ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IDc2YjE3YjUuLmM2Mzc3MmQgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMzUsNyArMzUsMTAgQEAKIEFsZXhhbmRlciBEb3Jva2hpbmUsIENvcmVudGluIENoYXJ5LCBXb3V0ZXIgVmFuIE1laXIsIEdlb3JnZSBLaWFnaWFkYWtpcywKIEpvZWwgTWFydGluLCBHZXJub3QgVGVuY2hpbywgV2lsbGlhbSBSb2JlcnRzLCBDcmlzdGlhbiBSb2Ryw61ndWV6LAogR2VvcmdlIEZsZXVyeSwgS2FuLVJ1IENoZW4sIFN0ZXZlIEd1bywgTHVjYSBTdGF1YmxlLCBQZXRlciBXYXRraW5zLAotS3lsZSBKLiBNY0theSwgTWF0ZXVzIENlc2FyIEdyb2VzcywgUGhpbGlwIFZhbiBIb29mIGFuZCBELiBSLiBDb21tYW5kZXIuCitLeWxlIEouIE1jS2F5LCBNYXRldXMgQ2VzYXIgR3JvZXNzLCBQaGlsaXAgVmFuIEhvb2YsIEQuIFIuIENvbW1hbmRlciwKK1Jvc3Rpc2xhdiBMaXNvdnksIE9saXZlciBMb2NoLCBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEsIEFtYW5kZWVwIFNpbmdoLAorQnJpYW4gQmlkdWxvY2ssIERhbmllbCBDb2hlbiBHaW5kaSwgRGF2aWQgVmVyYmVpcmVuLCBMdWNhIEZhbGF2aWduYSwKK01hdHRoaWFzIFRyZXlkdGUsIE5pY29sYXMgUnVmZiBhbmQgUm9iYmVydCBLbGFyZW5iZWVrLgogCiBQcm9iYWJseSBJIGZvcmdvdCBxdWl0ZSBhIGZldyBwZW9wbGUgc2VuZGluZyBhIHBhdGNoIGhlcmUgYW5kIHRoZXJlLCB3aGljaAogcmVhbGx5IG1hZGUgYSBkaWZmZXJlbmNlLiBXaXRob3V0IHRob3NlLCBzb21lIG9ic2N1cmUgYnVncyBzdGlsbCB3b3VsZApkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dAppbmRleCA2ZDRhNWY5Li4yNjk4MDVmIDEwMDY0NAotLS0gYS9DTWFrZUxpc3RzLnR4dAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMTEsMTcgKzExLDIwIEBACiAKIHNldChQQUNLQUdFX05BTUUgICAgICAgICAgICJMaWJWTkNTZXJ2ZXIiKQogc2V0KEZVTExfUEFDS0FHRV9OQU1FICAgICAgIkxpYlZOQ1NlcnZlciIpCi1zZXQoUEFDS0FHRV9WRVJTSU9OICAgICAgICAiMC45LjkiKQorc2V0KFBBQ0tBR0VfVkVSU0lPTiAgICAgICAgIjAuOS4xMCIpCitzZXQoVkVSU0lPTl9NQUpPUiAgICAgICAgICAiMCIpCitzZXQoVkVSU0lPTl9NSU5PUiAgICAgICAgICAiOSIpCitzZXQoVkVSU0lPTl9QQVRDSExFVkVMICAgICAiMTAiKQogc2V0KFBST0pFQ1RfQlVHUkVQT1JUX1BBVEggImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIikKIHNldChDTUFLRV9DX0ZMQUdTICItTzIgLVcgLVdhbGwgLWciKQotc2V0KExJQlZOQ1NFUlZFUl9ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS9saWJ2bmNzZXJ2ZXIpCi1zZXQoQ09NTU9OX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9L2NvbW1vbikKLXNldChMSUJWTkNDTElFTlRfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vbGlidm5jY2xpZW50KQotc2V0KExJQlZOQ1NSVlRFU1RfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vZXhhbXBsZXMpCi1zZXQoTElCVk5DQ0xJVEVTVF9ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS9jbGllbnRfZXhhbXBsZXMpCitzZXQoTElCVk5DU0VSVkVSX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGlidm5jc2VydmVyKQorc2V0KENPTU1PTl9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbW1vbikKK3NldChMSUJWTkNDTElFTlRfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWJ2bmNjbGllbnQpCitzZXQoTElCVk5DU1JWVEVTVF9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzKQorc2V0KExJQlZOQ0NMSVRFU1RfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbGllbnRfZXhhbXBsZXMpCiAKIAotaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQklOQVJZX0RJUn0gJHtDTUFLRV9TT1VSQ0VfRElSfS9saWJ2bmNzZXJ2ZXIgJHtDTUFLRV9TT1VSQ0VfRElSfS9jb21tb24pCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYnZuY3NlcnZlciAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29tbW9uKQogCiBmaW5kX3BhY2thZ2UoWkxJQikKIGZpbmRfcGFja2FnZShKUEVHKQpAQCAtNjcsMTQgKzcwLDI1IEBACiAgIG1lc3NhZ2UoV0FSTklORyAiKioqIFRoZSBsaWJqcGVnIGxpYnJhcnkgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGlzIG5vdCBsaWJqcGVnLXR1cmJvLiAgUGVyZm9ybWFuY2Ugd2lsbCBiZSByZWR1Y2VkLiAgWW91IGNhbiBvYnRhaW4gbGlianBlZy10dXJibyBmcm9tOiAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8gKioqIikKIGVuZGlmKCkKIAotc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyByZXNvbHYpCi1jaGVja19mdW5jdGlvbl9leGlzdHMoX19iNjRfbnRvcCBIQVZFX0I2NCkKKyMgT24gc3lzdGVtcyBzdWNoIGFzIEdOVS9MaW51eCB3aXRoIGdsaWJjLCBfX2I2NF9udG9wIGlzIGRlZmluZWQgaW4gYQorIyBzZXBhcmF0ZSBsaWJyYXJ5LCBsaWJyZXNvbHYuIE9uIHNvbWUgb3RoZXJzLCBzdWNoIGFzIEZyZWVCU0QsIGl0IGlzCisjIHBhcnQgb2YgbGliYyBpdHNlbGYuIFdlIGZpcnN0IGNoZWNrIGlmIF9fYjY0X250b3AgaXMgZm91bmQgd2l0aG91dAorIyBhZGRpdGlvbmFsIGxpYnJhcmllcywgYW5kIHRoZW4gdHJ5IGxvb2tpbmcgZm9yIGl0IHdpdGggbGlicmVzb2x2IGlmCisjIHRoZSBmaXJzdCB0ZXN0IGZhaWxzLgorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKF9fYjY0X250b3AgSEFWRV9CNjRfSU5fTElCQykKK2lmKE5PVCBIQVZFX0I2NF9JTl9MSUJDKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgcmVzb2x2KQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhfX2I2NF9udG9wIEhBVkVfQjY0X0lOX0xJQlJFU09MVikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorCisgICAgaWYoSEFWRV9CNjRfSU5fTElCUkVTT0xWKQorICAgICAgICBzZXQoUkVTT0xWX0xJQiAicmVzb2x2IikKKyAgICBlbmRpZihIQVZFX0I2NF9JTl9MSUJSRVNPTFYpCitlbmRpZihOT1QgSEFWRV9CNjRfSU5fTElCQykKIAogaWYoVGhyZWFkc19GT1VORCkKICAgb3B0aW9uKFRJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAiRW5hYmxlIGZpbGV0cmFuc2ZlciIgT04pCiBlbmRpZihUaHJlYWRzX0ZPVU5EKQotaWYgKEhBVkVfQjY0KQotZW5kaWYoSEFWRV9CNjQpCiBpZihaTElCX0ZPVU5EKQogICBzZXQoTElCVk5DU0VSVkVSX0hBVkVfTElCWiAxKQogZW5kaWYoWkxJQl9GT1VORCkKQEAgLTg5LDI2ICsxMDMsMjkgQEAKIGlmKEdOVVRMU19GT1VORCkKICAgc2V0KExJQlZOQ1NFUlZFUl9XSVRIX0NMSUVOVF9UTFMgMSkKICAgb3B0aW9uKExJQlZOQ1NFUlZFUl9XSVRIX1dFQlNPQ0tFVFMgIkJ1aWxkIHdpdGggd2Vic29ja2V0cyBzdXBwb3J0IChnbnV0bHMpIiBPTikKLSAgc2V0KFdFQlNPQ0tFVF9MSUJSQVJJRVMgLWxyZXNvbHYgJHtHTlVUTFNfTElCUkFSSUVTfSkKKyAgc2V0KFdFQlNPQ0tFVF9MSUJSQVJJRVMgJHtSRVNPTFZfTElCfSAke0dOVVRMU19MSUJSQVJJRVN9KQogICBzZXQoV1NTUkNTICR7TElCVk5DU0VSVkVSX0RJUn0vcmZic3NsX2dudXRscyAke0xJQlZOQ1NFUlZFUl9ESVJ9L3JmYmNyeXB0b19nbnV0bHMpCiBlbHNlaWYoT1BFTlNTTF9GT1VORCkKICAgb3B0aW9uKExJQlZOQ1NFUlZFUl9XSVRIX1dFQlNPQ0tFVFMgIkJ1aWxkIHdpdGggd2Vic29ja2V0cyBzdXBwb3J0IChvcGVuc3NsKSIgT04pCi0gIHNldChXRUJTT0NLRVRfTElCUkFSSUVTIC1scmVzb2x2ICR7T1BFTlNTTF9MSUJSQVJJRVN9KQorICBzZXQoV0VCU09DS0VUX0xJQlJBUklFUyAke1JFU09MVl9MSUJ9ICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICBzZXQoV1NTUkNTICR7TElCVk5DU0VSVkVSX0RJUn0vcmZic3NsX29wZW5zc2wgJHtMSUJWTkNTRVJWRVJfRElSfS9yZmJjcnlwdG9fb3BlbnNzbCkKIGVsc2UoKQogICBvcHRpb24oTElCVk5DU0VSVkVSX1dJVEhfV0VCU09DS0VUUyAiQnVpbGQgd2l0aCB3ZWJzb2NrZXRzIHN1cHBvcnQgKG5vIHNzbCkiIE9OKQotICBzZXQoV0VCU09DS0VUX0xJQlJBUklFUyAtbHJlc29sdikKKyAgc2V0KFdFQlNPQ0tFVF9MSUJSQVJJRVMgJHtSRVNPTFZfTElCfSkKICAgc2V0KFdTU1JDUyAke0xJQlZOQ1NFUlZFUl9ESVJ9L3JmYnNzbF9ub25lLmMgJHtMSUJWTkNTRVJWRVJfRElSfS9yZmJjcnlwdG9faW5jbHVkZWQuYyAke0NPTU1PTl9ESVJ9L21kNS5jICR7Q09NTU9OX0RJUn0vc2hhMS5jKQogZW5kaWYoKQogCiBpZihMSUJHQ1JZUFRfTElCUkFSSUVTKQogICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgbGliZ2NyeXB0OiAke0xJQkdDUllQVF9MSUJSQVJJRVN9IikKICAgc2V0KExJQlZOQ1NFUlZFUl9XSVRIX0NMSUVOVF9HQ1JZUFQgMSkKKyAgc2V0KEFERElUSU9OQUxfTElCUyAke0FERElUSU9OQUxfTElCU30gJHtMSUJHQ1JZUFRfTElCUkFSSUVTfSkKIGVuZGlmKExJQkdDUllQVF9MSUJSQVJJRVMpCiAKIAorY2hlY2tfaW5jbHVkZV9maWxlKCJlbmRpYW4uaCIgICAgICBMSUJWTkNTRVJWRVJfSEFWRV9FTkRJQU5fSCkKIGNoZWNrX2luY2x1ZGVfZmlsZSgiZmNudGwuaCIgICAgICAgTElCVk5DU0VSVkVSX0hBVkVfRkNOVExfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZSgibmV0aW5ldC9pbi5oIiAgTElCVk5DU0VSVkVSX0hBVkVfTkVUSU5FVF9JTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKCJzeXMvZW5kaWFuLmgiICBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfRU5ESUFOX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoInN5cy9zb2NrZXQuaCIgIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19TT0NLRVRfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZSgic3lzL3N0YXQuaCIgICAgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1NUQVRfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZSgic3lzL3RpbWUuaCIgICAgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1RJTUVfSCkKQEAgLTE1MCw4ICsxNjcsOCBAQAogIyBMSUJWTkNTRVJWRVJfRU5PRU5UX1dPUktBUk9VTkQKICMgaW5saW5lCiAKLWNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vcmZiL3JmYmNvbmZpZy5oLmNtYWtlICR7Q01BS0VfQklOQVJZX0RJUn0vcmZiL3JmYmNvbmZpZy5oKQotY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS9yZmIvcmZiaW50LmguY21ha2UgJHtDTUFLRV9CSU5BUllfRElSfS9yZmIvcmZiaW50LmgpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcmZiL3JmYmNvbmZpZy5oLmNtYWtlICR7Q01BS0VfQklOQVJZX0RJUn0vcmZiL3JmYmNvbmZpZy5oKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3JmYi9yZmJpbnQuaC5jbWFrZSAke0NNQUtFX0JJTkFSWV9ESVJ9L3JmYi9yZmJpbnQuaCkKIAogc2V0KExJQlZOQ1NFUlZFUl9TT1VSQ0VTCiAgICAgJHtMSUJWTkNTRVJWRVJfRElSfS9tYWluLmMKQEAgLTI1NiwxMyArMjczLDE0IEBACiBhZGRfbGlicmFyeSh2bmNjbGllbnQgU0hBUkVEICR7TElCVk5DQ0xJRU5UX1NPVVJDRVN9KQogYWRkX2xpYnJhcnkodm5jc2VydmVyIFNIQVJFRCAke0xJQlZOQ1NFUlZFUl9TT1VSQ0VTfSkKIGlmKFdJTjMyKQotICBzZXQoQURESVRJT05BTF9MSUJTIHdzMl8zMikKKyAgc2V0KEFERElUSU9OQUxfTElCUyAke0FERElUSU9OQUxfTElCU30gd3MyXzMyKQogZW5kaWYoV0lOMzIpCiAKIHRhcmdldF9saW5rX2xpYnJhcmllcyh2bmNjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAke0FERElUSU9OQUxfTElCU30KICAgICAgICAgICAgICAgICAgICAgICAke1pMSUJfTElCUkFSSUVTfQogICAgICAgICAgICAgICAgICAgICAgICR7SlBFR19MSUJSQVJJRVN9CisgICAgICAgICAgICAgICAgICAgICAgJHtHTlVUTFNfTElCUkFSSUVTfQogKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHZuY3NlcnZlcgogICAgICAgICAgICAgICAgICAgICAgICR7QURESVRJT05BTF9MSUJTfQpAQCAtMzM2LDE2ICszNTQsMTYgQEAKIGVuZGlmKEhBVkVfRkZNUEVHKQogCiAKLWZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9leGFtcGxlcykKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2V4YW1wbGVzKQogZm9yZWFjaCh0ZXN0ICR7TElCVk5DU0VSVkVSX1RFU1RTfSkKICAgYWRkX2V4ZWN1dGFibGUoZXhhbXBsZXMvJHt0ZXN0fSAke0xJQlZOQ1NSVlRFU1RfRElSfS8ke3Rlc3R9LmMpCiAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhleGFtcGxlcy8ke3Rlc3R9IHZuY3NlcnZlciAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQogZW5kZm9yZWFjaCh0ZXN0ICR7TElCVk5DU0VSVkVSX1RFU1RTfSkKIAotZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2NsaWVudF9leGFtcGxlcykKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NsaWVudF9leGFtcGxlcykKIGZvcmVhY2godGVzdCAke0xJQlZOQ0NMSUVOVF9URVNUU30pCiAgIGFkZF9leGVjdXRhYmxlKGNsaWVudF9leGFtcGxlcy8ke3Rlc3R9ICR7TElCVk5DQ0xJVEVTVF9ESVJ9LyR7dGVzdH0uYyAke0xJQlZOQ0NMSVRFU1RfRElSfS8keyR7dGVzdH1fRVhUUkFfU09VUkNFU30gKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMoY2xpZW50X2V4YW1wbGVzLyR7dGVzdH0gdm5jY2xpZW50ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0gJHtHTlVUTFNfTElCUkFSSUVTfSAke1gxMV9MSUJSQVJJRVN9ICR7U0RMX0xJQlJBUll9ICR7RkZNUEVHX0xJQlJBUklFU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjbGllbnRfZXhhbXBsZXMvJHt0ZXN0fSB2bmNjbGllbnQgJHtDTUFLRV9USFJFQURfTElCU19JTklUfSAke1gxMV9MSUJSQVJJRVN9ICR7U0RMX0xJQlJBUll9ICR7RkZNUEVHX0xJQlJBUklFU30pCiBlbmRmb3JlYWNoKHRlc3QgJHtMSUJWTkNDTElFTlRfVEVTVFN9KQogCiBpbnN0YWxsX3RhcmdldHMoL2xpYiB2bmNzZXJ2ZXIpCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggMTNjZGU5Zi4uMzk1M2RkNCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSwzICsxLDg0MiBAQAorMjAxNC0xMC0yMSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBORVdTOiBVcGRhdGUgTkVXUy4KKworMjAxNC0xMC0yMSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBsaWJ2bmNzZXJ2ZXIvc29ja2V0cy5jOiBVcGRhdGUgY29tbWVudHMgcmVnYXJkaW5nCisJcmZiQ2xpZW50Q29ubmVjdGlvbkdvbmUoKS4KKworMjAxNC0xMC0yMSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBsaWJ2bmNzZXJ2ZXIvc2NhbGUuYzogRml4IFVzZS1BZnRlci1GcmVlIHZ1bG5lcmFiaWxpdHkgaW4KKwlMaWJWTkNTZXJ2ZXIgd3J0IHNjYWxpbmcuICBSZXBvcnRlZCBieSBLZW4gSm9obnNvbiA8S2VuLkpvaG5zb24xQHRlbHVzLmNvbT4uICBUaGUgdnVsbmVyYWJpbGl0eSB3b3VsZCBvY2N1ciBpbiBib3RoIHRoZSByZmJQYWxtVk5DU2V0U2NhbGVGYWN0b3IKKwlhbmQgcmZiU2V0U2NhbGUgY2FzZXMgaW4gdGhlIHJmYlByb2Nlc3NDbGllbnROb3JtYWxNZXNzYWdlIGZ1bmN0aW9uCisJb2YgcmZic2VydmVyLmMuIFNlbmRpbmcgYSB2YWxpZCBzY2FsaW5nIGZhY3RvciBpcyByZXF1aXJlZAorCShub24temVybykgICAgICAgaWYgKG1zZy5zc2Muc2NhbGUgPT0gMCkgeyAgICAgICAgICAgcmZiTG9nUGVycm9yKCJyZmJQcm9jZXNzQ2xpZW50Tm9ybWFsTWVzc2FnZTogd2lsbCBub3QKKwkgICAgICAgICAgYWNjZXB0IGEgc2NhbGUgZmFjdG9yIG9mIHplcm8iKTsgcmZiQ2xvc2VDbGllbnQoY2wpOyAgICAgICAgICAgcmV0dXJuOyAgICAgICB9ICAgICAgIHJmYlN0YXRSZWNvcmRNZXNzYWdlUmN2ZChjbCwgbXNnLnR5cGUsIHN6X3JmYlNldFNjYWxlTXNnLAorCSAgICAgIHN6X3JmYlNldFNjYWxlTXNnKTsgcmZiTG9nKCJyZmJTZXRTY2FsZSglZClcbiIsCisJICAgICAgbXNnLnNzYy5zY2FsZSk7IHJmYlNjYWxpbmdTZXR1cChjbCxjbC0+c2NyZWVuLT53aWR0aC9tc2cuc3NjLnNjYWxlLAorCWNsLT5zY3JlZW4tPmhlaWdodC9tc2cuc3NjLnNjYWxlKTsgICAgICAgcmZiU2VuZE5ld1NjYWxlU2l6ZShjbCk7IDw8IFRoaXMgaXMgdGhlIGNhbGwgdGhhdCBjYW4gdHJpZ2dlcgorCSAgICAgIGEgZnJlZS4gIHJldHVybjsgYXQgdGhlIGVuZCwgYm90aCBjYXNlcyB0aGVyZSBpcyBhIGNhbGwgdGhlIHJmYlNlbmROZXdTY2FsZVNpemUKKwlmdW5jdGlvbiwgd2hlcmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3Vic2VxdWVudGx5IGRpc2Nvbm5lY3RlZCBhZnRlcgorCXNlbmRpbmcgdGhlIFZOQyBzY2FsaW5nIG1lc3NhZ2UgY2FuIGxlYWQgdG8gYSBmcmVlIG9jY3VycmluZy4gICAgICBlbHNlICAgICB7ICAgICAgICAgcmZiUmVzaXplRnJhbWVCdWZmZXJNc2cgICAgICAgIHJtc2c7ICAgICAgICAgcm1zZy50eXBlID0gcmZiUmVzaXplRnJhbWVCdWZmZXI7ICAgICAgICAgcm1zZy5wYWQxPTA7ICAgICAgICAgcm1zZy5mcmFtZWJ1ZmZlcldpZHRoICA9CisJICAgICAgICBTd2FwMTZJZkxFKGNsLT5zY2FsZWRTY3JlZW4tPndpZHRoKTsgcm1zZy5mcmFtZWJ1ZmZlckhlaWd0aAorCSAgICAgICAgPSBTd2FwMTZJZkxFKGNsLT5zY2FsZWRTY3JlZW4tPmhlaWdodCk7IHJmYkxvZygiU2VuZGluZyBhIHJlc3BvbnNlCisJICAgICAgICB0byBhIFVsdHJhVk5DIHN0eWxlIGZyYW1ldWZmZXIgcmVzaXplIGV2ZW50ICglZHglZClcbiIsCisJICAgICAgICBjbC0+c2NhbGVkU2NyZWVuLT53aWR0aCwgY2wtPnNjYWxlZFNjcmVlbi0+aGVpZ2h0KTsgaWYKKwkgICAgICAgICAgICAocmZiV3JpdGVFeGFjdChjbCwgKGNoYXIgKikmcm1zZywgc3pfcmZiUmVzaXplRnJhbWVCdWZmZXJNc2cpIDwgMCkgeworCXJmYkxvZ1BlcnJvcigicmZiTmV3Q2xpZW50OiB3cml0ZSIpOyAgICAgICAgICAgICByZmJDbG9zZUNsaWVudChjbCk7ICAgICAgICAgICAgIHJmYkNsaWVudENvbm5lY3Rpb25Hb25lKGNsKTsgPDwgQ2FsbCB3aGljaCBtYXkgY2FuIGxlYWQKKwkgICAgICAgICAgICB0byBhIGZyZWUuICByZXR1cm4gRkFMU0U7ICAgICAgICAgfSAgICAgfSAgICAgcmV0dXJuIFRSVUU7IE9uY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCBldmVudHVhbGx5IHJmYkNsaWVudENvbm5lY3Rpb25Hb25lIGlzCisJY2FsbGVkIGFnYWluIG9uIHRoZSByZXR1cm4gZnJvbSByZmJQcm9jZXNzQ2xpZW50Tm9ybWFsTWVzc2FnZS4gSW4KKwlLUkZCIHNlcnZlciB0aGlzIGxlYWRzIHRvIGFuIGF0dGVtcHQgdG8gYWNjZXNzIGNsaWVudC0+ZGF0YS4gIFBPQyBzY3JpcHQgdG8gdHJpZ2dlciB0aGUgdnVsbmVyYWJpbGl0eTogLS0tc25pcC0tLSBpbXBvcnQgc29ja2V0LGJpbmFzY2lpLHN0cnVjdCxzeXMgZnJvbSB0aW1lIGltcG9ydCBzbGVlcCBjbGFzcyBSRkI6ICAgICBJTklUXzMwMDggPSAiXHg1Mlx4NDZceDQyXHgyMFx4MzBceDMwXHgzM1x4MmVceDMwXHgzMFx4MzhceDBhIiAgICAgQVVUSF9OT19QQVNTICA9ICJceDAxIiAgICAgQVVUSF9QQVNTID0gIlx4MDIiICAgICBTSEFSRV9ERVNLVE9QID0gIlx4MDEiICAgICBkZWYgQVVUSF9QUk9DRVNTKHNlbGYsZGF0YSxmbGFnKTogICAgICAgICBpZiBmbGFnID09IDA6ICAgICAgICAgICAgICMgR2V0IHNlY3VyaXR5IHR5cGVzICAgICAgICAgICAgIHNlY1R5cGVDb3VudCA9IGRhdGFbMF0gICAgICAgICAgICAgc2VjVHlwZSA9IHt9ICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGludChsZW4oc2VjVHlwZUNvdW50KSkpOiAgICAgICAgICAgICAgICAgc2VjVHlwZVtpXSA9IGRhdGFbMV0gICAgICAgICAgICAgcmV0dXJuIHNlY1R5cGUgICAgICAgICBlbGlmIGZsYWcgPT0gMTogICAgICAgICAgICAgIyBHZXQgYXV0aCByZXN1bHQgICAgICAgICAgICAgIyAwIG1lYW5zIGF1dGggc3VjY2VzcyAgICAgICAgICAgICAjIDEgbWVhbnMgZmFpbHVyZSAgICAgICAgICAgICByZXR1cm4gZGF0YVszXSAgICAgZGVmIEFVVEhfUFJPQ0VTU19DSEFMTEVOR0Uoc2VsZiwgZGF0YSwgUEFTU1dPUkQpOiAgICAgICAgIHRyeTogICAgICAgICAgICAgZnJvbSBDcnlwdG8uQ2lwaGVyIGltcG9ydCBERVMgICAgICAgICBleGNlcHQ6ICAgICAgICAgICAgIHByaW50ICJFcnJvciBpbXBvcnRpbmcgY3J5cHRvLiBQbGVhc2UgZml4IG9yIGRvIG5vdAorCSAgICAgICAgICAgIHJlcXVpcmUgYXV0aGVudGljYXRpb24iIHN5cy5leGl0KDEpICAgICAgICAgaWYgbGVuKFBBU1NXT1JEKSAhPSA4OiAgICAgICAgICAgICBQQVNTV09SRCA9IFBBU1NXT1JELmxqdXN0KDgsICdcMCcpICAgICAgICAgUEFTU1dPUkRfU1dBUCA9CisKKwlbc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzBdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzFdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzJdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzNdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzRdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzVdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzZdKSksc2VsZi5yZXZlcnNlX2JpdHMob3JkKFBBU1NXT1JEWzddKSldUEFTU1dPUkQgPQorCisKKworCShzdHJ1Y3QucGFjaygiQkJCQkJCQkIiLFBBU1NXT1JEX1NXQVBbMF0sUEFTU1dPUkRfU1dBUFsxXSxQQVNTV09SRF9TV0FQWzJdLFBBU1NXT1JEX1NXQVBbM10sUEFTU1dPUkRfU1dBUFs0XSxQQVNTV09SRF9TV0FQWzVdLFBBU1NXT1JEX1NXQVBbNl0sUEFTU1dPUkRfU1dBUFs3XSkpY3J5cHRvID0gREVTLm5ldyhQQVNTV09SRCkgICAgICAgICByZXR1cm4gY3J5cHRvLmVuY3J5cHQoZGF0YSkgICAgIGRlZiByZXZlcnNlX2JpdHMoc2VsZix4KTogICAgICAgICBhPTAgICAgICAgICBmb3IgaSBpbiByYW5nZSg4KTogICAgICAgICAgICAgYSArPSAoKHg+PmkpJjEpPDwoNy1pKSAgICAgICAgIHJldHVybiBhIGRlZiBtYWluKGFyZ3YpOiAgICAgcHJpbnQgIlByb29mIG9mIENvbmNlcHQiICAgICBwcmludCAiQ29weXJpZ2h0IFRFTFVTIFNlY3VyaXR5IExhYnMiICAgICBwcmludCAiQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiIgICAgIHRyeTogICAgICAgICBIT1NUID0gc3lzLmFyZ3ZbMV0gICAgICAgICBQT1JUID0gaW50KHN5cy5hcmd2WzJdKSAgICAgZXhjZXB0OiAgICAgICAgIHByaW50ICJVc2FnZTogcHl0aG9uIHNldHNjYWxlX3NlZ3ZfcG9jLnB5IDxob3N0PiA8cG9ydD4KKwkgICAgICAgIFtwYXNzd29yZF0iIHN5cy5leGl0KDEpICAgICB0cnk6ICAgICAgICAgUEFTU1dPUkQgPSBzeXMuYXJndlszXSAgICAgZXhjZXB0OiAgICAgICAgIHByaW50ICJObyBwYXNzd29yZCBzdXBwbGllZCIgICAgICAgICBQQVNTV09SRCA9ICIiICAgICB2bmMgPSBSRkIoKSAgICAgcmVtb3RlID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKSAgICAgcmVtb3RlLmNvbm5lY3QoKEhPU1QsUE9SVCkpICAgICAjIEdldCBzZXJ2ZXIgdmVyc2lvbiAgICAgZGF0YSA9IHJlbW90ZS5yZWN2KDEwMjQpICAgICAjIFNlbmQgMy44IHZlcnNpb24gICAgIHJlbW90ZS5zZW5kKHZuYy5JTklUXzMwMDgpICAgICAjIEdldCBzdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZXMgICAgIGRhdGEgPSByZW1vdGUucmVjdigxMDI0KSAgICAgIyBQcm9jZXNzIFNlY3VyaXR5IE1lc3NhZ2UgICAgIHNlY1R5cGUgPSB2bmMuQVVUSF9QUk9DRVNTKGRhdGEsMCkgICAgIGlmIHNlY1R5cGVbMF0gPT0gIlx4MDIiOiAgICAgICAgICMgU2VuZCBhY2NlcHQgZm9yIHBhc3N3b3JkIGF1dGggICAgICAgICByZW1vdGUuc2VuZCh2bmMuQVVUSF9QQVNTKSAgICAgICAgICMgR2V0IGNoYWxsZW5nZSAgICAgICAgIGRhdGEgPSByZW1vdGUucmVjdigxMDI0KSAgICAgICAgICMgU2VuZCBjaGFsbGVuZ2UgcmVzcG9uc2UgICAgICAgICByZW1vdGUuc2VuZCh2bmMuQVVUSF9QUk9DRVNTX0NIQUxMRU5HRShkYXRhLFBBU1NXT1JEKSkgICAgIGVsaWYgc2VjVHlwZVswXSA9PSAiXHgwMSI6ICAgICAgICAgIyBTZW5kIGFjY2VwdCBmb3IgTm9uZSBwYXNzICAgICAgICAgcmVtb3RlLnNlbmQodm5jLkFVVEhfTk9fUEFTUykgICAgIGVsc2U6ICAgICAgICAgcHJpbnQgJ1RoZSBzZXJ2ZXIgc2VudCB1cyBzb21ldGhpbmcgd2VpcmQgZHVyaW5nIGF1dGguJyAgICAgICAgIHN5cy5leGl0KDEpICAgICAjIEdldCByZXN1bHQgICAgIGRhdGEgPSByZW1vdGUucmVjdigxMDI0KSAgICAgIyBQcm9jZXNzIHJlc3VsdCAgICAgcmVzdWx0ID0gdm5jLkFVVEhfUFJPQ0VTUyhkYXRhLDEpICAgICBpZiByZXN1bHQgPT0gIlx4MDEiOiAgICAgICAgICMgQXV0aGVudGljYXRpb24gZmFpbHVyZS4gICAgICAgICAgZGF0YSA9IHJlbW90ZS5yZWN2KDEwMjQpICAgICAgICAgcHJpbnQgJ0F1dGhlbnRpY2F0aW9uIGZhaWx1cmUuIFNlcnZlciBSZWFzb246ICcgKyBzdHIoZGF0YSkgICAgICAgICBzeXMuZXhpdCgxKSAgICAgZWxpZiByZXN1bHQgPT0gIlx4MDAiOiAgICAgICAgIHByaW50ICJBdXRoZW50aWNhdGlvbiBzdWNjZXNzLiIgICAgIGVsc2U6ICAgICAgICAgcHJpbnQgJ1NvbWUgb3RoZXIgYXV0aGVudGljYXRpb24gaXNzdWUgb2NjdXJlZC4nICAgICAgICAgc3lzLmV4aXQoMSkgICAgICMgU2VuZCBDbGllbnRJbml0ICAgICByZW1vdGUuc2VuZCh2bmMuU0hBUkVfREVTS1RPUCkgICAgICMgU2VuZCBtYWxpY2lvdXMgbWVzc2FnZSAgICAgcHJpbnQgIlNlbmRpbmcgbWFsaWNpb3VzIGRhdGEuLi4iICAgICByZW1vdGUuc2VuZCgiXHgwOFx4MDhceDAwXHgwMCIpICAgICByZW1vdGUuY2xvc2UoKSBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOiAgICAgbWFpbihzeXMuYXJndikgLS0tc25hcC0tLQorCisyMDE0LTEwLTE0ICBkc2NobyA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICM0MyBmcm9tIG1ha3Nxd2UvZml4X3JmYlNlbGVjdEJveCBGaXggc2VsRGF0YS5idXR0b25XaWR0aCBjYWxjdWxhdGlvbgorCisyMDE0LTEwLTEwICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIGxpYnZuY2NsaWVudC9yZmJwcm90by5jOiBGaXggcG9zc2libGUgbGlidm5jY2xpZW50IFNlcnZlckluaXQKKwltZW1vcnkgY29ycnVwdGlvbi4gIFRoaXMgZml4ZXMgdGhlIGZvbGxvd2luZyBvQ0VSVCByZXBvcnQgKG9DRVJULTIwMTQtMDA4IHB0LjIpOiBUaGVyZSBpcyBhIHNpbWlsYXIgdnVsbmVyYWJpbGl0eSB0byB0aGUgcHJldmlvdXMgb25lIEkgc2VudC4gVGhpcyBpcworCXJlbGF0ZWQgdG8gdGhlIFNlcnZlckluaXQgbWVzc2FnZSB3aGVyZSB0aGUgd2lkdGgsIHRoZSBoZWlnaHQgb2YgdGhlCisJc2VydmVyJ3MgZnJhbWVidWZmZXIsIGl0cyBwaXhlbCBmb3JtYXQsIGFuZCB0aGUgbmFtZSBhcmUgc2VudCB0byB0aGUKKwljbGllbnQuIFRoZSBuYW1lIGNhbiBiZSB1c2VkIGluIGEgbWFsaWNpb3VzIG1hbm5lciB0byB0cmlnZ2VyIGEKKwltZW1vcnkgY29ycnVwdGlvbiBpbiB0aGUgY2xpZW50LiAgRmllbGQgICAgICAgICAgICAgU2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbmFtZS1sZW5ndGgKKwlbNF0gbmFtZS1zdHJpbmcgIFtuYW1lLWxlbmd0aF0gQmVsb3cgeW91IHdpbGwgZmluZCBhIFBvQyBzY3JpcHQgdG8gc2hvdyB0aGUgdnVsbmVyYWJpbGl0eS4gVGhpcyB3YXMKKwl0ZXN0ZWQgb24gRmVkb3JhIDIwIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGtyZGMuICBJIGhhdmUgbm90aWNlZCBzb21ldGhpbmcsIHdoZXJlIHRoZSBtZW1vcnkgY29ycnVwdGlvbiBjYXVzZXMgdGhlCisJcHJvZ3JhbSB0byBoYW5nIGJ1dCBhbGxvd3MgeW91IHRvIHRyeSB0byBkaXNjb25uZWN0LiBBZnRlciB0aGlzIGl0CisJaGFuZ3MuIE9jY2FzaW9uYWxseSB0aGVyZSB3aWxsIGJlIHNlZ21lbnRhdGlvbiBmYXVsdCBpbiBtZW1jcHkuIFRoaXMKKwljYW4gYmVjb21lIG1vcmUgcmVsaWFibGUgaWYgeW91IGNvbm5lY3QgdG8gYSBkaWZmZXJlbnQgVk5DIHNlcnZlcgorCWZpcnN0IChPciB0aGUgd3JvbmcgcG9ydCBvbiB0aGUgbWFsaWNpb3VzIHNlcnZlcikgdGhlbiBjb25uZWN0aW5nIHRvCisJdGhlIG1hbGljaW91cyBwb3J0LiBFdmVyeSB0aW1lIEkgYWNjaWRlbnRhbGx5IG1hZGUgdGhlIHdyb25nIFZOQworCWNvbm5lY3Rpb24gYXR0ZW1wdCB0aGUgbmV4dCB0aW1lIEkgY29ubmVjdGVkIGl0IHNlZ2ZhdWx0J2QuICBKdXN0IHJ1biB0aGUgc2NyaXB0IGl0IHdpbGwgbGlzdGVuIG9uIHBvcnQgNTkwMCBhbmQgY29ubmVjdCB0byBpdAorCXdpdGgga3JkYyBmb3IgZXhhbXBsZS4gSSBoYXZlIG9ic2VydmVkIFJlbW1pbmEgY3Jhc2ggbW9yZSByZWxpYWJseS4gIGltcG9ydCBzb2NrZXQsc3RydWN0LHN5cyBIT1NUID0gIiIgUE9SVCA9ICA1OTAwIGMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisJYy5iaW5kKChIT1NULFBPUlQpKSBjLmxpc3RlbigxKSBjb25uLGFkZHIgPSBjLmFjY2VwdCgpIHByaW50ICJDb25uZWN0ZWQgYnkgIiwgYWRkciBwcm90b2NvbFZlcnNpb24zMDA4ID0KKwkiXHg1Mlx4NDZceDQyXHgyMFx4MzBceDMwXHgzM1x4MmVceDMwXHgzMFx4MzhceDBhIgorCWNvbm4uc2VuZChwcm90b2NvbFZlcnNpb24zMDA4KSBkYXRhID0gY29ubi5yZWN2KDEwMjQpICMgUmVjZWl2ZSB0aGUgdmVyc2lvbiBmcm9tIHRoZW0uICBzZWNUeXBlTm9uZSA9ICJceDAxXHgwMSIgc2VjVHlwZUF1dGggPSAiXHgwMVx4MDIiCisJY29ubi5zZW5kKHNlY1R5cGVOb25lKSBkYXRhID0gY29ubi5yZWN2KDEwMjQpICMgUmVjZWl2ZSB0aGUgc2VjVHlwZSBjaG9pY2UgZnJvbSB0aGVtLiAgc2VjUmVzdWx0T2sgPSAiXHgwMCIgKiA0IHNlY1Jlc3VsdE5vID0gIlx4MDBceDAwXHgwMFx4MDEiCisJY29ubi5zZW5kKHNlY1Jlc3VsdE9rKSBkYXRhID0gY29ubi5yZWN2KDEwMjQpICMgUmVjZWl2ZSB0aGUgQ2xpZW50SW5pdCAoU2hhcmVkLWZsYWcpLiAgZnJhbWVCdWZmZXJXaWR0aCA9IDB4MDQ4MCBmcmFtZUJ1ZmZlckhlaWdodCA9IDB4MDM2MCBiaXRzUGVyUGl4ZWwgPQorCTB4MjAgZGVwdGggPSAweDE4IGJpZ0VuZGlhbiA9IDB4MSB0cnVlQ29sb3IgPSAweDAgcmVkTSA9IDB4MCBncmVlbk0KKwk9IDB4MCBibHVlTSA9ICAweDAgcmVkUyA9IDB4MCBncmVlblMgPSAweDAgYmx1ZVMgPSAweDAgcGFkZGluZyA9CisJIlx4MDBceDAwXHgwMCIgbmFtZUxlbmd0aCA9IDB4ZmZmZmZmZmYgbmFtZVN0cmluZyA9ICJBQSIgKiAweEZGRkYgKworCSJceDAwXHgwYSIgY29ubi5zZW5kKCBzdHJ1Y3QucGFjaygiPkhIQkJCQkhISEJCQiIsZnJhbWVCdWZmZXJXaWR0aCwKKwlmcmFtZUJ1ZmZlckhlaWdodCwgYml0c1BlclBpeGVsLCBkZXB0aCwgYmlnRW5kaWFuLCB0cnVlQ29sb3IsIHJlZE0sCisJZ3JlZW5NLCBibHVlTSwgcmVkUywgZ3JlZW5TLCBibHVlUykgKyBwYWRkaW5nICsgc3RydWN0LnBhY2soIj5JIiwKKwluYW1lTGVuZ3RoKSArIG5hbWVTdHJpbmcgKSBjLmNsb3NlKCkKKworMjAxNC0xMC0xMCAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBsaWJ2bmNjbGllbnQvc29ja2V0cy5jOiBGaXggcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uIGluCisJbGlidm5jY2xpZW50LiAgRml4ZXMgKG1heWJlIGFtb25nc3Qgb3RoZXJzKSB0aGUgZm9sbG93aW5nIG9DRVJUIHJlcG9ydAorCShbb0NFUlQtMjAxNC0wMDhdKTogTGliVk5DU2VydmVyIEhhbmRsZVJGQlNlcnZlck1lc3NhZ2UgcmZiU2VydmVyQ3V0VGV4dCBtYWxpY2lvdXMKKwltc2cuc2N0Lmxlbmd0aCBJdCBsb29rcyBsaWtlIHRoZXJlIG1heSBiZSBhIGNoYW5jZSBmb3IgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uCisJd2hlbiBhIExpYlZOQ1NlcnZlciBjbGllbnQgYXR0ZW1wdHMgdG8gcHJvY2VzcyBhIFNlcnZlciBDdXQgVGV4dAorCW1lc3NhZ2UuICAgIGNhc2UgcmZiU2VydmVyQ3V0VGV4dDogICB7ICAgICBjaGFyICpidWZmZXI7ICAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGNsaWVudCwgKChjaGFyICopJm1zZykgKyAxLCAJCQkgICBzel9yZmJTZXJ2ZXJDdXRUZXh0TXNnIC0gMSkpICAgICAgIHJldHVybiBGQUxTRTsgICAgIG1zZy5zY3QubGVuZ3RoID0gcmZiQ2xpZW50U3dhcDMySWZMRShtc2cuc2N0Lmxlbmd0aCk7IDw8CisJICAgIFJldHJpZXZlIG1hbGljaW91cyBsZW5ndGggICAgIGJ1ZmZlciA9IG1hbGxvYyhtc2cuc2N0Lmxlbmd0aCsxKTsgPDwgQWxsb2NhdGUgYnVmZmVyLiBDYW4KKwkgICAgcmV0dXJuIDB4MCAgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihjbGllbnQsIGJ1ZmZlciwgbXNnLnNjdC5sZW5ndGgpKSA8PAorCSAgICAgIEF0dGVtcHQgdG8gd3JpdGUgdG8gYnVmZmVyIHJldHVybiBGQUxTRTsgICAgIGJ1ZmZlclttc2cuc2N0Lmxlbmd0aF0gPSAwOyA8PCBBdHRlbXB0IHRvIHdyaXRlIHRvIGJ1ZmZlciAgICAgaWYgKGNsaWVudC0+R290WEN1dFRleHQpICAgICAgIGNsaWVudC0+R290WEN1dFRleHQoY2xpZW50LCBidWZmZXIsIG1zZy5zY3QubGVuZ3RoKTsgPDwKKwkgICAgICBBdHRlbXB0IHRvIHdyaXRlIHRvIGJ1ZmZlciAgICAgZnJlZShidWZmZXIpOyAgICAgYnJlYWs7ICAgfSBJZiBhIG1lc3NhZ2UgaXMgcHJvdmlkZWQgd2l0aCBhbiBleHRyZW1lbHkgbGFyZ2Ugc2l6ZSBpdCBpcyBwb3NzaWJsZQorCXRvIGNhdXNlIHRoZSBtYWxsb2MgdG8gZmFpbCwgZnVydGhlciBsZWFkaW5nIHRvIGFuIGF0dGVtcHQgdG8gd3JpdGUKKwkweDAuCisKKzIwMTQtMTAtMDkgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogTkVXUzogVXBkYXRlIE5FV1MgZm9yIDAuOS4xMC4KKworMjAxNC0xMC0wOSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBBVVRIT1JTOiBVcGRhdGUgQVVUSE9SUy4KKworMjAxNC0xMC0wNyAgZHNjaG8gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiA6IE1lcmdlIHB1bGwgcmVxdWVzdCAjNDIgZnJvbSBMaWJWTkMvYXV0b3Rvb2xzLWZpeC1yZXZpc2l0ZWQgQWRkIGF1dG9jb25mIG1hY3JvcyB0aGF0IG1pZ2h0IG5vdCBiZSBpbnN0YWxsZWQgd2l0aCBhIHVzdWFsCisJYXV0b3Rvb2xzIHNldHVwCisKKzIwMTQtMTAtMDcgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBhdXRvZ2VuLnNoOiBBZGQgYmFjayBhIHdvcmtpbmcgYXV0b2dlbi5zaCBUaGVyZSB3YXMgbm8gcmVhc29uIHRvIGdldCByaWQgb2YgdGhlIGNvbnZlbmllbnQgc2NyaXB0LiBNb3N0CisJZGV2ZWxvcGVycyB3aG8gYXJlIG5vdCBpbiBsb3ZlIHdpdGggYXV0b2NvbmYgZmFpbCB0byByZW1lbWJlciB0aGF0CisJYXV0b3JlY29uZiBpbnZvY2F0aW9uLCB0aGVyZWZvcmUgaXQgaXMgYmV0dGVyIHRvIGhhdmUgc29tZXRoaW5nCisJd29ya2luZyBpbiBwbGFjZS4gIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA5LTAxICBOaWNvbGFzIFJ1ZmYgPG5ydWZmQGdvb2dsZS5jb20+CisKKwkqIGxpYnZuY3NlcnZlci9yZmJzZXJ2ZXIuYzogRml4IHN0YWNrLWJhc2VkIGJ1ZmZlciBvdmVyZmxvdyBUaGVyZSB3YXMgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gcmZiRmlsZVRyYW5zZmVyT2ZmZXIgbWVzc2FnZQorCXdoZW4gcHJvY2Vzc2luZyB0aGUgRmlsZVRpbWUuICBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0xMC0wNyAgZHNjaG8gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiA6IE1lcmdlIHB1bGwgcmVxdWVzdCAjNDEgZnJvbSBuZXdzb2Z0L21hc3RlciBGaXhpbmcgMiBzZWN1cml0eSBpc3N1ZXMKKworMjAxNC0xMC0wNiAgbmV3c29mdCA8bmV3c29mdEBnbXguZnI+CisKKwkqIGxpYnZuY3NlcnZlci9zY2FsZS5jOiBNYWtlIHN1cmUgdGhhdCBubyBpbnRlZ2VyIG92ZXJmbG93IGNvdWxkCisJb2NjdXIgZHVyaW5nIHNjYWxpbmcKKworMjAxNC0xMC0wNiAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBsaWJ2bmNjbGllbnQvTWFrZWZpbGUuYW06IEFkZCBsaWJ2bmNjbGllbnQvaDI2NC5jIHRvIGRpc3QgdGFyYmFsbC4gIE90aGVyd2lzZSB0aGUgc291cmNlcyBmcm9tIGEgJ21ha2UgZGlzdCcgcGFja2FnZSB3b3VsZG4ndCBjb21waWxlLgorCisyMDE0LTEwLTAzICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIG00Ly5naXRpZ25vcmU6IFJlYWxseSBhZGQgZW1wdHkgbTQgc3ViZGlyZWN0b3J5LiAgVGhpcyBjaGFuZ2Uga2luZGEgZ290IGxvc3Qgd2l0aCB0aGUgbGFzdCBjb21taXQgcmUtc3BsaXR0aW5nLgorCisyMDE0LTEwLTAyICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICMzOCBmcm9tIExpYlZOQy9hdXRvdG9vbHMtZml4LXJldmlzaXRlZCBBdXRvdG9vbHMgZml4IHJldmlzaXRlZC4KKworMjAxNC0xMC0wMiAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiB3ZWJjbGllbnRzL25vdm5jL0xJQ0VOU0UudHh0LCB3ZWJjbGllbnRzL25vdm5jL1JFQURNRS5tZCwKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmFzZS5jc3MsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Jhc2U2NC5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmxhY2suY3NzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9ibHVlLmNzcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvY2hyb21lLWFwcC90Y3AtY2xpZW50LmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9kZXMuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Rpc3BsYXkuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2lucHV0LmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9qc3VuemlwLmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlib2FyZC5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUva2V5c3ltLmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlzeW1kZWYuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3BsYXliYWNrLmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9yZmIuanMsIHdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91aS5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdXRpbC5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy93ZWJfc29ja2V0LmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJzb2NrLmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJ1dGlsLmpzLCB3ZWJjbGllbnRzL25vdm5jL3ZuYy5odG1sLAorCXdlYmNsaWVudHMvbm92bmMvdm5jX2F1dG8uaHRtbDogVXBkYXRlIG5vVk5DIEhUTUw1IGNsaWVudCB0byBsYXRlc3QKKwl2ZXJzaW9uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy4KKworMjAxNC0wOS0yMSAgQnJpYW4gQmlkdWxvY2sgPGJpZHVsb2NrQG9wZW5zczcub3JnPgorCisJKiAuZ2l0aWdub3JlOiBhZGQgYSBmZXcgbW9yZSBpZ25vcmVzCisKKzIwMTQtMDktMjEgIEJyaWFuIEJpZHVsb2NrIDxiaWR1bG9ja0BvcGVuc3M3Lm9yZz4KKworCSogYXV0b2dlbi5zaDogcmVtb3ZlZCBhdXRvZ2VuLnNoICAtIG5vIGxvbmdlciBhcHBsaWNhYmxlOiB1c2UgYXV0b3JlY29uZiAtZml2CisKKzIwMTQtMTAtMDIgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogSU5TVEFMTCwgYWNpbmNsdWRlLm00LCBsdG1haW4uc2g6IFJlbW92ZSBhdXRvdG9vbHMtcmVsYXRlZCBmaWxlcworCXRoYXQgd2lsbCBnZXQgaW5zdGFsbGVkIGJ5IGF1dG9yZWNvbmYgLWkuCisKKzIwMTQtMTAtMDIgIEJyaWFuIEJpZHVsb2NrIDxiaWR1bG9ja0BvcGVuc3M3Lm9yZz4KKworCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5hYzogVXNlIGFuIG00IHNjcmlwdCBzdWJkaXJlY3RvcnksIGZpeAorCWF1dG9tYWtlIGluaXQgYW5kIHR3byBtYWNybyBuYW1lcy4KKworMjAxNC0xMC0wMiAgQnJpYW4gQmlkdWxvY2sgPGJpZHVsb2NrQG9wZW5zczcub3JnPgorCisJKiBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUuYW0sIGV4YW1wbGVzL01ha2VmaWxlLmFtLAorCWV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUuYW0sIGxpYnZuY2NsaWVudC9NYWtlZmlsZS5hbSwKKwlsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuYW0sIHRlc3QvTWFrZWZpbGUuYW06IFJlbmFtZSBvYnNvbGV0ZSBJTkNMVURFUworCXRvIEFNX0NQUEZMQUdTCisKKzIwMTQtMDktMzAgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBsaWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYzogCisJQ2xvc2UgdW5jbG9zZWQgY29tbWVudHMgOy0pIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA5LTMwICBkc2NobyA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICMzNiBmcm9tIGRhbmllbGdpbmRpL21hc3RlciBBIGZvcmdvdHRlbiBgI2lmZGVmIFdJTjMyYCBicm9rZSBVTklYIGJ1aWxkLgorCisyMDE0LTA5LTMwICBkc2NobyA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICMzMyBmcm9tIGRhbmllbGdpbmRpL21hc3RlciBNb3JlIE1TVkMgYWRqdXN0bWVudHMsIG5vdyBmb2N1c2VzIG9uIHRoZSBsaWJ2bmNzZXJ2ZXIKKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jOiAKKwlUaGVzZSBhcmUgVU5JWCBoZWFkZXJzLCBhbmQgYXJlIG5vdCBhdmFpbGFibGUgb24gTVNWQworCisyMDE0LTA5LTIwICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogcmZiL3JmYi5oOiBUaG9zZSBhcmUgZ2VuZXJhbGx5IHRoZSB3aW5kb3dzIGhlYWRlcnMsIG5vdCBqdXN0IE1pbkdXCisKKzIwMTQtMDktMjAgIERhbmllbCBDb2hlbiBHaW5kaSA8ZGFuaWVsZ2luZGlAZ21haWwuY29tPgorCisJKiBsaWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmM6IE9uIHdpbmRvd3MsIHVzZSB0aGUgV2luMzIgY2FsbHMgZm9yCisJZGlyZWN0b3J5IGVudW1lcmF0aW9ucy4gIFdlIGFsc28gZG8gbm90IG5lZWQgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBVTklYIHZhbHVlcyB0byBXaW5kb3dzCisJdmFsdWVzIGluIHRoZSBSVEZfRklORF9EQVRBIHN0cnVjdCwgYXMgd2UgYWxyZWFkeSBhcmUgb24gd2luZG93cy4KKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci9odHRwZC5jLCBsaWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmMsCisJbGlidm5jc2VydmVyL3NvY2tldHMuYywgcmZiL3JmYmNsaWVudC5oOiBHZW5lcmFsbHkgYWRqdXN0aW5nIGhlYWRlcnMKKwlmb3IgY29tcGlsaW5nIG9uIHdpbmRvd3Mgd2l0aG91dCB0aGUgbWl4aW5nIG9mIFdpbnNvY2sgMSBhbmQgMi4KKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci9yZmJzZXJ2ZXIuYzogSnVzdCB1c2UgYSBtYWNybyB0byBicmlkZ2UgdG8gdGhlIFdpbjMyCisJdmVyc2lvbiBvZiBgbWtkaXJgIFRoZSBhZGRpdGlvbmFsIGNvbXBhdF9ta2RpciBmdW5jdGlvbiB3YXMgbm90IG5lY2Vzc2FyeSBhdCBhbGwuCisKKzIwMTQtMDktMjAgIERhbmllbCBDb2hlbiBHaW5kaSA8ZGFuaWVsZ2luZGlAZ21haWwuY29tPgorCisJKiBjb21wYXQvbXN2Yy9zeXMvdGltZS5oOiBVc2UgY29ycmVjdCBgd2luc29jazIuaGAgdmVyc2lvbiBoZWFkZXIKKwlpbnN0ZWFkIG9mIHdpbnNvY2suaC4gIGB3aW5kb3dzLmhgIGlzIHJlZmVycmluZyB0byBgd2luc29jay5oYCAodW5sZXNzIHRoZQorCWBXSU4zMl9MRUFOX0FORF9NRUFOYCBpcyBkZWZpbmVkKS4gIFRoZSBzdHJ1Y3RzIHVzZWQgaW4gdGhpcyBoZWFkZXIKKwlhcmUgZGVmaW5lZCBpbiBgd2luc29jazIuaGAgb3IgaW4gYHdpbnNvY2suaGAsIGJ1dCB3ZSBhcmUgdXNpbmcKKwlXaW5zb2NrMiBvZiBjb3Vyc2UhIFNvIHdlIGhhdmUgdG8gaW5jbHVkZSB3aW5zb2NrMi5oIGFuZCByZWZyYWluCisJZnJvbSBpbmNsdWRpbmcgd2luZG93cy5oIGhlcmUKKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci9odHRwZC5jLCBsaWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmMsCisJbGlidm5jc2VydmVyL3NvY2tldHMuYzogRml4ZWQgYSB2aW9sYXRpb24gb2YgdGhlIEM4OSBzdGFuZGFyZAorCSgiZGVjbGFyYXRpb25zIG11c3QgY29tZSBiZWZvcmUgaW5zdHJ1Y3Rpb25zIikKKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmM6IEEgd2luZG93cworCXZlcnNpb24gZm9yIGRpcmVjdG9yeSBlbnVtZXJhdGlvbnMgQmFzaWNhbGx5IHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGdpbmRpL0ZpbGVEaXIgd2l0aAorCXNvbWUgYWRqdXN0bWVudHMKKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmM6IE1TVkMgYWxzbworCWhhcyB0aGUgX19GVU5DVElPTl9fIHByZWRlZmluZWQKKworMjAxNC0wOS0yMCAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMsCisJbGlidm5jc2VydmVyL3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuaDogCisJYENyZWF0ZURpcmVjdG9yeWAgbWlnaHQgY2xhc2ggd2l0aCB0aGUKKwlgQ3JlYXRlRGlyZWN0b3J5QWAvYENyZWF0ZURpcmVjdG9yeVdgIG1hY3JvcyBvbiBNU1ZDCisKKzIwMTQtMDktMjAgIERhbmllbCBDb2hlbiBHaW5kaSA8ZGFuaWVsZ2luZGlAZ21haWwuY29tPgorCisJKiBsaWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jOiBGYWlsIHdoZW4KKwlOVUxMIGlzIHBhc3NlZCB0byBDcmVhdGVGaWxlTGlzdEluZm8oKSBQYXNzaW5nIE5VTEwgdG8gc3ByaW50ZigpIHdvdWxkIG1vc3QgbGlrZWx5IGNyYXNoIHRoZSBwcm9ncmFtLgorCisyMDE0LTA5LTIwICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogbGlidm5jY2xpZW50L3JmYnByb3RvLmMsIGxpYnZuY2NsaWVudC92bmN2aWV3ZXIuYywKKwlsaWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmMsIGxpYnZuY3NlcnZlci9zb2NrZXRzLmMsCisJbGlidm5jc2VydmVyL3N0YXRzLmMsIGxpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmM6IGBzdHJpbmdzLmhgIGFuZAorCWByZXNvbHYuaGAgYXJlIG5vdCBhdmFpbGFibGUgb24gTVNWQywgYW5kIHNvbWUgUE9TSVggZnVuY3Rpb25zIGFyZQorCXJlbmFtZWQgb3IgZGVwcmVjYXRlZCBGb3IgYWxsIG9mIHRob3NlIG1pc3NpbmcvZGVwcmVjYXRlZCBQT1NJWCBmdW5jdGlvbnMsIHdlIGp1c3QgYWRkIGEKKwltYWNybyBtYXBwaW5nIHRvIHRoZSBfdW5kZXJzY29yZWQgdmVyc2lvbiBvZiBNU1ZDLgorCisyMDE0LTA5LTA5ICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZS5hbTogVGhlIEhBVkVfWDExIGRlZmluZSBpcyBub3QgdGhlcmUKKwlhbnltb3JlLCBidXQgd2UgZG9uJ3QgbmVlZCBpdCBlaXRoZXIuCisKKzIwMTQtMDktMDkgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5hYywgdm5jdGVybS9DaGFuZ2VMb2csIHZuY3Rlcm0vTGludXhWTkMuYywKKwl2bmN0ZXJtL01ha2VmaWxlLmFtLCB2bmN0ZXJtL1JFQURNRSwgdm5jdGVybS9UT0RPLAorCXZuY3Rlcm0vVk5Db21tYW5kLmMsIHZuY3Rlcm0vVk5Db25zb2xlLmMsIHZuY3Rlcm0vVk5Db25zb2xlLmgsCisJdm5jdGVybS9leGFtcGxlLmMsIHZuY3Rlcm0vdmdhLmg6IE1vdmUgdm5jdGVybSB0bworCWh0dHBzOi8vZ2l0aHViLmNvbS9MaWJWTkMvdm5jdGVybS4KKworMjAxNC0wOS0wOSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBWaXN1YWxOYUNyby8uZ2l0aWdub3JlLCBWaXN1YWxOYUNyby9BVVRIT1JTLAorCVZpc3VhbE5hQ3JvL0NoYW5nZUxvZywgVmlzdWFsTmFDcm8vTWFrZWZpbGUuYW0sIFZpc3VhbE5hQ3JvL05FV1MsCisJVmlzdWFsTmFDcm8vUkVBRE1FLCBWaXN1YWxOYUNyby9hdXRvZ2VuLnNoLAorCVZpc3VhbE5hQ3JvL2NvbmZpZ3VyZS5hYywgVmlzdWFsTmFDcm8vZGVmYXVsdDh4MTYuaCwKKwlWaXN1YWxOYUNyby9uYWNyby5jLCBWaXN1YWxOYUNyby9uYWNyby5oLCBWaXN1YWxOYUNyby9yZWNvcmRlci5wbDogCisJTW92ZSBWaXN1YWxOYUNybyB0byBodHRwczovL2dpdGh1Yi5jb20vTGliVk5DL1Zpc3VhbE5hQ3JvLgorCisyMDE0LTA5LTA5ICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIHByZXBhcmVfeDExdm5jX2Rpc3Quc2g6IE1vdmUgcHJlcGFyZV94MTF2bmNfZGlzdC5zaCBvdmVyIHRvIHgxMXZuYworCXJlcG8uCisKKzIwMTQtMDktMDMgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIHgxMXZuYyBmcm9tIGF1dG90b29scyBidWlsZAorCXN5c3RlbS4KKworMjAxNC0wOS0wMyAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiB0aWdodHZuYy0xLjNkZXY1LXZuY3ZpZXdlci1hbHBoYS1jdXJzb3IucGF0Y2g6IFJlbW92ZQorCXRpZ2h0dm5jLTEuM2RldjUtdm5jdmlld2VyLWFscGhhLWN1cnNvci5wYXRjaC4KKworMjAxNC0wOS0wMyAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiB4MTF2bmMvLmN2c2lnbm9yZSwgeDExdm5jLzh0bzI0LmMsIHgxMXZuYy84dG8yNC5oLAorCXgxMXZuYy9DaGFuZ2VMb2csIHgxMXZuYy9NYWtlZmlsZS5hbSwgeDExdm5jL1JFQURNRSwKKwl4MTF2bmMvUkVMRUFTRS1OT1RFUywgeDExdm5jL2FsbG93ZWRfaW5wdXRfdC5oLCB4MTF2bmMvYXBwc2hhcmUuYywKKwl4MTF2bmMvYXZhaGkuYywgeDExdm5jL2F2YWhpLmgsIHgxMXZuYy9ibGFja291dF90LmgsCisJeDExdm5jL2NsZWFudXAuYywgeDExdm5jL2NsZWFudXAuaCwgeDExdm5jL2Nvbm5lY3Rpb25zLmMsCisJeDExdm5jL2Nvbm5lY3Rpb25zLmgsIHgxMXZuYy9jdXJzb3IuYywgeDExdm5jL2N1cnNvci5oLAorCXgxMXZuYy9lbmMuaCwgeDExdm5jL2VudW1zLmgsIHgxMXZuYy9ndWkuYywgeDExdm5jL2d1aS5oLAorCXgxMXZuYy9oZWxwLmMsIHgxMXZuYy9oZWxwLmgsIHgxMXZuYy9pbmV0LmMsIHgxMXZuYy9pbmV0LmgsCisJeDExdm5jL2tleWJvYXJkLmMsIHgxMXZuYy9rZXlib2FyZC5oLCB4MTF2bmMvbGludXhmYi5jLAorCXgxMXZuYy9saW51eGZiLmgsIHgxMXZuYy9tYWNvc3guYywgeDExdm5jL21hY29zeC5oLAorCXgxMXZuYy9tYWNvc3hDRy5jLCB4MTF2bmMvbWFjb3N4Q0cuaCwgeDExdm5jL21hY29zeENHUC5jLAorCXgxMXZuYy9tYWNvc3hDR1AuaCwgeDExdm5jL21hY29zeENHUy5jLCB4MTF2bmMvbWFjb3N4Q0dTLmgsCisJeDExdm5jL21hY29zeF9vcGVuZ2wuYywgeDExdm5jL21hY29zeF9vcGVuZ2wuaCwKKwl4MTF2bmMvbWlzYy8uY3ZzaWdub3JlLCB4MTF2bmMvbWlzYy9MSUNFTlNFLAorCXgxMXZuYy9taXNjL01ha2VmaWxlLmFtLCB4MTF2bmMvbWlzYy9SRUFETUUsIHgxMXZuYy9taXNjL1hkdW1teSwKKwl4MTF2bmMvbWlzYy9ibG9ja2RweS5jLCB4MTF2bmMvbWlzYy9jb25uZWN0X3N3aXRjaCwKKwl4MTF2bmMvbWlzYy9kZXNrdG9wLmNnaSwgeDExdm5jL21pc2MvZHRWbmNQb3B1cCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvQ09QWUlORywKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvUkVBRE1FLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL1JFQURNRS50eHQsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3Mvc3Nodm5jLmJhdCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy90c3ZuYy5iYXQsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9jb25uZWN0X2JyLnRjbCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vZXNvdW5kL2Rvd25sCisJb2FkLnVybCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vb3BlbnNzbC9kb3duCisJbG9hZC51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL29wZW5zc2wvbG9jYQorCXRpb24udXJsLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9wbGluay9kb3dubG8KKwlhZC51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3BsaW5rL2xpY2VuYworCWUudXJsLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL2Rvd24KKwlsb2FkLnVybCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9sb2NhCisJdGlvbi51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3ZuY3ZpZXdlci9kbworCXdubG9hZC51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3ZuY3ZpZXdlci9sbworCWNhdGlvbi51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9zdHVubmVsLWNsaWVudC5jbworCW5mLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvc3R1bm5lbC1zZXJ2ZXIuY28KKwluZiwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL3c5OC9sb2NhdGlvbi51cmwsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoLy5jcAorCW92ZXIsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoL3ZuYworCXZpZXdlci5zaCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL0Rhcndpbi5pMzg2Ly5jcG92ZXIsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9zc2h2bmMsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9zc3ZuYywKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3Nzdm5jX2NtZCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3Rzdm5jLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vdXRpbC9zc192bmN2aWV3ZXIsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi91dGlsL3Nzdm5jLnRjbCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3V0aWwvc3R1bm5lbC1zZXJ2ZXIuY29uZiwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYnVpbGQudW5peCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvZmlsZWxpc3QudHh0LAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9tYW4vbWFuMS9zc3ZuYy4xLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9tYW4vbWFuMS9zc3ZuY3ZpZXdlci4xLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvUkVBRE1FLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9SRUFETUUsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL19idW5kbGUsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL19nZXRwYXRjaGVzLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9fdm5jcGF0Y2hhcHBsaWVkLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9zdHVubmVsLW1heGNvbm4ucGEKKwl0Y2gsCisJeDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL3RpZ2h0LXZuY3ZpZXdlci1mdQorCWxsLnBhdGNoLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItZnUKKwlsbHNjcmVlbi5wYXRjaCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvdGlnaHQtdm5jdmlld2VyLW5lCisJd2Zic2l6ZS5wYXRjaCwKKwl4MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3ppcHMvUkVBRE1FLAorCXgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zc3ZuYy5kZXNrdG9wLAorCXgxMXZuYy9taXNjL2luZXQ2dG80LCB4MTF2bmMvbWlzYy9wYW5uZXIucGwsCisJeDExdm5jL21pc2MvcXRfdHNsaWJfaW5qZWN0LnBsLCB4MTF2bmMvbWlzYy9yYW5mYi5wbCwKKwl4MTF2bmMvbWlzYy9yeDExdm5jLCB4MTF2bmMvbWlzYy9yeDExdm5jLnBsLCB4MTF2bmMvbWlzYy9zaG1fY2xlYXIsCisJeDExdm5jL21pc2Mvc2xpZGUucGwsIHgxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlLmFtLAorCXgxMXZuYy9taXNjL3R1cmJvdm5jL1JFQURNRSwgeDExdm5jL21pc2MvdHVyYm92bmMvYXBwbHlfdHVyYm92bmMsCisJeDExdm5jL21pc2MvdHVyYm92bmMvY29udmVydCwKKwl4MTF2bmMvbWlzYy90dXJib3ZuYy9jb252ZXJ0X3JmYnNlcnZlciwKKwl4MTF2bmMvbWlzYy90dXJib3ZuYy90aWdodC5jLCB4MTF2bmMvbWlzYy90dXJib3ZuYy90dXJib2pwZWcuaCwKKwl4MTF2bmMvbWlzYy90dXJib3ZuYy91bmRvX3R1cmJvdm5jLCB4MTF2bmMvbWlzYy91aW5wdXQucGwsCisJeDExdm5jL21pc2MvdWx0cmF2bmNfcmVwZWF0ZXIucGwsIHgxMXZuYy9taXNjL3ZjaW5qZWN0LnBsLAorCXgxMXZuYy9taXNjL3gxMXZuY19sb29wLCB4MTF2bmMvbWlzYy94MTF2bmNfcHcsIHgxMXZuYy9ub3gxMS5oLAorCXgxMXZuYy9ub3gxMV9mdW5jcy5oLCB4MTF2bmMvb3B0aW9ucy5jLCB4MTF2bmMvb3B0aW9ucy5oLAorCXgxMXZuYy9wYXJhbXMuaCwgeDExdm5jL3BtLmMsIHgxMXZuYy9wbS5oLCB4MTF2bmMvcG9pbnRlci5jLAorCXgxMXZuYy9wb2ludGVyLmgsIHgxMXZuYy9yYXRlcy5jLCB4MTF2bmMvcmF0ZXMuaCwgeDExdm5jL3JlbW90ZS5jLAorCXgxMXZuYy9yZW1vdGUuaCwgeDExdm5jL3NjYW4uYywgeDExdm5jL3NjYW4uaCwgeDExdm5jL3NjcmVlbi5jLAorCXgxMXZuYy9zY3JlZW4uaCwgeDExdm5jL3Njcm9sbGV2ZW50X3QuaCwgeDExdm5jL3NlbGVjdGlvbi5jLAorCXgxMXZuYy9zZWxlY3Rpb24uaCwgeDExdm5jL3NvbGlkLmMsIHgxMXZuYy9zb2xpZC5oLAorCXgxMXZuYy9zc2xjbWRzLmMsIHgxMXZuYy9zc2xjbWRzLmgsIHgxMXZuYy9zc2xoZWxwZXIuYywKKwl4MTF2bmMvc3NsaGVscGVyLmgsIHgxMXZuYy9zc2x0b29scy5oLCB4MTF2bmMvdGt4MTF2bmMsCisJeDExdm5jL3RreDExdm5jLmgsIHgxMXZuYy91aW5wdXQuYywgeDExdm5jL3VpbnB1dC5oLAorCXgxMXZuYy91bml4cHcuYywgeDExdm5jL3VuaXhwdy5oLCB4MTF2bmMvdXNlci5jLCB4MTF2bmMvdXNlci5oLAorCXgxMXZuYy91c2VyaW5wdXQuYywgeDExdm5jL3VzZXJpbnB1dC5oLCB4MTF2bmMvdXRpbC5jLAorCXgxMXZuYy91dGlsLmgsIHgxMXZuYy92NGwuYywgeDExdm5jL3Y0bC5oLCB4MTF2bmMvd2luX3V0aWxzLmMsCisJeDExdm5jL3dpbl91dGlscy5oLCB4MTF2bmMvd2luYXR0cl90LmgsIHgxMXZuYy94MTF2bmMuMSwKKwl4MTF2bmMveDExdm5jLmMsIHgxMXZuYy94MTF2bmMuZGVza3RvcCwgeDExdm5jL3gxMXZuYy5oLAorCXgxMXZuYy94MTF2bmNfZGVmcy5jLCB4MTF2bmMveGRhbWFnZS5jLCB4MTF2bmMveGRhbWFnZS5oLAorCXgxMXZuYy94ZXZlbnRzLmMsIHgxMXZuYy94ZXZlbnRzLmgsIHgxMXZuYy94aW5lcmFtYS5jLAorCXgxMXZuYy94aW5lcmFtYS5oLCB4MTF2bmMveGtiX2JlbGwuYywgeDExdm5jL3hrYl9iZWxsLmgsCisJeDExdm5jL3hyYW5kci5jLCB4MTF2bmMveHJhbmRyLmgsIHgxMXZuYy94cmVjb3JkLmMsCisJeDExdm5jL3hyZWNvcmQuaCwgeDExdm5jL3h3cmFwcGVycy5jLCB4MTF2bmMveHdyYXBwZXJzLmg6IFJlbW92ZQorCXgxMXZuYyBzdWJkaXIuICBUaGUgbmV3IHgxMXZuYyByZXBvIGlzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9MaWJWTkMveDExdm5jLgorCisyMDE0LTA5LTAyICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogbGlidm5jY2xpZW50L3Rsc19vcGVuc3NsLmM6IEZpeCB0dl91c2VjIGNhbGN1bGF0aW9uIFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBNU1ZDIHBhdGNoZXMuICBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wOC0yOSAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY2NsaWVudC90bHNfb3BlbnNzbC5jOiBVc2UgV2luZG93cycgY3JpdGljYWwgc2VjdGlvbnMgdG8KKwllbXVsYXRlIHB0aHJlYWQncyBtdXRleGVzIFdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKyssIHdlIGNhbm5vdCB1c2UgcHRocmVhZHMgKE1pbkdXIHNwb3J0cyBhbgorCWVtdWxhdGlvbiBsaWJyYXJ5IHdoaWNoIGlzIHRoZSByZWFzb24gd2UgZGlkIG5vdCBuZWVkCisJV2luZG93cy1zcGVjaWZpYyBoYWNrcyBlYXJsaWVyKS4gSGFwcGlseSwgaXQgaXMgdmVyeSBlYXN5IHRvIHByb3ZpZGUKKwlXaW5kb3dzLXNwZWNpZmljIGVtdWxhdGlvbnMgZm9yIHRoZSBwdGhyZWFkIGNhbGxzIHdlIHVzZS4gIFtKRVM6IGZpeGVkIGNvbW1pdCBtZXNzYWdlXSBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wOC0yOSAgRGFuaWVsIENvaGVuIEdpbmRpIDxkYW5pZWxnaW5kaUBnbWFpbC5jb20+CisKKwkqIGxpYnZuY2NsaWVudC96cmxlLmM6IFBlcmZvcm0gcG9pbnRlciBhcml0aG1ldGljIG9uIGNoYXIgKiBpbnN0ZWFkCisJb2Ygdm9pZCAqIE1pY3Jvc29mdCBWaXN1YWwgQysrIGRvZXMgbm90IGFsbG93IHBvaW50ZXIgYXJpdGhtZXRpYyBvbiB2b2lkCisJcG9pbnRlcnMuICBbSkVTOiBmaXhlZCBjb21taXQgbWVzc2FnZV0gU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDgtMjkgIERhbmllbCBDb2hlbiBHaW5kaSA8ZGFuaWVsZ2luZGlAZ21haWwuY29tPgorCisJKiBsaWJ2bmNjbGllbnQvdGxzX29wZW5zc2wuYywgcmZiL3JmYnByb3RvLmg6IE1TVkM6IFVzZSB0aGUgVW5peAorCWVtdWxhdGlvbiBoZWFkZXJzIFtKRVM6IHByb3ZpZGVkIGNvbW1pdCBtZXNzYWdlLCBzcGxpdCBvdXQgdW5yZWxhdGVkIGNoYW5nZXNdIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA4LTI5ICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogbGlidm5jY2xpZW50L2xpc3Rlbi5jLCBsaWJ2bmNjbGllbnQvc29ja2V0cy5jLAorCWxpYnZuY2NsaWVudC92bmN2aWV3ZXIuYzogVXNlIFdJTjMyIGZvciBXaW5kb3dzLXNwZWNpZmljICNpZmRlZgorCWd1YXJkcyBUbyBzdXBwb3J0IE1pY3Jvc29mdCBWaXN1YWwgQysrLCB3ZSBtdXN0IG5vdCBndWFyZCBXaW5kb3dzLXNwZWNpZmljCisJY29kZSBpbiBNaW5HVy1zcGVjaWZpYyAjaWZkZWYgZ3VhcmRzLiAgSGFwcGlseSwgZXZlbiA2NC1iaXQgTVNWQyBkZWZpbmVzIHRoZSBXSU4zMiBjb25zdGFudCwgdGhlcmVmb3JlIHdlCisJY2FuIHVzZSB0aGF0IGluc3RlYWQuICBbSkVTOiBmaXhlZCBjb21taXQgbWVzc2FnZSwgcmVvcmRlcmVkIGNvbW1pdCwgc3BsaXQgb3V0IHVucmVsYXRlZAorCWNoYW5nZXNdIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA4LTI5ICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogY29tcGF0L21zdmMvc3RkaW50LmgsIGNvbXBhdC9tc3ZjL3N5cy90aW1lLmgsCisJY29tcGF0L21zdmMvdW5pc3RkLmg6IEFkZCBNU1ZDIGNvbXBhdGlibGUgdW5peCBoZWFkZXJzIFRoZSBzdGRpbnQuaCBmaWxlIHdhcyBjb3BpZWQgZnJvbToKKwlodHRwczovL3J1bmV4ZS5nb29nbGVjb2RlLmNvbS9zdm4taGlzdG9yeS9yOS90cnVuay9zcmMvcnVubGliL21zc3RkaW50Lmgod2UgY2FuIGluY29ycG9yYXRlIGl0IGJlY2F1c2UgaXQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIDMtY2xhdXNlIEJTRAorCWxpY2Vuc2UuKSBbSkVTOiBmaXhlZCBjb21taXQgbWVzc2FnZSwgZml4ZWQgc3RyaXBwZWQgY29weXJpZ2h0IGhlYWRlcl0gU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDktMDEgIERhbmllbCBDb2hlbiBHaW5kaSA8ZGFuaWVsZ2luZGlAZ21haWwuY29tPgorCisJKiBsaWJ2bmNjbGllbnQvcmZicHJvdG8uYywgbGlidm5jY2xpZW50L3NvY2tldHMuYywKKwlsaWJ2bmNjbGllbnQvdGxzX29wZW5zc2wuYzogTVNWQzogVXNlIF9zbnByaW50ZiBpbnN0ZWFkIG9mIHNucHJpbnRmIEluIE1pY3Jvc29mdCdzIFZpc3VhbCBDIHJ1bnRpbWUsIHRoZSBzbnByaW50ZigpIGZ1bmN0aW9uIGlzIGFjdHVhbGx5CisJY2FsbGVkIF9zbnByaW50Zi4gTGV0J3MganVzdCAjZGVmaW5lIHRoZSBmb3JtZXIgdG8gY2FsbCB0aGUgbGF0dGVyLiAgW0pFUzogZml4ZWQgY29tbWl0IG1lc3NhZ2VdIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA5LTAxICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogcmZiL3JmYnByb3RvLmg6IFVzZSBjb3JyZWN0IHdpbnNvY2sgaGVhZGVyIFdlIGxpbmsgdG8gd3MyXzMyLmxpYiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgd2luc29jazIuaCBoZWFkZXIsCisJbm90IHRoZSB3aW5zb2NrLmggaGVhZGVyLiAgW0pFUzogZml4ZWQgY29tbWl0IG1lc3NhZ2VdIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA4LTI5ICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogbGlidm5jY2xpZW50L3ZuY3ZpZXdlci5jOiBJbmNsdWRlIFdpbnNvY2syIGhlYWRlciBiZWZvcmUgd2luZG93cy5oCisJaW5jbHVkZSBUaGF0J3MgYmVjYXVzZSB0aGVyZSBhcmUgZHVwbGljYXRlICNkZWZpbmVzLCBhbmQgd2hlbiBXaW5zb2NrMiBpcworCWRlZmluZWQgYmVmb3JlIHdpbmRvd3MuaCB0aGVuIHdpbmRvd3MuaCBkZXRlY3RzIHRoYXQgYW5kIHByZXZlbnQKKwlyZWRlZmluaXRpb24uICBTZWUKKworCWh0dHA6Ly9zb2NpYWwubXNkbi5taWNyb3NvZnQuY29tL0ZvcnVtcy93aW5kb3dzZGVza3RvcC9lbi1VUy80YTkwYjE0My0xZmI4LTQzZTktYTU0Yy05NTYxMjdlMGM1Nzkvd2luZG93c2gtYW5kLXdpbnNvY2syaD9mb3J1bT13aW5kb3dzc2RrW0pFUzogZml4ZWQgY29tbWl0IG1lc3NhZ2VdIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA5LTAxICBEYW5pZWwgQ29oZW4gR2luZGkgPGRhbmllbGdpbmRpQGdtYWlsLmNvbT4KKworCSogbGlidm5jY2xpZW50L3Rsc19vcGVuc3NsLmM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIFRoaXMgY2hhbmdlIGlzIHRlY2huaWNhbGx5IG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IE1TVkMsIGJ1dCBpdCB3YXMKKwlkZXRlY3RlZCBieSBNaWNyb3NvZnQncyBjb21waWxlci4gIFtKRVM6IGZpeGVkIGNvbW1pdCBtZXNzYWdlXSBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wOC0yNiAgZHNjaG8gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiA6IE1lcmdlIHB1bGwgcmVxdWVzdCAjMjEgZnJvbSBuZXdzb2Z0L21hc3RlciBGaXhpbmcgdHdvIG1vcmUgc2VjdXJpdHkgaXNzdWVzIChyZW1vdGUgc2VydmVyIGNyYXNoKQorCisyMDE0LTA4LTE4ICBOaWNvbGFzIFJ1ZmYgPG5ydWZmQGdvb2dsZS5jb20+CisKKwkqIGxpYnZuY3NlcnZlci9yZmJzZXJ2ZXIuYzogQ2hlY2sgbWFsbG9jKCkgcmV0dXJuIHZhbHVlIG9uCisJY2xpZW50LT5zZXJ2ZXIgQ2xpZW50Q3V0VGV4dCBtZXNzYWdlLiBDbGllbnQgY2FuIHNlbmQgdXAgdG8gMioqMzItMQorCWJ5dGVzIG9mIHRleHQsIGFuZCBzdWNoIGEgbGFyZ2UgYWxsb2NhdGlvbiBpcyBsaWtlbHkgdG8gZmFpbCBpbiBjYXNlCisJb2YgaGlnaCBtZW1vcnkgcHJlc3N1cmUuIFRoaXMgd291bGQgaW4gYSBzZXJ2ZXIgY3Jhc2ggKHdyaXRlIGF0CisJYWRkcmVzcyAwKS4KKworMjAxNC0wOC0xNiAgZHNjaG8gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiA6IE1lcmdlIHB1bGwgcmVxdWVzdCAjMTYgZnJvbSBzYW5kc21hcmsvbWFzdGVyIE1lcmdlIHBhdGNoZXMgZnJvbSBLREUva3JmYgorCisyMDE0LTA4LTE2ICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogYWNpbmNsdWRlLm00OiBGaXggd2hpdGVzcGFjZSBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wOC0xMCAgTHVjYSBGYWxhdmlnbmEgPGRrdHJrcmFuekBkZWJpYW4ub3JnPgorCisJKiBhY2luY2x1ZGUubTQ6IEVuYWJsZSBzdXBwb3J0IGZvciBwcGM2NGVsIGFyY2hpdGVjdHVyZQorCisyMDE0LTA4LTEwICBMdWNhIEZhbGF2aWduYSA8ZGt0cmtyYW56QGRlYmlhbi5vcmc+CisKKwkqIGxpYnZuY2NsaWVudC5wYy5pbiwgbGlidm5jc2VydmVyLnBjLmluOiBVc2UgTGlicy5wcml2YXRlIHRvIGF2b2lkCisJdW5uZWNlc3NhcnkgbGlua2FnZQorCisyMDE0LTA4LTE2ICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogbGlidm5jY2xpZW50L3JmYnByb3RvLmMsIGxpYnZuY2NsaWVudC92bmN2aWV3ZXIuYzogRml4IGluZGVudGF0aW9uIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA4LTE2ICBkc2NobyA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICMyMCBmcm9tIG5ld3NvZnQvbWFzdGVyIEZpeCBpbnRlZ2VyIG92ZXJmbG93IGluIE1hbGxvY0ZyYW1lQnVmZmVyKCkKKworMjAxNC0wOC0xNSAgbmV3c29mdCA8bmV3c29mdEBNYWNCb29rLUFpci1kZS1uZXdzb2Z0LTIubG9jYWw+CisKKwkqIGxpYnZuY2NsaWVudC92bmN2aWV3ZXIuYzogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4KKwlNYWxsb2NGcmFtZUJ1ZmZlcigpIFByb21vdGUgaW50ZWdlcnMgdG8gdWludDY0X3QgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZSBkdXJpbmcKKwlmcmFtZSBidWZmZXIgYWxsb2NhdGlvbiBmb3IgdmVyeSBsYXJnZSBzY3JlZW4gc2l6ZXMKKworMjAxMy0wOS0yOCAgQW1hbmRlZXAgU2luZ2ggPGFtYW4uZGVkbWFuQGdtYWlsLmNvbT4KKworCSogbGlidm5jc2VydmVyL3NvY2tldHMuYzogYWxsb3cgcmZiSW5pdFNvY2tldHMgd2l0aCBub24tcmVhZHkKKwlzdGF0ZXMuICBUaGlzIGFsbG93cyBmb3IgcmVpbml0aWFsaXphdGlvbnMgb2YgZS4gZy4gc29ja2V0cyBpbiBhIFNIVVRET1dOCisJc3RhdGUuICBUaGUgb25seSBzdGF0ZSB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWluaXRpYWxpemUgYXJlCisJUkVBRFkgc3RhdGVzLgorCisyMDEzLTEwLTA5ICBBbWFuZGVlcCBTaW5naCA8YW1hbi5kZWRtYW5AZ21haWwuY29tPgorCisJKiBsaWJ2bmNzZXJ2ZXIvbWFpbi5jOiBGaXggY3Jhc2ggaW4ga3JmYiBLcmZiIGNyYXNoZXMgb24gcXVpdCwgaWYgYW55IGNsaWVudCBpcyBjb25uZWN0ZWQgZHVlIHRvIGEKKwlyZmJDbGllbnRDb25uZWN0aW9uR29uZSBjYWxsIG1pc3NpbmcKKworMjAxNC0wNy0xMCAgV2lsbCBUaG9tcHNvbiA8d2lsbEB3aWxsdGhvbXBzb24uY28udWs+CisKKwkqIHgxMXZuYy94cmFuZHIuYzogeDExdm5jOiBmaXggZG91YmxlIFhfVU5MT0NLIG9uIHhyYW5kciBldmVudHMgY2hlY2tfeHJhbmRyX2V2ZW50KCkgYXNzdW1lcyBYX0xPQ0sgaXMgdGFrZW4gYmVmb3JlIGl0IGlzIGNhbGxlZCwKKwlhbmQgY3VycmVudGx5IGNhbGxzIFhfVU5MT0NLIG9uIGJlaGFsZiBvZiB0aGUgY2FsbGVyLiBCdXQgaW4KKwlwcmFjdGljZSwgYWxsIGNhbGxlcnMgYXNzdW1lIHRoYXQgdGhlIGxvY2sgaXMgc3RpbGwgaGVsZCBhZnRlcgorCWNoZWNrX3hyYW5kcl9ldmVudCgpIHJldHVybnMuIEluIHBhcnRpY3VsYXIsIHRoaXMgbGVhZHMgdG8gYQorCWRvdWJsZS11bmxvY2sgYW5kIGNyYXNoIGluIGNoZWNrX3hldmVudHMoKSBvbiBhbnkgeHJhbmRyIGV2ZW50LgorCisyMDE0LTA3LTE4ICBkc2NobyA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIDogTWVyZ2UgcHVsbCByZXF1ZXN0ICMxMyBmcm9tCisJd2p0L2ZpeC1kb3VibGUtWF9VTkxPQ0stb24teHJhbmRyLWV2ZW50IHgxMXZuYzogZml4IGRvdWJsZSBYX1VOTE9DSyBvbiB4cmFuZHIgZXZlbnRzCisKKzIwMTQtMDYtMjcgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBjb21tb24vbHpvY29uZi5oLCBjb21tb24vbHpvZGVmcy5oLCBjb21tb24vbWluaWx6by5jLAorCWNvbW1vbi9taW5pbHpvLmg6IFVwZGF0ZSBMWk8gdG8gdmVyc2lvbiAyLjA3IEl0IHdhcyByZXBvcnRlZCB0aGF0IExaTyBoYXMgc2VjdXJpdHkgaXNzdWVzIGluIExNUy0yMDE0LTA2LTE2LTE6CisJT2Jlcmh1bWVyIExaTyAoQ1ZFLTIwMTQtNDYwNyk6CisJaHR0cDovL3NlY2xpc3RzLm9yZy9vc3Mtc2VjLzIwMTQvcTIvNjY1IFRoaXMgd2FzIGFsc28gcmVwb3J0ZWQgYnkgQWxleCBYdSBhcworCWh0dHBzOi8vZ2l0aHViLmNvbS9MaWJWTkMvbGlidm5jc2VydmVyL2lzc3Vlcy85LiAgU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDYtMjMgIGRzY2hvIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogOiBNZXJnZSBwdWxsIHJlcXVlc3QgIzcgZnJvbSB3YWxkaGVpbnovaW5pdC1zZmFlLXBhZGRpbmcgSW5pdGlhbGl6ZSBwYWRkaW5nIGluIFNldEZvcm1hdEFuZEVuY29kaW5ncycgcmZiU2V0UGl4ZWxGb3JtYXRNc2cuCisKKzIwMTQtMDYtMjMgIE1hdHRoaWFzIFRyZXlkdGUgPG10QHdhbGRoZWluei5kZT4KKworCSogbGlidm5jY2xpZW50L3JmYnByb3RvLmM6IEluaXRpYWxpemUgcGFkZGluZyBpbgorCVNldEZvcm1hdEFuZEVuY29kaW5ncycgcmZiU2V0UGl4ZWxGb3JtYXRNc2cuCisKKzIwMTQtMDYtMjMgIE1hdHRoaWFzIFRyZXlkdGUgPG10QHdhbGRoZWluei5kZT4KKworCSogQ01ha2VMaXN0cy50eHQ6IFVzZSBDTUFLRV9DVVJSRU5UXypfRElSIGluc3RlYWQgb2YgQ01BS0VfKl9ESVIuICBUaGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGZyaWVuZGx5IHRvIHVzZSBhcyBhIGdpdCBzdWJtb2R1bGUgd2l0aGluCisJYW5vdGhlciBwcm9qZWN0LCBhbmQgc2hvdWxkIGNoYW5nZSBub3RoaW5nIHdoZW4gY29tcGlsZWQgYWxvbmUuICBGb3IgZXhhbXBsZSB3aGVuIGhhdmluZyBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbGlrZQorCSJteV9wcm9qZWN0L2V4dGVybmFsL2xpYnZuYyIsIHdoZXJlIGluIGxpYnZuYyByZXNpZGVzIGEgY2hlY2tvdXQgb2YKKwlsaWJ2bmNzZXJ2ZXIsIG9uZSBjYW4ganVzdCByZWZlcmVuY2UgdGhhdCBkaXJlY3RvcnkgZnJvbSB0aGUKKwlDTWFrZUxpc3RzLnR4dCBpbiBteV9wcm9qZWN0IHdpdGggPiBhZGRfZGlyZWN0b3J5ICggZXh0ZXJuYWwvbGlidm5jICkgYW5kIGFkZCB2bmNjbGllbnQgLyB2bmNzZXJ2ZXIgaW4gbXlfcHJvamVjdCdzIHRhcmV0X2xpbmtfbGlicmFyaWVzLAorCW9uZSBjYW4ganVzdCBoYWNrIGF3YXkgd2l0aG91dCBoYXZpbmcgdG8gbWFudWFsbHkgbWFrZSAvIGluc3RhbGwKKwlMaWJWTkNTZXJ2ZXIgd2hlbmV2ZXIgc29tZXRoaW5nIGlzIGNoYW5nZWQgdGhlcmUuCisKKzIwMTQtMDUtMTQgIGRzY2hvIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogOiBNZXJnZSBwdWxsIHJlcXVlc3QgIzQgZnJvbSBkZXh0ZXJvL21hc3RlciB4MTF2bmM6IGFkanVzdCBibGFja291dCByZWdpb24gY29vcmRpbmF0ZXMgdG8gdGhlIGNsaXBwaW5nIHJlZ2lvbgorCisyMDE0LTA0LTA1ICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogbGlidm5jY2xpZW50L3JmYnByb3RvLmM6IGxpYnZuY2NsaWVudDogSWYgd2UgaGF2ZSBUTFMgc3VwcG9ydCwKKwllbmFibGUgVmVOQ3J5cHQgYnkgZGVmYXVsdCBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wNC0wNSAgSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIC5naXRpZ25vcmU6IElnbm9yZSB0aGUgJ21hYycgZXhhbXBsZSwgdG9vIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA0LTA1ICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogLmdpdGlnbm9yZTogSWdub3JlIHRoZSB2ZW5jcnlwdCBkb2N1bWVudCAJaHR0cHM6Ly93d3cuYmVycmFuZ2UuY29tL35kYW4vdmVuY3J5cHQudHh0IFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTA0LTA1ICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogLmdpdGlnbm9yZTogSWdub3JlIHJmYnByb3RvLnJzdCBBIG1vcmUgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIHRoZSBSRkIgcHJvdG9jb2wgaXMgbWFpbnRhaW5lZCBieQorCVRpZ2VyVk5DOgorCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcC90aWdlcnZuYy9jb2RlL0hFQUQvdHJlZS9yZmJwcm90by9yZmJwcm90by5yc3RTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxNC0wMy0yOSAgSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKwkqIGV4YW1wbGVzL3JlcGVhdGVyLmM6IFJlcGVhdGVyIGV4YW1wbGU6IHNob3cgaG93IHRvIHNodXQgZG93bgorCWNsZWFubHkgU2luY2Ugd2UgY29ubmVjdGVkIHRvIHRoZSBjbGllbnQgdGhyb3VnaCB0aGUgcmVwZWF0ZXIsIGNoYW5jZXMgYXJlCisJdGhhdCB3ZSB3YW50IHRoaXMgc2VydmVyIHNodXQgZG93biBvbmNlIHRoZSBjbGllbnQgZGlzY29ubmVjdGVkLiAgU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDMtMjkgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiAuZ2l0aWdub3JlLCBleGFtcGxlcy9NYWtlZmlsZS5hbSwgZXhhbXBsZXMvcmVwZWF0ZXIuYzogQWRkIGFuCisJZXhhbXBsZSBob3cgdG8gY29ubmVjdCB0byBhbiBVbHRyYVZOQy1zdHlsZSByZXBlYXRlciBVbHRyYVZOQyBvZmZlcnMgYW4gYWRkLW9uIHRvIGNvbm5lY3QgY2xpZW50cyBhbmQgc2VydmVycyB2aWEgSURzCisJd2l0aCBhIHNvLWNhbGxlZCByZXBlYXRlciAoZS5nLiB0byBicmlkZ2UgZmlyZXdhbGxlZCBjbGllbnRzIGFuZAorCXNlcnZlcnMpOiAJaHR0cDovL3d3dy51dm5jLmNvbS9wcm9kdWN0cy91dm5jLXJlcGVhdGVyLmh0bWwgVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoYXQgZmVhdHVyZSB3aXRoIGEKKwlMaWJWTkNTZXJ2ZXItYmFzZWQgc2VydmVyLiAgU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDQtMDUgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogY29uZmlndXJlLmFjLCB3ZWJjbGllbnRzL25vdm5jL1JFQURNRS5tZCwKKwl3ZWJjbGllbnRzL25vdm5jL3ZuYy5odG1sOiBVcGRhdGUgc291cmNlZm9yZ2UgbGlua3MgdG8gcG9pbnQgdG8KKwlnaXRodWIuCisKKzIwMTQtMDMtMzEgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBsaWJ2bmNzZXJ2ZXIvcmZicmVnaW9uLmM6IEZpeCB0eW9wIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDE0LTAzLTMwICBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworCSogLmdpdGlnbm9yZTogSWdub3JlIG1vcmUgZ2VuZXJhdGVkIGZpbGVzIFdoaWxlIGF0IGl0LCBhbHNvIGlnbm9yZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgUkZCIHByb3RvY29sIGJlc3QKKwlkb3dubG9hZGVkIG1hbnVhbGx5IGZyb20gCWh0dHA6Ly93d3cucmVhbHZuYy5jb20vZG9jcy9yZmJwcm90by5wZGYgU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDMtMzAgIFJvYmJlcnQgS2xhcmVuYmVlayA8cm9iYmVydGtsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogbGlidm5jY2xpZW50L3ZuY3ZpZXdlci5jOiBBZGRyZXNzICMxMiBDbGllbnREYXRhIGRvZXMgbm90IGdldAorCWZyZWVkIHJmYkNsaWVudFNldENsaWVudERhdGEoKSBhbGxvY2F0ZXMgYSBuZXcgcmZiQ2xpZW50RGF0YSwgYnV0IG5ldmVyCisJZ2V0cyBjbGVhbmVkIHVwLCB3aGljaCBjYXVzZXMgbWVtb3J5IGxlYWtzLiAgU2lnbmVkLW9mZi1ieTogSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTQtMDMtMzAgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBleGFtcGxlcy9leGFtcGxlLmMsIHRlc3QvZW5jb2RpbmdzdGVzdC5jOiBBZnRlciBmcmVlKClpbmcKKwljbGllbnREYXRhLCBzZXQgaXQgdG8gTlVMTCBXZSB3aWxsIGNoYW5nZSByZmJDbGllbnRDbGVhbnVwKCkgdG8gZnJlZSB0aGUgZGF0YS4gIFNpZ25lZC1vZmYtYnk6IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisyMDEzLTAyLTI3ICBKb2VsIE1hcnRpbiA8Z2l0aHViQG1hcnRpbnRyaWJlLm9yZz4KKworCSogbGlidm5jc2VydmVyL3dlYnNvY2tldHMuYzogU2V0IG9wY29kZSBjb3JyZWN0bHkgZm9yIGJpbmFyeSBmcmFtZXMuCisKKzIwMTMtMDEtMjUgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogcmZiL3JmYnByb3RvLmg6IFJlbW92ZSB1bm5lZWRlZCAjaWZkZWZzLgorCisyMDEzLTAxLTI1ICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIHJmYi9yZmJjbGllbnQuaDogRml4IEFCSSBjb21wYXRpYmlsaXR5IGlzc3VlLgorCisyMDEzLTAxLTA5ICBEYXZpZCBWZXJiZWlyZW4gPGRhdmlkLnZlcmJlaXJlbkBpbnRlbC5jb20+CisKKwkqIGNsaWVudF9leGFtcGxlcy9ndGt2bmN2aWV3ZXIuYywgY29uZmlndXJlLmFjLAorCWxpYnZuY2NsaWVudC9NYWtlZmlsZS5hbSwgbGlidm5jY2xpZW50L2gyNjQuYywKKwlsaWJ2bmNjbGllbnQvcmZicHJvdG8uYywgbGlidm5jY2xpZW50L3ZuY3ZpZXdlci5jLCByZmIvcmZiY2xpZW50LmgsCisJcmZiL3JmYnByb3RvLmg6IExpYlZOQ0NsaWVudDogQWRkIEguMjY0IGVuY29kaW5nIGZvciBmcmFtZWJ1ZmZlcgorCXVwZGF0ZXMgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIHN1cHBvcnQgaW4gTGliVk5DQ2xpZW50IGZvciBmcmFtZWJ1ZmZlcgorCXVwZGF0ZXMgZW5jb2RlZCBhcyBILjI2NCBmcmFtZXMuIEhhcmR3YXJlIGFjY2VsZXJhdGVkIGRlY29kaW5nIGlzCisJcGVyZm9ybWVkIHVzaW5nIFZBIEFQSS4gIFRoaXMgaXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgdG8gbGV0IHRoZSBjb21tdW5pdHkgZXhwbG9yZSB0aGUKKwlwb3NzaWJpbGl0aWVzIG9mZmVyZWQgYnkgdGhlIHBvdGVudGlhbCBiYW5kd2lkdGggYW5kIGxhdGVuY3kKKwlyZWR1Y3Rpb25zIHRoYXQgSC4yNjQgZW5jb2RpbmcgYWxsb3dzLiBUaGlzIG1heSBiZSBwYXJ0aWN1bGFybHkKKwl1c2VmdWwgZm9yIHVzZSBjYXNlcyBzdWNoIGFzIG9ubGluZSBnYW1pbmcsIGhvc3RlZCBkZXNrdG9wcywgaG9zdGVkCisJc2V0IHRvcCBib3hlcy4uLiAgVGhpcyBwYXRjaCBvbmx5IHByb3ZpZGVzIHRoZSBjbGllbnQgc2lkZSBzdXBwb3J0IGFuZCBpcyBtZWFudCB0byBiZQorCXVzZWQgd2l0aCBjb3JyZXNwb25kaW5nIHNlcnZlci1zaWRlIHN1cHBvcnQsIGFzIHByb3ZpZGVkIGJ5IGFuCisJdXBjb21pbmcgcGF0Y2ggZm9yIHFlbXUgdWkvdm5jIG1vZHVsZSAodG8gdmlldyB0aGUgZGlzcGxheSBvZiBhCisJdmlydHVhbCBtYWNoaW5lIGV4ZWN1dGluZyB1bmRlciBRRU1VKS4gIFdpdGggdGhpcyBILjI2NC1iYXNlZCBlbmNvZGluZywgaWYgbXVsdGlwbGUgZnJhbWVidWZmZXIgdXBkYXRlCisJbWVzc2FnZXMgYXJlIGdlbmVyYXRlZCBmb3IgYSBzaW5nbGUgc2VydmVyIGZyYW1lYnVmZmVyIG1vZGlmaWNhdGlvbiwKKwl0aGUgSC4yNjQgZnJhbWUgZGF0YSBpcyBzZW50IG9ubHkgd2l0aCB0aGUgZmlyc3QgdXBkYXRlIG1lc3NhZ2UuCisJU3Vic2VxdWVudCB1cGRhdGUgZnJhbWVidWZmZXIgbWVzc2FnZXMgd2lsbCBjb250YWluIG9ubHkgdGhlCisJY29vcmRpbmF0ZXMgYW5kIHNpemUgb2YgdGhlIGFkZGl0aW9uYWwgdXBkYXRlZCByZWdpb25zLiAgSW5zdHJ1Y3Rpb25zL1JlcXVpcmVtZW50czogKiBUaGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSBwcmV2aW91cyBwYXRjaCBJCisJc3VibWl0dGVkIHdpdGggbWlub3IgZW5oYW5jZW1lbnRzIHRvIHRoZSBndGt2bmN2aWV3ZXIgYXBwbGljYXRpb246CisJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsYXJjaGl2ZS9tZXNzYWdlLnBocD9tc2dfaWQ9MzAzMjM4MDQgKiBDdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIGxpYnZhIDEuMDogdXNlIGJyYW5jaCAidjEuMC1icmFuY2giIGZvcgorCWxpYnZhIGFuZCBpbnRlbC1kcml2ZXIuIFRob3NlIGNhbiBiZSBidWlsdCBhcyBmb2xsb3dzOiAgICBjZCBsaWJ2YSAgICBnaXQgY2hlY2tvdXQgdjEuMC1icmFuY2ggICAgLi9hdXRvZ2VuLnNoICAgIG1ha2UgICAgc3VkbyBtYWtlIGluc3RhbGwgICAgY2QgLi4gICAgIGdpdCBjbG9uZSBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy92YWFwaS9pbnRlbC1kcml2ZXIgICAgY2QgaW50ZWwtZHJpdmVyICAgIGdpdCBjaGVja291dCB2MS4wLWJyYW5jaCAgICAuL2F1dG9nZW4uc2ggICAgbWFrZSAgICBzdWRvIG1ha2UgaW5zdGFsbCBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBWZXJiZWlyZW4gPGRhdmlkLnZlcmJlaXJlbkBpbnRlbC5jb20+CisKKzIwMTMtMDEtMDggIERhdmlkIFZlcmJlaXJlbiA8ZGF2aWQudmVyYmVpcmVuQGludGVsLmNvbT4KKworCSogY2xpZW50X2V4YW1wbGVzL2d0a3ZuY3ZpZXdlci5jOiBndGt2bmN2aWV3ZXIgZW5oYW5jZW1lbnRzIEhpZGUgIkNvbm5lY3RpbmciIGRpYWxvZyBpbiBndGt2bmN2aWV3ZXIgb25jZSBhbiB1cGRhdGUgaXMgcmVjZWl2ZWQuICBIaWRlIGxvY2FsIGN1c3JvciBpbiBndGt2bmN2aWV3ZXIuCisKKzIwMTItMDktMTQgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogQVVUSE9SUzogQWRkIFJhcGhhZWwgdG8gQVVUSE9SUy4KKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIGxpYnZuY2NsaWVudC9yZmJwcm90by5jOiBJbmNsdWRlIHN0cmluZ3MuaCBmb3Igc3RybmNhc2VjbXAoMykKKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIGxpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmM6IFdvcmsgYXJvdW5kIGEgZ2NjIGJ1ZyB3aXRoIGFub255bW91cworCXN0cnVjdHMgYW5kIHVuaW9ucy4gIEdDQyA8IDQuNiBmYWlsZWQgdG8gcGFyc2UgdGhlIGRlY2xhcmF0aW9uIG9mIHdzX2hlYWRlcl90IGNvcnJlY3RseQorCWJlY2F1c2UgaXQgZGlkIG5vdCBhY2NlcHQgYW5vbnltb3VzIHN0cnVjdHMgYW5kIHVuaW9ucy4gWzFdIFdvcmsgYXJvdW5kIHRoZSBidWcgYnkgYWRkaW5nIG5hbWVzIHRvIHRoZSB1bmlvbnMgYW5kIHN0cnVjdHMuIFVnbHksCisJYnV0IHdvcmtzLiAgWzFdIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDc4NAorCisyMDEyLTA5LTExICBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPHJha3Vjb0BGcmVlQlNELm9yZz4KKworCSogbGlidm5jc2VydmVyL3JmYnNlcnZlci5jOiBJbmNsdWRlIHN0ZGlvLmggZm9yIHNucHJpbnRmKDMpCisKKzIwMTItMDktMTEgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSA8cmFrdWNvQEZyZWVCU0Qub3JnPgorCisJKiBsaWJ2bmNzZXJ2ZXIvd2Vic29ja2V0cy5jOiBBZGQgdGhlIHJlcXVpcmVkIGhlYWRlcnMgZm9yIHJlYWQoMikKKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIENNYWtlTGlzdHMudHh0LCBjb25maWd1cmUuYWMsIGxpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmMsCisJcmZiL3JmYmNvbmZpZy5oLmNtYWtlOiBVc2UgaHRvYmVOTigzKSB0byBjb252ZXJ0IG51bWJlcnMgaW4KKwl3ZWJzb2NrZXQuYy4gIGJ5dGVzd2FwLmggZXhpc3RzIG9ubHkgb24gZ2xpYmMsIHNvIGJ1aWxkaW5nIGxpYnZuY3NlcnZlciB3aXRoCisJd2Vic29ja2V0cyBzdXBwb3J0IHdhcyBub3QgcG9zc2libGUgaW4gb3RoZXIgc3lzdGVtcy4gIFJlcGxhY2UgdGhlIGluY2x1c2lvbiBvZiBieXRlc3dhcC5oIGFuZCB0aGUgV1NfKiBkZWZpbml0aW9ucyB3aXRoCisJY2FsbHMgdG8gaHRvYmVOTiwgd2hpY2ggc2hvdWxkIHBlcmZvcm0gdGhlIHNhbWUgY29udmVyc2lvbnMsIGJlIG1vcmUKKwlwb3J0YWJsZSBhbmQgYXZvaWQgdGhlIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBwbGF0Zm9ybSdzIGVuZGlhbm5lc3MuCisKKzIwMTItMDktMTEgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSA8cmFrdWNvQEZyZWVCU0Qub3JnPgorCisJKiBDTWFrZUxpc3RzLnR4dCwgY29uZmlndXJlLmFjOiBEbyBub3QgaGFyZGNvZGUgdGhlIG5lZWQgZm9yCisJbGlicmVzb2x2LiAgbGlicmVzb2x2IGlzIG9ubHkgcHJlc2VudCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBnbGliYzsgcGxhdGZvcm1zIHN1Y2gKKwlhcyBGcmVlQlNEIGhhdmUgX19iNjRfbnRvcCBhcyBwYXJ0IG9mIGxpYmMgaXRzZWxmLiAgSW1wcm92ZSB0aGUgZGV0ZWN0aW9uIHByb2Nlc3MgYW5kIG9ubHkgbGluayBhZ2FpbnN0IGxpYnJlc29sdiBpZiBpdAorCWV4aXN0cyBvbiB0aGUgc3lzdGVtLCBhbmQgcmVtZW1iZXIgdG8gcmVzZXQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTCisJYWZ0ZXIgcGVyZm9ybWluZyB0aGUgbmVjZXNzYXJ5IHRlc3RzLCBzaW5jZSB3ZSBkbyBub3QgYWx3YXlzIHdhbnQgdG8KKwlsaW5rIGFnYWluc3QgbGlicmVzb2x2LgorCisyMDEyLTA5LTExICBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPHJha3Vjb0BGcmVlQlNELm9yZz4KKworCSogY29tbW9uL3ZuY2F1dGguYywgbGlidm5jY2xpZW50L3JmYnByb3RvLmMsCisJbGlidm5jY2xpZW50L3NvY2tldHMuYywgbGlidm5jc2VydmVyL2h0dHBkLmMsCisJbGlidm5jc2VydmVyL3JmYnNlcnZlci5jLCBsaWJ2bmNzZXJ2ZXIvc29ja2V0cy5jLAorCWxpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmM6IFR1bmUgdGhlIGRlZmluaXRpb25zIG5lZWRlZCB3aGVuIGJ1aWxkaW5nCisJd2l0aCAtYW5zaS4gIFRoZSBjdXJyZW50IGRlZmluaXRpb25zIHdlcmUgbW9zdGx5IHVzZWZ1bCB0byBnbGliYyBhbmQgZm9sbG93ZWQgaXRzCisJZmVhdHVyZV90ZXN0X21hY3JvcygzKSBkb2N1bWVudGF0aW9uLiAgSG93ZXZlciwgdGhpcyBtZWFucyBvdGhlciBwbGF0Zm9ybXMgc3RpbGwgaGFkIHByb2JsZW1zIHdoZW4gYnVpbGRpbmcKKwl3aXRoIHN0cmljdCBjb21waWxhdGlvbiBmbGFncy4gX0JTRF9TT1VSQ0UsIGZvciBleGFtcGxlLCBpcyBvbmx5CisJcmVjb2duaXplZCBieSBnbGliYywgYW5kIG90aGVyIHBsYXRmb3JtcyBzb21ldGltZXMgbmVlZAorCV9YT1BFTl9TT1VSQ0UgaW5zdGVhZCwgb3IgZXZlbiB0aGUgcmVtb3ZhbCBvZiBzb21lIGRlZmluaXRpb25zIChzdWNoCisJYXMgdGhlIG91dGRhdGUgX1BPU0lYX1NPVVJDRSBvbmUpLiAgX1BPU0lYX1NPVVJDRSBhbHNvIGhhZCB0byBiZSBjb25kaXRpb25hbGx5IGRlZmluZWQgaW4gc29tZSBwbGFjZXMsCisJYXMgd2hhdCBpdCBlbmFibGVzIG9yIGRpc2FibGVzIGR1cmluZyBjb21waWxhdGlvbiB2YXJpZXMgYWNyb3NzCisJc3lzdGVtcy4KKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIGxpYnZuY3NlcnZlci9zb2NrZXRzLmMsIGxpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmM6IEFkZCBzb21lCisJbWlzc2luZyBmZWF0dXJlIG1hY3JvIGRlZmluaXRpb25zLiAgQnVpbGRpbmcgd2l0aCAtYW5zaSBmYWlsZWQgZHVlIHRvIHNvbWUgY29kZSAoYXMgd2VsbCBhcyBzeXN0ZW0KKwloZWFkZXJzKSB1c2luZyBub24tQzg5IGZlYXR1cmVzLiBGaXggdGhhdCBieSBhZGRpbmcgdGhlIHVzdWFsCisJX1BPU0lYX1NPVVJDRSBhbmQgX0JTRF9TT1VSQ0UgZGVmaW5pdGlvbnMgYWxyZWFkeSBwcmVzZW50IGluIHNvbWUKKwlvdGhlciBmaWxlcy4KKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIGNvbW1vbi90dXJib2pwZWcuYywgbGlidm5jc2VydmVyL3RpZ2h0LmMsCisJbGlidm5jc2VydmVyL3dlYnNvY2tldHMuYywgcmZiL3JmYi5oLCByZmIvcmZiY29uZmlnLmguY21ha2UsCisJdGVzdC9ibXAuaDogVXNlIEMtc3R5bGUgY29tbWVudHMgaW4gcmZiY29uZmlnLmguY21ha2UgYW5kIEMgc291cmNlCisJY29kZS4gIFVzaW5nIEMrKy1zdHlsZSBjb21tZW50cyB3aGVuIGJ1aWxkaW5nIHRoZSBjb2RlIHdpdGggLWFuc2kgZG9lcyBub3QKKwl3b3JrLCBzbyBiZSBtb3JlIGNvbnNlcnZhdGl2ZSB3aXRoIHRoZSBjb21tZW50IHN0eWxlLgorCisyMDEyLTA5LTExICBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPHJha3Vjb0BGcmVlQlNELm9yZz4KKworCSogbGlidm5jc2VydmVyL3dlYnNvY2tldHMuYzogQ29ycmVjdGx5IGluY2x1ZGUgcmZiY29uZmlnLmguICBidWlsZF9kaXIvcmZiIGlzIG5vdCBwYXNzZWQgYXMgYW4gaW5jbHVkZSBkaXJlY3RvcnkgYXV0b21hdGljYWxseSB0bworCXRoZSBjb21waWxlciwgc28gaW5jbHVkaW5nIHRoYXQgZmlsZSBmYWlscy4KKworMjAxMi0wOS0xMSAgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29ARnJlZUJTRC5vcmc+CisKKwkqIENNYWtlTGlzdHMudHh0OiBDTWFrZTogTGluayBhZ2FpbnN0IGxpYmdjcnlwdCB3aGVuIGl0IGlzIGZvdW5kLiAgU28gZmFyLCBsaWJnY3J5cHQgd2FzIGxvb2tlZCBmb3IgYnV0IG5vIHRhcmdldHMgbGlua2VkIGFnYWluc3QgaXQKKwlkaXJlY3RseTsgdGhpcyBjYXVzZWQgbGlua2luZyBwcm9ibGVtcyBmb3IgdGhlIGNsaWVudCBhbmQgc2VydmVyCisJZXhhbXBsZXMsIGFzIHRoZSBzeW1ib2xzIHRoZXkgbmVlZGVkIHdlcmUgbm90IHBhc3NlZCB0byB0aGUgbGlua2VyLiAgVGhlIGlzc3VlIHRoYXQgdGhlIEdudVRMUyB3ZWJzb2NrZXRzIGNvZGUgdXNlcyBsaWJnY3J5cHQgcmVnYXJkbGVzcworCW9mIHdoZXRoZXIgaXQgaGFzIGJlZW4gZm91bmQgb3Igbm90IGhhcyBub3QgYmVlbiB0b3VjaGVkIGJ5IHRoaXMKKwljb21taXQsIHRob3VnaC4KKworMjAxMi0wOC0xOSAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiB3ZWJjbGllbnRzL25vdm5jL0xJQ0VOU0UudHh0LCB3ZWJjbGllbnRzL25vdm5jL1JFQURNRS5tZCwKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmFzZS5jc3MsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2JsYWNrLmNzcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmx1ZS5jc3MsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Rpc3BsYXkuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2lucHV0LmpzLAorCXdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9wbGF5YmFjay5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvcmZiLmpzLCB3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdWkuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3V0aWwuanMsIHdlYmNsaWVudHMvbm92bmMvaW5jbHVkZS92bmMuanMsCisJd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3dlYi1zb2NrZXQtanMvd2ViX3NvY2tldC5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2Vic29jay5qcywKKwl3ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2VidXRpbC5qcywgd2ViY2xpZW50cy9ub3ZuYy92bmMuaHRtbCwKKwl3ZWJjbGllbnRzL25vdm5jL3ZuY19hdXRvLmh0bWw6IFVwZGF0ZSBub1ZOQyB3ZWJjbGllbnQuCisKKzIwMTItMDgtMTkgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogQVVUSE9SUzogVXBkYXRlIEFVVEhPUlMuCisKKzIwMTItMDgtMDggIE9saXZlciBMb2NoIDxvLmxvY2hAZ214Lm5ldD4KKworCSogbGlidm5jc2VydmVyL3NvY2tldHMuYzogUGF0Y2hlZCBzb2NrZXRzLmMgdG8gYWxsb3cgdGhlIHVzZSBvZiBJUHY2CisJd2l0aG91dCBJUHY0LiAgQXMgcmVxdWVzdGVkIG9ubHkgdGhvc2UgbGluZXMgYXJlIGluZGVudGVkIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQuCisKKzIwMTItMDctMjAgIEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisJKiBBVVRIT1JTOiBBZGQgYW5vdGhlciBjb250cmlidXRvciBTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4KKworMjAxMi0wNy0xOSAgUm9zdGlzbGF2IExpc292eSA8bGlzb3Z5QGdtYWlsLmNvbT4KKworCSogbGlidm5jY2xpZW50L3Rsc19vcGVuc3NsLmM6IEZpeCBpbiBtaWxsaXNlY29uZHMgdG8gc3RydWN0IHRpbWV2YWwKKwljb252ZXJzaW9uIFNpZ25lZC1vZmYtYnk6IFJvc3Rpc2xhdiBMaXNvdnkgPGxpc292eUBnbWFpbC5jb20+IFNpZ25lZC1vZmYtYnk6CisJSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKzIwMTItMDUtMzEgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogbGlidm5jc2VydmVyL2NvbmZpZy5oLCBsaWJ2bmNzZXJ2ZXIvcmZiY29uZmlnLmg6IFJlbW92ZQorCWF1dG9nZW5lcmF0ZWQgZmlsZXMgZnJvbSByZXBvLgorCisyMDEyLTA1LTIzICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CisKKwkqIENNYWtlTGlzdHMudHh0LCBjb25maWd1cmUuYWMsIHJmYi9yZmJjb25maWcuaC5jbWFrZTogQWRkIENvbXBpbGUKKwlUaW1lIFZlcnNpb24gVGVzdCBEZWZpbmVzLgorCisyMDEyLTA1LTE4ICBLeWxlIEouIE1jS2F5IDxtYWNreWxlQGdtYWlsLmNvbT4KKworCSogbGlidm5jc2VydmVyL3NvY2tldHMuYzogbGlidm5jc2VydmVyL3NvY2tldHMuYzogZG8gbm90IHNlZ2ZhdWx0CisJd2hlbiBsaXN0ZW5Tb2NrL2xpc3RlbjZTb2NrID09IC0xCisKKzIwMTItMDUtMDkgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogVE9ETywgbGlidm5jY2xpZW50L3JmYnByb3RvLmMsIGxpYnZuY2NsaWVudC9zb2NrZXRzLmMsCisJdm5jdGVybS9MaW51eFZOQy5jOiBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncyB0aGF0IGhpbnRlZCBzb21lIG5vCisJdG9vIHVuaW1wb3J0YW50IGVycm9ycy4KKworMjAxMi0wNS0wNyAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBUT0RPOiBVcGRhdGUgVE9ETy4KKworMjAxMi0wNS0wNyAgTHVjYSBGYWxhdmlnbmEgPGRrdHJrcmFuekBkZWJpYW4ub3JnPgorCisJKiB0ZXN0L2VuY29kaW5nc3Rlc3QuYzogRW5jb2RpbmdzdGVzdDogVXNlIGZvcm1hdCBzdHJpbmcgYXJndW1lbnQKKwl3aXRoIGZwcmludGYuCisKKzIwMTItMDUtMDUgIENocmlzdGlhbiBCZWllciA8ZG9udG1pbmRAZnJlZXNoZWxsLm9yZz4KKworCSogQ01ha2VMaXN0cy50eHQsIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDAuOS4xMC4KKworMjAxMi0wNS0wNCAgQ2hyaXN0aWFuIEJlaWVyIDxkb250bWluZEBmcmVlc2hlbGwub3JnPgorCisJKiBDaGFuZ2VMb2c6IFVwZGF0ZSBDaGFuZ2VMb2cgZm9yIDAuOS45LgorCiAyMDEyLTA1LTA0ICBDaHJpc3RpYW4gQmVpZXIgPGRvbnRtaW5kQGZyZWVzaGVsbC5vcmc+CiAKIAkqIGNvbmZpZ3VyZS5hYzogRW5hYmxlIGJ1aWxkaW5nIERMTHMgd2l0aCBNaW5HVzMyLgpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRlMWI2Li4wMDAwMDAwCi0tLSBhL0NsZWFuU3BlYy5taworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCi0jIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAotIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KLSMgcnVuIGJlZm9yZS4KLSMKLSMgRS5nLjoKLSMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKLSMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKLSMKLSMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCi0jIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgotIwotIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCi0jIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCi0jCi0jIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQotIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQotIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQotIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCi0jIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotIwotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIEZvciBleGFtcGxlOgotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKLQotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmExN2EuLjAwMDAwMDAKLS0tIGEvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1CYXNpYyBJbnN0YWxsYXRpb24KLT09PT09PT09PT09PT09PT09PQotCi0gICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgotCi0gICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgotdmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKLXRob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgotSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50Ci1kZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKLXlvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCi1gY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAotcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKLSh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgotCi0gICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Ci10byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCi1kaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCi1iZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJwotY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotCi0gICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KLWNhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKLWl0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6Ci0KLSAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQotICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKLSAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKLSAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQotICAgICBgY29uZmlndXJlJyBpdHNlbGYuCi0KLSAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQotICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KLQotICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgotCi0gIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAotICAgICB0aGUgcGFja2FnZS4KLQotICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKLSAgICAgZG9jdW1lbnRhdGlvbi4KLQotICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCi0gICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCi0gICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgotICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKLSAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5Ci0gICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0Ci0gICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQotICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLUNvbXBpbGVycyBhbmQgT3B0aW9ucwotPT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Ci10aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKLWluaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCi1hIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCi10aGlzOgotICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKLQotT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgotICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQotCi1Db21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKLXNhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgotb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKLXN1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQotZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KLXRoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCi1zb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCi0KLSAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCi12YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKLWluIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCi1vbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgotYXJjaGl0ZWN0dXJlLgotCi1JbnN0YWxsYXRpb24gTmFtZXMKLT09PT09PT09PT09PT09PT09PQotCi0gICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgotYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCi1pbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKLW9wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCi0KLSAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCi1hcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQotZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQotUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCi1Eb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KLQotICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQotb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKLWtpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcwoteW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KLQotICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCi13aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQotb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KLQotT3B0aW9uYWwgRmVhdHVyZXMKLT09PT09PT09PT09PT09PT09Ci0KLSAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bwotYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCi1UaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCi1pcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQotYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQotcGFja2FnZSByZWNvZ25pemVzLgotCi0gICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKLWZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKLXlvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKLWAtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCi0KLVNwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKLWF1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQotd2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKLWEgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQotYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCi10eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKLSAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCi0KLVNlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCi1gY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0Ci1uZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KLQotICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KLXVzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAotcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKLXN5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KLQotU2hhcmluZyBEZWZhdWx0cwotPT09PT09PT09PT09PT09PQotCi0gICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCi15b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKLWRlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KLWBjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KLWBQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCi1gQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCi1BIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgotCi1PcGVyYXRpb24gQ29udHJvbHMKLT09PT09PT09PT09PT09PT09PQotCi0gICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAotb3BlcmF0ZXMuCi0KLWAtLWNhY2hlLWZpbGU9RklMRScKLSAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKLSAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCi0gICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KLQotYC0taGVscCcKLSAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KLQotYC0tcXVpZXQnCi1gLS1zaWxlbnQnCi1gLXEnCi0gICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KLSAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKLSAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCi0KLWAtLXNyY2Rpcj1ESVInCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS12ZXJzaW9uJwotICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJwotICAgICBzY3JpcHQsIGFuZCBleGl0LgotCi1gY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9MaWJWTkNTZXJ2ZXIuc3BlYyBiL0xpYlZOQ1NlcnZlci5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZiMWI1Li4wMDAwMDAwCi0tLSBhL0xpYlZOQ1NlcnZlci5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIyBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgYSByZWxvY2F0YWJsZSBwYWNrYWdlCi1OYW1lOiBMaWJWTkNTZXJ2ZXIKLVZlcnNpb246IDAuOS45Ci1SZWxlYXNlOiAyCi1TdW1tYXJ5OiBhIGxpYnJhcnkgdG8gbWFrZSB3cml0aW5nIGEgdm5jIHNlcnZlciBlYXN5Ci1Db3B5cmlnaHQ6IEdQTAotR3JvdXA6IExpYnJhcmllcy9OZXR3b3JrCi1QYWNrYWdlcjogSm9oYW5uZXMuU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+Ci1Tb3VyY2U6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKLUJ1aWxkUm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LWJ1aWxkcm9vdAotCi0lZGVzY3JpcHRpb24KLUxpYlZOQ1NlcnZlciBtYWtlcyB3cml0aW5nIGEgVk5DIHNlcnZlciAob3IgbW9yZSBjb3JyZWN0bHksIGEgcHJvZ3JhbQotZXhwb3J0aW5nIGEgZnJhbWVidWZmZXIgdmlhIHRoZSBSZW1vdGUgRnJhbWUgQnVmZmVyIHByb3RvY29sKSBlYXN5LgotCi1JdCBpcyBiYXNlZCBvbiBPU1h2bmMsIHdoaWNoIGluIHR1cm4gaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFh2bmMgYnkKLU9STCwgbGF0ZXIgQVQmVCByZXNlYXJjaCBsYWJzIGluIFVLLgotCi1JdCBoaWRlcyB0aGUgcHJvZ3JhbW1lciBmcm9tIHRoZSB0ZWRpb3VzIHRhc2sgb2YgbWFuYWdpbmcgY2xpZW50cyBhbmQKLWNvbXByZXNzaW9uIHNjaGVtYXRhLgotCi1MaWJWTkNTZXJ2ZXIgd2FzIHB1dCB0b2dldGhlciBhbmQgaXMgKGFjdGl2ZWx5IDstKSBtYWludGFpbmVkIGJ5Ci1Kb2hhbm5lcyBTY2hpbmRlbGluIDxKb2hhbm5lcy5TY2hpbmRlbGluQGdteC5kZT4KLQotJXBhY2thZ2UgZGV2ZWwKLVJlcXVpcmVzOiAgICAgJXtuYW1lfSA9ICV7dmVyc2lvbn0KLVN1bW1hcnk6ICAgICAgU3RhdGljIExpYnJhcmllcyBhbmQgSGVhZGVyIEZpbGVzIGZvciBMaWJWTkNTZXJ2ZXIKLUdyb3VwOiAgICAgICAgTGlicmFyaWVzL05ldHdvcmsKLVJlcXVpcmVzOiAgICAgJXtuYW1lfSA9ICV7dmVyc2lvbn0KLQotJWRlc2NyaXB0aW9uIGRldmVsCi1TdGF0aWMgTGlicmFyaWVzIGFuZCBIZWFkZXIgRmlsZXMgZm9yIExpYlZOQ1NlcnZlci4KLQotJXBhY2thZ2UgeDExdm5jCi1SZXF1aXJlczogICAgICV7bmFtZX0gPSAle3ZlcnNpb259Ci1TdW1tYXJ5OiAgICAgIFZOQyBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50IFgxMSBzZXNzaW9uCi1Hcm91cDogICAgICAgIFVzZXIgSW50ZXJmYWNlL1gKLVJlcXVpcmVzOiAgICAgJXtuYW1lfSA9ICV7dmVyc2lvbn0KLQotJWRlc2NyaXB0aW9uIHgxMXZuYwoteDExdm5jIGlzIHRvIFggV2luZG93IFN5c3RlbSB3aGF0IFdpblZOQyBpcyB0byBXaW5kb3dzLCBpLmUuIGEgc2VydmVyCi13aGljaCBzZXJ2ZXMgdGhlIGN1cnJlbnQgWCBXaW5kb3cgU3lzdGVtIGRlc2t0b3AgdmlhIFJGQiAoVk5DKQotcHJvdG9jb2wgdG8gdGhlIHVzZXIuCi0KLUJhc2VkIG9uIHRoZSBpZGVhcyBvZiB4MHJmYnNlcnZlciBhbmQgb24gTGliVk5DU2VydmVyLCBpdCBoYXMgZXZvbHZlZAotaW50byBhIHZlcnNhdGlsZSBhbmQgcGVyZm9ybWFudCB3aGlsZSBzdGlsbCBlYXN5IHRvIHVzZSBwcm9ncmFtLgotCi0lcHJlcAotJXNldHVwIC1uICV7bmFtZX0tJXt2ZXJzaW9ufQotCi0lYnVpbGQKLSMgQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgLi9jb25maWd1cmUgLS1wcmVmaXg9JXtfcHJlZml4fQotJWNvbmZpZ3VyZQotbWFrZQotCi0laW5zdGFsbAotWyAtbiAiJXtidWlsZHJvb3R9IiAtYSAiJXtidWlsZHJvb3R9IiAhPSAvIF0gJiYgcm0gLXJmICV7YnVpbGRyb290fQotIyBtYWtlIGluc3RhbGwgcHJlZml4PSV7YnVpbGRyb290fSV7X3ByZWZpeH0KLSVtYWtlaW5zdGFsbCBpbmNsdWRlZGlyPSIle2J1aWxkcm9vdH0le19pbmNsdWRlZGlyfS9yZmIiCi0KLSV7X19pbnN0YWxsfSAtZCAtbTA3NTUgJXtidWlsZHJvb3R9JXtfZGF0YWRpcn0veDExdm5jL2NsYXNzZXMKLSV7X19pbnN0YWxsfSB3ZWJjbGllbnRzL1ZuY1ZpZXdlci5qYXIgd2ViY2xpZW50cy9pbmRleC52bmMgXAotICAle2J1aWxkcm9vdH0le19kYXRhZGlyfS94MTF2bmMvY2xhc3NlcwotCi0lY2xlYW4KLVsgLW4gIiV7YnVpbGRyb290fSIgLWEgIiV7YnVpbGRyb290fSIgIT0gLyBdICYmIHJtIC1yZiAle2J1aWxkcm9vdH0KLQotJXByZQotJXBvc3QKLSVwcmV1bgotJXBvc3R1bgotCi0lZmlsZXMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRvYyBSRUFETUUgSU5TVEFMTCBBVVRIT1JTIENoYW5nZUxvZyBORVdTIFRPRE8gCi0le19iaW5kaXJ9L0xpbnV4Vk5DCi0le19iaW5kaXJ9L2xpYnZuY3NlcnZlci1jb25maWcKLSV7X2xpYmRpcn0vbGlidm5jY2xpZW50LioKLSV7X2xpYmRpcn0vbGlidm5jc2VydmVyLioKLQotJWZpbGVzIGRldmVsCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSV7X2luY2x1ZGVkaXJ9L3JmYi8qCi0KLSVmaWxlcyB4MTF2bmMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJXtfYmluZGlyfS94MTF2bmMKLSV7X21hbmRpcn0vbWFuMS94MTF2bmMuMSoKLSV7X2RhdGFkaXJ9L3gxMXZuYy9jbGFzc2VzCi0KLSVjaGFuZ2Vsb2cKLSogRnJpIEF1ZyAxOSAyMDA1IEFsYmVydG8gTHVzaWFuaSA8YWx1c2lhbmlAZ21haWwuY29tPiByZWxlYXNlIDIKLS0gY3JlYXRlIHNlcGFyYXRlIHBhY2thZ2UgZm9yIHgxMXZuYyB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHgxMXZuYyBycG0KLS0gY3JlYXRlIGRldmVsIHBhY2thZ2UsIG5lZWRlZCB0byBjb21waWxlIGJ1dCBub3QgbmVlZGVkIGZvciBydW5uaW5nCi0qIFN1biBGZWIgOSAyMDAzIEpvaGFubmVzIFNjaGluZGVsaW4KLS0gY3JlYXRlZCBsaWJ2bmNzZXJ2ZXIuc3BlYy5pbgotCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODdiODU5Li4wMDAwMDAwCi0tLSBhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOTM4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBNYWtlZmlsZS4gIEdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLQotCi0KLQotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0xpYlZOQ1NlcnZlcgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9MaWJWTkNTZXJ2ZXIKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotc3ViZGlyID0gLgotRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoaW5jbHVkZV9IRUFERVJTKSBcCi0JJChzcmNkaXIpL0xpYlZOQ1NlcnZlci5zcGVjLmluICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9saWJ2bmNjbGllbnQucGMuaW4gXAotCSQoc3JjZGlyKS9saWJ2bmNzZXJ2ZXItY29uZmlnLmluICQoc3JjZGlyKS9saWJ2bmNzZXJ2ZXIucGMuaW4gXAotCSQoc3JjZGlyKS9yZmJjb25maWcuaC5pbiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBBVVRIT1JTIFwKLQlDT1BZSU5HIENoYW5nZUxvZyBJTlNUQUxMIE5FV1MgVE9ETyBjb21waWxlIGNvbmZpZy5ndWVzcyBcCi0JY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKLSBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9IHJmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSBsaWJ2bmNzZXJ2ZXIucGMgbGlidm5jY2xpZW50LnBjIFwKLQlsaWJ2bmNzZXJ2ZXItY29uZmlnIExpYlZOQ1NlcnZlci5zcGVjCi1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7Ci1hbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAotICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCi0gICAgKikgZj0kJHA7OyBcCi0gIGVzYWM7Ci1hbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7Ci1hbV9faW5zdGFsbF9tYXggPSA0MAotYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKLSAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAotYW1fX25vYmFzZV9zdHJpcCA9IFwKLSAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCi1hbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCi0gIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCi0gICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKLSAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCi0gICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCi0gICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JwotYW1fX2Jhc2VfbGlzdCA9IFwKLSAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKLSAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJwotYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAotICB0ZXN0IC16ICIkJGZpbGVzIiBcCi0gICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCi0gICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAotICB9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIFwKLQkiJChERVNURElSKSQoaW5jbHVkZWRpcikiCi1TQ1JJUFRTID0gJChiaW5fU0NSSVBUUykKLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fJChWKSkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfYXRfMCA9IEAKLVNPVVJDRVMgPQotRElTVF9TT1VSQ0VTID0KLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLURBVEEgPSAkKHBrZ2NvbmZpZ19EQVRBKQotSEVBREVSUyA9ICQoaW5jbHVkZV9IRUFERVJTKQotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCi0JJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKLQlkaXN0ZGlyIGRpc3QgZGlzdC1hbGwgZGlzdGNoZWNrCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikiOyB0aGVuIFwKLSAgICBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICYmIHJtIC1yZiAiJChkaXN0ZGlyKSIgXAotICAgICAgfHwgeyBzbGVlcCA1ICYmIHJtIC1yZiAiJChkaXN0ZGlyKSI7IH07IFwKLSAgZWxzZSA6OyBmaQotYW1fX3JlbGF0aXZpemUgPSBcCi0gIGRpcjA9YHB3ZGA7IFwKLSAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCi0gIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCi0gIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCi0gIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAotICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCi0gICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAotICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKLSAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCi0gICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAotICAgICAgZWxzZSBcCi0gICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAotICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCi0gICAgICBmaTsgXAotICAgIGZpOyBcCi0gICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gIGRvbmU7IFwKLSAgcmVsZGlyPSIkJGRpcjIiCi1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1hbV9fZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9ICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgXAotICB8IHNlZCAnc3xeXC4vfCQocHJlZml4KS98JyB8IGdyZXAgLXYgJyQoaW5mb2RpcikvZGlyJCQnCi1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLUFDTE9DQUwgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYWNsb2NhbC0xLjExCi1BTVRBUiA9ICQke1RBUi10YXJ9Ci1BTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IDAKLUFSID0gL3Vzci9iaW4vYXIKLUFTID0gYXMKLUFVVE9DT05GID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9jb25mCi1BVVRPSEVBREVSID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKLUFVVE9NQUtFID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLTEuMTEKLUFWQUhJX0NGTEFHUyA9IAotQVZBSElfTElCUyA9IAotQVdLID0gbWF3awotQ0MgPSBnY2MKLUNDREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ0ZMQUdTID0gLWcgLU8yIC1XYWxsICAKLUNQUCA9IGdjYyAtRQotQ1BQRkxBR1MgPSAKLUNSWVBUX0xJQlMgPSAtbGNyeXB0Ci1DWFggPSBnKysKLUNYWENQUCA9IGcrKyAtRQotQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ1hYRkxBR1MgPSAtZyAtTzIKLUNZR1BBVEhfVyA9IGVjaG8KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLURFUERJUiA9IC5kZXBzCi1ETExUT09MID0gZGxsdG9vbAotRUNITyA9IGVjaG8KLUVDSE9fQyA9IAotRUNIT19OID0gLW4KLUVDSE9fVCA9IAotRUdSRVAgPSAvYmluL2dyZXAgLUUKLUVYRUVYVCA9IAotRjc3ID0gCi1GRkxBR1MgPSAKLUdOVVRMU19DRkxBR1MgPSAKLUdOVVRMU19MSUJTID0gCi1HUkVQID0gL2Jpbi9ncmVwCi1HVEtfQ0ZMQUdTID0gCi1HVEtfTElCUyA9IAotSU5TVEFMTCA9IC91c3IvYmluL2luc3RhbGwgLWMKLUlOU1RBTExfREFUQSA9ICR7SU5TVEFMTH0gLW0gNjQ0Ci1JTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMgLXMKLUpQRUdfTERGTEFHUyA9IAotTERGTEFHUyA9IAotTElCR0NSWVBUX0NGTEFHUyA9IAotTElCR0NSWVBUX0NPTkZJRyA9IG5vCi1MSUJHQ1JZUFRfTElCUyA9IAotTElCT0JKUyA9IAotTElCUyA9IC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgCi1MSUJUT09MID0gJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wKLUxOX1MgPSBsbiAtcwotTFRMSUJPQkpTID0gCi1NQUtFSU5GTyA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBtYWtlaW5mbwotTUtESVJfUCA9IC9iaW4vbWtkaXIgLXAKLU9CSkRVTVAgPSBvYmpkdW1wCi1PQkpFWFQgPSBvCi1QQUNLQUdFID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX0JVR1JFUE9SVCA9IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyCi1QQUNLQUdFX05BTUUgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfU1RSSU5HID0gTGliVk5DU2VydmVyIDAuOS45Ci1QQUNLQUdFX1RBUk5BTUUgPSBsaWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfVVJMID0gCi1QQUNLQUdFX1ZFUlNJT04gPSAwLjkuOQotUEFUSF9TRVBBUkFUT1IgPSA6Ci1QS0dfQ09ORklHID0gL3Vzci9iaW4vcGtnLWNvbmZpZwotUEtHX0NPTkZJR19MSUJESVIgPSAKLVBLR19DT05GSUdfUEFUSCA9IAotUkFOTElCID0gcmFubGliCi1SUE1TT1VSQ0VESVIgPSBOT1QtRk9VTkQKLVNETF9DRkxBR1MgPSAKLVNETF9MSUJTID0gCi1TRVRfTUFLRSA9IAotU0hFTEwgPSAvYmluL2Jhc2gKLVNTTF9MSUJTID0gCi1TVFJJUCA9IHN0cmlwCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyA9IAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gCi1WRVJTSU9OID0gMC45LjkKLVdTT0NLTElCID0gCi1YTUtNRiA9IAotWF9DRkxBR1MgPSAKLVhfRVhUUkFfTElCUyA9IAotWF9MSUJTID0gCi1YX1BSRV9MSUJTID0gIC1sU00gLWxJQ0UKLWFic19idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFic19zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hYnNfdG9wX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hY19jdF9DQyA9IGdjYwotYWNfY3RfQ1hYID0gZysrCi1hY19jdF9GNzcgPSAKLWFtX19pbmNsdWRlID0gaW5jbHVkZQotYW1fX2xlYWRpbmdfZG90ID0gLgotYW1fX3F1b3RlID0gCi1hbV9fdGFyID0gJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciIKLWFtX191bnRhciA9ICQke1RBUi10YXJ9IHhmIC0KLWJpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2JpbgotYnVpbGQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX2FsaWFzID0gCi1idWlsZF9jcHUgPSB4ODZfNjQKLWJ1aWxkX29zID0gbGludXgtZ251Ci1idWlsZF92ZW5kb3IgPSB1bmtub3duCi1idWlsZGRpciA9IC4KLWRhdGFkaXIgPSAke2RhdGFyb290ZGlyfQotZGF0YXJvb3RkaXIgPSAke3ByZWZpeH0vc2hhcmUKLWRvY2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0KLWR2aWRpciA9ICR7ZG9jZGlyfQotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWhvc3QgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfYWxpYXMgPSAKLWhvc3RfY3B1ID0geDg2XzY0Ci1ob3N0X29zID0gbGludXgtZ251Ci1ob3N0X3ZlbmRvciA9IHVua25vd24KLWh0bWxkaXIgPSAke2RvY2Rpcn0KLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZS9yZmIKLWluZm9kaXIgPSAke2RhdGFyb290ZGlyfS9pbmZvCi1pbnN0YWxsX3NoID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9pbnN0YWxsLXNoCi1saWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLWxpYmV4ZWNkaXIgPSAke2V4ZWNfcHJlZml4fS9saWJleGVjCi1sb2NhbGVkaXIgPSAke2RhdGFyb290ZGlyfS9sb2NhbGUKLWxvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCi1tYW5kaXIgPSAke2RhdGFyb290ZGlyfS9tYW4KLW1rZGlyX3AgPSAvYmluL21rZGlyIC1wCi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi1wZGZkaXIgPSAke2RvY2Rpcn0KLXByZWZpeCA9IC91c3IvbG9jYWwKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBzLHgseCwKLXBzZGlyID0gJHtkb2NkaXJ9Ci1zYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2Jpbgotc2hhcmVkc3RhdGVkaXIgPSAke3ByZWZpeH0vY29tCi1zcmNkaXIgPSAuCi1zeXNjb25mZGlyID0gJHtwcmVmaXh9L2V0YwotdGFyZ2V0X2FsaWFzID0gCi10b3BfYnVpbGRfcHJlZml4ID0gCi10b3BfYnVpbGRkaXIgPSAuCi10b3Bfc3JjZGlyID0gLgotd2l0aF9mZm1wZWcgPSAKLSNYMTFWTkMgPSB4MTF2bmMKLVNVQkRJUlMgPSBsaWJ2bmNzZXJ2ZXIgZXhhbXBsZXMgbGlidm5jY2xpZW50IHZuY3Rlcm0gd2ViY2xpZW50cyBjbGllbnRfZXhhbXBsZXMgdGVzdCAkKFgxMVZOQykKLURJU1RfU1VCRElSUyA9IGxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgdm5jdGVybSB3ZWJjbGllbnRzIGNsaWVudF9leGFtcGxlcyB0ZXN0Ci1FWFRSQV9ESVNUID0gQ01ha2VMaXN0cy50eHQgcmZiL3JmYmludC5oLmNtYWtlIHJmYi9yZmJjb25maWcuaC5jbWFrZQotYmluX1NDUklQVFMgPSBsaWJ2bmNzZXJ2ZXItY29uZmlnCi1wa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCi1wa2djb25maWdfREFUQSA9IGxpYnZuY3NlcnZlci5wYyBsaWJ2bmNjbGllbnQucGMKLSNpbmNsdWRlX0hFQURFUlM9cmZiLmggcmZiY29uZmlnLmggcmZiaW50LmggcmZicHJvdG8uaCBrZXlzeW0uaCByZmJyZWdpb24uaAotaW5jbHVkZV9IRUFERVJTID0gcmZiL3JmYi5oIHJmYi9yZmJjb25maWcuaCByZmIvcmZiaW50LmggcmZiL3JmYnByb3RvLmggXAotCXJmYi9rZXlzeW0uaCByZmIvcmZicmVnaW9uLmggcmZiL3JmYmNsaWVudC5oCi0KLWFsbDogcmZiY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLS5TVUZGSVhFUzoKLWFtLS1yZWZyZXNoOiBNYWtlZmlsZQotCUA6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUnOyBcCi0JICAgICAgJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBcCi0JCSYmIGV4aXQgMDsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAotCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLQotcmZiY29uZmlnLmg6IHN0YW1wLWgxCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBybSAtZiBzdGFtcC1oMTsgZWxzZSA6OyBmaQotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IGVsc2UgOjsgZmkKLQotc3RhbXAtaDE6ICQoc3JjZGlyKS9yZmJjb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBybSAtZiBzdGFtcC1oMQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgcmZiY29uZmlnLmgKLSQoc3JjZGlyKS9yZmJjb25maWcuaC5pbjogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKLQkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKLQlybSAtZiBzdGFtcC1oMQotCXRvdWNoICRACi0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIHJmYmNvbmZpZy5oIHN0YW1wLWgxCi1saWJ2bmNzZXJ2ZXIucGM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9saWJ2bmNzZXJ2ZXIucGMuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi1saWJ2bmNjbGllbnQucGM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9saWJ2bmNjbGllbnQucGMuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi1saWJ2bmNzZXJ2ZXItY29uZmlnOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvbGlidm5jc2VydmVyLWNvbmZpZy5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLUxpYlZOQ1NlcnZlci5zcGVjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvTGliVk5DU2VydmVyLnNwZWMuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi1pbnN0YWxsLWJpblNDUklQVFM6ICQoYmluX1NDUklQVFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1NDUklQVFMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpciknIjsgXAotCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIgfHwgZXhpdCAxOyBcCi0JZmk7IFwKLQlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKLQlkb25lIHwgXAotCXNlZCAtZSAncDtzLC4qLywsO24nIFwKLQkgICAgLWUgJ2g7c3wuKnwufCcgXAotCSAgICAtZSAncDt4O3MsLiovLCw7JCh0cmFuc2Zvcm0pJyB8IHNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAotCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDE7IH0gXAotCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAotCSAgICBpZiAoJCQyID09ICQkNCkgeyBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKLQkgICAgICBpZiAoKytuW2RdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgeyBcCi0JCXByaW50ICJmIiwgZCwgZmlsZXNbZF07IG5bZF0gPSAwOyBmaWxlc1tkXSA9ICIiIH0gfSBcCi0JICAgIGVsc2UgeyBwcmludCAiZiIsIGQgIi8iICQkNCwgJCQxIH0gfSBcCi0JICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCi0Jd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAotCSAgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCi0JICAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKLQkgICAgICAgZWNobyAiICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCi0JICAgICAgICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgIiQoREVTVERJUikkKGJpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKLQkgICAgIH0gXAotCTsgZG9uZQotCi11bmluc3RhbGwtYmluU0NSSVBUUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGJpbl9TQ1JJUFRTKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgZXhpdCAwOyBcCi0JZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKLQkgICAgICAgc2VkIC1lICdzLC4qLywsOyQodHJhbnNmb3JtKSdgOyBcCi0JZGlyPSckKERFU1RESVIpJChiaW5kaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgbGlidG9vbCBjb25maWcubHQKLWluc3RhbGwtcGtnY29uZmlnREFUQTogJChwa2djb25maWdfREFUQSkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQlAbGlzdD0nJChwa2djb25maWdfREFUQSknOyB0ZXN0IC1uICIkKHBrZ2NvbmZpZ2RpcikiIHx8IGxpc3Q9OyBcCi0JaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQocGtnY29uZmlnZGlyKSciOyBcCi0JICAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiB8fCBleGl0IDE7IFwKLQlmaTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGVjaG8gIiQkZCQkcCI7IFwKLQlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKLQl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKHBrZ2NvbmZpZ2RpciknIjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi11bmluc3RhbGwtcGtnY29uZmlnREFUQToKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAotCWRpcj0nJChERVNURElSKSQocGtnY29uZmlnZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKLWluc3RhbGwtaW5jbHVkZUhFQURFUlM6ICQoaW5jbHVkZV9IRUFERVJTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKGluY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIiB8fCBleGl0IDE7IFwKLQlmaTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGVjaG8gIiQkZCQkcCI7IFwKLQlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKLQl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAnJChERVNURElSKSQoaW5jbHVkZWRpciknIjsgXAotCSAgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAiJChERVNURElSKSQoaW5jbHVkZWRpcikiIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi11bmluc3RhbGwtaW5jbHVkZUhFQURFUlM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChpbmNsdWRlZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAotCWRpcj0nJChERVNURElSKSQoaW5jbHVkZWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQljYXNlICIkQCIgaW4gXAotCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAotCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAotCWVzYWM7IFwKLQlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCi0JICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlyZXY9IiQkcmV2IC4iOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCi0JZG9uZQotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgcmZiY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PS47IFwKLQllbHNlIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PTsgXAotCWZpOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCi0JICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIHJmYmNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgcmZiY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgcmZiY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCXRlc3QgLWQgIiQoZGlzdGRpcikiIHx8IG1rZGlyICIkKGRpc3RkaXIpIgotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgJChhbV9fbWFrZV9kcnlydW4pIFwKLQkgICAgICB8fCB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKLQkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAotCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKLQkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKLQkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKLQkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAotCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCi0JCWFtX19za2lwX21vZGVfZml4PTogXAotCSAgICAgICAgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCi0JfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAotCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKLQl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCi1kaXN0LWd6aXA6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LWJ6aXAyOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEJaSVAyPSQke0JaSVAyLS05fSBiemlwMiAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtbHppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsemlwIC1jICQke0xaSVBfT1BULS05fSA+JChkaXN0ZGlyKS50YXIubHoKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1sem1hOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC14ejogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBYWl9PUFQ9JCR7WFpfT1BULS1lfSB4eiAtYyA+JChkaXN0ZGlyKS50YXIueHoKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC10YXJaOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3Qtc2hhcjogZGlzdGRpcgotCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtemlwOiBkaXN0ZGlyCi0JLXJtIC1mICQoZGlzdGRpcikuemlwCi0JemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QgZGlzdC1hbGw6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCi0JKi50YXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ6aXAyIC1kYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIubHptYSopIFwKLQkgIGx6bWEgLWRjICQoZGlzdGRpcikudGFyLmx6bWEgfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIubHoqKSBcCi0JICBsemlwIC1kYyAkKGRpc3RkaXIpLnRhci5seiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci54eiopIFwKLQkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5aKikgXAotCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAotCSouc2hhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCB1K3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JdGVzdCAtZCAkKGRpc3RkaXIpL19idWlsZCB8fCBleGl0IDA7IFwKLQlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKLQkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAotCSAgJiYgYW1fX2N3ZD1gcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJChkaXN0ZGlyKS9fYnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAkKEFNX0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrIFwKLQkgICYmIGNkICIkJGFtX19jd2QiIFwKLQkgIHx8IGV4aXQgMQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCi0JICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCi0JICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKLWRpc3R1bmluc3RhbGxjaGVjazoKLQlAdGVzdCAtbiAnJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgfHwgeyBcCi0JICBlY2hvICdFUlJPUjogdHJ5aW5nIHRvIHJ1biAkQCB3aXRoIGFuIGVtcHR5JyBcCi0JICAgICAgICckJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgPiYyOyBcCi0JICBleGl0IDE7IFwKLQl9OyBcCi0JJChhbV9fY2QpICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKLQkgIGVjaG8gJ0VSUk9SOiBjYW5ub3QgY2hkaXIgaW50byAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKLQkgIGV4aXQgMTsgXAotCX07IFwKLQl0ZXN0IGAkKGFtX19kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKLQkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKLQkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKLQkgICAgICAgIGZpIDsgXAotCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgIGV4aXQgMTsgfSA+JjIKLWRpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KLQlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKLQkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKLQkgIGV4aXQgMSA7IFwKLQlmaQotCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAotCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCi0JICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgZXhpdCAxOyB9ID4mMgotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFNDUklQVFMpICQoREFUQSkgJChIRUFERVJTKSByZmJjb25maWcuaAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JZm9yIGRpciBpbiAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSI7IGRvIFwKLQkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKLQlkb25lCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLXJlY3Vyc2l2ZQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtcmVjdXJzaXZlCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tcmVjdXJzaXZlCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblNDUklQVFMKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLXJlY3Vyc2l2ZQotCi1wZGYtYW06Ci0KLXBzOiBwcy1yZWN1cnNpdmUKLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblNDUklQVFMgdW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTIFwKLQl1bmluc3RhbGwtcGtnY29uZmlnREFUQQotCi0uTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgYWxsIFwKLQljdGFncy1yZWN1cnNpdmUgaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCi0KLS5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAotCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCi0JY2xlYW4tbGlidG9vbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdCBkaXN0LWFsbCBkaXN0LWJ6aXAyIFwKLQlkaXN0LWd6aXAgZGlzdC1semlwIGRpc3QtbHptYSBkaXN0LXNoYXIgZGlzdC10YXJaIGRpc3QteHogXAotCWRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCi0JZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBcCi0JZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCi0JaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtYmluU0NSSVBUUyBpbnN0YWxsLWRhdGEgXAotCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAotCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKLQlpbnN0YWxsLWluY2x1ZGVIRUFERVJTIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAotCWluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnY29uZmlnREFUQSBcCi0JaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKLQlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKLQl1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5TQ1JJUFRTIFwKLQl1bmluc3RhbGwtaW5jbHVkZUhFQURFUlMgdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEKLQotCi0kKFBBQ0tBR0UpLSQoVkVSU0lPTikudGFyLmd6OiBkaXN0Ci0KLSMgUnVsZSB0byBidWlsZCBSUE0gZGlzdHJpYnV0aW9uIHBhY2thZ2UKLSNycG06ICQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3ogJChQQUNLQUdFKS5zcGVjCi0jCWNwICQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3ogTk9ULUZPVU5ECi0jCXJwbWJ1aWxkIC1iYSAkKFBBQ0tBR0UpLnNwZWMKLQotdDoKLQkkKE1BS0UpIC1DIHRlc3QgdGVzdAotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCmluZGV4IGUyNDRmZTguLjVjMmE5NGQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmFtCisrKyBiL01ha2VmaWxlLmFtCkBAIC0xLDkgKzEsNyBAQAotaWYgV0lUSF9YMTFWTkMKLVgxMVZOQz14MTF2bmMKLWVuZGlmCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAogCi1TVUJESVJTPWxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgdm5jdGVybSB3ZWJjbGllbnRzIGNsaWVudF9leGFtcGxlcyB0ZXN0ICQoWDExVk5DKQotRElTVF9TVUJESVJTPWxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgdm5jdGVybSB3ZWJjbGllbnRzIGNsaWVudF9leGFtcGxlcyB0ZXN0CitTVUJESVJTPWxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgd2ViY2xpZW50cyBjbGllbnRfZXhhbXBsZXMgdGVzdAorRElTVF9TVUJESVJTPWxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgd2ViY2xpZW50cyBjbGllbnRfZXhhbXBsZXMgdGVzdAogRVhUUkFfRElTVCA9IENNYWtlTGlzdHMudHh0IHJmYi9yZmJpbnQuaC5jbWFrZSByZmIvcmZiY29uZmlnLmguY21ha2UKIAogYmluX1NDUklQVFMgPSBsaWJ2bmNzZXJ2ZXItY29uZmlnCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDkxMzU4Li4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTM4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotCi0KLVZQQVRIID0gQHNyY2RpckAKLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1zdWJkaXIgPSAuCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChpbmNsdWRlX0hFQURFUlMpIFwKLQkkKHNyY2RpcikvTGliVk5DU2VydmVyLnNwZWMuaW4gJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2xpYnZuY2NsaWVudC5wYy5pbiBcCi0JJChzcmNkaXIpL2xpYnZuY3NlcnZlci1jb25maWcuaW4gJChzcmNkaXIpL2xpYnZuY3NlcnZlci5wYy5pbiBcCi0JJChzcmNkaXIpL3JmYmNvbmZpZy5oLmluICQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgXAotCUNPUFlJTkcgQ2hhbmdlTG9nIElOU1RBTEwgTkVXUyBUT0RPIGNvbXBpbGUgY29uZmlnLmd1ZXNzIFwKLQljb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZwotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1hbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IGxpYnZuY3NlcnZlci5wYyBsaWJ2bmNjbGllbnQucGMgXAotCWxpYnZuY3NlcnZlci1jb25maWcgTGliVk5DU2VydmVyLnNwZWMKLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1hbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKLWFtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCi0gICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKLSAgICAqKSBmPSQkcDs7IFwKLSAgZXNhYzsKLWFtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKLWFtX19pbnN0YWxsX21heCA9IDQwCi1hbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAotICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCi1hbV9fbm9iYXNlX3N0cmlwID0gXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKLWFtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKLSAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKLSAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKLSAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAotICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKLSAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKLSAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCi1hbV9fYmFzZV9saXN0ID0gXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCi1hbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCi0gIHRlc3QgLXogIiQkZmlsZXMiIFwKLSAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKLSAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCi0gICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCi0gIH0KLWFtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgXAotCSIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKLVNDUklQVFMgPSAkKGJpbl9TQ1JJUFRTKQotQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfYXRfMCA9IEAKLVNPVVJDRVMgPQotRElTVF9TT1VSQ0VTID0KLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLURBVEEgPSAkKHBrZ2NvbmZpZ19EQVRBKQotSEVBREVSUyA9ICQoaW5jbHVkZV9IRUFERVJTKQotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCi0JJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKLQlkaXN0ZGlyIGRpc3QgZGlzdC1hbGwgZGlzdGNoZWNrCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikiOyB0aGVuIFwKLSAgICBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICYmIHJtIC1yZiAiJChkaXN0ZGlyKSIgXAotICAgICAgfHwgeyBzbGVlcCA1ICYmIHJtIC1yZiAiJChkaXN0ZGlyKSI7IH07IFwKLSAgZWxzZSA6OyBmaQotYW1fX3JlbGF0aXZpemUgPSBcCi0gIGRpcjA9YHB3ZGA7IFwKLSAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCi0gIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCi0gIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCi0gIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAotICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCi0gICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAotICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKLSAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCi0gICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAotICAgICAgZWxzZSBcCi0gICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAotICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCi0gICAgICBmaTsgXAotICAgIGZpOyBcCi0gICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gIGRvbmU7IFwKLSAgcmVsZGlyPSIkJGRpcjIiCi1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1hbV9fZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9ICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgXAotICB8IHNlZCAnc3xeXC4vfCQocHJlZml4KS98JyB8IGdyZXAgLXYgJyQoaW5mb2RpcikvZGlyJCQnCi1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUvcmZiCi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUBXSVRIX1gxMVZOQ19UUlVFQFgxMVZOQyA9IHgxMXZuYwotU1VCRElSUyA9IGxpYnZuY3NlcnZlciBleGFtcGxlcyBsaWJ2bmNjbGllbnQgdm5jdGVybSB3ZWJjbGllbnRzIGNsaWVudF9leGFtcGxlcyB0ZXN0ICQoWDExVk5DKQotRElTVF9TVUJESVJTID0gbGlidm5jc2VydmVyIGV4YW1wbGVzIGxpYnZuY2NsaWVudCB2bmN0ZXJtIHdlYmNsaWVudHMgY2xpZW50X2V4YW1wbGVzIHRlc3QKLUVYVFJBX0RJU1QgPSBDTWFrZUxpc3RzLnR4dCByZmIvcmZiaW50LmguY21ha2UgcmZiL3JmYmNvbmZpZy5oLmNtYWtlCi1iaW5fU0NSSVBUUyA9IGxpYnZuY3NlcnZlci1jb25maWcKLXBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKLXBrZ2NvbmZpZ19EQVRBID0gbGlidm5jc2VydmVyLnBjIGxpYnZuY2NsaWVudC5wYwotI2luY2x1ZGVfSEVBREVSUz1yZmIuaCByZmJjb25maWcuaCByZmJpbnQuaCByZmJwcm90by5oIGtleXN5bS5oIHJmYnJlZ2lvbi5oCi1pbmNsdWRlX0hFQURFUlMgPSByZmIvcmZiLmggcmZiL3JmYmNvbmZpZy5oIHJmYi9yZmJpbnQuaCByZmIvcmZicHJvdG8uaCBcCi0JcmZiL2tleXN5bS5oIHJmYi9yZmJyZWdpb24uaCByZmIvcmZiY2xpZW50LmgKLQotYWxsOiByZmJjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotLlNVRkZJWEVTOgotYW0tLXJlZnJlc2g6IE1ha2VmaWxlCi0JQDoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSc7IFwKLQkgICAgICAkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IFwKLQkJJiYgZXhpdCAwOyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBNYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1yZmJjb25maWcuaDogc3RhbXAtaDEKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIHJtIC1mIHN0YW1wLWgxOyBlbHNlIDo7IGZpCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL3JmYmNvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyByZmJjb25maWcuaAotJChzcmNkaXIpL3JmYmNvbmZpZy5oLmluOiAgJChhbV9fY29uZmlndXJlX2RlcHMpIAotCSgkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpKQotCXJtIC1mIHN0YW1wLWgxCi0JdG91Y2ggJEAKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgcmZiY29uZmlnLmggc3RhbXAtaDEKLWxpYnZuY3NlcnZlci5wYzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2xpYnZuY3NlcnZlci5wYy5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLWxpYnZuY2NsaWVudC5wYzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2xpYnZuY2NsaWVudC5wYy5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLWxpYnZuY3NlcnZlci1jb25maWc6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9saWJ2bmNzZXJ2ZXItY29uZmlnLmluCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAotTGliVk5DU2VydmVyLnNwZWM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9MaWJWTkNTZXJ2ZXIuc3BlYy5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLWluc3RhbGwtYmluU0NSSVBUUzogJChiaW5fU0NSSVBUUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGxpc3Q9OyBcCi0JaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoYmluZGlyKSciOyBcCi0JICAkKE1LRElSX1ApICIkKERFU1RESVIpJChiaW5kaXIpIiB8fCBleGl0IDE7IFwKLQlmaTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGlmIHRlc3QgLWYgIiQkZCQkcCI7IHRoZW4gZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAotCWRvbmUgfCBcCi0Jc2VkIC1lICdwO3MsLiovLCw7bicgXAotCSAgICAtZSAnaDtzfC4qfC58JyBcCi0JICAgIC1lICdwO3g7cywuKi8sLDskKHRyYW5zZm9ybSknIHwgc2VkICdOO047TjtzLFxuLCAsZycgfCBcCi0JJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMTsgfSBcCi0JICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCi0JICAgIGlmICgkJDIgPT0gJCQ0KSB7IGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAotCSAgICAgIGlmICgrK25bZF0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSB7IFwKLQkJcHJpbnQgImYiLCBkLCBmaWxlc1tkXTsgbltkXSA9IDA7IGZpbGVzW2RdID0gIiIgfSB9IFwKLQkgICAgZWxzZSB7IHByaW50ICJmIiwgZCAiLyIgJCQ0LCAkJDEgfSB9IFwKLQkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKLQl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCi0JICAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKLQkgICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAotCSAgICAgICBlY2hvICIgJChJTlNUQUxMX1NDUklQVCkgJCRmaWxlcyAnJChERVNURElSKSQoYmluZGlyKSQkZGlyJyI7IFwKLQkgICAgICAgJChJTlNUQUxMX1NDUklQVCkgJCRmaWxlcyAiJChERVNURElSKSQoYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAotCSAgICAgfSBcCi0JOyBkb25lCi0KLXVuaW5zdGFsbC1iaW5TQ1JJUFRTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1NDUklQVFMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBleGl0IDA7IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAotCSAgICAgICBzZWQgLWUgJ3MsLiovLCw7JCh0cmFuc2Zvcm0pJ2A7IFwKLQlkaXI9JyQoREVTVERJUikkKGJpbmRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCi0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdAotaW5zdGFsbC1wa2djb25maWdEQVRBOiAkKHBrZ2NvbmZpZ19EQVRBKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKLQlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgXAotCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQocGtnY29uZmlnZGlyKSciOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgfHwgZXhpdCAkJD87IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1wa2djb25maWdEQVRBOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQocGtnY29uZmlnX0RBVEEpJzsgdGVzdCAtbiAiJChwa2djb25maWdkaXIpIiB8fCBsaXN0PTsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCi0JZGlyPSckKERFU1RESVIpJChwa2djb25maWdkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQotaW5zdGFsbC1pbmNsdWRlSEVBREVSUzogJChpbmNsdWRlX0hFQURFUlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCi0JaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoaW5jbHVkZWRpciknIjsgXAotCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZWRpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgXAotCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChpbmNsdWRlZGlyKSciOyBcCi0JICAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIgfHwgZXhpdCAkJD87IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGluY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCi0JZGlyPSckKERFU1RESVIpJChpbmNsdWRlZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLSQoUkVDVVJTSVZFX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLWN0YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKLQlkb25lCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSByZmJjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgcmZiY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSByZmJjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSByZmJjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JdGVzdCAtZCAiJChkaXN0ZGlyKSIgfHwgbWtkaXIgIiQoZGlzdGRpcikiCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICAkKGFtX19tYWtlX2RyeXJ1bikgXAotCSAgICAgIHx8IHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAotCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCi0JICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAotCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAotCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkJYW1fX3NraXBfbW9kZV9maXg9OiBcCi0JICAgICAgICBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQktdGVzdCAtbiAiJChhbV9fc2tpcF9tb2RlX2ZpeCkiIFwKLQl8fCBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTc1NSBcCi0JCS1leGVjIGNobW9kIHUrcnd4LGdvK3J4IHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAotCXx8IGNobW9kIC1SIGErciAiJChkaXN0ZGlyKSIKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgQlpJUDI9JCR7QlpJUDItLTl9IGJ6aXAyIC1jID4kKGRpc3RkaXIpLnRhci5iejIKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1semlwOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6aXAgLWMgJCR7TFpJUF9PUFQtLTl9ID4kKGRpc3RkaXIpLnRhci5segotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LWx6bWE6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHptYSAtOSAtYyA+JChkaXN0ZGlyKS50YXIubHptYQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXh6OiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IFhaX09QVD0kJHtYWl9PUFQtLWV9IHh6IC1jID4kKGRpc3RkaXIpLnRhci54egotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIuYnoyKikgXAotCSAgYnppcDIgLWRjICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5sem1hKikgXAotCSAgbHptYSAtZGMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5seiopIFwKLQkgIGx6aXAgLWRjICQoZGlzdGRpcikudGFyLmx6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLnh6KikgXAotCSAgeHogLWRjICQoZGlzdGRpcikudGFyLnh6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1kYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCi0JKi56aXAqKSBcCi0JICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKLQllc2FjCi0JY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIHUrdyAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKLQlta2RpciAkKGRpc3RkaXIpL19pbnN0Ci0JY2htb2QgYS13ICQoZGlzdGRpcikKLQl0ZXN0IC1kICQoZGlzdGRpcikvX2J1aWxkIHx8IGV4aXQgMDsgXAotCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAotCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCi0JICAmJiBhbV9fY3dkPWBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKGRpc3RkaXIpL19idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICQoQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAotCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCi0JICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAmJiAoeyBcCi0JICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKLQkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAotCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAotCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAotCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAotCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAotCSAgfHwgZXhpdCAxCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUB0ZXN0IC1uICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKLQkgIGVjaG8gJ0VSUk9SOiB0cnlpbmcgdG8gcnVuICRAIHdpdGggYW4gZW1wdHknIFwKLQkgICAgICAgJyQkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKLQkgIGV4aXQgMTsgXAotCX07IFwKLQkkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIHx8IHsgXAotCSAgZWNobyAnRVJST1I6IGNhbm5vdCBjaGRpciBpbnRvICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknID4mMjsgXAotCSAgZXhpdCAxOyBcCi0JfTsgXAotCXRlc3QgYCQoYW1fX2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoU0NSSVBUUykgJChEQVRBKSAkKEhFQURFUlMpIHJmYmNvbmZpZy5oCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1zdHJpcDoKLQlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICAgaW5zdGFsbDsgXAotCWVsc2UgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCi0JZmkKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCi0JZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktcmVjdXJzaXZlCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1yZWN1cnNpdmUKLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1yZWN1cnNpdmUKLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWluY2x1ZGVIRUFERVJTIGluc3RhbGwtcGtnY29uZmlnREFUQQotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCi0KLWluc3RhbGwtZHZpLWFtOgotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluU0NSSVBUUwotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtcmVjdXJzaXZlCi0KLXBkZi1hbToKLQotcHM6IHBzLXJlY3Vyc2l2ZQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluU0NSSVBUUyB1bmluc3RhbGwtaW5jbHVkZUhFQURFUlMgXAotCXVuaW5zdGFsbC1wa2djb25maWdEQVRBCi0KLS5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBhbGwgXAotCWN0YWdzLXJlY3Vyc2l2ZSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKLQljbGVhbi1saWJ0b29sIGN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgXAotCWRpc3QtZ3ppcCBkaXN0LWx6aXAgZGlzdC1sem1hIGRpc3Qtc2hhciBkaXN0LXRhclogZGlzdC14eiBcCi0JZGlzdC16aXAgZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIFwKLQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIFwKLQlkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1iaW5TQ1JJUFRTIGluc3RhbGwtZGF0YSBcCi0JaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCi0JaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAotCWluc3RhbGwtaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCi0JaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wa2djb25maWdEQVRBIFwKLQlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAotCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAotCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblNDUklQVFMgXAotCXVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUyB1bmluc3RhbGwtcGtnY29uZmlnREFUQQotCi0KLSQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3o6IGRpc3QKLQotIyBSdWxlIHRvIGJ1aWxkIFJQTSBkaXN0cmlidXRpb24gcGFja2FnZQotQEhBVkVfUlBNX1RSVUVAcnBtOiAkKFBBQ0tBR0UpLSQoVkVSU0lPTikudGFyLmd6ICQoUEFDS0FHRSkuc3BlYwotQEhBVkVfUlBNX1RSVUVACWNwICQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3ogQFJQTVNPVVJDRURJUkAKLUBIQVZFX1JQTV9UUlVFQAlycG1idWlsZCAtYmEgJChQQUNLQUdFKS5zcGVjCi0KLXQ6Ci0JJChNQUtFKSAtQyB0ZXN0IHRlc3QKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKaW5kZXggYTVkMGE4OS4uMjE4ZWNkYiAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBAIC0xLDMgKzEsMjcgQEAKKzAuOS4xMAorICAgLSBPdmVyYWxsIGNoYW5nZXM6CisgICAgICogTW92ZWQgdGhlIHdob2xlIHByb2plY3QgZnJvbSBzb3VyY2Vmb3JnZSB0byBodHRwczovL2xpYnZuYy5naXRodWIuaW8vLgorICAgICAqIENsZWFuZWQgb3V0IHRoZSBhdXRvdG9vbHMgYnVpbGQgc3lzdGVtIHdoaWNoIG5vdyB1c2VzIGF1dG9yZWNvbmYuCisgICAgICogVXBkYXRlZCBub1ZOQyBIVE1MNSBjbGllbnQgdG8gbGF0ZXN0IHZlcnNpb24uCisgICAgICogU3BsaXQgb3V0IHgxMXZuYyBzb3VyY2VzIGludG8gc2VwYXJhdGUgcmVwb3NpdG9yeSBhdAorICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9MaWJWTkMveDExdm5jCisgICAgICogU3BsaXQgb3V0IHZuY3Rlcm0gc291cmNlcyBpbnRvIHNlcGFyYXRlIHJlcG9zaXRvcnkgYXQKKyAgICAgICBodHRwczovL2dpdGh1Yi5jb20vTGliVk5DL3ZuY3Rlcm0KKyAgICAgKiBTcGxpdCBvdXQgVmlzdWFsTmFDcm8gc291cmNlcyBpbnRvIHNlcGFyYXRlIHJlcG9zaXRvcnkgYXQKKyAgICAgICBodHRwczovL2dpdGh1Yi5jb20vTGliVk5DL1Zpc3VhbE5hQ3JvCisgICAgICogTWVyZ2VkIERlYmlhbiBwYXRjaGVzLgorCisgICAtIExpYlZOQ1NlcnZlci9MaWJWTkNDbGllbnQ6CisgICAgICogRml4ZWQgc29tZSBzZWN1cml0eS1yZWxhdGVkIGJ1ZmZlciBvdmVyZmxvdyBjYXNlcy4KKyAgICAgKiBBZGRlZCBjb21wYXRpYmlsaXR5IGhlYWRlcnMgdG8gbWFrZSBMaWJWTkNTZXJ2ZXIvTGliVk5DQ2xpZW50IGJ1aWxkIG9uIG5hdGl2ZQorICAgICAgIFdpbmRvd3MgOC4KKyAgICAgKiBVcGRhdGUgTFpPIHRvIHZlcnNpb24gMi4wNywgZml4aW5nIENWRS0yMDE0LTQ2MDcuCisKKyAgIC0gTGliVk5DU2VydmVyOgorICAgICAqIE1lcmdlZCBwYXRjaGVzIGZyb20gS0RFL2tyZmIuCisgICAgICogQ2FuIG5vdyBkbyBJUHY2IHdpdGhvdXQgSVB2NC4KKyAgICAgKiBGaXhlZCBhIHVzZS1hZnRlci1mcmVlIGlzc3VlIGluIHNjYWxlLmMuCisKIDAuOS45CiAgICAtIE92ZXJhbGwgY2hhbmdlczoKICAgICAgKiBBZGRlZCBub1ZOQyBIVE1MNSBWTkMgdmlld2VyIChodHRwOi8va2FuYWthLmdpdGh1Yi5jb20vbm9WTkMvKSBjb25uZWN0IHBvc3NpYmlsaXR5CmRpZmYgLS1naXQgYS9UT0RPIGIvVE9ETwppbmRleCBlOGY3NzYzLi4zMTM5ZjM1IDEwMDY0NAotLS0gYS9UT0RPCisrKyBiL1RPRE8KQEAgLTEsNSArMSw4IEBACiBpbW1lZGlhdGU6CiAtLS0tLS0tLS0tCistIEFkZCBzb3VyY2VzIGZvciB0aGUgamF2YSBzdHVmZi4KKy0gSW1wbGVtZW50IGVuY3J5cHRpb24gaW4gbGlidm5jc2VydmVyLgorLSBBZGQgYSBsaWJ2bmNjbGllbnQtY29uZmlnIHNjcmlwdC4KIAogbWFrZSBTREx2bmN2aWV3ZXIgbW9yZSB2ZXJzYXRpbGUKIAktIHRlc3QgZm9yIG1pc3Npbmcga2V5cyAoZXNwZWNpYWxseSAiW117fSIgd2l0aCAuL2V4YW1wbGVzL21hYyksCmRpZmYgLS1naXQgYS9WaXN1YWxOYUNyby8uZ2l0aWdub3JlIGIvVmlzdWFsTmFDcm8vLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDdkMy4uMDAwMDAwMAotLS0gYS9WaXN1YWxOYUNyby8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vQ09QWUlORwotL0lOU1RBTEwKLS9uYWNyby5wbQotL25hY3JvLnNvCi0vbmFjcm9fd3JhcC5jCmRpZmYgLS1naXQgYS9WaXN1YWxOYUNyby9BVVRIT1JTIGIvVmlzdWFsTmFDcm8vQVVUSE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4MTEwMS4uMDAwMDAwMAotLS0gYS9WaXN1YWxOYUNyby9BVVRIT1JTCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1Kb2hhbm5lcyBTY2hpbmRlbGluIDxKb2hhbm5lcy5TY2hpbmRlbGluQGdteC5kZT4KLQpkaWZmIC0tZ2l0IGEvVmlzdWFsTmFDcm8vQ2hhbmdlTG9nIGIvVmlzdWFsTmFDcm8vQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI5ODU4Li4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTIwMDYtMTAtMTA6IEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPgotCSogaW1wbGVtZW50IC0tY29tcGFjdCBhbmQgLS1jb21wYWN0LWRyYWdnaW5nIHRvIHNodXQgdXAgdGhlCi0JICBzY3JpcHQgYWJvdXQgbW91c2UgbW92ZW1lbnRzIG9yIGRyYWdzLgotCSogYWRkICdpJywgJ2MnIGFuZCAncicgbWVudSBrZXlzLgotCi0yMDA2LTA5LTEyOiBKb2hhbm5lcyBTY2hpbmRlbGluIDxKb2hhbm5lcy5TY2hpbmRlbGluQGdteC5kZT4KLQkqIHRoZSByZWZlcmVuY2UgcmVjdGFuZ2xlIGlzIHNlbGVjdGVkIHdpdGggYSBydWJiZXIgYmFuZCwKLQkgIGFuZCBjYW4gYmUgc2hvd24gd2l0aCAnZCcuCi0KLTIwMDYtMDYtMTU6IEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPgotCSogYWRkZWQgdGltaW5nOiB5b3UgY2FuIHJlY29yZCB0aGUgZXZlbnRzIHdpdGggdGhlaXIgdGltZXN0YW1wcyBub3cKLQotMjAwNS0wMS0xMzogSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+Ci0JKiBzdGFydGVkIHRoZSBwcm9qZWN0Ci0KZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL01ha2VmaWxlLmFtIGIvVmlzdWFsTmFDcm8vTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWZlNjcuLjAwMDAwMDAKLS0tIGEvVmlzdWFsTmFDcm8vTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1JTlRFUkZBQ0U9bmFjcm8uaAotU1JDUz1uYWNyby5jCi1PQkpTPW5hY3JvLm8KLUlTUkNTPW5hY3JvX3dyYXAuYwotSU9CSlM9bmFjcm9fd3JhcC5vCi1UQVJHRVQ9bmFjcm8KLUxJQlM9IEBMSUJWTkNTRVJWRVJMSUJTQAotCi1uYWNyb19DRkxBR1M9IEBMSUJWTkNTRVJWRVJDRkxBR1NACi0KLVNXSUdPUFQ9Ci0KLUVYVFJBX0RJU1Q9YXV0b2dlbi5zaCAkKElOVEVSRkFDRSkgJChTUkNTKSAkKElTUkNTKSBuYWNyby5wbSByZWNvcmRlci5wbAotCi1hbGw6ICQoTElCUFJFRklYKSQoVEFSR0VUKSQoU08pCi0KLSMgdGhlIGZvbGxvd2luZyBpcyBib3Jyb3dlZCBmcm9tIFNXSUcKLQotU1dJRz0gQFNXSUdACi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMgICAgICAgICAgICAgICAgICAgICAgIFBFUkwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBZb3UgbmVlZCB0byBzZXQgdGhpcyB2YXJpYWJsZSB0byB0aGUgUGVybDUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCi0jIGZpbGVzICJwZXJsLmgiLCAiRVhURVJOLmgiIGFuZCAiWFNVQi5oIi4gICBXaXRoIFBlcmw1LjAwMywgaXQncwotIyB1c3VhbGx5IHNvbWV0aGluZyBsaWtlIC91c3IvbG9jYWwvbGliL3Blcmw1L2FyY2gtb3NuYW1lLzUuMDAzL0NPUkUuCi0KLVBFUkw1X0lOQ0xVREU9IEBQRVJMNUVYVEAKLQotIyBFeHRyYSBQZXJsIHNwZWNpZmljIGR5bmFtaWMgbGlua2luZyBvcHRpb25zCi1QRVJMNV9ETE5LICAgPSBAUEVSTDVEWU5BTUlDTElOS0lOR0AKLVBFUkw1X0NDRkxBR1MgPSBAUEVSTDVDQ0ZMQUdTQAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQnVpbGQgYSBQZXJsNSBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGUgKEMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJChJU1JDUyk6ICQoSU5URVJGQUNFKQotCUB0ZXN0IC1uICIkKFNXSUcpIiB8fCAoZWNobyAiTmVlZCBTV0lHIiAmJiBleGl0IDEpCi0JJChTV0lHKSAtcGVybDUgJChTV0lHT1BUKSAkKElOVEVSRkFDRSkKLQotJChPQkpTKTogJChTUkNTKSAkKElOVEVSRkFDRSkKLQkkKENDKSAtYyAtRGJvb2w9Y2hhciAkKENDU0hBUkVEKSAkKENGTEFHUykgLW8gJEAgJDwgJChMSUJWTkNTRVJWRVJDRkxBR1MpICQoSU5DTFVERVMpIC1JJChQRVJMNV9JTkNMVURFKQotCi0kKElPQkpTKTogJChJU1JDUykgJChJTlRFUkZBQ0UpCi0JJChDQykgLWMgLURib29sPWNoYXIgJChDQ1NIQVJFRCkgJChDRkxBR1MpIC1vICRAICQ8ICQoSU5DTFVERVMpICQoUEVSTDVfQ0NGTEFHUykgLUkkKFBFUkw1X0lOQ0xVREUpCi0KLSQoTElCUFJFRklYKSQoVEFSR0VUKSQoU08pOiAkKE9CSlMpICQoSU9CSlMpCi0JJChMRFNIQVJFRCkgJChPQkpTKSAkKElPQkpTKSAkKFBFUkw1X0RMTkspICQoTElCUykgLW8gJChMSUJQUkVGSVgpJChUQVJHRVQpJChTTykKLQpkaWZmIC0tZ2l0IGEvVmlzdWFsTmFDcm8vTkVXUyBiL1Zpc3VhbE5hQ3JvL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDdkMzMuLjAwMDAwMDAKLS0tIGEvVmlzdWFsTmFDcm8vTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVdpdGggLS10aW1pbmcsIHlvdSBjYW4gYWN0dWFsbHkgcmVjb3JkIGFjdGlvbiBzY3JpcHRzIHdoaWNoIGFyZSBtZWFuaW5nZnVsLi4uCi1FYXJsaWVyLCB0aGUgZXZlbnRzIGp1c3QgZ290IGdhcmJsZWQsIGJlY2F1c2UgdGhlIEdVSSBjb3VsZCBub3QgcmVhY3QgYXMKLWZhc3QgYXMgdGhlIGV2ZW50cyB3ZXJlIGNodXJuZWQgb3V0LgotCi1DbGlwYm9hcmQgaXMgc3VwcG9ydGVkICh0aGFua3MgdG8gVXdlKS4KLQotS2V5cyBhcmUgcmVjb3JkZWQgYnkgdGhlaXIgc3ltYm9scyB3aXRoIHRoZSAtLXN5bWJvbGljIHN3aXRjaCwgcHJvdmlkZWQgeW91Ci1oYXZlIHRoZSBYMTE6OktleXN5bXMgbW9kdWxlLgotCi1BZnRlciBwcmVzc2luZyBDb250cm9sIHR3aWNlLCB5b3UgY2FuIHNob3cgdGhlIGxhc3QgcmVmZXJlbmNlIGltYWdlIHdpdGggJ2QnLgpkaWZmIC0tZ2l0IGEvVmlzdWFsTmFDcm8vUkVBRE1FIGIvVmlzdWFsTmFDcm8vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzkyYjMyLi4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLVRoaXMgaXMgVmlzdWFsTmFDcm8uCi0KLURJU0NMQUlNRVI6IHJlY29yZGVyLnBsIGlzIG5vdCB5ZXQgZnVuY3Rpb25hbC4KLQotV2hhdCBkb2VzIGl0PwotCi0JSXQgaXMgYSBQZXJsIG1vZHVsZSBtZWFudCB0byByZW1vdGUgY29udHJvbCBhIFZOQyBzZXJ2ZXIuCi0JCi0JSXQgaW5jbHVkZXMgYSByZWNvcmRlciAod3JpdHRlbiBpbiBQZXJsKSB0byBtYWtlIGl0IGVhc3kgdG8KLQlyZWNvcmQgYSBtYWNybywgd2hpY2ggaXMganVzdCBhIFBlcmwgc2NyaXB0LCBhbmQgd2hpY2ggeW91IGNhbgotCW1vZGlmeSB0byB5b3VyIGhlYXJ0J3MgY29udGVudC4KLQkKLQlUaGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZSwgaG93ZXZlciwgaXMgdGhhdCB5b3UgY2FuIG1hcmsgYQotCXJlY3RhbmdsZSB3aGljaCB0aGUgUGVybCBzY3JpcHQgd2lsbCB0cnkgdG8gZmluZCBhZ2FpbiB3aGVuIHlvdQotCXJ1biBpdC4gVGh1cyB3aGVuIHlvdSBwbGF5IGEgZ2FtZSBhbmQgd2FudCB0byBoaXQgYSBjZXJ0YWluIGJ1dHRvbiwKLQl5b3UganVzdCBoaXQgdGhlIEN0cmwga2V5IHR3aWNlLCBtYXJrIHRoZSBidXR0b24sIGFuZCBmcm9tIHRoZW4gb24sCi0JYWxsIG1vdXNlIG1vdmVtZW50cyB3aWxsIGJlIHJlcGVhdGVkIHJlbGF0aXZlIHRvIHRoYXQgYnV0dG9uLCBldmVuCi0JaWYgdGhlIGJ1dHRvbiBpcyBzb21ld2hlcmUgZWxzZSB3aGVuIHlvdSBydW4gdGhlIHNjcmlwdCB0aGUgbmV4dAotCXRpbWUuCi0KLQlJZiB5b3Uga25vdyBUY2wgRXhwZWN0LCB5b3Ugd2lsbCByZWNvZ25pemUgdGhpcyBhcHByb2FjaC4gT25seSB0aGlzCi0JdGltZSwgaXQgaXMgbm90IHRleHQsIGJ1dCBhbiBpbWFnZSB3aGljaCBpcyBleHBlY3RlZC4KLQkKLUhvdyBkb2VzIGl0IHdvcms/Ci0KLQlJdCBhY3RzIGFzIGEgVk5DIHByb3h5OiB5b3VyIFBlcmwgc2NyaXB0IHN0YXJ0cyBpdHMgb3duIFZOQyBzZXJ2ZXIuCi0JVGhlIHNjcmlwdCBub3cgY2FuIGludGVyY2VwdCBpbnB1dHMgYW5kIG91dHB1dHMsIGFuZCBhY3QgdXBvbiB0aGVtLgotCUluIG9yZGVyIHRvIHdyaXRlIGEgbWFjcm8sIHN0YXJ0Ci0JCi0JCXJlY29yZGVyLnBsIC0tc2NyaXB0IG15LW1hY3JvLnBsIC0tdGltaW5nIGhvc3Q6cG9ydAotCQotCWNvbm5lY3Qgd2l0aCBhIHZuY3ZpZXdlciBvZiB5b3VyIGNob2ljZSB0byA8aG9zdDI+OjIzLCB3aGVyZSA8aG9zdDI+Ci0JaXMgdGhlIGNvbXB1dGVyCW9uIHdoaWNoIHJlY29yZGVyLnBsIHdhcyBzdGFydGVkIChub3QgbmVjZXNzYXJpbHkgdGhlCi0Jc2FtZSBhcyB0aGUgVk5DIHNlcnZlciEpLiBOb3cgeW91ciBhY3Rpb25zIGFyZSByZWNvcmRlZCBpbnRvCi0JbXlfbWFjcm8ucGwsIGFuZCB0aGUgaW1hZ2VzIHlvdSB3YW50IHRvIGdyZXAgZm9yIHdpbGwgYmUgc2F2ZWQgYXMKLQlteV9tYWNyby0xLnBubSwJbXlfbWFjcm8tMi5wbm0sIC4uLgotCi0JSW4gb3JkZXIgdG8gZmluaXNoIHRoZSBzY3JpcHQsIGhpdCBDdHJsIHR3aWNlIGFuZCBzYXkgInEiLgotCi1XaHkgZGlkIEkgZG8gaXQ/Ci0KLQlCZWNhdXNlIEkgY291bGQgOy0pCi0KLQlObyByZWFsbHksIEkgbmVlZGVkIGEgd2F5IHRvIHdyaXRlIGF1dG9tYXRlZCB0ZXN0cy4gV2hpbGUgdGhlcmUKLQlleGlzdCBhIGxvdCBvZiBPcGVuU291cmNlIHByb2dyYW1zIGZvciB3ZWIgdGVzdGluZywgSSBmb3VuZCBub25lCi0Jb2YgdGhlbSBlYXN5IHRvIHVzZSwgYW5kIGZvciBHVUkgdGVzdGluZyBJIGZvdW5kIHhhdXRvbWF0aW9uLgotCi0JWGF1dG9tYXRpb24gaGFzIHRoaXMgInZpc3VhbCBncmVwIiAob3IgImdyYXBoaWNhbCBleHBlY3QiKSBmZWF0dXJlOgotCWdpdmVuIGFuIGltYWdlIGl0IHRyaWVzIHRvIGZpbmQgaXQgb24gdGhlIGRlc2t0b3AgYW5kIHJldHVybnMgdGhlCi0JY29vcmRpbmF0ZXMuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHJlY29yZCBtYWNyb3MKLQl3aXRoIGl0LCBhbmQgaXQgb25seSB3b3JrcyBvbiBYMTEuCi0KLQlBcyBJIGtub3cgVk5DIHByZXR0eSB3ZWxsLCBhbmQgdGhlcmUgYXJlIFZOQyBzZXJ2ZXJzIGZvciBldmVyeSBPUwotCWFuZCBnYWRnZXQsIEkgdGhvdWdodCBpdCBtaWdodCBiZSBjb29sIHRvIGhhdmUgdGhpcyBmZWF0dXJlIHRvCi0JY29udHJvbCBhIFZOQyBzZXJ2ZXIuCi0KLQlBY3R1YWxseSwgaXQgbWFrZXMgaXQgZXZlbiBlYXNpZXI6IHdpdGggcGxhaW4gWDExLCBmb3IgZXhhbXBsZSwgeW91Ci0JY2FuIG5vdCBrbm93IHdoZXJlIG9uIHRoZSBzY3JlZW4gdGhlIGFjdGlvbiBpcyBpZiB5b3UgZG9uJ3QgY2hlY2sKLQl0aGUgd2hvbGUgc2NyZWVuLiBUaGlzIGNvbXBsZXggcHJvYmxlbSBpcyBiZWF1dGlmdWxseSBhZGRyZXNzZWQKLQlpbiBLYXJsIFJ1bmdlJ3MgeDExdm5jLgotCi0JTXkgbWFpbiBwdXJwb3NlIGlzIHRvIHJ1biByZWdyZXNzaW9uIHRlc3RzIG9uIGRpZmZlcmVudCBicm93c2VycywKLQl3aGljaCBJIGNhbiBlYXNpbHkgZG8gYnkgc3RhcnRpbmcgWHZuYyBhbmQgdXNpbmcgVmlzdWFsTmFDcm8uCi0KLUhvdyBkaWQgSSBkbyBpdD8KLQotCUkgd29uZGVyZWQgbG9uZyBhYm91dCBob3cgdG8gZG8gaXQuIEkgY291bGRuJ3QgdGFrZSB0aGUgc2FtZSBhcHByb2FjaAotCWFzIHhhdXRvbWF0aW9uOiBJIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBWTkMgc2VydmVyIHRob3VzYW5kIHRpbWVzCi0JcGVyIHNlY29uZC4gU28gSSBkZWNpZGVkIHRvIGNyZWF0ZSBhbiBpbnRlcmZhY2Ugb2YgTGliVk5DU2VydmVyLwotCUxpYlZOQ0NsaWVudCBmb3IgdXNlIGluIGEgc2NyaXB0IGxhbmd1YWdlLgotCi0JRm9ydHVuYXRlbHksIHRoaXMgdGFzayBpcyBtYWRlIHZlcnksIHZlcnkgZWFzeSBieSBTV0lHLiBBcyBQZXJsCi0JaXMgb25lIG9mIG15IGZhdm9yaXRlIHNjcmlwdCBsYW5ndWFnZXMsIEkgZGVjaWRlZCB0byB1c2UgdGhpcy4KLQlCdXQgU1dJRyBtYWtlcyBpdCBlYXN5IHRvIHVzZSB0aGUgdmVyeSBzYW1lIGludGVyZmFjZSBmb3Igb3RoZXIKLQlwb3B1bGFyIGxhbmd1YWdlcywgc28geW91IGFyZSB3ZWxjb21lIHRvIHBvcnQgVmlzdWFsTmFDcm8gdG8KLQl0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2UhCi0JCi1Jc24ndCBpdCBwcm9ub3VuY2VkICJWaXN1YWwgTWFjcm8iPwotCi0JWWVzLiBCdXQgSSBsaWtlZCB0aGUgVmlzdWFsIE5hIENybyBwbGF5IG9mIGFjcm9ueW1zLiBJJ20gc29ycnkgaWYKLQl5b3UgZG9uJ3QgZmluZCBpdCBmdW5ueS4KLQotV2hhdCdzIHRoZSBsaWNlbnNlPwotCi0JR1BMLiBJdCBpcyBiYXNlZCBvbiBMaWJWTkNTZXJ2ZXIvTGliVk5DQ2xpZW50LCBzbyBpdCBoYXMgdG8gYmUuCi0JSWYgeW91IHdhbnQgdG8gcG9ydCB0aGlzIHBhY2thZ2UgdG8gdXNlIHZuY3JlZmxlY3Rvciwgd2hpY2ggaGFzIGEKLQlCU0QgbGljZW5zZSwgZ28gYWhlYWQuCi0KZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL2F1dG9nZW4uc2ggYi9WaXN1YWxOYUNyby9hdXRvZ2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDE2NDVkLi4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL2F1dG9nZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jISAvYmluL3NoCi0jIFJ1biB0aGlzIHRvIGdlbmVyYXRlIGFsbCB0aGUgaW5pdGlhbCBtYWtlZmlsZXMsIGV0Yy4KLQotc3JjZGlyPWBkaXJuYW1lICQwYAotdGVzdCAteiAiJHNyY2RpciIgJiYgc3JjZGlyPS4KLQotRElFPTAKLQotQVVUT01BS0U9YXV0b21ha2UtMS40Ci1BQ0xPQ0FMPWFjbG9jYWwtMS40Ci0KLSgkQVVUT01BS0UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLSAgICAgICAgQVVUT01BS0U9YXV0b21ha2UKLSAgICAgICAgQUNMT0NBTD1hY2xvY2FsCi19Ci0KLShhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgewotCWVjaG8KLQllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9jb25mIGluc3RhbGxlZCB0byBjb21waWxlIFZpc3VhbE5hQ3JvLiIKLQllY2hvICJEb3dubG9hZCB0aGUgYXBwcm9wcmlhdGUgcGFja2FnZSBmb3IgeW91ciBkaXN0cmlidXRpb24sIgotCWVjaG8gIm9yIGdldCB0aGUgc291cmNlIHRhcmJhbGwgYXQgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS8iCi0JRElFPTEKLX0KLQotKCRBVVRPTUFLRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgewotCWVjaG8KLQllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCB0byBjb21waWxlIFZpc3VhbE5hQ3JvLiIKLQllY2hvICJHZXQgZnRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL3B1Yi9hdXRvbWFrZS9hdXRvbWFrZS0xLjQudGFyLmd6IgotCWVjaG8gIihvciBhIG5ld2VyIHZlcnNpb24gaWYgaXQgaXMgYXZhaWxhYmxlKSIKLQlESUU9MQotfQotCi1pZiB0ZXN0ICIkRElFIiAtZXEgMTsgdGhlbgotCWV4aXQgMQotZmkKLQotKHRlc3QgLWYgJHNyY2Rpci9uYWNyby5oKSB8fCB7Ci0JZWNobyAiWW91IG11c3QgcnVuIHRoaXMgc2NyaXB0IGluIHRoZSB0b3AtbGV2ZWwgVmlzdWFsTmFDcm8gZGlyZWN0b3J5IgotCWV4aXQgMQotfQotCi1pZiB0ZXN0IC16ICIkKiI7IHRoZW4KLQllY2hvICJJIGFtIGdvaW5nIHRvIHJ1biAuL2NvbmZpZ3VyZSB3aXRoIG5vIGFyZ3VtZW50cyAtIGlmIHlvdSB3aXNoICIKLSAgICAgICAgZWNobyAidG8gcGFzcyBhbnkgdG8gaXQsIHBsZWFzZSBzcGVjaWZ5IHRoZW0gb24gdGhlICQwIGNvbW1hbmQgbGluZS4iCi1maQotCi0kQUNMT0NBTCAkQUNMT0NBTF9GTEFHUwotI2F1dG9oZWFkZXIKLSRBVVRPTUFLRSAtLWFkZC1taXNzaW5nIC0tY29weQotYXV0b2NvbmYKLQotZWNobyAiUnVubmluZyAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUiICIkQCIKLSRzcmNkaXIvY29uZmlndXJlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAiJEAiCi0KLWVjaG8gIk5vdyB0eXBlICdtYWtlJyB0byBjb21waWxlIFZpc3VhbE5hQ3JvLiIKZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL2NvbmZpZ3VyZS5hYyBiL1Zpc3VhbE5hQ3JvL2NvbmZpZ3VyZS5hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ODMxNy4uMDAwMDAwMAotLS0gYS9WaXN1YWxOYUNyby9jb25maWd1cmUuYWMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgVGhlIG1hY3JvcyB3aGljaCBhcmVuJ3Qgc2hpcHBlZCB3aXRoIHRoZSBhdXRvdG9vbHMgYXJlIHN0b3JlZCBpbiB0aGUgCi1kbmwgVG9vbHMvY29uZmlnIGRpcmVjdG9yeSBpbiAubTQgZmlsZXMuCi0KLUFDX0lOSVQoW1Zpc3VhbE5hQ3JvXSxbMC4xXSxbaHR0cDovL2xpYnZuY3NlcnZlci5zb3VyY2Vmb3JnZS5uZXRdKQotQUNfUFJFUkVRKDIuNTQpCi1BQ19DQU5PTklDQUxfSE9TVAotQU1fSU5JVF9BVVRPTUFLRQotCi1kbmwgQ2hlY2tzIGZvciBwcm9ncmFtcy4KLUFDX0NIRUNLX1BST0coU1dJRyxzd2lnLHN3aWcpCi1BQ19DSEVDS19QUk9HKExJQlZOQ1NFUlZFUkNPTkZJRyxsaWJ2bmNzZXJ2ZXItY29uZmlnLHllcyxubykKLWlmIHRlc3QgIiRMSUJWTkNTRVJWRVJDT05GSUciICE9ICJ5ZXMiOyB0aGVuCi0JQUNfTVNHX0VSUk9SKFtOZWVkIHRvIGhhdmUgbGlidm5jc2VydmVyLWNvbmZpZyBpbiBQQVRIXSkKLQlleGl0IDEKLWZpCi1BQ19QUk9HX0NDCi1BQ19QUk9HX1JBTkxJQgotQUNfRVhFRVhUCi1BQ19PQkpFWFQKLQotTElCVk5DU0VSVkVSQ0ZMQUdTPWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tY2ZsYWdzYAotTElCVk5DU0VSVkVSTElCUz1gbGlidm5jc2VydmVyLWNvbmZpZyAtLWxpYnNgCi1BQ19TVUJTVChMSUJWTkNTRVJWRVJDRkxBR1MpCi1BQ19TVUJTVChMSUJWTkNTRVJWRVJMSUJTKQotCi1kbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi1BQ19IRUFERVJfU1REQwotCi1kbmwgSG93IHRvIHNwZWNpZnkgaW5jbHVkZSBkaXJlY3RvcmllcyB0aGF0IG1heSBiZSBzeXN0ZW0gZGlyZWN0b3JpZXMuCi0jIC1JIHNob3VsZCBub3QgYmUgdXNlZCBvbiBzeXN0ZW0gZGlyZWN0b3JpZXMgKEdDQykKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgSVNZU1RFTT0iLWlzeXN0ZW0gIgotZWxzZQotICAgIElTWVNURU09Ii1JIgotZmkKLQotCi0jIFNldCBpbmZvIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMuCi1BQ19TVUJTVChTTykKLUFDX1NVQlNUKExEU0hBUkVEKQotQUNfU1VCU1QoQ0NTSEFSRUQpCi1BQ19TVUJTVChMSU5LRk9SU0hBUkVEKQotCi0jIFNPIGlzIHRoZSBleHRlbnNpb24gb2Ygc2hhcmVkIGxpYnJhcmllcyBgKGluY2x1ZGluZyB0aGUgZG90ISkKLUFDX01TR19DSEVDS0lORyhTTykKLWlmIHRlc3QgLXogIiRTTyIKLXRoZW4KLQljYXNlICRob3N0IGluCi0JKi0qLWhwKikgU089LnNsOzsKLQkqLSotZGFyd2luKikgU089LmJ1bmRsZTs7Ci0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqKSBTTz0uZGxsOzsKLQkqKSBTTz0uc287OwotCWVzYWMKLWZpCi1BQ19NU0dfUkVTVUxUKCRTTykKLQotIyBMRFNIQVJFRCBpcyB0aGUgbGQgKmNvbW1hbmQqIHVzZWQgdG8gY3JlYXRlIHNoYXJlZCBsaWJyYXJ5Ci0jIC0tICJsZCIgb24gU3VuT1MgNC54LngsICJsZCAtRyIgb24gU3VuT1MgNS54LCAibGQgLXNoYXJlZCIgb24gSVJJWCA1Ci0jIChTaGFyZWQgbGlicmFyaWVzIGluIHRoaXMgaW5zdGFuY2UgYXJlIHNoYXJlZCBtb2R1bGVzIHRvIGJlIGxvYWRlZCBpbnRvCi0jIFB5dGhvbiwgYXMgb3Bwb3NlZCB0byBidWlsZGluZyBQeXRob24gaXRzZWxmIGFzIGEgc2hhcmVkIGxpYnJhcnkuKQotQUNfTVNHX0NIRUNLSU5HKExEU0hBUkVEKQotaWYgdGVzdCAteiAiJExEU0hBUkVEIgotdGhlbgotCWNhc2UgJGhvc3QgaW4KLQkqLSotYWl4KikgTERTSEFSRUQ9IlwkKHNyY2RpcikvbGRfc29fYWl4IFwkKENDKSI7OwotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KikKLSAgICAgICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgICAgTERTSEFSRUQ9ImRsbHdyYXAgLS1kcml2ZXItbmFtZSBnY2MgLS1kbGx0b29sIGRsbHRvb2wgLS1leHBvcnQtYWxsLXN5bWJvbHMgLS1hcyBhcyAtLWRsbG5hbWUgXCQoTElCUFJFRklYKVwkKFRBUkdFVClcJChTTykiCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAiY2wiID0gJENDIDsgIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKyAoTVNWQykKLSAgICAgICAgICAgICAgICAgICAgTERTSEFSRUQ9IiRDQyAtbm9sb2dvIC1MRCIKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICMgVW5rbm93biBjb21waWxlciB0cnkgZ2NjIGFwcHJvYWNoCi0gICAgICAgICAgICAgICAgICAgIExEU0hBUkVEPSIkQ0MgLXNoYXJlZCIKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkgOzsKLQkqLSotaXJpeDUqKSBMRFNIQVJFRD0ibGQgLXNoYXJlZCI7OwotCSotKi1pcml4NiopIExEU0hBUkVEPSJsZCAke1NHSV9BQkl9IC1zaGFyZWQgLWFsbCI7OwotCSotKi1zdW5vczQqKSBMRFNIQVJFRD0ibGQiOzsKLQkqLSotc29sYXJpcyopIExEU0hBUkVEPSJsZCAtRyI7OwotCSotKi1ocCopIExEU0hBUkVEPSJsZCAtYiI7OwotCSotKi1vc2YqKSBMRFNIQVJFRD0ibGQgLXNoYXJlZCAtZXhwZWN0X3VucmVzb2x2ZWQgXCIqXCIiOzsKLQkqLXNlcXVlbnQtc3lzdjQpIExEU0hBUkVEPSJsZCAtRyI7OwotCSotKi1uZXh0KikKLQkJaWYgdGVzdCAiJG5zX2R5bGQiCi0JCXRoZW4gTERTSEFSRUQ9JyQoQ0MpICQoTERGTEFHUykgLWJ1bmRsZSAtcHJlYmluZCcKLQkJZWxzZSBMRFNIQVJFRD0nJChDQykgJChDRkxBR1MpIC1ub3N0ZGxpYiAtcic7Ci0JCWZpCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAiJHdpdGhfbmV4dF9mcmFtZXdvcmsiIDsgdGhlbgotCQkgICAgTERTSEFSRUQ9IiRMRFNIQVJFRCBcJChMRExJQlJBUlkpIgotCQlmaSA7OwotCSotKi1saW51eCopIExEU0hBUkVEPSJnY2MgLXNoYXJlZCI7OwotCSotKi1kZ3V4KikgTERTSEFSRUQ9ImxkIC1HIjs7Ci0JKi0qLWZyZWVic2QzKikgTERTSEFSRUQ9ImdjYyAtc2hhcmVkIjs7Ci0JKi0qLWZyZWVic2QqIHwgKi0qLW9wZW5ic2QqKSBMRFNIQVJFRD0ibGQgLUJzaGFyZWFibGUiOzsKLQkqLSotbmV0YnNkKikKLQkJaWYgW1sgImAkQ0MgLWRNIC1FIC0gPC9kZXYvbnVsbCB8IGdyZXAgX19FTEZfX2AiICE9ICIiIF1dCi0JCXRoZW4KLQkJCUxEU0hBUkVEPSJjYyAtc2hhcmVkIgotCQllbHNlCi0JCQlMRFNIQVJFRD0ibGQgLUJzaGFyZWFibGUiCi0JCWZpOzsKLQkqLXNjby1zeXN2KikgTERTSEFSRUQ9ImNjIC1HIC1LUElDIC1LaTQ4NiAtYmVsZiAtV2wsLUJleHBvcnQiOzsKLQkqLSotZGFyd2luKikgTERTSEFSRUQ9ImNjIC1idW5kbGUgLXVuZGVmaW5lZCBzdXBwcmVzcyAtZmxhdF9uYW1lc3BhY2UiOzsKLQkqKQlMRFNIQVJFRD0ibGQiOzsKLQllc2FjCi1maQotQUNfTVNHX1JFU1VMVCgkTERTSEFSRUQpCi0jIENDU0hBUkVEIGFyZSB0aGUgQyAqZmxhZ3MqIHVzZWQgdG8gY3JlYXRlIG9iamVjdHMgdG8gZ28gaW50byBhIHNoYXJlZAotIyBsaWJyYXJ5IChtb2R1bGUpIC0tIHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGEgZmV3IHN5c3RlbXMKLUFDX01TR19DSEVDS0lORyhDQ1NIQVJFRCkKLWlmIHRlc3QgLXogIiRDQ1NIQVJFRCIKLXRoZW4KLQljYXNlICRob3N0IGluCi0JKi0qLWhwKikgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7Ci0JCSB0aGVuIENDU0hBUkVEPSItZnBpYyI7Ci0JCSBlbHNlIENDU0hBUkVEPSIreiI7Ci0JCSBmaTs7Ci0JKi0qLWxpbnV4KikgQ0NTSEFSRUQ9Ii1mcGljIjs7Ci0JKi0qLWZyZWVic2QqIHwgKi0qLW9wZW5ic2QqKSBDQ1NIQVJFRD0iLWZwaWMiOzsKLQkqLSotbmV0YnNkKikgQ0NTSEFSRUQ9Ii1mUElDIjs7Ci0JKi1zY28tc3lzdiopIENDU0hBUkVEPSItS1BJQyAtZHkgLUJkeW5hbWljIjs7Ci0JKi0qLWlyaXg2KikgIGNhc2UgJENDIGluCi0JCSAgICpnY2MqKSBDQ1NIQVJFRD0iLXNoYXJlZCI7OwotCQkgICAqKSBDQ1NIQVJFRD0iIjs7Ci0JCSAgIGVzYWM7OwotCWVzYWMKLWZpCi1BQ19NU0dfUkVTVUxUKCRDQ1NIQVJFRCkKLQotIyBSUEFUSCBpcyB0aGUgcGF0aCB1c2VkIHRvIGxvb2sgZm9yIHNoYXJlZCBsaWJyYXJ5IGZpbGVzLgotQUNfTVNHX0NIRUNLSU5HKFJQQVRIKQotaWYgdGVzdCAteiAiJFJQQVRIIgotdGhlbgotCWNhc2UgJGhvc3QgaW4KLQkqLSotc29sYXJpcyopIFJQQVRIPSctUi4gLVIkKGV4ZWNfcHJlZml4KS9saWInOzsKLSAgICAgICAgKi0qLWlyaXgqKSBSUEFUSD0nLXJwYXRoIC46JChleGVjX3ByZWZpeCkvbGliJzs7Ci0JKi0qLWxpbnV4KikgUlBBVEg9Jy1YbGlua2VyIC1ycGF0aCAkKGV4ZWNfcHJlZml4KS9saWIgLVhsaW5rZXIgLXJwYXRoIC4nOzsKLQkqKQlSUEFUSD0nJzs7Ci0JZXNhYwotZmkKLUFDX01TR19SRVNVTFQoJFJQQVRIKQotQUNfU1VCU1QoUlBBVEgpCi0KLSMgTElOS0ZPUlNIQVJFRCBhcmUgdGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgJChDQykgY29tbWFuZCB0aGF0IGxpbmtzCi0jIHRoZSBhIGZldyBleGVjdXRhYmxlcyAtLSB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBhIGZldyBzeXN0ZW1zCi0KLUFDX01TR19DSEVDS0lORyhMSU5LRk9SU0hBUkVEKQotaWYgdGVzdCAteiAiJExJTktGT1JTSEFSRUQiCi10aGVuCi0JY2FzZSAkaG9zdCBpbgotCSotKi1haXgqKQlMSU5LRk9SU0hBUkVEPSctV2wsLWJFOiQoc3JjZGlyKS9weXRob24uZXhwIC1sbGQnOzsKLQkqLSotaHAqKQotCSAgICBMSU5LRk9SU0hBUkVEPSItV2wsLUUgLVdsLCtzIC1XbCwrYlwkKEJJTkxJQkRFU1QpL2xpYi1keW5sb2FkIjs7Ci0JKi0qLWxpbnV4KikgTElOS0ZPUlNIQVJFRD0iLVhsaW5rZXIgLWV4cG9ydC1keW5hbWljIjs7Ci0JKi0qLW5leHQqKSBMSU5LRk9SU0hBUkVEPSItdSBsaWJzeXNfcyI7OwotCSotc2NvLXN5c3YqKSBMSU5LRk9SU0hBUkVEPSItQmR5bmFtaWMgLWR5IC1XbCwtQmV4cG9ydCI7OwotCSotKi1pcml4NiopIExJTktGT1JTSEFSRUQ9Ii1hbGwiOzsKLQllc2FjCi1maQotQUNfTVNHX1JFU1VMVCgkTElOS0ZPUlNIQVJFRCkKLQotIyBUaGlzIHZhcmlhdGlvbiBpcyBuZWVkZWQgb24gT1MtWCBiZWNhdXNlIHRoZXJlIGlzIG5vIChhcHBhcmVudCkgY29uc2lzdGVuY3kgaW4gc2hhcmVkIGxpYmFyeSBuYW1pbmcuCi0jIFNvbWV0aW1lcyAuYnVuZGxlIHdvcmtzLCBidXQgc29tZXRpbWVzIC5zbyBpcyBuZWVkZWQuICBJdCBkZXBlbmRzIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKLQotIyBPcHRpb25hbCBDRkxBR1MgdXNlZCB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgcGxhdGZvcm1zLgotCi1BQ19TVUJTVChQTEFURkxBR1MpCi1jYXNlICRob3N0IGluCi0gICAqLSotZGFyd2luKikgUExBVEZMQUdTPSItV25vLWxvbmctZG91YmxlIjs7Ci0gICAqKSBQTEFURkxBR1M9IiI7OwotZXNhYwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBMb29rIGZvciBQZXJsNQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUEVSTEJJTj0KLQotQUNfQVJHX1dJVEgocGVybDUsWyAgLS13aXRoLXBlcmw1PXBhdGggICAgICAgU2V0IGxvY2F0aW9uIG9mIFBlcmw1IGV4ZWN1dGFibGVdLFsgUEVSTEJJTj0iJHdpdGh2YWwiXSwgW1BFUkxCSU49XSkKLQotIyBGaXJzdCBmaWd1cmUgb3V0IHdoYXQgdGhlIG5hbWUgb2YgUGVybDUgaXMKLQotaWYgdGVzdCAteiAiJFBFUkxCSU4iOyB0aGVuCi1BQ19DSEVDS19QUk9HUyhQRVJMLCBwZXJsIHBlcmw1LjguMSBwZXJsNS42LjEgcGVybDUuNi4wIHBlcmw1LjAwNCBwZXJsNS4wMDMgcGVybDUuMDAyIHBlcmw1LjAwMSBwZXJsNSBwZXJsKQotZWxzZQotUEVSTD0iJFBFUkxCSU4iCi1maQotCi0KLUFDX01TR19DSEVDS0lORyhmb3IgUGVybDUgaGVhZGVyIGZpbGVzKQotaWYgdGVzdCAtbiAiJFBFUkwiOyB0aGVuCi0JUEVSTDVESVI9YCgkUEVSTCAtZSAndXNlIENvbmZpZzsgcHJpbnQgJENvbmZpZ3thcmNobGlifSwgIlxuIjsnKSAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0ICIkUEVSTDVESVIiICE9ICIiOyB0aGVuCi0JCWRpcnM9IiRQRVJMNURJUiAkUEVSTDVESVIvQ09SRSIKLQkJUEVSTDVFWFQ9bm9uZQotCQlmb3IgaSBpbiAkZGlyczsgZG8KLQkJCWlmIHRlc3QgLXIgJGkvcGVybC5oOyB0aGVuCi0JCQkJQUNfTVNHX1JFU1VMVCgkaSkKLQkJCQlQRVJMNUVYVD0iJGkiCi0JCQkJYnJlYWs7Ci0JCQlmaQotCQlkb25lCi0JCWlmIHRlc3QgIiRQRVJMNUVYVCIgPSBub25lOyB0aGVuCi0JCQlQRVJMNUVYVD0iJFBFUkw1RElSL0NPUkUiCi0JCQlBQ19NU0dfUkVTVUxUKGNvdWxkIG5vdCBsb2NhdGUgcGVybC5oLi4udXNpbmcgJFBFUkw1RVhUKQotCQlmaQotCi0JCUFDX01TR19DSEVDS0lORyhmb3IgUGVybDUgbGlicmFyeSkKLQkJUEVSTDVMSUI9YCgkUEVSTCAtZSAndXNlIENvbmZpZzsgJF89JENvbmZpZ3tsaWJwZXJsfTsgcy9ebGliLy87IHMvJENvbmZpZ3tfYX0kLy87IHByaW50ICRfLCAiXG4iJykgMj4vZGV2L251bGxgCi0JCWlmIHRlc3QgIiRQRVJMNUxJQiIgPSAiIiA7IHRoZW4KLQkJCUFDX01TR19SRVNVTFQobm90IGZvdW5kKQotCQllbHNlCi0JCQlBQ19NU0dfUkVTVUxUKCRQRVJMNUxJQikKLQkJZmkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFBlcmw1IGNvbXBpbGVyIG9wdGlvbnMpCi0gCQlQRVJMNUNDRkxBR1M9YCgkUEVSTCAtZSAndXNlIENvbmZpZzsgcHJpbnQgJENvbmZpZ3tjY2ZsYWdzfSwgIlxuIicgfCBzZWQgInMvLUkvJElTWVNURU0vIikgMj4vZGV2L251bGxgCi0gCQlpZiB0ZXN0ICIkUEVSTDVDQ0ZMQUdTIiA9ICIiIDsgdGhlbgotIAkJCUFDX01TR19SRVNVTFQobm90IGZvdW5kKQotIAkJZWxzZQotIAkJCUFDX01TR19SRVNVTFQoJFBFUkw1Q0NGTEFHUykKLSAJCWZpCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKHVuYWJsZSB0byBkZXRlcm1pbmUgcGVybDUgY29uZmlndXJhdGlvbikKLQkJUEVSTDVFWFQ9JFBFUkw1RElSCi0JZmkKLWVsc2UKLSAgICAgICAJQUNfTVNHX1JFU1VMVChjb3VsZCBub3QgZmlndXJlIG91dCBob3cgdG8gcnVuIHBlcmw1KQotZmkKLQotIyBDeWd3aW4gKFdpbmRvd3MpIG5lZWRzIHRoZSBsaWJyYXJ5IGZvciBkeW5hbWljIGxpbmtpbmcKLWNhc2UgJGhvc3QgaW4KLSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KikgUEVSTDVEWU5BTUlDTElOS0lORz0iLUwkUEVSTDVFWFQgLWwkUEVSTDVMSUIiOzsKLSopUEVSTDVEWU5BTUlDTElOS0lORz0iIjs7Ci1lc2FjCi0KLUFDX1NVQlNUKFBFUkwpCi1BQ19TVUJTVChQRVJMNUVYVCkKLUFDX1NVQlNUKFBFUkw1RFlOQU1JQ0xJTktJTkcpCi1BQ19TVUJTVChQRVJMNUxJQikKLUFDX1NVQlNUKFBFUkw1Q0NGTEFHUykKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTWlzY2VsbGFuZW91cwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCi1BQ19PVVRQVVQKLQotZG5sIGNvbmZpZ3VyZS5pbiBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL2RlZmF1bHQ4eDE2LmggYi9WaXN1YWxOYUNyby9kZWZhdWx0OHgxNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJmNDExLi4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL2RlZmF1bHQ4eDE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVmYXVsdDh4MTZGb250RGF0YVs0MDk2KzFdPXsKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHg3ZSwweDgxLDB4YTUsMHg4MSwweDgxLDB4YmQsMHg5OSwweDgxLDB4ODEsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2UsMHhmZiwweGRiLDB4ZmYsMHhmZiwweGMzLDB4ZTcsMHhmZiwweGZmLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg2YywweGZlLDB4ZmUsMHhmZSwweGZlLDB4N2MsMHgzOCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgzOCwweDdjLDB4ZmUsMHg3YywweDM4LDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgxOCwweDNjLDB4M2MsMHhlNywweGU3LDB4ZTcsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MTgsMHgzYywweDdlLDB4ZmYsMHhmZiwweDdlLDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4M2MsMHgzYywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlNywweGMzLDB4YzMsMHhlNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4NjYsMHg0MiwweDQyLDB4NjYsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjMywweDk5LDB4YmQsMHhiZCwweDk5LDB4YzMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHgwMCwweDAwLDB4MWUsMHgwZSwweDFhLDB4MzIsMHg3OCwweGNjLDB4Y2MsMHhjYywweGNjLDB4NzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDNjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHgzYywweDE4LDB4N2UsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgzZiwweDMzLDB4M2YsMHgzMCwweDMwLDB4MzAsMHgzMCwweDcwLDB4ZjAsMHhlMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2YsMHg2MywweDdmLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2NywweGU3LDB4ZTYsMHhjMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweGRiLDB4M2MsMHhlNywweDNjLDB4ZGIsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4ODAsMHhjMCwweGUwLDB4ZjAsMHhmOCwweGZlLDB4ZjgsMHhmMCwweGUwLDB4YzAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAyLDB4MDYsMHgwZSwweDFlLDB4M2UsMHhmZSwweDNlLDB4MWUsMHgwZSwweDA2LDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDE4LDB4M2MsMHg3ZSwweDE4LDB4MTgsMHgxOCwweDdlLDB4M2MsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDAwLDB4NjYsMHg2NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2YsMHhkYiwweGRiLDB4ZGIsMHg3YiwweDFiLDB4MWIsMHgxYiwweDFiLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg3YywweGM2LDB4NjAsMHgzOCwweDZjLDB4YzYsMHhjNiwweDZjLDB4MzgsMHgwYywweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweGZlLDB4ZmUsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MTgsMHgzYywweDdlLDB4MTgsMHgxOCwweDE4LDB4N2UsMHgzYywweDE4LDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDE4LDB4M2MsMHg3ZSwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDdlLDB4M2MsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwYywweGZlLDB4MGMsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjAsMHhmZSwweDYwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGMwLDB4YzAsMHhjMCwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg2NiwweGZmLDB4NjYsMHgyNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDM4LDB4MzgsMHg3YywweDdjLDB4ZmUsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHhmZSwweDdjLDB4N2MsMHgzOCwweDM4LDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDE4LDB4M2MsMHgzYywweDNjLDB4MTgsMHgxOCwweDE4LDB4MDAsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NjYsMHg2NiwweDY2LDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHg2YywweDZjLDB4ZmUsMHg2YywweDZjLDB4NmMsMHhmZSwweDZjLDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MTgsMHgxOCwweDdjLDB4YzYsMHhjMiwweGMwLDB4N2MsMHgwNiwweDA2LDB4ODYsMHhjNiwweDdjLDB4MTgsMHgxOCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4YzIsMHhjNiwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzYsMHg4NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MzgsMHg2YywweDZjLDB4MzgsMHg3NiwweGRjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgzMCwweDMwLDB4MzAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwYywweDE4LDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MTgsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MzAsMHgxOCwweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDE4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY2LDB4M2MsMHhmZiwweDNjLDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4N2UsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MTgsMHgzMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDYsMHgwYywweDE4LDB4MzAsMHg2MCwweGMwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGNlLDB4ZGUsMHhmNiwweGU2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxOCwweDM4LDB4NzgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2MsMHhjNiwweDA2LDB4MGMsMHgxOCwweDMwLDB4NjAsMHhjMCwweGM2LDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDdjLDB4YzYsMHgwNiwweDA2LDB4M2MsMHgwNiwweDA2LDB4MDYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwYywweDFjLDB4M2MsMHg2YywweGNjLDB4ZmUsMHgwYywweDBjLDB4MGMsMHgxZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4ZmUsMHhjMCwweGMwLDB4YzAsMHhmYywweDA2LDB4MDYsMHgwNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDM4LDB4NjAsMHhjMCwweGMwLDB4ZmMsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhmZSwweGM2LDB4MDYsMHgwNiwweDBjLDB4MTgsMHgzMCwweDMwLDB4MzAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4N2UsMHgwNiwweDA2LDB4MDYsMHgwYywweDc4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDYsMHgwYywweDE4LDB4MzAsMHg2MCwweDMwLDB4MTgsMHgwYywweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3ZSwweDAwLDB4MDAsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHg2MCwweDMwLDB4MTgsMHgwYywweDA2LDB4MGMsMHgxOCwweDMwLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweDBjLDB4MTgsMHgxOCwweDE4LDB4MDAsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGRlLDB4ZGUsMHhkZSwweGRjLDB4YzAsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MTAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGZjLDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2NiwweDY2LDB4NjYsMHg2NiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgzYywweDY2LDB4YzIsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMyLDB4NjYsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4ZjgsMHg2YywweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDZjLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGZlLDB4NjYsMHg2MiwweDY4LDB4NzgsMHg2OCwweDYwLDB4NjIsMHg2NiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhmZSwweDY2LDB4NjIsMHg2OCwweDc4LDB4NjgsMHg2MCwweDYwLDB4NjAsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4M2MsMHg2NiwweGMyLDB4YzAsMHhjMCwweGRlLDB4YzYsMHhjNiwweDY2LDB4M2EsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGM2LDB4YzYsMHhjNiwweGM2LDB4ZmUsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgzYywweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MWUsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4Y2MsMHhjYywweGNjLDB4NzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGU2LDB4NjYsMHg2NiwweDZjLDB4NzgsMHg3OCwweDZjLDB4NjYsMHg2NiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhmMCwweDYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYyLDB4NjYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4YzMsMHhlNywweGZmLDB4ZmYsMHhkYiwweGMzLDB4YzMsMHhjMywweGMzLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGM2LDB4ZTYsMHhmNiwweGZlLDB4ZGUsMHhjZSwweGM2LDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4ZmMsMHg2NiwweDY2LDB4NjYsMHg3YywweDYwLDB4NjAsMHg2MCwweDYwLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4ZDYsMHhkZSwweDdjLDB4MGMsMHgwZSwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhmYywweDY2LDB4NjYsMHg2NiwweDdjLDB4NmMsMHg2NiwweDY2LDB4NjYsMHhlNiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4NjAsMHgzOCwweDBjLDB4MDYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGZmLDB4ZGIsMHg5OSwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4YzMsMHhjMywweGMzLDB4YzMsMHhjMywweGMzLDB4YzMsMHg2NiwweDNjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGMzLDB4YzMsMHhjMywweGMzLDB4YzMsMHhkYiwweGRiLDB4ZmYsMHg2NiwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhjMywweGMzLDB4NjYsMHgzYywweDE4LDB4MTgsMHgzYywweDY2LDB4YzMsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4YzMsMHhjMywweGMzLDB4NjYsMHgzYywweDE4LDB4MTgsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGZmLDB4YzMsMHg4NiwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzEsMHhjMywweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgzYywweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHg4MCwweGMwLDB4ZTAsMHg3MCwweDM4LDB4MWMsMHgwZSwweDA2LDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDNjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDEwLDB4MzgsMHg2YywweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4MDAsMHgwMCwKLTB4MzAsMHgzMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4ZTAsMHg2MCwweDYwLDB4NzgsMHg2YywweDY2LDB4NjYsMHg2NiwweDY2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDdjLDB4YzYsMHhjMCwweGMwLDB4YzAsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxYywweDBjLDB4MGMsMHgzYywweDZjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2MsMHhjNiwweGZlLDB4YzAsMHhjMCwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDM4LDB4NmMsMHg2NCwweDYwLDB4ZjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3NiwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3YywweDBjLDB4Y2MsMHg3OCwweDAwLAotMHgwMCwweDAwLDB4ZTAsMHg2MCwweDYwLDB4NmMsMHg3NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4ZTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDM4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwNiwweDA2LDB4MDAsMHgwZSwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDY2LDB4NjYsMHgzYywweDAwLAotMHgwMCwweDAwLDB4ZTAsMHg2MCwweDYwLDB4NjYsMHg2YywweDc4LDB4NzgsMHg2YywweDY2LDB4ZTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDM4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhlNiwweGZmLDB4ZGIsMHhkYiwweGRiLDB4ZGIsMHhkYiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZGMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhkYywweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg3YywweDYwLDB4NjAsMHhmMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzYsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4N2MsMHgwYywweDBjLDB4MWUsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGRjLDB4NzYsMHg2NiwweDYwLDB4NjAsMHg2MCwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3YywweGM2LDB4NjAsMHgzOCwweDBjLDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MTAsMHgzMCwweDMwLDB4ZmMsMHgzMCwweDMwLDB4MzAsMHgzMCwweDM2LDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjMywweGMzLDB4YzMsMHhjMywweDY2LDB4M2MsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YzMsMHhjMywweGMzLDB4ZGIsMHhkYiwweGZmLDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGMzLDB4NjYsMHgzYywweDE4LDB4M2MsMHg2NiwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3ZSwweDA2LDB4MGMsMHhmOCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHhjYywweDE4LDB4MzAsMHg2MCwweGM2LDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDBlLDB4MTgsMHgxOCwweDE4LDB4NzAsMHgxOCwweDE4LDB4MTgsMHgxOCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxOCwweDE4LDB4MTgsMHgxOCwweDAwLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4NzAsMHgxOCwweDE4LDB4MTgsMHgwZSwweDE4LDB4MTgsMHgxOCwweDE4LDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDc2LDB4ZGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGM2LDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4M2MsMHg2NiwweGMyLDB4YzAsMHhjMCwweGMwLDB4YzIsMHg2NiwweDNjLDB4MGMsMHgwNiwweDdjLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGNjLDB4MDAsMHgwMCwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MGMsMHgxOCwweDMwLDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDEwLDB4MzgsMHg2YywweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweGNjLDB4MDAsMHgwMCwweDc4LDB4MGMsMHg3YywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NjAsMHgzMCwweDE4LDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDM4LDB4NmMsMHgzOCwweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDY2LDB4NjAsMHg2MCwweDY2LDB4M2MsMHgwYywweDA2LDB4M2MsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MTAsMHgzOCwweDZjLDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4YzYsMHgwMCwweDAwLDB4N2MsMHhjNiwweGZlLDB4YzAsMHhjMCwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg2MCwweDMwLDB4MTgsMHgwMCwweDdjLDB4YzYsMHhmZSwweGMwLDB4YzAsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHg2NiwweDAwLDB4MDAsMHgzOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDE4LDB4M2MsMHg2NiwweDAwLDB4MzgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg2MCwweDMwLDB4MTgsMHgwMCwweDM4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4YzYsMHgwMCwweDEwLDB4MzgsMHg2YywweGM2LDB4YzYsMHhmZSwweGM2LDB4YzYsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgzOCwweDZjLDB4MzgsMHgwMCwweDM4LDB4NmMsMHhjNiwweGM2LDB4ZmUsMHhjNiwweGM2LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MTgsMHgzMCwweDYwLDB4MDAsMHhmZSwweDY2LDB4NjAsMHg3YywweDYwLDB4NjAsMHg2NiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2ZSwweDNiLDB4MWIsMHg3ZSwweGQ4LDB4ZGMsMHg3NywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4M2UsMHg2YywweGNjLDB4Y2MsMHhmZSwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgxMCwweDM4LDB4NmMsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhjNiwweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDYwLDB4MzAsMHgxOCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgzMCwweDc4LDB4Y2MsMHgwMCwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NjAsMHgzMCwweDE4LDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4YzYsMHgwMCwweDAwLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2UsMHgwNiwweDBjLDB4NzgsMHgwMCwKLTB4MDAsMHhjNiwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4YzYsMHgwMCwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDE4LDB4MTgsMHg3ZSwweGMzLDB4YzAsMHhjMCwweGMwLDB4YzMsMHg3ZSwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgzOCwweDZjLDB4NjQsMHg2MCwweGYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHhlNiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhjMywweDY2LDB4M2MsMHgxOCwweGZmLDB4MTgsMHhmZiwweDE4LDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweGZjLDB4NjYsMHg2NiwweDdjLDB4NjIsMHg2NiwweDZmLDB4NjYsMHg2NiwweDY2LDB4ZjMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwZSwweDFiLDB4MTgsMHgxOCwweDE4LDB4N2UsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZDgsMHg3MCwweDAwLDB4MDAsCi0weDAwLDB4MTgsMHgzMCwweDYwLDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDBjLDB4MTgsMHgzMCwweDAwLDB4MzgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgxOCwweDMwLDB4NjAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MTgsMHgzMCwweDYwLDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4NzYsMHhkYywweDAwLDB4ZGMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4NzYsMHhkYywweDAwLDB4YzYsMHhlNiwweGY2LDB4ZmUsMHhkZSwweGNlLDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4M2MsMHg2YywweDZjLDB4M2UsMHgwMCwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDM4LDB4NmMsMHg2YywweDM4LDB4MDAsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDMwLDB4MzAsMHgwMCwweDMwLDB4MzAsMHg2MCwweGMwLDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZlLDB4YzAsMHhjMCwweGMwLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHhjMCwweGMwLDB4YzIsMHhjNiwweGNjLDB4MTgsMHgzMCwweDYwLDB4Y2UsMHg5YiwweDA2LDB4MGMsMHgxZiwweDAwLDB4MDAsCi0weDAwLDB4YzAsMHhjMCwweGMyLDB4YzYsMHhjYywweDE4LDB4MzAsMHg2NiwweGNlLDB4OTYsMHgzZSwweDA2LDB4MDYsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MTgsMHgxOCwweDE4LDB4M2MsMHgzYywweDNjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM2LDB4NmMsMHhkOCwweDZjLDB4MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhkOCwweDZjLDB4MzYsMHg2YywweGQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgxMSwweDQ0LDB4MTEsMHg0NCwweDExLDB4NDQsMHgxMSwweDQ0LDB4MTEsMHg0NCwweDExLDB4NDQsMHgxMSwweDQ0LDB4MTEsMHg0NCwKLTB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsCi0weGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LAotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmOCwweDE4LDB4ZjgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGY2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmOCwweDE4LDB4ZjgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjYsMHgwNiwweGY2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweDA2LDB4ZjYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjYsMHgwNiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmOCwweDE4LDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGY4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDFmLDB4MTgsMHgxZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzcsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzcsMHgzMCwweDNmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNmLDB4MzAsMHgzNywweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmNywweDAwLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHgwMCwweGY3LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM3LDB4MzAsMHgzNywweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjcsMHgwMCwweGY3LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MDAsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4M2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MWYsMHgxOCwweDFmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFmLDB4MTgsMHgxZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2YsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGZmLDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MTgsMHhmZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwKLTB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzYsMHhkYywweGQ4LDB4ZDgsMHhkOCwweGRjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDc4LDB4Y2MsMHhjYywweGNjLDB4ZDgsMHhjYywweGM2LDB4YzYsMHhjNiwweGNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHhmZSwweGM2LDB4YzYsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweGZlLDB4NmMsMHg2YywweDZjLDB4NmMsMHg2YywweDZjLDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4ZmUsMHhjNiwweDYwLDB4MzAsMHgxOCwweDMwLDB4NjAsMHhjNiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3ZSwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHg3MCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg3YywweDYwLDB4NjAsMHhjMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg3NiwweGRjLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDdlLDB4MTgsMHgzYywweDY2LDB4NjYsMHg2NiwweDNjLDB4MTgsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweDZjLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDM4LDB4NmMsMHhjNiwweGM2LDB4YzYsMHg2YywweDZjLDB4NmMsMHg2YywweGVlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxZSwweDMwLDB4MTgsMHgwYywweDNlLDB4NjYsMHg2NiwweDY2LDB4NjYsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2UsMHhkYiwweGRiLDB4ZGIsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDMsMHgwNiwweDdlLDB4ZGIsMHhkYiwweGYzLDB4N2UsMHg2MCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgxYywweDMwLDB4NjAsMHg2MCwweDdjLDB4NjAsMHg2MCwweDYwLDB4MzAsMHgxYywweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweDAwLDB4MDAsMHhmZSwweDAwLDB4MDAsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDdlLDB4MTgsMHgxOCwweDAwLDB4MDAsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgzMCwweDE4LDB4MGMsMHgwNiwweDBjLDB4MTgsMHgzMCwweDAwLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MGMsMHgxOCwweDMwLDB4NjAsMHgzMCwweDE4LDB4MGMsMHgwMCwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwZSwweDFiLDB4MWIsMHgxYiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZDgsMHhkOCwweGQ4LDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MDAsMHg3ZSwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3NiwweGRjLDB4MDAsMHg3NiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDM4LDB4NmMsMHg2YywweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDBmLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweGVjLDB4NmMsMHg2YywweDNjLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHhkOCwweDZjLDB4NmMsMHg2YywweDZjLDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NzAsMHhkOCwweDMwLDB4NjAsMHhjOCwweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDdjLDB4N2MsMHg3YywweDdjLDB4N2MsMHg3YywweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi19Owotc3RhdGljIGludCBkZWZhdWx0OHgxNkZvbnRNZXRhRGF0YVsyNTYqNSsxXT17Ci0wLDgsMTYsMCwwLDE2LDgsMTYsMCwwLDMyLDgsMTYsMCwwLDQ4LDgsMTYsMCwwLDY0LDgsMTYsMCwwLDgwLDgsMTYsMCwwLDk2LDgsMTYsMCwwLDExMiw4LDE2LDAsMCwxMjgsOCwxNiwwLDAsMTQ0LDgsMTYsMCwwLDE2MCw4LDE2LDAsMCwxNzYsOCwxNiwwLDAsMTkyLDgsMTYsMCwwLDIwOCw4LDE2LDAsMCwyMjQsOCwxNiwwLDAsMjQwLDgsMTYsMCwwLDI1Niw4LDE2LDAsMCwyNzIsOCwxNiwwLDAsMjg4LDgsMTYsMCwwLDMwNCw4LDE2LDAsMCwzMjAsOCwxNiwwLDAsMzM2LDgsMTYsMCwwLDM1Miw4LDE2LDAsMCwzNjgsOCwxNiwwLDAsMzg0LDgsMTYsMCwwLDQwMCw4LDE2LDAsMCw0MTYsOCwxNiwwLDAsNDMyLDgsMTYsMCwwLDQ0OCw4LDE2LDAsMCw0NjQsOCwxNiwwLDAsNDgwLDgsMTYsMCwwLDQ5Niw4LDE2LDAsMCw1MTIsOCwxNiwwLDAsNTI4LDgsMTYsMCwwLDU0NCw4LDE2LDAsMCw1NjAsOCwxNiwwLDAsNTc2LDgsMTYsMCwwLDU5Miw4LDE2LDAsMCw2MDgsOCwxNiwwLDAsNjI0LDgsMTYsMCwwLDY0MCw4LDE2LDAsMCw2NTYsOCwxNiwwLDAsNjcyLDgsMTYsMCwwLDY4OCw4LDE2LDAsMCw3MDQsOCwxNiwwLDAsNzIwLDgsMTYsMCwwLDczNiw4LDE2LDAsMCw3NTIsOCwxNiwwLDAsNzY4LDgsMTYsMCwwLDc4NCw4LDE2LDAsMCw4MDAsOCwxNiwwLDAsODE2LDgsMTYsMCwwLDgzMiw4LDE2LDAsMCw4NDgsOCwxNiwwLDAsODY0LDgsMTYsMCwwLDg4MCw4LDE2LDAsMCw4OTYsOCwxNiwwLDAsOTEyLDgsMTYsMCwwLDkyOCw4LDE2LDAsMCw5NDQsOCwxNiwwLDAsOTYwLDgsMTYsMCwwLDk3Niw4LDE2LDAsMCw5OTIsOCwxNiwwLDAsMTAwOCw4LDE2LDAsMCwxMDI0LDgsMTYsMCwwLDEwNDAsOCwxNiwwLDAsMTA1Niw4LDE2LDAsMCwxMDcyLDgsMTYsMCwwLDEwODgsOCwxNiwwLDAsMTEwNCw4LDE2LDAsMCwxMTIwLDgsMTYsMCwwLDExMzYsOCwxNiwwLDAsMTE1Miw4LDE2LDAsMCwxMTY4LDgsMTYsMCwwLDExODQsOCwxNiwwLDAsMTIwMCw4LDE2LDAsMCwxMjE2LDgsMTYsMCwwLDEyMzIsOCwxNiwwLDAsMTI0OCw4LDE2LDAsMCwxMjY0LDgsMTYsMCwwLDEyODAsOCwxNiwwLDAsMTI5Niw4LDE2LDAsMCwxMzEyLDgsMTYsMCwwLDEzMjgsOCwxNiwwLDAsMTM0NCw4LDE2LDAsMCwxMzYwLDgsMTYsMCwwLDEzNzYsOCwxNiwwLDAsMTM5Miw4LDE2LDAsMCwxNDA4LDgsMTYsMCwwLDE0MjQsOCwxNiwwLDAsMTQ0MCw4LDE2LDAsMCwxNDU2LDgsMTYsMCwwLDE0NzIsOCwxNiwwLDAsMTQ4OCw4LDE2LDAsMCwxNTA0LDgsMTYsMCwwLDE1MjAsOCwxNiwwLDAsMTUzNiw4LDE2LDAsMCwxNTUyLDgsMTYsMCwwLDE1NjgsOCwxNiwwLDAsMTU4NCw4LDE2LDAsMCwxNjAwLDgsMTYsMCwwLDE2MTYsOCwxNiwwLDAsMTYzMiw4LDE2LDAsMCwxNjQ4LDgsMTYsMCwwLDE2NjQsOCwxNiwwLDAsMTY4MCw4LDE2LDAsMCwxNjk2LDgsMTYsMCwwLDE3MTIsOCwxNiwwLDAsMTcyOCw4LDE2LDAsMCwxNzQ0LDgsMTYsMCwwLDE3NjAsOCwxNiwwLDAsMTc3Niw4LDE2LDAsMCwxNzkyLDgsMTYsMCwwLDE4MDgsOCwxNiwwLDAsMTgyNCw4LDE2LDAsMCwxODQwLDgsMTYsMCwwLDE4NTYsOCwxNiwwLDAsMTg3Miw4LDE2LDAsMCwxODg4LDgsMTYsMCwwLDE5MDQsOCwxNiwwLDAsMTkyMCw4LDE2LDAsMCwxOTM2LDgsMTYsMCwwLDE5NTIsOCwxNiwwLDAsMTk2OCw4LDE2LDAsMCwxOTg0LDgsMTYsMCwwLDIwMDAsOCwxNiwwLDAsMjAxNiw4LDE2LDAsMCwyMDMyLDgsMTYsMCwwLDIwNDgsOCwxNiwwLDAsMjA2NCw4LDE2LDAsMCwyMDgwLDgsMTYsMCwwLDIwOTYsOCwxNiwwLDAsMjExMiw4LDE2LDAsMCwyMTI4LDgsMTYsMCwwLDIxNDQsOCwxNiwwLDAsMjE2MCw4LDE2LDAsMCwyMTc2LDgsMTYsMCwwLDIxOTIsOCwxNiwwLDAsMjIwOCw4LDE2LDAsMCwyMjI0LDgsMTYsMCwwLDIyNDAsOCwxNiwwLDAsMjI1Niw4LDE2LDAsMCwyMjcyLDgsMTYsMCwwLDIyODgsOCwxNiwwLDAsMjMwNCw4LDE2LDAsMCwyMzIwLDgsMTYsMCwwLDIzMzYsOCwxNiwwLDAsMjM1Miw4LDE2LDAsMCwyMzY4LDgsMTYsMCwwLDIzODQsOCwxNiwwLDAsMjQwMCw4LDE2LDAsMCwyNDE2LDgsMTYsMCwwLDI0MzIsOCwxNiwwLDAsMjQ0OCw4LDE2LDAsMCwyNDY0LDgsMTYsMCwwLDI0ODAsOCwxNiwwLDAsMjQ5Niw4LDE2LDAsMCwyNTEyLDgsMTYsMCwwLDI1MjgsOCwxNiwwLDAsMjU0NCw4LDE2LDAsMCwyNTYwLDgsMTYsMCwwLDI1NzYsOCwxNiwwLDAsMjU5Miw4LDE2LDAsMCwyNjA4LDgsMTYsMCwwLDI2MjQsOCwxNiwwLDAsMjY0MCw4LDE2LDAsMCwyNjU2LDgsMTYsMCwwLDI2NzIsOCwxNiwwLDAsMjY4OCw4LDE2LDAsMCwyNzA0LDgsMTYsMCwwLDI3MjAsOCwxNiwwLDAsMjczNiw4LDE2LDAsMCwyNzUyLDgsMTYsMCwwLDI3NjgsOCwxNiwwLDAsMjc4NCw4LDE2LDAsMCwyODAwLDgsMTYsMCwwLDI4MTYsOCwxNiwwLDAsMjgzMiw4LDE2LDAsMCwyODQ4LDgsMTYsMCwwLDI4NjQsOCwxNiwwLDAsMjg4MCw4LDE2LDAsMCwyODk2LDgsMTYsMCwwLDI5MTIsOCwxNiwwLDAsMjkyOCw4LDE2LDAsMCwyOTQ0LDgsMTYsMCwwLDI5NjAsOCwxNiwwLDAsMjk3Niw4LDE2LDAsMCwyOTkyLDgsMTYsMCwwLDMwMDgsOCwxNiwwLDAsMzAyNCw4LDE2LDAsMCwzMDQwLDgsMTYsMCwwLDMwNTYsOCwxNiwwLDAsMzA3Miw4LDE2LDAsMCwzMDg4LDgsMTYsMCwwLDMxMDQsOCwxNiwwLDAsMzEyMCw4LDE2LDAsMCwzMTM2LDgsMTYsMCwwLDMxNTIsOCwxNiwwLDAsMzE2OCw4LDE2LDAsMCwzMTg0LDgsMTYsMCwwLDMyMDAsOCwxNiwwLDAsMzIxNiw4LDE2LDAsMCwzMjMyLDgsMTYsMCwwLDMyNDgsOCwxNiwwLDAsMzI2NCw4LDE2LDAsMCwzMjgwLDgsMTYsMCwwLDMyOTYsOCwxNiwwLDAsMzMxMiw4LDE2LDAsMCwzMzI4LDgsMTYsMCwwLDMzNDQsOCwxNiwwLDAsMzM2MCw4LDE2LDAsMCwzMzc2LDgsMTYsMCwwLDMzOTIsOCwxNiwwLDAsMzQwOCw4LDE2LDAsMCwzNDI0LDgsMTYsMCwwLDM0NDAsOCwxNiwwLDAsMzQ1Niw4LDE2LDAsMCwzNDcyLDgsMTYsMCwwLDM0ODgsOCwxNiwwLDAsMzUwNCw4LDE2LDAsMCwzNTIwLDgsMTYsMCwwLDM1MzYsOCwxNiwwLDAsMzU1Miw4LDE2LDAsMCwzNTY4LDgsMTYsMCwwLDM1ODQsOCwxNiwwLDAsMzYwMCw4LDE2LDAsMCwzNjE2LDgsMTYsMCwwLDM2MzIsOCwxNiwwLDAsMzY0OCw4LDE2LDAsMCwzNjY0LDgsMTYsMCwwLDM2ODAsOCwxNiwwLDAsMzY5Niw4LDE2LDAsMCwzNzEyLDgsMTYsMCwwLDM3MjgsOCwxNiwwLDAsMzc0NCw4LDE2LDAsMCwzNzYwLDgsMTYsMCwwLDM3NzYsOCwxNiwwLDAsMzc5Miw4LDE2LDAsMCwzODA4LDgsMTYsMCwwLDM4MjQsOCwxNiwwLDAsMzg0MCw4LDE2LDAsMCwzODU2LDgsMTYsMCwwLDM4NzIsOCwxNiwwLDAsMzg4OCw4LDE2LDAsMCwzOTA0LDgsMTYsMCwwLDM5MjAsOCwxNiwwLDAsMzkzNiw4LDE2LDAsMCwzOTUyLDgsMTYsMCwwLDM5NjgsOCwxNiwwLDAsMzk4NCw4LDE2LDAsMCw0MDAwLDgsMTYsMCwwLDQwMTYsOCwxNiwwLDAsNDAzMiw4LDE2LDAsMCw0MDQ4LDgsMTYsMCwwLDQwNjQsOCwxNiwwLDAsNDA4MCw4LDE2LDAsMCx9Owotc3RhdGljIHJmYkZvbnREYXRhIGRlZmF1bHQ4eDE2Rm9udCA9IHsgZGVmYXVsdDh4MTZGb250RGF0YSwgZGVmYXVsdDh4MTZGb250TWV0YURhdGEgfTsKZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL25hY3JvLmMgYi9WaXN1YWxOYUNyby9uYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ5MmIwLi4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL25hY3JvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDEgKzAsMCBAQAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHJmYi9yZmIuaD4KLSNpbmNsdWRlIDxyZmIvcmZiY2xpZW50Lmg+Ci0KLSNpbmNsdWRlICJuYWNyby5oIgotCi0vKiBmb3IgdmlzdWFsIGdyZXBwaW5nICovCi10eXBlZGVmIHN0cnVjdCBpbWFnZV90IHsKLQlpbnQgd2lkdGgsaGVpZ2h0OwotCWNoYXIqIGJ1ZmZlcjsKLX0gaW1hZ2VfdDsKLQotLyogdGhpcyBpcyBhIFZOQyBjb25uZWN0aW9uICovCi10eXBlZGVmIHN0cnVjdCBwcml2YXRlX3Jlc291cmNlX3QgewotCWludCBsaXN0ZW5fcG9ydDsKLQlyZmJTY3JlZW5JbmZvKiBzZXJ2ZXI7Ci0JcmZiQ2xpZW50KiBjbGllbnQ7Ci0KLQl1aW50MzJfdCBrZXlzeW07Ci0JcmZiQm9vbCBrZXlkb3duOwotCi0JaW50IHgseTsKLQlpbnQgYnV0dG9uczsKLQotCWNoYXIqIHRleHRfY2xpZW50OwotCWNoYXIqIHRleHRfc2VydmVyOwotCi0JaW1hZ2VfdCogZ3JlcF9pbWFnZTsKLQlpbnQgeF9vcmlnaW4seV9vcmlnaW47Ci0KLQllbnVtIHsgU0xFRVAsVklTVUFMR1JFUCxXQUlURk9SVVBEQVRFIH0gc3RhdGU7Ci0JcmVzdWx0X3QgcmVzdWx0OwotfSBwcml2YXRlX3Jlc291cmNlX3Q7Ci0KLS8qIHJlc291cmNlIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBNQVhfUkVTT1VSQ0VfQ09VTlQgMjAKLQotc3RhdGljIHByaXZhdGVfcmVzb3VyY2VfdCByZXNvdXJjZV9wb29sW01BWF9SRVNPVVJDRV9DT1VOVF07Ci1zdGF0aWMgaW50IHJlc291cmNlX2NvdW50PTA7Ci0KLXN0YXRpYyBwcml2YXRlX3Jlc291cmNlX3QqIGdldF9yZXNvdXJjZShpbnQgcmVzb3VyY2UpCi17Ci0JaWYocmVzb3VyY2U+PU1BWF9SRVNPVVJDRV9DT1VOVCB8fCByZXNvdXJjZTwwIHx8IHJlc291cmNlX3Bvb2xbcmVzb3VyY2VdLmNsaWVudD09MCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHJlc291cmNlX3Bvb2wrcmVzb3VyY2U7Ci19Ci0KLXN0YXRpYyBwcml2YXRlX3Jlc291cmNlX3QqIGdldF9uZXh0X3Jlc291cmNlKHZvaWQpCi17Ci0JaWYocmVzb3VyY2VfY291bnQ8TUFYX1JFU09VUkNFX0NPVU5UKSB7Ci0JCW1lbXNldChyZXNvdXJjZV9wb29sK3Jlc291cmNlX2NvdW50LDAsc2l6ZW9mKHByaXZhdGVfcmVzb3VyY2VfdCkpOwotCQlyZXNvdXJjZV9jb3VudCsrOwotCQlyZXR1cm4gcmVzb3VyY2VfcG9vbCtyZXNvdXJjZV9jb3VudC0xOwotCX0gZWxzZSB7Ci0JCWludCBpOwotCi0JCWZvcihpPTA7aTxNQVhfUkVTT1VSQ0VfQ09VTlQgJiYgcmVzb3VyY2VfcG9vbFtpXS5jbGllbnQ7aSsrKTsKLQkJaWYoaTxNQVhfUkVTT1VSQ0VfQ09VTlQpCi0JCQlyZXR1cm4gcmVzb3VyY2VfcG9vbCtpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9yZXNvdXJjZShpbnQgcmVzb3VyY2UpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9Z2V0X3Jlc291cmNlKHJlc291cmNlKTsKLQlpZihyZXMpCi0JCXJlcy0+Y2xpZW50PU5VTEw7Ci19Ci0KLS8qIGhvb2tzICovCi0KLXN0YXRpYyB2b2lkIGdvdF9rZXkocmZiQm9vbCBkb3duLHJmYktleVN5bSBrZXlzeW0scmZiQ2xpZW50UmVjKiBjbCkKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHJlcz0ocHJpdmF0ZV9yZXNvdXJjZV90KiljbC0+c2NyZWVuLT5zY3JlZW5EYXRhOwotCQotCXJlcy0+a2V5ZG93bj1kb3duOwotCXJlcy0+a2V5c3ltPWtleXN5bTsKLQlyZXMtPnJlc3VsdHw9UkVTVUxUX0tFWTsKLX0KLQotc3RhdGljIHZvaWQgZ290X21vdXNlKGludCBidXR0b25zLGludCB4LGludCB5LHJmYkNsaWVudFJlYyogY2wpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9KHByaXZhdGVfcmVzb3VyY2VfdCopY2wtPnNjcmVlbi0+c2NyZWVuRGF0YTsKLQkKLQlyZXMtPmJ1dHRvbnM9YnV0dG9uczsKLQlyZXMtPng9eDsKLQlyZXMtPnk9eTsKLQlyZXMtPnJlc3VsdHw9UkVTVUxUX01PVVNFOwotfQotCi1zdGF0aWMgdm9pZCBnb3RfdGV4dChjaGFyKiBzdHIsaW50IGxlbixyZmJDbGllbnRSZWMqIGNsKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcmVzPShwcml2YXRlX3Jlc291cmNlX3QqKWNsLT5zY3JlZW4tPnNjcmVlbkRhdGE7Ci0KLQlpZiAocmVzLT50ZXh0X2NsaWVudCkKLQkJZnJlZShyZXMtPnRleHRfY2xpZW50KTsKLQlyZXMtPnRleHRfY2xpZW50PXN0cmR1cChzdHIpOwotCXJlcy0+cmVzdWx0fD1SRVNVTFRfVEVYVF9DTElFTlQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGdvdF90ZXh0X2Zyb21fc2VydmVyKHJmYkNsaWVudCogY2wsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHRleHRsZW4pCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9KHByaXZhdGVfcmVzb3VyY2VfdCopY2wtPmNsaWVudERhdGE7Ci0KLQlpZiAocmVzLT50ZXh0X3NlcnZlcikKLQkJZnJlZShyZXMtPnRleHRfc2VydmVyKTsKLQlyZXMtPnRleHRfc2VydmVyPXN0cmR1cChzdHIpOwotCXJlcy0+cmVzdWx0fD1SRVNVTFRfVEVYVF9TRVJWRVI7Ci19Ci0KLXN0YXRpYyByZmJCb29sIG1hbGxvY19mcmFtZV9idWZmZXIocmZiQ2xpZW50KiBjbCkKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHJlcz0ocHJpdmF0ZV9yZXNvdXJjZV90KiljbC0+Y2xpZW50RGF0YTsKLQotCWlmKCFyZXMtPnNlcnZlcikgewotCQlpbnQgdz1jbC0+d2lkdGgsaD1jbC0+aGVpZ2h0OwotCQkKLQkJcmVzLT5jbGllbnQtPmZyYW1lQnVmZmVyPW1hbGxvYyh3KjQqaCk7Ci0JCQotCQlyZXMtPnNlcnZlcj1yZmJHZXRTY3JlZW4oTlVMTCxOVUxMLHcsaCw4LDMsNCk7Ci0JCWlmKCFyZXMtPnNlcnZlcikKLSAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQkJcmVzLT5zZXJ2ZXItPnNjcmVlbkRhdGE9cmVzOwotCQlyZXMtPnNlcnZlci0+cG9ydD1yZXMtPmxpc3Rlbl9wb3J0OwotCQlyZXMtPnNlcnZlci0+ZnJhbWVCdWZmZXI9cmVzLT5jbGllbnQtPmZyYW1lQnVmZmVyOwotCQlyZXMtPnNlcnZlci0+a2JkQWRkRXZlbnQ9Z290X2tleTsKLQkJcmVzLT5zZXJ2ZXItPnB0ckFkZEV2ZW50PWdvdF9tb3VzZTsKLQkJcmVzLT5zZXJ2ZXItPnNldFhDdXRUZXh0PWdvdF90ZXh0OwotCQlyZmJJbml0U2VydmVyKHJlcy0+c2VydmVyKTsKLQl9IGVsc2UgewotCQkvKiBUT0RPOiByZWFsbG9jIGlmIG5lY2Vzc2FyeSAqLwotCQkvKiBUT0RPOiByZXNvbHV0aW9uIGNoYW5nZTogc2VuZCBOZXdGQlNpemUgKi8KLQkJLyogVE9ETzogaWYgdGhlIG9yaWdpbiBpcyBvdXQgb2YgYm91bmRzLCByZXNldCB0byAwICovCi0JfQotfQotCi1zdGF0aWMgYm9vbF90IGRvX3Zpc3VhbF9ncmVwKHByaXZhdGVfcmVzb3VyY2VfdCogcmVzLGludCB4LGludCB5LGludCB3LGludCBoKQotewotCXJmYkNsaWVudCogY2w7Ci0JaW1hZ2VfdCogaW1hZ2U7Ci0JaW50IHhfc3RhcnQseV9zdGFydCx4X2VuZD14K3ctMSx5X2VuZD15K2gtMTsKLQlib29sX3QgZm91bmQ9MDsKLQotCWlmKHJlcz09MCB8fCAoY2w9cmVzLT5jbGllbnQpPT0wIHx8IChpbWFnZT1yZXMtPmdyZXBfaW1hZ2UpPT0wKQotCQlyZXR1cm4gMDsKLQotCXhfc3RhcnQ9eC1pbWFnZS0+d2lkdGg7Ci0JeV9zdGFydD15LWltYWdlLT5oZWlnaHQ7Ci0JaWYoeF9zdGFydDwwKSB4X3N0YXJ0PTA7Ci0JaWYoeV9zdGFydDwwKSB5X3N0YXJ0PTA7Ci0JaWYoeF9lbmQraW1hZ2UtPndpZHRoPmNsLT53aWR0aCkgeF9lbmQ9Y2wtPndpZHRoLWltYWdlLT53aWR0aDsKLQlpZih5X2VuZCtpbWFnZS0+aGVpZ2h0PmNsLT5oZWlnaHQpIHlfZW5kPWNsLT5oZWlnaHQtaW1hZ2UtPmhlaWdodDsKLQkKLQkvKiBmaW5kIGltYWdlIGFuZCBzZXQgeF9vcmlnaW4seV9vcmlnaW4gaWYgZm91bmQgKi8KLQlmb3IoeT15X3N0YXJ0O3k8eV9lbmQ7eSsrKQotCQlmb3IoeD14X3N0YXJ0O3g8eF9lbmQ7eCsrKSB7Ci0JCQlib29sX3QgbWF0Y2hpbmc9MTsKLQkJCWludCBpLGo7Ci0JCQlmb3Ioaj0wO21hdGNoaW5nICYmIGo8aW1hZ2UtPmhlaWdodDtqKyspCi0JCQkJZm9yKGk9MDttYXRjaGluZyAmJiBpPGltYWdlLT53aWR0aDtpKyspCi0JCQkJCWlmKG1lbWNtcChjbC0+ZnJhbWVCdWZmZXIrNCooeCtpK2NsLT53aWR0aCooeStqKSksaW1hZ2UtPmJ1ZmZlcis0KihpK2ltYWdlLT53aWR0aCpqKSwzKSkKLQkJCQkJCW1hdGNoaW5nPTA7Ci0JCQlpZihtYXRjaGluZykgewotCQkJCXByaXZhdGVfcmVzb3VyY2VfdCogcmVzPShwcml2YXRlX3Jlc291cmNlX3QqKWNsLT5jbGllbnREYXRhOwotCQkJCXJlcy0+eF9vcmlnaW49eDsKLQkJCQlyZXMtPnlfb3JpZ2luPXk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdvdF9mcmFtZV9idWZmZXIocmZiQ2xpZW50KiBjbCxpbnQgeCxpbnQgeSxpbnQgdyxpbnQgaCkKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHJlcz0ocHJpdmF0ZV9yZXNvdXJjZV90KiljbC0+Y2xpZW50RGF0YTsKLQkKLQlhc3NlcnQocmVzLT5zZXJ2ZXIpOwotCQotCWlmKHJlcy0+Z3JlcF9pbWFnZSAmJiBkb192aXN1YWxfZ3JlcChyZXMseCx5LHcsaCkpIHsKLQkJcmVzLT5yZXN1bHR8PVJFU1VMVF9GT1VORElNQUdFOwotCX0KLQlpZihyZXMtPnNlcnZlcikgewotCQlyZmJNYXJrUmVjdEFzTW9kaWZpZWQocmVzLT5zZXJ2ZXIseCx5LHgrdyx5K2gpOwotCX0KLQotCXJlcy0+cmVzdWx0fD1SRVNVTFRfU0NSRUVOOwotfQotCi0vKiBpbml0L3NodXRkb3duIGZ1bmN0aW9ucyAqLwotCi1yZXNvdXJjZV90IGluaXR2bmMoY29uc3QgY2hhciogc2VydmVyLGludCBzZXJ2ZXJfcG9ydCxpbnQgbGlzdGVuX3BvcnQpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9Z2V0X25leHRfcmVzb3VyY2UoKTsKLQlpbnQgZHVtbXk9MDsKLQotCWlmKHJlcz09MCkKLQkJcmV0dXJuIC0xOwotCi0JLyogcmVtZW1iZXIgZm9yIGxhdGVyICovCi0JcmVzLT5saXN0ZW5fcG9ydD1saXN0ZW5fcG9ydDsKLQotCXJlcy0+dGV4dF9jbGllbnQgPSBOVUxMOwotCXJlcy0+dGV4dF9zZXJ2ZXIgPSBOVUxMOwotCi0JcmVzLT5jbGllbnQ9cmZiR2V0Q2xpZW50KDgsMyw0KTsKLQlyZXMtPmNsaWVudC0+Y2xpZW50RGF0YT0odm9pZCopcmVzOwotCXJlcy0+Y2xpZW50LT5Hb3RGcmFtZUJ1ZmZlclVwZGF0ZT1nb3RfZnJhbWVfYnVmZmVyOwotCXJlcy0+Y2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcj1tYWxsb2NfZnJhbWVfYnVmZmVyOwotCXJlcy0+Y2xpZW50LT5Hb3RYQ3V0VGV4dD1nb3RfdGV4dF9mcm9tX3NlcnZlcjsKLQlyZXMtPmNsaWVudC0+c2VydmVySG9zdD1zdHJkdXAoc2VydmVyKTsKLQlyZXMtPmNsaWVudC0+c2VydmVyUG9ydD1zZXJ2ZXJfcG9ydDsKLQlyZXMtPmNsaWVudC0+YXBwRGF0YS5lbmNvZGluZ3NTdHJpbmc9InJhdyI7Ci0JaWYoIXJmYkluaXRDbGllbnQocmVzLT5jbGllbnQsJmR1bW15LE5VTEwpKSB7Ci0JCXJlcy0+Y2xpZW50PU5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHJlcy1yZXNvdXJjZV9wb29sOwotfQotCi12b2lkIGNsb3Nldm5jKHJlc291cmNlX3QgcmVzb3VyY2UpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9Z2V0X3Jlc291cmNlKHJlc291cmNlKTsKLQlpZihyZXM9PTApCi0JCXJldHVybjsKLQotCWlmKHJlcy0+c2VydmVyKQotCQlyZmJTY3JlZW5DbGVhbnVwKHJlcy0+c2VydmVyKTsKLQotCWFzc2VydChyZXMtPmNsaWVudCk7Ci0KLQlyZmJDbGllbnRDbGVhbnVwKHJlcy0+Y2xpZW50KTsKLQotCXJlcy0+Y2xpZW50PU5VTEw7Ci19Ci0KLS8qIFBOTSAoaW1hZ2UpIGhlbHBlcnMgKi8KLQotYm9vbF90IHNhdmVwbm0ocmVzb3VyY2VfdCByZXNvdXJjZSxjb25zdCBjaGFyKiBmaWxlbmFtZSxpbnQgeDEsaW50IHkxLGludCB4MixpbnQgeTIpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByZXM9Z2V0X3Jlc291cmNlKHJlc291cmNlKTsKLQlpbnQgaSxqLHcsaDsKLQl1aW50MzJfdCogYnVmZmVyOwotCUZJTEUqIGY7Ci0JCi0JaWYocmVzPT0wIHx8IHJlcy0+Y2xpZW50PT0wKQotCQlyZXR1cm4gMDsKLQlhc3NlcnQocmVzLT5jbGllbnQtPmZvcm1hdC5kZXB0aD09MjQpOwotCi0Jdz1yZXMtPmNsaWVudC0+d2lkdGg7Ci0JaD1yZXMtPmNsaWVudC0+aGVpZ2h0OwotCWJ1ZmZlcj0odWludDMyX3QqKXJlcy0+Y2xpZW50LT5mcmFtZUJ1ZmZlcjsKLQotCWlmKHJlcz09MCB8fCB4MT54MiB8fCB5MT55MiB8fCB4MTwwIHx8IHgyPj13IHx8IHkxPDAgfHwgeTI+PWgpCi0JCXJldHVybiBGQUxTRTsKLQotCWY9Zm9wZW4oZmlsZW5hbWUsIndiIik7Ci0JCi0JaWYoZj09MCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JZnByaW50ZihmLCJQNlxuJWQgJWRcbjI1NVxuIiwxK3gyLXgxLDEreTIteTEpOwotCWZvcihqPXkxO2o8PXkyO2orKykKLQkJZm9yKGk9eDE7aTw9eDI7aSsrKSB7Ci0JCQlmd3JpdGUoYnVmZmVyK2kraip3LDMsMSxmKTsKLQkJfQotCWlmKGZjbG9zZShmKSkKLQkJcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgaW1hZ2VfdCogbG9hZHBubShjb25zdCBjaGFyKiBmaWxlbmFtZSkKLXsKLQlGSUxFKiBmPWZvcGVuKGZpbGVuYW1lLCJyYiIpOwotCWNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBpLGosdyxoOwotCWltYWdlX3QqIGltYWdlOwotCQotCWlmKGY9PTApCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCFmZ2V0cyhidWZmZXIsMTAyNCxmKSB8fCBzdHJjbXAoIlA2XG4iLGJ1ZmZlcikpIHsKLQkJZmNsb3NlKGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkbyB7Ci0JCWZnZXRzKGJ1ZmZlciwxMDI0LGYpOwotCQlpZihmZW9mKGYpKSB7Ci0JCQlmY2xvc2UoZik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gd2hpbGUoYnVmZmVyWzBdPT0nIycpOwotCi0JaWYoIHNzY2FuZihidWZmZXIsIiVkICVkIiwmdywmaCkhPTIKLQkJCXx8ICFmZ2V0cyhidWZmZXIsMTAyNCxmKSB8fCBzdHJjbXAoIjI1NVxuIixidWZmZXIpKSB7Ci0JCWZjbG9zZShmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQkKLQlpbWFnZT0oaW1hZ2VfdCopbWFsbG9jKHNpemVvZihpbWFnZV90KSk7Ci0JaW1hZ2UtPndpZHRoPXc7Ci0JaW1hZ2UtPmhlaWdodD1oOwotCWltYWdlLT5idWZmZXI9bWFsbG9jKHcqNCpoKTsKLQlpZighaW1hZ2UtPmJ1ZmZlcikgewotCQlmY2xvc2UoZik7Ci0JCWZyZWUoaW1hZ2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JZm9yKGo9MDtqPGg7aisrKQotCQlmb3IoaT0wO2k8dztpKyspCi0JCQlpZihmcmVhZChpbWFnZS0+YnVmZmVyKzQqKGkrdypqKSwzLDEsZikhPTEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiQ291bGQgbm90IHJlYWQgMyBieXRlcyBhdCAlZCwlZFxuIixpLGopOwotCQkJCWZjbG9zZShmKTsKLQkJCQlmcmVlKGltYWdlLT5idWZmZXIpOwotCQkJCWZyZWUoaW1hZ2UpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCi0JZmNsb3NlKGYpOwotCQotCXJldHVybiBpbWFnZTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9pbWFnZShpbWFnZV90KiBpbWFnZSkKLXsKLQlpZihpbWFnZS0+YnVmZmVyKQotCQlmcmVlKGltYWdlLT5idWZmZXIpOwotCWZyZWUoaW1hZ2UpOwotfQotCi1zdGF0aWMgdm9pZCBjb3B5X2xpbmUocmZiU2NyZWVuSW5mbyAqZGVzdCwgY2hhciAqYmFja3VwLAotCQlpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEsIGludCBjb2xvcl9vZmZzZXQpCi17Ci0JdWludDhfdCAqZCA9ICh1aW50OF90ICopZGVzdC0+ZnJhbWVCdWZmZXIsICpzID0gKHVpbnQ4X3QgKiliYWNrdXA7Ci0JaW50IGk7Ci0JaW50IHN0ZXBzMCA9IHgxID4geDAgPyB4MSAtIHgwIDogeDAgLSB4MTsKLQlpbnQgc3RlcHMxID0geTEgPiB5MCA/IHkxIC0geTAgOiB5MCAtIHkxOwotCi0JaWYgKHN0ZXBzMSA+IHN0ZXBzMCkKLQkJc3RlcHMwID0gc3RlcHMxOwotCWVsc2UgaWYgKHN0ZXBzMCA9PSAwKQotCQlzdGVwczAgPSAxOwotCi0JZm9yIChpID0gMDsgaSA8PSBzdGVwczA7IGkrKykgewotCQlpbnQgaiwgaW5kZXggPSA0ICogKHgwICsgaSAqICh4MSAtIHgwKSAvIHN0ZXBzMAotCQkJCSsgZGVzdC0+d2lkdGggKiAoeTAgKyBpICogKHkxIC0geTApIC8gc3RlcHMwKSk7Ci0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0JCQlkW2luZGV4ICsgal0gPSBzW2luZGV4ICsgal0gKyBjb2xvcl9vZmZzZXQ7Ci0JfQotCi0JcmZiTWFya1JlY3RBc01vZGlmaWVkKGRlc3QsIHgwIC0gNSwgeTAgLSA1LCB4MSArIDEsIHkxICsgMik7Ci19Ci0KLXJlc3VsdF90IGRpc3BsYXlwbm0ocmVzb3VyY2VfdCByZXNvdXJjZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCWNvb3JkaW5hdGVfdCB4LCBjb29yZGluYXRlX3QgeSwgYm9vbF90IGJvcmRlciwKLQkJdGltZW91dF90IHRpbWVvdXRfaW5fc2Vjb25kcykKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHJlcyA9IGdldF9yZXNvdXJjZShyZXNvdXJjZSk7Ci0JaW1hZ2VfdCAqaW1hZ2U7Ci0JY2hhciogZmFrZV9mcmFtZV9idWZmZXI7Ci0JY2hhciogYmFja3VwOwotCWludCB3LCBoLCBpLCBqLCB3MiwgaDI7Ci0JcmVzdWx0X3QgcmVzdWx0OwotCi0JaWYgKHJlcyA9PSBOVUxMIHx8IHJlcy0+c2VydmVyID09IE5VTEwgfHwKLQkJCShpbWFnZSA9IGxvYWRwbm0oZmlsZW5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQkKLQl3ID0gcmVzLT5zZXJ2ZXItPndpZHRoOwotCWggPSByZXMtPnNlcnZlci0+aGVpZ2h0OwotCWZha2VfZnJhbWVfYnVmZmVyID0gbWFsbG9jKHcgKiA0ICogaCk7Ci0JaWYoIWZha2VfZnJhbWVfYnVmZmVyKQotCQlyZXR1cm4gMDsKLQltZW1jcHkoZmFrZV9mcmFtZV9idWZmZXIsIHJlcy0+c2VydmVyLT5mcmFtZUJ1ZmZlciwgdyAqIDQgKiBoKTsKLQkKLQliYWNrdXAgPSByZXMtPnNlcnZlci0+ZnJhbWVCdWZmZXI7Ci0JcmVzLT5zZXJ2ZXItPmZyYW1lQnVmZmVyID0gZmFrZV9mcmFtZV9idWZmZXI7Ci0KLQl3MiA9IGltYWdlLT53aWR0aDsKLQlpZiAoeCArIHcyID4gdykKLQkJdzIgPSB3IC0geDsKLQloMiA9IGltYWdlLT5oZWlnaHQ7Ci0JaWYgKHkgKyBoMiA+IGgpCi0JCWgyID0gaCAtIHk7Ci0JZm9yIChqID0gMDsgaiA8IGgyOyBqKyspCi0JCW1lbWNweShmYWtlX2ZyYW1lX2J1ZmZlciArIDQgKiAoeCArICh5ICsgaikgKiB3KSwKLQkJCWltYWdlLT5idWZmZXIgKyBqICogNCAqIGltYWdlLT53aWR0aCwgNCAqIHcyKTsKLQlmcmVlKGltYWdlKTsKLQlpZiAoYm9yZGVyKSB7Ci0JCWNvcHlfbGluZShyZXMtPnNlcnZlciwgYmFja3VwLCB4LCB5LCB4ICsgdzIsIHksIDB4ODApOwotCQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeCwgeSwgeCwgeSArIGgyLCAweDgwKTsKLQkJY29weV9saW5lKHJlcy0+c2VydmVyLCBiYWNrdXAsIHggKyB3MiwgeSwgeCArIHcyLCB5ICsgaDIsIDB4ODApOwotCQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeCwgeSArIGgyLCB4ICsgdzIsIHkgKyBoMiwgMHg4MCk7Ci0JfQotCXJmYk1hcmtSZWN0QXNNb2RpZmllZChyZXMtPnNlcnZlciwKLQkJCXggLSAxLCB5IC0gMSwgeCArIHcyICsgMSwgeSArIGgyICsgMSk7Ci0KLQlyZXN1bHQgPSB3YWl0Zm9yaW5wdXQocmVzb3VyY2UsIHRpbWVvdXRfaW5fc2Vjb25kcyk7Ci0KLQlyZXMtPnNlcnZlci0+ZnJhbWVCdWZmZXI9YmFja3VwOwotCWZyZWUoZmFrZV9mcmFtZV9idWZmZXIpOwotCXJmYk1hcmtSZWN0QXNNb2RpZmllZChyZXMtPnNlcnZlciwKLQkJCXggLSAxLCB5IC0gMSwgeCArIHcyICsgMSwgeSArIGgyICsgMSk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBwcm9jZXNzKCkgYW5kIGZyaWVuZHMgKi8KLQotLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9ubHkgaWYgcmVzLT5yZXN1bHQgaW4gcmV0dXJuX21hc2sgKi8KLXN0YXRpYyByZXN1bHRfdCBwcml2YXRlX3Byb2Nlc3MocmVzb3VyY2VfdCByZXNvdXJjZSx0aW1lb3V0X3QgdGltZW91dF9pbl9zZWNvbmRzLHJlc3VsdF90IHJldHVybl9tYXNrKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcmVzPWdldF9yZXNvdXJjZShyZXNvdXJjZSk7Ci0JZmRfc2V0IGZkczsKLQlzdHJ1Y3QgdGltZXZhbCB0dix0dl9zdGFydCx0dl9lbmQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0PSh1bnNpZ25lZCBsb25nKSh0aW1lb3V0X2luX3NlY29uZHMqMTAwMDAwMFVMKTsKLQlpbnQgY291bnQsbWF4X2ZkOwotCi0JaWYocmVzPT0wKQotCQlyZXR1cm4gMDsKLQotCWFzc2VydChyZXMtPmNsaWVudCk7Ci0KLQlnZXR0aW1lb2ZkYXkoJnR2X3N0YXJ0LE5VTEwpOwotCXJlcy0+cmVzdWx0PTA7Ci0KLQlkbyB7Ci0JCXVuc2lnbmVkIGxvbmcgdGltZW91dF9kb25lOwotCi0JCWlmKHJlcy0+c2VydmVyKSB7Ci0JCQlyZmJCb29sIGxvb3A7Ci0JCQlkbyB7Ci0JCQkJbG9vcD1yZmJQcm9jZXNzRXZlbnRzKHJlcy0+c2VydmVyLHJlcy0+c2VydmVyLT5kZWZlclVwZGF0ZVRpbWUpOwotCQkJfSB3aGlsZShsb29wICYmIChyZXMtPnJlc3VsdCZyZXR1cm5fbWFzayk9PTAKLQkJCQkmJiByZmJJc0FjdGl2ZShyZXMtPnNlcnZlcikpOwotCi0JCQlpZighcmZiSXNBY3RpdmUocmVzLT5zZXJ2ZXIpKQotCQkJCXJldHVybiBSRVNVTFRfU0hVVERPV047Ci0KLQkJCWlmKChyZXMtPnJlc3VsdCZyZXR1cm5fbWFzaykhPTApCi0JCQkJcmV0dXJuIHJlcy0+cmVzdWx0OwotCi0JCQltZW1jcHkoKGNoYXIqKSZmZHMsKGNvbnN0IGNoYXIqKSYocmVzLT5zZXJ2ZXItPmFsbEZkcyksc2l6ZW9mKGZkX3NldCkpOwotCQkJbWF4X2ZkPXJlcy0+c2VydmVyLT5tYXhGZDsKLQkJfSBlbHNlIHsKLQkJCUZEX1pFUk8oJmZkcyk7Ci0JCQltYXhfZmQ9MDsKLQkJfQotCQlGRF9TRVQocmVzLT5jbGllbnQtPnNvY2ssJmZkcyk7Ci0JCWlmKHJlcy0+Y2xpZW50LT5zb2NrPm1heF9mZCkKLQkJCW1heF9mZD1yZXMtPmNsaWVudC0+c29jazsKLQotCQlnZXR0aW1lb2ZkYXkoJnR2X2VuZCxOVUxMKTsKLQkJdGltZW91dF9kb25lPXR2X2VuZC50dl91c2VjLXR2X3N0YXJ0LnR2X3VzZWMrCi0JCQkxMDAwMDAwTCoodHZfZW5kLnR2X3NlYy10dl9zdGFydC50dl9zZWMpOwotCQlpZih0aW1lb3V0X2RvbmU+PXRpbWVvdXQpCi0JCQlyZXR1cm4gUkVTVUxUX1RJTUVPVVQ7Ci0KLQkJdHYudHZfdXNlYz0oKHRpbWVvdXQtdGltZW91dF9kb25lKSUxMDAwMDAwKTsKLQkJdHYudHZfc2VjPSh0aW1lb3V0LXRpbWVvdXRfZG9uZSkvMTAwMDAwMDsKLQotCQljb3VudD1zZWxlY3QobWF4X2ZkKzEsJmZkcyxOVUxMLE5VTEwsJnR2KTsKLQkJaWYoY291bnQ8MCkKLQkJCXJldHVybiAwOwotCi0JCWlmKGNvdW50PjApIHsKLQkJCWlmKEZEX0lTU0VUKHJlcy0+Y2xpZW50LT5zb2NrLCZmZHMpKSB7Ci0JCQkJaWYoIUhhbmRsZVJGQlNlcnZlck1lc3NhZ2UocmVzLT5jbGllbnQpKSB7Ci0JCQkJCWNsb3Nldm5jKHJlc291cmNlKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWlmKChyZXMtPnJlc3VsdCZyZXR1cm5fbWFzaykhPTApCi0JCQkJCXJldHVybiByZXMtPnJlc3VsdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlcy0+cmVzdWx0fD1SRVNVTFRfVElNRU9VVDsKLQkJCXJldHVybiByZXMtPnJlc3VsdDsKLQkJfQotCX0gd2hpbGUoMSk7Ci0KLQlyZXR1cm4gUkVTVUxUX1RJTUVPVVQ7Ci19Ci0KLXJlc3VsdF90IHByb2Nlc3MocmVzb3VyY2VfdCByZXMsdGltZW91dF90IHRpbWVvdXQpCi17Ci0JcmV0dXJuIHByaXZhdGVfcHJvY2VzcyhyZXMsdGltZW91dCxSRVNVTFRfVElNRU9VVCk7Ci19Ci0KLXJlc3VsdF90IHdhaXRmb3Jhbnl0aGluZyhyZXNvdXJjZV90IHJlcyx0aW1lb3V0X3QgdGltZW91dCkKLXsKLQlyZXR1cm4gcHJpdmF0ZV9wcm9jZXNzKHJlcyx0aW1lb3V0LC0xKTsKLX0KLQotcmVzdWx0X3Qgd2FpdGZvcmlucHV0KHJlc291cmNlX3QgcmVzLHRpbWVvdXRfdCB0aW1lb3V0KQotewotCXJldHVybiBwcml2YXRlX3Byb2Nlc3MocmVzLHRpbWVvdXQsUkVTVUxUX0tFWXxSRVNVTFRfTU9VU0V8UkVTVUxUX1RJTUVPVVQpOwotfQotCi1yZXN1bHRfdCB3YWl0Zm9ydXBkYXRlKHJlc291cmNlX3QgcmVzLHRpbWVvdXRfdCB0aW1lb3V0KQotewotCXJldHVybiBwcml2YXRlX3Byb2Nlc3MocmVzLHRpbWVvdXQsUkVTVUxUX1NDUkVFTnxSRVNVTFRfVElNRU9VVCk7Ci19Ci0KLXJlc3VsdF90IHZpc3VhbGdyZXAocmVzb3VyY2VfdCByZXNvdXJjZSxjb25zdCBjaGFyKiBmaWxlbmFtZSx0aW1lb3V0X3QgdGltZW91dCkKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHJlcz1nZXRfcmVzb3VyY2UocmVzb3VyY2UpOwotCWltYWdlX3QqIGltYWdlOwotCXJlc3VsdF90IHJlc3VsdDsKLQotCWlmKHJlcz09MCB8fCByZXMtPmNsaWVudD09MCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBsb2FkIGZpbGVuYW1lIGFuZCBzZXQgcmVzLT5ncmVwX2ltYWdlIHRvIHRoaXMgaW1hZ2UgKi8KLQlpbWFnZT1sb2FkcG5tKGZpbGVuYW1lKTsKLQlpZihpbWFnZT09MCkKLQkJcmV0dXJuIDA7Ci0JaWYocmVzLT5ncmVwX2ltYWdlKQotCQlmcmVlX2ltYWdlKHJlcy0+Z3JlcF9pbWFnZSk7Ci0JcmVzLT5ncmVwX2ltYWdlPWltYWdlOwotCi0JaWYoZG9fdmlzdWFsX2dyZXAocmVzLDAsMCxyZXMtPmNsaWVudC0+d2lkdGgscmVzLT5jbGllbnQtPmhlaWdodCkpCi0JCXJldHVybiBSRVNVTFRfRk9VTkRJTUFHRTsKLQotCXJlc3VsdD1wcml2YXRlX3Byb2Nlc3MocmVzb3VyY2UsdGltZW91dCxSRVNVTFRfRk9VTkRJTUFHRXxSRVNVTFRfVElNRU9VVCk7Ci0KLQkvKiBmcmVlIGltYWdlICovCi0JaWYocmVzLT5ncmVwX2ltYWdlKSB7Ci0JCWZyZWVfaW1hZ2UocmVzLT5ncmVwX2ltYWdlKTsKLQkJcmVzLT5ncmVwX2ltYWdlPU5VTEw7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogYXV4aWxpYXJ5IGZ1bmN0aW9uIGZvciBhbGVydCAqLwotCi0jaW5jbHVkZSAiZGVmYXVsdDh4MTYuaCIKLQotc3RhdGljIHZvaWQgY2VudGVyX3RleHQocmZiU2NyZWVuSW5mbyogc2NyZWVuLGNvbnN0IGNoYXIqIG1lc3NhZ2UsaW50KiB4LGludCogeSxpbnQqIHcsaW50KiBoKQotewotCXJmYkZvbnREYXRhKiBmb250PSZkZWZhdWx0OHgxNkZvbnQ7Ci0JY29uc3QgY2hhciogcG9pbnRlcjsKLQlpbnQgaix4MSx5MSx4Mix5MixsaW5lX2NvdW50PTA7Ci0JaWYobWVzc2FnZT09MCB8fCBzY3JlZW49PTApCi0JCXJldHVybjsKLQlyZmJXaG9sZUZvbnRCQm94KGZvbnQsJngxLCZ5MSwmeDIsJnkyKTsKLQlmb3IobGluZV9jb3VudD0xLHBvaW50ZXI9bWVzc2FnZTsqcG9pbnRlcjtwb2ludGVyKyspCi0JCWlmKCpwb2ludGVyPT0nXG4nKQotCQkJbGluZV9jb3VudCsrOwotCQotCSpoPSh5Mi15MSkqbGluZV9jb3VudDsKLQlhc3NlcnQoKmg+MCk7Ci0KLQlpZigqaD5zY3JlZW4tPmhlaWdodCkKLQkJKmg9c2NyZWVuLT5oZWlnaHQ7Ci0KLQkqeD0wOyAqdz1zY3JlZW4tPndpZHRoOyAqeT0oc2NyZWVuLT5oZWlnaHQtKmgpLzI7Ci0KLQlyZmJGaWxsUmVjdChzY3JlZW4sKngsKnksKngrKncsKnkrKmgsMHhmZjAwMDApOwotCi0JZm9yKHBvaW50ZXI9bWVzc2FnZSxqPTA7ajxsaW5lX2NvdW50O2orKykgewotCQljb25zdCBjaGFyKiBlb2w7Ci0JCWludCB4X2N1cix5X2N1cj0qeS15MStqKih5Mi15MSksd2lkdGg7Ci0JCQotCQlmb3Iod2lkdGg9MCxlb2w9cG9pbnRlcjsqZW9sICYmICplb2whPSdcbic7ZW9sKyspCi0JCQl3aWR0aCs9cmZiV2lkdGhPZkNoYXIoZm9udCwqZW9sKTsKLQkJaWYod2lkdGg+c2NyZWVuLT53aWR0aCkKLQkJCXdpZHRoPXNjcmVlbi0+d2lkdGg7Ci0KLQkJeF9jdXI9KHNjcmVlbi0+d2lkdGgtd2lkdGgpLzI7Ci0JCWZvcig7cG9pbnRlciE9ZW9sO3BvaW50ZXIrKykKLQkJCXhfY3VyKz1yZmJEcmF3Q2hhcldpdGhDbGlwKHNjcmVlbixmb250LAotCQkJCQl4X2N1cix5X2N1ciwqcG9pbnRlciwKLQkJCQkJMCwwLHNjcmVlbi0+d2lkdGgsc2NyZWVuLT5oZWlnaHQsCi0JCQkJCTB4ZmZmZmZmZmYsMHhmZmZmZmZmZik7Ci0JCXBvaW50ZXIrKzsKLQl9Ci0JcmZiTWFya1JlY3RBc01vZGlmaWVkKHNjcmVlbiwqeCwqeSwqeCsqdywqeSsqaCk7Ci19Ci0KLS8qIHRoaXMgaXMgYW4gb3ZlcmxheSB3aGljaCBpcyBzaG93biBmb3IgYSBjZXJ0YWluIHRpbWUgKi8KLQotcmVzdWx0X3QgYWxlcnQocmVzb3VyY2VfdCByZXNvdXJjZSxjb25zdCBjaGFyKiBtZXNzYWdlLHRpbWVvdXRfdCB0aW1lb3V0KQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcmVzPWdldF9yZXNvdXJjZShyZXNvdXJjZSk7Ci0JY2hhciogZmFrZV9mcmFtZV9idWZmZXI7Ci0JY2hhciogYmFja3VwOwotCWludCB4LHksdyxoOwotCXJlc3VsdF90IHJlc3VsdDsKLQkKLQlpZihyZXMgPT0gTlVMTCB8fCByZXMtPnNlcnZlcj09TlVMTCkKLQkJcmV0dXJuIC0xOwotCi0Jdz1yZXMtPnNlcnZlci0+d2lkdGg7Ci0JaD1yZXMtPnNlcnZlci0+aGVpZ2h0OwotCQotCWZha2VfZnJhbWVfYnVmZmVyPW1hbGxvYyh3KjQqaCk7Ci0JaWYoIWZha2VfZnJhbWVfYnVmZmVyKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KGZha2VfZnJhbWVfYnVmZmVyLHJlcy0+c2VydmVyLT5mcmFtZUJ1ZmZlcix3KjQqaCk7Ci0JCi0JYmFja3VwPXJlcy0+c2VydmVyLT5mcmFtZUJ1ZmZlcjsKLQlyZXMtPnNlcnZlci0+ZnJhbWVCdWZmZXI9ZmFrZV9mcmFtZV9idWZmZXI7Ci0JY2VudGVyX3RleHQocmVzLT5zZXJ2ZXIsbWVzc2FnZSwmeCwmeSwmdywmaCk7Ci0JZnByaW50ZihzdGRlcnIsIiVzXG4iLG1lc3NhZ2UpOwotCi0JcmVzdWx0PXdhaXRmb3JpbnB1dChyZXNvdXJjZSx0aW1lb3V0KTsKLQotCXJlcy0+c2VydmVyLT5mcmFtZUJ1ZmZlcj1iYWNrdXA7Ci0JZnJlZShmYWtlX2ZyYW1lX2J1ZmZlcik7Ci0JcmZiTWFya1JlY3RBc01vZGlmaWVkKHJlcy0+c2VydmVyLHgseSx4K3cseStoKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiBpbnNwZWN0IGxhc3QgZXZlbnRzICovCi0KLWtleXN5bV90IGdldGtleXN5bShyZXNvdXJjZV90IHJlcykKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHI9Z2V0X3Jlc291cmNlKHJlcyk7Ci0JcmV0dXJuIHItPmtleXN5bTsKLX0KLQotYm9vbF90IGdldGtleWRvd24ocmVzb3VyY2VfdCByZXMpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByPWdldF9yZXNvdXJjZShyZXMpOwotCXJldHVybiByLT5rZXlkb3duOwotfQotCi1jb29yZGluYXRlX3QgZ2V0eChyZXNvdXJjZV90IHJlcykKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHI9Z2V0X3Jlc291cmNlKHJlcyk7Ci0JcmV0dXJuIHItPng7Ci19Ci0KLWNvb3JkaW5hdGVfdCBnZXR5KHJlc291cmNlX3QgcmVzKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlyZXR1cm4gci0+eTsKLX0KLQotYnV0dG9uc190IGdldGJ1dHRvbnMocmVzb3VyY2VfdCByZXMpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByPWdldF9yZXNvdXJjZShyZXMpOwotCXJldHVybiByLT5idXR0b25zOwotfQotCi1jb25zdCBjaGFyICpnZXR0ZXh0X2NsaWVudChyZXNvdXJjZV90IHJlcykKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHI9Z2V0X3Jlc291cmNlKHJlcyk7Ci0JcmV0dXJuIHItPnRleHRfY2xpZW50OwotfQotCi1yZXN1bHRfdCBydWJiZXJiYW5kKHJlc291cmNlX3QgcmVzb3VyY2UsIGNvb3JkaW5hdGVfdCB4MCwgY29vcmRpbmF0ZV90IHkwKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcmVzPWdldF9yZXNvdXJjZShyZXNvdXJjZSk7Ci0JY2hhciogZmFrZV9mcmFtZV9idWZmZXI7Ci0JY2hhciogYmFja3VwOwotCWludCB3LCBoLCB4LCB5OwotCQotCWlmKHJlcyA9PSBOVUxMIHx8IHJlcy0+c2VydmVyPT1OVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQl4ID0gcmVzLT54OwotCXkgPSByZXMtPnk7Ci0JdyA9IHJlcy0+c2VydmVyLT53aWR0aDsKLQloID0gcmVzLT5zZXJ2ZXItPmhlaWdodDsKLQlmYWtlX2ZyYW1lX2J1ZmZlciA9IG1hbGxvYyh3ICogNCAqIGgpOwotCWlmKCFmYWtlX2ZyYW1lX2J1ZmZlcikKLQkJcmV0dXJuIDA7Ci0JbWVtY3B5KGZha2VfZnJhbWVfYnVmZmVyLCByZXMtPnNlcnZlci0+ZnJhbWVCdWZmZXIsIHcgKiA0ICogaCk7Ci0JCi0JYmFja3VwID0gcmVzLT5zZXJ2ZXItPmZyYW1lQnVmZmVyOwotCXJlcy0+c2VydmVyLT5mcmFtZUJ1ZmZlciA9IGZha2VfZnJhbWVfYnVmZmVyOwotCi0Jd2hpbGUgKHJlcy0+YnV0dG9ucykgewotCQlyZXN1bHRfdCByID0gd2FpdGZvcmlucHV0KHJlc291cmNlLCAxMDAwMDAwTCk7Ci0JCWlmICh4ID09IHJlcy0+eCAmJiB5ID09IHJlcy0+eSkKLQkJCQljb250aW51ZTsKLQkJY29weV9saW5lKHJlcy0+c2VydmVyLCBiYWNrdXAsIHgwLCB5MCwgeCwgeTAsIDApOwotCQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeDAsIHkwLCB4MCwgeSwgMCk7Ci0JCWNvcHlfbGluZShyZXMtPnNlcnZlciwgYmFja3VwLCB4LCB5MCwgeCwgeSwgMCk7Ci0JCWNvcHlfbGluZShyZXMtPnNlcnZlciwgYmFja3VwLCB4MCwgeSwgeCwgeSwgMCk7Ci0JCXggPSByZXMtPng7Ci0JCXkgPSByZXMtPnk7Ci0JCWNvcHlfbGluZShyZXMtPnNlcnZlciwgYmFja3VwLCB4MCwgeTAsIHgsIHkwLCAweDgwKTsKLQkJY29weV9saW5lKHJlcy0+c2VydmVyLCBiYWNrdXAsIHgwLCB5MCwgeDAsIHksIDB4ODApOwotCQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeCwgeTAsIHgsIHksIDB4ODApOwotCQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeDAsIHksIHgsIHksIDB4ODApOwotCX0KLQotCWNvcHlfbGluZShyZXMtPnNlcnZlciwgYmFja3VwLCB4MCwgeTAsIHgsIHkwLCAwKTsKLQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeDAsIHkwLCB4MCwgeSwgMCk7Ci0JY29weV9saW5lKHJlcy0+c2VydmVyLCBiYWNrdXAsIHgsIHkwLCB4LCB5LCAwKTsKLQljb3B5X2xpbmUocmVzLT5zZXJ2ZXIsIGJhY2t1cCwgeDAsIHksIHgsIHksIDApOwotCi0JcmVzLT5zZXJ2ZXItPmZyYW1lQnVmZmVyPWJhY2t1cDsKLQlmcmVlKGZha2VfZnJhbWVfYnVmZmVyKTsKLQotCXJldHVybiBSRVNVTFRfTU9VU0U7Ci19Ci0KLWNvbnN0IGNoYXIgKmdldHRleHRfc2VydmVyKHJlc291cmNlX3QgcmVzKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlyZXR1cm4gci0+dGV4dF9zZXJ2ZXI7Ci19Ci0KLS8qIHNlbmQgZXZlbnRzIHRvIHRoZSBzZXJ2ZXIgKi8KLQotYm9vbF90IHNlbmRrZXkocmVzb3VyY2VfdCByZXMsa2V5c3ltX3Qga2V5c3ltLGJvb2xfdCBrZXlkb3duKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlpZihyPT1OVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gU2VuZEtleUV2ZW50KHItPmNsaWVudCxrZXlzeW0sa2V5ZG93bik7Ci19Ci0KLWJvb2xfdCBzZW5kYXNjaWkocmVzb3VyY2VfdCByZXMsY29uc3QgY2hhciAqc3RyaW5nKQotewotCXRpbWVvdXRfdCBkZWxheSA9IDAuMTsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHI9Z2V0X3Jlc291cmNlKHJlcyk7Ci0JaW50IGk7Ci0JaWYocj09TlVMTCkKLQkJcmV0dXJuIDA7Ci0Jd2hpbGUgKCpzdHJpbmcpIHsKLQkJaW50IGtleXN5bSA9ICpzdHJpbmc7Ci0JCWludCBuZWVkX3NoaWZ0ID0gMDsKLQotCQlpZiAoa2V5c3ltID49IDggJiYga2V5c3ltIDwgJyAnKQotCQkJa2V5c3ltICs9IDB4ZmYwMDsKLQkJZWxzZSBpZiAoa2V5c3ltID49ICdBJyAmJiBrZXlzeW0gPD0gJ1onKQotCQkJbmVlZF9zaGlmdCA9IDE7Ci0JCWVsc2UgaWYgKGtleXN5bSA+ICd+JykgewotCQkJZnByaW50ZihzdGRlcnIsICJTdHJpbmcgY29udGFpbnMgbm9uLUFTQ0lJICIKLQkJCQkJImNoYXJhY3RlciAweCUwMnhcbiIsICpzdHJpbmcpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJaWYgKG5lZWRfc2hpZnQpIHsKLQkJCWlmICghU2VuZEtleUV2ZW50KHItPmNsaWVudCwweGZmZTEsMSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJd2FpdGZvcmlucHV0KHIsZGVsYXkpOwotCQl9Ci0JCWZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoIVNlbmRLZXlFdmVudChyLT5jbGllbnQsa2V5c3ltLGkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCXdhaXRmb3JpbnB1dChyLGRlbGF5KTsKLQkJfQotCQlpZiAobmVlZF9zaGlmdCkgewotCQkJaWYgKCFTZW5kS2V5RXZlbnQoci0+Y2xpZW50LDB4ZmZlMSwwKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl3YWl0Zm9yaW5wdXQocixkZWxheSk7Ci0JCX0KLQkJc3RyaW5nKys7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3Qgc2VuZG1vdXNlKHJlc291cmNlX3QgcmVzLGNvb3JkaW5hdGVfdCB4LGNvb3JkaW5hdGVfdCB5LGJ1dHRvbnNfdCBidXR0b25zKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlpZihyPT1OVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gU2VuZFBvaW50ZXJFdmVudChyLT5jbGllbnQseCx5LGJ1dHRvbnMpOwotfQotCi1ib29sX3Qgc2VuZHRleHQocmVzb3VyY2VfdCByZXMsIGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLQlwcml2YXRlX3Jlc291cmNlX3QqIHI9Z2V0X3Jlc291cmNlKHJlcyk7Ci0JaWYocj09TlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFNlbmRDbGllbnRDdXRUZXh0KHItPmNsaWVudCwgKGNoYXIgKilzdHJpbmcsIChpbnQpc3RybGVuKHN0cmluZykpOwotfQotCi1ib29sX3Qgc2VuZHRleHRfdG9fc2VydmVyKHJlc291cmNlX3QgcmVzLCBjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0JcHJpdmF0ZV9yZXNvdXJjZV90KiByPWdldF9yZXNvdXJjZShyZXMpOwotCWlmKHI9PU5VTEwpCi0JCXJldHVybiAwOwotCXJmYlNlbmRTZXJ2ZXJDdXRUZXh0KHItPnNlcnZlciwgKGNoYXIgKilzdHJpbmcsIChpbnQpc3RybGVuKHN0cmluZykpOwotCXJldHVybiAxOwotfQotCi0vKiBmb3IgdmlzdWFsIGdyZXBwaW5nICovCi0KLWNvb3JkaW5hdGVfdCBnZXR4b3JpZ2luKHJlc291cmNlX3QgcmVzKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlyZXR1cm4gci0+eF9vcmlnaW47Ci19Ci0KLWNvb3JkaW5hdGVfdCBnZXR5b3JpZ2luKHJlc291cmNlX3QgcmVzKQotewotCXByaXZhdGVfcmVzb3VyY2VfdCogcj1nZXRfcmVzb3VyY2UocmVzKTsKLQlyZXR1cm4gci0+eV9vcmlnaW47Ci19Ci0KZGlmZiAtLWdpdCBhL1Zpc3VhbE5hQ3JvL25hY3JvLmggYi9WaXN1YWxOYUNyby9uYWNyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQwMDY3Li4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL25hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotI2lmbmRlZiBOQUNST19ICi0jZGVmaW5lIE5BQ1JPX0gKLQotI2lmZGVmIFNXSUcKLSVtb2R1bGUgbmFjcm8KLQotJXsKLQotLyogdHlwZXMgdXNlZCAqLwotCi0vKiAwPWZhbHNlLCBldmVyeSBvdGhlciB2YWx1ZT10cnVlICovCi10eXBlZGVmIGludCBib29sX3Q7Ci0KLS8qIGEga2V5c3ltOiBpZGVudGljYWwgd2l0aCBBU0NJSSBmb3IgdmFsdWVzIGJldHdlZW4gMC0xMjcgKi8KLXR5cGVkZWYgaW50IGtleXN5bV90OwotCi0vKiB0aGlzIGNhbiBiZSBuZWdhdGl2ZSwgYmVjYXVzZSBvZiBhIG5ldyBvcmlnaW4gc2V0IHZpYSB2aXN1YWwgZ3JlcCAqLwotdHlwZWRlZiBpbnQgY29vcmRpbmF0ZV90OwotCi0vKiBsZWZ0IGJ1dHRvbiBpcyAxPDwwLCBtaWRkbGUgYnV0dG9uIGlzIDE8PDEsIHJpZ2h0IGJ1dHRvbiBpcyAxPDwyICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnV0dG9uc190OwotCi0vKiB0aGlzIGlzIHNvcnQgb2YgYSAiZmlsZSBkZXNjcmlwdG9yIiBmb3IgdGhlIHByb3h5ICovCi10eXBlZGVmIGludCByZXNvdXJjZV90OwotCi0vKiB0aGUgdGltZW91dCwgc3BlY2lmaWVkIGluIG1pY3Jvc2Vjb25kcywgZm9yIHByb2Nlc3MoKSBhbmQgZnJpZW5kcyAqLwotdHlwZWRlZiBkb3VibGUgdGltZW91dF90OwotCi0vKiB0aGUgcmV0dXJuIHZhbHVlcyBvZiBwcm9jZXNzKCkgYW5kIGZyaWVuZHMgKi8KLXR5cGVkZWYgaW50IHJlc3VsdF90OwotLyoKLSVjb25zdGFudCBpbnQgUkVTVUxUX1RJTUVPVVQ9MTsKLSVjb25zdGFudCBpbnQgUkVTVUxUX0tFWT0yOwotJWNvbnN0YW50IGludCBSRVNVTFRfTU9VU0U9NDsKLSVjb25zdGFudCBpbnQgUkVTVUxUX1RFWFRfQ0xJRU5UPTg7Ci0lY29uc3RhbnQgaW50IFJFU1VMVF9URVhUX0NMSUVOVD0xNjsKLSVjb25zdGFudCBpbnQgUkVTVUxUX1NDUkVFTj0zMjsKLSVjb25zdGFudCBpbnQgUkVTVUxUX0ZPVU5ESU1BR0U9NjQ7Ci0lY29uc3RhbnQgaW50IFJFU1VMVF9TSFVURE9XTj0xMjg7Ci0qLwotCi0lfQotCi0jZW5kaWYgLy8gU1dJRwotCi10eXBlZGVmIGludCBib29sX3Q7Ci10eXBlZGVmIGludCBrZXlzeW1fdDsKLXR5cGVkZWYgaW50IGNvb3JkaW5hdGVfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBidXR0b25zX3Q7Ci10eXBlZGVmIGludCByZXNvdXJjZV90OwotdHlwZWRlZiBkb3VibGUgdGltZW91dF90OwotdHlwZWRlZiBpbnQgcmVzdWx0X3Q7Ci0jZGVmaW5lIFJFU1VMVF9USU1FT1VUIDEKLSNkZWZpbmUgIFJFU1VMVF9LRVkgMgotI2RlZmluZSAgUkVTVUxUX01PVVNFIDQKLSNkZWZpbmUgIFJFU1VMVF9URVhUX0NMSUVOVCA4Ci0jZGVmaW5lICBSRVNVTFRfVEVYVF9TRVJWRVIgMTYKLSNkZWZpbmUgIFJFU1VMVF9TQ1JFRU4gMzIKLSNkZWZpbmUgIFJFU1VMVF9GT1VORElNQUdFIDY0Ci0jZGVmaW5lICBSRVNVTFRfU0hVVERPV04gMTI4Ci0KLS8qIGluaXQvc2h1dGRvd24gKi8KLQotcmVzb3VyY2VfdCBpbml0dm5jKGNvbnN0IGNoYXIqIHNlcnZlcixpbnQgc2VydmVyUG9ydCxpbnQgbGlzdGVuUG9ydCk7Ci12b2lkIGNsb3Nldm5jKHJlc291cmNlX3QgcmVzKTsKLQotLyogcnVuIHRoZSBldmVudCBsb29wIGZvciBhIHdoaWxlOiBwcm9jZXNzKCkgYW5kIGZyaWVuZHM6Ci0gKiBwcm9jZXNzKCkgcmV0dXJucyBvbmx5IG9uIHRpbWVvdXQsCi0gKiB3YWl0Zm9yYW55dGhpbmcgcmV0dXJucyBvbiBhbnkgZXZlbnQgKGlucHV0LCBvdXRwdXQgb3IgdGltZW91dCksCi0gKiB3YWl0Zm9ydXBkYXRlKCkgcmV0dXJucyBvbmx5IG9uIHRpbWVvdXQgb3Igc2NyZWVuIHVwZGF0ZSwKLSAqIHdhaXRmb3JpbnB1dCgpIHJldHVybnMgb25seSBvbiB0aW1lb3V0IG9yIHVzZXIgaW5wdXQsCi0gKiB2aXN1YWxncmVwKCkgcmV0dXJucyBvbmx5IG9uIHRpbWVvdXQgb3IgaWYgdGhlIHNwZWNpZmllZCBQTk0gd2FzIGZvdW5kCi0gKiAJKGluIHRoYXQgY2FzZSwgeF9vcmlnaW4gYW5kIHlfb3JpZ2luIGFyZSBzZXQgdG8gdGhlIHVwcGVyIGxlZnQKLSAqIAkgY29ybmVyIG9mIHRoZSBtYXRjaGVkIGltYWdlKS4gKi8KLQotcmVzdWx0X3QgcHJvY2VzcyhyZXNvdXJjZV90IHJlcyx0aW1lb3V0X3Qgc2Vjb25kcyk7Ci1yZXN1bHRfdCB3YWl0Zm9yYW55dGhpbmcocmVzb3VyY2VfdCByZXMsdGltZW91dF90IHNlY29uZHMpOwotcmVzdWx0X3Qgd2FpdGZvcnVwZGF0ZShyZXNvdXJjZV90IHJlcyx0aW1lb3V0X3Qgc2Vjb25kcyk7Ci1yZXN1bHRfdCB3YWl0Zm9yaW5wdXQocmVzb3VyY2VfdCByZXMsdGltZW91dF90IHNlY29uZHMpOwotcmVzdWx0X3QgdmlzdWFsZ3JlcChyZXNvdXJjZV90IHJlcyxjb25zdCBjaGFyKiBmaWxlbmFtZSx0aW1lb3V0X3Qgc2Vjb25kcyk7Ci0KLS8qIGluc3BlY3QgbGFzdCBldmVudHMgKi8KLQota2V5c3ltX3QgZ2V0a2V5c3ltKHJlc291cmNlX3QgcmVzKTsKLWJvb2xfdCBnZXRrZXlkb3duKHJlc291cmNlX3QgcmVzKTsKLQotY29vcmRpbmF0ZV90IGdldHgocmVzb3VyY2VfdCByZXMpOwotY29vcmRpbmF0ZV90IGdldHkocmVzb3VyY2VfdCByZXMpOwotYnV0dG9uc190IGdldGJ1dHRvbnMocmVzb3VyY2VfdCByZXMpOwotCi1jb25zdCBjaGFyICpnZXR0ZXh0X2NsaWVudChyZXNvdXJjZV90IHJlcyk7Ci1jb25zdCBjaGFyICpnZXR0ZXh0X3NlcnZlcihyZXNvdXJjZV90IHJlcyk7Ci0KLS8qIHNlbmQgZXZlbnRzIHRvIHRoZSBzZXJ2ZXIgKi8KLQotYm9vbF90IHNlbmRrZXkocmVzb3VyY2VfdCByZXMsa2V5c3ltX3Qga2V5c3ltLGJvb2xfdCBrZXlkb3duKTsKLWJvb2xfdCBzZW5kYXNjaWkocmVzb3VyY2VfdCByZXMsY29uc3QgY2hhciAqc3RyaW5nKTsKLWJvb2xfdCBzZW5kbW91c2UocmVzb3VyY2VfdCByZXMsY29vcmRpbmF0ZV90IHgsY29vcmRpbmF0ZV90IHksYnV0dG9uc190IGJ1dHRvbnMpOwotYm9vbF90IHNlbmR0ZXh0KHJlc291cmNlX3QgcmVzLCBjb25zdCBjaGFyICpzdHJpbmcpOwotYm9vbF90IHNlbmR0ZXh0X3RvX3NlcnZlcihyZXNvdXJjZV90IHJlcywgY29uc3QgY2hhciAqc3RyaW5nKTsKLQotLyogZm9yIHZpc3VhbCBncmVwcGluZyAqLwotCi1jb29yZGluYXRlX3QgZ2V0eG9yaWdpbihyZXNvdXJjZV90IHJlcyk7Ci1jb29yZGluYXRlX3QgZ2V0eW9yaWdpbihyZXNvdXJjZV90IHJlcyk7Ci0KLWJvb2xfdCBzYXZlcG5tKHJlc291cmNlX3QgcmVzLGNvbnN0IGNoYXIqIGZpbGVuYW1lLGNvb3JkaW5hdGVfdCB4MSwgY29vcmRpbmF0ZV90IHkxLCBjb29yZGluYXRlX3QgeDIsIGNvb3JkaW5hdGVfdCB5Mik7Ci0KLXJlc3VsdF90IGRpc3BsYXlwbm0ocmVzb3VyY2VfdCByZXMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb29yZGluYXRlX3QgeCwgY29vcmRpbmF0ZV90IHksIGJvb2xfdCBib3JkZXIsIHRpbWVvdXRfdCB0aW1lb3V0KTsKLQotLyogdGhpcyBkaXNwbGF5cyBhbiBvdmVybGF5IHdoaWNoIGlzIHNob3duIGZvciBhIGNlcnRhaW4gdGltZSAqLwotCi1yZXN1bHRfdCBhbGVydChyZXNvdXJjZV90IHJlcyxjb25zdCBjaGFyKiBtZXNzYWdlLHRpbWVvdXRfdCB0aW1lb3V0KTsKLQotLyogZGlzcGxheSBhIHJlY3Rhbmd1bGFyIHJ1YmJlciBiYW5kIGJldHdlZW4gKHgwLCB5MCkgYW5kIHRoZSBjdXJyZW50Ci0gICBtb3VzZSBwb2ludGVyLCBhcyBsb25nIGFzIGEgYnV0dG9uIHVzIHByZXNzZWQuICovCi0KLXJlc3VsdF90IHJ1YmJlcmJhbmQocmVzb3VyY2VfdCByZXMsIGNvb3JkaW5hdGVfdCB4MCwgY29vcmRpbmF0ZV90IHkwKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9WaXN1YWxOYUNyby9yZWNvcmRlci5wbCBiL1Zpc3VhbE5hQ3JvL3JlY29yZGVyLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFiM2YyLi4wMDAwMDAwCi0tLSBhL1Zpc3VhbE5hQ3JvL3JlY29yZGVyLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotCi11c2UgR2V0b3B0OjpMb25nOwotdXNlIG5hY3JvOwotCi0kb3V0cHV0PSJteV9zY3JpcHQiOwotJHNlcnZlcj0ibG9jYWxob3N0IjsKLSRwb3J0PTU5MDA7Ci0kbGlzdGVuX3BvcnQ9NTkyMzsKLSR0aW1pbmc9MDsKLSRzeW1ib2xpYz0wOwotJGNvbXBhY3Q9MDsKLSRjb21wYWN0X2RyYWdnaW5nPTA7Ci0KLWlmKCFHZXRPcHRpb25zKAotCSJzY3JpcHQ6cyIgPT4gXCRvdXRwdXQsCi0JImxpc3RlbjppIiA9PiBcJGxpc3Rlbl9wb3J0LAotCSJ0aW1pbmciID0+IFwkdGltaW5nLAotCSJzeW1ib2xpYyIgPT4gXCRzeW1ib2xpYywKLQkiY29tcGFjdCIgPT4gXCRjb21wYWN0LAotCSJjb21wYWN0LWRyYWdnaW5nIiA9PiBcJGNvbXBhY3RfZHJhZ2dpbmcsCi0pIHx8ICQjQVJHViE9MCkgewotCXByaW50IFNUREVSUiAiVXNhZ2U6ICRBUkdWMCBbLS1zY3JpcHQgb3V0cHV0X25hbWVdIFstLWxpc3RlbiBsaXN0ZW5fcG9ydF0gWy0tdGltaW5nXVxuXHRbLS1zeW1ib2xpY10gWy0tY29tcGFjdF0gWy0tY29tcGFjdC1kcmFnZ2luZ10gc2VydmVyWzpwb3J0XVxuIjsKLQlleGl0IDI7Ci19Ci0KLSRvdXRwdXQ9fnMvXC5wbCQvLzsKLQotaWYgKCR0aW1pbmcpIHsKLQlldmFsICd1c2UgVGltZTo6SGlSZXMnOwotCSR0aW1pbmc9MCBpZiAkQDsKLQkkc3RhcnR0aW1lPS0xOwotfQotCi1pZiAoJHN5bWJvbGljKSB7Ci0JZXZhbCAndXNlIFgxMTo6S2V5c3ltcyBxdyglS2V5c3ltcyknOwotCSRzeW1ib2xpYz0wIGlmICRAOwotCSVzeW1fbmFtZSA9IHJldmVyc2UgJUtleXN5bXM7Ci19Ci0KLSRzZXJ2ZXI9JEFSR1ZbMF07Ci0KLWlmKCRzZXJ2ZXI9fi9eKC4qKTooXGQrKSQvKSB7Ci0JJHNlcnZlcj0kMTsKLQkkcG9ydD0kMjsKLQlpZigkMjwxMDApIHsKLQkJJHBvcnQrPTU5MDA7Ci0JfQotfQotCi1pZigkbGlzdGVuX3BvcnQ8MTAwKSB7Ci0JJGxpc3Rlbl9wb3J0Kz01OTAwOwotfQotCi0jIGRvIG5vdCBvdmVyd3JpdGUgc2NyaXB0Ci0KLWlmKHN0YXQoIiRvdXRwdXQucGwiKSkgewotCXByaW50IFNUREVSUiAiV2lsbCBub3Qgb3ZlcndyaXRlICRvdXRwdXQucGxcbiI7Ci0JZXhpdCAyOwotfQotCi0jIHN0YXJ0IGNvbm5lY3Rpb24KLSR2bmM9bmFjcm86OmluaXR2bmMoJHNlcnZlciwkcG9ydCwkbGlzdGVuX3BvcnQpOwotCi1pZigkdm5jPDApIHsKLQlwcmludCBTVERFUlIgIkNvdWxkIG5vdCBpbml0aWFsaXplICRzZXJ2ZXI6JHBvcnRcbiI7Ci0JZXhpdCAxOwotfQotCi1vcGVuIE9VVCwgIj4kb3V0cHV0LnBsIjsKLXByaW50IE9VVCAiIyEvdXNyL2Jpbi9wZXJsXG4iOwotcHJpbnQgT1VUICJcbiI7Ci1pZiAoJHN5bWJvbGljKSB7Ci0JcHJpbnQgT1VUICJ1c2UgWDExOjpLZXlzeW1zIHF3KFwlc3ltKTtcbiI7Ci19Ci1wcmludCBPVVQgInVzZSBuYWNybztcbiI7Ci1wcmludCBPVVQgIlxuIjsKLXByaW50IE9VVCAiXCR4X29yaWdpbj0wOyBcJHlfb3JpZ2luPTA7XG4iOwotcHJpbnQgT1VUICJcJHZuYz1uYWNybzo6aW5pdHZuYyhcIiRzZXJ2ZXJcIiwkcG9ydCwkbGlzdGVuX3BvcnQpO1xuIjsKLQotJG1vZGU9InBhc3N0aHJ1IjsKLSRpbWFnZV9jb3VudGVyPTE7Ci0kbWFnaWNrZXk9MDsKLSR4X29yaWdpbj0wOyAkeV9vcmlnaW49MDsKLQotc3ViIHdyaXRldGltaW5nICgpIHsKLQlpZiAoJHRpbWluZykgewotCQkkbm93PVRpbWU6OkhpUmVzOjp0aW1lKCk7Ci0JCWlmICgkc3RhcnR0aW1lPjApIHsKLQkJCXByaW50IE9VVCAibmFjcm86OnByb2Nlc3MoXCR2bmMsIiAuICgkbm93IC0gJHN0YXJ0dGltZSkgLiAiKTtcbiI7Ci0JCX0KLQkJJHN0YXJ0dGltZT0kbm93OwotCX0KLX0KLQotJGxhc3RfYnV0dG9uID0gLTE7Ci0KLXN1YiBoYW5kbGVfbW91c2UgewotCW15ICR4ID0gc2hpZnQ7Ci0JbXkgJHkgPSBzaGlmdDsKLQlteSAkYnV0dG9ucyA9IHNoaWZ0OwotCWlmKG5hY3JvOjpzZW5kbW91c2UoJHZuYywkeCwkeSwkYnV0dG9ucykpIHsKLQkJJHgtPSR4X29yaWdpbjsgJHktPSR5X29yaWdpbjsKLQkJd3JpdGV0aW1pbmcoKTsKLQkJcHJpbnQgT1VUICJuYWNybzo6c2VuZG1vdXNlKFwkdm5jLFwkeF9vcmlnaW4iCi0JCQkuICgkeD49MD8iKyI6IiIpLiIkeCxcJHlfb3JpZ2luIgotCQkJLiAoJHk+PTA/IisiOiIiKS4iJHksJGJ1dHRvbnMpO1xuIjsKLQl9Ci19Ci0KLXN1YiB0b2dnbGVfdGV4dCB7Ci0JbXkgJHRleHQgPSBzaGlmdDsKLQlpZiAoJHRleHQgZXEgIlRpbWluZyIpIHsKLQkJcmV0dXJuICR0ZXh0IC4gIiBpcyAiIC4gKCR0aW1pbmcgPyAib24iIDogIm9mZiIpOwotCX0gZWxzaWYgKCR0ZXh0IGVxICJLZXkgcHJlc3NlcyIpIHsKLQkJcmV0dXJuICR0ZXh0IC4gIiBhcmUgcmVjb3JkZWQgIiAuICgkc3ltYm9saWMgPyAic3ltYm9saWNhbGx5IgotCQkJOiAibnVtZXJpY2FsbHkiKTsKLQl9IGVsc2lmICgkdGV4dCBlcSAiTW91c2UgbW92ZXMiKSB7Ci0JCXJldHVybiAkdGV4dCAuICIgYXJlIHJlY29yZGVkICIgLiAoJGNvbXBhY3QgPyAiY29tcGFjdGVkIgotCQkJOiAidmVyYm9zZWx5Iik7Ci0JfSBlbHNpZiAoJHRleHQgZXEgIk1vdXNlIGRyYWdzIikgewotCQlyZXR1cm4gJHRleHQgLiAiIGFyZSByZWNvcmRlZCAiIC4gKCRjb21wYWN0ID8gImNvbXBhY3RlZCIKLQkJCTogInZlcmJvc2VseSIpOwotCX0KLQlyZXR1cm4gJHRleHQgLiAiOiA8dW5rbm93bj4iOwotfQotCi0kbWVudV9tZXNzYWdlID0gIlZpc3VhbE5hQ3JvOiBwcmVzcyAncScgdG8gcXVpdCxcbiIKLQkuICInaScgdG8gZGlzcGxheSBjdXJyZW50IHNldHRpbmdzLFxuIgotCS4gIidjJywgJ3InIHRvIHRvZ2dsZSBjb21wYWN0IG1vdXNlIG1vdmVtZW50cyBvciBkcmFncyxcbiIKLQkuICInZCcgdG8gZGlzcGxheSBjdXJyZW50IHJlZmVyZW5jZSBpbWFnZSxcbiIKLQkuICJvciBtYXJrIHJlZmVyZW5jZSByZWN0YW5nbGUgYnkgZHJhZ2dpbmciOwotCi13aGlsZSgxKSB7Ci0JJHJlc3VsdD1uYWNybzo6d2FpdGZvcmlucHV0KCR2bmMsOTk5OTk5KTsKLQlpZigkcmVzdWx0PT0wKSB7Ci0JCSMgc2VydmVyIHdlbnQgYXdheQotCQljbG9zZSBPVVQ7Ci0JCWV4aXQgMDsKLQl9Ci0KLQlpZigkbW9kZSBlcSAicGFzc3RocnUiKSB7Ci0JCWlmKCRyZXN1bHQmJG5hY3JvOjpSRVNVTFRfS0VZKSB7Ci0JCQkka2V5c3ltPW5hY3JvOjpnZXRrZXlzeW0oJHZuYyk7Ci0JCQkka2V5ZG93bj1uYWNybzo6Z2V0a2V5ZG93bigkdm5jKTsKLQkJCWlmKG5hY3JvOjpzZW5ka2V5KCR2bmMsJGtleXN5bSwka2V5ZG93bikpIHsKLQkJCQl3cml0ZXRpbWluZygpOwotCQkJCWlmICgkc3ltYm9saWMgYW5kIGV4aXN0cyAkc3ltX25hbWV7JGtleXN5bX0pIHsKLQkJCQkJcHJpbnQgT1VUICduYWNybzo6c2VuZGtleSgkdm5jLCRzeW17Jy4kc3ltX25hbWV7JGtleXN5bX0uIn0sJGtleWRvd24pO1xuIjsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludCBPVVQgIm5hY3JvOjpzZW5ka2V5KFwkdm5jLCRrZXlzeW0sJGtleWRvd24pO1xuIjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZigka2V5c3ltPT0weGZmZTMgfHwgJGtleXN5bT09MHhmZmU0KSB7Ci0JCQkJaWYgKCEka2V5ZG93bikgewotCQkJCQkjIENvbnRyb2wgcHJlc3NlZAotCQkJCQkkbWFnaWNrZXkrKzsKLQkJCQkJaWYgKCRtYWdpY2tleSA+IDEpIHsKLQkJCQkJCSRtYWdpY2tleSA9IDA7Ci0JCQkJCQkkbW9kZSA9ICJtZW51IjsKLQkJCQkJCW5hY3JvOjphbGVydCgkdm5jLAotCQkJCQkJCSRtZW51X21lc3NhZ2UsIDEwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJJG1hZ2lja2V5PTA7Ci0JCQl9Ci0JCX0KLQkJaWYoJHJlc3VsdCYkbmFjcm86OlJFU1VMVF9NT1VTRSkgewotCQkJJHg9bmFjcm86OmdldHgoJHZuYyk7Ci0JCQkkeT1uYWNybzo6Z2V0eSgkdm5jKTsKLQkJCSRidXR0b25zPW5hY3JvOjpnZXRidXR0b25zKCR2bmMpOwotCQkJaWYgKCRidXR0b25zICE9ICRsYXN0X2J1dHRvbnMpIHsKLQkJCQlpZiAoISRidXR0b25zICYmICRjb21wYWN0X2RyYWdnaW5nKSB7Ci0JCQkJCWhhbmRsZV9tb3VzZSgkeCwgJHksICRsYXN0X2J1dHRvbnMpOwotCQkJCX0KLQkJCQkkbGFzdF9idXR0b25zID0gJGJ1dHRvbnM7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoJGJ1dHRvbnMgJiYgJGNvbXBhY3RfZHJhZ2dpbmcpIHx8Ci0JCQkJCQkoISRidXR0b25zICYmICRjb21wYWN0KSkgewotCQkJCQluZXh0OwotCQkJCX0KLQkJCX0KLQkJCWhhbmRsZV9tb3VzZSgkeCwgJHksICRidXR0b25zKTsKLQkJfQotCQlpZiAoJHJlc3VsdCAmICRuYWNybzo6UkVTVUxUX1RFWFRfQ0xJRU5UKSB7Ci0JCQlteSAkdGV4dCA9IG5hY3JvOjpnZXR0ZXh0X2NsaWVudCgkdm5jKTsKLQkJCWlmIChuYWNybzo6c2VuZHRleHQoJHZuYywkdGV4dCkpIHsKLQkJCQl3cml0ZXRpbWluZygpOwotCQkJCXByaW50IE9VVCAibmFjcm86OnNlbmR0ZXh0KFwkdm5jLCBxKFxRJHRleHRcRSkpO1xuIjsKLQkJCQlwcmludCAiZ290IHRleHQgZnJvbSBjbGllbnQ6ICR0ZXh0XG4iOwotCQkJfQotCQl9Ci0JCWlmICgkcmVzdWx0ICYgJG5hY3JvOjpSRVNVTFRfVEVYVF9TRVJWRVIpIHsKLQkJCW15ICR0ZXh0ID0gbmFjcm86OmdldHRleHRfc2VydmVyKCR2bmMpOwotCQkJaWYgKG5hY3JvOjpzZW5kdGV4dF90b19zZXJ2ZXIoJHZuYywkdGV4dCkpIHsKLQkJCQl3cml0ZXRpbWluZygpOwotCQkJCXByaW50IE9VVCAibmFjcm86OnNlbmR0ZXh0X3RvX3NlcnZlcihcJHZuYywgcShcUSR0ZXh0XEUpKTtcbiI7Ci0JCQkJcHJpbnQgImdvdCB0ZXh0IGZyb20gc2VydmVyOiAkdGV4dFxuIjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmKCRyZXN1bHQmJG5hY3JvOjpSRVNVTFRfS0VZKSB7Ci0JCQkka2V5c3ltPW5hY3JvOjpnZXRrZXlzeW0oJHZuYyk7Ci0JCQkka2V5ZG93bj1uYWNybzo6Z2V0a2V5ZG93bigkdm5jKTsKLQkJCWlmKCRrZXlzeW09PW9yZCgncScpKSB7Ci0JCQkJIyBzaHV0ZG93bgotCQkJCWNsb3NlIE9VVDsKLQkJCQluYWNybzo6Y2xvc2V2bmMoJHZuYyk7Ci0JCQkJZXhpdCAwOwotCQkJfSBlbHNpZiAoJGtleXN5bSA9PSBvcmQoJ2QnKSkgewotCQkJCSRwbm09JG91dHB1dC4oJGltYWdlX2NvdW50ZXIgLSAxKS4iLnBubSI7Ci0JCQkJJHJlcyA9IG5hY3JvOjpkaXNwbGF5cG5tKCR2bmMsICRwbm0sCi0JCQkJCQkkeF9vcmlnaW4sICR5X29yaWdpbiwgMSwgMTApOwotCQkJCQkJIzAsIDAsIDEsIDEwKTsKLQkJCQlpZiAoJHJlcyA9PSAwKSB7Ci0JCQkJCW5hY3JvOjphbGVydCgkdm5jLCAiRXJyb3IgZGlzcGxheWluZyAiCi0JCQkJCQkJLiAkcG5tLCAxMCk7Ci0JCQkJfQotCQkJfSBlbHNpZiAoJGtleXN5bSA9PSBvcmQoJ2knKSkgewotCQkJCW5hY3JvOjphbGVydCgkdm5jLCAiQ3VycmVudCBzZXR0aW5nczpcbiIKLQkJCQkJLiAiXG4iCi0JCQkJCS4gIlNjcmlwdDogJG91dHB1dFxuIgotCQkJCQkuICJTZXJ2ZXI6ICRzZXJ2ZXJcbiIKLQkJCQkJLiAiTGlzdGVuaW5nIG9uIHBvcnQ6ICRwb3J0XG4iCi0JCQkJCS4gdG9nZ2xlX3RleHQoIlRpbWluZyIpIC4gIlxuIgotCQkJCQkuIHRvZ2dsZV90ZXh0KCJLZXkgcHJlc3NlcyIpIC4gIlxuIgotCQkJCQkuIHRvZ2dsZV90ZXh0KCJNb3VzZSBtb3ZlcyIpIC4gIlxuIgotCQkJCQkuIHRvZ2dsZV90ZXh0KCJNb3VzZSBkcmFncyIpLCAxMCk7Ci0JCQl9IGVsc2lmICgka2V5c3ltID09IG9yZCgnYycpKSB7Ci0JCQkJJGNvbXBhY3QgPSAhJGNvbXBhY3Q7Ci0JCQkJbmFjcm86OmFsZXJ0KCR2bmMsCi0JCQkJCQl0b2dnbGVfdGV4dCgiTW91c2UgbW92ZXMiKSwgMTApOwotCQkJfSBlbHNpZiAoJGtleXN5bSA9PSBvcmQoJ3InKSkgewotCQkJCSRjb21wYWN0X2RyYWdnaW5nID0gISRjb21wYWN0X2RyYWdnaW5nOwotCQkJCW5hY3JvOjphbGVydCgkdm5jLAotCQkJCQkJdG9nZ2xlX3RleHQoIk1vdXNlIGRyYWdzIiksIDEwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFjcm86OmFsZXJ0KCR2bmMsIlVua25vd24ga2V5IiwxMCk7Ci0JCQl9Ci0JCQkkbW9kZT0icGFzc3RocnUiOwotCQl9Ci0JCWlmKCRyZXN1bHQmJG5hY3JvOjpSRVNVTFRfTU9VU0UpIHsKLQkJCSR4PW5hY3JvOjpnZXR4KCR2bmMpOwotCQkJJHk9bmFjcm86OmdldHkoJHZuYyk7Ci0JCQkkYnV0dG9ucz1uYWNybzo6Z2V0YnV0dG9ucygkdm5jKTsKLQkJCWlmKCgkYnV0dG9ucyYxKT09MSkgewotCQkJCXByaW50IFNUREVSUiAic3RhcnQgZHJhZ2dpbjogJHggJHlcbiI7Ci0JCQkJJHN0YXJ0X3g9JHg7Ci0JCQkJJHN0YXJ0X3k9JHk7Ci0JCQkJbmFjcm86OnJ1YmJlcmJhbmQoJHZuYywgJHgsICR5KTsKLQkJCQkkeD1uYWNybzo6Z2V0eCgkdm5jKTsKLQkJCQkkeT1uYWNybzo6Z2V0eSgkdm5jKTsKLQkJCQlpZigkc3RhcnRfeD09JHggJiYgJHN0YXJ0X3k9PSR5KSB7Ci0JCQkJCSMgcmVzZXQKLQkJCQkJcHJpbnQgT1VUICJcJHhfb3JpZ2luPTA7IFwkeV9vcmlnaW49MDtcbiI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYoJHN0YXJ0X3g+JHgpIHsKLQkJCQkJCSRkdW1teT0keDsgJHg9JHN0YXJ0X3g7ICRzdGFydF94PSRkdW1teTsKLQkJCQkJfQotCQkJCQlpZigkc3RhcnRfeT4keSkgewotCQkJCQkJJGR1bW15PSR5OyAkeT0kc3RhcnRfeTsgJHN0YXJ0X3k9JGR1bW15OwotCQkJCQl9Ci0JCQkJCSRwbm09JG91dHB1dC4kaW1hZ2VfY291bnRlci4iLnBubSI7Ci0JCQkJCSRpbWFnZV9jb3VudGVyKys7Ci0JCQkJCWlmKCFuYWNybzo6c2F2ZXBubSgkdm5jLCRwbm0sJHN0YXJ0X3gsJHN0YXJ0X3ksJHgsJHkpKSB7Ci0JCQkJCQluYWNybzo6YWxlcnQoJHZuYywiU2F2aW5nICRwbm0gZmFpbGVkISIsMTApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJJHhfb3JpZ2luPSRzdGFydF94OwotCQkJCQkJJHlfb3JpZ2luPSRzdGFydF95OwotCQkJCQkJbmFjcm86OmFsZXJ0KCR2bmMsIkdvdCBuZXcgb3JpZ2luOiAkeF9vcmlnaW4gJHlfb3JpZ2luIiwxMCk7Ci0JCQkJCQlwcmludCBPVVQgImlmKG5hY3JvOjp2aXN1YWxncmVwKFwkdm5jLFwiJHBubVwiLDk5OTk5OSkpIHtcbiIKLQkJCQkJCQkuICJcdFwkeF9vcmlnaW49bmFjcm86OmdldHhvcmlnaW4oXCR2bmMpO1xuIgotCQkJCQkJCS4gIlx0XCR5X29yaWdpbj1uYWNybzo6Z2V0eW9yaWdpbihcJHZuYyk7XG59XG4iOwotCQkJCQl9Ci0JCQkJfQotCQkJCSRtb2RlPSJwYXNzdGhydSI7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL19jb25maWdzLnNlZCBiL19jb25maWdzLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NjgxZi4uMDAwMDAwMAotLS0gYS9fY29uZmlncy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXMvI3VuZGVmICAqXChbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfXVwpLyN1bmRlZiBMSUJWTkNTRVJWRVJfXDEvCi1zLyNkZWZpbmUgICpcKFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9dW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5X10qXClcKC4qXCkvI2lmbmRlZiBMSUJWTkNTRVJWRVJfXDEgXAotI2RlZmluZSBMSUJWTkNTRVJWRVJfXDEgXDIgXAotI2VuZGlmLwpkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk0N2FjLi4wMDAwMDAwCi0tLSBhL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDcxMTAgKzAsMCBAQAotQUhfVEVNUExBVEUoc29ja2xlbl90LCBbVGhlIHR5cGUgZm9yIHNvY2tsZW5dKQotQUNfREVGVU4oW0FDX1RZUEVfU09DS0xFTl9UXSwKLVtBQ19DQUNIRV9DSEVDSyhbZm9yIHNvY2tsZW5fdF0sIGFjX2N2X3R5cGVfc29ja2xlbl90LAotWwotICBBQ19UUllfQ09NUElMRSgKLSAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSwKLSAgW3NvY2tsZW5fdCBsZW4gPSA0MjsgcmV0dXJuIDA7XSwKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9eWVzLAotICBhY19jdl90eXBlX3NvY2tsZW5fdD1ubykKLV0pCi0gIGlmIHRlc3QgJGFjX2N2X3R5cGVfc29ja2xlbl90ICE9IHllczsgdGhlbgotICAgIEFDX0RFRklORShzb2NrbGVuX3QsIGludCkKLSAgZmkKLV0pCi0KLWRubCBBdmFpbGFibGUgZnJvbSB0aGUgR05VIEF1dG9jb25mIE1hY3JvIEFyY2hpdmUgYXQ6Ci1kbmwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19jb21waWxlX2NoZWNrX3NpemVvZi5odG1sCi1kbmwKLUFDX0RFRlVOKFtBQ19DT01QSUxFX0NIRUNLX1NJWkVPRl0sCi1bY2hhbmdlcXVvdGUoPDwsID4+KWRubAotZG5sIFRoZSBuYW1lIHRvICNkZWZpbmUuCi1kZWZpbmUoPDxBQ19UWVBFX05BTUU+PiwgdHJhbnNsaXQoc2l6ZW9mXyQxLCBbYS16ICpdLCBbQS1aX1BdKSlkbmwKLWRubCBUaGUgY2FjaGUgdmFyaWFibGUgbmFtZS4KLWRlZmluZSg8PEFDX0NWX05BTUU+PiwgdHJhbnNsaXQoYWNfY3Zfc2l6ZW9mXyQxLCBbICpdLCBbX3BdKSlkbmwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoc2l6ZSBvZiAkMSkKLUFDX0NBQ0hFX1ZBTChBQ19DVl9OQU1FLAotW2ZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgJDIgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotJDIKLV0sIFtzd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICgkMSkgPT0gJGFjX3NpemUpOjtdLCBBQ19DVl9OQU1FPSRhY19zaXplKQotICBpZiB0ZXN0IHgkQUNfQ1ZfTkFNRSAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgkQUNfQ1ZfTkFNRSA9IHggOyB0aGVuCi0gIEFDX01TR19FUlJPUihbY2Fubm90IGRldGVybWluZSBhIHNpemUgZm9yICQxXSkKLWZpCi1BQ19NU0dfUkVTVUxUKCRBQ19DVl9OQU1FKQotQUNfREVGSU5FX1VOUVVPVEVEKEFDX1RZUEVfTkFNRSwgJEFDX0NWX05BTUUsIFtUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgJDFdKQotdW5kZWZpbmUoW0FDX1RZUEVfTkFNRV0pZG5sCi11bmRlZmluZShbQUNfQ1ZfTkFNRV0pZG5sCi1dKQotCi1kbmwgQXZhaWxhYmxlIGZyb20gdGhlIEdOVSBBdXRvY29uZiBNYWNybyBBcmNoaXZlIGF0OgotZG5sIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfY3JlYXRlX3N0ZGludF9oLmh0bWwKLWRubAotQUNfREVGVU4oW0FDX0NSRUFURV9TVERJTlRfSF0sCi1bIyAtLS0tLS0gQUMgQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX01TR19DSEVDS0lORyhbZm9yIHN0ZGludC10eXBlcy4uLi5dKQotYWNfc3RkaW50X2g9YGVjaG8gaWZlbHNlKCQxLCAsIF9zdGRpbnQuaCwgJDEpYAotaWYgdGVzdCAiJGFjX3N0ZGludF9oIiA9ICJzdGRpbnQuaCIgOyB0aGVuCi0gQUNfTVNHX1JFU1VMVCgiKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vc3RkaW50Lmg/KSIpCi1lbGlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAiaW50dHlwZXMuaCIgOyB0aGVuCi0gQUNfTVNHX1JFU1VMVCgiKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vaW50dHlwZXMuaD8pIikKLWVsc2UKLSBBQ19NU0dfUkVTVUxUKCIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKSIpCi1maQotCi1pbnR0eXBlX2hlYWRlcnM9YGVjaG8gaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCAkMiBcCi18IHNlZCAtZSAncy8sLyAvZydgCi0KLSBhY19jdl9oZWFkZXJfc3RkaW50X3g9Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSJuby1maWxlIgotIGFjX2N2X2hlYWRlcl9zdGRpbnRfdT0ibm8tZmlsZSIKLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludHB0cl90Ci0gICB1bnNldCBhY19jdl90eXBlX3VpbnQ2NF90Ci0gICBfQUNfQ0hFQ0tfVFlQRV9ORVcodWludHB0cl90LFthY19jdl9oZWFkZXJfc3RkaW50X3g9JGldLGRubAotICAgICBjb250aW51ZSxbI2luY2x1ZGUgPCRpPl0pCi0gICBBQ19DSEVDS19UWVBFKHVpbnQ2NF90LFthbmQ2ND0iKHVpbnQ2NF90IHRvbykiXSxbYW5kNjQ9IiJdLFsjaW5jbHVkZTwkaT5dKQotICAgQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBvdXIgdWludHB0cl90IGluICRpICRhbmQ2NCkKLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIEFDX0NIRUNLX1RZUEUodWludDMyX3QsW2FjX2N2X2hlYWRlcl9zdGRpbnRfbz0kaV0sZG5sCi0gICAgIGNvbnRpbnVlLFsjaW5jbHVkZSA8JGk+XSkKLSAgIEFDX0NIRUNLX1RZUEUodWludDY0X3QsW2FuZDY0PSIodWludDY0X3QgdG9vKSJdLFthbmQ2ND0iIl0sWyNpbmNsdWRlPCRpPl0pCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIG91ciB1aW50MzJfdCBpbiAkaSAkYW5kNjQpCi0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3lzL3R5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKLSAgIEFDX0NIRUNLX1RZUEUodV9pbnQzMl90LFthY19jdl9oZWFkZXJfc3RkaW50X3U9JGldLGRubAotICAgICBjb250aW51ZSxbI2luY2x1ZGUgPCRpPl0pCi0gICBBQ19DSEVDS19UWVBFKHVpbnQ2NF90LFthbmQ2ND0iKHVfaW50NjRfdCB0b28pIl0sW2FuZDY0PSIiXSxbI2luY2x1ZGU8JGk+XSkKLSAgIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gb3VyIHVfaW50MzJfdCBpbiAkaSAkYW5kNjQpCi0gICBicmVhazsKLSBkb25lCi0gZmkKLSBmaQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgTUFZQkUgQyBiYXNpYyB0eXBlcyAtLS0tLS0tLQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKGNoYXIpCi0gICBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihzaG9ydCkKLSAgIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKGludCkKLSAgIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKGxvbmcpCi0gICBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRih2b2lkKikKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGVhZGVyX3N0ZGludF90ZXN0PSJubyIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gRE9ORSBpbnR0eXBlcy5oIGNoZWNrcyBTVEFSVCBoZWFkZXIgLS0tLS0tLS0tLS0tLQotX2FjX3N0ZGludF9oPUFTX1RSX0NQUChfJGFjX3N0ZGludF9oKQotQUNfTVNHX1JFU1VMVChjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oKQotZWNobyAiI2lmbmRlZiIgJF9hY19zdGRpbnRfaCA+JGFjX3N0ZGludF9oCi1lY2hvICIjZGVmaW5lIiAkX2FjX3N0ZGludF9oICIxIiA+PiRhY19zdGRpbnRfaAotZWNobyAiI2lmbmRlZiIgX0dFTkVSQVRFRF9TVERJTlRfSCA+PiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgX0dFTkVSQVRFRF9TVERJTlRfSCAnIickUEFDS0FHRSAkVkVSU0lPTiciJyA+PiRhY19zdGRpbnRfaAotaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KLSAgZWNobyAiLyogZ2VuZXJhdGVkIHVzaW5nIGEgZ251IGNvbXBpbGVyIHZlcnNpb24iIGAkQ0MgLS12ZXJzaW9uYCAiKi8iIFwKLSAgPj4kYWNfc3RkaW50X2gKLWVsc2UKLSAgZWNobyAiLyogZ2VuZXJhdGVkIHVzaW5nICRDQyAqLyIgPj4kYWNfc3RkaW50X2gKLWZpCi1lY2hvICIiID4+JGFjX3N0ZGludF9oCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3giCi1lbGlmICB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9InN0ZGRlZi5oIgotZmkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBTZWUgaWYgaW50X2xlYXN0IGFuZCBpbnRfZmFzdCB0eXBlcyBhcmUgcHJlc2VudAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90Ci11bnNldCBhY19jdl90eXBlX2ludF9mYXN0MzJfdAotQUNfQ0hFQ0tfVFlQRShpbnRfbGVhc3QzMl90LCwsWyNpbmNsdWRlIDwkYWNfY3ZfaGVhZGVyX3N0ZGludD5dKQotQUNfQ0hFQ0tfVFlQRShpbnRfZmFzdDMyX3QsLCxbI2luY2x1ZGU8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+XSkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRkZWYuaCIgOyB0aGVuCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgIT0gInN0ZGludC5oIiA7IHRoZW4KLUFDX01TR19SRVNVTFQoLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCkKLSAgIGVjaG8gIiNpbmNsdWRlIDxzdGRkZWYuaD4iID4+JGFjX3N0ZGludF9oCi1maSA7IGZpCi1BQ19NU0dfUkVTVUxUKC4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQpCi0gICBlY2hvICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+IiA+PiRhY19zdGRpbnRfaAotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaGVhZGVyIFNUQVJUIGJhc2ljIGludCB0eXBlcyAtLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQoLi4uIG5lZWQgdG8gbG9vayBhdCBDIGJhc2ljIHR5cGVzKQotZG5sIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ieWVzIiAjIG1vdmVkIHVwIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlsZQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBnb29kIHN0ZGludC5oIGludHR5cGVzKQotZG5sIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iICAjIG1vdmVkIHVwIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlsZQotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBic2Qvc3lzdiB0eXBlZGVmcykKLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBpbnQ4X3QgaW50MTZfdCBpbnQzMl90IGRlZmluZWQgYnkgaW5ldCBjb2RlLCByZWRlY2xhcmUgdGhlIHVfaW50WFggdHlwZXMgKi8KLXR5cGVkZWYgdV9pbnQ4X3QgdWludDhfdDsKLXR5cGVkZWYgdV9pbnQxNl90IHVpbnQxNl90OwotdHlwZWRlZiB1X2ludDMyX3QgdWludDMyX3Q7Ci1FT0YKLSAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogZ2xpYmMgY29tcGF0aWJpbGl0eSAqLwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLSNlbmRpZgotRU9GCi1maQotCi1hY19jdl9zaXplb2ZfeD0iJGFjX2N2X3NpemVvZl9jaGFyOiRhY19jdl9zaXplb2Zfc2hvcnQiCi1hY19jdl9zaXplb2ZfWD0iJGFjX2N2X3NpemVvZl94OiRhY19jdl9zaXplb2ZfaW50IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfWDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIKLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiA9ICJzdGRkZWYuaCIgOyB0aGVuCi0jICAgd2UgbXVzdCBndWVzcyBhbGwgdGhlIGJhc2ljIHR5cGVzLiBBcGFydCBmcm9tIGJ5dGUtYWRyZXNzYWJsZSBzeXN0ZW0sCi0jIHRoZXJlIGEgZmV3IDMyLWJpdC1vbmx5IGRzcC1zeXN0ZW1zLiBuaWJibGUtYWRkcmVzc2FibGUgc3lzdGVtcyBhcmUgd2F5IG9mZi4KLSAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIC0tLS0tLS0tLS0tLSBCSVRTUEVDSUZJQyBJTlRUWVBFUyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLSAqLwotRU9GCi0gICAgdD0idHlwZWRlZnMgZm9yIGEiCi0gICAgY2FzZSAiJGFjX2N2X3NpemVvZl9YIiBpbgotICAgICAxOjI6MjoyOjQpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgbm9ybWFsIDE2LWJpdCBzeXN0ZW0pCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAgICAgICAgICAgICAgYSBub3JtYWwgMTYtYml0IHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgbG9uZyAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6MjoyOjQ6NCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDE2LWJpdCkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0ICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo0KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IG5vcm1hbCAzMi1iaXQgc3lzdGVtKQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDMyLWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo0OjgpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0KQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0Ojg6OCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCBub3JtYWwgNjQtYml0IHN5c3RlbSkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDY0LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo4OjQpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQpCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIDY0LWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMzItYml0IHN5c3RlbSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgKikKLSAgICBBQ19NU0dfRVJST1IoWyAkYWNfY3Zfc2l6ZW9mX1ggZG5sCi0gd2hhdCBpcyB0aGF0IGEgc3lzdGVtPyBjb250YWN0IHRoZSBhdXRob3IsIHF1aWNrISBodHRwOi8vYWMtYXJjaGl2ZS5zZi5uZXRdKQotICAgIGV4aXQgMQotOzsKLSAgIGVzYWMKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGJhc2ljIGludCB0eXBlcyBTVEFSVCBpbnQ2NF90IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfdWludDY0X3QiID0gInllcyIKLXRoZW4gQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBnb29kIHVpbnQ2NF90KQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogc3lzdGVtIGhlYWRlcnMgaGF2ZSBnb29kIHVpbnQ2NF90ICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi0jZW5kaWYKLUVPRgotCi1lbGlmIHRlc3QgIiRhY19jdl90eXBlX3VfaW50NjRfdCIgPSAieWVzIgotdGhlbiBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nIHR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90KQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogc3lzdGVtIGhlYWRlcnMgaGF2ZSBhbiB1X2ludDY0X3QgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLWVsc2UgQUNfTVNHX1JFU1VMVCguLmFkZGluZyBnZW5lcmljIHVpbnQ2NF90IHJ1bnRpbWUgY2hlY2tzKQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gNjQgQklUIEdFTkVSSUMgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogaGVyZSBhcmUgc29tZSBjb21tb24gaGV1cmlzdGljcyB1c2luZyBjb21waWxlciBydW50aW1lIHNwZWNpZmljcyAqLwotI2lmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gPiAxOTk5MDFMCi0KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotCi0jZWxpZiAhZGVmaW5lZCBfX1NUUklDVF9BTlNJX18KLSNpZiBkZWZpbmVkIF9NU0NfVkVSIHx8IGRlZmluZWQgX19XQVRDT01DX18gfHwgZGVmaW5lZCBfX0JPUkxBTkRDX18KLQotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7Ci0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCBfX0dOVUNfXyB8fCBkZWZpbmVkIF9fTVdFUktTX18gfHwgZGVmaW5lZCBfX0VMRl9fCi1kbmwgLyogbm90ZTogYWxsIEVMRi1zeXN0ZW1zIHNlZW0gdG8gaGF2ZSBsb2ZmLXN1cHBvcnQgd2hpY2ggbmVlZHMgNjQtYml0ICovCi0KLSNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQgX19hbHBoYSB8fCAoZGVmaW5lZCBfX21pcHMgJiYgZGVmaW5lZCBfQUJJTjMyKQotCi0jaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotI2VuZGlmCi0gIC8qIGNvbXBpbGVyL2NwdSB0eXBlIC4uLiBvciBqdXN0IElTTyBDOTkgKi8KLSNlbmRpZgotI2VuZGlmCi1FT0YKLQotIyBwbHVzIGEgZGVmYXVsdCA2NC1iaXQgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIDY0LWJpdCByZWFkeQotICBjYXNlICIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl92b2lkcDokYWNfY3Zfc2l6ZW9mX2xvbmciIGluCi0gICAgMToyOjg6OCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0LCBub3JtYWwgNjQtYml0IHN5c3RlbSkKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gbm9ybWFsIDY0LWJpdCBzeXN0ZW0sIENDIGhhcyBzaXplb2YobG9uZyBhbmQgdm9pZCopID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjQ6OCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0LCB0eXBlZGVmIHRvIGxvbmcpCi1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIDMyLWJpdCBzeXN0ZW0gcHJlcGFyZWQgZm9yIDY0LWJpdCwgQ0MgaGFzIHNpemVvZihsb25nKSA9PSA4IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgIDE6Mjo4OjQpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCwgdHlwZWRlZiBsb25nIGxvbmcpCi1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIDY0LWJpdCBkZXJpdmVkIGZyb20gYSAzMi1iaXQsIENDIGhhcyBzaXplb2YobG9uZykgPT0gNCBieXRlcyAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAqKQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBOT1RFOiAqLwotLyogdGhlIGNvbmZpZ3VyZS1jaGVja3MgZm9yIHRoZSBiYXNpYyB0eXBlcyBkaWQgbm90IG1ha2UgdXMgYmVsaWV2ZSAqLwotLyogdGhhdCB3ZSBjb3VsZCBhZGQgYSBmYWxsYmFjayB0byBhICdsb25nIGxvbmcnIHR5cGVkZWYgdG8gaW50NjRfdCAqLwotRU9GCi0gIGVzYWMKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludDY0X3QgdHlwZXMgU1RBUlQgaW50cHRyIHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBUUiBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotRU9GCi0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwIiBpbgotICAxOjI6MikKLSAgICBhPSJpbnQxNl90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgMiBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCAxNi1iaXQgKi8KLQotdHlwZWRlZiB1aW50MTZfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQxNl90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgMToyOjQpCi0gICAgYT0iaW50MzJfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDQgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMzItYml0ICovCi0KLXR5cGVkZWYgdWludDMyX3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MzJfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo4KQotICAgIGE9ImludDY0X3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA4IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDY0LWJpdCAqLwotCi10eXBlZGVmIHVpbnQ2NF90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDY0X3QgIGludHB0cl90OwotRU9GCi07OwotICAqKQotICAgIGE9ImxvbmciIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSBidXQgZ290IG5vIGd1ZXNzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IGFzIGlmIGxvbmcgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRwdHJfdDsKLXR5cGVkZWYgICAgICAgICAgbG9uZyAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIGVzYWMKLUFDX01TR19SRVNVTFQoLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCkKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90IiA9ICJubyI7IHRoZW4KLUFDX01TR19SRVNVTFQoLi5hZGRpbmcgZ2VuZXJpYyBpbnRfbGVhc3QtdHlwZXMpCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLUdFTkVSSUMgSU5UX0xFQVNUIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmICBpbnQ4X3QgICAgaW50X2xlYXN0OF90OwotdHlwZWRlZiAgaW50MTZfdCAgIGludF9sZWFzdDE2X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2xlYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmICBpbnQ2NF90ICAgaW50X2xlYXN0NjRfdDsKLSNlbmRpZgotCi10eXBlZGVmIHVpbnQ4X3QgICB1aW50X2xlYXN0OF90OwotdHlwZWRlZiB1aW50MTZfdCAgdWludF9sZWFzdDE2X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2xlYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmIHVpbnQ2NF90ICB1aW50X2xlYXN0NjRfdDsKLSNlbmRpZgotRU9GCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnRwdHIgdHlwZXMgU1RBUlQgaW50X2xlYXN0IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2Zhc3QzMl90IiA9ICJubyI7IHRoZW4KLUFDX01TR19SRVNVTFQoLi5hZGRpbmcgZ2VuZXJpYyBpbnRfZmFzdC10eXBlcykKLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tR0VORVJJQyBJTlRfRkFTVCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiAgaW50OF90ICAgIGludF9mYXN0OF90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MTZfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfZmFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiAgaW50NjRfdCAgIGludF9mYXN0NjRfdDsKLSNlbmRpZgotCi10eXBlZGVmIHVpbnQ4X3QgICB1aW50X2Zhc3Q4X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QxNl90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmIHVpbnQ2NF90ICB1aW50X2Zhc3Q2NF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgaW50NjRfdCAgICAgICAgaW50bWF4X3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICAgICAgdWludG1heF90OwotI2Vsc2UKLXR5cGVkZWYgbG9uZyBpbnQgICAgICAgaW50bWF4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludG1heF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLUFDX01TR19SRVNVTFQoLi4uIERPTkUgJGFjX3N0ZGludF9oKQotICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLSAgLyogb25jZSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotXSkKLQotZG5sIHF1b3RlIGZyb20gU3VuT1MtNS44IHN5cy9pbnR0eXBlcy5oOgotZG5sIFVzZSBhdCB5b3VyIG93biByaXNrLiAgQXMgb2YgRmVicnVhcnkgMTk5NiwgdGhlIGNvbW1pdHRlZSBpcyBzcXVhcmVseQotZG5sIGJlaGluZCB0aGUgZml4ZWQgc2l6ZWQgdHlwZXM7IHRoZSAibGVhc3QiIGFuZCAiZmFzdCIgdHlwZXMgYXJlIHN0aWxsIGJlaW5nCi1kbmwgZGlzY3Vzc2VkLiAgVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICJmYXN0IiB0eXBlcyBtYXkgYmUgcmVtb3ZlZCBiZWZvcmUKLWRubCB0aGUgc3RhbmRhcmQgaXMgZmluYWxpemVkIGlzIGhpZ2ggZW5vdWdoIHRoYXQgdGhleSBhcmUgbm90IGN1cnJlbnRseQotZG5sIGltcGxlbWVudGVkLgotCi1kbmwgQXZhaWxhYmxlIGZyb20gdGhlIEdOVSBBdXRvY29uZiBNYWNybyBBcmNoaXZlIGF0OgotZG5sIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYXhfcHJlZml4X2NvbmZpZ19oLmh0bWwKLWRubAotQUNfREVGVU4oW0FYX1BSRUZJWF9DT05GSUdfSF0sW0FDX1JFUVVJUkUoW0FDX0NPTkZJR19IRUFERVJdKQotQUNfQ09ORklHX0NPTU1BTkRTKFtpZmVsc2UoJDEsLCRQQUNLQUdFLWNvbmZpZy5oLCQxKV0sW2RubAotQVNfVkFSX1BVU0hERUYoW19PVVRdLFthY19wcmVmaXhfY29uZl9PVVRdKWRubAotQVNfVkFSX1BVU0hERUYoW19ERUZdLFthY19wcmVmaXhfY29uZl9ERUZdKWRubAotQVNfVkFSX1BVU0hERUYoW19QS0ddLFthY19wcmVmaXhfY29uZl9QS0ddKWRubAotQVNfVkFSX1BVU0hERUYoW19MT1ddLFthY19wcmVmaXhfY29uZl9MT1ddKWRubAotQVNfVkFSX1BVU0hERUYoW19VUFBdLFthY19wcmVmaXhfY29uZl9VUFBdKWRubAotQVNfVkFSX1BVU0hERUYoW19JTlBdLFthY19wcmVmaXhfY29uZl9JTlBdKWRubAotbTRfcHVzaGRlZihbX3NjcmlwdF0sW2NvbmZ0ZXN0LnByZWZpeF0pZG5sCi1tNF9wdXNoZGVmKFtfc3ltYm9sXSxbbTRfY3JfTGV0dGVyc1tdbTRfY3JfZGlnaXRzW11fXSlkbmwKLV9PVVQ9YGVjaG8gaWZlbHNlKCQxLCAsICRQQUNLQUdFLWNvbmZpZy5oLCAkMSlgCi1fREVGPWBlY2hvIF8kX09VVCB8IHNlZCAtZSAieTptNF9jcl9sZXR0ZXJzOm00X2NyX0xFVFRFUlNbXToiIC1lICJzL0A8OkBebTRfY3JfTGV0dGVyc0A6PkAvXy9nImAKLV9QS0c9YGVjaG8gaWZlbHNlKCQyLCAsICRQQUNLQUdFLCAkMilgCi1fTE9XPWBlY2hvIF8kX1BLRyB8IHNlZCAtZSAieTptNF9jcl9MRVRURVJTLTptNF9jcl9sZXR0ZXJzW11fOiJgCi1fVVBQPWBlY2hvICRfUEtHIHwgc2VkIC1lICJ5Om00X2NyX2xldHRlcnMtOm00X2NyX0xFVFRFUlNbXV86IiAgLWUgIi9eQDw6QG00X2NyX2RpZ2l0c0A6PkAvcy9eL18vImAKLV9JTlA9YGVjaG8gaWZlbHNlKCQzLCAsIF8sICQzKWAKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfSEVBREVSUzsgZG8gdGVzdCAiXyRhY19maWxlIiA9IF86ICYmIGNvbnRpbnVlCi0gICAgIHRlc3QgLWYgIiRhY19wcmVmaXhfY29uZl9JTlAiICYmIGNvbnRpbnVlCi0gICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAgICAgKi5oKSB0ZXN0IC1mICRhY19maWxlICYmIF9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRfSU5QIiA9ICJfIjsgdGhlbgotICAgY2FzZSAiJF9PVVQiIGluCi0gICAgICAqLyopIF9JTlA9YGJhc2VuYW1lICIkX09VVCJgCi0gICAgICA7OwotICAgICAgKi0qKSBfSU5QPWBlY2hvICIkX09VVCIgfCBzZWQgLWUgInMvQDw6QF9zeW1ib2xAOj5AKi0vLyJgCi0gICAgICA7OwotICAgICAgKikgX0lOUD1jb25maWcuaAotICAgICAgOzsKLSAgIGVzYWMKLWZpCi1pZiB0ZXN0IC16ICIkX1BLRyIgOyB0aGVuCi0gICBBQ19NU0dfRVJST1IoW25vIHByZWZpeCBmb3IgX1BSRUZJWF9QS0dfQ09ORklHX0hdKQotZWxzZQotICBpZiB0ZXN0ICEgLWYgIiRfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kX0lOUCIgOyB0aGVuCi0gICAgIF9JTlA9IiRzcmNkaXIvJF9JTlAiCi0gIGZpIGZpCi0gIEFDX01TR19OT1RJQ0UoY3JlYXRpbmcgJF9PVVQgLSBwcmVmaXggJF9VUFAgZm9yICRfSU5QIGRlZmluZXMpCi0gIGlmIHRlc3QgLWYgJF9JTlAgOyB0aGVuCi0gICAgZWNobyAicy9AJTpAdW5kZWYgICpcXChAPDpAbTRfY3JfTEVUVEVSU1tdX0A6PkBcXCkvQCU6QHVuZGVmICRfVVBQIiJfXFwxLyIgPiBfc2NyaXB0Ci0gICAgIyBubyEgdGhlc2UgYXJlIHRoaW5ncyBsaWtlIHNvY2tsZW5fdCwgY29uc3QsIHZmb3JrCi0gICAgIyBlY2hvICJzL0AlOkB1bmRlZiAgKlxcKEA8OkBtNF9jcl9sZXR0ZXJzQDo+QFxcKS9AJTpAdW5kZWYgJF9MT1ciIl9cXDEvIiA+PiBfc2NyaXB0Ci0gICAgZWNobyAicy9AJTpAZGVmW11pbmUgICpcXChAPDpAbTRfY3JfTEVUVEVSU1tdX0A6PkBAPDpAX3N5bWJvbEA6PkAqXFwpXFwoLipcXCkvQCU6QGlmbmRlZiAkX1VQUCIiX1xcMSBcXCIgPj4gX3NjcmlwdAotICAgIGVjaG8gIkAlOkBkZWZbXWluZSAkX1VQUCIiX1xcMSBcXDIgXFwiID4+IF9zY3JpcHQKLSAgICBlY2hvICJAJTpAZW5kaWYvIiA+Pl9zY3JpcHQKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIkAlOkBkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIkAlOkBpZm5kZWYgJF9ERUYiICAgICAgPiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAiQCU6QGRlZltdaW5lICRfREVGIDEiID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAvJyonICRfT1VULiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCBlbmQgb2YgY29uZmlndXJlLiAnKicvID4+JHRtcC9wY29uZmlnLmgKLQotICAgIHNlZCAtZiBfc2NyaXB0ICRfSU5QID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAnLyogb25jZTonICRfREVGICcqLycgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gIkAlOkBlbmRpZiIgPj4kdG1wL3Bjb25maWcuaAotICAgIGlmIGNtcCAtcyAkX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgQUNfTVNHX05PVElDRShbJF9PVVQgaXMgdW5jaGFuZ2VkXSkKLSAgICBlbHNlCi0gICAgICBhY19kaXI9YEFTX0RJUk5BTUUoWyIkX09VVCJdKWAKLSAgICAgIEFTX01LRElSX1AoWyIkYWNfZGlyIl0pCi0gICAgICBybSAtZiAiJF9PVVQiCi0gICAgICBtdiAkdG1wL3Bjb25maWcuaCAiJF9PVVQiCi0gICAgZmkKLSAgICBjcCBfc2NyaXB0IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFtpbnB1dCBmaWxlICRfSU5QIGRvZXMgbm90IGV4aXN0IC0gc2tpcCBnZW5lcmF0aW5nICRfT1VUXSkKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuKgotZmkKLW00X3BvcGRlZihbX3N5bWJvbF0pZG5sCi1tNF9wb3BkZWYoW19zY3JpcHRdKWRubAotQVNfVkFSX1BPUERFRihbX0lOUF0pZG5sCi1BU19WQVJfUE9QREVGKFtfVVBQXSlkbmwKLUFTX1ZBUl9QT1BERUYoW19MT1ddKWRubAotQVNfVkFSX1BPUERFRihbX1BLR10pZG5sCi1BU19WQVJfUE9QREVGKFtfREVGXSlkbmwKLUFTX1ZBUl9QT1BERUYoW19PVVRdKWRubAotXSxbUEFDS0FHRT0iJFBBQ0tBR0UiXSldKQotCi0jIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQotIyMgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKLSMjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcwotIyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNDggQUNfUFJPR19MSUJUT09MCi0KLQotIyBBQ19QUk9WSURFX0lGRUxTRShNQUNSTy1OQU1FLCBJRi1QUk9WSURFRCwgSUYtTk9ULVBST1ZJREVEKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkIGJ5IEF1dG9jb25mLCBkZWZpbmUgaXQgaGVyZS4KLW00X2lmZGVmKFtBQ19QUk9WSURFX0lGRUxTRV0sCi0gICAgICAgICBbXSwKLSAgICAgICAgIFttNF9kZWZpbmUoW0FDX1BST1ZJREVfSUZFTFNFXSwKLQkgICAgICAgICBbbTRfaWZkZWYoW0FDX1BST1ZJREVfJDFdLAotCQkgICAgICAgICAgIFskMl0sIFskM10pXSldKQotCi0KLSMgQUNfUFJPR19MSUJUT09MCi0jIC0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sCi1bQUNfUkVRVUlSRShbX0FDX1BST0dfTElCVE9PTF0pZG5sCi1kbmwgSWYgQUNfUFJPR19DWFggaGFzIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuIEFDX0xJQlRPT0xfQ1hYCi1kbmwgaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIEFDX1BST0dfQ1hYLgotICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotICAgIFtBQ19MSUJUT09MX0NYWF0sCi0gICAgW2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0FDX0xJQlRPT0xfQ1hYCi0gIF0pXSkKLWRubCBBbmQgYSBzaW1pbGFyIHNldHVwIGZvciBGb3J0cmFuIDc3IHN1cHBvcnQKLSAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKLSAgICBbQUNfTElCVE9PTF9GNzddLAotICAgIFtkZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtBQ19MSUJUT09MX0Y3NwotXSldKQotCi1kbmwgUXVvdGUgQV1bTV9QUk9HX0dDSiBzbyB0aGF0IGFjbG9jYWwgZG9lc24ndCBicmluZyBpdCBpbiBuZWVkbGVzc2x5LgotZG5sIElmIGVpdGhlciBBQ19QUk9HX0dDSiBvciBBXVtNX1BST0dfR0NKIGhhdmUgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLCBydW4KLWRubCBBQ19MSUJUT09MX0dDSiBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlLCBob29rIGl0IGluIGF0IHRoZSBlbmQgb2YgYm90aC4KLSAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKLSAgICBbQUNfTElCVE9PTF9HQ0pdLAotICAgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCi0gICAgICBbQUNfTElCVE9PTF9HQ0pdLAotICAgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sCi0JW0FDX0xJQlRPT0xfR0NKXSwKLSAgICAgIFtpZmRlZihbQUNfUFJPR19HQ0pdLAotCSAgICAgW2RlZmluZShbQUNfUFJPR19HQ0pdLCBkZWZuKFtBQ19QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKQotICAgICAgIGlmZGVmKFtBXVtNX1BST0dfR0NKXSwKLQkgICAgIFtkZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pCi0gICAgICAgaWZkZWYoW0xUX0FDX1BST0dfR0NKXSwKLQkgICAgIFtkZWZpbmUoW0xUX0FDX1BST0dfR0NKXSwKLQkJZGVmbihbTFRfQUNfUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSldKV0pCi1dKV0pIyBBQ19QUk9HX0xJQlRPT0wKLQotCi0jIF9BQ19QUk9HX0xJQlRPT0wKLSMgLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfQ1hYXSlkbmwKLUFDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0Y3N10pZG5sCi1BQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9HQ0pdKWRubAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgotZGVmaW5lKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKLV0pIyBfQUNfUFJPR19MSUJUT09MCi0KLQotIyBBQ19MSUJUT09MX1NFVFVQCi0jIC0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSwKLVtBQ19QUkVSRVEoMi41MClkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLQotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSlkbmwKLSMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKLUFDX1JFUVVJUkUoW0FDX09CSkVYVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FWEVFWFRdKWRubAotZG5sCi0KLUFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCi1BQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKLUFDX0xJQlRPT0xfT0JKRElSCi0KLUFDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAotX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLVtzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJ10KLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1bZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJ10KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucwotbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCi0KLSMgQ29uc3RhbnRzOgotcm09InJtIC1mIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLWx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLQotQUNfQ0hFQ0tfVE9PTChBUiwgYXIsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLUFDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQotCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCi10ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKLXRlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKLXRlc3QgLXogIiRMRCIgJiYgTEQ9bGQKLXRlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKLXRlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCi10ZXN0IC16ICIkTk0iICYmIE5NPW5tCi10ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi10ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgotdGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Ci10ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgotICAgIDs7Ci0gICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgICA7OwotICBlc2FjCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotZmkKLQotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotCi0jIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKLWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi1maWxlX21hZ2ljKikKLSAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgotICAgIEFDX1BBVEhfTUFHSUMKLSAgZmkKLSAgOzsKLWVzYWMKLQotQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfRExPUEVOXSwgZW5hYmxlX2Rsb3Blbj15ZXMsIGVuYWJsZV9kbG9wZW49bm8pCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9XSU4zMl9ETExdLAotZW5hYmxlX3dpbjMyX2RsbD15ZXMsIGVuYWJsZV93aW4zMl9kbGw9bm8pCi0KLUFDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKLQlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLUFDX0FSR19XSVRIKFtwaWNdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCi0JW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKLSAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCi0gICAgW3BpY19tb2RlPWRlZmF1bHRdKQotdGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0Ci0KLSMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Ci10YWduYW1lPQotQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCi1fTFRfQUNfVEFHQ09ORklHCi1dKSMgQUNfTElCVE9PTF9TRVRVUAotCi0KLSMgX0xUX0FDX1NZU19DT01QSUxFUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0sCi1bQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLV0pIyBfTFRfQUNfU1lTX0NPTVBJTEVSCi0KLQotIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgotQUNfREVGVU4oW19MVF9DQ19CQVNFTkFNRV0sCi1bZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi1dKQotCi0KLSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKLSMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCi1BQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKLVthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotXSkjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotCi0KLSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBsaW5rZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKLSMgdGhlIHNpbXBsZSBsaW5rIHRlc3QgY29kZS4KLUFDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwKLVthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLV0pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLQotIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQotIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCi0jIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKLSMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgotIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZwotIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KLUFDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwKLVtBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpXSxbXSkKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotXSkjIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLQotCi0jIF9MVF9BQ19TSEVMTF9JTklUKEFSRykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSwKLVtpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCi0JICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAotCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCi0kMQotQUNfRElWRVJUX1BPUAotXSkjIF9MVF9BQ19TSEVMTF9JTklUCi0KLQotIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKLSMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLUFDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCi1bX0xUX0FDX1NIRUxMX0lOSVQoWwotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotY2FzZSBYJEVDSE8gaW4KLVgqLS1mYWxsYmFjay1lY2hvKQotICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgotICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCi0gIDs7Ci1lc2FjCi0KLWVjaG89JHtFQ0hPLWVjaG99Ci1pZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9Ci1maQotCi1pZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotWyRdKgotRU9GCi0gIGV4aXQgMAotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KLSMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMnEgIlskXTAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGAgJiYKLSAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgOgotZWxzZQotICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKLSAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZwotICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJwotICAjCi0gICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgotCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICRDT05GSUdfU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICVzXG4nCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCVNIRUxMPSIkQ09ORklHX1NIRUxMIgotCWV4cG9ydCBTSEVMTAotCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCi0JICB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIlskXTAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiWyRdMCIgJHsxKyJbJF1AIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCi0jIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KLUVDSE89JGVjaG8KLWlmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotCi1BQ19TVUJTVChFQ0hPKQotXSldKSMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKLQotCi0jIF9MVF9BQ19MT0NLCi0jIC0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX0xPQ0tdLAotW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKLQlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi1pYTY0LSotaHB1eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgKkVMRi0zMiopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCi0gICAgICA7OwotICAgICpFTEYtNjQqKQotICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZWxzZQotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZmkKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi14ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnxzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgotICAgICozMi1iaXQqKQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICB4ODZfNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCi0gICAgICAgICAgOzsKLSAgICAgICAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKLSAgICAgICAgICA7OwotICAgICAgICBzMzkweC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKLSAgICAgICAgICA7OwotICAgICAgICBzcGFyYzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICB4ODZfNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKLSAgICAgICAgICA7OwotICAgICAgICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCi0gICAgICAgICAgOzsKLSAgICAgICAgczM5MCotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKLSAgICAgICAgICA7OwotICAgICAgICBzcGFyYyotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19MQU5HX1BVU0goQykKLSAgICAgQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCi0gICAgIEFDX0xBTkdfUE9QXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgotICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OwotICAgICAgKikgICAgTEQ9IiR7TEQtbGR9IC02NCIgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci0gIF0pCi1lc2FjCi0KLW5lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotCi1dKSMgX0xUX0FDX0xPQ0sKLQotCi0jIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAotIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKLUFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sCi1bQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKQotQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKLSAgWyQyPW5vCi0gIGlmZWxzZShbJDRdLCAsIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHRdLCBbYWNfb3V0ZmlsZT0kNF0pCi0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJDMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICQyPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLV0pCi0KLWlmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCi0gICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKLWVsc2UKLSAgICBpZmVsc2UoWyQ2XSwgLCA6LCBbJDZdKQotZmkKLV0pIyBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTgotCi0KLSMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcwotQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCi1bQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKLSAgWyQyPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJDMiCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgJDI9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgICQyPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi1dKQotCi1pZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgotICAgIGlmZWxzZShbJDRdLCAsIDosIFskNF0pCi1lbHNlCi0gICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKLWZpCi1dKSMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OCi0KLQotIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwKLVsjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLUFDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQotQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCi0gIGk9MAotICB0ZXN0c3RyaW5nPSJBQkNEIgotCi0gIGNhc2UgJGJ1aWxkX29zIGluCi0gIG1zZG9zZGpncHAqKQotICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKLSAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCi0gICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKLSAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0Ci0gICAgOzsKLQotICBnbnUqKQotICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcwotICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcwotICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCi0gICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKLSAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCi0gICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgotICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQotICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCi0gICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKLSAgICA7OwotCi0gIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCi0gICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCi0gICAgZmkKLSAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKLSAgICA7OwotCi0gIGludGVyaXgqKQotICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKLSAgICA7OwotCi0gIG9zZiopCi0gICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCi0gICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKLSAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgotICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAotICAgICMKLSAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgotICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KLSAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0gIHNjbzMuMnY1KikKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCi0gICAgOzsKLSAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQotICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbIAldXS8vJ2AKLSAgICBlbHNlCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKLSAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAotICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQotICAgIHdoaWxlICh0ZXN0ICJYImAkU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgotCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgotCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKLQkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCi0gICAgZG8KLSAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgZG9uZQotICAgIHRlc3RzdHJpbmc9Ci0gICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCi0gICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KLSAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAotICAgIDs7Ci0gIGVzYWMKLV0pCi1pZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLV0pIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgotCi0KLSMgX0xUX0FDX0NIRUNLX0RMRkNOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0sCi1bQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKWRubAotXSkjIF9MVF9BQ19DSEVDS19ETEZDTgotCi0KLSMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCi1bQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgWyQ0XQotZWxzZQotICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCi0gIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLVsjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX1dCi1FT0YKLSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OwotICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OwotICAgICAgeCRsdF9kbHVua25vd258eCopICQzIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgICQzCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotXSkjIF9MVF9BQ19UUllfRExPUEVOX1NFTEYKLQotCi0jIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLAotW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotICBsdF9jdl9kbG9wZW49bm8KLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBiZW9zKikKLSAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIDs7Ci0KLSAgbWluZ3cqIHwgcHczMiopCi0gICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgIDs7Ci0KLSAgY3lnd2luKikKLSAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgIDs7Ci0KLSAgZGFyd2luKikKLSAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKLSAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCi0JCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCi0gICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIF0pCi0gICA7OwotCi0gICopCi0gICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAotCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKLSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCi0JICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdLAotCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAotCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAotCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKLQkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAotCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCi0JCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCi0JICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKLQkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdKQotCSAgICAgIF0pCi0JICAgIF0pCi0JICBdKQotCV0pCi0gICAgICBdKQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCi0gICAgZW5hYmxlX2Rsb3Blbj15ZXMKLSAgZWxzZQotICAgIGVuYWJsZV9kbG9wZW49bm8KLSAgZmkKLQotICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KLSAgZGxvcGVuKQotICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLSAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLQotICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCi0gICAgc2F2ZV9MSUJTPSIkTElCUyIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKLQkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCi0gICAgXSkKLQotICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgotICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi0gICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotICAgIAkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAotCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQotICAgICAgXSkKLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi1dKSMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgotCi0KLSMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgotQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAotW0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAotQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAotICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKLSAgW19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLV0pCi1dKSMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTwotCi0KLSMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKLUFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLAotW0FDX1JFUVVJUkUoW19MVF9BQ19MT0NLXSlkbmwKLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLV0pIyBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MKLQotCi0jIEFDX0xJQlRPT0xfT0JKRElSCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdLAotW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCi1bcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIGx0X2N2X29iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBsdF9jdl9vYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCi1vYmpkaXI9JGx0X2N2X29iamRpcgotXSkjIEFDX0xJQlRPT0xfT0JKRElSCi0KLQotIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgotQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT0KLWlmIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSIgfHwgXAotICAgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwgXAotICAgdGVzdCAiWCRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCi0gICAgIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKLWZpCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCi0KLWlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLV0pIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSAotCi0KLSMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCi1bc3RyaXBsaWI9Ci1vbGRfc3RyaXBsaWI9Ci1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCi1pZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCi0gIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCi0gIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgotICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotZWxzZQotIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgIGRhcndpbiopCi0gICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KLSAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCi0gICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotICAgICAgIGVsc2UKLSAgQUNfTVNHX1JFU1VMVChbbm9dKQotZmkKLSAgICAgICA7OwotICAgKikKLSAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgIDs7Ci0gIGVzYWMKLWZpCi1dKSMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCi0KLQotIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCi1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCi0gICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJwotCSAgIGVjaG8gJyB5ZXMgJwotCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBmaQotICAgIHNobGlicGF0aF92YXI9TElCUEFUSAotICBmaQotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVtbNDVdXSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgICAgIDs7Ci0gICAgbWluZ3cqKQotICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGxdOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotCi0gICopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkW1sxMjNdXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAotICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0JOzsKLSAgICAgICopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCTs7Ci0gICAgICBlc2FjCi0gIGVsc2UKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGZpCi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X3ZlbmRvciBpbgotICAgIHNuaSkKLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKLSAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgICA7OwotICAgIHNpZW1lbnMpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc2NvMy4ydjUqKQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLV0pIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgotCi0KLSMgX0xUX0FDX1RBR0NPTkZJRwotIyAtLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10sCi1bQUNfQVJHX1dJVEgoW3RhZ3NdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXRhZ3NAPDpAPVRBR1NAOj5AXSwKLSAgICAgICAgW2luY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QF0pXSwKLSAgICBbdGFnbmFtZXM9IiR3aXRodmFsIl0pCi0KLWlmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KLSAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbb3V0cHV0IGZpbGUgYCRvZmlsZScgZG9lcyBub3QgZXhpc3RdKQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKLSAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KLSAgICAgIEFDX01TR19XQVJOKFtvdXRwdXQgZmlsZSBgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdF0pCi0gICAgZWxzZQotICAgICAgQUNfTVNHX1dBUk4oW3VzaW5nIGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gYCRvZmlsZSddKQotICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgLXogIiRMVENGTEFHUyI7IHRoZW4KLSAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0ZMQUdTPSdgIgotICBmaQotCi0gICMgRXh0cmFjdCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgaW4gJG9maWxlLgotICAjIE5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgdGhlIGVudGlyZSBsaXN0IGlzIG9uIG9uZSBsaW5lLgotICBhdmFpbGFibGVfdGFncz1gZ3JlcCAiXmF2YWlsYWJsZV90YWdzPSIgIiR7b2ZpbGV9IiB8ICRTRUQgLWUgJ3MvYXZhaWxhYmxlX3RhZ3M9XCguKiRcKS9cMS8nIC1lICdzL1wiLy9nJ2AKLQotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgZm9yIHRhZ25hbWUgaW4gJHRhZ25hbWVzOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycwotICAgIGNhc2UgYCRlY2hvICJYJHRhZ25hbWUiIHwgJFhzZWQgLWUgJ3M6W1stX0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwLC9dXTo6ZydgIGluCi0gICAgIiIpIDs7Ci0gICAgKikgIEFDX01TR19FUlJPUihbaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWVdKQotCTs7Ci0gICAgZXNhYwotCi0gICAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIke29maWxlfSIgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBBQ19NU0dfRVJST1IoW3RhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0c10pCi0gICAgZmkKLQotICAgICMgVXBkYXRlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIjsgdGhlbgotICAgICAgZWNobyBhcHBlbmRpbmcgY29uZmlndXJhdGlvbiB0YWcgXCIkdGFnbmFtZVwiIHRvICRvZmlsZQotCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICBDWFgpCi0JaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKLQkgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0JICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotCSAgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBGNzcpCi0JaWYgdGVzdCAtbiAiJEY3NyIgJiYgdGVzdCAiWCRGNzciICE9ICJYbm8iOyB0aGVuCi0JICBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRwotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIEdDSikKLQlpZiB0ZXN0IC1uICIkR0NKIiAmJiB0ZXN0ICJYJEdDSiIgIT0gIlhubyI7IHRoZW4KLQkgIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCi0JZWxzZQotCSAgdGFnbmFtZT0iIgotCWZpCi0JOzsKLQotICAgICAgUkMpCi0JQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRwotCTs7Ci0KLSAgICAgICopCi0JQUNfTVNHX0VSUk9SKFtVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWVdKQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuZXcgdGFnIG5hbWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gICAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSIgOyB0aGVuCi0gICAgICBhdmFpbGFibGVfdGFncz0iJGF2YWlsYWJsZV90YWdzICR0YWduYW1lIgotICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICAjIE5vdyBzdWJzdGl0dXRlIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gIGlmIGV2YWwgInNlZCAtZSAncy9eYXZhaWxhYmxlX3RhZ3M9LipcJC9hdmFpbGFibGVfdGFncz1cIiRhdmFpbGFibGVfdGFnc1wiLycgXCIkb2ZpbGVcIiA+IFwiJHtvZmlsZX1UXCIiOyB0aGVuCi0gICAgbXYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIKLSAgICBjaG1vZCAreCAiJG9maWxlIgotICBlbHNlCi0gICAgcm0gLWYgIiR7b2ZpbGV9VCIKLSAgICBBQ19NU0dfRVJST1IoW3VuYWJsZSB0byB1cGRhdGUgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zLl0pCi0gIGZpCi1maQotXSkjIF9MVF9BQ19UQUdDT05GSUcKLQotCi0jIEFDX0xJQlRPT0xfRExPUEVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAotIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pCi1dKSMgQUNfTElCVE9PTF9ETE9QRU4KLQotCi0jIEFDX0xJQlRPT0xfV0lOMzJfRExMCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBETExzCi1BQ19ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pCi1dKSMgQUNfTElCVE9PTF9XSU4zMl9ETEwKLQotCi0jIEFDX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCi1BQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoW3NoYXJlZF0sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKLQlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUW0A6PkBdKV0sCi0gICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OwotICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0gICAgKikKLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfc2hhcmVkPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhY10sCi0gICAgW2VuYWJsZV9zaGFyZWQ9XUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKLV0pIyBBQ19FTkFCTEVfU0hBUkVECi0KLQotIyBBQ19ESVNBQkxFX1NIQVJFRAotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU0hBUkVEKG5vKQotXSkjIEFDX0RJU0FCTEVfU0hBUkVECi0KLQotIyBBQ19FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgotQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCi0JW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAotICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLSAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotICAgICopCi0gICAgIGVuYWJsZV9zdGF0aWM9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfc3RhdGljPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhY10sCi0gICAgW2VuYWJsZV9zdGF0aWM9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKLV0pIyBBQ19FTkFCTEVfU1RBVElDCi0KLQotIyBBQ19ESVNBQkxFX1NUQVRJQwotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU1RBVElDKG5vKQotXSkjIEFDX0RJU0FCTEVfU1RBVElDCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgotQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCi0gICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCi0gICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OwotICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0gICAgKikKLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhY10sCi0gICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKLV0pIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMCi0KLQotIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKQotXSkjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCi0KLQotIyBBQ19MSUJUT09MX1BJQ01PREUoW01PREVdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZwotIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgotQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCi1bQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotcGljX21vZGU9aWZlbHNlKCQjLDEsJDEsZGVmYXVsdCkKLV0pIyBBQ19MSUJUT09MX1BJQ01PREUKLQotCi0jIEFDX1BST0dfRUdSRVAKLSMgLS0tLS0tLS0tLS0tLQotIyBUaGlzIGlzIHByZWRlZmluZWQgc3RhcnRpbmcgd2l0aCBBdXRvY29uZiAyLjU0LCBzbyB0aGlzIGNvbmRpdGlvbmFsCi0jIGRlZmluaXRpb24gY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSByZXF1aXJlIEF1dG9jb25mIDIuNTQgb3IgbGF0ZXIuCi1tNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLCBbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdLAotW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZWdyZXBdLCBbYWNfY3ZfcHJvZ19lZ3JlcF0sCi0gICBbaWYgZWNobyBhIHwgKGdyZXAgLUUgJyhhfGIpJykgPi9kZXYvbnVsbCAyPiYxCi0gICAgdGhlbiBhY19jdl9wcm9nX2VncmVwPSdncmVwIC1FJwotICAgIGVsc2UgYWNfY3ZfcHJvZ19lZ3JlcD0nZWdyZXAnCi0gICAgZmldKQotIEVHUkVQPSRhY19jdl9wcm9nX2VncmVwCi0gQUNfU1VCU1QoW0VHUkVQXSkKLV0pXSkKLQotCi0jIEFDX1BBVEhfVE9PTF9QUkVGSVgKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pc2Ugc2hhcmVkIGxpYnJhcnkKLUFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKLVtjYXNlICRNQUdJQ19DTUQgaW4KLVtbXFwvKl0gfCAgPzpbXFwvXSpdKQotICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0qKQotICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1kbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KLWRubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKLWRubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCi0gIGFjX2R1bW15PSJpZmVsc2UoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhY10pCi1NQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLWlmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1dKSMgQUNfUEFUSF9UT09MX1BSRUZJWAotCi0KLSMgQUNfUEFUSF9NQUdJQwotIyAtLS0tLS0tLS0tLS0tCi0jIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5Ci1BQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10sCi1bQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCi1pZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICBBQ19QQVRIX1RPT0xfUFJFRklYKGZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCi0gIGVsc2UKLSAgICBNQUdJQ19DTUQ9OgotICBmaQotZmkKLV0pIyBBQ19QQVRIX01BR0lDCi0KLQotIyBBQ19QUk9HX0xECi0jIC0tLS0tLS0tLS0KLSMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oW0FDX1BST0dfTERdLAotW0FDX0FSR19XSVRIKFtnbnUtbGRdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCi0JW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCi0gICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCi0gICAgW3dpdGhfZ251X2xkPW5vXSkKLUFDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5ICRDQ10pCi0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQotICAgICAgcmVfZGlyZWx0PScvW1teL11dW1teL11dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0gICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JOzsKLSAgICAgICopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi1lbHNlCi0gIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19QUk9HX0xEX0dOVQotXSkjIEFDX1BST0dfTEQKLQotCi0jIEFDX1BST0dfTERfR05VCi0jIC0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAotQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjXSkKLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotXSkjIEFDX1BST0dfTERfR05VCi0KLQotIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCi0jICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLUFDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwKLVtBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCi0gIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAotICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCi1yZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKLWNhc2UgJHJlbG9hZF9mbGFnIGluCi0iIiB8ICIgIiopIDs7Ci0qKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKLWVzYWMKLXJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgZGFyd2luKikKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgIGVsc2UKLSAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBmaQotICAgIDs7Ci1lc2FjCi1dKSMgQUNfUFJPR19MRF9SRUxPQURfRkxBRwotCi0KLSMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcwotIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcwotQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwKLVtBQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKLWx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAotW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDQqIHwgYWl4NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpW1s0NV1dKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgOzsKLQotY3lnd2luKikKLSAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCi0gIDs7Ci0KLW1pbmd3KiB8IHB3MzIqKQotICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5Ci0gICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLgotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1mcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgaSo4NiApCi0gICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgotICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KLSAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JwotICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBmaQotICA7OwotCi1nbnUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ocHV4MTAuMjAqIHwgaHB1eDExKikKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KLSAgICA7OwotICBocHBhKjY0KikKLSAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nXQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAotICAgIDs7Ci0gICopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV0uW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotaW50ZXJpeDMqKQotICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298XC5hKSQnCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJExEIGluCi0gICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKLSAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7Ci0gICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKLSAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICBlc2FjCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotbmV0YnNkKikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW5ld29zNiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KLSAgOzsKLQotbnRvLXFueCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgOzsKLQotb3BlbmJzZCopCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc29sYXJpcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgcGMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotZXNhYwotXSkKLWZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi10ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLV0pIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAotCi0KLSMgQUNfUFJPR19OTQotIyAtLS0tLS0tLS0tCi0jIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKFtBQ19QUk9HX05NXSwKLVtBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSwgbHRfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBsdF9jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuIAotICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCi0gIGZpCi0gIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbwotICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgotICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0JIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQotCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKLQkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCi0JICBicmVhawotCSAgOzsKLQkqKQotCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCi0JICAqL2Rldi9udWxsKikKLQkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKLQkgICAgYnJlYWsKLQkgICAgOzsKLQkgICopCi0JICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICBkb25lCi0gIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGx0X2N2X3BhdGhfTk0iCi1dKSMgQUNfUFJPR19OTQotCi0KLSMgQUNfQ0hFQ0tfTElCTQotIyAtLS0tLS0tLS0tLS0tCi0jIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1MSUJNPQotY2FzZSAkaG9zdCBpbgotKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotZGFyd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtLCBvciBkb24ndCBuZWVkIGl0Ci0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09IiRMSUJNIC1sbSIpCi0gIDs7Ci0qKQotICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSItbG0iKQotICA7OwotZXNhYwotXSkjIEFDX0NIRUNLX0xJQk0KLQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UoW0RJUkVDVE9SWV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKLSMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcwotIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0Ci0jIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCi0jIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJwotIyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90Ci0jIHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4KLSMgdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsYy5sYQotICBMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKQotICAjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCi0gIElOQ0xUREw9IiRMVERMSU5DTCIKLV0pIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFCi0KLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFKFtESVJFQ1RPUlldKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkgYW5kCi0jIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKLSMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0Ci0jIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCi0jIGFuZCBhbiBpbnN0YWxsZWQgbGlibHRkbCBpcyBub3QgZm91bmQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLgotIyBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycjIGFuZCBMVERMSU5DTCB3aXRoCi0jICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQgdG9wX3NyY2RpcgotIyBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwKLVtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBsdF9kbGluaXQsCi0gIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCi0gIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCi0gICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQotICAgZWxzZQotICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgotICAgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCi0gIGVsc2UKLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKLSAgICBMSUJMVERMPSItbGx0ZGwiCi0gICAgTFRETElOQ0w9Ci0gIGZpCi0gICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KLSAgSU5DTFRETD0iJExURExJTkNMIgotXSkjIEFDX0xJQkxURExfSU5TVEFMTEFCTEUKLQotCi0jIEFDX0xJQlRPT0xfQ1hYCi0jIC0tLS0tLS0tLS0tLS0tCi0jIGVuYWJsZSBzdXBwb3J0IGZvciBDKysgbGlicmFyaWVzCi1BQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLAotW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0NYWF0pCi1dKSMgQUNfTElCVE9PTF9DWFgKLQotCi0jIF9MVF9BQ19MQU5HX0NYWAotIyAtLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKLUFDX1JFUVVJUkUoW19MVF9BQ19QUk9HX0NYWENQUF0pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYXSkKLV0pIyBfTFRfQUNfTEFOR19DWFgKLQotIyBfTFRfQUNfUFJPR19DWFhDUFAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwKLVsKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKLWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0gICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0gICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0gIEFDX1BST0dfQ1hYQ1BQCi1maQotXSkjIF9MVF9BQ19QUk9HX0NYWENQUAotCi0jIEFDX0xJQlRPT0xfRjc3Ci0jIC0tLS0tLS0tLS0tLS0tCi0jIGVuYWJsZSBzdXBwb3J0IGZvciBGb3J0cmFuIDc3IGxpYnJhcmllcwotQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwKLVtBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19GNzddKQotXSkjIEFDX0xJQlRPT0xfRjc3Ci0KLQotIyBfTFRfQUNfTEFOR19GNzcKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3XSkKLV0pIyBfTFRfQUNfTEFOR19GNzcKLQotCi0jIEFDX0xJQlRPT0xfR0NKCi0jIC0tLS0tLS0tLS0tLS0tCi0jIGVuYWJsZSBzdXBwb3J0IGZvciBHQ0ogbGlicmFyaWVzCi1BQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLAotW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0dDSl0pCi1dKSMgQUNfTElCVE9PTF9HQ0oKLQotCi0jIF9MVF9BQ19MQU5HX0dDSgotIyAtLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sW10sCi0gIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sW10sCi0gICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sW10sCi0gICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQUNfUFJPR19HQ0pdKV0sCi0JIFtpZmRlZihbQV1bTV9QUk9HX0dDSl0sW0FDX1JFUVVJUkUoW0FdW01fUFJPR19HQ0pdKV0sCi0JICAgW0FDX1JFUVVJUkUoW0FdW0NfUFJPR19HQ0pfT1JfQV1bTV9QUk9HX0dDSl0pXSldKV0pXSldKQotX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUdDSl0pCi1dKSMgX0xUX0FDX0xBTkdfR0NKCi0KLQotIyBBQ19MSUJUT09MX1JDCi0jIC0tLS0tLS0tLS0tLS0KLSMgZW5hYmxlIHN1cHBvcnQgZm9yIFdpbmRvd3MgcmVzb3VyY2UgZmlsZXMKLUFDX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwKLVtBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1JDXSkKLV9MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1SQ10pCi1dKSMgQUNfTElCVE9PTF9SQwotCi0KLSMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKLSMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKLSMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgotQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DX0NPTkZJR10pCi1BQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddLAotW2x0X3NhdmVfQ0M9IiRDQyIKLUFDX0xBTkdfUFVTSChDKQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9YwotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJwotCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi1BQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCi1BQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQotQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKLUFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi1BQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKLUFDX0xJQlRPT0xfRExPUEVOX1NFTEYKLQotIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0Ci1BQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1BQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1BPUAotQ0M9IiRsdF9zYXZlX0NDIgotXSkjIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRwotCi0KLSMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCi0jIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5Ci0jIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLUFDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DWFhfQ09ORklHKENYWCldKQotQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAotW0FDX0xBTkdfUFVTSChDKyspCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCi1BQ19SRVFVSVJFKFtfTFRfQUNfUFJPR19DWFhDUFBdKQotCi1fTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgotX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQotX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KLV9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpPQotX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQotX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9Y3BwCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH1cbicKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotX0xUX0FDX1NZU19DT01QSUxFUgotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSRDQwotbHRfc2F2ZV9MRD0kTEQKLWx0X3NhdmVfR0NDPSRHQ0MKLUdDQz0kR1hYCi1sdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAotbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECi1pZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCi0gIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKLWZpCi1pZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KLSAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAotZmkKLXRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCi1DQz0ke0NYWC0iYysrIn0KLWNvbXBpbGVyPSRDQwotX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotCi0jIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQotIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJwotZWxzZQotICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9Ci1maQotCi1pZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgotCi0gIEFDX1BST0dfTEQKLQotICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKLSAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bwotICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCi0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwgXAotCWdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gIGVsc2UKLSAgICB3aXRoX2dudV9sZD1ubwotICAgIHdsYXJjPQotCi0gICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KLSAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQotICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCi0gICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCi0gICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCi0gIGZpCi0KLSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLWVsc2UKLSAgR1hYPW5vCi0gIHdpdGhfZ251X2xkPW5vCi0gIHdsYXJjPQotZmkKLQotIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQotCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgY2FzZSAkbGRfZmxhZyBpbgotCSAgKi1icnRsKikKLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICBmaQotCi0gICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQotICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0gICAgICAjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQljb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQl0aGVuCi0JICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JZWxzZQotCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAotCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQlzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgIyBub3QgdXNpbmcgZ2NjCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0JIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQlzaGFyZWRfZmxhZz0nLUcnCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQllbHNlCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLSAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwotICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgIGVsc2UKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotICAgICAgZWxzZQotCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCV9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKLQkjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0JIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLSAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGNob3J1cyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGVsc2UKLQllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotICAgICAgZml+Ci0gICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIGZpCi0gIDs7Ci0gICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuW1swMTJdXSkKLSAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgZXNhYwotICAgICAgICAgZmkKLSAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCi0gICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICBpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgJEVHUkVQICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIGVsc2UKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgICBmaQotICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBmaQotICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBmaQotICAgICAgICA7OwotCi0gIGRndXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBlYysrKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGdoY3gqKQotCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBmcmVlYnNkW1sxMl1dKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKLSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgOzsKLSAgZnJlZWJzZC1lbGYqKQotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIDs7Ci0gIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKLSAgICAjIGNvbnZlbnRpb25zCi0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgICA7OwotICBnbnUqKQotICAgIDs7Ci0gIGhwdXg5KikKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgQ0MqKQotICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotICAgIGFDQyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAjCi0gICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0gICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotICAgICAgIyBkZXBlbmRlbmNpZXMuCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiW1stXV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotICAgICAgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgaHB1eDEwKnxocHV4MTEqKQotICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJwotICAgICAgICA7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICBocHBhKjY0KnxpYTY0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGFDQyopCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaHBwYSo2NCopCi0JICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGlhNjQqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBpbnRlcml4MyopCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgOzsKLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTR0kgQysrCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICBlbHNlCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0JICBmaQotCWZpCi0JX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0JOzsKLSAgICBlc2FjCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgOzsKLSAgbGludXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgZ3JlcCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgaWNwYyopCi0JIyBJbnRlbCBDKysKLQl3aXRoX2dudV9sZD15ZXMKLQkjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scwotCSMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCi0JIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KLQljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KLQkqIlZlcnNpb24gNy4iKikKLSAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKLQkgIHRtcF9pZHluPQotCSAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OwotCSAgZXNhYwotICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgOzsKLQllc2FjCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JOzsKLSAgICAgIHBnQ0MqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJwotICAJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0JX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICAgIDs7Ci0gICAgICBjeHgqKQotCSMgQ29tcGFxIEMrKwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCi0KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGx5bnhvcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIG04OGsqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBtdnMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBjeHgqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgIGZpCi0gICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucwotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJwotICAgIDs7Ci0gIG9wZW5ic2QyKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCi0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICBmaQotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgIDs7Ci0gIG9zZjMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJwotCi0JOzsKLSAgICAgIFJDQyopCi0JIyBSYXRpb25hbCBDKysgMi40LjEKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGN4eCopCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG9zZjQqIHwgb3NmNSopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICBjeHgqKQotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgotCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+Ci0JICAkcm0gJGxpYi5leHAnCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHBzb3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBzdW5vczQqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTdW4gQysrIDQueAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgbGNjKikKLQkjIEx1Y2lkCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzb2xhcmlzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCi0JX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQljYXNlICRob3N0X29zIGluCi0JICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OwotCSAgKikKLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIGlzIHVzZWQgYXMgbGlua2VyIHNvIHdlIG11c3QgdXNlICR3bAotCSAgICAjIGZsYWcgdG8gcGFzcyB0aGUgY29tbWFuZHMgdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtCi0JICAgICMgbGlua2VyLiBXZSBtdXN0IGFsc28gcGFzcyBlYWNoIGNvbnZpZW5jZSBsaWJyYXJ5IHRocm91Z2gKLQkgICAgIyB0byB0aGUgc3lzdGVtIGxpbmtlciBiZXR3ZWVuIGFsbGV4dHJhY3QvZGVmYXVsdGV4dHJhY3QuCi0JICAgICMgVGhlIEMrKyBjb21waWxlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLQkgICAgIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0JICAgICMgd2l0aG91dCAkd2wuCi0JICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0JICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCSAgICA7OwotCWVzYWMKLQlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgZ2N4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQotCSMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQkjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCi0JICBpZiAkQ0MgLS12ZXJzaW9uIHwgZ3JlcCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBlbHNlCi0JICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKLQkgICAgIyBwbGF0Zm9ybS4KLQkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKLQkgIGZpCi0KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQotICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0gICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotICAgICMgYXMgLXogZGVmcy4KLSAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0gICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKLSAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbwotICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0gICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQotICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgotICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KLSAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCi0gICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLSAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICB0YW5kZW0qKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBOQ0MqKQotCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdnh3b3JrcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gICopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCi10ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLV9MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCi1fTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi1BQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKCQxKQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUE9QCi1DQz0kbHRfc2F2ZV9DQwotTERDWFg9JExECi1MRD0kbHRfc2F2ZV9MRAotR0NDPSRsdF9zYXZlX0dDQwotd2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCi13aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAotbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECi1sdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKLWx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi1dKSMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKLQotIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCi0jIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLSMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci0jIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KLUFDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSxbCi1kbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKLWRubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCi1kbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCi1kbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAotZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCi1pZmVsc2UoWyQxXSxbXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotaW50IGE7Ci12b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQotRU9GCi1dLFskMV0sW0NYWF0sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLWNsYXNzIEZvbwotewotcHVibGljOgotICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KLXByaXZhdGU6Ci0gIGludCBhOwotfTsKLUVPRgotXSxbJDFdLFtGNzddLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0gICAgICBzdWJyb3V0aW5lIGZvbwotICAgICAgaW1wbGljaXQgbm9uZQotICAgICAgaW50ZWdlcio0IGEKLSAgICAgIGE9MAotICAgICAgcmV0dXJuCi0gICAgICBlbmQKLUVPRgotXSxbJDFdLFtHQ0pdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi1wdWJsaWMgY2xhc3MgZm9vIHsKLSAgcHJpdmF0ZSBpbnQgYTsKLSAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7Ci0gICAgYSA9IDA7Ci0gIH0KLX07Ci1FT0YKLV0pCi1kbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci1kbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLSAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi0KLSAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQotICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KLSAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubwotCi0gICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgotICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCi0gICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKLQotICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbwotICAgIGNhc2UgJHAgaW4KLQotICAgIC1MKiB8IC1SKiB8IC1sKikKLSAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgotICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KLSAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCi0JICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgotCSBwcmV2PSRwCi0JIGNvbnRpbnVlCi0gICAgICAgZWxzZQotCSBwcmV2PQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBjYXNlICRwIGluCi0JIC1MKiB8IC1SKikKLQkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKLQkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKLQkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KLQkgICBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KLQkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgotCSAgIGVsc2UKLQkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCi0JICAgZmkKLQkgICA7OwotCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZwotCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KLQkgZXNhYwotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KLQkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgotCSBlbHNlCi0JICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKi4kb2JqZXh0KQotICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAotICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgotICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgotCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcwotCSBjb250aW51ZQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgotCSAgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCi0JIGVsc2UKLQkgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCi0JIGZpCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KLQkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKLQkgZWxzZQotCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgotCi0gICAgZXNhYwotICBkb25lCi0KLSAgIyBDbGVhbiB1cC4KLSAgcm0gLWYgYS5vdXQgYS5leGUKLWVsc2UKLSAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKLWZpCi0KLSRybSAtZiBjb25mZXN0LiRvYmpleHQKLQotIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KLWlmZWxzZShbJDFdLFtDWFhdLAotW2Nhc2UgJGhvc3Rfb3MgaW4KLWludGVyaXgzKikKLSAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgotICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgotICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KLSAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQotICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0KLSAgOzsKLQotc29sYXJpcyopCi0gIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gIENDKikKLSAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgotICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKLSAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgotICAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsJDEpPSctbENzdGQgLWxDcnVuJwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLWVzYWMKLV0pCi0KLWNhc2UgIiAkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KLSoiIC1sYyAiKikgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Ci1lc2FjCi1dKSMgQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUAotCi0jIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQotIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQotIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1BQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLCBbX0xUX0FDX0xBTkdfRjc3X0NPTkZJRyhGNzcpXSkKLUFDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCi1BQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKLQotX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KLWFjX2V4dD1mCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSIgICAgICBzdWJyb3V0aW5lIHRcbiAgICAgIHJldHVyblxuICAgICAgZW5kXG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiAgICAgIHByb2dyYW0gdFxuICAgICAgZW5kXG4iCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLV9MVF9BQ19TWVNfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtGNzctImY3NyJ9Ci1jb21waWxlcj0kQ0MKLV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCi10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCi0KLV9MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHNzciCi1fTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUE9QCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKSMgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKLQotCi0jIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQotIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQotIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1BQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddLCBbX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyhHQ0opXSkKLUFDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSwKLVtBQ19MQU5HX1NBVkUKLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWphdmEKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfVxuJwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7R0NKLSJnY2oifQotY29tcGlsZXI9JENDCi1fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KLV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCi1fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKCQxKQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUkVTVE9SRQotQ0M9IiRsdF9zYXZlX0NDIgotXSkjIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCi0KLQotIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIgYXJlCi0jIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5Ci0jIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLUFDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSwgW19MVF9BQ19MQU5HX1JDX0NPTkZJRyhSQyldKQotQUNfREVGVU4oW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCi1bQUNfTEFOR19TQVZFCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9cmMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfVxuJwotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7UkMtIndpbmRyZXMifQotY29tcGlsZXI9JENDCi1fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1fTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1JFU1RPUkUKLUNDPSIkbHRfc2F2ZV9DQyIKLV0pIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCi0KLQotIyBBQ19MSUJUT09MX0NPTkZJRyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSWYgVEFHTkFNRSBpcyBub3QgcGFzc2VkLCB0aGVuIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0Ci0jIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UKLSMgYWRkIGNvZGUgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5Ci0jIFRBR05BTUUgZnJvbSB0aGUgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgotQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSwKLVsjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKENDLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoTEQsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0aW5zdGFsbF9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIocG9zdHVuaW5zdGFsbF9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKTsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJbJF0vWyRdMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1pZmVsc2UoWyQxXSwgW10sCi0gIFtjZmdmaWxlPSIke29maWxlfVQiCi0gIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gICRybSAtZiAiJGNmZ2ZpbGUiCi0gIEFDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pXSwKLSAgW2NmZ2ZpbGU9IiRvZmlsZSJdKQotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotaWZlbHNlKFskMV0sIFtdLAotWyMhICRTSEVMTAotCi0jIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6Ci0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KLVNFRD0kbHRfU0VECi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSIkU0VEIC1lIDFzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLSMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotYXZhaWxhYmxlX3RhZ3M9Ci0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHXSwKLVsjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKQotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKQotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kX0xUX0FDX1RBR1ZBUihHQ0MsICQxKQotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9bXV9MVF9BQ19UQUdWQVIoTEQsICQxKQotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKQotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKQotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKQotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKQotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKQotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfW11fTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9bXV9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwcmVkZXBzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfW11fTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKQotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKQotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKQotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKQotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKQotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRfTFRfQUNfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKSIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9bXV9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSkKLQotaWZlbHNlKFskMV0sW10sCi1bIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHXSwKLVsjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZV0pCi0KLV9fRU9GX18KLQotaWZlbHNlKFskMV0sW10sIFsKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQotCi0gIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwgXAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi1dKQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi1dKSMgQUNfTElCVE9PTF9DT05GSUcKLQotCi0jIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwKLVtBQ19SRVFVSVJFKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSlkbmwKLQotX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKLSAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAotICAgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQotZmkKLV0pIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSQotCi0KLSMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pCi1BQ19SRVFVSVJFKFtBQ19PQkpFWFRdKQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCi1BQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAotWwotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbW0JDREVHUlNUXV0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gaW50IFwxOy9wJyIKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICRob3N0X29zIGluCi1haXgqKQotICBzeW1jb2RlPSdbW0JDRFRdXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKLSAgOzsKLWhwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgc3ltY29kZT0nW1tBQkNERUdSU1RdXScKLSAgZmkKLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLSAgOzsKLWxpbnV4KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKLSAgOzsKLW9zZiopCi0gIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW1tCRFJUXV0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tbRFRdXScKLSAgOzsKLXN5c3Y0LjJ1dzIqKQotICBzeW1jb2RlPSdbW0RUXV0nCi0gIDs7Ci1zeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICBzeW1jb2RlPSdbW0FCRFRdXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbW0RGTlNUVV1dJwotICA7OwotZXNhYwotCi0jIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KLW9wdF9jcj0KLWNhc2UgJGJ1aWxkX29zIGluCi1taW5ndyopCi0gIG9wdF9jcj1gZWNobyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWNhc2UgYCROTSAtViAyPiYxYCBpbgotKkdOVSogfCAqJ3dpdGggQkZEJyopCi0gIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OwotZXNhYwotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi0gIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sgCV1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sgCV1dW1sgCV1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBubGlzdD1jb25mdGVzdC5ubQotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQotewotRU9GCi0JICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0JICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKLQkgIGx0X3NhdmVfTElCUz0iJExJQlMiCi0JICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1MkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoZmFpbGVkKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG9rKQotZmkKLV0pICMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCi0KLQotIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sCi1bX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ci0KLUFDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQotIGlmZWxzZShbJDFdLFtDWFhdLFsKLSAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgotICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLSAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgICA7OwotICAgIG1pbmd3KiB8IG9zMiogfCBwdzMyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCi0gICAgICA7OwotICAgICpkamdwcCopCi0gICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICAgIDs7Ci0gICAgaW50ZXJpeDMqKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGhwdXgqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCogfCBhaXg1KikKLQkjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCWVsc2UKLQkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotCWZpCi0JOzsKLSAgICAgIGNob3J1cyopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQljeGNoNjgqKQotCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICMgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgIGRhcndpbiopCi0gICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgICB4bGMqKQotICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xbm9jb21tb24nCi0gICAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgICAgICA7OwotICAgICAgICAgZXNhYwotICAgICAgIDs7Ci0gICAgICBkZ3V4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZWMrKyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIDs7Ci0JICBnaGN4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0JIyBGcmVlQlNEIHVzZXMgR05VIEMrKwotCTs7Ci0gICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLQkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKLQkgICAgZmkKLQkgICAgOzsKLQkgIGFDQyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBocHBhKjY0KnxpYTY0KikKLQkgICAgICAjICtaIHRoZSBkZWZhdWx0Ci0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBpbnRlcml4KikKLQkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKLQkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/Ci0JOzsKLSAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0JICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgbGludXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBLQ0MqKQotCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotCSAgICA7OwotCSAgaWNwYyogfCBlY3BjKikKLQkgICAgIyBJbnRlbCBDKysKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQkgICAgOzsKLQkgIHBnQ0MqKQotCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlci4KLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JICBjeHgqKQotCSAgICAjIENvbXBhcSBDKysKLQkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQotCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBseW54b3MqKQotCTs7Ci0gICAgICBtODhrKikKLQk7OwotICAgICAgbXZzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgY3h4KikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBuZXRic2QqKQotCTs7Ci0gICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKLQkgICAgOzsKLQkgIFJDQyopCi0JICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgRGlnaXRhbC9Db21wYXEgQysrCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHBzb3MqKQotCTs7Ci0gICAgICBzb2xhcmlzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCi0JICAgIDs7Ci0JICBnY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3Vub3M0KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC54Ci0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGxjYyopCi0JICAgICMgTHVjaWQKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHRhbmRlbSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIE5DQyopCi0JICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICB2eHdvcmtzKikKLQk7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gIGZpCi1dLAotWwotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeCopCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotICAgICAgZGFyd2luKikKLSAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgIHhsYyopCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xbm9jb21tb24nCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGljYyogfCBlY2MqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotICAgICAgICA7OwotICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCi0gICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCi0JIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJwotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBjY2MqKQotICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCi0gICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgdW5pY29zKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubwotICAgICAgOzsKLQotICAgIHV0czQqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi1dKQotQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLWlmIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCi0gIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSB3b3Jrc10sCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpLAotICAgIFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpaWZlbHNlKFskMV0sW10sWyAtRFBJQ10sW2lmZWxzZShbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCi0gICAgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7Ci0gICAgIGVzYWNdLAotICAgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0gICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotICAgIDs7Ci0gICopCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpaWZlbHNlKFskMV0sW10sWyAtRFBJQ10sW2lmZWxzZShbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSlcIgotQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCi0gIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKLSAgJGx0X3RtcF9zdGF0aWNfZmxhZywKLSAgW10sCi0gIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKLV0pCi0KLQotIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1BQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotaWZlbHNlKFskMV0sW0NYWF0sWwotICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDQqIHwgYWl4NSopCi0gICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0gICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGVsc2UKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICAgZmkKLSAgICA7OwotICBwdzMyKikKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0iJGx0ZGxsX2NtZHMiCi0gIDs7Ci0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dIC9zLy4qIFwoW1teIF1dKlwpL1wxIERBVEEvOy9eLiogX19ubV9fL3MvXi4qIF9fbm1fX1woW1teIF1dKlwpIFtbXiBdXSovXDEgREFUQS87L15JIC9kOy9eW1tBSVRXXV0gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIDs7Ci0gICopCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgZXNhYwotXSxbCi0gIHJ1bnBhdGhfdmFyPQotICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCi0gIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKLSAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCi0gIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIF9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSk9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0gICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0gICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KLSAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKLSAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCi0gICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCi0gICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucwotICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCi0gICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV0gL3MvLiogXChbW14gXV0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQl0bXBfYWRkZmxhZz0KLQljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KLQlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLQlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKLQl3bGFyYz0KLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopIAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKLSoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotCTs7Ci0JKikKLQkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJwotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICBmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm87IHRoZW4KLSAgICAgIHJ1bnBhdGhfdmFyPQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYWl4NCogfCBhaXg1KikKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAotCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9IiIKLSAgICAgIGVsc2UKLQkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KLQkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCi0JaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQlmaQotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQotCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQotCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0gIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0gIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLSAgCSAgICBicmVhawotICAJICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCSAgZWxzZQotICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0gIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKLSAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLSAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXNoYXJlZF9mbGFnPSctc2hhcmVkJwotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0JZmkKLSAgICAgIGVsc2UKLQkjIG5vdCB1c2luZyBnY2MKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLSAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKLSAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0gICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICAgZWxzZQotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotCWVsc2UKLQkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLQkgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCi0JICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVtbNDVdXSopCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYwotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJwotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgICAgbGliZXh0PWxpYgotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCi0gICAgICBzaHJleHRfY21kcz0iLmRsbCIKLSAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJwotICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKT0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCi0gICAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLltbMDEyXV0pCi0gICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJwotICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCSAgOzsKLQkqKQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKLQkgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAJKikKLSAJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfQUNfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqKQotICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKLSAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0gICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKLSAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKLSAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotICAgICAgIyBhcyAteiBkZWZzLgotICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCi0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHV0czQqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotXSkKLUFDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKLXRlc3QgIiRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCi14fHh5ZXMpCi0gICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKLSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGNhc2UgJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0pCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKLQlwaWNfZmxhZz0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQotICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci0gICAgICAgIGlmIEFDX1RSWV9FVkFMKF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKLSAgICAgICAgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICAgIGVsc2UKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIEFDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSldKQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci1lc2FjCi1dKSMgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUwotCi0KLSMgX0xUX0FDX0ZJTEVfTFRETExfQwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEJlIGNhcmVmdWwgdGhhdCB0aGUgc3RhcnQgbWFya2VyIGFsd2F5cyBmb2xsb3dzIGEgbmV3bGluZS4KLUFDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSwgWwotIyAvKiBsdGRsbC5jIHN0YXJ0cyBoZXJlICovCi0jICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8d2luZG93cy5oPgotIyAjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8c3RkaW8uaD4KLSMKLSMgI2lmbmRlZiBfX0NZR1dJTl9fCi0jICMgIGlmZGVmIF9fQ1lHV0lOMzJfXwotIyAjICAgIGRlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotIyAjICBlbmRpZgotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fY3BsdXNwbHVzCi0jIGV4dGVybiAiQyIgewotIyAjZW5kaWYKLSMgQk9PTCBBUElFTlRSWSBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKTsKLSMgI2lmZGVmIF9fY3BsdXNwbHVzCi0jIH0KLSMgI2VuZGlmCi0jCi0jICNpZmRlZiBfX0NZR1dJTl9fCi0jICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgotIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKLSMgI2VuZGlmCi0jIEhJTlNUQU5DRSBfX2hEbGxJbnN0YW5jZV9iYXNlOwotIwotIyBCT09MIEFQSUVOVFJZCi0jIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpCi0jIHsKLSMgICBfX2hEbGxJbnN0YW5jZV9iYXNlID0gaEluc3Q7Ci0jICAgcmV0dXJuIFRSVUU7Ci0jIH0KLSMgLyogbHRkbGwuYyBlbmRzIGhlcmUgKi8KLV0pIyBfTFRfQUNfRklMRV9MVERMTF9DCi0KLQotIyBfTFRfQUNfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0sIFtpZmVsc2UoWyQyXSwgW10sIFskMV0sIFskMV8kMl0pXSkKLQotCi0jIG9sZCBuYW1lcwotQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sICAgW0FDX1BST0dfTElCVE9PTF0pCi1BQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sICBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQotQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCAgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKLUFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQotQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCi1BQ19ERUZVTihbQU1fUFJPR19MRF0sICAgICAgICBbQUNfUFJPR19MRF0pCi1BQ19ERUZVTihbQU1fUFJPR19OTV0sICAgICAgICBbQUNfUFJPR19OTV0pCi0KLSMgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKQotCi1BQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLAotW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osIG5vKQotICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKLSAgQUNfU1VCU1QoR0NKRkxBR1MpCi1dKQotCi1BQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sCi1bQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywgbm8pCi1dKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIwotIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfU0VELiAgV2hlbiBpdCBpcyBhdmFpbGFibGUgaW4gICAjCi0jICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKLSMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExUX0FDX1BST0dfU0VECi0jIC0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCi0jIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCi1BQ19ERUZVTihbTFRfQUNfUFJPR19TRURdLAotW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKLVsjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KLSMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotbHRfYWNfbWF4PTAKLWx0X2FjX2NvdW50PTAKLSMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCi0jIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCi0gIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCi0gIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgotICBsdF9hY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgotICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgYnJlYWsKLSAgZmkKLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAotICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgotICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCi0gICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCi0gICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKLSAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCi0gICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgotICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGZpCi0gIGRvbmUKLWRvbmUKLV0pCi1TRUQ9JGx0X2N2X3BhdGhfU0VECi1BQ19NU0dfUkVTVUxUKFskU0VEXSkKLV0pCi0KLWRubCBBdXRvY29uZiBtYWNyb3MgZm9yIGxpYmdjcnlwdAotZG5sICAgICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubAotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKLWRubCB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKLWRubCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLWRubAotZG5sIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLWRubCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCi1kbmwgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotZG5sIEFNX1BBVEhfTElCR0NSWVBUKFtNSU5JTVVNLVZFUlNJT04sCi1kbmwgICAgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EIF1dXSkKLWRubCBUZXN0IGZvciBsaWJnY3J5cHQgYW5kIGRlZmluZSBMSUJHQ1JZUFRfQ0ZMQUdTIGFuZCBMSUJHQ1JZUFRfTElCUy4KLWRubCBNSU5JTVVOLVZFUlNJT04gaXMgYSBzdHJpbmcgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgb3B0aW9uYWxsaXkgcHJlZml4ZWQKLWRubCB3aXRoIHRoZSBBUEkgdmVyc2lvbiB0byBhbHNvIGNoZWNrIHRoZSBBUEkgY29tcGF0aWJpbGl0eS4gRXhhbXBsZToKLWRubCBhIE1JTklNVU4tVkVSU0lPTiBvZiAxOjEuMi41IHdvbid0IHBhc3MgdGhlIHRlc3QgdW5sZXNzIHRoZSBpbnN0YWxsZWQgCi1kbmwgdmVyc2lvbiBvZiBsaWJnY3J5cHQgaXMgYXQgbGVhc3QgMS4yLjUgKmFuZCogdGhlIEFQSSBudW1iZXIgaXMgMS4gIFVzaW5nCi1kbmwgdGhpcyBmZWF0dXJlcyBhbGxvd3MgdG8gcHJldmVudCBidWlsZCBhZ2FpbnN0IG5ld2VyIHZlcnNpb25zIG9mIGxpYmdjcnlwdAotZG5sIHdpdGggYSBjaGFuZ2VkIEFQSS4KLWRubAotQUNfREVGVU4oW0FNX1BBVEhfTElCR0NSWVBUXSwKLVsgQUNfQVJHX1dJVEgobGliZ2NyeXB0LXByZWZpeCwKLSAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZ2NyeXB0LXByZWZpeD1QRlhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBMSUJHQ1JZUFQgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKLSAgICAgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiIpCi0gIGlmIHRlc3QgeCRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgotICAgICBpZiB0ZXN0IHgke0xJQkdDUllQVF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgotICAgICAgICBMSUJHQ1JZUFRfQ09ORklHPSRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeC9iaW4vbGliZ2NyeXB0LWNvbmZpZwotICAgICBmaQotICBmaQotCi0gIEFDX1BBVEhfUFJPRyhMSUJHQ1JZUFRfQ09ORklHLCBsaWJnY3J5cHQtY29uZmlnLCBubykKLSAgdG1wPWlmZWxzZShbJDFdLCAsMToxLjIuMCwkMSkKLSAgaWYgZWNobyAiJHRtcCIgfCBncmVwICc6JyA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgotICAgICByZXFfbGliZ2NyeXB0X2FwaT1gZWNobyAiJHRtcCIgICAgIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDEvJ2AKLSAgICAgbWluX2xpYmdjcnlwdF92ZXJzaW9uPWBlY2hvICIkdG1wIiB8IHNlZCAncy9cKC4qXCk6XCguKlwpL1wyLydgCi0gIGVsc2UKLSAgICAgcmVxX2xpYmdjcnlwdF9hcGk9MAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249IiR0bXAiCi0gIGZpCi0KLSAgQUNfTVNHX0NIRUNLSU5HKGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49ICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24pCi0gIG9rPW5vCi0gIGlmIHRlc3QgIiRMSUJHQ1JZUFRfQ09ORklHIiAhPSAibm8iIDsgdGhlbgotICAgIHJlcV9tYWpvcj1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDEvJ2AKLSAgICByZXFfbWlub3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wyLydgCi0gICAgcmVxX21pY3JvPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMy8nYAotICAgIGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbj1gJExJQkdDUllQVF9DT05GSUcgLS12ZXJzaW9uYAotICAgIG1ham9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS4qL1wxLydgCi0gICAgbWlub3I9YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpLiovXDIvJ2AKLSAgICBtaWNybz1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMy8nYAotICAgIGlmIHRlc3QgIiRtYWpvciIgLWd0ICIkcmVxX21ham9yIjsgdGhlbgotICAgICAgICBvaz15ZXMKLSAgICBlbHNlIAotICAgICAgICBpZiB0ZXN0ICIkbWFqb3IiIC1lcSAiJHJlcV9tYWpvciI7IHRoZW4KLSAgICAgICAgICAgIGlmIHRlc3QgIiRtaW5vciIgLWd0ICIkcmVxX21pbm9yIjsgdGhlbgotICAgICAgICAgICAgICAgb2s9eWVzCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1lcSAiJHJlcV9taW5vciI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkbWljcm8iIC1nZSAiJHJlcV9taWNybyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgIG9rPXllcwotICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgotICAgIEFDX01TR19SRVNVTFQoW3llcyAoJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbildKQotICBlbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICAgIyBJZiB3ZSBoYXZlIGEgcmVjZW50IGxpYmdjcnlwdCwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUKLSAgICAgIyBBUEkgaXMgY29tcGF0aWJsZQotICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1ndCAwIDsgdGhlbgotICAgICAgICB0bXA9YCRMSUJHQ1JZUFRfQ09ORklHIC0tYXBpLXZlcnNpb24gMj4vZGV2L251bGwgfHwgZWNobyAwYAotICAgICAgICBpZiB0ZXN0ICIkdG1wIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtMSUJHQ1JZUFQgQVBJIHZlcnNpb25dKQotICAgICAgICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1lcSAiJHRtcCIgOyB0aGVuCi0gICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbb2theV0pCi0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBvaz1ubwotICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW2RvZXMgbm90IG1hdGNoLiB3YW50PSRyZXFfbGliZ2NyeXB0X2FwaSBnb3Q9JHRtcF0pCi0gICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgTElCR0NSWVBUX0NGTEFHUz1gJExJQkdDUllQVF9DT05GSUcgLS1jZmxhZ3NgCi0gICAgTElCR0NSWVBUX0xJQlM9YCRMSUJHQ1JZUFRfQ09ORklHIC0tbGlic2AKLSAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQotICBlbHNlCi0gICAgTElCR0NSWVBUX0NGTEFHUz0iIgotICAgIExJQkdDUllQVF9MSUJTPSIiCi0gICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKLSAgZmkKLSAgQUNfU1VCU1QoTElCR0NSWVBUX0NGTEFHUykKLSAgQUNfU1VCU1QoTElCR0NSWVBUX0xJQlMpCi1dKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC5tNCBiL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmY4YzQuLjAwMDAwMDAKLS0tIGEvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEyMzYgKzAsMCBAQAotIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTEuNiAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLgotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1tNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAotICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCi1tNF9pZihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSksIFsyLjY5XSwsCi1bbTRfd2FybmluZyhbdGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZm9yIGF1dG9jb25mIDIuNjkuCi1Zb3UgaGF2ZSBhbm90aGVyIHZlcnNpb24gb2YgYXV0b2NvbmYuICBJdCBtYXkgd29yaywgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvLgotSWYgeW91IGhhdmUgcHJvYmxlbXMsIHlvdSBtYXkgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0gZW50aXJlbHkuCi1UbyBkbyBzbywgdXNlIHRoZSBwcm9jZWR1cmUgZG9jdW1lbnRlZCBieSB0aGUgcGFja2FnZSwgdHlwaWNhbGx5IGBhdXRvcmVjb25mJy5dKV0pCi0KLSMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLSMgc2VyaWFsIDEgKHBrZy1jb25maWctMC4yNCkKLSMgCi0jIENvcHlyaWdodCDCqSAyMDA0IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwKLVttNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKLW00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF8oUEFUSHxMSUJESVJ8U1lTUk9PVF9ESVJ8QUxMT1dfU1lTVEVNXyhDRkxBR1N8TElCUykpKT8kXSkKLW00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHXyhESVNBQkxFX1VOSU5TVEFMTEVEfFRPUF9CVUlMRF9ESVJ8REVCVUdfU1BFVykkXSkKLUFDX0FSR19WQVIoW1BLR19DT05GSUddLCBbcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHldKQotQUNfQVJHX1ZBUihbUEtHX0NPTkZJR19QQVRIXSwgW2RpcmVjdG9yaWVzIHRvIGFkZCB0byBwa2ctY29uZmlnJ3Mgc2VhcmNoIHBhdGhdKQotQUNfQVJHX1ZBUihbUEtHX0NPTkZJR19MSUJESVJdLCBbcGF0aCBvdmVycmlkaW5nIHBrZy1jb25maWcncyBidWlsdC1pbiBzZWFyY2ggcGF0aF0pCi0KLWlmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KLQlBQ19QQVRIX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCi1maQotaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0JX3BrZ19taW5fdmVyc2lvbj1tNF9kZWZhdWx0KFskMV0sIFswLjkuMF0pCi0JQUNfTVNHX0NIRUNLSU5HKFtwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb25dKQotCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgotCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCWVsc2UKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQlQS0dfQ09ORklHPSIiCi0JZmkKLWZpW11kbmwKLV0pIyBQS0dfUFJPR19QS0dfQ09ORklHCi0KLSMgUEtHX0NIRUNLX0VYSVNUUyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQotIwotIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3RzLiAgU2ltaWxhcgotIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZhcmlhYmxlcyBvciBwcmludCBlcnJvcnMuCi0jCi0jIFBsZWFzZSByZW1lbWJlciB0aGF0IG00IGV4cGFuZHMgQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCi0jIG9ubHkgYXQgdGhlIGZpcnN0IG9jY3VyZW5jZSBpbiBjb25maWd1cmUuYWMsIHNvIGlmIHRoZSBmaXJzdCBwbGFjZQotIyBpdCdzIGNhbGxlZCBtaWdodCBiZSBza2lwcGVkIChzdWNoIGFzIGlmIGl0IGlzIHdpdGhpbiBhbiAiaWYiLCB5b3UKLSMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKLWlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCi0gICAgQUNfUlVOX0xPRyhbJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIiQxIl0pOyB0aGVuCi0gIG00X2RlZmF1bHQoWyQyXSwgWzpdKQotbTRfaWZ2YWxuKFskM10sIFtlbHNlCi0gICQzXSlkbmwKLWZpXSkKLQotIyBfUEtHX0NPTkZJRyhbVkFSSUFCTEVdLCBbQ09NTUFORF0sIFtNT0RVTEVTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19QS0dfQ09ORklHXSwKLVtpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCi0gICAgcGtnX2N2X1tdJDE9IiQkMSIKLSBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKLSAgICAgICAgICAgICAgICAgICAgIFtwa2dfY3ZfW10kMT1gJFBLR19DT05GSUcgLS1bXSQyICIkMyIgMj4vZGV2L251bGxgCi0JCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcyBdLAotCQkgICAgIFtwa2dfZmFpbGVkPXllc10pCi0gZWxzZQotICAgIHBrZ19mYWlsZWQ9dW50cmllZAotZmlbXWRubAotXSkjIF9QS0dfQ09ORklHCi0KLSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKLWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKLWVsc2UKLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCi1maVtdZG5sCi1dKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECi0KLQotIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAotIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCi0jCi0jCi0jIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCi0jIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCi0jIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYwotIwotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKLVtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKLUFDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAotQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCi0KLXBrZ19mYWlsZWQ9bm8KLUFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLQotX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCi1fUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQotCi1tNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCi1hbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KLVNlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCi0KLWlmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KLSAgIAlBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAotICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZWxzZSAKLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkJDFbXV9QS0dfRVJST1JTIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0KLQltNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoCi1bUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6Ci0KLSQkMV9QS0dfRVJST1JTCi0KLUNvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQotaW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KLQotX1BLR19URVhUXSlbXWRubAotICAgICAgICBdKQotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgotICAgICAJQUNfTVNHX1JFU1VMVChbbm9dKQotCW00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19GQUlMVVJFKAotW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAotaXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAotcGF0aCB0byBwa2ctY29uZmlnLgotCi1fUEtHX1RFWFQKLQotVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSlbXWRubAotICAgICAgICBdKQotZWxzZQotCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUwotCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCi0gICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0JJDMKLWZpW11kbmwKLV0pIyBQS0dfQ0hFQ0tfTU9EVUxFUwotCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAxCi0KLSMgQU1fQVVUT01BS0VfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEF1dG9tYWtlIFguWSB0cmFjZXMgdGhpcyBtYWNybyB0byBlbnN1cmUgYWNsb2NhbC5tNCBoYXMgYmVlbgotIyBnZW5lcmF0ZWQgZnJvbSB0aGUgbTQgZmlsZXMgYWNjb21wYW55aW5nIEF1dG9tYWtlIFguWS4KLSMgKFRoaXMgcHJpdmF0ZSBtYWNybyBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoaXMgZmlsZS4pCi1BQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sCi1bYW1fX2FwaV92ZXJzaW9uPScxLjExJwotZG5sIFNvbWUgdXNlcnMgZmluZCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBtaXN0YWtlIGl0IGZvciBhIHdheSB0bwotZG5sIHJlcXVpcmUgc29tZSBtaW5pbXVtIHZlcnNpb24uICBQb2ludCB0aGVtIHRvIHRoZSByaWdodCBtYWNyby4KLW00X2lmKFskMV0sIFsxLjExLjZdLCBbXSwKLSAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKLV0pCi0KLSMgX0FNX0FVVE9DT05GX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgYWNsb2NhbCB0cmFjZXMgdGhpcyBtYWNybyB0byBmaW5kIHRoZSBBdXRvY29uZiB2ZXJzaW9uLgotIyBUaGlzIGlzIGEgcHJpdmF0ZSBtYWNybyB0b28uICBVc2luZyBtNF9kZWZpbmUgc2ltcGxpZmllcwotIyB0aGUgbG9naWMgaW4gYWNsb2NhbCwgd2hpY2ggY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBkZWZpbml0aW9uLgotbTRfZGVmaW5lKFtfQU1fQVVUT0NPTkZfVkVSU0lPTl0sIFtdKQotCi0jIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gdGhleSBjYW4gYmUgdHJhY2VkLgotIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFNX0lOSVRfQVVUT01BS0UuCi1BQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCi1bQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMS42XSlkbmwKLW00X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCi0gIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKLV9BTV9BVVRPQ09ORl9WRVJTSU9OKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSldKQotCi0jIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEKLQotIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCi0jICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCi0jIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCi0jCi0jIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKLSMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKLSMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCi0jIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQotIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAotIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKLSMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KLSMKLSMgJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCi0jICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCi0jICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKLSMKLSMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKLSMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91Ci0jIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCi0jCi0jIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAotIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKLSMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKLSMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCi0jICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCi0jIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCi0jIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KLSMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgotIwotIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KLSMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQotIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCi0KLUFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCi1bZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KLUFDX1BSRVJFUShbMi41MF0pZG5sCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1dKQotCi0jIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDkKLQotIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi1BQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAotW0FDX1BSRVJFUSgyLjUyKWRubAotIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCi0JWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAotQUNfU1VCU1QoWyQxX1RSVUVdKWRubAotQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCi1tNF9kZWZpbmUoW19BTV9DT05EX1ZBTFVFXyQxXSwgWyQyXSlkbmwKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksCi0jIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMTIKLQotIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKLSMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCi0jIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncwotIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCi0jIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KLQotCi0jIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCi0jIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCi0jIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCi0jCi0jIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcwotIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgotIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCi0jIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgotQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAotQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAotQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCi0KLWlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIG00X2Nhc2UoWyQxXSwgW0NDXSwKLSAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCi0gICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7Ci0gICAgIGVzYWNdLAotICAgIFtDWFhdLAotICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKLSAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKLSAgICAgZXNhY10pCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi1dKQotQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCi1BTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotXSkKLQotCi0jIEFNX1NFVF9ERVBESVIKLSMgLS0tLS0tLS0tLS0tLQotIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KLSMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCi1BQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLUFDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKLV0pCi0KLQotIyBBTV9ERVBfVFJBQ0sKLSMgLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKLVtBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCi1bICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgotICBBTURFUEJBQ0tTTEFTSD0nXCcKLSAgYW1fX25vZGVwPSdfbm8nCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKLUFDX1NVQlNUKFthbV9fbm9kZXBdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pZG5sCi1dKQotCi0jIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSNzZXJpYWwgNQotCi0jIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW3sKLSAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKLSAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAotICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KLSAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCi0gICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7Ci0gICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OwotICBlc2FjCi0gIHNoaWZ0Ci0gIGZvciBtZgotICBkbwotICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotCi0KLSMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgotIwotIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCi0jIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKLSMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KLUFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCi0gICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA4Ci0KLSMgQU1fQ09ORklHX0hFQURFUiBpcyBvYnNvbGV0ZS4gIEl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IEFDX0NPTkZJR19IRUFERVJTLgotQVVfREVGVU4oW0FNX0NPTkZJR19IRUFERVJdLCBbQUNfQ09ORklHX0hFQURFUlMoJEApXSkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAxNgotCi0jIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgotIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCi0jIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKLSMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQotIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KLSMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KLSMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCi0jIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCi0jIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKLSMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KLUFDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKLVtBQ19QUkVSRVEoWzIuNjJdKWRubAotZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKLWRubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgotbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAotICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLSAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi0gIGZpCi1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotQUNfU1VCU1QoW0NZR1BBVEhfV10pCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLWRubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgotbTRfaWZ2YWwoWyQyXSwKLVttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCi1bX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCi1kbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KLW00X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAotICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKLQotX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCi1bQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKLUFDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAotQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCi0JICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCi0JCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCi1fQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKLVtBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCi0JCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCi0JCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCi1dKQotX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKLWRubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKLWRubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KLWRubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAotW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAotICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKLV0pCi0KLWRubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKLWRubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKLWRubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCi1tNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAotbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCi0KLQotIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLSMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgotCi0jIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCi0jIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKLSMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgotQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAotWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9JDEKLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEKLQotIyBBTV9QUk9HX0lOU1RBTExfU0gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSAkaW5zdGFsbF9zaC4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLWlmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKLSAgKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKLSAgZXNhYwotZmkKLUFDX1NVQlNUKGluc3RhbGxfc2gpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDIKLQotIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcwotIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCi1BQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKLVtybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKLQotIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9NQUtFX0lOQ0xVREUoKQotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgotQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCi1bYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLUFDX1NVQlNUKFthbV9fcXVvdGVdKQotQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQotcm0gLWYgY29uZmluYyBjb25mbWYKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDYKLQotIyBBTV9QUk9HX0NDX0NfTwotIyAtLS0tLS0tLS0tLS0tLQotIyBMaWtlIEFDX1BST0dfQ0NfQ19PLCBidXQgY2hhbmdlZCBmb3IgYXV0b21ha2UuCi1BQ19ERUZVTihbQU1fUFJPR19DQ19DX09dLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfQ19PXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbXBpbGVdKWRubAotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFtX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCi1ldmFsIGFtX3Q9XCRhY19jdl9wcm9nX2NjXyR7YW1fY2N9X2NfbwotaWYgdGVzdCAiJGFtX3QiICE9IHllczsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotZG5sIE1ha2Ugc3VyZSBBQ19QUk9HX0NDIGlzIG5ldmVyIGNhbGxlZCBhZ2Fpbiwgb3IgaXQgd2lsbCBvdmVycmlkZSBvdXIKLWRubCBzZXR0aW5nIG9mIENDLgotbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICBbbTRfZmF0YWwoW0FDX1BST0dfQ0MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBBTV9QUk9HX0NDX0NfT10pXSkKLV0pCi0KLSMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNgotCi0jIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAotW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCi0kMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBBTV9NSVNTSU5HX0hBU19SVU4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KLSMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgotQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCi1pZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7Ci0gICopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7Ci0gIGVzYWMKLWZpCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEKLQotIyBBTV9QUk9HX01LRElSX1AKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBgbWtkaXIgLXAnLgotQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCi1bQUNfUFJFUkVRKFsyLjYwXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCi1kbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCi1kbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLWRubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KLWRubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgotZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgotZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgotZG5sIE1LRElSX1ApLgotQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCi1jYXNlICRta2Rpcl9wIGluCi0gIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7Ci0gICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKLWVzYWMKLV0pCi0KLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTAgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNQotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKLVttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKLQotIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCi1bbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQotIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgotYW1fbGY9JwotJwotY2FzZSBgcHdkYCBpbgotICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZl1dKikKLSAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lXSk7OwotZXNhYwotY2FzZSAkc3JjZGlyIGluCi0gICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV1dKikKLSAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBzcmNkaXIgdmFsdWU6IGAkc3JjZGlyJ10pOzsKLWVzYWMKLQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgQU1fU0lMRU5UX1JVTEVTKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5hYmxlIGxlc3MgdmVyYm9zZSBidWlsZCBydWxlczsgd2l0aCB0aGUgZGVmYXVsdCBzZXQgdG8gREVGQVVMVAotIyAoYHllcycgYmVpbmcgbGVzcyB2ZXJib3NlLCBgbm8nIG9yIGVtcHR5IGJlaW5nIHZlcmJvc2UpLgotQUNfREVGVU4oW0FNX1NJTEVOVF9SVUxFU10sCi1bQUNfQVJHX0VOQUJMRShbc2lsZW50LXJ1bGVzXSwKLVsgIC0tZW5hYmxlLXNpbGVudC1ydWxlcyAgICAgICAgICBsZXNzIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiBgbWFrZSBWPTEnKQotICAtLWRpc2FibGUtc2lsZW50LXJ1bGVzICAgICAgICAgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MCcpXSkKLWNhc2UgJGVuYWJsZV9zaWxlbnRfcnVsZXMgaW4KLXllcykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7Ci1ubykgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTE7OwotKikgICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT1tNF9pZihbJDFdLCBbeWVzXSwgWzBdLCBbMV0pOzsKLWVzYWMKLWRubAotZG5sIEEgZmV3IGBtYWtlJyBpbXBsZW1lbnRhdGlvbnMgKGUuZy4sIE5vblN0b3AgT1MgYW5kIE5leHRTdGVwKQotZG5sIGRvIG5vdCBzdXBwb3J0IG5lc3RlZCB2YXJpYWJsZSBleHBhbnNpb25zLgotZG5sIFNlZSBhdXRvbWFrZSBidWcjOTkyOCBhbmQgYnVnIzEwMjM3LgotYW1fbWFrZT0ke01BS0UtbWFrZX0KLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRhbV9tYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXNdLAotICAgW2FtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzXSwKLSAgIFtpZiBBU19FQ0hPKFtbJ1RSVUU9JChCQVIkKFYpKQotQkFSMD1mYWxzZQotQkFSMT10cnVlCi1WPTEKLWFtX19kb2l0OgotCUAkKFRSVUUpCi0uUEhPTlk6IGFtX19kb2l0J11dKSB8ICRhbV9tYWtlIC1mIC0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzPXllcwotZWxzZQotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz1ubwotZmldKQotaWYgdGVzdCAkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMgPSB5ZXM7IHRoZW4KLSAgZG5sIFVzaW5nIGAkVicgaW5zdGVhZCBvZiBgJChWKScgYnJlYWtzIElSSVggbWFrZS4KLSAgQU1fVj0nJChWKScKLSAgQU1fREVGQVVMVF9WPSckKEFNX0RFRkFVTFRfVkVSQk9TSVRZKScKLWVsc2UKLSAgQU1fVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLSAgQU1fREVGQVVMVF9WPSRBTV9ERUZBVUxUX1ZFUkJPU0lUWQotZmkKLUFDX1NVQlNUKFtBTV9WXSlkbmwKLUFNX1NVQlNUX05PVE1BS0UoW0FNX1ZdKWRubAotQUNfU1VCU1QoW0FNX0RFRkFVTFRfVl0pZG5sCi1BTV9TVUJTVF9OT1RNQUtFKFtBTV9ERUZBVUxUX1ZdKWRubAotQUNfU1VCU1QoW0FNX0RFRkFVTFRfVkVSQk9TSVRZXSlkbmwKLUFNX0JBQ0tTTEFTSD0nXCcKLUFDX1NVQlNUKFtBTV9CQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNX0JBQ0tTTEFTSF0pZG5sCi1dKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAxCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzCi0KLSMgX0FNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcmV2ZW50IEF1dG9tYWtlIGZyb20gb3V0cHV0dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCi0jIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgotQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKLQotIyBBTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQdWJsaWMgc2lzdGVyIG9mIF9BTV9TVUJTVF9OT1RNQUtFLgotQUNfREVGVU4oW0FNX1NVQlNUX05PVE1BS0VdLCBbX0FNX1NVQlNUX05PVE1BS0UoJEApXSkKLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgX0FNX1BST0dfVEFSKEZPUk1BVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCi0jIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5Ci0jICR0YXJkaXIuCi0jICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKLSMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KLSMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKLUFDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAotWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFllcywgaXQncyBzdGlsbCB1c2VkCi0jIGluIHRoZSB3aWxkIDotKCAgV2Ugc2hvdWxkIGZpbmQgYSBwcm9wZXIgd2F5IHRvIGRlcHJlY2F0ZSBpdCAuLi4KLUFDX1NVQlNUKFtBTVRBUl0sIFsnJCR7VEFSLXRhcn0nXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPSckJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIicgYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJ10sCi0gICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCi0gICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQotQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQotIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgotX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKLV9hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9Ci0jIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKLSMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KLWZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCi1kbwotICBjYXNlICRfYW1fdG9vbCBpbgotICBnbnV0YXIpCi0gICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOwotICAgIGRvCi0gICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhawotICAgIGRvbmUKLSAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgotICAgIDs7Ci0gIHBsYWludGFyKQotICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCi0gICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KLSAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCi0gICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSd0YXIgeGYgLScKLSAgICA7OwotICBwYXgpCi0gICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSdwYXggLXInCi0gICAgOzsKLSAgY3BpbykKLSAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCi0gICAgOzsKLSAgbm9uZSkKLSAgICBhbV9fdGFyPWZhbHNlCi0gICAgYW1fX3Rhcl89ZmFsc2UKLSAgICBhbV9fdW50YXI9ZmFsc2UKLSAgICA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKLSAgIyBhbmQgYW1fX3VudGFyIHNldC4KLSAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCi0KLSAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKLSAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgotICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCi0gICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCi0gIGZpCi1kb25lCi1ybSAtcmYgY29uZnRlc3QuZGlyCi0KLUFDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKLUFDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKLUFDX1NVQlNUKFthbV9fdGFyXSkKLUFDX1NVQlNUKFthbV9fdW50YXJdKQotXSkgIyBfQU1fUFJPR19UQVIKLQotbTRfaW5jbHVkZShbYWNpbmNsdWRlLm00XSkKZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCmluZGV4IDJlODA5YzYuLjA3NzYzMjUgMTAwNzU1Ci0tLSBhL2F1dG9nZW4uc2gKKysrIGIvYXV0b2dlbi5zaApAQCAtMSw1NyArMSw0IEBACi0jISAvYmluL3NoCi0jIFJ1biB0aGlzIHRvIGdlbmVyYXRlIGFsbCB0aGUgaW5pdGlhbCBtYWtlZmlsZXMsIGV0Yy4KKyMhL2Jpbi9zaAogCi1zZXQgLWUKLQotc3JjZGlyPWBkaXJuYW1lICQwYAotdGVzdCAteiAiJHNyY2RpciIgJiYgc3JjZGlyPS4KLQotRElFPTAKLQotQVVUT01BS0U9YXV0b21ha2UtMS40Ci1BQ0xPQ0FMPWFjbG9jYWwtMS40Ci0KLSgkQVVUT01BS0UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLSAgICAgICAgQVVUT01BS0U9YXV0b21ha2UKLSAgICAgICAgQUNMT0NBTD1hY2xvY2FsCi19Ci0KLShhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgewotCWVjaG8KLQllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9jb25mIGluc3RhbGxlZCB0byBjb21waWxlIGxpYnZuY3NlcnZlci4iCi0JZWNobyAiRG93bmxvYWQgdGhlIGFwcHJvcHJpYXRlIHBhY2thZ2UgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCIKLQllY2hvICJvciBnZXQgdGhlIHNvdXJjZSB0YXJiYWxsIGF0IGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvIgotCURJRT0xCi19Ci0KLSgkQVVUT01BS0UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKLQllY2hvCi0JZWNobyAiWW91IG11c3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQgdG8gY29tcGlsZSBsaWJ2bmNzZXJ2ZXIuIgotCWVjaG8gIkdldCBmdHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vcHViL2F1dG9tYWtlL2F1dG9tYWtlLTEuNC50YXIuZ3oiCi0JZWNobyAiKG9yIGEgbmV3ZXIgdmVyc2lvbiBpZiBpdCBpcyBhdmFpbGFibGUpIgotCURJRT0xCi19Ci0KLWlmIHRlc3QgIiRESUUiIC1lcSAxOyB0aGVuCi0JZXhpdCAxCi1maQotCi0odGVzdCAtZiAkc3JjZGlyL3JmYi9yZmIuaCkgfHwgewotCWVjaG8gIllvdSBtdXN0IHJ1biB0aGlzIHNjcmlwdCBpbiB0aGUgdG9wLWxldmVsIGxpYnZuY3NlcnZlciBkaXJlY3RvcnkiCi0JZXhpdCAxCi19Ci0KLWlmIHRlc3QgLXogIiQqIjsgdGhlbgotCWVjaG8gIkkgYW0gZ29pbmcgdG8gcnVuIC4vY29uZmlndXJlIHdpdGggbm8gYXJndW1lbnRzIC0gaWYgeW91IHdpc2ggIgotICAgICAgICBlY2hvICJ0byBwYXNzIGFueSB0byBpdCwgcGxlYXNlIHNwZWNpZnkgdGhlbSBvbiB0aGUgJDAgY29tbWFuZCBsaW5lLiIKLWZpCi0KLSRBQ0xPQ0FMICRBQ0xPQ0FMX0ZMQUdTCi1hdXRvaGVhZGVyCi0kQVVUT01BS0UgLS1hZGQtbWlzc2luZyAtLWNvcHkKLWF1dG9jb25mCi0KLWVjaG8gIlJ1bm5pbmcgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIiAiJEAiCi0kc3JjZGlyL2NvbmZpZ3VyZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgIiRAIgotCi1lY2hvICJOb3cgdHlwZSAnbWFrZScgdG8gY29tcGlsZSBsaWJ2bmNzZXJ2ZXIuIgorYXV0b3JlY29uZiAtZml2ICYmCisuL2NvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvYXV0b200dGUuY2FjaGUvb3V0cHV0LjAgYi9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMGVmOC4uMDAwMDAwMAotLS0gYS9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMAorKysgL2Rldi9udWxsCkBAIC0xLDI2Mjg3ICswLDAgQEAKLUAlOkAhIC9iaW4vc2gKLUAlOkAgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLUAlOkAgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBMaWJWTkNTZXJ2ZXIgMC45LjkuCi1AJTpACi1AJTpAIFJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uCi1AJTpAIAotQCU6QCAKLUAlOkAgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIDE5OTgtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUAlOkAgCi1AJTpAIAotQCU6QCBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotQCU6QCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gQCU6QCgKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gQCU6QCgKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotYXNfbXlzZWxmPQotY2FzZSAkMCBpbiBAJTpAKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotIyBVc2UgYSBwcm9wZXIgaW50ZXJuYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5zdXJlIHdlIGRvbid0IGZhbGwKLSAgIyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIGNvbnRpbnVvdXNseSByZS1leGVjdXRpbmcgb3Vyc2VsdmVzLgotICBpZiB0ZXN0IHgiJHtfYXNfY2FuX3JlZXhlY30iICE9IHhubyAmJiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgotICAgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWM7Ci0gICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKLSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCi0jIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgotIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgotQkFTSF9FTlY9L2Rldi9udWxsCi1FTlY9L2Rldi9udWxsCi0odW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKLWNhc2UgJC0gaW4gQCU6QCAoKCgoCi0gICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OwotICAqdiogKSBhc19vcHRzPS12IDs7Ci0gICp4KiApIGFzX29wdHM9LXggOzsKLSAgKiApIGFzX29wdHM9IDs7Ci1lc2FjCi1leGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQotIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCi0jIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCi0kYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCi1hc19mbl9leGl0IDI1NQotICBmaQotICAjIFdlIGRvbid0IHdhbnQgdGhpcyB0byBwcm9wYWdhdGUgdG8gb3RoZXIgc3VicHJvY2Vzc2VzLgotICAgICAgICAgIHsgX2FzX2Nhbl9yZWV4ZWM9OyB1bnNldCBfYXNfY2FuX3JlZXhlYzt9Ci1pZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCi0gIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gQCU6QCgKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotIgotICBhc19yZXF1aXJlZD0iYXNfZm5fcmV0dXJuICgpIHsgKGV4aXQgXCQxKTsgfQotYXNfZm5fc3VjY2VzcyAoKSB7IGFzX2ZuX3JldHVybiAwOyB9Ci1hc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KLWFzX2ZuX3JldF9zdWNjZXNzICgpIHsgcmV0dXJuIDA7IH0KLWFzX2ZuX3JldF9mYWlsdXJlICgpIHsgcmV0dXJuIDE7IH0KLQotZXhpdGNvZGU9MAotYXNfZm5fc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fc3VjY2VzcyBmYWlsZWQuOyB9Ci1hc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KLWFzX2ZuX3JldF9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfc3VjY2VzcyBmYWlsZWQuOyB9Ci1hc19mbl9yZXRfZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQotaWYgKCBzZXQgeDsgYXNfZm5fcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4gOgotICAKLWVsc2UKLSAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotdGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQotdGVzdCAteCAvIHx8IGV4aXQgMSIKLSAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTwotICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgotICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCi10ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKLSAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLSAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotICAKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotYXNfZm91bmQ9ZmFsc2UKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgYXNfZm91bmQ9OgotICBjYXNlICRhc19kaXIgaW4gQCU6QCgKLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQotCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgYnJlYWsgMgotZmkKLWZpCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotICBhc19mb3VuZD1mYWxzZQotZG9uZQotJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCi0JICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1maTsgfQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICAgICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCi0jIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbwotIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KLSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KLUJBU0hfRU5WPS9kZXYvbnVsbAotRU5WPS9kZXYvbnVsbAotKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCi1jYXNlICQtIGluIEAlOkAgKCgoKAotICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKLSAgKnYqICkgYXNfb3B0cz0tdiA7OwotICAqeCogKSBhc19vcHRzPS14IDs7Ci0gICogKSBhc19vcHRzPSA7OwotZXNhYwotZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KLSMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAotIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgotJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgotZXhpdCAyNTUKLWZpCi0KLSAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6Ci0gICRhc19lY2hvICIkMDogVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCIKLSAgJGFzX2VjaG8gIiQwOiB0aGUgc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4iCi0gIGlmIHRlc3QgeCR7WlNIX1ZFUlNJT04rc2V0fSA9IHhzZXQgOyB0aGVuCi0gICAgJGFzX2VjaG8gIiQwOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiCi0gICAgJGFzX2VjaG8gIiQwOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIgotICBlbHNlCi0gICAgJGFzX2VjaG8gIiQwOiBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhbmQKLSQwOiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciBhYm91dCB5b3VyCi0kMDogc3lzdGVtLCBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcwotJDA6IG1lc3NhZ2UuIFRoZW4gaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuCi0kMDogdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKLSAgZmkKLSAgZXhpdCAxCi1maQotZmkKLWZpCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotZXhwb3J0IFNIRUxMCi0jIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KLUNMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Ci11bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKLQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotQCU6QCBhc19mbl91bnNldCBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci0KLUAlOkAgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgU2V0IEBTfEA/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgotYXNfZm5fc2V0X3N0YXR1cyAoKQotewotICByZXR1cm4gJDEKLX0gQCU6QCBhc19mbl9zZXRfc3RhdHVzCi0KLUAlOkAgYXNfZm5fZXhpdCBTVEFUVVMKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgotYXNfZm5fZXhpdCAoKQotewotICBzZXQgK2UKLSAgYXNfZm5fc2V0X3N0YXR1cyAkMQotICBleGl0ICQxCi19IEAlOkAgYXNfZm5fZXhpdAotCi1AJTpAIGFzX2ZuX21rZGlyX3AKLUAlOkAgLS0tLS0tLS0tLS0tLQotQCU6QCBDcmVhdGUgIkBTfEBhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSBAJTpAIGFzX2ZuX21rZGlyX3AKLQotQCU6QCBhc19mbl9leGVjdXRhYmxlX3AgRklMRQotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUZXN0IGlmIEZJTEUgaXMgYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuCi1hc19mbl9leGVjdXRhYmxlX3AgKCkKLXsKLSAgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXggIiQxIgotfSBAJTpAIGFzX2ZuX2V4ZWN1dGFibGVfcAotQCU6QCBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQotQCU6QCBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCi1AJTpAIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCi1AJTpAIGltcGxlbWVudGF0aW9ucy4KLWlmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxKz1cJDIKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxPVwkJDFcJDIKLSAgfQotZmkgIyBhc19mbl9hcHBlbmQKLQotQCU6QCBhc19mbl9hcml0aCBBUkcuLi4KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKLUAlOkAgZ2xvYmFsIEBTfEBhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cwotQCU6QCBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyBAU3xAKCgpKSBhbmQgZXhwci4KLWlmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPSQoKCAkKiApKQotICB9JwotZWxzZQotICBhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKLSAgfQotZmkgIyBhc19mbl9hcml0aAotCi0KLUAlOkAgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIE91dHB1dCAiYGJhc2VuYW1lIEBTfEAwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQotQCU6QCBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCi1AJTpAIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgotYXNfZm5fZXJyb3IgKCkKLXsKLSAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKLSAgaWYgdGVzdCAiJDQiOyB0aGVuCi0gICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgotICBhc19mbl9leGl0ICRhc19zdGF0dXMKLX0gQCU6QCBhc19mbl9lcnJvcgotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KLSAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKLWVsc2UKLSAgYXNfYmFzZW5hbWU9ZmFsc2UKLWZpCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi1hc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLWFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwotYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCi1hc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi1hc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTwotICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgewotICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KLQotICAjIElmIHdlIGhhZCB0byByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCwgd2UncmUgZW5zdXJlZCB0byBoYXZlCi0gICMgYWxyZWFkeSBkb25lIHRoYXQsIHNvIGVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gZG8gc28gYWdhaW4gYW5kIGZhbGwKLSAgIyBpbiBhbiBpbmZpbml0ZSBsb29wLiAgVGhpcyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBpbiBwcmFjdGljZS4KLSAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYwotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbiBAJTpAKCgoKCgKLS1uKikKLSAgY2FzZSBgZWNobyAneHlcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICB4eSkgIEVDSE9fQz0nXGMnOzsKLSAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAotICAgICAgIEVDSE9fVD0nCSc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotZmkKLWlmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KLSAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz0nbG4gLXMnCi0gICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgotICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPWxuCi0gIGVsc2UKLSAgICBhc19sbl9zPSdjcCAtcFInCi0gIGZpCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wUicKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1hc190ZXN0X3g9J3Rlc3QgLXgnCi1hc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi0KLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLWNhc2UgWCRFQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAotICA7OwotZXNhYwotCi1lY2hvPSR7RUNITy1lY2hvfQotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLWlmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0jIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDJxICIkMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGApIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICA6Ci1lbHNlCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICBlY2hvPSIkZGlyL2VjaG8iCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCi0gICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCi0gICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCi0JIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAlc1xuJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCVNIRUxMPSIkQ09ORklHX1NIRUxMIgotCWV4cG9ydCBTSEVMTAotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKLQkgIHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiJDAiICR7MSsiJEAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KLSMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgotRUNITz0kZWNobwotaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLQotCi0KLQotdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYCi0KLXRhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3NwotCi10ZXN0IC1uICIkREpESVIiIHx8IGV4ZWMgNzwmMCA8L2Rldi9udWxsCi1leGVjIDY+JjEKLQotIyBOYW1lIG9mIHRoZSBob3N0LgotIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgb2xkIEdOVS9MaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAotIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCi1hY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLQotIwotIyBJbml0aWFsaXphdGlvbnMuCi0jCi1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi1hY19jbGVhbl9maWxlcz0KLWFjX2NvbmZpZ19saWJvYmpfZGlyPS4KLUxJQkAmdEBPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotCi0jIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KLVBBQ0tBR0VfTkFNRT0nTGliVk5DU2VydmVyJwotUEFDS0FHRV9UQVJOQU1FPSdsaWJ2bmNzZXJ2ZXInCi1QQUNLQUdFX1ZFUlNJT049JzAuOS45JwotUEFDS0FHRV9TVFJJTkc9J0xpYlZOQ1NlcnZlciAwLjkuOScKLVBBQ0tBR0VfQlVHUkVQT1JUPSdodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcicKLVBBQ0tBR0VfVVJMPScnCi0KLSMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KLWFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NURExJQl9ICi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiIKLQotYWNfc3Vic3RfdmFycz0nYW1fX0VYRUVYVF9GQUxTRQotYW1fX0VYRUVYVF9UUlVFCi1MVExJQk9CSlMKLVJQTVNPVVJDRURJUgotV0lUSF9YMTFWTkNfRkFMU0UKLVdJVEhfWDExVk5DX1RSVUUKLUhBVkVfUlBNX0ZBTFNFCi1IQVZFX1JQTV9UUlVFCi1BTkRST0lEX0ZBTFNFCi1BTkRST0lEX1RSVUUKLU9TWF9GQUxTRQotT1NYX1RSVUUKLUxJTlVYX0ZBTFNFCi1MSU5VWF9UUlVFCi1DWUdJUENfRkFMU0UKLUNZR0lQQ19UUlVFCi1MSUJAJnRAT0JKUwotSEFWRV9HTlVUTFNfRkFMU0UKLUhBVkVfR05VVExTX1RSVUUKLUxJQkdDUllQVF9MSUJTCi1MSUJHQ1JZUFRfQ0ZMQUdTCi1MSUJHQ1JZUFRfQ09ORklHCi1XU09DS0xJQgotTUlOR1dfRkFMU0UKLU1JTkdXX1RSVUUKLUhBVkVfTElCR1RLX0ZBTFNFCi1IQVZFX0xJQkdUS19UUlVFCi1TRExfTElCUwotU0RMX0NGTEFHUwotSEFWRV9MSUJTRExfRkFMU0UKLUhBVkVfTElCU0RMX1RSVUUKLUhBVkVfTElCUE5HX0ZBTFNFCi1IQVZFX0xJQlBOR19UUlVFCi1IQVZFX0xJQkpQRUdfRkFMU0UKLUhBVkVfTElCSlBFR19UUlVFCi1IQVZFX0xJQlpfRkFMU0UKLUhBVkVfTElCWl9UUlVFCi1XSVRIX1dFQlNPQ0tFVFNfRkFMU0UKLVdJVEhfV0VCU09DS0VUU19UUlVFCi1XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRQotV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRQotSEFWRV9MSUJQVEhSRUFEX0ZBTFNFCi1IQVZFX0xJQlBUSFJFQURfVFJVRQotSlBFR19MREZMQUdTCi1IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0UKLUhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFCi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTCi1PU1hfT1BFTkdMX0ZBTFNFCi1PU1hfT1BFTkdMX1RSVUUKLUFWQUhJX0xJQlMKLUFWQUhJX0NGTEFHUwotSEFWRV9YMTFfRkFMU0UKLUhBVkVfWDExX1RSVUUKLVhfRVhUUkFfTElCUwotWF9MSUJTCi1YX1BSRV9MSUJTCi1YX0NGTEFHUwotWE1LTUYKLUhBVkVfTElCU1NMX0ZBTFNFCi1IQVZFX0xJQlNTTF9UUlVFCi1TU0xfTElCUwotQ1JZUFRfTElCUwotSEFWRV9NUDNMQU1FX0ZBTFNFCi1IQVZFX01QM0xBTUVfVFJVRQotV0lUSF9GRk1QRUdfRkFMU0UKLVdJVEhfRkZNUEVHX1RSVUUKLXdpdGhfZmZtcGVnCi1MSUJUT09MCi1hY19jdF9GNzcKLUZGTEFHUwotRjc3Ci1DWFhDUFAKLWFtX19mYXN0ZGVwQ1hYX0ZBTFNFCi1hbV9fZmFzdGRlcENYWF9UUlVFCi1DWFhERVBNT0RFCi1hY19jdF9DWFgKLUNYWEZMQUdTCi1DWFgKLUNQUAotT0JKRFVNUAotQVMKLURMTFRPT0wKLVJBTkxJQgotQVIKLUVDSE8KLUxOX1MKLUVHUkVQCi1HUkVQCi1ob3N0X29zCi1ob3N0X3ZlbmRvcgotaG9zdF9jcHUKLWhvc3QKLWJ1aWxkX29zCi1idWlsZF92ZW5kb3IKLWJ1aWxkX2NwdQotYnVpbGQKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLWFtX19mYXN0ZGVwQ0NfVFJVRQotQ0NERVBNT0RFCi1hbV9fbm9kZXAKLUFNREVQQkFDS1NMQVNICi1BTURFUF9GQUxTRQotQU1ERVBfVFJVRQotYW1fX3F1b3RlCi1hbV9faW5jbHVkZQotREVQRElSCi1PQkpFWFQKLUVYRUVYVAotYWNfY3RfQ0MKLUNQUEZMQUdTCi1MREZMQUdTCi1DRkxBR1MKLUNDCi1BTV9CQUNLU0xBU0gKLUFNX0RFRkFVTFRfVkVSQk9TSVRZCi1BTV9ERUZBVUxUX1YKLUFNX1YKLWFtX191bnRhcgotYW1fX3RhcgotQU1UQVIKLWFtX19sZWFkaW5nX2RvdAotU0VUX01BS0UKLUFXSwotbWtkaXJfcAotTUtESVJfUAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNCi1TVFJJUAotaW5zdGFsbF9zaAotTUFLRUlORk8KLUFVVE9IRUFERVIKLUFVVE9NQUtFCi1BVVRPQ09ORgotQUNMT0NBTAotVkVSU0lPTgotUEFDS0FHRQotQ1lHUEFUSF9XCi1hbV9faXNyYwotSU5TVEFMTF9EQVRBCi1JTlNUQUxMX1NDUklQVAotSU5TVEFMTF9QUk9HUkFNCi10YXJnZXRfYWxpYXMKLWhvc3RfYWxpYXMKLWJ1aWxkX2FsaWFzCi1MSUJTCi1FQ0hPX1QKLUVDSE9fTgotRUNIT19DCi1ERUZTCi1tYW5kaXIKLWxvY2FsZWRpcgotbGliZGlyCi1wc2RpcgotcGRmZGlyCi1kdmlkaXIKLWh0bWxkaXIKLWluZm9kaXIKLWRvY2Rpcgotb2xkaW5jbHVkZWRpcgotaW5jbHVkZWRpcgotbG9jYWxzdGF0ZWRpcgotc2hhcmVkc3RhdGVkaXIKLXN5c2NvbmZkaXIKLWRhdGFkaXIKLWRhdGFyb290ZGlyCi1saWJleGVjZGlyCi1zYmluZGlyCi1iaW5kaXIKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUKLXByZWZpeAotZXhlY19wcmVmaXgKLVBBQ0tBR0VfVVJMCi1QQUNLQUdFX0JVR1JFUE9SVAotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9UQVJOQU1FCi1QQUNLQUdFX05BTUUKLVBBVEhfU0VQQVJBVE9SCi1TSEVMTCcKLWFjX3N1YnN0X2ZpbGVzPScnCi1hY191c2VyX29wdHM9JwotZW5hYmxlX29wdGlvbl9jaGVja2luZwotZW5hYmxlX3NpbGVudF9ydWxlcwotZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcKLWVuYWJsZV9zaGFyZWQKLWVuYWJsZV9zdGF0aWMKLWVuYWJsZV9mYXN0X2luc3RhbGwKLXdpdGhfZ251X2xkCi1lbmFibGVfbGlidG9vbF9sb2NrCi13aXRoX3BpYwotd2l0aF90YWdzCi13aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2Zlcgotd2l0aF93ZWJzb2NrZXRzCi13aXRoXzI0YnBwCi13aXRoX2ZmbXBlZwotd2l0aF9jcnlwdAotd2l0aF9jcnlwdG8KLXdpdGhfc3NsCi13aXRoX3gKLXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcgotd2l0aF94MTF2bmMKLXdpdGhfeGtleWJvYXJkCi13aXRoX3hpbmVyYW1hCi13aXRoX3hyYW5kcgotd2l0aF94Zml4ZXMKLXdpdGhfeGRhbWFnZQotd2l0aF94dHJhcAotd2l0aF94cmVjb3JkCi13aXRoX2ZicG0KLXdpdGhfZHBtcwotd2l0aF92NGwKLXdpdGhfZmJkZXYKLXdpdGhfdWlucHV0Ci13aXRoX21hY29zeF9uYXRpdmUKLXdpdGhfYXZhaGkKLXdpdGhfanBlZwotd2l0aF9wbmcKLXdpdGhfbGliegotd2l0aF96bGliCi13aXRoX3B0aHJlYWQKLXdpdGhfc2RsX2NvbmZpZwotd2l0aF9nY3J5cHQKLXdpdGhfY2xpZW50X2djcnlwdAotd2l0aF9saWJnY3J5cHRfcHJlZml4Ci13aXRoX2dudXRscwotd2l0aF9pcHY2Ci0nCi0gICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcwotaG9zdF9hbGlhcwotdGFyZ2V0X2FsaWFzCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1MSUJTCi1DUFBGTEFHUwotQ1BQCi1DWFgKLUNYWEZMQUdTCi1DQ0MKLUNYWENQUAotRjc3Ci1GRkxBR1MKLVhNS01GCi1KUEVHX0xERkxBR1MnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICo9KSAgIGFjX29wdGFyZz0gOzsKLSAgKikgICAgYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAotICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KLSAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgotICAgIG5vKSA7OwotICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKLSAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgKi8gKQotICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCi0gICAgICBldmFsICRhY192YXI9XCRhY192YWw7OwotICBlc2FjCi0gICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCi1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBMaWJWTkNTZXJ2ZXIgMC45LjkgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCi0gICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KLSAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBAU3xAYWNfZGVmYXVsdF9wcmVmaXhAOj5ACi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBQUkVGSVhAOj5ACi0KLUJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgotXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKLWFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi1mb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgotCi1Gb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLQotRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgQDw6QERBVEFST09URElSL2RvYy9saWJ2bmNzZXJ2ZXJAOj5ACi0gIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVggZmVhdHVyZXM6Ci0gIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0gIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIExpYlZOQ1NlcnZlciAwLjkuOToiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgICAgICAgIGxlc3MgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MScpCi0gIC0tZGlzYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0wJykKLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotICAtLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PXllc0A6PkAKLSAgLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QCAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKLQotT3B0aW9uYWwgUGFja2FnZXM6Ci0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkAKLSAgLS13aXRoLXBpYyAgICAgICAgICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhAOj5ACi0gIC0td2l0aC10YWdzQDw6QD1UQUdTQDo+QCAgICAgIGluY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QAotICAtLXdpdGhvdXQtZmlsZXRyYW5zZmVyICBkaXNhYmxlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wKLSAgLS13aXRob3V0LXdlYnNvY2tldHMgICAgZGlzYWJsZSBXZWJTb2NrZXRzIHN1cHBvcnQKLSAgLS13aXRob3V0LTI0YnBwICAgICAgICAgZGlzYWJsZSAyNCBicHAgZnJhbWVidWZmZXJzCi0gIC0td2l0aC1mZm1wZWc9ZGlyICAgICAgIHNldCBmZm1wZWcgaG9tZSBkaXJlY3RvcnkKLSAgLS13aXRob3V0LWNyeXB0ICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBsaWJjcnlwdAotICAtLXdpdGhvdXQtY3J5cHRvICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIG9wZW5zc2wgbGliY3J5cHRvCi0gIC0td2l0aG91dC1zc2wgICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3Igb3BlbnNzbCBsaWJzc2wKLSAgLS13aXRoLXNzbD1ESVIgICAgICAgICAgdXNlIG9wZW5zc2wgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbQotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciAgICAgdXNlIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgZm9yIHgxMXZuYwotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcj1ESVIgdXNlIGxpYnZuY3NlcnZlciBpbnN0YWxsZWQgaW4gRElSIGZvciB4MTF2bmMKLSAgLS13aXRoLXgxMXZuYyAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyB0aGUgeDExdm5jIHN1YmRpciAoaWYgcHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBjZCB0byB4MTF2bmMgYW5kIHJ1biAnbWFrZScgZXRjLgotICAtLXdpdGhvdXQteGtleWJvYXJkICAgICBkaXNhYmxlIHhrZXlib2FyZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteGluZXJhbWEgICAgICBkaXNhYmxlIHhpbmVyYW1hIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmFuZHIgICAgICAgIGRpc2FibGUgeHJhbmRyIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14ZGFtYWdlICAgICAgIGRpc2FibGUgeGRhbWFnZSBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteHRyYXAgICAgICAgICBkaXNhYmxlIHh0cmFwIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmVjb3JkICAgICAgIGRpc2FibGUgeHJlY29yZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQtZmJwbSAgICAgICAgICBkaXNhYmxlIGZicG0gZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LWRwbXMgICAgICAgICAgZGlzYWJsZSBkcG1zIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC12NGwgICAgICAgICAgIGRpc2FibGUgdmlkZW80bGludXggc3VwcG9ydAotICAtLXdpdGhvdXQtZmJkZXYgICAgICAgICBkaXNhYmxlIGxpbnV4IGZiIGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC11aW5wdXQgICAgICAgIGRpc2FibGUgbGludXggdWlucHV0IGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC1tYWNvc3gtbmF0aXZlIGRpc2FibGUgTWFjT1MgWCBuYXRpdmUgZGlzcGxheSBzdXBwb3J0Ci0gIC0td2l0aG91dC1hdmFoaSAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgQXZhaGkvbUROUwotICAtLXdpdGgtYXZhaGk9RElSICAgICAgICB1c2UgYXZhaGkgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtanBlZyAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGpwZWcKLSAgLS13aXRoLWpwZWc9RElSICAgICAgICAgdXNlIGpwZWcgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtcG5nICAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIHBuZwotICAtLXdpdGgtcG5nPURJUiAgICAgICAgICB1c2UgcG5nIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWxpYnogICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBkZWZsYXRlCi0gIC0td2l0aG91dC16bGliICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgZGVmbGF0ZQotICAtLXdpdGgtemxpYj1ESVIgICAgICAgICB1c2UgemxpYiBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1wdGhyZWFkICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgbGlicHRocmVhZAotICAtLXdpdGgtc2RsLWNvbmZpZz1GSUxFCi0gICAgVXNlIHRoZSBnaXZlbiBwYXRoIHRvIHNkbC1jb25maWcgd2hlbiBkZXRlcm1pbmluZwotICAgIFNETCBjb25maWd1cmF0aW9uOyBkZWZhdWx0cyB0byAic2RsLWNvbmZpZyIKLSAgLS13aXRob3V0LWdjcnlwdCAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQKLSAgLS13aXRob3V0LWNsaWVudC1nY3J5cHQgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQgaW4gbGlidm5jY2xpZW50Ci0gIC0td2l0aC1saWJnY3J5cHQtcHJlZml4PVBGWCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IHdoZXJlIExJQkdDUllQVCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKQotICAtLXdpdGhvdXQtZ251dGxzICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGdudXRscwotICAtLXdpdGgtZ251dGxzPURJUiAgICAgICB1c2UgZ251dGxzIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWlwdjYgICAgICAgICAgZGlzYWJsZSBJUHY2IHN1cHBvcnQKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLSAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCi0gIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKLSAgRjc3ICAgICAgICAgRm9ydHJhbiA3NyBjb21waWxlciBjb21tYW5kCi0gIEZGTEFHUyAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgZmxhZ3MKLSAgWE1LTUYgICAgICAgUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW0KLSAgSlBFR19MREZMQUdTIAotICAgICAgICAgICAgICBMaW5rZXIgZmxhZ3MgdG8gdXNlIHdoZW4gbGlua2luZyB3aXRoIGxpYmpwZWcsIGUuZy4KLSAgICAgICAgICAgICAgLUwvZm9vL2Rpci9saWIgLVdsLC1zdGF0aWMgLWxqcGVnIC1XbCwtc2hhcmVkLiBUaGlzIG92ZXJyaWRlcwotICAgICAgICAgICAgICB0aGUgbGlua2VyIGZsYWdzIHNldCBieSAtLXdpdGgtanBlZy4KLQotVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLWl0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KLQotUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyPi4KLV9BQ0VPRgotYWNfc3RhdHVzPSQ/Ci1maQotCi1pZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCi0gICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCi0gIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCi0gICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKLSAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAotICAgICAgY29udGludWUKLSAgICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0gICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQotICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgotICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCi0gICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbHNlCi0gICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgotICAgIGZpIHx8IGFjX3N0YXR1cz0kPwotICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KLSAgZG9uZQotZmkKLQotdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCi1pZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCi0gIGNhdCA8PFxfQUNFT0YKLUxpYlZOQ1NlcnZlciBjb25maWd1cmUgMC45LjkKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OQotCi1Db3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotQCU6QCBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jX3RyeV9jb21waWxlCi0KLUAlOkAgYWNfZm5fY190cnlfbGluayBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIGxpbmsgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfbGluayAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jX3RyeV9saW5rCi0KLUAlOkAgYWNfZm5fY190cnlfY3BwIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2NfdHJ5X2NwcCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgIGFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jX3RyeV9jcHAKLQotQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZwotQCU6QCB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCi1AJTpAIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLUAlOkBpbmNsdWRlIDwkMj4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDwkMj4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKLSAgeWVzOm5vOiApCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSggJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMiCi0gICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKLSAgICA7OwotZXNhYwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAotCi1AJTpAIGFjX2ZuX2NfdHJ5X3J1biBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuIEFzc3VtZXMKLUAlOkAgdGhhdCBleGVjdXRhYmxlcyAqY2FuKiBiZSBydW4uCi1hY19mbl9jX3RyeV9ydW4gKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotICAgICAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICAgICAgYWNfcmV0dmFsPSRhY19zdGF0dXMKLWZpCi0gIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19IEAlOkAgYWNfZm5fY190cnlfcnVuCi0KLUAlOkAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCi1AJTpAIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLUAlOkBpbmNsdWRlIDwkMj4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLQotfSBAJTpAIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKLQotQCU6QCBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBGVU5DIGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5Ci1hY19mbl9jX2NoZWNrX2Z1bmMgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJDIKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkMiAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJDIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDM9eWVzIgotZWxzZQotICBldmFsICIkMz1ubyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLQotfSBAJTpAIGFjX2ZuX2NfY2hlY2tfZnVuYwotCi1AJTpAIGFjX2ZuX2N4eF90cnlfY29tcGlsZSBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jeHhfdHJ5X2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19IEAlOkAgYWNfZm5fY3h4X3RyeV9jb21waWxlCi0KLUAlOkAgYWNfZm5fY3h4X3RyeV9jcHAgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jeHhfdHJ5X2NwcCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKLQkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgICBhY19yZXR2YWw9MQotZmkKLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19IEAlOkAgYWNfZm5fY3h4X3RyeV9jcHAKLQotQCU6QCBhY19mbl9jeHhfdHJ5X2xpbmsgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIGxpbmsgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY3h4X3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Ci0JIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Ci0JIHRlc3QgLXggY29uZnRlc3QkYWNfZXhlZXh0Ci0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KLSAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAotICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcwotICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCi0gIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19IEAlOkAgYWNfZm5fY3h4X3RyeV9saW5rCi0KLUAlOkAgYWNfZm5fZjc3X3RyeV9jb21waWxlIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2Y3N190cnlfY29tcGlsZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9mNzdfdHJ5X2NvbXBpbGUKLQotQCU6QCBhY19mbl9mNzdfdHJ5X2xpbmsgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIGxpbmsgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fZjc3X3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Ci0JIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Ci0JIHRlc3QgLXggY29uZnRlc3QkYWNfZXhlZXh0Ci0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KLSAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAotICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcwotICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCi0gIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0gIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAotCi19IEAlOkAgYWNfZm5fZjc3X3RyeV9saW5rCi0KLUAlOkAgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCi1AJTpAIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfdHlwZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPW5vIgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1pZiAoc2l6ZW9mICgkMikpCi0JIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCgkMikpKQotCSAgICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgZXZhbCAiJDM9eWVzIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLQotfSBAJTpAIGFjX2ZuX2NfY2hlY2tfdHlwZQotY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLQotSXQgd2FzIGNyZWF0ZWQgYnkgTGliVk5DU2VydmVyICRhc19tZSAwLjkuOSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICAkICQwICRACi0KLV9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci1jYXQgPDxfQVNVTkFNRQotIyMgLS0tLS0tLS0tICMjCi0jIyBQbGF0Zm9ybS4gIyMKLSMjIC0tLS0tLS0tLSAjIwotCi1ob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCi0KLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotX0FTVU5BTUUKLQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLX0gPiY1Ci0KLWNhdCA+JjUgPDxfQUNFT0YKLQotCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgQ29yZSB0ZXN0cy4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi0KLV9BQ0VPRgotCi0KLSMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgotIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCi1hY19jb25maWd1cmVfYXJncz0KLWFjX2NvbmZpZ3VyZV9hcmdzMD0KLWFjX2NvbmZpZ3VyZV9hcmdzMT0KLWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCi1mb3IgYWNfcGFzcyBpbiAxIDIKLWRvCi0gIGZvciBhY19hcmcKLSAgZG8KLSAgICBjYXNlICRhY19hcmcgaW4KLSAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Ci0gICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICAgIGNvbnRpbnVlIDs7Ci0gICAgKlwnKikKLSAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgJGFjX3Bhc3MgaW4KLSAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OwotICAgIDIpCi0gICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgotICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCi0JYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgotICAgICAgZWxzZQotCWNhc2UgJGFjX2FyZyBpbgotCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCi0JICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCi0JICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCi0JICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKLQkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCi0JICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi17IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Ci17IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9Ci0KLSMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKLSMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCi0jIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KLSMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgotIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgotdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCi0gIHsKLSAgICBlY2hvCi0KLSAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICBlY2hvCi0gICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKLSAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICBzZWQgLW4gXAotCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKQotICAgIGVjaG8KLQotICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgIGVjaG8KLSAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCi0gICAgZG8KLSAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgICAgY2FzZSAkYWNfdmFsIGluCi0gICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0gICAgICBlc2FjCi0gICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLQllc2FjCi0JJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgotICAgICAgZG9uZSB8IHNvcnQKLSAgICAgIGVjaG8KLSAgICBmaQotCi0gICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCi0gICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIyIKLSAgICAgIGVjaG8KLSAgICAgIGNhdCBjb25mZGVmcy5oCi0gICAgICBlY2hvCi0gICAgZmkKLSAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCi0gICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCi0gIH0gPiY1Ci0gIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgotICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKLSAgICBleGl0ICRleGl0X3N0YXR1cwotJyAwCi1mb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KLSAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCi1kb25lCi1hY19zaWduYWw9MAotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKLQotJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCi1fQUNFT0YKLQotCi0jIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KLSMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1hY19zaXRlX2ZpbGUxPU5PTkUKLWFjX3NpdGVfZmlsZTI9Tk9ORQotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgotICBjYXNlICRDT05GSUdfU0lURSBpbiBAJTpAKCgKLSAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwotICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OwotICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQotICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1lbHNlCi0gIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCi1kbwotICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQotICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Ci0gICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1Ci0gICAgLiAiJGFjX3NpdGVfZmlsZSIgXAotICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCi0gICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgY2FzZSAkY2FjaGVfZmlsZSBpbgotICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OwotICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OwotICAgIGVzYWMKLSAgZmkKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgPiRjYWNoZV9maWxlCi1maQotCi0jIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCi0jIHZhbHVlLgotYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgotICAgIHNldCwpCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICxzZXQpCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLCk7OwotICAgICopCi0gICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCi0JIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCi0JYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCi0JYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCi0JaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCi0JICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQotCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKLQllbHNlCi0JICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQotCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAotCWZpCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9Ci0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9Ci0gICAgICBmaTs7Ci0gIGVzYWMKLSAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgotICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KLSAgICBjYXNlICRhY19uZXdfdmFsIGluCi0gICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwotICAgIGVzYWMKLSAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KLSAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgotICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KLSAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1Ci1maQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotYW1fX2FwaV92ZXJzaW9uPScxLjExJwotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KLSAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKLWZpCi0KLSMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAotIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgotIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5Ci0jIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi0jIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4gQCU6QCgoCi0gIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0gID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgotCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQotCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bwotCSAgICBta2RpciBjb25mdGVzdC5kaXIKLQkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKLQkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bwotCSAgICB0aGVuCi0JICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICAgIGJyZWFrIDMKLQkgICAgZmkKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLXJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLSRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKLSMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KLWFtX2xmPScKLScKLWNhc2UgYHB3ZGAgaW4KLSAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZl0qKQotICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZSIgIiRMSU5FTk8iIDU7OwotZXNhYwotY2FzZSAkc3JjZGlyIGluCi0gICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXSopCi0gICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6IFxgJHNyY2RpciciICIkTElORU5PIiA1OzsKLWVzYWMKLQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAiJExJTkVOTyIgNQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIGFzX2ZuX2Vycm9yICQ/ICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLgotIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KLWFjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAotCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi0KLWlmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgotICBjYXNlICRhbV9hdXhfZGlyIGluCi0gICpcICogfCAqXAkqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKLSAgKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKLSAgZXNhYwotZmkKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KLWZpCi0KLWlmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKLSAgKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKLSAgZXNhYwotZmkKLQotIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCi0jIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0Ci0jIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCi0jIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKLSRhc19lY2hvICIkU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFNUUklQPSRhY19jdF9TVFJJUAotICBmaQotZWxzZQotICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1maQotCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcGF0aF9ta2Rpcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCi0JIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCSAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgfHwgY29udGludWUKLQkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCi0JICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAotCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAotCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQotCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKLQkgICAgICAgYnJlYWsgMzs7Ci0JICAgZXNhYwotCSBkb25lCi0gICAgICAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgTUtESVJfUD0iJGFjX2luc3RhbGxfc2ggLWQiCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLSRhc19lY2hvICIkTUtESVJfUCIgPiY2OyB9Ci0KLW1rZGlyX3A9IiRNS0RJUl9QIgotY2FzZSAkbWtkaXJfcCBpbgotICBbXFwvJF0qIHwgPzpbXFwvXSopIDs7Ci0gICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKLWVzYWMKLQotZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFXSz0kYWNfY3ZfcHJvZ19BV0sKLWlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKLSRhc19lY2hvICIkQVdLIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotcm0gLXJmIC50c3QgMj4vZGV2L251bGwKLW1rZGlyIC50c3QgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLnRzdDsgdGhlbgotICBhbV9fbGVhZGluZ19kb3Q9LgotZWxzZQotICBhbV9fbGVhZGluZ19kb3Q9XwotZmkKLXJtZGlyIC50c3QgMj4vZGV2L251bGwKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgotICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAotICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCi0gIGFtX19pc3JjPScgLUkkKHNyY2RpciknCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9TGliVk5DU2VydmVyCi0gVkVSU0lPTj0wLjkuOQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1fQUNFT0YKLQotIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgWWVzLCBpdCdzIHN0aWxsIHVzZWQKLSMgaW4gdGhlIHdpbGQgOi0oICBXZSBzaG91bGQgZmluZCBhIHByb3BlciB3YXkgdG8gZGVwcmVjYXRlIGl0IC4uLgotQU1UQVI9JyQke1RBUi10YXJ9JwotCi1hbV9fdGFyPSckJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIicgYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJwotCi0KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaWxlbnQtcnVsZXMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2lsZW50X3J1bGVzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc2lsZW50X3J1bGVzOyAKLWZpCi0KLWNhc2UgJGVuYWJsZV9zaWxlbnRfcnVsZXMgaW4KLXllcykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7Ci1ubykgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTE7OwotKikgICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0wOzsKLWVzYWMKLWFtX21ha2U9JHtNQUtFLW1ha2V9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFtX21ha2Ugc3VwcG9ydHMgbmVzdGVkIHZhcmlhYmxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhbV9tYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXMuLi4gIiA+JjY7IH0KLWlmICR7YW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiAkYXNfZWNobyAnVFJVRT0kKEJBUiQoVikpCi1CQVIwPWZhbHNlCi1CQVIxPXRydWUKLVY9MQotYW1fX2RvaXQ6Ci0JQCQoVFJVRSkKLS5QSE9OWTogYW1fX2RvaXQnIHwgJGFtX21ha2UgLWYgLSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9eWVzCi1lbHNlCi0gIGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzPW5vCi1maQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMiID4mNQotJGFzX2VjaG8gIiRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyIgPiY2OyB9Ci1pZiB0ZXN0ICRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyA9IHllczsgdGhlbgotICAgIEFNX1Y9JyQoViknCi0gIEFNX0RFRkFVTFRfVj0nJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSknCi1lbHNlCi0gIEFNX1Y9JEFNX0RFRkFVTFRfVkVSQk9TSVRZCi0gIEFNX0RFRkFVTFRfVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLWZpCi1BTV9CQUNLU0xBU0g9J1wnCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgcmZiY29uZmlnLmgiCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgIgotCi0KLWFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyByZmIvcmZiY29uZmlnLmgiCi0KLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgZmkKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLSAgICAgICBjb250aW51ZQotICAgICBmaQotICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJEAlOkAgIT0gMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZmkKLQotZmkKLQotCi10ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLSRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQotCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9Ci1hY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAotCi0jIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6Ci1hY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgotCi1hY19ybWZpbGVzPQotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCi1kbwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OwotICBlc2FjCi1kb25lCi1ybSAtZiAkYWNfcm1maWxlcwotCi1pZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgotICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KLSMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCi0jIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAotIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KLSMgQXV0b2NvbmYuCi1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKLWRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQotCTs7Ci0gICAgW2FiXS5vdXQgKQotCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0Ci0JIyBjZXJ0YWlubHkgcmlnaHQuCi0JYnJlYWs7OwotICAgICouKiApCi0JaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKLQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNhYwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVsc2UKLSAgYWNfZmlsZT0nJwotZmkKLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgNzcgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQotYWNfZXhlZXh0PSRhY19jdl9leGVleHQKLQotcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQotaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgotICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9Ci0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUVYRUVYVD0kYWNfY3ZfZXhlZXh0Ci1hY19leGVleHQ9JEVYRUVYVAotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQKLW1haW4gKCkKLXsKLUZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7Ci0gcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0gICAgZmkKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci0kYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfb2JqZXh0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagotaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Ci0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OwotICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAotICAgICAgIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9vYmpleHQiID4mNjsgfQotT0JKRVhUPSRhY19jdl9vYmpleHQKLWFjX29iamV4dD0kT0JKRVhUCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGlsZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQotaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKLSAgIGFjX2N2X3Byb2dfY2NfZz1ubwotICAgQ0ZMQUdTPSItZyIKLSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIENGTEFHUz0iIgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfYzg5PW5vCi1hY19zYXZlX0NDPSRDQwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1zdHJ1Y3Qgc3RhdDsKLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsKLUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICByZXR1cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFydCAodixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCi0gICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCi0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKLSAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwotICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLwotaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKLQotLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCi0jZGVmaW5lIEZPTyh4KSAneCcKLWludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOwotCi1pbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKLXN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Owotc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci1pbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKLWludCBhcmdjOwotY2hhciAqKmFyZ3Y7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCi1kbwotICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAotICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawotZG9uZQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotQ0M9JGFjX3NhdmVfQ0MKLQotZmkKLSMgQUNfQ0FDSEVfVkFMCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgotICB4KQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1Ci0kYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OwotICB4bm8pCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKLSRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7Ci0gICopCi0gICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKLWVzYWMKLWlmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6Ci0gIAotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7IAotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotICBhbV9fbm9kZXA9J19ubycKLWZpCi0gaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIEFNREVQX1RSVUU9Ci0gIEFNREVQX0ZBTFNFPScjJwotZWxzZQotICBBTURFUF9UUlVFPScjJwotICBBTURFUF9GQUxTRT0KLWZpCi0KLQotCi1kZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KLWlmICR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKLSAgZmkKLSAgYW1fX3VuaXZlcnNhbD1mYWxzZQotICBjYXNlICIgJGRlcGNjICIgaW4gIygKLSAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKLSAgICAgZXNhYwotCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCi0gICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCi0gICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgZ2NjKQotICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KLSAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCi0gICAgICA7OwotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQotICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKLSAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAotICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KLSAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICAgIGFtX19taW51c19vYmo9Ci0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1Ci0kYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYgCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCi0gIGFtX19mYXN0ZGVwQ0NfVFJVRT0KLSAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0nIycKLWVsc2UKLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPScjJwotICBhbV9fZmFzdGRlcENDX0ZBTFNFPQotZmkKLQotCi1pZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gIiA+JjY7IH0KLWZpCi1zZXQgZHVtbXkgJENDOyBhY19jYz1gJGFzX2VjaG8gIiQyIiB8Ci0JCSAgICAgIHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfY2NfJHthY19jY31fY19vKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi0jIE1ha2Ugc3VyZSBpdCB3b3JrcyBib3RoIHdpdGggJENDIGFuZCB3aXRoIHNpbXBsZSBjYy4KLSMgV2UgZG8gdGhlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lIGNvbXBpbGVycyByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuCi0jIGV4aXN0aW5nIC5vIGZpbGUgd2l0aCAtbywgdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgotYWNfdHJ5PSckQ0MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCi1ybSAtZiBjb25mdGVzdDIuKgotaWYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmCi0gICB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsKLXRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKLSAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gICAgIyBUZXN0IGZpcnN0IHRoYXQgY2MgZXhpc3RzIGF0IGFsbC4KLSAgICBpZiB7IGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgotICAgICAgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLSAgICAgIHJtIC1mIGNvbmZ0ZXN0Mi4qCi0gICAgICBpZiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYKLQkgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07Ci0gICAgICB0aGVuCi0JIyBjYyB3b3JrcyB0b28uCi0JOgotICAgICAgZWxzZQotCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCi0JZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotICAgICAgZmkKLSAgICBmaQotICBmaQotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIE5PX01JTlVTX0NfTUlOVVNfTyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFtX2NjPWBlY2hvICQyIHwgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWV2YWwgYW1fdD1cJGFjX2N2X3Byb2dfY2NfJHthbV9jY31fY19vCi1pZiB0ZXN0ICIkYW1fdCIgIT0geWVzOyB0aGVuCi0gICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgotICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KLSAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgotICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAotICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKLSAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKLWZpCi0KLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotCUNDTEQ9IlwkKENDKSIKLWVsc2UKLQlDQ0xEPSIkQ0MiCi1maQotdGVzdCAieCRHQ0MiID0gInh5ZXMiICYmIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9Ci1zZXQgeCAke01BS0UtbWFrZX0KLWFjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgZXZhbCBcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCi1TSEVMTCA9IC9iaW4vc2gKLWFsbDoKLQlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwotX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1jYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KLSAgKkBAQCUlJT0/Kj1AQEAlJSUqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0gICopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OwotZXNhYwotcm0gLWYgY29uZnRlc3QubWFrZQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotICBTRVRfTUFLRT0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX3NoYXJlZDsgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSAgICAqKQotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zaGFyZWQ9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9eWVzCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLSAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotICAgICopCi0gICAgIGVuYWJsZV9zdGF0aWM9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfc3RhdGljPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbDsgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSAgICAqKQotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1Ci1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KLWNhc2UgJGFjX2N2X2J1aWxkIGluCi0qLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OwotZXNhYwotYnVpbGQ9JGFjX2N2X2J1aWxkCi1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfYnVpbGQKLXNoaWZ0Ci1idWlsZF9jcHU9JDEKLWJ1aWxkX3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWJ1aWxkX29zPSQqCi1JRlM9JGFjX3NhdmVfSUZTCi1jYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgotICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAotZWxzZQotICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAotICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9Ci1jYXNlICRhY19jdl9ob3N0IGluCi0qLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1ob3N0PSRhY19jdl9ob3N0Ci1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfaG9zdAotc2hpZnQKLWhvc3RfY3B1PSQxCi1ob3N0X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWhvc3Rfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3BhdGhfU0VEKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCi0jIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLSAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgZmkKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLWx0X2FjX21heD0wCi1sdF9hY19jb3VudD0wCi0jIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcwotIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KLWZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbwotICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQotICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KLSAgbHRfYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KLSAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGJyZWFrCi0gIGZpCi0gIHdoaWxlIHRydWU7IGRvCi0gICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKLSAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KLSAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAotICAgIGVjaG8gPj5jb25mdGVzdC5ubAotICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCi0gICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhawotICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KLSAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKLSAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKLSAgICBmaQotICBkb25lCi1kb25lCi0KLWZpCi0KLVNFRD0kbHRfY3ZfcGF0aF9TRUQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0VEIiA+JjUKLSRhc19lY2hvICIkU0VEIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfR1JFUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9HUkVQIiB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAotY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCi0gICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0gR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLSAKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQotICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKLSAgIGVsc2UKLSAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0gICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9FR1JFUCIgfHwgY29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAotY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCi0gICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0VHUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGVncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLWZpCi0KLSAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotIAotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQotZmkKLWlmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQotJGFzX2VjaG8gIiRMRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXRlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhYwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9sZF9yZWxvYWRfZmxhZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNjsgfQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi1jYXNlICRyZWxvYWRfZmxhZyBpbgotIiIgfCAiICIqKSA7OwotKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Ci1lc2FjCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1jYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBlbHNlCi0gICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZmkKLSAgICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0uLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9OTSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4gCi0gICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKLSAgZmkKLSAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCi0gICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCi0gICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0JIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLQkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0JIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCi0JY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCi0JKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQotCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKLQkgIGJyZWFrCi0JICA7OwotCSopCi0JICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkgICovZGV2L251bGwqKQotCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgotCSAgICBicmVhawotCSAgICA7OwotCSAgKikKLQkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIGRvbmUKLSAgdGVzdCAteiAiJGx0X2N2X3BhdGhfTk0iICYmIGx0X2N2X3BhdGhfTk09bm0KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcGF0aF9OTSIgPiY2OyB9Ci1OTT0iJGx0X2N2X3BhdGhfTk0iCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9Ci1MTl9TPSRhc19sbl9zCi1pZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQotJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9Ci1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKLWx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotCi1jYXNlICRob3N0X29zIGluCi1haXg0KiB8IGFpeDUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1iZW9zKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYnNkaVs0NV0qKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJwotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICA7OwotCi1jeWd3aW4qKQotICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKLSAgOzsKLQotbWluZ3cqIHwgcHczMiopCi0gICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKLSAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICBpKjg2ICkKLSAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCi0gICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgotICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbMy05XTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JwotICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBmaQotICA7OwotCi1nbnUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ocHV4MTAuMjAqIHwgaHB1eDExKikKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbwotICAgIDs7Ci0gIGhwcGEqNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAotICAgIDs7Ci0gICopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18UEEtUklTQ1swLTldLlswLTldKSBzaGFyZWQgbGlicmFyeScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1pbnRlcml4MyopCi0gICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298XC5hKSQnCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJExEIGluCi0gICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKLSAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7Ci0gICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKLSAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICBlc2FjCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotbmV0YnNkKikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298X3BpY1wuYSkkJwotICBmaQotICA7OwotCi1uZXdvczYqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCi0gIDs7Ci0KLW50by1xbngqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0gIDs7Ci0KLW9wZW5ic2QqKQotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8XC5zb3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJwotICBmaQotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNvbGFyaXMqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICBjYXNlICRob3N0X3ZlbmRvciBpbgotICBtb3Rvcm9sYSkKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVswLTldWzAtOV0qIFZlcnNpb24gWzAtOV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgOzsKLSAgbmNyKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgc2VxdWVudCkKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJwotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gICAgOzsKLSAgc25pKQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gICAgOzsKLSAgc2llbWVucykKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIHBjKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLWVzYWMKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9Ci1maWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAotdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0KLQotCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2xpYnRvb2xfbG9jazsgCi1maQotCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcwotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAkaG9zdCBpbgotaWE2NC0qLWhwdXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgKkVMRi0zMiopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCi0gICAgICA7OwotICAgICpFTEYtNjQqKQotICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZWxzZQotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZmkKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi14ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnxzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAgIHg4Nl82NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKLSAgICAgICAgICA7OwotICAgICAgICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgotICAgICAgICAgIDs7Ci0gICAgICAgIHMzOTB4LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgotICAgICAgICAgIDs7Ci0gICAgICAgIHNwYXJjNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAgIHg4Nl82NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgotICAgICAgICAgIDs7Ci0gICAgICAgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKLSAgICAgICAgICA7OwotICAgICAgICBzMzkwKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgotICAgICAgICAgIDs7Ci0gICAgICAgIHNwYXJjKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZi4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9jY19uZWVkc19iZWxmKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0gICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY2OyB9Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci1zcGFyYyotKnNvbGFyaXMqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgotICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OwotICAgICAgKikgICAgTEQ9IiR7TEQtbGR9IC02NCIgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19ETExUT09MKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRETExUT09MIiA+JjUKLSRhc19lY2hvICIkRExMVE9PTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLSAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCi1pZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfRExMVE9PTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0RMTFRPT0wiID0geDsgdGhlbgotICAgIERMTFRPT0w9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKLSAgZmkKLWVsc2UKLSAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWZpCi0KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0FTKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BUz0kYWNfY3ZfcHJvZ19BUwotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFTIiA+JjUKLSRhc19lY2hvICIkQVMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotICBhY19jdF9BUz0kQVMKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0FTKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0FTPSIkYWNfY3RfQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9BUz0iYXMiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQVM9JGFjX2N2X3Byb2dfYWNfY3RfQVMKLWlmIHRlc3QgLW4gIiRhY19jdF9BUyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0FTIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQVMiID0geDsgdGhlbgotICAgIEFTPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBBUz0kYWNfY3RfQVMKLSAgZmkKLWVsc2UKLSAgQVM9IiRhY19jdl9wcm9nX0FTIgotZmkKLQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9iamR1bXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX09CSkRVTVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIkT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX09CSkRVTVA9IiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1PQkpEVU1QPSRhY19jdl9wcm9nX09CSkRVTVAKLWlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9CSkRVTVAiID4mNQotJGFzX2VjaG8gIiRPQkpEVU1QIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQkpEVU1QIjsgdGhlbgotICBhY19jdF9PQkpEVU1QPSRPQkpEVU1QCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19jdF9PQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0ib2JqZHVtcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9PQkpEVU1QPSRhY19jdl9wcm9nX2FjX2N0X09CSkRVTVAKLWlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09CSkRVTVAiID4mNQotJGFzX2VjaG8gIiRhY19jdF9PQkpEVU1QIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfT0JKRFVNUCIgPSB4OyB0aGVuCi0gICAgT0JKRFVNUD0iZmFsc2UiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgT0JKRFVNUD0kYWNfY3RfT0JKRFVNUAotICBmaQotZWxzZQotICBPQkpEVU1QPSIkYWNfY3ZfcHJvZ19PQkpEVU1QIgotZmkKLQotICA7OwotICAKLWVzYWMKLQotbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6Ci0gIGJyZWFrCi1maQotCi0gICAgZG9uZQotICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLSAgCi1maQotICBDUFA9JGFjX2N2X3Byb2dfQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1Ci0kYXNfZWNobyAiJENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpZmRlZiBfX1NURENfXwotQCU6QCBpbmNsdWRlIDxsaW1pdHMuaD4KLUAlOkBlbHNlCi1AJTpAIGluY2x1ZGUgPGFzc2VydC5oPgotQCU6QGVuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICAKLWVsc2UKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLSMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi1mb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKLQkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0Ci0iCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLQotZm9yIGFjX2hlYWRlciBpbiBkbGZjbi5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJkbGZjbi5oIiAiYWNfY3ZfaGVhZGVyX2RsZmNuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLV9BQ0VPRgotIAotZmkKLQotZG9uZQotCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotaWYgdGVzdCAteiAiJENYWCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJENDQyI7IHRoZW4KLSAgICBDWFg9JENDQwotICBlbHNlCi0gICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQwotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ1hYPSRhY19jdl9wcm9nX0NYWAotaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFgiID4mNQotJGFzX2VjaG8gIiRDWFgiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICBhY19jdF9DWFg9JENYWAotICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQwotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DWFgiID0geDsgdGhlbgotICAgIENYWD0iZysrIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENYWD0kYWNfY3RfQ1hYCi0gIGZpCi1maQotCi0gIGZpCi1maQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jeHhfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGlsZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNjsgfQotaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCi0gIEdYWD15ZXMKLWVsc2UKLSAgR1hYPQotZmkKLWFjX3Rlc3RfQ1hYRkxBR1M9JHtDWFhGTEFHUytzZXR9Ci1hY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2N4eF9nKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZwotICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jeHhfZz1ubwotICAgQ1hYRkxBR1M9Ii1nIgotICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKLWVsc2UKLSAgQ1hYRkxBR1M9IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCi0JIENYWEZMQUdTPSItZyIKLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2N4eF9nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgotICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgQ1hYRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENYWEZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ci0gIGZpCi1maQotYWNfZXh0PWNwcAotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLQotZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9Ci1pZiAke2FtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKLSAgZmkKLSAgYW1fX3VuaXZlcnNhbD1mYWxzZQotICBjYXNlICIgJGRlcGNjICIgaW4gIygKLSAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKLSAgICAgZXNhYwotCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCi0gICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCi0gICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgZ2NjKQotICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KLSAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCi0gICAgICA7OwotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQotICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKLSAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAotICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KLSAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICAgIGFtX19taW51c19vYmo9Ci0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1Ci0kYXNfZWNobyAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9Ci1DWFhERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYgCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgotICBhbV9fZmFzdGRlcENYWF9UUlVFPQotICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKLWVsc2UKLSAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKLSAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9Ci1maQotCi0KLQotCi1pZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotICBhY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRDWFhDUFAiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcHJvZ19DWFhDUFArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1hYQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgotICAgIGRvCi0gICAgICBhY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCi0gIAotZmkKLSAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAotZWxzZQotICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFhDUFAiID4mNQotJGFzX2VjaG8gIiRDWFhDUFAiID4mNjsgfQotYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpZmRlZiBfX1NURENfXwotQCU6QCBpbmNsdWRlIDxsaW1pdHMuaD4KLUAlOkBlbHNlCi1AJTpAIGluY2x1ZGUgPGFzc2VydC5oPgotQCU6QGVuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLSAgCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gIkMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLQotYWNfZXh0PWNwcAotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLQotZmkKLQotCi1hY19leHQ9ZgotYWNfY29tcGlsZT0nJEY3NyAtYyAkRkZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJEY3NyAtbyBjb25mdGVzdCRhY19leGVleHQgJEZGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBnNzcgeGxmIGY3NyBmcnQgcGdmNzcgY2Y3NyBmb3J0NzcgZmwzMiBhZjc3IHhsZjkwIGY5MCBwZ2Y5MCBwZ2hwZiBlcGNmOTAgZ2ZvcnRyYW4gZzk1IHhsZjk1IGY5NSBmb3J0IGlmb3J0IGlmYyBlZmMgcGdmb3J0cmFuIHBnZjk1IGxmOTUgZnRuIG5hZ2ZvcgotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgotICBhY19jdl9wcm9nX0Y3Nz0iJEY3NyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0Y3Nz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotRjc3PSRhY19jdl9wcm9nX0Y3NwotaWYgdGVzdCAtbiAiJEY3NyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRGNzciID4mNQotJGFzX2VjaG8gIiRGNzciID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRGNzciICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkRjc3IjsgdGhlbgotICBhY19jdF9GNzc9JEY3NwotICBmb3IgYWNfcHJvZyBpbiBnNzcgeGxmIGY3NyBmcnQgcGdmNzcgY2Y3NyBmb3J0NzcgZmwzMiBhZjc3IHhsZjkwIGY5MCBwZ2Y5MCBwZ2hwZiBlcGNmOTAgZ2ZvcnRyYW4gZzk1IHhsZjk1IGY5NSBmb3J0IGlmb3J0IGlmYyBlZmMgcGdmb3J0cmFuIHBnZjk1IGxmOTUgZnRuIG5hZ2ZvcgotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfY3RfRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9GNzc9JGFjX2N2X3Byb2dfYWNfY3RfRjc3Ci1pZiB0ZXN0IC1uICIkYWNfY3RfRjc3IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0Y3NyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9GNzciICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9GNzciID0geDsgdGhlbgotICAgIEY3Nz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEY3Nz0kYWNfY3RfRjc3Ci0gIGZpCi1maQotCi0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLSRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBGb3J0cmFuIDc3IGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQotcm0gLWYgYS5vdXQKLQotIyBJZiB3ZSBkb24ndCB1c2UgYC5GJyBhcyBleHRlbnNpb24sIHRoZSBwcmVwcm9jZXNzb3IgaXMgbm90IHJ1biBvbiB0aGUKLSMgaW5wdXQgZmlsZS4gIChOb3RlIHRoYXQgdGhpcyBvbmx5IG5lZWRzIHRvIHdvcmsgZm9yIEdOVSBjb21waWxlcnMuKQotYWNfc2F2ZV9leHQ9JGFjX2V4dAotYWNfZXh0PUYKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBGb3J0cmFuIDc3IGNvbXBpbGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgRm9ydHJhbiA3NyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mNzdfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gICAgICBlbmQKLV9BQ0VPRgotaWYgYWNfZm5fZjc3X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGlsZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9mNzdfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID4mNjsgfQotYWNfZXh0PSRhY19zYXZlX2V4dAotYWNfdGVzdF9GRkxBR1M9JHtGRkxBR1Mrc2V0fQotYWNfc2F2ZV9GRkxBR1M9JEZGTEFHUwotRkZMQUdTPQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRGNzcgYWNjZXB0cyAtZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRGNzcgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2Y3N19nKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgRkZMQUdTPS1nCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0gICAgICBwcm9ncmFtIG1haW4KLQotICAgICAgZW5kCi1fQUNFT0YKLWlmIGFjX2ZuX2Y3N190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2Y3N19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2Y3N19nPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfZjc3X2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2Y3N19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0ZGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgRkZMQUdTPSRhY19zYXZlX0ZGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2Y3N19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCi0gICAgRkZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBGRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICJ4JGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID0geHllczsgdGhlbgotICAgIEZGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgRkZMQUdTPQotICBmaQotZmkKLQotaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCi0gIEc3Nz15ZXMKLWVsc2UKLSAgRzc3PQotZmkKLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi0KLSMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKLQotIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3N5c19tYXhfY21kX2xlbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICAgaT0wCi0gIHRlc3RzdHJpbmc9IkFCQ0QiCi0KLSAgY2FzZSAkYnVpbGRfb3MgaW4KLSAgbXNkb3NkamdwcCopCi0gICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYwotICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KLSAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcwotICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKLSAgICA7OwotCi0gIGdudSopCi0gICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCi0gICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7Ci0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCi0gICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KLSAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAotICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKLSAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCi0gICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5Ci0gICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKLSAgICA7OwotCi0gIGFtaWdhb3MqKQotICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KLSAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKLSAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KLSAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCi0gICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbHNlCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKLSAgICBmaQotICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAotICAgIDs7Ci0KLSAgaW50ZXJpeCopCi0gICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAotICAgIDs7Ci0KLSAgb3NmKikKLSAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKLSAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAotICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCi0gICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0Ci0gICAgIwotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCi0gICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgotICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgOzsKLSAgc2NvMy4ydjUqKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKLSAgICA7OwotICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCi0gICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qWyAJXS8vJ2AKLSAgICBlbHNlCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKLSAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAotICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQotICAgIHdoaWxlICh0ZXN0ICJYImAkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCi0JICAgICAgID0gIlhYJHRlc3RzdHJpbmciKSA+L2Rldi9udWxsIDI+JjEgJiYKLQkgICAgbmV3X3Jlc3VsdD1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAgJiYKLQkgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPSRuZXdfcmVzdWx0ICYmCi0JICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAotICAgIGRvCi0gICAgICBpPWBleHByICRpICsgMWAKLSAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZwotICAgIGRvbmUKLSAgICB0ZXN0c3RyaW5nPQotICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24gbWFzc2l2ZQotICAgICMgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBsaW5rZXIuCi0gICAgIyBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKLSAgICA7OwotICBlc2FjCi0KLWZpCi0KLWlmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm9uZSIgPiY1Ci0kYXNfZWNobyAibm9uZSIgPiY2OyB9Ci1maQotCi0KLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIAotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gaW50IFwxOy9wJyIKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICRob3N0X29zIGluCi1haXgqKQotICBzeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICBzeW1jb2RlPSdbQUJDREVHUlNUXScKLSAgZmkKLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLSAgOzsKLWxpbnV4KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICBzeW1jb2RlPSdbQUJDREdJUlNUV10nCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICBmaQotICA7OwotaXJpeCogfCBub25zdG9wdXgqKQotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotb3NmKikKLSAgc3ltY29kZT0nW0JDREVHUVJTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW0JEUlRdJwotICA7Owotc2NvMy4ydjUqKQotICBzeW1jb2RlPSdbRFRdJwotICA7Owotc3lzdjQuMnV3MiopCi0gIHN5bWNvZGU9J1tEVF0nCi0gIDs7Ci1zeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICBzeW1jb2RlPSdbQUJEVF0nCi0gIDs7Ci1zeXN2NCkKLSAgc3ltY29kZT0nW0RGTlNUVV0nCi0gIDs7Ci1lc2FjCi0KLSMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgotb3B0X2NyPQotY2FzZSAkYnVpbGRfb3MgaW4KLW1pbmd3KikKLSAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotY2FzZSBgJE5NIC1WIDI+JjFgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OwotZXNhYwotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi0gIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsgCV1bIAldKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0XCIiOyB9ID4mNQotICAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3QpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0JICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0JICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKLQkgIGx0X3NhdmVfTElCUz0iJExJQlMiCi0JICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1MkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWciCi0JICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGZpCi0JICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZmFpbGVkIiA+JjUKLSRhc19lY2hvICJmYWlsZWQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQotJGFzX2VjaG8gIm9rIiA+JjY7IH0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBsdF9jdl9vYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgbHRfY3Zfb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9Ci1vYmpkaXI9JGx0X2N2X29iamRpcgotCi0KLQotCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucwotbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCi0KLSMgQ29uc3RhbnRzOgotcm09InJtIC1mIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLWx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0FSKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BUj0kYWNfY3ZfcHJvZ19BUgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFSIiA+JjUKLSRhc19lY2hvICIkQVIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIjsgdGhlbgotICBhY19jdF9BUj0kQVIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0FSKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iYXIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKLWlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0FSIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgotICAgIEFSPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBBUj0kYWNfY3RfQVIKLSAgZmkKLWVsc2UKLSAgQVI9IiRhY19jdl9wcm9nX0FSIgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKLSRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi0gIGFjX2N0X1JBTkxJQj0kUkFOTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgotaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgotICAgIFJBTkxJQj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKLWlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci0kYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KLSAgYWNfY3RfU1RSSVA9JFNUUklQCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCi1pZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQotJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KLSAgICBTVFJJUD0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCi10ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKLXRlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKLXRlc3QgLXogIiRMRCIgJiYgTEQ9bGQKLXRlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKLXRlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCi10ZXN0IC16ICIkTk0iICYmIE5NPW5tCi10ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi10ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgotdGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Ci10ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgotICAgIDs7Ci0gICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgICA7OwotICBlc2FjCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotZmkKLQotZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotCi0jIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKLWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi1maWxlX21hZ2ljKikKLSAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3BhdGhfTUFHSUNfQ01EKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkTUFHSUNfQ01EIGluCi1bXFwvKl0gfCAgPzpbXFwvXSopCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSopCi0gIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZTsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlIgotICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgotCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JImZpbGVfbWFnaWMgIiopCi0JICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKLQkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAotCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1FT0YKLQkgIGZpIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCi0gIDs7Ci1lc2FjCi1maQotCi1NQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLWlmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKLSRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi1pZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBmaWxlLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3BhdGhfTUFHSUNfQ01EKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkTUFHSUNfQ01EIGluCi1bXFwvKl0gfCAgPzpbXFwvXSopCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSopCi0gIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2ZpbGU7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyL2ZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotCSAgZmkgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKLSAgOzsKLWVzYWMKLWZpCi0KLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQotJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgZWxzZQotICAgIE1BR0lDX0NNRD06Ci0gIGZpCi1maQotCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWVuYWJsZV9kbG9wZW49bm8KLWVuYWJsZV93aW4zMl9kbGw9eWVzCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOyAKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BpYytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfcGljOyBwaWNfbW9kZT0iJHdpdGh2YWwiCi1lbHNlCi0gIHBpY19tb2RlPWRlZmF1bHQKLWZpCi0KLXRlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAotCi0jIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAotdGFnbmFtZT0KLWx0X3NhdmVfQ0M9IiRDQyIKLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9YwotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0PSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9XG4nCi0KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLQotbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9Ci0KLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJwotCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9IHh5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCi1lbHNlCi0gICAgOgotZmkKLQotZmkKLQotbHRfcHJvZ19jb21waWxlcl93bD0KLWx0X3Byb2dfY29tcGlsZXJfcGljPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KLSAKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotICAgICAgZGFyd2luKikKLSAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgIHhsYyopCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFub2NvbW1vbicKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQotICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9Ci0KLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBydW5wYXRoX3Zhcj0KLSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9bm8KLSAgYXJjaGl2ZV9jbWRzPQotICBhcmNoaXZlX2V4cHN5bV9jbWRzPQotICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPQotICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KLSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQotICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPQotICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgaGFyZGNvZGVfbWludXNfTD1ubwotICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0gIGxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgotICBoYXJkY29kZV9hdXRvbWF0aWM9bm8KLSAgbW9kdWxlX2NtZHM9Ci0gIG1vZHVsZV9leHBzeW1fY21kcz0KLSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi0gIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotICBpbmNsdWRlX2V4cHN5bXM9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0gICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAotICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKLSAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90Ci0gICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgotICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgotICBleHRyYWN0X2V4cHN5bXNfY21kcz0KLSAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgotICBmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCi0gICAgICB3aXRoX2dudV9sZD1ubwotICAgIGZpCi0gICAgOzsKLSAgaW50ZXJpeCopCi0gICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKLSAgICB3aXRoX2dudV9sZD15ZXMKLSAgICA7OwotICBvcGVuYnNkKikKLSAgICB3aXRoX2dudV9sZD1ubwotICAgIDs7Ci0gIGVzYWMKLQotICBsZF9zaGxpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCWxkX3NobGlicz1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKLSoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgotKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotCi0gICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cwotICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKLSAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKLSAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQotICAgICAgIyB0aGVtLgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCApIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLQkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0JIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRtcF9hZGRmbGFnPQotCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgotCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKLQkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQotCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgotCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCWZpCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJwotCXdsYXJjPQotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlsZF9zaGxpYnM9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KLSAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikgCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJwotCSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgbGRfc2hsaWJzPW5vCi0JICBmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSBubzsgdGhlbgotICAgICAgcnVucGF0aF92YXI9Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyopCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYWl4NCogfCBhaXg1KikKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAotCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9IiIKLSAgICAgIGVsc2UKLQkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KLQkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCi0JaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQllbHNlCi0JICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQotCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0gIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0gIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLSAgCSAgICBicmVhawotICAJICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgYXJjaGl2ZV9jbWRzPScnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQotCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCSAgdGhlbgotICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0PXllcwotCSAgZWxzZQotICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0gIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0gIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotICAJICBoYXJkY29kZV9taW51c19MPXllcwotICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLQllbHNlCi0JICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JICBlbHNlCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1iZXJvaycKLSAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICAgZWxzZQotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotCWVsc2UKLQkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJwotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KLSAgICAgIGxkX3NobGlicz1ubwotICAgICAgOzsKLQotICAgIGJzZGlbNDVdKikKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSd0cnVlJwotICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICA7OwotICAgICAgICopCi0gICAgICAgICBsZF9zaGxpYnM9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gICAgZnJlZWJzZDIqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgICAgOzsKLQotICAgIGhwdXgxMCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLQotCWhhcmRjb2RlX2RpcmVjdD15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0KLQkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCWhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCp8aWE2NCopCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPScrYiAkbGliZGlyJwotCSAgaGFyZGNvZGVfZGlyZWN0PW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JICA7OwotCSopCi0JICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLQkgICA7OwotCSAqKQotCSAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBlbHNlCi0Jd2xhcmM9JycKLQlhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCWVzYWMgOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0JOzsKLQlzaWVtZW5zKQotCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCi0JICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgICAgOzsKLQltb3Rvcm9sYSkKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0LjMqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnM9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqKQotICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosbm9kZWZzJwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIGluCi14fHh5ZXMpCi0gICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKLSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsCi0JcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICAgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgICAgZWxzZQotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQotJGFzX2VjaG8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotc3RyaXBsaWI9Ci1vbGRfc3RyaXBsaWI9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KLSAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKLSAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0jIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgZGFyd2luKikKLSAgICAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgotICAgICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKLSAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gICAgICAgZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0gICAgICAgOzsKLSAgICopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBtaW5ndyogfCBwdzMyKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBjeWd3aW4qKQotICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBkYXJ3aW4qKQotICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIAotICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgICAKLWZpCi0KLSAgIDs7Ci0KLSAgKikKLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxkX3NobF9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHNobF9sb2FkICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2hsX2xvYWQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgotZWxzZQotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJkbG9wZW4iICJhY19jdl9mdW5jX2Rsb3BlbiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19kbG9wZW4iID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2RsX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsb3BlbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRsb3BlbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zdmxkX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc3ZsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxkX2RsZF9saW5rKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsZF9saW5rICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxkX2xpbmsgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgotZmkKLQotCSAgICAgIAotZmkKLQotCSAgICAKLWZpCi0KLQkgIAotZmkKLQotCQotZmkKLQotICAgICAgCi1maQotCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBlbHNlCi0gICAgZW5hYmxlX2Rsb3Blbj1ubwotICBmaQotCi0gIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgotICBkbG9wZW4pCi0gICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgotICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotCi0gICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0KLSAgICBzYXZlX0xJQlM9IiRMSUJTIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfZGxvcGVuX3NlbGYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRzIChkbGVycm9yICgpKTsKLQotICAgIGV4aXQgKHN0YXR1cyk7Ci19Ci1FT0YKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OwotICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0gICAgCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjY7IH0KLQotICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgotICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRzIChkbGVycm9yICgpKTsKLQotICAgIGV4aXQgKHN0YXR1cyk7Ci19Ci1FT0YKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OwotICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7Ci0gICAgICB4JGx0X2RsdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubwotICBmaQotZmkKLXJtIC1mciBjb25mdGVzdCoKLQotICAgICAgCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNjsgfQotICAgIGZpCi0KLSAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCi0gICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKLSAgZXNhYwotZmkKLQotCi0jIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gICAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3NoYXJlZCIgPiY1Ci0kYXNfZWNobyAiJGVuYWJsZV9zaGFyZWQiID4mNjsgfQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zdGF0aWMiID4mNQotJGFzX2VjaG8gIiRlbmFibGVfc3RhdGljIiA+JjY7IH0KLQotIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCi0jIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAotIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCi0jIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAotICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLSAgZmkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZwotICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKLSAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgotICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCi0gICAgU0VEIFNIRUxMIFNUUklQIFwKLSAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKLSAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGNvbXBpbGVyIFwKLSAgICBDQyBcCi0gICAgTEQgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfd2wgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIFwKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyBcCi0gICAgb2xkX2FyY2hpdmVfY21kcyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBcCi0gICAgcHJlZGVwX29iamVjdHMgXAotICAgIHBvc3RkZXBfb2JqZWN0cyBcCi0gICAgcHJlZGVwcyBcCi0gICAgcG9zdGRlcHMgXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCBcCi0gICAgYXJjaGl2ZV9jbWRzIFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzIFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZyBcCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpYyBcCi0gICAgbW9kdWxlX2NtZHMgXAotICAgIG1vZHVsZV9leHBzeW1fY21kcyBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX28gXAotICAgIGV4Y2x1ZGVfZXhwc3ltcyBcCi0gICAgaW5jbHVkZV9leHBzeW1zOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kcyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAotICAgIGFyY2hpdmVfY21kcyB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzIHwgXAotICAgIG1vZHVsZV9jbWRzIHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kcyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJHtvZmlsZX1UIgotICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICAkcm0gLWYgIiRjZmdmaWxlIgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRvZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkb2ZpbGUiID4mNjt9Ci0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLSMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sOgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCi1TRUQ9JGx0X1NFRAotCi0jIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgotWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0jIFRoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KLWF2YWlsYWJsZV90YWdzPQotCi0jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9jb21waWxlcgotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xECi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JGx0X1NUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWMKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlYwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcwotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCi1zdHJpcGxpYj0kbHRfc3RyaXBsaWIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0cwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwcwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwcz0kbHRfcG9zdGRlcHMKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGgKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCi0KLSMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bwotIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCi0jIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKLQotIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCi0KLV9fRU9GX18KLQotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCi0KLSMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0jIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi1pZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgQ09MTEVDVF9OQU1FUz0KLSAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLWZpCi1FT0YKLSAgICA7OwotICBlc2FjCi0KLSAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCi0gICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KLSAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KLSAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KLSAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKLQotICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKLSAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQotICBjaG1vZCAreCAiJG9maWxlIgotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3RhZ3M7IHRhZ25hbWVzPSIkd2l0aHZhbCIKLWZpCi0KLQotaWYgdGVzdCAtZiAiJGx0bWFpbiIgJiYgdGVzdCAtbiAiJHRhZ25hbWVzIjsgdGhlbgotICBpZiB0ZXN0ICEgLWYgIiR7b2ZpbGV9IjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBleGlzdCIgPiYyO30KLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KLSAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0M9J2AiCi0gICAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgbG9vayBsaWtlIGEgbGlidG9vbCBzY3JpcHQiID4mMjt9Ci0gICAgZWxzZQotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgXGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gXGAkb2ZpbGUnIiA+JjI7fQotICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgLXogIiRMVENGTEFHUyI7IHRoZW4KLSAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0ZMQUdTPSdgIgotICBmaQotCi0gICMgRXh0cmFjdCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgaW4gJG9maWxlLgotICAjIE5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgdGhlIGVudGlyZSBsaXN0IGlzIG9uIG9uZSBsaW5lLgotICBhdmFpbGFibGVfdGFncz1gZ3JlcCAiXmF2YWlsYWJsZV90YWdzPSIgIiR7b2ZpbGV9IiB8ICRTRUQgLWUgJ3MvYXZhaWxhYmxlX3RhZ3M9XCguKiRcKS9cMS8nIC1lICdzL1wiLy9nJ2AKLQotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgZm9yIHRhZ25hbWUgaW4gJHRhZ25hbWVzOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycwotICAgIGNhc2UgYCRlY2hvICJYJHRhZ25hbWUiIHwgJFhzZWQgLWUgJ3M6Wy1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAsL106OmcnYCBpbgotICAgICIiKSA7OwotICAgICopICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiICIkTElORU5PIiA1Ci0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiR7b2ZpbGV9IiA+IC9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ0YWcgbmFtZSBcIiR0YWduYW1lXCIgYWxyZWFkeSBleGlzdHMiICIkTElORU5PIiA1Ci0gICAgZmkKLQotICAgICMgVXBkYXRlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIjsgdGhlbgotICAgICAgZWNobyBhcHBlbmRpbmcgY29uZmlndXJhdGlvbiB0YWcgXCIkdGFnbmFtZVwiIHRvICRvZmlsZQotCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICBDWFgpCi0JaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKLQkgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0JICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotCSAgYWNfZXh0PWNwcAotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLQotCi0KLQotYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi1hbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Ci1hbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCi1hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9Ci1oYXJkY29kZV9kaXJlY3RfQ1hYPW5vCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYPQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9Ci1oYXJkY29kZV9taW51c19MX0NYWD1ubwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKLWhhcmRjb2RlX2F1dG9tYXRpY19DWFg9bm8KLW1vZHVsZV9jbWRzX0NYWD0KLW1vZHVsZV9leHBzeW1fY21kc19DWFg9Ci1saW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCi1vbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcwotbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQotZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKLXByZWRlcF9vYmplY3RzX0NYWD0KLXBvc3RkZXBfb2JqZWN0c19DWFg9Ci1wcmVkZXBzX0NYWD0KLXBvc3RkZXBzX0NYWD0KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9Ci0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWNwcAotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHRfQ1hYPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltdKSB7IHJldHVybigwKTsgfVxuJwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9JENDCi1sdF9zYXZlX0xEPSRMRAotbHRfc2F2ZV9HQ0M9JEdDQwotR0NDPSRHWFgKLWx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCi1sdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKLWlmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4Ci1lbHNlCi0gICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAotZmkKLWlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgotICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCi1lbHNlCi0gICRhc191bnNldCBsdF9jdl9wYXRoX0xECi1maQotdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKLUNDPSR7Q1hYLSJjKysifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9DWFg9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3ZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCi0jIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5Ci1pZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9JyAtZm5vLWJ1aWx0aW4nCi1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0KLWZpCi0KLWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCi0KLSAgCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nbnVfbGQ7IHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAiID4mNjsgfQotICBjYXNlICRob3N0IGluCi0gICotKi1taW5ndyopCi0gICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndwotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKLSAgKikKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7Ci0gIGVzYWMKLSAgY2FzZSAkYWNfcHJvZyBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIFtcXC9dKiB8ID86W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KLWZpCi1pZiAke2x0X2N2X3BhdGhfTEQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0gICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JOzsKLSAgICAgICopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi1lbHNlCi0gIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRsdF9jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEIiA+JjUKLSRhc19lY2hvICIkTEQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi10ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19nbnVfbGQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCi1jYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotKkdOVSogfCAqJ3dpdGggQkZEJyopCi0gIGx0X2N2X3Byb2dfZ251X2xkPXllcwotICA7OwotKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KLSAgOzsKLWVzYWMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNjsgfQotd2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCi0KLQotCi0gICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQotICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCi0gICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCi0gICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKLSAgICB3bGFyYz0nJHt3bH0nCi0KLSAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfCBcCi0JZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICBlbHNlCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9Ci0gICAgZmkKLSAgZWxzZQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgd2xhcmM9Ci0KLSAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgotICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCi0gICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKLSAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KLSAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgotICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKLSAgZmkKLQotICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0gICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKLQotZWxzZQotICBHWFg9bm8KLSAgd2l0aF9nbnVfbGQ9bm8KLSAgd2xhcmM9Ci1maQotCi0jIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLWxkX3NobGlic19DWFg9eWVzCi1jYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBhaXg0KiB8IGFpeDUqKQotICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0gICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLSAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLSAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0gICAgICBub19lbnRyeV9mbGFnPSIiCi0gICAgZWxzZQotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0gICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLSAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQotCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgY2FzZSAkbGRfZmxhZyBpbgotCSAgKi1icnRsKikKLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICBmaQotCi0gICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgIGFyY2hpdmVfY21kc19DWFg9JycKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JwotICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0gICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLSAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0JICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCXRoZW4KLQkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKLQllbHNlCi0JICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0JICBoYXJkY29kZV9kaXJlY3RfQ1hYPXVuc3VwcG9ydGVkCi0JICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0JICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0JICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCi0JICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCXNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIG5vdCB1c2luZyBnY2MKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLQkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCXNoYXJlZF9mbGFnPSctRycKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCWVsc2UKLQkgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD15ZXMKLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSctYmVyb2snCi0gICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgIGVsc2UKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotICAgICAgZWxzZQotCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0Jbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVyb2snCi0JIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSckY29udmVuaWVuY2UnCi0JYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotCSMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgIGZpCi0gICAgZmkKLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCi0gICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0gICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0gICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIGZpCi0gICAgOzsKLQotICBjaG9ydXMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgQ1hYKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKLSAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubwotICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPXllcwotCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0gICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotICAgICAgZWxzZQotCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICBmaX4KLSAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgZmkKLSAgOzsKLSAgICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KLSAgICAgIGhhcmRjb2RlX2F1dG9tYXRpY19DWFg9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScnCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLQotICAgIGlmIHRlc3QgIiRHWFgiID0geWVzIDsgdGhlbgotICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KLSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8ICRFR1JFUCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCi0gICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBlbHNlCi0gICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgICAgZmkKLSAgICAgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCi0gICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgZmkKLSAgICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgICBtb2R1bGVfY21kc19DWFg9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgICAgOzsKLQotICBkZ3V4KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZWMrKyopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBnaGN4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZnJlZWJzZFsxMl0qKQotICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUgc3dpdGNoIHRvIEVMRgotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBmcmVlYnNkLWVsZiopCi0gICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi0gICAgOzsKLSAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgotICAgICMgY29udmVudGlvbnMKLSAgICBsZF9zaGxpYnNfQ1hYPXllcwotICAgIDs7Ci0gIGdudSopCi0gICAgOzsKLSAgaHB1eDkqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JCQkJIyBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCQkjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICBDQyopCi0gICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICAgIDs7Ci0gICAgYUNDKikKLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLSAgICAgICMKLSAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLSAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0gICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0gICAgICAjIGRlcGVuZGVuY2llcy4KLSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJbLV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotICAgICAgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgaHB1eDEwKnxocHV4MTEqKQotICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYPScrYiAkbGliZGlyJwotICAgICAgICA7OwotICAgICAgKikKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICBocHBhKjY0KnxpYTY0KikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgICA7OwotICAgICopCi0gICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGFDQyopCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaHBwYSo2NCopCi0JICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGlhNjQqKQotCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBsZF9zaGxpYnNfQ1hYPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBpbnRlcml4MyopCi0gICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKLSAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgOzsKLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTR0kgQysrCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0JICBmaQotCWZpCi0JbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0JOzsKLSAgICBlc2FjCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0gICAgOzsKLSAgbGludXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJwotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCBncmVwICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBpY3BjKikKLQkjIEludGVsIEMrKwotCXdpdGhfZ251X2xkPXllcwotCSMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCi0JIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKLQkjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgotCWNhc2UgYCRDQyAtViAyPiYxYCBpbgotCSoiVmVyc2lvbiA3LiIqKQotICAJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgOzsKLQkqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgotCSAgdG1wX2lkeW49Ci0JICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7Ci0JICBlc2FjCi0gIAkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQk7OwotICAgICAgcGdDQyopCi0gICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCi0gIAlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgICAgOzsKLSAgICAgIGN4eCopCi0JIyBDb21wYXEgQysrCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKLQotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgbHlueG9zKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgbTg4ayopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIG12cyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGN4eCopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBuZXRic2QqKQotICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgZmkKLSAgICAjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCi0gICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCi0gICAgOzsKLSAgb3BlbmJzZDIqKQotICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGZpCi0gICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgOzsKLSAgb3NmMyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJwotCi0JOzsKLSAgICAgIFJDQyopCi0JIyBSYXRpb25hbCBDKysgMi40LjEKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGN4eCopCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIGxkX3NobGlic19DWFg9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG9zZjQqIHwgb3NmNSopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgUkNDKikKLQkjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgY3h4KikKLQlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KLQkgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIC1XbCwtaW5wdXQgLVdsLCRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24JJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgotCSAgJHJtICRsaWIuZXhwJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBsZF9zaGxpYnNfQ1hYPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBwc29zKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgc3Vub3M0KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LngKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGxjYyopCi0JIyBMdWNpZAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgc29sYXJpcyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCi0gICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKLQlub191bmRlZmluZWRfZmxhZ19DWFg9JyAtemRlZnMnCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotCWNhc2UgJGhvc3Rfb3MgaW4KLQkgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLQkgICopCi0JICAgICMgVGhlIEMrKyBjb21waWxlciBpcyB1c2VkIGFzIGxpbmtlciBzbyB3ZSBtdXN0IHVzZSAkd2wKLQkgICAgIyBmbGFnIHRvIHBhc3MgdGhlIGNvbW1hbmRzIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQotCSAgICAjIGxpbmtlci4gV2UgbXVzdCBhbHNvIHBhc3MgZWFjaCBjb252aWVuY2UgbGlicmFyeSB0aHJvdWdoCi0JICAgICMgdG8gdGhlIHN5c3RlbSBsaW5rZXIgYmV0d2VlbiBhbGxleHRyYWN0L2RlZmF1bHRleHRyYWN0LgotCSAgICAjIFRoZSBDKysgY29tcGlsZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCi0JICAgICMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAotCSAgICAjIHdpdGhvdXQgJHdsLgotCSAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKLQkgICAgOzsKLQllc2FjCi0JbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcwotCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSMgaW4gdGhlIGFyY2hpdmUuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIGdjeCopCi0JIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0KLQkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgICopCi0JIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LXogJHt3bH1kZWZzJwotCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgotCSAgZWxzZQotCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCi0JICAgICMgcGxhdGZvcm0uCi0JICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBmaQotCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkd2wkbGliZGlyJwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLlswMjRdKikKLSAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKLSAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgICAgKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKLSAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAjIGFzIC16IGRlZnMuCi0gICAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cwotICAgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCi0gICAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KLSAgICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgotICAgICMgU28gdGhhdCBiZWhhdmlvdXIgaXMgb25seSBlbmFibGVkIGlmIFNDT0FCU1BBVEggaXMgc2V0IHRvIGEKLSAgICAjIG5vbi1lbXB0eSB2YWx1ZSBpbiB0aGUgZW52aXJvbm1lbnQuICBNb3N0IGxpa2VseSBvbmx5IHVzZWZ1bCBmb3IKLSAgICAjIGNyZWF0aW5nIG9mZmljaWFsIGRpc3RyaWJ1dGlvbnMgb2YgcGFja2FnZXMuCi0gICAgIyBUaGlzIGlzIGEgaGFjayB1bnRpbCBsaWJ0b29sIG9mZmljaWFsbHkgc3VwcG9ydHMgYWJzb2x1dGUgcGF0aAotICAgICMgbmFtZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LG5vZGVmcycKLSAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKLSAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1CZXhwb3J0JwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdGFuZGVtKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgTkNDKikKLQkjIE5vblN0b3AtVVggTkNDIDMuMjAKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHZ4d29ya3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICAqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0NYWCIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0NYWCIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLUdDQ19DWFg9IiRHWFgiCi1MRF9DWFg9IiRMRCIKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLWNsYXNzIEZvbwotewotcHVibGljOgotICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KLXByaXZhdGU6Ci0gIGludCBhOwotfTsKLUVPRgotCi1pZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci0gICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotCi0gICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKLSAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCi0gIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KLQotICAjIFRoZSBgKicgaW4gdGhlIGNhc2UgbWF0Y2hlcyBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBgY2FzZScgaW4KLSAgIyAkb3V0cHV0X3ZlcmJvc2VfY21kIGNhbiB0cmlnZ2VyIGdsb2IgZXhwYW5zaW9uIGR1cmluZyB0aGUgbG9vcAotICAjIGV2YWwgd2l0aG91dCB0aGlzIHN1YnN0aXR1dGlvbi4KLSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9YCRlY2hvICJYJG91dHB1dF92ZXJib3NlX2xpbmtfY21kIiB8ICRYc2VkIC1lICIkbm9fZ2xvYl9zdWJzdCJgCi0KLSAgZm9yIHAgaW4gYGV2YWwgJG91dHB1dF92ZXJib3NlX2xpbmtfY21kYDsgZG8KLSAgICBjYXNlICRwIGluCi0KLSAgICAtTCogfCAtUiogfCAtbCopCi0gICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KLSAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCi0gICAgICAgaWYgdGVzdCAkcCA9ICItTCIgXAotCSAgfHwgdGVzdCAkcCA9ICItUiI7IHRoZW4KLQkgcHJldj0kcAotCSBjb250aW51ZQotICAgICAgIGVsc2UKLQkgcHJldj0KLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgY2FzZSAkcCBpbgotCSAtTCogfCAtUiopCi0JICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCi0JICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCi0JICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCi0JICAgaWYgdGVzdCAteiAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFgiOyB0aGVuCi0JICAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSIke3ByZXZ9JHtwfSIKLQkgICBlbHNlCi0JICAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPSIke2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFh9ICR7cHJldn0ke3B9IgotCSAgIGZpCi0JICAgOzsKLQkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKLQkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCi0JIGVzYWMKLSAgICAgICBlbHNlCi0JIGlmIHRlc3QgLXogIiRwb3N0ZGVwc19DWFgiOyB0aGVuCi0JICAgcG9zdGRlcHNfQ1hYPSIke3ByZXZ9JHtwfSIKLQkgZWxzZQotCSAgIHBvc3RkZXBzX0NYWD0iJHtwb3N0ZGVwc19DWFh9ICR7cHJldn0ke3B9IgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICouJG9iamV4dCkKLSAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKLSAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KLSAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KLQkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKLQkgY29udGludWUKLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgaWYgdGVzdCAteiAiJHByZWRlcF9vYmplY3RzX0NYWCI7IHRoZW4KLQkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwIgotCSBlbHNlCi0JICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcHJlZGVwX29iamVjdHNfQ1hYICRwIgotCSBmaQotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJHBvc3RkZXBfb2JqZWN0c19DWFgiOyB0aGVuCi0JICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHAiCi0JIGVsc2UKLQkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcG9zdGRlcF9vYmplY3RzX0NYWCAkcCIKLQkgZmkKLSAgICAgICBmaQotICAgICAgIDs7Ci0KLSAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KLQotICAgIGVzYWMKLSAgZG9uZQotCi0gICMgQ2xlYW4gdXAuCi0gIHJtIC1mIGEub3V0IGEuZXhlCi1lbHNlCi0gIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyBDWFggdGVzdCBwcm9ncmFtIgotZmkKLQotJHJtIC1mIGNvbmZlc3QuJG9iamV4dAotCi0jIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgotY2FzZSAkaG9zdF9vcyBpbgotaW50ZXJpeDMqKQotICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCi0gICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCi0gIHByZWRlcF9vYmplY3RzX0NYWD0KLSAgcG9zdGRlcF9vYmplY3RzX0NYWD0KLSAgcG9zdGRlcHNfQ1hYPQotICA7OwotCi1zb2xhcmlzKikKLSAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgQ0MqKQotICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCi0gICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAotICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCi0gICAgcG9zdGRlcHNfQ1hYPSctbENzdGQgLWxDcnVuJwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLWVzYWMKLQotCi1jYXNlICIgJHBvc3RkZXBzX0NYWCAiIGluCi0qIiAtbGMgIiopIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubyA7OwotZXNhYwotCi1sdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0KLWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQotIAotICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCi0gIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0gICAgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLURETExfRVhQT1JUJwotICAgICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0gICAgKmRqZ3BwKikKLSAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotICAgICAgOzsKLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0KiB8IGFpeDUqKQotCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JZWxzZQotCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0JZmkKLQk7OwotICAgICAgY2hvcnVzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCWN4Y2g2OCopCi0JICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgIyBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCBDWFgpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgIGRhcndpbiopCi0gICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgICB4bGMqKQotICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1xbm9jb21tb24nCi0gICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotICAgICAgICAgICA7OwotICAgICAgICAgZXNhYwotICAgICAgIDs7Ci0gICAgICBkZ3V4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZWMrKyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIDs7Ci0JICBnaGN4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0JIyBGcmVlQlNEIHVzZXMgR05VIEMrKwotCTs7Ci0gICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLQkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKLQkgICAgZmkKLQkgICAgOzsKLQkgIGFDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBocHBhKjY0KnxpYTY0KikKLQkgICAgICAjICtaIHRoZSBkZWZhdWx0Ci0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBpbnRlcml4KikKLQkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKLQkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/Ci0JOzsKLSAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCi0JICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgbGludXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBLQ0MqKQotCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotCSAgICA7OwotCSAgaWNwYyogfCBlY3BjKikKLQkgICAgIyBJbnRlbCBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKLQkgICAgOzsKLQkgIHBnQ0MqKQotCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlci4KLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZwaWMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JICBjeHgqKQotCSAgICAjIENvbXBhcSBDKysKLQkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQotCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBseW54b3MqKQotCTs7Ci0gICAgICBtODhrKikKLQk7OwotICAgICAgbXZzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgY3h4KikKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBuZXRic2QqKQotCTs7Ci0gICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKLQkgICAgOzsKLQkgIFJDQyopCi0JICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgRGlnaXRhbC9Db21wYXEgQysrCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHBzb3MqKQotCTs7Ci0gICAgICBzb2xhcmlzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctUW9wdGlvbiBsZCAnCi0JICAgIDs7Ci0JICBnY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1QSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3Vub3M0KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC54Ci0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGxjYyopCi0JICAgICMgTHVjaWQKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHRhbmRlbSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIE5DQyopCi0JICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICB2eHdvcmtzKikKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjY7IH0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWD1ubwotICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgotICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7Ci0gICAgIGVzYWMKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLSAgICA7OwotICAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFggZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYXCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcwotICAgICBmaQotICAgZmkKLSAgIGNobW9kIHUrdyAuIDI+JjUKLSAgICRybSBjb25mdGVzdCoKLSAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKLSAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgotICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcwotICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAotICAgY2QgLi4KLSAgIHJtZGlyIGNvbmZ0ZXN0Ci0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2OyB9Ci0KLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQotJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0KLSAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXg0KiB8IGFpeDUqKQotICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLSAgICBpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLSAgICBlbHNlCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGZpCi0gICAgOzsKLSAgcHczMiopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9IiRsdGRsbF9jbWRzIgotICA7OwotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvOy9eLiogX19ubV9fL3MvXi4qIF9fbm1fX1woW14gXSpcKSBbXiBdKi9cMSBEQVRBLzsvXkkgL2Q7L15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIDs7Ci0gICopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KLXRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCi14fHh5ZXMpCi0gICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKLSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYCi0JcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWAotICAgICAgICBjb21waWxlcl9mbGFncz0tdgotICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKLSAgICAgICAgdmVyc3RyaW5nPQotICAgICAgICBvdXRwdXRfb2JqZGlyPS4KLSAgICAgICAgbGlibmFtZT1jb25mdGVzdAotICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQotICAgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQotICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICAgICAgICB0aGVuCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICAgICAgZWxzZQotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotICAgICAgICBmaQotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNQotJGFzX2VjaG8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNjsgfQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotc2hyZXh0X2NtZHM9Ii5zbyIKLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCi0gICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCi0gICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCi0gICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICBmaQotZWxzZQotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotbmVlZF92ZXJzaW9uPXVua25vd24KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZWxzZQotICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKLSAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCi0gICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bwotICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCi0gICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCi0gICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJwotCSAgIGVjaG8gJyB5ZXMgJwotCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBmaQotICAgIHNobGlicGF0aF92YXI9TElCUEFUSAotICBmaQotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGlbNDVdKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJwotICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KLSAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KLSAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgotICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgotICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KLSAgICAgICAkcm0gXCRkbHBhdGgnCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiopCi0gICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgICAgIDs7Ci0gICAgbWluZ3cqKQotICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5Ci0gICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKLSAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQotICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCi0gICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKLSAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gICAgICBlbHNlCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgICAgIGZpCi0gICAgICA7OwotICAgIHB3MzIqKQotICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotCi0gICopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCi0gICAgOzsKLSAgZXNhYwotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KLSAgc2hsaWJwYXRoX3Zhcj1QQVRICi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgotICB2ZXJzaW9uX3R5cGU9ZGFyd2luCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKLSAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi1rZnJlZWJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1mcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKLSAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCi0gIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0gICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKLSAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7Ci0gICAgZXNhYwotICBmaQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAotICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIHNocmV4dF9jbWRzPScuc28nCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgotICAgIGVsc2UKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKLSAgICBmaQotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICA7OwotICAgaHBwYSo2NCopCi0gICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICi0gICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKLSAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgICA7OwotICAgKikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIDs7Ci0gIGVzYWMKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pbnRlcml4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopCi0JaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotCQl2ZXJzaW9uX3R5cGU9bGludXgKLQllbHNlCi0JCXZlcnNpb25fdHlwZT1pcml4Ci0JZmkgOzsKLSAgZXNhYwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KLSAgICA7OwotICAqKQotICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQotICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCi0gICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKLSAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCi0gICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAotICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0KLSAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKLSAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQota25ldGJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLW5ld3NvczYpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1udG8tcW54KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7Ci0gICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OwotICBlc2FjCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0JOzsKLSAgICAgICopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCTs7Ci0gICAgICBlc2FjCi0gIGVsc2UKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGZpCi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X3ZlbmRvciBpbgotICAgIHNuaSkKLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKLSAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgICA7OwotICAgIHNpZW1lbnMpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc2NvMy4ydjUqKQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1Ci0kYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KLWhhcmRjb2RlX2FjdGlvbl9DWFg9Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9DWFgiIHx8IFwKLSAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0NYWCIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0NYWCIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgQ1hYKSIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiAhPSBubzsgdGhlbgotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uX0NYWD11bnN1cHBvcnRlZAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNjsgfQotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLQotIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCi0jIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAotIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCi0jIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAotICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLSAgZmkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZwotICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKLSAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgotICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCi0gICAgU0VEIFNIRUxMIFNUUklQIFwKLSAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKLSAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGNvbXBpbGVyX0NYWCBcCi0gICAgQ0NfQ1hYIFwKLSAgICBMRF9DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYIFwKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYIFwKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFggXAotICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggXAotICAgIHByZWRlcF9vYmplY3RzX0NYWCBcCi0gICAgcG9zdGRlcF9vYmplY3RzX0NYWCBcCi0gICAgcHJlZGVwc19DWFggXAotICAgIHBvc3RkZXBzX0NYWCBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCBcCi0gICAgYXJjaGl2ZV9jbWRzX0NYWCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggXAotICAgIHBvc3RpbnN0YWxsX2NtZHNfQ1hYIFwKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWCBcCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFggXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYIFwKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWCBcCi0gICAgbW9kdWxlX2NtZHNfQ1hYIFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFggXAotICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFggXAotICAgIGluY2x1ZGVfZXhwc3ltc19DWFg7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCB8IFwKLSAgICBhcmNoaXZlX2NtZHNfQ1hYIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIHwgXAotICAgIG1vZHVsZV9jbWRzX0NYWCB8IFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCB8IFwKLSAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXNlICRsdF9lY2hvIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLWNmZ2ZpbGU9IiRvZmlsZSIKLQotICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9jb21waWxlcl9DWFgKLQotIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPwotd2l0aF9nY2M9JEdDQ19DWFgKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTERfQ1hYCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JGx0X1NUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19DWFgKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWAotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFgKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19DWFgKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCi1zdHJpcGxpYj0kbHRfc3RyaXBsaWIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19DWFgKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfQ1hYCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzX0NYWAotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwcz0kbHRfcG9zdGRlcHNfQ1hYCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWAotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19DWFgKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0NYWAotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYCi0KLSMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bwotIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCi0jIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9DWFgKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0NYWAotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX0NYWCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLWV4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCi1leGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19DWFgKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19DWFgKLQotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotX19FT0ZfXwotCi0KLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKLSAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KLSAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi0gIGZpCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotQ0M9JGx0X3NhdmVfQ0MKLUxEQ1hYPSRMRAotTEQ9JGx0X3NhdmVfTEQKLUdDQz0kbHRfc2F2ZV9HQ0MKLXdpdGhfZ251X2xkY3h4PSR3aXRoX2dudV9sZAotd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKLWx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKLWx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAotbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCi1sdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotCi0JZWxzZQotCSAgdGFnbmFtZT0iIgotCWZpCi0JOzsKLQotICAgICAgRjc3KQotCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgotCSAgCi1hY19leHQ9ZgotYWNfY29tcGlsZT0nJEY3NyAtYyAkRkZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJEY3NyAtbyBjb25mdGVzdCRhY19leGVleHQgJEZGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudQotCi0KLWFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQotaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KLWhhcmRjb2RlX2F1dG9tYXRpY19GNzc9bm8KLW1vZHVsZV9jbWRzX0Y3Nz0KLW1vZHVsZV9leHBzeW1fY21kc19GNzc9Ci1saW5rX2FsbF9kZXBsaWJzX0Y3Nz11bmtub3duCi1vbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0kb2xkX2FyY2hpdmVfY21kcwotbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PQotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9bm8KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9ZgotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHRfRjc3PSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iICAgICAgc3Vicm91dGluZSB0XG4gICAgICByZXR1cm5cbiAgICAgIGVuZFxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIgICAgICBwcm9ncmFtIHRcbiAgICAgIGVuZFxuIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7Rjc3LSJmNzcifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9GNzc9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAiID4mNjsgfQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGVuYWJsZV9zdGF0aWMiID4mNjsgfQotCi1HQ0NfRjc3PSIkRzc3IgotTERfRjc3PSIkTEQiCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PQotbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0gCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLQotICAgIG1zZG9zZGpncHAqKQotICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXFub2NvbW1vbicKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgICAgOzsKLSAgICAgICBlc2FjCi0gICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZwaWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1QSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtjb25mb3JtX3BpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1waWMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzc9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NyBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzdcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3PXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBydW5wYXRoX3Zhcj0KLSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQotICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz1ubwotICBhcmNoaXZlX2NtZHNfRjc3PQotICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0KLSAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3Nz0KLSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KLSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfRjc3PQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQotICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gIGhhcmRjb2RlX21pbnVzX0xfRjc3PW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCi0gIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXVua25vd24KLSAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz1ubwotICBtb2R1bGVfY21kc19GNzc9Ci0gIG1vZHVsZV9leHBzeW1fY21kc19GNzc9Ci0gIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotICBpbmNsdWRlX2V4cHN5bXNfRjc3PQotICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0gICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi0gIGV4Y2x1ZGVfZXhwc3ltc19GNzc9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlic19GNzc9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KLSAgICBmaQotICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubwotICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KLSAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKLSAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCi0gICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCi0gICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucwotICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCi0gICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQlsZF9zaGxpYnNfRjc3PW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBGNzcpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PXllcwotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLQkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0JIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQllbHNlCi0JICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZml+Ci0JJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKLQkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKLQllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQllc2FjCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCWZpCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0JbGRfc2hsaWJzX0Y3Nz1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19GNzc9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKSAKLQlsZF9zaGxpYnNfRjc3PW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKLQkgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgbGRfc2hsaWJzX0Y3Nz1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19GNzc9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfRjc3IiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQloYXJkY29kZV9kaXJlY3RfRjc3PXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeDQqIHwgYWl4NSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQotCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0gIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0gIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLSAgCSAgICBicmVhawotICAJICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLSAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLSAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz11bnN1cHBvcnRlZAotICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0gIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0gIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotICAJICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLQllbHNlCi0JICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JICBlbHNlCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PXllcwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSAgICAgIHByb2dyYW0gbWFpbgotCi0gICAgICBlbmQKLV9BQ0VPRgotaWYgYWNfZm5fZjc3X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0gICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICAgZWxzZQotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ii16IG5vZGVmcyIKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotCWVsc2UKLQkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSAgICAgIHByb2dyYW0gbWFpbgotCi0gICAgICBlbmQKLV9BQ0VPRgotaWYgYWNfZm5fZjc3X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWJlcm5vdG9rJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJGNvbnZlbmllbmNlJwotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcwotCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGJzZGlbNDVdKikKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyAnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgb2xkX2FyY2hpdmVfY21kc19GNzc9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIGZpeF9zcmNmaWxlX3BhdGhfRjc3PSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLlswMTJdKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICBlbHNlCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICB4bGMqKQotICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICAgIyBleHRyYSBzcGFjZSkuCi0gICAgZnJlZWJzZDIuMiopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGhwdXg5KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLQotCWhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PScrYiAkbGliZGlyJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLQkgIDs7Ci0JKikKLQkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotCi0JICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLSAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAJKikKLSAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kc19GNzc9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0JbGRfc2hsaWJzX0Y3Nz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19GNzciID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19GNzciID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0Y3NyBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9GNzcKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfRjc3Ci0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NwotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gICAgICAgIHRoZW4KLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uX0Y3Nz0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0Y3NyIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfRjc3IiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfRjc3IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBGNzcpIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9GNzciICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb25fRjc3PXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb25fRjc3PWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb25fRjc3PXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjUKLSRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fRjc3IiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfRjc3IFwKLSAgICBDQ19GNzcgXAotICAgIExEX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzcgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcgXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzcgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NyBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NyBcCi0gICAgcHJlZGVwX29iamVjdHNfRjc3IFwKLSAgICBwb3N0ZGVwX29iamVjdHNfRjc3IFwKLSAgICBwcmVkZXBzX0Y3NyBcCi0gICAgcG9zdGRlcHNfRjc3IFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3IFwKLSAgICBhcmNoaXZlX2NtZHNfRjc3IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NyBcCi0gICAgcG9zdGluc3RhbGxfY21kc19GNzcgXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NyBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3IFwKLSAgICBub191bmRlZmluZWRfZmxhZ19GNzcgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3IFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3IFwKLSAgICBtb2R1bGVfY21kc19GNzcgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NyBcCi0gICAgZXhjbHVkZV9leHBzeW1zX0Y3NyBcCi0gICAgaW5jbHVkZV9leHBzeW1zX0Y3NzsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IHwgXAotICAgIGFyY2hpdmVfY21kc19GNzcgfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgfCBcCi0gICAgbW9kdWxlX2NtZHNfRjc3IHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzcKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3Ci0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX0Y3NwotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX0Y3NwotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9GNzcKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NwotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfRjc3Ci1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0Y3Nwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3Ci0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0Y3NwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19GNzcKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0Y3NwotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfRjc3Ci0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0Y3NwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19GNzcKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfRjc3Ci0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19GNzcKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3Ci0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19GNzcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0Y3NwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fRjc3Ci0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0Y3NwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzcKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19GNzcKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfRjc3Ci0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfRjc3IgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzcKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19GNzcKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0Y3NwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0Y3NwotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBHQ0opCi0JaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCi0JICAKLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWphdmEKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9HQ0o9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikge307IH1cbicKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1DQz0ke0dDSi0iZ2NqIn0KLWNvbXBpbGVyPSRDQwotY29tcGlsZXJfR0NKPSRDQwotZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotCi0jIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCi1hcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KLQotb2xkX2FyY2hpdmVfY21kc19HQ0o9JG9sZF9hcmNoaXZlX2NtZHMKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi0KLWx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0KLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPScgLWZuby1idWlsdGluJwotCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9IHh5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0ogLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLWVsc2UKLSAgICA6Ci1maQotCi1maQotCi1sdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0KLWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KLWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQotIAotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeCopCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIGVsc2UKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotICAgICAgZGFyd2luKikKLSAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgIHhsYyopCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1xbm9jb21tb24nCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9JytaJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGljYyogfCBlY2MqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctc3RhdGljJwotICAgICAgICA7OwotICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCi0gICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCi0JIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBjY2MqKQotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCi0JbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1Rb3B0aW9uIGxkICc7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCc7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LY29uZm9ybV9waWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgdW5pY29zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubwotICAgICAgOzsKLQotICAgIHV0czQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctcGljJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIiA+JjY7IH0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiI7IHRoZW4KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSj1ubwotICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgotICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiIDs7Ci0gICAgIGVzYWMKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KLSAgICA7OwotICAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bF9HQ0ogZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKXCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSj15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0orOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKPXllcwotICAgICBmaQotICAgZmkKLSAgIGNobW9kIHUrdyAuIDI+JjUKLSAgICRybSBjb25mdGVzdCoKLSAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKLSAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgotICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcwotICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAotICAgY2QgLi4KLSAgIHJtZGlyIGNvbmZ0ZXN0Ci0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY2OyB9Ci0KLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQotJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0KLSAgcnVucGF0aF92YXI9Ci0gIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KLSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9bm8KLSAgYXJjaGl2ZV9jbWRzX0dDSj0KLSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9Ci0gIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPQotICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0o9Ci0gIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9Ci0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KLSAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSj0KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPQotICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0KLSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubwotICBoYXJkY29kZV9taW51c19MX0dDSj1ubwotICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj11bnN1cHBvcnRlZAotICBsaW5rX2FsbF9kZXBsaWJzX0dDSj11bmtub3duCi0gIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0o9bm8KLSAgbW9kdWxlX2NtZHNfR0NKPQotICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPQotICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPW5vCi0gIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLSAgaW5jbHVkZV9leHBzeW1zX0dDSj0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBleGNsdWRlX2V4cHN5bXNfR0NKPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0gICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAotICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKLSAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90Ci0gICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgotICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgotICBleHRyYWN0X2V4cHN5bXNfY21kcz0KLSAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgotICBmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCi0gICAgICB3aXRoX2dudV9sZD1ubwotICAgIGZpCi0gICAgOzsKLSAgaW50ZXJpeCopCi0gICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKLSAgICB3aXRoX2dudV9sZD15ZXMKLSAgICA7OwotICBvcGVuYnNkKikKLSAgICB3aXRoX2dudV9sZD1ubwotICAgIDs7Ci0gIGVzYWMKLQotICBsZF9zaGxpYnNfR0NKPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgICB3bGFyYz0nJHt3bH0nCi0KLSAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQotICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQotICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICBlbHNlCi0gIAl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCi0gICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JbGRfc2hsaWJzX0dDSj1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKLSoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgotKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotCi0gICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cwotICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKLSAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKLSAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQotICAgICAgIyB0aGVtLgotICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgOzsKLQotICAgIGJlb3MqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgR0NKKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKLSAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPW5vCi0gICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj15ZXMKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0JIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZWxzZQotCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWZpfgotCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLSAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLSAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLSAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLSAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLSAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRtcF9hZGRmbGFnPQotCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgotCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCi0JICA7OwotCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OwotCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7Ci0JaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKLQkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQotCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKLQlmaQotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJwotCXdsYXJjPQotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCWxkX3NobGlic19HQ0o9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KLSAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikgCi0JbGRfc2hsaWJzX0dDSj1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGxkX3NobGlic19HQ0o9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubzsgdGhlbgotICAgICAgcnVucGF0aF92YXI9Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyopCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCi0JIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0JIyBicm9rZW4gY29sbGVjdDIuCi0JaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQllbHNlCi0JICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgotICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0gIAkgICAgYnJlYWsKLSAgCSAgZmkKLQkgIGRvbmUKLQkgIDs7Ci0JZXNhYwotCi0JZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgICBmaQotCi0gICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotCSAgZWxzZQotICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9dW5zdXBwb3J0ZWQKLSAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLSAgCSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXNoYXJlZF9mbGFnPSctc2hhcmVkJwotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0JZmkKLSAgICAgIGVsc2UKLQkjIG5vdCB1c2luZyBnY2MKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLSAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Jy1iZXJvaycKLSAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0iLXogbm9kZWZzIgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWJlcm5vdG9rJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJGNvbnZlbmllbmNlJwotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcwotCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgOzsKLQotICAgIGJzZGlbNDVdKikKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyAnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgb2xkX2FyY2hpdmVfY21kc19HQ0o9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIGZpeF9zcmNmaWxlX3BhdGhfR0NKPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLlswMTJdKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICBlbHNlCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICB4bGMqKQotICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlic19HQ0o9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICAgIyBleHRyYSBzcGFjZSkuCi0gICAgZnJlZWJzZDIuMiopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIGhwdXg5KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLQotCWhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPScrYiAkbGliZGlyJwotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubwotCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLQkgIDs7Ci0JKikKLQkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotCi0JICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLSAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAJKikKLSAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kc19HQ0o9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0JbGRfc2hsaWJzX0dDSj15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19HQ0oiID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19HQ0oiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0dDSiBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9HQ0oKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfR0NKCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfR0NKIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHNfR0NKIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gICAgICAgIHRoZW4KLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uX0dDSj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSiIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0dDSiIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfR0NKIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfR0NKIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBHQ0opIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9HQ0oiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb25fR0NKPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb25fR0NKPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb25fR0NKPXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjUKLSRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0dDSiIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fR0NKIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfR0NKIFwKLSAgICBDQ19HQ0ogXAotICAgIExEX0dDSiBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0ogXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0ogXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0ogXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0ogXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSiBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0ogXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0dDSiBcCi0gICAgcHJlZGVwX29iamVjdHNfR0NKIFwKLSAgICBwb3N0ZGVwX29iamVjdHNfR0NKIFwKLSAgICBwcmVkZXBzX0dDSiBcCi0gICAgcG9zdGRlcHNfR0NKIFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfR0NKIFwKLSAgICBhcmNoaXZlX2NtZHNfR0NKIFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiBcCi0gICAgcG9zdGluc3RhbGxfY21kc19HQ0ogXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19HQ0ogXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSiBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKIFwKLSAgICBub191bmRlZmluZWRfZmxhZ19HQ0ogXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSiBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0ogXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKIFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKIFwKLSAgICBtb2R1bGVfY21kc19HQ0ogXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0ogXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiBcCi0gICAgZXhjbHVkZV9leHBzeW1zX0dDSiBcCi0gICAgaW5jbHVkZV9leHBzeW1zX0dDSjsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIHwgXAotICAgIGFyY2hpdmVfY21kc19HQ0ogfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0ogfCBcCi0gICAgbW9kdWxlX2NtZHNfR0NKIHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0ogfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX0dDSgotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX0dDSgotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9HQ0oKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfR0NKCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0oKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0dDSgotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSgotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0dDSgotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19HQ0oKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0dDSgotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfR0NKCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0dDSgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19HQ0oKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfR0NKCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19HQ0oKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfR0NKCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19HQ0oKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0dDSgotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fR0NKCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0oKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0oKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfR0NKCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0dDSgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfR0NKCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfR0NKIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0oKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19HQ0oKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0dDSgotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0dDSgotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBSQykKLQkKLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1yYwotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9SQz0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH1cbicKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1DQz0ke1JDLSJ3aW5kcmVzIn0KLWNvbXBpbGVyPSRDQwotY29tcGlsZXJfUkM9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi1sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQz15ZXMKLQotIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCi0jIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAotIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCi0jIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAotICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLSAgZmkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZwotICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKLSAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgotICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCi0gICAgU0VEIFNIRUxMIFNUUklQIFwKLSAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKLSAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGNvbXBpbGVyX1JDIFwKLSAgICBDQ19SQyBcCi0gICAgTERfUkMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfUkMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX1JDIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkMgXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX1JDIFwKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQyBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQyBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19SQyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQyBcCi0gICAgcHJlZGVwX29iamVjdHNfUkMgXAotICAgIHBvc3RkZXBfb2JqZWN0c19SQyBcCi0gICAgcHJlZGVwc19SQyBcCi0gICAgcG9zdGRlcHNfUkMgXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQyBcCi0gICAgYXJjaGl2ZV9jbWRzX1JDIFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX1JDIFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX1JDIFwKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHNfUkMgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19SQyBcCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWdfUkMgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfUkMgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMgXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19SQyBcCi0gICAgbW9kdWxlX2NtZHNfUkMgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19SQyBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMgXAotICAgIGV4Y2x1ZGVfZXhwc3ltc19SQyBcCi0gICAgaW5jbHVkZV9leHBzeW1zX1JDOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19SQyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIHwgXAotICAgIGFyY2hpdmVfY21kc19SQyB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX1JDIHwgXAotICAgIG1vZHVsZV9jbWRzX1JDIHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19SQyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQyB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX1JDIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19SQwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9jb21waWxlcl9SQwotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX1JDCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX1JDCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JGx0X1NUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9SQwotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfUkMKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkMKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfUkMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfUkMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19SQwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfUkMKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfUkMKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfUkMKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX1JDCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19SQwotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCi1zdHJpcGxpYj0kbHRfc3RyaXBsaWIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19SQwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19SQwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19SQwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwcz0kbHRfcG9zdGRlcHNfUkMKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkMKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX1JDCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19SQwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fUkMKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDCi0KLSMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bwotIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCi0jIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9SQwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9SQwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9SQwotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX1JDCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX1JDCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfUkMiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfUkMKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX1JDCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfUkMKLQotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotX19FT0ZfXwotCi0KLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKLSAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KLSAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi0gIGZpCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotQ0M9IiRsdF9zYXZlX0NDIgotCi0JOzsKLQotICAgICAgKikKLQlhc19mbl9lcnJvciAkPyAiVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lIiAiJExJTkVOTyIgNQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuZXcgdGFnIG5hbWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gICAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSIgOyB0aGVuCi0gICAgICBhdmFpbGFibGVfdGFncz0iJGF2YWlsYWJsZV90YWdzICR0YWduYW1lIgotICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICAjIE5vdyBzdWJzdGl0dXRlIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gIGlmIGV2YWwgInNlZCAtZSAncy9eYXZhaWxhYmxlX3RhZ3M9LipcJC9hdmFpbGFibGVfdGFncz1cIiRhdmFpbGFibGVfdGFnc1wiLycgXCIkb2ZpbGVcIiA+IFwiJHtvZmlsZX1UXCIiOyB0aGVuCi0gICAgbXYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIKLSAgICBjaG1vZCAreCAiJG9maWxlIgotICBlbHNlCi0gICAgcm0gLWYgIiR7b2ZpbGV9VCIKLSAgICBhc19mbl9lcnJvciAkPyAidW5hYmxlIHRvIHVwZGF0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMuIiAiJExJTkVOTyIgNQotICBmaQotZmkKLQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KLQotCi0KLQotCi0KLQotCi0KLQotCi0gIAotCi0gIAotCi0KLSAgCi0gICAgICAgCi0gICAgICAgCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFyOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9BUis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJEFSIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1hc19kdW1teT0iJFBBVEg6L3Vzci9jY3MvYmluIgotZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3BhdGhfQVI9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVIiICYmIGFjX2N2X3BhdGhfQVI9Ii91c3IvYmluL2FyIgotICA7OwotZXNhYwotZmkKLUFSPSRhY19jdl9wYXRoX0FSCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQotJGFzX2VjaG8gIiRBUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0KLSMgT3B0aW9ucwotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGlnaHR2bmMtZmlsZXRyYW5zZmVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90aWdodHZuY19maWxldHJhbnNmZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlcjsgCi1lbHNlCi0gICB3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2Zlcj15ZXMgCi1maQotCi0jIEFDX0RFRklORSBtb3ZlZCB0byBhZnRlciBsaWJwdGhyZWFkIGNoZWNrLgotCi0jIFdlYlNvY2tldHMgc3VwcG9ydAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX19iNjRfbnRvcCBpbiAtbHJlc29sdiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX19iNjRfbnRvcCBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcmVzb2x2X19fYjY0X250b3ArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHJlc29sdiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgX19iNjRfbnRvcCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIF9fYjY0X250b3AgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wPXllcwotZWxzZQotICBhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3A9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0I2ND0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9CNjQ9ImZhbHNlIgotZmkKLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtd2Vic29ja2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfd2Vic29ja2V0cytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfd2Vic29ja2V0czsgCi1lbHNlCi0gICB3aXRoX3dlYnNvY2tldHM9eWVzIAotZmkKLQotIyBBQ19ERUZJTkUgbW92ZWQgdG8gYWZ0ZXIgbGlicmVzb2x2ZSBjaGVjay4KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtMjRicHAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoXzI0YnBwK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF8yNGJwcDsgCi1lbHNlCi0gICB3aXRoXzI0YnBwPXllcyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF8yNGJwcCIgPSAieHllcyI7IHRoZW4KLQkkYXNfZWNobyAiQCU6QGRlZmluZSBBTExPVzI0QlBQIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmZtcGVnIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9mZm1wZWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2ZmbXBlZzsgCi1maQotCi0KLSBpZiB0ZXN0ICEgLXogIiR3aXRoX2ZmbXBlZyI7IHRoZW4KLSAgV0lUSF9GRk1QRUdfVFJVRT0KLSAgV0lUSF9GRk1QRUdfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfRkZNUEVHX1RSVUU9JyMnCi0gIFdJVEhfRkZNUEVHX0ZBTFNFPQotZmkKLQotaWYgdGVzdCAhIC16ICIkd2l0aF9mZm1wZWciOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGFtZV9pbml0IGluIC1sbXAzbGFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbGFtZV9pbml0IGluIC1sbXAzbGFtZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG1wM2xhbWUgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGxhbWVfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGxhbWVfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQiID0geHllczsgdGhlbiA6Ci0gIEhBVkVfTVAzTEFNRT0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9NUDNMQU1FPSJmYWxzZSIgCi1maQotCi1maQotIGlmIHRlc3QgIiRIQVZFX01QM0xBTUUiID0gInRydWUiOyB0aGVuCi0gIEhBVkVfTVAzTEFNRV9UUlVFPQotICBIQVZFX01QM0xBTUVfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTVAzTEFNRV9UUlVFPScjJwotICBIQVZFX01QM0xBTUVfRkFMU0U9Ci1maQotCi0KLSMgU2VlbSB0byBuZWVkIHRoaXMgZHVtbXkgaGVyZSB0byBpbmR1Y2UgdGhlICdjaGVja2luZyBmb3IgZWdyZXAuLi4gZ3JlcCAtRScsIGV0Yy4KLSMgYmVmb3JlIGl0IHNlZW1lZCB0byBiZSBpbnNpZGUgdGhlIHdpdGhfanBlZyBjb25kaXRpb25hbC4gCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidGhlbm9uZXhpc3RlbnRoZWFkZXIuaCIgImFjX2N2X2hlYWRlcl90aGVub25leGlzdGVudGhlYWRlcl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl90aGVub25leGlzdGVudGhlYWRlcl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1RIRU5PTkVYSVNURU5USEVBREVSX0g9InRydWUiCi1maQotCi0KLQotIyBzZXQgc29tZSBsZCAtUiBub25zZW5zZQotIwotdW5hbWVfcz1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAKLWxkX21pbnVzX1I9InllcyIKLWlmIHRlc3QgIngkdW5hbWVfcyIgPSAieEhQLVVYIjsgdGhlbgotCWxkX21pbnVzX1I9Im5vIgotZWxpZiB0ZXN0ICJ4JHVuYW1lX3MiID0gInhPU0YxIjsgdGhlbgotCWxkX21pbnVzX1I9Im5vIgotZWxpZiB0ZXN0ICJ4JHVuYW1lX3MiID0gInhEYXJ3aW4iOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1maQotCi0jIENoZWNrIGZvciBPcGVuU1NMCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1jcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY3J5cHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NyeXB0OyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9jcnlwdCIgIT0gInhubyI7IHRoZW4KLQlmb3IgYWNfZnVuYyBpbiBjcnlwdAotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJjcnlwdCIgImFjX2N2X2Z1bmNfY3J5cHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfY3J5cHQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9DUllQVCAxCi1fQUNFT0YKLSBIQVZFX0xJQkNfQ1JZUFQ9InRydWUiCi1maQotZG9uZQotCi0JaWYgdGVzdCAteiAiJEhBVkVfTElCQ19DUllQVCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY3J5cHQgaW4gLWxjcnlwdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgY3J5cHQgaW4gLWxjcnlwdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfY3J5cHRfY3J5cHQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGNyeXB0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjcnlwdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGNyeXB0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jcnlwdF9jcnlwdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2NyeXB0X2NyeXB0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPSB4eWVzOyB0aGVuIDoKLSAgQ1JZUFRfTElCUz0iLWxjcnlwdCIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCQ1JZUFQgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQlmaQotZmkKLQotCi0jIHNvbWUgT1MncyBuZWVkIGJvdGggLWxzc2wgYW5kIC1sY3J5cHRvIG9uIGxpbmsgbGluZToKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0byB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY3J5cHRvK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9jcnlwdG87IAotZmkKLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1zc2wgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NzbCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3NsOyAKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX2NyeXB0byIgIT0gInhubyIgLWEgIngkd2l0aF9zc2wiICE9ICJ4bm8iOyB0aGVuCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9zc2wiIC1hICJ4JHdpdGhfc3NsIiAhPSAieHllcyI7IHRoZW4KLQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0JCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aF9zc2wvaW5jbHVkZSIKLQkJTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aF9zc2wvbGliIgotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfc3NsL2xpYiIKLQkJZWxzZQotCQkJTERGTEFHUz0iJExERkxBR1MgLVIkd2l0aF9zc2wvbGliIgotCQlmaQotCWZpCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgUkFORF9maWxlX25hbWUgaW4gLWxjcnlwdG8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFJBTkRfZmlsZV9uYW1lIGluIC1sY3J5cHRvLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGNyeXB0byAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgUkFORF9maWxlX25hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBSQU5EX2ZpbGVfbmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJDUllQVE8gMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJDUllQVE89InRydWUiCi1maQotCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9zc2wiIC1hICJ4JHdpdGhfc3NsIiAhPSAieHllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX0xJQkNSWVBUTyIgIT0gInh0cnVlIjsgdGhlbgotCQkJQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKLQkJCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCQlmaQotCWZpCi1maQotCi0KLWlmIHRlc3QgIngkd2l0aF9zc2wiICE9ICJ4bm8iOyB0aGVuCi0JaWYgdGVzdCAieCRIQVZFX0xJQkNSWVBUTyIgPSAieHRydWUiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFNTTF9saWJyYXJ5X2luaXQgaW4gLWxzc2wiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNTTF9saWJyYXJ5X2luaXQgaW4gLWxzc2wuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzc2wgLWxjcnlwdG8gJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgU1NMX2xpYnJhcnlfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBTU0xfTElCUz0iLWxzc2wgLWxjcnlwdG8iCi0JCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlNTTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlNTTD0idHJ1ZSIKLWZpCi0KLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFNTTF9saWJyYXJ5X2luaXQgaW4gLWxzc2wiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNTTF9saWJyYXJ5X2luaXQgaW4gLWxzc2wuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzc2wgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBTU0xfbGlicmFyeV9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdCIgPSB4eWVzOyB0aGVuIDoKLSAgU1NMX0xJQlM9Ii1sc3NsIgotCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJTU0wgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJTU0w9InRydWUiCi1maQotCi0JZmkKLWZpCi0KLSBpZiB0ZXN0ICEgLXogIiRTU0xfTElCUyI7IHRoZW4KLSAgSEFWRV9MSUJTU0xfVFJVRT0KLSAgSEFWRV9MSUJTU0xfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTElCU1NMX1RSVUU9JyMnCi0gIEhBVkVfTElCU1NMX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrcyBmb3IgWCBsaWJyYXJpZXMKLUhBVkVfWDExPSJmYWxzZSIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFgiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFguLi4gIiA+JjY7IH0KLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3g7IAotZmkKLQotIyAkaGF2ZV94IGlzIGB5ZXMnLCBgbm8nLCBgZGlzYWJsZWQnLCBvciBlbXB0eSB3aGVuIHdlIGRvIG5vdCB5ZXQga25vdy4KLWlmIHRlc3QgIngkd2l0aF94IiA9IHhubzsgdGhlbgotICAjIFRoZSB1c2VyIGV4cGxpY2l0bHkgZGlzYWJsZWQgWC4KLSAgaGF2ZV94PWRpc2FibGVkCi1lbHNlCi0gIGNhc2UgJHhfaW5jbHVkZXMsJHhfbGlicmFyaWVzIGluICMoCi0gICAgKlwnKikgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCB1c2UgWCBkaXJlY3RvcnkgbmFtZXMgY29udGFpbmluZyAnIiAiJExJTkVOTyIgNTs7ICMoCi0gICAgKixOT05FIHwgTk9ORSwqKSBpZiAke2FjX2N2X2hhdmVfeCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgT25lIG9yIGJvdGggb2YgdGhlIHZhcnMgYXJlIG5vdCBzZXQsIGFuZCB0aGVyZSBpcyBubyBjYWNoZWQgdmFsdWUuCi1hY194X2luY2x1ZGVzPW5vIGFjX3hfbGlicmFyaWVzPW5vCi1ybSAtZiAtciBjb25mdGVzdC5kaXIKLWlmIG1rZGlyIGNvbmZ0ZXN0LmRpcjsgdGhlbgotICBjZCBjb25mdGVzdC5kaXIKLSAgY2F0ID5JbWFrZWZpbGUgPDwnX0FDRU9GJwotaW5jcm9vdDoKLQlAZWNobyBpbmNyb290PScke0lOQ1JPT1R9JwotdXNybGliZGlyOgotCUBlY2hvIHVzcmxpYmRpcj0nJHtVU1JMSUJESVJ9JwotbGliZGlyOgotCUBlY2hvIGxpYmRpcj0nJHtMSUJESVJ9JwotX0FDRU9GCi0gIGlmIChleHBvcnQgQ0M7ICR7WE1LTUYteG1rbWZ9KSA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYmIHRlc3QgLWYgTWFrZWZpbGU7IHRoZW4KLSAgICAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi0gICAgZm9yIGFjX3ZhciBpbiBpbmNyb290IHVzcmxpYmRpciBsaWJkaXI7IGRvCi0gICAgICBldmFsICJhY19pbV8kYWNfdmFyPVxgXCR7TUFLRS1tYWtlfSAkYWNfdmFyIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzL14kYWNfdmFyPS8vcCdcYCIKLSAgICBkb25lCi0gICAgIyBPcGVuIFdpbmRvd3MgeG1rbWYgcmVwb3J0ZWRseSBzZXRzIExJQkRJUiBpbnN0ZWFkIG9mIFVTUkxJQkRJUi4KLSAgICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2wgZHlsaWIgbGEgZGxsOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkYWNfaW1fdXNybGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIiAmJgotCSB0ZXN0IC1mICIkYWNfaW1fbGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIjsgdGhlbgotCWFjX2ltX3VzcmxpYmRpcj0kYWNfaW1fbGliZGlyOyBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgIyBTY3JlZW4gb3V0IGJvZ3VzIHZhbHVlcyBmcm9tIHRoZSBpbWFrZSBjb25maWd1cmF0aW9uLiAgVGhleSBhcmUKLSAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCi0gICAgIyB1c2luZyB0aGVtIHdvdWxkIGJyZWFrIGdjYyBvbiBzeXN0ZW1zIHdoZXJlIGl0IG5lZWRzIGZpeGVkIGluY2x1ZGVzLgotICAgIGNhc2UgJGFjX2ltX2luY3Jvb3QgaW4KLQkvdXNyL2luY2x1ZGUpIGFjX3hfaW5jbHVkZXM9IDs7Ci0JKikgdGVzdCAtZiAiJGFjX2ltX2luY3Jvb3QvWDExL1hvcy5oIiAmJiBhY194X2luY2x1ZGVzPSRhY19pbV9pbmNyb290OzsKLSAgICBlc2FjCi0gICAgY2FzZSAkYWNfaW1fdXNybGliZGlyIGluCi0JL3Vzci9saWIgfCAvdXNyL2xpYjY0IHwgL2xpYiB8IC9saWI2NCkgOzsKLQkqKSB0ZXN0IC1kICIkYWNfaW1fdXNybGliZGlyIiAmJiBhY194X2xpYnJhcmllcz0kYWNfaW1fdXNybGliZGlyIDs7Ci0gICAgZXNhYwotICBmaQotICBjZCAuLgotICBybSAtZiAtciBjb25mdGVzdC5kaXIKLWZpCi0KLSMgU3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3RvcmllcyBmb3IgWCBoZWFkZXJzLgotIyBDaGVjayBYMTEgYmVmb3JlIFgxMVJuIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBzeW1saW5rIHRvIHRoZSBjdXJyZW50IHJlbGVhc2UuCi1hY194X2hlYWRlcl9kaXJzPScKLS91c3IvWDExL2luY2x1ZGUKLS91c3IvWDExUjcvaW5jbHVkZQotL3Vzci9YMTFSNi9pbmNsdWRlCi0vdXNyL1gxMVI1L2luY2x1ZGUKLS91c3IvWDExUjQvaW5jbHVkZQotCi0vdXNyL2luY2x1ZGUvWDExCi0vdXNyL2luY2x1ZGUvWDExUjcKLS91c3IvaW5jbHVkZS9YMTFSNgotL3Vzci9pbmNsdWRlL1gxMVI1Ci0vdXNyL2luY2x1ZGUvWDExUjQKLQotL3Vzci9sb2NhbC9YMTEvaW5jbHVkZQotL3Vzci9sb2NhbC9YMTFSNy9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI2L2luY2x1ZGUKLS91c3IvbG9jYWwvWDExUjUvaW5jbHVkZQotL3Vzci9sb2NhbC9YMTFSNC9pbmNsdWRlCi0KLS91c3IvbG9jYWwvaW5jbHVkZS9YMTEKLS91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNwotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI2Ci0vdXNyL2xvY2FsL2luY2x1ZGUvWDExUjUKLS91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNAotCi0vdXNyL1gzODYvaW5jbHVkZQotL3Vzci94Mzg2L2luY2x1ZGUKLS91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMQotCi0vdXNyL2luY2x1ZGUKLS91c3IvbG9jYWwvaW5jbHVkZQotL3Vzci91bnN1cHBvcnRlZC9pbmNsdWRlCi0vdXNyL2F0aGVuYS9pbmNsdWRlCi0vdXNyL2xvY2FsL3gxMXI1L2luY2x1ZGUKLS91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZQotCi0vdXNyL29wZW53aW4vaW5jbHVkZQotL3Vzci9vcGVud2luL3NoYXJlL2luY2x1ZGUnCi0KLWlmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IG5vOyB0aGVuCi0gICMgR3Vlc3Mgd2hlcmUgdG8gZmluZCBpbmNsdWRlIGZpbGVzLCBieSBsb29raW5nIGZvciBYbGliLmguCi0gICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxYMTEvWGxpYi5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgotYWNfeF9pbmNsdWRlcz0KLWVsc2UKLSAgZm9yIGFjX2RpciBpbiAkYWNfeF9oZWFkZXJfZGlyczsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX2Rpci9YMTEvWGxpYi5oIjsgdGhlbgotICAgIGFjX3hfaW5jbHVkZXM9JGFjX2RpcgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotZmkgIyAkYWNfeF9pbmNsdWRlcyA9IG5vCi0KLWlmIHRlc3QgIiRhY194X2xpYnJhcmllcyIgPSBubzsgdGhlbgotICAjIENoZWNrIGZvciB0aGUgbGlicmFyaWVzLgotICAjIFNlZSBpZiB3ZSBmaW5kIHRoZW0gd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zLgotICAjIERvbid0IGFkZCB0byAkTElCUyBwZXJtYW5lbnRseS4KLSAgYWNfc2F2ZV9MSUJTPSRMSUJTCi0gIExJQlM9Ii1sWDExICRMSUJTIgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8WDExL1hsaWIuaD4KLWludAotbWFpbiAoKQotewotWHJtSW5pdGlhbGl6ZSAoKQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIExJQlM9JGFjX3NhdmVfTElCUwotIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCi1hY194X2xpYnJhcmllcz0KLWVsc2UKLSAgTElCUz0kYWNfc2F2ZV9MSUJTCi1mb3IgYWNfZGlyIGluIGAkYXNfZWNobyAiJGFjX3hfaW5jbHVkZXMgJGFjX3hfaGVhZGVyX2RpcnMiIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKLWRvCi0gICMgRG9uJ3QgZXZlbiBhdHRlbXB0IHRoZSBoYWlyIG9mIHRyeWluZyB0byBsaW5rIGFuIFggcHJvZ3JhbSEKLSAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KLSAgICBpZiB0ZXN0IC1yICIkYWNfZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIjsgdGhlbgotICAgICAgYWNfeF9saWJyYXJpZXM9JGFjX2RpcgotICAgICAgYnJlYWsgMgotICAgIGZpCi0gIGRvbmUKLWRvbmUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkgIyAkYWNfeF9saWJyYXJpZXMgPSBubwotCi1jYXNlICRhY194X2luY2x1ZGVzLCRhY194X2xpYnJhcmllcyBpbiAjKAotICBubywqIHwgKixubyB8ICpcJyopCi0gICAgIyBEaWRuJ3QgZmluZCBYLCBvciBhIGRpcmVjdG9yeSBoYXMgIiciIGluIGl0cyBuYW1lLgotICAgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PW5vIjs7ICMoCi0gICopCi0gICAgIyBSZWNvcmQgd2hlcmUgd2UgZm91bmQgWCBmb3IgdGhlIGNhY2hlLgotICAgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllc1wKLQlhY194X2luY2x1ZGVzPSckYWNfeF9pbmNsdWRlcydcCi0JYWNfeF9saWJyYXJpZXM9JyRhY194X2xpYnJhcmllcyciCi1lc2FjCi1maQotOzsgIygKLSAgICAqKSBoYXZlX3g9eWVzOzsKLSAgZXNhYwotICBldmFsICIkYWNfY3ZfaGF2ZV94IgotZmkgIyAkd2l0aF94ICE9IG5vCi0KLWlmIHRlc3QgIiRoYXZlX3giICE9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhdmVfeCIgPiY1Ci0kYXNfZWNobyAiJGhhdmVfeCIgPiY2OyB9Ci0gIG5vX3g9eWVzCi1lbHNlCi0gICMgSWYgZWFjaCBvZiB0aGUgdmFsdWVzIHdhcyBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBvdmVycmlkZXMgZWFjaCBndWVzcy4KLSAgdGVzdCAieCR4X2luY2x1ZGVzIiA9IHhOT05FICYmIHhfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMKLSAgdGVzdCAieCR4X2xpYnJhcmllcyIgPSB4Tk9ORSAmJiB4X2xpYnJhcmllcz0kYWNfeF9saWJyYXJpZXMKLSAgIyBVcGRhdGUgdGhlIGNhY2hlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZXMuCi0gIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllc1wKLQlhY194X2luY2x1ZGVzPSckeF9pbmNsdWRlcydcCi0JYWNfeF9saWJyYXJpZXM9JyR4X2xpYnJhcmllcyciCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjUKLSRhc19lY2hvICJsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjY7IH0KLWZpCi0KLWlmIHRlc3QgIiRub194IiA9IHllczsgdGhlbgotICAjIE5vdCBhbGwgcHJvZ3JhbXMgbWF5IHVzZSB0aGlzIHN5bWJvbCwgYnV0IGl0IGRvZXMgbm90IGh1cnQgdG8gZGVmaW5lIGl0LgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFhfRElTUExBWV9NSVNTSU5HIDEiID4+Y29uZmRlZnMuaAotCi0gIFhfQ0ZMQUdTPSBYX1BSRV9MSUJTPSBYX0xJQlM9IFhfRVhUUkFfTElCUz0KLWVsc2UKLSAgaWYgdGVzdCAtbiAiJHhfaW5jbHVkZXMiOyB0aGVuCi0gICAgWF9DRkxBR1M9IiRYX0NGTEFHUyAtSSR4X2luY2x1ZGVzIgotICBmaQotCi0gICMgSXQgd291bGQgYWxzbyBiZSBuaWNlIHRvIGRvIHRoaXMgZm9yIGFsbCAtTCBvcHRpb25zLCBub3QganVzdCB0aGlzIG9uZS4KLSAgaWYgdGVzdCAtbiAiJHhfbGlicmFyaWVzIjsgdGhlbgotICAgIFhfTElCUz0iJFhfTElCUyAtTCR4X2xpYnJhcmllcyIKLSAgICAjIEZvciBTb2xhcmlzOyBzb21lIHZlcnNpb25zIG9mIFN1biBDQyByZXF1aXJlIGEgc3BhY2UgYWZ0ZXIgLVIgYW5kCi0gICAgIyBvdGhlcnMgcmVxdWlyZSBubyBzcGFjZS4gIFdvcmRzIGFyZSBub3Qgc3VmZmljaWVudCAuIC4gLiAuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZS4uLiAiID4mNjsgfQotICAgIGFjX3hzYXZlX0xJQlM9JExJQlM7IExJQlM9IiRMSUJTIC1SJHhfbGlicmFyaWVzIgotICAgIGFjX3hzYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgICAgICBYX0xJQlM9IiRYX0xJQlMgLVIkeF9saWJyYXJpZXMiCi1lbHNlCi0gIExJQlM9IiRhY194c2F2ZV9MSUJTIC1SICR4X2xpYnJhcmllcyIKLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkgIFhfTElCUz0iJFhfTElCUyAtUiAkeF9saWJyYXJpZXMiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBuZWl0aGVyIHdvcmtzIiA+JjUKLSRhc19lY2hvICJuZWl0aGVyIHdvcmtzIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfeHNhdmVfY193ZXJyb3JfZmxhZwotICAgIExJQlM9JGFjX3hzYXZlX0xJQlMKLSAgZmkKLQotICAjIENoZWNrIGZvciBzeXN0ZW0tZGVwZW5kZW50IGxpYnJhcmllcyBYIHByb2dyYW1zIG11c3QgbGluayB3aXRoLgotICAjIERvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGZvciB0aGUgc3lzdGVtLWluZGVwZW5kZW50IFI2IGxpYnJhcmllcwotICAjICgtbElDRSksIHNpbmNlIHdlIG1heSBuZWVkIC1sc29ja2V0IG9yIHdoYXRldmVyIGZvciBYIGxpbmtpbmcuCi0KLSAgaWYgdGVzdCAiJElTQyIgPSB5ZXM7IHRoZW4KLSAgICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2xfcyAtbGluZXQiCi0gIGVsc2UKLSAgICAjIE1hcnR5biBKb2huc29uIHNheXMgdGhpcyBpcyBuZWVkZWQgZm9yIFVsdHJpeCwgaWYgdGhlIFgKLSAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQgS2FybCBCZXJyeSBzYXlzCi0gICAgIyB0aGUgQWxwaGEgbmVlZHMgZG5ldF9zdHViIChkbmV0IGRvZXMgbm90IGV4aXN0KS4KLSAgICBhY194c2F2ZV9MSUJTPSIkTElCUyI7IExJQlM9IiRMSUJTICRYX0xJQlMgLWxYMTEiCi0gICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhPcGVuRGlzcGxheSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhPcGVuRGlzcGxheSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZG5ldF9kbmV0X250b2ErOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRuZXQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuZXRfbnRvYSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuZXRfbnRvYSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZG5ldF9kbmV0X250b2E9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXQiCi1maQotCi0gICAgaWYgdGVzdCAkYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuZXRfbnRvYSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuZXRfbnRvYSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2E9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbmV0X3N0dWIiCi1maQotCi0gICAgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIExJQlM9IiRhY194c2F2ZV9MSUJTIgotCi0gICAgIyBtc2hAY2lzLnVmbC5lZHUgc2F5cyAtbG5zbCAoYW5kIC1sc29ja2V0KSBhcmUgbmVlZGVkIGZvciBoaXMgMzg2L0FULAotICAgICMgdG8gZ2V0IHRoZSBTeXNWIHRyYW5zcG9ydCBmdW5jdGlvbnMuCi0gICAgIyBDaGFkIFIuIExhcnNvbiBzYXlzIHRoZSBQeXJhbWlzIE1JUy1FUyBydW5uaW5nIERDL09TeCAoU1ZSNCkKLSAgICAjIG5lZWRzIC1sbnNsLgotICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5Ci0gICAgIyBvbiBJcml4IDUuMiwgYWNjb3JkaW5nIHRvIFQuRS4gRGlja2V5LgotICAgICMgVGhlIGZ1bmN0aW9ucyBnZXRob3N0YnluYW1lLCBnZXRzZXJ2YnluYW1lLCBhbmQgaW5ldF9hZGRyIGFyZQotICAgICMgaW4gLWxic2Qgb24gTHlueE9TIDMuMC4xL2kzODYsIGFjY29yZGluZyB0byBMYXJzIEhlY2tpbmcuCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICAKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2wiCi1maQotCi0gICAgICBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxic2QgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGdldGhvc3RieW5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRob3N0YnluYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sYnNkIgotZmkKLQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBsaWVkZXJAc2t5bGVyLm1hdmQuaG9uZXl3ZWxsLmNvbSBzYXlzIHdpdGhvdXQgLWxzb2NrZXQsCi0gICAgIyBzb2NrZXQvc2V0c29ja29wdCBhbmQgb3RoZXIgcm91dGluZXMgYXJlIHVuZGVmaW5lZCB1bmRlciBTQ08gT0RUCi0gICAgIyAyLjAuICBCdXQgLWxzb2NrZXQgaXMgYnJva2VuIG9uIElSSVggNS4yIChhbmQgaXMgbm90IG5lY2Vzc2FyeQotICAgICMgb24gbGF0ZXIgdmVyc2lvbnMpLCBzYXlzIFNpbW9uIExlaW5lbjogaXQgY29udGFpbnMgZ2V0aG9zdGJ5KgotICAgICMgdmFyaWFudHMgdGhhdCBkb24ndCB1c2UgdGhlIG5hbWUgc2VydmVyIChvciBzb21ldGhpbmcpLiAgLWxzb2NrZXQKLSAgICAjIG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4gIFdlIGFzc3VtZSB0aGF0Ci0gICAgIyBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiY29ubmVjdCIgImFjX2N2X2Z1bmNfY29ubmVjdCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19jb25uZWN0IiA9IHh5ZXM7IHRoZW4gOgotICAKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc29ja2V0X2Nvbm5lY3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGNvbm5lY3QgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBjb25uZWN0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTIgotZmkKLQotICAgIGZpCi0KLSAgICAjIEd1aWxsZXJtbyBHb21leiBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAicmVtb3ZlIiAiYWNfY3ZfZnVuY19yZW1vdmUiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcmVtb3ZlIiA9IHh5ZXM7IHRoZW4gOgotICAKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3JlbW92ZSA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXguLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scG9zaXggICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHJlbW92ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHJlbW92ZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcG9zaXhfcmVtb3ZlPXllcwotZWxzZQotICBhY19jdl9saWJfcG9zaXhfcmVtb3ZlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcG9zaXhfcmVtb3ZlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1scG9zaXgiCi1maQotCi0gICAgZmkKLQotICAgICMgQlNESSBCU0QvT1MgMi4xIG5lZWRzIC1saXBjIGZvciBYT3BlbkRpc3BsYXkuCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2htYXQiICJhY19jdl9mdW5jX3NobWF0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NobWF0IiA9IHh5ZXM7IHRoZW4gOgotICAKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfaXBjX3NobWF0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxpcGMgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHNobWF0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2htYXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2lwY19zaG1hdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2lwY19zaG1hdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaXBjX3NobWF0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2lwY19zaG1hdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pcGNfc2htYXQiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGlwYyIKLWZpCi0KLSAgICBmaQotICBmaQotCi0gICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgotICBhY19zYXZlX0xERkxBR1M9JExERkxBR1MKLSAgdGVzdCAtbiAiJHhfbGlicmFyaWVzIiAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCR4X2xpYnJhcmllcyIKLSAgIyBTTSBuZWVkcyBJQ0UgdG8gKGR5bmFtaWNhbGx5KSBsaW5rIHVuZGVyIFN1bk9TIDQueCAoc28gd2UgaGF2ZSB0bwotICAjIGNoZWNrIGZvciBJQ0UgZmlyc3QpLCBidXQgd2UgbXVzdCBsaW5rIGluIHRoZSBvcmRlciAtbFNNIC1sSUNFIG9yCi0gICMgd2UgZ2V0IHVuZGVmaW5lZCBzeW1ib2xzLiAgU28gYXNzdW1lIHdlIGhhdmUgU00gaWYgd2UgaGF2ZSBJQ0UuCi0gICMgVGhlc2UgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBiZWZvcmUgLWxYMTEsIHVubGlrZSB0aGUgb3RoZXIKLSAgIyBsaWJyYXJpZXMgd2UgY2hlY2sgZm9yIGJlbG93LCBzbyB1c2UgYSBkaWZmZXJlbnQgdmFyaWFibGUuCi0gICMgSm9obiBJbnRlcnJhbnRlLCBLYXJsIEJlcnJ5Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxJQ0UgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBJY2VDb25uZWN0aW9uTnVtYmVyICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gSWNlQ29ubmVjdGlvbk51bWJlciAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sU00gLWxJQ0UiCi1maQotCi0gIExERkxBR1M9JGFjX3NhdmVfTERGTEFHUwotCi1maQotCi0KLQotIyBTZWUgaWYgd2UgYXJlIHRvIGJ1aWxkIHgxMXZuYzoKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI7IAotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXgxMXZuYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeDExdm5jK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94MTF2bmM7IAotZmkKLQotCi1pZiB0ZXN0ICEgLXogIiR3aXRoX3gxMXZuYyIgLWEgIiR3aXRoX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCWJ1aWxkX3gxMXZuYz0ieWVzIgotZWxpZiB0ZXN0ICIkUEFDS0FHRV9OQU1FIiA9ICJ4MTF2bmMiOyB0aGVuCi0JYnVpbGRfeDExdm5jPSJ5ZXMiCi1lbHNlCi0JYnVpbGRfeDExdm5jPSJubyIKLWZpCi0JCi0jIHgxMXZuYyBvbmx5OgotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteGtleWJvYXJkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94a2V5Ym9hcmQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hrZXlib2FyZDsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteGluZXJhbWEgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hpbmVyYW1hK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94aW5lcmFtYTsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteHJhbmRyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94cmFuZHIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hyYW5kcjsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteGZpeGVzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94Zml4ZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hmaXhlczsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteGRhbWFnZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGRhbWFnZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGRhbWFnZTsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteHRyYXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3h0cmFwK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94dHJhcDsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteHJlY29yZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeHJlY29yZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeHJlY29yZDsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmJwbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZmJwbStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZmJwbTsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZHBtcyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZHBtcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZHBtczsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtdjRsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF92NGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3Y0bDsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmJkZXYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2ZiZGV2K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9mYmRldjsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtdWlucHV0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF91aW5wdXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3VpbnB1dDsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtbWFjb3N4LW5hdGl2ZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbWFjb3N4X25hdGl2ZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbWFjb3N4X25hdGl2ZTsgCi1maQotCi0KLWZpCi0jIGVuZCB4MTF2bmMgb25seS4KLQotaWYgdGVzdCAieCR3aXRoX3giID0gInhubyI7IHRoZW4KLQlIQVZFX1gxMT0iZmFsc2UiCi1lbGlmIHRlc3QgIiRYX0NGTEFHUyIgIT0gIi1EWF9ESVNQTEFZX01JU1NJTkciOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEdldEltYWdlIGluIC1sWDExIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYR2V0SW1hZ2UgaW4gLWxYMTEuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFgxMSAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYR2V0SW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYR2V0SW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2U9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YMTFfWEdldEltYWdlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YMTFfWEdldEltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWDExX1hHZXRJbWFnZSIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9YMTEgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YMTE9InRydWUiCi1lbHNlCi0gIEhBVkVfWDExPSJmYWxzZSIKLWZpCi0KLQotCSMgeDExdm5jIG9ubHk6Ci0JaWYgdGVzdCAkSEFWRV9YMTEgPSAidHJ1ZSIgLWEgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGV4dCIKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYU2htR2V0SW1hZ2UgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYU2htR2V0SW1hZ2UgaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X1hTaG1HZXRJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYU2htR2V0SW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYU2htR2V0SW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2U9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1hTSE0gMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYUmVhZFNjcmVlbiBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSZWFkU2NyZWVuIGluIC1sWGV4dC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYUmVhZFNjcmVlbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSZWFkU2NyZWVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW4iID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU09MQVJJU19YUkVBRFNDUkVFTiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJYMTEvZXh0ZW5zaW9ucy9yZWFkZGlzcGxheS5oIiAiYWNfY3ZfaGVhZGVyX1gxMV9leHRlbnNpb25zX3JlYWRkaXNwbGF5X2giICIjaW5jbHVkZSA8WDExL1hsaWIuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX1gxMV9leHRlbnNpb25zX3JlYWRkaXNwbGF5X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfSVJJWF9YUkVBRERJU1BMQVkgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCi0JCWlmIHRlc3QgIngkd2l0aF9mYnBtIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRkJQTUZvcmNlTGV2ZWwgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBGQlBNRm9yY2VMZXZlbCBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhleHQgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgRkJQTUZvcmNlTGV2ZWwgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBGQlBNRm9yY2VMZXZlbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWw9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0ZCUE0gMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfZHBtcyIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIERQTVNGb3JjZUxldmVsIGluIC1sWGV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgRFBNU0ZvcmNlTGV2ZWwgaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIERQTVNGb3JjZUxldmVsICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gRFBNU0ZvcmNlTGV2ZWwgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWw9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9EUE1TIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFRlc3RHcmFiQ29udHJvbCBpbiAtbFh0c3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhUZXN0R3JhYkNvbnRyb2wgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFRlc3RHcmFiQ29udHJvbCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhUZXN0R3JhYkNvbnRyb2wgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iLWxYdHN0ICRYX1BSRUxJQlMiCi0JCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1hURVNUR1JBQkNPTlRST0wgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YVEVTVEdSQUJDT05UUk9MPSJ0cnVlIgotZmkKLQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhUZXN0RmFrZUtleUV2ZW50IGluIC1sWHRzdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYdHN0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhUZXN0RmFrZUtleUV2ZW50ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFRlc3RGYWtlS2V5RXZlbnQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSItbFh0c3QgJFhfUFJFTElCUyIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfWFRFU1QgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YVEVTVD0idHJ1ZSIKLWZpCi0KLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJlY29yZCIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgaW4gLWxYdHN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIGluIC1sWHRzdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYdHN0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfUkVDT1JEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJIyB3ZSB1c2UgWFRSQVAgb24gWDExUjUsIG9yIHVzZXIgY2FuIHNldCBYMTFWTkNfVVNFX1hUUkFQCi0JCWlmIHRlc3QgIngkd2l0aF94dHJhcCIgIT0gInhubyI7IHRoZW4KLQkJICAgIGlmIHRlc3QgISAteiAiJFgxMVZOQ19VU0VfWFRSQVAiIC1vIC16ICIkSEFWRV9YVEVTVEdSQUJDT05UUk9MIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhUcmFwIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYRVRyYXBTZXRHcmFiU2VydmVyIGluIC1sWFRyYXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhUcmFwICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYRVRyYXBTZXRHcmFiU2VydmVyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPXllcwotZWxzZQotICBhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhUcmFwIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWFRSQVAgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJCSMgdHJ1NjQgdXNlcyBsaWJYRVRyYXAuc28KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYRVRyYXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYRVRyYXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYRVRyYXAgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPXllcwotZWxzZQotICBhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYRVRyYXAiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYVFJBUCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkgICAgZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGtleWJvYXJkIiAhPSAieG5vIjsgdGhlbgotCQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJFhfQ0ZMQUdTIgotCQkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIlgxMS9YS0JsaWIuaCIgImFjX2N2X2hlYWRlcl9YMTFfWEtCbGliX2giICIjaW5jbHVkZSA8WDExL1hsaWIuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX1gxMV9YS0JsaWJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9YS0JMSUJfSD0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9YS0JMSUJfSD0iZmFsc2UiCi1maQotCi0KLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlpZiB0ZXN0ICRIQVZFX1hLQkxJQl9IID0gInRydWUiOyB0aGVuCi0JCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWGtiU2VsZWN0RXZlbnRzIGluIC1sWDExIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYa2JTZWxlY3RFdmVudHMgaW4gLWxYMTEuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFgxMSAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYa2JTZWxlY3RFdmVudHMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYa2JTZWxlY3RFdmVudHMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9YS0VZQk9BUkQgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJCWZpCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hpbmVyYW1hIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWGluZXJhbWFRdWVyeVNjcmVlbnMgaW4gLWxYaW5lcmFtYSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWGluZXJhbWFRdWVyeVNjcmVlbnMgaW4gLWxYaW5lcmFtYS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhpbmVyYW1hICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhpbmVyYW1hUXVlcnlTY3JlZW5zICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWGluZXJhbWFRdWVyeVNjcmVlbnMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zPXllcwotZWxzZQotICBhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYaW5lcmFtYSIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhJTkVSQU1BIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hyYW5kciIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSUlNlbGVjdElucHV0IGluIC1sWHJhbmRyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYUlJTZWxlY3RJbnB1dCBpbiAtbFhyYW5kci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYcmFuZHIgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFJSU2VsZWN0SW5wdXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYUlJTZWxlY3RJbnB1dCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0PXllcwotZWxzZQotICBhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hyYW5kcl9YUlJTZWxlY3RJbnB1dCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWHJhbmRyIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWFJBTkRSIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWFJBTkRSPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94Zml4ZXMiICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYRml4ZXNHZXRDdXJzb3JJbWFnZSBpbiAtbFhmaXhlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgaW4gLWxYZml4ZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGZpeGVzICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhGaXhlc0dldEN1cnNvckltYWdlICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZml4ZXNfWEZpeGVzR2V0Q3Vyc29ySW1hZ2UiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhmaXhlcyIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhGSVhFUyAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlhGSVhFUz0idHJ1ZSIKLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGRhbWFnZSIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hkYW1hZ2VfWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZGFtYWdlICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb249eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhkYW1hZ2UiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYREFNQUdFIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWERBTUFHRT0idHJ1ZSIKLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICEgLXogIiRIQVZFX0xJQlhGSVhFUyIgLW8gISAteiAiJEhBVkVfTElCWERBTUFHRSI7IHRoZW4KLQkJCSMgbmVlZCAvdXNyL3Nmdy9saWIgaW4gUlBBVEggZm9yIFNvbGFyaXMgMTAgYW5kIGxhdGVyCi0JCQljYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLQkJCSJTdW5PUyA1IiopIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtUi91c3Ivc2Z3L2xpYiIgOzsKLQkJCWVzYWMKLQkJZmkKLQkJaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJYUkFORFIiOyB0aGVuCi0JCQkjIGFsc28gbmVlZCAvdXNyL1gxMS9pbmNsdWRlIGZvciBTb2xhcmlzIDEwIDEwLzA4IGFuZCBsYXRlcgotCQkJY2FzZSBgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIGluCi0JCQkiU3VuT1MgNSIqKSBDUFBGTEFHUz0iJENQUEZMQUdTIC1JL3Vzci9YMTEvaW5jbHVkZSIgOzsKLQkJCWVzYWMKLQkJZmkKLQotCQlYX0xJQlM9IiRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTIgotCWZpCi0JIyBlbmQgeDExdm5jIG9ubHkuCi1maQotCi0KLSBpZiB0ZXN0ICRIQVZFX1gxMSAhPSAiZmFsc2UiOyB0aGVuCi0gIEhBVkVfWDExX1RSVUU9Ci0gIEhBVkVfWDExX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX1gxMV9UUlVFPScjJwotICBIQVZFX1gxMV9GQUxTRT0KLWZpCi0KLQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQotaWYgdGVzdCAieCRIQVZFX1gxMSIgPSAieGZhbHNlIiAtYSAieCR3aXRoX3giICE9ICJ4bm8iOyB0aGVuCi0JYXNfZm5fZXJyb3IgJD8gIgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBBIHdvcmtpbmcgWCB3aW5kb3cgc3lzdGVtIGJ1aWxkIGVudmlyb25tZW50IGlzIHJlcXVpcmVkIHRvIGJ1aWxkICoqKgoteDExdm5jLiAgTWFrZSBzdXJlIGFueSByZXF1aXJlZCBYIGRldmVsb3BtZW50IHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQuCi1JZiB0aGV5IGFyZSBpbnN0YWxsZWQgaW4gbm9uLXN0YW5kYXJkIGxvY2F0aW9ucywgb25lIGNhbiB1c2UgdGhlCi0tLXgtaW5jbHVkZXM9RElSIGFuZCAtLXgtbGlicmFyaWVzPURJUiBjb25maWd1cmUgb3B0aW9ucyBvciBzZXQgdGhlCi1DUFBGTEFHUyBhbmQgTERGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIFgKLXdpbmRvdyBzeXN0ZW0gaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMgbWF5IGJlIGZvdW5kLiAgT24gNjQrMzIgYml0Ci1tYWNoaW5lcyB5b3UgbWF5IG5lZWQgdG8gcG9pbnQgdG8gbGliNjQgb3IgbGliMzIgZGlyZWN0b3JpZXMgdG8gcGljayB1cAotdGhlIGNvcnJlY3Qgd29yZCBzaXplLgotCi1JZiB5b3Ugd2FudCB0byBidWlsZCB4MTF2bmMgd2l0aG91dCBYIHN1cHBvcnQgKGUuZy4gZm9yIC1yYXdmYiB1c2Ugb25seQotb3IgZm9yIG5hdGl2ZSBNYWMgT1MgWCksIHNwZWNpZnkgdGhlIC0td2l0aG91dC14IGNvbmZpZ3VyZSBvcHRpb24uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiAiJExJTkVOTyIgNQotZmkKLQotaWYgdGVzdCAieCRIQVZFX1gxMSIgPSAieHRydWUiIC1hICJ4JEhBVkVfWFRFU1QiICE9ICJ4dHJ1ZSI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBBIHdvcmtpbmcgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBYVEVTVCBleHRlbnNpb24gd2FzIG5vdCBmb3VuZCAqKioKLShsaWJYdHN0KS4gIEFuIHgxMXZuYyBidWlsdCB0aGlzIHdheSB3aWxsIGJlICpPTkxZIEJBUkVMWSBVU0FCTEUqLgotWW91IHdpbGwgYmUgYWJsZSB0byBtb3ZlIHRoZSBtb3VzZSBidXQgbm90IGNsaWNrIG9yIHR5cGUuICBUaGVyZSBjYW4KLWFsc28gYmUgZGVhZGxvY2tzIGlmIGFuIGFwcGxpY2F0aW9uIGdyYWJzIHRoZSBYIHNlcnZlci4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzCi1mb3IgWFRFU1QgKHBlcmhhcHMgaXQgaXMgbmFtZWQgc29tZXRoaW5nIGxpa2UgbGlieHRzdC1kZXYpIGFuZCBydW4KLWNvbmZpZ3VyZSBhZ2Fpbi4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIFhURVNUIGV4dGVuc2lvbiB3YXMgbm90IGZvdW5kICoqKgotKGxpYlh0c3QpLiAgQW4geDExdm5jIGJ1aWx0IHRoaXMgd2F5IHdpbGwgYmUgKk9OTFkgQkFSRUxZIFVTQUJMRSouCi1Zb3Ugd2lsbCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlIGJ1dCBub3QgY2xpY2sgb3IgdHlwZS4gIFRoZXJlIGNhbgotYWxzbyBiZSBkZWFkbG9ja3MgaWYgYW4gYXBwbGljYXRpb24gZ3JhYnMgdGhlIFggc2VydmVyLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMKLWZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgotY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQlzbGVlcCA1Ci1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfdjRsIiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC92aWRlb2Rldi5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3ZpZGVvZGV2X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X3ZpZGVvZGV2X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfVklERU9ERVZfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi1maQotaWYgdGVzdCAieCR3aXRoX2ZiZGV2IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9mYi5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2ZiX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2ZiX2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfRkJfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi1maQotaWYgdGVzdCAieCR3aXRoX3VpbnB1dCIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvaW5wdXQuaCIgImFjX2N2X2hlYWRlcl9saW51eF9pbnB1dF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9pbnB1dF9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJTlVYX0lOUFVUX0ggMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSU5VWF9JTlBVVF9IPSJ0cnVlIgotZmkKLQotCi0JaWYgdGVzdCAieCRIQVZFX0xJTlVYX0lOUFVUX0giID0gInh0cnVlIjsgdGhlbgotCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibGludXgvdWlucHV0LmgiICJhY19jdl9oZWFkZXJfbGludXhfdWlucHV0X2giICIjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X3VpbnB1dF9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJTlVYX1VJTlBVVF9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLQlmaQotZmkKLQotaWYgdGVzdCAieCR3aXRoX21hY29zeF9uYXRpdmUiICE9ICJ4bm8iOyB0aGVuCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9NQUNPU1hfTkFUSVZFX0RJU1BMQVkgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLSMgQ2hlY2sgZm9yIE9TIFggb3BlbmdsIGhlYWRlcgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIk9wZW5HTC9PcGVuR0wuaCIgImFjX2N2X2hlYWRlcl9PcGVuR0xfT3BlbkdMX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX09wZW5HTF9PcGVuR0xfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9NQUNPU1hfT1BFTkdMX0ggMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9NQUNPU1hfT1BFTkdMX0g9InRydWUiCi1maQotCi0KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtYXZhaGkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2F2YWhpK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9hdmFoaTsgCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfYXZhaGkiICE9ICJ4bm8iOyB0aGVuCi0JcHJpbnRmICJjaGVja2luZyBmb3IgYXZhaGkuLi4gIgotCWlmIHRlc3QgISAteiAiJHdpdGhfYXZhaGkiIC1hICJ4JHdpdGhfYXZhaGkiICE9ICJ4eWVzIjsgdGhlbgotCQlBVkFISV9DRkxBR1M9Ii1JJHdpdGhfYXZhaGkvaW5jbHVkZSIKLQkJQVZBSElfTElCUz0iLUwkd2l0aF9hdmFoaS9saWIgLWxhdmFoaS1jb21tb24gLWxhdmFoaS1jbGllbnQiCi0JCWVjaG8gInVzaW5nICR3aXRoX2F2YWhpIgotCQl3aXRoX2F2YWhpPXllcwotCWVsaWYgcGtnLWNvbmZpZyAtLWF0bGVhc3QtdmVyc2lvbj0wLjYuNCBhdmFoaS1jbGllbnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUFWQUhJX0NGTEFHUz1gcGtnLWNvbmZpZyAtLWNmbGFncyBhdmFoaS1jbGllbnRgCi0JCUFWQUhJX0xJQlM9YHBrZy1jb25maWcgLS1saWJzIGF2YWhpLWNsaWVudGAKLQkJd2l0aF9hdmFoaT15ZXMKLQkJZWNobyB5ZXMKLQllbHNlCi0JCXdpdGhfYXZhaGk9bm8KLQkJZWNobyBubwotCWZpCi1maQotaWYgdGVzdCAieCR3aXRoX2F2YWhpIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfQVZBSEkgMSIgPj5jb25mZGVmcy5oCi0KLQkKLQkKLWZpCi0KLWZpCi0jIGVuZCB4MTF2bmMgb25seS4KLQotIyBvbmx5IHVzZWQgaW4geDExdm5jL01ha2VmaWxlLmFtIGJ1dCBuZWVkcyB0byBhbHdheXMgYmUgZGVmaW5lZDoKLSBpZiB0ZXN0ICIkSEFWRV9NQUNPU1hfT1BFTkdMX0giID0gInRydWUiOyB0aGVuCi0gIE9TWF9PUEVOR0xfVFJVRT0KLSAgT1NYX09QRU5HTF9GQUxTRT0nIycKLWVsc2UKLSAgT1NYX09QRU5HTF9UUlVFPScjJwotICBPU1hfT1BFTkdMX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrcyBmb3IgbGlicmFyaWVzLgotCi1pZiB0ZXN0ICEgLXogIiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiIC1hICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInhubyI7IHRoZW4KLQlwcmludGYgImNoZWNraW5nIGZvciBzeXN0ZW0gbGlidm5jc2VydmVyLi4uICIKLQl2bmVlZD0iMC45LjEiCi0JaWYgdGVzdCAiWCRWTkVFRCIgIT0gIlgiOyB0aGVuCi0JCXZuZWVkPSRWTkVFRAotCWZpCi0JaWYgdGVzdCAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiICE9ICJ4eWVzIjsgdGhlbgotCQlyZmxhZz0iIgotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCXJmbGFnPSItWGxpbmtlciAtUiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliIgotCQllbHNlCi0JCQlyZmxhZz0iLVIkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2xpYiIKLQkJZmkKLQkJY21kPSIkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2Jpbi9saWJ2bmNzZXJ2ZXItY29uZmlnIgotCQlpZiAkY21kIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQljdmVycz1gJGNtZCAtLXZlcnNpb24gMj4vZGV2L251bGxgCi0JCQljc2NvcmU9YGVjaG8gIiRjdmVycyIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQkJCW5zY29yZT1gZWNobyAiJHZuZWVkIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCi0JCQlpZiB0ZXN0ICRjc2NvcmUgLWx0ICRuc2NvcmU7IHRoZW4KLQkJCQllY2hvICJubyIKLQkJCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9bm8KLQkJCQlhc19mbl9lcnJvciAkPyAiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5lZWQgbGlidm5jc2VydmVyIHZlcnNpb24gJHZuZWVkLCBoYXZlIHZlcnNpb24gJGN2ZXJzICoqKgotWW91IGFyZSBidWlsZGluZyB3aXRoIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgYW5kIGl0IGlzIG5vdAotbmV3IGVub3VnaC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iICIkTElORU5PIiA1Ci0JCQllbHNlCi0JCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1M9Ii1JJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9pbmNsdWRlIgotCQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUz0iLUwkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2xpYiAkcmZsYWcgLWx2bmNzZXJ2ZXIgLWx2bmNjbGllbnQiCi0JCQkJZWNobyAidXNpbmcgJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIKLQkJCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9eWVzCi0JCQlmaQotCQllbHNlCi0JCQllY2hvICIgKioqIGNhbm5vdCBydW4gJGNtZCAqKiogIiAxPiYyCi0JCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9bm8KLQkJCWVjaG8gbm8KLQkJZmkKLQllbGlmIGxpYnZuY3NlcnZlci1jb25maWcgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJcmZsYWc9IiIKLQkJcnByZWZpeD1gbGlidm5jc2VydmVyLWNvbmZpZyAtLXByZWZpeGAKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQlyZmxhZz0iIC1YbGlua2VyIC1SJHJwcmVmaXgvbGliICIKLQkJZWxzZQotCQkJcmZsYWc9IiAtUiRycHJlZml4L2xpYiAiCi0JCWZpCi0JCWN2ZXJzPWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKLQkJY3Njb3JlPWBlY2hvICIkY3ZlcnMiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0JCW5zY29yZT1gZWNobyAiJHZuZWVkIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCi0JCWlmIHRlc3QgJGNzY29yZSAtbHQgJG5zY29yZTsgdGhlbgotCQkJZWNobyAibm8iCi0JCQkJYXNfZm5fZXJyb3IgJD8gIgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBOZWVkIGxpYnZuY3NlcnZlciB2ZXJzaW9uICR2bmVlZCwgaGF2ZSB2ZXJzaW9uICRjdmVycyAqKioKLVlvdSBhcmUgYnVpbGRpbmcgd2l0aCBhIHN5c3RlbSBpbnN0YWxsZWQgbGlidm5jc2VydmVyIGFuZCBpdCBpcyBub3QKLW5ldyBlbm91Z2guCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiAiJExJTkVOTyIgNQotCQllbHNlCi0JCQlTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUz1gbGlidm5jc2VydmVyLWNvbmZpZyAtLWNmbGFnc2AKLQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUz0iJHJmbGFnImBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tbGlic2AKLQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj15ZXMKLQkJCWVjaG8geWVzCi0JCWZpCi0JZWxzZQotCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9bm8KLQkJZWNobyBubwotCWZpCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgPSAieHllcyI7IHRoZW4KLQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVIgMSIgPj5jb25mZGVmcy5oCi0KLQkKLQkKLWZpCi0gaWYgdGVzdCAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiID0gInh5ZXMiOyB0aGVuCi0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFPQotICBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFPScjJwotICBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0U9Ci1maQotCi0KLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWpwZWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2pwZWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2pwZWc7IAotZmkKLQotCi0jIEF0IHRoaXMgcG9pbnQ6Ci0jCW5vIGpwZWcgb24gY29tbWFuZCBsaW5lICAgd2l0aF9qcGVnPSIiCi0jCS13aXRoLWpwZWcgICAgICAgICAgICAgICAgd2l0aF9qcGVnPSJ5ZXMiCi0jCS13aXRob3V0LWpwZWcgICAgICAgICAgICAgd2l0aF9qcGVnPSJubyIKLSMJLXdpdGgtanBlZz0vZm9vL2RpciAgICAgICB3aXRoX2pwZWc9Ii9mb28vZGlyIgotCi1IQVZFX0xJQkpQRUdfVFVSQk89ImZhbHNlIgotCi1pZiB0ZXN0ICJ4JHdpdGhfanBlZyIgIT0gInhubyI7IHRoZW4KLQkKLQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCXNhdmVkX0xJQlM9IiRMSUJTIgotCWlmIHRlc3QgISAteiAiJHdpdGhfanBlZyIgLWEgIngkd2l0aF9qcGVnIiAhPSAieHllcyI7IHRoZW4KLQkJIyBhZGQgdXNlciBzdXBwbGllZCBkaXJlY3RvcnkgdG8gZmxhZ3M6Ci0JCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aF9qcGVnL2luY2x1ZGUiCi0JCUxERkxBR1M9IiRMREZMQUdTIC1MJHdpdGhfanBlZy9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJIyB0aGlzIGlzIG5vdCBjb21wbGV0ZS4uLiBpbiBnZW5lcmFsIGEgcmF0J3MgbmVzdC4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfanBlZy9saWIiCi0JCWVsc2UKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHdpdGhfanBlZy9saWIiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICJ4JEpQRUdfTERGTEFHUyIgIT0gIngiOyB0aGVuCi0JCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCQlMSUJTPSIkTElCUyAkSlBFR19MREZMQUdTIgotCWVsc2UKLQkJTElCUz0iLWxqcGVnIgotCWZpCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImpwZWdsaWIuaCIgImFjX2N2X2hlYWRlcl9qcGVnbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2pwZWdsaWJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9KUEVHTElCX0g9InRydWUiCi1maQotCi0KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBqcGVnX0NyZWF0ZUNvbXByZXNzIGluIGxpYmpwZWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGpwZWdfQ3JlYXRlQ29tcHJlc3MgaW4gbGlianBlZy4uLiAiID4mNjsgfQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giID0gInh0cnVlIjsgdGhlbgotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIganBlZ19DcmVhdGVDb21wcmVzcyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGpwZWdfQ3JlYXRlQ29tcHJlc3MgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH07Ci0JCQkJCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQkpQRUcgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9OyBIQVZFX0pQRUdMSUJfSD0iIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0JZmkKLQlpZiB0ZXN0ICJ4JEhBVkVfSlBFR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQkjIHJlc3RvcmUgb2xkIGZsYWdzIG9uIGZhaWx1cmU6Ci0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCQlMSUJTPSIkc2F2ZWRfTElCUyIKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlianBlZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLWpwZWc9RElSIHRvCi1pbmRpY2F0ZSB0aGUgaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvanBlZ2xpYi5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJqcGVnLmEuICBZb3UgY2FuIGFsc28gc2V0IHRoZSBKUEVHX0xERkxBR1MgdmFyaWFibGUgdG8KLXNwZWNpZnkgbW9yZSBkZXRhaWxlZCBsaW5rZXIgZmxhZ3MuICBBIGNvcHkgb2YgbGlianBlZy10dXJibyBtYXkgYmUKLW9idGFpbmVkIGZyb206ICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJqcGVnLXR1cmJvL2ZpbGVzLwotQSBjb3B5IG9mIGxpYmpwZWcgbWF5IGJlIG9idGFpbmVkIGZyb206ICBodHRwOi8vaWpnLm9yZy9maWxlcy8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlianBlZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLWpwZWc9RElSIHRvCi1pbmRpY2F0ZSB0aGUgaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvanBlZ2xpYi5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJqcGVnLmEuICBZb3UgY2FuIGFsc28gc2V0IHRoZSBKUEVHX0xERkxBR1MgdmFyaWFibGUgdG8KLXNwZWNpZnkgbW9yZSBkZXRhaWxlZCBsaW5rZXIgZmxhZ3MuICBBIGNvcHkgb2YgbGlianBlZy10dXJibyBtYXkgYmUKLW9idGFpbmVkIGZyb206ICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJqcGVnLXR1cmJvL2ZpbGVzLwotQSBjb3B5IG9mIGxpYmpwZWcgbWF5IGJlIG9idGFpbmVkIGZyb206ICBodHRwOi8vaWpnLm9yZy9maWxlcy8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfSlBFR0xJQl9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEpQRUcgbGlicmFyeSBpcyBsaWJqcGVnLXR1cmJvIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgSlBFRyBsaWJyYXJ5IGlzIGxpYmpwZWctdHVyYm8uLi4gIiA+JjY7IH0KLQkJCi0JCWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAieHllcyI7IHRoZW4KLQkJCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQkJCQkjaW5jbHVkZSA8anBlZ2xpYi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0JCQkJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JCQkJY2luZm8uZXJyPWpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLQkJCQlqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotCQkJCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwotCQkJCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfRVhUX1JHQjsKLQkJCQlqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCQkJCXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotCQkKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIEhBVkVfTElCSlBFR19UVVJCTz0idHJ1ZSI7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQkJZWxzZQotCQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JCQkJI2luY2x1ZGUgPGpwZWdsaWIuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotCQkJCXN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotCQkJCWNpbmZvLmVycj1qcGVnX3N0ZF9lcnJvcigmamVycik7Ci0JCQkJanBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLQkJCQljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKLQkJCQlqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotCQkJCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0VYVF9SR0I7Ci0JCQkJanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKLQkJCQlyZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLQkJCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgSEFWRV9MSUJKUEVHX1RVUkJPPSJ0cnVlIjsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJZmkKLQlmaQotCi0JaWYgdGVzdCAieCRIQVZFX0pQRUdMSUJfSCIgPSAieHRydWUiIC1hICJ4JEhBVkVfTElCSlBFR19UVVJCTyIgIT0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlianBlZyBsaWJyYXJ5IHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBpcyBub3QgbGlianBlZy10dXJiby4KLVBlcmZvcm1hbmNlIHdpbGwgYmUgcmVkdWNlZC4gIFlvdSBjYW4gb2J0YWluIGxpYmpwZWctdHVyYm8gZnJvbToKLWh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvICoqKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYmpwZWcgbGlicmFyeSB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgaXMgbm90IGxpYmpwZWctdHVyYm8uCi1QZXJmb3JtYW5jZSB3aWxsIGJlIHJlZHVjZWQuICBZb3UgY2FuIG9idGFpbiBsaWJqcGVnLXR1cmJvIGZyb206Ci1odHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJqcGVnLXR1cmJvL2ZpbGVzLyAqKioKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0gIGZpCi0KLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1wbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BuZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfcG5nOyAKLWZpCi0KLQotIyBBdCB0aGlzIHBvaW50OgotIwlubyBwbmcgb24gY29tbWFuZCBsaW5lICAgIHdpdGhfcG5nPSIiCi0jCS13aXRoLXBuZyAgICAgICAgICAgICAgICAgd2l0aF9wbmc9InllcyIKLSMJLXdpdGhvdXQtcG5nICAgICAgICAgICAgICB3aXRoX3BuZz0ibm8iCi0jCS13aXRoLXBuZz0vZm9vL2RpciAgICAgICAgd2l0aF9wbmc9Ii9mb28vZGlyIgotCi1pZiB0ZXN0ICJ4JHdpdGhfcG5nIiAhPSAieG5vIjsgdGhlbgotCWlmIHRlc3QgISAteiAiJHdpdGhfcG5nIiAtYSAieCR3aXRoX3BuZyIgIT0gInh5ZXMiOyB0aGVuCi0JCSMgYWRkIHVzZXIgc3VwcGxpZWQgZGlyZWN0b3J5IHRvIGZsYWdzOgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3BuZy9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3BuZy9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJIyB0aGlzIGlzIG5vdCBjb21wbGV0ZS4uLiBpbiBnZW5lcmFsIGEgcmF0J3MgbmVzdC4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfcG5nL2xpYiIKLQkJZWxzZQotCQkJTERGTEFHUz0iJExERkxBR1MgLVIkd2l0aF9wbmcvbGliIgotCQlmaQotCWZpCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInBuZy5oIiAiYWNfY3ZfaGVhZGVyX3BuZ19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wbmdfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9QTkdMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9QTkdMSUJfSCIgPSAieHRydWUiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IGluIC1scG5nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCBpbiAtbHBuZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwbmcgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJQTkcgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwbmcgJExJQlMiCi0KLWVsc2UKLSAgSEFWRV9QTkdMSUJfSD0iIgotZmkKLQotCWZpCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9wbmciIC1hICJ4JHdpdGhfcG5nIiAhPSAieHllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQkjIHJlc3RvcmUgb2xkIGZsYWdzIG9uIGZhaWx1cmU6Ci0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JCWlmIHRlc3QgIngkSEFWRV9QTkdMSUJfSCIgIT0gInh0cnVlIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnBuZyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnBuZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLXBuZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9wbmcuaCBhbmQgdGhlIGxpYnJhcnkKLWluIERJUi9saWIvbGlicG5nLmEuICBBIGNvcHkgb2YgbGlicG5nIG1heSBiZSBvYnRhaW5lZCBmcm9tOgotaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJwbmcgY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJwbmcgaXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24gdXNlIC0td2l0aC1wbmc9RElSIHRvCi1pbmRpY2F0ZSB0aGUgaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvcG5nLmggYW5kIHRoZSBsaWJyYXJ5Ci1pbiBESVIvbGliL2xpYnBuZy5hLiAgQSBjb3B5IG9mIGxpYnBuZyBtYXkgYmUgb2J0YWluZWQgZnJvbToKLWh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2xpYnBuZy5odG1sCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCQkJc2xlZXAgNQotCQlmaQotCWZpCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlieiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGlieitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbGliejsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtemxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfemxpYitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfemxpYjsgCi1maQotCi0KLWlmIHRlc3QgIngkd2l0aF96bGliIiAhPSAieG5vIiAtYSAieCR3aXRoX2xpYnoiICE9ICJ4bm8iOyB0aGVuCi0JaWYgdGVzdCAhIC16ICIkd2l0aF96bGliIiAtYSAieCR3aXRoX3psaWIiICE9ICJ4eWVzIjsgdGhlbgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3psaWIvaW5jbHVkZSIKLQkJTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aF96bGliL2xpYiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtWGxpbmtlciAtUiR3aXRoX3psaWIvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3psaWIvbGliIgotCQlmaQotCWZpCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInpsaWIuaCIgImFjX2N2X2hlYWRlcl96bGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3psaWJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9aTElCX0g9InRydWUiCi1maQotCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfWkxJQl9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHoiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRlZmxhdGUgaW4gLWx6Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl96X2RlZmxhdGUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHogICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRlZmxhdGUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkZWZsYXRlICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl96X2RlZmxhdGU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl96X2RlZmxhdGU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl96X2RlZmxhdGUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfel9kZWZsYXRlIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfTElCWiAxCi1fQUNFT0YKLQotICBMSUJTPSItbHogJExJQlMiCi0KLWVsc2UKLSAgSEFWRV9aTElCX0g9IiIKLWZpCi0KLQlmaQotCWlmIHRlc3QgISAteiAiJHdpdGhfemxpYiIgLWEgIngkd2l0aF96bGliIiAhPSAieHllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX1pMSUJfSCIgIT0gInh0cnVlIjsgdGhlbgotCQkJQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKLQkJCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCQlmaQotCWZpCi0JaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfWkxJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlieiBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnogaXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24gdXNlIC0td2l0aC16bGliPURJUiB0byBpbmRpY2F0ZSB0aGUKLWhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3psaWIuaCBhbmQgdGhlIGxpYnJhcnkgaW4gRElSL2xpYi9saWJ6LmEuCi1BIGNvcHkgb2YgbGlieiBtYXkgYmUgb2J0YWluZWQgZnJvbTogaHR0cDovL3d3dy5nemlwLm9yZy96bGliLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnogY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJ6IGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtemxpYj1ESVIgdG8gaW5kaWNhdGUgdGhlCi1oZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS96bGliLmggYW5kIHRoZSBsaWJyYXJ5IGluIERJUi9saWIvbGliei5hLgotQSBjb3B5IG9mIGxpYnogbWF5IGJlIG9idGFpbmVkIGZyb206IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0JZmkKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1wdGhyZWFkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9wdGhyZWFkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wdGhyZWFkOyAKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3B0aHJlYWQiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInB0aHJlYWQuaCIgImFjX2N2X2hlYWRlcl9wdGhyZWFkX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3B0aHJlYWRfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9QVEhSRUFEX0g9InRydWUiCi1maQotCi0KLQlpZiB0ZXN0ICEgLXogIiRIQVZFX1BUSFJFQURfSCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIGluIC1scHRocmVhZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIGluIC1scHRocmVhZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2srOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHB0aHJlYWQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHB0aHJlYWRfbXV0ZXhfbG9jayAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1scHRocmVhZCAkTElCUyIKLQotZmkKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jays6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scHRocmVhZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9MSUJQVEhSRUFEPSJ0cnVlIgotZmkKLQotCWZpCi1maQotIGlmIHRlc3QgISAteiAiJEhBVkVfTElCUFRIUkVBRCI7IHRoZW4KLSAgSEFWRV9MSUJQVEhSRUFEX1RSVUU9Ci0gIEhBVkVfTElCUFRIUkVBRF9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJQVEhSRUFEX1RSVUU9JyMnCi0gIEhBVkVfTElCUFRIUkVBRF9GQUxTRT0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX190aHJlYWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9fdGhyZWFkLi4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotc3RhdGljIF9fdGhyZWFkIGludCBwID0gMAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9UTFMgMSIgPj5jb25mZGVmcy5oCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyB0aWdodHZuYy1maWxldHJhbnNmZXIgaW1wbGVtZW50ZWQgdXNpbmcgdGhyZWFkczoKLWlmIHRlc3QgLXogIiRIQVZFX0xJQlBUSFJFQUQiOyB0aGVuCi0Jd2l0aF90aWdodHZuY19maWxldHJhbnNmZXI9IiIKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEiID4+Y29uZmRlZnMuaAotCi1maQotIGlmIHRlc3QgIiR3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlciIgPSAieWVzIjsgdGhlbgotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFPQotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRT0nIycKLSAgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0U9Ci1maQotCi0KLSMgd2Vic29ja2V0cyBpbXBsZW1lbnRlZCB1c2luZyBiYXNlNjQgZnJvbSByZXNvbHZlCi1pZiB0ZXN0ICJ4JEhBVkVfQjY0IiAhPSAieHRydWUiOyB0aGVuCi0Jd2l0aF93ZWJzb2NrZXRzPSIiCi1maQotaWYgdGVzdCAieCR3aXRoX3dlYnNvY2tldHMiID0gInh5ZXMiOyB0aGVuCi0JTElCUz0iJExJQlMgLWxyZXNvbHYgJFNTTF9MSUJTIgotCSRhc19lY2hvICJAJTpAZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLSBpZiB0ZXN0ICIkd2l0aF93ZWJzb2NrZXRzIiA9ICJ5ZXMiOyB0aGVuCi0gIFdJVEhfV0VCU09DS0VUU19UUlVFPQotICBXSVRIX1dFQlNPQ0tFVFNfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfV0VCU09DS0VUU19UUlVFPScjJwotICBXSVRIX1dFQlNPQ0tFVFNfRkFMU0U9Ci1maQotCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX1pMSUJfSCI7IHRoZW4KLSAgSEFWRV9MSUJaX1RSVUU9Ci0gIEhBVkVfTElCWl9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJaX1RSVUU9JyMnCi0gIEhBVkVfTElCWl9GQUxTRT0KLWZpCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX0pQRUdMSUJfSCI7IHRoZW4KLSAgSEFWRV9MSUJKUEVHX1RSVUU9Ci0gIEhBVkVfTElCSlBFR19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJKUEVHX1RSVUU9JyMnCi0gIEhBVkVfTElCSlBFR19GQUxTRT0KLWZpCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX1BOR0xJQl9IIjsgdGhlbgotICBIQVZFX0xJQlBOR19UUlVFPQotICBIQVZFX0xJQlBOR19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJQTkdfVFJVRT0nIycKLSAgSEFWRV9MSUJQTkdfRkFMU0U9Ci1maQotCi0KLQotU0RMQ09ORklHPSJzZGwtY29uZmlnIgotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXNkbC1jb25maWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NkbF9jb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NkbF9jb25maWc7IAotICAgIGlmIHRlc3QgIiR3aXRodmFsIiAhPSAieWVzIiAtYSAiJHdpdGh2YWwiICE9ICIiOyB0aGVuCi0gICAgICAgIFNETENPTkZJRz0kd2l0aHZhbAotICAgIGZpCi0KLWZpCi0KLQotaWYgdGVzdCAteiAiJHdpdGhfc2RsIjsgdGhlbgotCWlmICRTRExDT05GSUcgLS12ZXJzaW9uID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQl3aXRoX3NkbD15ZXMKLQkJU0RMX0NGTEFHUz1gJFNETENPTkZJRyAtLWNmbGFnc2AKLQkJU0RMX0xJQlM9YCRTRExDT05GSUcgLS1saWJzYAotCWVsc2UKLQkJd2l0aF9zZGw9bm8KLQlmaQotZmkKLSBpZiB0ZXN0ICJ4JHdpdGhfc2RsIiA9ICJ4eWVzIjsgdGhlbgotICBIQVZFX0xJQlNETF9UUlVFPQotICBIQVZFX0xJQlNETF9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJTRExfVFJVRT0nIycKLSAgSEFWRV9MSUJTRExfRkFMU0U9Ci1maQotCi0KLQotCi0KLSMgQ2hlY2sgZm9yIEdUSysuIGlmIHByZXNlbnQsIGJ1aWxkIHRoZSBHVEsrIHZuYyB2aWV3ZXIgZXhhbXBsZQotUEtHX0NIRUNLX01PRFVMRVMoR1RLLCBndGsrLTIuMCwsOikKLSBpZiB0ZXN0ICEgLXogIiRHVEtfTElCUyI7IHRoZW4KLSAgSEFWRV9MSUJHVEtfVFJVRT0KLSAgSEFWRV9MSUJHVEtfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTElCR1RLX1RSVUU9JyMnCi0gIEhBVkVfTElCR1RLX0ZBTFNFPQotZmkKLQotCi0KLU1JTkdXPWBlY2hvICRob3N0X29zIHwgZ3JlcCBtaW5ndzMyICAyPi9kZXYvbnVsbGAKLSBpZiB0ZXN0ICEgLXogIiRNSU5HVyIgOyB0aGVuCi0gIE1JTkdXX1RSVUU9Ci0gIE1JTkdXX0ZBTFNFPScjJwotZWxzZQotICBNSU5HV19UUlVFPScjJwotICBNSU5HV19GQUxTRT0KLWZpCi0KLWlmIHRlc3QgISAteiAiJE1JTkdXIjsgdGhlbgotCVdTT0NLTElCPSItbHdzMl8zMiIKLQlMREZMQUdTPSIkTERGTEFHUyAtbm8tdW5kZWZpbmVkIgotZmkKLQotCi0jIENoZWNrIGZvciBsaWJnY3J5cHQKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdjcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ2NyeXB0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nY3J5cHQ7IAotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNsaWVudC1nY3J5cHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2NsaWVudF9nY3J5cHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NsaWVudF9nY3J5cHQ7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ2NyeXB0IiAhPSAieG5vIjsgdGhlbgotCSAKLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliZ2NyeXB0LXByZWZpeCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGliZ2NyeXB0X3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbGliZ2NyeXB0X3ByZWZpeDsgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIgotZWxzZQotICBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iIgotZmkKLQotICBpZiB0ZXN0IHgkbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KLSAgICAgaWYgdGVzdCB4JHtMSUJHQ1JZUFRfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KLSAgICAgICAgTElCR0NSWVBUX0NPTkZJRz0kbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXgvYmluL2xpYmdjcnlwdC1jb25maWcKLSAgICAgZmkKLSAgZmkKLQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxpYmdjcnlwdC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGxpYmdjcnlwdC1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRMSUJHQ1JZUFRfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUc9IiRMSUJHQ1JZUFRfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUciICYmIGFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRz0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTElCR0NSWVBUX0NPTkZJRz0kYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHCi1pZiB0ZXN0IC1uICIkTElCR0NSWVBUX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMSUJHQ1JZUFRfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkTElCR0NSWVBUX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRtcD0xLjQuMAotICBpZiBlY2hvICIkdG1wIiB8IGdyZXAgJzonID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgIHJlcV9saWJnY3J5cHRfYXBpPWBlY2hvICIkdG1wIiAgICAgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMS8nYAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249YGVjaG8gIiR0bXAiIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDIvJ2AKLSAgZWxzZQotICAgICByZXFfbGliZ2NyeXB0X2FwaT0wCi0gICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj0iJHRtcCIKLSAgZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49ICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIExJQkdDUllQVCAtIHZlcnNpb24gPj0gJG1pbl9saWJnY3J5cHRfdmVyc2lvbi4uLiAiID4mNjsgfQotICBvaz1ubwotICBpZiB0ZXN0ICIkTElCR0NSWVBUX0NPTkZJRyIgIT0gIm5vIiA7IHRoZW4KLSAgICByZXFfbWFqb3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wxLydgCi0gICAgcmVxX21pbm9yPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMi8nYAotICAgIHJlcV9taWNybz1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDMvJ2AKLSAgICBsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb249YCRMSUJHQ1JZUFRfQ09ORklHIC0tdmVyc2lvbmAKLSAgICBtYWpvcj1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAotICAgIG1pbm9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wyLydgCi0gICAgbWljcm89YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpLiovXDMvJ2AKLSAgICBpZiB0ZXN0ICIkbWFqb3IiIC1ndCAiJHJlcV9tYWpvciI7IHRoZW4KLSAgICAgICAgb2s9eWVzCi0gICAgZWxzZSAKLSAgICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZXEgIiRyZXFfbWFqb3IiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1ndCAiJHJlcV9taW5vciI7IHRoZW4KLSAgICAgICAgICAgICAgIG9rPXllcwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZXEgIiRyZXFfbWlub3IiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pY3JvIiAtZ2UgIiRyZXFfbWljcm8iOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICBvaz15ZXMKLSAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY1Ci0kYXNfZWNobyAieWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY2OyB9Ci0gIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICAgIyBJZiB3ZSBoYXZlIGEgcmVjZW50IGxpYmdjcnlwdCwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUKLSAgICAgIyBBUEkgaXMgY29tcGF0aWJsZQotICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1ndCAwIDsgdGhlbgotICAgICAgICB0bXA9YCRMSUJHQ1JZUFRfQ09ORklHIC0tYXBpLXZlcnNpb24gMj4vZGV2L251bGwgfHwgZWNobyAwYAotICAgICAgICBpZiB0ZXN0ICIkdG1wIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBMSUJHQ1JZUFQgQVBJIHZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgTElCR0NSWVBUIEFQSSB2ZXJzaW9uLi4uICIgPiY2OyB9Ci0gICAgICAgICAgIGlmIHRlc3QgIiRyZXFfbGliZ2NyeXB0X2FwaSIgLWVxICIkdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2theSIgPiY1Ci0kYXNfZWNobyAib2theSIgPiY2OyB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBvaz1ubwotICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBkb2VzIG5vdCBtYXRjaC4gd2FudD0kcmVxX2xpYmdjcnlwdF9hcGkgZ290PSR0bXAiID4mNQotJGFzX2VjaG8gImRvZXMgbm90IG1hdGNoLiB3YW50PSRyZXFfbGliZ2NyeXB0X2FwaSBnb3Q9JHRtcCIgPiY2OyB9Ci0gICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgTElCR0NSWVBUX0NGTEFHUz1gJExJQkdDUllQVF9DT05GSUcgLS1jZmxhZ3NgCi0gICAgTElCR0NSWVBUX0xJQlM9YCRMSUJHQ1JZUFRfQ09ORklHIC0tbGlic2AKLSAgICA6Ci0gIGVsc2UKLSAgICBMSUJHQ1JZUFRfQ0ZMQUdTPSIiCi0gICAgTElCR0NSWVBUX0xJQlM9IiIKLSAgICB3aXRoX2NsaWVudF9nY3J5cHQ9bm8KLSAgZmkKLSAgCi0gIAotCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRMSUJHQ1JZUFRfQ0ZMQUdTIgotCUxJQlM9IiRMSUJTICRMSUJHQ1JZUFRfTElCUyIKLQlpZiB0ZXN0ICJ4JHdpdGhfY2xpZW50X2djcnlwdCIgIT0gInhubyI7IHRoZW4KLQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9DTElFTlRfR0NSWVBUIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWZpCi0KLSMgQ2hlY2tzIGZvciBHbnVUTFMKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudXRscyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251dGxzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nbnV0bHM7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ251dGxzIiAhPSAieG5vIjsgdGhlbgotCVBLR19DSEVDS19NT0RVTEVTKEdOVVRMUywgZ251dGxzID49IDIuNC4wLCw6KQotCUNGTEFHUz0iJENGTEFHUyAkR05VVExTX0NGTEFHUyIKLQlMSUJTPSIkTElCUyAkR05VVExTX0xJQlMiCi1maQotIGlmIHRlc3QgISAteiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICBIQVZFX0dOVVRMU19UUlVFPQotICBIQVZFX0dOVVRMU19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9HTlVUTFNfVFJVRT0nIycKLSAgSEFWRV9HTlVUTFNfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICEgLXogIiRHTlVUTFNfTElCUyIgOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfR05VVExTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLSMgd2FybiBpZiBuZWl0aGVyIEdudVRMUyBub3IgT3BlblNTTCBhcmUgYXZhaWxhYmxlCi1pZiB0ZXN0IC16ICIkU1NMX0xJQlMiIC1hIC16ICIkR05VVExTX0xJQlMiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5vIGVuY3J5cHRpb24gbGlicmFyeSBjb3VsZCBiZSBmb3VuZC4gKioqCi1BIGxpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQgYnVpbHQgdGhpcyB3YXkgd2lsbCBub3Qgc3VwcG9ydCBTU0wgZW5jcnlwdGlvbi4KLVRvIGVuYWJsZSBTU0wgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzIChwZXJoYXBzIGl0IGlzIG5hbWVkCi1zb21ldGhpbmcgbGlrZSBsaWJzc2wtZGV2IG9yIGdudXRscy1kZXYpIGFuZCBydW4gY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTm8gZW5jcnlwdGlvbiBsaWJyYXJ5IGNvdWxkIGJlIGZvdW5kLiAqKioKLUEgbGlidm5jc2VydmVyL2xpYnZuY2NsaWVudCBidWlsdCB0aGlzIHdheSB3aWxsIG5vdCBzdXBwb3J0IFNTTCBlbmNyeXB0aW9uLgotVG8gZW5hYmxlIFNTTCBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMgKHBlcmhhcHMgaXQgaXMgbmFtZWQKLXNvbWV0aGluZyBsaWtlIGxpYnNzbC1kZXYgb3IgZ251dGxzLWRldikgYW5kIHJ1biBjb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCXNsZWVwIDUKLWZpCi0KLQotIyBJUHY2Ci0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1pcHY2IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pcHY2K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9pcHY2OyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9pcHY2IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGFkZHJpbmZvIiAiYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSVB2NiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRhZGRyaW5mbyBpbiAtbHNvY2tldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRhZGRyaW5mbyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGFkZHJpbmZvICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm8iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBJUHY2IDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIAotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWx3czJfMzIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIGluIC1sd3MyXzMyLi4uICIgPiY2OyB9Ci0JCSAgICAgICAgTElCUz0iJExJQlMgLWx3czJfMzIiCi0JCSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWdldGFkZHJpbmZvKDAsIDAsIDAsIDApOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotCQkJCSAgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIElQdjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJICAgICAgICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCQkJICAgICAgCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgICAgICAgICAgICAgCi1maQotCi1maQotCi1maQotCi0KLQotIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWZvciBhY19oZWFkZXIgaW4gYXJwYS9pbmV0LmggZmNudGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdGltZWIuaCBzeXNsb2cuaCB1bmlzdGQuaCB3czJ0Y3BpcC5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLQotZG9uZQotCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2hlYWRlciBpbiBwd2QuaCBzeXMvd2FpdC5oIHV0bXB4LmggdGVybWlvcy5oIHN5cy9pb2N0bC5oIHN5cy9zdHJvcHRzLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZpCi0KLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07Ci0gIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKLSAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotICBjaGFyICoqcHBjOwotICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0gIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0gICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKLSAgICAgZXhwcmVzc2lvbiAqLwotICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0gIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwotICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotICArK3BjcGNjOwotICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKLSAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwotICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gICAgY2hhciB0eDsKLSAgICBjaGFyICp0ID0gJnR4OwotICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgICAqdCsrID0gMDsKLSAgICBpZiAocykgcmV0dXJuIDA7Ci0gIH0KLSAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgICBpbnQgeFtdID0gezI1LCAxN307Ci0gICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgICArK2ZvbzsKLSAgfQotICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgICBpcHRyIHAgPSAwOwotICAgICsrcDsKLSAgfQotICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKLSAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKLSAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7Ci0gIH0KLSAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgICBjb25zdCBpbnQgZm9vID0gMTA7Ci0gICAgaWYgKCFmb28pIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgaW5saW5lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfaW5saW5lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBpbnQgZm9vX3Q7Ci1zdGF0aWMgJGFjX2t3IGZvb190IHN0YXRpY19mb28gKCkge3JldHVybiAwOyB9Ci0kYWNfa3cgZm9vX3QgZm9vICgpIHtyZXR1cm4gMDsgfQotI2VuZGlmCi0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2lubGluZT0kYWNfa3cKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgdGVzdCAiJGFjX2N2X2NfaW5saW5lIiAhPSBubyAmJiBicmVhawotZG9uZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfaW5saW5lIiA+JjY7IH0KLQotY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICAqKQotICAgIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gICAgICBubykgYWNfdmFsPTs7Ci0gICAgICAqKSBhY192YWw9JGFjX2N2X2NfaW5saW5lOzsKLSAgICBlc2FjCi0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBpbmxpbmUgJGFjX3ZhbAotI2VuZGlmCi1fQUNFT0YKLSAgICA7OwotZXNhYwotCi0geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0gICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZm5kZWYgX19BUFBMRV9DQ19fCi0JICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCi0JICAgICAjZW5kaWYKLQkgICAgIHR5cGVkZWYgaW50IGR1bW15OwotCSAgICAKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAKLQkjIENoZWNrIGZvciBwb3RlbnRpYWwgLWFyY2ggZmxhZ3MuICBJdCBpcyBub3QgdW5pdmVyc2FsIHVubGVzcwotCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCi0JYWNfYXJjaD0KLQlhY19wcmV2PQotCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KLQkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0JICAgY2FzZSAkYWNfd29yZCBpbgotCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQotCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgotCQkgYWNfYXJjaD0kYWNfd29yZAotCSAgICAgICBlbHNlCi0JCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKLQkJIGJyZWFrCi0JICAgICAgIGZpCi0JICAgICAgIDs7Ci0JICAgZXNhYwotCSAgIGFjX3ByZXY9Ci0JIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCi0JICAgYWNfcHJldj1hcmNoCi0JIGZpCi0gICAgICAgZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQkgICAKLWludAotbWFpbiAoKQotewotI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAotCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAotCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCi0JICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcwotCSAgICAgI2VuZGlmCi0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotCSAgIAotaW50Ci1tYWluICgpCi17Ci0jaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQotCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLQkgICAgICNlbmRpZgotCSAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX0JJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBpbnQgYXNjaWlfbW1bXSA9Ci0JCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07Ci0JCXNob3J0IGludCBhc2NpaV9paVtdID0KLQkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKLQkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKLQkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKLQkJfQotCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQotCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OwotCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQotCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OwotCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKLQkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOwotCQl9Ci0JCWV4dGVybiBpbnQgZm9vOwotCSAgICAgIAotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gdXNlX2FzY2lpIChmb28pID09IHVzZV9lYmNkaWMgKGZvbyk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCi0JICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi0JICAgIGZpCi0JICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgotCQlhY19jdl9jX2JpZ2VuZGlhbj1ubwotCSAgICAgIGVsc2UKLQkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/Ci0JCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLQkgICAgICBmaQotCSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgICAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLQkgICAgIHVuaW9uCi0JICAgICB7Ci0JICAgICAgIGxvbmcgaW50IGw7Ci0JICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Ci0JICAgICB9IHU7Ci0JICAgICB1LmwgPSAxOwotCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Ci0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQotIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCi0gICB5ZXMpCi0gICAgICRhc19lY2hvICJAJTpAZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKLTs7ICMoCi0gICBubykKLSAgICAgIDs7ICMoCi0gICB1bml2ZXJzYWwpCi0gICAgIAkKLSRhc19lY2hvICJAJTpAZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKLQotICAgICA7OyAjKAotICAgKikKLSAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcwotIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OwotIGVzYWMKLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2l6ZV90IiAiYWNfY3ZfdHlwZV9zaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geHllczsgdGhlbiA6Ci0gIAotZWxzZQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGludAotX0FDRU9GCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3RpbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLWludAotbWFpbiAoKQotewotaWYgKChzdHJ1Y3QgdG0gKikgMCkKLXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3lzX3dhaXRfaCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQgaW50KSAoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jIGRlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IHM7Ci0gIHdhaXQgKCZzKTsKLSAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfdHlwZV9zb2NrbGVuX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotc29ja2xlbl90IGxlbiA9IDQyOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl90eXBlX3NvY2tsZW5fdD15ZXMKLWVsc2UKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl90eXBlX3NvY2tsZW5fdCIgPiY2OyB9Ci0gIGlmIHRlc3QgJGFjX2N2X3R5cGVfc29ja2xlbl90ICE9IHllczsgdGhlbgotICAgICRhc19lY2hvICJAJTpAZGVmaW5lIHNvY2tsZW5fdCBpbnQiID4+Y29uZmRlZnMuaAotCi0gIGZpCi0KLWlmIHRlc3QgISAtZCAuL3JmYjsgdGhlbgotCWVjaG8gImNyZWF0aW5nIHN1YmRpciAuL3JmYiBmb3IgcmZiaW50LmgiCi0JbWtkaXIgLi9yZmIgCi1maQotIyAtLS0tLS0gQUMgQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4uLi4gIiA+JjY7IH0KLWFjX3N0ZGludF9oPWBlY2hvIHJmYi9yZmJpbnQuaGAKLWlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAic3RkaW50LmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPylcIiIgPiY1Ci0kYXNfZWNobyAiXCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9zdGRpbnQuaD8pXCIiID4mNjsgfQotZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjUKLSRhc19lY2hvICJcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjY7IH0KLWVsc2UKLSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogXCIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKVwiIiA+JjUKLSRhc19lY2hvICJcIihwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpXCIiID4mNjsgfQotZmkKLQotaW50dHlwZV9oZWFkZXJzPWBlY2hvIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3lzL2ludHR5cGVzLmggIFwKLXwgc2VkIC1lICdzLywvIC9nJ2AKLQotIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X289Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF91PSJuby1maWxlIgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50cHRyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnRwdHJfdCIgImFjX2N2X3R5cGVfdWludHB0cl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnRwdHJfdCBpbiAkaSAkYW5kNjQiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gJGkgJGFuZDY0IiA+JjY7IH0KLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY1Ci0kYXNfZWNobyAiLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3lzL3R5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVfaW50NjRfdCB0b28pIgotZWxzZQotICBhbmQ2ND0iIgotZmkKLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIG91ciB1X2ludDMyX3QgaW4gJGkgJGFuZDY0IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBvdXIgdV9pbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gZmkKLSBmaQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgTUFZQkUgQyBiYXNpYyB0eXBlcyAtLS0tLS0tLQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgY2hhci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfY2hhcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAoY2hhcikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfY2hhcj0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2NoYXIgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfY2hhciA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgY2hhciIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mIChzaG9ydCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igc2hvcnQiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9TSE9SVCAkYWNfY3Zfc2l6ZW9mX3Nob3J0Ci1fQUNFT0YKLQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBmb3IgYWNfc2l6ZSBpbiA0IDggMSAyIDE2ICA7IGRvICMgTGlzdCBzaXplcyBpbiByb3VnaCBvcmRlciBvZiBwcmV2YWxlbmNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLXN3aXRjaCAoMCkgY2FzZSAwOiBjYXNlIChzaXplb2YgKGludCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfaW50PSRhY19zaXplCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHRlc3QgeCRhY19jdl9zaXplb2ZfaW50ICE9IHggOyB0aGVuIGJyZWFrOyBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2ludCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgaW50IiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKLV9BQ0VPRgotCi0KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfbG9uZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAobG9uZykgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfbG9uZz0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmcgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfbG9uZyA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgbG9uZyIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZwotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQqIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygdm9pZCouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRwKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICh2b2lkKikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfdm9pZHA9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igdm9pZCoiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfdm9pZHAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfdm9pZHAiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9WT0lEUCAkYWNfY3Zfc2l6ZW9mX3ZvaWRwCi1fQUNFT0YKLQotCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgU1RBUlQgaGVhZGVyIC0tLS0tLS0tLS0tLS0KLV9hY19zdGRpbnRfaD1gJGFzX2VjaG8gIl8kYWNfc3RkaW50X2giIHwgJGFzX3RyX2NwcGAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjUKLSRhc19lY2hvICJjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjY7IH0KLWVjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNpZm5kZWYiIF9HRU5FUkFURURfU1RESU5UX0ggPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50X2gKLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyBhIGdudSBjb21waWxlciB2ZXJzaW9uIiBgJENDIC0tdmVyc2lvbmAgIiovIiBcCi0gID4+JGFjX3N0ZGludF9oCi1lbHNlCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyAkQ0MgKi8iID4+JGFjX3N0ZGludF9oCi1maQotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gU2VlIGlmIGludF9sZWFzdCBhbmQgaW50X2Zhc3QgdHlwZXMgYXJlIHByZXNlbnQKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnRfZmFzdDMyX3QiICJhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgIiNpbmNsdWRlPCRhY19jdl9oZWFkZXJfc3RkaW50PgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiAhPSAic3RkZGVmLmgiIDsgdGhlbgotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRpbnQuaCIgOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY2OyB9Ci0gICBlY2hvICIjaW5jbHVkZSA8c3RkZGVmLmg+IiA+PiRhY19zdGRpbnRfaAotZmkgOyBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNjsgfQotICAgZWNobyAiI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50PiIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiIgPj4kYWNfc3RkaW50X2gKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGhlYWRlciBTVEFSVCBiYXNpYyBpbnQgdHlwZXMgLS0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIG5lZWQgdG8gbG9vayBhdCBDIGJhc2ljIHR5cGVzIiA+JjUKLSRhc19lY2hvICIuLi4gbmVlZCB0byBsb29rIGF0IEMgYmFzaWMgdHlwZXMiID4mNjsgfQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGJzZC9zeXN2IHR5cGVkZWZzIiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBic2Qvc3lzdiB0eXBlZGVmcyIgPiY2OyB9Ci0gICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogaW50OF90IGludDE2X3QgaW50MzJfdCBkZWZpbmVkIGJ5IGluZXQgY29kZSwgcmVkZWNsYXJlIHRoZSB1X2ludFhYIHR5cGVzICovCi10eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Ci10eXBlZGVmIHVfaW50MTZfdCB1aW50MTZfdDsKLXR5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OwotRU9GCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIGdsaWJjIGNvbXBhdGliaWxpdHkgKi8KLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi0jZW5kaWYKLUVPRgotZmkKLQotYWNfY3Zfc2l6ZW9mX3g9IiRhY19jdl9zaXplb2ZfY2hhcjokYWNfY3Zfc2l6ZW9mX3Nob3J0IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX2ludCIKLWFjX2N2X3NpemVvZl9YPSIkYWNfY3Zfc2l6ZW9mX1g6JGFjX2N2X3NpemVvZl92b2lkcDokYWNfY3Zfc2l6ZW9mX2xvbmciCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPSAic3RkZGVmLmgiIDsgdGhlbgotIyAgIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLAotIyB0aGVyZSBhIGZldyAzMi1iaXQtb25seSBkc3Atc3lzdGVtcy4gbmliYmxlLWFkZHJlc3NhYmxlIHN5c3RlbXMgYXJlIHdheSBvZmYuCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAtLS0tLS0tLS0tLS0gQklUU1BFQ0lGSUMgSU5UVFlQRVMgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICAgIHQ9InR5cGVkZWZzIGZvciBhIgotICAgIGNhc2UgIiRhY19jdl9zaXplb2ZfWCIgaW4KLSAgICAgMToyOjI6Mjo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDE2LWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAxNi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAxNi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjI6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0ICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDMyLWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAzMi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQiID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0Ojg6OCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nICR0IG5vcm1hbCA2NC1iaXQgc3lzdGVtIiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCBub3JtYWwgNjQtYml0IHN5c3RlbSIgPiY2OyB9Ci0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIG5vcm1hbCA2NC1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDY0LWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMzItYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAqKQotICAgIGFzX2ZuX2Vycm9yICQ/ICIgJGFjX2N2X3NpemVvZl9YICB3aGF0IGlzIHRoYXQgYSBzeXN0ZW0/IGNvbnRhY3QgdGhlIGF1dGhvciwgcXVpY2shIGh0dHA6Ly9hYy1hcmNoaXZlLnNmLm5ldCIgIiRMSU5FTk8iIDUKLSAgICBleGl0IDEKLTs7Ci0gICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBiYXNpYyBpbnQgdHlwZXMgU1RBUlQgaW50NjRfdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiCi10aGVuIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgZ29vZCB1aW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotI2VuZGlmCi1FT0YKLQotZWxpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91X2ludDY0X3QiID0gInllcyIKLXRoZW4geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB0eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdCIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBzeXN0ZW0gaGVhZGVycyBoYXZlIGFuIHVfaW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotZWxzZSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSA2NCBCSVQgR0VORVJJQyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCi0jaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKLQotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXwotI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXwotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIF9faW50NjQgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX19NV0VSS1NfXyB8fCBkZWZpbmVkIF9fRUxGX18KLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCi0KLSNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLSAgLyogY29tcGlsZXIvY3B1IHR5cGUgLi4uIG9yIGp1c3QgSVNPIEM5OSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotCi0jIHBsdXMgYSBkZWZhdWx0IDY0LWJpdCBmb3Igc3lzdGVtcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgNjQtYml0IHJlYWR5Ci0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIgaW4KLSAgICAxOjI6ODo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY2OyB9Ci1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIG5vcm1hbCA2NC1iaXQgc3lzdGVtLCBDQyBoYXMgc2l6ZW9mKGxvbmcgYW5kIHZvaWQqKSA9PSA4IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgIDE6Mjo0OjgpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjY7IH0KLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjg6NCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNjsgfQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiA2NC1iaXQgZGVyaXZlZCBmcm9tIGEgMzItYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDQgYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgKikKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogTk9URTogKi8KLS8qIHRoZSBjb25maWd1cmUtY2hlY2tzIGZvciB0aGUgYmFzaWMgdHlwZXMgZGlkIG5vdCBtYWtlIHVzIGJlbGlldmUgKi8KLS8qIHRoYXQgd2UgY291bGQgYWRkIGEgZmFsbGJhY2sgdG8gYSAnbG9uZyBsb25nJyB0eXBlZGVmIHRvIGludDY0X3QgKi8KLUVPRgotICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnQ2NF90IHR5cGVzIFNUQVJUIGludHB0ciB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVFIgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICBjYXNlICIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl92b2lkcCIgaW4KLSAgMToyOjIpCi0gICAgYT0iaW50MTZfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDIgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMTYtYml0ICovCi0KLXR5cGVkZWYgdWludDE2X3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MTZfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo0KQotICAgIGE9ImludDMyX3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA0IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDMyLWJpdCAqLwotCi10eXBlZGVmIHVpbnQzMl90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDMyX3QgIGludHB0cl90OwotRU9GCi07OwotICAxOjI6OCkKLSAgICBhPSJpbnQ2NF90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgOCBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCA2NC1iaXQgKi8KLQotdHlwZWRlZiB1aW50NjRfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQ2NF90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgKikKLSAgICBhPSJsb25nIiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgYnV0IGdvdCBubyBndWVzcywgaGVuY2Ugd2UgZGVjbGFyZSBpdCBhcyBpZiBsb25nICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgIGludHB0cl90OwotRU9GCi07OwotICBlc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY2OyB9Ci1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnRwdHIgdHlwZXMgU1RBUlQgaW50X2xlYXN0IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAibm8iOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyBpbnRfbGVhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2xlYXN0LXR5cGVzIiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tR0VORVJJQyBJTlRfTEVBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0gIm5vIjsgdGhlbgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNjsgfQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9GQVNUIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmICBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmICBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfZmFzdDhfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiBpbnQ2NF90ICAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGludCAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBET05FICRhY19zdGRpbnRfaCIgPiY1Ci0kYXNfZWNobyAiLi4uIERPTkUgJGFjX3N0ZGludF9oIiA+JjY7IH0KLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0gIC8qIG9uY2UgKi8KLSNlbmRpZgotI2VuZGlmCi1FT0YKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5fYWRkcl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbl9hZGRyX3QuLi4gIiA+JjY7IH0KLWlmICR7dm5jX2N2X2luYWRkcnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotaW50Ci1tYWluICgpCi17Ci1pbl9hZGRyX3QgZm9vOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBpbmFkZHJ0PXllcwotZWxzZQotICBpbmFkZHJ0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0LAotICAgICAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHZuY19jdl9pbmFkZHJ0IiA+JjUKLSRhc19lY2hvICIkdm5jX2N2X2luYWRkcnQiID4mNjsgfQotCi1pZiB0ZXN0ICRpbmFkZHJ0ID0gbm8gOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIE5FRURfSU5BRERSX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0jIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiBtZW1jbXAgYXJlIG5vdCA4LWJpdCBjbGVhbi4gICovCi0gIGNoYXIgYzAgPSAnXDEwMCcsIGMxID0gJ1wyMDAnLCBjMiA9ICdcMjAxJzsKLSAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCi0gICAgIG9yIG1vcmUgYW5kIHdpdGggYXQgbGVhc3Qgb25lIGJ1ZmZlciBub3Qgc3RhcnRpbmcgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0gICAgIFdpbGxpYW0gTGV3aXMgcHJvdmlkZWQgdGhpcyB0ZXN0IHByb2dyYW0uICAgKi8KLSAgewotICAgIGNoYXIgZm9vWzIxXTsKLSAgICBjaGFyIGJhclsyMV07Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgIHsKLQljaGFyICphID0gZm9vICsgaTsKLQljaGFyICpiID0gYmFyICsgaTsKLQlzdHJjcHkgKGEsICItLS0tLS0tLTAxMTExMTExIik7Ci0Jc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwotCWlmIChtZW1jbXAgKGEsIGIsIDE2KSA+PSAwKQotCSAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjY7IH0KLXRlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIG1lbWNtcC4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxzdGF0IGNvcnJlY3RseSBoYW5kbGVzIHRyYWlsaW5nIHNsYXNoIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2guLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3Quc3ltIGNvbmZ0ZXN0LmZpbGUKLWVjaG8gPmNvbmZ0ZXN0LmZpbGUKLWlmIHRlc3QgIiRhc19sbl9zIiA9ICJsbiAtcyIgJiYgbG4gLXMgY29uZnRlc3QuZmlsZSBjb25mdGVzdC5zeW07IHRoZW4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotc3RydWN0IHN0YXQgc2J1ZjsKLSAgICAgLyogTGludXggd2lsbCBkZXJlZmVyZW5jZSB0aGUgc3ltbGluayBhbmQgZmFpbCwgYXMgcmVxdWlyZWQgYnkgUE9TSVguCi0JVGhhdCBpcyBiZXR0ZXIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWVhbnMgd2Ugd2lsbCBub3QKLQloYXZlIHRvIGNvbXBpbGUgYW5kIHVzZSB0aGUgbHN0YXQgd3JhcHBlci4gICovCi0gICAgIHJldHVybiBsc3RhdCAoImNvbmZ0ZXN0LnN5bS8iLCAmc2J1ZikgPT0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZWxzZQotICAjIElmIHRoZSBgbG4gLXMnIGNvbW1hbmQgZmFpbGVkLCB0aGVuIHdlIHByb2JhYmx5IGRvbid0IGV2ZW4KLSAgIyBoYXZlIGFuIGxzdGF0IGZ1bmN0aW9uLgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWZpCi1ybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNjsgfQotCi10ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsgPSB5ZXMgJiYKLSAgCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLV9BQ0VPRgotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhubzsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbHN0YXQuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQkAmdEBPQkpTPSIkTElCQCZ0QE9CSlMgbHN0YXQuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgYWNjZXB0cyBhbiBlbXB0eSBzdHJpbmcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnPXllcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3Qgc3RhdCBzYnVmOwotICByZXR1cm4gc3RhdCAoIiIsICZzYnVmKSA9PSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9bm8KLWVsc2UKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyA9IHllczsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgc3RhdC4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCQCZ0QE9CSlM9IiRMSUJAJnRAT0JKUyBzdGF0LiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgMQotX0FDRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHN0cmZ0aW1lCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmZ0aW1lIiAiYWNfY3ZfZnVuY19zdHJmdGltZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1NUUkZUSU1FIDEKLV9BQ0VPRgotIAotZWxzZQotICAjIHN0cmZ0aW1lIGlzIGluIC1saW50bCBvbiBTQ08gVU5JWC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cmZ0aW1lIGluIC1saW50bCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzdHJmdGltZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHN0cmZ0aW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPXllcwotZWxzZQotICBhY19jdl9saWJfaW50bF9zdHJmdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1RSRlRJTUUgMSIgPj5jb25mZGVmcy5oCi0KLUxJQlM9Ii1saW50bCAkTElCUyIKLWZpCi0KLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHZwcmludGYKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidnByaW50ZiIgImFjX2N2X2Z1bmNfdnByaW50ZiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192cHJpbnRmIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfVlBSSU5URiAxCi1fQUNFT0YKLSAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIl9kb3BybnQiICJhY19jdl9mdW5jX19kb3BybnQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX2RvcHJudCIgPSB4eWVzOyB0aGVuIDoKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0RPUFJOVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotZmkKLWRvbmUKLQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJwaWRfdCIgImFjX2N2X3R5cGVfcGlkX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9waWRfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1lbHNlCi0gIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBwaWRfdCBpbnQKLV9BQ0VPRgotCi1maQotCi1mb3IgYWNfaGVhZGVyIGluIHZmb3JrLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInZmb3JrLmgiICJhY19jdl9oZWFkZXJfdmZvcmtfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmZvcmtfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1ZGT1JLX0ggMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLWRvbmUKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2ZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yay4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mdW5jX2Zvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgIC8qIEJ5IFJ1ZWRpZ2VyIEt1aGxtYW5uLiAqLwotCSAgcmV0dXJuIGZvcmsgKCkgPCAwOwotCQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNjsgfQotCi1lbHNlCi0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCi1maQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCi0gIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotYW1pZ2FvcyogfCAqLSotbXNkb3NkamdwcCopCi0gICAgICAjIE92ZXJyaWRlLCBhcyB0aGVzZSBzeXN0ZW1zIGhhdmUgb25seSBhIGR1bW15IGZvcmsoKSBzdHViCi0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9yayIgPSB4eWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY192Zm9ya193b3Jrcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZkZWYgSEFWRV9WRk9SS19ICi0jIGluY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LiAgVGhlIGNvbXBpbGVyCi0gICBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sIGJ1dCBzb21lIGNvbXBpbGVycwotICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4gIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQotICAgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzCi0gICBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSMgZWxzZQotc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgc3RhdGljIHBpZF90IGNoaWxkOwotICBpZiAoIWNoaWxkKSB7Ci0gICAgY2hpbGQgPSB2Zm9yayAoKTsKLSAgICBpZiAoY2hpbGQgPCAwKSB7Ci0gICAgICBwZXJyb3IgKCJ2Zm9yayIpOwotICAgICAgX2V4aXQoMik7Ci0gICAgfQotICAgIGlmICghY2hpbGQpIHsKLSAgICAgIGFyZyA9IGdldHBpZCgpOwotICAgICAgd3JpdGUoLTEsICIiLCAwKTsKLSAgICAgIF9leGl0IChhcmcpOwotICAgIH0KLSAgfQotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOwotICBwaWRfdCBjaGlsZDsKLQotICBzcGFyY19hZGRyZXNzX3Rlc3QgKDApOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuICBUaGlzCi0gICAgICAgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdCBhcyBtYW55IGxvY2FsCi0gICAgICAgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIgaW5jbHVkaW5nIGNvbXBpbGVyCi0gICAgICAgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvciBnY2MgMS40MC4zIG9uIGEgU29sYXJpcwotICAgICAgIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4gIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkCi0gICAgICAgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudCBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsCi0gICAgICAgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0IHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlCi0gICAgICAgaW4gdGhpcyByb3V0aW5lLiAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMKLSAgICAgICBtdW5nZSBwYXJlbnQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLCB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudAotICAgICAgIGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yCi0gICAgICAgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLCB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvcgotICAgICAgIGFzIHdlbGwuICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICByZXR1cm4gKAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNjsgfQotCi1maTsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSB2Zm9yayBmb3JrIiA+PmNvbmZkZWZzLmgKLQotZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfTElCTlNMIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc29ja2V0X3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzb2NrZXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzb2NrZXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCi1fQUNFT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZmkKLQotCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JIyBuZWVkIC1sc2VjIGZvciBnZXRzcG5hbSgpCi0JTERGTEFHUz0iJExERkxBR1MgLWxzZWMiCi1maQotCi1mb3IgYWNfZnVuYyBpbiBmdGltZSBnZXRob3N0YnluYW1lIGdldGhvc3RuYW1lIGdldHRpbWVvZmRheSBpbmV0X250b2EgbWVtbW92ZSBtZW1zZXQgbW1hcCBta2ZpZm8gc2VsZWN0IHNvY2tldCBzdHJjaHIgc3RyY3NwbiBzdHJkdXAgc3RyZXJyb3Igc3Ryc3RyCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2Z1bmMgaW4gc2V0c2lkIHNldHBncnAgZ2V0cHd1aWQgZ2V0cHduYW0gZ2V0c3BuYW0gZ2V0dWlkIGdldGV1aWQgc2V0dWlkIHNldGdpZCBzZXRldWlkIHNldGVnaWQgaW5pdGdyb3VwcyB3YWl0cGlkIHNldHV0eGVudCBncmFudHB0IHNobWF0Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLWZpCi0KLSMgY2hlY2ssIGlmIHNobWdldCBpcyBpbiBjeWdpcGMuYQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2htZ2V0IGluIC1sY3lnaXBjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaG1nZXQgaW4gLWxjeWdpcGMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGN5Z2lwYyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2htZ2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2htZ2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0PXllcwotZWxzZQotICBhY19jdl9saWJfY3lnaXBjX3NobWdldD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3lnaXBjX3NobWdldCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJDWUdJUEMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxjeWdpcGMgJExJQlMiCi0KLWZpCi0KLSBpZiB0ZXN0ICIkSEFWRV9DWUdJUEMiID0gInRydWUiOyB0aGVuCi0gIENZR0lQQ19UUlVFPQotICBDWUdJUENfRkFMU0U9JyMnCi1lbHNlCi0gIENZR0lQQ19UUlVFPScjJwotICBDWUdJUENfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2sgaWYgL3Vzci9pbmNsdWRlL2xpbnV4IGV4aXN0cywgaWYgc28sIGRlZmluZSBMSU5VWAotIGlmIHRlc3QgLWQgL3Vzci9pbmNsdWRlL2xpbnV4OyB0aGVuCi0gIExJTlVYX1RSVUU9Ci0gIExJTlVYX0ZBTFNFPScjJwotZWxzZQotICBMSU5VWF9UUlVFPScjJwotICBMSU5VWF9GQUxTRT0KLWZpCi0KLQotIyBDaGVjayBmb3IgT1MgWCBzcGVjaWZpYyBoZWFkZXIKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaCIgImFjX2N2X2hlYWRlcl9BcHBsaWNhdGlvblNlcnZpY2VzX0FwcGxpY2F0aW9uU2VydmljZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfQXBwbGljYXRpb25TZXJ2aWNlc19BcHBsaWNhdGlvblNlcnZpY2VzX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfT1NYPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfT1NYIiA9ICJ0cnVlIjsgdGhlbgotICBPU1hfVFJVRT0KLSAgT1NYX0ZBTFNFPScjJwotZWxzZQotICBPU1hfVFJVRT0nIycKLSAgT1NYX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrIGZvciBBbmRyb2lkIHNwZWNpZmljIGhlYWRlcgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImFuZHJvaWQvYXBpLWxldmVsLmgiICJhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9BTkRST0lEPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfQU5EUk9JRCIgPSAidHJ1ZSI7IHRoZW4KLSAgQU5EUk9JRF9UUlVFPQotICBBTkRST0lEX0ZBTFNFPScjJwotZWxzZQotICBBTkRST0lEX1RSVUU9JyMnCi0gIEFORFJPSURfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICIkSEFWRV9BTkRST0lEIiA9ICJ0cnVlIjsgdGhlbgotCQotJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9BTkRST0lEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIE9uIFNvbGFyaXMgMi43LCB3cml0ZSgpIHJldHVybnMgRU5PRU5UIHdoZW4gaXQgcmVhbGx5IG1lYW5zIEVBR0FJTgotCi1jYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLSAgICAiU3VuT1MgNS43IikKLQkkYXNfZWNobyAiQCU6QGRlZmluZSBFTk9FTlRfV09SS0FST1VORCAxIiA+PmNvbmZkZWZzLmgKLQotICAgIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIHJwbSBTT1VSQ0VTIHBhdGgKLXByaW50ZiAiY2hlY2tpbmcgZm9yIHJwbSBzb3VyY2VzIHBhdGguLi4gIgotUlBNU09VUkNFRElSPSJOT1QtRk9VTkQiCi1mb3IgZGlyZWN0b3J5IGluIHBhY2thZ2VzIE9wZW5MaW51eCByZWRoYXQgUmVkSGF0IHJwbSBSUE0gIiIgOyBkbwotCWlmIHRlc3QgLWQgL3Vzci9zcmMvJHtkaXJlY3Rvcnl9L1NPVVJDRVM7IHRoZW4KLQkJUlBNU09VUkNFRElSPSIvdXNyL3NyYy8ke2RpcmVjdG9yeX0vU09VUkNFUy8iCi0JZmkKLWRvbmUKLWVjaG8gIiRSUE1TT1VSQ0VESVIiCi0gaWYgdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCI7IHRoZW4KLSAgSEFWRV9SUE1fVFJVRT0KLSAgSEFWRV9SUE1fRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfUlBNX1RSVUU9JyMnCi0gIEhBVkVfUlBNX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLSAgV0lUSF9YMTFWTkNfVFJVRT0KLSAgV0lUSF9YMTFWTkNfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfWDExVk5DX1RSVUU9JyMnCi0gIFdJVEhfWDExVk5DX0ZBTFNFPQotZmkKLQotCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBsaWJ2bmNzZXJ2ZXIucGMgbGlidm5jY2xpZW50LnBjIGxpYnZuY3NlcnZlci9NYWtlZmlsZSBleGFtcGxlcy9NYWtlZmlsZSBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIHZuY3Rlcm0vTWFrZWZpbGUgd2ViY2xpZW50cy9NYWtlZmlsZSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIHdlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlIGxpYnZuY2NsaWVudC9NYWtlZmlsZSBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUgdGVzdC9NYWtlZmlsZSBsaWJ2bmNzZXJ2ZXItY29uZmlnIExpYlZOQ1NlcnZlci5zcGVjIgotCi0jCi0jIHgxMXZuYyBvbmx5OgotIwotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCSMKLQkjIE5PVEU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIExpYlZOQ1NlcnZlci1YLlkuWi50YXIuZ3ogc291cmNlCi0JIyB0YXJiYWxsIGFuZCBuZXZlcnRoZWxlc3Mgd2FudCB0byBydW4gYXV0b2NvbmYgKGkuZS4gYWNsb2NhbCwKLQkjIGF1dG9oZWFkZXIsIGF1dG9tYWtlLCBhdXRvY29uZikgQUdBSU4gKHBlcmhhcHMgeW91IGhhdmUgYQotCSMgc3BlY2lhbCB0YXJnZXQgc3lzdGVtLCBlLmcuIGVtYmVkZGVkKSB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KLQkjIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgJ0FDX0NPTkZJR19GSUxFUycgbGluZSB0byBhdm9pZAotCSMgYXV0b21ha2UgZXJyb3IgbWVzc2FnZXMgbGlrZToKLQkjCi0JIyBjb25maWd1cmUuYWM6NjkwOiByZXF1aXJlZCBmaWxlIGB4MTF2bmMvTWFrZWZpbGUuaW4nIG5vdCBmb3VuZAotCSMKLQlhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgeDExdm5jL01ha2VmaWxlIHgxMXZuYy9taXNjL01ha2VmaWxlIHgxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlIgotCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiIC1hICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInhubyI7IHRoZW4KLQkJIyBuZWVkIHRvIG1vdmUgbG9jYWwgdGFyYmFsbCByZmIgaGVhZGVycyBhc2lkZToKLQkJaGRycz0icmZiLmggcmZiY2xpZW50LmggcmZicHJvdG8uaCByZmJyZWdpb24uaCByZmJpbnQuaCIKLQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgYXNpZGUgaGVhZGVycyAkaGRycyIKLQkJZm9yIGhkciBpbiAkaGRycwotCQlkbwotCQkJaWYgdGVzdCAtZiAicmZiLyRoZHIiOyB0aGVuCi0JCQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgcmZiLyRoZHIgdG8gcmZiLyRoZHIuT1JJRyIKLQkJCQltdiByZmIvJGhkciByZmIvJGhkci5PUklHCi0JCQlmaQotCQlkb25lCi0JCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogKk5PVEUqIG1vdmUgdGhlbSBiYWNrIG1hbnVhbGx5IHRvIHN0YXJ0IG92ZXIuIgotCWZpCi1maQotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIKLQotY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KLSMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0jIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMuCi0KLV9BQ0VPRgotCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCi0gICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0JY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgotICAgICAgZWxzZQotICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCi0gICAgICAgICovKiB8ID86KikKLQkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKLQkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCi0gICAgICAgICopCi0JICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi1hY19saWJvYmpzPQotYWNfbHRsaWJvYmpzPQotVT0KLWZvciBhY19pIGluIDogJExJQkAmdEBPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0gICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKLSAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0gIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCQCZ0QE9CSlM9JGFjX2xpYm9ianMKLQotTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKLQotCi0gaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgYW1fX0VYRUVYVF9UUlVFPQotICBhbV9fRVhFRVhUX0ZBTFNFPScjJwotZWxzZQotICBhbV9fRVhFRVhUX1RSVUU9JyMnCi0gIGFtX19FWEVFWFRfRkFMU0U9Ci1maQotCi1pZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9GRk1QRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTVAzTEFNRV9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX01QM0xBTUVfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX01QM0xBTUVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTU0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfWDExX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfWDExX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9YMTFcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke09TWF9PUEVOR0xfVFJVRX0iICYmIHRlc3QgLXogIiR7T1NYX09QRU5HTF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWF9PUEVOR0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUFRIUkVBRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlBUSFJFQURfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlBUSFJFQURcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfV0VCU09DS0VUU19UUlVFfSIgJiYgdGVzdCAteiAiJHtXSVRIX1dFQlNPQ0tFVFNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1dFQlNPQ0tFVFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCWl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlpfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlpcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCSlBFR19UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQkpQRUdfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQkpQRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJQTkdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTRExcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJHVEtcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke01JTkdXX1RSVUV9IiAmJiB0ZXN0IC16ICIke01JTkdXX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTUlOR1dcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfR05VVExTX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfR05VVExTX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9HTlVUTFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi0KLWlmIHRlc3QgLXogIiR7Q1lHSVBDX1RSVUV9IiAmJiB0ZXN0IC16ICIke0NZR0lQQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkNZR0lQQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7TElOVVhfVFJVRX0iICYmIHRlc3QgLXogIiR7TElOVVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJMSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7T1NYX1RSVUV9IiAmJiB0ZXN0IC16ICIke09TWF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7QU5EUk9JRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTkRST0lEX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU5EUk9JRFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9SUE1fVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9SUE1fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1JQTVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1gxMVZOQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLQotOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCi1hY193cml0ZV9mYWlsPTAKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWFzX3dyaXRlX2ZhaWw9MAotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gQCU6QCgKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gQCU6QCgKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotYXNfbXlzZWxmPQotY2FzZSAkMCBpbiBAJTpAKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotCi1AJTpAIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBPdXRwdXQgImBiYXNlbmFtZSBAU3xAMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLUAlOkAgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotQCU6QCBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19IEAlOkAgYXNfZm5fZXJyb3IKLQotCi1AJTpAIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFNldCBAU3xAPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KLWFzX2ZuX3NldF9zdGF0dXMgKCkKLXsKLSAgcmV0dXJuICQxCi19IEAlOkAgYXNfZm5fc2V0X3N0YXR1cwotCi1AJTpAIGFzX2ZuX2V4aXQgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KLWFzX2ZuX2V4aXQgKCkKLXsKLSAgc2V0ICtlCi0gIGFzX2ZuX3NldF9zdGF0dXMgJDEKLSAgZXhpdCAkMQotfSBAJTpAIGFzX2ZuX2V4aXQKLQotQCU6QCBhc19mbl91bnNldCBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci1AJTpAIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi1AJTpAIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLUAlOkAgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLUAlOkAgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi1AJTpAIGFzX2ZuX2FyaXRoIEFSRy4uLgotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotQCU6QCBnbG9iYWwgQFN8QGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi1AJTpAIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzIEBTfEAoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXBSJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXBSJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotCi1AJTpAIGFzX2ZuX21rZGlyX3AKLUAlOkAgLS0tLS0tLS0tLS0tLQotQCU6QCBDcmVhdGUgIkBTfEBhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSBAJTpAIGFzX2ZuX21rZGlyX3AKLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi0KLUAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgotYXNfZm5fZXhlY3V0YWJsZV9wICgpCi17Ci0gIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKLX0gQCU6QCBhc19mbl9leGVjdXRhYmxlX3AKLWFzX3Rlc3RfeD0ndGVzdCAteCcKLWFzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTRU9GCi10ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCi0jIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi1hY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBMaWJWTkNTZXJ2ZXIgJGFzX21lIDAuOS45LCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLSAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCi0gIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKLSAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotICAkICQwICRACi0KLW9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotIgotCi1fQUNFT0YKLQotY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Ci1lc2FjCi0KLWNhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OwotZXNhYwotCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLWNvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWFjX2NzX3VzYWdlPSJcCi1cYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKLWZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwotYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KLQotICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAotICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKLSAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKLQotQ29uZmlndXJhdGlvbiBmaWxlczoKLSRjb25maWdfZmlsZXMKLQotQ29uZmlndXJhdGlvbiBoZWFkZXJzOgotJGNvbmZpZ19oZWFkZXJzCi0KLUNvbmZpZ3VyYXRpb24gY29tbWFuZHM6Ci0kY29uZmlnX2NvbW1hbmRzCi0KLVJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1MaWJWTkNTZXJ2ZXIgY29uZmlnLnN0YXR1cyAwLjkuOQotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAotICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKLQotQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLU1LRElSX1A9JyRNS0RJUl9QJwotQVdLPSckQVdLJwotdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCi1hY19uZWVkX2RlZmF1bHRzPToKLXdoaWxlIHRlc3QgJCMgIT0gMAotZG8KLSAgY2FzZSAkMSBpbgotICAtLSo9PyopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gIC0tKj0pCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9Ci0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQotICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwotCi0gICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICRTSEVMTCAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi0gIHNoaWZ0Ci0gIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Ci0gIENPTkZJR19TSEVMTD0nJFNIRUxMJwotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gIGV4ZWMgIlwkQCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uL0AlOkBAJTpAIC87cy8uLi4kLyBAJTpAQCU6QC87cDt4O3A7eCcgPDxfQVNCT1gKLUAlOkBAJTpAIFJ1bm5pbmcgJGFzX21lLiBAJTpAQCU6QAotX0FTQk9YCi0gICRhc19lY2hvICIkYWNfbG9nIgotfSA+JjUKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotUEFDS0FHRT0iJFBBQ0tBR0UiCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgInJmYmNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyByZmJjb25maWcuaCIgOzsKLSAgICAicmZiL3JmYmNvbmZpZy5oIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIHJmYi9yZmJjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyLnBjIiA7OwotICAgICJsaWJ2bmNjbGllbnQucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jY2xpZW50LnBjIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyL01ha2VmaWxlIiA7OwotICAgICJleGFtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAiZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIiA7OwotICAgICJ2bmN0ZXJtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3Rlcm0vTWFrZWZpbGUiIDs7Ci0gICAgIndlYmNsaWVudHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9NYWtlZmlsZSIgOzsKLSAgICAid2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIiA7OwotICAgICJ3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIgOzsKLSAgICAibGlidm5jY2xpZW50L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY2NsaWVudC9NYWtlZmlsZSIgOzsKLSAgICAiY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXItY29uZmlnIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci1jb25maWciIDs7Ci0gICAgIkxpYlZOQ1NlcnZlci5zcGVjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIExpYlZOQ1NlcnZlci5zcGVjIiA7OwotICAgICJ4MTF2bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL01ha2VmaWxlIiA7OwotICAgICJ4MTF2bmMvbWlzYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB4MTF2bmMvbWlzYy9NYWtlZmlsZSIgOzsKLSAgICAieDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIgOzsKLQotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0gYWNfdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICA6ICIke2FjX3RtcDo9JHRtcH0iCi0gIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQotYWNfdG1wPSR0bXAKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xccicKLWVsc2UKLSAgYWNfY3NfYXdrX2NyPSRhY19jcgotZmkKLQotZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKLV9BQ0VPRgotCi0KLXsKLSAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKLSAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgotICBlY2hvICJfQUNFT0YiCi19ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0gIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCi0gIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotcm0gLWYgY29uZiQkc3Vicy5zaAotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKLV9BQ0VPRgotc2VkIC1uICcKLWgKLXMvXi9TWyIvOyBzLyEuKi8iXT0vCi1wCi1nCi1zL15bXiFdKiEvLwotOnJlcGwKLXQgcmVwbAotcy8nIiRhY19kZWxpbSInJC8vCi10IGRlbGltCi06bmwKLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwotcAotbgotYiByZXBsCi06bW9yZTEKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBubAotOmRlbGltCi1oCi1zL1woLlx7MTQ4XH1cKS4uKi9cMS8KLXQgbW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCi1wCi1iCi06bW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBkZWxpbQotJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJwotL15bXiIiXS97Ci0gIE4KLSAgcy9cbi8vCi19Ci0nID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi1ybSAtZiBjb25mJCRzdWJzLmF3awotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNBV0sKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCi0gIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi0KLX0KLXsKLSAgbGluZSA9ICQgMAotICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKLSAgc3Vic3RlZCA9IDAKLSAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQotICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7Ci0gICAga2V5ID0gZmllbGRbaV0KLSAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQotICAgIGlmIChTX2lzX3NldFtrZXldKSB7Ci0gICAgICB2YWx1ZSA9IFNba2V5XQotICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQotICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKLSAgICAgIHN1YnN0ZWQgPSAxCi0gICAgfSBlbHNlCi0gICAgICBsZW4gKz0gMSArIGtleWxlbgotICB9Ci0KLSAgcHJpbnQgbGluZQotfQotCi1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotX0FDRU9GCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKLWgKLXMvLy8KLXMvXi86Lwotcy9bCSBdKiQvOi8KLXMvOlwkKHNyY2Rpcik6LzovZwotcy86XCR7c3JjZGlyfTovOi9nCi1zLzpAc3JjZGlyQDovOi9nCi1zL146Ki8vCi1zLzoqJC8vCi14Ci1zL1woPVsJIF0qXCkuKi9cMS8KLUcKLXMvXG4vLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKLSAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLSMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAotIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCi0jIG5ld2xpbmUgc2VxdWVuY2VzLgotCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotc2VkIC1uICcKLXMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwotdCByc2V0Ci06cnNldAotcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KLXQgZGVmCi1kCi06ZGVmCi1zL1xcJC8vCi10IGJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzIi9wCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAotZAotOmJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCi10IGNvbnQKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCi10IGNvbnQKLWQKLTpjb250Ci1uCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgY2xlYXIKLTpjbGVhcgotcy9cXCQvLwotdCBic25sYwotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCi1kCi06YnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAotYiBjb250Ci0nIDxjb25mZGVmcy5oIHwgc2VkICcKLXMvJyIkYWNfZGVsaW0iJy8iXFxcCi0iL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQotICBGUyA9ICIHIgotfQotL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7Ci0gIGxpbmUgPSBcJCAwCi0gIHNwbGl0KGxpbmUsIGFyZywgIiAiKQotICBpZiAoYXJnWzFdID09ICIjIikgewotICAgIGRlZnVuZGVmID0gYXJnWzJdCi0gICAgbWFjMSA9IGFyZ1szXQotICB9IGVsc2UgewotICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKLSAgICBtYWMxID0gYXJnWzJdCi0gIH0KLSAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQotICBtYWNybyA9IG1hYzJbMV0KLSAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCi0gIGlmIChEX2lzX3NldFttYWNyb10pIHsKLSAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgotICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KLSAgICBuZXh0Ci0gIH0gZWxzZSB7Ci0gICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAotICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgewotICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgotICAgICAgbmV4dAotICAgIH0KLSAgfQotfQoteyBwcmludCB9Ci1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCi1zaGlmdAotZm9yIGFjX3RhZwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwotICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKLQkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJwotCWAnIGJ5IGNvbmZpZ3VyZS4nCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0gICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KLSAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKLSAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQotICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAotICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAotICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0jIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KLWFjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQotYWNfc2VkX2RhdGFyb290PScKLS9kYXRhcm9vdGRpci8gewotICBwCi0gIHEKLX0KLS9AZGF0YWRpckAvcAotL0Bkb2NkaXJAL3AKLS9AaW5mb2RpckAvcAotL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wJwotY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0gIGFjX2RhdGFyb290ZGlyX2hhY2s9JwotICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0gIHMmQGRvY2RpckAmJGRvY2RpciZnCi0gIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKLSAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKLSRleHRyYXN1YgotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAotcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0Ci1zJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0Ci1zJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAotcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAotcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci1zJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKLXMmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0Ci1zJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci1zJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0Ci1zJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0Ci0kYWNfZGF0YXJvb3RkaXJfaGFjawotIgotZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAotICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0KLXRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKLSAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQotCi0gIHJtIC1mICIkYWNfdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7Ci0gIGVzYWMgXAotICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgewotICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKLSAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAiJGFjX2ZpbGUiCi0gICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCi0JfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgZWxzZQotICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAotICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1Ci0gIGZpCi0jIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9IiRhY19maWxlIgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAotJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRfYW1fYXJnIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotICAKLSAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0gOzsKLSAgZXNhYwotCi0KLSAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0gICAgInJmYi9yZmJjb25maWcuaCI6QykgYWNfcHJlZml4X2NvbmZfT1VUPWBlY2hvIHJmYi9yZmJjb25maWcuaGAKLWFjX3ByZWZpeF9jb25mX0RFRj1gZWNobyBfJGFjX3ByZWZpeF9jb25mX09VVCB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjoiIC1lICJzL0A8OkBeYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkA6PkAvXy9nImAKLWFjX3ByZWZpeF9jb25mX1BLRz1gZWNobyAkUEFDS0FHRWAKLWFjX3ByZWZpeF9jb25mX0xPVz1gZWNobyBfJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi06YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfOiJgCi1hY19wcmVmaXhfY29uZl9VUFA9YGVjaG8gJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei06QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfOiIgIC1lICIvXkA8OkAwMTIzNDU2Nzg5QDo+QC9zL14vXy8iYAotYWNfcHJlZml4X2NvbmZfSU5QPWBlY2hvIF9gCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIl8kYWNfZmlsZSIgPSBfOiAmJiBjb250aW51ZQotICAgICB0ZXN0IC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiAmJiBjb250aW51ZQotICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAgICouaCkgdGVzdCAtZiAkYWNfZmlsZSAmJiBhY19wcmVmaXhfY29uZl9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBjYXNlICIkYWNfcHJlZml4X2NvbmZfT1VUIiBpbgotICAgICAgKi8qKSBhY19wcmVmaXhfY29uZl9JTlA9YGJhc2VuYW1lICIkYWNfcHJlZml4X2NvbmZfT1VUImAKLSAgICAgIDs7Ci0gICAgICAqLSopIGFjX3ByZWZpeF9jb25mX0lOUD1gZWNobyAiJGFjX3ByZWZpeF9jb25mX09VVCIgfCBzZWQgLWUgInMvQDw6QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5X0A6PkAqLS8vImAKLSAgICAgIDs7Ci0gICAgICAqKSBhY19wcmVmaXhfY29uZl9JTlA9Y29uZmlnLmgKLSAgICAgIDs7Ci0gICBlc2FjCi1maQotaWYgdGVzdCAteiAiJGFjX3ByZWZpeF9jb25mX1BLRyIgOyB0aGVuCi0gICBhc19mbl9lcnJvciAkPyAibm8gcHJlZml4IGZvciBfUFJFRklYX1BLR19DT05GSUdfSCIgIiRMSU5FTk8iIDUKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4KLSAgICAgYWNfcHJlZml4X2NvbmZfSU5QPSIkc3JjZGlyLyRhY19wcmVmaXhfY29uZl9JTlAiCi0gIGZpIGZpCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNjt9Ci0gIGlmIHRlc3QgLWYgJGFjX3ByZWZpeF9jb25mX0lOUCA7IHRoZW4KLSAgICBlY2hvICJzL0AlOkB1bmRlZiAgKlxcKEA8OkBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9AOj5AXFwpL0AlOkB1bmRlZiAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxLyIgPiBjb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QHVuZGVmICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AXFwpL0AlOkB1bmRlZiAkX0xPVyIiX1xcMS8iID4+IF9zY3JpcHQKLSAgICBlY2hvICJzL0AlOkBkZWZpbmUgICpcXChAPDpAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfQDo+QEA8OkBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV9AOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMSBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGRlZmluZSAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxIFxcMiBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGVuZGlmLyIgPj5jb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIkAlOkBkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIkAlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX0RFRiIgICAgICA+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZGVmaW5lICRhY19wcmVmaXhfY29uZl9ERUYgMSIgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvIC8nKicgJGFjX3ByZWZpeF9jb25mX09VVC4gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGNvbmZpZ3VyZS4gJyonLyA+PiR0bXAvcGNvbmZpZy5oCi0KLSAgICBzZWQgLWYgY29uZnRlc3QucHJlZml4ICRhY19wcmVmaXhfY29uZl9JTlAgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcvKiBvbmNlOicgJGFjX3ByZWZpeF9jb25mX0RFRiAnKi8nID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZW5kaWYiID4+JHRtcC9wY29uZmlnLmgKLSAgICBpZiBjbXAgLXMgJGFjX3ByZWZpeF9jb25mX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfcHJlZml4X2NvbmZfT1VUIiB8fAotJGFzX2V4cHIgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19wcmVmaXhfY29uZl9PVVQiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gICAgICBybSAtZiAiJGFjX3ByZWZpeF9jb25mX09VVCIKLSAgICAgIG12ICR0bXAvcGNvbmZpZy5oICIkYWNfcHJlZml4X2NvbmZfT1VUIgotICAgIGZpCi0gICAgY3AgY29uZnRlc3QucHJlZml4IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgYXNfZm5fZXJyb3IgJD8gImlucHV0IGZpbGUgJGFjX3ByZWZpeF9jb25mX0lOUCBkb2VzIG5vdCBleGlzdCAtIHNraXAgZ2VuZXJhdGluZyAkYWNfcHJlZml4X2NvbmZfT1VUIiAiJExJTkVOTyIgNQotICBmaQotICBybSAtZiBjb25mdGVzdC4qCi1maQotIDs7Ci0gICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCB7Ci0gICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCi0gICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKLSAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCi0gIGNhc2UgJENPTkZJR19GSUxFUyBpbgotICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OwotICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKLSAgZXNhYwotICBzaGlmdAotICBmb3IgbWYKLSAgZG8KLSAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKLSRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRmaWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciOkMpIGNobW9kIGEreCBsaWJ2bmNzZXJ2ZXItY29uZmlnIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi1hc19mbl9leGl0IDAKLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLQotdGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0KLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgotIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0jIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCi0jIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAotIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCi0jIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGFjX2NzX3N1Y2Nlc3M9OgotICBhY19jb25maWdfc3RhdHVzX2FyZ3M9Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCi0gIGV4ZWMgNT4vZGV2L251bGwKLSAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotICBleGVjIDU+PmNvbmZpZy5sb2cKLSAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKLSAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgMQotZmkKLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQotZmkKLQotY2htb2QgYSt4IC4vbGlidm5jc2VydmVyLWNvbmZpZwotCmRpZmYgLS1naXQgYS9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMSBiL2F1dG9tNHRlLmNhY2hlL291dHB1dC4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRmMmFlLi4wMDAwMDAwCi0tLSBhL2F1dG9tNHRlLmNhY2hlL291dHB1dC4xCisrKyAvZGV2L251bGwKQEAgLTEsMjY1NzEgKzAsMCBAQAotQCU6QCEgL2Jpbi9zaAotQCU6QCBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotQCU6QCBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIExpYlZOQ1NlcnZlciAwLjkuOS4KLUAlOkAKLUAlOkAgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyPi4KLUAlOkAgCi1AJTpAIAotQCU6QCBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQCU6QCAKLUAlOkAgCi1AJTpAIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1AJTpAIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiBAJTpAKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7IEAlOkAoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0KLQotYXNfbmw9JwotJwotZXhwb3J0IGFzX25sCi0jIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgotYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLSMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAotIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KLWlmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKLSAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50IC1yIC0tJwotICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKLWVsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnRmICVzXG4nCi0gIGFzX2VjaG9fbj0ncHJpbnRmICVzJwotZWxzZQotICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJwotICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKLSAgZWxzZQotICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCi0gICAgYXNfZWNob19uX2JvZHk9J2V2YWwKLSAgICAgIGFyZz0kMTsKLSAgICAgIGNhc2UgJGFyZyBpbiBAJTpAKAotICAgICAgKiIkYXNfbmwiKikKLQlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKLQlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OwotICAgICAgZXNhYzsKLSAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKLSAgICAnCi0gICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Ci0gICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKLSAgZmkKLSAgZXhwb3J0IGFzX2VjaG9fYm9keQotICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCi1maQotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIFBBVEhfU0VQQVJBVE9SPToKLSAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgewotICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gICAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgfQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1hc19teXNlbGY9Ci1jYXNlICQwIGluIEAlOkAoKAotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIGV4aXQgMQotZmkKLQotIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgotIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgotIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAotIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KLWZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKLWRvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCi0gICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1MQ19BTEw9QwotZXhwb3J0IExDX0FMTAotTEFOR1VBR0U9QwotZXhwb3J0IExBTkdVQUdFCi0KLSMgQ0RQQVRILgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0jIFVzZSBhIHByb3BlciBpbnRlcm5hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbnN1cmUgd2UgZG9uJ3QgZmFsbAotICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCi0gIGlmIHRlc3QgeCIke19hc19jYW5fcmVleGVjfSIgIT0geG5vICYmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gICAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYzsKLSAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQotIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KLSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0jIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCi1CQVNIX0VOVj0vZGV2L251bGwKLUVOVj0vZGV2L251bGwKLSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotY2FzZSAkLSBpbiBAJTpAICgoKCgKLSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7Ci0gICp2KiApIGFzX29wdHM9LXYgOzsKLSAgKngqICkgYXNfb3B0cz0teCA7OwotICAqICkgYXNfb3B0cz0gOzsKLWVzYWMKLWV4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci0jIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKLSMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KLSRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKLWFzX2ZuX2V4aXQgMjU1Ci0gIGZpCi0gICMgV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHByb3BhZ2F0ZSB0byBvdGhlciBzdWJwcm9jZXNzZXMuCi0gICAgICAgICAgeyBfYXNfY2FuX3JlZXhlYz07IHVuc2V0IF9hc19jYW5fcmVleGVjO30KLWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KLSAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiBAJTpAKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7IEAlOkAoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0iCi0gIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Ci1hc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KLWFzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQotYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQotCi1leGl0Y29kZT0wCi1hc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9Ci1pZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6Ci0gIAotZWxzZQotICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi10ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxCi10ZXN0IC14IC8gfHwgZXhpdCAxIgotICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTwotICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCi0gIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKLXRlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxIgotICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBhc19oYXZlX3JlcXVpcmVkPXllcwotZWxzZQotICBhc19oYXZlX3JlcXVpcmVkPW5vCi1maQotICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIAotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1hc19mb3VuZD1mYWxzZQotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBhc19mb3VuZD06Ci0gIGNhc2UgJGFzX2RpciBpbiBAJTpAKAotCSAvKikKLQkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCi0JICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCi0JICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCi0JICAgICBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcwotCQkgICBpZiB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19zdWdnZXN0ZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBicmVhayAyCi1maQotZmkKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi0gIGFzX2ZvdW5kPWZhbHNlCi1kb25lCi0kYXNfZm91bmQgfHwgeyBpZiB7IHRlc3QgLWYgIiRTSEVMTCIgfHwgdGVzdCAtZiAiJFNIRUxMLmV4ZSI7IH0gJiYKLQkgICAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJFNIRUxMIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWZpOyB9Ci1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICAgICAgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKLSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCi0jIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgotIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgotQkFTSF9FTlY9L2Rldi9udWxsCi1FTlY9L2Rldi9udWxsCi0odW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKLWNhc2UgJC0gaW4gQCU6QCAoKCgoCi0gICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OwotICAqdiogKSBhc19vcHRzPS12IDs7Ci0gICp4KiApIGFzX29wdHM9LXggOzsKLSAgKiApIGFzX29wdHM9IDs7Ci1lc2FjCi1leGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQotIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCi0jIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCi0kYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCi1leGl0IDI1NQotZmkKLQotICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgotICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKLSAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KLSAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKLSAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCi0gIGVsc2UKLSAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFuZAotJDA6IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIGFib3V0IHlvdXIKLSQwOiBzeXN0ZW0sIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0kMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KLSQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgotICBmaQotICBleGl0IDEKLWZpCi1maQotZmkKLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1leHBvcnQgU0hFTEwKLSMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgotQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KLXVuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUwotCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1AJTpAIGFzX2ZuX3Vuc2V0IFZBUgotQCU6QCAtLS0tLS0tLS0tLS0tLS0KLUAlOkAgUG9ydGFibHkgdW5zZXQgVkFSLgotYXNfZm5fdW5zZXQgKCkKLXsKLSAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQotfQotYXNfdW5zZXQ9YXNfZm5fdW5zZXQKLQotQCU6QCBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBTZXQgQFN8QD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCi1hc19mbl9zZXRfc3RhdHVzICgpCi17Ci0gIHJldHVybiAkMQotfSBAJTpAIGFzX2ZuX3NldF9zdGF0dXMKLQotQCU6QCBhc19mbl9leGl0IFNUQVRVUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCi1hc19mbl9leGl0ICgpCi17Ci0gIHNldCArZQotICBhc19mbl9zZXRfc3RhdHVzICQxCi0gIGV4aXQgJDEKLX0gQCU6QCBhc19mbl9leGl0Ci0KLUAlOkAgYXNfZm5fbWtkaXJfcAotQCU6QCAtLS0tLS0tLS0tLS0tCi1AJTpAIENyZWF0ZSAiQFN8QGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KLWFzX2ZuX21rZGlyX3AgKCkKLXsKLQotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKLQotCi19IEAlOkAgYXNfZm5fbWtkaXJfcAotCi1AJTpAIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KLWFzX2ZuX2V4ZWN1dGFibGVfcCAoKQotewotICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCi19IEAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wCi1AJTpAIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi1AJTpAIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLUAlOkAgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLUAlOkAgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi1AJTpAIGFzX2ZuX2FyaXRoIEFSRy4uLgotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotQCU6QCBnbG9iYWwgQFN8QGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi1AJTpAIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzIEBTfEAoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotQCU6QCBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgT3V0cHV0ICJgYmFzZW5hbWUgQFN8QDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCi1AJTpAIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKLUAlOkAgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCi1hc19mbl9lcnJvciAoKQotewotICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkNCI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0Ci0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCi0gIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cwotfSBAJTpAIGFzX2ZuX2Vycm9yCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTyBhc19saW5lbm9fMWE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCi0gIGV2YWwgJ3Rlc3QgIngkYXNfbGluZW5vXzEnJGFzX3J1biciICE9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xJyRhc19ydW4nICsgMWAiID0gIngkYXNfbGluZW5vXzInJGFzX3J1biciJyB8fCB7Ci0gICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7IGFzX2ZuX2V4aXQgMTsgfQotCi0gICMgSWYgd2UgaGFkIHRvIHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMLCB3ZSdyZSBlbnN1cmVkIHRvIGhhdmUKLSAgIyBhbHJlYWR5IGRvbmUgdGhhdCwgc28gZW5zdXJlIHdlIGRvbid0IHRyeSB0byBkbyBzbyBhZ2FpbiBhbmQgZmFsbAotICAjIGluIGFuIGluZmluaXRlIGxvb3AuICBUaGlzIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGluIHByYWN0aWNlLgotICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXBSJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXBSJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCi1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWFzX3Rlc3RfeD0ndGVzdCAteCcKLWFzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLQotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotY2FzZSBYJEVDSE8gaW4KLVgqLS1mYWxsYmFjay1lY2hvKQotICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgotICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFwkXFwkMCwnJDAnLCdgCi0gIDs7Ci1lc2FjCi0KLWVjaG89JHtFQ0hPLWVjaG99Ci1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KLSMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgZWNobz0ncHJpbnQgLXInCi0gICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKLQkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICVzXG4nCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAotCSAgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICIkMCIgJHsxKyIkQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQotIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCi1FQ0hPPSRlY2hvCi1pZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFwkMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotCi0KLQotCi10YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1DWFgKLQotdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3Ci0KLXRlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKLWV4ZWMgNj4mMQotCi0jIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCQCZ0QE9CSlM9Ci1jcm9zc19jb21waWxpbmc9bm8KLXN1YmRpcnM9Ci1NRkxBR1M9Ci1NQUtFRkxBR1M9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdMaWJWTkNTZXJ2ZXInCi1QQUNLQUdFX1RBUk5BTUU9J2xpYnZuY3NlcnZlcicKLVBBQ0tBR0VfVkVSU0lPTj0nMC45LjknCi1QQUNLQUdFX1NUUklORz0nTGliVk5DU2VydmVyIDAuOS45JwotUEFDS0FHRV9CVUdSRVBPUlQ9J2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyJwotUEFDS0FHRV9VUkw9JycKLQotIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1RETElCX0gKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0jICBpbmNsdWRlIDxtZW1vcnkuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIgotCi1hY19zdWJzdF92YXJzPSdhbV9fRVhFRVhUX0ZBTFNFCi1hbV9fRVhFRVhUX1RSVUUKLUxUTElCT0JKUwotUlBNU09VUkNFRElSCi1XSVRIX1gxMVZOQ19GQUxTRQotV0lUSF9YMTFWTkNfVFJVRQotSEFWRV9SUE1fRkFMU0UKLUhBVkVfUlBNX1RSVUUKLUFORFJPSURfRkFMU0UKLUFORFJPSURfVFJVRQotT1NYX0ZBTFNFCi1PU1hfVFJVRQotTElOVVhfRkFMU0UKLUxJTlVYX1RSVUUKLUNZR0lQQ19GQUxTRQotQ1lHSVBDX1RSVUUKLUxJQkAmdEBPQkpTCi1IQVZFX0dOVVRMU19GQUxTRQotSEFWRV9HTlVUTFNfVFJVRQotR05VVExTX0xJQlMKLUdOVVRMU19DRkxBR1MKLUxJQkdDUllQVF9MSUJTCi1MSUJHQ1JZUFRfQ0ZMQUdTCi1MSUJHQ1JZUFRfQ09ORklHCi1XU09DS0xJQgotTUlOR1dfRkFMU0UKLU1JTkdXX1RSVUUKLUhBVkVfTElCR1RLX0ZBTFNFCi1IQVZFX0xJQkdUS19UUlVFCi1HVEtfTElCUwotR1RLX0NGTEFHUwotUEtHX0NPTkZJR19MSUJESVIKLVBLR19DT05GSUdfUEFUSAotUEtHX0NPTkZJRwotU0RMX0xJQlMKLVNETF9DRkxBR1MKLUhBVkVfTElCU0RMX0ZBTFNFCi1IQVZFX0xJQlNETF9UUlVFCi1IQVZFX0xJQlBOR19GQUxTRQotSEFWRV9MSUJQTkdfVFJVRQotSEFWRV9MSUJKUEVHX0ZBTFNFCi1IQVZFX0xJQkpQRUdfVFJVRQotSEFWRV9MSUJaX0ZBTFNFCi1IQVZFX0xJQlpfVFJVRQotV0lUSF9XRUJTT0NLRVRTX0ZBTFNFCi1XSVRIX1dFQlNPQ0tFVFNfVFJVRQotV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0UKLVdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUUKLUhBVkVfTElCUFRIUkVBRF9GQUxTRQotSEFWRV9MSUJQVEhSRUFEX1RSVUUKLUpQRUdfTERGTEFHUwotSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFCi1IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRQotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUwotT1NYX09QRU5HTF9GQUxTRQotT1NYX09QRU5HTF9UUlVFCi1BVkFISV9MSUJTCi1BVkFISV9DRkxBR1MKLUhBVkVfWDExX0ZBTFNFCi1IQVZFX1gxMV9UUlVFCi1YX0VYVFJBX0xJQlMKLVhfTElCUwotWF9QUkVfTElCUwotWF9DRkxBR1MKLVhNS01GCi1IQVZFX0xJQlNTTF9GQUxTRQotSEFWRV9MSUJTU0xfVFJVRQotU1NMX0xJQlMKLUNSWVBUX0xJQlMKLUhBVkVfTVAzTEFNRV9GQUxTRQotSEFWRV9NUDNMQU1FX1RSVUUKLVdJVEhfRkZNUEVHX0ZBTFNFCi1XSVRIX0ZGTVBFR19UUlVFCi13aXRoX2ZmbXBlZwotTElCVE9PTAotYWNfY3RfRjc3Ci1GRkxBR1MKLUY3NwotQ1hYQ1BQCi1hbV9fZmFzdGRlcENYWF9GQUxTRQotYW1fX2Zhc3RkZXBDWFhfVFJVRQotQ1hYREVQTU9ERQotYWNfY3RfQ1hYCi1DWFhGTEFHUwotQ1hYCi1DUFAKLU9CSkRVTVAKLUFTCi1ETExUT09MCi1SQU5MSUIKLUFSCi1FQ0hPCi1MTl9TCi1FR1JFUAotR1JFUAotaG9zdF9vcwotaG9zdF92ZW5kb3IKLWhvc3RfY3B1Ci1ob3N0Ci1idWlsZF9vcwotYnVpbGRfdmVuZG9yCi1idWlsZF9jcHUKLWJ1aWxkCi1hbV9fZmFzdGRlcENDX0ZBTFNFCi1hbV9fZmFzdGRlcENDX1RSVUUKLUNDREVQTU9ERQotYW1fX25vZGVwCi1BTURFUEJBQ0tTTEFTSAotQU1ERVBfRkFMU0UKLUFNREVQX1RSVUUKLWFtX19xdW90ZQotYW1fX2luY2x1ZGUKLURFUERJUgotT0JKRVhUCi1FWEVFWFQKLWFjX2N0X0NDCi1DUFBGTEFHUwotTERGTEFHUwotQ0ZMQUdTCi1DQwotQU1fQkFDS1NMQVNICi1BTV9ERUZBVUxUX1ZFUkJPU0lUWQotQU1fREVGQVVMVF9WCi1BTV9WCi1hbV9fdW50YXIKLWFtX190YXIKLUFNVEFSCi1hbV9fbGVhZGluZ19kb3QKLVNFVF9NQUtFCi1BV0sKLW1rZGlyX3AKLU1LRElSX1AKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotU1RSSVAKLWluc3RhbGxfc2gKLU1BS0VJTkZPCi1BVVRPSEVBREVSCi1BVVRPTUFLRQotQVVUT0NPTkYKLUFDTE9DQUwKLVZFUlNJT04KLVBBQ0tBR0UKLUNZR1BBVEhfVwotYW1fX2lzcmMKLUlOU1RBTExfREFUQQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfUFJPR1JBTQotdGFyZ2V0X2FsaWFzCi1ob3N0X2FsaWFzCi1idWlsZF9hbGlhcwotTElCUwotRUNIT19UCi1FQ0hPX04KLUVDSE9fQwotREVGUwotbWFuZGlyCi1sb2NhbGVkaXIKLWxpYmRpcgotcHNkaXIKLXBkZmRpcgotZHZpZGlyCi1odG1sZGlyCi1pbmZvZGlyCi1kb2NkaXIKLW9sZGluY2x1ZGVkaXIKLWluY2x1ZGVkaXIKLWxvY2Fsc3RhdGVkaXIKLXNoYXJlZHN0YXRlZGlyCi1zeXNjb25mZGlyCi1kYXRhZGlyCi1kYXRhcm9vdGRpcgotbGliZXhlY2Rpcgotc2JpbmRpcgotYmluZGlyCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1wcmVmaXgKLWV4ZWNfcHJlZml4Ci1QQUNLQUdFX1VSTAotUEFDS0FHRV9CVUdSRVBPUlQKLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9OQU1FCi1QQVRIX1NFUEFSQVRPUgotU0hFTEwnCi1hY19zdWJzdF9maWxlcz0nJwotYWNfdXNlcl9vcHRzPScKLWVuYWJsZV9vcHRpb25fY2hlY2tpbmcKLWVuYWJsZV9zaWxlbnRfcnVsZXMKLWVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCi1lbmFibGVfc2hhcmVkCi1lbmFibGVfc3RhdGljCi1lbmFibGVfZmFzdF9pbnN0YWxsCi13aXRoX2dudV9sZAotZW5hYmxlX2xpYnRvb2xfbG9jawotd2l0aF9waWMKLXdpdGhfdGFncwotd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIKLXdpdGhfd2Vic29ja2V0cwotd2l0aF8yNGJwcAotd2l0aF9mZm1wZWcKLXdpdGhfY3J5cHQKLXdpdGhfY3J5cHRvCi13aXRoX3NzbAotd2l0aF94Ci13aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIKLXdpdGhfeDExdm5jCi13aXRoX3hrZXlib2FyZAotd2l0aF94aW5lcmFtYQotd2l0aF94cmFuZHIKLXdpdGhfeGZpeGVzCi13aXRoX3hkYW1hZ2UKLXdpdGhfeHRyYXAKLXdpdGhfeHJlY29yZAotd2l0aF9mYnBtCi13aXRoX2RwbXMKLXdpdGhfdjRsCi13aXRoX2ZiZGV2Ci13aXRoX3VpbnB1dAotd2l0aF9tYWNvc3hfbmF0aXZlCi13aXRoX2F2YWhpCi13aXRoX2pwZWcKLXdpdGhfcG5nCi13aXRoX2xpYnoKLXdpdGhfemxpYgotd2l0aF9wdGhyZWFkCi13aXRoX3NkbF9jb25maWcKLXdpdGhfZ2NyeXB0Ci13aXRoX2NsaWVudF9nY3J5cHQKLXdpdGhfbGliZ2NyeXB0X3ByZWZpeAotd2l0aF9nbnV0bHMKLXdpdGhfaXB2NgotJwotICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotQ0MKLUNGTEFHUwotTERGTEFHUwotTElCUwotQ1BQRkxBR1MKLUNQUAotQ1hYCi1DWFhGTEFHUwotQ0NDCi1DWFhDUFAKLUY3NwotRkZMQUdTCi1YTUtNRgotSlBFR19MREZMQUdTCi1QS0dfQ09ORklHCi1QS0dfQ09ORklHX1BBVEgKLVBLR19DT05GSUdfTElCRElSCi1HVEtfQ0ZMQUdTCi1HVEtfTElCUwotR05VVExTX0NGTEFHUwotR05VVExTX0xJQlMnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICo9KSAgIGFjX29wdGFyZz0gOzsKLSAgKikgICAgYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAotICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KLSAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgotICAgIG5vKSA7OwotICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKLSAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgKi8gKQotICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCi0gICAgICBldmFsICRhY192YXI9XCRhY192YWw7OwotICBlc2FjCi0gICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCi1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBMaWJWTkNTZXJ2ZXIgMC45LjkgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCi0gICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KLSAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBAU3xAYWNfZGVmYXVsdF9wcmVmaXhAOj5ACi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBQUkVGSVhAOj5ACi0KLUJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgotXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKLWFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi1mb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgotCi1Gb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLQotRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgQDw6QERBVEFST09URElSL2RvYy9saWJ2bmNzZXJ2ZXJAOj5ACi0gIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVggZmVhdHVyZXM6Ci0gIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0gIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIExpYlZOQ1NlcnZlciAwLjkuOToiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgICAgICAgIGxlc3MgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MScpCi0gIC0tZGlzYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0wJykKLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotICAtLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PXllc0A6PkAKLSAgLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QCAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKLQotT3B0aW9uYWwgUGFja2FnZXM6Ci0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkAKLSAgLS13aXRoLXBpYyAgICAgICAgICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhAOj5ACi0gIC0td2l0aC10YWdzQDw6QD1UQUdTQDo+QCAgICAgIGluY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QAotICAtLXdpdGhvdXQtZmlsZXRyYW5zZmVyICBkaXNhYmxlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wKLSAgLS13aXRob3V0LXdlYnNvY2tldHMgICAgZGlzYWJsZSBXZWJTb2NrZXRzIHN1cHBvcnQKLSAgLS13aXRob3V0LTI0YnBwICAgICAgICAgZGlzYWJsZSAyNCBicHAgZnJhbWVidWZmZXJzCi0gIC0td2l0aC1mZm1wZWc9ZGlyICAgICAgIHNldCBmZm1wZWcgaG9tZSBkaXJlY3RvcnkKLSAgLS13aXRob3V0LWNyeXB0ICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBsaWJjcnlwdAotICAtLXdpdGhvdXQtY3J5cHRvICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIG9wZW5zc2wgbGliY3J5cHRvCi0gIC0td2l0aG91dC1zc2wgICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3Igb3BlbnNzbCBsaWJzc2wKLSAgLS13aXRoLXNzbD1ESVIgICAgICAgICAgdXNlIG9wZW5zc2wgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbQotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciAgICAgdXNlIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgZm9yIHgxMXZuYwotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcj1ESVIgdXNlIGxpYnZuY3NlcnZlciBpbnN0YWxsZWQgaW4gRElSIGZvciB4MTF2bmMKLSAgLS13aXRoLXgxMXZuYyAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyB0aGUgeDExdm5jIHN1YmRpciAoaWYgcHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBjZCB0byB4MTF2bmMgYW5kIHJ1biAnbWFrZScgZXRjLgotICAtLXdpdGhvdXQteGtleWJvYXJkICAgICBkaXNhYmxlIHhrZXlib2FyZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteGluZXJhbWEgICAgICBkaXNhYmxlIHhpbmVyYW1hIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmFuZHIgICAgICAgIGRpc2FibGUgeHJhbmRyIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14ZGFtYWdlICAgICAgIGRpc2FibGUgeGRhbWFnZSBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteHRyYXAgICAgICAgICBkaXNhYmxlIHh0cmFwIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmVjb3JkICAgICAgIGRpc2FibGUgeHJlY29yZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQtZmJwbSAgICAgICAgICBkaXNhYmxlIGZicG0gZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LWRwbXMgICAgICAgICAgZGlzYWJsZSBkcG1zIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC12NGwgICAgICAgICAgIGRpc2FibGUgdmlkZW80bGludXggc3VwcG9ydAotICAtLXdpdGhvdXQtZmJkZXYgICAgICAgICBkaXNhYmxlIGxpbnV4IGZiIGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC11aW5wdXQgICAgICAgIGRpc2FibGUgbGludXggdWlucHV0IGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC1tYWNvc3gtbmF0aXZlIGRpc2FibGUgTWFjT1MgWCBuYXRpdmUgZGlzcGxheSBzdXBwb3J0Ci0gIC0td2l0aG91dC1hdmFoaSAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgQXZhaGkvbUROUwotICAtLXdpdGgtYXZhaGk9RElSICAgICAgICB1c2UgYXZhaGkgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtanBlZyAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGpwZWcKLSAgLS13aXRoLWpwZWc9RElSICAgICAgICAgdXNlIGpwZWcgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtcG5nICAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIHBuZwotICAtLXdpdGgtcG5nPURJUiAgICAgICAgICB1c2UgcG5nIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWxpYnogICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBkZWZsYXRlCi0gIC0td2l0aG91dC16bGliICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgZGVmbGF0ZQotICAtLXdpdGgtemxpYj1ESVIgICAgICAgICB1c2UgemxpYiBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1wdGhyZWFkICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgbGlicHRocmVhZAotICAtLXdpdGgtc2RsLWNvbmZpZz1GSUxFCi0gICAgVXNlIHRoZSBnaXZlbiBwYXRoIHRvIHNkbC1jb25maWcgd2hlbiBkZXRlcm1pbmluZwotICAgIFNETCBjb25maWd1cmF0aW9uOyBkZWZhdWx0cyB0byAic2RsLWNvbmZpZyIKLSAgLS13aXRob3V0LWdjcnlwdCAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQKLSAgLS13aXRob3V0LWNsaWVudC1nY3J5cHQgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQgaW4gbGlidm5jY2xpZW50Ci0gIC0td2l0aC1saWJnY3J5cHQtcHJlZml4PVBGWCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IHdoZXJlIExJQkdDUllQVCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKQotICAtLXdpdGhvdXQtZ251dGxzICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGdudXRscwotICAtLXdpdGgtZ251dGxzPURJUiAgICAgICB1c2UgZ251dGxzIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWlwdjYgICAgICAgICAgZGlzYWJsZSBJUHY2IHN1cHBvcnQKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLSAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCi0gIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKLSAgRjc3ICAgICAgICAgRm9ydHJhbiA3NyBjb21waWxlciBjb21tYW5kCi0gIEZGTEFHUyAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgZmxhZ3MKLSAgWE1LTUYgICAgICAgUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW0KLSAgSlBFR19MREZMQUdTIAotICAgICAgICAgICAgICBMaW5rZXIgZmxhZ3MgdG8gdXNlIHdoZW4gbGlua2luZyB3aXRoIGxpYmpwZWcsIGUuZy4KLSAgICAgICAgICAgICAgLUwvZm9vL2Rpci9saWIgLVdsLC1zdGF0aWMgLWxqcGVnIC1XbCwtc2hhcmVkLiBUaGlzIG92ZXJyaWRlcwotICAgICAgICAgICAgICB0aGUgbGlua2VyIGZsYWdzIHNldCBieSAtLXdpdGgtanBlZy4KLSAgUEtHX0NPTkZJRyAgcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHkKLSAgUEtHX0NPTkZJR19QQVRIIAotICAgICAgICAgICAgICBkaXJlY3RvcmllcyB0byBhZGQgdG8gcGtnLWNvbmZpZydzIHNlYXJjaCBwYXRoCi0gIFBLR19DT05GSUdfTElCRElSIAotICAgICAgICAgICAgICBwYXRoIG92ZXJyaWRpbmcgcGtnLWNvbmZpZydzIGJ1aWx0LWluIHNlYXJjaCBwYXRoCi0gIEdUS19DRkxBR1MgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIEdUSywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCi0gIEdUS19MSUJTICAgIGxpbmtlciBmbGFncyBmb3IgR1RLLCBvdmVycmlkaW5nIHBrZy1jb25maWcKLSAgR05VVExTX0NGTEFHUyAKLSAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgR05VVExTLCBvdmVycmlkaW5nIHBrZy1jb25maWcKLSAgR05VVExTX0xJQlMgbGlua2VyIGZsYWdzIGZvciBHTlVUTFMsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZwotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1SZXBvcnQgYnVncyB0byA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXI+LgotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAotICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8Ci0gICAgICBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotTGliVk5DU2VydmVyIGNvbmZpZ3VyZSAwLjkuOQotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5Ci0KLUNvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi1AJTpAIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKLQotQCU6QCBhY19mbl9jX3RyeV9saW5rIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgewotCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAotCSB0ZXN0IC14IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCi0gICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKLSAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKLSAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgotICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9jX3RyeV9jcHAgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICAgYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2NwcAotCi1AJTpAIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMsIGdpdmluZyBhIHdhcm5pbmcgaWYgaXQgY2Fubm90IGJlIGNvbXBpbGVkIHVzaW5nCi1AJTpAIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKLUAlOkAgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAotICB5ZXM6bm86ICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotKCAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIFJlcG9ydCB0aGlzIHRvIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgotICAgIDs7Ci1lc2FjCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZmkKLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCi0KLUAlOkAgYWNfZm5fY190cnlfcnVuIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcwotQCU6QCB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KLWFjX2ZuX2NfdHJ5X3J1biAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cwotZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jX3RyeV9ydW4KLQotQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KLUAlOkAgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiQzPXllcyIKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQotCi1AJTpAIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKLWFjX2ZuX2NfY2hlY2tfZnVuYyAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICQyIGlubm9jdW91c18kMgotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkMgotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICQyICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkMiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja19mdW5jCi0KLUAlOkAgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKLQotQCU6QCBhY19mbl9jeHhfdHJ5X2NwcCBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgIGFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2NwcAotCi1AJTpAIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jeHhfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fZjc3X3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2Y3N190cnlfY29tcGlsZQotCi1AJTpAIGFjX2ZuX2Y3N190cnlfbGluayBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9mNzdfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9mNzdfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKLUAlOkAgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja190eXBlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCQyKSkKLQkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLWludAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoKCQyKSkpCi0JICAgIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICBldmFsICIkMz15ZXMiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja190eXBlCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSBMaWJWTkNTZXJ2ZXIgJGFzX21lIDAuOS45LCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gICQgJDAgJEAKLQotX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLWNhdCA8PF9BU1VOQU1FCi0jIyAtLS0tLS0tLS0gIyMKLSMjIFBsYXRmb3JtLiAjIwotIyMgLS0tLS0tLS0tICMjCi0KLWhvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotCi1fQVNVTkFNRQotCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAkYWNfcGFzcyBpbgotICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7Ci0gICAgMikKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCi0gICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KLQlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCi0gICAgICBlbHNlCi0JY2FzZSAkYWNfYXJnIGluCi0JICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKLQkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKLQkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKLQkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQotCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KLQkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWRvbmUKLXsgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KLXsgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KLQotIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQotIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKLSMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgotIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCi0jIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCi10cmFwICdleGl0X3N0YXR1cz0kPwotICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KLSAgewotICAgIGVjaG8KLQotICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjIgotICAgIGVjaG8KLSAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAotICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLSAgICAgIGVzYWMKLSAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICBkb25lIHwgc29ydAotICAgIGVjaG8KLQotICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKLSAgICAgIGRvCi0JZXZhbCBhY192YWw9XCQkYWNfdmFyCi0JY2FzZSAkYWNfdmFsIGluCi0JKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgICBkb25lIHwgc29ydAotICAgICAgZWNobwotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIwotIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgY2F0IGNvbmZkZWZzLmgKLSAgICAgIGVjaG8KLSAgICBmaQotICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0kYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCi0KLSMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKLV9BQ0VPRgotCi0KLSMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgotIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWFjX3NpdGVfZmlsZTE9Tk9ORQotYWNfc2l0ZV9maWxlMj1OT05FCi1pZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCi0gIGNhc2UgJENPTkZJR19TSVRFIGluIEAlOkAoKAotICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7Ci0gICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7Ci0gICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKLWVsc2UKLSAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKLSAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKLWRvCi0gIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIiBcCi0gICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKLSAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KLSAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0gICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICA+JGNhY2hlX2ZpbGUKLWZpCi0KLSMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKLSMgdmFsdWUuCi1hY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQotICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgc2V0LCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLHNldCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsKTs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KLQkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KLQlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKLQlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKLQlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBhY19jYWNoZV9jb3JydXB0ZWQ9OgotCWVsc2UKLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBmaQotZG9uZQotaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKLWZpCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTEnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQotZmkKLQotIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0jIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCi0jIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKLSMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLWFjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLSMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbiBAJTpAKCgKLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0JICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCi0JICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCi0JICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgotCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCi0JICAgIHRoZW4KLQkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgICAgYnJlYWsgMwotCSAgICBmaQotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQotJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICIgPiY2OyB9Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQotIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgotYW1fbGY9JwotJwotY2FzZSBgcHdkYCBpbgotICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXSopCi0gICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1jYXNlICRzcmNkaXIgaW4KLSAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldKikKLSAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIHNyY2RpciB2YWx1ZTogXGAkc3JjZGlyJyIgIiRMSU5FTk8iIDU7OwotZXNhYwotCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgRG91YmxlIGFueSBcIG9yICQuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJwotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OwotICAqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OwotICBlc2FjCi1maQotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQotZmkKLQotaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OwotICAqKQotICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgotICBlc2FjCi1maQotCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVNUUklQPSRhY19jdl9wcm9nX1NUUklQCi1pZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQotJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCi0gIGFjX2N0X1NUUklQPSRTVFJJUAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU1RSSVA9JGFjX2N0X1NUUklQCi0gIGZpCi1lbHNlCi0gIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKLWZpCi0KLWZpCi1JTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KLSAgaWYgJHthY19jdl9wYXRoX21rZGlyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi9vcHQvc2Z3L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLQotICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQotJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQVdLPSRhY19jdl9wcm9nX0FXSwotaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQotJGFzX2VjaG8gIiRBV0siID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhawotZG9uZQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9Ci1hY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotU0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9BQ0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gInNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiAiJExJTkVOTyIgNQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi0gUEFDS0FHRT1MaWJWTkNTZXJ2ZXIKLSBWRVJTSU9OPTAuOS45Ci0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLV9BQ0VPRgotCi0gCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotX0FDRU9GCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLQotQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQotCi0KLUFVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KLQotCi1NQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KLQotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi0jIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAotIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCi1BTVRBUj0nJCR7VEFSLXRhcn0nCi0KLWFtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbGVudC1ydWxlcyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaWxlbnRfcnVsZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zaWxlbnRfcnVsZXM7IAotZmkKLQotY2FzZSAkZW5hYmxlX3NpbGVudF9ydWxlcyBpbgoteWVzKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0wOzsKLW5vKSAgQU1fREVGQVVMVF9WRVJCT1NJVFk9MTs7Ci0qKSAgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTA7OwotZXNhYwotYW1fbWFrZT0ke01BS0UtbWFrZX0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkYW1fbWFrZSBzdXBwb3J0cyBuZXN0ZWQgdmFyaWFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJGFtX21ha2Ugc3VwcG9ydHMgbmVzdGVkIHZhcmlhYmxlcy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmICRhc19lY2hvICdUUlVFPSQoQkFSJChWKSkKLUJBUjA9ZmFsc2UKLUJBUjE9dHJ1ZQotVj0xCi1hbV9fZG9pdDoKLQlAJChUUlVFKQotLlBIT05ZOiBhbV9fZG9pdCcgfCAkYW1fbWFrZSAtZiAtID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz15ZXMKLWVsc2UKLSAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9bm8KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyIgPiY1Ci0kYXNfZWNobyAiJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzIiA+JjY7IH0KLWlmIHRlc3QgJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzID0geWVzOyB0aGVuCi0gICAgQU1fVj0nJChWKScKLSAgQU1fREVGQVVMVF9WPSckKEFNX0RFRkFVTFRfVkVSQk9TSVRZKScKLWVsc2UKLSAgQU1fVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLSAgQU1fREVGQVVMVF9WPSRBTV9ERUZBVUxUX1ZFUkJPU0lUWQotZmkKLUFNX0JBQ0tTTEFTSD0nXCcKLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyByZmJjb25maWcuaCIKLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyAiCi0KLQotYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIHJmYi9yZmJjb25maWcuaCIKLQotCi0jIENoZWNrcyBmb3IgcHJvZ3JhbXMuCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBhY19wcm9nX3JlamVjdGVkPW5vCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkQCU6QCAhPSAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLSAgZG8KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1maQotCi1maQotCi0KLXRlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1zZXQgWCAkYWNfY29tcGlsZQotYWNfY29tcGlsZXI9JDIKLWZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KLSAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBzZWQgJzEwYVwKLS4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KLSAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci1kb25lCi0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKLSMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KLSMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSMgb2YgZXhlZXh0LgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0KLSMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKLWFjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCi0KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLQlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVsc2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4KLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQotaWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0kYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9Ci1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotCi1ybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9Ci1pZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSAgYnJlYWs7OwotICAgICogKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKLSByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgICBmaQotICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLSRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi1ybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9Ci1PQkpFWFQ9JGFjX2N2X29iamV4dAotYWNfb2JqZXh0PSRPQkpFWFQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgQ0ZMQUdTPSIiCi0gICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLXN0cnVjdCBzdGF0OwotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKLSAgCi1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1ERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCi0KLWFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKLQotCi1hbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0Ci0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KLWNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0qdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICBhbV9fcXVvdGU9Ci0gIF9hbV9yZXN1bHQ9R05VCi0gIDs7Ci1lc2FjCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0gICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgICAgOzsKLSAgIGVzYWMKLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkX2FtX3Jlc3VsdCIgPiY2OyB9Ci1ybSAtZiBjb25maW5jIGNvbmZtZgotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZzsgCi1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi0gIGFtX19ub2RlcD0nX25vJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQotQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZiAKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlci4uLiAiID4mNjsgfQotZmkKLXNldCBkdW1teSAkQ0M7IGFjX2NjPWAkYXNfZWNobyAiJDIiIHwKLQkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIGV2YWwgXCR7YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYKLSAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OwotdGhlbgotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPXllcwotICBpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgICAjIFRlc3QgZmlyc3QgdGhhdCBjYyBleGlzdHMgYXQgYWxsLgotICAgIGlmIHsgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgotCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsKLSAgICAgIHRoZW4KLQkjIGNjIHdvcmtzIHRvby4KLQk6Ci0gICAgICBlbHNlCi0JIyBjYyBleGlzdHMgYnV0IGRvZXNuJ3QgbGlrZSAtby4KLQlldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28gPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYW1fY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KLWlmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0JQ0NMRD0iXCQoQ0MpIgotZWxzZQotCUNDTEQ9IiRDQyIKLWZpCi10ZXN0ICJ4JEdDQyIgPSAieHllcyIgJiYgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OwotICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0gICAgKikKLSAgICAgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zdGF0aWM9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZmFzdF9pbnN0YWxsOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLSAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9idWlsZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKLWFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQotY2FzZSAkYWNfY3ZfYnVpbGQgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaG9zdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCi0gIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCi1lbHNlCi0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KLWNhc2UgJGFjX2N2X2hvc3QgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1OzsKLWVzYWMKLWhvc3Q9JGFjX2N2X2hvc3QKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9ob3N0Ci1zaGlmdAotaG9zdF9jcHU9JDEKLWhvc3RfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotaG9zdF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9TRUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KLSMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotbHRfYWNfbWF4PTAKLWx0X2FjX2NvdW50PTAKLSMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCi0jIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCi0gIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCi0gIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgotICBsdF9hY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgotICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgYnJlYWsKLSAgZmkKLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAotICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgotICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCi0gICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCi0gICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKLSAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCi0gICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgotICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGZpCi0gIGRvbmUKLWRvbmUKLQotZmkKLQotU0VEPSRsdF9jdl9wYXRoX1NFRAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTRUQiID4mNQotJGFzX2VjaG8gIiRTRUQiID4mNjsgfQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCi1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKLSAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KLSBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotIAotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9FR1JFUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAotZmkKLQotICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi0gCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCA/OltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9Ci1maQotaWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCTs7Ci0gICAgICAqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkbHRfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1Ci0kYXNfZWNobyAiJExEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotdGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2xkX3JlbG9hZF9mbGFnKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQotJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9Ci1yZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKLWNhc2UgJHJlbG9hZF9mbGFnIGluCi0iIiB8ICIgIiopIDs7Ci0qKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKLWVzYWMKLXJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgZGFyd2luKikKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgIGVsc2UKLSAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBmaQotICAgIDs7Ci1lc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wYXRoX05NKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgbHRfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbiAKLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wYXRoX05NIiA+JjY7IH0KLU5NPSIkbHRfY3ZfcGF0aF9OTSIKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gIiA+JjY7IH0KLUxOX1M9JGFzX2xuX3MKLWlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1Ci0kYXNfZWNobyAibm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDQqIHwgYWl4NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpWzQ1XSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4KLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGZpCi0gIDs7Ci0KLWdudSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhwdXgxMC4yMCogfCBocHV4MTEqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCi0gICAgOzsKLSAgaHBwYSo2NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xcLmEpJCcKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkTEQgaW4KLSAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OwotICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1uZXRic2QqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW5ld29zNiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KLSAgOzsKLQotbnRvLXFueCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgOzsKLQotb3BlbmJzZCopCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc29sYXJpcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgcGMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotZXNhYwotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KLWZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi10ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLQotCi0KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOyAKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi1pYTY0LSotaHB1eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqRUxGLTMyKikKLSAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKLSAgICAgIDs7Ci0gICAgKkVMRi02NCopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotICAgICAgOzsKLSAgICBlc2FjCi0gICBlbHNlCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqMzItYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgotICAgICAgICAgIDs7Ci0gICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCi0gICAgICAgICAgOzsKLSAgICAgICAgczM5MHgtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmM2NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCi0gICAgICAgICAgOzsKLSAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgotICAgICAgICAgIDs7Ci0gICAgICAgIHMzOTAqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLSAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7Ci0gICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1ETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotICBhY19jdF9ETExUT09MPSRETExUT09MCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCi0gICAgRExMVE9PTD0iZmFsc2UiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAotICBmaQotZWxzZQotICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotZmkKLQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFTPSRhY19jdl9wcm9nX0FTCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVMiID4mNQotJGFzX2VjaG8gIiRBUyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi0gIGFjX2N0X0FTPSRBUwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVM9IiRhY19jdF9BUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUz0kYWNfY3ZfcHJvZ19hY19jdF9BUwotaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUyIgPSB4OyB0aGVuCi0gICAgQVM9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFTPSRhY19jdF9BUwotICBmaQotZWxzZQotICBBUz0iJGFjX2N2X3Byb2dfQVMiCi1maQotCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi0gIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAotaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KLSAgICBPQkpEVU1QPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCi0gIGZpCi1lbHNlCi0gIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCi1maQotCi0gIDs7Ci0gIAotZXNhYwotCi1uZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcHJvZ19DUFArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKLSAgICBkbwotICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaWZkZWYgX19TVERDX18KLUAlOkAgaW5jbHVkZSA8bGltaXRzLmg+Ci1AJTpAZWxzZQotQCU6QCBpbmNsdWRlIDxhc3NlcnQuaD4KLUAlOkBlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotICAKLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6Ci0gIAotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIAotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgOgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNlCi0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4gMjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi0KLWRvbmUKLQotCi1mb3IgYWNfaGVhZGVyIGluIGRsZmNuLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImRsZmNuLmgiICJhY19jdl9oZWFkZXJfZGxmY25faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0RMRkNOX0ggMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgotICAgIENYWD0kQ0NDCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DWFg9JGFjX2N2X3Byb2dfQ1hYCi1pZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1Ci0kYXNfZWNobyAiJENYWCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCi0gIGFjX2N0X0NYWD0kQ1hYCi0gIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKLWlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ1hYIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCi0gICAgQ1hYPSJnKysiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ1hYPSRhY19jdF9DWFgKLSAgZmkKLWZpCi0KLSAgZmkKLWZpCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2N4eF9jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgR1hYPXllcwotZWxzZQotICBHWFg9Ci1maQotYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KLWFjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY3h4X2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCi0gICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2N4eF9nPW5vCi0gICBDWFhGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2N4eF9nPXllcwotZWxzZQotICBDWFhGTEFHUz0iIgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKLQkgQ1hYRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2N4eF9nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCi0gIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgIENYWEZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDWFhGTEFHUz0KLSAgZmkKLWZpCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi1kZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KLWlmICR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNYWERFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZiAKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCi0gIGFtX19mYXN0ZGVwQ1hYX1RSVUU9Ci0gIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENYWF9UUlVFPScjJwotICBhbV9fZmFzdGRlcENYWF9GQUxTRT0KLWZpCi0KLQotCi0KLWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0gICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0gICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KLSAgaWYgJHthY19jdl9wcm9nX0NYWENQUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKLSAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaWZkZWYgX19TVERDX18KLUAlOkAgaW5jbHVkZSA8bGltaXRzLmg+Ci1AJTpAZWxzZQotQCU6QCBpbmNsdWRlIDxhc3NlcnQuaD4KLUAlOkBlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6Ci0gIGJyZWFrCi1maQotCi0gICAgZG9uZQotICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKLSAgCi1maQotICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWENQUCIgPiY1Ci0kYXNfZWNobyAiJENYWENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICAKLWVsc2UKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi1maQotCi0KLWFjX2V4dD1mCi1hY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2ZvcnRyYW4gcGdmOTUgbGY5NSBmdG4gbmFnZm9yCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRGNzciOyB0aGVuCi0gIGFjX2N2X3Byb2dfRjc3PSIkRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfRjc3PSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1GNzc9JGFjX2N2X3Byb2dfRjc3Ci1pZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEY3NyIgPiY1Ci0kYXNfZWNobyAiJEY3NyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJEY3NyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRGNzciOyB0aGVuCi0gIGFjX2N0X0Y3Nz0kRjc3Ci0gIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2ZvcnRyYW4gcGdmOTUgbGY5NSBmdG4gbmFnZm9yCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0Y3NyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19jdF9GNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0Y3Nz0kYWNfY3ZfcHJvZ19hY19jdF9GNzcKLWlmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfRjc3IiA+JjUKLSRhc19lY2hvICIkYWNfY3RfRjc3IiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0Y3NyIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0Y3NyIgPSB4OyB0aGVuCi0gICAgRjc3PSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRjc3PSRhY19jdF9GNzcKLSAgZmkKLWZpCi0KLQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEZvcnRyYW4gNzcgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1zZXQgWCAkYWNfY29tcGlsZQotYWNfY29tcGlsZXI9JDIKLWZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KLSAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBzZWQgJzEwYVwKLS4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KLSAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci1kb25lCi1ybSAtZiBhLm91dAotCi0jIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQotIyBpbnB1dCBmaWxlLiAgKE5vdGUgdGhhdCB0aGlzIG9ubHkgbmVlZHMgdG8gd29yayBmb3IgR05VIGNvbXBpbGVycy4pCi1hY19zYXZlX2V4dD0kYWNfZXh0Ci1hY19leHQ9RgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBGb3J0cmFuIDc3IGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Y3N19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0gICAgICBwcm9ncmFtIG1haW4KLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2Y3N19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1hY19leHQ9JGFjX3NhdmVfZXh0Ci1hY190ZXN0X0ZGTEFHUz0ke0ZGTEFHUytzZXR9Ci1hY19zYXZlX0ZGTEFHUz0kRkZMQUdTCi1GRkxBR1M9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfZjc3X2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBGRkxBR1M9LWcKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSAgICAgIHByb2dyYW0gbWFpbgotCi0gICAgICBlbmQKLV9BQ0VPRgotaWYgYWNfZm5fZjc3X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfZjc3X2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZjc3X2c9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19mNzdfZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2dfZjc3X2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfRkZMQUdTIiA9IHNldDsgdGhlbgotICBGRkxBR1M9JGFjX3NhdmVfRkZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfZjc3X2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KLSAgICBGRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIEZGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCi0gICAgRkZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBGRkxBR1M9Ci0gIGZpCi1maQotCi1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgRzc3PXllcwotZWxzZQotICBHNzc9Ci1maQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQotCi0jIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfc3lzX21heF9jbWRfbGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICBpPTAKLSAgdGVzdHN0cmluZz0iQUJDRCIKLQotICBjYXNlICRidWlsZF9vcyBpbgotICBtc2Rvc2RqZ3BwKikKLSAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCi0gICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgotICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAotICAgIDs7Ci0KLSAgZ251KikKLSAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKLSAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKLSAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgotICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCi0gICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQotICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KLSAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKLSAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgotICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQotICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcwotICAgIGZpCi0gICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgOzsKLQotICBpbnRlcml4KikKLSAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4Ci0gICAgOzsKLQotICBvc2YqKQotICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQotICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90Ci0gICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KLSAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKLSAgICAjCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KLSAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCi0gICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICBzY28zLjJ2NSopCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKLSAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbIAldLy8nYAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQotICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0Ci0gICAgIyB3ZSBjYW4ndCB0ZWxsLgotICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19Ci0gICAgd2hpbGUgKHRlc3QgIlgiYCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgotCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgotCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKLQkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCi0gICAgZG8KLSAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgZG9uZQotICAgIHRlc3RzdHJpbmc9Ci0gICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCi0gICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KLSAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAotICAgIDs7Ci0gIGVzYWMKLQotZmkKLQotaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIiA+JjUKLSRhc19lY2hvICJub25lIiA+JjY7IH0KLWZpCi0KLQotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJwotICBmaQotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICA7OwotbGludXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1vc2YqKQotICBzeW1jb2RlPSdbQkNERUdRUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbQkRSVF0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tEVF0nCi0gIDs7Ci1zeXN2NC4ydXcyKikKLSAgc3ltY29kZT0nW0RUXScKLSAgOzsKLXN5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gIHN5bWNvZGU9J1tBQkRUXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbREZOU1RVXScKLSAgOzsKLWVzYWMKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRidWlsZF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1jYXNlIGAkTk0gLVYgMj4mMWAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Ci1lc2FjCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLSAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZSRzeW1jb2RlKlwpWyAJXVsgCV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLQotICBybSAtZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3RcIiI7IH0gPiY1Ci0gIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfbGluaykgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmYWlsZWQiID4mNQotJGFzX2VjaG8gImZhaWxlZCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvayIgPiY1Ci0kYXNfZWNobyAib2siID4mNjsgfQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igb2JqZGlyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfb2JqZGlyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIGx0X2N2X29iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBsdF9jdl9vYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfb2JqZGlyIiA+JjUKLSRhc19lY2hvICIkbHRfY3Zfb2JqZGlyIiA+JjY7IH0KLW9iamRpcj0kbHRfY3Zfb2JqZGlyCi0KLQotCi0KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLQotIyBDb25zdGFudHM6Ci1ybT0icm0gLWYiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLQotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCi0jIHdoaWNoIG5lZWRzICcubGliJykuCi1saWJleHQ9YQotbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi13aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFSPSRhY19jdl9wcm9nX0FSCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQotJGFzX2VjaG8gIiRBUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCi0gIGFjX2N0X0FSPSRBUgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgotaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCi0gICAgQVI9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFSPSRhY19jdF9BUgotICBmaQotZWxzZQotICBBUj0iJGFjX2N2X3Byb2dfQVIiCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQotJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi1pZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0gICAgUkFOTElCPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0gIGZpCi1lbHNlCi0gIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKLSRhc19lY2hvICIkU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFNUUklQPSRhY19jdF9TVFJJUAotICBmaQotZWxzZQotICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1maQotCi0KLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLXRlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Ci10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi10ZXN0IC16ICIkQ0MiICYmIENDPWNjCi10ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKLXRlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotCSAgZmkgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKLSAgOzsKLWVzYWMKLWZpCi0KLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQotJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLWlmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1Ci0kYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBlbHNlCi0gICAgTUFHSUNfQ01EPToKLSAgZmkKLWZpCi0KLSAgZmkKLSAgOzsKLWVzYWMKLQotZW5hYmxlX2Rsb3Blbj1ubwotZW5hYmxlX3dpbjMyX2RsbD15ZXMKLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7IAotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9waWM7IHBpY19tb2RlPSIkd2l0aHZhbCIKLWVsc2UKLSAgcGljX21vZGU9ZGVmYXVsdAotZmkKLQotdGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0Ci0KLSMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Ci10YWduYW1lPQotbHRfc2F2ZV9DQz0iJENDIgotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1jCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHQ9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO31cbicKLQotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMjIENBVkVBVCBFTVBUT1I6Ci0jIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotCi1sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLWVsc2UKLSAgICA6Ci1maQotCi1maQotCi1sdF9wcm9nX2NvbXBpbGVyX3dsPQotbHRfcHJvZ19jb21waWxlcl9waWM9Ci1sdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQotIAotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGVsc2UKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWM9JytaJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZwaWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICc7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgdW5pY29zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz1ubwotICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OwotICAgICBlc2FjCi1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9Ci0gICAgOzsKLSAgKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZz0KLSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubwotICBhcmNoaXZlX2NtZHM9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHM9Ci0gIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0gIGhhcmRjb2RlX2RpcmVjdD1ubwotICBoYXJkY29kZV9taW51c19MPW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlicz11bmtub3duCi0gIGhhcmRjb2RlX2F1dG9tYXRpYz1ubwotICBtb2R1bGVfY21kcz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzPQotICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltcz0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCi0gICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZWxzZQotCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWZpfgotCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OwotCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7Ci0JaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKLQkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCWxkX3NobGlicz1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKSAKLQlsZF9zaGxpYnM9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKLSoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotCTs7Ci0JKikKLQkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBsZF9zaGxpYnM9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQlmaQotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQotCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLSAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLSAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotICAJICAgIGJyZWFrCi0gIAkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBhcmNoaXZlX2NtZHM9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLSAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLSAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0gIAkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0gIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYwotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCi0gICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KLSAgICAgICAgICAgICAxMC5bMDEyXSkKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBtb2R1bGVfY21kcz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlicz1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlicz1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAgICMgZXh0cmEgc3BhY2UpLgotICAgIGZyZWVic2QyLjIqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBocHV4OSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotCi0JaGFyZGNvZGVfZGlyZWN0PXllcwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8KLQkgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQkgIDs7Ci0JKikKLQkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLQotCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQkgICA7OwotICAgICAgIGVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb3MyKikKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCWFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0gIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCSopCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLQkgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotCWxkX3NobGlicz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlicyIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlicyIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWMKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICAgICAgICB0aGVuCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi1zdHJpcGxpYj0KLW9sZF9zdHJpcGxpYj0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAiID4mNjsgfQotaWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAotICBjYXNlICRob3N0X29zIGluCi0gICBkYXJ3aW4qKQotICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCi0gICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgotICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgICAgICBlbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLSAgICAgICA7OwotICAgKikKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLSAgbHRfY3ZfZGxvcGVuPW5vCi0gIGx0X2N2X2Rsb3Blbl9saWJzPQotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYmVvcyopCi0gICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgICA7OwotCi0gIG1pbmd3KiB8IHB3MzIqKQotICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICA7OwotCi0gIGN5Z3dpbiopCi0gICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICA7OwotCi0gIGRhcndpbiopCi0gICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKLWVsc2UKLSAgCi0gICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIAotZmkKLQotICAgOzsKLQotICAqKQotICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNobF9sb2FkIiAiYWNfY3ZfZnVuY19zaGxfbG9hZCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2hsX2xvYWQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzaGxfbG9hZCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcwotZWxzZQotICBhY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCi1lbHNlCi0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzdmxkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxkX2xpbmsgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbGRfbGluayAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcwotZWxzZQotICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCi1maQotCi0JICAgICAgCi1maQotCi0JICAgIAotZmkKLQotCSAgCi1maQotCi0JCi1maQotCi0gICAgICAKLWZpCi0KLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0KLSAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQotICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX0KLUVPRgotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X2RsdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLSAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX0KLUVPRgotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKLSAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0gICAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9Ci0gICAgZmkKLQotICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKLSAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgIExJQlM9IiRzYXZlX0xJQlMiCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0KLSMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCi0gICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgZmkKLSAgICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAiID4mNjsgfQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGVuYWJsZV9zdGF0aWMiID4mNjsgfQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXIgXAotICAgIENDIFwKLSAgICBMRCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIFwKLSAgICBwcmVkZXBfb2JqZWN0cyBcCi0gICAgcG9zdGRlcF9vYmplY3RzIFwKLSAgICBwcmVkZXBzIFwKLSAgICBwb3N0ZGVwcyBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKLSAgICBhcmNoaXZlX2NtZHMgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgXAotICAgIHBvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnIFwKLSAgICBub191bmRlZmluZWRfZmxhZyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljIFwKLSAgICBtb2R1bGVfY21kcyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCi0gICAgZXhjbHVkZV9leHBzeW1zIFwKLSAgICBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gICAgYXJjaGl2ZV9jbWRzIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgbW9kdWxlX2NtZHMgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIke29maWxlfVQiCi0gIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gICRybSAtZiAiJGNmZ2ZpbGUiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJG9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRvZmlsZSIgPiY2O30KLQotICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKLSMhICRTSEVMTAotCi0jIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6Ci0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KLVNFRD0kbHRfU0VECi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSIkU0VEIC1lIDFzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLSMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotYXZhaWxhYmxlX3RhZ3M9Ci0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0MKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTEQKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpYwotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX28KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwcwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZAotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcwotCi0jICMjIyBFTkQgTElCVE9PTCBDT05GSUcKLQotX19FT0ZfXwotCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQotCi0gIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwgXAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0KLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKLSAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KLSAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi0gIGZpCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotQ0M9IiRsdF9zYXZlX0NDIgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdGFncytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGFnczsgdGFnbmFtZXM9IiR3aXRodmFsIgotZmkKLQotCi1pZiB0ZXN0IC1mICIkbHRtYWluIiAmJiB0ZXN0IC1uICIkdGFnbmFtZXMiOyB0aGVuCi0gIGlmIHRlc3QgISAtZiAiJHtvZmlsZX0iOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjI7fQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKLSAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiYyO30KLSAgICBlbHNlCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mMjt9Ci0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAteiAiJExUQ0ZMQUdTIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDRkxBR1M9J2AiCi0gIGZpCi0KLSAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCi0gICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCi0gIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXTo6ZydgIGluCi0gICAgIiIpIDs7Ci0gICAgKikgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgIiRMSU5FTk8iIDUKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gInRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgIiRMSU5FTk8iIDUKLSAgICBmaQotCi0gICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCi0KLSAgICAgIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAgIENYWCkKLQlpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotCSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKLQkgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0JICBhY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi0KLQotCi1hcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KLWFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KLWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPQotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0KLWhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KLWhhcmRjb2RlX21pbnVzX0xfQ1hYPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAotaGFyZGNvZGVfYXV0b21hdGljX0NYWD1ubwotbW9kdWxlX2NtZHNfQ1hYPQotbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0KLWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXVua25vd24KLW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSRvbGRfYXJjaGl2ZV9jbWRzCi1ub191bmRlZmluZWRfZmxhZ19DWFg9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9Ci1lbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD1ubwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgotcHJlZGVwX29iamVjdHNfQ1hYPQotcG9zdGRlcF9vYmplY3RzX0NYWD0KLXByZWRlcHNfQ1hYPQotcG9zdGRlcHNfQ1hYPQotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9Y3BwCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9DWFg9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9XG4nCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0kQ0MKLWx0X3NhdmVfTEQ9JExECi1sdF9zYXZlX0dDQz0kR0NDCi1HQ0M9JEdYWAotbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKLWx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAotaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgotICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCi1maQotaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCi0gIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKLWZpCi10ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAotQ0M9JHtDWFgtImMrKyJ9Ci1jb21waWxlcj0kQ0MKLWNvbXBpbGVyX0NYWD0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLQotIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKLSMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKLWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0nIC1mbm8tYnVpbHRpbicKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQotZmkKLQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KLQotICAKLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQotZmkKLWlmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQotJGFzX2VjaG8gIiRMRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXRlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhYwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi0KLSAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCi0gICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KLSAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKLQlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGVsc2UKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KLSAgICBmaQotICBlbHNlCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICB3bGFyYz0KLQotICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCi0gICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKLSAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAotICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgotICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICBmaQotCi0gICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi1lbHNlCi0gIEdYWD1ubwotICB3aXRoX2dudV9sZD1ubwotICB3bGFyYz0KLWZpCi0KLSMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotbGRfc2hsaWJzX0NYWD15ZXMKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0JICBjYXNlICRsZF9mbGFnIGluCi0JICAqLWJydGwqKQotCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotCSAgICBicmVhawotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgIGZpCi0KLSAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJwotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCi0gICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0KLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLSAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLQkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotCWVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKLQkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0JICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLQkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcwotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0Jc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0Jc2hhcmVkX2ZsYWc9Jy1HJwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JZWxzZQotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPXllcwotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKLSAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgZWxzZQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSIteiBub2RlZnMiCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0gICAgICBlbHNlCi0JIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1iZXJub3RvaycKLQlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1iZXJvaycKLQkjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyRjb252ZW5pZW5jZScKLQlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0JIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKLSAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLSAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGNob3J1cyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCi0KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQljcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICBlbHNlCi0JZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGZpfgotICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICBmaQotICA7OwotICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIDs7Ci0gICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCi0gICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KLSAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KLSAgICAgICAgICAgICAxMC5bMDEyXSkKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgZXNhYwotICAgICAgICAgZmkKLSAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCi0gICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICBpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgJEVHUkVQICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIGVsc2UKLSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgICBmaQotICAgICAgICBtb2R1bGVfY21kc19DWFg9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBmaQotICAgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgIG1vZHVsZV9jbWRzX0NYWD0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBmaQotICAgICAgICA7OwotCi0gIGRndXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBlYysrKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGdoY3gqKQotCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBmcmVlYnNkWzEyXSopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZSBzd2l0Y2ggdG8gRUxGCi0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIGZyZWVic2QtZWxmKikKLSAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICA7OwotICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCi0gICAgIyBjb252ZW50aW9ucwotICAgIGxkX3NobGlic19DWFg9eWVzCi0gICAgOzsKLSAgZ251KikKLSAgICA7OwotICBocHV4OSopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCSMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgIENDKikKLSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgICAgOzsKLSAgICBhQ0MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0gICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgIwotICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLSAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLSAgICAgICMgZGVwZW5kZW5jaWVzLgotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlstXUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0gICAgICA7OwotICAgICopCi0gICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICBocHV4MTAqfGhwdXgxMSopCi0gICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9JytiICRsaWJkaXInCi0gICAgICAgIDs7Ci0gICAgICAqKQotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGhwcGEqNjQqfGlhNjQqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCQkgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCQkgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgYUNDKikKLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBocHBhKjY0KikKLQkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgaWE2NCopCi0JICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgICopCi0JICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIGxkX3NobGlic19DWFg9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGludGVyaXgzKikKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLSAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLSAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICA7OwotICBpcml4NSogfCBpcml4NiopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIFNHSSBDKysKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKLQkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKLQkjIGluIHRoZSBhcmNoaXZlLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKLQkgIGZpCi0JZmkKLQlsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLQk7OwotICAgIGVzYWMKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLSAgICA7OwotICBsaW51eCopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIGljcGMqKQotCSMgSW50ZWwgQysrCi0Jd2l0aF9nbnVfbGQ9eWVzCi0JIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKLQkjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAotCSMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCi0JY2FzZSBgJENDIC1WIDI+JjFgIGluCi0JKiJWZXJzaW9uIDcuIiopCi0gIAkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICA7OwotCSopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCi0JICB0bXBfaWR5bj0KLQkgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKLQkgIGVzYWMKLSAgCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCTs7Ci0gICAgICBwZ0NDKikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKLSAgCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgICA7OwotICAgICAgY3h4KikKLQkjIENvbXBhcSBDKysKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJwotCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBseW54b3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBtODhrKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgbXZzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgY3h4KikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBmaQotICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKLSAgICA7OwotICBvcGVuYnNkMiopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBvcGVuYnNkKikKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZmkKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICA7OwotICBvc2YzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0KLQk7OwotICAgICAgUkNDKikKLQkjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgY3h4KikKLQlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKLQotCWVsc2UKLQkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgbGRfc2hsaWJzX0NYWD1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgb3NmNCogfCBvc2Y1KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBjeHgqKQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgotCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+Ci0JICAkcm0gJGxpYi5leHAnCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIGxkX3NobGlic19DWFg9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHBzb3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBzdW5vczQqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTdW4gQysrIDQueAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgbGNjKikKLQkjIEx1Y2lkCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzb2xhcmlzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLSAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotCW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nIC16ZGVmcycKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0JY2FzZSAkaG9zdF9vcyBpbgotCSAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotCSAgKikKLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIGlzIHVzZWQgYXMgbGlua2VyIHNvIHdlIG11c3QgdXNlICR3bAotCSAgICAjIGZsYWcgdG8gcGFzcyB0aGUgY29tbWFuZHMgdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtCi0JICAgICMgbGlua2VyLiBXZSBtdXN0IGFsc28gcGFzcyBlYWNoIGNvbnZpZW5jZSBsaWJyYXJ5IHRocm91Z2gKLQkgICAgIyB0byB0aGUgc3lzdGVtIGxpbmtlciBiZXR3ZWVuIGFsbGV4dHJhY3QvZGVmYXVsdGV4dHJhY3QuCi0JICAgICMgVGhlIEMrKyBjb21waWxlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLQkgICAgIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0JICAgICMgd2l0aG91dCAkd2wuCi0JICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0JICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCSAgICA7OwotCWVzYWMKLQlsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLQotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgZ2N4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQotCSMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQkjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0teiAke3dsfWRlZnMnCi0JICBpZiAkQ0MgLS12ZXJzaW9uIHwgZ3JlcCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBlbHNlCi0JICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKLQkgICAgIyBwbGF0Zm9ybS4KLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKLQkgIGZpCi0KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICR3bCRsaWJkaXInCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JwotICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0gICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotICAgICMgYXMgLXogZGVmcy4KLSAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0gICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKLSAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbwotICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0gICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQotICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgotICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KLSAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCi0gICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLSAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosbm9kZWZzJwotICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JwotICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUJleHBvcnQnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICAgICopCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICB0YW5kZW0qKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBOQ0MqKQotCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdnh3b3JrcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gICopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KLXRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotR0NDX0NYWD0iJEdYWCIKLUxEX0NYWD0iJExEIgotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotY2xhc3MgRm9vCi17Ci1wdWJsaWM6Ci0gIEZvbyAodm9pZCkgeyBhID0gMDsgfQotcHJpdmF0ZToKLSAgaW50IGE7Ci19OwotRU9GCi0KLWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLSAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi0KLSAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQotICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KLSAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubwotCi0gICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgotICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCi0gICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKLQotICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbwotICAgIGNhc2UgJHAgaW4KLQotICAgIC1MKiB8IC1SKiB8IC1sKikKLSAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgotICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KLSAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCi0JICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgotCSBwcmV2PSRwCi0JIGNvbnRpbnVlCi0gICAgICAgZWxzZQotCSBwcmV2PQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBjYXNlICRwIGluCi0JIC1MKiB8IC1SKikKLQkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKLQkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKLQkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KLQkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KLQkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgotCSAgIGVsc2UKLQkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCi0JICAgZmkKLQkgICA7OwotCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZwotCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KLQkgZXNhYwotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KLQkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgotCSBlbHNlCi0JICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKi4kb2JqZXh0KQotICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAotICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgotICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgotCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcwotCSBjb250aW51ZQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBpZiB0ZXN0IC16ICIkcHJlZGVwX29iamVjdHNfQ1hYIjsgdGhlbgotCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHAiCi0JIGVsc2UKLQkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwcmVkZXBfb2JqZWN0c19DWFggJHAiCi0JIGZpCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkcG9zdGRlcF9vYmplY3RzX0NYWCI7IHRoZW4KLQkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcCIKLQkgZWxzZQotCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwb3N0ZGVwX29iamVjdHNfQ1hYICRwIgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgotCi0gICAgZXNhYwotICBkb25lCi0KLSAgIyBDbGVhbiB1cC4KLSAgcm0gLWYgYS5vdXQgYS5leGUKLWVsc2UKLSAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nIENYWCB0ZXN0IHByb2dyYW0iCi1maQotCi0kcm0gLWYgY29uZmVzdC4kb2JqZXh0Ci0KLSMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCi1jYXNlICRob3N0X29zIGluCi1pbnRlcml4MyopCi0gICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KLSAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KLSAgcHJlZGVwX29iamVjdHNfQ1hYPQotICBwb3N0ZGVwX29iamVjdHNfQ1hYPQotICBwb3N0ZGVwc19DWFg9Ci0gIDs7Ci0KLXNvbGFyaXMqKQotICBjYXNlICRjY19iYXNlbmFtZSBpbgotICBDQyopCi0gICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKLSAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCi0gICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KLSAgICBwb3N0ZGVwc19DWFg9Jy1sQ3N0ZCAtbENydW4nCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotCi0KLWNhc2UgIiAkcG9zdGRlcHNfQ1hYICIgaW4KLSoiIC1sYyAiKikgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vIDs7Ci1lc2FjCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPQotbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0gCi0gICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLSAgICBtaW5ndyogfCBvczIqIHwgcHczMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLSAgICAqZGpncHAqKQotICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci0gICAgICA7OwotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQqIHwgYWl4NSopCi0JIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQllbHNlCi0JICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLQlmaQotCTs7Ci0gICAgICBjaG9ydXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JY3hjaDY4KikKLQkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAgZGFyd2luKikKLSAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgIHhsYyopCi0gICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFub2NvbW1vbicKLSAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0gICAgICAgICAgIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgOzsKLSAgICAgIGRndXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBlYysrKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgOzsKLQkgIGdoY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLQkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCi0JOzsKLSAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJwotCSAgICBmaQotCSAgICA7OwotCSAgYUNDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqfGlhNjQqKQotCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGludGVyaXgqKQotCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQotCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KLQk7OwotICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKLQkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBsaW51eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgICMgS0FJIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0JICAgIDs7Ci0JICBpY3BjKiB8IGVjcGMqKQotCSAgICAjIEludGVsIEMrKwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJwotCSAgICA7OwotCSAgcGdDQyopCi0JICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZnBpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgQ29tcGFxIEMrKwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGx5bnhvcyopCi0JOzsKLSAgICAgIG04OGsqKQotCTs7Ci0gICAgICBtdnMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBjeHgqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1XIGMsZXhwb3J0YWxsJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIG5ldGJzZCopCi0JOzsKLSAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgS0NDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJwotCSAgICA7OwotCSAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgY3h4KikKLQkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKLQkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgcHNvcyopCi0JOzsKLSAgICAgIHNvbGFyaXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKLQkgICAgOzsKLQkgIGdjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVBJQycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzdW5vczQqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LngKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJwotCSAgICA7OwotCSAgbGNjKikKLQkgICAgIyBMdWNpZAotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdGFuZGVtKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgTkNDKikKLQkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHZ4d29ya3MqKQotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggLURQSUMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFhcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDQqIHwgYWl4NSopCi0gICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0gICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGVsc2UKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICAgZmkKLSAgICA7OwotICBwdzMyKikKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0iJGx0ZGxsX2NtZHMiCi0gIDs7Ci0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS87L14uKiBfX25tX18vcy9eLiogX19ubV9fXChbXiBdKlwpIFteIF0qL1wxIERBVEEvOy9eSSAvZDsvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgKikKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICBlc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0NYWCBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFgKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWAotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gICAgICAgIHRoZW4KLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uX0NYWD0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0NYWCIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBDWFgpIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9DWFgiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb25fQ1hYPXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjUKLSRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfQ1hYIFwKLSAgICBDQ19DWFggXAotICAgIExEX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFggXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFggXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19DWFggXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFggXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCBcCi0gICAgcHJlZGVwX29iamVjdHNfQ1hYIFwKLSAgICBwb3N0ZGVwX29iamVjdHNfQ1hYIFwKLSAgICBwcmVkZXBzX0NYWCBcCi0gICAgcG9zdGRlcHNfQ1hYIFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIFwKLSAgICBhcmNoaXZlX2NtZHNfQ1hYIFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCBcCi0gICAgcG9zdGluc3RhbGxfY21kc19DWFggXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19DWFggXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKLSAgICBub191bmRlZmluZWRfZmxhZ19DWFggXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFggXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYIFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIFwKLSAgICBtb2R1bGVfY21kc19DWFggXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFggXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCBcCi0gICAgZXhjbHVkZV9leHBzeW1zX0NYWCBcCi0gICAgaW5jbHVkZV9leHBzeW1zX0NYWDsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIHwgXAotICAgIGFyY2hpdmVfY21kc19DWFggfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggfCBcCi0gICAgbW9kdWxlX2NtZHNfQ1hYIHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFggfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX0NYWAotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX0NYWAotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9DWFgKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFgKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19DWFgKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0NYWAotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWAotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0NYWAotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19DWFgKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0NYWAotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfQ1hYCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0NYWAotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19DWFgKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfQ1hYCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19DWFgKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0NYWAotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fQ1hYCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFgKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19DWFgKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfQ1hYCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfQ1hYIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFgKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19DWFgKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0NYWAotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0NYWAotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0kbHRfc2F2ZV9DQwotTERDWFg9JExECi1MRD0kbHRfc2F2ZV9MRAotR0NDPSRsdF9zYXZlX0dDQwotd2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCi13aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAotbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECi1sdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKLWx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi0KLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBGNzcpCi0JaWYgdGVzdCAtbiAiJEY3NyIgJiYgdGVzdCAiWCRGNzciICE9ICJYbm8iOyB0aGVuCi0JICAKLWFjX2V4dD1mCi1hY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251Ci0KLQotYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi1hbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci1hbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PW5vCi1hcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9Ci1oYXJkY29kZV9kaXJlY3RfRjc3PW5vCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci1oYXJkY29kZV9taW51c19MX0Y3Nz1ubwotaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz1ubwotbW9kdWxlX2NtZHNfRjc3PQotbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KLWxpbmtfYWxsX2RlcGxpYnNfRjc3PXVua25vd24KLW9sZF9hcmNoaXZlX2NtZHNfRjc3PSRvbGRfYXJjaGl2ZV9jbWRzCi1ub191bmRlZmluZWRfZmxhZ19GNzc9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci1lbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KLWFjX2V4dD1mCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9GNzc9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSIgICAgICBzdWJyb3V0aW5lIHRcbiAgICAgIHJldHVyblxuICAgICAgZW5kXG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiAgICAgIHByb2dyYW0gdFxuICAgICAgZW5kXG4iCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtGNzctImY3NyJ9Ci1jb21waWxlcj0kQ0MKLWNvbXBpbGVyX0Y3Nz0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9Ci0KLUdDQ19GNzc9IiRHNzciCi1MRF9GNzc9IiRMRCIKLQotbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Ci1sdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Ci1sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KLSAKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotCi0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLSAgICAgIGRhcndpbiopCi0gICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICB4bGMqKQotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZnBpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY2OyB9Ci0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLWlmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciOyB0aGVuCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzc9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KLSAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA7OwotICAgICBlc2FjCi1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQotICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCi1maQotCi1maQotY2FzZSAkaG9zdF9vcyBpbgotICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKLSAgKmRqZ3BwKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Ci0gICAgOzsKLSAgKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCi0gICAgOzsKLWVzYWMKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3N1wiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0gICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPSB4eWVzOyB0aGVuCi0gICAgOgotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3PW5vCi0gICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLSAgIG1rZGlyIGNvbmZ0ZXN0Ci0gICBjZCBjb25mdGVzdAotICAgbWtkaXIgb3V0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNjsgfQotCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci0gIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCi0gIGFyY2hpdmVfY21kc19GNzc9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQotICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0KLSAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3PQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci0gIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzc9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KLSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci0gIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KLSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgotICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCi0gIG1vZHVsZV9jbWRzX0Y3Nz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KLSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltc19GNzc9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgZXhjbHVkZV9leHBzeW1zX0Y3Nz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0gICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0gICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KLSAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgbGRfc2hsaWJzX0Y3Nz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCWxkX3NobGlic19GNzc9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLQotICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKLSAgICAgICMgdGhlbS4KLSAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19GNzc9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQl0bXBfYWRkZmxhZz0KLQljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KLQlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLQlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKLQl3bGFyYz0KLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlsZF9zaGxpYnNfRjc3PW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopIAotCWxkX3NobGlic19GNzc9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKLSoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotCTs7Ci0JKikKLQkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJwotCSAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBsZF9zaGxpYnNfRjc3PW5vCi0JICBmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAiJGxkX3NobGlic19GNzciID0gbm87IHRoZW4KLSAgICAgIHJ1bnBhdGhfdmFyPQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Ci0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PXllcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCWhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYWl4NCogfCBhaXg1KikKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAotCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9IiIKLSAgICAgIGVsc2UKLQkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KLQkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCi0JaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQlmaQotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQotCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLSAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLSAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotICAJICAgIGJyZWFrCi0gIAkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PScnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9JzonCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQotCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCSAgdGhlbgotICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQkgIGVsc2UKLSAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3RfRjc3PXVuc3VwcG9ydGVkCi0gIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLSAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLSAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0gIAkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0gIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSctYmVyb2snCi0gICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0iLXogbm9kZWZzIgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aF9GNzc9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotCi0JaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQloYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotCSAgOzsKLQkqKQotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzX0Y3Nz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnNfRjc3PXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LG5vZGVmcycKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfRjc3IiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0Y3NyIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHNfRjc3IGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NwotCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3Ci0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KLSAgICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICAgIGVsc2UKLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjUKLSRhc19lY2hvICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb25fRjc3PQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXJfRjc3IiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19GNzciID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9GNzciICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEY3NykiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0Y3NyIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbl9GNzc9dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9GNzciID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjY7IH0KLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9GNzciID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9GNzcgXAotICAgIENDX0Y3NyBcCi0gICAgTERfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0Y3NyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NyBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3IFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3NyBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IFwKLSAgICBwcmVkZXBfb2JqZWN0c19GNzcgXAotICAgIHBvc3RkZXBfb2JqZWN0c19GNzcgXAotICAgIHByZWRlcHNfRjc3IFwKLSAgICBwb3N0ZGVwc19GNzcgXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcgXAotICAgIGFyY2hpdmVfY21kc19GNzcgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX0Y3NyBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX0Y3NyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzcgXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3NyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzcgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcgXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19GNzcgXAotICAgIG1vZHVsZV9jbWRzX0Y3NyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NyBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IFwKLSAgICBleGNsdWRlX2V4cHN5bXNfRjc3IFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfRjc3OyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19GNzcgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcgfCBcCi0gICAgYXJjaGl2ZV9jbWRzX0Y3NyB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NyB8IFwKLSAgICBtb2R1bGVfY21kc19GNzcgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzcgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzcgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzcKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfRjc3Ci0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfRjc3Ci0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX0Y3NwotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfRjc3Ci0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfRjc3Ci1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3Ci0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfRjc3Ci1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfRjc3Ci1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19GNzcKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfRjc3Ci0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0Y3NwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19GNzcKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0Y3NwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfRjc3Ci0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9GNzcKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NwotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9GNzcKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3NwotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0Y3NwotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19GNzcKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9GNzciCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3NwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0Y3NwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfRjc3Ci0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfRjc3Ci0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIEdDSikKLQlpZiB0ZXN0IC1uICIkR0NKIiAmJiB0ZXN0ICJYJEdDSiIgIT0gIlhubyI7IHRoZW4KLQkgIAotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9amF2YQotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0X0dDSj0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7fTsgfVxuJwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7R0NKLSJnY2oifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9HQ0o9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KLWFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotCi1vbGRfYXJjaGl2ZV9jbWRzX0dDSj0kb2xkX2FyY2hpdmVfY21kcwotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLQotbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotZWxzZQotICAgIDoKLWZpCi0KLWZpCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPQotbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0gCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLQotICAgIG1zZG9zZGpncHAqKQotICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLXFub2NvbW1vbicKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgICAgOzsKLSAgICAgICBlc2FjCi0gICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZwaWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctUW9wdGlvbiBsZCAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1QSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtjb25mb3JtX3BpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1waWMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0pcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0orOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSj1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBydW5wYXRoX3Zhcj0KLSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPQotICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj1ubwotICBhcmNoaXZlX2NtZHNfR0NKPQotICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0KLSAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSj0KLSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KLSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfR0NKPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQotICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gIGhhcmRjb2RlX21pbnVzX0xfR0NKPW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCi0gIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXVua25vd24KLSAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj1ubwotICBtb2R1bGVfY21kc19HQ0o9Ci0gIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9Ci0gIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotICBpbmNsdWRlX2V4cHN5bXNfR0NKPQotICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0gICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi0gIGV4Y2x1ZGVfZXhwc3ltc19HQ0o9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlic19HQ0o9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KLSAgICBmaQotICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubwotICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KLSAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKLSAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCi0gICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCi0gICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucwotICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCi0gICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQlsZF9zaGxpYnNfR0NKPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBHQ0opIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcwotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLQkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0JIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQllbHNlCi0JICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZml+Ci0JJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKLQkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKLQllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQllc2FjCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCWZpCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0JbGRfc2hsaWJzX0dDSj1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKSAKLQlsZF9zaGxpYnNfR0NKPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKLQkgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgbGRfc2hsaWJzX0dDSj1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQloYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeDQqIHwgYWl4NSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQotCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0gIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0gIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLSAgCSAgICBicmVhawotICAJICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLSAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLSAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAotICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0gIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0gIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotICAJICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLQllbHNlCi0JICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JICBlbHNlCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPXllcwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSIteiBub2RlZnMiCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLQllbHNlCi0JICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzX0dDSj0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aF9HQ0o9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlic19HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotCi0JaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQloYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotCSAgOzsKLQkqKQotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzX0dDSj0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnNfR0NKPXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LG5vZGVmcycKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0dDSiIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHNfR0NKIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgotCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KLSAgICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICAgIGVsc2UKLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjUKLSRhc19lY2hvICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb25fR0NKPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXJfR0NKIiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9HQ0oiICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEdDSikiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0dDSiIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbl9HQ0o9dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjY7IH0KLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9HQ0ogXAotICAgIENDX0dDSiBcCi0gICAgTERfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0ogXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSiBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSiBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIFwKLSAgICBwcmVkZXBfb2JqZWN0c19HQ0ogXAotICAgIHBvc3RkZXBfb2JqZWN0c19HQ0ogXAotICAgIHByZWRlcHNfR0NKIFwKLSAgICBwb3N0ZGVwc19HQ0ogXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0ogXAotICAgIGFyY2hpdmVfY21kc19HQ0ogXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0ogXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSiBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0ogXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0ogXAotICAgIG1vZHVsZV9jbWRzX0dDSiBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIFwKLSAgICBleGNsdWRlX2V4cHN5bXNfR0NKIFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfR0NKOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0ogfCBcCi0gICAgYXJjaGl2ZV9jbWRzX0dDSiB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBtb2R1bGVfY21kc19HQ0ogfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0ogfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSgotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0oKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfR0NKCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfR0NKCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfR0NKCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSgotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSgotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfR0NKCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0oKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfR0NKCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0dDSgotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfR0NKCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19HQ0oKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfR0NKCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0dDSgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19HQ0oKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0dDSgotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0oKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9HQ0oKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSgotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfR0NKCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSgotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0dDSgotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19HQ0oKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9HQ0oiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIFJDKQotCQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PXJjCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0X1JDPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfVxuJwotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7UkMtIndpbmRyZXMifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9SQz0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLWx0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDPXllcwotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfUkMgXAotICAgIENDX1JDIFwKLSAgICBMRF9SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfUkMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIFwKLSAgICBwcmVkZXBfb2JqZWN0c19SQyBcCi0gICAgcG9zdGRlcF9vYmplY3RzX1JDIFwKLSAgICBwcmVkZXBzX1JDIFwKLSAgICBwb3N0ZGVwc19SQyBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDIFwKLSAgICBhcmNoaXZlX2NtZHNfUkMgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgXAotICAgIHBvc3RpbnN0YWxsX2NtZHNfUkMgXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19SQyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX1JDIFwKLSAgICBub191bmRlZmluZWRfZmxhZ19SQyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQyBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljX1JDIFwKLSAgICBtb2R1bGVfY21kc19SQyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQyBcCi0gICAgZXhjbHVkZV9leHBzeW1zX1JDIFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfUkM7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgfCBcCi0gICAgYXJjaGl2ZV9jbWRzX1JDIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgfCBcCi0gICAgbW9kdWxlX2NtZHNfUkMgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX1JDCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX1JDCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfUkMKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTERfUkMKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX1JDCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19SQwotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX1JDCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19SQwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19SQwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19SQwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfUkMKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX1JDCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19SQwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX1JDCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9SQwotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfUkMKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X1JDCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX1JDCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX1JDCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfUkMKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfUkMKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9SQyIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfUkMKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19SQwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfUkMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19SQwotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQk7OwotCi0gICAgICAqKQotCWFzX2ZuX2Vycm9yICQ/ICJVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWUiICIkTElORU5PIiA1Ci0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KLSAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCi0gICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KLSAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgotICAgIGNobW9kICt4ICIkb2ZpbGUiCi0gIGVsc2UKLSAgICBybSAtZiAiJHtvZmlsZX1UIgotICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy4iICIkTElORU5PIiA1Ci0gIGZpCi1maQotCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgotCi0KLQotCi0KLQotCi0KLQotCi0KLSAgCi0KLSAgCi0KLQotICAKLSAgICAgICAKLSAgICAgICAKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0FSKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkQVIgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWFzX2R1bW15PSIkUEFUSDovdXNyL2Njcy9iaW4iCi1mb3IgYXNfZGlyIGluICRhc19kdW1teQotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9BUj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9BUiIgJiYgYWNfY3ZfcGF0aF9BUj0iL3Vzci9iaW4vYXIiCi0gIDs7Ci1lc2FjCi1maQotQVI9JGFjX2N2X3BhdGhfQVIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1Ci0kYXNfZWNobyAiJEFSIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLQotIyBPcHRpb25zCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC10aWdodHZuYy1maWxldHJhbnNmZXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyOyAKLWVsc2UKLSAgIHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyPXllcyAKLWZpCi0KLSMgQUNfREVGSU5FIG1vdmVkIHRvIGFmdGVyIGxpYnB0aHJlYWQgY2hlY2suCi0KLSMgV2ViU29ja2V0cyBzdXBwb3J0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX2I2NF9udG9wIGluIC1scmVzb2x2IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBfX2I2NF9udG9wIGluIC1scmVzb2x2Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9yZXNvbHZfX19iNjRfbnRvcCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scmVzb2x2ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBfX2I2NF9udG9wICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gX19iNjRfbnRvcCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3A9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9yZXNvbHZfX19iNjRfbnRvcD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID0geHllczsgdGhlbiA6Ci0gIEhBVkVfQjY0PSJ0cnVlIgotZWxzZQotICBIQVZFX0I2ND0iZmFsc2UiCi1maQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC13ZWJzb2NrZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF93ZWJzb2NrZXRzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF93ZWJzb2NrZXRzOyAKLWVsc2UKLSAgIHdpdGhfd2Vic29ja2V0cz15ZXMgCi1maQotCi0jIEFDX0RFRklORSBtb3ZlZCB0byBhZnRlciBsaWJyZXNvbHZlIGNoZWNrLgotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC0yNGJwcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfMjRicHArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoXzI0YnBwOyAKLWVsc2UKLSAgIHdpdGhfMjRicHA9eWVzIAotZmkKLQotaWYgdGVzdCAieCR3aXRoXzI0YnBwIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIEFMTE9XMjRCUFAgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mZm1wZWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2ZmbXBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZmZtcGVnOyAKLWZpCi0KLQotIGlmIHRlc3QgISAteiAiJHdpdGhfZmZtcGVnIjsgdGhlbgotICBXSVRIX0ZGTVBFR19UUlVFPQotICBXSVRIX0ZGTVBFR19GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9GRk1QRUdfVFJVRT0nIycKLSAgV0lUSF9GRk1QRUdfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICEgLXogIiR3aXRoX2ZmbXBlZyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsYW1lX2luaXQgaW4gLWxtcDNsYW1lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsYW1lX2luaXQgaW4gLWxtcDNsYW1lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sbXAzbGFtZSAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgbGFtZV9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gbGFtZV9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9NUDNMQU1FPSJ0cnVlIgotZWxzZQotICBIQVZFX01QM0xBTUU9ImZhbHNlIiAKLWZpCi0KLWZpCi0gaWYgdGVzdCAiJEhBVkVfTVAzTEFNRSIgPSAidHJ1ZSI7IHRoZW4KLSAgSEFWRV9NUDNMQU1FX1RSVUU9Ci0gIEhBVkVfTVAzTEFNRV9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9NUDNMQU1FX1RSVUU9JyMnCi0gIEhBVkVfTVAzTEFNRV9GQUxTRT0KLWZpCi0KLQotIyBTZWVtIHRvIG5lZWQgdGhpcyBkdW1teSBoZXJlIHRvIGluZHVjZSB0aGUgJ2NoZWNraW5nIGZvciBlZ3JlcC4uLiBncmVwIC1FJywgZXRjLgotIyBiZWZvcmUgaXQgc2VlbWVkIHRvIGJlIGluc2lkZSB0aGUgd2l0aF9qcGVnIGNvbmRpdGlvbmFsLiAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ0aGVub25leGlzdGVudGhlYWRlci5oIiAiYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfVEhFTk9ORVhJU1RFTlRIRUFERVJfSD0idHJ1ZSIKLWZpCi0KLQotCi0jIHNldCBzb21lIGxkIC1SIG5vbnNlbnNlCi0jCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotbGRfbWludXNfUj0ieWVzIgotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieE9TRjEiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieERhcndpbiI7IHRoZW4KLQlsZF9taW51c19SPSJubyIKLWZpCi0KLSMgQ2hlY2sgZm9yIE9wZW5TU0wKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcnlwdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY3J5cHQ7IAotZmkKLQotaWYgdGVzdCAieCR3aXRoX2NyeXB0IiAhPSAieG5vIjsgdGhlbgotCWZvciBhY19mdW5jIGluIGNyeXB0Ci1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImNyeXB0IiAiYWNfY3ZfZnVuY19jcnlwdCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19jcnlwdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0NSWVBUIDEKLV9BQ0VPRgotIEhBVkVfTElCQ19DUllQVD0idHJ1ZSIKLWZpCi1kb25lCi0KLQlpZiB0ZXN0IC16ICIkSEFWRV9MSUJDX0NSWVBUIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9jcnlwdF9jcnlwdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGNyeXB0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gY3J5cHQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2NyeXB0X2NyeXB0PXllcwotZWxzZQotICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA9IHh5ZXM7IHRoZW4gOgotICBDUllQVF9MSUJTPSItbGNyeXB0IgotCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJDUllQVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCWZpCi1maQotCi0KLSMgc29tZSBPUydzIG5lZWQgYm90aCAtbHNzbCBhbmQgLWxjcnlwdG8gb24gbGluayBsaW5lOgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3J5cHRvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcnlwdG8rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NyeXB0bzsgCi1maQotCi0KLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXNzbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3NsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9zc2w7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfY3J5cHRvIiAhPSAieG5vIiAtYSAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3NzbC9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3NzbC9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9zc2wvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3NzbC9saWIiCi0JCWZpCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBSQU5EX2ZpbGVfbmFtZSBpbiAtbGNyeXB0byIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgUkFORF9maWxlX25hbWUgaW4gLWxjcnlwdG8uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHRvICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBSQU5EX2ZpbGVfbmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFJBTkRfZmlsZV9uYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQkNSWVBUTyAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQkNSWVBUTz0idHJ1ZSIKLWZpCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAtbGNyeXB0byAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBTU0xfbGlicmFyeV9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gU1NMX2xpYnJhcnlfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID0geHllczsgdGhlbiA6Ci0gIFNTTF9MSUJTPSItbHNzbCAtbGNyeXB0byIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCU1NMIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCU1NMPSJ0cnVlIgotZmkKLQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgU1NMX2xpYnJhcnlfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBTU0xfTElCUz0iLWxzc2wiCi0JCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlNTTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlNTTD0idHJ1ZSIKLWZpCi0KLQlmaQotZmkKLQotIGlmIHRlc3QgISAteiAiJFNTTF9MSUJTIjsgdGhlbgotICBIQVZFX0xJQlNTTF9UUlVFPQotICBIQVZFX0xJQlNTTF9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJTU0xfVFJVRT0nIycKLSAgSEFWRV9MSUJTU0xfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2tzIGZvciBYIGxpYnJhcmllcwotSEFWRV9YMTE9ImZhbHNlIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWC4uLiAiID4mNjsgfQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeDsgCi1maQotCi0jICRoYXZlX3ggaXMgYHllcycsIGBubycsIGBkaXNhYmxlZCcsIG9yIGVtcHR5IHdoZW4gd2UgZG8gbm90IHlldCBrbm93LgotaWYgdGVzdCAieCR3aXRoX3giID0geG5vOyB0aGVuCi0gICMgVGhlIHVzZXIgZXhwbGljaXRseSBkaXNhYmxlZCBYLgotICBoYXZlX3g9ZGlzYWJsZWQKLWVsc2UKLSAgY2FzZSAkeF9pbmNsdWRlcywkeF9saWJyYXJpZXMgaW4gIygKLSAgICAqXCcqKSBhc19mbl9lcnJvciAkPyAiY2Fubm90IHVzZSBYIGRpcmVjdG9yeSBuYW1lcyBjb250YWluaW5nICciICIkTElORU5PIiA1OzsgIygKLSAgICAqLE5PTkUgfCBOT05FLCopIGlmICR7YWNfY3ZfaGF2ZV94Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KLWFjX3hfaW5jbHVkZXM9bm8gYWNfeF9saWJyYXJpZXM9bm8KLXJtIC1mIC1yIGNvbmZ0ZXN0LmRpcgotaWYgbWtkaXIgY29uZnRlc3QuZGlyOyB0aGVuCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICBjYXQgPkltYWtlZmlsZSA8PCdfQUNFT0YnCi1pbmNyb290OgotCUBlY2hvIGluY3Jvb3Q9JyR7SU5DUk9PVH0nCi11c3JsaWJkaXI6Ci0JQGVjaG8gdXNybGliZGlyPScke1VTUkxJQkRJUn0nCi1saWJkaXI6Ci0JQGVjaG8gbGliZGlyPScke0xJQkRJUn0nCi1fQUNFT0YKLSAgaWYgKGV4cG9ydCBDQzsgJHtYTUtNRi14bWttZn0pID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgotICAgICMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLSAgICBmb3IgYWNfdmFyIGluIGluY3Jvb3QgdXNybGliZGlyIGxpYmRpcjsgZG8KLSAgICAgIGV2YWwgImFjX2ltXyRhY192YXI9XGBcJHtNQUtFLW1ha2V9ICRhY192YXIgMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvXiRhY192YXI9Ly9wJ1xgIgotICAgIGRvbmUKLSAgICAjIE9wZW4gV2luZG93cyB4bWttZiByZXBvcnRlZGx5IHNldHMgTElCRElSIGluc3RlYWQgb2YgVVNSTElCRElSLgotICAgIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbCBkeWxpYiBsYSBkbGw7IGRvCi0gICAgICBpZiB0ZXN0ICEgLWYgIiRhY19pbV91c3JsaWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iICYmCi0JIHRlc3QgLWYgIiRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCi0JYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uICBUaGV5IGFyZQotICAgICMgYm9ndXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGFueXdheSwgYW5kIGJlY2F1c2UKLSAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCi0gICAgY2FzZSAkYWNfaW1faW5jcm9vdCBpbgotCS91c3IvaW5jbHVkZSkgYWNfeF9pbmNsdWRlcz0gOzsKLQkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9JGFjX2ltX2luY3Jvb3Q7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19pbV91c3JsaWJkaXIgaW4KLQkvdXNyL2xpYiB8IC91c3IvbGliNjQgfCAvbGliIHwgL2xpYjY0KSA7OwotCSopIHRlc3QgLWQgIiRhY19pbV91c3JsaWJkaXIiICYmIGFjX3hfbGlicmFyaWVzPSRhY19pbV91c3JsaWJkaXIgOzsKLSAgICBlc2FjCi0gIGZpCi0gIGNkIC4uCi0gIHJtIC1mIC1yIGNvbmZ0ZXN0LmRpcgotZmkKLQotIyBTdGFuZGFyZCBzZXQgb2YgY29tbW9uIGRpcmVjdG9yaWVzIGZvciBYIGhlYWRlcnMuCi0jIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KLWFjX3hfaGVhZGVyX2RpcnM9JwotL3Vzci9YMTEvaW5jbHVkZQotL3Vzci9YMTFSNy9pbmNsdWRlCi0vdXNyL1gxMVI2L2luY2x1ZGUKLS91c3IvWDExUjUvaW5jbHVkZQotL3Vzci9YMTFSNC9pbmNsdWRlCi0KLS91c3IvaW5jbHVkZS9YMTEKLS91c3IvaW5jbHVkZS9YMTFSNwotL3Vzci9pbmNsdWRlL1gxMVI2Ci0vdXNyL2luY2x1ZGUvWDExUjUKLS91c3IvaW5jbHVkZS9YMTFSNAotCi0vdXNyL2xvY2FsL1gxMS9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI3L2luY2x1ZGUKLS91c3IvbG9jYWwvWDExUjYvaW5jbHVkZQotL3Vzci9sb2NhbC9YMTFSNS9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI0L2luY2x1ZGUKLQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI3Ci0vdXNyL2xvY2FsL2luY2x1ZGUvWDExUjYKLS91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI0Ci0KLS91c3IvWDM4Ni9pbmNsdWRlCi0vdXNyL3gzODYvaW5jbHVkZQotL3Vzci9YRnJlZTg2L2luY2x1ZGUvWDExCi0KLS91c3IvaW5jbHVkZQotL3Vzci9sb2NhbC9pbmNsdWRlCi0vdXNyL3Vuc3VwcG9ydGVkL2luY2x1ZGUKLS91c3IvYXRoZW5hL2luY2x1ZGUKLS91c3IvbG9jYWwveDExcjUvaW5jbHVkZQotL3Vzci9scHAvWGFtcGxlcy9pbmNsdWRlCi0KLS91c3Ivb3Blbndpbi9pbmNsdWRlCi0vdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZScKLQotaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gbm87IHRoZW4KLSAgIyBHdWVzcyB3aGVyZSB0byBmaW5kIGluY2x1ZGUgZmlsZXMsIGJ5IGxvb2tpbmcgZm9yIFhsaWIuaC4KLSAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPFgxMS9YbGliLmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIFdlIGNhbiBjb21waWxlIHVzaW5nIFggaGVhZGVycyB3aXRoIG5vIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkuCi1hY194X2luY2x1ZGVzPQotZWxzZQotICBmb3IgYWNfZGlyIGluICRhY194X2hlYWRlcl9kaXJzOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfZGlyL1gxMS9YbGliLmgiOyB0aGVuCi0gICAgYWNfeF9pbmNsdWRlcz0kYWNfZGlyCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci1maSAjICRhY194X2luY2x1ZGVzID0gbm8KLQotaWYgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IG5vOyB0aGVuCi0gICMgQ2hlY2sgZm9yIHRoZSBsaWJyYXJpZXMuCi0gICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCi0gICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgotICBhY19zYXZlX0xJQlM9JExJQlMKLSAgTElCUz0iLWxYMTEgJExJQlMiCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxYMTEvWGxpYi5oPgotaW50Ci1tYWluICgpCi17Ci1Ycm1Jbml0aWFsaXplICgpCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgTElCUz0kYWNfc2F2ZV9MSUJTCi0jIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KLWFjX3hfbGlicmFyaWVzPQotZWxzZQotICBMSUJTPSRhY19zYXZlX0xJQlMKLWZvciBhY19kaXIgaW4gYCRhc19lY2hvICIkYWNfeF9pbmNsdWRlcyAkYWNfeF9oZWFkZXJfZGlycyIgfCBzZWQgcy9pbmNsdWRlL2xpYi9nYAotZG8KLSAgIyBEb24ndCBldmVuIGF0dGVtcHQgdGhlIGhhaXIgb2YgdHJ5aW5nIHRvIGxpbmsgYW4gWCBwcm9ncmFtIQotICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2wgZHlsaWIgbGEgZGxsOyBkbwotICAgIGlmIHRlc3QgLXIgIiRhY19kaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCi0gICAgICBhY194X2xpYnJhcmllcz0kYWNfZGlyCi0gICAgICBicmVhayAyCi0gICAgZmkKLSAgZG9uZQotZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maSAjICRhY194X2xpYnJhcmllcyA9IG5vCi0KLWNhc2UgJGFjX3hfaW5jbHVkZXMsJGFjX3hfbGlicmFyaWVzIGluICMoCi0gIG5vLCogfCAqLG5vIHwgKlwnKikKLSAgICAjIERpZG4ndCBmaW5kIFgsIG9yIGEgZGlyZWN0b3J5IGhhcyAiJyIgaW4gaXRzIG5hbWUuCi0gICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9bm8iOzsgIygKLSAgKikKLSAgICAjIFJlY29yZCB3aGVyZSB3ZSBmb3VuZCBYIGZvciB0aGUgY2FjaGUuCi0gICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAotCWFjX3hfaW5jbHVkZXM9JyRhY194X2luY2x1ZGVzJ1wKLQlhY194X2xpYnJhcmllcz0nJGFjX3hfbGlicmFyaWVzJyIKLWVzYWMKLWZpCi07OyAjKAotICAgICopIGhhdmVfeD15ZXM7OwotICBlc2FjCi0gIGV2YWwgIiRhY19jdl9oYXZlX3giCi1maSAjICR3aXRoX3ggIT0gbm8KLQotaWYgdGVzdCAiJGhhdmVfeCIgIT0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGF2ZV94IiA+JjUKLSRhc19lY2hvICIkaGF2ZV94IiA+JjY7IH0KLSAgbm9feD15ZXMKLWVsc2UKLSAgIyBJZiBlYWNoIG9mIHRoZSB2YWx1ZXMgd2FzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGl0IG92ZXJyaWRlcyBlYWNoIGd1ZXNzLgotICB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcwotICB0ZXN0ICJ4JHhfbGlicmFyaWVzIiA9IHhOT05FICYmIHhfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcwotICAjIFVwZGF0ZSB0aGUgY2FjaGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgY29tbWFuZCBsaW5lIHZhbHVlcy4KLSAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAotCWFjX3hfaW5jbHVkZXM9JyR4X2luY2x1ZGVzJ1wKLQlhY194X2xpYnJhcmllcz0nJHhfbGlicmFyaWVzJyIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiID4mNQotJGFzX2VjaG8gImxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJG5vX3giID0geWVzOyB0aGVuCi0gICMgTm90IGFsbCBwcm9ncmFtcyBtYXkgdXNlIHRoaXMgc3ltYm9sLCBidXQgaXQgZG9lcyBub3QgaHVydCB0byBkZWZpbmUgaXQuCi0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgWF9ESVNQTEFZX01JU1NJTkcgMSIgPj5jb25mZGVmcy5oCi0KLSAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQotZWxzZQotICBpZiB0ZXN0IC1uICIkeF9pbmNsdWRlcyI7IHRoZW4KLSAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCi0gIGZpCi0KLSAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgotICBpZiB0ZXN0IC1uICIkeF9saWJyYXJpZXMiOyB0aGVuCi0gICAgWF9MSUJTPSIkWF9MSUJTIC1MJHhfbGlicmFyaWVzIgotICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKLSAgICAjIG90aGVycyByZXF1aXJlIG5vIHNwYWNlLiAgV29yZHMgYXJlIG5vdCBzdWZmaWNpZW50IC4gLiAuIC4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLi4uICIgPiY2OyB9Ci0gICAgYWNfeHNhdmVfTElCUz0kTElCUzsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCi0gICAgYWNfeHNhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgIFhfTElCUz0iJFhfTElCUyAtUiR4X2xpYnJhcmllcyIKLWVsc2UKLSAgTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCSAgWF9MSUJTPSIkWF9MSUJTIC1SICR4X2xpYnJhcmllcyIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5laXRoZXIgd29ya3MiID4mNQotJGFzX2VjaG8gIm5laXRoZXIgd29ya3MiID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBhY19jX3dlcnJvcl9mbGFnPSRhY194c2F2ZV9jX3dlcnJvcl9mbGFnCi0gICAgTElCUz0kYWNfeHNhdmVfTElCUwotICBmaQotCi0gICMgQ2hlY2sgZm9yIHN5c3RlbS1kZXBlbmRlbnQgbGlicmFyaWVzIFggcHJvZ3JhbXMgbXVzdCBsaW5rIHdpdGguCi0gICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCi0gICMgKC1sSUNFKSwgc2luY2Ugd2UgbWF5IG5lZWQgLWxzb2NrZXQgb3Igd2hhdGV2ZXIgZm9yIFggbGlua2luZy4KLQotICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgotICAgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbF9zIC1saW5ldCIKLSAgZWxzZQotICAgICMgTWFydHluIEpvaG5zb24gc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAotICAgICMgbGlicmFyaWVzIHdlcmUgYnVpbHQgd2l0aCBERUNuZXQgc3VwcG9ydC4gIEFuZCBLYXJsIEJlcnJ5IHNheXMKLSAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgotICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgJFhfTElCUyAtbFgxMSIKLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWE9wZW5EaXNwbGF5ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWE9wZW5EaXNwbGF5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZG5ldCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZG5ldF9udG9hICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZG5ldF9udG9hICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sZG5ldCIKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0X3N0dWIuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2ErOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRuZXRfc3R1YiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZG5ldF9udG9hICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZG5ldF9udG9hICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hPXllcwotZWxzZQotICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXRfc3R1YiIKLWZpCi0KLSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgTElCUz0iJGFjX3hzYXZlX0xJQlMiCi0KLSAgICAjIG1zaEBjaXMudWZsLmVkdSBzYXlzIC1sbnNsIChhbmQgLWxzb2NrZXQpIGFyZSBuZWVkZWQgZm9yIGhpcyAzODYvQVQsCi0gICAgIyB0byBnZXQgdGhlIFN5c1YgdHJhbnNwb3J0IGZ1bmN0aW9ucy4KLSAgICAjIENoYWQgUi4gTGFyc29uIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQotICAgICMgbmVlZHMgLWxuc2wuCi0gICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKLSAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gVC5FLiBEaWNrZXkuCi0gICAgIyBUaGUgZnVuY3Rpb25zIGdldGhvc3RieW5hbWUsIGdldHNlcnZieW5hbWUsIGFuZCBpbmV0X2FkZHIgYXJlCi0gICAgIyBpbiAtbGJzZCBvbiBMeW54T1MgMy4wLjEvaTM4NiwgYWNjb3JkaW5nIHRvIExhcnMgSGVja2luZy4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRob3N0YnluYW1lIiAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sbnNsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRob3N0YnluYW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ2V0aG9zdGJ5bmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbCIKLWZpCi0KLSAgICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbGJzZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbGJzZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGJzZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxic2QiCi1maQotCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIGxpZWRlckBza3lsZXIubWF2ZC5ob25leXdlbGwuY29tIHNheXMgd2l0aG91dCAtbHNvY2tldCwKLSAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKLSAgICAjIDIuMC4gIEJ1dCAtbHNvY2tldCBpcyBicm9rZW4gb24gSVJJWCA1LjIgKGFuZCBpcyBub3QgbmVjZXNzYXJ5Ci0gICAgIyBvbiBsYXRlciB2ZXJzaW9ucyksIHNheXMgU2ltb24gTGVpbmVuOiBpdCBjb250YWlucyBnZXRob3N0YnkqCi0gICAgIyB2YXJpYW50cyB0aGF0IGRvbid0IHVzZSB0aGUgbmFtZSBzZXJ2ZXIgKG9yIHNvbWV0aGluZykuICAtbHNvY2tldAotICAgICMgbXVzdCBiZSBnaXZlbiBiZWZvcmUgLWxuc2wgaWYgYm90aCBhcmUgbmVlZGVkLiAgV2UgYXNzdW1lIHRoYXQKLSAgICAjIGlmIGNvbm5lY3QgbmVlZHMgLWxuc2wsIHNvIGRvZXMgZ2V0aG9zdGJ5bmFtZS4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJjb25uZWN0IiAiYWNfY3ZfZnVuY19jb25uZWN0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Nvbm5lY3QiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY29ubmVjdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGNvbm5lY3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0PXllcwotZWxzZQotICBhY19jdl9saWJfc29ja2V0X2Nvbm5lY3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiCi1maQotCi0gICAgZmkKLQotICAgICMgR3VpbGxlcm1vIEdvbWV6IHNheXMgLWxwb3NpeCBpcyBuZWNlc3Nhcnkgb24gQS9VWC4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJyZW1vdmUiICJhY19jdl9mdW5jX3JlbW92ZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19yZW1vdmUiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcG9zaXhfcmVtb3ZlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwb3NpeCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcmVtb3ZlICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcmVtb3ZlICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcG9zaXhfcmVtb3ZlIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxwb3NpeCIKLWZpCi0KLSAgICBmaQotCi0gICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaG1hdCIgImFjX2N2X2Z1bmNfc2htYXQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2htYXQiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pcGNfc2htYXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGlwYyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2htYXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzaG1hdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfaXBjX3NobWF0PXllcwotZWxzZQotICBhY19jdl9saWJfaXBjX3NobWF0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pcGNfc2htYXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfaXBjX3NobWF0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2lwY19zaG1hdCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1saXBjIgotZmkKLQotICAgIGZpCi0gIGZpCi0KLSAgIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgWDExUjYgWHQvWGF3IHByb2dyYW1zIG5lZWQuCi0gIGFjX3NhdmVfTERGTEFHUz0kTERGTEFHUwotICB0ZXN0IC1uICIkeF9saWJyYXJpZXMiICYmIExERkxBR1M9IiRMREZMQUdTIC1MJHhfbGlicmFyaWVzIgotICAjIFNNIG5lZWRzIElDRSB0byAoZHluYW1pY2FsbHkpIGxpbmsgdW5kZXIgU3VuT1MgNC54IChzbyB3ZSBoYXZlIHRvCi0gICMgY2hlY2sgZm9yIElDRSBmaXJzdCksIGJ1dCB3ZSBtdXN0IGxpbmsgaW4gdGhlIG9yZGVyIC1sU00gLWxJQ0Ugb3IKLSAgIyB3ZSBnZXQgdW5kZWZpbmVkIHN5bWJvbHMuICBTbyBhc3N1bWUgd2UgaGF2ZSBTTSBpZiB3ZSBoYXZlIElDRS4KLSAgIyBUaGVzZSBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGJlZm9yZSAtbFgxMSwgdW5saWtlIHRoZSBvdGhlcgotICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KLSAgIyBKb2huIEludGVycmFudGUsIEthcmwgQmVycnkKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbElDRSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIEljZUNvbm5lY3Rpb25OdW1iZXIgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBJY2VDb25uZWN0aW9uTnVtYmVyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxTTSAtbElDRSIKLWZpCi0KLSAgTERGTEFHUz0kYWNfc2F2ZV9MREZMQUdTCi0KLWZpCi0KLQotCi0jIFNlZSBpZiB3ZSBhcmUgdG8gYnVpbGQgeDExdm5jOgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcjsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteDExdm5jIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94MTF2bmMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3gxMXZuYzsgCi1maQotCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfeDExdm5jIiAtYSAiJHdpdGhfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JYnVpbGRfeDExdm5jPSJ5ZXMiCi1lbGlmIHRlc3QgIiRQQUNLQUdFX05BTUUiID0gIngxMXZuYyI7IHRoZW4KLQlidWlsZF94MTF2bmM9InllcyIKLWVsc2UKLQlidWlsZF94MTF2bmM9Im5vIgotZmkKLQkKLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14a2V5Ym9hcmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hrZXlib2FyZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGtleWJvYXJkOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14aW5lcmFtYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGluZXJhbWErc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hpbmVyYW1hOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14cmFuZHIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hyYW5kcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeHJhbmRyOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14Zml4ZXMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hmaXhlcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGZpeGVzOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14ZGFtYWdlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94ZGFtYWdlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94ZGFtYWdlOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14dHJhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeHRyYXArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3h0cmFwOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14cmVjb3JkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94cmVjb3JkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94cmVjb3JkOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mYnBtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9mYnBtK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9mYnBtOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1kcG1zIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9kcG1zK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9kcG1zOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC12NGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3Y0bCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdjRsOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mYmRldiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZmJkZXYrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2ZiZGV2OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC11aW5wdXQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3VpbnB1dCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdWlucHV0OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1tYWNvc3gtbmF0aXZlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tYWNvc3hfbmF0aXZlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9tYWNvc3hfbmF0aXZlOyAKLWZpCi0KLQotZmkKLSMgZW5kIHgxMXZuYyBvbmx5LgotCi1pZiB0ZXN0ICJ4JHdpdGhfeCIgPSAieG5vIjsgdGhlbgotCUhBVkVfWDExPSJmYWxzZSIKLWVsaWYgdGVzdCAiJFhfQ0ZMQUdTIiAhPSAiLURYX0RJU1BMQVlfTUlTU0lORyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYR2V0SW1hZ2UgaW4gLWxYMTEiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhHZXRJbWFnZSBpbiAtbFgxMS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWDExX1hHZXRJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWDExICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhHZXRJbWFnZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhHZXRJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWDExX1hHZXRJbWFnZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2U9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWDExX1hHZXRJbWFnZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YMTFfWEdldEltYWdlIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1gxMSAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1gxMT0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9YMTE9ImZhbHNlIgotZmkKLQotCi0JIyB4MTF2bmMgb25seToKLQlpZiB0ZXN0ICRIQVZFX1gxMSA9ICJ0cnVlIiAtYSAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCQlYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYZXh0IgotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhTaG1HZXRJbWFnZSBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhTaG1HZXRJbWFnZSBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhTaG1HZXRJbWFnZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhTaG1HZXRJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2U9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X1hTaG1HZXRJbWFnZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfWFNITSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSZWFkU2NyZWVuIGluIC1sWGV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFJlYWRTY3JlZW4gaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhSZWFkU2NyZWVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFJlYWRTY3JlZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbiIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLQkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIlgxMS9leHRlbnNpb25zL3JlYWRkaXNwbGF5LmgiICJhY19jdl9oZWFkZXJfWDExX2V4dGVuc2lvbnNfcmVhZGRpc3BsYXlfaCIgIiNpbmNsdWRlIDxYMTEvWGxpYi5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfWDExX2V4dGVuc2lvbnNfcmVhZGRpc3BsYXlfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9JUklYX1hSRUFERElTUExBWSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0KLQkJaWYgdGVzdCAieCR3aXRoX2ZicG0iICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBGQlBNRm9yY2VMZXZlbCBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEZCUE1Gb3JjZUxldmVsIGluIC1sWGV4dC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBGQlBNRm9yY2VMZXZlbCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIEZCUE1Gb3JjZUxldmVsICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfRkJQTSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF9kcG1zIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRFBNU0ZvcmNlTGV2ZWwgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBEUE1TRm9yY2VMZXZlbCBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhleHQgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgRFBNU0ZvcmNlTGV2ZWwgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBEUE1TRm9yY2VMZXZlbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWw9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0RQTVMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYVGVzdEdyYWJDb250cm9sIGluIC1sWHRzdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFRlc3RHcmFiQ29udHJvbCBpbiAtbFh0c3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWHRzdCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYVGVzdEdyYWJDb250cm9sICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFRlc3RHcmFiQ29udHJvbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPXllcwotZWxzZQotICBhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSItbFh0c3QgJFhfUFJFTElCUyIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfWFRFU1RHUkFCQ09OVFJPTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1hURVNUR1JBQkNPTlRST0w9InRydWUiCi1maQotCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQgaW4gLWxYdHN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYVGVzdEZha2VLZXlFdmVudCBpbiAtbFh0c3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFRlc3RGYWtlS2V5RXZlbnQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYVGVzdEZha2VLZXlFdmVudCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50IiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9YVEVTVCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1hURVNUPSJ0cnVlIgotZmkKLQotCi0JCWlmIHRlc3QgIngkd2l0aF94cmVjb3JkIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyBpbiAtbFh0c3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iLWxYdHN0ICRYX1BSRUxJQlMiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9SRUNPUkQgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQkjIHdlIHVzZSBYVFJBUCBvbiBYMTFSNSwgb3IgdXNlciBjYW4gc2V0IFgxMVZOQ19VU0VfWFRSQVAKLQkJaWYgdGVzdCAieCR3aXRoX3h0cmFwIiAhPSAieG5vIjsgdGhlbgotCQkgICAgaWYgdGVzdCAhIC16ICIkWDExVk5DX1VTRV9YVFJBUCIgLW8gLXogIiRIQVZFX1hURVNUR1JBQkNPTlRST0wiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYRVRyYXBTZXRHcmFiU2VydmVyIGluIC1sWFRyYXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYVHJhcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWFRyYXAgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlciIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWFRyYXAiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYVFJBUCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkJIyB0cnU2NCB1c2VzIGxpYlhFVHJhcC5zbwotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhFVHJhcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhFVHJhcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhFVHJhcCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYRVRyYXBTZXRHcmFiU2VydmVyICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YRVRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhFVHJhcCIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhUUkFQIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCSAgICBmaQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94a2V5Ym9hcmQiICE9ICJ4bm8iOyB0aGVuCi0JCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkWF9DRkxBR1MiCi0JCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiWDExL1hLQmxpYi5oIiAiYWNfY3ZfaGVhZGVyX1gxMV9YS0JsaWJfaCIgIiNpbmNsdWRlIDxYMTEvWGxpYi5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfWDExX1hLQmxpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1hLQkxJQl9IPSJ0cnVlIgotZWxzZQotICBIQVZFX1hLQkxJQl9IPSJmYWxzZSIKLWZpCi0KLQotCQkJQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKLQkJCWlmIHRlc3QgJEhBVkVfWEtCTElCX0ggPSAidHJ1ZSI7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYa2JTZWxlY3RFdmVudHMgaW4gLWxYMTEiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhrYlNlbGVjdEV2ZW50cyBpbiAtbFgxMS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWDExICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhrYlNlbGVjdEV2ZW50cyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhrYlNlbGVjdEV2ZW50cyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1hLRVlCT0FSRCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkJZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGluZXJhbWEiICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYaW5lcmFtYVF1ZXJ5U2NyZWVucyBpbiAtbFhpbmVyYW1hIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYaW5lcmFtYVF1ZXJ5U2NyZWVucyBpbiAtbFhpbmVyYW1hLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YaW5lcmFtYV9YaW5lcmFtYVF1ZXJ5U2NyZWVucys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGluZXJhbWEgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWGluZXJhbWFRdWVyeVNjcmVlbnMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYaW5lcmFtYVF1ZXJ5U2NyZWVucyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YaW5lcmFtYV9YaW5lcmFtYVF1ZXJ5U2NyZWVucz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhpbmVyYW1hIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWElORVJBTUEgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJhbmRyIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFJSU2VsZWN0SW5wdXQgaW4gLWxYcmFuZHIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSUlNlbGVjdElucHV0IGluIC1sWHJhbmRyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhyYW5kciAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYUlJTZWxlY3RJbnB1dCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSUlNlbGVjdElucHV0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hyYW5kcl9YUlJTZWxlY3RJbnB1dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0IiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYcmFuZHIiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYUkFORFIgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJYUkFORFI9InRydWUiCi1maQotCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hmaXhlcyIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhGaXhlc0dldEN1cnNvckltYWdlIGluIC1sWGZpeGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYRml4ZXNHZXRDdXJzb3JJbWFnZSBpbiAtbFhmaXhlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZml4ZXMgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYRml4ZXNHZXRDdXJzb3JJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlPXllcwotZWxzZQotICBhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZml4ZXNfWEZpeGVzR2V0Q3Vyc29ySW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGZpeGVzIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWEZJWEVTIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWEZJWEVTPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94ZGFtYWdlIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGRhbWFnZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGRhbWFnZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhkYW1hZ2UgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hkYW1hZ2VfWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGRhbWFnZSIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhEQU1BR0UgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJYREFNQUdFPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgISAteiAiJEhBVkVfTElCWEZJWEVTIiAtbyAhIC16ICIkSEFWRV9MSUJYREFNQUdFIjsgdGhlbgotCQkJIyBuZWVkIC91c3Ivc2Z3L2xpYiBpbiBSUEFUSCBmb3IgU29sYXJpcyAxMCBhbmQgbGF0ZXIKLQkJCWNhc2UgYCh1bmFtZSAtc3IpIDI+L2Rldi9udWxsYCBpbgotCQkJIlN1bk9TIDUiKikgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1SL3Vzci9zZncvbGliIiA7OwotCQkJZXNhYwotCQlmaQotCQlpZiB0ZXN0ICEgLXogIiRIQVZFX0xJQlhSQU5EUiI7IHRoZW4KLQkJCSMgYWxzbyBuZWVkIC91c3IvWDExL2luY2x1ZGUgZm9yIFNvbGFyaXMgMTAgMTAvMDggYW5kIGxhdGVyCi0JCQljYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLQkJCSJTdW5PUyA1IiopIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL1gxMS9pbmNsdWRlIiA7OwotCQkJZXNhYwotCQlmaQotCi0JCVhfTElCUz0iJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMiCi0JZmkKLQkjIGVuZCB4MTF2bmMgb25seS4KLWZpCi0KLQotIGlmIHRlc3QgJEhBVkVfWDExICE9ICJmYWxzZSI7IHRoZW4KLSAgSEFWRV9YMTFfVFJVRT0KLSAgSEFWRV9YMTFfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfWDExX1RSVUU9JyMnCi0gIEhBVkVfWDExX0ZBTFNFPQotZmkKLQotCi0jIHgxMXZuYyBvbmx5OgotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCi1pZiB0ZXN0ICJ4JEhBVkVfWDExIiA9ICJ4ZmFsc2UiIC1hICJ4JHdpdGhfeCIgIT0gInhubyI7IHRoZW4KLQlhc19mbl9lcnJvciAkPyAiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBYIHdpbmRvdyBzeXN0ZW0gYnVpbGQgZW52aXJvbm1lbnQgaXMgcmVxdWlyZWQgdG8gYnVpbGQgKioqCi14MTF2bmMuICBNYWtlIHN1cmUgYW55IHJlcXVpcmVkIFggZGV2ZWxvcG1lbnQgcGFja2FnZXMgYXJlIGluc3RhbGxlZC4KLUlmIHRoZXkgYXJlIGluc3RhbGxlZCBpbiBub24tc3RhbmRhcmQgbG9jYXRpb25zLCBvbmUgY2FuIHVzZSB0aGUKLS0teC1pbmNsdWRlcz1ESVIgYW5kIC0teC1saWJyYXJpZXM9RElSIGNvbmZpZ3VyZSBvcHRpb25zIG9yIHNldCB0aGUKLUNQUEZMQUdTIGFuZCBMREZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgWAotd2luZG93IHN5c3RlbSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBtYXkgYmUgZm91bmQuICBPbiA2NCszMiBiaXQKLW1hY2hpbmVzIHlvdSBtYXkgbmVlZCB0byBwb2ludCB0byBsaWI2NCBvciBsaWIzMiBkaXJlY3RvcmllcyB0byBwaWNrIHVwCi10aGUgY29ycmVjdCB3b3JkIHNpemUuCi0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIHgxMXZuYyB3aXRob3V0IFggc3VwcG9ydCAoZS5nLiBmb3IgLXJhd2ZiIHVzZSBvbmx5Ci1vciBmb3IgbmF0aXZlIE1hYyBPUyBYKSwgc3BlY2lmeSB0aGUgLS13aXRob3V0LXggY29uZmlndXJlIG9wdGlvbi4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iICIkTElORU5PIiA1Ci1maQotCi1pZiB0ZXN0ICJ4JEhBVkVfWDExIiA9ICJ4dHJ1ZSIgLWEgIngkSEFWRV9YVEVTVCIgIT0gInh0cnVlIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIFhURVNUIGV4dGVuc2lvbiB3YXMgbm90IGZvdW5kICoqKgotKGxpYlh0c3QpLiAgQW4geDExdm5jIGJ1aWx0IHRoaXMgd2F5IHdpbGwgYmUgKk9OTFkgQkFSRUxZIFVTQUJMRSouCi1Zb3Ugd2lsbCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlIGJ1dCBub3QgY2xpY2sgb3IgdHlwZS4gIFRoZXJlIGNhbgotYWxzbyBiZSBkZWFkbG9ja3MgaWYgYW4gYXBwbGljYXRpb24gZ3JhYnMgdGhlIFggc2VydmVyLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMKLWZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgotY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogQSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgWFRFU1QgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQgKioqCi0obGliWHRzdCkuICBBbiB4MTF2bmMgYnVpbHQgdGhpcyB3YXkgd2lsbCBiZSAqT05MWSBCQVJFTFkgVVNBQkxFKi4KLVlvdSB3aWxsIGJlIGFibGUgdG8gbW92ZSB0aGUgbW91c2UgYnV0IG5vdCBjbGljayBvciB0eXBlLiAgVGhlcmUgY2FuCi1hbHNvIGJlIGRlYWRsb2NrcyBpZiBhbiBhcHBsaWNhdGlvbiBncmFicyB0aGUgWCBzZXJ2ZXIuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGluc3RhbGwgdGhlIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCBwYWNrYWdlcwotZm9yIFhURVNUIChwZXJoYXBzIGl0IGlzIG5hbWVkIHNvbWV0aGluZyBsaWtlIGxpYnh0c3QtZGV2KSBhbmQgcnVuCi1jb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCXNsZWVwIDUKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF92NGwiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L3ZpZGVvZGV2LmgiICJhY19jdl9oZWFkZXJfbGludXhfdmlkZW9kZXZfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfdmlkZW9kZXZfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSU5VWF9WSURFT0RFVl9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfZmJkZXYiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L2ZiLmgiICJhY19jdl9oZWFkZXJfbGludXhfZmJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfZmJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSU5VWF9GQl9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfdWlucHV0IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9pbnB1dC5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2lucHV0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lucHV0X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfSU5QVVRfSCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJTlVYX0lOUFVUX0g9InRydWUiCi1maQotCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfTElOVVhfSU5QVVRfSCIgPSAieHRydWUiOyB0aGVuCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsaW51eC91aW5wdXQuaCIgImFjX2N2X2hlYWRlcl9saW51eF91aW5wdXRfaCIgIiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfdWlucHV0X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfVUlOUFVUX0ggMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCWZpCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfbWFjb3N4X25hdGl2ZSIgIT0gInhubyI7IHRoZW4KLQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BQ09TWF9OQVRJVkVfRElTUExBWSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBDaGVjayBmb3IgT1MgWCBvcGVuZ2wgaGVhZGVyCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiT3BlbkdML09wZW5HTC5oIiAiYWNfY3ZfaGVhZGVyX09wZW5HTF9PcGVuR0xfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfT3BlbkdMX09wZW5HTF9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BQ09TWF9PUEVOR0xfSCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX01BQ09TWF9PUEVOR0xfSD0idHJ1ZSIKLWZpCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1hdmFoaSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYXZhaGkrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2F2YWhpOyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9hdmFoaSIgIT0gInhubyI7IHRoZW4KLQlwcmludGYgImNoZWNraW5nIGZvciBhdmFoaS4uLiAiCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9hdmFoaSIgLWEgIngkd2l0aF9hdmFoaSIgIT0gInh5ZXMiOyB0aGVuCi0JCUFWQUhJX0NGTEFHUz0iLUkkd2l0aF9hdmFoaS9pbmNsdWRlIgotCQlBVkFISV9MSUJTPSItTCR3aXRoX2F2YWhpL2xpYiAtbGF2YWhpLWNvbW1vbiAtbGF2YWhpLWNsaWVudCIKLQkJZWNobyAidXNpbmcgJHdpdGhfYXZhaGkiCi0JCXdpdGhfYXZhaGk9eWVzCi0JZWxpZiBwa2ctY29uZmlnIC0tYXRsZWFzdC12ZXJzaW9uPTAuNi40IGF2YWhpLWNsaWVudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJQVZBSElfQ0ZMQUdTPWBwa2ctY29uZmlnIC0tY2ZsYWdzIGF2YWhpLWNsaWVudGAKLQkJQVZBSElfTElCUz1gcGtnLWNvbmZpZyAtLWxpYnMgYXZhaGktY2xpZW50YAotCQl3aXRoX2F2YWhpPXllcwotCQllY2hvIHllcwotCWVsc2UKLQkJd2l0aF9hdmFoaT1ubwotCQllY2hvIG5vCi0JZmkKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfYXZhaGkiID0gInh5ZXMiOyB0aGVuCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9BVkFISSAxIiA+PmNvbmZkZWZzLmgKLQotCQotCQotZmkKLQotZmkKLSMgZW5kIHgxMXZuYyBvbmx5LgotCi0jIG9ubHkgdXNlZCBpbiB4MTF2bmMvTWFrZWZpbGUuYW0gYnV0IG5lZWRzIHRvIGFsd2F5cyBiZSBkZWZpbmVkOgotIGlmIHRlc3QgIiRIQVZFX01BQ09TWF9PUEVOR0xfSCIgPSAidHJ1ZSI7IHRoZW4KLSAgT1NYX09QRU5HTF9UUlVFPQotICBPU1hfT1BFTkdMX0ZBTFNFPScjJwotZWxzZQotICBPU1hfT1BFTkdMX1RSVUU9JyMnCi0gIE9TWF9PUEVOR0xfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgLWEgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAhPSAieG5vIjsgdGhlbgotCXByaW50ZiAiY2hlY2tpbmcgZm9yIHN5c3RlbSBsaWJ2bmNzZXJ2ZXIuLi4gIgotCXZuZWVkPSIwLjkuMSIKLQlpZiB0ZXN0ICJYJFZORUVEIiAhPSAiWCI7IHRoZW4KLQkJdm5lZWQ9JFZORUVECi0JZmkKLQlpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInh5ZXMiOyB0aGVuCi0JCXJmbGFnPSIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJcmZsYWc9Ii1YbGlua2VyIC1SJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIiCi0JCWVsc2UKLQkJCXJmbGFnPSItUiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliIgotCQlmaQotCQljbWQ9IiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvYmluL2xpYnZuY3NlcnZlci1jb25maWciCi0JCWlmICRjbWQgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCWN2ZXJzPWAkY21kIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKLQkJCWNzY29yZT1gZWNobyAiJGN2ZXJzIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCQkJbnNjb3JlPWBlY2hvICIkdm5lZWQiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0KLQkJCWlmIHRlc3QgJGNzY29yZSAtbHQgJG5zY29yZTsgdGhlbgotCQkJCWVjaG8gIm5vIgotCQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQkJCWFzX2ZuX2Vycm9yICQ/ICIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTmVlZCBsaWJ2bmNzZXJ2ZXIgdmVyc2lvbiAkdm5lZWQsIGhhdmUgdmVyc2lvbiAkY3ZlcnMgKioqCi1Zb3UgYXJlIGJ1aWxkaW5nIHdpdGggYSBzeXN0ZW0gaW5zdGFsbGVkIGxpYnZuY3NlcnZlciBhbmQgaXQgaXMgbm90Ci1uZXcgZW5vdWdoLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgIiRMSU5FTk8iIDUKLQkJCWVsc2UKLQkJCQlTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUz0iLUkkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2luY2x1ZGUiCi0JCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTPSItTCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliICRyZmxhZyAtbHZuY3NlcnZlciAtbHZuY2NsaWVudCIKLQkJCQllY2hvICJ1c2luZyAkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIgotCQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj15ZXMKLQkJCWZpCi0JCWVsc2UKLQkJCWVjaG8gIiAqKiogY2Fubm90IHJ1biAkY21kICoqKiAiIDE+JjIKLQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQkJZWNobyBubwotCQlmaQotCWVsaWYgbGlidm5jc2VydmVyLWNvbmZpZyAtLXZlcnNpb24gMT4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlyZmxhZz0iIgotCQlycHJlZml4PWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tcHJlZml4YAotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCXJmbGFnPSIgLVhsaW5rZXIgLVIkcnByZWZpeC9saWIgIgotCQllbHNlCi0JCQlyZmxhZz0iIC1SJHJwcmVmaXgvbGliICIKLQkJZmkKLQkJY3ZlcnM9YGxpYnZuY3NlcnZlci1jb25maWcgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAotCQljc2NvcmU9YGVjaG8gIiRjdmVycyIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQkJbnNjb3JlPWBlY2hvICIkdm5lZWQiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0KLQkJaWYgdGVzdCAkY3Njb3JlIC1sdCAkbnNjb3JlOyB0aGVuCi0JCQllY2hvICJubyIKLQkJCQlhc19mbl9lcnJvciAkPyAiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5lZWQgbGlidm5jc2VydmVyIHZlcnNpb24gJHZuZWVkLCBoYXZlIHZlcnNpb24gJGN2ZXJzICoqKgotWW91IGFyZSBidWlsZGluZyB3aXRoIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgYW5kIGl0IGlzIG5vdAotbmV3IGVub3VnaC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iICIkTElORU5PIiA1Ci0JCWVsc2UKLQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTPWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tY2ZsYWdzYAotCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTPSIkcmZsYWciYGxpYnZuY3NlcnZlci1jb25maWcgLS1saWJzYAotCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPXllcwotCQkJZWNobyB5ZXMKLQkJZmkKLQllbHNlCi0JCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQllY2hvIG5vCi0JZmkKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUiAxIiA+PmNvbmZkZWZzLmgKLQotCQotCQotZmkKLSBpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgPSAieHllcyI7IHRoZW4KLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9Ci0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9JyMnCi0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0KLWZpCi0KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtanBlZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfanBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfanBlZzsgCi1maQotCi0KLSMgQXQgdGhpcyBwb2ludDoKLSMJbm8ganBlZyBvbiBjb21tYW5kIGxpbmUgICB3aXRoX2pwZWc9IiIKLSMJLXdpdGgtanBlZyAgICAgICAgICAgICAgICB3aXRoX2pwZWc9InllcyIKLSMJLXdpdGhvdXQtanBlZyAgICAgICAgICAgICB3aXRoX2pwZWc9Im5vIgotIwktd2l0aC1qcGVnPS9mb28vZGlyICAgICAgIHdpdGhfanBlZz0iL2Zvby9kaXIiCi0KLUhBVkVfTElCSlBFR19UVVJCTz0iZmFsc2UiCi0KLWlmIHRlc3QgIngkd2l0aF9qcGVnIiAhPSAieG5vIjsgdGhlbgotCQotCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0Jc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0Jc2F2ZWRfTElCUz0iJExJQlMiCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9qcGVnIiAtYSAieCR3aXRoX2pwZWciICE9ICJ4eWVzIjsgdGhlbgotCQkjIGFkZCB1c2VyIHN1cHBsaWVkIGRpcmVjdG9yeSB0byBmbGFnczoKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX2pwZWcvaW5jbHVkZSIKLQkJTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aF9qcGVnL2xpYiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQkjIHRoaXMgaXMgbm90IGNvbXBsZXRlLi4uIGluIGdlbmVyYWwgYSByYXQncyBuZXN0LgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9qcGVnL2xpYiIKLQkJZWxzZQotCQkJTERGTEFHUz0iJExERkxBR1MgLVIkd2l0aF9qcGVnL2xpYiIKLQkJZmkKLQlmaQotCWlmIHRlc3QgIngkSlBFR19MREZMQUdTIiAhPSAieCI7IHRoZW4KLQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCUxJQlM9IiRMSUJTICRKUEVHX0xERkxBR1MiCi0JZWxzZQotCQlMSUJTPSItbGpwZWciCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAianBlZ2xpYi5oIiAiYWNfY3ZfaGVhZGVyX2pwZWdsaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfanBlZ2xpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0pQRUdMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpwZWdfQ3JlYXRlQ29tcHJlc3MgaW4gbGlianBlZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IganBlZ19DcmVhdGVDb21wcmVzcyBpbiBsaWJqcGVnLi4uICIgPiY2OyB9Ci0JaWYgdGVzdCAieCRIQVZFX0pQRUdMSUJfSCIgPSAieHRydWUiOyB0aGVuCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBqcGVnX0NyZWF0ZUNvbXByZXNzICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4ganBlZ19DcmVhdGVDb21wcmVzcyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfTsKLQkJCQkKLSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCSlBFRyAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH07IEhBVkVfSlBFR0xJQl9IPSIiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQlmaQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCSMgcmVzdG9yZSBvbGQgZmxhZ3Mgb24gZmFpbHVyZToKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKLQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYmpwZWcgY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJqcGVnIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtanBlZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9qcGVnbGliLmggYW5kIHRoZSBsaWJyYXJ5Ci1pbiBESVIvbGliL2xpYmpwZWcuYS4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIEpQRUdfTERGTEFHUyB2YXJpYWJsZSB0bwotc3BlY2lmeSBtb3JlIGRldGFpbGVkIGxpbmtlciBmbGFncy4gIEEgY29weSBvZiBsaWJqcGVnLXR1cmJvIG1heSBiZQotb2J0YWluZWQgZnJvbTogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvCi1BIGNvcHkgb2YgbGlianBlZyBtYXkgYmUgb2J0YWluZWQgZnJvbTogIGh0dHA6Ly9pamcub3JnL2ZpbGVzLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYmpwZWcgY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJqcGVnIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtanBlZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9qcGVnbGliLmggYW5kIHRoZSBsaWJyYXJ5Ci1pbiBESVIvbGliL2xpYmpwZWcuYS4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIEpQRUdfTERGTEFHUyB2YXJpYWJsZSB0bwotc3BlY2lmeSBtb3JlIGRldGFpbGVkIGxpbmtlciBmbGFncy4gIEEgY29weSBvZiBsaWJqcGVnLXR1cmJvIG1heSBiZQotb2J0YWluZWQgZnJvbTogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvCi1BIGNvcHkgb2YgbGlianBlZyBtYXkgYmUgb2J0YWluZWQgZnJvbTogIGh0dHA6Ly9pamcub3JnL2ZpbGVzLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQkJCXNsZWVwIDUKLQkJZmkKLQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giID0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgSlBFRyBsaWJyYXJ5IGlzIGxpYmpwZWctdHVyYm8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBKUEVHIGxpYnJhcnkgaXMgbGlianBlZy10dXJiby4uLiAiID4mNjsgfQotCQkKLQkJaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIjsgdGhlbgotCQkJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCQkJCSNpbmNsdWRlIDxqcGVnbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLQkJCQlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLQkJCQljaW5mby5lcnI9anBlZ19zdGRfZXJyb3IoJmplcnIpOwotCQkJCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7Ci0JCQkJanBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLQkJCQljaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19FWFRfUkdCOwotCQkJCWpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlKCZjaW5mbyk7Ci0JCQkJcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci0JCQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgSEFWRV9MSUJKUEVHX1RVUkJPPSJ0cnVlIjsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCQllbHNlCi0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQkJCQkjaW5jbHVkZSA8anBlZ2xpYi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0JCQkJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JCQkJY2luZm8uZXJyPWpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLQkJCQlqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotCQkJCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwotCQkJCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfRVhUX1JHQjsKLQkJCQlqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCQkJCXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotCQkKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBIQVZFX0xJQkpQRUdfVFVSQk89InRydWUiOyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCQlmaQotCWZpCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfSlBFR0xJQl9IIiA9ICJ4dHJ1ZSIgLWEgIngkSEFWRV9MSUJKUEVHX1RVUkJPIiAhPSAieHRydWUiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGxpYnJhcnkgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGlzIG5vdCBsaWJqcGVnLXR1cmJvLgotUGVyZm9ybWFuY2Ugd2lsbCBiZSByZWR1Y2VkLiAgWW91IGNhbiBvYnRhaW4gbGlianBlZy10dXJibyBmcm9tOgotaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8gKioqCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlianBlZyBsaWJyYXJ5IHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBpcyBub3QgbGlianBlZy10dXJiby4KLVBlcmZvcm1hbmNlIHdpbGwgYmUgcmVkdWNlZC4gIFlvdSBjYW4gb2J0YWluIGxpYmpwZWctdHVyYm8gZnJvbToKLWh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvICoqKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLSAgZmkKLQotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXBuZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcG5nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wbmc7IAotZmkKLQotCi0jIEF0IHRoaXMgcG9pbnQ6Ci0jCW5vIHBuZyBvbiBjb21tYW5kIGxpbmUgICAgd2l0aF9wbmc9IiIKLSMJLXdpdGgtcG5nICAgICAgICAgICAgICAgICB3aXRoX3BuZz0ieWVzIgotIwktd2l0aG91dC1wbmcgICAgICAgICAgICAgIHdpdGhfcG5nPSJubyIKLSMJLXdpdGgtcG5nPS9mb28vZGlyICAgICAgICB3aXRoX3BuZz0iL2Zvby9kaXIiCi0KLWlmIHRlc3QgIngkd2l0aF9wbmciICE9ICJ4bm8iOyB0aGVuCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9wbmciIC1hICJ4JHdpdGhfcG5nIiAhPSAieHllcyI7IHRoZW4KLQkJIyBhZGQgdXNlciBzdXBwbGllZCBkaXJlY3RvcnkgdG8gZmxhZ3M6Ci0JCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0JCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGhfcG5nL2luY2x1ZGUiCi0JCUxERkxBR1M9IiRMREZMQUdTIC1MJHdpdGhfcG5nL2xpYiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQkjIHRoaXMgaXMgbm90IGNvbXBsZXRlLi4uIGluIGdlbmVyYWwgYSByYXQncyBuZXN0LgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9wbmcvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3BuZy9saWIiCi0JCWZpCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicG5nLmgiICJhY19jdl9oZWFkZXJfcG5nX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3BuZ19oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1BOR0xJQl9IPSJ0cnVlIgotZmkKLQotCi0JaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgaW4gLWxwbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IGluIC1scG5nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHBuZyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0PXllcwotZWxzZQotICBhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlBORyAxCi1fQUNFT0YKLQotICBMSUJTPSItbHBuZyAkTElCUyIKLQotZWxzZQotICBIQVZFX1BOR0xJQl9IPSIiCi1maQotCi0JZmkKLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3BuZyIgLWEgIngkd2l0aF9wbmciICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfUE5HTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCSMgcmVzdG9yZSBvbGQgZmxhZ3Mgb24gZmFpbHVyZToKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKLQkJZmkKLQlmaQotCWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlicG5nIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlicG5nIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtcG5nPURJUiB0bwotaW5kaWNhdGUgdGhlIGhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3BuZy5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJwbmcuYS4gIEEgY29weSBvZiBsaWJwbmcgbWF5IGJlIG9idGFpbmVkIGZyb206Ci1odHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnBuZyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnBuZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLXBuZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9wbmcuaCBhbmQgdGhlIGxpYnJhcnkKLWluIERJUi9saWIvbGlicG5nLmEuICBBIGNvcHkgb2YgbGlicG5nIG1heSBiZSBvYnRhaW5lZCBmcm9tOgotaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0JZmkKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJ6IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9saWJ6K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9saWJ6OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC16bGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF96bGliK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF96bGliOyAKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3psaWIiICE9ICJ4bm8iIC1hICJ4JHdpdGhfbGlieiIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3psaWIiIC1hICJ4JHdpdGhfemxpYiIgIT0gInh5ZXMiOyB0aGVuCi0JCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0JCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGhfemxpYi9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3psaWIvbGliIgotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfemxpYi9saWIiCi0JCWVsc2UKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHdpdGhfemxpYi9saWIiCi0JCWZpCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiemxpYi5oIiAiYWNfY3ZfaGVhZGVyX3psaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfemxpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1pMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9aTElCX0giID0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZWZsYXRlIGluIC1seiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3pfZGVmbGF0ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1seiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGVmbGF0ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRlZmxhdGUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfel9kZWZsYXRlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl96X2RlZmxhdGUiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJaIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1seiAkTElCUyIKLQotZWxzZQotICBIQVZFX1pMSUJfSD0iIgotZmkKLQotCWZpCi0JaWYgdGVzdCAhIC16ICIkd2l0aF96bGliIiAtYSAieCR3aXRoX3psaWIiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfWkxJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JCWlmIHRlc3QgIngkSEFWRV9aTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJ6IGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlieiBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLXpsaWI9RElSIHRvIGluZGljYXRlIHRoZQotaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvemxpYi5oIGFuZCB0aGUgbGlicmFyeSBpbiBESVIvbGliL2xpYnouYS4KLUEgY29weSBvZiBsaWJ6IG1heSBiZSBvYnRhaW5lZCBmcm9tOiBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlieiBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnogaXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24gdXNlIC0td2l0aC16bGliPURJUiB0byBpbmRpY2F0ZSB0aGUKLWhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3psaWIuaCBhbmQgdGhlIGxpYnJhcnkgaW4gRElSL2xpYi9saWJ6LmEuCi1BIGNvcHkgb2YgbGlieiBtYXkgYmUgb2J0YWluZWQgZnJvbTogaHR0cDovL3d3dy5nemlwLm9yZy96bGliLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQkJCXNsZWVwIDUKLQkJZmkKLQlmaQotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXB0aHJlYWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3B0aHJlYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3B0aHJlYWQ7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfcHRocmVhZCIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicHRocmVhZC5oIiAiYWNfY3ZfaGVhZGVyX3B0aHJlYWRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfcHRocmVhZF9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1BUSFJFQURfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgISAteiAiJEhBVkVfUFRIUkVBRF9IIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jays6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scHRocmVhZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwdGhyZWFkICRMSUJTIgotCi1maQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwdGhyZWFkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPXllcwotZWxzZQotICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0xJQlBUSFJFQUQ9InRydWUiCi1maQotCi0JZmkKLWZpCi0gaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJQVEhSRUFEIjsgdGhlbgotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0KLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0nIycKLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX3RocmVhZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX190aHJlYWQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgX190aHJlYWQgaW50IHAgPSAwCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1RMUyAxIiA+PmNvbmZkZWZzLmgKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0jIHRpZ2h0dm5jLWZpbGV0cmFuc2ZlciBpbXBsZW1lbnRlZCB1c2luZyB0aHJlYWRzOgotaWYgdGVzdCAteiAiJEhBVkVfTElCUFRIUkVBRCI7IHRoZW4KLQl3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2Zlcj0iIgotZmkKLWlmIHRlc3QgIngkd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIiID0gInh5ZXMiOyB0aGVuCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0gaWYgdGVzdCAiJHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ5ZXMiOyB0aGVuCi0gIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUU9Ci0gIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFPScjJwotZWxzZQotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFPScjJwotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRT0KLWZpCi0KLQotIyB3ZWJzb2NrZXRzIGltcGxlbWVudGVkIHVzaW5nIGJhc2U2NCBmcm9tIHJlc29sdmUKLWlmIHRlc3QgIngkSEFWRV9CNjQiICE9ICJ4dHJ1ZSI7IHRoZW4KLQl3aXRoX3dlYnNvY2tldHM9IiIKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfd2Vic29ja2V0cyIgPSAieHllcyI7IHRoZW4KLQlMSUJTPSIkTElCUyAtbHJlc29sdiAkU1NMX0xJQlMiCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEiID4+Y29uZmRlZnMuaAotCi1maQotIGlmIHRlc3QgIiR3aXRoX3dlYnNvY2tldHMiID0gInllcyI7IHRoZW4KLSAgV0lUSF9XRUJTT0NLRVRTX1RSVUU9Ci0gIFdJVEhfV0VCU09DS0VUU19GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9XRUJTT0NLRVRTX1RSVUU9JyMnCi0gIFdJVEhfV0VCU09DS0VUU19GQUxTRT0KLWZpCi0KLQotIGlmIHRlc3QgISAteiAiJEhBVkVfWkxJQl9IIjsgdGhlbgotICBIQVZFX0xJQlpfVFJVRT0KLSAgSEFWRV9MSUJaX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlpfVFJVRT0nIycKLSAgSEFWRV9MSUJaX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgISAteiAiJEhBVkVfSlBFR0xJQl9IIjsgdGhlbgotICBIQVZFX0xJQkpQRUdfVFJVRT0KLSAgSEFWRV9MSUJKUEVHX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQkpQRUdfVFJVRT0nIycKLSAgSEFWRV9MSUJKUEVHX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgISAteiAiJEhBVkVfUE5HTElCX0giOyB0aGVuCi0gIEhBVkVfTElCUE5HX1RSVUU9Ci0gIEhBVkVfTElCUE5HX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlBOR19UUlVFPScjJwotICBIQVZFX0xJQlBOR19GQUxTRT0KLWZpCi0KLQotCi1TRExDT05GSUc9InNkbC1jb25maWciCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtc2RsLWNvbmZpZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc2RsX2NvbmZpZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc2RsX2NvbmZpZzsgCi0gICAgaWYgdGVzdCAiJHdpdGh2YWwiICE9ICJ5ZXMiIC1hICIkd2l0aHZhbCIgIT0gIiI7IHRoZW4KLSAgICAgICAgU0RMQ09ORklHPSR3aXRodmFsCi0gICAgZmkKLQotZmkKLQotCi1pZiB0ZXN0IC16ICIkd2l0aF9zZGwiOyB0aGVuCi0JaWYgJFNETENPTkZJRyAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXdpdGhfc2RsPXllcwotCQlTRExfQ0ZMQUdTPWAkU0RMQ09ORklHIC0tY2ZsYWdzYAotCQlTRExfTElCUz1gJFNETENPTkZJRyAtLWxpYnNgCi0JZWxzZQotCQl3aXRoX3NkbD1ubwotCWZpCi1maQotIGlmIHRlc3QgIngkd2l0aF9zZGwiID0gInh5ZXMiOyB0aGVuCi0gIEhBVkVfTElCU0RMX1RSVUU9Ci0gIEhBVkVfTElCU0RMX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlNETF9UUlVFPScjJwotICBIQVZFX0xJQlNETF9GQUxTRT0KLWZpCi0KLQotCi0KLQotIyBDaGVjayBmb3IgR1RLKy4gaWYgcHJlc2VudCwgYnVpbGQgdGhlIEdUSysgdm5jIHZpZXdlciBleGFtcGxlCi0KLQotCi0KLQotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRQS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRQS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRoZW4KLSAgYWNfcHRfUEtHX0NPTkZJRz0kUEtHX0NPTkZJRwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9QS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotYWNfcHRfUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkYWNfcHRfUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9QS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkYWNfcHRfUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05GSUciID0geDsgdGhlbgotICAgIFBLR19DT05GSUc9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBQS0dfQ09ORklHPSRhY19wdF9QS0dfQ09ORklHCi0gIGZpCi1lbHNlCi0gIFBLR19DT05GSUc9IiRhY19jdl9wYXRoX1BLR19DT05GSUciCi1maQotCi1maQotaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0JX3BrZ19taW5fdmVyc2lvbj0wLjkuMAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAiID4mNjsgfQotCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCVBLR19DT05GSUc9IiIKLQlmaQotZmkKLQotcGtnX2ZhaWxlZD1ubwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR1RLIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHVEsuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJEdUS19DRkxBR1MiOyB0aGVuCi0gICAgcGtnX2N2X0dUS19DRkxBR1M9IiRHVEtfQ0ZMQUdTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ3RrKy0yLjBcIiI7IH0gPiY1Ci0gICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImd0aystMi4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzIAotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotaWYgdGVzdCAtbiAiJEdUS19MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9HVEtfTElCUz0iJEdUS19MSUJTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ3RrKy0yLjBcIiI7IH0gPiY1Ci0gICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR1RLX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAiZ3RrKy0yLjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgCi1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKLWZpCi0KLQotCi1pZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCi0gICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgICAgIAotaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwotZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KLWZpCi0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgotCSAgICAgICAgR1RLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ3RrKy0yLjAiIDI+JjFgCi0gICAgICAgIGVsc2UgCi0JICAgICAgICBHVEtfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJndGsrLTIuMCIgMj4mMWAKLSAgICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkR1RLX1BLR19FUlJPUlMiID4mNQotCi0JOgotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgotICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JOgotZWxzZQotCUdUS19DRkxBR1M9JHBrZ19jdl9HVEtfQ0ZMQUdTCi0JR1RLX0xJQlM9JHBrZ19jdl9HVEtfTElCUwotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQotZmkKLSBpZiB0ZXN0ICEgLXogIiRHVEtfTElCUyI7IHRoZW4KLSAgSEFWRV9MSUJHVEtfVFJVRT0KLSAgSEFWRV9MSUJHVEtfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTElCR1RLX1RSVUU9JyMnCi0gIEhBVkVfTElCR1RLX0ZBTFNFPQotZmkKLQotCi0KLU1JTkdXPWBlY2hvICRob3N0X29zIHwgZ3JlcCBtaW5ndzMyICAyPi9kZXYvbnVsbGAKLSBpZiB0ZXN0ICEgLXogIiRNSU5HVyIgOyB0aGVuCi0gIE1JTkdXX1RSVUU9Ci0gIE1JTkdXX0ZBTFNFPScjJwotZWxzZQotICBNSU5HV19UUlVFPScjJwotICBNSU5HV19GQUxTRT0KLWZpCi0KLWlmIHRlc3QgISAteiAiJE1JTkdXIjsgdGhlbgotCVdTT0NLTElCPSItbHdzMl8zMiIKLQlMREZMQUdTPSIkTERGTEFHUyAtbm8tdW5kZWZpbmVkIgotZmkKLQotCi0jIENoZWNrIGZvciBsaWJnY3J5cHQKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdjcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ2NyeXB0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nY3J5cHQ7IAotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNsaWVudC1nY3J5cHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2NsaWVudF9nY3J5cHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NsaWVudF9nY3J5cHQ7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ2NyeXB0IiAhPSAieG5vIjsgdGhlbgotCSAKLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliZ2NyeXB0LXByZWZpeCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGliZ2NyeXB0X3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbGliZ2NyeXB0X3ByZWZpeDsgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIgotZWxzZQotICBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iIgotZmkKLQotICBpZiB0ZXN0IHgkbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KLSAgICAgaWYgdGVzdCB4JHtMSUJHQ1JZUFRfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KLSAgICAgICAgTElCR0NSWVBUX0NPTkZJRz0kbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXgvYmluL2xpYmdjcnlwdC1jb25maWcKLSAgICAgZmkKLSAgZmkKLQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxpYmdjcnlwdC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGxpYmdjcnlwdC1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRMSUJHQ1JZUFRfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUc9IiRMSUJHQ1JZUFRfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUciICYmIGFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRz0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTElCR0NSWVBUX0NPTkZJRz0kYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHCi1pZiB0ZXN0IC1uICIkTElCR0NSWVBUX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMSUJHQ1JZUFRfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkTElCR0NSWVBUX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRtcD0xLjQuMAotICBpZiBlY2hvICIkdG1wIiB8IGdyZXAgJzonID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgIHJlcV9saWJnY3J5cHRfYXBpPWBlY2hvICIkdG1wIiAgICAgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMS8nYAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249YGVjaG8gIiR0bXAiIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDIvJ2AKLSAgZWxzZQotICAgICByZXFfbGliZ2NyeXB0X2FwaT0wCi0gICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj0iJHRtcCIKLSAgZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49ICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIExJQkdDUllQVCAtIHZlcnNpb24gPj0gJG1pbl9saWJnY3J5cHRfdmVyc2lvbi4uLiAiID4mNjsgfQotICBvaz1ubwotICBpZiB0ZXN0ICIkTElCR0NSWVBUX0NPTkZJRyIgIT0gIm5vIiA7IHRoZW4KLSAgICByZXFfbWFqb3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wxLydgCi0gICAgcmVxX21pbm9yPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMi8nYAotICAgIHJlcV9taWNybz1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDMvJ2AKLSAgICBsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb249YCRMSUJHQ1JZUFRfQ09ORklHIC0tdmVyc2lvbmAKLSAgICBtYWpvcj1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAotICAgIG1pbm9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wyLydgCi0gICAgbWljcm89YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpLiovXDMvJ2AKLSAgICBpZiB0ZXN0ICIkbWFqb3IiIC1ndCAiJHJlcV9tYWpvciI7IHRoZW4KLSAgICAgICAgb2s9eWVzCi0gICAgZWxzZSAKLSAgICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZXEgIiRyZXFfbWFqb3IiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1ndCAiJHJlcV9taW5vciI7IHRoZW4KLSAgICAgICAgICAgICAgIG9rPXllcwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZXEgIiRyZXFfbWlub3IiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pY3JvIiAtZ2UgIiRyZXFfbWljcm8iOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICBvaz15ZXMKLSAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY1Ci0kYXNfZWNobyAieWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY2OyB9Ci0gIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICAgIyBJZiB3ZSBoYXZlIGEgcmVjZW50IGxpYmdjcnlwdCwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUKLSAgICAgIyBBUEkgaXMgY29tcGF0aWJsZQotICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1ndCAwIDsgdGhlbgotICAgICAgICB0bXA9YCRMSUJHQ1JZUFRfQ09ORklHIC0tYXBpLXZlcnNpb24gMj4vZGV2L251bGwgfHwgZWNobyAwYAotICAgICAgICBpZiB0ZXN0ICIkdG1wIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBMSUJHQ1JZUFQgQVBJIHZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgTElCR0NSWVBUIEFQSSB2ZXJzaW9uLi4uICIgPiY2OyB9Ci0gICAgICAgICAgIGlmIHRlc3QgIiRyZXFfbGliZ2NyeXB0X2FwaSIgLWVxICIkdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2theSIgPiY1Ci0kYXNfZWNobyAib2theSIgPiY2OyB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBvaz1ubwotICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBkb2VzIG5vdCBtYXRjaC4gd2FudD0kcmVxX2xpYmdjcnlwdF9hcGkgZ290PSR0bXAiID4mNQotJGFzX2VjaG8gImRvZXMgbm90IG1hdGNoLiB3YW50PSRyZXFfbGliZ2NyeXB0X2FwaSBnb3Q9JHRtcCIgPiY2OyB9Ci0gICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgTElCR0NSWVBUX0NGTEFHUz1gJExJQkdDUllQVF9DT05GSUcgLS1jZmxhZ3NgCi0gICAgTElCR0NSWVBUX0xJQlM9YCRMSUJHQ1JZUFRfQ09ORklHIC0tbGlic2AKLSAgICA6Ci0gIGVsc2UKLSAgICBMSUJHQ1JZUFRfQ0ZMQUdTPSIiCi0gICAgTElCR0NSWVBUX0xJQlM9IiIKLSAgICB3aXRoX2NsaWVudF9nY3J5cHQ9bm8KLSAgZmkKLSAgCi0gIAotCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRMSUJHQ1JZUFRfQ0ZMQUdTIgotCUxJQlM9IiRMSUJTICRMSUJHQ1JZUFRfTElCUyIKLQlpZiB0ZXN0ICJ4JHdpdGhfY2xpZW50X2djcnlwdCIgIT0gInhubyI7IHRoZW4KLQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9DTElFTlRfR0NSWVBUIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWZpCi0KLSMgQ2hlY2tzIGZvciBHbnVUTFMKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudXRscyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251dGxzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nbnV0bHM7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ251dGxzIiAhPSAieG5vIjsgdGhlbgotCQotcGtnX2ZhaWxlZD1ubwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VVExTIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlVUTFMuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJEdOVVRMU19DRkxBR1MiOyB0aGVuCi0gICAgcGtnX2N2X0dOVVRMU19DRkxBR1M9IiRHTlVUTFNfQ0ZMQUdTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ251dGxzID49IDIuNC4wXCIiOyB9ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdudXRscyA+PSAyLjQuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HTlVUTFNfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAiZ251dGxzID49IDIuNC4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzIAotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotaWYgdGVzdCAtbiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9HTlVUTFNfTElCUz0iJEdOVVRMU19MSUJTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ251dGxzID49IDIuNC4wXCIiOyB9ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdudXRscyA+PSAyLjQuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HTlVUTFNfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJnbnV0bHMgPj0gMi40LjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgCi1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKLWZpCi0KLQotCi1pZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCi0gICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgICAgIAotaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwotZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KLWZpCi0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgotCSAgICAgICAgR05VVExTX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ251dGxzID49IDIuNC4wIiAyPiYxYAotICAgICAgICBlbHNlIAotCSAgICAgICAgR05VVExTX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ251dGxzID49IDIuNC4wIiAyPiYxYAotICAgICAgICBmaQotCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncwotCWVjaG8gIiRHTlVUTFNfUEtHX0VSUk9SUyIgPiY1Ci0KLQk6Ci1lbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCi0gICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQk6Ci1lbHNlCi0JR05VVExTX0NGTEFHUz0kcGtnX2N2X0dOVVRMU19DRkxBR1MKLQlHTlVUTFNfTElCUz0kcGtnX2N2X0dOVVRMU19MSUJTCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCi1maQotCUNGTEFHUz0iJENGTEFHUyAkR05VVExTX0NGTEFHUyIKLQlMSUJTPSIkTElCUyAkR05VVExTX0xJQlMiCi1maQotIGlmIHRlc3QgISAteiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICBIQVZFX0dOVVRMU19UUlVFPQotICBIQVZFX0dOVVRMU19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9HTlVUTFNfVFJVRT0nIycKLSAgSEFWRV9HTlVUTFNfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICEgLXogIiRHTlVUTFNfTElCUyIgOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfR05VVExTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLSMgd2FybiBpZiBuZWl0aGVyIEdudVRMUyBub3IgT3BlblNTTCBhcmUgYXZhaWxhYmxlCi1pZiB0ZXN0IC16ICIkU1NMX0xJQlMiIC1hIC16ICIkR05VVExTX0xJQlMiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5vIGVuY3J5cHRpb24gbGlicmFyeSBjb3VsZCBiZSBmb3VuZC4gKioqCi1BIGxpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQgYnVpbHQgdGhpcyB3YXkgd2lsbCBub3Qgc3VwcG9ydCBTU0wgZW5jcnlwdGlvbi4KLVRvIGVuYWJsZSBTU0wgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzIChwZXJoYXBzIGl0IGlzIG5hbWVkCi1zb21ldGhpbmcgbGlrZSBsaWJzc2wtZGV2IG9yIGdudXRscy1kZXYpIGFuZCBydW4gY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTm8gZW5jcnlwdGlvbiBsaWJyYXJ5IGNvdWxkIGJlIGZvdW5kLiAqKioKLUEgbGlidm5jc2VydmVyL2xpYnZuY2NsaWVudCBidWlsdCB0aGlzIHdheSB3aWxsIG5vdCBzdXBwb3J0IFNTTCBlbmNyeXB0aW9uLgotVG8gZW5hYmxlIFNTTCBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMgKHBlcmhhcHMgaXQgaXMgbmFtZWQKLXNvbWV0aGluZyBsaWtlIGxpYnNzbC1kZXYgb3IgZ251dGxzLWRldikgYW5kIHJ1biBjb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCXNsZWVwIDUKLWZpCi0KLQotIyBJUHY2Ci0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1pcHY2IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pcHY2K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9pcHY2OyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9pcHY2IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGFkZHJpbmZvIiAiYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSVB2NiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRhZGRyaW5mbyBpbiAtbHNvY2tldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRhZGRyaW5mbyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGFkZHJpbmZvICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm8iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBJUHY2IDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIAotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWx3czJfMzIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIGluIC1sd3MyXzMyLi4uICIgPiY2OyB9Ci0JCSAgICAgICAgTElCUz0iJExJQlMgLWx3czJfMzIiCi0JCSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWdldGFkZHJpbmZvKDAsIDAsIDAsIDApOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotCQkJCSAgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIElQdjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJICAgICAgICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCQkJICAgICAgCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgICAgICAgICAgICAgCi1maQotCi1maQotCi1maQotCi0KLQotIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWZvciBhY19oZWFkZXIgaW4gYXJwYS9pbmV0LmggZmNudGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdGltZWIuaCBzeXNsb2cuaCB1bmlzdGQuaCB3czJ0Y3BpcC5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLQotZG9uZQotCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2hlYWRlciBpbiBwd2QuaCBzeXMvd2FpdC5oIHV0bXB4LmggdGVybWlvcy5oIHN5cy9pb2N0bC5oIHN5cy9zdHJvcHRzLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZpCi0KLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07Ci0gIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKLSAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotICBjaGFyICoqcHBjOwotICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0gIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0gICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKLSAgICAgZXhwcmVzc2lvbiAqLwotICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0gIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwotICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotICArK3BjcGNjOwotICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKLSAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwotICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gICAgY2hhciB0eDsKLSAgICBjaGFyICp0ID0gJnR4OwotICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgICAqdCsrID0gMDsKLSAgICBpZiAocykgcmV0dXJuIDA7Ci0gIH0KLSAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgICBpbnQgeFtdID0gezI1LCAxN307Ci0gICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgICArK2ZvbzsKLSAgfQotICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgICBpcHRyIHAgPSAwOwotICAgICsrcDsKLSAgfQotICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKLSAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKLSAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7Ci0gIH0KLSAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgICBjb25zdCBpbnQgZm9vID0gMTA7Ci0gICAgaWYgKCFmb28pIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgaW5saW5lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfaW5saW5lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBpbnQgZm9vX3Q7Ci1zdGF0aWMgJGFjX2t3IGZvb190IHN0YXRpY19mb28gKCkge3JldHVybiAwOyB9Ci0kYWNfa3cgZm9vX3QgZm9vICgpIHtyZXR1cm4gMDsgfQotI2VuZGlmCi0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2lubGluZT0kYWNfa3cKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgdGVzdCAiJGFjX2N2X2NfaW5saW5lIiAhPSBubyAmJiBicmVhawotZG9uZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfaW5saW5lIiA+JjY7IH0KLQotY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICAqKQotICAgIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gICAgICBubykgYWNfdmFsPTs7Ci0gICAgICAqKSBhY192YWw9JGFjX2N2X2NfaW5saW5lOzsKLSAgICBlc2FjCi0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBpbmxpbmUgJGFjX3ZhbAotI2VuZGlmCi1fQUNFT0YKLSAgICA7OwotZXNhYwotCi0geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0gICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZm5kZWYgX19BUFBMRV9DQ19fCi0JICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCi0JICAgICAjZW5kaWYKLQkgICAgIHR5cGVkZWYgaW50IGR1bW15OwotCSAgICAKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAKLQkjIENoZWNrIGZvciBwb3RlbnRpYWwgLWFyY2ggZmxhZ3MuICBJdCBpcyBub3QgdW5pdmVyc2FsIHVubGVzcwotCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCi0JYWNfYXJjaD0KLQlhY19wcmV2PQotCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KLQkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0JICAgY2FzZSAkYWNfd29yZCBpbgotCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQotCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgotCQkgYWNfYXJjaD0kYWNfd29yZAotCSAgICAgICBlbHNlCi0JCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKLQkJIGJyZWFrCi0JICAgICAgIGZpCi0JICAgICAgIDs7Ci0JICAgZXNhYwotCSAgIGFjX3ByZXY9Ci0JIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCi0JICAgYWNfcHJldj1hcmNoCi0JIGZpCi0gICAgICAgZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQkgICAKLWludAotbWFpbiAoKQotewotI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAotCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAotCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCi0JICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcwotCSAgICAgI2VuZGlmCi0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotCSAgIAotaW50Ci1tYWluICgpCi17Ci0jaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQotCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLQkgICAgICNlbmRpZgotCSAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX0JJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBpbnQgYXNjaWlfbW1bXSA9Ci0JCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07Ci0JCXNob3J0IGludCBhc2NpaV9paVtdID0KLQkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKLQkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKLQkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKLQkJfQotCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQotCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OwotCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQotCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OwotCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKLQkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOwotCQl9Ci0JCWV4dGVybiBpbnQgZm9vOwotCSAgICAgIAotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gdXNlX2FzY2lpIChmb28pID09IHVzZV9lYmNkaWMgKGZvbyk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCi0JICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi0JICAgIGZpCi0JICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgotCQlhY19jdl9jX2JpZ2VuZGlhbj1ubwotCSAgICAgIGVsc2UKLQkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/Ci0JCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLQkgICAgICBmaQotCSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgICAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLQkgICAgIHVuaW9uCi0JICAgICB7Ci0JICAgICAgIGxvbmcgaW50IGw7Ci0JICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Ci0JICAgICB9IHU7Ci0JICAgICB1LmwgPSAxOwotCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Ci0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQotIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCi0gICB5ZXMpCi0gICAgICRhc19lY2hvICJAJTpAZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKLTs7ICMoCi0gICBubykKLSAgICAgIDs7ICMoCi0gICB1bml2ZXJzYWwpCi0gICAgIAkKLSRhc19lY2hvICJAJTpAZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKLQotICAgICA7OyAjKAotICAgKikKLSAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcwotIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OwotIGVzYWMKLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2l6ZV90IiAiYWNfY3ZfdHlwZV9zaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geHllczsgdGhlbiA6Ci0gIAotZWxzZQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGludAotX0FDRU9GCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3RpbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLWludAotbWFpbiAoKQotewotaWYgKChzdHJ1Y3QgdG0gKikgMCkKLXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3lzX3dhaXRfaCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQgaW50KSAoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jIGRlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IHM7Ci0gIHdhaXQgKCZzKTsKLSAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfdHlwZV9zb2NrbGVuX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotc29ja2xlbl90IGxlbiA9IDQyOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl90eXBlX3NvY2tsZW5fdD15ZXMKLWVsc2UKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl90eXBlX3NvY2tsZW5fdCIgPiY2OyB9Ci0gIGlmIHRlc3QgJGFjX2N2X3R5cGVfc29ja2xlbl90ICE9IHllczsgdGhlbgotICAgICRhc19lY2hvICJAJTpAZGVmaW5lIHNvY2tsZW5fdCBpbnQiID4+Y29uZmRlZnMuaAotCi0gIGZpCi0KLWlmIHRlc3QgISAtZCAuL3JmYjsgdGhlbgotCWVjaG8gImNyZWF0aW5nIHN1YmRpciAuL3JmYiBmb3IgcmZiaW50LmgiCi0JbWtkaXIgLi9yZmIgCi1maQotIyAtLS0tLS0gQUMgQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4uLi4gIiA+JjY7IH0KLWFjX3N0ZGludF9oPWBlY2hvIHJmYi9yZmJpbnQuaGAKLWlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAic3RkaW50LmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPylcIiIgPiY1Ci0kYXNfZWNobyAiXCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9zdGRpbnQuaD8pXCIiID4mNjsgfQotZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjUKLSRhc19lY2hvICJcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjY7IH0KLWVsc2UKLSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogXCIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKVwiIiA+JjUKLSRhc19lY2hvICJcIihwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpXCIiID4mNjsgfQotZmkKLQotaW50dHlwZV9oZWFkZXJzPWBlY2hvIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3lzL2ludHR5cGVzLmggIFwKLXwgc2VkIC1lICdzLywvIC9nJ2AKLQotIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X289Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF91PSJuby1maWxlIgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50cHRyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnRwdHJfdCIgImFjX2N2X3R5cGVfdWludHB0cl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnRwdHJfdCBpbiAkaSAkYW5kNjQiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gJGkgJGFuZDY0IiA+JjY7IH0KLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY1Ci0kYXNfZWNobyAiLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3lzL3R5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVfaW50NjRfdCB0b28pIgotZWxzZQotICBhbmQ2ND0iIgotZmkKLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIG91ciB1X2ludDMyX3QgaW4gJGkgJGFuZDY0IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBvdXIgdV9pbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gZmkKLSBmaQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgTUFZQkUgQyBiYXNpYyB0eXBlcyAtLS0tLS0tLQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgY2hhci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfY2hhcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAoY2hhcikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfY2hhcj0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2NoYXIgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfY2hhciA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgY2hhciIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mIChzaG9ydCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igc2hvcnQiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9TSE9SVCAkYWNfY3Zfc2l6ZW9mX3Nob3J0Ci1fQUNFT0YKLQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBmb3IgYWNfc2l6ZSBpbiA0IDggMSAyIDE2ICA7IGRvICMgTGlzdCBzaXplcyBpbiByb3VnaCBvcmRlciBvZiBwcmV2YWxlbmNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLXN3aXRjaCAoMCkgY2FzZSAwOiBjYXNlIChzaXplb2YgKGludCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfaW50PSRhY19zaXplCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHRlc3QgeCRhY19jdl9zaXplb2ZfaW50ICE9IHggOyB0aGVuIGJyZWFrOyBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2ludCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgaW50IiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKLV9BQ0VPRgotCi0KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfbG9uZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAobG9uZykgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfbG9uZz0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmcgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfbG9uZyA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgbG9uZyIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZwotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQqIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygdm9pZCouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRwKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICh2b2lkKikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfdm9pZHA9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igdm9pZCoiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfdm9pZHAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfdm9pZHAiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9WT0lEUCAkYWNfY3Zfc2l6ZW9mX3ZvaWRwCi1fQUNFT0YKLQotCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgU1RBUlQgaGVhZGVyIC0tLS0tLS0tLS0tLS0KLV9hY19zdGRpbnRfaD1gJGFzX2VjaG8gIl8kYWNfc3RkaW50X2giIHwgJGFzX3RyX2NwcGAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjUKLSRhc19lY2hvICJjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjY7IH0KLWVjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNpZm5kZWYiIF9HRU5FUkFURURfU1RESU5UX0ggPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50X2gKLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyBhIGdudSBjb21waWxlciB2ZXJzaW9uIiBgJENDIC0tdmVyc2lvbmAgIiovIiBcCi0gID4+JGFjX3N0ZGludF9oCi1lbHNlCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyAkQ0MgKi8iID4+JGFjX3N0ZGludF9oCi1maQotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gU2VlIGlmIGludF9sZWFzdCBhbmQgaW50X2Zhc3QgdHlwZXMgYXJlIHByZXNlbnQKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnRfZmFzdDMyX3QiICJhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgIiNpbmNsdWRlPCRhY19jdl9oZWFkZXJfc3RkaW50PgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiAhPSAic3RkZGVmLmgiIDsgdGhlbgotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRpbnQuaCIgOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY2OyB9Ci0gICBlY2hvICIjaW5jbHVkZSA8c3RkZGVmLmg+IiA+PiRhY19zdGRpbnRfaAotZmkgOyBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNjsgfQotICAgZWNobyAiI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50PiIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiIgPj4kYWNfc3RkaW50X2gKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGhlYWRlciBTVEFSVCBiYXNpYyBpbnQgdHlwZXMgLS0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIG5lZWQgdG8gbG9vayBhdCBDIGJhc2ljIHR5cGVzIiA+JjUKLSRhc19lY2hvICIuLi4gbmVlZCB0byBsb29rIGF0IEMgYmFzaWMgdHlwZXMiID4mNjsgfQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGJzZC9zeXN2IHR5cGVkZWZzIiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBic2Qvc3lzdiB0eXBlZGVmcyIgPiY2OyB9Ci0gICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogaW50OF90IGludDE2X3QgaW50MzJfdCBkZWZpbmVkIGJ5IGluZXQgY29kZSwgcmVkZWNsYXJlIHRoZSB1X2ludFhYIHR5cGVzICovCi10eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Ci10eXBlZGVmIHVfaW50MTZfdCB1aW50MTZfdDsKLXR5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OwotRU9GCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIGdsaWJjIGNvbXBhdGliaWxpdHkgKi8KLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi0jZW5kaWYKLUVPRgotZmkKLQotYWNfY3Zfc2l6ZW9mX3g9IiRhY19jdl9zaXplb2ZfY2hhcjokYWNfY3Zfc2l6ZW9mX3Nob3J0IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX2ludCIKLWFjX2N2X3NpemVvZl9YPSIkYWNfY3Zfc2l6ZW9mX1g6JGFjX2N2X3NpemVvZl92b2lkcDokYWNfY3Zfc2l6ZW9mX2xvbmciCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPSAic3RkZGVmLmgiIDsgdGhlbgotIyAgIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLAotIyB0aGVyZSBhIGZldyAzMi1iaXQtb25seSBkc3Atc3lzdGVtcy4gbmliYmxlLWFkZHJlc3NhYmxlIHN5c3RlbXMgYXJlIHdheSBvZmYuCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAtLS0tLS0tLS0tLS0gQklUU1BFQ0lGSUMgSU5UVFlQRVMgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICAgIHQ9InR5cGVkZWZzIGZvciBhIgotICAgIGNhc2UgIiRhY19jdl9zaXplb2ZfWCIgaW4KLSAgICAgMToyOjI6Mjo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDE2LWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAxNi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAxNi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjI6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0ICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDMyLWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAzMi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQiID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0Ojg6OCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nICR0IG5vcm1hbCA2NC1iaXQgc3lzdGVtIiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCBub3JtYWwgNjQtYml0IHN5c3RlbSIgPiY2OyB9Ci0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIG5vcm1hbCA2NC1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDY0LWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMzItYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAqKQotICAgIGFzX2ZuX2Vycm9yICQ/ICIgJGFjX2N2X3NpemVvZl9YICB3aGF0IGlzIHRoYXQgYSBzeXN0ZW0/IGNvbnRhY3QgdGhlIGF1dGhvciwgcXVpY2shIGh0dHA6Ly9hYy1hcmNoaXZlLnNmLm5ldCIgIiRMSU5FTk8iIDUKLSAgICBleGl0IDEKLTs7Ci0gICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBiYXNpYyBpbnQgdHlwZXMgU1RBUlQgaW50NjRfdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiCi10aGVuIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgZ29vZCB1aW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotI2VuZGlmCi1FT0YKLQotZWxpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91X2ludDY0X3QiID0gInllcyIKLXRoZW4geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB0eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdCIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBzeXN0ZW0gaGVhZGVycyBoYXZlIGFuIHVfaW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotZWxzZSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSA2NCBCSVQgR0VORVJJQyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCi0jaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKLQotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXwotI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXwotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIF9faW50NjQgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX19NV0VSS1NfXyB8fCBkZWZpbmVkIF9fRUxGX18KLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCi0KLSNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLSAgLyogY29tcGlsZXIvY3B1IHR5cGUgLi4uIG9yIGp1c3QgSVNPIEM5OSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotCi0jIHBsdXMgYSBkZWZhdWx0IDY0LWJpdCBmb3Igc3lzdGVtcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgNjQtYml0IHJlYWR5Ci0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIgaW4KLSAgICAxOjI6ODo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY2OyB9Ci1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIG5vcm1hbCA2NC1iaXQgc3lzdGVtLCBDQyBoYXMgc2l6ZW9mKGxvbmcgYW5kIHZvaWQqKSA9PSA4IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgIDE6Mjo0OjgpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjY7IH0KLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjg6NCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNjsgfQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiA2NC1iaXQgZGVyaXZlZCBmcm9tIGEgMzItYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDQgYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgKikKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogTk9URTogKi8KLS8qIHRoZSBjb25maWd1cmUtY2hlY2tzIGZvciB0aGUgYmFzaWMgdHlwZXMgZGlkIG5vdCBtYWtlIHVzIGJlbGlldmUgKi8KLS8qIHRoYXQgd2UgY291bGQgYWRkIGEgZmFsbGJhY2sgdG8gYSAnbG9uZyBsb25nJyB0eXBlZGVmIHRvIGludDY0X3QgKi8KLUVPRgotICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnQ2NF90IHR5cGVzIFNUQVJUIGludHB0ciB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVFIgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICBjYXNlICIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl92b2lkcCIgaW4KLSAgMToyOjIpCi0gICAgYT0iaW50MTZfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDIgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMTYtYml0ICovCi0KLXR5cGVkZWYgdWludDE2X3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MTZfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo0KQotICAgIGE9ImludDMyX3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA0IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDMyLWJpdCAqLwotCi10eXBlZGVmIHVpbnQzMl90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDMyX3QgIGludHB0cl90OwotRU9GCi07OwotICAxOjI6OCkKLSAgICBhPSJpbnQ2NF90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgOCBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCA2NC1iaXQgKi8KLQotdHlwZWRlZiB1aW50NjRfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQ2NF90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgKikKLSAgICBhPSJsb25nIiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgYnV0IGdvdCBubyBndWVzcywgaGVuY2Ugd2UgZGVjbGFyZSBpdCBhcyBpZiBsb25nICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgIGludHB0cl90OwotRU9GCi07OwotICBlc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY2OyB9Ci1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnRwdHIgdHlwZXMgU1RBUlQgaW50X2xlYXN0IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAibm8iOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyBpbnRfbGVhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2xlYXN0LXR5cGVzIiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tR0VORVJJQyBJTlRfTEVBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0gIm5vIjsgdGhlbgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNjsgfQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9GQVNUIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmICBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmICBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfZmFzdDhfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiBpbnQ2NF90ICAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGludCAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBET05FICRhY19zdGRpbnRfaCIgPiY1Ci0kYXNfZWNobyAiLi4uIERPTkUgJGFjX3N0ZGludF9oIiA+JjY7IH0KLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0gIC8qIG9uY2UgKi8KLSNlbmRpZgotI2VuZGlmCi1FT0YKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5fYWRkcl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbl9hZGRyX3QuLi4gIiA+JjY7IH0KLWlmICR7dm5jX2N2X2luYWRkcnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotaW50Ci1tYWluICgpCi17Ci1pbl9hZGRyX3QgZm9vOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBpbmFkZHJ0PXllcwotZWxzZQotICBpbmFkZHJ0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0LAotICAgICAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHZuY19jdl9pbmFkZHJ0IiA+JjUKLSRhc19lY2hvICIkdm5jX2N2X2luYWRkcnQiID4mNjsgfQotCi1pZiB0ZXN0ICRpbmFkZHJ0ID0gbm8gOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIE5FRURfSU5BRERSX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0jIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiBtZW1jbXAgYXJlIG5vdCA4LWJpdCBjbGVhbi4gICovCi0gIGNoYXIgYzAgPSAnXDEwMCcsIGMxID0gJ1wyMDAnLCBjMiA9ICdcMjAxJzsKLSAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCi0gICAgIG9yIG1vcmUgYW5kIHdpdGggYXQgbGVhc3Qgb25lIGJ1ZmZlciBub3Qgc3RhcnRpbmcgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0gICAgIFdpbGxpYW0gTGV3aXMgcHJvdmlkZWQgdGhpcyB0ZXN0IHByb2dyYW0uICAgKi8KLSAgewotICAgIGNoYXIgZm9vWzIxXTsKLSAgICBjaGFyIGJhclsyMV07Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgIHsKLQljaGFyICphID0gZm9vICsgaTsKLQljaGFyICpiID0gYmFyICsgaTsKLQlzdHJjcHkgKGEsICItLS0tLS0tLTAxMTExMTExIik7Ci0Jc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwotCWlmIChtZW1jbXAgKGEsIGIsIDE2KSA+PSAwKQotCSAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjY7IH0KLXRlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIG1lbWNtcC4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxzdGF0IGNvcnJlY3RseSBoYW5kbGVzIHRyYWlsaW5nIHNsYXNoIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2guLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3Quc3ltIGNvbmZ0ZXN0LmZpbGUKLWVjaG8gPmNvbmZ0ZXN0LmZpbGUKLWlmIHRlc3QgIiRhc19sbl9zIiA9ICJsbiAtcyIgJiYgbG4gLXMgY29uZnRlc3QuZmlsZSBjb25mdGVzdC5zeW07IHRoZW4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotc3RydWN0IHN0YXQgc2J1ZjsKLSAgICAgLyogTGludXggd2lsbCBkZXJlZmVyZW5jZSB0aGUgc3ltbGluayBhbmQgZmFpbCwgYXMgcmVxdWlyZWQgYnkgUE9TSVguCi0JVGhhdCBpcyBiZXR0ZXIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWVhbnMgd2Ugd2lsbCBub3QKLQloYXZlIHRvIGNvbXBpbGUgYW5kIHVzZSB0aGUgbHN0YXQgd3JhcHBlci4gICovCi0gICAgIHJldHVybiBsc3RhdCAoImNvbmZ0ZXN0LnN5bS8iLCAmc2J1ZikgPT0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZWxzZQotICAjIElmIHRoZSBgbG4gLXMnIGNvbW1hbmQgZmFpbGVkLCB0aGVuIHdlIHByb2JhYmx5IGRvbid0IGV2ZW4KLSAgIyBoYXZlIGFuIGxzdGF0IGZ1bmN0aW9uLgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWZpCi1ybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNjsgfQotCi10ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsgPSB5ZXMgJiYKLSAgCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLV9BQ0VPRgotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhubzsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbHN0YXQuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQkAmdEBPQkpTPSIkTElCQCZ0QE9CSlMgbHN0YXQuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgYWNjZXB0cyBhbiBlbXB0eSBzdHJpbmcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnPXllcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3Qgc3RhdCBzYnVmOwotICByZXR1cm4gc3RhdCAoIiIsICZzYnVmKSA9PSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9bm8KLWVsc2UKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyA9IHllczsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgc3RhdC4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCQCZ0QE9CSlM9IiRMSUJAJnRAT0JKUyBzdGF0LiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgMQotX0FDRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHN0cmZ0aW1lCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmZ0aW1lIiAiYWNfY3ZfZnVuY19zdHJmdGltZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1NUUkZUSU1FIDEKLV9BQ0VPRgotIAotZWxzZQotICAjIHN0cmZ0aW1lIGlzIGluIC1saW50bCBvbiBTQ08gVU5JWC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cmZ0aW1lIGluIC1saW50bCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzdHJmdGltZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHN0cmZ0aW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPXllcwotZWxzZQotICBhY19jdl9saWJfaW50bF9zdHJmdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1RSRlRJTUUgMSIgPj5jb25mZGVmcy5oCi0KLUxJQlM9Ii1saW50bCAkTElCUyIKLWZpCi0KLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHZwcmludGYKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidnByaW50ZiIgImFjX2N2X2Z1bmNfdnByaW50ZiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192cHJpbnRmIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfVlBSSU5URiAxCi1fQUNFT0YKLSAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIl9kb3BybnQiICJhY19jdl9mdW5jX19kb3BybnQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX2RvcHJudCIgPSB4eWVzOyB0aGVuIDoKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0RPUFJOVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotZmkKLWRvbmUKLQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJwaWRfdCIgImFjX2N2X3R5cGVfcGlkX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9waWRfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1lbHNlCi0gIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBwaWRfdCBpbnQKLV9BQ0VPRgotCi1maQotCi1mb3IgYWNfaGVhZGVyIGluIHZmb3JrLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInZmb3JrLmgiICJhY19jdl9oZWFkZXJfdmZvcmtfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmZvcmtfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1ZGT1JLX0ggMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLWRvbmUKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2ZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yay4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mdW5jX2Zvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgIC8qIEJ5IFJ1ZWRpZ2VyIEt1aGxtYW5uLiAqLwotCSAgcmV0dXJuIGZvcmsgKCkgPCAwOwotCQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNjsgfQotCi1lbHNlCi0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCi1maQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCi0gIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotYW1pZ2FvcyogfCAqLSotbXNkb3NkamdwcCopCi0gICAgICAjIE92ZXJyaWRlLCBhcyB0aGVzZSBzeXN0ZW1zIGhhdmUgb25seSBhIGR1bW15IGZvcmsoKSBzdHViCi0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9yayIgPSB4eWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY192Zm9ya193b3Jrcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZkZWYgSEFWRV9WRk9SS19ICi0jIGluY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LiAgVGhlIGNvbXBpbGVyCi0gICBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sIGJ1dCBzb21lIGNvbXBpbGVycwotICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4gIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQotICAgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzCi0gICBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSMgZWxzZQotc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgc3RhdGljIHBpZF90IGNoaWxkOwotICBpZiAoIWNoaWxkKSB7Ci0gICAgY2hpbGQgPSB2Zm9yayAoKTsKLSAgICBpZiAoY2hpbGQgPCAwKSB7Ci0gICAgICBwZXJyb3IgKCJ2Zm9yayIpOwotICAgICAgX2V4aXQoMik7Ci0gICAgfQotICAgIGlmICghY2hpbGQpIHsKLSAgICAgIGFyZyA9IGdldHBpZCgpOwotICAgICAgd3JpdGUoLTEsICIiLCAwKTsKLSAgICAgIF9leGl0IChhcmcpOwotICAgIH0KLSAgfQotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOwotICBwaWRfdCBjaGlsZDsKLQotICBzcGFyY19hZGRyZXNzX3Rlc3QgKDApOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuICBUaGlzCi0gICAgICAgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdCBhcyBtYW55IGxvY2FsCi0gICAgICAgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIgaW5jbHVkaW5nIGNvbXBpbGVyCi0gICAgICAgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvciBnY2MgMS40MC4zIG9uIGEgU29sYXJpcwotICAgICAgIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4gIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkCi0gICAgICAgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudCBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsCi0gICAgICAgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0IHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlCi0gICAgICAgaW4gdGhpcyByb3V0aW5lLiAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMKLSAgICAgICBtdW5nZSBwYXJlbnQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLCB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudAotICAgICAgIGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yCi0gICAgICAgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLCB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvcgotICAgICAgIGFzIHdlbGwuICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICByZXR1cm4gKAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNjsgfQotCi1maTsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSB2Zm9yayBmb3JrIiA+PmNvbmZkZWZzLmgKLQotZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfTElCTlNMIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc29ja2V0X3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzb2NrZXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzb2NrZXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCi1fQUNFT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZmkKLQotCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JIyBuZWVkIC1sc2VjIGZvciBnZXRzcG5hbSgpCi0JTERGTEFHUz0iJExERkxBR1MgLWxzZWMiCi1maQotCi1mb3IgYWNfZnVuYyBpbiBmdGltZSBnZXRob3N0YnluYW1lIGdldGhvc3RuYW1lIGdldHRpbWVvZmRheSBpbmV0X250b2EgbWVtbW92ZSBtZW1zZXQgbW1hcCBta2ZpZm8gc2VsZWN0IHNvY2tldCBzdHJjaHIgc3RyY3NwbiBzdHJkdXAgc3RyZXJyb3Igc3Ryc3RyCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2Z1bmMgaW4gc2V0c2lkIHNldHBncnAgZ2V0cHd1aWQgZ2V0cHduYW0gZ2V0c3BuYW0gZ2V0dWlkIGdldGV1aWQgc2V0dWlkIHNldGdpZCBzZXRldWlkIHNldGVnaWQgaW5pdGdyb3VwcyB3YWl0cGlkIHNldHV0eGVudCBncmFudHB0IHNobWF0Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLWZpCi0KLSMgY2hlY2ssIGlmIHNobWdldCBpcyBpbiBjeWdpcGMuYQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2htZ2V0IGluIC1sY3lnaXBjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaG1nZXQgaW4gLWxjeWdpcGMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGN5Z2lwYyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2htZ2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2htZ2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0PXllcwotZWxzZQotICBhY19jdl9saWJfY3lnaXBjX3NobWdldD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3lnaXBjX3NobWdldCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJDWUdJUEMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxjeWdpcGMgJExJQlMiCi0KLWZpCi0KLSBpZiB0ZXN0ICIkSEFWRV9DWUdJUEMiID0gInRydWUiOyB0aGVuCi0gIENZR0lQQ19UUlVFPQotICBDWUdJUENfRkFMU0U9JyMnCi1lbHNlCi0gIENZR0lQQ19UUlVFPScjJwotICBDWUdJUENfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2sgaWYgL3Vzci9pbmNsdWRlL2xpbnV4IGV4aXN0cywgaWYgc28sIGRlZmluZSBMSU5VWAotIGlmIHRlc3QgLWQgL3Vzci9pbmNsdWRlL2xpbnV4OyB0aGVuCi0gIExJTlVYX1RSVUU9Ci0gIExJTlVYX0ZBTFNFPScjJwotZWxzZQotICBMSU5VWF9UUlVFPScjJwotICBMSU5VWF9GQUxTRT0KLWZpCi0KLQotIyBDaGVjayBmb3IgT1MgWCBzcGVjaWZpYyBoZWFkZXIKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaCIgImFjX2N2X2hlYWRlcl9BcHBsaWNhdGlvblNlcnZpY2VzX0FwcGxpY2F0aW9uU2VydmljZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfQXBwbGljYXRpb25TZXJ2aWNlc19BcHBsaWNhdGlvblNlcnZpY2VzX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfT1NYPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfT1NYIiA9ICJ0cnVlIjsgdGhlbgotICBPU1hfVFJVRT0KLSAgT1NYX0ZBTFNFPScjJwotZWxzZQotICBPU1hfVFJVRT0nIycKLSAgT1NYX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrIGZvciBBbmRyb2lkIHNwZWNpZmljIGhlYWRlcgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImFuZHJvaWQvYXBpLWxldmVsLmgiICJhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9BTkRST0lEPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfQU5EUk9JRCIgPSAidHJ1ZSI7IHRoZW4KLSAgQU5EUk9JRF9UUlVFPQotICBBTkRST0lEX0ZBTFNFPScjJwotZWxzZQotICBBTkRST0lEX1RSVUU9JyMnCi0gIEFORFJPSURfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICIkSEFWRV9BTkRST0lEIiA9ICJ0cnVlIjsgdGhlbgotCQotJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9BTkRST0lEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIE9uIFNvbGFyaXMgMi43LCB3cml0ZSgpIHJldHVybnMgRU5PRU5UIHdoZW4gaXQgcmVhbGx5IG1lYW5zIEVBR0FJTgotCi1jYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLSAgICAiU3VuT1MgNS43IikKLQkkYXNfZWNobyAiQCU6QGRlZmluZSBFTk9FTlRfV09SS0FST1VORCAxIiA+PmNvbmZkZWZzLmgKLQotICAgIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIHJwbSBTT1VSQ0VTIHBhdGgKLXByaW50ZiAiY2hlY2tpbmcgZm9yIHJwbSBzb3VyY2VzIHBhdGguLi4gIgotUlBNU09VUkNFRElSPSJOT1QtRk9VTkQiCi1mb3IgZGlyZWN0b3J5IGluIHBhY2thZ2VzIE9wZW5MaW51eCByZWRoYXQgUmVkSGF0IHJwbSBSUE0gIiIgOyBkbwotCWlmIHRlc3QgLWQgL3Vzci9zcmMvJHtkaXJlY3Rvcnl9L1NPVVJDRVM7IHRoZW4KLQkJUlBNU09VUkNFRElSPSIvdXNyL3NyYy8ke2RpcmVjdG9yeX0vU09VUkNFUy8iCi0JZmkKLWRvbmUKLWVjaG8gIiRSUE1TT1VSQ0VESVIiCi0gaWYgdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCI7IHRoZW4KLSAgSEFWRV9SUE1fVFJVRT0KLSAgSEFWRV9SUE1fRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfUlBNX1RSVUU9JyMnCi0gIEhBVkVfUlBNX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLSAgV0lUSF9YMTFWTkNfVFJVRT0KLSAgV0lUSF9YMTFWTkNfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfWDExVk5DX1RSVUU9JyMnCi0gIFdJVEhfWDExVk5DX0ZBTFNFPQotZmkKLQotCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBsaWJ2bmNzZXJ2ZXIucGMgbGlidm5jY2xpZW50LnBjIGxpYnZuY3NlcnZlci9NYWtlZmlsZSBleGFtcGxlcy9NYWtlZmlsZSBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIHZuY3Rlcm0vTWFrZWZpbGUgd2ViY2xpZW50cy9NYWtlZmlsZSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIHdlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlIGxpYnZuY2NsaWVudC9NYWtlZmlsZSBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUgdGVzdC9NYWtlZmlsZSBsaWJ2bmNzZXJ2ZXItY29uZmlnIExpYlZOQ1NlcnZlci5zcGVjIgotCi0jCi0jIHgxMXZuYyBvbmx5OgotIwotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCSMKLQkjIE5PVEU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIExpYlZOQ1NlcnZlci1YLlkuWi50YXIuZ3ogc291cmNlCi0JIyB0YXJiYWxsIGFuZCBuZXZlcnRoZWxlc3Mgd2FudCB0byBydW4gYXV0b2NvbmYgKGkuZS4gYWNsb2NhbCwKLQkjIGF1dG9oZWFkZXIsIGF1dG9tYWtlLCBhdXRvY29uZikgQUdBSU4gKHBlcmhhcHMgeW91IGhhdmUgYQotCSMgc3BlY2lhbCB0YXJnZXQgc3lzdGVtLCBlLmcuIGVtYmVkZGVkKSB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KLQkjIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgJ0FDX0NPTkZJR19GSUxFUycgbGluZSB0byBhdm9pZAotCSMgYXV0b21ha2UgZXJyb3IgbWVzc2FnZXMgbGlrZToKLQkjCi0JIyBjb25maWd1cmUuYWM6NjkwOiByZXF1aXJlZCBmaWxlIGB4MTF2bmMvTWFrZWZpbGUuaW4nIG5vdCBmb3VuZAotCSMKLQlhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgeDExdm5jL01ha2VmaWxlIHgxMXZuYy9taXNjL01ha2VmaWxlIHgxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlIgotCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiIC1hICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInhubyI7IHRoZW4KLQkJIyBuZWVkIHRvIG1vdmUgbG9jYWwgdGFyYmFsbCByZmIgaGVhZGVycyBhc2lkZToKLQkJaGRycz0icmZiLmggcmZiY2xpZW50LmggcmZicHJvdG8uaCByZmJyZWdpb24uaCByZmJpbnQuaCIKLQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgYXNpZGUgaGVhZGVycyAkaGRycyIKLQkJZm9yIGhkciBpbiAkaGRycwotCQlkbwotCQkJaWYgdGVzdCAtZiAicmZiLyRoZHIiOyB0aGVuCi0JCQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgcmZiLyRoZHIgdG8gcmZiLyRoZHIuT1JJRyIKLQkJCQltdiByZmIvJGhkciByZmIvJGhkci5PUklHCi0JCQlmaQotCQlkb25lCi0JCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogKk5PVEUqIG1vdmUgdGhlbSBiYWNrIG1hbnVhbGx5IHRvIHN0YXJ0IG92ZXIuIgotCWZpCi1maQotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIKLQotY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KLSMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0jIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMuCi0KLV9BQ0VPRgotCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCi0gICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0JY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgotICAgICAgZWxzZQotICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCi0gICAgICAgICovKiB8ID86KikKLQkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKLQkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCi0gICAgICAgICopCi0JICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi1hY19saWJvYmpzPQotYWNfbHRsaWJvYmpzPQotVT0KLWZvciBhY19pIGluIDogJExJQkAmdEBPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0gICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKLSAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0gIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCQCZ0QE9CSlM9JGFjX2xpYm9ianMKLQotTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKLQotCi0gaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgYW1fX0VYRUVYVF9UUlVFPQotICBhbV9fRVhFRVhUX0ZBTFNFPScjJwotZWxzZQotICBhbV9fRVhFRVhUX1RSVUU9JyMnCi0gIGFtX19FWEVFWFRfRkFMU0U9Ci1maQotCi1pZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9GRk1QRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTVAzTEFNRV9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX01QM0xBTUVfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX01QM0xBTUVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTU0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfWDExX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfWDExX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9YMTFcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke09TWF9PUEVOR0xfVFJVRX0iICYmIHRlc3QgLXogIiR7T1NYX09QRU5HTF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWF9PUEVOR0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUFRIUkVBRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlBUSFJFQURfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlBUSFJFQURcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfV0VCU09DS0VUU19UUlVFfSIgJiYgdGVzdCAteiAiJHtXSVRIX1dFQlNPQ0tFVFNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1dFQlNPQ0tFVFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCWl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlpfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlpcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCSlBFR19UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQkpQRUdfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQkpQRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJQTkdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTRExcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJHVEtcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke01JTkdXX1RSVUV9IiAmJiB0ZXN0IC16ICIke01JTkdXX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTUlOR1dcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfR05VVExTX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfR05VVExTX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9HTlVUTFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi0KLWlmIHRlc3QgLXogIiR7Q1lHSVBDX1RSVUV9IiAmJiB0ZXN0IC16ICIke0NZR0lQQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkNZR0lQQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7TElOVVhfVFJVRX0iICYmIHRlc3QgLXogIiR7TElOVVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJMSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7T1NYX1RSVUV9IiAmJiB0ZXN0IC16ICIke09TWF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7QU5EUk9JRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTkRST0lEX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU5EUk9JRFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9SUE1fVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9SUE1fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1JQTVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1gxMVZOQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLQotOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCi1hY193cml0ZV9mYWlsPTAKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWFzX3dyaXRlX2ZhaWw9MAotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gQCU6QCgKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gQCU6QCgKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotYXNfbXlzZWxmPQotY2FzZSAkMCBpbiBAJTpAKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotCi1AJTpAIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBPdXRwdXQgImBiYXNlbmFtZSBAU3xAMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLUAlOkAgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotQCU6QCBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19IEAlOkAgYXNfZm5fZXJyb3IKLQotCi1AJTpAIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFNldCBAU3xAPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KLWFzX2ZuX3NldF9zdGF0dXMgKCkKLXsKLSAgcmV0dXJuICQxCi19IEAlOkAgYXNfZm5fc2V0X3N0YXR1cwotCi1AJTpAIGFzX2ZuX2V4aXQgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KLWFzX2ZuX2V4aXQgKCkKLXsKLSAgc2V0ICtlCi0gIGFzX2ZuX3NldF9zdGF0dXMgJDEKLSAgZXhpdCAkMQotfSBAJTpAIGFzX2ZuX2V4aXQKLQotQCU6QCBhc19mbl91bnNldCBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci1AJTpAIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi1AJTpAIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLUAlOkAgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLUAlOkAgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi1AJTpAIGFzX2ZuX2FyaXRoIEFSRy4uLgotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotQCU6QCBnbG9iYWwgQFN8QGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi1AJTpAIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzIEBTfEAoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXBSJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXBSJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotCi1AJTpAIGFzX2ZuX21rZGlyX3AKLUAlOkAgLS0tLS0tLS0tLS0tLQotQCU6QCBDcmVhdGUgIkBTfEBhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSBAJTpAIGFzX2ZuX21rZGlyX3AKLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi0KLUAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgotYXNfZm5fZXhlY3V0YWJsZV9wICgpCi17Ci0gIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKLX0gQCU6QCBhc19mbl9leGVjdXRhYmxlX3AKLWFzX3Rlc3RfeD0ndGVzdCAteCcKLWFzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTRU9GCi10ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCi0jIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi1hY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBMaWJWTkNTZXJ2ZXIgJGFzX21lIDAuOS45LCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLSAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCi0gIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKLSAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotICAkICQwICRACi0KLW9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotIgotCi1fQUNFT0YKLQotY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Ci1lc2FjCi0KLWNhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OwotZXNhYwotCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLWNvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWFjX2NzX3VzYWdlPSJcCi1cYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKLWZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwotYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KLQotICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAotICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKLSAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKLQotQ29uZmlndXJhdGlvbiBmaWxlczoKLSRjb25maWdfZmlsZXMKLQotQ29uZmlndXJhdGlvbiBoZWFkZXJzOgotJGNvbmZpZ19oZWFkZXJzCi0KLUNvbmZpZ3VyYXRpb24gY29tbWFuZHM6Ci0kY29uZmlnX2NvbW1hbmRzCi0KLVJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1MaWJWTkNTZXJ2ZXIgY29uZmlnLnN0YXR1cyAwLjkuOQotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAotICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKLQotQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLU1LRElSX1A9JyRNS0RJUl9QJwotQVdLPSckQVdLJwotdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCi1hY19uZWVkX2RlZmF1bHRzPToKLXdoaWxlIHRlc3QgJCMgIT0gMAotZG8KLSAgY2FzZSAkMSBpbgotICAtLSo9PyopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gIC0tKj0pCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9Ci0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQotICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwotCi0gICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICRTSEVMTCAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi0gIHNoaWZ0Ci0gIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Ci0gIENPTkZJR19TSEVMTD0nJFNIRUxMJwotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gIGV4ZWMgIlwkQCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uL0AlOkBAJTpAIC87cy8uLi4kLyBAJTpAQCU6QC87cDt4O3A7eCcgPDxfQVNCT1gKLUAlOkBAJTpAIFJ1bm5pbmcgJGFzX21lLiBAJTpAQCU6QAotX0FTQk9YCi0gICRhc19lY2hvICIkYWNfbG9nIgotfSA+JjUKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotUEFDS0FHRT0iJFBBQ0tBR0UiCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgInJmYmNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyByZmJjb25maWcuaCIgOzsKLSAgICAicmZiL3JmYmNvbmZpZy5oIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIHJmYi9yZmJjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyLnBjIiA7OwotICAgICJsaWJ2bmNjbGllbnQucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jY2xpZW50LnBjIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyL01ha2VmaWxlIiA7OwotICAgICJleGFtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAiZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIiA7OwotICAgICJ2bmN0ZXJtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3Rlcm0vTWFrZWZpbGUiIDs7Ci0gICAgIndlYmNsaWVudHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9NYWtlZmlsZSIgOzsKLSAgICAid2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIiA7OwotICAgICJ3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIgOzsKLSAgICAibGlidm5jY2xpZW50L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY2NsaWVudC9NYWtlZmlsZSIgOzsKLSAgICAiY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXItY29uZmlnIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci1jb25maWciIDs7Ci0gICAgIkxpYlZOQ1NlcnZlci5zcGVjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIExpYlZOQ1NlcnZlci5zcGVjIiA7OwotICAgICJ4MTF2bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL01ha2VmaWxlIiA7OwotICAgICJ4MTF2bmMvbWlzYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB4MTF2bmMvbWlzYy9NYWtlZmlsZSIgOzsKLSAgICAieDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIgOzsKLQotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0gYWNfdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICA6ICIke2FjX3RtcDo9JHRtcH0iCi0gIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQotYWNfdG1wPSR0bXAKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xccicKLWVsc2UKLSAgYWNfY3NfYXdrX2NyPSRhY19jcgotZmkKLQotZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKLV9BQ0VPRgotCi0KLXsKLSAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKLSAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgotICBlY2hvICJfQUNFT0YiCi19ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0gIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCi0gIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotcm0gLWYgY29uZiQkc3Vicy5zaAotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKLV9BQ0VPRgotc2VkIC1uICcKLWgKLXMvXi9TWyIvOyBzLyEuKi8iXT0vCi1wCi1nCi1zL15bXiFdKiEvLwotOnJlcGwKLXQgcmVwbAotcy8nIiRhY19kZWxpbSInJC8vCi10IGRlbGltCi06bmwKLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwotcAotbgotYiByZXBsCi06bW9yZTEKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBubAotOmRlbGltCi1oCi1zL1woLlx7MTQ4XH1cKS4uKi9cMS8KLXQgbW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCi1wCi1iCi06bW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBkZWxpbQotJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJwotL15bXiIiXS97Ci0gIE4KLSAgcy9cbi8vCi19Ci0nID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi1ybSAtZiBjb25mJCRzdWJzLmF3awotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNBV0sKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCi0gIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi0KLX0KLXsKLSAgbGluZSA9ICQgMAotICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKLSAgc3Vic3RlZCA9IDAKLSAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQotICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7Ci0gICAga2V5ID0gZmllbGRbaV0KLSAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQotICAgIGlmIChTX2lzX3NldFtrZXldKSB7Ci0gICAgICB2YWx1ZSA9IFNba2V5XQotICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQotICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKLSAgICAgIHN1YnN0ZWQgPSAxCi0gICAgfSBlbHNlCi0gICAgICBsZW4gKz0gMSArIGtleWxlbgotICB9Ci0KLSAgcHJpbnQgbGluZQotfQotCi1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotX0FDRU9GCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKLWgKLXMvLy8KLXMvXi86Lwotcy9bCSBdKiQvOi8KLXMvOlwkKHNyY2Rpcik6LzovZwotcy86XCR7c3JjZGlyfTovOi9nCi1zLzpAc3JjZGlyQDovOi9nCi1zL146Ki8vCi1zLzoqJC8vCi14Ci1zL1woPVsJIF0qXCkuKi9cMS8KLUcKLXMvXG4vLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKLSAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLSMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAotIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCi0jIG5ld2xpbmUgc2VxdWVuY2VzLgotCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotc2VkIC1uICcKLXMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwotdCByc2V0Ci06cnNldAotcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KLXQgZGVmCi1kCi06ZGVmCi1zL1xcJC8vCi10IGJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzIi9wCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAotZAotOmJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCi10IGNvbnQKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCi10IGNvbnQKLWQKLTpjb250Ci1uCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgY2xlYXIKLTpjbGVhcgotcy9cXCQvLwotdCBic25sYwotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCi1kCi06YnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAotYiBjb250Ci0nIDxjb25mZGVmcy5oIHwgc2VkICcKLXMvJyIkYWNfZGVsaW0iJy8iXFxcCi0iL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQotICBGUyA9ICIHIgotfQotL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7Ci0gIGxpbmUgPSBcJCAwCi0gIHNwbGl0KGxpbmUsIGFyZywgIiAiKQotICBpZiAoYXJnWzFdID09ICIjIikgewotICAgIGRlZnVuZGVmID0gYXJnWzJdCi0gICAgbWFjMSA9IGFyZ1szXQotICB9IGVsc2UgewotICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKLSAgICBtYWMxID0gYXJnWzJdCi0gIH0KLSAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQotICBtYWNybyA9IG1hYzJbMV0KLSAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCi0gIGlmIChEX2lzX3NldFttYWNyb10pIHsKLSAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgotICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KLSAgICBuZXh0Ci0gIH0gZWxzZSB7Ci0gICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAotICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgewotICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgotICAgICAgbmV4dAotICAgIH0KLSAgfQotfQoteyBwcmludCB9Ci1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCi1zaGlmdAotZm9yIGFjX3RhZwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwotICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKLQkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJwotCWAnIGJ5IGNvbmZpZ3VyZS4nCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0gICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KLSAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKLSAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQotICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAotICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAotICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0jIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KLWFjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQotYWNfc2VkX2RhdGFyb290PScKLS9kYXRhcm9vdGRpci8gewotICBwCi0gIHEKLX0KLS9AZGF0YWRpckAvcAotL0Bkb2NkaXJAL3AKLS9AaW5mb2RpckAvcAotL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wJwotY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0gIGFjX2RhdGFyb290ZGlyX2hhY2s9JwotICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0gIHMmQGRvY2RpckAmJGRvY2RpciZnCi0gIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKLSAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKLSRleHRyYXN1YgotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAotcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0Ci1zJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0Ci1zJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAotcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAotcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci1zJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKLXMmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0Ci1zJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci1zJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0Ci1zJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0Ci0kYWNfZGF0YXJvb3RkaXJfaGFjawotIgotZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAotICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0KLXRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKLSAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQotCi0gIHJtIC1mICIkYWNfdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7Ci0gIGVzYWMgXAotICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgewotICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKLSAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAiJGFjX2ZpbGUiCi0gICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCi0JfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgZWxzZQotICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAotICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1Ci0gIGZpCi0jIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9IiRhY19maWxlIgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAotJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRfYW1fYXJnIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotICAKLSAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0gOzsKLSAgZXNhYwotCi0KLSAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0gICAgInJmYi9yZmJjb25maWcuaCI6QykgYWNfcHJlZml4X2NvbmZfT1VUPWBlY2hvIHJmYi9yZmJjb25maWcuaGAKLWFjX3ByZWZpeF9jb25mX0RFRj1gZWNobyBfJGFjX3ByZWZpeF9jb25mX09VVCB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjoiIC1lICJzL0A8OkBeYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkA6PkAvXy9nImAKLWFjX3ByZWZpeF9jb25mX1BLRz1gZWNobyAkUEFDS0FHRWAKLWFjX3ByZWZpeF9jb25mX0xPVz1gZWNobyBfJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi06YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfOiJgCi1hY19wcmVmaXhfY29uZl9VUFA9YGVjaG8gJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei06QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfOiIgIC1lICIvXkA8OkAwMTIzNDU2Nzg5QDo+QC9zL14vXy8iYAotYWNfcHJlZml4X2NvbmZfSU5QPWBlY2hvIF9gCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIl8kYWNfZmlsZSIgPSBfOiAmJiBjb250aW51ZQotICAgICB0ZXN0IC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiAmJiBjb250aW51ZQotICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAgICouaCkgdGVzdCAtZiAkYWNfZmlsZSAmJiBhY19wcmVmaXhfY29uZl9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBjYXNlICIkYWNfcHJlZml4X2NvbmZfT1VUIiBpbgotICAgICAgKi8qKSBhY19wcmVmaXhfY29uZl9JTlA9YGJhc2VuYW1lICIkYWNfcHJlZml4X2NvbmZfT1VUImAKLSAgICAgIDs7Ci0gICAgICAqLSopIGFjX3ByZWZpeF9jb25mX0lOUD1gZWNobyAiJGFjX3ByZWZpeF9jb25mX09VVCIgfCBzZWQgLWUgInMvQDw6QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5X0A6PkAqLS8vImAKLSAgICAgIDs7Ci0gICAgICAqKSBhY19wcmVmaXhfY29uZl9JTlA9Y29uZmlnLmgKLSAgICAgIDs7Ci0gICBlc2FjCi1maQotaWYgdGVzdCAteiAiJGFjX3ByZWZpeF9jb25mX1BLRyIgOyB0aGVuCi0gICBhc19mbl9lcnJvciAkPyAibm8gcHJlZml4IGZvciBfUFJFRklYX1BLR19DT05GSUdfSCIgIiRMSU5FTk8iIDUKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4KLSAgICAgYWNfcHJlZml4X2NvbmZfSU5QPSIkc3JjZGlyLyRhY19wcmVmaXhfY29uZl9JTlAiCi0gIGZpIGZpCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNjt9Ci0gIGlmIHRlc3QgLWYgJGFjX3ByZWZpeF9jb25mX0lOUCA7IHRoZW4KLSAgICBlY2hvICJzL0AlOkB1bmRlZiAgKlxcKEA8OkBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9AOj5AXFwpL0AlOkB1bmRlZiAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxLyIgPiBjb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QHVuZGVmICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AXFwpL0AlOkB1bmRlZiAkX0xPVyIiX1xcMS8iID4+IF9zY3JpcHQKLSAgICBlY2hvICJzL0AlOkBkZWZpbmUgICpcXChAPDpAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfQDo+QEA8OkBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV9AOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMSBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGRlZmluZSAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxIFxcMiBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGVuZGlmLyIgPj5jb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIkAlOkBkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIkAlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX0RFRiIgICAgICA+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZGVmaW5lICRhY19wcmVmaXhfY29uZl9ERUYgMSIgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvIC8nKicgJGFjX3ByZWZpeF9jb25mX09VVC4gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGNvbmZpZ3VyZS4gJyonLyA+PiR0bXAvcGNvbmZpZy5oCi0KLSAgICBzZWQgLWYgY29uZnRlc3QucHJlZml4ICRhY19wcmVmaXhfY29uZl9JTlAgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcvKiBvbmNlOicgJGFjX3ByZWZpeF9jb25mX0RFRiAnKi8nID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZW5kaWYiID4+JHRtcC9wY29uZmlnLmgKLSAgICBpZiBjbXAgLXMgJGFjX3ByZWZpeF9jb25mX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfcHJlZml4X2NvbmZfT1VUIiB8fAotJGFzX2V4cHIgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19wcmVmaXhfY29uZl9PVVQiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gICAgICBybSAtZiAiJGFjX3ByZWZpeF9jb25mX09VVCIKLSAgICAgIG12ICR0bXAvcGNvbmZpZy5oICIkYWNfcHJlZml4X2NvbmZfT1VUIgotICAgIGZpCi0gICAgY3AgY29uZnRlc3QucHJlZml4IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgYXNfZm5fZXJyb3IgJD8gImlucHV0IGZpbGUgJGFjX3ByZWZpeF9jb25mX0lOUCBkb2VzIG5vdCBleGlzdCAtIHNraXAgZ2VuZXJhdGluZyAkYWNfcHJlZml4X2NvbmZfT1VUIiAiJExJTkVOTyIgNQotICBmaQotICBybSAtZiBjb25mdGVzdC4qCi1maQotIDs7Ci0gICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCB7Ci0gICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCi0gICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKLSAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCi0gIGNhc2UgJENPTkZJR19GSUxFUyBpbgotICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OwotICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKLSAgZXNhYwotICBzaGlmdAotICBmb3IgbWYKLSAgZG8KLSAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKLSRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRmaWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciOkMpIGNobW9kIGEreCBsaWJ2bmNzZXJ2ZXItY29uZmlnIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi1hc19mbl9leGl0IDAKLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLQotdGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0KLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgotIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0jIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCi0jIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAotIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCi0jIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGFjX2NzX3N1Y2Nlc3M9OgotICBhY19jb25maWdfc3RhdHVzX2FyZ3M9Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCi0gIGV4ZWMgNT4vZGV2L251bGwKLSAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotICBleGVjIDU+PmNvbmZpZy5sb2cKLSAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKLSAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgMQotZmkKLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQotZmkKLQotY2htb2QgYSt4IC4vbGlidm5jc2VydmVyLWNvbmZpZwotCmRpZmYgLS1naXQgYS9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMiBiL2F1dG9tNHRlLmNhY2hlL291dHB1dC4yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRmMmFlLi4wMDAwMDAwCi0tLSBhL2F1dG9tNHRlLmNhY2hlL291dHB1dC4yCisrKyAvZGV2L251bGwKQEAgLTEsMjY1NzEgKzAsMCBAQAotQCU6QCEgL2Jpbi9zaAotQCU6QCBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotQCU6QCBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIExpYlZOQ1NlcnZlciAwLjkuOS4KLUAlOkAKLUAlOkAgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyPi4KLUAlOkAgCi1AJTpAIAotQCU6QCBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQCU6QCAKLUAlOkAgCi1AJTpAIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1AJTpAIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiBAJTpAKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7IEAlOkAoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0KLQotYXNfbmw9JwotJwotZXhwb3J0IGFzX25sCi0jIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgotYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLSMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAotIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KLWlmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKLSAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50IC1yIC0tJwotICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKLWVsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnRmICVzXG4nCi0gIGFzX2VjaG9fbj0ncHJpbnRmICVzJwotZWxzZQotICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJwotICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKLSAgZWxzZQotICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCi0gICAgYXNfZWNob19uX2JvZHk9J2V2YWwKLSAgICAgIGFyZz0kMTsKLSAgICAgIGNhc2UgJGFyZyBpbiBAJTpAKAotICAgICAgKiIkYXNfbmwiKikKLQlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKLQlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OwotICAgICAgZXNhYzsKLSAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKLSAgICAnCi0gICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Ci0gICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKLSAgZmkKLSAgZXhwb3J0IGFzX2VjaG9fYm9keQotICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCi1maQotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIFBBVEhfU0VQQVJBVE9SPToKLSAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgewotICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gICAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgfQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1hc19teXNlbGY9Ci1jYXNlICQwIGluIEAlOkAoKAotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIGV4aXQgMQotZmkKLQotIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgotIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgotIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAotIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KLWZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKLWRvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCi0gICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1MQ19BTEw9QwotZXhwb3J0IExDX0FMTAotTEFOR1VBR0U9QwotZXhwb3J0IExBTkdVQUdFCi0KLSMgQ0RQQVRILgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0jIFVzZSBhIHByb3BlciBpbnRlcm5hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbnN1cmUgd2UgZG9uJ3QgZmFsbAotICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCi0gIGlmIHRlc3QgeCIke19hc19jYW5fcmVleGVjfSIgIT0geG5vICYmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gICAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYzsKLSAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQotIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KLSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0jIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCi1CQVNIX0VOVj0vZGV2L251bGwKLUVOVj0vZGV2L251bGwKLSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotY2FzZSAkLSBpbiBAJTpAICgoKCgKLSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7Ci0gICp2KiApIGFzX29wdHM9LXYgOzsKLSAgKngqICkgYXNfb3B0cz0teCA7OwotICAqICkgYXNfb3B0cz0gOzsKLWVzYWMKLWV4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci0jIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKLSMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KLSRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKLWFzX2ZuX2V4aXQgMjU1Ci0gIGZpCi0gICMgV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHByb3BhZ2F0ZSB0byBvdGhlciBzdWJwcm9jZXNzZXMuCi0gICAgICAgICAgeyBfYXNfY2FuX3JlZXhlYz07IHVuc2V0IF9hc19jYW5fcmVleGVjO30KLWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KLSAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiBAJTpAKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7IEAlOkAoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0iCi0gIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Ci1hc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KLWFzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQotYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQotCi1leGl0Y29kZT0wCi1hc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9Ci1pZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6Ci0gIAotZWxzZQotICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi10ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxCi10ZXN0IC14IC8gfHwgZXhpdCAxIgotICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTwotICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCi0gIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKLXRlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxIgotICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBhc19oYXZlX3JlcXVpcmVkPXllcwotZWxzZQotICBhc19oYXZlX3JlcXVpcmVkPW5vCi1maQotICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIAotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1hc19mb3VuZD1mYWxzZQotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBhc19mb3VuZD06Ci0gIGNhc2UgJGFzX2RpciBpbiBAJTpAKAotCSAvKikKLQkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCi0JICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCi0JICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCi0JICAgICBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcwotCQkgICBpZiB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19zdWdnZXN0ZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBicmVhayAyCi1maQotZmkKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi0gIGFzX2ZvdW5kPWZhbHNlCi1kb25lCi0kYXNfZm91bmQgfHwgeyBpZiB7IHRlc3QgLWYgIiRTSEVMTCIgfHwgdGVzdCAtZiAiJFNIRUxMLmV4ZSI7IH0gJiYKLQkgICAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJFNIRUxMIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWZpOyB9Ci1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICAgICAgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKLSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCi0jIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgotIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgotQkFTSF9FTlY9L2Rldi9udWxsCi1FTlY9L2Rldi9udWxsCi0odW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKLWNhc2UgJC0gaW4gQCU6QCAoKCgoCi0gICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OwotICAqdiogKSBhc19vcHRzPS12IDs7Ci0gICp4KiApIGFzX29wdHM9LXggOzsKLSAgKiApIGFzX29wdHM9IDs7Ci1lc2FjCi1leGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQotIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCi0jIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCi0kYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCi1leGl0IDI1NQotZmkKLQotICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgotICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKLSAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KLSAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKLSAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCi0gIGVsc2UKLSAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFuZAotJDA6IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIGFib3V0IHlvdXIKLSQwOiBzeXN0ZW0sIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0kMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KLSQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgotICBmaQotICBleGl0IDEKLWZpCi1maQotZmkKLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1leHBvcnQgU0hFTEwKLSMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgotQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KLXVuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUwotCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1AJTpAIGFzX2ZuX3Vuc2V0IFZBUgotQCU6QCAtLS0tLS0tLS0tLS0tLS0KLUAlOkAgUG9ydGFibHkgdW5zZXQgVkFSLgotYXNfZm5fdW5zZXQgKCkKLXsKLSAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQotfQotYXNfdW5zZXQ9YXNfZm5fdW5zZXQKLQotQCU6QCBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBTZXQgQFN8QD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCi1hc19mbl9zZXRfc3RhdHVzICgpCi17Ci0gIHJldHVybiAkMQotfSBAJTpAIGFzX2ZuX3NldF9zdGF0dXMKLQotQCU6QCBhc19mbl9leGl0IFNUQVRVUwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCi1hc19mbl9leGl0ICgpCi17Ci0gIHNldCArZQotICBhc19mbl9zZXRfc3RhdHVzICQxCi0gIGV4aXQgJDEKLX0gQCU6QCBhc19mbl9leGl0Ci0KLUAlOkAgYXNfZm5fbWtkaXJfcAotQCU6QCAtLS0tLS0tLS0tLS0tCi1AJTpAIENyZWF0ZSAiQFN8QGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KLWFzX2ZuX21rZGlyX3AgKCkKLXsKLQotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKLQotCi19IEAlOkAgYXNfZm5fbWtkaXJfcAotCi1AJTpAIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KLWFzX2ZuX2V4ZWN1dGFibGVfcCAoKQotewotICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCi19IEAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wCi1AJTpAIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi1AJTpAIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLUAlOkAgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLUAlOkAgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi1AJTpAIGFzX2ZuX2FyaXRoIEFSRy4uLgotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotQCU6QCBnbG9iYWwgQFN8QGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi1AJTpAIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzIEBTfEAoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotQCU6QCBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgT3V0cHV0ICJgYmFzZW5hbWUgQFN8QDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCi1AJTpAIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKLUAlOkAgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCi1hc19mbl9lcnJvciAoKQotewotICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkNCI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0Ci0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCi0gIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cwotfSBAJTpAIGFzX2ZuX2Vycm9yCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTyBhc19saW5lbm9fMWE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCi0gIGV2YWwgJ3Rlc3QgIngkYXNfbGluZW5vXzEnJGFzX3J1biciICE9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xJyRhc19ydW4nICsgMWAiID0gIngkYXNfbGluZW5vXzInJGFzX3J1biciJyB8fCB7Ci0gICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7IGFzX2ZuX2V4aXQgMTsgfQotCi0gICMgSWYgd2UgaGFkIHRvIHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMLCB3ZSdyZSBlbnN1cmVkIHRvIGhhdmUKLSAgIyBhbHJlYWR5IGRvbmUgdGhhdCwgc28gZW5zdXJlIHdlIGRvbid0IHRyeSB0byBkbyBzbyBhZ2FpbiBhbmQgZmFsbAotICAjIGluIGFuIGluZmluaXRlIGxvb3AuICBUaGlzIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGluIHByYWN0aWNlLgotICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXBSJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXBSJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCi1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWFzX3Rlc3RfeD0ndGVzdCAteCcKLWFzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLQotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotY2FzZSBYJEVDSE8gaW4KLVgqLS1mYWxsYmFjay1lY2hvKQotICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgotICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFwkXFwkMCwnJDAnLCdgCi0gIDs7Ci1lc2FjCi0KLWVjaG89JHtFQ0hPLWVjaG99Ci1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KLSMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgZWNobz0ncHJpbnQgLXInCi0gICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKLQkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICVzXG4nCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAotCSAgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICIkMCIgJHsxKyIkQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQotIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCi1FQ0hPPSRlY2hvCi1pZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFwkMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotCi0KLQotCi10YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1DWFgKLQotdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3Ci0KLXRlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKLWV4ZWMgNj4mMQotCi0jIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCQCZ0QE9CSlM9Ci1jcm9zc19jb21waWxpbmc9bm8KLXN1YmRpcnM9Ci1NRkxBR1M9Ci1NQUtFRkxBR1M9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdMaWJWTkNTZXJ2ZXInCi1QQUNLQUdFX1RBUk5BTUU9J2xpYnZuY3NlcnZlcicKLVBBQ0tBR0VfVkVSU0lPTj0nMC45LjknCi1QQUNLQUdFX1NUUklORz0nTGliVk5DU2VydmVyIDAuOS45JwotUEFDS0FHRV9CVUdSRVBPUlQ9J2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyJwotUEFDS0FHRV9VUkw9JycKLQotIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1RETElCX0gKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0jICBpbmNsdWRlIDxtZW1vcnkuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIgotCi1hY19zdWJzdF92YXJzPSdhbV9fRVhFRVhUX0ZBTFNFCi1hbV9fRVhFRVhUX1RSVUUKLUxUTElCT0JKUwotUlBNU09VUkNFRElSCi1XSVRIX1gxMVZOQ19GQUxTRQotV0lUSF9YMTFWTkNfVFJVRQotSEFWRV9SUE1fRkFMU0UKLUhBVkVfUlBNX1RSVUUKLUFORFJPSURfRkFMU0UKLUFORFJPSURfVFJVRQotT1NYX0ZBTFNFCi1PU1hfVFJVRQotTElOVVhfRkFMU0UKLUxJTlVYX1RSVUUKLUNZR0lQQ19GQUxTRQotQ1lHSVBDX1RSVUUKLUxJQkAmdEBPQkpTCi1IQVZFX0dOVVRMU19GQUxTRQotSEFWRV9HTlVUTFNfVFJVRQotR05VVExTX0xJQlMKLUdOVVRMU19DRkxBR1MKLUxJQkdDUllQVF9MSUJTCi1MSUJHQ1JZUFRfQ0ZMQUdTCi1MSUJHQ1JZUFRfQ09ORklHCi1XU09DS0xJQgotTUlOR1dfRkFMU0UKLU1JTkdXX1RSVUUKLUhBVkVfTElCR1RLX0ZBTFNFCi1IQVZFX0xJQkdUS19UUlVFCi1HVEtfTElCUwotR1RLX0NGTEFHUwotUEtHX0NPTkZJR19MSUJESVIKLVBLR19DT05GSUdfUEFUSAotUEtHX0NPTkZJRwotU0RMX0xJQlMKLVNETF9DRkxBR1MKLUhBVkVfTElCU0RMX0ZBTFNFCi1IQVZFX0xJQlNETF9UUlVFCi1IQVZFX0xJQlBOR19GQUxTRQotSEFWRV9MSUJQTkdfVFJVRQotSEFWRV9MSUJKUEVHX0ZBTFNFCi1IQVZFX0xJQkpQRUdfVFJVRQotSEFWRV9MSUJaX0ZBTFNFCi1IQVZFX0xJQlpfVFJVRQotV0lUSF9XRUJTT0NLRVRTX0ZBTFNFCi1XSVRIX1dFQlNPQ0tFVFNfVFJVRQotV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0UKLVdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUUKLUhBVkVfTElCUFRIUkVBRF9GQUxTRQotSEFWRV9MSUJQVEhSRUFEX1RSVUUKLUpQRUdfTERGTEFHUwotSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFCi1IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRQotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUwotT1NYX09QRU5HTF9GQUxTRQotT1NYX09QRU5HTF9UUlVFCi1BVkFISV9MSUJTCi1BVkFISV9DRkxBR1MKLUhBVkVfWDExX0ZBTFNFCi1IQVZFX1gxMV9UUlVFCi1YX0VYVFJBX0xJQlMKLVhfTElCUwotWF9QUkVfTElCUwotWF9DRkxBR1MKLVhNS01GCi1IQVZFX0xJQlNTTF9GQUxTRQotSEFWRV9MSUJTU0xfVFJVRQotU1NMX0xJQlMKLUNSWVBUX0xJQlMKLUhBVkVfTVAzTEFNRV9GQUxTRQotSEFWRV9NUDNMQU1FX1RSVUUKLVdJVEhfRkZNUEVHX0ZBTFNFCi1XSVRIX0ZGTVBFR19UUlVFCi13aXRoX2ZmbXBlZwotTElCVE9PTAotYWNfY3RfRjc3Ci1GRkxBR1MKLUY3NwotQ1hYQ1BQCi1hbV9fZmFzdGRlcENYWF9GQUxTRQotYW1fX2Zhc3RkZXBDWFhfVFJVRQotQ1hYREVQTU9ERQotYWNfY3RfQ1hYCi1DWFhGTEFHUwotQ1hYCi1DUFAKLU9CSkRVTVAKLUFTCi1ETExUT09MCi1SQU5MSUIKLUFSCi1FQ0hPCi1MTl9TCi1FR1JFUAotR1JFUAotaG9zdF9vcwotaG9zdF92ZW5kb3IKLWhvc3RfY3B1Ci1ob3N0Ci1idWlsZF9vcwotYnVpbGRfdmVuZG9yCi1idWlsZF9jcHUKLWJ1aWxkCi1hbV9fZmFzdGRlcENDX0ZBTFNFCi1hbV9fZmFzdGRlcENDX1RSVUUKLUNDREVQTU9ERQotYW1fX25vZGVwCi1BTURFUEJBQ0tTTEFTSAotQU1ERVBfRkFMU0UKLUFNREVQX1RSVUUKLWFtX19xdW90ZQotYW1fX2luY2x1ZGUKLURFUERJUgotT0JKRVhUCi1FWEVFWFQKLWFjX2N0X0NDCi1DUFBGTEFHUwotTERGTEFHUwotQ0ZMQUdTCi1DQwotQU1fQkFDS1NMQVNICi1BTV9ERUZBVUxUX1ZFUkJPU0lUWQotQU1fREVGQVVMVF9WCi1BTV9WCi1hbV9fdW50YXIKLWFtX190YXIKLUFNVEFSCi1hbV9fbGVhZGluZ19kb3QKLVNFVF9NQUtFCi1BV0sKLW1rZGlyX3AKLU1LRElSX1AKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotU1RSSVAKLWluc3RhbGxfc2gKLU1BS0VJTkZPCi1BVVRPSEVBREVSCi1BVVRPTUFLRQotQVVUT0NPTkYKLUFDTE9DQUwKLVZFUlNJT04KLVBBQ0tBR0UKLUNZR1BBVEhfVwotYW1fX2lzcmMKLUlOU1RBTExfREFUQQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfUFJPR1JBTQotdGFyZ2V0X2FsaWFzCi1ob3N0X2FsaWFzCi1idWlsZF9hbGlhcwotTElCUwotRUNIT19UCi1FQ0hPX04KLUVDSE9fQwotREVGUwotbWFuZGlyCi1sb2NhbGVkaXIKLWxpYmRpcgotcHNkaXIKLXBkZmRpcgotZHZpZGlyCi1odG1sZGlyCi1pbmZvZGlyCi1kb2NkaXIKLW9sZGluY2x1ZGVkaXIKLWluY2x1ZGVkaXIKLWxvY2Fsc3RhdGVkaXIKLXNoYXJlZHN0YXRlZGlyCi1zeXNjb25mZGlyCi1kYXRhZGlyCi1kYXRhcm9vdGRpcgotbGliZXhlY2Rpcgotc2JpbmRpcgotYmluZGlyCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1wcmVmaXgKLWV4ZWNfcHJlZml4Ci1QQUNLQUdFX1VSTAotUEFDS0FHRV9CVUdSRVBPUlQKLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9OQU1FCi1QQVRIX1NFUEFSQVRPUgotU0hFTEwnCi1hY19zdWJzdF9maWxlcz0nJwotYWNfdXNlcl9vcHRzPScKLWVuYWJsZV9vcHRpb25fY2hlY2tpbmcKLWVuYWJsZV9zaWxlbnRfcnVsZXMKLWVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCi1lbmFibGVfc2hhcmVkCi1lbmFibGVfc3RhdGljCi1lbmFibGVfZmFzdF9pbnN0YWxsCi13aXRoX2dudV9sZAotZW5hYmxlX2xpYnRvb2xfbG9jawotd2l0aF9waWMKLXdpdGhfdGFncwotd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIKLXdpdGhfd2Vic29ja2V0cwotd2l0aF8yNGJwcAotd2l0aF9mZm1wZWcKLXdpdGhfY3J5cHQKLXdpdGhfY3J5cHRvCi13aXRoX3NzbAotd2l0aF94Ci13aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIKLXdpdGhfeDExdm5jCi13aXRoX3hrZXlib2FyZAotd2l0aF94aW5lcmFtYQotd2l0aF94cmFuZHIKLXdpdGhfeGZpeGVzCi13aXRoX3hkYW1hZ2UKLXdpdGhfeHRyYXAKLXdpdGhfeHJlY29yZAotd2l0aF9mYnBtCi13aXRoX2RwbXMKLXdpdGhfdjRsCi13aXRoX2ZiZGV2Ci13aXRoX3VpbnB1dAotd2l0aF9tYWNvc3hfbmF0aXZlCi13aXRoX2F2YWhpCi13aXRoX2pwZWcKLXdpdGhfcG5nCi13aXRoX2xpYnoKLXdpdGhfemxpYgotd2l0aF9wdGhyZWFkCi13aXRoX3NkbF9jb25maWcKLXdpdGhfZ2NyeXB0Ci13aXRoX2NsaWVudF9nY3J5cHQKLXdpdGhfbGliZ2NyeXB0X3ByZWZpeAotd2l0aF9nbnV0bHMKLXdpdGhfaXB2NgotJwotICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotQ0MKLUNGTEFHUwotTERGTEFHUwotTElCUwotQ1BQRkxBR1MKLUNQUAotQ1hYCi1DWFhGTEFHUwotQ0NDCi1DWFhDUFAKLUY3NwotRkZMQUdTCi1YTUtNRgotSlBFR19MREZMQUdTCi1QS0dfQ09ORklHCi1QS0dfQ09ORklHX1BBVEgKLVBLR19DT05GSUdfTElCRElSCi1HVEtfQ0ZMQUdTCi1HVEtfTElCUwotR05VVExTX0NGTEFHUwotR05VVExTX0xJQlMnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICo9KSAgIGFjX29wdGFyZz0gOzsKLSAgKikgICAgYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAotICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KLSAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgotICAgIG5vKSA7OwotICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKLSAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgKi8gKQotICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCi0gICAgICBldmFsICRhY192YXI9XCRhY192YWw7OwotICBlc2FjCi0gICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCi1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBMaWJWTkNTZXJ2ZXIgMC45LjkgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCi0gICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KLSAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBAU3xAYWNfZGVmYXVsdF9wcmVmaXhAOj5ACi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBQUkVGSVhAOj5ACi0KLUJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgotXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKLWFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi1mb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgotCi1Gb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLQotRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgQDw6QERBVEFST09URElSL2RvYy9saWJ2bmNzZXJ2ZXJAOj5ACi0gIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVggZmVhdHVyZXM6Ci0gIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0gIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIExpYlZOQ1NlcnZlciAwLjkuOToiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgICAgICAgIGxlc3MgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MScpCi0gIC0tZGlzYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0wJykKLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotICAtLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PXllc0A6PkAKLSAgLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QCAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD15ZXNAOj5ACi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKLQotT3B0aW9uYWwgUGFja2FnZXM6Ci0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkAKLSAgLS13aXRoLXBpYyAgICAgICAgICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhAOj5ACi0gIC0td2l0aC10YWdzQDw6QD1UQUdTQDo+QCAgICAgIGluY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QAotICAtLXdpdGhvdXQtZmlsZXRyYW5zZmVyICBkaXNhYmxlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wKLSAgLS13aXRob3V0LXdlYnNvY2tldHMgICAgZGlzYWJsZSBXZWJTb2NrZXRzIHN1cHBvcnQKLSAgLS13aXRob3V0LTI0YnBwICAgICAgICAgZGlzYWJsZSAyNCBicHAgZnJhbWVidWZmZXJzCi0gIC0td2l0aC1mZm1wZWc9ZGlyICAgICAgIHNldCBmZm1wZWcgaG9tZSBkaXJlY3RvcnkKLSAgLS13aXRob3V0LWNyeXB0ICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBsaWJjcnlwdAotICAtLXdpdGhvdXQtY3J5cHRvICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIG9wZW5zc2wgbGliY3J5cHRvCi0gIC0td2l0aG91dC1zc2wgICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3Igb3BlbnNzbCBsaWJzc2wKLSAgLS13aXRoLXNzbD1ESVIgICAgICAgICAgdXNlIG9wZW5zc2wgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbQotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciAgICAgdXNlIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgZm9yIHgxMXZuYwotICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcj1ESVIgdXNlIGxpYnZuY3NlcnZlciBpbnN0YWxsZWQgaW4gRElSIGZvciB4MTF2bmMKLSAgLS13aXRoLXgxMXZuYyAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyB0aGUgeDExdm5jIHN1YmRpciAoaWYgcHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBjZCB0byB4MTF2bmMgYW5kIHJ1biAnbWFrZScgZXRjLgotICAtLXdpdGhvdXQteGtleWJvYXJkICAgICBkaXNhYmxlIHhrZXlib2FyZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteGluZXJhbWEgICAgICBkaXNhYmxlIHhpbmVyYW1hIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmFuZHIgICAgICAgIGRpc2FibGUgeHJhbmRyIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14ZGFtYWdlICAgICAgIGRpc2FibGUgeGRhbWFnZSBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQteHRyYXAgICAgICAgICBkaXNhYmxlIHh0cmFwIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14cmVjb3JkICAgICAgIGRpc2FibGUgeHJlY29yZCBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQtZmJwbSAgICAgICAgICBkaXNhYmxlIGZicG0gZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LWRwbXMgICAgICAgICAgZGlzYWJsZSBkcG1zIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC12NGwgICAgICAgICAgIGRpc2FibGUgdmlkZW80bGludXggc3VwcG9ydAotICAtLXdpdGhvdXQtZmJkZXYgICAgICAgICBkaXNhYmxlIGxpbnV4IGZiIGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC11aW5wdXQgICAgICAgIGRpc2FibGUgbGludXggdWlucHV0IGRldmljZSBzdXBwb3J0Ci0gIC0td2l0aG91dC1tYWNvc3gtbmF0aXZlIGRpc2FibGUgTWFjT1MgWCBuYXRpdmUgZGlzcGxheSBzdXBwb3J0Ci0gIC0td2l0aG91dC1hdmFoaSAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgQXZhaGkvbUROUwotICAtLXdpdGgtYXZhaGk9RElSICAgICAgICB1c2UgYXZhaGkgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtanBlZyAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGpwZWcKLSAgLS13aXRoLWpwZWc9RElSICAgICAgICAgdXNlIGpwZWcgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtcG5nICAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIHBuZwotICAtLXdpdGgtcG5nPURJUiAgICAgICAgICB1c2UgcG5nIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWxpYnogICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBkZWZsYXRlCi0gIC0td2l0aG91dC16bGliICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgZGVmbGF0ZQotICAtLXdpdGgtemxpYj1ESVIgICAgICAgICB1c2UgemxpYiBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1wdGhyZWFkICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgbGlicHRocmVhZAotICAtLXdpdGgtc2RsLWNvbmZpZz1GSUxFCi0gICAgVXNlIHRoZSBnaXZlbiBwYXRoIHRvIHNkbC1jb25maWcgd2hlbiBkZXRlcm1pbmluZwotICAgIFNETCBjb25maWd1cmF0aW9uOyBkZWZhdWx0cyB0byAic2RsLWNvbmZpZyIKLSAgLS13aXRob3V0LWdjcnlwdCAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQKLSAgLS13aXRob3V0LWNsaWVudC1nY3J5cHQgZGlzYWJsZSBzdXBwb3J0IGZvciBnY3J5cHQgaW4gbGlidm5jY2xpZW50Ci0gIC0td2l0aC1saWJnY3J5cHQtcHJlZml4PVBGWCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IHdoZXJlIExJQkdDUllQVCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKQotICAtLXdpdGhvdXQtZ251dGxzICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGdudXRscwotICAtLXdpdGgtZ251dGxzPURJUiAgICAgICB1c2UgZ251dGxzIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LWlwdjYgICAgICAgICAgZGlzYWJsZSBJUHY2IHN1cHBvcnQKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLSAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ1hYRkxBR1MgICAgQysrIGNvbXBpbGVyIGZsYWdzCi0gIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKLSAgRjc3ICAgICAgICAgRm9ydHJhbiA3NyBjb21waWxlciBjb21tYW5kCi0gIEZGTEFHUyAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgZmxhZ3MKLSAgWE1LTUYgICAgICAgUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW0KLSAgSlBFR19MREZMQUdTIAotICAgICAgICAgICAgICBMaW5rZXIgZmxhZ3MgdG8gdXNlIHdoZW4gbGlua2luZyB3aXRoIGxpYmpwZWcsIGUuZy4KLSAgICAgICAgICAgICAgLUwvZm9vL2Rpci9saWIgLVdsLC1zdGF0aWMgLWxqcGVnIC1XbCwtc2hhcmVkLiBUaGlzIG92ZXJyaWRlcwotICAgICAgICAgICAgICB0aGUgbGlua2VyIGZsYWdzIHNldCBieSAtLXdpdGgtanBlZy4KLSAgUEtHX0NPTkZJRyAgcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHkKLSAgUEtHX0NPTkZJR19QQVRIIAotICAgICAgICAgICAgICBkaXJlY3RvcmllcyB0byBhZGQgdG8gcGtnLWNvbmZpZydzIHNlYXJjaCBwYXRoCi0gIFBLR19DT05GSUdfTElCRElSIAotICAgICAgICAgICAgICBwYXRoIG92ZXJyaWRpbmcgcGtnLWNvbmZpZydzIGJ1aWx0LWluIHNlYXJjaCBwYXRoCi0gIEdUS19DRkxBR1MgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIEdUSywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCi0gIEdUS19MSUJTICAgIGxpbmtlciBmbGFncyBmb3IgR1RLLCBvdmVycmlkaW5nIHBrZy1jb25maWcKLSAgR05VVExTX0NGTEFHUyAKLSAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgR05VVExTLCBvdmVycmlkaW5nIHBrZy1jb25maWcKLSAgR05VVExTX0xJQlMgbGlua2VyIGZsYWdzIGZvciBHTlVUTFMsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZwotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1SZXBvcnQgYnVncyB0byA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXI+LgotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAotICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8Ci0gICAgICBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotTGliVk5DU2VydmVyIGNvbmZpZ3VyZSAwLjkuOQotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5Ci0KLUNvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi1AJTpAIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKLQotQCU6QCBhY19mbl9jX3RyeV9saW5rIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgewotCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAotCSB0ZXN0IC14IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCi0gICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKLSAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKLSAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgotICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9jX3RyeV9jcHAgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICAgYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2NfdHJ5X2NwcAotCi1AJTpAIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMsIGdpdmluZyBhIHdhcm5pbmcgaWYgaXQgY2Fubm90IGJlIGNvbXBpbGVkIHVzaW5nCi1AJTpAIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKLUAlOkAgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAotICB5ZXM6bm86ICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotKCAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIFJlcG9ydCB0aGlzIHRvIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgotICAgIDs7Ci1lc2FjCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZmkKLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCi0KLUAlOkAgYWNfZm5fY190cnlfcnVuIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcwotQCU6QCB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KLWFjX2ZuX2NfdHJ5X3J1biAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cwotZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jX3RyeV9ydW4KLQotQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KLUAlOkAgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotQCU6QGluY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiQzPXllcyIKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQotCi1AJTpAIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKLWFjX2ZuX2NfY2hlY2tfZnVuYyAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICQyIGlubm9jdW91c18kMgotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkMgotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICQyICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkMiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja19mdW5jCi0KLUAlOkAgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTwotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKLQotQCU6QCBhY19mbl9jeHhfdHJ5X2NwcCBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgIGFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2NwcAotCi1AJTpAIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jeHhfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9jeHhfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgTElORU5PCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fZjc3X3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSBAJTpAIGFjX2ZuX2Y3N190cnlfY29tcGlsZQotCi1AJTpAIGFjX2ZuX2Y3N190cnlfbGluayBMSU5FTk8KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBUcnkgdG8gbGluayBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9mNzdfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gQCU6QCBhY19mbl9mNzdfdHJ5X2xpbmsKLQotQCU6QCBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKLUAlOkAgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja190eXBlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCQyKSkKLQkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLWludAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoKCQyKSkpCi0JICAgIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICBldmFsICIkMz15ZXMiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19IEAlOkAgYWNfZm5fY19jaGVja190eXBlCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSBMaWJWTkNTZXJ2ZXIgJGFzX21lIDAuOS45LCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gICQgJDAgJEAKLQotX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLWNhdCA8PF9BU1VOQU1FCi0jIyAtLS0tLS0tLS0gIyMKLSMjIFBsYXRmb3JtLiAjIwotIyMgLS0tLS0tLS0tICMjCi0KLWhvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotCi1fQVNVTkFNRQotCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAkYWNfcGFzcyBpbgotICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7Ci0gICAgMikKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCi0gICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KLQlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCi0gICAgICBlbHNlCi0JY2FzZSAkYWNfYXJnIGluCi0JICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKLQkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKLQkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKLQkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQotCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KLQkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWRvbmUKLXsgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KLXsgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KLQotIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQotIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKLSMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgotIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCi0jIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCi10cmFwICdleGl0X3N0YXR1cz0kPwotICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KLSAgewotICAgIGVjaG8KLQotICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjIgotICAgIGVjaG8KLSAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAotICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLSAgICAgIGVzYWMKLSAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICBkb25lIHwgc29ydAotICAgIGVjaG8KLQotICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKLSAgICAgIGRvCi0JZXZhbCBhY192YWw9XCQkYWNfdmFyCi0JY2FzZSAkYWNfdmFsIGluCi0JKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgICBkb25lIHwgc29ydAotICAgICAgZWNobwotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIwotIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgY2F0IGNvbmZkZWZzLmgKLSAgICAgIGVjaG8KLSAgICBmaQotICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0kYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCi0KLSMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKLV9BQ0VPRgotCi0KLSMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgotIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWFjX3NpdGVfZmlsZTE9Tk9ORQotYWNfc2l0ZV9maWxlMj1OT05FCi1pZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCi0gIGNhc2UgJENPTkZJR19TSVRFIGluIEAlOkAoKAotICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7Ci0gICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7Ci0gICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKLWVsc2UKLSAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKLSAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKLWRvCi0gIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIiBcCi0gICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKLSAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KLSAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0gICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICA+JGNhY2hlX2ZpbGUKLWZpCi0KLSMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKLSMgdmFsdWUuCi1hY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQotICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgc2V0LCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLHNldCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsKTs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KLQkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KLQlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKLQlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKLQlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBhY19jYWNoZV9jb3JydXB0ZWQ9OgotCWVsc2UKLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBmaQotZG9uZQotaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKLWZpCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTEnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQotZmkKLQotIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0jIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCi0jIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKLSMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLWFjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLSMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbiBAJTpAKCgKLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0JICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCi0JICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCi0JICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgotCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCi0JICAgIHRoZW4KLQkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgICAgYnJlYWsgMwotCSAgICBmaQotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQotJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICIgPiY2OyB9Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQotIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgotYW1fbGY9JwotJwotY2FzZSBgcHdkYCBpbgotICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXSopCi0gICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1jYXNlICRzcmNkaXIgaW4KLSAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldKikKLSAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIHNyY2RpciB2YWx1ZTogXGAkc3JjZGlyJyIgIiRMSU5FTk8iIDU7OwotZXNhYwotCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgRG91YmxlIGFueSBcIG9yICQuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJwotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OwotICAqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OwotICBlc2FjCi1maQotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQotZmkKLQotaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KLSAgY2FzZSAkYW1fYXV4X2RpciBpbgotICAqXCAqIHwgKlwJKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OwotICAqKQotICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgotICBlc2FjCi1maQotCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVNUUklQPSRhY19jdl9wcm9nX1NUUklQCi1pZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQotJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCi0gIGFjX2N0X1NUUklQPSRTVFJJUAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU1RSSVA9JGFjX2N0X1NUUklQCi0gIGZpCi1lbHNlCi0gIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKLWZpCi0KLWZpCi1JTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KLSAgaWYgJHthY19jdl9wYXRoX21rZGlyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi9vcHQvc2Z3L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLQotICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQotJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQVdLPSRhY19jdl9wcm9nX0FXSwotaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQotJGFzX2VjaG8gIiRBV0siID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhawotZG9uZQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9Ci1hY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotU0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9BQ0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gInNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiAiJExJTkVOTyIgNQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi0gUEFDS0FHRT1MaWJWTkNTZXJ2ZXIKLSBWRVJTSU9OPTAuOS45Ci0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLV9BQ0VPRgotCi0gCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotX0FDRU9GCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLQotQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQotCi0KLUFVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KLQotCi1NQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KLQotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi0jIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAotIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCi1BTVRBUj0nJCR7VEFSLXRhcn0nCi0KLWFtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbGVudC1ydWxlcyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaWxlbnRfcnVsZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zaWxlbnRfcnVsZXM7IAotZmkKLQotY2FzZSAkZW5hYmxlX3NpbGVudF9ydWxlcyBpbgoteWVzKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0wOzsKLW5vKSAgQU1fREVGQVVMVF9WRVJCT1NJVFk9MTs7Ci0qKSAgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTA7OwotZXNhYwotYW1fbWFrZT0ke01BS0UtbWFrZX0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkYW1fbWFrZSBzdXBwb3J0cyBuZXN0ZWQgdmFyaWFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJGFtX21ha2Ugc3VwcG9ydHMgbmVzdGVkIHZhcmlhYmxlcy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmICRhc19lY2hvICdUUlVFPSQoQkFSJChWKSkKLUJBUjA9ZmFsc2UKLUJBUjE9dHJ1ZQotVj0xCi1hbV9fZG9pdDoKLQlAJChUUlVFKQotLlBIT05ZOiBhbV9fZG9pdCcgfCAkYW1fbWFrZSAtZiAtID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz15ZXMKLWVsc2UKLSAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9bm8KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcyIgPiY1Ci0kYXNfZWNobyAiJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzIiA+JjY7IH0KLWlmIHRlc3QgJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzID0geWVzOyB0aGVuCi0gICAgQU1fVj0nJChWKScKLSAgQU1fREVGQVVMVF9WPSckKEFNX0RFRkFVTFRfVkVSQk9TSVRZKScKLWVsc2UKLSAgQU1fVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLSAgQU1fREVGQVVMVF9WPSRBTV9ERUZBVUxUX1ZFUkJPU0lUWQotZmkKLUFNX0JBQ0tTTEFTSD0nXCcKLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyByZmJjb25maWcuaCIKLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyAiCi0KLQotYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIHJmYi9yZmJjb25maWcuaCIKLQotCi0jIENoZWNrcyBmb3IgcHJvZ3JhbXMuCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBhY19wcm9nX3JlamVjdGVkPW5vCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkQCU6QCAhPSAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLSAgZG8KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1maQotCi1maQotCi0KLXRlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1zZXQgWCAkYWNfY29tcGlsZQotYWNfY29tcGlsZXI9JDIKLWZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KLSAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBzZWQgJzEwYVwKLS4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KLSAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci1kb25lCi0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKLSMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KLSMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSMgb2YgZXhlZXh0LgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0KLSMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKLWFjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCi0KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLQlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVsc2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4KLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQotaWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0kYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9Ci1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotCi1ybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9Ci1pZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSAgYnJlYWs7OwotICAgICogKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKLSByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgICBmaQotICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLSRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi1ybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9Ci1PQkpFWFQ9JGFjX2N2X29iamV4dAotYWNfb2JqZXh0PSRPQkpFWFQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgQ0ZMQUdTPSIiCi0gICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLXN0cnVjdCBzdGF0OwotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKLSAgCi1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1ERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCi0KLWFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKLQotCi1hbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0Ci0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KLWNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0qdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICBhbV9fcXVvdGU9Ci0gIF9hbV9yZXN1bHQ9R05VCi0gIDs7Ci1lc2FjCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0gICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgICAgOzsKLSAgIGVzYWMKLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkX2FtX3Jlc3VsdCIgPiY2OyB9Ci1ybSAtZiBjb25maW5jIGNvbmZtZgotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZzsgCi1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi0gIGFtX19ub2RlcD0nX25vJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQotQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZiAKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlci4uLiAiID4mNjsgfQotZmkKLXNldCBkdW1teSAkQ0M7IGFjX2NjPWAkYXNfZWNobyAiJDIiIHwKLQkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIGV2YWwgXCR7YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYKLSAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OwotdGhlbgotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPXllcwotICBpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgICAjIFRlc3QgZmlyc3QgdGhhdCBjYyBleGlzdHMgYXQgYWxsLgotICAgIGlmIHsgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgotCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsKLSAgICAgIHRoZW4KLQkjIGNjIHdvcmtzIHRvby4KLQk6Ci0gICAgICBlbHNlCi0JIyBjYyBleGlzdHMgYnV0IGRvZXNuJ3QgbGlrZSAtby4KLQlldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28gPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYW1fY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KLWlmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0JQ0NMRD0iXCQoQ0MpIgotZWxzZQotCUNDTEQ9IiRDQyIKLWZpCi10ZXN0ICJ4JEdDQyIgPSAieHllcyIgJiYgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OwotICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0gICAgKikKLSAgICAgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zdGF0aWM9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZmFzdF9pbnN0YWxsOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLSAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9idWlsZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKLWFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQotY2FzZSAkYWNfY3ZfYnVpbGQgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaG9zdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCi0gIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCi1lbHNlCi0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KLWNhc2UgJGFjX2N2X2hvc3QgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1OzsKLWVzYWMKLWhvc3Q9JGFjX2N2X2hvc3QKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9ob3N0Ci1zaGlmdAotaG9zdF9jcHU9JDEKLWhvc3RfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotaG9zdF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9TRUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KLSMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotbHRfYWNfbWF4PTAKLWx0X2FjX2NvdW50PTAKLSMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCi0jIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCi0gIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCi0gIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgotICBsdF9hY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgotICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgYnJlYWsKLSAgZmkKLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAotICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgotICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCi0gICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCi0gICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKLSAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCi0gICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgotICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGZpCi0gIGRvbmUKLWRvbmUKLQotZmkKLQotU0VEPSRsdF9jdl9wYXRoX1NFRAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTRUQiID4mNQotJGFzX2VjaG8gIiRTRUQiID4mNjsgfQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCi1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKLSAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KLSBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotIAotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9FR1JFUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAotZmkKLQotICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi0gCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gIiA+JjY7IH0KLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCA/OltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9Ci1maQotaWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCTs7Ci0gICAgICAqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkbHRfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1Ci0kYXNfZWNobyAiJExEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotdGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2xkX3JlbG9hZF9mbGFnKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQotJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9Ci1yZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKLWNhc2UgJHJlbG9hZF9mbGFnIGluCi0iIiB8ICIgIiopIDs7Ci0qKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKLWVzYWMKLXJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgZGFyd2luKikKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgIGVsc2UKLSAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBmaQotICAgIDs7Ci1lc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wYXRoX05NKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgbHRfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbiAKLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wYXRoX05NIiA+JjY7IH0KLU5NPSIkbHRfY3ZfcGF0aF9OTSIKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gIiA+JjY7IH0KLUxOX1M9JGFzX2xuX3MKLWlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1Ci0kYXNfZWNobyAibm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDQqIHwgYWl4NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpWzQ1XSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4KLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGZpCi0gIDs7Ci0KLWdudSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhwdXgxMC4yMCogfCBocHV4MTEqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCi0gICAgOzsKLSAgaHBwYSo2NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xcLmEpJCcKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkTEQgaW4KLSAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OwotICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1uZXRic2QqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW5ld29zNiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KLSAgOzsKLQotbnRvLXFueCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgOzsKLQotb3BlbmJzZCopCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc29sYXJpcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgcGMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotZXNhYwotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KLWZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi10ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLQotCi0KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOyAKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi1pYTY0LSotaHB1eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqRUxGLTMyKikKLSAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKLSAgICAgIDs7Ci0gICAgKkVMRi02NCopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotICAgICAgOzsKLSAgICBlc2FjCi0gICBlbHNlCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqMzItYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgotICAgICAgICAgIDs7Ci0gICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCi0gICAgICAgICAgOzsKLSAgICAgICAgczM5MHgtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmM2NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCi0gICAgICAgICAgOzsKLSAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgotICAgICAgICAgIDs7Ci0gICAgICAgIHMzOTAqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLSAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7Ci0gICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1ETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotICBhY19jdF9ETExUT09MPSRETExUT09MCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCi0gICAgRExMVE9PTD0iZmFsc2UiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAotICBmaQotZWxzZQotICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotZmkKLQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFTPSRhY19jdl9wcm9nX0FTCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVMiID4mNQotJGFzX2VjaG8gIiRBUyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi0gIGFjX2N0X0FTPSRBUwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVM9IiRhY19jdF9BUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUz0kYWNfY3ZfcHJvZ19hY19jdF9BUwotaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUyIgPSB4OyB0aGVuCi0gICAgQVM9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFTPSRhY19jdF9BUwotICBmaQotZWxzZQotICBBUz0iJGFjX2N2X3Byb2dfQVMiCi1maQotCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi0gIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAotaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KLSAgICBPQkpEVU1QPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCi0gIGZpCi1lbHNlCi0gIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCi1maQotCi0gIDs7Ci0gIAotZXNhYwotCi1uZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcHJvZ19DUFArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKLSAgICBkbwotICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaWZkZWYgX19TVERDX18KLUAlOkAgaW5jbHVkZSA8bGltaXRzLmg+Ci1AJTpAZWxzZQotQCU6QCBpbmNsdWRlIDxhc3NlcnQuaD4KLUAlOkBlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotICAKLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6Ci0gIAotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIAotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgOgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNlCi0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4gMjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi0KLWRvbmUKLQotCi1mb3IgYWNfaGVhZGVyIGluIGRsZmNuLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImRsZmNuLmgiICJhY19jdl9oZWFkZXJfZGxmY25faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0RMRkNOX0ggMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgotICAgIENYWD0kQ0NDCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DWFg9JGFjX2N2X3Byb2dfQ1hYCi1pZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1Ci0kYXNfZWNobyAiJENYWCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCi0gIGFjX2N0X0NYWD0kQ1hYCi0gIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKLWlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ1hYIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCi0gICAgQ1hYPSJnKysiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ1hYPSRhY19jdF9DWFgKLSAgZmkKLWZpCi0KLSAgZmkKLWZpCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2N4eF9jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgR1hYPXllcwotZWxzZQotICBHWFg9Ci1maQotYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KLWFjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY3h4X2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCi0gICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2N4eF9nPW5vCi0gICBDWFhGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2N4eF9nPXllcwotZWxzZQotICBDWFhGTEFHUz0iIgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKLQkgQ1hYRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2N4eF9nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCi0gIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgIENYWEZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDWFhGTEFHUz0KLSAgZmkKLWZpCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi1kZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KLWlmICR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNYWERFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZiAKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCi0gIGFtX19mYXN0ZGVwQ1hYX1RSVUU9Ci0gIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENYWF9UUlVFPScjJwotICBhbV9fZmFzdGRlcENYWF9GQUxTRT0KLWZpCi0KLQotCi0KLWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0gICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0gICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KLSAgaWYgJHthY19jdl9wcm9nX0NYWENQUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKLSAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1AJTpAaWZkZWYgX19TVERDX18KLUAlOkAgaW5jbHVkZSA8bGltaXRzLmg+Ci1AJTpAZWxzZQotQCU6QCBpbmNsdWRlIDxhc3NlcnQuaD4KLUAlOkBlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAKLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6Ci0gIGJyZWFrCi1maQotCi0gICAgZG9uZQotICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKLSAgCi1maQotICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWENQUCIgPiY1Ci0kYXNfZWNobyAiJENYWENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGlmZGVmIF9fU1REQ19fCi1AJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgotQCU6QGVsc2UKLUAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1AJTpAZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICAKLWVsc2UKLSAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1maQotCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi1maQotCi0KLWFjX2V4dD1mCi1hY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2ZvcnRyYW4gcGdmOTUgbGY5NSBmdG4gbmFnZm9yCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRGNzciOyB0aGVuCi0gIGFjX2N2X3Byb2dfRjc3PSIkRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfRjc3PSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1GNzc9JGFjX2N2X3Byb2dfRjc3Ci1pZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEY3NyIgPiY1Ci0kYXNfZWNobyAiJEY3NyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJEY3NyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRGNzciOyB0aGVuCi0gIGFjX2N0X0Y3Nz0kRjc3Ci0gIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2ZvcnRyYW4gcGdmOTUgbGY5NSBmdG4gbmFnZm9yCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0Y3NyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19jdF9GNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0Y3Nz0kYWNfY3ZfcHJvZ19hY19jdF9GNzcKLWlmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfRjc3IiA+JjUKLSRhc19lY2hvICIkYWNfY3RfRjc3IiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0Y3NyIgJiYgYnJlYWsKLWRvbmUKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0Y3NyIgPSB4OyB0aGVuCi0gICAgRjc3PSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRjc3PSRhY19jdF9GNzcKLSAgZmkKLWZpCi0KLQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEZvcnRyYW4gNzcgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1zZXQgWCAkYWNfY29tcGlsZQotYWNfY29tcGlsZXI9JDIKLWZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KLSAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBzZWQgJzEwYVwKLS4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KLSAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci1kb25lCi1ybSAtZiBhLm91dAotCi0jIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQotIyBpbnB1dCBmaWxlLiAgKE5vdGUgdGhhdCB0aGlzIG9ubHkgbmVlZHMgdG8gd29yayBmb3IgR05VIGNvbXBpbGVycy4pCi1hY19zYXZlX2V4dD0kYWNfZXh0Ci1hY19leHQ9RgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBGb3J0cmFuIDc3IGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Y3N19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0gICAgICBwcm9ncmFtIG1haW4KLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2Y3N19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1hY19leHQ9JGFjX3NhdmVfZXh0Ci1hY190ZXN0X0ZGTEFHUz0ke0ZGTEFHUytzZXR9Ci1hY19zYXZlX0ZGTEFHUz0kRkZMQUdTCi1GRkxBR1M9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfZjc3X2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBGRkxBR1M9LWcKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSAgICAgIHByb2dyYW0gbWFpbgotCi0gICAgICBlbmQKLV9BQ0VPRgotaWYgYWNfZm5fZjc3X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfZjc3X2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZjc3X2c9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19mNzdfZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2dfZjc3X2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfRkZMQUdTIiA9IHNldDsgdGhlbgotICBGRkxBR1M9JGFjX3NhdmVfRkZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfZjc3X2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KLSAgICBGRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIEZGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCi0gICAgRkZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBGRkxBR1M9Ci0gIGZpCi1maQotCi1pZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgRzc3PXllcwotZWxzZQotICBHNzc9Ci1maQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQotCi0jIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfc3lzX21heF9jbWRfbGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICBpPTAKLSAgdGVzdHN0cmluZz0iQUJDRCIKLQotICBjYXNlICRidWlsZF9vcyBpbgotICBtc2Rvc2RqZ3BwKikKLSAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCi0gICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgotICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAotICAgIDs7Ci0KLSAgZ251KikKLSAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKLSAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKLSAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgotICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCi0gICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQotICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KLSAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKLSAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgotICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQotICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcwotICAgIGZpCi0gICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgOzsKLQotICBpbnRlcml4KikKLSAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4Ci0gICAgOzsKLQotICBvc2YqKQotICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQotICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90Ci0gICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KLSAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKLSAgICAjCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KLSAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCi0gICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICBzY28zLjJ2NSopCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKLSAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbIAldLy8nYAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQotICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0Ci0gICAgIyB3ZSBjYW4ndCB0ZWxsLgotICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19Ci0gICAgd2hpbGUgKHRlc3QgIlgiYCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgotCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgotCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKLQkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCi0gICAgZG8KLSAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgZG9uZQotICAgIHRlc3RzdHJpbmc9Ci0gICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCi0gICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KLSAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAotICAgIDs7Ci0gIGVzYWMKLQotZmkKLQotaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIiA+JjUKLSRhc19lY2hvICJub25lIiA+JjY7IH0KLWZpCi0KLQotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJwotICBmaQotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICA7OwotbGludXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1vc2YqKQotICBzeW1jb2RlPSdbQkNERUdRUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbQkRSVF0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tEVF0nCi0gIDs7Ci1zeXN2NC4ydXcyKikKLSAgc3ltY29kZT0nW0RUXScKLSAgOzsKLXN5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gIHN5bWNvZGU9J1tBQkRUXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbREZOU1RVXScKLSAgOzsKLWVzYWMKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRidWlsZF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1jYXNlIGAkTk0gLVYgMj4mMWAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Ci1lc2FjCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLSAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZSRzeW1jb2RlKlwpWyAJXVsgCV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLQotICBybSAtZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3RcIiI7IH0gPiY1Ci0gIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfbGluaykgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmYWlsZWQiID4mNQotJGFzX2VjaG8gImZhaWxlZCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvayIgPiY1Ci0kYXNfZWNobyAib2siID4mNjsgfQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igb2JqZGlyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfb2JqZGlyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIGx0X2N2X29iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBsdF9jdl9vYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfb2JqZGlyIiA+JjUKLSRhc19lY2hvICIkbHRfY3Zfb2JqZGlyIiA+JjY7IH0KLW9iamRpcj0kbHRfY3Zfb2JqZGlyCi0KLQotCi0KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLQotIyBDb25zdGFudHM6Ci1ybT0icm0gLWYiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLQotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCi0jIHdoaWNoIG5lZWRzICcubGliJykuCi1saWJleHQ9YQotbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi13aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFSPSRhY19jdl9wcm9nX0FSCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQotJGFzX2VjaG8gIiRBUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCi0gIGFjX2N0X0FSPSRBUgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgotaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCi0gICAgQVI9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFSPSRhY19jdF9BUgotICBmaQotZWxzZQotICBBUj0iJGFjX2N2X3Byb2dfQVIiCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQotJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi1pZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0gICAgUkFOTElCPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0gIGZpCi1lbHNlCi0gIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKLSRhc19lY2hvICIkU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFNUUklQPSRhY19jdF9TVFJJUAotICBmaQotZWxzZQotICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1maQotCi0KLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLXRlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Ci10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi10ZXN0IC16ICIkQ0MiICYmIENDPWNjCi10ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKLXRlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotCSAgZmkgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKLSAgOzsKLWVzYWMKLWZpCi0KLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQotJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLWlmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1Ci0kYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBlbHNlCi0gICAgTUFHSUNfQ01EPToKLSAgZmkKLWZpCi0KLSAgZmkKLSAgOzsKLWVzYWMKLQotZW5hYmxlX2Rsb3Blbj1ubwotZW5hYmxlX3dpbjMyX2RsbD15ZXMKLQotQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7IAotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9waWM7IHBpY19tb2RlPSIkd2l0aHZhbCIKLWVsc2UKLSAgcGljX21vZGU9ZGVmYXVsdAotZmkKLQotdGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0Ci0KLSMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Ci10YWduYW1lPQotbHRfc2F2ZV9DQz0iJENDIgotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1jCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHQ9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO31cbicKLQotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMjIENBVkVBVCBFTVBUT1I6Ci0jIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotCi1sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLWVsc2UKLSAgICA6Ci1maQotCi1maQotCi1sdF9wcm9nX2NvbXBpbGVyX3dsPQotbHRfcHJvZ19jb21waWxlcl9waWM9Ci1sdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQotIAotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGVsc2UKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWM9JytaJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZwaWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICc7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgdW5pY29zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz1ubwotICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OwotICAgICBlc2FjCi1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9Ci0gICAgOzsKLSAgKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZz0KLSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubwotICBhcmNoaXZlX2NtZHM9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHM9Ci0gIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0gIGhhcmRjb2RlX2RpcmVjdD1ubwotICBoYXJkY29kZV9taW51c19MPW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlicz11bmtub3duCi0gIGhhcmRjb2RlX2F1dG9tYXRpYz1ubwotICBtb2R1bGVfY21kcz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzPQotICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltcz0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCi0gICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZWxzZQotCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWZpfgotCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OwotCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7Ci0JaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKLQkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCWxkX3NobGlicz1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKSAKLQlsZF9zaGxpYnM9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKLSoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotCTs7Ci0JKikKLQkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBsZF9zaGxpYnM9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQlmaQotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQotCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLSAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLSAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotICAJICAgIGJyZWFrCi0gIAkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBhcmNoaXZlX2NtZHM9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLSAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLSAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0gIAkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0gIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYwotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCi0gICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KLSAgICAgICAgICAgICAxMC5bMDEyXSkKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBtb2R1bGVfY21kcz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlicz1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlicz1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAgICMgZXh0cmEgc3BhY2UpLgotICAgIGZyZWVic2QyLjIqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBocHV4OSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotCi0JaGFyZGNvZGVfZGlyZWN0PXllcwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8KLQkgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQkgIDs7Ci0JKikKLQkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLQotCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQkgICA7OwotICAgICAgIGVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb3MyKikKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCWFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0gIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCSopCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLQkgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotCWxkX3NobGlicz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlicyIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlicyIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWMKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICAgICAgICB0aGVuCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi1zdHJpcGxpYj0KLW9sZF9zdHJpcGxpYj0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAiID4mNjsgfQotaWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAotICBjYXNlICRob3N0X29zIGluCi0gICBkYXJ3aW4qKQotICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCi0gICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgotICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgICAgICBlbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLSAgICAgICA7OwotICAgKikKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLSAgbHRfY3ZfZGxvcGVuPW5vCi0gIGx0X2N2X2Rsb3Blbl9saWJzPQotCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYmVvcyopCi0gICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgICA7OwotCi0gIG1pbmd3KiB8IHB3MzIqKQotICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICA7OwotCi0gIGN5Z3dpbiopCi0gICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICA7OwotCi0gIGRhcndpbiopCi0gICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKLWVsc2UKLSAgCi0gICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIAotZmkKLQotICAgOzsKLQotICAqKQotICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNobF9sb2FkIiAiYWNfY3ZfZnVuY19zaGxfbG9hZCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2hsX2xvYWQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzaGxfbG9hZCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcwotZWxzZQotICBhY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCi1lbHNlCi0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzdmxkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxkX2xpbmsgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbGRfbGluayAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcwotZWxzZQotICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCi1maQotCi0JICAgICAgCi1maQotCi0JICAgIAotZmkKLQotCSAgCi1maQotCi0JCi1maQotCi0gICAgICAKLWZpCi0KLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0KLSAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQotICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX0KLUVPRgotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X2RsdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLSAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX0KLUVPRgotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKLSAgICBsdF9zdGF0dXM9JD8KLSAgICBjYXNlIHgkbHRfc3RhdHVzIGluCi0gICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKLSAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0gICAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9Ci0gICAgZmkKLQotICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKLSAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgIExJQlM9IiRzYXZlX0xJQlMiCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0KLSMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCi0gICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgZmkKLSAgICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAiID4mNjsgfQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGVuYWJsZV9zdGF0aWMiID4mNjsgfQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXIgXAotICAgIENDIFwKLSAgICBMRCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIFwKLSAgICBwcmVkZXBfb2JqZWN0cyBcCi0gICAgcG9zdGRlcF9vYmplY3RzIFwKLSAgICBwcmVkZXBzIFwKLSAgICBwb3N0ZGVwcyBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKLSAgICBhcmNoaXZlX2NtZHMgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgXAotICAgIHBvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnIFwKLSAgICBub191bmRlZmluZWRfZmxhZyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljIFwKLSAgICBtb2R1bGVfY21kcyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCi0gICAgZXhjbHVkZV9leHBzeW1zIFwKLSAgICBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gICAgYXJjaGl2ZV9jbWRzIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgbW9kdWxlX2NtZHMgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIke29maWxlfVQiCi0gIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gICRybSAtZiAiJGNmZ2ZpbGUiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJG9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRvZmlsZSIgPiY2O30KLQotICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKLSMhICRTSEVMTAotCi0jIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6Ci0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KLVNFRD0kbHRfU0VECi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSIkU0VEIC1lIDFzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLSMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotYXZhaWxhYmxlX3RhZ3M9Ci0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0MKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTEQKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpYwotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX28KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwcwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZAotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcwotCi0jICMjIyBFTkQgTElCVE9PTCBDT05GSUcKLQotX19FT0ZfXwotCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQotCi0gIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwgXAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0KLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKLSAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KLSAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi0gIGZpCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotQ0M9IiRsdF9zYXZlX0NDIgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdGFncytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGFnczsgdGFnbmFtZXM9IiR3aXRodmFsIgotZmkKLQotCi1pZiB0ZXN0IC1mICIkbHRtYWluIiAmJiB0ZXN0IC1uICIkdGFnbmFtZXMiOyB0aGVuCi0gIGlmIHRlc3QgISAtZiAiJHtvZmlsZX0iOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjI7fQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKLSAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiYyO30KLSAgICBlbHNlCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mMjt9Ci0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAteiAiJExUQ0ZMQUdTIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDRkxBR1M9J2AiCi0gIGZpCi0KLSAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCi0gICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCi0gIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXTo6ZydgIGluCi0gICAgIiIpIDs7Ci0gICAgKikgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgIiRMSU5FTk8iIDUKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gInRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgIiRMSU5FTk8iIDUKLSAgICBmaQotCi0gICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCi0KLSAgICAgIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAgIENYWCkKLQlpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotCSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKLQkgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0JICBhY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotCi0KLQotCi1hcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KLWFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KLWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPQotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0KLWhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KLWhhcmRjb2RlX21pbnVzX0xfQ1hYPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAotaGFyZGNvZGVfYXV0b21hdGljX0NYWD1ubwotbW9kdWxlX2NtZHNfQ1hYPQotbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0KLWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXVua25vd24KLW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSRvbGRfYXJjaGl2ZV9jbWRzCi1ub191bmRlZmluZWRfZmxhZ19DWFg9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9Ci1lbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD1ubwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgotcHJlZGVwX29iamVjdHNfQ1hYPQotcG9zdGRlcF9vYmplY3RzX0NYWD0KLXByZWRlcHNfQ1hYPQotcG9zdGRlcHNfQ1hYPQotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9Y3BwCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9DWFg9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9XG4nCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0kQ0MKLWx0X3NhdmVfTEQ9JExECi1sdF9zYXZlX0dDQz0kR0NDCi1HQ0M9JEdYWAotbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKLWx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAotaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgotICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCi1maQotaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCi0gIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKLWZpCi10ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAotQ0M9JHtDWFgtImMrKyJ9Ci1jb21waWxlcj0kQ0MKLWNvbXBpbGVyX0NYWD0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLQotIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKLSMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKLWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0nIC1mbm8tYnVpbHRpbicKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQotZmkKLQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KLQotICAKLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQotZmkKLWlmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQotJGFzX2VjaG8gIiRMRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXRlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhYwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi0KLSAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCi0gICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KLSAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKLQlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGVsc2UKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KLSAgICBmaQotICBlbHNlCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICB3bGFyYz0KLQotICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCi0gICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKLSAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAotICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgotICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICBmaQotCi0gICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi1lbHNlCi0gIEdYWD1ubwotICB3aXRoX2dudV9sZD1ubwotICB3bGFyYz0KLWZpCi0KLSMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotbGRfc2hsaWJzX0NYWD15ZXMKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0JICBjYXNlICRsZF9mbGFnIGluCi0JICAqLWJydGwqKQotCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotCSAgICBicmVhawotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgIGZpCi0KLSAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJwotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCi0gICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0KLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLSAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLQkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotCWVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKLQkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0JICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLQkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcwotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0Jc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0Jc2hhcmVkX2ZsYWc9Jy1HJwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JZWxzZQotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPXllcwotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKLSAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgZWxzZQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSIteiBub2RlZnMiCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0gICAgICBlbHNlCi0JIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1iZXJub3RvaycKLQlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1iZXJvaycKLQkjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyRjb252ZW5pZW5jZScKLQlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0JIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKLSAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLSAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGNob3J1cyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCi0KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQljcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICBlbHNlCi0JZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGZpfgotICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICBmaQotICA7OwotICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIDs7Ci0gICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCi0gICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KLSAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KLSAgICAgICAgICAgICAxMC5bMDEyXSkKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgZXNhYwotICAgICAgICAgZmkKLSAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCi0gICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICBpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgJEVHUkVQICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIGVsc2UKLSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgICBmaQotICAgICAgICBtb2R1bGVfY21kc19DWFg9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBmaQotICAgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgIG1vZHVsZV9jbWRzX0NYWD0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBmaQotICAgICAgICA7OwotCi0gIGRndXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBlYysrKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGdoY3gqKQotCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBmcmVlYnNkWzEyXSopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZSBzd2l0Y2ggdG8gRUxGCi0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIGZyZWVic2QtZWxmKikKLSAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICA7OwotICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCi0gICAgIyBjb252ZW50aW9ucwotICAgIGxkX3NobGlic19DWFg9eWVzCi0gICAgOzsKLSAgZ251KikKLSAgICA7OwotICBocHV4OSopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCSMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgIENDKikKLSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgICAgOzsKLSAgICBhQ0MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0gICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgIwotICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLSAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLSAgICAgICMgZGVwZW5kZW5jaWVzLgotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlstXUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0gICAgICA7OwotICAgICopCi0gICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICBocHV4MTAqfGhwdXgxMSopCi0gICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9JytiICRsaWJkaXInCi0gICAgICAgIDs7Ci0gICAgICAqKQotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGhwcGEqNjQqfGlhNjQqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCQkgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCQkgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgYUNDKikKLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBocHBhKjY0KikKLQkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgaWE2NCopCi0JICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgICopCi0JICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIGxkX3NobGlic19DWFg9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGludGVyaXgzKikKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJwotICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLSAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLSAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICA7OwotICBpcml4NSogfCBpcml4NiopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIFNHSSBDKysKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKLQkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKLQkjIGluIHRoZSBhcmNoaXZlLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKLQkgIGZpCi0JZmkKLQlsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLQk7OwotICAgIGVzYWMKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLSAgICA7OwotICBsaW51eCopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIGljcGMqKQotCSMgSW50ZWwgQysrCi0Jd2l0aF9nbnVfbGQ9eWVzCi0JIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKLQkjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAotCSMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCi0JY2FzZSBgJENDIC1WIDI+JjFgIGluCi0JKiJWZXJzaW9uIDcuIiopCi0gIAkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICA7OwotCSopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCi0JICB0bXBfaWR5bj0KLQkgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKLQkgIGVzYWMKLSAgCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCTs7Ci0gICAgICBwZ0NDKikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKLSAgCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgICA7OwotICAgICAgY3h4KikKLQkjIENvbXBhcSBDKysKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJwotCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBseW54b3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBtODhrKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgbXZzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgY3h4KikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBmaQotICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKLSAgICA7OwotICBvcGVuYnNkMiopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBvcGVuYnNkKikKLSAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZmkKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICA7OwotICBvc2YzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0KLQk7OwotICAgICAgUkNDKikKLQkjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgY3h4KikKLQlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKLQotCWVsc2UKLQkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgbGRfc2hsaWJzX0NYWD1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgb3NmNCogfCBvc2Y1KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBjeHgqKQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgotCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+Ci0JICAkcm0gJGxpYi5leHAnCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIGxkX3NobGlic19DWFg9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHBzb3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBzdW5vczQqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTdW4gQysrIDQueAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgbGNjKikKLQkjIEx1Y2lkCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzb2xhcmlzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLSAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotCW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nIC16ZGVmcycKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLVIkbGliZGlyJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0JY2FzZSAkaG9zdF9vcyBpbgotCSAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotCSAgKikKLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIGlzIHVzZWQgYXMgbGlua2VyIHNvIHdlIG11c3QgdXNlICR3bAotCSAgICAjIGZsYWcgdG8gcGFzcyB0aGUgY29tbWFuZHMgdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtCi0JICAgICMgbGlua2VyLiBXZSBtdXN0IGFsc28gcGFzcyBlYWNoIGNvbnZpZW5jZSBsaWJyYXJ5IHRocm91Z2gKLQkgICAgIyB0byB0aGUgc3lzdGVtIGxpbmtlciBiZXR3ZWVuIGFsbGV4dHJhY3QvZGVmYXVsdGV4dHJhY3QuCi0JICAgICMgVGhlIEMrKyBjb21waWxlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLQkgICAgIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0JICAgICMgd2l0aG91dCAkd2wuCi0JICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0JICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCSAgICA7OwotCWVzYWMKLQlsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKLQotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgZ2N4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQotCSMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQkjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0teiAke3dsfWRlZnMnCi0JICBpZiAkQ0MgLS12ZXJzaW9uIHwgZ3JlcCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBlbHNlCi0JICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKLQkgICAgIyBwbGF0Zm9ybS4KLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKLQkgIGZpCi0KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICR3bCRsaWJkaXInCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JwotICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0gICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotICAgICMgYXMgLXogZGVmcy4KLSAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0gICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKLSAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbwotICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0gICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQotICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgotICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KLSAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCi0gICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLSAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosbm9kZWZzJwotICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JwotICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUJleHBvcnQnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICAgICopCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICB0YW5kZW0qKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBOQ0MqKQotCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdnh3b3JrcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gICopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KLXRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotR0NDX0NYWD0iJEdYWCIKLUxEX0NYWD0iJExEIgotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotY2xhc3MgRm9vCi17Ci1wdWJsaWM6Ci0gIEZvbyAodm9pZCkgeyBhID0gMDsgfQotcHJpdmF0ZToKLSAgaW50IGE7Ci19OwotRU9GCi0KLWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KLSAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLSAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi0KLSAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQotICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KLSAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubwotCi0gICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgotICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCi0gICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKLQotICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbwotICAgIGNhc2UgJHAgaW4KLQotICAgIC1MKiB8IC1SKiB8IC1sKikKLSAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgotICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KLSAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCi0JICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgotCSBwcmV2PSRwCi0JIGNvbnRpbnVlCi0gICAgICAgZWxzZQotCSBwcmV2PQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBjYXNlICRwIGluCi0JIC1MKiB8IC1SKikKLQkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKLQkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKLQkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KLQkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KLQkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgotCSAgIGVsc2UKLQkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCi0JICAgZmkKLQkgICA7OwotCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZwotCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KLQkgZXNhYwotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KLQkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgotCSBlbHNlCi0JICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKi4kb2JqZXh0KQotICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAotICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgotICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgotCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcwotCSBjb250aW51ZQotICAgICAgIGZpCi0KLSAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgotCSBpZiB0ZXN0IC16ICIkcHJlZGVwX29iamVjdHNfQ1hYIjsgdGhlbgotCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHAiCi0JIGVsc2UKLQkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwcmVkZXBfb2JqZWN0c19DWFggJHAiCi0JIGZpCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkcG9zdGRlcF9vYmplY3RzX0NYWCI7IHRoZW4KLQkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcCIKLQkgZWxzZQotCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwb3N0ZGVwX29iamVjdHNfQ1hYICRwIgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgotCi0gICAgZXNhYwotICBkb25lCi0KLSAgIyBDbGVhbiB1cC4KLSAgcm0gLWYgYS5vdXQgYS5leGUKLWVsc2UKLSAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nIENYWCB0ZXN0IHByb2dyYW0iCi1maQotCi0kcm0gLWYgY29uZmVzdC4kb2JqZXh0Ci0KLSMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCi1jYXNlICRob3N0X29zIGluCi1pbnRlcml4MyopCi0gICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KLSAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KLSAgcHJlZGVwX29iamVjdHNfQ1hYPQotICBwb3N0ZGVwX29iamVjdHNfQ1hYPQotICBwb3N0ZGVwc19DWFg9Ci0gIDs7Ci0KLXNvbGFyaXMqKQotICBjYXNlICRjY19iYXNlbmFtZSBpbgotICBDQyopCi0gICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKLSAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCi0gICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KLSAgICBwb3N0ZGVwc19DWFg9Jy1sQ3N0ZCAtbENydW4nCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotCi0KLWNhc2UgIiAkcG9zdGRlcHNfQ1hYICIgaW4KLSoiIC1sYyAiKikgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vIDs7Ci1lc2FjCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPQotbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0gCi0gICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLSAgICBtaW5ndyogfCBvczIqIHwgcHczMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLSAgICAqZGpncHAqKQotICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci0gICAgICA7OwotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQqIHwgYWl4NSopCi0JIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQllbHNlCi0JICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLQlmaQotCTs7Ci0gICAgICBjaG9ydXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JY3hjaDY4KikKLQkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAgZGFyd2luKikKLSAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgIHhsYyopCi0gICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFub2NvbW1vbicKLSAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0gICAgICAgICAgIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgOzsKLSAgICAgIGRndXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBlYysrKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgOzsKLQkgIGdoY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLQkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCi0JOzsKLSAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJwotCSAgICBmaQotCSAgICA7OwotCSAgYUNDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqfGlhNjQqKQotCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGludGVyaXgqKQotCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQotCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KLQk7OwotICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKLQkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBsaW51eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgICMgS0FJIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCi0JICAgIDs7Ci0JICBpY3BjKiB8IGVjcGMqKQotCSAgICAjIEludGVsIEMrKwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJwotCSAgICA7OwotCSAgcGdDQyopCi0JICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZnBpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgQ29tcGFxIEMrKwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGx5bnhvcyopCi0JOzsKLSAgICAgIG04OGsqKQotCTs7Ci0gICAgICBtdnMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBjeHgqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1XIGMsZXhwb3J0YWxsJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIG5ldGJzZCopCi0JOzsKLSAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgS0NDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJwotCSAgICA7OwotCSAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgY3h4KikKLQkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKLQkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgcHNvcyopCi0JOzsKLSAgICAgIHNvbGFyaXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKLQkgICAgOzsKLQkgIGdjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVBJQycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzdW5vczQqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LngKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJwotCSAgICA7OwotCSAgbGNjKikKLQkgICAgIyBMdWNpZAotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdGFuZGVtKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgTkNDKikKLQkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHZ4d29ya3MqKQotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggLURQSUMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFhcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDQqIHwgYWl4NSopCi0gICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0gICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGVsc2UKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICAgZmkKLSAgICA7OwotICBwdzMyKikKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0iJGx0ZGxsX2NtZHMiCi0gIDs7Ci0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS87L14uKiBfX25tX18vcy9eLiogX19ubV9fXChbXiBdKlwpIFteIF0qL1wxIERBVEEvOy9eSSAvZDsvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgKikKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICBlc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0NYWCBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFgKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWAotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gICAgICAgIHRoZW4KLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uX0NYWD0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0NYWCIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBDWFgpIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9DWFgiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb25fQ1hYPXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjUKLSRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfQ1hYIFwKLSAgICBDQ19DWFggXAotICAgIExEX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFggXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFggXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19DWFggXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFggXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCBcCi0gICAgcHJlZGVwX29iamVjdHNfQ1hYIFwKLSAgICBwb3N0ZGVwX29iamVjdHNfQ1hYIFwKLSAgICBwcmVkZXBzX0NYWCBcCi0gICAgcG9zdGRlcHNfQ1hYIFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIFwKLSAgICBhcmNoaXZlX2NtZHNfQ1hYIFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCBcCi0gICAgcG9zdGluc3RhbGxfY21kc19DWFggXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19DWFggXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKLSAgICBub191bmRlZmluZWRfZmxhZ19DWFggXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFggXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYIFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIFwKLSAgICBtb2R1bGVfY21kc19DWFggXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFggXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCBcCi0gICAgZXhjbHVkZV9leHBzeW1zX0NYWCBcCi0gICAgaW5jbHVkZV9leHBzeW1zX0NYWDsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIHwgXAotICAgIGFyY2hpdmVfY21kc19DWFggfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggfCBcCi0gICAgbW9kdWxlX2NtZHNfQ1hYIHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFggfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX0NYWAotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX0NYWAotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9DWFgKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFgKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19DWFgKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0NYWAotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWAotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0NYWAotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19DWFgKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0NYWAotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfQ1hYCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0NYWAotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19DWFgKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfQ1hYCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19DWFgKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0NYWAotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fQ1hYCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFgKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19DWFgKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfQ1hYCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfQ1hYIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFgKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19DWFgKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0NYWAotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0NYWAotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0kbHRfc2F2ZV9DQwotTERDWFg9JExECi1MRD0kbHRfc2F2ZV9MRAotR0NDPSRsdF9zYXZlX0dDQwotd2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCi13aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAotbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECi1sdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKLWx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi0KLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBGNzcpCi0JaWYgdGVzdCAtbiAiJEY3NyIgJiYgdGVzdCAiWCRGNzciICE9ICJYbm8iOyB0aGVuCi0JICAKLWFjX2V4dD1mCi1hY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251Ci0KLQotYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi1hbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci1hbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PW5vCi1hcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9Ci1oYXJkY29kZV9kaXJlY3RfRjc3PW5vCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci1oYXJkY29kZV9taW51c19MX0Y3Nz1ubwotaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz1ubwotbW9kdWxlX2NtZHNfRjc3PQotbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KLWxpbmtfYWxsX2RlcGxpYnNfRjc3PXVua25vd24KLW9sZF9hcmNoaXZlX2NtZHNfRjc3PSRvbGRfYXJjaGl2ZV9jbWRzCi1ub191bmRlZmluZWRfZmxhZ19GNzc9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci1lbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KLWFjX2V4dD1mCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9GNzc9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSIgICAgICBzdWJyb3V0aW5lIHRcbiAgICAgIHJldHVyblxuICAgICAgZW5kXG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiAgICAgIHByb2dyYW0gdFxuICAgICAgZW5kXG4iCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtGNzctImY3NyJ9Ci1jb21waWxlcj0kQ0MKLWNvbXBpbGVyX0Y3Nz0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9Ci0KLUdDQ19GNzc9IiRHNzciCi1MRF9GNzc9IiRMRCIKLQotbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Ci1sdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Ci1sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KLSAKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotCi0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLSAgICAgIGRhcndpbiopCi0gICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICB4bGMqKQotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZnBpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY2OyB9Ci0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLWlmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciOyB0aGVuCi0gIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzc9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KLSAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA7OwotICAgICBlc2FjCi1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQotICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCi1maQotCi1maQotY2FzZSAkaG9zdF9vcyBpbgotICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKLSAgKmRqZ3BwKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Ci0gICAgOzsKLSAgKikKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCi0gICAgOzsKLWVzYWMKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3N1wiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0gICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPSB4eWVzOyB0aGVuCi0gICAgOgotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3PW5vCi0gICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLSAgIG1rZGlyIGNvbmZ0ZXN0Ci0gICBjZCBjb25mdGVzdAotICAgbWtkaXIgb3V0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNjsgfQotCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci0gIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCi0gIGFyY2hpdmVfY21kc19GNzc9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQotICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0KLSAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3PQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci0gIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzc9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KLSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci0gIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KLSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgotICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCi0gIG1vZHVsZV9jbWRzX0Y3Nz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KLSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltc19GNzc9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgZXhjbHVkZV9leHBzeW1zX0Y3Nz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0gICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0gICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KLSAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgbGRfc2hsaWJzX0Y3Nz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCWxkX3NobGlic19GNzc9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLQotICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKLSAgICAgICMgdGhlbS4KLSAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19GNzc9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQl0bXBfYWRkZmxhZz0KLQljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KLQlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLQlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKLQl3bGFyYz0KLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlsZF9zaGxpYnNfRjc3PW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopIAotCWxkX3NobGlic19GNzc9bm8KLQljYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKLSoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotCTs7Ci0JKikKLQkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJwotCSAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBsZF9zaGxpYnNfRjc3PW5vCi0JICBmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAiJGxkX3NobGlic19GNzciID0gbm87IHRoZW4KLSAgICAgIHJ1bnBhdGhfdmFyPQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Ci0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PXllcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgotCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotCSMgYnJva2VuIGNvbGxlY3QyLgotCWhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYWl4NCogfCBhaXg1KikKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAotCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9IiIKLSAgICAgIGVsc2UKLQkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KLQkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCi0JaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQlmaQotCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLQotCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLSAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLSAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotICAJICAgIGJyZWFrCi0gIAkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PScnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9JzonCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQotCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCSAgdGhlbgotICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQkgIGVsc2UKLSAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3RfRjc3PXVuc3VwcG9ydGVkCi0gIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLSAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLSAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0gIAkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0gIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSctYmVyb2snCi0gICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0iLXogbm9kZWZzIgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aF9GNzc9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotCi0JaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQloYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotCSAgOzsKLQkqKQotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzX0Y3Nz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnNfRjc3PXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LG5vZGVmcycKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfRjc3IiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0Y3NyIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHNfRjc3IGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NwotCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3Ci0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KLSAgICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCi0gICAgICAgIGVsc2UKLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjUKLSRhc19lY2hvICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb25fRjc3PQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXJfRjc3IiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19GNzciID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9GNzciICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEY3NykiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0Y3NyIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbl9GNzc9dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9GNzciID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjY7IH0KLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9GNzciID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9GNzcgXAotICAgIENDX0Y3NyBcCi0gICAgTERfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0Y3NyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NyBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3IFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3NyBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IFwKLSAgICBwcmVkZXBfb2JqZWN0c19GNzcgXAotICAgIHBvc3RkZXBfb2JqZWN0c19GNzcgXAotICAgIHByZWRlcHNfRjc3IFwKLSAgICBwb3N0ZGVwc19GNzcgXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcgXAotICAgIGFyY2hpdmVfY21kc19GNzcgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX0Y3NyBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX0Y3NyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzcgXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3NyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzcgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcgXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19GNzcgXAotICAgIG1vZHVsZV9jbWRzX0Y3NyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NyBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IFwKLSAgICBleGNsdWRlX2V4cHN5bXNfRjc3IFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfRjc3OyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19GNzcgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcgfCBcCi0gICAgYXJjaGl2ZV9jbWRzX0Y3NyB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NyB8IFwKLSAgICBtb2R1bGVfY21kc19GNzcgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NyB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzcgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzcgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzcKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfRjc3Ci0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfRjc3Ci0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX0Y3NwotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfRjc3Ci0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfRjc3Ci1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3Ci0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfRjc3Ci1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfRjc3Ci1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19GNzcKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfRjc3Ci0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0Y3NwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19GNzcKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0Y3NwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfRjc3Ci0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9GNzcKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NwotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9GNzcKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3NwotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0Y3NwotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19GNzcKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9GNzciCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3NwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0Y3NwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfRjc3Ci0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfRjc3Ci0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIEdDSikKLQlpZiB0ZXN0IC1uICIkR0NKIiAmJiB0ZXN0ICJYJEdDSiIgIT0gIlhubyI7IHRoZW4KLQkgIAotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9amF2YQotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0X0dDSj0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7fTsgfVxuJwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7R0NKLSJnY2oifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9HQ0o9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KLWFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotCi1vbGRfYXJjaGl2ZV9jbWRzX0dDSj0kb2xkX2FyY2hpdmVfY21kcwotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLQotbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotZWxzZQotICAgIDoKLWZpCi0KLWZpCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPQotbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0gCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLQotICAgIG1zZG9zZGpncHAqKQotICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLXFub2NvbW1vbicKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgICAgOzsKLSAgICAgICBlc2FjCi0gICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZwaWMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctUW9wdGlvbiBsZCAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1QSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtjb25mb3JtX3BpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1waWMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNjsgfQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIjsgdGhlbgotICAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0pcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0orOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSj1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9eWVzCi0gICAgIGZpCi0gICBmaQotICAgY2htb2QgdSt3IC4gMj4mNQotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1Ci0kYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLQotICBydW5wYXRoX3Zhcj0KLSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPQotICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj1ubwotICBhcmNoaXZlX2NtZHNfR0NKPQotICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0KLSAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSj0KLSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KLSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfR0NKPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KLSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQotICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gIGhhcmRjb2RlX21pbnVzX0xfR0NKPW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCi0gIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXVua25vd24KLSAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj1ubwotICBtb2R1bGVfY21kc19HQ0o9Ci0gIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9Ci0gIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotICBpbmNsdWRlX2V4cHN5bXNfR0NKPQotICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0gICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi0gIGV4Y2x1ZGVfZXhwc3ltc19HQ0o9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlic19HQ0o9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KLSAgICBmaQotICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubwotICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KLSAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKLSAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCi0gICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCi0gICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucwotICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCi0gICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQlsZF9zaGxpYnNfR0NKPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLQkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBHQ0opIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcwotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLQkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0JIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQllbHNlCi0JICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZml+Ci0JJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKLQkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKLQllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQllc2FjCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCWZpCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0JbGRfc2hsaWJzX0dDSj1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKSAKLQlsZF9zaGxpYnNfR0NKPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKLQkgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgbGRfc2hsaWJzX0dDSj1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQloYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeDQqIHwgYWl4NSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQotCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0gIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0gIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLSAgCSAgICBicmVhawotICAJICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLSAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLSAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAotICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0gIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0gIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotICAJICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLQllbHNlCi0JICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JICBlbHNlCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfR0NKPXllcwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAKLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSIteiBub2RlZnMiCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLQllbHNlCi0JICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzX0dDSj0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aF9HQ0o9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlic19HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotCi0JaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQloYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotCSAgOzsKLQkqKQotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzX0dDSj0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnNfR0NKPXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LG5vZGVmcycKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0dDSiIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHNfR0NKIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgotCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KLSAgICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICAgIGVsc2UKLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjUKLSRhc19lY2hvICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb25fR0NKPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXJfR0NKIiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9HQ0oiICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEdDSikiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0dDSiIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbl9HQ0o9dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjY7IH0KLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9HQ0ogXAotICAgIENDX0dDSiBcCi0gICAgTERfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0ogXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSiBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSiBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIFwKLSAgICBwcmVkZXBfb2JqZWN0c19HQ0ogXAotICAgIHBvc3RkZXBfb2JqZWN0c19HQ0ogXAotICAgIHByZWRlcHNfR0NKIFwKLSAgICBwb3N0ZGVwc19HQ0ogXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0ogXAotICAgIGFyY2hpdmVfY21kc19HQ0ogXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0ogXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSiBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0ogXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0ogXAotICAgIG1vZHVsZV9jbWRzX0dDSiBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIFwKLSAgICBleGNsdWRlX2V4cHN5bXNfR0NKIFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfR0NKOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0ogfCBcCi0gICAgYXJjaGl2ZV9jbWRzX0dDSiB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBtb2R1bGVfY21kc19HQ0ogfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0ogfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSgotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0oKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfR0NKCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfR0NKCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfR0NKCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSgotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSgotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfR0NKCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0oKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfR0NKCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0dDSgotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfR0NKCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19HQ0oKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfR0NKCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0dDSgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19HQ0oKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0dDSgotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0oKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9HQ0oKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSgotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfR0NKCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSgotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0dDSgotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19HQ0oKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9HQ0oiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIFJDKQotCQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PXJjCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0X1JDPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfVxuJwotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7UkMtIndpbmRyZXMifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9SQz0kQ0MKLWZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLWx0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDPXllcwotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfUkMgXAotICAgIENDX1JDIFwKLSAgICBMRF9SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfUkMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQyBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIFwKLSAgICBwcmVkZXBfb2JqZWN0c19SQyBcCi0gICAgcG9zdGRlcF9vYmplY3RzX1JDIFwKLSAgICBwcmVkZXBzX1JDIFwKLSAgICBwb3N0ZGVwc19SQyBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDIFwKLSAgICBhcmNoaXZlX2NtZHNfUkMgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgXAotICAgIHBvc3RpbnN0YWxsX2NtZHNfUkMgXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19SQyBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX1JDIFwKLSAgICBub191bmRlZmluZWRfZmxhZ19SQyBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQyBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljX1JDIFwKLSAgICBtb2R1bGVfY21kc19SQyBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQyBcCi0gICAgZXhjbHVkZV9leHBzeW1zX1JDIFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfUkM7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgfCBcCi0gICAgYXJjaGl2ZV9jbWRzX1JDIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgfCBcCi0gICAgbW9kdWxlX2NtZHNfUkMgfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX1JDCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX1JDCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfUkMKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTERfUkMKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX1JDCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19SQwotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX1JDCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19SQwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19SQwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19SQwotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfUkMKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX1JDCi0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzX1JDCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19SQwotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX1JDCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9SQwotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfUkMKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X1JDCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX1JDCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX1JDCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfUkMKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfUkMKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9SQyIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfUkMKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19SQwotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfUkMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19SQwotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQk7OwotCi0gICAgICAqKQotCWFzX2ZuX2Vycm9yICQ/ICJVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWUiICIkTElORU5PIiA1Ci0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KLSAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCi0gICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KLSAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgotICAgIGNobW9kICt4ICIkb2ZpbGUiCi0gIGVsc2UKLSAgICBybSAtZiAiJHtvZmlsZX1UIgotICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy4iICIkTElORU5PIiA1Ci0gIGZpCi1maQotCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgotCi0KLQotCi0KLQotCi0KLQotCi0KLSAgCi0KLSAgCi0KLQotICAKLSAgICAgICAKLSAgICAgICAKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0FSKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkQVIgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWFzX2R1bW15PSIkUEFUSDovdXNyL2Njcy9iaW4iCi1mb3IgYXNfZGlyIGluICRhc19kdW1teQotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9BUj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9BUiIgJiYgYWNfY3ZfcGF0aF9BUj0iL3Vzci9iaW4vYXIiCi0gIDs7Ci1lc2FjCi1maQotQVI9JGFjX2N2X3BhdGhfQVIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1Ci0kYXNfZWNobyAiJEFSIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLQotIyBPcHRpb25zCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC10aWdodHZuYy1maWxldHJhbnNmZXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyOyAKLWVsc2UKLSAgIHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyPXllcyAKLWZpCi0KLSMgQUNfREVGSU5FIG1vdmVkIHRvIGFmdGVyIGxpYnB0aHJlYWQgY2hlY2suCi0KLSMgV2ViU29ja2V0cyBzdXBwb3J0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX2I2NF9udG9wIGluIC1scmVzb2x2IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBfX2I2NF9udG9wIGluIC1scmVzb2x2Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9yZXNvbHZfX19iNjRfbnRvcCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scmVzb2x2ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBfX2I2NF9udG9wICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gX19iNjRfbnRvcCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3A9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9yZXNvbHZfX19iNjRfbnRvcD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3AiID0geHllczsgdGhlbiA6Ci0gIEhBVkVfQjY0PSJ0cnVlIgotZWxzZQotICBIQVZFX0I2ND0iZmFsc2UiCi1maQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC13ZWJzb2NrZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF93ZWJzb2NrZXRzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF93ZWJzb2NrZXRzOyAKLWVsc2UKLSAgIHdpdGhfd2Vic29ja2V0cz15ZXMgCi1maQotCi0jIEFDX0RFRklORSBtb3ZlZCB0byBhZnRlciBsaWJyZXNvbHZlIGNoZWNrLgotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC0yNGJwcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfMjRicHArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoXzI0YnBwOyAKLWVsc2UKLSAgIHdpdGhfMjRicHA9eWVzIAotZmkKLQotaWYgdGVzdCAieCR3aXRoXzI0YnBwIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIEFMTE9XMjRCUFAgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mZm1wZWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2ZmbXBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZmZtcGVnOyAKLWZpCi0KLQotIGlmIHRlc3QgISAteiAiJHdpdGhfZmZtcGVnIjsgdGhlbgotICBXSVRIX0ZGTVBFR19UUlVFPQotICBXSVRIX0ZGTVBFR19GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9GRk1QRUdfVFJVRT0nIycKLSAgV0lUSF9GRk1QRUdfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICEgLXogIiR3aXRoX2ZmbXBlZyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsYW1lX2luaXQgaW4gLWxtcDNsYW1lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsYW1lX2luaXQgaW4gLWxtcDNsYW1lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sbXAzbGFtZSAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgbGFtZV9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gbGFtZV9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9tcDNsYW1lX2xhbWVfaW5pdCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9NUDNMQU1FPSJ0cnVlIgotZWxzZQotICBIQVZFX01QM0xBTUU9ImZhbHNlIiAKLWZpCi0KLWZpCi0gaWYgdGVzdCAiJEhBVkVfTVAzTEFNRSIgPSAidHJ1ZSI7IHRoZW4KLSAgSEFWRV9NUDNMQU1FX1RSVUU9Ci0gIEhBVkVfTVAzTEFNRV9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9NUDNMQU1FX1RSVUU9JyMnCi0gIEhBVkVfTVAzTEFNRV9GQUxTRT0KLWZpCi0KLQotIyBTZWVtIHRvIG5lZWQgdGhpcyBkdW1teSBoZXJlIHRvIGluZHVjZSB0aGUgJ2NoZWNraW5nIGZvciBlZ3JlcC4uLiBncmVwIC1FJywgZXRjLgotIyBiZWZvcmUgaXQgc2VlbWVkIHRvIGJlIGluc2lkZSB0aGUgd2l0aF9qcGVnIGNvbmRpdGlvbmFsLiAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ0aGVub25leGlzdGVudGhlYWRlci5oIiAiYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfVEhFTk9ORVhJU1RFTlRIRUFERVJfSD0idHJ1ZSIKLWZpCi0KLQotCi0jIHNldCBzb21lIGxkIC1SIG5vbnNlbnNlCi0jCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotbGRfbWludXNfUj0ieWVzIgotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieE9TRjEiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieERhcndpbiI7IHRoZW4KLQlsZF9taW51c19SPSJubyIKLWZpCi0KLSMgQ2hlY2sgZm9yIE9wZW5TU0wKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcnlwdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY3J5cHQ7IAotZmkKLQotaWYgdGVzdCAieCR3aXRoX2NyeXB0IiAhPSAieG5vIjsgdGhlbgotCWZvciBhY19mdW5jIGluIGNyeXB0Ci1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImNyeXB0IiAiYWNfY3ZfZnVuY19jcnlwdCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19jcnlwdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0NSWVBUIDEKLV9BQ0VPRgotIEhBVkVfTElCQ19DUllQVD0idHJ1ZSIKLWZpCi1kb25lCi0KLQlpZiB0ZXN0IC16ICIkSEFWRV9MSUJDX0NSWVBUIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjcnlwdCBpbiAtbGNyeXB0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9jcnlwdF9jcnlwdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGNyeXB0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gY3J5cHQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2NyeXB0X2NyeXB0PXllcwotZWxzZQotICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NyeXB0X2NyeXB0IiA9IHh5ZXM7IHRoZW4gOgotICBDUllQVF9MSUJTPSItbGNyeXB0IgotCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJDUllQVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCWZpCi1maQotCi0KLSMgc29tZSBPUydzIG5lZWQgYm90aCAtbHNzbCBhbmQgLWxjcnlwdG8gb24gbGluayBsaW5lOgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3J5cHRvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcnlwdG8rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NyeXB0bzsgCi1maQotCi0KLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXNzbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3NsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9zc2w7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfY3J5cHRvIiAhPSAieG5vIiAtYSAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3NzbC9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3NzbC9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9zc2wvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3NzbC9saWIiCi0JCWZpCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBSQU5EX2ZpbGVfbmFtZSBpbiAtbGNyeXB0byIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgUkFORF9maWxlX25hbWUgaW4gLWxjcnlwdG8uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHRvICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBSQU5EX2ZpbGVfbmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFJBTkRfZmlsZV9uYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQkNSWVBUTyAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQkNSWVBUTz0idHJ1ZSIKLWZpCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAtbGNyeXB0byAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBTU0xfbGlicmFyeV9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gU1NMX2xpYnJhcnlfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID0geHllczsgdGhlbiA6Ci0gIFNTTF9MSUJTPSItbHNzbCAtbGNyeXB0byIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCU1NMIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCU1NMPSJ0cnVlIgotZmkKLQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgU1NMX2xpYnJhcnlfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBTU0xfTElCUz0iLWxzc2wiCi0JCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlNTTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlNTTD0idHJ1ZSIKLWZpCi0KLQlmaQotZmkKLQotIGlmIHRlc3QgISAteiAiJFNTTF9MSUJTIjsgdGhlbgotICBIQVZFX0xJQlNTTF9UUlVFPQotICBIQVZFX0xJQlNTTF9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJTU0xfVFJVRT0nIycKLSAgSEFWRV9MSUJTU0xfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2tzIGZvciBYIGxpYnJhcmllcwotSEFWRV9YMTE9ImZhbHNlIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWC4uLiAiID4mNjsgfQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeDsgCi1maQotCi0jICRoYXZlX3ggaXMgYHllcycsIGBubycsIGBkaXNhYmxlZCcsIG9yIGVtcHR5IHdoZW4gd2UgZG8gbm90IHlldCBrbm93LgotaWYgdGVzdCAieCR3aXRoX3giID0geG5vOyB0aGVuCi0gICMgVGhlIHVzZXIgZXhwbGljaXRseSBkaXNhYmxlZCBYLgotICBoYXZlX3g9ZGlzYWJsZWQKLWVsc2UKLSAgY2FzZSAkeF9pbmNsdWRlcywkeF9saWJyYXJpZXMgaW4gIygKLSAgICAqXCcqKSBhc19mbl9lcnJvciAkPyAiY2Fubm90IHVzZSBYIGRpcmVjdG9yeSBuYW1lcyBjb250YWluaW5nICciICIkTElORU5PIiA1OzsgIygKLSAgICAqLE5PTkUgfCBOT05FLCopIGlmICR7YWNfY3ZfaGF2ZV94Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KLWFjX3hfaW5jbHVkZXM9bm8gYWNfeF9saWJyYXJpZXM9bm8KLXJtIC1mIC1yIGNvbmZ0ZXN0LmRpcgotaWYgbWtkaXIgY29uZnRlc3QuZGlyOyB0aGVuCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICBjYXQgPkltYWtlZmlsZSA8PCdfQUNFT0YnCi1pbmNyb290OgotCUBlY2hvIGluY3Jvb3Q9JyR7SU5DUk9PVH0nCi11c3JsaWJkaXI6Ci0JQGVjaG8gdXNybGliZGlyPScke1VTUkxJQkRJUn0nCi1saWJkaXI6Ci0JQGVjaG8gbGliZGlyPScke0xJQkRJUn0nCi1fQUNFT0YKLSAgaWYgKGV4cG9ydCBDQzsgJHtYTUtNRi14bWttZn0pID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgotICAgICMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLSAgICBmb3IgYWNfdmFyIGluIGluY3Jvb3QgdXNybGliZGlyIGxpYmRpcjsgZG8KLSAgICAgIGV2YWwgImFjX2ltXyRhY192YXI9XGBcJHtNQUtFLW1ha2V9ICRhY192YXIgMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvXiRhY192YXI9Ly9wJ1xgIgotICAgIGRvbmUKLSAgICAjIE9wZW4gV2luZG93cyB4bWttZiByZXBvcnRlZGx5IHNldHMgTElCRElSIGluc3RlYWQgb2YgVVNSTElCRElSLgotICAgIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbCBkeWxpYiBsYSBkbGw7IGRvCi0gICAgICBpZiB0ZXN0ICEgLWYgIiRhY19pbV91c3JsaWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iICYmCi0JIHRlc3QgLWYgIiRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCi0JYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uICBUaGV5IGFyZQotICAgICMgYm9ndXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGFueXdheSwgYW5kIGJlY2F1c2UKLSAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCi0gICAgY2FzZSAkYWNfaW1faW5jcm9vdCBpbgotCS91c3IvaW5jbHVkZSkgYWNfeF9pbmNsdWRlcz0gOzsKLQkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9JGFjX2ltX2luY3Jvb3Q7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19pbV91c3JsaWJkaXIgaW4KLQkvdXNyL2xpYiB8IC91c3IvbGliNjQgfCAvbGliIHwgL2xpYjY0KSA7OwotCSopIHRlc3QgLWQgIiRhY19pbV91c3JsaWJkaXIiICYmIGFjX3hfbGlicmFyaWVzPSRhY19pbV91c3JsaWJkaXIgOzsKLSAgICBlc2FjCi0gIGZpCi0gIGNkIC4uCi0gIHJtIC1mIC1yIGNvbmZ0ZXN0LmRpcgotZmkKLQotIyBTdGFuZGFyZCBzZXQgb2YgY29tbW9uIGRpcmVjdG9yaWVzIGZvciBYIGhlYWRlcnMuCi0jIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KLWFjX3hfaGVhZGVyX2RpcnM9JwotL3Vzci9YMTEvaW5jbHVkZQotL3Vzci9YMTFSNy9pbmNsdWRlCi0vdXNyL1gxMVI2L2luY2x1ZGUKLS91c3IvWDExUjUvaW5jbHVkZQotL3Vzci9YMTFSNC9pbmNsdWRlCi0KLS91c3IvaW5jbHVkZS9YMTEKLS91c3IvaW5jbHVkZS9YMTFSNwotL3Vzci9pbmNsdWRlL1gxMVI2Ci0vdXNyL2luY2x1ZGUvWDExUjUKLS91c3IvaW5jbHVkZS9YMTFSNAotCi0vdXNyL2xvY2FsL1gxMS9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI3L2luY2x1ZGUKLS91c3IvbG9jYWwvWDExUjYvaW5jbHVkZQotL3Vzci9sb2NhbC9YMTFSNS9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI0L2luY2x1ZGUKLQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI3Ci0vdXNyL2xvY2FsL2luY2x1ZGUvWDExUjYKLS91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNQotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI0Ci0KLS91c3IvWDM4Ni9pbmNsdWRlCi0vdXNyL3gzODYvaW5jbHVkZQotL3Vzci9YRnJlZTg2L2luY2x1ZGUvWDExCi0KLS91c3IvaW5jbHVkZQotL3Vzci9sb2NhbC9pbmNsdWRlCi0vdXNyL3Vuc3VwcG9ydGVkL2luY2x1ZGUKLS91c3IvYXRoZW5hL2luY2x1ZGUKLS91c3IvbG9jYWwveDExcjUvaW5jbHVkZQotL3Vzci9scHAvWGFtcGxlcy9pbmNsdWRlCi0KLS91c3Ivb3Blbndpbi9pbmNsdWRlCi0vdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZScKLQotaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gbm87IHRoZW4KLSAgIyBHdWVzcyB3aGVyZSB0byBmaW5kIGluY2x1ZGUgZmlsZXMsIGJ5IGxvb2tpbmcgZm9yIFhsaWIuaC4KLSAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotQCU6QGluY2x1ZGUgPFgxMS9YbGliLmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIFdlIGNhbiBjb21waWxlIHVzaW5nIFggaGVhZGVycyB3aXRoIG5vIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkuCi1hY194X2luY2x1ZGVzPQotZWxzZQotICBmb3IgYWNfZGlyIGluICRhY194X2hlYWRlcl9kaXJzOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfZGlyL1gxMS9YbGliLmgiOyB0aGVuCi0gICAgYWNfeF9pbmNsdWRlcz0kYWNfZGlyCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci1maSAjICRhY194X2luY2x1ZGVzID0gbm8KLQotaWYgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IG5vOyB0aGVuCi0gICMgQ2hlY2sgZm9yIHRoZSBsaWJyYXJpZXMuCi0gICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCi0gICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgotICBhY19zYXZlX0xJQlM9JExJQlMKLSAgTElCUz0iLWxYMTEgJExJQlMiCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLUAlOkBpbmNsdWRlIDxYMTEvWGxpYi5oPgotaW50Ci1tYWluICgpCi17Ci1Ycm1Jbml0aWFsaXplICgpCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgTElCUz0kYWNfc2F2ZV9MSUJTCi0jIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KLWFjX3hfbGlicmFyaWVzPQotZWxzZQotICBMSUJTPSRhY19zYXZlX0xJQlMKLWZvciBhY19kaXIgaW4gYCRhc19lY2hvICIkYWNfeF9pbmNsdWRlcyAkYWNfeF9oZWFkZXJfZGlycyIgfCBzZWQgcy9pbmNsdWRlL2xpYi9nYAotZG8KLSAgIyBEb24ndCBldmVuIGF0dGVtcHQgdGhlIGhhaXIgb2YgdHJ5aW5nIHRvIGxpbmsgYW4gWCBwcm9ncmFtIQotICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2wgZHlsaWIgbGEgZGxsOyBkbwotICAgIGlmIHRlc3QgLXIgIiRhY19kaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCi0gICAgICBhY194X2xpYnJhcmllcz0kYWNfZGlyCi0gICAgICBicmVhayAyCi0gICAgZmkKLSAgZG9uZQotZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maSAjICRhY194X2xpYnJhcmllcyA9IG5vCi0KLWNhc2UgJGFjX3hfaW5jbHVkZXMsJGFjX3hfbGlicmFyaWVzIGluICMoCi0gIG5vLCogfCAqLG5vIHwgKlwnKikKLSAgICAjIERpZG4ndCBmaW5kIFgsIG9yIGEgZGlyZWN0b3J5IGhhcyAiJyIgaW4gaXRzIG5hbWUuCi0gICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9bm8iOzsgIygKLSAgKikKLSAgICAjIFJlY29yZCB3aGVyZSB3ZSBmb3VuZCBYIGZvciB0aGUgY2FjaGUuCi0gICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAotCWFjX3hfaW5jbHVkZXM9JyRhY194X2luY2x1ZGVzJ1wKLQlhY194X2xpYnJhcmllcz0nJGFjX3hfbGlicmFyaWVzJyIKLWVzYWMKLWZpCi07OyAjKAotICAgICopIGhhdmVfeD15ZXM7OwotICBlc2FjCi0gIGV2YWwgIiRhY19jdl9oYXZlX3giCi1maSAjICR3aXRoX3ggIT0gbm8KLQotaWYgdGVzdCAiJGhhdmVfeCIgIT0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGF2ZV94IiA+JjUKLSRhc19lY2hvICIkaGF2ZV94IiA+JjY7IH0KLSAgbm9feD15ZXMKLWVsc2UKLSAgIyBJZiBlYWNoIG9mIHRoZSB2YWx1ZXMgd2FzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGl0IG92ZXJyaWRlcyBlYWNoIGd1ZXNzLgotICB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcwotICB0ZXN0ICJ4JHhfbGlicmFyaWVzIiA9IHhOT05FICYmIHhfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcwotICAjIFVwZGF0ZSB0aGUgY2FjaGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgY29tbWFuZCBsaW5lIHZhbHVlcy4KLSAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAotCWFjX3hfaW5jbHVkZXM9JyR4X2luY2x1ZGVzJ1wKLQlhY194X2xpYnJhcmllcz0nJHhfbGlicmFyaWVzJyIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiID4mNQotJGFzX2VjaG8gImxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJG5vX3giID0geWVzOyB0aGVuCi0gICMgTm90IGFsbCBwcm9ncmFtcyBtYXkgdXNlIHRoaXMgc3ltYm9sLCBidXQgaXQgZG9lcyBub3QgaHVydCB0byBkZWZpbmUgaXQuCi0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgWF9ESVNQTEFZX01JU1NJTkcgMSIgPj5jb25mZGVmcy5oCi0KLSAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQotZWxzZQotICBpZiB0ZXN0IC1uICIkeF9pbmNsdWRlcyI7IHRoZW4KLSAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCi0gIGZpCi0KLSAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgotICBpZiB0ZXN0IC1uICIkeF9saWJyYXJpZXMiOyB0aGVuCi0gICAgWF9MSUJTPSIkWF9MSUJTIC1MJHhfbGlicmFyaWVzIgotICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKLSAgICAjIG90aGVycyByZXF1aXJlIG5vIHNwYWNlLiAgV29yZHMgYXJlIG5vdCBzdWZmaWNpZW50IC4gLiAuIC4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLi4uICIgPiY2OyB9Ci0gICAgYWNfeHNhdmVfTElCUz0kTElCUzsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCi0gICAgYWNfeHNhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgIFhfTElCUz0iJFhfTElCUyAtUiR4X2xpYnJhcmllcyIKLWVsc2UKLSAgTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCSAgWF9MSUJTPSIkWF9MSUJTIC1SICR4X2xpYnJhcmllcyIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5laXRoZXIgd29ya3MiID4mNQotJGFzX2VjaG8gIm5laXRoZXIgd29ya3MiID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBhY19jX3dlcnJvcl9mbGFnPSRhY194c2F2ZV9jX3dlcnJvcl9mbGFnCi0gICAgTElCUz0kYWNfeHNhdmVfTElCUwotICBmaQotCi0gICMgQ2hlY2sgZm9yIHN5c3RlbS1kZXBlbmRlbnQgbGlicmFyaWVzIFggcHJvZ3JhbXMgbXVzdCBsaW5rIHdpdGguCi0gICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCi0gICMgKC1sSUNFKSwgc2luY2Ugd2UgbWF5IG5lZWQgLWxzb2NrZXQgb3Igd2hhdGV2ZXIgZm9yIFggbGlua2luZy4KLQotICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgotICAgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbF9zIC1saW5ldCIKLSAgZWxzZQotICAgICMgTWFydHluIEpvaG5zb24gc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAotICAgICMgbGlicmFyaWVzIHdlcmUgYnVpbHQgd2l0aCBERUNuZXQgc3VwcG9ydC4gIEFuZCBLYXJsIEJlcnJ5IHNheXMKLSAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgotICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgJFhfTElCUyAtbFgxMSIKLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWE9wZW5EaXNwbGF5ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWE9wZW5EaXNwbGF5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZG5ldCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZG5ldF9udG9hICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZG5ldF9udG9hICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sZG5ldCIKLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0X3N0dWIuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2ErOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRuZXRfc3R1YiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZG5ldF9udG9hICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZG5ldF9udG9hICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hPXllcwotZWxzZQotICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXRfc3R1YiIKLWZpCi0KLSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgTElCUz0iJGFjX3hzYXZlX0xJQlMiCi0KLSAgICAjIG1zaEBjaXMudWZsLmVkdSBzYXlzIC1sbnNsIChhbmQgLWxzb2NrZXQpIGFyZSBuZWVkZWQgZm9yIGhpcyAzODYvQVQsCi0gICAgIyB0byBnZXQgdGhlIFN5c1YgdHJhbnNwb3J0IGZ1bmN0aW9ucy4KLSAgICAjIENoYWQgUi4gTGFyc29uIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQotICAgICMgbmVlZHMgLWxuc2wuCi0gICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKLSAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gVC5FLiBEaWNrZXkuCi0gICAgIyBUaGUgZnVuY3Rpb25zIGdldGhvc3RieW5hbWUsIGdldHNlcnZieW5hbWUsIGFuZCBpbmV0X2FkZHIgYXJlCi0gICAgIyBpbiAtbGJzZCBvbiBMeW54T1MgMy4wLjEvaTM4NiwgYWNjb3JkaW5nIHRvIExhcnMgSGVja2luZy4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRob3N0YnluYW1lIiAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sbnNsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRob3N0YnluYW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ2V0aG9zdGJ5bmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbCIKLWZpCi0KLSAgICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbGJzZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbGJzZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGJzZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxic2QiCi1maQotCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIGxpZWRlckBza3lsZXIubWF2ZC5ob25leXdlbGwuY29tIHNheXMgd2l0aG91dCAtbHNvY2tldCwKLSAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKLSAgICAjIDIuMC4gIEJ1dCAtbHNvY2tldCBpcyBicm9rZW4gb24gSVJJWCA1LjIgKGFuZCBpcyBub3QgbmVjZXNzYXJ5Ci0gICAgIyBvbiBsYXRlciB2ZXJzaW9ucyksIHNheXMgU2ltb24gTGVpbmVuOiBpdCBjb250YWlucyBnZXRob3N0YnkqCi0gICAgIyB2YXJpYW50cyB0aGF0IGRvbid0IHVzZSB0aGUgbmFtZSBzZXJ2ZXIgKG9yIHNvbWV0aGluZykuICAtbHNvY2tldAotICAgICMgbXVzdCBiZSBnaXZlbiBiZWZvcmUgLWxuc2wgaWYgYm90aCBhcmUgbmVlZGVkLiAgV2UgYXNzdW1lIHRoYXQKLSAgICAjIGlmIGNvbm5lY3QgbmVlZHMgLWxuc2wsIHNvIGRvZXMgZ2V0aG9zdGJ5bmFtZS4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJjb25uZWN0IiAiYWNfY3ZfZnVuY19jb25uZWN0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Nvbm5lY3QiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY29ubmVjdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGNvbm5lY3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0PXllcwotZWxzZQotICBhY19jdl9saWJfc29ja2V0X2Nvbm5lY3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiCi1maQotCi0gICAgZmkKLQotICAgICMgR3VpbGxlcm1vIEdvbWV6IHNheXMgLWxwb3NpeCBpcyBuZWNlc3Nhcnkgb24gQS9VWC4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJyZW1vdmUiICJhY19jdl9mdW5jX3JlbW92ZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19yZW1vdmUiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcG9zaXhfcmVtb3ZlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwb3NpeCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcmVtb3ZlICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcmVtb3ZlICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcG9zaXhfcmVtb3ZlIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxwb3NpeCIKLWZpCi0KLSAgICBmaQotCi0gICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaG1hdCIgImFjX2N2X2Z1bmNfc2htYXQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2htYXQiID0geHllczsgdGhlbiA6Ci0gIAotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pcGNfc2htYXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGlwYyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2htYXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzaG1hdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfaXBjX3NobWF0PXllcwotZWxzZQotICBhY19jdl9saWJfaXBjX3NobWF0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pcGNfc2htYXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfaXBjX3NobWF0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2lwY19zaG1hdCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1saXBjIgotZmkKLQotICAgIGZpCi0gIGZpCi0KLSAgIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgWDExUjYgWHQvWGF3IHByb2dyYW1zIG5lZWQuCi0gIGFjX3NhdmVfTERGTEFHUz0kTERGTEFHUwotICB0ZXN0IC1uICIkeF9saWJyYXJpZXMiICYmIExERkxBR1M9IiRMREZMQUdTIC1MJHhfbGlicmFyaWVzIgotICAjIFNNIG5lZWRzIElDRSB0byAoZHluYW1pY2FsbHkpIGxpbmsgdW5kZXIgU3VuT1MgNC54IChzbyB3ZSBoYXZlIHRvCi0gICMgY2hlY2sgZm9yIElDRSBmaXJzdCksIGJ1dCB3ZSBtdXN0IGxpbmsgaW4gdGhlIG9yZGVyIC1sU00gLWxJQ0Ugb3IKLSAgIyB3ZSBnZXQgdW5kZWZpbmVkIHN5bWJvbHMuICBTbyBhc3N1bWUgd2UgaGF2ZSBTTSBpZiB3ZSBoYXZlIElDRS4KLSAgIyBUaGVzZSBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGJlZm9yZSAtbFgxMSwgdW5saWtlIHRoZSBvdGhlcgotICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KLSAgIyBKb2huIEludGVycmFudGUsIEthcmwgQmVycnkKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbElDRSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIEljZUNvbm5lY3Rpb25OdW1iZXIgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBJY2VDb25uZWN0aW9uTnVtYmVyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxTTSAtbElDRSIKLWZpCi0KLSAgTERGTEFHUz0kYWNfc2F2ZV9MREZMQUdTCi0KLWZpCi0KLQotCi0jIFNlZSBpZiB3ZSBhcmUgdG8gYnVpbGQgeDExdm5jOgotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcjsgCi1maQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgteDExdm5jIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94MTF2bmMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3gxMXZuYzsgCi1maQotCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfeDExdm5jIiAtYSAiJHdpdGhfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JYnVpbGRfeDExdm5jPSJ5ZXMiCi1lbGlmIHRlc3QgIiRQQUNLQUdFX05BTUUiID0gIngxMXZuYyI7IHRoZW4KLQlidWlsZF94MTF2bmM9InllcyIKLWVsc2UKLQlidWlsZF94MTF2bmM9Im5vIgotZmkKLQkKLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14a2V5Ym9hcmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hrZXlib2FyZCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGtleWJvYXJkOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14aW5lcmFtYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGluZXJhbWErc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hpbmVyYW1hOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14cmFuZHIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hyYW5kcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeHJhbmRyOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14Zml4ZXMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hmaXhlcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGZpeGVzOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14ZGFtYWdlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94ZGFtYWdlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94ZGFtYWdlOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14dHJhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeHRyYXArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3h0cmFwOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC14cmVjb3JkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94cmVjb3JkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94cmVjb3JkOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mYnBtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9mYnBtK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9mYnBtOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1kcG1zIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9kcG1zK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9kcG1zOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC12NGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3Y0bCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdjRsOyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1mYmRldiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZmJkZXYrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2ZiZGV2OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC11aW5wdXQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3VpbnB1dCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdWlucHV0OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1tYWNvc3gtbmF0aXZlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tYWNvc3hfbmF0aXZlK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9tYWNvc3hfbmF0aXZlOyAKLWZpCi0KLQotZmkKLSMgZW5kIHgxMXZuYyBvbmx5LgotCi1pZiB0ZXN0ICJ4JHdpdGhfeCIgPSAieG5vIjsgdGhlbgotCUhBVkVfWDExPSJmYWxzZSIKLWVsaWYgdGVzdCAiJFhfQ0ZMQUdTIiAhPSAiLURYX0RJU1BMQVlfTUlTU0lORyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYR2V0SW1hZ2UgaW4gLWxYMTEiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhHZXRJbWFnZSBpbiAtbFgxMS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWDExX1hHZXRJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWDExICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhHZXRJbWFnZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhHZXRJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWDExX1hHZXRJbWFnZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2U9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWDExX1hHZXRJbWFnZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YMTFfWEdldEltYWdlIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1gxMSAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1gxMT0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9YMTE9ImZhbHNlIgotZmkKLQotCi0JIyB4MTF2bmMgb25seToKLQlpZiB0ZXN0ICRIQVZFX1gxMSA9ICJ0cnVlIiAtYSAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCQlYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYZXh0IgotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhTaG1HZXRJbWFnZSBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhTaG1HZXRJbWFnZSBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhTaG1HZXRJbWFnZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhTaG1HZXRJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2U9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X1hTaG1HZXRJbWFnZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2UiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfWFNITSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSZWFkU2NyZWVuIGluIC1sWGV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFJlYWRTY3JlZW4gaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhSZWFkU2NyZWVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFJlYWRTY3JlZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbiIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLQkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIlgxMS9leHRlbnNpb25zL3JlYWRkaXNwbGF5LmgiICJhY19jdl9oZWFkZXJfWDExX2V4dGVuc2lvbnNfcmVhZGRpc3BsYXlfaCIgIiNpbmNsdWRlIDxYMTEvWGxpYi5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfWDExX2V4dGVuc2lvbnNfcmVhZGRpc3BsYXlfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9JUklYX1hSRUFERElTUExBWSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0KLQkJaWYgdGVzdCAieCR3aXRoX2ZicG0iICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBGQlBNRm9yY2VMZXZlbCBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEZCUE1Gb3JjZUxldmVsIGluIC1sWGV4dC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBGQlBNRm9yY2VMZXZlbCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIEZCUE1Gb3JjZUxldmVsICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfRkJQTSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF9kcG1zIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRFBNU0ZvcmNlTGV2ZWwgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBEUE1TRm9yY2VMZXZlbCBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhleHQgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgRFBNU0ZvcmNlTGV2ZWwgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBEUE1TRm9yY2VMZXZlbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWw9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0RQTVMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYVGVzdEdyYWJDb250cm9sIGluIC1sWHRzdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFRlc3RHcmFiQ29udHJvbCBpbiAtbFh0c3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWHRzdCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYVGVzdEdyYWJDb250cm9sICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFRlc3RHcmFiQ29udHJvbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPXllcwotZWxzZQotICBhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSItbFh0c3QgJFhfUFJFTElCUyIKLQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfWFRFU1RHUkFCQ09OVFJPTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1hURVNUR1JBQkNPTlRST0w9InRydWUiCi1maQotCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQgaW4gLWxYdHN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYVGVzdEZha2VLZXlFdmVudCBpbiAtbFh0c3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFRlc3RGYWtlS2V5RXZlbnQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYVGVzdEZha2VLZXlFdmVudCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50IiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9YVEVTVCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX1hURVNUPSJ0cnVlIgotZmkKLQotCi0JCWlmIHRlc3QgIngkd2l0aF94cmVjb3JkIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyBpbiAtbFh0c3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iLWxYdHN0ICRYX1BSRUxJQlMiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9SRUNPUkQgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQkjIHdlIHVzZSBYVFJBUCBvbiBYMTFSNSwgb3IgdXNlciBjYW4gc2V0IFgxMVZOQ19VU0VfWFRSQVAKLQkJaWYgdGVzdCAieCR3aXRoX3h0cmFwIiAhPSAieG5vIjsgdGhlbgotCQkgICAgaWYgdGVzdCAhIC16ICIkWDExVk5DX1VTRV9YVFJBUCIgLW8gLXogIiRIQVZFX1hURVNUR1JBQkNPTlRST0wiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYRVRyYXBTZXRHcmFiU2VydmVyIGluIC1sWFRyYXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYVHJhcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWFRyYXAgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlciIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWFRyYXAiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYVFJBUCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkJIyB0cnU2NCB1c2VzIGxpYlhFVHJhcC5zbwotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhFVHJhcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhFVHJhcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhFVHJhcCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYRVRyYXBTZXRHcmFiU2VydmVyICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YRVRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhFVHJhcCIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhUUkFQIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCSAgICBmaQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94a2V5Ym9hcmQiICE9ICJ4bm8iOyB0aGVuCi0JCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkWF9DRkxBR1MiCi0JCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiWDExL1hLQmxpYi5oIiAiYWNfY3ZfaGVhZGVyX1gxMV9YS0JsaWJfaCIgIiNpbmNsdWRlIDxYMTEvWGxpYi5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfWDExX1hLQmxpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1hLQkxJQl9IPSJ0cnVlIgotZWxzZQotICBIQVZFX1hLQkxJQl9IPSJmYWxzZSIKLWZpCi0KLQotCQkJQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKLQkJCWlmIHRlc3QgJEhBVkVfWEtCTElCX0ggPSAidHJ1ZSI7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYa2JTZWxlY3RFdmVudHMgaW4gLWxYMTEiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhrYlNlbGVjdEV2ZW50cyBpbiAtbFgxMS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWDExICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhrYlNlbGVjdEV2ZW50cyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhrYlNlbGVjdEV2ZW50cyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1hLRVlCT0FSRCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkJZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGluZXJhbWEiICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYaW5lcmFtYVF1ZXJ5U2NyZWVucyBpbiAtbFhpbmVyYW1hIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYaW5lcmFtYVF1ZXJ5U2NyZWVucyBpbiAtbFhpbmVyYW1hLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YaW5lcmFtYV9YaW5lcmFtYVF1ZXJ5U2NyZWVucys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGluZXJhbWEgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWGluZXJhbWFRdWVyeVNjcmVlbnMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYaW5lcmFtYVF1ZXJ5U2NyZWVucyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YaW5lcmFtYV9YaW5lcmFtYVF1ZXJ5U2NyZWVucz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhpbmVyYW1hIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWElORVJBTUEgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJhbmRyIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFJSU2VsZWN0SW5wdXQgaW4gLWxYcmFuZHIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSUlNlbGVjdElucHV0IGluIC1sWHJhbmRyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhyYW5kciAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYUlJTZWxlY3RJbnB1dCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSUlNlbGVjdElucHV0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hyYW5kcl9YUlJTZWxlY3RJbnB1dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0IiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYcmFuZHIiCi0JCQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSUJYUkFORFIgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJYUkFORFI9InRydWUiCi1maQotCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hmaXhlcyIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhGaXhlc0dldEN1cnNvckltYWdlIGluIC1sWGZpeGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYRml4ZXNHZXRDdXJzb3JJbWFnZSBpbiAtbFhmaXhlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZml4ZXMgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYRml4ZXNHZXRDdXJzb3JJbWFnZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlPXllcwotZWxzZQotICBhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZml4ZXNfWEZpeGVzR2V0Q3Vyc29ySW1hZ2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGZpeGVzIgotCQkJCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCWEZJWEVTIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWEZJWEVTPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94ZGFtYWdlIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGRhbWFnZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGRhbWFnZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhkYW1hZ2UgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hkYW1hZ2VfWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbiIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGRhbWFnZSIKLQkJCQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0xJQlhEQU1BR0UgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9MSUJYREFNQUdFPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgISAteiAiJEhBVkVfTElCWEZJWEVTIiAtbyAhIC16ICIkSEFWRV9MSUJYREFNQUdFIjsgdGhlbgotCQkJIyBuZWVkIC91c3Ivc2Z3L2xpYiBpbiBSUEFUSCBmb3IgU29sYXJpcyAxMCBhbmQgbGF0ZXIKLQkJCWNhc2UgYCh1bmFtZSAtc3IpIDI+L2Rldi9udWxsYCBpbgotCQkJIlN1bk9TIDUiKikgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1SL3Vzci9zZncvbGliIiA7OwotCQkJZXNhYwotCQlmaQotCQlpZiB0ZXN0ICEgLXogIiRIQVZFX0xJQlhSQU5EUiI7IHRoZW4KLQkJCSMgYWxzbyBuZWVkIC91c3IvWDExL2luY2x1ZGUgZm9yIFNvbGFyaXMgMTAgMTAvMDggYW5kIGxhdGVyCi0JCQljYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLQkJCSJTdW5PUyA1IiopIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL1gxMS9pbmNsdWRlIiA7OwotCQkJZXNhYwotCQlmaQotCi0JCVhfTElCUz0iJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMiCi0JZmkKLQkjIGVuZCB4MTF2bmMgb25seS4KLWZpCi0KLQotIGlmIHRlc3QgJEhBVkVfWDExICE9ICJmYWxzZSI7IHRoZW4KLSAgSEFWRV9YMTFfVFJVRT0KLSAgSEFWRV9YMTFfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfWDExX1RSVUU9JyMnCi0gIEhBVkVfWDExX0ZBTFNFPQotZmkKLQotCi0jIHgxMXZuYyBvbmx5OgotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCi1pZiB0ZXN0ICJ4JEhBVkVfWDExIiA9ICJ4ZmFsc2UiIC1hICJ4JHdpdGhfeCIgIT0gInhubyI7IHRoZW4KLQlhc19mbl9lcnJvciAkPyAiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBYIHdpbmRvdyBzeXN0ZW0gYnVpbGQgZW52aXJvbm1lbnQgaXMgcmVxdWlyZWQgdG8gYnVpbGQgKioqCi14MTF2bmMuICBNYWtlIHN1cmUgYW55IHJlcXVpcmVkIFggZGV2ZWxvcG1lbnQgcGFja2FnZXMgYXJlIGluc3RhbGxlZC4KLUlmIHRoZXkgYXJlIGluc3RhbGxlZCBpbiBub24tc3RhbmRhcmQgbG9jYXRpb25zLCBvbmUgY2FuIHVzZSB0aGUKLS0teC1pbmNsdWRlcz1ESVIgYW5kIC0teC1saWJyYXJpZXM9RElSIGNvbmZpZ3VyZSBvcHRpb25zIG9yIHNldCB0aGUKLUNQUEZMQUdTIGFuZCBMREZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgWAotd2luZG93IHN5c3RlbSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBtYXkgYmUgZm91bmQuICBPbiA2NCszMiBiaXQKLW1hY2hpbmVzIHlvdSBtYXkgbmVlZCB0byBwb2ludCB0byBsaWI2NCBvciBsaWIzMiBkaXJlY3RvcmllcyB0byBwaWNrIHVwCi10aGUgY29ycmVjdCB3b3JkIHNpemUuCi0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIHgxMXZuYyB3aXRob3V0IFggc3VwcG9ydCAoZS5nLiBmb3IgLXJhd2ZiIHVzZSBvbmx5Ci1vciBmb3IgbmF0aXZlIE1hYyBPUyBYKSwgc3BlY2lmeSB0aGUgLS13aXRob3V0LXggY29uZmlndXJlIG9wdGlvbi4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iICIkTElORU5PIiA1Ci1maQotCi1pZiB0ZXN0ICJ4JEhBVkVfWDExIiA9ICJ4dHJ1ZSIgLWEgIngkSEFWRV9YVEVTVCIgIT0gInh0cnVlIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIFhURVNUIGV4dGVuc2lvbiB3YXMgbm90IGZvdW5kICoqKgotKGxpYlh0c3QpLiAgQW4geDExdm5jIGJ1aWx0IHRoaXMgd2F5IHdpbGwgYmUgKk9OTFkgQkFSRUxZIFVTQUJMRSouCi1Zb3Ugd2lsbCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlIGJ1dCBub3QgY2xpY2sgb3IgdHlwZS4gIFRoZXJlIGNhbgotYWxzbyBiZSBkZWFkbG9ja3MgaWYgYW4gYXBwbGljYXRpb24gZ3JhYnMgdGhlIFggc2VydmVyLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMKLWZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgotY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogQSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgWFRFU1QgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQgKioqCi0obGliWHRzdCkuICBBbiB4MTF2bmMgYnVpbHQgdGhpcyB3YXkgd2lsbCBiZSAqT05MWSBCQVJFTFkgVVNBQkxFKi4KLVlvdSB3aWxsIGJlIGFibGUgdG8gbW92ZSB0aGUgbW91c2UgYnV0IG5vdCBjbGljayBvciB0eXBlLiAgVGhlcmUgY2FuCi1hbHNvIGJlIGRlYWRsb2NrcyBpZiBhbiBhcHBsaWNhdGlvbiBncmFicyB0aGUgWCBzZXJ2ZXIuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGluc3RhbGwgdGhlIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCBwYWNrYWdlcwotZm9yIFhURVNUIChwZXJoYXBzIGl0IGlzIG5hbWVkIHNvbWV0aGluZyBsaWtlIGxpYnh0c3QtZGV2KSBhbmQgcnVuCi1jb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCXNsZWVwIDUKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF92NGwiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L3ZpZGVvZGV2LmgiICJhY19jdl9oZWFkZXJfbGludXhfdmlkZW9kZXZfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfdmlkZW9kZXZfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSU5VWF9WSURFT0RFVl9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfZmJkZXYiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L2ZiLmgiICJhY19jdl9oZWFkZXJfbGludXhfZmJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfZmJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9MSU5VWF9GQl9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfdWlucHV0IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9pbnB1dC5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2lucHV0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lucHV0X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfSU5QVVRfSCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJTlVYX0lOUFVUX0g9InRydWUiCi1maQotCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfTElOVVhfSU5QVVRfSCIgPSAieHRydWUiOyB0aGVuCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsaW51eC91aW5wdXQuaCIgImFjX2N2X2hlYWRlcl9saW51eF91aW5wdXRfaCIgIiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfdWlucHV0X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElOVVhfVUlOUFVUX0ggMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCWZpCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfbWFjb3N4X25hdGl2ZSIgIT0gInhubyI7IHRoZW4KLQkkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BQ09TWF9OQVRJVkVfRElTUExBWSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBDaGVjayBmb3IgT1MgWCBvcGVuZ2wgaGVhZGVyCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiT3BlbkdML09wZW5HTC5oIiAiYWNfY3ZfaGVhZGVyX09wZW5HTF9PcGVuR0xfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfT3BlbkdMX09wZW5HTF9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BQ09TWF9PUEVOR0xfSCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX01BQ09TWF9PUEVOR0xfSD0idHJ1ZSIKLWZpCi0KLQotCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1hdmFoaSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYXZhaGkrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2F2YWhpOyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9hdmFoaSIgIT0gInhubyI7IHRoZW4KLQlwcmludGYgImNoZWNraW5nIGZvciBhdmFoaS4uLiAiCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9hdmFoaSIgLWEgIngkd2l0aF9hdmFoaSIgIT0gInh5ZXMiOyB0aGVuCi0JCUFWQUhJX0NGTEFHUz0iLUkkd2l0aF9hdmFoaS9pbmNsdWRlIgotCQlBVkFISV9MSUJTPSItTCR3aXRoX2F2YWhpL2xpYiAtbGF2YWhpLWNvbW1vbiAtbGF2YWhpLWNsaWVudCIKLQkJZWNobyAidXNpbmcgJHdpdGhfYXZhaGkiCi0JCXdpdGhfYXZhaGk9eWVzCi0JZWxpZiBwa2ctY29uZmlnIC0tYXRsZWFzdC12ZXJzaW9uPTAuNi40IGF2YWhpLWNsaWVudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJQVZBSElfQ0ZMQUdTPWBwa2ctY29uZmlnIC0tY2ZsYWdzIGF2YWhpLWNsaWVudGAKLQkJQVZBSElfTElCUz1gcGtnLWNvbmZpZyAtLWxpYnMgYXZhaGktY2xpZW50YAotCQl3aXRoX2F2YWhpPXllcwotCQllY2hvIHllcwotCWVsc2UKLQkJd2l0aF9hdmFoaT1ubwotCQllY2hvIG5vCi0JZmkKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfYXZhaGkiID0gInh5ZXMiOyB0aGVuCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9BVkFISSAxIiA+PmNvbmZkZWZzLmgKLQotCQotCQotZmkKLQotZmkKLSMgZW5kIHgxMXZuYyBvbmx5LgotCi0jIG9ubHkgdXNlZCBpbiB4MTF2bmMvTWFrZWZpbGUuYW0gYnV0IG5lZWRzIHRvIGFsd2F5cyBiZSBkZWZpbmVkOgotIGlmIHRlc3QgIiRIQVZFX01BQ09TWF9PUEVOR0xfSCIgPSAidHJ1ZSI7IHRoZW4KLSAgT1NYX09QRU5HTF9UUlVFPQotICBPU1hfT1BFTkdMX0ZBTFNFPScjJwotZWxzZQotICBPU1hfT1BFTkdMX1RSVUU9JyMnCi0gIE9TWF9PUEVOR0xfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgLWEgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAhPSAieG5vIjsgdGhlbgotCXByaW50ZiAiY2hlY2tpbmcgZm9yIHN5c3RlbSBsaWJ2bmNzZXJ2ZXIuLi4gIgotCXZuZWVkPSIwLjkuMSIKLQlpZiB0ZXN0ICJYJFZORUVEIiAhPSAiWCI7IHRoZW4KLQkJdm5lZWQ9JFZORUVECi0JZmkKLQlpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInh5ZXMiOyB0aGVuCi0JCXJmbGFnPSIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJcmZsYWc9Ii1YbGlua2VyIC1SJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIiCi0JCWVsc2UKLQkJCXJmbGFnPSItUiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliIgotCQlmaQotCQljbWQ9IiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvYmluL2xpYnZuY3NlcnZlci1jb25maWciCi0JCWlmICRjbWQgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCWN2ZXJzPWAkY21kIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKLQkJCWNzY29yZT1gZWNobyAiJGN2ZXJzIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCQkJbnNjb3JlPWBlY2hvICIkdm5lZWQiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0KLQkJCWlmIHRlc3QgJGNzY29yZSAtbHQgJG5zY29yZTsgdGhlbgotCQkJCWVjaG8gIm5vIgotCQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQkJCWFzX2ZuX2Vycm9yICQ/ICIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTmVlZCBsaWJ2bmNzZXJ2ZXIgdmVyc2lvbiAkdm5lZWQsIGhhdmUgdmVyc2lvbiAkY3ZlcnMgKioqCi1Zb3UgYXJlIGJ1aWxkaW5nIHdpdGggYSBzeXN0ZW0gaW5zdGFsbGVkIGxpYnZuY3NlcnZlciBhbmQgaXQgaXMgbm90Ci1uZXcgZW5vdWdoLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgIiRMSU5FTk8iIDUKLQkJCWVsc2UKLQkJCQlTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUz0iLUkkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2luY2x1ZGUiCi0JCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTPSItTCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliICRyZmxhZyAtbHZuY3NlcnZlciAtbHZuY2NsaWVudCIKLQkJCQllY2hvICJ1c2luZyAkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIgotCQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj15ZXMKLQkJCWZpCi0JCWVsc2UKLQkJCWVjaG8gIiAqKiogY2Fubm90IHJ1biAkY21kICoqKiAiIDE+JjIKLQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQkJZWNobyBubwotCQlmaQotCWVsaWYgbGlidm5jc2VydmVyLWNvbmZpZyAtLXZlcnNpb24gMT4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlyZmxhZz0iIgotCQlycHJlZml4PWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tcHJlZml4YAotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCXJmbGFnPSIgLVhsaW5rZXIgLVIkcnByZWZpeC9saWIgIgotCQllbHNlCi0JCQlyZmxhZz0iIC1SJHJwcmVmaXgvbGliICIKLQkJZmkKLQkJY3ZlcnM9YGxpYnZuY3NlcnZlci1jb25maWcgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAotCQljc2NvcmU9YGVjaG8gIiRjdmVycyIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQkJbnNjb3JlPWBlY2hvICIkdm5lZWQiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0KLQkJaWYgdGVzdCAkY3Njb3JlIC1sdCAkbnNjb3JlOyB0aGVuCi0JCQllY2hvICJubyIKLQkJCQlhc19mbl9lcnJvciAkPyAiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5lZWQgbGlidm5jc2VydmVyIHZlcnNpb24gJHZuZWVkLCBoYXZlIHZlcnNpb24gJGN2ZXJzICoqKgotWW91IGFyZSBidWlsZGluZyB3aXRoIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgYW5kIGl0IGlzIG5vdAotbmV3IGVub3VnaC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iICIkTElORU5PIiA1Ci0JCWVsc2UKLQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTPWBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tY2ZsYWdzYAotCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTPSIkcmZsYWciYGxpYnZuY3NlcnZlci1jb25maWcgLS1saWJzYAotCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPXllcwotCQkJZWNobyB5ZXMKLQkJZmkKLQllbHNlCi0JCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQllY2hvIG5vCi0JZmkKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUiAxIiA+PmNvbmZkZWZzLmgKLQotCQotCQotZmkKLSBpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgPSAieHllcyI7IHRoZW4KLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9Ci0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9JyMnCi0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0KLWZpCi0KLQotCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtanBlZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfanBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfanBlZzsgCi1maQotCi0KLSMgQXQgdGhpcyBwb2ludDoKLSMJbm8ganBlZyBvbiBjb21tYW5kIGxpbmUgICB3aXRoX2pwZWc9IiIKLSMJLXdpdGgtanBlZyAgICAgICAgICAgICAgICB3aXRoX2pwZWc9InllcyIKLSMJLXdpdGhvdXQtanBlZyAgICAgICAgICAgICB3aXRoX2pwZWc9Im5vIgotIwktd2l0aC1qcGVnPS9mb28vZGlyICAgICAgIHdpdGhfanBlZz0iL2Zvby9kaXIiCi0KLUhBVkVfTElCSlBFR19UVVJCTz0iZmFsc2UiCi0KLWlmIHRlc3QgIngkd2l0aF9qcGVnIiAhPSAieG5vIjsgdGhlbgotCQotCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0Jc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0Jc2F2ZWRfTElCUz0iJExJQlMiCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9qcGVnIiAtYSAieCR3aXRoX2pwZWciICE9ICJ4eWVzIjsgdGhlbgotCQkjIGFkZCB1c2VyIHN1cHBsaWVkIGRpcmVjdG9yeSB0byBmbGFnczoKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX2pwZWcvaW5jbHVkZSIKLQkJTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aF9qcGVnL2xpYiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQkjIHRoaXMgaXMgbm90IGNvbXBsZXRlLi4uIGluIGdlbmVyYWwgYSByYXQncyBuZXN0LgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9qcGVnL2xpYiIKLQkJZWxzZQotCQkJTERGTEFHUz0iJExERkxBR1MgLVIkd2l0aF9qcGVnL2xpYiIKLQkJZmkKLQlmaQotCWlmIHRlc3QgIngkSlBFR19MREZMQUdTIiAhPSAieCI7IHRoZW4KLQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCUxJQlM9IiRMSUJTICRKUEVHX0xERkxBR1MiCi0JZWxzZQotCQlMSUJTPSItbGpwZWciCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAianBlZ2xpYi5oIiAiYWNfY3ZfaGVhZGVyX2pwZWdsaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfanBlZ2xpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0pQRUdMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpwZWdfQ3JlYXRlQ29tcHJlc3MgaW4gbGlianBlZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IganBlZ19DcmVhdGVDb21wcmVzcyBpbiBsaWJqcGVnLi4uICIgPiY2OyB9Ci0JaWYgdGVzdCAieCRIQVZFX0pQRUdMSUJfSCIgPSAieHRydWUiOyB0aGVuCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBqcGVnX0NyZWF0ZUNvbXByZXNzICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4ganBlZ19DcmVhdGVDb21wcmVzcyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfTsKLQkJCQkKLSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfTElCSlBFRyAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH07IEhBVkVfSlBFR0xJQl9IPSIiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQlmaQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCSMgcmVzdG9yZSBvbGQgZmxhZ3Mgb24gZmFpbHVyZToKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKLQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYmpwZWcgY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJqcGVnIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtanBlZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9qcGVnbGliLmggYW5kIHRoZSBsaWJyYXJ5Ci1pbiBESVIvbGliL2xpYmpwZWcuYS4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIEpQRUdfTERGTEFHUyB2YXJpYWJsZSB0bwotc3BlY2lmeSBtb3JlIGRldGFpbGVkIGxpbmtlciBmbGFncy4gIEEgY29weSBvZiBsaWJqcGVnLXR1cmJvIG1heSBiZQotb2J0YWluZWQgZnJvbTogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvCi1BIGNvcHkgb2YgbGlianBlZyBtYXkgYmUgb2J0YWluZWQgZnJvbTogIGh0dHA6Ly9pamcub3JnL2ZpbGVzLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYmpwZWcgY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJqcGVnIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtanBlZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9qcGVnbGliLmggYW5kIHRoZSBsaWJyYXJ5Ci1pbiBESVIvbGliL2xpYmpwZWcuYS4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIEpQRUdfTERGTEFHUyB2YXJpYWJsZSB0bwotc3BlY2lmeSBtb3JlIGRldGFpbGVkIGxpbmtlciBmbGFncy4gIEEgY29weSBvZiBsaWJqcGVnLXR1cmJvIG1heSBiZQotb2J0YWluZWQgZnJvbTogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvCi1BIGNvcHkgb2YgbGlianBlZyBtYXkgYmUgb2J0YWluZWQgZnJvbTogIGh0dHA6Ly9pamcub3JnL2ZpbGVzLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQkJCXNsZWVwIDUKLQkJZmkKLQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giID0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgSlBFRyBsaWJyYXJ5IGlzIGxpYmpwZWctdHVyYm8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBKUEVHIGxpYnJhcnkgaXMgbGlianBlZy10dXJiby4uLiAiID4mNjsgfQotCQkKLQkJaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIjsgdGhlbgotCQkJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCQkJCSNpbmNsdWRlIDxqcGVnbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLQkJCQlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLQkJCQljaW5mby5lcnI9anBlZ19zdGRfZXJyb3IoJmplcnIpOwotCQkJCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7Ci0JCQkJanBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLQkJCQljaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19FWFRfUkdCOwotCQkJCWpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlKCZjaW5mbyk7Ci0JCQkJcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci0JCQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgSEFWRV9MSUJKUEVHX1RVUkJPPSJ0cnVlIjsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCQllbHNlCi0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQkJCQkjaW5jbHVkZSA8anBlZ2xpYi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0JCQkJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JCQkJY2luZm8uZXJyPWpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLQkJCQlqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotCQkJCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwotCQkJCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfRVhUX1JHQjsKLQkJCQlqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCQkJCXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotCQkKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBIQVZFX0xJQkpQRUdfVFVSQk89InRydWUiOyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCQlmaQotCWZpCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfSlBFR0xJQl9IIiA9ICJ4dHJ1ZSIgLWEgIngkSEFWRV9MSUJKUEVHX1RVUkJPIiAhPSAieHRydWUiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGxpYnJhcnkgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGlzIG5vdCBsaWJqcGVnLXR1cmJvLgotUGVyZm9ybWFuY2Ugd2lsbCBiZSByZWR1Y2VkLiAgWW91IGNhbiBvYnRhaW4gbGlianBlZy10dXJibyBmcm9tOgotaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8gKioqCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlianBlZyBsaWJyYXJ5IHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBpcyBub3QgbGlianBlZy10dXJiby4KLVBlcmZvcm1hbmNlIHdpbGwgYmUgcmVkdWNlZC4gIFlvdSBjYW4gb2J0YWluIGxpYmpwZWctdHVyYm8gZnJvbToKLWh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvICoqKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLSAgZmkKLQotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXBuZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcG5nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wbmc7IAotZmkKLQotCi0jIEF0IHRoaXMgcG9pbnQ6Ci0jCW5vIHBuZyBvbiBjb21tYW5kIGxpbmUgICAgd2l0aF9wbmc9IiIKLSMJLXdpdGgtcG5nICAgICAgICAgICAgICAgICB3aXRoX3BuZz0ieWVzIgotIwktd2l0aG91dC1wbmcgICAgICAgICAgICAgIHdpdGhfcG5nPSJubyIKLSMJLXdpdGgtcG5nPS9mb28vZGlyICAgICAgICB3aXRoX3BuZz0iL2Zvby9kaXIiCi0KLWlmIHRlc3QgIngkd2l0aF9wbmciICE9ICJ4bm8iOyB0aGVuCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9wbmciIC1hICJ4JHdpdGhfcG5nIiAhPSAieHllcyI7IHRoZW4KLQkJIyBhZGQgdXNlciBzdXBwbGllZCBkaXJlY3RvcnkgdG8gZmxhZ3M6Ci0JCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0JCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGhfcG5nL2luY2x1ZGUiCi0JCUxERkxBR1M9IiRMREZMQUdTIC1MJHdpdGhfcG5nL2xpYiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQkjIHRoaXMgaXMgbm90IGNvbXBsZXRlLi4uIGluIGdlbmVyYWwgYSByYXQncyBuZXN0LgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9wbmcvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3BuZy9saWIiCi0JCWZpCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicG5nLmgiICJhY19jdl9oZWFkZXJfcG5nX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3BuZ19oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1BOR0xJQl9IPSJ0cnVlIgotZmkKLQotCi0JaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgaW4gLWxwbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IGluIC1scG5nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHBuZyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0PXllcwotZWxzZQotICBhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlBORyAxCi1fQUNFT0YKLQotICBMSUJTPSItbHBuZyAkTElCUyIKLQotZWxzZQotICBIQVZFX1BOR0xJQl9IPSIiCi1maQotCi0JZmkKLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3BuZyIgLWEgIngkd2l0aF9wbmciICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfUE5HTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCSMgcmVzdG9yZSBvbGQgZmxhZ3Mgb24gZmFpbHVyZToKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKLQkJZmkKLQlmaQotCWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlicG5nIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlicG5nIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtcG5nPURJUiB0bwotaW5kaWNhdGUgdGhlIGhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3BuZy5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJwbmcuYS4gIEEgY29weSBvZiBsaWJwbmcgbWF5IGJlIG9idGFpbmVkIGZyb206Ci1odHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnBuZyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnBuZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLXBuZz1ESVIgdG8KLWluZGljYXRlIHRoZSBoZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS9wbmcuaCBhbmQgdGhlIGxpYnJhcnkKLWluIERJUi9saWIvbGlicG5nLmEuICBBIGNvcHkgb2YgbGlicG5nIG1heSBiZSBvYnRhaW5lZCBmcm9tOgotaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0JZmkKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJ6IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9saWJ6K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9saWJ6OyAKLWZpCi0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC16bGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF96bGliK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF96bGliOyAKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3psaWIiICE9ICJ4bm8iIC1hICJ4JHdpdGhfbGlieiIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3psaWIiIC1hICJ4JHdpdGhfemxpYiIgIT0gInh5ZXMiOyB0aGVuCi0JCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0JCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGhfemxpYi9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3psaWIvbGliIgotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfemxpYi9saWIiCi0JCWVsc2UKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHdpdGhfemxpYi9saWIiCi0JCWZpCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiemxpYi5oIiAiYWNfY3ZfaGVhZGVyX3psaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfemxpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1pMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9aTElCX0giID0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZWZsYXRlIGluIC1seiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3pfZGVmbGF0ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1seiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGVmbGF0ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRlZmxhdGUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfel9kZWZsYXRlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl96X2RlZmxhdGUiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJaIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1seiAkTElCUyIKLQotZWxzZQotICBIQVZFX1pMSUJfSD0iIgotZmkKLQotCWZpCi0JaWYgdGVzdCAhIC16ICIkd2l0aF96bGliIiAtYSAieCR3aXRoX3psaWIiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfWkxJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JCWlmIHRlc3QgIngkSEFWRV9aTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJ6IGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlieiBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLXpsaWI9RElSIHRvIGluZGljYXRlIHRoZQotaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvemxpYi5oIGFuZCB0aGUgbGlicmFyeSBpbiBESVIvbGliL2xpYnouYS4KLUEgY29weSBvZiBsaWJ6IG1heSBiZSBvYnRhaW5lZCBmcm9tOiBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlieiBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYnogaXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24gdXNlIC0td2l0aC16bGliPURJUiB0byBpbmRpY2F0ZSB0aGUKLWhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3psaWIuaCBhbmQgdGhlIGxpYnJhcnkgaW4gRElSL2xpYi9saWJ6LmEuCi1BIGNvcHkgb2YgbGlieiBtYXkgYmUgb2J0YWluZWQgZnJvbTogaHR0cDovL3d3dy5nemlwLm9yZy96bGliLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQkJCXNsZWVwIDUKLQkJZmkKLQlmaQotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLXB0aHJlYWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3B0aHJlYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3B0aHJlYWQ7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfcHRocmVhZCIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicHRocmVhZC5oIiAiYWNfY3ZfaGVhZGVyX3B0aHJlYWRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfcHRocmVhZF9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1BUSFJFQURfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgISAteiAiJEhBVkVfUFRIUkVBRF9IIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jays6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scHRocmVhZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwdGhyZWFkICRMSUJTIgotCi1maQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwdGhyZWFkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPXllcwotZWxzZQotICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0xJQlBUSFJFQUQ9InRydWUiCi1maQotCi0JZmkKLWZpCi0gaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJQVEhSRUFEIjsgdGhlbgotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0KLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0nIycKLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX3RocmVhZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX190aHJlYWQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgX190aHJlYWQgaW50IHAgPSAwCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1RMUyAxIiA+PmNvbmZkZWZzLmgKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0jIHRpZ2h0dm5jLWZpbGV0cmFuc2ZlciBpbXBsZW1lbnRlZCB1c2luZyB0aHJlYWRzOgotaWYgdGVzdCAteiAiJEhBVkVfTElCUFRIUkVBRCI7IHRoZW4KLQl3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2Zlcj0iIgotZmkKLWlmIHRlc3QgIngkd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIiID0gInh5ZXMiOyB0aGVuCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0gaWYgdGVzdCAiJHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ5ZXMiOyB0aGVuCi0gIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUU9Ci0gIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFPScjJwotZWxzZQotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFPScjJwotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRT0KLWZpCi0KLQotIyB3ZWJzb2NrZXRzIGltcGxlbWVudGVkIHVzaW5nIGJhc2U2NCBmcm9tIHJlc29sdmUKLWlmIHRlc3QgIngkSEFWRV9CNjQiICE9ICJ4dHJ1ZSI7IHRoZW4KLQl3aXRoX3dlYnNvY2tldHM9IiIKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfd2Vic29ja2V0cyIgPSAieHllcyI7IHRoZW4KLQlMSUJTPSIkTElCUyAtbHJlc29sdiAkU1NMX0xJQlMiCi0JJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEiID4+Y29uZmRlZnMuaAotCi1maQotIGlmIHRlc3QgIiR3aXRoX3dlYnNvY2tldHMiID0gInllcyI7IHRoZW4KLSAgV0lUSF9XRUJTT0NLRVRTX1RSVUU9Ci0gIFdJVEhfV0VCU09DS0VUU19GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9XRUJTT0NLRVRTX1RSVUU9JyMnCi0gIFdJVEhfV0VCU09DS0VUU19GQUxTRT0KLWZpCi0KLQotIGlmIHRlc3QgISAteiAiJEhBVkVfWkxJQl9IIjsgdGhlbgotICBIQVZFX0xJQlpfVFJVRT0KLSAgSEFWRV9MSUJaX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlpfVFJVRT0nIycKLSAgSEFWRV9MSUJaX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgISAteiAiJEhBVkVfSlBFR0xJQl9IIjsgdGhlbgotICBIQVZFX0xJQkpQRUdfVFJVRT0KLSAgSEFWRV9MSUJKUEVHX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQkpQRUdfVFJVRT0nIycKLSAgSEFWRV9MSUJKUEVHX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgISAteiAiJEhBVkVfUE5HTElCX0giOyB0aGVuCi0gIEhBVkVfTElCUE5HX1RSVUU9Ci0gIEhBVkVfTElCUE5HX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlBOR19UUlVFPScjJwotICBIQVZFX0xJQlBOR19GQUxTRT0KLWZpCi0KLQotCi1TRExDT05GSUc9InNkbC1jb25maWciCi0KLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtc2RsLWNvbmZpZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc2RsX2NvbmZpZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc2RsX2NvbmZpZzsgCi0gICAgaWYgdGVzdCAiJHdpdGh2YWwiICE9ICJ5ZXMiIC1hICIkd2l0aHZhbCIgIT0gIiI7IHRoZW4KLSAgICAgICAgU0RMQ09ORklHPSR3aXRodmFsCi0gICAgZmkKLQotZmkKLQotCi1pZiB0ZXN0IC16ICIkd2l0aF9zZGwiOyB0aGVuCi0JaWYgJFNETENPTkZJRyAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXdpdGhfc2RsPXllcwotCQlTRExfQ0ZMQUdTPWAkU0RMQ09ORklHIC0tY2ZsYWdzYAotCQlTRExfTElCUz1gJFNETENPTkZJRyAtLWxpYnNgCi0JZWxzZQotCQl3aXRoX3NkbD1ubwotCWZpCi1maQotIGlmIHRlc3QgIngkd2l0aF9zZGwiID0gInh5ZXMiOyB0aGVuCi0gIEhBVkVfTElCU0RMX1RSVUU9Ci0gIEhBVkVfTElCU0RMX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlNETF9UUlVFPScjJwotICBIQVZFX0xJQlNETF9GQUxTRT0KLWZpCi0KLQotCi0KLQotIyBDaGVjayBmb3IgR1RLKy4gaWYgcHJlc2VudCwgYnVpbGQgdGhlIEdUSysgdm5jIHZpZXdlciBleGFtcGxlCi0KLQotCi0KLQotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRQS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRQS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRoZW4KLSAgYWNfcHRfUEtHX0NPTkZJRz0kUEtHX0NPTkZJRwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9QS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotYWNfcHRfUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkYWNfcHRfUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9QS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkYWNfcHRfUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05GSUciID0geDsgdGhlbgotICAgIFBLR19DT05GSUc9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBQS0dfQ09ORklHPSRhY19wdF9QS0dfQ09ORklHCi0gIGZpCi1lbHNlCi0gIFBLR19DT05GSUc9IiRhY19jdl9wYXRoX1BLR19DT05GSUciCi1maQotCi1maQotaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0JX3BrZ19taW5fdmVyc2lvbj0wLjkuMAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAiID4mNjsgfQotCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCVBLR19DT05GSUc9IiIKLQlmaQotZmkKLQotcGtnX2ZhaWxlZD1ubwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR1RLIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHVEsuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJEdUS19DRkxBR1MiOyB0aGVuCi0gICAgcGtnX2N2X0dUS19DRkxBR1M9IiRHVEtfQ0ZMQUdTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ3RrKy0yLjBcIiI7IH0gPiY1Ci0gICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImd0aystMi4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzIAotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotaWYgdGVzdCAtbiAiJEdUS19MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9HVEtfTElCUz0iJEdUS19MSUJTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ3RrKy0yLjBcIiI7IH0gPiY1Ci0gICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR1RLX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAiZ3RrKy0yLjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgCi1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKLWZpCi0KLQotCi1pZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCi0gICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgICAgIAotaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwotZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KLWZpCi0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgotCSAgICAgICAgR1RLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ3RrKy0yLjAiIDI+JjFgCi0gICAgICAgIGVsc2UgCi0JICAgICAgICBHVEtfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJndGsrLTIuMCIgMj4mMWAKLSAgICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkR1RLX1BLR19FUlJPUlMiID4mNQotCi0JOgotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgotICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JOgotZWxzZQotCUdUS19DRkxBR1M9JHBrZ19jdl9HVEtfQ0ZMQUdTCi0JR1RLX0xJQlM9JHBrZ19jdl9HVEtfTElCUwotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQotZmkKLSBpZiB0ZXN0ICEgLXogIiRHVEtfTElCUyI7IHRoZW4KLSAgSEFWRV9MSUJHVEtfVFJVRT0KLSAgSEFWRV9MSUJHVEtfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTElCR1RLX1RSVUU9JyMnCi0gIEhBVkVfTElCR1RLX0ZBTFNFPQotZmkKLQotCi0KLU1JTkdXPWBlY2hvICRob3N0X29zIHwgZ3JlcCBtaW5ndzMyICAyPi9kZXYvbnVsbGAKLSBpZiB0ZXN0ICEgLXogIiRNSU5HVyIgOyB0aGVuCi0gIE1JTkdXX1RSVUU9Ci0gIE1JTkdXX0ZBTFNFPScjJwotZWxzZQotICBNSU5HV19UUlVFPScjJwotICBNSU5HV19GQUxTRT0KLWZpCi0KLWlmIHRlc3QgISAteiAiJE1JTkdXIjsgdGhlbgotCVdTT0NLTElCPSItbHdzMl8zMiIKLQlMREZMQUdTPSIkTERGTEFHUyAtbm8tdW5kZWZpbmVkIgotZmkKLQotCi0jIENoZWNrIGZvciBsaWJnY3J5cHQKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdjcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ2NyeXB0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nY3J5cHQ7IAotZmkKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWNsaWVudC1nY3J5cHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2NsaWVudF9nY3J5cHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2NsaWVudF9nY3J5cHQ7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ2NyeXB0IiAhPSAieG5vIjsgdGhlbgotCSAKLUAlOkAgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliZ2NyeXB0LXByZWZpeCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGliZ2NyeXB0X3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbGliZ2NyeXB0X3ByZWZpeDsgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIgotZWxzZQotICBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iIgotZmkKLQotICBpZiB0ZXN0IHgkbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KLSAgICAgaWYgdGVzdCB4JHtMSUJHQ1JZUFRfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KLSAgICAgICAgTElCR0NSWVBUX0NPTkZJRz0kbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXgvYmluL2xpYmdjcnlwdC1jb25maWcKLSAgICAgZmkKLSAgZmkKLQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxpYmdjcnlwdC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGxpYmdjcnlwdC1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRMSUJHQ1JZUFRfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUc9IiRMSUJHQ1JZUFRfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUciICYmIGFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRz0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTElCR0NSWVBUX0NPTkZJRz0kYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHCi1pZiB0ZXN0IC1uICIkTElCR0NSWVBUX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMSUJHQ1JZUFRfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkTElCR0NSWVBUX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRtcD0xLjQuMAotICBpZiBlY2hvICIkdG1wIiB8IGdyZXAgJzonID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgIHJlcV9saWJnY3J5cHRfYXBpPWBlY2hvICIkdG1wIiAgICAgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMS8nYAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249YGVjaG8gIiR0bXAiIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDIvJ2AKLSAgZWxzZQotICAgICByZXFfbGliZ2NyeXB0X2FwaT0wCi0gICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj0iJHRtcCIKLSAgZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49ICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIExJQkdDUllQVCAtIHZlcnNpb24gPj0gJG1pbl9saWJnY3J5cHRfdmVyc2lvbi4uLiAiID4mNjsgfQotICBvaz1ubwotICBpZiB0ZXN0ICIkTElCR0NSWVBUX0NPTkZJRyIgIT0gIm5vIiA7IHRoZW4KLSAgICByZXFfbWFqb3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wxLydgCi0gICAgcmVxX21pbm9yPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMi8nYAotICAgIHJlcV9taWNybz1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDMvJ2AKLSAgICBsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb249YCRMSUJHQ1JZUFRfQ09ORklHIC0tdmVyc2lvbmAKLSAgICBtYWpvcj1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAotICAgIG1pbm9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wyLydgCi0gICAgbWljcm89YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpLiovXDMvJ2AKLSAgICBpZiB0ZXN0ICIkbWFqb3IiIC1ndCAiJHJlcV9tYWpvciI7IHRoZW4KLSAgICAgICAgb2s9eWVzCi0gICAgZWxzZSAKLSAgICAgICAgaWYgdGVzdCAiJG1ham9yIiAtZXEgIiRyZXFfbWFqb3IiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1ndCAiJHJlcV9taW5vciI7IHRoZW4KLSAgICAgICAgICAgICAgIG9rPXllcwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZXEgIiRyZXFfbWlub3IiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJG1pY3JvIiAtZ2UgIiRyZXFfbWljcm8iOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICBvaz15ZXMKLSAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY1Ci0kYXNfZWNobyAieWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKSIgPiY2OyB9Ci0gIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICAgIyBJZiB3ZSBoYXZlIGEgcmVjZW50IGxpYmdjcnlwdCwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUKLSAgICAgIyBBUEkgaXMgY29tcGF0aWJsZQotICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1ndCAwIDsgdGhlbgotICAgICAgICB0bXA9YCRMSUJHQ1JZUFRfQ09ORklHIC0tYXBpLXZlcnNpb24gMj4vZGV2L251bGwgfHwgZWNobyAwYAotICAgICAgICBpZiB0ZXN0ICIkdG1wIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBMSUJHQ1JZUFQgQVBJIHZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgTElCR0NSWVBUIEFQSSB2ZXJzaW9uLi4uICIgPiY2OyB9Ci0gICAgICAgICAgIGlmIHRlc3QgIiRyZXFfbGliZ2NyeXB0X2FwaSIgLWVxICIkdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2theSIgPiY1Ci0kYXNfZWNobyAib2theSIgPiY2OyB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBvaz1ubwotICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBkb2VzIG5vdCBtYXRjaC4gd2FudD0kcmVxX2xpYmdjcnlwdF9hcGkgZ290PSR0bXAiID4mNQotJGFzX2VjaG8gImRvZXMgbm90IG1hdGNoLiB3YW50PSRyZXFfbGliZ2NyeXB0X2FwaSBnb3Q9JHRtcCIgPiY2OyB9Ci0gICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgTElCR0NSWVBUX0NGTEFHUz1gJExJQkdDUllQVF9DT05GSUcgLS1jZmxhZ3NgCi0gICAgTElCR0NSWVBUX0xJQlM9YCRMSUJHQ1JZUFRfQ09ORklHIC0tbGlic2AKLSAgICA6Ci0gIGVsc2UKLSAgICBMSUJHQ1JZUFRfQ0ZMQUdTPSIiCi0gICAgTElCR0NSWVBUX0xJQlM9IiIKLSAgICB3aXRoX2NsaWVudF9nY3J5cHQ9bm8KLSAgZmkKLSAgCi0gIAotCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRMSUJHQ1JZUFRfQ0ZMQUdTIgotCUxJQlM9IiRMSUJTICRMSUJHQ1JZUFRfTElCUyIKLQlpZiB0ZXN0ICJ4JHdpdGhfY2xpZW50X2djcnlwdCIgIT0gInhubyI7IHRoZW4KLQkJJGFzX2VjaG8gIkAlOkBkZWZpbmUgV0lUSF9DTElFTlRfR0NSWVBUIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWZpCi0KLSMgQ2hlY2tzIGZvciBHbnVUTFMKLQotCi1AJTpAIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudXRscyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251dGxzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nbnV0bHM7IAotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfZ251dGxzIiAhPSAieG5vIjsgdGhlbgotCQotcGtnX2ZhaWxlZD1ubwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VVExTIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlVUTFMuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJEdOVVRMU19DRkxBR1MiOyB0aGVuCi0gICAgcGtnX2N2X0dOVVRMU19DRkxBR1M9IiRHTlVUTFNfQ0ZMQUdTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ251dGxzID49IDIuNC4wXCIiOyB9ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdudXRscyA+PSAyLjQuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HTlVUTFNfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAiZ251dGxzID49IDIuNC4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzIAotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotaWYgdGVzdCAtbiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9HTlVUTFNfTElCUz0iJEdOVVRMU19MSUJTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ251dGxzID49IDIuNC4wXCIiOyB9ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdudXRscyA+PSAyLjQuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HTlVUTFNfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJnbnV0bHMgPj0gMi40LjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgCi1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKLWZpCi0KLQotCi1pZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCi0gICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgICAgIAotaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwotZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KLWZpCi0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgotCSAgICAgICAgR05VVExTX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ251dGxzID49IDIuNC4wIiAyPiYxYAotICAgICAgICBlbHNlIAotCSAgICAgICAgR05VVExTX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ251dGxzID49IDIuNC4wIiAyPiYxYAotICAgICAgICBmaQotCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncwotCWVjaG8gIiRHTlVUTFNfUEtHX0VSUk9SUyIgPiY1Ci0KLQk6Ci1lbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCi0gICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQk6Ci1lbHNlCi0JR05VVExTX0NGTEFHUz0kcGtnX2N2X0dOVVRMU19DRkxBR1MKLQlHTlVUTFNfTElCUz0kcGtnX2N2X0dOVVRMU19MSUJTCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCi1maQotCUNGTEFHUz0iJENGTEFHUyAkR05VVExTX0NGTEFHUyIKLQlMSUJTPSIkTElCUyAkR05VVExTX0xJQlMiCi1maQotIGlmIHRlc3QgISAteiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICBIQVZFX0dOVVRMU19UUlVFPQotICBIQVZFX0dOVVRMU19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9HTlVUTFNfVFJVRT0nIycKLSAgSEFWRV9HTlVUTFNfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICEgLXogIiRHTlVUTFNfTElCUyIgOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfR05VVExTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLSMgd2FybiBpZiBuZWl0aGVyIEdudVRMUyBub3IgT3BlblNTTCBhcmUgYXZhaWxhYmxlCi1pZiB0ZXN0IC16ICIkU1NMX0xJQlMiIC1hIC16ICIkR05VVExTX0xJQlMiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5vIGVuY3J5cHRpb24gbGlicmFyeSBjb3VsZCBiZSBmb3VuZC4gKioqCi1BIGxpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQgYnVpbHQgdGhpcyB3YXkgd2lsbCBub3Qgc3VwcG9ydCBTU0wgZW5jcnlwdGlvbi4KLVRvIGVuYWJsZSBTU0wgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzIChwZXJoYXBzIGl0IGlzIG5hbWVkCi1zb21ldGhpbmcgbGlrZSBsaWJzc2wtZGV2IG9yIGdudXRscy1kZXYpIGFuZCBydW4gY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTm8gZW5jcnlwdGlvbiBsaWJyYXJ5IGNvdWxkIGJlIGZvdW5kLiAqKioKLUEgbGlidm5jc2VydmVyL2xpYnZuY2NsaWVudCBidWlsdCB0aGlzIHdheSB3aWxsIG5vdCBzdXBwb3J0IFNTTCBlbmNyeXB0aW9uLgotVG8gZW5hYmxlIFNTTCBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMgKHBlcmhhcHMgaXQgaXMgbmFtZWQKLXNvbWV0aGluZyBsaWtlIGxpYnNzbC1kZXYgb3IgZ251dGxzLWRldikgYW5kIHJ1biBjb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotCXNsZWVwIDUKLWZpCi0KLQotIyBJUHY2Ci0KLQotQCU6QCBDaGVjayB3aGV0aGVyIC0td2l0aC1pcHY2IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pcHY2K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9pcHY2OyAKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9pcHY2IiAhPSAieG5vIjsgdGhlbgotCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGFkZHJpbmZvIiAiYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSVB2NiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRhZGRyaW5mbyBpbiAtbHNvY2tldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRhZGRyaW5mbyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGFkZHJpbmZvICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm89bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm8iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiQCU6QGRlZmluZSBJUHY2IDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIAotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWx3czJfMzIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIGluIC1sd3MyXzMyLi4uICIgPiY2OyB9Ci0JCSAgICAgICAgTElCUz0iJExJQlMgLWx3czJfMzIiCi0JCSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWdldGFkZHJpbmZvKDAsIDAsIDAsIDApOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIAotCQkJCSAgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIElQdjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJICAgICAgICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCQkJICAgICAgCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgICAgICAgICAgICAgCi1maQotCi1maQotCi1maQotCi0KLQotIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWZvciBhY19oZWFkZXIgaW4gYXJwYS9pbmV0LmggZmNudGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdGltZWIuaCBzeXNsb2cuaCB1bmlzdGQuaCB3czJ0Y3BpcC5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLQotZG9uZQotCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2hlYWRlciBpbiBwd2QuaCBzeXMvd2FpdC5oIHV0bXB4LmggdGVybWlvcy5oIHN5cy9pb2N0bC5oIHN5cy9zdHJvcHRzLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZpCi0KLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07Ci0gIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKLSAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotICBjaGFyICoqcHBjOwotICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0gIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0gICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKLSAgICAgZXhwcmVzc2lvbiAqLwotICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0gIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwotICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotICArK3BjcGNjOwotICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKLSAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwotICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gICAgY2hhciB0eDsKLSAgICBjaGFyICp0ID0gJnR4OwotICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgICAqdCsrID0gMDsKLSAgICBpZiAocykgcmV0dXJuIDA7Ci0gIH0KLSAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgICBpbnQgeFtdID0gezI1LCAxN307Ci0gICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgICArK2ZvbzsKLSAgfQotICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgICBpcHRyIHAgPSAwOwotICAgICsrcDsKLSAgfQotICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKLSAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKLSAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7Ci0gIH0KLSAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgICBjb25zdCBpbnQgZm9vID0gMTA7Ci0gICAgaWYgKCFmb28pIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIAotJGFzX2VjaG8gIkAlOkBkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgaW5saW5lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfaW5saW5lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBpbnQgZm9vX3Q7Ci1zdGF0aWMgJGFjX2t3IGZvb190IHN0YXRpY19mb28gKCkge3JldHVybiAwOyB9Ci0kYWNfa3cgZm9vX3QgZm9vICgpIHtyZXR1cm4gMDsgfQotI2VuZGlmCi0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2lubGluZT0kYWNfa3cKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgdGVzdCAiJGFjX2N2X2NfaW5saW5lIiAhPSBubyAmJiBicmVhawotZG9uZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfaW5saW5lIiA+JjY7IH0KLQotY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICAqKQotICAgIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gICAgICBubykgYWNfdmFsPTs7Ci0gICAgICAqKSBhY192YWw9JGFjX2N2X2NfaW5saW5lOzsKLSAgICBlc2FjCi0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBpbmxpbmUgJGFjX3ZhbAotI2VuZGlmCi1fQUNFT0YKLSAgICA7OwotZXNhYwotCi0geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0gICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZm5kZWYgX19BUFBMRV9DQ19fCi0JICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCi0JICAgICAjZW5kaWYKLQkgICAgIHR5cGVkZWYgaW50IGR1bW15OwotCSAgICAKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAKLQkjIENoZWNrIGZvciBwb3RlbnRpYWwgLWFyY2ggZmxhZ3MuICBJdCBpcyBub3QgdW5pdmVyc2FsIHVubGVzcwotCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCi0JYWNfYXJjaD0KLQlhY19wcmV2PQotCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KLQkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0JICAgY2FzZSAkYWNfd29yZCBpbgotCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQotCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgotCQkgYWNfYXJjaD0kYWNfd29yZAotCSAgICAgICBlbHNlCi0JCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKLQkJIGJyZWFrCi0JICAgICAgIGZpCi0JICAgICAgIDs7Ci0JICAgZXNhYwotCSAgIGFjX3ByZXY9Ci0JIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCi0JICAgYWNfcHJldj1hcmNoCi0JIGZpCi0gICAgICAgZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQkgICAKLWludAotbWFpbiAoKQotewotI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAotCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAotCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCi0JICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcwotCSAgICAgI2VuZGlmCi0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotCSAgIAotaW50Ci1tYWluICgpCi17Ci0jaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQotCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLQkgICAgICNlbmRpZgotCSAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0JICAgICAgCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX0JJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCSAgICAgIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBpbnQgYXNjaWlfbW1bXSA9Ci0JCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07Ci0JCXNob3J0IGludCBhc2NpaV9paVtdID0KLQkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKLQkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKLQkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKLQkJfQotCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQotCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OwotCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQotCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OwotCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKLQkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOwotCQl9Ci0JCWV4dGVybiBpbnQgZm9vOwotCSAgICAgIAotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gdXNlX2FzY2lpIChmb28pID09IHVzZV9lYmNkaWMgKGZvbyk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCi0JICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi0JICAgIGZpCi0JICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgotCQlhY19jdl9jX2JpZ2VuZGlhbj1ubwotCSAgICAgIGVsc2UKLQkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/Ci0JCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLQkgICAgICBmaQotCSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgICAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLQkgICAgIHVuaW9uCi0JICAgICB7Ci0JICAgICAgIGxvbmcgaW50IGw7Ci0JICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Ci0JICAgICB9IHU7Ci0JICAgICB1LmwgPSAxOwotCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Ci0JICAgCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQotIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCi0gICB5ZXMpCi0gICAgICRhc19lY2hvICJAJTpAZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKLTs7ICMoCi0gICBubykKLSAgICAgIDs7ICMoCi0gICB1bml2ZXJzYWwpCi0gICAgIAkKLSRhc19lY2hvICJAJTpAZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKLQotICAgICA7OyAjKAotICAgKikKLSAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcwotIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OwotIGVzYWMKLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2l6ZV90IiAiYWNfY3ZfdHlwZV9zaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geHllczsgdGhlbiA6Ci0gIAotZWxzZQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGludAotX0FDRU9GCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGVhZGVyX3RpbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLWludAotbWFpbiAoKQotewotaWYgKChzdHJ1Y3QgdG0gKikgMCkKLXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3lzX3dhaXRfaCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQgaW50KSAoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jIGRlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IHM7Ci0gIHdhaXQgKCZzKTsKLSAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICAKLSRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfdHlwZV9zb2NrbGVuX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotc29ja2xlbl90IGxlbiA9IDQyOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl90eXBlX3NvY2tsZW5fdD15ZXMKLWVsc2UKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl90eXBlX3NvY2tsZW5fdCIgPiY2OyB9Ci0gIGlmIHRlc3QgJGFjX2N2X3R5cGVfc29ja2xlbl90ICE9IHllczsgdGhlbgotICAgICRhc19lY2hvICJAJTpAZGVmaW5lIHNvY2tsZW5fdCBpbnQiID4+Y29uZmRlZnMuaAotCi0gIGZpCi0KLWlmIHRlc3QgISAtZCAuL3JmYjsgdGhlbgotCWVjaG8gImNyZWF0aW5nIHN1YmRpciAuL3JmYiBmb3IgcmZiaW50LmgiCi0JbWtkaXIgLi9yZmIgCi1maQotIyAtLS0tLS0gQUMgQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4uLi4gIiA+JjY7IH0KLWFjX3N0ZGludF9oPWBlY2hvIHJmYi9yZmJpbnQuaGAKLWlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAic3RkaW50LmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPylcIiIgPiY1Ci0kYXNfZWNobyAiXCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9zdGRpbnQuaD8pXCIiID4mNjsgfQotZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjUKLSRhc19lY2hvICJcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjY7IH0KLWVsc2UKLSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogXCIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKVwiIiA+JjUKLSRhc19lY2hvICJcIihwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpXCIiID4mNjsgfQotZmkKLQotaW50dHlwZV9oZWFkZXJzPWBlY2hvIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3lzL2ludHR5cGVzLmggIFwKLXwgc2VkIC1lICdzLywvIC9nJ2AKLQotIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X289Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF91PSJuby1maWxlIgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50cHRyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnRwdHJfdCIgImFjX2N2X3R5cGVfdWludHB0cl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnRwdHJfdCBpbiAkaSAkYW5kNjQiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gJGkgJGFuZDY0IiA+JjY7IH0KLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY1Ci0kYXNfZWNobyAiLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3lzL3R5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVfaW50NjRfdCB0b28pIgotZWxzZQotICBhbmQ2ND0iIgotZmkKLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIG91ciB1X2ludDMyX3QgaW4gJGkgJGFuZDY0IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBvdXIgdV9pbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gZmkKLSBmaQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgTUFZQkUgQyBiYXNpYyB0eXBlcyAtLS0tLS0tLQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgY2hhci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfY2hhcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAoY2hhcikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfY2hhcj0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2NoYXIgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfY2hhciA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgY2hhciIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mIChzaG9ydCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igc2hvcnQiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9TSE9SVCAkYWNfY3Zfc2l6ZW9mX3Nob3J0Ci1fQUNFT0YKLQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBmb3IgYWNfc2l6ZSBpbiA0IDggMSAyIDE2ICA7IGRvICMgTGlzdCBzaXplcyBpbiByb3VnaCBvcmRlciBvZiBwcmV2YWxlbmNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLXN3aXRjaCAoMCkgY2FzZSAwOiBjYXNlIChzaXplb2YgKGludCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfaW50PSRhY19zaXplCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHRlc3QgeCRhY19jdl9zaXplb2ZfaW50ICE9IHggOyB0aGVuIGJyZWFrOyBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2ludCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgaW50IiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKLV9BQ0VPRgotCi0KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfbG9uZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAobG9uZykgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfbG9uZz0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmcgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfbG9uZyA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgbG9uZyIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZwotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQqIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygdm9pZCouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRwKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICh2b2lkKikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfdm9pZHA9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igdm9pZCoiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfdm9pZHAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfdm9pZHAiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIFNJWkVPRl9WT0lEUCAkYWNfY3Zfc2l6ZW9mX3ZvaWRwCi1fQUNFT0YKLQotCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgU1RBUlQgaGVhZGVyIC0tLS0tLS0tLS0tLS0KLV9hY19zdGRpbnRfaD1gJGFzX2VjaG8gIl8kYWNfc3RkaW50X2giIHwgJGFzX3RyX2NwcGAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjUKLSRhc19lY2hvICJjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjY7IH0KLWVjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNpZm5kZWYiIF9HRU5FUkFURURfU1RESU5UX0ggPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50X2gKLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyBhIGdudSBjb21waWxlciB2ZXJzaW9uIiBgJENDIC0tdmVyc2lvbmAgIiovIiBcCi0gID4+JGFjX3N0ZGludF9oCi1lbHNlCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyAkQ0MgKi8iID4+JGFjX3N0ZGludF9oCi1maQotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gU2VlIGlmIGludF9sZWFzdCBhbmQgaW50X2Zhc3QgdHlwZXMgYXJlIHByZXNlbnQKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnRfZmFzdDMyX3QiICJhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgIiNpbmNsdWRlPCRhY19jdl9oZWFkZXJfc3RkaW50PgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1maQotCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiAhPSAic3RkZGVmLmgiIDsgdGhlbgotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRpbnQuaCIgOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgaW5jbHVkZSBzdGRkZWYuaCIgPiY2OyB9Ci0gICBlY2hvICIjaW5jbHVkZSA8c3RkZGVmLmg+IiA+PiRhY19zdGRpbnRfaAotZmkgOyBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGluY2x1ZGUgJGFjX2N2X2hlYWRlcl9zdGRpbnQiID4mNjsgfQotICAgZWNobyAiI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50PiIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiIgPj4kYWNfc3RkaW50X2gKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGhlYWRlciBTVEFSVCBiYXNpYyBpbnQgdHlwZXMgLS0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIG5lZWQgdG8gbG9vayBhdCBDIGJhc2ljIHR5cGVzIiA+JjUKLSRhc19lY2hvICIuLi4gbmVlZCB0byBsb29rIGF0IEMgYmFzaWMgdHlwZXMiID4mNjsgfQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGJzZC9zeXN2IHR5cGVkZWZzIiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBic2Qvc3lzdiB0eXBlZGVmcyIgPiY2OyB9Ci0gICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogaW50OF90IGludDE2X3QgaW50MzJfdCBkZWZpbmVkIGJ5IGluZXQgY29kZSwgcmVkZWNsYXJlIHRoZSB1X2ludFhYIHR5cGVzICovCi10eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Ci10eXBlZGVmIHVfaW50MTZfdCB1aW50MTZfdDsKLXR5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OwotRU9GCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIGdsaWJjIGNvbXBhdGliaWxpdHkgKi8KLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi0jZW5kaWYKLUVPRgotZmkKLQotYWNfY3Zfc2l6ZW9mX3g9IiRhY19jdl9zaXplb2ZfY2hhcjokYWNfY3Zfc2l6ZW9mX3Nob3J0IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX2ludCIKLWFjX2N2X3NpemVvZl9YPSIkYWNfY3Zfc2l6ZW9mX1g6JGFjX2N2X3NpemVvZl92b2lkcDokYWNfY3Zfc2l6ZW9mX2xvbmciCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPSAic3RkZGVmLmgiIDsgdGhlbgotIyAgIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLAotIyB0aGVyZSBhIGZldyAzMi1iaXQtb25seSBkc3Atc3lzdGVtcy4gbmliYmxlLWFkZHJlc3NhYmxlIHN5c3RlbXMgYXJlIHdheSBvZmYuCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAtLS0tLS0tLS0tLS0gQklUU1BFQ0lGSUMgSU5UVFlQRVMgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICAgIHQ9InR5cGVkZWZzIGZvciBhIgotICAgIGNhc2UgIiRhY19jdl9zaXplb2ZfWCIgaW4KLSAgICAgMToyOjI6Mjo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDE2LWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAxNi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAxNi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjI6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0ICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDMyLWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCAzMi1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQiID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0Ojg6OCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nICR0IG5vcm1hbCA2NC1iaXQgc3lzdGVtIiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyAkdCBub3JtYWwgNjQtYml0IHN5c3RlbSIgPiY2OyB9Ci0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIG5vcm1hbCA2NC1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDY0LWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMzItYml0IiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAqKQotICAgIGFzX2ZuX2Vycm9yICQ/ICIgJGFjX2N2X3NpemVvZl9YICB3aGF0IGlzIHRoYXQgYSBzeXN0ZW0/IGNvbnRhY3QgdGhlIGF1dGhvciwgcXVpY2shIGh0dHA6Ly9hYy1hcmNoaXZlLnNmLm5ldCIgIiRMSU5FTk8iIDUKLSAgICBleGl0IDEKLTs7Ci0gICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBiYXNpYyBpbnQgdHlwZXMgU1RBUlQgaW50NjRfdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiCi10aGVuIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBnb29kIHVpbnQ2NF90IiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgZ29vZCB1aW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotI2VuZGlmCi1FT0YKLQotZWxpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91X2ludDY0X3QiID0gInllcyIKLXRoZW4geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB0eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdCIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBzeXN0ZW0gaGVhZGVycyBoYXZlIGFuIHVfaW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotZWxzZSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcyIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSA2NCBCSVQgR0VORVJJQyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCi0jaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKLQotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXwotI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXwotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIF9faW50NjQgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX19NV0VSS1NfXyB8fCBkZWZpbmVkIF9fRUxGX18KLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCi0KLSNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLSAgLyogY29tcGlsZXIvY3B1IHR5cGUgLi4uIG9yIGp1c3QgSVNPIEM5OSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotCi0jIHBsdXMgYSBkZWZhdWx0IDY0LWJpdCBmb3Igc3lzdGVtcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgNjQtYml0IHJlYWR5Ci0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIgaW4KLSAgICAxOjI6ODo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY2OyB9Ci1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIG5vcm1hbCA2NC1iaXQgc3lzdGVtLCBDQyBoYXMgc2l6ZW9mKGxvbmcgYW5kIHZvaWQqKSA9PSA4IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgIDE6Mjo0OjgpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjY7IH0KLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjg6NCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNjsgfQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiA2NC1iaXQgZGVyaXZlZCBmcm9tIGEgMzItYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDQgYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgKikKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogTk9URTogKi8KLS8qIHRoZSBjb25maWd1cmUtY2hlY2tzIGZvciB0aGUgYmFzaWMgdHlwZXMgZGlkIG5vdCBtYWtlIHVzIGJlbGlldmUgKi8KLS8qIHRoYXQgd2UgY291bGQgYWRkIGEgZmFsbGJhY2sgdG8gYSAnbG9uZyBsb25nJyB0eXBlZGVmIHRvIGludDY0X3QgKi8KLUVPRgotICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnQ2NF90IHR5cGVzIFNUQVJUIGludHB0ciB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVFIgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICBjYXNlICIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl92b2lkcCIgaW4KLSAgMToyOjIpCi0gICAgYT0iaW50MTZfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDIgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMTYtYml0ICovCi0KLXR5cGVkZWYgdWludDE2X3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MTZfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo0KQotICAgIGE9ImludDMyX3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA0IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDMyLWJpdCAqLwotCi10eXBlZGVmIHVpbnQzMl90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDMyX3QgIGludHB0cl90OwotRU9GCi07OwotICAxOjI6OCkKLSAgICBhPSJpbnQ2NF90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgOCBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCA2NC1iaXQgKi8KLQotdHlwZWRlZiB1aW50NjRfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQ2NF90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgKikKLSAgICBhPSJsb25nIiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgYnV0IGdvdCBubyBndWVzcywgaGVuY2Ugd2UgZGVjbGFyZSBpdCBhcyBpZiBsb25nICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgIGludHB0cl90OwotRU9GCi07OwotICBlc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdHlwZWRlZiAkYSBpbnRwdHJfdCIgPiY2OyB9Ci1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnRwdHIgdHlwZXMgU1RBUlQgaW50X2xlYXN0IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAibm8iOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyBpbnRfbGVhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2xlYXN0LXR5cGVzIiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tR0VORVJJQyBJTlRfTEVBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0gIm5vIjsgdGhlbgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMiID4mNjsgfQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9GQVNUIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmICBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmICBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfZmFzdDhfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiBpbnQ2NF90ICAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGludCAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBET05FICRhY19zdGRpbnRfaCIgPiY1Ci0kYXNfZWNobyAiLi4uIERPTkUgJGFjX3N0ZGludF9oIiA+JjY7IH0KLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0gIC8qIG9uY2UgKi8KLSNlbmRpZgotI2VuZGlmCi1FT0YKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5fYWRkcl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbl9hZGRyX3QuLi4gIiA+JjY7IH0KLWlmICR7dm5jX2N2X2luYWRkcnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAKLSAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotaW50Ci1tYWluICgpCi17Ci1pbl9hZGRyX3QgZm9vOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBpbmFkZHJ0PXllcwotZWxzZQotICBpbmFkZHJ0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0LAotICAgICAgICAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHZuY19jdl9pbmFkZHJ0IiA+JjUKLSRhc19lY2hvICIkdm5jX2N2X2luYWRkcnQiID4mNjsgfQotCi1pZiB0ZXN0ICRpbmFkZHJ0ID0gbm8gOyB0aGVuCi0gICRhc19lY2hvICJAJTpAZGVmaW5lIE5FRURfSU5BRERSX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0jIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiBtZW1jbXAgYXJlIG5vdCA4LWJpdCBjbGVhbi4gICovCi0gIGNoYXIgYzAgPSAnXDEwMCcsIGMxID0gJ1wyMDAnLCBjMiA9ICdcMjAxJzsKLSAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCi0gICAgIG9yIG1vcmUgYW5kIHdpdGggYXQgbGVhc3Qgb25lIGJ1ZmZlciBub3Qgc3RhcnRpbmcgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0gICAgIFdpbGxpYW0gTGV3aXMgcHJvdmlkZWQgdGhpcyB0ZXN0IHByb2dyYW0uICAgKi8KLSAgewotICAgIGNoYXIgZm9vWzIxXTsKLSAgICBjaGFyIGJhclsyMV07Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgIHsKLQljaGFyICphID0gZm9vICsgaTsKLQljaGFyICpiID0gYmFyICsgaTsKLQlzdHJjcHkgKGEsICItLS0tLS0tLTAxMTExMTExIik7Ci0Jc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwotCWlmIChtZW1jbXAgKGEsIGIsIDE2KSA+PSAwKQotCSAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjY7IH0KLXRlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIG1lbWNtcC4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxzdGF0IGNvcnJlY3RseSBoYW5kbGVzIHRyYWlsaW5nIHNsYXNoIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2guLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3Quc3ltIGNvbmZ0ZXN0LmZpbGUKLWVjaG8gPmNvbmZ0ZXN0LmZpbGUKLWlmIHRlc3QgIiRhc19sbl9zIiA9ICJsbiAtcyIgJiYgbG4gLXMgY29uZnRlc3QuZmlsZSBjb25mdGVzdC5zeW07IHRoZW4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotc3RydWN0IHN0YXQgc2J1ZjsKLSAgICAgLyogTGludXggd2lsbCBkZXJlZmVyZW5jZSB0aGUgc3ltbGluayBhbmQgZmFpbCwgYXMgcmVxdWlyZWQgYnkgUE9TSVguCi0JVGhhdCBpcyBiZXR0ZXIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWVhbnMgd2Ugd2lsbCBub3QKLQloYXZlIHRvIGNvbXBpbGUgYW5kIHVzZSB0aGUgbHN0YXQgd3JhcHBlci4gICovCi0gICAgIHJldHVybiBsc3RhdCAoImNvbmZ0ZXN0LnN5bS8iLCAmc2J1ZikgPT0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZWxzZQotICAjIElmIHRoZSBgbG4gLXMnIGNvbW1hbmQgZmFpbGVkLCB0aGVuIHdlIHByb2JhYmx5IGRvbid0IGV2ZW4KLSAgIyBoYXZlIGFuIGxzdGF0IGZ1bmN0aW9uLgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KLWZpCi1ybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNjsgfQotCi10ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsgPSB5ZXMgJiYKLSAgCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLV9BQ0VPRgotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhubzsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgbHN0YXQuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQkAmdEBPQkpTPSIkTElCQCZ0QE9CSlMgbHN0YXQuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgYWNjZXB0cyBhbiBlbXB0eSBzdHJpbmcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnPXllcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3Qgc3RhdCBzYnVmOwotICByZXR1cm4gc3RhdCAoIiIsICZzYnVmKSA9PSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9bm8KLWVsc2UKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWciID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyA9IHllczsgdGhlbgotICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KLSAgKiIgc3RhdC4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCQCZ0QE9CSlM9IiRMSUJAJnRAT0JKUyBzdGF0LiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotICAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgMQotX0FDRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHN0cmZ0aW1lCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmZ0aW1lIiAiYWNfY3ZfZnVuY19zdHJmdGltZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1NUUkZUSU1FIDEKLV9BQ0VPRgotIAotZWxzZQotICAjIHN0cmZ0aW1lIGlzIGluIC1saW50bCBvbiBTQ08gVU5JWC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cmZ0aW1lIGluIC1saW50bCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzdHJmdGltZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHN0cmZ0aW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPXllcwotZWxzZQotICBhY19jdl9saWJfaW50bF9zdHJmdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU1RSRlRJTUUgMSIgPj5jb25mZGVmcy5oCi0KLUxJQlM9Ii1saW50bCAkTElCUyIKLWZpCi0KLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHZwcmludGYKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidnByaW50ZiIgImFjX2N2X2Z1bmNfdnByaW50ZiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192cHJpbnRmIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfVlBSSU5URiAxCi1fQUNFT0YKLSAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIl9kb3BybnQiICJhY19jdl9mdW5jX19kb3BybnQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX2RvcHJudCIgPSB4eWVzOyB0aGVuIDoKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0RPUFJOVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotZmkKLWRvbmUKLQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJwaWRfdCIgImFjX2N2X3R5cGVfcGlkX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9waWRfdCIgPSB4eWVzOyB0aGVuIDoKLSAgCi1lbHNlCi0gIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBwaWRfdCBpbnQKLV9BQ0VPRgotCi1maQotCi1mb3IgYWNfaGVhZGVyIGluIHZmb3JrLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInZmb3JrLmgiICJhY19jdl9oZWFkZXJfdmZvcmtfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmZvcmtfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX1ZGT1JLX0ggMQotX0FDRU9GCi0gCi1maQotCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIAotZmkKLWRvbmUKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2ZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yay4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mdW5jX2Zvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgIC8qIEJ5IFJ1ZWRpZ2VyIEt1aGxtYW5uLiAqLwotCSAgcmV0dXJuIGZvcmsgKCkgPCAwOwotCQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNjsgfQotCi1lbHNlCi0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCi1maQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCi0gIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotYW1pZ2FvcyogfCAqLSotbXNkb3NkamdwcCopCi0gICAgICAjIE92ZXJyaWRlLCBhcyB0aGVzZSBzeXN0ZW1zIGhhdmUgb25seSBhIGR1bW15IGZvcmsoKSBzdHViCi0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9yayIgPSB4eWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZnVuY192Zm9ya193b3Jrcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1jcm9zcwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZkZWYgSEFWRV9WRk9SS19ICi0jIGluY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LiAgVGhlIGNvbXBpbGVyCi0gICBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sIGJ1dCBzb21lIGNvbXBpbGVycwotICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4gIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQotICAgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzCi0gICBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSMgZWxzZQotc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgc3RhdGljIHBpZF90IGNoaWxkOwotICBpZiAoIWNoaWxkKSB7Ci0gICAgY2hpbGQgPSB2Zm9yayAoKTsKLSAgICBpZiAoY2hpbGQgPCAwKSB7Ci0gICAgICBwZXJyb3IgKCJ2Zm9yayIpOwotICAgICAgX2V4aXQoMik7Ci0gICAgfQotICAgIGlmICghY2hpbGQpIHsKLSAgICAgIGFyZyA9IGdldHBpZCgpOwotICAgICAgd3JpdGUoLTEsICIiLCAwKTsKLSAgICAgIF9leGl0IChhcmcpOwotICAgIH0KLSAgfQotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOwotICBwaWRfdCBjaGlsZDsKLQotICBzcGFyY19hZGRyZXNzX3Rlc3QgKDApOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuICBUaGlzCi0gICAgICAgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdCBhcyBtYW55IGxvY2FsCi0gICAgICAgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIgaW5jbHVkaW5nIGNvbXBpbGVyCi0gICAgICAgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvciBnY2MgMS40MC4zIG9uIGEgU29sYXJpcwotICAgICAgIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4gIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkCi0gICAgICAgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudCBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsCi0gICAgICAgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0IHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlCi0gICAgICAgaW4gdGhpcyByb3V0aW5lLiAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMKLSAgICAgICBtdW5nZSBwYXJlbnQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLCB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudAotICAgICAgIGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yCi0gICAgICAgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLCB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvcgotICAgICAgIGFzIHdlbGwuICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICByZXR1cm4gKAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNjsgfQotCi1maTsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQotZmkKLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSB2Zm9yayBmb3JrIiA+PmNvbmZkZWZzLmgKLQotZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgCi0kYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIEhBVkVfTElCTlNMIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc29ja2V0X3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzb2NrZXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzb2NrZXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotQCU6QGRlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCi1fQUNFT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZmkKLQotCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JIyBuZWVkIC1sc2VjIGZvciBnZXRzcG5hbSgpCi0JTERGTEFHUz0iJExERkxBR1MgLWxzZWMiCi1maQotCi1mb3IgYWNfZnVuYyBpbiBmdGltZSBnZXRob3N0YnluYW1lIGdldGhvc3RuYW1lIGdldHRpbWVvZmRheSBpbmV0X250b2EgbWVtbW92ZSBtZW1zZXQgbW1hcCBta2ZpZm8gc2VsZWN0IHNvY2tldCBzdHJjaHIgc3RyY3NwbiBzdHJkdXAgc3RyZXJyb3Igc3Ryc3RyCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2Z1bmMgaW4gc2V0c2lkIHNldHBncnAgZ2V0cHd1aWQgZ2V0cHduYW0gZ2V0c3BuYW0gZ2V0dWlkIGdldGV1aWQgc2V0dWlkIHNldGdpZCBzZXRldWlkIHNldGVnaWQgaW5pdGdyb3VwcyB3YWl0cGlkIHNldHV0eGVudCBncmFudHB0IHNobWF0Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi1AJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSAKLWZpCi1kb25lCi0KLWZpCi0KLSMgY2hlY2ssIGlmIHNobWdldCBpcyBpbiBjeWdpcGMuYQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2htZ2V0IGluIC1sY3lnaXBjIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaG1nZXQgaW4gLWxjeWdpcGMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGN5Z2lwYyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2htZ2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2htZ2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0PXllcwotZWxzZQotICBhY19jdl9saWJfY3lnaXBjX3NobWdldD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3lnaXBjX3NobWdldCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLUAlOkBkZWZpbmUgSEFWRV9MSUJDWUdJUEMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxjeWdpcGMgJExJQlMiCi0KLWZpCi0KLSBpZiB0ZXN0ICIkSEFWRV9DWUdJUEMiID0gInRydWUiOyB0aGVuCi0gIENZR0lQQ19UUlVFPQotICBDWUdJUENfRkFMU0U9JyMnCi1lbHNlCi0gIENZR0lQQ19UUlVFPScjJwotICBDWUdJUENfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2sgaWYgL3Vzci9pbmNsdWRlL2xpbnV4IGV4aXN0cywgaWYgc28sIGRlZmluZSBMSU5VWAotIGlmIHRlc3QgLWQgL3Vzci9pbmNsdWRlL2xpbnV4OyB0aGVuCi0gIExJTlVYX1RSVUU9Ci0gIExJTlVYX0ZBTFNFPScjJwotZWxzZQotICBMSU5VWF9UUlVFPScjJwotICBMSU5VWF9GQUxTRT0KLWZpCi0KLQotIyBDaGVjayBmb3IgT1MgWCBzcGVjaWZpYyBoZWFkZXIKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaCIgImFjX2N2X2hlYWRlcl9BcHBsaWNhdGlvblNlcnZpY2VzX0FwcGxpY2F0aW9uU2VydmljZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfQXBwbGljYXRpb25TZXJ2aWNlc19BcHBsaWNhdGlvblNlcnZpY2VzX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfT1NYPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfT1NYIiA9ICJ0cnVlIjsgdGhlbgotICBPU1hfVFJVRT0KLSAgT1NYX0ZBTFNFPScjJwotZWxzZQotICBPU1hfVFJVRT0nIycKLSAgT1NYX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrIGZvciBBbmRyb2lkIHNwZWNpZmljIGhlYWRlcgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImFuZHJvaWQvYXBpLWxldmVsLmgiICJhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9BTkRST0lEPSJ0cnVlIgotZmkKLQotCi0gaWYgdGVzdCAiJEhBVkVfQU5EUk9JRCIgPSAidHJ1ZSI7IHRoZW4KLSAgQU5EUk9JRF9UUlVFPQotICBBTkRST0lEX0ZBTFNFPScjJwotZWxzZQotICBBTkRST0lEX1RSVUU9JyMnCi0gIEFORFJPSURfRkFMU0U9Ci1maQotCi1pZiB0ZXN0ICIkSEFWRV9BTkRST0lEIiA9ICJ0cnVlIjsgdGhlbgotCQotJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9BTkRST0lEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIE9uIFNvbGFyaXMgMi43LCB3cml0ZSgpIHJldHVybnMgRU5PRU5UIHdoZW4gaXQgcmVhbGx5IG1lYW5zIEVBR0FJTgotCi1jYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLSAgICAiU3VuT1MgNS43IikKLQkkYXNfZWNobyAiQCU6QGRlZmluZSBFTk9FTlRfV09SS0FST1VORCAxIiA+PmNvbmZkZWZzLmgKLQotICAgIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIHJwbSBTT1VSQ0VTIHBhdGgKLXByaW50ZiAiY2hlY2tpbmcgZm9yIHJwbSBzb3VyY2VzIHBhdGguLi4gIgotUlBNU09VUkNFRElSPSJOT1QtRk9VTkQiCi1mb3IgZGlyZWN0b3J5IGluIHBhY2thZ2VzIE9wZW5MaW51eCByZWRoYXQgUmVkSGF0IHJwbSBSUE0gIiIgOyBkbwotCWlmIHRlc3QgLWQgL3Vzci9zcmMvJHtkaXJlY3Rvcnl9L1NPVVJDRVM7IHRoZW4KLQkJUlBNU09VUkNFRElSPSIvdXNyL3NyYy8ke2RpcmVjdG9yeX0vU09VUkNFUy8iCi0JZmkKLWRvbmUKLWVjaG8gIiRSUE1TT1VSQ0VESVIiCi0gaWYgdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCI7IHRoZW4KLSAgSEFWRV9SUE1fVFJVRT0KLSAgSEFWRV9SUE1fRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfUlBNX1RSVUU9JyMnCi0gIEhBVkVfUlBNX0ZBTFNFPQotZmkKLQotIGlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLSAgV0lUSF9YMTFWTkNfVFJVRT0KLSAgV0lUSF9YMTFWTkNfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfWDExVk5DX1RSVUU9JyMnCi0gIFdJVEhfWDExVk5DX0ZBTFNFPQotZmkKLQotCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBsaWJ2bmNzZXJ2ZXIucGMgbGlidm5jY2xpZW50LnBjIGxpYnZuY3NlcnZlci9NYWtlZmlsZSBleGFtcGxlcy9NYWtlZmlsZSBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIHZuY3Rlcm0vTWFrZWZpbGUgd2ViY2xpZW50cy9NYWtlZmlsZSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIHdlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlIGxpYnZuY2NsaWVudC9NYWtlZmlsZSBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUgdGVzdC9NYWtlZmlsZSBsaWJ2bmNzZXJ2ZXItY29uZmlnIExpYlZOQ1NlcnZlci5zcGVjIgotCi0jCi0jIHgxMXZuYyBvbmx5OgotIwotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCSMKLQkjIE5PVEU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIExpYlZOQ1NlcnZlci1YLlkuWi50YXIuZ3ogc291cmNlCi0JIyB0YXJiYWxsIGFuZCBuZXZlcnRoZWxlc3Mgd2FudCB0byBydW4gYXV0b2NvbmYgKGkuZS4gYWNsb2NhbCwKLQkjIGF1dG9oZWFkZXIsIGF1dG9tYWtlLCBhdXRvY29uZikgQUdBSU4gKHBlcmhhcHMgeW91IGhhdmUgYQotCSMgc3BlY2lhbCB0YXJnZXQgc3lzdGVtLCBlLmcuIGVtYmVkZGVkKSB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KLQkjIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgJ0FDX0NPTkZJR19GSUxFUycgbGluZSB0byBhdm9pZAotCSMgYXV0b21ha2UgZXJyb3IgbWVzc2FnZXMgbGlrZToKLQkjCi0JIyBjb25maWd1cmUuYWM6NjkwOiByZXF1aXJlZCBmaWxlIGB4MTF2bmMvTWFrZWZpbGUuaW4nIG5vdCBmb3VuZAotCSMKLQlhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgeDExdm5jL01ha2VmaWxlIHgxMXZuYy9taXNjL01ha2VmaWxlIHgxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlIgotCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiIC1hICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInhubyI7IHRoZW4KLQkJIyBuZWVkIHRvIG1vdmUgbG9jYWwgdGFyYmFsbCByZmIgaGVhZGVycyBhc2lkZToKLQkJaGRycz0icmZiLmggcmZiY2xpZW50LmggcmZicHJvdG8uaCByZmJyZWdpb24uaCByZmJpbnQuaCIKLQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgYXNpZGUgaGVhZGVycyAkaGRycyIKLQkJZm9yIGhkciBpbiAkaGRycwotCQlkbwotCQkJaWYgdGVzdCAtZiAicmZiLyRoZHIiOyB0aGVuCi0JCQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgcmZiLyRoZHIgdG8gcmZiLyRoZHIuT1JJRyIKLQkJCQltdiByZmIvJGhkciByZmIvJGhkci5PUklHCi0JCQlmaQotCQlkb25lCi0JCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogKk5PVEUqIG1vdmUgdGhlbSBiYWNrIG1hbnVhbGx5IHRvIHN0YXJ0IG92ZXIuIgotCWZpCi1maQotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIKLQotY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KLSMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0jIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMuCi0KLV9BQ0VPRgotCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCi0gICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0JY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgotICAgICAgZWxzZQotICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCi0gICAgICAgICovKiB8ID86KikKLQkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKLQkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCi0gICAgICAgICopCi0JICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi1hY19saWJvYmpzPQotYWNfbHRsaWJvYmpzPQotVT0KLWZvciBhY19pIGluIDogJExJQkAmdEBPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0gICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKLSAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0gIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCQCZ0QE9CSlM9JGFjX2xpYm9ianMKLQotTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKLQotCi0gaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgYW1fX0VYRUVYVF9UUlVFPQotICBhbV9fRVhFRVhUX0ZBTFNFPScjJwotZWxzZQotICBhbV9fRVhFRVhUX1RSVUU9JyMnCi0gIGFtX19FWEVFWFRfRkFMU0U9Ci1maQotCi1pZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfRkZNUEVHX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9GRk1QRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTVAzTEFNRV9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX01QM0xBTUVfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX01QM0xBTUVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU1NMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTU0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfWDExX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfWDExX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9YMTFcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke09TWF9PUEVOR0xfVFJVRX0iICYmIHRlc3QgLXogIiR7T1NYX09QRU5HTF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWF9PUEVOR0xcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUFRIUkVBRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlBUSFJFQURfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlBUSFJFQURcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke1dJVEhfV0VCU09DS0VUU19UUlVFfSIgJiYgdGVzdCAteiAiJHtXSVRIX1dFQlNPQ0tFVFNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1dFQlNPQ0tFVFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCWl9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQlpfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlpcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCSlBFR19UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQkpQRUdfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQkpQRUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCUE5HX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJQTkdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCU0RMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJTRExcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCR1RLX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJHVEtcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke01JTkdXX1RSVUV9IiAmJiB0ZXN0IC16ICIke01JTkdXX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTUlOR1dcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0IC16ICIke0hBVkVfR05VVExTX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfR05VVExTX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9HTlVUTFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKLWZpCi0KLWlmIHRlc3QgLXogIiR7Q1lHSVBDX1RSVUV9IiAmJiB0ZXN0IC16ICIke0NZR0lQQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkNZR0lQQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7TElOVVhfVFJVRX0iICYmIHRlc3QgLXogIiR7TElOVVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJMSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7T1NYX1RSVUV9IiAmJiB0ZXN0IC16ICIke09TWF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk9TWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7QU5EUk9JRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTkRST0lEX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU5EUk9JRFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9SUE1fVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9SUE1fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1JQTVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9YMTFWTkNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1gxMVZOQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLQotOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCi1hY193cml0ZV9mYWlsPTAKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWFzX3dyaXRlX2ZhaWw9MAotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gQCU6QCgKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gQCU6QCgKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotYXNfbXlzZWxmPQotY2FzZSAkMCBpbiBAJTpAKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotCi1AJTpAIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBPdXRwdXQgImBiYXNlbmFtZSBAU3xAMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLUAlOkAgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotQCU6QCBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19IEAlOkAgYXNfZm5fZXJyb3IKLQotCi1AJTpAIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFNldCBAU3xAPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KLWFzX2ZuX3NldF9zdGF0dXMgKCkKLXsKLSAgcmV0dXJuICQxCi19IEAlOkAgYXNfZm5fc2V0X3N0YXR1cwotCi1AJTpAIGFzX2ZuX2V4aXQgU1RBVFVTCi1AJTpAIC0tLS0tLS0tLS0tLS0tLS0tCi1AJTpAIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KLWFzX2ZuX2V4aXQgKCkKLXsKLSAgc2V0ICtlCi0gIGFzX2ZuX3NldF9zdGF0dXMgJDEKLSAgZXhpdCAkMQotfSBAJTpAIGFzX2ZuX2V4aXQKLQotQCU6QCBhc19mbl91bnNldCBWQVIKLUAlOkAgLS0tLS0tLS0tLS0tLS0tCi1AJTpAIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci1AJTpAIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQCU6QCBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi1AJTpAIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLUAlOkAgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLUAlOkAgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi1AJTpAIGFzX2ZuX2FyaXRoIEFSRy4uLgotQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotQCU6QCBnbG9iYWwgQFN8QGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi1AJTpAIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzIEBTfEAoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCi0gICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXBSJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXBSJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotCi1AJTpAIGFzX2ZuX21rZGlyX3AKLUAlOkAgLS0tLS0tLS0tLS0tLQotQCU6QCBDcmVhdGUgIkBTfEBhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSBAJTpAIGFzX2ZuX21rZGlyX3AKLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi0KLUAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKLUAlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUAlOkAgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgotYXNfZm5fZXhlY3V0YWJsZV9wICgpCi17Ci0gIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKLX0gQCU6QCBhc19mbl9leGVjdXRhYmxlX3AKLWFzX3Rlc3RfeD0ndGVzdCAteCcKLWFzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTRU9GCi10ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCi0jIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi1hY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBMaWJWTkNTZXJ2ZXIgJGFzX21lIDAuOS45LCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLSAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCi0gIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKLSAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotICAkICQwICRACi0KLW9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotIgotCi1fQUNFT0YKLQotY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Ci1lc2FjCi0KLWNhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OwotZXNhYwotCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLWNvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWFjX2NzX3VzYWdlPSJcCi1cYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKLWZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwotYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KLQotICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAotICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKLSAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0gCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKLQotQ29uZmlndXJhdGlvbiBmaWxlczoKLSRjb25maWdfZmlsZXMKLQotQ29uZmlndXJhdGlvbiBoZWFkZXJzOgotJGNvbmZpZ19oZWFkZXJzCi0KLUNvbmZpZ3VyYXRpb24gY29tbWFuZHM6Ci0kY29uZmlnX2NvbW1hbmRzCi0KLVJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1MaWJWTkNTZXJ2ZXIgY29uZmlnLnN0YXR1cyAwLjkuOQotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAotICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKLQotQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLU1LRElSX1A9JyRNS0RJUl9QJwotQVdLPSckQVdLJwotdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCi1hY19uZWVkX2RlZmF1bHRzPToKLXdoaWxlIHRlc3QgJCMgIT0gMAotZG8KLSAgY2FzZSAkMSBpbgotICAtLSo9PyopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gIC0tKj0pCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9Ci0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQotICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwotCi0gICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICRTSEVMTCAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi0gIHNoaWZ0Ci0gIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Ci0gIENPTkZJR19TSEVMTD0nJFNIRUxMJwotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gIGV4ZWMgIlwkQCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uL0AlOkBAJTpAIC87cy8uLi4kLyBAJTpAQCU6QC87cDt4O3A7eCcgPDxfQVNCT1gKLUAlOkBAJTpAIFJ1bm5pbmcgJGFzX21lLiBAJTpAQCU6QAotX0FTQk9YCi0gICRhc19lY2hvICIkYWNfbG9nIgotfSA+JjUKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotUEFDS0FHRT0iJFBBQ0tBR0UiCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgInJmYmNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyByZmJjb25maWcuaCIgOzsKLSAgICAicmZiL3JmYmNvbmZpZy5oIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIHJmYi9yZmJjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyLnBjIiA7OwotICAgICJsaWJ2bmNjbGllbnQucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jY2xpZW50LnBjIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyL01ha2VmaWxlIiA7OwotICAgICJleGFtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAiZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIiA7OwotICAgICJ2bmN0ZXJtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3Rlcm0vTWFrZWZpbGUiIDs7Ci0gICAgIndlYmNsaWVudHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9NYWtlZmlsZSIgOzsKLSAgICAid2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIiA7OwotICAgICJ3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIgOzsKLSAgICAibGlidm5jY2xpZW50L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY2NsaWVudC9NYWtlZmlsZSIgOzsKLSAgICAiY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXItY29uZmlnIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci1jb25maWciIDs7Ci0gICAgIkxpYlZOQ1NlcnZlci5zcGVjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIExpYlZOQ1NlcnZlci5zcGVjIiA7OwotICAgICJ4MTF2bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL01ha2VmaWxlIiA7OwotICAgICJ4MTF2bmMvbWlzYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB4MTF2bmMvbWlzYy9NYWtlZmlsZSIgOzsKLSAgICAieDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIgOzsKLQotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0gYWNfdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICA6ICIke2FjX3RtcDo9JHRtcH0iCi0gIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQotYWNfdG1wPSR0bXAKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xccicKLWVsc2UKLSAgYWNfY3NfYXdrX2NyPSRhY19jcgotZmkKLQotZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKLV9BQ0VPRgotCi0KLXsKLSAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKLSAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgotICBlY2hvICJfQUNFT0YiCi19ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0gIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCi0gIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotcm0gLWYgY29uZiQkc3Vicy5zaAotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKLV9BQ0VPRgotc2VkIC1uICcKLWgKLXMvXi9TWyIvOyBzLyEuKi8iXT0vCi1wCi1nCi1zL15bXiFdKiEvLwotOnJlcGwKLXQgcmVwbAotcy8nIiRhY19kZWxpbSInJC8vCi10IGRlbGltCi06bmwKLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwotcAotbgotYiByZXBsCi06bW9yZTEKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBubAotOmRlbGltCi1oCi1zL1woLlx7MTQ4XH1cKS4uKi9cMS8KLXQgbW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCi1wCi1iCi06bW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBkZWxpbQotJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJwotL15bXiIiXS97Ci0gIE4KLSAgcy9cbi8vCi19Ci0nID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi1ybSAtZiBjb25mJCRzdWJzLmF3awotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNBV0sKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCi0gIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi0KLX0KLXsKLSAgbGluZSA9ICQgMAotICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKLSAgc3Vic3RlZCA9IDAKLSAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQotICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7Ci0gICAga2V5ID0gZmllbGRbaV0KLSAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQotICAgIGlmIChTX2lzX3NldFtrZXldKSB7Ci0gICAgICB2YWx1ZSA9IFNba2V5XQotICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQotICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKLSAgICAgIHN1YnN0ZWQgPSAxCi0gICAgfSBlbHNlCi0gICAgICBsZW4gKz0gMSArIGtleWxlbgotICB9Ci0KLSAgcHJpbnQgbGluZQotfQotCi1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotX0FDRU9GCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKLWgKLXMvLy8KLXMvXi86Lwotcy9bCSBdKiQvOi8KLXMvOlwkKHNyY2Rpcik6LzovZwotcy86XCR7c3JjZGlyfTovOi9nCi1zLzpAc3JjZGlyQDovOi9nCi1zL146Ki8vCi1zLzoqJC8vCi14Ci1zL1woPVsJIF0qXCkuKi9cMS8KLUcKLXMvXG4vLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKLSAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLSMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAotIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCi0jIG5ld2xpbmUgc2VxdWVuY2VzLgotCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotc2VkIC1uICcKLXMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwotdCByc2V0Ci06cnNldAotcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KLXQgZGVmCi1kCi06ZGVmCi1zL1xcJC8vCi10IGJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzIi9wCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAotZAotOmJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCi10IGNvbnQKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCi10IGNvbnQKLWQKLTpjb250Ci1uCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgY2xlYXIKLTpjbGVhcgotcy9cXCQvLwotdCBic25sYwotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCi1kCi06YnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAotYiBjb250Ci0nIDxjb25mZGVmcy5oIHwgc2VkICcKLXMvJyIkYWNfZGVsaW0iJy8iXFxcCi0iL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQotICBGUyA9ICIHIgotfQotL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7Ci0gIGxpbmUgPSBcJCAwCi0gIHNwbGl0KGxpbmUsIGFyZywgIiAiKQotICBpZiAoYXJnWzFdID09ICIjIikgewotICAgIGRlZnVuZGVmID0gYXJnWzJdCi0gICAgbWFjMSA9IGFyZ1szXQotICB9IGVsc2UgewotICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKLSAgICBtYWMxID0gYXJnWzJdCi0gIH0KLSAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQotICBtYWNybyA9IG1hYzJbMV0KLSAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCi0gIGlmIChEX2lzX3NldFttYWNyb10pIHsKLSAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgotICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KLSAgICBuZXh0Ci0gIH0gZWxzZSB7Ci0gICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAotICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgewotICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgotICAgICAgbmV4dAotICAgIH0KLSAgfQotfQoteyBwcmludCB9Ci1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCi1zaGlmdAotZm9yIGFjX3RhZwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwotICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKLQkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJwotCWAnIGJ5IGNvbmZpZ3VyZS4nCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0gICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KLSAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKLSAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQotICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAotICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAotICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0jIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KLWFjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQotYWNfc2VkX2RhdGFyb290PScKLS9kYXRhcm9vdGRpci8gewotICBwCi0gIHEKLX0KLS9AZGF0YWRpckAvcAotL0Bkb2NkaXJAL3AKLS9AaW5mb2RpckAvcAotL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wJwotY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0gIGFjX2RhdGFyb290ZGlyX2hhY2s9JwotICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0gIHMmQGRvY2RpckAmJGRvY2RpciZnCi0gIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKLSAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKLSRleHRyYXN1YgotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAotcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0Ci1zJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0Ci1zJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAotcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAotcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci1zJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKLXMmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0Ci1zJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci1zJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0Ci1zJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0Ci0kYWNfZGF0YXJvb3RkaXJfaGFjawotIgotZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAotICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0KLXRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKLSAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQotCi0gIHJtIC1mICIkYWNfdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7Ci0gIGVzYWMgXAotICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgewotICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKLSAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAiJGFjX2ZpbGUiCi0gICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCi0JfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgZWxzZQotICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAotICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1Ci0gIGZpCi0jIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9IiRhY19maWxlIgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAotJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRfYW1fYXJnIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotICAKLSAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0gOzsKLSAgZXNhYwotCi0KLSAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0gICAgInJmYi9yZmJjb25maWcuaCI6QykgYWNfcHJlZml4X2NvbmZfT1VUPWBlY2hvIHJmYi9yZmJjb25maWcuaGAKLWFjX3ByZWZpeF9jb25mX0RFRj1gZWNobyBfJGFjX3ByZWZpeF9jb25mX09VVCB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjoiIC1lICJzL0A8OkBeYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkA6PkAvXy9nImAKLWFjX3ByZWZpeF9jb25mX1BLRz1gZWNobyAkUEFDS0FHRWAKLWFjX3ByZWZpeF9jb25mX0xPVz1gZWNobyBfJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi06YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfOiJgCi1hY19wcmVmaXhfY29uZl9VUFA9YGVjaG8gJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei06QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfOiIgIC1lICIvXkA8OkAwMTIzNDU2Nzg5QDo+QC9zL14vXy8iYAotYWNfcHJlZml4X2NvbmZfSU5QPWBlY2hvIF9gCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIl8kYWNfZmlsZSIgPSBfOiAmJiBjb250aW51ZQotICAgICB0ZXN0IC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiAmJiBjb250aW51ZQotICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAgICouaCkgdGVzdCAtZiAkYWNfZmlsZSAmJiBhY19wcmVmaXhfY29uZl9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBjYXNlICIkYWNfcHJlZml4X2NvbmZfT1VUIiBpbgotICAgICAgKi8qKSBhY19wcmVmaXhfY29uZl9JTlA9YGJhc2VuYW1lICIkYWNfcHJlZml4X2NvbmZfT1VUImAKLSAgICAgIDs7Ci0gICAgICAqLSopIGFjX3ByZWZpeF9jb25mX0lOUD1gZWNobyAiJGFjX3ByZWZpeF9jb25mX09VVCIgfCBzZWQgLWUgInMvQDw6QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5X0A6PkAqLS8vImAKLSAgICAgIDs7Ci0gICAgICAqKSBhY19wcmVmaXhfY29uZl9JTlA9Y29uZmlnLmgKLSAgICAgIDs7Ci0gICBlc2FjCi1maQotaWYgdGVzdCAteiAiJGFjX3ByZWZpeF9jb25mX1BLRyIgOyB0aGVuCi0gICBhc19mbl9lcnJvciAkPyAibm8gcHJlZml4IGZvciBfUFJFRklYX1BLR19DT05GSUdfSCIgIiRMSU5FTk8iIDUKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4KLSAgICAgYWNfcHJlZml4X2NvbmZfSU5QPSIkc3JjZGlyLyRhY19wcmVmaXhfY29uZl9JTlAiCi0gIGZpIGZpCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNjt9Ci0gIGlmIHRlc3QgLWYgJGFjX3ByZWZpeF9jb25mX0lOUCA7IHRoZW4KLSAgICBlY2hvICJzL0AlOkB1bmRlZiAgKlxcKEA8OkBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9AOj5AXFwpL0AlOkB1bmRlZiAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxLyIgPiBjb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QHVuZGVmICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AXFwpL0AlOkB1bmRlZiAkX0xPVyIiX1xcMS8iID4+IF9zY3JpcHQKLSAgICBlY2hvICJzL0AlOkBkZWZpbmUgICpcXChAPDpAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfQDo+QEA8OkBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV9AOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMSBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGRlZmluZSAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxIFxcMiBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiQCU6QGVuZGlmLyIgPj5jb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIkAlOkBkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIkAlOkBpZm5kZWYgJGFjX3ByZWZpeF9jb25mX0RFRiIgICAgICA+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZGVmaW5lICRhY19wcmVmaXhfY29uZl9ERUYgMSIgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvIC8nKicgJGFjX3ByZWZpeF9jb25mX09VVC4gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGNvbmZpZ3VyZS4gJyonLyA+PiR0bXAvcGNvbmZpZy5oCi0KLSAgICBzZWQgLWYgY29uZnRlc3QucHJlZml4ICRhY19wcmVmaXhfY29uZl9JTlAgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcvKiBvbmNlOicgJGFjX3ByZWZpeF9jb25mX0RFRiAnKi8nID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZW5kaWYiID4+JHRtcC9wY29uZmlnLmgKLSAgICBpZiBjbXAgLXMgJGFjX3ByZWZpeF9jb25mX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfcHJlZml4X2NvbmZfT1VUIiB8fAotJGFzX2V4cHIgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19wcmVmaXhfY29uZl9PVVQiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gICAgICBybSAtZiAiJGFjX3ByZWZpeF9jb25mX09VVCIKLSAgICAgIG12ICR0bXAvcGNvbmZpZy5oICIkYWNfcHJlZml4X2NvbmZfT1VUIgotICAgIGZpCi0gICAgY3AgY29uZnRlc3QucHJlZml4IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgYXNfZm5fZXJyb3IgJD8gImlucHV0IGZpbGUgJGFjX3ByZWZpeF9jb25mX0lOUCBkb2VzIG5vdCBleGlzdCAtIHNraXAgZ2VuZXJhdGluZyAkYWNfcHJlZml4X2NvbmZfT1VUIiAiJExJTkVOTyIgNQotICBmaQotICBybSAtZiBjb25mdGVzdC4qCi1maQotIDs7Ci0gICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCB7Ci0gICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCi0gICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKLSAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCi0gIGNhc2UgJENPTkZJR19GSUxFUyBpbgotICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OwotICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKLSAgZXNhYwotICBzaGlmdAotICBmb3IgbWYKLSAgZG8KLSAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKLSRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRmaWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciOkMpIGNobW9kIGEreCBsaWJ2bmNzZXJ2ZXItY29uZmlnIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi1hc19mbl9leGl0IDAKLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLQotdGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0KLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgotIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0jIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCi0jIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAotIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCi0jIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGFjX2NzX3N1Y2Nlc3M9OgotICBhY19jb25maWdfc3RhdHVzX2FyZ3M9Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCi0gIGV4ZWMgNT4vZGV2L251bGwKLSAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotICBleGVjIDU+PmNvbmZpZy5sb2cKLSAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKLSAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgMQotZmkKLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQotZmkKLQotY2htb2QgYSt4IC4vbGlidm5jc2VydmVyLWNvbmZpZwotCmRpZmYgLS1naXQgYS9hdXRvbTR0ZS5jYWNoZS9yZXF1ZXN0cyBiL2F1dG9tNHRlLmNhY2hlL3JlcXVlc3RzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJkMjJkLi4wMDAwMDAwCi0tLSBhL2F1dG9tNHRlLmNhY2hlL3JlcXVlc3RzCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLSMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgQXV0b200dGUgU3VuIEFwciAyOSAyMTo0ODoxNiBVVEMgMjAxMi4KLSMgSXQgY29udGFpbnMgdGhlIGxpc3RzIG9mIG1hY3JvcyB3aGljaCBoYXZlIGJlZW4gdHJhY2VkLgotIyBJdCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQuCi0KLUByZXF1ZXN0ID0gKAotICAgICAgICAgICAgIGJsZXNzKCBbCi0gICAgICAgICAgICAgICAgICAgICAgJzAnLAotICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYXV0b2NvbmYnCi0gICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hdXRvY29uZi9hdXRvY29uZi9hdXRvY29uZi5tNGYnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2FtdmVyc2lvbi5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvYXV4ZGlyLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9jb25kLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9kZXBlbmQubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2RlcG91dC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaGVhZGVyLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9pbml0Lm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9pbnN0YWxsLXNoLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9sZWFkLWRvdC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWFrZS5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWludXNvLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9taXNzaW5nLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9ta2RpcnAubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL29wdGlvbnMubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3J1bmxvZy5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc2FuaXR5Lm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zaWxlbnQubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3N0cmlwLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zdWJzdG5vdC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvdGFyLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICdhY2luY2x1ZGUubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZ3VyZS5hYycKLSAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfVEFHQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0VOQUJMRV9TVEFUSUMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnbTRfcGF0dGVybl9mb3JiaWQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfU0hFTExfSU5JVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19ESVNBQkxFX1NIQVJFRCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19ERUZVTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19MSUJUT09MJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfU0VUVVAnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9XSU4zMl9ETEwnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QUk9HX0xEX1JFTE9BRF9GTEFHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BST0dfTUtESVJfUCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9BVVRPTUFLRV9WRVJTSU9OJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX01JU1NJTkdfSEFTX1JVTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9TVUJTVF9OT1RNQUtFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX01JU1NJTkdfUFJPRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0RMT1BFTl9TRUxGJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX1RZUEVfU09DS0xFTl9UJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0NfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19JTlNUQUxMX1NUUklQJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19tNF93YXJuJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FYX1BSRUZJWF9DT05GSUdfSCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX09CSkRJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0xJTktFUl9PUFRJT04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0FOSVRZX0NIRUNLJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX0NIRUNLX0RMRkNOJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0NYWCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdMVF9BQ19QUk9HX1JDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9QUk9HX1RBUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdMVF9BQ19QUk9HX0dDSicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0dDSicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfUFJPR19DWFhDUFAnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fRElTQUJMRV9TVEFUSUMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fREVQX1RSQUNLJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BQ19QUk9HX0xJQlRPT0wnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fQ09ORklHX0hFQURFUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfTEFOR19GNzcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX0lGX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QQVRIX1RPT0xfUFJFRklYJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9TVUJTVF9OT1RNQUtFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfRjc3JyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9BVVRPQ09ORl9WRVJTSU9OJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ200X3BhdHRlcm5fYWxsb3cnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fRElTQUJMRV9TSEFSRUQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0VUX0xFQURJTkdfRE9UJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0NYWCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0xJQlRPT0wnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX0ZJTEVfTFRETExfQycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0xEJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9ERVBFTkRFTkNJRVMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19TWVNfQ09NUElMRVInID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19OTScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBVV9ERUZVTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QUk9HX05NJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfRExPUEVOJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQkxURExfQ09OVkVOSUVOQ0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19MRCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QUk9HX0xEX0dOVScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19FTkFCTEVfRkFTVF9JTlNUQUxMJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQkxURExfSU5TVEFMTEFCTEUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fU0VUX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfTElOS0VSX0JPSUxFUlBMQVRFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19DQ19DX08nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fSU5JVF9BVVRPTUFLRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19ESVNBQkxFX1NUQVRJQycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QQVRIX0xJQkdDUllQVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19ERUZVTl9PTkNFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MT0NLJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NSRUFURV9TVERJTlRfSCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfTEFOR19SQ19DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX0xBTkdfR0NKJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUkMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0lMRU5UX1JVTEVTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX1RSWV9ETE9QRU5fU0VMRicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfU1lTX0xJQlBBVEhfQUlYJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnTFRfQUNfUFJPR19TRUQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fRU5BQkxFX1NIQVJFRCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9BVVhfRElSX0VYUEFORCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfTEFOR19HQ0pfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0VOQUJMRV9TSEFSRUQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEknID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX0xBTkdfRjc3X0NPTkZJRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fU0VUX09QVElPTlMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUlVOX0xPRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9QSUNNT0RFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NIRUNLX0xJQk0nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0VOQUJMRV9TVEFUSUMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9TWVNfTElCX1NUUklQJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19UQUdWQVInID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19DQ19DX08nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX01BTkdMRV9PUFRJT04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fQ09ORElUSU9OQUwnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0VUX0RFUERJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQ0NfQkFTRU5BTUUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19JTlNUQUxMX1NIJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ200X2luY2x1ZGUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19FR1JFUCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QQVRIX01BR0lDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0snID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fTUFLRV9JTkNMVURFJyA9PiAxCi0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBdLCAnQXV0b200dGU6OlJlcXVlc3QnICksCi0gICAgICAgICAgICAgYmxlc3MoIFsKLSAgICAgICAgICAgICAgICAgICAgICAnMScsCi0gICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hdXRvY29uZicKLSAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2F1dG9jb25mL2F1dG9jb25mL2F1dG9jb25mLm00ZicsCi0gICAgICAgICAgICAgICAgICAgICAgICAnYWNsb2NhbC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlndXJlLmFjJwotICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19UQUdDT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19GNzdfQ19PJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0lOSVQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnbTRfcGF0dGVybl9mb3JiaWQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX0NPTkRfSUYnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ0FOT05JQ0FMX1RBUkdFVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19TVUJTVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DT05GSUdfTElCT0JKX0RJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19GQ19TUkNFWFQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ0FOT05JQ0FMX0hPU1QnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19MSUJUT09MJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0lOSVRfQVVUT01BS0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUEFUSF9HVUlMRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DT05GSUdfU1VCRElSUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9BVVRPTUFLRV9WRVJTSU9OJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0xUX0NPTkZJR19MVERMX0RJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19SRVFVSVJFX0FVWF9GSUxFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTkZJR19MSU5LUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdtNF9zaW5jbHVkZScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdMVF9TVVBQT1JURURfVEFHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX01BSU5UQUlORVJfTU9ERScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9OTFMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfRkNfUFBfREVGSU5FJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0dOVV9HRVRURVhUX0lOVExfU1VCRElSJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX01BS0VGSUxFX0lOQ0xVREUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX200X3dhcm4nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19DWFhfQ19PJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9DT05EX0VORElGJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9NQUtFRklMRV9JTkNMVURFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0VOQUJMRV9NVUxUSUxJQicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9TSUxFTlRfUlVMRVMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19NT0MnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ09ORklHX0ZJTEVTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnTFRfSU5JVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0FSJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0dOVV9HRVRURVhUJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlNPVVJDRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0ZDX0NfTycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DQU5PTklDQUxfQlVJTEQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfRkNfRlJFRUZPUk0nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUhfT1VUUFVUJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0ZDX1BQX1NSQ0VYVCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fU1VCU1RfTk9UTUFLRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DT05GSUdfQVVYX0RJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdzaW5jbHVkZScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0NDX0NfTycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdtNF9wYXR0ZXJuX2FsbG93JyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1hHRVRURVhUX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DQU5PTklDQUxfU1lTVEVNJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0NPTkRJVElPTkFMJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTkZJR19IRUFERVJTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFRklORV9UUkFDRV9MSVRFUkFMJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BPVF9UT09MUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdtNF9pbmNsdWRlJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9DT05EX0VMU0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfU1VCU1RfVFJBQ0UnID0+IDEKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF0sICdBdXRvbTR0ZTo6UmVxdWVzdCcgKSwKLSAgICAgICAgICAgICBibGVzcyggWwotICAgICAgICAgICAgICAgICAgICAgICcyJywKLSAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2F1dG9jb25mJwotICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYXV0b2NvbmYvYXV0b2NvbmYvYXV0b2NvbmYubTRmJywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwvcGtnLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9hbXZlcnNpb24ubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2F1eGRpci5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvY29uZC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvZGVwZW5kLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9kZXBvdXQubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2hlYWRlci5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaW5pdC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaW5zdGFsbC1zaC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbGVhZC1kb3QubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL21ha2UubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL21pbnVzby5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWlzc2luZy5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWtkaXJwLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9vcHRpb25zLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9ydW5sb2cubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3Nhbml0eS5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc2lsZW50Lm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zdHJpcC5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc3Vic3Rub3QubTQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3Rhci5tNCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnYWNpbmNsdWRlLm00JywKLSAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWd1cmUuYWMnCi0gICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fRU5BQkxFX1NUQVRJQycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19TSEVMTF9JTklUJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFRlVOJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0NYWF9DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19MSUJUT09MJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BST0dfTUtESVJfUCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9BVVRPTUFLRV9WRVJTSU9OJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1NVQlNUX05PVE1BS0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fTUlTU0lOR19QUk9HJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0NfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BST0dfSU5TVEFMTF9TVFJJUCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfbTRfd2FybicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX09CSkRJUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9TQU5JVFlfQ0hFQ0snID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfQ0hFQ0tfRExGQ04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9QUk9HX1RBUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0dDSicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0NPTkZJRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfTEFOR19GNzcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX1NVQlNUX05PVE1BS0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX0FVVE9DT05GX1ZFUlNJT04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fRElTQUJMRV9TSEFSRUQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19MSUJUT09MJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0NYWCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0xEJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19GSUxFX0xURExMX0MnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQVVfREVGVU4nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19OTScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX0RMT1BFTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QUk9HX0xEJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUFJPR19MRF9HTlUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX1NFVF9PUFRJT04nID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0xJTktFUl9CT0lMRVJQTEFURScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1BST0dfQ0NfQ19PJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFRlVOX09OQ0UnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUEFUSF9MSUJHQ1JZUFQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ1JFQVRFX1NURElOVF9IJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0dDSicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1JDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1NJTEVOVF9SVUxFUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19TWVNfTElCUEFUSF9BSVgnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX1RSWV9ETE9QRU5fU0VMRicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdMVF9BQ19QUk9HX1NFRCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9FTkFCTEVfU0hBUkVEJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0dDSl9DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfRU5BQkxFX1NIQVJFRCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19FTkFCTEVfU1RBVElDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0NDX0NfTycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfVEFHVkFSJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0NPTkRJVElPTkFMJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BST0dfSU5TVEFMTF9TSCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdtNF9pbmNsdWRlJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX1BST0dfRUdSRVAnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfUEFUSF9NQUdJQycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX01BS0VfSU5DTFVERScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfVEFHQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ200X3BhdHRlcm5fZm9yYmlkJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RJU0FCTEVfU0hBUkVEJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9DT01QSUxFUl9CT0lMRVJQTEFURScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1NFVFVQJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfV0lOMzJfRExMJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX1BST0dfTERfUkVMT0FEX0ZMQUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fTUlTU0lOR19IQVNfUlVOJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfRExPUEVOX1NFTEYnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfVFlQRV9TT0NLTEVOX1QnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQVhfUFJFRklYX0NPTkZJR19IJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfTElOS0VSX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdQS0dfQ0hFQ0tfRVhJU1RTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfQ1hYJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0xUX0FDX1BST0dfUkMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnTFRfQUNfUFJPR19HQ0onID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0xUX0FDX1BST0dfQ1hYQ1BQJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0RJU0FCTEVfU1RBVElDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0RFUF9UUkFDSycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQUNfUFJPR19MSUJUT09MJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0NPTkZJR19IRUFERVInID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX0lGX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QQVRIX1RPT0xfUFJFRklYJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfRjc3JyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ200X3BhdHRlcm5fYWxsb3cnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0VUX0xFQURJTkdfRE9UJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9ERVBFTkRFTkNJRVMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19TWVNfQ09NUElMRVInID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19OTScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdQS0dfQ0hFQ0tfTU9EVUxFUycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJMVERMX0NPTlZFTklFTkNFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQkxURExfSU5TVEFMTEFCTEUnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9JTklUX0FVVE9NQUtFJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RJU0FCTEVfU1RBVElDJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MT0NLJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX1JDX0NPTkZJRycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0FVWF9ESVJfRVhQQU5EJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9BQ19MQU5HX0Y3N19DT05GSUcnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX1NFVF9PUFRJT05TJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1JVTl9MT0cnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAnX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfUElDTU9ERScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DSEVDS19MSUJNJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUCcgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fTUFOR0xFX09QVElPTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTicgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBTV9TRVRfREVQRElSJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJ19MVF9DQ19CQVNFTkFNRScgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdQS0dfUFJPR19QS0dfQ09ORklHJyA9PiAxCi0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBdLCAnQXV0b200dGU6OlJlcXVlc3QnICkKLSAgICAgICAgICAgKTsKLQpkaWZmIC0tZ2l0IGEvYXV0b200dGUuY2FjaGUvdHJhY2VzLjAgYi9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzNGI3Ny4uMDAwMDAwMAotLS0gYS9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzE3ICswLDAgQEAKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvYW12ZXJzaW9uLm00OjE3OiAtMS0gQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLCBbYW1fX2FwaV92ZXJzaW9uPScxLjExJwotZG5sIFNvbWUgdXNlcnMgZmluZCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBtaXN0YWtlIGl0IGZvciBhIHdheSB0bwotZG5sIHJlcXVpcmUgc29tZSBtaW5pbXVtIHZlcnNpb24uICBQb2ludCB0aGVtIHRvIHRoZSByaWdodCBtYWNyby4KLW00X2lmKFskMV0sIFsxLjExLjZdLCBbXSwKLSAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2FtdmVyc2lvbi5tNDozNjogLTEtIEFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwgW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuNl0pZG5sCi1tNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAotICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCi1fQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSkpXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvYXV4ZGlyLm00OjQ5OiAtMS0gQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwgW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCi1BQ19QUkVSRVEoWzIuNTBdKWRubAotIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAotYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvY29uZC5tNDoxNTogLTEtIEFDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sIFtBQ19QUkVSRVEoMi41MilkbmwKLSBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAotCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKLUFDX1NVQlNUKFskMV9UUlVFXSlkbmwKLUFDX1NVQlNUKFskMV9GQUxTRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAotbTRfZGVmaW5lKFtfQU1fQ09ORF9WQUxVRV8kMV0sIFskMl0pZG5sCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maQotQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKLVtpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQotZmldKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2RlcGVuZC5tNDoyODogLTEtIEFDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwgW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAotQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAotQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCi0KLWlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIG00X2Nhc2UoWyQxXSwgW0NDXSwKLSAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCi0gICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7Ci0gICAgIGVzYWNdLAotICAgIFtDWFhdLAotICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKLSAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKLSAgICAgZXNhY10pCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi1dKQotQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCi1BTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvZGVwZW5kLm00OjE2NDogLTEtIEFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwgW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1BQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9kZXBlbmQubTQ6MTcyOiAtMS0gQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sIFtBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCi1bICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgotICBBTURFUEJBQ0tTTEFTSD0nXCcKLSAgYW1fX25vZGVwPSdfbm8nCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKLUFDX1NVQlNUKFthbV9fbm9kZXBdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9kZXBvdXQubTQ6MTQ6IC0xLSBBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwgW3sKLSAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKLSAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAotICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KLSAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCi0gICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7Ci0gICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OwotICBlc2FjCi0gIHNoaWZ0Ci0gIGZvciBtZgotICBkbwotICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvZGVwb3V0Lm00Ojc1OiAtMS0gQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwgW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAotICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLSAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaGVhZGVyLm00OjEyOiAtMS0gQVVfREVGVU4oW0FNX0NPTkZJR19IRUFERVJdLCBbQUNfQ09ORklHX0hFQURFUlMoJEApXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaGVhZGVyLm00OjEyOiAtMS0gQUNfREVGVU4oW0FNX0NPTkZJR19IRUFERVJdLCBbQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fQ09ORklHX0hFQURFUicgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCi1BQ19DT05GSUdfSEVBREVSUygkQCldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9pbml0Lm00OjI2OiAtMS0gQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLCBbQUNfUFJFUkVRKFsyLjYyXSlkbmwKLWRubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93Ci1kbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KLW00X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgotICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAotICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCi0gIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pX0FNX1NVQlNUX05PVE1BS0UoW2FtX19pc3JjXSlkbmwKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotICBmaQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLUFDX1NVQlNUKFtDWUdQQVRIX1ddKQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi1kbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KLW00X2lmdmFsKFskMl0sCi1bbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAotW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAotZG5sIERpYWdub3NlIG9sZC1zdHlsZSBBQ19JTklUIHdpdGggbmV3LXN0eWxlIEFNX0FVVE9NQUtFX0lOSVQuCi1tNF9pZihtNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgMSltNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgMSksIDExLCwKLSAgW200X2ZhdGFsKFtBQ19JTklUIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwYWNrYWdlIGFuZCB2ZXJzaW9uIGFyZ3VtZW50c10pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCi0KLV9BTV9JRl9PUFRJT04oW25vLWRlZmluZV0sLAotW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLSBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCi1BQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU0hdKWRubAotQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NUUklQXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotCSAgICAgIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAotCQkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQotX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsCi1bQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19DQ10sCi0JCQkgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotCQkJICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX09CSkNdLAotCQkJICBkZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSldKWRubAotXSkKLV9BTV9JRl9PUFRJT04oW3NpbGVudC1ydWxlc10sIFtBQ19SRVFVSVJFKFtBTV9TSUxFTlRfUlVMRVNdKV0pZG5sCi1kbmwgVGhlIGBwYXJhbGxlbC10ZXN0cycgZHJpdmVyIG1heSBuZWVkIHRvIGtub3cgYWJvdXQgRVhFRVhULCBzbyBhZGQgdGhlCi1kbmwgYGFtX19FWEVFWFQnIGNvbmRpdGlvbmFsIGlmIF9BTV9DT01QSUxFUl9FWEVFWFQgd2FzIHNlZW4uICBUaGlzIG1hY3JvCi1kbmwgaXMgaG9va2VkIG9udG8gX0FDX0NPTVBJTEVSX0VYRUVYVCBlYXJseSwgc2VlIGJlbG93LgotQUNfQ09ORklHX0NPTU1BTkRTX1BSRShkbmwKLVttNF9wcm92aWRlX2lmKFtfQU1fQ09NUElMRVJfRVhFRVhUXSwKLSAgW0FNX0NPTkRJVElPTkFMKFthbV9fRVhFRVhUXSwgW3Rlc3QgLW4gIiRFWEVFWFQiXSldKV0pZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9pbml0Lm00OjEyNjogLTEtIEFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwgWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9JDEKLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2luc3RhbGwtc2gubTQ6MTQ6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwgW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLWlmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKLSAgKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKLSAgZXNhYwotZmkKLUFDX1NVQlNUKGluc3RhbGxfc2gpXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbGVhZC1kb3QubTQ6MTI6IC0xLSBBQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwgW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9tYWtlLm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sIFthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0Ci0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLUFDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCi1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KLWNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0qdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICBhbV9fcXVvdGU9Ci0gIF9hbV9yZXN1bHQ9R05VCi0gIDs7Ci1lc2FjCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCi0gICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKLSAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgICAgOzsKLSAgIGVzYWMKLWZpCi1BQ19TVUJTVChbYW1fX2luY2x1ZGVdKQotQUNfU1VCU1QoW2FtX19xdW90ZV0pCi1BQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCi1ybSAtZiBjb25maW5jIGNvbmZtZgotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWludXNvLm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX1BST0dfQ0NfQ19PXSwgW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfQ19PXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbXBpbGVdKWRubAotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFtX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCi1ldmFsIGFtX3Q9XCRhY19jdl9wcm9nX2NjXyR7YW1fY2N9X2NfbwotaWYgdGVzdCAiJGFtX3QiICE9IHllczsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotZG5sIE1ha2Ugc3VyZSBBQ19QUk9HX0NDIGlzIG5ldmVyIGNhbGxlZCBhZ2Fpbiwgb3IgaXQgd2lsbCBvdmVycmlkZSBvdXIKLWRubCBzZXR0aW5nIG9mIENDLgotbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICBbbTRfZmF0YWwoW0FDX1BST0dfQ0MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBBTV9QUk9HX0NDX0NfT10pXSkKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL21pc3NpbmcubTQ6MTQ6IC0xLSBBQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwgW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCi0kMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KLUFDX1NVQlNUKCQxKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL21pc3NpbmcubTQ6MjQ6IC0xLSBBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwgW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAotaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OwotICAqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OwotICBlc2FjCi1maQotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKLWZpCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9ta2RpcnAubTQ6MTQ6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwgW0FDX1BSRVJFUShbMi42MF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAotZG5sIEF1dG9tYWtlIDEuOCB0byAxLjkuNiB1c2VkIHRvIGRlZmluZSBta2Rpcl9wLiAgV2Ugbm93IHVzZSBNS0RJUl9QLAotZG5sIHdoaWxlIGtlZXBpbmcgYSBkZWZpbml0aW9uIG9mIG1rZGlyX3AgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1kbmwgQE1LRElSX1BAIGlzIG1hZ2ljOiBBQ19PVVRQVVQgYWRqdXN0cyBpdHMgdmFsdWUgZm9yIGVhY2ggTWFrZWZpbGUuCi1kbmwgSG93ZXZlciB3ZSBjYW5ub3QgZGVmaW5lIG1rZGlyX3AgYXMgJChNS0RJUl9QKSBmb3IgdGhlIHNha2Ugb2YKLWRubCBNYWtlZmlsZS5pbnMgdGhhdCBkbyBub3QgZGVmaW5lIE1LRElSX1AsIHNvIHdlIGRvIG91ciBvd24KLWRubCBhZGp1c3RtZW50IHVzaW5nIHRvcF9idWlsZGRpciAod2hpY2ggaXMgZGVmaW5lZCBtb3JlIG9mdGVuIHRoYW4KLWRubCBNS0RJUl9QKS4KLUFDX1NVQlNUKFtta2Rpcl9wXSwgWyIkTUtESVJfUCJdKWRubAotY2FzZSAkbWtkaXJfcCBpbgotICBbW1xcLyRdXSogfCA/OltbXFwvXV0qKSA7OwotICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Ci1lc2FjCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9vcHRpb25zLm00OjE0OiAtMS0gQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwgW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL29wdGlvbnMubTQ6MjA6IC0xLSBBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLCBbbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL29wdGlvbnMubTQ6MjY6IC0xLSBBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwgW200X2ZvcmVhY2hfdyhbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvb3B0aW9ucy5tNDozMjogLTEtIEFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwgW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3J1bmxvZy5tNDoxNDogLTEtIEFDX0RFRlVOKFtBTV9SVU5fTE9HXSwgW3sgZWNobyAiJGFzX21lOiRMSU5FTk86ICQxIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAoJDEpID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGFjX3N0YXR1cz0kPwotICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9XSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc2FuaXR5Lm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQotIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgotYW1fbGY9JwotJwotY2FzZSBgcHdkYCBpbgotICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZl1dKikKLSAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lXSk7OwotZXNhYwotY2FzZSAkc3JjZGlyIGluCi0gICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV1dKikKLSAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBzcmNkaXIgdmFsdWU6IGAkc3JjZGlyJ10pOzsKLWVzYWMKLQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLUFDX01TR19SRVNVTFQoeWVzKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3NpbGVudC5tNDoxNDogLTEtIEFDX0RFRlVOKFtBTV9TSUxFTlRfUlVMRVNdLCBbQUNfQVJHX0VOQUJMRShbc2lsZW50LXJ1bGVzXSwKLVsgIC0tZW5hYmxlLXNpbGVudC1ydWxlcyAgICAgICAgICBsZXNzIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiBgbWFrZSBWPTEnKQotICAtLWRpc2FibGUtc2lsZW50LXJ1bGVzICAgICAgICAgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MCcpXSkKLWNhc2UgJGVuYWJsZV9zaWxlbnRfcnVsZXMgaW4KLXllcykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7Ci1ubykgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTE7OwotKikgICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT1tNF9pZihbJDFdLCBbeWVzXSwgWzBdLCBbMV0pOzsKLWVzYWMKLWRubAotZG5sIEEgZmV3IGBtYWtlJyBpbXBsZW1lbnRhdGlvbnMgKGUuZy4sIE5vblN0b3AgT1MgYW5kIE5leHRTdGVwKQotZG5sIGRvIG5vdCBzdXBwb3J0IG5lc3RlZCB2YXJpYWJsZSBleHBhbnNpb25zLgotZG5sIFNlZSBhdXRvbWFrZSBidWcjOTkyOCBhbmQgYnVnIzEwMjM3LgotYW1fbWFrZT0ke01BS0UtbWFrZX0KLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRhbV9tYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXNdLAotICAgW2FtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzXSwKLSAgIFtpZiBBU19FQ0hPKFtbJ1RSVUU9JChCQVIkKFYpKQotQkFSMD1mYWxzZQotQkFSMT10cnVlCi1WPTEKLWFtX19kb2l0OgotCUAkKFRSVUUpCi0uUEhPTlk6IGFtX19kb2l0J11dKSB8ICRhbV9tYWtlIC1mIC0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzPXllcwotZWxzZQotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz1ubwotZmldKQotaWYgdGVzdCAkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMgPSB5ZXM7IHRoZW4KLSAgZG5sIFVzaW5nIGAkVicgaW5zdGVhZCBvZiBgJChWKScgYnJlYWtzIElSSVggbWFrZS4KLSAgQU1fVj0nJChWKScKLSAgQU1fREVGQVVMVF9WPSckKEFNX0RFRkFVTFRfVkVSQk9TSVRZKScKLWVsc2UKLSAgQU1fVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLSAgQU1fREVGQVVMVF9WPSRBTV9ERUZBVUxUX1ZFUkJPU0lUWQotZmkKLUFDX1NVQlNUKFtBTV9WXSlkbmwKLUFNX1NVQlNUX05PVE1BS0UoW0FNX1ZdKWRubAotQUNfU1VCU1QoW0FNX0RFRkFVTFRfVl0pZG5sCi1BTV9TVUJTVF9OT1RNQUtFKFtBTV9ERUZBVUxUX1ZdKWRubAotQUNfU1VCU1QoW0FNX0RFRkFVTFRfVkVSQk9TSVRZXSlkbmwKLUFNX0JBQ0tTTEFTSD0nXCcKLUFDX1NVQlNUKFtBTV9CQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNX0JBQ0tTTEFTSF0pZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zdHJpcC5tNDoxOTogLTEtIEFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLCBbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLUFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3N1YnN0bm90Lm00OjE0OiAtMS0gQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc3Vic3Rub3QubTQ6MTk6IC0xLSBBQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS90YXIubTQ6MjQ6IC0xLSBBQ19ERUZVTihbX0FNX1BST0dfVEFSXSwgWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFllcywgaXQncyBzdGlsbCB1c2VkCi0jIGluIHRoZSB3aWxkIDotKCAgV2Ugc2hvdWxkIGZpbmQgYSBwcm9wZXIgd2F5IHRvIGRlcHJlY2F0ZSBpdCAuLi4KLUFDX1NVQlNUKFtBTVRBUl0sIFsnJCR7VEFSLXRhcn0nXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPSckJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIicgYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJ10sCi0gICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCi0gICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQotQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQotIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgotX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKLV9hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9Ci0jIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKLSMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KLWZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCi1kbwotICBjYXNlICRfYW1fdG9vbCBpbgotICBnbnV0YXIpCi0gICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOwotICAgIGRvCi0gICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhawotICAgIGRvbmUKLSAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgotICAgIDs7Ci0gIHBsYWludGFyKQotICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCi0gICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KLSAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCi0gICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSd0YXIgeGYgLScKLSAgICA7OwotICBwYXgpCi0gICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSdwYXggLXInCi0gICAgOzsKLSAgY3BpbykKLSAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCi0gICAgOzsKLSAgbm9uZSkKLSAgICBhbV9fdGFyPWZhbHNlCi0gICAgYW1fX3Rhcl89ZmFsc2UKLSAgICBhbV9fdW50YXI9ZmFsc2UKLSAgICA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKLSAgIyBhbmQgYW1fX3VudGFyIHNldC4KLSAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCi0KLSAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKLSAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgotICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCi0gICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCi0gIGZpCi1kb25lCi1ybSAtcmYgY29uZnRlc3QuZGlyCi0KLUFDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKLUFDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKLUFDX1NVQlNUKFthbV9fdGFyXSkKLUFDX1NVQlNUKFthbV9fdW50YXJdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI6IC0xLSBBQ19ERUZVTihbQUNfVFlQRV9TT0NLTEVOX1RdLCBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzb2NrbGVuX3RdLCBhY19jdl90eXBlX3NvY2tsZW5fdCwKLVsKLSAgQUNfVFJZX0NPTVBJTEUoCi0gIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0sCi0gIFtzb2NrbGVuX3QgbGVuID0gNDI7IHJldHVybiAwO10sCi0gIGFjX2N2X3R5cGVfc29ja2xlbl90PXllcywKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8pCi1dKQotICBpZiB0ZXN0ICRhY19jdl90eXBlX3NvY2tsZW5fdCAhPSB5ZXM7IHRoZW4KLSAgICBBQ19ERUZJTkUoc29ja2xlbl90LCBpbnQpCi0gIGZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjA6IC0xLSBBQ19ERUZVTihbQUNfQ09NUElMRV9DSEVDS19TSVpFT0ZdLCBbY2hhbmdlcXVvdGUoPDwsID4+KWRubAotZG5sIFRoZSBuYW1lIHRvICNkZWZpbmUuCi1kZWZpbmUoPDxBQ19UWVBFX05BTUU+PiwgdHJhbnNsaXQoc2l6ZW9mXyQxLCBbYS16ICpdLCBbQS1aX1BdKSlkbmwKLWRubCBUaGUgY2FjaGUgdmFyaWFibGUgbmFtZS4KLWRlZmluZSg8PEFDX0NWX05BTUU+PiwgdHJhbnNsaXQoYWNfY3Zfc2l6ZW9mXyQxLCBbICpdLCBbX3BdKSlkbmwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoc2l6ZSBvZiAkMSkKLUFDX0NBQ0hFX1ZBTChBQ19DVl9OQU1FLAotW2ZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgJDIgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotJDIKLV0sIFtzd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICgkMSkgPT0gJGFjX3NpemUpOjtdLCBBQ19DVl9OQU1FPSRhY19zaXplKQotICBpZiB0ZXN0IHgkQUNfQ1ZfTkFNRSAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgkQUNfQ1ZfTkFNRSA9IHggOyB0aGVuCi0gIEFDX01TR19FUlJPUihbY2Fubm90IGRldGVybWluZSBhIHNpemUgZm9yICQxXSkKLWZpCi1BQ19NU0dfUkVTVUxUKCRBQ19DVl9OQU1FKQotQUNfREVGSU5FX1VOUVVPVEVEKEFDX1RZUEVfTkFNRSwgJEFDX0NWX05BTUUsIFtUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgJDFdKQotdW5kZWZpbmUoW0FDX1RZUEVfTkFNRV0pZG5sCi11bmRlZmluZShbQUNfQ1ZfTkFNRV0pZG5sCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDk6IC0xLSBBQ19ERUZVTihbQUNfQ1JFQVRFX1NURElOVF9IXSwgWyMgLS0tLS0tIEFDIENSRUFURSBTVERJTlQgSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdGRpbnQtdHlwZXMuLi4uXSkKLWFjX3N0ZGludF9oPWBlY2hvIGlmZWxzZSgkMSwgLCBfc3RkaW50LmgsICQxKWAKLWlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAic3RkaW50LmgiIDsgdGhlbgotIEFDX01TR19SRVNVTFQoIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPykiKQotZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgotIEFDX01TR19SRVNVTFQoIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KSIpCi1lbHNlCi0gQUNfTVNHX1JFU1VMVCgiKHB1dHRpbmcgdGhlbSBpbnRvICRhY19zdGRpbnRfaCkiKQotZmkKLQotaW50dHlwZV9oZWFkZXJzPWBlY2hvIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3lzL2ludHR5cGVzLmggJDIgXAotfCBzZWQgLWUgJ3MvLC8gL2cnYAotCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF94PSJuby1maWxlIgotIGFjX2N2X2hlYWRlcl9zdGRpbnRfbz0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X3U9Im5vLWZpbGUiCi0gZm9yIGkgaW4gc3RkaW50LmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VpbnRwdHJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50NjRfdAotICAgX0FDX0NIRUNLX1RZUEVfTkVXKHVpbnRwdHJfdCxbYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpXSxkbmwKLSAgICAgY29udGludWUsWyNpbmNsdWRlIDwkaT5dKQotICAgQUNfQ0hFQ0tfVFlQRSh1aW50NjRfdCxbYW5kNjQ9Iih1aW50NjRfdCB0b28pIl0sW2FuZDY0PSIiXSxbI2luY2x1ZGU8JGk+XSkKLSAgIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gb3VyIHVpbnRwdHJfdCBpbiAkaSAkYW5kNjQpCi0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3RkaW50LmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VpbnQzMl90Ci0gICB1bnNldCBhY19jdl90eXBlX3VpbnQ2NF90Ci0gICBBQ19DSEVDS19UWVBFKHVpbnQzMl90LFthY19jdl9oZWFkZXJfc3RkaW50X289JGldLGRubAotICAgICBjb250aW51ZSxbI2luY2x1ZGUgPCRpPl0pCi0gICBBQ19DSEVDS19UWVBFKHVpbnQ2NF90LFthbmQ2ND0iKHVpbnQ2NF90IHRvbykiXSxbYW5kNjQ9IiJdLFsjaW5jbHVkZTwkaT5dKQotICAgQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBvdXIgdWludDMyX3QgaW4gJGkgJGFuZDY0KQotICAgYnJlYWs7Ci0gZG9uZQotIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X28iID0gIm5vLWZpbGUiIDsgdGhlbgotIGZvciBpIGluIHN5cy90eXBlcy5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdV9pbnQ2NF90Ci0gICBBQ19DSEVDS19UWVBFKHVfaW50MzJfdCxbYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpXSxkbmwKLSAgICAgY29udGludWUsWyNpbmNsdWRlIDwkaT5dKQotICAgQUNfQ0hFQ0tfVFlQRSh1aW50NjRfdCxbYW5kNjQ9Iih1X2ludDY0X3QgdG9vKSJdLFthbmQ2ND0iIl0sWyNpbmNsdWRlPCRpPl0pCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIG91ciB1X2ludDMyX3QgaW4gJGkgJGFuZDY0KQotICAgYnJlYWs7Ci0gZG9uZQotIGZpCi0gZmkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGludHR5cGVzLmggY2hlY2tzIE1BWUJFIEMgYmFzaWMgdHlwZXMgLS0tLS0tLS0KLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihjaGFyKQotICAgQUNfQ09NUElMRV9DSEVDS19TSVpFT0Yoc2hvcnQpCi0gICBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihpbnQpCi0gICBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihsb25nKQotICAgQUNfQ09NUElMRV9DSEVDS19TSVpFT0Yodm9pZCopCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgU1RBUlQgaGVhZGVyIC0tLS0tLS0tLS0tLS0KLV9hY19zdGRpbnRfaD1BU19UUl9DUFAoXyRhY19zdGRpbnRfaCkKLUFDX01TR19SRVNVTFQoY3JlYXRpbmcgJGFjX3N0ZGludF9oIDogJF9hY19zdGRpbnRfaCkKLWVjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNpZm5kZWYiIF9HRU5FUkFURURfU1RESU5UX0ggPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50X2gKLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyBhIGdudSBjb21waWxlciB2ZXJzaW9uIiBgJENDIC0tdmVyc2lvbmAgIiovIiBcCi0gID4+JGFjX3N0ZGludF9oCi1lbHNlCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyAkQ0MgKi8iID4+JGFjX3N0ZGludF9oCi1maQotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gU2VlIGlmIGludF9sZWFzdCBhbmQgaW50X2Zhc3QgdHlwZXMgYXJlIHByZXNlbnQKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKLUFDX0NIRUNLX1RZUEUoaW50X2xlYXN0MzJfdCwsLFsjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+XSkKLUFDX0NIRUNLX1RZUEUoaW50X2Zhc3QzMl90LCwsWyNpbmNsdWRlPCRhY19jdl9oZWFkZXJfc3RkaW50Pl0pCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiAhPSAic3RkZGVmLmgiIDsgdGhlbgotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRpbnQuaCIgOyB0aGVuCi1BQ19NU0dfUkVTVUxUKC4uYWRkaW5nIGluY2x1ZGUgc3RkZGVmLmgpCi0gICBlY2hvICIjaW5jbHVkZSA8c3RkZGVmLmg+IiA+PiRhY19zdGRpbnRfaAotZmkgOyBmaQotQUNfTVNHX1JFU1VMVCguLmFkZGluZyBpbmNsdWRlICRhY19jdl9oZWFkZXJfc3RkaW50KQotICAgZWNobyAiI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50PiIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiIgPj4kYWNfc3RkaW50X2gKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGhlYWRlciBTVEFSVCBiYXNpYyBpbnQgdHlwZXMgLS0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBuZWVkIHRvIGxvb2sgYXQgQyBiYXNpYyB0eXBlcykKLWRubCBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIgIyBtb3ZlZCB1cCBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpbGUKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gZ29vZCBzdGRpbnQuaCBpbnR0eXBlcykKLWRubCBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9Im5vIiAgIyBtb3ZlZCB1cCBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpbGUKLWZpCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gYnNkL3N5c3YgdHlwZWRlZnMpCi0gICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogaW50OF90IGludDE2X3QgaW50MzJfdCBkZWZpbmVkIGJ5IGluZXQgY29kZSwgcmVkZWNsYXJlIHRoZSB1X2ludFhYIHR5cGVzICovCi10eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Ci10eXBlZGVmIHVfaW50MTZfdCB1aW50MTZfdDsKLXR5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OwotRU9GCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIGdsaWJjIGNvbXBhdGliaWxpdHkgKi8KLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi0jZW5kaWYKLUVPRgotZmkKLQotYWNfY3Zfc2l6ZW9mX3g9IiRhY19jdl9zaXplb2ZfY2hhcjokYWNfY3Zfc2l6ZW9mX3Nob3J0IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX2ludCIKLWFjX2N2X3NpemVvZl9YPSIkYWNfY3Zfc2l6ZW9mX1g6JGFjX2N2X3NpemVvZl92b2lkcDokYWNfY3Zfc2l6ZW9mX2xvbmciCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPSAic3RkZGVmLmgiIDsgdGhlbgotIyAgIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLAotIyB0aGVyZSBhIGZldyAzMi1iaXQtb25seSBkc3Atc3lzdGVtcy4gbmliYmxlLWFkZHJlc3NhYmxlIHN5c3RlbXMgYXJlIHdheSBvZmYuCi0gICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAtLS0tLS0tLS0tLS0gQklUU1BFQ0lGSUMgSU5UVFlQRVMgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICAgIHQ9InR5cGVkZWZzIGZvciBhIgotICAgIGNhc2UgIiRhY19jdl9zaXplb2ZfWCIgaW4KLSAgICAgMToyOjI6Mjo0KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IG5vcm1hbCAxNi1iaXQgc3lzdGVtKQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDE2LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6Mjo0OjQpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQpCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAgICAgICAgICAgICAgYSAzMi1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDE2LWJpdCAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0OjQ6NCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCBub3JtYWwgMzItYml0IHN5c3RlbSkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6NDo4KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gcHJlcGFyZWQgZm9yIDY0LWJpdCkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0ICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo4OjgpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgbm9ybWFsIDY0LWJpdCBzeXN0ZW0pCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIG5vcm1hbCA2NC1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo0KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IDY0LWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMzItYml0KQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSA2NC1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDMyLWJpdCBzeXN0ZW0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICopCi0gICAgQUNfTVNHX0VSUk9SKFsgJGFjX2N2X3NpemVvZl9YIGRubAotIHdoYXQgaXMgdGhhdCBhIHN5c3RlbT8gY29udGFjdCB0aGUgYXV0aG9yLCBxdWljayEgaHR0cDovL2FjLWFyY2hpdmUuc2YubmV0XSkKLSAgICBleGl0IDEKLTs7Ci0gICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBiYXNpYyBpbnQgdHlwZXMgU1RBUlQgaW50NjRfdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiCi10aGVuIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gZ29vZCB1aW50NjRfdCkKLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgZ29vZCB1aW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotI2VuZGlmCi1FT0YKLQotZWxpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91X2ludDY0X3QiID0gInllcyIKLXRoZW4gQUNfTVNHX1JFU1VMVCguLmFkZGluZyB0eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdCkKLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgYW4gdV9pbnQ2NF90ICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi1lbHNlIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgZ2VuZXJpYyB1aW50NjRfdCBydW50aW1lIGNoZWNrcykKLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDY0IEJJVCBHRU5FUklDIFNFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGhlcmUgYXJlIHNvbWUgY29tbW9uIGhldXJpc3RpY3MgdXNpbmcgY29tcGlsZXIgcnVudGltZSBzcGVjaWZpY3MgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fID4gMTk5OTAxTAotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLQotI2VsaWYgIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fV0FUQ09NQ19fIHx8IGRlZmluZWQgX19CT1JMQU5EQ19fCi0KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQgX19HTlVDX18gfHwgZGVmaW5lZCBfX01XRVJLU19fIHx8IGRlZmluZWQgX19FTEZfXwotZG5sIC8qIG5vdGU6IGFsbCBFTEYtc3lzdGVtcyBzZWVtIHRvIGhhdmUgbG9mZi1zdXBwb3J0IHdoaWNoIG5lZWRzIDY0LWJpdCAqLwotCi0jaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fYWxwaGEgfHwgKGRlZmluZWQgX19taXBzICYmIGRlZmluZWQgX0FCSU4zMikKLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLSNlbmRpZgotICAvKiBjb21waWxlci9jcHUgdHlwZSAuLi4gb3IganVzdCBJU08gQzk5ICovCi0jZW5kaWYKLSNlbmRpZgotRU9GCi0KLSMgcGx1cyBhIGRlZmF1bHQgNjQtYml0IGZvciBzeXN0ZW1zIHRoYXQgYXJlIGxpa2VseSB0byBiZSA2NC1iaXQgcmVhZHkKLSAgY2FzZSAiJGFjX2N2X3NpemVvZl94OiRhY19jdl9zaXplb2Zfdm9pZHA6JGFjX2N2X3NpemVvZl9sb25nIiBpbgotICAgIDE6Mjo4OjgpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCwgbm9ybWFsIDY0LWJpdCBzeXN0ZW0pCi1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIG5vcm1hbCA2NC1iaXQgc3lzdGVtLCBDQyBoYXMgc2l6ZW9mKGxvbmcgYW5kIHZvaWQqKSA9PSA4IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgIDE6Mjo0OjgpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCwgdHlwZWRlZiB0byBsb25nKQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQsIENDIGhhcyBzaXplb2YobG9uZykgPT0gOCBieXRlcyAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAxOjI6ODo0KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQsIHR5cGVkZWYgbG9uZyBsb25nKQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiA2NC1iaXQgZGVyaXZlZCBmcm9tIGEgMzItYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDQgYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi07OwotICAgKikKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogTk9URTogKi8KLS8qIHRoZSBjb25maWd1cmUtY2hlY2tzIGZvciB0aGUgYmFzaWMgdHlwZXMgZGlkIG5vdCBtYWtlIHVzIGJlbGlldmUgKi8KLS8qIHRoYXQgd2UgY291bGQgYWRkIGEgZmFsbGJhY2sgdG8gYSAnbG9uZyBsb25nJyB0eXBlZGVmIHRvIGludDY0X3QgKi8KLUVPRgotICBlc2FjCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnQ2NF90IHR5cGVzIFNUQVJUIGludHB0ciB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVFIgU0VDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUVPRgotICBjYXNlICIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl92b2lkcCIgaW4KLSAgMToyOjIpCi0gICAgYT0iaW50MTZfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDIgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMTYtYml0ICovCi0KLXR5cGVkZWYgdWludDE2X3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MTZfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo0KQotICAgIGE9ImludDMyX3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA0IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDMyLWJpdCAqLwotCi10eXBlZGVmIHVpbnQzMl90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDMyX3QgIGludHB0cl90OwotRU9GCi07OwotICAxOjI6OCkKLSAgICBhPSJpbnQ2NF90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgOCBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCA2NC1iaXQgKi8KLQotdHlwZWRlZiB1aW50NjRfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQ2NF90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgKikKLSAgICBhPSJsb25nIiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgYnV0IGdvdCBubyBndWVzcywgaGVuY2Ugd2UgZGVjbGFyZSBpdCBhcyBpZiBsb25nICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgIGludHB0cl90OwotRU9GCi07OwotICBlc2FjCi1BQ19NU0dfUkVTVUxUKC4uYWRkaW5nIHR5cGVkZWYgJGEgaW50cHRyX3QpCi1maQotCi0jIC0tLS0tLS0tLS0tLS0gRE9ORSBpbnRwdHIgdHlwZXMgU1RBUlQgaW50X2xlYXN0IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAibm8iOyB0aGVuCi1BQ19NU0dfUkVTVUxUKC4uYWRkaW5nIGdlbmVyaWMgaW50X2xlYXN0LXR5cGVzKQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9MRUFTVCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiAgaW50OF90ICAgIGludF9sZWFzdDhfdDsKLXR5cGVkZWYgIGludDE2X3QgICBpbnRfbGVhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiAgaW50NjRfdCAgIGludF9sZWFzdDY0X3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiB1aW50OF90ICAgdWludF9sZWFzdDhfdDsKLXR5cGVkZWYgdWludDE2X3QgIHVpbnRfbGVhc3QxNl90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9sZWFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiB1aW50NjRfdCAgdWludF9sZWFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotIyAtLS0tLS0tLS0tLS0tIERPTkUgaW50cHRyIHR5cGVzIFNUQVJUIGludF9sZWFzdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSAibm8iOyB0aGVuCi1BQ19NU0dfUkVTVUxUKC4uYWRkaW5nIGdlbmVyaWMgaW50X2Zhc3QtdHlwZXMpCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLUdFTkVSSUMgSU5UX0ZBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfZmFzdDhfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiB1aW50NjRfdCAgdWludF9mYXN0NjRfdDsKLSNlbmRpZgotRU9GCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmIGludDY0X3QgICAgICAgIGludG1heF90OwotdHlwZWRlZiB1aW50NjRfdCAgICAgIHVpbnRtYXhfdDsKLSNlbHNlCi10eXBlZGVmIGxvbmcgaW50ICAgICAgIGludG1heF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRtYXhfdDsKLSNlbmRpZgotRU9GCi1maQotCi1BQ19NU0dfUkVTVUxUKC4uLiBET05FICRhY19zdGRpbnRfaCkKLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0gIC8qIG9uY2UgKi8KLSNlbmRpZgotI2VuZGlmCi1FT0YKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo1MTg6IC0xLSBBQ19ERUZVTihbQVhfUFJFRklYX0NPTkZJR19IXSwgW0FDX1JFUVVJUkUoW0FDX0NPTkZJR19IRUFERVJdKQotQUNfQ09ORklHX0NPTU1BTkRTKFtpZmVsc2UoJDEsLCRQQUNLQUdFLWNvbmZpZy5oLCQxKV0sW2RubAotQVNfVkFSX1BVU0hERUYoW19PVVRdLFthY19wcmVmaXhfY29uZl9PVVRdKWRubAotQVNfVkFSX1BVU0hERUYoW19ERUZdLFthY19wcmVmaXhfY29uZl9ERUZdKWRubAotQVNfVkFSX1BVU0hERUYoW19QS0ddLFthY19wcmVmaXhfY29uZl9QS0ddKWRubAotQVNfVkFSX1BVU0hERUYoW19MT1ddLFthY19wcmVmaXhfY29uZl9MT1ddKWRubAotQVNfVkFSX1BVU0hERUYoW19VUFBdLFthY19wcmVmaXhfY29uZl9VUFBdKWRubAotQVNfVkFSX1BVU0hERUYoW19JTlBdLFthY19wcmVmaXhfY29uZl9JTlBdKWRubAotbTRfcHVzaGRlZihbX3NjcmlwdF0sW2NvbmZ0ZXN0LnByZWZpeF0pZG5sCi1tNF9wdXNoZGVmKFtfc3ltYm9sXSxbbTRfY3JfTGV0dGVyc1tdbTRfY3JfZGlnaXRzW11fXSlkbmwKLV9PVVQ9YGVjaG8gaWZlbHNlKCQxLCAsICRQQUNLQUdFLWNvbmZpZy5oLCAkMSlgCi1fREVGPWBlY2hvIF8kX09VVCB8IHNlZCAtZSAieTptNF9jcl9sZXR0ZXJzOm00X2NyX0xFVFRFUlNbXToiIC1lICJzL0A8OkBebTRfY3JfTGV0dGVyc0A6PkAvXy9nImAKLV9QS0c9YGVjaG8gaWZlbHNlKCQyLCAsICRQQUNLQUdFLCAkMilgCi1fTE9XPWBlY2hvIF8kX1BLRyB8IHNlZCAtZSAieTptNF9jcl9MRVRURVJTLTptNF9jcl9sZXR0ZXJzW11fOiJgCi1fVVBQPWBlY2hvICRfUEtHIHwgc2VkIC1lICJ5Om00X2NyX2xldHRlcnMtOm00X2NyX0xFVFRFUlNbXV86IiAgLWUgIi9eQDw6QG00X2NyX2RpZ2l0c0A6PkAvcy9eL18vImAKLV9JTlA9YGVjaG8gaWZlbHNlKCQzLCAsIF8sICQzKWAKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfSEVBREVSUzsgZG8gdGVzdCAiXyRhY19maWxlIiA9IF86ICYmIGNvbnRpbnVlCi0gICAgIHRlc3QgLWYgIiRhY19wcmVmaXhfY29uZl9JTlAiICYmIGNvbnRpbnVlCi0gICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAgICAgKi5oKSB0ZXN0IC1mICRhY19maWxlICYmIF9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRfSU5QIiA9ICJfIjsgdGhlbgotICAgY2FzZSAiJF9PVVQiIGluCi0gICAgICAqLyopIF9JTlA9YGJhc2VuYW1lICIkX09VVCJgCi0gICAgICA7OwotICAgICAgKi0qKSBfSU5QPWBlY2hvICIkX09VVCIgfCBzZWQgLWUgInMvQDw6QF9zeW1ib2xAOj5AKi0vLyJgCi0gICAgICA7OwotICAgICAgKikgX0lOUD1jb25maWcuaAotICAgICAgOzsKLSAgIGVzYWMKLWZpCi1pZiB0ZXN0IC16ICIkX1BLRyIgOyB0aGVuCi0gICBBQ19NU0dfRVJST1IoW25vIHByZWZpeCBmb3IgX1BSRUZJWF9QS0dfQ09ORklHX0hdKQotZWxzZQotICBpZiB0ZXN0ICEgLWYgIiRfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kX0lOUCIgOyB0aGVuCi0gICAgIF9JTlA9IiRzcmNkaXIvJF9JTlAiCi0gIGZpIGZpCi0gIEFDX01TR19OT1RJQ0UoY3JlYXRpbmcgJF9PVVQgLSBwcmVmaXggJF9VUFAgZm9yICRfSU5QIGRlZmluZXMpCi0gIGlmIHRlc3QgLWYgJF9JTlAgOyB0aGVuCi0gICAgZWNobyAicy9AJTpAdW5kZWYgICpcXChAPDpAbTRfY3JfTEVUVEVSU1tdX0A6PkBcXCkvQCU6QHVuZGVmICRfVVBQIiJfXFwxLyIgPiBfc2NyaXB0Ci0gICAgIyBubyEgdGhlc2UgYXJlIHRoaW5ncyBsaWtlIHNvY2tsZW5fdCwgY29uc3QsIHZmb3JrCi0gICAgIyBlY2hvICJzL0AlOkB1bmRlZiAgKlxcKEA8OkBtNF9jcl9sZXR0ZXJzQDo+QFxcKS9AJTpAdW5kZWYgJF9MT1ciIl9cXDEvIiA+PiBfc2NyaXB0Ci0gICAgZWNobyAicy9AJTpAZGVmW11pbmUgICpcXChAPDpAbTRfY3JfTEVUVEVSU1tdX0A6PkBAPDpAX3N5bWJvbEA6PkAqXFwpXFwoLipcXCkvQCU6QGlmbmRlZiAkX1VQUCIiX1xcMSBcXCIgPj4gX3NjcmlwdAotICAgIGVjaG8gIkAlOkBkZWZbXWluZSAkX1VQUCIiX1xcMSBcXDIgXFwiID4+IF9zY3JpcHQKLSAgICBlY2hvICJAJTpAZW5kaWYvIiA+Pl9zY3JpcHQKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX2xldHRlcnNAOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIkAlOkBkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIkAlOkBpZm5kZWYgJF9ERUYiICAgICAgPiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAiQCU6QGRlZltdaW5lICRfREVGIDEiID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAvJyonICRfT1VULiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCBlbmQgb2YgY29uZmlndXJlLiAnKicvID4+JHRtcC9wY29uZmlnLmgKLQotICAgIHNlZCAtZiBfc2NyaXB0ICRfSU5QID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAnLyogb25jZTonICRfREVGICcqLycgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gIkAlOkBlbmRpZiIgPj4kdG1wL3Bjb25maWcuaAotICAgIGlmIGNtcCAtcyAkX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgQUNfTVNHX05PVElDRShbJF9PVVQgaXMgdW5jaGFuZ2VkXSkKLSAgICBlbHNlCi0gICAgICBhY19kaXI9YEFTX0RJUk5BTUUoWyIkX09VVCJdKWAKLSAgICAgIEFTX01LRElSX1AoWyIkYWNfZGlyIl0pCi0gICAgICBybSAtZiAiJF9PVVQiCi0gICAgICBtdiAkdG1wL3Bjb25maWcuaCAiJF9PVVQiCi0gICAgZmkKLSAgICBjcCBfc2NyaXB0IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFtpbnB1dCBmaWxlICRfSU5QIGRvZXMgbm90IGV4aXN0IC0gc2tpcCBnZW5lcmF0aW5nICRfT1VUXSkKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuKgotZmkKLW00X3BvcGRlZihbX3N5bWJvbF0pZG5sCi1tNF9wb3BkZWYoW19zY3JpcHRdKWRubAotQVNfVkFSX1BPUERFRihbX0lOUF0pZG5sCi1BU19WQVJfUE9QREVGKFtfVVBQXSlkbmwKLUFTX1ZBUl9QT1BERUYoW19MT1ddKWRubAotQVNfVkFSX1BPUERFRihbX1BLR10pZG5sCi1BU19WQVJfUE9QREVGKFtfREVGXSlkbmwKLUFTX1ZBUl9QT1BERUYoW19PVVRdKWRubAotXSxbUEFDS0FHRT0iJFBBQ0tBR0UiXSldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjI5OiAtMS0gQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtBQ19SRVFVSVJFKFtfQUNfUFJPR19MSUJUT09MXSlkbmwKLWRubCBJZiBBQ19QUk9HX0NYWCBoYXMgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLCBydW4gQUNfTElCVE9PTF9DWFgKLWRubCBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlLCBob29rIGl0IGluIGF0IHRoZSBlbmQgb2YgQUNfUFJPR19DWFguCi0gIEFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCi0gICAgW0FDX0xJQlRPT0xfQ1hYXSwKLSAgICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbQUNfTElCVE9PTF9DWFgKLSAgXSldKQotZG5sIEFuZCBhIHNpbWlsYXIgc2V0dXAgZm9yIEZvcnRyYW4gNzcgc3VwcG9ydAotICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAotICAgIFtBQ19MSUJUT09MX0Y3N10sCi0gICAgW2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0FDX0xJQlRPT0xfRjc3Ci1dKV0pCi0KLWRubCBRdW90ZSBBTV9QUk9HX0dDSiBzbyB0aGF0IGFjbG9jYWwgZG9lc24ndCBicmluZyBpdCBpbiBuZWVkbGVzc2x5LgotZG5sIElmIGVpdGhlciBBQ19QUk9HX0dDSiBvciBBTV9QUk9HX0dDSiBoYXZlIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuCi1kbmwgQUNfTElCVE9PTF9HQ0ogaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIGJvdGguCi0gIEFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCi0gICAgW0FDX0xJQlRPT0xfR0NKXSwKLSAgICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAotICAgICAgW0FDX0xJQlRPT0xfR0NKXSwKLSAgICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfQUNfUFJPR19HQ0pdLAotCVtBQ19MSUJUT09MX0dDSl0sCi0gICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSwKLQkgICAgIFtkZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSkKLSAgICAgICBpZmRlZihbQV1bTV9QUk9HX0dDSl0sCi0JICAgICBbZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKQotICAgICAgIGlmZGVmKFtMVF9BQ19QUk9HX0dDSl0sCi0JICAgICBbZGVmaW5lKFtMVF9BQ19QUk9HX0dDSl0sCi0JCWRlZm4oW0xUX0FDX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pXSldKQotXSldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjY0OiAtMS0gQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdLCBbQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9DWFhdKWRubAotQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfRjc3XSlkbmwKLUFDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0dDSl0pZG5sCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCi1kZWZpbmUoW0FDX1BST0dfTElCVE9PTF0sIFtdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY4NDogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSwgW0FDX1BSRVJFUSgyLjUwKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotQUNfUkVRVUlSRShbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKWRubAotIyBBdXRvY29uZiAyLjEzJ3MgQUNfT0JKRVhUIGFuZCBBQ19FWEVFWFQgbWFjcm9zIG9ubHkgd29ya3MgZm9yIEMgY29tcGlsZXJzIQotQUNfUkVRVUlSRShbQUNfT0JKRVhUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VYRUVYVF0pZG5sCi1kbmwKLQotQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4KLUFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQotQUNfTElCVE9PTF9PQkpESVIKLQotQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCi1fTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0gICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi0gIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICAgIENPTExFQ1RfTkFNRVM9Ci0gICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSAxcy9eWC8vJwotW3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnXQotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLVtkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnXQotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLQotIyBDb25zdGFudHM6Ci1ybT0icm0gLWYiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLQotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCi0jIHdoaWNoIG5lZWRzICcubGliJykuCi1saWJleHQ9YQotbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi13aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgotCi1BQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCi0KLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLXRlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Ci10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi10ZXN0IC16ICIkQ0MiICYmIENDPWNjCi10ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKLXRlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgQUNfUEFUSF9NQUdJQwotICBmaQotICA7OwotZXNhYwotCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9ETE9QRU5dLCBlbmFibGVfZGxvcGVuPXllcywgZW5hYmxlX2Rsb3Blbj1ubykKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1lbmFibGVfd2luMzJfZGxsPXllcywgZW5hYmxlX3dpbjMyX2RsbD1ubykKLQotQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAotCVthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotQUNfQVJHX1dJVEgoW3BpY10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtcGljXSwKLQlbdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlIGJvdGhAOj5AXSldLAotICAgIFtwaWNfbW9kZT0iJHdpdGh2YWwiXSwKLSAgICBbcGljX21vZGU9ZGVmYXVsdF0pCi10ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKLQotIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKLXRhZ25hbWU9Ci1BQ19MSUJUT09MX0xBTkdfQ19DT05GSUcKLV9MVF9BQ19UQUdDT05GSUcKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo4Mjk6IC0xLSBBQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00Ojg0NjogLTEtIEFDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdLCBbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6ODYzOiAtMS0gQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00Ojg3NjogLTEtIEFDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00Ojg5MzogLTEtIEFDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwgW0FDX0xJTktfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTSxbCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmldLFtdKQotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6OTA2OiAtMS0gQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSwgW2lmZGVmKFtBQ19ESVZFUlNJT05fTk9USUNFXSwKLQkgICAgIFtBQ19ESVZFUlRfUFVTSChBQ19ESVZFUlNJT05fTk9USUNFKV0sCi0JIFtBQ19ESVZFUlRfUFVTSChOT1RJQ0UpXSkKLSQxCi1BQ19ESVZFUlRfUE9QCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6OTE5OiAtMS0gQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwgW19MVF9BQ19TSEVMTF9JTklUKFsKLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLWNhc2UgWCRFQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAotICA7OwotZXNhYwotCi1lY2hvPSR7RUNITy1lY2hvfQotaWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotZmkKLQotaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLVskXSoKLUVPRgotICBleGl0IDAKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLWlmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0jIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgZWNobz0ncHJpbnQgLXInCi0gICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKLQkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAlc1xuJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgNTBxICJbJF0wIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAotCSAgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICJbJF0wIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIlskXTAiICR7MSsiWyRdQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQotIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCi1FQ0hPPSRlY2hvCi1pZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXFskXTAgLS1mYWxsYmFjay1lY2hvIgotZmkKLQotQUNfU1VCU1QoRUNITykKLV0pXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjEwNzM6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xPQ0tdLCBbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAotCVthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgJGhvc3QgaW4KLWlhNjQtKi1ocHV4KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqRUxGLTMyKikKLSAgICAgIEhQVVhfSUE2NF9NT0RFPSIzMiIKLSAgICAgIDs7Ci0gICAgKkVMRi02NCopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotICAgICAgOzsKLSAgICBlc2FjCi0gICBlbHNlCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAgIHg4Nl82NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKLSAgICAgICAgICA7OwotICAgICAgICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgotICAgICAgICAgIDs7Ci0gICAgICAgIHMzOTB4LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgotICAgICAgICAgIDs7Ci0gICAgICAgIHNwYXJjNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAgIHg4Nl82NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgotICAgICAgICAgIDs7Ci0gICAgICAgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKLSAgICAgICAgICA7OwotICAgICAgICBzMzkwKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgotICAgICAgICAgIDs7Ci0gICAgICAgIHNwYXJjKi0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX0xBTkdfUFVTSChDKQotICAgICBBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKLSAgICAgQUNfTEFOR19QT1BdKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7Owotc3BhcmMqLSpzb2xhcmlzKikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7Ci0gICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKLVsqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCi0gIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKLSAgOzsKLSAgXSkKLWVzYWMKLQotbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0KLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxMjE5OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSkKLUFDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCi0gIFskMj1ubwotICBpZmVsc2UoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiQzIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAkMj15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi1dKQotCi1pZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgotICAgIGlmZWxzZShbJDVdLCAsIDosIFskNV0pCi1lbHNlCi0gICAgaWZlbHNlKFskNl0sICwgOiwgWyQ2XSkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTI2NDogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKLSAgWyQyPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJDMiCi0gICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgJDI9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgICQyPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi1dKQotCi1pZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgotICAgIGlmZWxzZShbJDRdLCAsIDosIFskNF0pCi1lbHNlCi0gICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTI5OTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFsjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLUFDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQotQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCi0gIGk9MAotICB0ZXN0c3RyaW5nPSJBQkNEIgotCi0gIGNhc2UgJGJ1aWxkX29zIGluCi0gIG1zZG9zZGpncHAqKQotICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKLSAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCi0gICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKLSAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0Ci0gICAgOzsKLQotICBnbnUqKQotICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcwotICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcwotICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCi0gICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKLSAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCi0gICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgotICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQotICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCi0gICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKLSAgICA7OwotCi0gIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCi0gICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCi0gICAgZmkKLSAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKLSAgICA7OwotCi0gIGludGVyaXgqKQotICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKLSAgICA7OwotCi0gIG9zZiopCi0gICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCi0gICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKLSAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgotICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAotICAgICMKLSAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgotICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KLSAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0gIHNjbzMuMnY1KikKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCi0gICAgOzsKLSAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQotICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbIAldXS8vJ2AKLSAgICBlbHNlCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKLSAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAotICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQotICAgIHdoaWxlICh0ZXN0ICJYImAkU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgotCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgotCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKLQkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCi0gICAgZG8KLSAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgZG9uZQotICAgIHRlc3RzdHJpbmc9Ci0gICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCi0gICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KLSAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAotICAgIDs7Ci0gIGVzYWMKLV0pCi1pZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNDE0OiAtMS0gQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0sIFtBQ19DSEVDS19IRUFERVJTKGRsZmNuLmgpZG5sCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTQyMjogLTEtIEFDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwgW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIFskNF0KLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi1bI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRzIChkbGVycm9yICgpKTsKLQotICAgIGV4aXQgKHN0YXR1cyk7Ci19XQotRU9GCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKLSAgICAgIHgkbHRfZGx1bmtub3dufHgqKSAkMyA7OwotICAgIGVzYWMKLSAgZWxzZSA6Ci0gICAgIyBjb21waWxhdGlvbiBmYWlsZWQKLSAgICAkMwotICBmaQotZmkKLXJtIC1mciBjb25mdGVzdCoKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNTEyOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBtaW5ndyogfCBwdzMyKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBjeWd3aW4qKQotICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBkYXJ3aW4qKQotICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAotICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKLQkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKLSAgICBsdF9jdl9kbG9wZW49ImR5bGQiCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgXSkKLSAgIDs7Ci0KLSAgKikKLSAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCi0JICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAotICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKLQkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIl0sCi0JW0FDX0NIRUNLX0ZVTkMoW2Rsb3Blbl0sCi0JICAgICAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIl0sCi0JICBbQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAotCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sCi0JICAgIFtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKLQkJICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiXSwKLQkgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAotCQkgICAgW2x0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIl0pCi0JICAgICAgXSkKLQkgICAgXSkKLQkgIF0pCi0JXSkKLSAgICAgIF0pCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBlbHNlCi0gICAgZW5hYmxlX2Rsb3Blbj1ubwotICBmaQotCi0gIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgotICBkbG9wZW4pCi0gICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgotICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotCi0gICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0KLSAgICBzYXZlX0xJQlM9IiRMSUJTIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCi0JICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAotCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKLSAgICBdKQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCi0gICAgCSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljLCBbZG5sCi0JICBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGKAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8sICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MpCi0gICAgICBdKQotICAgIGZpCi0KLSAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCi0gICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSAgICBMSUJTPSIkc2F2ZV9MSUJTIgotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKLSAgZXNhYwotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNjI2OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLCBbQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCi1BQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCi0gIFtfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAotICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCi0gICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLSAgIG1rZGlyIGNvbmZ0ZXN0Ci0gICBjZCBjb25mdGVzdAotICAgbWtkaXIgb3V0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcwotICAgICBmaQotICAgZmkKLSAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNjc3OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19SRVFVSVJFKFtfTFRfQUNfTE9DS10pZG5sCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rc10pCi0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIEFDX01TR19SRVNVTFQoWyRoYXJkX2xpbmtzXSkKLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBgLWMgLW8nLCBzbyBgbWFrZSAtaicgbWF5IGJlIHVuc2FmZV0pCi0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTcwMzogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX09CSkRJUl0sIFtBQ19DQUNIRV9DSEVDSyhbZm9yIG9iamRpcl0sIFtsdF9jdl9vYmpkaXJdLAotW3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBsdF9jdl9vYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgbHRfY3Zfb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGxdKQotb2JqZGlyPSRsdF9jdl9vYmpkaXIKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNzIxOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwgW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQotaWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fCBcCi0gICB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fCBcCi0gICB0ZXN0ICJYJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkiICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKSIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpIiAhPSBubzsgdGhlbgotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT11bnN1cHBvcnRlZAotZmkKLUFDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpXSkKLQotaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkiID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjE3NjE6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwgW3N0cmlwbGliPQotb2xkX3N0cmlwbGliPQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQotaWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgotICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgotICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKLSAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLWVsc2UKLSMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAotICBjYXNlICRob3N0X29zIGluCi0gICBkYXJ3aW4qKQotICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCi0gICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgotICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICAgICBlbHNlCi0gIEFDX01TR19SRVNVTFQoW25vXSkKLWZpCi0gICAgICAgOzsKLSAgICopCi0gIEFDX01TR19SRVNVTFQoW25vXSkKLSAgICA7OwotICBlc2FjCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjE3OTE6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLCBbQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotc2hyZXh0X2NtZHM9Ii5zbyIKLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCi0gICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCi0gICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCi0gICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICBmaQotZWxzZQotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotbmVlZF92ZXJzaW9uPXVua25vd24KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZWxzZQotICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKLSAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCi0gICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bwotICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCi0gICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGlbWzQ1XV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgW2dyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCi0gICAgOzsKLSAgZXNhYwotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KLSAgc2hsaWJwYXRoX3Zhcj1QQVRICi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgotICB2ZXJzaW9uX3R5cGU9ZGFyd2luCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKLSAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi1rZnJlZWJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1mcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKLSAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCi0gIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0gICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLltbMDFdXSogfCBmcmVlYnNkZWxmMy5bWzAxXV0qKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuW1syLTldXSogfCBmcmVlYnNkZWxmMy5bWzItOV1dKiB8IFwKLSAgZnJlZWJzZDQuW1swLTVdXSB8IGZyZWVic2RlbGY0LltbMC01XV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFxbJF0yKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcWyRdMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQota25ldGJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLW5ld3NvczYpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1udG8tcW54KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7Ci0gICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OwotICBlc2FjCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLUFDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCi10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjM5MTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfVEFHQ09ORklHXSwgW0FDX0FSR19XSVRIKFt0YWdzXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC10YWdzQDw6QD1UQUdTQDo+QF0sCi0gICAgICAgIFtpbmNsdWRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgQDw6QGF1dG9tYXRpY0A6PkBdKV0sCi0gICAgW3RhZ25hbWVzPSIkd2l0aHZhbCJdKQotCi1pZiB0ZXN0IC1mICIkbHRtYWluIiAmJiB0ZXN0IC1uICIkdGFnbmFtZXMiOyB0aGVuCi0gIGlmIHRlc3QgISAtZiAiJHtvZmlsZX0iOyB0aGVuCi0gICAgQUNfTVNHX1dBUk4oW291dHB1dCBmaWxlIGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0XSkKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KLSAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0M9J2AiCi0gICAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCi0gICAgICBBQ19NU0dfV0FSTihbb3V0cHV0IGZpbGUgYCRvZmlsZScgZG9lcyBub3QgbG9vayBsaWtlIGEgbGlidG9vbCBzY3JpcHRdKQotICAgIGVsc2UKLSAgICAgIEFDX01TR19XQVJOKFt1c2luZyBgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIGAkb2ZpbGUnXSkKLSAgICBmaQotICBmaQotICBpZiB0ZXN0IC16ICIkTFRDRkxBR1MiOyB0aGVuCi0gICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENGTEFHUz0nYCIKLSAgZmkKLQotICAjIEV4dHJhY3QgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIGluICRvZmlsZS4KLSAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBlbnRpcmUgbGlzdCBpcyBvbiBvbmUgbGluZS4KLSAgYXZhaWxhYmxlX3RhZ3M9YGdyZXAgIl5hdmFpbGFibGVfdGFncz0iICIke29maWxlfSIgfCAkU0VEIC1lICdzL2F2YWlsYWJsZV90YWdzPVwoLiokXCkvXDEvJyAtZSAncy9cIi8vZydgCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gIGZvciB0YWduYW1lIGluICR0YWduYW1lczsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKLSAgICBjYXNlIGAkZWNobyAiWCR0YWduYW1lIiB8ICRYc2VkIC1lICdzOltbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXV06OmcnYCBpbgotICAgICIiKSA7OwotICAgICopICBBQ19NU0dfRVJST1IoW2ludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lXSkKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgQUNfTVNHX0VSUk9SKFt0YWcgbmFtZSBcIiR0YWduYW1lXCIgYWxyZWFkeSBleGlzdHNdKQotICAgIGZpCi0KLSAgICAjIFVwZGF0ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIGVjaG8gYXBwZW5kaW5nIGNvbmZpZ3VyYXRpb24gdGFnIFwiJHRhZ25hbWVcIiB0byAkb2ZpbGUKLQotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgQ1hYKQotCWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0JICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotCSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KLQkgIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCi0JZWxzZQotCSAgdGFnbmFtZT0iIgotCWZpCi0JOzsKLQotICAgICAgRjc3KQotCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgotCSAgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBHQ0opCi0JaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCi0JICBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRwotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIFJDKQotCUFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKLQk7OwotCi0gICAgICAqKQotCUFDX01TR19FUlJPUihbVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lXSkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFwcGVuZCB0aGUgbmV3IHRhZyBuYW1lIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICAgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiIDsgdGhlbgotICAgICAgYXZhaWxhYmxlX3RhZ3M9IiRhdmFpbGFibGVfdGFncyAkdGFnbmFtZSIKLSAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgIyBOb3cgc3Vic3RpdHV0ZSB0aGUgdXBkYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICBpZiBldmFsICJzZWQgLWUgJ3MvXmF2YWlsYWJsZV90YWdzPS4qXCQvYXZhaWxhYmxlX3RhZ3M9XCIkYXZhaWxhYmxlX3RhZ3NcIi8nIFwiJG9maWxlXCIgPiBcIiR7b2ZpbGV9VFwiIjsgdGhlbgotICAgIG12ICIke29maWxlfVQiICIkb2ZpbGUiCi0gICAgY2htb2QgK3ggIiRvZmlsZSIKLSAgZWxzZQotICAgIHJtIC1mICIke29maWxlfVQiCi0gICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy5dKQotICBmaQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNDk2OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNTA0OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjUxMzogLTEtIEFDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwgW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCi0JW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAotICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfc2hhcmVkPV1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjU0MjogLTEtIEFDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU0hBUkVEKG5vKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI1NTI6IC0xLSBBQ19ERUZVTihbQUNfRU5BQkxFX1NUQVRJQ10sIFtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAotCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRbQDo+QF0pXSwKLSAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSAgICAqKQotICAgICBlbmFibGVfc3RhdGljPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3N0YXRpYz15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfc3RhdGljPV1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjU4MTogLTEtIEFDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU1RBVElDKG5vKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI1OTE6IC0xLSBBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sIFtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAotICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVFtAOj5AXSldLAotICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLSAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfZmFzdF9pbnN0YWxsPV1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjYyMDogLTEtIEFDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI2MzA6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLXBpY19tb2RlPWlmZWxzZSgkIywxLCQxLGRlZmF1bHQpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjY1NDogLTEtIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKQotQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTUFHSUNfQ01ELAotW2Nhc2UgJE1BR0lDX0NNRCBpbgotW1tcXC8qXSB8ICA/OltcXC9dKl0pCi0gIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSopCi0gIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWRubCAkYWNfZHVtbXkgZm9yY2VzIHNwbGl0dGluZyBvbiBjb25zdGFudCB1c2VyLXN1cHBsaWVkIHBhdGhzLgotZG5sIFBPU0lYLjIgd29yZCBzcGxpdHRpbmcgaXMgZG9uZSBvbmx5IG9uIHRoZSBvdXRwdXQgb2Ygd29yZCBleHBhbnNpb25zLAotZG5sIG5vdCBldmVyeSB3b3JkLiAgVGhpcyBjbG9zZXMgYSBsb25nc3RhbmRpbmcgc2ggc2VjdXJpdHkgaG9sZS4KLSAgYWNfZHVtbXk9ImlmZWxzZShbJDJdLCAsICRQQVRILCBbJDJdKSIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgotICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgotCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JImZpbGVfbWFnaWMgIiopCi0JICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKLQkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAotCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1FT0YKLQkgIGZpIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCi0gIDs7Ci1lc2FjXSkKLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNzE3OiAtMS0gQUNfREVGVU4oW0FDX1BBVEhfTUFHSUNdLCBbQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCi1pZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICBBQ19QQVRIX1RPT0xfUFJFRklYKGZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCi0gIGVsc2UKLSAgICBNQUdJQ19DTUQ9OgotICBmaQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNzMyOiAtMS0gQUNfREVGVU4oW0FDX1BST0dfTERdLCBbQUNfQVJHX1dJVEgoW2dudS1sZF0sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKLQlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKLSAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKLSAgICBbd2l0aF9nbnVfbGQ9bm9dKQotQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkbHRfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1BST0dfTERfR05VCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjgxNjogLTEtIEFDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKLUFDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGx0X2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhY10pCi13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyODM2OiAtMS0gQUNfREVGVU4oW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddLCBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAotICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKLSAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi1jYXNlICRyZWxvYWRfZmxhZyBpbgotIiIgfCAiICIqKSA7OwotKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Ci1lc2FjCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1jYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBlbHNlCi0gICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZmkKLSAgICA7OwotZXNhYwotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI4NjI6IC0xLSBBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLCBbQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllc10sCi1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKLVtsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKLWx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotCi1jYXNlICRob3N0X29zIGluCi1haXg0KiB8IGFpeDUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1iZW9zKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYnNkaVtbNDVdXSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4KLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKLSAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgZmkKLSAgOzsKLQotZ251KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotaHB1eDEwLjIwKiB8IGhwdXgxMSopCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18RUxGLVtbMC05XV1bWzAtOV1dKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCi0gICAgOzsKLSAgaHBwYSo2NCopCi0gICAgW2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJ10KLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKLSAgICA7OwotICAqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRMRCBpbgotICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OwotICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgZXNhYwotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLW5ldGJzZCopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298X3BpY1wuYSkkJwotICBmaQotICA7OwotCi1uZXdvczYqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCi0gIDs7Ci0KLW50by1xbngqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0gIDs7Ci0KLW9wZW5ic2QqKQotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8XC5zb3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJwotICBmaQotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNvbGFyaXMqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICBjYXNlICRob3N0X3ZlbmRvciBpbgotICBtb3Rvcm9sYSkKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgOzsKLSAgbmNyKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgc2VxdWVudCkKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJwotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gICAgOzsKLSAgc25pKQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gICAgOzsKLSAgc2llbWVucykKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIHBjKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLWVzYWMKLV0pCi1maWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAotdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzA0NDogLTEtIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dLCBsdF9jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4gCi0gICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKLSAgZmkKLSAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCi0gICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCi0gICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0JIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLQkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0JIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCi0JY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCi0JKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQotCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKLQkgIGJyZWFrCi0JICA7OwotCSopCi0JICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkgICovZGV2L251bGwqKQotCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgotCSAgICBicmVhawotCSAgICA7OwotCSAgKikKLQkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIGRvbmUKLSAgdGVzdCAteiAiJGx0X2N2X3BhdGhfTk0iICYmIGx0X2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkbHRfY3ZfcGF0aF9OTSIKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMDk2OiAtMS0gQUNfREVGVU4oW0FDX0NIRUNLX0xJQk1dLCBbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotTElCTT0KLWNhc2UgJGhvc3QgaW4KLSotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCi0gICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAotICA7OwotKi1uY3Itc3lzdjQuMyopCi0gIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQotICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKLSAgOzsKLWVzYWMKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMTI1OiAtMS0gQUNfREVGVU4oW0FDX0xJQkxURExfQ09OVkVOSUVOQ0VdLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotICBjYXNlICRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLSAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKLSAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgotICBJTkNMVERMPSIkTFRETElOQ0wiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzE1MTogLTEtIEFDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIGx0X2RsaW5pdCwKLSAgW3Rlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllcyAmJiBlbmFibGVfbHRkbF9pbnN0YWxsPW5vXSwKLSAgW2lmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4bm87IHRoZW4KLSAgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCi0gICBlbHNlCi0gICAgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICBmaQotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geCJ5ZXMiOyB0aGVuCi0gICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiCi0gICAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsLmxhCi0gICAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBMVERMSU5DTD0KLSAgZmkKLSAgIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgotICBJTkNMVERMPSIkTFRETElOQ0wiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzE3ODogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19DWFhdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMxODU6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSwgW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKLUFDX1JFUVVJUkUoW19MVF9BQ19QUk9HX0NYWENQUF0pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMTkzOiAtMS0gQUNfREVGVU4oW19MVF9BQ19QUk9HX0NYWENQUF0sIFsKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKLWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0gICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8Ci0gICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0gIEFDX1BST0dfQ1hYQ1BQCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMyMDY6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfRjc3XSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjEzOiAtMS0gQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3XSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjIyOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0dDSl0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzIyOTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdLCBbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSxbXSwKLSAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSxbXSwKLSAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX0FDX1BST0dfR0NKXSxbXSwKLSAgICAgIFtpZmRlZihbQUNfUFJPR19HQ0pdLFtBQ19SRVFVSVJFKFtBQ19QUk9HX0dDSl0pXSwKLQkgW2lmZGVmKFtBXVtNX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQV1bTV9QUk9HX0dDSl0pXSwKLQkgICBbQUNfUkVRVUlSRShbQV1bQ19QUk9HX0dDSl9PUl9BXVtNX1BST0dfR0NKXSldKV0pXSldKV0pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9R0NKXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjQzOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbQUNfUkVRVUlSRShbTFRfQUNfUFJPR19SQ10pCi1fTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9UkNdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMyNTQ6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwgW19MVF9BQ19MQU5HX0NfQ09ORklHXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMyNTU6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddLCBbbHRfc2F2ZV9DQz0iJENDIgotQUNfTEFOR19QVVNIKEMpCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1jCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9XG4nCi0KLV9MVF9BQ19TWVNfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKCQxKQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLUFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAotQUNfTElCVE9PTF9ETE9QRU5fU0VMRgotCi0jIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKLUFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLUFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKLQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gICAgOzsKLWVzYWMKLUFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKLQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLUFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUE9QCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzMzNTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DWFhfQ09ORklHKENYWCldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzMzNjogLTEtIEFDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSwgW0FDX0xBTkdfUFVTSChDKyspCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCi1BQ19SRVFVSVJFKFtfTFRfQUNfUFJPR19DWFhDUFBdKQotCi1fTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgotX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQotX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KLV9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpPQotX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQotX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9Y3BwCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH1cbicKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotX0xUX0FDX1NZU19DT01QSUxFUgotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSRDQwotbHRfc2F2ZV9MRD0kTEQKLWx0X3NhdmVfR0NDPSRHQ0MKLUdDQz0kR1hYCi1sdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAotbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECi1pZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCi0gIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKLWZpCi1pZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KLSAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAotZmkKLXRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCi1DQz0ke0NYWC0iYysrIn0KLWNvbXBpbGVyPSRDQwotX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotCi0jIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQotIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJwotZWxzZQotICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9Ci1maQotCi1pZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgotCi0gIEFDX1BST0dfTEQKLQotICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKLSAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bwotICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCi0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwgXAotCWdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gIGVsc2UKLSAgICB3aXRoX2dudV9sZD1ubwotICAgIHdsYXJjPQotCi0gICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KLSAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQotICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCi0gICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCi0gICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCi0gIGZpCi0KLSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLWVsc2UKLSAgR1hYPW5vCi0gIHdpdGhfZ251X2xkPW5vCi0gIHdsYXJjPQotZmkKLQotIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQotCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgY2FzZSAkbGRfZmxhZyBpbgotCSAgKi1icnRsKikKLQkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgYnJlYWsKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICBmaQotCi0gICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQotICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0gICAgICAjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQljb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQl0aGVuCi0JICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JZWxzZQotCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAotCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQlzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgIyBub3QgdXNpbmcgZ2NjCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0JIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQlzaGFyZWRfZmxhZz0nLUcnCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQllbHNlCi0JICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLSAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwotICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgIGVsc2UKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotICAgICAgZWxzZQotCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCV9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKLQkjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0JIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLSAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGNob3J1cyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGVsc2UKLQllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotICAgICAgZml+Ci0gICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIGZpCi0gIDs7Ci0gICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuW1swMTJdXSkKLSAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgZXNhYwotICAgICAgICAgZmkKLSAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCi0gICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICBpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgJEVHUkVQICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIGVsc2UKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgICBmaQotICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KLSAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBmaQotICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBmaQotICAgICAgICA7OwotCi0gIGRndXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBlYysrKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGdoY3gqKQotCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBmcmVlYnNkW1sxMl1dKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKLSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgOzsKLSAgZnJlZWJzZC1lbGYqKQotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIDs7Ci0gIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKLSAgICAjIGNvbnZlbnRpb25zCi0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgICA7OwotICBnbnUqKQotICAgIDs7Ci0gIGhwdXg5KikKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgQ0MqKQotICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotICAgIGFDQyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAjCi0gICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0gICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotICAgICAgIyBkZXBlbmRlbmNpZXMuCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiW1stXV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotICAgICAgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgaHB1eDEwKnxocHV4MTEqKQotICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJwotICAgICAgICA7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICBocHBhKjY0KnxpYTY0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGFDQyopCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaHBwYSo2NCopCi0JICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGlhNjQqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBpbnRlcml4MyopCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgOzsKLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTR0kgQysrCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICBlbHNlCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0JICBmaQotCWZpCi0JX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0JOzsKLSAgICBlc2FjCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgOzsKLSAgbGludXgqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgZ3JlcCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgaWNwYyopCi0JIyBJbnRlbCBDKysKLQl3aXRoX2dudV9sZD15ZXMKLQkjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scwotCSMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCi0JIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KLQljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KLQkqIlZlcnNpb24gNy4iKikKLSAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKLQkgIHRtcF9pZHluPQotCSAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OwotCSAgZXNhYwotICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgOzsKLQllc2FjCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JOzsKLSAgICAgIHBnQ0MqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJwotICAJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0JX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICAgIDs7Ci0gICAgICBjeHgqKQotCSMgQ29tcGFxIEMrKwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCi0KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGx5bnhvcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIG04OGsqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBtdnMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBjeHgqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgIGZpCi0gICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucwotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJwotICAgIDs7Ci0gIG9wZW5ic2QyKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCi0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICBmaQotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgIDs7Ci0gIG9zZjMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJwotCi0JOzsKLSAgICAgIFJDQyopCi0JIyBSYXRpb25hbCBDKysgMi40LjEKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGN4eCopCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG9zZjQqIHwgb3NmNSopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIEtDQyopCi0JIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgotCi0JIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICBjeHgqKQotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgotCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+Ci0JICAkcm0gJGxpYi5leHAnCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCi0KLQllbHNlCi0JICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHBzb3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBzdW5vczQqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTdW4gQysrIDQueAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgbGNjKikKLQkjIEx1Y2lkCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzb2xhcmlzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCi0JX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQljYXNlICRob3N0X29zIGluCi0JICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OwotCSAgKikKLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIGlzIHVzZWQgYXMgbGlua2VyIHNvIHdlIG11c3QgdXNlICR3bAotCSAgICAjIGZsYWcgdG8gcGFzcyB0aGUgY29tbWFuZHMgdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtCi0JICAgICMgbGlua2VyLiBXZSBtdXN0IGFsc28gcGFzcyBlYWNoIGNvbnZpZW5jZSBsaWJyYXJ5IHRocm91Z2gKLQkgICAgIyB0byB0aGUgc3lzdGVtIGxpbmtlciBiZXR3ZWVuIGFsbGV4dHJhY3QvZGVmYXVsdGV4dHJhY3QuCi0JICAgICMgVGhlIEMrKyBjb21waWxlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLQkgICAgIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0JICAgICMgd2l0aG91dCAkd2wuCi0JICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0JICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JwotCSAgICA7OwotCWVzYWMKLQlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JIyBpbiB0aGUgYXJjaGl2ZS4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgZ2N4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQotCSMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgKikKLQkjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCi0JICBpZiAkQ0MgLS12ZXJzaW9uIHwgZ3JlcCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBlbHNlCi0JICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKLQkgICAgIyBwbGF0Zm9ybS4KLQkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKLQkgIGZpCi0KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQotICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0gICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotICAgICMgYXMgLXogZGVmcy4KLSAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCi0gICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKLSAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbwotICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCi0gICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQotICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgotICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KLSAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCi0gICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLSAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICB0YW5kZW0qKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBOQ0MqKQotCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdnh3b3JrcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gICopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCi10ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLV9MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCi1fTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi1BQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKCQxKQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUE9QCi1DQz0kbHRfc2F2ZV9DQwotTERDWFg9JExECi1MRD0kbHRfc2F2ZV9MRAotR0NDPSRsdF9zYXZlX0dDQwotd2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCi13aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAotbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECi1sdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKLWx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDM0MzogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwgWwotZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCi1kbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAotZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAotZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKLWRubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgotaWZlbHNlKFskMV0sW10sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLWludCBhOwotdm9pZCBmb28gKHZvaWQpIHsgYSA9IDA7IH0KLUVPRgotXSxbJDFdLFtDWFhdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi1jbGFzcyBGb28KLXsKLXB1YmxpYzoKLSAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Ci1wcml2YXRlOgotICBpbnQgYTsKLX07Ci1FT0YKLV0sWyQxXSxbRjc3XSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotICAgICAgc3Vicm91dGluZSBmb28KLSAgICAgIGltcGxpY2l0IG5vbmUKLSAgICAgIGludGVnZXIqNCBhCi0gICAgICBhPTAKLSAgICAgIHJldHVybgotICAgICAgZW5kCi1FT0YKLV0sWyQxXSxbR0NKXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotcHVibGljIGNsYXNzIGZvbyB7Ci0gIHByaXZhdGUgaW50IGE7Ci0gIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgewotICAgIGEgPSAwOwotICB9Ci19OwotRU9GCi1dKQotZG5sIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQotZG5sIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci0gICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotCi0gICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKLSAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCi0gIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KLQotICAjIFRoZSBgKicgaW4gdGhlIGNhc2UgbWF0Y2hlcyBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBgY2FzZScgaW4KLSAgIyAkb3V0cHV0X3ZlcmJvc2VfY21kIGNhbiB0cmlnZ2VyIGdsb2IgZXhwYW5zaW9uIGR1cmluZyB0aGUgbG9vcAotICAjIGV2YWwgd2l0aG91dCB0aGlzIHN1YnN0aXR1dGlvbi4KLSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9YCRlY2hvICJYJG91dHB1dF92ZXJib3NlX2xpbmtfY21kIiB8ICRYc2VkIC1lICIkbm9fZ2xvYl9zdWJzdCJgCi0KLSAgZm9yIHAgaW4gYGV2YWwgJG91dHB1dF92ZXJib3NlX2xpbmtfY21kYDsgZG8KLSAgICBjYXNlICRwIGluCi0KLSAgICAtTCogfCAtUiogfCAtbCopCi0gICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KLSAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCi0gICAgICAgaWYgdGVzdCAkcCA9ICItTCIgXAotCSAgfHwgdGVzdCAkcCA9ICItUiI7IHRoZW4KLQkgcHJldj0kcAotCSBjb250aW51ZQotICAgICAgIGVsc2UKLQkgcHJldj0KLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgY2FzZSAkcCBpbgotCSAtTCogfCAtUiopCi0JICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCi0JICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCi0JICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCi0JICAgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCi0JICAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKLQkgICBlbHNlCi0JICAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgotCSAgIGZpCi0JICAgOzsKLQkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKLQkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCi0JIGVzYWMKLSAgICAgICBlbHNlCi0JIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCi0JICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKLQkgZWxzZQotCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICouJG9iamV4dCkKLSAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKLSAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KLSAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KLQkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKLQkgY29udGludWUKLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSI7IHRoZW4KLQkgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRwIgotCSBlbHNlCi0JICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpICRwIgotCSBmaQotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCi0JICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJHAiCi0JIGVsc2UKLQkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSAkcCIKLQkgZmkKLSAgICAgICBmaQotICAgICAgIDs7Ci0KLSAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KLQotICAgIGVzYWMKLSAgZG9uZQotCi0gICMgQ2xlYW4gdXAuCi0gIHJtIC1mIGEub3V0IGEuZXhlCi1lbHNlCi0gIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyAkMSB0ZXN0IHByb2dyYW0iCi1maQotCi0kcm0gLWYgY29uZmVzdC4kb2JqZXh0Ci0KLSMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCi1pZmVsc2UoWyQxXSxbQ1hYXSwKLVtjYXNlICRob3N0X29zIGluCi1pbnRlcml4MyopCi0gICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KLSAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KLSAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywkMSk9Ci0gIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCQxKT0KLSAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywkMSk9Ci0gIDs7Ci0KLXNvbGFyaXMqKQotICBjYXNlICRjY19iYXNlbmFtZSBpbgotICBDQyopCi0gICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKLSAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCi0gICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KLSAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxDc3RkIC1sQ3J1bicKLSAgICA7OwotICBlc2FjCi0gIDs7Ci1lc2FjCi1dKQotCi1jYXNlICIgJF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCi0qIiAtbGMgIiopIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OwotZXNhYwotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ1MDI6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLCBbX0xUX0FDX0xBTkdfRjc3X0NPTkZJRyhGNzcpXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ1MDM6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCi1BQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKLQotX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi1fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KLWFjX2V4dD1mCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSIgICAgICBzdWJyb3V0aW5lIHRcbiAgICAgIHJldHVyblxuICAgICAgZW5kXG4iCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiAgICAgIHByb2dyYW0gdFxuICAgICAgZW5kXG4iCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLV9MVF9BQ19TWVNfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtGNzctImY3NyJ9Ci1jb21waWxlcj0kQ0MKLV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCi10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotYWl4NCogfCBhaXg1KikKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGZpCi0gIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCi0KLV9MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHNzciCi1fTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUE9QCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDYwNDogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sIFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHKEdDSildKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDYwNTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSwgW0FDX0xBTkdfU0FWRQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9amF2YQotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fVxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9XG4nCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLV9MVF9BQ19TWVNfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtHQ0otImdjaiJ9Ci1jb21waWxlcj0kQ0MKLV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgotX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0KLV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi0KLSMjIENBVkVBVCBFTVBUT1I6Ci0jIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoJDEpCi1BQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQotQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKLUFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKLUFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCi1BQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKLUFDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQotCi1BQ19MSUJUT09MX0NPTkZJRygkMSkKLQotQUNfTEFOR19SRVNUT1JFCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDY2NDogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSwgW19MVF9BQ19MQU5HX1JDX0NPTkZJRyhSQyldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDY2NTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddLCBbQUNfTEFOR19TQVZFCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9cmMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfVxuJwotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7UkMtIndpbmRyZXMifQotY29tcGlsZXI9JENDCi1fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1fTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1JFU1RPUkUKLUNDPSIkbHRfc2F2ZV9DQyIKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo0NzA5OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSwgWyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoQ0MsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihMRCwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHBvc3RpbnN0YWxsX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0dW5pbnN0YWxsX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSB8IFwKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSB8IFwKLSAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKSB8IFwKLSAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkgfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1xbJF0wIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXFskXTAgLS1mYWxsYmFjay1lY2hvIlskXS9bJF0wIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLWlmZWxzZShbJDFdLCBbXSwKLSAgW2NmZ2ZpbGU9IiR7b2ZpbGV9VCIKLSAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgJHJtIC1mICIkY2ZnZmlsZSIKLSAgQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJG9maWxlXSldLAotICBbY2ZnZmlsZT0iJG9maWxlIl0pCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi1pZmVsc2UoWyQxXSwgW10sCi1bIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbDoKLSMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgotU0VEPSRsdF9TRUQKLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotIyBUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCi1hdmFpbGFibGVfdGFncz0KLQotIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUddLAotWyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVdKQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X1tdX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRfTFRfQUNfVEFHVkFSKEdDQywgJDEpCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X1tdX0xUX0FDX1RBR1ZBUihMRCwgJDEpCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JGx0X1NUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSkKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKQotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSkKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKQotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCi1zdHJpcGxpYj0kbHRfc3RyaXBsaWIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcF9vYmplY3RzPSRsdF9bXV9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKQotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKQotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfW11fTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKQotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwcz0kbHRfW11fTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKQotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKQotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKQotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJF9MVF9BQ19UQUdWQVIoZml4X3NyY2ZpbGVfcGF0aCwgJDEpIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSkKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKQotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSkKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X1tdX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKQotCi1pZmVsc2UoWyQxXSxbXSwKLVsjICMjIyBFTkQgTElCVE9PTCBDT05GSUddLAotWyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKLQotX19FT0ZfXwotCi1pZmVsc2UoWyQxXSxbXSwgWwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRjZmdmaWxlIgotCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotRU9GCi0gICAgOzsKLSAgZXNhYwotCi0gICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgotICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCi0gICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCi0gICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/Ci0gIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fCBcCi0gICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKLSAgY2htb2QgK3ggIiRvZmlsZSIKLV0pCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo1MTk5OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwgW0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAotCi1fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9Ci0KLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKLQotICBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAotICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCi0gICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjUyMTc6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwgW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKQotQUNfUkVRVUlSRShbQUNfT0JKRVhUXSkKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQotQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKLVsKLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW1tCQ0RFR1JTVF1dJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMTsvcCciCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4KikKLSAgc3ltY29kZT0nW1tCQ0RUXV0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCi0gIGZpCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIDs7Ci1saW51eCopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICBmaQotICA7OwotaXJpeCogfCBub25zdG9wdXgqKQotICBzeW1jb2RlPSdbW0JDREVHUlNUXV0nCi0gIDs7Ci1vc2YqKQotICBzeW1jb2RlPSdbW0JDREVHUVJTVF1dJwotICA7Owotc29sYXJpcyopCi0gIHN5bWNvZGU9J1tbQkRSVF1dJwotICA7Owotc2NvMy4ydjUqKQotICBzeW1jb2RlPSdbW0RUXV0nCi0gIDs7Ci1zeXN2NC4ydXcyKikKLSAgc3ltY29kZT0nW1tEVF1dJwotICA7Owotc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgc3ltY29kZT0nW1tBQkRUXV0nCi0gIDs7Ci1zeXN2NCkKLSAgc3ltY29kZT0nW1tERk5TVFVdXScKLSAgOzsKLWVzYWMKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRidWlsZF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1jYXNlIGAkTk0gLVYgMj4mMWAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKLWVzYWMKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgotCi0gICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbIAldXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbIAldXVtbIAldXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgcGlwZV93b3Jrcz1ubwotCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KLXsKLUVPRgotCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyX3QpIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAotCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0Ci0JICBsdF9zYXZlX0xJQlM9IiRMSUJTIgotCSAgbHRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGZpCi0JICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KiBjb25mdHN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChvaykKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NTQxOTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPQotX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQotCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDXSkKLSBpZmVsc2UoWyQxXSxbQ1hYXSxbCi0gICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgYW1pZ2FvcyopCi0gICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLSAgICBtaW5ndyogfCBvczIqIHwgcHczMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJwotICAgICAgOzsKLSAgICAqZGpncHAqKQotICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0gICAgICA7OwotICAgIGludGVyaXgzKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQqIHwgYWl4NSopCi0JIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQllbHNlCi0JICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLQlmaQotCTs7Ci0gICAgICBjaG9ydXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JY3hjaDY4KikKLQkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgICBkYXJ3aW4qKQotICAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICAgeGxjKikKLSAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcW5vY29tbW9uJwotICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICAgICAgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICA7OwotICAgICAgZGd1eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIGVjKysqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICA7OwotCSAgZ2hjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKLQk7OwotICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JICAgIGZpCi0JICAgIDs7Ci0JICBhQ0MqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaHBwYSo2NCp8aWE2NCopCi0JICAgICAgIyArWiB0aGUgZGVmYXVsdAotCSAgICAgIDs7Ci0JICAgICopCi0JICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgaW50ZXJpeCopCi0JIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCi0JIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PwotCTs7Ci0gICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGxpbnV4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgS0NDKikKLQkgICAgIyBLQUkgQysrIENvbXBpbGVyCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQkgICAgOzsKLQkgIGljcGMqIHwgZWNwYyopCi0JICAgICMgSW50ZWwgQysrCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0JICAgIDs7Ci0JICBwZ0NDKikKLQkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIuCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICA7OwotCSAgY3h4KikKLQkgICAgIyBDb21wYXEgQysrCi0JICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKLQkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgbHlueG9zKikKLQk7OwotICAgICAgbTg4ayopCi0JOzsKLSAgICAgIG12cyopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIGN4eCopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgbmV0YnNkKikKLQk7OwotICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBLQ0MqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIDs7Ci0JICBSQ0MqKQotCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICBjeHgqKQotCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQotCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBwc29zKikKLQk7OwotICAgICAgc29sYXJpcyopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJwotCSAgICA7OwotCSAgZ2N4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHN1bm9zNCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgIyBTdW4gQysrIDQueAotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JICBsY2MqKQotCSAgICAjIEx1Y2lkCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICB0YW5kZW0qKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBOQ0MqKQotCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdnh3b3JrcyopCi0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICBmaQotXSwKLVsKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotCi0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubwotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLSAgICAgIGRhcndpbiopCi0gICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICB4bGMqKQotICAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcW5vY29tbW9uJwotICAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS2NvbmZvcm1fcGljJwotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotXSkKLUFDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi1pZiB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIjsgdGhlbgotICBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MsICQxKSwKLSAgICBbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKWlmZWxzZShbJDFdLFtdLFsgLURQSUNdLFtpZmVsc2UoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLAotICAgIFtjYXNlICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIiA7OwotICAgICBlc2FjXSwKLSAgICBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vXSkKLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICA7OwotICAqKQotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKWlmZWxzZShbJDFdLFtdLFsgLURQSUNdLFtpZmVsc2UoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKLUFDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAotICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCi0gICRsdF90bXBfc3RhdGljX2ZsYWcsCi0gIFtdLAotICBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NTk0NjogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLWlmZWxzZShbJDFdLFtDWFhdLFsKLSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXg0KiB8IGFpeDUqKQotICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLSAgICBpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLSAgICBlbHNlCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGZpCi0gICAgOzsKLSAgcHczMiopCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgotICA7OwotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXSAvcy8uKiBcKFtbXiBdXSpcKS9cMSBEQVRBLzsvXi4qIF9fbm1fXy9zL14uKiBfX25tX19cKFtbXiBdXSpcKSBbW14gXV0qL1wxIERBVEEvOy9eSSAvZDsvXltbQUlUV11dIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICAqKQotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIDs7Ci0gIGVzYWMKLV0sWwotICBydW5wYXRoX3Zhcj0KLSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubwotICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfQUNfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotICBfTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQotICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0gICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi0gIF9MVF9BQ19UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCi0gICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCi0gICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICBmaQotICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubwotICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KLSAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKLSoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgotKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotCi0gICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cwotICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKLSAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKLSAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQotICAgICAgIyB0aGVtLgotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLQotICAgIGJlb3MqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dIC9zLy4qIFwoW1teIF1dKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW1tBSVRXXV0gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLQkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0JIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQllbHNlCi0JICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZml+Ci0JJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQotICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQotICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluawotICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKLQkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKLQllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQllc2FjCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotCWZpCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKSAKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90Ci0qKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLV9MVF9FT0YKLQk7OwotCSopCi0JICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKLQkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIGVsc2UKLQkgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgd2xhcmM9Ci0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLSAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeDQqIHwgYWl4NSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZmkKLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLQkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLQkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKLQkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXg1KikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgotICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0gIAkgICAgYnJlYWsKLSAgCSAgZmkKLQkgIGRvbmUKLQkgIDs7Ci0JZXNhYwotCi0JZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgICBmaQotCi0gICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQotCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKwotCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotCSAgdGhlbgotICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLSAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQkgIGVsc2UKLSAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0gIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLSAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLSAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0gIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLQkgIGZpCi0JICA7OwotCWVzYWMKLQlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKLQlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCWZpCi0gICAgICBlbHNlCi0JIyBub3QgdXNpbmcgZ2NjCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCi0gIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCi0gICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotICAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLQllbHNlCi0JICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0JIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJwotCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJwotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLQotICAgIGJzZGlbWzQ1XV0qKQotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgX0xUX0FDX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSk9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQotICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIDs7Ci0gICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCi0gICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KLSAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KLSAgICAgICAgICAgICAxMC5bWzAxMl1dKQotICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICBlbHNlCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICB4bGMqKQotICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICAgIyBleHRyYSBzcGFjZSkuCi0gICAgZnJlZWJzZDIuMiopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIGhwdXg5KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQkgIDs7Ci0JKikKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotCi0JICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbWzAxXV0uKiB8IG9wZW5ic2QyLltbMC03XV0gfCBvcGVuYnNkMi5bWzAtN11dLiopCi0JICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLSAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7Ci0gICAgICAqKQotIAkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCi0gCSMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAotIAkjIHdpdGhvdXQgJHdsLCBpZmYgd2UgZG8gbm90IGxpbmsgd2l0aCAkTEQuCi0gCSMgTHVja2lseSwgZ2NjIHN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCB3ZSBuZWVkIGZvciBTdW4gU3R1ZGlvLgotIAkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotIAljYXNlICR3bGFyYyBpbgotIAknJykKLSAJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCSopCi0gCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCWVzYWMgOzsKLSAgICAgIGVzYWMKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCi0JIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubwotCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCkKLSAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0Jc25pKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0JOzsKLQlzaWVtZW5zKQotCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCi0JICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX0FDX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgICAgOzsKLQltb3Rvcm9sYSkKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0LjMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Jy1CZXhwb3J0JwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JwotICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLV0pCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCi10ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dKQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCi0JcGljX2ZsYWc9JF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQotICAgICAgICBjb21waWxlcl9mbGFncz0tdgotICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKLSAgICAgICAgdmVyc3RyaW5nPQotICAgICAgICBvdXRwdXRfb2JqZGlyPS4KLSAgICAgICAgbGlibmFtZT1jb25mdGVzdAotICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotICAgICAgICBpZiBBQ19UUllfRVZBTChfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCi0gICAgICAgIHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgICBlbHNlCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpXSkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY4NzY6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0ZJTEVfTFRETExfQ10sIFsKLSMgLyogbHRkbGwuYyBzdGFydHMgaGVyZSAqLwotIyAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSMgI3VuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jCi0jICNpZm5kZWYgX19DWUdXSU5fXwotIyAjICBpZmRlZiBfX0NZR1dJTjMyX18KLSMgIyAgICBkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSMgIyAgZW5kaWYKLSMgI2VuZGlmCi0jCi0jICNpZmRlZiBfX2NwbHVzcGx1cwotIyBleHRlcm4gIkMiIHsKLSMgI2VuZGlmCi0jIEJPT0wgQVBJRU5UUlkgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCk7Ci0jICNpZmRlZiBfX2NwbHVzcGx1cwotIyB9Ci0jICNlbmRpZgotIwotIyAjaWZkZWYgX19DWUdXSU5fXwotIyAjaW5jbHVkZSA8Y3lnd2luL2N5Z3dpbl9kbGwuaD4KLSMgREVDTEFSRV9DWUdXSU5fRExMKCBEbGxNYWluICk7Ci0jICNlbmRpZgotIyBISU5TVEFOQ0UgX19oRGxsSW5zdGFuY2VfYmFzZTsKLSMKLSMgQk9PTCBBUElFTlRSWQotIyBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKQotIyB7Ci0jICAgX19oRGxsSW5zdGFuY2VfYmFzZSA9IGhJbnN0OwotIyAgIHJldHVybiBUUlVFOwotIyB9Ci0jIC8qIGx0ZGxsLmMgZW5kcyBoZXJlICovCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkxNTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSwgW2lmZWxzZShbJDJdLCBbXSwgWyQxXSwgWyQxXyQyXSldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkxOTogLTEtIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbQUNfUFJPR19MSUJUT09MXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MjA6IC0xLSBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2OTIxOiAtMS0gQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkyMjogLTEtIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkyMzogLTEtIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtBQ19ESVNBQkxFX1NUQVRJQygkQCldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkyNDogLTEtIEFDX0RFRlVOKFtBTV9QUk9HX0xEXSwgW0FDX1BST0dfTERdKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkyNTogLTEtIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW0FDX1BST0dfTk1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkzMDogLTEtIEFDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sIFtBQ19DSEVDS19UT09MKEdDSiwgZ2NqLCBubykKLSAgdGVzdCAieCR7R0NKRkxBR1Mrc2V0fSIgPSB4c2V0IHx8IEdDSkZMQUdTPSItZyAtTzIiCi0gIEFDX1NVQlNUKEdDSkZMQUdTKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MzY6IC0xLSBBQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sIFtBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCBubykKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2OTUwOiAtMS0gQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKLVsjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KLSMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotbHRfYWNfbWF4PTAKLWx0X2FjX2NvdW50PTAKLSMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCi0jIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCi0gIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCi0gIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgotICBsdF9hY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgotICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgYnJlYWsKLSAgZmkKLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAotICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgotICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCi0gICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCi0gICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKLSAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCi0gICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgotICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGZpCi0gIGRvbmUKLWRvbmUKLV0pCi1TRUQ9JGx0X2N2X3BhdGhfU0VECi1BQ19NU0dfUkVTVUxUKFskU0VEXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo3MDI1OiAtMS0gQUNfREVGVU4oW0FNX1BBVEhfTElCR0NSWVBUXSwgWyBBQ19BUkdfV0lUSChsaWJnY3J5cHQtcHJlZml4LAotICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1saWJnY3J5cHQtcHJlZml4PVBGWF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4IHdoZXJlIExJQkdDUllQVCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0pLAotICAgICBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iIikKLSAgaWYgdGVzdCB4JGxpYmdjcnlwdF9jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCi0gICAgIGlmIHRlc3QgeCR7TElCR0NSWVBUX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCi0gICAgICAgIExJQkdDUllQVF9DT05GSUc9JGxpYmdjcnlwdF9jb25maWdfcHJlZml4L2Jpbi9saWJnY3J5cHQtY29uZmlnCi0gICAgIGZpCi0gIGZpCi0KLSAgQUNfUEFUSF9QUk9HKExJQkdDUllQVF9DT05GSUcsIGxpYmdjcnlwdC1jb25maWcsIG5vKQotICB0bXA9aWZlbHNlKFskMV0sICwxOjEuMi4wLCQxKQotICBpZiBlY2hvICIkdG1wIiB8IGdyZXAgJzonID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgIHJlcV9saWJnY3J5cHRfYXBpPWBlY2hvICIkdG1wIiAgICAgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMS8nYAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249YGVjaG8gIiR0bXAiIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDIvJ2AKLSAgZWxzZQotICAgICByZXFfbGliZ2NyeXB0X2FwaT0wCi0gICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj0iJHRtcCIKLSAgZmkKLQotICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIExJQkdDUllQVCAtIHZlcnNpb24gPj0gJG1pbl9saWJnY3J5cHRfdmVyc2lvbikKLSAgb2s9bm8KLSAgaWYgdGVzdCAiJExJQkdDUllQVF9DT05GSUciICE9ICJubyIgOyB0aGVuCi0gICAgcmVxX21ham9yPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMS8nYAotICAgIHJlcV9taW5vcj1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDIvJ2AKLSAgICByZXFfbWljcm89YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wzLydgCi0gICAgbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uPWAkTElCR0NSWVBUX0NPTkZJRyAtLXZlcnNpb25gCi0gICAgbWFqb3I9YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpLiovXDEvJ2AKLSAgICBtaW5vcj1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMi8nYAotICAgIG1pY3JvPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS4qL1wzLydgCi0gICAgaWYgdGVzdCAiJG1ham9yIiAtZ3QgIiRyZXFfbWFqb3IiOyB0aGVuCi0gICAgICAgIG9rPXllcwotICAgIGVsc2UgCi0gICAgICAgIGlmIHRlc3QgIiRtYWpvciIgLWVxICIkcmVxX21ham9yIjsgdGhlbgotICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZ3QgIiRyZXFfbWlub3IiOyB0aGVuCi0gICAgICAgICAgICAgICBvaz15ZXMKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGlmIHRlc3QgIiRtaW5vciIgLWVxICIkcmVxX21pbm9yIjsgdGhlbgotICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRtaWNybyIgLWdlICIkcmVxX21pY3JvIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgb2s9eWVzCi0gICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgQUNfTVNHX1JFU1VMVChbeWVzICgkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uKV0pCi0gIGVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotICBmaQotICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgotICAgICAjIElmIHdlIGhhdmUgYSByZWNlbnQgbGliZ2NyeXB0LCB3ZSBzaG91bGQgYWxzbyBjaGVjayB0aGF0IHRoZQotICAgICAjIEFQSSBpcyBjb21wYXRpYmxlCi0gICAgIGlmIHRlc3QgIiRyZXFfbGliZ2NyeXB0X2FwaSIgLWd0IDAgOyB0aGVuCi0gICAgICAgIHRtcD1gJExJQkdDUllQVF9DT05GSUcgLS1hcGktdmVyc2lvbiAyPi9kZXYvbnVsbCB8fCBlY2hvIDBgCi0gICAgICAgIGlmIHRlc3QgIiR0bXAiIC1ndCAwIDsgdGhlbgotICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW0xJQkdDUllQVCBBUEkgdmVyc2lvbl0pCi0gICAgICAgICAgIGlmIHRlc3QgIiRyZXFfbGliZ2NyeXB0X2FwaSIgLWVxICIkdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtva2F5XSkKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIG9rPW5vCi0gICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbZG9lcyBub3QgbWF0Y2guIHdhbnQ9JHJlcV9saWJnY3J5cHRfYXBpIGdvdD0kdG1wXSkKLSAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICBMSUJHQ1JZUFRfQ0ZMQUdTPWAkTElCR0NSWVBUX0NPTkZJRyAtLWNmbGFnc2AKLSAgICBMSUJHQ1JZUFRfTElCUz1gJExJQkdDUllQVF9DT05GSUcgLS1saWJzYAotICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCi0gIGVsc2UKLSAgICBMSUJHQ1JZUFRfQ0ZMQUdTPSIiCi0gICAgTElCR0NSWVBUX0xJQlM9IiIKLSAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQotICBmaQotICBBQ19TVUJTVChMSUJHQ1JZUFRfQ0ZMQUdTKQotICBBQ19TVUJTVChMSUJHQ1JZUFRfTElCUykKLV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FbQ0hVTV1fXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbX0FDX10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15MSUJPQkpTJF0sIFtkbyBub3QgdXNlIExJQk9CSlMgZGlyZWN0bHksIHVzZSBBQ19MSUJPQkogKHNlZSBzZWN0aW9uIGBBQ19MSUJPQkogdnMgTElCT0JKUyddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BU19GTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteXz9tNF9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteZG5sJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FTX10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNIRUxMJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBVEhfU0VQQVJBVE9SJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfTkFNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1RBUk5BTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9WRVJTSU9OJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfU1RSSU5HJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfQlVHUkVQT1JUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVVJMJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmV4ZWNfcHJlZml4JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnByZWZpeCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wcm9ncmFtX3RyYW5zZm9ybV9uYW1lJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJpbmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zYmluZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmxpYmV4ZWNkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZGF0YXJvb3RkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZGF0YWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zeXNjb25mZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnNoYXJlZHN0YXRlZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmxvY2Fsc3RhdGVkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaW5jbHVkZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15vbGRpbmNsdWRlZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmRvY2RpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15pbmZvZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmh0bWxkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZHZpZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnBkZmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wc2RpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15saWJkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebG9jYWxlZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXm1hbmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX05BTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9UQVJOQU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVkVSU0lPTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1NUUklORyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX0JVR1JFUE9SVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1VSTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ERUZTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVDSE9fQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FQ0hPX04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUNIT19UJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfYWxpYXMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF9hbGlhcyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW150YXJnZXRfYWxpYXMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9JTklUX0FVVE9NQUtFKFtMaWJWTkNTZXJ2ZXJdLCBbMC45LjldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExLjZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFsyLjY5XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSU5TVEFMTF9QUk9HUkFNJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfU0NSSVBUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfREFUQSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9faXNyYyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNZR1BBVEhfVyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlZFUlNJT04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCBbXSwgW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLSBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMi0gX0FNX01BTkdMRV9PUFRJT04oW25vLWRlZmluZV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteVkVSU0lPTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX1NBTklUWV9DSEVDSwotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX01JU1NJTkdfUFJPRyhbQUNMT0NBTF0sIFthY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fTUlTU0lOR19IQVNfUlVOCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fQVVYX0RJUl9FWFBBTkQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQUNMT0NBTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX01JU1NJTkdfUFJPRyhbQVVUT0NPTkZdLCBbYXV0b2NvbmZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPQ09ORiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX01JU1NJTkdfUFJPRyhbQVVUT01BS0VdLCBbYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVVUT01BS0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9NSVNTSU5HX1BST0coW0FVVE9IRUFERVJdLCBbYXV0b2hlYWRlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFVVE9IRUFERVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9NSVNTSU5HX1BST0coW01BS0VJTkZPXSwgW21ha2VpbmZvXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTUFLRUlORk8kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9QUk9HX0lOU1RBTExfU0gKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaW5zdGFsbF9zaCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX1BST0dfSU5TVEFMTF9TVFJJUAotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVFJJUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15JTlNUQUxMX1NUUklQX1BST0dSQU0kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9QUk9HX01LRElSX1AKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTUtESVJfUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ta2Rpcl9wJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFXSyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRVRfTUFLRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX1NFVF9MRUFESU5HX0RPVAotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fbGVhZGluZ19kb3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCi0JCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMi0gX0FNX01BTkdMRV9PUFRJT04oW3Rhci11c3Rhcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwgW19BTV9QUk9HX1RBUihbdjddKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMi0gX0FNX01BTkdMRV9PUFRJT04oW3Rhci1wYXhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIF9BTV9QUk9HX1RBUihbdjddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTVRBUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fdGFyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX191bnRhciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIF9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sIFtdLCBbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19DQ10sCi0JCQkgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotCQkJICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX09CSkNdLAotCQkJICBkZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSldKWRubAotXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0yLSBfQU1fTUFOR0xFX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fSUZfT1BUSU9OKFtzaWxlbnQtcnVsZXNdLCBbQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTItIF9BTV9NQU5HTEVfT1BUSU9OKFtzaWxlbnQtcnVsZXNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFNX1NJTEVOVF9SVUxFUyhbeWVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fViRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFNX1NVQlNUX05PVE1BS0UoW0FNX1ZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTV9WXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fREVGQVVMVF9WJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gQU1fU1VCU1RfTk9UTUFLRShbQU1fREVGQVVMVF9WXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1fREVGQVVMVF9WXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fREVGQVVMVF9WRVJCT1NJVFkkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fQkFDS1NMQVNIJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FNX0JBQ0tTTEFTSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OiAtMS0gQU1fQ09ORklHX0hFQURFUihbcmZiY29uZmlnLmhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFNX0NPTkZJR19IRUFERVInIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbL3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaGVhZGVyLm00OjEyOiBBTV9DT05GSUdfSEVBREVSIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo1OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjY6IC0xLSBBWF9QUkVGSVhfQ09ORklHX0goW3JmYi9yZmJjb25maWcuaF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MREZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWNfY3RfQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRVhFRVhUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9CSkVYVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9ERVBFTkRFTkNJRVMoW0NDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9TRVRfREVQRElSCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRFUERJUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQU1fTUFLRV9JTkNMVURFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19pbmNsdWRlJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19xdW90ZSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFNX0RFUF9UUkFDSwotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNREVQX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNREVQQkFDS1NMQVNIJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX25vZGVwJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDREVQTU9ERSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcENDXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19mYXN0ZGVwQ0NfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENDX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19mYXN0ZGVwQ0NfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19mYXN0ZGVwQ0NfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBTV9QUk9HX0NDX0NfTwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTk9fTUlOVVNfQ19NSU5VU19PJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRVRfTUFLRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTg6IC0xLSBBQ19MSUJUT09MX1dJTjMyX0RMTAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QUk9HX0xJQlRPT0wKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0FDX1BST0dfTElCVE9PTAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NFVFVQCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0VOQUJMRV9TSEFSRUQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNTEzOiBBQ19FTkFCTEVfU0hBUkVEIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfRU5BQkxFX1NUQVRJQwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0NjI6IEFDX0FSR19FTkFCTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjI1NTI6IEFDX0VOQUJMRV9TVEFUSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ2MjogQUNfQVJHX0VOQUJMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjU5MTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfY3B1JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZF92ZW5kb3IkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkX29zJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ob3N0JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ob3N0X2NwdSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF92ZW5kb3IkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3Rfb3MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MRAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0ODE6IEFDX0FSR19XSVRIIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNzMyOiBBQ19QUk9HX0xEIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gTFRfQUNfUFJPR19TRUQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MRF9HTlUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19FR1JFUAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteR1JFUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUdSRVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MRF9SRUxPQURfRkxBRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QUk9HX05NCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MTl9TJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0RFUExJQlNfQ0hFQ0tfTUVUSE9ECi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX09CSkRJUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0NPTVBJTEVSCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TSEVMTF9JTklUKFsKLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLWNhc2UgWCRFQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAotICA7OwotZXNhYwotCi1lY2hvPSR7RUNITy1lY2hvfQotaWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotZmkKLQotaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLVskXSoKLUVPRgotICBleGl0IDAKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLWlmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0jIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgZWNobz0ncHJpbnQgLXInCi0gICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKLQkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAlc1xuJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgNTBxICJbJF0wIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAotCSAgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICJbJF0wIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIlskXTAiICR7MSsiWyRdQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQotIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCi1FQ0hPPSRlY2hvCi1pZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXFskXTAgLS1mYWxsYmFjay1lY2hvIgotZmkKLQotQUNfU1VCU1QoRUNITykKLV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FQ0hPJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUkFOTElCJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVFJJUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BBVEhfTUFHSUMKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUEFUSF9UT09MX1BSRUZJWChbJHthY190b29sX3ByZWZpeH1maWxlXSwgWy91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QQVRIX1RPT0xfUFJFRklYKFtmaWxlXSwgWy91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0NjI6IEFDX0FSR19FTkFCTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0ODE6IEFDX0FSR19XSVRIIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19MQU5HX0NfQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29iamV4dF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0NPTVBJTEVSCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnNdLCBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICkgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NdLCBbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIClpZmVsc2UoW10sW10sWyAtRFBJQ10sW2lmZWxzZShbXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLCBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgKSBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICk9IiAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgKSIgOzsKLSAgICAgZXNhY10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCApPQotICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgKT1ub10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjE5OiBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NTogX0xUX0FDX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTQ6IEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NdLCBbJGx0X3RtcF9zdGF0aWNfZmxhZ10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgKT1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTI2NDogQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfTE9DSwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfTElOSycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjg3OiBBQ19UUllfTElOSyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMDczOiBfTFRfQUNfTE9DSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTY3NzogQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRMTFRPT0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PQkpEVU1QJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTk0NjogQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NTogX0xUX0FDX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTQ6IEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0xBTkdfQ09ORlRFU1Q6IG5vIEFDX0xBTkdfU09VUkNFIGNhbGwgZGV0ZWN0ZWQgaW4gYm9keV0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxOTM6IEFDX0xBTkdfQ09ORlRFU1QgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY2MTogX0FDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2Nzg6IEFDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo4OTM6IF9MVF9BQ19TWVNfTElCUEFUSF9BSVggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU5NDY6IEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTU6IF9MVF9BQ19MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU0OiBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcmVsb2FkX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcnVucGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0RMT1BFTl9TRUxGCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19DSEVDS19ETEZDTgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFBGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVERDX0hFQURFUlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfRExGQ05fSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGKFtsdF9jdl9kbG9wZW5fc2VsZj15ZXNdLCBbbHRfY3ZfZGxvcGVuX3NlbGY9eWVzXSwgW2x0X2N2X2Rsb3Blbl9zZWxmPW5vXSwgW2x0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RSWV9ETE9QRU5fU0VMRihbbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllc10sIFtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzXSwgW2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ub10sIFtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTkZJRyhbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbQ0NdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0aW5zdGFsbF9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3R1bmluc3RhbGxfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtHQ0NdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2ZpeF9zcmNmaWxlX3BhdGhdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ4MTogQUNfQVJHX1dJVEggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbYmFjayBxdW90ZXMgYW5kIGRvdWJsZSBxdW90ZXMgbXVzdCBub3QgYmUgZXNjYXBlZCBpbjogdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzXSwgW2FjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyhbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxERkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFjX2N0X0NYWCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfQU1fREVQRU5ERU5DSUVTKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYREVQTU9ERSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXBDWFhdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENYWF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENYWF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2Zhc3RkZXBDWFhfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENYWF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19QUk9HX0NYWENQUAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYQ1BQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFBGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYQ1BQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29iamV4dF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0NPTVBJTEVSCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MRAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QUk9HX0xEX0dOVQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNjogX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNTogQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM2OiBfTFRfQUNfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM1OiBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtHQ0NdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUChbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyhbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgQ1hYKSB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFhdLCBbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIENYWClpZmVsc2UoW0NYWF0sW10sWyAtRFBJQ10sW2lmZWxzZShbQ1hYXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLCBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgQ1hYKSBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIENYWCk9IiAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgQ1hYKSIgOzsKLSAgICAgZXNhY10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBDWFgpPQotICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgQ1hYKT1ub10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCwgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzY6IF9MVF9BQ19MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzU6IEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFhdLCBbJGx0X3RtcF9zdGF0aWNfZmxhZ10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgQ1hYKT1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyNjQ6IEFDX0xJQlRPT0xfTElOS0VSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNjogX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNTogQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ0NfQ19PKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUihbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3J1bnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTkZJRyhbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbQ0NdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0aW5zdGFsbF9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3R1bmluc3RhbGxfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtHQ0NdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2ZpeF9zcmNmaWxlX3BhdGhdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfTEFOR19GNzdfQ09ORklHKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRjc3JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15GRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxERkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkY3NyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWNfY3RfRjc3JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29iamV4dF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0NPTVBJTEVSCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgRjc3KSB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzddLCBbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEY3NylpZmVsc2UoW0Y3N10sW10sWyAtRFBJQ10sW2lmZWxzZShbRjc3XSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLCBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgRjc3KSBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEY3Nyk9IiAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgRjc3KSIgOzsKLSAgICAgZXNhY10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBGNzcpPQotICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgRjc3KT1ub10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NywgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDM6IF9MVF9BQ19MQU5HX0Y3N19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDI6IEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzddLCBbJGx0X3RtcF9zdGF0aWNfZmxhZ10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgRjc3KT1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzcsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyNjQ6IEFDX0xJQlRPT0xfTElOS0VSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDUwMzogX0xUX0FDX0xBTkdfRjc3X0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDUwMjogQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ0NfQ19PKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcmVsb2FkX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcnVucGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09ORklHKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtDQ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtMRF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RpbnN0YWxsX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdHVuaW5zdGFsbF9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaW5jbHVkZV9leHBzeW1zXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0dDQ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtMRF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZml4X3NyY2ZpbGVfcGF0aF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaW5jbHVkZV9leHBzeW1zXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19MQU5HX0dDSl9DT05GSUcoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMjU6IEFDX0xBTkdfU0FWRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvYmpleHRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0xJTktFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9uc10sIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCBHQ0opPSIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgR0NKKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgR0NKKSB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0pdLCBbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEdDSilpZmVsc2UoW0dDSl0sW10sWyAtRFBJQ10sW2lmZWxzZShbR0NKXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLCBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgR0NKKSBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEdDSik9IiAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgR0NKKSIgOzsKLSAgICAgZXNhY10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBHQ0opPQotICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgR0NKKT1ub10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiwgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0pdLCBbJGx0X3RtcF9zdGF0aWNfZmxhZ10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgR0NKKT1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0osIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyNjQ6IEFDX0xJQlRPT0xfTElOS0VSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ0NfQ19PKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC00LSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTk0NjogQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1OTQ2OiBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA1OiBfTFRfQUNfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA0OiBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2ZpeF9zcmNmaWxlX3BhdGhdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtyZWxvYWRfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0yLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtydW5wYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT05GSUcoW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0NDXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGluc3RhbGxfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19SRVNUT1JFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNDogQUNfTEFOR19SRVNUT1JFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA1OiBfTFRfQUNfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA0OiBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xBTkdfUkNfQ09ORklHKFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMjU6IEFDX0xBTkdfU0FWRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDY2NTogX0xUX0FDX0xBTkdfUkNfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjY0OiBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2JqZXh0XSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0xJTktFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTkZJRyhbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0NDXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0aW5zdGFsbF9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdHVuaW5zdGFsbF9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfUkVTVE9SRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMzQ6IEFDX0xBTkdfUkVTVE9SRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDY2NTogX0xUX0FDX0xBTkdfUkNfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjY0OiBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlRPT0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DWFgKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xBTkdfQ1hYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1DWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0Y3NwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfTEFOR19GNzcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQUxMT1cyNEJQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFted2l0aF9mZm1wZWckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ5OiAtMS0gQU1fQ09ORElUSU9OQUwoW1dJVEhfRkZNUEVHXSwgW3Rlc3QgISAteiAiJHdpdGhfZmZtcGVnIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX0ZGTVBFR19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX0ZGTVBFR19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9GRk1QRUdfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX0ZGTVBFR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MzogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX01QM0xBTUVdLCBbdGVzdCAiJEhBVkVfTVAzTEFNRSIgPSAidHJ1ZSJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9NUDNMQU1FX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTVAzTEFNRV9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9NUDNMQU1FX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9NUDNMQU1FX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfQ1JZUFQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCQ1JZUFQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNSWVBUX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkNSWVBUTyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTIyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU1NMJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMjc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJTU0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TU0xfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCU1NMXSwgW3Rlc3QgISAteiAiJFNTTF9MSUJTIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJTU0xfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU1NMX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTU0xfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTU0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhNS01GJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9ESVNQTEFZX01JU1NJTkckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhfUFJFX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0VYVFJBX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIxNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1gxMSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjIyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWFNITSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjI2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU09MQVJJU19YUkVBRFNDUkVFTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjMwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfSVJJWF9YUkVBRERJU1BMQVkkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIzNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0ZCUE0kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0RQTVMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI0NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1hURVNUR1JBQkNPTlRST0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI1MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1hURVNUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9SRUNPUkQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI2NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlhUUkFQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYVFJBUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mjg1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWEtFWUJPQVJEJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOTI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYSU5FUkFNQSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mjk5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWFJBTkRSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMDY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYRklYRVMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlhEQU1BR0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX1gxMV0sIFt0ZXN0ICRIQVZFX1gxMSAhPSAiZmFsc2UiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1gxMV9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YMTFfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1gxMV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1gxMV9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozNzg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSU5VWF9WSURFT0RFVl9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSU5VWF9GQl9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSU5VWF9JTlBVVF9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSU5VWF9VSU5QVVRfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9NQUNPU1hfT1BFTkdMX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQyNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0FWQUhJJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVZBSElfQ0ZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVZBSElfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gQU1fQ09ORElUSU9OQUwoW09TWF9PUEVOR0xdLCBbdGVzdCAiJEhBVkVfTUFDT1NYX09QRU5HTF9IIiA9ICJ0cnVlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteT1NYX09QRU5HTF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteT1NYX09QRU5HTF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW09TWF9PUEVOR0xfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbT1NYX09QRU5HTF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJdLCBbdGVzdCAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiID0gInh5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkpQRUdfTERGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCSlBFRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NjAzOiAtMS0gX200X3dhcm4oW2Nyb3NzXSwgW0FDX1JVTl9JRkVMU0UgY2FsbGVkIHdpdGhvdXQgZGVmYXVsdCB0byBhbGxvdyBjcm9zcyBjb21waWxpbmddLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc0ODogQUNfUlVOX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6NjAzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjY1MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBORyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzAxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzMxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCUFRIUkVBRCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM1OiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCUFRIUkVBRF0sIFt0ZXN0ICEgLXogIiRIQVZFX0xJQlBUSFJFQUQiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQURfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCUFRIUkVBRF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM1OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCUFRIUkVBRF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBUSFJFQURfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfVExTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIEFNX0NPTkRJVElPTkFMKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl0sIFt0ZXN0ICIkd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIiID0gInllcyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1dFQlNPQ0tFVFMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIEFNX0NPTkRJVElPTkFMKFtXSVRIX1dFQlNPQ0tFVFNdLCBbdGVzdCAiJHdpdGhfd2Vic29ja2V0cyIgPSAieWVzIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9XRUJTT0NLRVRTX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1dFQlNPQ0tFVFNfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1dFQlNPQ0tFVFNfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9XRUJTT0NLRVRTX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlpdLCBbdGVzdCAhIC16ICIkSEFWRV9aTElCX0giXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlpfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWl9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCWl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlpfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCSlBFR10sIFt0ZXN0ICEgLXogIiRIQVZFX0pQRUdMSUJfSCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCSlBFR19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJKUEVHX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJKUEVHX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCSlBFR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJQTkddLCBbdGVzdCAhIC16ICIkSEFWRV9QTkdMSUJfSCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCUE5HX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBOR19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY1OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCUE5HX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY1OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCUE5HX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4ODogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlNETF0sIFt0ZXN0ICJ4JHdpdGhfc2RsIiA9ICJ4eWVzIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJTRExfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU0RMX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTRExfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTRExfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNETF9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRExfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCR1RLXSwgW3Rlc3QgISAteiAiJEdUS19MSUJTIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJHVEtfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCR1RLX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gQU1fQ09ORElUSU9OQUwoW01JTkdXXSwgW3Rlc3QgISAteiAiJE1JTkdXIiBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk1JTkdXX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NSU5HV19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgwNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XU09DS0xJQiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMS0gQU1fUEFUSF9MSUJHQ1JZUFQoWzEuNC4wXSwgW10sIFt3aXRoX2NsaWVudF9nY3J5cHQ9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMi0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NzAyNTogQU1fUEFUSF9MSUJHQ1JZUFQgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjgxNDogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCR0NSWVBUX0NPTkZJRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkdDUllQVF9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJHQ1JZUFRfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfQ0xJRU5UX0dDUllQVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfR05VVExTXSwgW3Rlc3QgISAteiAiJEdOVVRMU19MSUJTIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9HTlVUTFNfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfR05VVExTX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9HTlVUTFNfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9HTlVUTFNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODM1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfR05VVExTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NTg6IC0yLSBtNF9wYXR0ZXJuX2FsbG93KFteSVB2NiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMy0gbTRfcGF0dGVybl9hbGxvdyhbXklQdjYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg1OTogLTItIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2ODc6IEFDX1RSWV9MSU5LIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvbGlicy5tNDo5OTogQUNfQ0hFQ0tfTElCIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4NTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMi0gbTRfcGF0dGVybl9hbGxvdyhbXklQdjYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVERDX0hFQURFUlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15jb25zdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldPUkRTX0JJR0VORElBTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnNpemVfdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlRJTUVfV0lUSF9TWVNfVElNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1lTX1dBSVRfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg4OiAtMS0gQUNfVFlQRV9TT0NLTEVOX1QKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4ODogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjI6IEFDX1RZUEVfU09DS0xFTl9UIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4ODg6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnNvY2tsZW5fdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ1JFQVRFX1NURElOVF9IKFtyZmIvcmZiaW50LmhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoW2NoYXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjA6IEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0OTogQUNfQ1JFQVRFX1NURElOVF9IIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTM6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9DSEFSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihbc2hvcnRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjA6IEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0OTogQUNfQ1JFQVRFX1NURElOVF9IIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTM6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9TSE9SVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoW2ludF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMDogQUNfQ09NUElMRV9DSEVDS19TSVpFT0YgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ5OiBBQ19DUkVBVEVfU1RESU5UX0ggaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg5MzogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0lOVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoW2xvbmddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjA6IEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0OTogQUNfQ1JFQVRFX1NURElOVF9IIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTM6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9MT05HJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRihbdm9pZCpdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjA6IEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0OTogQUNfQ1JFQVRFX1NURElOVF9IIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTM6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9WT0lEUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODk0OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODk0OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ORUVEX0lOQUREUl9UJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCQCZ0QE9CSlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOSyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCQCZ0QE9CSlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUQVRfRU1QVFlfU1RSSU5HX0JVRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1RSRlRJTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUUkZUSU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9WUFJJTlRGJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9ET1BSTlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15waWRfdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfVkZPUktfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfV09SS0lOR19WRk9SSyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnZmb3JrJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9XT1JLSU5HX0ZPUkskXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQk5TTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU09DS0VUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJDWUdJUEMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIEFNX0NPTkRJVElPTkFMKFtDWUdJUENdLCBbdGVzdCAiJEhBVkVfQ1lHSVBDIiA9ICJ0cnVlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1lHSVBDX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWUdJUENfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtDWUdJUENfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQ1lHSVBDX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIEFNX0NPTkRJVElPTkFMKFtMSU5VWF0sIFt0ZXN0IC1kIC91c3IvaW5jbHVkZS9saW51eF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElOVVhfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJTlVYX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzI6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbTElOVVhfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzI6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbTElOVVhfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTM2OiAtMS0gQU1fQ09ORElUSU9OQUwoW09TWF0sIFt0ZXN0ICIkSEFWRV9PU1giID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PU1hfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTM2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9TWF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTM2OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW09TWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtPU1hfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gQU1fQ09ORElUSU9OQUwoW0FORFJPSURdLCBbdGVzdCAiJEhBVkVfQU5EUk9JRCIgPSAidHJ1ZSJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFORFJPSURfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFORFJPSURfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTkRST0lEX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FORFJPSURfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfQU5EUk9JRCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQ5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVOT0VOVF9XT1JLQVJPVU5EJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9SUE1dLCBbdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUlBNX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1JQTV9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfUlBNX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfUlBNX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MzogLTEtIEFNX0NPTkRJVElPTkFMKFtXSVRIX1gxMVZOQ10sIFt0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1gxMVZOQ19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9YMTFWTkNfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1gxMVZOQ19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1gxMVZOQ19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUlBNU09VUkNFRElSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxUTElCT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFNX0NPTkRJVElPTkFMKFthbV9fRVhFRVhUXSwgW3Rlc3QgLW4gIiRFWEVFWFQiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX0VYRUVYVF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19FWEVFWFRfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX0VYRUVYVF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX0VYRUVYVF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyhbIiRhY19maWxlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCmRpZmYgLS1naXQgYS9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMSBiL2F1dG9tNHRlLmNhY2hlL3RyYWNlcy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY2MWM4Li4wMDAwMDAwCi0tLSBhL2F1dG9tNHRlLmNhY2hlL3RyYWNlcy4xCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MiArMCwwIEBACi1tNHRyYWNlOmFjbG9jYWwubTQ6MTIzNjogLTEtIG00X2luY2x1ZGUoW2FjaW5jbHVkZS5tNF0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxOiAtMS0gQUhfT1VUUFVUKFtzb2NrbGVuX3RdLCBbLyogVGhlIHR5cGUgZm9yIHNvY2tsZW4gKi8KLUAlOkB1bmRlZiBzb2NrbGVuX3RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX0lOSVQoW0xpYlZOQ1NlcnZlcl0sIFswLjkuOV0sIFtodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FbQ0hVTV1fXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbX0FDX10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15MSUJPQkpTJF0sIFtkbyBub3QgdXNlIExJQk9CSlMgZGlyZWN0bHksIHVzZSBBQ19MSUJPQkogKHNlZSBzZWN0aW9uIGBBQ19MSUJPQkogdnMgTElCT0JKUyddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BU19GTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteXz9tNF9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteZG5sJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FTX10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW1NIRUxMXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbU0hFTExdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSEVMTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtQQVRIX1NFUEFSQVRPUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBVEhfU0VQQVJBVE9SXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFUSF9TRVBBUkFUT1IkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9OQU1FXSwgW200X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAgICAgIFsnQUNfUEFDS0FHRV9OQU1FJ10pXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbUEFDS0FHRV9OQU1FXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9OQU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW1BBQ0tBR0VfVEFSTkFNRV0sIFttNF9pZmRlZihbQUNfUEFDS0FHRV9UQVJOQU1FXSwgICBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfVEFSTkFNRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVEFSTkFNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtQQUNLQUdFX1ZFUlNJT05dLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sICAgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtQQUNLQUdFX1ZFUlNJT05dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1ZFUlNJT04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9TVFJJTkddLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfU1RSSU5HXSwgICAgWydBQ19QQUNLQUdFX1NUUklORyddKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfU1RSSU5HXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9TVFJJTkckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9CVUdSRVBPUlRdLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgWydBQ19QQUNLQUdFX0JVR1JFUE9SVCddKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfQlVHUkVQT1JUXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9CVUdSRVBPUlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9VUkxdLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVVJMXSwgICAgICAgWydBQ19QQUNLQUdFX1VSTCddKV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfVVJMXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9VUkwkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbZXhlY19wcmVmaXhdLCBbTk9ORV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2V4ZWNfcHJlZml4XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZXhlY19wcmVmaXgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbcHJlZml4XSwgW05PTkVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtwcmVmaXhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wcmVmaXgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZV0sIFtzLHgseCxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtiaW5kaXJdLCBbJyR7ZXhlY19wcmVmaXh9L2JpbiddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtiaW5kaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15iaW5kaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbc2JpbmRpcl0sIFsnJHtleGVjX3ByZWZpeH0vc2JpbiddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtzYmluZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2JpbmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtsaWJleGVjZGlyXSwgWycke2V4ZWNfcHJlZml4fS9saWJleGVjJ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2xpYmV4ZWNkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15saWJleGVjZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW2RhdGFyb290ZGlyXSwgWycke3ByZWZpeH0vc2hhcmUnXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbZGF0YXJvb3RkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15kYXRhcm9vdGRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtkYXRhZGlyXSwgWycke2RhdGFyb290ZGlyfSddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtkYXRhZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZGF0YWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtzeXNjb25mZGlyXSwgWycke3ByZWZpeH0vZXRjJ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3N5c2NvbmZkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zeXNjb25mZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW3NoYXJlZHN0YXRlZGlyXSwgWycke3ByZWZpeH0vY29tJ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3NoYXJlZHN0YXRlZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2hhcmVkc3RhdGVkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbbG9jYWxzdGF0ZWRpcl0sIFsnJHtwcmVmaXh9L3ZhciddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtsb2NhbHN0YXRlZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebG9jYWxzdGF0ZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtpbmNsdWRlZGlyXSwgWycke3ByZWZpeH0vaW5jbHVkZSddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtpbmNsdWRlZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaW5jbHVkZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtvbGRpbmNsdWRlZGlyXSwgWycvdXNyL2luY2x1ZGUnXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbb2xkaW5jbHVkZWRpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXm9sZGluY2x1ZGVkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbZG9jZGlyXSwgW200X2lmc2V0KFtBQ19QQUNLQUdFX1RBUk5BTUVdLAotCQkJCSAgICAgWycke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9J10sCi0JCQkJICAgICBbJyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9J10pXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbZG9jZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZG9jZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW2luZm9kaXJdLCBbJyR7ZGF0YXJvb3RkaXJ9L2luZm8nXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbaW5mb2Rpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluZm9kaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbaHRtbGRpcl0sIFsnJHtkb2NkaXJ9J10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2h0bWxkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15odG1sZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW2R2aWRpcl0sIFsnJHtkb2NkaXJ9J10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2R2aWRpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmR2aWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtwZGZkaXJdLCBbJyR7ZG9jZGlyfSddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtwZGZkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wZGZkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbcHNkaXJdLCBbJyR7ZG9jZGlyfSddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtwc2Rpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnBzZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW2xpYmRpcl0sIFsnJHtleGVjX3ByZWZpeH0vbGliJ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2xpYmRpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmxpYmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtsb2NhbGVkaXJdLCBbJyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZSddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtsb2NhbGVkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15sb2NhbGVkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbbWFuZGlyXSwgWycke2RhdGFyb290ZGlyfS9tYW4nXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbbWFuZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebWFuZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1BBQ0tBR0VfTkFNRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfTkFNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFIX09VVFBVVChbUEFDS0FHRV9OQU1FXSwgWy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLUAlOkB1bmRlZiBQQUNLQUdFX05BTUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX1RBUk5BTUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1RBUk5BTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VfVEFSTkFNRV0sIFsvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi1AJTpAdW5kZWYgUEFDS0FHRV9UQVJOQU1FXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbUEFDS0FHRV9WRVJTSU9OXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9WRVJTSU9OJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX1ZFUlNJT05dLCBbLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLUAlOkB1bmRlZiBQQUNLQUdFX1ZFUlNJT05dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX1NUUklOR10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfU1RSSU5HJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX1NUUklOR10sIFsvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi1AJTpAdW5kZWYgUEFDS0FHRV9TVFJJTkddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX0JVR1JFUE9SVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfQlVHUkVQT1JUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX0JVR1JFUE9SVF0sIFsvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLUAlOkB1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1BBQ0tBR0VfVVJMXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9VUkwkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VfVVJMXSwgWy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCi1AJTpAdW5kZWYgUEFDS0FHRV9VUkxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtERUZTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbREVGU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRFRlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbRUNIT19DXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbRUNIT19DXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUNIT19DJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW0VDSE9fTl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VDSE9fTl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVDSE9fTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtFQ0hPX1RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtFQ0hPX1RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FQ0hPX1QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gQUNfU1VCU1QoW2J1aWxkX2FsaWFzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRfYWxpYXNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZF9hbGlhcyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIEFDX1NVQlNUKFtob3N0X2FsaWFzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF9hbGlhc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfYWxpYXMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVChbdGFyZ2V0X2FsaWFzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbdGFyZ2V0X2FsaWFzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtedGFyZ2V0X2FsaWFzJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fSU5JVF9BVVRPTUFLRShbTGliVk5DU2VydmVyXSwgWzAuOS45XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExLjZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1JFUVVJUkVfQVVYX0ZJTEUoW2luc3RhbGwtc2hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtJTlNUQUxMX1BST0dSQU1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtJTlNUQUxMX1BST0dSQU1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15JTlNUQUxMX1BST0dSQU0kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbSU5TVEFMTF9TQ1JJUFRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtJTlNUQUxMX1NDUklQVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfU0NSSVBUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW0lOU1RBTExfREFUQV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0lOU1RBTExfREFUQV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfREFUQSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX19pc3JjXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2lzcmMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtDWUdQQVRIX1ddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWUdQQVRIX1ddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWUdQQVRIX1ckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV0sIFtMaWJWTkNTZXJ2ZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtQQUNLQUdFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtWRVJTSU9OXSwgWzAuOS45XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbVkVSU0lPTl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlZFUlNJT04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbUEFDS0FHRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VdLCBbLyogTmFtZSBvZiBwYWNrYWdlICovCi1AJTpAdW5kZWYgUEFDS0FHRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1ZFUlNJT05dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15WRVJTSU9OJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUhfT1VUUFVUKFtWRVJTSU9OXSwgWy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLUAlOkB1bmRlZiBWRVJTSU9OXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbQUNMT0NBTF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FDTE9DQUxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BQ0xPQ0FMJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW0FVVE9DT05GXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVVUT0NPTkZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPQ09ORiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtBVVRPTUFLRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FVVE9NQUtFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVVUT01BS0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbQVVUT0hFQURFUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FVVE9IRUFERVJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPSEVBREVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW01BS0VJTkZPXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbTUFLRUlORk9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NQUtFSU5GTyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtpbnN0YWxsX3NoXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbaW5zdGFsbF9zaF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluc3RhbGxfc2gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbU1RSSVBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtTVFJJUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNUUklQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfU1RSSVBfUFJPR1JBTSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1JFUVVJUkVfQVVYX0ZJTEUoW2luc3RhbGwtc2hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFtNS0RJUl9QXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbTUtESVJfUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk1LRElSX1AkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbbWtkaXJfcF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXm1rZGlyX3AkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbQVdLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVdLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVdLJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW1NFVF9NQUtFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbU0VUX01BS0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRVRfTUFLRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fbGVhZGluZ19kb3RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fbGVhZGluZ19kb3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbQU1UQVJdLCBbJyQke1RBUi10YXJ9J10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNVEFSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1UQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBQ19TVUJTVChbYW1fX3Rhcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX190YXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fdGFyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1QoW2FtX191bnRhcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX191bnRhcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX191bnRhciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFNX1NJTEVOVF9SVUxFUyhbeWVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBBQ19TVUJTVChbQU1fVl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNX1ZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTV9WJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FNX1ZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFDX1NVQlNUKFtBTV9ERUZBVUxUX1ZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtBTV9ERUZBVUxUX1ZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTV9ERUZBVUxUX1YkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1fREVGQVVMVF9WXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBBQ19TVUJTVChbQU1fREVGQVVMVF9WRVJCT1NJVFldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtBTV9ERUZBVUxUX1ZFUkJPU0lUWV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX0RFRkFVTFRfVkVSQk9TSVRZJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gQUNfU1VCU1QoW0FNX0JBQ0tTTEFTSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNX0JBQ0tTTEFTSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX0JBQ0tTTEFTSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTV9CQUNLU0xBU0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFNX0NPTkZJR19IRUFERVInIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbYWNsb2NhbC5tNDo1ODk6IEFNX0NPTkZJR19IRUFERVIgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjU6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTogLTEtIEFDX0NPTkZJR19IRUFERVJTKFtyZmJjb25maWcuaF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo2OiAtMS0gQUNfQ09ORklHX0hFQURFUlMoW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW0NDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ0NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtDRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbTERGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xERkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MREZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtDUFBGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUEZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbQ0NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW0NDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ0NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtDQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbQ0NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW2FjX2N0X0NDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbYWNfY3RfQ0NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hY19jdF9DQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtFWEVFWFRdLCBbJGFjX2N2X2V4ZWV4dF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VYRUVYVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVYRUVYVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtPQkpFWFRdLCBbJGFjX2N2X29iamV4dF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW09CSkVYVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9CSkVYVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbREVQRElSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteREVQRElSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX2luY2x1ZGVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9faW5jbHVkZSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFthbV9fcXVvdGVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fcXVvdGVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fcXVvdGUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbQU1ERVBfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNREVQX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW0FNREVQX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQU1ERVBfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNREVQQkFDS1NMQVNIXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1ERVBCQUNLU0xBU0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUKFthbV9fbm9kZXBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fbm9kZXBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fbm9kZXAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX25vZGVwXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbQ0NERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ0NERVBNT0RFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0NERVBNT0RFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwQ0NdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVChbYW1fX2Zhc3RkZXBDQ19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX2Zhc3RkZXBDQ19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2Zhc3RkZXBDQ19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfU1VCU1QoW2FtX19mYXN0ZGVwQ0NfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fZmFzdGRlcENDX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2Zhc3RkZXBDQ19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENDX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENDX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQU1fUFJPR19DQ19DX08KLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW05PX01JTlVTX0NfTUlOVVNfT10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15OT19NSU5VU19DX01JTlVTX08kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUhfT1VUUFVUKFtOT19NSU5VU19DX01JTlVTX09dLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuXCd0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi1AJTpAdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfUkVRVUlSRV9BVVhfRklMRShbY29tcGlsZV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzogLTEtIEFDX1NVQlNUKFtTRVRfTUFLRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzogLTEtIEFDX1NVQlNUX1RSQUNFKFtTRVRfTUFLRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRVRfTUFLRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QUk9HX0xJQlRPT0wKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNTEzOiBBQ19FTkFCTEVfU0hBUkVEIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNTUyOiBBQ19FTkFCTEVfU1RBVElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNTkxOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfQ0FOT05JQ0FMX0hPU1QKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfQ0FOT05JQ0FMX0JVSUxECi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbmZpZy5zdWJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19SRVFVSVJFX0FVWF9GSUxFKFtjb25maWcuZ3Vlc3NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbYnVpbGRdLCBbJGFjX2N2X2J1aWxkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2J1aWxkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtidWlsZF9jcHVdLCBbJFsxXV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtidWlsZF9jcHVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfY3B1JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtidWlsZF92ZW5kb3JdLCBbJFsyXV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtidWlsZF92ZW5kb3JdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfdmVuZG9yJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtidWlsZF9vc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtidWlsZF9vc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZF9vcyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbaG9zdF0sIFskYWNfY3ZfaG9zdF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtob3N0XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2hvc3RfY3B1XSwgWyRbMV1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF9jcHVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF9jcHUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2hvc3RfdmVuZG9yXSwgWyRbMl1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF92ZW5kb3JdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF92ZW5kb3IkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2hvc3Rfb3NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF9vc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ob3N0X29zJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ4MTogQUNfQVJHX1dJVEggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjI3MzI6IEFDX1BST0dfTEQgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbR1JFUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtHUkVQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdSRVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0VHUkVQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VHUkVQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVHUkVQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtMTl9TXSwgWyRhc19sbl9zXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xOX1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTE5fUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbRUNIT10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtFQ0hPXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVDSE8kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0FSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtSQU5MSUJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbUkFOTElCXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlJBTkxJQiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbU1RSSVBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbU1RSSVBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1RSSVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDgxOiBBQ19BUkdfV0lUSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjE5OiBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NTogX0xUX0FDX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTQ6IEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTU6IF9MVF9BQ19MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU0OiBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfTElOSycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjg3OiBBQ19UUllfTElOSyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMDczOiBfTFRfQUNfTE9DSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTY3NzogQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0RMTFRPT0xdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbRExMVE9PTF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ETExUT09MJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtBU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtBU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbT0JKRFVNUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtPQkpEVU1QXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9CSkRVTVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1OTQ2OiBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1OTQ2OiBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0RMRkNOX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX0RMRkNOX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbQ1BQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0NQUEZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUEZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtDUFBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1BQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU1REQ19IRUFERVJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNURENfSEVBREVSUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBSF9PVVRQVVQoW1NURENfSEVBREVSU10sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLUAlOkB1bmRlZiBTVERDX0hFQURFUlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1lTX1RZUEVTX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TWVNfVFlQRVNfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfU1RBVF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TWVNfU1RBVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NURExJQl9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfU1RETElCX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSSU5HX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TVFJJTkdfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFIX09VVFBVVChbSEFWRV9NRU1PUllfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX01FTU9SWV9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUklOR1NfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TVFJJTkdTX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfSU5UVFlQRVNfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfSU5UVFlQRVNfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFIX09VVFBVVChbSEFWRV9TVERJTlRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NURElOVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1VOSVNURF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfVU5JU1REX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ETEZDTl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfRExGQ05fSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ4MTogQUNfQVJHX1dJVEggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbYmFjayBxdW90ZXMgYW5kIGRvdWJsZSBxdW90ZXMgbXVzdCBub3QgYmUgZXNjYXBlZCBpbjogdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzXSwgW2FjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtDWFhGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWFhGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFhGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbTERGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtMREZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxERkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtDUFBGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDUFBGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFBGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2FjX2N0X0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFthY19jdF9DWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWNfY3RfQ1hYJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtDWFhERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWFhERVBNT0RFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWERFUE1PREUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwQ1hYXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbYW1fX2Zhc3RkZXBDWFhfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fZmFzdGRlcENYWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19mYXN0ZGVwQ1hYX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2FtX19mYXN0ZGVwQ1hYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX19mYXN0ZGVwQ1hYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19mYXN0ZGVwQ1hYX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENYWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19mYXN0ZGVwQ1hYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0NYWENQUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWFhDUFBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYQ1BQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtDUFBGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDUFBGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFBGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbQ1hYQ1BQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NYWENQUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFhDUFAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM2OiBfTFRfQUNfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM1OiBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNjogX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNTogQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyMTk6IEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM2OiBfTFRfQUNfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM1OiBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCwgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTI2NDogQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM2OiBfTFRfQUNfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM1OiBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkY3NyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbRkZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0ZGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15GRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW0xERkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbTERGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MREZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtMSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19TVUJTVChbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15GNzckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1QoW2FjX2N0X0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFthY19jdF9GNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWNfY3RfRjc3JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NywgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDM6IF9MVF9BQ19MQU5HX0Y3N19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDI6IEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3LCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDM6IF9MVF9BQ19MQU5HX0Y3N19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDI6IEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19TQVZFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEyNTogQUNfTEFOR19TQVZFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA1OiBfTFRfQUNfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA0OiBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfQ0FDSEVfVkFMKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiwgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1OTQ2OiBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA1OiBfTFRfQUNfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA0OiBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTk0NjogQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1JFU1RPUkUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTM0OiBBQ19MQU5HX1JFU1RPUkUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19TQVZFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEyNTogQUNfTEFOR19TQVZFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjY1OiBfTFRfQUNfTEFOR19SQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2NjQ6IEFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1JFU1RPUkUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTM0OiBBQ19MQU5HX1JFU1RPUkUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2NjU6IF9MVF9BQ19MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDY2NDogQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1NVQlNUKFtMSUJUT09MXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQlRPT0xdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCVE9PTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjA6IC0xLSBBQ19TVUJTVChbQVJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI0OiAtMS0gQUhfT1VUUFVUKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl0sIFsvKiBEaXNhYmxlIFRpZ2h0Vk5DRmlsZVRyYW5zZmVyIHByb3RvY29sICovCi1AJTpAdW5kZWYgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzI6IC0xLSBBSF9PVVRQVVQoW1dJVEhfV0VCU09DS0VUU10sIFsvKiBEaXNhYmxlIFdlYlNvY2tldHMgc3VwcG9ydCAqLwotQCU6QHVuZGVmIFdJVEhfV0VCU09DS0VUU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODogLTEtIEFIX09VVFBVVChbQUxMT1cyNEJQUF0sIFsvKiBFbmFibGUgMjQgYml0IHBlciBwaXhlbCBpbiBuYXRpdmUgZnJhbWVidWZmZXIgKi8KLUAlOkB1bmRlZiBBTExPVzI0QlBQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0FMTE9XMjRCUFBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQUxMT1cyNEJQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDU6IC0xLSBBSF9PVVRQVVQoW0ZGTVBFR10sIFsvKiBVc2UgZmZtcGVnIChmb3Igdm5jMm1wZykgKi8KLUAlOkB1bmRlZiBGRk1QRUddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDg6IC0xLSBBQ19TVUJTVChbd2l0aF9mZm1wZWddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDg6IC0xLSBBQ19TVUJTVF9UUkFDRShbd2l0aF9mZm1wZWddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFted2l0aF9mZm1wZWckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ5OiAtMS0gQU1fQ09ORElUSU9OQUwoW1dJVEhfRkZNUEVHXSwgW3Rlc3QgISAteiAiJHdpdGhfZmZtcGVnIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OTogLTEtIEFDX1NVQlNUKFtXSVRIX0ZGTVBFR19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1dJVEhfRkZNUEVHX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9GRk1QRUdfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBBQ19TVUJTVChbV0lUSF9GRk1QRUdfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBBQ19TVUJTVF9UUkFDRShbV0lUSF9GRk1QRUdfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9GRk1QRUdfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfRkZNUEVHX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9GRk1QRUdfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9NUDNMQU1FXSwgW3Rlc3QgIiRIQVZFX01QM0xBTUUiID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gQUNfU1VCU1QoW0hBVkVfTVAzTEFNRV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTVAzTEFNRV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTVAzTEFNRV9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MzogLTEtIEFDX1NVQlNUKFtIQVZFX01QM0xBTUVfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9NUDNMQU1FX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTVAzTEFNRV9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9NUDNMQU1FX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9NUDNMQU1FX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQkNSWVBUXSwgWy8qIGxpYmNyeXB0IGxpYnJhcnkgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTElCQ1JZUFRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY6IC0xLSBBSF9PVVRQVVQoW0hBVkVfQ1JZUFRdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcnlwdFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfQ1JZUFRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9DUllQVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0NSWVBUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQkNSWVBUXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCQ1JZUFQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzOiAtMS0gQUNfU1VCU1QoW0NSWVBUX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODM6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1JZUFRfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUllQVF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NjogLTEtIEFIX09VVFBVVChbSEFWRV9MSUJDUllQVE9dLCBbLyogb3BlbnNzbCBsaWJjcnlwdG8gbGlicmFyeSBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSUJDUllQVE9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElCU1NMXSwgWy8qIG9wZW5zc2wgbGlic3NsIGxpYnJhcnkgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTElCU1NMXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQkNSWVBUT10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJDUllQVE8kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFIX09VVFBVVChbSEFWRV9YNTA5X1BSSU5UX0VYX0ZQXSwgWy8qIG9wZW4gc3NsIFg1MDlfcHJpbnRfZXhfZnAgYXZhaWxhYmxlICovCi1AJTpAdW5kZWYgSEFWRV9YNTA5X1BSSU5UX0VYX0ZQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEyMjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlNTTF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJTU0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEyNzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlNTTF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMjc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJTU0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMjogLTEtIEFDX1NVQlNUKFtTU0xfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbU1NMX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNTTF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzM6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJTU0xdLCBbdGVzdCAhIC16ICIkU1NMX0xJQlMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIEFDX1NVQlNUKFtIQVZFX0xJQlNTTF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX0xJQlNTTF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNTTF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzM6IC0xLSBBQ19TVUJTVChbSEFWRV9MSUJTU0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCU1NMX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNTTF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU1NMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU1NMX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIEFDX1NVQlNUKFtYTUtNRl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBBQ19TVUJTVF9UUkFDRShbWE1LTUZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhNS01GJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbWF9ESVNQTEFZX01JU1NJTkddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhfRElTUExBWV9NSVNTSU5HJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBBSF9PVVRQVVQoW1hfRElTUExBWV9NSVNTSU5HXSwgWy8qIERlZmluZSB0byAxIGlmIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgbWlzc2luZyBvciBub3QgYmVpbmcgdXNlZC4gKi8KLUAlOkB1bmRlZiBYX0RJU1BMQVlfTUlTU0lOR10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBBQ19TVUJTVChbWF9DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1hfQ0ZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gQUNfU1VCU1QoW1hfUFJFX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1hfUFJFX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhfUFJFX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIEFDX1NVQlNUKFtYX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1hfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBBQ19TVUJTVChbWF9FWFRSQV9MSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIEFDX1NVQlNUX1RSQUNFKFtYX0VYVFJBX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhfRVhUUkFfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM4OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1gxMV0sIFsvKiBYMTEgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfWDExXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE0MTogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSXSwgWy8qIFVzZSB0aGUgc3lzdGVtIGxpYnZuY3NlcnZlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgeDExdm5jLiAqLwotQCU6QHVuZGVmIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNjA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfWFNITV0sIFsvKiBNSVQtU0hNIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9YU0hNXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE2MTogLTEtIEFIX09VVFBVVChbSEFWRV9YVEVTVF0sIFsvKiBYVEVTVCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfWFRFU1RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTYyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1hURVNUR1JBQkNPTlRST0xdLCBbLyogWFRFU1QgZXh0ZW5zaW9uIGhhcyBYVGVzdEdyYWJDb250cm9sICovCi1AJTpAdW5kZWYgSEFWRV9YVEVTVEdSQUJDT05UUk9MXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE2MzogLTEtIEFIX09VVFBVVChbSEFWRV9YS0VZQk9BUkRdLCBbLyogWEtFWUJPQVJEIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9YS0VZQk9BUkRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTY0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQlhJTkVSQU1BXSwgWy8qIFhJTkVSQU1BIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSUJYSU5FUkFNQV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNjU6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElCWFJBTkRSXSwgWy8qIFhSQU5EUiBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTElCWFJBTkRSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE2NjogLTEtIEFIX09VVFBVVChbSEFWRV9MSUJYRklYRVNdLCBbLyogWEZJWEVTIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSUJYRklYRVNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTY3OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQlhEQU1BR0VdLCBbLyogWERBTUFHRSBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTElCWERBTUFHRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNjg6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElCWFRSQVBdLCBbLyogREVDLVhUUkFQIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSUJYVFJBUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNjk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfUkVDT1JEXSwgWy8qIFJFQ09SRCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfUkVDT1JEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3MDogLTEtIEFIX09VVFBVVChbSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOXSwgWy8qIFNvbGFyaXMgWFJlYWRTY3JlZW4gYXZhaWxhYmxlICovCi1AJTpAdW5kZWYgSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3MTogLTEtIEFIX09VVFBVVChbSEFWRV9JUklYX1hSRUFERElTUExBWV0sIFsvKiBJUklYIFhSZWFkRGlzcGxheSBhdmFpbGFibGUgKi8KLUAlOkB1bmRlZiBIQVZFX0lSSVhfWFJFQURESVNQTEFZXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3MjogLTEtIEFIX09VVFBVVChbSEFWRV9GQlBNXSwgWy8qIEZCUE0gZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLUAlOkB1bmRlZiBIQVZFX0ZCUE1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTczOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0RQTVNdLCBbLyogRFBNUyBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfRFBNU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElOVVhfVklERU9ERVZfSF0sIFsvKiB2aWRlbzRsaW51eCBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSU5VWF9WSURFT0RFVl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3NTogLTEtIEFIX09VVFBVVChbSEFWRV9MSU5VWF9GQl9IXSwgWy8qIGxpbnV4IGZiIGRldmljZSBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSU5VWF9GQl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3NjogLTEtIEFIX09VVFBVVChbSEFWRV9MSU5VWF9JTlBVVF9IXSwgWy8qIGxpbnV4L2lucHV0LmggcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTElOVVhfSU5QVVRfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzc6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElOVVhfVUlOUFVUX0hdLCBbLyogbGludXggdWlucHV0IGRldmljZSBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9MSU5VWF9VSU5QVVRfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzg6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZXSwgWy8qIGJ1aWxkIE1hY09TIFggbmF0aXZlIGRpc3BsYXkgc3VwcG9ydCAqLwotQCU6QHVuZGVmIEhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE3OTogLTEtIEFIX09VVFBVVChbSEFWRV9NQUNPU1hfT1BFTkdMX0hdLCBbLyogTWFjT1MgWCBPcGVuR0wgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfTUFDT1NYX09QRU5HTF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIxNDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1gxMV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YMTEkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIyMjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1hTSE1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjIyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWFNITSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjI2OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU09MQVJJU19YUkVBRFNDUkVFTl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMjY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMzA6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9JUklYX1hSRUFERElTUExBWV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMzA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9JUklYX1hSRUFERElTUExBWSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjM1OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfRkJQTV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMzU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9GQlBNJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNDE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9EUE1TXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0RQTVMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI0NjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1hURVNUR1JBQkNPTlRST0xdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjQ2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWFRFU1RHUkFCQ09OVFJPTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjUxOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfWFRFU1RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjUxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWFRFU1QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI1NzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1JFQ09SRF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9SRUNPUkQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI2NjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlhUUkFQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI2NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlhUUkFQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9MSUJYVFJBUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYVFJBUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mjg1OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfWEtFWUJPQVJEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI4NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1hLRVlCT0FSRCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjkyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElCWElORVJBTUFdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjkyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWElORVJBTUEkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI5OTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlhSQU5EUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYUkFORFIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMwNjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlhGSVhFU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMDY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYRklYRVMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMxMzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlhEQU1BR0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWERBTUFHRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzM3OiAtMS0gQUNfU1VCU1QoW1hfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzc6IC0xLSBBQ19TVUJTVF9UUkFDRShbWF9MSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX1gxMV0sIFt0ZXN0ICRIQVZFX1gxMSAhPSAiZmFsc2UiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIEFDX1NVQlNUKFtIQVZFX1gxMV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX1gxMV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1gxMV9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBBQ19TVUJTVChbSEFWRV9YMTFfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzM4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfWDExX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjMzODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1gxMV9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzM4OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfWDExX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzM4OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfWDExX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM3ODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJTlVYX1ZJREVPREVWX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzc4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElOVVhfVklERU9ERVZfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzgyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElOVVhfRkJfSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSU5VWF9GQl9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozODY6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9MSU5VWF9JTlBVVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM4NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJTlVYX0lOUFVUX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM4OTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJTlVYX1VJTlBVVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM4OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJTlVYX1VJTlBVVF9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOTU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9NQUNPU1hfTkFUSVZFX0RJU1BMQVldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOTk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9NQUNPU1hfT1BFTkdMX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzk5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTUFDT1NYX09QRU5HTF9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MDI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfQVZBSEldLCBbLyogQXZhaGkvbUROUyBjbGllbnQgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotQCU6QHVuZGVmIEhBVkVfQVZBSEldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDI0OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfQVZBSEldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDI0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfQVZBSEkkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQyNTogLTEtIEFDX1NVQlNUKFtBVkFISV9DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDI1OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FWQUhJX0NGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVZBSElfQ0ZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjY6IC0xLSBBQ19TVUJTVChbQVZBSElfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjY6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVZBSElfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVZBSElfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gQU1fQ09ORElUSU9OQUwoW09TWF9PUEVOR0xdLCBbdGVzdCAiJEhBVkVfTUFDT1NYX09QRU5HTF9IIiA9ICJ0cnVlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzM6IC0xLSBBQ19TVUJTVChbT1NYX09QRU5HTF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtPU1hfT1BFTkdMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9TWF9PUEVOR0xfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gQUNfU1VCU1QoW09TWF9PUEVOR0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW09TWF9PUEVOR0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9TWF9PUEVOR0xfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzMzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtPU1hfT1BFTkdMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW09TWF9PUEVOR0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE1OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTY6IC0xLSBBQ19TVUJTVChbU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE2OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1NZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE3OiAtMS0gQUNfU1VCU1QoW1NZU1RFTV9MSUJWTkNTRVJWRVJfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTc6IC0xLSBBQ19TVUJTVF9UUkFDRShbU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJdLCBbdGVzdCAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiID0gInh5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIEFDX1NVQlNUKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTk6IC0xLSBBQ19TVUJTVChbSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM1OiAtMS0gQUNfU1VCU1QoW0pQRUdfTERGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MzU6IC0xLSBBQ19TVUJTVF9UUkFDRShbSlBFR19MREZMQUdTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15KUEVHX0xERkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjU2MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQkpQRUddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCSlBFRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTYyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQkpQRUddLCBbLyogbGlianBlZyBzdXBwb3J0IGVuYWJsZWQgKi8KLUAlOkB1bmRlZiBIQVZFX0xJQkpQRUddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NjAzOiAtMS0gX200X3dhcm4oW2Nyb3NzXSwgW0FDX1JVTl9JRkVMU0UgY2FsbGVkIHdpdGhvdXQgZGVmYXVsdCB0byBhbGxvdyBjcm9zcyBjb21waWxpbmddLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc0ODogQUNfUlVOX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6NjAzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjY1MzogLTEtIEFIX09VVFBVVChbSEFWRV9MSUJQTkddLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwbmdcJyBsaWJyYXJ5ICgtbHBuZykuICovCi1AJTpAdW5kZWYgSEFWRV9MSUJQTkddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NjUzOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElCUE5HXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjY1MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBORyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzAxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQlpdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB6XCcgbGlicmFyeSAoLWx6KS4gKi8KLUAlOkB1bmRlZiBIQVZFX0xJQlpdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzAxOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElCWl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MDE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJaJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTElCUFRIUkVBRF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWRcJyBsaWJyYXJ5ICgtbHB0aHJlYWQpLiAqLwotQCU6QHVuZGVmIEhBVkVfTElCUFRIUkVBRF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9MSUJQVEhSRUFEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQUQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlBUSFJFQURdLCBbdGVzdCAhIC16ICIkSEFWRV9MSUJQVEhSRUFEIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzU6IC0xLSBBQ19TVUJTVChbSEFWRV9MSUJQVEhSRUFEX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM1OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCUFRIUkVBRF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQURfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzM1OiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCUFRIUkVBRF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzU6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9MSUJQVEhSRUFEX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQURfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBUSFJFQURfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJQVEhSRUFEX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1RMU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3Mzg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9UTFMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczODogLTEtIEFIX09VVFBVVChbSEFWRV9UTFNdLCBbLyogRGVmaW5lIHRvIDEgaWYgY29tcGlsZXIgc3VwcG9ydHMgX190aHJlYWQgKi8KLUAlOkB1bmRlZiBIQVZFX1RMU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NDk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzQ5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NTE6IC0xLSBBTV9DT05ESVRJT05BTChbV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJdLCBbdGVzdCAiJHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIEFDX1NVQlNUKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NTE6IC0xLSBBQ19TVUJTVChbV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzUxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1OTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtXSVRIX1dFQlNPQ0tFVFNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzU5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfV0VCU09DS0VUUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gQU1fQ09ORElUSU9OQUwoW1dJVEhfV0VCU09DS0VUU10sIFt0ZXN0ICIkd2l0aF93ZWJzb2NrZXRzIiA9ICJ5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIEFDX1NVQlNUKFtXSVRIX1dFQlNPQ0tFVFNfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBBQ19TVUJTVF9UUkFDRShbV0lUSF9XRUJTT0NLRVRTX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfV0VCU09DS0VUU19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBBQ19TVUJTVChbV0lUSF9XRUJTT0NLRVRTX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtXSVRIX1dFQlNPQ0tFVFNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfV0VCU09DS0VUU19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfV0VCU09DS0VUU19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1dFQlNPQ0tFVFNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCWl0sIFt0ZXN0ICEgLXogIiRIQVZFX1pMSUJfSCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCWl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX0xJQlpfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJaX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIEFDX1NVQlNUKFtIQVZFX0xJQlpfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCWl9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJaX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJaX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCWl9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJKUEVHXSwgW3Rlc3QgISAteiAiJEhBVkVfSlBFR0xJQl9IIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBBQ19TVUJTVChbSEFWRV9MSUJKUEVHX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCSlBFR19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkpQRUdfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCSlBFR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9MSUJKUEVHX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkpQRUdfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQkpQRUdfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjQ6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJKUEVHX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlBOR10sIFt0ZXN0ICEgLXogIiRIQVZFX1BOR0xJQl9IIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBBQ19TVUJTVChbSEFWRV9MSUJQTkdfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9MSUJQTkdfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJQTkdfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY1OiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCUE5HX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX0xJQlBOR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJQTkdfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBOR19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBOR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJTRExdLCBbdGVzdCAieCR3aXRoX3NkbCIgPSAieHllcyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCU0RMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCU0RMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU0RMX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4ODogLTEtIEFDX1NVQlNUKFtIQVZFX0xJQlNETF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9MSUJTRExfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU0RMX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTRExfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJTRExfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg5OiAtMS0gQUNfU1VCU1QoW1NETF9DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1NETF9DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNETF9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5MDogLTEtIEFDX1NVQlNUKFtTRExfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbU0RMX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzkwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNETF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF8oUEFUSHxMSUJESVJ8U1lTUk9PVF9ESVJ8QUxMT1dfU1lTVEVNXyhDRkxBR1N8TElCUykpKT8kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHXyhESVNBQkxFX1VOSU5TVEFMTEVEfFRPUF9CVUlMRF9ESVJ8REVCVUdfU1BFVykkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUKFtQS0dfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtQS0dfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBBQ19TVUJTVChbUEtHX0NPTkZJR19QQVRIXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtQS0dfQ09ORklHX1BBVEhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUdfUEFUSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gQUNfU1VCU1QoW1BLR19DT05GSUdfTElCRElSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtQS0dfQ09ORklHX0xJQkRJUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJR19MSUJESVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUKFtQS0dfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtQS0dfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBBQ19TVUJTVChbR1RLX0NGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbR1RLX0NGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteR1RLX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gQUNfU1VCU1QoW0dUS19MSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIEFDX1NVQlNUX1RSQUNFKFtHVEtfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteR1RLX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQkdUS10sIFt0ZXN0ICEgLXogIiRHVEtfTElCUyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gQUNfU1VCU1QoW0hBVkVfTElCR1RLX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfTElCR1RLX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCR1RLX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NTogLTEtIEFDX1NVQlNUKFtIQVZFX0xJQkdUS19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9MSUJHVEtfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCR1RLX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk3OiAtMS0gQUNfQ0FOT05JQ0FMX0hPU1QKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIEFNX0NPTkRJVElPTkFMKFtNSU5HV10sIFt0ZXN0ICEgLXogIiRNSU5HVyIgXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIEFDX1NVQlNUKFtNSU5HV19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtNSU5HV19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NSU5HV19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTk6IC0xLSBBQ19TVUJTVChbTUlOR1dfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW01JTkdXX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NSU5HV19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgwNDogLTEtIEFDX1NVQlNUKFtXU09DS0xJQl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MDQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbV1NPQ0tMSUJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODA0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldTT0NLTElCJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MDc6IC0xLSBBSF9PVVRQVVQoW1dJVEhfQ0xJRU5UX0dDUllQVF0sIFsvKiBFbmFibGUgc3VwcG9ydCBmb3IgbGliZ2NyeXB0IGluIGxpYnZuY2NsaWVudCAqLwotQCU6QHVuZGVmIFdJVEhfQ0xJRU5UX0dDUllQVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0yLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo3MDI1OiBBTV9QQVRIX0xJQkdDUllQVCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODE0OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIEFDX1NVQlNUKFtMSUJHQ1JZUFRfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJHQ1JZUFRfQ09ORklHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJHQ1JZUFRfQ09ORklHJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBBQ19TVUJTVChbTElCR0NSWVBUX0NGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbTElCR0NSWVBUX0NGTEFHU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCR0NSWVBUX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMS0gQUNfU1VCU1QoW0xJQkdDUllQVF9MSUJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJHQ1JZUFRfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCR0NSWVBUX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtXSVRIX0NMSUVOVF9HQ1JZUFRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfQ0xJRU5UX0dDUllQVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODIzOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0dOVVRMU10sIFsvKiBHbnVUTFMgbGlicmFyeSBwcmVzZW50ICovCi1AJTpAdW5kZWYgSEFWRV9HTlVUTFNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gQUNfU1VCU1QoW0dOVVRMU19DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0dOVVRMU19DRkxBR1NdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdOVVRMU19DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgyOTogLTEtIEFDX1NVQlNUKFtHTlVUTFNfTElCU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4Mjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbR05VVExTX0xJQlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdOVVRMU19MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzM6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9HTlVUTFNdLCBbdGVzdCAhIC16ICIkR05VVExTX0xJQlMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIEFDX1NVQlNUKFtIQVZFX0dOVVRMU19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtIQVZFX0dOVVRMU19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0dOVVRMU19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzM6IC0xLSBBQ19TVUJTVChbSEFWRV9HTlVUTFNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfR05VVExTX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0dOVVRMU19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfR05VVExTX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfR05VVExTX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzNTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0dOVVRMU10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9HTlVUTFMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg1NDogLTEtIEFIX09VVFBVVChbSVB2Nl0sIFsvKiBFbmFibGUgSVB2NiBzdXBwb3J0ICovCi1AJTpAdW5kZWYgSVB2Nl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NTg6IC0yLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSVB2Nl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NTg6IC0yLSBtNF9wYXR0ZXJuX2FsbG93KFteSVB2NiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMy0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0lQdjZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMy0gbTRfcGF0dGVybl9hbGxvdyhbXklQdjYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg1OTogLTItIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2ODc6IEFDX1RSWV9MSU5LIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvbGlicy5tNDo5OTogQUNfQ0hFQ0tfTElCIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4NTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMi0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0lQdjZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU5OiAtMi0gbTRfcGF0dGVybl9hbGxvdyhbXklQdjYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3MzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTVERDX0hFQURFUlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODczOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNURENfSEVBREVSUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODczOiAtMS0gQUhfT1VUUFVUKFtTVERDX0hFQURFUlNdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi1AJTpAdW5kZWYgU1REQ19IRUFERVJTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9BUlBBX0lORVRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX0FSUEFfSU5FVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9GQ05UTF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9GQ05UTF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9ORVREQl9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9ORVREQl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9ORVRJTkVUX0lOX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfTkVUSU5FVF9JTl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TVERMSUJfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NURExJQl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TVFJJTkdfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NUUklOR19IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfU09DS0VUX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfU1lTX1NPQ0tFVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfVElNRV9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TWVNfVElNRV9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfVElNRUJfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lYi5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NZU19USU1FQl9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNMT0dfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2xvZy5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NZU0xPR19IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9VTklTVERfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1VOSVNURF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3NDogLTEtIEFIX09VVFBVVChbSEFWRV9XUzJUQ1BJUF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d3MydGNwaXAuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9XUzJUQ1BJUF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9QV0RfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB3ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1BXRF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfV0FJVF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3dhaXQuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TWVNfV0FJVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9VVE1QWF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRtcHguaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9VVE1QWF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9URVJNSU9TX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtaW9zLmg+IGhlYWRlciBmaWxlLiAqLwotQCU6QHVuZGVmIEhBVkVfVEVSTUlPU19IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfSU9DVExfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NZU19JT0NUTF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg3ODogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfU1RST1BUU19IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9TWVNfU1RST1BUU19IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtjb25zdF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteY29uc3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4MjogLTEtIEFIX09VVFBVVChbY29uc3RdLCBbLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdFwnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLwotQCU6QHVuZGVmIGNvbnN0XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4MzogLTEtIEFIX09VVFBVVChbaW5saW5lXSwgWy8qIERlZmluZSB0byBgX19pbmxpbmVfX1wnIG9yIGBfX2lubGluZVwnIGlmIHRoYXRcJ3Mgd2hhdCB0aGUgQyBjb21waWxlcgotICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgXCdpbmxpbmVcJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSN1bmRlZiBpbmxpbmUKLSNlbmRpZl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODQ6IC0xLSBBSF9PVVRQVVQoW1dPUkRTX0JJR0VORElBTl0sIFsvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKLSAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLwotI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECi0jIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KLSMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotIyBlbmRpZgotI2Vsc2UKLSMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgotIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCi0jIGVuZGlmCi0jZW5kaWZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg0OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1dPUkRTX0JJR0VORElBTl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV09SRFNfQklHRU5ESUFOJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODQ6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NDogLTEtIEFIX09VVFBVVChbQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEXSwgWy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KLUAlOkB1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTERdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg1OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW3NpemVfdF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2l6ZV90JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODU6IC0xLSBBSF9PVVRQVVQoW3NpemVfdF0sIFsvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludFwnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotQCU6QHVuZGVmIHNpemVfdF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODY6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbVElNRV9XSVRIX1NZU19USU1FXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15USU1FX1dJVEhfU1lTX1RJTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NjogLTEtIEFIX09VVFBVVChbVElNRV9XSVRIX1NZU19USU1FXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLwotQCU6QHVuZGVmIFRJTUVfV0lUSF9TWVNfVElNRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODc6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9TWVNfV0FJVF9IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NZU19XQUlUX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NzogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfV0FJVF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gKi8KLUAlOkB1bmRlZiBIQVZFX1NZU19XQUlUX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODg4OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjogQUNfVFlQRV9TT0NLTEVOX1QgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg4ODogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODg6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbc29ja2xlbl90XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zb2NrbGVuX3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTSVpFT0ZfQ0hBUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0NIQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFIX09VVFBVVChbU0laRU9GX0NIQVJdLCBbLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGNoYXIgKi8KLUAlOkB1bmRlZiBTSVpFT0ZfQ0hBUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMDogQUNfQ09NUElMRV9DSEVDS19TSVpFT0YgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ5OiBBQ19DUkVBVEVfU1RESU5UX0ggaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg5MzogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX1NIT1JUXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfU0hPUlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFIX09VVFBVVChbU0laRU9GX1NIT1JUXSwgWy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdHlwZSBzaG9ydCAqLwotQCU6QHVuZGVmIFNJWkVPRl9TSE9SVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMDogQUNfQ09NUElMRV9DSEVDS19TSVpFT0YgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ5OiBBQ19DUkVBVEVfU1RESU5UX0ggaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg5MzogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX0lOVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0lOVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUhfT1VUUFVUKFtTSVpFT0ZfSU5UXSwgWy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdHlwZSBpbnQgKi8KLUAlOkB1bmRlZiBTSVpFT0ZfSU5UXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTSVpFT0ZfTE9OR10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0xPTkckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFIX09VVFBVVChbU0laRU9GX0xPTkddLCBbLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGxvbmcgKi8KLUAlOkB1bmRlZiBTSVpFT0ZfTE9OR10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMDogQUNfQ09NUElMRV9DSEVDS19TSVpFT0YgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ5OiBBQ19DUkVBVEVfU1RESU5UX0ggaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg5MzogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTM6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX1ZPSURQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfVk9JRFAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFIX09VVFBVVChbU0laRU9GX1ZPSURQXSwgWy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdHlwZSB2b2lkKiAqLwotQCU6QHVuZGVmIFNJWkVPRl9WT0lEUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OTQ6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTQ6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTAyOiAtMS0gQUhfT1VUUFVUKFtORUVEX0lOQUREUl9UXSwgWy8qIE5lZWQgYSB0eXBlZGVmIGZvciBpbl9hZGRyX3QgKi8KLUAlOkB1bmRlZiBORUVEX0lOQUREUl9UXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwNDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtORUVEX0lOQUREUl9UXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ORUVEX0lOQUREUl9UJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDc6IC0xLSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbIiRMSUJAJnRAT0JKUyBtZW1jbXAuJGFjX29iamV4dCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA3OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA3OiAtMS0gQUNfTElCU09VUkNFKFttZW1jbXAuY10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDg6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTktdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDg6IC0xLSBBSF9PVVRQVVQoW0xTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LXSwgWy8qIERlZmluZSB0byAxIGlmIGBsc3RhdFwnIGRlcmVmZXJlbmNlcyBhIHN5bWxpbmsgc3BlY2lmaWVkIHdpdGggYSB0cmFpbGluZwotICAgc2xhc2guICovCi1AJTpAdW5kZWYgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTktdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfU1VCU1QoW0xJQkAmdEBPQkpTXSwgWyIkTElCQCZ0QE9CSlMgbHN0YXQuJGFjX29iamV4dCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfTElCU09VUkNFKFtsc3RhdC5jXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIEFDX1NVQlNUKFtMSUJAJnRAT0JKU10sIFsiJExJQkAmdEBPQkpTIHN0YXQuJGFjX29iamV4dCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfTElCU09VUkNFKFtzdGF0LmNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1RBVF9FTVBUWV9TVFJJTkdfQlVHXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUQVRfRU1QVFlfU1RSSU5HX0JVRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUQVRfRU1QVFlfU1RSSU5HX0JVR10sIFsvKiBEZWZpbmUgdG8gMSBpZiBgc3RhdFwnIGhhcyB0aGUgYnVnIHRoYXQgaXQgc3VjY2VlZHMgd2hlbiBnaXZlbiB0aGUKLSAgIHplcm8tbGVuZ3RoIGZpbGUgbmFtZSBhcmd1bWVudC4gKi8KLUAlOkB1bmRlZiBIQVZFX1NUQVRfRU1QVFlfU1RSSU5HX0JVR10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSRlRJTUVdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZVwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU1RSRlRJTUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA5OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1RSRlRJTUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1RSRlRJTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwOTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1NUUkZUSU1FXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUUkZUSU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfVlBSSU5URl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZwcmludGZcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1ZQUklOVEZdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfVlBSSU5URl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9WUFJJTlRGJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ET1BSTlRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfRE9QUk5UJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfRE9QUk5UXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBkb25cJ3QgaGF2ZSBgdnByaW50ZlwnIGJ1dCBkbyBoYXZlIGBfZG9wcm50LlwnICovCi1AJTpAdW5kZWYgSEFWRV9ET1BSTlRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW3BpZF90XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15waWRfdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gQUhfT1VUUFVUKFtwaWRfdF0sIFsvKiBEZWZpbmUgdG8gYGludFwnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotQCU6QHVuZGVmIHBpZF90XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIEFIX09VVFBVVChbSEFWRV9WRk9SS19IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dmZvcmsuaD4gaGVhZGVyIGZpbGUuICovCi1AJTpAdW5kZWYgSEFWRV9WRk9SS19IXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1ZGT1JLX0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfVkZPUktfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0ZPUktdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmb3JrXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9GT1JLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIEFIX09VVFBVVChbSEFWRV9WRk9SS10sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZmb3JrXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9WRk9SS10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9XT1JLSU5HX1ZGT1JLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1dPUktJTkdfVkZPUkskXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIEFIX09VVFBVVChbSEFWRV9XT1JLSU5HX1ZGT1JLXSwgWy8qIERlZmluZSB0byAxIGlmIGB2Zm9ya1wnIHdvcmtzLiAqLwotQCU6QHVuZGVmIEhBVkVfV09SS0lOR19WRk9SS10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbdmZvcmtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnZmb3JrJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTE6IC0xLSBBSF9PVVRQVVQoW3Zmb3JrXSwgWy8qIERlZmluZSBhcyBgZm9ya1wnIGlmIGB2Zm9ya1wnIGRvZXMgbm90IHdvcmsuICovCi1AJTpAdW5kZWYgdmZvcmtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfV09SS0lOR19GT1JLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1dPUktJTkdfRk9SSyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1dPUktJTkdfRk9SS10sIFsvKiBEZWZpbmUgdG8gMSBpZiBgZm9ya1wnIHdvcmtzLiAqLwotQCU6QHVuZGVmIEhBVkVfV09SS0lOR19GT1JLXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMjogLTEtIEFIX09VVFBVVChbSEFWRV9MSUJOU0xdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuc2xcJyBsaWJyYXJ5ICgtbG5zbCkuICovCi1AJTpAdW5kZWYgSEFWRV9MSUJOU0xdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElCTlNMXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQk5TTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEzOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQlNPQ0tFVF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldFwnIGxpYnJhcnkgKC1sc29ja2V0KS4gKi8KLUAlOkB1bmRlZiBIQVZFX0xJQlNPQ0tFVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTM6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9MSUJTT0NLRVRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU09DS0VUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfRlRJTUVdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGltZVwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfRlRJTUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTIxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0dFVEhPU1RCWU5BTUVdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyMTogLTEtIEFIX09VVFBVVChbSEFWRV9HRVRIT1NUTkFNRV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RuYW1lXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRIT1NUTkFNRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfR0VUVElNRU9GREFZXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5XCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTIxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0lORVRfTlRPQV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfbnRvYVwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfSU5FVF9OVE9BXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyMTogLTEtIEFIX09VVFBVVChbSEFWRV9NRU1NT1ZFXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtbW92ZVwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfTUVNTU9WRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTUVNU0VUXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0XCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9NRU1TRVRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTIxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX01NQVBdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9NTUFQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyMTogLTEtIEFIX09VVFBVVChbSEFWRV9NS0ZJRk9dLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBta2ZpZm9cJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX01LRklGT10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU0VMRUNUXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VsZWN0XCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9TRUxFQ1RdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTIxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NPQ0tFVF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU09DS0VUXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyMTogLTEtIEFIX09VVFBVVChbSEFWRV9TVFJDSFJdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjaHJcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1NUUkNIUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSQ1NQTl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNzcG5cJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1NUUkNTUE5dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTIxOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUkRVUF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU1RSRFVQXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyMTogLTEtIEFIX09VVFBVVChbSEFWRV9TVFJFUlJPUl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9TVFJFUlJPUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSU1RSXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc3RyXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9TVFJTVFJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NFVFNJRF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU0VUU0lEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyNDogLTEtIEFIX09VVFBVVChbSEFWRV9TRVRQR1JQXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cGdycFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU0VUUEdSUF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfR0VUUFdVSURdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwd3VpZFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfR0VUUFdVSURdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0dFVFBXTkFNXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHduYW1cJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX0dFVFBXTkFNXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyNDogLTEtIEFIX09VVFBVVChbSEFWRV9HRVRTUE5BTV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNwbmFtXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRTUE5BTV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfR0VUVUlEXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dWlkXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRVSURdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0dFVEVVSURdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRldWlkXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9HRVRFVUlEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyNDogLTEtIEFIX09VVFBVVChbSEFWRV9TRVRVSURdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1aWRcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1NFVFVJRF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU0VUR0lEXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z2lkXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9TRVRHSURdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NFVEVVSURdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRldWlkXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9TRVRFVUlEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyNDogLTEtIEFIX09VVFBVVChbSEFWRV9TRVRFR0lEXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZWdpZFwnIGZ1bmN0aW9uLiAqLwotQCU6QHVuZGVmIEhBVkVfU0VURUdJRF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfSU5JVEdST1VQU10sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluaXRncm91cHNcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX0lOSVRHUk9VUFNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1dBSVRQSURdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0cGlkXCcgZnVuY3Rpb24uICovCi1AJTpAdW5kZWYgSEFWRV9XQUlUUElEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyNDogLTEtIEFIX09VVFBVVChbSEFWRV9TRVRVVFhFTlRdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1dHhlbnRcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1NFVFVUWEVOVF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MjQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfR1JBTlRQVF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdyYW50cHRcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX0dSQU5UUFRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NITUFUXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2htYXRcJyBmdW5jdGlvbi4gKi8KLUAlOkB1bmRlZiBIQVZFX1NITUFUXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyODogLTEtIEFIX09VVFBVVChbSEFWRV9MSUJDWUdJUENdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjeWdpcGNcJyBsaWJyYXJ5ICgtbGN5Z2lwYykuICovCi1AJTpAdW5kZWYgSEFWRV9MSUJDWUdJUENdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI4OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTElCQ1lHSVBDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkNZR0lQQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gQU1fQ09ORElUSU9OQUwoW0NZR0lQQ10sIFt0ZXN0ICIkSEFWRV9DWUdJUEMiID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIEFDX1NVQlNUKFtDWUdJUENfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1lHSVBDX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNZR0lQQ19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBBQ19TVUJTVChbQ1lHSVBDX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtDWUdJUENfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNZR0lQQ19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0NZR0lQQ19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkyOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtDWUdJUENfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gQU1fQ09ORElUSU9OQUwoW0xJTlVYXSwgW3Rlc3QgLWQgL3Vzci9pbmNsdWRlL2xpbnV4XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIEFDX1NVQlNUKFtMSU5VWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSU5VWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSU5VWF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzI6IC0xLSBBQ19TVUJTVChbTElOVVhfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJTlVYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSU5VWF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0xJTlVYX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0xJTlVYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIEFNX0NPTkRJVElPTkFMKFtPU1hdLCBbdGVzdCAiJEhBVkVfT1NYIiA9ICJ0cnVlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzY6IC0xLSBBQ19TVUJTVChbT1NYX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTM2OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW09TWF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PU1hfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTM2OiAtMS0gQUNfU1VCU1QoW09TWF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzY6IC0xLSBBQ19TVUJTVF9UUkFDRShbT1NYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PU1hfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtPU1hfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzY6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbT1NYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIEFNX0NPTkRJVElPTkFMKFtBTkRST0lEXSwgW3Rlc3QgIiRIQVZFX0FORFJPSUQiID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIEFDX1NVQlNUKFtBTkRST0lEX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FORFJPSURfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU5EUk9JRF9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBBQ19TVUJTVChbQU5EUk9JRF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQU5EUk9JRF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU5EUk9JRF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQwOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FORFJPSURfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU5EUk9JRF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9BTkRST0lEXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0FORFJPSUQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MjogLTEtIEFIX09VVFBVVChbSEFWRV9BTkRST0lEXSwgWy8qIEFuZHJvaWQgaG9zdCBzeXN0ZW0gZGV0ZWN0ZWQgKi8KLUAlOkB1bmRlZiBIQVZFX0FORFJPSURdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQ2OiAtMS0gQUhfT1VUUFVUKFtFTk9FTlRfV09SS0FST1VORF0sIFsvKiB3b3JrIGFyb3VuZCB3aGVuIHdyaXRlKCkgcmV0dXJucyBFTk9FTlQgYnV0IGRvZXMgbm90IG1lYW4gaXQgKi8KLUAlOkB1bmRlZiBFTk9FTlRfV09SS0FST1VORF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbRU5PRU5UX1dPUktBUk9VTkRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTQ5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVOT0VOVF9XT1JLQVJPVU5EJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9SUE1dLCBbdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gQUNfU1VCU1QoW0hBVkVfUlBNX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0hBVkVfUlBNX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUlBNX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MjogLTEtIEFDX1NVQlNUKFtIQVZFX1JQTV9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbSEFWRV9SUE1fRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUlBNX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9SUE1fVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9SUE1fRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gQU1fQ09ORElUSU9OQUwoW1dJVEhfWDExVk5DXSwgW3Rlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gQUNfU1VCU1QoW1dJVEhfWDExVk5DX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1dJVEhfWDExVk5DX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfWDExVk5DX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MzogLTEtIEFDX1NVQlNUKFtXSVRIX1gxMVZOQ19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBBQ19TVUJTVF9UUkFDRShbV0lUSF9YMTFWTkNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfWDExVk5DX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9YMTFWTkNfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9YMTFWTkNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTY0OiAtMS0gQUNfU1VCU1QoW1JQTVNPVVJDRURJUl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbUlBNU09VUkNFRElSXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15SUE1TT1VSQ0VESVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2NjogLTEtIEFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUKLQlsaWJ2bmNzZXJ2ZXIucGMKLQlsaWJ2bmNjbGllbnQucGMKLQlsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUKLQlleGFtcGxlcy9NYWtlZmlsZQotCWV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUKLQl2bmN0ZXJtL01ha2VmaWxlCi0Jd2ViY2xpZW50cy9NYWtlZmlsZQotCXdlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUKLQl3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZQotCWxpYnZuY2NsaWVudC9NYWtlZmlsZQotCWNsaWVudF9leGFtcGxlcy9NYWtlZmlsZQotCXRlc3QvTWFrZWZpbGUKLQlsaWJ2bmNzZXJ2ZXItY29uZmlnCi0JTGliVk5DU2VydmVyLnNwZWNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTk1OiAtMS0gQUNfQ09ORklHX0ZJTEVTKFt4MTF2bmMvTWFrZWZpbGUgeDExdm5jL21pc2MvTWFrZWZpbGUgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUKFtMSUJAJnRAT0JKU10sIFskYWNfbGlib2Jqc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCQCZ0QE9CSlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBQ19TVUJTVChbTFRMSUJPQkpTXSwgWyRhY19sdGxpYm9ianNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtMVExJQk9CSlNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MVExJQk9CSlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1QoW2FtX19FWEVFWFRfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX19FWEVFWFRfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19FWEVFWFRfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUKFthbV9fRVhFRVhUX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX0VYRUVYVF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19FWEVFWFRfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX0VYRUVYVF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX0VYRUVYVF9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3RvcF9idWlsZGRpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3RvcF9idWlsZF9wcmVmaXhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtzcmNkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUX1RSQUNFKFthYnNfc3JjZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBQ19TVUJTVF9UUkFDRShbdG9wX3NyY2Rpcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2Fic190b3Bfc3JjZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUX1RSQUNFKFthYnNfYnVpbGRkaXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIEFDX1NVQlNUX1RSQUNFKFthYnNfdG9wX2J1aWxkZGlyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBQ19TVUJTVF9UUkFDRShbSU5TVEFMTF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW01LRElSX1BdKQpkaWZmIC0tZ2l0IGEvYXV0b200dGUuY2FjaGUvdHJhY2VzLjIgYi9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5ZDkzNy4uMDAwMDAwMAotLS0gYS9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMgorKysgL2Rldi9udWxsCkBAIC0xLDEwNDI5ICswLDAgQEAKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsL3BrZy5tNDoyNzogLTEtIEFDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwgW200X3BhdHRlcm5fZm9yYmlkKFteXz9QS0dfW0EtWl9dKyRdKQotbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUcoXyhQQVRIfExJQkRJUnxTWVNST09UX0RJUnxBTExPV19TWVNURU1fKENGTEFHU3xMSUJTKSkpPyRdKQotbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUdfKERJU0FCTEVfVU5JTlNUQUxMRUR8VE9QX0JVSUxEX0RJUnxERUJVR19TUEVXKSRdKQotQUNfQVJHX1ZBUihbUEtHX0NPTkZJR10sIFtwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eV0pCi1BQ19BUkdfVkFSKFtQS0dfQ09ORklHX1BBVEhdLCBbZGlyZWN0b3JpZXMgdG8gYWRkIHRvIHBrZy1jb25maWcncyBzZWFyY2ggcGF0aF0pCi1BQ19BUkdfVkFSKFtQS0dfQ09ORklHX0xJQkRJUl0sIFtwYXRoIG92ZXJyaWRpbmcgcGtnLWNvbmZpZydzIGJ1aWx0LWluIHNlYXJjaCBwYXRoXSkKLQotaWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgotCUFDX1BBVEhfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKLWZpCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLQlfcGtnX21pbl92ZXJzaW9uPW00X2RlZmF1bHQoWyQxXSwgWzAuOS4wXSkKLQlBQ19NU0dfQ0hFQ0tJTkcoW3BrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbl0pCi0JaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCVBLR19DT05GSUc9IiIKLQlmaQotZmlbXWRubAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsL3BrZy5tNDo2MDogLTEtIEFDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwgW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKWRubAotaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICBBQ19SVU5fTE9HKFskUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiJDEiXSk7IHRoZW4KLSAgbTRfZGVmYXVsdChbJDJdLCBbOl0pCi1tNF9pZnZhbG4oWyQzXSwgW2Vsc2UKLSAgJDNdKWRubAotZmldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwvcGtnLm00Ojg2OiAtMS0gQUNfREVGVU4oW19QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRF0sIFtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKLWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKLWVsc2UKLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCi1maVtdZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwvcGtnLm00OjEwNjogLTEtIEFDX0RFRlVOKFtQS0dfQ0hFQ0tfTU9EVUxFU10sIFtBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKLUFDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAotQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCi0KLXBrZ19mYWlsZWQ9bm8KLUFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLQotX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCi1fUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQotCi1tNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCi1hbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KLVNlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCi0KLWlmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KLSAgIAlBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAotICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZWxzZSAKLQkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKLSAgICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkJDFbXV9QS0dfRVJST1JTIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0KLQltNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoCi1bUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6Ci0KLSQkMV9QS0dfRVJST1JTCi0KLUNvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQotaW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KLQotX1BLR19URVhUXSlbXWRubAotICAgICAgICBdKQotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgotICAgICAJQUNfTVNHX1JFU1VMVChbbm9dKQotCW00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19GQUlMVVJFKAotW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAotaXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAotcGF0aCB0byBwa2ctY29uZmlnLgotCi1fUEtHX1RFWFQKLQotVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSlbXWRubAotICAgICAgICBdKQotZWxzZQotCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUwotCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCi0gICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0JJDMKLWZpW11kbmwKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2FtdmVyc2lvbi5tNDoxNzogLTEtIEFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwgW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKLWRubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KLWRubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCi1tNF9pZihbJDFdLCBbMS4xMS42XSwgW10sCi0gICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9hbXZlcnNpb24ubTQ6MzY6IC0xLSBBQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sIFtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExLjZdKWRubAotbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKLSAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAotX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2F1eGRpci5tNDo0OTogLTEtIEFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sIFtkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgotQUNfUFJFUkVRKFsyLjUwXSlkbmwKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2NvbmQubTQ6MTU6IC0xLSBBQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLCBbQUNfUFJFUkVRKDIuNTIpZG5sCi0gaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKLQlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCi1BQ19TVUJTVChbJDFfVFJVRV0pZG5sCi1BQ19TVUJTVChbJDFfRkFMU0VdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX0ZBTFNFXSlkbmwKLW00X2RlZmluZShbX0FNX0NPTkRfVkFMVUVfJDFdLCBbJDJdKWRubAotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmkKLUFDX0NPTkZJR19DT01NQU5EU19QUkUoCi1baWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCi0gIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKLWZpXSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9kZXBlbmQubTQ6Mjg6IC0xLSBBQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sIFtBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKLUFDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKLUFDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCi1BQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAotCi1pZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKLSAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCi1baWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKLSAgZmkKLSAgYW1fX3VuaXZlcnNhbD1mYWxzZQotICBtNF9jYXNlKFskMV0sIFtDQ10sCi0gICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjXSwKLSAgICBbQ1hYXSwKLSAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCi0gICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7Ci0gICAgIGVzYWNdKQotCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCi0gICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCi0gICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgZ2NjKQotICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KLSAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCi0gICAgICA7OwotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQotICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKLSAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAotICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KLSAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KLSAgICAgIGFtX19taW51c19vYmo9Ci0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotXSkKLUFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQotQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2RlcGVuZC5tNDoxNjQ6IC0xLSBBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sIFtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvZGVwZW5kLm00OjE3MjogLTEtIEFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLCBbQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAotWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi0gIGFtX19ub2RlcD0nX25vJwotZmkKLUFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1BQ19TVUJTVChbYW1fX25vZGVwXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFthbV9fbm9kZXBdKWRubAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvZGVwb3V0Lm00OjE0OiAtMS0gQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sIFt7Ci0gICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCi0gICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKLSAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCi0gIGNhc2UgJENPTkZJR19GSUxFUyBpbgotICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OwotICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKLSAgZXNhYwotICBzaGlmdAotICBmb3IgbWYKLSAgZG8KLSAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCi0gICAgZWxzZQotICAgICAgY29udGludWUKLSAgICBmaQotICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAgICMgZXhwYW5zaW9uLgotICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0JIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKLSAgICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKLSAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgICBkb25lCi0gIGRvbmUKLX0KLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2RlcG91dC5tNDo3NTogLTEtIEFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sIFtBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKLSAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi0gICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2hlYWRlci5tNDoxMjogLTEtIEFVX0RFRlVOKFtBTV9DT05GSUdfSEVBREVSXSwgW0FDX0NPTkZJR19IRUFERVJTKCRAKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2hlYWRlci5tNDoxMjogLTEtIEFDX0RFRlVOKFtBTV9DT05GSUdfSEVBREVSXSwgW0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFNX0NPTkZJR19IRUFERVInIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAotQUNfQ09ORklHX0hFQURFUlMoJEApXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaW5pdC5tNDoyNjogLTEtIEFDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwgW0FDX1BSRVJFUShbMi42Ml0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi1BQ19TVUJTVChbQ1lHUEFUSF9XXSkKLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCi1tNF9pZnZhbChbJDJdLAotW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKLVtfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKLWRubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgotbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCi0gIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1fQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKLQkgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAotCQkJICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1fQU1fSUZfT1BUSU9OKFtzaWxlbnQtcnVsZXNdLCBbQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSldKWRubAotZG5sIFRoZSBgcGFyYWxsZWwtdGVzdHMnIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQotZG5sIGBhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcyBtYWNybwotZG5sIGlzIGhvb2tlZCBvbnRvIF9BQ19DT01QSUxFUl9FWEVFWFQgZWFybHksIHNlZSBiZWxvdy4KLUFDX0NPTkZJR19DT01NQU5EU19QUkUoZG5sCi1bbTRfcHJvdmlkZV9pZihbX0FNX0NPTVBJTEVSX0VYRUVYVF0sCi0gIFtBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pXSldKWRubAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvaW5pdC5tNDoxMjY6IC0xLSBBQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sIFsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fYXJnPSQxCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmBBU19ESVJOQU1FKFsiJF9hbV9hcmciXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9pbnN0YWxsLXNoLm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sIFtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1pZiB0ZXN0IHgiJHtpbnN0YWxsX3NofSIgIT0geHNldDsgdGhlbgotICBjYXNlICRhbV9hdXhfZGlyIGluCi0gICpcICogfCAqXAkqKQotICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAnJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCciIDs7Ci0gICopCi0gICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL2luc3RhbGwtc2giCi0gIGVzYWMKLWZpCi1BQ19TVUJTVChpbnN0YWxsX3NoKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2xlYWQtZG90Lm00OjEyOiAtMS0gQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sIFtybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWFrZS5tNDoxNDogLTEtIEFDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLCBbYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLUFDX1NVQlNUKFthbV9fcXVvdGVdKQotQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQotcm0gLWYgY29uZmluYyBjb25mbWYKLV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL21pbnVzby5tNDoxNDogLTEtIEFDX0RFRlVOKFtBTV9QUk9HX0NDX0NfT10sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX0NfT10pZG5sCi1BQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFtjb21waWxlXSlkbmwKLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hbV9jYz1gZWNobyAkWzJdIHwgc2VkIFsncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLyddYAotZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KLWlmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLWRubCBNYWtlIHN1cmUgQUNfUFJPR19DQyBpcyBuZXZlciBjYWxsZWQgYWdhaW4sIG9yIGl0IHdpbGwgb3ZlcnJpZGUgb3VyCi1kbmwgc2V0dGluZyBvZiBDQy4KLW00X2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgW200X2ZhdGFsKFtBQ19QUk9HX0NDIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgQU1fUFJPR19DQ19DX09dKV0pCi1dKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9taXNzaW5nLm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sIFtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9taXNzaW5nLm00OjI0OiAtMS0gQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sIFtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKLWlmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgotICBjYXNlICRhbV9hdXhfZGlyIGluCi0gICpcICogfCAqXAkqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKLSAgKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKLSAgZXNhYwotZmkKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCi1maQotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvbWtkaXJwLm00OjE0OiAtMS0gQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sIFtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvb3B0aW9ucy5tNDoxNDogLTEtIEFDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sIFtbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9vcHRpb25zLm00OjIwOiAtMS0gQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwgW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9vcHRpb25zLm00OjI2OiAtMS0gQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sIFttNF9mb3JlYWNoX3coW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL29wdGlvbnMubTQ6MzI6IC0xLSBBQ19ERUZVTihbX0FNX0lGX09QVElPTl0sIFttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9ydW5sb2cubTQ6MTQ6IC0xLSBBQ19ERUZVTihbQU1fUlVOX0xPR10sIFt7IGVjaG8gIiRhc19tZTokTElORU5POiAkMSIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgKCQxKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBhY19zdGF0dXM9JD8KLSAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3Nhbml0eS5tNDoxNDogLTEtIEFDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLCBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKLSMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KLWFtX2xmPScKLScKLWNhc2UgYHB3ZGAgaW4KLSAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZdXSopCi0gICAgQUNfTVNHX0VSUk9SKFt1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZV0pOzsKLWVzYWMKLWNhc2UgJHNyY2RpciBpbgotICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldXSopCi0gICAgQUNfTVNHX0VSUk9SKFt1bnNhZmUgc3JjZGlyIHZhbHVlOiBgJHNyY2RpciddKTs7Ci1lc2FjCi0KLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zaWxlbnQubTQ6MTQ6IC0xLSBBQ19ERUZVTihbQU1fU0lMRU5UX1JVTEVTXSwgW0FDX0FSR19FTkFCTEUoW3NpbGVudC1ydWxlc10sCi1bICAtLWVuYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICAgbGVzcyB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0xJykKLSAgLS1kaXNhYmxlLXNpbGVudC1ydWxlcyAgICAgICAgIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiBgbWFrZSBWPTAnKV0pCi1jYXNlICRlbmFibGVfc2lsZW50X3J1bGVzIGluCi15ZXMpIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTA7Owotbm8pICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0xOzsKLSopICAgQU1fREVGQVVMVF9WRVJCT1NJVFk9bTRfaWYoWyQxXSwgW3llc10sIFswXSwgWzFdKTs7Ci1lc2FjCi1kbmwKLWRubCBBIGZldyBgbWFrZScgaW1wbGVtZW50YXRpb25zIChlLmcuLCBOb25TdG9wIE9TIGFuZCBOZXh0U3RlcCkKLWRubCBkbyBub3Qgc3VwcG9ydCBuZXN0ZWQgdmFyaWFibGUgZXhwYW5zaW9ucy4KLWRubCBTZWUgYXV0b21ha2UgYnVnIzk5MjggYW5kIGJ1ZyMxMDIzNy4KLWFtX21ha2U9JHtNQUtFLW1ha2V9Ci1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkYW1fbWFrZSBzdXBwb3J0cyBuZXN0ZWQgdmFyaWFibGVzXSwKLSAgIFthbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlc10sCi0gICBbaWYgQVNfRUNITyhbWydUUlVFPSQoQkFSJChWKSkKLUJBUjA9ZmFsc2UKLUJBUjE9dHJ1ZQotVj0xCi1hbV9fZG9pdDoKLQlAJChUUlVFKQotLlBIT05ZOiBhbV9fZG9pdCddXSkgfCAkYW1fbWFrZSAtZiAtID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz15ZXMKLWVsc2UKLSAgYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9bm8KLWZpXSkKLWlmIHRlc3QgJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzID0geWVzOyB0aGVuCi0gIGRubCBVc2luZyBgJFYnIGluc3RlYWQgb2YgYCQoViknIGJyZWFrcyBJUklYIG1ha2UuCi0gIEFNX1Y9JyQoViknCi0gIEFNX0RFRkFVTFRfVj0nJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSknCi1lbHNlCi0gIEFNX1Y9JEFNX0RFRkFVTFRfVkVSQk9TSVRZCi0gIEFNX0RFRkFVTFRfVj0kQU1fREVGQVVMVF9WRVJCT1NJVFkKLWZpCi1BQ19TVUJTVChbQU1fVl0pZG5sCi1BTV9TVUJTVF9OT1RNQUtFKFtBTV9WXSlkbmwKLUFDX1NVQlNUKFtBTV9ERUZBVUxUX1ZdKWRubAotQU1fU1VCU1RfTk9UTUFLRShbQU1fREVGQVVMVF9WXSlkbmwKLUFDX1NVQlNUKFtBTV9ERUZBVUxUX1ZFUkJPU0lUWV0pZG5sCi1BTV9CQUNLU0xBU0g9J1wnCi1BQ19TVUJTVChbQU1fQkFDS1NMQVNIXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFtBTV9CQUNLU0xBU0hdKWRubAotXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvc3RyaXAubTQ6MTk6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NUUklQXSwgW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotbTR0cmFjZTovdXNyL3NoYXJlL2FjbG9jYWwtMS4xMS9zdWJzdG5vdC5tNDoxNDogLTEtIEFDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCi1tNHRyYWNlOi91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL3N1YnN0bm90Lm00OjE5OiAtMS0gQUNfREVGVU4oW0FNX1NVQlNUX05PVE1BS0VdLCBbX0FNX1NVQlNUX05PVE1BS0UoJEApXSkKLW00dHJhY2U6L3Vzci9zaGFyZS9hY2xvY2FsLTEuMTEvdGFyLm00OjI0OiAtMS0gQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sIFsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAotIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCi1BQ19TVUJTVChbQU1UQVJdLCBbJyQke1RBUi10YXJ9J10pCi1tNF9pZihbJDFdLCBbdjddLAotICAgICBbYW1fX3Rhcj0nJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciInIGFtX191bnRhcj0nJCR7VEFSLXRhcn0geGYgLSddLAotICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAotICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKLUFDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKLSMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KLV9hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCi1fYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQotIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCi0jIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCi1mb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scwotZG8KLSAgY2FzZSAkX2FtX3Rvb2wgaW4KLSAgZ251dGFyKQotICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKLSAgICBkbwotICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKLSAgICA7OwotICBwbGFpbnRhcikKLSAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQotICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCi0gICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQotICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCi0gICAgOzsKLSAgcGF4KQotICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ncGF4IC1yJwotICAgIDs7Ci0gIGNwaW8pCi0gICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJwotICAgIDs7Ci0gIG5vbmUpCi0gICAgYW1fX3Rhcj1mYWxzZQotICAgIGFtX190YXJfPWZhbHNlCi0gICAgYW1fX3VudGFyPWZhbHNlCi0gICAgOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCi0gICMgYW5kIGFtX191bnRhciBzZXQuCi0gIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhawotCi0gICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcwotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCi0gIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KLSAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQotICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhawotICBmaQotZG9uZQotcm0gLXJmIGNvbmZ0ZXN0LmRpcgotCi1BQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCi1BQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCi1BQ19TVUJTVChbYW1fX3Rhcl0pCi1BQ19TVUJTVChbYW1fX3VudGFyXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyOiAtMS0gQUNfREVGVU4oW0FDX1RZUEVfU09DS0xFTl9UXSwgW0FDX0NBQ0hFX0NIRUNLKFtmb3Igc29ja2xlbl90XSwgYWNfY3ZfdHlwZV9zb2NrbGVuX3QsCi1bCi0gIEFDX1RSWV9DT01QSUxFKAotICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dLAotICBbc29ja2xlbl90IGxlbiA9IDQyOyByZXR1cm4gMDtdLAotICBhY19jdl90eXBlX3NvY2tsZW5fdD15ZXMsCi0gIGFjX2N2X3R5cGVfc29ja2xlbl90PW5vKQotXSkKLSAgaWYgdGVzdCAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QgIT0geWVzOyB0aGVuCi0gICAgQUNfREVGSU5FKHNvY2tsZW5fdCwgaW50KQotICBmaQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjIwOiAtMS0gQUNfREVGVU4oW0FDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GXSwgW2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKLWRubCBUaGUgbmFtZSB0byAjZGVmaW5lLgotZGVmaW5lKDw8QUNfVFlQRV9OQU1FPj4sIHRyYW5zbGl0KHNpemVvZl8kMSwgW2EteiAqXSwgW0EtWl9QXSkpZG5sCi1kbmwgVGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUuCi1kZWZpbmUoPDxBQ19DVl9OQU1FPj4sIHRyYW5zbGl0KGFjX2N2X3NpemVvZl8kMSwgWyAqXSwgW19wXSkpZG5sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotQUNfTVNHX0NIRUNLSU5HKHNpemUgb2YgJDEpCi1BQ19DQUNIRV9WQUwoQUNfQ1ZfTkFNRSwKLVtmb3IgYWNfc2l6ZSBpbiA0IDggMSAyIDE2ICQyIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSQyCi1dLCBbc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAoJDEpID09ICRhY19zaXplKTo7XSwgQUNfQ1ZfTkFNRT0kYWNfc2l6ZSkKLSAgaWYgdGVzdCB4JEFDX0NWX05BTUUgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi1dKQotaWYgdGVzdCB4JEFDX0NWX05BTUUgPSB4IDsgdGhlbgotICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBkZXRlcm1pbmUgYSBzaXplIGZvciAkMV0pCi1maQotQUNfTVNHX1JFU1VMVCgkQUNfQ1ZfTkFNRSkKLUFDX0RFRklORV9VTlFVT1RFRChBQ19UWVBFX05BTUUsICRBQ19DVl9OQU1FLCBbVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlICQxXSkKLXVuZGVmaW5lKFtBQ19UWVBFX05BTUVdKWRubAotdW5kZWZpbmUoW0FDX0NWX05BTUVdKWRubAotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ5OiAtMS0gQUNfREVGVU4oW0FDX0NSRUFURV9TVERJTlRfSF0sIFsjIC0tLS0tLSBBQyBDUkVBVEUgU1RESU5UIEggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkaW50LXR5cGVzLi4uLl0pCi1hY19zdGRpbnRfaD1gZWNobyBpZmVsc2UoJDEsICwgX3N0ZGludC5oLCAkMSlgCi1pZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gInN0ZGludC5oIiA7IHRoZW4KLSBBQ19NU0dfUkVTVUxUKCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9zdGRpbnQuaD8pIikKLWVsaWYgdGVzdCAiJGFjX3N0ZGludF9oIiA9ICJpbnR0eXBlcy5oIiA7IHRoZW4KLSBBQ19NU0dfUkVTVUxUKCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9pbnR0eXBlcy5oPykiKQotZWxzZQotIEFDX01TR19SRVNVTFQoIihwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpIikKLWZpCi0KLWludHR5cGVfaGVhZGVycz1gZWNobyBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oICQyIFwKLXwgc2VkIC1lICdzLywvIC9nJ2AKLQotIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X289Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF91PSJuby1maWxlIgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50cHRyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIF9BQ19DSEVDS19UWVBFX05FVyh1aW50cHRyX3QsW2FjX2N2X2hlYWRlcl9zdGRpbnRfeD0kaV0sZG5sCi0gICAgIGNvbnRpbnVlLFsjaW5jbHVkZSA8JGk+XSkKLSAgIEFDX0NIRUNLX1RZUEUodWludDY0X3QsW2FuZDY0PSIodWludDY0X3QgdG9vKSJdLFthbmQ2ND0iIl0sWyNpbmNsdWRlPCRpPl0pCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gJGkgJGFuZDY0KQotICAgYnJlYWs7Ci0gZG9uZQotIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50NjRfdAotICAgQUNfQ0hFQ0tfVFlQRSh1aW50MzJfdCxbYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpXSxkbmwKLSAgICAgY29udGludWUsWyNpbmNsdWRlIDwkaT5dKQotICAgQUNfQ0hFQ0tfVFlQRSh1aW50NjRfdCxbYW5kNjQ9Iih1aW50NjRfdCB0b28pIl0sW2FuZDY0PSIiXSxbI2luY2x1ZGU8JGk+XSkKLSAgIEFDX01TR19SRVNVTFQoLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCkKLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzeXMvdHlwZXMuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdV9pbnQzMl90Ci0gICB1bnNldCBhY19jdl90eXBlX3VfaW50NjRfdAotICAgQUNfQ0hFQ0tfVFlQRSh1X2ludDMyX3QsW2FjX2N2X2hlYWRlcl9zdGRpbnRfdT0kaV0sZG5sCi0gICAgIGNvbnRpbnVlLFsjaW5jbHVkZSA8JGk+XSkKLSAgIEFDX0NIRUNLX1RZUEUodWludDY0X3QsW2FuZDY0PSIodV9pbnQ2NF90IHRvbykiXSxbYW5kNjQ9IiJdLFsjaW5jbHVkZTwkaT5dKQotICAgQUNfTVNHX1JFU1VMVCguLi4gc2VlbiBvdXIgdV9pbnQzMl90IGluICRpICRhbmQ2NCkKLSAgIGJyZWFrOwotIGRvbmUKLSBmaQotIGZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gRE9ORSBpbnR0eXBlcy5oIGNoZWNrcyBNQVlCRSBDIGJhc2ljIHR5cGVzIC0tLS0tLS0tCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICAgQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoY2hhcikKLSAgIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKHNob3J0KQotICAgQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoaW50KQotICAgQUNfQ09NUElMRV9DSEVDS19TSVpFT0YobG9uZykKLSAgIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKHZvaWQqKQotICAgYWNfY3ZfaGVhZGVyX3N0ZGludF90ZXN0PSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9Im5vIgotZmkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGludHR5cGVzLmggY2hlY2tzIFNUQVJUIGhlYWRlciAtLS0tLS0tLS0tLS0tCi1fYWNfc3RkaW50X2g9QVNfVFJfQ1BQKF8kYWNfc3RkaW50X2gpCi1BQ19NU0dfUkVTVUxUKGNyZWF0aW5nICRhY19zdGRpbnRfaCA6ICRfYWNfc3RkaW50X2gpCi1lY2hvICIjaWZuZGVmIiAkX2FjX3N0ZGludF9oID4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiICRfYWNfc3RkaW50X2ggIjEiID4+JGFjX3N0ZGludF9oCi1lY2hvICIjaWZuZGVmIiBfR0VORVJBVEVEX1NURElOVF9IID4+JGFjX3N0ZGludF9oCi1lY2hvICIjZGVmaW5lIiBfR0VORVJBVEVEX1NURElOVF9IICciJyRQQUNLQUdFICRWRVJTSU9OJyInID4+JGFjX3N0ZGludF9oCi1pZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvICIvKiBnZW5lcmF0ZWQgdXNpbmcgYSBnbnUgY29tcGlsZXIgdmVyc2lvbiIgYCRDQyAtLXZlcnNpb25gICIqLyIgXAotICA+PiRhY19zdGRpbnRfaAotZWxzZQotICBlY2hvICIvKiBnZW5lcmF0ZWQgdXNpbmcgJENDICovIiA+PiRhY19zdGRpbnRfaAotZmkKLWVjaG8gIiIgPj4kYWNfc3RkaW50X2gKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X28iICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X28iCi1lbGlmICB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IgotZWxzZQotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0ic3RkZGVmLmgiCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIFNlZSBpZiBpbnRfbGVhc3QgYW5kIGludF9mYXN0IHR5cGVzIGFyZSBwcmVzZW50Ci11bnNldCBhY19jdl90eXBlX2ludF9sZWFzdDMyX3QKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2Zhc3QzMl90Ci1BQ19DSEVDS19UWVBFKGludF9sZWFzdDMyX3QsLCxbI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50Pl0pCi1BQ19DSEVDS19UWVBFKGludF9mYXN0MzJfdCwsLFsjaW5jbHVkZTwkYWNfY3ZfaGVhZGVyX3N0ZGludD5dKQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgIT0gInN0ZGRlZi5oIiA7IHRoZW4KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiAhPSAic3RkaW50LmgiIDsgdGhlbgotQUNfTVNHX1JFU1VMVCguLmFkZGluZyBpbmNsdWRlIHN0ZGRlZi5oKQotICAgZWNobyAiI2luY2x1ZGUgPHN0ZGRlZi5oPiIgPj4kYWNfc3RkaW50X2gKLWZpIDsgZmkKLUFDX01TR19SRVNVTFQoLi5hZGRpbmcgaW5jbHVkZSAkYWNfY3ZfaGVhZGVyX3N0ZGludCkKLSAgIGVjaG8gIiNpbmNsdWRlIDwkYWNfY3ZfaGVhZGVyX3N0ZGludD4iID4+JGFjX3N0ZGludF9oCi1lY2hvICIiID4+JGFjX3N0ZGludF9oCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gRE9ORSBoZWFkZXIgU1RBUlQgYmFzaWMgaW50IHR5cGVzIC0tLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID0gIm5vLWZpbGUiIDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVCguLi4gbmVlZCB0byBsb29rIGF0IEMgYmFzaWMgdHlwZXMpCi1kbmwgYWNfY3ZfaGVhZGVyX3N0ZGludF90ZXN0PSJ5ZXMiICMgbW92ZWQgdXAgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaWxlCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMpCi1kbmwgYWNfY3ZfaGVhZGVyX3N0ZGludF90ZXN0PSJubyIgICMgbW92ZWQgdXAgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaWxlCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIGJzZC9zeXN2IHR5cGVkZWZzKQotICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIGludDhfdCBpbnQxNl90IGludDMyX3QgZGVmaW5lZCBieSBpbmV0IGNvZGUsIHJlZGVjbGFyZSB0aGUgdV9pbnRYWCB0eXBlcyAqLwotdHlwZWRlZiB1X2ludDhfdCB1aW50OF90OwotdHlwZWRlZiB1X2ludDE2X3QgdWludDE2X3Q7Ci10eXBlZGVmIHVfaW50MzJfdCB1aW50MzJfdDsKLUVPRgotICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBnbGliYyBjb21wYXRpYmlsaXR5ICovCi0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotI2VuZGlmCi1FT0YKLWZpCi0KLWFjX2N2X3NpemVvZl94PSIkYWNfY3Zfc2l6ZW9mX2NoYXI6JGFjX2N2X3NpemVvZl9zaG9ydCIKLWFjX2N2X3NpemVvZl9YPSIkYWNfY3Zfc2l6ZW9mX3g6JGFjX2N2X3NpemVvZl9pbnQiCi1hY19jdl9zaXplb2ZfWD0iJGFjX2N2X3NpemVvZl9YOiRhY19jdl9zaXplb2Zfdm9pZHA6JGFjX2N2X3NpemVvZl9sb25nIgotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiID0gInN0ZGRlZi5oIiA7IHRoZW4KLSMgICB3ZSBtdXN0IGd1ZXNzIGFsbCB0aGUgYmFzaWMgdHlwZXMuIEFwYXJ0IGZyb20gYnl0ZS1hZHJlc3NhYmxlIHN5c3RlbSwKLSMgdGhlcmUgYSBmZXcgMzItYml0LW9ubHkgZHNwLXN5c3RlbXMuIG5pYmJsZS1hZGRyZXNzYWJsZSBzeXN0ZW1zIGFyZSB3YXkgb2ZmLgotICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogLS0tLS0tLS0tLS0tIEJJVFNQRUNJRklDIElOVFRZUEVTIFNFQ1RJT04gLS0tLS0tLS0tLS0tLS0tICovCi1FT0YKLSAgICB0PSJ0eXBlZGVmcyBmb3IgYSIKLSAgICBjYXNlICIkYWNfY3Zfc2l6ZW9mX1giIGluCi0gICAgIDE6MjoyOjI6NCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCBub3JtYWwgMTYtYml0IHN5c3RlbSkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qICAgICAgICAgICAgICBhIG5vcm1hbCAxNi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjI6NDo0KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gZGVyaXZlZCBmcm9tIGEgMTYtYml0KQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo0OjQpIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgJHQgbm9ybWFsIDMyLWJpdCBzeXN0ZW0pCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiAgICAgICAgICAgICAgYSBub3JtYWwgMzItYml0IHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0OjQ6OCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQpCi0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gcHJlcGFyZWQgZm9yIDY0LWJpdCAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo4KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nICR0IG5vcm1hbCA2NC1iaXQgc3lzdGVtKQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSBub3JtYWwgNjQtYml0IHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgIDE6Mjo0Ojg6NCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyAkdCA2NC1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDMyLWJpdCkKLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAqKQotICAgIEFDX01TR19FUlJPUihbICRhY19jdl9zaXplb2ZfWCBkbmwKLSB3aGF0IGlzIHRoYXQgYSBzeXN0ZW0/IGNvbnRhY3QgdGhlIGF1dGhvciwgcXVpY2shIGh0dHA6Ly9hYy1hcmNoaXZlLnNmLm5ldF0pCi0gICAgZXhpdCAxCi07OwotICAgZXNhYwotZmkKLQotIyAtLS0tLS0tLS0tLS0tIERPTkUgYmFzaWMgaW50IHR5cGVzIFNUQVJUIGludDY0X3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV91aW50NjRfdCIgPSAieWVzIgotdGhlbiBBQ19NU0dfUkVTVUxUKC4uLiBzZWVuIGdvb2QgdWludDY0X3QpCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBzeXN0ZW0gaGVhZGVycyBoYXZlIGdvb2QgdWludDY0X3QgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLSNlbmRpZgotRU9GCi0KLWVsaWYgdGVzdCAiJGFjX2N2X3R5cGVfdV9pbnQ2NF90IiA9ICJ5ZXMiCi10aGVuIEFDX01TR19SRVNVTFQoLi5hZGRpbmcgdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3QpCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBzeXN0ZW0gaGVhZGVycyBoYXZlIGFuIHVfaW50NjRfdCAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotZWxzZSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nIGdlbmVyaWMgdWludDY0X3QgcnVudGltZSBjaGVja3MpCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSA2NCBCSVQgR0VORVJJQyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCi0jaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKLQotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXwotI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXwotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIF9faW50NjQgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX19NV0VSS1NfXyB8fCBkZWZpbmVkIF9fRUxGX18KLWRubCAvKiBub3RlOiBhbGwgRUxGLXN5c3RlbXMgc2VlbSB0byBoYXZlIGxvZmYtc3VwcG9ydCB3aGljaCBuZWVkcyA2NC1iaXQgKi8KLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCi0KLSNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi0jZW5kaWYKLSAgLyogY29tcGlsZXIvY3B1IHR5cGUgLi4uIG9yIGp1c3QgSVNPIEM5OSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotCi0jIHBsdXMgYSBkZWZhdWx0IDY0LWJpdCBmb3Igc3lzdGVtcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgNjQtYml0IHJlYWR5Ci0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIgaW4KLSAgICAxOjI6ODo4KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQsIG5vcm1hbCA2NC1iaXQgc3lzdGVtKQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiBub3JtYWwgNjQtYml0IHN5c3RlbSwgQ0MgaGFzIHNpemVvZihsb25nIGFuZCB2b2lkKikgPT0gOCBieXRlcyAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAxOjI6NDo4KSBBQ19NU0dfUkVTVUxUKC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQsIHR5cGVkZWYgdG8gbG9uZykKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0LCBDQyBoYXMgc2l6ZW9mKGxvbmcpID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjg6NCkgQUNfTVNHX1JFU1VMVCguLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0LCB0eXBlZGVmIGxvbmcgbG9uZykKLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gNjQtYml0IGRlcml2ZWQgZnJvbSBhIDMyLWJpdCwgQ0MgaGFzIHNpemVvZihsb25nKSA9PSA0IGJ5dGVzICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICopCi1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIE5PVEU6ICovCi0vKiB0aGUgY29uZmlndXJlLWNoZWNrcyBmb3IgdGhlIGJhc2ljIHR5cGVzIGRpZCBub3QgbWFrZSB1cyBiZWxpZXZlICovCi0vKiB0aGF0IHdlIGNvdWxkIGFkZCBhIGZhbGxiYWNrIHRvIGEgJ2xvbmcgbG9uZycgdHlwZWRlZiB0byBpbnQ2NF90ICovCi1FT0YKLSAgZXNhYwotZmkKLQotIyAtLS0tLS0tLS0tLS0tIERPTkUgaW50NjRfdCB0eXBlcyBTVEFSVCBpbnRwdHIgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFRSIFNFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1FT0YKLSAgY2FzZSAiJGFjX2N2X3NpemVvZl94OiRhY19jdl9zaXplb2Zfdm9pZHAiIGluCi0gIDE6MjoyKQotICAgIGE9ImludDE2X3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiAyIGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDE2LWJpdCAqLwotCi10eXBlZGVmIHVpbnQxNl90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDE2X3QgIGludHB0cl90OwotRU9GCi07OwotICAxOjI6NCkKLSAgICBhPSJpbnQzMl90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgNCBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCAzMi1iaXQgKi8KLQotdHlwZWRlZiB1aW50MzJfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQzMl90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgMToyOjgpCi0gICAgYT0iaW50NjRfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDggY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgNjQtYml0ICovCi0KLXR5cGVkZWYgdWludDY0X3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50NjRfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gICopCi0gICAgYT0ibG9uZyIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIGJ1dCBnb3Qgbm8gZ3Vlc3MsIGhlbmNlIHdlIGRlY2xhcmUgaXQgYXMgaWYgbG9uZyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwotdHlwZWRlZiAgICAgICAgICBsb25nICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgZXNhYwotQUNfTVNHX1JFU1VMVCguLmFkZGluZyB0eXBlZGVmICRhIGludHB0cl90KQotZmkKLQotIyAtLS0tLS0tLS0tLS0tIERPTkUgaW50cHRyIHR5cGVzIFNUQVJUIGludF9sZWFzdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiID0gIm5vIjsgdGhlbgotQUNfTVNHX1JFU1VMVCguLmFkZGluZyBnZW5lcmljIGludF9sZWFzdC10eXBlcykKLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tR0VORVJJQyBJTlRfTEVBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Ci10eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OwotI2VuZGlmCi1FT0YKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0gIm5vIjsgdGhlbgotQUNfTVNHX1JFU1VMVCguLmFkZGluZyBnZW5lcmljIGludF9mYXN0LXR5cGVzKQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9GQVNUIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmICBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmICBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwotI2VuZGlmCi0KLXR5cGVkZWYgdWludDhfdCAgIHVpbnRfZmFzdDhfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiBpbnQ2NF90ICAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGludCAgICAgICBpbnRtYXhfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotQUNfTVNHX1JFU1VMVCguLi4gRE9ORSAkYWNfc3RkaW50X2gpCi0gICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotICAvKiBvbmNlICovCi0jZW5kaWYKLSNlbmRpZgotRU9GCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NTE4OiAtMS0gQUNfREVGVU4oW0FYX1BSRUZJWF9DT05GSUdfSF0sIFtBQ19SRVFVSVJFKFtBQ19DT05GSUdfSEVBREVSXSkKLUFDX0NPTkZJR19DT01NQU5EUyhbaWZlbHNlKCQxLCwkUEFDS0FHRS1jb25maWcuaCwkMSldLFtkbmwKLUFTX1ZBUl9QVVNIREVGKFtfT1VUXSxbYWNfcHJlZml4X2NvbmZfT1VUXSlkbmwKLUFTX1ZBUl9QVVNIREVGKFtfREVGXSxbYWNfcHJlZml4X2NvbmZfREVGXSlkbmwKLUFTX1ZBUl9QVVNIREVGKFtfUEtHXSxbYWNfcHJlZml4X2NvbmZfUEtHXSlkbmwKLUFTX1ZBUl9QVVNIREVGKFtfTE9XXSxbYWNfcHJlZml4X2NvbmZfTE9XXSlkbmwKLUFTX1ZBUl9QVVNIREVGKFtfVVBQXSxbYWNfcHJlZml4X2NvbmZfVVBQXSlkbmwKLUFTX1ZBUl9QVVNIREVGKFtfSU5QXSxbYWNfcHJlZml4X2NvbmZfSU5QXSlkbmwKLW00X3B1c2hkZWYoW19zY3JpcHRdLFtjb25mdGVzdC5wcmVmaXhdKWRubAotbTRfcHVzaGRlZihbX3N5bWJvbF0sW200X2NyX0xldHRlcnNbXW00X2NyX2RpZ2l0c1tdX10pZG5sCi1fT1VUPWBlY2hvIGlmZWxzZSgkMSwgLCAkUEFDS0FHRS1jb25maWcuaCwgJDEpYAotX0RFRj1gZWNobyBfJF9PVVQgfCBzZWQgLWUgInk6bTRfY3JfbGV0dGVyczptNF9jcl9MRVRURVJTW106IiAtZSAicy9APDpAXm00X2NyX0xldHRlcnNAOj5AL18vZyJgCi1fUEtHPWBlY2hvIGlmZWxzZSgkMiwgLCAkUEFDS0FHRSwgJDIpYAotX0xPVz1gZWNobyBfJF9QS0cgfCBzZWQgLWUgInk6bTRfY3JfTEVUVEVSUy06bTRfY3JfbGV0dGVyc1tdXzoiYAotX1VQUD1gZWNobyAkX1BLRyB8IHNlZCAtZSAieTptNF9jcl9sZXR0ZXJzLTptNF9jcl9MRVRURVJTW11fOiIgIC1lICIvXkA8OkBtNF9jcl9kaWdpdHNAOj5AL3MvXi9fLyJgCi1fSU5QPWBlY2hvIGlmZWxzZSgkMywgLCBfLCAkMylgCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIl8kYWNfZmlsZSIgPSBfOiAmJiBjb250aW51ZQotICAgICB0ZXN0IC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiAmJiBjb250aW51ZQotICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAgICouaCkgdGVzdCAtZiAkYWNfZmlsZSAmJiBfSU5QPSRhY19maWxlIDs7Ci0gICAgICAgICopCi0gICAgIGVzYWMKLSAgIGRvbmUKLWZpCi1pZiB0ZXN0ICIkX0lOUCIgPSAiXyI7IHRoZW4KLSAgIGNhc2UgIiRfT1VUIiBpbgotICAgICAgKi8qKSBfSU5QPWBiYXNlbmFtZSAiJF9PVVQiYAotICAgICAgOzsKLSAgICAgICotKikgX0lOUD1gZWNobyAiJF9PVVQiIHwgc2VkIC1lICJzL0A8OkBfc3ltYm9sQDo+QCotLy8iYAotICAgICAgOzsKLSAgICAgICopIF9JTlA9Y29uZmlnLmgKLSAgICAgIDs7Ci0gICBlc2FjCi1maQotaWYgdGVzdCAteiAiJF9QS0ciIDsgdGhlbgotICAgQUNfTVNHX0VSUk9SKFtubyBwcmVmaXggZm9yIF9QUkVGSVhfUEtHX0NPTkZJR19IXSkKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICIkX0lOUCIgOyB0aGVuIGlmIHRlc3QgLWYgIiRzcmNkaXIvJF9JTlAiIDsgdGhlbgotICAgICBfSU5QPSIkc3JjZGlyLyRfSU5QIgotICBmaSBmaQotICBBQ19NU0dfTk9USUNFKGNyZWF0aW5nICRfT1VUIC0gcHJlZml4ICRfVVBQIGZvciAkX0lOUCBkZWZpbmVzKQotICBpZiB0ZXN0IC1mICRfSU5QIDsgdGhlbgotICAgIGVjaG8gInMvQCU6QHVuZGVmICAqXFwoQDw6QG00X2NyX0xFVFRFUlNbXV9AOj5AXFwpL0AlOkB1bmRlZiAkX1VQUCIiX1xcMS8iID4gX3NjcmlwdAotICAgICMgbm8hIHRoZXNlIGFyZSB0aGluZ3MgbGlrZSBzb2NrbGVuX3QsIGNvbnN0LCB2Zm9yawotICAgICMgZWNobyAicy9AJTpAdW5kZWYgICpcXChAPDpAbTRfY3JfbGV0dGVyc0A6PkBcXCkvQCU6QHVuZGVmICRfTE9XIiJfXFwxLyIgPj4gX3NjcmlwdAotICAgIGVjaG8gInMvQCU6QGRlZltdaW5lICAqXFwoQDw6QG00X2NyX0xFVFRFUlNbXV9AOj5AQDw6QF9zeW1ib2xAOj5AKlxcKVxcKC4qXFwpL0AlOkBpZm5kZWYgJF9VUFAiIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICBlY2hvICJAJTpAZGVmW11pbmUgJF9VUFAiIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgZWNobyAiQCU6QGVuZGlmLyIgPj5fc2NyaXB0Ci0gICAgIyBubyEgdGhlc2UgYXJlIHRoaW5ncyBsaWtlIHNvY2tsZW5fdCwgY29uc3QsIHZmb3JrCi0gICAgIyBlY2hvICJzL0AlOkBkZWZbXWluZSAgKlxcKEA8OkBtNF9jcl9sZXR0ZXJzQDo+QEA8OkBfc3ltYm9sQDo+QCpcXClcXCguKlxcKS9AJTpAaWZuZGVmICRfTE9XIiJfXFwxIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICJAJTpAZGVmaW5lICRfTE9XIiJfXFwxIFxcMiBcXCIgPj4gX3NjcmlwdAotICAgICMgZWNobyAiQCU6QGVuZGlmLyIgPj4gX3NjcmlwdAotICAgICMgbm93IGV4ZWN1dGluZyBfc2NyaXB0IG9uIF9ERUYgaW5wdXQgdG8gY3JlYXRlIF9PVVQgb3V0cHV0IGZpbGUKLSAgICBlY2hvICJAJTpAaWZuZGVmICRfREVGIiAgICAgID4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gIkAlOkBkZWZbXWluZSAkX0RFRiAxIiA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAnICcgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gLycqJyAkX09VVC4gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGNvbmZpZ3VyZS4gJyonLyA+PiR0bXAvcGNvbmZpZy5oCi0KLSAgICBzZWQgLWYgX3NjcmlwdCAkX0lOUCA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAnICcgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJy8qIG9uY2U6JyAkX0RFRiAnKi8nID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICJAJTpAZW5kaWYiID4+JHRtcC9wY29uZmlnLmgKLSAgICBpZiBjbXAgLXMgJF9PVVQgJHRtcC9wY29uZmlnLmggMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIEFDX01TR19OT1RJQ0UoWyRfT1VUIGlzIHVuY2hhbmdlZF0pCi0gICAgZWxzZQotICAgICAgYWNfZGlyPWBBU19ESVJOQU1FKFsiJF9PVVQiXSlgCi0gICAgICBBU19NS0RJUl9QKFsiJGFjX2RpciJdKQotICAgICAgcm0gLWYgIiRfT1VUIgotICAgICAgbXYgJHRtcC9wY29uZmlnLmggIiRfT1VUIgotICAgIGZpCi0gICAgY3AgX3NjcmlwdCBfY29uZmlncy5zZWQKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbaW5wdXQgZmlsZSAkX0lOUCBkb2VzIG5vdCBleGlzdCAtIHNraXAgZ2VuZXJhdGluZyAkX09VVF0pCi0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LioKLWZpCi1tNF9wb3BkZWYoW19zeW1ib2xdKWRubAotbTRfcG9wZGVmKFtfc2NyaXB0XSlkbmwKLUFTX1ZBUl9QT1BERUYoW19JTlBdKWRubAotQVNfVkFSX1BPUERFRihbX1VQUF0pZG5sCi1BU19WQVJfUE9QREVGKFtfTE9XXSlkbmwKLUFTX1ZBUl9QT1BERUYoW19QS0ddKWRubAotQVNfVkFSX1BPUERFRihbX0RFRl0pZG5sCi1BU19WQVJfUE9QREVGKFtfT1VUXSlkbmwKLV0sW1BBQ0tBR0U9IiRQQUNLQUdFIl0pXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjYyOTogLTEtIEFDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLCBbQUNfUkVRVUlSRShbX0FDX1BST0dfTElCVE9PTF0pZG5sCi1kbmwgSWYgQUNfUFJPR19DWFggaGFzIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuIEFDX0xJQlRPT0xfQ1hYCi1kbmwgaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIEFDX1BST0dfQ1hYLgotICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotICAgIFtBQ19MSUJUT09MX0NYWF0sCi0gICAgW2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0FDX0xJQlRPT0xfQ1hYCi0gIF0pXSkKLWRubCBBbmQgYSBzaW1pbGFyIHNldHVwIGZvciBGb3J0cmFuIDc3IHN1cHBvcnQKLSAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKLSAgICBbQUNfTElCVE9PTF9GNzddLAotICAgIFtkZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtBQ19MSUJUT09MX0Y3NwotXSldKQotCi1kbmwgUXVvdGUgQU1fUFJPR19HQ0ogc28gdGhhdCBhY2xvY2FsIGRvZXNuJ3QgYnJpbmcgaXQgaW4gbmVlZGxlc3NseS4KLWRubCBJZiBlaXRoZXIgQUNfUFJPR19HQ0ogb3IgQU1fUFJPR19HQ0ogaGF2ZSBhbHJlYWR5IGJlZW4gZXhwYW5kZWQsIHJ1bgotZG5sIEFDX0xJQlRPT0xfR0NKIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UsIGhvb2sgaXQgaW4gYXQgdGhlIGVuZCBvZiBib3RoLgotICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HQ0pdLAotICAgIFtBQ19MSUJUT09MX0dDSl0sCi0gICAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSwKLSAgICAgIFtBQ19MSUJUT09MX0dDSl0sCi0gICAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX0FDX1BST0dfR0NKXSwKLQlbQUNfTElCVE9PTF9HQ0pdLAotICAgICAgW2lmZGVmKFtBQ19QUk9HX0dDSl0sCi0JICAgICBbZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pCi0gICAgICAgaWZkZWYoW0FdW01fUFJPR19HQ0pdLAotCSAgICAgW2RlZmluZShbQV1bTV9QUk9HX0dDSl0sIGRlZm4oW0FdW01fUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSkKLSAgICAgICBpZmRlZihbTFRfQUNfUFJPR19HQ0pdLAotCSAgICAgW2RlZmluZShbTFRfQUNfUFJPR19HQ0pdLAotCQlkZWZuKFtMVF9BQ19QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKV0pXSkKLV0pXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY2NDogLTEtIEFDX0RFRlVOKFtfQUNfUFJPR19MSUJUT09MXSwgW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfQ1hYXSlkbmwKLUFDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0Y3N10pZG5sCi1BQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9HQ0pdKWRubAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgotZGVmaW5lKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2ODQ6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9TRVRVUF0sIFtBQ19QUkVSRVEoMi41MClkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLQotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSlkbmwKLSMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKLUFDX1JFUVVJUkUoW0FDX09CSkVYVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FWEVFWFRdKWRubAotZG5sCi0KLUFDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCi1BQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKLUFDX0xJQlRPT0xfT0JKRElSCi0KLUFDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAotX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLVtzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJ10KLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1bZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJ10KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucwotbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCi0KLSMgQ29uc3RhbnRzOgotcm09InJtIC1mIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLWx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLQotQUNfQ0hFQ0tfVE9PTChBUiwgYXIsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLUFDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQotCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCi10ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKLXRlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKLXRlc3QgLXogIiRMRCIgJiYgTEQ9bGQKLXRlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKLXRlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCi10ZXN0IC16ICIkTk0iICYmIE5NPW5tCi10ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi10ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgotdGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Ci10ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgotICAgIDs7Ci0gICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgICA7OwotICBlc2FjCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotZmkKLQotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotCi0jIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKLWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi1maWxlX21hZ2ljKikKLSAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgotICAgIEFDX1BBVEhfTUFHSUMKLSAgZmkKLSAgOzsKLWVzYWMKLQotQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfRExPUEVOXSwgZW5hYmxlX2Rsb3Blbj15ZXMsIGVuYWJsZV9kbG9wZW49bm8pCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9XSU4zMl9ETExdLAotZW5hYmxlX3dpbjMyX2RsbD15ZXMsIGVuYWJsZV93aW4zMl9kbGw9bm8pCi0KLUFDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKLQlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLUFDX0FSR19XSVRIKFtwaWNdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCi0JW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKLSAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCi0gICAgW3BpY19tb2RlPWRlZmF1bHRdKQotdGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0Ci0KLSMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Ci10YWduYW1lPQotQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCi1fTFRfQUNfVEFHQ09ORklHCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6ODI5OiAtMS0gQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdLCBbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo4NDY6IC0xLSBBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSwgW2ZvciBjY190ZW1wIGluICQxIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltbXFwvXV1jb21waWxlIHwgY2NhY2hlIHwgKltbXFwvXV1jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbW1xcL11dZGlzdGNjIHwgcHVyaWZ5IHwgKltbXFwvXV1wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00Ojg2MzogLTEtIEFDX0RFRlVOKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo4NzY6IC0xLSBBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo4OTM6IC0xLSBBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sIFtBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpXSxbXSkKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjkwNjogLTEtIEFDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0sIFtpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCi0JICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAotCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCi0kMQotQUNfRElWRVJUX1BPUAotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjkxOTogLTEtIEFDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sIFtfTFRfQUNfU0hFTExfSU5JVChbCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1jYXNlIFgkRUNITyBpbgotWCotLWZhbGxiYWNrLWVjaG8pCi0gICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCi0gIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXFskXVxcWyRdMCwnWyRdMCcsJ2AKLSAgOzsKLWVzYWMKLQotZWNobz0ke0VDSE8tZWNob30KLWlmIHRlc3QgIlhbJF0xIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICRTSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KLWZpCi0KLWlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi1bJF0qCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1pZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGApIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICA6Ci1lbHNlCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICBlY2hvPSIkZGlyL2VjaG8iCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCi0gICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCi0gICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCi0JIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgJXNcbicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKLQkgIHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KLSMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgotRUNITz0kZWNobwotaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKLWZpCi0KLUFDX1NVQlNUKEVDSE8pCi1dKV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxMDczOiAtMS0gQUNfREVGVU4oW19MVF9BQ19MT0NLXSwgW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKLQlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICRob3N0IGluCi1pYTY0LSotaHB1eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCi0gICAgKkVMRi0zMiopCi0gICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCi0gICAgICA7OwotICAgICpFTEYtNjQqKQotICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZWxzZQotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgZmkKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi14ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnxzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgotICAgICozMi1iaXQqKQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICB4ODZfNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCi0gICAgICAgICAgOzsKLSAgICAgICAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKLSAgICAgICAgICA7OwotICAgICAgICBzMzkweC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKLSAgICAgICAgICA7OwotICAgICAgICBzcGFyYzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICB4ODZfNjQtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKLSAgICAgICAgICA7OwotICAgICAgICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCi0gICAgICAgICAgOzsKLSAgICAgICAgczM5MCotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKLSAgICAgICAgICA7OwotICAgICAgICBzcGFyYyotKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19MQU5HX1BVU0goQykKLSAgICAgQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCi0gICAgIEFDX0xBTkdfUE9QXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgotICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OwotICAgICAgKikgICAgTEQ9IiR7TEQtbGR9IC02NCIgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci0gIF0pCi1lc2FjCi0KLW5lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTIxOTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pCi1BQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAotICBbJDI9bm8KLSAgaWZlbHNlKFskNF0sICwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dF0sIFthY19vdXRmaWxlPSQ0XSkKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSIkMyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgJDI9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotXSkKLQotaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KLSAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQotZWxzZQotICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjEyNjQ6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwgW0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCi0gIFskMj1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICQzIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgICQyPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICAkMj15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICAkcm0gY29uZnRlc3QqCi0gICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotXSkKLQotaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KLSAgICBpZmVsc2UoWyQ0XSwgLCA6LCBbJDRdKQotZWxzZQotICAgIGlmZWxzZShbJDVdLCAsIDosIFskNV0pCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjEyOTk6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi1BQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKLUFDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAotICBpPTAKLSAgdGVzdHN0cmluZz0iQUJDRCIKLQotICBjYXNlICRidWlsZF9vcyBpbgotICBtc2Rvc2RqZ3BwKikKLSAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCi0gICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgotICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCi0gICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAotICAgIDs7Ci0KLSAgZ251KikKLSAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKLSAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKLSAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgotICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCi0gICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQotICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KLSAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKLSAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgotICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQotICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcwotICAgIGZpCi0gICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgOzsKLQotICBpbnRlcml4KikKLSAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4Ci0gICAgOzsKLQotICBvc2YqKQotICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQotICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90Ci0gICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KLSAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKLSAgICAjCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KLSAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCi0gICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICBzY28zLjJ2NSopCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAotICAgIDs7Ci0gIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKLSAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbWyAJXV0vLydgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4Ci0gICAgZmkKLSAgICA7OwotICAqKQotICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCi0gICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKLSAgICAjIHdlIGNhbid0IHRlbGwuCi0gICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KLSAgICB3aGlsZSAodGVzdCAiWCJgJFNIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCi0JICAgICAgID0gIlhYJHRlc3RzdHJpbmciKSA+L2Rldi9udWxsIDI+JjEgJiYKLQkgICAgbmV3X3Jlc3VsdD1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAgJiYKLQkgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPSRuZXdfcmVzdWx0ICYmCi0JICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAotICAgIGRvCi0gICAgICBpPWBleHByICRpICsgMWAKLSAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZwotICAgIGRvbmUKLSAgICB0ZXN0c3RyaW5nPQotICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24gbWFzc2l2ZQotICAgICMgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBsaW5rZXIuCi0gICAgIyBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKLSAgICA7OwotICBlc2FjCi1dKQotaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTQxNDogLTEtIEFDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLCBbQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKWRubAotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjE0MjI6IC0xLSBBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sIFtBQ19SRVFVSVJFKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKWRubAotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBbJDRdCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotWyNsaW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKLSNlbHNlCi0jICBpZmRlZiBETF9HTE9CQUwKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRfRExMQVpZX09SX05PVwotIyAgaWZkZWYgUlRMRF9MQVpZCi0jICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKLSMgIGVsc2UKLSMgICAgaWZkZWYgRExfTEFaWQotIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCi0jICAgIGVsc2UKLSMgICAgICBpZmRlZiBSVExEX05PVwotIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICAgICBlbHNlCi0jICAgICAgICBpZmRlZiBETF9OT1cKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKLSNlbmRpZgotCi12b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9Ci1pbnQgbWFpbiAoKQotewotICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKLSAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247Ci0KLSAgaWYgKHNlbGYpCi0gICAgewotICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOwotICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCi0gICAgfQotICBlbHNlCi0gICAgcHV0cyAoZGxlcnJvciAoKSk7Ci0KLSAgICBleGl0IChzdGF0dXMpOwotfV0KLUVPRgotICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAotICAgIGx0X3N0YXR1cz0kPwotICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KLSAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7Ci0gICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKLSAgICBlc2FjCi0gIGVsc2UgOgotICAgICMgY29tcGlsYXRpb24gZmFpbGVkCi0gICAgJDMKLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTUxMjogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotICBsdF9jdl9kbG9wZW49bm8KLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBiZW9zKikKLSAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIDs7Ci0KLSAgbWluZ3cqIHwgcHczMiopCi0gICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgIDs7Ci0KLSAgY3lnd2luKikKLSAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgIDs7Ci0KLSAgZGFyd2luKikKLSAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKLSAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCi0JCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCi0gICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICAgIF0pCi0gICA7OwotCi0gICopCi0gICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAotCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKLSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCi0JICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdLAotCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAotCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAotCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKLQkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAotCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCi0JCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCi0JICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKLQkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdKQotCSAgICAgIF0pCi0JICAgIF0pCi0JICBdKQotCV0pCi0gICAgICBdKQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCi0gICAgZW5hYmxlX2Rsb3Blbj15ZXMKLSAgZWxzZQotICAgIGVuYWJsZV9kbG9wZW49bm8KLSAgZmkKLQotICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KLSAgZGxvcGVuKQotICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLSAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLQotICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCi0gICAgc2F2ZV9MSUJTPSIkTElCUyIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKLQkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCi0JICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCi0gICAgXSkKLQotICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgotICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi0gICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAotICAgIAkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAotCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQotICAgICAgXSkKLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTYyNjogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSwgW0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAotQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAotICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKLSAgW19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAotICAgJHJtIGNvbmZ0ZXN0KgotICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgotICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCi0gICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0Ci0gICBjZCAuLgotICAgcm1kaXIgY29uZnRlc3QKLSAgICRybSBjb25mdGVzdCoKLV0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTY3NzogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLCBbQUNfUkVRVUlSRShbX0xUX0FDX0xPQ0tdKWRubAotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCi0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjE3MDM6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdLCBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKLVtybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgbHRfY3Zfb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIGx0X2N2X29iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKLW9iamRpcj0kbHRfY3Zfb2JqZGlyCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MTcyMTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT0KLWlmIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSIgfHwgXAotICAgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwgXAotICAgdGVzdCAiWCRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCi0gICAgIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKLWZpCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCi0KLWlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNzYxOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sIFtzdHJpcGxpYj0KLW9sZF9zdHJpcGxpYj0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKLWlmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KLSAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKLSAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCi0gIEFDX01TR19SRVNVTFQoW3llc10pCi1lbHNlCi0jIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgZGFyd2luKikKLSAgICAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgotICAgICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKLSAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCi0gICAgICAgZWxzZQotICBBQ19NU0dfUkVTVUxUKFtub10pCi1maQotICAgICAgIDs7Ci0gICAqKQotICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgOzsKLSAgZXNhYwotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoxNzkxOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwgW0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpW1s0NV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJwotICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KLSAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KLSAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgotICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgotICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KLSAgICAgICAkcm0gXCRkbHBhdGgnCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiopCi0gICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IFtncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KLSAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5Ci0gICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKLSAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQotICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCi0gICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKLSAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gICAgICBlbHNlCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgICAgIGZpCi0gICAgICA7OwotICAgIHB3MzIqKQotICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbWzEyM11dKikgb2JqZm9ybWF0PWFvdXQgOzsKLSAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7Ci0gICAgZXNhYwotICBmaQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCi0gIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIHNocmV4dF9jbWRzPScuc28nCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgotICAgIGVsc2UKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKLSAgICBmaQotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICA7OwotICAgaHBwYSo2NCopCi0gICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICi0gICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKLSAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgICA7OwotICAgKikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIDs7Ci0gIGVzYWMKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pbnRlcml4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopCi0JaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotCQl2ZXJzaW9uX3R5cGU9bGludXgKLQllbHNlCi0JCXZlcnNpb25fdHlwZT1pcml4Ci0JZmkgOzsKLSAgZXNhYwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KLSAgICA7OwotICAqKQotICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQotICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCi0gICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKLSAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCi0gICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAotICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0KLSAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKLSAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskZHluYW1pY19saW5rZXJdKQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjIzOTE6IC0xLSBBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10sIFtBQ19BUkdfV0lUSChbdGFnc10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGFnc0A8OkA9VEFHU0A6PkBdLAotICAgICAgICBbaW5jbHVkZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIEA8OkBhdXRvbWF0aWNAOj5AXSldLAotICAgIFt0YWduYW1lcz0iJHdpdGh2YWwiXSkKLQotaWYgdGVzdCAtZiAiJGx0bWFpbiIgJiYgdGVzdCAtbiAiJHRhZ25hbWVzIjsgdGhlbgotICBpZiB0ZXN0ICEgLWYgIiR7b2ZpbGV9IjsgdGhlbgotICAgIEFDX01TR19XQVJOKFtvdXRwdXQgZmlsZSBgJG9maWxlJyBkb2VzIG5vdCBleGlzdF0pCi0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCi0gICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENDPSdgIgotICAgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgotICAgICAgQUNfTVNHX1dBUk4oW291dHB1dCBmaWxlIGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0XSkKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfV0FSTihbdXNpbmcgYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBgJG9maWxlJ10pCi0gICAgZmkKLSAgZmkKLSAgaWYgdGVzdCAteiAiJExUQ0ZMQUdTIjsgdGhlbgotICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDRkxBR1M9J2AiCi0gIGZpCi0KLSAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCi0gICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCi0gIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbWy1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAsL11dOjpnJ2AgaW4KLSAgICAiIikgOzsKLSAgICAqKSAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZV0pCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiR7b2ZpbGV9IiA+IC9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAgIEFDX01TR19FUlJPUihbdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzXSkKLSAgICBmaQotCi0gICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCi0gICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCi0KLSAgICAgIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAgIENYWCkKLQlpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotCSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKLQkgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCi0JICBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRwotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIEY3NykKLQlpZiB0ZXN0IC1uICIkRjc3IiAmJiB0ZXN0ICJYJEY3NyIgIT0gIlhubyI7IHRoZW4KLQkgIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCi0JZWxzZQotCSAgdGFnbmFtZT0iIgotCWZpCi0JOzsKLQotICAgICAgR0NKKQotCWlmIHRlc3QgLW4gIiRHQ0oiICYmIHRlc3QgIlgkR0NKIiAhPSAiWG5vIjsgdGhlbgotCSAgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBSQykKLQlBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCi0JOzsKLQotICAgICAgKikKLQlBQ19NU0dfRVJST1IoW1Vuc3VwcG9ydGVkIHRhZyBuYW1lOiAkdGFnbmFtZV0pCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KLSAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCi0gICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KLSAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgotICAgIGNobW9kICt4ICIkb2ZpbGUiCi0gIGVsc2UKLSAgICBybSAtZiAiJHtvZmlsZX1UIgotICAgIEFDX01TR19FUlJPUihbdW5hYmxlIHRvIHVwZGF0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMuXSkKLSAgZmkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjQ5NjogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjUwNDogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sIFtBQ19CRUZPUkUoWyQwXSwgW0FDX0xJQlRPT0xfU0VUVVBdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI1MTM6IC0xLSBBQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sIFtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKLSAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAotCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKLSAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSAgICAqKQotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zaGFyZWQ9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjXSwKLSAgICBbZW5hYmxlX3NoYXJlZD1dQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI1NDI6IC0xLSBBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NIQVJFRChubykKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNTUyOiAtMS0gQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLCBbZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoW3N0YXRpY10sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKLQlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCi0gICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OwotICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0gICAgKikKLSAgICAgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zdGF0aWM9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjXSwKLSAgICBbZW5hYmxlX3N0YXRpYz1dQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI1ODE6IC0xLSBBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NUQVRJQyhubykKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNTkxOiAtMS0gQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCi0gICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKLSAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKLSAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSAgICAqKQotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjXSwKLSAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI2MjA6IC0xLSBBQ19ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubykKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyNjMwOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1waWNfbW9kZT1pZmVsc2UoJCMsMSwkMSxkZWZhdWx0KQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI2NTQ6IC0xLSBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKLUFDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKLVtjYXNlICRNQUdJQ19DTUQgaW4KLVtbXFwvKl0gfCAgPzpbXFwvXSpdKQotICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0qKQotICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1kbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KLWRubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKLWRubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCi0gIGFjX2R1bW15PSJpZmVsc2UoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhY10pCi1NQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLWlmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjcxNzogLTEtIEFDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSwgW0FDX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQotaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgQUNfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQotICBlbHNlCi0gICAgTUFHSUNfQ01EPToKLSAgZmkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjczMjogLTEtIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW0FDX0FSR19XSVRIKFtnbnUtbGRdLAotICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCi0JW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCi0gICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCi0gICAgW3dpdGhfZ251X2xkPW5vXSkKLUFDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5ICRDQ10pCi0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQotICAgICAgcmVfZGlyZWx0PScvW1teL11dW1teL11dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0gICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JOzsKLSAgICAgICopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi1lbHNlCi0gIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19QUk9HX0xEX0dOVQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjI4MTY6IC0xLSBBQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdLCBbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCi1BQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCi1jYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotKkdOVSogfCAqJ3dpdGggQkZEJyopCi0gIGx0X2N2X3Byb2dfZ251X2xkPXllcwotICA7OwotKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KLSAgOzsKLWVzYWNdKQotd2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MjgzNjogLTEtIEFDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzXSwKLSAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWcsCi0gIFtsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInXSkKLXJlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZwotY2FzZSAkcmVsb2FkX2ZsYWcgaW4KLSIiIHwgIiAiKikgOzsKLSopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OwotZXNhYwotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotY2FzZSAkaG9zdF9vcyBpbgotICBkYXJ3aW4qKQotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZWxzZQotICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotICAgIGZpCi0gICAgOzsKLWVzYWMKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDoyODYyOiAtMS0gQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwgW0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXNdLAotbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCi1bbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCi1sdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KLWx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJwotIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0Ci0jIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCi0jICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KLSMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgotIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgotIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgotIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAotIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KLSMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQotIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4NCogfCBhaXg1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYmVvcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJzZGlbWzQ1XV0qKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJwotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICA7OwotCi1jeWd3aW4qKQotICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKLSAgOzsKLQotbWluZ3cqIHwgcHczMiopCi0gICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKLSAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICBpKjg2ICkKLSAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCi0gICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgotICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGZpCi0gIDs7Ci0KLWdudSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhwdXgxMC4yMCogfCBocHV4MTEqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbwotICAgIDs7Ci0gIGhwcGEqNjQqKQotICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XSddCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXS5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1pbnRlcml4MyopCi0gICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkTEQgaW4KLSAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OwotICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1uZXRic2QqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKLSAgZmkKLSAgOzsKLQotbmV3b3M2KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbwotICA7OwotCi1udG8tcW54KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgotICA7OwotCi1vcGVuYnNkKikKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfFwuc298X3BpY1wuYSkkJwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKLSAgZmkKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zb2xhcmlzKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgbW90b3JvbGEpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgIDs7Ci0gIG5jcikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIHNlcXVlbnQpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICAgIDs7Ci0gIHNuaSkKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJwotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICAgIDs7Ci0gIHNpZW1lbnMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBwYykKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci1lc2FjCi1dKQotZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKLXRlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMwNDQ6IC0xLSBBQ19ERUZVTihbQUNfUFJPR19OTV0sIFtBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSwgbHRfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBsdF9jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuIAotICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCi0gIGZpCi0gIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbwotICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgotICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0JIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQotCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKLQkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCi0JICBicmVhawotCSAgOzsKLQkqKQotCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCi0JICAqL2Rldi9udWxsKikKLQkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKLQkgICAgYnJlYWsKLQkgICAgOzsKLQkgICopCi0JICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICBkb25lCi0gIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGx0X2N2X3BhdGhfTk0iCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzA5NjogLTEtIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUxJQk09Ci1jYXNlICRob3N0IGluCi0qLSotYmVvcyogfCAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQotICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKLSAgOzsKLSotbmNyLXN5c3Y0LjMqKQotICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKLSAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKLSAgOzsKLSopCi0gIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCi0gIDs7Ci1lc2FjCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzEyNTogLTEtIEFDX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgY2FzZSAkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPScke3RvcF9idWlsZGRpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi0gIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCi0gICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KLSAgSU5DTFRETD0iJExURExJTkNMIgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMxNTE6IC0xLSBBQ19ERUZVTihbQUNfTElCTFRETF9JTlNUQUxMQUJMRV0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBsdF9kbGluaXQsCi0gIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCi0gIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCi0gICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQotICAgZWxzZQotICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgotICAgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCi0gIGVsc2UKLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKLSAgICBMSUJMVERMPSItbGx0ZGwiCi0gICAgTFRETElOQ0w9Ci0gIGZpCi0gICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KLSAgSU5DTFRETD0iJExURExJTkNMIgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMxNzg6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbQUNfUkVRVUlSRShbX0xUX0FDX0xBTkdfQ1hYXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMTg1OiAtMS0gQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0sIFtBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCi1BQ19SRVFVSVJFKFtfTFRfQUNfUFJPR19DWFhDUFBdKQotX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUNYWF0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzE5MzogLTEtIEFDX0RFRlVOKFtfTFRfQUNfUFJPR19DWFhDUFBdLCBbCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCi1pZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotICBBQ19QUk9HX0NYWENQUAotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjA2OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0Y3N10pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzIxMzogLTEtIEFDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddLCBbQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKQotX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUY3N10pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzIyMjogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19HQ0pdKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMyMjk6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSwgW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sW10sCi0gIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sW10sCi0gICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sW10sCi0gICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQUNfUFJPR19HQ0pdKV0sCi0JIFtpZmRlZihbQV1bTV9QUk9HX0dDSl0sW0FDX1JFUVVJUkUoW0FdW01fUFJPR19HQ0pdKV0sCi0JICAgW0FDX1JFUVVJUkUoW0FdW0NfUFJPR19HQ0pfT1JfQV1bTV9QUk9HX0dDSl0pXSldKV0pXSldKQotX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUdDSl0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6MzI0MzogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfUkNdKQotX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfVJDXSkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjU0OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DX0NPTkZJR10pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDozMjU1OiAtMS0gQUNfREVGVU4oW19MVF9BQ19MQU5HX0NfQ09ORklHXSwgW2x0X3NhdmVfQ0M9IiRDQyIKLUFDX0xBTkdfUFVTSChDKQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9YwotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJwotCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi1BQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCi1BQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQotQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKLUFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi1BQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKLUFDX0xJQlRPT0xfRExPUEVOX1NFTEYKLQotIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0Ci1BQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1BQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi1BQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1BPUAotQ0M9IiRsdF9zYXZlX0NDIgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMzMzU6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLCBbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyhDWFgpXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjMzMzY6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sIFtBQ19MQU5HX1BVU0goQysrKQotQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQotQUNfUkVRVUlSRShbX0xUX0FDX1BST0dfQ1hYQ1BQXSkKLQotX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCi1fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKLV9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0KLV9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKT0KLV9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0KLV9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9Ci0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWNwcAotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwO1xuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9XG4nCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLV9MVF9BQ19TWVNfQ09NUElMRVIKLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLV9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0kQ0MKLWx0X3NhdmVfTEQ9JExECi1sdF9zYXZlX0dDQz0kR0NDCi1HQ0M9JEdYWAotbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKLWx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAotaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgotICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCi1maQotaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCi0gIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKLWVsc2UKLSAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKLWZpCi10ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAotQ0M9JHtDWFgtImMrKyJ9Ci1jb21waWxlcj0kQ0MKLV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKLSMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKLWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKLWVsc2UKLSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQotZmkKLQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KLQotICBBQ19QUk9HX0xECi0KLSAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCi0gICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KLSAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKLQlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGVsc2UKLSAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICBmaQotICBlbHNlCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICB3bGFyYz0KLQotICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCi0gICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKLSAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAotICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgotICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICBmaQotCi0gICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi1lbHNlCi0gIEdYWD1ubwotICB3aXRoX2dudV9sZD1ubwotICB3bGFyYz0KLWZpCi0KLSMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi1jYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBhaXg0KiB8IGFpeDUqKQotICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0gICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLSAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KLSAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0gICAgICBub19lbnRyeV9mbGFnPSIiCi0gICAgZWxzZQotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0gICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKLSAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQotICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXg1KikKLQlmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLQkgIGNhc2UgJGxkX2ZsYWcgaW4KLQkgICotYnJ0bCopCi0JICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0gICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgZmkKLQotICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKLSAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLQkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCWVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKLQkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0JICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0Jc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0Jc2hhcmVkX2ZsYWc9Jy1HJwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JZWxzZQotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcwotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKLSAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICBlbHNlCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKLSAgICAgIGVsc2UKLQkjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQlfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCi0JIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotCSMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgIGZpCi0gICAgZmkKLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0gICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIGZpCi0gICAgOzsKLQotICBjaG9ydXMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCi0KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQljcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICBlbHNlCi0JZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGZpfgotICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgIGVsc2UKLSAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICBmaQotICA7OwotICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLltbMDEyXV0pCi0gICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCi0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotICAgIGlmIHRlc3QgIiRHWFgiID0geWVzIDsgdGhlbgotICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KLSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8ICRFR1JFUCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCi0gICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBlbHNlCi0gICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgICAgZmkKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCi0gICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgZmkKLSAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgICAgOzsKLQotICBkZ3V4KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZWMrKyopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICBnaGN4KikKLQkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZnJlZWJzZFtbMTJdXSopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZSBzd2l0Y2ggdG8gRUxGCi0gICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgIDs7Ci0gIGZyZWVic2QtZWxmKikKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICA7OwotICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCi0gICAgIyBjb252ZW50aW9ucwotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgOzsKLSAgZ251KikKLSAgICA7OwotICBocHV4OSopCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkJCQkjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCSMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgIENDKikKLSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLSAgICBhQ0MqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0gICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgIwotICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLSAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLSAgICAgICMgZGVwZW5kZW5jaWVzLgotICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8IGdyZXAgIltbLV1dTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGhwdXgxMCp8aHB1eDExKikKLSAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKLSAgICAgICAgOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgaHBwYSo2NCp8aWE2NCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLSAgICAqKQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JCQkJCSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJCSAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICBhQ0MqKQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICBpYTY0KikKLQkgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCWVsc2UKLQkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgaW50ZXJpeDMqKQotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLSAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLSAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgIDs7Ci0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU0dJIEMrKwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcwotCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSMgaW4gdGhlIGFyY2hpdmUuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotCSAgZmkKLQlmaQotCV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotCTs7Ci0gICAgZXNhYwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgIDs7Ci0gIGxpbnV4KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCwkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIGljcGMqKQotCSMgSW50ZWwgQysrCi0Jd2l0aF9nbnVfbGQ9eWVzCi0JIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKLQkjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAotCSMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCi0JY2FzZSBgJENDIC1WIDI+JjFgIGluCi0JKiJWZXJzaW9uIDcuIiopCi0gIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICA7OwotCSopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCi0JICB0bXBfaWR5bj0KLQkgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKLQkgIGVzYWMKLSAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JZXNhYwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCTs7Ci0gICAgICBwZ0NDKikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKLSAgCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgICA7OwotICAgICAgY3h4KikKLQkjIENvbXBhcSBDKysKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJwotCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSMKLQkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JIyBkZXBlbmRlbmNpZXMuCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBseW54b3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBtODhrKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgOzsKLSAgbXZzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgY3h4KikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICBmaQotICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKLSAgICA7OwotICBvcGVuYnNkMiopCi0gICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICBvcGVuYnNkKikKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZmkKLSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICA7OwotICBvc2YzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJwotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgICBjeHgqKQotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBvc2Y0KiB8IG9zZjUqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgUkNDKikKLQkjIFJhdGlvbmFsIEMrKyAyLjQuMQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgY3h4KikKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KLQkgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIC1XbCwtaW5wdXQgLVdsLCRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24JJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgotCSAgJHJtICRsaWIuZXhwJwotCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkjCi0JIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSMgZGVwZW5kZW5jaWVzLgotCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBwc29zKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgOzsKLSAgc3Vub3M0KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU3VuIEMrKyA0LngKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgIGxjYyopCi0JIyBMdWNpZAotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgc29sYXJpcyopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsJDEpPXllcwotCV9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0JY2FzZSAkaG9zdF9vcyBpbgotCSAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLQkgICopCi0JICAgICMgVGhlIEMrKyBjb21waWxlciBpcyB1c2VkIGFzIGxpbmtlciBzbyB3ZSBtdXN0IHVzZSAkd2wKLQkgICAgIyBmbGFnIHRvIHBhc3MgdGhlIGNvbW1hbmRzIHRvIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQotCSAgICAjIGxpbmtlci4gV2UgbXVzdCBhbHNvIHBhc3MgZWFjaCBjb252aWVuY2UgbGlicmFyeSB0aHJvdWdoCi0JICAgICMgdG8gdGhlIHN5c3RlbSBsaW5rZXIgYmV0d2VlbiBhbGxleHRyYWN0L2RlZmF1bHRleHRyYWN0LgotCSAgICAjIFRoZSBDKysgY29tcGlsZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCi0JICAgICMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAotCSAgICAjIHdpdGhvdXQgJHdsLgotCSAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotCSAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKLQkgICAgOzsKLQllc2FjCi0JX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcwotCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSMgaW4gdGhlIGFyY2hpdmUuCi0JX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIGdjeCopCi0JIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0KLQkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KLQlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgICopCi0JIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKLQlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJwotCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgotCSAgZWxzZQotCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCi0JICAgICMgcGxhdGZvcm0uCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCi0JICBmaQotCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKLSAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKLSAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAjIGFzIC16IGRlZnMuCi0gICAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cwotICAgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCi0gICAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KLSAgICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgotICAgICMgU28gdGhhdCBiZWhhdmlvdXIgaXMgb25seSBlbmFibGVkIGlmIFNDT0FCU1BBVEggaXMgc2V0IHRvIGEKLSAgICAjIG5vbi1lbXB0eSB2YWx1ZSBpbiB0aGUgZW52aXJvbm1lbnQuICBNb3N0IGxpa2VseSBvbmx5IHVzZWZ1bCBmb3IKLSAgICAjIGNyZWF0aW5nIG9mZmljaWFsIGRpc3RyaWJ1dGlvbnMgb2YgcGFja2FnZXMuCi0gICAgIyBUaGlzIGlzIGEgaGFjayB1bnRpbCBsaWJ0b29sIG9mZmljaWFsbHkgc3VwcG9ydHMgYWJzb2x1dGUgcGF0aAotICAgICMgbmFtZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCi0gICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgdGFuZGVtKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgTkNDKikKLQkjIE5vblN0b3AtVVggTkNDIDMuMjAKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHZ4d29ya3MqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotICAqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSldKQotdGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi1fTFRfQUNfVEFHVkFSKEdDQywgJDEpPSIkR1hYIgotX0xUX0FDX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi0KLSMjIENBVkVBVCBFTVBUT1I6Ci0jIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUCgkMSkKLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCi1BQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQotQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKLUFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1BPUAotQ0M9JGx0X3NhdmVfQ0MKLUxEQ1hYPSRMRAotTEQ9JGx0X3NhdmVfTEQKLUdDQz0kbHRfc2F2ZV9HQ0MKLXdpdGhfZ251X2xkY3h4PSR3aXRoX2dudV9sZAotd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKLWx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKLWx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAotbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCi1sdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQzNDM6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0sIFsKLWRubCB3ZSBjYW4ndCB1c2UgdGhlIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSBoZXJlLAotZG5sIGJlY2F1c2UgaXQgY29udGFpbnMgY29kZSBpbnRlbmRlZCBmb3IgYW4gZXhlY3V0YWJsZSwKLWRubCBub3QgYSBsaWJyYXJ5LiAgSXQncyBwb3NzaWJsZSB3ZSBzaG91bGQgbGV0IGVhY2gKLWRubCB0YWcgZGVmaW5lIGEgbmV3IGx0Xz8/Pz9fbGlua190ZXN0X2NvZGUgdmFyaWFibGUsCi1kbmwgYnV0IGl0J3Mgb25seSB1c2VkIGhlcmUuLi4KLWlmZWxzZShbJDFdLFtdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi1pbnQgYTsKLXZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9Ci1FT0YKLV0sWyQxXSxbQ1hYXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotY2xhc3MgRm9vCi17Ci1wdWJsaWM6Ci0gIEZvbyAodm9pZCkgeyBhID0gMDsgfQotcHJpdmF0ZToKLSAgaW50IGE7Ci19OwotRU9GCi1dLFskMV0sW0Y3N10sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSAgICAgIHN1YnJvdXRpbmUgZm9vCi0gICAgICBpbXBsaWNpdCBub25lCi0gICAgICBpbnRlZ2VyKjQgYQotICAgICAgYT0wCi0gICAgICByZXR1cm4KLSAgICAgIGVuZAotRU9GCi1dLFskMV0sW0dDSl0sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXB1YmxpYyBjbGFzcyBmb28gewotICBwcml2YXRlIGludCBhOwotICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKLSAgICBhID0gMDsKLSAgfQotfTsKLUVPRgotXSkKLWRubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLWRubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQotICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KLQotICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCi0gICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgotICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCi0KLSAgIyBUaGUgYConIGluIHRoZSBjYXNlIG1hdGNoZXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYGNhc2UnIGluCi0gICMgJG91dHB1dF92ZXJib3NlX2NtZCBjYW4gdHJpZ2dlciBnbG9iIGV4cGFuc2lvbiBkdXJpbmcgdGhlIGxvb3AKLSAgIyBldmFsIHdpdGhvdXQgdGhpcyBzdWJzdGl0dXRpb24uCi0gIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWAkZWNobyAiWCRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCIgfCAkWHNlZCAtZSAiJG5vX2dsb2Jfc3Vic3QiYAotCi0gIGZvciBwIGluIGBldmFsICRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZGA7IGRvCi0gICAgY2FzZSAkcCBpbgotCi0gICAgLUwqIHwgLVIqIHwgLWwqKQotICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCi0gICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgotICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIFwKLQkgIHx8IHRlc3QgJHAgPSAiLVIiOyB0aGVuCi0JIHByZXY9JHAKLQkgY29udGludWUKLSAgICAgICBlbHNlCi0JIHByZXY9Ci0gICAgICAgZmkKLQotICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCi0JIGNhc2UgJHAgaW4KLQkgLUwqIHwgLVIqKQotCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQotCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQotCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgotCSAgIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIjsgdGhlbgotCSAgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtwcmV2fSR7cH0iCi0JICAgZWxzZQotCSAgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSAke3ByZXZ9JHtwfSIKLQkgICBmaQotCSAgIDs7Ci0JICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCi0JICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgotCSBlc2FjCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIjsgdGhlbgotCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtwcmV2fSR7cH0iCi0JIGVsc2UKLQkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7X0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpfSAke3ByZXZ9JHtwfSIKLQkgZmkKLSAgICAgICBmaQotICAgICAgIDs7Ci0KLSAgICAqLiRvYmpleHQpCi0gICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCi0gICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCi0gICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCi0JIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCi0JIGNvbnRpbnVlCi0gICAgICAgZmkKLQotICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCi0JIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCi0JICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKLQkgZWxzZQotCSAgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKLQkgZmkKLSAgICAgICBlbHNlCi0JIGlmIHRlc3QgLXogIiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgotCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgotCSBlbHNlCi0JICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCi0KLSAgICBlc2FjCi0gIGRvbmUKLQotICAjIENsZWFuIHVwLgotICBybSAtZiBhLm91dCBhLmV4ZQotZWxzZQotICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgotZmkKLQotJHJtIC1mIGNvbmZlc3QuJG9iamV4dAotCi0jIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgotaWZlbHNlKFskMV0sW0NYWF0sCi1bY2FzZSAkaG9zdF9vcyBpbgotaW50ZXJpeDMqKQotICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCi0gICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCi0gIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQotICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9Ci0gIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsJDEpPQotICA7OwotCi1zb2xhcmlzKikKLSAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgQ0MqKQotICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCi0gICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAotICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1sQ3N0ZCAtbENydW4nCi0gICAgOzsKLSAgZXNhYwotICA7OwotZXNhYwotXSkKLQotY2FzZSAiICRfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgotKiIgLWxjICIqKSBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKLWVzYWMKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo0NTAyOiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSwgW19MVF9BQ19MQU5HX0Y3N19DT05GSUcoRjc3KV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo0NTAzOiAtMS0gQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLCBbQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKQotQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCi0KLV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQotX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLV9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KLV9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCi1fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9ZgotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iICAgICAgc3Vicm91dGluZSB0XG4gICAgICByZXR1cm5cbiAgICAgIGVuZFxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIgICAgICBwcm9ncmFtIHRcbiAgICAgIGVuZFxuIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7Rjc3LSJmNzcifQotY29tcGlsZXI9JENDCi1fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLUFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKLUFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKLQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQotCi1fTFRfQUNfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgotX0xUX0FDX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi0KLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCi1BQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQotQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKLUFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCi0KLUFDX0xJQlRPT0xfQ09ORklHKCQxKQotCi1BQ19MQU5HX1BPUAotQ0M9IiRsdF9zYXZlX0NDIgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ2MDQ6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddLCBbX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyhHQ0opXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ2MDU6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10sIFtBQ19MQU5HX1NBVkUKLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWphdmEKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLV9MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfVxuJwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfQUNfU1lTX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7R0NKLSJnY2oifQotY29tcGlsZXI9JENDCi1fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KLV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCi1fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotCi0jIyBDQVZFQVQgRU1QVE9SOgotIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0jIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLUFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKCQxKQotQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKLUFDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCi1BQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQotQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi1BQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKLQotQUNfTElCVE9PTF9DT05GSUcoJDEpCi0KLUFDX0xBTkdfUkVTVE9SRQotQ0M9IiRsdF9zYXZlX0NDIgotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ2NjQ6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10sIFtfTFRfQUNfTEFOR19SQ19DT05GSUcoUkMpXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjQ2NjU6IC0xLSBBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwgW0FDX0xBTkdfU0FWRQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PXJjCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH1cbicKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotX0xUX0FDX1NZU19DT01QSUxFUgotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1DQz0ke1JDLSJ3aW5kcmVzIn0KLWNvbXBpbGVyPSRDQwotX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcwotCi1BQ19MSUJUT09MX0NPTkZJRygkMSkKLQotQUNfTEFOR19SRVNUT1JFCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NDcwOTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTkZJR10sIFsjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKENDLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoTEQsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihwb3N0aW5zdGFsbF9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIocG9zdHVuaW5zdGFsbF9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIFwKLSAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgXAotICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKSBcCi0gICAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKTsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCi0gICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIHwgXAotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJbJF0vWyRdMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1pZmVsc2UoWyQxXSwgW10sCi0gIFtjZmdmaWxlPSIke29maWxlfVQiCi0gIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gICRybSAtZiAiJGNmZ2ZpbGUiCi0gIEFDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pXSwKLSAgW2NmZ2ZpbGU9IiRvZmlsZSJdKQotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotaWZlbHNlKFskMV0sIFtdLAotWyMhICRTSEVMTAotCi0jIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6Ci0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KLVNFRD0kbHRfU0VECi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSIkU0VEIC1lIDFzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLSMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotYXZhaWxhYmxlX3RhZ3M9Ci0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHXSwKLVsjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKQotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKQotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kX0xUX0FDX1RBR1ZBUihHQ0MsICQxKQotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9bXV9MVF9BQ19UQUdWQVIoTEQsICQxKQotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKQotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKQotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKQotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKQotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKQotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfW11fTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9bXV9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwcmVkZXBzLCAkMSkKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfW11fTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKQotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKQotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKQotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKQotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKQotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRfTFRfQUNfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKSIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9bXV9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSkKLQotaWZlbHNlKFskMV0sW10sCi1bIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHXSwKLVsjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZV0pCi0KLV9fRU9GX18KLQotaWZlbHNlKFskMV0sW10sIFsKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQotCi0gIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwgXAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi1dKQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NTE5OTogLTEtIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19SRVFVSVJFKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSlkbmwKLQotX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKLSAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAotICAgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQotZmkKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo1MjE3OiAtMS0gQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSkKLUFDX1JFUVVJUkUoW0FDX09CSkVYVF0pCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0XSkKLUFDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sCi1bCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tbQkNERUdSU1RdXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1zeW1wYXQ9J1woW1tfQS1aYS16XV1bW19BLVphLXowLTldXSpcKScKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tbQkNEVF1dJwotICA7OwotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJwotICA7OwotaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJwotICBmaQotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICA7OwotbGludXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJwotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLSAgZmkKLSAgOzsKLWlyaXgqIHwgbm9uc3RvcHV4KikKLSAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJwotICA7Owotb3NmKikKLSAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbW0JEUlRdXScKLSAgOzsKLXNjbzMuMnY1KikKLSAgc3ltY29kZT0nW1tEVF1dJwotICA7Owotc3lzdjQuMnV3MiopCi0gIHN5bWNvZGU9J1tbRFRdXScKLSAgOzsKLXN5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gIHN5bWNvZGU9J1tbQUJEVF1dJwotICA7Owotc3lzdjQpCi0gIHN5bWNvZGU9J1tbREZOU1RVXV0nCi0gIDs7Ci1lc2FjCi0KLSMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgotb3B0X2NyPQotY2FzZSAkYnVpbGRfb3MgaW4KLW1pbmd3KikKLSAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotY2FzZSBgJE5NIC1WIDI+JjFgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Ci1lc2FjCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLSAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWyAJXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWyAJXV1bWyAJXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLQotICBybSAtZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Ci17Ci1FT0YKLQkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0JICAgIHBpcGVfd29ya3M9eWVzCi0JICBmaQotCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KLWZpCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQob2spCi1maQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjU0MTk6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KLV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KLQotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10pCi0gaWZlbHNlKFskMV0sW0NYWF0sWwotICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCi0gIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0gICAgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJwotICAgICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0gICAgKmRqZ3BwKikKLSAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotICAgICAgOzsKLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQk7OwotICAgICAgKikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0KiB8IGFpeDUqKQotCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JZWxzZQotCSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0JZmkKLQk7OwotICAgICAgY2hvcnVzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCWN4Y2g2OCopCi0JICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgIyBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAgZGFyd2luKikKLSAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgIHhsYyopCi0gICAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFub2NvbW1vbicKLSAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAgICAgIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgOzsKLSAgICAgIGRndXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBlYysrKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgOzsKLQkgIGdoY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLQkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCi0JOzsKLSAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KLQkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJwotCSAgICBmaQotCSAgICA7OwotCSAgYUNDKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqfGlhNjQqKQotCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKLQkgICAgICA7OwotCSAgICAqKQotCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGludGVyaXgqKQotCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQotCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KLQk7OwotICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLQkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBsaW51eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgICMgS0FJIEMrKyBDb21waWxlcgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JICAgIDs7Ci0JICBpY3BjKiB8IGVjcGMqKQotCSAgICAjIEludGVsIEMrKwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotCSAgICA7OwotCSAgcGdDQyopCi0JICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgQ29tcGFxIEMrKwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGx5bnhvcyopCi0JOzsKLSAgICAgIG04OGsqKQotCTs7Ci0gICAgICBtdnMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBjeHgqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIG5ldGJzZCopCi0JOzsKLSAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgS0NDKikKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJwotCSAgICA7OwotCSAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICA7OwotCSAgY3h4KikKLQkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKLQkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgcHNvcyopCi0JOzsKLSAgICAgIHNvbGFyaXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKLQkgICAgOzsKLQkgIGdjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzdW5vczQqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LngKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICA7OwotCSAgbGNjKikKLQkgICAgIyBMdWNpZAotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgdGFuZGVtKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgTkNDKikKLQkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHZ4d29ya3MqKQotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgZmkKLV0sCi1bCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgICAgOzsKLQotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCi0gICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KLSAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgotICAgICAgOzsKLQotICAgIG1zZG9zZGpncHAqKQotICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgICBkYXJ3aW4qKQotICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgeGxjKikKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFub2NvbW1vbicKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgICAgOzsKLSAgICAgICBlc2FjCi0gICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCi0JX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KLSAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKLQlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLV0pCi1BQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KLSAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSksCi0gICAgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKLSAgICBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKLSAgICAgZXNhY10sCi0gICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCi1maQotY2FzZSAkaG9zdF9vcyBpbgotICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKLSAgKmRqZ3BwKikKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0gICAgOzsKLSAgKikKLSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCi0gICAgOzsKLWVzYWMKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotd2w9JF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCi1BQ19MSUJUT09MX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwKLSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgJDEpLAotICAkbHRfdG1wX3N0YXRpY19mbGFnLAotICBbXSwKLSAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT1dKQotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjU5NDY6IC0xLSBBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1pZmVsc2UoWyQxXSxbQ1hYXSxbCi0gIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4NCogfCBhaXg1KikKLSAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KLSAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCi0gICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICAgZWxzZQotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLSAgICBmaQotICAgIDs7Ci0gIHB3MzIqKQotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKLSAgOzsKLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV0gL3MvLiogXChbW14gXV0qXCkvXDEgREFUQS87L14uKiBfX25tX18vcy9eLiogX19ubV9fXChbW14gXV0qXCkgW1teIF1dKi9cMSBEQVRBLzsvXkkgL2Q7L15bW0FJVFddXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgKikKLSAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICBlc2FjCi1dLFsKLSAgcnVucGF0aF92YXI9Ci0gIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KLSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCi0gIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLSAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi0gIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLSAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBfTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0gICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAotICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKLSAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90Ci0gICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgotICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgotICBleHRyYWN0X2V4cHN5bXNfY21kcz0KLSAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgotICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCi0gICAgICB3aXRoX2dudV9sZD1ubwotICAgIGZpCi0gICAgOzsKLSAgaW50ZXJpeCopCi0gICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKLSAgICB3aXRoX2dudV9sZD15ZXMKLSAgICA7OwotICBvcGVuYnNkKikKLSAgICB3aXRoX2dudV9sZD1ubwotICAgIDs7Ci0gIGVzYWMKLQotICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgICB3bGFyYz0nJHt3bH0nCi0KLSAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQotICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQotICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICBlbHNlCi0gIAlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCi0gICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLQotICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKLSAgICAgICMgdGhlbS4KLSAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKLSAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXSAvcy8uKiBcKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0JIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZWxzZQotCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWZpfgotCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaW50ZXJpeDMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLSAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KLSAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLSAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKLSAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKLSAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLSAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRtcF9hZGRmbGFnPQotCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgotCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKLQkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCi0JICA7OwotCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKLQkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OwotCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7Ci0JaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKLQkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7Ci0JZXNhYwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQotCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0gICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKLQlmaQotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJwotCXdsYXJjPQotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KLSAgICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMVtbMC01XV0uKikgCi0JX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKLQkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubzsgdGhlbgotICAgICAgcnVucGF0aF92YXI9Ci0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci0gICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCi0JIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0JIyBicm9rZW4gY29sbGVjdDIuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQllbHNlCi0JICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLSAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KLSAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotICAJICAgIGJyZWFrCi0gIAkgIGZpCi0JICBkb25lCi0JICA7OwotCWVzYWMKLQotCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgZmkKLQotICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgotICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bwotICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKLSAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCi0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLSAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLSAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0gIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBlbHNlCi0gIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLSAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAotICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0gIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0gIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLQllbHNlCi0JICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JICBlbHNlCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKLSAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwotICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLSAgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotCSBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCi0JICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKLQkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLQkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KLSAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBic2RpW1s0NV1dKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCi0gICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIF9MVF9BQ19UQUdWQVIoZml4X3NyY2ZpbGVfcGF0aCwgJDEpPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKLSAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuW1swMTJdXSkKLSAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgZXNhYwotICAgICAgICAgZmkKLSAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCi0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KLSAgICAJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgZWxzZQotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgeGxjKikKLSAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICA7OwotICAgICAgICopCi0gICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgICAgOzsKLQotICAgIGRndXgqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgZnJlZWJzZDEqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAgICMgZXh0cmEgc3BhY2UpLgotICAgIGZyZWVic2QyLjIqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gICAgZnJlZWJzZDIqKQotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgotICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBocHV4OSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQotICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgOzsKLQotICAgIGhwdXgxMCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0KLQkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4MTEqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCp8aWE2NCopCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0JICA7OwotCSopCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLQotCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0Ci0gICAgICBlbHNlCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIG5ld3NvczYpCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgb3BlbmJzZCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICBlbHNlCi0gICAgICAgY2FzZSAkaG9zdF9vcyBpbgotCSBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQotCSAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLQkgICA7OwotCSAqKQotCSAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQkgICA7OwotICAgICAgIGVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb3MyKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIDs7Ci0KLSAgICBvc2YzKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICA7OwotCi0gICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKLQotCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKLQlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogdGV4dCcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0Jd2xhcmM9JyR7d2x9JwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBlbHNlCi0Jd2xhcmM9JycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0gIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIF9MVF9BQ19UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyopCi0gICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLSAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi1dKQotQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSldKQotdGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQotCXBpY19mbGFnPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCi0gICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLSAgICAgICAgaWYgQUNfVFJZX0VWQUwoX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQotICAgICAgICB0aGVuCi0JICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgICAgZWxzZQotCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotICAgICAgICBmaQotICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2ODc2OiAtMS0gQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdLCBbCi0jIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KLSMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyAjaWZuZGVmIF9fQ1lHV0lOX18KLSMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCi0jICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jICMgIGVuZGlmCi0jICNlbmRpZgotIwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgZXh0ZXJuICJDIiB7Ci0jICNlbmRpZgotIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgfQotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fQ1lHV0lOX18KLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyAjZW5kaWYKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MTU6IC0xLSBBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0sIFtpZmVsc2UoWyQyXSwgW10sIFskMV0sIFskMV8kMl0pXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MTk6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgW0FDX1BST0dfTElCVE9PTF0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2OTIwOiAtMS0gQUNfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NjkyMTogLTEtIEFDX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MjI6IC0xLSBBQ19ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbQUNfRElTQUJMRV9TSEFSRUQoJEApXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MjM6IC0xLSBBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MjQ6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtBQ19QUk9HX0xEXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MjU6IC0xLSBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtBQ19QUk9HX05NXSkKLW00dHJhY2U6YWNpbmNsdWRlLm00OjY5MzA6IC0xLSBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwgbm8pCi0gIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgotICBBQ19TVUJTVChHQ0pGTEFHUykKLV0pCi1tNHRyYWNlOmFjaW5jbHVkZS5tNDo2OTM2OiAtMS0gQUNfREVGVU4oW0xUX0FDX1BST0dfUkNdLCBbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywgbm8pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6Njk1MDogLTEtIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCi1bIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCi0jIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLSAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgZmkKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLWx0X2FjX21heD0wCi1sdF9hY19jb3VudD0wCi0jIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcwotIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KLWZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbwotICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQotICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KLSAgbHRfYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KLSAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGJyZWFrCi0gIGZpCi0gIHdoaWxlIHRydWU7IGRvCi0gICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKLSAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KLSAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAotICAgIGVjaG8gPj5jb25mdGVzdC5ubAotICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCi0gICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhawotICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KLSAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKLSAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKLSAgICBmaQotICBkb25lCi1kb25lCi1dKQotU0VEPSRsdF9jdl9wYXRoX1NFRAotQUNfTVNHX1JFU1VMVChbJFNFRF0pCi1dKQotbTR0cmFjZTphY2luY2x1ZGUubTQ6NzAyNTogLTEtIEFDX0RFRlVOKFtBTV9QQVRIX0xJQkdDUllQVF0sIFsgQUNfQVJHX1dJVEgobGliZ2NyeXB0LXByZWZpeCwKLSAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZ2NyeXB0LXByZWZpeD1QRlhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBMSUJHQ1JZUFQgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKLSAgICAgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgbGliZ2NyeXB0X2NvbmZpZ19wcmVmaXg9IiIpCi0gIGlmIHRlc3QgeCRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgotICAgICBpZiB0ZXN0IHgke0xJQkdDUllQVF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgotICAgICAgICBMSUJHQ1JZUFRfQ09ORklHPSRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeC9iaW4vbGliZ2NyeXB0LWNvbmZpZwotICAgICBmaQotICBmaQotCi0gIEFDX1BBVEhfUFJPRyhMSUJHQ1JZUFRfQ09ORklHLCBsaWJnY3J5cHQtY29uZmlnLCBubykKLSAgdG1wPWlmZWxzZShbJDFdLCAsMToxLjIuMCwkMSkKLSAgaWYgZWNobyAiJHRtcCIgfCBncmVwICc6JyA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgotICAgICByZXFfbGliZ2NyeXB0X2FwaT1gZWNobyAiJHRtcCIgICAgIHwgc2VkICdzL1woLipcKTpcKC4qXCkvXDEvJ2AKLSAgICAgbWluX2xpYmdjcnlwdF92ZXJzaW9uPWBlY2hvICIkdG1wIiB8IHNlZCAncy9cKC4qXCk6XCguKlwpL1wyLydgCi0gIGVsc2UKLSAgICAgcmVxX2xpYmdjcnlwdF9hcGk9MAotICAgICBtaW5fbGliZ2NyeXB0X3ZlcnNpb249IiR0bXAiCi0gIGZpCi0KLSAgQUNfTVNHX0NIRUNLSU5HKGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49ICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24pCi0gIG9rPW5vCi0gIGlmIHRlc3QgIiRMSUJHQ1JZUFRfQ09ORklHIiAhPSAibm8iIDsgdGhlbgotICAgIHJlcV9tYWpvcj1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDEvJ2AKLSAgICByZXFfbWlub3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wyLydgCi0gICAgcmVxX21pY3JvPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMy8nYAotICAgIGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbj1gJExJQkdDUllQVF9DT05GSUcgLS12ZXJzaW9uYAotICAgIG1ham9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS4qL1wxLydgCi0gICAgbWlub3I9YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpLiovXDIvJ2AKLSAgICBtaWNybz1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMy8nYAotICAgIGlmIHRlc3QgIiRtYWpvciIgLWd0ICIkcmVxX21ham9yIjsgdGhlbgotICAgICAgICBvaz15ZXMKLSAgICBlbHNlIAotICAgICAgICBpZiB0ZXN0ICIkbWFqb3IiIC1lcSAiJHJlcV9tYWpvciI7IHRoZW4KLSAgICAgICAgICAgIGlmIHRlc3QgIiRtaW5vciIgLWd0ICIkcmVxX21pbm9yIjsgdGhlbgotICAgICAgICAgICAgICAgb2s9eWVzCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBpZiB0ZXN0ICIkbWlub3IiIC1lcSAiJHJlcV9taW5vciI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkbWljcm8iIC1nZSAiJHJlcV9taWNybyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgIG9rPXllcwotICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgotICAgIEFDX01TR19SRVNVTFQoW3llcyAoJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbildKQotICBlbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLSAgZmkKLSAgaWYgdGVzdCAkb2sgPSB5ZXM7IHRoZW4KLSAgICAgIyBJZiB3ZSBoYXZlIGEgcmVjZW50IGxpYmdjcnlwdCwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUKLSAgICAgIyBBUEkgaXMgY29tcGF0aWJsZQotICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1ndCAwIDsgdGhlbgotICAgICAgICB0bXA9YCRMSUJHQ1JZUFRfQ09ORklHIC0tYXBpLXZlcnNpb24gMj4vZGV2L251bGwgfHwgZWNobyAwYAotICAgICAgICBpZiB0ZXN0ICIkdG1wIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtMSUJHQ1JZUFQgQVBJIHZlcnNpb25dKQotICAgICAgICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1lcSAiJHRtcCIgOyB0aGVuCi0gICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbb2theV0pCi0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBvaz1ubwotICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW2RvZXMgbm90IG1hdGNoLiB3YW50PSRyZXFfbGliZ2NyeXB0X2FwaSBnb3Q9JHRtcF0pCi0gICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgTElCR0NSWVBUX0NGTEFHUz1gJExJQkdDUllQVF9DT05GSUcgLS1jZmxhZ3NgCi0gICAgTElCR0NSWVBUX0xJQlM9YCRMSUJHQ1JZUFRfQ09ORklHIC0tbGlic2AKLSAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQotICBlbHNlCi0gICAgTElCR0NSWVBUX0NGTEFHUz0iIgotICAgIExJQkdDUllQVF9MSUJTPSIiCi0gICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKLSAgZmkKLSAgQUNfU1VCU1QoTElCR0NSWVBUX0NGTEFHUykKLSAgQUNfU1VCU1QoTElCR0NSWVBUX0xJQlMpCi1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteXz9BW0NIVU1dX10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW19BQ19dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteTElCT0JKUyRdLCBbZG8gbm90IHVzZSBMSUJPQkpTIGRpcmVjdGx5LCB1c2UgQUNfTElCT0JKIChzZWUgc2VjdGlvbiBgQUNfTElCT0JKIHZzIExJQk9CSlMnXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVNfRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbXl8/bTRfXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbXmRubCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteXz9BU19dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSEVMTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQVRIX1NFUEFSQVRPUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX05BTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9UQVJOQU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVkVSU0lPTiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1NUUklORyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX0JVR1JFUE9SVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1VSTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15leGVjX3ByZWZpeCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wcmVmaXgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15iaW5kaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2JpbmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15saWJleGVjZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmRhdGFyb290ZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmRhdGFkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec3lzY29uZmRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zaGFyZWRzdGF0ZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15sb2NhbHN0YXRlZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluY2x1ZGVkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteb2xkaW5jbHVkZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15kb2NkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaW5mb2RpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15odG1sZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmR2aWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wZGZkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecHNkaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebGliZGlyJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmxvY2FsZWRpciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15tYW5kaXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9OQU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVEFSTkFNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1ZFUlNJT04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9TVFJJTkckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9CVUdSRVBPUlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9VUkwkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteREVGUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FQ0hPX0MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUNIT19OJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVDSE9fVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkX2FsaWFzJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfYWxpYXMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtedGFyZ2V0X2FsaWFzJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fSU5JVF9BVVRPTUFLRShbTGliVk5DU2VydmVyXSwgWzAuOS45XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMS42XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fQVVUT0NPTkZfVkVSU0lPTihbMi42OV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfUFJPR1JBTSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15JTlNUQUxMX1NDUklQVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15JTlNUQUxMX0RBVEEkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2lzcmMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWUdQQVRIX1ckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15WRVJTSU9OJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwgW10sIFtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTItIF9BTV9NQU5HTEVfT1BUSU9OKFtuby1kZWZpbmVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlZFUlNJT04kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9TQU5JVFlfQ0hFQ0sKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9NSVNTSU5HX1BST0coW0FDTE9DQUxdLCBbYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX01JU1NJTkdfSEFTX1JVTgotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIEFNX0FVWF9ESVJfRVhQQU5ECi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFDTE9DQUwkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9NSVNTSU5HX1BST0coW0FVVE9DT05GXSwgW2F1dG9jb25mXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVVUT0NPTkYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9NSVNTSU5HX1BST0coW0FVVE9NQUtFXSwgW2F1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFVVE9NQUtFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fTUlTU0lOR19QUk9HKFtBVVRPSEVBREVSXSwgW2F1dG9oZWFkZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPSEVBREVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fTUlTU0lOR19QUk9HKFtNQUtFSU5GT10sIFttYWtlaW5mb10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk1BS0VJTkZPJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fUFJPR19JTlNUQUxMX1NICi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluc3RhbGxfc2gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1RSSVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSU5TVEFMTF9TVFJJUF9QUk9HUkFNJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gQU1fUFJPR19NS0RJUl9QCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk1LRElSX1AkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebWtkaXJfcCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BV0skXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0VUX01BS0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBBTV9TRVRfTEVBRElOR19ET1QKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2xlYWRpbmdfZG90JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAotCQkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTItIF9BTV9NQU5HTEVfT1BUSU9OKFt0YXItdXN0YXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIF9BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sIFtfQU1fUFJPR19UQVIoW3Y3XSldKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTItIF9BTV9NQU5HTEVfT1BUSU9OKFt0YXItcGF4XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fUFJPR19UQVIoW3Y3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1UQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX3RhciRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fdW50YXIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0xLSBfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCBbXSwgW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAotCQkJICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMi0gX0FNX01BTkdMRV9PUFRJT04oW25vLWRlcGVuZGVuY2llc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozOiAtMS0gX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM6IC0yLSBfQU1fTUFOR0xFX09QVElPTihbc2lsZW50LXJ1bGVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBBTV9TSUxFTlRfUlVMRVMoW3llc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX1YkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBBTV9TVUJTVF9OT1RNQUtFKFtBTV9WXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1fVl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX0RFRkFVTFRfViRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIEFNX1NVQlNUX05PVE1BS0UoW0FNX0RFRkFVTFRfVl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0FNX0RFRkFVTFRfVl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX0RFRkFVTFRfVkVSQk9TSVRZJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX0JBQ0tTTEFTSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTV9CQUNLU0xBU0hdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTogLTEtIEFNX0NPTkZJR19IRUFERVIoW3JmYmNvbmZpZy5oXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjU6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9DT05GSUdfSEVBREVSJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy91c3Ivc2hhcmUvYWNsb2NhbC0xLjExL2hlYWRlci5tNDoxMjogQU1fQ09ORklHX0hFQURFUiBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6NTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo2OiAtMS0gQVhfUFJFRklYX0NPTkZJR19IKFtyZmIvcmZiY29uZmlnLmhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTERGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFjX2N0X0NDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVYRUVYVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PQkpFWFQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBfQU1fREVQRU5ERU5DSUVTKFtDQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQU1fU0VUX0RFUERJUgotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ERVBESVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIEFNX01BS0VfSU5DTFVERQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9faW5jbHVkZSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fcXVvdGUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9ERVBfVFJBQ0sKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQU1ERVBfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUEJBQ0tTTEFTSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19ub2RlcCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fbm9kZXBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQ0RFUE1PREUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXBDQ10sIFsKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENDX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2Zhc3RkZXBDQ19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENDX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFthbV9fZmFzdGRlcENDX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQU1fUFJPR19DQ19DX08KLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk5PX01JTlVTX0NfTUlOVVNfTyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0VUX01BS0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE4OiAtMS0gQUNfTElCVE9PTF9XSU4zMl9ETEwKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MSUJUT09MCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9BQ19QUk9HX0xJQlRPT0wKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TRVRVUAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19FTkFCTEVfU0hBUkVECi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ2MjogQUNfQVJHX0VOQUJMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjUxMzogQUNfRU5BQkxFX1NIQVJFRCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0VOQUJMRV9TVEFUSUMKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyNTUyOiBBQ19FTkFCTEVfU1RBVElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0NjI6IEFDX0FSR19FTkFCTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjI1OTE6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkX2NwdSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfdmVuZG9yJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZF9vcyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF9jcHUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfdmVuZG9yJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ob3N0X29zJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BST0dfTEQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDgxOiBBQ19BUkdfV0lUSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjczMjogQUNfUFJPR19MRCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIExUX0FDX1BST0dfU0VECi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BST0dfTERfR05VCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BST0dfRUdSRVAKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdSRVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVHUkVQJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BST0dfTERfUkVMT0FEX0ZMQUcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19OTQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTE5fUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9PQkpESVIKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU0hFTExfSU5JVChbCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1jYXNlIFgkRUNITyBpbgotWCotLWZhbGxiYWNrLWVjaG8pCi0gICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCi0gIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXFskXVxcWyRdMCwnWyRdMCcsJ2AKLSAgOzsKLWVzYWMKLQotZWNobz0ke0VDSE8tZWNob30KLWlmIHRlc3QgIlhbJF0xIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICRTSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KLWZpCi0KLWlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi1bJF0qCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1pZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGApIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsCi0gICAgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICA6Ci1lbHNlCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICBlY2hvPSIkZGlyL2VjaG8iCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCi0gICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCi0gICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCi0JIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgJXNcbicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKLQkgIHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KLSMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgotRUNITz0kZWNobwotaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKLWZpCi0KLUFDX1NVQlNUKEVDSE8pCi1dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUNITyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlJBTkxJQiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1RSSVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19QQVRIX01BR0lDCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BBVEhfVE9PTF9QUkVGSVgoWyR7YWNfdG9vbF9wcmVmaXh9ZmlsZV0sIFsvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUEFUSF9UT09MX1BSRUZJWChbZmlsZV0sIFsvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDYyOiBBQ19BUkdfRU5BQkxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDgxOiBBQ19BUkdfV0lUSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfTEFOR19DX0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvYmpleHRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0xJTktFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSShbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zXSwgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCApIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyhbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0yLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCApIHdvcmtzXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzXSwgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCApaWZlbHNlKFtdLFtdLFsgLURQSUNdLFtpZmVsc2UoW10sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICkgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCApPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICkiIDs7Ci0gICAgIGVzYWNdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgKT0KLSAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICk9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgLi4uKTogc3VzcGljaW91cyBjYWNoZS1pZCwgbXVzdCBjb250YWluIF9jdl8gdG8gYmUgY2FjaGVkXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTIxOTogQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTU6IF9MVF9BQ19MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU0OiBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0yLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzXSwgWyRsdF90bXBfc3RhdGljX2ZsYWddLCBbXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICk9XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyNjQ6IEFDX0xJQlRPT0xfTElOS0VSX09QVElPTiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTQxOTogQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NTogX0xUX0FDX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTQ6IEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DQ19DX08oW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTQtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTQtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTQtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTQtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUyhbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xPQ0sKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0xJTksnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY4NzogQUNfVFJZX0xJTksgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MTA3MzogX0xUX0FDX0xPQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjE2Nzc6IEFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NTogX0xUX0FDX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTQ6IEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ETExUT09MJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteT0JKRFVNUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0xBTkdfQ09ORlRFU1Q6IG5vIEFDX0xBTkdfU09VUkNFIGNhbGwgZGV0ZWN0ZWQgaW4gYm9keV0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxOTM6IEFDX0xBTkdfQ09ORlRFU1QgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY2MTogX0FDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2Nzg6IEFDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo4OTM6IF9MVF9BQ19TWVNfTElCUEFUSF9BSVggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU5NDY6IEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMyNTU6IF9MVF9BQ19MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU0OiBBQ19MSUJUT09MX0xBTkdfQ19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19MQU5HX0NPTkZURVNUOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTkzOiBBQ19MQU5HX0NPTkZURVNUIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjE6IF9BQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjc4OiBBQ19MSU5LX0lGRUxTRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6ODkzOiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1OTQ2OiBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMjU1OiBfTFRfQUNfTEFOR19DX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzI1NDogQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZml4X3NyY2ZpbGVfcGF0aF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3JlbG9hZF9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUihbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3J1bnBhdGhfdmFyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9ETE9QRU5fU0VMRgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfQ0hFQ0tfRExGQ04KLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1REQ19IRUFERVJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0RMRkNOX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RSWV9ETE9QRU5fU0VMRihbbHRfY3ZfZGxvcGVuX3NlbGY9eWVzXSwgW2x0X2N2X2Rsb3Blbl9zZWxmPXllc10sIFtsdF9jdl9kbG9wZW5fc2VsZj1ub10sIFtsdF9jdl9kbG9wZW5fc2VsZj1jcm9zc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoW2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXNdLCBbbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllc10sIFtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm9dLCBbbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT05GSUcoW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0NDXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGluc3RhbGxfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0ODE6IEFDX0FSR19XSVRIIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW2JhY2sgcXVvdGVzIGFuZCBkb3VibGUgcXVvdGVzIG11c3Qgbm90IGJlIGVzY2FwZWQgaW46IHRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0c10sIFthY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19MQU5HX0NYWF9DT05GSUcoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWEZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MREZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFBGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1hYJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hY19jdF9DWFgkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0FNX0RFUEVOREVOQ0lFUyhbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWERFUE1PREUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwQ1hYXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2Zhc3RkZXBDWFhfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2Zhc3RkZXBDWFhfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19mYXN0ZGVwQ1hYX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2Zhc3RkZXBDWFhfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfUFJPR19DWFhDUFAKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWENQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1BQRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWENQUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvYmpleHRdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0xJTktFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX1BST0dfTEQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfUFJPR19MRF9HTlUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0xBTkdfQ09ORlRFU1Q6IG5vIEFDX0xBTkdfU09VUkNFIGNhbGwgZGV0ZWN0ZWQgaW4gYm9keV0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxOTM6IEFDX0xBTkdfQ09ORlRFU1QgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY2MTogX0FDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2Nzg6IEFDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo4OTM6IF9MVF9BQ19TWVNfTElCUEFUSF9BSVggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzY6IF9MVF9BQ19MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzU6IEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNjogX0xUX0FDX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MzMzNTogQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIENYWCkgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYXSwgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBDWFgpaWZlbHNlKFtDWFhdLFtdLFsgLURQSUNdLFtpZmVsc2UoW0NYWF0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIENYWCkgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBDWFgpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIENYWCkiIDs7Ci0gICAgIGVzYWNdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgQ1hYKT0KLSAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsIENYWCk9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyMTk6IEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM2OiBfTFRfQUNfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDozMzM1OiBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYXSwgWyRsdF90bXBfc3RhdGljX2ZsYWddLCBbXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzY6IF9MVF9BQ19MQU5HX0NYWF9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjMzMzU6IEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0yLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtydW5wYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT05GSUcoW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0NDXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGluc3RhbGxfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbR0NDXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0NYWF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4Y2x1ZGVfZXhwc3ltc10sIFtDWFhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbQ1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xBTkdfRjc3X0NPTkZJRyhbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkY3NyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRkZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MREZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15GNzckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFjX2N0X0Y3NyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvYmpleHRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19DT01QSUxFUgotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0xJTktFUl9CT0lMRVJQTEFURQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0dDQ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtMRF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEY3Nykgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3XSwgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBGNzcpaWZlbHNlKFtGNzddLFtdLFsgLURQSUNdLFtpZmVsc2UoW0Y3N10sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEY3NykgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBGNzcpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEY3NykiIDs7Ci0gICAgIGVzYWNdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgRjc3KT0KLSAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsIEY3Nyk9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzcsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyMTk6IEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NTAzOiBfTFRfQUNfTEFOR19GNzdfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NTAyOiBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3XSwgWyRsdF90bXBfc3RhdGljX2ZsYWddLCBbXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIEY3Nyk9XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3LCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDM6IF9MVF9BQ19MQU5HX0Y3N19DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ1MDI6IEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZml4X3NyY2ZpbGVfcGF0aF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3JlbG9hZF9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUihbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3J1bnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTkZJRyhbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbQ0NdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcF9vYmplY3RzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBfb2JqZWN0c10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RkZXBzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0aW5zdGFsbF9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3R1bmluc3RhbGxfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtHQ0NdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbTERdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2ZpeF9zcmNmaWxlX3BhdGhdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbRjc3XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0Y3N10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2luY2x1ZGVfZXhwc3ltc10sIFtGNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfTEFOR19HQ0pfQ09ORklHKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1NBVkUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTI1OiBBQ19MQU5HX1NBVkUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2JqZXh0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfQ09NUElMRVIKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnNdLCBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgR0NKKT0iJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsIEdDSikgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEdDSikgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKXSwgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBHQ0opaWZlbHNlKFtHQ0pdLFtdLFsgLURQSUNdLFtpZmVsc2UoW0dDSl0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEdDSikgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCBHQ0opPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsIEdDSikiIDs7Ci0gICAgIGVzYWNdLCBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgR0NKKT0KLSAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsIEdDSik9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0NBQ0hFX1ZBTChsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0osIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjEyMTk6IEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo1NDE5OiBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA1OiBfTFRfQUNfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0NjA0OiBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTItIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKXSwgWyRsdF90bXBfc3RhdGljX2ZsYWddLCBbXSwgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIEdDSik9XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX200X3dhcm4oW3N5bnRheF0sIFtBQ19DQUNIRV9WQUwobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoxMjY0OiBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04gaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU0MTk6IEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtNC0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfc3ltYm9sc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1NZU19MSUJQQVRIX0FJWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbc3ludGF4XSwgW0FDX0xBTkdfQ09ORlRFU1Q6IG5vIEFDX0xBTkdfU09VUkNFIGNhbGwgZGV0ZWN0ZWQgaW4gYm9keV0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxOTM6IEFDX0xBTkdfQ09ORlRFU1QgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY2MTogX0FDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2Nzg6IEFDX0xJTktfSUZFTFNFIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo4OTM6IF9MVF9BQ19TWVNfTElCUEFUSF9BSVggaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjU5NDY6IEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDU6IF9MVF9BQ19MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2MDQ6IEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyMzkxOiBfTFRfQUNfVEFHQ09ORklHIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2ODQ6IEFDX0xJQlRPT0xfU0VUVVAgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY2NDogX0FDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjI5OiBBQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjE5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtzeW50YXhdLCBbQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5XSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MzogQUNfTEFOR19DT05GVEVTVCBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYxOiBfQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY3ODogQUNfTElOS19JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00Ojg5MzogX0xUX0FDX1NZU19MSUJQQVRIX0FJWCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NTk0NjogQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtmaXhfc3JjZmlsZV9wYXRoXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2F1dG9tYXRpY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX21pbnVzX0xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcmVsb2FkX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9kaXJlY3RdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGlua19hbGxfZGVwbGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbGRfc2hsaWJzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xkX3NobGlic10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsZF9zaGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMi0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcnVucGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2FjdGlvbl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hY3Rpb25dLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ09ORklHKFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtDQ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtMRF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcF9vYmplY3RzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3ByZWRlcHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3RpbnN0YWxsX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdHVuaW5zdGFsbF9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaW5jbHVkZV9leHBzeW1zXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2NvbXBpbGVyXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0dDQ10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtMRF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2FyY2hpdmVfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBfb2JqZWN0c10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbm9fdW5kZWZpbmVkX2ZsYWddLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2RpcmVjdF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9taW51c19MXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYXV0b21hdGljXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2xpbmtfYWxsX2RlcGxpYnNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZml4X3NyY2ZpbGVfcGF0aF0sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X3N5bWJvbHNfY21kc10sIFtHQ0pdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbR0NKXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaW5jbHVkZV9leHBzeW1zXSwgW0dDSl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfUkVTVE9SRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMzQ6IEFDX0xBTkdfUkVTVE9SRSBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNTogX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDYwNDogQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIzOTE6IF9MVF9BQ19UQUdDT05GSUcgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjY4NDogQUNfTElCVE9PTF9TRVRVUCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NjY0OiBfQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2Mjk6IEFDX1BST0dfTElCVE9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6MTk6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19MQU5HX1JDX0NPTkZJRyhbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1NBVkUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTI1OiBBQ19MQU5HX1NBVkUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2NjU6IF9MVF9BQ19MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDY2NDogQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29iamV4dF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TWVNfQ09NUElMRVIKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9DT05GSUcoW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbY29tcGlsZXJdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtDQ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGluc3RhbGxfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW3Bvc3R1bmluc3RhbGxfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtub191bmRlZmluZWRfZmxhZ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9leHBzeW1fY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhjbHVkZV9leHBzeW1zXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaW5jbHVkZV9leHBzeW1zXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0dDQ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW0xEXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfcHJvZ19jb21waWxlcl93bF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtvbGRfYXJjaGl2ZV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbYXJjaGl2ZV9leHBzeW1fY21kc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW21vZHVsZV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbbW9kdWxlX2V4cHN5bV9jbWRzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcHJlZGVwX29iamVjdHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwb3N0ZGVwX29iamVjdHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtwcmVkZXBzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbcG9zdGRlcHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFthbGxvd191bmRlZmluZWRfZmxhZ10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW25vX3VuZGVmaW5lZF9mbGFnXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfYWN0aW9uXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfZGlyZWN0XSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbaGFyZGNvZGVfbWludXNfTF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtsaW5rX2FsbF9kZXBsaWJzXSwgW1JDXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX1RBR1ZBUihbZml4X3NyY2ZpbGVfcGF0aF0sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFtSQ10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19UQUdWQVIoW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtleGNsdWRlX2V4cHN5bXNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfVEFHVkFSKFtpbmNsdWRlX2V4cHN5bXNdLCBbUkNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1JFU1RPUkUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTM0OiBBQ19MQU5HX1JFU1RPUkUgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjQ2NjU6IF9MVF9BQ19MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDY2NDogQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjM5MTogX0xUX0FDX1RBR0NPTkZJRyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6Njg0OiBBQ19MSUJUT09MX1NFVFVQIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo2NjQ6IF9BQ19QUk9HX0xJQlRPT0wgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjYyOTogQUNfUFJPR19MSUJUT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzoxOTogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJUT09MJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIEFDX0xJQlRPT0xfQ1hYCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19MQU5HX0NYWAotbTR0cmFjZTpjb25maWd1cmUuYWM6MTk6IC0xLSBfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gQUNfTElCVE9PTF9GNzcKLW00dHJhY2U6Y29uZmlndXJlLmFjOjE5OiAtMS0gX0xUX0FDX0xBTkdfRjc3Ci1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTogLTEtIF9MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1GNzddKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVIkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFMTE9XMjRCUFAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXndpdGhfZmZtcGVnJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0OTogLTEtIEFNX0NPTkRJVElPTkFMKFtXSVRIX0ZGTVBFR10sIFt0ZXN0ICEgLXogIiR3aXRoX2ZmbXBlZyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9GRk1QRUdfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9GRk1QRUdfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQ5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfRkZNUEVHX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9GRk1QRUdfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTM6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9NUDNMQU1FXSwgW3Rlc3QgIiRIQVZFX01QM0xBTUUiID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTVAzTEFNRV9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX01QM0xBTUVfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTVAzTEFNRV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTVAzTEFNRV9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0NSWVBUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkNSWVBUJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUllQVF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJDUllQVE8kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEyMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNTTCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTI3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU1NMJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1NMX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlNTTF0sIFt0ZXN0ICEgLXogIiRTU0xfTElCUyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU1NMX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNTTF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU1NMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU1NMX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YTUtNRiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTM3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlhfRElTUExBWV9NSVNTSU5HJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEzNzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15YX1BSRV9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9FWFRSQV9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YMTEkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIyMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1hTSE0kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIyNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NPTEFSSVNfWFJFQURTQ1JFRU4kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjIzMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0lSSVhfWFJFQURESVNQTEFZJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMzU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9GQlBNJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNDE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9EUE1TJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNDY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YVEVTVEdSQUJDT05UUk9MJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YVEVTVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjU3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUkVDT1JEJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNjY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYVFJBUCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjcxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWFRSQVAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI4NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1hLRVlCT0FSRCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MjkyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWElORVJBTUEkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjI5OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlhSQU5EUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzA2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCWEZJWEVTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJYREFNQUdFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteWF9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9YMTFdLCBbdGVzdCAkSEFWRV9YMTEgIT0gImZhbHNlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9YMTFfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzM4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfWDExX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9YMTFfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzozMzg6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9YMTFfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzc4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElOVVhfVklERU9ERVZfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MzgyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElOVVhfRkJfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzg2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElOVVhfSU5QVVRfSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzg5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElOVVhfVUlOUFVUX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjM5NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX01BQ09TWF9OQVRJVkVfRElTUExBWSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Mzk5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTUFDT1NYX09QRU5HTF9IJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MjQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9BVkFISSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDI1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFWQUhJX0NGTEFHUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDI2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFWQUhJX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzMzogLTEtIEFNX0NPTkRJVElPTkFMKFtPU1hfT1BFTkdMXSwgW3Rlc3QgIiRIQVZFX01BQ09TWF9PUEVOR0xfSCIgPSAidHJ1ZSJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9TWF9PUEVOR0xfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk9TWF9PUEVOR0xfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjQzMzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtPU1hfT1BFTkdMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NDMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW09TWF9PUEVOR0xfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NTE2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTk6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSXSwgW3Rlc3QgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiA9ICJ4eWVzIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUxOTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MTk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjUzNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15KUEVHX0xERkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjU2MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkpQRUckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjYwMzogLTEtIF9tNF93YXJuKFtjcm9zc10sIFtBQ19SVU5fSUZFTFNFIGNhbGxlZCB3aXRob3V0IGRlZmF1bHQgdG8gYWxsb3cgY3Jvc3MgY29tcGlsaW5nXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI3NDg6IEFDX1JVTl9JRkVMU0UgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjYwMzogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo2NTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJQTkckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjcwMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlokXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQUQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQlBUSFJFQURdLCBbdGVzdCAhIC16ICIkSEFWRV9MSUJQVEhSRUFEIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJQVEhSRUFEX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBUSFJFQURfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczNTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBUSFJFQURfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MzU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJQVEhSRUFEX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjczODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1RMUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzQ5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NTE6IC0xLSBBTV9DT05ESVRJT05BTChbV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJdLCBbdGVzdCAiJHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ5ZXMiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc1MTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9XRUJTT0NLRVRTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBBTV9DT05ESVRJT05BTChbV0lUSF9XRUJTT0NLRVRTXSwgW3Rlc3QgIiR3aXRoX3dlYnNvY2tldHMiID0gInllcyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfV0VCU09DS0VUU19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9XRUJTT0NLRVRTX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjE6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9XRUJTT0NLRVRTX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzYxOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW1dJVEhfV0VCU09DS0VUU19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJaXSwgW3Rlc3QgISAteiAiJEhBVkVfWkxJQl9IIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJaX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlpfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2MzogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlpfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJaX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0xJQkpQRUddLCBbdGVzdCAhIC16ICIkSEFWRV9KUEVHTElCX0giXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQkpQRUdfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCSlBFR19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY0OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCSlBFR19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQkpQRUdfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6NzY1OiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCUE5HXSwgW3Rlc3QgISAteiAiJEhBVkVfUE5HTElCX0giXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlBOR19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3NjU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJQTkdfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBOR19UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc2NTogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX0xJQlBOR19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3ODg6IC0xLSBBTV9DT05ESVRJT05BTChbSEFWRV9MSUJTRExdLCBbdGVzdCAieCR3aXRoX3NkbCIgPSAieHllcyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCU0RMX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNETF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU0RMX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg4OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfTElCU0RMX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc4OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRExfQ0ZMQUdTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0RMX0xJQlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIFBLR19DSEVDS19NT0RVTEVTKFtHVEtdLCBbZ3RrKy0yLjBdLCBbXSwgWzpdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gUEtHX1BST0dfUEtHX0NPTkZJRwotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP1BLR19bQS1aX10rJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJRyhfKFBBVEh8TElCRElSfFNZU1JPT1RfRElSfEFMTE9XX1NZU1RFTV8oQ0ZMQUdTfExJQlMpKSk/JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJR18oRElTQUJMRV9VTklOU1RBTExFRHxUT1BfQlVJTERfRElSfERFQlVHX1NQRVcpJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUdfUEFUSCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUdfTElCRElSJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdUS19DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15HVEtfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk0OiAtMS0gUEtHX0NIRUNLX0VYSVNUUyhbZ3RrKy0yLjBdLCBbcGtnX2N2X1tdR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1bXWNmbGFncyAiZ3RrKy0yLjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgXSwgW3BrZ19mYWlsZWQ9eWVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIFBLR19DSEVDS19FWElTVFMoW2d0aystMi4wXSwgW3BrZ19jdl9bXUdUS19MSUJTPWAkUEtHX0NPTkZJRyAtLVtdbGlicyAiZ3RrKy0yLjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMgXSwgW3BrZ19mYWlsZWQ9eWVzXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5NDogLTEtIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfTElCR1RLXSwgW3Rlc3QgISAteiAiJEdUS19MSUJTIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJHVEtfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCR1RLX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo3OTU6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbSEFWRV9MSUJHVEtfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gQU1fQ09ORElUSU9OQUwoW01JTkdXXSwgW3Rlc3QgISAteiAiJE1JTkdXIiBdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXk1JTkdXX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjc5OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NSU5HV19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW01JTkdXX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgwNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XU09DS0xJQiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMS0gQU1fUEFUSF9MSUJHQ1JZUFQoWzEuNC4wXSwgW10sIFt3aXRoX2NsaWVudF9nY3J5cHQ9bm9dKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMi0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NzAyNTogQU1fUEFUSF9MSUJHQ1JZUFQgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjgxNDogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCR0NSWVBUX0NPTkZJRyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkdDUllQVF9DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgxNDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJHQ1JZUFRfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODE4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfQ0xJRU5UX0dDUllQVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gUEtHX0NIRUNLX01PRFVMRVMoW0dOVVRMU10sIFtnbnV0bHMgPj0gMi40LjBdLCBbXSwgWzpdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdOVVRMU19DRkxBR1MkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgyOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15HTlVUTFNfTElCUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gUEtHX0NIRUNLX0VYSVNUUyhbZ251dGxzID49IDIuNC4wXSwgW3BrZ19jdl9bXUdOVVRMU19DRkxBR1M9YCRQS0dfQ09ORklHIC0tW11jZmxhZ3MgImdudXRscyA+PSAyLjQuMCIgMj4vZGV2L251bGxgCi0JCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcyBdLCBbcGtnX2ZhaWxlZD15ZXNdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODI5OiAtMS0gUEtHX0NIRUNLX0VYSVNUUyhbZ251dGxzID49IDIuNC4wXSwgW3BrZ19jdl9bXUdOVVRMU19MSUJTPWAkUEtHX0NPTkZJRyAtLVtdbGlicyAiZ251dGxzID49IDIuNC4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzIF0sIFtwa2dfZmFpbGVkPXllc10pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4Mjk6IC0xLSBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIEFNX0NPTkRJVElPTkFMKFtIQVZFX0dOVVRMU10sIFt0ZXN0ICEgLXogIiRHTlVUTFNfTElCUyJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfR05VVExTX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0dOVVRMU19GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfR05VVExTX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODMzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0hBVkVfR05VVExTX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjgzNTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0dOVVRMUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODU4OiAtMi0gbTRfcGF0dGVybl9hbGxvdyhbXklQdjYkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg1OTogLTMtIG00X3BhdHRlcm5fYWxsb3coW15JUHY2JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NTk6IC0yLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfTElOSycgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjg3OiBBQ19UUllfTElOSyBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2xpYnMubTQ6OTk6IEFDX0NIRUNLX0xJQiBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODU5OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg1OTogLTItIG00X3BhdHRlcm5fYWxsb3coW15JUHY2JF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1REQ19IRUFERVJTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteY29uc3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XT1JEU19CSUdFTkRJQU4kXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zaXplX3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15USU1FX1dJVEhfU1lTX1RJTUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4NzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NZU19XQUlUX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4ODogLTEtIEFDX1RZUEVfU09DS0xFTl9UCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo4ODg6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCi1Zb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDoyOiBBQ19UWVBFX1NPQ0tMRU5fVCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODg4OiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg4ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zb2NrbGVuX3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0NSRUFURV9TVERJTlRfSChbcmZiL3JmYmludC5oXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKFtjaGFyXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfQ0hBUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoW3Nob3J0XSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfU0hPUlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKFtpbnRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgotWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjYxNDogQUNfVFJZX0NPTVBJTEUgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6MjA6IEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GIGlzIGV4cGFuZGVkIGZyb20uLi4KLWFjaW5jbHVkZS5tNDo0OTogQUNfQ1JFQVRFX1NURElOVF9IIGlzIGV4cGFuZGVkIGZyb20uLi4KLWNvbmZpZ3VyZS5hYzo4OTM6IHRoZSB0b3AgbGV2ZWxdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9JTlQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIEFDX0NPTVBJTEVfQ0hFQ0tfU0laRU9GKFtsb25nXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfTE9ORyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6ODkzOiAtMS0gQUNfQ09NUElMRV9DSEVDS19TSVpFT0YoW3ZvaWQqXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotYWNpbmNsdWRlLm00OjIwOiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRiBpcyBleHBhbmRlZCBmcm9tLi4uCi1hY2luY2x1ZGUubTQ6NDk6IEFDX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCi1jb25maWd1cmUuYWM6ODkzOiB0aGUgdG9wIGxldmVsXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSVpFT0ZfVk9JRFAkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjg5NDogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KLVlvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KLS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCi0uLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgotLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgotY29uZmlndXJlLmFjOjg5NDogdGhlIHRvcCBsZXZlbF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTkVFRF9JTkFERFJfVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTkskXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTA4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUckXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkwOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUUkZUSU1FJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MDk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVFJGVElNRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfVlBSSU5URiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfRE9QUk5UJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecGlkX3QkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1ZGT1JLX0gkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1dPUktJTkdfVkZPUkskXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW152Zm9yayRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTExOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfV09SS0lOR19GT1JLJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MTI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJOU0wkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNPQ0tFVCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTElCQ1lHSVBDJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBBTV9DT05ESVRJT05BTChbQ1lHSVBDXSwgW3Rlc3QgIiRIQVZFX0NZR0lQQyIgPSAidHJ1ZSJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNZR0lQQ19UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ1lHSVBDX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5Mjk6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQ1lHSVBDX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTI5OiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0NZR0lQQ19GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzI6IC0xLSBBTV9DT05ESVRJT05BTChbTElOVVhdLCBbdGVzdCAtZCAvdXNyL2luY2x1ZGUvbGludXhdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJTlVYX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSU5VWF9GQUxTRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0xJTlVYX1RSVUVdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTMyOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW0xJTlVYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIEFNX0NPTkRJVElPTkFMKFtPU1hdLCBbdGVzdCAiJEhBVkVfT1NYIiA9ICJ0cnVlIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteT1NYX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PU1hfRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjkzNjogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtPU1hfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5MzY6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbT1NYX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIEFNX0NPTkRJVElPTkFMKFtBTkRST0lEXSwgW3Rlc3QgIiRIQVZFX0FORFJPSUQiID0gInRydWUiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTkRST0lEX1RSVUUkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTkRST0lEX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NDA6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbQU5EUk9JRF9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MDogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtBTkRST0lEX0ZBTFNFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0FORFJPSUQkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk0OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FTk9FTlRfV09SS0FST1VORCRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYyOiAtMS0gQU1fQ09ORElUSU9OQUwoW0hBVkVfUlBNXSwgW3Rlc3QgIiRSUE1TT1VSQ0VESVIiICE9ICJOT1QtRk9VTkQiXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1JQTV9UUlVFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9SUE1fRkFMU0UkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MjogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1JQTV9UUlVFXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjk2MjogLTEtIF9BTV9TVUJTVF9OT1RNQUtFKFtIQVZFX1JQTV9GQUxTRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBBTV9DT05ESVRJT05BTChbV0lUSF9YMTFWTkNdLCBbdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteV0lUSF9YMTFWTkNfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTYzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldJVEhfWDExVk5DX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9YMTFWTkNfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzo5NjM6IC0xLSBfQU1fU1VCU1RfTk9UTUFLRShbV0lUSF9YMTFWTkNfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6OTY0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlJQTVNPVVJDRURJUiRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MVExJQk9CSlMkXSkKLW00dHJhY2U6Y29uZmlndXJlLmFjOjEwMTM6IC0xLSBBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19FWEVFWFRfVFJVRSRdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fRVhFRVhUX0ZBTFNFJF0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19FWEVFWFRfVFJVRV0pCi1tNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDEzOiAtMS0gX0FNX1NVQlNUX05PVE1BS0UoW2FtX19FWEVFWFRfRkFMU0VdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0soWyIkYWNfZmlsZSJdKQotbTR0cmFjZTpjb25maWd1cmUuYWM6MTAxMzogLTEtIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwpkaWZmIC0tZ2l0IGEvY2xpZW50X2V4YW1wbGVzLy5kZXBzL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuUG8gYi9jbGllbnRfZXhhbXBsZXMvLmRlcHMvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9jbGllbnRfZXhhbXBsZXMvLmRlcHMvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2NsaWVudF9leGFtcGxlcy8uZGVwcy9TREx2bmN2aWV3ZXItc2NyYXAuUG8gYi9jbGllbnRfZXhhbXBsZXMvLmRlcHMvU0RMdm5jdmlld2VyLXNjcmFwLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2NsaWVudF9leGFtcGxlcy8uZGVwcy9TREx2bmN2aWV3ZXItc2NyYXAuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9jbGllbnRfZXhhbXBsZXMvLmRlcHMvYmFja2NoYW5uZWwuUG8gYi9jbGllbnRfZXhhbXBsZXMvLmRlcHMvYmFja2NoYW5uZWwuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvY2xpZW50X2V4YW1wbGVzLy5kZXBzL2JhY2tjaGFubmVsLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvY2xpZW50X2V4YW1wbGVzLy5kZXBzL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuUG8gYi9jbGllbnRfZXhhbXBsZXMvLmRlcHMvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9jbGllbnRfZXhhbXBsZXMvLmRlcHMvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2NsaWVudF9leGFtcGxlcy8uZGVwcy9wcG10ZXN0LlBvIGIvY2xpZW50X2V4YW1wbGVzLy5kZXBzL3BwbXRlc3QuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvY2xpZW50X2V4YW1wbGVzLy5kZXBzL3BwbXRlc3QuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9jbGllbnRfZXhhbXBsZXMvLmRlcHMvdm5jMm1wZy12bmMybXBnLlBvIGIvY2xpZW50X2V4YW1wbGVzLy5kZXBzL3ZuYzJtcGctdm5jMm1wZy5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9jbGllbnRfZXhhbXBsZXMvLmRlcHMvdm5jMm1wZy12bmMybXBnLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIGIvY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTdhNTZlLi4wMDAwMDAwCi0tLSBhL2NsaWVudF9leGFtcGxlcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDY2NiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlLiAgR2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotCi0KLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0xpYlZOQ1NlcnZlcgotcGtnbGliZGlyID0gJChsaWJkaXIpL0xpYlZOQ1NlcnZlcgotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvTGliVk5DU2VydmVyCi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ob3N0X3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLW5vaW5zdF9QUk9HUkFNUyA9IHBwbXRlc3QkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzEpICQoYW1fX0VYRUVYVF8yKSBcCi0JJChhbV9fRVhFRVhUXzMpIGJhY2tjaGFubmVsJChFWEVFWFQpCi1zdWJkaXIgPSBjbGllbnRfZXhhbXBsZXMKLURJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci0jYW1fX0VYRUVYVF8xID0gU0RMdm5jdmlld2VyJChFWEVFWFQpCi0jYW1fX0VYRUVYVF8yID0gZ3Rrdm5jdmlld2VyJChFWEVFWFQpCi0jYW1fX0VYRUVYVF8zID0gdm5jMm1wZyQoRVhFRVhUKQotUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKLWFtX19TREx2bmN2aWV3ZXJfU09VUkNFU19ESVNUID0gU0RMdm5jdmlld2VyLmMgc2NyYXAuYyBzY3JhcC5oCi0jYW1fU0RMdm5jdmlld2VyX09CSkVDVFMgPSAgXAotIwlTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLiQoT0JKRVhUKSBcCi0jCVNETHZuY3ZpZXdlci1zY3JhcC4kKE9CSkVYVCkKLVNETHZuY3ZpZXdlcl9PQkpFQ1RTID0gJChhbV9TREx2bmN2aWV3ZXJfT0JKRUNUUykKLWFtX19ERVBFTkRFTkNJRVNfMSA9IC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLWFtX19ERVBFTkRFTkNJRVNfMiA9Ci0jU0RMdm5jdmlld2VyX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCi0jCSQoYW1fX0RFUEVOREVOQ0lFU18yKSAkKGFtX19ERVBFTkRFTkNJRVNfMikKLUFNX1ZfbHQgPSAkKGFtX192X2x0XyQoVikpCi1hbV9fdl9sdF8gPSAkKGFtX192X2x0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfbHRfMCA9IC0tc2lsZW50Ci1TREx2bmN2aWV3ZXJfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgXAotCSQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLWJhY2tjaGFubmVsX1NPVVJDRVMgPSBiYWNrY2hhbm5lbC5jCi1iYWNrY2hhbm5lbF9PQkpFQ1RTID0gYmFja2NoYW5uZWwuJChPQkpFWFQpCi1iYWNrY2hhbm5lbF9MREFERCA9ICQoTERBREQpCi1iYWNrY2hhbm5lbF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1hbV9fZ3Rrdm5jdmlld2VyX1NPVVJDRVNfRElTVCA9IGd0a3ZuY3ZpZXdlci5jCi0jYW1fZ3Rrdm5jdmlld2VyX09CSkVDVFMgPSAgXAotIwlndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLiQoT0JKRVhUKQotZ3Rrdm5jdmlld2VyX09CSkVDVFMgPSAkKGFtX2d0a3ZuY3ZpZXdlcl9PQkpFQ1RTKQotI2d0a3ZuY3ZpZXdlcl9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAotIwkkKGFtX19ERVBFTkRFTkNJRVNfMikKLWd0a3ZuY3ZpZXdlcl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChndGt2bmN2aWV3ZXJfQ0ZMQUdTKSBcCi0JJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotcHBtdGVzdF9TT1VSQ0VTID0gcHBtdGVzdC5jCi1wcG10ZXN0X09CSkVDVFMgPSBwcG10ZXN0LiQoT0JKRVhUKQotcHBtdGVzdF9MREFERCA9ICQoTERBREQpCi1wcG10ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLXZuYzJtcGdfU09VUkNFUyA9IHZuYzJtcGcuYwotdm5jMm1wZ19PQkpFQ1RTID0gdm5jMm1wZy12bmMybXBnLiQoT0JKRVhUKQotI3ZuYzJtcGdfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKLSMJJChGRk1QRUdfSE9NRSkvbGliYXZmb3JtYXQvbGliYXZmb3JtYXQuYSBcCi0jCSQoRkZNUEVHX0hPTUUpL2xpYmF2Y29kZWMvbGliYXZjb2RlYy5hIFwKLSMJJChhbV9fREVQRU5ERU5DSUVTXzIpCi12bmMybXBnX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKHZuYzJtcGdfQ0ZMQUdTKSBcCi0JJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotREVGQVVMVF9JTkNMVURFUyA9IC1JLiAtSSQodG9wX2J1aWxkZGlyKQotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLWFtX19tdiA9IG12IC1mCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCi0JJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCi0JJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfJChWKSkKLWFtX192X0NDXyA9ICQoYW1fX3ZfQ0NfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfYXRfMCA9IEAKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEXyQoVikpCi1hbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOXyQoVikpCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1TT1VSQ0VTID0gJChTREx2bmN2aWV3ZXJfU09VUkNFUykgYmFja2NoYW5uZWwuYyBcCi0JJChndGt2bmN2aWV3ZXJfU09VUkNFUykgcHBtdGVzdC5jIHZuYzJtcGcuYwotRElTVF9TT1VSQ0VTID0gJChhbV9fU0RMdm5jdmlld2VyX1NPVVJDRVNfRElTVCkgYmFja2NoYW5uZWwuYyBcCi0JJChhbV9fZ3Rrdm5jdmlld2VyX1NPVVJDRVNfRElTVCkgcHBtdGVzdC5jIHZuYzJtcGcuYwotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGFjbG9jYWwtMS4xMQotQU1UQVIgPSAkJHtUQVItdGFyfQotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSAwCi1BUiA9IC91c3IvYmluL2FyCi1BUyA9IGFzCi1BVVRPQ09ORiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvY29uZgotQVVUT0hFQURFUiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCi1BVVRPTUFLRSA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvbWFrZS0xLjExCi1BVkFISV9DRkxBR1MgPSAKLUFWQUhJX0xJQlMgPSAKLUFXSyA9IG1hd2sKLUNDID0gZ2NjCi1DQ0RFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNGTEFHUyA9IC1nIC1PMiAtV2FsbCAgCi1DUFAgPSBnY2MgLUUKLUNQUEZMQUdTID0gCi1DUllQVF9MSUJTID0gLWxjcnlwdAotQ1hYID0gZysrCi1DWFhDUFAgPSBnKysgLUUKLUNYWERFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNYWEZMQUdTID0gLWcgLU8yCi1DWUdQQVRIX1cgPSBlY2hvCi1ERUZTID0gLURIQVZFX0NPTkZJR19ICi1ERVBESVIgPSAuZGVwcwotRExMVE9PTCA9IGRsbHRvb2wKLUVDSE8gPSBlY2hvCi1FQ0hPX0MgPSAKLUVDSE9fTiA9IC1uCi1FQ0hPX1QgPSAKLUVHUkVQID0gL2Jpbi9ncmVwIC1FCi1FWEVFWFQgPSAKLUY3NyA9IAotRkZMQUdTID0gCi1HTlVUTFNfQ0ZMQUdTID0gCi1HTlVUTFNfTElCUyA9IAotR1JFUCA9IC9iaW4vZ3JlcAotR1RLX0NGTEFHUyA9IAotR1RLX0xJQlMgPSAKLUlOU1RBTEwgPSAvdXNyL2Jpbi9pbnN0YWxsIC1jCi1JTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAotSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jIC1zCi1KUEVHX0xERkxBR1MgPSAKLUxERkxBR1MgPSAKLUxJQkdDUllQVF9DRkxBR1MgPSAKLUxJQkdDUllQVF9DT05GSUcgPSBubwotTElCR0NSWVBUX0xJQlMgPSAKLUxJQk9CSlMgPSAKLUxJQlMgPSAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgIAotTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCi1MTl9TID0gbG4gLXMKLUxUTElCT0JKUyA9IAotTUFLRUlORk8gPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gbWFrZWluZm8KLU1LRElSX1AgPSAvYmluL21rZGlyIC1wCi1PQkpEVU1QID0gb2JqZHVtcAotT0JKRVhUID0gbwotUEFDS0FHRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9CVUdSRVBPUlQgPSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcgotUEFDS0FHRV9OQU1FID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX1NUUklORyA9IExpYlZOQ1NlcnZlciAwLjkuOQotUEFDS0FHRV9UQVJOQU1FID0gbGlidm5jc2VydmVyCi1QQUNLQUdFX1VSTCA9IAotUEFDS0FHRV9WRVJTSU9OID0gMC45LjkKLVBBVEhfU0VQQVJBVE9SID0gOgotUEtHX0NPTkZJRyA9IC91c3IvYmluL3BrZy1jb25maWcKLVBLR19DT05GSUdfTElCRElSID0gCi1QS0dfQ09ORklHX1BBVEggPSAKLVJBTkxJQiA9IHJhbmxpYgotUlBNU09VUkNFRElSID0gTk9ULUZPVU5ECi1TRExfQ0ZMQUdTID0gCi1TRExfTElCUyA9IAotU0VUX01BS0UgPSAKLVNIRUxMID0gL2Jpbi9iYXNoCi1TU0xfTElCUyA9IAotU1RSSVAgPSBzdHJpcAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyA9IAotVkVSU0lPTiA9IDAuOS45Ci1XU09DS0xJQiA9IAotWE1LTUYgPSAKLVhfQ0ZMQUdTID0gCi1YX0VYVFJBX0xJQlMgPSAKLVhfTElCUyA9IAotWF9QUkVfTElCUyA9ICAtbFNNIC1sSUNFCi1hYnNfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2NsaWVudF9leGFtcGxlcwotYWJzX3NyY2RpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvY2xpZW50X2V4YW1wbGVzCi1hYnNfdG9wX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hY19jdF9DQyA9IGdjYwotYWNfY3RfQ1hYID0gZysrCi1hY19jdF9GNzcgPSAKLWFtX19pbmNsdWRlID0gaW5jbHVkZQotYW1fX2xlYWRpbmdfZG90ID0gLgotYW1fX3F1b3RlID0gCi1hbV9fdGFyID0gJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciIKLWFtX191bnRhciA9ICQke1RBUi10YXJ9IHhmIC0KLWJpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2JpbgotYnVpbGQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX2FsaWFzID0gCi1idWlsZF9jcHUgPSB4ODZfNjQKLWJ1aWxkX29zID0gbGludXgtZ251Ci1idWlsZF92ZW5kb3IgPSB1bmtub3duCi1idWlsZGRpciA9IC4KLWRhdGFkaXIgPSAke2RhdGFyb290ZGlyfQotZGF0YXJvb3RkaXIgPSAke3ByZWZpeH0vc2hhcmUKLWRvY2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0KLWR2aWRpciA9ICR7ZG9jZGlyfQotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWhvc3QgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfYWxpYXMgPSAKLWhvc3RfY3B1ID0geDg2XzY0Ci1ob3N0X29zID0gbGludXgtZ251Ci1ob3N0X3ZlbmRvciA9IHVua25vd24KLWh0bWxkaXIgPSAke2RvY2Rpcn0KLWluY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQotaW5mb2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2luZm8KLWluc3RhbGxfc2ggPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2luc3RhbGwtc2gKLWxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgotbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWxvY2FsZWRpciA9ICR7ZGF0YXJvb3RkaXJ9L2xvY2FsZQotbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKLW1hbmRpciA9ICR7ZGF0YXJvb3RkaXJ9L21hbgotbWtkaXJfcCA9IC9iaW4vbWtkaXIgLXAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLXBkZmRpciA9ICR7ZG9jZGlyfQotcHJlZml4ID0gL3Vzci9sb2NhbAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMseCx4LAotcHNkaXIgPSAke2RvY2Rpcn0KLXNiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCi1zaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KLXNyY2RpciA9IC4KLXN5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCi10YXJnZXRfYWxpYXMgPSAKLXRvcF9idWlsZF9wcmVmaXggPSAuLi8KLXRvcF9idWlsZGRpciA9IC4uCi10b3Bfc3JjZGlyID0gLi4KLXdpdGhfZmZtcGVnID0gCi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKQotTERBREQgPSAuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhIAotI0ZGTVBFR19IT01FID0gCi0jI01QM0xBTUVfTElCID0gLWxtcDNsYW1lCi0jdm5jMm1wZ19DRkxBR1MgPSAtSSQoRkZNUEVHX0hPTUUpL2xpYmF2Zm9ybWF0IC1JJChGRk1QRUdfSE9NRSkvbGliYXZjb2RlYyAtSSQoRkZNUEVHX0hPTUUpL2xpYmF2dXRpbAotI3ZuYzJtcGdfTERBREQgPSAkKExEQUREKSAkKEZGTVBFR19IT01FKS9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC5hICQoRkZNUEVHX0hPTUUpL2xpYmF2Y29kZWMvbGliYXZjb2RlYy5hICQoTVAzTEFNRV9MSUIpIC1sbQotI0ZGTVBFR19DTElFTlQgPSB2bmMybXBnCi0jU0RMVklFV0VSID0gU0RMdm5jdmlld2VyCi0jU0RMdm5jdmlld2VyX0NGTEFHUyA9ICQoU0RMX0NGTEFHUykKLSNTREx2bmN2aWV3ZXJfU09VUkNFUyA9IFNETHZuY3ZpZXdlci5jIHNjcmFwLmMgc2NyYXAuaAotI1gxMV9MSUIgPSAtbFgxMQotCi0jIHRoYW5rcyB0byBhdXRvY29uZiwgdGhpcyBsb29rcyB1Z2x5Ci0jU0RMdm5jdmlld2VyX0xEQUREID0gJChMREFERCkgJChTRExfTElCUykgJChYMTFfTElCKQotI0dUS1ZJRVdFUiA9IGd0a3ZuY3ZpZXdlcgotI2d0a3ZuY3ZpZXdlcl9TT1VSQ0VTID0gZ3Rrdm5jdmlld2VyLmMKLSNndGt2bmN2aWV3ZXJfQ0ZMQUdTID0gJChHVEtfQ0ZMQUdTKQotI2d0a3ZuY3ZpZXdlcl9MREFERCA9ICQoTERBREQpICQoR1RLX0xJQlMpCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci1TREx2bmN2aWV3ZXIkKEVYRUVYVCk6ICQoU0RMdm5jdmlld2VyX09CSkVDVFMpICQoU0RMdm5jdmlld2VyX0RFUEVOREVOQ0lFUykgJChFWFRSQV9TREx2bmN2aWV3ZXJfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgU0RMdm5jdmlld2VyJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChTREx2bmN2aWV3ZXJfTElOSykgJChTREx2bmN2aWV3ZXJfT0JKRUNUUykgJChTREx2bmN2aWV3ZXJfTERBREQpICQoTElCUykKLWJhY2tjaGFubmVsJChFWEVFWFQpOiAkKGJhY2tjaGFubmVsX09CSkVDVFMpICQoYmFja2NoYW5uZWxfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2JhY2tjaGFubmVsX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGJhY2tjaGFubmVsJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGJhY2tjaGFubmVsX09CSkVDVFMpICQoYmFja2NoYW5uZWxfTERBREQpICQoTElCUykKLWd0a3ZuY3ZpZXdlciQoRVhFRVhUKTogJChndGt2bmN2aWV3ZXJfT0JKRUNUUykgJChndGt2bmN2aWV3ZXJfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2d0a3ZuY3ZpZXdlcl9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBndGt2bmN2aWV3ZXIkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKGd0a3ZuY3ZpZXdlcl9MSU5LKSAkKGd0a3ZuY3ZpZXdlcl9PQkpFQ1RTKSAkKGd0a3ZuY3ZpZXdlcl9MREFERCkgJChMSUJTKQotcHBtdGVzdCQoRVhFRVhUKTogJChwcG10ZXN0X09CSkVDVFMpICQocHBtdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcHBtdGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBwcG10ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKHBwbXRlc3RfT0JKRUNUUykgJChwcG10ZXN0X0xEQUREKSAkKExJQlMpCi12bmMybXBnJChFWEVFWFQpOiAkKHZuYzJtcGdfT0JKRUNUUykgJCh2bmMybXBnX0RFUEVOREVOQ0lFUykgJChFWFRSQV92bmMybXBnX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHZuYzJtcGckKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKHZuYzJtcGdfTElOSykgJCh2bmMybXBnX09CSkVDVFMpICQodm5jMm1wZ19MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1pbmNsdWRlIC4vJChERVBESVIpL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2JhY2tjaGFubmVsLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvcHBtdGVzdC5QbwotaW5jbHVkZSAuLyQoREVQRElSKS92bmMybXBnLXZuYzJtcGcuUG8KLQotLmMubzoKLQkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotLmMubG86Ci0JJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMVENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLVNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIubzogU0RMdm5jdmlld2VyLmMKLQkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1NVCBTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuVHBvIC1jIC1vIFNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIubyBgdGVzdCAtZiAnU0RMdm5jdmlld2VyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYFNETHZuY3ZpZXdlci5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5UcG8gJChERVBESVIpL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nU0RMdm5jdmlld2VyLmMnIG9iamVjdD0nU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vIGB0ZXN0IC1mICdTREx2bmN2aWV3ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgU0RMdm5jdmlld2VyLmMKLQotU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vYmo6IFNETHZuY3ZpZXdlci5jCi0JJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuVHBvIC1jIC1vIFNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIub2JqIGBpZiB0ZXN0IC1mICdTREx2bmN2aWV3ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdTREx2bmN2aWV3ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvU0RMdm5jdmlld2VyLmMnOyBmaWAKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLlRwbyAkKERFUERJUikvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSdTREx2bmN2aWV3ZXIuYycgb2JqZWN0PSdTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm9iaicgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIFNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIub2JqIGBpZiB0ZXN0IC1mICdTREx2bmN2aWV3ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdTREx2bmN2aWV3ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvU0RMdm5jdmlld2VyLmMnOyBmaWAKLQotU0RMdm5jdmlld2VyLXNjcmFwLm86IHNjcmFwLmMKLQkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1NVCBTREx2bmN2aWV3ZXItc2NyYXAubyAtTUQgLU1QIC1NRiAkKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlRwbyAtYyAtbyBTREx2bmN2aWV3ZXItc2NyYXAubyBgdGVzdCAtZiAnc2NyYXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2NyYXAuYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5UcG8gJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSdzY3JhcC5jJyBvYmplY3Q9J1NETHZuY3ZpZXdlci1zY3JhcC5vJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gU0RMdm5jdmlld2VyLXNjcmFwLm8gYHRlc3QgLWYgJ3NjcmFwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNjcmFwLmMKLQotU0RMdm5jdmlld2VyLXNjcmFwLm9iajogc2NyYXAuYwotCSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIFNETHZuY3ZpZXdlci1zY3JhcC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5UcG8gLWMgLW8gU0RMdm5jdmlld2VyLXNjcmFwLm9iaiBgaWYgdGVzdCAtZiAnc2NyYXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzY3JhcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zY3JhcC5jJzsgZmlgCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlRwbyAkKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9J3NjcmFwLmMnIG9iamVjdD0nU0RMdm5jdmlld2VyLXNjcmFwLm9iaicgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIFNETHZuY3ZpZXdlci1zY3JhcC5vYmogYGlmIHRlc3QgLWYgJ3NjcmFwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2NyYXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2NyYXAuYyc7IGZpYAotCi1ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm86IGd0a3ZuY3ZpZXdlci5jCi0JJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGd0a3ZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLlRwbyAtYyAtbyBndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm8gYHRlc3QgLWYgJ2d0a3ZuY3ZpZXdlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BndGt2bmN2aWV3ZXIuYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuVHBvICQoREVQRElSKS9ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9J2d0a3ZuY3ZpZXdlci5jJyBvYmplY3Q9J2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIubycgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3Rrdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIubyBgdGVzdCAtZiAnZ3Rrdm5jdmlld2VyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGd0a3ZuY3ZpZXdlci5jCi0KLWd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIub2JqOiBndGt2bmN2aWV3ZXIuYwotCSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChndGt2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLlRwbyAtYyAtbyBndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm9iaiBgaWYgdGVzdCAtZiAnZ3Rrdm5jdmlld2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3Rrdm5jdmlld2VyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2d0a3ZuY3ZpZXdlci5jJzsgZmlgCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5UcG8gJChERVBESVIpL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nZ3Rrdm5jdmlld2VyLmMnIG9iamVjdD0nZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vYmonIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGd0a3ZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm9iaiBgaWYgdGVzdCAtZiAnZ3Rrdm5jdmlld2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3Rrdm5jdmlld2VyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2d0a3ZuY3ZpZXdlci5jJzsgZmlgCi0KLXZuYzJtcGctdm5jMm1wZy5vOiB2bmMybXBnLmMKLQkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodm5jMm1wZ19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdm5jMm1wZy12bmMybXBnLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3ZuYzJtcGctdm5jMm1wZy5UcG8gLWMgLW8gdm5jMm1wZy12bmMybXBnLm8gYHRlc3QgLWYgJ3ZuYzJtcGcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdm5jMm1wZy5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlRwbyAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9J3ZuYzJtcGcuYycgb2JqZWN0PSd2bmMybXBnLXZuYzJtcGcubycgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodm5jMm1wZ19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2bmMybXBnLXZuYzJtcGcubyBgdGVzdCAtZiAndm5jMm1wZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2bmMybXBnLmMKLQotdm5jMm1wZy12bmMybXBnLm9iajogdm5jMm1wZy5jCi0JJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZuYzJtcGdfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHZuYzJtcGctdm5jMm1wZy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3ZuYzJtcGctdm5jMm1wZy5UcG8gLWMgLW8gdm5jMm1wZy12bmMybXBnLm9iaiBgaWYgdGVzdCAtZiAndm5jMm1wZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZuYzJtcGcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvdm5jMm1wZy5jJzsgZmlgCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlRwbyAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9J3ZuYzJtcGcuYycgb2JqZWN0PSd2bmMybXBnLXZuYzJtcGcub2JqJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2bmMybXBnX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHZuYzJtcGctdm5jMm1wZy5vYmogYGlmIHRlc3QgLWYgJ3ZuYzJtcGcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd2bmMybXBnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3ZuYzJtcGcuYyc7IGZpYAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKQotaW5zdGFsbGRpcnM6Ci1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCW1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKLQljbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCi0JZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCi0JaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAotCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAotCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCi0JbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAotCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQotCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2NsaWVudF9leGFtcGxlcy9NYWtlZmlsZS5hbSBiL2NsaWVudF9leGFtcGxlcy9NYWtlZmlsZS5hbQppbmRleCAyNzc5ZDUzLi45Y2IyYzMyIDEwMDY0NAotLS0gYS9jbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUuYW0KKysrIGIvY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlLmFtCkBAIC0xLDQgKzEsNCBAQAotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpCiBMREFERCA9IC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEgQFdTT0NLTElCQAogCiBpZiBXSVRIX0ZGTVBFRwpAQCAtMjAsMTIgKzIwLDggQEAKIFNETHZuY3ZpZXdlcl9DRkxBR1M9JChTRExfQ0ZMQUdTKQogU0RMdm5jdmlld2VyX1NPVVJDRVM9U0RMdm5jdmlld2VyLmMgc2NyYXAuYyBzY3JhcC5oCiAKLWlmIEhBVkVfWDExCi1YMTFfTElCPS1sWDExCi1lbmRpZgotCiAjIHRoYW5rcyB0byBhdXRvY29uZiwgdGhpcyBsb29rcyB1Z2x5Ci1TREx2bmN2aWV3ZXJfTERBREQ9JChMREFERCkgJChTRExfTElCUykgJChYMTFfTElCKQorU0RMdm5jdmlld2VyX0xEQUREPSQoTERBREQpICQoU0RMX0xJQlMpCiBlbmRpZgogCiBpZiBIQVZFX0xJQkdUSwpkaWZmIC0tZ2l0IGEvY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlLmluIGIvY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFjZDM4Li4wMDAwMDAwCi0tLSBhL2NsaWVudF9leGFtcGxlcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY2NiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLVZQQVRIID0gQHNyY2RpckAKLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1ub2luc3RfUFJPR1JBTVMgPSBwcG10ZXN0JChFWEVFWFQpICQoYW1fX0VYRUVYVF8xKSAkKGFtX19FWEVFWFRfMikgXAotCSQoYW1fX0VYRUVYVF8zKSBiYWNrY2hhbm5lbCQoRVhFRVhUKQotc3ViZGlyID0gY2xpZW50X2V4YW1wbGVzCi1ESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotQEhBVkVfTElCU0RMX1RSVUVAYW1fX0VYRUVYVF8xID0gU0RMdm5jdmlld2VyJChFWEVFWFQpCi1ASEFWRV9MSUJHVEtfVFJVRUBhbV9fRVhFRVhUXzIgPSBndGt2bmN2aWV3ZXIkKEVYRUVYVCkKLUBXSVRIX0ZGTVBFR19UUlVFQGFtX19FWEVFWFRfMyA9IHZuYzJtcGckKEVYRUVYVCkKLVBST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCi1hbV9fU0RMdm5jdmlld2VyX1NPVVJDRVNfRElTVCA9IFNETHZuY3ZpZXdlci5jIHNjcmFwLmMgc2NyYXAuaAotQEhBVkVfTElCU0RMX1RSVUVAYW1fU0RMdm5jdmlld2VyX09CSkVDVFMgPSAgXAotQEhBVkVfTElCU0RMX1RSVUVACVNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuJChPQkpFWFQpIFwKLUBIQVZFX0xJQlNETF9UUlVFQAlTREx2bmN2aWV3ZXItc2NyYXAuJChPQkpFWFQpCi1TREx2bmN2aWV3ZXJfT0JKRUNUUyA9ICQoYW1fU0RMdm5jdmlld2VyX09CSkVDVFMpCi1hbV9fREVQRU5ERU5DSUVTXzEgPSAuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1hbV9fREVQRU5ERU5DSUVTXzIgPQotQEhBVkVfTElCU0RMX1RSVUVAU0RMdm5jdmlld2VyX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCi1ASEFWRV9MSUJTRExfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzIpICQoYW1fX0RFUEVOREVOQ0lFU18yKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotU0RMdm5jdmlld2VyX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpIFwKLQkkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1iYWNrY2hhbm5lbF9TT1VSQ0VTID0gYmFja2NoYW5uZWwuYwotYmFja2NoYW5uZWxfT0JKRUNUUyA9IGJhY2tjaGFubmVsLiQoT0JKRVhUKQotYmFja2NoYW5uZWxfTERBREQgPSAkKExEQUREKQotYmFja2NoYW5uZWxfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYQotYW1fX2d0a3ZuY3ZpZXdlcl9TT1VSQ0VTX0RJU1QgPSBndGt2bmN2aWV3ZXIuYwotQEhBVkVfTElCR1RLX1RSVUVAYW1fZ3Rrdm5jdmlld2VyX09CSkVDVFMgPSAgXAotQEhBVkVfTElCR1RLX1RSVUVACWd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuJChPQkpFWFQpCi1ndGt2bmN2aWV3ZXJfT0JKRUNUUyA9ICQoYW1fZ3Rrdm5jdmlld2VyX09CSkVDVFMpCi1ASEFWRV9MSUJHVEtfVFJVRUBndGt2bmN2aWV3ZXJfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKLUBIQVZFX0xJQkdUS19UUlVFQAkkKGFtX19ERVBFTkRFTkNJRVNfMikKLWd0a3ZuY3ZpZXdlcl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChndGt2bmN2aWV3ZXJfQ0ZMQUdTKSBcCi0JJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotcHBtdGVzdF9TT1VSQ0VTID0gcHBtdGVzdC5jCi1wcG10ZXN0X09CSkVDVFMgPSBwcG10ZXN0LiQoT0JKRVhUKQotcHBtdGVzdF9MREFERCA9ICQoTERBREQpCi1wcG10ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLXZuYzJtcGdfU09VUkNFUyA9IHZuYzJtcGcuYwotdm5jMm1wZ19PQkpFQ1RTID0gdm5jMm1wZy12bmMybXBnLiQoT0JKRVhUKQotQFdJVEhfRkZNUEVHX1RSVUVAdm5jMm1wZ19ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAotQFdJVEhfRkZNUEVHX1RSVUVACSQoRkZNUEVHX0hPTUUpL2xpYmF2Zm9ybWF0L2xpYmF2Zm9ybWF0LmEgXAotQFdJVEhfRkZNUEVHX1RSVUVACSQoRkZNUEVHX0hPTUUpL2xpYmF2Y29kZWMvbGliYXZjb2RlYy5hIFwKLUBXSVRIX0ZGTVBFR19UUlVFQAkkKGFtX19ERVBFTkRFTkNJRVNfMikKLXZuYzJtcGdfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQodm5jMm1wZ19DRkxBR1MpIFwKLQkkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLWFtX19tdiA9IG12IC1mCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCi0JJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCi0JJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfQEFNX1ZAKQotYW1fX3ZfQ0NfID0gJChhbV9fdl9DQ19AQU1fREVGQVVMVF9WQCkKLWFtX192X0NDXzAgPSBAZWNobyAiICBDQyAgICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF9AQU1fVkApCi1hbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF9AQU1fREVGQVVMVF9WQCkKLWFtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLVNPVVJDRVMgPSAkKFNETHZuY3ZpZXdlcl9TT1VSQ0VTKSBiYWNrY2hhbm5lbC5jIFwKLQkkKGd0a3ZuY3ZpZXdlcl9TT1VSQ0VTKSBwcG10ZXN0LmMgdm5jMm1wZy5jCi1ESVNUX1NPVVJDRVMgPSAkKGFtX19TREx2bmN2aWV3ZXJfU09VUkNFU19ESVNUKSBiYWNrY2hhbm5lbC5jIFwKLQkkKGFtX19ndGt2bmN2aWV3ZXJfU09VUkNFU19ESVNUKSBwcG10ZXN0LmMgdm5jMm1wZy5jCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpCi1MREFERCA9IC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEgQFdTT0NLTElCQAotQFdJVEhfRkZNUEVHX1RSVUVARkZNUEVHX0hPTUUgPSBAd2l0aF9mZm1wZWdACi1ASEFWRV9NUDNMQU1FX1RSVUVAQFdJVEhfRkZNUEVHX1RSVUVATVAzTEFNRV9MSUIgPSAtbG1wM2xhbWUKLUBXSVRIX0ZGTVBFR19UUlVFQHZuYzJtcGdfQ0ZMQUdTID0gLUkkKEZGTVBFR19IT01FKS9saWJhdmZvcm1hdCAtSSQoRkZNUEVHX0hPTUUpL2xpYmF2Y29kZWMgLUkkKEZGTVBFR19IT01FKS9saWJhdnV0aWwKLUBXSVRIX0ZGTVBFR19UUlVFQHZuYzJtcGdfTERBREQgPSAkKExEQUREKSAkKEZGTVBFR19IT01FKS9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC5hICQoRkZNUEVHX0hPTUUpL2xpYmF2Y29kZWMvbGliYXZjb2RlYy5hICQoTVAzTEFNRV9MSUIpIC1sbQotQFdJVEhfRkZNUEVHX1RSVUVARkZNUEVHX0NMSUVOVCA9IHZuYzJtcGcKLUBIQVZFX0xJQlNETF9UUlVFQFNETFZJRVdFUiA9IFNETHZuY3ZpZXdlcgotQEhBVkVfTElCU0RMX1RSVUVAU0RMdm5jdmlld2VyX0NGTEFHUyA9ICQoU0RMX0NGTEFHUykKLUBIQVZFX0xJQlNETF9UUlVFQFNETHZuY3ZpZXdlcl9TT1VSQ0VTID0gU0RMdm5jdmlld2VyLmMgc2NyYXAuYyBzY3JhcC5oCi1ASEFWRV9MSUJTRExfVFJVRUBASEFWRV9YMTFfVFJVRUBYMTFfTElCID0gLWxYMTEKLQotIyB0aGFua3MgdG8gYXV0b2NvbmYsIHRoaXMgbG9va3MgdWdseQotQEhBVkVfTElCU0RMX1RSVUVAU0RMdm5jdmlld2VyX0xEQUREID0gJChMREFERCkgJChTRExfTElCUykgJChYMTFfTElCKQotQEhBVkVfTElCR1RLX1RSVUVAR1RLVklFV0VSID0gZ3Rrdm5jdmlld2VyCi1ASEFWRV9MSUJHVEtfVFJVRUBndGt2bmN2aWV3ZXJfU09VUkNFUyA9IGd0a3ZuY3ZpZXdlci5jCi1ASEFWRV9MSUJHVEtfVFJVRUBndGt2bmN2aWV3ZXJfQ0ZMQUdTID0gJChHVEtfQ0ZMQUdTKQotQEhBVkVfTElCR1RLX1RSVUVAZ3Rrdm5jdmlld2VyX0xEQUREID0gJChMREFERCkgJChHVEtfTElCUykKLWFsbDogYWxsLWFtCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCi0JICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLVNETHZuY3ZpZXdlciQoRVhFRVhUKTogJChTREx2bmN2aWV3ZXJfT0JKRUNUUykgJChTREx2bmN2aWV3ZXJfREVQRU5ERU5DSUVTKSAkKEVYVFJBX1NETHZuY3ZpZXdlcl9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBTREx2bmN2aWV3ZXIkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKFNETHZuY3ZpZXdlcl9MSU5LKSAkKFNETHZuY3ZpZXdlcl9PQkpFQ1RTKSAkKFNETHZuY3ZpZXdlcl9MREFERCkgJChMSUJTKQotYmFja2NoYW5uZWwkKEVYRUVYVCk6ICQoYmFja2NoYW5uZWxfT0JKRUNUUykgJChiYWNrY2hhbm5lbF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfYmFja2NoYW5uZWxfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYmFja2NoYW5uZWwkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoYmFja2NoYW5uZWxfT0JKRUNUUykgJChiYWNrY2hhbm5lbF9MREFERCkgJChMSUJTKQotZ3Rrdm5jdmlld2VyJChFWEVFWFQpOiAkKGd0a3ZuY3ZpZXdlcl9PQkpFQ1RTKSAkKGd0a3ZuY3ZpZXdlcl9ERVBFTkRFTkNJRVMpICQoRVhUUkFfZ3Rrdm5jdmlld2VyX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGd0a3ZuY3ZpZXdlciQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoZ3Rrdm5jdmlld2VyX0xJTkspICQoZ3Rrdm5jdmlld2VyX09CSkVDVFMpICQoZ3Rrdm5jdmlld2VyX0xEQUREKSAkKExJQlMpCi1wcG10ZXN0JChFWEVFWFQpOiAkKHBwbXRlc3RfT0JKRUNUUykgJChwcG10ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9wcG10ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHBwbXRlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQocHBtdGVzdF9PQkpFQ1RTKSAkKHBwbXRlc3RfTERBREQpICQoTElCUykKLXZuYzJtcGckKEVYRUVYVCk6ICQodm5jMm1wZ19PQkpFQ1RTKSAkKHZuYzJtcGdfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3ZuYzJtcGdfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgdm5jMm1wZyQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQodm5jMm1wZ19MSU5LKSAkKHZuYzJtcGdfT0JKRUNUUykgJCh2bmMybXBnX0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9TREx2bmN2aWV3ZXItc2NyYXAuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2JhY2tjaGFubmVsLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcG10ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS92bmMybXBnLXZuYzJtcGcuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vOiBTREx2bmN2aWV3ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLlRwbyAtYyAtbyBTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm8gYHRlc3QgLWYgJ1NETHZuY3ZpZXdlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTREx2bmN2aWV3ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5UcG8gJChERVBESVIpL1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdTREx2bmN2aWV3ZXIuYycgb2JqZWN0PSdTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm8gYHRlc3QgLWYgJ1NETHZuY3ZpZXdlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BTREx2bmN2aWV3ZXIuYwotCi1TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm9iajogU0RMdm5jdmlld2VyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIFNETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLlRwbyAtYyAtbyBTREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLm9iaiBgaWYgdGVzdCAtZiAnU0RMdm5jdmlld2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnU0RMdm5jdmlld2VyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL1NETHZuY3ZpZXdlci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9TREx2bmN2aWV3ZXItU0RMdm5jdmlld2VyLlRwbyAkKERFUERJUikvU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J1NETHZuY3ZpZXdlci5jJyBvYmplY3Q9J1NETHZuY3ZpZXdlci1TREx2bmN2aWV3ZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gU0RMdm5jdmlld2VyLVNETHZuY3ZpZXdlci5vYmogYGlmIHRlc3QgLWYgJ1NETHZuY3ZpZXdlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ1NETHZuY3ZpZXdlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9TREx2bmN2aWV3ZXIuYyc7IGZpYAotCi1TREx2bmN2aWV3ZXItc2NyYXAubzogc2NyYXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgU0RMdm5jdmlld2VyLXNjcmFwLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5UcG8gLWMgLW8gU0RMdm5jdmlld2VyLXNjcmFwLm8gYHRlc3QgLWYgJ3NjcmFwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNjcmFwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5UcG8gJChERVBESVIpL1NETHZuY3ZpZXdlci1zY3JhcC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3NjcmFwLmMnIG9iamVjdD0nU0RMdm5jdmlld2VyLXNjcmFwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKFNETHZuY3ZpZXdlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBTREx2bmN2aWV3ZXItc2NyYXAubyBgdGVzdCAtZiAnc2NyYXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2NyYXAuYwotCi1TREx2bmN2aWV3ZXItc2NyYXAub2JqOiBzY3JhcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoU0RMdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1NVCBTREx2bmN2aWV3ZXItc2NyYXAub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9TREx2bmN2aWV3ZXItc2NyYXAuVHBvIC1jIC1vIFNETHZuY3ZpZXdlci1zY3JhcC5vYmogYGlmIHRlc3QgLWYgJ3NjcmFwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2NyYXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2NyYXAuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlRwbyAkKERFUERJUikvU0RMdm5jdmlld2VyLXNjcmFwLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc2NyYXAuYycgb2JqZWN0PSdTREx2bmN2aWV3ZXItc2NyYXAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChTREx2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gU0RMdm5jdmlld2VyLXNjcmFwLm9iaiBgaWYgdGVzdCAtZiAnc2NyYXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzY3JhcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zY3JhcC5jJzsgZmlgCi0KLWd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIubzogZ3Rrdm5jdmlld2VyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChndGt2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5UcG8gLWMgLW8gZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vIGB0ZXN0IC1mICdndGt2bmN2aWV3ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3Rrdm5jdmlld2VyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuVHBvICQoREVQRElSKS9ndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nZ3Rrdm5jdmlld2VyLmMnIG9iamVjdD0nZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChndGt2bmN2aWV3ZXJfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vIGB0ZXN0IC1mICdndGt2bmN2aWV3ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3Rrdm5jdmlld2VyLmMKLQotZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vYmo6IGd0a3ZuY3ZpZXdlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3Rrdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1NVCBndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5UcG8gLWMgLW8gZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5vYmogYGlmIHRlc3QgLWYgJ2d0a3ZuY3ZpZXdlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2d0a3ZuY3ZpZXdlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ndGt2bmN2aWV3ZXIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZ3Rrdm5jdmlld2VyLWd0a3ZuY3ZpZXdlci5UcG8gJChERVBESVIpL2d0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdndGt2bmN2aWV3ZXIuYycgb2JqZWN0PSdndGt2bmN2aWV3ZXItZ3Rrdm5jdmlld2VyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3Rrdm5jdmlld2VyX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGd0a3ZuY3ZpZXdlci1ndGt2bmN2aWV3ZXIub2JqIGBpZiB0ZXN0IC1mICdndGt2bmN2aWV3ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdndGt2bmN2aWV3ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3Rrdm5jdmlld2VyLmMnOyBmaWAKLQotdm5jMm1wZy12bmMybXBnLm86IHZuYzJtcGcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZuYzJtcGdfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHZuYzJtcGctdm5jMm1wZy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS92bmMybXBnLXZuYzJtcGcuVHBvIC1jIC1vIHZuYzJtcGctdm5jMm1wZy5vIGB0ZXN0IC1mICd2bmMybXBnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHZuYzJtcGcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlRwbyAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndm5jMm1wZy5jJyBvYmplY3Q9J3ZuYzJtcGctdm5jMm1wZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2bmMybXBnX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHZuYzJtcGctdm5jMm1wZy5vIGB0ZXN0IC1mICd2bmMybXBnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHZuYzJtcGcuYwotCi12bmMybXBnLXZuYzJtcGcub2JqOiB2bmMybXBnLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2bmMybXBnX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2bmMybXBnLXZuYzJtcGcub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS92bmMybXBnLXZuYzJtcGcuVHBvIC1jIC1vIHZuYzJtcGctdm5jMm1wZy5vYmogYGlmIHRlc3QgLWYgJ3ZuYzJtcGcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd2bmMybXBnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3ZuYzJtcGcuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlRwbyAkKERFUERJUikvdm5jMm1wZy12bmMybXBnLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndm5jMm1wZy5jJyBvYmplY3Q9J3ZuYzJtcGctdm5jMm1wZy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZuYzJtcGdfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdm5jMm1wZy12bmMybXBnLm9iaiBgaWYgdGVzdCAtZiAndm5jMm1wZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZuYzJtcGcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvdm5jMm1wZy5jJzsgZmlgCi0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAotCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCi0JaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKLQltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCi0JbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvY2xpZW50X2V4YW1wbGVzL2d0a3ZuY3ZpZXdlci5jIGIvY2xpZW50X2V4YW1wbGVzL2d0a3ZuY3ZpZXdlci5jCmluZGV4IDllOWU3MmIuLjI2MWIyZGEgMTAwNjQ0Ci0tLSBhL2NsaWVudF9leGFtcGxlcy9ndGt2bmN2aWV3ZXIuYworKysgYi9jbGllbnRfZXhhbXBsZXMvZ3Rrdm5jdmlld2VyLmMKQEAgLTIzLDkgKzIzLDE1IEBACiAjaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KICNpbmNsdWRlIDxyZmIvcmZiY2xpZW50Lmg+CiAKKyNpZmRlZiBMSUJWTkNTRVJWRVJfQ09ORklHX0xJQlZBCisjaW5jbHVkZSA8Z2RrL2dka3guaD4KKyNlbmRpZgorCiBzdGF0aWMgcmZiQ2xpZW50ICpjbDsKIHN0YXRpYyBnY2hhciAqc2VydmVyX2N1dF90ZXh0ID0gTlVMTDsKIHN0YXRpYyBnYm9vbGVhbiBmcmFtZWJ1ZmZlcl9hbGxvY2F0ZWQgPSBGQUxTRTsKK3N0YXRpYyBHdGtXaWRnZXQgKndpbmRvdzsKK3N0YXRpYyBHdGtXaWRnZXQgKmRpYWxvZ19jb25uZWN0aW5nID0gTlVMTDsKIAogLyogUmVkcmF3IHRoZSBzY3JlZW4gZnJvbSB0aGUgYmFja2luZyBwaXhtYXAgKi8KIHN0YXRpYyBnYm9vbGVhbiBleHBvc2VfZXZlbnQgKEd0a1dpZGdldCAgICAgICp3aWRnZXQsCkBAIC01NSwxNyArNjEsMzIgQEAKIAkJY2wtPmZvcm1hdC5ncmVlbk1heCA9ICgxIDw8IGltYWdlLT52aXN1YWwtPmdyZWVuX3ByZWMpIC0gMTsKIAkJY2wtPmZvcm1hdC5ibHVlTWF4ICA9ICgxIDw8IGltYWdlLT52aXN1YWwtPmJsdWVfcHJlYykgLSAxOwogCisjaWZkZWYgTElCVk5DU0VSVkVSX0NPTkZJR19MSUJWQQorCQkvKiBBbGxvdyBsaWJ2bmNjbGllbnQgdG8gdXNlIGEgbW9yZSBlZmZpY2llbnQgd2F5CisJCSAqIG9mIHB1dHRpbmcgdGhlIGZyYW1lYnVmZmVyIG9uIHRoZSBzY3JlZW4gd2hlbgorCQkgKiB1c2luZyB0aGUgSC4yNjQgZm9ybWF0LgorCQkgKi8KKwkJY2wtPm91dHB1dFdpbmRvdyA9IEdES19XSU5ET1dfWElEKHdpZGdldC0+d2luZG93KTsKKyNlbmRpZgorCiAJCVNldEZvcm1hdEFuZEVuY29kaW5ncyAoY2wpOwogCiAJCWZyYW1lYnVmZmVyX2FsbG9jYXRlZCA9IFRSVUU7CisKKwkJLyogQWxzbyBkaXNhYmxlIGxvY2FsIGN1cnNvciAqLworCQlHZGtDdXJzb3IqIGN1ciA9IGdka19jdXJzb3JfbmV3KCBHREtfQkxBTktfQ1VSU09SICk7CisJCWdka193aW5kb3dfc2V0X2N1cnNvciAoZ3RrX3dpZGdldF9nZXRfd2luZG93KEdUS19XSURHRVQod2luZG93KSksIGN1cik7CisJCWdka19jdXJzb3JfdW5yZWYoIGN1ciApOwogCX0KIAorI2lmbmRlZiBMSUJWTkNTRVJWRVJfQ09ORklHX0xJQlZBCiAJZ2RrX2RyYXdfaW1hZ2UgKEdES19EUkFXQUJMRSAod2lkZ2V0LT53aW5kb3cpLAogCSAgICAgICAgICAgICAgICB3aWRnZXQtPnN0eWxlLT5mZ19nY1tndGtfd2lkZ2V0X2dldF9zdGF0ZSh3aWRnZXQpXSwKIAkgICAgICAgICAgICAgICAgaW1hZ2UsCiAJICAgICAgICAgICAgICAgIGV2ZW50LT5hcmVhLngsIGV2ZW50LT5hcmVhLnksCiAJICAgICAgICAgICAgICAgIGV2ZW50LT5hcmVhLngsIGV2ZW50LT5hcmVhLnksCiAJICAgICAgICAgICAgICAgIGV2ZW50LT5hcmVhLndpZHRoLCBldmVudC0+YXJlYS5oZWlnaHQpOworI2VuZGlmCiAKIAlyZXR1cm4gRkFMU0U7CiB9CkBAIC0xODIsOCArMjAzLDYgQEAKIAlTZW5kS2V5RXZlbnQoY2wsIFhLX0RlbGV0ZSwgRkFMU0UpOwogfQogCi1HdGtXaWRnZXQgKmRpYWxvZ19jb25uZWN0aW5nID0gTlVMTDsKLQogc3RhdGljIHZvaWQgc2hvd19jb25uZWN0X3dpbmRvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJR3RrV2lkZ2V0ICpsYWJlbDsKQEAgLTM2NSw3ICszODQsNiBAQAogfQogCiBzdGF0aWMgcmZiQm9vbCByZXNpemUgKHJmYkNsaWVudCAqY2xpZW50KSB7Ci0JR3RrV2lkZ2V0ICp3aW5kb3c7CiAJR3RrV2lkZ2V0ICpzY3JvbGxlZF93aW5kb3c7CiAJR3RrV2lkZ2V0ICpkcmF3aW5nX2FyZWE9TlVMTDsKIAlzdGF0aWMgY2hhciBmaXJzdD1UUlVFOwpAQCAtNDUzLDEwICs0NzEsMTcgQEAKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlIChyZmJDbGllbnQgKmNsLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgeworCWlmIChkaWFsb2dfY29ubmVjdGluZyAhPSBOVUxMKSB7CisJCWd0a193aWRnZXRfZGVzdHJveSAoZGlhbG9nX2Nvbm5lY3RpbmcpOworCQlkaWFsb2dfY29ubmVjdGluZyA9IE5VTEw7CisJfQorCisjaWZuZGVmIExJQlZOQ1NFUlZFUl9DT05GSUdfTElCVkEKIAlHdGtXaWRnZXQgKmRyYXdpbmdfYXJlYSA9IHJmYkNsaWVudEdldENsaWVudERhdGEgKGNsLCBndGtfaW5pdCk7CiAKIAlpZiAoZHJhd2luZ19hcmVhICE9IE5VTEwpCiAJCWd0a193aWRnZXRfcXVldWVfZHJhd19hcmVhIChkcmF3aW5nX2FyZWEsIHgsIHksIHcsIGgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGtiZF9sZWRzIChyZmJDbGllbnQgKmNsLCBpbnQgdmFsdWUsIGludCBwYWQpIHsKZGlmZiAtLWdpdCBhL2NvbW1vbi9sem9jb25mLmggYi9jb21tb24vbHpvY29uZi5oCmluZGV4IGQ2MTI1ZTguLjAyZmIyMDIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9sem9jb25mLmgKKysrIGIvY29tbW9uL2x6b2NvbmYuaApAQCAtMSwyMiArMSw4IEBACi0vKiBsem9jb25mLmggLS0gY29uZmlndXJhdGlvbiBmb3IgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5CisvKiBsem9jb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgTFpPIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeQogCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCiAKLSAgIENvcHlyaWdodCAoQykgMjAxMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwMSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk5IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMTk5OCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk2IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKICAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTQzLDkgKzI5LDkgQEAKICNpZm5kZWYgX19MWk9DT05GX0hfSU5DTFVERUQKICNkZWZpbmUgX19MWk9DT05GX0hfSU5DTFVERUQgMQogCi0jZGVmaW5lIExaT19WRVJTSU9OICAgICAgICAgICAgIDB4MjA0MAotI2RlZmluZSBMWk9fVkVSU0lPTl9TVFJJTkcgICAgICAiMi4wNCIKLSNkZWZpbmUgTFpPX1ZFUlNJT05fREFURSAgICAgICAgIk9jdCAzMSAyMDEwIgorI2RlZmluZSBMWk9fVkVSU0lPTiAgICAgICAgICAgICAweDIwNzAKKyNkZWZpbmUgTFpPX1ZFUlNJT05fU1RSSU5HICAgICAgIjIuMDciCisjZGVmaW5lIExaT19WRVJTSU9OX0RBVEUgICAgICAgICJKdW4gMjUgMjAxNCIKIAogLyogaW50ZXJuYWwgQXV0b2NvbmYgY29uZmlndXJhdGlvbiBmaWxlIC0gb25seSB1c2VkIHdoZW4gYnVpbGRpbmcgTFpPICovCiAjaWYgZGVmaW5lZChMWk9fSEFWRV9DT05GSUdfSCkKQEAgLTYyLDcgKzQ4LDcgQEAKICNpZiAhZGVmaW5lZChDSEFSX0JJVCkgfHwgKENIQVJfQklUICE9IDgpCiAjICBlcnJvciAiaW52YWxpZCBDSEFSX0JJVCIKICNlbmRpZgotI2lmICFkZWZpbmVkKFVDSEFSX01BWCkgfHwgIWRlZmluZWQoVUlOVF9NQVgpIHx8ICFkZWZpbmVkKFVMT05HX01BWCkKKyNpZiAhZGVmaW5lZChVQ0hBUl9NQVgpIHx8ICFkZWZpbmVkKFVTSFJUX01BWCkgfHwgIWRlZmluZWQoVUlOVF9NQVgpIHx8ICFkZWZpbmVkKFVMT05HX01BWCkKICMgIGVycm9yICJjaGVjayB5b3VyIGNvbXBpbGVyIGluc3RhbGxhdGlvbiIKICNlbmRpZgogI2lmIChVU0hSVF9NQVggPCAxKSB8fCAoVUlOVF9NQVggPCAxKSB8fCAoVUxPTkdfTUFYIDwgMSkKQEAgLTg0LDE0ICs3MCw2IEBACiAvLyBzb21lIGNvcmUgZGVmaW5lcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgIWRlZmluZWQoTFpPX1VJTlQzMl9DKQotIyAgaWYgKFVJTlRfTUFYIDwgTFpPXzB4ZmZmZmZmZmZMKQotIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICBjICMjIFVMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICgoYykgKyAwVSkKLSMgIGVuZGlmCi0jZW5kaWYKLQogLyogbWVtb3J5IGNoZWNrZXJzICovCiAjaWYgIWRlZmluZWQoX19MWk9fQ0hFQ0tFUikKICMgIGlmIGRlZmluZWQoX19CT1VORFNfQ0hFQ0tJTkdfT04pCkBAIC0xMTAsMjggKzg4LDMxIEBACiAvLyBpbnRlZ3JhbCBhbmQgcG9pbnRlciB0eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBsem9fdWludCBzaG91bGQgbWF0Y2ggc2l6ZV90ICovCisvKiBsem9fdWludCBtdXN0IG1hdGNoIHNpemVfdCAqLwogI2lmICFkZWZpbmVkKExaT19VSU5UX01BWCkKLSMgIGlmIGRlZmluZWQoTFpPX0FCSV9MTFA2NCkgLyogV0lONjQgKi8KLSMgICAgaWYgZGVmaW5lZChMWk9fT1NfV0lONjQpCisjICBpZiAoTFpPX0FCSV9MTFA2NCkKKyMgICAgaWYgKExaT19PU19XSU42NCkKICAgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgbHpvX3VpbnQ7CiAgICAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgIGx6b19pbnQ7CiAjICAgIGVsc2UKLSAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgbHpvX3VpbnQ7Ci0gICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgIGx6b19pbnQ7CisgICAgIHR5cGVkZWYgbHpvX3VsbG9uZ190ICAgICAgIGx6b191aW50OworICAgICB0eXBlZGVmIGx6b19sbG9uZ190ICAgICAgICBsem9faW50OwogIyAgICBlbmRpZgorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fVUlOVCA4CiAjICAgIGRlZmluZSBMWk9fVUlOVF9NQVggICAgICAgIDB4ZmZmZmZmZmZmZmZmZmZmZnVsbAogIyAgICBkZWZpbmUgTFpPX0lOVF9NQVggICAgICAgICA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKICMgICAgZGVmaW5lIExaT19JTlRfTUlOICAgICAgICAgKC0xTEwgLSBMWk9fSU5UX01BWCkKLSMgIGVsaWYgZGVmaW5lZChMWk9fQUJJX0lQMzJMNjQpIC8qIE1JUFMgUjU5MDAgKi8KKyMgIGVsaWYgKExaT19BQklfSVAzMkw2NCkgLyogTUlQUyBSNTkwMCAqLwogICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBsem9fdWludDsKICAgICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgbHpvX2ludDsKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1VJTlQgTFpPX1NJWkVPRl9JTlQKICMgICAgZGVmaW5lIExaT19VSU5UX01BWCAgICAgICAgVUlOVF9NQVgKICMgICAgZGVmaW5lIExaT19JTlRfTUFYICAgICAgICAgSU5UX01BWAogIyAgICBkZWZpbmUgTFpPX0lOVF9NSU4gICAgICAgICBJTlRfTUlOCiAjICBlbGlmIChVTE9OR19NQVggPj0gTFpPXzB4ZmZmZmZmZmZMKQogICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBsem9fdWludDsKICAgICAgdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgbHpvX2ludDsKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1VJTlQgTFpPX1NJWkVPRl9MT05HCiAjICAgIGRlZmluZSBMWk9fVUlOVF9NQVggICAgICAgIFVMT05HX01BWAogIyAgICBkZWZpbmUgTFpPX0lOVF9NQVggICAgICAgICBMT05HX01BWAogIyAgICBkZWZpbmUgTFpPX0lOVF9NSU4gICAgICAgICBMT05HX01JTgpAQCAtMTQwLDQyICsxMjEsMjIgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAotLyogSW50ZWdyYWwgdHlwZXMgd2l0aCAzMiBiaXRzIG9yIG1vcmUuICovCi0jaWYgIWRlZmluZWQoTFpPX1VJTlQzMl9NQVgpCi0jICBpZiAoVUlOVF9NQVggPj0gTFpPXzB4ZmZmZmZmZmZMKQotICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBsem9fdWludDMyOwotICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICBsem9faW50MzI7Ci0jICAgIGRlZmluZSBMWk9fVUlOVDMyX01BWCAgICAgIFVJTlRfTUFYCi0jICAgIGRlZmluZSBMWk9fSU5UMzJfTUFYICAgICAgIElOVF9NQVgKLSMgICAgZGVmaW5lIExaT19JTlQzMl9NSU4gICAgICAgSU5UX01JTgotIyAgZWxpZiAoVUxPTkdfTUFYID49IExaT18weGZmZmZmZmZmTCkKLSAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgbHpvX3VpbnQzMjsKLSAgICAgdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgbHpvX2ludDMyOwotIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9NQVggICAgICBVTE9OR19NQVgKLSMgICAgZGVmaW5lIExaT19JTlQzMl9NQVggICAgICAgTE9OR19NQVgKLSMgICAgZGVmaW5lIExaT19JTlQzMl9NSU4gICAgICAgTE9OR19NSU4KLSMgIGVsc2UKLSMgICAgZXJyb3IgImx6b191aW50MzIiCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSBsYXJnZXIgdHlwZSBvZiBsem9fdWludCBhbmQgbHpvX3VpbnQzMi4gKi8KLSNpZiAoTFpPX1VJTlRfTUFYID49IExaT19VSU5UMzJfTUFYKQorLyogVGhlIGxhcmdlciB0eXBlIG9mIGx6b191aW50IGFuZCBsem9fdWludDMyX3QuICovCisjaWYgKExaT19TSVpFT0ZfTFpPX1VJTlQgPj0gNCkKICMgIGRlZmluZSBsem9feGludCAgICAgICAgICAgICAgbHpvX3VpbnQKICNlbHNlCi0jICBkZWZpbmUgbHpvX3hpbnQgICAgICAgICAgICAgIGx6b191aW50MzIKKyMgIGRlZmluZSBsem9feGludCAgICAgICAgICAgICAgbHpvX3VpbnQzMl90CiAjZW5kaWYKIAotLyogTWVtb3J5IG1vZGVsIHRoYXQgYWxsb3dzIHRvIGFjY2VzcyBtZW1vcnkgYXQgb2Zmc2V0cyBvZiBsem9fdWludC4gKi8KLSNpZiAhZGVmaW5lZChfX0xaT19NTU9ERUwpCi0jICBpZiAoTFpPX1VJTlRfTUFYIDw9IFVJTlRfTUFYKQotIyAgICBkZWZpbmUgX19MWk9fTU1PREVMICAgICAgICAvKmVtcHR5Ki8KLSMgIGVsaWYgZGVmaW5lZChMWk9fSEFWRV9NTV9IVUdFX1BUUikKLSMgICAgZGVmaW5lIF9fTFpPX01NT0RFTF9IVUdFICAgMQotIyAgICBkZWZpbmUgX19MWk9fTU1PREVMICAgICAgICBfX2h1Z2UKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9fTFpPX01NT0RFTCAgICAgICAgLyplbXB0eSovCi0jICBlbmRpZgordHlwZWRlZiBpbnQgbHpvX2Jvb2w7CisKKy8qIHNhbml0eSBjaGVja3MgKi8KK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQpID09IExaT19TSVpFT0ZfTFpPX1VJTlQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b194aW50KSA+PSBzaXplb2YobHpvX3VpbnQpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9feGludCkgPj0gc2l6ZW9mKGx6b191aW50MzJfdCkpCisKKyNpZm5kZWYgX19MWk9fTU1PREVMCisjZGVmaW5lIF9fTFpPX01NT0RFTCAgICAgICAgICAgIC8qZW1wdHkqLwogI2VuZGlmCiAKIC8qIG5vIHR5cGVkZWYgaGVyZSBiZWNhdXNlIG9mIGNvbnN0LXBvaW50ZXIgaXNzdWVzICovCkBAIC0xODQsMTcgKzE0NSw1MiBAQAogI2RlZmluZSBsem9fdm9pZHAgICAgICAgICAgICAgICB2b2lkIF9fTFpPX01NT0RFTCAqCiAjZGVmaW5lIGx6b19zaG9ydHAgICAgICAgICAgICAgIHNob3J0IF9fTFpPX01NT0RFTCAqCiAjZGVmaW5lIGx6b191c2hvcnRwICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IF9fTFpPX01NT0RFTCAqCi0jZGVmaW5lIGx6b191aW50MzJwICAgICAgICAgICAgIGx6b191aW50MzIgX19MWk9fTU1PREVMICoKLSNkZWZpbmUgbHpvX2ludDMycCAgICAgICAgICAgICAgbHpvX2ludDMyIF9fTFpPX01NT0RFTCAqCi0jZGVmaW5lIGx6b191aW50cCAgICAgICAgICAgICAgIGx6b191aW50IF9fTFpPX01NT0RFTCAqCiAjZGVmaW5lIGx6b19pbnRwICAgICAgICAgICAgICAgIGx6b19pbnQgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnRwICAgICAgICAgICAgICAgbHpvX3VpbnQgX19MWk9fTU1PREVMICoKICNkZWZpbmUgbHpvX3hpbnRwICAgICAgICAgICAgICAgbHpvX3hpbnQgX19MWk9fTU1PREVMICoKICNkZWZpbmUgbHpvX3ZvaWRwcCAgICAgICAgICAgICAgbHpvX3ZvaWRwIF9fTFpPX01NT0RFTCAqCiAjZGVmaW5lIGx6b19ieXRlcHAgICAgICAgICAgICAgIGx6b19ieXRlcCBfX0xaT19NTU9ERUwgKgotLyogZGVwcmVjYXRlZCAtIHVzZSAnbHpvX2J5dGVwJyBpbnN0ZWFkIG9mICdsem9fYnl0ZSAqJyAqLwotI2RlZmluZSBsem9fYnl0ZSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fTFpPX01NT0RFTAogCi10eXBlZGVmIGludCBsem9fYm9vbDsKKyNkZWZpbmUgbHpvX2ludDhfdHAgICAgICAgICAgICAgbHpvX2ludDhfdCBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBsem9fdWludDhfdHAgICAgICAgICAgICBsem9fdWludDhfdCBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBsem9faW50MTZfdHAgICAgICAgICAgICBsem9faW50MTZfdCBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBsem9fdWludDE2X3RwICAgICAgICAgICBsem9fdWludDE2X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX2ludDMyX3RwICAgICAgICAgICAgbHpvX2ludDMyX3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQzMl90cCAgICAgICAgICAgbHpvX3VpbnQzMl90IF9fTFpPX01NT0RFTCAqCisjaWYgZGVmaW5lZChsem9faW50NjRfdCkKKyNkZWZpbmUgbHpvX2ludDY0X3RwICAgICAgICAgICAgbHpvX2ludDY0X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQ2NF90cCAgICAgICAgICAgbHpvX3VpbnQ2NF90IF9fTFpPX01NT0RFTCAqCisjZW5kaWYKKworLyogT2xkZXIgTFpPIHZlcnNpb25zIHVzZWQgdG8gc3VwcG9ydCBhbmNpZW50IHN5c3RlbXMgYW5kIG1lbW9yeSBtb2RlbHMKKyAqIGxpa2UgMTYtYml0IE1TRE9TIHdpdGggX19odWdlIHBvaW50ZXJzIGFuZCBDcmF5IFBWUCwgYnV0IHRoZXNlCisgKiBvYnNvbGV0ZSBjb25maWd1cmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBhbnkgbG9uZ2VyLgorICovCisjaWYgZGVmaW5lZChfX0xaT19NTU9ERUxfSFVHRSkKKyNlcnJvciAiX19MWk9fTU1PREVMX0hVR0UgaXMgdW5zdXBwb3J0ZWQiCisjZW5kaWYKKyNpZiAoTFpPX01NX1BWUCkKKyNlcnJvciAiTFpPX01NX1BWUCBpcyB1bnN1cHBvcnRlZCIKKyNlbmRpZgorI2lmIChMWk9fU0laRU9GX0lOVCA8IDQpCisjZXJyb3IgIkxaT19TSVpFT0ZfSU5UIDwgNCBpcyB1bnN1cHBvcnRlZCIKKyNlbmRpZgorI2lmIChfX0xaT19VSU5UUFRSX1RfSVNfUE9JTlRFUikKKyNlcnJvciAiX19MWk9fVUlOVFBUUl9UX0lTX1BPSU5URVIgaXMgdW5zdXBwb3J0ZWQiCisjZW5kaWYKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YoaW50KSA+PSA0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludCkgPj0gNCkKKy8qIFN0cmFuZ2UgY29uZmlndXJhdGlvbnMgd2hlcmUgc2l6ZW9mKGx6b191aW50KSAhPSBzaXplb2Yoc2l6ZV90KSBzaG91bGQKKyAqIHdvcmsgYnV0IGhhdmUgbm90IHJlY2VpdmVkIG11Y2ggdGVzdGluZyBsYXRlbHksIHNvIGJlIHN0cmljdCBoZXJlLgorICovCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b191aW50KSA9PSBzaXplb2Yoc2l6ZV90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQpID09IHNpemVvZihwdHJkaWZmX3QpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludCkgPT0gc2l6ZW9mKGx6b191aW50cHRyX3QpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZih2b2lkICopICAgPT0gc2l6ZW9mKGx6b191aW50cHRyX3QpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihjaGFyICopICAgPT0gc2l6ZW9mKGx6b191aW50cHRyX3QpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsb25nICopICAgPT0gc2l6ZW9mKGx6b191aW50cHRyX3QpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZih2b2lkICopICAgPT0gc2l6ZW9mKGx6b192b2lkcCkpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGNoYXIgKikgICA9PSBzaXplb2YobHpvX2J5dGVwKSkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4OSw3ICsyODUsNyBAQAogICAgIC8qIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIGNhbGxiYWNrIGZ1bmN0aW9uIChzZXQgdG8gMCB0byBkaXNhYmxlKSAqLwogICAgIGx6b19wcm9ncmVzc19mdW5jX3QgbnByb2dyZXNzOwogCi0gICAgLyogTk9URTogdGhlIGZpcnN0IHBhcmFtZXRlciAic2VsZiIgb2YgdGhlIG5hbGxvYy9uZnJlZS9ucHJvZ3Jlc3MKKyAgICAvKiBJTkZPOiB0aGUgZmlyc3QgcGFyYW1ldGVyICJzZWxmIiBvZiB0aGUgbmFsbG9jL25mcmVlL25wcm9ncmVzcwogICAgICAqIGNhbGxiYWNrcyBwb2ludHMgYmFjayB0byB0aGlzIHN0cnVjdCwgc28geW91IGFyZSBmcmVlIHRvIHN0b3JlCiAgICAgICogc29tZSBleHRyYSBpbmZvIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLiAqLwogICAgIGx6b192b2lkcCB1c2VyMTsKQEAgLTMwOCw3ICszMDQsNyBAQAogICovCiAjZGVmaW5lIExaT19FX09LICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIExaT19FX0VSUk9SICAgICAgICAgICAgICAgICAoLTEpCi0jZGVmaW5lIExaT19FX09VVF9PRl9NRU1PUlkgICAgICAgICAoLTIpICAgIC8qIFtub3QgdXNlZCByaWdodCBub3ddICovCisjZGVmaW5lIExaT19FX09VVF9PRl9NRU1PUlkgICAgICAgICAoLTIpICAgIC8qIFtsem9fYWxsb2NfZnVuY190IGZhaWx1cmVdICovCiAjZGVmaW5lIExaT19FX05PVF9DT01QUkVTU0lCTEUgICAgICAoLTMpICAgIC8qIFtub3QgdXNlZCByaWdodCBub3ddICovCiAjZGVmaW5lIExaT19FX0lOUFVUX09WRVJSVU4gICAgICAgICAoLTQpCiAjZGVmaW5lIExaT19FX09VVFBVVF9PVkVSUlVOICAgICAgICAoLTUpCkBAIC0zMTYsNiArMzEyLDEwIEBACiAjZGVmaW5lIExaT19FX0VPRl9OT1RfRk9VTkQgICAgICAgICAoLTcpCiAjZGVmaW5lIExaT19FX0lOUFVUX05PVF9DT05TVU1FRCAgICAoLTgpCiAjZGVmaW5lIExaT19FX05PVF9ZRVRfSU1QTEVNRU5URUQgICAoLTkpICAgIC8qIFtub3QgdXNlZCByaWdodCBub3ddICovCisjZGVmaW5lIExaT19FX0lOVkFMSURfQVJHVU1FTlQgICAgICAoLTEwKQorI2RlZmluZSBMWk9fRV9JTlZBTElEX0FMSUdOTUVOVCAgICAgKC0xMSkgICAvKiBwb2ludGVyIGFyZ3VtZW50IGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICovCisjZGVmaW5lIExaT19FX09VVFBVVF9OT1RfQ09OU1VNRUQgICAoLTEyKQorI2RlZmluZSBMWk9fRV9JTlRFUk5BTF9FUlJPUiAgICAgICAgKC05OSkKIAogCiAjaWZuZGVmIGx6b19zaXplb2ZfZGljdF90CkBAIC0zMjksNyArMzI5LDcgQEAKICAqIGNvbXBpbGVyJ3MgdmlldyBvZiB2YXJpb3VzIHR5cGVzIGFyZSBjb25zaXN0ZW50LgogICovCiAjZGVmaW5lIGx6b19pbml0KCkgX19sem9faW5pdF92MihMWk9fVkVSU0lPTiwoaW50KXNpemVvZihzaG9ydCksKGludClzaXplb2YoaW50KSxcCi0gICAgKGludClzaXplb2YobG9uZyksKGludClzaXplb2YobHpvX3VpbnQzMiksKGludClzaXplb2YobHpvX3VpbnQpLFwKKyAgICAoaW50KXNpemVvZihsb25nKSwoaW50KXNpemVvZihsem9fdWludDMyX3QpLChpbnQpc2l6ZW9mKGx6b191aW50KSxcCiAgICAgKGludClsem9fc2l6ZW9mX2RpY3RfdCwoaW50KXNpemVvZihjaGFyICopLChpbnQpc2l6ZW9mKGx6b192b2lkcCksXAogICAgIChpbnQpc2l6ZW9mKGx6b19jYWxsYmFja190KSkKIExaT19FWFRFUk4oaW50KSBfX2x6b19pbml0X3YyKHVuc2lnbmVkLGludCxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50KTsKQEAgLTM1MiwxOCArMzUyLDIyIEBACiAgICAgbHpvX21lbXNldChsem9fdm9pZHAgYnVmLCBpbnQgYywgbHpvX3VpbnQgbGVuKTsKIAogLyogY2hlY2tzdW0gZnVuY3Rpb25zICovCi1MWk9fRVhURVJOKGx6b191aW50MzIpCi0gICAgbHpvX2FkbGVyMzIobHpvX3VpbnQzMiBjLCBjb25zdCBsem9fYnl0ZXAgYnVmLCBsem9fdWludCBsZW4pOwotTFpPX0VYVEVSTihsem9fdWludDMyKQotICAgIGx6b19jcmMzMihsem9fdWludDMyIGMsIGNvbnN0IGx6b19ieXRlcCBidWYsIGx6b191aW50IGxlbik7Ci1MWk9fRVhURVJOKGNvbnN0IGx6b191aW50MzJwKQorTFpPX0VYVEVSTihsem9fdWludDMyX3QpCisgICAgbHpvX2FkbGVyMzIobHpvX3VpbnQzMl90IGMsIGNvbnN0IGx6b19ieXRlcCBidWYsIGx6b191aW50IGxlbik7CitMWk9fRVhURVJOKGx6b191aW50MzJfdCkKKyAgICBsem9fY3JjMzIobHpvX3VpbnQzMl90IGMsIGNvbnN0IGx6b19ieXRlcCBidWYsIGx6b191aW50IGxlbik7CitMWk9fRVhURVJOKGNvbnN0IGx6b191aW50MzJfdHApCiAgICAgbHpvX2dldF9jcmMzMl90YWJsZSh2b2lkKTsKIAogLyogbWlzYy4gKi8KIExaT19FWFRFUk4oaW50KSBfbHpvX2NvbmZpZ19jaGVjayh2b2lkKTsKLXR5cGVkZWYgdW5pb24geyBsem9fYnl0ZXAgcDsgbHpvX3VpbnQgdTsgfSBfX2x6b19wdV91OwotdHlwZWRlZiB1bmlvbiB7IGx6b19ieXRlcCBwOyBsem9fdWludDMyIHUzMjsgfSBfX2x6b19wdTMyX3U7Ci10eXBlZGVmIHVuaW9uIHsgdm9pZCAqdnA7IGx6b19ieXRlcCBicDsgbHpvX3VpbnQgdTsgbHpvX3VpbnQzMiB1MzI7IHVuc2lnbmVkIGxvbmcgbDsgfSBsem9fYWxpZ25fdDsKK3R5cGVkZWYgdW5pb24geworICAgIGx6b192b2lkcCBhMDA7IGx6b19ieXRlcCBhMDE7IGx6b191aW50IGEwMjsgbHpvX3hpbnQgYTAzOyBsem9fdWludHB0cl90IGEwNDsKKyAgICB2b2lkICphMDU7IHVuc2lnbmVkIGNoYXIgKmEwNjsgdW5zaWduZWQgbG9uZyBhMDc7IHNpemVfdCBhMDg7IHB0cmRpZmZfdCBhMDk7CisjaWYgZGVmaW5lZChsem9faW50NjRfdCkKKyAgICBsem9fdWludDY0X3QgYTEwOworI2VuZGlmCit9IGx6b19hbGlnbl90OwogCiAvKiBhbGlnbiBhIGNoYXIgcG9pbnRlciBvbiBhIGJvdW5kYXJ5IHRoYXQgaXMgYSBtdWx0aXBsZSBvZiAnc2l6ZScgKi8KIExaT19FWFRFUk4odW5zaWduZWQpIF9fbHpvX2FsaWduX2dhcChjb25zdCBsem9fdm9pZHAgcCwgbHpvX3VpbnQgc2l6ZSk7CkBAIC0zNzIsOSArMzc2LDMwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBkZXByZWNhdGVkIG1hY3JvcyAtIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBMWk8gdjEueHgKKy8vIGRlcHJlY2F0ZWQgbWFjcm9zIC0gb25seSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKiBkZXByZWNhdGVkIC0gdXNlICdsem9fYnl0ZXAnIGluc3RlYWQgb2YgJ2x6b19ieXRlIConICovCisjZGVmaW5lIGx6b19ieXRlICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIKKy8qIGRlcHJlY2F0ZWQgdHlwZSBuYW1lcyAqLworI2RlZmluZSBsem9faW50MzIgICAgICAgICAgICAgICBsem9faW50MzJfdAorI2RlZmluZSBsem9fdWludDMyICAgICAgICAgICAgICBsem9fdWludDMyX3QKKyNkZWZpbmUgbHpvX2ludDMycCAgICAgICAgICAgICAgbHpvX2ludDMyX3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQzMnAgICAgICAgICAgICAgbHpvX3VpbnQzMl90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIExaT19JTlQzMl9NQVggICAgICAgICAgIExaT19JTlQzMl9DKDIxNDc0ODM2NDcpCisjZGVmaW5lIExaT19VSU5UMzJfTUFYICAgICAgICAgIExaT19VSU5UMzJfQyg0Mjk0OTY3Mjk1KQorI2lmIGRlZmluZWQobHpvX2ludDY0X3QpCisjZGVmaW5lIGx6b19pbnQ2NCAgICAgICAgICAgICAgIGx6b19pbnQ2NF90CisjZGVmaW5lIGx6b191aW50NjQgICAgICAgICAgICAgIGx6b191aW50NjRfdAorI2RlZmluZSBsem9faW50NjRwICAgICAgICAgICAgICBsem9faW50NjRfdCBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBsem9fdWludDY0cCAgICAgICAgICAgICBsem9fdWludDY0X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgTFpPX0lOVDY0X01BWCAgICAgICAgICAgTFpPX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykKKyNkZWZpbmUgTFpPX1VJTlQ2NF9NQVggICAgICAgICAgTFpPX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorI2VuZGlmCisvKiBkZXByZWNhdGVkIHR5cGVzICovCit0eXBlZGVmIHVuaW9uIHsgbHpvX2J5dGVwIGE7IGx6b191aW50IGI7IH0gX19sem9fcHVfdTsKK3R5cGVkZWYgdW5pb24geyBsem9fYnl0ZXAgYTsgbHpvX3VpbnQzMl90IGI7IH0gX19sem9fcHUzMl91OworCiAjaWYgZGVmaW5lZChMWk9fQ0ZHX0NPTVBBVCkKIAogI2RlZmluZSBfX0xaT0NPTkZfSCAxCmRpZmYgLS1naXQgYS9jb21tb24vbHpvZGVmcy5oIGIvY29tbW9uL2x6b2RlZnMuaAppbmRleCAxOTAwMTNmLi5mNGFlOTQ4IDEwMDY0NAotLS0gYS9jb21tb24vbHpvZGVmcy5oCisrKyBiL2NvbW1vbi9sem9kZWZzLmgKQEAgLTIsMjEgKzIsNyBAQAogCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCiAKLSAgIENvcHlyaWdodCAoQykgMjAxMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwMSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk5IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMTk5OCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk2IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKICAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTQ2LDEyICszMiw2IEBACiAjaWYgZGVmaW5lZChfX0NZR1dJTjMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCiAjICBkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KICNlbmRpZgotI2lmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgIWRlZmluZWQoX19JQk1DX18pCi0jICBkZWZpbmUgX19JQk1DX18gX19JQk1DUFBfXwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0lDTCkgJiYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCi0jICBkZWZpbmUgX19JTlRFTF9DT01QSUxFUiBfX0lDTAotI2VuZGlmCiAjaWYgMSAmJiBkZWZpbmVkKF9fSU5URVJJWCkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX0FMTF9TT1VSQ0UpCiAjICBkZWZpbmUgX0FMTF9TT1VSQ0UgMQogI2VuZGlmCkBAIC02MCwxOSArNDAsMzAgQEAKICMgICAgZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAogIyAgZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgZGVmaW5lZChfX2xpbnV4X18pCisjaWYgIWRlZmluZWQoTFpPX0NGR19OT19ESVNBQkxFX1dVTkRFRikKKyNpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikKKyMgIHByYWdtYSBkaWFnX3N1cHByZXNzIDE5MworI2VsaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX19jbGFuZ19taW5vcl9fKQorIyAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bmRlZiIKKyNlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKICMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDE5MykKLSNlbmRpZgotI2lmIGRlZmluZWQoX19LRUlMX18pICYmIGRlZmluZWQoX19DMTY2X18pCisjZWxpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQogIyAgcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA9IDMyMgotI2VsaWYgMCAmJiBkZWZpbmVkKF9fQzI1MV9fKQotIyAgcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA9IDMyMgotI2VuZGlmCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19NV0VSS1NfXykKLSMgIGlmIChfTVNDX1ZFUiA+PSAxMzAwKQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgIWRlZmluZWQoX19QQVRIU0NBTEVfXykKKyMgIGlmICgoX19HTlVDX18tMCkgPj0gNSB8fCAoKF9fR05VQ19fLTApID09IDQgJiYgKF9fR05VQ19NSU5PUl9fLTApID49IDIpKQorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bmRlZiIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pCisjICBpZiAoKF9NU0NfVkVSLTApID49IDEzMDApCiAjICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ2NjgpCiAjICBlbmRpZgogI2VuZGlmCisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQoX19QT0NDX18pICYmIGRlZmluZWQoX1dJTjMyKQorIyAgaWYgKF9fUE9DQ19fID49IDQwMCkKKyMgICAgcHJhZ21hIHdhcm4oZGlzYWJsZTogMjIxNikKKyMgIGVuZGlmCisjZW5kaWYKICNpZiAwICYmIGRlZmluZWQoX19XQVRDT01DX18pCiAjICBpZiAoX19XQVRDT01DX18gPj0gMTA1MCkgJiYgKF9fV0FUQ09NQ19fIDwgMTA2MCkKICMgICAgcHJhZ21hIHdhcm5pbmcgMjAzIDkKQEAgLTgxLDEzICs3MiwyOSBAQAogI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCiAjICBwcmFnbWEgb3B0aW9uIC1oCiAjZW5kaWYKLSNpZiAwCi0jZGVmaW5lIExaT18weGZmZmZMICAgICAgICAgICAgIDB4ZmZmZnVsCi0jZGVmaW5lIExaT18weGZmZmZmZmZmTCAgICAgICAgIDB4ZmZmZmZmZmZ1bAotI2Vsc2UKLSNkZWZpbmUgTFpPXzB4ZmZmZkwgICAgICAgICAgICAgNjU1MzV1bAotI2RlZmluZSBMWk9fMHhmZmZmZmZmZkwgICAgICAgICA0Mjk0OTY3Mjk1dWwKKyNpZiAhKExaT19DRkdfTk9fRElTQUJMRV9XQ1JUTk9OU1REQykKKyNpZm5kZWYgX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFIDEKICNlbmRpZgorI2lmbmRlZiBfQ1JUX05PTlNURENfTk9fV0FSTklOR1MKKyNkZWZpbmUgX0NSVF9OT05TVERDX05PX1dBUk5JTkdTIDEKKyNlbmRpZgorI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAxCisjZW5kaWYKKyNlbmRpZgorI2lmIDAKKyNkZWZpbmUgTFpPXzB4ZmZmZlVMICAgICAgICAgICAgMHhmZmZmdWwKKyNkZWZpbmUgTFpPXzB4ZmZmZmZmZmZVTCAgICAgICAgMHhmZmZmZmZmZnVsCisjZWxzZQorI2RlZmluZSBMWk9fMHhmZmZmVUwgICAgICAgICAgICA2NTUzNXVsCisjZGVmaW5lIExaT18weGZmZmZmZmZmVUwgICAgICAgIDQyOTQ5NjcyOTV1bAorI2VuZGlmCisjZGVmaW5lIExaT18weGZmZmZMICAgICAgICAgICAgIExaT18weGZmZmZVTAorI2RlZmluZSBMWk9fMHhmZmZmZmZmZkwgICAgICAgICBMWk9fMHhmZmZmZmZmZlVMCiAjaWYgKExaT18weGZmZmZMID09IExaT18weGZmZmZmZmZmTCkKICMgIGVycm9yICJ5b3VyIHByZXByb2Nlc3NvciBpcyBicm9rZW4gMSIKICNlbmRpZgpAQCAtMTAyLDYgKzEwOSwxMyBAQAogIyAgZXJyb3IgInlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbiA0IgogI2VuZGlmCiAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQ09VTlRFUl9fKQorIyAgaWZuZGVmIExaT19DRkdfVVNFX0NPVU5URVIKKyMgIGRlZmluZSBMWk9fQ0ZHX1VTRV9DT1VOVEVSIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgdW5kZWYgTFpPX0NGR19VU0VfQ09VTlRFUgorI2VuZGlmCiAjaWYgKFVJTlRfTUFYID09IExaT18weGZmZmZMKQogI2lmIGRlZmluZWQoX19aVENfXykgJiYgZGVmaW5lZChfX0k4Nl9fKSAmJiAhZGVmaW5lZChfX09TMl9fKQogIyAgaWYgIWRlZmluZWQoTVNET1MpCkBAIC0yMzIsMTQgKzI0NiwzMSBAQAogI2VuZGlmCiAjZGVmaW5lIExaT19QUF9TVFJJTkdJWkUoeCkgICAgICAgICAgICAgI3gKICNkZWZpbmUgTFpPX1BQX01BQ1JPX0VYUEFORCh4KSAgICAgICAgICBMWk9fUFBfU1RSSU5HSVpFKHgpCisjZGVmaW5lIExaT19QUF9DT05DQVQwKCkgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9DT05DQVQxKGEpICAgICAgICAgICAgICAgYQogI2RlZmluZSBMWk9fUFBfQ09OQ0FUMihhLGIpICAgICAgICAgICAgIGEgIyMgYgogI2RlZmluZSBMWk9fUFBfQ09OQ0FUMyhhLGIsYykgICAgICAgICAgIGEgIyMgYiAjIyBjCiAjZGVmaW5lIExaT19QUF9DT05DQVQ0KGEsYixjLGQpICAgICAgICAgYSAjIyBiICMjIGMgIyMgZAogI2RlZmluZSBMWk9fUFBfQ09OQ0FUNShhLGIsYyxkLGUpICAgICAgIGEgIyMgYiAjIyBjICMjIGQgIyMgZQorI2RlZmluZSBMWk9fUFBfQ09OQ0FUNihhLGIsYyxkLGUsZikgICAgIGEgIyMgYiAjIyBjICMjIGQgIyMgZSAjIyBmCisjZGVmaW5lIExaT19QUF9DT05DQVQ3KGEsYixjLGQsZSxmLGcpICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlICMjIGYgIyMgZworI2RlZmluZSBMWk9fUFBfRUNPTkNBVDAoKSAgICAgICAgICAgICAgIExaT19QUF9DT05DQVQwKCkKKyNkZWZpbmUgTFpPX1BQX0VDT05DQVQxKGEpICAgICAgICAgICAgICBMWk9fUFBfQ09OQ0FUMShhKQogI2RlZmluZSBMWk9fUFBfRUNPTkNBVDIoYSxiKSAgICAgICAgICAgIExaT19QUF9DT05DQVQyKGEsYikKICNkZWZpbmUgTFpPX1BQX0VDT05DQVQzKGEsYixjKSAgICAgICAgICBMWk9fUFBfQ09OQ0FUMyhhLGIsYykKICNkZWZpbmUgTFpPX1BQX0VDT05DQVQ0KGEsYixjLGQpICAgICAgICBMWk9fUFBfQ09OQ0FUNChhLGIsYyxkKQogI2RlZmluZSBMWk9fUFBfRUNPTkNBVDUoYSxiLGMsZCxlKSAgICAgIExaT19QUF9DT05DQVQ1KGEsYixjLGQsZSkKKyNkZWZpbmUgTFpPX1BQX0VDT05DQVQ2KGEsYixjLGQsZSxmKSAgICBMWk9fUFBfQ09OQ0FUNihhLGIsYyxkLGUsZikKKyNkZWZpbmUgTFpPX1BQX0VDT05DQVQ3KGEsYixjLGQsZSxmLGcpICBMWk9fUFBfQ09OQ0FUNyhhLGIsYyxkLGUsZixnKQorI2RlZmluZSBMWk9fUFBfRU1QVFkgICAgICAgICAgICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFkwKCkgICAgICAgICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFkxKGEpICAgICAgICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFkyKGEsYikgICAgICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFkzKGEsYixjKSAgICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFk0KGEsYixjLGQpICAgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFk1KGEsYixjLGQsZSkgICAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFk2KGEsYixjLGQsZSxmKSAgICAgIC8qZW1wdHkqLworI2RlZmluZSBMWk9fUFBfRU1QVFk3KGEsYixjLGQsZSxmLGcpICAgIC8qZW1wdHkqLwogI2lmIDEKICNkZWZpbmUgTFpPX0NQUF9TVFJJTkdJWkUoeCkgICAgICAgICAgICAjeAogI2RlZmluZSBMWk9fQ1BQX01BQ1JPX0VYUEFORCh4KSAgICAgICAgIExaT19DUFBfU1RSSU5HSVpFKHgpCkBAIC0yNDcsMTIgKzI3OCwxNiBAQAogI2RlZmluZSBMWk9fQ1BQX0NPTkNBVDMoYSxiLGMpICAgICAgICAgIGEgIyMgYiAjIyBjCiAjZGVmaW5lIExaT19DUFBfQ09OQ0FUNChhLGIsYyxkKSAgICAgICAgYSAjIyBiICMjIGMgIyMgZAogI2RlZmluZSBMWk9fQ1BQX0NPTkNBVDUoYSxiLGMsZCxlKSAgICAgIGEgIyMgYiAjIyBjICMjIGQgIyMgZQorI2RlZmluZSBMWk9fQ1BQX0NPTkNBVDYoYSxiLGMsZCxlLGYpICAgIGEgIyMgYiAjIyBjICMjIGQgIyMgZSAjIyBmCisjZGVmaW5lIExaT19DUFBfQ09OQ0FUNyhhLGIsYyxkLGUsZixnKSAgYSAjIyBiICMjIGMgIyMgZCAjIyBlICMjIGYgIyMgZwogI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQyKGEsYikgICAgICAgICAgIExaT19DUFBfQ09OQ0FUMihhLGIpCiAjZGVmaW5lIExaT19DUFBfRUNPTkNBVDMoYSxiLGMpICAgICAgICAgTFpPX0NQUF9DT05DQVQzKGEsYixjKQogI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQ0KGEsYixjLGQpICAgICAgIExaT19DUFBfQ09OQ0FUNChhLGIsYyxkKQogI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQ1KGEsYixjLGQsZSkgICAgIExaT19DUFBfQ09OQ0FUNShhLGIsYyxkLGUpCisjZGVmaW5lIExaT19DUFBfRUNPTkNBVDYoYSxiLGMsZCxlLGYpICAgTFpPX0NQUF9DT05DQVQ2KGEsYixjLGQsZSxmKQorI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQ3KGEsYixjLGQsZSxmLGcpIExaT19DUFBfQ09OQ0FUNyhhLGIsYyxkLGUsZixnKQogI2VuZGlmCi0jZGVmaW5lIF9fTFpPX01BU0tfR0VOKG8sYikgICAgICgoKCgobykgPDwgKChiKS0xKSkgLSAobykpIDw8IDEpICsgKG8pKQorI2RlZmluZSBfX0xaT19NQVNLX0dFTihvLGIpICAgICAoKCgoKG8pIDw8ICgoYiktISEoYikpKSAtIChvKSkgPDwgMSkgKyAobykqISEoYikpCiAjaWYgMSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQogIyAgaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKICMgICAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MgMQpAQCAtMjYyLDkgKzI5NywxMyBAQAogIyAgZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jICBkZWZpbmUgTFpPX0VYVEVSTl9DIGV4dGVybiAiQyIKKyMgIGRlZmluZSBMWk9fRVhURVJOX0MgICAgICAgICAgZXh0ZXJuICJDIgorIyAgZGVmaW5lIExaT19FWFRFUk5fQ19CRUdJTiAgICBleHRlcm4gIkMiIHsKKyMgIGRlZmluZSBMWk9fRVhURVJOX0NfRU5EICAgICAgfQogI2Vsc2UKLSMgIGRlZmluZSBMWk9fRVhURVJOX0MgZXh0ZXJuCisjICBkZWZpbmUgTFpPX0VYVEVSTl9DICAgICAgICAgIGV4dGVybgorIyAgZGVmaW5lIExaT19FWFRFUk5fQ19CRUdJTiAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBMWk9fRVhURVJOX0NfRU5EICAgICAgLyplbXB0eSovCiAjZW5kaWYKICNpZiAhZGVmaW5lZChfX0xaT19PU19PVkVSUklERSkKICNpZiAoTFpPX09TX0ZSRUVTVEFORElORykKQEAgLTM2NSwxMiArNDA0LDEyIEBACiAjZWxpZiBkZWZpbmVkKF9fVk1TKQogIyAgZGVmaW5lIExaT19PU19WTVMgICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJ2bXMiCi0jZWxpZiAoKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19SNTkwMF9fKSkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKSkKKyNlbGlmIChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykKICMgIGRlZmluZSBMWk9fT1NfQ09OU09MRSAgICAgICAgMQogIyAgZGVmaW5lIExaT19PU19DT05TT0xFX1BTMiAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJjb25zb2xlIgogIyAgZGVmaW5lIExaT19JTkZPX09TX0NPTlNPTEUgICAicHMyIgotI2VsaWYgKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19wc3BfXykpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fcHNwX18pCiAjICBkZWZpbmUgTFpPX09TX0NPTlNPTEUgICAgICAgIDEKICMgIGRlZmluZSBMWk9fT1NfQ09OU09MRV9QU1AgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiY29uc29sZSIKQEAgLTM5OCw5ICs0MzcsMTggQEAKICMgIGVsaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX0xJTlVYX18pCiAjICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfTElOVVggICAgICAxCiAjICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAibGludXgiCi0jICBlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fTUFDT1NfXykKLSMgICAgZGVmaW5lIExaT19PU19QT1NJWF9NQUNPU1ggICAgIDEKLSMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJtYWNvc3giCisjICBlbGlmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorIyAgICBpZiAoKF9fRU5WSVJPTk1FTlRfSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18tMCkgPj0gMjAwMDApCisjICAgICAgZGVmaW5lIExaT19PU19QT1NJWF9EQVJXSU4gICAgIDEwNDAKKyMgICAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImRhcndpbl9pcGhvbmUiCisjICAgIGVsaWYgKChfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18tMCkgPj0gMTA0MCkKKyMgICAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0RBUldJTiAgICAgX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fCisjICAgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJkYXJ3aW4iCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0RBUldJTiAgICAgMQorIyAgICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAiZGFyd2luIgorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX01BQ09TWCAgICAgTFpPX09TX1BPU0lYX0RBUldJTgogIyAgZWxpZiBkZWZpbmVkKF9fbWluaXhfXykgfHwgZGVmaW5lZChfX21pbml4KQogIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX01JTklYICAgICAgMQogIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgIm1pbml4IgpAQCAtNDM1LDE4ICs0ODMsMTggQEAKICNlbmRpZgogI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNikKICMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmTCkKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogIyAgaWYgKFVMT05HX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICNlbmRpZgogI2lmIChMWk9fT1NfRE9TMzIgfHwgTFpPX09TX09TMiB8fCBMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KQogIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZmZmZmTCkKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogIyAgaWYgKFVMT05HX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoQ0lMKSAmJiBkZWZpbmVkKF9HTlVDQykgJiYgZGVmaW5lZChfX0dOVUNfXykKQEAgLTQ2Miw1OSArNTEwLDY1IEBACiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJzZGNjIgogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKFNEQ0MpCiAjZWxpZiBkZWZpbmVkKF9fUEFUSFNDQUxFX18pICYmIGRlZmluZWQoX19QQVRIQ0NfUEFUQ0hMRVZFTF9fKQotIyAgZGVmaW5lIExaT19DQ19QQVRIU0NBTEUgICAgICAoX19QQVRIQ0NfXyAqIDB4MTAwMDBMICsgX19QQVRIQ0NfTUlOT1JfXyAqIDB4MTAwICsgX19QQVRIQ0NfUEFUQ0hMRVZFTF9fKQorIyAgZGVmaW5lIExaT19DQ19QQVRIU0NBTEUgICAgICAoX19QQVRIQ0NfXyAqIDB4MTAwMDBMICsgKF9fUEFUSENDX01JTk9SX18tMCkgKiAweDEwMCArIChfX1BBVEhDQ19QQVRDSExFVkVMX18tMCkpCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQYXRoc2NhbGUgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19QQVRIU0NBTEVfXwotI2VsaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQotIyAgZGVmaW5lIExaT19DQ19JTlRFTEMgICAgICAgICAxCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX1BBVEhTQ0FMRV9HTlVDIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICgoX19JTlRFTF9DT01QSUxFUi0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0lOVEVMQyAgICAgICAgIF9fSU5URUxfQ09NUElMRVIKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkludGVsIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19JTlRFTF9DT01QSUxFUikKLSMgIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKLSMgICAgZGVmaW5lIExaT19DQ19TWU5UQVhfTVNDIDEKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DQ19TWU5UQVhfR05VQyAxCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgICAgZGVmaW5lIExaT19DQ19JTlRFTENfTVNDICAgX01TQ19WRVIKKyMgIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19DQ19JTlRFTENfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKICMgIGVuZGlmCiAjZWxpZiBkZWZpbmVkKF9fUE9DQ19fKSAmJiBkZWZpbmVkKF9XSU4zMikKICMgIGRlZmluZSBMWk9fQ0NfUEVMTEVTQyAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiUGVsbGVzIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19QT0NDX18pCi0jZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX2xsdm1fXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyNlbGlmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQogIyAgaWYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQotIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HX0dOVUMgICAoX19HTlVDX18gKiAweDEwMDAwTCArIF9fR05VQ19NSU5PUl9fICogMHgxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0FSTUNDX0dOVUMgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCiAjICBlbHNlCi0jICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkdfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCkKKyMgICAgZGVmaW5lIExaT19DQ19BUk1DQ19HTlVDICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCkKICMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0NDX0FSTUNDICAgICAgICAgIF9fQVJNQ0NfVkVSU0lPTgorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiQVJNIEMgQ29tcGlsZXIiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIF9fVkVSU0lPTl9fCisjZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX2xsdm1fXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKICMgIGlmIGRlZmluZWQoX19jbGFuZ19tYWpvcl9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfbWlub3JfXykgJiYgZGVmaW5lZChfX2NsYW5nX3BhdGNobGV2ZWxfXykKLSMgICAgZGVmaW5lIExaT19DQ19DTEFOR19DTEFORyAgKF9fY2xhbmdfbWFqb3JfXyAqIDB4MTAwMDBMICsgX19jbGFuZ19taW5vcl9fICogMHgxMDAgKyBfX2NsYW5nX3BhdGNobGV2ZWxfXykKKyMgICAgZGVmaW5lIExaT19DQ19DTEFORyAgICAgICAgKF9fY2xhbmdfbWFqb3JfXyAqIDB4MTAwMDBMICsgKF9fY2xhbmdfbWlub3JfXy0wKSAqIDB4MTAwICsgKF9fY2xhbmdfcGF0Y2hsZXZlbF9fLTApKQogIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HX0NMQU5HICAweDAyMDcwMEwKKyMgICAgZGVmaW5lIExaT19DQ19DTEFORyAgICAgICAgMHgwMTAwMDBMCiAjICBlbmRpZgotIyAgZGVmaW5lIExaT19DQ19DTEFORyAgICAgICAgICBMWk9fQ0NfQ0xBTkdfR05VQworIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKChfTVNDX1ZFUi0wKSA+IDApCisjICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkdfTVNDICAgIF9NU0NfVkVSCisjICBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisjICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkdfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKKyMgIGVuZGlmCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJjbGFuZyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KICNlbGlmIGRlZmluZWQoX19sbHZtX18pICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCiAjICBpZiBkZWZpbmVkKF9fR05VQ19QQVRDSExFVkVMX18pCi0jICAgIGRlZmluZSBMWk9fQ0NfTExWTV9HTlVDICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBMWk9fQ0NfTExWTV9HTlVDICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKICMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DQ19MTFZNX0dOVUMgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyBfX0dOVUNfTUlOT1JfXyAqIDB4MTAwKQorIyAgICBkZWZpbmUgTFpPX0NDX0xMVk1fR05VQyAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwKQogIyAgZW5kaWYKICMgIGRlZmluZSBMWk9fQ0NfTExWTSAgICAgICAgICAgTFpPX0NDX0xMVk1fR05VQwogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAibGx2bS1nY2MiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIF9fVkVSU0lPTl9fCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQotIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIF9fR05VQ19NSU5PUl9fICogMHgxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQotIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKQotIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIF9fR05VQ19NSU5PUl9fICogMHgxMDApCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMKQotIyAgZW5kaWYKLSMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgImdjYyIKLSMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KICNlbGlmIGRlZmluZWQoX19BQ0tfXykgJiYgZGVmaW5lZChfQUNLKQogIyAgZGVmaW5lIExaT19DQ19BQ0sgICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBbXN0ZXJkYW0gQ29tcGlsZXIgS2l0IEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VsaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19DQ19BUk1DQyAgICAgICAgICBfX0FSTUNDX1ZFUlNJT04KKyMgIGRlZmluZSBMWk9fQ0NfQVJNQ0NfQVJNQ0MgICAgX19BUk1DQ19WRVJTSU9OCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBUk0gQyBDb21waWxlciIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0FSTUNDX1ZFUlNJT04pCiAjZWxpZiBkZWZpbmVkKF9fQVpURUNfQ19fKQogIyAgZGVmaW5lIExaT19DQ19BWlRFQ0MgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBenRlYyBDIgpAQCAtNTM5LDEwICs1OTMsMjMgQEAKICMgIGRlZmluZSBMWk9fQ0NfREVDQyAgICAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiREVDIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19ERUNDKQorI2VsaWYgKGRlZmluZWQoX19naHMpIHx8IGRlZmluZWQoX19naHNfXykpICYmIGRlZmluZWQoX19HSFNfVkVSU0lPTl9OVU1CRVIpICYmICgoX19HSFNfVkVSU0lPTl9OVU1CRVItMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19HSFMgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJHcmVlbiBIaWxscyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fR0hTX1ZFUlNJT05fTlVNQkVSKQorIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKChfTVNDX1ZFUi0wKSA+IDApCisjICAgIGRlZmluZSBMWk9fQ0NfR0hTX01TQyAgICAgIF9NU0NfVkVSCisjICBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisjICAgIGRlZmluZSBMWk9fQ0NfR0hTX0dOVUMgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKKyMgIGVuZGlmCiAjZWxpZiBkZWZpbmVkKF9fSElHSENfXykKICMgIGRlZmluZSBMWk9fQ0NfSElHSEMgICAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiTWV0YVdhcmUgSGlnaCBDIgogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbGlmIGRlZmluZWQoX19IUF9hQ0MpICYmICgoX19IUF9hQ0MtMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19IUEFDQyAgICAgICAgICBfX0hQX2FDQworIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSFAgYUNDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fSFBfYUNDKQogI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQogIyAgZGVmaW5lIExaT19DQ19JQVJDICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJJQVIgQyIKQEAgLTU1MSwxMCArNjE4LDE0IEBACiAjICBlbHNlCiAjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICJ1bmtub3duIgogIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQoX19JQk1DX18pCi0jICBkZWZpbmUgTFpPX0NDX0lCTUMgICAgICAgICAgIDEKKyNlbGlmIGRlZmluZWQoX19JQk1DX18pICYmICgoX19JQk1DX18tMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19JQk1DICAgICAgICAgICBfX0lCTUNfXwogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSUJNIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19JQk1DX18pCisjZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmICgoX19JQk1DUFBfXy0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0lCTUMgICAgICAgICAgIF9fSUJNQ1BQX18KKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIklCTSBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fSUJNQ1BQX18pCiAjZWxpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQogIyAgZGVmaW5lIExaT19DQ19LRUlMQyAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJLZWlsIEMiCkBAIC01NzEsMTYgKzY0Miw4IEBACiAjICBlbHNlCiAjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICJ1bmtub3duIgogIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0jICBkZWZpbmUgTFpPX0NDX01TQyAgICAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIk1pY3Jvc29mdCBDIgotIyAgaWYgZGVmaW5lZChfTVNDX0ZVTExfVkVSKQotIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfTVNDX0ZVTExfVkVSKQotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKQotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKLSMgIGRlZmluZSBMWk9fQ0NfTVdFUktTICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiAoKF9fTVdFUktTX18tMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19NV0VSS1MgICAgICAgICBfX01XRVJLU19fCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJNZXRyb3dlcmtzIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19NV0VSS1NfXykKICNlbGlmIChkZWZpbmVkKF9fTkRQQ19fKSB8fCBkZWZpbmVkKF9fTkRQWF9fKSkgJiYgZGVmaW5lZChfX2kzODYpCkBAIC01OTEsNiArNjU0LDE1IEBACiAjICBkZWZpbmUgTFpPX0NDX1BBQ0lGSUNDICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlBhY2lmaWMgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BBQ0lGSUNfXykKKyNlbGlmIGRlZmluZWQoX19QR0kpICYmIGRlZmluZWQoX19QR0lDX18pICYmIGRlZmluZWQoX19QR0lDX01JTk9SX18pCisjICBpZiBkZWZpbmVkKF9fUEdJQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBMWk9fQ0NfUEdJICAgICAgICAgIChfX1BHSUNfXyAqIDB4MTAwMDBMICsgKF9fUEdJQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19QR0lDX1BBVENITEVWRUxfXy0wKSkKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BHSUNfXykgIi4iIExaT19QUF9NQUNST19FWFBBTkQoX19QR0lDX01JTk9SX18pICIuIiBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEdJQ19QQVRDSExFVkVMX18pCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfUEdJICAgICAgICAgIChfX1BHSUNfXyAqIDB4MTAwMDBMICsgKF9fUEdJQ19NSU5PUl9fLTApICogMHgxMDApCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19QR0lDX18pICIuIiBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEdJQ19NSU5PUl9fKSAiLjAiCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiUG9ydGxhbmQgR3JvdXAgUEdJIEMiCiAjZWxpZiBkZWZpbmVkKF9fUEdJKSAmJiAoZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKICMgIGRlZmluZSBMWk9fQ0NfUEdJICAgICAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiUG9ydGxhbmQgR3JvdXAgUEdJIEMiCkBAIC02MDUsNyArNjc3LDcgQEAKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1NDX18pCiAjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJTdW5Qcm8gQyIKLSMgIGlmICgoX19TVU5QUk9fQykrMCA+IDApCisjICBpZiAoKF9fU1VOUFJPX0MtMCkgPiAwKQogIyAgICBkZWZpbmUgTFpPX0NDX1NVTlBST0MgICAgICBfX1NVTlBST19DCiAjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19TVU5QUk9fQykKICMgIGVsc2UKQEAgLTYxNCw3ICs2ODYsNyBAQAogIyAgZW5kaWYKICNlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJTdW5Qcm8gQyIKLSMgIGlmICgoX19TVU5QUk9fQ0MpKzAgPiAwKQorIyAgaWYgKChfX1NVTlBST19DQy0wKSA+IDApCiAjICAgIGRlZmluZSBMWk9fQ0NfU1VOUFJPQyAgICAgIF9fU1VOUFJPX0NDCiAjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19TVU5QUk9fQ0MpCiAjICBlbHNlCkBAIC02NDAsMTYgKzcxMiw0NiBAQAogI2VsaWYgZGVmaW5lZChfX1pUQ19fKQogIyAgZGVmaW5lIExaT19DQ19aT1JURUNIQyAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJab3J0ZWNoIEMiCi0jICBpZiAoX19aVENfXyA9PSAweDMxMCkKKyMgIGlmICgoX19aVENfXy0wKSA9PSAweDMxMCkKICMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgIjB4MzEwIgogIyAgZWxzZQogIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fWlRDX18pCiAjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgIGlmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19HTlVDICAgICAgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCkKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJnY2MiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIF9fVkVSU0lPTl9fCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfTVNDICAgICAgICAgICAgX01TQ19WRVIKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIk1pY3Jvc29mdCBDIgorIyAgaWYgZGVmaW5lZChfTVNDX0ZVTExfVkVSKQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfTVNDX0ZVTExfVkVSKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKQorIyAgZW5kaWYKICNlbHNlCiAjICBkZWZpbmUgTFpPX0NDX1VOS05PV04gICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgInVua25vd24iCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgogI2VuZGlmCisjaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fT1BFTjY0X18pCisjICBpZiBkZWZpbmVkKF9fT1BFTkNDX18pICYmIGRlZmluZWQoX19PUEVOQ0NfTUlOT1JfXykgJiYgZGVmaW5lZChfX09QRU5DQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBMWk9fQ0NfT1BFTjY0ICAgICAgIChfX09QRU5DQ19fICogMHgxMDAwMEwgKyAoX19PUEVOQ0NfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fT1BFTkNDX1BBVENITEVWRUxfXy0wKSkKKyMgICAgZGVmaW5lIExaT19DQ19PUEVONjRfR05VQyAgTFpPX0NDX0dOVUMKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19QQ0NfXykKKyMgIGlmIGRlZmluZWQoX19QQ0NfXykgJiYgZGVmaW5lZChfX1BDQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fUENDX01JTk9STUlOT1JfXykKKyMgICAgZGVmaW5lIExaT19DQ19QQ0MgICAgICAgICAgKF9fUENDX18gKiAweDEwMDAwTCArIChfX1BDQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19QQ0NfTUlOT1JNSU5PUl9fLTApKQorIyAgICBkZWZpbmUgTFpPX0NDX1BDQ19HTlVDICAgICBMWk9fQ0NfR05VQworIyAgZW5kaWYKKyNlbmRpZgogI2lmIDAgJiYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiAhZGVmaW5lZChfTVNDX0ZVTExfVkVSKQogIyAgZXJyb3IgIkxaT19DQ19NU0M6IF9NU0NfRlVMTF9WRVIgaXMgbm90IGRlZmluZWQiCiAjZW5kaWYKQEAgLTY2Nyw4ICs3NjksMTAgQEAKICMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJnZW5lcmljIgogI2VsaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2KQogIyAgZGVmaW5lIExaT19BUkNIX0kwODYgICAgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19BUkNIX0lBMTYgICAgICAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImkwODYiCisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorIyAgZGVmaW5lIExaT19BUkNIX0FSTTY0ICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImFybTY0IgogI2VsaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hbHBoYSkgfHwgZGVmaW5lZChfTV9BTFBIQSkKICMgIGRlZmluZSBMWk9fQVJDSF9BTFBIQSAgICAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJhbHBoYSIKQEAgLTY4NCwxMCArNzg4LDEwIEBACiAjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiYXJtX3RodW1iIgogI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fSUNDQVJNX18pCiAjICBkZWZpbmUgTFpPX0FSQ0hfQVJNICAgICAgICAgICAgICAxCi0jICBpZiBkZWZpbmVkKF9fQ1BVX01PREVfXykgJiYgKChfX0NQVV9NT0RFX18pKzAgPT0gMSkKKyMgIGlmIGRlZmluZWQoX19DUFVfTU9ERV9fKSAmJiAoKF9fQ1BVX01PREVfXy0wKSA9PSAxKQogIyAgICBkZWZpbmUgTFpPX0FSQ0hfQVJNX1RIVU1CICAgICAgMQogIyAgICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgImFybV90aHVtYiIKLSMgIGVsaWYgZGVmaW5lZChfX0NQVV9NT0RFX18pICYmICgoX19DUFVfTU9ERV9fKSswID09IDIpCisjICBlbGlmIGRlZmluZWQoX19DUFVfTU9ERV9fKSAmJiAoKF9fQ1BVX01PREVfXy0wKSA9PSAyKQogIyAgICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgImFybSIKICMgIGVsc2UKICMgICAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICJhcm0iCkBAIC04MDUsNTMgKzkwOSwxNDcgQEAKICMgIGVycm9yICJGSVhNRSAtIG1pc3NpbmcgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgogI2VuZGlmCiAjaWYgMSAmJiAoTFpPX0FSQ0hfVU5LTk9XTikgJiYgKExaT19PU19XSU4zMikKLSMgIGVycm9yICJGSVhNRSAtIG1pc3NpbmcgV0lOMzIgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBMWk9fT1NfV0lOMzIgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgogI2VuZGlmCiAjaWYgMSAmJiAoTFpPX0FSQ0hfVU5LTk9XTikgJiYgKExaT19PU19XSU42NCkKLSMgIGVycm9yICJGSVhNRSAtIG1pc3NpbmcgV0lONjQgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBMWk9fT1NfV0lONjQgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgogI2VuZGlmCiAjaWYgKExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYpCiAjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCi0jICBkZWZpbmUgTFpPX0FSQ0hfSUExNlBNICAgICAgICAgICAxCiAjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgZGVmaW5lZChCTFgyODYpKQogIyAgZGVmaW5lIExaT19BUkNIX0kwODZQTSAgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19BUkNIX0lBMTZQTSAgICAgICAgICAgMQogI2VsaWYgMSAmJiAoTFpPX09TX0RPUzE2ICYmIGRlZmluZWQoRE9TWDI4NikpCiAjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCi0jICBkZWZpbmUgTFpPX0FSQ0hfSUExNlBNICAgICAgICAgICAxCiAjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgTFpPX0NDX0JPUkxBTkRDICYmIGRlZmluZWQoX19EUE1JMTZfXykpCiAjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCi0jICBkZWZpbmUgTFpPX0FSQ0hfSUExNlBNICAgICAgICAgICAxCiAjZW5kaWYKLSNpZiAoTFpPX0FSQ0hfQVJNX1RIVU1CKSAmJiAhKExaT19BUkNIX0FSTSkKLSMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorI2lmIChMWk9fQVJDSF9BTUQ2NCAmJiAhTFpPX0FSQ0hfWDY0KQorIyAgZGVmaW5lIExaT19BUkNIX1g2NCAgICAgICAgICAgICAgMQorI2VsaWYgKCFMWk9fQVJDSF9BTUQ2NCAmJiBMWk9fQVJDSF9YNjQpICYmIGRlZmluZWQoX19MWk9fQVJDSF9PVkVSUklERSkKKyMgIGRlZmluZSBMWk9fQVJDSF9BTUQ2NCAgICAgICAgICAgIDEKICNlbmRpZgotI2lmIChMWk9fQVJDSF9JMDg2UE0pICYmICEoTFpPX0FSQ0hfSTA4NikKLSMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorI2lmIChMWk9fQVJDSF9BUk02NCAmJiAhTFpPX0FSQ0hfQUFSQ0g2NCkKKyMgIGRlZmluZSBMWk9fQVJDSF9BQVJDSDY0ICAgICAgICAgIDEKKyNlbGlmICghTFpPX0FSQ0hfQVJNNjQgJiYgTFpPX0FSQ0hfQUFSQ0g2NCkgJiYgZGVmaW5lZChfX0xaT19BUkNIX09WRVJSSURFKQorIyAgZGVmaW5lIExaT19BUkNIX0FSTTY0ICAgICAgICAgICAgMQorI2VuZGlmCisjaWYgKExaT19BUkNIX0kzODYgJiYgIUxaT19BUkNIX1g4NikKKyMgIGRlZmluZSBMWk9fQVJDSF9YODYgICAgICAgICAgICAgIDEKKyNlbGlmICghTFpPX0FSQ0hfSTM4NiAmJiBMWk9fQVJDSF9YODYpICYmIGRlZmluZWQoX19MWk9fQVJDSF9PVkVSUklERSkKKyMgIGRlZmluZSBMWk9fQVJDSF9JMzg2ICAgICAgICAgICAgMQorI2VuZGlmCisjaWYgKExaT19BUkNIX0FNRDY0ICYmICFMWk9fQVJDSF9YNjQpIHx8ICghTFpPX0FSQ0hfQU1ENjQgJiYgTFpPX0FSQ0hfWDY0KQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk02NCAmJiAhTFpPX0FSQ0hfQUFSQ0g2NCkgfHwgKCFMWk9fQVJDSF9BUk02NCAmJiBMWk9fQVJDSF9BQVJDSDY0KQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMzg2ICYmICFMWk9fQVJDSF9YODYpIHx8ICghTFpPX0FSQ0hfSTM4NiAmJiBMWk9fQVJDSF9YODYpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0FSTV9USFVNQiAmJiAhTFpPX0FSQ0hfQVJNKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk1fVEhVTUIxICYmICFMWk9fQVJDSF9BUk1fVEhVTUIpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0FSTV9USFVNQjIgJiYgIUxaT19BUkNIX0FSTV9USFVNQikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNX1RIVU1CMSAmJiBMWk9fQVJDSF9BUk1fVEhVTUIyKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMDg2UE0gJiYgIUxaT19BUkNIX0kwODYpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogI2VuZGlmCiAjaWYgKExaT19BUkNIX0kwODYpCiAjICBpZiAoVUlOVF9NQVggIT0gTFpPXzB4ZmZmZkwpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICMgIGlmIChVTE9OR19NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjZW5kaWYKICNpZiAoTFpPX0FSQ0hfSTM4NikKICMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmTCkgJiYgZGVmaW5lZChfX2kzODZfaW50MTZfXykKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZmZmZmTCkgJiYgIWRlZmluZWQoX19pMzg2X2ludDE2X18pCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICMgIGlmIChVTE9OR19NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX0xaT19NTV9PVkVSUklERSkKKyNpZiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9TU0UyKQorIyAgICBpZiBkZWZpbmVkKF9fU1NFMl9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfU1NFMiAgICAgICAxCisjICAgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKChkZWZpbmVkKF9NX0lYODZfRlApICYmICgoX01fSVg4Nl9GUCkrMCA+PSAyKSkgfHwgZGVmaW5lZChfTV9BTUQ2NCkpCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU0UyICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpCisjICBpZiAoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTIpCisjICAgIGlmIGRlZmluZWQoX19TU1NFM19fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMgICAgICAxCisjICAgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfX0FWWF9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9TU0U0XzIpCisjICBpZiAoTFpPX1RBUkdFVF9GRUFUVVJFX1NTU0UzKQorIyAgICBpZiBkZWZpbmVkKF9fU1NFNF8yX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU0U0XzIgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX0FWWCkKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpCisjICAgIGlmIGRlZmluZWQoX19BVlhfXykKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX0FWWCAgICAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYMikKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYKQorIyAgICBpZiBkZWZpbmVkKF9fQVZYMl9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYMiAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMgJiYgIShMWk9fVEFSR0VUX0ZFQVRVUkVfU1NFMikpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19UQVJHRVRfRkVBVFVSRV9TU0U0XzIgJiYgIShMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYICYmICEoTFpPX1RBUkdFVF9GRUFUVVJFX1NTU0UzKSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX1RBUkdFVF9GRUFUVVJFX0FWWDIgJiYgIShMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYKSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNKQorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX05FT04pCisjICAgIGlmIGRlZmluZWQoX19BUk1fTkVPTl9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTiAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0FSTTY0KQorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX05FT04pCisjICAgIGlmIDEKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX05FT04gICAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIDAKKyNlbGlmICFkZWZpbmVkKF9fTFpPX01NX09WRVJSSURFKQogI2lmIChMWk9fQVJDSF9JMDg2KQogI2lmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmTCkKLSMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICNlbmRpZgogI2lmIGRlZmluZWQoX19USU5ZX18pIHx8IGRlZmluZWQoTV9JODZUTSkgfHwgZGVmaW5lZChfTV9JODZUTSkKICMgIGRlZmluZSBMWk9fTU1fVElOWSAgICAgICAgICAgMQpAQCAtODc4LDcgKzEwNzYsNyBAQAogI2VsaWYgKExaT19DQ19aT1JURUNIQyAmJiBkZWZpbmVkKF9fVkNNX18pKQogIyAgZGVmaW5lIExaT19NTV9MQVJHRSAgICAgICAgICAxCiAjZWxzZQotIyAgZXJyb3IgInVua25vd24gbWVtb3J5IG1vZGVsIgorIyAgZXJyb3IgInVua25vd24gTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCiAjZW5kaWYKICNpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYpCiAjZGVmaW5lIExaT19IQVZFX01NX0hVR0VfUFRSICAgICAgICAxCkBAIC05MDEsMTAgKzEwOTksMTAgQEAKICNlbmRpZgogI2lmIChMWk9fQVJDSF9JMDg2UE0pICYmICEoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCiAjICBpZiAoTFpPX09TX0RPUzE2KQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVsaWYgKExaT19DQ19aT1JURUNIQykKICMgIGVsc2UKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTkzNiw3ICsxMTM0LDcgQEAKICNlbmRpZgogI2VsaWYgKExaT19BUkNIX0MxNjYpCiAjaWYgIWRlZmluZWQoX19NT0RFTF9fKQotIyAgZXJyb3IgIkZJWE1FIC0gQzE2NiBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9DMTY2IF9fTU9ERUxfXyIKICNlbGlmICgoX19NT0RFTF9fKSA9PSAwKQogIyAgZGVmaW5lIExaT19NTV9TTUFMTCAgICAgICAgICAxCiAjZWxpZiAoKF9fTU9ERUxfXykgPT0gMSkKQEAgLTk1MCwxMSArMTE0OCwxMSBAQAogI2VsaWYgKChfX01PREVMX18pID09IDUpCiAjICBkZWZpbmUgTFpPX01NX1hTTUFMTCAgICAgICAgIDEKICNlbHNlCi0jICBlcnJvciAiRklYTUUgLSBDMTY2IF9fTU9ERUxfXyIKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX0MxNjYgX19NT0RFTF9fIgogI2VuZGlmCiAjZWxpZiAoTFpPX0FSQ0hfTUNTMjUxKQogI2lmICFkZWZpbmVkKF9fTU9ERUxfXykKLSMgIGVycm9yICJGSVhNRSAtIE1DUzI1MSBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1MyNTEgX19NT0RFTF9fIgogI2VsaWYgKChfX01PREVMX18pID09IDApCiAjICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAgIDEKICNlbGlmICgoX19NT0RFTF9fKSA9PSAyKQpAQCAtOTY2LDExICsxMTY0LDExIEBACiAjZWxpZiAoKF9fTU9ERUxfXykgPT0gNSkKICMgIGRlZmluZSBMWk9fTU1fWFNNQUxMICAgICAgICAgMQogI2Vsc2UKLSMgIGVycm9yICJGSVhNRSAtIE1DUzI1MSBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1MyNTEgX19NT0RFTF9fIgogI2VuZGlmCiAjZWxpZiAoTFpPX0FSQ0hfTUNTNTEpCiAjaWYgIWRlZmluZWQoX19NT0RFTF9fKQotIyAgZXJyb3IgIkZJWE1FIC0gTUNTNTEgX19NT0RFTF9fIgorIyAgZXJyb3IgIkZJWE1FIC0gTFpPX0FSQ0hfTUNTNTEgX19NT0RFTF9fIgogI2VsaWYgKChfX01PREVMX18pID09IDEpCiAjICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAgIDEKICNlbGlmICgoX19NT0RFTF9fKSA9PSAyKQpAQCAtOTgyLDcgKzExODAsNyBAQAogI2VsaWYgKChfX01PREVMX18pID09IDUpCiAjICBkZWZpbmUgTFpPX01NX1hTTUFMTCAgICAgICAgIDEKICNlbHNlCi0jICBlcnJvciAiRklYTUUgLSBNQ1M1MSBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1M1MSBfX01PREVMX18iCiAjZW5kaWYKICNlbGlmIChMWk9fQVJDSF9DUkFZX1BWUCkKICMgIGRlZmluZSBMWk9fTU1fUFZQICAgICAgICAgICAgMQpAQCAtMTAwOSw1NjcgKzEyMDcsMTU2IEBACiAjICBlcnJvciAidW5rbm93biBtZW1vcnkgbW9kZWwiCiAjZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX1NIT1JUKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgICAgKFNJWkVPRl9TSE9SVCkKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX0lOVCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChTSVpFT0ZfSU5UKQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfTE9ORykKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAgIChTSVpFT0ZfTE9ORykKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChTSVpFT0ZfTE9OR19MT05HKQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQxNikKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UMTYgICAgICAgIChTSVpFT0ZfX19JTlQxNikKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX19fSU5UMzIpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDMyICAgICAgICAoU0laRU9GX19fSU5UMzIpCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgKFNJWkVPRl9fX0lOVDY0KQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfVk9JRF9QKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgKFNJWkVPRl9WT0lEX1ApCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNJWkVPRl9TSVpFX1QpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICAoU0laRU9GX1NJWkVfVCkKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX1BUUkRJRkZfVCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIChTSVpFT0ZfUFRSRElGRl9UKQotI2VuZGlmCi0jZGVmaW5lIF9fTFpPX0xTUih4LGIpICAgICgoKHgpKzB1bCkgPj4gKGIpKQotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfU0hPUlQpCi0jICBpZiAoTFpPX0FSQ0hfQ1JBWV9QVlApCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICA4Ci0jICBlbGlmIChVU0hSVF9NQVggPT0gTFpPXzB4ZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAyCi0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAxCi0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDE1KSA9PSAxKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgMgotIyAgZWxpZiAoX19MWk9fTFNSKFVTSFJUX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsNjMpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICA4Ci0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDEyNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDE2Ci0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fU0laRU9GX1NIT1JUIgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfSU5UKQotIyAgaWYgKExaT19BUkNIX0NSQVlfUFZQKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9JTlQgICAgICAgICAgOAotIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAyCi0jICBlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICA0Ci0jICBlbGlmIChfX0xaT19MU1IoVUlOVF9NQVgsNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDEKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxNSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDIKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCw2MykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDgKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxMjcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAxNgotIyAgZWxzZQotIyAgICBlcnJvciAiTFpPX1NJWkVPRl9JTlQiCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HKQotIyAgaWYgKFVMT05HX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA0Ci0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxCi0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDE1KSA9PSAxKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgMgotIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVTE9OR19NQVgsNjMpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA4Ci0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDEyNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDE2Ci0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fU0laRU9GX0xPTkciCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKLSNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQotIyAgaWYgZGVmaW5lZChfX0xPTkdfTUFYX18pICYmIGRlZmluZWQoX19MT05HX0xPTkdfTUFYX18pCi0jICAgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDMwMHVsKQotIyAgICAgIGlmICgoX19MT05HX01BWF9fKSswID09IChfX0xPTkdfTE9OR19NQVhfXykrMCkKLSMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIExaT19TSVpFT0ZfTE9ORwotIyAgICAgIGVsaWYgKF9fTFpPX0xTUihfX0xPTkdfTE9OR19NQVhfXywzMCkgPT0gMSkKLSMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDQKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKLSNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQotI2lmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19ETUMpCi0jZWxpZiAoTFpPX0NDX0NJTExZKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4Ci0jZWxpZiAoTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjY0KSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfRE1DKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfU1lNQU5URUNDICYmIChfX1NDX18gPj0gMHg3MDApKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDICYmIGRlZmluZWQoX19saW51eF9fKSkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX01XRVJLUyB8fCBMWk9fQ0NfUEVMTEVTQyB8fCBMWk9fQ0NfUEdJIHx8IExaT19DQ19TVU5QUk9DKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAotI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgZGVmaW5lZChfV0lOMzIpKSAmJiAoTFpPX0NDX01TQykpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTIwKSkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDExMDApKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKLSNlbGlmIChMWk9fQ0NfV0FUQ09NQyAmJiBkZWZpbmVkKF9JTlRFR1JBTF9NQVhfQklUUykgJiYgKF9JTlRFR1JBTF9NQVhfQklUUyA9PSA2NCkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKExaT19DQ19TRENDKSAmJiAoTFpPX1NJWkVPRl9JTlQgPT0gMikKLSNlbGlmIDEgJiYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIChMWk9fQ0NfR05VQykKLSMgIGlmIChMWk9fQ0NfR05VQyA8IDB4MDIwODAwdWwpCi0jICAgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKExaT19DRkdfTk9fTE9OR19MT05HKSB8fCBkZWZpbmVkKF9fTk9fTE9OR19MT05HKQotIyAgdW5kZWYgTFpPX1NJWkVPRl9MT05HX0xPTkcKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQotI2lmIChMWk9fQVJDSF9JMDg2KQotIyAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgICAgMgotIyAgaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZWxpZiAoTFpPX01NX0NPTVBBQ1QgfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAotIyAgZWxzZQotIyAgICBlcnJvciAiTFpPX01NIgotIyAgZW5kaWYKLSNlbGlmIChMWk9fQVJDSF9BVlIgfHwgTFpPX0FSQ0hfWjgwKQotIyAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgotI2VsaWYgKExaT19BUkNIX0MxNjYgfHwgTFpPX0FSQ0hfTUNTNTEgfHwgTFpPX0FSQ0hfTUNTMjUxIHx8IExaT19BUkNIX01TUDQzMCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDIKLSNlbGlmIChMWk9fQVJDSF9IODMwMCkKLSMgIGlmIGRlZmluZWQoX19OT1JNQUxfTU9ERV9fKQotIyAgICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgNAotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykgfHwgZGVmaW5lZChfX0g4MzAwU1hfXykKLSMgICAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgIDQKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgIDIKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDIKLSMgIGVuZGlmCi0jICBpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwNDAwMDB1bCkpICYmIChMWk9fU0laRU9GX0lOVCA9PSA0KQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgTFpPX1NJWkVPRl9JTlQKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfSU5UCi0jICBlbmRpZgotI2VsaWYgKExaT19BUkNIX00xNkMpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICAyCi0jICBpZiBkZWZpbmVkKF9fbTMyY19jcHVfXykgfHwgZGVmaW5lZChfX20zMmNtX2NwdV9fKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZW5kaWYKLSNlbGlmIChMWk9fU0laRU9GX0xPTkcgPT0gOCkgJiYgKChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICA4Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0Ci0jZWxpZiBkZWZpbmVkKF9fTExQNjRfXykgfHwgZGVmaW5lZChfX0xMUDY0KSB8fCBkZWZpbmVkKF9MTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICA4Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4Ci0jZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfTE9ORwotI2VsaWYgKExaT19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDE2Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfTE9ORwotI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgOAotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgICBMWk9fU0laRU9GX0xPTkcKLSNlbGlmIChMWk9fQVJDSF9TUFUpCi0jIGlmIDAKLSMgIGRlZmluZSBfX0xaT19XT1JEU0laRSAgICAgICAgICAgIDE2Ci0jIGVuZGlmCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0Ci0jZWxzZQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19XT1JEU0laRSkKLSMgIGlmIGRlZmluZWQoX19MWk9fV09SRFNJWkUpCi0jICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICBfX0xaT19XT1JEU0laRQotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKLSNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9NMTZDKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgMgotI2Vsc2UKLSMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfVk9JRF9QCi0jZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfUFRSRElGRl9UKQotI2lmIChMWk9fQVJDSF9JMDg2KQotIyAgaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNIHx8IExaT19NTV9IVUdFKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgTFpPX1NJWkVPRl9WT0lEX1AKLSMgIGVsaWYgKExaT19NTV9DT01QQUNUIHx8IExaT19NTV9MQVJHRSkKLSMgICAgaWYgKExaT19DQ19CT1JMQU5EQyB8fCBMWk9fQ0NfVFVSQk9DKQotIyAgICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgNAotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAyCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fTU0iCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfU0laRV9UCi0jZW5kaWYKLSNlbmRpZgotI2lmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQotIyAgdW5kZWYgTFpPX0FCSV9CSUdfRU5ESUFOCi0jICB1bmRlZiBMWk9fQUJJX0xJVFRMRV9FTkRJQU4KLSNlbGlmICEoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAhKExaT19BQklfTElUVExFX0VORElBTikKLSNpZiAoTFpPX0FSQ0hfQUxQSEEpICYmIChMWk9fQVJDSF9DUkFZX01QUCkKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIChMWk9fQVJDSF9JQTY0KSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYIHx8IExaT19PU19XSU42NCkKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIChMWk9fQVJDSF9BTFBIQSB8fCBMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9CTEFDS0ZJTiB8fCBMWk9fQVJDSF9DUklTIHx8IExaT19BUkNIX0kwODYgfHwgTFpPX0FSQ0hfSTM4NiB8fCBMWk9fQVJDSF9NU1A0MzApCi0jICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCi0jZWxpZiAoTFpPX0FSQ0hfQVZSMzIgfHwgTFpPX0FSQ0hfTTY4SyB8fCBMWk9fQVJDSF9TMzkwKQotIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQotI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCi0jICBpZiAoX19MSVRUTEVfRU5ESUFOX18gPT0gMSkKLSMgICAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgIDEKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgIDEKLSMgIGVuZGlmCi0jZWxpZiAxICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQotIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQotI2VsaWYgMSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVCX18pICYmICFkZWZpbmVkKF9fQVJNRUxfXykKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVMX18pICYmICFkZWZpbmVkKF9fQVJNRUJfXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUJfXykgJiYgIWRlZmluZWQoX19NSVBTRUxfXykKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUxfXykgJiYgIWRlZmluZWQoX19NSVBTRUJfXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbmRpZgotI2VuZGlmCi0jaWYgKExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BQklfTElUVExFX0VORElBTikKLSMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgotI2VuZGlmCi0jaWYgKExaT19BQklfQklHX0VORElBTikKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJiZSIKLSNlbGlmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCi0jICBkZWZpbmUgTFpPX0lORk9fQUJJX0VORElBTiAgICAgICAibGUiCi0jZWxpZiAoTFpPX0FCSV9ORVVUUkFMX0VORElBTikKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJuZXV0cmFsIgotI2VuZGlmCi0jaWYgKExaT19TSVpFT0ZfSU5UID09IDEgJiYgTFpPX1NJWkVPRl9MT05HID09IDIgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gMikKLSMgIGRlZmluZSBMWk9fQUJJX0k4TFAxNiAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImk4bHAxNiIKLSNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSAyICYmIExaT19TSVpFT0ZfTE9ORyA9PSAyICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDIpCi0jICBkZWZpbmUgTFpPX0FCSV9JTFAxNiAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDE2IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDQgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKLSMgIGRlZmluZSBMWk9fQUJJX0lMUDMyICAgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMzIiCi0jZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA4ICYmIExaT19TSVpFT0ZfU0laRV9UID09IDgpCi0jICBkZWZpbmUgTFpPX0FCSV9MTFA2NCAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImxscDY0IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gOCkKLSMgIGRlZmluZSBMWk9fQUJJX0xQNjQgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAibHA2NCIKLSNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSA4ICYmIExaT19TSVpFT0ZfTE9ORyA9PSA4ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDgpCi0jICBkZWZpbmUgTFpPX0FCSV9JTFA2NCAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDY0IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKLSMgIGRlZmluZSBMWk9fQUJJX0lQMzJMNjQgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaXAzMmw2NCIKLSNlbmRpZgotI2lmICFkZWZpbmVkKF9fTFpPX0xJQkNfT1ZFUlJJREUpCi0jaWYgKExaT19MSUJDX05BS0VEKQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmFrZWQiCi0jZWxpZiAoTFpPX0xJQkNfRlJFRVNUQU5ESU5HKQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZnJlZXN0YW5kaW5nIgotI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJtZnJlZXN0YW5kaW5nIgotI2VsaWYgKExaT19MSUJDX0lTT0M5MCkKLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKLSNlbGlmIChMWk9fTElCQ19JU09DOTkpCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTkiCi0jZWxpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKLSMgIGRlZmluZSBMWk9fTElCQ19ESUVUTElCQyAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZGlldGxpYmMiCi0jZWxpZiBkZWZpbmVkKF9ORVdMSUJfVkVSU0lPTikKLSMgIGRlZmluZSBMWk9fTElCQ19ORVdMSUIgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmV3bGliIgotI2VsaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pICYmIGRlZmluZWQoX19VQ0xJQkNfTUlOT1JfXykKLSMgIGlmIGRlZmluZWQoX19VQ0xJQkNfU1VCTEVWRUxfXykKLSMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgKF9fVUNMSUJDX01BSk9SX18gKiAweDEwMDAwTCArIF9fVUNMSUJDX01JTk9SX18gKiAweDEwMCArIF9fVUNMSUJDX1NVQkxFVkVMX18pCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fTElCQ19VQ0xJQkMgICAgIDB4MDAwOTBiTAotIyAgZW5kaWYKLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgInVjbGliYyIKLSNlbGlmIGRlZmluZWQoX19HTElCQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfTUlOT1JfXykKLSMgIGRlZmluZSBMWk9fTElCQ19HTElCQyAgICAgICAgKF9fR0xJQkNfXyAqIDB4MTAwMDBMICsgX19HTElCQ19NSU5PUl9fICogMHgxMDApCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJnbGliYyIKLSNlbGlmIChMWk9fQ0NfTVdFUktTKSAmJiBkZWZpbmVkKF9fTVNMX18pCi0jICBkZWZpbmUgTFpPX0xJQkNfTVNMICAgICAgICAgIF9fTVNMX18KLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgIm1zbCIKLSNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQotIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCi0jZWxzZQotIyAgZGVmaW5lIExaT19MSUJDX0RFRkFVTFQgICAgICAxCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJkZWZhdWx0IgotI2VuZGlmCi0jZW5kaWYKICNpZiAhZGVmaW5lZChfX2x6b19nbnVjX2V4dGVuc2lvbl9fKQogI2lmIChMWk9fQ0NfR05VQyA+PSAweDAyMDgwMHVsKQogIyAgZGVmaW5lIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gICAgX19leHRlbnNpb25fXwotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gICAgX19leHRlbnNpb25fXworI2VsaWYgKExaT19DQ19JQk1DID49IDYwMCkKICMgIGRlZmluZSBfX2x6b19nbnVjX2V4dGVuc2lvbl9fICAgIF9fZXh0ZW5zaW9uX18KICNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2dudWNfZXh0ZW5zaW9uX18pCiAjICBkZWZpbmUgX19sem9fZ251Y19leHRlbnNpb25fXyAgICAvKmVtcHR5Ki8KICNlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fdWFfdm9sYXRpbGUpCi0jICBkZWZpbmUgX19sem9fdWFfdm9sYXRpbGUgICAgIHZvbGF0aWxlCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19hbGlnbm9mKQotI2lmIChMWk9fQ0NfQ0lMTFkgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgTFpPX0NDX1BHSSkKLSMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDcwMCkpCi0jICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZl9fKGUpCi0jZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCi0jICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZihlKQotI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQotIyAgZGVmaW5lIF9fbHpvX2FsaWdub2YoZSkgICAgICBfX2FsaWdub2ZfXyhlKQotI2VuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCi0jICBkZWZpbmUgX19sem9fSEFWRV9hbGlnbm9mIDEKLSNlbmRpZgotI2lmICFkZWZpbmVkKF9fbHpvX2NvbnN0cnVjdG9yKQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQotI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCi0jICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCi0jICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fY29uc3RydWN0b3IpCi0jICBkZWZpbmUgX19sem9fSEFWRV9jb25zdHJ1Y3RvciAxCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19kZXN0cnVjdG9yKQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXyxfX3VzZWRfXykpCi0jZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMjA3MDB1bCkKLSMgIGRlZmluZSBfX2x6b19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fZGVzdHJ1Y3RvcikKLSMgIGRlZmluZSBfX2x6b19IQVZFX2Rlc3RydWN0b3IgMQotI2VuZGlmCi0jaWYgKF9fbHpvX0hBVkVfZGVzdHJ1Y3RvcikgJiYgIShfX2x6b19IQVZFX2NvbnN0cnVjdG9yKQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19pbmxpbmUpCi0jaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKLSNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQotI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX0NJTExZIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KLSNlbGlmIChMWk9fQ0NfRE1DKQotIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQotI2VsaWYgKExaT19DQ19JTlRFTEMpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDI0MDUpKQotIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQotI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDkwMCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX1NVTlBST0MgJiYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KLSNlbGlmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKLSMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgaW5saW5lCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9faW5saW5lKQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfaW5saW5lIDEKLSNlbHNlCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIC8qZW1wdHkqLwotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fZm9yY2VpbmxpbmUpCi0jaWYgKExaT19DQ19HTlVDID49IDB4MDMwMjAwdWwpCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNDUwKSAmJiBMWk9fQ0NfU1lOVEFYX01TQykKLSMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19mb3JjZWlubGluZQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSAmJiBMWk9fQ0NfU1lOVEFYX0dOVUMpCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKLSMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19mb3JjZWlubGluZQotI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQotIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKLSNlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX2x6b19mb3JjZWlubGluZSkKLSMgIGRlZmluZSBfX2x6b19IQVZFX2ZvcmNlaW5saW5lIDEKLSNlbHNlCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIC8qZW1wdHkqLwotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fbm9pbmxpbmUpCi0jaWYgMSAmJiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19DQ19HTlVDID49IDB4MDQwMDAwdWwpICYmIChMWk9fQ0NfR05VQyA8IDB4MDQwMDAzdWwpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXyxfX3VzZWRfXykpCi0jZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkgJiYgTFpPX0NDX1NZTlRBWF9NU0MpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19kZWNsc3BlYyhub2lubGluZSkKLSNlbGlmIChMWk9fQ0NfTVdFUktTICYmIChfX01XRVJLU19fID49IDB4MzIwMCkgJiYgKExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpKQotIyAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIDAKKyMgIGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkKKyMgICAgZGVmaW5lIExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUyAwCisjICBlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSIDwgMTIwMCkpCisjICAgIGRlZmluZSBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMgMAogIyAgZWxzZQotIyAgICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICBfX2RlY2xzcGVjKG5vaW5saW5lKQorIyAgICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDEKICMgIGVuZGlmCi0jZWxpZiAoTFpPX0NDX1NVTlBST0MgJiYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDAKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCi0jICBkZWZpbmUgX19sem9fSEFWRV9ub2lubGluZSAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGlmIGRlZmluZWQoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICB1bmRlZiBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDAKICNlbmRpZgotI2lmIChfX2x6b19IQVZFX2ZvcmNlaW5saW5lIHx8IF9fbHpvX0hBVkVfbm9pbmxpbmUpICYmICEoX19sem9fSEFWRV9pbmxpbmUpCi0jICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyNpZiAhZGVmaW5lZChMWk9fUkVJTlRFUlBSRVRfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fUkVJTlRFUlBSRVRfQ0FTVCh0LGUpICAgICAgIChyZWludGVycHJldF9jYXN0PHQ+IChlKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19ub3JldHVybikKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMjA3MDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkgJiYgTFpPX0NDX1NZTlRBWF9NU0MpCi0jICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19kZWNsc3BlYyhub3JldHVybikKKyNpZiAhZGVmaW5lZChMWk9fUkVJTlRFUlBSRVRfQ0FTVCkKKyMgIGRlZmluZSBMWk9fUkVJTlRFUlBSRVRfQ0FTVCh0LGUpICAgICAgICAgKCh0KSAoZSkpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU1RBVElDX0NBU1QpCisjICBpZiAoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICBkZWZpbmUgTFpPX1NUQVRJQ19DQVNUKHQsZSkgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dD4gKGUpKQorIyAgZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fbm9yZXR1cm4pCi0jICBkZWZpbmUgX19sem9fSEFWRV9ub3JldHVybiAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fU1RBVElDX0NBU1QpCisjICBkZWZpbmUgTFpPX1NUQVRJQ19DQVNUKHQsZSkgICAgICAgICAgICAgICgodCkgKGUpKQogI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fbm90aHJvdykKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAzMDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNDUwKSAmJiBMWk9fQ0NfU1lOVEFYX01TQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19kZWNsc3BlYyhub3Rocm93KQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gOTAwKSAmJiBMWk9fQ0NfU1lOVEFYX0dOVUMpCi0jICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQotI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjaWYgIWRlZmluZWQoTFpPX1NUQVRJQ19DQVNUMikKKyMgIGRlZmluZSBMWk9fU1RBVElDX0NBU1QyKHQxLHQyLGUpICAgICAgICAgTFpPX1NUQVRJQ19DQVNUKHQxLCBMWk9fU1RBVElDX0NBU1QodDIsIGUpKQogI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAgICAgICAgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgoY29uc3Qgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgogI2VuZGlmCi0jaWYgZGVmaW5lZChfX2x6b19ub3Rocm93KQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfbm90aHJvdyAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fVU5DT05TVF9DQVNUKQorIyAgZGVmaW5lIExaT19VTkNPTlNUX0NBU1QodCxlKSAgICAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKGNvbnN0IHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19yZXN0cmljdCkKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNKQotIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICBfX3Jlc3RyaWN0X18KLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxNDAwKSkKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdAorI2lmICFkZWZpbmVkKExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QpCisjICBpZiAoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAoY29uc3RfY2FzdDx0PiAoZSkpCisjICBlbGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgICAgZGVmaW5lIExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QodCxlKSAgKCh0KSAoZSkpCisjICBlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgICAgZGVmaW5lIExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QodCxlKSAgKCh0KSAoKHZvbGF0aWxlIHZvaWQgKikgKChsem9fdWludHB0cl90KSAoKHZvbGF0aWxlIGNvbnN0IHZvaWQgKikgKGUpKSkpKQorIyAgZW5kaWYKICNlbmRpZgorI2lmICFkZWZpbmVkKExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QpCisjICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAgICgodCkgKCh2b2xhdGlsZSB2b2lkICopICgodm9sYXRpbGUgY29uc3Qgdm9pZCAqKSAoZSkpKSkKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fcmVzdHJpY3QpCi0jICBkZWZpbmUgX19sem9fSEFWRV9yZXN0cmljdCAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DQVNUKQorIyAgaWYgKExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUykKKyMgICAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NBU1QodCxlKSAgICAgICAgKGNvbnN0X2Nhc3Q8dD4gKGUpKQorIyAgZWxpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgICgodCkgKGUpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgICgodCkgKCh2b2lkICopICgobHpvX3VpbnRwdHJfdCkgKCh2b2xhdGlsZSB2b2lkICopIChlKSkpKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19saWtlbHkpICYmICFkZWZpbmVkKF9fbHpvX3VubGlrZWx5KQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDIwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApKQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCi0jICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQotIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DQVNUKQorIyAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NBU1QodCxlKSAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKHZvbGF0aWxlIHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKQorIyAgaWYgKExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUykKKyMgICAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NPTlNUX0NBU1QodCxlKSAgKGNvbnN0X2Nhc3Q8dD4gKGUpKQorIyAgZWxpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgICgodCkgKGUpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgICgodCkgKChjb25zdCB2b2lkICopICgobHpvX3VpbnRwdHJfdCkgKCh2b2xhdGlsZSBjb25zdCB2b2lkICopIChlKSkpKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX2xpa2VseSkKLSMgIGRlZmluZSBfX2x6b19IQVZFX2xpa2VseSAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKQorIyAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NPTlNUX0NBU1QodCxlKSAgICAoKHQpICgoY29uc3Qgdm9pZCAqKSAoKHZvbGF0aWxlIGNvbnN0IHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX3VubGlrZWx5KQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5saWtlbHkgMQotI2Vsc2UKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKGUpCisjaWYgIWRlZmluZWQoTFpPX1BDQVNUKQorIyAgaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fUENBU1QpCisjICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBMWk9fU1RBVElDX0NBU1Qodm9pZCAqLCBlKSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19DQ0FTVCkKKyMgIGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgICAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgKCh0KSAoZSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0NDQVNUKQorIyAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgTFpPX1NUQVRJQ19DQVNUKGNvbnN0IHZvaWQgKiwgZSkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSUNPTlYpCisjICBkZWZpbmUgTFpPX0lDT05WKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0lDQVNUKQorIyAgZGVmaW5lIExaT19JQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19JVFJVTkMpCisjICBkZWZpbmUgTFpPX0lUUlVOQyh0LGUpICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY3RlKQorIyAgaWYgKExaT19DQ19NU0MgfHwgTFpPX0NDX1dBVENPTUMpCisjICAgIGRlZmluZSBfX2x6b19jdGUoZSkgICAgICAgICAgICAoKHZvaWQpMCwoZSkpCisjICBlbGlmIDEKKyMgICAgZGVmaW5lIF9fbHpvX2N0ZShlKSAgICAgICAgICAgICgodm9pZCkwLChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jdGUpCisjICBkZWZpbmUgX19sem9fY3RlKGUpICAgICAgICAgICAgICAoZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19CTE9DS19CRUdJTikKKyMgIGRlZmluZSBMWk9fQkxPQ0tfQkVHSU4gICAgICAgICAgIGRvIHsKKyMgIGRlZmluZSBMWk9fQkxPQ0tfRU5EICAgICAgICAgICAgIH0gd2hpbGUgX19sem9fY3RlKDApCiAjZW5kaWYKICNpZiAhZGVmaW5lZChMWk9fVU5VU0VEKQogIyAgaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDYwMCkpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICAoKHZvaWQpICZ2YXIpCiAjICBlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX0hJR0hDIHx8IExaT19DQ19ORFBDIHx8IExaT19DQ19QRUxMRVNDIHx8IExaT19DQ19UVVJCT0MpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA+PSAweDAzMDIwMHVsKSkKKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgJnZhcikKICMgIGVsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQogIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSB2YXIpCiAjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCiAjICBlbGlmIChMWk9fQ0NfS0VJTEMpCi0jICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICB7ZXh0ZXJuIGludCBfX2x6b191bnVzZWRbMS0yKiEoc2l6ZW9mKHZhcik+MCldO30KKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgIHtMWk9fRVhURVJOX0MgaW50IGx6b191bnVzZWRfX1sxLTIqIShzaXplb2YodmFyKT4wKV07fQogIyAgZWxpZiAoTFpPX0NDX1BBQ0lGSUNDKQogIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSBzaXplb2YodmFyKSkKICMgIGVsaWYgKExaT19DQ19XQVRDT01DKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQpAQCAtMTU5MCwxOCArMTM3NywxOCBAQAogIyAgZWxpZiAoTFpPX0NDX01TQykKICMgICAgZGVmaW5lIExaT19VTlVTRURfRlVOQyhmdW5jKSAgICgodm9pZCkgJmZ1bmMpCiAjICBlbGlmIChMWk9fQ0NfS0VJTEMgfHwgTFpPX0NDX1BFTExFU0MpCi0jICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICB7ZXh0ZXJuIGludCBfX2x6b191bnVzZWRbMS0yKiEoc2l6ZW9mKChpbnQpZnVuYyk+MCldO30KKyMgICAgZGVmaW5lIExaT19VTlVTRURfRlVOQyhmdW5jKSAgIHtMWk9fRVhURVJOX0MgaW50IGx6b191bnVzZWRfZnVuY19fWzEtMiohKHNpemVvZigoaW50KWZ1bmMpPjApXTt9CiAjICBlbHNlCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpIGZ1bmMpCiAjICBlbmRpZgogI2VuZGlmCiAjaWYgIWRlZmluZWQoTFpPX1VOVVNFRF9MQUJFTCkKLSMgIGlmIChMWk9fQ0NfV0FUQ09NQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCgwKSBjYXNlIDE6Z290byBsCi0jICBlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfV0FUQ09NQykKLSMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIGlmICgwKSBnb3RvIGwKKyMgIGlmIChMWk9fQ0NfQ0xBTkcgPj0gMHgwMjA4MDB1bCkKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fICgodm9pZCkgKChjb25zdCB2b2lkICopICYmbCkpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19XQVRDT01DKQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9MQUJFTChsKSAgICAgaWYgX19sem9fY3RlKDApIGdvdG8gbAogIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9MQUJFTChsKSAgICAgc3dpdGNoKDApIGNhc2UgMTpnb3RvIGwKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCAoMCkgY2FzZSAxOmdvdG8gbAogIyAgZW5kaWYKICNlbmRpZgogI2lmICFkZWZpbmVkKExaT19ERUZJTkVfVU5JTklUSUFMSVpFRF9WQVIpCkBAIC0xNjEzLDM5ICsxNDAwLDQ4OCBAQAogIyAgICBkZWZpbmUgTFpPX0RFRklORV9VTklOSVRJQUxJWkVEX1ZBUih0eXBlLHZhcixpbml0KSAgdHlwZSB2YXIgPSBpbml0CiAjICBlbmRpZgogI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKLSMgIGlmIDAgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgICAgZGVmaW5lIExaT19VTkNPTlNUX0NBU1QodCxlKSAgIChjb25zdF9jYXN0PHQ+IChlKSkKLSMgIGVsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgKCh0KSAoKHZvaWQgKikgKChjaGFyICopICgobHpvX3VpbnRwdHJfdCkgKChjb25zdCB2b2lkICopIChlKSkpKSkpCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAoKHQpICgodm9pZCAqKSAoKGNoYXIgKikgKChjb25zdCB2b2lkICopIChlKSkpKSkKKyNpZiAhZGVmaW5lZChfX2x6b19pbmxpbmUpCisjaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKKyNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NJTExZIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfRE1DKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19HSFMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSU5URUxDKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19NV0VSS1MgJiYgKF9fTVdFUktTX18gPj0gMHgyNDA1KSkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmUKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmVfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2lubGluZSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfaW5saW5lIDEKICMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDIwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9fZm9yY2VpbmxpbmUKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSkKKyMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2ZvcmNlaW5saW5lCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUKKyMgIGRlZmluZSBfX2x6b19IQVZFX2ZvcmNlaW5saW5lIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2x6b19pbmxpbmUKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vaW5saW5lKQorI2lmIDEgJiYgKExaT19BUkNIX0kzODYpICYmIChMWk9fQ0NfR05VQyA+PSAweDA0MDAwMHVsKSAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwM3VsKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwMjAwdWwpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDMyMDApICYmIChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KSkKKyMgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBlbHNlCisjICAgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkKKyMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9ub2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbm9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgKF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUgfHwgX19sem9fSEFWRV9ub2lubGluZSkgJiYgIShfX2x6b19IQVZFX2lubGluZSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfaW5saW5lICAgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX3N0YXRpY19pbmxpbmUgICAgICAgc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2ZvcmNlaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19mb3JjZWlubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIHN0YXRpYyBfX2x6b19mb3JjZWlubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX25vaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX25vaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19ub2lubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIHN0YXRpYyBfX2x6b19ub2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjaWYgZGVmaW5lZChfX0dOVUNfR05VX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZWxpZiBkZWZpbmVkKF9fR05VQ19TVERDX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgZXh0ZXJuIF9fbHpvX2lubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICBleHRlcm4gX19sem9faW5saW5lCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jOTlfZXh0ZXJuX2lubGluZSkgJiYgKF9fbHpvX0hBVkVfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9jOTlfZXh0ZXJuX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfYzk5X2V4dGVybl9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX21heV9hbGlhcykKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZWxpZiAoTFpPX0NDX0NMQU5HID49IDB4MDIwOTAwdWwpCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIF9fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMjEwKSkgJiYgMAorIyAgZGVmaW5lIF9fbHpvX21heV9hbGlhcyAgICAgICBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpICYmIDAKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbWF5X2FsaWFzKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbWF5X2FsaWFzCisjICBkZWZpbmUgX19sem9fSEFWRV9tYXlfYWxpYXMgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbm9yZXR1cm4pCisjaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX25vcmV0dXJuKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbm9yZXR1cm4KKyMgIGRlZmluZSBfX2x6b19IQVZFX25vcmV0dXJuIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vdGhyb3cpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwMzAwdWwpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA0NTApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDkwMCkpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm90aHJvdykKKyMgIGlmbmRlZiBfX2x6b19IQVZFX25vdGhyb3cKKyMgIGRlZmluZSBfX2x6b19IQVZFX25vdGhyb3cgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fcmVzdHJpY3QpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDgwMCkgJiYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDEyMTApCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSkKKyMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3QKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3Jlc3RyaWN0KQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfcmVzdHJpY3QKKyMgIGRlZmluZSBfX2x6b19IQVZFX3Jlc3RyaWN0IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0lMTFkgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgTFpPX0NDX1BHSSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfR0hTKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fIF9fYWxpZ25vZl9fKGUpKQorI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mKGUpCisjZWxpZiAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKQorIyAgZGVmaW5lIF9fbHpvX2FsaWdub2YoZSkgICAgICBfX2FsaWdub2ZfXyhlKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjICBpZm5kZWYgX19sem9fSEFWRV9hbGlnbm9mCisjICBkZWZpbmUgX19sem9fSEFWRV9hbGlnbm9mIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkKQorI2lmICAgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA3MDB1bCkpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX1BDQyAmJiAoTFpPX0NDX1BDQyA8IDB4MDEwMTAwdWwpKQorI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA8IDB4NTExMCkpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpICYmICEoTFpPX0NDX1BDQ19HTlVDKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpICAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2djY19zdHJ1Y3RfXyxfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19nY2Nfc3RydWN0X18sX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkgfHwgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfbWFfZW5kKCkgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19wcmFnbWEocGFjayhwdXNoLDEpKSBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWQocykgICAgICAgIF9QYWNrZWQgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH07CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZCkgJiYgIWRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZF9tYSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKSAmJiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCgpICBfX2x6b19zdHJ1Y3RfcGFja2VkX2VuZCgpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWQpCisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3QocyxuKSAgICAgICAgX19sem9fc3RydWN0X3BhY2tlZChzKSB1bnNpZ25lZCBjaGFyIGFbbl07IF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdF9tYShzLG4pICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpIHVuc2lnbmVkIGNoYXIgYVtuXTsgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX1BHSSB8fCAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKSkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdChzLG4pICAgICAgICBzdHJ1Y3QgcyB7IHVuc2lnbmVkIGNoYXIgYVtuXTsgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3RfbWEocyxuKSAgICAgc3RydWN0IHMgeyB1bnNpZ25lZCBjaGFyIGFbbl07IH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkgJiYgICFkZWZpbmVkKF9fbHpvX2J5dGVfc3RydWN0X21hKQorIyAgZGVmaW5lIF9fbHpvX2J5dGVfc3RydWN0X21hKHMsbikgICAgIF9fbHpvX2J5dGVfc3RydWN0KHMsbikKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0cnVjdF9hbGlnbjE2KSAmJiAoX19sem9fSEFWRV9hbGlnbm9mKQorI2lmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAzMDAwMHVsKSkKKyNlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwODAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfUENDKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTYocykgICAgICAgc3RydWN0IF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBzIHsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNl9lbmQoKSAgICB9OworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjMyKHMpICAgICAgIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDMyKSkgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbig2NCkpIHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjY0X2VuZCgpICAgIH07CisjZWxpZiAoTFpPX0NDX0FSTUNDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCAoTFpPX0NDX0lCTUMgPj0gNzAwKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTZfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24zMihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygzMikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduNjRfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg2NCkpKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fdW0pCisjaWYgICAoTFpPX0NDX0NMQU5HICYmIChMWk9fQ0NfQ0xBTkcgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDcwMHVsKSkKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPCA4MTApKQorI2VsaWYgKExaT19DQ19QQ0MgJiYgKExaT19DQ19QQ0MgPCAweDAxMDEwMHVsKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyAmJiAoTFpPX0NDX1NVTlBST0MgPCAweDUxMTApKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfQVJNQ0MgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpIHx8IChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzOworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyB1bmlvbiBzIHsKKyMgIGRlZmluZSBfX2x6b191bmlvbl9hbV9lbmQoKSAgICAgICAgICB9IF9fbHpvX21heV9hbGlhczsKKyMgIGRlZmluZSBfX2x6b191bmlvbl91bShzKSAgICAgICAgICAgICBfX2x6b19nbnVjX2V4dGVuc2lvbl9fIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQykgfHwgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9fcHJhZ21hKHBhY2socHVzaCwxKSkgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9QYWNrZWQgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fYW0pCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fYW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NvbnN0cnVjdG9yKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXyxfX3VzZWRfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fY29uc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9jb25zdHJ1Y3RvcgorIyAgZGVmaW5lIF9fbHpvX0hBVkVfY29uc3RydWN0b3IgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9kZXN0cnVjdG9yCisjICBkZWZpbmUgX19sem9fSEFWRV9kZXN0cnVjdG9yIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoX19sem9fSEFWRV9kZXN0cnVjdG9yKSAmJiAhKF9fbHpvX0hBVkVfY29uc3RydWN0b3IpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbGlrZWx5KSAmJiAhZGVmaW5lZChfX2x6b191bmxpa2VseSkKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VsaWYgKExaT19DQ19JQk1DID49IDEwMTApCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2xpa2VseSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2xpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbGlrZWx5IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5saWtlbHkpCisjICBpZm5kZWYgX19sem9fSEFWRV91bmxpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5saWtlbHkgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMpCisjICBpZiAxICYmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICAgIGRlZmluZSBfX2x6b19zdGF0aWNfdW51c2VkX3ZvaWRfZnVuYyhmKSAgICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkgZih2b2lkKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMoZikgICAgc3RhdGljIF9fbHpvX2lubGluZSB2b2lkIGYodm9pZCkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19sb29wX2ZvcmV2ZXIpCisjICBpZiAoTFpPX0NDX0lCTUMpCisjICAgIGRlZmluZSBfX2x6b19sb29wX2ZvcmV2ZXIoKSAgICBMWk9fQkxPQ0tfQkVHSU4gZm9yICg7OykgeyA7IH0gTFpPX0JMT0NLX0VORAorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fbG9vcF9mb3JldmVyKCkgICAgZG8geyA7IH0gd2hpbGUgX19sem9fY3RlKDEpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjaWYgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HID49IDB4MDIwODAwdWwpKQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwNDA1MDB1bCkKKyMgIGRlZmluZSBfX2x6b191bnJlYWNoYWJsZSgpICAgICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOworI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMzAwKSkgJiYgMQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjICBpZm5kZWYgX19sem9fSEFWRV91bnJlYWNoYWJsZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5yZWFjaGFibGUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBpZiAwCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICAoKHZvaWQpMCk7CisjICBlbHNlCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICBfX2x6b19sb29wX2ZvcmV2ZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgX19MWk9fQ1RBX05BTUUKKyNpZiAoTFpPX0NGR19VU0VfQ09VTlRFUikKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fQ09VTlRFUl9fKQorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fTElORV9fKQorI2VuZGlmCiAjZW5kaWYKICNpZiAhZGVmaW5lZChMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIpCiAjICBpZiAoTFpPX0NDX0FaVEVDQyB8fCBMWk9fQ0NfWk9SVEVDSEMpCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoZSkgIGV4dGVybiBpbnQgX19sem9fY3RhWzEtIShlKV07CisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoZSkgIExaT19FWFRFUk5fQ19CRUdJTiBleHRlcm4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfXylbMS0hKGUpXTsgTFpPX0VYVEVSTl9DX0VORAogIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKQotIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fbHpvX2N0YVsxdS0yKiEoZSldOworIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gZXh0ZXJuIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX18pWzF1LTIqIShlKV07IExaT19FWFRFUk5fQ19FTkQKICMgIGVsaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPT0gMHgwMjk1KSkKLSMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgZXh0ZXJuIGludCBfX2x6b19jdGFbMS0hKGUpXTsKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGV4dGVybiBpbnQgX19MWk9fQ1RBX05BTUUobHpvX2N0YV9fKVsxLSEoZSldOyBMWk9fRVhURVJOX0NfRU5ECisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwOTAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfZl9fKShpbnQgWzEtMiohKGUpXSk7IExaT19FWFRFUk5fQ19FTkQKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGVudW0ge19fTFpPX0NUQV9OQU1FKGx6b19jdGFfZV9fKT0xLyEhKGUpfSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IExaT19FWFRFUk5fQ19FTkQKICMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgZXh0ZXJuIGludCBfX2x6b19jdGFbMS0yKiEoZSldOworIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gZXh0ZXJuIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX18pWzEtMiohKGUpXTsgTFpPX0VYVEVSTl9DX0VORAogIyAgZW5kaWYKICNlbmRpZgogI2lmICFkZWZpbmVkKExaT19DT01QSUxFX1RJTUVfQVNTRVJUKQogIyAgaWYgKExaT19DQ19BWlRFQ0MpCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fbHpvX2N0YV90WzEtIShlKV07fQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0hKGUpXTt9CiAjICBlbGlmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19QQUNJRklDQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKICMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7KHZvaWQpICgwLyEhKGUpKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKSAmJiAoTFpPX0NGR19VU0VfQ09VTlRFUikgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7ZW51bSB7X19MWk9fQ1RBX05BTUUobHpvX2N0YV9lX18pPTEvISEoZSl9IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0yKiEoZSldIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CiAjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCiAjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CiAjICBlbGlmIChMWk9fQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID09IDB4MDI5NSkpCiAjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CiAjICBlbHNlCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fbHpvX2N0YV90WzEtMiohKGUpXTt9CisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfdF9fKVsxLTIqIShlKV07fQogIyAgZW5kaWYKICNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDEgPT0gMSkKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7IExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUigyID09IDIpIH0KKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDMgPT0gMykKICNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMiB8fCBMWk9fT1NfT1MyIHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKICMgIGlmIChMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSElHSEMgfHwgTFpPX0NDX05EUEMgfHwgTFpPX0NDX1BBQ0lGSUNDKQogIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKQEAgLTE3MDksNiArMTk0NSw3IEBACiAjICBkZWZpbmUgX19sem9fY2RlY2xfdmEgICAgICAgICAgICAgICAgX19sem9fY2RlY2wKICNlbmRpZgogI2lmICEoTFpPX0NGR19OT19XSU5ET1dTX0gpCisjaWYgIWRlZmluZWQoTFpPX0hBVkVfV0lORE9XU19IKQogI2lmIChMWk9fT1NfQ1lHV0lOIHx8IChMWk9fT1NfRU1YICYmIGRlZmluZWQoX19SU1hOVF9fKSkgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKICMgIGlmIChMWk9fQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMDAwKSkKICMgIGVsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKQEAgLTE3MTgsNjEgKzE5NTUsNjE1IEBACiAjICBlbmRpZgogI2VuZGlmCiAjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NIT1JUCisjaWYgZGVmaW5lZChTSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgICAoU0laRU9GX1NIT1JUKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSE9SVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgICAgKF9fU0laRU9GX1NIT1JUX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0lOVAorI2lmIGRlZmluZWQoU0laRU9GX0lOVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChTSVpFT0ZfSU5UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9JTlRfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChfX1NJWkVPRl9JTlRfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkcpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgICAoU0laRU9GX0xPTkcpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAgIChfX1NJWkVPRl9MT05HX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChTSVpFT0ZfTE9OR19MT05HKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfX19JTlQxNgorI2lmIGRlZmluZWQoU0laRU9GX19fSU5UMTYpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDE2ICAgICAgICAoU0laRU9GX19fSU5UMTYpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX19fSU5UMzIKKyNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDMyKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQzMiAgICAgICAgKFNJWkVPRl9fX0lOVDMyKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTFpPX1NJWkVPRl9fX0lOVDY0CisjaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQ2NCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIChTSVpFT0ZfX19JTlQ2NCkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfVk9JRF9QCisjaWYgZGVmaW5lZChTSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgKFNJWkVPRl9WT0lEX1ApCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BPSU5URVJfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIChfX1NJWkVPRl9QT0lOVEVSX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NJWkVfVAorI2lmIGRlZmluZWQoU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChTSVpFT0ZfU0laRV9UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSVpFX1RfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChfX1NJWkVPRl9TSVpFX1RfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfUFRSRElGRl9UCisjaWYgZGVmaW5lZChTSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKFNJWkVPRl9QVFJESUZGX1QpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgX19MWk9fTFNSKHgsYikgICAgKCgoeCkrMHVsKSA+PiAoYikpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9TSE9SVCkKKyMgIGlmIChMWk9fQVJDSF9DUkFZX1BWUCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSBMWk9fMHhmZmZmTCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTUpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAyCisjICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgNAorIyAgZWxpZiAoX19MWk9fTFNSKFVTSFJUX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTI3KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgMTYKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkxaT19TSVpFT0ZfU0hPUlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9TSE9SVCA9PSBzaXplb2Yoc2hvcnQpKQorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfSU5UKQorIyAgaWYgKExaT19BUkNIX0NSQVlfUFZQKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9JTlQgICAgICAgICAgOAorIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAyCisjICBlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUlOVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxNSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9JTlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9JTlQgPT0gc2l6ZW9mKGludCkpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HKQorIyAgaWYgKFVMT05HX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxCisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDE1KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgMgorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVTE9OR19NQVgsMzkpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA1CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDYzKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgOAorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9MT05HIgorIyAgZW5kaWYKKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfTE9ORyA9PSBzaXplb2YobG9uZykpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorIyAgaWYgZGVmaW5lZChfX0xPTkdfTUFYX18pICYmIGRlZmluZWQoX19MT05HX0xPTkdfTUFYX18pCisjICAgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDMwMHVsKQorIyAgICAgIGlmICgoX19MT05HX01BWF9fLTApID09IChfX0xPTkdfTE9OR19NQVhfXy0wKSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgICAgIGVsaWYgKF9fTFpPX0xTUihfX0xPTkdfTE9OR19NQVhfXywzMCkgPT0gMSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDQKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorI2lmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19ETUMpCisjZWxpZiAoTFpPX0NDX0NJTExZKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjY0KSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfRE1DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfU1lNQU5URUNDICYmIChfX1NDX18gPj0gMHg3MDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDICYmIGRlZmluZWQoX19saW51eF9fKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX01XRVJLUyB8fCBMWk9fQ0NfUEVMTEVTQyB8fCBMWk9fQ0NfUEdJIHx8IExaT19DQ19TVU5QUk9DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgZGVmaW5lZChfV0lOMzIpKSAmJiAoTFpPX0NDX01TQykpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTIwKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDExMDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQ0NfR0hTICYmIGRlZmluZWQoX19MTE9OR19CSVQpICYmICgoX19MTE9OR19CSVQtMCkgPT0gNjQpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19XQVRDT01DICYmIGRlZmluZWQoX0lOVEVHUkFMX01BWF9CSVRTKSAmJiAoKF9JTlRFR1JBTF9NQVhfQklUUy0wKSA9PSA2NCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUtMCkgPT0gNjQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0NDX1NEQ0MpICYmIChMWk9fU0laRU9GX0lOVCA9PSAyKQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgKExaT19DQ19HTlVDKQorIyAgaWYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkKKyMgICAgdW5kZWYgTFpPX1NJWkVPRl9MT05HX0xPTkcKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NGR19OT19MT05HX0xPTkcpCisjICB1bmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2VsaWYgZGVmaW5lZChfX05PX0xPTkdfTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiBkZWZpbmVkKF9OT19MT05HTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fV09SRFNJWkUpCiAjaWYgKExaT19BUkNIX0FMUEhBKQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfU0hPUlQgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVVNIT1JUICAgICAgMQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAogI2VsaWYgKExaT19BUkNIX0FNRDY0KQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfSU5UX0lOREVYICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVENjQgICAgICAgMQotI2VsaWYgKExaT19BUkNIX0FSTSAmJiBMWk9fQVJDSF9BUk1fVEhVTUIpCi0jZWxpZiAoTFpPX0FSQ0hfQVJNKQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfU0hPUlQgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVVNIT1JUICAgICAgMQotI2VsaWYgKExaT19BUkNIX0NSSVMpCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAxCi0jZWxpZiAoTFpPX0FSQ0hfSTM4NikKLSMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgIDEKLSMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgIDEKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9BVlIpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAxCisjZWxpZiAoTFpPX0FSQ0hfSDgzMDApCisjICBpZiBkZWZpbmVkKF9fTk9STUFMX01PREVfXykKKyMgICAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgIDQKKyMgIGVsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pIHx8IGRlZmluZWQoX19IODMwMFNYX18pCisjICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICA0CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAyCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0kwODYpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAyCiAjZWxpZiAoTFpPX0FSQ0hfSUE2NCkKLSMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX0lOVF9JTkRFWCAgIDEKLSMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKLSMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QT1NUSU5DICAgIDEKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9NMTZDKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgMgorI2VsaWYgKExaT19BUkNIX1NQVSkKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDQKKyNlbGlmIChMWk9fQVJDSF9aODApCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAxCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HID09IDgpICYmICgoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX1I1OTAwX18pKSB8fCBkZWZpbmVkKF9fTUlQU19QU1gyX18pKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAorI2VsaWYgKExaT19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICA4CisjZWxpZiAoZGVmaW5lZChfX3ZtcykgfHwgZGVmaW5lZChfX1ZNUykpICYmIChfX0lOSVRJQUxfUE9JTlRFUl9TSVpFKzAgPT0gNjQpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICA4CisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQorI2lmIGRlZmluZWQoX19JTFAzMl9fKSB8fCBkZWZpbmVkKF9fSUxQMzIpIHx8IGRlZmluZWQoX0lMUDMyKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihpbnQpICA9PSA0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsb25nKSA9PSA0KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgNAorI2VsaWYgZGVmaW5lZChfX0lMUDY0X18pIHx8IGRlZmluZWQoX19JTFA2NCkgfHwgZGVmaW5lZChfSUxQNjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGludCkgID09IDgpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGxvbmcpID09IDgpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4CisjZWxpZiBkZWZpbmVkKF9fTExQNjRfXykgfHwgZGVmaW5lZChfX0xMUDY0KSB8fCBkZWZpbmVkKF9MTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGxvbmcpID09IDQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4CisjZWxpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9fTFA2NCkgfHwgZGVmaW5lZChfTFA2NCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobG9uZykgPT0gOCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9BVlIpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICAyCisjZWxpZiAoTFpPX0FSQ0hfQzE2NiB8fCBMWk9fQVJDSF9NQ1M1MSB8fCBMWk9fQVJDSF9NQ1MyNTEgfHwgTFpPX0FSQ0hfTVNQNDMwKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgorI2VsaWYgKExaT19BUkNIX0g4MzAwKQorIyAgaWYgZGVmaW5lZChfX05PUk1BTF9NT0RFX18pCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAyCisjICBlbGlmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSB8fCBkZWZpbmVkKF9fSDgzMDBTWF9fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZW5kaWYKKyMgIGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwMHVsKSkgJiYgKExaT19TSVpFT0ZfSU5UID09IDQpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICBMWk9fU0laRU9GX0lOVAorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgTFpPX1NJWkVPRl9JTlQKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfSTA4NikKKyMgIGlmIChMWk9fTU1fVElOWSB8fCBMWk9fTU1fU01BTEwgfHwgTFpPX01NX01FRElVTSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDIKKyMgIGVsaWYgKExaT19NTV9DT01QQUNUIHx8IExaT19NTV9MQVJHRSB8fCBMWk9fTU1fSFVHRSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDQKKyMgIGVsc2UKKyMgICAgZXJyb3IgImludmFsaWQgTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX00xNkMpCisjICBpZiBkZWZpbmVkKF9fbTMyY19jcHVfXykgfHwgZGVmaW5lZChfX20zMmNtX2NwdV9fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9TUFUpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0CisjZWxpZiAoTFpPX0FSQ0hfWjgwKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA9PSA4KSAmJiAoKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19SNTkwMF9fKSkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDQKKyNlbGlmIChMWk9fT1NfT1M0MDAgfHwgZGVmaW5lZChfX09TNDAwX18pKQorIyAgaWYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgOAorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgTFpPX1NJWkVPRl9MT05HCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICBMWk9fU0laRU9GX0xPTkcKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDE2CisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICBMWk9fU0laRU9GX0xPTkcKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfTE9ORworIyAgZW5kaWYKKyNlbGlmIChkZWZpbmVkKF9fdm1zKSB8fCBkZWZpbmVkKF9fVk1TKSkgJiYgKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUrMCA9PSA2NCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgTFpPX1NJWkVPRl9MT05HCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCisjZW5kaWYKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihMWk9fU0laRU9GX1ZPSURfUCA9PSBzaXplb2Yodm9pZCAqKSkKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKKyNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9NMTZDKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgMgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfVk9JRF9QCisjZW5kaWYKKyNpZiBkZWZpbmVkKG9mZnNldG9mKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfU0laRV9UID09IHNpemVvZihzaXplX3QpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9QVFJESUZGX1QpCisjaWYgKExaT19BUkNIX0kwODYpCisjICBpZiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9NRURJVU0gfHwgTFpPX01NX0hVR0UpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICBMWk9fU0laRU9GX1ZPSURfUAorIyAgZWxpZiAoTFpPX01NX0NPTVBBQ1QgfHwgTFpPX01NX0xBUkdFKQorIyAgICBpZiAoTFpPX0NDX0JPUkxBTkRDIHx8IExaT19DQ19UVVJCT0MpCisjICAgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICA0CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgIDIKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZXJyb3IgImludmFsaWQgTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1BUUkRJRkZfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfU0laRV9UCisjZW5kaWYKKyNpZiBkZWZpbmVkKG9mZnNldG9mKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfUFRSRElGRl9UID09IHNpemVvZihwdHJkaWZmX3QpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1dPUkRTSVpFKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKKyNlbmRpZgorI2lmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQorIyAgdW5kZWYgTFpPX0FCSV9CSUdfRU5ESUFOCisjICB1bmRlZiBMWk9fQUJJX0xJVFRMRV9FTkRJQU4KKyNlbGlmICEoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAhKExaT19BQklfTElUVExFX0VORElBTikKKyNpZiAoTFpPX0FSQ0hfQUxQSEEpICYmIChMWk9fQVJDSF9DUkFZX01QUCkKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIChMWk9fQVJDSF9JQTY0KSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYIHx8IExaT19PU19XSU42NCkKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIChMWk9fQVJDSF9BTFBIQSB8fCBMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9CTEFDS0ZJTiB8fCBMWk9fQVJDSF9DUklTIHx8IExaT19BUkNIX0kwODYgfHwgTFpPX0FSQ0hfSTM4NiB8fCBMWk9fQVJDSF9NU1A0MzApCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAoTFpPX0FSQ0hfQVZSMzIgfHwgTFpPX0FSQ0hfTTY4SyB8fCBMWk9fQVJDSF9TMzkwIHx8IExaT19BUkNIX1NQVSkKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorIyAgaWYgKF9fTElUVExFX0VORElBTl9fID09IDEpCisjICAgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAxCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAxCisjICBlbmRpZgorI2VsaWYgMSAmJiBkZWZpbmVkKF9fQklHX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOX18pCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0pICYmIGRlZmluZWQoX19BUk1FQl9fKSAmJiAhZGVmaW5lZChfX0FSTUVMX18pCisjICBkZWZpbmUgTFpPX0FCSV9CSUdfRU5ESUFOICAgICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0pICYmIGRlZmluZWQoX19BUk1FTF9fKSAmJiAhZGVmaW5lZChfX0FSTUVCX18pCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0gJiYgTFpPX0NDX0FSTUNDX0FSTUNDKQorIyAgaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyMgICAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgIDEKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk02NCkgJiYgZGVmaW5lZChfX0FBUkNINjRFQl9fKSAmJiAhZGVmaW5lZChfX0FBUkNINjRFTF9fKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiAoTFpPX0FSQ0hfQVJNNjQpICYmIGRlZmluZWQoX19BQVJDSDY0RUxfXykgJiYgIWRlZmluZWQoX19BQVJDSDY0RUJfXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUJfXykgJiYgIWRlZmluZWQoX19NSVBTRUxfXykKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUxfXykgJiYgIWRlZmluZWQoX19NSVBTRUJfXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgKExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BQklfTElUVExFX0VORElBTikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9FTkRJQU4gICAgICAgImJlIgorI2VsaWYgKExaT19BQklfTElUVExFX0VORElBTikKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJsZSIKKyNlbGlmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9FTkRJQU4gICAgICAgIm5ldXRyYWwiCisjZW5kaWYKKyNpZiAoTFpPX1NJWkVPRl9JTlQgPT0gMSAmJiBMWk9fU0laRU9GX0xPTkcgPT0gMiAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSAyKQorIyAgZGVmaW5lIExaT19BQklfSThMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaThscDE2IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDIgJiYgTFpPX1NJWkVPRl9MT05HID09IDIgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gMikKKyMgIGRlZmluZSBMWk9fQUJJX0lMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMTYiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gMiAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIExaT19BQklfTFAzMiAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJscDMyIgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDQgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKKyMgIGRlZmluZSBMWk9fQUJJX0lMUDMyICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMzIiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA4ICYmIExaT19TSVpFT0ZfU0laRV9UID09IDgpCisjICBkZWZpbmUgTFpPX0FCSV9MTFA2NCAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImxscDY0IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gOCkKKyMgIGRlZmluZSBMWk9fQUJJX0xQNjQgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAibHA2NCIKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSA4ICYmIExaT19TSVpFT0ZfTE9ORyA9PSA4ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDgpCisjICBkZWZpbmUgTFpPX0FCSV9JTFA2NCAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDY0IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKKyMgIGRlZmluZSBMWk9fQUJJX0lQMzJMNjQgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaXAzMmw2NCIKKyNlbmRpZgorI2lmIDAKKyNlbGlmICFkZWZpbmVkKF9fTFpPX0xJQkNfT1ZFUlJJREUpCisjaWYgKExaT19MSUJDX05BS0VEKQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmFrZWQiCisjZWxpZiAoTFpPX0xJQkNfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZnJlZXN0YW5kaW5nIgorI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJtZnJlZXN0YW5kaW5nIgorI2VsaWYgKExaT19MSUJDX0lTT0M5MCkKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKKyNlbGlmIChMWk9fTElCQ19JU09DOTkpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTkiCisjZWxpZiAoTFpPX0NDX0FSTUNDX0FSTUNDKSAmJiBkZWZpbmVkKF9fQVJNQ0xJQl9WRVJTSU9OKQorIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCisjZWxpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKKyMgIGRlZmluZSBMWk9fTElCQ19ESUVUTElCQyAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZGlldGxpYmMiCisjZWxpZiBkZWZpbmVkKF9ORVdMSUJfVkVSU0lPTikKKyMgIGRlZmluZSBMWk9fTElCQ19ORVdMSUIgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmV3bGliIgorI2VsaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pICYmIGRlZmluZWQoX19VQ0xJQkNfTUlOT1JfXykKKyMgIGlmIGRlZmluZWQoX19VQ0xJQkNfU1VCTEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgKF9fVUNMSUJDX01BSk9SX18gKiAweDEwMDAwTCArIChfX1VDTElCQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19VQ0xJQkNfU1VCTEVWRUxfXy0wKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgMHgwMDA5MGJMCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAidWMiICJsaWJjIgorI2VsaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19HTElCQ19NSU5PUl9fKQorIyAgZGVmaW5lIExaT19MSUJDX0dMSUJDICAgICAgICAoX19HTElCQ19fICogMHgxMDAwMEwgKyAoX19HTElCQ19NSU5PUl9fLTApICogMHgxMDApCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJnbGliYyIKKyNlbGlmIChMWk9fQ0NfTVdFUktTKSAmJiBkZWZpbmVkKF9fTVNMX18pCisjICBkZWZpbmUgTFpPX0xJQkNfTVNMICAgICAgICAgIF9fTVNMX18KKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgIm1zbCIKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQorIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCisjZWxzZQorIyAgZGVmaW5lIExaT19MSUJDX0RFRkFVTFQgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJkZWZhdWx0IgorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX09TX0RPUzMyIHx8IExaT19PU19XSU4zMikgJiYgKExaT19DQ19ETUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfTVNDIHx8IExaT19DQ19QRUxMRVNDKSkKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9NU0MgMQorI2VsaWYgKExaT19PU19XSU42NCAmJiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MgfHwgTFpPX0NDX1BFTExFU0MpKQorI2VsaWYgKExaT19BUkNIX0kzODYgJiYgTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDID09IDB4MDExZjAwdWwpKQorI2VsaWYgKExaT19BUkNIX0kzODYgJiYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19QQVRIU0NBTEUpKQorIyAgZGVmaW5lIExaT19BU01fU1lOVEFYX0dOVUMgMQorI2VsaWYgKExaT19BUkNIX0FNRDY0ICYmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfUEFUSFNDQUxFKSkKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKKyNlbGlmIChMWk9fQ0NfR05VQykKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKKyNlbmRpZgorI2lmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorI2lmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA8IDB4MDIwMDAwdWwpKQorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgICAgICAgICAgICAgImF4IgorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MgICAgICAgICAgICAgLyplbXB0eSovCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkgICAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPCAxMDAwKSkKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkiCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyAgICAgICAgICAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSAgICAgIDogIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICAgICAgICAgICAgICJjYyIsICJtZW1vcnkiCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyAgICAgICAgICAgICA6ICJjYyIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSAgICAgIDogImNjIiwgIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQUxQSEEpCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKKyNlbGlmIChMWk9fQVJDSF9BTUQ2NCkKKyMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX0lOVF9JTkRFWCAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgICAgICAgICAxCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNKQorIyAgaWYgZGVmaW5lZChfX0FSTV9GRUFUVVJFX1VOQUxJR05FRCkKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX19UQVJHRVRfQVJDSF9BUk0pICYmICgoX19UQVJHRVRfQVJDSF9BUk0rMCkgPj0gNykKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX19UQVJHRVRfQVJDSF9BUk0pICYmICgoX19UQVJHRVRfQVJDSF9BUk0rMCkgPj0gNikgJiYgIWRlZmluZWQoX19UQVJHRVRfUFJPRklMRV9NKQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNNjQpCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQ1JJUykKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0kzODYpCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9JQTY0KQorIyAgZGVmaW5lIExaT19PUFRfQVZPSURfSU5UX0lOREVYICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QT1NUSU5DICAgICAgICAgICAgMQogI2VsaWYgKExaT19BUkNIX002OEspCi0jICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUE9TVElOQyAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUE9TVElOQyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QUkVERUMgICAgICAgICAgICAgMQogIyAgaWYgZGVmaW5lZChfX21jNjgwMjBfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgIDEKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgIDEKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX01JUFMpCi0jICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAxCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKICNlbGlmIChMWk9fQVJDSF9QT1dFUlBDKQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRUlOQyAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRUlOQyAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAgICAgICAgIDEKICMgIGlmIChMWk9fQUJJX0JJR19FTkRJQU4pCi0jICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAxCi0jICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAxCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZiAoTFpPX1dPUkRTSVpFID09IDgpCisjICAgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVENjQKKyMgICAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgMQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX1MzOTApCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAxCi0jICBpZiAoTFpPX1NJWkVPRl9TSVpFX1QgPT0gOCkKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVENjQgICAgIDEKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWYgKExaT19XT1JEU0laRSA9PSA4KQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQ2NAorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAxCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX1NIKQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgMQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAgICAgICAgIDEKICNlbmRpZgogI2lmbmRlZiBMWk9fQ0ZHX05PX0lOTElORV9BU00KLSNpZiAoTFpPX0NDX0xMVk0pCisjaWYgKExaT19BQklfTkVVVFJBTF9FTkRJQU4pIHx8IChMWk9fQVJDSF9HRU5FUklDKQorIyAgZGVmaW5lIExaT19DRkdfTk9fSU5MSU5FX0FTTSAxCisjZWxpZiAoTFpPX0NDX0xMVk0pCiAjICBkZWZpbmUgTFpPX0NGR19OT19JTkxJTkVfQVNNIDEKICNlbmRpZgogI2VuZGlmCisjaWYgKExaT19DRkdfTk9fSU5MSU5FX0FTTSkKKyMgIHVuZGVmIExaT19BU01fU1lOVEFYX01TQworIyAgdW5kZWYgTFpPX0FTTV9TWU5UQVhfR05VQworIyAgdW5kZWYgX19MWk9fQVNNX0NMT0JCRVIKKyMgIHVuZGVmIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MKKyMgIHVuZGVmIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZCisjICB1bmRlZiBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZCisjZW5kaWYKICNpZm5kZWYgTFpPX0NGR19OT19VTkFMSUdORUQKICNpZiAoTFpPX0FCSV9ORVVUUkFMX0VORElBTikgfHwgKExaT19BUkNIX0dFTkVSSUMpCiAjICBkZWZpbmUgTFpPX0NGR19OT19VTkFMSUdORUQgMQpAQCAtMTc4MywyNSArMjU3NCw2IEBACiAjICB1bmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCiAjICB1bmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CiAjZW5kaWYKLSNpZiAoTFpPX0NGR19OT19JTkxJTkVfQVNNKQotI2VsaWYgKExaT19BUkNIX0kzODYgJiYgKExaT19PU19ET1MzMiB8fCBMWk9fT1NfV0lOMzIpICYmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX01TQyB8fCBMWk9fQ0NfUEVMTEVTQykpCi0jICBkZWZpbmUgTFpPX0FTTV9TWU5UQVhfTVNDIDEKLSNlbGlmIChMWk9fT1NfV0lONjQgJiYgKExaT19DQ19ETUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfTVNDIHx8IExaT19DQ19QRUxMRVNDKSkKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA9PSAweDAxMWYwMHVsKSkKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfUEFUSFNDQUxFKSkKLSMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKLSNlbGlmIChMWk9fQVJDSF9BTUQ2NCAmJiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX1BBVEhTQ0FMRSkpCi0jICBkZWZpbmUgTFpPX0FTTV9TWU5UQVhfR05VQyAxCi0jZW5kaWYKLSNpZiAoTFpPX0FTTV9TWU5UQVhfR05VQykKLSNpZiAoTFpPX0FSQ0hfSTM4NiAmJiBMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDAwMHVsKSkKLSMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICJheCIKLSNlbGlmIChMWk9fQ0NfSU5URUxDKQotIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgIm1lbW9yeSIKLSNlbHNlCi0jICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVIgICAgICAgICAiY2MiLCAibWVtb3J5IgotI2VuZGlmCi0jZW5kaWYKICNpZiBkZWZpbmVkKF9fTFpPX0lORk9TVFJfTU0pCiAjZWxpZiAoTFpPX01NX0ZMQVQpICYmIChkZWZpbmVkKF9fTFpPX0lORk9TVFJfUE0pIHx8IGRlZmluZWQoTFpPX0lORk9fQUJJX1BNKSkKICMgIGRlZmluZSBfX0xaT19JTkZPU1RSX01NICAgICAgICAgICIiCkBAIC0xODQ1LDcgKzI2MTcsMzgyIEBACiAjZGVmaW5lIExaT19JTkZPX1NUUklORyBcCiAgICAgTFpPX0lORk9fQVJDSCBfX0xaT19JTkZPU1RSX01NIF9fTFpPX0lORk9TVFJfUE0gX19MWk9fSU5GT1NUUl9FTkRJQU4gXAogICAgICIgIiBfX0xaT19JTkZPU1RSX09TTkFNRSBfX0xaT19JTkZPU1RSX0xJQkMgIiAiIExaT19JTkZPX0NDIF9fTFpPX0lORk9TVFJfQ0NWRVIKKyNpZiAhKExaT19DRkdfU0tJUF9MWk9fVFlQRVMpCisjaWYgKCEoTFpPX1NJWkVPRl9TSE9SVCswID4gMCAmJiBMWk9fU0laRU9GX0lOVCswID4gMCAmJiBMWk9fU0laRU9GX0xPTkcrMCA+IDApKQorIyAgZXJyb3IgIm1pc3NpbmcgZGVmaW5lcyBmb3Igc2l6ZXMiCisjZW5kaWYKKyNpZiAoIShMWk9fU0laRU9GX1BUUkRJRkZfVCswID4gMCAmJiBMWk9fU0laRU9GX1NJWkVfVCswID4gMCAmJiBMWk9fU0laRU9GX1ZPSURfUCswID4gMCkpCisjICBlcnJvciAibWlzc2luZyBkZWZpbmVzIGZvciBzaXplcyIKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19sbG9uZ190KQorI2lmIChMWk9fU0laRU9GX0xPTkdfTE9ORyswID4gMCkKK19fbHpvX2dudWNfZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgbHpvX2xsb25nX3RfXzsKK19fbHpvX2dudWNfZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgbHpvX3VsbG9uZ190X187CisjICBkZWZpbmUgbHpvX2xsb25nX3QgICAgICAgICAgICAgICBsem9fbGxvbmdfdF9fCisjICBkZWZpbmUgbHpvX3VsbG9uZ190ICAgICAgICAgICAgICBsem9fdWxsb25nX3RfXworI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MTZlX3QpCisjaWYgKExaT19TSVpFT0ZfTE9ORyA9PSAyKQorIyAgZGVmaW5lIGx6b19pbnQxNmVfdCAgICAgICAgICAgICAgbG9uZworIyAgZGVmaW5lIGx6b191aW50MTZlX3QgICAgICAgICAgICAgdW5zaWduZWQgbG9uZworI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDIpCisjICBkZWZpbmUgbHpvX2ludDE2ZV90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorI2VsaWYgKExaT19TSVpFT0ZfU0hPUlQgPT0gMikKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIHNob3J0IGludAorIyAgZGVmaW5lIGx6b191aW50MTZlX3QgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CisjZWxpZiAxICYmICEoTFpPX0NGR19UWVBFX05PX01PREVfSEkpICYmIChMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDI1ZjAwdWwpIHx8IExaT19DQ19MTFZNKQorICAgdHlwZWRlZiBpbnQgbHpvX2ludDE2ZV9oaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOworICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgbHpvX3VpbnQxNmVfaGlfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIGx6b19pbnQxNmVfaGlfdF9fCisjICBkZWZpbmUgbHpvX3VpbnQxNmVfdCAgICAgICAgICAgICBsem9fdWludDE2ZV9oaV90X18KKyNlbGlmIChMWk9fU0laRU9GX19fSU5UMTYgPT0gMikKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIF9faW50MTYKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIF9faW50MTYKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDE2ZV90KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDE2RV9UICAgMgorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MTZlX3QpID09IDIpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNmVfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMTZFX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MzJlX3QpCisjaWYgKExaT19TSVpFT0ZfTE9ORyA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50MzJlX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjZWxpZiAoTFpPX1NJWkVPRl9TSE9SVCA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgc2hvcnQgaW50CisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkdfTE9ORyA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbHpvX2xsb25nX3QKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIGx6b191bGxvbmdfdAorI2VsaWYgMSAmJiAhKExaT19DRkdfVFlQRV9OT19NT0RFX1NJKSAmJiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyNWYwMHVsKSB8fCBMWk9fQ0NfTExWTSkgJiYgKF9fSU5UX01BWF9fKzAgPiAyMTQ3NDgzNjQ3TCkKKyAgIHR5cGVkZWYgaW50IGx6b19pbnQzMmVfc2lfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGx6b191aW50MzJlX3NpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisjICBkZWZpbmUgbHpvX2ludDMyZV90ICAgICAgICAgICAgICBsem9faW50MzJlX3NpX3RfXworIyAgZGVmaW5lIGx6b191aW50MzJlX3QgICAgICAgICAgICAgbHpvX3VpbnQzMmVfc2lfdF9fCisjZWxpZiAxICYmICEoTFpPX0NGR19UWVBFX05PX01PREVfU0kpICYmIChMWk9fQ0NfR05VQyA+PSAweDAyNWYwMHVsKSAmJiBkZWZpbmVkKF9fQVZSX18pICYmIChfX0xPTkdfTUFYX18rMCA9PSAzMjc2N0wpCisgICB0eXBlZGVmIGludCBsem9faW50MzJlX3NpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBsem9fdWludDMyZV9zaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbHpvX2ludDMyZV9zaV90X18KKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIGx6b191aW50MzJlX3NpX3RfXworIyAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgICAgKGMjI0xMKQorIyAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgICAgKGMjI1VMTCkKKyNlbGlmIChMWk9fU0laRU9GX19fSU5UMzIgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIF9faW50MzIKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIHVuc2lnbmVkIF9faW50MzIKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyRV9UICAgNAorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJlX3QpID09IDQpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmVfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMzJFX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50NjRlX3QpCisjaWYgKExaT19TSVpFT0ZfX19JTlQ2NCA9PSA4KQorIyAgaWYgKExaT19DQ19CT1JMQU5EQykgJiYgIShMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICAgIGRlZmluZSBMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fU0laRU9GX0lOVCA9PSA4KSAmJiAoTFpPX1NJWkVPRl9JTlQgPCBMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDY0ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkcgPT0gOCkKKyMgIGRlZmluZSBsem9faW50NjRlX3QgICAgICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgbHpvX3VpbnQ2NGVfdCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9MT05HCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPT0gOCkgJiYgIShMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBsem9fbGxvbmdfdAorIyAgZGVmaW5lIGx6b191aW50NjRlX3QgICAgICAgICAgICAgbHpvX3VsbG9uZ190CisjICBpZiAoTFpPX0NDX0JPUkxBTkRDKQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBsbCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgICgoYykgKyAwdWxsKQorIyAgZWxpZiAwCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoX19sem9fZ251Y19leHRlbnNpb25fXyAoYyMjTEwpKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gKGMjI1VMTCkpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjTEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoYyMjVUxMKQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCAgIExaT19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiAoTFpPX1NJWkVPRl9fX0lOVDY0ID09IDgpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBfX2ludDY0CisjICBkZWZpbmUgbHpvX3VpbnQ2NGVfdCAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDY0CisjICBpZiAoTFpPX0NDX0JPUkxBTkRDKQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBpNjQpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoKGMpICsgMHVpNjQpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjaTY0KQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKGMjI3VpNjQpCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9fX0lOVDY0CisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGVfdCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0ZV90KSA9PSA4KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRlX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDMybF90KQorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorIyAgZGVmaW5lIGx6b19pbnQzMmxfdCAgICAgICAgICAgICAgbHpvX2ludDMyZV90CisjICBkZWZpbmUgbHpvX3VpbnQzMmxfdCAgICAgICAgICAgICBsem9fdWludDMyZV90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0xaT19JTlQzMkVfVAorI2VsaWYgKExaT19TSVpFT0ZfSU5UID49IDQpICYmIChMWk9fU0laRU9GX0lOVCA8IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9faW50MzJsX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50MzJsX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmxfdCAgICAgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBsem9fdWludDMybF90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0xPTkcKKyNlbHNlCisjICBlcnJvciAibHpvX2ludDMybF90IgorI2VuZGlmCisjZW5kaWYKKyNpZiAxCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmxfdCkgPj0gNCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMybF90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkxfVCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGVfdCkKKyMgIGRlZmluZSBsem9faW50NjRsX3QgICAgICAgICAgICAgIGx6b19pbnQ2NGVfdAorIyAgZGVmaW5lIGx6b191aW50NjRsX3QgICAgICAgICAgICAgbHpvX3VpbnQ2NGVfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UICAgTFpPX1NJWkVPRl9MWk9fSU5UNjRFX1QKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRsX3QpID49IDgpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NGxfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MzJmX3QpCisjaWYgKExaT19TSVpFT0ZfU0laRV9UID49IDgpCisjICBkZWZpbmUgbHpvX2ludDMyZl90ICAgICAgICAgICAgICBsem9faW50NjRsX3QKKyMgIGRlZmluZSBsem9fdWludDMyZl90ICAgICAgICAgICAgIGx6b191aW50NjRsX3QKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQzMkZfVCAgIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UCisjZWxzZQorIyAgZGVmaW5lIGx6b19pbnQzMmZfdCAgICAgICAgICAgICAgbHpvX2ludDMybF90CisjICBkZWZpbmUgbHpvX3VpbnQzMmZfdCAgICAgICAgICAgICBsem9fdWludDMybF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QgICBMWk9fU0laRU9GX0xaT19JTlQzMkxfVAorI2VuZGlmCisjZW5kaWYKKyNpZiAxCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPj0gNCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyZl90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkZfVCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19pbnQ2NGZfdCkKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyMgIGRlZmluZSBsem9faW50NjRmX3QgICAgICAgICAgICAgIGx6b19pbnQ2NGxfdAorIyAgZGVmaW5lIGx6b191aW50NjRmX3QgICAgICAgICAgICAgbHpvX3VpbnQ2NGxfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0Rl9UICAgTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0Zl90KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRmX3QpID49IDgpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NGZfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UNjRGX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50cHRyX3QpCisjaWYgMSAmJiAoTFpPX09TX09TNDAwICYmIChMWk9fU0laRU9GX1ZPSURfUCA9PSAxNikpCisjICBkZWZpbmUgX19MWk9fSU5UUFRSX1RfSVNfUE9JTlRFUiAxCisgICB0eXBlZGVmIGNoYXIqICAgICAgICAgICAgICAgICAgICBsem9faW50cHRyX3Q7CisgICB0eXBlZGVmIGNoYXIqICAgICAgICAgICAgICAgICAgICBsem9fdWludHB0cl90OworIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX1ZPSURfUAorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApICYmIChMWk9fU0laRU9GX1ZPSURfUCA9PSA0KSAmJiAoTFpPX1NJWkVPRl9JTlQgPT0gNCkpCisgICB0eXBlZGVmIF9fdzY0IGludCAgICAgICAgICAgICAgICBsem9faW50cHRyX3Q7CisgICB0eXBlZGVmIF9fdzY0IHVuc2lnbmVkIGludCAgICAgICBsem9fdWludHB0cl90OworIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfU0hPUlQgPT0gTFpPX1NJWkVPRl9WT0lEX1ApICYmIChMWk9fU0laRU9GX0lOVCA+IExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgc2hvcnQKKyMgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX1NIT1JUCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPj0gTFpPX1NJWkVPRl9WT0lEX1ApICYmIChMWk9fU0laRU9GX0lOVCA8IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSBMWk9fU0laRU9GX1ZPSURfUCkKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlRQVFJfVCAgIExaT19TSVpFT0ZfTE9ORworI2VsaWYgKExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UID49IExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludDY0bF90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludDY0bF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorI2Vsc2UKKyMgIGVycm9yICJsem9faW50cHRyX3QiCisjZW5kaWYKKyNlbmRpZgorI2lmIDEKKyAgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPj0gc2l6ZW9mKHZvaWQgKikpCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZihsem9fdWludHB0cl90KSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b193b3JkX3QpCisjaWYgZGVmaW5lZChMWk9fV09SRFNJWkUpICYmIChMWk9fV09SRFNJWkUrMCA+IDApCisjaWYgKExaT19XT1JEU0laRSA9PSBMWk9fU0laRU9GX0xaT19JTlRQVFJfVCkgJiYgIShfX0xaT19JTlRQVFJfVF9JU19QT0lOVEVSKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgbHpvX3VpbnRwdHJfdAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgTFpPX1NJWkVPRl9MT05HCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfSU5UKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fV09SRFNJWkUgPT0gTFpPX1NJWkVPRl9TSE9SVCkKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBzaG9ydAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCBMWk9fU0laRU9GX1NIT1JUCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IDEpCisjICBkZWZpbmUgbHpvX3dvcmRfdCAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBzaWduZWQgY2hhcgorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCAxCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgbHpvX3VpbnQ2NGxfdAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgbHpvX2ludDY0bF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UCisjZWxpZiAoTFpPX0FSQ0hfU1BVKSAmJiAoTFpPX0NDX0dOVUMpCisjaWYgMAorICAgdHlwZWRlZiB1bnNpZ25lZCBsem9fd29yZF90ICBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1YxNlFJX18pKSk7CisgICB0eXBlZGVmIGludCAgICAgIGx6b19zd29yZF90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fVjE2UUlfXykpKTsKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIGx6b193b3JkX3QKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGx6b19zd29yZF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UICAgICAxNgorI2VuZGlmCisjZWxzZQorIyAgZXJyb3IgImx6b193b3JkX3QiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgMSAmJiBkZWZpbmVkKGx6b193b3JkX3QpCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fd29yZF90KSAgPT0gTFpPX1dPUkRTSVpFKQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3N3b3JkX3QpID09IExaT19XT1JEU0laRSkKKyNlbmRpZgorI2lmIDEKKyNkZWZpbmUgbHpvX2ludDhfdCAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyCisjZGVmaW5lIGx6b191aW50OF90ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDhfVCAgICAgICAxCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpID09IDEpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpID09IHNpemVvZihsem9fdWludDhfdCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQxNmVfdCkKKyNkZWZpbmUgbHpvX2ludDE2X3QgICAgICAgICAgICAgICAgIGx6b19pbnQxNmVfdAorI2RlZmluZSBsem9fdWludDE2X3QgICAgICAgICAgICAgICAgbHpvX3VpbnQxNmVfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlQxNl9UICAgICAgTFpPX1NJWkVPRl9MWk9fSU5UMTZFX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDE2X3QpID09IDIpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNl90KSA9PSBzaXplb2YobHpvX3VpbnQxNl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorI2RlZmluZSBsem9faW50MzJfdCAgICAgICAgICAgICAgICAgbHpvX2ludDMyZV90CisjZGVmaW5lIGx6b191aW50MzJfdCAgICAgICAgICAgICAgICBsem9fdWludDMyZV90CisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyX1QgICAgICBMWk9fU0laRU9GX0xaT19JTlQzMkVfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJfdCkgPT0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyX3QpID09IHNpemVvZihsem9fdWludDMyX3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRlX3QpCisjZGVmaW5lIGx6b19pbnQ2NF90ICAgICAgICAgICAgICAgICBsem9faW50NjRlX3QKKyNkZWZpbmUgbHpvX3VpbnQ2NF90ICAgICAgICAgICAgICAgIGx6b191aW50NjRlX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UNjRfVCAgICAgIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NF90KSA9PSA4KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRfdCkgPT0gc2l6ZW9mKGx6b191aW50NjRfdCkpCisjZW5kaWYKKyNpZiAxCisjZGVmaW5lIGx6b19pbnRfbGVhc3QzMl90ICAgICAgICAgICBsem9faW50MzJsX3QKKyNkZWZpbmUgbHpvX3VpbnRfbGVhc3QzMl90ICAgICAgICAgIGx6b191aW50MzJsX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0xFQVNUMzJfVCBMWk9fU0laRU9GX0xaT19JTlQzMkxfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50X2xlYXN0MzJfdCkgPj0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDMyX3QpID09IHNpemVvZihsem9fdWludF9sZWFzdDMyX3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCisjZGVmaW5lIGx6b19pbnRfbGVhc3Q2NF90ICAgICAgICAgICBsem9faW50NjRsX3QKKyNkZWZpbmUgbHpvX3VpbnRfbGVhc3Q2NF90ICAgICAgICAgIGx6b191aW50NjRsX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0xFQVNUNjRfVCBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50X2xlYXN0NjRfdCkgPj0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDY0X3QpID09IHNpemVvZihsem9fdWludF9sZWFzdDY0X3QpKQorI2VuZGlmCisjaWYgMQorI2RlZmluZSBsem9faW50X2Zhc3QzMl90ICAgICAgICAgICBsem9faW50MzJmX3QKKyNkZWZpbmUgbHpvX3VpbnRfZmFzdDMyX3QgICAgICAgICAgbHpvX3VpbnQzMmZfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlRfRkFTVDMyX1QgTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0MzJfdCkgPj0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0MzJfdCkgPT0gc2l6ZW9mKGx6b191aW50X2Zhc3QzMl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0Zl90KQorI2RlZmluZSBsem9faW50X2Zhc3Q2NF90ICAgICAgICAgICBsem9faW50NjRmX3QKKyNkZWZpbmUgbHpvX3VpbnRfZmFzdDY0X3QgICAgICAgICAgbHpvX3VpbnQ2NGZfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlRfRkFTVDY0X1QgTFpPX1NJWkVPRl9MWk9fSU5UNjRGX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0NjRfdCkgPj0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0NjRfdCkgPT0gc2l6ZW9mKGx6b191aW50X2Zhc3Q2NF90KSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19JTlQxNl9DKQorIyAgaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9JTlQgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgTFpPX1VJTlQxNl9DKGMpICAgICAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0xPTkcgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgICgoYykgKyAwTCkKKyMgICAgZGVmaW5lIExaT19VSU5UMTZfQyhjKSAgICAgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChMWk9fU0laRU9GX0lOVCA+PSAyKQorIyAgICBkZWZpbmUgTFpPX0lOVDE2X0MoYykgICAgICAgICAgKGMpCisjICAgIGRlZmluZSBMWk9fVUlOVDE2X0MoYykgICAgICAgICAoYyMjVSkKKyMgIGVsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSAyKQorIyAgICBkZWZpbmUgTFpPX0lOVDE2X0MoYykgICAgICAgICAgKGMjI0wpCisjICAgIGRlZmluZSBMWk9fVUlOVDE2X0MoYykgICAgICAgICAoYyMjVUwpCisjICBlbHNlCisjICAgIGVycm9yICJMWk9fSU5UMTZfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSU5UMzJfQykKKyMgIGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfSU5UID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgICgoYykgKyAwVSkKKyMgIGVsaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9MT05HID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9JTlQgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjKQorIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICAgICAgKGMjI1UpCisjICBlbGlmIChMWk9fU0laRU9GX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjIyNMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICAgICAgKGMjI1VMKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjIyNMTCkKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgIChjIyNVTEwpCisjICBlbHNlCisjICAgIGVycm9yICJMWk9fSU5UMzJfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSU5UNjRfQykgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjICBpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0lOVCA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDApCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoKGMpICsgMFUpCisjICBlbGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfTE9ORyA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKChjKSArIDBVTCkKKyMgIGVsaWYgKExaT19TSVpFT0ZfSU5UID49IDgpCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYykKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChjIyNVKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HID49IDgpCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjTCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChjIyNVTCkKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkxaT19JTlQ2NF9DIgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCiAKICNlbmRpZiAvKiBhbHJlYWR5IGluY2x1ZGVkICovCiAKLS8qIHZpbTpzZXQgdHM9NCBldDogKi8KKy8qIHZpbTpzZXQgdHM9NCBzdz00IGV0OiAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL21pbmlsem8uYyBiL2NvbW1vbi9taW5pbHpvLmMKaW5kZXggNmFlOGQ3My4uMjY1MTMxNyAxMDA2NDQKLS0tIGEvY29tbW9uL21pbmlsem8uYworKysgYi9jb21tb24vbWluaWx6by5jCkBAIC0yLDIxICsyLDcgQEAKIAogICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgogCi0gICBDb3B5cmlnaHQgKEMpIDIwMTAgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA5IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA2IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwMiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDAwIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMTk5OSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMTk5NiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiAgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC02NiwxMiArNTIsNiBAQAogI2lmIGRlZmluZWQoX19DWUdXSU4zMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQogIyAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmICFkZWZpbmVkKF9fSUJNQ19fKQotIyAgZGVmaW5lIF9fSUJNQ19fIF9fSUJNQ1BQX18KLSNlbmRpZgotI2lmIGRlZmluZWQoX19JQ0wpICYmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQotIyAgZGVmaW5lIF9fSU5URUxfQ09NUElMRVIgX19JQ0wKLSNlbmRpZgogI2lmIDEgJiYgZGVmaW5lZChfX0lOVEVSSVgpICYmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9BTExfU09VUkNFKQogIyAgZGVmaW5lIF9BTExfU09VUkNFIDEKICNlbmRpZgpAQCAtODAsMTkgKzYwLDMwIEBACiAjICAgIGRlZmluZSBfX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKICMgIGVuZGlmCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIGRlZmluZWQoX19saW51eF9fKQorI2lmICFkZWZpbmVkKExaT19DRkdfTk9fRElTQUJMRV9XVU5ERUYpCisjaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pCisjICBwcmFnbWEgZGlhZ19zdXBwcmVzcyAxOTMKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fY2xhbmdfbWlub3JfXykKKyMgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5kZWYiCisjZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCiAjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxOTMpCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQorI2VsaWYgZGVmaW5lZChfX0tFSUxfXykgJiYgZGVmaW5lZChfX0MxNjZfXykKICMgIHByYWdtYSB3YXJuaW5nIGRpc2FibGUgPSAzMjIKLSNlbGlmIDAgJiYgZGVmaW5lZChfX0MyNTFfXykKLSMgIHByYWdtYSB3YXJuaW5nIGRpc2FibGUgPSAzMjIKLSNlbmRpZgotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pCi0jICBpZiAoX01TQ19WRVIgPj0gMTMwMCkKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmICFkZWZpbmVkKF9fUEFUSFNDQUxFX18pCisjICBpZiAoKF9fR05VQ19fLTApID49IDUgfHwgKChfX0dOVUNfXy0wKSA9PSA0ICYmIChfX0dOVUNfTUlOT1JfXy0wKSA+PSAyKSkKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5kZWYiCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX01XRVJLU19fKQorIyAgaWYgKChfTVNDX1ZFUi0wKSA+PSAxMzAwKQogIyAgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NjY4KQogIyAgZW5kaWYKICNlbmRpZgorI2VuZGlmCisjaWYgMCAmJiBkZWZpbmVkKF9fUE9DQ19fKSAmJiBkZWZpbmVkKF9XSU4zMikKKyMgIGlmIChfX1BPQ0NfXyA+PSA0MDApCisjICAgIHByYWdtYSB3YXJuKGRpc2FibGU6IDIyMTYpCisjICBlbmRpZgorI2VuZGlmCiAjaWYgMCAmJiBkZWZpbmVkKF9fV0FUQ09NQ19fKQogIyAgaWYgKF9fV0FUQ09NQ19fID49IDEwNTApICYmIChfX1dBVENPTUNfXyA8IDEwNjApCiAjICAgIHByYWdtYSB3YXJuaW5nIDIwMyA5CkBAIC0xMDEsMTMgKzkyLDI5IEBACiAjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKICMgIHByYWdtYSBvcHRpb24gLWgKICNlbmRpZgotI2lmIDAKLSNkZWZpbmUgTFpPXzB4ZmZmZkwgICAgICAgICAgICAgMHhmZmZmdWwKLSNkZWZpbmUgTFpPXzB4ZmZmZmZmZmZMICAgICAgICAgMHhmZmZmZmZmZnVsCi0jZWxzZQotI2RlZmluZSBMWk9fMHhmZmZmTCAgICAgICAgICAgICA2NTUzNXVsCi0jZGVmaW5lIExaT18weGZmZmZmZmZmTCAgICAgICAgIDQyOTQ5NjcyOTV1bAorI2lmICEoTFpPX0NGR19OT19ESVNBQkxFX1dDUlROT05TVERDKQorI2lmbmRlZiBfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUgMQogI2VuZGlmCisjaWZuZGVmIF9DUlRfTk9OU1REQ19OT19XQVJOSU5HUworI2RlZmluZSBfQ1JUX05PTlNURENfTk9fV0FSTklOR1MgMQorI2VuZGlmCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgMAorI2RlZmluZSBMWk9fMHhmZmZmVUwgICAgICAgICAgICAweGZmZmZ1bAorI2RlZmluZSBMWk9fMHhmZmZmZmZmZlVMICAgICAgICAweGZmZmZmZmZmdWwKKyNlbHNlCisjZGVmaW5lIExaT18weGZmZmZVTCAgICAgICAgICAgIDY1NTM1dWwKKyNkZWZpbmUgTFpPXzB4ZmZmZmZmZmZVTCAgICAgICAgNDI5NDk2NzI5NXVsCisjZW5kaWYKKyNkZWZpbmUgTFpPXzB4ZmZmZkwgICAgICAgICAgICAgTFpPXzB4ZmZmZlVMCisjZGVmaW5lIExaT18weGZmZmZmZmZmTCAgICAgICAgIExaT18weGZmZmZmZmZmVUwKICNpZiAoTFpPXzB4ZmZmZkwgPT0gTFpPXzB4ZmZmZmZmZmZMKQogIyAgZXJyb3IgInlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbiAxIgogI2VuZGlmCkBAIC0xMjIsNiArMTI5LDEzIEBACiAjICBlcnJvciAieW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuIDQiCiAjZW5kaWYKICNlbmRpZgorI2lmIGRlZmluZWQoX19DT1VOVEVSX18pCisjICBpZm5kZWYgTFpPX0NGR19VU0VfQ09VTlRFUgorIyAgZGVmaW5lIExaT19DRkdfVVNFX0NPVU5URVIgMQorIyAgZW5kaWYKKyNlbHNlCisjICB1bmRlZiBMWk9fQ0ZHX1VTRV9DT1VOVEVSCisjZW5kaWYKICNpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCiAjaWYgZGVmaW5lZChfX1pUQ19fKSAmJiBkZWZpbmVkKF9fSTg2X18pICYmICFkZWZpbmVkKF9fT1MyX18pCiAjICBpZiAhZGVmaW5lZChNU0RPUykKQEAgLTI1MiwxNCArMjY2LDMxIEBACiAjZW5kaWYKICNkZWZpbmUgTFpPX1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICAjeAogI2RlZmluZSBMWk9fUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgIExaT19QUF9TVFJJTkdJWkUoeCkKKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDAoKSAgICAgICAgICAgICAgICAvKmVtcHR5Ki8KKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDEoYSkgICAgICAgICAgICAgICBhCiAjZGVmaW5lIExaT19QUF9DT05DQVQyKGEsYikgICAgICAgICAgICAgYSAjIyBiCiAjZGVmaW5lIExaT19QUF9DT05DQVQzKGEsYixjKSAgICAgICAgICAgYSAjIyBiICMjIGMKICNkZWZpbmUgTFpPX1BQX0NPTkNBVDQoYSxiLGMsZCkgICAgICAgICBhICMjIGIgIyMgYyAjIyBkCiAjZGVmaW5lIExaT19QUF9DT05DQVQ1KGEsYixjLGQsZSkgICAgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlCisjZGVmaW5lIExaT19QUF9DT05DQVQ2KGEsYixjLGQsZSxmKSAgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlICMjIGYKKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDcoYSxiLGMsZCxlLGYsZykgICBhICMjIGIgIyMgYyAjIyBkICMjIGUgIyMgZiAjIyBnCisjZGVmaW5lIExaT19QUF9FQ09OQ0FUMCgpICAgICAgICAgICAgICAgTFpPX1BQX0NPTkNBVDAoKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDEoYSkgICAgICAgICAgICAgIExaT19QUF9DT05DQVQxKGEpCiAjZGVmaW5lIExaT19QUF9FQ09OQ0FUMihhLGIpICAgICAgICAgICAgTFpPX1BQX0NPTkNBVDIoYSxiKQogI2RlZmluZSBMWk9fUFBfRUNPTkNBVDMoYSxiLGMpICAgICAgICAgIExaT19QUF9DT05DQVQzKGEsYixjKQogI2RlZmluZSBMWk9fUFBfRUNPTkNBVDQoYSxiLGMsZCkgICAgICAgIExaT19QUF9DT05DQVQ0KGEsYixjLGQpCiAjZGVmaW5lIExaT19QUF9FQ09OQ0FUNShhLGIsYyxkLGUpICAgICAgTFpPX1BQX0NPTkNBVDUoYSxiLGMsZCxlKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDYoYSxiLGMsZCxlLGYpICAgIExaT19QUF9DT05DQVQ2KGEsYixjLGQsZSxmKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDcoYSxiLGMsZCxlLGYsZykgIExaT19QUF9DT05DQVQ3KGEsYixjLGQsZSxmLGcpCisjZGVmaW5lIExaT19QUF9FTVBUWSAgICAgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTAoKSAgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTEoYSkgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTIoYSxiKSAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTMoYSxiLGMpICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTQoYSxiLGMsZCkgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTUoYSxiLGMsZCxlKSAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTYoYSxiLGMsZCxlLGYpICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTcoYSxiLGMsZCxlLGYsZykgICAgLyplbXB0eSovCiAjaWYgMQogI2RlZmluZSBMWk9fQ1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICN4CiAjZGVmaW5lIExaT19DUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgTFpPX0NQUF9TVFJJTkdJWkUoeCkKQEAgLTI2NywxMiArMjk4LDE2IEBACiAjZGVmaW5lIExaT19DUFBfQ09OQ0FUMyhhLGIsYykgICAgICAgICAgYSAjIyBiICMjIGMKICNkZWZpbmUgTFpPX0NQUF9DT05DQVQ0KGEsYixjLGQpICAgICAgICBhICMjIGIgIyMgYyAjIyBkCiAjZGVmaW5lIExaT19DUFBfQ09OQ0FUNShhLGIsYyxkLGUpICAgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlCisjZGVmaW5lIExaT19DUFBfQ09OQ0FUNihhLGIsYyxkLGUsZikgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlICMjIGYKKyNkZWZpbmUgTFpPX0NQUF9DT05DQVQ3KGEsYixjLGQsZSxmLGcpICBhICMjIGIgIyMgYyAjIyBkICMjIGUgIyMgZiAjIyBnCiAjZGVmaW5lIExaT19DUFBfRUNPTkNBVDIoYSxiKSAgICAgICAgICAgTFpPX0NQUF9DT05DQVQyKGEsYikKICNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUMyhhLGIsYykgICAgICAgICBMWk9fQ1BQX0NPTkNBVDMoYSxiLGMpCiAjZGVmaW5lIExaT19DUFBfRUNPTkNBVDQoYSxiLGMsZCkgICAgICAgTFpPX0NQUF9DT05DQVQ0KGEsYixjLGQpCiAjZGVmaW5lIExaT19DUFBfRUNPTkNBVDUoYSxiLGMsZCxlKSAgICAgTFpPX0NQUF9DT05DQVQ1KGEsYixjLGQsZSkKKyNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUNihhLGIsYyxkLGUsZikgICBMWk9fQ1BQX0NPTkNBVDYoYSxiLGMsZCxlLGYpCisjZGVmaW5lIExaT19DUFBfRUNPTkNBVDcoYSxiLGMsZCxlLGYsZykgTFpPX0NQUF9DT05DQVQ3KGEsYixjLGQsZSxmLGcpCiAjZW5kaWYKLSNkZWZpbmUgX19MWk9fTUFTS19HRU4obyxiKSAgICAgKCgoKChvKSA8PCAoKGIpLTEpKSAtIChvKSkgPDwgMSkgKyAobykpCisjZGVmaW5lIF9fTFpPX01BU0tfR0VOKG8sYikgICAgICgoKCgobykgPDwgKChiKS0hIShiKSkpIC0gKG8pKSA8PCAxKSArIChvKSohIShiKSkKICNpZiAxICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCiAjICBpZiAhZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKQogIyAgICBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUyAxCkBAIC0yODIsOSArMzE3LDEzIEBACiAjICBlbmRpZgogI2VuZGlmCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgIGRlZmluZSBMWk9fRVhURVJOX0MgZXh0ZXJuICJDIgorIyAgZGVmaW5lIExaT19FWFRFUk5fQyAgICAgICAgICBleHRlcm4gIkMiCisjICBkZWZpbmUgTFpPX0VYVEVSTl9DX0JFR0lOICAgIGV4dGVybiAiQyIgeworIyAgZGVmaW5lIExaT19FWFRFUk5fQ19FTkQgICAgICB9CiAjZWxzZQotIyAgZGVmaW5lIExaT19FWFRFUk5fQyBleHRlcm4KKyMgIGRlZmluZSBMWk9fRVhURVJOX0MgICAgICAgICAgZXh0ZXJuCisjICBkZWZpbmUgTFpPX0VYVEVSTl9DX0JFR0lOICAgIC8qZW1wdHkqLworIyAgZGVmaW5lIExaT19FWFRFUk5fQ19FTkQgICAgICAvKmVtcHR5Ki8KICNlbmRpZgogI2lmICFkZWZpbmVkKF9fTFpPX09TX09WRVJSSURFKQogI2lmIChMWk9fT1NfRlJFRVNUQU5ESU5HKQpAQCAtMzg1LDEyICs0MjQsMTIgQEAKICNlbGlmIGRlZmluZWQoX19WTVMpCiAjICBkZWZpbmUgTFpPX09TX1ZNUyAgICAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgInZtcyIKLSNlbGlmICgoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX1I1OTAwX18pKSB8fCBkZWZpbmVkKF9fTUlQU19QU1gyX18pKQorI2VsaWYgKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19SNTkwMF9fKSkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKQogIyAgZGVmaW5lIExaT19PU19DT05TT0xFICAgICAgICAxCiAjICBkZWZpbmUgTFpPX09TX0NPTlNPTEVfUFMyICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgImNvbnNvbGUiCiAjICBkZWZpbmUgTFpPX0lORk9fT1NfQ09OU09MRSAgICJwczIiCi0jZWxpZiAoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX3BzcF9fKSkKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19wc3BfXykKICMgIGRlZmluZSBMWk9fT1NfQ09OU09MRSAgICAgICAgMQogIyAgZGVmaW5lIExaT19PU19DT05TT0xFX1BTUCAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJjb25zb2xlIgpAQCAtNDE4LDkgKzQ1NywxOCBAQAogIyAgZWxpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKF9fTElOVVhfXykKICMgICAgZGVmaW5lIExaT19PU19QT1NJWF9MSU5VWCAgICAgIDEKICMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJsaW51eCIKLSMgIGVsaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19NQUNPU19fKQotIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX01BQ09TWCAgICAgMQotIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgIm1hY29zeCIKKyMgIGVsaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjICAgIGlmICgoX19FTlZJUk9OTUVOVF9JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRURfXy0wKSA+PSAyMDAwMCkKKyMgICAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0RBUldJTiAgICAgMTA0MAorIyAgICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAiZGFyd2luX2lwaG9uZSIKKyMgICAgZWxpZiAoKF9fRU5WSVJPTk1FTlRfTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRURfXy0wKSA+PSAxMDQwKQorIyAgICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfREFSV0lOICAgICBfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18KKyMgICAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImRhcndpbiIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfREFSV0lOICAgICAxCisjICAgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJkYXJ3aW4iCisjICAgIGVuZGlmCisjICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfTUFDT1NYICAgICBMWk9fT1NfUE9TSVhfREFSV0lOCiAjICBlbGlmIGRlZmluZWQoX19taW5peF9fKSB8fCBkZWZpbmVkKF9fbWluaXgpCiAjICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfTUlOSVggICAgICAxCiAjICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAibWluaXgiCkBAIC00NTUsMTggKzUwMywxOCBAQAogI2VuZGlmCiAjaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2KQogIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjICBpZiAoVUxPTkdfTUFYICE9IExaT18weGZmZmZmZmZmTCkKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogI2VuZGlmCiAjaWYgKExaT19PU19ET1MzMiB8fCBMWk9fT1NfT1MyIHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCiAjICBpZiAoVUlOVF9NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjICBpZiAoVUxPTkdfTUFYICE9IExaT18weGZmZmZmZmZmTCkKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogI2VuZGlmCiAjaWYgZGVmaW5lZChDSUwpICYmIGRlZmluZWQoX0dOVUNDKSAmJiBkZWZpbmVkKF9fR05VQ19fKQpAQCAtNDgyLDU5ICs1MzAsNjUgQEAKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgInNkY2MiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoU0RDQykKICNlbGlmIGRlZmluZWQoX19QQVRIU0NBTEVfXykgJiYgZGVmaW5lZChfX1BBVEhDQ19QQVRDSExFVkVMX18pCi0jICBkZWZpbmUgTFpPX0NDX1BBVEhTQ0FMRSAgICAgIChfX1BBVEhDQ19fICogMHgxMDAwMEwgKyBfX1BBVEhDQ19NSU5PUl9fICogMHgxMDAgKyBfX1BBVEhDQ19QQVRDSExFVkVMX18pCisjICBkZWZpbmUgTFpPX0NDX1BBVEhTQ0FMRSAgICAgIChfX1BBVEhDQ19fICogMHgxMDAwMEwgKyAoX19QQVRIQ0NfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fUEFUSENDX1BBVENITEVWRUxfXy0wKSkKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlBhdGhzY2FsZSBDIgogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBfX1BBVEhTQ0FMRV9fCi0jZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCi0jICBkZWZpbmUgTFpPX0NDX0lOVEVMQyAgICAgICAgIDEKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisjICAgIGRlZmluZSBMWk9fQ0NfUEFUSFNDQUxFX0dOVUMgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKChfX0lOVEVMX0NPTVBJTEVSLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfSU5URUxDICAgICAgICAgX19JTlRFTF9DT01QSUxFUgogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSW50ZWwgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0lOVEVMX0NPTVBJTEVSKQotIyAgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQotIyAgICBkZWZpbmUgTFpPX0NDX1NZTlRBWF9NU0MgMQotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX0NDX1NZTlRBWF9HTlVDIDEKKyMgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICgoX01TQ19WRVItMCkgPiAwKQorIyAgICBkZWZpbmUgTFpPX0NDX0lOVEVMQ19NU0MgICBfTVNDX1ZFUgorIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0lOVEVMQ19HTlVDICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQogIyAgZW5kaWYKICNlbGlmIGRlZmluZWQoX19QT0NDX18pICYmIGRlZmluZWQoX1dJTjMyKQogIyAgZGVmaW5lIExaT19DQ19QRUxMRVNDICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQZWxsZXMgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BPQ0NfXykKLSNlbGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorI2VsaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCiAjICBpZiBkZWZpbmVkKF9fR05VQ19QQVRDSExFVkVMX18pCi0jICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkdfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBMWk9fQ0NfQVJNQ0NfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKICMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DQ19DTEFOR19HTlVDICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyBfX0dOVUNfTUlOT1JfXyAqIDB4MTAwKQorIyAgICBkZWZpbmUgTFpPX0NDX0FSTUNDX0dOVUMgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwKQogIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fQ0NfQVJNQ0MgICAgICAgICAgX19BUk1DQ19WRVJTSU9OCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBUk0gQyBDb21waWxlciIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQogIyAgaWYgZGVmaW5lZChfX2NsYW5nX21ham9yX18pICYmIGRlZmluZWQoX19jbGFuZ19taW5vcl9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfcGF0Y2hsZXZlbF9fKQotIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HX0NMQU5HICAoX19jbGFuZ19tYWpvcl9fICogMHgxMDAwMEwgKyBfX2NsYW5nX21pbm9yX18gKiAweDEwMCArIF9fY2xhbmdfcGF0Y2hsZXZlbF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HICAgICAgICAoX19jbGFuZ19tYWpvcl9fICogMHgxMDAwMEwgKyAoX19jbGFuZ19taW5vcl9fLTApICogMHgxMDAgKyAoX19jbGFuZ19wYXRjaGxldmVsX18tMCkpCiAjICBlbHNlCi0jICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkdfQ0xBTkcgIDB4MDIwNzAwTAorIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HICAgICAgICAweDAxMDAwMEwKICMgIGVuZGlmCi0jICBkZWZpbmUgTFpPX0NDX0NMQU5HICAgICAgICAgIExaT19DQ19DTEFOR19HTlVDCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgICAgZGVmaW5lIExaT19DQ19DTEFOR19NU0MgICAgX01TQ19WRVIKKyMgIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19DQ19DTEFOR19HTlVDICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZW5kaWYKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgImNsYW5nIgogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBfX1ZFUlNJT05fXwogI2VsaWYgZGVmaW5lZChfX2xsdm1fXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKICMgIGlmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKLSMgICAgZGVmaW5lIExaT19DQ19MTFZNX0dOVUMgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyBfX0dOVUNfTUlOT1JfXyAqIDB4MTAwICsgX19HTlVDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19MTFZNX0dOVUMgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQogIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX0NDX0xMVk1fR05VQyAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIF9fR05VQ19NSU5PUl9fICogMHgxMDApCisjICAgIGRlZmluZSBMWk9fQ0NfTExWTV9HTlVDICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDApCiAjICBlbmRpZgogIyAgZGVmaW5lIExaT19DQ19MTFZNICAgICAgICAgICBMWk9fQ0NfTExWTV9HTlVDCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJsbHZtLWdjYyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fR05VQ19QQVRDSExFVkVMX18pCi0jICAgIGRlZmluZSBMWk9fQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCi0jICBlbGlmIGRlZmluZWQoX19HTlVDX01JTk9SX18pCi0jICAgIGRlZmluZSBMWk9fQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCkKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DQ19HTlVDICAgICAgICAgKF9fR05VQ19fICogMHgxMDAwMEwpCi0jICBlbmRpZgotIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiZ2NjIgotIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBfX1ZFUlNJT05fXwogI2VsaWYgZGVmaW5lZChfX0FDS19fKSAmJiBkZWZpbmVkKF9BQ0spCiAjICBkZWZpbmUgTFpPX0NDX0FDSyAgICAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkFtc3RlcmRhbSBDb21waWxlciBLaXQgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgInVua25vd24iCisjZWxpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgTFpPX0NDX0FSTUNDICAgICAgICAgIF9fQVJNQ0NfVkVSU0lPTgorIyAgZGVmaW5lIExaT19DQ19BUk1DQ19BUk1DQyAgICBfX0FSTUNDX1ZFUlNJT04KKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkFSTSBDIENvbXBpbGVyIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fQVJNQ0NfVkVSU0lPTikKICNlbGlmIGRlZmluZWQoX19BWlRFQ19DX18pCiAjICBkZWZpbmUgTFpPX0NDX0FaVEVDQyAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkF6dGVjIEMiCkBAIC01NTksMTAgKzYxMywyMyBAQAogIyAgZGVmaW5lIExaT19DQ19ERUNDICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJERUMgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0RFQ0MpCisjZWxpZiAoZGVmaW5lZChfX2docykgfHwgZGVmaW5lZChfX2doc19fKSkgJiYgZGVmaW5lZChfX0dIU19WRVJTSU9OX05VTUJFUikgJiYgKChfX0dIU19WRVJTSU9OX05VTUJFUi0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0dIUyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkdyZWVuIEhpbGxzIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19HSFNfVkVSU0lPTl9OVU1CRVIpCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgICAgZGVmaW5lIExaT19DQ19HSFNfTVNDICAgICAgX01TQ19WRVIKKyMgIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19DQ19HSFNfR05VQyAgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZW5kaWYKICNlbGlmIGRlZmluZWQoX19ISUdIQ19fKQogIyAgZGVmaW5lIExaT19DQ19ISUdIQyAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJNZXRhV2FyZSBIaWdoIEMiCiAjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VsaWYgZGVmaW5lZChfX0hQX2FDQykgJiYgKChfX0hQX2FDQy0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0hQQUNDICAgICAgICAgIF9fSFBfYUNDCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJIUCBhQ0MiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19IUF9hQ0MpCiAjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pCiAjICBkZWZpbmUgTFpPX0NDX0lBUkMgICAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIklBUiBDIgpAQCAtNTcxLDEwICs2MzgsMTQgQEAKICMgIGVsc2UKICMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCiAjICBlbmRpZgotI2VsaWYgZGVmaW5lZChfX0lCTUNfXykKLSMgIGRlZmluZSBMWk9fQ0NfSUJNQyAgICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX0lCTUNfXykgJiYgKChfX0lCTUNfXy0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0lCTUMgICAgICAgICAgIF9fSUJNQ19fCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJJQk0gQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0lCTUNfXykKKyNlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgKChfX0lCTUNQUF9fLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfSUJNQyAgICAgICAgICAgX19JQk1DUFBfXworIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSUJNIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19JQk1DUFBfXykKICNlbGlmIGRlZmluZWQoX19LRUlMX18pICYmIGRlZmluZWQoX19DMTY2X18pCiAjICBkZWZpbmUgTFpPX0NDX0tFSUxDICAgICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIktlaWwgQyIKQEAgLTU5MSwxNiArNjYyLDggQEAKICMgIGVsc2UKICMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCiAjICBlbmRpZgotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLSMgIGRlZmluZSBMWk9fQ0NfTVNDICAgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiTWljcm9zb2Z0IEMiCi0jICBpZiBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpCi0jICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX01TQ19WRVIpICIuIiBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfRlVMTF9WRVIpCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX01TQ19WRVIpCi0jICBlbmRpZgotI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKQotIyAgZGVmaW5lIExaT19DQ19NV0VSS1MgICAgICAgICAxCisjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmICgoX19NV0VSS1NfXy0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX01XRVJLUyAgICAgICAgIF9fTVdFUktTX18KICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIk1ldHJvd2Vya3MgQyIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX01XRVJLU19fKQogI2VsaWYgKGRlZmluZWQoX19ORFBDX18pIHx8IGRlZmluZWQoX19ORFBYX18pKSAmJiBkZWZpbmVkKF9faTM4NikKQEAgLTYxMSw2ICs2NzQsMTUgQEAKICMgIGRlZmluZSBMWk9fQ0NfUEFDSUZJQ0MgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiUGFjaWZpYyBDIgogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEFDSUZJQ19fKQorI2VsaWYgZGVmaW5lZChfX1BHSSkgJiYgZGVmaW5lZChfX1BHSUNfXykgJiYgZGVmaW5lZChfX1BHSUNfTUlOT1JfXykKKyMgIGlmIGRlZmluZWQoX19QR0lDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19QR0kgICAgICAgICAgKF9fUEdJQ19fICogMHgxMDAwMEwgKyAoX19QR0lDX01JTk9SX18tMCkgKiAweDEwMCArIChfX1BHSUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEdJQ19fKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BHSUNfTUlOT1JfXykgIi4iIExaT19QUF9NQUNST19FWFBBTkQoX19QR0lDX1BBVENITEVWRUxfXykKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19DQ19QR0kgICAgICAgICAgKF9fUEdJQ19fICogMHgxMDAwMEwgKyAoX19QR0lDX01JTk9SX18tMCkgKiAweDEwMCkKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BHSUNfXykgIi4iIExaT19QUF9NQUNST19FWFBBTkQoX19QR0lDX01JTk9SX18pICIuMCIKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQb3J0bGFuZCBHcm91cCBQR0kgQyIKICNlbGlmIGRlZmluZWQoX19QR0kpICYmIChkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX1dJTjMyX18pKQogIyAgZGVmaW5lIExaT19DQ19QR0kgICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQb3J0bGFuZCBHcm91cCBQR0kgQyIKQEAgLTYyNSw3ICs2OTcsNyBAQAogIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fU0NfXykKICNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgotIyAgaWYgKChfX1NVTlBST19DKSswID4gMCkKKyMgIGlmICgoX19TVU5QUk9fQy0wKSA+IDApCiAjICAgIGRlZmluZSBMWk9fQ0NfU1VOUFJPQyAgICAgIF9fU1VOUFJPX0MKICMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1NVTlBST19DKQogIyAgZWxzZQpAQCAtNjM0LDcgKzcwNiw3IEBACiAjICBlbmRpZgogI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgotIyAgaWYgKChfX1NVTlBST19DQykrMCA+IDApCisjICBpZiAoKF9fU1VOUFJPX0NDLTApID4gMCkKICMgICAgZGVmaW5lIExaT19DQ19TVU5QUk9DICAgICAgX19TVU5QUk9fQ0MKICMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1NVTlBST19DQykKICMgIGVsc2UKQEAgLTY2MCwxNiArNzMyLDQ2IEBACiAjZWxpZiBkZWZpbmVkKF9fWlRDX18pCiAjICBkZWZpbmUgTFpPX0NDX1pPUlRFQ0hDICAgICAgIDEKICMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlpvcnRlY2ggQyIKLSMgIGlmIChfX1pUQ19fID09IDB4MzEwKQorIyAgaWYgKChfX1pUQ19fLTApID09IDB4MzEwKQogIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAiMHgzMTAiCiAjICBlbHNlCiAjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19aVENfXykKICMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgaWYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCisjICBlbGlmIGRlZmluZWQoX19HTlVDX01JTk9SX18pCisjICAgIGRlZmluZSBMWk9fQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDApCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMKQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgImdjYyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmICgoX01TQ19WRVItMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19NU0MgICAgICAgICAgICBfTVNDX1ZFUgorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiTWljcm9zb2Z0IEMiCisjICBpZiBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX01TQ19WRVIpICIuIiBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfRlVMTF9WRVIpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX01TQ19WRVIpCisjICBlbmRpZgogI2Vsc2UKICMgIGRlZmluZSBMWk9fQ0NfVU5LTk9XTiAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAidW5rbm93biIKICMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgInVua25vd24iCiAjZW5kaWYKKyNpZiAoTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19PUEVONjRfXykKKyMgIGlmIGRlZmluZWQoX19PUEVOQ0NfXykgJiYgZGVmaW5lZChfX09QRU5DQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fT1BFTkNDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19PUEVONjQgICAgICAgKF9fT1BFTkNDX18gKiAweDEwMDAwTCArIChfX09QRU5DQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19PUEVOQ0NfUEFUQ0hMRVZFTF9fLTApKQorIyAgICBkZWZpbmUgTFpPX0NDX09QRU42NF9HTlVDICBMWk9fQ0NfR05VQworIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX1BDQ19fKQorIyAgaWYgZGVmaW5lZChfX1BDQ19fKSAmJiBkZWZpbmVkKF9fUENDX01JTk9SX18pICYmIGRlZmluZWQoX19QQ0NfTUlOT1JNSU5PUl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX1BDQyAgICAgICAgICAoX19QQ0NfXyAqIDB4MTAwMDBMICsgKF9fUENDX01JTk9SX18tMCkgKiAweDEwMCArIChfX1BDQ19NSU5PUk1JTk9SX18tMCkpCisjICAgIGRlZmluZSBMWk9fQ0NfUENDX0dOVUMgICAgIExaT19DQ19HTlVDCisjICBlbmRpZgorI2VuZGlmCiAjaWYgMCAmJiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpICYmICFkZWZpbmVkKF9NU0NfRlVMTF9WRVIpCiAjICBlcnJvciAiTFpPX0NDX01TQzogX01TQ19GVUxMX1ZFUiBpcyBub3QgZGVmaW5lZCIKICNlbmRpZgpAQCAtNjg3LDggKzc4OSwxMCBAQAogIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImdlbmVyaWMiCiAjZWxpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYpCiAjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NiAgICAgICAgICAgICAxCi0jICBkZWZpbmUgTFpPX0FSQ0hfSUExNiAgICAgICAgICAgICAxCiAjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiaTA4NiIKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisjICBkZWZpbmUgTFpPX0FSQ0hfQVJNNjQgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiYXJtNjQiCiAjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2FscGhhKSB8fCBkZWZpbmVkKF9NX0FMUEhBKQogIyAgZGVmaW5lIExaT19BUkNIX0FMUEhBICAgICAgICAgICAgMQogIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImFscGhhIgpAQCAtNzA0LDEwICs4MDgsMTAgQEAKICMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJhcm1fdGh1bWIiCiAjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19JQ0NBUk1fXykKICMgIGRlZmluZSBMWk9fQVJDSF9BUk0gICAgICAgICAgICAgIDEKLSMgIGlmIGRlZmluZWQoX19DUFVfTU9ERV9fKSAmJiAoKF9fQ1BVX01PREVfXykrMCA9PSAxKQorIyAgaWYgZGVmaW5lZChfX0NQVV9NT0RFX18pICYmICgoX19DUFVfTU9ERV9fLTApID09IDEpCiAjICAgIGRlZmluZSBMWk9fQVJDSF9BUk1fVEhVTUIgICAgICAxCiAjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiYXJtX3RodW1iIgotIyAgZWxpZiBkZWZpbmVkKF9fQ1BVX01PREVfXykgJiYgKChfX0NQVV9NT0RFX18pKzAgPT0gMikKKyMgIGVsaWYgZGVmaW5lZChfX0NQVV9NT0RFX18pICYmICgoX19DUFVfTU9ERV9fLTApID09IDIpCiAjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiYXJtIgogIyAgZWxzZQogIyAgICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgImFybSIKQEAgLTgyNSw1MyArOTI5LDE0NyBAQAogIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCiAjZW5kaWYKICNpZiAxICYmIChMWk9fQVJDSF9VTktOT1dOKSAmJiAoTFpPX09TX1dJTjMyKQotIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBXSU4zMiBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjICBlcnJvciAiRklYTUUgLSBtaXNzaW5nIExaT19PU19XSU4zMiBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCiAjZW5kaWYKICNpZiAxICYmIChMWk9fQVJDSF9VTktOT1dOKSAmJiAoTFpPX09TX1dJTjY0KQotIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBXSU42NCBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjICBlcnJvciAiRklYTUUgLSBtaXNzaW5nIExaT19PU19XSU42NCBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCiAjZW5kaWYKICNpZiAoTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNikKICMgIGRlZmluZSBMWk9fQVJDSF9JMDg2UE0gICAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fQVJDSF9JQTE2UE0gICAgICAgICAgIDEKICNlbGlmIDEgJiYgKExaT19PU19ET1MxNiAmJiBkZWZpbmVkKEJMWDI4NikpCiAjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCi0jICBkZWZpbmUgTFpPX0FSQ0hfSUExNlBNICAgICAgICAgICAxCiAjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgZGVmaW5lZChET1NYMjg2KSkKICMgIGRlZmluZSBMWk9fQVJDSF9JMDg2UE0gICAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fQVJDSF9JQTE2UE0gICAgICAgICAgIDEKICNlbGlmIDEgJiYgKExaT19PU19ET1MxNiAmJiBMWk9fQ0NfQk9STEFOREMgJiYgZGVmaW5lZChfX0RQTUkxNl9fKSkKICMgIGRlZmluZSBMWk9fQVJDSF9JMDg2UE0gICAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fQVJDSF9JQTE2UE0gICAgICAgICAgIDEKICNlbmRpZgotI2lmIChMWk9fQVJDSF9BUk1fVEhVTUIpICYmICEoTFpPX0FSQ0hfQVJNKQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjaWYgKExaT19BUkNIX0FNRDY0ICYmICFMWk9fQVJDSF9YNjQpCisjICBkZWZpbmUgTFpPX0FSQ0hfWDY0ICAgICAgICAgICAgICAxCisjZWxpZiAoIUxaT19BUkNIX0FNRDY0ICYmIExaT19BUkNIX1g2NCkgJiYgZGVmaW5lZChfX0xaT19BUkNIX09WRVJSSURFKQorIyAgZGVmaW5lIExaT19BUkNIX0FNRDY0ICAgICAgICAgICAgMQogI2VuZGlmCi0jaWYgKExaT19BUkNIX0kwODZQTSkgJiYgIShMWk9fQVJDSF9JMDg2KQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjaWYgKExaT19BUkNIX0FSTTY0ICYmICFMWk9fQVJDSF9BQVJDSDY0KQorIyAgZGVmaW5lIExaT19BUkNIX0FBUkNINjQgICAgICAgICAgMQorI2VsaWYgKCFMWk9fQVJDSF9BUk02NCAmJiBMWk9fQVJDSF9BQVJDSDY0KSAmJiBkZWZpbmVkKF9fTFpPX0FSQ0hfT1ZFUlJJREUpCisjICBkZWZpbmUgTFpPX0FSQ0hfQVJNNjQgICAgICAgICAgICAxCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfSTM4NiAmJiAhTFpPX0FSQ0hfWDg2KQorIyAgZGVmaW5lIExaT19BUkNIX1g4NiAgICAgICAgICAgICAgMQorI2VsaWYgKCFMWk9fQVJDSF9JMzg2ICYmIExaT19BUkNIX1g4NikgJiYgZGVmaW5lZChfX0xaT19BUkNIX09WRVJSSURFKQorIyAgZGVmaW5lIExaT19BUkNIX0kzODYgICAgICAgICAgICAxCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQU1ENjQgJiYgIUxaT19BUkNIX1g2NCkgfHwgKCFMWk9fQVJDSF9BTUQ2NCAmJiBMWk9fQVJDSF9YNjQpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0FSTTY0ICYmICFMWk9fQVJDSF9BQVJDSDY0KSB8fCAoIUxaT19BUkNIX0FSTTY0ICYmIExaT19BUkNIX0FBUkNINjQpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0kzODYgJiYgIUxaT19BUkNIX1g4NikgfHwgKCFMWk9fQVJDSF9JMzg2ICYmIExaT19BUkNIX1g4NikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNX1RIVU1CICYmICFMWk9fQVJDSF9BUk0pCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0FSTV9USFVNQjEgJiYgIUxaT19BUkNIX0FSTV9USFVNQikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNX1RIVU1CMiAmJiAhTFpPX0FSQ0hfQVJNX1RIVU1CKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk1fVEhVTUIxICYmIExaT19BUkNIX0FSTV9USFVNQjIpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0kwODZQTSAmJiAhTFpPX0FSQ0hfSTA4NikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjZW5kaWYKICNpZiAoTFpPX0FSQ0hfSTA4NikKICMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmTCkKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogIyAgaWYgKFVMT05HX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICNlbmRpZgogI2lmIChMWk9fQVJDSF9JMzg2KQogIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKSAmJiBkZWZpbmVkKF9faTM4Nl9pbnQxNl9fKQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjICBpZiAoVUlOVF9NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKSAmJiAhZGVmaW5lZChfX2kzODZfaW50MTZfXykKLSMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCiAjICBlbmRpZgogIyAgaWYgKFVMT05HX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZW5kaWYKICNlbmRpZgotI2lmICFkZWZpbmVkKF9fTFpPX01NX09WRVJSSURFKQorI2lmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KQorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTIpCisjICAgIGlmIGRlZmluZWQoX19TU0UyX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU0UyICAgICAgIDEKKyMgICAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKGRlZmluZWQoX01fSVg4Nl9GUCkgJiYgKChfTV9JWDg2X0ZQKSswID49IDIpKSB8fCBkZWZpbmVkKF9NX0FNRDY0KSkKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTIgICAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NFMikKKyMgICAgaWYgZGVmaW5lZChfX1NTU0UzX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAgICAgIDEKKyMgICAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9fQVZYX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMikKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpCisjICAgIGlmIGRlZmluZWQoX19TU0U0XzJfXykKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMiAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYKQorIyAgaWYgKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykKKyMgICAgaWYgZGVmaW5lZChfX0FWWF9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9BVlgyKQorIyAgaWYgKExaT19UQVJHRVRfRkVBVFVSRV9BVlgpCisjICAgIGlmIGRlZmluZWQoX19BVlgyX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9BVlgyICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9TU0UyKSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMiAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19UQVJHRVRfRkVBVFVSRV9BVlggJiYgIShMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYMiAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9BVlgpKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk0pCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTikKKyMgICAgaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9ORU9OICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNNjQpCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTikKKyMgICAgaWYgMQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTiAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgMAorI2VsaWYgIWRlZmluZWQoX19MWk9fTU1fT1ZFUlJJREUpCiAjaWYgKExaT19BUkNIX0kwODYpCiAjaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogI2VuZGlmCiAjaWYgZGVmaW5lZChfX1RJTllfXykgfHwgZGVmaW5lZChNX0k4NlRNKSB8fCBkZWZpbmVkKF9NX0k4NlRNKQogIyAgZGVmaW5lIExaT19NTV9USU5ZICAgICAgICAgICAxCkBAIC04OTgsNyArMTA5Niw3IEBACiAjZWxpZiAoTFpPX0NDX1pPUlRFQ0hDICYmIGRlZmluZWQoX19WQ01fXykpCiAjICBkZWZpbmUgTFpPX01NX0xBUkdFICAgICAgICAgIDEKICNlbHNlCi0jICBlcnJvciAidW5rbm93biBtZW1vcnkgbW9kZWwiCisjICBlcnJvciAidW5rbm93biBMWk9fQVJDSF9JMDg2IG1lbW9yeSBtb2RlbCIKICNlbmRpZgogI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNikKICNkZWZpbmUgTFpPX0hBVkVfTU1fSFVHRV9QVFIgICAgICAgIDEKQEAgLTkyMSwxMCArMTExOSwxMCBAQAogI2VuZGlmCiAjaWYgKExaT19BUkNIX0kwODZQTSkgJiYgIShMWk9fSEFWRV9NTV9IVUdFX1BUUikKICMgIGlmIChMWk9fT1NfRE9TMTYpCi0jICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgogIyAgZWxpZiAoTFpPX0NDX1pPUlRFQ0hDKQogIyAgZWxzZQotIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKICMgIGVuZGlmCiAjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtOTU2LDcgKzExNTQsNyBAQAogI2VuZGlmCiAjZWxpZiAoTFpPX0FSQ0hfQzE2NikKICNpZiAhZGVmaW5lZChfX01PREVMX18pCi0jICBlcnJvciAiRklYTUUgLSBDMTY2IF9fTU9ERUxfXyIKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX0MxNjYgX19NT0RFTF9fIgogI2VsaWYgKChfX01PREVMX18pID09IDApCiAjICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAgIDEKICNlbGlmICgoX19NT0RFTF9fKSA9PSAxKQpAQCAtOTcwLDExICsxMTY4LDExIEBACiAjZWxpZiAoKF9fTU9ERUxfXykgPT0gNSkKICMgIGRlZmluZSBMWk9fTU1fWFNNQUxMICAgICAgICAgMQogI2Vsc2UKLSMgIGVycm9yICJGSVhNRSAtIEMxNjYgX19NT0RFTF9fIgorIyAgZXJyb3IgIkZJWE1FIC0gTFpPX0FSQ0hfQzE2NiBfX01PREVMX18iCiAjZW5kaWYKICNlbGlmIChMWk9fQVJDSF9NQ1MyNTEpCiAjaWYgIWRlZmluZWQoX19NT0RFTF9fKQotIyAgZXJyb3IgIkZJWE1FIC0gTUNTMjUxIF9fTU9ERUxfXyIKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX01DUzI1MSBfX01PREVMX18iCiAjZWxpZiAoKF9fTU9ERUxfXykgPT0gMCkKICMgIGRlZmluZSBMWk9fTU1fU01BTEwgICAgICAgICAgMQogI2VsaWYgKChfX01PREVMX18pID09IDIpCkBAIC05ODYsMTEgKzExODQsMTEgQEAKICNlbGlmICgoX19NT0RFTF9fKSA9PSA1KQogIyAgZGVmaW5lIExaT19NTV9YU01BTEwgICAgICAgICAxCiAjZWxzZQotIyAgZXJyb3IgIkZJWE1FIC0gTUNTMjUxIF9fTU9ERUxfXyIKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX01DUzI1MSBfX01PREVMX18iCiAjZW5kaWYKICNlbGlmIChMWk9fQVJDSF9NQ1M1MSkKICNpZiAhZGVmaW5lZChfX01PREVMX18pCi0jICBlcnJvciAiRklYTUUgLSBNQ1M1MSBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1M1MSBfX01PREVMX18iCiAjZWxpZiAoKF9fTU9ERUxfXykgPT0gMSkKICMgIGRlZmluZSBMWk9fTU1fU01BTEwgICAgICAgICAgMQogI2VsaWYgKChfX01PREVMX18pID09IDIpCkBAIC0xMDAyLDcgKzEyMDAsNyBAQAogI2VsaWYgKChfX01PREVMX18pID09IDUpCiAjICBkZWZpbmUgTFpPX01NX1hTTUFMTCAgICAgICAgIDEKICNlbHNlCi0jICBlcnJvciAiRklYTUUgLSBNQ1M1MSBfX01PREVMX18iCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1M1MSBfX01PREVMX18iCiAjZW5kaWYKICNlbGlmIChMWk9fQVJDSF9DUkFZX1BWUCkKICMgIGRlZmluZSBMWk9fTU1fUFZQICAgICAgICAgICAgMQpAQCAtMTAyOSw1NjcgKzEyMjcsMTU2IEBACiAjICBlcnJvciAidW5rbm93biBtZW1vcnkgbW9kZWwiCiAjZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX1NIT1JUKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgICAgKFNJWkVPRl9TSE9SVCkKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX0lOVCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChTSVpFT0ZfSU5UKQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfTE9ORykKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAgIChTSVpFT0ZfTE9ORykKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChTSVpFT0ZfTE9OR19MT05HKQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQxNikKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UMTYgICAgICAgIChTSVpFT0ZfX19JTlQxNikKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX19fSU5UMzIpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDMyICAgICAgICAoU0laRU9GX19fSU5UMzIpCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgKFNJWkVPRl9fX0lOVDY0KQotI2VuZGlmCi0jaWYgZGVmaW5lZChTSVpFT0ZfVk9JRF9QKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgKFNJWkVPRl9WT0lEX1ApCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNJWkVPRl9TSVpFX1QpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICAoU0laRU9GX1NJWkVfVCkKLSNlbmRpZgotI2lmIGRlZmluZWQoU0laRU9GX1BUUkRJRkZfVCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIChTSVpFT0ZfUFRSRElGRl9UKQotI2VuZGlmCi0jZGVmaW5lIF9fTFpPX0xTUih4LGIpICAgICgoKHgpKzB1bCkgPj4gKGIpKQotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfU0hPUlQpCi0jICBpZiAoTFpPX0FSQ0hfQ1JBWV9QVlApCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICA4Ci0jICBlbGlmIChVU0hSVF9NQVggPT0gTFpPXzB4ZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAyCi0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAxCi0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDE1KSA9PSAxKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgMgotIyAgZWxpZiAoX19MWk9fTFNSKFVTSFJUX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsNjMpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICA4Ci0jICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDEyNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDE2Ci0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fU0laRU9GX1NIT1JUIgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfSU5UKQotIyAgaWYgKExaT19BUkNIX0NSQVlfUFZQKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9JTlQgICAgICAgICAgOAotIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAyCi0jICBlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICA0Ci0jICBlbGlmIChfX0xaT19MU1IoVUlOVF9NQVgsNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDEKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxNSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDIKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCw2MykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDgKLSMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxMjcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAxNgotIyAgZWxzZQotIyAgICBlcnJvciAiTFpPX1NJWkVPRl9JTlQiCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HKQotIyAgaWYgKFVMT05HX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA0Ci0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDcpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxCi0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDE1KSA9PSAxKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgMgotIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwzMSkgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDQKLSMgIGVsaWYgKF9fTFpPX0xTUihVTE9OR19NQVgsNjMpID09IDEpCi0jICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA4Ci0jICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDEyNykgPT0gMSkKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDE2Ci0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fU0laRU9GX0xPTkciCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKLSNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQotIyAgaWYgZGVmaW5lZChfX0xPTkdfTUFYX18pICYmIGRlZmluZWQoX19MT05HX0xPTkdfTUFYX18pCi0jICAgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDMwMHVsKQotIyAgICAgIGlmICgoX19MT05HX01BWF9fKSswID09IChfX0xPTkdfTE9OR19NQVhfXykrMCkKLSMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIExaT19TSVpFT0ZfTE9ORwotIyAgICAgIGVsaWYgKF9fTFpPX0xTUihfX0xPTkdfTE9OR19NQVhfXywzMCkgPT0gMSkKLSMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDQKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKLSNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQotI2lmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19ETUMpCi0jZWxpZiAoTFpPX0NDX0NJTExZKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4Ci0jZWxpZiAoTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjY0KSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfRE1DKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfU1lNQU5URUNDICYmIChfX1NDX18gPj0gMHg3MDApKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDICYmIGRlZmluZWQoX19saW51eF9fKSkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX01XRVJLUyB8fCBMWk9fQ0NfUEVMTEVTQyB8fCBMWk9fQ0NfUEdJIHx8IExaT19DQ19TVU5QUk9DKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAotI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgZGVmaW5lZChfV0lOMzIpKSAmJiAoTFpPX0NDX01TQykpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTIwKSkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDExMDApKSkKLSMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKLSNlbGlmIChMWk9fQ0NfV0FUQ09NQyAmJiBkZWZpbmVkKF9JTlRFR1JBTF9NQVhfQklUUykgJiYgKF9JTlRFR1JBTF9NQVhfQklUUyA9PSA2NCkpCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4Ci0jZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VsaWYgKExaT19DQ19TRENDKSAmJiAoTFpPX1NJWkVPRl9JTlQgPT0gMikKLSNlbGlmIDEgJiYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIChMWk9fQ0NfR05VQykKLSMgIGlmIChMWk9fQ0NfR05VQyA8IDB4MDIwODAwdWwpCi0jICAgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKExaT19DRkdfTk9fTE9OR19MT05HKSB8fCBkZWZpbmVkKF9fTk9fTE9OR19MT05HKQotIyAgdW5kZWYgTFpPX1NJWkVPRl9MT05HX0xPTkcKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQotI2lmIChMWk9fQVJDSF9JMDg2KQotIyAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgICAgMgotIyAgaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZWxpZiAoTFpPX01NX0NPTVBBQ1QgfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAotIyAgZWxzZQotIyAgICBlcnJvciAiTFpPX01NIgotIyAgZW5kaWYKLSNlbGlmIChMWk9fQVJDSF9BVlIgfHwgTFpPX0FSQ0hfWjgwKQotIyAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgotI2VsaWYgKExaT19BUkNIX0MxNjYgfHwgTFpPX0FSQ0hfTUNTNTEgfHwgTFpPX0FSQ0hfTUNTMjUxIHx8IExaT19BUkNIX01TUDQzMCkKLSMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDIKLSNlbGlmIChMWk9fQVJDSF9IODMwMCkKLSMgIGlmIGRlZmluZWQoX19OT1JNQUxfTU9ERV9fKQotIyAgICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgNAotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykgfHwgZGVmaW5lZChfX0g4MzAwU1hfXykKLSMgICAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgIDQKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIF9fTFpPX1dPUkRTSVpFICAgICAgICAgIDIKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDIKLSMgIGVuZGlmCi0jICBpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwNDAwMDB1bCkpICYmIChMWk9fU0laRU9GX0lOVCA9PSA0KQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgTFpPX1NJWkVPRl9JTlQKLSMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfSU5UCi0jICBlbmRpZgotI2VsaWYgKExaT19BUkNIX00xNkMpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICAyCi0jICBpZiBkZWZpbmVkKF9fbTMyY19jcHVfXykgfHwgZGVmaW5lZChfX20zMmNtX2NwdV9fKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgotIyAgZW5kaWYKLSNlbGlmIChMWk9fU0laRU9GX0xPTkcgPT0gOCkgJiYgKChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICA4Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0Ci0jZWxpZiBkZWZpbmVkKF9fTExQNjRfXykgfHwgZGVmaW5lZChfX0xMUDY0KSB8fCBkZWZpbmVkKF9MTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICA4Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4Ci0jZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfTE9ORwotI2VsaWYgKExaT19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCi0jICBkZWZpbmUgX19MWk9fV09SRFNJWkUgICAgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDE2Ci0jICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICBMWk9fU0laRU9GX0xPTkcKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfTE9ORwotI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgOAotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgICBMWk9fU0laRU9GX0xPTkcKLSNlbGlmIChMWk9fQVJDSF9TUFUpCi0jIGlmIDAKLSMgIGRlZmluZSBfX0xaT19XT1JEU0laRSAgICAgICAgICAgIDE2Ci0jIGVuZGlmCi0jICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0Ci0jZWxzZQotIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCi0jZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19XT1JEU0laRSkKLSMgIGlmIGRlZmluZWQoX19MWk9fV09SRFNJWkUpCi0jICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICBfX0xaT19XT1JEU0laRQotIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKLSNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9NMTZDKQotIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgMgotI2Vsc2UKLSMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfVk9JRF9QCi0jZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfUFRSRElGRl9UKQotI2lmIChMWk9fQVJDSF9JMDg2KQotIyAgaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNIHx8IExaT19NTV9IVUdFKQotIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgTFpPX1NJWkVPRl9WT0lEX1AKLSMgIGVsaWYgKExaT19NTV9DT01QQUNUIHx8IExaT19NTV9MQVJHRSkKLSMgICAgaWYgKExaT19DQ19CT1JMQU5EQyB8fCBMWk9fQ0NfVFVSQk9DKQotIyAgICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgNAotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAyCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGVycm9yICJMWk9fTU0iCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfU0laRV9UCi0jZW5kaWYKLSNlbmRpZgotI2lmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQotIyAgdW5kZWYgTFpPX0FCSV9CSUdfRU5ESUFOCi0jICB1bmRlZiBMWk9fQUJJX0xJVFRMRV9FTkRJQU4KLSNlbGlmICEoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAhKExaT19BQklfTElUVExFX0VORElBTikKLSNpZiAoTFpPX0FSQ0hfQUxQSEEpICYmIChMWk9fQVJDSF9DUkFZX01QUCkKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIChMWk9fQVJDSF9JQTY0KSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYIHx8IExaT19PU19XSU42NCkKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIChMWk9fQVJDSF9BTFBIQSB8fCBMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9CTEFDS0ZJTiB8fCBMWk9fQVJDSF9DUklTIHx8IExaT19BUkNIX0kwODYgfHwgTFpPX0FSQ0hfSTM4NiB8fCBMWk9fQVJDSF9NU1A0MzApCi0jICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCi0jZWxpZiAoTFpPX0FSQ0hfQVZSMzIgfHwgTFpPX0FSQ0hfTTY4SyB8fCBMWk9fQVJDSF9TMzkwKQotIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQotI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCi0jICBpZiAoX19MSVRUTEVfRU5ESUFOX18gPT0gMSkKLSMgICAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgIDEKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgIDEKLSMgIGVuZGlmCi0jZWxpZiAxICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQotIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQotI2VsaWYgMSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVCX18pICYmICFkZWZpbmVkKF9fQVJNRUxfXykKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVMX18pICYmICFkZWZpbmVkKF9fQVJNRUJfXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUJfXykgJiYgIWRlZmluZWQoX19NSVBTRUxfXykKLSMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKLSNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUxfXykgJiYgIWRlZmluZWQoX19NSVBTRUJfXykKLSMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKLSNlbmRpZgotI2VuZGlmCi0jaWYgKExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BQklfTElUVExFX0VORElBTikKLSMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgotI2VuZGlmCi0jaWYgKExaT19BQklfQklHX0VORElBTikKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJiZSIKLSNlbGlmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCi0jICBkZWZpbmUgTFpPX0lORk9fQUJJX0VORElBTiAgICAgICAibGUiCi0jZWxpZiAoTFpPX0FCSV9ORVVUUkFMX0VORElBTikKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJuZXV0cmFsIgotI2VuZGlmCi0jaWYgKExaT19TSVpFT0ZfSU5UID09IDEgJiYgTFpPX1NJWkVPRl9MT05HID09IDIgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gMikKLSMgIGRlZmluZSBMWk9fQUJJX0k4TFAxNiAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImk4bHAxNiIKLSNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSAyICYmIExaT19TSVpFT0ZfTE9ORyA9PSAyICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDIpCi0jICBkZWZpbmUgTFpPX0FCSV9JTFAxNiAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDE2IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDQgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKLSMgIGRlZmluZSBMWk9fQUJJX0lMUDMyICAgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMzIiCi0jZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA4ICYmIExaT19TSVpFT0ZfU0laRV9UID09IDgpCi0jICBkZWZpbmUgTFpPX0FCSV9MTFA2NCAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImxscDY0IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gOCkKLSMgIGRlZmluZSBMWk9fQUJJX0xQNjQgICAgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAibHA2NCIKLSNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSA4ICYmIExaT19TSVpFT0ZfTE9ORyA9PSA4ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDgpCi0jICBkZWZpbmUgTFpPX0FCSV9JTFA2NCAgICAgICAgIDEKLSMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDY0IgotI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKLSMgIGRlZmluZSBMWk9fQUJJX0lQMzJMNjQgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaXAzMmw2NCIKLSNlbmRpZgotI2lmICFkZWZpbmVkKF9fTFpPX0xJQkNfT1ZFUlJJREUpCi0jaWYgKExaT19MSUJDX05BS0VEKQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmFrZWQiCi0jZWxpZiAoTFpPX0xJQkNfRlJFRVNUQU5ESU5HKQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZnJlZXN0YW5kaW5nIgotI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJtZnJlZXN0YW5kaW5nIgotI2VsaWYgKExaT19MSUJDX0lTT0M5MCkKLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKLSNlbGlmIChMWk9fTElCQ19JU09DOTkpCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTkiCi0jZWxpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKLSMgIGRlZmluZSBMWk9fTElCQ19ESUVUTElCQyAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZGlldGxpYmMiCi0jZWxpZiBkZWZpbmVkKF9ORVdMSUJfVkVSU0lPTikKLSMgIGRlZmluZSBMWk9fTElCQ19ORVdMSUIgICAgICAgMQotIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmV3bGliIgotI2VsaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pICYmIGRlZmluZWQoX19VQ0xJQkNfTUlOT1JfXykKLSMgIGlmIGRlZmluZWQoX19VQ0xJQkNfU1VCTEVWRUxfXykKLSMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgKF9fVUNMSUJDX01BSk9SX18gKiAweDEwMDAwTCArIF9fVUNMSUJDX01JTk9SX18gKiAweDEwMCArIF9fVUNMSUJDX1NVQkxFVkVMX18pCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fTElCQ19VQ0xJQkMgICAgIDB4MDAwOTBiTAotIyAgZW5kaWYKLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgInVjbGliYyIKLSNlbGlmIGRlZmluZWQoX19HTElCQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfTUlOT1JfXykKLSMgIGRlZmluZSBMWk9fTElCQ19HTElCQyAgICAgICAgKF9fR0xJQkNfXyAqIDB4MTAwMDBMICsgX19HTElCQ19NSU5PUl9fICogMHgxMDApCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJnbGliYyIKLSNlbGlmIChMWk9fQ0NfTVdFUktTKSAmJiBkZWZpbmVkKF9fTVNMX18pCi0jICBkZWZpbmUgTFpPX0xJQkNfTVNMICAgICAgICAgIF9fTVNMX18KLSMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgIm1zbCIKLSNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQotIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCi0jZWxzZQotIyAgZGVmaW5lIExaT19MSUJDX0RFRkFVTFQgICAgICAxCi0jICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJkZWZhdWx0IgotI2VuZGlmCi0jZW5kaWYKICNpZiAhZGVmaW5lZChfX2x6b19nbnVjX2V4dGVuc2lvbl9fKQogI2lmIChMWk9fQ0NfR05VQyA+PSAweDAyMDgwMHVsKQogIyAgZGVmaW5lIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gICAgX19leHRlbnNpb25fXwotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gICAgX19leHRlbnNpb25fXworI2VsaWYgKExaT19DQ19JQk1DID49IDYwMCkKICMgIGRlZmluZSBfX2x6b19nbnVjX2V4dGVuc2lvbl9fICAgIF9fZXh0ZW5zaW9uX18KICNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2dudWNfZXh0ZW5zaW9uX18pCiAjICBkZWZpbmUgX19sem9fZ251Y19leHRlbnNpb25fXyAgICAvKmVtcHR5Ki8KICNlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fdWFfdm9sYXRpbGUpCi0jICBkZWZpbmUgX19sem9fdWFfdm9sYXRpbGUgICAgIHZvbGF0aWxlCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19hbGlnbm9mKQotI2lmIChMWk9fQ0NfQ0lMTFkgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgTFpPX0NDX1BHSSkKLSMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDcwMCkpCi0jICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZl9fKGUpCi0jZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCi0jICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZihlKQotI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQotIyAgZGVmaW5lIF9fbHpvX2FsaWdub2YoZSkgICAgICBfX2FsaWdub2ZfXyhlKQotI2VuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCi0jICBkZWZpbmUgX19sem9fSEFWRV9hbGlnbm9mIDEKLSNlbmRpZgotI2lmICFkZWZpbmVkKF9fbHpvX2NvbnN0cnVjdG9yKQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQotI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCi0jICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCi0jICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fY29uc3RydWN0b3IpCi0jICBkZWZpbmUgX19sem9fSEFWRV9jb25zdHJ1Y3RvciAxCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19kZXN0cnVjdG9yKQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXyxfX3VzZWRfXykpCi0jZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMjA3MDB1bCkKLSMgIGRlZmluZSBfX2x6b19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fZGVzdHJ1Y3RvcikKLSMgIGRlZmluZSBfX2x6b19IQVZFX2Rlc3RydWN0b3IgMQotI2VuZGlmCi0jaWYgKF9fbHpvX0hBVkVfZGVzdHJ1Y3RvcikgJiYgIShfX2x6b19IQVZFX2NvbnN0cnVjdG9yKQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19pbmxpbmUpCi0jaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKLSNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQotI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX0NJTExZIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KLSNlbGlmIChMWk9fQ0NfRE1DKQotIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQotI2VsaWYgKExaT19DQ19JTlRFTEMpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDI0MDUpKQotIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQotI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDkwMCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCi0jZWxpZiAoTFpPX0NDX1NVTlBST0MgJiYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KLSNlbGlmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKLSMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgaW5saW5lCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoX19sem9faW5saW5lKQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfaW5saW5lIDEKLSNlbHNlCi0jICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIC8qZW1wdHkqLwotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fZm9yY2VpbmxpbmUpCi0jaWYgKExaT19DQ19HTlVDID49IDB4MDMwMjAwdWwpCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNDUwKSAmJiBMWk9fQ0NfU1lOVEFYX01TQykKLSMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19mb3JjZWlubGluZQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSAmJiBMWk9fQ0NfU1lOVEFYX0dOVUMpCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQotI2VsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKLSMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19mb3JjZWlubGluZQotI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQotIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKLSNlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX2x6b19mb3JjZWlubGluZSkKLSMgIGRlZmluZSBfX2x6b19IQVZFX2ZvcmNlaW5saW5lIDEKLSNlbHNlCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIC8qZW1wdHkqLwotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fbm9pbmxpbmUpCi0jaWYgMSAmJiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19DQ19HTlVDID49IDB4MDQwMDAwdWwpICYmIChMWk9fQ0NfR05VQyA8IDB4MDQwMDAzdWwpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXyxfX3VzZWRfXykpCi0jZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkgJiYgTFpPX0NDX1NZTlRBWF9NU0MpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKLSMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19kZWNsc3BlYyhub2lubGluZSkKLSNlbGlmIChMWk9fQ0NfTVdFUktTICYmIChfX01XRVJLU19fID49IDB4MzIwMCkgJiYgKExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpKQotIyAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIDAKKyMgIGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkKKyMgICAgZGVmaW5lIExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUyAwCisjICBlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSIDwgMTIwMCkpCisjICAgIGRlZmluZSBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMgMAogIyAgZWxzZQotIyAgICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICBfX2RlY2xzcGVjKG5vaW5saW5lKQorIyAgICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDEKICMgIGVuZGlmCi0jZWxpZiAoTFpPX0NDX1NVTlBST0MgJiYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCi0jICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDAKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCi0jICBkZWZpbmUgX19sem9fSEFWRV9ub2lubGluZSAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGlmIGRlZmluZWQoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICB1bmRlZiBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDAKICNlbmRpZgotI2lmIChfX2x6b19IQVZFX2ZvcmNlaW5saW5lIHx8IF9fbHpvX0hBVkVfbm9pbmxpbmUpICYmICEoX19sem9fSEFWRV9pbmxpbmUpCi0jICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyNpZiAhZGVmaW5lZChMWk9fUkVJTlRFUlBSRVRfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fUkVJTlRFUlBSRVRfQ0FTVCh0LGUpICAgICAgIChyZWludGVycHJldF9jYXN0PHQ+IChlKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19ub3JldHVybikKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMjA3MDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkgJiYgTFpPX0NDX1NZTlRBWF9NU0MpCi0jICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKLSMgIGRlZmluZSBfX2x6b19ub3JldHVybiAgICAgICAgX19kZWNsc3BlYyhub3JldHVybikKKyNpZiAhZGVmaW5lZChMWk9fUkVJTlRFUlBSRVRfQ0FTVCkKKyMgIGRlZmluZSBMWk9fUkVJTlRFUlBSRVRfQ0FTVCh0LGUpICAgICAgICAgKCh0KSAoZSkpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU1RBVElDX0NBU1QpCisjICBpZiAoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICBkZWZpbmUgTFpPX1NUQVRJQ19DQVNUKHQsZSkgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dD4gKGUpKQorIyAgZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fbm9yZXR1cm4pCi0jICBkZWZpbmUgX19sem9fSEFWRV9ub3JldHVybiAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fU1RBVElDX0NBU1QpCisjICBkZWZpbmUgTFpPX1NUQVRJQ19DQVNUKHQsZSkgICAgICAgICAgICAgICgodCkgKGUpKQogI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fbm90aHJvdykKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAzMDB1bCkKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNDUwKSAmJiBMWk9fQ0NfU1lOVEFYX01TQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19kZWNsc3BlYyhub3Rocm93KQotI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gOTAwKSAmJiBMWk9fQ0NfU1lOVEFYX0dOVUMpCi0jICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKLSNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKLSMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQotI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjaWYgIWRlZmluZWQoTFpPX1NUQVRJQ19DQVNUMikKKyMgIGRlZmluZSBMWk9fU1RBVElDX0NBU1QyKHQxLHQyLGUpICAgICAgICAgTFpPX1NUQVRJQ19DQVNUKHQxLCBMWk9fU1RBVElDX0NBU1QodDIsIGUpKQogI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAgICAgICAgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgoY29uc3Qgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgogI2VuZGlmCi0jaWYgZGVmaW5lZChfX2x6b19ub3Rocm93KQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfbm90aHJvdyAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fVU5DT05TVF9DQVNUKQorIyAgZGVmaW5lIExaT19VTkNPTlNUX0NBU1QodCxlKSAgICAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKGNvbnN0IHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19yZXN0cmljdCkKLSNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIExaT19DQ19TWU5UQVhfR05VQykKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNKQotIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICBfX3Jlc3RyaWN0X18KLSNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxNDAwKSkKLSMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdAorI2lmICFkZWZpbmVkKExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QpCisjICBpZiAoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAoY29uc3RfY2FzdDx0PiAoZSkpCisjICBlbGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgICAgZGVmaW5lIExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QodCxlKSAgKCh0KSAoZSkpCisjICBlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgICAgZGVmaW5lIExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QodCxlKSAgKCh0KSAoKHZvbGF0aWxlIHZvaWQgKikgKChsem9fdWludHB0cl90KSAoKHZvbGF0aWxlIGNvbnN0IHZvaWQgKikgKGUpKSkpKQorIyAgZW5kaWYKICNlbmRpZgorI2lmICFkZWZpbmVkKExaT19VTkNPTlNUX1ZPTEFUSUxFX0NBU1QpCisjICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAgICgodCkgKCh2b2xhdGlsZSB2b2lkICopICgodm9sYXRpbGUgY29uc3Qgdm9pZCAqKSAoZSkpKSkKICNlbmRpZgotI2lmIGRlZmluZWQoX19sem9fcmVzdHJpY3QpCi0jICBkZWZpbmUgX19sem9fSEFWRV9yZXN0cmljdCAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICAvKmVtcHR5Ki8KKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DQVNUKQorIyAgaWYgKExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUykKKyMgICAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NBU1QodCxlKSAgICAgICAgKGNvbnN0X2Nhc3Q8dD4gKGUpKQorIyAgZWxpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgICgodCkgKGUpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgICgodCkgKCh2b2lkICopICgobHpvX3VpbnRwdHJfdCkgKCh2b2xhdGlsZSB2b2lkICopIChlKSkpKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiAhZGVmaW5lZChfX2x6b19saWtlbHkpICYmICFkZWZpbmVkKF9fbHpvX3VubGlrZWx5KQotI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDIwMHVsKQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCi0jZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApKQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCi0jZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCi0jICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQotIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DQVNUKQorIyAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NBU1QodCxlKSAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKHZvbGF0aWxlIHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKQorIyAgaWYgKExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUykKKyMgICAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NPTlNUX0NBU1QodCxlKSAgKGNvbnN0X2Nhc3Q8dD4gKGUpKQorIyAgZWxpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgICgodCkgKGUpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgICgodCkgKChjb25zdCB2b2lkICopICgobHpvX3VpbnRwdHJfdCkgKCh2b2xhdGlsZSBjb25zdCB2b2lkICopIChlKSkpKSkKKyMgIGVuZGlmCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX2xpa2VseSkKLSMgIGRlZmluZSBfX2x6b19IQVZFX2xpa2VseSAxCi0jZWxzZQotIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyNpZiAhZGVmaW5lZChMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKQorIyAgZGVmaW5lIExaT19VTlZPTEFUSUxFX0NPTlNUX0NBU1QodCxlKSAgICAoKHQpICgoY29uc3Qgdm9pZCAqKSAoKHZvbGF0aWxlIGNvbnN0IHZvaWQgKikgKGUpKSkpCiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fbHpvX3VubGlrZWx5KQotIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5saWtlbHkgMQotI2Vsc2UKLSMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKGUpCisjaWYgIWRlZmluZWQoTFpPX1BDQVNUKQorIyAgaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fUENBU1QpCisjICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBMWk9fU1RBVElDX0NBU1Qodm9pZCAqLCBlKSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19DQ0FTVCkKKyMgIGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgICAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgKCh0KSAoZSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0NDQVNUKQorIyAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgTFpPX1NUQVRJQ19DQVNUKGNvbnN0IHZvaWQgKiwgZSkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSUNPTlYpCisjICBkZWZpbmUgTFpPX0lDT05WKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0lDQVNUKQorIyAgZGVmaW5lIExaT19JQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19JVFJVTkMpCisjICBkZWZpbmUgTFpPX0lUUlVOQyh0LGUpICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY3RlKQorIyAgaWYgKExaT19DQ19NU0MgfHwgTFpPX0NDX1dBVENPTUMpCisjICAgIGRlZmluZSBfX2x6b19jdGUoZSkgICAgICAgICAgICAoKHZvaWQpMCwoZSkpCisjICBlbGlmIDEKKyMgICAgZGVmaW5lIF9fbHpvX2N0ZShlKSAgICAgICAgICAgICgodm9pZCkwLChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jdGUpCisjICBkZWZpbmUgX19sem9fY3RlKGUpICAgICAgICAgICAgICAoZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19CTE9DS19CRUdJTikKKyMgIGRlZmluZSBMWk9fQkxPQ0tfQkVHSU4gICAgICAgICAgIGRvIHsKKyMgIGRlZmluZSBMWk9fQkxPQ0tfRU5EICAgICAgICAgICAgIH0gd2hpbGUgX19sem9fY3RlKDApCiAjZW5kaWYKICNpZiAhZGVmaW5lZChMWk9fVU5VU0VEKQogIyAgaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDYwMCkpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICAoKHZvaWQpICZ2YXIpCiAjICBlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX0hJR0hDIHx8IExaT19DQ19ORFBDIHx8IExaT19DQ19QRUxMRVNDIHx8IExaT19DQ19UVVJCT0MpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA+PSAweDAzMDIwMHVsKSkKKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgJnZhcikKICMgIGVsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQogIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSB2YXIpCiAjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCiAjICBlbGlmIChMWk9fQ0NfS0VJTEMpCi0jICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICB7ZXh0ZXJuIGludCBfX2x6b191bnVzZWRbMS0yKiEoc2l6ZW9mKHZhcik+MCldO30KKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgIHtMWk9fRVhURVJOX0MgaW50IGx6b191bnVzZWRfX1sxLTIqIShzaXplb2YodmFyKT4wKV07fQogIyAgZWxpZiAoTFpPX0NDX1BBQ0lGSUNDKQogIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSBzaXplb2YodmFyKSkKICMgIGVsaWYgKExaT19DQ19XQVRDT01DKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQpAQCAtMTYxMCwxOCArMTM5NywxOCBAQAogIyAgZWxpZiAoTFpPX0NDX01TQykKICMgICAgZGVmaW5lIExaT19VTlVTRURfRlVOQyhmdW5jKSAgICgodm9pZCkgJmZ1bmMpCiAjICBlbGlmIChMWk9fQ0NfS0VJTEMgfHwgTFpPX0NDX1BFTExFU0MpCi0jICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICB7ZXh0ZXJuIGludCBfX2x6b191bnVzZWRbMS0yKiEoc2l6ZW9mKChpbnQpZnVuYyk+MCldO30KKyMgICAgZGVmaW5lIExaT19VTlVTRURfRlVOQyhmdW5jKSAgIHtMWk9fRVhURVJOX0MgaW50IGx6b191bnVzZWRfZnVuY19fWzEtMiohKHNpemVvZigoaW50KWZ1bmMpPjApXTt9CiAjICBlbHNlCiAjICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpIGZ1bmMpCiAjICBlbmRpZgogI2VuZGlmCiAjaWYgIWRlZmluZWQoTFpPX1VOVVNFRF9MQUJFTCkKLSMgIGlmIChMWk9fQ0NfV0FUQ09NQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCgwKSBjYXNlIDE6Z290byBsCi0jICBlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfV0FUQ09NQykKLSMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIGlmICgwKSBnb3RvIGwKKyMgIGlmIChMWk9fQ0NfQ0xBTkcgPj0gMHgwMjA4MDB1bCkKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fICgodm9pZCkgKChjb25zdCB2b2lkICopICYmbCkpKQorIyAgZWxpZiAoTFpPX0NDX0FSTUNDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19XQVRDT01DKQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9MQUJFTChsKSAgICAgaWYgX19sem9fY3RlKDApIGdvdG8gbAogIyAgZWxzZQotIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9MQUJFTChsKSAgICAgc3dpdGNoKDApIGNhc2UgMTpnb3RvIGwKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCAoMCkgY2FzZSAxOmdvdG8gbAogIyAgZW5kaWYKICNlbmRpZgogI2lmICFkZWZpbmVkKExaT19ERUZJTkVfVU5JTklUSUFMSVpFRF9WQVIpCkBAIC0xNjMzLDM5ICsxNDIwLDQ4OCBAQAogIyAgICBkZWZpbmUgTFpPX0RFRklORV9VTklOSVRJQUxJWkVEX1ZBUih0eXBlLHZhcixpbml0KSAgdHlwZSB2YXIgPSBpbml0CiAjICBlbmRpZgogI2VuZGlmCi0jaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKLSMgIGlmIDAgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSMgICAgZGVmaW5lIExaT19VTkNPTlNUX0NBU1QodCxlKSAgIChjb25zdF9jYXN0PHQ+IChlKSkKLSMgIGVsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQotIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgKCh0KSAoKHZvaWQgKikgKChjaGFyICopICgobHpvX3VpbnRwdHJfdCkgKChjb25zdCB2b2lkICopIChlKSkpKSkpCi0jICBlbHNlCi0jICAgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAoKHQpICgodm9pZCAqKSAoKGNoYXIgKikgKChjb25zdCB2b2lkICopIChlKSkpKSkKKyNpZiAhZGVmaW5lZChfX2x6b19pbmxpbmUpCisjaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKKyNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NJTExZIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfRE1DKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19HSFMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSU5URUxDKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19NV0VSS1MgJiYgKF9fTVdFUktTX18gPj0gMHgyNDA1KSkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmUKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmVfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2lubGluZSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfaW5saW5lIDEKICMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDIwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9fZm9yY2VpbmxpbmUKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSkKKyMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2ZvcmNlaW5saW5lCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUKKyMgIGRlZmluZSBfX2x6b19IQVZFX2ZvcmNlaW5saW5lIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2x6b19pbmxpbmUKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vaW5saW5lKQorI2lmIDEgJiYgKExaT19BUkNIX0kzODYpICYmIChMWk9fQ0NfR05VQyA+PSAweDA0MDAwMHVsKSAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwM3VsKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwMjAwdWwpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDMyMDApICYmIChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KSkKKyMgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBlbHNlCisjICAgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkKKyMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9ub2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbm9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgKF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUgfHwgX19sem9fSEFWRV9ub2lubGluZSkgJiYgIShfX2x6b19IQVZFX2lubGluZSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfaW5saW5lICAgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX3N0YXRpY19pbmxpbmUgICAgICAgc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2ZvcmNlaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19mb3JjZWlubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIHN0YXRpYyBfX2x6b19mb3JjZWlubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX25vaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX25vaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19ub2lubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIHN0YXRpYyBfX2x6b19ub2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjaWYgZGVmaW5lZChfX0dOVUNfR05VX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZWxpZiBkZWZpbmVkKF9fR05VQ19TVERDX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgZXh0ZXJuIF9fbHpvX2lubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICBleHRlcm4gX19sem9faW5saW5lCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jOTlfZXh0ZXJuX2lubGluZSkgJiYgKF9fbHpvX0hBVkVfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9jOTlfZXh0ZXJuX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfYzk5X2V4dGVybl9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX21heV9hbGlhcykKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZWxpZiAoTFpPX0NDX0NMQU5HID49IDB4MDIwOTAwdWwpCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIF9fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMjEwKSkgJiYgMAorIyAgZGVmaW5lIF9fbHpvX21heV9hbGlhcyAgICAgICBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpICYmIDAKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbWF5X2FsaWFzKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbWF5X2FsaWFzCisjICBkZWZpbmUgX19sem9fSEFWRV9tYXlfYWxpYXMgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbm9yZXR1cm4pCisjaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX25vcmV0dXJuKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbm9yZXR1cm4KKyMgIGRlZmluZSBfX2x6b19IQVZFX25vcmV0dXJuIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vdGhyb3cpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwMzAwdWwpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA0NTApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDkwMCkpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm90aHJvdykKKyMgIGlmbmRlZiBfX2x6b19IQVZFX25vdGhyb3cKKyMgIGRlZmluZSBfX2x6b19IQVZFX25vdGhyb3cgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fcmVzdHJpY3QpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDgwMCkgJiYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDEyMTApCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSkKKyMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3QKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3Jlc3RyaWN0KQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfcmVzdHJpY3QKKyMgIGRlZmluZSBfX2x6b19IQVZFX3Jlc3RyaWN0IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0lMTFkgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgTFpPX0NDX1BHSSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfR0hTKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fIF9fYWxpZ25vZl9fKGUpKQorI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mKGUpCisjZWxpZiAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKQorIyAgZGVmaW5lIF9fbHpvX2FsaWdub2YoZSkgICAgICBfX2FsaWdub2ZfXyhlKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjICBpZm5kZWYgX19sem9fSEFWRV9hbGlnbm9mCisjICBkZWZpbmUgX19sem9fSEFWRV9hbGlnbm9mIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkKQorI2lmICAgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA3MDB1bCkpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX1BDQyAmJiAoTFpPX0NDX1BDQyA8IDB4MDEwMTAwdWwpKQorI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA8IDB4NTExMCkpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpICYmICEoTFpPX0NDX1BDQ19HTlVDKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpICAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2djY19zdHJ1Y3RfXyxfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19nY2Nfc3RydWN0X18sX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkgfHwgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfbWFfZW5kKCkgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19wcmFnbWEocGFjayhwdXNoLDEpKSBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWQocykgICAgICAgIF9QYWNrZWQgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH07CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZCkgJiYgIWRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZF9tYSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKSAmJiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCgpICBfX2x6b19zdHJ1Y3RfcGFja2VkX2VuZCgpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWQpCisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3QocyxuKSAgICAgICAgX19sem9fc3RydWN0X3BhY2tlZChzKSB1bnNpZ25lZCBjaGFyIGFbbl07IF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdF9tYShzLG4pICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpIHVuc2lnbmVkIGNoYXIgYVtuXTsgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX1BHSSB8fCAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKSkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdChzLG4pICAgICAgICBzdHJ1Y3QgcyB7IHVuc2lnbmVkIGNoYXIgYVtuXTsgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3RfbWEocyxuKSAgICAgc3RydWN0IHMgeyB1bnNpZ25lZCBjaGFyIGFbbl07IH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkgJiYgICFkZWZpbmVkKF9fbHpvX2J5dGVfc3RydWN0X21hKQorIyAgZGVmaW5lIF9fbHpvX2J5dGVfc3RydWN0X21hKHMsbikgICAgIF9fbHpvX2J5dGVfc3RydWN0KHMsbikKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0cnVjdF9hbGlnbjE2KSAmJiAoX19sem9fSEFWRV9hbGlnbm9mKQorI2lmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAzMDAwMHVsKSkKKyNlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwODAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfUENDKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTYocykgICAgICAgc3RydWN0IF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBzIHsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNl9lbmQoKSAgICB9OworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjMyKHMpICAgICAgIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDMyKSkgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbig2NCkpIHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjY0X2VuZCgpICAgIH07CisjZWxpZiAoTFpPX0NDX0FSTUNDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCAoTFpPX0NDX0lCTUMgPj0gNzAwKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTZfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24zMihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygzMikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduNjRfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg2NCkpKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fdW0pCisjaWYgICAoTFpPX0NDX0NMQU5HICYmIChMWk9fQ0NfQ0xBTkcgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDcwMHVsKSkKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPCA4MTApKQorI2VsaWYgKExaT19DQ19QQ0MgJiYgKExaT19DQ19QQ0MgPCAweDAxMDEwMHVsKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyAmJiAoTFpPX0NDX1NVTlBST0MgPCAweDUxMTApKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfQVJNQ0MgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpIHx8IChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzOworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyB1bmlvbiBzIHsKKyMgIGRlZmluZSBfX2x6b191bmlvbl9hbV9lbmQoKSAgICAgICAgICB9IF9fbHpvX21heV9hbGlhczsKKyMgIGRlZmluZSBfX2x6b191bmlvbl91bShzKSAgICAgICAgICAgICBfX2x6b19nbnVjX2V4dGVuc2lvbl9fIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQykgfHwgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9fcHJhZ21hKHBhY2socHVzaCwxKSkgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9QYWNrZWQgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fYW0pCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fYW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NvbnN0cnVjdG9yKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXyxfX3VzZWRfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fY29uc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9jb25zdHJ1Y3RvcgorIyAgZGVmaW5lIF9fbHpvX0hBVkVfY29uc3RydWN0b3IgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9kZXN0cnVjdG9yCisjICBkZWZpbmUgX19sem9fSEFWRV9kZXN0cnVjdG9yIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoX19sem9fSEFWRV9kZXN0cnVjdG9yKSAmJiAhKF9fbHpvX0hBVkVfY29uc3RydWN0b3IpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbGlrZWx5KSAmJiAhZGVmaW5lZChfX2x6b191bmxpa2VseSkKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VsaWYgKExaT19DQ19JQk1DID49IDEwMTApCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2xpa2VseSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2xpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbGlrZWx5IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5saWtlbHkpCisjICBpZm5kZWYgX19sem9fSEFWRV91bmxpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5saWtlbHkgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMpCisjICBpZiAxICYmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICAgIGRlZmluZSBfX2x6b19zdGF0aWNfdW51c2VkX3ZvaWRfZnVuYyhmKSAgICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkgZih2b2lkKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMoZikgICAgc3RhdGljIF9fbHpvX2lubGluZSB2b2lkIGYodm9pZCkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19sb29wX2ZvcmV2ZXIpCisjICBpZiAoTFpPX0NDX0lCTUMpCisjICAgIGRlZmluZSBfX2x6b19sb29wX2ZvcmV2ZXIoKSAgICBMWk9fQkxPQ0tfQkVHSU4gZm9yICg7OykgeyA7IH0gTFpPX0JMT0NLX0VORAorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fbG9vcF9mb3JldmVyKCkgICAgZG8geyA7IH0gd2hpbGUgX19sem9fY3RlKDEpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjaWYgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HID49IDB4MDIwODAwdWwpKQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwNDA1MDB1bCkKKyMgIGRlZmluZSBfX2x6b191bnJlYWNoYWJsZSgpICAgICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOworI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMzAwKSkgJiYgMQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjICBpZm5kZWYgX19sem9fSEFWRV91bnJlYWNoYWJsZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5yZWFjaGFibGUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBpZiAwCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICAoKHZvaWQpMCk7CisjICBlbHNlCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICBfX2x6b19sb29wX2ZvcmV2ZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgX19MWk9fQ1RBX05BTUUKKyNpZiAoTFpPX0NGR19VU0VfQ09VTlRFUikKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fQ09VTlRFUl9fKQorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fTElORV9fKQorI2VuZGlmCiAjZW5kaWYKICNpZiAhZGVmaW5lZChMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIpCiAjICBpZiAoTFpPX0NDX0FaVEVDQyB8fCBMWk9fQ0NfWk9SVEVDSEMpCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoZSkgIGV4dGVybiBpbnQgX19sem9fY3RhWzEtIShlKV07CisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoZSkgIExaT19FWFRFUk5fQ19CRUdJTiBleHRlcm4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfXylbMS0hKGUpXTsgTFpPX0VYVEVSTl9DX0VORAogIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKQotIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fbHpvX2N0YVsxdS0yKiEoZSldOworIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gZXh0ZXJuIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX18pWzF1LTIqIShlKV07IExaT19FWFRFUk5fQ19FTkQKICMgIGVsaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPT0gMHgwMjk1KSkKLSMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgZXh0ZXJuIGludCBfX2x6b19jdGFbMS0hKGUpXTsKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGV4dGVybiBpbnQgX19MWk9fQ1RBX05BTUUobHpvX2N0YV9fKVsxLSEoZSldOyBMWk9fRVhURVJOX0NfRU5ECisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwOTAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfZl9fKShpbnQgWzEtMiohKGUpXSk7IExaT19FWFRFUk5fQ19FTkQKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGVudW0ge19fTFpPX0NUQV9OQU1FKGx6b19jdGFfZV9fKT0xLyEhKGUpfSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IExaT19FWFRFUk5fQ19FTkQKICMgIGVsc2UKLSMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgZXh0ZXJuIGludCBfX2x6b19jdGFbMS0yKiEoZSldOworIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gZXh0ZXJuIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX18pWzEtMiohKGUpXTsgTFpPX0VYVEVSTl9DX0VORAogIyAgZW5kaWYKICNlbmRpZgogI2lmICFkZWZpbmVkKExaT19DT01QSUxFX1RJTUVfQVNTRVJUKQogIyAgaWYgKExaT19DQ19BWlRFQ0MpCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fbHpvX2N0YV90WzEtIShlKV07fQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0hKGUpXTt9CiAjICBlbGlmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19QQUNJRklDQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKICMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7KHZvaWQpICgwLyEhKGUpKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKSAmJiAoTFpPX0NGR19VU0VfQ09VTlRFUikgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7ZW51bSB7X19MWk9fQ1RBX05BTUUobHpvX2N0YV9lX18pPTEvISEoZSl9IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0yKiEoZSldIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CiAjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCiAjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CiAjICBlbGlmIChMWk9fQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID09IDB4MDI5NSkpCiAjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CiAjICBlbHNlCi0jICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fbHpvX2N0YV90WzEtMiohKGUpXTt9CisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfdF9fKVsxLTIqIShlKV07fQogIyAgZW5kaWYKICNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDEgPT0gMSkKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7IExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUigyID09IDIpIH0KKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDMgPT0gMykKICNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMiB8fCBMWk9fT1NfT1MyIHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKICMgIGlmIChMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSElHSEMgfHwgTFpPX0NDX05EUEMgfHwgTFpPX0NDX1BBQ0lGSUNDKQogIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKQEAgLTE3MjksNiArMTk2NSw3IEBACiAjICBkZWZpbmUgX19sem9fY2RlY2xfdmEgICAgICAgICAgICAgICAgX19sem9fY2RlY2wKICNlbmRpZgogI2lmICEoTFpPX0NGR19OT19XSU5ET1dTX0gpCisjaWYgIWRlZmluZWQoTFpPX0hBVkVfV0lORE9XU19IKQogI2lmIChMWk9fT1NfQ1lHV0lOIHx8IChMWk9fT1NfRU1YICYmIGRlZmluZWQoX19SU1hOVF9fKSkgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKICMgIGlmIChMWk9fQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMDAwKSkKICMgIGVsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKQEAgLTE3MzgsNjEgKzE5NzUsNjE1IEBACiAjICBlbmRpZgogI2VuZGlmCiAjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NIT1JUCisjaWYgZGVmaW5lZChTSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgICAoU0laRU9GX1NIT1JUKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSE9SVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgICAgKF9fU0laRU9GX1NIT1JUX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0lOVAorI2lmIGRlZmluZWQoU0laRU9GX0lOVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChTSVpFT0ZfSU5UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9JTlRfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChfX1NJWkVPRl9JTlRfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkcpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgICAoU0laRU9GX0xPTkcpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAgIChfX1NJWkVPRl9MT05HX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChTSVpFT0ZfTE9OR19MT05HKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfX19JTlQxNgorI2lmIGRlZmluZWQoU0laRU9GX19fSU5UMTYpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDE2ICAgICAgICAoU0laRU9GX19fSU5UMTYpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX19fSU5UMzIKKyNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDMyKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQzMiAgICAgICAgKFNJWkVPRl9fX0lOVDMyKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTFpPX1NJWkVPRl9fX0lOVDY0CisjaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQ2NCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIChTSVpFT0ZfX19JTlQ2NCkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfVk9JRF9QCisjaWYgZGVmaW5lZChTSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgKFNJWkVPRl9WT0lEX1ApCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BPSU5URVJfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIChfX1NJWkVPRl9QT0lOVEVSX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NJWkVfVAorI2lmIGRlZmluZWQoU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChTSVpFT0ZfU0laRV9UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSVpFX1RfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChfX1NJWkVPRl9TSVpFX1RfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfUFRSRElGRl9UCisjaWYgZGVmaW5lZChTSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKFNJWkVPRl9QVFJESUZGX1QpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgX19MWk9fTFNSKHgsYikgICAgKCgoeCkrMHVsKSA+PiAoYikpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9TSE9SVCkKKyMgIGlmIChMWk9fQVJDSF9DUkFZX1BWUCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSBMWk9fMHhmZmZmTCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTUpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAyCisjICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgNAorIyAgZWxpZiAoX19MWk9fTFNSKFVTSFJUX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTI3KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgMTYKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkxaT19TSVpFT0ZfU0hPUlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9TSE9SVCA9PSBzaXplb2Yoc2hvcnQpKQorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfSU5UKQorIyAgaWYgKExaT19BUkNIX0NSQVlfUFZQKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9JTlQgICAgICAgICAgOAorIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAyCisjICBlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUlOVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxNSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9JTlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9JTlQgPT0gc2l6ZW9mKGludCkpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HKQorIyAgaWYgKFVMT05HX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxCisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDE1KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgMgorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVTE9OR19NQVgsMzkpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA1CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDYzKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgOAorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9MT05HIgorIyAgZW5kaWYKKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfTE9ORyA9PSBzaXplb2YobG9uZykpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorIyAgaWYgZGVmaW5lZChfX0xPTkdfTUFYX18pICYmIGRlZmluZWQoX19MT05HX0xPTkdfTUFYX18pCisjICAgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDMwMHVsKQorIyAgICAgIGlmICgoX19MT05HX01BWF9fLTApID09IChfX0xPTkdfTE9OR19NQVhfXy0wKSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgICAgIGVsaWYgKF9fTFpPX0xTUihfX0xPTkdfTE9OR19NQVhfXywzMCkgPT0gMSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDQKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorI2lmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19ETUMpCisjZWxpZiAoTFpPX0NDX0NJTExZKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjY0KSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfRE1DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfU1lNQU5URUNDICYmIChfX1NDX18gPj0gMHg3MDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDICYmIGRlZmluZWQoX19saW51eF9fKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX01XRVJLUyB8fCBMWk9fQ0NfUEVMTEVTQyB8fCBMWk9fQ0NfUEdJIHx8IExaT19DQ19TVU5QUk9DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgZGVmaW5lZChfV0lOMzIpKSAmJiAoTFpPX0NDX01TQykpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTIwKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDExMDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQ0NfR0hTICYmIGRlZmluZWQoX19MTE9OR19CSVQpICYmICgoX19MTE9OR19CSVQtMCkgPT0gNjQpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19XQVRDT01DICYmIGRlZmluZWQoX0lOVEVHUkFMX01BWF9CSVRTKSAmJiAoKF9JTlRFR1JBTF9NQVhfQklUUy0wKSA9PSA2NCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUtMCkgPT0gNjQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0NDX1NEQ0MpICYmIChMWk9fU0laRU9GX0lOVCA9PSAyKQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgKExaT19DQ19HTlVDKQorIyAgaWYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkKKyMgICAgdW5kZWYgTFpPX1NJWkVPRl9MT05HX0xPTkcKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NGR19OT19MT05HX0xPTkcpCisjICB1bmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2VsaWYgZGVmaW5lZChfX05PX0xPTkdfTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiBkZWZpbmVkKF9OT19MT05HTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fV09SRFNJWkUpCiAjaWYgKExaT19BUkNIX0FMUEhBKQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfU0hPUlQgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVVNIT1JUICAgICAgMQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAogI2VsaWYgKExaT19BUkNIX0FNRDY0KQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfSU5UX0lOREVYICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVENjQgICAgICAgMQotI2VsaWYgKExaT19BUkNIX0FSTSAmJiBMWk9fQVJDSF9BUk1fVEhVTUIpCi0jZWxpZiAoTFpPX0FSQ0hfQVJNKQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfU0hPUlQgICAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVVNIT1JUICAgICAgMQotI2VsaWYgKExaT19BUkNIX0NSSVMpCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAxCi0jZWxpZiAoTFpPX0FSQ0hfSTM4NikKLSMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgIDEKLSMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgIDEKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9BVlIpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAxCisjZWxpZiAoTFpPX0FSQ0hfSDgzMDApCisjICBpZiBkZWZpbmVkKF9fTk9STUFMX01PREVfXykKKyMgICAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgIDQKKyMgIGVsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pIHx8IGRlZmluZWQoX19IODMwMFNYX18pCisjICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICA0CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAyCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0kwODYpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAyCiAjZWxpZiAoTFpPX0FSQ0hfSUE2NCkKLSMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX0lOVF9JTkRFWCAgIDEKLSMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKLSMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QT1NUSU5DICAgIDEKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9NMTZDKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgMgorI2VsaWYgKExaT19BUkNIX1NQVSkKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDQKKyNlbGlmIChMWk9fQVJDSF9aODApCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAxCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HID09IDgpICYmICgoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX1I1OTAwX18pKSB8fCBkZWZpbmVkKF9fTUlQU19QU1gyX18pKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAorI2VsaWYgKExaT19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICA4CisjZWxpZiAoZGVmaW5lZChfX3ZtcykgfHwgZGVmaW5lZChfX1ZNUykpICYmIChfX0lOSVRJQUxfUE9JTlRFUl9TSVpFKzAgPT0gNjQpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICA4CisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQorI2lmIGRlZmluZWQoX19JTFAzMl9fKSB8fCBkZWZpbmVkKF9fSUxQMzIpIHx8IGRlZmluZWQoX0lMUDMyKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihpbnQpICA9PSA0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsb25nKSA9PSA0KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgNAorI2VsaWYgZGVmaW5lZChfX0lMUDY0X18pIHx8IGRlZmluZWQoX19JTFA2NCkgfHwgZGVmaW5lZChfSUxQNjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGludCkgID09IDgpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGxvbmcpID09IDgpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4CisjZWxpZiBkZWZpbmVkKF9fTExQNjRfXykgfHwgZGVmaW5lZChfX0xMUDY0KSB8fCBkZWZpbmVkKF9MTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGxvbmcpID09IDQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA4CisjZWxpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9fTFA2NCkgfHwgZGVmaW5lZChfTFA2NCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobG9uZykgPT0gOCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9BVlIpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICAyCisjZWxpZiAoTFpPX0FSQ0hfQzE2NiB8fCBMWk9fQVJDSF9NQ1M1MSB8fCBMWk9fQVJDSF9NQ1MyNTEgfHwgTFpPX0FSQ0hfTVNQNDMwKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgorI2VsaWYgKExaT19BUkNIX0g4MzAwKQorIyAgaWYgZGVmaW5lZChfX05PUk1BTF9NT0RFX18pCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAyCisjICBlbGlmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSB8fCBkZWZpbmVkKF9fSDgzMDBTWF9fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZW5kaWYKKyMgIGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwMHVsKSkgJiYgKExaT19TSVpFT0ZfSU5UID09IDQpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICBMWk9fU0laRU9GX0lOVAorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgTFpPX1NJWkVPRl9JTlQKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfSTA4NikKKyMgIGlmIChMWk9fTU1fVElOWSB8fCBMWk9fTU1fU01BTEwgfHwgTFpPX01NX01FRElVTSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDIKKyMgIGVsaWYgKExaT19NTV9DT01QQUNUIHx8IExaT19NTV9MQVJHRSB8fCBMWk9fTU1fSFVHRSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDQKKyMgIGVsc2UKKyMgICAgZXJyb3IgImludmFsaWQgTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX00xNkMpCisjICBpZiBkZWZpbmVkKF9fbTMyY19jcHVfXykgfHwgZGVmaW5lZChfX20zMmNtX2NwdV9fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9TUFUpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0CisjZWxpZiAoTFpPX0FSQ0hfWjgwKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA9PSA4KSAmJiAoKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19SNTkwMF9fKSkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDQKKyNlbGlmIChMWk9fT1NfT1M0MDAgfHwgZGVmaW5lZChfX09TNDAwX18pKQorIyAgaWYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgOAorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgTFpPX1NJWkVPRl9MT05HCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICBMWk9fU0laRU9GX0xPTkcKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDE2CisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICBMWk9fU0laRU9GX0xPTkcKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfTE9ORworIyAgZW5kaWYKKyNlbGlmIChkZWZpbmVkKF9fdm1zKSB8fCBkZWZpbmVkKF9fVk1TKSkgJiYgKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUrMCA9PSA2NCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgTFpPX1NJWkVPRl9MT05HCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9MT05HCisjZW5kaWYKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihMWk9fU0laRU9GX1ZPSURfUCA9PSBzaXplb2Yodm9pZCAqKSkKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKKyNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9NMTZDKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgMgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfVk9JRF9QCisjZW5kaWYKKyNpZiBkZWZpbmVkKG9mZnNldG9mKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfU0laRV9UID09IHNpemVvZihzaXplX3QpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9QVFJESUZGX1QpCisjaWYgKExaT19BUkNIX0kwODYpCisjICBpZiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9NRURJVU0gfHwgTFpPX01NX0hVR0UpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICBMWk9fU0laRU9GX1ZPSURfUAorIyAgZWxpZiAoTFpPX01NX0NPTVBBQ1QgfHwgTFpPX01NX0xBUkdFKQorIyAgICBpZiAoTFpPX0NDX0JPUkxBTkRDIHx8IExaT19DQ19UVVJCT0MpCisjICAgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICA0CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgIDIKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZXJyb3IgImludmFsaWQgTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1BUUkRJRkZfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICAgIExaT19TSVpFT0ZfU0laRV9UCisjZW5kaWYKKyNpZiBkZWZpbmVkKG9mZnNldG9mKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfUFRSRElGRl9UID09IHNpemVvZihwdHJkaWZmX3QpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1dPUkRTSVpFKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKKyNlbmRpZgorI2lmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQorIyAgdW5kZWYgTFpPX0FCSV9CSUdfRU5ESUFOCisjICB1bmRlZiBMWk9fQUJJX0xJVFRMRV9FTkRJQU4KKyNlbGlmICEoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAhKExaT19BQklfTElUVExFX0VORElBTikKKyNpZiAoTFpPX0FSQ0hfQUxQSEEpICYmIChMWk9fQVJDSF9DUkFZX01QUCkKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIChMWk9fQVJDSF9JQTY0KSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYIHx8IExaT19PU19XSU42NCkKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIChMWk9fQVJDSF9BTFBIQSB8fCBMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9CTEFDS0ZJTiB8fCBMWk9fQVJDSF9DUklTIHx8IExaT19BUkNIX0kwODYgfHwgTFpPX0FSQ0hfSTM4NiB8fCBMWk9fQVJDSF9NU1A0MzApCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAoTFpPX0FSQ0hfQVZSMzIgfHwgTFpPX0FSQ0hfTTY4SyB8fCBMWk9fQVJDSF9TMzkwIHx8IExaT19BUkNIX1NQVSkKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorIyAgaWYgKF9fTElUVExFX0VORElBTl9fID09IDEpCisjICAgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAxCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAxCisjICBlbmRpZgorI2VsaWYgMSAmJiBkZWZpbmVkKF9fQklHX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOX18pCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0pICYmIGRlZmluZWQoX19BUk1FQl9fKSAmJiAhZGVmaW5lZChfX0FSTUVMX18pCisjICBkZWZpbmUgTFpPX0FCSV9CSUdfRU5ESUFOICAgICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0pICYmIGRlZmluZWQoX19BUk1FTF9fKSAmJiAhZGVmaW5lZChfX0FSTUVCX18pCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk0gJiYgTFpPX0NDX0FSTUNDX0FSTUNDKQorIyAgaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyMgICAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgIDEKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgIDEKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk02NCkgJiYgZGVmaW5lZChfX0FBUkNINjRFQl9fKSAmJiAhZGVmaW5lZChfX0FBUkNINjRFTF9fKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiAoTFpPX0FSQ0hfQVJNNjQpICYmIGRlZmluZWQoX19BQVJDSDY0RUxfXykgJiYgIWRlZmluZWQoX19BQVJDSDY0RUJfXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUJfXykgJiYgIWRlZmluZWQoX19NSVBTRUxfXykKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUxfXykgJiYgIWRlZmluZWQoX19NSVBTRUJfXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgKExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BQklfTElUVExFX0VORElBTikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9FTkRJQU4gICAgICAgImJlIgorI2VsaWYgKExaT19BQklfTElUVExFX0VORElBTikKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfRU5ESUFOICAgICAgICJsZSIKKyNlbGlmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9FTkRJQU4gICAgICAgIm5ldXRyYWwiCisjZW5kaWYKKyNpZiAoTFpPX1NJWkVPRl9JTlQgPT0gMSAmJiBMWk9fU0laRU9GX0xPTkcgPT0gMiAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSAyKQorIyAgZGVmaW5lIExaT19BQklfSThMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaThscDE2IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDIgJiYgTFpPX1NJWkVPRl9MT05HID09IDIgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gMikKKyMgIGRlZmluZSBMWk9fQUJJX0lMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMTYiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gMiAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIExaT19BQklfTFAzMiAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJscDMyIgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDQgJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKKyMgIGRlZmluZSBMWk9fQUJJX0lMUDMyICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwMzIiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA4ICYmIExaT19TSVpFT0ZfU0laRV9UID09IDgpCisjICBkZWZpbmUgTFpPX0FCSV9MTFA2NCAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImxscDY0IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gOCkKKyMgIGRlZmluZSBMWk9fQUJJX0xQNjQgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAibHA2NCIKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSA4ICYmIExaT19TSVpFT0ZfTE9ORyA9PSA4ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDgpCisjICBkZWZpbmUgTFpPX0FCSV9JTFA2NCAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImlscDY0IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQgJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkKKyMgIGRlZmluZSBMWk9fQUJJX0lQMzJMNjQgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaXAzMmw2NCIKKyNlbmRpZgorI2lmIDAKKyNlbGlmICFkZWZpbmVkKF9fTFpPX0xJQkNfT1ZFUlJJREUpCisjaWYgKExaT19MSUJDX05BS0VEKQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmFrZWQiCisjZWxpZiAoTFpPX0xJQkNfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZnJlZXN0YW5kaW5nIgorI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJtZnJlZXN0YW5kaW5nIgorI2VsaWYgKExaT19MSUJDX0lTT0M5MCkKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKKyNlbGlmIChMWk9fTElCQ19JU09DOTkpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTkiCisjZWxpZiAoTFpPX0NDX0FSTUNDX0FSTUNDKSAmJiBkZWZpbmVkKF9fQVJNQ0xJQl9WRVJTSU9OKQorIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCisjZWxpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKKyMgIGRlZmluZSBMWk9fTElCQ19ESUVUTElCQyAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiZGlldGxpYmMiCisjZWxpZiBkZWZpbmVkKF9ORVdMSUJfVkVSU0lPTikKKyMgIGRlZmluZSBMWk9fTElCQ19ORVdMSUIgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibmV3bGliIgorI2VsaWYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pICYmIGRlZmluZWQoX19VQ0xJQkNfTUlOT1JfXykKKyMgIGlmIGRlZmluZWQoX19VQ0xJQkNfU1VCTEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgKF9fVUNMSUJDX01BSk9SX18gKiAweDEwMDAwTCArIChfX1VDTElCQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19VQ0xJQkNfU1VCTEVWRUxfXy0wKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19MSUJDX1VDTElCQyAgICAgMHgwMDA5MGJMCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAidWMiICJsaWJjIgorI2VsaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19HTElCQ19NSU5PUl9fKQorIyAgZGVmaW5lIExaT19MSUJDX0dMSUJDICAgICAgICAoX19HTElCQ19fICogMHgxMDAwMEwgKyAoX19HTElCQ19NSU5PUl9fLTApICogMHgxMDApCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJnbGliYyIKKyNlbGlmIChMWk9fQ0NfTVdFUktTKSAmJiBkZWZpbmVkKF9fTVNMX18pCisjICBkZWZpbmUgTFpPX0xJQkNfTVNMICAgICAgICAgIF9fTVNMX18KKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgIm1zbCIKKyNlbGlmIDEgJiYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQorIyAgZGVmaW5lIExaT19MSUJDX0lTT0M5MCAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJpc29jOTAiCisjZWxzZQorIyAgZGVmaW5lIExaT19MSUJDX0RFRkFVTFQgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJkZWZhdWx0IgorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX09TX0RPUzMyIHx8IExaT19PU19XSU4zMikgJiYgKExaT19DQ19ETUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfTVNDIHx8IExaT19DQ19QRUxMRVNDKSkKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9NU0MgMQorI2VsaWYgKExaT19PU19XSU42NCAmJiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MgfHwgTFpPX0NDX1BFTExFU0MpKQorI2VsaWYgKExaT19BUkNIX0kzODYgJiYgTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDID09IDB4MDExZjAwdWwpKQorI2VsaWYgKExaT19BUkNIX0kzODYgJiYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19QQVRIU0NBTEUpKQorIyAgZGVmaW5lIExaT19BU01fU1lOVEFYX0dOVUMgMQorI2VsaWYgKExaT19BUkNIX0FNRDY0ICYmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfUEFUSFNDQUxFKSkKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKKyNlbGlmIChMWk9fQ0NfR05VQykKKyMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKKyNlbmRpZgorI2lmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorI2lmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA8IDB4MDIwMDAwdWwpKQorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgICAgICAgICAgICAgImF4IgorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MgICAgICAgICAgICAgLyplbXB0eSovCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkgICAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPCAxMDAwKSkKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkiCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyAgICAgICAgICAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSAgICAgIDogIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICAgICAgICAgICAgICJjYyIsICJtZW1vcnkiCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyAgICAgICAgICAgICA6ICJjYyIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSAgICAgIDogImNjIiwgIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQUxQSEEpCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKKyNlbGlmIChMWk9fQVJDSF9BTUQ2NCkKKyMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX0lOVF9JTkRFWCAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfQVZPSURfVUlOVF9JTkRFWCAgICAgICAgICAxCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNKQorIyAgaWYgZGVmaW5lZChfX0FSTV9GRUFUVVJFX1VOQUxJR05FRCkKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX19UQVJHRVRfQVJDSF9BUk0pICYmICgoX19UQVJHRVRfQVJDSF9BUk0rMCkgPj0gNykKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX19UQVJHRVRfQVJDSF9BUk0pICYmICgoX19UQVJHRVRfQVJDSF9BUk0rMCkgPj0gNikgJiYgIWRlZmluZWQoX19UQVJHRVRfUFJPRklMRV9NKQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNNjQpCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQ1JJUykKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0kzODYpCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9JQTY0KQorIyAgZGVmaW5lIExaT19PUFRfQVZPSURfSU5UX0lOREVYICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QT1NUSU5DICAgICAgICAgICAgMQogI2VsaWYgKExaT19BUkNIX002OEspCi0jICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUE9TVElOQyAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUE9TVElOQyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QUkVERUMgICAgICAgICAgICAgMQogIyAgaWYgZGVmaW5lZChfX21jNjgwMjBfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgIDEKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgIDEKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX01JUFMpCi0jICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAxCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKICNlbGlmIChMWk9fQVJDSF9QT1dFUlBDKQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRUlOQyAgICAgMQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRUlOQyAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAgICAgICAgIDEKICMgIGlmIChMWk9fQUJJX0JJR19FTkRJQU4pCi0jICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAxCi0jICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAxCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZiAoTFpPX1dPUkRTSVpFID09IDgpCisjICAgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVENjQKKyMgICAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgMQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX1MzOTApCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAxCi0jICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAxCi0jICBpZiAoTFpPX1NJWkVPRl9TSVpFX1QgPT0gOCkKLSMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVENjQgICAgIDEKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWYgKExaT19XT1JEU0laRSA9PSA4KQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQ2NAorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAxCisjICAgIGVuZGlmCiAjICBlbmRpZgogI2VsaWYgKExaT19BUkNIX1NIKQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgMQotIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAgICAgICAgIDEKICNlbmRpZgogI2lmbmRlZiBMWk9fQ0ZHX05PX0lOTElORV9BU00KLSNpZiAoTFpPX0NDX0xMVk0pCisjaWYgKExaT19BQklfTkVVVFJBTF9FTkRJQU4pIHx8IChMWk9fQVJDSF9HRU5FUklDKQorIyAgZGVmaW5lIExaT19DRkdfTk9fSU5MSU5FX0FTTSAxCisjZWxpZiAoTFpPX0NDX0xMVk0pCiAjICBkZWZpbmUgTFpPX0NGR19OT19JTkxJTkVfQVNNIDEKICNlbmRpZgogI2VuZGlmCisjaWYgKExaT19DRkdfTk9fSU5MSU5FX0FTTSkKKyMgIHVuZGVmIExaT19BU01fU1lOVEFYX01TQworIyAgdW5kZWYgTFpPX0FTTV9TWU5UQVhfR05VQworIyAgdW5kZWYgX19MWk9fQVNNX0NMT0JCRVIKKyMgIHVuZGVmIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MKKyMgIHVuZGVmIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZCisjICB1bmRlZiBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0VNUFRZCisjZW5kaWYKICNpZm5kZWYgTFpPX0NGR19OT19VTkFMSUdORUQKICNpZiAoTFpPX0FCSV9ORVVUUkFMX0VORElBTikgfHwgKExaT19BUkNIX0dFTkVSSUMpCiAjICBkZWZpbmUgTFpPX0NGR19OT19VTkFMSUdORUQgMQpAQCAtMTgwMywyNSArMjU5NCw2IEBACiAjICB1bmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCiAjICB1bmRlZiBMWk9fT1BUX1VOQUxJR05FRDY0CiAjZW5kaWYKLSNpZiAoTFpPX0NGR19OT19JTkxJTkVfQVNNKQotI2VsaWYgKExaT19BUkNIX0kzODYgJiYgKExaT19PU19ET1MzMiB8fCBMWk9fT1NfV0lOMzIpICYmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX01TQyB8fCBMWk9fQ0NfUEVMTEVTQykpCi0jICBkZWZpbmUgTFpPX0FTTV9TWU5UQVhfTVNDIDEKLSNlbGlmIChMWk9fT1NfV0lONjQgJiYgKExaT19DQ19ETUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfTVNDIHx8IExaT19DQ19QRUxMRVNDKSkKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA9PSAweDAxMWYwMHVsKSkKLSNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfUEFUSFNDQUxFKSkKLSMgIGRlZmluZSBMWk9fQVNNX1NZTlRBWF9HTlVDIDEKLSNlbGlmIChMWk9fQVJDSF9BTUQ2NCAmJiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX1BBVEhTQ0FMRSkpCi0jICBkZWZpbmUgTFpPX0FTTV9TWU5UQVhfR05VQyAxCi0jZW5kaWYKLSNpZiAoTFpPX0FTTV9TWU5UQVhfR05VQykKLSNpZiAoTFpPX0FSQ0hfSTM4NiAmJiBMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDAwMHVsKSkKLSMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUiAgICAgICAgICJheCIKLSNlbGlmIChMWk9fQ0NfSU5URUxDKQotIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgIm1lbW9yeSIKLSNlbHNlCi0jICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVIgICAgICAgICAiY2MiLCAibWVtb3J5IgotI2VuZGlmCi0jZW5kaWYKICNpZiBkZWZpbmVkKF9fTFpPX0lORk9TVFJfTU0pCiAjZWxpZiAoTFpPX01NX0ZMQVQpICYmIChkZWZpbmVkKF9fTFpPX0lORk9TVFJfUE0pIHx8IGRlZmluZWQoTFpPX0lORk9fQUJJX1BNKSkKICMgIGRlZmluZSBfX0xaT19JTkZPU1RSX01NICAgICAgICAgICIiCkBAIC0xODY1LDYgKzI2MzcsMzgxIEBACiAjZGVmaW5lIExaT19JTkZPX1NUUklORyBcCiAgICAgTFpPX0lORk9fQVJDSCBfX0xaT19JTkZPU1RSX01NIF9fTFpPX0lORk9TVFJfUE0gX19MWk9fSU5GT1NUUl9FTkRJQU4gXAogICAgICIgIiBfX0xaT19JTkZPU1RSX09TTkFNRSBfX0xaT19JTkZPU1RSX0xJQkMgIiAiIExaT19JTkZPX0NDIF9fTFpPX0lORk9TVFJfQ0NWRVIKKyNpZiAhKExaT19DRkdfU0tJUF9MWk9fVFlQRVMpCisjaWYgKCEoTFpPX1NJWkVPRl9TSE9SVCswID4gMCAmJiBMWk9fU0laRU9GX0lOVCswID4gMCAmJiBMWk9fU0laRU9GX0xPTkcrMCA+IDApKQorIyAgZXJyb3IgIm1pc3NpbmcgZGVmaW5lcyBmb3Igc2l6ZXMiCisjZW5kaWYKKyNpZiAoIShMWk9fU0laRU9GX1BUUkRJRkZfVCswID4gMCAmJiBMWk9fU0laRU9GX1NJWkVfVCswID4gMCAmJiBMWk9fU0laRU9GX1ZPSURfUCswID4gMCkpCisjICBlcnJvciAibWlzc2luZyBkZWZpbmVzIGZvciBzaXplcyIKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19sbG9uZ190KQorI2lmIChMWk9fU0laRU9GX0xPTkdfTE9ORyswID4gMCkKK19fbHpvX2dudWNfZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgbHpvX2xsb25nX3RfXzsKK19fbHpvX2dudWNfZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgbHpvX3VsbG9uZ190X187CisjICBkZWZpbmUgbHpvX2xsb25nX3QgICAgICAgICAgICAgICBsem9fbGxvbmdfdF9fCisjICBkZWZpbmUgbHpvX3VsbG9uZ190ICAgICAgICAgICAgICBsem9fdWxsb25nX3RfXworI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MTZlX3QpCisjaWYgKExaT19TSVpFT0ZfTE9ORyA9PSAyKQorIyAgZGVmaW5lIGx6b19pbnQxNmVfdCAgICAgICAgICAgICAgbG9uZworIyAgZGVmaW5lIGx6b191aW50MTZlX3QgICAgICAgICAgICAgdW5zaWduZWQgbG9uZworI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDIpCisjICBkZWZpbmUgbHpvX2ludDE2ZV90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorI2VsaWYgKExaT19TSVpFT0ZfU0hPUlQgPT0gMikKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIHNob3J0IGludAorIyAgZGVmaW5lIGx6b191aW50MTZlX3QgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CisjZWxpZiAxICYmICEoTFpPX0NGR19UWVBFX05PX01PREVfSEkpICYmIChMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDI1ZjAwdWwpIHx8IExaT19DQ19MTFZNKQorICAgdHlwZWRlZiBpbnQgbHpvX2ludDE2ZV9oaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOworICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgbHpvX3VpbnQxNmVfaGlfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIGx6b19pbnQxNmVfaGlfdF9fCisjICBkZWZpbmUgbHpvX3VpbnQxNmVfdCAgICAgICAgICAgICBsem9fdWludDE2ZV9oaV90X18KKyNlbGlmIChMWk9fU0laRU9GX19fSU5UMTYgPT0gMikKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIF9faW50MTYKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIF9faW50MTYKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDE2ZV90KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDE2RV9UICAgMgorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MTZlX3QpID09IDIpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNmVfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMTZFX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MzJlX3QpCisjaWYgKExaT19TSVpFT0ZfTE9ORyA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50MzJlX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjZWxpZiAoTFpPX1NJWkVPRl9TSE9SVCA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgc2hvcnQgaW50CisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkdfTE9ORyA9PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbHpvX2xsb25nX3QKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIGx6b191bGxvbmdfdAorI2VsaWYgMSAmJiAhKExaT19DRkdfVFlQRV9OT19NT0RFX1NJKSAmJiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyNWYwMHVsKSB8fCBMWk9fQ0NfTExWTSkgJiYgKF9fSU5UX01BWF9fKzAgPiAyMTQ3NDgzNjQ3TCkKKyAgIHR5cGVkZWYgaW50IGx6b19pbnQzMmVfc2lfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGx6b191aW50MzJlX3NpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisjICBkZWZpbmUgbHpvX2ludDMyZV90ICAgICAgICAgICAgICBsem9faW50MzJlX3NpX3RfXworIyAgZGVmaW5lIGx6b191aW50MzJlX3QgICAgICAgICAgICAgbHpvX3VpbnQzMmVfc2lfdF9fCisjZWxpZiAxICYmICEoTFpPX0NGR19UWVBFX05PX01PREVfU0kpICYmIChMWk9fQ0NfR05VQyA+PSAweDAyNWYwMHVsKSAmJiBkZWZpbmVkKF9fQVZSX18pICYmIChfX0xPTkdfTUFYX18rMCA9PSAzMjc2N0wpCisgICB0eXBlZGVmIGludCBsem9faW50MzJlX3NpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBsem9fdWludDMyZV9zaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbHpvX2ludDMyZV9zaV90X18KKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIGx6b191aW50MzJlX3NpX3RfXworIyAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgICAgKGMjI0xMKQorIyAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgICAgKGMjI1VMTCkKKyNlbGlmIChMWk9fU0laRU9GX19fSU5UMzIgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIF9faW50MzIKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIHVuc2lnbmVkIF9faW50MzIKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyRV9UICAgNAorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJlX3QpID09IDQpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmVfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMzJFX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50NjRlX3QpCisjaWYgKExaT19TSVpFT0ZfX19JTlQ2NCA9PSA4KQorIyAgaWYgKExaT19DQ19CT1JMQU5EQykgJiYgIShMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICAgIGRlZmluZSBMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fU0laRU9GX0lOVCA9PSA4KSAmJiAoTFpPX1NJWkVPRl9JTlQgPCBMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDY0ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkcgPT0gOCkKKyMgIGRlZmluZSBsem9faW50NjRlX3QgICAgICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgbHpvX3VpbnQ2NGVfdCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9MT05HCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPT0gOCkgJiYgIShMWk9fQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBsem9fbGxvbmdfdAorIyAgZGVmaW5lIGx6b191aW50NjRlX3QgICAgICAgICAgICAgbHpvX3VsbG9uZ190CisjICBpZiAoTFpPX0NDX0JPUkxBTkRDKQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBsbCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgICgoYykgKyAwdWxsKQorIyAgZWxpZiAwCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoX19sem9fZ251Y19leHRlbnNpb25fXyAoYyMjTEwpKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gKGMjI1VMTCkpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjTEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoYyMjVUxMKQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCAgIExaT19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiAoTFpPX1NJWkVPRl9fX0lOVDY0ID09IDgpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBfX2ludDY0CisjICBkZWZpbmUgbHpvX3VpbnQ2NGVfdCAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDY0CisjICBpZiAoTFpPX0NDX0JPUkxBTkRDKQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBpNjQpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoKGMpICsgMHVpNjQpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjaTY0KQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKGMjI3VpNjQpCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UICAgTFpPX1NJWkVPRl9fX0lOVDY0CisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGVfdCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0ZV90KSA9PSA4KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRlX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDMybF90KQorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorIyAgZGVmaW5lIGx6b19pbnQzMmxfdCAgICAgICAgICAgICAgbHpvX2ludDMyZV90CisjICBkZWZpbmUgbHpvX3VpbnQzMmxfdCAgICAgICAgICAgICBsem9fdWludDMyZV90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0xaT19JTlQzMkVfVAorI2VsaWYgKExaT19TSVpFT0ZfSU5UID49IDQpICYmIChMWk9fU0laRU9GX0lOVCA8IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9faW50MzJsX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50MzJsX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgZGVmaW5lIGx6b19pbnQzMmxfdCAgICAgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBsem9fdWludDMybF90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QgICBMWk9fU0laRU9GX0xPTkcKKyNlbHNlCisjICBlcnJvciAibHpvX2ludDMybF90IgorI2VuZGlmCisjZW5kaWYKKyNpZiAxCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmxfdCkgPj0gNCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMybF90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkxfVCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGVfdCkKKyMgIGRlZmluZSBsem9faW50NjRsX3QgICAgICAgICAgICAgIGx6b19pbnQ2NGVfdAorIyAgZGVmaW5lIGx6b191aW50NjRsX3QgICAgICAgICAgICAgbHpvX3VpbnQ2NGVfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UICAgTFpPX1NJWkVPRl9MWk9fSU5UNjRFX1QKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRsX3QpID49IDgpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NGxfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50MzJmX3QpCisjaWYgKExaT19TSVpFT0ZfU0laRV9UID49IDgpCisjICBkZWZpbmUgbHpvX2ludDMyZl90ICAgICAgICAgICAgICBsem9faW50NjRsX3QKKyMgIGRlZmluZSBsem9fdWludDMyZl90ICAgICAgICAgICAgIGx6b191aW50NjRsX3QKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQzMkZfVCAgIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UCisjZWxzZQorIyAgZGVmaW5lIGx6b19pbnQzMmZfdCAgICAgICAgICAgICAgbHpvX2ludDMybF90CisjICBkZWZpbmUgbHpvX3VpbnQzMmZfdCAgICAgICAgICAgICBsem9fdWludDMybF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QgICBMWk9fU0laRU9GX0xaT19JTlQzMkxfVAorI2VuZGlmCisjZW5kaWYKKyNpZiAxCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPj0gNCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyZl90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkZfVCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19pbnQ2NGZfdCkKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyMgIGRlZmluZSBsem9faW50NjRmX3QgICAgICAgICAgICAgIGx6b19pbnQ2NGxfdAorIyAgZGVmaW5lIGx6b191aW50NjRmX3QgICAgICAgICAgICAgbHpvX3VpbnQ2NGxfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0Rl9UICAgTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0Zl90KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRmX3QpID49IDgpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NGZfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UNjRGX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50cHRyX3QpCisjaWYgMSAmJiAoTFpPX09TX09TNDAwICYmIChMWk9fU0laRU9GX1ZPSURfUCA9PSAxNikpCisjICBkZWZpbmUgX19MWk9fSU5UUFRSX1RfSVNfUE9JTlRFUiAxCisgICB0eXBlZGVmIGNoYXIqICAgICAgICAgICAgICAgICAgICBsem9faW50cHRyX3Q7CisgICB0eXBlZGVmIGNoYXIqICAgICAgICAgICAgICAgICAgICBsem9fdWludHB0cl90OworIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX1ZPSURfUAorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApICYmIChMWk9fU0laRU9GX1ZPSURfUCA9PSA0KSAmJiAoTFpPX1NJWkVPRl9JTlQgPT0gNCkpCisgICB0eXBlZGVmIF9fdzY0IGludCAgICAgICAgICAgICAgICBsem9faW50cHRyX3Q7CisgICB0eXBlZGVmIF9fdzY0IHVuc2lnbmVkIGludCAgICAgICBsem9fdWludHB0cl90OworIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfU0hPUlQgPT0gTFpPX1NJWkVPRl9WT0lEX1ApICYmIChMWk9fU0laRU9GX0lOVCA+IExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgc2hvcnQKKyMgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX1NIT1JUCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPj0gTFpPX1NJWkVPRl9WT0lEX1ApICYmIChMWk9fU0laRU9GX0lOVCA8IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGludAorIyAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0lOVAorI2VsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSBMWk9fU0laRU9GX1ZPSURfUCkKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlRQVFJfVCAgIExaT19TSVpFT0ZfTE9ORworI2VsaWYgKExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UID49IExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGx6b19pbnRwdHJfdCAgICAgICAgICAgICAgbHpvX2ludDY0bF90CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICBsem9fdWludDY0bF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorI2Vsc2UKKyMgIGVycm9yICJsem9faW50cHRyX3QiCisjZW5kaWYKKyNlbmRpZgorI2lmIDEKKyAgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPj0gc2l6ZW9mKHZvaWQgKikpCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZihsem9fdWludHB0cl90KSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b193b3JkX3QpCisjaWYgZGVmaW5lZChMWk9fV09SRFNJWkUpICYmIChMWk9fV09SRFNJWkUrMCA+IDApCisjaWYgKExaT19XT1JEU0laRSA9PSBMWk9fU0laRU9GX0xaT19JTlRQVFJfVCkgJiYgIShfX0xaT19JTlRQVFJfVF9JU19QT0lOVEVSKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgbHpvX3VpbnRwdHJfdAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgbHpvX2ludHB0cl90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgTFpPX1NJWkVPRl9MT05HCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfSU5UKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fV09SRFNJWkUgPT0gTFpPX1NJWkVPRl9TSE9SVCkKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBzaG9ydAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCBMWk9fU0laRU9GX1NIT1JUCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IDEpCisjICBkZWZpbmUgbHpvX3dvcmRfdCAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBzaWduZWQgY2hhcgorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCAxCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgbHpvX3VpbnQ2NGxfdAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgbHpvX2ludDY0bF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UCisjZWxpZiAoTFpPX0FSQ0hfU1BVKSAmJiAoTFpPX0NDX0dOVUMpCisjaWYgMAorICAgdHlwZWRlZiB1bnNpZ25lZCBsem9fd29yZF90ICBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1YxNlFJX18pKSk7CisgICB0eXBlZGVmIGludCAgICAgIGx6b19zd29yZF90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fVjE2UUlfXykpKTsKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIGx6b193b3JkX3QKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGx6b19zd29yZF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UICAgICAxNgorI2VuZGlmCisjZWxzZQorIyAgZXJyb3IgImx6b193b3JkX3QiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgMSAmJiBkZWZpbmVkKGx6b193b3JkX3QpCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fd29yZF90KSAgPT0gTFpPX1dPUkRTSVpFKQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3N3b3JkX3QpID09IExaT19XT1JEU0laRSkKKyNlbmRpZgorI2lmIDEKKyNkZWZpbmUgbHpvX2ludDhfdCAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyCisjZGVmaW5lIGx6b191aW50OF90ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDhfVCAgICAgICAxCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpID09IDEpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpID09IHNpemVvZihsem9fdWludDhfdCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQxNmVfdCkKKyNkZWZpbmUgbHpvX2ludDE2X3QgICAgICAgICAgICAgICAgIGx6b19pbnQxNmVfdAorI2RlZmluZSBsem9fdWludDE2X3QgICAgICAgICAgICAgICAgbHpvX3VpbnQxNmVfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlQxNl9UICAgICAgTFpPX1NJWkVPRl9MWk9fSU5UMTZFX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDE2X3QpID09IDIpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNl90KSA9PSBzaXplb2YobHpvX3VpbnQxNl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorI2RlZmluZSBsem9faW50MzJfdCAgICAgICAgICAgICAgICAgbHpvX2ludDMyZV90CisjZGVmaW5lIGx6b191aW50MzJfdCAgICAgICAgICAgICAgICBsem9fdWludDMyZV90CisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyX1QgICAgICBMWk9fU0laRU9GX0xaT19JTlQzMkVfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJfdCkgPT0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyX3QpID09IHNpemVvZihsem9fdWludDMyX3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRlX3QpCisjZGVmaW5lIGx6b19pbnQ2NF90ICAgICAgICAgICAgICAgICBsem9faW50NjRlX3QKKyNkZWZpbmUgbHpvX3VpbnQ2NF90ICAgICAgICAgICAgICAgIGx6b191aW50NjRlX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UNjRfVCAgICAgIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NF90KSA9PSA4KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRfdCkgPT0gc2l6ZW9mKGx6b191aW50NjRfdCkpCisjZW5kaWYKKyNpZiAxCisjZGVmaW5lIGx6b19pbnRfbGVhc3QzMl90ICAgICAgICAgICBsem9faW50MzJsX3QKKyNkZWZpbmUgbHpvX3VpbnRfbGVhc3QzMl90ICAgICAgICAgIGx6b191aW50MzJsX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0xFQVNUMzJfVCBMWk9fU0laRU9GX0xaT19JTlQzMkxfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50X2xlYXN0MzJfdCkgPj0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDMyX3QpID09IHNpemVvZihsem9fdWludF9sZWFzdDMyX3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCisjZGVmaW5lIGx6b19pbnRfbGVhc3Q2NF90ICAgICAgICAgICBsem9faW50NjRsX3QKKyNkZWZpbmUgbHpvX3VpbnRfbGVhc3Q2NF90ICAgICAgICAgIGx6b191aW50NjRsX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0xFQVNUNjRfVCBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50X2xlYXN0NjRfdCkgPj0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDY0X3QpID09IHNpemVvZihsem9fdWludF9sZWFzdDY0X3QpKQorI2VuZGlmCisjaWYgMQorI2RlZmluZSBsem9faW50X2Zhc3QzMl90ICAgICAgICAgICBsem9faW50MzJmX3QKKyNkZWZpbmUgbHpvX3VpbnRfZmFzdDMyX3QgICAgICAgICAgbHpvX3VpbnQzMmZfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlRfRkFTVDMyX1QgTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0MzJfdCkgPj0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0MzJfdCkgPT0gc2l6ZW9mKGx6b191aW50X2Zhc3QzMl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0Zl90KQorI2RlZmluZSBsem9faW50X2Zhc3Q2NF90ICAgICAgICAgICBsem9faW50NjRmX3QKKyNkZWZpbmUgbHpvX3VpbnRfZmFzdDY0X3QgICAgICAgICAgbHpvX3VpbnQ2NGZfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlRfRkFTVDY0X1QgTFpPX1NJWkVPRl9MWk9fSU5UNjRGX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0NjRfdCkgPj0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9mYXN0NjRfdCkgPT0gc2l6ZW9mKGx6b191aW50X2Zhc3Q2NF90KSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19JTlQxNl9DKQorIyAgaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9JTlQgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgTFpPX1VJTlQxNl9DKGMpICAgICAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0xPTkcgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgICgoYykgKyAwTCkKKyMgICAgZGVmaW5lIExaT19VSU5UMTZfQyhjKSAgICAgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChMWk9fU0laRU9GX0lOVCA+PSAyKQorIyAgICBkZWZpbmUgTFpPX0lOVDE2X0MoYykgICAgICAgICAgKGMpCisjICAgIGRlZmluZSBMWk9fVUlOVDE2X0MoYykgICAgICAgICAoYyMjVSkKKyMgIGVsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSAyKQorIyAgICBkZWZpbmUgTFpPX0lOVDE2X0MoYykgICAgICAgICAgKGMjI0wpCisjICAgIGRlZmluZSBMWk9fVUlOVDE2X0MoYykgICAgICAgICAoYyMjVUwpCisjICBlbHNlCisjICAgIGVycm9yICJMWk9fSU5UMTZfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSU5UMzJfQykKKyMgIGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfSU5UID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgICgoYykgKyAwVSkKKyMgIGVsaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9MT05HID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9JTlQgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjKQorIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICAgICAgKGMjI1UpCisjICBlbGlmIChMWk9fU0laRU9GX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjIyNMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICAgICAgKGMjI1VMKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIExaT19JTlQzMl9DKGMpICAgICAgICAgIChjIyNMTCkKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgIChjIyNVTEwpCisjICBlbHNlCisjICAgIGVycm9yICJMWk9fSU5UMzJfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSU5UNjRfQykgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjICBpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0lOVCA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDApCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoKGMpICsgMFUpCisjICBlbGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfTE9ORyA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKChjKSArIDBVTCkKKyMgIGVsaWYgKExaT19TSVpFT0ZfSU5UID49IDgpCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYykKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChjIyNVKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HID49IDgpCisjICAgIGRlZmluZSBMWk9fSU5UNjRfQyhjKSAgICAgICAgICAoYyMjTCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChjIyNVTCkKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkxaT19JTlQ2NF9DIgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCiAKICNlbmRpZgogCkBAIC0xODczLDcgKzMwMjAsNyBAQAogI3VuZGVmIExaT19IQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAibWluaWx6by5oIgogCi0jaWYgIWRlZmluZWQoTUlOSUxaT19WRVJTSU9OKSB8fCAoTUlOSUxaT19WRVJTSU9OICE9IDB4MjA0MCkKKyNpZiAhZGVmaW5lZChNSU5JTFpPX1ZFUlNJT04pIHx8IChNSU5JTFpPX1ZFUlNJT04gIT0gMHgyMDcwKQogIyAgZXJyb3IgInZlcnNpb24gbWlzbWF0Y2ggaW4gbWluaUxaTyBzb3VyY2UgZmlsZXMiCiAjZW5kaWYKIApAQCAtMTg4NSwyMyArMzAzMiw5IEBACiAjZGVmaW5lIF9fTFpPX0NPTkZfSCAxCiAKICNpZiAhZGVmaW5lZChfX0xaT19JTl9NSU5JTFpPKQotI2lmIChMWk9fQ0ZHX0ZSRUVTVEFORElORykKKyNpZiBkZWZpbmVkKExaT19DRkdfRlJFRVNUQU5ESU5HKSAmJiAoTFpPX0NGR19GUkVFU1RBTkRJTkcpCiAjICBkZWZpbmUgTFpPX0xJQkNfRlJFRVNUQU5ESU5HIDEKICMgIGRlZmluZSBMWk9fT1NfRlJFRVNUQU5ESU5HIDEKLSMgIGRlZmluZSBBQ0NfTElCQ19GUkVFU1RBTkRJTkcgMQotIyAgZGVmaW5lIEFDQ19PU19GUkVFU1RBTkRJTkcgMQotI2VuZGlmCi0jaWYgKExaT19DRkdfTk9fVU5BTElHTkVEKQotIyAgZGVmaW5lIEFDQ19DRkdfTk9fVU5BTElHTkVEIDEKLSNlbmRpZgotI2lmIChMWk9fQVJDSF9HRU5FUklDKQotIyAgZGVmaW5lIEFDQ19BUkNIX0dFTkVSSUMgMQotI2VuZGlmCi0jaWYgKExaT19BQklfTkVVVFJBTF9FTkRJQU4pCi0jICBkZWZpbmUgQUNDX0FCSV9ORVVUUkFMX0VORElBTiAxCi0jZW5kaWYKLSNpZiAoTFpPX0hBVkVfQ09ORklHX0gpCi0jICBkZWZpbmUgQUNDX0NPTkZJR19OT19IRUFERVIgMQogI2VuZGlmCiAjaWYgZGVmaW5lZChMWk9fQ0ZHX0VYVFJBX0NPTkZJR19IRUFERVIpCiAjICBpbmNsdWRlIExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUgpAQCAtMTkxMCwyMiArMzA0MywyNyBAQAogIyAgZXJyb3IgImluY2x1ZGUgdGhpcyBmaWxlIGZpcnN0IgogI2VuZGlmCiAjaW5jbHVkZSAibHpvL2x6b2NvbmYuaCIKKyNpZiBkZWZpbmVkKExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUjIpCisjICBpbmNsdWRlIExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUjIKKyNlbmRpZgogI2VuZGlmCiAKLSNpZiAoTFpPX1ZFUlNJT04gPCAweDAyMDAwKSB8fCAhZGVmaW5lZChfX0xaT0NPTkZfSF9JTkNMVURFRCkKKyNpZiAoTFpPX1ZFUlNJT04gPCAweDIwNzApIHx8ICFkZWZpbmVkKF9fTFpPQ09ORl9IX0lOQ0xVREVEKQogIyAgZXJyb3IgInZlcnNpb24gbWlzbWF0Y2giCiAjZW5kaWYKIAotI2lmIChMWk9fQ0NfQk9STEFOREMgJiYgTFpPX0FSQ0hfSTA4NikKLSMgIHByYWdtYSBvcHRpb24gLWgKKyNpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTAwMCAmJiBfTVNDX1ZFUiA8IDExMDApKQorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcwMikKICNlbmRpZgotCiAjaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEwMDApKQogIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDEyNyA0NzAxKQorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDUxNCA0NzEwIDQ3MTEpCiAjZW5kaWYKICNpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCiAjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0ODIwKQotIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDUxNCA0NzEwIDQ3MTEpCisjZW5kaWYKKyNpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTgwMCkpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NzQ2KQogI2VuZGlmCiAKICNpZiAoTFpPX0NDX1NVTlBST0MpCkBAIC0xOTM2LDQ5ICszMDc0LDE2IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgKF9fTFpPX01NT0RFTF9IVUdFKSAmJiAhKExaT19IQVZFX01NX0hVR0VfUFRSKQotIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gLSBjaGVjayBkZWZpbmVzIGZvciBfX2h1Z2UiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19MWk9fSU5fTUlOSUxaTykgfHwgZGVmaW5lZChMWk9fQ0ZHX0ZSRUVTVEFORElORykKLSNlbGlmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNikKLSMgIGRlZmluZSBBQ0NfV0FOVF9BQ0NfSU5DRF9IIDEKLSMgIGRlZmluZSBBQ0NfV0FOVF9BQ0NfSU5DRV9IIDEKLSMgIGRlZmluZSBBQ0NfV0FOVF9BQ0NfSU5DSV9IIDEKKyNpZiBkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pIHx8IChMWk9fQ0ZHX0ZSRUVTVEFORElORykKICNlbGlmIDEKICMgIGluY2x1ZGUgPHN0cmluZy5oPgogI2Vsc2UKLSMgIGRlZmluZSBBQ0NfV0FOVF9BQ0NfSU5DRF9IIDEKKyMgIGRlZmluZSBMWk9fV0FOVF9BQ0NfSU5DRF9IIDEKICNlbmRpZgotCi0jaWYgKExaT19BUkNIX0kwODYpCi0jICBkZWZpbmUgQUNDX01NX0FIU0hJRlQgICAgICAgIExaT19NTV9BSFNISUZUCi0jICBkZWZpbmUgQUNDX1BUUl9GUF9PRkYoeCkgICAgICgoKGNvbnN0IHVuc2lnbmVkIF9fZmFyKikmKHgpKVswXSkKLSMgIGRlZmluZSBBQ0NfUFRSX0ZQX1NFRyh4KSAgICAgKCgoY29uc3QgdW5zaWduZWQgX19mYXIqKSYoeCkpWzFdKQotIyAgZGVmaW5lIEFDQ19QVFJfTUtfRlAocyxvKSAgICAoKHZvaWQgX19mYXIqKSgoKHVuc2lnbmVkIGxvbmcpKHMpPDwxNikrKHVuc2lnbmVkKShvKSkpCisjaWYgZGVmaW5lZChMWk9fSEFWRV9DT05GSUdfSCkKKyMgIGRlZmluZSBMWk9fQ0ZHX05PX0NPTkZJR19IRUFERVIgMQogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChsem9fdWludHB0cl90KQotIyAgaWYgZGVmaW5lZChfX0xaT19NTU9ERUxfSFVHRSkKLSMgICAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgdW5zaWduZWQgbG9uZwotIyAgZWxpZiAxICYmIGRlZmluZWQoTFpPX09TX09TNDAwKSAmJiAoTFpPX1NJWkVPRl9WT0lEX1AgPT0gMTYpCi0jICAgIGRlZmluZSBfX0xaT19VSU5UUFRSX1RfSVNfUE9JTlRFUiAxCi0gICAgIHR5cGVkZWYgY2hhciogICAgICAgICAgICAgIGx6b191aW50cHRyX3Q7Ci0jICAgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgIGx6b191aW50cHRyX3QKLSMgIGVsaWYgKExaT19TSVpFT0ZfU0laRV9UID09IExaT19TSVpFT0ZfVk9JRF9QKQotIyAgICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICBzaXplX3QKLSMgIGVsaWYgKExaT19TSVpFT0ZfTE9ORyA9PSBMWk9fU0laRU9GX1ZPSURfUCkKLSMgICAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgdW5zaWduZWQgbG9uZwotIyAgZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gTFpPX1NJWkVPRl9WT0lEX1ApCi0jICAgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgIHVuc2lnbmVkIGludAotIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPT0gTFpPX1NJWkVPRl9WT0lEX1ApCi0jICAgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgZWxzZQotIyAgICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICBzaXplX3QKLSMgIGVuZGlmCi0jZW5kaWYKLUxaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnRwdHJfdCkgPj0gc2l6ZW9mKGx6b192b2lkcCkpCi0KICNpZiAxICYmICFkZWZpbmVkKExaT19DRkdfRlJFRVNUQU5ESU5HKQogI2lmIDEgJiYgIWRlZmluZWQoSEFWRV9TVFJJTkdfSCkKICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCkBAIC0yMDAxLDYgKzMxMDYsMjMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNlbmRpZgogCisjaWYgMSB8fCBkZWZpbmVkKGx6b19pbnQ4X3QpIHx8IGRlZmluZWQobHpvX3VpbnQ4X3QpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpICA9PSAxKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDhfdCkgPT0gMSkKKyNlbmRpZgorI2lmIDEgfHwgZGVmaW5lZChsem9faW50MTZfdCkgfHwgZGVmaW5lZChsem9fdWludDE2X3QpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNl90KSAgPT0gMikKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQxNl90KSA9PSAyKQorI2VuZGlmCisjaWYgMSB8fCBkZWZpbmVkKGx6b19pbnQzMl90KSB8fCBkZWZpbmVkKGx6b191aW50MzJfdCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyX3QpICA9PSA0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDMyX3QpID09IDQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NF90KSB8fCBkZWZpbmVkKGx6b191aW50NjRfdCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0X3QpICA9PSA4KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDY0X3QpID09IDgpCisjZW5kaWYKKwogI2lmIChMWk9fQ0ZHX0ZSRUVTVEFORElORykKICMgIHVuZGVmIEhBVkVfTUVNQ01QCiAjICB1bmRlZiBIQVZFX01FTUNQWQpAQCAtMjAxMSwyOCArMzEzMywyOCBAQAogI2lmICEoSEFWRV9NRU1DTVApCiAjICB1bmRlZiBtZW1jbXAKICMgIGRlZmluZSBtZW1jbXAoYSxiLGMpICAgICAgICAgbHpvX21lbWNtcChhLGIsYykKLSNlbGlmICEoX19MWk9fTU1PREVMX0hVR0UpCisjZWxzZQogIyAgdW5kZWYgbHpvX21lbWNtcAogIyAgZGVmaW5lIGx6b19tZW1jbXAoYSxiLGMpICAgICBtZW1jbXAoYSxiLGMpCiAjZW5kaWYKICNpZiAhKEhBVkVfTUVNQ1BZKQogIyAgdW5kZWYgbWVtY3B5CiAjICBkZWZpbmUgbWVtY3B5KGEsYixjKSAgICAgICAgIGx6b19tZW1jcHkoYSxiLGMpCi0jZWxpZiAhKF9fTFpPX01NT0RFTF9IVUdFKQorI2Vsc2UKICMgIHVuZGVmIGx6b19tZW1jcHkKICMgIGRlZmluZSBsem9fbWVtY3B5KGEsYixjKSAgICAgbWVtY3B5KGEsYixjKQogI2VuZGlmCiAjaWYgIShIQVZFX01FTU1PVkUpCiAjICB1bmRlZiBtZW1tb3ZlCiAjICBkZWZpbmUgbWVtbW92ZShhLGIsYykgICAgICAgIGx6b19tZW1tb3ZlKGEsYixjKQotI2VsaWYgIShfX0xaT19NTU9ERUxfSFVHRSkKKyNlbHNlCiAjICB1bmRlZiBsem9fbWVtbW92ZQogIyAgZGVmaW5lIGx6b19tZW1tb3ZlKGEsYixjKSAgICBtZW1tb3ZlKGEsYixjKQogI2VuZGlmCiAjaWYgIShIQVZFX01FTVNFVCkKICMgIHVuZGVmIG1lbXNldAogIyAgZGVmaW5lIG1lbXNldChhLGIsYykgICAgICAgICBsem9fbWVtc2V0KGEsYixjKQotI2VsaWYgIShfX0xaT19NTU9ERUxfSFVHRSkKKyNlbHNlCiAjICB1bmRlZiBsem9fbWVtc2V0CiAjICBkZWZpbmUgbHpvX21lbXNldChhLGIsYykgICAgIG1lbXNldChhLGIsYykKICNlbmRpZgpAQCAtMjA1NywyNyArMzE3OSwyOSBAQAogIyAgZGVmaW5lIEJPVU5EU19DSEVDS0lOR19PRkZfSU5fRVhQUihleHByKSAgICAgKGV4cHIpCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKF9fbHpvX2lubGluZSkKLSMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgICAgIC8qZW1wdHkqLwotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19sem9fZm9yY2VpbmxpbmUpCi0jICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgICAgICAvKmVtcHR5Ki8KLSNlbmRpZgotI2lmICFkZWZpbmVkKF9fbHpvX25vaW5saW5lKQotIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICAgICAgLyplbXB0eSovCi0jZW5kaWYKLQogI2lmIChMWk9fQ0ZHX1BHTykKLSMgIHVuZGVmIF9fYWNjX2xpa2VseQotIyAgdW5kZWYgX19hY2NfdW5saWtlbHkKICMgIHVuZGVmIF9fbHpvX2xpa2VseQogIyAgdW5kZWYgX19sem9fdW5saWtlbHkKLSMgIGRlZmluZSBfX2FjY19saWtlbHkoZSkgICAgICAgKGUpCi0jICBkZWZpbmUgX19hY2NfdW5saWtlbHkoZSkgICAgIChlKQogIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKICMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKGUpCiAjZW5kaWYKIAorI3VuZGVmIF8KKyN1bmRlZiBfXworI3VuZGVmIF9fXworI3VuZGVmIF9fX18KKyN1bmRlZiBfcDAKKyN1bmRlZiBfcDEKKyN1bmRlZiBfcDIKKyN1bmRlZiBfcDMKKyN1bmRlZiBfcDQKKyN1bmRlZiBfczAKKyN1bmRlZiBfczEKKyN1bmRlZiBfczIKKyN1bmRlZiBfczMKKyN1bmRlZiBfczQKKyN1bmRlZiBfd3cKKwogI2lmIDEKICMgIGRlZmluZSBMWk9fQllURSh4KSAgICAgICAoKHVuc2lnbmVkIGNoYXIpICh4KSkKICNlbHNlCkBAIC0yMDk2LDQ4ICszMjIwLDU0OCBAQAogI2RlZmluZSBMWk9fU0laRShiaXRzKSAgICAgICgxdSA8PCAoYml0cykpCiAjZGVmaW5lIExaT19NQVNLKGJpdHMpICAgICAgKExaT19TSVpFKGJpdHMpIC0gMSkKIAotI2RlZmluZSBMWk9fTFNJWkUoYml0cykgICAgICgxdWwgPDwgKGJpdHMpKQotI2RlZmluZSBMWk9fTE1BU0soYml0cykgICAgIChMWk9fTFNJWkUoYml0cykgLSAxKQotCiAjZGVmaW5lIExaT19VU0laRShiaXRzKSAgICAgKChsem9fdWludCkgMSA8PCAoYml0cykpCiAjZGVmaW5lIExaT19VTUFTSyhiaXRzKSAgICAgKExaT19VU0laRShiaXRzKSAtIDEpCiAKICNpZiAhZGVmaW5lZChETVVMKQogI2lmIDAKIAotIyAgZGVmaW5lIERNVUwoYSxiKSAoKGx6b194aW50KSAoKGx6b191aW50MzIpKGEpICogKGx6b191aW50MzIpKGIpKSkKKyMgIGRlZmluZSBETVVMKGEsYikgKChsem9feGludCkgKChsem9fdWludDMyX3QpKGEpICogKGx6b191aW50MzJfdCkoYikpKQogI2Vsc2UKICMgIGRlZmluZSBETVVMKGEsYikgKChsem9feGludCkgKChhKSAqIChiKSkpCiAjZW5kaWYKICNlbmRpZgogCi0jaWYgMSAmJiAhKExaT19DRkdfTk9fVU5BTElHTkVEKQotI2lmIDEgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYgfHwgTFpPX0FSQ0hfUE9XRVJQQykKLSMgIGlmIChMWk9fU0laRU9GX1NIT1JUID09IDIpCi0jICAgIGRlZmluZSBMWk9fVU5BTElHTkVEX09LXzIgMQotIyAgZW5kaWYKLSMgIGlmIChMWk9fU0laRU9GX0lOVCA9PSA0KQotIyAgICBkZWZpbmUgTFpPX1VOQUxJR05FRF9PS180IDEKLSMgIGVuZGlmCisjaWZuZGVmIF9fTFpPX0ZVTkNfSAorI2RlZmluZSBfX0xaT19GVU5DX0ggMQorCisjaWYgIWRlZmluZWQoTFpPX0JJVE9QU19VU0VfQVNNX0JJVFNDQU4pICYmICFkZWZpbmVkKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgIWRlZmluZWQoTFpPX0JJVE9QU19VU0VfTVNDX0JJVFNDQU4pCisjaWYgMSAmJiAoTFpPX0FSQ0hfQU1ENjQpICYmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwMHVsKSkgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisjZGVmaW5lIExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOIDEKKyNlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpIHx8IChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gMTAwMCkpIHx8IChMWk9fQ0NfTExWTSAmJiAoIWRlZmluZWQoX19sbHZtX3Rvb2xzX3ZlcnNpb25fXykgfHwgKF9fbGx2bV90b29sc192ZXJzaW9uX18rMCA+PSAweDAxMDUwMHVsKSkpKQorI2RlZmluZSBMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4gMQorI2VsaWYgKExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpICYmICgoTFpPX0NDX0lOVEVMQ19NU0MgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gMTAxMCkpIHx8IChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxNDAwKSkpCisjZGVmaW5lIExaT19CSVRPUFNfVVNFX01TQ19CSVRTQ0FOIDEKKyNpZiAoTFpPX0NDX01TQykgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpCisjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKyNpZiAoTFpPX0NDX01TQykgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpCisjcHJhZ21hIGludHJpbnNpYyhfQml0U2NhblJldmVyc2UpCisjcHJhZ21hIGludHJpbnNpYyhfQml0U2NhbkZvcndhcmQpCisjZW5kaWYKKyNpZiAoTFpPX0NDX01TQykgJiYgKExaT19BUkNIX0FNRDY0KQorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlNjQpCisjcHJhZ21hIGludHJpbnNpYyhfQml0U2NhbkZvcndhcmQ2NCkKKyNlbmRpZgogI2VuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKQotICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKHNob3J0KSA9PSAyKQorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHVuc2lnbmVkIGx6b19iaXRvcHNfY3RsejMyX2Z1bmMobHpvX3VpbnQzMl90IHYpCit7CisjaWYgKExaT19CSVRPUFNfVVNFX01TQ19CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyAgICB1bnNpZ25lZCBsb25nIHI7ICh2b2lkKSBfQml0U2NhblJldmVyc2UoJnIsIHYpOyByZXR1cm4gKHVuc2lnbmVkKSByIF4gMzE7CisjZGVmaW5lIGx6b19iaXRvcHNfY3RsejMyKHYpICAgIGx6b19iaXRvcHNfY3RsejMyX2Z1bmModikKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9BU01fQklUU0NBTikgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGx6b191aW50MzJfdCByOworICAgIF9fYXNtX18oImJzciAlMSwlMCIgOiAiPXIiIChyKSA6ICJybSIgKHYpIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MpOworICAgIHJldHVybiAodW5zaWduZWQpIHIgXiAzMTsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6MzIodikgICAgbHpvX2JpdG9wc19jdGx6MzJfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgKExaT19TSVpFT0ZfSU5UID09IDQpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2Nseih2KTsgcmV0dXJuIHI7CisjZGVmaW5lIGx6b19iaXRvcHNfY3RsejMyKHYpICAgICgodW5zaWduZWQpIF9fYnVpbHRpbl9jbHoodikpCisjZWxzZQorICAgIExaT19VTlVTRUQodik7IHJldHVybiAwOwogI2VuZGlmCi0jaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCi0gIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQzMikgPT0gNCkKLSNlbGlmIGRlZmluZWQoTFpPX0FMSUdORURfT0tfNCkKLSAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDMyKSA9PSA0KQorfQorCisjaWYgZGVmaW5lZChsem9fdWludDY0X3QpCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdW5zaWduZWQgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyhsem9fdWludDY0X3QgdikKK3sKKyNpZiAoTFpPX0JJVE9QU19VU0VfTVNDX0JJVFNDQU4pICYmIChMWk9fQVJDSF9BTUQ2NCkKKyAgICB1bnNpZ25lZCBsb25nIHI7ICh2b2lkKSBfQml0U2NhblJldmVyc2U2NCgmciwgdik7IHJldHVybiAodW5zaWduZWQpIHIgXiA2MzsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGx6b191aW50NjRfdCByOworICAgIF9fYXNtX18oImJzciAlMSwlMCIgOiAiPXIiIChyKSA6ICJybSIgKHYpIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MpOworICAgIHJldHVybiAodW5zaWduZWQpIHIgXiA2MzsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgKExaT19TSVpFT0ZfTE9ORyA9PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2Nsemwodik7IHJldHVybiByOworI2RlZmluZSBsem9fYml0b3BzX2N0bHo2NCh2KSAgICAoKHVuc2lnbmVkKSBfX2J1aWx0aW5fY2x6bCh2KSkKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmIChMWk9fU0laRU9GX0xPTkdfTE9ORyA9PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2NsemxsKHYpOyByZXR1cm4gcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgKCh1bnNpZ25lZCkgX19idWlsdGluX2NsemxsKHYpKQorI2Vsc2UKKyAgICBMWk9fVU5VU0VEKHYpOyByZXR1cm4gMDsKKyNlbmRpZgorfQogI2VuZGlmCiAKLSN1bmRlZiBDT1BZNAotI2lmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KSB8fCBkZWZpbmVkKExaT19BTElHTkVEX09LXzQpCi0jICBpZiAxICYmIGRlZmluZWQoQUNDX1VBX0NPUFkzMikKLSMgICAgZGVmaW5lIENPUFk0KGQscykgIEFDQ19VQV9DT1BZMzIoZCxzKQotIyAgZWxzZQotIyAgICBkZWZpbmUgQ09QWTQoZCxzKSAgKCogKF9fbHpvX3VhX3ZvbGF0aWxlIGx6b191aW50MzJwKShfX2x6b191YV92b2xhdGlsZSBsem9fdm9pZHApKGQpID0gKiAoX19sem9fdWFfdm9sYXRpbGUgY29uc3QgbHpvX3VpbnQzMnApKF9fbHpvX3VhX3ZvbGF0aWxlIGNvbnN0IGx6b192b2lkcCkocykpCi0jICBlbmRpZgorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHVuc2lnbmVkIGx6b19iaXRvcHNfY3R0ejMyX2Z1bmMobHpvX3VpbnQzMl90IHYpCit7CisjaWYgKExaT19CSVRPUFNfVVNFX01TQ19CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyAgICB1bnNpZ25lZCBsb25nIHI7ICh2b2lkKSBfQml0U2NhbkZvcndhcmQoJnIsIHYpOyByZXR1cm4gKHVuc2lnbmVkKSByOworI2RlZmluZSBsem9fYml0b3BzX2N0dHozMih2KSAgICBsem9fYml0b3BzX2N0dHozMl9mdW5jKHYpCisjZWxpZiAoTFpPX0JJVE9QU19VU0VfQVNNX0JJVFNDQU4pICYmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBsem9fdWludDMyX3QgcjsKKyAgICBfX2FzbV9fKCJic2YgJTEsJTAiIDogIj1yIiAocikgOiAicm0iICh2KSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKSByOworI2RlZmluZSBsem9fYml0b3BzX2N0dHozMih2KSAgICBsem9fYml0b3BzX2N0dHozMl9mdW5jKHYpCisjZWxpZiAoTFpPX0JJVE9QU19VU0VfR05VQ19CSVRTQ0FOKSAmJiAoTFpPX1NJWkVPRl9JTlQgPj0gNCkKKyAgICB1bnNpZ25lZCByOyByID0gKHVuc2lnbmVkKSBfX2J1aWx0aW5fY3R6KHYpOyByZXR1cm4gcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6MzIodikgICAgKCh1bnNpZ25lZCkgX19idWlsdGluX2N0eih2KSkKKyNlbHNlCisgICAgTFpPX1VOVVNFRCh2KTsgcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQobHpvX3VpbnQ2NF90KQorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHVuc2lnbmVkIGx6b19iaXRvcHNfY3R0ejY0X2Z1bmMobHpvX3VpbnQ2NF90IHYpCit7CisjaWYgKExaT19CSVRPUFNfVVNFX01TQ19CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQpCisgICAgdW5zaWduZWQgbG9uZyByOyAodm9pZCkgX0JpdFNjYW5Gb3J3YXJkNjQoJnIsIHYpOyByZXR1cm4gKHVuc2lnbmVkKSByOworI2RlZmluZSBsem9fYml0b3BzX2N0dHo2NCh2KSAgICBsem9fYml0b3BzX2N0dHo2NF9mdW5jKHYpCisjZWxpZiAoTFpPX0JJVE9QU19VU0VfQVNNX0JJVFNDQU4pICYmIChMWk9fQVJDSF9BTUQ2NCkgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisgICAgbHpvX3VpbnQ2NF90IHI7CisgICAgX19hc21fXygiYnNmICUxLCUwIiA6ICI9ciIgKHIpIDogInJtIiAodikgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyk7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6NjQodikgICAgbHpvX2JpdG9wc19jdHR6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgKExaT19TSVpFT0ZfTE9ORyA+PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2N0emwodik7IHJldHVybiByOworI2RlZmluZSBsem9fYml0b3BzX2N0dHo2NCh2KSAgICAoKHVuc2lnbmVkKSBfX2J1aWx0aW5fY3R6bCh2KSkKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmIChMWk9fU0laRU9GX0xPTkdfTE9ORyA+PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2N0emxsKHYpOyByZXR1cm4gcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6NjQodikgICAgKCh1bnNpZ25lZCkgX19idWlsdGluX2N0emxsKHYpKQorI2Vsc2UKKyAgICBMWk9fVU5VU0VEKHYpOyByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiAxICYmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZAorI2VuZGlmCitsem9fYml0b3BzX3VudXNlZF9mdW5jcyh2b2lkKQoreworICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX2N0bHozMl9mdW5jKTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX2JpdG9wc19jdHR6MzJfZnVuYyk7CisjaWYgZGVmaW5lZChsem9fdWludDY0X3QpCisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19iaXRvcHNfY3RsejY0X2Z1bmMpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX2N0dHo2NF9mdW5jKTsKKyNlbmRpZgorICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX3VudXNlZF9mdW5jcyk7Cit9CisKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpICYmICEoTFpPX0NGR19OT19VTkFMSUdORUQpCisjaWZuZGVmIF9fbHpvX21lbW9wc190Y2hlY2sKKyNkZWZpbmUgX19sem9fbWVtb3BzX3RjaGVjayh0LGEsYikgKCh2b2lkKTAsIHNpemVvZih0KSA9PSAoYSkgJiYgX19sem9fYWxpZ25vZih0KSA9PSAoYikpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMHAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTBwIHZvaWQgX19MWk9fTU1PREVMICoKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMXAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTFwIHVuc2lnbmVkIGNoYXIgX19MWk9fTU1PREVMICoKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMnAKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKK3R5cGVkZWYgbHpvX3VpbnQxNl90IF9fbHpvX21heV9hbGlhcyBsem9fbWVtb3BzX1RVMjsKKyNkZWZpbmUgbHpvX21lbW9wc19UVTJwIHZvbGF0aWxlIGx6b19tZW1vcHNfVFUyICoKKyNlbGlmIGRlZmluZWQoX19sem9fYnl0ZV9zdHJ1Y3QpCitfX2x6b19ieXRlX3N0cnVjdChsem9fbWVtb3BzX1RVMl9zdHJ1Y3QsMikKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFUyX3N0cnVjdCBsem9fbWVtb3BzX1RVMjsKKyNlbHNlCitzdHJ1Y3QgbHpvX21lbW9wc19UVTJfc3RydWN0IHsgdW5zaWduZWQgY2hhciBhWzJdOyB9IF9fbHpvX21heV9hbGlhczsKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFUyX3N0cnVjdCBsem9fbWVtb3BzX1RVMjsKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMnAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTJwIGx6b19tZW1vcHNfVFUyICoKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIGx6b19tZW1vcHNfVFU0cAorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQordHlwZWRlZiBsem9fdWludDMyX3QgX19sem9fbWF5X2FsaWFzIGx6b19tZW1vcHNfVFU0OworI2RlZmluZSBsem9fbWVtb3BzX1RVNHAgdm9sYXRpbGUgbHpvX21lbW9wc19UVTQgX19MWk9fTU1PREVMICoKKyNlbGlmIGRlZmluZWQoX19sem9fYnl0ZV9zdHJ1Y3QpCitfX2x6b19ieXRlX3N0cnVjdChsem9fbWVtb3BzX1RVNF9zdHJ1Y3QsNCkKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFU0X3N0cnVjdCBsem9fbWVtb3BzX1RVNDsKKyNlbHNlCitzdHJ1Y3QgbHpvX21lbW9wc19UVTRfc3RydWN0IHsgdW5zaWduZWQgY2hhciBhWzRdOyB9IF9fbHpvX21heV9hbGlhczsKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFU0X3N0cnVjdCBsem9fbWVtb3BzX1RVNDsKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVNHAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTRwIGx6b19tZW1vcHNfVFU0IF9fTFpPX01NT0RFTCAqCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVOHAKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQ2NCkKK3R5cGVkZWYgbHpvX3VpbnQ2NF90IF9fbHpvX21heV9hbGlhcyBsem9fbWVtb3BzX1RVODsKKyNkZWZpbmUgbHpvX21lbW9wc19UVThwIHZvbGF0aWxlIGx6b19tZW1vcHNfVFU4IF9fTFpPX01NT0RFTCAqCisjZWxpZiBkZWZpbmVkKF9fbHpvX2J5dGVfc3RydWN0KQorX19sem9fYnl0ZV9zdHJ1Y3QobHpvX21lbW9wc19UVThfc3RydWN0LDgpCit0eXBlZGVmIHN0cnVjdCBsem9fbWVtb3BzX1RVOF9zdHJ1Y3QgbHpvX21lbW9wc19UVTg7CisjZWxzZQorc3RydWN0IGx6b19tZW1vcHNfVFU4X3N0cnVjdCB7IHVuc2lnbmVkIGNoYXIgYVs4XTsgfSBfX2x6b19tYXlfYWxpYXM7Cit0eXBlZGVmIHN0cnVjdCBsem9fbWVtb3BzX1RVOF9zdHJ1Y3QgbHpvX21lbW9wc19UVTg7CisjZW5kaWYKKyNpZm5kZWYgbHpvX21lbW9wc19UVThwCisjZGVmaW5lIGx6b19tZW1vcHNfVFU4cCBsem9fbWVtb3BzX1RVOCBfX0xaT19NTU9ERUwgKgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgbHpvX21lbW9wc19zZXRfVFUxcAorI2RlZmluZSBsem9fbWVtb3BzX3NldF9UVTFwICAgICB2b2xhdGlsZSBsem9fbWVtb3BzX1RVMXAKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX21vdmVfVFUxcAorI2RlZmluZSBsem9fbWVtb3BzX21vdmVfVFUxcCAgICBsem9fbWVtb3BzX1RVMXAKKyNlbmRpZgorI2RlZmluZSBMWk9fTUVNT1BTX1NFVDEoZGQsY2MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfc2V0X1RVMXAgZF9fMSA9IChsem9fbWVtb3BzX3NldF9UVTFwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpOyBcCisgICAgZF9fMVswXSA9IExaT19CWVRFKGNjKTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19TRVQyKGRkLGNjKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIFwKKyAgICBsem9fbWVtb3BzX3NldF9UVTFwIGRfXzIgPSAobHpvX21lbW9wc19zZXRfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGRfXzJbMF0gPSBMWk9fQllURShjYyk7IGRfXzJbMV0gPSBMWk9fQllURShjYyk7IFwKKyAgICBMWk9fQkxPQ0tfRU5ECisjZGVmaW5lIExaT19NRU1PUFNfU0VUMyhkZCxjYykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19zZXRfVFUxcCBkX18zID0gKGx6b19tZW1vcHNfc2V0X1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBkX18zWzBdID0gTFpPX0JZVEUoY2MpOyBkX18zWzFdID0gTFpPX0JZVEUoY2MpOyBkX18zWzJdID0gTFpPX0JZVEUoY2MpOyBcCisgICAgTFpPX0JMT0NLX0VORAorI2RlZmluZSBMWk9fTUVNT1BTX1NFVDQoZGQsY2MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfc2V0X1RVMXAgZF9fNCA9IChsem9fbWVtb3BzX3NldF9UVTFwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpOyBcCisgICAgZF9fNFswXSA9IExaT19CWVRFKGNjKTsgZF9fNFsxXSA9IExaT19CWVRFKGNjKTsgZF9fNFsyXSA9IExaT19CWVRFKGNjKTsgZF9fNFszXSA9IExaT19CWVRFKGNjKTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFMShkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fMSA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzEgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX18xWzBdID0gc19fMVswXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFMihkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fMiA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzIgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX18yWzBdID0gc19fMlswXTsgZF9fMlsxXSA9IHNfXzJbMV07IFwKKyAgICBMWk9fQkxPQ0tfRU5ECisjZGVmaW5lIExaT19NRU1PUFNfTU9WRTMoZGQsc3MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfbW92ZV9UVTFwIGRfXzMgPSAobHpvX21lbW9wc19tb3ZlX1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBjb25zdCBsem9fbWVtb3BzX21vdmVfVFUxcCBzX18zID0gKGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpOyBcCisgICAgZF9fM1swXSA9IHNfXzNbMF07IGRfXzNbMV0gPSBzX18zWzFdOyBkX18zWzJdID0gc19fM1syXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFNChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fNCA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzQgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX180WzBdID0gc19fNFswXTsgZF9fNFsxXSA9IHNfXzRbMV07IGRfXzRbMl0gPSBzX180WzJdOyBkX180WzNdID0gc19fNFszXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFOChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fOCA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzggPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX184WzBdID0gc19fOFswXTsgZF9fOFsxXSA9IHNfXzhbMV07IGRfXzhbMl0gPSBzX184WzJdOyBkX184WzNdID0gc19fOFszXTsgXAorICAgIGRfXzhbNF0gPSBzX184WzRdOyBkX184WzVdID0gc19fOFs1XTsgZF9fOFs2XSA9IHNfXzhbNl07IGRfXzhbN10gPSBzX184WzddOyBcCisgICAgTFpPX0JMT0NLX0VORAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZigqKGx6b19tZW1vcHNfVFUxcCkwKT09MSkKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMShkZCxzcykgTFpPX01FTU9QU19NT1ZFMShkZCxzcykKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YoKihsem9fbWVtb3BzX1RVMnApMCk9PTIpCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTIoZGQsc3MpIFwKKyAgICAqIChsem9fbWVtb3BzX1RVMnApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAqIChjb25zdCBsem9fbWVtb3BzX1RVMnApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbGlmIGRlZmluZWQoX19sem9fbWVtb3BzX3RjaGVjaykKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMihkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBpZiAoX19sem9fbWVtb3BzX3RjaGVjayhsem9fbWVtb3BzX1RVMiwyLDEpKSB7IFwKKyAgICAgICAgKiAobHpvX21lbW9wc19UVTJwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKiAoY29uc3QgbHpvX21lbW9wc19UVTJwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpOyBcCisgICAgfSBlbHNlIHsgTFpPX01FTU9QU19NT1ZFMihkZCxzcyk7IH0gTFpPX0JMT0NLX0VORAorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMihkZCxzcykgTFpPX01FTU9QU19NT1ZFMihkZCxzcykKKyNlbmRpZgorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZigqKGx6b19tZW1vcHNfVFU0cCkwKT09NCkKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZNChkZCxzcykgXAorICAgICogKGx6b19tZW1vcHNfVFU0cCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKSA9ICogKGNvbnN0IGx6b19tZW1vcHNfVFU0cCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKQorI2VsaWYgZGVmaW5lZChfX2x6b19tZW1vcHNfdGNoZWNrKQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIGlmIChfX2x6b19tZW1vcHNfdGNoZWNrKGx6b19tZW1vcHNfVFU0LDQsMSkpIHsgXAorICAgICAgICAqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICB9IGVsc2UgeyBMWk9fTUVNT1BTX01PVkU0KGRkLHNzKTsgfSBMWk9fQkxPQ0tfRU5ECisjZWxzZQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKSBMWk9fTUVNT1BTX01PVkU0KGRkLHNzKQorI2VuZGlmCisjaWYgKExaT19XT1JEU0laRSAhPSA4KQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk4KGRkLHNzKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIExaT19NRU1PUFNfQ09QWTQoZGQsc3MpOyBMWk9fTUVNT1BTX0NPUFk0KChsem9fbWVtb3BzX1RVMXApKGx6b19tZW1vcHNfVFUwcCkoZGQpKzQsKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkoY29uc3QgbHpvX21lbW9wc19UVTBwKShzcykrNCk7IExaT19CTE9DS19FTkQKKyNlbHNlCisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKCoobHpvX21lbW9wc19UVThwKTApPT04KQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk4KGRkLHNzKSBcCisgICAgKiAobHpvX21lbW9wc19UVThwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKiAoY29uc3QgbHpvX21lbW9wc19UVThwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpCisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZOChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKTsgTFpPX01FTU9QU19DT1BZNCgobHpvX21lbW9wc19UVTFwKShsem9fbWVtb3BzX1RVMHApKGRkKSs0LChjb25zdCBsem9fbWVtb3BzX1RVMXApKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkoc3MpKzQpOyBMWk9fQkxPQ0tfRU5ECisjZWxpZiBkZWZpbmVkKF9fbHpvX21lbW9wc190Y2hlY2spCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTgoZGQsc3MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gaWYgKF9fbHpvX21lbW9wc190Y2hlY2sobHpvX21lbW9wc19UVTgsOCwxKSkgeyBcCisgICAgICAgICogKGx6b19tZW1vcHNfVFU4cCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKSA9ICogKGNvbnN0IGx6b19tZW1vcHNfVFU4cCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKTsgXAorICAgIH0gZWxzZSB7IExaT19NRU1PUFNfTU9WRTgoZGQsc3MpOyB9IExaT19CTE9DS19FTkQKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTgoZGQsc3MpIExaT19NRU1PUFNfTU9WRTgoZGQsc3MpCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFlOKGRkLHNzLG5uKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIFwKKyAgICBsem9fbWVtb3BzX1RVMXAgZF9fbiA9IChsem9fbWVtb3BzX1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBjb25zdCBsem9fbWVtb3BzX1RVMXAgc19fbiA9IChjb25zdCBsem9fbWVtb3BzX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBsem9fdWludCBuX19uID0gKG5uKTsgXAorICAgIHdoaWxlICgodm9pZCkwLCBuX19uID49IDgpIHsgTFpPX01FTU9QU19DT1BZOChkX19uLCBzX19uKTsgZF9fbiArPSA4OyBzX19uICs9IDg7IG5fX24gLT0gODsgfSBcCisgICAgaWYgKCh2b2lkKTAsIG5fX24gPj0gNCkgeyBMWk9fTUVNT1BTX0NPUFk0KGRfX24sIHNfX24pOyBkX19uICs9IDQ7IHNfX24gKz0gNDsgbl9fbiAtPSA0OyB9IFwKKyAgICBpZiAoKHZvaWQpMCwgbl9fbiA+IDApIGRvIHsgKmRfX24rKyA9ICpzX19uKys7IH0gd2hpbGUgKC0tbl9fbiA+IDApOyBcCisgICAgTFpPX0JMT0NLX0VORAorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQxNl90IGx6b19tZW1vcHNfZ2V0X2xlMTYoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MTZfdCB2OworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZMigmdiwgc3MpOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMTYgJiYgTFpPX0FSQ0hfUE9XRVJQQyAmJiBMWk9fQUJJX0JJR19FTkRJQU4pICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUycCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUycCkgc3M7CisgICAgdW5zaWduZWQgbG9uZyB2djsKKyAgICBfX2FzbV9fKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZ2KSA6ICJyIiAocyksICJtIiAoKnMpKTsKKyAgICB2ID0gKGx6b191aW50MTZfdCkgdnY7CisjZWxzZQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUxcCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkgc3M7CisgICAgdiA9IChsem9fdWludDE2X3QpICgoKGx6b191aW50MTZfdClzWzBdKSB8ICgobHpvX3VpbnQxNl90KXNbMV0gPDwgOCkpOworI2VuZGlmCisgICAgcmV0dXJuIHY7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMTYpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX0xFMTYoc3MpICAgICogKGNvbnN0IGx6b19tZW1vcHNfVFUycCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19HRVRfTEUxNihzcykgICAgbHpvX21lbW9wc19nZXRfbGUxNihzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQzMl90IGx6b19tZW1vcHNfZ2V0X2xlMzIoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MzJfdCB2OworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZNCgmdiwgc3MpOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMzIgJiYgTFpPX0FSQ0hfUE9XRVJQQyAmJiBMWk9fQUJJX0JJR19FTkRJQU4pICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFU0cCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFU0cCkgc3M7CisgICAgdW5zaWduZWQgbG9uZyB2djsKKyAgICBfX2FzbV9fKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHZ2KSA6ICJyIiAocyksICJtIiAoKnMpKTsKKyAgICB2ID0gKGx6b191aW50MzJfdCkgdnY7CisjZWxzZQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUxcCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkgc3M7CisgICAgdiA9IChsem9fdWludDMyX3QpICgoKGx6b191aW50MzJfdClzWzBdIDw8IDI0KSB8ICgobHpvX3VpbnQzMl90KXNbMV0gPDwgMTYpIHwgKChsem9fdWludDMyX3Qpc1syXSA8PCA4KSB8ICgobHpvX3VpbnQzMl90KXNbM10pKTsKKyNlbmRpZgorICAgIHJldHVybiB2OworfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9MRTMyKHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX0xFMzIoc3MpICAgIGx6b19tZW1vcHNfZ2V0X2xlMzIoc3MpCisjZW5kaWYKKworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9MRTY0KHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVOHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQxNl90IGx6b19tZW1vcHNfZ2V0X25lMTYoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MTZfdCB2OworICAgIExaT19NRU1PUFNfQ09QWTIoJnYsIHNzKTsKKyAgICByZXR1cm4gdjsKK30KKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKKyNkZWZpbmUgTFpPX01FTU9QU19HRVRfTkUxNihzcykgICAgKiAoY29uc3QgbHpvX21lbW9wc19UVTJwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpCisjZWxzZQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTE2KHNzKSAgICBsem9fbWVtb3BzX2dldF9uZTE2KHNzKQorI2VuZGlmCisKK19fbHpvX3N0YXRpY19mb3JjZWlubGluZSBsem9fdWludDMyX3QgbHpvX21lbW9wc19nZXRfbmUzMihjb25zdCBsem9fdm9pZHAgc3MpCit7CisgICAgbHpvX3VpbnQzMl90IHY7CisgICAgTFpPX01FTU9QU19DT1BZNCgmdiwgc3MpOworICAgIHJldHVybiB2OworfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTMyKHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX05FMzIoc3MpICAgIGx6b19tZW1vcHNfZ2V0X25lMzIoc3MpCisjZW5kaWYKKworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTY0KHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVOHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9sZTE2KGx6b192b2lkcCBkZCwgbHpvX3VpbnQxNl90IHZ2KQoreworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZMihkZCwgJnZ2KTsKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDE2ICYmIExaT19BUkNIX1BPV0VSUEMgJiYgTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBsem9fbWVtb3BzX1RVMnAgZCA9IChsem9fbWVtb3BzX1RVMnApIGRkOworICAgIHVuc2lnbmVkIGxvbmcgdiA9IHZ2OworICAgIF9fYXNtX18oInN0aGJyeCAlMiwwLCUxIiA6ICI9bSIgKCpkKSA6ICJyIiAoZCksICJyIiAodikpOworI2Vsc2UKKyAgICBsem9fbWVtb3BzX1RVMXAgZCA9IChsem9fbWVtb3BzX1RVMXApIGRkOworICAgIGRbMF0gPSBMWk9fQllURSgodnYgICAgICApICYgMHhmZik7CisgICAgZFsxXSA9IExaT19CWVRFKCh2diA+PiAgOCkgJiAweGZmKTsKKyNlbmRpZgorfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDE2KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX1BVVF9MRTE2KGRkLHZ2KSAoKiAobHpvX21lbW9wc19UVTJwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKHZ2KSkKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX0xFMTYoZGQsdnYpIGx6b19tZW1vcHNfcHV0X2xlMTYoZGQsdnYpCisjZW5kaWYKKworX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHZvaWQgbHpvX21lbW9wc19wdXRfbGUzMihsem9fdm9pZHAgZGQsIGx6b191aW50MzJfdCB2dikKK3sKKyNpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorICAgIExaT19NRU1PUFNfQ09QWTQoZGQsICZ2dik7CisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMiAmJiBMWk9fQVJDSF9QT1dFUlBDICYmIExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisgICAgbHpvX21lbW9wc19UVTRwIGQgPSAobHpvX21lbW9wc19UVTRwKSBkZDsKKyAgICB1bnNpZ25lZCBsb25nIHYgPSB2djsKKyAgICBfX2FzbV9fKCJzdHdicnggJTIsMCwlMSIgOiAiPW0iICgqZCkgOiAiciIgKGQpLCAiciIgKHYpKTsKKyNlbHNlCisgICAgbHpvX21lbW9wc19UVTFwIGQgPSAobHpvX21lbW9wc19UVTFwKSBkZDsKKyAgICBkWzBdID0gTFpPX0JZVEUoKHZ2ICAgICAgKSAmIDB4ZmYpOworICAgIGRbMV0gPSBMWk9fQllURSgodnYgPj4gIDgpICYgMHhmZik7CisgICAgZFsyXSA9IExaT19CWVRFKCh2diA+PiAxNikgJiAweGZmKTsKKyAgICBkWzNdID0gTFpPX0JZVEUoKHZ2ID4+IDI0KSAmIDB4ZmYpOworI2VuZGlmCit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMzIpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX0xFMzIoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTEUzMihkZCx2dikgbHpvX21lbW9wc19wdXRfbGUzMihkZCx2dikKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9uZTE2KGx6b192b2lkcCBkZCwgbHpvX3VpbnQxNl90IHZ2KQoreworICAgIExaT19NRU1PUFNfQ09QWTIoZGQsICZ2dik7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMTYpCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX05FMTYoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVMnApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTkUxNihkZCx2dikgbHpvX21lbW9wc19wdXRfbmUxNihkZCx2dikKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9uZTMyKGx6b192b2lkcCBkZCwgbHpvX3VpbnQzMl90IHZ2KQoreworICAgIExaT19NRU1PUFNfQ09QWTQoZGQsICZ2dik7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMzIpCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX05FMzIoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTkUzMihkZCx2dikgbHpvX21lbW9wc19wdXRfbmUzMihkZCx2dikKKyNlbmRpZgorCisjaWYgMSAmJiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSB8fCBMWk9fQ0NfUEdJKQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHZvaWQKKyNlbmRpZgorbHpvX21lbW9wc191bnVzZWRfZnVuY3Modm9pZCkKK3sKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19nZXRfbGUxNik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfZ2V0X2xlMzIpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX2dldF9uZTE2KTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19nZXRfbmUzMik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfcHV0X2xlMTYpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX3B1dF9sZTMyKTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19wdXRfbmUxNik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfcHV0X25lMzIpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX3VudXNlZF9mdW5jcyk7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFVBX1NFVDEKKyNkZWZpbmUgVUFfU0VUMSAgICAgICAgICAgICBMWk9fTUVNT1BTX1NFVDEKKyNlbmRpZgorI2lmbmRlZiBVQV9TRVQyCisjZGVmaW5lIFVBX1NFVDIgICAgICAgICAgICAgTFpPX01FTU9QU19TRVQyCisjZW5kaWYKKyNpZm5kZWYgVUFfU0VUMworI2RlZmluZSBVQV9TRVQzICAgICAgICAgICAgIExaT19NRU1PUFNfU0VUMworI2VuZGlmCisjaWZuZGVmIFVBX1NFVDQKKyNkZWZpbmUgVUFfU0VUNCAgICAgICAgICAgICBMWk9fTUVNT1BTX1NFVDQKKyNlbmRpZgorI2lmbmRlZiBVQV9NT1ZFMQorI2RlZmluZSBVQV9NT1ZFMSAgICAgICAgICAgIExaT19NRU1PUFNfTU9WRTEKKyNlbmRpZgorI2lmbmRlZiBVQV9NT1ZFMgorI2RlZmluZSBVQV9NT1ZFMiAgICAgICAgICAgIExaT19NRU1PUFNfTU9WRTIKKyNlbmRpZgorI2lmbmRlZiBVQV9NT1ZFMworI2RlZmluZSBVQV9NT1ZFMyAgICAgICAgICAgIExaT19NRU1PUFNfTU9WRTMKKyNlbmRpZgorI2lmbmRlZiBVQV9NT1ZFNAorI2RlZmluZSBVQV9NT1ZFNCAgICAgICAgICAgIExaT19NRU1PUFNfTU9WRTQKKyNlbmRpZgorI2lmbmRlZiBVQV9NT1ZFOAorI2RlZmluZSBVQV9NT1ZFOCAgICAgICAgICAgIExaT19NRU1PUFNfTU9WRTgKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZMQorI2RlZmluZSBVQV9DT1BZMSAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWTEKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZMgorI2RlZmluZSBVQV9DT1BZMiAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWTIKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZMworI2RlZmluZSBVQV9DT1BZMyAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWTMKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZNAorI2RlZmluZSBVQV9DT1BZNCAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWTQKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZOAorI2RlZmluZSBVQV9DT1BZOCAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWTgKKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZTgorI2RlZmluZSBVQV9DT1BZTiAgICAgICAgICAgIExaT19NRU1PUFNfQ09QWU4KKyNlbmRpZgorI2lmbmRlZiBVQV9DT1BZTl9YCisjZGVmaW5lIFVBX0NPUFlOX1ggICAgICAgICAgTFpPX01FTU9QU19DT1BZTgorI2VuZGlmCisjaWZuZGVmIFVBX0dFVF9MRTE2CisjZGVmaW5lIFVBX0dFVF9MRTE2ICAgICAgICAgTFpPX01FTU9QU19HRVRfTEUxNgorI2VuZGlmCisjaWZuZGVmIFVBX0dFVF9MRTMyCisjZGVmaW5lIFVBX0dFVF9MRTMyICAgICAgICAgTFpPX01FTU9QU19HRVRfTEUzMgorI2VuZGlmCisjaWZkZWYgTFpPX01FTU9QU19HRVRfTEU2NAorI2lmbmRlZiBVQV9HRVRfTEU2NAorI2RlZmluZSBVQV9HRVRfTEU2NCAgICAgICAgIExaT19NRU1PUFNfR0VUX0xFNjQKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFVBX0dFVF9ORTE2CisjZGVmaW5lIFVBX0dFVF9ORTE2ICAgICAgICAgTFpPX01FTU9QU19HRVRfTkUxNgorI2VuZGlmCisjaWZuZGVmIFVBX0dFVF9ORTMyCisjZGVmaW5lIFVBX0dFVF9ORTMyICAgICAgICAgTFpPX01FTU9QU19HRVRfTkUzMgorI2VuZGlmCisjaWZkZWYgTFpPX01FTU9QU19HRVRfTkU2NAorI2lmbmRlZiBVQV9HRVRfTkU2NAorI2RlZmluZSBVQV9HRVRfTkU2NCAgICAgICAgIExaT19NRU1PUFNfR0VUX05FNjQKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFVBX1BVVF9MRTE2CisjZGVmaW5lIFVBX1BVVF9MRTE2ICAgICAgICAgTFpPX01FTU9QU19QVVRfTEUxNgorI2VuZGlmCisjaWZuZGVmIFVBX1BVVF9MRTMyCisjZGVmaW5lIFVBX1BVVF9MRTMyICAgICAgICAgTFpPX01FTU9QU19QVVRfTEUzMgorI2VuZGlmCisjaWZuZGVmIFVBX1BVVF9ORTE2CisjZGVmaW5lIFVBX1BVVF9ORTE2ICAgICAgICAgTFpPX01FTU9QU19QVVRfTkUxNgorI2VuZGlmCisjaWZuZGVmIFVBX1BVVF9ORTMyCisjZGVmaW5lIFVBX1BVVF9ORTMyICAgICAgICAgTFpPX01FTU9QU19QVVRfTkUzMgogI2VuZGlmCiAKICNkZWZpbmUgTUVNQ1BZOF9EUyhkZXN0LHNyYyxsZW4pIFwKQEAgLTIxNTgsMjUgKzM3ODIsMTAgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChsem9fdWludHB0cl90KQotIyAgaWYgKF9fTFpPX01NT0RFTF9IVUdFKQotIyAgICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgIHVuc2lnbmVkIGxvbmcKLSMgIGVsc2UKLSMgICAgZGVmaW5lIGx6b191aW50cHRyX3QgICBhY2NfdWludHB0cl90Ci0jICAgIGlmZGVmIF9fQUNDX0lOVFBUUl9UX0lTX1BPSU5URVIKLSMgICAgICBkZWZpbmUgX19MWk9fVUlOVFBUUl9UX0lTX1BPSU5URVIgMQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCiAjaWYgKExaT19BUkNIX0kwODYpCi0jZGVmaW5lIFBUUihhKSAgICAgICAgICAgICAgKChsem9fYnl0ZXApIChhKSkKLSNkZWZpbmUgUFRSX0FMSUdORURfNChhKSAgICAoKEFDQ19QVFJfRlBfT0ZGKGEpICYgMykgPT0gMCkKLSNkZWZpbmUgUFRSX0FMSUdORUQyXzQoYSxiKSAoKChBQ0NfUFRSX0ZQX09GRihhKSB8IEFDQ19QVFJfRlBfT0ZGKGIpKSAmIDMpID09IDApCisjZXJyb3IgIkxaT19BUkNIX0kwODYgaXMgdW5zdXBwb3J0ZWQiCiAjZWxpZiAoTFpPX01NX1BWUCkKLSNkZWZpbmUgUFRSKGEpICAgICAgICAgICAgICAoKGx6b19ieXRlcCkgKGEpKQotI2RlZmluZSBQVFJfQUxJR05FRF84KGEpICAgICgoKChsem9fdWludHB0cl90KShhKSkgPj4gNjEpID09IDApCi0jZGVmaW5lIFBUUl9BTElHTkVEMl84KGEsYikgKCgoKGx6b191aW50cHRyX3QpKGEpfChsem9fdWludHB0cl90KShiKSkgPj4gNjEpID09IDApCisjZXJyb3IgIkxaT19NTV9QVlAgaXMgdW5zdXBwb3J0ZWQiCiAjZWxzZQogI2RlZmluZSBQVFIoYSkgICAgICAgICAgICAgICgobHpvX3VpbnRwdHJfdCkgKGEpKQogI2RlZmluZSBQVFJfTElORUFSKGEpICAgICAgIFBUUihhKQpAQCAtMjIwNiwyMCArMzgxNSwyOCBAQAogICAgIHVuc2lnbmVkIGxvbmcgICBhX3Vsb25nOwogICAgIGx6b19pbnQgICAgICAgICBhX2x6b19pbnQ7CiAgICAgbHpvX3VpbnQgICAgICAgIGFfbHpvX3VpbnQ7Ci0gICAgbHpvX2ludDMyICAgICAgIGFfbHpvX2ludDMyOwotICAgIGx6b191aW50MzIgICAgICBhX2x6b191aW50MzI7CisgICAgbHpvX3hpbnQgICAgICAgIGFfbHpvX3hpbnQ7CisgICAgbHpvX2ludDE2X3QgICAgIGFfbHpvX2ludDE2X3Q7CisgICAgbHpvX3VpbnQxNl90ICAgIGFfbHpvX3VpbnQxNl90OworICAgIGx6b19pbnQzMl90ICAgICBhX2x6b19pbnQzMl90OworICAgIGx6b191aW50MzJfdCAgICBhX2x6b191aW50MzJfdDsKKyNpZiBkZWZpbmVkKGx6b191aW50NjRfdCkKKyAgICBsem9faW50NjRfdCAgICAgYV9sem9faW50NjRfdDsKKyAgICBsem9fdWludDY0X3QgICAgYV9sem9fdWludDY0X3Q7CisjZW5kaWYKKyAgICBzaXplX3QgICAgICAgICAgYV9zaXplX3Q7CiAgICAgcHRyZGlmZl90ICAgICAgIGFfcHRyZGlmZl90OwogICAgIGx6b191aW50cHRyX3QgICBhX2x6b191aW50cHRyX3Q7Ci0gICAgbHpvX3ZvaWRwICAgICAgIGFfbHpvX3ZvaWRwOwogICAgIHZvaWQgKiAgICAgICAgICBhX3ZvaWRfcDsKLSAgICBsem9fYnl0ZXAgICAgICAgYV9sem9fYnl0ZXA7Ci0gICAgbHpvX2J5dGVwcCAgICAgIGFfbHpvX2J5dGVwcDsKLSAgICBsem9fdWludHAgICAgICAgYV9sem9fdWludHA7Ci0gICAgbHpvX3VpbnQgKiAgICAgIGFfbHpvX3VpbnRfcDsKLSAgICBsem9fdWludDMycCAgICAgYV9sem9fdWludDMycDsKLSAgICBsem9fdWludDMyICogICAgYV9sem9fdWludDMyX3A7Ci0gICAgdW5zaWduZWQgY2hhciAqIGFfdWNoYXJfcDsKICAgICBjaGFyICogICAgICAgICAgYV9jaGFyX3A7CisgICAgdW5zaWduZWQgY2hhciAqIGFfdWNoYXJfcDsKKyAgICBjb25zdCB2b2lkICogICAgICAgICAgYV9jX3ZvaWRfcDsKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgYV9jX2NoYXJfcDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogYV9jX3VjaGFyX3A7CisgICAgbHpvX3ZvaWRwICAgICAgIGFfbHpvX3ZvaWRwOworICAgIGx6b19ieXRlcCAgICAgICBhX2x6b19ieXRlcDsKKyAgICBjb25zdCBsem9fdm9pZHAgYV9jX2x6b192b2lkcDsKKyAgICBjb25zdCBsem9fYnl0ZXAgYV9jX2x6b19ieXRlcDsKIH0KIGx6b19mdWxsX2FsaWduX3Q7CiAKQEAgLTIyMjksMTkgKzM4NDYsMjAgQEAKIAogI2VuZGlmCiAKKyNpZm5kZWYgTFpPX0RFVEVSTUlOSVNUSUMKICNkZWZpbmUgTFpPX0RFVEVSTUlOSVNUSUMgMQorI2VuZGlmCiAKKyNpZm5kZWYgTFpPX0RJQ1RfVVNFX1BUUgogI2RlZmluZSBMWk9fRElDVF9VU0VfUFRSIDEKLSNpZiAwICYmIChMWk9fQVJDSF9JMDg2KQotIyAgdW5kZWYgTFpPX0RJQ1RfVVNFX1BUUgogI2VuZGlmCiAKICNpZiAoTFpPX0RJQ1RfVVNFX1BUUikKICMgIGRlZmluZSBsem9fZGljdF90ICAgIGNvbnN0IGx6b19ieXRlcAotIyAgZGVmaW5lIGx6b19kaWN0X3AgICAgbHpvX2RpY3RfdCBfX0xaT19NTU9ERUwgKgorIyAgZGVmaW5lIGx6b19kaWN0X3AgICAgbHpvX2RpY3RfdCAqCiAjZWxzZQogIyAgZGVmaW5lIGx6b19kaWN0X3QgICAgbHpvX3VpbnQKLSMgIGRlZmluZSBsem9fZGljdF9wICAgIGx6b19kaWN0X3QgX19MWk9fTU1PREVMICoKKyMgIGRlZmluZSBsem9fZGljdF9wICAgIGx6b19kaWN0X3QgKgogI2VuZGlmCiAKICNlbmRpZgpAQCAtMjI1NCwxMCArMzg3Miw5IEBACiAgICAgbHpvX3VpbnRwdHJfdCBwOwogCiAjaWYgKExaT19BUkNIX0kwODYpCi0gICAgcCA9ICgoKGx6b191aW50cHRyX3QpKEFDQ19QVFJfRlBfU0VHKHB0cikpKSA8PCAoMTYgLSBBQ0NfTU1fQUhTSElGVCkpICsgKEFDQ19QVFJfRlBfT0ZGKHB0cikpOworI2Vycm9yICJMWk9fQVJDSF9JMDg2IGlzIHVuc3VwcG9ydGVkIgogI2VsaWYgKExaT19NTV9QVlApCi0gICAgcCA9IChsem9fdWludHB0cl90KSAocHRyKTsKLSAgICBwID0gKHAgPDwgMykgfCAocCA+PiA2MSk7CisjZXJyb3IgIkxaT19NTV9QVlAgaXMgdW5zdXBwb3J0ZWQiCiAjZWxzZQogICAgIHAgPSAobHpvX3VpbnRwdHJfdCkgUFRSX0xJTkVBUihwdHIpOwogI2VuZGlmCkBAIC0yMjY4LDkgKzM4ODUsOCBAQAogTFpPX1BVQkxJQyh1bnNpZ25lZCkKIF9fbHpvX2FsaWduX2dhcChjb25zdCBsem9fdm9pZHAgcHRyLCBsem9fdWludCBzaXplKQogewotI2lmIGRlZmluZWQoX19MWk9fVUlOVFBUUl9UX0lTX1BPSU5URVIpCi0gICAgc2l6ZV90IG4gPSAoc2l6ZV90KSBwdHI7Ci0gICAgbiA9ICgoKG4gKyBzaXplIC0gMSkgLyBzaXplKSAqIHNpemUpIC0gbjsKKyNpZiAoX19MWk9fVUlOVFBUUl9UX0lTX1BPSU5URVIpCisjZXJyb3IgIl9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSIGlzIHVuc3VwcG9ydGVkIgogI2Vsc2UKICAgICBsem9fdWludHB0cl90IHAsIG47CiAgICAgcCA9IF9fbHpvX3B0cl9saW5lYXIocHRyKTsKQEAgLTIyOTYsNyArMzkxMiw3IEBACiAjZWxzZQogICAgICJcclxuXG4iCiAgICAgIkxaTyBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuXG4iCi0gICAgIiRDb3B5cmlnaHQ6IExaTyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyXG4iCisgICAgIiRDb3B5cmlnaHQ6IExaTyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyXG4iCiAgICAgIjxtYXJrdXNAb2Jlcmh1bWVyLmNvbT5cbiIKICAgICAiaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tICRcblxuIgogICAgICIkSWQ6IExaTyB2ZXJzaW9uOiB2IiBMWk9fVkVSU0lPTl9TVFJJTkcgIiwgIiBMWk9fVkVSU0lPTl9EQVRFICIgJFxuIgpAQCAtMjMwNiwxMSArMzkyMiw3IEBACiBMWk9fUFVCTElDKGNvbnN0IGx6b19ieXRlcCkKIGx6b19jb3B5cmlnaHQodm9pZCkKIHsKLSNpZiAoTFpPX09TX0RPUzE2ICYmIExaT19DQ19UVVJCT0MpCi0gICAgcmV0dXJuIChsem9fdm9pZHApIF9fbHpvX2NvcHlyaWdodDsKLSNlbHNlCiAgICAgcmV0dXJuIChjb25zdCBsem9fYnl0ZXApIF9fbHpvX2NvcHlyaWdodDsKLSNlbmRpZgogfQogCiBMWk9fUFVCTElDKHVuc2lnbmVkKQpAQCAtMjM1MiwxMSArMzk2NCwxMSBAQAogI2RlZmluZSBMWk9fRE84KGJ1ZixpKSAgTFpPX0RPNChidWYsaSk7IExaT19ETzQoYnVmLGkrNCk7CiAjZGVmaW5lIExaT19ETzE2KGJ1ZixpKSBMWk9fRE84KGJ1ZixpKTsgTFpPX0RPOChidWYsaSs4KTsKIAotTFpPX1BVQkxJQyhsem9fdWludDMyKQotbHpvX2FkbGVyMzIobHpvX3VpbnQzMiBhZGxlciwgY29uc3QgbHpvX2J5dGVwIGJ1ZiwgbHpvX3VpbnQgbGVuKQorTFpPX1BVQkxJQyhsem9fdWludDMyX3QpCitsem9fYWRsZXIzMihsem9fdWludDMyX3QgYWRsZXIsIGNvbnN0IGx6b19ieXRlcCBidWYsIGx6b191aW50IGxlbikKIHsKLSAgICBsem9fdWludDMyIHMxID0gYWRsZXIgJiAweGZmZmY7Ci0gICAgbHpvX3VpbnQzMiBzMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7CisgICAgbHpvX3VpbnQzMl90IHMxID0gYWRsZXIgJiAweGZmZmY7CisgICAgbHpvX3VpbnQzMl90IHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKICAgICB1bnNpZ25lZCBrOwogCiAgICAgaWYgKGJ1ZiA9PSBOVUxMKQpAQCAtMjQxMyw4ICs0MDI1LDggQEAKIExaT0xJQl9QVUJMSUMoaW50LCBsem9faG1lbWNtcCkgKGNvbnN0IGx6b19odm9pZF9wIHMxLCBjb25zdCBsem9faHZvaWRfcCBzMiwgbHpvX2hzaXplX3QgbGVuKQogewogI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikgfHwgIShIQVZFX01FTUNNUCkKLSAgICBjb25zdCBsem9faGJ5dGVfcCBwMSA9IChjb25zdCBsem9faGJ5dGVfcCkgczE7Ci0gICAgY29uc3QgbHpvX2hieXRlX3AgcDIgPSAoY29uc3QgbHpvX2hieXRlX3ApIHMyOworICAgIGNvbnN0IGx6b19oYnl0ZV9wIHAxID0gTFpPX1NUQVRJQ19DQVNUKGNvbnN0IGx6b19oYnl0ZV9wLCBzMSk7CisgICAgY29uc3QgbHpvX2hieXRlX3AgcDIgPSBMWk9fU1RBVElDX0NBU1QoY29uc3QgbHpvX2hieXRlX3AsIHMyKTsKICAgICBpZiBfX2x6b19saWtlbHkobGVuID4gMCkgZG8KICAgICB7CiAgICAgICAgIGludCBkID0gKnAxIC0gKnAyOwpAQCAtMjQzMCw4ICs0MDQyLDggQEAKIExaT0xJQl9QVUJMSUMobHpvX2h2b2lkX3AsIGx6b19obWVtY3B5KSAobHpvX2h2b2lkX3AgZGVzdCwgY29uc3QgbHpvX2h2b2lkX3Agc3JjLCBsem9faHNpemVfdCBsZW4pCiB7CiAjaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKSB8fCAhKEhBVkVfTUVNQ1BZKQotICAgIGx6b19oYnl0ZV9wIHAxID0gKGx6b19oYnl0ZV9wKSBkZXN0OwotICAgIGNvbnN0IGx6b19oYnl0ZV9wIHAyID0gKGNvbnN0IGx6b19oYnl0ZV9wKSBzcmM7CisgICAgbHpvX2hieXRlX3AgcDEgPSBMWk9fU1RBVElDX0NBU1QobHpvX2hieXRlX3AsIGRlc3QpOworICAgIGNvbnN0IGx6b19oYnl0ZV9wIHAyID0gTFpPX1NUQVRJQ19DQVNUKGNvbnN0IGx6b19oYnl0ZV9wLCBzcmMpOwogICAgIGlmICghKGxlbiA+IDApIHx8IHAxID09IHAyKQogICAgICAgICByZXR1cm4gZGVzdDsKICAgICBkbwpAQCAtMjQ0NSw4ICs0MDU3LDggQEAKIExaT0xJQl9QVUJMSUMobHpvX2h2b2lkX3AsIGx6b19obWVtbW92ZSkgKGx6b19odm9pZF9wIGRlc3QsIGNvbnN0IGx6b19odm9pZF9wIHNyYywgbHpvX2hzaXplX3QgbGVuKQogewogI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikgfHwgIShIQVZFX01FTU1PVkUpCi0gICAgbHpvX2hieXRlX3AgcDEgPSAobHpvX2hieXRlX3ApIGRlc3Q7Ci0gICAgY29uc3QgbHpvX2hieXRlX3AgcDIgPSAoY29uc3QgbHpvX2hieXRlX3ApIHNyYzsKKyAgICBsem9faGJ5dGVfcCBwMSA9IExaT19TVEFUSUNfQ0FTVChsem9faGJ5dGVfcCwgZGVzdCk7CisgICAgY29uc3QgbHpvX2hieXRlX3AgcDIgPSBMWk9fU1RBVElDX0NBU1QoY29uc3QgbHpvX2hieXRlX3AsIHNyYyk7CiAgICAgaWYgKCEobGVuID4gMCkgfHwgcDEgPT0gcDIpCiAgICAgICAgIHJldHVybiBkZXN0OwogICAgIGlmIChwMSA8IHAyKQpAQCAtMjQ2OCwxNiArNDA4MCwxNyBAQAogICAgIHJldHVybiBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKTsKICNlbmRpZgogfQotTFpPTElCX1BVQkxJQyhsem9faHZvaWRfcCwgbHpvX2htZW1zZXQpIChsem9faHZvaWRfcCBzLCBpbnQgYywgbHpvX2hzaXplX3QgbGVuKQorTFpPTElCX1BVQkxJQyhsem9faHZvaWRfcCwgbHpvX2htZW1zZXQpIChsem9faHZvaWRfcCBzLCBpbnQgY2MsIGx6b19oc2l6ZV90IGxlbikKIHsKICNpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpIHx8ICEoSEFWRV9NRU1TRVQpCi0gICAgbHpvX2hieXRlX3AgcCA9IChsem9faGJ5dGVfcCkgczsKKyAgICBsem9faGJ5dGVfcCBwID0gTFpPX1NUQVRJQ19DQVNUKGx6b19oYnl0ZV9wLCBzKTsKKyAgICB1bnNpZ25lZCBjaGFyIGMgPSBMWk9fSVRSVU5DKHVuc2lnbmVkIGNoYXIsIGNjKTsKICAgICBpZiBfX2x6b19saWtlbHkobGVuID4gMCkgZG8KLSAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSBjOworICAgICAgICAqcCsrID0gYzsKICAgICB3aGlsZSBfX2x6b19saWtlbHkoLS1sZW4gPiAwKTsKICAgICByZXR1cm4gczsKICNlbHNlCi0gICAgcmV0dXJuIG1lbXNldChzLCBjLCBsZW4pOworICAgIHJldHVybiBtZW1zZXQocywgY2MsIGxlbik7CiAjZW5kaWYKIH0KICN1bmRlZiBMWk9MSUJfUFVCTElDCkBAIC0yNDg2LDI5ICs0MDk5LDI4IEBACiAKICNpZiAhZGVmaW5lZChfX0xaT19JTl9NSU5JTFpPKQogCi0jZGVmaW5lIEFDQ19XQU5UX0FDQ19DSEtfQ0ggMQotI3VuZGVmIEFDQ0NIS19BU1NFUlQKKyNkZWZpbmUgTFpPX1dBTlRfQUNDX0NIS19DSCAxCisjdW5kZWYgTFpPQ0hLX0FTU0VSVAogCi0gICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50KQotICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludCkKLQotICAgIEFDQ0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX2ludDMyKQotICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDMyKQotICAgIEFDQ0NIS19BU1NFUlQoKExaT19VSU5UMzJfQygxKSA8PCAoaW50KSg4KnNpemVvZihMWk9fVUlOVDMyX0MoMSkpLTEpKSA+IDApCi0gICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobHpvX3VpbnQzMikgPj0gNCkKLQotI2lmICFkZWZpbmVkKF9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSKQotICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludHB0cl90KQorICAgIExaT0NIS19BU1NFUlQoKExaT19VSU5UMzJfQygxKSA8PCAoaW50KSg4KnNpemVvZihMWk9fVUlOVDMyX0MoMSkpLTEpKSA+IDApCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50KQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludCkKKyNpZiAhKF9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludHB0cl90KQogI2VuZGlmCi0gICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobHpvX3VpbnRwdHJfdCkgPj0gc2l6ZW9mKGx6b192b2lkcCkpCi0KLSAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QobHpvX3hpbnQpCi0gICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobHpvX3hpbnQpID49IHNpemVvZihsem9fdWludDMyKSkKLSAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihsem9feGludCkgPj0gc2l6ZW9mKGx6b191aW50KSkKLSAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihsem9feGludCkgPT0gc2l6ZW9mKGx6b191aW50MzIpIHx8IHNpemVvZihsem9feGludCkgPT0gc2l6ZW9mKGx6b191aW50KSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludHB0cl90KSA+PSBzaXplb2YobHpvX3ZvaWRwKSkKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QobHpvX3hpbnQpCiAKICNlbmRpZgotI3VuZGVmIEFDQ0NIS19BU1NFUlQKKyN1bmRlZiBMWk9DSEtfQVNTRVJUCisKK3VuaW9uIGx6b19jb25maWdfY2hlY2tfdW5pb24geworICAgIGx6b191aW50IGFbMl07CisgICAgdW5zaWduZWQgY2hhciBiWzIqTFpPX01BWCg4LHNpemVvZihsem9fdWludCkpXTsKKyNpZiBkZWZpbmVkKGx6b191aW50NjRfdCkKKyAgICBsem9fdWludDY0X3QgY1syXTsKKyNlbmRpZgorfTsKIAogI2lmIDAKICNkZWZpbmUgdTJwKHB0cixvZmYpICgobHpvX3ZvaWRwKSAoKChsem9fYnl0ZXApKGx6b192b2lkcCkocHRyKSkgKyAob2ZmKSkpCkBAIC0yNTIyLDQwICs0MTM0LDg1IEBACiBMWk9fUFVCTElDKGludCkKIF9sem9fY29uZmlnX2NoZWNrKHZvaWQpCiB7Ci0gICAgbHpvX2Jvb2wgciA9IDE7Ci0gICAgdW5pb24gewotICAgICAgICBsem9feGludCBhWzJdOyB1bnNpZ25lZCBjaGFyIGJbMipzaXplb2YobHpvX3hpbnQpXTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgeFsyXTsgbHpvX3VpbnQzMiB5WzJdOyBsem9fdWludCB6WzJdOwotICAgIH0gdTsKKyNpZiAoTFpPX0NDX0NMQU5HICYmIChMWk9fQ0NfQ0xBTkcgPj0gMHgwMzAxMDB1bCAmJiBMWk9fQ0NfQ0xBTkcgPCAweDAzMDMwMHVsKSkKKyMgaWYgMAorICAgIHZvbGF0aWxlCisjIGVuZGlmCisjZW5kaWYKKyAgICB1bmlvbiBsem9fY29uZmlnX2NoZWNrX3VuaW9uIHU7CiAgICAgbHpvX3ZvaWRwIHA7CisgICAgdW5zaWduZWQgciA9IDE7CiAKICAgICB1LmFbMF0gPSB1LmFbMV0gPSAwOwogICAgIHAgPSB1MnAoJnUsIDApOwogICAgIHIgJj0gKCgqIChsem9fYnl0ZXApIHApID09IDApOwotI2lmICFkZWZpbmVkKExaT19DRkdfTk9fQ09ORklHX0NIRUNLKQotI2lmIGRlZmluZWQoTFpPX0FCSV9CSUdfRU5ESUFOKQorI2lmICEoTFpPX0NGR19OT19DT05GSUdfQ0hFQ0spCisjaWYgKExaT19BQklfQklHX0VORElBTikKICAgICB1LmFbMF0gPSB1LmFbMV0gPSAwOyB1LmJbc2l6ZW9mKGx6b191aW50KSAtIDFdID0gMTI4OwogICAgIHAgPSB1MnAoJnUsIDApOwogICAgIHIgJj0gKCgqIChsem9fdWludHApIHApID09IDEyOCk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKKyNpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQogICAgIHUuYVswXSA9IHUuYVsxXSA9IDA7IHUuYlswXSA9IDEyODsKICAgICBwID0gdTJwKCZ1LCAwKTsKICAgICByICY9ICgoKiAobHpvX3VpbnRwKSBwKSA9PSAxMjgpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpCiAgICAgdS5hWzBdID0gdS5hWzFdID0gMDsKLSAgICB1LmJbMF0gPSAxOyB1LmJbc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSArIDFdID0gMjsKKyAgICB1LmJbMF0gPSAxOyB1LmJbM10gPSAyOwogICAgIHAgPSB1MnAoJnUsIDEpOwotICAgIHIgJj0gKCgqIChsem9fdXNob3J0cCkgcCkgPT0gMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKyAgICByICY9IFVBX0dFVF9ORTE2KHApID09IDA7CisgICAgciAmPSBVQV9HRVRfTEUxNihwKSA9PSAwOworICAgIHUuYlsxXSA9IDEyODsKKyAgICByICY9IFVBX0dFVF9MRTE2KHApID09IDEyODsKICAgICB1LmFbMF0gPSB1LmFbMV0gPSAwOwotICAgIHUuYlswXSA9IDM7IHUuYltzaXplb2YobHpvX3VpbnQzMikgKyAxXSA9IDQ7CisgICAgdS5iWzBdID0gMzsgdS5iWzVdID0gNDsKICAgICBwID0gdTJwKCZ1LCAxKTsKLSAgICByICY9ICgoKiAobHpvX3VpbnQzMnApIHApID09IDApOworICAgIHIgJj0gVUFfR0VUX05FMzIocCkgPT0gMDsKKyAgICByICY9IFVBX0dFVF9MRTMyKHApID09IDA7CisgICAgdS5iWzFdID0gMTI4OworICAgIHIgJj0gVUFfR0VUX0xFMzIocCkgPT0gMTI4OworI2lmIGRlZmluZWQoVUFfR0VUX05FNjQpCisgICAgdS5jWzBdID0gdS5jWzFdID0gMDsKKyAgICB1LmJbMF0gPSA1OyB1LmJbOV0gPSA2OworICAgIHAgPSB1MnAoJnUsIDEpOworICAgIHUuY1swXSA9IHUuY1sxXSA9IDA7CisgICAgciAmPSBVQV9HRVRfTkU2NChwKSA9PSAwOworI2lmIGRlZmluZWQoVUFfR0VUX0xFNjQpCisgICAgciAmPSBVQV9HRVRfTEU2NChwKSA9PSAwOworICAgIHUuYlsxXSA9IDEyODsKKyAgICByICY9IFVBX0dFVF9MRTY0KHApID09IDEyODsKICNlbmRpZgogI2VuZGlmCisjaWYgZGVmaW5lZChsem9fYml0b3BzX2N0bHozMikKKyAgICB7IHVuc2lnbmVkIGkgPSAwOyBsem9fdWludDMyX3QgdjsKKyAgICBmb3IgKHYgPSAxOyB2ICE9IDAgJiYgciA9PSAxOyB2IDw8PSAxLCBpKyspIHsKKyAgICAgICAgciAmPSBsem9fYml0b3BzX2N0bHozMih2KSA9PSAzMSAtIGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdGx6MzJfZnVuYyh2KSA9PSAzMSAtIGk7CisgICAgfX0KKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2JpdG9wc19jdGx6NjQpCisgICAgeyB1bnNpZ25lZCBpID0gMDsgbHpvX3VpbnQ2NF90IHY7CisgICAgZm9yICh2ID0gMTsgdiAhPSAwICYmIHIgPT0gMTsgdiA8PD0gMSwgaSsrKSB7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdGx6NjQodikgPT0gNjMgLSBpOworICAgICAgICByICY9IGx6b19iaXRvcHNfY3RsejY0X2Z1bmModikgPT0gNjMgLSBpOworICAgIH19CisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19iaXRvcHNfY3R0ejMyKQorICAgIHsgdW5zaWduZWQgaSA9IDA7IGx6b191aW50MzJfdCB2OworICAgIGZvciAodiA9IDE7IHYgIT0gMCAmJiByID09IDE7IHYgPDw9IDEsIGkrKykgeworICAgICAgICByICY9IGx6b19iaXRvcHNfY3R0ejMyKHYpID09IGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdHR6MzJfZnVuYyh2KSA9PSBpOworICAgIH19CisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19iaXRvcHNfY3R0ejY0KQorICAgIHsgdW5zaWduZWQgaSA9IDA7IGx6b191aW50NjRfdCB2OworICAgIGZvciAodiA9IDE7IHYgIT0gMCAmJiByID09IDE7IHYgPDw9IDEsIGkrKykgeworICAgICAgICByICY9IGx6b19iaXRvcHNfY3R0ejY0KHYpID09IGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdHR6NjRfZnVuYyh2KSA9PSBpOworICAgIH19CisjZW5kaWYKKyNlbmRpZgorICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX3VudXNlZF9mdW5jcyk7CiAKICAgICByZXR1cm4gciA9PSAxID8gTFpPX0VfT0sgOiBMWk9fRV9FUlJPUjsKIH0KQEAgLTI1NjksMTEgKzQyMjYsMTEgQEAKICNpZiBkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pCiAjZWxpZiAoTFpPX0NDX01TQyAmJiAoKF9NU0NfVkVSKSA8IDcwMCkpCiAjZWxzZQotI2RlZmluZSBBQ0NfV0FOVF9BQ0NfQ0hLX0NIIDEKLSN1bmRlZiBBQ0NDSEtfQVNTRVJUCi0jZGVmaW5lIEFDQ0NIS19BU1NFUlQoZXhwcikgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGV4cHIpCisjZGVmaW5lIExaT19XQU5UX0FDQ19DSEtfQ0ggMQorI3VuZGVmIExaT0NIS19BU1NFUlQKKyNkZWZpbmUgTFpPQ0hLX0FTU0VSVChleHByKSAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZXhwcikKICNlbmRpZgotI3VuZGVmIEFDQ0NIS19BU1NFUlQKKyN1bmRlZiBMWk9DSEtfQVNTRVJUCiAKICAgICBpZiAodiA9PSAwKQogICAgICAgICByZXR1cm4gTFpPX0VfRVJST1I7CkBAIC0yNTgxLDcgKzQyMzgsNyBAQAogICAgIHIgPSAoczEgPT0gLTEgfHwgczEgPT0gKGludCkgc2l6ZW9mKHNob3J0KSkgJiYKICAgICAgICAgKHMyID09IC0xIHx8IHMyID09IChpbnQpIHNpemVvZihpbnQpKSAmJgogICAgICAgICAoczMgPT0gLTEgfHwgczMgPT0gKGludCkgc2l6ZW9mKGxvbmcpKSAmJgotICAgICAgICAoczQgPT0gLTEgfHwgczQgPT0gKGludCkgc2l6ZW9mKGx6b191aW50MzIpKSAmJgorICAgICAgICAoczQgPT0gLTEgfHwgczQgPT0gKGludCkgc2l6ZW9mKGx6b191aW50MzJfdCkpICYmCiAgICAgICAgIChzNSA9PSAtMSB8fCBzNSA9PSAoaW50KSBzaXplb2YobHpvX3VpbnQpKSAmJgogICAgICAgICAoczYgPT0gLTEgfHwgczYgPT0gKGludCkgbHpvX3NpemVvZl9kaWN0X3QpICYmCiAgICAgICAgIChzNyA9PSAtMSB8fCBzNyA9PSAoaW50KSBzaXplb2YoY2hhciAqKSkgJiYKQEAgLTI2MjQsMTAgKzQyODEsMjQgQEAKIAogI2lmICFkZWZpbmVkKE1JTklMWk9fQ0ZHX1NLSVBfTFpPMVhfMV9DT01QUkVTUykKIAorI2lmIDEgJiYgZGVmaW5lZChVQV9HRVRfTEUzMikKKyN1bmRlZiAgTFpPX0RJQ1RfVVNFX1BUUgorI2RlZmluZSBMWk9fRElDVF9VU0VfUFRSIDAKKyN1bmRlZiAgbHpvX2RpY3RfdAorI2RlZmluZSBsem9fZGljdF90IGx6b191aW50MTZfdAorI2VuZGlmCisKICNkZWZpbmUgTFpPX05FRURfRElDVF9IIDEKKyNpZm5kZWYgRF9CSVRTCiAjZGVmaW5lIERfQklUUyAgICAgICAgICAxNAorI2VuZGlmCiAjZGVmaW5lIERfSU5ERVgxKGQscCkgICAgICAgZCA9IERNKERNVUwoMHgyMSxEWDMocCw1LDUsNikpID4+IDUpCiAjZGVmaW5lIERfSU5ERVgyKGQscCkgICAgICAgZCA9IChkICYgKERfTUFTSyAmIDB4N2ZmKSkgXiAoRF9ISUdIIHwgMHgxZikKKyNpZiAxCisjZGVmaW5lIERJTkRFWChkdixwKSAgICAgICAgRE0oKChETVVMKDB4MTgyNDQyOWQsZHYpKSA+PiAoMzItRF9CSVRTKSkpCisjZWxzZQorI2RlZmluZSBESU5ERVgoZHYscCkgICAgICAgIERNKChkdikgKyAoKGR2KSA+PiAoMzItRF9CSVRTKSkpCisjZW5kaWYKIAogI2lmbmRlZiBfX0xaT19DT05GSUcxWF9ICiAjZGVmaW5lIF9fTFpPX0NPTkZJRzFYX0ggMQpAQCAtMjg0NSwxMSArNDUxNiwxMSBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTFpPX0RJQ1RfVVNFX1BUUikKKyNpZiAoTFpPX0RJQ1RfVVNFX1BUUikKICMgIGRlZmluZSBERU5UUlkocCxpbikgICAgICAgICAgICAgICAgICAgICAgICAgIChwKQogIyAgZGVmaW5lIEdJTkRFWChtX3BvcyxtX29mZixkaWN0LGRpbmRleCxpbikgICAgbV9wb3MgPSBkaWN0W2RpbmRleF0KICNlbHNlCi0jICBkZWZpbmUgREVOVFJZKHAsaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAoKGx6b191aW50KSAoKHApLShpbikpKQorIyAgZGVmaW5lIERFTlRSWShwLGluKSAgICAgICAgICAgICAgICAgICAgICAgICAgKChsem9fZGljdF90KSBwZChwLCBpbikpCiAjICBkZWZpbmUgR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKSAgICBtX29mZiA9IGRpY3RbZGluZGV4XQogI2VuZGlmCiAKQEAgLTI4NzAsNyArNDU0MSw3IEBACiAKICNlbmRpZgogCi0jaWYgZGVmaW5lZChMWk9fRElDVF9VU0VfUFRSKQorI2lmIChMWk9fRElDVF9VU0VfUFRSKQogCiAjZGVmaW5lIExaT19DSEVDS19NUE9TX0RFVChtX3BvcyxtX29mZixpbixpcCxtYXhfb2Zmc2V0KSBcCiAgICAgICAgIChtX3BvcyA9PSBOVUxMIHx8IChtX29mZiA9IHBkKGlwLCBtX3BvcykpID4gbWF4X29mZnNldCkKQEAgLTI4OTYsNyArNDU2Nyw3IEBACiAKICNlbmRpZgogCi0jaWYgZGVmaW5lZChMWk9fREVURVJNSU5JU1RJQykKKyNpZiAoTFpPX0RFVEVSTUlOSVNUSUMpCiAjICBkZWZpbmUgTFpPX0NIRUNLX01QT1MgICAgTFpPX0NIRUNLX01QT1NfREVUCiAjZWxzZQogIyAgZGVmaW5lIExaT19DSEVDS19NUE9TICAgIExaT19DSEVDS19NUE9TX05PTl9ERVQKQEAgLTI5MTIsMjIgKzQ1ODMsMjUgQEAKIAogI2VuZGlmCiAKLSNkZWZpbmUgZG9fY29tcHJlc3MgICAgIF9sem8xeF8xX2RvX2NvbXByZXNzCisjZGVmaW5lIExaT19ERVRFUk1JTklTVElDICEoTFpPX0RJQ1RfVVNFX1BUUikKKworI2lmbmRlZiBET19DT01QUkVTUwogI2RlZmluZSBET19DT01QUkVTUyAgICAgbHpvMXhfMV9jb21wcmVzcworI2VuZGlmCiAKICNpZiAxICYmIGRlZmluZWQoRE9fQ09NUFJFU1MpICYmICFkZWZpbmVkKGRvX2NvbXByZXNzKQotIyAgZGVmaW5lIGRvX2NvbXByZXNzICAgICAgIExaT19DUFBfRUNPTkNBVDIoRE9fQ09NUFJFU1MsX2NvcmUpCisjICBkZWZpbmUgZG9fY29tcHJlc3MgICAgICAgTFpPX1BQX0VDT05DQVQyKERPX0NPTVBSRVNTLF9jb3JlKQogI2VuZGlmCiAKIHN0YXRpYyBfX2x6b19ub2lubGluZSBsem9fdWludAogZG9fY29tcHJlc3MgKCBjb25zdCBsem9fYnl0ZXAgaW4gLCBsem9fdWludCAgaW5fbGVuLAogICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgb3V0LCBsem9fdWludHAgb3V0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApCisgICAgICAgICAgICAgICAgICAgIGx6b191aW50ICB0aSwgIGx6b192b2lkcCB3cmttZW0pCiB7Ci0gICAgcmVnaXN0ZXIgY29uc3QgbHpvX2J5dGVwIGlwOworICAgIGNvbnN0IGx6b19ieXRlcCBpcDsKICAgICBsem9fYnl0ZXAgb3A7CiAgICAgY29uc3QgbHpvX2J5dGVwIGNvbnN0IGluX2VuZCA9IGluICsgaW5fbGVuOwotICAgIGNvbnN0IGx6b19ieXRlcCBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbiAtIE0yX01BWF9MRU4gLSA1OworICAgIGNvbnN0IGx6b19ieXRlcCBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbiAtIDIwOwogICAgIGNvbnN0IGx6b19ieXRlcCBpaTsKICAgICBsem9fZGljdF9wIGNvbnN0IGRpY3QgPSAobHpvX2RpY3RfcCkgd3JrbWVtOwogCkBAIC0yOTM1LDE0ICs0NjA5LDE3IEBACiAgICAgaXAgPSBpbjsKICAgICBpaSA9IGlwOwogCi0gICAgaXAgKz0gNDsKKyAgICBpcCArPSB0aSA8IDQgPyA0IC0gdGkgOiAwOwogICAgIGZvciAoOzspCiAgICAgewotICAgICAgICByZWdpc3RlciBjb25zdCBsem9fYnl0ZXAgbV9wb3M7CisgICAgICAgIGNvbnN0IGx6b19ieXRlcCBtX3BvczsKKyNpZiAhKExaT19ERVRFUk1JTklTVElDKQogICAgICAgICBMWk9fREVGSU5FX1VOSU5JVElBTElaRURfVkFSKGx6b191aW50LCBtX29mZiwgMCk7CiAgICAgICAgIGx6b191aW50IG1fbGVuOwogICAgICAgICBsem9fdWludCBkaW5kZXg7Ci0KK25leHQ6CisgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwID49IGlwX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBESU5ERVgxKGRpbmRleCxpcCk7CiAgICAgICAgIEdJTkRFWChtX3BvcyxtX29mZixkaWN0LGRpbmRleCxpbik7CiAgICAgICAgIGlmIChMWk9fQ0hFQ0tfTVBPU19OT05fREVUKG1fcG9zLG1fb2ZmLGluLGlwLE00X01BWF9PRkZTRVQpKQpAQCAtMjk2MCwyMDAgKzQ2MzcsMjQ3IEBACiAgICAgICAgIGdvdG8gbGl0ZXJhbDsKIAogdHJ5X21hdGNoOgotI2lmIDEgJiYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpCi0gICAgICAgIGlmICgqIChjb25zdCBsem9fdXNob3J0cCkgKGNvbnN0IGx6b192b2lkcCkgbV9wb3MgIT0gKiAoY29uc3QgbHpvX3VzaG9ydHApIChjb25zdCBsem9fdm9pZHApIGlwKQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICBpZiAoVUFfR0VUX05FMzIobV9wb3MpICE9IFVBX0dFVF9ORTMyKGlwKSkKICNlbHNlCi0gICAgICAgIGlmIChtX3Bvc1swXSAhPSBpcFswXSB8fCBtX3Bvc1sxXSAhPSBpcFsxXSkKKyAgICAgICAgaWYgKG1fcG9zWzBdICE9IGlwWzBdIHx8IG1fcG9zWzFdICE9IGlwWzFdIHx8IG1fcG9zWzJdICE9IGlwWzJdIHx8IG1fcG9zWzNdICE9IGlwWzNdKQogI2VuZGlmCiAgICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIF9fbHpvX2xpa2VseShtX3Bvc1syXSA9PSBpcFsyXSkKLSAgICAgICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgICAgICAgaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gbWF0Y2g7Ci0gICAgICAgICAgICAgICAgaWYgKGxpdCA8PSAzKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG1hdGNoOwotICAgICAgICAgICAgICAgIGlmIChsaXQgPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChvcCAtIDIgPiBvdXQpOyBvcFstMl0gfD0gTFpPX0JZVEUoMyk7Ci0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gKmlpKys7ICpvcCsrID0gKmlpKys7ICpvcCsrID0gKmlpKys7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gY29kZV9tYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fcG9zWzNdID09IGlwWzNdKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gbWF0Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0jaWYgMAotI2lmIDAKLSAgICAgICAgICAgICAgICBpZiAobV9vZmYgPD0gTTFfTUFYX09GRlNFVCAmJiBsaXQgPiAwICYmIGxpdCA8PSAzKQotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAobV9vZmYgPD0gTTFfTUFYX09GRlNFVCAmJiBsaXQgPT0gMykKLSNlbmRpZgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbHpvX3VpbnQgdDsKLQotICAgICAgICAgICAgICAgICAgICB0ID0gbGl0OwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQob3AgLSAyID4gb3V0KTsgb3BbLTJdIHw9IExaT19CWVRFKHQpOwotICAgICAgICAgICAgICAgICAgICBkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChpaSA9PSBpcCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fb2ZmIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTFfTUFSS0VSIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKLSAgICAgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgaXAgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgZ290byBtYXRjaF9kb25lOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KIGxpdGVyYWw6CisgICAgICAgICAgICBVUERBVEVfSShkaWN0LDAsZGluZGV4LGlwLGluKTsKKyAgICAgICAgICAgIGlwICs9IDEgKyAoKGlwIC0gaWkpID4+IDUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgVVBEQVRFX0koZGljdCwwLGRpbmRleCxpcCxpbik7Ci0gICAgICAgICsraXA7CisjZWxzZQorICAgICAgICBsem9fdWludCBtX29mZjsKKyAgICAgICAgbHpvX3VpbnQgbV9sZW47CisgICAgICAgIHsKKyAgICAgICAgbHpvX3VpbnQzMl90IGR2OworICAgICAgICBsem9fdWludCBkaW5kZXg7CitsaXRlcmFsOgorICAgICAgICBpcCArPSAxICsgKChpcCAtIGlpKSA+PiA1KTsKK25leHQ6CiAgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwID49IGlwX2VuZCkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjb250aW51ZTsKLQotbWF0Y2g6CisgICAgICAgIGR2ID0gVUFfR0VUX0xFMzIoaXApOworICAgICAgICBkaW5kZXggPSBESU5ERVgoZHYsaXApOworICAgICAgICBHSU5ERVgobV9vZmYsbV9wb3MsaW4rZGljdCxkaW5kZXgsaW4pOwogICAgICAgICBVUERBVEVfSShkaWN0LDAsZGluZGV4LGlwLGluKTsKLSAgICAgICAgaWYgKHBkKGlwLGlpKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyIGx6b191aW50IHQgPSBwZChpcCxpaSk7CisgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGR2ICE9IFVBX0dFVF9MRTMyKG1fcG9zKSkKKyAgICAgICAgICAgIGdvdG8gbGl0ZXJhbDsKKyAgICAgICAgfQorI2VuZGlmCiAKKyAgICAgICAgaWkgLT0gdGk7IHRpID0gMDsKKyAgICAgICAgeworICAgICAgICBsem9fdWludCB0ID0gcGQoaXAsaWkpOworICAgICAgICBpZiAodCAhPSAwKQorICAgICAgICB7CiAgICAgICAgICAgICBpZiAodCA8PSAzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydChvcCAtIDIgPiBvdXQpOwotICAgICAgICAgICAgICAgIG9wWy0yXSB8PSBMWk9fQllURSh0KTsKKyAgICAgICAgICAgICAgICBvcFstMl0gPSBMWk9fQllURShvcFstMl0gfCB0KTsKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyAgICAgICAgICAgICAgICBVQV9DT1BZNChvcCwgaWkpOworICAgICAgICAgICAgICAgIG9wICs9IHQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHsgZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOyB9CisjZW5kaWYKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHQgPD0gMTgpCisjaWYgKExaT19PUFRfVU5BTElHTkVEMzIpIHx8IChMWk9fT1BUX1VOQUxJR05FRDY0KQorICAgICAgICAgICAgZWxzZSBpZiAodCA8PSAxNikKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKHQgLSAzKTsKKyAgICAgICAgICAgICAgICBVQV9DT1BZOChvcCwgaWkpOworICAgICAgICAgICAgICAgIFVBX0NPUFk4KG9wKzgsIGlpKzgpOworICAgICAgICAgICAgICAgIG9wICs9IHQ7CisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWdpc3RlciBsem9fdWludCB0dCA9IHQgLSAxODsKLQotICAgICAgICAgICAgICAgICpvcCsrID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHQgPiAyNTUpCisgICAgICAgICAgICAgICAgaWYgKHQgPD0gMTgpCisgICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUodCAtIDMpOworICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHR0IC09IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnQgdHQgPSB0IC0gMTg7CiAgICAgICAgICAgICAgICAgICAgICpvcCsrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgX19sem9fdW5saWtlbHkodHQgPiAyNTUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0IC09IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVBX1NFVDEob3AsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgb3ArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHQgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSh0dCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFzc2VydCh0dCA+IDApOwotICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUodHQpOworI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX09QVF9VTkFMSUdORUQ2NCkKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk4KG9wLCBpaSk7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk4KG9wKzgsIGlpKzgpOworICAgICAgICAgICAgICAgICAgICBvcCArPSAxNjsgaWkgKz0gMTY7IHQgLT0gMTY7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodCA+PSAxNik7IGlmICh0ID4gMCkKKyNlbmRpZgorICAgICAgICAgICAgICAgIHsgZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOyB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CiAgICAgICAgIH0KLQotICAgICAgICBhc3NlcnQoaWkgPT0gaXApOwotICAgICAgICBpcCArPSAzOwotICAgICAgICBpZiAobV9wb3NbM10gIT0gKmlwKysgfHwgbV9wb3NbNF0gIT0gKmlwKysgfHwgbV9wb3NbNV0gIT0gKmlwKysgfHwKLSAgICAgICAgICAgIG1fcG9zWzZdICE9ICppcCsrIHx8IG1fcG9zWzddICE9ICppcCsrIHx8IG1fcG9zWzhdICE9ICppcCsrCi0jaWZkZWYgTFpPMVkKLSAgICAgICAgICAgIHx8IG1fcG9zWyA5XSAhPSAqaXArKyB8fCBtX3Bvc1sxMF0gIT0gKmlwKysgfHwgbV9wb3NbMTFdICE9ICppcCsrCi0gICAgICAgICAgICB8fCBtX3Bvc1sxMl0gIT0gKmlwKysgfHwgbV9wb3NbMTNdICE9ICppcCsrIHx8IG1fcG9zWzE0XSAhPSAqaXArKwotI2VuZGlmCi0gICAgICAgICAgICkKKyAgICAgICAgfQorICAgICAgICBtX2xlbiA9IDQ7CiAgICAgICAgIHsKLSAgICAgICAgICAgIC0taXA7Ci0gICAgICAgICAgICBtX2xlbiA9IHBkKGlwLCBpaSk7Ci0gICAgICAgICAgICBhc3NlcnQobV9sZW4gPj0gMyk7IGFzc2VydChtX2xlbiA8PSBNMl9NQVhfTEVOKTsKLQotICAgICAgICAgICAgaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9vZmYgLT0gMTsKLSNpZiBkZWZpbmVkKExaTzFYKQotICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpKTsKLSAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmID4+IDMpOwotI2VsaWYgZGVmaW5lZChMWk8xWSkKLSAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKCgobV9sZW4gKyAxKSA8PCA0KSB8ICgobV9vZmYgJiAzKSA8PCAyKSk7Ci0gICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAyKTsKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQ2NCkKKyAgICAgICAgbHpvX3VpbnQ2NF90IHY7CisgICAgICAgIHYgPSBVQV9HRVRfTkU2NChpcCArIG1fbGVuKSBeIFVBX0dFVF9ORTY0KG1fcG9zICsgbV9sZW4pOworICAgICAgICBpZiBfX2x6b191bmxpa2VseSh2ID09IDApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSA4OworICAgICAgICAgICAgICAgIHYgPSBVQV9HRVRfTkU2NChpcCArIG1fbGVuKSBeIFVBX0dFVF9ORTY0KG1fcG9zICsgbV9sZW4pOworICAgICAgICAgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwICsgbV9sZW4gPj0gaXBfZW5kKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG1fbGVuX2RvbmU7CisgICAgICAgICAgICB9IHdoaWxlICh2ID09IDApOworICAgICAgICB9CisjaWYgKExaT19BQklfQklHX0VORElBTikgJiYgZGVmaW5lZChsem9fYml0b3BzX2N0bHo2NCkKKyAgICAgICAgbV9sZW4gKz0gbHpvX2JpdG9wc19jdGx6NjQodikgLyBDSEFSX0JJVDsKKyNlbGlmIChMWk9fQUJJX0JJR19FTkRJQU4pCisgICAgICAgIGlmICgodiA+PiAoNjQgLSBDSEFSX0JJVCkpID09IDApIGRvIHsKKyAgICAgICAgICAgIHYgPDw9IENIQVJfQklUOworICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgfSB3aGlsZSAoKHYgPj4gKDY0IC0gQ0hBUl9CSVQpKSA9PSAwKTsKKyNlbGlmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQobHpvX2JpdG9wc19jdHR6NjQpCisgICAgICAgIG1fbGVuICs9IGx6b19iaXRvcHNfY3R0ejY0KHYpIC8gQ0hBUl9CSVQ7CisjZWxpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorICAgICAgICBpZiAoKHYgJiBVQ0hBUl9NQVgpID09IDApIGRvIHsKKyAgICAgICAgICAgIHYgPj49IENIQVJfQklUOworICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgfSB3aGlsZSAoKHYgJiBVQ0hBUl9NQVgpID09IDApOworI2Vsc2UKKyAgICAgICAgaWYgKGlwW21fbGVuXSA9PSBtX3Bvc1ttX2xlbl0pIGRvIHsKKyAgICAgICAgICAgIG1fbGVuICs9IDE7CisgICAgICAgIH0gd2hpbGUgKGlwW21fbGVuXSA9PSBtX3Bvc1ttX2xlbl0pOwogI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fb2ZmIC09IDE7CisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyAgICAgICAgbHpvX3VpbnQzMl90IHY7CisgICAgICAgIHYgPSBVQV9HRVRfTkUzMihpcCArIG1fbGVuKSBeIFVBX0dFVF9ORTMyKG1fcG9zICsgbV9sZW4pOworICAgICAgICBpZiBfX2x6b191bmxpa2VseSh2ID09IDApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSA0OworICAgICAgICAgICAgICAgIHYgPSBVQV9HRVRfTkUzMihpcCArIG1fbGVuKSBeIFVBX0dFVF9ORTMyKG1fcG9zICsgbV9sZW4pOworICAgICAgICAgICAgICAgIGlmICh2ICE9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1fbGVuICs9IDQ7CisgICAgICAgICAgICAgICAgdiA9IFVBX0dFVF9ORTMyKGlwICsgbV9sZW4pIF4gVUFfR0VUX05FMzIobV9wb3MgKyBtX2xlbik7CisgICAgICAgICAgICAgICAgaWYgX19sem9fdW5saWtlbHkoaXAgKyBtX2xlbiA+PSBpcF9lbmQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbV9sZW5fZG9uZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHYgPT0gMCk7CisgICAgICAgIH0KKyNpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiBkZWZpbmVkKGx6b19iaXRvcHNfY3RsejMyKQorICAgICAgICBtX2xlbiArPSBsem9fYml0b3BzX2N0bHozMih2KSAvIENIQVJfQklUOworI2VsaWYgKExaT19BQklfQklHX0VORElBTikKKyAgICAgICAgaWYgKCh2ID4+ICgzMiAtIENIQVJfQklUKSkgPT0gMCkgZG8geworICAgICAgICAgICAgdiA8PD0gQ0hBUl9CSVQ7CisgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICB9IHdoaWxlICgodiA+PiAoMzIgLSBDSEFSX0JJVCkpID09IDApOworI2VsaWYgKExaT19BQklfTElUVExFX0VORElBTikgJiYgZGVmaW5lZChsem9fYml0b3BzX2N0dHozMikKKyAgICAgICAgbV9sZW4gKz0gbHpvX2JpdG9wc19jdHR6MzIodikgLyBDSEFSX0JJVDsKKyNlbGlmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGlmICgodiAmIFVDSEFSX01BWCkgPT0gMCkgZG8geworICAgICAgICAgICAgdiA+Pj0gQ0hBUl9CSVQ7CisgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICB9IHdoaWxlICgodiAmIFVDSEFSX01BWCkgPT0gMCk7CisjZWxzZQorICAgICAgICBpZiAoaXBbbV9sZW5dID09IG1fcG9zW21fbGVuXSkgZG8geworICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgfSB3aGlsZSAoaXBbbV9sZW5dID09IG1fcG9zW21fbGVuXSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwW21fbGVuXSA9PSBtX3Bvc1ttX2xlbl0pIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIChpcFttX2xlbl0gIT0gbV9wb3NbbV9sZW5dKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICAgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwICsgbV9sZW4gPj0gaXBfZW5kKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG1fbGVuX2RvbmU7CisgICAgICAgICAgICB9IHdoaWxlIChpcFttX2xlbl0gPT0gbV9wb3NbbV9sZW5dKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KK21fbGVuX2RvbmU6CisgICAgICAgIG1fb2ZmID0gcGQoaXAsbV9wb3MpOworICAgICAgICBpcCArPSBtX2xlbjsKKyAgICAgICAgaWkgPSBpcDsKKyAgICAgICAgaWYgKG1fbGVuIDw9IE0yX01BWF9MRU4gJiYgbV9vZmYgPD0gTTJfTUFYX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9vZmYgLT0gMTsKKyNpZiBkZWZpbmVkKExaTzFYKQorICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSgoKG1fbGVuIC0gMSkgPDwgNSkgfCAoKG1fb2ZmICYgNykgPDwgMikpOworICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAzKTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKCgobV9sZW4gKyAxKSA8PCA0KSB8ICgobV9vZmYgJiAzKSA8PCAyKSk7CisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmID4+IDIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9vZmYgLT0gMTsKKyAgICAgICAgICAgIGlmIChtX2xlbiA8PSBNM19NQVhfTEVOKQogICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTNfTUFSS0VSIHwgKG1fbGVuIC0gMikpOwotICAgICAgICAgICAgICAgIGdvdG8gbTNfbTRfb2Zmc2V0OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQotI2lmIGRlZmluZWQoTFpPMVgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9vZmYgLT0gMHg0MDAwOwotICAgICAgICAgICAgICAgIGFzc2VydChtX29mZiA+IDApOyBhc3NlcnQobV9vZmYgPD0gMHg3ZmZmKTsKLSAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKE00X01BUktFUiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkgfCAobV9sZW4gLSAyKSk7Ci0gICAgICAgICAgICAgICAgZ290byBtM19tNF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgbV9sZW4gLT0gTTNfTUFYX0xFTjsKKyAgICAgICAgICAgICAgICAqb3ArKyA9IE0zX01BUktFUiB8IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgX19sem9fdW5saWtlbHkobV9sZW4gPiAyNTUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2xlbiAtPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIFVBX1NFVDEob3AsIDApOworICAgICAgICAgICAgICAgICAgICBvcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fbGVuKTsKICAgICAgICAgICAgIH0KLSNlbGlmIGRlZmluZWQoTFpPMVkpCi0gICAgICAgICAgICAgICAgZ290byBtNF9tYXRjaDsKLSNlbmRpZgorICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA8PCAyKTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gNik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgbHpvX2J5dGVwIGVuZCA9IGluX2VuZDsKLSAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgbSA9IG1fcG9zICsgTTJfTUFYX0xFTiArIDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGlwIDwgZW5kICYmICptID09ICppcCkKLSAgICAgICAgICAgICAgICAgICAgbSsrLCBpcCsrOwotICAgICAgICAgICAgICAgIG1fbGVuID0gcGQoaXAsIGlpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydChtX2xlbiA+IE0yX01BWF9MRU4pOwotCi0gICAgICAgICAgICBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX29mZiAtPSAxOwotICAgICAgICAgICAgICAgIGlmIChtX2xlbiA8PSAzMykKLSAgICAgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShNM19NQVJLRVIgfCAobV9sZW4gLSAyKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9sZW4gLT0gMzM7Ci0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gTTNfTUFSS0VSIHwgMDsKLSAgICAgICAgICAgICAgICAgICAgZ290byBtM19tNF9sZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9vZmYgLT0gMHg0MDAwOworICAgICAgICAgICAgaWYgKG1fbGVuIDw9IE00X01BWF9MRU4pCisgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShNNF9NQVJLRVIgfCAoKG1fb2ZmID4+IDExKSAmIDgpIHwgKG1fbGVuIC0gMikpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotI2lmIGRlZmluZWQoTFpPMVkpCi1tNF9tYXRjaDoKLSNlbmRpZgotICAgICAgICAgICAgICAgIG1fb2ZmIC09IDB4NDAwMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQobV9vZmYgPiAwKTsgYXNzZXJ0KG1fb2ZmIDw9IDB4N2ZmZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1fbGVuIDw9IE00X01BWF9MRU4pCi0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTRfTUFSS0VSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkgfCAobV9sZW4gLSAyKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fbGVuIC09IE00X01BWF9MRU47CisgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShNNF9NQVJLRVIgfCAoKG1fb2ZmID4+IDExKSAmIDgpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSBfX2x6b191bmxpa2VseShtX2xlbiA+IDI1NSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fbGVuIC09IE00X01BWF9MRU47Ci0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTRfTUFSS0VSIHwgKChtX29mZiAmIDB4NDAwMCkgPj4gMTEpKTsKLW0zX200X2xlbjoKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fbGVuID4gMjU1KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xlbiAtPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqb3ArKyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG1fbGVuID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9sZW4pOworICAgICAgICAgICAgICAgICAgICBtX2xlbiAtPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIFVBX1NFVDEob3AsIDApOworICAgICAgICAgICAgICAgICAgICBvcCsrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fbGVuKTsKICAgICAgICAgICAgIH0KLQotbTNfbTRfb2Zmc2V0OgotICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSgobV9vZmYgJiA2MykgPDwgMik7CisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmIDw8IDIpOwogICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiA2KTsKICAgICAgICAgfQotCi0jaWYgMAotbWF0Y2hfZG9uZToKLSNlbmRpZgotICAgICAgICBpaSA9IGlwOwotICAgICAgICBpZiBfX2x6b191bmxpa2VseShpcCA+PSBpcF9lbmQpCi0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZ290byBuZXh0OwogICAgIH0KIAogICAgICpvdXRfbGVuID0gcGQob3AsIG91dCk7Ci0gICAgcmV0dXJuIHBkKGluX2VuZCxpaSk7CisgICAgcmV0dXJuIHBkKGluX2VuZCxpaS10aSk7CiB9CiAKIExaT19QVUJMSUMoaW50KQpAQCAtMzE2MSwxNiArNDg4NSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKQogeworICAgIGNvbnN0IGx6b19ieXRlcCBpcCA9IGluOwogICAgIGx6b19ieXRlcCBvcCA9IG91dDsKLSAgICBsem9fdWludCB0OworICAgIGx6b191aW50IGwgPSBpbl9sZW47CisgICAgbHpvX3VpbnQgdCA9IDA7CiAKLSAgICBpZiBfX2x6b191bmxpa2VseShpbl9sZW4gPD0gTTJfTUFYX0xFTiArIDUpCi0gICAgICAgIHQgPSBpbl9sZW47Ci0gICAgZWxzZQorICAgIHdoaWxlIChsID4gMjApCiAgICAgewotICAgICAgICB0ID0gZG9fY29tcHJlc3MoaW4saW5fbGVuLG9wLG91dF9sZW4sd3JrbWVtKTsKKyAgICAgICAgbHpvX3VpbnQgbGwgPSBsOworICAgICAgICBsem9fdWludHB0cl90IGxsX2VuZDsKKyNpZiAwIHx8IChMWk9fREVURVJNSU5JU1RJQykKKyAgICAgICAgbGwgPSBMWk9fTUlOKGxsLCA0OTE1Mik7CisjZW5kaWYKKyAgICAgICAgbGxfZW5kID0gKGx6b191aW50cHRyX3QpaXAgKyBsbDsKKyAgICAgICAgaWYgKChsbF9lbmQgKyAoKHQgKyBsbCkgPj4gNSkpIDw9IGxsX2VuZCB8fCAoY29uc3QgbHpvX2J5dGVwKShsbF9lbmQgKyAoKHQgKyBsbCkgPj4gNSkpIDw9IGlwICsgbGwpCisgICAgICAgICAgICBicmVhazsKKyNpZiAoTFpPX0RFVEVSTUlOSVNUSUMpCisgICAgICAgIGx6b19tZW1zZXQod3JrbWVtLCAwLCAoKGx6b191aW50KTEgPDwgRF9CSVRTKSAqIHNpemVvZihsem9fZGljdF90KSk7CisjZW5kaWYKKyAgICAgICAgdCA9IGRvX2NvbXByZXNzKGlwLGxsLG9wLG91dF9sZW4sdCx3cmttZW0pOworICAgICAgICBpcCArPSBsbDsKICAgICAgICAgb3AgKz0gKm91dF9sZW47CisgICAgICAgIGwgIC09IGxsOwogICAgIH0KKyAgICB0ICs9IGw7CiAKICAgICBpZiAodCA+IDApCiAgICAgewpAQCAtMzE3OSw3ICs0OTE3LDcgQEAKICAgICAgICAgaWYgKG9wID09IG91dCAmJiB0IDw9IDIzOCkKICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoMTcgKyB0KTsKICAgICAgICAgZWxzZSBpZiAodCA8PSAzKQotICAgICAgICAgICAgb3BbLTJdIHw9IExaT19CWVRFKHQpOworICAgICAgICAgICAgb3BbLTJdID0gTFpPX0JZVEUob3BbLTJdIHwgdCk7CiAgICAgICAgIGVsc2UgaWYgKHQgPD0gMTgpCiAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKHQgLSAzKTsKICAgICAgICAgZWxzZQpAQCAtMzE5MCwxMiArNDkyOCwxNCBAQAogICAgICAgICAgICAgd2hpbGUgKHR0ID4gMjU1KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHR0IC09IDI1NTsKLSAgICAgICAgICAgICAgICAqb3ArKyA9IDA7CisgICAgICAgICAgICAgICAgVUFfU0VUMShvcCwgMCk7CisgICAgICAgICAgICAgICAgb3ArKzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydCh0dCA+IDApOwogICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSh0dCk7CiAgICAgICAgIH0KLSAgICAgICAgZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOworICAgICAgICBVQV9DT1BZTihvcCwgaWksIHQpOworICAgICAgICBvcCArPSB0OwogICAgIH0KIAogICAgICpvcCsrID0gTTRfTUFSS0VSIHwgMTsKQEAgLTMyMzIsMTAgKzQ5NzIsMTMgQEAKIAogI3VuZGVmIFRFU1RfSVAKICN1bmRlZiBURVNUX09QCisjdW5kZWYgVEVTVF9JUF9BTkRfVEVTVF9PUAogI3VuZGVmIFRFU1RfTEIKICN1bmRlZiBURVNUX0xCTwogI3VuZGVmIE5FRURfSVAKICN1bmRlZiBORUVEX09QCisjdW5kZWYgVEVTVF9JVgorI3VuZGVmIFRFU1RfT1YKICN1bmRlZiBIQVZFX1RFU1RfSVAKICN1bmRlZiBIQVZFX1RFU1RfT1AKICN1bmRlZiBIQVZFX05FRURfSVAKQEAgLTMyNTAsNiArNDk5Myw3IEBACiAjICBpZiAoTFpPX1RFU1RfT1ZFUlJVTl9JTlBVVCA+PSAyKQogIyAgICBkZWZpbmUgTkVFRF9JUCh4KSBcCiAgICAgICAgICAgICBpZiAoKGx6b191aW50KShpcF9lbmQgLSBpcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBpbnB1dF9vdmVycnVuCisjICAgIGRlZmluZSBURVNUX0lWKHgpICAgICAgICAgIGlmICgoeCkgPiAgKGx6b191aW50KTAgLSAoNTExKSkgZ290byBpbnB1dF9vdmVycnVuCiAjICBlbmRpZgogI2VuZGlmCiAKQEAgLTMyNjEsMTIgKzUwMDUsMTMgQEAKICMgICAgdW5kZWYgVEVTVF9PUAogIyAgICBkZWZpbmUgTkVFRF9PUCh4KSBcCiAgICAgICAgICAgICBpZiAoKGx6b191aW50KShvcF9lbmQgLSBvcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBvdXRwdXRfb3ZlcnJ1bgorIyAgICBkZWZpbmUgVEVTVF9PVih4KSAgICAgICAgICBpZiAoKHgpID4gIChsem9fdWludCkwIC0gKDUxMSkpIGdvdG8gb3V0cHV0X292ZXJydW4KICMgIGVuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQotIyAgZGVmaW5lIFRFU1RfTEIobV9wb3MpICAgICAgICBpZiAobV9wb3MgPCBvdXQgfHwgbV9wb3MgPj0gb3ApIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCi0jICBkZWZpbmUgVEVTVF9MQk8obV9wb3MsbykgICAgIGlmIChtX3BvcyA8IG91dCB8fCBtX3BvcyA+PSBvcCAtIChvKSkgZ290byBsb29rYmVoaW5kX292ZXJydW4KKyMgIGRlZmluZSBURVNUX0xCKG1fcG9zKSAgICAgICAgaWYgKFBUUl9MVChtX3BvcyxvdXQpIHx8IFBUUl9HRShtX3BvcyxvcCkpIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCisjICBkZWZpbmUgVEVTVF9MQk8obV9wb3MsbykgICAgIGlmIChQVFJfTFQobV9wb3Msb3V0KSB8fCBQVFJfR0UobV9wb3Msb3AtKG8pKSkgZ290byBsb29rYmVoaW5kX292ZXJydW4KICNlbHNlCiAjICBkZWZpbmUgVEVTVF9MQihtX3BvcykgICAgICAgICgodm9pZCkgMCkKICMgIGRlZmluZSBURVNUX0xCTyhtX3BvcyxvKSAgICAgKCh2b2lkKSAwKQpAQCAtMzI4NywxNSArNTAzMiwyNyBAQAogIyAgZGVmaW5lIFRFU1RfT1AgICAgICAgICAgICAgICAxCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9URVNUX0lQKSAmJiBkZWZpbmVkKEhBVkVfVEVTVF9PUCkKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgKFRFU1RfSVAgJiYgVEVTVF9PUCkKKyNlbGlmIGRlZmluZWQoSEFWRV9URVNUX0lQKQorIyAgZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgICBURVNUX0lQCisjZWxpZiBkZWZpbmVkKEhBVkVfVEVTVF9PUCkKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgVEVTVF9PUAorI2Vsc2UKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgMQorI2VuZGlmCisKICNpZiBkZWZpbmVkKE5FRURfSVApCiAjICBkZWZpbmUgSEFWRV9ORUVEX0lQIDEKICNlbHNlCiAjICBkZWZpbmUgTkVFRF9JUCh4KSAgICAgICAgICAgICgodm9pZCkgMCkKKyMgIGRlZmluZSBURVNUX0lWKHgpICAgICAgICAgICAgKCh2b2lkKSAwKQogI2VuZGlmCiAjaWYgZGVmaW5lZChORUVEX09QKQogIyAgZGVmaW5lIEhBVkVfTkVFRF9PUCAxCiAjZWxzZQogIyAgZGVmaW5lIE5FRURfT1AoeCkgICAgICAgICAgICAoKHZvaWQpIDApCisjICBkZWZpbmUgVEVTVF9PVih4KSAgICAgICAgICAgICgodm9pZCkgMCkKICNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX1RFU1RfSVApIHx8IGRlZmluZWQoSEFWRV9ORUVEX0lQKQpAQCAtMzMxMiwxNCArNTA2OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKICNlbmRpZgogewotICAgIHJlZ2lzdGVyIGx6b19ieXRlcCBvcDsKLSAgICByZWdpc3RlciBjb25zdCBsem9fYnl0ZXAgaXA7Ci0gICAgcmVnaXN0ZXIgbHpvX3VpbnQgdDsKKyAgICBsem9fYnl0ZXAgb3A7CisgICAgY29uc3QgbHpvX2J5dGVwIGlwOworICAgIGx6b191aW50IHQ7CiAjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCiAgICAgbHpvX3VpbnQgbV9vZmY7CiAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3RfZW5kOwogI2Vsc2UKLSAgICByZWdpc3RlciBjb25zdCBsem9fYnl0ZXAgbV9wb3M7CisgICAgY29uc3QgbHpvX2J5dGVwIG1fcG9zOwogI2VuZGlmCiAKICAgICBjb25zdCBsem9fYnl0ZXAgY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CkBAIC0zMzU0LDQ2ICs1MTExLDY1IEBACiAgICAgb3AgPSBvdXQ7CiAgICAgaXAgPSBpbjsKIAorICAgIE5FRURfSVAoMSk7CiAgICAgaWYgKCppcCA+IDE3KQogICAgIHsKICAgICAgICAgdCA9ICppcCsrIC0gMTc7CiAgICAgICAgIGlmICh0IDwgNCkKICAgICAgICAgICAgIGdvdG8gbWF0Y2hfbmV4dDsKLSAgICAgICAgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzEpOworICAgICAgICBhc3NlcnQodCA+IDApOyBORUVEX09QKHQpOyBORUVEX0lQKHQrMyk7CiAgICAgICAgIGRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKICAgICAgICAgZ290byBmaXJzdF9saXRlcmFsX3J1bjsKICAgICB9CiAKLSAgICB3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKQorICAgIGZvciAoOzspCiAgICAgeworICAgICAgICBORUVEX0lQKDMpOwogICAgICAgICB0ID0gKmlwKys7CiAgICAgICAgIGlmICh0ID49IDE2KQogICAgICAgICAgICAgZ290byBtYXRjaDsKICAgICAgICAgaWYgKHQgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0ICs9IDI1NTsKICAgICAgICAgICAgICAgICBpcCsrOworICAgICAgICAgICAgICAgIFRFU1RfSVYodCk7CiAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHQgKz0gMTUgKyAqaXArKzsKICAgICAgICAgfQotICAgICAgICBhc3NlcnQodCA+IDApOyBORUVEX09QKHQrMyk7IE5FRURfSVAodCs0KTsKLSNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkgfHwgZGVmaW5lZChMWk9fQUxJR05FRF9PS180KQotI2lmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKyAgICAgICAgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMpOyBORUVEX0lQKHQrNik7CisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpICYmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICB0ICs9IDM7CisgICAgICAgIGlmICh0ID49IDgpIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIFVBX0NPUFk4KG9wLGlwKTsKKyAgICAgICAgICAgIG9wICs9IDg7IGlwICs9IDg7IHQgLT0gODsKKyAgICAgICAgfSB3aGlsZSAodCA+PSA4KTsKKyAgICAgICAgaWYgKHQgPj0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgVUFfQ09QWTQob3AsaXApOworICAgICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsgdCAtPSA0OworICAgICAgICB9CisgICAgICAgIGlmICh0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgKm9wKysgPSAqaXArKzsKKyAgICAgICAgICAgIGlmICh0ID4gMSkgeyAqb3ArKyA9ICppcCsrOyBpZiAodCA+IDIpIHsgKm9wKysgPSAqaXArKzsgfSB9CisgICAgICAgIH0KKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX0FMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgIGlmIChQVFJfQUxJR05FRDJfNChvcCxpcCkpCiAgICAgICAgIHsKICNlbmRpZgotICAgICAgICBDT1BZNChvcCxpcCk7CisgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsKICAgICAgICAgaWYgKC0tdCA+IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh0ID49IDQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBDT1BZNChvcCxpcCk7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKICAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsgdCAtPSA0OwogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gNCk7CiAgICAgICAgICAgICAgICAgaWYgKHQgPiAwKSBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC0zNDAxLDEyICs1MTc3LDEyIEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOwogICAgICAgICB9Ci0jaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorI2lmICEoTFpPX09QVF9VTkFMSUdORUQzMikKICAgICAgICAgfQogICAgICAgICBlbHNlCiAjZW5kaWYKICNlbmRpZgotI2lmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7CiAgICAgICAgICAgICBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC0zNDQyLDcgKzUyMTgsNyBAQAogI2VuZGlmCiAgICAgICAgIGdvdG8gbWF0Y2hfZG9uZTsKIAotICAgICAgICBkbyB7CisgICAgICAgIGZvciAoOzspIHsKIG1hdGNoOgogICAgICAgICAgICAgaWYgKHQgPj0gNjQpCiAgICAgICAgICAgICB7CkBAIC0zNTAyLDE0ICs1Mjc4LDE1IEBACiAgICAgICAgICAgICAgICAgdCAmPSAzMTsKICAgICAgICAgICAgICAgICBpZiAodCA9PSAwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCppcCA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IDI1NTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX09WKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0ICs9IDMxICsgKmlwKys7CisgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMik7CiAgICAgICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoQ09QWV9ESUNUKQogI2lmIGRlZmluZWQoTFpPMVopCkBAIC0zNTI1LDkgKzUzMDIsOSBAQAogICAgICAgICAgICAgICAgICAgICBtX3BvcyA9IG9wIC0gb2ZmOwogICAgICAgICAgICAgICAgICAgICBsYXN0X21fb2ZmID0gb2ZmOwogICAgICAgICAgICAgICAgIH0KLSNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDE2KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQogICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOwotICAgICAgICAgICAgICAgIG1fcG9zIC09ICgqIChjb25zdCBsem9fdXNob3J0cCkgKGNvbnN0IGx6b192b2lkcCkgaXApID4+IDI7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gVUFfR0VUX0xFMTYoaXApID4+IDI7CiAjZWxzZQogICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOwogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKQEAgLTM1NDYsMTQgKzUzMjMsMTUgQEAKICAgICAgICAgICAgICAgICB0ICY9IDc7CiAgICAgICAgICAgICAgICAgaWYgKHQgPT0gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMSk7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9PVih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdCArPSA3ICsgKmlwKys7CisgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMik7CiAgICAgICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoQ09QWV9ESUNUKQogI2lmIGRlZmluZWQoTFpPMVopCkBAIC0zNTcxLDggKzUzNDksOCBAQAogI2Vsc2UKICNpZiBkZWZpbmVkKExaTzFaKQogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKLSNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKLSAgICAgICAgICAgICAgICBtX3BvcyAtPSAoKiAoY29uc3QgbHpvX3VzaG9ydHApIChjb25zdCBsem9fdm9pZHApIGlwKSA+PiAyOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMTYpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgICAgICAgICAgICAgbV9wb3MgLT0gVUFfR0VUX0xFMTYoaXApID4+IDI7CiAjZWxzZQogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKICNlbmRpZgpAQCAtMzYyMCw4ICs1Mzk4LDI5IEBACiAjZWxzZQogCiAgICAgICAgICAgICBURVNUX0xCKG1fcG9zKTsgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMtMSk7Ci0jaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpIHx8IGRlZmluZWQoTFpPX0FMSUdORURfT0tfNCkKLSNpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpICYmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICAgICAgaWYgKG9wIC0gbV9wb3MgPj0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ICs9ICgzIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKHQgPj0gOCkgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk4KG9wLG1fcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gODsgbV9wb3MgKz0gODsgdCAtPSA4OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gOCk7CisgICAgICAgICAgICAgICAgaWYgKHQgPj0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLG1fcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqb3ArKyA9IG1fcG9zWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAodCA+IDEpIHsgKm9wKysgPSBtX3Bvc1sxXTsgaWYgKHQgPiAyKSB7ICpvcCsrID0gbV9wb3NbMl07IH0gfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX0FMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgICAgICBpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgUFRSX0FMSUdORUQyXzQob3AsbV9wb3MpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFzc2VydCgob3AgLSBtX3BvcykgPj0gNCk7CkBAIC0zNjI5LDEwICs1NDI4LDEwIEBACiAgICAgICAgICAgICBpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgKG9wIC0gbV9wb3MpID49IDQpCiAgICAgICAgICAgICB7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBDT1BZNChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgVUFfQ09QWTQob3AsbV9wb3MpOwogICAgICAgICAgICAgICAgIG9wICs9IDQ7IG1fcG9zICs9IDQ7IHQgLT0gNCAtICgzIC0gMSk7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBDT1BZNChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLG1fcG9zKTsKICAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0OwogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gNCk7CiAgICAgICAgICAgICAgICAgaWYgKHQgPiAwKSBkbyAqb3ArKyA9ICptX3BvcysrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC0zNjU3LDcgKzU0NTYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiBtYXRjaF9uZXh0OgotICAgICAgICAgICAgYXNzZXJ0KHQgPiAwKTsgYXNzZXJ0KHQgPCA0KTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzEpOworICAgICAgICAgICAgYXNzZXJ0KHQgPiAwKTsgYXNzZXJ0KHQgPCA0KTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzMpOwogI2lmIDAKICAgICAgICAgICAgIGRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKICNlbHNlCkBAIC0zNjY1LDE2ICs1NDY0LDEwIEBACiAgICAgICAgICAgICBpZiAodCA+IDEpIHsgKm9wKysgPSAqaXArKzsgaWYgKHQgPiAyKSB7ICpvcCsrID0gKmlwKys7IH0gfQogI2VuZGlmCiAgICAgICAgICAgICB0ID0gKmlwKys7Ci0gICAgICAgIH0gd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCk7CisgICAgICAgIH0KICAgICB9CiAKLSNpZiBkZWZpbmVkKEhBVkVfVEVTVF9JUCkgfHwgZGVmaW5lZChIQVZFX1RFU1RfT1ApCi0gICAgKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKLSAgICByZXR1cm4gTFpPX0VfRU9GX05PVF9GT1VORDsKLSNlbmRpZgotCiBlb2ZfZm91bmQ6Ci0gICAgYXNzZXJ0KHQgPT0gMSk7CiAgICAgKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKICAgICByZXR1cm4gKGlwID09IGlwX2VuZCA/IExaT19FX09LIDoKICAgICAgICAgICAgKGlwIDwgaXBfZW5kICA/IExaT19FX0lOUFVUX05PVF9DT05TVU1FRCA6IExaT19FX0lOUFVUX09WRVJSVU4pKTsKQEAgLTM3MjAsMTAgKzU1MTMsMTMgQEAKIAogI3VuZGVmIFRFU1RfSVAKICN1bmRlZiBURVNUX09QCisjdW5kZWYgVEVTVF9JUF9BTkRfVEVTVF9PUAogI3VuZGVmIFRFU1RfTEIKICN1bmRlZiBURVNUX0xCTwogI3VuZGVmIE5FRURfSVAKICN1bmRlZiBORUVEX09QCisjdW5kZWYgVEVTVF9JVgorI3VuZGVmIFRFU1RfT1YKICN1bmRlZiBIQVZFX1RFU1RfSVAKICN1bmRlZiBIQVZFX1RFU1RfT1AKICN1bmRlZiBIQVZFX05FRURfSVAKQEAgLTM3MzgsNiArNTUzNCw3IEBACiAjICBpZiAoTFpPX1RFU1RfT1ZFUlJVTl9JTlBVVCA+PSAyKQogIyAgICBkZWZpbmUgTkVFRF9JUCh4KSBcCiAgICAgICAgICAgICBpZiAoKGx6b191aW50KShpcF9lbmQgLSBpcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBpbnB1dF9vdmVycnVuCisjICAgIGRlZmluZSBURVNUX0lWKHgpICAgICAgICAgIGlmICgoeCkgPiAgKGx6b191aW50KTAgLSAoNTExKSkgZ290byBpbnB1dF9vdmVycnVuCiAjICBlbmRpZgogI2VuZGlmCiAKQEAgLTM3NDksMTIgKzU1NDYsMTMgQEAKICMgICAgdW5kZWYgVEVTVF9PUAogIyAgICBkZWZpbmUgTkVFRF9PUCh4KSBcCiAgICAgICAgICAgICBpZiAoKGx6b191aW50KShvcF9lbmQgLSBvcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBvdXRwdXRfb3ZlcnJ1bgorIyAgICBkZWZpbmUgVEVTVF9PVih4KSAgICAgICAgICBpZiAoKHgpID4gIChsem9fdWludCkwIC0gKDUxMSkpIGdvdG8gb3V0cHV0X292ZXJydW4KICMgIGVuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQotIyAgZGVmaW5lIFRFU1RfTEIobV9wb3MpICAgICAgICBpZiAobV9wb3MgPCBvdXQgfHwgbV9wb3MgPj0gb3ApIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCi0jICBkZWZpbmUgVEVTVF9MQk8obV9wb3MsbykgICAgIGlmIChtX3BvcyA8IG91dCB8fCBtX3BvcyA+PSBvcCAtIChvKSkgZ290byBsb29rYmVoaW5kX292ZXJydW4KKyMgIGRlZmluZSBURVNUX0xCKG1fcG9zKSAgICAgICAgaWYgKFBUUl9MVChtX3BvcyxvdXQpIHx8IFBUUl9HRShtX3BvcyxvcCkpIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCisjICBkZWZpbmUgVEVTVF9MQk8obV9wb3MsbykgICAgIGlmIChQVFJfTFQobV9wb3Msb3V0KSB8fCBQVFJfR0UobV9wb3Msb3AtKG8pKSkgZ290byBsb29rYmVoaW5kX292ZXJydW4KICNlbHNlCiAjICBkZWZpbmUgVEVTVF9MQihtX3BvcykgICAgICAgICgodm9pZCkgMCkKICMgIGRlZmluZSBURVNUX0xCTyhtX3BvcyxvKSAgICAgKCh2b2lkKSAwKQpAQCAtMzc3NSwxNSArNTU3MywyNyBAQAogIyAgZGVmaW5lIFRFU1RfT1AgICAgICAgICAgICAgICAxCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9URVNUX0lQKSAmJiBkZWZpbmVkKEhBVkVfVEVTVF9PUCkKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgKFRFU1RfSVAgJiYgVEVTVF9PUCkKKyNlbGlmIGRlZmluZWQoSEFWRV9URVNUX0lQKQorIyAgZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgICBURVNUX0lQCisjZWxpZiBkZWZpbmVkKEhBVkVfVEVTVF9PUCkKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgVEVTVF9PUAorI2Vsc2UKKyMgIGRlZmluZSBURVNUX0lQX0FORF9URVNUX09QICAgMQorI2VuZGlmCisKICNpZiBkZWZpbmVkKE5FRURfSVApCiAjICBkZWZpbmUgSEFWRV9ORUVEX0lQIDEKICNlbHNlCiAjICBkZWZpbmUgTkVFRF9JUCh4KSAgICAgICAgICAgICgodm9pZCkgMCkKKyMgIGRlZmluZSBURVNUX0lWKHgpICAgICAgICAgICAgKCh2b2lkKSAwKQogI2VuZGlmCiAjaWYgZGVmaW5lZChORUVEX09QKQogIyAgZGVmaW5lIEhBVkVfTkVFRF9PUCAxCiAjZWxzZQogIyAgZGVmaW5lIE5FRURfT1AoeCkgICAgICAgICAgICAoKHZvaWQpIDApCisjICBkZWZpbmUgVEVTVF9PVih4KSAgICAgICAgICAgICgodm9pZCkgMCkKICNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX1RFU1RfSVApIHx8IGRlZmluZWQoSEFWRV9ORUVEX0lQKQpAQCAtMzgwMCwxNCArNTYxMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKICNlbmRpZgogewotICAgIHJlZ2lzdGVyIGx6b19ieXRlcCBvcDsKLSAgICByZWdpc3RlciBjb25zdCBsem9fYnl0ZXAgaXA7Ci0gICAgcmVnaXN0ZXIgbHpvX3VpbnQgdDsKKyAgICBsem9fYnl0ZXAgb3A7CisgICAgY29uc3QgbHpvX2J5dGVwIGlwOworICAgIGx6b191aW50IHQ7CiAjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCiAgICAgbHpvX3VpbnQgbV9vZmY7CiAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3RfZW5kOwogI2Vsc2UKLSAgICByZWdpc3RlciBjb25zdCBsem9fYnl0ZXAgbV9wb3M7CisgICAgY29uc3QgbHpvX2J5dGVwIG1fcG9zOwogI2VuZGlmCiAKICAgICBjb25zdCBsem9fYnl0ZXAgY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CkBAIC0zODQyLDQ2ICs1NjUyLDY1IEBACiAgICAgb3AgPSBvdXQ7CiAgICAgaXAgPSBpbjsKIAorICAgIE5FRURfSVAoMSk7CiAgICAgaWYgKCppcCA+IDE3KQogICAgIHsKICAgICAgICAgdCA9ICppcCsrIC0gMTc7CiAgICAgICAgIGlmICh0IDwgNCkKICAgICAgICAgICAgIGdvdG8gbWF0Y2hfbmV4dDsKLSAgICAgICAgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzEpOworICAgICAgICBhc3NlcnQodCA+IDApOyBORUVEX09QKHQpOyBORUVEX0lQKHQrMyk7CiAgICAgICAgIGRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKICAgICAgICAgZ290byBmaXJzdF9saXRlcmFsX3J1bjsKICAgICB9CiAKLSAgICB3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKQorICAgIGZvciAoOzspCiAgICAgeworICAgICAgICBORUVEX0lQKDMpOwogICAgICAgICB0ID0gKmlwKys7CiAgICAgICAgIGlmICh0ID49IDE2KQogICAgICAgICAgICAgZ290byBtYXRjaDsKICAgICAgICAgaWYgKHQgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0ICs9IDI1NTsKICAgICAgICAgICAgICAgICBpcCsrOworICAgICAgICAgICAgICAgIFRFU1RfSVYodCk7CiAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHQgKz0gMTUgKyAqaXArKzsKICAgICAgICAgfQotICAgICAgICBhc3NlcnQodCA+IDApOyBORUVEX09QKHQrMyk7IE5FRURfSVAodCs0KTsKLSNpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkgfHwgZGVmaW5lZChMWk9fQUxJR05FRF9PS180KQotI2lmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKyAgICAgICAgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMpOyBORUVEX0lQKHQrNik7CisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpICYmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICB0ICs9IDM7CisgICAgICAgIGlmICh0ID49IDgpIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIFVBX0NPUFk4KG9wLGlwKTsKKyAgICAgICAgICAgIG9wICs9IDg7IGlwICs9IDg7IHQgLT0gODsKKyAgICAgICAgfSB3aGlsZSAodCA+PSA4KTsKKyAgICAgICAgaWYgKHQgPj0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgVUFfQ09QWTQob3AsaXApOworICAgICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsgdCAtPSA0OworICAgICAgICB9CisgICAgICAgIGlmICh0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgKm9wKysgPSAqaXArKzsKKyAgICAgICAgICAgIGlmICh0ID4gMSkgeyAqb3ArKyA9ICppcCsrOyBpZiAodCA+IDIpIHsgKm9wKysgPSAqaXArKzsgfSB9CisgICAgICAgIH0KKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX0FMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgIGlmIChQVFJfQUxJR05FRDJfNChvcCxpcCkpCiAgICAgICAgIHsKICNlbmRpZgotICAgICAgICBDT1BZNChvcCxpcCk7CisgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsKICAgICAgICAgaWYgKC0tdCA+IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh0ID49IDQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBDT1BZNChvcCxpcCk7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKICAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsgdCAtPSA0OwogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gNCk7CiAgICAgICAgICAgICAgICAgaWYgKHQgPiAwKSBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC0zODg5LDEyICs1NzE4LDEyIEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOwogICAgICAgICB9Ci0jaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorI2lmICEoTFpPX09QVF9VTkFMSUdORUQzMikKICAgICAgICAgfQogICAgICAgICBlbHNlCiAjZW5kaWYKICNlbmRpZgotI2lmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7CiAgICAgICAgICAgICBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC0zOTMwLDcgKzU3NTksNyBAQAogI2VuZGlmCiAgICAgICAgIGdvdG8gbWF0Y2hfZG9uZTsKIAotICAgICAgICBkbyB7CisgICAgICAgIGZvciAoOzspIHsKIG1hdGNoOgogICAgICAgICAgICAgaWYgKHQgPj0gNjQpCiAgICAgICAgICAgICB7CkBAIC0zOTkwLDE0ICs1ODE5LDE1IEBACiAgICAgICAgICAgICAgICAgdCAmPSAzMTsKICAgICAgICAgICAgICAgICBpZiAodCA9PSAwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCppcCA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IDI1NTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX09WKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0ICs9IDMxICsgKmlwKys7CisgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMik7CiAgICAgICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoQ09QWV9ESUNUKQogI2lmIGRlZmluZWQoTFpPMVopCkBAIC00MDEzLDkgKzU4NDMsOSBAQAogICAgICAgICAgICAgICAgICAgICBtX3BvcyA9IG9wIC0gb2ZmOwogICAgICAgICAgICAgICAgICAgICBsYXN0X21fb2ZmID0gb2ZmOwogICAgICAgICAgICAgICAgIH0KLSNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDE2KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQogICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOwotICAgICAgICAgICAgICAgIG1fcG9zIC09ICgqIChjb25zdCBsem9fdXNob3J0cCkgKGNvbnN0IGx6b192b2lkcCkgaXApID4+IDI7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gVUFfR0VUX0xFMTYoaXApID4+IDI7CiAjZWxzZQogICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOwogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKQEAgLTQwMzQsMTQgKzU4NjQsMTUgQEAKICAgICAgICAgICAgICAgICB0ICY9IDc7CiAgICAgICAgICAgICAgICAgaWYgKHQgPT0gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMSk7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9PVih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdCArPSA3ICsgKmlwKys7CisgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMik7CiAgICAgICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoQ09QWV9ESUNUKQogI2lmIGRlZmluZWQoTFpPMVopCkBAIC00MDU5LDggKzU4OTAsOCBAQAogI2Vsc2UKICNpZiBkZWZpbmVkKExaTzFaKQogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKLSNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKLSAgICAgICAgICAgICAgICBtX3BvcyAtPSAoKiAoY29uc3QgbHpvX3VzaG9ydHApIChjb25zdCBsem9fdm9pZHApIGlwKSA+PiAyOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMTYpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgICAgICAgICAgICAgbV9wb3MgLT0gVUFfR0VUX0xFMTYoaXApID4+IDI7CiAjZWxzZQogICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKICNlbmRpZgpAQCAtNDEwOCw4ICs1OTM5LDI5IEBACiAjZWxzZQogCiAgICAgICAgICAgICBURVNUX0xCKG1fcG9zKTsgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMtMSk7Ci0jaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpIHx8IGRlZmluZWQoTFpPX0FMSUdORURfT0tfNCkKLSNpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpICYmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICAgICAgaWYgKG9wIC0gbV9wb3MgPj0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ICs9ICgzIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKHQgPj0gOCkgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk4KG9wLG1fcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gODsgbV9wb3MgKz0gODsgdCAtPSA4OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gOCk7CisgICAgICAgICAgICAgICAgaWYgKHQgPj0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLG1fcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqb3ArKyA9IG1fcG9zWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAodCA+IDEpIHsgKm9wKysgPSBtX3Bvc1sxXTsgaWYgKHQgPiAyKSB7ICpvcCsrID0gbV9wb3NbMl07IH0gfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX0FMSUdORURfT0tfNCkKKyNpZiAhKExaT19PUFRfVU5BTElHTkVEMzIpCiAgICAgICAgICAgICBpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgUFRSX0FMSUdORUQyXzQob3AsbV9wb3MpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFzc2VydCgob3AgLSBtX3BvcykgPj0gNCk7CkBAIC00MTE3LDEwICs1OTY5LDEwIEBACiAgICAgICAgICAgICBpZiAodCA+PSAyICogNCAtICgzIC0gMSkgJiYgKG9wIC0gbV9wb3MpID49IDQpCiAgICAgICAgICAgICB7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBDT1BZNChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgVUFfQ09QWTQob3AsbV9wb3MpOwogICAgICAgICAgICAgICAgIG9wICs9IDQ7IG1fcG9zICs9IDQ7IHQgLT0gNCAtICgzIC0gMSk7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBDT1BZNChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLG1fcG9zKTsKICAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgbV9wb3MgKz0gNDsgdCAtPSA0OwogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gNCk7CiAgICAgICAgICAgICAgICAgaWYgKHQgPiAwKSBkbyAqb3ArKyA9ICptX3BvcysrOyB3aGlsZSAoLS10ID4gMCk7CkBAIC00MTQ1LDcgKzU5OTcsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiBtYXRjaF9uZXh0OgotICAgICAgICAgICAgYXNzZXJ0KHQgPiAwKTsgYXNzZXJ0KHQgPCA0KTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzEpOworICAgICAgICAgICAgYXNzZXJ0KHQgPiAwKTsgYXNzZXJ0KHQgPCA0KTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzMpOwogI2lmIDAKICAgICAgICAgICAgIGRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKICNlbHNlCkBAIC00MTUzLDE2ICs2MDA1LDEwIEBACiAgICAgICAgICAgICBpZiAodCA+IDEpIHsgKm9wKysgPSAqaXArKzsgaWYgKHQgPiAyKSB7ICpvcCsrID0gKmlwKys7IH0gfQogI2VuZGlmCiAgICAgICAgICAgICB0ID0gKmlwKys7Ci0gICAgICAgIH0gd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCk7CisgICAgICAgIH0KICAgICB9CiAKLSNpZiBkZWZpbmVkKEhBVkVfVEVTVF9JUCkgfHwgZGVmaW5lZChIQVZFX1RFU1RfT1ApCi0gICAgKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKLSAgICByZXR1cm4gTFpPX0VfRU9GX05PVF9GT1VORDsKLSNlbmRpZgotCiBlb2ZfZm91bmQ6Ci0gICAgYXNzZXJ0KHQgPT0gMSk7CiAgICAgKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKICAgICByZXR1cm4gKGlwID09IGlwX2VuZCA/IExaT19FX09LIDoKICAgICAgICAgICAgKGlwIDwgaXBfZW5kICA/IExaT19FX0lOUFVUX05PVF9DT05TVU1FRCA6IExaT19FX0lOUFVUX09WRVJSVU4pKTsKQEAgLTQxODksNCArNjAzNSwzIEBACiAjZW5kaWYKIAogLyoqKioqIEVuZCBvZiBtaW5pbHpvLmMgKioqKiovCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9taW5pbHpvLmggYi9jb21tb24vbWluaWx6by5oCmluZGV4IGJkOGFkNjUuLmZkMmZiMzIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9taW5pbHpvLmgKKysrIGIvY29tbW9uL21pbmlsem8uaApAQCAtMiwyMSArMiw3IEBACiAKICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KIAotICAgQ29weXJpZ2h0IChDKSAyMDEwIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwOSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMjAwMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgotICAgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKLSAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDksNyArMzUsNyBAQAogI2lmbmRlZiBfX01JTklMWk9fSAogI2RlZmluZSBfX01JTklMWk9fSCAxCiAKLSNkZWZpbmUgTUlOSUxaT19WRVJTSU9OICAgICAgICAgMHgyMDQwCisjZGVmaW5lIE1JTklMWk9fVkVSU0lPTiAgICAgICAgIDB4MjA3MAogCiAjaWZkZWYgX19MWk9DT05GX0gKICMgIGVycm9yICJ5b3UgY2Fubm90IHVzZSBib3RoIExaTyBhbmQgbWluaUxaTyIKQEAgLTc3LDcgKzYzLDcgQEAKICAqLwogCiAjZGVmaW5lIExaTzFYX01FTV9DT01QUkVTUyAgICAgIExaTzFYXzFfTUVNX0NPTVBSRVNTCi0jZGVmaW5lIExaTzFYXzFfTUVNX0NPTVBSRVNTICAgICgobHpvX3VpbnQzMikgKDE2Mzg0TCAqIGx6b19zaXplb2ZfZGljdF90KSkKKyNkZWZpbmUgTFpPMVhfMV9NRU1fQ09NUFJFU1MgICAgKChsem9fdWludDMyX3QpICgxNjM4NEwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCiAjZGVmaW5lIExaTzFYX01FTV9ERUNPTVBSRVNTICAgICgwKQogCiAKZGlmZiAtLWdpdCBhL2NvbW1vbi90dXJib2pwZWcuYyBiL2NvbW1vbi90dXJib2pwZWcuYwppbmRleCBmN2I5MjQ1Li4wOWRmMTczIDEwMDY0NAotLS0gYS9jb21tb24vdHVyYm9qcGVnLmMKKysrIGIvY29tbW9uL3R1cmJvanBlZy5jCkBAIC01MDIsOSArNTAyLDExIEBACiAJaWYod2lkdGg8MSB8fCBoZWlnaHQ8MSB8fCBqcGVnU3Vic2FtcDwwIHx8IGpwZWdTdWJzYW1wPj1OVU1TVUJPUFQpCiAJCV90aHJvdygidGpCdWZTaXplKCk6IEludmFsaWQgYXJndW1lbnQiKTsKIAotCS8vIFRoaXMgYWxsb3dzIGZvciByYXJlIGNvcm5lciBjYXNlcyBpbiB3aGljaCBhIEpQRUcgaW1hZ2UgY2FuIGFjdHVhbGx5IGJlCi0JLy8gbGFyZ2VyIHRoYW4gdGhlIHVuY29tcHJlc3NlZCBpbnB1dCAod2Ugd291bGRuJ3QgbWVudGlvbiBpdCBpZiBpdCBoYWRuJ3QKLQkvLyBoYXBwZW5lZCBiZWZvcmUuKQorCS8qCisJICogVGhpcyBhbGxvd3MgZm9yIHJhcmUgY29ybmVyIGNhc2VzIGluIHdoaWNoIGEgSlBFRyBpbWFnZSBjYW4gYWN0dWFsbHkgYmUKKwkgKiBsYXJnZXIgdGhhbiB0aGUgdW5jb21wcmVzc2VkIGlucHV0ICh3ZSB3b3VsZG4ndCBtZW50aW9uIGl0IGlmIGl0IGhhZG4ndAorCSAqIGhhcHBlbmVkIGJlZm9yZS4pCisJICovCiAJbWN1dz10ak1DVVdpZHRoW2pwZWdTdWJzYW1wXTsKIAltY3VoPXRqTUNVSGVpZ2h0W2pwZWdTdWJzYW1wXTsKIAljaHJvbWFzZj1qcGVnU3Vic2FtcD09VEpTQU1QX0dSQVk/IDA6IDQqNjQvKG1jdXcqbWN1aCk7CkBAIC01MjEsOSArNTIzLDExIEBACiAJaWYod2lkdGg8MSB8fCBoZWlnaHQ8MSkKIAkJX3Rocm93KCJUSkJVRlNJWkUoKTogSW52YWxpZCBhcmd1bWVudCIpOwogCi0JLy8gVGhpcyBhbGxvd3MgZm9yIHJhcmUgY29ybmVyIGNhc2VzIGluIHdoaWNoIGEgSlBFRyBpbWFnZSBjYW4gYWN0dWFsbHkgYmUKLQkvLyBsYXJnZXIgdGhhbiB0aGUgdW5jb21wcmVzc2VkIGlucHV0ICh3ZSB3b3VsZG4ndCBtZW50aW9uIGl0IGlmIGl0IGhhZG4ndAotCS8vIGhhcHBlbmVkIGJlZm9yZS4pCisJLyoKKwkgKiBUaGlzIGFsbG93cyBmb3IgcmFyZSBjb3JuZXIgY2FzZXMgaW4gd2hpY2ggYSBKUEVHIGltYWdlIGNhbiBhY3R1YWxseSBiZQorCSAqIGxhcmdlciB0aGFuIHRoZSB1bmNvbXByZXNzZWQgaW5wdXQgKHdlIHdvdWxkbid0IG1lbnRpb24gaXQgaWYgaXQgaGFkbid0CisJICogaGFwcGVuZWQgYmVmb3JlLikKKwkgKi8KIAlyZXR2YWw9UEFEKHdpZHRoLCAxNikgKiBQQUQoaGVpZ2h0LCAxNikgKiA2ICsgMjA0ODsKIAogCWJhaWxvdXQ6CmRpZmYgLS1naXQgYS9jb21tb24vdm5jYXV0aC5jIGIvY29tbW9uL3ZuY2F1dGguYwppbmRleCA4MmMxYjY4Li4wYjIwZjUzIDEwMDY0NAotLS0gYS9jb21tb24vdm5jYXV0aC5jCisrKyBiL2NvbW1vbi92bmNhdXRoLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpZmRlZiBfX1NUUklDVF9BTlNJX18KICNkZWZpbmUgX0JTRF9TT1VSQ0UKICNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMAogI2VuZGlmCiAjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2NvbXBhdC9tc3ZjL3N0ZGludC5oIGIvY29tcGF0L21zdmMvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzNmJiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9tc3ZjL3N0ZGludC5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLyBJU08gQzl4ICBjb21wbGlhbnQgc3RkaW50LmggZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvCisvLyBCYXNlZCBvbiBJU08vSUVDIDk4OTk6VEMyIENvbW1pdHRlZSBkcmFmdCAoTWF5IDYsIDIwMDUpIFdHMTQvTjExMjQgCisvLyAKKy8vICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBBbGV4YW5kZXIgQ2hlbWVyaXMKKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisvLyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKy8vIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKy8vIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworLy8gT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIAorLy8gV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKy8vIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKy8vIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8gCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZm5kZWYgX01TQ19WRVIgLy8gWworI2Vycm9yICJVc2UgdGhpcyBoZWFkZXIgb25seSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVycyEiCisjZW5kaWYgLy8gX01TQ19WRVIgXQorCisjaWZuZGVmIF9NU0NfU1RESU5UX0hfIC8vIFsKKyNkZWZpbmUgX01TQ19TVERJTlRfSF8KKworI2lmIF9NU0NfVkVSID4gMTAwMAorI3ByYWdtYSBvbmNlCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvLyBGb3IgVmlzdWFsIFN0dWRpbyA2IGluIEMrKyBtb2RlIGFuZCBmb3IgbWFueSBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zIHdoZW4KKy8vIGNvbXBpbGluZyBmb3IgQVJNIHdlIHNob3VsZCB3cmFwIDx3Y2hhci5oPiBpbmNsdWRlIHdpdGggJ2V4dGVybiAiQysrIiB7fScKKy8vIG9yIGNvbXBpbGVyIGdpdmUgbWFueSBlcnJvcnMgbGlrZSB0aGlzOgorLy8gICBlcnJvciBDMjczMzogc2Vjb25kIEMgbGlua2FnZSBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uICd3bWVtY2hyJyBub3QgYWxsb3dlZAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorIyAgaW5jbHVkZSA8d2NoYXIuaD4KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIERlZmluZSBfVzY0IG1hY3JvcyB0byBtYXJrIHR5cGVzIGNoYW5naW5nIHRoZWlyIHNpemUsIGxpa2UgaW50cHRyX3QuCisjaWZuZGVmIF9XNjQKKyMgIGlmICFkZWZpbmVkKF9fbWlkbCkgJiYgKGRlZmluZWQoX1g4Nl8pIHx8IGRlZmluZWQoX01fSVg4NikpICYmIF9NU0NfVkVSID49IDEzMDAKKyMgICAgIGRlZmluZSBfVzY0IF9fdzY0CisjICBlbHNlCisjICAgICBkZWZpbmUgX1c2NAorIyAgZW5kaWYKKyNlbmRpZgorCisKKy8vIDcuMTguMSBJbnRlZ2VyIHR5cGVzCisKKy8vIDcuMTguMS4xIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMKKworLy8gVmlzdWFsIFN0dWRpbyA2IGFuZCBFbWJlZGRlZCBWaXN1YWwgQysrIDQgZG9lc24ndAorLy8gcmVhbGl6ZSB0aGF0LCBlLmcuIGNoYXIgaGFzIHRoZSBzYW1lIHNpemUgYXMgX19pbnQ4CisvLyBzbyB3ZSBnaXZlIHVwIG9uIF9faW50WCBmb3IgdGhlbS4KKyNpZiAoX01TQ19WRVIgPCAxMzAwKQorICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICBpbnQ4X3Q7CisgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgIGludDE2X3Q7CisgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGludDMyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIHVpbnQ4X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgIHVpbnQxNl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICB1aW50MzJfdDsKKyNlbHNlCisgICB0eXBlZGVmIF9faW50OCAgICAgICAgICAgIGludDhfdDsKKyAgIHR5cGVkZWYgX19pbnQxNiAgICAgICAgICAgaW50MTZfdDsKKyAgIHR5cGVkZWYgX19pbnQzMiAgICAgICAgICAgaW50MzJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICAgdWludDhfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiAgdWludDE2X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgIHVpbnQzMl90OworI2VuZGlmCit0eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgIHVpbnQ2NF90OworCisKKy8vIDcuMTguMS4yIE1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwordHlwZWRlZiBpbnQ4X3QgICAgaW50X2xlYXN0OF90OwordHlwZWRlZiBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwordHlwZWRlZiB1aW50OF90ICAgdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgdWludDE2X3QgIHVpbnRfbGVhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdCAgdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICB1aW50X2xlYXN0NjRfdDsKKworLy8gNy4xOC4xLjMgRmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKK3R5cGVkZWYgaW50OF90ICAgIGludF9mYXN0OF90OwordHlwZWRlZiBpbnQxNl90ICAgaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnQzMl90ICAgaW50X2Zhc3QzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwordHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICB1aW50X2Zhc3Q2NF90OworCisvLyA3LjE4LjEuNCBJbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2YgaG9sZGluZyBvYmplY3QgcG9pbnRlcnMKKyNpZmRlZiBfV0lONjQgLy8gWworICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICBpbnRwdHJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgdWludHB0cl90OworI2Vsc2UgLy8gX1dJTjY0IF1bCisgICB0eXBlZGVmIF9XNjQgaW50ICAgICAgICAgICAgICAgaW50cHRyX3Q7CisgICB0eXBlZGVmIF9XNjQgdW5zaWduZWQgaW50ICAgICAgdWludHB0cl90OworI2VuZGlmIC8vIF9XSU42NCBdCisKKy8vIDcuMTguMS41IEdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMKK3R5cGVkZWYgaW50NjRfdCAgIGludG1heF90OwordHlwZWRlZiB1aW50NjRfdCAgdWludG1heF90OworCisKKy8vIDcuMTguMiBMaW1pdHMgb2Ygc3BlY2lmaWVkLXdpZHRoIGludGVnZXIgdHlwZXMKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpIC8vIFsgICBTZWUgZm9vdG5vdGUgMjIwIGF0IHBhZ2UgMjU3IGFuZCBmb290bm90ZSAyMjEgYXQgcGFnZSAyNTkKKworLy8gNy4xOC4yLjEgTGltaXRzIG9mIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UOF9NSU4gICAgICgoaW50OF90KV9JOF9NSU4pCisjZGVmaW5lIElOVDhfTUFYICAgICBfSThfTUFYCisjZGVmaW5lIElOVDE2X01JTiAgICAoKGludDE2X3QpX0kxNl9NSU4pCisjZGVmaW5lIElOVDE2X01BWCAgICBfSTE2X01BWAorI2RlZmluZSBJTlQzMl9NSU4gICAgKChpbnQzMl90KV9JMzJfTUlOKQorI2RlZmluZSBJTlQzMl9NQVggICAgX0kzMl9NQVgKKyNkZWZpbmUgSU5UNjRfTUlOICAgICgoaW50NjRfdClfSTY0X01JTikKKyNkZWZpbmUgSU5UNjRfTUFYICAgIF9JNjRfTUFYCisjZGVmaW5lIFVJTlQ4X01BWCAgICBfVUk4X01BWAorI2RlZmluZSBVSU5UMTZfTUFYICAgX1VJMTZfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICBfVUkzMl9NQVgKKyNkZWZpbmUgVUlOVDY0X01BWCAgIF9VSTY0X01BWAorCisvLyA3LjE4LjIuMiBMaW1pdHMgb2YgbWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVF9MRUFTVDhfTUlOICAgIElOVDhfTUlOCisjZGVmaW5lIElOVF9MRUFTVDhfTUFYICAgIElOVDhfTUFYCisjZGVmaW5lIElOVF9MRUFTVDE2X01JTiAgIElOVDE2X01JTgorI2RlZmluZSBJTlRfTEVBU1QxNl9NQVggICBJTlQxNl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICAgSU5UMzJfTUlOCisjZGVmaW5lIElOVF9MRUFTVDMyX01BWCAgIElOVDMyX01BWAorI2RlZmluZSBJTlRfTEVBU1Q2NF9NSU4gICBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q4X01BWCAgIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMTZfTUFYICBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVggIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDY0X01BWCAgVUlOVDY0X01BWAorCisvLyA3LjE4LjIuMyBMaW1pdHMgb2YgZmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTiAgICBJTlQ4X01JTgorI2RlZmluZSBJTlRfRkFTVDhfTUFYICAgIElOVDhfTUFYCisjZGVmaW5lIElOVF9GQVNUMTZfTUlOICAgSU5UMTZfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYICAgSU5UMTZfTUFYCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOICAgSU5UMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYICAgSU5UMzJfTUFYCisjZGVmaW5lIElOVF9GQVNUNjRfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUNjRfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYICAgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWCAgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UX0ZBU1QzMl9NQVggIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUNjRfTUFYICBVSU5UNjRfTUFYCisKKy8vIDcuMTguMi40IExpbWl0cyBvZiBpbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2YgaG9sZGluZyBvYmplY3QgcG9pbnRlcnMKKyNpZmRlZiBfV0lONjQgLy8gWworIyAgZGVmaW5lIElOVFBUUl9NSU4gICBJTlQ2NF9NSU4KKyMgIGRlZmluZSBJTlRQVFJfTUFYICAgSU5UNjRfTUFYCisjICBkZWZpbmUgVUlOVFBUUl9NQVggIFVJTlQ2NF9NQVgKKyNlbHNlIC8vIF9XSU42NCBdWworIyAgZGVmaW5lIElOVFBUUl9NSU4gICBJTlQzMl9NSU4KKyMgIGRlZmluZSBJTlRQVFJfTUFYICAgSU5UMzJfTUFYCisjICBkZWZpbmUgVUlOVFBUUl9NQVggIFVJTlQzMl9NQVgKKyNlbmRpZiAvLyBfV0lONjQgXQorCisvLyA3LjE4LjIuNSBMaW1pdHMgb2YgZ3JlYXRlc3Qtd2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlRNQVhfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVE1BWF9NQVggICBJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVE1BWF9NQVggIFVJTlQ2NF9NQVgKKworLy8gNy4xOC4zIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzCisKKyNpZmRlZiBfV0lONjQgLy8gWworIyAgZGVmaW5lIFBUUkRJRkZfTUlOICBfSTY0X01JTgorIyAgZGVmaW5lIFBUUkRJRkZfTUFYICBfSTY0X01BWAorI2Vsc2UgIC8vIF9XSU42NCBdWworIyAgZGVmaW5lIFBUUkRJRkZfTUlOICBfSTMyX01JTgorIyAgZGVmaW5lIFBUUkRJRkZfTUFYICBfSTMyX01BWAorI2VuZGlmICAvLyBfV0lONjQgXQorCisjZGVmaW5lIFNJR19BVE9NSUNfTUlOICBJTlRfTUlOCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYICBJTlRfTUFYCisKKyNpZm5kZWYgU0laRV9NQVggLy8gWworIyAgaWZkZWYgX1dJTjY0IC8vIFsKKyMgICAgIGRlZmluZSBTSVpFX01BWCAgX1VJNjRfTUFYCisjICBlbHNlIC8vIF9XSU42NCBdWworIyAgICAgZGVmaW5lIFNJWkVfTUFYICBfVUkzMl9NQVgKKyMgIGVuZGlmIC8vIF9XSU42NCBdCisjZW5kaWYgLy8gU0laRV9NQVggXQorCisvLyBXQ0hBUl9NSU4gYW5kIFdDSEFSX01BWCBhcmUgYWxzbyBkZWZpbmVkIGluIDx3Y2hhci5oPgorI2lmbmRlZiBXQ0hBUl9NSU4gLy8gWworIyAgZGVmaW5lIFdDSEFSX01JTiAgMAorI2VuZGlmICAvLyBXQ0hBUl9NSU4gXQorI2lmbmRlZiBXQ0hBUl9NQVggLy8gWworIyAgZGVmaW5lIFdDSEFSX01BWCAgX1VJMTZfTUFYCisjZW5kaWYgIC8vIFdDSEFSX01BWCBdCisKKyNkZWZpbmUgV0lOVF9NSU4gIDAKKyNkZWZpbmUgV0lOVF9NQVggIF9VSTE2X01BWAorCisjZW5kaWYgLy8gX19TVERDX0xJTUlUX01BQ1JPUyBdCisKKworLy8gNy4xOC40IExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKSAvLyBbICAgU2VlIGZvb3Rub3RlIDIyNCBhdCBwYWdlIDI2MAorCisvLyA3LjE4LjQuMSBNYWNyb3MgZm9yIG1pbmltdW0td2lkdGggaW50ZWdlciBjb25zdGFudHMKKworI2RlZmluZSBJTlQ4X0ModmFsKSAgdmFsIyNpOAorI2RlZmluZSBJTlQxNl9DKHZhbCkgdmFsIyNpMTYKKyNkZWZpbmUgSU5UMzJfQyh2YWwpIHZhbCMjaTMyCisjZGVmaW5lIElOVDY0X0ModmFsKSB2YWwjI2k2NAorCisjZGVmaW5lIFVJTlQ4X0ModmFsKSAgdmFsIyN1aTgKKyNkZWZpbmUgVUlOVDE2X0ModmFsKSB2YWwjI3VpMTYKKyNkZWZpbmUgVUlOVDMyX0ModmFsKSB2YWwjI3VpMzIKKyNkZWZpbmUgVUlOVDY0X0ModmFsKSB2YWwjI3VpNjQKKworLy8gNy4xOC40LjIgTWFjcm9zIGZvciBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIGNvbnN0YW50cworI2RlZmluZSBJTlRNQVhfQyAgIElOVDY0X0MKKyNkZWZpbmUgVUlOVE1BWF9DICBVSU5UNjRfQworCisjZW5kaWYgLy8gX19TVERDX0NPTlNUQU5UX01BQ1JPUyBdCisKKworI2VuZGlmIC8vIF9NU0NfU1RESU5UX0hfIF0KZGlmZiAtLWdpdCBhL2NvbXBhdC9tc3ZjL3N5cy90aW1lLmggYi9jb21wYXQvbXN2Yy9zeXMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDcwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvbXN2Yy9zeXMvdGltZS5oCkBAIC0wLDAgKzEsNjQgQEAKKyNwcmFnbWEgb25jZQorCisvL2h0dHA6Ly9zb2NpYWwubXNkbi5taWNyb3NvZnQuY29tL0ZvcnVtcy9lbi92Y2dlbmVyYWwvdGhyZWFkLzQzMDQ0OWIzLWY2ZGQtNGUxOC04NGRlLWVlYmQyNmE4ZDY2OAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKKyAgI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgIDExNjQ0NDczNjAwMDAwMDAwVWk2NAorI2Vsc2UKKyAgI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgIDExNjQ0NDczNjAwMDAwMDAwVUxMCisjZW5kaWYKKworc3RydWN0IHRpbWVzcGVjIHsKKwordGltZV90IHR2X3NlYzsgLyogU2Vjb25kcyBzaW5jZSAwMDowMDowMCBHTVQsICovCisKKy8qIDEgSmFudWFyeSAxOTcwICovCisKK2xvbmcgdHZfbnNlYzsgLyogQWRkaXRpb25hbCBuYW5vc2Vjb25kcyBzaW5jZSAqLworCisvKiB0dl9zZWMgKi8KKworfTsKKworc3RydWN0IHRpbWV6b25lCit7CisgIGludCAgdHpfbWludXRlc3dlc3Q7IC8qIG1pbnV0ZXMgVyBvZiBHcmVlbndpY2ggKi8KKyAgaW50ICB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworfTsKKworc3RhdGljIF9faW5saW5lIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQoreworICBGSUxFVElNRSBmdDsKKyAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMgPSAwOworICBzdGF0aWMgaW50IHR6ZmxhZzsKKworICBpZiAoTlVMTCAhPSB0dikKKyAgeworICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7CisKKyAgICB0bXByZXMgfD0gZnQuZHdIaWdoRGF0ZVRpbWU7CisgICAgdG1wcmVzIDw8PSAzMjsKKyAgICB0bXByZXMgfD0gZnQuZHdMb3dEYXRlVGltZTsKKworICAgIC8qY29udmVydGluZyBmaWxlIHRpbWUgdG8gdW5peCBlcG9jaCovCisgICAgdG1wcmVzIC09IERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUzsKKyAgICB0di0+dHZfc2VjID0gKGxvbmcpKHRtcHJlcyAvIDEwMDAwMDBVTCk7CisgICAgdHYtPnR2X3VzZWMgPSAobG9uZykodG1wcmVzICUgMTAwMDAwMFVMKTsKKyAgfQorCisgIGlmIChOVUxMICE9IHR6KQorICB7CisgICAgaWYgKCF0emZsYWcpCisgICAgeworICAgICAgX3R6c2V0KCk7CisgICAgICB0emZsYWcrKzsKKyAgICB9CisgICAgdHotPnR6X21pbnV0ZXN3ZXN0ID0gX3RpbWV6b25lIC8gNjA7CisgICAgdHotPnR6X2RzdHRpbWUgPSBfZGF5bGlnaHQ7CisgIH0KKworICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21wYXQvbXN2Yy91bmlzdGQuaCBiL2NvbXBhdC9tc3ZjL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWI0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvbXN2Yy91bmlzdGQuaApAQCAtMCwwICsxLDMgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvY29tcGlsZSBiL2NvbXBpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2MmExNGUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0jISAvYmluL3NoCi0jIFdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCAnLWMgLW8nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMTItMDMtMDUuMTM7ICMgVVRDCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA5LCAyMDEwLCAyMDEyIEZyZWUKLSMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0Ci0jIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KLSMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCi0KLW5sPScKLScKLQotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCB0b29scyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHdoaXRlc3BhY2UgdXNhZ2UuCi1JRlM9IiAiIgkkbmwiCi0KLWZpbGVfY29udj0KLQotIyBmdW5jX2ZpbGVfY29udiBidWlsZF9maWxlIGxhenkKLSMgQ29udmVydCBhICRidWlsZCBmaWxlIHRvICRob3N0IGZvcm0gYW5kIHN0b3JlIGl0IGluICRmaWxlCi0jIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIFdpbmRvd3MgaG9zdHMuIElmIHRoZSBkZXRlcm1pbmVkIGNvbnZlcnNpb24KLSMgdHlwZSBpcyBsaXN0ZWQgaW4gKHRoZSBjb21tYSBzZXBhcmF0ZWQpIExBWlksIG5vIGNvbnZlcnNpb24gd2lsbAotIyB0YWtlIHBsYWNlLgotZnVuY19maWxlX2NvbnYgKCkKLXsKLSAgZmlsZT0kMQotICBjYXNlICRmaWxlIGluCi0gICAgLyB8IC9bIS9dKikgIyBhYnNvbHV0ZSBmaWxlLCBhbmQgbm90IGEgVU5DIGZpbGUKLSAgICAgIGlmIHRlc3QgLXogIiRmaWxlX2NvbnYiOyB0aGVuCi0JIyBsYXppbHkgZGV0ZXJtaW5lIGhvdyB0byBjb252ZXJ0IGFicyBmaWxlcwotCWNhc2UgYHVuYW1lIC1zYCBpbgotCSAgTUlOR1cqKQotCSAgICBmaWxlX2NvbnY9bWluZ3cKLQkgICAgOzsKLQkgIENZR1dJTiopCi0JICAgIGZpbGVfY29udj1jeWd3aW4KLQkgICAgOzsKLQkgICopCi0JICAgIGZpbGVfY29udj13aW5lCi0JICAgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGNhc2UgJGZpbGVfY29udi8sJDIsIGluCi0JKiwkZmlsZV9jb252LCopCi0JICA7OwotCW1pbmd3LyopCi0JICBmaWxlPWBjbWQgLy9DIGVjaG8gIiRmaWxlICIgfCBzZWQgLWUgJ3MvIlwoLipcKSAiICokL1wxLydgCi0JICA7OwotCWN5Z3dpbi8qKQotCSAgZmlsZT1gY3lncGF0aCAtbSAiJGZpbGUiIHx8IGVjaG8gIiRmaWxlImAKLQkgIDs7Ci0Jd2luZS8qKQotCSAgZmlsZT1gd2luZXBhdGggLXcgIiRmaWxlIiB8fCBlY2hvICIkZmlsZSJgCi0JICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgZXNhYwotfQotCi0jIGZ1bmNfY2xfZGFzaEwgbGlua2RpcgotIyBNYWtlIGNsIGxvb2sgZm9yIGxpYnJhcmllcyBpbiBMSU5LRElSCi1mdW5jX2NsX2Rhc2hMICgpCi17Ci0gIGZ1bmNfZmlsZV9jb252ICIkMSIKLSAgaWYgdGVzdCAteiAiJGxpYl9wYXRoIjsgdGhlbgotICAgIGxpYl9wYXRoPSRmaWxlCi0gIGVsc2UKLSAgICBsaWJfcGF0aD0iJGxpYl9wYXRoOyRmaWxlIgotICBmaQotICBsaW5rZXJfb3B0cz0iJGxpbmtlcl9vcHRzIC1MSUJQQVRIOiRmaWxlIgotfQotCi0jIGZ1bmNfY2xfZGFzaGwgbGlicmFyeQotIyBEbyBhIGxpYnJhcnkgc2VhcmNoLXBhdGggbG9va3VwIGZvciBjbAotZnVuY19jbF9kYXNobCAoKQotewotICBsaWI9JDEKLSAgZm91bmQ9bm8KLSAgc2F2ZV9JRlM9JElGUwotICBJRlM9JzsnCi0gIGZvciBkaXIgaW4gJGxpYl9wYXRoICRMSUIKLSAgZG8KLSAgICBJRlM9JHNhdmVfSUZTCi0gICAgaWYgJHNoYXJlZCAmJiB0ZXN0IC1mICIkZGlyLyRsaWIuZGxsLmxpYiI7IHRoZW4KLSAgICAgIGZvdW5kPXllcwotICAgICAgbGliPSRkaXIvJGxpYi5kbGwubGliCi0gICAgICBicmVhawotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAiJGRpci8kbGliLmxpYiI7IHRoZW4KLSAgICAgIGZvdW5kPXllcwotICAgICAgbGliPSRkaXIvJGxpYi5saWIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9JHNhdmVfSUZTCi0KLSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KLSAgICBsaWI9JGxpYi5saWIKLSAgZmkKLX0KLQotIyBmdW5jX2NsX3dyYXBwZXIgY2wgYXJnLi4uCi0jIEFkanVzdCBjb21waWxlIGNvbW1hbmQgdG8gc3VpdCBjbAotZnVuY19jbF93cmFwcGVyICgpCi17Ci0gICMgQXNzdW1lIGEgY2FwYWJsZSBzaGVsbAotICBsaWJfcGF0aD0KLSAgc2hhcmVkPToKLSAgbGlua2VyX29wdHM9Ci0gIGZvciBhcmcKLSAgZG8KLSAgICBpZiB0ZXN0IC1uICIkZWF0IjsgdGhlbgotICAgICAgZWF0PQotICAgIGVsc2UKLSAgICAgIGNhc2UgJDEgaW4KLQktbykKLQkgICMgY29uZmlndXJlIG1pZ2h0IGNob29zZSB0byBydW4gY29tcGlsZSBhcyAnY29tcGlsZSBjYyAtbyBmb28gZm9vLmMnLgotCSAgZWF0PTEKLQkgIGNhc2UgJDIgaW4KLQkgICAgKi5vIHwgKi5bb09dW2JCXVtqSl0pCi0JICAgICAgZnVuY19maWxlX2NvbnYgIiQyIgotCSAgICAgIHNldCB4ICIkQCIgLUZvIiRmaWxlIgotCSAgICAgIHNoaWZ0Ci0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBmdW5jX2ZpbGVfY29udiAiJDIiCi0JICAgICAgc2V0IHggIiRAIiAtRmUiJGZpbGUiCi0JICAgICAgc2hpZnQKLQkgICAgICA7OwotCSAgZXNhYwotCSAgOzsKLQktSSkKLQkgIGVhdD0xCi0JICBmdW5jX2ZpbGVfY29udiAiJDIiIG1pbmd3Ci0JICBzZXQgeCAiJEAiIC1JIiRmaWxlIgotCSAgc2hpZnQKLQkgIDs7Ci0JLUkqKQotCSAgZnVuY19maWxlX2NvbnYgIiR7MSMtSX0iIG1pbmd3Ci0JICBzZXQgeCAiJEAiIC1JIiRmaWxlIgotCSAgc2hpZnQKLQkgIDs7Ci0JLWwpCi0JICBlYXQ9MQotCSAgZnVuY19jbF9kYXNobCAiJDIiCi0JICBzZXQgeCAiJEAiICIkbGliIgotCSAgc2hpZnQKLQkgIDs7Ci0JLWwqKQotCSAgZnVuY19jbF9kYXNobCAiJHsxIy1sfSIKLQkgIHNldCB4ICIkQCIgIiRsaWIiCi0JICBzaGlmdAotCSAgOzsKLQktTCkKLQkgIGVhdD0xCi0JICBmdW5jX2NsX2Rhc2hMICIkMiIKLQkgIDs7Ci0JLUwqKQotCSAgZnVuY19jbF9kYXNoTCAiJHsxIy1MfSIKLQkgIDs7Ci0JLXN0YXRpYykKLQkgIHNoYXJlZD1mYWxzZQotCSAgOzsKLQktV2wsKikKLQkgIGFyZz0kezEjLVdsLH0KLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCSAgZm9yIGZsYWcgaW4gJGFyZzsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGxpbmtlcl9vcHRzPSIkbGlua2VyX29wdHMgJGZsYWciCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIDs7Ci0JLVhsaW5rZXIpCi0JICBlYXQ9MQotCSAgbGlua2VyX29wdHM9IiRsaW5rZXJfb3B0cyAkMiIKLQkgIDs7Ci0JLSopCi0JICBzZXQgeCAiJEAiICIkMSIKLQkgIHNoaWZ0Ci0JICA7OwotCSouY2MgfCAqLkNDIHwgKi5jeHggfCAqLkNYWCB8ICouW2NDXSsrKQotCSAgZnVuY19maWxlX2NvbnYgIiQxIgotCSAgc2V0IHggIiRAIiAtVHAiJGZpbGUiCi0JICBzaGlmdAotCSAgOzsKLQkqLmMgfCAqLmNwcCB8ICouQ1BQIHwgKi5saWIgfCAqLkxJQiB8ICouTGliIHwgKi5PQkogfCAqLm9iaiB8ICouW29PXSkKLQkgIGZ1bmNfZmlsZV9jb252ICIkMSIgbWluZ3cKLQkgIHNldCB4ICIkQCIgIiRmaWxlIgotCSAgc2hpZnQKLQkgIDs7Ci0JKikKLQkgIHNldCB4ICIkQCIgIiQxIgotCSAgc2hpZnQKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICBzaGlmdAotICBkb25lCi0gIGlmIHRlc3QgLW4gIiRsaW5rZXJfb3B0cyI7IHRoZW4KLSAgICBsaW5rZXJfb3B0cz0iLWxpbmskbGlua2VyX29wdHMiCi0gIGZpCi0gIGV4ZWMgIiRAIiAkbGlua2VyX29wdHMKLSAgZXhpdCAxCi19Ci0KLWVhdD0KLQotY2FzZSAkMSBpbgotICAnJykKLSAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgJyQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBjb21waWxlIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCAnLWMgLW8nLgotUmVtb3ZlICctbyBkZXN0Lm8nIGZyb20gQVJHUywgcnVuIFBST0dSQU0gd2l0aCB0aGUgcmVtYWluaW5nCi1hcmd1bWVudHMsIGFuZCByZW5hbWUgdGhlIG91dHB1dCBhcyBleHBlY3RlZC4KLQotSWYgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB3aG9sZSBwYWNrYWdlIHRoaXMgaXMgbm90IHRoZQotcmlnaHQgc2NyaXB0IHRvIHJ1bjogcGxlYXNlIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGZpbGUgJ0lOU1RBTEwnLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAkPwotICAgIDs7Ci0gIC12IHwgLS12KikKLSAgICBlY2hvICJjb21waWxlICRzY3JpcHR2ZXJzaW9uIgotICAgIGV4aXQgJD8KLSAgICA7OwotICBjbCB8ICpbL1xcXWNsIHwgY2wuZXhlIHwgKlsvXFxdY2wuZXhlICkKLSAgICBmdW5jX2NsX3dyYXBwZXIgIiRAIiAgICAgICMgRG9lc24ndCByZXR1cm4uLi4KLSAgICA7OwotZXNhYwotCi1vZmlsZT0KLWNmaWxlPQotCi1mb3IgYXJnCi1kbwotICBpZiB0ZXN0IC1uICIkZWF0IjsgdGhlbgotICAgIGVhdD0KLSAgZWxzZQotICAgIGNhc2UgJDEgaW4KLSAgICAgIC1vKQotCSMgY29uZmlndXJlIG1pZ2h0IGNob29zZSB0byBydW4gY29tcGlsZSBhcyAnY29tcGlsZSBjYyAtbyBmb28gZm9vLmMnLgotCSMgU28gd2Ugc3RyaXAgJy1vIGFyZycgb25seSBpZiBhcmcgaXMgYW4gb2JqZWN0LgotCWVhdD0xCi0JY2FzZSAkMiBpbgotCSAgKi5vIHwgKi5vYmopCi0JICAgIG9maWxlPSQyCi0JICAgIDs7Ci0JICAqKQotCSAgICBzZXQgeCAiJEAiIC1vICIkMiIKLQkgICAgc2hpZnQKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgICouYykKLQljZmlsZT0kMQotCXNldCB4ICIkQCIgIiQxIgotCXNoaWZ0Ci0JOzsKLSAgICAgICopCi0Jc2V0IHggIiRAIiAiJDEiCi0Jc2hpZnQKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgc2hpZnQKLWRvbmUKLQotaWYgdGVzdCAteiAiJG9maWxlIiB8fCB0ZXN0IC16ICIkY2ZpbGUiOyB0aGVuCi0gICMgSWYgbm8gJy1vJyBvcHRpb24gd2FzIHNlZW4gdGhlbiB3ZSBtaWdodCBoYXZlIGJlZW4gaW52b2tlZCBmcm9tIGEKLSAgIyBwYXR0ZXJuIHJ1bGUgd2hlcmUgd2UgZG9uJ3QgbmVlZCBvbmUuICBUaGF0IGlzIG9rIC0tIHRoaXMgaXMgYQotICAjIG5vcm1hbCBjb21waWxhdGlvbiB0aGF0IHRoZSBsb3NpbmcgY29tcGlsZXIgY2FuIGhhbmRsZS4gIElmIG5vCi0gICMgJy5jJyBmaWxlIHdhcyBzZWVuIHRoZW4gd2UgYXJlIHByb2JhYmx5IGxpbmtpbmcuICBUaGF0IGlzIGFsc28KLSAgIyBvay4KLSAgZXhlYyAiJEAiCi1maQotCi0jIE5hbWUgb2YgZmlsZSB3ZSBleHBlY3QgY29tcGlsZXIgdG8gY3JlYXRlLgotY29maWxlPWBlY2hvICIkY2ZpbGUiIHwgc2VkICdzfF4uKltcXC9dfHw7IHN8XlthLXpBLVpdOnx8OyBzL1wuYyQvLm8vJ2AKLQotIyBDcmVhdGUgdGhlIGxvY2sgZGlyZWN0b3J5LgotIyBOb3RlOiB1c2UgJ1svXFw6Li1dJyBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgc2FtZSBuYW1lCi0jIHRoYXQgd2UgYXJlIHVzaW5nIGZvciB0aGUgLm8gZmlsZS4gIEFsc28sIGJhc2UgdGhlIG5hbWUgb24gdGhlIGV4cGVjdGVkCi0jIG9iamVjdCBmaWxlIG5hbWUsIHNpbmNlIHRoYXQgaXMgd2hhdCBtYXR0ZXJzIHdpdGggYSBwYXJhbGxlbCBidWlsZC4KLWxvY2tkaXI9YGVjaG8gIiRjb2ZpbGUiIHwgc2VkIC1lICdzfFsvXFw6Li1dfF98ZydgLmQKLXdoaWxlIHRydWU7IGRvCi0gIGlmIG1rZGlyICIkbG9ja2RpciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYnJlYWsKLSAgZmkKLSAgc2xlZXAgMQotZG9uZQotIyBGSVhNRTogcmFjZSBjb25kaXRpb24gaGVyZSBpZiB1c2VyIGtpbGxzIGJldHdlZW4gbWtkaXIgYW5kIHRyYXAuCi10cmFwICJybWRpciAnJGxvY2tkaXInOyBleGl0IDEiIDEgMiAxNQotCi0jIFJ1biB0aGUgY29tcGlsZS4KLSIkQCIKLXJldD0kPwotCi1pZiB0ZXN0IC1mICIkY29maWxlIjsgdGhlbgotICB0ZXN0ICIkY29maWxlIiA9ICIkb2ZpbGUiIHx8IG12ICIkY29maWxlIiAiJG9maWxlIgotZWxpZiB0ZXN0IC1mICIke2NvZmlsZX1iaiI7IHRoZW4KLSAgdGVzdCAiJHtjb2ZpbGV9YmoiID0gIiRvZmlsZSIgfHwgbXYgIiR7Y29maWxlfWJqIiAiJG9maWxlIgotZmkKLQotcm1kaXIgIiRsb2NrZGlyIgotZXhpdCAkcmV0Ci0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOiBzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246IDIKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKLSMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWcuZ3Vlc3MgYi9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2MjJhNDQuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmd1ZXNzCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0jISAvYmluL3NoCi0jIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAotIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCi0jICAgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDEyLTAyLTEwJwotCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gIFBsZWFzZSBzZW5kIHBhdGNoZXMgKGNvbnRleHQKLSMgZGlmZiBmb3JtYXQpIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBhbmQgaW5jbHVkZSBhIENoYW5nZUxvZwotIyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgotIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0KLQotT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCi0KLU9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKLTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgotICAgICAgIGV4aXQgMSA7OwotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0gIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICBleGl0IDEKLWZpCi0KLXRyYXAgJ2V4aXQgMScgMSAyIDE1Ci0KLSMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKLSMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKLSMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQotIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgotCi0jIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCi0jIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCi0KLSMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KLQotc2V0X2NjX2Zvcl9idWlsZD0nCi10cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKLXRyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Ci06ICR7VE1QRElSPS90bXB9IDsKLSB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8Ci0geyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKLSB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKLSB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7Ci1kdW1teT0kdG1wL2R1bW15IDsKLXRtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOwotY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOwotCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KLQkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7Ci0JICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKLQkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKLQkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OwotCSAgICBzaDVlbCkgbWFjaGluZT1zaDVsZS11bmtub3duIDs7Ci0JICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKLQllc2FjCi0JIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCi0JIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JCQl8IGdyZXAgLXEgX19FTEZfXwotCQl0aGVuCi0JCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCi0JCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KLQkJICAgIG9zPW5ldGJzZAotCQllbHNlCi0JCSAgICBvcz1uZXRic2RlbGYKLQkJZmkKLQkJOzsKLQkgICAgKikKLQkJb3M9bmV0YnNkCi0JCTs7Ci0JZXNhYwotCSMgVGhlIE9TIHJlbGVhc2UKLQkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAotCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKLQkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCi0JIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCi0JY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KLQkgICAgRGViaWFuKikKLQkJcmVsZWFzZT0nLWdudScKLQkJOzsKLQkgICAgKikKLQkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQkJOzsKLQllc2FjCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKLQllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6ZWtrb0JTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpTb2xpZEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpNaXJCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgotCSo0LjApCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JCTs7Ci0JKjUuKikKLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKLQkJOzsKLQllc2FjCi0JIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KLQkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAotCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKLQkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KLQlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCi0JY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgotCSAgICAiRVY0ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNC41ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OwotCSAgICAiRVY1ICgyMTE2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKLQkgICAgIkVWNS42ICgyMTE2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OwotCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKLQkgICAgIkVWNS43ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7Ci0JICAgICJFVjYgKDIxMjY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OwotCSAgICAiRVY2LjcgKDIxMjY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7Ci0JICAgICJFVjYuOENCICgyMTI2NEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKLQkgICAgIkVWNyAoMjEzNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7Ci0JICAgICJFVjcuOSAoMjEzNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKLQllc2FjCi0JIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCSMgUmVzZXQgRVhJVCB0cmFwIGJlZm9yZSBleGl0aW5nIHRvIGF2b2lkIHNwdXJpb3VzIG5vbi16ZXJvIGV4aXQgY29kZS4KLQlleGl0Y29kZT0kPwotCXRyYXAgJycgMAotCWV4aXQgJGV4aXRjb2RlIDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCA7OwotICAgICo6ei9WTToqOiopCi0JZWNobyBzMzkwLWlibS16dm1vZQotCWV4aXQgOzsKLSAgICAqOk9TNDAwOio6KikKLQllY2hvIHBvd2VycGMtaWJtLW9zNDAwCi0JZXhpdCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQotCWVjaG8gYXJtLXVua25vd24tcmlzY29zCi0JZXhpdCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCA7OwotICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQotCWVjaG8gc3BhcmMtaWNsLW54NgotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCi0JY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCi0JICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgczM5MHg6U3VuT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICBpODZwYzpBdXJvcmFVWDo1Lio6KiB8IGk4NnhlbjpBdXJvcmFVWDo1Lio6KikKLQllY2hvIGkzODYtcGMtYXVyb3JhdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlTVU5fQVJDSD0iaTM4NiIKLQkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KLQkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCi0JIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgotCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgotCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAotCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAotCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAotCSAgICB0aGVuCi0JCVNVTl9BUkNIPSJ4ODZfNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0JZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLQllY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCi0JZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQotCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCi0JICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgotCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCi0JICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLQkjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotCVVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCA7OwotICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQotCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCA7OwotICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKLQkJdGhlbgotCQkJZWNobyAiJFNZU1RFTV9OQU1FIgotCQllbHNlCi0JCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQkJZmkKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOls0NTY3XSkKLQlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX0FSQ0g9cnM2MDAwCi0JZWxzZQotCQlJQk1fQVJDSD1wb3dlcnBjCi0JZmkKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCA7OwotICAgICo6QUlYOio6KikKLQllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCA7OwotICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCi0JZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCi0gICAgKjpCT1NYOio6KikKLQllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDs7Ci0gICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKLQllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgOzsKLSAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDs7Ci0gICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OwotCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQotCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgotCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCi0JCSAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLQkJICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgotCQkgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKLQkJICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0JCSAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAotCQkJY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCi0JCQkgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKLQkJCSAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OwotCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCi0JCQllc2FjIDs7Ci0JCSAgICBlc2FjCi0JCWZpCi0JCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgotCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQkgICAgc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0KLQkJI2RlZmluZSBfSFBVWF9TT1VSQ0UKLQkJI2luY2x1ZGUgPHN0ZGxpYi5oPgotCQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLQkJaW50IG1haW4gKCkKLQkJewotCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0JCSAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7Ci0JCSNlbmRpZgotCQkgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQotCQkgICAgc3dpdGNoIChjcHUpCi0JCQl7Ci0JCQljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLQkJCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotCQkJY2FzZSBDUFVfUEFfUklTQzJfMDoKLQkJI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotCQkJICAgIHN3aXRjaCAoYml0cykKLQkJCQl7Ci0JCQkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOwotCQkJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKLQkJCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLQkJCQl9IGJyZWFrOwotCQkjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLwotCQkJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotCQkjZW5kaWYKLQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotCQkJfQotCQkgICAgZXhpdCAoMCk7Ci0JCX0KLUVPRgotCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKLQkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKLQkJZmkgOzsKLQllc2FjCi0JaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCi0JdGhlbgotCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0KLQkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKLQkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCi0JICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6Ci0JICAgICMKLQkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcwotCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMwotCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcwotCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKLQotCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8Ci0JCWdyZXAgLXEgX19MUDY0X18KLQkgICAgdGhlbgotCQlIUF9BUkNIPSJocHBhMi4wdyIKLQkgICAgZWxzZQotCQlIUF9BUkNIPSJocHBhNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCA7OwotICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlQzRToqOio6KikKLQllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgKjpVTklDT1MvbXA6KjoqKQotCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0JRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0JRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLQllY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgOzsKLSAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotCUZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCi0JZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgc3BhcmMqOkJTRC9PUzoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCVVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JY2FzZSAke1VOQU1FX1BST0NFU1NPUn0gaW4KLQkgICAgYW1kNjQpCi0JCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQkgICAgKikKLQkJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDs7Ci0gICAgKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjpNU1lTKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc3lzCi0JZXhpdCA7OwotICAgIGkqOndpbmRvd3MzMio6KikKLQkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCi0JZXhpdCA7OwotICAgIGkqOlBXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCi0JZXhpdCA7OwotICAgICo6SW50ZXJpeCo6KikKLQljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KLQkgICAgeDg2KQotCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQkJZXhpdCA7OwotCSAgICBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwgfCBFTTY0VCkKLQkJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQotCQlleGl0IDs7Ci0JICAgIElBNjQpCi0JCWVjaG8gaWE2NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JCWV4aXQgOzsKLQllc2FjIDs7Ci0gICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQotCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCi0JZXhpdCA7OwotICAgIDg2NjQ6V2luZG93c19OVDoqKQotCWVjaG8geDg2XzY0LXBjLW1rcwotCWV4aXQgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/Ci0JZWNobyBpNTg2LXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgOzsKLSAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgotCWV4aXQgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICAqOkdOVToqOiopCi0JIyB0aGUgR05VIHN5c3RlbQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgOzsKLSAgICBpKjg2Ok1pbml4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKLQlleGl0IDs7Ci0gICAgYWFyY2g2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGFhcmNoNjRfYmU6TGludXg6KjoqKQotCVVOQU1FX01BQ0hJTkU9YWFyY2g2NF9iZQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotCWVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXwotCXRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZWxzZQotCSAgICBpZiBlY2hvIF9fQVJNX1BDU19WRlAgfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQl8IGdyZXAgLXEgX19BUk1fUENTX1ZGUAotCSAgICB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmkKLQkgICAgZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpaGYKLQkgICAgZmkKLQlmaQotCWV4aXQgOzsKLSAgICBhdnIzMio6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgY3Jpc3YzMjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWF4aXMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGZydjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGhleGFnb246TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQlMSUJDPWdudQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpZmRlZiBfX2RpZXRsaWJjX18KLQlMSUJDPWRpZXRsaWJjCi0JI2VuZGlmCi1FT0YKLQlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkxJQkMnYAotCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKLQlleGl0IDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG0zMnIqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbTY4KjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG1pcHM6TGludXg6KjoqIHwgbWlwczY0OkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmICR7VU5BTUVfTUFDSElORX0KLQkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfWVsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKLQlDUFU9JHtVTkFNRV9NQUNISU5FfWVsCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQotCUNQVT0ke1VOQU1FX01BQ0hJTkV9Ci0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkNQVSdgCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KLQk7OwotICAgIG9yMzI6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwYWRyZTpMaW51eDoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKLQkjIExvb2sgZm9yIENQVSBsZXZlbAotCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCi0JICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OwotCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgOzsKLSAgICBzaDY0KjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB0aWxlKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHZheDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeHRlbnNhKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCi0JIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KLQkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCi0JIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotCSMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLQkjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0JIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLQkjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgOzsKLSAgICBpKjg2Ok9TLzI6KjoqKQotCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5Ci0JIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKLQlleGl0IDs7Ci0gICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCi0JZXhpdCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDs7Ci0gICAgaSo4NjpzeWxsYWJsZToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCi0JZXhpdCA7OwotICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC5bMDJdKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgaSo4NjoqRE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDs7Ci0gICAgaSo4NjoqOjU6WzY3OF0qKQotCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCA7OwotICAgIHBjOio6KjoqKQotCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgotCSMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0JIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KLQkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCi0JIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0Ci0JIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCi0JZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKLQlleGl0IDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQotCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDs7Ci0gICAgTTY4KjoqOlIzVls1Njc4XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7Ci0gICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9Ci0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7Ci0gICAgTkNSKjoqOjQuMjoqIHwgTVBSQVMqOio6NC4yOiopCi0JT1NfUkVMPScuMycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkgICAgJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIHB0ZXJvbiA+L2Rldi9udWxsIFwKLQkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LlswMl0qOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDs7Ci0gICAgUEVOVElVTToqOjQuMCo6KikJIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLQkJCSMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLQllY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQotCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KLQkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KLQllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAotCWV4aXQgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCA7OwotICAgIGkqODY6Vk9TOio6KikKLQkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKLQlleGl0IDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgOzsKLSAgICBtYzY4KjpBL1VYOio6KikKLQllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBuZXdzKjpORVdTLU9TOjYqOiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkJZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkJZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgOzsKLSAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWJlLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCi0JZXhpdCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVQQzpIYWlrdToqOiopCSMgSGFpa3UgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgotCWVjaG8gaTU4Ni1wYy1oYWlrdQotCWV4aXQgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNTpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTY6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC03OlNVUEVSLVVYOio6KikKLQllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtODpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLThSOlNVUEVSLVVYOio6KikKLQllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFBvd2VyKjpSaGFwc29keToqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RGFyd2luOio6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgotCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgotCSAgICBpMzg2KQotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgotCQkgIGlmIChlY2hvICcjaWZkZWYgX19MUDY0X18nOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAotCQkgICAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAotCQkgICAgICBncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAotCQkgIHRoZW4KLQkJICAgICAgVU5BTUVfUFJPQ0VTU09SPSJ4ODZfNjQiCi0JCSAgZmkKLQkJZmkgOzsKLQkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAotCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KLQkJVU5BTUVfUFJPQ0VTU09SPWkzODYKLQkJVU5BTUVfTUFDSElORT1wYwotCWZpCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlFOWDoqOjQqKQotCWVjaG8gaTM4Ni1wYy1xbngKLQlleGl0IDs7Ci0gICAgTkVPLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbmVvLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgOzsKLSAgICBCUzIwMDA6UE9TSVgqOio6KikKLQllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKLQlleGl0IDs7Ci0gICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgOzsKLSAgICAqOlRPUFMtMTA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKLQlleGl0IDs7Ci0gICAgKjpURU5FWDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRlbmV4Ci0JZXhpdCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCA7OwotICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC14a2wtdG9wczIwCi0JZXhpdCA7OwotICAgICo6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAotCWV4aXQgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgOzsKLSAgICBTRUk6KjoqOlNFSVVYKQotCWVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RHJhZ29uRmx5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCA7OwotICAgICo6KlZNUzoqOiopCi0JVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7Ci0JICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OwotCWVzYWMgOzsKLSAgICAqOlhFTklYOio6U3lzVikKLQllY2hvIGkzODYtcGMteGVuaXgKLQlleGl0IDs7Ci0gICAgaSo4Njpza3lvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJwotCWV4aXQgOzsKLSAgICBpKjg2OnJkb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCi0JZXhpdCA7OwotICAgIGkqODY6QVJPUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKLQlleGl0IDs7Ci0gICAgeDg2XzY0OlZNa2VybmVsOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1lc3gKLQlleGl0IDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1ldmFsICRzZXRfY2NfZm9yX2J1aWxkCi1jYXQgPiRkdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0JIjQiCi0jZWxzZQotCSIiCi0jZW5kaWYKLQkpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBpZiAodmVyc2lvbiA8IDQpCi0gICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotIyBpZiAhZGVmaW5lZCAodWx0cml4KQotIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICBpZiBkZWZpbmVkIChCU0QpCi0jICAgaWYgQlNEID09IDQzCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOwotIyAgIGVsc2UKLSMgICAgaWYgQlNEID09IDE5OTAwNgotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVsc2UKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgZW5kaWYKLSMgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCi0JeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0OyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGVzYWMKLWZpCi0KLWNhdCA+JjIgPDxFT0YKLSQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKLQotVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKLXRoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKLWRvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQotCi0gIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAotYW5kCi0gIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWcubG9nIGIvY29uZmlnLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNzAyYi4uMDAwMDAwMAotLS0gYS9jb25maWcubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzI0NyArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLQotSXQgd2FzIGNyZWF0ZWQgYnkgTGliVk5DU2VydmVyIGNvbmZpZ3VyZSAwLjkuOSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICAkIC4vY29uZmlndXJlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQotCi0jIyAtLS0tLS0tLS0gIyMKLSMjIFBsYXRmb3JtLiAjIwotIyMgLS0tLS0tLS0tICMjCi0KLWhvc3RuYW1lID0gYW5kcm9pZC1kZXYKLXVuYW1lIC1tID0geDg2XzY0Ci11bmFtZSAtciA9IDMuMTMtMC5icG8uMS1hbWQ2NAotdW5hbWUgLXMgPSBMaW51eAotdW5hbWUgLXYgPSAjMSBTTVAgRGViaWFuIDMuMTMuNy0xfmJwbzcwKzEgKDIwMTQtMDMtMjkpCi0KLS91c3IvYmluL3VuYW1lIC1wID0gdW5rbm93bgotL2Jpbi91bmFtZSAtWCAgICAgPSB1bmtub3duCi0KLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSB1bmtub3duCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gdW5rbm93bgotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IHVua25vd24KLS91c3IvYmluL2hvc3RpbmZvICAgICAgPSB1bmtub3duCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gdW5rbm93bgotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IHVua25vd24KLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSB1bmtub3duCi0KLVBBVEg6IC9ob21lL3Nhbi9iaW4KLVBBVEg6IC9ob21lL3Nhbi9iaW4KLVBBVEg6IC91c3IvbG9jYWwvYmluCi1QQVRIOiAvdXNyL2JpbgotUEFUSDogL2JpbgotUEFUSDogL3Vzci9sb2NhbC9nYW1lcwotUEFUSDogL3Vzci9nYW1lcwotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwKLWNvbmZpZ3VyZToyOTA3OiByZXN1bHQ6IC91c3IvYmluL2luc3RhbGwgLWMKLWNvbmZpZ3VyZToyOTE4OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUKLWNvbmZpZ3VyZToyOTY4OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjMxMDk6IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wCi1jb25maWd1cmU6MzE0ODogcmVzdWx0OiAvYmluL21rZGlyIC1wCi1jb25maWd1cmU6MzE2MTogY2hlY2tpbmcgZm9yIGdhd2sKLWNvbmZpZ3VyZTozMTkxOiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MzE2MTogY2hlY2tpbmcgZm9yIG1hd2sKLWNvbmZpZ3VyZTozMTc3OiBmb3VuZCAvdXNyL2Jpbi9tYXdrCi1jb25maWd1cmU6MzE4ODogcmVzdWx0OiBtYXdrCi1jb25maWd1cmU6MzE5OTogY2hlY2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKQotY29uZmlndXJlOjMyMjE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MzMxMjogY2hlY2tpbmcgd2hldGhlciBtYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXMKLWNvbmZpZ3VyZTozMzI5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjMzOTc6IGNoZWNraW5nIGZvciBnY2MKLWNvbmZpZ3VyZTozNDEzOiBmb3VuZCAvdXNyL2Jpbi9nY2MKLWNvbmZpZ3VyZTozNDI0OiByZXN1bHQ6IGdjYwotY29uZmlndXJlOjM2NTM6IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24KLWNvbmZpZ3VyZTozNjYyOiBnY2MgLS12ZXJzaW9uID4mNQotZ2NjIChEZWJpYW4gNC43LjItNSkgNC43LjIKLUNvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotY29uZmlndXJlOjM2NzM6ICQ/ID0gMAotY29uZmlndXJlOjM2NjI6IGdjYyAtdiA+JjUKLVVzaW5nIGJ1aWx0LWluIHNwZWNzLgotQ09MTEVDVF9HQ0M9Z2NjCi1DT0xMRUNUX0xUT19XUkFQUEVSPS91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy9sdG8td3JhcHBlcgotVGFyZ2V0OiB4ODZfNjQtbGludXgtZ251Ci1Db25maWd1cmVkIHdpdGg6IC4uL3NyYy9jb25maWd1cmUgLXYgLS13aXRoLXBrZ3ZlcnNpb249J0RlYmlhbiA0LjcuMi01JyAtLXdpdGgtYnVndXJsPWZpbGU6Ly8vdXNyL3NoYXJlL2RvYy9nY2MtNC43L1JFQURNRS5CdWdzIC0tZW5hYmxlLWxhbmd1YWdlcz1jLGMrKyxnbyxmb3J0cmFuLG9iamMsb2JqLWMrKyAtLXByZWZpeD0vdXNyIC0tcHJvZ3JhbS1zdWZmaXg9LTQuNyAtLWVuYWJsZS1zaGFyZWQgLS1lbmFibGUtbGlua2VyLWJ1aWxkLWlkIC0td2l0aC1zeXN0ZW0temxpYiAtLWxpYmV4ZWNkaXI9L3Vzci9saWIgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgLS1lbmFibGUtdGhyZWFkcz1wb3NpeCAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyPS91c3IvaW5jbHVkZS9jKysvNC43IC0tbGliZGlyPS91c3IvbGliIC0tZW5hYmxlLW5scyAtLXdpdGgtc3lzcm9vdD0vIC0tZW5hYmxlLWNsb2NhbGU9Z251IC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1ZyAtLWVuYWJsZS1saWJzdGRjeHgtdGltZT15ZXMgLS1lbmFibGUtZ251LXVuaXF1ZS1vYmplY3QgLS1lbmFibGUtcGx1Z2luIC0tZW5hYmxlLW9iamMtZ2MgLS13aXRoLWFyY2gtMzI9aTU4NiAtLXdpdGgtdHVuZT1nZW5lcmljIC0tZW5hYmxlLWNoZWNraW5nPXJlbGVhc2UgLS1idWlsZD14ODZfNjQtbGludXgtZ251IC0taG9zdD14ODZfNjQtbGludXgtZ251IC0tdGFyZ2V0PXg4Nl82NC1saW51eC1nbnUKLVRocmVhZCBtb2RlbDogcG9zaXgKLWdjYyB2ZXJzaW9uIDQuNy4yIChEZWJpYW4gNC43LjItNSkgCi1jb25maWd1cmU6MzY3MzogJD8gPSAwCi1jb25maWd1cmU6MzY2MjogZ2NjIC1WID4mNQotZ2NjOiBlcnJvcjogdW5yZWNvZ25pemVkIGNvbW1hbmQgbGluZSBvcHRpb24gJy1WJwotZ2NjOiBmYXRhbCBlcnJvcjogbm8gaW5wdXQgZmlsZXMKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MzY3MzogJD8gPSA0Ci1jb25maWd1cmU6MzY2MjogZ2NjIC1xdmVyc2lvbiA+JjUKLWdjYzogZXJyb3I6IHVucmVjb2duaXplZCBjb21tYW5kIGxpbmUgb3B0aW9uICctcXZlcnNpb24nCi1nY2M6IGZhdGFsIGVycm9yOiBubyBpbnB1dCBmaWxlcwotY29tcGlsYXRpb24gdGVybWluYXRlZC4KLWNvbmZpZ3VyZTozNjczOiAkPyA9IDQKLWNvbmZpZ3VyZTozNjkzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzCi1jb25maWd1cmU6MzcxNTogZ2NjICAgIGNvbmZ0ZXN0LmMgID4mNQotY29uZmlndXJlOjM3MTk6ICQ/ID0gMAotY29uZmlndXJlOjM3Njc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6Mzc3MDogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lCi1jb25maWd1cmU6Mzc3MjogcmVzdWx0OiBhLm91dAotY29uZmlndXJlOjM3Nzg6IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMKLWNvbmZpZ3VyZTozNzg1OiBnY2MgLW8gY29uZnRlc3QgICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6Mzc4OTogJD8gPSAwCi1jb25maWd1cmU6MzgxMTogcmVzdWx0OiAKLWNvbmZpZ3VyZTozODMzOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcKLWNvbmZpZ3VyZTozODQxOiBnY2MgLW8gY29uZnRlc3QgICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6Mzg0NTogJD8gPSAwCi1jb25maWd1cmU6Mzg1MjogLi9jb25mdGVzdAotY29uZmlndXJlOjM4NTY6ICQ/ID0gMAotY29uZmlndXJlOjM4NzE6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTozODc2OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcwotY29uZmlndXJlOjM4OTg6IGdjYyAtYyAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MzkwMjogJD8gPSAwCi1jb25maWd1cmU6MzkyMzogcmVzdWx0OiBvCi1jb25maWd1cmU6MzkyNzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyCi1jb25maWd1cmU6Mzk0NjogZ2NjIC1jICAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTozOTQ2OiAkPyA9IDAKLWNvbmZpZ3VyZTozOTU1OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjM5NjQ6IGNoZWNraW5nIHdoZXRoZXIgZ2NjIGFjY2VwdHMgLWcKLWNvbmZpZ3VyZTozOTg0OiBnY2MgLWMgLWcgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6Mzk4NDogJD8gPSAwCi1jb25maWd1cmU6NDAyNTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo0MDQyOiBjaGVja2luZyBmb3IgZ2NjIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OQotY29uZmlndXJlOjQxMDU6IGdjYyAgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjQxMDU6ICQ/ID0gMAotY29uZmlndXJlOjQxMTg6IHJlc3VsdDogbm9uZSBuZWVkZWQKLWNvbmZpZ3VyZTo0MTQ5OiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5IG1ha2UKLWNvbmZpZ3VyZTo0MTc3OiByZXN1bHQ6IEdOVQotY29uZmlndXJlOjQyMDM6IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgZ2NjCi1jb25maWd1cmU6NDMxNDogcmVzdWx0OiBnY2MzCi1jb25maWd1cmU6NDMzMDogY2hlY2tpbmcgd2hldGhlciBnY2MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyCi1jb25maWd1cmU6NDM2MTogZ2NjIC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QyLm8gPiY1Ci1jb25maWd1cmU6NDM2NTogJD8gPSAwCi1jb25maWd1cmU6NDM3MTogZ2NjIC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QyLm8gPiY1Ci1jb25maWd1cmU6NDM3NTogJD8gPSAwCi1jb25maWd1cmU6NDM4NjogY2MgLWMgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo0MzkwOiAkPyA9IDAKLWNvbmZpZ3VyZTo0Mzk4OiBjYyAtYyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0Mi5vID4mNQotY29uZmlndXJlOjQ0MDI6ICQ/ID0gMAotY29uZmlndXJlOjQ0MDg6IGNjIC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QyLm8gPiY1Ci1jb25maWd1cmU6NDQxMjogJD8gPSAwCi1jb25maWd1cmU6NDQzMDogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo0NDYxOiBjaGVja2luZyB3aGV0aGVyIG1ha2Ugc2V0cyAkKE1BS0UpCi1jb25maWd1cmU6NDQ4MzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo0NTcwOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZQotY29uZmlndXJlOjQ1ODQ6IHJlc3VsdDogeDg2XzY0LXVua25vd24tbGludXgtZ251Ci1jb25maWd1cmU6NDYwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZQotY29uZmlndXJlOjQ2MTc6IHJlc3VsdDogeDg2XzY0LXVua25vd24tbGludXgtZ251Ci1jb25maWd1cmU6NDYzNzogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Ci1jb25maWd1cmU6NDY5MTogcmVzdWx0OiAvYmluL3NlZAotY29uZmlndXJlOjQ2OTQ6IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZQotY29uZmlndXJlOjQ3NTI6IHJlc3VsdDogL2Jpbi9ncmVwCi1jb25maWd1cmU6NDc1NzogY2hlY2tpbmcgZm9yIGVncmVwCi1jb25maWd1cmU6NDgxOTogcmVzdWx0OiAvYmluL2dyZXAgLUUKLWNvbmZpZ3VyZTo0ODM1OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBnY2MKLWNvbmZpZ3VyZTo0OTAyOiByZXN1bHQ6IC91c3IvYmluL2xkCi1jb25maWd1cmU6NDkwOTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoL3Vzci9iaW4vbGQpIGlzIEdOVSBsZAotY29uZmlndXJlOjQ5MjQ6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NDkyOTogY2hlY2tpbmcgZm9yIC91c3IvYmluL2xkIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzCi1jb25maWd1cmU6NDkzNjogcmVzdWx0OiAtcgotY29uZmlndXJlOjQ5NTQ6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubQotY29uZmlndXJlOjUwMDM6IHJlc3VsdDogL3Vzci9iaW4vbm0gLUIKLWNvbmZpZ3VyZTo1MDA3OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzCi1jb25maWd1cmU6NTAxMTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo1MDE4OiBjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXMKLWNvbmZpZ3VyZTo1MTk0OiByZXN1bHQ6IHBhc3NfYWxsCi1jb25maWd1cmU6NTI4MjogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1Mjg1OiAkPyA9IDAKLWNvbmZpZ3VyZTo1NjgxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvcgotY29uZmlndXJlOjU3MTI6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjU3MTI6ICQ/ID0gMAotY29uZmlndXJlOjU3MjY6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZnRlc3QuYzoxMToyODogZmF0YWwgZXJyb3I6IGFjX25vbmV4aXN0ZW50Lmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6NTcyNjogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1jb25maWd1cmU6NTc1MTogcmVzdWx0OiBnY2MgLUUKLWNvbmZpZ3VyZTo1NzcxOiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZpZ3VyZTo1NzcxOiAkPyA9IDAKLWNvbmZpZ3VyZTo1Nzg1OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZ0ZXN0LmM6MTE6Mjg6IGZhdGFsIGVycm9yOiBhY19ub25leGlzdGVudC5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Ci1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjU3ODU6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotY29uZmlndXJlOjU4MTQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzCi1jb25maWd1cmU6NTgzNDogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1ODM0OiAkPyA9IDAKLWNvbmZpZ3VyZTo1OTA3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6NTkwNzogJD8gPSAwCi1jb25maWd1cmU6NTkwNzogLi9jb25mdGVzdAotY29uZmlndXJlOjU5MDc6ICQ/ID0gMAotY29uZmlndXJlOjU5MTg6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NTkzMTogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oCi1jb25maWd1cmU6NTkzMTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1OTMxOiAkPyA9IDAKLWNvbmZpZ3VyZTo1OTMxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjU5MzE6IGNoZWNraW5nIGZvciBzeXMvc3RhdC5oCi1jb25maWd1cmU6NTkzMTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1OTMxOiAkPyA9IDAKLWNvbmZpZ3VyZTo1OTMxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjU5MzE6IGNoZWNraW5nIGZvciBzdGRsaWIuaAotY29uZmlndXJlOjU5MzE6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6NTkzMTogJD8gPSAwCi1jb25maWd1cmU6NTkzMTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo1OTMxOiBjaGVja2luZyBmb3Igc3RyaW5nLmgKLWNvbmZpZ3VyZTo1OTMxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjU5MzE6ICQ/ID0gMAotY29uZmlndXJlOjU5MzE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NTkzMTogY2hlY2tpbmcgZm9yIG1lbW9yeS5oCi1jb25maWd1cmU6NTkzMTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1OTMxOiAkPyA9IDAKLWNvbmZpZ3VyZTo1OTMxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjU5MzE6IGNoZWNraW5nIGZvciBzdHJpbmdzLmgKLWNvbmZpZ3VyZTo1OTMxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjU5MzE6ICQ/ID0gMAotY29uZmlndXJlOjU5MzE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NTkzMTogY2hlY2tpbmcgZm9yIGludHR5cGVzLmgKLWNvbmZpZ3VyZTo1OTMxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjU5MzE6ICQ/ID0gMAotY29uZmlndXJlOjU5MzE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NTkzMTogY2hlY2tpbmcgZm9yIHN0ZGludC5oCi1jb25maWd1cmU6NTkzMTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo1OTMxOiAkPyA9IDAKLWNvbmZpZ3VyZTo1OTMxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjU5MzE6IGNoZWNraW5nIGZvciB1bmlzdGQuaAotY29uZmlndXJlOjU5MzE6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6NTkzMTogJD8gPSAwCi1jb25maWd1cmU6NTkzMTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo1OTQ1OiBjaGVja2luZyBkbGZjbi5oIHVzYWJpbGl0eQotY29uZmlndXJlOjU5NDU6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6NTk0NTogJD8gPSAwCi1jb25maWd1cmU6NTk0NTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo1OTQ1OiBjaGVja2luZyBkbGZjbi5oIHByZXNlbmNlCi1jb25maWd1cmU6NTk0NTogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25maWd1cmU6NTk0NTogJD8gPSAwCi1jb25maWd1cmU6NTk0NTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo1OTQ1OiBjaGVja2luZyBmb3IgZGxmY24uaAotY29uZmlndXJlOjU5NDU6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6NjAxMzogY2hlY2tpbmcgZm9yIGcrKwotY29uZmlndXJlOjYwMjk6IGZvdW5kIC91c3IvYmluL2crKwotY29uZmlndXJlOjYwNDA6IHJlc3VsdDogZysrCi1jb25maWd1cmU6NjA2NzogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uCi1jb25maWd1cmU6NjA3NjogZysrIC0tdmVyc2lvbiA+JjUKLWcrKyAoRGViaWFuIDQuNy4yLTUpIDQuNy4yCi1Db3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLWNvbmZpZ3VyZTo2MDg3OiAkPyA9IDAKLWNvbmZpZ3VyZTo2MDc2OiBnKysgLXYgPiY1Ci1Vc2luZyBidWlsdC1pbiBzcGVjcy4KLUNPTExFQ1RfR0NDPWcrKwotQ09MTEVDVF9MVE9fV1JBUFBFUj0vdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvbHRvLXdyYXBwZXIKLVRhcmdldDogeDg2XzY0LWxpbnV4LWdudQotQ29uZmlndXJlZCB3aXRoOiAuLi9zcmMvY29uZmlndXJlIC12IC0td2l0aC1wa2d2ZXJzaW9uPSdEZWJpYW4gNC43LjItNScgLS13aXRoLWJ1Z3VybD1maWxlOi8vL3Vzci9zaGFyZS9kb2MvZ2NjLTQuNy9SRUFETUUuQnVncyAtLWVuYWJsZS1sYW5ndWFnZXM9YyxjKyssZ28sZm9ydHJhbixvYmpjLG9iai1jKysgLS1wcmVmaXg9L3VzciAtLXByb2dyYW0tc3VmZml4PS00LjcgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLWxpbmtlci1idWlsZC1pZCAtLXdpdGgtc3lzdGVtLXpsaWIgLS1saWJleGVjZGlyPS91c3IvbGliIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IC0tZW5hYmxlLXRocmVhZHM9cG9zaXggLS13aXRoLWd4eC1pbmNsdWRlLWRpcj0vdXNyL2luY2x1ZGUvYysrLzQuNyAtLWxpYmRpcj0vdXNyL2xpYiAtLWVuYWJsZS1ubHMgLS13aXRoLXN5c3Jvb3Q9LyAtLWVuYWJsZS1jbG9jYWxlPWdudSAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWcgLS1lbmFibGUtbGlic3RkY3h4LXRpbWU9eWVzIC0tZW5hYmxlLWdudS11bmlxdWUtb2JqZWN0IC0tZW5hYmxlLXBsdWdpbiAtLWVuYWJsZS1vYmpjLWdjIC0td2l0aC1hcmNoLTMyPWk1ODYgLS13aXRoLXR1bmU9Z2VuZXJpYyAtLWVuYWJsZS1jaGVja2luZz1yZWxlYXNlIC0tYnVpbGQ9eDg2XzY0LWxpbnV4LWdudSAtLWhvc3Q9eDg2XzY0LWxpbnV4LWdudSAtLXRhcmdldD14ODZfNjQtbGludXgtZ251Ci1UaHJlYWQgbW9kZWw6IHBvc2l4Ci1nY2MgdmVyc2lvbiA0LjcuMiAoRGViaWFuIDQuNy4yLTUpIAotY29uZmlndXJlOjYwODc6ICQ/ID0gMAotY29uZmlndXJlOjYwNzY6IGcrKyAtViA+JjUKLWcrKzogZXJyb3I6IHVucmVjb2duaXplZCBjb21tYW5kIGxpbmUgb3B0aW9uICctVicKLWcrKzogZmF0YWwgZXJyb3I6IG5vIGlucHV0IGZpbGVzCi1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjYwODc6ICQ/ID0gNAotY29uZmlndXJlOjYwNzY6IGcrKyAtcXZlcnNpb24gPiY1Ci1nKys6IGVycm9yOiB1bnJlY29nbml6ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAnLXF2ZXJzaW9uJwotZysrOiBmYXRhbCBlcnJvcjogbm8gaW5wdXQgZmlsZXMKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6NjA4NzogJD8gPSA0Ci1jb25maWd1cmU6NjA5MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIKLWNvbmZpZ3VyZTo2MTEwOiBnKysgLWMgICBjb25mdGVzdC5jcHAgPiY1Ci1jb25maWd1cmU6NjExMDogJD8gPSAwCi1jb25maWd1cmU6NjExOTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo2MTI4OiBjaGVja2luZyB3aGV0aGVyIGcrKyBhY2NlcHRzIC1nCi1jb25maWd1cmU6NjE0ODogZysrIC1jIC1nICBjb25mdGVzdC5jcHAgPiY1Ci1jb25maWd1cmU6NjE0ODogJD8gPSAwCi1jb25maWd1cmU6NjE4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZTo2MjE0OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIGcrKwotY29uZmlndXJlOjYzMjU6IHJlc3VsdDogZ2NjMwotY29uZmlndXJlOjYzNTA6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IKLWNvbmZpZ3VyZTo2Mzc3OiBnKysgLUUgIGNvbmZ0ZXN0LmNwcAotY29uZmlndXJlOjYzNzc6ICQ/ID0gMAotY29uZmlndXJlOjYzOTE6IGcrKyAtRSAgY29uZnRlc3QuY3BwCi1jb25mdGVzdC5jcHA6MjI6Mjg6IGZhdGFsIGVycm9yOiBhY19ub25leGlzdGVudC5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Ci1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjYzOTE6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotY29uZmlndXJlOjY0MTY6IHJlc3VsdDogZysrIC1FCi1jb25maWd1cmU6NjQzNjogZysrIC1FICBjb25mdGVzdC5jcHAKLWNvbmZpZ3VyZTo2NDM2OiAkPyA9IDAKLWNvbmZpZ3VyZTo2NDUwOiBnKysgLUUgIGNvbmZ0ZXN0LmNwcAotY29uZnRlc3QuY3BwOjIyOjI4OiBmYXRhbCBlcnJvcjogYWNfbm9uZXhpc3RlbnQuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQotY29tcGlsYXRpb24gdGVybWluYXRlZC4KLWNvbmZpZ3VyZTo2NDUwOiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZzc3Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciB4bGYKLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIGY3NwotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZnJ0Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBwZ2Y3NwotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgY2Y3NwotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZm9ydDc3Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBmbDMyCi1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBhZjc3Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciB4bGY5MAotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZjkwCi1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBwZ2Y5MAotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgcGdocGYKLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIGVwY2Y5MAotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZ2ZvcnRyYW4KLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIGc5NQotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgeGxmOTUKLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIGY5NQotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZm9ydAotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgaWZvcnQKLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIGlmYwotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgZWZjCi1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBwZ2ZvcnRyYW4KLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIHBnZjk1Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBsZjk1Ci1jb25maWd1cmU6NjU2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjY1MzQ6IGNoZWNraW5nIGZvciBmdG4KLWNvbmZpZ3VyZTo2NTY0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjUzNDogY2hlY2tpbmcgZm9yIG5hZ2ZvcgotY29uZmlndXJlOjY1NjQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2NTg3OiBjaGVja2luZyBmb3IgRm9ydHJhbiA3NyBjb21waWxlciB2ZXJzaW9uCi1jb25maWd1cmU6NjU5NjogIC0tdmVyc2lvbiA+JjUKLS4vY29uZmlndXJlOiBsaW5lIDY1OTg6IC0tdmVyc2lvbjogY29tbWFuZCBub3QgZm91bmQKLWNvbmZpZ3VyZTo2NjA3OiAkPyA9IDEyNwotY29uZmlndXJlOjY1OTY6ICAtdiA+JjUKLS4vY29uZmlndXJlOiBsaW5lIDY1OTg6IC12OiBjb21tYW5kIG5vdCBmb3VuZAotY29uZmlndXJlOjY2MDc6ICQ/ID0gMTI3Ci1jb25maWd1cmU6NjU5NjogIC1WID4mNQotLi9jb25maWd1cmU6IGxpbmUgNjU5ODogLVY6IGNvbW1hbmQgbm90IGZvdW5kCi1jb25maWd1cmU6NjYwNzogJD8gPSAxMjcKLWNvbmZpZ3VyZTo2NTk2OiAgLXF2ZXJzaW9uID4mNQotLi9jb25maWd1cmU6IGxpbmUgNjU5ODogLXF2ZXJzaW9uOiBjb21tYW5kIG5vdCBmb3VuZAotY29uZmlndXJlOjY2MDc6ICQ/ID0gMTI3Ci1jb25maWd1cmU6NjYxNjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBGb3J0cmFuIDc3IGNvbXBpbGVyCi1jb25maWd1cmU6NjYyOTogIC1jICBjb25mdGVzdC5GID4mNQotLi9jb25maWd1cmU6IGxpbmUgMjMxOTogLWM6IGNvbW1hbmQgbm90IGZvdW5kCi1jb25maWd1cmU6NjYyOTogJD8gPSAxMjcKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAgICAgICBwcm9ncmFtIG1haW4KLXwgI2lmbmRlZiBfX0dOVUNfXwotfCAgICAgICAgY2hva2UgbWUKLXwgI2VuZGlmCi18IAotfCAgICAgICBlbmQKLWNvbmZpZ3VyZTo2NjM4OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6NjY0NDogY2hlY2tpbmcgd2hldGhlciAgYWNjZXB0cyAtZwotY29uZmlndXJlOjY2NTU6ICAtYyAtZyBjb25mdGVzdC5mID4mNQotLi9jb25maWd1cmU6IGxpbmUgMjMxOTogLWM6IGNvbW1hbmQgbm90IGZvdW5kCi1jb25maWd1cmU6NjY1NTogJD8gPSAxMjcKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAgICAgICBwcm9ncmFtIG1haW4KLXwgCi18ICAgICAgIGVuZAotY29uZmlndXJlOjY2NjM6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo2Njk3OiBjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotY29uZmlndXJlOjY4MDY6IHJlc3VsdDogMzI3NjgKLWNvbmZpZ3VyZTo2ODE3OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlIC91c3IvYmluL25tIC1CIG91dHB1dCBmcm9tIGdjYyBvYmplY3QKLWNvbmZpZ3VyZTo2OTIyOiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjY5MjU6ICQ/ID0gMAotY29uZmlndXJlOjY5Mjk6IC91c3IvYmluL25tIC1CIGNvbmZ0ZXN0Lm8gXHwgc2VkIC1uIC1lICdzL14uKlsgCV1cKFtBQkNER0lSU1RXXVtBQkNER0lSU1RXXSpcKVsgCV1bIAldKlwoW19BLVphLXpdW19BLVphLXowLTldKlwpJC9cMSBcMiBcMi9wJyBcPiBjb25mdGVzdC5ubQotY29uZmlndXJlOjY5MzI6ICQ/ID0gMAotY29uZmlndXJlOjY5ODQ6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jIGNvbmZ0c3RtLm8gPiY1Ci1jb25maWd1cmU6Njk4NzogJD8gPSAwCi1jb25maWd1cmU6NzAyNTogcmVzdWx0OiBvawotY29uZmlndXJlOjcwMjk6IGNoZWNraW5nIGZvciBvYmpkaXIKLWNvbmZpZ3VyZTo3MDQ0OiByZXN1bHQ6IC5saWJzCi1jb25maWd1cmU6NzEzNjogY2hlY2tpbmcgZm9yIGFyCi1jb25maWd1cmU6NzE1MjogZm91bmQgL3Vzci9iaW4vYXIKLWNvbmZpZ3VyZTo3MTYzOiByZXN1bHQ6IGFyCi1jb25maWd1cmU6NzIyODogY2hlY2tpbmcgZm9yIHJhbmxpYgotY29uZmlndXJlOjcyNDQ6IGZvdW5kIC91c3IvYmluL3JhbmxpYgotY29uZmlndXJlOjcyNTU6IHJlc3VsdDogcmFubGliCi1jb25maWd1cmU6NzMyMDogY2hlY2tpbmcgZm9yIHN0cmlwCi1jb25maWd1cmU6NzMzNjogZm91bmQgL3Vzci9iaW4vc3RyaXAKLWNvbmZpZ3VyZTo3MzQ3OiByZXN1bHQ6IHN0cmlwCi1jb25maWd1cmU6NzYzMzogY2hlY2tpbmcgaWYgZ2NjIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMKLWNvbmZpZ3VyZTo3NjUxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGNvbmZ0ZXN0LmMgPiY1Ci1jYzE6IHdhcm5pbmc6IGNvbW1hbmQgbGluZSBvcHRpb24gJy1mbm8tcnR0aScgaXMgdmFsaWQgZm9yIEMrKy9PYmpDKysgYnV0IG5vdCBmb3IgQyBbZW5hYmxlZCBieSBkZWZhdWx0XQotY29uZmlndXJlOjc2NTU6ICQ/ID0gMAotY29uZmlndXJlOjc2Njg6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo3NjgzOiBjaGVja2luZyBmb3IgZ2NjIG9wdGlvbiB0byBwcm9kdWNlIFBJQwotY29uZmlndXJlOjc4OTM6IHJlc3VsdDogLWZQSUMKLWNvbmZpZ3VyZTo3OTAxOiBjaGVja2luZyBpZiBnY2MgUElDIGZsYWcgLWZQSUMgd29ya3MKLWNvbmZpZ3VyZTo3OTE5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAtZlBJQyAtRFBJQyBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjc5MjM6ICQ/ID0gMAotY29uZmlndXJlOjc5MzY6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6Nzk2NDogY2hlY2tpbmcgaWYgZ2NjIHN0YXRpYyBmbGFnIC1zdGF0aWMgd29ya3MKLWNvbmZpZ3VyZTo3OTkyOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjgwMDI6IGNoZWNraW5nIGlmIGdjYyBzdXBwb3J0cyAtYyAtbyBmaWxlLm8KLWNvbmZpZ3VyZTo4MDIzOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAtbyBvdXQvY29uZnRlc3QyLm8gY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZTo4MDI3OiAkPyA9IDAKLWNvbmZpZ3VyZTo4MDQ5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjgwNzU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIGdjYyBsaW5rZXIgKC91c3IvYmluL2xkIC1tIGVsZl94ODZfNjQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMKLWNvbmZpZ3VyZTo4OTc1OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjg5OTY6IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbgotY29uZmlndXJlOjkwMDE6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6OTAwNDogJD8gPSAwCi1jb25maWd1cmU6OTAxOTogZ2NjIC1zaGFyZWQgY29uZnRlc3QubyAgLXYgLVdsLC1zb25hbWUgLVdsLGNvbmZ0ZXN0IC1vIGNvbmZ0ZXN0IDJcPlwmMSBcfCBncmVwICAtbGMgIFw+L2Rldi9udWxsIDJcPlwmMQotY29uZmlndXJlOjkwMjI6ICQ/ID0gMAotY29uZmlndXJlOjkwMzQ6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZTo5MDQyOiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MKLWNvbmZpZ3VyZTo5NjMwOiByZXN1bHQ6IEdOVS9MaW51eCBsZC5zbwotY29uZmlndXJlOjk2Mzk6IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMKLWNvbmZpZ3VyZTo5NjY0OiByZXN1bHQ6IGltbWVkaWF0ZQotY29uZmlndXJlOjk2Nzg6IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZQotY29uZmlndXJlOjk2ODM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MTAxOTk6IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcwotY29uZmlndXJlOjEwMjAxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjEwMjA0OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKLWNvbmZpZ3VyZToxMDIyNTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToxMDIyODogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzCi1jb25maWd1cmU6MTAyMzI6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MTAzMjQ6IGNyZWF0aW5nIGxpYnRvb2wKLWNvbmZpZ3VyZToxMDkwODogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgZysrCi1jb25maWd1cmU6MTA5NzU6IHJlc3VsdDogL3Vzci9iaW4vbGQgLW0gZWxmX3g4Nl82NAotY29uZmlndXJlOjEwOTgyOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgvdXNyL2Jpbi9sZCAtbSBlbGZfeDg2XzY0KSBpcyBHTlUgbGQKLWNvbmZpZ3VyZToxMDk5NzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToxMTA0ODogY2hlY2tpbmcgd2hldGhlciB0aGUgZysrIGxpbmtlciAoL3Vzci9iaW4vbGQgLW0gZWxmX3g4Nl82NCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcwotY29uZmlndXJlOjExOTI4OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjExOTUwOiBnKysgLWMgLWcgLU8yICBjb25mdGVzdC5jcHAgPiY1Ci1jb25maWd1cmU6MTE5NTM6ICQ/ID0gMAotY29uZmlndXJlOjEyMDcyOiBjaGVja2luZyBmb3IgZysrIG9wdGlvbiB0byBwcm9kdWNlIFBJQwotY29uZmlndXJlOjEyMzQ2OiByZXN1bHQ6IC1mUElDCi1jb25maWd1cmU6MTIzNTQ6IGNoZWNraW5nIGlmIGcrKyBQSUMgZmxhZyAtZlBJQyB3b3JrcwotY29uZmlndXJlOjEyMzcyOiBnKysgLWMgLWcgLU8yICAtZlBJQyAtRFBJQyBjb25mdGVzdC5jcHAgPiY1Ci1jb25maWd1cmU6MTIzNzY6ICQ/ID0gMAotY29uZmlndXJlOjEyMzg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjEyNDE3OiBjaGVja2luZyBpZiBnKysgc3RhdGljIGZsYWcgLXN0YXRpYyB3b3JrcwotY29uZmlndXJlOjEyNDQ1OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjEyNDU1OiBjaGVja2luZyBpZiBnKysgc3VwcG9ydHMgLWMgLW8gZmlsZS5vCi1jb25maWd1cmU6MTI0NzY6IGcrKyAtYyAtZyAtTzIgIC1vIG91dC9jb25mdGVzdDIubyBjb25mdGVzdC5jcHAgPiY1Ci1jb25maWd1cmU6MTI0ODA6ICQ/ID0gMAotY29uZmlndXJlOjEyNTAyOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjEyNTI4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBnKysgbGlua2VyICgvdXNyL2Jpbi9sZCAtbSBlbGZfeDg2XzY0KSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzCi1jb25maWd1cmU6MTI1NTM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MTI2MjA6IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcwotY29uZmlndXJlOjEzMjA4OiByZXN1bHQ6IEdOVS9MaW51eCBsZC5zbwotY29uZmlndXJlOjEzMjE3OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zCi1jb25maWd1cmU6MTMyNDI6IHJlc3VsdDogaW1tZWRpYXRlCi1jb25maWd1cmU6MTkyODQ6IGNoZWNraW5nIGZvciBhcgotY29uZmlndXJlOjE5MzAzOiBmb3VuZCAvdXNyL2Jpbi9hcgotY29uZmlndXJlOjE5MzE2OiByZXN1bHQ6IC91c3IvYmluL2FyCi1jb25maWd1cmU6MTkzMzg6IGNoZWNraW5nIGZvciBfX2I2NF9udG9wIGluIC1scmVzb2x2Ci1jb25maWd1cmU6MTkzNjM6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jIC1scmVzb2x2ICAgPiY1Ci1jb25maWd1cmU6MTkzNjM6ICQ/ID0gMAotY29uZmlndXJlOjE5MzcyOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjE5NDc1OiBjaGVja2luZyB0aGVub25leGlzdGVudGhlYWRlci5oIHVzYWJpbGl0eQotY29uZmlndXJlOjE5NDc1OiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzo1NjozNDogZmF0YWwgZXJyb3I6IHRoZW5vbmV4aXN0ZW50aGVhZGVyLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MTk0NzU6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDxzdGRpby5oPgotfCAjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotfCAjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotfCAjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgU1REQ19IRUFERVJTCi18ICMgaW5jbHVkZSA8c3RkbGliLmg+Ci18ICMgaW5jbHVkZSA8c3RkZGVmLmg+Ci18ICNlbHNlCi18ICMgaWZkZWYgSEFWRV9TVERMSUJfSAotfCAjICBpbmNsdWRlIDxzdGRsaWIuaD4KLXwgIyBlbmRpZgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RSSU5HX0gKLXwgIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi18ICMgIGluY2x1ZGUgPG1lbW9yeS5oPgotfCAjIGVuZGlmCi18ICMgaW5jbHVkZSA8c3RyaW5nLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVFJJTkdTX0gKLXwgIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9JTlRUWVBFU19ICi18ICMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NURElOVF9ICi18ICMgaW5jbHVkZSA8c3RkaW50Lmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9VTklTVERfSAotfCAjIGluY2x1ZGUgPHVuaXN0ZC5oPgotfCAjZW5kaWYKLXwgI2luY2x1ZGUgPHRoZW5vbmV4aXN0ZW50aGVhZGVyLmg+Ci1jb25maWd1cmU6MTk0NzU6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToxOTQ3NTogY2hlY2tpbmcgdGhlbm9uZXhpc3RlbnRoZWFkZXIuaCBwcmVzZW5jZQotY29uZmlndXJlOjE5NDc1OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZ0ZXN0LmM6MjM6MzQ6IGZhdGFsIGVycm9yOiB0aGVub25leGlzdGVudGhlYWRlci5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Ci1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjE5NDc1OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8dGhlbm9uZXhpc3RlbnRoZWFkZXIuaD4KLWNvbmZpZ3VyZToxOTQ3NTogcmVzdWx0OiBubwotY29uZmlndXJlOjE5NDc1OiBjaGVja2luZyBmb3IgdGhlbm9uZXhpc3RlbnRoZWFkZXIuaAotY29uZmlndXJlOjE5NDc1OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MTk1MDU6IGNoZWNraW5nIGZvciBjcnlwdAotY29uZmlndXJlOjE5NTA1OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAgPiY1Ci0vdG1wL2NjQ3NORFhpLm86IEluIGZ1bmN0aW9uIGBtYWluJzoKLS9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvY29uZnRlc3QuYzo1NzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgY3J5cHQnCi1jb2xsZWN0MjogZXJyb3I6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKLWNvbmZpZ3VyZToxOTUwNTogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgLyogRGVmaW5lIGNyeXB0IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgY3J5cHQuCi18ICAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotfCAjZGVmaW5lIGNyeXB0IGlubm9jdW91c19jcnlwdAotfCAKLXwgLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotfCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBjcnlwdCAoKTsgYmVsb3cuCi18ICAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi18ICAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotfCAKLXwgI2lmZGVmIF9fU1REQ19fCi18ICMgaW5jbHVkZSA8bGltaXRzLmg+Ci18ICNlbHNlCi18ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci18ICNlbmRpZgotfCAKLXwgI3VuZGVmIGNyeXB0Ci18IAotfCAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLXwgICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi18ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi18ICNpZmRlZiBfX2NwbHVzcGx1cwotfCBleHRlcm4gIkMiCi18ICNlbmRpZgotfCBjaGFyIGNyeXB0ICgpOwotfCAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi18ICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotfCAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi18ICNpZiBkZWZpbmVkIF9fc3R1Yl9jcnlwdCB8fCBkZWZpbmVkIF9fc3R1Yl9fX2NyeXB0Ci18IGNob2tlIG1lCi18ICNlbmRpZgotfCAKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCByZXR1cm4gY3J5cHQgKCk7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MTk1MDU6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToxOTUxNTogY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQKLWNvbmZpZ3VyZToxOTU0MDogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgIGNvbmZ0ZXN0LmMgLWxjcnlwdCAgID4mNQotY29uZmlndXJlOjE5NTQwOiAkPyA9IDAKLWNvbmZpZ3VyZToxOTU0OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToxOTU5MjogY2hlY2tpbmcgZm9yIFJBTkRfZmlsZV9uYW1lIGluIC1sY3J5cHRvCi1jb25maWd1cmU6MTk2MTc6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jIC1sY3J5cHRvICAgPiY1Ci0vdXNyL2Jpbi9sZDogY2Fubm90IGZpbmQgLWxjcnlwdG8KLWNvbGxlY3QyOiBlcnJvcjogbGQgcmV0dXJuZWQgMSBleGl0IHN0YXR1cwotY29uZmlndXJlOjE5NjE3OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAKLXwgLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi18ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotfCAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotfCAjaWZkZWYgX19jcGx1c3BsdXMKLXwgZXh0ZXJuICJDIgotfCAjZW5kaWYKLXwgY2hhciBSQU5EX2ZpbGVfbmFtZSAoKTsKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCByZXR1cm4gUkFORF9maWxlX25hbWUgKCk7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MTk2MjY6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToxOTY4NzogY2hlY2tpbmcgZm9yIFNTTF9saWJyYXJ5X2luaXQgaW4gLWxzc2wKLWNvbmZpZ3VyZToxOTcxMjogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgIGNvbmZ0ZXN0LmMgLWxzc2wgICA+JjUKLS91c3IvYmluL2xkOiBjYW5ub3QgZmluZCAtbHNzbAotY29sbGVjdDI6IGVycm9yOiBsZCByZXR1cm5lZCAxIGV4aXQgc3RhdHVzCi1jb25maWd1cmU6MTk3MTI6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18IAotfCAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLXwgICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi18ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi18ICNpZmRlZiBfX2NwbHVzcGx1cwotfCBleHRlcm4gIkMiCi18ICNlbmRpZgotfCBjaGFyIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci18IGludAotfCBtYWluICgpCi18IHsKLXwgcmV0dXJuIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MTk3MjE6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToxOTc0MzogY2hlY2tpbmcgZm9yIFgKLWNvbmZpZ3VyZToxOTg1MTogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25maWd1cmU6MTk4NTE6ICQ/ID0gMAotY29uZmlndXJlOjE5ODgyOiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbFgxMSAgPiY1Ci1jb25maWd1cmU6MTk4ODI6ICQ/ID0gMAotY29uZmlndXJlOjE5OTMyOiByZXN1bHQ6IGxpYnJhcmllcyAsIGhlYWRlcnMgCi1jb25maWd1cmU6MjAwMzE6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jICAgLWxYMTEgPiY1Ci1jb25maWd1cmU6MjAwMzE6ICQ/ID0gMAotY29uZmlndXJlOjIwMTI5OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZQotY29uZmlndXJlOjIwMTI5OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6MjAxMjk6ICQ/ID0gMAotY29uZmlndXJlOjIwMTI5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIwMjI2OiBjaGVja2luZyBmb3IgY29ubmVjdAotY29uZmlndXJlOjIwMjI2OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6MjAyMjY6ICQ/ID0gMAotY29uZmlndXJlOjIwMjI2OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIwMjc1OiBjaGVja2luZyBmb3IgcmVtb3ZlCi1jb25maWd1cmU6MjAyNzU6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jICA+JjUKLWNvbmZpZ3VyZToyMDI3NTogJD8gPSAwCi1jb25maWd1cmU6MjAyNzU6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjAzMjQ6IGNoZWNraW5nIGZvciBzaG1hdAotY29uZmlndXJlOjIwMzI0OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAgPiY1Ci1jb25maWd1cmU6MjAzMjQ6ICQ/ID0gMAotY29uZmlndXJlOjIwMzI0OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIwMzgyOiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRQotY29uZmlndXJlOjIwNDA3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbElDRSAgID4mNQotY29uZmlndXJlOjIwNDA3OiAkPyA9IDAKLWNvbmZpZ3VyZToyMDQxNjogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMDU2MDogY2hlY2tpbmcgZm9yIFhHZXRJbWFnZSBpbiAtbFgxMQotY29uZmlndXJlOjIwNTg1OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbFgxMSAgIC1sWDExICAgPiY1Ci1jb25maWd1cmU6MjA1ODU6ICQ/ID0gMAotY29uZmlndXJlOjIwNTk0OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxNTU2OiBjaGVja2luZyBqcGVnbGliLmggdXNhYmlsaXR5Ci1jb25maWd1cmU6MjE1NTY6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjE1NTY6ICQ/ID0gMAotY29uZmlndXJlOjIxNTU2OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxNTU2OiBjaGVja2luZyBqcGVnbGliLmggcHJlc2VuY2UKLWNvbmZpZ3VyZToyMTU1NjogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25maWd1cmU6MjE1NTY6ICQ/ID0gMAotY29uZmlndXJlOjIxNTU2OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxNTU2OiBjaGVja2luZyBmb3IganBlZ2xpYi5oCi1jb25maWd1cmU6MjE1NTY6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjE1NjI6IGNoZWNraW5nIGZvciBqcGVnX0NyZWF0ZUNvbXByZXNzIGluIGxpYmpwZWcKLWNvbmZpZ3VyZToyMTU4MzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgIGNvbmZ0ZXN0LmMgLWxqcGVnID4mNQotY29uZmlndXJlOjIxNTgzOiAkPyA9IDAKLWNvbmZpZ3VyZToyMTU4NDogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMTYyOTogY2hlY2tpbmcgd2hldGhlciBKUEVHIGxpYnJhcnkgaXMgbGlianBlZy10dXJibwotY29uZmlndXJlOjIxNjYwOiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbGpwZWcgPiY1Ci1jb25mdGVzdC5jOiBJbiBmdW5jdGlvbiAnbWFpbic6Ci1jb25mdGVzdC5jOjM3OjI4OiBlcnJvcjogJ0pDU19FWFRfUkdCJyB1bmRlY2xhcmVkIChmaXJzdCB1c2UgaW4gdGhpcyBmdW5jdGlvbikKLWNvbmZ0ZXN0LmM6Mzc6Mjg6IG5vdGU6IGVhY2ggdW5kZWNsYXJlZCBpZGVudGlmaWVyIGlzIHJlcG9ydGVkIG9ubHkgb25jZSBmb3IgZWFjaCBmdW5jdGlvbiBpdCBhcHBlYXJzIGluCi1jb25maWd1cmU6MjE2NjA6ICQ/ID0gMQotY29uZmlndXJlOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18ICNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi18ICNkZWZpbmUgSEFWRV9YMTEgMQotfCAjZGVmaW5lIEhBVkVfTElCSlBFRyAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHN0ZGlvLmg+Ci18IAkJCQkjaW5jbHVkZSA8anBlZ2xpYi5oPgotfCBpbnQKLXwgbWFpbiAoKQotfCB7Ci18IHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLXwgCQkJCXN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotfCAJCQkJY2luZm8uZXJyPWpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLXwgCQkJCWpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7Ci18IAkJCQljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKLXwgCQkJCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci18IAkJCQljaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19FWFRfUkdCOwotfCAJCQkJanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKLXwgCQkJCXJldHVybiAwOwotfCAgIDsKLXwgICByZXR1cm4gMDsKLXwgfQotfCAKLWNvbmZpZ3VyZToyMTY2NDogcmVzdWx0OiBubwotY29uZmlndXJlOjIxNzEyOiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlianBlZyBsaWJyYXJ5IHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBpcyBub3QgbGlianBlZy10dXJiby4KLVBlcmZvcm1hbmNlIHdpbGwgYmUgcmVkdWNlZC4gIFlvdSBjYW4gb2J0YWluIGxpYmpwZWctdHVyYm8gZnJvbToKLWh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmpwZWctdHVyYm8vZmlsZXMvICoqKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uZmlndXJlOjIxNzUzOiBjaGVja2luZyBwbmcuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyMTc1MzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZToyMTc1MzogJD8gPSAwCi1jb25maWd1cmU6MjE3NTM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjE3NTM6IGNoZWNraW5nIHBuZy5oIHByZXNlbmNlCi1jb25maWd1cmU6MjE3NTM6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIxNzUzOiAkPyA9IDAKLWNvbmZpZ3VyZToyMTc1MzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMTc1MzogY2hlY2tpbmcgZm9yIHBuZy5oCi1jb25maWd1cmU6MjE3NTM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjE3NjA6IGNoZWNraW5nIGZvciBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCBpbiAtbHBuZwotY29uZmlndXJlOjIxNzg1OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbHBuZyAgLWxqcGVnID4mNQotY29uZmlndXJlOjIxNzg1OiAkPyA9IDAKLWNvbmZpZ3VyZToyMTc5NDogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMTg2OTogY2hlY2tpbmcgemxpYi5oIHVzYWJpbGl0eQotY29uZmlndXJlOjIxODY5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIxODY5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMTg2OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMTg2OTogY2hlY2tpbmcgemxpYi5oIHByZXNlbmNlCi1jb25maWd1cmU6MjE4Njk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIxODY5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMTg2OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMTg2OTogY2hlY2tpbmcgZm9yIHpsaWIuaAotY29uZmlndXJlOjIxODY5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxODc2OiBjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHoKLWNvbmZpZ3VyZToyMTkwMTogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgIGNvbmZ0ZXN0LmMgLWx6ICAtbHBuZyAtbGpwZWcgPiY1Ci1jb25maWd1cmU6MjE5MDE6ICQ/ID0gMAotY29uZmlndXJlOjIxOTEwOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxOTYzOiBjaGVja2luZyBwdGhyZWFkLmggdXNhYmlsaXR5Ci1jb25maWd1cmU6MjE5NjM6IGdjYyAtYyAtZyAtTzIgLVdhbGwgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjE5NjM6ICQ/ID0gMAotY29uZmlndXJlOjIxOTYzOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxOTYzOiBjaGVja2luZyBwdGhyZWFkLmggcHJlc2VuY2UKLWNvbmZpZ3VyZToyMTk2MzogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25maWd1cmU6MjE5NjM6ICQ/ID0gMAotY29uZmlndXJlOjIxOTYzOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIxOTYzOiBjaGVja2luZyBmb3IgcHRocmVhZC5oCi1jb25maWd1cmU6MjE5NjM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjE5NzA6IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkCi1jb25maWd1cmU6MjE5OTU6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICBjb25mdGVzdC5jIC1scHRocmVhZCAgLWx6IC1scG5nIC1sanBlZyA+JjUKLWNvbmZpZ3VyZToyMTk5NTogJD8gPSAwCi1jb25maWd1cmU6MjIwMDQ6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjIwMTU6IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkCi1jb25maWd1cmU6MjIwNDk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjIwNjY6IGNoZWNraW5nIGZvciBfX3RocmVhZAotY29uZmlndXJlOjIyMDc5OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyA+JjUKLWNvbmZ0ZXN0LmM6IEluIGZ1bmN0aW9uICdtYWluJzoKLWNvbmZ0ZXN0LmM6MzM6MjE6IHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAncCcgWy1XdW51c2VkLXZhcmlhYmxlXQotY29uZmlndXJlOjIyMDc5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjA4MzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjI0MTogY2hlY2tpbmcgZm9yIHBrZy1jb25maWcKLWNvbmZpZ3VyZToyMjI1OTogZm91bmQgL3Vzci9iaW4vcGtnLWNvbmZpZwotY29uZmlndXJlOjIyMjcxOiByZXN1bHQ6IC91c3IvYmluL3BrZy1jb25maWcKLWNvbmZpZ3VyZToyMjI5NjogY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uIDAuOS4wCi1jb25maWd1cmU6MjIyOTk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjIzMDk6IGNoZWNraW5nIGZvciBHVEsKLWNvbmZpZ3VyZToyMjMxNjogJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImd0aystMi4wIgotUGFja2FnZSBndGsrLTIuMCB3YXMgbm90IGZvdW5kIGluIHRoZSBwa2ctY29uZmlnIHNlYXJjaCBwYXRoLgotUGVyaGFwcyB5b3Ugc2hvdWxkIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYGd0aystMi4wLnBjJwotdG8gdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQotTm8gcGFja2FnZSAnZ3RrKy0yLjAnIGZvdW5kCi1jb25maWd1cmU6MjIzMTk6ICQ/ID0gMQotY29uZmlndXJlOjIyMzMzOiAkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiCi1QYWNrYWdlIGd0aystMi4wIHdhcyBub3QgZm91bmQgaW4gdGhlIHBrZy1jb25maWcgc2VhcmNoIHBhdGguCi1QZXJoYXBzIHlvdSBzaG91bGQgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBgZ3RrKy0yLjAucGMnCi10byB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCi1ObyBwYWNrYWdlICdndGsrLTIuMCcgZm91bmQKLWNvbmZpZ3VyZToyMjMzNjogJD8gPSAxCi1jb25maWd1cmU6MjIzNTA6IHJlc3VsdDogbm8KLU5vIHBhY2thZ2UgJ2d0aystMi4wJyBmb3VuZAotY29uZmlndXJlOjIyNDM1OiBjaGVja2luZyBmb3IgbGliZ2NyeXB0LWNvbmZpZwotY29uZmlndXJlOjIyNDY2OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjI0ODM6IGNoZWNraW5nIGZvciBMSUJHQ1JZUFQgLSB2ZXJzaW9uID49IDEuNC4wCi1jb25maWd1cmU6MjI1MjA6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyMjU3NDogY2hlY2tpbmcgZm9yIEdOVVRMUwotY29uZmlndXJlOjIyNTgxOiAkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ251dGxzID49IDIuNC4wIgotUGFja2FnZSBnbnV0bHMgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGtnLWNvbmZpZyBzZWFyY2ggcGF0aC4KLVBlcmhhcHMgeW91IHNob3VsZCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBnbnV0bHMucGMnCi10byB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCi1ObyBwYWNrYWdlICdnbnV0bHMnIGZvdW5kCi1jb25maWd1cmU6MjI1ODQ6ICQ/ID0gMQotY29uZmlndXJlOjIyNTk4OiAkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ251dGxzID49IDIuNC4wIgotUGFja2FnZSBnbnV0bHMgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGtnLWNvbmZpZyBzZWFyY2ggcGF0aC4KLVBlcmhhcHMgeW91IHNob3VsZCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBnbnV0bHMucGMnCi10byB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCi1ObyBwYWNrYWdlICdnbnV0bHMnIGZvdW5kCi1jb25maWd1cmU6MjI2MDE6ICQ/ID0gMQotY29uZmlndXJlOjIyNjE1OiByZXN1bHQ6IG5vCi1ObyBwYWNrYWdlICdnbnV0bHMnIGZvdW5kCi1jb25maWd1cmU6MjI2Njk6IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5vIGVuY3J5cHRpb24gbGlicmFyeSBjb3VsZCBiZSBmb3VuZC4gKioqCi1BIGxpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQgYnVpbHQgdGhpcyB3YXkgd2lsbCBub3Qgc3VwcG9ydCBTU0wgZW5jcnlwdGlvbi4KLVRvIGVuYWJsZSBTU0wgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzIChwZXJoYXBzIGl0IGlzIG5hbWVkCi1zb21ldGhpbmcgbGlrZSBsaWJzc2wtZGV2IG9yIGdudXRscy1kZXYpIGFuZCBydW4gY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uZmlndXJlOjIyNjkxOiBjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8KLWNvbmZpZ3VyZToyMjY5MTogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyMjY5MTogJD8gPSAwCi1jb25maWd1cmU6MjI2OTE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI3NzQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzCi1jb25maWd1cmU6MjI4Nzg6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIGFycGEvaW5ldC5oIHVzYWJpbGl0eQotY29uZmlndXJlOjIyODg5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjI4ODk6ICQ/ID0gMAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBhcnBhL2luZXQuaCBwcmVzZW5jZQotY29uZmlndXJlOjIyODg5OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZpZ3VyZToyMjg4OTogJD8gPSAwCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIGZvciBhcnBhL2luZXQuaAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBmY250bC5oIHVzYWJpbGl0eQotY29uZmlndXJlOjIyODg5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjI4ODk6ICQ/ID0gMAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBmY250bC5oIHByZXNlbmNlCi1jb25maWd1cmU6MjI4ODk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIGZjbnRsLmgKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgbmV0ZGIuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyMjg4OTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgbmV0ZGIuaCBwcmVzZW5jZQotY29uZmlndXJlOjIyODg5OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZpZ3VyZToyMjg4OTogJD8gPSAwCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIGZvciBuZXRkYi5oCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIG5ldGluZXQvaW4uaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyMjg4OTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgbmV0aW5ldC9pbi5oIHByZXNlbmNlCi1jb25maWd1cmU6MjI4ODk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIG5ldGluZXQvaW4uaAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBmb3Igc3RkbGliLmgKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIHN0cmluZy5oCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIHN5cy9zb2NrZXQuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyMjg4OTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgc3lzL3NvY2tldC5oIHByZXNlbmNlCi1jb25maWd1cmU6MjI4ODk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIHN5cy9zb2NrZXQuaAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBzeXMvdGltZS5oIHVzYWJpbGl0eQotY29uZmlndXJlOjIyODg5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjI4ODk6ICQ/ID0gMAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBzeXMvdGltZS5oIHByZXNlbmNlCi1jb25maWd1cmU6MjI4ODk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIHN5cy90aW1lLmgKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgc3lzL3RpbWViLmggdXNhYmlsaXR5Ci1jb25maWd1cmU6MjI4ODk6IGdjYyAtYyAtZyAtTzIgLVdhbGwgICAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZToyMjg4OTogJD8gPSAwCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIHN5cy90aW1lYi5oIHByZXNlbmNlCi1jb25maWd1cmU6MjI4ODk6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZmlndXJlOjIyODg5OiAkPyA9IDAKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgZm9yIHN5cy90aW1lYi5oCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIHN5c2xvZy5oIHVzYWJpbGl0eQotY29uZmlndXJlOjIyODg5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjI4ODk6ICQ/ID0gMAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBzeXNsb2cuaCBwcmVzZW5jZQotY29uZmlndXJlOjIyODg5OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKLWNvbmZpZ3VyZToyMjg4OTogJD8gPSAwCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIGZvciBzeXNsb2cuaAotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIyODg5OiBjaGVja2luZyBmb3IgdW5pc3RkLmgKLWNvbmZpZ3VyZToyMjg4OTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyMjg4OTogY2hlY2tpbmcgd3MydGNwaXAuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyMjg4OTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzo3ODoyMjogZmF0YWwgZXJyb3I6IHdzMnRjcGlwLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MjI4ODk6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8c3RkaW8uaD4KLXwgI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLXwgIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLXwgIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIFNURENfSEVBREVSUwotfCAjIGluY2x1ZGUgPHN0ZGxpYi5oPgotfCAjIGluY2x1ZGUgPHN0ZGRlZi5oPgotfCAjZWxzZQotfCAjIGlmZGVmIEhBVkVfU1RETElCX0gKLXwgIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci18ICMgZW5kaWYKLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NUUklOR19ICi18ICMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotfCAjICBpbmNsdWRlIDxtZW1vcnkuaD4KLXwgIyBlbmRpZgotfCAjIGluY2x1ZGUgPHN0cmluZy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RSSU5HU19ICi18ICMgaW5jbHVkZSA8c3RyaW5ncy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotfCAjIGluY2x1ZGUgPGludHR5cGVzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVERJTlRfSAotfCAjIGluY2x1ZGUgPHN0ZGludC5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfVU5JU1REX0gKLXwgIyBpbmNsdWRlIDx1bmlzdGQuaD4KLXwgI2VuZGlmCi18ICNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIHdzMnRjcGlwLmggcHJlc2VuY2UKLWNvbmZpZ3VyZToyMjg4OTogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25mdGVzdC5jOjQ1OjIyOiBmYXRhbCBlcnJvcjogd3MydGNwaXAuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQotY29tcGlsYXRpb24gdGVybWluYXRlZC4KLWNvbmZpZ3VyZToyMjg4OTogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18ICNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi18ICNkZWZpbmUgSEFWRV9YMTEgMQotfCAjZGVmaW5lIEhBVkVfTElCSlBFRyAxCi18ICNkZWZpbmUgSEFWRV9MSUJQTkcgMQotfCAjZGVmaW5lIEhBVkVfTElCWiAxCi18ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKLXwgI2RlZmluZSBIQVZFX1RMUyAxCi18ICNkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMQotfCAjZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxCi18ICNkZWZpbmUgSVB2NiAxCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKLXwgI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUREJfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotY29uZmlndXJlOjIyODg5OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjI4ODk6IGNoZWNraW5nIGZvciB3czJ0Y3BpcC5oCi1jb25maWd1cmU6MjI4ODk6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyMjkxODogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Ci1jb25maWd1cmU6MjI5ODQ6IGdjYyAtYyAtZyAtTzIgLVdhbGwgICAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZToyMjk4NDogJD8gPSAwCi1jb25maWd1cmU6MjI5OTE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjI5OTk6IGNoZWNraW5nIGZvciBpbmxpbmUKLWNvbmZpZ3VyZToyMzAxNTogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIzMDE1OiAkPyA9IDAKLWNvbmZpZ3VyZToyMzAyMzogcmVzdWx0OiBpbmxpbmUKLWNvbmZpZ3VyZToyMzA0MTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbgotY29uZmlndXJlOjIzMDU2OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOjQ2Ojk6IGVycm9yOiB1bmtub3duIHR5cGUgbmFtZSAnbm90JwotY29uZnRlc3QuYzo0NjoxNTogZXJyb3I6IGV4cGVjdGVkICc9JywgJywnLCAnOycsICdhc20nIG9yICdfX2F0dHJpYnV0ZV9fJyBiZWZvcmUgJ3VuaXZlcnNhbCcKLWNvbmZ0ZXN0LmM6NDY6MTU6IGVycm9yOiB1bmtub3duIHR5cGUgbmFtZSAndW5pdmVyc2FsJwotY29uZmlndXJlOjIzMDU2OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgI2RlZmluZSBIQVZFX1gxMSAxCi18ICNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBORyAxCi18ICNkZWZpbmUgSEFWRV9MSUJaIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotfCAjZGVmaW5lIEhBVkVfVExTIDEKLXwgI2RlZmluZSBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAxCi18ICNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLXwgI2RlZmluZSBJUHY2IDEKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotfCAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLXwgI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2lmbmRlZiBfX0FQUExFX0NDX18KLXwgCSAgICAgICBub3QgYSB1bml2ZXJzYWwgY2FwYWJsZSBjb21waWxlcgotfCAJICAgICAjZW5kaWYKLXwgCSAgICAgdHlwZWRlZiBpbnQgZHVtbXk7Ci18IAotY29uZmlndXJlOjIzMTAxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjMxMDE6ICQ/ID0gMAotY29uZmlndXJlOjIzMTE5OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOiBJbiBmdW5jdGlvbiAnbWFpbic6Ci1jb25mdGVzdC5jOjUyOjQ6IGVycm9yOiB1bmtub3duIHR5cGUgbmFtZSAnbm90JwotY29uZnRlc3QuYzo1MjoxMjogZXJyb3I6IGV4cGVjdGVkICc9JywgJywnLCAnOycsICdhc20nIG9yICdfX2F0dHJpYnV0ZV9fJyBiZWZvcmUgJ2VuZGlhbicKLWNvbmZpZ3VyZToyMzExOTogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18ICNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi18ICNkZWZpbmUgSEFWRV9YMTEgMQotfCAjZGVmaW5lIEhBVkVfTElCSlBFRyAxCi18ICNkZWZpbmUgSEFWRV9MSUJQTkcgMQotfCAjZGVmaW5lIEhBVkVfTElCWiAxCi18ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKLXwgI2RlZmluZSBIQVZFX1RMUyAxCi18ICNkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMQotfCAjZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxCi18ICNkZWZpbmUgSVB2NiAxCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKLXwgI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUREJfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXwgCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci18IAotfCBpbnQKLXwgbWFpbiAoKQotfCB7Ci18ICNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLXwgCQkgbm90IGJpZyBlbmRpYW4KLXwgCQkjZW5kaWYKLXwgCi18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MjMyNDc6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyMzI2NTogY2hlY2tpbmcgZm9yIHNpemVfdAotY29uZmlndXJlOjIzMjY1OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjMyNjU6ICQ/ID0gMAotY29uZmlndXJlOjIzMjY1OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOiBJbiBmdW5jdGlvbiAnbWFpbic6Ci1jb25mdGVzdC5jOjgxOjIxOiBlcnJvcjogZXhwZWN0ZWQgZXhwcmVzc2lvbiBiZWZvcmUgJyknIHRva2VuCi1jb25maWd1cmU6MjMyNjU6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8c3RkaW8uaD4KLXwgI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLXwgIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLXwgIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIFNURENfSEVBREVSUwotfCAjIGluY2x1ZGUgPHN0ZGxpYi5oPgotfCAjIGluY2x1ZGUgPHN0ZGRlZi5oPgotfCAjZWxzZQotfCAjIGlmZGVmIEhBVkVfU1RETElCX0gKLXwgIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci18ICMgZW5kaWYKLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NUUklOR19ICi18ICMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotfCAjICBpbmNsdWRlIDxtZW1vcnkuaD4KLXwgIyBlbmRpZgotfCAjIGluY2x1ZGUgPHN0cmluZy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RSSU5HU19ICi18ICMgaW5jbHVkZSA8c3RyaW5ncy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotfCAjIGluY2x1ZGUgPGludHR5cGVzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVERJTlRfSAotfCAjIGluY2x1ZGUgPHN0ZGludC5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfVU5JU1REX0gKLXwgIyBpbmNsdWRlIDx1bmlzdGQuaD4KLXwgI2VuZGlmCi18IGludAotfCBtYWluICgpCi18IHsKLXwgaWYgKHNpemVvZiAoKHNpemVfdCkpKQotfCAJICAgIHJldHVybiAwOwotfCAgIDsKLXwgICByZXR1cm4gMDsKLXwgfQotY29uZmlndXJlOjIzMjY1OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIzMjc2OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZAotY29uZmlndXJlOjIzMjk2OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjMyOTY6ICQ/ID0gMAotY29uZmlndXJlOjIzMzAzOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIzMzExOiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZQotY29uZmlndXJlOjIzMzM3OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjMzMzc6ICQ/ID0gMAotY29uZmlndXJlOjIzMzQ0OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIzMzUyOiBjaGVja2luZyBmb3Igc29ja2xlbl90Ci1jb25maWd1cmU6MjMzNzA6IGdjYyAtYyAtZyAtTzIgLVdhbGwgICAgY29uZnRlc3QuYyA+JjUKLWNvbmZ0ZXN0LmM6IEluIGZ1bmN0aW9uICdtYWluJzoKLWNvbmZ0ZXN0LmM6NTI6MTE6IHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAnbGVuJyBbLVd1bnVzZWQtdmFyaWFibGVdCi1jb25maWd1cmU6MjMzNzA6ICQ/ID0gMAotY29uZmlndXJlOjIzMzc4OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIzMzkwOiBjaGVja2luZyBmb3Igc3RkaW50LXR5cGVzLi4uLgotY29uZmlndXJlOjIzNDAwOiByZXN1bHQ6ICIocHV0dGluZyB0aGVtIGludG8gcmZiL3JmYmludC5oKSIKLWNvbmZpZ3VyZToyMzQxMzogY2hlY2tpbmcgZm9yIHVpbnRwdHJfdAotY29uZmlndXJlOjIzNDEzOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjM0MTM6ICQ/ID0gMAotY29uZmlndXJlOjIzNDEzOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOiBJbiBmdW5jdGlvbiAnbWFpbic6Ci1jb25mdGVzdC5jOjUyOjI0OiBlcnJvcjogZXhwZWN0ZWQgZXhwcmVzc2lvbiBiZWZvcmUgJyknIHRva2VuCi1jb25maWd1cmU6MjM0MTM6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHN0ZGludC5oPgotfCAKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCBpZiAoc2l6ZW9mICgodWludHB0cl90KSkpCi18IAkgICAgcmV0dXJuIDA7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MjM0MTM6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjM0MjE6IGNoZWNraW5nIGZvciB1aW50NjRfdAotY29uZmlndXJlOjIzNDIxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25maWd1cmU6MjM0MjE6ICQ/ID0gMAotY29uZmlndXJlOjIzNDIxOiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOiBJbiBmdW5jdGlvbiAnbWFpbic6Ci1jb25mdGVzdC5jOjUyOjIzOiBlcnJvcjogZXhwZWN0ZWQgZXhwcmVzc2lvbiBiZWZvcmUgJyknIHRva2VuCi1jb25maWd1cmU6MjM0MjE6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGU8c3RkaW50Lmg+Ci18IAotfCBpbnQKLXwgbWFpbiAoKQotfCB7Ci18IGlmIChzaXplb2YgKCh1aW50NjRfdCkpKQotfCAJICAgIHJldHVybiAwOwotfCAgIDsKLXwgICByZXR1cm4gMDsKLXwgfQotY29uZmlndXJlOjIzNDIxOiByZXN1bHQ6IHllcwotY29uZmlndXJlOjIzNDI5OiByZXN1bHQ6IC4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gc3RkaW50LmggKHVpbnQ2NF90IHRvbykKLWNvbmZpZ3VyZToyMzY5NDogcmVzdWx0OiBjcmVhdGluZyByZmIvcmZiaW50LmggOiBfUkZCX1JGQklOVF9ICi1jb25maWd1cmU6MjM3MjE6IGNoZWNraW5nIGZvciBpbnRfbGVhc3QzMl90Ci1jb25maWd1cmU6MjM3MjE6IGdjYyAtYyAtZyAtTzIgLVdhbGwgICAgY29uZnRlc3QuYyA+JjUKLWNvbmZpZ3VyZToyMzcyMTogJD8gPSAwCi1jb25maWd1cmU6MjM3MjE6IGdjYyAtYyAtZyAtTzIgLVdhbGwgICAgY29uZnRlc3QuYyA+JjUKLWNvbmZ0ZXN0LmM6IEluIGZ1bmN0aW9uICdtYWluJzoKLWNvbmZ0ZXN0LmM6NTI6Mjg6IGVycm9yOiBleHBlY3RlZCBleHByZXNzaW9uIGJlZm9yZSAnKScgdG9rZW4KLWNvbmZpZ3VyZToyMzcyMTogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18ICNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi18ICNkZWZpbmUgSEFWRV9YMTEgMQotfCAjZGVmaW5lIEhBVkVfTElCSlBFRyAxCi18ICNkZWZpbmUgSEFWRV9MSUJQTkcgMQotfCAjZGVmaW5lIEhBVkVfTElCWiAxCi18ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKLXwgI2RlZmluZSBIQVZFX1RMUyAxCi18ICNkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMQotfCAjZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxCi18ICNkZWZpbmUgSVB2NiAxCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKLXwgI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUREJfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi18ICNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8c3RkaW50Lmg+Ci18IAotfCBpbnQKLXwgbWFpbiAoKQotfCB7Ci18IGlmIChzaXplb2YgKChpbnRfbGVhc3QzMl90KSkpCi18IAkgICAgcmV0dXJuIDA7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MjM3MjE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjM3Mjc6IGNoZWNraW5nIGZvciBpbnRfZmFzdDMyX3QKLWNvbmZpZ3VyZToyMzcyNzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjIzNzI3OiAkPyA9IDAKLWNvbmZpZ3VyZToyMzcyNzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzogSW4gZnVuY3Rpb24gJ21haW4nOgotY29uZnRlc3QuYzo1MjoyNzogZXJyb3I6IGV4cGVjdGVkIGV4cHJlc3Npb24gYmVmb3JlICcpJyB0b2tlbgotY29uZmlndXJlOjIzNzI3OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgI2RlZmluZSBIQVZFX1gxMSAxCi18ICNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBORyAxCi18ICNkZWZpbmUgSEFWRV9MSUJaIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotfCAjZGVmaW5lIEhBVkVfVExTIDEKLXwgI2RlZmluZSBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAxCi18ICNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLXwgI2RlZmluZSBJUHY2IDEKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotfCAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLXwgI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLXwgI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlPHN0ZGludC5oPgotfCAKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCBpZiAoc2l6ZW9mICgoaW50X2Zhc3QzMl90KSkpCi18IAkgICAgcmV0dXJuIDA7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MjM3Mjc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjM3NDA6IHJlc3VsdDogLi5hZGRpbmcgaW5jbHVkZSBzdGRpbnQuaAotY29uZmlndXJlOjIzNzUwOiByZXN1bHQ6IC4uLiBzZWVuIGdvb2Qgc3RkaW50LmggaW50dHlwZXMKLWNvbmZpZ3VyZToyMzg4NjogcmVzdWx0OiAuLi4gc2VlbiBnb29kIHVpbnQ2NF90Ci1jb25maWd1cmU6MjQxMDY6IHJlc3VsdDogLi4uIERPTkUgcmZiL3JmYmludC5oCi1jb25maWd1cmU6MjQxMTU6IGNoZWNraW5nIGZvciBpbl9hZGRyX3QKLWNvbmZpZ3VyZToyNDEzMzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzogSW4gZnVuY3Rpb24gJ21haW4nOgotY29uZnRlc3QuYzo1MjoxMTogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdmb28nIFstV3VudXNlZC12YXJpYWJsZV0KLWNvbmZpZ3VyZToyNDEzMzogJD8gPSAwCi1jb25maWd1cmU6MjQxNDE6IHJlc3VsdDogCi1jb25maWd1cmU6MjQxNDk6IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcAotY29uZmlndXJlOjI0MTkyOiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0MTkyOiAkPyA9IDAKLWNvbmZpZ3VyZToyNDE5MjogLi9jb25mdGVzdAotY29uZmlndXJlOjI0MTkyOiAkPyA9IDAKLWNvbmZpZ3VyZToyNDIwMjogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDIxMTogY2hlY2tpbmcgd2hldGhlciBsc3RhdCBjb3JyZWN0bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaAotY29uZmlndXJlOjI0MjM3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0MjM3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDIzNzogLi9jb25mdGVzdAotY29uZmlndXJlOjI0MjM3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDI1NDogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDI3MzogY2hlY2tpbmcgd2hldGhlciBzdGF0IGFjY2VwdHMgYW4gZW1wdHkgc3RyaW5nCi1jb25maWd1cmU6MjQyOTM6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgPiY1Ci1jb25maWd1cmU6MjQyOTM6ICQ/ID0gMAotY29uZmlndXJlOjI0MjkzOiAuL2NvbmZ0ZXN0Ci1jb25maWd1cmU6MjQyOTM6ICQ/ID0gMAotY29uZmlndXJlOjI0MzAzOiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjQzMjE6IGNoZWNraW5nIGZvciBzdHJmdGltZQotY29uZmlndXJlOjI0MzIxOiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZnRlc3QuYzo3MTo2OiB3YXJuaW5nOiBjb25mbGljdGluZyB0eXBlcyBmb3IgYnVpbHQtaW4gZnVuY3Rpb24gJ3N0cmZ0aW1lJyBbZW5hYmxlZCBieSBkZWZhdWx0XQotY29uZmlndXJlOjI0MzIxOiAkPyA9IDAKLWNvbmZpZ3VyZToyNDMyMTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDM3NjogY2hlY2tpbmcgZm9yIHZwcmludGYKLWNvbmZpZ3VyZToyNDM3NjogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZ0ZXN0LmM6NzI6Njogd2FybmluZzogY29uZmxpY3RpbmcgdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9uICd2cHJpbnRmJyBbZW5hYmxlZCBieSBkZWZhdWx0XQotY29uZmlndXJlOjI0Mzc2OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDM3NjogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDM4MjogY2hlY2tpbmcgZm9yIF9kb3BybnQKLWNvbmZpZ3VyZToyNDM4MjogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLS90bXAvY2NHd1pIaUEubzogSW4gZnVuY3Rpb24gYG1haW4nOgotL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9jb25mdGVzdC5jOjg0OiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBfZG9wcm50JwotY29sbGVjdDI6IGVycm9yOiBsZCByZXR1cm5lZCAxIGV4aXQgc3RhdHVzCi1jb25maWd1cmU6MjQzODI6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgLyogRGVmaW5lIF9kb3BybnQgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBfZG9wcm50LgotfCAgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLXwgI2RlZmluZSBfZG9wcm50IGlubm9jdW91c19fZG9wcm50Ci18IAotfCAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi18ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIF9kb3BybnQgKCk7IGJlbG93LgotfCAgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotfCAgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLXwgCi18ICNpZmRlZiBfX1NURENfXwotfCAjIGluY2x1ZGUgPGxpbWl0cy5oPgotfCAjZWxzZQotfCAjIGluY2x1ZGUgPGFzc2VydC5oPgotfCAjZW5kaWYKLXwgCi18ICN1bmRlZiBfZG9wcm50Ci18IAotfCAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLXwgICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi18ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi18ICNpZmRlZiBfX2NwbHVzcGx1cwotfCBleHRlcm4gIkMiCi18ICNlbmRpZgotfCBjaGFyIF9kb3BybnQgKCk7Ci18IC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLXwgICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi18ICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLXwgI2lmIGRlZmluZWQgX19zdHViX19kb3BybnQgfHwgZGVmaW5lZCBfX3N0dWJfX19fZG9wcm50Ci18IGNob2tlIG1lCi18ICNlbmRpZgotfCAKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCByZXR1cm4gX2RvcHJudCAoKTsKLXwgICA7Ci18ICAgcmV0dXJuIDA7Ci18IH0KLWNvbmZpZ3VyZToyNDM4MjogcmVzdWx0OiBubwotY29uZmlndXJlOjI0MzkzOiBjaGVja2luZyBmb3IgcGlkX3QKLWNvbmZpZ3VyZToyNDM5MzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZmlndXJlOjI0MzkzOiAkPyA9IDAKLWNvbmZpZ3VyZToyNDM5MzogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzogSW4gZnVuY3Rpb24gJ21haW4nOgotY29uZnRlc3QuYzo4NjoyMDogZXJyb3I6IGV4cGVjdGVkIGV4cHJlc3Npb24gYmVmb3JlICcpJyB0b2tlbgotY29uZmlndXJlOjI0MzkzOiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgI2RlZmluZSBIQVZFX1gxMSAxCi18ICNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBORyAxCi18ICNkZWZpbmUgSEFWRV9MSUJaIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotfCAjZGVmaW5lIEhBVkVfVExTIDEKLXwgI2RlZmluZSBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAxCi18ICNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLXwgI2RlZmluZSBJUHY2IDEKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotfCAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLXwgI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLXwgI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotfCAjZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLXwgI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKLXwgI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18ICNpbmNsdWRlIDxzdGRpby5oPgotfCAjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotfCAjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotfCAjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgU1REQ19IRUFERVJTCi18ICMgaW5jbHVkZSA8c3RkbGliLmg+Ci18ICMgaW5jbHVkZSA8c3RkZGVmLmg+Ci18ICNlbHNlCi18ICMgaWZkZWYgSEFWRV9TVERMSUJfSAotfCAjICBpbmNsdWRlIDxzdGRsaWIuaD4KLXwgIyBlbmRpZgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RSSU5HX0gKLXwgIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi18ICMgIGluY2x1ZGUgPG1lbW9yeS5oPgotfCAjIGVuZGlmCi18ICMgaW5jbHVkZSA8c3RyaW5nLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVFJJTkdTX0gKLXwgIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9JTlRUWVBFU19ICi18ICMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NURElOVF9ICi18ICMgaW5jbHVkZSA8c3RkaW50Lmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9VTklTVERfSAotfCAjIGluY2x1ZGUgPHVuaXN0ZC5oPgotfCAjZW5kaWYKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCBpZiAoc2l6ZW9mICgocGlkX3QpKSkKLXwgCSAgICByZXR1cm4gMDsKLXwgICA7Ci18ICAgcmV0dXJuIDA7Ci18IH0KLWNvbmZpZ3VyZToyNDM5MzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDQwNjogY2hlY2tpbmcgdmZvcmsuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyNDQwNjogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzo4MzoxOTogZmF0YWwgZXJyb3I6IHZmb3JrLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MjQ0MDY6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHN0ZGlvLmg+Ci18ICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi18ICMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi18ICMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBTVERDX0hFQURFUlMKLXwgIyBpbmNsdWRlIDxzdGRsaWIuaD4KLXwgIyBpbmNsdWRlIDxzdGRkZWYuaD4KLXwgI2Vsc2UKLXwgIyBpZmRlZiBIQVZFX1NURExJQl9ICi18ICMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotfCAjIGVuZGlmCi18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVFJJTkdfSAotfCAjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLXwgIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci18ICMgZW5kaWYKLXwgIyBpbmNsdWRlIDxzdHJpbmcuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NUUklOR1NfSAotfCAjIGluY2x1ZGUgPHN0cmluZ3MuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLXwgIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RESU5UX0gKLXwgIyBpbmNsdWRlIDxzdGRpbnQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1VOSVNURF9ICi18ICMgaW5jbHVkZSA8dW5pc3RkLmg+Ci18ICNlbmRpZgotfCAjaW5jbHVkZSA8dmZvcmsuaD4KLWNvbmZpZ3VyZToyNDQwNjogcmVzdWx0OiBubwotY29uZmlndXJlOjI0NDA2OiBjaGVja2luZyB2Zm9yay5oIHByZXNlbmNlCi1jb25maWd1cmU6MjQ0MDY6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZnRlc3QuYzo1MDoxOTogZmF0YWwgZXJyb3I6IHZmb3JrLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MjQ0MDY6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHZmb3JrLmg+Ci1jb25maWd1cmU6MjQ0MDY6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyNDQwNjogY2hlY2tpbmcgZm9yIHZmb3JrLmgKLWNvbmZpZ3VyZToyNDQwNjogcmVzdWx0OiBubwotY29uZmlndXJlOjI0NDE5OiBjaGVja2luZyBmb3IgZm9yawotY29uZmlndXJlOjI0NDE5OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZnRlc3QuYzo3Mzo2OiB3YXJuaW5nOiBjb25mbGljdGluZyB0eXBlcyBmb3IgYnVpbHQtaW4gZnVuY3Rpb24gJ2ZvcmsnIFtlbmFibGVkIGJ5IGRlZmF1bHRdCi1jb25maWd1cmU6MjQ0MTk6ICQ/ID0gMAotY29uZmlndXJlOjI0NDE5OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NDE5OiBjaGVja2luZyBmb3IgdmZvcmsKLWNvbmZpZ3VyZToyNDQxOTogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDQxOTogJD8gPSAwCi1jb25maWd1cmU6MjQ0MTk6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ0Mjk6IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsKLWNvbmZpZ3VyZToyNDQ1MTogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDQ1MTogJD8gPSAwCi1jb25maWd1cmU6MjQ0NTE6IC4vY29uZnRlc3QKLWNvbmZpZ3VyZToyNDQ1MTogJD8gPSAwCi1jb25maWd1cmU6MjQ0NjE6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ0ODI6IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrCi1jb25maWd1cmU6MjQ1OTI6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ2MTc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsCi1jb25maWd1cmU6MjQ2NDI6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxuc2wgIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0NjQyOiAkPyA9IDAKLWNvbmZpZ3VyZToyNDY1MTogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDY2MjogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldAotY29uZmlndXJlOjI0Njg3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sc29ja2V0ICAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLS91c3IvYmluL2xkOiBjYW5ub3QgZmluZCAtbHNvY2tldAotY29sbGVjdDI6IGVycm9yOiBsZCByZXR1cm5lZCAxIGV4aXQgc3RhdHVzCi1jb25maWd1cmU6MjQ2ODc6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18ICNkZWZpbmUgSEFWRV9GT1JLIDEKLXwgI2RlZmluZSBIQVZFX1ZGT1JLIDEKLXwgI2RlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMQotfCAjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEKLXwgI2RlZmluZSBIQVZFX0xJQk5TTCAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgCi18IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotfCAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLXwgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLXwgI2lmZGVmIF9fY3BsdXNwbHVzCi18IGV4dGVybiAiQyIKLXwgI2VuZGlmCi18IGNoYXIgc29ja2V0ICgpOwotfCBpbnQKLXwgbWFpbiAoKQotfCB7Ci18IHJldHVybiBzb2NrZXQgKCk7Ci18ICAgOwotfCAgIHJldHVybiAwOwotfCB9Ci1jb25maWd1cmU6MjQ2OTY6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyNDcxNzogY2hlY2tpbmcgZm9yIGZ0aW1lCi1jb25maWd1cmU6MjQ3MTc6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgPiY1Ci1jb25maWd1cmU6MjQ3MTc6ICQ/ID0gMAotY29uZmlndXJlOjI0NzE3OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NzE3OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZQotY29uZmlndXJlOjI0NzE3OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NzE3OiBjaGVja2luZyBmb3IgZ2V0aG9zdG5hbWUKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBnZXR0aW1lb2ZkYXkKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBpbmV0X250b2EKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBtZW1tb3ZlCi1jb25maWd1cmU6MjQ3MTc6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgPiY1Ci1jb25mdGVzdC5jOjgzOjY6IHdhcm5pbmc6IGNvbmZsaWN0aW5nIHR5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbiAnbWVtbW92ZScgW2VuYWJsZWQgYnkgZGVmYXVsdF0KLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBtZW1zZXQKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZ0ZXN0LmM6ODQ6Njogd2FybmluZzogY29uZmxpY3RpbmcgdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9uICdtZW1zZXQnIFtlbmFibGVkIGJ5IGRlZmF1bHRdCi1jb25maWd1cmU6MjQ3MTc6ICQ/ID0gMAotY29uZmlndXJlOjI0NzE3OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NzE3OiBjaGVja2luZyBmb3IgbW1hcAotY29uZmlndXJlOjI0NzE3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0NzE3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDcxNzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDcxNzogY2hlY2tpbmcgZm9yIG1rZmlmbwotY29uZmlndXJlOjI0NzE3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0NzE3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDcxNzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDcxNzogY2hlY2tpbmcgZm9yIHNlbGVjdAotY29uZmlndXJlOjI0NzE3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0NzE3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDcxNzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDcxNzogY2hlY2tpbmcgZm9yIHNvY2tldAotY29uZmlndXJlOjI0NzE3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZmlndXJlOjI0NzE3OiAkPyA9IDAKLWNvbmZpZ3VyZToyNDcxNzogcmVzdWx0OiB5ZXMKLWNvbmZpZ3VyZToyNDcxNzogY2hlY2tpbmcgZm9yIHN0cmNocgotY29uZmlndXJlOjI0NzE3OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yIC1XYWxsICAgICBjb25mdGVzdC5jIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotY29uZnRlc3QuYzo4OTo2OiB3YXJuaW5nOiBjb25mbGljdGluZyB0eXBlcyBmb3IgYnVpbHQtaW4gZnVuY3Rpb24gJ3N0cmNocicgW2VuYWJsZWQgYnkgZGVmYXVsdF0KLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBzdHJjc3BuCi1jb25maWd1cmU6MjQ3MTc6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgPiY1Ci1jb25mdGVzdC5jOjkwOjY6IHdhcm5pbmc6IGNvbmZsaWN0aW5nIHR5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbiAnc3RyY3NwbicgW2VuYWJsZWQgYnkgZGVmYXVsdF0KLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBzdHJkdXAKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZ0ZXN0LmM6OTE6Njogd2FybmluZzogY29uZmxpY3RpbmcgdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9uICdzdHJkdXAnIFtlbmFibGVkIGJ5IGRlZmF1bHRdCi1jb25maWd1cmU6MjQ3MTc6ICQ/ID0gMAotY29uZmlndXJlOjI0NzE3OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NzE3OiBjaGVja2luZyBmb3Igc3RyZXJyb3IKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZpZ3VyZToyNDcxNzogJD8gPSAwCi1jb25maWd1cmU6MjQ3MTc6IHJlc3VsdDogeWVzCi1jb25maWd1cmU6MjQ3MTc6IGNoZWNraW5nIGZvciBzdHJzdHIKLWNvbmZpZ3VyZToyNDcxNzogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAtV2FsbCAgICAgY29uZnRlc3QuYyAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICA+JjUKLWNvbmZ0ZXN0LmM6OTM6Njogd2FybmluZzogY29uZmxpY3RpbmcgdHlwZXMgZm9yIGJ1aWx0LWluIGZ1bmN0aW9uICdzdHJzdHInIFtlbmFibGVkIGJ5IGRlZmF1bHRdCi1jb25maWd1cmU6MjQ3MTc6ICQ/ID0gMAotY29uZmlndXJlOjI0NzE3OiByZXN1bHQ6IHllcwotY29uZmlndXJlOjI0NzQzOiBjaGVja2luZyBmb3Igc2htZ2V0IGluIC1sY3lnaXBjCi1jb25maWd1cmU6MjQ3Njg6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgLVdhbGwgICAgIGNvbmZ0ZXN0LmMgLWxjeWdpcGMgIC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgID4mNQotL3Vzci9iaW4vbGQ6IGNhbm5vdCBmaW5kIC1sY3lnaXBjCi1jb2xsZWN0MjogZXJyb3I6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKLWNvbmZpZ3VyZToyNDc2ODogJD8gPSAxCi1jb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKLXwgLyogY29uZmRlZnMuaCAqLwotfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkxpYlZOQ1NlcnZlciAwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLXwgI2RlZmluZSBQQUNLQUdFICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgVkVSU0lPTiAiMC45LjkiCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLXwgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCi18ICNkZWZpbmUgQUxMT1cyNEJQUCAxCi18ICNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi18ICNkZWZpbmUgSEFWRV9YMTEgMQotfCAjZGVmaW5lIEhBVkVfTElCSlBFRyAxCi18ICNkZWZpbmUgSEFWRV9MSUJQTkcgMQotfCAjZGVmaW5lIEhBVkVfTElCWiAxCi18ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKLXwgI2RlZmluZSBIQVZFX1RMUyAxCi18ICNkZWZpbmUgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIgMQotfCAjZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxCi18ICNkZWZpbmUgSVB2NiAxCi18ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLXwgI2RlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKLXwgI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUREJfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQotfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotfCAjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi18ICNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKLXwgI2RlZmluZSBMU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOSyAxCi18ICNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCi18ICNkZWZpbmUgSEFWRV9WUFJJTlRGIDEKLXwgI2RlZmluZSBIQVZFX0ZPUksgMQotfCAjZGVmaW5lIEhBVkVfVkZPUksgMQotfCAjZGVmaW5lIEhBVkVfV09SS0lOR19WRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9XT1JLSU5HX0ZPUksgMQotfCAjZGVmaW5lIEhBVkVfTElCTlNMIDEKLXwgI2RlZmluZSBIQVZFX0ZUSU1FIDEKLXwgI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQotfCAjZGVmaW5lIEhBVkVfR0VUSE9TVE5BTUUgMQotfCAjZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZIDEKLXwgI2RlZmluZSBIQVZFX0lORVRfTlRPQSAxCi18ICNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKLXwgI2RlZmluZSBIQVZFX01FTVNFVCAxCi18ICNkZWZpbmUgSEFWRV9NTUFQIDEKLXwgI2RlZmluZSBIQVZFX01LRklGTyAxCi18ICNkZWZpbmUgSEFWRV9TRUxFQ1QgMQotfCAjZGVmaW5lIEhBVkVfU09DS0VUIDEKLXwgI2RlZmluZSBIQVZFX1NUUkNIUiAxCi18ICNkZWZpbmUgSEFWRV9TVFJDU1BOIDEKLXwgI2RlZmluZSBIQVZFX1NUUkRVUCAxCi18ICNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi18ICNkZWZpbmUgSEFWRV9TVFJTVFIgMQotfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCi18IAotfCAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLXwgICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi18ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi18ICNpZmRlZiBfX2NwbHVzcGx1cwotfCBleHRlcm4gIkMiCi18ICNlbmRpZgotfCBjaGFyIHNobWdldCAoKTsKLXwgaW50Ci18IG1haW4gKCkKLXwgewotfCByZXR1cm4gc2htZ2V0ICgpOwotfCAgIDsKLXwgICByZXR1cm4gMDsKLXwgfQotY29uZmlndXJlOjI0Nzc3OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjQ4MDg6IGNoZWNraW5nIEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oIHVzYWJpbGl0eQotY29uZmlndXJlOjI0ODA4OiBnY2MgLWMgLWcgLU8yIC1XYWxsICAgIGNvbmZ0ZXN0LmMgPiY1Ci1jb25mdGVzdC5jOjEwNDo1MzogZmF0YWwgZXJyb3I6IEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Ci1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjI0ODA4OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgI2RlZmluZSBIQVZFX1gxMSAxCi18ICNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBORyAxCi18ICNkZWZpbmUgSEFWRV9MSUJaIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotfCAjZGVmaW5lIEhBVkVfVExTIDEKLXwgI2RlZmluZSBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAxCi18ICNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLXwgI2RlZmluZSBJUHY2IDEKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotfCAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLXwgI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLXwgI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotfCAjZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLXwgI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKLXwgI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotfCAjZGVmaW5lIEhBVkVfRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9WRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEKLXwgI2RlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9MSUJOU0wgMQotfCAjZGVmaW5lIEhBVkVfRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRIT1NUTkFNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQotfCAjZGVmaW5lIEhBVkVfSU5FVF9OVE9BIDEKLXwgI2RlZmluZSBIQVZFX01FTU1PVkUgMQotfCAjZGVmaW5lIEhBVkVfTUVNU0VUIDEKLXwgI2RlZmluZSBIQVZFX01NQVAgMQotfCAjZGVmaW5lIEhBVkVfTUtGSUZPIDEKLXwgI2RlZmluZSBIQVZFX1NFTEVDVCAxCi18ICNkZWZpbmUgSEFWRV9TT0NLRVQgMQotfCAjZGVmaW5lIEhBVkVfU1RSQ0hSIDEKLXwgI2RlZmluZSBIQVZFX1NUUkNTUE4gMQotfCAjZGVmaW5lIEhBVkVfU1RSRFVQIDEKLXwgI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLXwgI2RlZmluZSBIQVZFX1NUUlNUUiAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHN0ZGlvLmg+Ci18ICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi18ICMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi18ICMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBTVERDX0hFQURFUlMKLXwgIyBpbmNsdWRlIDxzdGRsaWIuaD4KLXwgIyBpbmNsdWRlIDxzdGRkZWYuaD4KLXwgI2Vsc2UKLXwgIyBpZmRlZiBIQVZFX1NURExJQl9ICi18ICMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotfCAjIGVuZGlmCi18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVFJJTkdfSAotfCAjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLXwgIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci18ICMgZW5kaWYKLXwgIyBpbmNsdWRlIDxzdHJpbmcuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NUUklOR1NfSAotfCAjIGluY2x1ZGUgPHN0cmluZ3MuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLXwgIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RESU5UX0gKLXwgIyBpbmNsdWRlIDxzdGRpbnQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1VOSVNURF9ICi18ICMgaW5jbHVkZSA8dW5pc3RkLmg+Ci18ICNlbmRpZgotfCAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci1jb25maWd1cmU6MjQ4MDg6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyNDgwODogY2hlY2tpbmcgQXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmggcHJlc2VuY2UKLWNvbmZpZ3VyZToyNDgwODogZ2NjIC1FICBjb25mdGVzdC5jCi1jb25mdGVzdC5jOjcxOjUzOiBmYXRhbCBlcnJvcjogQXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MjQ4MDg6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18ICNkZWZpbmUgSEFWRV9GT1JLIDEKLXwgI2RlZmluZSBIQVZFX1ZGT1JLIDEKLXwgI2RlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMQotfCAjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEKLXwgI2RlZmluZSBIQVZFX0xJQk5TTCAxCi18ICNkZWZpbmUgSEFWRV9GVElNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FIDEKLXwgI2RlZmluZSBIQVZFX0dFVEhPU1ROQU1FIDEKLXwgI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCi18ICNkZWZpbmUgSEFWRV9JTkVUX05UT0EgMQotfCAjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCi18ICNkZWZpbmUgSEFWRV9NRU1TRVQgMQotfCAjZGVmaW5lIEhBVkVfTU1BUCAxCi18ICNkZWZpbmUgSEFWRV9NS0ZJRk8gMQotfCAjZGVmaW5lIEhBVkVfU0VMRUNUIDEKLXwgI2RlZmluZSBIQVZFX1NPQ0tFVCAxCi18ICNkZWZpbmUgSEFWRV9TVFJDSFIgMQotfCAjZGVmaW5lIEhBVkVfU1RSQ1NQTiAxCi18ICNkZWZpbmUgSEFWRV9TVFJEVVAgMQotfCAjZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotfCAjZGVmaW5lIEhBVkVfU1RSU1RSIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci1jb25maWd1cmU6MjQ4MDg6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyNDgwODogY2hlY2tpbmcgZm9yIEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oCi1jb25maWd1cmU6MjQ4MDg6IHJlc3VsdDogbm8KLWNvbmZpZ3VyZToyNDgyNDogY2hlY2tpbmcgYW5kcm9pZC9hcGktbGV2ZWwuaCB1c2FiaWxpdHkKLWNvbmZpZ3VyZToyNDgyNDogZ2NjIC1jIC1nIC1PMiAtV2FsbCAgICBjb25mdGVzdC5jID4mNQotY29uZnRlc3QuYzoxMDQ6MzE6IGZhdGFsIGVycm9yOiBhbmRyb2lkL2FwaS1sZXZlbC5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Ci1jb21waWxhdGlvbiB0ZXJtaW5hdGVkLgotY29uZmlndXJlOjI0ODI0OiAkPyA9IDEKLWNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgotfCAvKiBjb25mZGVmcy5oICovCi18ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJMaWJWTkNTZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi18ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiTGliVk5DU2VydmVyIDAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1VSTCAiIgotfCAjZGVmaW5lIFBBQ0tBR0UgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLXwgI2RlZmluZSBBTExPVzI0QlBQIDEKLXwgI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLXwgI2RlZmluZSBIQVZFX1gxMSAxCi18ICNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBORyAxCi18ICNkZWZpbmUgSEFWRV9MSUJaIDEKLXwgI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotfCAjZGVmaW5lIEhBVkVfVExTIDEKLXwgI2RlZmluZSBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiAxCi18ICNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLXwgI2RlZmluZSBJUHY2IDEKLXwgI2RlZmluZSBTVERDX0hFQURFUlMgMQotfCAjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotfCAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi18ICNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLXwgI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi18ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotfCAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi18ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi18ICNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLXwgI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotfCAjZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLXwgI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKLXwgI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotfCAjZGVmaW5lIEhBVkVfRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9WRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEKLXwgI2RlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxCi18ICNkZWZpbmUgSEFWRV9MSUJOU0wgMQotfCAjZGVmaW5lIEhBVkVfRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRIT1NUTkFNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQotfCAjZGVmaW5lIEhBVkVfSU5FVF9OVE9BIDEKLXwgI2RlZmluZSBIQVZFX01FTU1PVkUgMQotfCAjZGVmaW5lIEhBVkVfTUVNU0VUIDEKLXwgI2RlZmluZSBIQVZFX01NQVAgMQotfCAjZGVmaW5lIEhBVkVfTUtGSUZPIDEKLXwgI2RlZmluZSBIQVZFX1NFTEVDVCAxCi18ICNkZWZpbmUgSEFWRV9TT0NLRVQgMQotfCAjZGVmaW5lIEhBVkVfU1RSQ0hSIDEKLXwgI2RlZmluZSBIQVZFX1NUUkNTUE4gMQotfCAjZGVmaW5lIEhBVkVfU1RSRFVQIDEKLXwgI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLXwgI2RlZmluZSBIQVZFX1NUUlNUUiAxCi18IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLXwgI2luY2x1ZGUgPHN0ZGlvLmg+Ci18ICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi18ICMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi18ICMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBTVERDX0hFQURFUlMKLXwgIyBpbmNsdWRlIDxzdGRsaWIuaD4KLXwgIyBpbmNsdWRlIDxzdGRkZWYuaD4KLXwgI2Vsc2UKLXwgIyBpZmRlZiBIQVZFX1NURExJQl9ICi18ICMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotfCAjIGVuZGlmCi18ICNlbmRpZgotfCAjaWZkZWYgSEFWRV9TVFJJTkdfSAotfCAjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLXwgIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci18ICMgZW5kaWYKLXwgIyBpbmNsdWRlIDxzdHJpbmcuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1NUUklOR1NfSAotfCAjIGluY2x1ZGUgPHN0cmluZ3MuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLXwgIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotfCAjZW5kaWYKLXwgI2lmZGVmIEhBVkVfU1RESU5UX0gKLXwgIyBpbmNsdWRlIDxzdGRpbnQuaD4KLXwgI2VuZGlmCi18ICNpZmRlZiBIQVZFX1VOSVNURF9ICi18ICMgaW5jbHVkZSA8dW5pc3RkLmg+Ci18ICNlbmRpZgotfCAjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KLWNvbmZpZ3VyZToyNDgyNDogcmVzdWx0OiBubwotY29uZmlndXJlOjI0ODI0OiBjaGVja2luZyBhbmRyb2lkL2FwaS1sZXZlbC5oIHByZXNlbmNlCi1jb25maWd1cmU6MjQ4MjQ6IGdjYyAtRSAgY29uZnRlc3QuYwotY29uZnRlc3QuYzo3MTozMTogZmF0YWwgZXJyb3I6IGFuZHJvaWQvYXBpLWxldmVsLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLWNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCi1jb25maWd1cmU6MjQ4MjQ6ICQ/ID0gMQotY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Ci18IC8qIGNvbmZkZWZzLmggKi8KLXwgI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxpYnZuY3NlcnZlciIKLXwgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi18ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotfCAjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi18ICNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotfCAjZGVmaW5lIFZFUlNJT04gIjAuOS45IgotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi18ICNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLXwgI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotfCAjZGVmaW5lIEFMTE9XMjRCUFAgMQotfCAjZGVmaW5lIEhBVkVfTElCQ1JZUFQgMQotfCAjZGVmaW5lIEhBVkVfWDExIDEKLXwgI2RlZmluZSBIQVZFX0xJQkpQRUcgMQotfCAjZGVmaW5lIEhBVkVfTElCUE5HIDEKLXwgI2RlZmluZSBIQVZFX0xJQlogMQotfCAjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCi18ICNkZWZpbmUgSEFWRV9UTFMgMQotfCAjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLXwgI2RlZmluZSBXSVRIX1dFQlNPQ0tFVFMgMQotfCAjZGVmaW5lIElQdjYgMQotfCAjZGVmaW5lIFNURENfSEVBREVSUyAxCi18ICNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi18ICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLXwgI2RlZmluZSBIQVZFX05FVERCX0ggMQotfCAjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKLXwgI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCi18ICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLXwgI2RlZmluZSBIQVZFX1NZU0xPR19IIDEKLXwgI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLXwgI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotfCAjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi18ICNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotfCAjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotfCAjZGVmaW5lIEhBVkVfVlBSSU5URiAxCi18ICNkZWZpbmUgSEFWRV9GT1JLIDEKLXwgI2RlZmluZSBIQVZFX1ZGT1JLIDEKLXwgI2RlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMQotfCAjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEKLXwgI2RlZmluZSBIQVZFX0xJQk5TTCAxCi18ICNkZWZpbmUgSEFWRV9GVElNRSAxCi18ICNkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FIDEKLXwgI2RlZmluZSBIQVZFX0dFVEhPU1ROQU1FIDEKLXwgI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCi18ICNkZWZpbmUgSEFWRV9JTkVUX05UT0EgMQotfCAjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCi18ICNkZWZpbmUgSEFWRV9NRU1TRVQgMQotfCAjZGVmaW5lIEhBVkVfTU1BUCAxCi18ICNkZWZpbmUgSEFWRV9NS0ZJRk8gMQotfCAjZGVmaW5lIEhBVkVfU0VMRUNUIDEKLXwgI2RlZmluZSBIQVZFX1NPQ0tFVCAxCi18ICNkZWZpbmUgSEFWRV9TVFJDSFIgMQotfCAjZGVmaW5lIEhBVkVfU1RSQ1NQTiAxCi18ICNkZWZpbmUgSEFWRV9TVFJEVVAgMQotfCAjZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotfCAjZGVmaW5lIEhBVkVfU1RSU1RSIDEKLXwgLyogZW5kIGNvbmZkZWZzLmguICAqLwotfCAjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KLWNvbmZpZ3VyZToyNDgyNDogcmVzdWx0OiBubwotY29uZmlndXJlOjI0ODI0OiBjaGVja2luZyBmb3IgYW5kcm9pZC9hcGktbGV2ZWwuaAotY29uZmlndXJlOjI0ODI0OiByZXN1bHQ6IG5vCi1jb25maWd1cmU6MjUxMzk6IGNyZWF0aW5nIC4vY29uZmlnLnN0YXR1cwotCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBSdW5uaW5nIGNvbmZpZy5zdGF0dXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgTGliVk5DU2VydmVyIGNvbmZpZy5zdGF0dXMgMC45LjksIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgQ09ORklHX0ZJTEVTICAgID0gCi0gIENPTkZJR19IRUFERVJTICA9IAotICBDT05GSUdfTElOS1MgICAgPSAKLSAgQ09ORklHX0NPTU1BTkRTID0gCi0gICQgLi9jb25maWcuc3RhdHVzIAotCi1vbiBhbmRyb2lkLWRldgotCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIE1ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIGxpYnZuY3NlcnZlci5wYwotY29uZmlnLnN0YXR1czoxMDE5OiBjcmVhdGluZyBsaWJ2bmNjbGllbnQucGMKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgbGlidm5jc2VydmVyL01ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIGV4YW1wbGVzL01ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIGV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgdm5jdGVybS9NYWtlZmlsZQotY29uZmlnLnN0YXR1czoxMDE5OiBjcmVhdGluZyB3ZWJjbGllbnRzL01ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIHdlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wvTWFrZWZpbGUKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgbGlidm5jY2xpZW50L01ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZQotY29uZmlnLnN0YXR1czoxMDE5OiBjcmVhdGluZyB0ZXN0L01ha2VmaWxlCi1jb25maWcuc3RhdHVzOjEwMTk6IGNyZWF0aW5nIGxpYnZuY3NlcnZlci1jb25maWcKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgTGliVk5DU2VydmVyLnNwZWMKLWNvbmZpZy5zdGF0dXM6MTAxOTogY3JlYXRpbmcgcmZiY29uZmlnLmgKLWNvbmZpZy5zdGF0dXM6MTI0ODogZXhlY3V0aW5nIHJmYi9yZmJjb25maWcuaCBjb21tYW5kcwotY29uZmlnLnN0YXR1czoxMjg2OiBjcmVhdGluZyByZmIvcmZiY29uZmlnLmggLSBwcmVmaXggTElCVk5DU0VSVkVSIGZvciByZmJjb25maWcuaCBkZWZpbmVzCi1jb25maWcuc3RhdHVzOjEyNDg6IGV4ZWN1dGluZyBkZXBmaWxlcyBjb21tYW5kcwotY29uZmlnLnN0YXR1czoxMjQ4OiBleGVjdXRpbmcgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyBjb21tYW5kcwotY29uZmlndXJlOjI2NTY2OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCi0KLSMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIENhY2hlIHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLQotYWNfY3ZfYnVpbGQ9eDg2XzY0LXVua25vd24tbGludXgtZ251Ci1hY19jdl9jX2JpZ2VuZGlhbj1ubwotYWNfY3ZfY19jb21waWxlcl9nbnU9eWVzCi1hY19jdl9jX2NvbnN0PXllcwotYWNfY3ZfY19pbmxpbmU9aW5saW5lCi1hY19jdl9jeHhfY29tcGlsZXJfZ251PXllcwotYWNfY3ZfZW52X0NDQ19zZXQ9Ci1hY19jdl9lbnZfQ0NDX3ZhbHVlPQotYWNfY3ZfZW52X0NDX3NldD0KLWFjX2N2X2Vudl9DQ192YWx1ZT0KLWFjX2N2X2Vudl9DRkxBR1Nfc2V0PQotYWNfY3ZfZW52X0NGTEFHU192YWx1ZT0KLWFjX2N2X2Vudl9DUFBGTEFHU19zZXQ9Ci1hY19jdl9lbnZfQ1BQRkxBR1NfdmFsdWU9Ci1hY19jdl9lbnZfQ1BQX3NldD0KLWFjX2N2X2Vudl9DUFBfdmFsdWU9Ci1hY19jdl9lbnZfQ1hYQ1BQX3NldD0KLWFjX2N2X2Vudl9DWFhDUFBfdmFsdWU9Ci1hY19jdl9lbnZfQ1hYRkxBR1Nfc2V0PQotYWNfY3ZfZW52X0NYWEZMQUdTX3ZhbHVlPQotYWNfY3ZfZW52X0NYWF9zZXQ9Ci1hY19jdl9lbnZfQ1hYX3ZhbHVlPQotYWNfY3ZfZW52X0Y3N19zZXQ9Ci1hY19jdl9lbnZfRjc3X3ZhbHVlPQotYWNfY3ZfZW52X0ZGTEFHU19zZXQ9Ci1hY19jdl9lbnZfRkZMQUdTX3ZhbHVlPQotYWNfY3ZfZW52X0dOVVRMU19DRkxBR1Nfc2V0PQotYWNfY3ZfZW52X0dOVVRMU19DRkxBR1NfdmFsdWU9Ci1hY19jdl9lbnZfR05VVExTX0xJQlNfc2V0PQotYWNfY3ZfZW52X0dOVVRMU19MSUJTX3ZhbHVlPQotYWNfY3ZfZW52X0dUS19DRkxBR1Nfc2V0PQotYWNfY3ZfZW52X0dUS19DRkxBR1NfdmFsdWU9Ci1hY19jdl9lbnZfR1RLX0xJQlNfc2V0PQotYWNfY3ZfZW52X0dUS19MSUJTX3ZhbHVlPQotYWNfY3ZfZW52X0pQRUdfTERGTEFHU19zZXQ9Ci1hY19jdl9lbnZfSlBFR19MREZMQUdTX3ZhbHVlPQotYWNfY3ZfZW52X0xERkxBR1Nfc2V0PQotYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9Ci1hY19jdl9lbnZfTElCU19zZXQ9Ci1hY19jdl9lbnZfTElCU192YWx1ZT0KLWFjX2N2X2Vudl9QS0dfQ09ORklHX0xJQkRJUl9zZXQ9Ci1hY19jdl9lbnZfUEtHX0NPTkZJR19MSUJESVJfdmFsdWU9Ci1hY19jdl9lbnZfUEtHX0NPTkZJR19QQVRIX3NldD0KLWFjX2N2X2Vudl9QS0dfQ09ORklHX1BBVEhfdmFsdWU9Ci1hY19jdl9lbnZfUEtHX0NPTkZJR19zZXQ9Ci1hY19jdl9lbnZfUEtHX0NPTkZJR192YWx1ZT0KLWFjX2N2X2Vudl9YTUtNRl9zZXQ9Ci1hY19jdl9lbnZfWE1LTUZfdmFsdWU9Ci1hY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PQotYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPQotYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PQotYWNfY3ZfZW52X2hvc3RfYWxpYXNfdmFsdWU9Ci1hY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0KLWFjX2N2X2Vudl90YXJnZXRfYWxpYXNfdmFsdWU9Ci1hY19jdl9mNzdfY29tcGlsZXJfZ251PW5vCi1hY19jdl9mdW5jX19kb3BybnQ9bm8KLWFjX2N2X2Z1bmNfY29ubmVjdD15ZXMKLWFjX2N2X2Z1bmNfY3J5cHQ9bm8KLWFjX2N2X2Z1bmNfZm9yaz15ZXMKLWFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLWFjX2N2X2Z1bmNfZnRpbWU9eWVzCi1hY19jdl9mdW5jX2dldGFkZHJpbmZvPXllcwotYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPXllcwotYWNfY3ZfZnVuY19nZXRob3N0bmFtZT15ZXMKLWFjX2N2X2Z1bmNfZ2V0dGltZW9mZGF5PXllcwotYWNfY3ZfZnVuY19pbmV0X250b2E9eWVzCi1hY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9eWVzCi1hY19jdl9mdW5jX21lbWNtcF93b3JraW5nPXllcwotYWNfY3ZfZnVuY19tZW1tb3ZlPXllcwotYWNfY3ZfZnVuY19tZW1zZXQ9eWVzCi1hY19jdl9mdW5jX21rZmlmbz15ZXMKLWFjX2N2X2Z1bmNfbW1hcD15ZXMKLWFjX2N2X2Z1bmNfcmVtb3ZlPXllcwotYWNfY3ZfZnVuY19zZWxlY3Q9eWVzCi1hY19jdl9mdW5jX3NobWF0PXllcwotYWNfY3ZfZnVuY19zb2NrZXQ9eWVzCi1hY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zz1ubwotYWNfY3ZfZnVuY19zdHJjaHI9eWVzCi1hY19jdl9mdW5jX3N0cmNzcG49eWVzCi1hY19jdl9mdW5jX3N0cmR1cD15ZXMKLWFjX2N2X2Z1bmNfc3RyZXJyb3I9eWVzCi1hY19jdl9mdW5jX3N0cmZ0aW1lPXllcwotYWNfY3ZfZnVuY19zdHJzdHI9eWVzCi1hY19jdl9mdW5jX3Zmb3JrPXllcwotYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMKLWFjX2N2X2Z1bmNfdnByaW50Zj15ZXMKLWFjX2N2X2hhdmVfeD0naGF2ZV94PXllcwlhY194X2luY2x1ZGVzPSdcJycnXCcnCWFjX3hfbGlicmFyaWVzPSdcJycnXCcnJwotYWNfY3ZfaGVhZGVyX0FwcGxpY2F0aW9uU2VydmljZXNfQXBwbGljYXRpb25TZXJ2aWNlc19oPW5vCi1hY19jdl9oZWFkZXJfYW5kcm9pZF9hcGlfbGV2ZWxfaD1ubwotYWNfY3ZfaGVhZGVyX2FycGFfaW5ldF9oPXllcwotYWNfY3ZfaGVhZGVyX2RsZmNuX2g9eWVzCi1hY19jdl9oZWFkZXJfZmNudGxfaD15ZXMKLWFjX2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcwotYWNfY3ZfaGVhZGVyX2pwZWdsaWJfaD15ZXMKLWFjX2N2X2hlYWRlcl9tZW1vcnlfaD15ZXMKLWFjX2N2X2hlYWRlcl9uZXRkYl9oPXllcwotYWNfY3ZfaGVhZGVyX25ldGluZXRfaW5faD15ZXMKLWFjX2N2X2hlYWRlcl9wbmdfaD15ZXMKLWFjX2N2X2hlYWRlcl9wdGhyZWFkX2g9eWVzCi1hY19jdl9oZWFkZXJfc3RkYz15ZXMKLWFjX2N2X2hlYWRlcl9zdGRpbnQ9c3RkaW50LmgKLWFjX2N2X2hlYWRlcl9zdGRpbnRfaD15ZXMKLWFjX2N2X2hlYWRlcl9zdGRpbnRfbz1uby1maWxlCi1hY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9bm8KLWFjX2N2X2hlYWRlcl9zdGRpbnRfdT1uby1maWxlCi1hY19jdl9oZWFkZXJfc3RkaW50X3g9c3RkaW50LmgKLWFjX2N2X2hlYWRlcl9zdGRsaWJfaD15ZXMKLWFjX2N2X2hlYWRlcl9zdHJpbmdfaD15ZXMKLWFjX2N2X2hlYWRlcl9zdHJpbmdzX2g9eWVzCi1hY19jdl9oZWFkZXJfc3lzX3NvY2tldF9oPXllcwotYWNfY3ZfaGVhZGVyX3N5c19zdGF0X2g9eWVzCi1hY19jdl9oZWFkZXJfc3lzX3RpbWVfaD15ZXMKLWFjX2N2X2hlYWRlcl9zeXNfdGltZWJfaD15ZXMKLWFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaD15ZXMKLWFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotYWNfY3ZfaGVhZGVyX3N5c2xvZ19oPXllcwotYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2g9bm8KLWFjX2N2X2hlYWRlcl90aW1lPXllcwotYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oPXllcwotYWNfY3ZfaGVhZGVyX3Zmb3JrX2g9bm8KLWFjX2N2X2hlYWRlcl93czJ0Y3BpcF9oPW5vCi1hY19jdl9oZWFkZXJfemxpYl9oPXllcwotYWNfY3ZfaG9zdD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj15ZXMKLWFjX2N2X2xpYl9YMTFfWEdldEltYWdlPXllcwotYWNfY3ZfbGliX2NyeXB0X2NyeXB0PXllcwotYWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZT1ubwotYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQ9bm8KLWFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKLWFjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3Q9eWVzCi1hY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9eWVzCi1hY19jdl9saWJfcmVzb2x2X19fYjY0X250b3A9eWVzCi1hY19jdl9saWJfc29ja2V0X3NvY2tldD1ubwotYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PW5vCi1hY19jdl9saWJfel9kZWZsYXRlPXllcwotYWNfY3Zfb2JqZXh0PW8KLWFjX2N2X3BhdGhfQVI9L3Vzci9iaW4vYXIKLWFjX2N2X3BhdGhfRUdSRVA9Jy9iaW4vZ3JlcCAtRScKLWFjX2N2X3BhdGhfR1JFUD0vYmluL2dyZXAKLWFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRz1ubwotYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPS91c3IvYmluL3BrZy1jb25maWcKLWFjX2N2X3BhdGhfaW5zdGFsbD0nL3Vzci9iaW4vaW5zdGFsbCAtYycKLWFjX2N2X3BhdGhfbWtkaXI9L2Jpbi9ta2RpcgotYWNfY3ZfcHJvZ19BV0s9bWF3awotYWNfY3ZfcHJvZ19DUFA9J2djYyAtRScKLWFjX2N2X3Byb2dfQ1hYQ1BQPSdnKysgLUUnCi1hY19jdl9wcm9nX2FjX2N0X0FSPWFyCi1hY19jdl9wcm9nX2FjX2N0X0NDPWdjYwotYWNfY3ZfcHJvZ19hY19jdF9DWFg9ZysrCi1hY19jdl9wcm9nX2FjX2N0X1JBTkxJQj1yYW5saWIKLWFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9c3RyaXAKLWFjX2N2X3Byb2dfY2NfYzg5PQotYWNfY3ZfcHJvZ19jY19nPXllcwotYWNfY3ZfcHJvZ19jY19nY2NfY19vPXllcwotYWNfY3ZfcHJvZ19jeHhfZz15ZXMKLWFjX2N2X3Byb2dfZjc3X2c9bm8KLWFjX2N2X3Byb2dfbWFrZV9tYWtlX3NldD15ZXMKLWFjX2N2X3NpemVvZl9YPTo6OjoKLWFjX2N2X3NpemVvZl94PToKLWFjX2N2X3R5cGVfaW50X2Zhc3QzMl90PXllcwotYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90PXllcwotYWNfY3ZfdHlwZV9waWRfdD15ZXMKLWFjX2N2X3R5cGVfc2l6ZV90PXllcwotYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9eWVzCi1hY19jdl90eXBlX3VpbnQ2NF90PXllcwotYWNfY3ZfdHlwZV91aW50cHRyX3Q9eWVzCi1hbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1nY2MzCi1hbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9Z2NjMwotYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXM9eWVzCi1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCi1sdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KLWx0X2N2X2xkX3JlbG9hZF9mbGFnPS1yCi1sdF9jdl9vYmpkaXI9LmxpYnMKLWx0X2N2X3BhdGhfTEQ9L3Vzci9iaW4vbGQKLWx0X2N2X3BhdGhfTERDWFg9Jy91c3IvYmluL2xkIC1tIGVsZl94ODZfNjQnCi1sdF9jdl9wYXRoX05NPScvdXNyL2Jpbi9ubSAtQicKLWx0X2N2X3BhdGhfU0VEPS9iaW4vc2VkCi1sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKLWx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD15ZXMKLWx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi1sdF9jdl9wcm9nX2dudV9sZD15ZXMKLWx0X2N2X3Byb2dfZ251X2xkY3h4PXllcwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0nc2VkIC1uIC1lICdcJydzL14uKlsgCV1cKFtBQkNER0lSU1RXXVtBQkNER0lSU1RXXSpcKVsgCV1bIAldKlwoW19BLVphLXpdW19BLVphLXowLTldKlwpJC9cMSBcMiBcMi9wJ1wnJycKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSdzZWQgLW4gLWUgJ1wnJ3MvXjogXChbXiBdKlwpICQvICB7XCJcMVwiLCAobHRfcHRyKSAwfSwvcCdcJycgLWUgJ1wnJ3MvXltCQ0RFR1JTVF0gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cikgXCZcMn0sL3AnXCcnJwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9J3NlZCAtbiAtZSAnXCcncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnXCcnJwotbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4Ci1sdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz0nInllcyInCi1sdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9JyJ5ZXMiJwotbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0nInNlZCAtbiAtZSAnXCcncy9eLipbIAldXFwoW0FCQ0RHSVJTVFddW0FCQ0RHSVJTVFddKlxcKVsgCV1bIAldKlxcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcXClcJC9cXDEgXFwyIFxcMi9wJ1wnJyInCi1sdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0nInNlZCAtbiAtZSAnXCcncy9eOiBcXChbXiBdKlxcKSBcJC8gIHtcXFwiXFwxXFxcIiwgKGx0X3B0cikgMH0sL3AnXCcnIC1lICdcJydzL15bQkNERUdSU1RdIFxcKFteIF0qXFwpIFxcKFteIF0qXFwpXCQvICB7XCJcXDJcIiwgKGx0X3B0cikgXFwmXFwyfSwvcCdcJyciJwotbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JyJzZWQgLW4gLWUgJ1wnJ3MvXi4gLiogXFwoLipcXClcJC9leHRlcm4gaW50IFxcMTsvcCdcJyciJwotCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLUFDTE9DQUw9JyR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhY2xvY2FsLTEuMTEnCi1BTURFUEJBQ0tTTEFTSD0nXCcKLUFNREVQX0ZBTFNFPScjJwotQU1ERVBfVFJVRT0nJwotQU1UQVI9JyQke1RBUi10YXJ9JwotQU1fQkFDS1NMQVNIPSdcJwotQU1fREVGQVVMVF9WPSckKEFNX0RFRkFVTFRfVkVSQk9TSVRZKScKLUFNX0RFRkFVTFRfVkVSQk9TSVRZPScwJwotQU1fVj0nJChWKScKLUFORFJPSURfRkFMU0U9JycKLUFORFJPSURfVFJVRT0nIycKLUFSPScvdXNyL2Jpbi9hcicKLUFTPSdhcycKLUFVVE9DT05GPScke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2NvbmYnCi1BVVRPSEVBREVSPScke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlcicKLUFVVE9NQUtFPScke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS4xMScKLUFWQUhJX0NGTEFHUz0nJwotQVZBSElfTElCUz0nJwotQVdLPSdtYXdrJwotQ0M9J2djYycKLUNDREVQTU9ERT0nZGVwbW9kZT1nY2MzJwotQ0ZMQUdTPSctZyAtTzIgLVdhbGwgICcKLUNQUD0nZ2NjIC1FJwotQ1BQRkxBR1M9JycKLUNSWVBUX0xJQlM9Jy1sY3J5cHQnCi1DWFg9J2crKycKLUNYWENQUD0nZysrIC1FJwotQ1hYREVQTU9ERT0nZGVwbW9kZT1nY2MzJwotQ1hYRkxBR1M9Jy1nIC1PMicKLUNZR0lQQ19GQUxTRT0nJwotQ1lHSVBDX1RSVUU9JyMnCi1DWUdQQVRIX1c9J2VjaG8nCi1ERUZTPSctREhBVkVfQ09ORklHX0gnCi1ERVBESVI9Jy5kZXBzJwotRExMVE9PTD0nZGxsdG9vbCcKLUVDSE89J2VjaG8nCi1FQ0hPX0M9JycKLUVDSE9fTj0nLW4nCi1FQ0hPX1Q9JycKLUVHUkVQPScvYmluL2dyZXAgLUUnCi1FWEVFWFQ9JycKLUY3Nz0nJwotRkZMQUdTPScnCi1HTlVUTFNfQ0ZMQUdTPScnCi1HTlVUTFNfTElCUz0nJwotR1JFUD0nL2Jpbi9ncmVwJwotR1RLX0NGTEFHUz0nJwotR1RLX0xJQlM9JycKLUhBVkVfR05VVExTX0ZBTFNFPScnCi1IQVZFX0dOVVRMU19UUlVFPScjJwotSEFWRV9MSUJHVEtfRkFMU0U9JycKLUhBVkVfTElCR1RLX1RSVUU9JyMnCi1IQVZFX0xJQkpQRUdfRkFMU0U9JyMnCi1IQVZFX0xJQkpQRUdfVFJVRT0nJwotSEFWRV9MSUJQTkdfRkFMU0U9JyMnCi1IQVZFX0xJQlBOR19UUlVFPScnCi1IQVZFX0xJQlBUSFJFQURfRkFMU0U9JyMnCi1IQVZFX0xJQlBUSFJFQURfVFJVRT0nJwotSEFWRV9MSUJTRExfRkFMU0U9JycKLUhBVkVfTElCU0RMX1RSVUU9JyMnCi1IQVZFX0xJQlNTTF9GQUxTRT0nJwotSEFWRV9MSUJTU0xfVFJVRT0nIycKLUhBVkVfTElCWl9GQUxTRT0nIycKLUhBVkVfTElCWl9UUlVFPScnCi1IQVZFX01QM0xBTUVfRkFMU0U9JycKLUhBVkVfTVAzTEFNRV9UUlVFPScjJwotSEFWRV9SUE1fRkFMU0U9JycKLUhBVkVfUlBNX1RSVUU9JyMnCi1IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0U9JycKLUhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFPScjJwotSEFWRV9YMTFfRkFMU0U9JyMnCi1IQVZFX1gxMV9UUlVFPScnCi1JTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi1JTlNUQUxMX1NUUklQX1BST0dSQU09JyQoaW5zdGFsbF9zaCkgLWMgLXMnCi1KUEVHX0xERkxBR1M9JycKLUxERkxBR1M9JycKLUxJQkdDUllQVF9DRkxBR1M9JycKLUxJQkdDUllQVF9DT05GSUc9J25vJwotTElCR0NSWVBUX0xJQlM9JycKLUxJQk9CSlM9JycKLUxJQlM9Jy1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgJwotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1MSU5VWF9GQUxTRT0nIycKLUxJTlVYX1RSVUU9JycKLUxOX1M9J2xuIC1zJwotTFRMSUJPQkpTPScnCi1NQUtFSU5GTz0nJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIG1ha2VpbmZvJwotTUlOR1dfRkFMU0U9JycKLU1JTkdXX1RSVUU9JyMnCi1NS0RJUl9QPScvYmluL21rZGlyIC1wJwotT0JKRFVNUD0nb2JqZHVtcCcKLU9CSkVYVD0nbycKLU9TWF9GQUxTRT0nJwotT1NYX09QRU5HTF9GQUxTRT0nJwotT1NYX09QRU5HTF9UUlVFPScjJwotT1NYX1RSVUU9JyMnCi1QQUNLQUdFPSdMaWJWTkNTZXJ2ZXInCi1QQUNLQUdFX0JVR1JFUE9SVD0naHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXInCi1QQUNLQUdFX05BTUU9J0xpYlZOQ1NlcnZlcicKLVBBQ0tBR0VfU1RSSU5HPSdMaWJWTkNTZXJ2ZXIgMC45LjknCi1QQUNLQUdFX1RBUk5BTUU9J2xpYnZuY3NlcnZlcicKLVBBQ0tBR0VfVVJMPScnCi1QQUNLQUdFX1ZFUlNJT049JzAuOS45JwotUEFUSF9TRVBBUkFUT1I9JzonCi1QS0dfQ09ORklHPScvdXNyL2Jpbi9wa2ctY29uZmlnJwotUEtHX0NPTkZJR19MSUJESVI9JycKLVBLR19DT05GSUdfUEFUSD0nJwotUkFOTElCPSdyYW5saWInCi1SUE1TT1VSQ0VESVI9J05PVC1GT1VORCcKLVNETF9DRkxBR1M9JycKLVNETF9MSUJTPScnCi1TRVRfTUFLRT0nJwotU0hFTEw9Jy9iaW4vYmFzaCcKLVNTTF9MSUJTPScnCi1TVFJJUD0nc3RyaXAnCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUz0nJwotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTPScnCi1WRVJTSU9OPScwLjkuOScKLVdJVEhfRkZNUEVHX0ZBTFNFPScnCi1XSVRIX0ZGTVBFR19UUlVFPScjJwotV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0U9JyMnCi1XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFPScnCi1XSVRIX1dFQlNPQ0tFVFNfRkFMU0U9JyMnCi1XSVRIX1dFQlNPQ0tFVFNfVFJVRT0nJwotV0lUSF9YMTFWTkNfRkFMU0U9JycKLVdJVEhfWDExVk5DX1RSVUU9JyMnCi1XU09DS0xJQj0nJwotWE1LTUY9JycKLVhfQ0ZMQUdTPScnCi1YX0VYVFJBX0xJQlM9JycKLVhfTElCUz0nJwotWF9QUkVfTElCUz0nIC1sU00gLWxJQ0UnCi1hY19jdF9DQz0nZ2NjJwotYWNfY3RfQ1hYPSdnKysnCi1hY19jdF9GNzc9JycKLWFtX19FWEVFWFRfRkFMU0U9JycKLWFtX19FWEVFWFRfVFJVRT0nIycKLWFtX19mYXN0ZGVwQ0NfRkFMU0U9JyMnCi1hbV9fZmFzdGRlcENDX1RSVUU9JycKLWFtX19mYXN0ZGVwQ1hYX0ZBTFNFPScjJwotYW1fX2Zhc3RkZXBDWFhfVFJVRT0nJwotYW1fX2luY2x1ZGU9J2luY2x1ZGUnCi1hbV9faXNyYz0nJwotYW1fX2xlYWRpbmdfZG90PScuJwotYW1fX25vZGVwPSdfbm8nCi1hbV9fcXVvdGU9JycKLWFtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJwotYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJwotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1idWlsZD0neDg2XzY0LXVua25vd24tbGludXgtZ251JwotYnVpbGRfYWxpYXM9JycKLWJ1aWxkX2NwdT0neDg2XzY0JwotYnVpbGRfb3M9J2xpbnV4LWdudScKLWJ1aWxkX3ZlbmRvcj0ndW5rbm93bicKLWRhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9JwotZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWR2aWRpcj0nJHtkb2NkaXJ9JwotZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLWhvc3Q9J3g4Nl82NC11bmtub3duLWxpbnV4LWdudScKLWhvc3RfYWxpYXM9JycKLWhvc3RfY3B1PSd4ODZfNjQnCi1ob3N0X29zPSdsaW51eC1nbnUnCi1ob3N0X3ZlbmRvcj0ndW5rbm93bicKLWh0bWxkaXI9JyR7ZG9jZGlyfScKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKLWluc3RhbGxfc2g9JyR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaCcKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLW1hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJwotbWtkaXJfcD0nL2Jpbi9ta2RpciAtcCcKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHJlZml4PScvdXNyL2xvY2FsJwotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0ncyx4LHgsJwotcHNkaXI9JyR7ZG9jZGlyfScKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi10YXJnZXRfYWxpYXM9JycKLXdpdGhfZmZtcGVnPScnCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBjb25mZGVmcy5oLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotLyogY29uZmRlZnMuaCAqLwotI2RlZmluZSBQQUNLQUdFX05BTUUgIkxpYlZOQ1NlcnZlciIKLSNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJsaWJ2bmNzZXJ2ZXIiCi0jZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45LjkiCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC45LjkiCi0jZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlciIKLSNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLSNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotI2RlZmluZSBWRVJTSU9OICIwLjkuOSIKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi0jZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLSNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLSNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLSNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotI2RlZmluZSBIQVZFX0RMRkNOX0ggMQotI2RlZmluZSBBTExPVzI0QlBQIDEKLSNkZWZpbmUgSEFWRV9MSUJDUllQVCAxCi0jZGVmaW5lIEhBVkVfWDExIDEKLSNkZWZpbmUgSEFWRV9MSUJKUEVHIDEKLSNkZWZpbmUgSEFWRV9MSUJQTkcgMQotI2RlZmluZSBIQVZFX0xJQlogMQotI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotI2RlZmluZSBIQVZFX1RMUyAxCi0jZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEKLSNkZWZpbmUgV0lUSF9XRUJTT0NLRVRTIDEKLSNkZWZpbmUgSVB2NiAxCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0jZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotI2RlZmluZSBIQVZFX05FVERCX0ggMQotI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLSNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotI2RlZmluZSBIQVZFX1NZU19USU1FQl9IIDEKLSNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotI2RlZmluZSBMU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOSyAxCi0jZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQotI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotI2RlZmluZSBIQVZFX0ZPUksgMQotI2RlZmluZSBIQVZFX1ZGT1JLIDEKLSNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEKLSNkZWZpbmUgSEFWRV9XT1JLSU5HX0ZPUksgMQotI2RlZmluZSBIQVZFX0xJQk5TTCAxCi0jZGVmaW5lIEhBVkVfRlRJTUUgMQotI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQotI2RlZmluZSBIQVZFX0dFVEhPU1ROQU1FIDEKLSNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQotI2RlZmluZSBIQVZFX0lORVRfTlRPQSAxCi0jZGVmaW5lIEhBVkVfTUVNTU9WRSAxCi0jZGVmaW5lIEhBVkVfTUVNU0VUIDEKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgSEFWRV9NS0ZJRk8gMQotI2RlZmluZSBIQVZFX1NFTEVDVCAxCi0jZGVmaW5lIEhBVkVfU09DS0VUIDEKLSNkZWZpbmUgSEFWRV9TVFJDSFIgMQotI2RlZmluZSBIQVZFX1NUUkNTUE4gMQotI2RlZmluZSBIQVZFX1NUUkRVUCAxCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotI2RlZmluZSBIQVZFX1NUUlNUUiAxCi0KLWNvbmZpZ3VyZTogZXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcuc3RhdHVzIGIvY29uZmlnLnN0YXR1cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU0NThkNC4uMDAwMDAwMAotLS0gYS9jb25maWcuc3RhdHVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OCArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vYmFzaH0KLWV4cG9ydCBTSEVMTAotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCi0gICpwb3NpeCopIDoKLSAgICBzZXQgLW8gcG9zaXggOzsgIygKLSAgKikgOgotICAgICA7OwotZXNhYwotZmkKLQotCi1hc19ubD0nCi0nCi1leHBvcnQgYXNfbmwKLSMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCi1hc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCi0jIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgotaWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAotICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCi0gIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJwotZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludGYgJXNcbicKLSAgYXNfZWNob19uPSdwcmludGYgJXMnCi1lbHNlCi0gIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgotICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCi0gICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJwotICBlbHNlCi0gICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKLSAgICBhc19lY2hvX25fYm9keT0nZXZhbAotICAgICAgYXJnPSQxOwotICAgICAgY2FzZSAkYXJnIGluICMoCi0gICAgICAqIiRhc19ubCIqKQotCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOwotCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7Ci0gICAgICBlc2FjOwotICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgotICAgICcKLSAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKLSAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJwotICBmaQotICBleHBvcnQgYXNfZWNob19ib2R5Ci0gIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKLWZpCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgUEFUSF9TRVBBUkFUT1I9OgotICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7Ci0gICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKLSAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICB9Ci1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWFzX215c2VsZj0KLWNhc2UgJDAgaW4gIygoCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICAgICA7OwotZXNhYwotIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCi1pZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0gIGFzX215c2VsZj0kMAotZmkKLWlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgZXhpdCAxCi1maQotCi0jIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCi0jIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCi0jIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCi0jIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgotZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAotZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKLSAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Ci1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLUxDX0FMTD1DCi1leHBvcnQgTENfQUxMCi1MQU5HVUFHRT1DCi1leHBvcnQgTEFOR1VBR0UKLQotIyBDRFBBVEguCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLQotIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCi0jIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKLSMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCi1hc19mbl9lcnJvciAoKQotewotICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkNCI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0Ci0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCi0gIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cwotfSAjIGFzX2ZuX2Vycm9yCi0KLQotIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCi1hc19mbl9zZXRfc3RhdHVzICgpCi17Ci0gIHJldHVybiAkMQotfSAjIGFzX2ZuX3NldF9zdGF0dXMKLQotIyBhc19mbl9leGl0IFNUQVRVUwotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCi1hc19mbl9leGl0ICgpCi17Ci0gIHNldCArZQotICBhc19mbl9zZXRfc3RhdHVzICQxCi0gIGV4aXQgJDEKLX0gIyBhc19mbl9leGl0Ci0KLSMgYXNfZm5fdW5zZXQgVkFSCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBQb3J0YWJseSB1bnNldCBWQVIuCi1hc19mbl91bnNldCAoKQotewotICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Ci19Ci1hc191bnNldD1hc19mbl91bnNldAotIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQotIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCi0jIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCi0jIGltcGxlbWVudGF0aW9ucy4KLWlmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxKz1cJDIKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXBwZW5kICgpCi0gIHsKLSAgICBldmFsICQxPVwkJDFcJDIKLSAgfQotZmkgIyBhc19mbl9hcHBlbmQKLQotIyBhc19mbl9hcml0aCBBUkcuLi4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKLSMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cwotIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KLWlmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPSQoKCAkKiApKQotICB9JwotZWxzZQotICBhc19mbl9hcml0aCAoKQotICB7Ci0gICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKLSAgfQotZmkgIyBhc19mbl9hcml0aAotCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKLS1uKikKLSAgY2FzZSBgZWNobyAneHlcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICB4eSkgIEVDSE9fQz0nXGMnOzsKLSAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAotICAgICAgIEVDSE9fVD0nCSc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotZmkKLWlmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KLSAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz0nbG4gLXMnCi0gICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgotICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICAgIGFzX2xuX3M9J2NwIC1wUicKLSAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPWxuCi0gIGVsc2UKLSAgICBhc19sbl9zPSdjcCAtcFInCi0gIGZpCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wUicKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLQotIyBhc19mbl9ta2Rpcl9wCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgotYXNfZm5fbWtkaXJfcCAoKQotewotCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgotCi0KLX0gIyBhc19mbl9ta2Rpcl9wCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotCi0jIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KLWFzX2ZuX2V4ZWN1dGFibGVfcCAoKQotewotICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCi19ICMgYXNfZm5fZXhlY3V0YWJsZV9wCi1hc190ZXN0X3g9J3Rlc3QgLXgnCi1hc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi1leGVjIDY+JjEKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgTGliVk5DU2VydmVyICRhc19tZSAwLjkuOSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIgTWFrZWZpbGUgbGlidm5jc2VydmVyLnBjIGxpYnZuY2NsaWVudC5wYyBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUgZXhhbXBsZXMvTWFrZWZpbGUgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSB2bmN0ZXJtL01ha2VmaWxlIHdlYmNsaWVudHMvTWFrZWZpbGUgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSBsaWJ2bmNjbGllbnQvTWFrZWZpbGUgY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIHRlc3QvTWFrZWZpbGUgbGlidm5jc2VydmVyLWNvbmZpZyBMaWJWTkNTZXJ2ZXIuc3BlYyIKLWNvbmZpZ19oZWFkZXJzPSIgcmZiY29uZmlnLmggIgotY29uZmlnX2NvbW1hbmRzPSIgcmZiL3JmYmNvbmZpZy5oIGRlcGZpbGVzIGNobW9kLWxpYnZuY3NlcnZlci1jb25maWciCi0KLWFjX2NzX3VzYWdlPSJcCi1cYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKLWZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwotYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KLQotICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAotICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKLSAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KLSAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQotICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXI+LiIKLQotYWNfY3NfY29uZmlnPSInLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlJyIKLWFjX2NzX3ZlcnNpb249IlwKLUxpYlZOQ1NlcnZlciBjb25maWcuc3RhdHVzIDAuOS45Ci1jb25maWd1cmVkIGJ5IC4vY29uZmlndXJlLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCi0gIHdpdGggb3B0aW9ucyBcIiRhY19jc19jb25maWdcIgotCi1Db3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0KLWFjX3B3ZD0nL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcicKLXNyY2Rpcj0nLicKLUlOU1RBTEw9Jy91c3IvYmluL2luc3RhbGwgLWMnCi1NS0RJUl9QPScvYmluL21rZGlyIC1wJwotQVdLPSdtYXdrJwotdGVzdCAtbiAiJEFXSyIgfHwgQVdLPWF3awotIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPT8qKQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAtLSo9KQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPQotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAqKQotICAgIGFjX29wdGlvbj0kMQotICAgIGFjX29wdGFyZz0kMgotICAgIGFjX3NoaWZ0PXNoaWZ0Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQotICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKLSAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKLSAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKLSAgICBkZWJ1Zz06IDs7Ci0gIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotICAgICRhY19zaGlmdAotICAgIGNhc2UgJGFjX29wdGFyZyBpbgotICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgZXNhYwotICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZSB8IC0taCkKLSAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKLSAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCi0gICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotICAgIGFjX2NzX3NpbGVudD06IDs7Ci0KLSAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKLQotICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKLSAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotCi0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0KLWlmICRhY19jc19zaWxlbnQ7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgotZmkKLQotaWYgJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgc2V0IFggL2Jpbi9iYXNoICcuL2NvbmZpZ3VyZScgICctLWVuYWJsZS1tYWludGFpbmVyLW1vZGUnICRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgotICBzaGlmdAotICAkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9L2Jpbi9iYXNoICQqIiA+JjYKLSAgQ09ORklHX1NIRUxMPScvYmluL2Jhc2gnCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAiJEAiCi1maQotCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgJGFzX2VjaG8gIiRhY19sb2ciCi19ID4mNQotCi0jCi0jIElOSVQtQ09NTUFORFMKLSMKLVBBQ0tBR0U9IkxpYlZOQ1NlcnZlciIKLUFNREVQX1RSVUU9IiIgYWNfYXV4X2Rpcj0iLiIKLQotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJyZmJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgcmZiY29uZmlnLmgiIDs7Ci0gICAgInJmYi9yZmJjb25maWcuaCIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyByZmIvcmZiY29uZmlnLmgiIDs7Ci0gICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLSAgICAibGlidm5jc2VydmVyLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci5wYyIgOzsKLSAgICAibGlidm5jY2xpZW50LnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY2NsaWVudC5wYyIgOzsKLSAgICAibGlidm5jc2VydmVyL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci9NYWtlZmlsZSIgOzsKLSAgICAiZXhhbXBsZXMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXhhbXBsZXMvTWFrZWZpbGUiIDs7Ci0gICAgImV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSIgOzsKLSAgICAidm5jdGVybS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB2bmN0ZXJtL01ha2VmaWxlIiA7OwotICAgICJ3ZWJjbGllbnRzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHdlYmNsaWVudHMvTWFrZWZpbGUiIDs7Ci0gICAgIndlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSIgOzsKLSAgICAid2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wvTWFrZWZpbGUiIDs7Ci0gICAgImxpYnZuY2NsaWVudC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJ2bmNjbGllbnQvTWFrZWZpbGUiIDs7Ci0gICAgImNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjbGllbnRfZXhhbXBsZXMvTWFrZWZpbGUiIDs7Ci0gICAgInRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9NYWtlZmlsZSIgOzsKLSAgICAibGlidm5jc2VydmVyLWNvbmZpZyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJ2bmNzZXJ2ZXItY29uZmlnIiA7OwotICAgICJMaWJWTkNTZXJ2ZXIuc3BlYyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBMaWJWTkNTZXJ2ZXIuc3BlYyIgOzsKLSAgICAieDExdm5jL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHgxMXZuYy9NYWtlZmlsZSIgOzsKLSAgICAieDExdm5jL21pc2MvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL21pc2MvTWFrZWZpbGUiIDs7Ci0gICAgIngxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHgxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlIiA7OwotICAgICJjaG1vZC1saWJ2bmNzZXJ2ZXItY29uZmlnIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGNobW9kLWxpYnZuY3NlcnZlci1jb25maWciIDs7Ci0KLSAgKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9IGFjX3RtcD0KLSAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgOiAiJHthY190bXA6PSR0bXB9IgotICB7IHRlc3QgISAtZCAiJGFjX3RtcCIgfHwgcm0gLWZyICIkYWNfdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cwotJyAwCi0gIHRyYXAgJ2FzX2ZuX2V4aXQgMScgMSAyIDEzIDE1Ci19Ci0jIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KLQotewotICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKLSAgdGVzdCAtZCAiJHRtcCIKLX0gIHx8Ci17Ci0gIHRtcD0uL2NvbmYkJC0kUkFORE9NCi0gICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQotfSB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgIiRMSU5FTk8iIDUKLWFjX3RtcD0kdG1wCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCi0jIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oJy4KLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0KLQotYWNfY3I9YGVjaG8gWCB8IHRyIFggJ1wwMTUnYAotIyBPbiBjeWd3aW4sIGJhc2ggY2FuIGVhdCBcciBpbnNpZGUgYGAgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGlnbmNyLgotIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCi0jIHBvaW50LCBzbyB3ZSBjYW4gdXNlIGEgYmFzaGlzbSBhcyBhIGZhbGxiYWNrLgotaWYgdGVzdCAieCRhY19jciIgPSB4OyB0aGVuCi0gIGV2YWwgYWNfY3I9XCRcJ1xcclwnCi1maQotYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAotaWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KLSAgYWNfY3NfYXdrX2NyPSdcXHInCi1lbHNlCi0gIGFjX2NzX2F3a19jcj0kYWNfY3IKLWZpCi0KLWVjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCi1jYXQgPj4iJGFjX3RtcC9zdWJzMS5hd2siIDw8XF9BQ0FXSyAmJgotU1siYW1fX0VYRUVYVF9GQUxTRSJdPSIiCi1TWyJhbV9fRVhFRVhUX1RSVUUiXT0iIyIKLVNbIkxUTElCT0JKUyJdPSIiCi1TWyJSUE1TT1VSQ0VESVIiXT0iTk9ULUZPVU5EIgotU1siV0lUSF9YMTFWTkNfRkFMU0UiXT0iIgotU1siV0lUSF9YMTFWTkNfVFJVRSJdPSIjIgotU1siSEFWRV9SUE1fRkFMU0UiXT0iIgotU1siSEFWRV9SUE1fVFJVRSJdPSIjIgotU1siQU5EUk9JRF9GQUxTRSJdPSIiCi1TWyJBTkRST0lEX1RSVUUiXT0iIyIKLVNbIk9TWF9GQUxTRSJdPSIiCi1TWyJPU1hfVFJVRSJdPSIjIgotU1siTElOVVhfRkFMU0UiXT0iIyIKLVNbIkxJTlVYX1RSVUUiXT0iIgotU1siQ1lHSVBDX0ZBTFNFIl09IiIKLVNbIkNZR0lQQ19UUlVFIl09IiMiCi1TWyJMSUJPQkpTIl09IiIKLVNbIkhBVkVfR05VVExTX0ZBTFNFIl09IiIKLVNbIkhBVkVfR05VVExTX1RSVUUiXT0iIyIKLVNbIkdOVVRMU19MSUJTIl09IiIKLVNbIkdOVVRMU19DRkxBR1MiXT0iIgotU1siTElCR0NSWVBUX0xJQlMiXT0iIgotU1siTElCR0NSWVBUX0NGTEFHUyJdPSIiCi1TWyJMSUJHQ1JZUFRfQ09ORklHIl09Im5vIgotU1siV1NPQ0tMSUIiXT0iIgotU1siTUlOR1dfRkFMU0UiXT0iIgotU1siTUlOR1dfVFJVRSJdPSIjIgotU1siSEFWRV9MSUJHVEtfRkFMU0UiXT0iIgotU1siSEFWRV9MSUJHVEtfVFJVRSJdPSIjIgotU1siR1RLX0xJQlMiXT0iIgotU1siR1RLX0NGTEFHUyJdPSIiCi1TWyJQS0dfQ09ORklHX0xJQkRJUiJdPSIiCi1TWyJQS0dfQ09ORklHX1BBVEgiXT0iIgotU1siUEtHX0NPTkZJRyJdPSIvdXNyL2Jpbi9wa2ctY29uZmlnIgotU1siU0RMX0xJQlMiXT0iIgotU1siU0RMX0NGTEFHUyJdPSIiCi1TWyJIQVZFX0xJQlNETF9GQUxTRSJdPSIiCi1TWyJIQVZFX0xJQlNETF9UUlVFIl09IiMiCi1TWyJIQVZFX0xJQlBOR19GQUxTRSJdPSIjIgotU1siSEFWRV9MSUJQTkdfVFJVRSJdPSIiCi1TWyJIQVZFX0xJQkpQRUdfRkFMU0UiXT0iIyIKLVNbIkhBVkVfTElCSlBFR19UUlVFIl09IiIKLVNbIkhBVkVfTElCWl9GQUxTRSJdPSIjIgotU1siSEFWRV9MSUJaX1RSVUUiXT0iIgotU1siV0lUSF9XRUJTT0NLRVRTX0ZBTFNFIl09IiMiCi1TWyJXSVRIX1dFQlNPQ0tFVFNfVFJVRSJdPSIiCi1TWyJXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRSJdPSIjIgotU1siV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRSJdPSIiCi1TWyJIQVZFX0xJQlBUSFJFQURfRkFMU0UiXT0iIyIKLVNbIkhBVkVfTElCUFRIUkVBRF9UUlVFIl09IiIKLVNbIkpQRUdfTERGTEFHUyJdPSIiCi1TWyJIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0UiXT0iIgotU1siSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUUiXT0iIyIKLVNbIlNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyJdPSIiCi1TWyJTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyJdPSIiCi1TWyJPU1hfT1BFTkdMX0ZBTFNFIl09IiIKLVNbIk9TWF9PUEVOR0xfVFJVRSJdPSIjIgotU1siQVZBSElfTElCUyJdPSIiCi1TWyJBVkFISV9DRkxBR1MiXT0iIgotU1siSEFWRV9YMTFfRkFMU0UiXT0iIyIKLVNbIkhBVkVfWDExX1RSVUUiXT0iIgotU1siWF9FWFRSQV9MSUJTIl09IiIKLVNbIlhfTElCUyJdPSIiCi1TWyJYX1BSRV9MSUJTIl09IiAtbFNNIC1sSUNFIgotU1siWF9DRkxBR1MiXT0iIgotU1siWE1LTUYiXT0iIgotU1siSEFWRV9MSUJTU0xfRkFMU0UiXT0iIgotU1siSEFWRV9MSUJTU0xfVFJVRSJdPSIjIgotU1siU1NMX0xJQlMiXT0iIgotU1siQ1JZUFRfTElCUyJdPSItbGNyeXB0IgotU1siSEFWRV9NUDNMQU1FX0ZBTFNFIl09IiIKLVNbIkhBVkVfTVAzTEFNRV9UUlVFIl09IiMiCi1TWyJXSVRIX0ZGTVBFR19GQUxTRSJdPSIiCi1TWyJXSVRIX0ZGTVBFR19UUlVFIl09IiMiCi1TWyJ3aXRoX2ZmbXBlZyJdPSIiCi1TWyJMSUJUT09MIl09IiQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sIgotU1siYWNfY3RfRjc3Il09IiIKLVNbIkZGTEFHUyJdPSIiCi1TWyJGNzciXT0iIgotU1siQ1hYQ1BQIl09ImcrKyAtRSIKLVNbImFtX19mYXN0ZGVwQ1hYX0ZBTFNFIl09IiMiCi1TWyJhbV9fZmFzdGRlcENYWF9UUlVFIl09IiIKLVNbIkNYWERFUE1PREUiXT0iZGVwbW9kZT1nY2MzIgotU1siYWNfY3RfQ1hYIl09ImcrKyIKLVNbIkNYWEZMQUdTIl09Ii1nIC1PMiIKLVNbIkNYWCJdPSJnKysiCi1TWyJDUFAiXT0iZ2NjIC1FIgotU1siT0JKRFVNUCJdPSJvYmpkdW1wIgotU1siQVMiXT0iYXMiCi1TWyJETExUT09MIl09ImRsbHRvb2wiCi1TWyJSQU5MSUIiXT0icmFubGliIgotU1siQVIiXT0iL3Vzci9iaW4vYXIiCi1TWyJFQ0hPIl09ImVjaG8iCi1TWyJMTl9TIl09ImxuIC1zIgotU1siRUdSRVAiXT0iL2Jpbi9ncmVwIC1FIgotU1siR1JFUCJdPSIvYmluL2dyZXAiCi1TWyJob3N0X29zIl09ImxpbnV4LWdudSIKLVNbImhvc3RfdmVuZG9yIl09InVua25vd24iCi1TWyJob3N0X2NwdSJdPSJ4ODZfNjQiCi1TWyJob3N0Il09Ing4Nl82NC11bmtub3duLWxpbnV4LWdudSIKLVNbImJ1aWxkX29zIl09ImxpbnV4LWdudSIKLVNbImJ1aWxkX3ZlbmRvciJdPSJ1bmtub3duIgotU1siYnVpbGRfY3B1Il09Ing4Nl82NCIKLVNbImJ1aWxkIl09Ing4Nl82NC11bmtub3duLWxpbnV4LWdudSIKLVNbImFtX19mYXN0ZGVwQ0NfRkFMU0UiXT0iIyIKLVNbImFtX19mYXN0ZGVwQ0NfVFJVRSJdPSIiCi1TWyJDQ0RFUE1PREUiXT0iZGVwbW9kZT1nY2MzIgotU1siYW1fX25vZGVwIl09Il9ubyIKLVNbIkFNREVQQkFDS1NMQVNIIl09IlxcIgotU1siQU1ERVBfRkFMU0UiXT0iIyIKLVNbIkFNREVQX1RSVUUiXT0iIgotU1siYW1fX3F1b3RlIl09IiIKLVNbImFtX19pbmNsdWRlIl09ImluY2x1ZGUiCi1TWyJERVBESVIiXT0iLmRlcHMiCi1TWyJPQkpFWFQiXT0ibyIKLVNbIkVYRUVYVCJdPSIiCi1TWyJhY19jdF9DQyJdPSJnY2MiCi1TWyJDUFBGTEFHUyJdPSIiCi1TWyJMREZMQUdTIl09IiIKLVNbIkNGTEFHUyJdPSItZyAtTzIgLVdhbGwgICIKLVNbIkNDIl09ImdjYyIKLVNbIkFNX0JBQ0tTTEFTSCJdPSJcXCIKLVNbIkFNX0RFRkFVTFRfVkVSQk9TSVRZIl09IjAiCi1TWyJBTV9ERUZBVUxUX1YiXT0iJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkiCi1TWyJBTV9WIl09IiQoVikiCi1TWyJhbV9fdW50YXIiXT0iJCR7VEFSLXRhcn0geGYgLSIKLVNbImFtX190YXIiXT0iJCR7VEFSLXRhcn0gY2hvZiAtIFwiJCR0YXJkaXJcIiIKLVNbIkFNVEFSIl09IiQke1RBUi10YXJ9IgotU1siYW1fX2xlYWRpbmdfZG90Il09Ii4iCi1TWyJTRVRfTUFLRSJdPSIiCi1TWyJBV0siXT0ibWF3ayIKLVNbIm1rZGlyX3AiXT0iL2Jpbi9ta2RpciAtcCIKLVNbIk1LRElSX1AiXT0iL2Jpbi9ta2RpciAtcCIKLVNbIklOU1RBTExfU1RSSVBfUFJPR1JBTSJdPSIkKGluc3RhbGxfc2gpIC1jIC1zIgotU1siU1RSSVAiXT0ic3RyaXAiCi1TWyJpbnN0YWxsX3NoIl09IiR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaCIKLVNbIk1BS0VJTkZPIl09IiR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBtYWtlaW5mbyIKLVNbIkFVVE9IRUFERVIiXT0iJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIiCi1TWyJBVVRPTUFLRSJdPSIke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS4xMSIKLVNbIkFVVE9DT05GIl09IiR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvY29uZiIKLVNbIkFDTE9DQUwiXT0iJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGFjbG9jYWwtMS4xMSIKLVNbIlZFUlNJT04iXT0iMC45LjkiCi1TWyJQQUNLQUdFIl09IkxpYlZOQ1NlcnZlciIKLVNbIkNZR1BBVEhfVyJdPSJlY2hvIgotU1siYW1fX2lzcmMiXT0iIgotU1siSU5TVEFMTF9EQVRBIl09IiR7SU5TVEFMTH0gLW0gNjQ0IgotU1siSU5TVEFMTF9TQ1JJUFQiXT0iJHtJTlNUQUxMfSIKLVNbIklOU1RBTExfUFJPR1JBTSJdPSIke0lOU1RBTEx9IgotU1sidGFyZ2V0X2FsaWFzIl09IiIKLVNbImhvc3RfYWxpYXMiXT0iIgotU1siYnVpbGRfYWxpYXMiXT0iIgotU1siTElCUyJdPSItbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICIKLVNbIkVDSE9fVCJdPSIiCi1TWyJFQ0hPX04iXT0iLW4iCi1TWyJFQ0hPX0MiXT0iIgotU1siREVGUyJdPSItREhBVkVfQ09ORklHX0giCi1TWyJtYW5kaXIiXT0iJHtkYXRhcm9vdGRpcn0vbWFuIgotU1sibG9jYWxlZGlyIl09IiR7ZGF0YXJvb3RkaXJ9L2xvY2FsZSIKLVNbImxpYmRpciJdPSIke2V4ZWNfcHJlZml4fS9saWIiCi1TWyJwc2RpciJdPSIke2RvY2Rpcn0iCi1TWyJwZGZkaXIiXT0iJHtkb2NkaXJ9IgotU1siZHZpZGlyIl09IiR7ZG9jZGlyfSIKLVNbImh0bWxkaXIiXT0iJHtkb2NkaXJ9IgotU1siaW5mb2RpciJdPSIke2RhdGFyb290ZGlyfS9pbmZvIgotU1siZG9jZGlyIl09IiR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0iCi1TWyJvbGRpbmNsdWRlZGlyIl09Ii91c3IvaW5jbHVkZSIKLVNbImluY2x1ZGVkaXIiXT0iJHtwcmVmaXh9L2luY2x1ZGUiCi1TWyJsb2NhbHN0YXRlZGlyIl09IiR7cHJlZml4fS92YXIiCi1TWyJzaGFyZWRzdGF0ZWRpciJdPSIke3ByZWZpeH0vY29tIgotU1sic3lzY29uZmRpciJdPSIke3ByZWZpeH0vZXRjIgotU1siZGF0YWRpciJdPSIke2RhdGFyb290ZGlyfSIKLVNbImRhdGFyb290ZGlyIl09IiR7cHJlZml4fS9zaGFyZSIKLVNbImxpYmV4ZWNkaXIiXT0iJHtleGVjX3ByZWZpeH0vbGliZXhlYyIKLVNbInNiaW5kaXIiXT0iJHtleGVjX3ByZWZpeH0vc2JpbiIKLVNbImJpbmRpciJdPSIke2V4ZWNfcHJlZml4fS9iaW4iCi1TWyJwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIl09InMseCx4LCIKLVNbInByZWZpeCJdPSIvdXNyL2xvY2FsIgotU1siZXhlY19wcmVmaXgiXT0iJHtwcmVmaXh9IgotU1siUEFDS0FHRV9VUkwiXT0iIgotU1siUEFDS0FHRV9CVUdSRVBPUlQiXT0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIiCi1TWyJQQUNLQUdFX1NUUklORyJdPSJMaWJWTkNTZXJ2ZXIgMC45LjkiCi1TWyJQQUNLQUdFX1ZFUlNJT04iXT0iMC45LjkiCi1TWyJQQUNLQUdFX1RBUk5BTUUiXT0ibGlidm5jc2VydmVyIgotU1siUEFDS0FHRV9OQU1FIl09IkxpYlZOQ1NlcnZlciIKLVNbIlBBVEhfU0VQQVJBVE9SIl09IjoiCi1TWyJTSEVMTCJdPSIvYmluL2Jhc2giCi1fQUNBV0sKLWNhdCA+PiIkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKLSAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKLSAgRlMgPSAiByIKLQotfQotewotICBsaW5lID0gJCAwCi0gIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQotICBzdWJzdGVkID0gMAotICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCi0gIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKLSAgICBrZXkgPSBmaWVsZFtpXQotICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCi0gICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKLSAgICAgIHZhbHVlID0gU1trZXldCi0gICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCi0gICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQotICAgICAgc3Vic3RlZCA9IDEKLSAgICB9IGVsc2UKLSAgICAgIGxlbiArPSAxICsga2V5bGVuCi0gIH0KLQotICBwcmludCBsaW5lCi19Ci0KLV9BQ0FXSwotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgotCi0jIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgotaWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgotY2F0ID4iJGFjX3RtcC9kZWZpbmVzLmF3ayIgPDxcX0FDQVdLIHx8Ci1CRUdJTiB7Ci1EWyJQQUNLQUdFX05BTUUiXT0iIFwiTGliVk5DU2VydmVyXCIiCi1EWyJQQUNLQUdFX1RBUk5BTUUiXT0iIFwibGlidm5jc2VydmVyXCIiCi1EWyJQQUNLQUdFX1ZFUlNJT04iXT0iIFwiMC45LjlcIiIKLURbIlBBQ0tBR0VfU1RSSU5HIl09IiBcIkxpYlZOQ1NlcnZlciAwLjkuOVwiIgotRFsiUEFDS0FHRV9CVUdSRVBPUlQiXT0iIFwiaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXJcIiIKLURbIlBBQ0tBR0VfVVJMIl09IiBcIlwiIgotRFsiUEFDS0FHRSJdPSIgXCJMaWJWTkNTZXJ2ZXJcIiIKLURbIlZFUlNJT04iXT0iIFwiMC45LjlcIiIKLURbIlNURENfSEVBREVSUyJdPSIgMSIKLURbIkhBVkVfU1lTX1RZUEVTX0giXT0iIDEiCi1EWyJIQVZFX1NZU19TVEFUX0giXT0iIDEiCi1EWyJIQVZFX1NURExJQl9IIl09IiAxIgotRFsiSEFWRV9TVFJJTkdfSCJdPSIgMSIKLURbIkhBVkVfTUVNT1JZX0giXT0iIDEiCi1EWyJIQVZFX1NUUklOR1NfSCJdPSIgMSIKLURbIkhBVkVfSU5UVFlQRVNfSCJdPSIgMSIKLURbIkhBVkVfU1RESU5UX0giXT0iIDEiCi1EWyJIQVZFX1VOSVNURF9IIl09IiAxIgotRFsiSEFWRV9ETEZDTl9IIl09IiAxIgotRFsiQUxMT1cyNEJQUCJdPSIgMSIKLURbIkhBVkVfTElCQ1JZUFQiXT0iIDEiCi1EWyJIQVZFX1gxMSJdPSIgMSIKLURbIkhBVkVfTElCSlBFRyJdPSIgMSIKLURbIkhBVkVfTElCUE5HIl09IiAxIgotRFsiSEFWRV9MSUJaIl09IiAxIgotRFsiSEFWRV9MSUJQVEhSRUFEIl09IiAxIgotRFsiSEFWRV9UTFMiXT0iIDEiCi1EWyJXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUiJdPSIgMSIKLURbIldJVEhfV0VCU09DS0VUUyJdPSIgMSIKLURbIklQdjYiXT0iIDEiCi1EWyJTVERDX0hFQURFUlMiXT0iIDEiCi1EWyJIQVZFX0FSUEFfSU5FVF9IIl09IiAxIgotRFsiSEFWRV9GQ05UTF9IIl09IiAxIgotRFsiSEFWRV9ORVREQl9IIl09IiAxIgotRFsiSEFWRV9ORVRJTkVUX0lOX0giXT0iIDEiCi1EWyJIQVZFX1NURExJQl9IIl09IiAxIgotRFsiSEFWRV9TVFJJTkdfSCJdPSIgMSIKLURbIkhBVkVfU1lTX1NPQ0tFVF9IIl09IiAxIgotRFsiSEFWRV9TWVNfVElNRV9IIl09IiAxIgotRFsiSEFWRV9TWVNfVElNRUJfSCJdPSIgMSIKLURbIkhBVkVfU1lTTE9HX0giXT0iIDEiCi1EWyJIQVZFX1VOSVNURF9IIl09IiAxIgotRFsiVElNRV9XSVRIX1NZU19USU1FIl09IiAxIgotRFsiSEFWRV9TWVNfV0FJVF9IIl09IiAxIgotRFsiTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksiXT0iIDEiCi1EWyJIQVZFX1NUUkZUSU1FIl09IiAxIgotRFsiSEFWRV9WUFJJTlRGIl09IiAxIgotRFsiSEFWRV9GT1JLIl09IiAxIgotRFsiSEFWRV9WRk9SSyJdPSIgMSIKLURbIkhBVkVfV09SS0lOR19WRk9SSyJdPSIgMSIKLURbIkhBVkVfV09SS0lOR19GT1JLIl09IiAxIgotRFsiSEFWRV9MSUJOU0wiXT0iIDEiCi1EWyJIQVZFX0ZUSU1FIl09IiAxIgotRFsiSEFWRV9HRVRIT1NUQllOQU1FIl09IiAxIgotRFsiSEFWRV9HRVRIT1NUTkFNRSJdPSIgMSIKLURbIkhBVkVfR0VUVElNRU9GREFZIl09IiAxIgotRFsiSEFWRV9JTkVUX05UT0EiXT0iIDEiCi1EWyJIQVZFX01FTU1PVkUiXT0iIDEiCi1EWyJIQVZFX01FTVNFVCJdPSIgMSIKLURbIkhBVkVfTU1BUCJdPSIgMSIKLURbIkhBVkVfTUtGSUZPIl09IiAxIgotRFsiSEFWRV9TRUxFQ1QiXT0iIDEiCi1EWyJIQVZFX1NPQ0tFVCJdPSIgMSIKLURbIkhBVkVfU1RSQ0hSIl09IiAxIgotRFsiSEFWRV9TVFJDU1BOIl09IiAxIgotRFsiSEFWRV9TVFJEVVAiXT0iIDEiCi1EWyJIQVZFX1NUUkVSUk9SIl09IiAxIgotRFsiSEFWRV9TVFJTVFIiXT0iIDEiCi0gIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi19Ci0vXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdK1tfYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl1bX2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XSooW1x0IChdfCQpLyB7Ci0gIGxpbmUgPSAkIDAKLSAgc3BsaXQobGluZSwgYXJnLCAiICIpCi0gIGlmIChhcmdbMV0gPT0gIiMiKSB7Ci0gICAgZGVmdW5kZWYgPSBhcmdbMl0KLSAgICBtYWMxID0gYXJnWzNdCi0gIH0gZWxzZSB7Ci0gICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQotICAgIG1hYzEgPSBhcmdbMl0KLSAgfQotICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCi0gIG1hY3JvID0gbWFjMlsxXQotICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKLSAgaWYgKERfaXNfc2V0W21hY3JvXSkgewotICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCi0gICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQotICAgIG5leHQKLSAgfSBlbHNlIHsKLSAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCi0gICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7Ci0gICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCi0gICAgICBuZXh0Ci0gICAgfQotICB9Ci19Ci17IHByaW50IH0KLV9BQ0FXSwotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCi1zaGlmdAotZm9yIGFjX3RhZwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwotICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKLQkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJwotCWAnIGJ5IGNvbmZpZ3VyZS4nCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0gICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KLSAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKLSAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQotICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAotICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAotICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci1hY19zZWRfZGF0YXJvb3Q9JwotL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AnCi1jYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotICBhY19kYXRhcm9vdGRpcl9oYWNrPScKLSAgcyZAZGF0YWRpckAmJHtkYXRhcm9vdGRpcn0mZwotICBzJkBkb2NkaXJAJiR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0mZwotICBzJkBpbmZvZGlyQCYke2RhdGFyb290ZGlyfS9pbmZvJmcKLSAgcyZAbG9jYWxlZGlyQCYke2RhdGFyb290ZGlyfS9sb2NhbGUmZwotICBzJkBtYW5kaXJAJiR7ZGF0YXJvb3RkaXJ9L21hbiZnCi0gIHMmXCR7ZGF0YXJvb3RkaXJ9JiR7cHJlZml4fS9zaGFyZSZnJyA7OwotZXNhYwotYWNfc2VkX2V4dHJhPSIvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97Ci1oCi1zLy8vCi1zL14vOi8KLXMvWwkgXSokLzovCi1zLzpcJChzcmNkaXIpOi86L2cKLXMvOlwke3NyY2Rpcn06LzovZwotcy86QHNyY2RpckA6LzovZwotcy9eOiovLwotcy86KiQvLwoteAotcy9cKD1bCSBdKlwpLiovXDEvCi1HCi1zL1xuLy8KLXMvXltePV0qPVsJIF0qJC8vCi19Ci0KLTp0Ci0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi1zfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLXMmQE1LRElSX1BAJiRhY19NS0RJUl9QJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iCi1ldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiBcCi0gID4kYWNfdG1wL291dCB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJGFjX3RtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgXAotICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mMjt9Ci0KLSAgcm0gLWYgIiRhY190bXAvc3RkaW4iCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSkgY2F0ICIkYWNfdG1wL291dCIgJiYgcm0gLWYgIiRhY190bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiRhY190bXAvb3V0IiAiJGFjX2ZpbGUiOzsKLSAgZXNhYyBcCi0gIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQotIDs7Ci0gIDpIKQotICAjCi0gICMgQ09ORklHX0hFQURFUgotICAjCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICB7Ci0gICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgotICAgIH0gPiIkYWNfdG1wL2NvbmZpZy5oIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKLQl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSAgICBmaQotICBlbHNlCi0gICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgLSIgIiRMSU5FTk8iIDUKLSAgZmkKLSMgQ29tcHV0ZSAiJGFjX2ZpbGUiJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgotX2FtX2FyZz0iJGFjX2ZpbGUiCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmAkYXNfZGlybmFtZSAtLSAiJF9hbV9hcmciIHx8Ci0kYXNfZXhwciBYIiRfYW1fYXJnIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRfYW1fYXJnIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRfYW1fYXJnIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJF9hbV9hcmciIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYC9zdGFtcC1oJF9hbV9zdGFtcF9jb3VudAotIDs7Ci0KLSAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0gOzsKLSAgZXNhYwotCi0KLSAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0gICAgInJmYi9yZmJjb25maWcuaCI6QykgYWNfcHJlZml4X2NvbmZfT1VUPWBlY2hvIHJmYi9yZmJjb25maWcuaGAKLWFjX3ByZWZpeF9jb25mX0RFRj1gZWNobyBfJGFjX3ByZWZpeF9jb25mX09VVCB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjoiIC1lICJzL1teYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl0vXy9nImAKLWFjX3ByZWZpeF9jb25mX1BLRz1gZWNobyAkUEFDS0FHRWAKLWFjX3ByZWZpeF9jb25mX0xPVz1gZWNobyBfJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi06YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfOiJgCi1hY19wcmVmaXhfY29uZl9VUFA9YGVjaG8gJGFjX3ByZWZpeF9jb25mX1BLRyB8IHNlZCAtZSAieTphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei06QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfOiIgIC1lICIvXlswMTIzNDU2Nzg5XS9zL14vXy8iYAotYWNfcHJlZml4X2NvbmZfSU5QPWBlY2hvIF9gCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIl8kYWNfZmlsZSIgPSBfOiAmJiBjb250aW51ZQotICAgICB0ZXN0IC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiAmJiBjb250aW51ZQotICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAgICouaCkgdGVzdCAtZiAkYWNfZmlsZSAmJiBhY19wcmVmaXhfY29uZl9JTlA9JGFjX2ZpbGUgOzsKLSAgICAgICAgKikKLSAgICAgZXNhYwotICAgZG9uZQotZmkKLWlmIHRlc3QgIiRhY19wcmVmaXhfY29uZl9JTlAiID0gIl8iOyB0aGVuCi0gICBjYXNlICIkYWNfcHJlZml4X2NvbmZfT1VUIiBpbgotICAgICAgKi8qKSBhY19wcmVmaXhfY29uZl9JTlA9YGJhc2VuYW1lICIkYWNfcHJlZml4X2NvbmZfT1VUImAKLSAgICAgIDs7Ci0gICAgICAqLSopIGFjX3ByZWZpeF9jb25mX0lOUD1gZWNobyAiJGFjX3ByZWZpeF9jb25mX09VVCIgfCBzZWQgLWUgInMvW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5X10qLS8vImAKLSAgICAgIDs7Ci0gICAgICAqKSBhY19wcmVmaXhfY29uZl9JTlA9Y29uZmlnLmgKLSAgICAgIDs7Ci0gICBlc2FjCi1maQotaWYgdGVzdCAteiAiJGFjX3ByZWZpeF9jb25mX1BLRyIgOyB0aGVuCi0gICBhc19mbl9lcnJvciAkPyAibm8gcHJlZml4IGZvciBfUFJFRklYX1BLR19DT05GSUdfSCIgIiRMSU5FTk8iIDUKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICIkYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4gaWYgdGVzdCAtZiAiJHNyY2Rpci8kYWNfcHJlZml4X2NvbmZfSU5QIiA7IHRoZW4KLSAgICAgYWNfcHJlZml4X2NvbmZfSU5QPSIkc3JjZGlyLyRhY19wcmVmaXhfY29uZl9JTlAiCi0gIGZpIGZpCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCAtIHByZWZpeCAkYWNfcHJlZml4X2NvbmZfVVBQIGZvciAkYWNfcHJlZml4X2NvbmZfSU5QIGRlZmluZXMiID4mNjt9Ci0gIGlmIHRlc3QgLWYgJGFjX3ByZWZpeF9jb25mX0lOUCA7IHRoZW4KLSAgICBlY2hvICJzLyN1bmRlZiAgKlxcKFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9dXFwpLyN1bmRlZiAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxLyIgPiBjb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvI3VuZGVmICAqXFwoW200X2NyX2xldHRlcnNdXFwpLyN1bmRlZiAkX0xPVyIiX1xcMS8iID4+IF9zY3JpcHQKLSAgICBlY2hvICJzLyNkZWZpbmUgICpcXChbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfXVthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV9dKlxcKVxcKC4qXFwpLyNpZm5kZWYgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMSBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiI2RlZmluZSAkYWNfcHJlZml4X2NvbmZfVVBQIiJfXFwxIFxcMiBcXCIgPj4gY29uZnRlc3QucHJlZml4Ci0gICAgZWNobyAiI2VuZGlmLyIgPj5jb25mdGVzdC5wcmVmaXgKLSAgICAjIG5vISB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc29ja2xlbl90LCBjb25zdCwgdmZvcmsKLSAgICAjIGVjaG8gInMvI2RlZltdaW5lICAqXFwoW200X2NyX2xldHRlcnNdW19zeW1ib2xdKlxcKVxcKC4qXFwpLyNpZm5kZWYgJF9MT1ciIl9cXDEgXFwiID4+IF9zY3JpcHQKLSAgICAjIGVjaG8gIiNkZWZpbmUgJF9MT1ciIl9cXDEgXFwyIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICIjZW5kaWYvIiA+PiBfc2NyaXB0Ci0gICAgIyBub3cgZXhlY3V0aW5nIF9zY3JpcHQgb24gX0RFRiBpbnB1dCB0byBjcmVhdGUgX09VVCBvdXRwdXQgZmlsZQotICAgIGVjaG8gIiNpZm5kZWYgJGFjX3ByZWZpeF9jb25mX0RFRiIgICAgICA+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICIjZGVmaW5lICRhY19wcmVmaXhfY29uZl9ERUYgMSIgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvIC8nKicgJGFjX3ByZWZpeF9jb25mX09VVC4gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGNvbmZpZ3VyZS4gJyonLyA+PiR0bXAvcGNvbmZpZy5oCi0KLSAgICBzZWQgLWYgY29uZnRlc3QucHJlZml4ICRhY19wcmVmaXhfY29uZl9JTlAgPj4kdG1wL3Bjb25maWcuaAotICAgIGVjaG8gJyAnID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcvKiBvbmNlOicgJGFjX3ByZWZpeF9jb25mX0RFRiAnKi8nID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICIjZW5kaWYiID4+JHRtcC9wY29uZmlnLmgKLSAgICBpZiBjbXAgLXMgJGFjX3ByZWZpeF9jb25mX09VVCAkdG1wL3Bjb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAkYWNfcHJlZml4X2NvbmZfT1VUIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfcHJlZml4X2NvbmZfT1VUIiB8fAotJGFzX2V4cHIgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19wcmVmaXhfY29uZl9PVVQiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gICAgICBybSAtZiAiJGFjX3ByZWZpeF9jb25mX09VVCIKLSAgICAgIG12ICR0bXAvcGNvbmZpZy5oICIkYWNfcHJlZml4X2NvbmZfT1VUIgotICAgIGZpCi0gICAgY3AgY29uZnRlc3QucHJlZml4IF9jb25maWdzLnNlZAotICBlbHNlCi0gICAgYXNfZm5fZXJyb3IgJD8gImlucHV0IGZpbGUgJGFjX3ByZWZpeF9jb25mX0lOUCBkb2VzIG5vdCBleGlzdCAtIHNraXAgZ2VuZXJhdGluZyAkYWNfcHJlZml4X2NvbmZfT1VUIiAiJExJTkVOTyIgNQotICBmaQotICBybSAtZiBjb25mdGVzdC4qCi1maQotIDs7Ci0gICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCB7Ci0gICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCi0gICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKLSAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCi0gIGNhc2UgJENPTkZJR19GSUxFUyBpbgotICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OwotICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKLSAgZXNhYwotICBzaGlmdAotICBmb3IgbWYKLSAgZG8KLSAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKLSRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICBlbHNlCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICAgIyBleHBhbnNpb24uCi0gICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRmaWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAotICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICAgIGRvbmUKLSAgZG9uZQotfQotIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciOkMpIGNobW9kIGEreCBsaWJ2bmNzZXJ2ZXItY29uZmlnIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi1hc19mbl9leGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjA1Zjg0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAotIyAgIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAxMi0wNC0xOCcKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIEdOVSBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgotIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKLSAgICAgICAkMCBbT1BUSU9OXSBBTElBUwotCi1DYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKLTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDs7Ci0KLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWNhc2UgJCMgaW4KLSAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLSAxKSA7OwotICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci1lc2FjCi0KLSMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KLSMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCi1tYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKLWNhc2UgJG1heWJlX29zIGluCi0gIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWFuZHJvaWQqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgXAotICBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBcCi0gIGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCi0gIGtvcGVuc29sYXJpcyotZ251KiB8IFwKLSAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gIGFuZHJvaWQtbGludXgpCi0gICAgb3M9LWxpbnV4LWFuZHJvaWQKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYC11bmtub3duCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWJsdWVnZW5lKikKLQkJb3M9LWNuawotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktY2hvcnVzcmRiKQotCQlvcz0tY2hvcnVzcmRiCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzYpCi0JCW9zPS1zY281djYKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281djYqKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCoxNzgpCi0JCW9zPS1seW54b3MxNzgKLQkJOzsKLQktbHlueCo1KQotCQlvcz0tbHlueG9zNQotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLQktbWludCB8IC1taW50WzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCTE3NTBhIHwgNTgwIFwKLQl8IGEyOWsgXAotCXwgYWFyY2g2NCB8IGFhcmNoNjRfYmUgXAotCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKLQl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAotCXwgYW0zM18yLjAgXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAotICAgICAgICB8IGJlMzIgfCBiZTY0IFwKLQl8IGJmaW4gXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAotCXwgZXBpcGhhbnkgXAotCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGhleGFnb24gXAotCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCi0JfCBpcDJrIHwgaXEyMDAwIFwKLQl8IGxlMzIgfCBsZTY0IFwKLQl8IGxtMzIgXAotCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCi0JfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCi0JfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKLQl8IG1pcHMxNiBcCi0JfCBtaXBzNjQgfCBtaXBzNjRlbCBcCi0JfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCi0JfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKLQl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCi0JfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCi0JfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCi0JfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCi0JfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAotCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAotCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKLQl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKLQl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCi0JfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCXwgbW94aWUgXAotCXwgbXQgXAotCXwgbXNwNDMwIFwKLQl8IG5kczMyIHwgbmRzMzJsZSB8IG5kczMyYmUgXAotCXwgbmlvcyB8IG5pb3MyIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbjggXAotCXwgb3IzMiBcCi0JfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAotCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIFwKLQl8IHB5cmFtaWQgXAotCXwgcmw3OCB8IHJ4IFwKLQl8IHNjb3JlIFwKLQl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hlYiB8IHNoYmUgfCBzaGxlIHwgc2hbMTIzNF1sZSB8IHNoM2VsZSBcCi0JfCBzaDY0IHwgc2g2NGxlIFwKLQl8IHNwYXJjIHwgc3BhcmM2NCB8IHNwYXJjNjRiIHwgc3BhcmM2NHYgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIFwKLQl8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5diBcCi0JfCBzcHUgXAotCXwgdGFob2UgfCB0aWM0eCB8IHRpYzU0eCB8IHRpYzU1eCB8IHRpYzZ4IHwgdGljODAgfCB0cm9uIFwKLQl8IHViaWNvbTMyIFwKLQl8IHY4NTAgfCB2ODUwZSB8IHY4NTBlMSB8IHY4NTBlMiB8IHY4NTBlcyB8IHY4NTBlMnYzIFwKLQl8IHdlMzJrIFwKLQl8IHg4NiB8IHhjMTZ4IHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4ayB8IHo4MCkKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JYzU0eCkKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQk7OwotCWM1NXgpCi0JCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KLQkJOzsKLQljNngpCi0JCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IG02OGhjczEyeCB8IHBpY29jaGlwKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJb3M9LW5vbmUKLQkJOzsKLQltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKLQkJOzsKLQltczEpCi0JCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgotCQk7OwotCi0Jc3Ryb25nYXJtIHwgdGh1bWIgfCB4c2NhbGUpCi0JCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KLQkJOzsKLQl4Z2F0ZSkKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCW9zPS1ub25lCi0JCTs7Ci0JeHNjYWxlZWIpCi0JCWJhc2ljX21hY2hpbmU9YXJtZWItdW5rbm93bgotCQk7OwotCi0JeHNjYWxlZWwpCi0JCWJhc2ljX21hY2hpbmU9YXJtZWwtdW5rbm93bgotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFhcmNoNjQtKiB8IGFhcmNoNjRfYmUtKiBcCi0JfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKLQl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCi0JfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKLQl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAotCXwgYXZyLSogfCBhdnIzMi0qIFwKLQl8IGJlMzItKiB8IGJlNjQtKiBcCi0JfCBiZmluLSogfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiBcCi0JfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAotCXwgZWx4c2ktKiBcCi0JfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCi0JfCBoODMwMC0qIHwgaDg1MDAtKiBcCi0JfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAotCXwgaGV4YWdvbi0qIFwKLQl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCi0JfCBpcDJrLSogfCBpcTIwMDAtKiBcCi0JfCBsZTMyLSogfCBsZTY0LSogXAotCXwgbG0zMi0qIFwKLQl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKLQl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKLQl8IG1pcHMxNi0qIFwKLQl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCi0JfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAotCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKLQl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAotCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKLQl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCi0JfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAotCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKLQl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCi0JfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKLQl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCi0JfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKLQl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCi0JfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKLQl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCXwgbW1peC0qIFwKLQl8IG10LSogXAotCXwgbXNwNDMwLSogXAotCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCi0JfCBuaW9zLSogfCBuaW9zMi0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3BlbjgtKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogXAotCXwgcHlyYW1pZC0qIFwKLQl8IHJsNzgtKiB8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCi0JfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCi0JfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKLQl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKLQl8IHNwYXJjbGl0ZS0qIFwKLQl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIFwKLQl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIFwKLQl8IHRpbGUqLSogXAotCXwgdHJvbi0qIFwKLQl8IHViaWNvbTMyLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHY4NTBlMS0qIHwgdjg1MGVzLSogfCB2ODUwZTItKiB8IHY4NTBlMnYzLSogXAotCXwgdmF4LSogXAotCXwgd2UzMmstKiBcCi0JfCB4ODYtKiB8IHg4Nl82NC0qIHwgeGMxNngtKiB8IHhwczEwMC0qIFwKLQl8IHhzdG9ybXkxNi0qIHwgeHRlbnNhKi0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qIHwgejgwLSopCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZSwgd2l0aCBnbG9iIG1hdGNoLgotCXh0ZW5zYSopCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWJhY3VzKQotCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZDY0KQotCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYwotCQk7OwotCWFtZDY0LSopCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXBvbGxvNjhic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LWJzZAotCQk7OwotCWFyb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tYXJvcwotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JYmxhY2tmaW4pCi0JCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCWJsYWNrZmluLSopCi0JCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQlibHVlZ2VuZSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KLQkJb3M9LWNuawotCQk7OwotCWM1NHgtKikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQljNTV4LSopCi0JCWJhc2ljX21hY2hpbmU9dGljNTV4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JYzZ4LSopCi0JCWJhc2ljX21hY2hpbmU9dGljNngtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNlZ2NjKQotCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCi0JCW9zPS1jZWdjYwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2IHwgY3IxNi0qKQotCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgotCQlvcz0tZWxmCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQotCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JY3J4KQotCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkaWNvcykKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCW9zPS1kaWNvcwotCQk7OwotCWRqZ3BwKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJb3M9LW1zZG9zZGpncHAKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltNjhrbm9tbXUpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCW02OGtub21tdS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWljcm9ibGF6ZSkKLQkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmd3MzJjZSkKLQkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgotCQlvcz0tbWluZ3czMmNlCi0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXMxLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKLQkJOzsKLQltc3lzKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zeXMKLQkJOzsKLQltdnMpCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJb3M9LW12cwotCQk7OwotCW5hY2wpCi0JCWJhc2ljX21hY2hpbmU9bGUzMi11bmtub3duCi0JCW9zPS1uYWNsCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlub25zdG9wdXgpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKLQkJb3M9LW5vbnN0b3B1eAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQluZW8tdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5lby10YW5kZW0KLQkJOzsKLQluc2UtdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zZS10YW5kZW0KLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jb3BlbnJpc2MgfCBvcGVucmlzYy0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQk7OwotCW9zNDAwKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1vczQwMAotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBhcmlzYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JcGFyaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0JcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGM5OCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCTs7Ci0JcGM5OC0qKQotCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW00KQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bTQtKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMgfCBwcGNiZSkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJOzsKLQlwcGMtKiB8IHBwY2JlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JCTs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCQk7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JCTs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tcmRvcwotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNiMSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgotCQk7OwotCXNiMWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KLQkJOzsKLQlzZGUpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQotCQlvcz0tZWxmCi0JCTs7Ci0Jc2VpKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCi0JCW9zPS1zZWl1eAotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc2g1ZWwpCi0JCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdHJvbmdhcm0tKiB8IHRodW1iLSopCi0JCWJhc2ljX21hY2hpbmU9YXJtLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3YxKQotCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlzeW1tZXRyeSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JdDNlKQotCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXQ5MCkKLQkJYmFzaWNfbWFjaGluZT10OTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdGlsZSopCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvYWQxKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAotCQlvcz0tdG9wczIwCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXRwZikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJb3M9LXRwZgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotCQk7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeGJveCkKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXnhzY2FsZS9hcm0vJ2AKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCXo4MC0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejgwLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JbW1peCkKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKLQkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0JY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQkqLXVua25vd24pCi0JCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotCSMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0JIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktYXVyb3JhdXgpCi0JCW9zPS1hdXJvcmF1eAotCQk7OwotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtY25rKiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtYXVyb3JhdXgqIHwgLXNvbGFyaXMqIFwKLQkgICAgICB8IC1zeW0qIHwgLWtvcGVuc29sYXJpcyogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAotCSAgICAgIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCi0JICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCi0JICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAotCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKLQkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiB8IC1jZWdjYyogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtbXN5cyogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LWFuZHJvaWQqIFwKLQkgICAgICB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAotCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKLQkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAotCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyogfCAtZHJvcHMqIHwgLWVzKikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLXFueCopCi0JCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkJICAgIHg4Ni0qIHwgaSo4Ni0qKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0tbnRvJG9zCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JLW50by1xbngqKQotCQk7OwotCS1udG8qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKLQkJOzsKLQktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAotCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgtZGlldGxpYmMpCi0JCW9zPS1saW51eC1kaWV0bGliYwotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9wZW5lZCopCi0JCW9zPS1vcGVuZWRpdGlvbgotCQk7OwotCS1vczQwMCopCi0JCW9zPS1vczQwMAotCQk7OwotCS13aW5jZSopCi0JCW9zPS13aW5jZQotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktYXRoZW9zKikKLQkJb3M9LWF0aGVvcwotCQk7OwotCS1zeWxsYWJsZSopCi0JCW9zPS1zeWxsYWJsZQotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbm92YSopCi0JCW9zPS1ydG1rLW5vdmEKLQkJOzsKLQktbnMyICkKLQkJb3M9LW5leHRzdGVwMgotCQk7OwotCS1uc2sqKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1kaWNvcyopCi0JCW9zPS1kaWNvcwotCQk7OwotCS1uYWNsKikKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCXNjb3JlLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlzcHUtKikKLQkJb3M9LWVsZgotCQk7OwotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLXJlYmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JYzR4LSogfCB0aWM0eC0qKQotCQlvcz0tY29mZgotCQk7OwotCWhleGFnb24tKikKLQkJb3M9LWVsZgotCQk7OwotCXRpYzU0eC0qKQotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eC0qKQotCQlvcz0tY29mZgotCQk7OwotCXRpYzZ4LSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1lcC0qKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0Jb3IzMi0qKQotCQlvcz0tY29mZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaGFpa3UpCi0JCW9zPS1oYWlrdQotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi1rbnV0aCkKLQkJb3M9LW1taXh3YXJlCi0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCSotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotCSotc2dpKQotCQlvcz0taXJpeAotCQk7OwotCSotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1jbmsqfC1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktb3M0MDAqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXRwZiopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQkJLXZvcyopCi0JCQkJdmVuZG9yPXN0cmF0dXMKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI2NTcxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBMaWJWTkNTZXJ2ZXIgMC45LjkuCi0jCi0jIFJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uCi0jCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCAxOTk4LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7ICMoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0KLQotYXNfbmw9JwotJwotZXhwb3J0IGFzX25sCi0jIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgotYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLSMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAotIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KLWlmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKLSAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50IC1yIC0tJwotICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKLWVsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnRmICVzXG4nCi0gIGFzX2VjaG9fbj0ncHJpbnRmICVzJwotZWxzZQotICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJwotICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKLSAgZWxzZQotICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCi0gICAgYXNfZWNob19uX2JvZHk9J2V2YWwKLSAgICAgIGFyZz0kMTsKLSAgICAgIGNhc2UgJGFyZyBpbiAjKAotICAgICAgKiIkYXNfbmwiKikKLQlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKLQlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OwotICAgICAgZXNhYzsKLSAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKLSAgICAnCi0gICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Ci0gICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKLSAgZmkKLSAgZXhwb3J0IGFzX2VjaG9fYm9keQotICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCi1maQotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIFBBVEhfU0VQQVJBVE9SPToKLSAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgewotICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gICAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgfQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1hc19teXNlbGY9Ci1jYXNlICQwIGluICMoKAotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIGV4aXQgMQotZmkKLQotIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgotIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgotIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAotIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KLWZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKLWRvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCi0gICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1MQ19BTEw9QwotZXhwb3J0IExDX0FMTAotTEFOR1VBR0U9QwotZXhwb3J0IExBTkdVQUdFCi0KLSMgQ0RQQVRILgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0jIFVzZSBhIHByb3BlciBpbnRlcm5hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbnN1cmUgd2UgZG9uJ3QgZmFsbAotICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCi0gIGlmIHRlc3QgeCIke19hc19jYW5fcmVleGVjfSIgIT0geG5vICYmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gICAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYzsKLSAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQotIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KLSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0jIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCi1CQVNIX0VOVj0vZGV2L251bGwKLUVOVj0vZGV2L251bGwKLSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotY2FzZSAkLSBpbiAjICgoKCgKLSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7Ci0gICp2KiApIGFzX29wdHM9LXYgOzsKLSAgKngqICkgYXNfb3B0cz0teCA7OwotICAqICkgYXNfb3B0cz0gOzsKLWVzYWMKLWV4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci0jIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKLSMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KLSRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKLWFzX2ZuX2V4aXQgMjU1Ci0gIGZpCi0gICMgV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHByb3BhZ2F0ZSB0byBvdGhlciBzdWJwcm9jZXNzZXMuCi0gICAgICAgICAgeyBfYXNfY2FuX3JlZXhlYz07IHVuc2V0IF9hc19jYW5fcmVleGVjO30KLWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KLSAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7ICMoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0iCi0gIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Ci1hc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KLWFzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQotYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQotCi1leGl0Y29kZT0wCi1hc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9Ci1pZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6Ci0KLWVsc2UKLSAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotdGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQotdGVzdCAteCAvIHx8IGV4aXQgMSIKLSAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTwotICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgotICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCi10ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKLSAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLSAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotCi1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWFzX2ZvdW5kPWZhbHNlCi1mb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGFzX2ZvdW5kPToKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKLQkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgotCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGJyZWFrIDIKLWZpCi1maQotCSAgIGRvbmU7OwotICAgICAgIGVzYWMKLSAgYXNfZm91bmQ9ZmFsc2UKLWRvbmUKLSRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgotCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcwotZmk7IH0KLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6Ci0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgICAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQotIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KLSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0jIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCi1CQVNIX0VOVj0vZGV2L251bGwKLUVOVj0vZGV2L251bGwKLSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotY2FzZSAkLSBpbiAjICgoKCgKLSAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7Ci0gICp2KiApIGFzX29wdHM9LXYgOzsKLSAgKngqICkgYXNfb3B0cz0teCA7OwotICAqICkgYXNfb3B0cz0gOzsKLWVzYWMKLWV4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci0jIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKLSMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KLSRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKLWV4aXQgMjU1Ci1maQotCi0gICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgotICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCi0gICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgotICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgotICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgotICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKLSAgZWxzZQotICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCi0kMDogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIgYWJvdXQgeW91cgotJDA6IHN5c3RlbSwgaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSQwOiBtZXNzYWdlLiBUaGVuIGluc3RhbGwgYSBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1bgotJDA6IHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4iCi0gIGZpCi0gIGV4aXQgMQotZmkKLWZpCi1maQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWV4cG9ydCBTSEVMTAotIyBVbnNldCBtb3JlIHZhcmlhYmxlcyBrbm93biB0byBpbnRlcmZlcmUgd2l0aCBiZWhhdmlvciBvZiBjb21tb24gdG9vbHMuCi1DTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQotdW5zZXQgQ0xJQ09MT1JfRk9SQ0UgR1JFUF9PUFRJT05TCi0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBTaGVsbCBGdW5jdGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMgYXNfZm5fdW5zZXQgVkFSCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBQb3J0YWJseSB1bnNldCBWQVIuCi1hc19mbl91bnNldCAoKQotewotICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Ci19Ci1hc191bnNldD1hc19mbl91bnNldAotCi0jIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KLWFzX2ZuX3NldF9zdGF0dXMgKCkKLXsKLSAgcmV0dXJuICQxCi19ICMgYXNfZm5fc2V0X3N0YXR1cwotCi0jIGFzX2ZuX2V4aXQgU1RBVFVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KLWFzX2ZuX2V4aXQgKCkKLXsKLSAgc2V0ICtlCi0gIGFzX2ZuX3NldF9zdGF0dXMgJDEKLSAgZXhpdCAkMQotfSAjIGFzX2ZuX2V4aXQKLQotIyBhc19mbl9ta2Rpcl9wCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgotYXNfZm5fbWtkaXJfcCAoKQotewotCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgotCi0KLX0gIyBhc19mbl9ta2Rpcl9wCi0KLSMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgotYXNfZm5fZXhlY3V0YWJsZV9wICgpCi17Ci0gIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKLX0gIyBhc19mbl9leGVjdXRhYmxlX3AKLSMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKLSMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgotIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQotIyBpbXBsZW1lbnRhdGlvbnMuCi1pZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMSs9XCQyCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMT1cJCQxXCQyCi0gIH0KLWZpICMgYXNfZm5fYXBwZW5kCi0KLSMgYXNfZm5fYXJpdGggQVJHLi4uCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCi0jIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKLSMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCi1pZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD0kKCggJCogKSkKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCi0gIH0KLWZpICMgYXNfZm5fYXJpdGgKLQotCi0jIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLSMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19ICMgYXNfZm5fZXJyb3IKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KLSAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKLSAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9Ci0KLSAgIyBJZiB3ZSBoYWQgdG8gcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwsIHdlJ3JlIGVuc3VyZWQgdG8gaGF2ZQotICAjIGFscmVhZHkgZG9uZSB0aGF0LCBzbyBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGRvIHNvIGFnYWluIGFuZCBmYWxsCi0gICMgaW4gYW4gaW5maW5pdGUgbG9vcC4gIFRoaXMgaGFzIGFscmVhZHkgaGFwcGVuZWQgaW4gcHJhY3RpY2UuCi0gIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWMKLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgeHkpICBFQ0hPX0M9J1xjJzs7Ci0gICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKLSAgICAgICBFQ0hPX1Q9JwknOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLWZpCi1pZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9J2xuIC1zJwotICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KLSAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgICBhc19sbl9zPSdjcCAtcFInCi0gIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz1sbgotICBlbHNlCi0gICAgYXNfbG5fcz0nY3AgLXBSJwotICBmaQotZWxzZQotICBhc19sbl9zPSdjcCAtcFInCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotYXNfdGVzdF94PSd0ZXN0IC14JwotYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1jYXNlIFgkRUNITyBpbgotWCotLWZhbGxiYWNrLWVjaG8pCi0gICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCi0gIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXCRcXCQwLCckMCcsJ2AKLSAgOzsKLWVzYWMKLQotZWNobz0ke0VDSE8tZWNob30KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1pZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGAgJiYKLSAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgOgotZWxzZQotICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKLSAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZwotICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJwotICAjCi0gICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgotCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICRDT05GSUdfU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgJXNcbicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCi0JICB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIiQwIiAkezErIiRAIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCi0jIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KLUVDSE89JGVjaG8KLWlmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXCQwIC0tZmFsbGJhY2stZWNobyIKLWZpCi0KLQotCi0KLXRhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUNYWAotCi10YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1GNzcKLQotdGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAotZXhlYyA2PiYxCi0KLSMgTmFtZSBvZiB0aGUgaG9zdC4KLSMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgotYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0KLSMKLSMgSW5pdGlhbGl6YXRpb25zLgotIwotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotYWNfY2xlYW5fZmlsZXM9Ci1hY19jb25maWdfbGlib2JqX2Rpcj0uCi1MSUJPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotCi0jIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KLVBBQ0tBR0VfTkFNRT0nTGliVk5DU2VydmVyJwotUEFDS0FHRV9UQVJOQU1FPSdsaWJ2bmNzZXJ2ZXInCi1QQUNLQUdFX1ZFUlNJT049JzAuOS45JwotUEFDS0FHRV9TVFJJTkc9J0xpYlZOQ1NlcnZlciAwLjkuOScKLVBBQ0tBR0VfQlVHUkVQT1JUPSdodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcicKLVBBQ0tBR0VfVVJMPScnCi0KLSMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KLWFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NURExJQl9ICi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiIKLQotYWNfc3Vic3RfdmFycz0nYW1fX0VYRUVYVF9GQUxTRQotYW1fX0VYRUVYVF9UUlVFCi1MVExJQk9CSlMKLVJQTVNPVVJDRURJUgotV0lUSF9YMTFWTkNfRkFMU0UKLVdJVEhfWDExVk5DX1RSVUUKLUhBVkVfUlBNX0ZBTFNFCi1IQVZFX1JQTV9UUlVFCi1BTkRST0lEX0ZBTFNFCi1BTkRST0lEX1RSVUUKLU9TWF9GQUxTRQotT1NYX1RSVUUKLUxJTlVYX0ZBTFNFCi1MSU5VWF9UUlVFCi1DWUdJUENfRkFMU0UKLUNZR0lQQ19UUlVFCi1MSUJPQkpTCi1IQVZFX0dOVVRMU19GQUxTRQotSEFWRV9HTlVUTFNfVFJVRQotR05VVExTX0xJQlMKLUdOVVRMU19DRkxBR1MKLUxJQkdDUllQVF9MSUJTCi1MSUJHQ1JZUFRfQ0ZMQUdTCi1MSUJHQ1JZUFRfQ09ORklHCi1XU09DS0xJQgotTUlOR1dfRkFMU0UKLU1JTkdXX1RSVUUKLUhBVkVfTElCR1RLX0ZBTFNFCi1IQVZFX0xJQkdUS19UUlVFCi1HVEtfTElCUwotR1RLX0NGTEFHUwotUEtHX0NPTkZJR19MSUJESVIKLVBLR19DT05GSUdfUEFUSAotUEtHX0NPTkZJRwotU0RMX0xJQlMKLVNETF9DRkxBR1MKLUhBVkVfTElCU0RMX0ZBTFNFCi1IQVZFX0xJQlNETF9UUlVFCi1IQVZFX0xJQlBOR19GQUxTRQotSEFWRV9MSUJQTkdfVFJVRQotSEFWRV9MSUJKUEVHX0ZBTFNFCi1IQVZFX0xJQkpQRUdfVFJVRQotSEFWRV9MSUJaX0ZBTFNFCi1IQVZFX0xJQlpfVFJVRQotV0lUSF9XRUJTT0NLRVRTX0ZBTFNFCi1XSVRIX1dFQlNPQ0tFVFNfVFJVRQotV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0UKLVdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUUKLUhBVkVfTElCUFRIUkVBRF9GQUxTRQotSEFWRV9MSUJQVEhSRUFEX1RSVUUKLUpQRUdfTERGTEFHUwotSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFCi1IQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfVFJVRQotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUwotT1NYX09QRU5HTF9GQUxTRQotT1NYX09QRU5HTF9UUlVFCi1BVkFISV9MSUJTCi1BVkFISV9DRkxBR1MKLUhBVkVfWDExX0ZBTFNFCi1IQVZFX1gxMV9UUlVFCi1YX0VYVFJBX0xJQlMKLVhfTElCUwotWF9QUkVfTElCUwotWF9DRkxBR1MKLVhNS01GCi1IQVZFX0xJQlNTTF9GQUxTRQotSEFWRV9MSUJTU0xfVFJVRQotU1NMX0xJQlMKLUNSWVBUX0xJQlMKLUhBVkVfTVAzTEFNRV9GQUxTRQotSEFWRV9NUDNMQU1FX1RSVUUKLVdJVEhfRkZNUEVHX0ZBTFNFCi1XSVRIX0ZGTVBFR19UUlVFCi13aXRoX2ZmbXBlZwotTElCVE9PTAotYWNfY3RfRjc3Ci1GRkxBR1MKLUY3NwotQ1hYQ1BQCi1hbV9fZmFzdGRlcENYWF9GQUxTRQotYW1fX2Zhc3RkZXBDWFhfVFJVRQotQ1hYREVQTU9ERQotYWNfY3RfQ1hYCi1DWFhGTEFHUwotQ1hYCi1DUFAKLU9CSkRVTVAKLUFTCi1ETExUT09MCi1SQU5MSUIKLUFSCi1FQ0hPCi1MTl9TCi1FR1JFUAotR1JFUAotaG9zdF9vcwotaG9zdF92ZW5kb3IKLWhvc3RfY3B1Ci1ob3N0Ci1idWlsZF9vcwotYnVpbGRfdmVuZG9yCi1idWlsZF9jcHUKLWJ1aWxkCi1hbV9fZmFzdGRlcENDX0ZBTFNFCi1hbV9fZmFzdGRlcENDX1RSVUUKLUNDREVQTU9ERQotYW1fX25vZGVwCi1BTURFUEJBQ0tTTEFTSAotQU1ERVBfRkFMU0UKLUFNREVQX1RSVUUKLWFtX19xdW90ZQotYW1fX2luY2x1ZGUKLURFUERJUgotT0JKRVhUCi1FWEVFWFQKLWFjX2N0X0NDCi1DUFBGTEFHUwotTERGTEFHUwotQ0ZMQUdTCi1DQwotQU1fQkFDS1NMQVNICi1BTV9ERUZBVUxUX1ZFUkJPU0lUWQotQU1fREVGQVVMVF9WCi1BTV9WCi1hbV9fdW50YXIKLWFtX190YXIKLUFNVEFSCi1hbV9fbGVhZGluZ19kb3QKLVNFVF9NQUtFCi1BV0sKLW1rZGlyX3AKLU1LRElSX1AKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotU1RSSVAKLWluc3RhbGxfc2gKLU1BS0VJTkZPCi1BVVRPSEVBREVSCi1BVVRPTUFLRQotQVVUT0NPTkYKLUFDTE9DQUwKLVZFUlNJT04KLVBBQ0tBR0UKLUNZR1BBVEhfVwotYW1fX2lzcmMKLUlOU1RBTExfREFUQQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfUFJPR1JBTQotdGFyZ2V0X2FsaWFzCi1ob3N0X2FsaWFzCi1idWlsZF9hbGlhcwotTElCUwotRUNIT19UCi1FQ0hPX04KLUVDSE9fQwotREVGUwotbWFuZGlyCi1sb2NhbGVkaXIKLWxpYmRpcgotcHNkaXIKLXBkZmRpcgotZHZpZGlyCi1odG1sZGlyCi1pbmZvZGlyCi1kb2NkaXIKLW9sZGluY2x1ZGVkaXIKLWluY2x1ZGVkaXIKLWxvY2Fsc3RhdGVkaXIKLXNoYXJlZHN0YXRlZGlyCi1zeXNjb25mZGlyCi1kYXRhZGlyCi1kYXRhcm9vdGRpcgotbGliZXhlY2Rpcgotc2JpbmRpcgotYmluZGlyCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1wcmVmaXgKLWV4ZWNfcHJlZml4Ci1QQUNLQUdFX1VSTAotUEFDS0FHRV9CVUdSRVBPUlQKLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9OQU1FCi1QQVRIX1NFUEFSQVRPUgotU0hFTEwnCi1hY19zdWJzdF9maWxlcz0nJwotYWNfdXNlcl9vcHRzPScKLWVuYWJsZV9vcHRpb25fY2hlY2tpbmcKLWVuYWJsZV9zaWxlbnRfcnVsZXMKLWVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCi1lbmFibGVfc2hhcmVkCi1lbmFibGVfc3RhdGljCi1lbmFibGVfZmFzdF9pbnN0YWxsCi13aXRoX2dudV9sZAotZW5hYmxlX2xpYnRvb2xfbG9jawotd2l0aF9waWMKLXdpdGhfdGFncwotd2l0aF90aWdodHZuY19maWxldHJhbnNmZXIKLXdpdGhfd2Vic29ja2V0cwotd2l0aF8yNGJwcAotd2l0aF9mZm1wZWcKLXdpdGhfY3J5cHQKLXdpdGhfY3J5cHRvCi13aXRoX3NzbAotd2l0aF94Ci13aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIKLXdpdGhfeDExdm5jCi13aXRoX3hrZXlib2FyZAotd2l0aF94aW5lcmFtYQotd2l0aF94cmFuZHIKLXdpdGhfeGZpeGVzCi13aXRoX3hkYW1hZ2UKLXdpdGhfeHRyYXAKLXdpdGhfeHJlY29yZAotd2l0aF9mYnBtCi13aXRoX2RwbXMKLXdpdGhfdjRsCi13aXRoX2ZiZGV2Ci13aXRoX3VpbnB1dAotd2l0aF9tYWNvc3hfbmF0aXZlCi13aXRoX2F2YWhpCi13aXRoX2pwZWcKLXdpdGhfcG5nCi13aXRoX2xpYnoKLXdpdGhfemxpYgotd2l0aF9wdGhyZWFkCi13aXRoX3NkbF9jb25maWcKLXdpdGhfZ2NyeXB0Ci13aXRoX2NsaWVudF9nY3J5cHQKLXdpdGhfbGliZ2NyeXB0X3ByZWZpeAotd2l0aF9nbnV0bHMKLXdpdGhfaXB2NgotJwotICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotQ0MKLUNGTEFHUwotTERGTEFHUwotTElCUwotQ1BQRkxBR1MKLUNQUAotQ1hYCi1DWFhGTEFHUwotQ0NDCi1DWFhDUFAKLUY3NwotRkZMQUdTCi1YTUtNRgotSlBFR19MREZMQUdTCi1QS0dfQ09ORklHCi1QS0dfQ09ORklHX1BBVEgKLVBLR19DT05GSUdfTElCRElSCi1HVEtfQ0ZMQUdTCi1HVEtfTElCUwotR05VVExTX0NGTEFHUwotR05VVExTX0xJQlMnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICo9KSAgIGFjX29wdGFyZz0gOzsKLSAgKikgICAgYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAotICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KLSAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgotICAgIG5vKSA7OwotICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKLSAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgKi8gKQotICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCi0gICAgICBldmFsICRhY192YXI9XCRhY192YWw7OwotICBlc2FjCi0gICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCi1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBMaWJWTkNTZXJ2ZXIgMC45LjkgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCi0gICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KLSAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCi0KLUJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgotXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKLWFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi1mb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgotCi1Gb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLQotRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9saWJ2bmNzZXJ2ZXJdCi0gIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVggZmVhdHVyZXM6Ci0gIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0gIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIExpYlZOQ1NlcnZlciAwLjkuOToiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgICAgICAgIGxlc3MgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MScpCi0gIC0tZGlzYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0wJykKLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10KLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKQotCi1PcHRpb25hbCBQYWNrYWdlczoKLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXQotICAtLXdpdGgtcGljICAgICAgICAgICAgICB0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBbZGVmYXVsdD11c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm90aF0KLSAgLS13aXRoLXRhZ3NbPVRBR1NdICAgICAgaW5jbHVkZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIFthdXRvbWF0aWNdCi0gIC0td2l0aG91dC1maWxldHJhbnNmZXIgIGRpc2FibGUgVGlnaHRWTkMgZmlsZSB0cmFuc2ZlciBwcm90b2NvbAotICAtLXdpdGhvdXQtd2Vic29ja2V0cyAgICBkaXNhYmxlIFdlYlNvY2tldHMgc3VwcG9ydAotICAtLXdpdGhvdXQtMjRicHAgICAgICAgICBkaXNhYmxlIDI0IGJwcCBmcmFtZWJ1ZmZlcnMKLSAgLS13aXRoLWZmbXBlZz1kaXIgICAgICAgc2V0IGZmbXBlZyBob21lIGRpcmVjdG9yeQotICAtLXdpdGhvdXQtY3J5cHQgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGxpYmNyeXB0Ci0gIC0td2l0aG91dC1jcnlwdG8gICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3Igb3BlbnNzbCBsaWJjcnlwdG8KLSAgLS13aXRob3V0LXNzbCAgICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBvcGVuc3NsIGxpYnNzbAotICAtLXdpdGgtc3NsPURJUiAgICAgICAgICB1c2Ugb3BlbnNzbCBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aC14ICAgICAgICAgICAgICAgIHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtCi0gIC0td2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyICAgICB1c2UgaW5zdGFsbGVkIGxpYnZuY3NlcnZlciBmb3IgeDExdm5jCi0gIC0td2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyPURJUiB1c2UgbGlidm5jc2VydmVyIGluc3RhbGxlZCBpbiBESVIgZm9yIHgxMXZuYwotICAtLXdpdGgteDExdm5jICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIHRoZSB4MTF2bmMgc3ViZGlyIChpZiBwcmVzZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2lsbCBuZWVkIHRvIGNkIHRvIHgxMXZuYyBhbmQgcnVuICdtYWtlJyBldGMuCi0gIC0td2l0aG91dC14a2V5Ym9hcmQgICAgIGRpc2FibGUgeGtleWJvYXJkIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14aW5lcmFtYSAgICAgIGRpc2FibGUgeGluZXJhbWEgZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LXhyYW5kciAgICAgICAgZGlzYWJsZSB4cmFuZHIgZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LXhmaXhlcyAgICAgICAgZGlzYWJsZSB4Zml4ZXMgZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LXhkYW1hZ2UgICAgICAgZGlzYWJsZSB4ZGFtYWdlIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC14dHJhcCAgICAgICAgIGRpc2FibGUgeHRyYXAgZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LXhyZWNvcmQgICAgICAgZGlzYWJsZSB4cmVjb3JkIGV4dGVuc2lvbiBzdXBwb3J0Ci0gIC0td2l0aG91dC1mYnBtICAgICAgICAgIGRpc2FibGUgZmJwbSBleHRlbnNpb24gc3VwcG9ydAotICAtLXdpdGhvdXQtZHBtcyAgICAgICAgICBkaXNhYmxlIGRwbXMgZXh0ZW5zaW9uIHN1cHBvcnQKLSAgLS13aXRob3V0LXY0bCAgICAgICAgICAgZGlzYWJsZSB2aWRlbzRsaW51eCBzdXBwb3J0Ci0gIC0td2l0aG91dC1mYmRldiAgICAgICAgIGRpc2FibGUgbGludXggZmIgZGV2aWNlIHN1cHBvcnQKLSAgLS13aXRob3V0LXVpbnB1dCAgICAgICAgZGlzYWJsZSBsaW51eCB1aW5wdXQgZGV2aWNlIHN1cHBvcnQKLSAgLS13aXRob3V0LW1hY29zeC1uYXRpdmUgZGlzYWJsZSBNYWNPUyBYIG5hdGl2ZSBkaXNwbGF5IHN1cHBvcnQKLSAgLS13aXRob3V0LWF2YWhpICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBBdmFoaS9tRE5TCi0gIC0td2l0aC1hdmFoaT1ESVIgICAgICAgIHVzZSBhdmFoaSBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1qcGVnICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IganBlZwotICAtLXdpdGgtanBlZz1ESVIgICAgICAgICB1c2UganBlZyBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1wbmcgICAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgcG5nCi0gIC0td2l0aC1wbmc9RElSICAgICAgICAgIHVzZSBwbmcgaW5jbHVkZS9saWJyYXJ5IGZpbGVzIGluIERJUgotICAtLXdpdGhvdXQtbGlieiAgICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGRlZmxhdGUKLSAgLS13aXRob3V0LXpsaWIgICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBkZWZsYXRlCi0gIC0td2l0aC16bGliPURJUiAgICAgICAgIHVzZSB6bGliIGluY2x1ZGUvbGlicmFyeSBmaWxlcyBpbiBESVIKLSAgLS13aXRob3V0LXB0aHJlYWQgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBsaWJwdGhyZWFkCi0gIC0td2l0aC1zZGwtY29uZmlnPUZJTEUKLSAgICBVc2UgdGhlIGdpdmVuIHBhdGggdG8gc2RsLWNvbmZpZyB3aGVuIGRldGVybWluaW5nCi0gICAgU0RMIGNvbmZpZ3VyYXRpb247IGRlZmF1bHRzIHRvICJzZGwtY29uZmlnIgotICAtLXdpdGhvdXQtZ2NyeXB0ICAgICAgICBkaXNhYmxlIHN1cHBvcnQgZm9yIGdjcnlwdAotICAtLXdpdGhvdXQtY2xpZW50LWdjcnlwdCBkaXNhYmxlIHN1cHBvcnQgZm9yIGdjcnlwdCBpbiBsaWJ2bmNjbGllbnQKLSAgLS13aXRoLWxpYmdjcnlwdC1wcmVmaXg9UEZYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCB3aGVyZSBMSUJHQ1JZUFQgaXMgaW5zdGFsbGVkIChvcHRpb25hbCkKLSAgLS13aXRob3V0LWdudXRscyAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciBnbnV0bHMKLSAgLS13aXRoLWdudXRscz1ESVIgICAgICAgdXNlIGdudXRscyBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSCi0gIC0td2l0aG91dC1pcHY2ICAgICAgICAgIGRpc2FibGUgSVB2NiBzdXBwb3J0Ci0KLVNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwotICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKLSAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgotICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+Ci0gIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKLSAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+Ci0gIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCi0gIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCi0gIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncwotICBDWFhDUFAgICAgICBDKysgcHJlcHJvY2Vzc29yCi0gIEY3NyAgICAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgY29tbWFuZAotICBGRkxBR1MgICAgICBGb3J0cmFuIDc3IGNvbXBpbGVyIGZsYWdzCi0gIFhNS01GICAgICAgIFBhdGggdG8geG1rbWYsIE1ha2VmaWxlIGdlbmVyYXRvciBmb3IgWCBXaW5kb3cgU3lzdGVtCi0gIEpQRUdfTERGTEFHUwotICAgICAgICAgICAgICBMaW5rZXIgZmxhZ3MgdG8gdXNlIHdoZW4gbGlua2luZyB3aXRoIGxpYmpwZWcsIGUuZy4KLSAgICAgICAgICAgICAgLUwvZm9vL2Rpci9saWIgLVdsLC1zdGF0aWMgLWxqcGVnIC1XbCwtc2hhcmVkLiBUaGlzIG92ZXJyaWRlcwotICAgICAgICAgICAgICB0aGUgbGlua2VyIGZsYWdzIHNldCBieSAtLXdpdGgtanBlZy4KLSAgUEtHX0NPTkZJRyAgcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHkKLSAgUEtHX0NPTkZJR19QQVRICi0gICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGFkZCB0byBwa2ctY29uZmlnJ3Mgc2VhcmNoIHBhdGgKLSAgUEtHX0NPTkZJR19MSUJESVIKLSAgICAgICAgICAgICAgcGF0aCBvdmVycmlkaW5nIHBrZy1jb25maWcncyBidWlsdC1pbiBzZWFyY2ggcGF0aAotICBHVEtfQ0ZMQUdTICBDIGNvbXBpbGVyIGZsYWdzIGZvciBHVEssIG92ZXJyaWRpbmcgcGtnLWNvbmZpZwotICBHVEtfTElCUyAgICBsaW5rZXIgZmxhZ3MgZm9yIEdUSywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCi0gIEdOVVRMU19DRkxBR1MKLSAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgR05VVExTLCBvdmVycmlkaW5nIHBrZy1jb25maWcKLSAgR05VVExTX0xJQlMgbGlua2VyIGZsYWdzIGZvciBHTlVUTFMsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZwotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1SZXBvcnQgYnVncyB0byA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXI+LgotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAotICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8Ci0gICAgICBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotTGliVk5DU2VydmVyIGNvbmZpZ3VyZSAwLjkuOQotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5Ci0KLUNvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gIGZpCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKLQotIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgewotCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAotCSB0ZXN0IC14IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCi0gICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKLSAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKLSAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgotICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKLQotIyBhY19mbl9jX3RyeV9jcHAgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICAgYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2NwcAotCi0jIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMsIGdpdmluZyBhIHdhcm5pbmcgaWYgaXQgY2Fubm90IGJlIGNvbXBpbGVkIHVzaW5nCi0jIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKLSMgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAotICB5ZXM6bm86ICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotKCAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIFJlcG9ydCB0aGlzIHRvIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgotICAgIDs7Ci1lc2FjCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZmkKLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCi0KLSMgYWNfZm5fY190cnlfcnVuIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcwotIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KLWFjX2ZuX2NfdHJ5X3J1biAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cwotZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jX3RyeV9ydW4KLQotIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KLSMgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiQzPXllcyIKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQotCi0jIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKLWFjX2ZuX2NfY2hlY2tfZnVuYyAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICQyIGlubm9jdW91c18kMgotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkMgotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICQyICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkMiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19jaGVja19mdW5jCi0KLSMgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKLQotIyBhY19mbl9jeHhfdHJ5X2NwcCBMSU5FTk8KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KLWFjX2ZuX2N4eF90cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAgIGFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jeHhfdHJ5X2NwcAotCi0jIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jeHhfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jeHhfdHJ5X2xpbmsKLQotIyBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fZjc3X3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2Y3N190cnlfY29tcGlsZQotCi0jIGFjX2ZuX2Y3N190cnlfbGluayBMSU5FTk8KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9mNzdfdHJ5X2xpbmsgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKLQkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKLQkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKLSAgICAgICB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19yZXR2YWw9MQotZmkKLSAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgotICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCi0gICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCi0gICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9mNzdfdHJ5X2xpbmsKLQotIyBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKLSMgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja190eXBlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCQyKSkKLQkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLWludAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoKCQyKSkpCi0JICAgIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgZXZhbCAiJDM9eWVzIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLQotfSAjIGFjX2ZuX2NfY2hlY2tfdHlwZQotY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLQotSXQgd2FzIGNyZWF0ZWQgYnkgTGliVk5DU2VydmVyICRhc19tZSAwLjkuOSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICAkICQwICRACi0KLV9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci1jYXQgPDxfQVNVTkFNRQotIyMgLS0tLS0tLS0tICMjCi0jIyBQbGF0Zm9ybS4gIyMKLSMjIC0tLS0tLS0tLSAjIwotCi1ob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCi0KLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotX0FTVU5BTUUKLQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLX0gPiY1Ci0KLWNhdCA+JjUgPDxfQUNFT0YKLQotCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgQ29yZSB0ZXN0cy4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi0KLV9BQ0VPRgotCi0KLSMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgotIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCi1hY19jb25maWd1cmVfYXJncz0KLWFjX2NvbmZpZ3VyZV9hcmdzMD0KLWFjX2NvbmZpZ3VyZV9hcmdzMT0KLWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCi1mb3IgYWNfcGFzcyBpbiAxIDIKLWRvCi0gIGZvciBhY19hcmcKLSAgZG8KLSAgICBjYXNlICRhY19hcmcgaW4KLSAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Ci0gICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICAgIGNvbnRpbnVlIDs7Ci0gICAgKlwnKikKLSAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgJGFjX3Bhc3MgaW4KLSAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OwotICAgIDIpCi0gICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgotICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCi0JYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgotICAgICAgZWxzZQotCWNhc2UgJGFjX2FyZyBpbgotCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCi0JICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCi0JICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCi0JICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKLQkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCi0JICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi17IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Ci17IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9Ci0KLSMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKLSMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCi0jIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KLSMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgotIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgotdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCi0gIHsKLSAgICBlY2hvCi0KLSAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICBlY2hvCi0gICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKLSAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICBzZWQgLW4gXAotCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKQotICAgIGVjaG8KLQotICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgIGVjaG8KLSAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCi0gICAgZG8KLSAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgICAgY2FzZSAkYWNfdmFsIGluCi0gICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0gICAgICBlc2FjCi0gICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLQllc2FjCi0JJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgotICAgICAgZG9uZSB8IHNvcnQKLSAgICAgIGVjaG8KLSAgICBmaQotCi0gICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCi0gICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIyIKLSAgICAgIGVjaG8KLSAgICAgIGNhdCBjb25mZGVmcy5oCi0gICAgICBlY2hvCi0gICAgZmkKLSAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCi0gICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCi0gIH0gPiY1Ci0gIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgotICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKLSAgICBleGl0ICRleGl0X3N0YXR1cwotJyAwCi1mb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KLSAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCi1kb25lCi1hY19zaWduYWw9MAotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKLQotJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCi1fQUNFT0YKLQotCi0jIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KLSMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1hY19zaXRlX2ZpbGUxPU5PTkUKLWFjX3NpdGVfZmlsZTI9Tk9ORQotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgotICBjYXNlICRDT05GSUdfU0lURSBpbiAjKCgKLSAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwotICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OwotICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQotICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1lbHNlCi0gIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCi1kbwotICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQotICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Ci0gICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1Ci0gICAgLiAiJGFjX3NpdGVfZmlsZSIgXAotICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCi0gICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgY2FzZSAkY2FjaGVfZmlsZSBpbgotICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OwotICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OwotICAgIGVzYWMKLSAgZmkKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgPiRjYWNoZV9maWxlCi1maQotCi0jIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCi0jIHZhbHVlLgotYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgotICAgIHNldCwpCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICxzZXQpCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLCk7OwotICAgICopCi0gICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCi0JIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCi0JYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCi0JYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCi0JaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCi0JICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQotCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKLQllbHNlCi0JICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQotCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAotCWZpCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9Ci0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9Ci0gICAgICBmaTs7Ci0gIGVzYWMKLSAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgotICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KLSAgICBjYXNlICRhY19uZXdfdmFsIGluCi0gICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwotICAgIGVzYWMKLSAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KLSAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgotICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KLSAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1Ci1maQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotYW1fX2FwaV92ZXJzaW9uPScxLjExJwotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KLSAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKLWZpCi0KLSMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAotIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgotIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5Ci0jIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi0jIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4gIygoCi0gIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0gID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgotCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQotCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bwotCSAgICBta2RpciBjb25mdGVzdC5kaXIKLQkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKLQkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bwotCSAgICB0aGVuCi0JICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICAgIGJyZWFrIDMKLQkgICAgZmkKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLXJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLSRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKLSMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KLWFtX2xmPScKLScKLWNhc2UgYHB3ZGAgaW4KLSAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZl0qKQotICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZSIgIiRMSU5FTk8iIDU7OwotZXNhYwotY2FzZSAkc3JjZGlyIGluCi0gICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXSopCi0gICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6IFxgJHNyY2RpciciICIkTElORU5PIiA1OzsKLWVzYWMKLQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAiJExJTkVOTyIgNQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIGFzX2ZuX2Vycm9yICQ/ICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLgotIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KLWFjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLycKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YCRhc19lY2hvICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgfCBzZWQgIiRhY19zY3JpcHQiYAotCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi0KLWlmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgotICBjYXNlICRhbV9hdXhfZGlyIGluCi0gICpcICogfCAqXAkqKQotICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKLSAgKikKLSAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKLSAgZXNhYwotZmkKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KLWZpCi0KLWlmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCi0gIGNhc2UgJGFtX2F1eF9kaXIgaW4KLSAgKlwgKiB8ICpcCSopCi0gICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKLSAgKikKLSAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKLSAgZXNhYwotZmkKLQotIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCi0jIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0Ci0jIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCi0jIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKLSRhc19lY2hvICIkU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFNUUklQPSRhY19jdF9TVFJJUAotICBmaQotZWxzZQotICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1maQotCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcGF0aF9ta2Rpcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCi0JIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCSAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgfHwgY29udGludWUKLQkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCi0JICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAotCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAotCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQotCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKLQkgICAgICAgYnJlYWsgMzs7Ci0JICAgZXNhYwotCSBkb25lCi0gICAgICAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgTUtESVJfUD0iJGFjX2luc3RhbGxfc2ggLWQiCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLSRhc19lY2hvICIkTUtESVJfUCIgPiY2OyB9Ci0KLW1rZGlyX3A9IiRNS0RJUl9QIgotY2FzZSAkbWtkaXJfcCBpbgotICBbXFwvJF0qIHwgPzpbXFwvXSopIDs7Ci0gICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKLWVzYWMKLQotZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFXSz0kYWNfY3ZfcHJvZ19BV0sKLWlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKLSRhc19lY2hvICIkQVdLIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotcm0gLXJmIC50c3QgMj4vZGV2L251bGwKLW1rZGlyIC50c3QgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLnRzdDsgdGhlbgotICBhbV9fbGVhZGluZ19kb3Q9LgotZWxzZQotICBhbV9fbGVhZGluZ19kb3Q9XwotZmkKLXJtZGlyIC50c3QgMj4vZGV2L251bGwKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgotICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAotICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCi0gIGFtX19pc3JjPScgLUkkKHNyY2RpciknCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9TGliVk5DU2VydmVyCi0gVkVSU0lPTj0wLjkuOQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotX0FDRU9GCi0KLSMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KLQotQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQotCi0KLUFVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KLQotCi1NQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KLQotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi0jIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBZZXMsIGl0J3Mgc3RpbGwgdXNlZAotIyBpbiB0aGUgd2lsZCA6LSggIFdlIHNob3VsZCBmaW5kIGEgcHJvcGVyIHdheSB0byBkZXByZWNhdGUgaXQgLi4uCi1BTVRBUj0nJCR7VEFSLXRhcn0nCi0KLWFtX190YXI9JyQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiJyBhbV9fdW50YXI9JyQke1RBUi10YXJ9IHhmIC0nCi0KLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbGVudC1ydWxlcyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaWxlbnRfcnVsZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zaWxlbnRfcnVsZXM7Ci1maQotCi1jYXNlICRlbmFibGVfc2lsZW50X3J1bGVzIGluCi15ZXMpIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTA7Owotbm8pICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0xOzsKLSopICAgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7Ci1lc2FjCi1hbV9tYWtlPSR7TUFLRS1tYWtlfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRhbV9tYWtlIHN1cHBvcnRzIG5lc3RlZCB2YXJpYWJsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkYW1fbWFrZSBzdXBwb3J0cyBuZXN0ZWQgdmFyaWFibGVzLi4uICIgPiY2OyB9Ci1pZiAke2FtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgJGFzX2VjaG8gJ1RSVUU9JChCQVIkKFYpKQotQkFSMD1mYWxzZQotQkFSMT10cnVlCi1WPTEKLWFtX19kb2l0OgotCUAkKFRSVUUpCi0uUEhPTlk6IGFtX19kb2l0JyB8ICRhbV9tYWtlIC1mIC0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzPXllcwotZWxzZQotICBhbV9jdl9tYWtlX3N1cHBvcnRfbmVzdGVkX3ZhcmlhYmxlcz1ubwotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X21ha2Vfc3VwcG9ydF9uZXN0ZWRfdmFyaWFibGVzIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMiID4mNjsgfQotaWYgdGVzdCAkYW1fY3ZfbWFrZV9zdXBwb3J0X25lc3RlZF92YXJpYWJsZXMgPSB5ZXM7IHRoZW4KLSAgICBBTV9WPSckKFYpJwotICBBTV9ERUZBVUxUX1Y9JyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpJwotZWxzZQotICBBTV9WPSRBTV9ERUZBVUxUX1ZFUkJPU0lUWQotICBBTV9ERUZBVUxUX1Y9JEFNX0RFRkFVTFRfVkVSQk9TSVRZCi1maQotQU1fQkFDS1NMQVNIPSdcJwotCi1hY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIHJmYmNvbmZpZy5oIgotCi1hY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzICIKLQotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgcmZiL3JmYmNvbmZpZy5oIgotCi0KLSMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZWxzZQotICBDQz0iJGFjX2N2X3Byb2dfQ0MiCi1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJENDIiAmJiBicmVhawotICBkb25lCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQotYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLQotIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgotYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKLQotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwotCXRoZW4gOjsgZWxzZQotCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCWZpCi0JIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Ci0JIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCi0JIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCi0JIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCi0JIyBhY3R1YWxseSB3b3JraW5nLgotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLXRlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQotCi1lbHNlCi0gIGFjX2ZpbGU9JycKLWZpCi1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLXJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBybScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci1GSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwotIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCi0gIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz1ubwotICBlbHNlCi0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgotCWNyb3NzX2NvbXBpbGluZz15ZXMKLSAgICBlbHNlCi0JeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotICAgIGZpCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKLSAgICAgICBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGFjX2NvbXBpbGVyX2dudT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi1hY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9Ci1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBDRkxBR1M9IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLXN0cnVjdCBzdGF0OwotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKLQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCi1jYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgYW1fX3F1b3RlPQotICBfYW1fcmVzdWx0PUdOVQotICA7OwotZXNhYwotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAotICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCi0gICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgIGFtX19xdW90ZT0iXCIiCi0gICAgIF9hbV9yZXN1bHQ9QlNECi0gICAgIDs7Ci0gICBlc2FjCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7Ci1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi0gIGFtX19ub2RlcD0nX25vJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBhbV9fdW5pdmVyc2FsPWZhbHNlCi0gIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAotICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OwotICAgICBlc2FjCi0KLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKLSAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQotICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBnY2MpCi0gICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgotICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKLSAgICAgIDs7Ci0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBtc3ZjNyB8IG1zdmM3bXN5cyB8IG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcwotICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCi0gICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgotICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQotICAgICAgYW1fX21pbnVzX29iaj0KLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLSRhc19lY2hvICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQotQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZgotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgotICBhbV9fZmFzdGRlcENDX1RSVUU9Ci0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9JyMnCi1lbHNlCi0gIGFtX19mYXN0ZGVwQ0NfVFJVRT0nIycKLSAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0KLWZpCi0KLQotaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlci4uLiAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICIgPiY2OyB9Ci1maQotc2V0IGR1bW15ICRDQzsgYWNfY2M9YCRhc19lY2hvICIkMiIgfAotCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgZXZhbCBcJHthY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCi0jIFdlIGRvIHRoZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbgotIyBleGlzdGluZyAubyBmaWxlIHdpdGggLW8sIHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KLWFjX3RyeT0nJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1Jwotcm0gLWYgY29uZnRlc3QyLioKLWlmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgotICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07Ci10aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCi0gIGlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCi0gICAgaWYgeyBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KLSAgICAgIGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCi0gICAgICBybSAtZiBjb25mdGVzdDIuKgotICAgICAgaWYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmCi0JIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OwotICAgICAgdGhlbgotCSMgY2Mgd29ya3MgdG9vLgotCToKLSAgICAgIGVsc2UKLQkjIGNjIGV4aXN0cyBidXQgZG9lc24ndCBsaWtlIC1vLgotCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbyA9IHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYW1fY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KLWlmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0JQ0NMRD0iXCQoQ0MpIgotZWxzZQotCUNDTEQ9IiRDQyIKLWZpCi10ZXN0ICJ4JEdDQyIgPSAieHllcyIgJiYgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3NoYXJlZD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OwotICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0gICAgKikKLSAgICAgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0JSUZTPSIkbHRfc2F2ZV9pZnMiCi0JaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLQkgIGVuYWJsZV9zdGF0aWM9eWVzCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgOzsKLSAgICBlc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZmFzdF9pbnN0YWxsOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLSAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9idWlsZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKLWFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKLSAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQotY2FzZSAkYWNfY3ZfYnVpbGQgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaG9zdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCi0gIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCi1lbHNlCi0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KLWNhc2UgJGFjX2N2X2hvc3QgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1OzsKLWVzYWMKLWhvc3Q9JGFjX2N2X2hvc3QKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9ob3N0Ci1zaGlmdAotaG9zdF9jcHU9JDEKLWhvc3RfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotaG9zdF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9TRUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KLSMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBmaQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotbHRfYWNfbWF4PTAKLWx0X2FjX2NvdW50PTAKLSMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCi0jIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgotZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCi0gIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCi0gIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgotICBsdF9hY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgotICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgYnJlYWsKLSAgZmkKLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAotICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgotICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCi0gICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCi0gICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKLSAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCi0gICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgotICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAotICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAotICAgIGZpCi0gIGRvbmUKLWRvbmUKLQotZmkKLQotU0VEPSRsdF9jdl9wYXRoX1NFRAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTRUQiID4mNQotJGFzX2VjaG8gIiRTRUQiID4mNjsgfQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCi1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKLSAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KLSBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKLSAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCi0gICBlbHNlCi0gICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfRUdSRVAiIHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKLWNhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgotICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCi1maQotCi0gICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQotIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQotZmkKLWlmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQotJGFzX2VjaG8gIiRMRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXRlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhYwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9sZF9yZWxvYWRfZmxhZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNjsgfQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi1jYXNlICRyZWxvYWRfZmxhZyBpbgotIiIgfCAiICIqKSA7OwotKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Ci1lc2FjCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1jYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBlbHNlCi0gICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZmkKLSAgICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0uLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9OTSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wYXRoX05NIiA+JjY7IH0KLU5NPSIkbHRfY3ZfcGF0aF9OTSIKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gIiA+JjY7IH0KLUxOX1M9JGFzX2xuX3MKLWlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1Ci0kYXNfZWNobyAibm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDQqIHwgYWl4NSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWJlb3MqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ic2RpWzQ1XSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4KLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KLSAgICBjYXNlICRob3N0X2NwdSBpbgotICAgIGkqODYgKQotICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KLSAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCi0gICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGZpCi0gIDs7Ci0KLWdudSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWhwdXgxMC4yMCogfCBocHV4MTEqKQotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCi0gICAgOzsKLSAgaHBwYSo2NCopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xcLmEpJCcKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkTEQgaW4KLSAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKLSAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OwotICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1uZXRic2QqKQotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW5ld29zNiopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KLSAgOzsKLQotbnRvLXFueCopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgOzsKLQotb3BlbmJzZCopCi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc29sYXJpcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gIG1vdG9yb2xhKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICA7OwotICBuY3IpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBzZXF1ZW50KQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgICA7OwotICBzbmkpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgICA7OwotICBzaWVtZW5zKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gICAgOzsKLSAgcGMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotZXNhYwotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KLWZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi10ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLQotCi0KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOwotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgJGhvc3QgaW4KLWlhNjQtKi1ocHV4KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICpFTEYtMzIqKQotICAgICAgSFBVWF9JQTY0X01PREU9IjMyIgotICAgICAgOzsKLSAgICAqRUxGLTY0KikKLSAgICAgIEhQVVhfSUE2NF9NT0RFPSI2NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDUyNDQgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgotICAgICAgOzsKLSAgICBlc2FjCi0gICBlbHNlCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gICBmaQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLXg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfHMzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqMzItYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgotICAgICAgICAgIDs7Ci0gICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCi0gICAgICAgICAgOzsKLSAgICAgICAgczM5MHgtKmxpbnV4KikKLSAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmM2NC0qbGludXgqKQotICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgeDg2XzY0LSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCi0gICAgICAgICAgOzsKLSAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgotICAgICAgICAgIDs7Ci0gICAgICAgIHMzOTAqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCi0gICAgICAgICAgOzsKLSAgICAgICAgc3BhcmMqLSpsaW51eCopCi0gICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLSAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgICBhY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KLSAgICAqNjQtYml0KikKLSAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7Ci0gICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1ETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotICBhY19jdF9ETExUT09MPSRETExUT09MCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKLWlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQotJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCi0gICAgRExMVE9PTD0iZmFsc2UiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAotICBmaQotZWxzZQotICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotZmkKLQotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFTPSRhY19jdl9wcm9nX0FTCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVMiID4mNQotJGFzX2VjaG8gIiRBUyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi0gIGFjX2N0X0FTPSRBUwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVM9IiRhY19jdF9BUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FTPSJhcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUz0kYWNfY3ZfcHJvZ19hY19jdF9BUwotaWYgdGVzdCAtbiAiJGFjX2N0X0FTIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FTIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUyIgPSB4OyB0aGVuCi0gICAgQVM9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFTPSRhY19jdF9BUwotICBmaQotZWxzZQotICBBUz0iJGFjX2N2X3Byb2dfQVMiCi1maQotCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgotICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLU9CSkRVTVA9JGFjX2N2X3Byb2dfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkRVTVAiOyB0aGVuCi0gIGFjX2N0X09CSkRVTVA9JE9CSkRVTVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpkdW1wOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0iJGFjX2N0X09CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X09CSkRVTVA9JGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUAotaWYgdGVzdCAtbiAiJGFjX2N0X09CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQkpEVU1QIiA9IHg7IHRoZW4KLSAgICBPQkpEVU1QPSJmYWxzZSIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpEVU1QPSRhY19jdF9PQkpEVU1QCi0gIGZpCi1lbHNlCi0gIE9CSkRVTVA9IiRhY19jdl9wcm9nX09CSkRVTVAiCi1maQotCi0gIDs7Ci0KLWVzYWMKLQotbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLWZvciBhY19oZWFkZXIgaW4gZGxmY24uaAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfRExGQ05fSCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi1hY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQotaWYgdGVzdCAteiAiJENYWCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJENDQyI7IHRoZW4KLSAgICBDWFg9JENDQwotICBlbHNlCi0gICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQwotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ1hYPSRhY19jdl9wcm9nX0NYWAotaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFgiID4mNQotJGFzX2VjaG8gIiRDWFgiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICBhY19jdF9DWFg9JENYWAotICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQwotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DWFgiID0geDsgdGhlbgotICAgIENYWD0iZysrIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENYWD0kYWNfY3RfQ1hYCi0gIGZpCi1maQotCi0gIGZpCi1maQotIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jeHhfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGlsZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNjsgfQotaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCi0gIEdYWD15ZXMKLWVsc2UKLSAgR1hYPQotZmkKLWFjX3Rlc3RfQ1hYRkxBR1M9JHtDWFhGTEFHUytzZXR9Ci1hY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2N4eF9nKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZwotICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jeHhfZz1ubwotICAgQ1hYRkxBR1M9Ii1nIgotICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKLWVsc2UKLSAgQ1hYRkxBR1M9IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZwotCSBDWFhGTEFHUz0iLWciCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY3h4X2c9eWVzCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ1hYRkxBR1M9JGFjX3NhdmVfQ1hYRkxBR1MKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgIENYWEZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDWFhGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgQ1hYRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENYWEZMQUdTPQotICBmaQotZmkKLWFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLWRlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgJHthbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGFtX191bml2ZXJzYWw9ZmFsc2UKLSAgY2FzZSAiICRkZXBjYyAiIGluICMoCi0gICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7Ci0gICAgIGVzYWMKLQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAotICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycwotICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99Ci0gICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIGdjYykKLSAgICAgICMgVGhpcyBkZXBtb2RlIGNhdXNlcyBhIGNvbXBpbGVyIHJhY2UgaW4gdW5pdmVyc2FsIG1vZGUuCi0gICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQotICAgICAgOzsKLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG1zdmM3IHwgbXN2Yzdtc3lzIHwgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKLSAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCi0gICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKLSAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCi0gICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99Ci0gICAgICBhbV9fbWludXNfb2JqPQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PSRhbV9fb2JqIFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jICRhbV9fbWludXNfb2JqIHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgJGFtX19vYmogc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQotJGFzX2VjaG8gIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQotQ1hYREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKLQotIGlmCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgotICBhbV9fZmFzdGRlcENYWF9UUlVFPQotICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKLWVsc2UKLSAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKLSAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9Ci1maQotCi0KLQotCi1pZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgotICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgotICBhY19leHQ9Y3BwCi1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRDWFhDUFAiOyB0aGVuCi0gIGlmICR7YWNfY3ZfcHJvZ19DWFhDUFArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1hYQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgotICAgIGRvCi0gICAgICBhY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAotCi1maQotICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWENQUCIgPiY1Ci0kYXNfZWNobyAiJENYWENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLQotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi0KLWFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLWZpCi0KLQotYWNfZXh0PWYKLWFjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gZzc3IHhsZiBmNzcgZnJ0IHBnZjc3IGNmNzcgZm9ydDc3IGZsMzIgYWY3NyB4bGY5MCBmOTAgcGdmOTAgcGdocGYgZXBjZjkwIGdmb3J0cmFuIGc5NSB4bGY5NSBmOTUgZm9ydCBpZm9ydCBpZmMgZWZjIHBnZm9ydHJhbiBwZ2Y5NSBsZjk1IGZ0biBuYWdmb3IKLSAgZG8KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEY3NyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19GNzc9IiRGNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19GNzc9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUY3Nz0kYWNfY3ZfcHJvZ19GNzcKLWlmIHRlc3QgLW4gIiRGNzciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRjc3IiA+JjUKLSRhc19lY2hvICIkRjc3IiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkRjc3IiAmJiBicmVhawotICBkb25lCi1maQotaWYgdGVzdCAteiAiJEY3NyI7IHRoZW4KLSAgYWNfY3RfRjc3PSRGNzcKLSAgZm9yIGFjX3Byb2cgaW4gZzc3IHhsZiBmNzcgZnJ0IHBnZjc3IGNmNzcgZm9ydDc3IGZsMzIgYWY3NyB4bGY5MCBmOTAgcGdmOTAgcGdocGYgZXBjZjkwIGdmb3J0cmFuIGc5NSB4bGY5NSBmOTUgZm9ydCBpZm9ydCBpZmMgZWZjIHBnZm9ydHJhbiBwZ2Y5NSBsZjk1IGZ0biBuYWdmb3IKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19hY19jdF9GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfRjc3IjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0Y3Nz0iJGFjX2N0X0Y3NyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0Y3Nz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfRjc3PSRhY19jdl9wcm9nX2FjX2N0X0Y3NwotaWYgdGVzdCAtbiAiJGFjX2N0X0Y3NyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9GNzciID4mNQotJGFzX2VjaG8gIiRhY19jdF9GNzciID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfRjc3IiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfRjc3IiA9IHg7IHRoZW4KLSAgICBGNzc9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBGNzc9JGFjX2N0X0Y3NwotICBmaQotZmkKLQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRm9ydHJhbiA3NyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLXJtIC1mIGEub3V0Ci0KLSMgSWYgd2UgZG9uJ3QgdXNlIGAuRicgYXMgZXh0ZW5zaW9uLCB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBydW4gb24gdGhlCi0jIGlucHV0IGZpbGUuICAoTm90ZSB0aGF0IHRoaXMgb25seSBuZWVkcyB0byB3b3JrIGZvciBHTlUgY29tcGlsZXJzLikKLWFjX3NhdmVfZXh0PSRhY19leHQKLWFjX2V4dD1GCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgRm9ydHJhbiA3NyBjb21waWxlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfZjc3X2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSAgICAgIHByb2dyYW0gbWFpbgotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKLQotICAgICAgZW5kCi1fQUNFT0YKLWlmIGFjX2ZuX2Y3N190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGFjX2NvbXBpbGVyX2dudT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfZjc3X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjY7IH0KLWFjX2V4dD0kYWNfc2F2ZV9leHQKLWFjX3Rlc3RfRkZMQUdTPSR7RkZMQUdTK3NldH0KLWFjX3NhdmVfRkZMQUdTPSRGRkxBR1MKLUZGTEFHUz0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkRjc3IGFjY2VwdHMgLWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkRjc3IGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19mNzdfZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIEZGTEFHUz0tZwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19mNzdfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19mNzdfZz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2Y3N19nIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19mNzdfZyIgPiY2OyB9Ci1pZiB0ZXN0ICIkYWNfdGVzdF9GRkxBR1MiID0gc2V0OyB0aGVuCi0gIEZGTEFHUz0kYWNfc2F2ZV9GRkxBR1MKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19mNzdfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICJ4JGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID0geHllczsgdGhlbgotICAgIEZGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgRkZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KLSAgICBGRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIEZGTEFHUz0KLSAgZmkKLWZpCi0KLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgotICBHNzc9eWVzCi1lbHNlCi0gIEc3Nz0KLWZpCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotCi0jIEF1dG9jb25mIDIuMTMncyBBQ19PQkpFWFQgYW5kIEFDX0VYRUVYVCBtYWNyb3Mgb25seSB3b3JrcyBmb3IgQyBjb21waWxlcnMhCi0KLSMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9zeXNfbWF4X2NtZF9sZW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAgIGk9MAotICB0ZXN0c3RyaW5nPSJBQkNEIgotCi0gIGNhc2UgJGJ1aWxkX29zIGluCi0gIG1zZG9zZGpncHAqKQotICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKLSAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCi0gICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKLSAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0Ci0gICAgOzsKLQotICBnbnUqKQotICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcwotICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcwotICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCi0gICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKLSAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCi0gICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgotICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQotICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7Ci0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCi0gICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKLSAgICA7OwotCi0gIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCi0gICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCi0gICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAotICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCi0gICAgZmkKLSAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKLSAgICA7OwotCi0gIGludGVyaXgqKQotICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKLSAgICA7OwotCi0gIG9zZiopCi0gICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCi0gICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKLSAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgotICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAotICAgICMKLSAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgotICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KLSAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0gIHNjbzMuMnY1KikKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCi0gICAgOzsKLSAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQotICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKlsgCV0vLydgCi0gICAgZWxzZQotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4Ci0gICAgZmkKLSAgICA7OwotICAqKQotICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCi0gICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKLSAgICAjIHdlIGNhbid0IHRlbGwuCi0gICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KLSAgICB3aGlsZSAodGVzdCAiWCJgJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAotCSAgICAgICA9ICJYWCR0ZXN0c3RyaW5nIikgPi9kZXYvbnVsbCAyPiYxICYmCi0JICAgIG5ld19yZXN1bHQ9YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgICYmCi0JICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0kbmV3X3Jlc3VsdCAmJgotCSAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKLSAgICBkbwotICAgICAgaT1gZXhwciAkaSArIDFgCi0gICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKLSAgICBkb25lCi0gICAgdGVzdHN0cmluZz0KLSAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uIG1hc3NpdmUKLSAgICAjIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgbGlua2VyLgotICAgICMgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCi0gICAgOzsKLSAgZXNhYwotCi1maQotCi1pZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKLSRhc19lY2hvICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUiID4mNQotJGFzX2VjaG8gIm5vbmUiID4mNjsgfQotZmkKLQotCi0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJwotICBmaQotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgotICA7OwotbGludXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1vc2YqKQotICBzeW1jb2RlPSdbQkNERUdRUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbQkRSVF0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tEVF0nCi0gIDs7Ci1zeXN2NC4ydXcyKikKLSAgc3ltY29kZT0nW0RUXScKLSAgOzsKLXN5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCi0gIHN5bWNvZGU9J1tBQkRUXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbREZOU1RVXScKLSAgOzsKLWVzYWMKLQotIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCi1vcHRfY3I9Ci1jYXNlICRidWlsZF9vcyBpbgotbWluZ3cqKQotICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1jYXNlIGAkTk0gLVYgMj4mMWAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBzeW1jb2RlPSdbQUJDREdJUlNUV10nIDs7Ci1lc2FjCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLSAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZSRzeW1jb2RlKlwpWyAJXVsgCV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLQotICBybSAtZiBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3RcIiI7IH0gPiY1Ci0gIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LiRhY19leHQKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfbGluaykgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZmkKLQkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBmaQotICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmYWlsZWQiID4mNQotJGFzX2VjaG8gImZhaWxlZCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvayIgPiY1Ci0kYXNfZWNobyAib2siID4mNjsgfQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igb2JqZGlyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3Zfb2JqZGlyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIGx0X2N2X29iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBsdF9jdl9vYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfb2JqZGlyIiA+JjUKLSRhc19lY2hvICIkbHRfY3Zfb2JqZGlyIiA+JjY7IH0KLW9iamRpcj0kbHRfY3Zfb2JqZGlyCi0KLQotCi0KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLQotIyBDb25zdGFudHM6Ci1ybT0icm0gLWYiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLQotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCi0jIHdoaWNoIG5lZWRzICcubGliJykuCi1saWJleHQ9YQotbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCi1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi13aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFSPSRhY19jdl9wcm9nX0FSCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQotJGFzX2VjaG8gIiRBUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCi0gIGFjX2N0X0FSPSRBUgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgotaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCi0gICAgQVI9ImZhbHNlIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIEFSPSRhY19jdF9BUgotICBmaQotZWxzZQotICBBUj0iJGFjX2N2X3Byb2dfQVIiCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQotJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi1pZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0gICAgUkFOTElCPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0gIGZpCi1lbHNlCi0gIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKLSRhc19lY2hvICIkU1RSSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFNUUklQPSRhY19jdF9TVFJJUAotICBmaQotZWxzZQotICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCi1maQotCi0KLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLXRlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Ci10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi10ZXN0IC16ICIkQ0MiICYmIENDPWNjCi10ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKLXRlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJExEIiAmJiBMRD1sZAotdGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgotdGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLXRlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci10ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBjYXNlICRob3N0X29zIGluCi0gIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCi0gICAgOzsKLSAgKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotICAgIDs7Ci0gIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi1maQotCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLSMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGUiCi0gICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkiZmlsZV9tYWdpYyAiKikKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAotCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi0JICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0JICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotCSAgZmkgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKLSAgOzsKLWVzYWMKLWZpCi0KLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQotJGFzX2VjaG8gIiRNQUdJQ19DTUQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLWlmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQUdJQ19DTUQgaW4KLVtcXC8qXSB8ICA/OltcXC9dKikKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0JICBmaSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgotICA7OwotZXNhYwotZmkKLQotTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCi1pZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1Ci0kYXNfZWNobyAiJE1BR0lDX0NNRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBlbHNlCi0gICAgTUFHSUNfQ01EPToKLSAgZmkKLWZpCi0KLSAgZmkKLSAgOzsKLWVzYWMKLQotZW5hYmxlX2Rsb3Blbj1ubwotZW5hYmxlX3dpbjMyX2RsbD15ZXMKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7Ci1maQotCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9waWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3BpYzsgcGljX21vZGU9IiR3aXRodmFsIgotZWxzZQotICBwaWNfbW9kZT1kZWZhdWx0Ci1maQotCi10ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKLQotIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKLXRhZ25hbWU9Ci1sdF9zYXZlX0NDPSIkQ0MiCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dD0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJwotCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi0KLWx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NzY1MTogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTo3NjU1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotZWxzZQotICAgIDoKLWZpCi0KLWZpCi0KLWx0X3Byb2dfY29tcGlsZXJfd2w9Ci1sdF9wcm9nX2NvbXBpbGVyX3BpYz0KLWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWx0X3Byb2dfY29tcGlsZXJfcGljPS1LY29uZm9ybV9waWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICAgIGZpCi0gICAgICA7OwotICAgICAgZGFyd2luKikKLSAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgIHhsYyopCi0gICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFub2NvbW1vbicKLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCi0gICAgICA7OwotCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCWx0X3Byb2dfY29tcGlsZXJfcGljPScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKLSAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NzkxOTogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZTo3OTIzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KLSAgICAgIiIgfCAiICIqKSA7OwotICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQotICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiAke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCi0gICAgICAgZmkKLSAgICAgZWxzZQotICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo4MDIzOiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6ODAyNzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAotICAgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KLQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZz0KLSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubwotICBhcmNoaXZlX2NtZHM9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHM9Ci0gIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9Ci0gIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Ci0gIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0gIGhhcmRjb2RlX2RpcmVjdD1ubwotICBoYXJkY29kZV9taW51c19MPW5vCi0gIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlicz11bmtub3duCi0gIGhhcmRjb2RlX2F1dG9tYXRpYz1ubwotICBtb2R1bGVfY21kcz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzPQotICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltcz0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gIGV4dHJhY3RfZXhwc3ltc19jbWRzPQotICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCi0gIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OwotICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7Ci0gICAgXC0qKSA7OwotICAgICopIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KLSAgICAgIHdpdGhfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICBpbnRlcml4KikKLSAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQotICAgIHdpdGhfZ251X2xkPXllcwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIHdpdGhfZ251X2xkPW5vCi0gICAgOzsKLSAgZXNhYwotCi0gIGxkX3NobGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgZmkKLSAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KLSAgICBjYXNlIGAkTEQgLXYgMj4vZGV2L251bGxgIGluCi0gICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCi0gICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgotICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgotICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKLSAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JbGRfc2hsaWJzPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0KLSAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCi0gICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCi0gICAgICAjIHRoZW0uCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCi0JICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JZWxzZQotCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWZpfgotCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlicz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICA7OwotCi0gICAgbGludXgqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0JcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OwotCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7Ci0JaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKLQkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7Ci0JZXNhYwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCi0Jd2xhcmM9Ci0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotCWxkX3NobGlicz1ubwotCWNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKLSAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgotICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKQotCWxkX3NobGlicz1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKLQkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCi0JICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGxkX3NobGlicz1ubwotCSAgZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIHN1bm9zNCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnM9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0gbm87IHRoZW4KLSAgICAgIHJ1bnBhdGhfdmFyPQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJwotICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCi0JIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0JIyBicm9rZW4gY29sbGVjdDIuCi0JaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeDQqIHwgYWl4NSopCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLQkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLQlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0JZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSIiCi0gICAgICBlbHNlCi0JIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCi0JIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQotCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCi0JZWxzZQotCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgotICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0gIAkgICAgYnJlYWsKLSAgCSAgZmkKLQkgIGRvbmUKLQkgIDs7Ci0JZXNhYwotCi0JZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgICBmaQotCi0gICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICAgIGFyY2hpdmVfY21kcz0nJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLSAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLSAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLQkgIGVsc2UKLSAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLSAgCSAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXNoYXJlZF9mbGFnPSctc2hhcmVkJwotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0JZmkKLSAgICAgIGVsc2UKLQkjIG5vdCB1c2luZyBnY2MKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLSAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCi0gICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJwotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KLSAgICAgIGxkX3NobGlicz1ubwotICAgICAgOzsKLQotICAgIGJzZGlbNDVdKikKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSd0cnVlJwotICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQotICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgIDEwLiopCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJwotICAgICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICA7OwotICAgICAgICopCi0gICAgICAgICBsZF9zaGxpYnM9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gICAgZnJlZWJzZDIqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgICAgOzsKLQotICAgIGhwdXgxMCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLQotCWhhcmRjb2RlX2RpcmVjdD15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0KLQkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCWhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JKikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCp8aWE2NCopCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPScrYiAkbGliZGlyJwotCSAgaGFyZGNvZGVfZGlyZWN0PW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JICA7OwotCSopCi0JICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJwotCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLQkgICA7OwotCSAqKQotCSAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0gICAgICBlbHNlCi0Jd2xhcmM9JycKLQlhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7Ci0gCWVzYWMgOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/Ci0JOzsKLQlzaWVtZW5zKQotCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCi0JICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCi0JICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICAgICAgOzsKLQltb3Rvcm9sYSkKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0LjMqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnM9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqKQotICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosbm9kZWZzJwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCi0gICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGMiIGluCi14fHh5ZXMpCi0gICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKLSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsCi0JcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICAgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KLSAgICAgICAgZWxzZQotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQotJGFzX2VjaG8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotc3RyaXBsaWI9Ci1vbGRfc3RyaXBsaWI9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KLSAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKLSAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0jIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgZGFyd2luKikKLSAgICAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgotICAgICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKLSAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gICAgICAgZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0gICAgICAgOzsKLSAgICopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBtaW5ndyogfCBwdzMyKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBjeWd3aW4qKQotICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgOzsKLQotICBkYXJ3aW4qKQotICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0KLSAgICBsdF9jdl9kbG9wZW49ImR5bGQiCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0KLWZpCi0KLSAgIDs7Ci0KLSAgKikKLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaGxfbG9hZCIgImFjX2N2X2Z1bmNfc2hsX2xvYWQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxkX3NobF9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHNobF9sb2FkICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2hsX2xvYWQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgotZWxzZQotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJkbG9wZW4iICJhY19jdl9mdW5jX2Rsb3BlbiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19kbG9wZW4iID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2RsX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsb3BlbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRsb3BlbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZGxfZGxvcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfZGxfZGxvcGVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zdmxkX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc3ZsZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxvcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zdmxkX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGxkX2RsZF9saW5rKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsZF9saW5rICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxkX2xpbmsgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID0geHllczsgdGhlbiA6Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgotZmkKLQotCi1maQotCi0KLWZpCi0KLQotZmkKLQotCi1maQotCi0KLWZpCi0KLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0KLSAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQotICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAotI2Vsc2UKLSMgIGlmZGVmIERMX0dMT0JBTAotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAotIyAgZWxzZQotIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCi0jICBpZmRlZiBSVExEX0xBWlkKLSMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQotIyAgZWxzZQotIyAgICBpZmRlZiBETF9MQVpZCi0jICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFJUTERfTk9XCi0jICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmZGVmIERMX05PVwotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOwotI2VuZGlmCi0KLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KLWludCBtYWluICgpCi17Ci0gIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOwotICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKLQotICBpZiAoc2VsZikKLSAgICB7Ci0gICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7Ci0gICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRzIChkbGVycm9yICgpKTsKLQotICAgIGV4aXQgKHN0YXR1cyk7Ci19Ci1FT0YKLSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7Ci0gICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OwotICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7Ci0gICAgZXNhYwotICBlbHNlIDoKLSAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi0gIGZpCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQotCi0gICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCi0gICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLWVsc2UKLSAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgotICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKLSNlbHNlCi0jICBpZmRlZiBETF9HTE9CQUwKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKLSMgIGVsc2UKLSMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRfRExMQVpZX09SX05PVwotIyAgaWZkZWYgUlRMRF9MQVpZCi0jICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKLSMgIGVsc2UKLSMgICAgaWZkZWYgRExfTEFaWQotIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCi0jICAgIGVsc2UKLSMgICAgICBpZmRlZiBSVExEX05PVwotIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICAgICBlbHNlCi0jICAgICAgICBpZmRlZiBETF9OT1cKLSMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKLSNlbmRpZgotCi12b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9Ci1pbnQgbWFpbiAoKQotewotICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKLSAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247Ci0KLSAgaWYgKHNlbGYpCi0gICAgewotICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOwotICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCi0gICAgfQotICBlbHNlCi0gICAgcHV0cyAoZGxlcnJvciAoKSk7Ci0KLSAgICBleGl0IChzdGF0dXMpOwotfQotRU9GCi0gIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfbGluaykgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAotICAgIGx0X3N0YXR1cz0kPwotICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KLSAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OwotICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubyA7OwotICAgIGVzYWMKLSAgZWxzZSA6Ci0gICAgIyBjb21waWxhdGlvbiBmYWlsZWQKLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLSAgZmkKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjUKLSRhc19lY2hvICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjY7IH0KLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi0KLQotIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1Ci0kYXNfZWNobyAiJGNhbl9idWlsZF9zaGFyZWQiID4mNjsgfQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICAgIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQotJGFzX2VjaG8gIiRlbmFibGVfc2hhcmVkIiA+JjY7IH0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9Ci0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlciBcCi0gICAgQ0MgXAotICAgIExEIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIFwKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAotICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMgXAotICAgIG9sZF9hcmNoaXZlX2NtZHMgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAotICAgIHByZWRlcF9vYmplY3RzIFwKLSAgICBwb3N0ZGVwX29iamVjdHMgXAotICAgIHByZWRlcHMgXAotICAgIHBvc3RkZXBzIFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGggXAotICAgIGFyY2hpdmVfY21kcyBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcyBcCi0gICAgcG9zdGluc3RhbGxfY21kcyBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIFwKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWMgXAotICAgIG1vZHVsZV9jbWRzIFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHMgXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIFwKLSAgICBleGNsdWRlX2V4cHN5bXMgXAotICAgIGluY2x1ZGVfZXhwc3ltczsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHMgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBhcmNoaXZlX2NtZHMgfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKLSAgICBtb2R1bGVfY21kcyB8IFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHMgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IFwKLSAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXNlICRsdF9lY2hvIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLWNmZ2ZpbGU9IiR7b2ZpbGV9VCIKLSAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgJHJtIC1mICIkY2ZnZmlsZSIKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkb2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJG9maWxlIiA+JjY7fQotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbDoKLSMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgotU0VEPSRsdF9TRUQKLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotIyBUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCi1hdmFpbGFibGVfdGFncz0KLQotIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXIKLQotIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPwotd2l0aF9nY2M9JEdDQwotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRAotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2wKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kcwotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHMKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYwotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpYwotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicwotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLWV4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCi1leGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltcwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zCi0KLSMgIyMjIEVORCBMSUJUT09MIENPTkZJRwotCi1fX0VPRl9fCi0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRjZmdmaWxlIgotCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotRU9GCi0gICAgOzsKLSAgZXNhYwotCi0gICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgotICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCi0gICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCi0gICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/Ci0gIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fCBcCi0gICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKLSAgY2htb2QgK3ggIiRvZmlsZSIKLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC10YWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90YWdzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF90YWdzOyB0YWduYW1lcz0iJHdpdGh2YWwiCi1maQotCi0KLWlmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KLSAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBleGlzdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mMjt9Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCi0gICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENDPSdgIgotICAgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgbG9vayBsaWtlIGEgbGlidG9vbCBzY3JpcHQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjI7fQotICAgIGVsc2UKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgXGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gXGAkb2ZpbGUnIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiYyO30KLSAgICBmaQotICBmaQotICBpZiB0ZXN0IC16ICIkTFRDRkxBR1MiOyB0aGVuCi0gICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENGTEFHUz0nYCIKLSAgZmkKLQotICAjIEV4dHJhY3QgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIGluICRvZmlsZS4KLSAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBlbnRpcmUgbGlzdCBpcyBvbiBvbmUgbGluZS4KLSAgYXZhaWxhYmxlX3RhZ3M9YGdyZXAgIl5hdmFpbGFibGVfdGFncz0iICIke29maWxlfSIgfCAkU0VEIC1lICdzL2F2YWlsYWJsZV90YWdzPVwoLiokXCkvXDEvJyAtZSAncy9cIi8vZydgCi0KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCi0gIGZvciB0YWduYW1lIGluICR0YWduYW1lczsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKLSAgICBjYXNlIGAkZWNobyAiWCR0YWduYW1lIiB8ICRYc2VkIC1lICdzOlstX0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwLC9dOjpnJ2AgaW4KLSAgICAiIikgOzsKLSAgICAqKSAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiAiJExJTkVOTyIgNQotCTs7Ci0gICAgZXNhYwotCi0gICAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIke29maWxlfSIgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgICBhc19mbl9lcnJvciAkPyAidGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzIiAiJExJTkVOTyIgNQotICAgIGZpCi0KLSAgICAjIFVwZGF0ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KLSAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIGVjaG8gYXBwZW5kaW5nIGNvbmZpZ3VyYXRpb24gdGFnIFwiJHRhZ25hbWVcIiB0byAkb2ZpbGUKLQotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgQ1hYKQotCWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCi0JICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAotCSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KLQkgIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLQotCi0KLWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubwotYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQotaGFyZGNvZGVfZGlyZWN0X0NYWD1ubwotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQotaGFyZGNvZGVfbWludXNfTF9DWFg9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCi1oYXJkY29kZV9hdXRvbWF0aWNfQ1hYPW5vCi1tb2R1bGVfY21kc19DWFg9Ci1tb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPQotbGlua19hbGxfZGVwbGlic19DWFg9dW5rbm93bgotb2xkX2FyY2hpdmVfY21kc19DWFg9JG9sZF9hcmNoaXZlX2NtZHMKLW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KLWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPW5vCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6Ci1wcmVkZXBfb2JqZWN0c19DWFg9Ci1wb3N0ZGVwX29iamVjdHNfQ1hYPQotcHJlZGVwc19DWFg9Ci1wb3N0ZGVwc19DWFg9Ci1jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1jcHAKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotb2JqZXh0X0NYWD0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbXSkgeyByZXR1cm4oMCk7IH1cbicKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSRDQwotbHRfc2F2ZV9MRD0kTEQKLWx0X3NhdmVfR0NDPSRHQ0MKLUdDQz0kR1hYCi1sdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAotbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECi1pZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCi0gIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKLWZpCi1pZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KLSAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAotZWxzZQotICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAotZmkKLXRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCi1DQz0ke0NYWC0iYysrIn0KLWNvbXBpbGVyPSRDQwotY29tcGlsZXJfQ1hYPSRDQwotZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotCi0jIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQotIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQotaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPScgLWZuby1idWlsdGluJwotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9Ci1maQotCi1pZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9Ci0gIGNhc2UgJGhvc3QgaW4KLSAgKi0qLW1pbmd3KikKLSAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OwotICAqKQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKLSAgZXNhYwotICBjYXNlICRhY19wcm9nIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgPzpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQotZmkKLWlmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQk7OwotICAgICAgKikKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLWVsc2UKLSAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGx0X2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQotJGFzX2VjaG8gIiRMRCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXRlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KLWNhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCi0qR05VKiB8ICond2l0aCBCRkQnKikKLSAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCi0gIDs7Ci0qKQotICBsdF9jdl9wcm9nX2dudV9sZD1ubwotICA7OwotZXNhYwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Ci13aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKLQotCi0KLSAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCi0gICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLSAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KLSAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQotICAgIHdsYXJjPScke3dsfScKLQotICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKLQlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgIGVsc2UKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KLSAgICBmaQotICBlbHNlCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICB3bGFyYz0KLQotICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCi0gICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKLSAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAotICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgotICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJwotICBmaQotCi0gICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0gICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi1lbHNlCi0gIEdYWD1ubwotICB3aXRoX2dudV9sZD1ubwotICB3bGFyYz0KLWZpCi0KLSMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotbGRfc2hsaWJzX0NYWD15ZXMKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIGFpeDQqIHwgYWl4NSopCi0gICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKLSAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgotICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKLSAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKLSAgICBlbHNlCi0gICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCi0KLSAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAotICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCi0JZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCi0JICBjYXNlICRsZF9mbGFnIGluCi0JICAqLWJydGwqKQotCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcwotCSAgICBicmVhawotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgIGZpCi0KLSAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgYXJjaGl2ZV9jbWRzX0NYWD0nJwotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCi0gICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0KLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKLSAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjawotICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKLQkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JdGhlbgotCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcwotCWVsc2UKLQkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKLQkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCi0JICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLQkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcwotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKLQkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0Jc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0Jc2hhcmVkX2ZsYWc9Jy1HJwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCi0JZWxzZQotCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPXllcwotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKLSAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgIGVsc2UKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotICAgICAgZWxzZQotCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLWFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQotfSdgOyBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCi0JIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm5vdG9rJwotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJwotCSMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJGNvbnZlbmllbmNlJwotCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKLQkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICBmaQotICAgIGZpCi0gICAgOzsKLQotICBiZW9zKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAotICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlic19DWFg9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY2hvcnVzKikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIENYWCkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLUwkbGliZGlyJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKLQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQotICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgIGVsc2UKLQllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotICAgICAgZml+Ci0gICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIGZpCi0gIDs7Ci0gICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLlswMTJdKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0KLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyA7IHRoZW4KLSAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgIGlmICRDQyAtZHVtcHNwZWNzIDI+JjEgfCAkRUdSRVAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCi0gICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgotICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJwotICAgICAgZWxzZQotICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICAgIGZpCi0gICAgICAgIG1vZHVsZV9jbWRzX0NYWD0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgotICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIGZpCi0gICAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICBlbHNlCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICB4bGMqKQotICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKLSAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICA7OwotICAgICAgICopCi0gICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGZpCi0gICAgICAgIDs7Ci0KLSAgZGd1eCopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGVjKysqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgZ2hjeCopCi0JIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGZyZWVic2RbMTJdKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgZnJlZWJzZC1lbGYqKQotICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubwotICAgIDs7Ci0gIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0gICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKLSAgICAjIGNvbnZlbnRpb25zCi0gICAgbGRfc2hsaWJzX0NYWD15ZXMKLSAgICA7OwotICBnbnUqKQotICAgIDs7Ci0gIGhwdXg5KikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgQ0MqKQotICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgICA7OwotICAgIGFDQyopCi0gICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAjCi0gICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0gICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotICAgICAgIyBkZXBlbmRlbmNpZXMuCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiWy1dTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgICAgbGRfc2hsaWJzX0NYWD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGhwdXgxMCp8aHB1eDExKikKLSAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0nK2IgJGxpYmRpcicKLSAgICAgICAgOzsKLSAgICAgICopCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgaHBwYSo2NCp8aWE2NCopCi0gICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgICAgOzsKLSAgICAqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JCQkJCSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJCSAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBhQ0MqKQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCi0JICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgIGhwcGEqNjQqKQotCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICBpYTY0KikKLQkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCWVsc2UKLQkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgbGRfc2hsaWJzX0NYWD1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgaW50ZXJpeDMqKQotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCi0gICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLSAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLSAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotICAgIDs7Ci0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCSMgU0dJIEMrKwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQotCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcwotCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSMgaW4gdGhlIGFyY2hpdmUuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotCSAgZmkKLQlmaQotCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotCTs7Ci0gICAgZXNhYwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotICAgIDs7Ci0gIGxpbnV4KikKLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgS0NDKikKLQkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQotCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgZ3JlcCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQk7OwotICAgICAgaWNwYyopCi0JIyBJbnRlbCBDKysKLQl3aXRoX2dudV9sZD15ZXMKLQkjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scwotCSMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCi0JIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KLQljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KLQkqIlZlcnNpb24gNy4iKikKLSAgCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gIAkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgIDs7Ci0JKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKLQkgIHRtcF9pZHluPQotCSAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OwotCSAgZXNhYwotICAJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgOzsKLQllc2FjCi0JYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JOzsKLSAgICAgIHBnQ0MqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJwotICAJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICAgIDs7Ci0gICAgICBjeHgqKQotCSMgQ29tcGFxIEMrKwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCi0KLQlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctcnBhdGggJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGx5bnhvcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIG04OGsqKQotICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgIGxkX3NobGlic19DWFg9bm8KLSAgICA7OwotICBtdnMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBjeHgqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgICAgKikKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubwotICAgIGZpCi0gICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucwotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJwotICAgIDs7Ci0gIG9wZW5ic2QyKikKLSAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCi0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIG9wZW5ic2QqKQotICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0gICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICBmaQotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgIDs7Ci0gIG9zZjMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQotCTs7Ci0gICAgICBSQ0MqKQotCSMgUmF0aW9uYWwgQysrIDIuNC4xCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBjeHgqKQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJwotCi0JZWxzZQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBsZF9zaGxpYnNfQ1hYPW5vCi0JZmkKLQk7OwotICAgIGVzYWMKLSAgICA7OwotICBvc2Y0KiB8IG9zZjUqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBLQ0MqKQotCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKLQkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJwotCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JIyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnCi0JOzsKLSAgICAgIFJDQyopCi0JIyBSYXRpb25hbCBDKysgMi40LjEKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgIGN4eCopCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+Ci0JICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAtV2wsLWlucHV0IC1XbCwkbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uCSR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KLQkgICRybSAkbGliLmV4cCcKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctcnBhdGggJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06Ci0KLQkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JIwotCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkjIGRlcGVuZGVuY2llcy4KLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JwotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQkgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgotCi0JICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKLQotCWVsc2UKLQkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgbGRfc2hsaWJzX0NYWD1ubwotCWZpCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgcHNvcyopCi0gICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgbGRfc2hsaWJzX0NYWD1ubwotICAgIDs7Ci0gIHN1bm9zNCopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIENDKikKLQkjIFN1biBDKysgNC54Ci0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICBsY2MqKQotCSMgTHVjaWQKLQkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQlsZF9zaGxpYnNfQ1hYPW5vCi0JOzsKLSAgICAgICopCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHNvbGFyaXMqKQotICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBDQyopCi0JIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwotICAgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCi0Jbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJwotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCi0JaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLQljYXNlICRob3N0X29zIGluCi0JICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7Ci0JICAqKQotCSAgICAjIFRoZSBDKysgY29tcGlsZXIgaXMgdXNlZCBhcyBsaW5rZXIgc28gd2UgbXVzdCB1c2UgJHdsCi0JICAgICMgZmxhZyB0byBwYXNzIHRoZSBjb21tYW5kcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0KLQkgICAgIyBsaW5rZXIuIFdlIG11c3QgYWxzbyBwYXNzIGVhY2ggY29udmllbmNlIGxpYnJhcnkgdGhyb3VnaAotCSAgICAjIHRvIHRoZSBzeXN0ZW0gbGlua2VyIGJldHdlZW4gYWxsZXh0cmFjdC9kZWZhdWx0ZXh0cmFjdC4KLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotCSAgICAjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLQkgICAgIyB3aXRob3V0ICR3bC4KLQkgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLQkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCi0JICAgIDs7Ci0JZXNhYwotCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcwotCi0Jb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0KLQkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKLQkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKLQkjIGluIHRoZSBhcmNoaXZlLgotCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICBnY3gqKQotCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCi0JIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCi0Jb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJwotCTs7Ci0gICAgICAqKQotCSMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCi0JaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS16ICR7d2x9ZGVmcycKLQkgIGlmICRDQyAtLXZlcnNpb24gfCBncmVwIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCQkkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCi0KLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKLQkgIGVsc2UKLQkgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcwotCSAgICAjIHBsYXRmb3JtLgotCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCQkkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgotCSAgZmkKLQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJHdsJGxpYmRpcicKLQlmaQotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCi0gICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICAgICopCi0JYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKLSAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKLSAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgIyBhcyAteiBkZWZzLgotICAgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKLSAgICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQotICAgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCi0gICAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KLSAgICAjIFNvIHRoYXQgYmVoYXZpb3VyIGlzIG9ubHkgZW5hYmxlZCBpZiBTQ09BQlNQQVRIIGlzIHNldCB0byBhCi0gICAgIyBub24tZW1wdHkgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50LiAgTW9zdCBsaWtlbHkgb25seSB1c2VmdWwgZm9yCi0gICAgIyBjcmVhdGluZyBvZmZpY2lhbCBkaXN0cmlidXRpb25zIG9mIHBhY2thZ2VzLgotICAgICMgVGhpcyBpcyBhIGhhY2sgdW50aWwgbGlidG9vbCBvZmZpY2lhbGx5IHN1cHBvcnRzIGFic29sdXRlIHBhdGgKLSAgICAjIG5hbWVzIGZvciBzaGFyZWQgbGlicmFyaWVzLgotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teixub2RlZnMnCi0gICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCi0gICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tQmV4cG9ydCcKLSAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0KLSAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgQ0MqKQotCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQk7OwotICAgICAgKikKLQlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCTs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIHRhbmRlbSopCi0gICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIE5DQyopCi0JIyBOb25TdG9wLVVYIE5DQyAzLjIwCi0JIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JbGRfc2hsaWJzX0NYWD1ubwotCTs7Ci0gICAgICAqKQotCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCWxkX3NobGlic19DWFg9bm8KLQk7OwotICAgIGVzYWMKLSAgICA7OwotICB2eHdvcmtzKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLSAgKikKLSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICBsZF9zaGxpYnNfQ1hYPW5vCi0gICAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19DWFgiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi1HQ0NfQ1hYPSIkR1hYIgotTERfQ1hYPSIkTEQiCi0KLSMjIENBVkVBVCBFTVBUT1I6Ci0jIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi1jbGFzcyBGb28KLXsKLXB1YmxpYzoKLSAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Ci1wcml2YXRlOgotICBpbnQgYTsKLX07Ci1FT0YKLQotaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQotICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KLQotICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCi0gICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgotICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCi0KLSAgIyBUaGUgYConIGluIHRoZSBjYXNlIG1hdGNoZXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYGNhc2UnIGluCi0gICMgJG91dHB1dF92ZXJib3NlX2NtZCBjYW4gdHJpZ2dlciBnbG9iIGV4cGFuc2lvbiBkdXJpbmcgdGhlIGxvb3AKLSAgIyBldmFsIHdpdGhvdXQgdGhpcyBzdWJzdGl0dXRpb24uCi0gIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWAkZWNobyAiWCRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCIgfCAkWHNlZCAtZSAiJG5vX2dsb2Jfc3Vic3QiYAotCi0gIGZvciBwIGluIGBldmFsICRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZGA7IGRvCi0gICAgY2FzZSAkcCBpbgotCi0gICAgLUwqIHwgLVIqIHwgLWwqKQotICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCi0gICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgotICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIFwKLQkgIHx8IHRlc3QgJHAgPSAiLVIiOyB0aGVuCi0JIHByZXY9JHAKLQkgY29udGludWUKLSAgICAgICBlbHNlCi0JIHByZXY9Ci0gICAgICAgZmkKLQotICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCi0JIGNhc2UgJHAgaW4KLQkgLUwqIHwgLVIqKQotCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQotCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQotCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgotCSAgIGlmIHRlc3QgLXogIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIjsgdGhlbgotCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtwcmV2fSR7cH0iCi0JICAgZWxzZQotCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSAke3ByZXZ9JHtwfSIKLQkgICBmaQotCSAgIDs7Ci0JICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCi0JICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgotCSBlc2FjCi0gICAgICAgZWxzZQotCSBpZiB0ZXN0IC16ICIkcG9zdGRlcHNfQ1hYIjsgdGhlbgotCSAgIHBvc3RkZXBzX0NYWD0iJHtwcmV2fSR7cH0iCi0JIGVsc2UKLQkgICBwb3N0ZGVwc19DWFg9IiR7cG9zdGRlcHNfQ1hYfSAke3ByZXZ9JHtwfSIKLQkgZmkKLSAgICAgICBmaQotICAgICAgIDs7Ci0KLSAgICAqLiRvYmpleHQpCi0gICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCi0gICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCi0gICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCi0JIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCi0JIGNvbnRpbnVlCi0gICAgICAgZmkKLQotICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCi0JIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCi0JICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKLQkgZWxzZQotCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKLQkgZmkKLSAgICAgICBlbHNlCi0JIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgotCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgotCSBlbHNlCi0JICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCi0JIGZpCi0gICAgICAgZmkKLSAgICAgICA7OwotCi0gICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCi0KLSAgICBlc2FjCi0gIGRvbmUKLQotICAjIENsZWFuIHVwLgotICBybSAtZiBhLm91dCBhLmV4ZQotZWxzZQotICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKLWZpCi0KLSRybSAtZiBjb25mZXN0LiRvYmpleHQKLQotIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KLWNhc2UgJGhvc3Rfb3MgaW4KLWludGVyaXgzKikKLSAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgotICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgotICBwcmVkZXBfb2JqZWN0c19DWFg9Ci0gIHBvc3RkZXBfb2JqZWN0c19DWFg9Ci0gIHBvc3RkZXBzX0NYWD0KLSAgOzsKLQotc29sYXJpcyopCi0gIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gIENDKikKLSAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgotICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKLSAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgotICAgIHBvc3RkZXBzX0NYWD0nLWxDc3RkIC1sQ3J1bicKLSAgICA7OwotICBlc2FjCi0gIDs7Ci1lc2FjCi0KLQotY2FzZSAiICRwb3N0ZGVwc19DWFggIiBpbgotKiIgLWxjICIqKSBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8gOzsKLWVzYWMKLQotbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Ci1sdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Ci1sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gIiA+JjY7IH0KLQotICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCi0gIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotICAgIGJlb3MqIHwgY3lnd2luKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0gICAgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLURETExfRVhQT1JUJwotICAgICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0gICAgKmRqZ3BwKikKLSAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotICAgICAgOzsKLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0KiB8IGFpeDUqKQotCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JZWxzZQotCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0JZmkKLQk7OwotICAgICAgY2hvcnVzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCWN4Y2g2OCopCi0JICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgIyBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCBDWFgpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgIGRhcndpbiopCi0gICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCi0gICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgICB4bGMqKQotICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1xbm9jb21tb24nCi0gICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotICAgICAgICAgICA7OwotICAgICAgICAgZXNhYwotICAgICAgIDs7Ci0gICAgICBkZ3V4KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZWMrKyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIDs7Ci0JICBnaGN4KikKLQkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCi0JIyBGcmVlQlNEIHVzZXMgR05VIEMrKwotCTs7Ci0gICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLQkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKLQkgICAgZmkKLQkgICAgOzsKLQkgIGFDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotCSAgICBjYXNlICRob3N0X2NwdSBpbgotCSAgICBocHBhKjY0KnxpYTY0KikKLQkgICAgICAjICtaIHRoZSBkZWZhdWx0Ci0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBpbnRlcml4KikKLQkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKLQkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/Ci0JOzsKLSAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCi0JICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgbGludXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBLQ0MqKQotCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJwotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJwotCSAgICA7OwotCSAgaWNwYyogfCBlY3BjKikKLQkgICAgIyBJbnRlbCBDKysKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKLQkgICAgOzsKLQkgIHBnQ0MqKQotCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlci4KLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZwaWMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JICBjeHgqKQotCSAgICAjIENvbXBhcSBDKysKLQkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQotCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBseW54b3MqKQotCTs7Ci0gICAgICBtODhrKikKLQk7OwotICAgICAgbXZzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgY3h4KikKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBuZXRic2QqKQotCTs7Ci0gICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKLQkgICAgOzsKLQkgIFJDQyopCi0JICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgRGlnaXRhbC9Db21wYXEgQysrCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHBzb3MqKQotCTs7Ci0gICAgICBzb2xhcmlzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctUW9wdGlvbiBsZCAnCi0JICAgIDs7Ci0JICBnY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1QSUMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3Vub3M0KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICAjIFN1biBDKysgNC54Ci0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKLQkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGxjYyopCi0JICAgICMgTHVjaWQKLQkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHRhbmRlbSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIE5DQyopCi0JICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCi0JICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICB2eHdvcmtzKikKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfQ1hYPW5vCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjY7IH0KLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KLSAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTIzNzI6ICRsdF9jb21waWxlXCIiID4mNSkKLSAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6MTIzNzY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNjsgfQotCi1pZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCi0gICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKLSAgICAgZXNhYwotZWxzZQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KLSAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubwotZmkKLQotZmkKLWNhc2UgJGhvc3Rfb3MgaW4KLSAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6Ci0gICpkamdwcCopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQotICAgIDs7Ci0gICopCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgotICAgIDs7Ci1lc2FjCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLXdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFhcIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAiID4mNjsgfQotaWYgJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9bm8KLSAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgotICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKLSAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcwotICAgICAgIGZpCi0gICAgIGVsc2UKLSAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJHJtIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID0geHllczsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubwotICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0gICBta2RpciBjb25mdGVzdAotICAgY2QgY29uZnRlc3QKLSAgIG1rZGlyIG91dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjEyNDc2OiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6MTI0ODA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcwotICAgICBmaQotICAgZmkKLSAgIGNobW9kIHUrdyAuIDI+JjUKLSAgICRybSBjb25mdGVzdCoKLSAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKLSAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgotICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcwotICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAotICAgY2QgLi4KLSAgIHJtZGlyIGNvbmZ0ZXN0Ci0gICAkcm0gY29uZnRlc3QqCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2OyB9Ci0KLQotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQotJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci0KLSAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXg0KiB8IGFpeDUqKQotICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLSAgICBpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLSAgICBlbHNlCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGZpCi0gICAgOzsKLSAgcHczMiopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9IiRsdGRsbF9jbWRzIgotICA7OwotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvOy9eLiogX19ubV9fL3MvXi4qIF9fbm1fX1woW14gXSpcKSBbXiBdKi9cMSBEQVRBLzsvXkkgL2Q7L15bQUlUV10gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIDs7Ci0gICopCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQotJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KLXRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIwotIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPwotIwotY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCi14fHh5ZXMpCi0gICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKLSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KLSAgICAqJ34nKikKLSAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KLSAgICAgIDs7Ci0gICAgJyRDQyAnKikKLSAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKLSAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYwotICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYCi0JcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWAotICAgICAgICBjb21waWxlcl9mbGFncz0tdgotICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKLSAgICAgICAgdmVyc3RyaW5nPQotICAgICAgICBvdXRwdXRfb2JqZGlyPS4KLSAgICAgICAgbGlibmFtZT1jb25mdGVzdAotICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQotICAgICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQotICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICAgICAgICB0aGVuCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KLSAgICAgICAgZWxzZQotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcwotICAgICAgICBmaQotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNQotJGFzX2VjaG8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNjsgfQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotc2hyZXh0X2NtZHM9Ii5zbyIKLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCi0gICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCi0gICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCi0gICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICBmaQotZWxzZQotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotbmVlZF92ZXJzaW9uPXVua25vd24KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICA7OwotCi1haXg0KiB8IGFpeDUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0gICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZWxzZQotICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKLSAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCi0gICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bwotICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCi0gICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCi0gICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJwotCSAgIGVjaG8gJyB5ZXMgJwotCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBmaQotICAgIHNobGlicGF0aF92YXI9TElCUEFUSAotICBmaQotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGlbNDVdKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJwotICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KLSAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KLSAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgotICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgotICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KLSAgICAgICAkcm0gXCRkbHBhdGgnCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiopCi0gICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgICAgIDs7Ci0gICAgbWluZ3cqKQotICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5Ci0gICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKLSAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQotICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCi0gICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKLSAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gICAgICBlbHNlCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgICAgIGZpCi0gICAgICA7OwotICAgIHB3MzIqKQotICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotCi0gICopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCi0gICAgOzsKLSAgZXNhYwotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KLSAgc2hsaWJwYXRoX3Zhcj1QQVRICi0gIDs7Ci0KLWRhcndpbiogfCByaGFwc29keSopCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgotICB2ZXJzaW9uX3R5cGU9ZGFyd2luCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKLSAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi1rZnJlZWJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1mcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKLSAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCi0gIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0gICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCi0gIGVsc2UKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKLSAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7Ci0gICAgZXNhYwotICBmaQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZnJlZWJzZDIqKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAotICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIHNocmV4dF9jbWRzPScuc28nCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgotICAgIGVsc2UKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKLSAgICBmaQotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICA7OwotICAgaHBwYSo2NCopCi0gICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICi0gICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKLSAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgICA7OwotICAgKikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIDs7Ci0gIGVzYWMKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pbnRlcml4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopCi0JaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotCQl2ZXJzaW9uX3R5cGU9bGludXgKLQllbHNlCi0JCXZlcnNpb25fdHlwZT1pcml4Ci0JZmkgOzsKLSAgZXNhYwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KLSAgICA7OwotICAqKQotICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQotICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCi0gICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKLSAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCi0gICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAotICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0KLSAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKLSAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQota25ldGJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLW5ld3NvczYpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1udG8tcW54KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7Ci0gICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OwotICBlc2FjCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0JOzsKLSAgICAgICopCi0Jc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotCTs7Ci0gICAgICBlc2FjCi0gIGVsc2UKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGZpCi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X3ZlbmRvciBpbgotICAgIHNuaSkKLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKLSAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgICA7OwotICAgIHNpZW1lbnMpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc2NvMy4ydjUqKQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1Ci0kYXNfZWNobyAiJGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KLWhhcmRjb2RlX2FjdGlvbl9DWFg9Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9DWFgiIHx8IFwKLSAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0NYWCIgPSAiWHllcyIgOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0NYWCIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgQ1hYKSIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiAhPSBubzsgdGhlbgotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uX0NYWD11bnN1cHBvcnRlZAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY1Ci0kYXNfZWNobyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID4mNjsgfQotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLQotIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCi0jIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAotIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCi0jIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KLWlmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCi0gICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAotICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi0gIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLSAgZmkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZwotICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKLSAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgotICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCi0gICAgU0VEIFNIRUxMIFNUUklQIFwKLSAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKLSAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGNvbXBpbGVyX0NYWCBcCi0gICAgQ0NfQ1hYIFwKLSAgICBMRF9DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAotICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWCBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYIFwKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYIFwKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFggXAotICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggXAotICAgIHByZWRlcF9vYmplY3RzX0NYWCBcCi0gICAgcG9zdGRlcF9vYmplY3RzX0NYWCBcCi0gICAgcHJlZGVwc19DWFggXAotICAgIHBvc3RkZXBzX0NYWCBcCi0gICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCBcCi0gICAgYXJjaGl2ZV9jbWRzX0NYWCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggXAotICAgIHBvc3RpbnN0YWxsX2NtZHNfQ1hYIFwKLSAgICBwb3N0dW5pbnN0YWxsX2NtZHNfQ1hYIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWCBcCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFggXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYIFwKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCBcCi0gICAgaGFyZGNvZGVfYXV0b21hdGljX0NYWCBcCi0gICAgbW9kdWxlX2NtZHNfQ1hYIFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIFwKLSAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFggXAotICAgIGV4Y2x1ZGVfZXhwc3ltc19DWFggXAotICAgIGluY2x1ZGVfZXhwc3ltc19DWFg7IGRvCi0KLSAgICBjYXNlICR2YXIgaW4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWCB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCB8IFwKLSAgICBhcmNoaXZlX2NtZHNfQ1hYIHwgXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIHwgXAotICAgIG1vZHVsZV9jbWRzX0NYWCB8IFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWCB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWCB8IFwKLSAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXNlICRsdF9lY2hvIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLWNmZ2ZpbGU9IiRvZmlsZSIKLQotICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLWhvc3Rfb3M9JGhvc3Rfb3MKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi1idWlsZD0kYnVpbGQKLWJ1aWxkX29zPSRidWlsZF9vcwotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0X2VjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kbHRfQVIKLUFSX0ZMQUdTPSRsdF9BUl9GTEFHUwotCi0jIEEgQyBjb21waWxlci4KLUxUQ0M9JGx0X0xUQ0MKLQotIyBMVENDIGNvbXBpbGVyIGZsYWdzLgotTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSRsdF9jb21waWxlcl9DWFgKLQotIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPwotd2l0aF9nY2M9JEdDQ19DWFgKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSRsdF9FR1JFUAotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kbHRfTERfQ1hYCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JGx0X0xOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kbHRfTk0KLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9JGx0X1NUUklQCi0KLSMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKLU1BR0lDX0NNRD0kTUFHSUNfQ01ECi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAotcGljX21vZGU9JHBpY19tb2RlCi0KLSMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPwotbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWAotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfQ1hYCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JGx0X1JBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19DWFgKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWAotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFgKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19DWFgKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKLW1vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCi1zdHJpcGxpYj0kbHRfc3RyaXBsaWIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19DWFgKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfQ1hYCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSRsdF9wcmVkZXBzX0NYWAotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwcz0kbHRfcG9zdGRlcHNfQ1hYCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWAotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19DWFgKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0NYWAotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYCi0KLSMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bwotIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCi0jIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0NYWAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9DWFgKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0NYWAotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX0NYWCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLWV4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCi1leGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19DWFgKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19DWFgKLQotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotX19FT0ZfXwotCi0KLWVsc2UKLSAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQotICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKLSAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgotICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKLSAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KLSAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCi0gIGZpCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotQ0M9JGx0X3NhdmVfQ0MKLUxEQ1hYPSRMRAotTEQ9JGx0X3NhdmVfTEQKLUdDQz0kbHRfc2F2ZV9HQ0MKLXdpdGhfZ251X2xkY3h4PSR3aXRoX2dudV9sZAotd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKLWx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKLWx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAotbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCi1sdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotCi0JZWxzZQotCSAgdGFnbmFtZT0iIgotCWZpCi0JOzsKLQotICAgICAgRjc3KQotCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgotCi1hY19leHQ9ZgotYWNfY29tcGlsZT0nJEY3NyAtYyAkRkZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJEY3NyAtbyBjb25mdGVzdCRhY19leGVleHQgJEZGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudQotCi0KLWFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQotaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KLWhhcmRjb2RlX2F1dG9tYXRpY19GNzc9bm8KLW1vZHVsZV9jbWRzX0Y3Nz0KLW1vZHVsZV9leHBzeW1fY21kc19GNzc9Ci1saW5rX2FsbF9kZXBsaWJzX0Y3Nz11bmtub3duCi1vbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0kb2xkX2FyY2hpdmVfY21kcwotbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PQotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9bm8KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9ZgotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHRfRjc3PSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iICAgICAgc3Vicm91dGluZSB0XG4gICAgICByZXR1cm5cbiAgICAgIGVuZFxuIgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIgICAgICBwcm9ncmFtIHRcbiAgICAgIGVuZFxuIgotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLQotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0Ci1wcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLUNDPSR7Rjc3LSJmNzcifQotY29tcGlsZXI9JENDCi1jb21waWxlcl9GNzc9JENDCi1mb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KLSAgY2FzZSAkY2NfdGVtcCBpbgotICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OwotICAgIFwtKikgOzsKLSAgICAqKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWNjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLWFpeDQqIHwgYWl4NSopCi0gIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBmaQotICA7OwotZXNhYwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKLSRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAiID4mNjsgfQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1Ci0kYXNfZWNobyAiJGVuYWJsZV9zdGF0aWMiID4mNjsgfQotCi1HQ0NfRjc3PSIkRzc3IgotTERfRjc3PSIkTEQiCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PQotbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotCi0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLSAgICAgIGRhcndpbiopCi0gICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICB4bGMqKQotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZnBpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgPiY2OyB9Ci0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLWlmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciOyB0aGVuCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE0MDQ2OiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjE0MDUwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID0geHllczsgdGhlbgotICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciIDs7Ci0gICAgIGVzYWMKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KLSAgICA7OwotICAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bF9GNzcgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3XCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3PW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3PXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNDE1MDogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjE0MTU0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID4mNjsgfQotCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzciID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci0gIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCi0gIGFyY2hpdmVfY21kc19GNzc9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQotICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0KLSAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3PQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQotICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci0gIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzc9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KLSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9Ci0gIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KLSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgotICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCi0gIG1vZHVsZV9jbWRzX0Y3Nz0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KLSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltc19GNzc9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgZXhjbHVkZV9leHBzeW1zX0Y3Nz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0gICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0gICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KLSAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgbGRfc2hsaWJzX0Y3Nz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCWxkX3NobGlic19GNzc9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLQotICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKLSAgICAgICMgdGhlbS4KLSAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19GNzc9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQl0bXBfYWRkZmxhZz0KLQljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KLQlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLQlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKLQl3bGFyYz0KLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlsZF9zaGxpYnNfRjc3PW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCi0JbGRfc2hsaWJzX0Y3Nz1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGxkX3NobGlic19GNzc9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfRjc3PW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubzsgdGhlbgotICAgICAgcnVucGF0aF92YXI9Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyopCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCi0JIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0JIyBicm9rZW4gY29sbGVjdDIuCi0JaGFyZGNvZGVfZGlyZWN0X0Y3Nz11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQllbHNlCi0JICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgotICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0gIAkgICAgYnJlYWsKLSAgCSAgZmkKLQkgIGRvbmUKLQkgIDs7Ci0JZXNhYwotCi0JZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgICBmaQotCi0gICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotCSAgZWxzZQotICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKLSAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLSAgCSAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXNoYXJlZF9mbGFnPSctc2hhcmVkJwotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0JZmkKLSAgICAgIGVsc2UKLQkjIG5vdCB1c2luZyBnY2MKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLSAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy1iZXJvaycKLSAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0gICAgICBwcm9ncmFtIG1haW4KLQotICAgICAgZW5kCi1fQUNFT0YKLWlmIGFjX2ZuX2Y3N190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLSAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKLSAgICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0iLXogbm9kZWZzIgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLQkgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotICAgICAgcHJvZ3JhbSBtYWluCi0KLSAgICAgIGVuZAotX0FDRU9GCi1pZiBhY19mbl9mNzdfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0JIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQkgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWJlcm5vdG9rJwotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVyb2snCi0JICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKLQkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJGNvbnZlbmllbmNlJwotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcwotCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgYW1pZ2FvcyopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGJzZGlbNDVdKikKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyAnCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgb2xkX2FyY2hpdmVfY21kc19GNzc9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIGZpeF9zcmNmaWxlX3BhdGhfRjc3PSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCi0gICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgOzsKLSAgICAgICAqKSAjIERhcndpbiAxLjMgb24KLSAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgotICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgZWxzZQotICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgotICAgICAgICAgICAgIDEwLlswMTJdKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgMTAuKikKLSAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCi0gICAgICAgICAgICAgICA7OwotICAgICAgICAgICBlc2FjCi0gICAgICAgICBmaQotICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JycKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCi0gICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICBlbHNlCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICB4bGMqKQotICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCi0gICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCi0gICAgICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCi0gICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgICAgIDs7Ci0gICAgICAgKikKLSAgICAgICAgIGxkX3NobGlic19GNzc9bm8KLSAgICAgICAgICA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgICA7OwotCi0gICAgZGd1eCopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnNfRjc3PW5vCi0gICAgICA7OwotCi0gICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICAgIyBleHRyYSBzcGFjZSkuCi0gICAgZnJlZWJzZDIuMiopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIGhwdXg5KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotCi0gICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCi0gICAgICA7OwotCi0gICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLQotCWhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLQotCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGhwdXgxMSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQlpYTY0KikKLQkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCWNhc2UgJGhvc3RfY3B1IGluCi0JaHBwYSo2NCopCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQkqKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KnxpYTY0KikKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PScrYiAkbGliZGlyJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLQkgIDs7Ci0JKikKLQkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0JICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJwotCi0JICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAotCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0JICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICBvcGVuYnNkKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKLSAgICAgIGVsc2UKLSAgICAgICBjYXNlICRob3N0X29zIGluCi0JIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCi0JICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotCSAgIDs7Ci0JICopCi0JICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvczIqKQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgOzsKLQotICAgIG9zZjMqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgICAgZWxzZQotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKLSAgICAgIDs7Ci0KLSAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJwotCi0JIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06Ci0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyAteiB0ZXh0JwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQl3bGFyYz0nJHt3bH0nCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQl3bGFyYz0nJwotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLSAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAgICopCi0gCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKLSAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCi0gCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KLSAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCi0gCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gCWNhc2UgJHdsYXJjIGluCi0gCScnKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAJKikKLSAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKLSAJZXNhYyA7OwotICAgICAgZXNhYwotICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICByZWxvYWRfY21kc19GNzc9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubwotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0JbGRfc2hsaWJzX0Y3Nz15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IHVuaXh3YXJlNyopCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQotICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KLSAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAotICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCi0gICAgICAjIGFzIC16IGRlZnMuCi0gICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosdGV4dCcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teixub2RlZnMnCi0gICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KLSAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgbGRfc2hsaWJzX0Y3Nz1ubwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGxkX3NobGlic19GNzciID4mNjsgfQotdGVzdCAiJGxkX3NobGlic19GNzciID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jCi0jIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/Ci0jCi1jYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgaW4KLXh8eHllcykKLSAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAotICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0KLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0Y3NyBpbgotICAgIConficqKQotICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgotICAgICAgOzsKLSAgICAnJENDICcqKQotICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQotICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCi0gICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAiID4mNjsgfQotICAgICAgJHJtIGNvbmZ0ZXN0KgotICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLQotICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICBzb25hbWU9Y29uZnRlc3QKLSAgICAgICAgbGliPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAotICAgICAgICBkZXBsaWJzPQotICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9GNzcKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfRjc3Ci0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12Ci0gICAgICAgIGxpbmtlcl9mbGFncz0tdgotICAgICAgICB2ZXJzdHJpbmc9Ci0gICAgICAgIG91dHB1dF9vYmpkaXI9LgotICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NwotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1Ci0gIChldmFsICRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Ci0gICAgICAgIHRoZW4KLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCi0gICAgICAgIGZpCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZwotICAgICAgZWxzZQotICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAgIGZpCi0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgPiY2OyB9Ci0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9Ci1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1zaHJleHRfY21kcz0iLnNvIgotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKLSAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKLSAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKLSAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gIGZpCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpCi1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotaGFyZGNvZGVfaW50b19saWJzPW5vCi0KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1uZWVkX3ZlcnNpb249dW5rbm93bgotCi1jYXNlICRob3N0X29zIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIDs7Ci0KLWFpeDQqIHwgYWl4NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBlbHNlCi0gICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQotICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKLSAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCi0gICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KLSAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCi0gICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgZWxzZQotICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKLSAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCi0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGZpCi0gICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGZpCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfdmVyc2lvbj1ubwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLQotICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KLSAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCi0gICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcwotICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgotICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgotICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgotICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+Ci0gICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRybSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgotICAgICAgOzsKLSAgICBtaW5ndyopCi0gICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgICAgIGVsc2UKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgcHczMiopCi0gICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICi0gIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJwotICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCi0gIGVsc2UKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWtmcmVlYnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OwotICAgICopIG9iamZvcm1hdD1lbGYgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBmcmVlYnNkMiopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCi0gIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgaWE2NCopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbycKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCi0gICAgZWxzZQotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgotICAgIGZpCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotICAgIDs7Ci0gICBocHBhKjY0KikKLSAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKLSAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgotICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgIDs7Ci0gICAqKQotICAgIHNocmV4dF9jbWRzPScuc2wnCi0gICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgOzsKLSAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWludGVyaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7Ci0gICAgKikKLQlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAotCWVsc2UKLQkJdmVyc2lvbl90eXBlPWlyaXgKLQlmaSA7OwotICBlc2FjCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBjYXNlICRob3N0X29zIGluCi0gIGlyaXg1KiB8IG5vbnN0b3B1eCopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgIDs7Ci0gICopCi0gICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCi0gICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKLSAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQotICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KLSAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCi0gICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLQotICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAotICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKLSAgZmkKLQotICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KLSAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQotICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKLSAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKLSAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCi0gICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgotICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJwotICA7OwotCi1rbmV0YnNkKi1nbnUpCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW50by1xbngqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQk7OwotICAgICAgKikKLQlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0JOzsKLSAgICAgIGVzYWMKLSAgZWxzZQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgZmkKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIDs7Ci0gICAgc2llbWVucykKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBtb3Rvcm9sYSkKLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzY28zLjJ2NSopCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgotCTs7Ci0gICAgZXNhYwotICBmaQotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKLSRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQotaGFyZGNvZGVfYWN0aW9uX0Y3Nz0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0Y3NyIgfHwgXAotICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfRjc3IiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfRjc3IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBGNzcpIiAhPSBubyAmJgotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9GNzciICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb25fRjc3PXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb25fRjc3PWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb25fRjc3PXVuc3VwcG9ydGVkCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjUKLSRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPiY2OyB9Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fRjc3IiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotCi0jIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKLSMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCi0jIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKLSMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCi0gICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLSAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICBmaQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCi0gICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQotICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCi0gIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKLSAgICBTRUQgU0hFTEwgU1RSSVAgXAotICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAotICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCi0gICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgY29tcGlsZXJfRjc3IFwKLSAgICBDQ19GNzcgXAotICAgIExEX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzcgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3IFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19GNzcgXAotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzcgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcgXAotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3NyBcCi0gICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NyBcCi0gICAgcHJlZGVwX29iamVjdHNfRjc3IFwKLSAgICBwb3N0ZGVwX29iamVjdHNfRjc3IFwKLSAgICBwcmVkZXBzX0Y3NyBcCi0gICAgcG9zdGRlcHNfRjc3IFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3IFwKLSAgICBhcmNoaXZlX2NtZHNfRjc3IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3NyBcCi0gICAgcG9zdGluc3RhbGxfY21kc19GNzcgXAotICAgIHBvc3R1bmluc3RhbGxfY21kc19GNzcgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NyBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3IFwKLSAgICBub191bmRlZmluZWRfZmxhZ19GNzcgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3IFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3IFwKLSAgICBtb2R1bGVfY21kc19GNzcgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NyBcCi0gICAgZXhjbHVkZV9leHBzeW1zX0Y3NyBcCi0gICAgaW5jbHVkZV9leHBzeW1zX0Y3NzsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IHwgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IHwgXAotICAgIGFyY2hpdmVfY21kc19GNzcgfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgfCBcCi0gICAgbW9kdWxlX2NtZHNfRjc3IHwgXAotICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IHwgXAotICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgJGx0X2VjaG8gaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotY2ZnZmlsZT0iJG9maWxlIgotCi0gIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzcKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3Ci0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotaG9zdF9vcz0kaG9zdF9vcwotCi0jIFRoZSBidWlsZCBzeXN0ZW0uCi1idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKLWJ1aWxkPSRidWlsZAotYnVpbGRfb3M9JGJ1aWxkX29zCi0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRfZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRsdF9BUgotQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0kbHRfTFRDQwotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0kbHRfTFRDRkxBR1MKLQotIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgotQ0M9JGx0X2NvbXBpbGVyX0Y3NwotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz0kR0NDX0Y3NwotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9GNzcKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kbHRfTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSRsdF9OTQotCi0jIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCi1TVFJJUD0kbHRfU1RSSVAKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPSRNQUdJQ19DTUQKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NwotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJGFjX29iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCi1zaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJwotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfRjc3Ci1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcKLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KLW5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3Ci0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0Y3Nwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3Ci0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0Y3NwotYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19GNzcKLXBvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0Y3NwotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfRjc3Ci0KLSMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgotb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKLXN0cmlwbGliPSRsdF9zdHJpcGxpYgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0Y3NwotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19GNzcKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfRjc3Ci0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSRsdF9wb3N0ZGVwc19GNzcKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3Ci0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19GNzcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0Y3NwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fRjc3Ci0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcKLQotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfRjc3Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0Y3NwotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzcKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19GNzcKLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfRjc3Ci0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfRjc3IgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzcKLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19GNzcKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0Y3NwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0Y3NwotCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQotCi1fX0VPRl9fCi0KLQotZWxzZQotICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCi0gICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQotICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCi0gIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAotICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgotICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKLSAgZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1DQz0iJGx0X3NhdmVfQ0MiCi0KLQllbHNlCi0JICB0YWduYW1lPSIiCi0JZmkKLQk7OwotCi0gICAgICBHQ0opCi0JaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCi0KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWphdmEKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgotb2JqZXh0PW8KLW9iamV4dF9HQ0o9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikge307IH1cbicKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotCi0jIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgotTFRDQz0ke0xUQ0MtIiRDQyJ9Ci0KLSMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KLUxUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotY29tcGlsZXI9JENDCi0KLQotIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCi0kcm0gY29uZnRlc3QqCi0KLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAotZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCi1fbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1DQz0ke0dDSi0iZ2NqIn0KLWNvbXBpbGVyPSRDQwotY29tcGlsZXJfR0NKPSRDQwotZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotCi0jIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCi1hcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KLQotb2xkX2FyY2hpdmVfY21kc19HQ0o9JG9sZF9hcmNoaXZlX2NtZHMKLQotIyMgQ0FWRUFUIEVNUFRPUjoKLSMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0jIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi0KLWx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0KLQotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPScgLWZuby1idWlsdGluJwotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMuLi4gIiA+JjY7IH0KLWlmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBsdF9jb21waWxlcl9mbGFnPSItZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKLSAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCi0gICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCi0gICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgotICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNjMwNjogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgIGVjaG8gIiRhc19tZToxNjMxMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgotZWxzZQotICAgIDoKLWZpCi0KLWZpCi0KLWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPQotbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQotbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9Ci0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgqKQotICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgICA7OwotCi0gICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgICAgOzsKLQotICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1ERExMX0VYUE9SVCcKLSAgICAgIDs7Ci0KLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0KLSAgICBpbnRlcml4MyopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotCi0gICAgbXNkb3NkamdwcCopCi0gICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcwotICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubwotICAgICAgZW5hYmxlX3NoYXJlZD1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBocHV4KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAotICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIGhwcGEqNjQqfGlhNjQqKQotCSMgK1ogdGhlIGRlZmF1bHQKLQk7OwotICAgICAgKikKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICBlbHNlCi0JbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgICBmaQotICAgICAgOzsKLSAgICAgIGRhcndpbiopCi0gICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICB4bGMqKQotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctcW5vY29tbW9uJwotICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAgICA7OwotICAgICAgIGVzYWMKLSAgICAgICA7OwotCi0gICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJwotICAgICAgOzsKLQotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPScrWicKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJwotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIGxpbnV4KikKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBpY2MqIHwgZWNjKikKLQlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLQlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQotICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAotCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCi0JbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZnBpYycKLQlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgICA7OwotICAgICAgY2NjKikKLSAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgotICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJwotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQotCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctUW9wdGlvbiBsZCAnOzsKLSAgICAgICopCi0JbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1Rb3B0aW9uIGxkICcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLVBJQycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQotICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJwotICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0JbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS2NvbmZvcm1fcGljJwotCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHVuaWNvcyopCi0gICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLXBpYycKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgPiY2OyB9Ci0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSMKLWlmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiOyB0aGVuCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPW5vCi0gIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCi0gICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE2NTc0OiAkbHRfY29tcGlsZVwiIiA+JjUpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICAgYWNfc3RhdHVzPSQ/Ci0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjE2NTc4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgotICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCi0gICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjUKLSRhc19lY2hvICIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjY7IH0KLQotaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgotICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiBpbgotICAgICAiIiB8ICIgIiopIDs7Ci0gICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiIDs7Ci0gICAgIGVzYWMKLWVsc2UKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Ci0gICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KLWZpCi0KLWZpCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KLSAgICA7OwotICAqKQotICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIKLSAgICA7OwotZXNhYwotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kbHRfcHJvZ19jb21waWxlcl93bF9HQ0ogZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKXCIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gIiA+JjY7IH0KLWlmICR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPW5vCi0gICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCi0gICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCi0gICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSj15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcwotICAgICBmaQotICAgZmkKLSAgICRybSBjb25mdGVzdCoKLSAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY1Ci0kYXNfZWNobyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY2OyB9Ci0KLWlmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA9IHh5ZXM7IHRoZW4KLSAgICA6Ci1lbHNlCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQotaWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0orOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9bm8KLSAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKLSAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCi0gICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgotICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucwotICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KLSAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAotICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAotICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNjY3ODogJGx0X2NvbXBpbGVcIiIgPiY1KQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCi0gICBhY19zdGF0dXM9JD8KLSAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjE2NjgyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0Ci0gICB0aGVuCi0gICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKLSAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSj15ZXMKLSAgICAgZmkKLSAgIGZpCi0gICBjaG1vZCB1K3cgLiAyPiY1Ci0gICAkcm0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICBybWRpciBjb25mdGVzdAotICAgJHJtIGNvbmZ0ZXN0KgotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID4mNQotJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID4mNjsgfQotCi0KLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gIiA+JjY7IH0KLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKLSRhc19lY2hvICIkaGFyZF9saW5rcyIgPiY2OyB9Ci0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9Ci0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQotCi0gIHJ1bnBhdGhfdmFyPQotICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Ci0gIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPW5vCi0gIGFyY2hpdmVfY21kc19HQ0o9Ci0gIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPQotICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0KLSAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKPQotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPQotICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Ci0gIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0o9Ci0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0KLSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9Ci0gIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KLSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9bm8KLSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9dW5zdXBwb3J0ZWQKLSAgbGlua19hbGxfZGVwbGlic19HQ0o9dW5rbm93bgotICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKPW5vCi0gIG1vZHVsZV9jbWRzX0dDSj0KLSAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0KLSAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj1ubwotICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0gICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci0gIGluY2x1ZGVfZXhwc3ltc19HQ0o9Ci0gICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCi0gICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLSAgZXhjbHVkZV9leHBzeW1zX0dDSj0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0gICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAotICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLSAgZXh0cmFjdF9leHBzeW1zX2NtZHM9Ci0gICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KLSAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgbGRfc2hsaWJzX0dDSj15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0Jd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICAgICAgZWxzZQotICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgotICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKLSAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCWxkX3NobGlic19HQ0o9bm8KLQljYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLQotICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCi0gICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKLSAgICAgICMgdGhlbS4KLSAgICAgIGxkX3NobGlic19HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBiZW9zKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKLQkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgZWxzZQotCWxkX3NobGlic19HQ0o9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEdDSikgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCi0gICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj1ubwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9eWVzCi0gICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLQotICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXgzKikKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBsaW51eCopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQl0bXBfYWRkZmxhZz0KLQljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KLQlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwotCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OwotCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKLQllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAotCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OwotCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCi0JICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OwotCWVzYWMKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLQlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLSAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCi0JZmkKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG5ldGJzZCopCi0gICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKLQl3bGFyYz0KLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHNvbGFyaXMqKQotICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlsZF9zaGxpYnNfR0NKPW5vCi0JY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKLSoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKLSoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKLSoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5Ci0qKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcwotKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JbGRfc2hsaWJzX0dDSj1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCi0JbGRfc2hsaWJzX0dDSj1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCi0JICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKLQkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICBlbHNlCi0JICAgIGxkX3NobGlic19HQ0o9bm8KLQkgIGZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIHdsYXJjPQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlsZF9zaGxpYnNfR0NKPW5vCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubzsgdGhlbgotICAgICAgcnVucGF0aF92YXI9Ci0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KLSAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9Ci0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Ci0gICAgZmkKLSAgZWxzZQotICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4MyopCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCi0JIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0JIyBicm9rZW4gY29sbGVjdDIuCi0JaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhaXg0KiB8IGFpeDUqKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKLQllbHNlCi0JICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKLQkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgotICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0gIAkgICAgYnJlYWsKLSAgCSAgZmkKLQkgIGRvbmUKLQkgIDs7Ci0JZXNhYwotCi0JZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKLQlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCi0gICAgICBmaQotCi0gICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCi0gICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKLSAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAotICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCi0KLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JycKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0nOicKLSAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCi0JIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0JIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0gIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0JICB0aGVuCi0gIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotICAJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotCSAgZWxzZQotICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0gIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9dW5zdXBwb3J0ZWQKLSAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLSAgCSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXNoYXJlZF9mbGFnPSctc2hhcmVkJwotCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCi0JZmkKLSAgICAgIGVsc2UKLQkjIG5vdCB1c2luZyBnY2MKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLSAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6Ci0JICBzaGFyZWRfZmxhZz0nLUcnCi0JZWxzZQotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgZWxzZQotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJwotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCi0gICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKLSAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAotCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Jy1iZXJvaycKLSAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2AKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Ci19J2A7IGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQotCi0gICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICAgZWxzZQotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Ii16IG5vZGVmcyIKLQkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgotCWVsc2UKLQkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYAotIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KLX0nYDsgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi0KLQkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCi0JICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAotCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVybm90b2snCi0JICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1iZXJvaycKLQkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPSckY29udmVuaWVuY2UnCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9eWVzCi0JICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgotCSAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotCi0gICAgYnNkaVs0NV0qKQotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0tcmR5bmFtaWMKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzX0dDSj0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgZml4X3NyY2ZpbGVfcGF0aF9HQ0o9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKLSAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICA7OwotICAgICAgICopICMgRGFyd2luIDEuMyBvbgotICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCi0gICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCi0gICAgICAgICAgICAgMTAuWzAxMl0pCi0gICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJwotICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAxMC4qKQotICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKLSAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgIGVzYWMKLSAgICAgICAgIGZpCi0gICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0gICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKLSAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JwotICAgIGVsc2UKLSAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgIHhsYyopCi0gICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLSAgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKLSAgICAgICAgIG1vZHVsZV9jbWRzX0dDSj0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCi0gICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKLSAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKLSAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgICAgICAgOzsKLSAgICAgICAqKQotICAgICAgICAgbGRfc2hsaWJzX0dDSj1ubwotICAgICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIGxkX3NobGlic19HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgaHB1eDkqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0KLSAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0gICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLSAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKLSAgICAgIDs7Ci0KLSAgICBocHV4MTAqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotCi0JaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQloYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9JytiICRsaWJkaXInCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0JICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotCSAgOzsKLQkqKQotCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLQkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCi0KLQkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPSctcnBhdGggJGxpYmRpcicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICA7OwotCi0gICAgbmV0YnNkKikKLSAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06Ci0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgIG9wZW5ic2QqKQotICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJwotICAgICAgZWxzZQotICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0JICAgOzsKLQkgKikKLQkgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgOzsKLSAgICAgICBlc2FjCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9zMiopCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJwotICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCi0gICAgICA7OwotCi0gICAgb3NmMyopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBlbHNlCi0JYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgotICAgICAgOzsKLQotICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZwotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgIGVsc2UKLQlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCi0KLQkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5Ci0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1ycGF0aCAkbGliZGlyJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nIC16IHRleHQnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZWxzZQotCXdsYXJjPScnCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJwotICAgICAgZmkKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICAgKikKLSAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQotIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKLSAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgotIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KLSAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLSAJY2FzZSAkd2xhcmMgaW4KLSAJJycpCi0gCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OwotIAkqKQotIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OwotIAllc2FjIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKLSAgICAgIDs7Ci0KLSAgICBzdW5vczQqKQotICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgotCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KLQkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KLQlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKLSAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCi0gICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQpCi0gICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgotCXNuaSkKLQkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PwotCTs7Ci0Jc2llbWVucykKLQkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgotCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgotCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIHJlbG9hZF9jbWRzX0dDSj0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCi0gICAgICAgIDs7Ci0JbW90b3JvbGEpCi0JICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKLQk7OwotICAgICAgZXNhYwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIDs7Ci0KLSAgICBzeXN2NC4zKikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPSctQmV4cG9ydCcKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCpNUCopCi0gICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCi0JcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLQlsZF9zaGxpYnNfR0NKPXllcwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0teix0ZXh0JwotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LG5vZGVmcycKLSAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JwotICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCi0gICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1CZXhwb3J0JwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBlbHNlCi0JYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBsZF9zaGxpYnNfR0NKPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKLSRhc19lY2hvICIkbGRfc2hsaWJzX0dDSiIgPiY2OyB9Ci10ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRhcmNoaXZlX2NtZHNfR0NKIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkcm0gY29uZnRlc3QqCi0gICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgotCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKCi0gICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KLSAgICAgICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIjsgfSA+JjUKLSAgKGV2YWwgJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgICAgICAgdGhlbgotCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCi0gICAgICAgIGVsc2UKLQkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRybSBjb25mdGVzdCoKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjUKLSRhc19lY2hvICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjY7IH0KLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotZXNhYwotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gIiA+JjY7IH0KLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLWVsc2UKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmkKLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1oYXJkY29kZV9pbnRvX2xpYnM9bm8KLQotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLW5lZWRfdmVyc2lvbj11bmtub3duCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgOzsKLQotYWl4NCogfCBhaXg1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQotICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKLQkgICBlY2hvICcgeWVzICcKLQkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KLSAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90Ci0gICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBlbHNlCi0gICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgotICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKLSAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZmkKLSAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZmkKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpWzQ1XSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKLSAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCi0gICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+Ci0gICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KLSAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+Ci0gICAgICAgJHJtIFwkZGxwYXRoJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qKQotICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCi0gICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQotICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCi0gICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKLSAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAotICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCi0gICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICAqKQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJwotICAgIDs7Ci0gIGVzYWMKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKLSAgdmVyc2lvbl90eXBlPWRhcndpbgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JwotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKLSAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCi0gICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKLSAgZmkKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQota2ZyZWVic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3Ci0gICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgotICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKLSAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBzaHJleHRfY21kcz0nLnNvJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKLSAgICBlbHNlCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCi0gICAgZmkKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgIGhwcGEqNjQqKQotICAgICBzaHJleHRfY21kcz0nLnNsJwotICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCi0gICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICAgOzsKLSAgICopCi0gICAgc2hyZXh0X2NtZHM9Jy5zbCcKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICA7OwotICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaW50ZXJpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKLSAgICAqKQotCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLQkJdmVyc2lvbl90eXBlPWxpbnV4Ci0JZWxzZQotCQl2ZXJzaW9uX3R5cGU9aXJpeAotCWZpIDs7Ci0gIGVzYWMKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgaXJpeDUqIHwgbm9uc3RvcHV4KikKLSAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9Ci0gICAgOzsKLSAgKikKLSAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKLSAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQotICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCi0gICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCi0gICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgotICBmaQotCi0gICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgotICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCi0gICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAotICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAotICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKLSAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCi0gIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCi0gIDs7Ci0KLWtuZXRic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1uZXdzb3M2KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgOzsKLQotbnRvLXFueCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgotICBjYXNlICRob3N0X29zIGluCi0gICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKLSAgZXNhYwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgICBzbmkpCi0gICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgOzsKLSAgICBzaWVtZW5zKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc3lzdjQqTVAqKQotICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJwotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBlbHNlCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQotJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICIgPiY2OyB9Ci1oYXJkY29kZV9hY3Rpb25fR0NKPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXJfR0NKIiB8fCBcCi0gICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oiID0gIlh5ZXMiIDsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9HQ0oiICE9IG5vICYmCi0gICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKLSAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQotICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCi0gICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEdDSikiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0dDSiIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbl9HQ0o9dW5zdXBwb3J0ZWQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID4mNQotJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjY7IH0KLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9HQ0ogXAotICAgIENDX0dDSiBcCi0gICAgTERfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0ogXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSiBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSiBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKIFwKLSAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIFwKLSAgICBwcmVkZXBfb2JqZWN0c19HQ0ogXAotICAgIHBvc3RkZXBfb2JqZWN0c19HQ0ogXAotICAgIHByZWRlcHNfR0NKIFwKLSAgICBwb3N0ZGVwc19HQ0ogXAotICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0ogXAotICAgIGFyY2hpdmVfY21kc19HQ0ogXAotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX0dDSiBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIFwKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0ogXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSiBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSiBcCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0ogXAotICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0ogXAotICAgIG1vZHVsZV9jbWRzX0dDSiBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiBcCi0gICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIFwKLSAgICBleGNsdWRlX2V4cHN5bXNfR0NKIFwKLSAgICBpbmNsdWRlX2V4cHN5bXNfR0NKOyBkbwotCi0gICAgY2FzZSAkdmFyIGluCi0gICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0ogfCBcCi0gICAgYXJjaGl2ZV9jbWRzX0dDSiB8IFwKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBtb2R1bGVfY21kc19HQ0ogfCBcCi0gICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiB8IFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19HQ0ogfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogfCBcCi0gICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAkbHRfZWNobyBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi1jZmdmaWxlPSIkb2ZpbGUiCi0KLSAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JGx0X1NIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSgotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0oKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfR0NKCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPSRHQ0NfR0NKCi0KLSMgQW4gRVJFIG1hdGNoZXIuCi1FR1JFUD0kbHRfRUdSRVAKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JGx0X0xEX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfR0NKCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkYWNfb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKLXBpY19tb2RlPSRwaWNfbW9kZQotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSgotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0oKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSgotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRsdF9SQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfR0NKCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19HQ0oKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfR0NKCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0dDSgotcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCi1tb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfR0NKCi1tb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19HQ0oKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfR0NKCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0dDSgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwcz0kbHRfcHJlZGVwc19HQ0oKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0dDSgotCi0jIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0jIGEgc2hhcmVkIGxpYnJhcnkuCi1jb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0oKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfR0NKCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9HQ0oKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSgotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSgotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9HQ0oKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfR0NKCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSgotCi0jIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQotIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KLWhhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0dDSgotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19HQ0oKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9HQ0oiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0dDSgotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfR0NKCi0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCWVsc2UKLQkgIHRhZ25hbWU9IiIKLQlmaQotCTs7Ci0KLSAgICAgIFJDKQotCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9cmMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1vYmpleHRfUkM9JG9iamV4dAotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9XG4nCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCi0KLSMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLQotIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KLUxUQ0M9JHtMVENDLSIkQ0MifQotCi0jIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCi1MVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWNvbXBpbGVyPSRDQwotCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAotJHJtIGNvbmZ0ZXN0KgotCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLXByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRybSBjb25mdGVzdCoKLQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotbHRfc2F2ZV9DQz0iJENDIgotQ0M9JHtSQy0id2luZHJlcyJ9Ci1jb21waWxlcj0kQ0MKLWNvbXBpbGVyX1JDPSRDQwotZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCi0gIGNhc2UgJGNjX3RlbXAgaW4KLSAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7Ci0gICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLQotbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkM9eWVzCi0KLSMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQotIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKLSMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQotIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCi1pZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgotICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKLSAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0gIGZpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKLSAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCi0gICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KLSAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAotICAgIFNFRCBTSEVMTCBTVFJJUCBcCi0gICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCi0gICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBjb21waWxlcl9SQyBcCi0gICAgQ0NfUkMgXAotICAgIExEX1JDIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX1JDIFwKLSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19SQyBcCi0gICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMgXAotICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDIFwKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfUkMgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19SQyBcCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfUkMgXAotICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfUkMgXAotICAgIG9sZF9hcmNoaXZlX2NtZHNfUkMgXAotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgXAotICAgIHByZWRlcF9vYmplY3RzX1JDIFwKLSAgICBwb3N0ZGVwX29iamVjdHNfUkMgXAotICAgIHByZWRlcHNfUkMgXAotICAgIHBvc3RkZXBzX1JDIFwKLSAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkMgXAotICAgIGFyY2hpdmVfY21kc19SQyBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19SQyBcCi0gICAgcG9zdGluc3RhbGxfY21kc19SQyBcCi0gICAgcG9zdHVuaW5zdGFsbF9jbWRzX1JDIFwKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQyBcCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMgXAotICAgIG5vX3VuZGVmaW5lZF9mbGFnX1JDIFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzX1JDIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDIFwKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDIFwKLSAgICBoYXJkY29kZV9hdXRvbWF0aWNfUkMgXAotICAgIG1vZHVsZV9jbWRzX1JDIFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfUkMgXAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDIFwKLSAgICBleGNsdWRlX2V4cHN5bXNfUkMgXAotICAgIGluY2x1ZGVfZXhwc3ltc19SQzsgZG8KLQotICAgIGNhc2UgJHZhciBpbgotICAgIG9sZF9hcmNoaXZlX2NtZHNfUkMgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQyB8IFwKLSAgICBhcmNoaXZlX2NtZHNfUkMgfCBcCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kc19SQyB8IFwKLSAgICBtb2R1bGVfY21kc19SQyB8IFwKLSAgICBtb2R1bGVfZXhwc3ltX2NtZHNfUkMgfCBcCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyB8IFwKLSAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXNlICRsdF9lY2hvIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLWNmZ2ZpbGU9IiRvZmlsZSIKLQotICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kbHRfU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfUkMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCi1hbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfUkMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci1ob3N0X29zPSRob3N0X29zCi0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotYnVpbGQ9JGJ1aWxkCi1idWlsZF9vcz0kYnVpbGRfb3MKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdF9lY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JGx0X0FSCi1BUl9GTEFHUz0kbHRfQVJfRkxBR1MKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSRsdF9MVENDCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSRsdF9MVENGTEFHUwotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0kbHRfY29tcGlsZXJfUkMKLQotIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPwotd2l0aF9nY2M9JEdDQ19SQwotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9JGx0X0VHUkVQCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRsdF9MRF9SQwotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRsdF9MTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JGx0X05NCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSRsdF9TVFJJUAotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9JE1BR0lDX0NNRAotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0iJE9CSkRVTVAiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfUkMKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRhY19vYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiRleGVleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX1JDCi1waWNfbW9kZT0kcGljX21vZGUKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19SQwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kbHRfUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX1JDCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQwotCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX1JDCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX1JDCi1wb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKLW1vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19SQwotbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfUkMKLQotIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCi1vbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgotc3RyaXBsaWI9JGx0X3N0cmlwbGliCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfUkMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfUkMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXByZWRlcHM9JGx0X3ByZWRlcHNfUkMKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX1JDCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19SQwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfUkMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCi1nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcwotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX1JDCi0KLSMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KLWhhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQwotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KLSMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfUkMKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfUkMKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfUkMKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19SQwotCi0jIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAotIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCi0KLSMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgotbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19SQwotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX1JDIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19SQwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX1JDCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLWV4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCi1leGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19SQwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KLWluY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX1JDCi0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCi0KLV9fRU9GX18KLQotCi1lbHNlCi0gICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKLSAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCi0gICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KLSAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCi0gIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCi0gICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgotICBmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLUNDPSIkbHRfc2F2ZV9DQyIKLQotCTs7Ci0KLSAgICAgICopCi0JYXNfZm5fZXJyb3IgJD8gIlVuc3VwcG9ydGVkIHRhZyBuYW1lOiAkdGFnbmFtZSIgIiRMSU5FTk8iIDUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFwcGVuZCB0aGUgbmV3IHRhZyBuYW1lIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICAgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiIDsgdGhlbgotICAgICAgYXZhaWxhYmxlX3RhZ3M9IiRhdmFpbGFibGVfdGFncyAkdGFnbmFtZSIKLSAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgIyBOb3cgc3Vic3RpdHV0ZSB0aGUgdXBkYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgotICBpZiBldmFsICJzZWQgLWUgJ3MvXmF2YWlsYWJsZV90YWdzPS4qXCQvYXZhaWxhYmxlX3RhZ3M9XCIkYXZhaWxhYmxlX3RhZ3NcIi8nIFwiJG9maWxlXCIgPiBcIiR7b2ZpbGV9VFwiIjsgdGhlbgotICAgIG12ICIke29maWxlfVQiICIkb2ZpbGUiCi0gICAgY2htb2QgK3ggIiRvZmlsZSIKLSAgZWxzZQotICAgIHJtIC1mICIke29maWxlfVQiCi0gICAgYXNfZm5fZXJyb3IgJD8gInVuYWJsZSB0byB1cGRhdGUgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zLiIgIiRMSU5FTk8iIDUKLSAgZmkKLWZpCi0KLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0FSKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkQVIgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWFzX2R1bW15PSIkUEFUSDovdXNyL2Njcy9iaW4iCi1mb3IgYXNfZGlyIGluICRhc19kdW1teQotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9BUj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9BUiIgJiYgYWNfY3ZfcGF0aF9BUj0iL3Vzci9iaW4vYXIiCi0gIDs7Ci1lc2FjCi1maQotQVI9JGFjX2N2X3BhdGhfQVIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1Ci0kYXNfZWNobyAiJEFSIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLQotIyBPcHRpb25zCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC10aWdodHZuYy1maWxldHJhbnNmZXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyOwotZWxzZQotICAgd2l0aF90aWdodHZuY19maWxldHJhbnNmZXI9eWVzCi1maQotCi0jIEFDX0RFRklORSBtb3ZlZCB0byBhZnRlciBsaWJwdGhyZWFkIGNoZWNrLgotCi0jIFdlYlNvY2tldHMgc3VwcG9ydAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX19iNjRfbnRvcCBpbiAtbHJlc29sdiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX19iNjRfbnRvcCBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcmVzb2x2X19fYjY0X250b3ArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHJlc29sdiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgX19iNjRfbnRvcCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIF9fYjY0X250b3AgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wPXllcwotZWxzZQotICBhY19jdl9saWJfcmVzb2x2X19fYjY0X250b3A9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Jlc29sdl9fX2I2NF9udG9wIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0I2ND0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9CNjQ9ImZhbHNlIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtd2Vic29ja2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfd2Vic29ja2V0cytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfd2Vic29ja2V0czsKLWVsc2UKLSAgIHdpdGhfd2Vic29ja2V0cz15ZXMKLWZpCi0KLSMgQUNfREVGSU5FIG1vdmVkIHRvIGFmdGVyIGxpYnJlc29sdmUgY2hlY2suCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLTI0YnBwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF8yNGJwcCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfMjRicHA7Ci1lbHNlCi0gICB3aXRoXzI0YnBwPXllcwotZmkKLQotaWYgdGVzdCAieCR3aXRoXzI0YnBwIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICIjZGVmaW5lIEFMTE9XMjRCUFAgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1mZm1wZWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2ZmbXBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZmZtcGVnOwotZmkKLQotCi0gaWYgdGVzdCAhIC16ICIkd2l0aF9mZm1wZWciOyB0aGVuCi0gIFdJVEhfRkZNUEVHX1RSVUU9Ci0gIFdJVEhfRkZNUEVHX0ZBTFNFPScjJwotZWxzZQotICBXSVRIX0ZGTVBFR19UUlVFPScjJwotICBXSVRIX0ZGTVBFR19GQUxTRT0KLWZpCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfZmZtcGVnIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxhbWVfaW5pdCBpbiAtbG1wM2xhbWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxhbWVfaW5pdCBpbiAtbG1wM2xhbWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxtcDNsYW1lICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBsYW1lX2luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBsYW1lX2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfbXAzbGFtZV9sYW1lX2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX21wM2xhbWVfbGFtZV9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX01QM0xBTUU9InRydWUiCi1lbHNlCi0gIEhBVkVfTVAzTEFNRT0iZmFsc2UiCi1maQotCi1maQotIGlmIHRlc3QgIiRIQVZFX01QM0xBTUUiID0gInRydWUiOyB0aGVuCi0gIEhBVkVfTVAzTEFNRV9UUlVFPQotICBIQVZFX01QM0xBTUVfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTVAzTEFNRV9UUlVFPScjJwotICBIQVZFX01QM0xBTUVfRkFMU0U9Ci1maQotCi0KLSMgU2VlbSB0byBuZWVkIHRoaXMgZHVtbXkgaGVyZSB0byBpbmR1Y2UgdGhlICdjaGVja2luZyBmb3IgZWdyZXAuLi4gZ3JlcCAtRScsIGV0Yy4KLSMgYmVmb3JlIGl0IHNlZW1lZCB0byBiZSBpbnNpZGUgdGhlIHdpdGhfanBlZyBjb25kaXRpb25hbC4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ0aGVub25leGlzdGVudGhlYWRlci5oIiAiYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3RoZW5vbmV4aXN0ZW50aGVhZGVyX2giID0geHllczsgdGhlbiA6Ci0gIEhBVkVfVEhFTk9ORVhJU1RFTlRIRUFERVJfSD0idHJ1ZSIKLWZpCi0KLQotCi0jIHNldCBzb21lIGxkIC1SIG5vbnNlbnNlCi0jCi11bmFtZV9zPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYAotbGRfbWludXNfUj0ieWVzIgotaWYgdGVzdCAieCR1bmFtZV9zIiA9ICJ4SFAtVVgiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieE9TRjEiOyB0aGVuCi0JbGRfbWludXNfUj0ibm8iCi1lbGlmIHRlc3QgIngkdW5hbWVfcyIgPSAieERhcndpbiI7IHRoZW4KLQlsZF9taW51c19SPSJubyIKLWZpCi0KLSMgQ2hlY2sgZm9yIE9wZW5TU0wKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcnlwdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY3J5cHQ7Ci1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfY3J5cHQiICE9ICJ4bm8iOyB0aGVuCi0JZm9yIGFjX2Z1bmMgaW4gY3J5cHQKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiY3J5cHQiICJhY19jdl9mdW5jX2NyeXB0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2NyeXB0IiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfQ1JZUFQgMQotX0FDRU9GCi0gSEFWRV9MSUJDX0NSWVBUPSJ0cnVlIgotZmkKLWRvbmUKLQotCWlmIHRlc3QgLXogIiRIQVZFX0xJQkNfQ1JZUFQiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2NyeXB0X2NyeXB0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxjcnlwdCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY3J5cHQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBjcnlwdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jcnlwdF9jcnlwdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRfY3J5cHQiID0geHllczsgdGhlbiA6Ci0gIENSWVBUX0xJQlM9Ii1sY3J5cHQiCi0JCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JZmkKLWZpCi0KLQotIyBzb21lIE9TJ3MgbmVlZCBib3RoIC1sc3NsIGFuZCAtbGNyeXB0byBvbiBsaW5rIGxpbmU6Ci0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jcnlwdG8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2NyeXB0bytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY3J5cHRvOwotZmkKLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zc2wgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NzbCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3NsOwotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfY3J5cHRvIiAhPSAieG5vIiAtYSAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3NzbC9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3NzbC9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJTERGTEFHUz0iJExERkxBR1MgLVhsaW5rZXIgLVIkd2l0aF9zc2wvbGliIgotCQllbHNlCi0JCQlMREZMQUdTPSIkTERGTEFHUyAtUiR3aXRoX3NzbC9saWIiCi0JCWZpCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBSQU5EX2ZpbGVfbmFtZSBpbiAtbGNyeXB0byIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgUkFORF9maWxlX25hbWUgaW4gLWxjcnlwdG8uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHRvICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBSQU5EX2ZpbGVfbmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFJBTkRfZmlsZV9uYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19SQU5EX2ZpbGVfbmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdG9fUkFORF9maWxlX25hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX1JBTkRfZmlsZV9uYW1lIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQkNSWVBUTyAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQkNSWVBUTz0idHJ1ZSIKLWZpCi0KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3NzbCIgLWEgIngkd2l0aF9zc2wiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3NzbCIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICJ4JEhBVkVfTElCQ1JZUFRPIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAtbGNyeXB0byAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBTU0xfbGlicmFyeV9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gU1NMX2xpYnJhcnlfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zc2xfU1NMX2xpYnJhcnlfaW5pdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQiID0geHllczsgdGhlbiA6Ci0gIFNTTF9MSUJTPSItbHNzbCAtbGNyeXB0byIKLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCU1NMIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCU1NMPSJ0cnVlIgotZmkKLQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgU1NMX2xpYnJhcnlfaW5pdCBpbiAtbHNzbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNzbCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgU1NMX2xpYnJhcnlfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFNTTF9saWJyYXJ5X2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfc3NsX1NTTF9saWJyYXJ5X2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NzbF9TU0xfbGlicmFyeV9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBTU0xfTElCUz0iLWxzc2wiCi0JCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQlNTTCAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlNTTD0idHJ1ZSIKLWZpCi0KLQlmaQotZmkKLQotIGlmIHRlc3QgISAteiAiJFNTTF9MSUJTIjsgdGhlbgotICBIQVZFX0xJQlNTTF9UUlVFPQotICBIQVZFX0xJQlNTTF9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJTU0xfVFJVRT0nIycKLSAgSEFWRV9MSUJTU0xfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2tzIGZvciBYIGxpYnJhcmllcwotSEFWRV9YMTE9ImZhbHNlIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWC4uLiAiID4mNjsgfQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgteCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeDsKLWZpCi0KLSMgJGhhdmVfeCBpcyBgeWVzJywgYG5vJywgYGRpc2FibGVkJywgb3IgZW1wdHkgd2hlbiB3ZSBkbyBub3QgeWV0IGtub3cuCi1pZiB0ZXN0ICJ4JHdpdGhfeCIgPSB4bm87IHRoZW4KLSAgIyBUaGUgdXNlciBleHBsaWNpdGx5IGRpc2FibGVkIFguCi0gIGhhdmVfeD1kaXNhYmxlZAotZWxzZQotICBjYXNlICR4X2luY2x1ZGVzLCR4X2xpYnJhcmllcyBpbiAjKAotICAgICpcJyopIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgdXNlIFggZGlyZWN0b3J5IG5hbWVzIGNvbnRhaW5pbmcgJyIgIiRMSU5FTk8iIDU7OyAjKAotICAgICosTk9ORSB8IE5PTkUsKikgaWYgJHthY19jdl9oYXZlX3grOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICAjIE9uZSBvciBib3RoIG9mIHRoZSB2YXJzIGFyZSBub3Qgc2V0LCBhbmQgdGhlcmUgaXMgbm8gY2FjaGVkIHZhbHVlLgotYWNfeF9pbmNsdWRlcz1ubyBhY194X2xpYnJhcmllcz1ubwotcm0gLWYgLXIgY29uZnRlc3QuZGlyCi1pZiBta2RpciBjb25mdGVzdC5kaXI7IHRoZW4KLSAgY2QgY29uZnRlc3QuZGlyCi0gIGNhdCA+SW1ha2VmaWxlIDw8J19BQ0VPRicKLWluY3Jvb3Q6Ci0JQGVjaG8gaW5jcm9vdD0nJHtJTkNST09UfScKLXVzcmxpYmRpcjoKLQlAZWNobyB1c3JsaWJkaXI9JyR7VVNSTElCRElSfScKLWxpYmRpcjoKLQlAZWNobyBsaWJkaXI9JyR7TElCRElSfScKLV9BQ0VPRgotICBpZiAoZXhwb3J0IENDOyAke1hNS01GLXhta21mfSkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mIE1ha2VmaWxlOyB0aGVuCi0gICAgIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotICAgIGZvciBhY192YXIgaW4gaW5jcm9vdCB1c3JsaWJkaXIgbGliZGlyOyBkbwotICAgICAgZXZhbCAiYWNfaW1fJGFjX3Zhcj1cYFwke01BS0UtbWFrZX0gJGFjX3ZhciAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy9eJGFjX3Zhcj0vL3AnXGAiCi0gICAgZG9uZQotICAgICMgT3BlbiBXaW5kb3dzIHhta21mIHJlcG9ydGVkbHkgc2V0cyBMSUJESVIgaW5zdGVhZCBvZiBVU1JMSUJESVIuCi0gICAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGFjX2ltX3VzcmxpYmRpci9saWJYMTEuJGFjX2V4dGVuc2lvbiIgJiYKLQkgdGVzdCAtZiAiJGFjX2ltX2xpYmRpci9saWJYMTEuJGFjX2V4dGVuc2lvbiI7IHRoZW4KLQlhY19pbV91c3JsaWJkaXI9JGFjX2ltX2xpYmRpcjsgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgICMgU2NyZWVuIG91dCBib2d1cyB2YWx1ZXMgZnJvbSB0aGUgaW1ha2UgY29uZmlndXJhdGlvbi4gIFRoZXkgYXJlCi0gICAgIyBib2d1cyBib3RoIGJlY2F1c2UgdGhleSBhcmUgdGhlIGRlZmF1bHQgYW55d2F5LCBhbmQgYmVjYXVzZQotICAgICMgdXNpbmcgdGhlbSB3b3VsZCBicmVhayBnY2Mgb24gc3lzdGVtcyB3aGVyZSBpdCBuZWVkcyBmaXhlZCBpbmNsdWRlcy4KLSAgICBjYXNlICRhY19pbV9pbmNyb290IGluCi0JL3Vzci9pbmNsdWRlKSBhY194X2luY2x1ZGVzPSA7OwotCSopIHRlc3QgLWYgIiRhY19pbV9pbmNyb290L1gxMS9Yb3MuaCIgJiYgYWNfeF9pbmNsdWRlcz0kYWNfaW1faW5jcm9vdDs7Ci0gICAgZXNhYwotICAgIGNhc2UgJGFjX2ltX3VzcmxpYmRpciBpbgotCS91c3IvbGliIHwgL3Vzci9saWI2NCB8IC9saWIgfCAvbGliNjQpIDs7Ci0JKikgdGVzdCAtZCAiJGFjX2ltX3VzcmxpYmRpciIgJiYgYWNfeF9saWJyYXJpZXM9JGFjX2ltX3VzcmxpYmRpciA7OwotICAgIGVzYWMKLSAgZmkKLSAgY2QgLi4KLSAgcm0gLWYgLXIgY29uZnRlc3QuZGlyCi1maQotCi0jIFN0YW5kYXJkIHNldCBvZiBjb21tb24gZGlyZWN0b3JpZXMgZm9yIFggaGVhZGVycy4KLSMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgotYWNfeF9oZWFkZXJfZGlycz0nCi0vdXNyL1gxMS9pbmNsdWRlCi0vdXNyL1gxMVI3L2luY2x1ZGUKLS91c3IvWDExUjYvaW5jbHVkZQotL3Vzci9YMTFSNS9pbmNsdWRlCi0vdXNyL1gxMVI0L2luY2x1ZGUKLQotL3Vzci9pbmNsdWRlL1gxMQotL3Vzci9pbmNsdWRlL1gxMVI3Ci0vdXNyL2luY2x1ZGUvWDExUjYKLS91c3IvaW5jbHVkZS9YMTFSNQotL3Vzci9pbmNsdWRlL1gxMVI0Ci0KLS91c3IvbG9jYWwvWDExL2luY2x1ZGUKLS91c3IvbG9jYWwvWDExUjcvaW5jbHVkZQotL3Vzci9sb2NhbC9YMTFSNi9pbmNsdWRlCi0vdXNyL2xvY2FsL1gxMVI1L2luY2x1ZGUKLS91c3IvbG9jYWwvWDExUjQvaW5jbHVkZQotCi0vdXNyL2xvY2FsL2luY2x1ZGUvWDExCi0vdXNyL2xvY2FsL2luY2x1ZGUvWDExUjcKLS91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNgotL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI1Ci0vdXNyL2xvY2FsL2luY2x1ZGUvWDExUjQKLQotL3Vzci9YMzg2L2luY2x1ZGUKLS91c3IveDM4Ni9pbmNsdWRlCi0vdXNyL1hGcmVlODYvaW5jbHVkZS9YMTEKLQotL3Vzci9pbmNsdWRlCi0vdXNyL2xvY2FsL2luY2x1ZGUKLS91c3IvdW5zdXBwb3J0ZWQvaW5jbHVkZQotL3Vzci9hdGhlbmEvaW5jbHVkZQotL3Vzci9sb2NhbC94MTFyNS9pbmNsdWRlCi0vdXNyL2xwcC9YYW1wbGVzL2luY2x1ZGUKLQotL3Vzci9vcGVud2luL2luY2x1ZGUKLS91c3Ivb3Blbndpbi9zaGFyZS9pbmNsdWRlJwotCi1pZiB0ZXN0ICIkYWNfeF9pbmNsdWRlcyIgPSBubzsgdGhlbgotICAjIEd1ZXNzIHdoZXJlIHRvIGZpbmQgaW5jbHVkZSBmaWxlcywgYnkgbG9va2luZyBmb3IgWGxpYi5oLgotICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gICMgV2UgY2FuIGNvbXBpbGUgdXNpbmcgWCBoZWFkZXJzIHdpdGggbm8gc3BlY2lhbCBpbmNsdWRlIGRpcmVjdG9yeS4KLWFjX3hfaW5jbHVkZXM9Ci1lbHNlCi0gIGZvciBhY19kaXIgaW4gJGFjX3hfaGVhZGVyX2RpcnM7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19kaXIvWDExL1hsaWIuaCI7IHRoZW4KLSAgICBhY194X2luY2x1ZGVzPSRhY19kaXIKLSAgICBicmVhawotICBmaQotZG9uZQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLWZpICMgJGFjX3hfaW5jbHVkZXMgPSBubwotCi1pZiB0ZXN0ICIkYWNfeF9saWJyYXJpZXMiID0gbm87IHRoZW4KLSAgIyBDaGVjayBmb3IgdGhlIGxpYnJhcmllcy4KLSAgIyBTZWUgaWYgd2UgZmluZCB0aGVtIHdpdGhvdXQgYW55IHNwZWNpYWwgb3B0aW9ucy4KLSAgIyBEb24ndCBhZGQgdG8gJExJQlMgcGVybWFuZW50bHkuCi0gIGFjX3NhdmVfTElCUz0kTElCUwotICBMSUJTPSItbFgxMSAkTElCUyIKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLVhybUluaXRpYWxpemUgKCkKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBMSUJTPSRhY19zYXZlX0xJQlMKLSMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgotYWNfeF9saWJyYXJpZXM9Ci1lbHNlCi0gIExJQlM9JGFjX3NhdmVfTElCUwotZm9yIGFjX2RpciBpbiBgJGFzX2VjaG8gIiRhY194X2luY2x1ZGVzICRhY194X2hlYWRlcl9kaXJzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2dgCi1kbwotICAjIERvbid0IGV2ZW4gYXR0ZW1wdCB0aGUgaGFpciBvZiB0cnlpbmcgdG8gbGluayBhbiBYIHByb2dyYW0hCi0gIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbCBkeWxpYiBsYSBkbGw7IGRvCi0gICAgaWYgdGVzdCAtciAiJGFjX2Rpci9saWJYMTEuJGFjX2V4dGVuc2lvbiI7IHRoZW4KLSAgICAgIGFjX3hfbGlicmFyaWVzPSRhY19kaXIKLSAgICAgIGJyZWFrIDIKLSAgICBmaQotICBkb25lCi1kb25lCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpICMgJGFjX3hfbGlicmFyaWVzID0gbm8KLQotY2FzZSAkYWNfeF9pbmNsdWRlcywkYWNfeF9saWJyYXJpZXMgaW4gIygKLSAgbm8sKiB8ICosbm8gfCAqXCcqKQotICAgICMgRGlkbid0IGZpbmQgWCwgb3IgYSBkaXJlY3RvcnkgaGFzICInIiBpbiBpdHMgbmFtZS4KLSAgICBhY19jdl9oYXZlX3g9ImhhdmVfeD1ubyI7OyAjKAotICAqKQotICAgICMgUmVjb3JkIHdoZXJlIHdlIGZvdW5kIFggZm9yIHRoZSBjYWNoZS4KLSAgICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXNcCi0JYWNfeF9pbmNsdWRlcz0nJGFjX3hfaW5jbHVkZXMnXAotCWFjX3hfbGlicmFyaWVzPSckYWNfeF9saWJyYXJpZXMnIgotZXNhYwotZmkKLTs7ICMoCi0gICAgKikgaGF2ZV94PXllczs7Ci0gIGVzYWMKLSAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKLWZpICMgJHdpdGhfeCAhPSBubwotCi1pZiB0ZXN0ICIkaGF2ZV94IiAhPSB5ZXM7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXZlX3giID4mNQotJGFzX2VjaG8gIiRoYXZlX3giID4mNjsgfQotICBub194PXllcwotZWxzZQotICAjIElmIGVhY2ggb2YgdGhlIHZhbHVlcyB3YXMgb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgb3ZlcnJpZGVzIGVhY2ggZ3Vlc3MuCi0gIHRlc3QgIngkeF9pbmNsdWRlcyIgPSB4Tk9ORSAmJiB4X2luY2x1ZGVzPSRhY194X2luY2x1ZGVzCi0gIHRlc3QgIngkeF9saWJyYXJpZXMiID0geE5PTkUgJiYgeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzCi0gICMgVXBkYXRlIHRoZSBjYWNoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBjb21tYW5kIGxpbmUgdmFsdWVzLgotICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXNcCi0JYWNfeF9pbmNsdWRlcz0nJHhfaW5jbHVkZXMnXAotCWFjX3hfbGlicmFyaWVzPSckeF9saWJyYXJpZXMnIgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlcyIgPiY1Ci0kYXNfZWNobyAibGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlcyIgPiY2OyB9Ci1maQotCi1pZiB0ZXN0ICIkbm9feCIgPSB5ZXM7IHRoZW4KLSAgIyBOb3QgYWxsIHByb2dyYW1zIG1heSB1c2UgdGhpcyBzeW1ib2wsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvIGRlZmluZSBpdC4KLQotJGFzX2VjaG8gIiNkZWZpbmUgWF9ESVNQTEFZX01JU1NJTkcgMSIgPj5jb25mZGVmcy5oCi0KLSAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQotZWxzZQotICBpZiB0ZXN0IC1uICIkeF9pbmNsdWRlcyI7IHRoZW4KLSAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCi0gIGZpCi0KLSAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgotICBpZiB0ZXN0IC1uICIkeF9saWJyYXJpZXMiOyB0aGVuCi0gICAgWF9MSUJTPSIkWF9MSUJTIC1MJHhfbGlicmFyaWVzIgotICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKLSAgICAjIG90aGVycyByZXF1aXJlIG5vIHNwYWNlLiAgV29yZHMgYXJlIG5vdCBzdWZmaWNpZW50IC4gLiAuIC4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLi4uICIgPiY2OyB9Ci0gICAgYWNfeHNhdmVfTElCUz0kTElCUzsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCi0gICAgYWNfeHNhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgIFhfTElCUz0iJFhfTElCUyAtUiR4X2xpYnJhcmllcyIKLWVsc2UKLSAgTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCSAgWF9MSUJTPSIkWF9MSUJTIC1SICR4X2xpYnJhcmllcyIKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5laXRoZXIgd29ya3MiID4mNQotJGFzX2VjaG8gIm5laXRoZXIgd29ya3MiID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBhY19jX3dlcnJvcl9mbGFnPSRhY194c2F2ZV9jX3dlcnJvcl9mbGFnCi0gICAgTElCUz0kYWNfeHNhdmVfTElCUwotICBmaQotCi0gICMgQ2hlY2sgZm9yIHN5c3RlbS1kZXBlbmRlbnQgbGlicmFyaWVzIFggcHJvZ3JhbXMgbXVzdCBsaW5rIHdpdGguCi0gICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCi0gICMgKC1sSUNFKSwgc2luY2Ugd2UgbWF5IG5lZWQgLWxzb2NrZXQgb3Igd2hhdGV2ZXIgZm9yIFggbGlua2luZy4KLQotICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgotICAgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbF9zIC1saW5ldCIKLSAgZWxzZQotICAgICMgTWFydHluIEpvaG5zb24gc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAotICAgICMgbGlicmFyaWVzIHdlcmUgYnVpbHQgd2l0aCBERUNuZXQgc3VwcG9ydC4gIEFuZCBLYXJsIEJlcnJ5IHNheXMKLSAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgotICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgJFhfTElCUyAtbFgxMSIKLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWE9wZW5EaXNwbGF5ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWE9wZW5EaXNwbGF5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZG5ldF9kbmV0X250b2ErOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRuZXQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuZXRfbnRvYSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuZXRfbnRvYSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZG5ldF9kbmV0X250b2E9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXQiCi1maQotCi0gICAgaWYgdGVzdCAkYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuZXRfbnRvYSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuZXRfbnRvYSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2E9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hIiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbmV0X3N0dWIiCi1maQotCi0gICAgZmkKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIExJQlM9IiRhY194c2F2ZV9MSUJTIgotCi0gICAgIyBtc2hAY2lzLnVmbC5lZHUgc2F5cyAtbG5zbCAoYW5kIC1sc29ja2V0KSBhcmUgbmVlZGVkIGZvciBoaXMgMzg2L0FULAotICAgICMgdG8gZ2V0IHRoZSBTeXNWIHRyYW5zcG9ydCBmdW5jdGlvbnMuCi0gICAgIyBDaGFkIFIuIExhcnNvbiBzYXlzIHRoZSBQeXJhbWlzIE1JUy1FUyBydW5uaW5nIERDL09TeCAoU1ZSNCkKLSAgICAjIG5lZWRzIC1sbnNsLgotICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5Ci0gICAgIyBvbiBJcml4IDUuMiwgYWNjb3JkaW5nIHRvIFQuRS4gRGlja2V5LgotICAgICMgVGhlIGZ1bmN0aW9ucyBnZXRob3N0YnluYW1lLCBnZXRzZXJ2YnluYW1lLCBhbmQgaW5ldF9hZGRyIGFyZQotICAgICMgaW4gLWxic2Qgb24gTHlueE9TIDMuMC4xL2kzODYsIGFjY29yZGluZyB0byBMYXJzIEhlY2tpbmcuCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotCi1maQotCi0gICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lID0gbm87IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGdldGhvc3RieW5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRob3N0YnluYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sbnNsIgotZmkKLQotICAgICAgaWYgdGVzdCAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lID0gbm87IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sYnNkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sYnNkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sYnNkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRob3N0YnluYW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ2V0aG9zdGJ5bmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6Ci0gIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGJzZCIKLWZpCi0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgbGllZGVyQHNreWxlci5tYXZkLmhvbmV5d2VsbC5jb20gc2F5cyB3aXRob3V0IC1sc29ja2V0LAotICAgICMgc29ja2V0L3NldHNvY2tvcHQgYW5kIG90aGVyIHJvdXRpbmVzIGFyZSB1bmRlZmluZWQgdW5kZXIgU0NPIE9EVAotICAgICMgMi4wLiAgQnV0IC1sc29ja2V0IGlzIGJyb2tlbiBvbiBJUklYIDUuMiAoYW5kIGlzIG5vdCBuZWNlc3NhcnkKLSAgICAjIG9uIGxhdGVyIHZlcnNpb25zKSwgc2F5cyBTaW1vbiBMZWluZW46IGl0IGNvbnRhaW5zIGdldGhvc3RieSoKLSAgICAjIHZhcmlhbnRzIHRoYXQgZG9uJ3QgdXNlIHRoZSBuYW1lIHNlcnZlciAob3Igc29tZXRoaW5nKS4gIC1sc29ja2V0Ci0gICAgIyBtdXN0IGJlIGdpdmVuIGJlZm9yZSAtbG5zbCBpZiBib3RoIGFyZSBuZWVkZWQuICBXZSBhc3N1bWUgdGhhdAotICAgICMgaWYgY29ubmVjdCBuZWVkcyAtbG5zbCwgc28gZG9lcyBnZXRob3N0YnluYW1lLgotICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImNvbm5lY3QiICJhY19jdl9mdW5jX2Nvbm5lY3QiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfY29ubmVjdCIgPSB4eWVzOyB0aGVuIDoKLQotZmkKLQotICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY29ubmVjdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGNvbm5lY3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0PXllcwotZWxzZQotICBhY19jdl9saWJfc29ja2V0X2Nvbm5lY3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiCi1maQotCi0gICAgZmkKLQotICAgICMgR3VpbGxlcm1vIEdvbWV6IHNheXMgLWxwb3NpeCBpcyBuZWNlc3Nhcnkgb24gQS9VWC4KLSAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJyZW1vdmUiICJhY19jdl9mdW5jX3JlbW92ZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19yZW1vdmUiID0geHllczsgdGhlbiA6Ci0KLWZpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3JlbW92ZSA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXguLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scG9zaXggICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHJlbW92ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHJlbW92ZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcG9zaXhfcmVtb3ZlPXllcwotZWxzZQotICBhY19jdl9saWJfcG9zaXhfcmVtb3ZlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcG9zaXhfcmVtb3ZlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSIgPSB4eWVzOyB0aGVuIDoKLSAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1scG9zaXgiCi1maQotCi0gICAgZmkKLQotICAgICMgQlNESSBCU0QvT1MgMi4xIG5lZWRzIC1saXBjIGZvciBYT3BlbkRpc3BsYXkuCi0gICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2htYXQiICJhY19jdl9mdW5jX3NobWF0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NobWF0IiA9IHh5ZXM7IHRoZW4gOgotCi1maQotCi0gICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19zaG1hdCA9IG5vOyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2lwY19zaG1hdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1saXBjICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaG1hdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHNobWF0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9pcGNfc2htYXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9pcGNfc2htYXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2lwY19zaG1hdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9pcGNfc2htYXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfaXBjX3NobWF0IiA9IHh5ZXM7IHRoZW4gOgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxpcGMiCi1maQotCi0gICAgZmkKLSAgZmkKLQotICAjIENoZWNrIGZvciBsaWJyYXJpZXMgdGhhdCBYMTFSNiBYdC9YYXcgcHJvZ3JhbXMgbmVlZC4KLSAgYWNfc2F2ZV9MREZMQUdTPSRMREZMQUdTCi0gIHRlc3QgLW4gIiR4X2xpYnJhcmllcyIgJiYgTERGTEFHUz0iJExERkxBR1MgLUwkeF9saWJyYXJpZXMiCi0gICMgU00gbmVlZHMgSUNFIHRvIChkeW5hbWljYWxseSkgbGluayB1bmRlciBTdW5PUyA0LnggKHNvIHdlIGhhdmUgdG8KLSAgIyBjaGVjayBmb3IgSUNFIGZpcnN0KSwgYnV0IHdlIG11c3QgbGluayBpbiB0aGUgb3JkZXIgLWxTTSAtbElDRSBvcgotICAjIHdlIGdldCB1bmRlZmluZWQgc3ltYm9scy4gIFNvIGFzc3VtZSB3ZSBoYXZlIFNNIGlmIHdlIGhhdmUgSUNFLgotICAjIFRoZXNlIGhhdmUgdG8gYmUgbGlua2VkIHdpdGggYmVmb3JlIC1sWDExLCB1bmxpa2UgdGhlIG90aGVyCi0gICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgotICAjIEpvaG4gSW50ZXJyYW50ZSwgS2FybCBCZXJyeQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sSUNFICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgSWNlQ29ubmVjdGlvbk51bWJlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIEljZUNvbm5lY3Rpb25OdW1iZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyPXllcwotZWxzZQotICBhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXI9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRV9MSUJTPSIkWF9QUkVfTElCUyAtbFNNIC1sSUNFIgotZmkKLQotICBMREZMQUdTPSRhY19zYXZlX0xERkxBR1MKLQotZmkKLQotCi0KLSMgU2VlIGlmIHdlIGFyZSB0byBidWlsZCB4MTF2bmM6Ci0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyOwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXgxMXZuYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeDExdm5jK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94MTF2bmM7Ci1maQotCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfeDExdm5jIiAtYSAiJHdpdGhfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JYnVpbGRfeDExdm5jPSJ5ZXMiCi1lbGlmIHRlc3QgIiRQQUNLQUdFX05BTUUiID0gIngxMXZuYyI7IHRoZW4KLQlidWlsZF94MTF2bmM9InllcyIKLWVsc2UKLQlidWlsZF94MTF2bmM9Im5vIgotZmkKLQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXhrZXlib2FyZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGtleWJvYXJkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94a2V5Ym9hcmQ7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgteGluZXJhbWEgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hpbmVyYW1hK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94aW5lcmFtYTsKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC14cmFuZHIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hyYW5kcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeHJhbmRyOwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXhmaXhlcyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGZpeGVzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF94Zml4ZXM7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgteGRhbWFnZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeGRhbWFnZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGRhbWFnZTsKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC14dHJhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfeHRyYXArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3h0cmFwOwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXhyZWNvcmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3hyZWNvcmQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3hyZWNvcmQ7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmJwbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZmJwbStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZmJwbTsKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kcG1zIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9kcG1zK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9kcG1zOwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXY0bCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdjRsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF92NGw7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmJkZXYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2ZiZGV2K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9mYmRldjsKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC11aW5wdXQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3VpbnB1dCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdWlucHV0OwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLW1hY29zeC1uYXRpdmUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX21hY29zeF9uYXRpdmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX21hY29zeF9uYXRpdmU7Ci1maQotCi0KLWZpCi0jIGVuZCB4MTF2bmMgb25seS4KLQotaWYgdGVzdCAieCR3aXRoX3giID0gInhubyI7IHRoZW4KLQlIQVZFX1gxMT0iZmFsc2UiCi1lbGlmIHRlc3QgIiRYX0NGTEFHUyIgIT0gIi1EWF9ESVNQTEFZX01JU1NJTkciOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEdldEltYWdlIGluIC1sWDExIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYR2V0SW1hZ2UgaW4gLWxYMTEuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFgxMSAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYR2V0SW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYR2V0SW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2U9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YMTFfWEdldEltYWdlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YMTFfWEdldEltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1gxMV9YR2V0SW1hZ2UiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWDExX1hHZXRJbWFnZSIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9YMTEgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YMTE9InRydWUiCi1lbHNlCi0gIEhBVkVfWDExPSJmYWxzZSIKLWZpCi0KLQotCSMgeDExdm5jIG9ubHk6Ci0JaWYgdGVzdCAkSEFWRV9YMTEgPSAidHJ1ZSIgLWEgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGV4dCIKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYU2htR2V0SW1hZ2UgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYU2htR2V0SW1hZ2UgaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X1hTaG1HZXRJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYU2htR2V0SW1hZ2UgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYU2htR2V0SW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9YU2htR2V0SW1hZ2U9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfWFNobUdldEltYWdlIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1hTSE0gMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYUmVhZFNjcmVlbiBpbiAtbFhleHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhSZWFkU2NyZWVuIGluIC1sWGV4dC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGV4dCAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYUmVhZFNjcmVlbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhSZWFkU2NyZWVuICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuPXllcwotZWxzZQotICBhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGV4dF9YUmVhZFNjcmVlbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YZXh0X1hSZWFkU2NyZWVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hleHRfWFJlYWRTY3JlZW4iID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfU09MQVJJU19YUkVBRFNDUkVFTiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJYMTEvZXh0ZW5zaW9ucy9yZWFkZGlzcGxheS5oIiAiYWNfY3ZfaGVhZGVyX1gxMV9leHRlbnNpb25zX3JlYWRkaXNwbGF5X2giICIjaW5jbHVkZSA8WDExL1hsaWIuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX1gxMV9leHRlbnNpb25zX3JlYWRkaXNwbGF5X2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfSVJJWF9YUkVBRERJU1BMQVkgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCi0JCWlmIHRlc3QgIngkd2l0aF9mYnBtIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRkJQTUZvcmNlTGV2ZWwgaW4gLWxYZXh0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBGQlBNRm9yY2VMZXZlbCBpbiAtbFhleHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhleHQgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgRkJQTUZvcmNlTGV2ZWwgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBGQlBNRm9yY2VMZXZlbCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWw9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hleHRfRkJQTUZvcmNlTGV2ZWwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGV4dF9GQlBNRm9yY2VMZXZlbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZXh0X0ZCUE1Gb3JjZUxldmVsIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0ZCUE0gMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfZHBtcyIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIERQTVNGb3JjZUxldmVsIGluIC1sWGV4dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgRFBNU0ZvcmNlTGV2ZWwgaW4gLWxYZXh0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZXh0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIERQTVNGb3JjZUxldmVsICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gRFBNU0ZvcmNlTGV2ZWwgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWw9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YZXh0X0RQTVNGb3JjZUxldmVsIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hleHRfRFBNU0ZvcmNlTGV2ZWwiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGV4dF9EUE1TRm9yY2VMZXZlbCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EUE1TIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWFRlc3RHcmFiQ29udHJvbCBpbiAtbFh0c3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhUZXN0R3JhYkNvbnRyb2wgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFh0c3QgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFRlc3RHcmFiQ29udHJvbCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhUZXN0R3JhYkNvbnRyb2wgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YdHN0X1hUZXN0R3JhYkNvbnRyb2wiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iLWxYdHN0ICRYX1BSRUxJQlMiCi0JCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX1hURVNUR1JBQkNPTlRST0wgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YVEVTVEdSQUJDT05UUk9MPSJ0cnVlIgotZmkKLQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhUZXN0RmFrZUtleUV2ZW50IGluIC1sWHRzdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQgaW4gLWxYdHN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYdHN0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhUZXN0RmFrZUtleUV2ZW50ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWFRlc3RGYWtlS2V5RXZlbnQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YdHN0X1hUZXN0RmFrZUtleUV2ZW50IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1h0c3RfWFRlc3RGYWtlS2V5RXZlbnQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHRzdF9YVGVzdEZha2VLZXlFdmVudCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSItbFh0c3QgJFhfUFJFTElCUyIKLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfWFRFU1QgMSIgPj5jb25mZGVmcy5oCi0gSEFWRV9YVEVTVD0idHJ1ZSIKLWZpCi0KLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJlY29yZCIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgaW4gLWxYdHN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIGluIC1sWHRzdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYdHN0ICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1h0c3RfWFJlY29yZEVuYWJsZUNvbnRleHRBc3luYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YdHN0X1hSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWHRzdF9YUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfUkVDT1JEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJIyB3ZSB1c2UgWFRSQVAgb24gWDExUjUsIG9yIHVzZXIgY2FuIHNldCBYMTFWTkNfVVNFX1hUUkFQCi0JCWlmIHRlc3QgIngkd2l0aF94dHJhcCIgIT0gInhubyI7IHRoZW4KLQkJICAgIGlmIHRlc3QgISAteiAiJFgxMVZOQ19VU0VfWFRSQVAiIC1vIC16ICIkSEFWRV9YVEVTVEdSQUJDT05UUk9MIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWEVUcmFwU2V0R3JhYlNlcnZlciBpbiAtbFhUcmFwIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYRVRyYXBTZXRHcmFiU2VydmVyIGluIC1sWFRyYXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhUcmFwICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYRVRyYXBTZXRHcmFiU2VydmVyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPXllcwotZWxzZQotICBhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWFRyYXBfWEVUcmFwU2V0R3JhYlNlcnZlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9YVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXIiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhUcmFwIgotCQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCWFRSQVAgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJCSMgdHJ1NjQgdXNlcyBsaWJYRVRyYXAuc28KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYRVRyYXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhFVHJhcFNldEdyYWJTZXJ2ZXIgaW4gLWxYRVRyYXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYRVRyYXAgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWEVUcmFwU2V0R3JhYlNlcnZlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhFVHJhcFNldEdyYWJTZXJ2ZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyPXllcwotZWxzZQotICBhY19jdl9saWJfWEVUcmFwX1hFVHJhcFNldEdyYWJTZXJ2ZXI9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hFVHJhcF9YRVRyYXBTZXRHcmFiU2VydmVyIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYRVRyYXAiCi0JCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJYVFJBUCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCQkgICAgZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGtleWJvYXJkIiAhPSAieG5vIjsgdGhlbgotCQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJFhfQ0ZMQUdTIgotCQkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIlgxMS9YS0JsaWIuaCIgImFjX2N2X2hlYWRlcl9YMTFfWEtCbGliX2giICIjaW5jbHVkZSA8WDExL1hsaWIuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX1gxMV9YS0JsaWJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9YS0JMSUJfSD0idHJ1ZSIKLWVsc2UKLSAgSEFWRV9YS0JMSUJfSD0iZmFsc2UiCi1maQotCi0KLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlpZiB0ZXN0ICRIQVZFX1hLQkxJQl9IID0gInRydWUiOyB0aGVuCi0JCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWGtiU2VsZWN0RXZlbnRzIGluIC1sWDExIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYa2JTZWxlY3RFdmVudHMgaW4gLWxYMTEuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFgxMSAkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBYa2JTZWxlY3RFdmVudHMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYa2JTZWxlY3RFdmVudHMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHM9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YMTFfWGtiU2VsZWN0RXZlbnRzIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1gxMV9Ya2JTZWxlY3RFdmVudHMiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWDExX1hrYlNlbGVjdEV2ZW50cyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9YS0VZQk9BUkQgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQkJCWZpCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hpbmVyYW1hIiAhPSAieG5vIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgWGluZXJhbWFRdWVyeVNjcmVlbnMgaW4gLWxYaW5lcmFtYSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWGluZXJhbWFRdWVyeVNjcmVlbnMgaW4gLWxYaW5lcmFtYS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbFhpbmVyYW1hICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhpbmVyYW1hUXVlcnlTY3JlZW5zICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWGluZXJhbWFRdWVyeVNjcmVlbnMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zPXllcwotZWxzZQotICBhY19jdl9saWJfWGluZXJhbWFfWGluZXJhbWFRdWVyeVNjcmVlbnM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hpbmVyYW1hX1hpbmVyYW1hUXVlcnlTY3JlZW5zIiA9IHh5ZXM7IHRoZW4gOgotICBYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYaW5lcmFtYSIKLQkJCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQlhJTkVSQU1BIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX3hyYW5kciIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhSUlNlbGVjdElucHV0IGluIC1sWHJhbmRyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBYUlJTZWxlY3RJbnB1dCBpbiAtbFhyYW5kci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYcmFuZHIgJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgWFJSU2VsZWN0SW5wdXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBYUlJTZWxlY3RJbnB1dCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0PXllcwotZWxzZQotICBhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9YcmFuZHJfWFJSU2VsZWN0SW5wdXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWHJhbmRyX1hSUlNlbGVjdElucHV0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX1hyYW5kcl9YUlJTZWxlY3RJbnB1dCIgPSB4eWVzOyB0aGVuIDoKLSAgWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWHJhbmRyIgotCQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCWFJBTkRSIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWFJBTkRSPSJ0cnVlIgotZmkKLQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94Zml4ZXMiICE9ICJ4bm8iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYRml4ZXNHZXRDdXJzb3JJbWFnZSBpbiAtbFhmaXhlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgaW4gLWxYZml4ZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sWGZpeGVzICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhGaXhlc0dldEN1cnNvckltYWdlICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGZpeGVzX1hGaXhlc0dldEN1cnNvckltYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX1hmaXhlc19YRml4ZXNHZXRDdXJzb3JJbWFnZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9YZml4ZXNfWEZpeGVzR2V0Q3Vyc29ySW1hZ2UiID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhmaXhlcyIKLQkJCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQlhGSVhFUyAxIiA+PmNvbmZkZWZzLmgKLSBIQVZFX0xJQlhGSVhFUz0idHJ1ZSIKLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGRhbWFnZSIgIT0gInhubyI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX1hkYW1hZ2VfWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxYZGFtYWdlICRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb249eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9YZGFtYWdlX1hEYW1hZ2VRdWVyeUV4dGVuc2lvbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfWGRhbWFnZV9YRGFtYWdlUXVlcnlFeHRlbnNpb24iID0geHllczsgdGhlbiA6Ci0gIFhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhkYW1hZ2UiCi0JCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJYREFNQUdFIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElCWERBTUFHRT0idHJ1ZSIKLWZpCi0KLQkJZmkKLQotCQlpZiB0ZXN0ICEgLXogIiRIQVZFX0xJQlhGSVhFUyIgLW8gISAteiAiJEhBVkVfTElCWERBTUFHRSI7IHRoZW4KLQkJCSMgbmVlZCAvdXNyL3Nmdy9saWIgaW4gUlBBVEggZm9yIFNvbGFyaXMgMTAgYW5kIGxhdGVyCi0JCQljYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLQkJCSJTdW5PUyA1IiopIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtUi91c3Ivc2Z3L2xpYiIgOzsKLQkJCWVzYWMKLQkJZmkKLQkJaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJYUkFORFIiOyB0aGVuCi0JCQkjIGFsc28gbmVlZCAvdXNyL1gxMS9pbmNsdWRlIGZvciBTb2xhcmlzIDEwIDEwLzA4IGFuZCBsYXRlcgotCQkJY2FzZSBgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIGluCi0JCQkiU3VuT1MgNSIqKSBDUFBGTEFHUz0iJENQUEZMQUdTIC1JL3Vzci9YMTEvaW5jbHVkZSIgOzsKLQkJCWVzYWMKLQkJZmkKLQotCQlYX0xJQlM9IiRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTIgotCWZpCi0JIyBlbmQgeDExdm5jIG9ubHkuCi1maQotCi0KLSBpZiB0ZXN0ICRIQVZFX1gxMSAhPSAiZmFsc2UiOyB0aGVuCi0gIEhBVkVfWDExX1RSVUU9Ci0gIEhBVkVfWDExX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX1gxMV9UUlVFPScjJwotICBIQVZFX1gxMV9GQUxTRT0KLWZpCi0KLQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQotaWYgdGVzdCAieCRIQVZFX1gxMSIgPSAieGZhbHNlIiAtYSAieCR3aXRoX3giICE9ICJ4bm8iOyB0aGVuCi0JYXNfZm5fZXJyb3IgJD8gIgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBBIHdvcmtpbmcgWCB3aW5kb3cgc3lzdGVtIGJ1aWxkIGVudmlyb25tZW50IGlzIHJlcXVpcmVkIHRvIGJ1aWxkICoqKgoteDExdm5jLiAgTWFrZSBzdXJlIGFueSByZXF1aXJlZCBYIGRldmVsb3BtZW50IHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQuCi1JZiB0aGV5IGFyZSBpbnN0YWxsZWQgaW4gbm9uLXN0YW5kYXJkIGxvY2F0aW9ucywgb25lIGNhbiB1c2UgdGhlCi0tLXgtaW5jbHVkZXM9RElSIGFuZCAtLXgtbGlicmFyaWVzPURJUiBjb25maWd1cmUgb3B0aW9ucyBvciBzZXQgdGhlCi1DUFBGTEFHUyBhbmQgTERGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIFgKLXdpbmRvdyBzeXN0ZW0gaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMgbWF5IGJlIGZvdW5kLiAgT24gNjQrMzIgYml0Ci1tYWNoaW5lcyB5b3UgbWF5IG5lZWQgdG8gcG9pbnQgdG8gbGliNjQgb3IgbGliMzIgZGlyZWN0b3JpZXMgdG8gcGljayB1cAotdGhlIGNvcnJlY3Qgd29yZCBzaXplLgotCi1JZiB5b3Ugd2FudCB0byBidWlsZCB4MTF2bmMgd2l0aG91dCBYIHN1cHBvcnQgKGUuZy4gZm9yIC1yYXdmYiB1c2Ugb25seQotb3IgZm9yIG5hdGl2ZSBNYWMgT1MgWCksIHNwZWNpZnkgdGhlIC0td2l0aG91dC14IGNvbmZpZ3VyZSBvcHRpb24uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiAiJExJTkVOTyIgNQotZmkKLQotaWYgdGVzdCAieCRIQVZFX1gxMSIgPSAieHRydWUiIC1hICJ4JEhBVkVfWFRFU1QiICE9ICJ4dHJ1ZSI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIEEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIFhURVNUIGV4dGVuc2lvbiB3YXMgbm90IGZvdW5kICoqKgotKGxpYlh0c3QpLiAgQW4geDExdm5jIGJ1aWx0IHRoaXMgd2F5IHdpbGwgYmUgKk9OTFkgQkFSRUxZIFVTQUJMRSouCi1Zb3Ugd2lsbCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlIGJ1dCBub3QgY2xpY2sgb3IgdHlwZS4gIFRoZXJlIGNhbgotYWxzbyBiZSBkZWFkbG9ja3MgaWYgYW4gYXBwbGljYXRpb24gZ3JhYnMgdGhlIFggc2VydmVyLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0YWxsIHRoZSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQgcGFja2FnZXMKLWZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgotY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBBIHdvcmtpbmcgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBYVEVTVCBleHRlbnNpb24gd2FzIG5vdCBmb3VuZCAqKioKLShsaWJYdHN0KS4gIEFuIHgxMXZuYyBidWlsdCB0aGlzIHdheSB3aWxsIGJlICpPTkxZIEJBUkVMWSBVU0FCTEUqLgotWW91IHdpbGwgYmUgYWJsZSB0byBtb3ZlIHRoZSBtb3VzZSBidXQgbm90IGNsaWNrIG9yIHR5cGUuICBUaGVyZSBjYW4KLWFsc28gYmUgZGVhZGxvY2tzIGlmIGFuIGFwcGxpY2F0aW9uIGdyYWJzIHRoZSBYIHNlcnZlci4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzCi1mb3IgWFRFU1QgKHBlcmhhcHMgaXQgaXMgbmFtZWQgc29tZXRoaW5nIGxpa2UgbGlieHRzdC1kZXYpIGFuZCBydW4KLWNvbmZpZ3VyZSBhZ2Fpbi4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0Jc2xlZXAgNQotZmkKLQotaWYgdGVzdCAieCR3aXRoX3Y0bCIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvdmlkZW9kZXYuaCIgImFjX2N2X2hlYWRlcl9saW51eF92aWRlb2Rldl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF92aWRlb2Rldl9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJTlVYX1ZJREVPREVWX0ggMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotZmkKLWlmIHRlc3QgIngkd2l0aF9mYmRldiIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvZmIuaCIgImFjX2N2X2hlYWRlcl9saW51eF9mYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9mYl9oIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJTlVYX0ZCX0ggMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotZmkKLWlmIHRlc3QgIngkd2l0aF91aW5wdXQiICE9ICJ4bm8iOyB0aGVuCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L2lucHV0LmgiICJhY19jdl9oZWFkZXJfbGludXhfaW5wdXRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfaW5wdXRfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSU5VWF9JTlBVVF9IIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTElOVVhfSU5QVVRfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9MSU5VWF9JTlBVVF9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImxpbnV4L3VpbnB1dC5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3VpbnB1dF9oIiAiI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF91aW5wdXRfaCIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSU5VWF9VSU5QVVRfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0JZmkKLWZpCi0KLWlmIHRlc3QgIngkd2l0aF9tYWNvc3hfbmF0aXZlIiAhPSAieG5vIjsgdGhlbgotCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIENoZWNrIGZvciBPUyBYIG9wZW5nbCBoZWFkZXIKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJPcGVuR0wvT3BlbkdMLmgiICJhY19jdl9oZWFkZXJfT3BlbkdMX09wZW5HTF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9PcGVuR0xfT3BlbkdMX2giID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFDT1NYX09QRU5HTF9IIDEiID4+Y29uZmRlZnMuaAotIEhBVkVfTUFDT1NYX09QRU5HTF9IPSJ0cnVlIgotZmkKLQotCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWF2YWhpIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9hdmFoaStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYXZhaGk7Ci1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfYXZhaGkiICE9ICJ4bm8iOyB0aGVuCi0JcHJpbnRmICJjaGVja2luZyBmb3IgYXZhaGkuLi4gIgotCWlmIHRlc3QgISAteiAiJHdpdGhfYXZhaGkiIC1hICJ4JHdpdGhfYXZhaGkiICE9ICJ4eWVzIjsgdGhlbgotCQlBVkFISV9DRkxBR1M9Ii1JJHdpdGhfYXZhaGkvaW5jbHVkZSIKLQkJQVZBSElfTElCUz0iLUwkd2l0aF9hdmFoaS9saWIgLWxhdmFoaS1jb21tb24gLWxhdmFoaS1jbGllbnQiCi0JCWVjaG8gInVzaW5nICR3aXRoX2F2YWhpIgotCQl3aXRoX2F2YWhpPXllcwotCWVsaWYgcGtnLWNvbmZpZyAtLWF0bGVhc3QtdmVyc2lvbj0wLjYuNCBhdmFoaS1jbGllbnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUFWQUhJX0NGTEFHUz1gcGtnLWNvbmZpZyAtLWNmbGFncyBhdmFoaS1jbGllbnRgCi0JCUFWQUhJX0xJQlM9YHBrZy1jb25maWcgLS1saWJzIGF2YWhpLWNsaWVudGAKLQkJd2l0aF9hdmFoaT15ZXMKLQkJZWNobyB5ZXMKLQllbHNlCi0JCXdpdGhfYXZhaGk9bm8KLQkJZWNobyBubwotCWZpCi1maQotaWYgdGVzdCAieCR3aXRoX2F2YWhpIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVZBSEkgMSIgPj5jb25mZGVmcy5oCi0KLQotCi1maQotCi1maQotIyBlbmQgeDExdm5jIG9ubHkuCi0KLSMgb25seSB1c2VkIGluIHgxMXZuYy9NYWtlZmlsZS5hbSBidXQgbmVlZHMgdG8gYWx3YXlzIGJlIGRlZmluZWQ6Ci0gaWYgdGVzdCAiJEhBVkVfTUFDT1NYX09QRU5HTF9IIiA9ICJ0cnVlIjsgdGhlbgotICBPU1hfT1BFTkdMX1RSVUU9Ci0gIE9TWF9PUEVOR0xfRkFMU0U9JyMnCi1lbHNlCi0gIE9TWF9PUEVOR0xfVFJVRT0nIycKLSAgT1NYX09QRU5HTF9GQUxTRT0KLWZpCi0KLQotIyBDaGVja3MgZm9yIGxpYnJhcmllcy4KLQotaWYgdGVzdCAhIC16ICIkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAtYSAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiICE9ICJ4bm8iOyB0aGVuCi0JcHJpbnRmICJjaGVja2luZyBmb3Igc3lzdGVtIGxpYnZuY3NlcnZlci4uLiAiCi0Jdm5lZWQ9IjAuOS4xIgotCWlmIHRlc3QgIlgkVk5FRUQiICE9ICJYIjsgdGhlbgotCQl2bmVlZD0kVk5FRUQKLQlmaQotCWlmIHRlc3QgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAhPSAieHllcyI7IHRoZW4KLQkJcmZsYWc9IiIKLQkJaWYgdGVzdCAieCRsZF9taW51c19SIiA9ICJ4bm8iOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCi0JCQlyZmxhZz0iLVhsaW5rZXIgLVIkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyL2xpYiIKLQkJZWxzZQotCQkJcmZsYWc9Ii1SJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIiCi0JCWZpCi0JCWNtZD0iJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9iaW4vbGlidm5jc2VydmVyLWNvbmZpZyIKLQkJaWYgJGNtZCAtLXZlcnNpb24gMT4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJY3ZlcnM9YCRjbWQgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAotCQkJY3Njb3JlPWBlY2hvICIkY3ZlcnMiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0JCQluc2NvcmU9YGVjaG8gIiR2bmVlZCIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQotCQkJaWYgdGVzdCAkY3Njb3JlIC1sdCAkbnNjb3JlOyB0aGVuCi0JCQkJZWNobyAibm8iCi0JCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPW5vCi0JCQkJYXNfZm5fZXJyb3IgJD8gIgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBOZWVkIGxpYnZuY3NlcnZlciB2ZXJzaW9uICR2bmVlZCwgaGF2ZSB2ZXJzaW9uICRjdmVycyAqKioKLVlvdSBhcmUgYnVpbGRpbmcgd2l0aCBhIHN5c3RlbSBpbnN0YWxsZWQgbGlidm5jc2VydmVyIGFuZCBpdCBpcyBub3QKLW5ldyBlbm91Z2guCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiAiJExJTkVOTyIgNQotCQkJZWxzZQotCQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTPSItSSR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvaW5jbHVkZSIKLQkJCQlTWVNURU1fTElCVk5DU0VSVkVSX0xJQlM9Ii1MJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIgJHJmbGFnIC1sdm5jc2VydmVyIC1sdm5jY2xpZW50IgotCQkJCWVjaG8gInVzaW5nICR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiCi0JCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPXllcwotCQkJZmkKLQkJZWxzZQotCQkJZWNobyAiICoqKiBjYW5ub3QgcnVuICRjbWQgKioqICIgMT4mMgotCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPW5vCi0JCQllY2hvIG5vCi0JCWZpCi0JZWxpZiBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXJmbGFnPSIiCi0JCXJwcmVmaXg9YGxpYnZuY3NlcnZlci1jb25maWcgLS1wcmVmaXhgCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJcmZsYWc9IiAtWGxpbmtlciAtUiRycHJlZml4L2xpYiAiCi0JCWVsc2UKLQkJCXJmbGFnPSIgLVIkcnByZWZpeC9saWIgIgotCQlmaQotCQljdmVycz1gbGlidm5jc2VydmVyLWNvbmZpZyAtLXZlcnNpb24gMj4vZGV2L251bGxgCi0JCWNzY29yZT1gZWNobyAiJGN2ZXJzIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCQluc2NvcmU9YGVjaG8gIiR2bmVlZCIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQotCQlpZiB0ZXN0ICRjc2NvcmUgLWx0ICRuc2NvcmU7IHRoZW4KLQkJCWVjaG8gIm5vIgotCQkJCWFzX2ZuX2Vycm9yICQ/ICIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogTmVlZCBsaWJ2bmNzZXJ2ZXIgdmVyc2lvbiAkdm5lZWQsIGhhdmUgdmVyc2lvbiAkY3ZlcnMgKioqCi1Zb3UgYXJlIGJ1aWxkaW5nIHdpdGggYSBzeXN0ZW0gaW5zdGFsbGVkIGxpYnZuY3NlcnZlciBhbmQgaXQgaXMgbm90Ci1uZXcgZW5vdWdoLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgIiRMSU5FTk8iIDUKLQkJZWxzZQotCQkJU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1M9YGxpYnZuY3NlcnZlci1jb25maWcgLS1jZmxhZ3NgCi0JCQlTWVNURU1fTElCVk5DU0VSVkVSX0xJQlM9IiRyZmxhZyJgbGlidm5jc2VydmVyLWNvbmZpZyAtLWxpYnNgCi0JCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9eWVzCi0JCQllY2hvIHllcwotCQlmaQotCWVsc2UKLQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPW5vCi0JCWVjaG8gbm8KLQlmaQotZmkKLQotaWYgdGVzdCAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiID0gInh5ZXMiOyB0aGVuCi0JJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSIDEiID4+Y29uZmRlZnMuaAotCi0KLQotZmkKLSBpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgPSAieHllcyI7IHRoZW4KLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9Ci0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUU9JyMnCi0gIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRT0KLWZpCi0KLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtanBlZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfanBlZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfanBlZzsKLWZpCi0KLQotIyBBdCB0aGlzIHBvaW50OgotIwlubyBqcGVnIG9uIGNvbW1hbmQgbGluZSAgIHdpdGhfanBlZz0iIgotIwktd2l0aC1qcGVnICAgICAgICAgICAgICAgIHdpdGhfanBlZz0ieWVzIgotIwktd2l0aG91dC1qcGVnICAgICAgICAgICAgIHdpdGhfanBlZz0ibm8iCi0jCS13aXRoLWpwZWc9L2Zvby9kaXIgICAgICAgd2l0aF9qcGVnPSIvZm9vL2RpciIKLQotSEFWRV9MSUJKUEVHX1RVUkJPPSJmYWxzZSIKLQotaWYgdGVzdCAieCR3aXRoX2pwZWciICE9ICJ4bm8iOyB0aGVuCi0KLQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCXNhdmVkX0xJQlM9IiRMSUJTIgotCWlmIHRlc3QgISAteiAiJHdpdGhfanBlZyIgLWEgIngkd2l0aF9qcGVnIiAhPSAieHllcyI7IHRoZW4KLQkJIyBhZGQgdXNlciBzdXBwbGllZCBkaXJlY3RvcnkgdG8gZmxhZ3M6Ci0JCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aF9qcGVnL2luY2x1ZGUiCi0JCUxERkxBR1M9IiRMREZMQUdTIC1MJHdpdGhfanBlZy9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJIyB0aGlzIGlzIG5vdCBjb21wbGV0ZS4uLiBpbiBnZW5lcmFsIGEgcmF0J3MgbmVzdC4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfanBlZy9saWIiCi0JCWVsc2UKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHdpdGhfanBlZy9saWIiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICJ4JEpQRUdfTERGTEFHUyIgIT0gIngiOyB0aGVuCi0JCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCQlMSUJTPSIkTElCUyAkSlBFR19MREZMQUdTIgotCWVsc2UKLQkJTElCUz0iLWxqcGVnIgotCWZpCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImpwZWdsaWIuaCIgImFjX2N2X2hlYWRlcl9qcGVnbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2pwZWdsaWJfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9KUEVHTElCX0g9InRydWUiCi1maQotCi0KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBqcGVnX0NyZWF0ZUNvbXByZXNzIGluIGxpYmpwZWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGpwZWdfQ3JlYXRlQ29tcHJlc3MgaW4gbGlianBlZy4uLiAiID4mNjsgfQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giID0gInh0cnVlIjsgdGhlbgotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIganBlZ19DcmVhdGVDb21wcmVzcyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGpwZWdfQ3JlYXRlQ29tcHJlc3MgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH07Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCSlBFRyAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH07IEhBVkVfSlBFR0xJQl9IPSIiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQlmaQotCWlmIHRlc3QgIngkSEFWRV9KUEVHTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCSMgcmVzdG9yZSBvbGQgZmxhZ3Mgb24gZmFpbHVyZToKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKLQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlianBlZyBjb21wcmVzc2lvbiBsaWJyYXJ5IHdhcyBub3QgZm91bmQuICoqKgotVGhpcyBtYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IG92ZXIgc2xvdyBsaW5rcy4KLUlmIGxpYmpwZWcgaXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24gdXNlIC0td2l0aC1qcGVnPURJUiB0bwotaW5kaWNhdGUgdGhlIGhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL2pwZWdsaWIuaCBhbmQgdGhlIGxpYnJhcnkKLWluIERJUi9saWIvbGlianBlZy5hLiAgWW91IGNhbiBhbHNvIHNldCB0aGUgSlBFR19MREZMQUdTIHZhcmlhYmxlIHRvCi1zcGVjaWZ5IG1vcmUgZGV0YWlsZWQgbGlua2VyIGZsYWdzLiAgQSBjb3B5IG9mIGxpYmpwZWctdHVyYm8gbWF5IGJlCi1vYnRhaW5lZCBmcm9tOiAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8KLUEgY29weSBvZiBsaWJqcGVnIG1heSBiZSBvYnRhaW5lZCBmcm9tOiAgaHR0cDovL2lqZy5vcmcvZmlsZXMvCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlianBlZyBpcyBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiB1c2UgLS13aXRoLWpwZWc9RElSIHRvCi1pbmRpY2F0ZSB0aGUgaGVhZGVyIGZpbGUgaXMgaW4gRElSL2luY2x1ZGUvanBlZ2xpYi5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJqcGVnLmEuICBZb3UgY2FuIGFsc28gc2V0IHRoZSBKUEVHX0xERkxBR1MgdmFyaWFibGUgdG8KLXNwZWNpZnkgbW9yZSBkZXRhaWxlZCBsaW5rZXIgZmxhZ3MuICBBIGNvcHkgb2YgbGlianBlZy10dXJibyBtYXkgYmUKLW9idGFpbmVkIGZyb206ICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJqcGVnLXR1cmJvL2ZpbGVzLwotQSBjb3B5IG9mIGxpYmpwZWcgbWF5IGJlIG9idGFpbmVkIGZyb206ICBodHRwOi8vaWpnLm9yZy9maWxlcy8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0KLQlpZiB0ZXN0ICJ4JEhBVkVfSlBFR0xJQl9IIiA9ICJ4dHJ1ZSI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEpQRUcgbGlicmFyeSBpcyBsaWJqcGVnLXR1cmJvIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgSlBFRyBsaWJyYXJ5IGlzIGxpYmpwZWctdHVyYm8uLi4gIiA+JjY7IH0KLQotCQlpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiOyB0aGVuCi0JCQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JCQkJI2luY2x1ZGUgPGpwZWdsaWIuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotCQkJCXN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotCQkJCWNpbmZvLmVycj1qcGVnX3N0ZF9lcnJvcigmamVycik7Ci0JCQkJanBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLQkJCQljaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKLQkJCQlqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotCQkJCWNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0VYVF9SR0I7Ci0JCQkJanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKLQkJCQlyZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgSEFWRV9MSUJKUEVHX1RVUkJPPSJ0cnVlIjsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCQllbHNlCi0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQkJCQkjaW5jbHVkZSA8anBlZ2xpYi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0JCQkJc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0JCQkJY2luZm8uZXJyPWpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKLQkJCQlqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOwotCQkJCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwotCQkJCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7Ci0JCQkJY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfRVhUX1JHQjsKLQkJCQlqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSgmY2luZm8pOwotCQkJCXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgSEFWRV9MSUJKUEVHX1RVUkJPPSJ0cnVlIjsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJZmkKLQlmaQotCi0JaWYgdGVzdCAieCRIQVZFX0pQRUdMSUJfSCIgPSAieHRydWUiIC1hICJ4JEhBVkVfTElCSlBFR19UVVJCTyIgIT0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGxpYnJhcnkgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGlzIG5vdCBsaWJqcGVnLXR1cmJvLgotUGVyZm9ybWFuY2Ugd2lsbCBiZSByZWR1Y2VkLiAgWW91IGNhbiBvYnRhaW4gbGlianBlZy10dXJibyBmcm9tOgotaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8gKioqCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIFRoZSBsaWJqcGVnIGxpYnJhcnkgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGlzIG5vdCBsaWJqcGVnLXR1cmJvLgotUGVyZm9ybWFuY2Ugd2lsbCBiZSByZWR1Y2VkLiAgWW91IGNhbiBvYnRhaW4gbGlianBlZy10dXJibyBmcm9tOgotaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlianBlZy10dXJiby9maWxlcy8gKioqCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIiA+JjI7fQotICBmaQotCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcG5nIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9wbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3BuZzsKLWZpCi0KLQotIyBBdCB0aGlzIHBvaW50OgotIwlubyBwbmcgb24gY29tbWFuZCBsaW5lICAgIHdpdGhfcG5nPSIiCi0jCS13aXRoLXBuZyAgICAgICAgICAgICAgICAgd2l0aF9wbmc9InllcyIKLSMJLXdpdGhvdXQtcG5nICAgICAgICAgICAgICB3aXRoX3BuZz0ibm8iCi0jCS13aXRoLXBuZz0vZm9vL2RpciAgICAgICAgd2l0aF9wbmc9Ii9mb28vZGlyIgotCi1pZiB0ZXN0ICJ4JHdpdGhfcG5nIiAhPSAieG5vIjsgdGhlbgotCWlmIHRlc3QgISAteiAiJHdpdGhfcG5nIiAtYSAieCR3aXRoX3BuZyIgIT0gInh5ZXMiOyB0aGVuCi0JCSMgYWRkIHVzZXIgc3VwcGxpZWQgZGlyZWN0b3J5IHRvIGZsYWdzOgotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR3aXRoX3BuZy9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3BuZy9saWIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJIyB0aGlzIGlzIG5vdCBjb21wbGV0ZS4uLiBpbiBnZW5lcmFsIGEgcmF0J3MgbmVzdC4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfcG5nL2xpYiIKLQkJZWxzZQotCQkJTERGTEFHUz0iJExERkxBR1MgLVIkd2l0aF9wbmcvbGliIgotCQlmaQotCWZpCi0JYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInBuZy5oIiAiYWNfY3ZfaGVhZGVyX3BuZ19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wbmdfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9QTkdMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9QTkdMSUJfSCIgPSAieHRydWUiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IGluIC1scG5nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCBpbiAtbHBuZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwbmcgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcG5nX3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3BuZ19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wbmdfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJQTkcgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwbmcgJExJQlMiCi0KLWVsc2UKLSAgSEFWRV9QTkdMSUJfSD0iIgotZmkKLQotCWZpCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9wbmciIC1hICJ4JHdpdGhfcG5nIiAhPSAieHllcyI7IHRoZW4KLQkJaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQkjIHJlc3RvcmUgb2xkIGZsYWdzIG9uIGZhaWx1cmU6Ci0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JCWlmIHRlc3QgIngkSEFWRV9QTkdMSUJfSCIgIT0gInh0cnVlIjsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlicG5nIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlicG5nIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtcG5nPURJUiB0bwotaW5kaWNhdGUgdGhlIGhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3BuZy5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJwbmcuYS4gIEEgY29weSBvZiBsaWJwbmcgbWF5IGJlIG9idGFpbmVkIGZyb206Ci1odHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBUaGUgbGlicG5nIGNvbXByZXNzaW9uIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gKioqCi1UaGlzIG1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgb3ZlciBzbG93IGxpbmtzLgotSWYgbGlicG5nIGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtcG5nPURJUiB0bwotaW5kaWNhdGUgdGhlIGhlYWRlciBmaWxlIGlzIGluIERJUi9pbmNsdWRlL3BuZy5oIGFuZCB0aGUgbGlicmFyeQotaW4gRElSL2xpYi9saWJwbmcuYS4gIEEgY29weSBvZiBsaWJwbmcgbWF5IGJlIG9idGFpbmVkIGZyb206Ci1odHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiYyO30KLQkJCXNsZWVwIDUKLQkJZmkKLQlmaQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYnogd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2xpYnorc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2xpYno7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtemxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfemxpYitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfemxpYjsKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX3psaWIiICE9ICJ4bm8iIC1hICJ4JHdpdGhfbGlieiIgIT0gInhubyI7IHRoZW4KLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3psaWIiIC1hICJ4JHdpdGhfemxpYiIgIT0gInh5ZXMiOyB0aGVuCi0JCXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0JCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHdpdGhfemxpYi9pbmNsdWRlIgotCQlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRoX3psaWIvbGliIgotCQlpZiB0ZXN0ICJ4JGxkX21pbnVzX1IiID0gInhubyI7IHRoZW4KLQkJCToKLQkJZWxpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1YbGlua2VyIC1SJHdpdGhfemxpYi9saWIiCi0JCWVsc2UKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHdpdGhfemxpYi9saWIiCi0JCWZpCi0JZmkKLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiemxpYi5oIiAiYWNfY3ZfaGVhZGVyX3psaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfemxpYl9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1pMSUJfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgIngkSEFWRV9aTElCX0giID0gInh0cnVlIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZWZsYXRlIGluIC1seiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmbGF0ZSBpbiAtbHouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3pfZGVmbGF0ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1seiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGVmbGF0ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRlZmxhdGUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3pfZGVmbGF0ZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfel9kZWZsYXRlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl96X2RlZmxhdGUiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJaIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1seiAkTElCUyIKLQotZWxzZQotICBIQVZFX1pMSUJfSD0iIgotZmkKLQotCWZpCi0JaWYgdGVzdCAhIC16ICIkd2l0aF96bGliIiAtYSAieCR3aXRoX3psaWIiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0ICJ4JEhBVkVfWkxJQl9IIiAhPSAieHRydWUiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgotCQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWZpCi0JZmkKLQlpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JCWlmIHRlc3QgIngkSEFWRV9aTElCX0giICE9ICJ4dHJ1ZSI7IHRoZW4KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnogY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJ6IGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtemxpYj1ESVIgdG8gaW5kaWNhdGUgdGhlCi1oZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS96bGliLmggYW5kIHRoZSBsaWJyYXJ5IGluIERJUi9saWIvbGliei5hLgotQSBjb3B5IG9mIGxpYnogbWF5IGJlIG9idGFpbmVkIGZyb206IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogVGhlIGxpYnogY29tcHJlc3Npb24gbGlicmFyeSB3YXMgbm90IGZvdW5kLiAqKioKLVRoaXMgbWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBvdmVyIHNsb3cgbGlua3MuCi1JZiBsaWJ6IGlzIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uIHVzZSAtLXdpdGgtemxpYj1ESVIgdG8gaW5kaWNhdGUgdGhlCi1oZWFkZXIgZmlsZSBpcyBpbiBESVIvaW5jbHVkZS96bGliLmggYW5kIHRoZSBsaWJyYXJ5IGluIERJUi9saWIvbGliei5hLgotQSBjb3B5IG9mIGxpYnogbWF5IGJlIG9idGFpbmVkIGZyb206IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0JCQlzbGVlcCA1Ci0JCWZpCi0JZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wdGhyZWFkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9wdGhyZWFkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wdGhyZWFkOwotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfcHRocmVhZCIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAicHRocmVhZC5oIiAiYWNfY3ZfaGVhZGVyX3B0aHJlYWRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfcHRocmVhZF9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX1BUSFJFQURfSD0idHJ1ZSIKLWZpCi0KLQotCWlmIHRlc3QgISAteiAiJEhBVkVfUFRIUkVBRF9IIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2sgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jays6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scHRocmVhZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jayIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwdGhyZWFkICRMSUJTIgotCi1maQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayBpbiAtbHB0aHJlYWQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwdGhyZWFkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrPXllcwotZWxzZQotICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9sb2NrIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0xJQlBUSFJFQUQ9InRydWUiCi1maQotCi0JZmkKLWZpCi0gaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJQVEhSRUFEIjsgdGhlbgotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0KLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlBUSFJFQURfVFJVRT0nIycKLSAgSEFWRV9MSUJQVEhSRUFEX0ZBTFNFPQotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX3RocmVhZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX190aHJlYWQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgX190aHJlYWQgaW50IHAgPSAwCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9UTFMgMSIgPj5jb25mZGVmcy5oCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyB0aWdodHZuYy1maWxldHJhbnNmZXIgaW1wbGVtZW50ZWQgdXNpbmcgdGhyZWFkczoKLWlmIHRlc3QgLXogIiRIQVZFX0xJQlBUSFJFQUQiOyB0aGVuCi0Jd2l0aF90aWdodHZuY19maWxldHJhbnNmZXI9IiIKLWZpCi1pZiB0ZXN0ICJ4JHdpdGhfdGlnaHR2bmNfZmlsZXRyYW5zZmVyIiA9ICJ4eWVzIjsgdGhlbgotCSRhc19lY2hvICIjZGVmaW5lIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSIDEiID4+Y29uZmRlZnMuaAotCi1maQotIGlmIHRlc3QgIiR3aXRoX3RpZ2h0dm5jX2ZpbGV0cmFuc2ZlciIgPSAieWVzIjsgdGhlbgotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFPQotICBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9GQUxTRT0nIycKLWVsc2UKLSAgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRT0nIycKLSAgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0U9Ci1maQotCi0KLSMgd2Vic29ja2V0cyBpbXBsZW1lbnRlZCB1c2luZyBiYXNlNjQgZnJvbSByZXNvbHZlCi1pZiB0ZXN0ICJ4JEhBVkVfQjY0IiAhPSAieHRydWUiOyB0aGVuCi0Jd2l0aF93ZWJzb2NrZXRzPSIiCi1maQotaWYgdGVzdCAieCR3aXRoX3dlYnNvY2tldHMiID0gInh5ZXMiOyB0aGVuCi0JTElCUz0iJExJQlMgLWxyZXNvbHYgJFNTTF9MSUJTIgotCSRhc19lY2hvICIjZGVmaW5lIFdJVEhfV0VCU09DS0VUUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLSBpZiB0ZXN0ICIkd2l0aF93ZWJzb2NrZXRzIiA9ICJ5ZXMiOyB0aGVuCi0gIFdJVEhfV0VCU09DS0VUU19UUlVFPQotICBXSVRIX1dFQlNPQ0tFVFNfRkFMU0U9JyMnCi1lbHNlCi0gIFdJVEhfV0VCU09DS0VUU19UUlVFPScjJwotICBXSVRIX1dFQlNPQ0tFVFNfRkFMU0U9Ci1maQotCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX1pMSUJfSCI7IHRoZW4KLSAgSEFWRV9MSUJaX1RSVUU9Ci0gIEhBVkVfTElCWl9GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJaX1RSVUU9JyMnCi0gIEhBVkVfTElCWl9GQUxTRT0KLWZpCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX0pQRUdMSUJfSCI7IHRoZW4KLSAgSEFWRV9MSUJKUEVHX1RSVUU9Ci0gIEhBVkVfTElCSlBFR19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJKUEVHX1RSVUU9JyMnCi0gIEhBVkVfTElCSlBFR19GQUxTRT0KLWZpCi0KLSBpZiB0ZXN0ICEgLXogIiRIQVZFX1BOR0xJQl9IIjsgdGhlbgotICBIQVZFX0xJQlBOR19UUlVFPQotICBIQVZFX0xJQlBOR19GQUxTRT0nIycKLWVsc2UKLSAgSEFWRV9MSUJQTkdfVFJVRT0nIycKLSAgSEFWRV9MSUJQTkdfRkFMU0U9Ci1maQotCi0KLQotU0RMQ09ORklHPSJzZGwtY29uZmlnIgotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXNkbC1jb25maWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NkbF9jb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NkbF9jb25maWc7Ci0gICAgaWYgdGVzdCAiJHdpdGh2YWwiICE9ICJ5ZXMiIC1hICIkd2l0aHZhbCIgIT0gIiI7IHRoZW4KLSAgICAgICAgU0RMQ09ORklHPSR3aXRodmFsCi0gICAgZmkKLQotZmkKLQotCi1pZiB0ZXN0IC16ICIkd2l0aF9zZGwiOyB0aGVuCi0JaWYgJFNETENPTkZJRyAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXdpdGhfc2RsPXllcwotCQlTRExfQ0ZMQUdTPWAkU0RMQ09ORklHIC0tY2ZsYWdzYAotCQlTRExfTElCUz1gJFNETENPTkZJRyAtLWxpYnNgCi0JZWxzZQotCQl3aXRoX3NkbD1ubwotCWZpCi1maQotIGlmIHRlc3QgIngkd2l0aF9zZGwiID0gInh5ZXMiOyB0aGVuCi0gIEhBVkVfTElCU0RMX1RSVUU9Ci0gIEhBVkVfTElCU0RMX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX0xJQlNETF9UUlVFPScjJwotICBIQVZFX0xJQlNETF9GQUxTRT0KLWZpCi0KLQotCi0KLQotIyBDaGVjayBmb3IgR1RLKy4gaWYgcHJlc2VudCwgYnVpbGQgdGhlIEdUSysgdm5jIHZpZXdlciBleGFtcGxlCi0KLQotCi0KLQotCi0KLWlmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRQS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRQS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRoZW4KLSAgYWNfcHRfUEtHX0NPTkZJRz0kUEtHX0NPTkZJRwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9QS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotYWNfcHRfUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkYWNfcHRfUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9QS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkYWNfcHRfUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05GSUciID0geDsgdGhlbgotICAgIFBLR19DT05GSUc9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBQS0dfQ09ORklHPSRhY19wdF9QS0dfQ09ORklHCi0gIGZpCi1lbHNlCi0gIFBLR19DT05GSUc9IiRhY19jdl9wYXRoX1BLR19DT05GSUciCi1maQotCi1maQotaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0JX3BrZ19taW5fdmVyc2lvbj0wLjkuMAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAiID4mNjsgfQotCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCVBLR19DT05GSUc9IiIKLQlmaQotZmkKLQotcGtnX2ZhaWxlZD1ubwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR1RLIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHVEsuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJEdUS19DRkxBR1MiOyB0aGVuCi0gICAgcGtnX2N2X0dUS19DRkxBR1M9IiRHVEtfQ0ZMQUdTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ3RrKy0yLjBcIiI7IH0gPiY1Ci0gICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ3RrKy0yLjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImd0aystMi4wIiAyPi9kZXYvbnVsbGAKLQkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCi1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKLWZpCi1pZiB0ZXN0IC1uICIkR1RLX0xJQlMiOyB0aGVuCi0gICAgcGtnX2N2X0dUS19MSUJTPSIkR1RLX0xJQlMiCi0gZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAotICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJndGsrLTIuMFwiIjsgfSA+JjUKLSAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJndGsrLTIuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HVEtfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJndGsrLTIuMCIgMj4vZGV2L251bGxgCi0JCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcwotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotCi0KLQotaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgotICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1pZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCi1lbHNlCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubwotZmkKLSAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCi0JICAgICAgICBHVEtfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJndGsrLTIuMCIgMj4mMWAKLSAgICAgICAgZWxzZQotCSAgICAgICAgR1RLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ3RrKy0yLjAiIDI+JjFgCi0gICAgICAgIGZpCi0JIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCi0JZWNobyAiJEdUS19QS0dfRVJST1JTIiA+JjUKLQotCToKLWVsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KLSAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCToKLWVsc2UKLQlHVEtfQ0ZMQUdTPSRwa2dfY3ZfR1RLX0NGTEFHUwotCUdUS19MSUJTPSRwa2dfY3ZfR1RLX0xJQlMKLSAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotZmkKLSBpZiB0ZXN0ICEgLXogIiRHVEtfTElCUyI7IHRoZW4KLSAgSEFWRV9MSUJHVEtfVFJVRT0KLSAgSEFWRV9MSUJHVEtfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfTElCR1RLX1RSVUU9JyMnCi0gIEhBVkVfTElCR1RLX0ZBTFNFPQotZmkKLQotCi0KLU1JTkdXPWBlY2hvICRob3N0X29zIHwgZ3JlcCBtaW5ndzMyICAyPi9kZXYvbnVsbGAKLSBpZiB0ZXN0ICEgLXogIiRNSU5HVyIgOyB0aGVuCi0gIE1JTkdXX1RSVUU9Ci0gIE1JTkdXX0ZBTFNFPScjJwotZWxzZQotICBNSU5HV19UUlVFPScjJwotICBNSU5HV19GQUxTRT0KLWZpCi0KLWlmIHRlc3QgISAteiAiJE1JTkdXIjsgdGhlbgotCVdTT0NLTElCPSItbHdzMl8zMiIKLQlMREZMQUdTPSIkTERGTEFHUyAtbm8tdW5kZWZpbmVkIgotZmkKLQotCi0jIENoZWNrIGZvciBsaWJnY3J5cHQKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdjcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ2NyeXB0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nY3J5cHQ7Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2xpZW50LWdjcnlwdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY2xpZW50X2djcnlwdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY2xpZW50X2djcnlwdDsKLWZpCi0KLQotaWYgdGVzdCAieCR3aXRoX2djcnlwdCIgIT0gInhubyI7IHRoZW4KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJnY3J5cHQtcHJlZml4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9saWJnY3J5cHRfcHJlZml4K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9saWJnY3J5cHRfcHJlZml4OyBsaWJnY3J5cHRfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiCi1lbHNlCi0gIGxpYmdjcnlwdF9jb25maWdfcHJlZml4PSIiCi1maQotCi0gIGlmIHRlc3QgeCRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgotICAgICBpZiB0ZXN0IHgke0xJQkdDUllQVF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgotICAgICAgICBMSUJHQ1JZUFRfQ09ORklHPSRsaWJnY3J5cHRfY29uZmlnX3ByZWZpeC9iaW4vbGliZ2NyeXB0LWNvbmZpZwotICAgICBmaQotICBmaQotCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGliZ2NyeXB0LWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbGliZ2NyeXB0LWNvbmZpZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJExJQkdDUllQVF9DT05GSUcgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRz0iJExJQkdDUllQVF9DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTElCR0NSWVBUX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9MSUJHQ1JZUFRfQ09ORklHPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1MSUJHQ1JZUFRfQ09ORklHPSRhY19jdl9wYXRoX0xJQkdDUllQVF9DT05GSUcKLWlmIHRlc3QgLW4gIiRMSUJHQ1JZUFRfQ09ORklHIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExJQkdDUllQVF9DT05GSUciID4mNQotJGFzX2VjaG8gIiRMSUJHQ1JZUFRfQ09ORklHIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdG1wPTEuNC4wCi0gIGlmIGVjaG8gIiR0bXAiIHwgZ3JlcCAnOicgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAgcmVxX2xpYmdjcnlwdF9hcGk9YGVjaG8gIiR0bXAiICAgICB8IHNlZCAncy9cKC4qXCk6XCguKlwpL1wxLydgCi0gICAgIG1pbl9saWJnY3J5cHRfdmVyc2lvbj1gZWNobyAiJHRtcCIgfCBzZWQgJ3MvXCguKlwpOlwoLipcKS9cMi8nYAotICBlbHNlCi0gICAgIHJlcV9saWJnY3J5cHRfYXBpPTAKLSAgICAgbWluX2xpYmdjcnlwdF92ZXJzaW9uPSIkdG1wIgotICBmaQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIExJQkdDUllQVCAtIHZlcnNpb24gPj0gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgTElCR0NSWVBUIC0gdmVyc2lvbiA+PSAkbWluX2xpYmdjcnlwdF92ZXJzaW9uLi4uICIgPiY2OyB9Ci0gIG9rPW5vCi0gIGlmIHRlc3QgIiRMSUJHQ1JZUFRfQ09ORklHIiAhPSAibm8iIDsgdGhlbgotICAgIHJlcV9tYWpvcj1gZWNobyAkbWluX2xpYmdjcnlwdF92ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDEvJ2AKLSAgICByZXFfbWlub3I9YGVjaG8gJG1pbl9saWJnY3J5cHRfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wyLydgCi0gICAgcmVxX21pY3JvPWBlY2hvICRtaW5fbGliZ2NyeXB0X3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMy8nYAotICAgIGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbj1gJExJQkdDUllQVF9DT05GSUcgLS12ZXJzaW9uYAotICAgIG1ham9yPWBlY2hvICRsaWJnY3J5cHRfY29uZmlnX3ZlcnNpb24gfCBcCi0gICAgICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wxLydgCi0gICAgbWlub3I9YGVjaG8gJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbiB8IFwKLSAgICAgICAgICAgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpLiovXDIvJ2AKLSAgICBtaWNybz1gZWNobyAkbGliZ2NyeXB0X2NvbmZpZ192ZXJzaW9uIHwgXAotICAgICAgICAgICAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMy8nYAotICAgIGlmIHRlc3QgIiRtYWpvciIgLWd0ICIkcmVxX21ham9yIjsgdGhlbgotICAgICAgICBvaz15ZXMKLSAgICBlbHNlCi0gICAgICAgIGlmIHRlc3QgIiRtYWpvciIgLWVxICIkcmVxX21ham9yIjsgdGhlbgotICAgICAgICAgICAgaWYgdGVzdCAiJG1pbm9yIiAtZ3QgIiRyZXFfbWlub3IiOyB0aGVuCi0gICAgICAgICAgICAgICBvaz15ZXMKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGlmIHRlc3QgIiRtaW5vciIgLWVxICIkcmVxX21pbm9yIjsgdGhlbgotICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRtaWNybyIgLWdlICIkcmVxX21pY3JvIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgb2s9eWVzCi0gICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyAoJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbikiID4mNQotJGFzX2VjaG8gInllcyAoJGxpYmdjcnlwdF9jb25maWdfdmVyc2lvbikiID4mNjsgfQotICBlbHNlCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gIGZpCi0gIGlmIHRlc3QgJG9rID0geWVzOyB0aGVuCi0gICAgICMgSWYgd2UgaGF2ZSBhIHJlY2VudCBsaWJnY3J5cHQsIHdlIHNob3VsZCBhbHNvIGNoZWNrIHRoYXQgdGhlCi0gICAgICMgQVBJIGlzIGNvbXBhdGlibGUKLSAgICAgaWYgdGVzdCAiJHJlcV9saWJnY3J5cHRfYXBpIiAtZ3QgMCA7IHRoZW4KLSAgICAgICAgdG1wPWAkTElCR0NSWVBUX0NPTkZJRyAtLWFwaS12ZXJzaW9uIDI+L2Rldi9udWxsIHx8IGVjaG8gMGAKLSAgICAgICAgaWYgdGVzdCAiJHRtcCIgLWd0IDAgOyB0aGVuCi0gICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgTElCR0NSWVBUIEFQSSB2ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIExJQkdDUllQVCBBUEkgdmVyc2lvbi4uLiAiID4mNjsgfQotICAgICAgICAgICBpZiB0ZXN0ICIkcmVxX2xpYmdjcnlwdF9hcGkiIC1lcSAiJHRtcCIgOyB0aGVuCi0gICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG9rYXkiID4mNQotJGFzX2VjaG8gIm9rYXkiID4mNjsgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgb2s9bm8KLSAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZG9lcyBub3QgbWF0Y2guIHdhbnQ9JHJlcV9saWJnY3J5cHRfYXBpIGdvdD0kdG1wIiA+JjUKLSRhc19lY2hvICJkb2VzIG5vdCBtYXRjaC4gd2FudD0kcmVxX2xpYmdjcnlwdF9hcGkgZ290PSR0bXAiID4mNjsgfQotICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICBmaQotICBmaQotICBpZiB0ZXN0ICRvayA9IHllczsgdGhlbgotICAgIExJQkdDUllQVF9DRkxBR1M9YCRMSUJHQ1JZUFRfQ09ORklHIC0tY2ZsYWdzYAotICAgIExJQkdDUllQVF9MSUJTPWAkTElCR0NSWVBUX0NPTkZJRyAtLWxpYnNgCi0gICAgOgotICBlbHNlCi0gICAgTElCR0NSWVBUX0NGTEFHUz0iIgotICAgIExJQkdDUllQVF9MSUJTPSIiCi0gICAgd2l0aF9jbGllbnRfZ2NyeXB0PW5vCi0gIGZpCi0KLQotCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRMSUJHQ1JZUFRfQ0ZMQUdTIgotCUxJQlM9IiRMSUJTICRMSUJHQ1JZUFRfTElCUyIKLQlpZiB0ZXN0ICJ4JHdpdGhfY2xpZW50X2djcnlwdCIgIT0gInhubyI7IHRoZW4KLQkJJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9DTElFTlRfR0NSWVBUIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWZpCi0KLSMgQ2hlY2tzIGZvciBHbnVUTFMKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudXRscyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251dGxzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9nbnV0bHM7Ci1maQotCi0KLWlmIHRlc3QgIngkd2l0aF9nbnV0bHMiICE9ICJ4bm8iOyB0aGVuCi0KLXBrZ19mYWlsZWQ9bm8KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVVRMUyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VVExTLi4uICIgPiY2OyB9Ci0KLWlmIHRlc3QgLW4gIiRHTlVUTFNfQ0ZMQUdTIjsgdGhlbgotICAgIHBrZ19jdl9HTlVUTFNfQ0ZMQUdTPSIkR05VVExTX0NGTEFHUyIKLSBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCi0gICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImdudXRscyA+PSAyLjQuMFwiIjsgfSA+JjUKLSAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJnbnV0bHMgPj0gMi40LjAiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3ZfR05VVExTX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImdudXRscyA+PSAyLjQuMCIgMj4vZGV2L251bGxgCi0JCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcwotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBlbHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotaWYgdGVzdCAtbiAiJEdOVVRMU19MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9HTlVUTFNfTElCUz0iJEdOVVRMU19MSUJTIgotIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKLSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ251dGxzID49IDIuNC4wXCIiOyB9ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdudXRscyA+PSAyLjQuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9HTlVUTFNfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJnbnV0bHMgPj0gMi40LjAiIDI+L2Rldi9udWxsYAotCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKLWVsc2UKLSAgcGtnX2ZhaWxlZD15ZXMKLWZpCi0gZWxzZQotICAgIHBrZ19mYWlsZWQ9dW50cmllZAotZmkKLQotCi0KLWlmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KLSAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KLSAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwotZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KLWZpCi0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgotCSAgICAgICAgR05VVExTX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiZ251dGxzID49IDIuNC4wIiAyPiYxYAotICAgICAgICBlbHNlCi0JICAgICAgICBHTlVUTFNfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJnbnV0bHMgPj0gMi40LjAiIDI+JjFgCi0gICAgICAgIGZpCi0JIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCi0JZWNobyAiJEdOVVRMU19QS0dfRVJST1JTIiA+JjUKLQotCToKLWVsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KLSAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCToKLWVsc2UKLQlHTlVUTFNfQ0ZMQUdTPSRwa2dfY3ZfR05VVExTX0NGTEFHUwotCUdOVVRMU19MSUJTPSRwa2dfY3ZfR05VVExTX0xJQlMKLSAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotZmkKLQlDRkxBR1M9IiRDRkxBR1MgJEdOVVRMU19DRkxBR1MiCi0JTElCUz0iJExJQlMgJEdOVVRMU19MSUJTIgotZmkKLSBpZiB0ZXN0ICEgLXogIiRHTlVUTFNfTElCUyI7IHRoZW4KLSAgSEFWRV9HTlVUTFNfVFJVRT0KLSAgSEFWRV9HTlVUTFNfRkFMU0U9JyMnCi1lbHNlCi0gIEhBVkVfR05VVExTX1RSVUU9JyMnCi0gIEhBVkVfR05VVExTX0ZBTFNFPQotZmkKLQotaWYgdGVzdCAhIC16ICIkR05VVExTX0xJQlMiIDsgdGhlbgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0dOVVRMUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0jIHdhcm4gaWYgbmVpdGhlciBHbnVUTFMgbm9yIE9wZW5TU0wgYXJlIGF2YWlsYWJsZQotaWYgdGVzdCAteiAiJFNTTF9MSUJTIiAtYSAteiAiJEdOVVRMU19MSUJTIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5vIGVuY3J5cHRpb24gbGlicmFyeSBjb3VsZCBiZSBmb3VuZC4gKioqCi1BIGxpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQgYnVpbHQgdGhpcyB3YXkgd2lsbCBub3Qgc3VwcG9ydCBTU0wgZW5jcnlwdGlvbi4KLVRvIGVuYWJsZSBTU0wgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzIChwZXJoYXBzIGl0IGlzIG5hbWVkCi1zb21ldGhpbmcgbGlrZSBsaWJzc2wtZGV2IG9yIGdudXRscy1kZXYpIGFuZCBydW4gY29uZmlndXJlIGFnYWluLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoqKiBObyBlbmNyeXB0aW9uIGxpYnJhcnkgY291bGQgYmUgZm91bmQuICoqKgotQSBsaWJ2bmNzZXJ2ZXIvbGlidm5jY2xpZW50IGJ1aWx0IHRoaXMgd2F5IHdpbGwgbm90IHN1cHBvcnQgU1NMIGVuY3J5cHRpb24uCi1UbyBlbmFibGUgU1NMIGluc3RhbGwgdGhlIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCBwYWNrYWdlcyAocGVyaGFwcyBpdCBpcyBuYW1lZAotc29tZXRoaW5nIGxpa2UgbGlic3NsLWRldiBvciBnbnV0bHMtZGV2KSBhbmQgcnVuIGNvbmZpZ3VyZSBhZ2Fpbi4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iID4mMjt9Ci0Jc2xlZXAgNQotZmkKLQotCi0jIElQdjYKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWlwdjYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2lwdjYrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2lwdjY7Ci1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfaXB2NiIgIT0gInhubyI7IHRoZW4KLQlhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRhZGRyaW5mbyIgImFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIElQdjYgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWxzb2NrZXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIGluIC1sc29ja2V0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm8rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0YWRkcmluZm8gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRhZGRyaW5mbyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvPXllcwotZWxzZQotICBhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfZ2V0YWRkcmluZm8iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc29ja2V0X2dldGFkZHJpbmZvIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9nZXRhZGRyaW5mbyIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSVB2NiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRhZGRyaW5mbyBpbiAtbHdzMl8zMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0YWRkcmluZm8gaW4gLWx3czJfMzIuLi4gIiA+JjY7IH0KLQkJICAgICAgICBMSUJTPSIkTElCUyAtbHdzMl8zMiIKLQkJICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8d3MydGNwaXAuaD4KLWludAotbWFpbiAoKQotewotZ2V0YWRkcmluZm8oMCwgMCwgMCwgMCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJCSAgICAgICRhc19lY2hvICIjZGVmaW5lIElQdjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJICAgICAgICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLQotZmkKLQotZmkKLQotCi0KLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotZm9yIGFjX2hlYWRlciBpbiBhcnBhL2luZXQuaCBmY250bC5oIG5ldGRiLmggbmV0aW5ldC9pbi5oIHN0ZGxpYi5oIHN0cmluZy5oIHN5cy9zb2NrZXQuaCBzeXMvdGltZS5oIHN5cy90aW1lYi5oIHN5c2xvZy5oIHVuaXN0ZC5oIHdzMnRjcGlwLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi0jIHgxMXZuYyBvbmx5OgotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCWZvciBhY19oZWFkZXIgaW4gcHdkLmggc3lzL3dhaXQuaCB1dG1weC5oIHRlcm1pb3MuaCBzeXMvaW9jdGwuaCBzeXMvc3Ryb3B0cy5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLWZpCi0KLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07Ci0gIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKLSAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotICBjaGFyICoqcHBjOwotICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0gIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0gICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKLSAgICAgZXhwcmVzc2lvbiAqLwotICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0gIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwotICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotICArK3BjcGNjOwotICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKLSAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwotICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCi0gICAgY2hhciB0eDsKLSAgICBjaGFyICp0ID0gJnR4OwotICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgICAqdCsrID0gMDsKLSAgICBpZiAocykgcmV0dXJuIDA7Ci0gIH0KLSAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgICBpbnQgeFtdID0gezI1LCAxN307Ci0gICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgICArK2ZvbzsKLSAgfQotICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgICBpcHRyIHAgPSAwOwotICAgICsrcDsKLSAgfQotICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKLSAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKLSAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7Ci0gIH0KLSAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgICBjb25zdCBpbnQgZm9vID0gMTA7Ci0gICAgaWYgKCFmb28pIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIGNvbnN0IC8qKi8iID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlubGluZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9jX2lubGluZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLXR5cGVkZWYgaW50IGZvb190Owotc3RhdGljICRhY19rdyBmb29fdCBzdGF0aWNfZm9vICgpIHtyZXR1cm4gMDsgfQotJGFjX2t3IGZvb190IGZvbyAoKSB7cmV0dXJuIDA7IH0KLSNlbmRpZgotCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIHRlc3QgIiRhY19jdl9jX2lubGluZSIgIT0gbm8gJiYgYnJlYWsKLWRvbmUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19pbmxpbmUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9Ci0KLWNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgKikKLSAgICBjYXNlICRhY19jdl9jX2lubGluZSBpbgotICAgICAgbm8pIGFjX3ZhbD07OwotICAgICAgKikgYWNfdmFsPSRhY19jdl9jX2lubGluZTs7Ci0gICAgZXNhYwotICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgaW5saW5lICRhY192YWwKLSNlbmRpZgotX0FDRU9GCi0gICAgOzsKLWVzYWMKLQotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfYmlnZW5kaWFuKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgotICAgICMgU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHVuaXZlcnNhbCBjb21waWxlci4KLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZuZGVmIF9fQVBQTEVfQ0NfXwotCSAgICAgICBub3QgYSB1bml2ZXJzYWwgY2FwYWJsZSBjb21waWxlcgotCSAgICAgI2VuZGlmCi0JICAgICB0eXBlZGVmIGludCBkdW1teTsKLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLQkjIENoZWNrIGZvciBwb3RlbnRpYWwgLWFyY2ggZmxhZ3MuICBJdCBpcyBub3QgdW5pdmVyc2FsIHVubGVzcwotCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCi0JYWNfYXJjaD0KLQlhY19wcmV2PQotCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KLQkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0JICAgY2FzZSAkYWNfd29yZCBpbgotCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQotCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgotCQkgYWNfYXJjaD0kYWNfd29yZAotCSAgICAgICBlbHNlCi0JCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKLQkJIGJyZWFrCi0JICAgICAgIGZpCi0JICAgICAgIDs7Ci0JICAgZXNhYwotCSAgIGFjX3ByZXY9Ci0JIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCi0JICAgYWNfcHJldj1hcmNoCi0JIGZpCi0gICAgICAgZG9uZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotaW50Ci1tYWluICgpCi17Ci0jaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCi0JCSAgICAgJiYgZGVmaW5lZCBMSVRUTEVfRU5ESUFOICYmIEJZVEVfT1JERVIgJiYgQklHX0VORElBTiBcCi0JCSAgICAgJiYgTElUVExFX0VORElBTikKLQkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCi0JICAgICAjZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkJI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLQkJIG5vdCBiaWcgZW5kaWFuCi0JCSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1lbHNlCi0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgZmkKLSAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLSAgICAgICMgU2VlIGlmIDxsaW1pdHMuaD4gZGVmaW5lcyBfTElUVExFX0VORElBTiBvciBfQklHX0VORElBTiAoZS5nLiwgU29sYXJpcykuCi0gICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLWludAotbWFpbiAoKQotewotI2lmICEgKGRlZmluZWQgX0xJVFRMRV9FTkRJQU4gfHwgZGVmaW5lZCBfQklHX0VORElBTikKLQkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCi0JICAgICAjZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfQklHX0VORElBTgotCQkgbm90IGJpZyBlbmRpYW4KLQkJI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBmaQotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBDb21waWxlIGEgdGVzdCBwcm9ncmFtLgotICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICAjIFRyeSB0byBndWVzcyBieSBncmVwcGluZyB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgZmlsZS4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotc2hvcnQgaW50IGFzY2lpX21tW10gPQotCQkgIHsgMHg0MjQ5LCAweDQ3NjUsIDB4NkU0NCwgMHg2OTYxLCAweDZFNTMsIDB4Nzk1MywgMCB9OwotCQlzaG9ydCBpbnQgYXNjaWlfaWlbXSA9Ci0JCSAgeyAweDY5NEMsIDB4NTQ1NCwgMHg2NTZDLCAweDZFNDUsIDB4Njk0NCwgMHg2RTYxLCAwIH07Ci0JCWludCB1c2VfYXNjaWkgKGludCBpKSB7Ci0JCSAgcmV0dXJuIGFzY2lpX21tW2ldICsgYXNjaWlfaWlbaV07Ci0JCX0KLQkJc2hvcnQgaW50IGViY2RpY19paVtdID0KLQkJICB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKLQkJc2hvcnQgaW50IGViY2RpY19tbVtdID0KLQkJICB7IDB4QzJDOSwgMHhDNzg1LCAweDk1QzQsIDB4ODk4MSwgMHg5NUUyLCAweEE4RTIsIDAgfTsKLQkJaW50IHVzZV9lYmNkaWMgKGludCBpKSB7Ci0JCSAgcmV0dXJuIGViY2RpY19tbVtpXSArIGViY2RpY19paVtpXTsKLQkJfQotCQlleHRlcm4gaW50IGZvbzsKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gdXNlX2FzY2lpIChmb28pID09IHVzZV9lYmNkaWMgKGZvbyk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCi0JICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi0JICAgIGZpCi0JICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgotCQlhY19jdl9jX2JpZ2VuZGlhbj1ubwotCSAgICAgIGVsc2UKLQkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/Ci0JCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLQkgICAgICBmaQotCSAgICBmaQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLQkgICAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLQkgICAgIHVuaW9uCi0JICAgICB7Ci0JICAgICAgIGxvbmcgaW50IGw7Ci0JICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Ci0JICAgICB9IHU7Ci0JICAgICB1LmwgPSAxOwotCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1lbHNlCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLSAgICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9Ci0gY2FzZSAkYWNfY3ZfY19iaWdlbmRpYW4gaW4gIygKLSAgIHllcykKLSAgICAgJGFzX2VjaG8gIiNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEiID4+Y29uZmRlZnMuaAotOzsgIygKLSAgIG5vKQotICAgICAgOzsgIygKLSAgIHVuaXZlcnNhbCkKLQotJGFzX2VjaG8gIiNkZWZpbmUgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEIDEiID4+Y29uZmRlZnMuaAotCi0gICAgIDs7ICMoCi0gICAqKQotICAgICBhc19mbl9lcnJvciAkPyAidW5rbm93biBlbmRpYW5uZXNzCi0gcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiICIkTElORU5PIiA1IDs7Ci0gZXNhYwotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKLV9BQ0VPRgotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hlYWRlcl90aW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLWlmICgoc3RydWN0IHRtICopIDApCi1yZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3RpbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90aW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZuZGVmIFdFWElUU1RBVFVTCi0jIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCBpbnQpIChzdGF0X3ZhbCkgPj4gOCkKLSNlbmRpZgotI2lmbmRlZiBXSUZFWElURUQKLSMgZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotICBpbnQgczsKLSAgd2FpdCAoJnMpOwotICBzID0gV0lGRVhJVEVEIChzKSA/IFdFWElUU1RBVFVTIChzKSA6IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfdHlwZV9zb2NrbGVuX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci1pbnQKLW1haW4gKCkKLXsKLXNvY2tsZW5fdCBsZW4gPSA0MjsgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9eWVzCi1lbHNlCi0gIGFjX2N2X3R5cGVfc29ja2xlbl90PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfc29ja2xlbl90IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNjsgfQotICBpZiB0ZXN0ICRhY19jdl90eXBlX3NvY2tsZW5fdCAhPSB5ZXM7IHRoZW4KLSAgICAkYXNfZWNobyAiI2RlZmluZSBzb2NrbGVuX3QgaW50IiA+PmNvbmZkZWZzLmgKLQotICBmaQotCi1pZiB0ZXN0ICEgLWQgLi9yZmI7IHRoZW4KLQllY2hvICJjcmVhdGluZyBzdWJkaXIgLi9yZmIgZm9yIHJmYmludC5oIgotCW1rZGlyIC4vcmZiCi1maQotIyAtLS0tLS0gQUMgQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludC10eXBlcy4uLi4uLi4gIiA+JjY7IH0KLWFjX3N0ZGludF9oPWBlY2hvIHJmYi9yZmJpbnQuaGAKLWlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAic3RkaW50LmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPylcIiIgPiY1Ci0kYXNfZWNobyAiXCIoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9zdGRpbnQuaD8pXCIiID4mNjsgfQotZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgotIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjUKLSRhc19lY2hvICJcIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KVwiIiA+JjY7IH0KLWVsc2UKLSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogXCIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKVwiIiA+JjUKLSRhc19lY2hvICJcIihwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpXCIiID4mNjsgfQotZmkKLQotaW50dHlwZV9oZWFkZXJzPWBlY2hvIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3lzL2ludHR5cGVzLmggIFwKLXwgc2VkIC1lICdzLywvIC9nJ2AKLQotIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0ibm8tZmlsZSIKLSBhY19jdl9oZWFkZXJfc3RkaW50X289Im5vLWZpbGUiCi0gYWNfY3ZfaGVhZGVyX3N0ZGludF91PSJuby1maWxlIgotIGZvciBpIGluIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbwotICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50cHRyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnRwdHJfdCIgImFjX2N2X3R5cGVfdWludHB0cl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnRwdHJfdCBpbiAkaSAkYW5kNjQiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIG91ciB1aW50cHRyX3QgaW4gJGkgJGFuZDY0IiA+JjY7IH0KLSAgIGJyZWFrOwotIGRvbmUKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSBmb3IgaSBpbiBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKLSAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVpbnQ2NF90IHRvbykiCi1lbHNlCi0gIGFuZDY0PSIiCi1maQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY1Ci0kYXNfZWNobyAiLi4uIHNlZW4gb3VyIHVpbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAibm8tZmlsZSIgOyB0aGVuCi0gZm9yIGkgaW4gc3lzL3R5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCi0gICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAotICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiI2luY2x1ZGUgPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpCi1lbHNlCi0gICAgICAgY29udGludWUKLWZpCi0KLSAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotICBhbmQ2ND0iKHVfaW50NjRfdCB0b28pIgotZWxzZQotICBhbmQ2ND0iIgotZmkKLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIG91ciB1X2ludDMyX3QgaW4gJGkgJGFuZDY0IiA+JjUKLSRhc19lY2hvICIuLi4gc2VlbiBvdXIgdV9pbnQzMl90IGluICRpICRhbmQ2NCIgPiY2OyB9Ci0gICBicmVhazsKLSBkb25lCi0gZmkKLSBmaQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgTUFZQkUgQyBiYXNpYyB0eXBlcyAtLS0tLS0tLQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgY2hhci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfY2hhcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAoY2hhcikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfY2hhcj0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2NoYXIgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfY2hhciA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgY2hhciIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mIChzaG9ydCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igc2hvcnQiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9TSE9SVCAkYWNfY3Zfc2l6ZW9mX3Nob3J0Ci1fQUNFT0YKLQotCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBmb3IgYWNfc2l6ZSBpbiA0IDggMSAyIDE2ICA7IGRvICMgTGlzdCBzaXplcyBpbiByb3VnaCBvcmRlciBvZiBwcmV2YWxlbmNlLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLXN3aXRjaCAoMCkgY2FzZSAwOiBjYXNlIChzaXplb2YgKGludCkgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfaW50PSRhY19zaXplCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHRlc3QgeCRhY19jdl9zaXplb2ZfaW50ICE9IHggOyB0aGVuIGJyZWFrOyBmaQotZG9uZQotCi1maQotCi1pZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2ludCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgaW50IiAiJExJTkVOTyIgNQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKLV9BQ0VPRgotCi0KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfbG9uZys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGZvciBhY19zaXplIGluIDQgOCAxIDIgMTYgIDsgZG8gIyBMaXN0IHNpemVzIGluIHJvdWdoIG9yZGVyIG9mIHByZXZhbGVuY2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLWludAotbWFpbiAoKQotewotc3dpdGNoICgwKSBjYXNlIDA6IGNhc2UgKHNpemVvZiAobG9uZykgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2ZfbG9uZz0kYWNfc2l6ZQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmcgIT0geCA7IHRoZW4gYnJlYWs7IGZpCi1kb25lCi0KLWZpCi0KLWlmIHRlc3QgeCRhY19jdl9zaXplb2ZfbG9uZyA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3IgbG9uZyIgIiRMSU5FTk8iIDUKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZwotX0FDRU9GCi0KLQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQqIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygdm9pZCouLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRwKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZm9yIGFjX3NpemUgaW4gNCA4IDEgMiAxNiAgOyBkbyAjIExpc3Qgc2l6ZXMgaW4gcm91Z2ggb3JkZXIgb2YgcHJldmFsZW5jZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQotaW50Ci1tYWluICgpCi17Ci1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mICh2b2lkKikgPT0gJGFjX3NpemUpOjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zaXplb2Zfdm9pZHA9JGFjX3NpemUKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCAhPSB4IDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotZmkKLQotaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkcCA9IHggOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZGV0ZXJtaW5lIGEgc2l6ZSBmb3Igdm9pZCoiICIkTElORU5PIiA1Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfdm9pZHAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfdm9pZHAiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9WT0lEUCAkYWNfY3Zfc2l6ZW9mX3ZvaWRwCi1fQUNFT0YKLQotCi0gICBhY19jdl9oZWFkZXJfc3RkaW50X3Rlc3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdGVzdD0ibm8iCi1maQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaW50dHlwZXMuaCBjaGVja3MgU1RBUlQgaGVhZGVyIC0tLS0tLS0tLS0tLS0KLV9hY19zdGRpbnRfaD1gJGFzX2VjaG8gIl8kYWNfc3RkaW50X2giIHwgJGFzX3RyX2NwcGAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjUKLSRhc19lY2hvICJjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjY7IH0KLWVjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnRfaAotZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNpZm5kZWYiIF9HRU5FUkFURURfU1RESU5UX0ggPj4kYWNfc3RkaW50X2gKLWVjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50X2gKLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyBhIGdudSBjb21waWxlciB2ZXJzaW9uIiBgJENDIC0tdmVyc2lvbmAgIiovIiBcCi0gID4+JGFjX3N0ZGludF9oCi1lbHNlCi0gIGVjaG8gIi8qIGdlbmVyYXRlZCB1c2luZyAkQ0MgKi8iID4+JGFjX3N0ZGludF9oCi1maQotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgotZWxpZiAgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIm5vLWZpbGUiIDsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKLWVsaWYgIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJuby1maWxlIiA7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCi1lbHNlCi0gICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0gU2VlIGlmIGludF9sZWFzdCBhbmQgaW50X2Zhc3QgdHlwZXMgYXJlIHByZXNlbnQKLXVuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAotdW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKLQotZmkKLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50X2Zhc3QzMl90IiAiYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiICIjaW5jbHVkZTwkYWNfY3ZfaGVhZGVyX3N0ZGludD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0geHllczsgdGhlbiA6Ci0KLWZpCi0KLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnQiICE9ICJzdGRkZWYuaCIgOyB0aGVuCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludCIgIT0gInN0ZGludC5oIiA7IHRoZW4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyBpbmNsdWRlIHN0ZGRlZi5oIiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyBpbmNsdWRlIHN0ZGRlZi5oIiA+JjY7IH0KLSAgIGVjaG8gIiNpbmNsdWRlIDxzdGRkZWYuaD4iID4+JGFjX3N0ZGludF9oCi1maSA7IGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgaW5jbHVkZSAkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgaW5jbHVkZSAkYWNfY3ZfaGVhZGVyX3N0ZGludCIgPiY2OyB9Ci0gICBlY2hvICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+IiA+PiRhY19zdGRpbnRfaAotZWNobyAiIiA+PiRhY19zdGRpbnRfaAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tIERPTkUgaGVhZGVyIFNUQVJUIGJhc2ljIGludCB0eXBlcyAtLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi4gbmVlZCB0byBsb29rIGF0IEMgYmFzaWMgdHlwZXMiID4mNQotJGFzX2VjaG8gIi4uLiBuZWVkIHRvIGxvb2sgYXQgQyBiYXNpYyB0eXBlcyIgPiY2OyB9Ci1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gZ29vZCBzdGRpbnQuaCBpbnR0eXBlcyIgPiY1Ci0kYXNfZWNobyAiLi4uIHNlZW4gZ29vZCBzdGRpbnQuaCBpbnR0eXBlcyIgPiY2OyB9Ci1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IiAhPSAibm8tZmlsZSIgOyB0aGVuCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIHNlZW4gYnNkL3N5c3YgdHlwZWRlZnMiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIGJzZC9zeXN2IHR5cGVkZWZzIiA+JjY7IH0KLSAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiBpbnQ4X3QgaW50MTZfdCBpbnQzMl90IGRlZmluZWQgYnkgaW5ldCBjb2RlLCByZWRlY2xhcmUgdGhlIHVfaW50WFggdHlwZXMgKi8KLXR5cGVkZWYgdV9pbnQ4X3QgdWludDhfdDsKLXR5cGVkZWYgdV9pbnQxNl90IHVpbnQxNl90OwotdHlwZWRlZiB1X2ludDMyX3QgdWludDMyX3Q7Ci1FT0YKLSAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogZ2xpYmMgY29tcGF0aWJpbGl0eSAqLwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLSNlbmRpZgotRU9GCi1maQotCi1hY19jdl9zaXplb2ZfeD0iJGFjX2N2X3NpemVvZl9jaGFyOiRhY19jdl9zaXplb2Zfc2hvcnQiCi1hY19jdl9zaXplb2ZfWD0iJGFjX2N2X3NpemVvZl94OiRhY19jdl9zaXplb2ZfaW50IgotYWNfY3Zfc2l6ZW9mX1g9IiRhY19jdl9zaXplb2ZfWDokYWNfY3Zfc2l6ZW9mX3ZvaWRwOiRhY19jdl9zaXplb2ZfbG9uZyIKLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3RkaW50IiA9ICJzdGRkZWYuaCIgOyB0aGVuCi0jICAgd2UgbXVzdCBndWVzcyBhbGwgdGhlIGJhc2ljIHR5cGVzLiBBcGFydCBmcm9tIGJ5dGUtYWRyZXNzYWJsZSBzeXN0ZW0sCi0jIHRoZXJlIGEgZmV3IDMyLWJpdC1vbmx5IGRzcC1zeXN0ZW1zLiBuaWJibGUtYWRkcmVzc2FibGUgc3lzdGVtcyBhcmUgd2F5IG9mZi4KLSAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIC0tLS0tLS0tLS0tLSBCSVRTUEVDSUZJQyBJTlRUWVBFUyBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLSAqLwotRU9GCi0gICAgdD0idHlwZWRlZnMgZm9yIGEiCi0gICAgY2FzZSAiJGFjX2N2X3NpemVvZl9YIiBpbgotICAgICAxOjI6MjoyOjQpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyAkdCBub3JtYWwgMTYtYml0IHN5c3RlbSIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgJHQgbm9ybWFsIDE2LWJpdCBzeXN0ZW0iID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDE2LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGxvbmcgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6Mjo0OjQpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDE2LWJpdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgJHQgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQiID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo0OjQpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyAkdCBub3JtYWwgMzItYml0IHN5c3RlbSIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgJHQgbm9ybWFsIDMyLWJpdCBzeXN0ZW0iID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDMyLWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo0OjgpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyAkdCAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IDMyLWJpdCBzeXN0ZW0gcHJlcGFyZWQgZm9yIDY0LWJpdCIgPiY2OyB9Ci0gICAgICAgICAgICAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qICAgICAgICAgICAgICBhIDMyLWJpdCBzeXN0ZW0gcHJlcGFyZWQgZm9yIDY0LWJpdCAgICAgICAgICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7Ci0jaWZuZGVmIF9faW50OF90X2RlZmluZWQKLSNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAotdHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKLXR5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwotdHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAgMToyOjQ6ODo4KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgJHQgbm9ybWFsIDY0LWJpdCBzeXN0ZW0iID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nICR0IG5vcm1hbCA2NC1iaXQgc3lzdGVtIiA+JjY7IH0KLSAgICAgICAgICAgICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogICAgICAgICAgICAgIGEgbm9ybWFsIDY0LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKLSNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAotI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCi10eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwotdHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Ci10eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKLSNlbmRpZgotRU9GCi07OwotICAgICAxOjI6NDo4OjQpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyAkdCA2NC1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDMyLWJpdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgJHQgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQiID4mNjsgfQotICAgICAgICAgICAgICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAgICAgICAgICAgICAgYSA2NC1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDMyLWJpdCBzeXN0ZW0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OwotI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCi0jZGVmaW5lIF9faW50OF90X2RlZmluZWQKLXR5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Ci10eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKLXR5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICopCi0gICAgYXNfZm5fZXJyb3IgJD8gIiAkYWNfY3Zfc2l6ZW9mX1ggIHdoYXQgaXMgdGhhdCBhIHN5c3RlbT8gY29udGFjdCB0aGUgYXV0aG9yLCBxdWljayEgaHR0cDovL2FjLWFyY2hpdmUuc2YubmV0IiAiJExJTkVOTyIgNQotICAgIGV4aXQgMQotOzsKLSAgIGVzYWMKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGJhc2ljIGludCB0eXBlcyBTVEFSVCBpbnQ2NF90IHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfdWludDY0X3QiID0gInllcyIKLXRoZW4geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLiBzZWVuIGdvb2QgdWludDY0X3QiID4mNQotJGFzX2VjaG8gIi4uLiBzZWVuIGdvb2QgdWludDY0X3QiID4mNjsgfQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogc3lzdGVtIGhlYWRlcnMgaGF2ZSBnb29kIHVpbnQ2NF90ICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi0jZW5kaWYKLUVPRgotCi1lbGlmIHRlc3QgIiRhY19jdl90eXBlX3VfaW50NjRfdCIgPSAieWVzIgotdGhlbiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3QiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIHR5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90IiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIHN5c3RlbSBoZWFkZXJzIGhhdmUgYW4gdV9pbnQ2NF90ICovCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdDsKLSNlbmRpZgotRU9GCi1lbHNlIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyBnZW5lcmljIHVpbnQ2NF90IHJ1bnRpbWUgY2hlY2tzIiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyBnZW5lcmljIHVpbnQ2NF90IHJ1bnRpbWUgY2hlY2tzIiA+JjY7IH0KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDY0IEJJVCBHRU5FUklDIFNFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGhlcmUgYXJlIHNvbWUgY29tbW9uIGhldXJpc3RpY3MgdXNpbmcgY29tcGlsZXIgcnVudGltZSBzcGVjaWZpY3MgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fID4gMTk5OTAxTAotCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLQotI2VsaWYgIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fV0FUQ09NQ19fIHx8IGRlZmluZWQgX19CT1JMQU5EQ19fCi0KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OwotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQgX19HTlVDX18gfHwgZGVmaW5lZCBfX01XRVJLU19fIHx8IGRlZmluZWQgX19FTEZfXwotCi0jaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCi0jaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCi0jZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkIF9fYWxwaGEgfHwgKGRlZmluZWQgX19taXBzICYmIGRlZmluZWQgX0FCSU4zMikKLQotI2lmICFkZWZpbmVkIF9OT19MT05HTE9ORwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLSNlbmRpZgotICAvKiBjb21waWxlci9jcHUgdHlwZSAuLi4gb3IganVzdCBJU08gQzk5ICovCi0jZW5kaWYKLSNlbmRpZgotRU9GCi0KLSMgcGx1cyBhIGRlZmF1bHQgNjQtYml0IGZvciBzeXN0ZW1zIHRoYXQgYXJlIGxpa2VseSB0byBiZSA2NC1iaXQgcmVhZHkKLSAgY2FzZSAiJGFjX2N2X3NpemVvZl94OiRhY19jdl9zaXplb2Zfdm9pZHA6JGFjX2N2X3NpemVvZl9sb25nIiBpbgotICAgIDE6Mjo4OjgpIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB1aW50NjRfdCBkZWZhdWx0IiA+JjY7IH0KLWNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogREVGQVVMVDogKi8KLS8qIHNlZW4gbm9ybWFsIDY0LWJpdCBzeXN0ZW0sIENDIGhhcyBzaXplb2YobG9uZyBhbmQgdm9pZCopID09IDggYnl0ZXMgKi8KLSNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKLSNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKLXR5cGVkZWYgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAgMToyOjQ6OCkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNQotJGFzX2VjaG8gIi4uYWRkaW5nIHVpbnQ2NF90IGRlZmF1bHQiID4mNjsgfQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBERUZBVUxUOiAqLwotLyogc2VlbiAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQsIENDIGhhcyBzaXplb2YobG9uZykgPT0gOCBieXRlcyAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDY0X3Q7Ci0jZW5kaWYKLUVPRgotOzsKLSAgICAxOjI6ODo0KSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgdWludDY0X3QgZGVmYXVsdCIgPiY2OyB9Ci1jYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIERFRkFVTFQ6ICovCi0vKiBzZWVuIDY0LWJpdCBkZXJpdmVkIGZyb20gYSAzMi1iaXQsIENDIGhhcyBzaXplb2YobG9uZykgPT0gNCBieXRlcyAqLwotI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAotI2RlZmluZSBfSEFWRV9VSU5UNjRfVAotdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotI2VuZGlmCi1FT0YKLTs7Ci0gICAqKQotY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiBOT1RFOiAqLwotLyogdGhlIGNvbmZpZ3VyZS1jaGVja3MgZm9yIHRoZSBiYXNpYyB0eXBlcyBkaWQgbm90IG1ha2UgdXMgYmVsaWV2ZSAqLwotLyogdGhhdCB3ZSBjb3VsZCBhZGQgYSBmYWxsYmFjayB0byBhICdsb25nIGxvbmcnIHR5cGVkZWYgdG8gaW50NjRfdCAqLwotRU9GCi0gIGVzYWMKLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludDY0X3QgdHlwZXMgU1RBUlQgaW50cHRyIHR5cGVzIC0tLS0tLS0tLS0tLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAibm8tZmlsZSIgOyB0aGVuCi0gIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBUUiBTRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotRU9GCi0gIGNhc2UgIiRhY19jdl9zaXplb2ZfeDokYWNfY3Zfc2l6ZW9mX3ZvaWRwIiBpbgotICAxOjI6MikKLSAgICBhPSJpbnQxNl90IiA7IGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotLyogd2UgdGVzdGVkIHNpemVvZih2b2lkKikgdG8gYmUgb2YgMiBjaGFycywgaGVuY2Ugd2UgZGVjbGFyZSBpdCAxNi1iaXQgKi8KLQotdHlwZWRlZiB1aW50MTZfdCB1aW50cHRyX3Q7Ci10eXBlZGVmICBpbnQxNl90ICBpbnRwdHJfdDsKLUVPRgotOzsKLSAgMToyOjQpCi0gICAgYT0iaW50MzJfdCIgOyBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLS8qIHdlIHRlc3RlZCBzaXplb2Yodm9pZCopIHRvIGJlIG9mIDQgY2hhcnMsIGhlbmNlIHdlIGRlY2xhcmUgaXQgMzItYml0ICovCi0KLXR5cGVkZWYgdWludDMyX3QgdWludHB0cl90OwotdHlwZWRlZiAgaW50MzJfdCAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIDE6Mjo4KQotICAgIGE9ImludDY0X3QiIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSB0byBiZSBvZiA4IGNoYXJzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IDY0LWJpdCAqLwotCi10eXBlZGVmIHVpbnQ2NF90IHVpbnRwdHJfdDsKLXR5cGVkZWYgIGludDY0X3QgIGludHB0cl90OwotRU9GCi07OwotICAqKQotICAgIGE9ImxvbmciIDsgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0vKiB3ZSB0ZXN0ZWQgc2l6ZW9mKHZvaWQqKSBidXQgZ290IG5vIGd1ZXNzLCBoZW5jZSB3ZSBkZWNsYXJlIGl0IGFzIGlmIGxvbmcgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRwdHJfdDsKLXR5cGVkZWYgICAgICAgICAgbG9uZyAgaW50cHRyX3Q7Ci1FT0YKLTs7Ci0gIGVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyB0eXBlZGVmICRhIGludHB0cl90IiA+JjUKLSRhc19lY2hvICIuLmFkZGluZyB0eXBlZGVmICRhIGludHB0cl90IiA+JjY7IH0KLWZpCi0KLSMgLS0tLS0tLS0tLS0tLSBET05FIGludHB0ciB0eXBlcyBTVEFSVCBpbnRfbGVhc3QgdHlwZXMgLS0tLS0tLS0tLS0tCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90IiA9ICJubyI7IHRoZW4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLmFkZGluZyBnZW5lcmljIGludF9sZWFzdC10eXBlcyIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgZ2VuZXJpYyBpbnRfbGVhc3QtdHlwZXMiID4mNjsgfQotICAgICBjYXQgPj4kYWNfc3RkaW50X2ggPDxFT0YKLQotLyogLS0tLS0tLS0tLS0tLS1HRU5FUklDIElOVF9MRUFTVCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiAgaW50OF90ICAgIGludF9sZWFzdDhfdDsKLXR5cGVkZWYgIGludDE2X3QgICBpbnRfbGVhc3QxNl90OwotdHlwZWRlZiAgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiAgaW50NjRfdCAgIGludF9sZWFzdDY0X3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiB1aW50OF90ICAgdWludF9sZWFzdDhfdDsKLXR5cGVkZWYgdWludDE2X3QgIHVpbnRfbGVhc3QxNl90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9sZWFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiB1aW50NjRfdCAgdWludF9sZWFzdDY0X3Q7Ci0jZW5kaWYKLUVPRgotZmkKLQotIyAtLS0tLS0tLS0tLS0tIERPTkUgaW50cHRyIHR5cGVzIFNUQVJUIGludF9sZWFzdCB0eXBlcyAtLS0tLS0tLS0tLS0KLWlmIHRlc3QgIiRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSAibm8iOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi5hZGRpbmcgZ2VuZXJpYyBpbnRfZmFzdC10eXBlcyIgPiY1Ci0kYXNfZWNobyAiLi5hZGRpbmcgZ2VuZXJpYyBpbnRfZmFzdC10eXBlcyIgPiY2OyB9Ci0gICAgIGNhdCA+PiRhY19zdGRpbnRfaCA8PEVPRgotCi0vKiAtLS0tLS0tLS0tLS0tLUdFTkVSSUMgSU5UX0ZBU1QgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgIGludDhfdCAgICBpbnRfZmFzdDhfdDsKLXR5cGVkZWYgIGludDMyX3QgICBpbnRfZmFzdDE2X3Q7Ci10eXBlZGVmICBpbnQzMl90ICAgaW50X2Zhc3QzMl90OwotI2lmZGVmIF9IQVZFX0lOVDY0X1QKLXR5cGVkZWYgIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7Ci0jaWZkZWYgX0hBVkVfSU5UNjRfVAotdHlwZWRlZiB1aW50NjRfdCAgdWludF9mYXN0NjRfdDsKLSNlbmRpZgotRU9GCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJuby1maWxlIiA7IHRoZW4KLSAgICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLSNpZmRlZiBfSEFWRV9JTlQ2NF9UCi10eXBlZGVmIGludDY0X3QgICAgICAgIGludG1heF90OwotdHlwZWRlZiB1aW50NjRfdCAgICAgIHVpbnRtYXhfdDsKLSNlbHNlCi10eXBlZGVmIGxvbmcgaW50ICAgICAgIGludG1heF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRtYXhfdDsKLSNlbmRpZgotRU9GCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogLi4uIERPTkUgJGFjX3N0ZGludF9oIiA+JjUKLSRhc19lY2hvICIuLi4gRE9ORSAkYWNfc3RkaW50X2giID4mNjsgfQotICAgY2F0ID4+JGFjX3N0ZGludF9oIDw8RU9GCi0KLSAgLyogb25jZSAqLwotI2VuZGlmCi0jZW5kaWYKLUVPRgotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbl9hZGRyX3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGluX2FkZHJfdC4uLiAiID4mNjsgfQotaWYgJHt2bmNfY3ZfaW5hZGRydCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLSAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotaW50Ci1tYWluICgpCi17Ci1pbl9hZGRyX3QgZm9vOyByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBpbmFkZHJ0PXllcwotZWxzZQotICBpbmFkZHJ0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0LAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR2bmNfY3ZfaW5hZGRydCIgPiY1Ci0kYXNfZWNobyAiJHZuY19jdl9pbmFkZHJ0IiA+JjY7IH0KLQotaWYgdGVzdCAkaW5hZGRydCA9IG5vIDsgdGhlbgotICAkYXNfZWNobyAiI2RlZmluZSBORUVEX0lOQUREUl9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgbWVtY21wIGFyZSBub3QgOC1iaXQgY2xlYW4uICAqLwotICBjaGFyIGMwID0gJ1wxMDAnLCBjMSA9ICdcMjAwJywgYzIgPSAnXDIwMSc7Ci0gIGlmIChtZW1jbXAoJmMwLCAmYzIsIDEpID49IDAgfHwgbWVtY21wKCZjMSwgJmMyLCAxKSA+PSAwKQotICAgIHJldHVybiAxOwotCi0gIC8qIFRoZSBOZXh0IHg4NiBPcGVuU3RlcCBidWcgc2hvd3MgdXAgb25seSB3aGVuIGNvbXBhcmluZyAxNiBieXRlcwotICAgICBvciBtb3JlIGFuZCB3aXRoIGF0IGxlYXN0IG9uZSBidWZmZXIgbm90IHN0YXJ0aW5nIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotICAgICBXaWxsaWFtIExld2lzIHByb3ZpZGVkIHRoaXMgdGVzdCBwcm9ncmFtLiAgICovCi0gIHsKLSAgICBjaGFyIGZvb1syMV07Ci0gICAgY2hhciBiYXJbMjFdOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICB7Ci0JY2hhciAqYSA9IGZvbyArIGk7Ci0JY2hhciAqYiA9IGJhciArIGk7Ci0Jc3RyY3B5IChhLCAiLS0tLS0tLS0wMTExMTExMSIpOwotCXN0cmNweSAoYiwgIi0tLS0tLS0tMTAwMDAwMDAiKTsKLQlpZiAobWVtY21wIChhLCBiLCAxNikgPj0gMCkKLQkgIHJldHVybiAxOwotICAgICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9eWVzCi1lbHNlCi0gIGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyIgPiY2OyB9Ci10ZXN0ICRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nID0gbm8gJiYgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBtZW1jbXAuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsc3RhdCBjb3JyZWN0bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxzdGF0IGNvcnJlY3RseSBoYW5kbGVzIHRyYWlsaW5nIHNsYXNoLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluays6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0LnN5bSBjb25mdGVzdC5maWxlCi1lY2hvID5jb25mdGVzdC5maWxlCi1pZiB0ZXN0ICIkYXNfbG5fcyIgPSAibG4gLXMiICYmIGxuIC1zIGNvbmZ0ZXN0LmZpbGUgY29uZnRlc3Quc3ltOyB0aGVuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCBzdGF0IHNidWY7Ci0gICAgIC8qIExpbnV4IHdpbGwgZGVyZWZlcmVuY2UgdGhlIHN5bWxpbmsgYW5kIGZhaWwsIGFzIHJlcXVpcmVkIGJ5IFBPU0lYLgotCVRoYXQgaXMgYmV0dGVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1lYW5zIHdlIHdpbGwgbm90Ci0JaGF2ZSB0byBjb21waWxlIGFuZCB1c2UgdGhlIGxzdGF0IHdyYXBwZXIuICAqLwotICAgICByZXR1cm4gbHN0YXQgKCJjb25mdGVzdC5zeW0vIiwgJnNidWYpID09IDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9eWVzCi1lbHNlCi0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWVsc2UKLSAgIyBJZiB0aGUgYGxuIC1zJyBjb21tYW5kIGZhaWxlZCwgdGhlbiB3ZSBwcm9iYWJseSBkb24ndCBldmVuCi0gICMgaGF2ZSBhbiBsc3RhdCBmdW5jdGlvbi4KLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCi1maQotcm0gLWYgY29uZnRlc3Quc3ltIGNvbmZ0ZXN0LmZpbGUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA+JjY7IH0KLQotdGVzdCAkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rID0geWVzICYmCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotX0FDRU9GCi0KLQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID0geG5vOyB0aGVuCi0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIGxzdGF0LiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBsc3RhdC4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGFjY2VwdHMgYW4gZW1wdHkgc3RyaW5nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9eWVzCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCBzdGF0IHNidWY7Ci0gIHJldHVybiBzdGF0ICgiIiwgJnNidWYpID09IDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zz1ubwotZWxzZQotICBhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zz15ZXMKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnID0geWVzOyB0aGVuCi0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIHN0YXQuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIHN0YXQuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgMQotX0FDRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHN0cmZ0aW1lCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmZ0aW1lIiAiYWNfY3ZfZnVuY19zdHJmdGltZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKLV9BQ0VPRgotCi1lbHNlCi0gICMgc3RyZnRpbWUgaXMgaW4gLWxpbnRsIG9uIFNDTyBVTklYLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJmdGltZSBpbiAtbGludGwuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2ludGxfc3RyZnRpbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHN0cmZ0aW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc3RyZnRpbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2ludGxfc3RyZnRpbWU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJGVElNRSAxIiA+PmNvbmZkZWZzLmgKLQotTElCUz0iLWxpbnRsICRMSUJTIgotZmkKLQotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gdnByaW50ZgotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ2cHJpbnRmIiAiYWNfY3ZfZnVuY192cHJpbnRmIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3ZwcmludGYiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9WUFJJTlRGIDEKLV9BQ0VPRgotCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJfZG9wcm50IiAiYWNfY3ZfZnVuY19fZG9wcm50IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX19kb3BybnQiID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfRE9QUk5UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1maQotZG9uZQotCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInBpZF90IiAiYWNfY3ZfdHlwZV9waWRfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX3BpZF90IiA9IHh5ZXM7IHRoZW4gOgotCi1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgcGlkX3QgaW50Ci1fQUNFT0YKLQotZmkKLQotZm9yIGFjX2hlYWRlciBpbiB2Zm9yay5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ2Zm9yay5oIiAiYWNfY3ZfaGVhZGVyX3Zmb3JrX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3Zmb3JrX2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9yayIgPSB4eWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yayIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBmb3JrLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Z1bmNfZm9ya193b3Jrcys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPWNyb3NzCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLQotCSAgLyogQnkgUnVlZGlnZXIgS3VobG1hbm4uICovCi0JICByZXR1cm4gZm9yayAoKSA8IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA+JjY7IH0KLQotZWxzZQotICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9JGFjX2N2X2Z1bmNfZm9yawotZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgotICBjYXNlICRob3N0IGluCi0gICAgKi0qLWFtaWdhb3MqIHwgKi0qLW1zZG9zZGpncHAqKQotICAgICAgIyBPdmVycmlkZSwgYXMgdGhlc2Ugc3lzdGVtcyBoYXZlIG9ubHkgYSBkdW1teSBmb3JrKCkgc3R1YgotICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCi0gICAgICA7OwotICAgICopCi0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiYyO30KLWZpCi1hY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2Z1bmNfdmZvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9Y3Jvc3MKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmZGVmIEhBVkVfVkZPUktfSAotIyBpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwotICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4gIFRoZSBjb21waWxlcgotICAgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LCBidXQgc29tZSBjb21waWxlcnMKLSAgIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEKLSAgIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzIGlzIHB1dCBpbnRvIGEgcmVnaXN0ZXIgdGhhdCBpcwotICAgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fY3BsdXNwbHVzCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCi0jIGVsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkgewotICAgIGNoaWxkID0gdmZvcmsgKCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVycm9yICgidmZvcmsiKTsKLSAgICAgIF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7Ci0gICAgICBhcmcgPSBnZXRwaWQoKTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBfZXhpdCAoYXJnKTsKLSAgICB9Ci0gIH0KLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKLSAgcGlkX3QgY2hpbGQ7Ci0KLSAgc3BhcmNfYWRkcmVzc190ZXN0ICgwKTsKLQotICBjaGlsZCA9IHZmb3JrICgpOwotCi0gIGlmIChjaGlsZCA9PSAwKSB7Ci0gICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLiAgVGhpcwotICAgICAgIHRlc3QgdXNlcyBsb3RzIG9mIGxvY2FsIHZhcmlhYmxlcywgYXQgbGVhc3QgYXMgbWFueSBsb2NhbAotICAgICAgIHZhcmlhYmxlcyBhcyBtYWluIGhhcyBhbGxvY2F0ZWQgc28gZmFyIGluY2x1ZGluZyBjb21waWxlcgotICAgICAgIHRlbXBvcmFyaWVzLiAgNCBsb2NhbHMgYXJlIGVub3VnaCBmb3IgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMKLSAgICAgICA0LjEuMyBzcGFyYywgYnV0IHdlIHVzZSA4IHRvIGJlIHNhZmUuICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZAotICAgICAgIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLAotICAgICAgIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdCBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZQotICAgICAgIGluIHRoaXMgcm91dGluZS4gIEFzc2lnbmluZyB0byB0aGUgbG9jYWwgdmFyaWFibGUgd2lsbCB0aHVzCi0gICAgICAgbXVuZ2UgcGFyZW50IGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gICovCi0gICAgcGlkX3QKLSAgICAgIHAgPSBnZXRwaWQoKSwgcDEgPSBnZXRwaWQoKSwgcDIgPSBnZXRwaWQoKSwgcDMgPSBnZXRwaWQoKSwKLSAgICAgIHA0ID0gZ2V0cGlkKCksIHA1ID0gZ2V0cGlkKCksIHA2ID0gZ2V0cGlkKCksIHA3ID0gZ2V0cGlkKCk7Ci0gICAgLyogQ29udmluY2UgdGhlIGNvbXBpbGVyIHRoYXQgcC4ucDcgYXJlIGxpdmU7IG90aGVyd2lzZSwgaXQgbWlnaHQKLSAgICAgICB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgcmVnaXN0ZXIgZm9yIGFsbCA4IGxvY2FsIHZhcmlhYmxlcy4gICovCi0gICAgaWYgKHAgIT0gcDEgfHwgcCAhPSBwMiB8fCBwICE9IHAzIHx8IHAgIT0gcDQKLQl8fCBwICE9IHA1IHx8IHAgIT0gcDYgfHwgcCAhPSBwNykKLSAgICAgIF9leGl0KDEpOwotCi0gICAgLyogT24gc29tZSBzeXN0ZW1zIChlLmcuIElSSVggMy4zKSwgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQKLSAgICAgICBmcm9tIGNoaWxkIGZpbGUgZGVzY3JpcHRvcnMuICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEgZGVzY3JpcHRvcgotICAgICAgIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IKLSAgICAgICBhcyB3ZWxsLiAgVGVzdCBmb3IgdGhpcyBieSBjbG9zaW5nIHN0ZG91dCBpbiB0aGUgY2hpbGQuICAqLwotICAgIF9leGl0KGNsb3NlKGZpbGVubyhzdGRvdXQpKSAhPSAwKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgc3RhdHVzOwotICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpCi0gICAgICA7Ci0gICAgcmV0dXJuICgKLQkgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KLQkgY2hpbGQgPCAwCi0KLQkgLyogRGlkIHRoZSBjaGlsZCBmYWlsPyAgKFRoaXMgc2hvdWxkbid0IGhhcHBlbi4pICAqLwotCSB8fCBzdGF0dXMKLQotCSAvKiBEaWQgdGhlIHZmb3JrL2NvbXBpbGVyIGJ1ZyBvY2N1cj8gICovCi0JIHx8IHBhcmVudCAhPSBnZXRwaWQoKQotCi0JIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCi0JIHx8IGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpICE9IDAKLQkgKTsKLSAgfQotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMKLWVsc2UKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA+JjY7IH0KLQotZmk7Ci1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiYyO30KLWZpCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfV09SS0lOR19WRk9SSyAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotCi0kYXNfZWNobyAiI2RlZmluZSB2Zm9yayBmb3JrIiA+PmNvbmZkZWZzLmgKLQotZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XT1JLSU5HX0ZPUksgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGdldGhvc3RieW5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRob3N0YnluYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQk5TTCAxCi1fQUNFT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc29ja2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc29ja2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PXllcwotZWxzZQotICBhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJTT0NLRVQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWZpCi0KLQotdW5hbWVfcz1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAKLWlmIHRlc3QgIngkdW5hbWVfcyIgPSAieEhQLVVYIjsgdGhlbgotCSMgbmVlZCAtbHNlYyBmb3IgZ2V0c3BuYW0oKQotCUxERkxBR1M9IiRMREZMQUdTIC1sc2VjIgotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZnRpbWUgZ2V0aG9zdGJ5bmFtZSBnZXRob3N0bmFtZSBnZXR0aW1lb2ZkYXkgaW5ldF9udG9hIG1lbW1vdmUgbWVtc2V0IG1tYXAgbWtmaWZvIHNlbGVjdCBzb2NrZXQgc3RyY2hyIHN0cmNzcG4gc3RyZHVwIHN0cmVycm9yIHN0cnN0cgotZG8gOgotICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLSMgeDExdm5jIG9ubHk6Ci1pZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0JZm9yIGFjX2Z1bmMgaW4gc2V0c2lkIHNldHBncnAgZ2V0cHd1aWQgZ2V0cHduYW0gZ2V0c3BuYW0gZ2V0dWlkIGdldGV1aWQgc2V0dWlkIHNldGdpZCBzZXRldWlkIHNldGVnaWQgaW5pdGdyb3VwcyB3YWl0cGlkIHNldHV0eGVudCBncmFudHB0IHNobWF0Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotZmkKLQotIyBjaGVjaywgaWYgc2htZ2V0IGlzIGluIGN5Z2lwYy5hCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaG1nZXQgaW4gLWxjeWdpcGMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNobWdldCBpbiAtbGN5Z2lwYy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfY3lnaXBjX3NobWdldCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3lnaXBjICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaG1nZXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzaG1nZXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jeWdpcGNfc2htZ2V0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2N5Z2lwY19zaG1nZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3lnaXBjX3NobWdldCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQkNZR0lQQyAxCi1fQUNFT0YKLQotICBMSUJTPSItbGN5Z2lwYyAkTElCUyIKLQotZmkKLQotIGlmIHRlc3QgIiRIQVZFX0NZR0lQQyIgPSAidHJ1ZSI7IHRoZW4KLSAgQ1lHSVBDX1RSVUU9Ci0gIENZR0lQQ19GQUxTRT0nIycKLWVsc2UKLSAgQ1lHSVBDX1RSVUU9JyMnCi0gIENZR0lQQ19GQUxTRT0KLWZpCi0KLQotIyBDaGVjayBpZiAvdXNyL2luY2x1ZGUvbGludXggZXhpc3RzLCBpZiBzbywgZGVmaW5lIExJTlVYCi0gaWYgdGVzdCAtZCAvdXNyL2luY2x1ZGUvbGludXg7IHRoZW4KLSAgTElOVVhfVFJVRT0KLSAgTElOVVhfRkFMU0U9JyMnCi1lbHNlCi0gIExJTlVYX1RSVUU9JyMnCi0gIExJTlVYX0ZBTFNFPQotZmkKLQotCi0jIENoZWNrIGZvciBPUyBYIHNwZWNpZmljIGhlYWRlcgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIkFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oIiAiYWNfY3ZfaGVhZGVyX0FwcGxpY2F0aW9uU2VydmljZXNfQXBwbGljYXRpb25TZXJ2aWNlc19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9BcHBsaWNhdGlvblNlcnZpY2VzX0FwcGxpY2F0aW9uU2VydmljZXNfaCIgPSB4eWVzOyB0aGVuIDoKLSAgSEFWRV9PU1g9InRydWUiCi1maQotCi0KLSBpZiB0ZXN0ICIkSEFWRV9PU1giID0gInRydWUiOyB0aGVuCi0gIE9TWF9UUlVFPQotICBPU1hfRkFMU0U9JyMnCi1lbHNlCi0gIE9TWF9UUlVFPScjJwotICBPU1hfRkFMU0U9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIEFuZHJvaWQgc3BlY2lmaWMgaGVhZGVyCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiYW5kcm9pZC9hcGktbGV2ZWwuaCIgImFjX2N2X2hlYWRlcl9hbmRyb2lkX2FwaV9sZXZlbF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9hbmRyb2lkX2FwaV9sZXZlbF9oIiA9IHh5ZXM7IHRoZW4gOgotICBIQVZFX0FORFJPSUQ9InRydWUiCi1maQotCi0KLSBpZiB0ZXN0ICIkSEFWRV9BTkRST0lEIiA9ICJ0cnVlIjsgdGhlbgotICBBTkRST0lEX1RSVUU9Ci0gIEFORFJPSURfRkFMU0U9JyMnCi1lbHNlCi0gIEFORFJPSURfVFJVRT0nIycKLSAgQU5EUk9JRF9GQUxTRT0KLWZpCi0KLWlmIHRlc3QgIiRIQVZFX0FORFJPSUQiID0gInRydWUiOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQU5EUk9JRCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotIyBPbiBTb2xhcmlzIDIuNywgd3JpdGUoKSByZXR1cm5zIEVOT0VOVCB3aGVuIGl0IHJlYWxseSBtZWFucyBFQUdBSU4KLQotY2FzZSBgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIGluCi0gICAgIlN1bk9TIDUuNyIpCi0JJGFzX2VjaG8gIiNkZWZpbmUgRU5PRU5UX1dPUktBUk9VTkQgMSIgPj5jb25mZGVmcy5oCi0KLSAgICA7OwotZXNhYwotCi0jIENoZWNrIGZvciBycG0gU09VUkNFUyBwYXRoCi1wcmludGYgImNoZWNraW5nIGZvciBycG0gc291cmNlcyBwYXRoLi4uICIKLVJQTVNPVVJDRURJUj0iTk9ULUZPVU5EIgotZm9yIGRpcmVjdG9yeSBpbiBwYWNrYWdlcyBPcGVuTGludXggcmVkaGF0IFJlZEhhdCBycG0gUlBNICIiIDsgZG8KLQlpZiB0ZXN0IC1kIC91c3Ivc3JjLyR7ZGlyZWN0b3J5fS9TT1VSQ0VTOyB0aGVuCi0JCVJQTVNPVVJDRURJUj0iL3Vzci9zcmMvJHtkaXJlY3Rvcnl9L1NPVVJDRVMvIgotCWZpCi1kb25lCi1lY2hvICIkUlBNU09VUkNFRElSIgotIGlmIHRlc3QgIiRSUE1TT1VSQ0VESVIiICE9ICJOT1QtRk9VTkQiOyB0aGVuCi0gIEhBVkVfUlBNX1RSVUU9Ci0gIEhBVkVfUlBNX0ZBTFNFPScjJwotZWxzZQotICBIQVZFX1JQTV9UUlVFPScjJwotICBIQVZFX1JQTV9GQUxTRT0KLWZpCi0KLSBpZiB0ZXN0ICIkYnVpbGRfeDExdm5jIiA9ICJ5ZXMiOyB0aGVuCi0gIFdJVEhfWDExVk5DX1RSVUU9Ci0gIFdJVEhfWDExVk5DX0ZBTFNFPScjJwotZWxzZQotICBXSVRIX1gxMVZOQ19UUlVFPScjJwotICBXSVRIX1gxMVZOQ19GQUxTRT0KLWZpCi0KLQotCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgbGlidm5jc2VydmVyLnBjIGxpYnZuY2NsaWVudC5wYyBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUgZXhhbXBsZXMvTWFrZWZpbGUgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSB2bmN0ZXJtL01ha2VmaWxlIHdlYmNsaWVudHMvTWFrZWZpbGUgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSBsaWJ2bmNjbGllbnQvTWFrZWZpbGUgY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIHRlc3QvTWFrZWZpbGUgbGlidm5jc2VydmVyLWNvbmZpZyBMaWJWTkNTZXJ2ZXIuc3BlYyIKLQotIwotIyB4MTF2bmMgb25seToKLSMKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQkjCi0JIyBOT1RFOiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBMaWJWTkNTZXJ2ZXItWC5ZLloudGFyLmd6IHNvdXJjZQotCSMgdGFyYmFsbCBhbmQgbmV2ZXJ0aGVsZXNzIHdhbnQgdG8gcnVuIGF1dG9jb25mIChpLmUuIGFjbG9jYWwsCi0JIyBhdXRvaGVhZGVyLCBhdXRvbWFrZSwgYXV0b2NvbmYpIEFHQUlOIChwZXJoYXBzIHlvdSBoYXZlIGEKLQkjIHNwZWNpYWwgdGFyZ2V0IHN5c3RlbSwgZS5nLiBlbWJlZGRlZCkgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvCi0JIyBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nICdBQ19DT05GSUdfRklMRVMnIGxpbmUgdG8gYXZvaWQKLQkjIGF1dG9tYWtlIGVycm9yIG1lc3NhZ2VzIGxpa2U6Ci0JIwotCSMgY29uZmlndXJlLmFjOjY5MDogcmVxdWlyZWQgZmlsZSBgeDExdm5jL01ha2VmaWxlLmluJyBub3QgZm91bmQKLQkjCi0JYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIHgxMXZuYy9NYWtlZmlsZSB4MTF2bmMvbWlzYy9NYWtlZmlsZSB4MTF2bmMvbWlzYy90dXJib3ZuYy9NYWtlZmlsZSIKLQotCi0JaWYgdGVzdCAhIC16ICIkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAtYSAieCR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiICE9ICJ4bm8iOyB0aGVuCi0JCSMgbmVlZCB0byBtb3ZlIGxvY2FsIHRhcmJhbGwgcmZiIGhlYWRlcnMgYXNpZGU6Ci0JCWhkcnM9InJmYi5oIHJmYmNsaWVudC5oIHJmYnByb3RvLmggcmZicmVnaW9uLmggcmZiaW50LmgiCi0JCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogbW92aW5nIGFzaWRlIGhlYWRlcnMgJGhkcnMiCi0JCWZvciBoZHIgaW4gJGhkcnMKLQkJZG8KLQkJCWlmIHRlc3QgLWYgInJmYi8kaGRyIjsgdGhlbgotCQkJCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogbW92aW5nIHJmYi8kaGRyIHRvIHJmYi8kaGRyLk9SSUciCi0JCQkJbXYgcmZiLyRoZHIgcmZiLyRoZHIuT1JJRwotCQkJZmkKLQkJZG9uZQotCQllY2hvICJ3aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXI6ICpOT1RFKiBtb3ZlIHRoZW0gYmFjayBtYW51YWxseSB0byBzdGFydCBvdmVyLiIKLQlmaQotZmkKLQotYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGNobW9kLWxpYnZuY3NlcnZlci1jb25maWciCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAotICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAoc2V0KSAyPiYxIHwKLSAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCi0gICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQotICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQotICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KLSAgICAgIHNlZCAtbiBcCi0JInMvJy8nXFxcXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKSB8Ci0gIHNlZCAnCi0gICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAotICAgICB0IGNsZWFyCi0gICAgIDpjbGVhcgotICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCi0gICAgIHQgZW5kCi0gICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LwotICAgICA6ZW5kJyA+PmNvbmZjYWNoZQotaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIjsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgotCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKLSAgICAgIGVsc2UKLSAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAotICAgICAgICAqLyogfCA/OiopCi0JICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCi0JICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAotICAgICAgICAqKQotCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLVU9Ci1mb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCi0gICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKLSAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0gIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCT0JKUz0kYWNfbGlib2JqcwotCi1MVExJQk9CSlM9JGFjX2x0bGlib2JqcwotCi0KLSBpZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgotICBhbV9fRVhFRVhUX1RSVUU9Ci0gIGFtX19FWEVFWFRfRkFMU0U9JyMnCi1lbHNlCi0gIGFtX19FWEVFWFRfVFJVRT0nIycKLSAgYW1fX0VYRUVYVF9GQUxTRT0KLWZpCi0KLWlmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENYWFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9GRk1QRUdfVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9GRk1QRUdfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX0ZGTVBFR1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9NUDNMQU1FX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTVAzTEFNRV9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfTVAzTEFNRVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJTU0xfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9MSUJTU0xfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlNTTFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9YMTFfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9YMTFfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX1gxMVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7T1NYX09QRU5HTF9UUlVFfSIgJiYgdGVzdCAteiAiJHtPU1hfT1BFTkdMX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiT1NYX09QRU5HTFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUlwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJQVEhSRUFEX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCUFRIUkVBRF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfTElCUFRIUkVBRFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUlwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7V0lUSF9XRUJTT0NLRVRTX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfV0VCU09DS0VUU19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIldJVEhfV0VCU09DS0VUU1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJaX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCWl9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfTElCWlwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJKUEVHX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfTElCSlBFR19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfTElCSlBFR1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJQTkdfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9MSUJQTkdfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlBOR1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJTRExfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9MSUJTRExfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQlNETFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9MSUJHVEtfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9MSUJHVEtfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0xJQkdUS1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7TUlOR1dfVFJVRX0iICYmIHRlc3QgLXogIiR7TUlOR1dfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNSU5HV1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLWlmIHRlc3QgLXogIiR7SEFWRV9HTlVUTFNfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9HTlVUTFNfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0dOVVRMU1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQotZmkKLQotaWYgdGVzdCAteiAiJHtDWUdJUENfVFJVRX0iICYmIHRlc3QgLXogIiR7Q1lHSVBDX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQ1lHSVBDXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtMSU5VWF9UUlVFfSIgJiYgdGVzdCAteiAiJHtMSU5VWF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkxJTlVYXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtPU1hfVFJVRX0iICYmIHRlc3QgLXogIiR7T1NYX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiT1NYXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtBTkRST0lEX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FORFJPSURfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTkRST0lEXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtIQVZFX1JQTV9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX1JQTV9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfUlBNXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAteiAiJHtXSVRIX1gxMVZOQ19UUlVFfSIgJiYgdGVzdCAteiAiJHtXSVRIX1gxMVZOQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIldJVEhfWDExVk5DXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1Ci1maQotCi06ICIke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfSIKLWFjX3dyaXRlX2ZhaWw9MAotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQotYXNfd3JpdGVfZmFpbD0wCi1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotZGVidWc9ZmFsc2UKLWFjX2NzX3JlY2hlY2s9ZmFsc2UKLWFjX2NzX3NpbGVudD1mYWxzZQotCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotZXhwb3J0IFNIRUxMCi1fQVNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7ICMoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0KLQotYXNfbmw9JwotJwotZXhwb3J0IGFzX25sCi0jIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgotYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLSMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAotIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KLWlmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKLSAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50IC1yIC0tJwotICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKLWVsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnRmICVzXG4nCi0gIGFzX2VjaG9fbj0ncHJpbnRmICVzJwotZWxzZQotICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJwotICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKLSAgZWxzZQotICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCi0gICAgYXNfZWNob19uX2JvZHk9J2V2YWwKLSAgICAgIGFyZz0kMTsKLSAgICAgIGNhc2UgJGFyZyBpbiAjKAotICAgICAgKiIkYXNfbmwiKikKLQlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKLQlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OwotICAgICAgZXNhYzsKLSAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKLSAgICAnCi0gICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Ci0gICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKLSAgZmkKLSAgZXhwb3J0IGFzX2VjaG9fYm9keQotICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCi1maQotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIFBBVEhfU0VQQVJBVE9SPToKLSAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgewotICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gICAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgfQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1hc19teXNlbGY9Ci1jYXNlICQwIGluICMoKAotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIGV4aXQgMQotZmkKLQotIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgotIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgotIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAotIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KLWZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKLWRvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCi0gICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1MQ19BTEw9QwotZXhwb3J0IExDX0FMTAotTEFOR1VBR0U9QwotZXhwb3J0IExBTkdVQUdFCi0KLSMgQ0RQQVRILgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0KLSMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQotIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCi0jIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgotYXNfZm5fZXJyb3IgKCkKLXsKLSAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKLSAgaWYgdGVzdCAiJDQiOyB0aGVuCi0gICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgotICBhc19mbl9leGl0ICRhc19zdGF0dXMKLX0gIyBhc19mbl9lcnJvcgotCi0KLSMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgotYXNfZm5fc2V0X3N0YXR1cyAoKQotewotICByZXR1cm4gJDEKLX0gIyBhc19mbl9zZXRfc3RhdHVzCi0KLSMgYXNfZm5fZXhpdCBTVEFUVVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgotYXNfZm5fZXhpdCAoKQotewotICBzZXQgK2UKLSAgYXNfZm5fc2V0X3N0YXR1cyAkMQotICBleGl0ICQxCi19ICMgYXNfZm5fZXhpdAotCi0jIGFzX2ZuX3Vuc2V0IFZBUgotIyAtLS0tLS0tLS0tLS0tLS0KLSMgUG9ydGFibHkgdW5zZXQgVkFSLgotYXNfZm5fdW5zZXQgKCkKLXsKLSAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQotfQotYXNfdW5zZXQ9YXNfZm5fdW5zZXQKLSMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKLSMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgotIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQotIyBpbXBsZW1lbnRhdGlvbnMuCi1pZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMSs9XCQyCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMT1cJCQxXCQyCi0gIH0KLWZpICMgYXNfZm5fYXBwZW5kCi0KLSMgYXNfZm5fYXJpdGggQVJHLi4uCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCi0jIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKLSMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCi1pZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD0kKCggJCogKSkKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCi0gIH0KLWZpICMgYXNfZm5fYXJpdGgKLQotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KLSAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKLWVsc2UKLSAgYXNfYmFzZW5hbWU9ZmFsc2UKLWZpCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi1hc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLWFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwotYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCi1hc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi1hc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgeHkpICBFQ0hPX0M9J1xjJzs7Ci0gICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKLSAgICAgICBFQ0hPX1Q9JwknOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLWZpCi1pZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9J2xuIC1zJwotICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KLSAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgICBhc19sbl9zPSdjcCAtcFInCi0gIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYXNfbG5fcz1sbgotICBlbHNlCi0gICAgYXNfbG5fcz0nY3AgLXBSJwotICBmaQotZWxzZQotICBhc19sbl9zPSdjcCAtcFInCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi0KLSMgYXNfZm5fbWtkaXJfcAotIyAtLS0tLS0tLS0tLS0tCi0jIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KLWFzX2ZuX21rZGlyX3AgKCkKLXsKLQotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKLQotCi19ICMgYXNfZm5fbWtkaXJfcAotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCi1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLQotIyBhc19mbl9leGVjdXRhYmxlX3AgRklMRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0IGlmIEZJTEUgaXMgYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuCi1hc19mbl9leGVjdXRhYmxlX3AgKCkKLXsKLSAgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXggIiQxIgotfSAjIGFzX2ZuX2V4ZWN1dGFibGVfcAotYXNfdGVzdF94PSd0ZXN0IC14JwotYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotZXhlYyA2PiYxCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mICRDT05GSUdfU1RBVFVTIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNFT0YKLXRlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICQwIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KLWFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IExpYlZOQ1NlcnZlciAkYXNfbWUgMC45LjksIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwotICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKLSAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUwotICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCi0gICQgJDAgJEAKLQotb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0iCi0KLV9BQ0VPRgotCi1jYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKLSIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKLWVzYWMKLQotY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKLSIqKSBzZXQgeCAkYWNfY29uZmlnX2hlYWRlcnM7IHNoaWZ0OyBhY19jb25maWdfaGVhZGVycz0kKjs7Ci1lc2FjCi0KLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfdXNhZ2U9IlwKLVxgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucwotZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCi1hbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgotCi0gIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0Ci0gICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudAotICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcwotICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKLSAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucwotICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQotICAgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0gICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKLQotQ29uZmlndXJhdGlvbiBmaWxlczoKLSRjb25maWdfZmlsZXMKLQotQ29uZmlndXJhdGlvbiBoZWFkZXJzOgotJGNvbmZpZ19oZWFkZXJzCi0KLUNvbmZpZ3VyYXRpb24gY29tbWFuZHM6Ci0kY29uZmlnX2NvbW1hbmRzCi0KLVJlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1MaWJWTkNTZXJ2ZXIgY29uZmlnLnN0YXR1cyAwLjkuOQotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAotICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKLQotQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLU1LRElSX1A9JyRNS0RJUl9QJwotQVdLPSckQVdLJwotdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCi1hY19uZWVkX2RlZmF1bHRzPToKLXdoaWxlIHRlc3QgJCMgIT0gMAotZG8KLSAgY2FzZSAkMSBpbgotICAtLSo9PyopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gIC0tKj0pCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9Ci0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQotICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgY2FzZSAkYWNfb3B0YXJnIGluCi0gICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwotCi0gICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICRTSEVMTCAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi0gIHNoaWZ0Ci0gIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Ci0gIENPTkZJR19TSEVMTD0nJFNIRUxMJwotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gIGV4ZWMgIlwkQCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSMjIFJ1bm5pbmcgJGFzX21lLiAjIwotX0FTQk9YCi0gICRhc19lY2hvICIkYWNfbG9nIgotfSA+JjUKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotUEFDS0FHRT0iJFBBQ0tBR0UiCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgInJmYmNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyByZmJjb25maWcuaCIgOzsKLSAgICAicmZiL3JmYmNvbmZpZy5oIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIHJmYi9yZmJjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyLnBjIiA7OwotICAgICJsaWJ2bmNjbGllbnQucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jY2xpZW50LnBjIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGlidm5jc2VydmVyL01ha2VmaWxlIiA7OwotICAgICJleGFtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAiZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlIiA7OwotICAgICJ2bmN0ZXJtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3Rlcm0vTWFrZWZpbGUiIDs7Ci0gICAgIndlYmNsaWVudHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgd2ViY2xpZW50cy9NYWtlZmlsZSIgOzsKLSAgICAid2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlIiA7OwotICAgICJ3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSIgOzsKLSAgICAibGlidm5jY2xpZW50L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY2NsaWVudC9NYWtlZmlsZSIgOzsKLSAgICAiY2xpZW50X2V4YW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNsaWVudF9leGFtcGxlcy9NYWtlZmlsZSIgOzsKLSAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OwotICAgICJsaWJ2bmNzZXJ2ZXItY29uZmlnIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnZuY3NlcnZlci1jb25maWciIDs7Ci0gICAgIkxpYlZOQ1NlcnZlci5zcGVjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIExpYlZOQ1NlcnZlci5zcGVjIiA7OwotICAgICJ4MTF2bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL01ha2VmaWxlIiA7OwotICAgICJ4MTF2bmMvbWlzYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB4MTF2bmMvbWlzYy9NYWtlZmlsZSIgOzsKLSAgICAieDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUiIDs7Ci0gICAgImNobW9kLWxpYnZuY3NlcnZlci1jb25maWciKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgY2htb2QtbGlidm5jc2VydmVyLWNvbmZpZyIgOzsKLQotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0gYWNfdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICA6ICIke2FjX3RtcDo9JHRtcH0iCi0gIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQotYWNfdG1wPSR0bXAKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xccicKLWVsc2UKLSAgYWNfY3NfYXdrX2NyPSRhY19jcgotZmkKLQotZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKLV9BQ0VPRgotCi0KLXsKLSAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKLSAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgotICBlY2hvICJfQUNFT0YiCi19ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0gIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCi0gIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotcm0gLWYgY29uZiQkc3Vicy5zaAotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKLV9BQ0VPRgotc2VkIC1uICcKLWgKLXMvXi9TWyIvOyBzLyEuKi8iXT0vCi1wCi1nCi1zL15bXiFdKiEvLwotOnJlcGwKLXQgcmVwbAotcy8nIiRhY19kZWxpbSInJC8vCi10IGRlbGltCi06bmwKLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwotcAotbgotYiByZXBsCi06bW9yZTEKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBubAotOmRlbGltCi1oCi1zL1woLlx7MTQ4XH1cKS4uKi9cMS8KLXQgbW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCi1wCi1iCi06bW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBkZWxpbQotJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJwotL15bXiIiXS97Ci0gIE4KLSAgcy9cbi8vCi19Ci0nID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi1ybSAtZiBjb25mJCRzdWJzLmF3awotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNBV0sKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCi0gIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi0KLX0KLXsKLSAgbGluZSA9ICQgMAotICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKLSAgc3Vic3RlZCA9IDAKLSAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQotICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7Ci0gICAga2V5ID0gZmllbGRbaV0KLSAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQotICAgIGlmIChTX2lzX3NldFtrZXldKSB7Ci0gICAgICB2YWx1ZSA9IFNba2V5XQotICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQotICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKLSAgICAgIHN1YnN0ZWQgPSAxCi0gICAgfSBlbHNlCi0gICAgICBsZW4gKz0gMSArIGtleWxlbgotICB9Ci0KLSAgcHJpbnQgbGluZQotfQotCi1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotX0FDRU9GCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKLWgKLXMvLy8KLXMvXi86Lwotcy9bCSBdKiQvOi8KLXMvOlwkKHNyY2Rpcik6LzovZwotcy86XCR7c3JjZGlyfTovOi9nCi1zLzpAc3JjZGlyQDovOi9nCi1zL146Ki8vCi1zLzoqJC8vCi14Ci1zL1woPVsJIF0qXCkuKi9cMS8KLUcKLXMvXG4vLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKLSAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLSMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAotIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCi0jIG5ld2xpbmUgc2VxdWVuY2VzLgotCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotc2VkIC1uICcKLXMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwotdCByc2V0Ci06cnNldAotcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KLXQgZGVmCi1kCi06ZGVmCi1zL1xcJC8vCi10IGJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzIi9wCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAotZAotOmJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCi10IGNvbnQKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCi10IGNvbnQKLWQKLTpjb250Ci1uCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgY2xlYXIKLTpjbGVhcgotcy9cXCQvLwotdCBic25sYwotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCi1kCi06YnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAotYiBjb250Ci0nIDxjb25mZGVmcy5oIHwgc2VkICcKLXMvJyIkYWNfZGVsaW0iJy8iXFxcCi0iL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQotICBGUyA9ICIHIgotfQotL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7Ci0gIGxpbmUgPSBcJCAwCi0gIHNwbGl0KGxpbmUsIGFyZywgIiAiKQotICBpZiAoYXJnWzFdID09ICIjIikgewotICAgIGRlZnVuZGVmID0gYXJnWzJdCi0gICAgbWFjMSA9IGFyZ1szXQotICB9IGVsc2UgewotICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKLSAgICBtYWMxID0gYXJnWzJdCi0gIH0KLSAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQotICBtYWNybyA9IG1hYzJbMV0KLSAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCi0gIGlmIChEX2lzX3NldFttYWNyb10pIHsKLSAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgotICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KLSAgICBuZXh0Ci0gIH0gZWxzZSB7Ci0gICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAotICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgewotICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgotICAgICAgbmV4dAotICAgIH0KLSAgfQotfQoteyBwcmludCB9Ci1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCi1zaGlmdAotZm9yIGFjX3RhZwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwotICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKLQkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJwotCWAnIGJ5IGNvbmZpZ3VyZS4nCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0gICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KLSAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKLSAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQotICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAotICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAotICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0jIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KLWFjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQotYWNfc2VkX2RhdGFyb290PScKLS9kYXRhcm9vdGRpci8gewotICBwCi0gIHEKLX0KLS9AZGF0YWRpckAvcAotL0Bkb2NkaXJAL3AKLS9AaW5mb2RpckAvcAotL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wJwotY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0gIGFjX2RhdGFyb290ZGlyX2hhY2s9JwotICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0gIHMmQGRvY2RpckAmJGRvY2RpciZnCi0gIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKLSAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKLSRleHRyYXN1YgotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAotcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0Ci1zJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0Ci1zJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAotcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAotcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci1zJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKLXMmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0Ci1zJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci1zJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0Ci1zJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0Ci0kYWNfZGF0YXJvb3RkaXJfaGFjawotIgotZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAotICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0KLXRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKLSAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQotCi0gIHJtIC1mICIkYWNfdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7Ci0gIGVzYWMgXAotICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgewotICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKLSAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAiJGFjX2ZpbGUiCi0gICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCi0JfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgZWxzZQotICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAotICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1Ci0gIGZpCi0jIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9hcmc9IiRhY19maWxlIgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gJGFzX2Rpcm5hbWUgLS0gIiRfYW1fYXJnIiB8fAotJGFzX2V4cHIgWCIkX2FtX2FyZyIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkX2FtX2FyZyIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRfYW1fYXJnIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotCi0gIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQotIDs7Ci0gIGVzYWMKLQotCi0gIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgotICAgICJyZmIvcmZiY29uZmlnLmgiOkMpIGFjX3ByZWZpeF9jb25mX09VVD1gZWNobyByZmIvcmZiY29uZmlnLmhgCi1hY19wcmVmaXhfY29uZl9ERUY9YGVjaG8gXyRhY19wcmVmaXhfY29uZl9PVVQgfCBzZWQgLWUgInk6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo6IiAtZSAicy9bXmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpdL18vZyJgCi1hY19wcmVmaXhfY29uZl9QS0c9YGVjaG8gJFBBQ0tBR0VgCi1hY19wcmVmaXhfY29uZl9MT1c9YGVjaG8gXyRhY19wcmVmaXhfY29uZl9QS0cgfCBzZWQgLWUgInk6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotOmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XzoiYAotYWNfcHJlZml4X2NvbmZfVVBQPWBlY2hvICRhY19wcmVmaXhfY29uZl9QS0cgfCBzZWQgLWUgInk6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotOkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzoiICAtZSAiL15bMDEyMzQ1Njc4OV0vcy9eL18vImAKLWFjX3ByZWZpeF9jb25mX0lOUD1gZWNobyBfYAotaWYgdGVzdCAiJGFjX3ByZWZpeF9jb25mX0lOUCIgPSAiXyI7IHRoZW4KLSAgIGZvciBhY19maWxlIGluIDogJENPTkZJR19IRUFERVJTOyBkbyB0ZXN0ICJfJGFjX2ZpbGUiID0gXzogJiYgY29udGludWUKLSAgICAgdGVzdCAtZiAiJGFjX3ByZWZpeF9jb25mX0lOUCIgJiYgY29udGludWUKLSAgICAgY2FzZSAkYWNfZmlsZSBpbgotICAgICAgICAqLmgpIHRlc3QgLWYgJGFjX2ZpbGUgJiYgYWNfcHJlZml4X2NvbmZfSU5QPSRhY19maWxlIDs7Ci0gICAgICAgICopCi0gICAgIGVzYWMKLSAgIGRvbmUKLWZpCi1pZiB0ZXN0ICIkYWNfcHJlZml4X2NvbmZfSU5QIiA9ICJfIjsgdGhlbgotICAgY2FzZSAiJGFjX3ByZWZpeF9jb25mX09VVCIgaW4KLSAgICAgICovKikgYWNfcHJlZml4X2NvbmZfSU5QPWBiYXNlbmFtZSAiJGFjX3ByZWZpeF9jb25mX09VVCJgCi0gICAgICA7OwotICAgICAgKi0qKSBhY19wcmVmaXhfY29uZl9JTlA9YGVjaG8gIiRhY19wcmVmaXhfY29uZl9PVVQiIHwgc2VkIC1lICJzL1thYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV9dKi0vLyJgCi0gICAgICA7OwotICAgICAgKikgYWNfcHJlZml4X2NvbmZfSU5QPWNvbmZpZy5oCi0gICAgICA7OwotICAgZXNhYwotZmkKLWlmIHRlc3QgLXogIiRhY19wcmVmaXhfY29uZl9QS0ciIDsgdGhlbgotICAgYXNfZm5fZXJyb3IgJD8gIm5vIHByZWZpeCBmb3IgX1BSRUZJWF9QS0dfQ09ORklHX0giICIkTElORU5PIiA1Ci1lbHNlCi0gIGlmIHRlc3QgISAtZiAiJGFjX3ByZWZpeF9jb25mX0lOUCIgOyB0aGVuIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGFjX3ByZWZpeF9jb25mX0lOUCIgOyB0aGVuCi0gICAgIGFjX3ByZWZpeF9jb25mX0lOUD0iJHNyY2Rpci8kYWNfcHJlZml4X2NvbmZfSU5QIgotICBmaSBmaQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19wcmVmaXhfY29uZl9PVVQgLSBwcmVmaXggJGFjX3ByZWZpeF9jb25mX1VQUCBmb3IgJGFjX3ByZWZpeF9jb25mX0lOUCBkZWZpbmVzIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19wcmVmaXhfY29uZl9PVVQgLSBwcmVmaXggJGFjX3ByZWZpeF9jb25mX1VQUCBmb3IgJGFjX3ByZWZpeF9jb25mX0lOUCBkZWZpbmVzIiA+JjY7fQotICBpZiB0ZXN0IC1mICRhY19wcmVmaXhfY29uZl9JTlAgOyB0aGVuCi0gICAgZWNobyAicy8jdW5kZWYgICpcXChbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfXVxcKS8jdW5kZWYgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMS8iID4gY29uZnRlc3QucHJlZml4Ci0gICAgIyBubyEgdGhlc2UgYXJlIHRoaW5ncyBsaWtlIHNvY2tsZW5fdCwgY29uc3QsIHZmb3JrCi0gICAgIyBlY2hvICJzLyN1bmRlZiAgKlxcKFttNF9jcl9sZXR0ZXJzXVxcKS8jdW5kZWYgJF9MT1ciIl9cXDEvIiA+PiBfc2NyaXB0Ci0gICAgZWNobyAicy8jZGVmaW5lICAqXFwoW0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX11bYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlfXSpcXClcXCguKlxcKS8jaWZuZGVmICRhY19wcmVmaXhfY29uZl9VUFAiIl9cXDEgXFwiID4+IGNvbmZ0ZXN0LnByZWZpeAotICAgIGVjaG8gIiNkZWZpbmUgJGFjX3ByZWZpeF9jb25mX1VQUCIiX1xcMSBcXDIgXFwiID4+IGNvbmZ0ZXN0LnByZWZpeAotICAgIGVjaG8gIiNlbmRpZi8iID4+Y29uZnRlc3QucHJlZml4Ci0gICAgIyBubyEgdGhlc2UgYXJlIHRoaW5ncyBsaWtlIHNvY2tsZW5fdCwgY29uc3QsIHZmb3JrCi0gICAgIyBlY2hvICJzLyNkZWZbXWluZSAgKlxcKFttNF9jcl9sZXR0ZXJzXVtfc3ltYm9sXSpcXClcXCguKlxcKS8jaWZuZGVmICRfTE9XIiJfXFwxIFxcIiA+PiBfc2NyaXB0Ci0gICAgIyBlY2hvICIjZGVmaW5lICRfTE9XIiJfXFwxIFxcMiBcXCIgPj4gX3NjcmlwdAotICAgICMgZWNobyAiI2VuZGlmLyIgPj4gX3NjcmlwdAotICAgICMgbm93IGV4ZWN1dGluZyBfc2NyaXB0IG9uIF9ERUYgaW5wdXQgdG8gY3JlYXRlIF9PVVQgb3V0cHV0IGZpbGUKLSAgICBlY2hvICIjaWZuZGVmICRhY19wcmVmaXhfY29uZl9ERUYiICAgICAgPiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAiI2RlZmluZSAkYWNfcHJlZml4X2NvbmZfREVGIDEiID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAvJyonICRhY19wcmVmaXhfY29uZl9PVVQuIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGVuZCBvZiBjb25maWd1cmUuICcqJy8gPj4kdG1wL3Bjb25maWcuaAotCi0gICAgc2VkIC1mIGNvbmZ0ZXN0LnByZWZpeCAkYWNfcHJlZml4X2NvbmZfSU5QID4+JHRtcC9wY29uZmlnLmgKLSAgICBlY2hvICcgJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAnLyogb25jZTonICRhY19wcmVmaXhfY29uZl9ERUYgJyovJyA+PiR0bXAvcGNvbmZpZy5oCi0gICAgZWNobyAiI2VuZGlmIiA+PiR0bXAvcGNvbmZpZy5oCi0gICAgaWYgY21wIC1zICRhY19wcmVmaXhfY29uZl9PVVQgJHRtcC9wY29uZmlnLmggMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3ByZWZpeF9jb25mX09VVCBpcyB1bmNoYW5nZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogJGFjX3ByZWZpeF9jb25mX09VVCBpcyB1bmNoYW5nZWQiID4mNjt9Ci0gICAgZWxzZQotICAgICAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX3ByZWZpeF9jb25mX09VVCIgfHwKLSRhc19leHByIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfcHJlZml4X2NvbmZfT1VUIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19wcmVmaXhfY29uZl9PVVQiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFjX3ByZWZpeF9jb25mX09VVCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRhY19wcmVmaXhfY29uZl9PVVQiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAotICAgICAgcm0gLWYgIiRhY19wcmVmaXhfY29uZl9PVVQiCi0gICAgICBtdiAkdG1wL3Bjb25maWcuaCAiJGFjX3ByZWZpeF9jb25mX09VVCIKLSAgICBmaQotICAgIGNwIGNvbmZ0ZXN0LnByZWZpeCBfY29uZmlncy5zZWQKLSAgZWxzZQotICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnB1dCBmaWxlICRhY19wcmVmaXhfY29uZl9JTlAgZG9lcyBub3QgZXhpc3QgLSBza2lwIGdlbmVyYXRpbmcgJGFjX3ByZWZpeF9jb25mX09VVCIgIiRMSU5FTk8iIDUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuKgotZmkKLSA7OwotICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgewotICAjIEF1dG9jb25mIDIuNjIgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcwotICAjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCi0gICMgaWYgd2UgZGV0ZWN0IHRoZSBxdW90aW5nLgotICBjYXNlICRDT05GSUdfRklMRVMgaW4KLSAgKlwnKikgZXZhbCBzZXQgeCAiJENPTkZJR19GSUxFUyIgOzsKLSAgKikgICBzZXQgeCAkQ09ORklHX0ZJTEVTIDs7Ci0gIGVzYWMKLSAgc2hpZnQKLSAgZm9yIG1mCi0gIGRvCi0gICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAotICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAotICAgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgotICAgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KLSAgICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQotICAgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICAgIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8Ci0kYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYIiRtZiIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgZWxzZQotICAgICAgY29udGludWUKLSAgICBmaQotICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAgICMgZXhwYW5zaW9uLgotICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0JIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICAgIGZkaXI9YCRhc19kaXJuYW1lIC0tICIkZmlsZSIgfHwKLSRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICBhc19kaXI9JGRpcnBhcnQvJGZkaXI7IGFzX2ZuX21rZGlyX3AKLSAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgICBkb25lCi0gIGRvbmUKLX0KLSA7OwotICAgICJjaG1vZC1saWJ2bmNzZXJ2ZXItY29uZmlnIjpDKSBjaG1vZCBhK3ggbGlidm5jc2VydmVyLWNvbmZpZyA7OwotCi0gIGVzYWMKLWRvbmUgIyBmb3IgYWNfdGFnCi0KLQotYXNfZm5fZXhpdCAwCi1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0KLXRlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0KLSMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KLSMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgotIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KLSMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwotIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKLSMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKLSMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQotIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KLWlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgotICBhY19jc19zdWNjZXNzPToKLSAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQotICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgotICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgotICBleGVjIDU+L2Rldi9udWxsCi0gICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKLSAgZXhlYyA1Pj5jb25maWcubG9nCi0gICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCi0gICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKLWZpCi1pZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KLWZpCi0KLWNobW9kIGEreCAuL2xpYnZuY3NlcnZlci1jb25maWcKLQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDJlYWE0NmEuLmNhOWYzYjMgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTEsOSArMSwxNiBAQAogIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfSU5JVChMaWJWTkNTZXJ2ZXIsIDAuOS45LCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcikKLUFNX0lOSVRfQVVUT01BS0UoTGliVk5DU2VydmVyLCAwLjkuOSkKK0FDX0lOSVQoTGliVk5DU2VydmVyLCAwLjkuMTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9MaWJWTkMvbGlidm5jc2VydmVyKQorQU1fSU5JVF9BVVRPTUFLRShbc3ViZGlyLW9iamVjdHNdKQogbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sIFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSkKIEFNX0NPTkZJR19IRUFERVIocmZiY29uZmlnLmgpCiBBWF9QUkVGSVhfQ09ORklHX0goW3JmYi9yZmJjb25maWcuaF0pCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCisKKworIyBzZXQgZGV0YWlsZWQgdmVyc2lvbiBpbmZvCitBQ19ERUZJTkUoVkVSU0lPTl9NQUpPUiwgMCwgTGliVk5DU2VydmVyIG1ham9yIHZlcnNpb24pCitBQ19ERUZJTkUoVkVSU0lPTl9NSU5PUiwgOSwgTGliVk5DU2VydmVyIG1pbm9yIHZlcnNpb24pCitBQ19ERUZJTkUoVkVSU0lPTl9QQVRDSExFVkVMLCAxMCwgTGliVk5DU2VydmVyIHBhdGNobGV2ZWwpCiAKICMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KIEFDX1BST0dfQ0MKQEAgLTI4LDcgKzM1LDE2IEBACiAjIEFDX0RFRklORSBtb3ZlZCB0byBhZnRlciBsaWJwdGhyZWFkIGNoZWNrLgogCiAjIFdlYlNvY2tldHMgc3VwcG9ydAotQUNfQ0hFQ0tfTElCKHJlc29sdiwgX19iNjRfbnRvcCwgSEFWRV9CNjQ9InRydWUiLCBIQVZFX0I2ND0iZmFsc2UiKQorQUNfQ0hFQ0tfRlVOQyhfX2I2NF9udG9wLCBIQVZFX0I2NF9JTl9MSUJDPSJ0cnVlIiwgSEFWRV9CNjRfSU5fTElCQz0iZmFsc2UiKQoraWYgdGVzdCAieCRIQVZFX0I2NF9JTl9MSUJDIiAhPSAieHRydWUiOyB0aGVuCisJQUNfQ0hFQ0tfTElCKHJlc29sdiwgX19iNjRfbnRvcCwgSEFWRV9CNjRfSU5fTElCUkVTT0xWPSJ0cnVlIiwgSEFWRV9CNjRfSU5fTElCUkVTT0xWPSJmYWxzZSIpCisJaWYgdGVzdCAieCRIQVZFX0I2NF9JTl9MSUJSRVNPTFYiID0gInh0cnVlIjsgdGhlbgorCQlSRVNPTFZfTElCPSItbHJlc29sdiIKKwkJSEFWRV9CNjQ9InRydWUiCisJZmkKK2Vsc2UKKwlIQVZFX0I2ND0idHJ1ZSIKK2ZpCiBBSF9URU1QTEFURShXSVRIX1dFQlNPQ0tFVFMsIFtEaXNhYmxlIFdlYlNvY2tldHMgc3VwcG9ydF0pCiBBQ19BUkdfV0lUSCh3ZWJzb2NrZXRzLAogCVsgIC0td2l0aG91dC13ZWJzb2NrZXRzICAgIGRpc2FibGUgV2ViU29ja2V0cyBzdXBwb3J0XSwKQEAgLTEzMiwzOTEgKzE0OCwyMCBAQAogQUNfU1VCU1QoU1NMX0xJQlMpCiBBTV9DT05ESVRJT05BTChIQVZFX0xJQlNTTCwgdGVzdCAhIC16ICIkU1NMX0xJQlMiKQogCi0jIENoZWNrcyBmb3IgWCBsaWJyYXJpZXMKLUhBVkVfWDExPSJmYWxzZSIKLUFDX1BBVEhfWFRSQQotQUhfVEVNUExBVEUoSEFWRV9YMTEsIFtYMTEgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCiAKLSMgU2VlIGlmIHdlIGFyZSB0byBidWlsZCB4MTF2bmM6Ci1BSF9URU1QTEFURShIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVIsIFtVc2UgdGhlIHN5c3RlbSBsaWJ2bmNzZXJ2ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHgxMXZuYy5dKQotQUNfQVJHX1dJVEgoc3lzdGVtLWxpYnZuY3NlcnZlciwKLVsgIC0td2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyICAgICB1c2UgaW5zdGFsbGVkIGxpYnZuY3NlcnZlciBmb3IgeDExdm5jXQotWyAgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXI9RElSIHVzZSBsaWJ2bmNzZXJ2ZXIgaW5zdGFsbGVkIGluIERJUiBmb3IgeDExdm5jXSwsKQotQUNfQVJHX1dJVEgoeDExdm5jLAotWyAgLS13aXRoLXgxMXZuYyAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyB0aGUgeDExdm5jIHN1YmRpciAoaWYgcHJlc2VudCldCi1bICAgICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2lsbCBuZWVkIHRvIGNkIHRvIHgxMXZuYyBhbmQgcnVuICdtYWtlJyBldGMuXSwsKQotCi1pZiB0ZXN0ICEgLXogIiR3aXRoX3gxMXZuYyIgLWEgIiR3aXRoX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCWJ1aWxkX3gxMXZuYz0ieWVzIgotZWxpZiB0ZXN0ICIkUEFDS0FHRV9OQU1FIiA9ICJ4MTF2bmMiOyB0aGVuCi0JYnVpbGRfeDExdm5jPSJ5ZXMiCi1lbHNlCi0JYnVpbGRfeDExdm5jPSJubyIKKyMgU2VlIGlmIHdlIHdhbnQgbGlidmEgc3VwcG9ydAorIyBUT0RPOiBjaGVjayBpZiBsaWJyYXJ5IGFjdHVhbGx5IGV4aXN0cworQUhfVEVNUExBVEUoQ09ORklHX0xJQlZBLCBbQnVpbGQgbGlidmEgc3VwcG9ydF0pCitBQ19BUkdfV0lUSChsaWJ2YSwKK1sgIC0td2l0aC1saWJ2YSAgICAgICAgICAgICAgICAgICBidWlsZCBsaWJ2YSBzdXBwb3J0XSwsKQoraWYgdGVzdCAieCR3aXRoX2xpYnZhIiAhPSAieG5vIjsgdGhlbgorICAgIEFDX0NIRUNLX0xJQih2YSwgdmFJbml0aWFsaXplLAorICAgICAgICBWQV9MSUJTPSItbHZhIC1sdmEteDExIgorICAgICAgICBbQUNfREVGSU5FKENPTkZJR19MSUJWQSkgQ09ORklHX0xJQlZBPSJ0cnVlIl0sICwpCiBmaQotCQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KK0FDX1NVQlNUKFZBX0xJQlMpCitBTV9DT05ESVRJT05BTChDT05GSUdfTElCVkEsIHRlc3QgISAteiAiJFZBX0xJQlMiKQogCi1BSF9URU1QTEFURShIQVZFX1hTSE0sIFtNSVQtU0hNIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfWFRFU1QsIFtYVEVTVCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCi1BSF9URU1QTEFURShIQVZFX1hURVNUR1JBQkNPTlRST0wsIFtYVEVTVCBleHRlbnNpb24gaGFzIFhUZXN0R3JhYkNvbnRyb2xdKQotQUhfVEVNUExBVEUoSEFWRV9YS0VZQk9BUkQsIFtYS0VZQk9BUkQgZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnRdKQotQUhfVEVNUExBVEUoSEFWRV9MSUJYSU5FUkFNQSwgW1hJTkVSQU1BIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTElCWFJBTkRSLCBbWFJBTkRSIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTElCWEZJWEVTLCBbWEZJWEVTIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTElCWERBTUFHRSwgW1hEQU1BR0UgZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnRdKQotQUhfVEVNUExBVEUoSEFWRV9MSUJYVFJBUCwgW0RFQy1YVFJBUCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCi1BSF9URU1QTEFURShIQVZFX1JFQ09SRCwgW1JFQ09SRCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCi1BSF9URU1QTEFURShIQVZFX1NPTEFSSVNfWFJFQURTQ1JFRU4sIFtTb2xhcmlzIFhSZWFkU2NyZWVuIGF2YWlsYWJsZV0pCi1BSF9URU1QTEFURShIQVZFX0lSSVhfWFJFQURESVNQTEFZLCBbSVJJWCBYUmVhZERpc3BsYXkgYXZhaWxhYmxlXSkKLUFIX1RFTVBMQVRFKEhBVkVfRkJQTSwgW0ZCUE0gZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnRdKQotQUhfVEVNUExBVEUoSEFWRV9EUE1TLCBbRFBNUyBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCi1BSF9URU1QTEFURShIQVZFX0xJTlVYX1ZJREVPREVWX0gsIFt2aWRlbzRsaW51eCBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTElOVVhfRkJfSCwgW2xpbnV4IGZiIGRldmljZSBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTElOVVhfSU5QVVRfSCwgW2xpbnV4L2lucHV0LmggcHJlc2VudF0pCi1BSF9URU1QTEFURShIQVZFX0xJTlVYX1VJTlBVVF9ILCBbbGludXggdWlucHV0IGRldmljZSBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50XSkKLUFIX1RFTVBMQVRFKEhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZLCBbYnVpbGQgTWFjT1MgWCBuYXRpdmUgZGlzcGxheSBzdXBwb3J0XSkKLUFIX1RFTVBMQVRFKEhBVkVfTUFDT1NYX09QRU5HTF9ILCBbTWFjT1MgWCBPcGVuR0wgcHJlc2VudF0pCi0KLUFDX0FSR19XSVRIKHhrZXlib2FyZCwKLVsgIC0td2l0aG91dC14a2V5Ym9hcmQgICAgIGRpc2FibGUgeGtleWJvYXJkIGV4dGVuc2lvbiBzdXBwb3J0XSwsKQotQUNfQVJHX1dJVEgoeGluZXJhbWEsCi1bICAtLXdpdGhvdXQteGluZXJhbWEgICAgICBkaXNhYmxlIHhpbmVyYW1hIGV4dGVuc2lvbiBzdXBwb3J0XSwsKQotQUNfQVJHX1dJVEgoeHJhbmRyLAotWyAgLS13aXRob3V0LXhyYW5kciAgICAgICAgZGlzYWJsZSB4cmFuZHIgZXh0ZW5zaW9uIHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSCh4Zml4ZXMsCi1bICAtLXdpdGhvdXQteGZpeGVzICAgICAgICBkaXNhYmxlIHhmaXhlcyBleHRlbnNpb24gc3VwcG9ydF0sLCkKLUFDX0FSR19XSVRIKHhkYW1hZ2UsCi1bICAtLXdpdGhvdXQteGRhbWFnZSAgICAgICBkaXNhYmxlIHhkYW1hZ2UgZXh0ZW5zaW9uIHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSCh4dHJhcCwKLVsgIC0td2l0aG91dC14dHJhcCAgICAgICAgIGRpc2FibGUgeHRyYXAgZXh0ZW5zaW9uIHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSCh4cmVjb3JkLAotWyAgLS13aXRob3V0LXhyZWNvcmQgICAgICAgZGlzYWJsZSB4cmVjb3JkIGV4dGVuc2lvbiBzdXBwb3J0XSwsKQotQUNfQVJHX1dJVEgoZmJwbSwKLVsgIC0td2l0aG91dC1mYnBtICAgICAgICAgIGRpc2FibGUgZmJwbSBleHRlbnNpb24gc3VwcG9ydF0sLCkKLUFDX0FSR19XSVRIKGRwbXMsCi1bICAtLXdpdGhvdXQtZHBtcyAgICAgICAgICBkaXNhYmxlIGRwbXMgZXh0ZW5zaW9uIHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSCh2NGwsCi1bICAtLXdpdGhvdXQtdjRsICAgICAgICAgICBkaXNhYmxlIHZpZGVvNGxpbnV4IHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSChmYmRldiwKLVsgIC0td2l0aG91dC1mYmRldiAgICAgICAgIGRpc2FibGUgbGludXggZmIgZGV2aWNlIHN1cHBvcnRdLCwpCi1BQ19BUkdfV0lUSCh1aW5wdXQsCi1bICAtLXdpdGhvdXQtdWlucHV0ICAgICAgICBkaXNhYmxlIGxpbnV4IHVpbnB1dCBkZXZpY2Ugc3VwcG9ydF0sLCkKLUFDX0FSR19XSVRIKG1hY29zeC1uYXRpdmUsCi1bICAtLXdpdGhvdXQtbWFjb3N4LW5hdGl2ZSBkaXNhYmxlIE1hY09TIFggbmF0aXZlIGRpc3BsYXkgc3VwcG9ydF0sLCkKLQotZmkKLSMgZW5kIHgxMXZuYyBvbmx5LgotCi1pZiB0ZXN0ICJ4JHdpdGhfeCIgPSAieG5vIjsgdGhlbgotCUhBVkVfWDExPSJmYWxzZSIKLWVsaWYgdGVzdCAiJFhfQ0ZMQUdTIiAhPSAiLURYX0RJU1BMQVlfTUlTU0lORyI7IHRoZW4KLQlBQ19DSEVDS19MSUIoWDExLCBYR2V0SW1hZ2UsIFtBQ19ERUZJTkUoSEFWRV9YMTEpIEhBVkVfWDExPSJ0cnVlIl0sCi0JCUhBVkVfWDExPSJmYWxzZSIsCi0JCSRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTKQotCi0JIyB4MTF2bmMgb25seToKLQlpZiB0ZXN0ICRIQVZFX1gxMSA9ICJ0cnVlIiAtYSAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCQlYX1BSRUxJQlM9IiRYX1BSRUxJQlMgLWxYZXh0IgotCi0JCUFDX0NIRUNLX0xJQihYZXh0LCBYU2htR2V0SW1hZ2UsIAotCQkJW0FDX0RFRklORShIQVZFX1hTSE0pXSwgLAotCQkJJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMpCi0KLQkJQUNfQ0hFQ0tfTElCKFhleHQsIFhSZWFkU2NyZWVuLCAKLQkJCVtBQ19ERUZJTkUoSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOKV0sICwKLQkJCSRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTKQotCi0JCUFDX0NIRUNLX0hFQURFUihYMTEvZXh0ZW5zaW9ucy9yZWFkZGlzcGxheS5oLAotCQkJW0FDX0RFRklORShIQVZFX0lSSVhfWFJFQURESVNQTEFZKV0sICwKLQkJCVsjaW5jbHVkZSA8WDExL1hsaWIuaD5dKQotCi0JCWlmIHRlc3QgIngkd2l0aF9mYnBtIiAhPSAieG5vIjsgdGhlbgotCQkJQUNfQ0hFQ0tfTElCKFhleHQsIEZCUE1Gb3JjZUxldmVsLCAKLQkJCQlbQUNfREVGSU5FKEhBVkVfRkJQTSldLCAsCi0JCQkJJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMpCi0JCWZpCi0KLQkJaWYgdGVzdCAieCR3aXRoX2RwbXMiICE9ICJ4bm8iOyB0aGVuCi0JCQlBQ19DSEVDS19MSUIoWGV4dCwgRFBNU0ZvcmNlTGV2ZWwsIAotCQkJCVtBQ19ERUZJTkUoSEFWRV9EUE1TKV0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJZmkKLQotCQlBQ19DSEVDS19MSUIoWHRzdCwgWFRlc3RHcmFiQ29udHJvbCwgCi0JCQlYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJW0FDX0RFRklORShIQVZFX1hURVNUR1JBQkNPTlRST0wpIEhBVkVfWFRFU1RHUkFCQ09OVFJPTD0idHJ1ZSJdLCAsCi0JCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQotCQlBQ19DSEVDS19MSUIoWHRzdCwgWFRlc3RGYWtlS2V5RXZlbnQsIAotCQkJWF9QUkVMSUJTPSItbFh0c3QgJFhfUFJFTElCUyIKLQkJCVtBQ19ERUZJTkUoSEFWRV9YVEVTVCkgSEFWRV9YVEVTVD0idHJ1ZSJdLCAsCi0JCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJlY29yZCIgIT0gInhubyI7IHRoZW4KLQkJCUFDX0NIRUNLX0xJQihYdHN0LCBYUmVjb3JkRW5hYmxlQ29udGV4dEFzeW5jLCAKLQkJCQlYX1BSRUxJQlM9Ii1sWHRzdCAkWF9QUkVMSUJTIgotCQkJCVtBQ19ERUZJTkUoSEFWRV9SRUNPUkQpXSwgLAotCQkJCSRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTKQotCQlmaQotCi0JCSMgd2UgdXNlIFhUUkFQIG9uIFgxMVI1LCBvciB1c2VyIGNhbiBzZXQgWDExVk5DX1VTRV9YVFJBUAotCQlpZiB0ZXN0ICJ4JHdpdGhfeHRyYXAiICE9ICJ4bm8iOyB0aGVuCi0JCSAgICBpZiB0ZXN0ICEgLXogIiRYMTFWTkNfVVNFX1hUUkFQIiAtbyAteiAiJEhBVkVfWFRFU1RHUkFCQ09OVFJPTCI7IHRoZW4KLQkJCUFDX0NIRUNLX0xJQihYVHJhcCwgWEVUcmFwU2V0R3JhYlNlcnZlciwgCi0JCQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWFRyYXAiCi0JCQkJW0FDX0RFRklORShIQVZFX0xJQlhUUkFQKV0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJCSMgdHJ1NjQgdXNlcyBsaWJYRVRyYXAuc28KLQkJCUFDX0NIRUNLX0xJQihYRVRyYXAsIFhFVHJhcFNldEdyYWJTZXJ2ZXIsIAotCQkJCVhfUFJFTElCUz0iJFhfUFJFTElCUyAtbFhFVHJhcCIKLQkJCQlbQUNfREVGSU5FKEhBVkVfTElCWFRSQVApXSwgLAotCQkJCSRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTKQotCQkgICAgZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGtleWJvYXJkIiAhPSAieG5vIjsgdGhlbgotCQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJFhfQ0ZMQUdTIgotCQkJQUNfQ0hFQ0tfSEVBREVSKFgxMS9YS0JsaWIuaCwgSEFWRV9YS0JMSUJfSD0idHJ1ZSIsCi0JCQkJSEFWRV9YS0JMSUJfSD0iZmFsc2UiLCBbI2luY2x1ZGUgPFgxMS9YbGliLmg+XSkKLQkJCUNQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCi0JCQlpZiB0ZXN0ICRIQVZFX1hLQkxJQl9IID0gInRydWUiOyB0aGVuCi0JCQkJQUNfQ0hFQ0tfTElCKFgxMSwgWGtiU2VsZWN0RXZlbnRzLAotCQkJCQlbQUNfREVGSU5FKEhBVkVfWEtFWUJPQVJEKV0sICwKLQkJCQkJJFhfTElCUyAkWF9QUkVMSUJTIC1sWDExICRYX0VYVFJBX0xJQlMpCi0JCQlmaQotCQlmaQotCi0JCWlmIHRlc3QgIngkd2l0aF94aW5lcmFtYSIgIT0gInhubyI7IHRoZW4KLQkJCUFDX0NIRUNLX0xJQihYaW5lcmFtYSwgWGluZXJhbWFRdWVyeVNjcmVlbnMsCi0JCQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGluZXJhbWEiCi0JCQkJW0FDX0RFRklORShIQVZFX0xJQlhJTkVSQU1BKV0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeHJhbmRyIiAhPSAieG5vIjsgdGhlbgotCQkJQUNfQ0hFQ0tfTElCKFhyYW5kciwgWFJSU2VsZWN0SW5wdXQsCi0JCQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWHJhbmRyIgotCQkJCVtBQ19ERUZJTkUoSEFWRV9MSUJYUkFORFIpIEhBVkVfTElCWFJBTkRSPSJ0cnVlIl0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGZpeGVzIiAhPSAieG5vIjsgdGhlbgotCQkJQUNfQ0hFQ0tfTElCKFhmaXhlcywgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UsCi0JCQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGZpeGVzIgotCQkJCVtBQ19ERUZJTkUoSEFWRV9MSUJYRklYRVMpIEhBVkVfTElCWEZJWEVTPSJ0cnVlIl0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJZmkKLQotCQlpZiB0ZXN0ICJ4JHdpdGhfeGRhbWFnZSIgIT0gInhubyI7IHRoZW4KLQkJCUFDX0NIRUNLX0xJQihYZGFtYWdlLCBYRGFtYWdlUXVlcnlFeHRlbnNpb24sCi0JCQkJWF9QUkVMSUJTPSIkWF9QUkVMSUJTIC1sWGRhbWFnZSIKLQkJCQlbQUNfREVGSU5FKEhBVkVfTElCWERBTUFHRSkgSEFWRV9MSUJYREFNQUdFPSJ0cnVlIl0sICwKLQkJCQkkWF9MSUJTICRYX1BSRUxJQlMgLWxYMTEgJFhfRVhUUkFfTElCUykKLQkJZmkKLQotCQlpZiB0ZXN0ICEgLXogIiRIQVZFX0xJQlhGSVhFUyIgLW8gISAteiAiJEhBVkVfTElCWERBTUFHRSI7IHRoZW4KLQkJCSMgbmVlZCAvdXNyL3Nmdy9saWIgaW4gUlBBVEggZm9yIFNvbGFyaXMgMTAgYW5kIGxhdGVyCi0JCQljYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KLQkJCSJTdW5PUyA1IiopIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtUi91c3Ivc2Z3L2xpYiIgOzsKLQkJCWVzYWMKLQkJZmkKLQkJaWYgdGVzdCAhIC16ICIkSEFWRV9MSUJYUkFORFIiOyB0aGVuCi0JCQkjIGFsc28gbmVlZCAvdXNyL1gxMS9pbmNsdWRlIGZvciBTb2xhcmlzIDEwIDEwLzA4IGFuZCBsYXRlcgotCQkJY2FzZSBgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIGluCi0JCQkiU3VuT1MgNSIqKSBDUFBGTEFHUz0iJENQUEZMQUdTIC1JL3Vzci9YMTEvaW5jbHVkZSIgOzsKLQkJCWVzYWMKLQkJZmkKLQotCQlYX0xJQlM9IiRYX0xJQlMgJFhfUFJFTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTIgotCWZpCi0JIyBlbmQgeDExdm5jIG9ubHkuCi1maQotCi1BQ19TVUJTVChYX0xJQlMpCi1BTV9DT05ESVRJT05BTChIQVZFX1gxMSwgdGVzdCAkSEFWRV9YMTEgIT0gImZhbHNlIikKLQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQotaWYgdGVzdCAieCRIQVZFX1gxMSIgPSAieGZhbHNlIiAtYSAieCR3aXRoX3giICE9ICJ4bm8iOyB0aGVuCi0JQUNfTVNHX0VSUk9SKFsKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogQSB3b3JraW5nIFggd2luZG93IHN5c3RlbSBidWlsZCBlbnZpcm9ubWVudCBpcyByZXF1aXJlZCB0byBidWlsZCAqKioKLXgxMXZuYy4gIE1ha2Ugc3VyZSBhbnkgcmVxdWlyZWQgWCBkZXZlbG9wbWVudCBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkLgotSWYgdGhleSBhcmUgaW5zdGFsbGVkIGluIG5vbi1zdGFuZGFyZCBsb2NhdGlvbnMsIG9uZSBjYW4gdXNlIHRoZQotLS14LWluY2x1ZGVzPURJUiBhbmQgLS14LWxpYnJhcmllcz1ESVIgY29uZmlndXJlIG9wdGlvbnMgb3Igc2V0IHRoZQotQ1BQRkxBR1MgYW5kIExERkxBR1MgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGluZGljYXRlIHdoZXJlIHRoZSBYCi13aW5kb3cgc3lzdGVtIGhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzIG1heSBiZSBmb3VuZC4gIE9uIDY0KzMyIGJpdAotbWFjaGluZXMgeW91IG1heSBuZWVkIHRvIHBvaW50IHRvIGxpYjY0IG9yIGxpYjMyIGRpcmVjdG9yaWVzIHRvIHBpY2sgdXAKLXRoZSBjb3JyZWN0IHdvcmQgc2l6ZS4KLQotSWYgeW91IHdhbnQgdG8gYnVpbGQgeDExdm5jIHdpdGhvdXQgWCBzdXBwb3J0IChlLmcuIGZvciAtcmF3ZmIgdXNlIG9ubHkKLW9yIGZvciBuYXRpdmUgTWFjIE9TIFgpLCBzcGVjaWZ5IHRoZSAtLXdpdGhvdXQteCBjb25maWd1cmUgb3B0aW9uLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLV0pCi1maQotCi1pZiB0ZXN0ICJ4JEhBVkVfWDExIiA9ICJ4dHJ1ZSIgLWEgIngkSEFWRV9YVEVTVCIgIT0gInh0cnVlIjsgdGhlbgotCUFDX01TR19XQVJOKFsKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qKiogQSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgWFRFU1QgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQgKioqCi0obGliWHRzdCkuICBBbiB4MTF2bmMgYnVpbHQgdGhpcyB3YXkgd2lsbCBiZSAqT05MWSBCQVJFTFkgVVNBQkxFKi4KLVlvdSB3aWxsIGJlIGFibGUgdG8gbW92ZSB0aGUgbW91c2UgYnV0IG5vdCBjbGljayBvciB0eXBlLiAgVGhlcmUgY2FuCi1hbHNvIGJlIGRlYWRsb2NrcyBpZiBhbiBhcHBsaWNhdGlvbiBncmFicyB0aGUgWCBzZXJ2ZXIuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGluc3RhbGwgdGhlIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCBwYWNrYWdlcwotZm9yIFhURVNUIChwZXJoYXBzIGl0IGlzIG5hbWVkIHNvbWV0aGluZyBsaWtlIGxpYnh0c3QtZGV2KSBhbmQgcnVuCi1jb25maWd1cmUgYWdhaW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXSkKLQlzbGVlcCA1Ci1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfdjRsIiAhPSAieG5vIjsgdGhlbgotCUFDX0NIRUNLX0hFQURFUihsaW51eC92aWRlb2Rldi5oLAotCQlbQUNfREVGSU5FKEhBVkVfTElOVVhfVklERU9ERVZfSCldLCwpCi1maQotaWYgdGVzdCAieCR3aXRoX2ZiZGV2IiAhPSAieG5vIjsgdGhlbgotCUFDX0NIRUNLX0hFQURFUihsaW51eC9mYi5oLAotCQlbQUNfREVGSU5FKEhBVkVfTElOVVhfRkJfSCldLCwpCi1maQotaWYgdGVzdCAieCR3aXRoX3VpbnB1dCIgIT0gInhubyI7IHRoZW4KLQlBQ19DSEVDS19IRUFERVIobGludXgvaW5wdXQuaCwKLQkJW0FDX0RFRklORShIQVZFX0xJTlVYX0lOUFVUX0gpIEhBVkVfTElOVVhfSU5QVVRfSD0idHJ1ZSJdLCwpCi0JaWYgdGVzdCAieCRIQVZFX0xJTlVYX0lOUFVUX0giID0gInh0cnVlIjsgdGhlbgotCQlBQ19DSEVDS19IRUFERVIobGludXgvdWlucHV0LmgsCi0JCQlbQUNfREVGSU5FKEhBVkVfTElOVVhfVUlOUFVUX0gpXSwsIFsjaW5jbHVkZSA8bGludXgvaW5wdXQuaD5dKQotCWZpCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfbWFjb3N4X25hdGl2ZSIgIT0gInhubyI7IHRoZW4KLQlBQ19ERUZJTkUoSEFWRV9NQUNPU1hfTkFUSVZFX0RJU1BMQVkpCi1maQotCi0jIENoZWNrIGZvciBPUyBYIG9wZW5nbCBoZWFkZXIKLUFDX0NIRUNLX0hFQURFUihPcGVuR0wvT3BlbkdMLmgsCi0JW0FDX0RFRklORShIQVZFX01BQ09TWF9PUEVOR0xfSCkgSEFWRV9NQUNPU1hfT1BFTkdMX0g9InRydWUiXSwsKQotCi1BSF9URU1QTEFURShIQVZFX0FWQUhJLCBbQXZhaGkvbUROUyBjbGllbnQgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudF0pCi1BQ19BUkdfV0lUSChhdmFoaSwKLVsgIC0td2l0aG91dC1hdmFoaSAgICAgICAgIGRpc2FibGUgc3VwcG9ydCBmb3IgQXZhaGkvbUROU10KLVsgIC0td2l0aC1hdmFoaT1ESVIgICAgICAgIHVzZSBhdmFoaSBpbmNsdWRlL2xpYnJhcnkgZmlsZXMgaW4gRElSXSwsKQotaWYgdGVzdCAieCR3aXRoX2F2YWhpIiAhPSAieG5vIjsgdGhlbgotCXByaW50ZiAiY2hlY2tpbmcgZm9yIGF2YWhpLi4uICIKLQlpZiB0ZXN0ICEgLXogIiR3aXRoX2F2YWhpIiAtYSAieCR3aXRoX2F2YWhpIiAhPSAieHllcyI7IHRoZW4KLQkJQVZBSElfQ0ZMQUdTPSItSSR3aXRoX2F2YWhpL2luY2x1ZGUiCi0JCUFWQUhJX0xJQlM9Ii1MJHdpdGhfYXZhaGkvbGliIC1sYXZhaGktY29tbW9uIC1sYXZhaGktY2xpZW50IgotCQllY2hvICJ1c2luZyAkd2l0aF9hdmFoaSIKLQkJd2l0aF9hdmFoaT15ZXMKLQllbGlmIHBrZy1jb25maWcgLS1hdGxlYXN0LXZlcnNpb249MC42LjQgYXZhaGktY2xpZW50ID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlBVkFISV9DRkxBR1M9YHBrZy1jb25maWcgLS1jZmxhZ3MgYXZhaGktY2xpZW50YAotCQlBVkFISV9MSUJTPWBwa2ctY29uZmlnIC0tbGlicyBhdmFoaS1jbGllbnRgCi0JCXdpdGhfYXZhaGk9eWVzCi0JCWVjaG8geWVzCi0JZWxzZQotCQl3aXRoX2F2YWhpPW5vCi0JCWVjaG8gbm8KLQlmaQotZmkKLWlmIHRlc3QgIngkd2l0aF9hdmFoaSIgPSAieHllcyI7IHRoZW4KLQlBQ19ERUZJTkUoSEFWRV9BVkFISSkKLQlBQ19TVUJTVChBVkFISV9DRkxBR1MpCi0JQUNfU1VCU1QoQVZBSElfTElCUykKLWZpCi0KLWZpCi0jIGVuZCB4MTF2bmMgb25seS4KLQotIyBvbmx5IHVzZWQgaW4geDExdm5jL01ha2VmaWxlLmFtIGJ1dCBuZWVkcyB0byBhbHdheXMgYmUgZGVmaW5lZDoKLUFNX0NPTkRJVElPTkFMKE9TWF9PUEVOR0wsIHRlc3QgIiRIQVZFX01BQ09TWF9PUEVOR0xfSCIgPSAidHJ1ZSIpCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCi0KLWlmIHRlc3QgISAteiAiJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgLWEgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiAhPSAieG5vIjsgdGhlbgotCXByaW50ZiAiY2hlY2tpbmcgZm9yIHN5c3RlbSBsaWJ2bmNzZXJ2ZXIuLi4gIgotCXZuZWVkPSIwLjkuMSIKLQlpZiB0ZXN0ICJYJFZORUVEIiAhPSAiWCI7IHRoZW4KLQkJdm5lZWQ9JFZORUVECi0JZmkKLQlpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInh5ZXMiOyB0aGVuCi0JCXJmbGFnPSIiCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJcmZsYWc9Ii1YbGlua2VyIC1SJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIiCi0JCWVsc2UKLQkJCXJmbGFnPSItUiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvbGliIgotCQlmaQotCQljbWQ9IiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvYmluL2xpYnZuY3NlcnZlci1jb25maWciCi0JCWlmICRjbWQgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCWN2ZXJzPWAkY21kIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKLQkJCWNzY29yZT1gZWNobyAiJGN2ZXJzIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCQkJbnNjb3JlPWBlY2hvICIkdm5lZWQiIHwgdHIgJy4nICcgJyB8IGF3ayAne3ByaW50IDEwMDAwICogJDEgKyAxMDAgKiAkMiArICQzfSdgCi0KLQkJCWlmIHRlc3QgJGNzY29yZSAtbHQgJG5zY29yZTsgdGhlbgotCQkJCWVjaG8gIm5vIgotCQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj1ubwotCQkJCUFDX01TR19FUlJPUihbCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5lZWQgbGlidm5jc2VydmVyIHZlcnNpb24gJHZuZWVkLCBoYXZlIHZlcnNpb24gJGN2ZXJzICoqKgotWW91IGFyZSBidWlsZGluZyB3aXRoIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgYW5kIGl0IGlzIG5vdAotbmV3IGVub3VnaC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1dKQotCQkJZWxzZQotCQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTPSItSSR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIvaW5jbHVkZSIKLQkJCQlTWVNURU1fTElCVk5DU0VSVkVSX0xJQlM9Ii1MJHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlci9saWIgJHJmbGFnIC1sdm5jc2VydmVyIC1sdm5jY2xpZW50IgotCQkJCWVjaG8gInVzaW5nICR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiCi0JCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPXllcwotCQkJZmkKLQkJZWxzZQotCQkJZWNobyAiICoqKiBjYW5ub3QgcnVuICRjbWQgKioqICIgMT4mMgotCQkJd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyPW5vCi0JCQllY2hvIG5vCi0JCWZpCi0JZWxpZiBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXJmbGFnPSIiCi0JCXJwcmVmaXg9YGxpYnZuY3NlcnZlci1jb25maWcgLS1wcmVmaXhgCi0JCWlmIHRlc3QgIngkbGRfbWludXNfUiIgPSAieG5vIjsgdGhlbgotCQkJOgotCQllbGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgotCQkJcmZsYWc9IiAtWGxpbmtlciAtUiRycHJlZml4L2xpYiAiCi0JCWVsc2UKLQkJCXJmbGFnPSIgLVIkcnByZWZpeC9saWIgIgotCQlmaQotCQljdmVycz1gbGlidm5jc2VydmVyLWNvbmZpZyAtLXZlcnNpb24gMj4vZGV2L251bGxgCi0JCWNzY29yZT1gZWNobyAiJGN2ZXJzIiB8IHRyICcuJyAnICcgfCBhd2sgJ3twcmludCAxMDAwMCAqICQxICsgMTAwICogJDIgKyAkM30nYAotCQluc2NvcmU9YGVjaG8gIiR2bmVlZCIgfCB0ciAnLicgJyAnIHwgYXdrICd7cHJpbnQgMTAwMDAgKiAkMSArIDEwMCAqICQyICsgJDN9J2AKLQotCQlpZiB0ZXN0ICRjc2NvcmUgLWx0ICRuc2NvcmU7IHRoZW4KLQkJCWVjaG8gIm5vIgotCQkJCUFDX01TR19FUlJPUihbCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKioqIE5lZWQgbGlidm5jc2VydmVyIHZlcnNpb24gJHZuZWVkLCBoYXZlIHZlcnNpb24gJGN2ZXJzICoqKgotWW91IGFyZSBidWlsZGluZyB3aXRoIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIgYW5kIGl0IGlzIG5vdAotbmV3IGVub3VnaC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1dKQotCQllbHNlCi0JCQlTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUz1gbGlidm5jc2VydmVyLWNvbmZpZyAtLWNmbGFnc2AKLQkJCVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUz0iJHJmbGFnImBsaWJ2bmNzZXJ2ZXItY29uZmlnIC0tbGlic2AKLQkJCXdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlcj15ZXMKLQkJCWVjaG8geWVzCi0JCWZpCi0JZWxzZQotCQl3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXI9bm8KLQkJZWNobyBubwotCWZpCi1maQotCi1pZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgPSAieHllcyI7IHRoZW4KLQlBQ19ERUZJTkUoSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSKQotCUFDX1NVQlNUKFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTKQotCUFDX1NVQlNUKFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUykKLWZpCi1BTV9DT05ESVRJT05BTChIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVIsIHRlc3QgIngkd2l0aF9zeXN0ZW1fbGlidm5jc2VydmVyIiA9ICJ4eWVzIikKIAogCiBBQ19BUkdfV0lUSChqcGVnLApAQCAtNjU5LDcgKzMwNCw2IEBACiAJCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKIAkJZmkKIAlmaQotCWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KIAkJaWYgdGVzdCAieCRIQVZFX1BOR0xJQl9IIiAhPSAieHRydWUiOyB0aGVuCiAJCQlBQ19NU0dfV0FSTihbCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjczLDcgKzMxNyw2IEBACiBdKQogCQkJc2xlZXAgNQogCQlmaQotCWZpCiBmaQogCiBBQ19BUkdfV0lUSChsaWJ6LApAQCAtNzA2LDcgKzM0OSw2IEBACiAJCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKIAkJZmkKIAlmaQotCWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KIAkJaWYgdGVzdCAieCRIQVZFX1pMSUJfSCIgIT0gInh0cnVlIjsgdGhlbgogCQkJQUNfTVNHX1dBUk4oWwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTcxOSw3ICszNjEsNiBAQAogXSkKIAkJCXNsZWVwIDUKIAkJZmkKLQlmaQogZmkKIAogQUNfQVJHX1dJVEgocHRocmVhZCwKQEAgLTc1NSw3ICszOTYsNyBAQAogCXdpdGhfd2Vic29ja2V0cz0iIgogZmkKIGlmIHRlc3QgIngkd2l0aF93ZWJzb2NrZXRzIiA9ICJ4eWVzIjsgdGhlbgotCUxJQlM9IiRMSUJTIC1scmVzb2x2ICRTU0xfTElCUyIKKwlMSUJTPSIkTElCUyAkUkVTT0xWX0xJQiAkU1NMX0xJQlMiCiAJQUNfREVGSU5FKFdJVEhfV0VCU09DS0VUUykKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX1dFQlNPQ0tFVFMsIHRlc3QgIiR3aXRoX3dlYnNvY2tldHMiID0gInllcyIpCkBAIC04NzEsMTIgKzUxMiw3IEBACiAKICMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCiBBQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhbYXJwYS9pbmV0LmggZmNudGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdGltZWIuaCBzeXNsb2cuaCB1bmlzdGQuaCB3czJ0Y3BpcC5oXSkKLQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQlBQ19DSEVDS19IRUFERVJTKFtwd2QuaCBzeXMvd2FpdC5oIHV0bXB4LmggdGVybWlvcy5oIHN5cy9pb2N0bC5oIHN5cy9zdHJvcHRzLmhdKQotZmkKK0FDX0NIRUNLX0hFQURFUlMoW2FycGEvaW5ldC5oIGVuZGlhbi5oIGZjbnRsLmggbmV0ZGIuaCBuZXRpbmV0L2luLmggc3RkbGliLmggc3RyaW5nLmggc3lzL2VuZGlhbi5oIHN5cy9zb2NrZXQuaCBzeXMvdGltZS5oIHN5cy90aW1lYi5oIHN5c2xvZy5oIHVuaXN0ZC5oIHdzMnRjcGlwLmhdKQogCiAjIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCiBBQ19DX0NPTlNUCkBAIC04ODUsMTIgKzUyMSwxMiBAQAogQUNfVFlQRV9TSVpFX1QKIEFDX0hFQURFUl9USU1FCiBBQ19IRUFERVJfU1lTX1dBSVQKLUFDX1RZUEVfU09DS0xFTl9UCitBWF9UWVBFX1NPQ0tMRU5fVAogaWYgdGVzdCAhIC1kIC4vcmZiOyB0aGVuCiAJZWNobyAiY3JlYXRpbmcgc3ViZGlyIC4vcmZiIGZvciByZmJpbnQuaCIKIAlta2RpciAuL3JmYiAKIGZpCi1BQ19DUkVBVEVfU1RESU5UX0gocmZiL3JmYmludC5oKQorQVhfQ1JFQVRFX1NURElOVF9IKHJmYi9yZmJpbnQuaCkKIEFDX0NBQ0hFX0NIRUNLKFtmb3IgaW5fYWRkcl90XSwKICAgICAgICAgdm5jX2N2X2luYWRkcnQsIFsKICAgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtOTE5LDEwICs1NTUsNiBAQAogZmkKIAogQUNfQ0hFQ0tfRlVOQ1MoW2Z0aW1lIGdldGhvc3RieW5hbWUgZ2V0aG9zdG5hbWUgZ2V0dGltZW9mZGF5IGluZXRfbnRvYSBtZW1tb3ZlIG1lbXNldCBtbWFwIG1rZmlmbyBzZWxlY3Qgc29ja2V0IHN0cmNociBzdHJjc3BuIHN0cmR1cCBzdHJlcnJvciBzdHJzdHJdKQotIyB4MTF2bmMgb25seToKLWlmIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyI7IHRoZW4KLQlBQ19DSEVDS19GVU5DUyhbc2V0c2lkIHNldHBncnAgZ2V0cHd1aWQgZ2V0cHduYW0gZ2V0c3BuYW0gZ2V0dWlkIGdldGV1aWQgc2V0dWlkIHNldGdpZCBzZXRldWlkIHNldGVnaWQgaW5pdGdyb3VwcyB3YWl0cGlkIHNldHV0eGVudCBncmFudHB0IHNobWF0XSkKLWZpCiAKICMgY2hlY2ssIGlmIHNobWdldCBpcyBpbiBjeWdpcGMuYQogQUNfQ0hFQ0tfTElCKGN5Z2lwYyxzaG1nZXQpCkBAIC05NjAsNyArNTkyLDYgQEAKIGRvbmUKIGVjaG8gIiRSUE1TT1VSQ0VESVIiCiBBTV9DT05ESVRJT05BTChIQVZFX1JQTSwgdGVzdCAiJFJQTVNPVVJDRURJUiIgIT0gIk5PVC1GT1VORCIpCi1BTV9DT05ESVRJT05BTChXSVRIX1gxMVZOQywgIHRlc3QgIiRidWlsZF94MTF2bmMiID0gInllcyIpCiBBQ19TVUJTVChSUE1TT1VSQ0VESVIpCiAKIEFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUKQEAgLTk2OSw3ICs2MDAsNiBAQAogCWxpYnZuY3NlcnZlci9NYWtlZmlsZQogCWV4YW1wbGVzL01ha2VmaWxlCiAJZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZQotCXZuY3Rlcm0vTWFrZWZpbGUKIAl3ZWJjbGllbnRzL01ha2VmaWxlCiAJd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZQogCXdlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlCkBAIC05NzgsMzYgKzYwOCw3IEBACiAJdGVzdC9NYWtlZmlsZQogCWxpYnZuY3NlcnZlci1jb25maWcKIAlMaWJWTkNTZXJ2ZXIuc3BlY10pCi0jCi0jIHgxMXZuYyBvbmx5OgotIwotaWYgdGVzdCAiJGJ1aWxkX3gxMXZuYyIgPSAieWVzIjsgdGhlbgotCSMKLQkjIE5PVEU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIExpYlZOQ1NlcnZlci1YLlkuWi50YXIuZ3ogc291cmNlCi0JIyB0YXJiYWxsIGFuZCBuZXZlcnRoZWxlc3Mgd2FudCB0byBydW4gYXV0b2NvbmYgKGkuZS4gYWNsb2NhbCwKLQkjIGF1dG9oZWFkZXIsIGF1dG9tYWtlLCBhdXRvY29uZikgQUdBSU4gKHBlcmhhcHMgeW91IGhhdmUgYQotCSMgc3BlY2lhbCB0YXJnZXQgc3lzdGVtLCBlLmcuIGVtYmVkZGVkKSB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KLQkjIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgJ0FDX0NPTkZJR19GSUxFUycgbGluZSB0byBhdm9pZAotCSMgYXV0b21ha2UgZXJyb3IgbWVzc2FnZXMgbGlrZToKLQkjCi0JIyBjb25maWd1cmUuYWM6NjkwOiByZXF1aXJlZCBmaWxlIGB4MTF2bmMvTWFrZWZpbGUuaW4nIG5vdCBmb3VuZAotCSMKLQlBQ19DT05GSUdfRklMRVMoW3gxMXZuYy9NYWtlZmlsZSB4MTF2bmMvbWlzYy9NYWtlZmlsZSB4MTF2bmMvbWlzYy90dXJib3ZuYy9NYWtlZmlsZV0pCiAKLQlpZiB0ZXN0ICEgLXogIiR3aXRoX3N5c3RlbV9saWJ2bmNzZXJ2ZXIiIC1hICJ4JHdpdGhfc3lzdGVtX2xpYnZuY3NlcnZlciIgIT0gInhubyI7IHRoZW4KLQkJIyBuZWVkIHRvIG1vdmUgbG9jYWwgdGFyYmFsbCByZmIgaGVhZGVycyBhc2lkZToKLQkJaGRycz0icmZiLmggcmZiY2xpZW50LmggcmZicHJvdG8uaCByZmJyZWdpb24uaCByZmJpbnQuaCIKLQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgYXNpZGUgaGVhZGVycyAkaGRycyIKLQkJZm9yIGhkciBpbiAkaGRycwotCQlkbwotCQkJaWYgdGVzdCAtZiAicmZiLyRoZHIiOyB0aGVuCi0JCQkJZWNobyAid2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyOiBtb3ZpbmcgcmZiLyRoZHIgdG8gcmZiLyRoZHIuT1JJRyIKLQkJCQltdiByZmIvJGhkciByZmIvJGhkci5PUklHCi0JCQlmaQotCQlkb25lCi0JCWVjaG8gIndpdGgtc3lzdGVtLWxpYnZuY3NlcnZlcjogKk5PVEUqIG1vdmUgdGhlbSBiYWNrIG1hbnVhbGx5IHRvIHN0YXJ0IG92ZXIuIgotCWZpCi1maQogCiBBQ19DT05GSUdfQ09NTUFORFMoW2NobW9kLWxpYnZuY3NlcnZlci1jb25maWddLFtjaG1vZCBhK3ggbGlidm5jc2VydmVyLWNvbmZpZ10pCiBBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2RlcGNvbXAgYi9kZXBjb21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWEzOWU2Li4wMDAwMDAwCi0tLSBhL2RlcGNvbXAKKysrIC9kZXYvbnVsbApAQCAtMSw3MDggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCi0KLXNjcmlwdHZlcnNpb249MjAxMi0wMy0yNy4xNjsgIyBVVEMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsCi0jIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5ICckMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICAgICBleGl0IDE7Ci0gICAgIDs7Ci0gIC1oIHwgLS1oKikKLSAgICBjYXQgPDxcRU9GCi1Vc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQotCi1SdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKLWFzIHNpZGUtZWZmZWN0cy4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCi0gIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgJ1BST0dSQU1TIEFSR1MnLgotICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgJ1BST0dSQU1TIEFSR1MnLgotICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgotICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgotICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXR0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0ICQ/Ci0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAkPwotICAgIDs7Ci1lc2FjCi0KLSMgQSB0YWJ1bGF0aW9uIGNoYXJhY3Rlci4KLXRhYj0nCScKLSMgQSBuZXdsaW5lIGNoYXJhY3Rlci4KLW5sPScKLScKLQotaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCi0gIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgotZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKLSAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Ci10bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQotCi1ybSAtZiAiJHRtcGRlcGZpbGUiCi0KLSMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQotIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKLSMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKLSMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgotICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KLSAgZ2NjZmxhZz0tTQotICBkZXBtb2RlPWdjYwotZmkKLQotaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCi0gICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCi0gICBkYXNobWZsYWc9LXhNCi0gICBkZXBtb2RlPWRhc2htc3Rkb3V0Ci1maQotCi1jeWdwYXRoX3U9ImN5Z3BhdGggLXUgLWYgLSIKLWlmIHRlc3QgIiRkZXBtb2RlIiA9IG1zdmNtc3lzOyB0aGVuCi0gICAjIFRoaXMgaXMganVzdCBsaWtlIG1zdmlzdWFsY3BwIGJ1dCB3L28gY3lncGF0aCB0cmFuc2xhdGlvbi4KLSAgICMgSnVzdCBjb252ZXJ0IHRoZSBiYWNrc2xhc2gtZXNjYXBlZCBiYWNrc2xhc2hlcyB0byBzaW5nbGUgZm9yd2FyZAotICAgIyBzbGFzaGVzIHRvIHNhdGlzZnkgZGVwZW5kLm00Ci0gICBjeWdwYXRoX3U9J3NlZCBzLFxcXFwsLyxnJwotICAgZGVwbW9kZT1tc3Zpc3VhbGNwcAotZmkKLQotaWYgdGVzdCAiJGRlcG1vZGUiID0gbXN2Yzdtc3lzOyB0aGVuCi0gICAjIFRoaXMgaXMganVzdCBsaWtlIG1zdmM3IGJ1dCB3L28gY3lncGF0aCB0cmFuc2xhdGlvbi4KLSAgICMgSnVzdCBjb252ZXJ0IHRoZSBiYWNrc2xhc2gtZXNjYXBlZCBiYWNrc2xhc2hlcyB0byBzaW5nbGUgZm9yd2FyZAotICAgIyBzbGFzaGVzIHRvIHNhdGlzZnkgZGVwZW5kLm00Ci0gICBjeWdwYXRoX3U9J3NlZCBzLFxcXFwsLyxnJwotICAgZGVwbW9kZT1tc3ZjNwotZmkKLQotaWYgdGVzdCAiJGRlcG1vZGUiID0geGxjOyB0aGVuCi0gICAjIElCTSBDL0MrKyBDb21waWxlcnMgeGxjL3hsQyBjYW4gb3V0cHV0IGdjYy1saWtlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25zLgotICAgZ2NjZmxhZz0tcW1ha2VkZXA9Z2NjLC1NRgotICAgZGVwbW9kZT1nY2MKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotIyMgVW5mb3J0dW5hdGVseSwgRnJlZUJTRCBjODkgYWNjZXB0YW5jZSBvZiBmbGFncyBkZXBlbmRzIHVwb24KLSMjIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3JkZXI7IHNvIGFkZCB0aGUgZmxhZ3Mgd2hlcmUgdGhleQotIyMgYXBwZWFyIGluIGRlcGVuZDIuYW0uICBOb3RlIHRoYXQgdGhlIHNsb3dkb3duIGluY3VycmVkIGhlcmUKLSMjIGFmZmVjdHMgb25seSBjb25maWd1cmU6IGluIG1ha2VmaWxlcywgJUZBU1RERVAlIHNob3J0Y3V0cyB0aGlzLgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAkYXJnIGluCi0gICAgLWMpIHNldCBmbm9yZCAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIiAiJGFyZyIgOzsKLSAgICAqKSAgc2V0IGZub3JkICIkQCIgIiRhcmciIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0ICMgZm5vcmQKLSAgICBzaGlmdCAjICRhcmcKLSAgZG9uZQotICAiJEAiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKLSAgOzsKLQotZ2NjKQotIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKLSMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgotIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKLSMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KLSMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCi0jIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQotIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCi0jIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCi0jIyAgIHRoYW4gcmVuYW1pbmcpLgotICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KLSAgICBnY2NmbGFnPS1NRCwKLSAgZmkKLSAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKLSMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KLSAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCi0gICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0jIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSAiZGVsZXRlZCBoZWFkZXIgZmlsZSIgcHJvYmxlbS4KLSMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCi0jIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKLSMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCi0jIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCi0jIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KLSAgdHIgJyAnICIkbmwiIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlICc6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4gIGhwIGRlcG1vZGUgYWxzbyBhZGRzIHRoYXQgc3BhY2UsIGJ1dCBhbHNvIHByZWZpeGVzIHRoZSBWUEFUSAotIyMgdG8gdGhlIG9iamVjdC4gIFRha2UgY2FyZSB0byBub3QgcmVwZWF0IGl0IGluIHRoZSBvdXRwdXQuCi0jIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICJzfC4qJG9iamVjdCR8fCIgLWUgJy86JC9kJyBcCi0gICAgICB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlICcjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgIiRubCIgPCAiJHRtcGRlcGZpbGUiIFwKLSAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCi0gICAgdHIgIiRubCIgJyAnID4+ICIkZGVwZmlsZSIKLSAgICBlY2hvID4+ICIkZGVwZmlsZSIKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAiJG5sIiA8ICIkdG1wZGVwZmlsZSIgXAotICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKLSAgID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLXhsYykKLSAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5Ci0gICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKLSAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzICckb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQotICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKLSAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQotICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCi0gICAgZXhpdCAkc3RhdAotICBmaQotCi0gIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCi0gIGRvCi0gICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCi0gIGRvbmUKLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gJ2Zvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjICckb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgJ2RlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WyciJHRhYiInIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIGVsc2UKLSAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAotICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQotICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCi0gICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgZmkKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1pY2MpCi0gICMgSW50ZWwncyBDIGNvbXBpbGVyIGFuZiB0Y2MgKFRpbnkgQyBDb21waWxlcikgdW5kZXJzdGFuZCAnLU1EIC1NRiBmaWxlJy4KLSAgIyBIb3dldmVyIG9uCi0gICMgICAgJENDIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudAotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5jCi0gICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmgKLSAgIyAgICBzdWIvZm9vLmM6Ci0gICMgICAgc3ViL2Zvby5oOgotICAjIElDQyA3LjEgd2lsbCBvdXRwdXQKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jIHN1Yi9mb28uaAotICAjIGFuZCB3aWxsIHdyYXAgbG9uZyBsaW5lcyB1c2luZyAnXCc6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0gICMgdGNjIDAuOS4yNiAoRklYTUUgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKQotICAjIHdpbGwgZW1pdCBhIHNpbWlsYXIgb3V0cHV0LCBidXQgYWxzbyBwcmVwZW5kIHRoZSBjb250aW51YXRpb24gbGluZXMKLSAgIyB3aXRoIGhvcml6b250YWwgdGFidWxhdGlvbiBjaGFyYWN0ZXJzLgotICAiJEAiIC1NRCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSAnZm9vLm86IGRlcGVuZGVudC5oJywKLSAgIyBvciAnZm9vLm86IGRlcDEuaCBkZXAyLmggXCcsIG9yICcgZGVwMy5oIGRlcDQuaCBcJy4KLSAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgIyAnJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5ICdkZXBlbmRlbnQuaDonLgotICBzZWQgLWUgInMvXlsgJHRhYl1bICR0YWJdKi8gIC8iIC1lICJzLF5bXjpdKjosJG9iamVjdCA6LCIgXAotICAgIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgc2VkICcKLSAgICBzL1sgJyIkdGFiIiddWyAnIiR0YWIiJ10qLyAvZwotICAgIHMvXiAqLy8KLSAgICBzLyAqXFwqJC8vCi0gICAgcy9eW146XSo6ICovLwotICAgIC9eJC9kCi0gICAgLzokL2QKLSAgICBzLyQvIDovCi0gICcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ocDIpCi0gICMgVGhlICJocCIgc3RhbnphIGFib3ZlIGRvZXMgbm90IHdvcmsgd2l0aCBhQ0MgKEMrKykgYW5kIEhQJ3MgaWE2NAotICAjIGNvbXBpbGVycywgd2hpY2ggaGF2ZSBpbnRlZ3JhdGVkIHByZXByb2Nlc3NvcnMuICBUaGUgY29ycmVjdCBvcHRpb24KLSAgIyB0byB1c2Ugd2l0aCB0aGVzZSBpcyArTWFrZWQ7IGl0IHdyaXRlcyBkZXBlbmRlbmNpZXMgdG8gYSBmaWxlIG5hbWVkCi0gICMgJ2Zvby5kJywgd2hpY2ggbGFuZHMgbmV4dCB0byB0aGUgb2JqZWN0IGZpbGUsIHdoZXJldmVyIHRoYXQKLSAgIyBoYXBwZW5zIHRvIGJlLgotICAjIE11Y2ggb2YgdGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB0cnU2NCBjYXNlOyBzZWUgY29tbWVudHMgdGhlcmUuCi0gIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQotICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5kCi0gICAgdG1wZGVwZmlsZTI9JGRpci5saWJzLyRiYXNlLmQKLSAgICAiJEAiIC1XYywrTWFrZWQKLSAgZWxzZQotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5kCi0gICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKLSAgICAiJEAiICtNYWtlZAotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCi0gICAgIGV4aXQgJHN0YXQKLSAgZmkKLQotICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgotICBkbwotICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhawotICBkb25lCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgotICAgIHNlZCAtZSAicyxeLipcLlthLXpdKjosJG9iamVjdDosIiAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICMgQWRkICdkZXBlbmRlbnQuaDonIGxpbmVzLgotICAgIHNlZCAtbmUgJzIsJHsKLQkgICAgICAgcy9eICovLwotCSAgICAgICBzLyBcXCokLy8KLQkgICAgICAgcy8kLzovCi0JICAgICAgIHAKLQkgICAgIH0nICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotICBlbHNlCi0gICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgZmkKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUyIgotICA7OwotCi10cnU2NCkKLSAgICMgVGhlIFRydTY0IGNvbXBpbGVyIHVzZXMgLU1EIHRvIGdlbmVyYXRlIGRlcGVuZGVuY2llcyBhcyBhIHNpZGUKLSAgICMgZWZmZWN0LiAgJ2NjIC1NRCAtbyBmb28ubyAuLi4nIHB1dHMgdGhlIGRlcGVuZGVuY2llcyBpbnRvICdmb28uby5kJy4KLSAgICMgQXQgbGVhc3Qgb24gQWxwaGEvUmVkaGF0IDYuMSwgQ29tcGFxIENDQyBWNi4yLTUwNCBzZWVtcyB0byBwdXQKLSAgICMgZGVwZW5kZW5jaWVzIGluICdmb28uZCcgaW5zdGVhZCwgc28gd2UgY2hlY2sgZm9yIHRoYXQgdG9vLgotICAgIyBTdWJkaXJlY3RvcmllcyBhcmUgcmVzcGVjdGVkLgotICAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKLSAgIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQotICAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotCi0gICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2l0aCBUcnU2NCBjYywgc2hhcmVkIG9iamVjdHMgY2FuIGFsc28gYmUgdXNlZCB0byBtYWtlIGEKLSAgICAgICMgc3RhdGljIGxpYnJhcnkuICBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIGluIGxpYnRvb2wgMS40IHNlcmllcyB0bwotICAgICAgIyBoYW5kbGUgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24uCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjQsIGRlcGVuZGVuY2llcyB3ZXJlIG91dHB1dCBpbiAkZGlyLmxpYnMvJGJhc2UubG8uZC4KLSAgICAgICMKLSAgICAgICMgV2l0aCBsaWJ0b29sIDEuNSB0aGlzIGV4Y2VwdGlvbiB3YXMgcmVtb3ZlZCwgYW5kIGxpYnRvb2wgbm93Ci0gICAgICAjIGdlbmVyYXRlcyAyIHNlcGFyYXRlIG9iamVjdHMgZm9yIHRoZSAyIGxpYnJhcmllcy4gIFRoZXNlIHR3bwotICAgICAgIyBjb21waWxhdGlvbnMgb3V0cHV0IGRlcGVuZGVuY2llcyBpbiAkZGlyLmxpYnMvJGJhc2Uuby5kIGFuZAotICAgICAgIyBpbiAkZGlyJGJhc2Uuby5kLiAgV2UgaGF2ZSB0byBjaGVjayBmb3IgYm90aCBmaWxlcywgYmVjYXVzZQotICAgICAgIyBvbmUgb2YgdGhlIHR3byBjb21waWxhdGlvbnMgY2FuIGJlIGRpc2FibGVkLiAgV2Ugc2hvdWxkIHByZWZlcgotICAgICAgIyAkZGlyJGJhc2Uuby5kIG92ZXIgJGRpci5saWJzLyRiYXNlLm8uZCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMKLSAgICAgICMgYXV0b21hdGljYWxseSBjbGVhbmVkIHdoZW4gLmxpYnMvIGlzIGRlbGV0ZWQsIHdoaWxlIGlnbm9yaW5nCi0gICAgICAjIHRoZSBmb3JtZXIgd291bGQgY2F1c2UgYSBkaXN0Y2xlYW5jaGVjayBwYW5pYy4KLSAgICAgIHRtcGRlcGZpbGUxPSRkaXIubGlicy8kYmFzZS5sby5kICAgIyBsaWJ0b29sIDEuNAotICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLm8uZCAgICAgICAgICAjIGxpYnRvb2wgMS41Ci0gICAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2Uuby5kICAgICMgbGlidG9vbCAxLjUKLSAgICAgIHRtcGRlcGZpbGU0PSRkaXIubGlicy8kYmFzZS5kICAgICAgIyBDb21wYXEgQ0NDIFY2LjItNTA0Ci0gICAgICAiJEAiIC1XYywtTUQKLSAgIGVsc2UKLSAgICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5vLmQKLSAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCi0gICAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UuZAotICAgICAgdG1wZGVwZmlsZTQ9JGRpciRiYXNlLmQKLSAgICAgICIkQCIgLU1ECi0gICBmaQotCi0gICBzdGF0PSQ/Ci0gICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgIGVsc2UKLSAgICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCi0gICAgICBleGl0ICRzdGF0Ci0gICBmaQotCi0gICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgotICAgZG8KLSAgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCi0gICBkb25lCi0gICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICAgIHNlZCAtZSAicyxeLipcLlthLXpdKjosJG9iamVjdDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gICAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WyciJHRhYiInIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLW1zdmM3KQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICBzaG93SW5jbHVkZXM9LVdjLC1zaG93SW5jbHVkZXMKLSAgZWxzZQotICAgIHNob3dJbmNsdWRlcz0tc2hvd0luY2x1ZGVzCi0gIGZpCi0gICIkQCIgJHNob3dJbmNsdWRlcyA+ICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBncmVwIC12ICdeTm90ZTogaW5jbHVkaW5nIGZpbGU6ICcgIiR0bXBkZXBmaWxlIgotICBpZiB0ZXN0ICIkc3RhdCIgPSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgIyBUaGUgZmlyc3Qgc2VkIHByb2dyYW0gYmVsb3cgZXh0cmFjdHMgdGhlIGZpbGUgbmFtZXMgYW5kIGVzY2FwZXMKLSAgIyBiYWNrc2xhc2hlcyBmb3IgY3lncGF0aC4gIFRoZSBzZWNvbmQgc2VkIHByb2dyYW0gb3V0cHV0cyB0aGUgZmlsZQotICAjIG5hbWUgd2hlbiByZWFkaW5nLCBidXQgYWxzbyBhY2N1bXVsYXRlcyBhbGwgaW5jbHVkZSBmaWxlcyBpbiB0aGUKLSAgIyBob2xkIGJ1ZmZlciBpbiBvcmRlciB0byBvdXRwdXQgdGhlbSBhZ2FpbiBhdCB0aGUgZW5kLiAgVGhpcyBvbmx5Ci0gICMgd29ya3Mgd2l0aCBzZWQgaW1wbGVtZW50YXRpb25zIHRoYXQgY2FuIGhhbmRsZSBsYXJnZSBidWZmZXJzLgotICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uICcKLS9eTm90ZTogaW5jbHVkaW5nIGZpbGU6ICAqXCguKlwpLyB7Ci0gIHMvL1wxLwotICBzL1xcL1xcXFwvZwotICBwCi19JyB8ICRjeWdwYXRoX3UgfCBzb3J0IC11IHwgc2VkIC1uICcKLXMvIC9cXCAvZwotcy9cKC4qXCkvJyIkdGFiIidcMSBcXC9wCi1zLy5cKC4qXCkgXFwvXDE6LwotSAotJCB7Ci0gIHMvLiovJyIkdGFiIicvCi0gIEcKLSAgcAotfScgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLW1zdmM3bXN5cykKLSAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5Ci0gICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKLSAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCi0gICAgICBzaGlmdAotICAgIGRvbmUKLSAgICBzaGlmdAotICBmaQotCi0gICMgUmVtb3ZlICctbyAkb2JqZWN0Jy4KLSAgSUZTPSIgIgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAkYXJnIGluCi0gICAgLW8pCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAkb2JqZWN0KQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgotICAgICAgc2hpZnQgIyBmbm9yZAotICAgICAgc2hpZnQgIyAkYXJnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQotICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgJzonCi0gICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKLSAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyAnYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgJ2MnIG90aGVyd2lzZS4KLSAgIiRAIiAkZGFzaG1mbGFnIHwKLSAgICBzZWQgJ3M6XlsnIiR0YWIiJyBdKlteOiciJHRhYiInIF1bXjpdW146XSpcOlsnIiR0YWIiJyBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAiJG5sIiA8ICIkdG1wZGVwZmlsZSIgfCBcCi0jIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1kYXNoWG1zdGRvdXQpCi0gICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCi0gIGV4aXQgMQotICA7OwotCi1tYWtlZGVwZW5kKQotICAiJEAiIHx8IGV4aXQgJD8KLSAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLSAgIyBYIG1ha2VkZXBlbmQKLSAgc2hpZnQKLSAgY2xlYXJlZD1ubyBlYXQ9bm8KLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGlmIHRlc3QgJGVhdCA9IHllczsgdGhlbgotICAgICAgZWF0PW5vCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAtRCp8LUkqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgICMgU3RyaXAgYW55IG9wdGlvbiB0aGF0IG1ha2VkZXBlbmQgbWF5IG5vdCB1bmRlcnN0YW5kLiAgUmVtb3ZlCi0gICAgIyB0aGUgb2JqZWN0IHRvbywgb3RoZXJ3aXNlIG1ha2VkZXBlbmQgd2lsbCBwYXJzZSBpdCBhcyBhIHNvdXJjZSBmaWxlLgotICAgIC1hcmNoKQotICAgICAgZWF0PXllcyA7OwotICAgIC0qfCRvYmplY3QpCi0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7Ci0gICAgZXNhYwotICBkb25lCi0gIG9ial9zdWZmaXg9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL14uKlwuLy4vJ2AKLSAgdG91Y2ggIiR0bXBkZXBmaWxlIgotICAke01BS0VERVBFTkQtbWFrZWRlcGVuZH0gLW8iJG9ial9zdWZmaXgiIC1mIiR0bXBkZXBmaWxlIiAiJEAiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBtYWtlZGVwZW5kIG1heSBwcmVwZW5kIHRoZSBWUEFUSCBmcm9tIHRoZSBzb3VyY2UgZmlsZSBuYW1lIHRvIHRoZSBvYmplY3QuCi0gICMgTm8gbmVlZCB0byByZWdleC1lc2NhcGUgJG9iamVjdCwgZXhjZXNzIG1hdGNoaW5nIG9mICcuJyBpcyBoYXJtbGVzcy4KLSAgc2VkICJzfF4uKlwoJG9iamVjdCAqOlwpfFwxfCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgc2VkICcxLDJkJyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICIkbmwiIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgJy1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgIiRAIiAtRSB8Ci0gICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKLSAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgotICAiJEAiIHx8IGV4aXQgJD8KLQotICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OiciJHRhYiInXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIkdGFiIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgLW4gLWUgJ3MlICVcXCAlZycgLWUgJy9eXCguKlwpJC8gczo6XDFcOjpwJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2Y21zeXMpCi0gICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQotICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCi0gICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCi0gIGV4aXQgMQotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgotIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL2JhY2tjaGFubmVsLlBvIGIvZXhhbXBsZXMvLmRlcHMvYmFja2NoYW5uZWwuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvLmRlcHMvYmFja2NoYW5uZWwuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy9ibG9vcHRlc3QuUG8gYi9leGFtcGxlcy8uZGVwcy9ibG9vcHRlc3QuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvLmRlcHMvYmxvb3B0ZXN0LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvLmRlcHMvY2FtZXJhLlBvIGIvZXhhbXBsZXMvLmRlcHMvY2FtZXJhLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL2NhbWVyYS5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL2NvbG91cm1hcHRlc3QuUG8gYi9leGFtcGxlcy8uZGVwcy9jb2xvdXJtYXB0ZXN0LlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL2NvbG91cm1hcHRlc3QuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy9leGFtcGxlLlBvIGIvZXhhbXBsZXMvLmRlcHMvZXhhbXBsZS5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy8uZGVwcy9leGFtcGxlLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvLmRlcHMvZmlsZXRyYW5zZmVyLlBvIGIvZXhhbXBsZXMvLmRlcHMvZmlsZXRyYW5zZmVyLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL2ZpbGV0cmFuc2Zlci5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL2ZvbnRzZWwuUG8gYi9leGFtcGxlcy8uZGVwcy9mb250c2VsLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL2ZvbnRzZWwuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy9tYWMuUG8gYi9leGFtcGxlcy8uZGVwcy9tYWMuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvLmRlcHMvbWFjLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvLmRlcHMvcG5tc2hvdy5QbyBiL2V4YW1wbGVzLy5kZXBzL3BubXNob3cuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvLmRlcHMvcG5tc2hvdy5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL3BubXNob3cyNC5QbyBiL2V4YW1wbGVzLy5kZXBzL3BubXNob3cyNC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy8uZGVwcy9wbm1zaG93MjQuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy9yZWdpb250ZXN0LlBvIGIvZXhhbXBsZXMvLmRlcHMvcmVnaW9udGVzdC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy8uZGVwcy9yZWdpb250ZXN0LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvLmRlcHMvcm90YXRlLlBvIGIvZXhhbXBsZXMvLmRlcHMvcm90YXRlLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL3JvdGF0ZS5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL3NpbXBsZS5QbyBiL2V4YW1wbGVzLy5kZXBzL3NpbXBsZS5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy8uZGVwcy9zaW1wbGUuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy9zaW1wbGUxNS5QbyBiL2V4YW1wbGVzLy5kZXBzL3NpbXBsZTE1LlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL3NpbXBsZTE1LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvLmRlcHMvc3RvcmVwYXNzd2QuUG8gYi9leGFtcGxlcy8uZGVwcy9zdG9yZXBhc3N3ZC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy8uZGVwcy9zdG9yZXBhc3N3ZC5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzLy5kZXBzL3ZuY2V2LlBvIGIvZXhhbXBsZXMvLmRlcHMvdm5jZXYuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvLmRlcHMvdm5jZXYuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9leGFtcGxlcy8uZGVwcy96aXBweS5QbyBiL2V4YW1wbGVzLy5kZXBzL3ppcHB5LlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzLy5kZXBzL3ppcHB5LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvTWFrZWZpbGUgYi9leGFtcGxlcy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiNzFhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgZXhhbXBsZXMvTWFrZWZpbGUuICBHZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi0KLQotCi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvTGliVk5DU2VydmVyCi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0xpYlZOQ1NlcnZlcgotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ub2luc3RfUFJPR1JBTVMgPSBleGFtcGxlJChFWEVFWFQpIHBubXNob3ckKEVYRUVYVCkgXAotCXJlZ2lvbnRlc3QkKEVYRUVYVCkgcG5tc2hvdzI0JChFWEVFWFQpIGZvbnRzZWwkKEVYRUVYVCkgXAotCXZuY2V2JChFWEVFWFQpIHN0b3JlcGFzc3dkJChFWEVFWFQpIGNvbG91cm1hcHRlc3QkKEVYRUVYVCkgXAotCXNpbXBsZSQoRVhFRVhUKSBzaW1wbGUxNSQoRVhFRVhUKSAkKGFtX19FWEVFWFRfMSkgXAotCSQoYW1fX0VYRUVYVF8yKSBiYWNrY2hhbm5lbCQoRVhFRVhUKSAkKGFtX19FWEVFWFRfMykgXAotCWNhbWVyYSQoRVhFRVhUKSByb3RhdGUkKEVYRUVYVCkgemlwcHkkKEVYRUVYVCkKLXN1YmRpciA9IGV4YW1wbGVzCi1ESVNUX0NPTU1PTiA9ICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLSNhbV9fRVhFRVhUXzEgPSBtYWMkKEVYRUVYVCkKLWFtX19FWEVFWFRfMiA9IGZpbGV0cmFuc2ZlciQoRVhFRVhUKQotYW1fX0VYRUVYVF8zID0gYmxvb3B0ZXN0JChFWEVFWFQpCi1QUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQotYmFja2NoYW5uZWxfU09VUkNFUyA9IGJhY2tjaGFubmVsLmMKLWJhY2tjaGFubmVsX09CSkVDVFMgPSBiYWNrY2hhbm5lbC4kKE9CSkVYVCkKLWJhY2tjaGFubmVsX0xEQUREID0gJChMREFERCkKLWJhY2tjaGFubmVsX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLUFNX1ZfbHQgPSAkKGFtX192X2x0XyQoVikpCi1hbV9fdl9sdF8gPSAkKGFtX192X2x0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfbHRfMCA9IC0tc2lsZW50Ci1ibG9vcHRlc3RfU09VUkNFUyA9IGJsb29wdGVzdC5jCi1ibG9vcHRlc3RfT0JKRUNUUyA9IGJsb29wdGVzdC4kKE9CSkVYVCkKLWJsb29wdGVzdF9MREFERCA9ICQoTERBREQpCi1ibG9vcHRlc3RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotY2FtZXJhX1NPVVJDRVMgPSBjYW1lcmEuYwotY2FtZXJhX09CSkVDVFMgPSBjYW1lcmEuJChPQkpFWFQpCi1jYW1lcmFfTERBREQgPSAkKExEQUREKQotY2FtZXJhX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLWNvbG91cm1hcHRlc3RfU09VUkNFUyA9IGNvbG91cm1hcHRlc3QuYwotY29sb3VybWFwdGVzdF9PQkpFQ1RTID0gY29sb3VybWFwdGVzdC4kKE9CSkVYVCkKLWNvbG91cm1hcHRlc3RfTERBREQgPSAkKExEQUREKQotY29sb3VybWFwdGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1leGFtcGxlX1NPVVJDRVMgPSBleGFtcGxlLmMKLWV4YW1wbGVfT0JKRUNUUyA9IGV4YW1wbGUuJChPQkpFWFQpCi1leGFtcGxlX0xEQUREID0gJChMREFERCkKLWV4YW1wbGVfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotZmlsZXRyYW5zZmVyX1NPVVJDRVMgPSBmaWxldHJhbnNmZXIuYwotZmlsZXRyYW5zZmVyX09CSkVDVFMgPSBmaWxldHJhbnNmZXIuJChPQkpFWFQpCi1maWxldHJhbnNmZXJfTERBREQgPSAkKExEQUREKQotZmlsZXRyYW5zZmVyX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLWZvbnRzZWxfU09VUkNFUyA9IGZvbnRzZWwuYwotZm9udHNlbF9PQkpFQ1RTID0gZm9udHNlbC4kKE9CSkVYVCkKLWZvbnRzZWxfTERBREQgPSAkKExEQUREKQotZm9udHNlbF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1tYWNfU09VUkNFUyA9IG1hYy5jCi1tYWNfT0JKRUNUUyA9IG1hYy4kKE9CSkVYVCkKLW1hY19MREFERCA9ICQoTERBREQpCi1tYWNfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotbWFjX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKG1hY19MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1wbm1zaG93X1NPVVJDRVMgPSBwbm1zaG93LmMKLXBubXNob3dfT0JKRUNUUyA9IHBubXNob3cuJChPQkpFWFQpCi1wbm1zaG93X0xEQUREID0gJChMREFERCkKLXBubXNob3dfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotcG5tc2hvdzI0X1NPVVJDRVMgPSBwbm1zaG93MjQuYwotcG5tc2hvdzI0X09CSkVDVFMgPSBwbm1zaG93MjQuJChPQkpFWFQpCi1wbm1zaG93MjRfTERBREQgPSAkKExEQUREKQotcG5tc2hvdzI0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLXJlZ2lvbnRlc3RfU09VUkNFUyA9IHJlZ2lvbnRlc3QuYwotcmVnaW9udGVzdF9PQkpFQ1RTID0gcmVnaW9udGVzdC4kKE9CSkVYVCkKLXJlZ2lvbnRlc3RfTERBREQgPSAkKExEQUREKQotcmVnaW9udGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1yb3RhdGVfU09VUkNFUyA9IHJvdGF0ZS5jCi1yb3RhdGVfT0JKRUNUUyA9IHJvdGF0ZS4kKE9CSkVYVCkKLXJvdGF0ZV9MREFERCA9ICQoTERBREQpCi1yb3RhdGVfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotc2ltcGxlX1NPVVJDRVMgPSBzaW1wbGUuYwotc2ltcGxlX09CSkVDVFMgPSBzaW1wbGUuJChPQkpFWFQpCi1zaW1wbGVfTERBREQgPSAkKExEQUREKQotc2ltcGxlX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLXNpbXBsZTE1X1NPVVJDRVMgPSBzaW1wbGUxNS5jCi1zaW1wbGUxNV9PQkpFQ1RTID0gc2ltcGxlMTUuJChPQkpFWFQpCi1zaW1wbGUxNV9MREFERCA9ICQoTERBREQpCi1zaW1wbGUxNV9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1zdG9yZXBhc3N3ZF9TT1VSQ0VTID0gc3RvcmVwYXNzd2QuYwotc3RvcmVwYXNzd2RfT0JKRUNUUyA9IHN0b3JlcGFzc3dkLiQoT0JKRVhUKQotc3RvcmVwYXNzd2RfTERBREQgPSAkKExEQUREKQotc3RvcmVwYXNzd2RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotdm5jZXZfU09VUkNFUyA9IHZuY2V2LmMKLXZuY2V2X09CSkVDVFMgPSB2bmNldi4kKE9CSkVYVCkKLXZuY2V2X0xEQUREID0gJChMREFERCkKLXZuY2V2X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLXppcHB5X1NPVVJDRVMgPSB6aXBweS5jCi16aXBweV9PQkpFQ1RTID0gemlwcHkuJChPQkpFWFQpCi16aXBweV9MREFERCA9ICQoTERBREQpCi16aXBweV9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJCh0b3BfYnVpbGRkaXIpCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotYW1fX212ID0gbXYgLWYKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKLQkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1BTV9WX0NDID0gJChhbV9fdl9DQ18kKFYpKQotYW1fX3ZfQ0NfID0gJChhbV9fdl9DQ18kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0NDXzAgPSBAZWNobyAiICBDQyAgICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfJChWKSkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9hdF8wID0gQAotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1BTV9WX0NDTEQgPSAkKGFtX192X0NDTERfJChWKSkKLWFtX192X0NDTERfID0gJChhbV9fdl9DQ0xEXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgIiAkQDsKLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fJChWKSkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLVNPVVJDRVMgPSBiYWNrY2hhbm5lbC5jIGJsb29wdGVzdC5jIGNhbWVyYS5jIGNvbG91cm1hcHRlc3QuYyBleGFtcGxlLmMgXAotCWZpbGV0cmFuc2Zlci5jIGZvbnRzZWwuYyBtYWMuYyBwbm1zaG93LmMgcG5tc2hvdzI0LmMgXAotCXJlZ2lvbnRlc3QuYyByb3RhdGUuYyBzaW1wbGUuYyBzaW1wbGUxNS5jIHN0b3JlcGFzc3dkLmMgXAotCXZuY2V2LmMgemlwcHkuYwotRElTVF9TT1VSQ0VTID0gYmFja2NoYW5uZWwuYyBibG9vcHRlc3QuYyBjYW1lcmEuYyBjb2xvdXJtYXB0ZXN0LmMgXAotCWV4YW1wbGUuYyBmaWxldHJhbnNmZXIuYyBmb250c2VsLmMgbWFjLmMgcG5tc2hvdy5jIHBubXNob3cyNC5jIFwKLQlyZWdpb250ZXN0LmMgcm90YXRlLmMgc2ltcGxlLmMgc2ltcGxlMTUuYyBzdG9yZXBhc3N3ZC5jIFwKLQl2bmNldi5jIHppcHB5LmMKLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLUhFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCi0JJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKLQlkaXN0ZGlyCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNUX1NVQkRJUlMgPSBhbmRyb2lkCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotYW1fX3JlbGF0aXZpemUgPSBcCi0gIGRpcjA9YHB3ZGA7IFwKLSAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCi0gIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCi0gIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCi0gIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAotICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCi0gICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAotICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKLSAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCi0gICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAotICAgICAgZWxzZSBcCi0gICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAotICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCi0gICAgICBmaTsgXAotICAgIGZpOyBcCi0gICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gIGRvbmU7IFwKLSAgcmVsZGlyPSIkJGRpcjIiCi1BQ0xPQ0FMID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGFjbG9jYWwtMS4xMQotQU1UQVIgPSAkJHtUQVItdGFyfQotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSAwCi1BUiA9IC91c3IvYmluL2FyCi1BUyA9IGFzCi1BVVRPQ09ORiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvY29uZgotQVVUT0hFQURFUiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCi1BVVRPTUFLRSA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvbWFrZS0xLjExCi1BVkFISV9DRkxBR1MgPSAKLUFWQUhJX0xJQlMgPSAKLUFXSyA9IG1hd2sKLUNDID0gZ2NjCi1DQ0RFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNGTEFHUyA9IC1nIC1PMiAtV2FsbCAgCi1DUFAgPSBnY2MgLUUKLUNQUEZMQUdTID0gCi1DUllQVF9MSUJTID0gLWxjcnlwdAotQ1hYID0gZysrCi1DWFhDUFAgPSBnKysgLUUKLUNYWERFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNYWEZMQUdTID0gLWcgLU8yCi1DWUdQQVRIX1cgPSBlY2hvCi1ERUZTID0gLURIQVZFX0NPTkZJR19ICi1ERVBESVIgPSAuZGVwcwotRExMVE9PTCA9IGRsbHRvb2wKLUVDSE8gPSBlY2hvCi1FQ0hPX0MgPSAKLUVDSE9fTiA9IC1uCi1FQ0hPX1QgPSAKLUVHUkVQID0gL2Jpbi9ncmVwIC1FCi1FWEVFWFQgPSAKLUY3NyA9IAotRkZMQUdTID0gCi1HTlVUTFNfQ0ZMQUdTID0gCi1HTlVUTFNfTElCUyA9IAotR1JFUCA9IC9iaW4vZ3JlcAotR1RLX0NGTEFHUyA9IAotR1RLX0xJQlMgPSAKLUlOU1RBTEwgPSAvdXNyL2Jpbi9pbnN0YWxsIC1jCi1JTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAotSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jIC1zCi1KUEVHX0xERkxBR1MgPSAKLUxERkxBR1MgPSAKLUxJQkdDUllQVF9DRkxBR1MgPSAKLUxJQkdDUllQVF9DT05GSUcgPSBubwotTElCR0NSWVBUX0xJQlMgPSAKLUxJQk9CSlMgPSAKLUxJQlMgPSAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgIAotTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCi1MTl9TID0gbG4gLXMKLUxUTElCT0JKUyA9IAotTUFLRUlORk8gPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gbWFrZWluZm8KLU1LRElSX1AgPSAvYmluL21rZGlyIC1wCi1PQkpEVU1QID0gb2JqZHVtcAotT0JKRVhUID0gbwotUEFDS0FHRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9CVUdSRVBPUlQgPSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcgotUEFDS0FHRV9OQU1FID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX1NUUklORyA9IExpYlZOQ1NlcnZlciAwLjkuOQotUEFDS0FHRV9UQVJOQU1FID0gbGlidm5jc2VydmVyCi1QQUNLQUdFX1VSTCA9IAotUEFDS0FHRV9WRVJTSU9OID0gMC45LjkKLVBBVEhfU0VQQVJBVE9SID0gOgotUEtHX0NPTkZJRyA9IC91c3IvYmluL3BrZy1jb25maWcKLVBLR19DT05GSUdfTElCRElSID0gCi1QS0dfQ09ORklHX1BBVEggPSAKLVJBTkxJQiA9IHJhbmxpYgotUlBNU09VUkNFRElSID0gTk9ULUZPVU5ECi1TRExfQ0ZMQUdTID0gCi1TRExfTElCUyA9IAotU0VUX01BS0UgPSAKLVNIRUxMID0gL2Jpbi9iYXNoCi1TU0xfTElCUyA9IAotU1RSSVAgPSBzdHJpcAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyA9IAotVkVSU0lPTiA9IDAuOS45Ci1XU09DS0xJQiA9IAotWE1LTUYgPSAKLVhfQ0ZMQUdTID0gCi1YX0VYVFJBX0xJQlMgPSAKLVhfTElCUyA9IAotWF9QUkVfTElCUyA9ICAtbFNNIC1sSUNFCi1hYnNfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2V4YW1wbGVzCi1hYnNfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9leGFtcGxlcwotYWJzX3RvcF9idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFic190b3Bfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWNfY3RfQ0MgPSBnY2MKLWFjX2N0X0NYWCA9IGcrKwotYWNfY3RfRjc3ID0gCi1hbV9faW5jbHVkZSA9IGluY2x1ZGUKLWFtX19sZWFkaW5nX2RvdCA9IC4KLWFtX19xdW90ZSA9IAotYW1fX3RhciA9ICQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiCi1hbV9fdW50YXIgPSAkJHtUQVItdGFyfSB4ZiAtCi1iaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9iaW4KLWJ1aWxkID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1idWlsZF9hbGlhcyA9IAotYnVpbGRfY3B1ID0geDg2XzY0Ci1idWlsZF9vcyA9IGxpbnV4LWdudQotYnVpbGRfdmVuZG9yID0gdW5rbm93bgotYnVpbGRkaXIgPSAuCi1kYXRhZGlyID0gJHtkYXRhcm9vdGRpcn0KLWRhdGFyb290ZGlyID0gJHtwcmVmaXh9L3NoYXJlCi1kb2NkaXIgPSAke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9Ci1kdmlkaXIgPSAke2RvY2Rpcn0KLWV4ZWNfcHJlZml4ID0gJHtwcmVmaXh9Ci1ob3N0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ob3N0X2FsaWFzID0gCi1ob3N0X2NwdSA9IHg4Nl82NAotaG9zdF9vcyA9IGxpbnV4LWdudQotaG9zdF92ZW5kb3IgPSB1bmtub3duCi1odG1sZGlyID0gJHtkb2NkaXJ9Ci1pbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLWluZm9kaXIgPSAke2RhdGFyb290ZGlyfS9pbmZvCi1pbnN0YWxsX3NoID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9pbnN0YWxsLXNoCi1saWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLWxpYmV4ZWNkaXIgPSAke2V4ZWNfcHJlZml4fS9saWJleGVjCi1sb2NhbGVkaXIgPSAke2RhdGFyb290ZGlyfS9sb2NhbGUKLWxvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCi1tYW5kaXIgPSAke2RhdGFyb290ZGlyfS9tYW4KLW1rZGlyX3AgPSAvYmluL21rZGlyIC1wCi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi1wZGZkaXIgPSAke2RvY2Rpcn0KLXByZWZpeCA9IC91c3IvbG9jYWwKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBzLHgseCwKLXBzZGlyID0gJHtkb2NkaXJ9Ci1zYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2Jpbgotc2hhcmVkc3RhdGVkaXIgPSAke3ByZWZpeH0vY29tCi1zcmNkaXIgPSAuCi1zeXNjb25mZGlyID0gJHtwcmVmaXh9L2V0YwotdGFyZ2V0X2FsaWFzID0gCi10b3BfYnVpbGRfcHJlZml4ID0gLi4vCi10b3BfYnVpbGRkaXIgPSAuLgotdG9wX3NyY2RpciA9IC4uCi13aXRoX2ZmbXBlZyA9IAotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikKLUxEQUREID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSAKLSNNQUMgPSBtYWMKLSNtYWNfTERGTEFHUyA9IC1mcmFtZXdvcmsgQXBwbGljYXRpb25TZXJ2aWNlcyAtZnJhbWV3b3JrIENhcmJvbiAtZnJhbWV3b3JrIElPS2l0Ci0jU1VCRElSUyA9IGFuZHJvaWQKLUZJTEVUUkFOU0ZFUiA9IGZpbGV0cmFuc2ZlcgotQkxPT1BURVNUID0gYmxvb3B0ZXN0Ci1ub2luc3RfSEVBREVSUyA9IHJhZG9uLmggcm90YXRldGVtcGxhdGUuYwotYWxsOiBhbGwtcmVjdXJzaXZlCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCi0JICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgZXhhbXBsZXMvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgZXhhbXBsZXMvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci1iYWNrY2hhbm5lbCQoRVhFRVhUKTogJChiYWNrY2hhbm5lbF9PQkpFQ1RTKSAkKGJhY2tjaGFubmVsX0RFUEVOREVOQ0lFUykgJChFWFRSQV9iYWNrY2hhbm5lbF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBiYWNrY2hhbm5lbCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChiYWNrY2hhbm5lbF9PQkpFQ1RTKSAkKGJhY2tjaGFubmVsX0xEQUREKSAkKExJQlMpCi1ibG9vcHRlc3QkKEVYRUVYVCk6ICQoYmxvb3B0ZXN0X09CSkVDVFMpICQoYmxvb3B0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9ibG9vcHRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYmxvb3B0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGJsb29wdGVzdF9PQkpFQ1RTKSAkKGJsb29wdGVzdF9MREFERCkgJChMSUJTKQotY2FtZXJhJChFWEVFWFQpOiAkKGNhbWVyYV9PQkpFQ1RTKSAkKGNhbWVyYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfY2FtZXJhX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGNhbWVyYSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChjYW1lcmFfT0JKRUNUUykgJChjYW1lcmFfTERBREQpICQoTElCUykKLWNvbG91cm1hcHRlc3QkKEVYRUVYVCk6ICQoY29sb3VybWFwdGVzdF9PQkpFQ1RTKSAkKGNvbG91cm1hcHRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2NvbG91cm1hcHRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgY29sb3VybWFwdGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChjb2xvdXJtYXB0ZXN0X09CSkVDVFMpICQoY29sb3VybWFwdGVzdF9MREFERCkgJChMSUJTKQotZXhhbXBsZSQoRVhFRVhUKTogJChleGFtcGxlX09CSkVDVFMpICQoZXhhbXBsZV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfZXhhbXBsZV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBleGFtcGxlJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGV4YW1wbGVfT0JKRUNUUykgJChleGFtcGxlX0xEQUREKSAkKExJQlMpCi1maWxldHJhbnNmZXIkKEVYRUVYVCk6ICQoZmlsZXRyYW5zZmVyX09CSkVDVFMpICQoZmlsZXRyYW5zZmVyX0RFUEVOREVOQ0lFUykgJChFWFRSQV9maWxldHJhbnNmZXJfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgZmlsZXRyYW5zZmVyJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGZpbGV0cmFuc2Zlcl9PQkpFQ1RTKSAkKGZpbGV0cmFuc2Zlcl9MREFERCkgJChMSUJTKQotZm9udHNlbCQoRVhFRVhUKTogJChmb250c2VsX09CSkVDVFMpICQoZm9udHNlbF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfZm9udHNlbF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBmb250c2VsJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGZvbnRzZWxfT0JKRUNUUykgJChmb250c2VsX0xEQUREKSAkKExJQlMpCi1tYWMkKEVYRUVYVCk6ICQobWFjX09CSkVDVFMpICQobWFjX0RFUEVOREVOQ0lFUykgJChFWFRSQV9tYWNfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgbWFjJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChtYWNfTElOSykgJChtYWNfT0JKRUNUUykgJChtYWNfTERBREQpICQoTElCUykKLXBubXNob3ckKEVYRUVYVCk6ICQocG5tc2hvd19PQkpFQ1RTKSAkKHBubXNob3dfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3BubXNob3dfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgcG5tc2hvdyQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChwbm1zaG93X09CSkVDVFMpICQocG5tc2hvd19MREFERCkgJChMSUJTKQotcG5tc2hvdzI0JChFWEVFWFQpOiAkKHBubXNob3cyNF9PQkpFQ1RTKSAkKHBubXNob3cyNF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcG5tc2hvdzI0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHBubXNob3cyNCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChwbm1zaG93MjRfT0JKRUNUUykgJChwbm1zaG93MjRfTERBREQpICQoTElCUykKLXJlZ2lvbnRlc3QkKEVYRUVYVCk6ICQocmVnaW9udGVzdF9PQkpFQ1RTKSAkKHJlZ2lvbnRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3JlZ2lvbnRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgcmVnaW9udGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChyZWdpb250ZXN0X09CSkVDVFMpICQocmVnaW9udGVzdF9MREFERCkgJChMSUJTKQotcm90YXRlJChFWEVFWFQpOiAkKHJvdGF0ZV9PQkpFQ1RTKSAkKHJvdGF0ZV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcm90YXRlX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHJvdGF0ZSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChyb3RhdGVfT0JKRUNUUykgJChyb3RhdGVfTERBREQpICQoTElCUykKLXNpbXBsZSQoRVhFRVhUKTogJChzaW1wbGVfT0JKRUNUUykgJChzaW1wbGVfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3NpbXBsZV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBzaW1wbGUkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoc2ltcGxlX09CSkVDVFMpICQoc2ltcGxlX0xEQUREKSAkKExJQlMpCi1zaW1wbGUxNSQoRVhFRVhUKTogJChzaW1wbGUxNV9PQkpFQ1RTKSAkKHNpbXBsZTE1X0RFUEVOREVOQ0lFUykgJChFWFRSQV9zaW1wbGUxNV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBzaW1wbGUxNSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChzaW1wbGUxNV9PQkpFQ1RTKSAkKHNpbXBsZTE1X0xEQUREKSAkKExJQlMpCi1zdG9yZXBhc3N3ZCQoRVhFRVhUKTogJChzdG9yZXBhc3N3ZF9PQkpFQ1RTKSAkKHN0b3JlcGFzc3dkX0RFUEVOREVOQ0lFUykgJChFWFRSQV9zdG9yZXBhc3N3ZF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBzdG9yZXBhc3N3ZCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChzdG9yZXBhc3N3ZF9PQkpFQ1RTKSAkKHN0b3JlcGFzc3dkX0xEQUREKSAkKExJQlMpCi12bmNldiQoRVhFRVhUKTogJCh2bmNldl9PQkpFQ1RTKSAkKHZuY2V2X0RFUEVOREVOQ0lFUykgJChFWFRSQV92bmNldl9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiB2bmNldiQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh2bmNldl9PQkpFQ1RTKSAkKHZuY2V2X0xEQUREKSAkKExJQlMpCi16aXBweSQoRVhFRVhUKTogJCh6aXBweV9PQkpFQ1RTKSAkKHppcHB5X0RFUEVOREVOQ0lFUykgJChFWFRSQV96aXBweV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiB6aXBweSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh6aXBweV9PQkpFQ1RTKSAkKHppcHB5X0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLWluY2x1ZGUgLi8kKERFUERJUikvYmFja2NoYW5uZWwuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvYmxvb3B0ZXN0LlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2NhbWVyYS5QbwotaW5jbHVkZSAuLyQoREVQRElSKS9jb2xvdXJtYXB0ZXN0LlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2V4YW1wbGUuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvZmlsZXRyYW5zZmVyLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2ZvbnRzZWwuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvbWFjLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL3BubXNob3cuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvcG5tc2hvdzI0LlBvCi1pbmNsdWRlIC4vJChERVBESVIpL3JlZ2lvbnRlc3QuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvcm90YXRlLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL3NpbXBsZS5QbwotaW5jbHVkZSAuLyQoREVQRElSKS9zaW1wbGUxNS5QbwotaW5jbHVkZSAuLyQoREVQRElSKS9zdG9yZXBhc3N3ZC5QbwotaW5jbHVkZSAuLyQoREVQRElSKS92bmNldi5QbwotaW5jbHVkZSAuLyQoREVQRElSKS96aXBweS5QbwotCi0uYy5vOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci0JJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLQkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLSQoUkVDVVJTSVZFX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLWN0YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKLQlkb25lCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PS47IFwKLQllbHNlIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PTsgXAotCWZpOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCi0JICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgJChhbV9fbWFrZV9kcnlydW4pIFwKLQkgICAgICB8fCB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKLQkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAotCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKLQkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKLQkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKLQkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAotCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCi0JCWFtX19za2lwX21vZGVfZml4PTogXAotCSAgICAgICAgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoSEVBREVSUykKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQltb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1yZWN1cnNpdmUKLQotZHZpLWFtOgotCi1odG1sOiBodG1sLXJlY3Vyc2l2ZQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1yZWN1cnNpdmUKLQotcGRmLWFtOgotCi1wczogcHMtcmVjdXJzaXZlCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBjdGFncy1yZWN1cnNpdmUgXAotCWluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQotCi0uUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKLQlhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCi0JY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3RjbGVhbiBcCi0JZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCi0JaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAotCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAotCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAotCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9leGFtcGxlcy9NYWtlZmlsZS5hbSBiL2V4YW1wbGVzL01ha2VmaWxlLmFtCmluZGV4IDI5ZDM3NzQuLjgyOWY3MzUgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL01ha2VmaWxlLmFtCisrKyBiL2V4YW1wbGVzL01ha2VmaWxlLmFtCkBAIC0xLDQgKzEsNCBAQAotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpCiBMREFERCA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgQFdTT0NLTElCQAogCiBpZiBPU1gKQEAgLTIzLDUgKzIzLDUgQEAKIG5vaW5zdF9QUk9HUkFNUz1leGFtcGxlIHBubXNob3cgcmVnaW9udGVzdCBwbm1zaG93MjQgZm9udHNlbCBcCiAJdm5jZXYgc3RvcmVwYXNzd2QgY29sb3VybWFwdGVzdCBzaW1wbGUgc2ltcGxlMTUgJChNQUMpIFwKIAkkKEZJTEVUUkFOU0ZFUikgYmFja2NoYW5uZWwgJChCTE9PUFRFU1QpIGNhbWVyYSByb3RhdGUgXAotCXppcHB5CisJemlwcHkgcmVwZWF0ZXIKIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvTWFrZWZpbGUuaW4gYi9leGFtcGxlcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkYmUwNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLQotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLW5vaW5zdF9QUk9HUkFNUyA9IGV4YW1wbGUkKEVYRUVYVCkgcG5tc2hvdyQoRVhFRVhUKSBcCi0JcmVnaW9udGVzdCQoRVhFRVhUKSBwbm1zaG93MjQkKEVYRUVYVCkgZm9udHNlbCQoRVhFRVhUKSBcCi0Jdm5jZXYkKEVYRUVYVCkgc3RvcmVwYXNzd2QkKEVYRUVYVCkgY29sb3VybWFwdGVzdCQoRVhFRVhUKSBcCi0Jc2ltcGxlJChFWEVFWFQpIHNpbXBsZTE1JChFWEVFWFQpICQoYW1fX0VYRUVYVF8xKSBcCi0JJChhbV9fRVhFRVhUXzIpIGJhY2tjaGFubmVsJChFWEVFWFQpICQoYW1fX0VYRUVYVF8zKSBcCi0JY2FtZXJhJChFWEVFWFQpIHJvdGF0ZSQoRVhFRVhUKSB6aXBweSQoRVhFRVhUKQotc3ViZGlyID0gZXhhbXBsZXMKLURJU1RfQ09NTU9OID0gJChub2luc3RfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotQE9TWF9UUlVFQGFtX19FWEVFWFRfMSA9IG1hYyQoRVhFRVhUKQotQFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUVAYW1fX0VYRUVYVF8yID0gZmlsZXRyYW5zZmVyJChFWEVFWFQpCi1ASEFWRV9MSUJQVEhSRUFEX1RSVUVAYW1fX0VYRUVYVF8zID0gYmxvb3B0ZXN0JChFWEVFWFQpCi1QUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQotYmFja2NoYW5uZWxfU09VUkNFUyA9IGJhY2tjaGFubmVsLmMKLWJhY2tjaGFubmVsX09CSkVDVFMgPSBiYWNrY2hhbm5lbC4kKE9CSkVYVCkKLWJhY2tjaGFubmVsX0xEQUREID0gJChMREFERCkKLWJhY2tjaGFubmVsX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLUFNX1ZfbHQgPSAkKGFtX192X2x0X0BBTV9WQCkKLWFtX192X2x0XyA9ICQoYW1fX3ZfbHRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9sdF8wID0gLS1zaWxlbnQKLWJsb29wdGVzdF9TT1VSQ0VTID0gYmxvb3B0ZXN0LmMKLWJsb29wdGVzdF9PQkpFQ1RTID0gYmxvb3B0ZXN0LiQoT0JKRVhUKQotYmxvb3B0ZXN0X0xEQUREID0gJChMREFERCkKLWJsb29wdGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1jYW1lcmFfU09VUkNFUyA9IGNhbWVyYS5jCi1jYW1lcmFfT0JKRUNUUyA9IGNhbWVyYS4kKE9CSkVYVCkKLWNhbWVyYV9MREFERCA9ICQoTERBREQpCi1jYW1lcmFfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotY29sb3VybWFwdGVzdF9TT1VSQ0VTID0gY29sb3VybWFwdGVzdC5jCi1jb2xvdXJtYXB0ZXN0X09CSkVDVFMgPSBjb2xvdXJtYXB0ZXN0LiQoT0JKRVhUKQotY29sb3VybWFwdGVzdF9MREFERCA9ICQoTERBREQpCi1jb2xvdXJtYXB0ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLWV4YW1wbGVfU09VUkNFUyA9IGV4YW1wbGUuYwotZXhhbXBsZV9PQkpFQ1RTID0gZXhhbXBsZS4kKE9CSkVYVCkKLWV4YW1wbGVfTERBREQgPSAkKExEQUREKQotZXhhbXBsZV9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1maWxldHJhbnNmZXJfU09VUkNFUyA9IGZpbGV0cmFuc2Zlci5jCi1maWxldHJhbnNmZXJfT0JKRUNUUyA9IGZpbGV0cmFuc2Zlci4kKE9CSkVYVCkKLWZpbGV0cmFuc2Zlcl9MREFERCA9ICQoTERBREQpCi1maWxldHJhbnNmZXJfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotZm9udHNlbF9TT1VSQ0VTID0gZm9udHNlbC5jCi1mb250c2VsX09CSkVDVFMgPSBmb250c2VsLiQoT0JKRVhUKQotZm9udHNlbF9MREFERCA9ICQoTERBREQpCi1mb250c2VsX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLW1hY19TT1VSQ0VTID0gbWFjLmMKLW1hY19PQkpFQ1RTID0gbWFjLiQoT0JKRVhUKQotbWFjX0xEQUREID0gJChMREFERCkKLW1hY19ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1tYWNfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQobWFjX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLXBubXNob3dfU09VUkNFUyA9IHBubXNob3cuYwotcG5tc2hvd19PQkpFQ1RTID0gcG5tc2hvdy4kKE9CSkVYVCkKLXBubXNob3dfTERBREQgPSAkKExEQUREKQotcG5tc2hvd19ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1wbm1zaG93MjRfU09VUkNFUyA9IHBubXNob3cyNC5jCi1wbm1zaG93MjRfT0JKRUNUUyA9IHBubXNob3cyNC4kKE9CSkVYVCkKLXBubXNob3cyNF9MREFERCA9ICQoTERBREQpCi1wbm1zaG93MjRfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotcmVnaW9udGVzdF9TT1VSQ0VTID0gcmVnaW9udGVzdC5jCi1yZWdpb250ZXN0X09CSkVDVFMgPSByZWdpb250ZXN0LiQoT0JKRVhUKQotcmVnaW9udGVzdF9MREFERCA9ICQoTERBREQpCi1yZWdpb250ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLXJvdGF0ZV9TT1VSQ0VTID0gcm90YXRlLmMKLXJvdGF0ZV9PQkpFQ1RTID0gcm90YXRlLiQoT0JKRVhUKQotcm90YXRlX0xEQUREID0gJChMREFERCkKLXJvdGF0ZV9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1zaW1wbGVfU09VUkNFUyA9IHNpbXBsZS5jCi1zaW1wbGVfT0JKRUNUUyA9IHNpbXBsZS4kKE9CSkVYVCkKLXNpbXBsZV9MREFERCA9ICQoTERBREQpCi1zaW1wbGVfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotc2ltcGxlMTVfU09VUkNFUyA9IHNpbXBsZTE1LmMKLXNpbXBsZTE1X09CSkVDVFMgPSBzaW1wbGUxNS4kKE9CSkVYVCkKLXNpbXBsZTE1X0xEQUREID0gJChMREFERCkKLXNpbXBsZTE1X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLXN0b3JlcGFzc3dkX1NPVVJDRVMgPSBzdG9yZXBhc3N3ZC5jCi1zdG9yZXBhc3N3ZF9PQkpFQ1RTID0gc3RvcmVwYXNzd2QuJChPQkpFWFQpCi1zdG9yZXBhc3N3ZF9MREFERCA9ICQoTERBREQpCi1zdG9yZXBhc3N3ZF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi12bmNldl9TT1VSQ0VTID0gdm5jZXYuYwotdm5jZXZfT0JKRUNUUyA9IHZuY2V2LiQoT0JKRVhUKQotdm5jZXZfTERBREQgPSAkKExEQUREKQotdm5jZXZfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotemlwcHlfU09VUkNFUyA9IHppcHB5LmMKLXppcHB5X09CSkVDVFMgPSB6aXBweS4kKE9CSkVYVCkKLXppcHB5X0xEQUREID0gJChMREFERCkKLXppcHB5X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotYW1fX212ID0gbXYgLWYKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKLQkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1BTV9WX0NDID0gJChhbV9fdl9DQ19AQU1fVkApCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfYXRfMCA9IEAKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEX0BBTV9WQCkKLWFtX192X0NDTERfID0gJChhbV9fdl9DQ0xEX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgIiAkQDsKLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9IGJhY2tjaGFubmVsLmMgYmxvb3B0ZXN0LmMgY2FtZXJhLmMgY29sb3VybWFwdGVzdC5jIGV4YW1wbGUuYyBcCi0JZmlsZXRyYW5zZmVyLmMgZm9udHNlbC5jIG1hYy5jIHBubXNob3cuYyBwbm1zaG93MjQuYyBcCi0JcmVnaW9udGVzdC5jIHJvdGF0ZS5jIHNpbXBsZS5jIHNpbXBsZTE1LmMgc3RvcmVwYXNzd2QuYyBcCi0Jdm5jZXYuYyB6aXBweS5jCi1ESVNUX1NPVVJDRVMgPSBiYWNrY2hhbm5lbC5jIGJsb29wdGVzdC5jIGNhbWVyYS5jIGNvbG91cm1hcHRlc3QuYyBcCi0JZXhhbXBsZS5jIGZpbGV0cmFuc2Zlci5jIGZvbnRzZWwuYyBtYWMuYyBwbm1zaG93LmMgcG5tc2hvdzI0LmMgXAotCXJlZ2lvbnRlc3QuYyByb3RhdGUuYyBzaW1wbGUuYyBzaW1wbGUxNS5jIHN0b3JlcGFzc3dkLmMgXAotCXZuY2V2LmMgemlwcHkuYwotUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLQlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLQlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAotCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAotCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotSEVBREVSUyA9ICQobm9pbnN0X0hFQURFUlMpCi1SRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAotICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi1BTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKLQkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAotCWRpc3RkaXIKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RfU1VCRElSUyA9IGFuZHJvaWQKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1hbV9fcmVsYXRpdml6ZSA9IFwKLSAgZGlyMD1gcHdkYDsgXAotICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKLSAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKLSAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKLSAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCi0gIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKLSAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCi0gICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAotICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKLSAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCi0gICAgICBlbHNlIFwKLSAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCi0gICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCi0gICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKLSAgICAgICAgZmk7IFwKLSAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKLSAgICAgIGZpOyBcCi0gICAgZmk7IFwKLSAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKLSAgZG9uZTsgXAotICByZWxkaXI9IiQkZGlyMiIKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpCi1MREFERCA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgQFdTT0NLTElCQAotQE9TWF9UUlVFQE1BQyA9IG1hYwotQE9TWF9UUlVFQG1hY19MREZMQUdTID0gLWZyYW1ld29yayBBcHBsaWNhdGlvblNlcnZpY2VzIC1mcmFtZXdvcmsgQ2FyYm9uIC1mcmFtZXdvcmsgSU9LaXQKLUBBTkRST0lEX1RSVUVAU1VCRElSUyA9IGFuZHJvaWQKLUBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFQEZJTEVUUkFOU0ZFUiA9IGZpbGV0cmFuc2ZlcgotQEhBVkVfTElCUFRIUkVBRF9UUlVFQEJMT09QVEVTVCA9IGJsb29wdGVzdAotbm9pbnN0X0hFQURFUlMgPSByYWRvbi5oIHJvdGF0ZXRlbXBsYXRlLmMKLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGV4YW1wbGVzL01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IGV4YW1wbGVzL01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKLQl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAotCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdAotYmFja2NoYW5uZWwkKEVYRUVYVCk6ICQoYmFja2NoYW5uZWxfT0JKRUNUUykgJChiYWNrY2hhbm5lbF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfYmFja2NoYW5uZWxfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYmFja2NoYW5uZWwkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoYmFja2NoYW5uZWxfT0JKRUNUUykgJChiYWNrY2hhbm5lbF9MREFERCkgJChMSUJTKQotYmxvb3B0ZXN0JChFWEVFWFQpOiAkKGJsb29wdGVzdF9PQkpFQ1RTKSAkKGJsb29wdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfYmxvb3B0ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGJsb29wdGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChibG9vcHRlc3RfT0JKRUNUUykgJChibG9vcHRlc3RfTERBREQpICQoTElCUykKLWNhbWVyYSQoRVhFRVhUKTogJChjYW1lcmFfT0JKRUNUUykgJChjYW1lcmFfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2NhbWVyYV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBjYW1lcmEkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoY2FtZXJhX09CSkVDVFMpICQoY2FtZXJhX0xEQUREKSAkKExJQlMpCi1jb2xvdXJtYXB0ZXN0JChFWEVFWFQpOiAkKGNvbG91cm1hcHRlc3RfT0JKRUNUUykgJChjb2xvdXJtYXB0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9jb2xvdXJtYXB0ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGNvbG91cm1hcHRlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoY29sb3VybWFwdGVzdF9PQkpFQ1RTKSAkKGNvbG91cm1hcHRlc3RfTERBREQpICQoTElCUykKLWV4YW1wbGUkKEVYRUVYVCk6ICQoZXhhbXBsZV9PQkpFQ1RTKSAkKGV4YW1wbGVfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2V4YW1wbGVfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgZXhhbXBsZSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChleGFtcGxlX09CSkVDVFMpICQoZXhhbXBsZV9MREFERCkgJChMSUJTKQotZmlsZXRyYW5zZmVyJChFWEVFWFQpOiAkKGZpbGV0cmFuc2Zlcl9PQkpFQ1RTKSAkKGZpbGV0cmFuc2Zlcl9ERVBFTkRFTkNJRVMpICQoRVhUUkFfZmlsZXRyYW5zZmVyX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGZpbGV0cmFuc2ZlciQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChmaWxldHJhbnNmZXJfT0JKRUNUUykgJChmaWxldHJhbnNmZXJfTERBREQpICQoTElCUykKLWZvbnRzZWwkKEVYRUVYVCk6ICQoZm9udHNlbF9PQkpFQ1RTKSAkKGZvbnRzZWxfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2ZvbnRzZWxfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgZm9udHNlbCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChmb250c2VsX09CSkVDVFMpICQoZm9udHNlbF9MREFERCkgJChMSUJTKQotbWFjJChFWEVFWFQpOiAkKG1hY19PQkpFQ1RTKSAkKG1hY19ERVBFTkRFTkNJRVMpICQoRVhUUkFfbWFjX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIG1hYyQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQobWFjX0xJTkspICQobWFjX09CSkVDVFMpICQobWFjX0xEQUREKSAkKExJQlMpCi1wbm1zaG93JChFWEVFWFQpOiAkKHBubXNob3dfT0JKRUNUUykgJChwbm1zaG93X0RFUEVOREVOQ0lFUykgJChFWFRSQV9wbm1zaG93X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHBubXNob3ckKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQocG5tc2hvd19PQkpFQ1RTKSAkKHBubXNob3dfTERBREQpICQoTElCUykKLXBubXNob3cyNCQoRVhFRVhUKTogJChwbm1zaG93MjRfT0JKRUNUUykgJChwbm1zaG93MjRfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3BubXNob3cyNF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBwbm1zaG93MjQkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQocG5tc2hvdzI0X09CSkVDVFMpICQocG5tc2hvdzI0X0xEQUREKSAkKExJQlMpCi1yZWdpb250ZXN0JChFWEVFWFQpOiAkKHJlZ2lvbnRlc3RfT0JKRUNUUykgJChyZWdpb250ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9yZWdpb250ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHJlZ2lvbnRlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQocmVnaW9udGVzdF9PQkpFQ1RTKSAkKHJlZ2lvbnRlc3RfTERBREQpICQoTElCUykKLXJvdGF0ZSQoRVhFRVhUKTogJChyb3RhdGVfT0JKRUNUUykgJChyb3RhdGVfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3JvdGF0ZV9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiByb3RhdGUkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQocm90YXRlX09CSkVDVFMpICQocm90YXRlX0xEQUREKSAkKExJQlMpCi1zaW1wbGUkKEVYRUVYVCk6ICQoc2ltcGxlX09CSkVDVFMpICQoc2ltcGxlX0RFUEVOREVOQ0lFUykgJChFWFRSQV9zaW1wbGVfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgc2ltcGxlJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKHNpbXBsZV9PQkpFQ1RTKSAkKHNpbXBsZV9MREFERCkgJChMSUJTKQotc2ltcGxlMTUkKEVYRUVYVCk6ICQoc2ltcGxlMTVfT0JKRUNUUykgJChzaW1wbGUxNV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfc2ltcGxlMTVfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgc2ltcGxlMTUkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoc2ltcGxlMTVfT0JKRUNUUykgJChzaW1wbGUxNV9MREFERCkgJChMSUJTKQotc3RvcmVwYXNzd2QkKEVYRUVYVCk6ICQoc3RvcmVwYXNzd2RfT0JKRUNUUykgJChzdG9yZXBhc3N3ZF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfc3RvcmVwYXNzd2RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgc3RvcmVwYXNzd2QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoc3RvcmVwYXNzd2RfT0JKRUNUUykgJChzdG9yZXBhc3N3ZF9MREFERCkgJChMSUJTKQotdm5jZXYkKEVYRUVYVCk6ICQodm5jZXZfT0JKRUNUUykgJCh2bmNldl9ERVBFTkRFTkNJRVMpICQoRVhUUkFfdm5jZXZfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgdm5jZXYkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQodm5jZXZfT0JKRUNUUykgJCh2bmNldl9MREFERCkgJChMSUJTKQotemlwcHkkKEVYRUVYVCk6ICQoemlwcHlfT0JKRUNUUykgJCh6aXBweV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfemlwcHlfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgemlwcHkkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoemlwcHlfT0JKRUNUUykgJCh6aXBweV9MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYmFja2NoYW5uZWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Jsb29wdGVzdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2FtZXJhLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jb2xvdXJtYXB0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9leGFtcGxlLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9maWxldHJhbnNmZXIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ZvbnRzZWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21hYy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcG5tc2hvdy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcG5tc2hvdzI0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZWdpb250ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yb3RhdGUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NpbXBsZS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2ltcGxlMTUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0b3JlcGFzc3dkLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS92bmNldi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvemlwcHkuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLSQoUkVDVVJTSVZFX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLWN0YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKLQlkb25lCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PS47IFwKLQllbHNlIFwKLQkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAotCSAgZW1wdHlfZml4PTsgXAotCWZpOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCi0JICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgJChhbV9fbWFrZV9kcnlydW4pIFwKLQkgICAgICB8fCB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKLQkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAotCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKLQkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKLQkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKLQkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAotCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCi0JCWFtX19za2lwX21vZGVfZml4PTogXAotCSAgICAgICAgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoSEVBREVSUykKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQltb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1yZWN1cnNpdmUKLQotZHZpLWFtOgotCi1odG1sOiBodG1sLXJlY3Vyc2l2ZQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1yZWN1cnNpdmUKLQotcGRmLWFtOgotCi1wczogcHMtcmVjdXJzaXZlCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBjdGFncy1yZWN1cnNpdmUgXAotCWluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQotCi0uUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKLQlhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCi0JY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3RjbGVhbiBcCi0JZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCi0JaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAotCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAotCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAotCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9leGFtcGxlcy9hbmRyb2lkLy5kZXBzL2Zidm5jc2VydmVyLlBvIGIvZXhhbXBsZXMvYW5kcm9pZC8uZGVwcy9mYnZuY3NlcnZlci5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9hbmRyb2lkLy5kZXBzL2Zidm5jc2VydmVyLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZSBiL2V4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGZmNjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZS4gIEdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLQotCi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvTGliVk5DU2VydmVyCi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0xpYlZOQ1NlcnZlcgotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ub2luc3RfUFJPR1JBTVMgPSBhbmRyb2lkdm5jc2VydmVyJChFWEVFWFQpCi1zdWJkaXIgPSBleGFtcGxlcy9hbmRyb2lkCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLVBST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCi1hbV9hbmRyb2lkdm5jc2VydmVyX09CSkVDVFMgPSBmYnZuY3NlcnZlci4kKE9CSkVYVCkKLWFuZHJvaWR2bmNzZXJ2ZXJfT0JKRUNUUyA9ICQoYW1fYW5kcm9pZHZuY3NlcnZlcl9PQkpFQ1RTKQotYW5kcm9pZHZuY3NlcnZlcl9MREFERCA9ICQoTERBREQpCi1hbmRyb2lkdm5jc2VydmVyX0RFUEVOREVOQ0lFUyA9ICBcCi0JJCh0b3Bfc3JjZGlyKS9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1BTV9WX2x0ID0gJChhbV9fdl9sdF8kKFYpKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotREVGQVVMVF9JTkNMVURFUyA9IC1JLiAtSSQodG9wX2J1aWxkZGlyKQotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLWFtX19tdiA9IG12IC1mCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCi0JJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCi0JJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfJChWKSkKLWFtX192X0NDXyA9ICQoYW1fX3ZfQ0NfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfYXRfMCA9IEAKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEXyQoVikpCi1hbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOXyQoVikpCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1TT1VSQ0VTID0gJChhbmRyb2lkdm5jc2VydmVyX1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGFuZHJvaWR2bmNzZXJ2ZXJfU09VUkNFUykKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotQUNMT0NBTCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhY2xvY2FsLTEuMTEKLUFNVEFSID0gJCR7VEFSLXRhcn0KLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gMAotQVIgPSAvdXNyL2Jpbi9hcgotQVMgPSBhcwotQVVUT0NPTkYgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2NvbmYKLUFVVE9IRUFERVIgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlcgotQVVUT01BS0UgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS4xMQotQVZBSElfQ0ZMQUdTID0gCi1BVkFISV9MSUJTID0gCi1BV0sgPSBtYXdrCi1DQyA9IGdjYwotQ0NERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DRkxBR1MgPSAtZyAtTzIgLVdhbGwgIAotQ1BQID0gZ2NjIC1FCi1DUFBGTEFHUyA9IAotQ1JZUFRfTElCUyA9IC1sY3J5cHQKLUNYWCA9IGcrKwotQ1hYQ1BQID0gZysrIC1FCi1DWFhERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DWFhGTEFHUyA9IC1nIC1PMgotQ1lHUEFUSF9XID0gZWNobwotREVGUyA9IC1ESEFWRV9DT05GSUdfSAotREVQRElSID0gLmRlcHMKLURMTFRPT0wgPSBkbGx0b29sCi1FQ0hPID0gZWNobwotRUNIT19DID0gCi1FQ0hPX04gPSAtbgotRUNIT19UID0gCi1FR1JFUCA9IC9iaW4vZ3JlcCAtRQotRVhFRVhUID0gCi1GNzcgPSAKLUZGTEFHUyA9IAotR05VVExTX0NGTEFHUyA9IAotR05VVExTX0xJQlMgPSAKLUdSRVAgPSAvYmluL2dyZXAKLUdUS19DRkxBR1MgPSAKLUdUS19MSUJTID0gCi1JTlNUQUxMID0gL3Vzci9iaW4vaW5zdGFsbCAtYwotSU5TVEFMTF9EQVRBID0gJHtJTlNUQUxMfSAtbSA2NDQKLUlOU1RBTExfUFJPR1JBTSA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYyAtcwotSlBFR19MREZMQUdTID0gCi1MREZMQUdTID0gCi1MSUJHQ1JZUFRfQ0ZMQUdTID0gCi1MSUJHQ1JZUFRfQ09ORklHID0gbm8KLUxJQkdDUllQVF9MSUJTID0gCi1MSUJPQkpTID0gCi1MSUJTID0gLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAKLUxJQlRPT0wgPSAkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbAotTE5fUyA9IGxuIC1zCi1MVExJQk9CSlMgPSAKLU1BS0VJTkZPID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIG1ha2VpbmZvCi1NS0RJUl9QID0gL2Jpbi9ta2RpciAtcAotT0JKRFVNUCA9IG9iamR1bXAKLU9CSkVYVCA9IG8KLVBBQ0tBR0UgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfQlVHUkVQT1JUID0gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfTkFNRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9TVFJJTkcgPSBMaWJWTkNTZXJ2ZXIgMC45LjkKLVBBQ0tBR0VfVEFSTkFNRSA9IGxpYnZuY3NlcnZlcgotUEFDS0FHRV9VUkwgPSAKLVBBQ0tBR0VfVkVSU0lPTiA9IDAuOS45Ci1QQVRIX1NFUEFSQVRPUiA9IDoKLVBLR19DT05GSUcgPSAvdXNyL2Jpbi9wa2ctY29uZmlnCi1QS0dfQ09ORklHX0xJQkRJUiA9IAotUEtHX0NPTkZJR19QQVRIID0gCi1SQU5MSUIgPSByYW5saWIKLVJQTVNPVVJDRURJUiA9IE5PVC1GT1VORAotU0RMX0NGTEFHUyA9IAotU0RMX0xJQlMgPSAKLVNFVF9NQUtFID0gCi1TSEVMTCA9IC9iaW4vYmFzaAotU1NMX0xJQlMgPSAKLVNUUklQID0gc3RyaXAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gCi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSAKLVZFUlNJT04gPSAwLjkuOQotV1NPQ0tMSUIgPSAKLVhNS01GID0gCi1YX0NGTEFHUyA9IAotWF9FWFRSQV9MSUJTID0gCi1YX0xJQlMgPSAKLVhfUFJFX0xJQlMgPSAgLWxTTSAtbElDRQotYWJzX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9leGFtcGxlcy9hbmRyb2lkCi1hYnNfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9leGFtcGxlcy9hbmRyb2lkCi1hYnNfdG9wX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hY19jdF9DQyA9IGdjYwotYWNfY3RfQ1hYID0gZysrCi1hY19jdF9GNzcgPSAKLWFtX19pbmNsdWRlID0gaW5jbHVkZQotYW1fX2xlYWRpbmdfZG90ID0gLgotYW1fX3F1b3RlID0gCi1hbV9fdGFyID0gJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciIKLWFtX191bnRhciA9ICQke1RBUi10YXJ9IHhmIC0KLWJpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2JpbgotYnVpbGQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX2FsaWFzID0gCi1idWlsZF9jcHUgPSB4ODZfNjQKLWJ1aWxkX29zID0gbGludXgtZ251Ci1idWlsZF92ZW5kb3IgPSB1bmtub3duCi1idWlsZGRpciA9IC4KLWRhdGFkaXIgPSAke2RhdGFyb290ZGlyfQotZGF0YXJvb3RkaXIgPSAke3ByZWZpeH0vc2hhcmUKLWRvY2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0KLWR2aWRpciA9ICR7ZG9jZGlyfQotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWhvc3QgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfYWxpYXMgPSAKLWhvc3RfY3B1ID0geDg2XzY0Ci1ob3N0X29zID0gbGludXgtZ251Ci1ob3N0X3ZlbmRvciA9IHVua25vd24KLWh0bWxkaXIgPSAke2RvY2Rpcn0KLWluY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQotaW5mb2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2luZm8KLWluc3RhbGxfc2ggPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2luc3RhbGwtc2gKLWxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgotbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWxvY2FsZWRpciA9ICR7ZGF0YXJvb3RkaXJ9L2xvY2FsZQotbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKLW1hbmRpciA9ICR7ZGF0YXJvb3RkaXJ9L21hbgotbWtkaXJfcCA9IC9iaW4vbWtkaXIgLXAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLXBkZmRpciA9ICR7ZG9jZGlyfQotcHJlZml4ID0gL3Vzci9sb2NhbAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMseCx4LAotcHNkaXIgPSAke2RvY2Rpcn0KLXNiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCi1zaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KLXNyY2RpciA9IC4KLXN5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCi10YXJnZXRfYWxpYXMgPSAKLXRvcF9idWlsZF9wcmVmaXggPSAuLi8uLi8KLXRvcF9idWlsZGRpciA9IC4uLy4uCi10b3Bfc3JjZGlyID0gLi4vLi4KLXdpdGhfZmZtcGVnID0gCi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKQotTERBREQgPSAkKHRvcF9zcmNkaXIpL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgCi1hbmRyb2lkdm5jc2VydmVyX1NPVVJDRVMgPSBqbmkvZmJ2bmNzZXJ2ZXIuYwotRVhUUkFfRElTVCA9IGpuaS9BbmRyb2lkLm1rCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLWFuZHJvaWR2bmNzZXJ2ZXIkKEVYRUVYVCk6ICQoYW5kcm9pZHZuY3NlcnZlcl9PQkpFQ1RTKSAkKGFuZHJvaWR2bmNzZXJ2ZXJfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2FuZHJvaWR2bmNzZXJ2ZXJfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYW5kcm9pZHZuY3NlcnZlciQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChhbmRyb2lkdm5jc2VydmVyX09CSkVDVFMpICQoYW5kcm9pZHZuY3NlcnZlcl9MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1pbmNsdWRlIC4vJChERVBESVIpL2Zidm5jc2VydmVyLlBvCi0KLS5jLm86Ci0JJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLQkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCi0KLS5jLmxvOgotCSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAotCi1mYnZuY3NlcnZlci5vOiBqbmkvZmJ2bmNzZXJ2ZXIuYwotCSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmJ2bmNzZXJ2ZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvIC1jIC1vIGZidm5jc2VydmVyLm8gYHRlc3QgLWYgJ2puaS9mYnZuY3NlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BqbmkvZmJ2bmNzZXJ2ZXIuYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2Zidm5jc2VydmVyLlRwbyAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nam5pL2Zidm5jc2VydmVyLmMnIG9iamVjdD0nZmJ2bmNzZXJ2ZXIubycgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmJ2bmNzZXJ2ZXIubyBgdGVzdCAtZiAnam5pL2Zidm5jc2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGpuaS9mYnZuY3NlcnZlci5jCi0KLWZidm5jc2VydmVyLm9iajogam5pL2Zidm5jc2VydmVyLmMKLQkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZidm5jc2VydmVyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvIC1jIC1vIGZidm5jc2VydmVyLm9iaiBgaWYgdGVzdCAtZiAnam5pL2Zidm5jc2VydmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnam5pL2Zidm5jc2VydmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2puaS9mYnZuY3NlcnZlci5jJzsgZmlgCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvICQoREVQRElSKS9mYnZuY3NlcnZlci5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSdqbmkvZmJ2bmNzZXJ2ZXIuYycgb2JqZWN0PSdmYnZuY3NlcnZlci5vYmonIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZidm5jc2VydmVyLm9iaiBgaWYgdGVzdCAtZiAnam5pL2Zidm5jc2VydmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnam5pL2Zidm5jc2VydmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2puaS9mYnZuY3NlcnZlci5jJzsgZmlgCi0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAotCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCi0JaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKLQltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCi0JbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZS5hbSBiL2V4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUuYW0KaW5kZXggMjEwNDk2Ny4uOWNiNWMwMiAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZS5hbQorKysgYi9leGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlLmFtCkBAIC0xLDQgKzEsNCBAQAotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpCiBMREFERCA9ICQodG9wX3NyY2RpcikvbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBAV1NPQ0tMSUJACiAKIG5vaW5zdF9QUk9HUkFNUz1hbmRyb2lkdm5jc2VydmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlLmluIGIvZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZWFlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9hbmRyb2lkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLW5vaW5zdF9QUk9HUkFNUyA9IGFuZHJvaWR2bmNzZXJ2ZXIkKEVYRUVYVCkKLXN1YmRpciA9IGV4YW1wbGVzL2FuZHJvaWQKLURJU1RfQ09NTU9OID0gUkVBRE1FICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKLWFtX2FuZHJvaWR2bmNzZXJ2ZXJfT0JKRUNUUyA9IGZidm5jc2VydmVyLiQoT0JKRVhUKQotYW5kcm9pZHZuY3NlcnZlcl9PQkpFQ1RTID0gJChhbV9hbmRyb2lkdm5jc2VydmVyX09CSkVDVFMpCi1hbmRyb2lkdm5jc2VydmVyX0xEQUREID0gJChMREFERCkKLWFuZHJvaWR2bmNzZXJ2ZXJfREVQRU5ERU5DSUVTID0gIFwKLQkkKHRvcF9zcmNkaXIpL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLUFNX1ZfbHQgPSAkKGFtX192X2x0X0BBTV9WQCkKLWFtX192X2x0XyA9ICQoYW1fX3ZfbHRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9sdF8wID0gLS1zaWxlbnQKLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotYW1fX212ID0gbXYgLWYKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKLQkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1BTV9WX0NDID0gJChhbV9fdl9DQ19AQU1fVkApCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfYXRfMCA9IEAKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEX0BBTV9WQCkKLWFtX192X0NDTERfID0gJChhbV9fdl9DQ0xEX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgIiAkQDsKLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9ICQoYW5kcm9pZHZuY3NlcnZlcl9TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChhbmRyb2lkdm5jc2VydmVyX1NPVVJDRVMpCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpCi1MREFERCA9ICQodG9wX3NyY2RpcikvbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBAV1NPQ0tMSUJACi1hbmRyb2lkdm5jc2VydmVyX1NPVVJDRVMgPSBqbmkvZmJ2bmNzZXJ2ZXIuYwotRVhUUkFfRElTVCA9IGpuaS9BbmRyb2lkLm1rCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGV4YW1wbGVzL2FuZHJvaWQvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgZXhhbXBsZXMvYW5kcm9pZC9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLWFuZHJvaWR2bmNzZXJ2ZXIkKEVYRUVYVCk6ICQoYW5kcm9pZHZuY3NlcnZlcl9PQkpFQ1RTKSAkKGFuZHJvaWR2bmNzZXJ2ZXJfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2FuZHJvaWR2bmNzZXJ2ZXJfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYW5kcm9pZHZuY3NlcnZlciQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChhbmRyb2lkdm5jc2VydmVyX09CSkVDVFMpICQoYW5kcm9pZHZuY3NlcnZlcl9MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmJ2bmNzZXJ2ZXIuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotZmJ2bmNzZXJ2ZXIubzogam5pL2Zidm5jc2VydmVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmJ2bmNzZXJ2ZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvIC1jIC1vIGZidm5jc2VydmVyLm8gYHRlc3QgLWYgJ2puaS9mYnZuY3NlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BqbmkvZmJ2bmNzZXJ2ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvICQoREVQRElSKS9mYnZuY3NlcnZlci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2puaS9mYnZuY3NlcnZlci5jJyBvYmplY3Q9J2Zidm5jc2VydmVyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZidm5jc2VydmVyLm8gYHRlc3QgLWYgJ2puaS9mYnZuY3NlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BqbmkvZmJ2bmNzZXJ2ZXIuYwotCi1mYnZuY3NlcnZlci5vYmo6IGpuaS9mYnZuY3NlcnZlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZidm5jc2VydmVyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZmJ2bmNzZXJ2ZXIuVHBvIC1jIC1vIGZidm5jc2VydmVyLm9iaiBgaWYgdGVzdCAtZiAnam5pL2Zidm5jc2VydmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnam5pL2Zidm5jc2VydmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2puaS9mYnZuY3NlcnZlci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9mYnZuY3NlcnZlci5UcG8gJChERVBESVIpL2Zidm5jc2VydmVyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nam5pL2Zidm5jc2VydmVyLmMnIG9iamVjdD0nZmJ2bmNzZXJ2ZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmYnZuY3NlcnZlci5vYmogYGlmIHRlc3QgLWYgJ2puaS9mYnZuY3NlcnZlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2puaS9mYnZuY3NlcnZlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9qbmkvZmJ2bmNzZXJ2ZXIuYyc7IGZpYAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKQotaW5zdGFsbGRpcnM6Ci1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCW1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKLQljbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCi0JZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCi0JaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAotCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAotCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCi0JbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAotCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQotCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4YW1wbGUuYyBiL2V4YW1wbGVzL2V4YW1wbGUuYwppbmRleCBmYzE1NmMwLi42MTdlN2FkIDEwMDY0NAotLS0gYS9leGFtcGxlcy9leGFtcGxlLmMKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS5jCkBAIC02Niw2ICs2Niw3IEBACiBzdGF0aWMgdm9pZCBjbGllbnRnb25lKHJmYkNsaWVudFB0ciBjbCkKIHsKICAgZnJlZShjbC0+Y2xpZW50RGF0YSk7CisgIGNsLT5jbGllbnREYXRhID0gTlVMTDsKIH0KIAogc3RhdGljIGVudW0gcmZiTmV3Q2xpZW50QWN0aW9uIG5ld2NsaWVudChyZmJDbGllbnRQdHIgY2wpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9yZXBlYXRlci5jIGIvZXhhbXBsZXMvcmVwZWF0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAzNTBmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVwZWF0ZXIuYwpAQCAtMCwwICsxLDY4IEBACisvKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNvbm5lY3QgdG8gYW4gVWx0cmFWTkMgcmVwZWF0ZXIuICovCisKKyNpbmNsdWRlIDxyZmIvcmZiLmg+CisKK3N0YXRpYyB2b2lkIGNsaWVudEdvbmUocmZiQ2xpZW50UHRyIGNsKQoreworICByZmJTaHV0ZG93blNlcnZlcihjbC0+c2NyZWVuLCBUUlVFKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsY2hhcioqIGFyZ3YpCit7CisgIGNoYXIgKnJlcGVhdGVySG9zdDsKKyAgaW50IHJlcGVhdGVyUG9ydCwgc29jazsKKyAgY2hhciBpZFsyNTBdOworICByZmJDbGllbnRQdHIgY2w7CisKKyAgaW50IGksajsKKyAgdWludDE2X3QqIGY7CisKKyAgLyogUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAqLworICBpZiAoYXJnYyA8IDMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICJVc2FnZTogJXMgPGlkPiA8cmVwZWF0ZXItaG9zdD4gWzxyZXBlYXRlci1wb3J0Pl1cbiIsIGFyZ3ZbMF0pOworICAgIGV4aXQoMSk7CisgIH0KKyAgc25wcmludGYoaWQsIHNpemVvZihpZCkgLSAxLCAiSUQ6JXMiLCBhcmd2WzFdKTsKKyAgcmVwZWF0ZXJIb3N0ID0gYXJndlsyXTsKKyAgcmVwZWF0ZXJQb3J0ID0gYXJnYyA8IDQgPyA1NTAwIDogYXRvaShhcmd2WzNdKTsKKworICAvKiBUaGUgaW5pdGlhbGl6YXRpb24gaXMgaWRlbnRpY2FsIHRvIHNpbXBsZTE1LmMgKi8KKyAgcmZiU2NyZWVuSW5mb1B0ciBzZXJ2ZXI9cmZiR2V0U2NyZWVuKCZhcmdjLGFyZ3YsNDAwLDMwMCw1LDMsMik7CisgIGlmKCFzZXJ2ZXIpCisgICAgcmV0dXJuIDA7CisgIHNlcnZlci0+ZnJhbWVCdWZmZXI9KGNoYXIqKW1hbGxvYyg0MDAqMzAwKjIpOworICBmPSh1aW50MTZfdCopc2VydmVyLT5mcmFtZUJ1ZmZlcjsKKyAgZm9yKGo9MDtqPDMwMDtqKyspCisgICAgZm9yKGk9MDtpPDQwMDtpKyspCisgICAgICBmW2oqNDAwK2ldPS8qIHJlZCAqLyAoKGoqMzIvMzAwKSA8PCAxMCkgfAorCQkgLyogZ3JlZW4gKi8gKCgoais0MDAtaSkqMzIvNzAwKSA8PCA1KSB8CisJCSAvKiBibHVlICovICgoaSozMi80MDApKTsKKworICAvKiBOb3cgZm9yIHRoZSByZXBlYXRlci1zcGVjaWZpYyBwYXJ0OiAqLworICBzZXJ2ZXItPnBvcnQgPSAtMTsgLyogZG8gbm90IGxpc3RlbiBvbiBhbnkgcG9ydCAqLworICBzZXJ2ZXItPmlwdjZwb3J0ID0gLTE7IC8qIGRvIG5vdCBsaXN0ZW4gb24gYW55IHBvcnQgKi8KKworICBzb2NrID0gcmZiQ29ubmVjdFRvVGNwQWRkcihyZXBlYXRlckhvc3QsIHJlcGVhdGVyUG9ydCk7CisgIGlmIChzb2NrIDwgMCkgeworICAgIHBlcnJvcigiY29ubmVjdCB0byByZXBlYXRlciIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICh3cml0ZShzb2NrLCBpZCwgc2l6ZW9mKGlkKSkgIT0gc2l6ZW9mKGlkKSkgeworICAgIHBlcnJvcigid3JpdGluZyBpZCIpOworICAgIHJldHVybiAxOworICB9CisgIGNsID0gcmZiTmV3Q2xpZW50KHNlcnZlciwgc29jayk7CisgIGlmICghY2wpIHsKKyAgICBwZXJyb3IoIm5ldyBjbGllbnQiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBjbC0+cmV2ZXJzZUNvbm5lY3Rpb24gPSAwOworICBjbC0+Y2xpZW50R29uZUhvb2sgPSBjbGllbnRHb25lOworCisgIC8qIFJ1biB0aGUgc2VydmVyICovCisgIHJmYkluaXRTZXJ2ZXIoc2VydmVyKTsKKyAgcmZiUnVuRXZlbnRMb29wKHNlcnZlciwtMSxGQUxTRSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbnN0YWxsLXNoIGIvaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTkyNDRlYi4uMDAwMDAwMAotLS0gYS9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDExLTAxLTE5LjIxOyAjIFVUQwotCi0jIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKLSMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCi0jIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KLSMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KLSMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKLSMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCi0jIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0jIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0jCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi0jIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KLSMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSMKLSMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKLSMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCi0jIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KLSMgdGl1bS4KLSMKLSMKLSMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guCi0KLW5sPScKLScKLUlGUz0iICIiCSRubCIKLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9JHtET0lUUFJPRy19Ci1pZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KLSAgZG9pdF9leGVjPWV4ZWMKLWVsc2UKLSAgZG9pdF9leGVjPSRkb2l0Ci1maQotCi0jIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOwotIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KLQotY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQotY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQotY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQotY21wcHJvZz0ke0NNUFBST0ctY21wfQotY3Bwcm9nPSR7Q1BQUk9HLWNwfQotbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQotbXZwcm9nPSR7TVZQUk9HLW12fQotcm1wcm9nPSR7Uk1QUk9HLXJtfQotc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQotCi1wb3NpeF9nbG9iPSc/JwotaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKLSAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7Ci0gICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIHBvc2l4X2dsb2I9Ci0gICAgZWxzZQotICAgICAgcG9zaXhfZ2xvYj06Ci0gICAgZmkKLSAgfQotJwotCi1wb3NpeF9ta2Rpcj0KLQotIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCi1tb2RlPTA3NTUKLQotY2hncnBjbWQ9Ci1jaG1vZGNtZD0kY2htb2Rwcm9nCi1jaG93bmNtZD0KLW12Y21kPSRtdnByb2cKLXJtY21kPSIkcm1wcm9nIC1mIgotc3RyaXBjbWQ9Ci0KLXNyYz0KLWRzdD0KLWRpcl9hcmc9Ci1kc3RfYXJnPQotCi1jb3B5X29uX2NoYW5nZT1mYWxzZQotbm9fdGFyZ2V0X2RpcmVjdG9yeT0KLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQotICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQotICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgotICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCi0KLUluIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCi1JbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KLUluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KLQotT3B0aW9uczoKLSAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KLSAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KLQotICAtYyAgICAgICAgICAgIChpZ25vcmVkKQotICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCi0gIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KLSAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KLSAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCi0gIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCi0gIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLSAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCi0gIFJNUFJPRyBTVFJJUFBST0cKLSIKLQotd2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSA7OwotCi0gICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OwotCi0gICAgLWQpIGRpcl9hcmc9dHJ1ZTs7Ci0KLSAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0Jc2hpZnQ7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKLQotICAgIC1tKSBtb2RlPSQyCi0JY2FzZSAkbW9kZSBpbgotCSAgKicgJyogfCAqJwknKiB8IConCi0nKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQotCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCi0JICAgIGV4aXQgMTs7Ci0JZXNhYwotCXNoaWZ0OzsKLQotICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQlzaGlmdDs7Ci0KLSAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7Ci0KLSAgICAtdCkgZHN0X2FyZz0kMgotCSMgUHJvdGVjdCBuYW1lcyBwcm9ibGVtYXRpYyBmb3IgYHRlc3QnIGFuZCBvdGhlciB1dGlsaXRpZXMuCi0JY2FzZSAkZHN0X2FyZyBpbgotCSAgLSogfCBbPVwoXCkhXSkgZHN0X2FyZz0uLyRkc3RfYXJnOzsKLQllc2FjCi0Jc2hpZnQ7OwotCi0gICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7Ci0KLSAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7Ci0KLSAgICAtLSkJc2hpZnQKLQlicmVhazs7Ci0KLSAgICAtKikJZWNobyAiJDA6IGludmFsaWQgb3B0aW9uOiAkMSIgPiYyCi0JZXhpdCAxOzsKLQotICAgICopICBicmVhazs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotaWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgotICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KLSAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KLSAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgotICBmb3IgYXJnCi0gIGRvCi0gICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCi0gICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KLSAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICBmaQotICAgIHNoaWZ0ICMgYXJnCi0gICAgZHN0X2FyZz0kYXJnCi0gICAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciBgdGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KLSAgICBjYXNlICRkc3RfYXJnIGluCi0gICAgICAtKiB8IFs9XChcKSFdKSBkc3RfYXJnPS4vJGRzdF9hcmc7OwotICAgIGVzYWMKLSAgZG9uZQotZmkKLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KLSAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKLSAgICBleGl0IDEKLSAgZmkKLSAgIyBJdCdzIE9LIHRvIGNhbGwgYGluc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCi0gICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCi0gIGV4aXQgMAotZmkKLQotaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCi0gIGRvX2V4aXQ9JyhleGl0ICRyZXQpOyBleGl0ICRyZXQnCi0gIHRyYXAgInJldD0xMjk7ICRkb19leGl0IiAxCi0gIHRyYXAgInJldD0xMzA7ICRkb19leGl0IiAyCi0gIHRyYXAgInJldD0xNDE7ICRkb19leGl0IiAxMwotICB0cmFwICJyZXQ9MTQzOyAkZG9fZXhpdCIgMTUKLQotICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgotICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCi0gIGNhc2UgJG1vZGUgaW4KLSAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KLSAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OwotICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKLQotICAgICpbMC03XSkKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSclIDIwMCcKLSAgICAgIGZpCi0gICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSx1K3J3Ci0gICAgICBmaQotICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKLSAgZXNhYwotZmkKLQotZm9yIHNyYwotZG8KLSAgIyBQcm90ZWN0IG5hbWVzIHByb2JsZW1hdGljIGZvciBgdGVzdCcgYW5kIG90aGVyIHV0aWxpdGllcy4KLSAgY2FzZSAkc3JjIGluCi0gICAgLSogfCBbPVwoXCkhXSkgc3JjPS4vJHNyYzs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICBkc3Q9JHNyYwotICAgIGRzdGRpcj0kZHN0Ci0gICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gIGVsc2UKLQotICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0gICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAotICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgotICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KLSAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgZHN0PSRkc3RfYXJnCi0KLSAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCi0gICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCi0JZWNobyAiJDA6ICRkc3RfYXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZHN0ZGlyPSRkc3QKLSAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCi0gICAgICBkc3RkaXJfc3RhdHVzPTAKLSAgICBlbHNlCi0gICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgotICAgICAgZHN0ZGlyPWAKLQkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8Ci0JZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCi0JICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotCWVjaG8gWCIkZHN0IiB8Ci0JICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSAvXlhcKFwvXC9cKVteL10uKi97Ci0JCSAgIHMvL1wxLwotCQkgICBxCi0JCSB9Ci0JCSAvXlhcKFwvXC9cKSQvewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wpLiovewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgcy8uKi8uLzsgcScKLSAgICAgIGAKLQotICAgICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICAgIGRzdGRpcl9zdGF0dXM9JD8KLSAgICBmaQotICBmaQotCi0gIG9ic29sZXRlX21rZGlyX3VzZWQ9ZmFsc2UKLQotICBpZiB0ZXN0ICRkc3RkaXJfc3RhdHVzICE9IDA7IHRoZW4KLSAgICBjYXNlICRwb3NpeF9ta2RpciBpbgotICAgICAgJycpCi0JIyBDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcnMgdXNpbmcgbW9kZSA3NTUgYXMgbW9kaWZpZWQgYnkgdGhlIHVtYXNrLgotCSMgVGhpcyBpcyBsaWtlIEZyZWVCU0QgJ2luc3RhbGwnIGFzIG9mIDE5OTctMTAtMjguCi0JdW1hc2s9YHVtYXNrYAotCWNhc2UgJHN0cmlwY21kLiR1bWFzayBpbgotCSAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCi0JICAqWzIzNjddWzIzNjddKSBta2Rpcl91bWFzaz0kdW1hc2s7OwotCSAgLiowWzAyXVswMl0gfCAuWzAyXVswMl0gfCAuWzAyXSkgbWtkaXJfdW1hc2s9MjI7OwotCi0JICAqWzAtN10pCi0JICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKLQkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAotCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgotCSAgICBgOzsKLQkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKLQllc2FjCi0KLQkjIFdpdGggLWQsIGNyZWF0ZSB0aGUgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBtb2RlLgotCSMgT3RoZXJ3aXNlLCByZWx5IG9uICRta2Rpcl91bWFzay4KLQlpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLQkgIG1rZGlyX21vZGU9LW0kbW9kZQotCWVsc2UKLQkgIG1rZGlyX21vZGU9Ci0JZmkKLQotCXBvc2l4X21rZGlyPWZhbHNlCi0JY2FzZSAkdW1hc2sgaW4KLQkgICpbMTIzNTY3XVswLTddWzAtN10pCi0JICAgICMgUE9TSVggbWtkaXIgLXAgc2V0cyB1K3d4IGJpdHMgcmVnYXJkbGVzcyBvZiB1bWFzaywgd2hpY2gKLQkgICAgIyBpcyBpbmNvbXBhdGlibGUgd2l0aCBGcmVlQlNEICdpbnN0YWxsJyB3aGVuICh1bWFzayAmIDMwMCkgIT0gMC4KLQkgICAgOzsKLQkgICopCi0JICAgIHRtcGRpcj0ke1RNUERJUi0vdG1wfS9pbnMkUkFORE9NLSQkCi0JICAgIHRyYXAgJ3JldD0kPzsgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiIDI+L2Rldi9udWxsOyBleGl0ICRyZXQnIDAKLQotCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCi0JICAgIHRoZW4KLQkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgewotCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgotCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgotCQkgICAjIG90aGVyLXdyaXRlYWJsZSBiaXQgb2YgcGFyZW50IGRpcmVjdG9yeSB3aGVuIGl0IHNob3VsZG4ndC4KLQkJICAgIyBGcmVlQlNEIDYuMSBta2RpciAtbSAtcCBzZXRzIG1vZGUgb2YgZXhpc3RpbmcgZGlyZWN0b3J5LgotCQkgICBsc19sZF90bXBkaXI9YGxzIC1sZCAiJHRtcGRpciJgCi0JCSAgIGNhc2UgJGxzX2xkX3RtcGRpciBpbgotCQkgICAgIGQ/Pz8/LT9yLSopIGRpZmZlcmVudF9tb2RlPTcwMDs7Ci0JCSAgICAgZD8/Pz8tPy0tKikgZGlmZmVyZW50X21vZGU9NzU1OzsKLQkJICAgICAqKSBmYWxzZTs7Ci0JCSAgIGVzYWMgJiYKLQkJICAgJG1rZGlycHJvZyAtbSRkaWZmZXJlbnRfbW9kZSAtcCAtLSAiJHRtcGRpciIgJiYgewotCQkgICAgIGxzX2xkX3RtcGRpcl8xPWBscyAtbGQgIiR0bXBkaXIiYAotCQkgICAgIHRlc3QgIiRsc19sZF90bXBkaXIiID0gIiRsc19sZF90bXBkaXJfMSIKLQkJICAgfQotCQkgfQotCSAgICAgIHRoZW4gcG9zaXhfbWtkaXI9OgotCSAgICAgIGZpCi0JICAgICAgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIFJlbW92ZSBhbnkgZGlycyBsZWZ0IGJlaGluZCBieSBhbmNpZW50IG1rZGlyIGltcGxlbWVudGF0aW9ucy4KLQkgICAgICBybWRpciAuLyRta2Rpcl9tb2RlIC4vLXAgLi8tLSAyPi9kZXYvbnVsbAotCSAgICBmaQotCSAgICB0cmFwICcnIDA7OwotCWVzYWM7OwotICAgIGVzYWMKLQotICAgIGlmCi0gICAgICAkcG9zaXhfbWtkaXIgJiYgKAotCXVtYXNrICRta2Rpcl91bWFzayAmJgotCSRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIKLSAgICAgICkKLSAgICB0aGVuIDoKLSAgICBlbHNlCi0KLSAgICAgICMgVGhlIHVtYXNrIGlzIHJpZGljdWxvdXMsIG9yIG1rZGlyIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCi0gICAgICAjIG9yIGl0IGZhaWxlZCBwb3NzaWJseSBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gIENyZWF0ZSB0aGUKLSAgICAgICMgZGlyZWN0b3J5IHRoZSBzbG93IHdheSwgc3RlcCBieSBzdGVwLCBjaGVja2luZyBmb3IgcmFjZXMgYXMgd2UgZ28uCi0KLSAgICAgIGNhc2UgJGRzdGRpciBpbgotCS8qKSBwcmVmaXg9Jy8nOzsKLQlbLT1cKFwpIV0qKSBwcmVmaXg9Jy4vJzs7Ci0JKikgIHByZWZpeD0nJzs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiCi0KLSAgICAgIG9JRlM9JElGUwotICAgICAgSUZTPS8KLSAgICAgICRwb3NpeF9nbG9iIHNldCAtZgotICAgICAgc2V0IGZub3JkICRkc3RkaXIKLSAgICAgIHNoaWZ0Ci0gICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YKLSAgICAgIElGUz0kb0lGUwotCi0gICAgICBwcmVmaXhlcz0KLQotICAgICAgZm9yIGQKLSAgICAgIGRvCi0JdGVzdCBYIiRkIiA9IFggJiYgY29udGludWUKLQotCXByZWZpeD0kcHJlZml4JGQKLQlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgotCSAgcHJlZml4ZXM9Ci0JZWxzZQotCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCi0JICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKLQkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCi0JICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCi0JICBlbHNlCi0JICAgIGNhc2UgJHByZWZpeCBpbgotCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKLQkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OwotCSAgICBlc2FjCi0JICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKLQkgIGZpCi0JZmkKLQlwcmVmaXg9JHByZWZpeC8KLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgotCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8Ci0JICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKLQlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgotICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCi0gICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAotICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQotICBlbHNlCi0KLSAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXwotICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXwotCi0gICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KLSAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKLQotICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCi0gICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKLQotICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KLSAgICAjCi0gICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLSAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKLSAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgotICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCi0gICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKLQotICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KLSAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKLSAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgotICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCi0KLSAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgotICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgotICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgotCi0gICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKLSAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQotICAgIHRoZW4KLSAgICAgIHJtIC1mICIkZHN0dG1wIgotICAgIGVsc2UKLSAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKLQotICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQotICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICMgc3VwcG9ydCAtZi4KLSAgICAgIHsKLQkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCi0JIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKLQkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCi0JIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3Ci0JIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KLQl7Ci0JICB0ZXN0ICEgLWYgIiRkc3QiIHx8Ci0JICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8Ci0JICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKLQkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KLQkgIH0gfHwKLQkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgotCSAgICAoZXhpdCAxKTsgZXhpdCAxCi0JICB9Ci0JfSAmJgotCi0JIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCi0gICAgICB9Ci0gICAgZmkgfHwgZXhpdCAxCi0KLSAgICB0cmFwICcnIDAKLSAgZmkKLWRvbmUKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCi0jIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbGlidG9vbCBiL2xpYnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExOTMwMTEuLjAwMDAwMDAKLS0tIGEvbGlidG9vbAorKysgL2Rldi9udWxsCkBAIC0xLDc1MjAgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0KLSMgbGlidG9vbFQgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgIChHTlUgTGliVk5DU2VydmVyIDAuOS45KQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6Ci0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KLVNFRD0iL2Jpbi9zZWQiCi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSIvYmluL3NlZCAtZSAxcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi0jIFRoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KLWF2YWlsYWJsZV90YWdzPSIgQ1hYIgotCi0jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBhbmRyb2lkLWRldjoKLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9Ii9iaW4vYmFzaCIKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPXllcwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz15ZXMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9uZWVkX2xjPW5vCi0KLSMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYwotYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPW5vCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPXllcwotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9Ci1ob3N0PXg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF9vcz1saW51eC1nbnUKLQotIyBUaGUgYnVpbGQgc3lzdGVtLgotYnVpbGRfYWxpYXM9Ci1idWlsZD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX29zPWxpbnV4LWdudQotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89ImVjaG8iCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9ImFyIgotQVJfRkxBR1M9ImNydSIKLQotIyBBIEMgY29tcGlsZXIuCi1MVENDPSJnY2MiCi0KLSMgTFRDQyBjb21waWxlciBmbGFncy4KLUxUQ0ZMQUdTPSItZyAtTzIgLVdhbGwiCi0KLSMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KLUNDPSJnY2MiCi0KLSMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KLXdpdGhfZ2NjPXllcwotCi0jIEFuIEVSRSBtYXRjaGVyLgotRUdSRVA9Ii9iaW4vZ3JlcCAtRSIKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9Ii91c3IvYmluL2xkIC1tIGVsZl94ODZfNjQiCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9ImxuIC1zIgotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSIvdXNyL2Jpbi9ubSAtQiIKLQotIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQotU1RSSVA9InN0cmlwIgotCi0jIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCi1NQUdJQ19DTUQ9ZmlsZQotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9ImRsbHRvb2wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSJvYmpkdW1wIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iYXMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPS5saWJzCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSIgLXIiCi1yZWxvYWRfY21kcz0iXCRMRFwkcmVsb2FkX2ZsYWcgLW8gXCRvdXRwdXRcJHJlbG9hZF9vYmpzIgotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0iLVdsLCIKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9Im8iCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSJhIgotCi0jIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgotc2hyZXh0X2NtZHM9Jy5zbycKLQotIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCi1leGVleHQ9IiIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0iIC1mUElDIC1EUElDIgotcGljX21vZGU9ZGVmYXVsdAotCi0jIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KLW1heF9jbWRfbGVuPTMyNzY4Ci0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPwotY29tcGlsZXJfY19vPSJ5ZXMiCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/Ci1uZWVkX2xvY2tzPSJubyIKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PW5vCi0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj1ubwotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zdXBwb3J0PXVua25vd24KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj11bmtub3duCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0iLXN0YXRpYyIKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSIgLWZuby1idWlsdGluIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ilwke3dsfS0tZXhwb3J0LWR5bmFtaWMiCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ilwke3dsfS0td2hvbGUtYXJjaGl2ZVwkY29udmVuaWVuY2UgXCR7d2x9LS1uby13aG9sZS1hcmNoaXZlIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0iIgotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPWxpbnV4Ci0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9ImxpYlwkbmFtZSIKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSJcJHtsaWJuYW1lfVwke3JlbGVhc2V9XCR7c2hhcmVkX2V4dH1cJHZlcnN1ZmZpeCBcJHtsaWJuYW1lfVwke3JlbGVhc2V9XCR7c2hhcmVkX2V4dH1cJG1ham9yIFwkbGlibmFtZVwke3NoYXJlZF9leHR9IgotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9Ilwke2xpYm5hbWV9XCR7cmVsZWFzZX1cJHtzaGFyZWRfZXh0fVwkbWFqb3IiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0icmFubGliIgotb2xkX2FyY2hpdmVfY21kcz0iXCRBUiBcJEFSX0ZMQUdTIFwkb2xkbGliXCRvbGRvYmpzXCRvbGRfZGVwbGlic35cJFJBTkxJQiBcJG9sZGxpYiIKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSJjaG1vZCA2NDQgXCRvbGRsaWJ+XCRSQU5MSUIgXCRvbGRsaWIiCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSIiCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9IiIKLQotIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0iIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0iXCRDQyAtc2hhcmVkIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyBcJHt3bH0tc29uYW1lIFwkd2xcJHNvbmFtZSAtbyBcJGxpYiIKLWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkZWNobyBcXFwieyBnbG9iYWw6XFxcIiA+IFwkb3V0cHV0X29iamRpci9cJGxpYm5hbWUudmVyfgotICBjYXQgXCRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSBcXFwicy9cXFxcKC4qXFxcXCkvXFxcXDE7L1xcXCIgPj4gXCRvdXRwdXRfb2JqZGlyL1wkbGlibmFtZS52ZXJ+Ci0gIFwkZWNobyBcXFwibG9jYWw6ICo7IH07XFxcIiA+PiBcJG91dHB1dF9vYmpkaXIvXCRsaWJuYW1lLnZlcn4KLQkgIFwkQ0MgLXNoYXJlZCBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgXCR7d2x9LXNvbmFtZSBcJHdsXCRzb25hbWUgXCR7d2x9LXZlcnNpb24tc2NyaXB0IFwke3dsfVwkb3V0cHV0X29iamRpci9cJGxpYm5hbWUudmVyIC1vIFwkbGliIgotcG9zdGluc3RhbGxfY21kcz0iIgotcG9zdHVuaW5zdGFsbF9jbWRzPSIiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9IiIKLW1vZHVsZV9leHBzeW1fY21kcz0iIgotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0ic3RyaXAgLS1zdHJpcC1kZWJ1ZyIKLXN0cmlwbGliPSJzdHJpcCAtLXN0cmlwLXVubmVlZGVkIgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9IiIKLQotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcG9zdGRlcF9vYmplY3RzPSIiCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSIiCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSIiCi0KLSMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKLSMgYSBzaGFyZWQgbGlicmFyeS4KLWNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0iIgotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9InBhc3NfYWxsIgotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSJcJE1BR0lDX0NNRCIKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSIiCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSIiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9IlBBVEg9XFxcIlxcXCRQQVRIOi9zYmluXFxcIiBsZGNvbmZpZyAtbiBcJGxpYmRpciIKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9IiIKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVxcKFtBQkNER0lSU1RXXVtBQkNER0lSU1RXXSpcXClbIAldWyAJXSpcXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXFwpXCQvXFwxIFxcMiBcXDIvcCciCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFxcKC4qXFwpXCQvZXh0ZXJuIGludCBcXDE7L3AnIgotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgotZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFxcKFteIF0qXFwpIFwkLyAge1xcXCJcXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXltCQ0RFR1JTVF0gXFwoW14gXSpcXCkgXFwoW14gXSpcXClcJC8gIHtcIlxcMlwiLCAobHRfcHRyKSBcXCZcXDJ9LC9wJyIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotCi0jIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCi1oYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0KLSMgRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ilwke3dsfS0tcnBhdGggXCR7d2x9XCRsaWJkaXIiCi0KLSMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvCi0jIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcwotIyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSIiCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIiCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9bm8KLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9bm8KLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLQotIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKLSMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCi1oYXJkY29kZV9hdXRvbWF0aWM9bm8KLQotIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCi12YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCBMRF9MSUJSQVJZX1BBVEggTERfUlVOX1BBVEggR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotCi0jIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KLWxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIgL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43LyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS9saWIveDg2XzY0LWxpbnV4LWdudS80LjcvIC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi8uLi94ODZfNjQtbGludXgtZ251L2xpYi94ODZfNjQtbGludXgtZ251LyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS9saWIvLi4vbGliLyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS80LjcvIC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi94ODZfNjQtbGludXgtZ251LyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4vbGliLyAvbGliL3g4Nl82NC1saW51eC1nbnUvNC43LyAvbGliL3g4Nl82NC1saW51eC1nbnUvIC9saWIvLi4vbGliLyAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LzQuNy8gL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS8gL3Vzci9saWIvLi4vbGliLyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS9saWIvIC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi8gL2xpYi8gL3Vzci9saWIvIgotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvbGliL3g4Nl82NC1saW51eC1nbnUgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSAvbGliMzIgL3Vzci9saWIzMiAiCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSAkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLQotIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgotZXhwb3J0X3N5bWJvbHNfY21kcz0iXCROTSBcJGxpYm9ianMgXCRjb252ZW5pZW5jZSB8IFwkZ2xvYmFsX3N5bWJvbF9waXBlIHwgXCRTRUQgJ3MvLiogLy8nIHwgc29ydCB8IHVuaXEgPiBcJGV4cG9ydF9zeW1ib2xzIgotCi0jIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1leHRyYWN0X2V4cHN5bXNfY21kcz0iIgotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCi1leGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9IiIKLQotIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCi0KLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1iYXNlbmFtZT0icyxeLiovLCxnIgotCi0jIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKLSMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCi0jIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAotIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCi0jIGZ1bmN0aW9uLgotcHJvZ3BhdGg9IiQwIgotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKLXByb2duYW1lPWBlY2hvICIkcHJvZ3BhdGgiIHwgJFNFRCAkYmFzZW5hbWVgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1FWElUX1NVQ0NFU1M9MAotRVhJVF9GQUlMVVJFPTEKLQotUFJPR1JBTT1sdG1haW4uc2gKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjUuMjIKLVRJTUVTVEFNUD0iICgxLjEyMjAuMi4zNjUgMjAwNS8xMi8xOCAyMjoxNDowNikiCi0KLSMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKLSMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWZpCi0KLSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgotICBleGVjICRTSEVMTCAiJHByb2dwYXRoIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0ICRFWElUX1NVQ0NFU1MKLWZpCi0KLWRlZmF1bHRfbW9kZT0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1rZGlyPSJta2RpciIKLW12PSJtdiAtZiIKLXJtPSJybSAtZiIKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQotY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgotIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCi0gICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgotICBTUDJOTD0ndHIgXDA0MCBcMDEyJwotICBOTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCi0gIDs7Ci0gKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCi0gIFNQMk5MPSd0ciBcMTAwIFxuJwotICBOTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKLSAgOzsKLWVzYWMKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKLWx0X25sPScKLScKLUlGUz0iIAkkbHRfbmwiCi0KLWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgotICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gICRlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLWR1cGxpY2F0ZV9kZXBzPW5vCi1wcmVzZXJ2ZV9hcmdzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zOgotIyBUaGlzIHNlZW1zIHRvIGJlIHRoZSBiZXN0IHBsYWNlIGZvciB0aGVtCi0KLSMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KLSMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKLSMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKLSMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgotZnVuY19ta3RlbXBkaXIgKCkKLXsKLSAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCi0KLSAgICBpZiB0ZXN0ICIkcnVuIiA9ICI6IjsgdGhlbgotICAgICAgIyBSZXR1cm4gYSBkaXJlY3RvcnkgbmFtZSwgYnV0IGRvbid0IGNyZWF0ZSBpdCBpbiBkcnktcnVuIG1vZGUKLSAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJCQiCi0gICAgZWxzZQotCi0gICAgICAjIElmIG1rdGVtcCB3b3JrcywgdXNlIHRoYXQgZmlyc3QgYW5kIGZvcmVtb3N0Ci0gICAgICBteV90bXBkaXI9YG1rdGVtcCAtZCAiJHtteV90ZW1wbGF0ZX0tWFhYWFhYWFgiIDI+L2Rldi9udWxsYAotCi0gICAgICBpZiB0ZXN0ICEgLWQgIiRteV90bXBkaXIiOyB0aGVuCi0JIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCi0JbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgotCi0Jc2F2ZV9ta3RlbXBkaXJfdW1hc2s9YHVtYXNrYAotCXVtYXNrIDAwNzcKLQkkbWtkaXIgIiRteV90bXBkaXIiCi0JdW1hc2sgJHNhdmVfbWt0ZW1wZGlyX3VtYXNrCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlJ3JlIG5vdCBpbiBkcnktcnVuIG1vZGUsIGJvbWIgb3V0IG9uIGZhaWx1cmUKLSAgICAgIHRlc3QgLWQgIiRteV90bXBkaXIiIHx8IHsKLSAgICAgICAgJGVjaG8gImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICB9Ci0gICAgZmkKLQotICAgICRlY2hvICJYJG15X3RtcGRpciIgfCAkWHNlZAotfQotCi0KLSMgZnVuY193aW4zMl9saWJpZCBhcmcKLSMgcmV0dXJuIHRoZSBsaWJyYXJ5IHR5cGUgb2YgZmlsZSAnYXJnJwotIwotIyBOZWVkIGEgbG90IG9mIGdvbyB0byBoYW5kbGUgKmJvdGgqIERMTHMgYW5kIGltcG9ydCBsaWJzCi0jIEhhcyB0byBiZSBhIHNoZWxsIGZ1bmN0aW9uIGluIG9yZGVyIHRvICdlYXQnIHRoZSBhcmd1bWVudAotIyB0aGF0IGlzIHN1cHBsaWVkIHdoZW4gJGZpbGVfbWFnaWNfY29tbWFuZCBpcyBjYWxsZWQuCi1mdW5jX3dpbjMyX2xpYmlkICgpCi17Ci0gIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCi0gIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCi0gIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0Ci0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgotICAgIDs7Ci0gICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKLSAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8IFwKLSAgICAgICRFR1JFUCAtZSAnZmlsZSBmb3JtYXQgcGUtaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BICQxIHwgXAotCSRTRUQgLW4gLWUgJzEsMTAwey8gSSAve3MsLiosaW1wb3J0LDtwO3E7fTt9J2AKLSAgICAgIGNhc2UgJHdpbjMyX25tcmVzIGluCi0gICAgICBpbXBvcnQqKSAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0Ijs7Ci0gICAgICAqKSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgc3RhdGljIjs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICAqRExMKikKLSAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgIDs7Ci0gICpleGVjdXRhYmxlKikgIyBidXQgc2hlbGwgc2NyaXB0cyBhcmUgImV4ZWN1dGFibGUiIHRvby4uLgotICAgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgICAqTVNcIFdpbmRvd3NcIFBFXCBJbnRlbCopCi0gICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICAkZWNobyAkd2luMzJfbGliaWRfdHlwZQotfQotCi0KLSMgZnVuY19pbmZlcl90YWcgYXJnCi0jIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKLSMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCi0jIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCi0jIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KLSMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCi1mdW5jX2luZmVyX3RhZyAoKQotewotICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBDQ19xdW90ZWQ9Ci0gICAgICBmb3IgYXJnIGluICRDQzsgZG8KLQljYXNlICRhcmcgaW4KLQkgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgotICAgICAgZG9uZQotICAgICAgY2FzZSAkQCBpbgotICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKLSAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgotICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopIDs7Ci0gICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAotICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgotICAgICAgKikKLQlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCi0JICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KLQkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKLQkgICAgQ0NfcXVvdGVkPQotCSAgICBmb3IgYXJnIGluICRDQzsgZG8KLQkgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotCSAgICBjYXNlICRhcmcgaW4KLQkgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgICBhcmc9IlwiJGFyZ1wiIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCi0JICBkb25lCi0JICAgIGNhc2UgIiRAICIgaW4KLQkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikKLQkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcwotCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCi0JICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KLQkgICAgICB0YWduYW1lPSR6Ci0JICAgICAgYnJlYWsKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCWRvbmUKLQkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgotCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKLQkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KLQlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQkgICRlY2hvICIkbW9kZW5hbWU6IHNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHVzaW5nICR0YWduYW1lIHRhZ2dlZCBjb25maWd1cmF0aW9uIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotfQotCi0KLSMgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgZGlyIG9sZGxpYgotZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgKCkKLXsKLSAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAotICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKLQotICAgICRzaG93ICIoY2QgJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4ICRmX2V4X2FuX2FyX29sZGxpYikiCi0gICAgJHJ1biBldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcJGZfZXhfYW5fYXJfb2xkbGliKSIgfHwgZXhpdCAkPwotICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgIDoKLSAgICBlbHNlCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBFUlJPUjogb2JqZWN0IG5hbWUgY29uZmxpY3RzOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotfQotCi0jIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyBnZW50b3Agb2xkbGliIC4uLgotZnVuY19leHRyYWN0X2FyY2hpdmVzICgpCi17Ci0gICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0Ci0gICAgbXlfb2xkbGlicz0kezErIiRAIn0KLSAgICBteV9vbGRvYmpzPSIiCi0gICAgbXlfeGxpYj0iIgotICAgIG15X3hhYnM9IiIKLSAgICBteV94ZGlyPSIiCi0gICAgbXlfc3RhdHVzPSIiCi0KLSAgICAkc2hvdyAiJHtybX1yICRteV9nZW50b3AiCi0gICAgJHJ1biAke3JtfXIgIiRteV9nZW50b3AiCi0gICAgJHNob3cgIiRta2RpciAkbXlfZ2VudG9wIgotICAgICRydW4gJG1rZGlyICIkbXlfZ2VudG9wIgotICAgIG15X3N0YXR1cz0kPwotICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X2dlbnRvcCI7IHRoZW4KLSAgICAgIGV4aXQgJG15X3N0YXR1cwotICAgIGZpCi0KLSAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KLSAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLSAgICAgIGNhc2UgJG15X3hsaWIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OwotCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OwotICAgICAgZXNhYwotICAgICAgbXlfeGxpYj1gJGVjaG8gIlgkbXlfeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgbXlfeGRpcj0iJG15X2dlbnRvcC8kbXlfeGxpYiIKLQotICAgICAgJHNob3cgIiR7cm19ciAkbXlfeGRpciIKLSAgICAgICRydW4gJHtybX1yICIkbXlfeGRpciIKLSAgICAgICRzaG93ICIkbWtkaXIgJG15X3hkaXIiCi0gICAgICAkcnVuICRta2RpciAiJG15X3hkaXIiCi0gICAgICBleGl0X3N0YXR1cz0kPwotICAgICAgaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRteV94ZGlyIjsgdGhlbgotCWV4aXQgJGV4aXRfc3RhdHVzCi0gICAgICBmaQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi1kYXJ3aW4qKQotCSRzaG93ICJFeHRyYWN0aW5nICRteV94YWJzIgotCSMgRG8gbm90IGJvdGhlciBkb2luZyBhbnl0aGluZyBpZiBqdXN0IGEgZHJ5IHJ1bgotCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICBkYXJ3aW5fb3JpZ19kaXI9YHB3ZGAKLQkgIGNkICRteV94ZGlyIHx8IGV4aXQgJD8KLQkgIGRhcndpbl9hcmNoaXZlPSRteV94YWJzCi0JICBkYXJ3aW5fY3VyZGlyPWBwd2RgCi0JICBkYXJ3aW5fYmFzZV9hcmNoaXZlPWAkZWNobyAiWCRkYXJ3aW5fYXJjaGl2ZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGFyd2luX2FyY2hlcz1gbGlwbyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRFR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsYAotCSAgaWYgdGVzdCAtbiAiJGRhcndpbl9hcmNoZXMiOyB0aGVuIAotCSAgICBkYXJ3aW5fYXJjaGVzPWBlY2hvICIkZGFyd2luX2FyY2hlcyIgfCAkU0VEIC1lICdzLy4qYXJlOi8vJ2AKLQkgICAgZGFyd2luX2FyY2g9Ci0JICAgICRzaG93ICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKLQkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCi0JICAgICAgbWtkaXIgLXAgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgbGlwbyAtdGhpbiAkZGFyd2luX2FyY2ggLW91dHB1dCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IiAiJHtkYXJ3aW5fYXJjaGl2ZX0iCi0JICAgICAgY2QgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgImBwd2RgIiAiJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgICBjZCAiJGRhcndpbl9jdXJkaXIiCi0JICAgICAgJHJtICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCi0JICAgIGRvbmUgIyAkZGFyd2luX2FyY2hlcwotICAgICAgIyMgT2theSBub3cgd2UgaGF2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKLQkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50fCB4YXJncyBiYXNlbmFtZSB8IHNvcnQgLXUgfCAkTkwyU1BgCi0JICAgIGRhcndpbl9maWxlPQotCSAgICBkYXJ3aW5fZmlsZXM9Ci0JICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbwotCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAotCSAgICAgIGxpcG8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKLQkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKLQkgICAgJHtybX1yIHVuZmF0LSQkCi0JICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgotCSAgZWxzZQotCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKLSAJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotCSAgZmkgIyAkZGFyd2luX2FyY2hlcwotCWZpICMgJHJ1bgotCTs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0gICAgZG9uZQotICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgotfQotIyBFbmQgb2YgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEYXJ3aW4gc3Vja3MKLWV2YWwgc3RkX3NocmV4dD1cIiRzaHJleHRfY21kc1wiCi0KLWRpc2FibGVfbGlicz1ubwotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAiJCMiIC1ndCAwCi1kbwotICBhcmc9IiQxIgotICBzaGlmdAotCi0gIGNhc2UgJGFyZyBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICRwcmV2IGluCi0gICAgZXhlY3V0ZV9kbGZpbGVzKQotICAgICAgZXhlY3V0ZV9kbGZpbGVzPSIkZXhlY3V0ZV9kbGZpbGVzICRhcmciCi0gICAgICA7OwotICAgIHRhZykKLSAgICAgIHRhZ25hbWU9IiRhcmciCi0gICAgICBwcmVzZXJ2ZV9hcmdzPSIke3ByZXNlcnZlX2FyZ3N9PSRhcmciCi0KLSAgICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycwotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgKlshLV9BLVphLXowLTksL10qKQotCSRlY2hvICIkcHJvZ25hbWU6IGludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgQ0MpCi0JIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93LCBpdCdzIHRoZXJlLCBidXQKLQkjIG5vdCBzcGVjaWFsbHkgbWFya2VkLgotCTs7Ci0gICAgICAqKQotCWlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCi0JICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgotCSAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckL3AnIDwgJHByb2dwYXRoYCIKLQllbHNlCi0JICAkZWNobyAiJHByb2duYW1lOiBpZ25vcmluZyB1bmtub3duIHRhZyAkdGFnbmFtZSIgMT4mMgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgJGFyZyBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgICRlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiCi0gICAgJGVjaG8KLSAgICAkZWNobyAiQ29weXJpZ2h0IChDKSAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4iCi0gICAgJGVjaG8gIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PIgotICAgICRlY2hvICJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgJHtTRUR9IC1lICcxLC9eIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJHByb2dwYXRoCi0gICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KLSAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KLSAgICAgICR7U0VEfSAtbiAtZSAiL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvcCIgPCAiJHByb2dwYXRoIgotICAgIGRvbmUKLSAgICBleGl0ICQ/Ci0gICAgOzsKLQotICAtLWRlYnVnKQotICAgICRlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKLSAgICA7OwotCi0gIC0tZHJ5LXJ1biB8IC1uKQotICAgIHJ1bj06Ci0gICAgOzsKLQotICAtLWZlYXR1cmVzKQotICAgICRlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgJGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgICRlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgJGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7Ci0KLSAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OwotICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKLQotICAtLXByZXNlcnZlLWR1cC1kZXBzKSBkdXBsaWNhdGVfZGVwcz0ieWVzIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgotICAgIDs7Ci0KLSAgLS10YWcpCi0gICAgcHJldm9wdD0iLS10YWciCi0gICAgcHJldj10YWcKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKLSAgICA7OwotICAtLXRhZz0qKQotICAgIHNldCB0YWcgIiRvcHRhcmciICR7MSsiJEAifQotICAgIHNoaWZ0Ci0gICAgcHJldj10YWcKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi1maQotCi1jYXNlICRkaXNhYmxlX2xpYnMgaW4KLW5vKSAKLSAgOzsKLXNoYXJlZCkKLSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gIGJ1aWxkX29sZF9saWJzPXllcwotICA7Owotc3RhdGljKQotICBidWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKLSAgOzsKLWVzYWMKLQotIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0Ci0jIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKLSMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KLWV4ZWNfY21kPQotCi1pZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgotCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGluZmVycmluZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gaXMgZGVwcmVjYXRlZC4iIDE+JjIKLSAgICAkZWNobyAiKioqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBMaWJ0b29sIHdpbGwgcmVxdWlyZSAtLW1vZGU9TU9ERSBiZSBzcGVjaWZpZWQuIiAxPiYyCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgKmNjIHwgY2MqIHwgKisrIHwgZ2NjKiB8ICotZ2NjKiB8IGcrKyogfCB4bGMqKQotICAgICAgbW9kZT1saW5rCi0gICAgICBmb3IgYXJnCi0gICAgICBkbwotCWNhc2UgJGFyZyBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICRtb2RlIGluCi0gICMgbGlidG9vbCBjb21waWxlIG1vZGUKLSAgY29tcGlsZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKLSAgICBzdXBwcmVzc19vcHQ9eWVzCi0gICAgc3VwcHJlc3Nfb3V0cHV0PQotICAgIGFyZ19tb2RlPW5vcm1hbAotICAgIGxpYm9iaj0KLSAgICBsYXRlcj0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICAgIGFyZyAgKQotCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKLQlsYXN0YXJnPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCTs7Ci0KLSAgICAgIHRhcmdldCApCi0JbGlib2JqPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgbm9ybWFsICkKLQkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0JY2FzZSAkYXJnIGluCi0JLW8pCi0JICBpZiB0ZXN0IC1uICIkbGlib2JqIiA7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGFyZ19tb2RlPXRhcmdldAotCSAgY29udGludWUKLQkgIDs7Ci0KLQktc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCi0JICBsYXRlcj0iJGxhdGVyICRhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1uby1zdXBwcmVzcykKLQkgIHN1cHByZXNzX29wdD1ubwotCSAgY29udGludWUKLQkgIDs7Ci0KLQktWGNvbXBpbGVyKQotCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAotCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKLQkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCi0KLQktV2MsKikKLQkgIGFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eLVdjLC8vImAKLQkgIGxhc3Rhcmc9Ci0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLSAJICBmb3IgYXJnIGluICRhcmdzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQotCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0JICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0JICAgIGNhc2UgJGFyZyBpbgotCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICAgIGFyZz0iXCIkYXJnXCIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkYXJnIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCi0JICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KLQkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JKiApCi0JICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0JICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KLQkgICMKLQkgIGxhc3Rhcmc9IiRzcmNmaWxlIgotCSAgc3JjZmlsZT0iJGFyZyIKLQkgIDs7Ci0JZXNhYyAgIyAgY2FzZSAkYXJnCi0JOzsKLSAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLSAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICBjYXNlICRsYXN0YXJnIGluCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotICAgICAgIyBpbiBzY2FuIHNldHMsIGFuZCBzb21lIFN1bk9TIGtzaCBtaXN0cmVhdCBiYWNrc2xhc2gtZXNjYXBpbmcKLSAgICAgICMgaW4gc2NhbiBzZXRzICh3b3JrZWQgYXJvdW5kIHdpdGggdmFyaWFibGUgZXhwYW5zaW9uKSwKLSAgICAgICMgYW5kIGZ1cnRoZXJtb3JlIGNhbm5vdCBoYW5kbGUgJ3wnICcmJyAnKCcgJyknIGluIHNjYW4gc2V0cyAKLSAgICAgICMgYXQgYWxsLCBzbyB3ZSBzcGVjaWZ5IHRoZW0gc2VwYXJhdGVseS4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0gICAgZG9uZSAjIGZvciBhcmcKLQotICAgIGNhc2UgJGFyZ19tb2RlIGluCi0gICAgYXJnKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgIHRhcmdldCkKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgICopCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBbIC16ICIkbGlib2JqIiBdICYmIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgeGZvcm09J1tjQ0ZTaWZtc29dJwotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmlpKSB4Zm9ybT1paSA7OwotICAgICouY2xhc3MpIHhmb3JtPWNsYXNzIDs7Ci0gICAgKi5jcHApIHhmb3JtPWNwcCA7OwotICAgICouY3h4KSB4Zm9ybT1jeHggOzsKLSAgICAqLmY5MCkgeGZvcm09ZjkwIDs7Ci0gICAgKi5mb3IpIHhmb3JtPWZvciA7OwotICAgICouamF2YSkgeGZvcm09amF2YSA7OwotICAgIGVzYWMKLQotICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKLQotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCi0KLSAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLXN0YXRpYykKLQlidWlsZF9vbGRfbGlicz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1wcmVmZXItcGljKQotCXBpY19tb2RlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1ub24tcGljKQotCXBpY19tb2RlPW5vCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIHFsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAkcWxpYm9iaiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JcWxpYm9iaj0iXCIkcWxpYm9ialwiIiA7OwotICAgIGVzYWMKLSAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkcWxpYm9iaiIgXAotCSYmICRlY2hvICJYJGxpYm9iaiIgfCBncmVwICdbXX4jXip7fTs8Pj8iJyInIicgCSYoKXxgJFtdJyBcCi0JJiYgJGVjaG8gIiRtb2RlbmFtZTogbGlib2JqIG5hbWUgXGAkbGlib2JqJyBtYXkgbm90IGNvbnRhaW4gc2hlbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLiIKLSAgICBvYmpuYW1lPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICB4ZGlyPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2JqIjsgdGhlbgotICAgICAgeGRpcj0KLSAgICBlbHNlCi0gICAgICB4ZGlyPSR4ZGlyLwotICAgIGZpCi0gICAgbG9iaj0ke3hkaXJ9JG9iamRpci8kb2JqbmFtZQotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgotICAgIGVsc2UKLSAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBmaQotCi0gICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLSAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0gICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICBmaQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqPQotICAgICAgbmVlZF9sb2Nrcz1ubwotICAgICAgbG9ja2ZpbGU9Ci0gICAgZmkKLQotICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCi0gICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgotICAgICAgdW50aWwgJHJ1biBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICAgICRlY2hvICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KLSAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKLSAgICBmaQotICAgIHFzcmNmaWxlPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICRxc3JjZmlsZSBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICBxc3JjZmlsZT0iXCIkcXNyY2ZpbGVcIiIgOzsKLSAgICBlc2FjCi0KLSAgICAkcnVuICRybSAiJGxpYm9iaiIgIiR7bGlib2JqfVQiCi0KLSAgICAjIENyZWF0ZSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUgKGFuYWxvZ291cyB0byBhICIubGEiIGZpbGUpLAotICAgICMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCi0gICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4gJHtsaWJvYmp9VCA8PEVPRgotIyAkbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KLUVPRgotCi0gICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCi0gICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKLQotICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGVsc2UKLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJHt4ZGlyfSRvYmpkaXIiCi0JJHJ1biAkbWtkaXIgJHt4ZGlyfSRvYmpkaXIKLQlleGl0X3N0YXR1cz0kPwotCWlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KLQkgIGV4aXQgJGV4aXRfc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgotCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgotICAgICAgZmkKLQotICAgICAgJHJ1biAkcm0gIiRsb2JqIiAiJG91dHB1dF9vYmoiCi0KLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KLQkkZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRsb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBQSUMgb2JqZWN0IHRvIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLXBpY19vYmplY3Q9JyRvYmpkaXIvJG9iam5hbWUnCi0KLUVPRgotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgotICAgICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgTm8gUElDIG9iamVjdCBzbyBpbmRpY2F0ZSBpdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJ0b29sCi0gICAgICAjIG9iamVjdCBmaWxlLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLXBpY19vYmplY3Q9bm9uZQotCi1FT0YKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgotICAgICAgZWxzZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgICRydW4gJHJtICIkb2JqIiAiJG91dHB1dF9vYmoiCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KLQkkZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KLSAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLSMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCi1ub25fcGljX29iamVjdD0nJG9iam5hbWUnCi0KLUVPRgotICAgIGVsc2UKLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KLSAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLSMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCi1ub25fcGljX29iamVjdD1ub25lCi0KLUVPRgotICAgIGZpCi0KLSAgICAkcnVuICRtdiAiJHtsaWJvYmp9VCIgIiR7bGlib2JqfSIKLQotICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rIHwgcmVsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSIkbm9ub3B0IgotICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKLSAgICBjb21waWxlX2NvbW1hbmQ9IiRub25vcHQiCi0gICAgZmluYWxpemVfY29tbWFuZD0iJG5vbm9wdCIKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIG9sZF9kZXBsaWJzPQotICAgIGNvbXBpbGVyX2ZsYWdzPQotICAgIGxpbmtlcl9mbGFncz0KLSAgICBkbGxzZWFyY2hwYXRoPQotICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAotICAgIGluc3RfcHJlZml4X2Rpcj0KLQotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBkbGZpbGVzPQotICAgIGRscHJlZmlsZXM9Ci0gICAgZGxzZWxmPW5vCi0gICAgZXhwb3J0X2R5bmFtaWM9bm8KLSAgICBleHBvcnRfc3ltYm9scz0KLSAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KLSAgICBnZW5lcmF0ZWQ9Ci0gICAgbGlib2Jqcz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgbm9faW5zdGFsbD1ubwotICAgIG9ianM9Ci0gICAgbm9uX3BpY19vYmplY3RzPQotICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQotICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubwotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0gICAgdmluZm9fbnVtYmVyPW5vCi0KLSAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCi0KLSAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCi0JZWxzZQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAotCWZpCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KLSAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCi0KLSAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KLSAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JcWFyZz1cImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYFwiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCTs7Ci0gICAgICAqKSBxYXJnPSRhcmcgOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpYnRvb2xfYXJncz0iJGxpYnRvb2xfYXJncyAkcWFyZyIKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICRwcmV2IGluCi0Jb3V0cHV0KQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHByZXYgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAkYXJnIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JaW5zdF9wcmVmaXgpCi0JICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcHJlY2lvdXNfcmVnZXgpCi0JICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0Jb2JqZWN0bGlzdCkKLQkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCi0JICAgIHNhdmVfYXJnPSRhcmcKLQkgICAgbW9yZWFyZ3M9Ci0JICAgIGZvciBmaWwgaW4gYGNhdCAkc2F2ZV9hcmdgCi0JICAgIGRvCi0jCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKLQkgICAgICBhcmc9JGZpbAotCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCSAgICAgIGlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJcGljX29iamVjdD0KLQkJbm9uX3BpY19vYmplY3Q9Ci0KLQkJIyBSZWFkIHRoZSAubG8gZmlsZQotCQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkJY2FzZSAkYXJnIGluCi0JCSovKiB8ICpcXCopIC4gJGFyZyA7OwotCQkqKSAuIC4vJGFyZyA7OwotCQllc2FjCi0KLQkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKLQkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmIFwKLQkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQlmaQotCi0JCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCXhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQlpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCQkgIHhkaXI9Ci0JCWVsc2UKLQkJICB4ZGlyPSIkeGRpci8iCi0JCWZpCi0KLQkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCi0KLQkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgICBwcmV2PQotCQkgICAgICBjb250aW51ZQotCQkgICAgZWxzZQotCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgotCQkgICAgICBwcmV2PWRscHJlZmlsZXMKLQkJICAgIGZpCi0JCSAgZmkKLQotCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCi0JCSAgICBwcmV2PQotCQkgIGZpCi0KLQkJICAjIEEgUElDIG9iamVjdC4KLQkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkJICBhcmc9IiRwaWNfb2JqZWN0IgotCQlmaQotCi0JCSMgTm9uLVBJQyBvYmplY3QuCi0JCWlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JCSAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JCSAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0Ci0JCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCQkgIGZpCi0JCWVsc2UKLQkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCi0JCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgotCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKLQkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCQlmaQotCSAgICAgIGVsc2UKLQkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQllbHNlCi0JCSAgIyBEcnktcnVuIGNhc2UuCi0KLQkJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCQkgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JCSAgICB4ZGlyPQotCQkgIGVsc2UKLQkJICAgIHhkaXI9IiR4ZGlyLyIKLQkJICBmaQotCi0JCSAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCQkgIG5vbl9waWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCQlmaQotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGluayBpbnB1dCBmaWxlIFxgJHNhdmVfYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgYXJnPSRzYXZlX2FyZwotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoIHwgeHJwYXRoKQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICRhcmcgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KLQkgICAgY2FzZSAiJHJwYXRoICIgaW4KLQkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKikgcnBhdGg9IiRycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBlbHNlCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4Y29tcGlsZXIpCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGxpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR3bCRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHdsJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQl4Y2NsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0Jc2hyZXh0KQotICAJICBzaHJleHRfY21kcz0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlkYXJ3aW5fZnJhbWV3b3JrfGRhcndpbl9mcmFtZXdvcmtfc2tpcCkKLQkgIHRlc3QgIiRwcmV2IiA9ICJkYXJ3aW5fZnJhbWV3b3JrIiAmJiBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JZXhwb3J0X2R5bmFtaWM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZnJhbWV3b3JrfC1hcmNofC1pc3lzcm9vdCkKLQljYXNlICIgJENDICIgaW4KLQkgICoiICR7YXJnfSAkezF9ICIqIHwgKiIgJHthcmd9CSR7MX0gIiopIAotCQlwcmV2PWRhcndpbl9mcmFtZXdvcmtfc2tpcCA7OwotCSAgKikgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCSAgICAgcHJldj1kYXJ3aW5fZnJhbWV3b3JrIDs7Ci0JZXNhYwotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAtaW5zdC1wcmVmaXgtZGlyKQotCXByZXY9aW5zdF9wcmVmaXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKLSAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKLSAgICAgIC1MW0EtWl1bQS1aXSo6KikKLQljYXNlICR3aXRoX2djYy8kaG9zdCBpbgotCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JICA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgYWJzZGlyPSIkZGlyIgotCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGRpciIKLQkgIGZpCi0JICBkaXI9IiRhYnNkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICIkZGVwbGlicyAiIGluCi0JKiIgLUwkZGlyICIqKSA7OwotCSopCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCi0JICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGlyIjs7Ci0JICBlc2FjCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWwqKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICotKi1vczIqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKLQkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQotCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KLQkgY2FzZSAkaG9zdCBpbgotCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCi0JICAgY29udGludWUKLQkgICA7OwotCSBlc2FjCi0JZmkKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKwotICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgotICAgICAgLW1vZGVsKQotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCi0JY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgotICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgotICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKLSAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCi0gICAgICAjIC1tKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQwotICAgICAgIyAtbSosIC10WzQ1XSosIC10eHNjYWxlKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljCi0gICAgICAjIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQwotICAgICAgIyAtcGcgcGFzcyB0aHJvdWdoIHByb2ZpbGluZyBmbGFnIGZvciBHQ0MKLSAgICAgICMgQGZpbGUgR0NDIHJlc3BvbnNlIGZpbGVzCi0gICAgICAtNjR8LW1pcHNbMC05XXwtclswLTldWzAtOV0qfC14YXJjaD0qfC14dGFyZ2V0PSp8K0RBKnwrREQqfC1xKnwtbSp8LXBnfCBcCi0gICAgICAtdFs0NV0qfC10eHNjYWxlKnxAKikKLQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgJGFyZyBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtc2hyZXh0KQotCXByZXY9c2hyZXh0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tZmFzdC1pbnN0YWxsKQotCWZhc3RfaW5zdGFsbD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWluc3RhbGwpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCi0JICAjIGluIG9yZGVyIGZvciB0aGUgbG9hZGVyIHRvIGZpbmQgYW55IGRsbHMgaXQgbmVlZHMuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIiAxPiYyCi0JICBmYXN0X2luc3RhbGw9bm8KLQkgIDs7Ci0JKikgbm9faW5zdGFsbD15ZXMgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tdW5kZWZpbmVkKQotCWFsbG93X3VuZGVmaW5lZD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW9iamVjdGxpc3QpCi0JcHJldj1vYmplY3RsaXN0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4KQotCXByZXY9cHJlY2lvdXNfcmVnZXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1yZWxlYXNlKQotCXByZXY9cmVsZWFzZQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJwYXRoKQotCXByZXY9cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKQotCXByZXY9eHJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUiopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0JY2FzZSAiJHhycGF0aCAiIGluCi0JKiIgJGRpciAiKikgOzsKLQkqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCi0JIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0Ci0JIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cwotCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAotCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdGhyZWFkLXNhZmUpCi0JdGhyZWFkX3NhZmU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1pbmZvKQotCXByZXY9dmluZm8KLQljb250aW51ZQotCTs7Ci0gICAgICAtdmVyc2lvbi1udW1iZXIpCi0JcHJldj12aW5mbwotCXZpbmZvX251bWJlcj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1XYywqKQotCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XYywvLydgCi0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBjYXNlICRmbGFnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBmbGFnPSJcIiRmbGFnXCIiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBhcmc9IiRhcmcgJHdsJGZsYWciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRmbGFnIgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQk7OwotCi0gICAgICAtV2wsKikKLQlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2wsLy8nYAotCWFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgZmxhZyBpbiAkYXJnczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgY2FzZSAkZmxhZyBpbgotCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgZmxhZz0iXCIkZmxhZ1wiIgotCSAgICA7OwotCSAgZXNhYwotCSAgYXJnPSIkYXJnICR3bCRmbGFnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZmxhZyIKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCi0JOzsKLQotICAgICAgLVhjb21waWxlcikKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVhsaW5rZXIpCi0JcHJldj14bGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWENDbGlua2VyKQotCXByZXY9eGNjbGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi4kb2JqZXh0KQotCSMgQSBzdGFuZGFyZCBvYmplY3QuCi0Jb2Jqcz0iJG9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCWlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIHBpY19vYmplY3Q9Ci0JICBub25fcGljX29iamVjdD0KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICRhcmcgaW4KLQkgICovKiB8ICpcXCopIC4gJGFyZyA7OwotCSAgKikgLiAuLyRhcmcgOzsKLQkgIGVzYWMKLQotCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKLQkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAotCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCi0JICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICB4ZGlyPQotIAkgIGVsc2UKLQkgICAgeGRpcj0iJHhkaXIvIgotCSAgZmkKLQotCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKLQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQlkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJcHJldj0KLQkJY29udGludWUKLQkgICAgICBlbHNlCi0JCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JCXByZXY9ZGxwcmVmaWxlcwotCSAgICAgIGZpCi0JICAgIGZpCi0KLQkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKLQkgICAgICBwcmV2PQotCSAgICBmaQotCi0JICAgICMgQSBQSUMgb2JqZWN0LgotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkgICAgYXJnPSIkcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgTm9uLVBJQyBvYmplY3QuCi0JICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCSAgICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkgICAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgotCSAgICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCi0JICAgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKLQkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZWxzZQotCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZWxzZQotCSAgICAjIERyeS1ydW4gY2FzZS4KLQotCSAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgICB4ZGlyPQotCSAgICBlbHNlCi0JICAgICAgeGRpcj0iJHhkaXIvIgotCSAgICBmaQotCi0JICAgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgICAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLiRsaWJleHQpCi0JIyBBbiBhcmNoaXZlLgotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0Jb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGVzYWMgIyBhcmcKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICBmaQotICAgIGRvbmUgIyBhcmd1bWVudCBwYXJzaW5nIGxvb3AKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICBmaQotCi0gICAgb2xkbGlicz0KLSAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5Ci0gICAgb3V0cHV0bmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKLQotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgotICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIHNobGliX3NlYXJjaF9wYXRoPQotICAgIGZpCi0gICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCi0gICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgotCi0gICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLSAgICAgIG91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgZWxzZQotICAgICAgb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICBmaQotICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgotICAgIGlmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCi0gICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLSAgICAgIGV4aXRfc3RhdHVzPSQ/Ci0gICAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCi0JZXhpdCAkZXhpdF9zdGF0dXMKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKLSAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKLSAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKLSAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgotICAgIGVzYWMKLQotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiopCi0gICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcwotICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRkdXBsaWNhdGVfZGVwcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgc3BlY2lhbGRlcGxpYnM9Ci0KLSAgICBsaWJzPQotICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcwotICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQotICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0gICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQljYXNlICIkbGlicyAiIGluCi0JKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgotCi0gICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcwotICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQotICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbwotCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgotCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKLQkgIGVzYWMKLQkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCi0JZG9uZQotICAgICAgZmkKLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgZmkKLQotICAgIGRlcGxpYnM9Ci0gICAgbmV3ZGVwZW5kZW5jeV9saWJzPQotICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLSAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgbGliKQotCXBhc3Nlcz0iY29udiBsaW5rIgotCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbwotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5sYSkgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICBwcm9nKQotCWNvbXBpbGVfZGVwbGlicz0KLQlmaW5hbGl6ZV9kZXBsaWJzPQotCWFsbGRlcGxpYnM9bm8KLQluZXdkbGZpbGVzPQotCW5ld2RscHJlZmlsZXM9Ci0JcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgotCTs7Ci0gICAgKikgIHBhc3Nlcz0iY29udiIKLQk7OwotICAgIGVzYWMKLSAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbwotICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKLQkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCi0JbGlicz0iJGRlcGxpYnMiCi0JZGVwbGlicz0KLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCWNhc2UgJHBhc3MgaW4KLQlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OwotCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7Ci0JbGluaykgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlICRkZXBlbmRlbmN5X2xpYnMiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgotCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKLQlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgotCWRlcGxpYnM9Ci0gICAgICBmaQotICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KLQlsaWI9Ci0JZm91bmQ9bm8KLQljYXNlICRkZXBsaWIgaW4KLQktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JLWwqKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWIgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiIDE+JjIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBuYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1sLy8nYAotCSAgZm9yIHNlYXJjaGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICBmb3Igc2VhcmNoX2V4dCBpbiAubGEgJHN0ZF9zaHJleHQgLnNvIC5hOyBkbwotCSAgICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgICBsaWI9IiRzZWFyY2hkaXIvbGliJHtuYW1lfSR7c2VhcmNoX2V4dH0iCi0JICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLQkJaWYgdGVzdCAiJHNlYXJjaF9leHQiID0gIi5sYSI7IHRoZW4KLQkJICBmb3VuZD15ZXMKLQkJZWxzZQotCQkgIGZvdW5kPW5vCi0JCWZpCi0JCWJyZWFrIDIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBkb25lCi0JICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgotCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgIGVsc2UgIyBkZXBsaWIgaXMgYSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgIyBJZiAkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzICYmICRkZXBsaWIgaXMgYSBzdGRsaWIsCi0JICAgICMgV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgdGhpbmdzIGhlcmUsIGFuZCBub3QgbGF0ZXIuCi0JICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKQotCQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8Ci0gICAgICAgICAgICAgICAgICAgIGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCSAgbGlicmFyeV9uYW1lcz0KLQkJICBvbGRfbGlicmFyeT0KLQkJICBjYXNlICRsaWIgaW4KLQkJICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkJICAqKSAuIC4vJGxpYiA7OwotCQkgIGVzYWMKLQkJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JCSAgICBsbD0iJGwiCi0JCSAgZG9uZQotCQkgIGlmIHRlc3QgIlgkbGwiID0gIlgkb2xkX2xpYnJhcnkiIDsgdGhlbiAjIG9ubHkgc3RhdGljIHZlcnNpb24gYXZhaWxhYmxlCi0JCSAgICBmb3VuZD1ubwotCQkgICAgbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQkgICAgdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgotCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKLQkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkJICAgIGVsc2UKLQkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkJICAgIGZpCi0JCSAgICBjb250aW51ZQotCQkgIGZpCi0JCWZpCi0JICAgICAgICA7OwotCSAgICAgICopIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZmkKLQkgIDs7ICMgLWwKLQktTCopCi0JICBjYXNlICRsaW5rbW9kZSBpbgotCSAgbGliKQotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgY29udGludWUKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICBjb250aW51ZQotCSAgOzsgIyAtTAotCS1SKikKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgZGlyPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCSAgICAjIE1ha2Ugc3VyZSB0aGUgeHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICBjYXNlICIkeHJwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgY29udGludWUKLQkgIDs7Ci0JKi5sYSkgbGliPSIkZGVwbGliIiA7OwotCSouJGxpYmV4dCkKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBjYXNlICRsaW5rbW9kZSBpbgotCSAgbGliKQotCSAgICB2YWxpZF9hX2xpYj1ubwotCSAgICBjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSAgICAgIG1hdGNoX3BhdHRlcm4qKQotCQlzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICAgICAgICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JCWlmIGV2YWwgJGVjaG8gXCIkZGVwbGliXCIgMj4vZGV2L251bGwgXAotCQkgICAgfCAkU0VEIDEwcSBcCi0JCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgdmFsaWRfYV9saWI9eWVzCi0JCWZpCi0JCTs7Ci0JICAgICAgcGFzc19hbGwpCi0JCXZhbGlkX2FfbGliPXllcwotCQk7OwotICAgICAgICAgICAgZXNhYwotCSAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKLQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkgICAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKLQkgICAgICAkZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZWQgaGVyZS4iCi0JICAgIGVsc2UKLQkgICAgICAkZWNobwotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKLQkgICAgICAkZWNobyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgOzsgIyAqLiRsaWJleHQKLQkqLmxvIHwgKi4kb2JqZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCi0JICAgIGZpCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JJURFUExJQlMlKQotCSAgYWxsZGVwbGlicz15ZXMKLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMgIyBjYXNlICRkZXBsaWIKLQlpZiB0ZXN0ICIkZm91bmQiID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIG9yIHVuaGFuZGxlZCBhcmd1bWVudCBcYCRkZXBsaWInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCWxhZGlyPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCi0KLQlkbG5hbWU9Ci0JZGxvcGVuPQotCWRscHJlb3Blbj0KLQlsaWJkaXI9Ci0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluawotCWluc3RhbGxlZD15ZXMKLQlzaG91bGRub3RsaW5rPW5vCi0JYXZvaWR0ZW1wcnBhdGg9Ci0KLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQljYXNlICRsaWIgaW4KLQkqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkqKSAuIC4vJGxpYiA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8Ci0JICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8Ci0JICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KLQkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGRsZmlsZXM9IiRkbGZpbGVzICRkbG9wZW4iCi0JICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGxwcmVvcGVuIgotCWZpCi0KLQlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgotCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICBmaQotCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICB0bXBfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0gICAgICAgICAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICAgIGVzYWMKLSAgICAgICAgICAgICAgZmkKLQkgICAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICAgIGRvbmUKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgY29udmVuaWVuY2UgbGlicmFyeSIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBjb250aW51ZQotCWZpICMgJHBhc3MgPSBjb252Ci0KLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKLQkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCi0JICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55Ci0JICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0Ci0JICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGRsb3BlbgotCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkbGFkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OwotCSopCi0JICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIiAxPiYyCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiIDE+JjIKLQkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCi0JICBmaQotCSAgOzsKLQllc2FjCi0JbGFuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogbGlicmFyeSBcYCRsaWInIHdhcyBtb3ZlZC4iIDE+JjIKLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRsaWJkaXIiCi0JICAgIGFic2Rpcj0iJGxpYmRpciIKLQkgIGZpCi0JICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcwotCWVsc2UKLQkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCi0JICAgIGRpcj0iJGxhZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgotCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgotCSAgZmkKLQlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKLQluYW1lPWAkZWNobyAiWCRsYW5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KLQkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgotCSAgZWxzZQotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgotCSAgZmkKLQlmaSAjICRwYXNzID0gZGxwcmVvcGVuCi0KLQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcwotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkKLQotCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCi0JICBsaW5rYWxsZGVwbGlicz1ubwotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAotCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKLQkgIGZpCi0KLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYDs7ICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBlc2FjCi0JICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KLQkgICAgaWYgdGVzdCAiJGxpbmthbGxkZXBsaWJzIiA9IHllczsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKLQkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcwotCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgIGRvbmUgIyBmb3IgZGVwbGliCi0JICBjb250aW51ZQotCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCi0JICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgotCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0JICAgICAgKiIgJGRpciAiKikgOzsKLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRhYnNkaXIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KLQotCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCi0JICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAotCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCi0JCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KLQkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5Ci0JdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKLQlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzIDsgdGhlbgotCSAgdXNlX3N0YXRpY19saWJzPW5vCi0JZmkKLQlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICB7IHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgotCSAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKLQkgICAgbmVlZF9yZWxpbms9eWVzCi0JICBmaQotCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKLQotCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uCi0JICAjIHNvbWUgc3lzdGVtcyAoZGFyd2luKQotCSAgaWYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbmsgOyB0aGVuCi0JICAgICRlY2hvCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKLQkgICAgZmkKLQkgICAgJGVjaG8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgotCSAgZmkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKLQkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgotCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQotCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQkgICAgcmVhbG5hbWU9IiQyIgotCSAgICBzaGlmdDsgc2hpZnQKLQkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KLQkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgICBzb25hbWU9IiRkbG5hbWUiCi0JICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgICAgICMgYmxlaCB3aW5kb3dzCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqKQotCQltYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JCXZlcnN1ZmZpeD0iLSRtYWpvciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCSAgICBlbHNlCi0JICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0JICAgIGZpCi0KLQkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKLQkgICAgc29yb290PSIkc29uYW1lIgotCSAgICBzb25hbWU9YCRlY2hvICRzb3Jvb3QgfCAke1NFRH0gLWUgJ3MvXi4qXC8vLydgCi0JICAgIG5ld2xpYj0ibGliaW1wLWAkZWNobyAkc29uYW1lIHwgJHtTRUR9ICdzL15saWIvLztzL1wuZGxsJC8vJ2AuYSIKLQotCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdwotCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgotCSAgICBlbHNlCi0JICAgICAgJHNob3cgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGNtZHM9JGV4dHJhY3RfZXhwc3ltc19jbWRzCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0KLQkgICAgIyBDcmVhdGUgJG5ld2xpYgotCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCi0JICAgICAgJHNob3cgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKLQkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCi0JICAgIGxpbmtsaWI9JG5ld2xpYgotCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICBsaWJfbGlua2VkPXllcwotCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KLQkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCi0JCWNhc2UgJGhvc3QgaW4KLQkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAotCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotZGFyd2luKiApCi0JCSAgICAjIGlmIHRoZSBsaWIgaXMgYSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90IGxpbmsgYWdhaW5zdAotCQkgICAgIyBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgbmV3IHdhcm5pbmdzIEkgYWRkZWQKLQkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAotICAgICAgICAgICAgICAgICAgICAgICRFR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCi0JCSAgICAgICRlY2hvICIqKiBXYXJuaW5nLCBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgotCQkgICAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgotCQkgICAgICAgICRlY2hvCi0JCSAgICAgICAgJGVjaG8gIioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCi0JCSAgICAgICAgJGVjaG8gIioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCi0JCSAgICAgIGVsc2UKLQkJICAgICAgICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgotCQkgICAgICBmaQotCQkgICAgZmkKLQkJZXNhYwotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OwotCQllc2FjCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkJYWRkX3NobGlicGF0aD0iJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsc2UKLQkJbGliX2xpbmtlZD1ubwotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgcmVsaW5rKQotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCi0JCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJICBjYXNlICRsaWJkaXIgaW4KLQkJICAgIFtcXC9dKikKLQkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7Ci0JICAgIGVzYWMKLQotCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KLQkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZF9kaXIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGQgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJiBcCi0JCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKLQkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgotCQkqIjokbGliZGlyOiIqKSA7OwotCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKLQkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KLQkgICAgICAgIGFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCi0JICAgICAgZWxzZQotCSAgICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJY2FzZSAkbGliZGlyIGluCi0JCSAgW1xcL10qKQotCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGFkZD0iLWwkbmFtZSIKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgIGZpCi0JICBmaQotCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZmkKLQllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQotCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KLQotCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCi0JICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgotCSAgICAkZWNobwotCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCi0JICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKLQkgICAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCi0JICAgICAgJGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKLQkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCQkkZWNobwotCQkkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JCSRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCQkkZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCQkkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgICBsaW5rX3N0YXRpYz15ZXMKLQkgIGZpCi0JZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCi0JICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8Ci0JICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KLQkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICAgIHRlbXBfZGVwbGlicz0KLQkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGxpYmRpciBpbgotCSAgICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KLQkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7Ci0JCSAgIGVzYWM7OwotCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQkgIGZpCi0KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgotCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5Ci0JICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKLQkgICAgICAqLmxhKQotCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKLQkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JCWNhc2UgJGRpciBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkJKikKLQkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCQkgICAgYWJzZGlyPSIkZGlyIgotCQkgIGZpCi0JCSAgOzsKLQkJZXNhYwotCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgcGF0aD0iJGFic2Rpci8kb2JqZGlyIgotCQllbHNlCi0JCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQkgIGZpCi0JCSAgaWYgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIiAxPiYyCi0JCSAgZmkKLQkJICBwYXRoPSIkYWJzZGlyIgotCQlmaQotCQlkZXBkZXBsPQotCQljYXNlICRob3N0IGluCi0JCSotKi1kYXJ3aW4qKQotCQkgICMgd2UgZG8gbm90IHdhbnQgdG8gbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJzLAotCQkgICMgYnV0IG5lZWQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZAotCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCi0JCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KLQkJICAgICAgZGVwZGVwbD0kdG1wCi0JCSAgICBkb25lCi0JCSAgICBpZiB0ZXN0IC1mICIkcGF0aC8kZGVwZGVwbCIgOyB0aGVuCi0JCSAgICAgIGRlcGRlcGw9IiRwYXRoLyRkZXBkZXBsIgotCQkgICAgZmkKLQkJICAgICMgZG8gbm90IGFkZCBwYXRocyB3aGljaCBhcmUgYWxyZWFkeSB0aGVyZQotCQkgICAgY2FzZSAiICRuZXdsaWJfc2VhcmNoX3BhdGggIiBpbgotCQkgICAgKiIgJHBhdGggIiopIDs7Ci0JCSAgICAqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJHBhdGgiOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIHBhdGg9IiIKLQkJICA7OwotCQkqKQotCQkgIHBhdGg9Ii1MJHBhdGgiCi0JCSAgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgIC1sKikKLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotZGFyd2luKikKLQkJICAjIEFnYWluLCB3ZSBvbmx5IHdhbnQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKLQkJICBldmFsIHRtcF9saWJzPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgInMsXlwtbCwsImAKLQkJICBmb3IgdG1wIGluICRuZXdsaWJfc2VhcmNoX3BhdGggOyBkbwotCQkgICAgaWYgdGVzdCAtZiAiJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiIDsgdGhlbgotCQkgICAgICBldmFsIGRlcGRlcGw9IiR0bXAvbGliJHRtcF9saWJzLmR5bGliIgotCQkgICAgICBicmVhawotCQkgICAgZmkKLQkJICBkb25lCi0JCSAgcGF0aD0iIgotCQkgIDs7Ci0JCSopIGNvbnRpbnVlIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICAqKSBjb250aW51ZSA7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRwYXRoICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRkZXBkZXBsICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRkZXBkZXBsICRkZXBsaWJzIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCi0JZmkgIyBsaW5rbW9kZSA9IGxpYgotICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKLQlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCi0JaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KLQkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgIGxpYl9zZWFyY2hfcGF0aD0KLQkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KLQkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0JZmkKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KLQkgIHZhcnM9ImRlcGxpYnMiCi0JZWxzZQotCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCi0JZmkKLQlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKLQkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgotCSAgbmV3X2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KLQkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KLQkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKLQkgICAgIyAgICAgICAgYnJva2VuOgotCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgotCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KLQkgICAgIyBwcmFjdGljZToKLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAtUiopIDs7Ci0JICAgICopCi0JICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKLQkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKLQkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQotCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCi0JICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcwotCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQotCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKLQkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAotCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKLQkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKLQkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5Ci0JICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQotCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0Ci0JICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCi0JICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAgICopCi0JCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCQkqIiAkZGVwbGliICIqKSA7OwotCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikKLQkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgotCWRvbmUgIyBmb3IgdmFyCi0gICAgICBmaQotICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLSAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQotICAgICAgdG1wX2xpYnM9Ci0gICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KLQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRpICIqKQotCSAgaT0iIgotCSAgOzsKLQllc2FjCi0JaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKLQlmaQotICAgICAgZG9uZQotICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicwotICAgIGRvbmUgIyBmb3IgcGFzcwotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0gICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotICAgIGZpCi0KLSAgICBjYXNlICRsaW5rbW9kZSBpbgotICAgIG9sZGxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgb2xkbGlicz0iJG91dHB1dCIKLSAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgotICAgICAgOzsKLQotICAgIGxpYikKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KLSAgICAgIGxpYiopCi0JbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCWVsc2UKLQkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIgMj4mMQotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZWxzZQotCSAgJGVjaG8KLQkgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKLQkgICRlY2hvICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgotCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCi0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KLQkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KLQkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKLQkgIGJ1aWxkX29sZF9saWJzPXllcwotCWZpCi0KLQlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKLQlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKLQkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cwotCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCi0KLQljYXNlICR2aW5mb19udW1iZXIgaW4KLQl5ZXMpCi0JICBudW1iZXJfbWFqb3I9IiQyIgotCSAgbnVtYmVyX21pbm9yPSIkMyIKLQkgIG51bWJlcl9yZXZpc2lvbj0iJDQiCi0JICAjCi0JICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAotCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KLQkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCi0JICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4Ci0JICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgotCSAgIwotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3MpCi0JICAgIGN1cnJlbnQ9YGV4cHIgJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3JgCi0JICAgIGFnZT0iJG51bWJlcl9taW5vciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCi0JICAgIDs7Ci0JICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCi0JICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBhZ2U9IjAiCi0JICAgIDs7Ci0JICBpcml4fG5vbnN0b3B1eCkKLQkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vciAtIDFgCi0JICAgIGFnZT0iJG51bWJlcl9taW5vciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCW5vKQotCSAgY3VycmVudD0iJDIiCi0JICByZXZpc2lvbj0iJDMiCi0JICBhZ2U9IiQ0IgotCSAgOzsKLQllc2FjCi0KLQkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotCWNhc2UgJGN1cnJlbnQgaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHJldmlzaW9uIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJGFnZSBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRhZ2UiIC1ndCAiJGN1cnJlbnQiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgotCW1ham9yPQotCXZlcnN1ZmZpeD0KLQl2ZXJzdHJpbmc9Ci0JY2FzZSAkdmVyc2lvbl90eXBlIGluCi0Jbm9uZSkgOzsKLQotCWRhcndpbikKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBhdmFpbGFibGUgaW4KLQkgICMgdmVyc3RyaW5nIGZvciBjb2RpbmcgaXQgaW50byB0aGUgbGlicmFyeSBoZWFkZXIKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgICMgRGFyd2luIGxkIGRvZXNuJ3QgbGlrZSAwIGZvciB0aGVzZSBvcHRpb25zLi4uCi0JICBtaW5vcl9jdXJyZW50PWBleHByICRjdXJyZW50ICsgMWAKLQkgIHZlcnN0cmluZz0iJHt3bH0tY29tcGF0aWJpbGl0eV92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQgJHt3bH0tY3VycmVudF92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCWZyZWVic2QtYW91dCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOwotCSAgOzsKLQotCWZyZWVic2QtZWxmKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKLQkgIDs7Ci0KLQlpcml4IHwgbm9uc3RvcHV4KQotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKLQotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKLQkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OwotCSAgZXNhYwotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCi0JICBkb25lCi0KLQkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KLQkgIG1ham9yPS4kbWFqb3IKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kYWdlCi0JICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlzdW5vcykKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0Jd2luZG93cykKLQkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKLQkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JICA7OwotCi0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgotCSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbikKLQkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCi0JICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKLQkgICAgdmVyc3RyaW5nPQotCSAgICA7OwotCSAgKikKLQkgICAgdmVyc3RyaW5nPSIwLjAiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5Ci0JIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCi0JcmVtb3ZlbGlzdD0KLQl0ZW1wcmVtb3ZlbGlzdD1gJGVjaG8gIiRvdXRwdXRfb2JqZGlyLyoiYAotCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KLQkgIGNhc2UgJHAgaW4KLQkgICAgKi4kb2JqZXh0KQotCSAgICAgICA7OwotCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQotCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KLQkgICAgICAgICBpZiBlY2hvICRwIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQotCSAgICAgICAgIHRoZW4KLQkJICAgY29udGludWUKLQkJIGZpCi0JICAgICAgIGZpCi0JICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgotCSAgICAgICA7OwotCSAgICAqKSA7OwotCSAgZXNhYwotCWRvbmUKLQlpZiB0ZXN0IC1uICIkcmVtb3ZlbGlzdCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJHJlbW92ZWxpc3QiCi0JICAkcnVuICR7cm19ciAkcmVtb3ZlbGlzdAotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCi0Jb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQotCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLQlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JbGliX3NlYXJjaF9wYXRoPWAkZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICJzJSAkcGF0aCAlICVnImAKLQlkZXBsaWJzPWAkZWNobyAiJGRlcGxpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKLQlkZXBlbmRlbmN5X2xpYnM9YCRlY2hvICIkZGVwZW5kZW5jeV9saWJzICIgfCAke1NFRH0gLWUgInMlIC1MJHBhdGggJSAlZyJgCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKLQkgICAgOzsKLQkgICotKi1uZXRic2QqKQotCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgOzsKLQkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKLQkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCi0JICAgIDs7Ci0JICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCi0JICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKLQkgICAgOzsKLSAJICAqKQotCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgotCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0KLQkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCi0JbmFtZV9zYXZlPSRuYW1lCi0JbGlibmFtZV9zYXZlPSRsaWJuYW1lCi0JcmVsZWFzZV9zYXZlPSRyZWxlYXNlCi0JdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAotCW1ham9yX3NhdmU9JG1ham9yCi0JIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKLQkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KLQlyZWxlYXNlPSIiCi0JdmVyc3VmZml4PSIiCi0JbWFqb3I9IiIKLQluZXdkZXBsaWJzPQotCWRyb3BwZWRkZXBzPW5vCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQlwYXNzX2FsbCkKLQkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkgIDs7Ci0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkcm0gY29uZnRlc3QuYwotCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLQkgICRybSBjb25mdGVzdAotCSAgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKLQkgIGlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAtbmUgIjAiOyB0aGVuCi0JCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAqIiAkaSAiKikKLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgaT0iIgotCQkgICAgOzsKLQkJICBlc2FjCi0JICAgICAgICBmaQotCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JCSAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQkgIGRlcGxpYl9tYXRjaD0kMgotCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgIGVsc2UKLQkJICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgJGVjaG8KLQkJICAgICRlY2hvICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgotCQkgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKLQkJICAgICRlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgZmkKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCi0JICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT1gZXhwciAkaSA6ICctbFwoLipcKSdgCi0JICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0gICAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICIkPyIgLWVxIDAgOyB0aGVuCi0JCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkgICAgKiIgJGkgIiopCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgICBpPSIiCi0JCSAgICAgIDs7Ci0JCSAgICBlc2FjCi0JCSAgZmkKLQkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQkgICAgZGVwbGliX21hdGNoPSQyCi0JCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgZWxzZQotCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICAgJGVjaG8KLQkJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKLQkJICAgICAgJGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICAgIGZpCi0JCSAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgICRlY2hvCi0JCSAgJGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICAkZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICAkZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICAkZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0JICA7OwotCWZpbGVfbWFnaWMqKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgotCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgXAotCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUKLQkJICAgICAgZmkKLQkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCi0JCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KLQkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluawotCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCi0JCSAgICAgICMgYnV0IHNvIHdoYXQ/Ci0JCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCi0JCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbwotCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAotCQkJY2FzZSAkcG90bGlibGluayBpbgotCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7Ci0JCQllc2FjCi0JCSAgICAgIGRvbmUKLQkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIFwKLQkJCSB8ICR7U0VEfSAxMHEgXAotCQkJIHwgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgZG9uZQotCQlkb25lCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJJGVjaG8KLQkJJGVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQkkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRlY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgotCQllbHNlCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJGVjaG8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW1hdGNoX3BhdHRlcm4qKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSoiICRhX2RlcGxpYiAiKikKLQkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgYV9kZXBsaWI9IiIKLQkJICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0Ci0JCSAgICBpZiBldmFsICRlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCi0JCSAgICAgICAgfCAke1NFRH0gMTBxIFwKLQkJICAgICAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICAgICAgYV9kZXBsaWI9IiIKLQkJICAgICAgYnJlYWsgMgotCQkgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQkkZWNobwotCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCi0JCWVsc2UKLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkZWNobyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKQotCSAgbmV3ZGVwbGlicz0iIgotCSAgdG1wX2RlcGxpYnM9YCRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKLQkgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAotCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbwotCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKLQkgICAgICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJHRtcF9kZXBsaWJzIiB8ICR7U0VEfSAtZSAiMXMsXlgsLCIgLWUgInMsJGksLCJgCi0JICAgIGRvbmUKLQkgIGZpCi0JICBpZiAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWyAJXS8vZycgXAotCSAgICB8IGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCi0JICAgICRlY2hvCi0JICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKLQkgICAgZmkKLQkgICAgJGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgotCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkgIGZpCi0JICA7OwotCWVzYWMKLQl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCi0JbWFqb3I9JG1ham9yX3NhdmUKLQlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKLQlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKLQluYW1lPSRuYW1lX3NhdmUKLQotCWNhc2UgJGhvc3QgaW4KLQkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgbmV3ZGVwbGlicz1gJGVjaG8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAkZWNobwotCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCi0JICAgICRlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgJGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgotCSAgICAkZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgotCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCSAgICAgICRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCSAgICAgICRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgJGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgZWxzZQotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBmaQotCSAgZWxzZQotCSAgICAkZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKLQkgICAgJGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgICRlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCi0KLQkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCi0JICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgotCSAgICAgICRlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCi0JICAgICAgJGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQlmaQotCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQotCWRlcGxpYnM9JG5ld2RlcGxpYnMKLSAgICAgIGZpCi0KLQotICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0Ci0gICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAotICAgICAgbmV3X2xpYnM9Ci0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKLQkqKQotCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KLQkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKLQkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JY2FzZSAkZGVwbGliIGluCi0JLUwqKQotCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCi0JICAqIiAkZGVwbGliICIqKSA7OwotCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCSAgZXNhYwotCSAgOzsKLQkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZGVwbGlicz0iJG5ld19saWJzIgotCi0KLSAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KLSAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIGRsbmFtZT0KLQotICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgotCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotCSAgaGFyZGNvZGVfbGliZGlycz0KLQkgIGRlcF9ycGF0aD0KLQkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCi0JICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKLQkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbwotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkJZWxzZQotCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJICAgIDs7Ci0JCSAgKikKLQkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JICAgICAgZWxzZQotCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKLQkgICAgICBmaQotCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKLQkgICAgZWxzZQotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBmaQotCSAgZmkKLQkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICAgIHJwYXRoPQotCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgZG9uZQotCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKLQkgIGZpCi0JICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgotCWZpCi0KLQlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCi0JdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCi0JaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KLQkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQlmaQotCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlyZWFsbmFtZT0iJDIiCi0Jc2hpZnQ7IHNoaWZ0Ci0KLQlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JZWxzZQotCSAgc29uYW1lPSIkcmVhbG5hbWUiCi0JZmkKLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgZGxuYW1lPSRzb25hbWUKLQlmaQotCi0JbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCi0JbGlua25hbWVzPQotCWZvciBsaW5rCi0JZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgICBpZiBsZW49YGV4cHIgIlgkY21kIiA6ICIuKiJgICYmCi0JICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgICAgIHNraXBwZWRfZXhwb3J0PWZhbHNlCi0JICAgICAgZWxzZQotCSAgICAgICAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCi0JICAgICAgICAkc2hvdyAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCi0JICAgICAgICBza2lwcGVkX2V4cG9ydD06Ci0JCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCi0JCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgotCQlicmVhawotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkc2hvdyAiJEVHUkVQIC1lIFwiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4XCIgXCIkZXhwb3J0X3N5bWJvbHNcIiA+IFwiJHtleHBvcnRfc3ltYm9sc31UXCIiCi0JICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JdG1wX2RlcGxpYnM9Ci0JZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCQljYXNlICIgJGNvbnZlbmllbmNlICIgaW4KLQkJKiIgJHRlc3RfZGVwbGliICIqKSA7OwotCQkqKQotCQkJdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCi0JCQk7OwotCQllc2FjCi0JZG9uZQotCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKLQotCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JICBmaQotCWZpCi0JCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCi0JZmkKLQotCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZwotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VSAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcwotCSAgZWxzZQotCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9jbWRzCi0JICBmaQotCWVsc2UKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JZWxzZQotCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLQkgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgotCSAgIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgIDoKLQllbHNlCi0JICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UuCi0JICAkZWNobyAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCi0KLQkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCi0JICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKLQkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKLQkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0Ci0JICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgotCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQotCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZwotCSAgIyB0aGUgc3BlYy4KLQkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKLQkgIGZpCi0JICBzYXZlX291dHB1dD0kb3V0cHV0Ci0JICBvdXRwdXRfbGE9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKLQotCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKLQkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KLQkgIHRlc3RfY21kcz0KLQkgIGNvbmNhdF9jbWRzPQotCSAgb2JqbGlzdD0KLQkgIGRlbGZpbGVzPQotCSAgbGFzdF9yb2JqPQotCSAgaz0xCi0JICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgotCSAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCi0JICBkbwotCSAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKLQkgICAgICAgeyBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCi0JCSB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IH07IHRoZW4KLQkgICAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgotCSAgICBlbHNlCi0JICAgICAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKLQkgICAgICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgotCSAgICAgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KLQkJIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KLQkJZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgICBlbHNlCi0JCSMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCi0JCSMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCi0JCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgICBmaQotCSAgICAgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgICAgIGs9YGV4cHIgJGsgKyAxYAotCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgICAgIG9iamxpc3Q9JG9iagotCSAgICAgIGxlbj0xCi0JICAgIGZpCi0JICBkb25lCi0JICAjIEhhbmRsZSB0aGUgcmVtYWluaW5nIG9iamVjdHMgYnkgY3JlYXRpbmcgb25lIGxhc3QKLQkgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0Ci0JICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQotCSAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgbGlib2Jqcz0kb3V0cHV0Ci0JICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCi0JICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLSAgICAgICAgICBmaQotCi0JICAjIFNldCB1cCBhIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcwotCSAgIyBhZnRlciB0aGV5IGFyZSB1c2VkLgotCSAgaT0wCi0JICB3aGlsZSB0ZXN0ICIkaSIgLWx0ICIkayIKLQkgIGRvCi0JICAgIGk9YGV4cHIgJGkgKyAxYAotCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtpfS4kb2JqZXh0IgotCSAgZG9uZQotCi0JICAkZWNobyAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKLQotCSAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCi0JICBsaWJvYmpzPSRvdXRwdXQKLQkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgotCSAgb3V0cHV0PSRzYXZlX291dHB1dAotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBmaQotCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKLQkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgotCi0JICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICAgIGVsc2UKLQkgICAgICBjbWRzPSRtb2R1bGVfY21kcwotCSAgICBmaQotCSAgZWxzZQotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotCSAgZWxzZQotCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKLQkgICAgZmkKLQkgIGZpCi0KLQkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKLQkgICMgdG8gdGhlIGp1c3QtcmVzZXQgJGNtZHMuCi0JICBldmFsIGNtZHM9XCJcJGNtZHN+XCRybSAkZGVsZmlsZXNcIgotCWZpCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCB7Ci0JICAgIGx0X2V4aXQ9JD8KLQotCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCi0JICAgIGZpCi0KLQkgICAgZXhpdCAkbHRfZXhpdAotCSAgfQotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkbXYgIiRyZWFsbmFtZSJVICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KLQotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAgICRydW4gJHtybX1yICIkZ2VudG9wIgotCSAgICBmaQotCSAgZmkKLQotCSAgZXhpdCAkRVhJVF9TVUNDRVNTCi0JZmkKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAgICoubG8pCi0JaWYgdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JbGlib2JqPSIkb3V0cHV0IgotCW9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JOzsKLSAgICAgICopCi0JbGlib2JqPQotCW9iaj0iJG91dHB1dCIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCi0gICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLQotICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCi0gICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQotICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKLSAgICAgICMgdGhlIGV4dHJhY3Rpb24uCi0gICAgICByZWxvYWRfY29udl9vYmpzPQotICAgICAgZ2VudG9wPQotICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKLSAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKLSAgICAgIHdsPQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQotICAgICAgb3V0cHV0PSIkb2JqIgotICAgICAgY21kcz0kcmVsb2FkX2NtZHMKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQlldmFsIGNtZD1cIiRjbWRcIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQlleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAkcnVuICR7cm19ciAkZ2VudG9wCi0JZmkKLQotCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0JIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLQkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JIyAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JY21kcz0kcmVsb2FkX2NtZHMKLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkkcnVuICR7cm19ciAkZ2VudG9wCi0gICAgICBmaQotCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0KLSAgICBwcm9nKQotICAgICAgY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OwotICAgICAgZXNhYwotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgotCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQlmaQotICAgICAgZmkKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKmRhcndpbiopCi0gICAgICAgICMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAgICAgICAgaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLQotICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0Ci0gICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAotICAgICAgbmV3X2xpYnM9Ci0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKLQkqKQotCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgotCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQotCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbwotCWNhc2UgJGRlcGxpYiBpbgotCS1MKikKLQkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgotCi0KLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7Ci0JICBlc2FjCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgZGxzeW1zPQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JY2FzZSAkZGxzeW1zIGluCi0JIiIpIDs7Ci0JKi5jKQotCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KLQkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgotCi0JICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAotIgotCi0JICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKLQotCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgICBkb25lCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCi0gICAgICAgICAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgICAgICAgICRydW4gZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLQkJJHJ1biBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgZXNhYwotCSAgICBlbHNlCi0JICAgICAgJHJ1biBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKLQkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLSAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotCQkkcnVuIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICBlc2FjCi0JICAgIGZpCi0JICBmaQotCi0JICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgbmFtZT1gJGVjaG8gIiRhcmciIHwgJHtTRUR9IC1lICdzJV4uKi8lJSdgCi0JICAgICRydW4gZXZhbCAnJGVjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCi0JICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgotCSAgICBmaQotCi0JICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0JICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8Ci0JCWlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkgIHNvcnQgLWsgMwotCQllbHNlCi0JCSAgc29ydCArMgotCQlmaSB8Ci0JCXVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCSAgICBmaQotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotCi0jdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0ciBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi0iCi0KLQkgICAgY2FzZSAkaG9zdCBpbgotCSAgICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0vKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNhbid0IGJlIGNvbnN0LCBiZWNhdXNlCi0gICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgotICAgb24gcHNldWRvLXJlbG9jcyAqLwotc3RydWN0IHsKLSIKLQkgICAgICA7OwotCSAgICAqICkKLQkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotY29uc3Qgc3RydWN0IHsKLSIKLQkgICAgICA7OwotCSAgICBlc2FjCi0KLQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0ciBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotICB7MCwgKGx0X3B0cikgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmXAotIgotCSAgZmkKLQotCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQotCSAgY2FzZSAkaG9zdCBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCI7OwotCSAgICBlc2FjOzsKLQkgICotKi1ocHV4KikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyI7OwotCSAgICBlc2FjCi0JICBlc2FjCi0KLQkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0JICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAgJExUQ0ZMQUdTIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0JICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KLSAgICAgICAgICBjYXNlICRob3N0IGluCi0gICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLSAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmIiA7IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9LmRlZiAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLSAgICAgICAgICAgICBmaQotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqICkKLSAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgOzsKLSAgICAgICAgICBlc2FjCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLQkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLQkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKLQlleGl0X3N0YXR1cz0kPwotCi0JIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgotCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgotCWZpCi0KLQlleGl0ICRleGl0X3N0YXR1cwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgJGRpciBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotCSAgICAjIEFic29sdXRlIHBhdGguCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgOzsKLQkgICopCi0JICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KLQkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JdGVtcF9ycGF0aD0iJHJwYXRoIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgotICAgICAgZmkKLQotICAgICAgY29tcGlsZV92YXI9Ci0gICAgICBmaW5hbGl6ZV92YXI9Ci0gICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgotCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLQkkcnVuICRybSAkb3V0cHV0Ci0JIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0Ci0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/Ci0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KLQkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKLQkgIGVsc2UKLQkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgZmkKLQllbHNlCi0JICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCi0gICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCi0KLSAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgotICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/Ci0KLSAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLQlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZWxzZQotCSAgICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZmkKLQlkb25lCi0JcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kKSIKLQlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICRwcm9ncGF0aCBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWAkZWNobyAkb3V0cHV0fCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKLQllc2FjCi0JIyB0ZXN0IGZvciBjeWd3aW4gYmVjYXVzZSBtdiBmYWlscyB3L28gLmV4ZSBleHRlbnNpb25zCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiopCi0JICAgIGV4ZWV4dD0uZXhlCi0JICAgIG91dHB1dG5hbWU9YCRlY2hvICRvdXRwdXRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKLQkgICopIGV4ZWV4dD0gOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLSAgICAgICAgICAgIG91dHB1dF9uYW1lPWBiYXNlbmFtZSAkb3V0cHV0YAotICAgICAgICAgICAgb3V0cHV0X3BhdGg9YGRpcm5hbWUgJG91dHB1dGAKLSAgICAgICAgICAgIGN3cmFwcGVyc291cmNlPSIkb3V0cHV0X3BhdGgvJG9iamRpci9sdC0kb3V0cHV0X25hbWUuYyIKLSAgICAgICAgICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKLSAgICAgICAgICAgICRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCi0gICAgICAgICAgICB0cmFwICIkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcjsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSAgICBjYXQgPiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLQotLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotCi0gICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLQotICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0gICBDdXJyZW50bHksIGl0IHNpbXBseSBleGVjcyB0aGUgd3JhcHBlciAqc2NyaXB0KiAiL2Jpbi9zaCAkb3V0cHV0IiwKLSAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKLSAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KLSovCi1FT0YKLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZTw8IkVPRiIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQoUEFUSF9NQVgpCi0jIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KLSNlbHNlCi0jIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAotICBkZWZpbmVkIChfX09TMl9fKQotIyBkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSMgaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyAgZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCi0jIGVuZGlmCi0jIGlmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCi0jICBkZWZpbmUgUEFUSF9TRVBBUkFUT1JfMiAnOycKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKLSNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAotICAgICAgICAoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKLSNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KLQotI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCi0jIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCi0jZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCi0jIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKLSNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCi0KLSNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKLSNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAotICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAotfSB3aGlsZSAoMCkKLQotLyogLURERUJVRyBpcyBmYWlybHkgY29tbW9uIGluIENGTEFHUy4gICovCi0jdW5kZWYgREVCVUcKLSNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgotIyBkZWZpbmUgREVCVUcoZm9ybWF0LCAuLi4pIGZwcmludGYoc3RkZXJyLCBmb3JtYXQsIF9fVkFfQVJHU19fKQotI2Vsc2UKLSMgZGVmaW5lIERFQlVHKGZvcm1hdCwgLi4uKQotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7Ci0KLXZvaWQgKiB4bWFsbG9jIChzaXplX3QgbnVtKTsKLWNoYXIgKiB4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOwotY29uc3QgY2hhciAqIGJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7Ci1jaGFyICogZmluZF9leGVjdXRhYmxlKGNvbnN0IGNoYXIgKndyYXBwZXIpOwotaW50ICAgIGNoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqcGF0aCk7Ci1jaGFyICogc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKLXZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgY2hhciAqKm5ld2FyZ3o7Ci0gIGludCBpOwotCi0gIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOwotICBERUJVRygiKG1haW4pIGFyZ3ZbMF0gICAgICA6ICVzXG4iLGFyZ3ZbMF0pOwotICBERUJVRygiKG1haW4pIHByb2dyYW1fbmFtZSA6ICVzXG4iLHByb2dyYW1fbmFtZSk7Ci0gIG5ld2FyZ3ogPSBYTUFMTE9DKGNoYXIgKiwgYXJnYysyKTsKLUVPRgotCi0gICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCi0gIG5ld2FyZ3pbMF0gPSAoY2hhciAqKSB4c3RyZHVwKCIkU0hFTEwiKTsKLUVPRgotCi0gICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKLSAgbmV3YXJnelsxXSA9IGZpbmRfZXhlY3V0YWJsZShhcmd2WzBdKTsKLSAgaWYgKG5ld2FyZ3pbMV0gPT0gTlVMTCkKLSAgICBsdF9mYXRhbCgiQ291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOwotICBERUJVRygiKG1haW4pIGZvdW5kIGV4ZSBhdCA6ICVzXG4iLG5ld2FyZ3pbMV0pOwotICAvKiB3ZSBrbm93IHRoZSBzY3JpcHQgaGFzIHRoZSBzYW1lIG5hbWUsIHdpdGhvdXQgdGhlIC5leGUgKi8KLSAgLyogc28gbWFrZSBzdXJlIG5ld2FyZ3pbMV0gZG9lc24ndCBlbmQgaW4gLmV4ZSAqLwotICBzdHJlbmR6YXAobmV3YXJnelsxXSwiLmV4ZSIpOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIG5ld2FyZ3pbaSsxXSA9IHhzdHJkdXAoYXJndltpXSk7Ci0gIG5ld2FyZ3pbYXJnYysxXSA9IE5VTEw7Ci0KLSAgZm9yIChpPTA7IGk8YXJnYysxOyBpKyspCi0gIHsKLSAgICBERUJVRygiKG1haW4pIG5ld2FyZ3pbJWRdICAgOiAlc1xuIixpLG5ld2FyZ3pbaV0pOwotICAgIDsKLSAgfQotCi1FT0YKLQotICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgICAgICAgICBtaW5ndyopCi0gICAgICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotICBleGVjdigiJFNIRUxMIiwoY2hhciBjb25zdCAqKiluZXdhcmd6KTsKLUVPRgotICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLSAgZXhlY3YoIiRTSEVMTCIsbmV3YXJneik7Ci1FT0YKLSAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCi0gIHJldHVybiAxMjc7Ci19Ci0KLXZvaWQgKgoteG1hbGxvYyAoc2l6ZV90IG51bSkKLXsKLSAgdm9pZCAqIHAgPSAodm9pZCAqKSBtYWxsb2MgKG51bSk7Ci0gIGlmICghcCkKLSAgICBsdF9mYXRhbCAoIk1lbW9yeSBleGhhdXN0ZWQiKTsKLQotICByZXR1cm4gcDsKLX0KLQotY2hhciAqCi14c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLCBzdHJpbmcpIDogTlVMTAotOwotfQotCi1jb25zdCBjaGFyICoKLWJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhciluYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKLSAgICBuYW1lICs9IDI7Ci0jZW5kaWYKLQotICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQotICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCi0gICAgICBiYXNlID0gbmFtZSArIDE7Ci0gIHJldHVybiBiYXNlOwotfQotCi1pbnQKLWNoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqIHBhdGgpCi17Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gIERFQlVHKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIik7Ci0gIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoc3RhdCAocGF0aCwgJnN0KSA+PSAwKSAmJgotICAgICAgKAotICAgICAgICAvKiBNaW5HVyAmIG5hdGl2ZSBXSU4zMiBkbyBub3Qgc3VwcG9ydCBTX0lYT1RIIG9yIFNfSVhHUlAgKi8KLSNpZiBkZWZpbmVkIChTX0lYT1RIKQotICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhPVEgpID09IFNfSVhPVEgpIHx8Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChTX0lYR1JQKQotICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhHUlApID09IFNfSVhHUlApIHx8Ci0jZW5kaWYKLSAgICAgICAoKHN0LnN0X21vZGUgJiBTX0lYVVNSKSA9PSBTX0lYVVNSKSkKLSAgICAgICkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBTZWFyY2hlcyBmb3IgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgd3JhcHBlci4gIFJldHVybnMKLSAgIG5ld2x5IGFsbG9jYXRlZCBmdWxsIHBhdGggbmFtZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UgKi8KLWNoYXIgKgotZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyKiB3cmFwcGVyKQotewotICBpbnQgaGFzX3NsYXNoID0gMDsKLSAgY29uc3QgY2hhciogcDsKLSAgY29uc3QgY2hhciogcF9uZXh0OwotICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KLSAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOwotICBpbnQgdG1wX2xlbjsKLSAgY2hhciogY29uY2F0X25hbWU7Ci0KLSAgREVCVUcoIihmaW5kX2V4ZWN1dGFibGUpICA6ICVzXG4iLCB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpOwotCi0gIGlmICgod3JhcHBlciA9PSBOVUxMKSB8fCAoKndyYXBwZXIgPT0gJ1wwJykpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQWJzb2x1dGUgcGF0aD8gKi8KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKXdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQotICB7Ci0gICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKLSAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCi0gICAgICByZXR1cm4gY29uY2F0X25hbWU7Ci0gICAgWEZSRUUoY29uY2F0X25hbWUpOwotICB9Ci0gIGVsc2UKLSAgewotI2VuZGlmCi0gICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKHdyYXBwZXJbMF0pKQotICAgIHsKLSAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7Ci0gICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCi0gICAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKLSAgICB9Ci0jaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCi0gIH0KLSNlbmRpZgotCi0gIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCi0gICAgaWYgKCpwID09ICcvJykKLSAgICB7Ci0gICAgICBoYXNfc2xhc2ggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAoIWhhc19zbGFzaCkKLSAgewotICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCi0gICAgY29uc3QgY2hhciogcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKLSAgICBpZiAocGF0aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocCA9IHBhdGg7ICpwOyBwID0gcF9uZXh0KQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiBxOwotICAgICAgICBzaXplX3QgcF9sZW47Ci0gICAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCi0gICAgICAgICAgaWYgKElTX1BBVEhfU0VQQVJBVE9SKCpxKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwX2xlbiA9IHEgLSBwOwotICAgICAgICBwX25leHQgPSAoKnEgPT0gJ1wwJyA/IHEgOiBxICsgMSk7Ci0gICAgICAgIGlmIChwX2xlbiA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KLSAgICAgICAgICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCi0gICAgICAgICAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKLSAgICAgICAgICB0bXBfbGVuID0gc3RybGVuKHRtcCk7Ci0gICAgICAgICAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuKHdyYXBwZXIpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKLSAgICAgICAgICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKLSAgICAgICAgICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKLSAgICAgICAgICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7Ci0gICAgICAgICAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOwotICAgICAgICAgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKLSAgICAgICAgICByZXR1cm4gY29uY2F0X25hbWU7Ci0gICAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KLSAgfQotICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCi0gIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKLSAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKLSAgdG1wX2xlbiA9IHN0cmxlbih0bXApOwotICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKLSAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKLSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7Ci0gIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0KLSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQotICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgWEZSRUUoY29uY2F0X25hbWUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotY2hhciAqCi1zdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCi17Ci0gIHNpemVfdCBsZW4sIHBhdGxlbjsKLQotICBhc3NlcnQoc3RyICE9IE5VTEwpOwotICBhc3NlcnQocGF0ICE9IE5VTEwpOwotCi0gIGxlbiA9IHN0cmxlbihzdHIpOwotICBwYXRsZW4gPSBzdHJsZW4ocGF0KTsKLQotICBpZiAocGF0bGVuIDw9IGxlbikKLSAgewotICAgIHN0ciArPSBsZW4gLSBwYXRsZW47Ci0gICAgaWYgKHN0cmNtcChzdHIsIHBhdCkgPT0gMCkKLSAgICAgICpzdHIgPSAnXDAnOwotICB9Ci0gIHJldHVybiBzdHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKiBtb2RlLAotICAgICAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlLCB2YV9saXN0IGFwKQotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7Ci0KLSAgaWYgKGV4aXRfc3RhdHVzID49IDApCi0gICAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi12b2lkCi1sdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOwotICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci19Ci1FT0YKLSAgICAgICAgICAjIHdlIHNob3VsZCByZWFsbHkgdXNlIGEgYnVpbGQtcGxhdGZvcm0gc3BlY2lmaWMgY29tcGlsZXIKLSAgICAgICAgICAjIGhlcmUsIGJ1dCBPVE9ILCB0aGUgd3JhcHBlcnMgKHNoZWxsIHNjcmlwdCBhbmQgdGhpcyBDIG9uZSkKLSAgICAgICAgICAjIGFyZSBvbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGVjdXRlIHRoZSAicmVhbCIgYmluYXJ5LgotICAgICAgICAgICMgU2luY2UgdGhlICJyZWFsIiBiaW5hcnkgaXMgYnVpbHQgZm9yICRob3N0LCB0aGVuIHRoaXMKLSAgICAgICAgICAjIHdyYXBwZXIgbWlnaHQgYXMgd2VsbCBiZSBidWlsdCBmb3IgJGhvc3QsIHRvby4KLSAgICAgICAgICAkcnVuICRMVENDICRMVENGTEFHUyAtcyAtbyAkY3dyYXBwZXIgJGN3cmFwcGVyc291cmNlCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICAkcm0gJG91dHB1dAotICAgICAgICB0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSRlY2hvID4gJG91dHB1dCAiXAotIyEgJFNIRUxMCi0KLSMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPScke1NFRH0gLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLSAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJwotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAotIgotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0Ci0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0KLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCi0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQotICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KLSAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgotICAgICAgZWxzZQotCSRlY2hvIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKLQkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAotICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOwotICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9Ci0gICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gIGZpIgotCWVsc2UKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0JKi0qLW1pbmd3IHwgKi0qLW9zMiopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCWVzYWMKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgICRlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLWZpXAotIgotCWNobW9kICt4ICRvdXRwdXQKLSAgICAgIGZpCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCi0JZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCi0Jb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIGNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLSAgICAgIGVsc2UKLQkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKLQkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQotCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCi0JIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKLQkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQotCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KLQlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcwotCSAgICBkbwotCSAgICAgICRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnCi0JICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICRlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCi0KLQkgIGlmIHRlc3QgLXogIiRnZW50b3AiOyB0aGVuCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAgICRzaG93ICIkbWtkaXIgJGdlbnRvcCIKLQkgICAgJHJ1biAkbWtkaXIgIiRnZW50b3AiCi0JICAgIGV4aXRfc3RhdHVzPSQ/Ci0JICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0JICAgIGZpCi0JICBmaQotCi0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQkgIG9sZG9ianM9Ci0JICBjb3VudGVyPTEKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgb2JqYmFzZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCi0JICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7Ci0JICAgICpbXCAvXSIkb2JqYmFzZSAiKikKLQkgICAgICB3aGlsZSA6OyBkbwotCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbwotCQkjIG92ZXJsYXBzLgotCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQotCQljb3VudGVyPWBleHByICRjb3VudGVyICsgMWAKLQkJY2FzZSAiICRvbGRvYmpzICIgaW4KLQkJKltcIC9dIiRuZXdvYmogIiopIDs7Ci0JCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKLQkJZXNhYwotCSAgICAgIGRvbmUKLQkgICAgICAkc2hvdyAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgJHJ1biBsbiAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIgfHwKLQkgICAgICAkcnVuIGNwICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKLQkgICAgICA7OwotCSAgICAqKSBvbGRvYmpzPSIkb2xkb2JqcyAkb2JqIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLQotCWlmIGxlbj1gZXhwciAiWCRjbWRzIiA6ICIuKiJgICYmCi0JICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKLQllbHNlCi0JICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cwotCSAgJGVjaG8gInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCi0JICBzYXZlX1JBTkxJQj0kUkFOTElCCi0JICBSQU5MSUI9OgotCSAgb2JqbGlzdD0KLQkgIGNvbmNhdF9jbWRzPQotCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCi0KLQkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PwotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBsYXN0X29sZG9iaj0kb2JqCi0JICBkb25lCi0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIG9sZG9ianM9IiRvYmpsaXN0ICRvYmoiCi0JICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgICBpZiBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCi0JICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKLQkgICAgICBvbGRvYmpzPSRvYmpsaXN0Ci0JICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KLQkgICAgICAgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgICAgICBmaQotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCi0JICAgICAgb2JqbGlzdD0KLQkgICAgZmkKLQkgIGRvbmUKLQkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgIG9sZG9ianM9JG9iamxpc3QKLQkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgotCSAgZWxzZQotCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICBldmFsIGNtZD1cIiRjbWRcIgotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KLSAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgotICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICoubGEpCi0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxzZQotCSAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCi0gICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCi0JcmVsaW5rX2NvbW1hbmQ9Ci0gICAgICBmaQotCi0KLSAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KLQkgICAgICBicmVhawotCSAgICBmaQotCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKLQkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgICAqLmxhKQotCQluYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQlmaQotCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKLQkJOzsKLQkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCi0JICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgICAgZmkKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCi0JICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgICAgZmkKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZmkKLQkgICRybSAkb3V0cHV0Ci0JICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KLQkgIHRkbG5hbWU9JGRsbmFtZQotCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCi0JICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OwotCSAgZXNhYwotCSAgJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJHRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPSRpbnN0YWxsZWQKLQotIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KLXNob3VsZG5vdGxpbms9JG1vZHVsZQotCi0jIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KLWRsb3Blbj0nJGRsZmlsZXMnCi1kbHByZW9wZW49JyRkbHByZWZpbGVzJwotCi0jIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46Ci1saWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKLQkgIGZpCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIKLSAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSknIHx8IGV4aXQgJD8KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQotICBpbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCi0KLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKLSAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAkZWNobyAiWCRub25vcHQiIHwgZ3JlcCBzaHRvb2wgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0kbm9ub3B0Ci0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJGFyZyBpbgotICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotICAgICAgYXJnPSJcIiRhcmdcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotCWZpbGVzPSIkZmlsZXMgJGRlc3QiCi0JZGVzdD0kYXJnCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIAotICAgICAgCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KLQkqW1xcXCAvXWNwXCAqKSA7OwotCSopIHByZXY9JGFyZyA7OwotCWVzYWMKLQk7OwotICAgICAgLWcgfCAtbSB8IC1vKSBwcmV2PSRhcmcgOzsKLSAgICAgIC1zKQotCXN0cmlwbWU9IiAtcyIKLQljb250aW51ZQotCTs7Ci0gICAgICAtKikKLQk7OwotICAgICAgKikKLQkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0JaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlc3Q9JGFyZwotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICRkZXN0ZGlyIGluCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0JY2FzZSAkZmlsZSBpbgotCSoubG8pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBzdGF0aWNsaWJzPQotICAgIGZ1dHVyZV9saWJkaXJzPQotICAgIGN1cnJlbnRfbGliZGlycz0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0KLSAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLiRsaWJleHQpCi0JIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KLQlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQlyZWxpbmtfY29tbWFuZD0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICRmaWxlIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLQlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZWxzZQotCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8KLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQotCWRpcj0iJGRpciRvYmpkaXIiCi0KLQlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgotCSAgaW5zdF9wcmVmaXhfZGlyPWAkZWNobyAiJGRlc3RkaXIiIHwgJFNFRCAicyUkbGliZGlyXCQlJSJgCi0KLQkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKLQkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKLQkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCi0JICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQotCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCi0JICBpZiB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKLQkgIGVsc2UKLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKLQkgIGZpCi0KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgotCSAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICBlbHNlCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JZmkKLQotCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0JICByZWFsbmFtZT0iJDIiCi0JICBzaGlmdAotCSAgc2hpZnQKLQotCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgotCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCSAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KLQkgICAgJHNob3cgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAgICRydW4gZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCSAgZmkKLQotCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KLQkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCi0JICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KLQkgICAgZm9yIGxpbmtuYW1lCi0JICAgIGRvCi0JICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgotICAgICAgICAgICAgICAgICRzaG93ICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKLSAgICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgY21kcz0kcG9zdGluc3RhbGxfY21kcwotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgewotCSAgICAgIGx0X2V4aXQ9JD8KLQotCSAgICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCSAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCQkkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKLQkgICAgICBmaQotCi0JICAgICAgZXhpdCAkbHRfZXhpdAotCSAgICB9Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCWNhc2UgJGRlc3RmaWxlIGluCi0JKi5sbykKLQkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICA7OwotCSouJG9iamV4dCkKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotCWZpCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0Ci0JIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bwotCSMgaW5zdGFsbAotCXN0cmlwcGVkX2V4dD0iIgotCWNhc2UgJGZpbGUgaW4KLQkgICouZXhlKQotCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgotCSAgICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKLQkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCi0JICAgIGZpCi0JICAgIDs7Ci0JZXNhYwotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKnwqbWluZ3cqKQotCSAgICB3cmFwcGVyPWAkZWNobyAkZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKLQkgICAgOzsKLQkqKQotCSAgICB3cmFwcGVyPSRmaWxlCi0JICAgIDs7Ci0JZXNhYwotCWlmICgke1NFRH0gLWUgJzRxJyAkd3JhcHBlciB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIik+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIG5vdGluc3RfZGVwbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KLQkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLQkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotCSAgIwotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICR3cmFwcGVyIGluCi0JICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKLQkgICopIC4gLi8ke3dyYXBwZXJ9IDs7Ci0JICBlc2FjCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgaWYgdGVzdCAteiAiJG5vdGluc3RfZGVwbGlicyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgICAgIGNhc2UgJGxpYiBpbgotCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCSAgICAgICopIC4gLi8kbGliIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIHJlbGlua19jb21tYW5kPQotCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCi0JICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCi0JICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKLQkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KLQkgICMKLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkd3JhcHBlciBpbgotCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7Ci0JICAqKSAuIC4vJHt3cmFwcGVyfSA7OwotCSAgZXNhYwotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAotCSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKLQkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCQkke3JtfXIgIiR0bXBkaXIiCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgotCSMgb25lIGFueXdheSAKLQljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KLQkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCi0JICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgotCSAgKi5leGU6Ki5leGUpCi0JICAgICMgdGhpcyBpcyBvawotCSAgICA7OwotCSAgKi5leGU6KikKLQkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQotCSAgICA7OwotCSAgKjoqLmV4ZSkKLQkgICAgZGVzdGZpbGU9YCRlY2hvICRkZXN0ZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCi0JJHNob3cgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIKLQkkcnVuIGV2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgfHwgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQlldmFsIGNtZD1cIiRjbWRcIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKLSAgICBlbHNlCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLSAgICBhZG1pbmNtZHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBjbWRzPSRmaW5pc2hfY21kcwotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZCIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWRzIgotCWZpCi0gICAgICBkb25lCi0gICAgZmkKLQotICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgotICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAkRVhJVF9TVUNDRVNTCi0KLSAgICAkZWNobyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKLSAgICAkZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICAkZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgJGVjaG8KLSAgICAkZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgJGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgICRlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgotICAgICRlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICAkZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICAkZWNobwotICAgICRlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICAkZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgJGVjaG8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICRmaWxlIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICRmaWxlIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0JZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCi0JTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLQkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQotICBjbGVhbiB8IHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKLSAgICBybT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLSAgICBybWZvcmNlPQotICAgIGV4aXRfc3RhdHVzPTAKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OwotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIHJtZGlycz0KLQotICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCi0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIjsgdGhlbgotCWRpcj0uCi0Jb2JqZGlyPSIkb3JpZ29iamRpciIKLSAgICAgIGVsc2UKLQlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCi0gICAgICBmaQotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKLQotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KLQljYXNlICIgJHJtZGlycyAiIGluCi0JICAqIiAkb2JqZGlyICIqKSA7OwotCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KLSAgICAgIGlmICh0ZXN0IC1MICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCi0JfHwgKHRlc3QgLWggIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQk6Ci0gICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgotCWV4aXRfc3RhdHVzPTEKLQljb250aW51ZQotICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgJG5hbWUgaW4KLSAgICAgICoubGEpCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLQkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgotCSAgZG9uZQotCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKLQotCSAgY2FzZSAiJG1vZGUiIGluCi0JICBjbGVhbikKLQkgICAgY2FzZSAiICAkbGlicmFyeV9uYW1lcyAiIGluCi0JICAgICMgIiAgIiBpbiB0aGUgYmVnaW5uaW5nIGNhdGNoZXMgZW1wdHkgJGRsbmFtZQotCSAgICAqIiAkZGxuYW1lICIqKSA7OwotCSAgICAqKSBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRkbG5hbWUiIDs7Ci0JICAgIGVzYWMKLQkgICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKLQkgICAgOzsKLQkgIHVuaW5zdGFsbCkKLQkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiCi0JCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCi0JCSAgZXhpdF9zdGF0dXM9MQotCQlmaQotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGNtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIKLQkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KLQkJICBleGl0X3N0YXR1cz0xCi0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgLiAkZGlyLyRuYW1lCi0KLQkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgotCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiIFwKLQkgICAgICYmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiIFwKLQkgICAgICYmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqKQotCWlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuIDsgdGhlbgotCSAgbm9leGVuYW1lPSRuYW1lCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICBub2V4ZW5hbWU9YCRlY2hvICRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AKLQkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAotCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCi0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KLQkgIGlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgICAuICRkaXIvJG5vZXhlbmFtZQotCi0JICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5Ci0JICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCi0JICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCi0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKLSAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKLSAgICBkb25lCi0gICAgb2JqZGlyPSIkb3JpZ29iamRpciIKLQotICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcwotICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KLSAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JJHNob3cgInJtZGlyICRkaXIiCi0JJHJ1biBybWRpciAkZGlyID4vZGV2L251bGwgMj4mMQotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBleGl0ICRleGl0X3N0YXR1cwotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC16ICIkZXhlY19jbWQiOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi1maSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCi0KLWlmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KLSAgZXZhbCBleGVjICRleGVjX2NtZAotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLSMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgotY2FzZSAkbW9kZSBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLSAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdGFnPVRBRyAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0KLU1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgotICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgOzsKLQotY2xlYW4pCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKLXdpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotY29tcGlsZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKLQotQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKLSAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKLSAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5Ci0gIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICA7OwotCi1leGVjdXRlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICA7OwotCi1maW5pc2gpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgOzsKLQotaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQotQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCi0gIDs7Ci0KLWxpbmspCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgotCi1MaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCi1jcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotCi1MSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKLWEgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKLSAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCi0gIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQotICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCi0gIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCi0gIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCi0gIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCi0gIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAotICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLQkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gIDs7Ci0KLXVuaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotKikKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIDs7Ci1lc2FjCi0KLSRlY2hvCi0kZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgotCi1leGl0ICQ/Ci0KLSMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCi0jIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZwotIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKLSMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCi0jIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAotIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAotIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCi0jIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCi0jIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5Ci0jIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KLQotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotZGlzYWJsZV9saWJzPXNoYXJlZAotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKLQotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYwotZGlzYWJsZV9saWJzPXN0YXRpYwotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBDWFgKLQotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYW5kcm9pZC1kZXY6Ci0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSIvYmluL2Jhc2giCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz15ZXMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9eWVzCi0KLSMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbmVlZF9sYz1ubwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKLWFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz1ubwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD15ZXMKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPQotaG9zdD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3Rfb3M9bGludXgtZ251Ci0KLSMgVGhlIGJ1aWxkIHN5c3RlbS4KLWJ1aWxkX2FsaWFzPQotYnVpbGQ9eDg2XzY0LXVua25vd24tbGludXgtZ251Ci1idWlsZF9vcz1saW51eC1nbnUKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSJlY2hvIgotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSJhciIKLUFSX0ZMQUdTPSJjcnUiCi0KLSMgQSBDIGNvbXBpbGVyLgotTFRDQz0iZ2NjIgotCi0jIExUQ0MgY29tcGlsZXIgZmxhZ3MuCi1MVENGTEFHUz0iLWcgLU8yIC1XYWxsIgotCi0jIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCi1DQz0iZysrIgotCi0jIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Ci13aXRoX2djYz15ZXMKLQotIyBBbiBFUkUgbWF0Y2hlci4KLUVHUkVQPSIvYmluL2dyZXAgLUUiCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSIvdXNyL2Jpbi9sZCAtbSBlbGZfeDg2XzY0IgotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSJsbiAtcyIKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0iL3Vzci9iaW4vbm0gLUIiCi0KLSMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KLVNUUklQPSJzdHJpcCIKLQotIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgotTUFHSUNfQ01EPWZpbGUKLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSJkbGx0b29sIgotCi0jIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgotT0JKRFVNUD0ib2JqZHVtcCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9ImFzIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0ubGlicwotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0iIC1yIgotcmVsb2FkX2NtZHM9IlwkTERcJHJlbG9hZF9mbGFnIC1vIFwkb3V0cHV0XCRyZWxvYWRfb2JqcyIKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9Ii1XbCwiCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSJvIgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iYSIKLQotIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KLXNocmV4dF9jbWRzPScuc28nCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9IiAtZlBJQyAtRFBJQyIKLXBpY19tb2RlPWRlZmF1bHQKLQotIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/Ci1tYXhfY21kX2xlbj0zMjc2OAotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0ieWVzIgotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPwotbmVlZF9sb2Nrcz0ibm8iCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD1ubwotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249bm8KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc3VwcG9ydD11bmtub3duCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9dW5rbm93bgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9Ii1zdGF0aWMiCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0iIC1mbm8tYnVpbHRpbiIKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSJcJHt3bH0tLWV4cG9ydC1keW5hbWljIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSJcJHt3bH0tLXdob2xlLWFyY2hpdmVcJGNvbnZlbmllbmNlIFwke3dsfS0tbm8td2hvbGUtYXJjaGl2ZSIKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9IiIKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT1saW51eAotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSJsaWJcJG5hbWUiCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0iXCR7bGlibmFtZX1cJHtyZWxlYXNlfVwke3NoYXJlZF9leHR9XCR2ZXJzdWZmaXggXCR7bGlibmFtZX1cJHtyZWxlYXNlfVwke3NoYXJlZF9leHR9XCRtYWpvciBcJGxpYm5hbWVcJHtzaGFyZWRfZXh0fSIKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSJcJHtsaWJuYW1lfVwke3JlbGVhc2V9XCR7c2hhcmVkX2V4dH1cJG1ham9yIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9InJhbmxpYiIKLW9sZF9hcmNoaXZlX2NtZHM9IlwkQVIgXCRBUl9GTEFHUyBcJG9sZGxpYlwkb2xkb2Jqc1wkb2xkX2RlcGxpYnN+XCRSQU5MSUIgXCRvbGRsaWIiCi1vbGRfcG9zdGluc3RhbGxfY21kcz0iY2htb2QgNjQ0IFwkb2xkbGliflwkUkFOTElCIFwkb2xkbGliIgotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0iIgotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSIiCi0KLSMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9IiIKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9IlwkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgXCRwcmVkZXBfb2JqZWN0cyBcJGxpYm9ianMgXCRkZXBsaWJzIFwkcG9zdGRlcF9vYmplY3RzIFwkY29tcGlsZXJfZmxhZ3MgXCR7d2x9LXNvbmFtZSBcJHdsXCRzb25hbWUgLW8gXCRsaWIiCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDIC1zaGFyZWQgLW5vc3RkbGliIFwkcHJlZGVwX29iamVjdHMgXCRsaWJvYmpzIFwkZGVwbGlicyBcJHBvc3RkZXBfb2JqZWN0cyBcJGNvbXBpbGVyX2ZsYWdzIFwke3dsfS1zb25hbWUgXCR3bFwkc29uYW1lIFwke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlIFwkd2xcJGV4cG9ydF9zeW1ib2xzIC1vIFwkbGliIgotcG9zdGluc3RhbGxfY21kcz0iIgotcG9zdHVuaW5zdGFsbF9jbWRzPSIiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQotbW9kdWxlX2NtZHM9IiIKLW1vZHVsZV9leHBzeW1fY21kcz0iIgotCi0jIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KLW9sZF9zdHJpcGxpYj0ic3RyaXAgLS1zdHJpcC1kZWJ1ZyIKLXN0cmlwbGliPSJzdHJpcCAtLXN0cmlwLXVubmVlZGVkIgotCi0jIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCi0jIHNoYXJlZCBsaWJyYXJ5LgotcHJlZGVwX29iamVjdHM9Ii91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi94ODZfNjQtbGludXgtZ251L2NydGkubyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvY3J0YmVnaW5TLm8iCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBfb2JqZWN0cz0iL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43L2NydGVuZFMubyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS9jcnRuLm8iCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1wcmVkZXBzPSIiCi0KLSMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQotIyBzaGFyZWQgbGlicmFyeS4KLXBvc3RkZXBzPSItbHN0ZGMrKyAtbG0gLWxnY2NfcyAtbGMgLWxnY2NfcyIKLQotIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZwotIyBhIHNoYXJlZCBsaWJyYXJ5LgotY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSItTC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNyAtTC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi94ODZfNjQtbGludXgtZ251IC1ML3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uLy4uL2xpYiAtTC9saWIveDg2XzY0LWxpbnV4LWdudSAtTC9saWIvLi4vbGliIC1ML3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSAtTC91c3IvbGliLy4uL2xpYiAtTC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLiIKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSJwYXNzX2FsbCIKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCi1maWxlX21hZ2ljX2NtZD0iXCRNQUdJQ19DTUQiCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0iIgotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0iIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSJQQVRIPVxcXCJcXFwkUEFUSDovc2JpblxcXCIgbGRjb25maWcgLW4gXCRsaWJkaXIiCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSIiCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cXChbQUJDREdJUlNUV11bQUJDREdJUlNUV10qXFwpWyAJXVsgCV0qXFwoW19BLVphLXpdW19BLVphLXowLTldKlxcKVwkL1xcMSBcXDIgXFwyL3AnIgotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcXCguKlxcKVwkL2V4dGVybiBpbnQgXFwxOy9wJyIKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKLWdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcXChbXiBdKlxcKSBcJC8gIHtcXFwiXFwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL15bQkNERUdSU1RdIFxcKFteIF0qXFwpIFxcKFteIF0qXFwpXCQvICB7XCJcXDJcIiwgKGx0X3B0cikgXFwmXFwyfSwvcCciCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLQotIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgotaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0jIEZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSJcJHt3bH0tLXJwYXRoIFwke3dsfVwkbGliZGlyIgotCi0jIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50bwotIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMKLSMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0iIgotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iIgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PW5vCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPW5vCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0KLSMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5Ci0jIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgotaGFyZGNvZGVfYXV0b21hdGljPW5vCi0KLSMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCi0jIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggTERfTElCUkFSWV9QQVRIIExEX1JVTl9QQVRIIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKLQotIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCi1saW5rX2FsbF9kZXBsaWJzPXVua25vd24KLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iIC91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8gL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uLy4uL3g4Nl82NC1saW51eC1nbnUvbGliL3g4Nl82NC1saW51eC1nbnUvNC43LyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS9saWIveDg2XzY0LWxpbnV4LWdudS8gL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uLy4uL3g4Nl82NC1saW51eC1nbnUvbGliLy4uL2xpYi8gL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uL3g4Nl82NC1saW51eC1nbnUvNC43LyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4veDg2XzY0LWxpbnV4LWdudS8gL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uLy4uL2xpYi8gL2xpYi94ODZfNjQtbGludXgtZ251LzQuNy8gL2xpYi94ODZfNjQtbGludXgtZ251LyAvbGliLy4uL2xpYi8gL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS80LjcvIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvIC91c3IvbGliLy4uL2xpYi8gL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC43Ly4uLy4uLy4uLy4uL3g4Nl82NC1saW51eC1nbnUvbGliLyAvdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vIC9saWIvIC91c3IvbGliLyIKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL2xpYi94ODZfNjQtbGludXgtZ251IC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUgL2xpYjMyIC91c3IvbGliMzIgIgotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9IlwkTk0gXCRsaWJvYmpzIFwkY29udmVuaWVuY2UgfCBcJGdsb2JhbF9zeW1ib2xfcGlwZSB8IFwkU0VEICdzLy4qIC8vJyB8IHNvcnQgfCB1bmlxID4gXCRleHBvcnRfc3ltYm9scyIKLQotIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotZXh0cmFjdF9leHBzeW1zX2NtZHM9IiIKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSIiCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSIiCi0KLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IENYWAotCmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQucGMgYi9saWJ2bmNjbGllbnQucGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Njg5OWIuLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50LnBjCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSR7cHJlZml4fQotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotCi1OYW1lOiBMaWJWTkNDbGllbnQKLURlc2NyaXB0aW9uOiBBIGxpYnJhcnkgZm9yIGVhc3kgaW1wbGVtZW50YXRpb24gb2YgYSBWTkMgY2xpZW50LgotVmVyc2lvbjogMC45LjkKLVJlcXVpcmVzOgotTGliczogLUwke2xpYmRpcn0gLWx2bmNjbGllbnQgLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQotCmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQucGMuaW4gYi9saWJ2bmNjbGllbnQucGMuaW4KaW5kZXggMTQzZGM0Ni4uMzc0OTVlNyAxMDA2NDQKLS0tIGEvbGlidm5jY2xpZW50LnBjLmluCisrKyBiL2xpYnZuY2NsaWVudC5wYy5pbgpAQCAtNyw2ICs3LDggQEAKIERlc2NyaXB0aW9uOiBBIGxpYnJhcnkgZm9yIGVhc3kgaW1wbGVtZW50YXRpb24gb2YgYSBWTkMgY2xpZW50LgogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczoKLUxpYnM6IC1MJHtsaWJkaXJ9IC1sdm5jY2xpZW50IEBMSUJTQCBAV1NPQ0tMSUJACitSZXF1aXJlcy5wcml2YXRlOiB6bGliCitMaWJzOiAtTCR7bGliZGlyfSAtbHZuY2NsaWVudAorTGlicy5wcml2YXRlOiBATElCU0AgQFdTT0NLTElCQAogQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KIApkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50Ly5kZXBzL2N1cnNvci5QbG8gYi9saWJ2bmNjbGllbnQvLmRlcHMvY3Vyc29yLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNjbGllbnQvLmRlcHMvY3Vyc29yLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY2NsaWVudC8uZGVwcy9saXN0ZW4uUGxvIGIvbGlidm5jY2xpZW50Ly5kZXBzL2xpc3Rlbi5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50Ly5kZXBzL2xpc3Rlbi5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvLmRlcHMvbWluaWx6by5QbG8gYi9saWJ2bmNjbGllbnQvLmRlcHMvbWluaWx6by5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50Ly5kZXBzL21pbmlsem8uUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50Ly5kZXBzL3JmYnByb3RvLlBsbyBiL2xpYnZuY2NsaWVudC8uZGVwcy9yZmJwcm90by5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50Ly5kZXBzL3JmYnByb3RvLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY2NsaWVudC8uZGVwcy9zb2NrZXRzLlBsbyBiL2xpYnZuY2NsaWVudC8uZGVwcy9zb2NrZXRzLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNjbGllbnQvLmRlcHMvc29ja2V0cy5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvLmRlcHMvdGxzX2dudXRscy5QbG8gYi9saWJ2bmNjbGllbnQvLmRlcHMvdGxzX2dudXRscy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50Ly5kZXBzL3Rsc19nbnV0bHMuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50Ly5kZXBzL3Rsc19ub25lLlBsbyBiL2xpYnZuY2NsaWVudC8uZGVwcy90bHNfbm9uZS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jY2xpZW50Ly5kZXBzL3Rsc19ub25lLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY2NsaWVudC8uZGVwcy90bHNfb3BlbnNzbC5QbG8gYi9saWJ2bmNjbGllbnQvLmRlcHMvdGxzX29wZW5zc2wuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY2NsaWVudC8uZGVwcy90bHNfb3BlbnNzbC5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvLmRlcHMvdm5jdmlld2VyLlBsbyBiL2xpYnZuY2NsaWVudC8uZGVwcy92bmN2aWV3ZXIuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY2NsaWVudC8uZGVwcy92bmN2aWV3ZXIuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50L01ha2VmaWxlIGIvbGlidm5jY2xpZW50L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjFmZWQwLi4wMDAwMDAwCi0tLSBhL2xpYnZuY2NsaWVudC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgbGlidm5jY2xpZW50L01ha2VmaWxlLiAgR2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotCi0KLQotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0xpYlZOQ1NlcnZlcgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9MaWJWTkNTZXJ2ZXIKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotc3ViZGlyID0gbGlidm5jY2xpZW50Ci1ESVNUX0NPTU1PTiA9ICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLWFtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOwotYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKLSAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotICAgICopIGY9JCRwOzsgXAotICBlc2FjOwotYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotYW1fX2luc3RhbGxfbWF4ID0gNDAKLWFtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCi0gIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKLWFtX19ub2Jhc2Vfc3RyaXAgPSBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgotYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAotICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAotICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCi0gICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAotICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAotICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKLWFtX19iYXNlX2xpc3QgPSBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKLWFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKLSAgdGVzdCAteiAiJCRmaWxlcyIgXAotICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAotICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLSAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKLSAgfQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiCi1MVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKQotYW1fX0RFUEVOREVOQ0lFU18xID0KLWxpYnZuY2NsaWVudF9sYV9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKLWFtX19saWJ2bmNjbGllbnRfbGFfU09VUkNFU19ESVNUID0gY3Vyc29yLmMgbGlzdGVuLmMgcmZicHJvdG8uYyBcCi0Jc29ja2V0cy5jIHZuY3ZpZXdlci5jIC4uL2NvbW1vbi9taW5pbHpvLmMgdGxzX25vbmUuYyBcCi0JdGxzX29wZW5zc2wuYyB0bHNfZ251dGxzLmMKLWFtX19vYmplY3RzXzEgPSB0bHNfbm9uZS5sbwotI2FtX19vYmplY3RzXzEgPSB0bHNfb3BlbnNzbC5sbwotI2FtX19vYmplY3RzXzEgPSB0bHNfZ251dGxzLmxvCi1hbV9saWJ2bmNjbGllbnRfbGFfT0JKRUNUUyA9IGN1cnNvci5sbyBsaXN0ZW4ubG8gcmZicHJvdG8ubG8gXAotCXNvY2tldHMubG8gdm5jdmlld2VyLmxvIG1pbmlsem8ubG8gJChhbV9fb2JqZWN0c18xKQotbGlidm5jY2xpZW50X2xhX09CSkVDVFMgPSAkKGFtX2xpYnZuY2NsaWVudF9sYV9PQkpFQ1RTKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfJChWKSkKLWFtX192X2x0XyA9ICQoYW1fX3ZfbHRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9sdF8wID0gLS1zaWxlbnQKLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9ICQobGlidm5jY2xpZW50X2xhX1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGFtX19saWJ2bmNjbGllbnRfbGFfU09VUkNFU19ESVNUKQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLUhFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYWNsb2NhbC0xLjExCi1BTVRBUiA9ICQke1RBUi10YXJ9Ci1BTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IDAKLUFSID0gL3Vzci9iaW4vYXIKLUFTID0gYXMKLUFVVE9DT05GID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9jb25mCi1BVVRPSEVBREVSID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKLUFVVE9NQUtFID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLTEuMTEKLUFWQUhJX0NGTEFHUyA9IAotQVZBSElfTElCUyA9IAotQVdLID0gbWF3awotQ0MgPSBnY2MKLUNDREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ0ZMQUdTID0gLWcgLU8yIC1XYWxsICAKLUNQUCA9IGdjYyAtRQotQ1BQRkxBR1MgPSAKLUNSWVBUX0xJQlMgPSAtbGNyeXB0Ci1DWFggPSBnKysKLUNYWENQUCA9IGcrKyAtRQotQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ1hYRkxBR1MgPSAtZyAtTzIKLUNZR1BBVEhfVyA9IGVjaG8KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLURFUERJUiA9IC5kZXBzCi1ETExUT09MID0gZGxsdG9vbAotRUNITyA9IGVjaG8KLUVDSE9fQyA9IAotRUNIT19OID0gLW4KLUVDSE9fVCA9IAotRUdSRVAgPSAvYmluL2dyZXAgLUUKLUVYRUVYVCA9IAotRjc3ID0gCi1GRkxBR1MgPSAKLUdOVVRMU19DRkxBR1MgPSAKLUdOVVRMU19MSUJTID0gCi1HUkVQID0gL2Jpbi9ncmVwCi1HVEtfQ0ZMQUdTID0gCi1HVEtfTElCUyA9IAotSU5TVEFMTCA9IC91c3IvYmluL2luc3RhbGwgLWMKLUlOU1RBTExfREFUQSA9ICR7SU5TVEFMTH0gLW0gNjQ0Ci1JTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMgLXMKLUpQRUdfTERGTEFHUyA9IAotTERGTEFHUyA9IAotTElCR0NSWVBUX0NGTEFHUyA9IAotTElCR0NSWVBUX0NPTkZJRyA9IG5vCi1MSUJHQ1JZUFRfTElCUyA9IAotTElCT0JKUyA9IAotTElCUyA9IC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgCi1MSUJUT09MID0gJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wKLUxOX1MgPSBsbiAtcwotTFRMSUJPQkpTID0gCi1NQUtFSU5GTyA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBtYWtlaW5mbwotTUtESVJfUCA9IC9iaW4vbWtkaXIgLXAKLU9CSkRVTVAgPSBvYmpkdW1wCi1PQkpFWFQgPSBvCi1QQUNLQUdFID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX0JVR1JFUE9SVCA9IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyCi1QQUNLQUdFX05BTUUgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfU1RSSU5HID0gTGliVk5DU2VydmVyIDAuOS45Ci1QQUNLQUdFX1RBUk5BTUUgPSBsaWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfVVJMID0gCi1QQUNLQUdFX1ZFUlNJT04gPSAwLjkuOQotUEFUSF9TRVBBUkFUT1IgPSA6Ci1QS0dfQ09ORklHID0gL3Vzci9iaW4vcGtnLWNvbmZpZwotUEtHX0NPTkZJR19MSUJESVIgPSAKLVBLR19DT05GSUdfUEFUSCA9IAotUkFOTElCID0gcmFubGliCi1SUE1TT1VSQ0VESVIgPSBOT1QtRk9VTkQKLVNETF9DRkxBR1MgPSAKLVNETF9MSUJTID0gCi1TRVRfTUFLRSA9IAotU0hFTEwgPSAvYmluL2Jhc2gKLVNTTF9MSUJTID0gCi1TVFJJUCA9IHN0cmlwCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyA9IAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gCi1WRVJTSU9OID0gMC45LjkKLVdTT0NLTElCID0gCi1YTUtNRiA9IAotWF9DRkxBR1MgPSAKLVhfRVhUUkFfTElCUyA9IAotWF9MSUJTID0gCi1YX1BSRV9MSUJTID0gIC1sU00gLWxJQ0UKLWFic19idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbGlidm5jY2xpZW50Ci1hYnNfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9saWJ2bmNjbGllbnQKLWFic190b3BfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hYnNfdG9wX3NyY2RpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFjX2N0X0NDID0gZ2NjCi1hY19jdF9DWFggPSBnKysKLWFjX2N0X0Y3NyA9IAotYW1fX2luY2x1ZGUgPSBpbmNsdWRlCi1hbV9fbGVhZGluZ19kb3QgPSAuCi1hbV9fcXVvdGUgPSAKLWFtX190YXIgPSAkJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIgotYW1fX3VudGFyID0gJCR7VEFSLXRhcn0geGYgLQotYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCi1idWlsZCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotYnVpbGRfYWxpYXMgPSAKLWJ1aWxkX2NwdSA9IHg4Nl82NAotYnVpbGRfb3MgPSBsaW51eC1nbnUKLWJ1aWxkX3ZlbmRvciA9IHVua25vd24KLWJ1aWxkZGlyID0gLgotZGF0YWRpciA9ICR7ZGF0YXJvb3RkaXJ9Ci1kYXRhcm9vdGRpciA9ICR7cHJlZml4fS9zaGFyZQotZG9jZGlyID0gJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfQotZHZpZGlyID0gJHtkb2NkaXJ9Ci1leGVjX3ByZWZpeCA9ICR7cHJlZml4fQotaG9zdCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF9hbGlhcyA9IAotaG9zdF9jcHUgPSB4ODZfNjQKLWhvc3Rfb3MgPSBsaW51eC1nbnUKLWhvc3RfdmVuZG9yID0gdW5rbm93bgotaHRtbGRpciA9ICR7ZG9jZGlyfQotaW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCi1pbmZvZGlyID0gJHtkYXRhcm9vdGRpcn0vaW5mbwotaW5zdGFsbF9zaCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaAotbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCi1saWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYwotbG9jYWxlZGlyID0gJHtkYXRhcm9vdGRpcn0vbG9jYWxlCi1sb2NhbHN0YXRlZGlyID0gJHtwcmVmaXh9L3ZhcgotbWFuZGlyID0gJHtkYXRhcm9vdGRpcn0vbWFuCi1ta2Rpcl9wID0gL2Jpbi9ta2RpciAtcAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotcGRmZGlyID0gJHtkb2NkaXJ9Ci1wcmVmaXggPSAvdXNyL2xvY2FsCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcyx4LHgsCi1wc2RpciA9ICR7ZG9jZGlyfQotc2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L3NiaW4KLXNoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQotc3JjZGlyID0gLgotc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKLXRhcmdldF9hbGlhcyA9IAotdG9wX2J1aWxkX3ByZWZpeCA9IC4uLwotdG9wX2J1aWxkZGlyID0gLi4KLXRvcF9zcmNkaXIgPSAuLgotd2l0aF9mZm1wZWcgPSAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KLVRMU1NSQ1MgPSB0bHNfbm9uZS5jCi0jVExTU1JDUyA9IHRsc19vcGVuc3NsLmMgCi0jVExTU1JDUyA9IHRsc19nbnV0bHMuYwotI1RMU0xJQlMgPSAgLWxjcnlwdAotI1RMU0xJQlMgPSAKLWxpYnZuY2NsaWVudF9sYV9TT1VSQ0VTID0gY3Vyc29yLmMgbGlzdGVuLmMgcmZicHJvdG8uYyBzb2NrZXRzLmMgdm5jdmlld2VyLmMgLi4vY29tbW9uL21pbmlsem8uYyAkKFRMU1NSQ1MpCi1saWJ2bmNjbGllbnRfbGFfTElCQUREID0gJChUTFNMSUJTKQotbm9pbnN0X0hFQURFUlMgPSAuLi9jb21tb24vbHpvZGVmcy5oIC4uL2NvbW1vbi9sem9jb25mLmggLi4vY29tbW9uL21pbmlsem8uaCB0bHMuaAotRVhUUkFfRElTVCA9IGNvcnJlLmMgaGV4dGlsZS5jIHJyZS5jIHRpZ2h0LmMgemxpYi5jIHpybGUuYyB1bHRyYS5jIHRsc19nbnV0bHMuYyB0bHNfb3BlbnNzbC5jIHRsc19ub25lLmMKLWxpYl9MVExJQlJBUklFUyA9IGxpYnZuY2NsaWVudC5sYQotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBsaWJ2bmNjbGllbnQvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgbGlidm5jY2xpZW50L01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCi0JbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmU7IFwKLQl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGxpYmRpcikiIHx8IGV4aXQgMTsgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICIkKERFU1RESVIpJChsaWJkaXIpIjsgXAotCX0KLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IHRlc3QgLW4gIiQobGliZGlyKSIgfHwgbGlzdD07IFwKLQlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkZiciOyBcCi0JICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCi0JZG9uZQotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCi0JICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKLQkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKLQkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKLQlkb25lCi1saWJ2bmNjbGllbnQubGE6ICQobGlidm5jY2xpZW50X2xhX09CSkVDVFMpICQobGlidm5jY2xpZW50X2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJ2bmNjbGllbnRfbGFfREVQRU5ERU5DSUVTKSAKLQkkKEFNX1ZfQ0NMRCkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJ2bmNjbGllbnRfbGFfT0JKRUNUUykgJChsaWJ2bmNjbGllbnRfbGFfTElCQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLWluY2x1ZGUgLi8kKERFUERJUikvY3Vyc29yLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9saXN0ZW4uUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL21pbmlsem8uUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3JmYnByb3RvLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9zb2NrZXRzLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS90bHNfZ251dGxzLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS90bHNfbm9uZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvdGxzX29wZW5zc2wuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3ZuY3ZpZXdlci5QbG8KLQotLmMubzoKLQkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotLmMubG86Ci0JJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMVENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLW1pbmlsem8ubG86IC4uL2NvbW1vbi9taW5pbHpvLmMKLQkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbmlsem8ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL21pbmlsem8uVHBvIC1jIC1vIG1pbmlsem8ubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9taW5pbHpvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9taW5pbHpvLmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9taW5pbHpvLlRwbyAkKERFUERJUikvbWluaWx6by5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL21pbmlsem8uYycgb2JqZWN0PSdtaW5pbHpvLmxvJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaWx6by5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL21pbmlsem8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21pbmlsem8uYwotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKEhFQURFUlMpCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChsaWJkaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcGRmLWFtOgotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY3RhZ3MgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAotCWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAotCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCi0JaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKLQltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCi0JdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotCi0KLXJmYnByb3RvLm86IHJmYnByb3RvLmMgY29ycmUuYyBoZXh0aWxlLmMgcnJlLmMgdGlnaHQuYyB6bGliLmMgenJsZS5jIHVsdHJhLmMKLQotJChsaWJ2bmNjbGllbnRfbGFfT0JKRUNUUyk6IC4uL3JmYi9yZmJjbGllbnQuaAotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvTWFrZWZpbGUuYW0gYi9saWJ2bmNjbGllbnQvTWFrZWZpbGUuYW0KaW5kZXggYmYwNWEzOS4uNzZiZWQyMSAxMDA2NDQKLS0tIGEvbGlidm5jY2xpZW50L01ha2VmaWxlLmFtCisrKyBiL2xpYnZuY2NsaWVudC9NYWtlZmlsZS5hbQpAQCAtMSw0ICsxLDQgQEAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KIAogaWYgSEFWRV9HTlVUTFMKIFRMU1NSQ1MgPSB0bHNfZ251dGxzLmMKQEAgLTE0LDEzICsxNCwxMyBAQAogCiAKIGxpYnZuY2NsaWVudF9sYV9TT1VSQ0VTPWN1cnNvci5jIGxpc3Rlbi5jIHJmYnByb3RvLmMgc29ja2V0cy5jIHZuY3ZpZXdlci5jIC4uL2NvbW1vbi9taW5pbHpvLmMgJChUTFNTUkNTKQotbGlidm5jY2xpZW50X2xhX0xJQkFERD0kKFRMU0xJQlMpCitsaWJ2bmNjbGllbnRfbGFfTElCQUREPSQoVExTTElCUykgJChWQV9MSUJTKQogCiBub2luc3RfSEVBREVSUz0uLi9jb21tb24vbHpvZGVmcy5oIC4uL2NvbW1vbi9sem9jb25mLmggLi4vY29tbW9uL21pbmlsem8uaCB0bHMuaAogCiByZmJwcm90by5vOiByZmJwcm90by5jIGNvcnJlLmMgaGV4dGlsZS5jIHJyZS5jIHRpZ2h0LmMgemxpYi5jIHpybGUuYyB1bHRyYS5jCiAKLUVYVFJBX0RJU1Q9Y29ycmUuYyBoZXh0aWxlLmMgcnJlLmMgdGlnaHQuYyB6bGliLmMgenJsZS5jIHVsdHJhLmMgdGxzX2dudXRscy5jIHRsc19vcGVuc3NsLmMgdGxzX25vbmUuYworRVhUUkFfRElTVD1jb3JyZS5jIGhleHRpbGUuYyBycmUuYyB0aWdodC5jIHpsaWIuYyB6cmxlLmMgdWx0cmEuYyB0bHNfZ251dGxzLmMgdGxzX29wZW5zc2wuYyB0bHNfbm9uZS5jIGgyNjQuYwogCiAkKGxpYnZuY2NsaWVudF9sYV9PQkpFQ1RTKTogLi4vcmZiL3JmYmNsaWVudC5oCiAKZGlmZiAtLWdpdCBhL2xpYnZuY2NsaWVudC9NYWtlZmlsZS5pbiBiL2xpYnZuY2NsaWVudC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhOTQxMi4uMDAwMDAwMAotLS0gYS9saWJ2bmNjbGllbnQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi0KLVZQQVRIID0gQHNyY2RpckAKLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1zdWJkaXIgPSBsaWJ2bmNjbGllbnQKLURJU1RfQ09NTU9OID0gJChub2luc3RfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7Ci1hbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAotICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCi0gICAgKikgZj0kJHA7OyBcCi0gIGVzYWM7Ci1hbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7Ci1hbV9faW5zdGFsbF9tYXggPSA0MAotYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKLSAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAotYW1fX25vYmFzZV9zdHJpcCA9IFwKLSAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCi1hbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCi0gIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCi0gICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKLSAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCi0gICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCi0gICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JwotYW1fX2Jhc2VfbGlzdCA9IFwKLSAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKLSAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJwotYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAotICB0ZXN0IC16ICIkJGZpbGVzIiBcCi0gICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCi0gICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAotICB9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIKLUxUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCi1hbV9fREVQRU5ERU5DSUVTXzEgPQotbGlidm5jY2xpZW50X2xhX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKQotYW1fX2xpYnZuY2NsaWVudF9sYV9TT1VSQ0VTX0RJU1QgPSBjdXJzb3IuYyBsaXN0ZW4uYyByZmJwcm90by5jIFwKLQlzb2NrZXRzLmMgdm5jdmlld2VyLmMgLi4vY29tbW9uL21pbmlsem8uYyB0bHNfbm9uZS5jIFwKLQl0bHNfb3BlbnNzbC5jIHRsc19nbnV0bHMuYwotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9GQUxTRUBhbV9fb2JqZWN0c18xID0gdGxzX25vbmUubG8KLUBIQVZFX0dOVVRMU19GQUxTRUBASEFWRV9MSUJTU0xfVFJVRUBhbV9fb2JqZWN0c18xID0gdGxzX29wZW5zc2wubG8KLUBIQVZFX0dOVVRMU19UUlVFQGFtX19vYmplY3RzXzEgPSB0bHNfZ251dGxzLmxvCi1hbV9saWJ2bmNjbGllbnRfbGFfT0JKRUNUUyA9IGN1cnNvci5sbyBsaXN0ZW4ubG8gcmZicHJvdG8ubG8gXAotCXNvY2tldHMubG8gdm5jdmlld2VyLmxvIG1pbmlsem8ubG8gJChhbV9fb2JqZWN0c18xKQotbGlidm5jY2xpZW50X2xhX09CSkVDVFMgPSAkKGFtX2xpYnZuY2NsaWVudF9sYV9PQkpFQ1RTKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDX0BBTV9WQCkKLWFtX192X0NDXyA9ICQoYW1fX3ZfQ0NfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1BTV9WX0NDTEQgPSAkKGFtX192X0NDTERfQEFNX1ZAKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1TT1VSQ0VTID0gJChsaWJ2bmNjbGllbnRfbGFfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQoYW1fX2xpYnZuY2NsaWVudF9sYV9TT1VSQ0VTX0RJU1QpCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotSEVBREVSUyA9ICQobm9pbnN0X0hFQURFUlMpCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQU1UQVIgPSBAQU1UQVJACi1BTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IEBBTV9ERUZBVUxUX1ZFUkJPU0lUWUAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVZBSElfQ0ZMQUdTID0gQEFWQUhJX0NGTEFHU0AKLUFWQUhJX0xJQlMgPSBAQVZBSElfTElCU0AKLUFXSyA9IEBBV0tACi1DQyA9IEBDQ0AKLUNDREVQTU9ERSA9IEBDQ0RFUE1PREVACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ1JZUFRfTElCUyA9IEBDUllQVF9MSUJTQAotQ1hYID0gQENYWEAKLUNYWENQUCA9IEBDWFhDUFBACi1DWFhERVBNT0RFID0gQENYWERFUE1PREVACi1DWFhGTEFHUyA9IEBDWFhGTEFHU0AKLUNZR1BBVEhfVyA9IEBDWUdQQVRIX1dACi1ERUZTID0gQERFRlNACi1ERVBESVIgPSBAREVQRElSQAotRExMVE9PTCA9IEBETExUT09MQAotRUNITyA9IEBFQ0hPQAotRUNIT19DID0gQEVDSE9fQ0AKLUVDSE9fTiA9IEBFQ0hPX05ACi1FQ0hPX1QgPSBARUNIT19UQAotRUdSRVAgPSBARUdSRVBACi1FWEVFWFQgPSBARVhFRVhUQAotRjc3ID0gQEY3N0AKLUZGTEFHUyA9IEBGRkxBR1NACi1HTlVUTFNfQ0ZMQUdTID0gQEdOVVRMU19DRkxBR1NACi1HTlVUTFNfTElCUyA9IEBHTlVUTFNfTElCU0AKLUdSRVAgPSBAR1JFUEAKLUdUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKLUdUS19MSUJTID0gQEdUS19MSUJTQAotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACi1KUEVHX0xERkxBR1MgPSBASlBFR19MREZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCR0NSWVBUX0NGTEFHUyA9IEBMSUJHQ1JZUFRfQ0ZMQUdTQAotTElCR0NSWVBUX0NPTkZJRyA9IEBMSUJHQ1JZUFRfQ09ORklHQAotTElCR0NSWVBUX0xJQlMgPSBATElCR0NSWVBUX0xJQlNACi1MSUJPQkpTID0gQExJQk9CSlNACi1MSUJTID0gQExJQlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1MVExJQk9CSlMgPSBATFRMSUJPQkpTQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0RJUl9QID0gQE1LRElSX1BACi1PQkpEVU1QID0gQE9CSkRVTVBACi1PQkpFWFQgPSBAT0JKRVhUQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACi1QQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAotUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACi1QQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAotUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACi1QQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAotUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACi1QS0dfQ09ORklHID0gQFBLR19DT05GSUdACi1QS0dfQ09ORklHX0xJQkRJUiA9IEBQS0dfQ09ORklHX0xJQkRJUkAKLVBLR19DT05GSUdfUEFUSCA9IEBQS0dfQ09ORklHX1BBVEhACi1SQU5MSUIgPSBAUkFOTElCQAotUlBNU09VUkNFRElSID0gQFJQTVNPVVJDRURJUkAKLVNETF9DRkxBR1MgPSBAU0RMX0NGTEFHU0AKLVNETF9MSUJTID0gQFNETF9MSUJTQAotU0VUX01BS0UgPSBAU0VUX01BS0VACi1TSEVMTCA9IEBTSEVMTEAKLVNTTF9MSUJTID0gQFNTTF9MSUJTQAotU1RSSVAgPSBAU1RSSVBACi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyA9IEBTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHU0AKLVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyA9IEBTWVNURU1fTElCVk5DU0VSVkVSX0xJQlNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XU09DS0xJQiA9IEBXU09DS0xJQkAKLVhNS01GID0gQFhNS01GQAotWF9DRkxBR1MgPSBAWF9DRkxBR1NACi1YX0VYVFJBX0xJQlMgPSBAWF9FWFRSQV9MSUJTQAotWF9MSUJTID0gQFhfTElCU0AKLVhfUFJFX0xJQlMgPSBAWF9QUkVfTElCU0AKLWFic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACi1hYnNfc3JjZGlyID0gQGFic19zcmNkaXJACi1hYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACi1hYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKLWFjX2N0X0NDID0gQGFjX2N0X0NDQAotYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKLWFjX2N0X0Y3NyA9IEBhY19jdF9GNzdACi1hbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKLWFtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACi1hbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAotYW1fX3RhciA9IEBhbV9fdGFyQAotYW1fX3VudGFyID0gQGFtX191bnRhckAKLWJpbmRpciA9IEBiaW5kaXJACi1idWlsZCA9IEBidWlsZEAKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKLWJ1aWxkX29zID0gQGJ1aWxkX29zQAotYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKLWJ1aWxkZGlyID0gQGJ1aWxkZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACi1kb2NkaXIgPSBAZG9jZGlyQAotZHZpZGlyID0gQGR2aWRpckAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotaG9zdCA9IEBob3N0QAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF9jcHUgPSBAaG9zdF9jcHVACi1ob3N0X29zID0gQGhvc3Rfb3NACi1ob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKLWh0bWxkaXIgPSBAaHRtbGRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLWluc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKLWxpYmRpciA9IEBsaWJkaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1sb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLW1rZGlyX3AgPSBAbWtkaXJfcEAKLW9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKLXBkZmRpciA9IEBwZGZkaXJACi1wcmVmaXggPSBAcHJlZml4QAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotcHNkaXIgPSBAcHNkaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAotdG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXdpdGhfZmZtcGVnID0gQHdpdGhfZmZtcGVnQAotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikgLUkkKHRvcF9zcmNkaXIpL2NvbW1vbgotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9GQUxTRUBUTFNTUkNTID0gdGxzX25vbmUuYwotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9UUlVFQFRMU1NSQ1MgPSB0bHNfb3BlbnNzbC5jIAotQEhBVkVfR05VVExTX1RSVUVAVExTU1JDUyA9IHRsc19nbnV0bHMuYwotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9UUlVFQFRMU0xJQlMgPSBAU1NMX0xJQlNAIEBDUllQVF9MSUJTQAotQEhBVkVfR05VVExTX1RSVUVAVExTTElCUyA9IEBHTlVUTFNfTElCU0AKLWxpYnZuY2NsaWVudF9sYV9TT1VSQ0VTID0gY3Vyc29yLmMgbGlzdGVuLmMgcmZicHJvdG8uYyBzb2NrZXRzLmMgdm5jdmlld2VyLmMgLi4vY29tbW9uL21pbmlsem8uYyAkKFRMU1NSQ1MpCi1saWJ2bmNjbGllbnRfbGFfTElCQUREID0gJChUTFNMSUJTKQotbm9pbnN0X0hFQURFUlMgPSAuLi9jb21tb24vbHpvZGVmcy5oIC4uL2NvbW1vbi9sem9jb25mLmggLi4vY29tbW9uL21pbmlsem8uaCB0bHMuaAotRVhUUkFfRElTVCA9IGNvcnJlLmMgaGV4dGlsZS5jIHJyZS5jIHRpZ2h0LmMgemxpYi5jIHpybGUuYyB1bHRyYS5jIHRsc19nbnV0bHMuYyB0bHNfb3BlbnNzbC5jIHRsc19ub25lLmMKLWxpYl9MVExJQlJBUklFUyA9IGxpYnZuY2NsaWVudC5sYQotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBsaWJ2bmNjbGllbnQvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgbGlidm5jY2xpZW50L01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCi0JbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmU7IFwKLQl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGxpYmRpcikiIHx8IGV4aXQgMTsgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICIkKERFU1RESVIpJChsaWJkaXIpIjsgXAotCX0KLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IHRlc3QgLW4gIiQobGliZGlyKSIgfHwgbGlzdD07IFwKLQlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkZiciOyBcCi0JICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCi0JZG9uZQotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCi0JICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKLQkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKLQkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKLQlkb25lCi1saWJ2bmNjbGllbnQubGE6ICQobGlidm5jY2xpZW50X2xhX09CSkVDVFMpICQobGlidm5jY2xpZW50X2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJ2bmNjbGllbnRfbGFfREVQRU5ERU5DSUVTKSAKLQkkKEFNX1ZfQ0NMRCkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJ2bmNjbGllbnRfbGFfT0JKRUNUUykgJChsaWJ2bmNjbGllbnRfbGFfTElCQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jdXJzb3IuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saXN0ZW4uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9taW5pbHpvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmZicHJvdG8uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zb2NrZXRzLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGxzX2dudXRscy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Rsc19ub25lLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGxzX29wZW5zc2wuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS92bmN2aWV3ZXIuUGxvQGFtX19xdW90ZUAKLQotLmMubzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotLmMubG86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChMVENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLW1pbmlsem8ubG86IC4uL2NvbW1vbi9taW5pbHpvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbWluaWx6by5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWluaWx6by5UcG8gLWMgLW8gbWluaWx6by5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL21pbmlsem8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21pbmlsem8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbWluaWx6by5UcG8gJChERVBESVIpL21pbmlsem8uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL21pbmlsem8uYycgb2JqZWN0PSdtaW5pbHpvLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaWx6by5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL21pbmlsem8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21pbmlsem8uYwotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKEhFQURFUlMpCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChsaWJkaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcGRmLWFtOgotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY3RhZ3MgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAotCWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAotCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCi0JaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKLQltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCi0JdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotCi0KLXJmYnByb3RvLm86IHJmYnByb3RvLmMgY29ycmUuYyBoZXh0aWxlLmMgcnJlLmMgdGlnaHQuYyB6bGliLmMgenJsZS5jIHVsdHJhLmMKLQotJChsaWJ2bmNjbGllbnRfbGFfT0JKRUNUUyk6IC4uL3JmYi9yZmJjbGllbnQuaAotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvaDI2NC5jIGIvbGlidm5jY2xpZW50L2gyNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk0NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidm5jY2xpZW50L2gyNjQuYwpAQCAtMCwwICsxLDY0NCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogIFVTQS4KKyAqLworCisjaWZkZWYgTElCVk5DU0VSVkVSX0NPTkZJR19MSUJWQQorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDx2YS92YV94MTEuaD4KKworZW51bSBfc2xpY2VfdHlwZXMgeworCVNMSUNFX1RZUEVfUCA9IDAsICAvKiBQcmVkaWN0ZWQgKi8KKwlTTElDRV9UWVBFX0IgPSAxLCAgLyogQmktcHJlZGljdGVkICovCisJU0xJQ0VfVFlQRV9JID0gMiwgIC8qIEludHJhIGNvZGVkICovCit9OworCisjZGVmaW5lIFNVUkZBQ0VfTlVNICAgICA3CisKK1ZBRGlzcGxheSAgICAgICB2YV9kcHkgPSBOVUxMOworVkFDb25maWdJRCAgICAgIHZhX2NvbmZpZ19pZDsKK1ZBU3VyZmFjZUlEICAgICB2YV9zdXJmYWNlX2lkW1NVUkZBQ0VfTlVNXTsKK1ZBQ29udGV4dElEICAgICB2YV9jb250ZXh0X2lkID0gMDsKKworVkFCdWZmZXJJRCAgICAgIHZhX3BpY19wYXJhbV9idWZfaWRbU1VSRkFDRV9OVU1dOworVkFCdWZmZXJJRCAgICAgIHZhX21hdF9wYXJhbV9idWZfaWRbU1VSRkFDRV9OVU1dOworVkFCdWZmZXJJRCAgICAgIHZhX3NwX3BhcmFtX2J1Zl9pZFtTVVJGQUNFX05VTV07CitWQUJ1ZmZlcklEICAgICAgdmFfZF9wYXJhbV9idWZfaWRbU1VSRkFDRV9OVU1dOworCitzdGF0aWMgaW50IGN1cl9oZWlnaHQgPSAwOworc3RhdGljIGludCBjdXJfd2lkdGggPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fZnJhbWVzID0gMDsKK3N0YXRpYyBpbnQgc2lkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJhbWVfaWQgPSAwOworc3RhdGljIGludCBmaWVsZF9vcmRlcl9jb3VudCA9IDA7CitzdGF0aWMgVkFTdXJmYWNlSUQgY3Vycl9zdXJmYWNlID0gVkFfSU5WQUxJRF9JRDsKKworVkFTdGF0dXMgZ3ZhX3N0YXR1czsKK1ZBU3VyZmFjZVN0YXR1cyBnc3VyZmFjZV9zdGF0dXM7CisjZGVmaW5lIENIRUNLX1NVUkYoWCkgXAorICAgIGd2YV9zdGF0dXMgPSB2YVF1ZXJ5U3VyZmFjZVN0YXR1cyh2YV9kcHksIFgsICZnc3VyZmFjZV9zdGF0dXMpOyBcCisgICAgaWYgKGdzdXJmYWNlX3N0YXR1cyAhPSA0KSBwcmludGYoInNzOiAlZFxuIiwgZ3N1cmZhY2Vfc3RhdHVzKTsKKworI2lmZGVmIF9ERUJVRworI2RlZmluZSBEZWJ1Z0xvZyhBKSByZmJDbGllbnRMb2cgQQorI2Vsc2UKKyNkZWZpbmUgRGVidWdMb2coQSkKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cyxmdW5jKSAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodmFfc3RhdHVzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwiJXM6JXMgKCVkKSBmYWlsZWQsZXhpdFxuIiwgX19mdW5jX18sIGZ1bmMsIF9fTElORV9fKTsqLyBcCisgICAgICAgIHJmYkNsaWVudEVycigiJXM6JXM6JWQgZmFpbGVkICgweCV4KSxleGl0XG4iLCBfX2Z1bmNfXywgZnVuYywgX19MSU5FX18sIHZhX3N0YXR1cyk7IFwKKyAgICAgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgIHsgXAorICAgICAgICAvKmZwcmludGYoc3RkZXJyLCI+PiBTVUNDRVNTIGZvcjogJXM6JXMgKCVkKVxuIiwgX19mdW5jX18sIGZ1bmMsIF9fTElORV9fKTsqLyBcCisgICAgICAgIERlYnVnTG9nKCgiJXM6JXM6JWQgc3VjY2Vzc1xuIiwgX19mdW5jX18sIGZ1bmMsIF9fTElORV9fKSk7IFwKKyAgICB9CisKKy8qCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCBoMjY0X2RlY29kZV9mcmFtZShpbnQgZl93aWR0aCwgaW50IGZfaGVpZ2h0LCBjaGFyICpmcmFtZWRhdGEsIGludCBmcmFtZXNpemUsIGludCBzbGljZV90eXBlKTsKK3N0YXRpYyB2b2lkIFNldFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NCAqcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3N0YXRpYyB2b2lkIFNldFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0KFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0ICpwKTsKK3N0YXRpYyB2b2lkIFNldFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0X0ludHJhKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0ICpwLCBpbnQgZmlyc3QpOworCitzdGF0aWMgdm9pZCBwdXRfdXBkYXRlZF9yZWN0YW5nbGUocmZiQ2xpZW50ICpjbGllbnQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZl93aWR0aCwgaW50IGZfaGVpZ2h0LCBpbnQgZmlyc3RfZm9yX2ZyYW1lKTsKK3N0YXRpYyB2b2lkIG52MTJfdG9fcmdiYShjb25zdCBWQUltYWdlIHZhSW1hZ2UsIHJmYkNsaWVudCAqY2xpZW50LCBpbnQgY2hfeCwgaW50IGNoX3ksIGludCBjaF93LCBpbnQgY2hfaCk7CisKKworLyogRklYTUU6IGdldCB0aGlzIHZhbHVlIGZyb20gdGhlIHNlcnZlciBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgMzJiaXQgcGl4ZWxzICovCisjZGVmaW5lIEJQUCAoNCAqIDgpCisKK3N0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdfb2ZfRk9VUkNDKHVpbnQzMl90IGZvdXJjYykKK3sKKyAgICBzdGF0aWMgaW50IGJ1ZjsKKyAgICBzdGF0aWMgY2hhciBzdHJbMl1bNV07CisKKyAgICBidWYgXj0gMTsKKyAgICBzdHJbYnVmXVswXSA9IGZvdXJjYzsKKyAgICBzdHJbYnVmXVsxXSA9IGZvdXJjYyA+PiA4OworICAgIHN0cltidWZdWzJdID0gZm91cmNjID4+IDE2OworICAgIHN0cltidWZdWzNdID0gZm91cmNjID4+IDI0OworICAgIHN0cltidWZdWzRdID0gJ1wwJzsKKyAgICByZXR1cm4gc3RyW2J1Zl07Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc3RyaW5nX29mX1ZBSW1hZ2VGb3JtYXQoVkFJbWFnZUZvcm1hdCAqaW1nZm10KQoreworICAgIHJldHVybiBzdHJpbmdfb2ZfRk9VUkNDKGltZ2ZtdC0+Zm91cmNjKTsKK30KKworCitzdGF0aWMgcmZiQm9vbAorSGFuZGxlSDI2NCAocmZiQ2xpZW50KiBjbGllbnQsIGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCkKK3sKKyAgICByZmJIMjY0SGVhZGVyIGhkcjsKKyAgICBjaGFyICpmcmFtZWRhdGE7CisKKyAgICBEZWJ1Z0xvZygoIkZyYW1lYnVmZmVyIHVwZGF0ZSB3aXRoIEgyNjQgKHg6ICVkLCB5OiAlZCwgdzogJWQsIGg6ICVkKVxuIiwgcngsIHJ5LCBydywgcmgpKTsKKworICAgIC8qIEZpcnN0LCByZWFkIHRoZSBmcmFtZSBzaXplIGFuZCBhbGxvY2F0ZSBidWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEgKi8KKyAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGNsaWVudCwgKGNoYXIgKikmaGRyLCBzel9yZmJIMjY0SGVhZGVyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaGRyLnNsaWNlX3R5cGUgPSByZmJDbGllbnRTd2FwMzJJZkxFKGhkci5zbGljZV90eXBlKTsKKyAgICBoZHIubkJ5dGVzID0gcmZiQ2xpZW50U3dhcDMySWZMRShoZHIubkJ5dGVzKTsKKyAgICBoZHIud2lkdGggPSByZmJDbGllbnRTd2FwMzJJZkxFKGhkci53aWR0aCk7CisgICAgaGRyLmhlaWdodCA9IHJmYkNsaWVudFN3YXAzMklmTEUoaGRyLmhlaWdodCk7CisKKyAgICBmcmFtZWRhdGEgPSAoY2hhciopIG1hbGxvYyhoZHIubkJ5dGVzKTsKKworICAgIC8qIE9idGFpbiBmcmFtZSBkYXRhIGZyb20gdGhlIHNlcnZlciAqLworICAgIERlYnVnTG9nKCgiUmVhZGluZyAlZCBieXRlcyBvZiBmcmFtZSBkYXRhICh0eXBlOiAlZClcbiIsIGhkci5uQnl0ZXMsIGhkci5zbGljZV90eXBlKSk7CisgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihjbGllbnQsIGZyYW1lZGF0YSwgaGRyLm5CeXRlcykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGFyZ2UgZW5vdWdoIHJhdyBidWZmZXIgdG8gaG9sZCB0aGUKKyAgICAgKiBkZWNvbXByZXNzZWQgZGF0YS4gIEluIHByYWN0aWNlLCB3aXRoIGEgZml4ZWQgQlBQLCBmaXhlZCBmcmFtZQorICAgICAqIGJ1ZmZlciBzaXplIGFuZCB0aGUgZmlyc3QgdXBkYXRlIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBmcmFtZQorICAgICAqIGJ1ZmZlciwgdGhpcyBidWZmZXIgYWxsb2NhdGlvbiBzaG91bGQgb25seSBoYXBwZW4gb25jZSwgb24gdGhlCisgICAgICogZmlyc3QgdXBkYXRlLgorICAgICAqLworICAgIGlmICggY2xpZW50LT5yYXdfYnVmZmVyX3NpemUgPCAoKCBydyAqIHJoICkgKiAoIEJQUCAvIDggKSkpIHsKKyAgICAgICAgaWYgKCBjbGllbnQtPnJhd19idWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGZyZWUoIGNsaWVudC0+cmF3X2J1ZmZlciApOworICAgICAgICB9CisKKyAgICAgICAgY2xpZW50LT5yYXdfYnVmZmVyX3NpemUgPSAoKCBydyAqIHJoICkgKiAoIEJQUCAvIDggKSk7CisgICAgICAgIGNsaWVudC0+cmF3X2J1ZmZlciA9IChjaGFyKikgbWFsbG9jKCBjbGllbnQtPnJhd19idWZmZXJfc2l6ZSApOworICAgICAgICByZmJDbGllbnRMb2coIkFsbG9jYXRlZCByYXcgYnVmZmVyIG9mICVkIGJ5dGVzICglZHglZHglZCBCUFApXG4iLCBjbGllbnQtPnJhd19idWZmZXJfc2l6ZSwgcncsIHJoLCBCUFApOworICAgIH0KKworICAgIC8qIERlY29kZSBmcmFtZSBpZiBmcmFtZSBkYXRhIHdhcyBzZW50LiBTZXJ2ZXIgb25seSBzZW5kcyBmcmFtZSBkYXRhIGZvciB0aGUgZmlyc3QKKyAgICAgKiBmcmFtZWJ1ZmZlciB1cGRhdGUgbWVzc2FnZSBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lIGJ1ZmZlciBjb250ZW50cy4KKyAgICAgKiBJZiBtb3JlIHRoYW4gMSByZWN0YW5nbGUgaXMgdXBkYXRlZCwgdGhlIG1lc3NhZ2VzIGFmdGVyIHRoZSBmaXJzdCBvbmUgKHdpdGgKKyAgICAgKiB0aGUgSC4yNjQgZnJhbWUpIGhhdmUgbkJ5dGVzID09IDAuCisgICAgICovCisgICAgaWYgKGhkci5uQnl0ZXMgPiAwKSB7CisgICAgICAgIERlYnVnTG9nKCgiICBkZWNvZGluZyAlZCBieXRlcyBvZiBILjI2NCBkYXRhXG4iLCBoZHIubkJ5dGVzKSk7CisgICAgICAgIGgyNjRfZGVjb2RlX2ZyYW1lKGhkci53aWR0aCwgaGRyLmhlaWdodCwgZnJhbWVkYXRhLCBoZHIubkJ5dGVzLCBoZHIuc2xpY2VfdHlwZSk7CisgICAgfQorCisgICAgRGVidWdMb2coKCIgIHVwZGF0aW5nIHJlY3RhbmdsZSAoJWQsICVkKS0oJWQsICVkKVxuIiwgcngsIHJ5LCBydywgcmgpKTsKKyAgICBwdXRfdXBkYXRlZF9yZWN0YW5nbGUoY2xpZW50LCByeCwgcnksIHJ3LCByaCwgaGRyLndpZHRoLCBoZHIuaGVpZ2h0LCBoZHIubkJ5dGVzICE9IDApOworCisgICAgZnJlZShmcmFtZWRhdGEpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfY2xlYW51cF9kZWNvZGVyKCkKK3sKKyAgICBWQVN0YXR1cyB2YV9zdGF0dXM7CisKKyAgICByZmJDbGllbnRMb2coIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAodmFfc3VyZmFjZV9pZFswXSAhPSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHZhX3N0YXR1cyA9IHZhRGVzdHJveVN1cmZhY2VzKHZhX2RweSwgJnZhX3N1cmZhY2VfaWRbMF0sIFNVUkZBQ0VfTlVNKTsKKyAgICAgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFEZXN0cm95U3VyZmFjZXMiKTsKKyAgICB9CisKKyAgICBpZiAodmFfY29udGV4dF9pZCkgeworICAgICAgICB2YV9zdGF0dXMgPSB2YURlc3Ryb3lDb250ZXh0KHZhX2RweSwgdmFfY29udGV4dF9pZCk7CisgICAgICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhRGVzdHJveUNvbnRleHQiKTsKKyAgICAgICAgdmFfY29udGV4dF9pZCA9IDA7CisgICAgfQorCisgICAgbnVtX2ZyYW1lcyA9IDA7CisgICAgc2lkID0gMDsKKyAgICBmcmFtZV9pZCA9IDA7CisgICAgZmllbGRfb3JkZXJfY291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBoMjY0X2luaXRfZGVjb2RlcihpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgVkFTdGF0dXMgdmFfc3RhdHVzOworCisgICAgaWYgKHZhX2NvbnRleHRfaWQpIHsKKyAgICAgICAgcmZiQ2xpZW50TG9nKCIlczogdmFfZHB5IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgaWYgKHZhX2RweSAhPSBOVUxMKSB7CisgICAgICAgIHJmYkNsaWVudExvZygiJXM6IFJlLWluaXRpYWxpemluZyBILjI2NCBkZWNvZGVyXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmZiQ2xpZW50TG9nKCIlczogaW5pdGlhbGl6aW5nIEguMjY0IGRlY29kZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgLyogQXR0YWNoIFZBIGRpc3BsYXkgdG8gbG9jYWwgWCBkaXNwbGF5ICovCisgICAgICAgIERpc3BsYXkgKndpbl9kaXNwbGF5ID0gKERpc3BsYXkgKilYT3BlbkRpc3BsYXkoIjowLjAiKTsKKyAgICAgICAgaWYgKHdpbl9kaXNwbGF5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJmYkNsaWVudEVycigiQ2FuJ3QgY29ubmVjdCB0byBsb2NhbCBkaXNwbGF5XG4iKTsKKyAgICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1ham9yX3ZlciwgbWlub3JfdmVyOworICAgICAgICB2YV9kcHkgPSB2YUdldERpc3BsYXkod2luX2Rpc3BsYXkpOworICAgICAgICB2YV9zdGF0dXMgPSB2YUluaXRpYWxpemUodmFfZHB5LCAmbWFqb3JfdmVyLCAmbWlub3JfdmVyKTsKKyAgICAgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFJbml0aWFsaXplIik7CisgICAgICAgIHJmYkNsaWVudExvZygiJXM6IGxpYnZhIHZlcnNpb24gJWQuJWQgZm91bmRcbiIsIF9fRlVOQ1RJT05fXywgbWFqb3JfdmVyLCBtaW5vcl92ZXIpOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBWTEQgZW50cnlwb2ludCAqLworICAgIGludCBudW1fZW50cnlwb2ludHM7CisgICAgVkFFbnRyeXBvaW50ICAgIGVudHJ5cG9pbnRzWzVdOworICAgIGludCB2bGRfZW50cnlwb2ludF9mb3VuZCA9IDA7CisKKyAgICAvKiBDaGFuZ2UgVkFQcm9maWxlSDI2NEhpZ2ggaWYgbmVlZGVkICovCisgICAgVkFQcm9maWxlIHByb2ZpbGUgPSBWQVByb2ZpbGVIMjY0SGlnaDsKKyAgICB2YV9zdGF0dXMgPSB2YVF1ZXJ5Q29uZmlnRW50cnlwb2ludHModmFfZHB5LCBwcm9maWxlLCBlbnRyeXBvaW50cywgJm51bV9lbnRyeXBvaW50cyk7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFRdWVyeUNvbmZpZ0VudHJ5cG9pbnRzIik7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyeXBvaW50czsgKytpKSB7CisgICAgICAgIGlmIChlbnRyeXBvaW50c1tpXSA9PSBWQUVudHJ5cG9pbnRWTEQpIHsKKyAgICAgICAgICAgIHZsZF9lbnRyeXBvaW50X2ZvdW5kID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZsZF9lbnRyeXBvaW50X2ZvdW5kID09IDApIHsKKyAgICAgICAgcmZiQ2xpZW50RXJyKCJWTEQgZW50cnlwb2ludCBub3QgZm91bmRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZGVjb2RlIHBpcGVsaW5lICovCisgICAgVkFDb25maWdBdHRyaWIgYXR0cmliOworICAgIGF0dHJpYi50eXBlID0gVkFDb25maWdBdHRyaWJSVEZvcm1hdDsKKyAgICB2YV9zdGF0dXMgPSB2YUNyZWF0ZUNvbmZpZyh2YV9kcHksIHByb2ZpbGUsIFZBRW50cnlwb2ludFZMRCwgJmF0dHJpYiwgMSwgJnZhX2NvbmZpZ19pZCk7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFDcmVhdGVDb25maWciKTsKKworICAgIC8qIENyZWF0ZSBWQSBzdXJmYWNlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBTVVJGQUNFX05VTTsgKytpKSB7CisgICAgICAgIHZhX3N1cmZhY2VfaWRbaV0gICAgICAgPSBWQV9JTlZBTElEX0lEOworICAgICAgICB2YV9waWNfcGFyYW1fYnVmX2lkW2ldID0gVkFfSU5WQUxJRF9JRDsKKyAgICAgICAgdmFfbWF0X3BhcmFtX2J1Zl9pZFtpXSA9IFZBX0lOVkFMSURfSUQ7CisgICAgICAgIHZhX3NwX3BhcmFtX2J1Zl9pZFtpXSAgPSBWQV9JTlZBTElEX0lEOworICAgICAgICB2YV9kX3BhcmFtX2J1Zl9pZFtpXSAgID0gVkFfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgdmFfc3RhdHVzID0gdmFDcmVhdGVTdXJmYWNlcyh2YV9kcHksIHdpZHRoLCBoZWlnaHQsIFZBX1JUX0ZPUk1BVF9ZVVY0MjAsIFNVUkZBQ0VfTlVNLCAmdmFfc3VyZmFjZV9pZFswXSk7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFDcmVhdGVTdXJmYWNlcyIpOworICAgIGZvciAoaSA9IDA7IGkgPCBTVVJGQUNFX05VTTsgKytpKSB7CisgICAgICAgIERlYnVnTG9nKCgiJXM6IHZhX3N1cmZhY2VfaWRbJWRdID0gJXBcbiIsIF9fRlVOQ1RJT05fXywgaSwgdmFfc3VyZmFjZV9pZFtpXSkpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBWQSBjb250ZXh0ICovCisgICAgdmFfc3RhdHVzID0gdmFDcmVhdGVDb250ZXh0KHZhX2RweSwgdmFfY29uZmlnX2lkLCB3aWR0aCwgaGVpZ2h0LCAwLypWQV9QUk9HUkVTU0lWRSovLCAgJnZhX3N1cmZhY2VfaWRbMF0sIFNVUkZBQ0VfTlVNLCAmdmFfY29udGV4dF9pZCk7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFDcmVhdGVDb250ZXh0Iik7CisgICAgRGVidWdMb2coKCIlczogVkEgY29udGV4dCBjcmVhdGVkIChpZDogJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHZhX2NvbnRleHRfaWQpKTsKKworCisgICAgLyogSW5zdGFudGlhdGUgZGVjb2RlIHBpcGVsaW5lICovCisgICAgdmFfc3RhdHVzID0gdmFCZWdpblBpY3R1cmUodmFfZHB5LCB2YV9jb250ZXh0X2lkLCB2YV9zdXJmYWNlX2lkWzBdKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YUJlZ2luUGljdHVyZSIpOworCisgICAgcmZiQ2xpZW50TG9nKCIlczogSC4yNjQgZGVjb2RlciBpbml0aWFsaXplZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgaDI2NF9kZWNvZGVfZnJhbWUoaW50IGZfd2lkdGgsIGludCBmX2hlaWdodCwgY2hhciAqZnJhbWVkYXRhLCBpbnQgZnJhbWVzaXplLCBpbnQgc2xpY2VfdHlwZSkKK3sKKyAgICBWQVN0YXR1cyB2YV9zdGF0dXM7CisKKyAgICBEZWJ1Z0xvZygoIiVzOiBjYWxsZWQgZm9yIGZyYW1lIG9mICVkIGJ5dGVzICglZHglZCkgc2xpY2VfdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fLCBmcmFtZXNpemUsIHdpZHRoLCBoZWlnaHQsIHNsaWNlX3R5cGUpKTsKKworICAgIC8qIEluaXRpYWxpemUgZGVjb2RlIHBpcGVsaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmICggKGZfd2lkdGggPiBjdXJfd2lkdGgpIHx8IChmX2hlaWdodCA+IGN1cl9oZWlnaHQpICkgeworICAgICAgICBpZiAodmFfZHB5ICE9IE5VTEwpCisgICAgICAgICAgICBoMjY0X2NsZWFudXBfZGVjb2RlcigpOworICAgICAgICBjdXJfd2lkdGggPSBmX3dpZHRoOworICAgICAgICBjdXJfaGVpZ2h0ID0gZl9oZWlnaHQ7CisKKyAgICAgICAgaDI2NF9pbml0X2RlY29kZXIoZl93aWR0aCwgZl9oZWlnaHQpOworICAgICAgICByZmJDbGllbnRMb2coIiVzOiBkZWNvZGVyIGluaXRpYWxpemVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIC8qIERlY29kZSBmcmFtZSAqLworICAgIHN0YXRpYyBWQVBpY3R1cmVIMjY0IHZhX3BpY3R1cmVfaDI2NCwgdmFfb2xkX3BpY3R1cmVfaDI2NDsKKworICAgIC8qIFRoZSBzZXJ2ZXIgc2hvdWxkIGFsd2F5cyBzZW5kIGFuIEktZnJhbWUgd2hlbiBhIG5ldyBjbGllbnQgY29ubmVjdHMKKyAgICAgKiBvciB3aGVuIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBmcmFtZWJ1ZmZlciBjaGFuZ2VzLCBidXQgd2UgY2hlY2sKKyAgICAgKiBqdXN0IGluIGNhc2UuCisgICAgICovCisgICAgaWYgKCAoc2xpY2VfdHlwZSAhPSBTTElDRV9UWVBFX0kpICYmIChudW1fZnJhbWVzID09IDApICkgeworICAgICAgICByZmJDbGllbnRMb2coIkZpcnN0IGZyYW1lIGlzIG5vdCBhbiBJIGZyYW1lICEhISBTa2lwcGluZyEhIVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZWJ1Z0xvZygoIiVzOiBmcmFtZV9pZD0lZCB2YV9zdXJmYWNlX2lkWyVkXT0weCV4IGZpZWxkX29yZGVyX2NvdW50PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGZyYW1lX2lkLCBzaWQsIHZhX3N1cmZhY2VfaWRbc2lkXSwgZmllbGRfb3JkZXJfY291bnQpKTsKKworICAgIHZhX3BpY3R1cmVfaDI2NC5waWN0dXJlX2lkID0gdmFfc3VyZmFjZV9pZFtzaWRdOworICAgIHZhX3BpY3R1cmVfaDI2NC5mcmFtZV9pZHggID0gZnJhbWVfaWQ7CisgICAgdmFfcGljdHVyZV9oMjY0LmZsYWdzID0gMDsKKyAgICB2YV9waWN0dXJlX2gyNjQuQm90dG9tRmllbGRPcmRlckNudCA9IGZpZWxkX29yZGVyX2NvdW50OworICAgIHZhX3BpY3R1cmVfaDI2NC5Ub3BGaWVsZE9yZGVyQ250ID0gZmllbGRfb3JkZXJfY291bnQ7CisKKyAgICAvKiBTZXQgdXAgcGljdHVyZSBwYXJhbWV0ZXIgYnVmZmVyICovCisgICAgaWYgKHZhX3BpY19wYXJhbV9idWZfaWRbc2lkXSA9PSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHZhX3N0YXR1cyA9IHZhQ3JlYXRlQnVmZmVyKHZhX2RweSwgdmFfY29udGV4dF9pZCwgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVHlwZSwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQpLCAxLCBOVUxMLCAmdmFfcGljX3BhcmFtX2J1Zl9pZFtzaWRdKTsKKyAgICAgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFDcmVhdGVCdWZmZXIoUGljUGFyYW0pIik7CisgICAgfQorICAgIENIRUNLX1NVUkYodmFfc3VyZmFjZV9pZFtzaWRdKTsKKworICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQgKnBpY19wYXJhbV9idWYgPSBOVUxMOworICAgIHZhX3N0YXR1cyA9IHZhTWFwQnVmZmVyKHZhX2RweSwgdmFfcGljX3BhcmFtX2J1Zl9pZFtzaWRdLCAodm9pZCAqKikmcGljX3BhcmFtX2J1Zik7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFNYXBCdWZmZXIoUGljUGFyYW0pIik7CisKKyAgICBTZXRWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0KHBpY19wYXJhbV9idWYsIGZfd2lkdGgsIGZfaGVpZ2h0KTsKKyAgICBtZW1jcHkoJnBpY19wYXJhbV9idWYtPkN1cnJQaWMsICZ2YV9waWN0dXJlX2gyNjQsIHNpemVvZihWQVBpY3R1cmVIMjY0KSk7CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBTTElDRV9UWVBFX1ApIHsKKyAgICAgICAgbWVtY3B5KCZwaWNfcGFyYW1fYnVmLT5SZWZlcmVuY2VGcmFtZXNbMF0sICZ2YV9vbGRfcGljdHVyZV9oMjY0LCBzaXplb2YoVkFQaWN0dXJlSDI2NCkpOworICAgICAgICBwaWNfcGFyYW1fYnVmLT5SZWZlcmVuY2VGcmFtZXNbMF0uZmxhZ3MgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChzbGljZV90eXBlICE9IFNMSUNFX1RZUEVfSSkgeworICAgICAgICByZmJDbGllbnRMb2coIkZyYW1lIHR5cGUgJWQgbm90IHN1cHBvcnRlZCEhIVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGljX3BhcmFtX2J1Zi0+ZnJhbWVfbnVtID0gZnJhbWVfaWQ7CisKKyAgICB2YV9zdGF0dXMgPSB2YVVubWFwQnVmZmVyKHZhX2RweSwgdmFfcGljX3BhcmFtX2J1Zl9pZFtzaWRdKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YVVubWFwQnVmZmVyKFBpY1BhcmFtKSIpOworCisgICAgLyogU2V0IHVwIElRIG1hdHJpeCBidWZmZXIgKi8KKyAgICBpZiAodmFfbWF0X3BhcmFtX2J1Zl9pZFtzaWRdID09IFZBX0lOVkFMSURfSUQpIHsKKyAgICAgICAgdmFfc3RhdHVzID0gdmFDcmVhdGVCdWZmZXIodmFfZHB5LCB2YV9jb250ZXh0X2lkLCBWQUlRTWF0cml4QnVmZmVyVHlwZSwgc2l6ZW9mKFZBSVFNYXRyaXhCdWZmZXJIMjY0KSwgMSwgTlVMTCwgJnZhX21hdF9wYXJhbV9idWZfaWRbc2lkXSk7CisgICAgICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhQ3JlYXRlQnVmZmVyKElRTWF0cml4KSIpOworICAgIH0KKyAgICBDSEVDS19TVVJGKHZhX3N1cmZhY2VfaWRbc2lkXSk7CisKKyAgICBWQUlRTWF0cml4QnVmZmVySDI2NCAqaXFfbWF0cml4X2J1ZiA9IE5VTEw7CisgICAgdmFfc3RhdHVzID0gdmFNYXBCdWZmZXIodmFfZHB5LCB2YV9tYXRfcGFyYW1fYnVmX2lkW3NpZF0sICh2b2lkICoqKSZpcV9tYXRyaXhfYnVmKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YU1hcEJ1ZmZlcihJUU1hdHJpeCkiKTsKKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1fTWF0cml4QnVmZmVySDI2NFtdPSB7CisgICAgICAgIC8qIFNjYWxpbmdMaXN0NHg0WzZdWzE2XSAqLworICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorICAgICAgICAvKiBTY2FsaW5nTGlzdDh4OFsyXVs2NF0gKi8KKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCisgICAgfTsKKworICAgIG1lbWNweShpcV9tYXRyaXhfYnVmLCBtX01hdHJpeEJ1ZmZlckgyNjQsIDIyNCk7CisgICAgdmFfc3RhdHVzID0gdmFVbm1hcEJ1ZmZlcih2YV9kcHksIHZhX21hdF9wYXJhbV9idWZfaWRbc2lkXSk7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFVbm1hcEJ1ZmZlcihJUU1hdHJpeCkiKTsKKworICAgIFZBQnVmZmVySUQgYnVmZmVyX2lkc1syXTsKKyAgICBidWZmZXJfaWRzWzBdID0gdmFfcGljX3BhcmFtX2J1Zl9pZFtzaWRdOworICAgIGJ1ZmZlcl9pZHNbMV0gPSB2YV9tYXRfcGFyYW1fYnVmX2lkW3NpZF07CisKKyAgICBDSEVDS19TVVJGKHZhX3N1cmZhY2VfaWRbc2lkXSk7CisgICAgdmFfc3RhdHVzID0gdmFSZW5kZXJQaWN0dXJlKHZhX2RweSwgdmFfY29udGV4dF9pZCwgYnVmZmVyX2lkcywgMik7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFSZW5kZXJQaWN0dXJlIik7CisKKyAgICAvKiBTZXQgdXAgc2xpY2UgcGFyYW1ldGVyIGJ1ZmZlciAqLworICAgIGlmICh2YV9zcF9wYXJhbV9idWZfaWRbc2lkXSA9PSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHZhX3N0YXR1cyA9IHZhQ3JlYXRlQnVmZmVyKHZhX2RweSwgdmFfY29udGV4dF9pZCwgVkFTbGljZVBhcmFtZXRlckJ1ZmZlclR5cGUsIHNpemVvZihWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCksIDEsIE5VTEwsICZ2YV9zcF9wYXJhbV9idWZfaWRbc2lkXSk7CisgICAgICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhQ3JlYXRlQnVmZmVyKFNsaWNlUGFyYW0pIik7CisgICAgfQorICAgIENIRUNLX1NVUkYodmFfc3VyZmFjZV9pZFtzaWRdKTsKKworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0ICpzbGljZV9wYXJhbV9idWYgPSBOVUxMOworICAgIHZhX3N0YXR1cyA9IHZhTWFwQnVmZmVyKHZhX2RweSwgdmFfc3BfcGFyYW1fYnVmX2lkW3NpZF0sICh2b2lkICoqKSZzbGljZV9wYXJhbV9idWYpOworICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhTWFwQnVmZmVyKFNsaWNlUGFyYW0pIik7CisKKyAgICBzdGF0aWMgaW50IHQyX2ZpcnN0ID0gMTsKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBTTElDRV9UWVBFX0kpIHsKKyAgICAgICAgU2V0VkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjRfSW50cmEoc2xpY2VfcGFyYW1fYnVmLCB0Ml9maXJzdCk7CisgICAgICAgIHQyX2ZpcnN0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBTZXRWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NChzbGljZV9wYXJhbV9idWYpOworICAgICAgICBtZW1jcHkoJnNsaWNlX3BhcmFtX2J1Zi0+UmVmUGljTGlzdDBbMF0sICZ2YV9vbGRfcGljdHVyZV9oMjY0LCBzaXplb2YoVkFQaWN0dXJlSDI2NCkpOworICAgICAgICBzbGljZV9wYXJhbV9idWYtPlJlZlBpY0xpc3QwWzBdLmZsYWdzID0gMDsKKyAgICB9CisgICAgc2xpY2VfcGFyYW1fYnVmLT5zbGljZV9kYXRhX2JpdF9vZmZzZXQgPSAwOworICAgIHNsaWNlX3BhcmFtX2J1Zi0+c2xpY2VfZGF0YV9zaXplID0gZnJhbWVzaXplOworCisgICAgdmFfc3RhdHVzID0gdmFVbm1hcEJ1ZmZlcih2YV9kcHksIHZhX3NwX3BhcmFtX2J1Zl9pZFtzaWRdKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YVVubWFwQnVmZmVyKFNsaWNlUGFyYW0pIik7CisgICAgQ0hFQ0tfU1VSRih2YV9zdXJmYWNlX2lkW3NpZF0pOworCisgICAgLyogU2V0IHVwIHNsaWNlIGRhdGEgYnVmZmVyIGFuZCBjb3B5IEguMjY0IGVuY29kZWQgZGF0YSAqLworICAgIGlmICh2YV9kX3BhcmFtX2J1Zl9pZFtzaWRdID09IFZBX0lOVkFMSURfSUQpIHsKKyAgICAgICAgLyogVE9ETyB1c2UgZXN0aW1hdGlvbiBtYXRjaGluZyBmcmFtZWJ1ZmZlciBkaW1lbnNpb25zIGluc3RlYWQgb2YgdGhpcyBsYXJnZSB2YWx1ZSAqLworICAgICAgICB2YV9zdGF0dXMgPSB2YUNyZWF0ZUJ1ZmZlcih2YV9kcHksIHZhX2NvbnRleHRfaWQsIFZBU2xpY2VEYXRhQnVmZmVyVHlwZSwgNDE3NzkyMCwgMSwgTlVMTCwgJnZhX2RfcGFyYW1fYnVmX2lkW3NpZF0pOyAvKiAxMDgwcCBzaXplICovCisgICAgICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhQ3JlYXRlQnVmZmVyKFNsaWNlRGF0YSkiKTsKKyAgICB9CisKKyAgICBjaGFyICpzbGljZV9kYXRhX2J1ZjsKKyAgICB2YV9zdGF0dXMgPSB2YU1hcEJ1ZmZlcih2YV9kcHksIHZhX2RfcGFyYW1fYnVmX2lkW3NpZF0sICh2b2lkICoqKSZzbGljZV9kYXRhX2J1Zik7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFNYXBCdWZmZXIoU2xpY2VEYXRhKSIpOworICAgIG1lbWNweShzbGljZV9kYXRhX2J1ZiwgZnJhbWVkYXRhLCBmcmFtZXNpemUpOworCisgICAgQ0hFQ0tfU1VSRih2YV9zdXJmYWNlX2lkW3NpZF0pOworICAgIHZhX3N0YXR1cyA9IHZhVW5tYXBCdWZmZXIodmFfZHB5LCB2YV9kX3BhcmFtX2J1Zl9pZFtzaWRdKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YVVubWFwQnVmZmVyKFNsaWNlRGF0YSkiKTsKKworICAgIGJ1ZmZlcl9pZHNbMF0gPSB2YV9zcF9wYXJhbV9idWZfaWRbc2lkXTsKKyAgICBidWZmZXJfaWRzWzFdID0gdmFfZF9wYXJhbV9idWZfaWRbc2lkXTsKKworICAgIENIRUNLX1NVUkYodmFfc3VyZmFjZV9pZFtzaWRdKTsKKyAgICB2YV9zdGF0dXMgPSB2YVJlbmRlclBpY3R1cmUodmFfZHB5LCB2YV9jb250ZXh0X2lkLCBidWZmZXJfaWRzLCAyKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YVJlbmRlclBpY3R1cmUiKTsKKworICAgIHZhX3N0YXR1cyA9IHZhRW5kUGljdHVyZSh2YV9kcHksIHZhX2NvbnRleHRfaWQpOworICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhRW5kUGljdHVyZSIpOworCisgICAgLyogUHJlcGFyZSBuZXh0IG9uZS4uLiAqLworICAgIGludCBzaWRfbmV3ID0gKHNpZCArIDEpICUgU1VSRkFDRV9OVU07CisgICAgRGVidWdMb2coKCIlczogbmV3IFN1cmZhY2UgSUQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzaWRfbmV3KSk7CisgICAgdmFfc3RhdHVzID0gdmFCZWdpblBpY3R1cmUodmFfZHB5LCB2YV9jb250ZXh0X2lkLCB2YV9zdXJmYWNlX2lkW3NpZF9uZXddKTsKKyAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YUJlZ2luUGljdHVyZSIpOworCisgICAgLyogR2V0IGRlY29kZWQgZGF0YSAqLworICAgIHZhX3N0YXR1cyA9IHZhU3luY1N1cmZhY2UodmFfZHB5LCB2YV9zdXJmYWNlX2lkW3NpZF0pOworICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhU3luY1N1cmZhY2UiKTsKKyAgICBDSEVDS19TVVJGKHZhX3N1cmZhY2VfaWRbc2lkXSk7CisKKyAgICBjdXJyX3N1cmZhY2UgPSB2YV9zdXJmYWNlX2lkW3NpZF07CisKKyAgICBzaWQgPSBzaWRfbmV3OworCisgICAgZmllbGRfb3JkZXJfY291bnQgKz0gMjsKKyAgICArK2ZyYW1lX2lkOworICAgIGlmIChmcmFtZV9pZCA+IDE1KSB7CisgICAgICAgIGZyYW1lX2lkID0gMDsKKyAgICB9CisKKyAgICArK251bV9mcmFtZXM7CisKKyAgICBtZW1jcHkoJnZhX29sZF9waWN0dXJlX2gyNjQsICZ2YV9waWN0dXJlX2gyNjQsIHNpemVvZihWQVBpY3R1cmVIMjY0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF91cGRhdGVkX3JlY3RhbmdsZShyZmJDbGllbnQgKmNsaWVudCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmX3dpZHRoLCBpbnQgZl9oZWlnaHQsIGludCBmaXJzdF9mb3JfZnJhbWUpCit7CisgICAgaWYgKGN1cnJfc3VyZmFjZSA9PSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHJmYkNsaWVudEVycigiJXM6IGNhbGxlZCwgYnV0IGN1cnJlbnQgc3VyZmFjZSBpcyBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVkFTdGF0dXMgdmFfc3RhdHVzOworCisgICAgaWYgKGNsaWVudC0+b3V0cHV0V2luZG93KSB7CisgICAgICAgIC8qIHVzZSBlZmZpY2llbnQgdmFQdXRTdXJmYWNlKCkgbWV0aG9kIG9mIHB1dHRpbmcgdGhlIGZyYW1lYnVmZmVyIG9uIHRoZSBzY3JlZW4gKi8KKyAgICAgICAgaWYgKGZpcnN0X2Zvcl9mcmFtZSkgeworICAgICAgICAgICAgLyogdmFQdXRTdXJmYWNlKCkgY2xlYXJzIHdpbmRvdyBjb250ZW50cyBvdXRzaWRlIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiByZWN0YW5nbGUgPT4gYWx3YXlzIHVwZGF0ZSBmdWxsIHNjcmVlbi4gKi8KKyAgICAgICAgICAgIHZhX3N0YXR1cyA9IHZhUHV0U3VyZmFjZSh2YV9kcHksIGN1cnJfc3VyZmFjZSwgY2xpZW50LT5vdXRwdXRXaW5kb3csIDAsIDAsIGZfd2lkdGgsIGZfaGVpZ2h0LCAwLCAwLCBmX3dpZHRoLCBmX2hlaWdodCwgTlVMTCwgMCwgVkFfRlJBTUVfUElDVFVSRSk7CisgICAgICAgICAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YVB1dFN1cmZhY2UiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChjbGllbnQtPmZyYW1lQnVmZmVyKSB7CisgICAgICAgIC8qIC4uLiBvciBjb3B5IHRoZSBjaGFuZ2VkIGZyYW1lYnVmZmVyIHJlZ2lvbiBtYW51YWxseSBhcyBhIGZhbGxiYWNrICovCisgICAgICAgIFZBSW1hZ2UgZGVjb2RlZF9pbWFnZTsKKyAgICAgICAgZGVjb2RlZF9pbWFnZS5pbWFnZV9pZCA9IFZBX0lOVkFMSURfSUQ7CisgICAgICAgIGRlY29kZWRfaW1hZ2UuYnVmICAgICAgPSBWQV9JTlZBTElEX0lEOworICAgICAgICB2YV9zdGF0dXMgPSB2YURlcml2ZUltYWdlKHZhX2RweSwgY3Vycl9zdXJmYWNlLCAmZGVjb2RlZF9pbWFnZSk7CisgICAgICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhRGVyaXZlSW1hZ2UiKTsKKworICAgICAgICBpZiAoKGRlY29kZWRfaW1hZ2UuaW1hZ2VfaWQgPT0gVkFfSU5WQUxJRF9JRCkgfHwgKGRlY29kZWRfaW1hZ2UuYnVmID09IFZBX0lOVkFMSURfSUQpKSB7CisgICAgICAgICAgICByZmJDbGllbnRFcnIoIiVzOiB2YURlcml2ZUltYWdlKCkgcmV0dXJuZWQgc3VjY2VzcyBidXQgVkEgaW1hZ2UgaXMgaW52YWxpZCAoaWQ6ICVkLCBidWY6ICVkKVxuIiwgX19GVU5DVElPTl9fLCBkZWNvZGVkX2ltYWdlLmltYWdlX2lkLCBkZWNvZGVkX2ltYWdlLmJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBudjEyX3RvX3JnYmEoZGVjb2RlZF9pbWFnZSwgY2xpZW50LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICB2YV9zdGF0dXMgPSB2YURlc3Ryb3lJbWFnZSh2YV9kcHksIGRlY29kZWRfaW1hZ2UuaW1hZ2VfaWQpOworICAgICAgICBDSEVDS19WQVNUQVRVUyh2YV9zdGF0dXMsICJ2YURlc3Ryb3lJbWFnZSIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgU2V0VkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NChWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0ICpwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50IHdpZHRoX2luX21icyA9ICh3aWR0aCArIDE1KSAvIDE2OworICAgIHVuc2lnbmVkIGludCBoZWlnaHRfaW5fbWJzID0gKGhlaWdodCArIDE1KSAvIDE2OworCisgICAgbWVtc2V0KHAsIDAsIHNpemVvZihWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0KSk7CisgICAgcC0+cGljdHVyZV93aWR0aF9pbl9tYnNfbWludXMxID0gd2lkdGhfaW5fbWJzIC0gMTsKKyAgICBwLT5waWN0dXJlX2hlaWdodF9pbl9tYnNfbWludXMxID0gaGVpZ2h0X2luX21icyAtIDE7CisgICAgcC0+bnVtX3JlZl9mcmFtZXMgPSAxOworICAgIHAtPnNlcV9maWVsZHMudmFsdWUgPSAxNDU7CisgICAgcC0+cGljX2ZpZWxkcy52YWx1ZSA9IDB4NTAxOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHAtPlJlZmVyZW5jZUZyYW1lc1tpXS5mbGFncyA9IFZBX1BJQ1RVUkVfSDI2NF9JTlZBTElEOworICAgICAgICBwLT5SZWZlcmVuY2VGcmFtZXNbaV0ucGljdHVyZV9pZCA9IDB4ZmZmZmZmZmY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBTZXRWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NChWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCAqcCkKK3sKKyAgICBpbnQgaTsKKyAgICBtZW1zZXQocCwgMCwgc2l6ZW9mKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0KSk7CisgICAgcC0+c2xpY2VfZGF0YV9zaXplID0gMDsKKyAgICBwLT5zbGljZV9kYXRhX2JpdF9vZmZzZXQgPSA2NDsKKyAgICBwLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA9IDI7CisgICAgcC0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2MiA9IDI7CisgICAgcC0+Y2hyb21hX3dlaWdodF9sMF9mbGFnID0gMTsKKyAgICBwLT5jaHJvbWFfd2VpZ2h0X2wwWzBdWzBdPTE7CisgICAgcC0+Y2hyb21hX29mZnNldF9sMFswXVswXT0wOworICAgIHAtPmNocm9tYV93ZWlnaHRfbDBbMF1bMV09MTsKKyAgICBwLT5jaHJvbWFfb2Zmc2V0X2wwWzBdWzFdPTA7CisgICAgcC0+bHVtYV93ZWlnaHRfbDFfZmxhZyA9IDE7CisgICAgcC0+Y2hyb21hX3dlaWdodF9sMV9mbGFnID0gMTsKKyAgICBwLT5sdW1hX3dlaWdodF9sMFswXT0weDAxOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIHAtPlJlZlBpY0xpc3QwW2ldLmZsYWdzID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQ7CisgICAgICAgIHAtPlJlZlBpY0xpc3QxW2ldLmZsYWdzID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQ7CisgICAgfQorICAgIHAtPlJlZlBpY0xpc3QxWzBdLnBpY3R1cmVfaWQgPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgdm9pZCBTZXRWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NF9JbnRyYShWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCAqcCwgaW50IGZpcnN0KQoreworICAgIGludCBpOworICAgIG1lbXNldChwLCAwLCBzaXplb2YoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQpKTsKKyAgICBwLT5zbGljZV9kYXRhX3NpemUgPSAwOworICAgIHAtPnNsaWNlX2RhdGFfYml0X29mZnNldCA9IDY0OworICAgIHAtPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyID0gMjsKKyAgICBwLT5zbGljZV9iZXRhX29mZnNldF9kaXYyID0gMjsKKyAgICBwLT5zbGljZV90eXBlID0gMjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgcC0+bHVtYV93ZWlnaHRfbDBfZmxhZyA9IDE7CisgICAgICAgIHAtPmNocm9tYV93ZWlnaHRfbDBfZmxhZyA9IDE7CisgICAgICAgIHAtPmx1bWFfd2VpZ2h0X2wxX2ZsYWcgPSAxOworICAgICAgICBwLT5jaHJvbWFfd2VpZ2h0X2wxX2ZsYWcgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHAtPmNocm9tYV93ZWlnaHRfbDBfZmxhZyA9IDE7CisgICAgICAgIHAtPmNocm9tYV93ZWlnaHRfbDBbMF1bMF09MTsKKyAgICAgICAgcC0+Y2hyb21hX29mZnNldF9sMFswXVswXT0wOworICAgICAgICBwLT5jaHJvbWFfd2VpZ2h0X2wwWzBdWzFdPTE7CisgICAgICAgIHAtPmNocm9tYV9vZmZzZXRfbDBbMF1bMV09MDsKKyAgICAgICAgcC0+bHVtYV93ZWlnaHRfbDFfZmxhZyA9IDE7CisgICAgICAgIHAtPmNocm9tYV93ZWlnaHRfbDFfZmxhZyA9IDE7CisgICAgICAgIHAtPmx1bWFfd2VpZ2h0X2wwWzBdPTB4MDE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIHAtPlJlZlBpY0xpc3QwW2ldLmZsYWdzID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQ7CisgICAgICAgIHAtPlJlZlBpY0xpc3QxW2ldLmZsYWdzID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQ7CisgICAgfQorICAgIHAtPlJlZlBpY0xpc3QxWzBdLnBpY3R1cmVfaWQgPSAweGZmZmZmZmZmOworICAgIHAtPlJlZlBpY0xpc3QwWzBdLnBpY3R1cmVfaWQgPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgdm9pZCBudjEyX3RvX3JnYmEoY29uc3QgVkFJbWFnZSB2YUltYWdlLCByZmJDbGllbnQgKmNsaWVudCwgaW50IGNoX3gsIGludCBjaF95LCBpbnQgY2hfdywgaW50IGNoX2gpCit7CisgICAgRGVidWdMb2coKCIlczogY29udmVydGluZyByZWdpb24gKCVkLCAlZCktKCVkLCAlZCkgZnJvbSBOVjEyLT5SR0JBXG4iLCBfX0ZVTkNUSU9OX18sIGNoX3gsIGNoX3ksIGNoX3csIGNoX2gpKTsKKworICAgIFZBU3RhdHVzIHZhX3N0YXR1czsKKyAgICB1aW50OF90ICpudjEyX2J1ZjsKKyAgICB2YV9zdGF0dXMgPSB2YU1hcEJ1ZmZlcih2YV9kcHksIHZhSW1hZ2UuYnVmLCAodm9pZCAqKikmbnYxMl9idWYpOworICAgIENIRUNLX1ZBU1RBVFVTKHZhX3N0YXR1cywgInZhTWFwQnVmZmVyKERlY29kZWREYXRhKSIpOworCisgICAgLyogYWRqdXN0IHgsIHksIHdpZHRoLCBoZWlnaHQgb2YgdGhlIGFmZmVjdGVkIGFyZWEgc28KKyAgICAgKiB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbi4KKyAgICAgKi8KKyAgICBpZiAoY2hfeCAlIDIpIHsgLS1jaF94OyArK2NoX3c7IH0KKyAgICBpZiAoY2hfeSAlIDIpIHsgLS1jaF95OyArK2NoX2g7IH0KKyAgICBpZiAoKGNoX3ggKyBjaF93KSAlIDIpIHsgKytjaF93OyB9CisgICAgaWYgKChjaF95ICsgY2hfaCkgJSAyKSB7ICsrY2hfaDsgfQorCisgICAgLyogcG9pbnQgbnYxMl9idWYgYW5kIGRzdCB0byB1cHBlciBsZWZ0IGNvcm5lciBvZiBjaGFuZ2VkIGFyZWEgKi8KKyAgICB1aW50OF90ICpudjEyX3kgID0gJm52MTJfYnVmW3ZhSW1hZ2Uub2Zmc2V0c1swXSArIHZhSW1hZ2UucGl0Y2hlc1swXSAqIGNoX3kgKyBjaF94XTsKKyAgICB1aW50OF90ICpudjEyX3V2ID0gJm52MTJfYnVmW3ZhSW1hZ2Uub2Zmc2V0c1sxXSArIHZhSW1hZ2UucGl0Y2hlc1sxXSAqIChjaF95IC8gMikgKyBjaF94XTsKKyAgICB1aW50MzJfdCAqZHN0ICAgID0gJigodWludDMyX3QqKWNsaWVudC0+ZnJhbWVCdWZmZXIpW2NsaWVudC0+d2lkdGggKiBjaF95ICsgY2hfeF07CisKKyAgICAvKiBUT0RPOiBvcHRpbWl6ZSBSLCBHLCBCIGNhbGN1bGF0aW9uLiBQb3NzaWJsZSB3YXlzIHRvIGRvIHRoaXM6CisgICAgICogICAgICAgLSB1c2UgbG9va3VwIHRhYmxlcworICAgICAqICAgICAgIC0gY29udmVydCBmcm9tIGZsb2F0aW5nIHBvaW50IHRvIGludGVnZXIgYXJpdGhtZXRpYworICAgICAqICAgICAgIC0gdXNlIE1NWC9TU0UgdG8gdmVjdG9yaXplIGNhbGN1bGF0aW9ucworICAgICAqICAgICAgIC0gdXNlIEdQVSAoVkEgVlBQLCBzaGFkZXIuLi4pCisgICAgICovCisgICAgaW50IHNyY194LCBzcmNfeTsKKyAgICBmb3IgKHNyY195ID0gMDsgc3JjX3kgPCBjaF9oOyBzcmNfeSArPSAyKSB7CisgICAgICAgIGZvciAoc3JjX3ggPSAwOyBzcmNfeCA8IGNoX3c7IHNyY194ICs9IDIpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbnZfdSA9IG52MTJfdXZbc3JjX3hdOworICAgICAgICAgICAgdWludDhfdCBudl92ID0gbnYxMl91dltzcmNfeCArIDFdOworICAgICAgICAgICAgdWludDhfdCBudl95WzRdID0geyBudjEyX3lbICAgICAgICAgICAgICAgICAgICAgc3JjX3hdLCBudjEyX3lbICAgICAgICAgICAgICAgICAgICAgc3JjX3ggKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMl95W3ZhSW1hZ2UucGl0Y2hlc1swXSArIHNyY194XSwgbnYxMl95W3ZhSW1hZ2UucGl0Y2hlc1swXSArIHNyY194ICsgMV0gfTsKKworICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgUiA9IDEuMTY0ICogKG52X3lbaV0gLSAxNikgICAgICAgICAgICAgICAgICAgICAgICArIDEuNTk2ICogKG52X3YgLSAxMjgpOworICAgICAgICAgICAgICAgIGRvdWJsZSBHID0gMS4xNjQgKiAobnZfeVtpXSAtIDE2KSAtIDAuMzkxICogKG52X3UgLSAxMjgpIC0gMC44MTMgKiAobnZfdiAtIDEyOCk7CisgICAgICAgICAgICAgICAgZG91YmxlIEIgPSAxLjE2NCAqIChudl95W2ldIC0gMTYpICsgMi4wMTggKiAobnZfdSAtIDEyOCk7CisKKyAgICAgICAgICAgICAgICAvKiBjbGFtcCBSLCBHLCBCIHZhbHVlcy4gRm9yIHNvbWUgWSwgVSwgViBjb21iaW5hdGlvbnMsCisgICAgICAgICAgICAgICAgICogdGhlIHJlc3VsdHMgb2YgdGhlIGFib3ZlIGNhbGN1bGF0aW9ucyBmYWxsIG91dHNpZGUgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgcmFuZ2UgMC0yNTUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKFIgPCAwLjApIFIgPSAwLjA7CisgICAgICAgICAgICAgICAgaWYgKEcgPCAwLjApIEcgPSAwLjA7CisgICAgICAgICAgICAgICAgaWYgKEIgPCAwLjApIEIgPSAwLjA7CisgICAgICAgICAgICAgICAgaWYgKFIgPiAyNTUuMCkgUiA9IDI1NS4wOworICAgICAgICAgICAgICAgIGlmIChHID4gMjU1LjApIEcgPSAyNTUuMDsKKyAgICAgICAgICAgICAgICBpZiAoQiA+IDI1NS4wKSBCID0gMjU1LjA7CisKKyAgICAgICAgICAgICAgICBkc3RbY2xpZW50LT53aWR0aCAqIChpIC8gMikgKyBzcmNfeCArIChpICUgMildID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKFIgKyAwLjUpIDw8IGNsaWVudC0+Zm9ybWF0LnJlZFNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKEcgKyAwLjUpIDw8IGNsaWVudC0+Zm9ybWF0LmdyZWVuU2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHVuc2lnbmVkIGludCkoQiArIDAuNSkgPDwgY2xpZW50LT5mb3JtYXQuYmx1ZVNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG52MTJfeSAgKz0gMiAqIHZhSW1hZ2UucGl0Y2hlc1swXTsKKyAgICAgICAgbnYxMl91diArPSB2YUltYWdlLnBpdGNoZXNbMV07CisgICAgICAgIGRzdCAgICAgKz0gMiAqIGNsaWVudC0+d2lkdGg7CisgICAgfQorCisgICAgQ0hFQ0tfU1VSRih2YV9zdXJmYWNlX2lkW3NpZF0pOworICAgIHZhX3N0YXR1cyA9IHZhVW5tYXBCdWZmZXIodmFfZHB5LCB2YUltYWdlLmJ1Zik7CisgICAgQ0hFQ0tfVkFTVEFUVVModmFfc3RhdHVzLCAidmFVbm1hcEJ1ZmZlcihEZWNvZGVkRGF0YSkiKTsKK30KKworI2VuZGlmIC8qIExJQlZOQ1NFUlZFUl9DT05GSUdfTElCVkEgKi8KZGlmZiAtLWdpdCBhL2xpYnZuY2NsaWVudC9saXN0ZW4uYyBiL2xpYnZuY2NsaWVudC9saXN0ZW4uYwppbmRleCBjOTFhZDZlLi42ZDRhZDU0IDEwMDY0NAotLS0gYS9saWJ2bmNjbGllbnQvbGlzdGVuLmMKKysrIGIvbGlidm5jY2xpZW50L2xpc3Rlbi5jCkBAIC0yNywxMSArMjcsMTMgQEAKICNlbmRpZgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIF9fTUlOR1czMl9fCisjaWZkZWYgV0lOMzIKICNkZWZpbmUgY2xvc2UgY2xvc2Vzb2NrZXQKICNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2lmZGVmIF9NSU5HVzMyCiAjdW5kZWYgbWF4Ci0jZWxzZQorI2VuZGlmIC8vICNpZmRlZiBfTUlOR1czMgorI2Vsc2UgLy8gI2lmZGVmIFdJTjMyCiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgogI2VuZGlmCkBAIC00Niw3ICs0OCw3IEBACiB2b2lkCiBsaXN0ZW5Gb3JJbmNvbWluZ0Nvbm5lY3Rpb25zKHJmYkNsaWVudCogY2xpZW50KQogewotI2lmZGVmIF9fTUlOR1czMl9fCisjaWZkZWYgV0lOMzIKICAgLyogRklYTUUgKi8KICAgcmZiQ2xpZW50RXJyKCJsaXN0ZW5Gb3JJbmNvbWluZ0Nvbm5lY3Rpb25zIG9uIE1pbkdXMzIgTk9UIElNUExFTUVOVEVEXG4iKTsKICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50L3JmYnByb3RvLmMgYi9saWJ2bmNjbGllbnQvcmZicHJvdG8uYwppbmRleCA4MDY0YjU2Li5mNjUzODUwIDEwMDY0NAotLS0gYS9saWJ2bmNjbGllbnQvcmZicHJvdG8uYworKysgYi9saWJ2bmNjbGllbnQvcmZicHJvdG8uYwpAQCAtMjYsNiArMjYsNyBAQAogI2lmZGVmIF9fU1RSSUNUX0FOU0lfXwogI2RlZmluZSBfQlNEX1NPVVJDRQogI2RlZmluZSBfUE9TSVhfU09VUkNFCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNjAwCiAjZW5kaWYKICNpZm5kZWYgV0lOMzIKICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTUyLDYgKzUzLDEyIEBACiAjZW5kaWYKICNpbmNsdWRlIDxqcGVnbGliLmg+CiAjZW5kaWYKKworI2lmbmRlZiBfTVNDX1ZFUgorLyogU3RyaW5ncy5oIGlzIG5vdCBhdmFpbGFibGUgaW4gTVNWQyAqLworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCkBAIC02Miw2ICs2OSwxMCBAQAogI2luY2x1ZGUgIm1pbmlsem8uaCIKICNpbmNsdWRlICJ0bHMuaCIKIAorI2lmZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmIC8qIE1TVkMgd2VudCBzdHJhaWdodCB0byB0aGUgdW5kZXJzY29yZWQgc3ludGF4ICovCisjZW5kaWYKKwogLyoKICAqIHJmYkNsaWVudExvZyBwcmludHMgYSB0aW1lLXN0YW1wZWQgbWVzc2FnZSB0byB0aGUgbG9nIGZpbGUgKHN0ZGVycikuCiAgKi8KQEAgLTE1Niw2ICsxNjcsMTAgQEAKIHN0YXRpYyB2b2lkIENvcHlSZWN0YW5nbGUocmZiQ2xpZW50KiBjbGllbnQsIHVpbnQ4X3QqIGJ1ZmZlciwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKICAgaW50IGo7CiAKKyAgaWYgKGNsaWVudC0+ZnJhbWVCdWZmZXIgPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICB9CisKICNkZWZpbmUgQ09QWV9SRUNUKEJQUCkgXAogICB7IFwKICAgICBpbnQgcnMgPSB3ICogQlBQIC8gOCwgcnMyID0gY2xpZW50LT53aWR0aCAqIEJQUCAvIDg7IFwKQEAgLTI1OCw2ICsyNzMsOSBAQAogc3RhdGljIHJmYkJvb2wgSGFuZGxlWlJMRTI0RG93bihyZmJDbGllbnQqIGNsaWVudCwgaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKTsKIHN0YXRpYyByZmJCb29sIEhhbmRsZVpSTEUzMihyZmJDbGllbnQqIGNsaWVudCwgaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKTsKICNlbmRpZgorI2lmZGVmIExJQlZOQ1NFUlZFUl9DT05GSUdfTElCVkEKK3N0YXRpYyByZmJCb29sIEhhbmRsZUgyNjQgKHJmYkNsaWVudCogY2xpZW50LCBpbnQgcngsIGludCByeSwgaW50IHJ3LCBpbnQgcmgpOworI2VuZGlmCiAKIC8qCiAgKiBTZXJ2ZXIgQ2FwYWJpbGl0eSBGdW5jdGlvbnMKQEAgLTM4Nyw4ICs0MDUsOCBAQAogICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBzZXRidWYocmVjLT5maWxlLE5VTEwpOwotICAgIGZyZWFkKGJ1ZmZlciwxLHN0cmxlbihtYWdpYykscmVjLT5maWxlKTsKLSAgICBpZiAoc3RybmNtcChidWZmZXIsbWFnaWMsc3RybGVuKG1hZ2ljKSkpIHsKKworICAgIGlmIChmcmVhZChidWZmZXIsMSxzdHJsZW4obWFnaWMpLHJlYy0+ZmlsZSkgIT0gc3RybGVuKG1hZ2ljKSB8fCBzdHJuY21wKGJ1ZmZlcixtYWdpYyxzdHJsZW4obWFnaWMpKSkgewogICAgICAgcmZiQ2xpZW50TG9nKCJGaWxlICVzIHdhcyBub3QgcmVjb3JkZWQgYnkgdm5jcmVjLlxuIixjbGllbnQtPnNlcnZlckhvc3QpOwogICAgICAgZmNsb3NlKHJlYy0+ZmlsZSk7CiAgICAgICByZXR1cm4gRkFMU0U7CkBAIC01NjksNiArNTg3LDkgQEAKICAgICAgICAgcmZiQ2xpZW50TG9nKCIlZCkgUmVjZWl2ZWQgc2VjdXJpdHkgdHlwZSAlZFxuIiwgbG9vcCwgdEF1dGhbbG9vcF0pOwogICAgICAgICBpZiAoZmxhZykgY29udGludWU7CiAgICAgICAgIGlmICh0QXV0aFtsb29wXT09cmZiVm5jQXV0aCB8fCB0QXV0aFtsb29wXT09cmZiTm9BdXRoIHx8CisjaWYgZGVmaW5lZChMSUJWTkNTRVJWRVJfSEFWRV9HTlVUTFMpIHx8IGRlZmluZWQoTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMKQorICAgICAgICAgICAgdEF1dGhbbG9vcF09PXJmYlZlTkNyeXB0IHx8CisjZW5kaWYKICAgICAgICAgICAgICh0QXV0aFtsb29wXT09cmZiQVJEICYmIGNsaWVudC0+R2V0Q3JlZGVudGlhbCkgfHwKICAgICAgICAgICAgICghc3ViQXV0aCAmJiAodEF1dGhbbG9vcF09PXJmYlRMUyB8fCAodEF1dGhbbG9vcF09PXJmYlZlTkNyeXB0ICYmIGNsaWVudC0+R2V0Q3JlZGVudGlhbCkpKSkKICAgICAgICAgewpAQCAtMTIzMiw3ICsxMjUzLDggQEAKICAgY2xpZW50LT5zaS5mb3JtYXQuYmx1ZU1heCA9IHJmYkNsaWVudFN3YXAxNklmTEUoY2xpZW50LT5zaS5mb3JtYXQuYmx1ZU1heCk7CiAgIGNsaWVudC0+c2kubmFtZUxlbmd0aCA9IHJmYkNsaWVudFN3YXAzMklmTEUoY2xpZW50LT5zaS5uYW1lTGVuZ3RoKTsKIAotICBjbGllbnQtPmRlc2t0b3BOYW1lID0gbWFsbG9jKGNsaWVudC0+c2kubmFtZUxlbmd0aCArIDEpOworICAvKiBUbyBndWFyZCBhZ2FpbnN0IGludGVnZXIgd3JhcC1hcm91bmQsIHNpLm5hbWVMZW5ndGggaXMgY2FzdCB0byA2NCBiaXQgKi8KKyAgY2xpZW50LT5kZXNrdG9wTmFtZSA9IG1hbGxvYygodWludDY0X3QpY2xpZW50LT5zaS5uYW1lTGVuZ3RoICsgMSk7CiAgIGlmICghY2xpZW50LT5kZXNrdG9wTmFtZSkgewogICAgIHJmYkNsaWVudExvZygiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGRlc2t0b3AgbmFtZSwgJWx1IGJ5dGVzXG4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpY2xpZW50LT5zaS5uYW1lTGVuZ3RoKTsKQEAgLTEyNzYsNiArMTI5OCw4IEBACiAgIGlmICghU3VwcG9ydHNDbGllbnQyU2VydmVyKGNsaWVudCwgcmZiU2V0UGl4ZWxGb3JtYXQpKSByZXR1cm4gVFJVRTsKIAogICBzcGYudHlwZSA9IHJmYlNldFBpeGVsRm9ybWF0OworICBzcGYucGFkMSA9IDA7CisgIHNwZi5wYWQyID0gMDsKICAgc3BmLmZvcm1hdCA9IGNsaWVudC0+Zm9ybWF0OwogICBzcGYuZm9ybWF0LnJlZE1heCA9IHJmYkNsaWVudFN3YXAxNklmTEUoc3BmLmZvcm1hdC5yZWRNYXgpOwogICBzcGYuZm9ybWF0LmdyZWVuTWF4ID0gcmZiQ2xpZW50U3dhcDE2SWZMRShzcGYuZm9ybWF0LmdyZWVuTWF4KTsKQEAgLTEzNDIsNiArMTM2NiwxMCBAQAogCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSByZmJDbGllbnRTd2FwMzJJZkxFKHJmYkVuY29kaW5nQ29SUkUpOwogICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcChlbmNTdHIsInJyZSIsZW5jU3RyTGVuKSA9PSAwKSB7CiAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IHJmYkNsaWVudFN3YXAzMklmTEUocmZiRW5jb2RpbmdSUkUpOworI2lmZGVmIExJQlZOQ1NFUlZFUl9DT05GSUdfTElCVkEKKyAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAoZW5jU3RyLCJoMjY0IixlbmNTdHJMZW4pID09IDApIHsKKwllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gcmZiQ2xpZW50U3dhcDMySWZMRShyZmJFbmNvZGluZ0gyNjQpOworI2VuZGlmCiAgICAgICB9IGVsc2UgewogCXJmYkNsaWVudExvZygiVW5rbm93biBlbmNvZGluZyAnJS4qcydcbiIsZW5jU3RyTGVuLGVuY1N0cik7CiAgICAgICB9CkBAIC0xNDEwLDYgKzE0MzgsMTAgQEAKICAgICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSByZmJDbGllbnRTd2FwMzJJZkxFKGNsaWVudC0+YXBwRGF0YS5xdWFsaXR5TGV2ZWwgKwogCQkJCQkgIHJmYkVuY29kaW5nUXVhbGl0eUxldmVsMCk7CiAgICAgfQorI2lmZGVmIExJQlZOQ1NFUlZFUl9DT05GSUdfTElCVkEKKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gcmZiQ2xpZW50U3dhcDMySWZMRShyZmJFbmNvZGluZ0gyNjQpOworICAgIHJmYkNsaWVudExvZygiaDI2NCBlbmNvZGluZyBhZGRlZFxuIik7CisjZW5kaWYKICAgfQogCiAKQEAgLTE4MDcsNyArMTgzOSw4IEBACiAJY2xpZW50LT51cGRhdGVSZWN0LnggPSBjbGllbnQtPnVwZGF0ZVJlY3QueSA9IDA7CiAJY2xpZW50LT51cGRhdGVSZWN0LncgPSBjbGllbnQtPndpZHRoOwogCWNsaWVudC0+dXBkYXRlUmVjdC5oID0gY2xpZW50LT5oZWlnaHQ7Ci0JY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcihjbGllbnQpOworCWlmICghY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcihjbGllbnQpKQorCSAgcmV0dXJuIEZBTFNFOwogCVNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoY2xpZW50LCAwLCAwLCByZWN0LnIudywgcmVjdC5yLmgsIEZBTFNFKTsKIAlyZmJDbGllbnRMb2coIkdvdCBuZXcgZnJhbWVidWZmZXIgc2l6ZTogJWR4JWRcbiIsIHJlY3Quci53LCByZWN0LnIuaCk7CiAJY29udGludWU7CkBAIC0yMTI2LDYgKzIxNTksMTQgQEAKICAgICAgfQogCiAjZW5kaWYKKyNpZmRlZiBMSUJWTkNTRVJWRVJfQ09ORklHX0xJQlZBCisgICAgICBjYXNlIHJmYkVuY29kaW5nSDI2NDoKKyAgICAgIHsKKwlpZiAoIUhhbmRsZUgyNjQoY2xpZW50LCByZWN0LnIueCwgcmVjdC5yLnksIHJlY3Quci53LCByZWN0LnIuaCkpCisJICByZXR1cm4gRkFMU0U7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKIAogICAgICAgZGVmYXVsdDoKIAkgewpAQCAtMjI2MCw3ICsyMzAxLDkgQEAKICAgICBjbGllbnQtPnVwZGF0ZVJlY3QueCA9IGNsaWVudC0+dXBkYXRlUmVjdC55ID0gMDsKICAgICBjbGllbnQtPnVwZGF0ZVJlY3QudyA9IGNsaWVudC0+d2lkdGg7CiAgICAgY2xpZW50LT51cGRhdGVSZWN0LmggPSBjbGllbnQtPmhlaWdodDsKLSAgICBjbGllbnQtPk1hbGxvY0ZyYW1lQnVmZmVyKGNsaWVudCk7CisgICAgaWYgKCFjbGllbnQtPk1hbGxvY0ZyYW1lQnVmZmVyKGNsaWVudCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKICAgICBTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGNsaWVudCwgMCwgMCwgY2xpZW50LT53aWR0aCwgY2xpZW50LT5oZWlnaHQsIEZBTFNFKTsKICAgICByZmJDbGllbnRMb2coIkdvdCBuZXcgZnJhbWVidWZmZXIgc2l6ZTogJWR4JWRcbiIsIGNsaWVudC0+d2lkdGgsIGNsaWVudC0+aGVpZ2h0KTsKICAgICBicmVhazsKQEAgLTIyNzYsNyArMjMxOSw4IEBACiAgICAgY2xpZW50LT51cGRhdGVSZWN0LnggPSBjbGllbnQtPnVwZGF0ZVJlY3QueSA9IDA7CiAgICAgY2xpZW50LT51cGRhdGVSZWN0LncgPSBjbGllbnQtPndpZHRoOwogICAgIGNsaWVudC0+dXBkYXRlUmVjdC5oID0gY2xpZW50LT5oZWlnaHQ7Ci0gICAgY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcihjbGllbnQpOworICAgIGlmICghY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcihjbGllbnQpKQorICAgICAgcmV0dXJuIEZBTFNFOwogICAgIFNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoY2xpZW50LCAwLCAwLCBjbGllbnQtPndpZHRoLCBjbGllbnQtPmhlaWdodCwgRkFMU0UpOwogICAgIHJmYkNsaWVudExvZygiR290IG5ldyBmcmFtZWJ1ZmZlciBzaXplOiAlZHglZFxuIiwgY2xpZW50LT53aWR0aCwgY2xpZW50LT5oZWlnaHQpOwogICAgIGJyZWFrOwpAQCAtMjM1OSw2ICsyNDAzLDcgQEAKICNkZWZpbmUgVU5DT01QIC04CiAjaW5jbHVkZSAienJsZS5jIgogI3VuZGVmIEJQUAorI2luY2x1ZGUgImgyNjQuYyIKIAogCiAvKgpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50L3NvY2tldHMuYyBiL2xpYnZuY2NsaWVudC9zb2NrZXRzLmMKaW5kZXggNzY0NDFmOS4uYzA5YjU1NSAxMDA2NDQKLS0tIGEvbGlidm5jY2xpZW50L3NvY2tldHMuYworKysgYi9saWJ2bmNjbGllbnQvc29ja2V0cy5jCkBAIC0yNCw2ICsyNCwxMSBAQAogCiAjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCiAjZGVmaW5lIF9CU0RfU09VUkNFCisjaWZkZWYgX19saW51eF9fCisvKiBTZXR0aW5nIHRoaXMgb24gb3RoZXIgc3lzdGVtcyBoaWRlcyBkZWZpbml0aW9ucyBzdWNoIGFzIElOQUREUl9MT09QQkFDSy4KKyAqIFRoZSBjaGVjayBzaG91bGQgYmUgZm9yIF9fR0xJQkNfXyBpbiBmYWN0LiAqLworIyBkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2VuZGlmCiAjZW5kaWYKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtMzMsNyArMzgsOSBAQAogI2lmZGVmIFdJTjMyCiAjdW5kZWYgU09DS0VUCiAjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpZmRlZiBNSU5HVzMyCiAjZGVmaW5lIEVXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjZW5kaWYKICNkZWZpbmUgY2xvc2UgY2xvc2Vzb2NrZXQKICNkZWZpbmUgcmVhZChzb2NrLGJ1ZixsZW4pIHJlY3Yoc29jayxidWYsbGVuLDApCiAjZGVmaW5lIHdyaXRlKHNvY2ssYnVmLGxlbikgc2VuZChzb2NrLGJ1ZixsZW4sMCkKQEAgLTUyLDYgKzU5LDEwIEBACiAjZW5kaWYKICNpbmNsdWRlICJ0bHMuaCIKIAorI2lmZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKwogdm9pZCBQcmludEluSGV4KGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAKIHJmYkJvb2wgZXJyb3JNZXNzYWdlT25SZWFkRmFpbHVyZSA9IFRSVUU7CkBAIC03OSw2ICs5MCwxMyBAQAogCWludCBubj1uOwogCXJmYkNsaWVudExvZygiUmVhZEZyb21SRkJTZXJ2ZXIgJWQgYnl0ZXNcbiIsbik7CiAjZW5kaWYKKworICAvKiBIYW5kbGUgYXR0ZW1wdHMgdG8gd3JpdGUgdG8gTlVMTCBvdXQgYnVmZmVyIHRoYXQgbWlnaHQgb2NjdXIKKyAgICAgd2hlbiBhbiBvdXRzaWRlIG1hbGxvYygpIGZhaWxzLiBGb3IgaW5zdGFuY2UsIG1lbWNweSgpIHRvIE5VTEwKKyAgICAgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyIGFuZCBwcm9iYWJseSBtZW1vcnkgY29ycnVwdGlvbi4qLworICBpZighb3V0KQorICAgIHJldHVybiBGQUxTRTsKKwogICBpZiAoY2xpZW50LT5zZXJ2ZXJQb3J0PT0tMSkgewogICAgIC8qIHZuY3JlYyBwbGF5aW5nICovCiAgICAgcmZiVk5DUmVjKiByZWMgPSBjbGllbnQtPnZuY1JlYzsKQEAgLTEwMCw3ICsxMTgsNyBAQAogCSAgZGlmZi50dl9zZWMtLTsKIAkgIGRpZmYudHZfdXNlYys9MTAwMDAwMDsKICAgICAgICAgfQotI2lmbmRlZiBfX01JTkdXMzJfXworI2lmbmRlZiBXSU4zMgogICAgICAgICBzbGVlcCAoZGlmZi50dl9zZWMpOwogICAgICAgICB1c2xlZXAgKGRpZmYudHZfdXNlYyk7CiAjZWxzZQpAQCAtMTExLDcgKzEyOSw3IEBACiAgICAgICByZWMtPnR2PXR2OwogICAgIH0KICAgICAKLSAgICByZXR1cm4gKGZyZWFkKG91dCwxLG4scmVjLT5maWxlKTwwP0ZBTFNFOlRSVUUpOworICAgIHJldHVybiAoZnJlYWQob3V0LDEsbixyZWMtPmZpbGUpICE9IG4gPyBGQUxTRSA6IFRSVUUpOwogICB9CiAgIAogICBpZiAobiA8PSBjbGllbnQtPmJ1ZmZlcmVkKSB7CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvdGxzX29wZW5zc2wuYyBiL2xpYnZuY2NsaWVudC90bHNfb3BlbnNzbC5jCmluZGV4IGI2ZGY5NDYuLjAwZDAzMWQgMTAwNjQ0Ci0tLSBhL2xpYnZuY2NsaWVudC90bHNfb3BlbnNzbC5jCisrKyBiL2xpYnZuY2NsaWVudC90bHNfb3BlbnNzbC5jCkBAIC0yNywyOCArMjcsNTcgQEAKICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KIAorI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gTVVURVhfVFlQRTsKKyNkZWZpbmUgTVVURVhfSU5JVChtdXRleCkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXgpCisjZGVmaW5lIE1VVEVYX0ZSRUUobXV0ZXgpIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXgpCisjZGVmaW5lIE1VVEVYX0xPQ0sobXV0ZXgpIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtdXRleCkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXgpCisjZGVmaW5lIENVUlJFTlRfVEhSRUFEX0lEIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZWxzZQordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgTVVURVhfVFlQRTsKKyNkZWZpbmUgTVVURVhfSU5JVChtdXRleCkge1wKKwlwdGhyZWFkX211dGV4YXR0cl90IG11dGV4QXR0cjtcCisJcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhBdHRyKTtcCisJcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhBdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7XAorCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgsICZtdXRleEF0dHIpO1wKK30KKyNkZWZpbmUgTVVURVhfRlJFRShtdXRleCkgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleCkKKyNkZWZpbmUgTVVURVhfTE9DSyhtdXRleCkgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpCisjZGVmaW5lIENVUlJFTlRfVEhSRUFEX0lEIHB0aHJlYWRfc2VsZigpCisjZW5kaWYKKworI2lmbmRlZiBfTVNDX1ZFUgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSAidGxzLmgiCiAKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPEJhc2VUc2QuaD4gLy8gVGhhdCdzIGZvciBTU0laRV9UCit0eXBlZGVmIFNTSVpFX1Qgc3NpemVfdDsKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKwogc3RhdGljIHJmYkJvb2wgcmZiVExTSW5pdGlhbGl6ZWQgPSBGQUxTRTsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgKm11dGV4X2J1ZiA9IE5VTEw7CitzdGF0aWMgTVVURVhfVFlQRSAqbXV0ZXhfYnVmID0gTlVMTDsKIAogc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlIHsKLQlwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisJTVVURVhfVFlQRSBtdXRleDsKIH07CiAKIHN0YXRpYyB2b2lkIGxvY2tpbmdfZnVuY3Rpb24oaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKIHsKIAlpZiAobW9kZSAmIENSWVBUT19MT0NLKQotCQlwdGhyZWFkX211dGV4X2xvY2soJm11dGV4X2J1ZltuXSk7CisJCU1VVEVYX0xPQ0sobXV0ZXhfYnVmW25dKTsKIAllbHNlCi0JCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF9idWZbbl0pOworCQlNVVRFWF9VTkxPQ0sobXV0ZXhfYnVmW25dKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWRfZnVuY3Rpb24odm9pZCkKIHsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKSk7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZykgQ1VSUkVOVF9USFJFQURfSUQpOwogfQogCiBzdGF0aWMgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpkeW5fY3JlYXRlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQpAQCAtNTksNyArODgsNyBAQAogCQltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSkpOwogCWlmICghdmFsdWUpCiAJCWdvdG8gZXJyOwotCXB0aHJlYWRfbXV0ZXhfaW5pdCgmdmFsdWUtPm11dGV4LCBOVUxMKTsKKwlNVVRFWF9JTklUKHZhbHVlLT5tdXRleCk7CiAKIAlyZXR1cm4gdmFsdWU7CiAKQEAgLTcwLDE2ICs5OSwxNiBAQAogc3RhdGljIHZvaWQgZHluX2xvY2tfZnVuY3Rpb24gKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQogewogCWlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCi0JCXB0aHJlYWRfbXV0ZXhfbG9jaygmbC0+bXV0ZXgpOworCQlNVVRFWF9MT0NLKGwtPm11dGV4KTsKIAllbHNlCi0JCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsLT5tdXRleCk7CisJCU1VVEVYX1VOTE9DSyhsLT5tdXRleCk7CiB9CiAKIAogc3RhdGljIHZvaWQKIGR5bl9kZXN0cm95X2Z1bmN0aW9uKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCiB7Ci0JcHRocmVhZF9tdXRleF9kZXN0cm95KCZsLT5tdXRleCk7CisJTVVURVhfRlJFRShsLT5tdXRleCk7CiAJZnJlZShsKTsKIH0KIApAQCAtMTE3LDE0ICsxNDYsMTQgQEAKIAogICBpZiAocmZiVExTSW5pdGlhbGl6ZWQpIHJldHVybiBUUlVFOwogCi0gIG11dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YocHRocmVhZF9tdXRleF90KSk7CisgIG11dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOwogICBpZiAobXV0ZXhfYnVmID09IE5VTEwpIHsKICAgICByZmJDbGllbnRMb2coIkZhaWxlZCB0byBpbml0aWFsaXplZCBPcGVuU1NMOiBtZW1vcnkuXG4iKTsKICAgICByZXR1cm4gKC0xKTsKICAgfQogCiAgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4X2J1ZltpXSwgTlVMTCk7CisgICAgTVVURVhfSU5JVChtdXRleF9idWZbaV0pOwogCiAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhsb2NraW5nX2Z1bmN0aW9uKTsKICAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhpZF9mdW5jdGlvbik7CkBAIC0xNDUsNyArMTc0LDYgQEAKIHsKICAgdW5zaWduZWQgY2hhciBtZDVzdW1bMTZdLCBmaW5nZXJwcmludFs0MF0sICpmOwogICByZmJDbGllbnQgKmNsaWVudDsKLSAgY2hhciAqcHJvbXB0LCAqY2VydF9zdHI7CiAgIGludCBlcnIsIGk7CiAgIHVuc2lnbmVkIGludCBtZDVsZW47CiAgIC8vY2hhciBidWZbMjU3XTsKQEAgLTE5NCw3ICsyMjIsNyBAQAogCUZEX1NFVChTU0xfZ2V0X2ZkKHNzbCksICZmZHMpOwogCiAJdHYudHZfc2VjID0gbXMgLyAxMDAwOwotCXR2LnR2X3VzZWMgPSAobXMgJSAxMDAwKSAqIG1zOworCXR2LnR2X3VzZWMgPSAobXMgJSAxMDAwKSAqIDEwMDA7CiAJCiAJciA9IHNlbGVjdCAoU1NMX2dldF9mZChzc2wpICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsgCiAKQEAgLTIwMyw4ICsyMzEsNiBAQAogCiBzdGF0aWMgaW50IHdhaXRfZm9yX2RhdGEoU1NMICpzc2wsIGludCByZXQsIGludCB0aW1lb3V0KQogewotICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgZmRfc2V0IGZkczsKICAgaW50IGVycjsKICAgaW50IHJldHZhbCA9IDE7CiAKQEAgLTIzNyw3ICsyNjMsNiBAQAogICBTU0xfQ1RYICpzc2xfY3R4ID0gTlVMTDsKICAgU1NMICpzc2wgPSBOVUxMOwogICBpbnQgbiwgZmluaXNoZWQgPSAwOwotICBCSU8gKnNiaW87CiAKICAgc3NsX2N0eCA9IFNTTF9DVFhfbmV3IChTU0x2MjNfY2xpZW50X21ldGhvZCAoKSk7CiAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzIChzc2xfY3R4KTsKQEAgLTI3Niw4ICszMDEsNiBAQAogc3RhdGljIHJmYkJvb2wKIEluaXRpYWxpemVUTFNTZXNzaW9uKHJmYkNsaWVudCogY2xpZW50LCByZmJCb29sIGFub25UTFMpCiB7Ci0gIGludCByZXQ7Ci0KICAgaWYgKGNsaWVudC0+dGxzU2Vzc2lvbikgcmV0dXJuIFRSVUU7CiAKICAgY2xpZW50LT50bHNTZXNzaW9uID0gb3Blbl9zc2xfY29ubmVjdGlvbiAoY2xpZW50LCBjbGllbnQtPnNvY2ssIGFub25UTFMpOwpAQCAtMzEwLDcgKzMzMywxMSBAQAogICAgIGlmIChyZXQgIT0gLTEpCiAgICAgewogICAgICAgcmZiQ2xpZW50TG9nKCJUTFMgaGFuZHNoYWtlIGJsb2NraW5nLlxuIik7Ci0gICAgICBzbGVlcCgxKTsKKyNpZmRlZiBXSU4zMgorICAgICAgU2xlZXAoMTAwMCk7CisjZWxzZQorCSAgc2xlZXAoMSk7CisjZW5kaWYKICAgICAgIHRpbWVvdXQtLTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KQEAgLTQxNSw3ICs0NDIsNiBAQAogICB1aW50MzJfdCBhdXRoU2NoZW1lOwogICByZmJCb29sIGFub25UTFM7CiAvLyAgZ251dGxzX2NlcnRpZmljYXRlX2NyZWRlbnRpYWxzX3QgeDUwOV9jcmVkID0gTlVMTDsKLSAgaW50IHJldDsKIAogICBpZiAoIUluaXRpYWxpemVUTFMoKSkgcmV0dXJuIEZBTFNFOwogCkBAIC01NzcsNyArNjAzLDcgQEAKICAgICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQotICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF9idWZbaV0pOworICAgICAgTVVURVhfRlJFRShtdXRleF9idWZbaV0pOwogICAgIGZyZWUobXV0ZXhfYnVmKTsKICAgICBtdXRleF9idWYgPSBOVUxMOwogICB9CmRpZmYgLS1naXQgYS9saWJ2bmNjbGllbnQvdm5jdmlld2VyLmMgYi9saWJ2bmNjbGllbnQvdm5jdmlld2VyLmMKaW5kZXggNDE1M2M5Ny4uYjEyMTE2YyAxMDA2NDQKLS0tIGEvbGlidm5jY2xpZW50L3ZuY3ZpZXdlci5jCisrKyBiL2xpYnZuY2NsaWVudC92bmN2aWV3ZXIuYwpAQCAtMjEsNiArMjEsMTUgQEAKICAqIHZuY3ZpZXdlci5jIC0gdGhlIFh0LWJhc2VkIFZOQyB2aWV3ZXIuCiAgKi8KIAorI2lmZGVmIFdJTjMyCisjdW5kZWYgU09DS0VUCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAgLyogUHJldmVudCBQT1NJWCBkZXByZWNhdGlvbiB3YXJuaW5ncyAqLworI2VuZGlmCisKICNpZmRlZiBfX1NUUklDVF9BTlNJX18KICNkZWZpbmUgX0JTRF9TT1VSQ0UKICNkZWZpbmUgX1BPU0lYX1NPVVJDRQpAQCAtNDAsMTIgKzQ5LDEwIEBACiBzdGF0aWMgdm9pZCBEdW1teVJlY3QocmZiQ2xpZW50KiBjbGllbnQsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CiB9CiAKLSNpZmRlZiBfX01JTkdXMzJfXworI2lmZGVmIFdJTjMyCiBzdGF0aWMgY2hhciogTm9QYXNzd29yZChyZmJDbGllbnQqIGNsaWVudCkgewogICByZXR1cm4gc3RyZHVwKCIiKTsKIH0KLSN1bmRlZiBTT0NLRVQKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgogI2RlZmluZSBjbG9zZSBjbG9zZXNvY2tldAogI2Vsc2UKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNTMsOSArNjAsOSBAQAogI2VuZGlmCiAKIHN0YXRpYyBjaGFyKiBSZWFkUGFzc3dvcmQocmZiQ2xpZW50KiBjbGllbnQpIHsKLSNpZmRlZiBfX01JTkdXMzJfXworI2lmZGVmIFdJTjMyCiAJLyogRklYTUUgKi8KLQlyZmJDbGllbnRFcnIoIlJlYWRQYXNzd29yZCBvbiBNaW5HVzMyIE5PVCBJTVBMRU1FTlRFRFxuIik7CisJcmZiQ2xpZW50RXJyKCJSZWFkUGFzc3dvcmQgb24gV2luZG93cyBOT1QgSU1QTEVNRU5URURcbiIpOwogCXJldHVybiBOb1Bhc3N3b3JkKGNsaWVudCk7CiAjZWxzZQogCWludCBpOwpAQCAtODIsMTYgKzg5LDM4IEBACiAjZW5kaWYKIH0KIHN0YXRpYyByZmJCb29sIE1hbGxvY0ZyYW1lQnVmZmVyKHJmYkNsaWVudCogY2xpZW50KSB7CisgIHVpbnQ2NF90IGFsbG9jU2l6ZTsKKwogICBpZihjbGllbnQtPmZyYW1lQnVmZmVyKQogICAgIGZyZWUoY2xpZW50LT5mcmFtZUJ1ZmZlcik7Ci0gIGNsaWVudC0+ZnJhbWVCdWZmZXI9bWFsbG9jKGNsaWVudC0+d2lkdGgqY2xpZW50LT5oZWlnaHQqY2xpZW50LT5mb3JtYXQuYml0c1BlclBpeGVsLzgpOworCisgIC8qIFNFQ1VSSVRZOiBwcm9tb3RlICd3aWR0aCcgaW50byB1aW50NjRfdCBzbyB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbiBkb2VzIG5vdCBvdmVyZmxvdworICAgICAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBhcmUgMTYtYml0IGludGVnZXJzIHBlciBSRkIgcHJvdG9jb2wgZGVzaWduCisgICAgIFNJWkVfTUFYIGlzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGZpdCBpbnRvIHNpemVfdAorICAqLworICBhbGxvY1NpemUgPSAodWludDY0X3QpY2xpZW50LT53aWR0aCAqIGNsaWVudC0+aGVpZ2h0ICogY2xpZW50LT5mb3JtYXQuYml0c1BlclBpeGVsLzg7CisKKyAgaWYgKGFsbG9jU2l6ZSA+PSBTSVpFX01BWCkgeworICAgIHJmYkNsaWVudEVycigiQ1JJVElDQUw6IGNhbm5vdCBhbGxvY2F0ZSBmcmFtZUJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlXG4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBjbGllbnQtPmZyYW1lQnVmZmVyPW1hbGxvYyggKHNpemVfdClhbGxvY1NpemUgKTsKKworICBpZiAoY2xpZW50LT5mcmFtZUJ1ZmZlciA9PSBOVUxMKQorICAgIHJmYkNsaWVudEVycigiQ1JJVElDQUw6IGZyYW1lQnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkLCByZXF1ZXN0ZWQgc2l6ZSB0b28gbGFyZ2Ugb3Igbm90IGVub3VnaCBtZW1vcnk/XG4iKTsKKwogICByZXR1cm4gY2xpZW50LT5mcmFtZUJ1ZmZlcj9UUlVFOkZBTFNFOwogfQogCiBzdGF0aWMgdm9pZCBpbml0QXBwRGF0YShBcHBEYXRhKiBkYXRhKSB7CiAJZGF0YS0+c2hhcmVEZXNrdG9wPVRSVUU7CiAJZGF0YS0+dmlld09ubHk9RkFMU0U7CisjaWZkZWYgTElCVk5DU0VSVkVSX0NPTkZJR19MSUJWQQorCWRhdGEtPmVuY29kaW5nc1N0cmluZz0iaDI2NCB0aWdodCB6cmxlIHVsdHJhIGNvcHlyZWN0IGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3IjsKKyNlbHNlCiAJZGF0YS0+ZW5jb2RpbmdzU3RyaW5nPSJ0aWdodCB6cmxlIHVsdHJhIGNvcHlyZWN0IGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3IjsKKyNlbmRpZgogCWRhdGEtPnVzZUJHUjIzMz1GQUxTRTsKIAlkYXRhLT5uQ29sb3Vycz0wOwogCWRhdGEtPmZvcmNlT3duQ21hcD1GQUxTRTsKQEAgLTEyOSw2ICsxNTgsOSBAQAogICAvKiBkZWZhdWx0OiB1c2UgY29tcGxldGUgZnJhbWUgYnVmZmVyICovIAogICBjbGllbnQtPnVwZGF0ZVJlY3QueCA9IC0xOwogIAorICBjbGllbnQtPmZyYW1lQnVmZmVyID0gTlVMTDsKKyAgY2xpZW50LT5vdXRwdXRXaW5kb3cgPSAwOworIAogICBjbGllbnQtPmZvcm1hdC5iaXRzUGVyUGl4ZWwgPSBieXRlc1BlclBpeGVsKjg7CiAgIGNsaWVudC0+Zm9ybWF0LmRlcHRoID0gYml0c1BlclNhbXBsZSpzYW1wbGVzUGVyUGl4ZWw7CiAgIGNsaWVudC0+YXBwRGF0YS5yZXF1ZXN0ZWREZXB0aD1jbGllbnQtPmZvcm1hdC5kZXB0aDsKQEAgLTIyNSw3ICsyNTcsOCBAQAogCiAgIGNsaWVudC0+d2lkdGg9Y2xpZW50LT5zaS5mcmFtZWJ1ZmZlcldpZHRoOwogICBjbGllbnQtPmhlaWdodD1jbGllbnQtPnNpLmZyYW1lYnVmZmVySGVpZ2h0OwotICBjbGllbnQtPk1hbGxvY0ZyYW1lQnVmZmVyKGNsaWVudCk7CisgIGlmICghY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlcihjbGllbnQpKQorICAgIHJldHVybiBGQUxTRTsKIAogICBpZiAoIVNldEZvcm1hdEFuZEVuY29kaW5ncyhjbGllbnQpKQogICAgIHJldHVybiBGQUxTRTsKQEAgLTM2NSw2ICszOTgsMTIgQEAKIAogICBGcmVlVExTKGNsaWVudCk7CiAKKyAgd2hpbGUgKGNsaWVudC0+Y2xpZW50RGF0YSkgeworICAgIHJmYkNsaWVudERhdGEqIG5leHQgPSBjbGllbnQtPmNsaWVudERhdGEtPm5leHQ7CisgICAgZnJlZShjbGllbnQtPmNsaWVudERhdGEpOworICAgIGNsaWVudC0+Y2xpZW50RGF0YSA9IG5leHQ7CisgIH0KKwogICBpZiAoY2xpZW50LT5zb2NrID49IDApCiAgICAgY2xvc2UoY2xpZW50LT5zb2NrKTsKICAgaWYgKGNsaWVudC0+bGlzdGVuU29jayA+PSAwKQpkaWZmIC0tZ2l0IGEvbGlidm5jY2xpZW50L3pybGUuYyBiL2xpYnZuY2NsaWVudC96cmxlLmMKaW5kZXggYTE0YWQ0NC4uN2Y0ODhiNSAxMDA2NDQKLS0tIGEvbGlidm5jY2xpZW50L3pybGUuYworKysgYi9saWJ2bmNjbGllbnQvenJsZS5jCkBAIC0xODksNyArMTg5LDcgQEAKIAl9IC8qIHdoaWxlICggcmVtYWluaW5nID4gMCApICovCiAKIAlpZiAoIGluZmxhdGVSZXN1bHQgPT0gWl9PSyApIHsKLQkJdm9pZCogYnVmPWNsaWVudC0+cmF3X2J1ZmZlcjsKKwkJY2hhciogYnVmPWNsaWVudC0+cmF3X2J1ZmZlcjsKIAkJaW50IGksajsKIAogCQlyZW1haW5pbmcgPSBjbGllbnQtPnJhd19idWZmZXJfc2l6ZS1jbGllbnQtPmRlY29tcFN0cmVhbS5hdmFpbF9vdXQ7CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXItY29uZmlnIGIvbGlidm5jc2VydmVyLWNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGZiM2E1MC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXItY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyEvYmluL3NoCi0KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0ke3ByZWZpeH0KLWV4ZWNfcHJlZml4X3NldD1ubwotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotCi0jIGlmIHRoaXMgc2NyaXB0IGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBsaWJ2bmNzZXJ2ZXItY29uZmlnLmluLCBhc3N1bWUgbm90IGluc3RhbGxlZAotaWYgWyAtZiAiYGRpcm5hbWUgIiQwImAvbGlidm5jc2VydmVyLWNvbmZpZy5pbiIgXTsgdGhlbgotICBkaXI9ImBkaXJuYW1lICIkMCJgIgotICBwcmVmaXg9ImBjZCAiJGRpciI7IHB3ZGAiCi0gIGluY2x1ZGVkaXI9IiRwcmVmaXgiCi0gIGxpYmRpcj0iJHByZWZpeC9saWJ2bmNzZXJ2ZXIvLmxpYnMgJHByZWZpeC9saWJ2bmNjbGllbnQvLmxpYnMiCi1maQotCi11c2FnZT0iXAotVXNhZ2U6IExpYlZOQ1NlcnZlci1jb25maWcgWy0tcHJlZml4Wz1ESVJdXSBbLS1leGVjLXByZWZpeFs9RElSXV0gWy0tdmVyc2lvbl0gWy0tbGlua10gWy0tbGlic10gWy0tY2ZsYWdzXSIKLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICAgICAgZWNobyAiJHt1c2FnZX0iIDE+JjIKLSAgICAgIGV4aXQgMQotZmkKLQotd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgY2FzZSAiJDEiIGluCi0gIC0qPSopIG9wdGFyZz1gZWNobyAiJDEiIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgY2FzZSAkMSBpbgotICAgIC0tcHJlZml4PSopCi0gICAgICBwcmVmaXg9JG9wdGFyZwotICAgICAgaWYgdGVzdCAkZXhlY19wcmVmaXhfc2V0ID0gbm8gOyB0aGVuCi0gICAgICAgIGV4ZWNfcHJlZml4PSRvcHRhcmcKLSAgICAgIGZpCi0gICAgICA7OwotICAgIC0tcHJlZml4KQotICAgICAgZWNobyAkcHJlZml4Ci0gICAgICA7OwotICAgIC0tZXhlYy1wcmVmaXg9KikKLSAgICAgIGV4ZWNfcHJlZml4PSRvcHRhcmcKLSAgICAgIGV4ZWNfcHJlZml4X3NldD15ZXMKLSAgICAgIDs7Ci0gICAgLS1leGVjLXByZWZpeCkKLSAgICAgIGVjaG8gJGV4ZWNfcHJlZml4Ci0gICAgICA7OwotICAgIC0tdmVyc2lvbikKLSAgICAgIGVjaG8gMC45LjkKLSAgICAgIDs7Ci0gICAgLS1jZmxhZ3MpCi0gICAgICBpZiBbICIkaW5jbHVkZWRpciIgIT0gL3Vzci9pbmNsdWRlIF07IHRoZW4KLQkgIGluY2x1ZGVzPS1JIiRpbmNsdWRlZGlyIgotICAgICAgZmkKLSAgICAgIGVjaG8gIiRpbmNsdWRlcyIKLSAgICAgIDs7Ci0gICAgLS1saWJzKQotICAgICAgbGlicz0iIgotICAgICAgZm9yIGRpciBpbiAkbGliZGlyOyBkbwotICAgICAgICBsaWJzPSIkbGlicyAtTCRkaXIiCi0gICAgICAgIGlmIFsgImB1bmFtZWAiID0gIlN1bk9TIiBdOyB0aGVuCi0gICAgICAgICAgIyB3aHkgb25seSBTb2xhcmlzPz8KLSAgICAgICAgICBsaWJzPSIkbGlicyAtUiRkaXIiCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBlY2hvICIkbGlicyIgLWx2bmNzZXJ2ZXIgLWx2bmNjbGllbnQgLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAgCi0gICAgICA7OwotICAgIC0tbGluaykKLSAgICAgIGVjaG8gZ2NjCi0gICAgICA7OwotICAgICopCi0gICAgICBlY2hvICIke3VzYWdlfSIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci5wYyBiL2xpYnZuY3NlcnZlci5wYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmZThiOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIucGMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JHtwcmVmaXh9Ci1saWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCi1pbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCi0KLU5hbWU6IExpYlZOQ1NlcnZlcgotRGVzY3JpcHRpb246IEEgbGlicmFyeSBmb3IgZWFzeSBpbXBsZW1lbnRhdGlvbiBvZiBhIFZOQyBzZXJ2ZXIuCi1WZXJzaW9uOiAwLjkuOQotUmVxdWlyZXM6Ci1MaWJzOiAtTCR7bGliZGlyfSAtbHZuY3NlcnZlciAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgICAKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9Ci0KZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci5wYy5pbiBiL2xpYnZuY3NlcnZlci5wYy5pbgppbmRleCBmOTI3M2VhLi5kMjQ2MDUyIDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIucGMuaW4KKysrIGIvbGlidm5jc2VydmVyLnBjLmluCkBAIC03LDYgKzcsOCBAQAogRGVzY3JpcHRpb246IEEgbGlicmFyeSBmb3IgZWFzeSBpbXBsZW1lbnRhdGlvbiBvZiBhIFZOQyBzZXJ2ZXIuCiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOgotTGliczogLUwke2xpYmRpcn0gLWx2bmNzZXJ2ZXIgQExJQlNAIEBXU09DS0xJQkAKK1JlcXVpcmVzLnByaXZhdGU6IHpsaWIKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdm5jc2VydmVyCitMaWJzLnByaXZhdGU6IEBMSUJTQCBAV1NPQ0tMSUJACiBDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQogCmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvYXV0aC5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvYXV0aC5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2F1dGguUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL2NhcmdzLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9jYXJncy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2NhcmdzLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9jb3JyZS5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvY29ycmUuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9jb3JyZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvY3Vyc29yLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9jdXJzb3IuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9jdXJzb3IuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL2N1dHBhc3RlLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9jdXRwYXN0ZS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2N1dHBhc3RlLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9kM2Rlcy5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvZDNkZXMuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9kM2Rlcy5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvZHJhdy5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvZHJhdy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2RyYXcuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL2ZpbGVsaXN0aW5mby5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvZmlsZWxpc3RpbmZvLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvZmlsZWxpc3RpbmZvLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9maWxldHJhbnNmZXJtc2cuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL2ZpbGV0cmFuc2Zlcm1zZy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2ZpbGV0cmFuc2Zlcm1zZy5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvZm9udC5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvZm9udC5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL2ZvbnQuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9oZXh0aWxlLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9oZXh0aWxlLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvaGV4dGlsZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvaHR0cGQuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL2h0dHBkLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvaHR0cGQuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL21haW4uUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL21haW4uUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9tYWluLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9tZDUuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL21kNS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL21kNS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvbWluaWx6by5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvbWluaWx6by5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL21pbmlsem8uUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYmNyeXB0b19nbnV0bHMuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3JmYmNyeXB0b19nbnV0bHMuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJjcnlwdG9fZ251dGxzLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJjcnlwdG9faW5jbHVkZWQuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3JmYmNyeXB0b19pbmNsdWRlZC5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYmNyeXB0b19pbmNsdWRlZC5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZiY3J5cHRvX29wZW5zc2wuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3JmYmNyeXB0b19vcGVuc3NsLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZiY3J5cHRvX29wZW5zc2wuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYnJlZ2lvbi5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZicmVnaW9uLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZicmVnaW9uLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJzZXJ2ZXIuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3JmYnNlcnZlci5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYnNlcnZlci5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZic3NsX2dudXRscy5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZic3NsX2dudXRscy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYnNzbF9nbnV0bHMuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYnNzbF9ub25lLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJzc2xfbm9uZS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3JmYnNzbF9ub25lLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJzc2xfb3BlbnNzbC5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZic3NsX29wZW5zc2wuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9yZmJzc2xfb3BlbnNzbC5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZidGlnaHRzZXJ2ZXIuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3JmYnRpZ2h0c2VydmVyLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcmZidGlnaHRzZXJ2ZXIuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3JyZS5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvcnJlLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvcnJlLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9zY2FsZS5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvc2NhbGUuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9zY2FsZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvc2VsYm94LlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9zZWxib3guUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9zZWxib3guUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3NoYTEuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3NoYTEuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy9zaGExLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy9zb2NrZXRzLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy9zb2NrZXRzLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvc29ja2V0cy5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvc3RhdHMuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3N0YXRzLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvc3RhdHMuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3RpZ2h0LlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy90aWdodC5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3RpZ2h0LlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy90cmFuc2xhdGUuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3RyYW5zbGF0ZS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3RyYW5zbGF0ZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvdHVyYm9qcGVnLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy90dXJib2pwZWcuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy90dXJib2pwZWcuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3VsdHJhLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy91bHRyYS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3VsdHJhLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy92bmNhdXRoLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy92bmNhdXRoLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvdm5jYXV0aC5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvd2Vic29ja2V0cy5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvd2Vic29ja2V0cy5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3dlYnNvY2tldHMuUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3psaWIuUGxvIGIvbGlidm5jc2VydmVyLy5kZXBzL3psaWIuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy96bGliLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy96cmxlLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy96cmxlLlBsbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvenJsZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvLmRlcHMvenJsZW91dHN0cmVhbS5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvenJsZW91dHN0cmVhbS5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3pybGVvdXRzdHJlYW0uUGxvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyLy5kZXBzL3pybGVwYWxldHRlaGVscGVyLlBsbyBiL2xpYnZuY3NlcnZlci8uZGVwcy96cmxlcGFsZXR0ZWhlbHBlci5QbG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyLy5kZXBzL3pybGVwYWxldHRlaGVscGVyLlBsbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci8uZGVwcy96eXdybGV0ZW1wbGF0ZS5QbG8gYi9saWJ2bmNzZXJ2ZXIvLmRlcHMvenl3cmxldGVtcGxhdGUuUGxvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci8uZGVwcy96eXdybGV0ZW1wbGF0ZS5QbG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvTWFrZWZpbGUgYi9saWJ2bmNzZXJ2ZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDg1OWMuLjAwMDAwMDAKLS0tIGEvbGlidm5jc2VydmVyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsODI0ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuICBHZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi0KLQotCi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvTGliVk5DU2VydmVyCi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0xpYlZOQ1NlcnZlcgotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1zdWJkaXIgPSBsaWJ2bmNzZXJ2ZXIKLURJU1RfQ09NTU9OID0gJChhbV9fbm9pbnN0X0hFQURFUlNfRElTVCkgJChpbmNsdWRlX0hFQURFUlMpIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLWFtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOwotYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKLSAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotICAgICopIGY9JCRwOzsgXAotICBlc2FjOwotYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotYW1fX2luc3RhbGxfbWF4ID0gNDAKLWFtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCi0gIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKLWFtX19ub2Jhc2Vfc3RyaXAgPSBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgotYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAotICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAotICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCi0gICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAotICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAotICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKLWFtX19iYXNlX2xpc3QgPSBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKLWFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKLSAgdGVzdCAteiAiJCRmaWxlcyIgXAotICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAotICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLSAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKLSAgfQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKLUxUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCi1hbV9fREVQRU5ERU5DSUVTXzEgPQotbGlidm5jc2VydmVyX2xhX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKQotYW1fX2xpYnZuY3NlcnZlcl9sYV9TT1VSQ0VTX0RJU1QgPSBtYWluLmMgcmZic2VydmVyLmMgcmZicmVnaW9uLmMgXAotCWF1dGguYyBzb2NrZXRzLmMgd2Vic29ja2V0cy5jIHJmYnNzbF9ub25lLmMgXAotCXJmYmNyeXB0b19pbmNsdWRlZC5jIC4uL2NvbW1vbi9tZDUuYyAuLi9jb21tb24vc2hhMS5jIFwKLQlyZmJzc2xfb3BlbnNzbC5jIHJmYmNyeXB0b19vcGVuc3NsLmMgcmZic3NsX2dudXRscy5jIFwKLQlyZmJjcnlwdG9fZ251dGxzLmMgc3RhdHMuYyBjb3JyZS5jIGhleHRpbGUuYyBycmUuYyB0cmFuc2xhdGUuYyBcCi0JY3V0cGFzdGUuYyBodHRwZC5jIGN1cnNvci5jIGZvbnQuYyBkcmF3LmMgc2VsYm94LmMgXAotCS4uL2NvbW1vbi9kM2Rlcy5jIC4uL2NvbW1vbi92bmNhdXRoLmMgY2FyZ3MuYyBcCi0JLi4vY29tbW9uL21pbmlsem8uYyB1bHRyYS5jIHNjYWxlLmMgemxpYi5jIHpybGUuYyBcCi0JenJsZW91dHN0cmVhbS5jIHpybGVwYWxldHRlaGVscGVyLmMgLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMgXAotCXRpZ2h0LmMgLi4vY29tbW9uL3R1cmJvanBlZy5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYyBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYyBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLWFtX19vYmplY3RzXzEgPSByZmJzc2xfbm9uZS5sbyBcCi0JcmZiY3J5cHRvX2luY2x1ZGVkLmxvIFwKLQltZDUubG8gXAotCXNoYTEubG8KLSNhbV9fb2JqZWN0c18xID0gcmZic3NsX29wZW5zc2wubG8gXAotIwlyZmJjcnlwdG9fb3BlbnNzbC5sbwotI2FtX19vYmplY3RzXzEgPSAgXAotIwlyZmJzc2xfZ251dGxzLmxvIFwKLSMJcmZiY3J5cHRvX2dudXRscy5sbwotYW1fX29iamVjdHNfMiA9IHdlYnNvY2tldHMubG8gJChhbV9fb2JqZWN0c18xKQotYW1fX29iamVjdHNfMyA9IHpsaWIubG8genJsZS5sbyB6cmxlb3V0c3RyZWFtLmxvIFwKLQl6cmxlcGFsZXR0ZWhlbHBlci5sbyB6eXdybGV0ZW1wbGF0ZS5sbwotYW1fX29iamVjdHNfNCA9IHRpZ2h0LmxvIFwKLQl0dXJib2pwZWcubG8KLWFtX19vYmplY3RzXzUgPSByZmJ0aWdodHNlcnZlci5sbyBcCi0JaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5sbyBcCi0JZmlsZXRyYW5zZmVybXNnLmxvIFwKLQlmaWxlbGlzdGluZm8ubG8KLWFtX19vYmplY3RzXzYgPSBtYWluLmxvIHJmYnNlcnZlci5sbyByZmJyZWdpb24ubG8gYXV0aC5sbyBzb2NrZXRzLmxvIFwKLQkkKGFtX19vYmplY3RzXzIpIHN0YXRzLmxvIGNvcnJlLmxvIGhleHRpbGUubG8gcnJlLmxvIFwKLQl0cmFuc2xhdGUubG8gY3V0cGFzdGUubG8gaHR0cGQubG8gY3Vyc29yLmxvIGZvbnQubG8gZHJhdy5sbyBcCi0Jc2VsYm94LmxvIGQzZGVzLmxvIHZuY2F1dGgubG8gY2FyZ3MubG8gbWluaWx6by5sbyB1bHRyYS5sbyBcCi0Jc2NhbGUubG8gJChhbV9fb2JqZWN0c18zKSAkKGFtX19vYmplY3RzXzQpICQoYW1fX29iamVjdHNfNSkKLWFtX2xpYnZuY3NlcnZlcl9sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c182KQotbGlidm5jc2VydmVyX2xhX09CSkVDVFMgPSAkKGFtX2xpYnZuY3NlcnZlcl9sYV9PQkpFQ1RTKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfJChWKSkKLWFtX192X2x0XyA9ICQoYW1fX3ZfbHRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9sdF8wID0gLS1zaWxlbnQKLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9ICQobGlidm5jc2VydmVyX2xhX1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGFtX19saWJ2bmNzZXJ2ZXJfbGFfU09VUkNFU19ESVNUKQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLWFtX19ub2luc3RfSEVBREVSU19ESVNUID0gLi4vY29tbW9uL2QzZGVzLmggLi4vcmZiL2RlZmF1bHQ4eDE2LmggXAotCXpybGVvdXRzdHJlYW0uaCB6cmxlcGFsZXR0ZWhlbHBlci5oIHpybGV0eXBlcy5oIHByaXZhdGUuaCBcCi0Jc2NhbGUuaCByZmJzc2wuaCByZmJjcnlwdG8uaCAuLi9jb21tb24vbWluaWx6by5oIFwKLQkuLi9jb21tb24vbHpvY29uZi5oIC4uL2NvbW1vbi9sem9kZWZzLmggLi4vY29tbW9uL21kNS5oIFwKLQkuLi9jb21tb24vc2hhMS5oIHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxlbGlzdGluZm8uaCBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5oIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5oIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRwcm90by5oCi1IRUFERVJTID0gJChpbmNsdWRlX0hFQURFUlMpICQobm9pbnN0X0hFQURFUlMpCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotQUNMT0NBTCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhY2xvY2FsLTEuMTEKLUFNVEFSID0gJCR7VEFSLXRhcn0KLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gMAotQVIgPSAvdXNyL2Jpbi9hcgotQVMgPSBhcwotQVVUT0NPTkYgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2NvbmYKLUFVVE9IRUFERVIgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlcgotQVVUT01BS0UgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS4xMQotQVZBSElfQ0ZMQUdTID0gCi1BVkFISV9MSUJTID0gCi1BV0sgPSBtYXdrCi1DQyA9IGdjYwotQ0NERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DRkxBR1MgPSAtZyAtTzIgLVdhbGwgIAotQ1BQID0gZ2NjIC1FCi1DUFBGTEFHUyA9IAotQ1JZUFRfTElCUyA9IC1sY3J5cHQKLUNYWCA9IGcrKwotQ1hYQ1BQID0gZysrIC1FCi1DWFhERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DWFhGTEFHUyA9IC1nIC1PMgotQ1lHUEFUSF9XID0gZWNobwotREVGUyA9IC1ESEFWRV9DT05GSUdfSAotREVQRElSID0gLmRlcHMKLURMTFRPT0wgPSBkbGx0b29sCi1FQ0hPID0gZWNobwotRUNIT19DID0gCi1FQ0hPX04gPSAtbgotRUNIT19UID0gCi1FR1JFUCA9IC9iaW4vZ3JlcCAtRQotRVhFRVhUID0gCi1GNzcgPSAKLUZGTEFHUyA9IAotR05VVExTX0NGTEFHUyA9IAotR05VVExTX0xJQlMgPSAKLUdSRVAgPSAvYmluL2dyZXAKLUdUS19DRkxBR1MgPSAKLUdUS19MSUJTID0gCi1JTlNUQUxMID0gL3Vzci9iaW4vaW5zdGFsbCAtYwotSU5TVEFMTF9EQVRBID0gJHtJTlNUQUxMfSAtbSA2NDQKLUlOU1RBTExfUFJPR1JBTSA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYyAtcwotSlBFR19MREZMQUdTID0gCi1MREZMQUdTID0gCi1MSUJHQ1JZUFRfQ0ZMQUdTID0gCi1MSUJHQ1JZUFRfQ09ORklHID0gbm8KLUxJQkdDUllQVF9MSUJTID0gCi1MSUJPQkpTID0gCi1MSUJTID0gLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAKLUxJQlRPT0wgPSAkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbAotTE5fUyA9IGxuIC1zCi1MVExJQk9CSlMgPSAKLU1BS0VJTkZPID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIG1ha2VpbmZvCi1NS0RJUl9QID0gL2Jpbi9ta2RpciAtcAotT0JKRFVNUCA9IG9iamR1bXAKLU9CSkVYVCA9IG8KLVBBQ0tBR0UgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfQlVHUkVQT1JUID0gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfTkFNRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9TVFJJTkcgPSBMaWJWTkNTZXJ2ZXIgMC45LjkKLVBBQ0tBR0VfVEFSTkFNRSA9IGxpYnZuY3NlcnZlcgotUEFDS0FHRV9VUkwgPSAKLVBBQ0tBR0VfVkVSU0lPTiA9IDAuOS45Ci1QQVRIX1NFUEFSQVRPUiA9IDoKLVBLR19DT05GSUcgPSAvdXNyL2Jpbi9wa2ctY29uZmlnCi1QS0dfQ09ORklHX0xJQkRJUiA9IAotUEtHX0NPTkZJR19QQVRIID0gCi1SQU5MSUIgPSByYW5saWIKLVJQTVNPVVJDRURJUiA9IE5PVC1GT1VORAotU0RMX0NGTEFHUyA9IAotU0RMX0xJQlMgPSAKLVNFVF9NQUtFID0gCi1TSEVMTCA9IC9iaW4vYmFzaAotU1NMX0xJQlMgPSAKLVNUUklQID0gc3RyaXAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gCi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSAKLVZFUlNJT04gPSAwLjkuOQotV1NPQ0tMSUIgPSAKLVhNS01GID0gCi1YX0NGTEFHUyA9IAotWF9FWFRSQV9MSUJTID0gCi1YX0xJQlMgPSAKLVhfUFJFX0xJQlMgPSAgLWxTTSAtbElDRQotYWJzX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIKLWFic19zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFic190b3Bfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWNfY3RfQ0MgPSBnY2MKLWFjX2N0X0NYWCA9IGcrKwotYWNfY3RfRjc3ID0gCi1hbV9faW5jbHVkZSA9IGluY2x1ZGUKLWFtX19sZWFkaW5nX2RvdCA9IC4KLWFtX19xdW90ZSA9IAotYW1fX3RhciA9ICQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiCi1hbV9fdW50YXIgPSAkJHtUQVItdGFyfSB4ZiAtCi1iaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9iaW4KLWJ1aWxkID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1idWlsZF9hbGlhcyA9IAotYnVpbGRfY3B1ID0geDg2XzY0Ci1idWlsZF9vcyA9IGxpbnV4LWdudQotYnVpbGRfdmVuZG9yID0gdW5rbm93bgotYnVpbGRkaXIgPSAuCi1kYXRhZGlyID0gJHtkYXRhcm9vdGRpcn0KLWRhdGFyb290ZGlyID0gJHtwcmVmaXh9L3NoYXJlCi1kb2NkaXIgPSAke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9Ci1kdmlkaXIgPSAke2RvY2Rpcn0KLWV4ZWNfcHJlZml4ID0gJHtwcmVmaXh9Ci1ob3N0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ob3N0X2FsaWFzID0gCi1ob3N0X2NwdSA9IHg4Nl82NAotaG9zdF9vcyA9IGxpbnV4LWdudQotaG9zdF92ZW5kb3IgPSB1bmtub3duCi1odG1sZGlyID0gJHtkb2NkaXJ9Ci1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUvcmZiCi1pbmZvZGlyID0gJHtkYXRhcm9vdGRpcn0vaW5mbwotaW5zdGFsbF9zaCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaAotbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCi1saWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYwotbG9jYWxlZGlyID0gJHtkYXRhcm9vdGRpcn0vbG9jYWxlCi1sb2NhbHN0YXRlZGlyID0gJHtwcmVmaXh9L3ZhcgotbWFuZGlyID0gJHtkYXRhcm9vdGRpcn0vbWFuCi1ta2Rpcl9wID0gL2Jpbi9ta2RpciAtcAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotcGRmZGlyID0gJHtkb2NkaXJ9Ci1wcmVmaXggPSAvdXNyL2xvY2FsCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcyx4LHgsCi1wc2RpciA9ICR7ZG9jZGlyfQotc2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L3NiaW4KLXNoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQotc3JjZGlyID0gLgotc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKLXRhcmdldF9hbGlhcyA9IAotdG9wX2J1aWxkX3ByZWZpeCA9IC4uLwotdG9wX2J1aWxkZGlyID0gLi4KLXRvcF9zcmNkaXIgPSAuLgotd2l0aF9mZm1wZWcgPSAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KLVRJR0hUVk5DRklMRVRSQU5TRkVSSERSUyA9IHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxlbGlzdGluZm8uaCBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5oIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5oIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRwcm90by5oCi0KLVRJR0hUVk5DRklMRVRSQU5TRkVSU1JDUyA9IHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHNlcnZlci5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMgXAotCXRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxlbGlzdGluZm8uYwotCi1XRUJTT0NLRVRTU1NMU1JDUyA9IHJmYnNzbF9ub25lLmMgcmZiY3J5cHRvX2luY2x1ZGVkLmMgLi4vY29tbW9uL21kNS5jIC4uL2NvbW1vbi9zaGExLmMKLSNXRUJTT0NLRVRTU1NMU1JDUyA9IHJmYnNzbF9vcGVuc3NsLmMgcmZiY3J5cHRvX29wZW5zc2wuYwotI1dFQlNPQ0tFVFNTU0xTUkNTID0gcmZic3NsX2dudXRscy5jIHJmYmNyeXB0b19nbnV0bHMuYwotI1dFQlNPQ0tFVFNTU0xMSUJTID0gIC1sY3J5cHQKLSNXRUJTT0NLRVRTU1NMTElCUyA9IAotV0VCU09DS0VUU1NSQ1MgPSB3ZWJzb2NrZXRzLmMgJChXRUJTT0NLRVRTU1NMU1JDUykKLSNpbmNsdWRlX0hFQURFUlM9cmZiLmggcmZiY29uZmlnLmggcmZiaW50LmggcmZicHJvdG8uaCBrZXlzeW0uaCByZmJyZWdpb24uaAotaW5jbHVkZV9IRUFERVJTID0gLi4vcmZiL3JmYi5oIC4uL3JmYi9yZmJjb25maWcuaCAuLi9yZmIvcmZiaW50LmggXAotCS4uL3JmYi9yZmJwcm90by5oIC4uL3JmYi9rZXlzeW0uaCAuLi9yZmIvcmZicmVnaW9uLmggLi4vcmZiL3JmYmNsaWVudC5oCi0KLW5vaW5zdF9IRUFERVJTID0gLi4vY29tbW9uL2QzZGVzLmggLi4vcmZiL2RlZmF1bHQ4eDE2LmggenJsZW91dHN0cmVhbS5oIFwKLQl6cmxlcGFsZXR0ZWhlbHBlci5oIHpybGV0eXBlcy5oIHByaXZhdGUuaCBzY2FsZS5oIHJmYnNzbC5oIHJmYmNyeXB0by5oIFwKLQkuLi9jb21tb24vbWluaWx6by5oIC4uL2NvbW1vbi9sem9jb25mLmggLi4vY29tbW9uL2x6b2RlZnMuaCAuLi9jb21tb24vbWQ1LmggLi4vY29tbW9uL3NoYTEuaCBcCi0JJChUSUdIVFZOQ0ZJTEVUUkFOU0ZFUkhEUlMpCi0KLUVYVFJBX0RJU1QgPSB0YWJsZWluaXQyNC5jIHRhYmxlaW5pdHRjdGVtcGxhdGUuYyB0YWJsZXRyYW5zdGVtcGxhdGUuYyBcCi0JdGFibGVpbml0Y210ZW1wbGF0ZS5jIHRhYmxldHJhbnMyNHRlbXBsYXRlLmMgXAotCXpybGVlbmNvZGV0ZW1wbGF0ZS5jCi0KLVpMSUJTUkNTID0gemxpYi5jIHpybGUuYyB6cmxlb3V0c3RyZWFtLmMgenJsZXBhbGV0dGVoZWxwZXIuYyAuLi9jb21tb24venl3cmxldGVtcGxhdGUuYwotVElHSFRTUkNTID0gdGlnaHQuYyAuLi9jb21tb24vdHVyYm9qcGVnLmMKLUxJQl9TUkNTID0gbWFpbi5jIHJmYnNlcnZlci5jIHJmYnJlZ2lvbi5jIGF1dGguYyBzb2NrZXRzLmMgJChXRUJTT0NLRVRTU1JDUykgXAotCXN0YXRzLmMgY29ycmUuYyBoZXh0aWxlLmMgcnJlLmMgdHJhbnNsYXRlLmMgY3V0cGFzdGUuYyBcCi0JaHR0cGQuYyBjdXJzb3IuYyBmb250LmMgXAotCWRyYXcuYyBzZWxib3guYyAuLi9jb21tb24vZDNkZXMuYyAuLi9jb21tb24vdm5jYXV0aC5jIGNhcmdzLmMgLi4vY29tbW9uL21pbmlsem8uYyB1bHRyYS5jIHNjYWxlLmMgXAotCSQoWkxJQlNSQ1MpICQoVElHSFRTUkNTKSAkKFRJR0hUVk5DRklMRVRSQU5TRkVSU1JDUykKLQotbGlidm5jc2VydmVyX2xhX1NPVVJDRVMgPSAkKExJQl9TUkNTKQotbGlidm5jc2VydmVyX2xhX0xJQkFERCA9ICQoV0VCU09DS0VUU1NTTExJQlMpCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJ2bmNzZXJ2ZXIubGEKLWFsbDogYWxsLWFtCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCi0JICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgbGlidm5jc2VydmVyL01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IGxpYnZuY3NlcnZlci9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAotCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lOyBcCi0JdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQobGliZGlyKSciOyBcCi0JICAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIiB8fCBleGl0IDE7IFwKLQkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQobGliZGlyKSciOyBcCi0JICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQobGliZGlyKSI7IFwKLQl9Ci0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICAkKGFtX19zdHJpcF9kaXIpIFwKLQkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJGYnIjsgXAotCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAotCWRvbmUKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAotCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCi0JICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCi0JICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCi0JZG9uZQotbGlidm5jc2VydmVyLmxhOiAkKGxpYnZuY3NlcnZlcl9sYV9PQkpFQ1RTKSAkKGxpYnZuY3NlcnZlcl9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGlidm5jc2VydmVyX2xhX0RFUEVOREVOQ0lFUykgCi0JJChBTV9WX0NDTEQpJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlidm5jc2VydmVyX2xhX09CSkVDVFMpICQobGlidm5jc2VydmVyX2xhX0xJQkFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1pbmNsdWRlIC4vJChERVBESVIpL2F1dGguUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL2NhcmdzLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9jb3JyZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvY3Vyc29yLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9jdXRwYXN0ZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvZDNkZXMuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL2RyYXcuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL2ZpbGVsaXN0aW5mby5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvZmlsZXRyYW5zZmVybXNnLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9mb250LlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9oZXh0aWxlLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9odHRwZC5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvbWFpbi5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvbWQ1LlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9taW5pbHpvLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9yZmJjcnlwdG9fZ251dGxzLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9yZmJjcnlwdG9faW5jbHVkZWQuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3JmYmNyeXB0b19vcGVuc3NsLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9yZmJyZWdpb24uUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3JmYnNlcnZlci5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvcmZic3NsX2dudXRscy5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvcmZic3NsX25vbmUuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3JmYnNzbF9vcGVuc3NsLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9yZmJ0aWdodHNlcnZlci5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvcnJlLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9zY2FsZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvc2VsYm94LlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9zaGExLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9zb2NrZXRzLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS9zdGF0cy5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvdGlnaHQuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3RyYW5zbGF0ZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvdHVyYm9qcGVnLlBsbwotaW5jbHVkZSAuLyQoREVQRElSKS91bHRyYS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvdm5jYXV0aC5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvd2Vic29ja2V0cy5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvemxpYi5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvenJsZS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvenJsZW91dHN0cmVhbS5QbG8KLWluY2x1ZGUgLi8kKERFUERJUikvenJsZXBhbGV0dGVoZWxwZXIuUGxvCi1pbmNsdWRlIC4vJChERVBESVIpL3p5d3JsZXRlbXBsYXRlLlBsbwotCi0uYy5vOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci0JJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLQkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotbWQ1LmxvOiAuLi9jb21tb24vbWQ1LmMKLQkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1kNS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbWQ1LlRwbyAtYyAtbyBtZDUubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9tZDUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21kNS5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbWQ1LlRwbyAkKERFUERJUikvbWQ1LlBsbwotIwkkKEFNX1ZfQ0Mpc291cmNlPScuLi9jb21tb24vbWQ1LmMnIG9iamVjdD0nbWQ1LmxvJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWQ1LmxvIGB0ZXN0IC1mICcuLi9jb21tb24vbWQ1LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9tZDUuYwotCi1zaGExLmxvOiAuLi9jb21tb24vc2hhMS5jCi0JJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzaGExLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9zaGExLlRwbyAtYyAtbyBzaGExLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vc2hhMS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vc2hhMS5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc2hhMS5UcG8gJChERVBESVIpL3NoYTEuUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi9zaGExLmMnIG9iamVjdD0nc2hhMS5sbycgbGlidG9vbD15ZXMgXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNoYTEubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9zaGExLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9zaGExLmMKLQotZDNkZXMubG86IC4uL2NvbW1vbi9kM2Rlcy5jCi0JJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkM2Rlcy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZDNkZXMuVHBvIC1jIC1vIGQzZGVzLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vZDNkZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL2QzZGVzLmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kM2Rlcy5UcG8gJChERVBESVIpL2QzZGVzLlBsbwotIwkkKEFNX1ZfQ0Mpc291cmNlPScuLi9jb21tb24vZDNkZXMuYycgb2JqZWN0PSdkM2Rlcy5sbycgbGlidG9vbD15ZXMgXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGQzZGVzLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vZDNkZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL2QzZGVzLmMKLQotdm5jYXV0aC5sbzogLi4vY29tbW9uL3ZuY2F1dGguYwotCSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdm5jYXV0aC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvdm5jYXV0aC5UcG8gLWMgLW8gdm5jYXV0aC5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3ZuY2F1dGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3ZuY2F1dGguYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3ZuY2F1dGguVHBvICQoREVQRElSKS92bmNhdXRoLlBsbwotIwkkKEFNX1ZfQ0Mpc291cmNlPScuLi9jb21tb24vdm5jYXV0aC5jJyBvYmplY3Q9J3ZuY2F1dGgubG8nIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2bmNhdXRoLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vdm5jYXV0aC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vdm5jYXV0aC5jCi0KLW1pbmlsem8ubG86IC4uL2NvbW1vbi9taW5pbHpvLmMKLQkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbmlsem8ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL21pbmlsem8uVHBvIC1jIC1vIG1pbmlsem8ubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9taW5pbHpvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9taW5pbHpvLmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9taW5pbHpvLlRwbyAkKERFUERJUikvbWluaWx6by5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL21pbmlsem8uYycgb2JqZWN0PSdtaW5pbHpvLmxvJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaWx6by5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL21pbmlsem8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21pbmlsem8uYwotCi16eXdybGV0ZW1wbGF0ZS5sbzogLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMKLQkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHp5d3JsZXRlbXBsYXRlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS96eXdybGV0ZW1wbGF0ZS5UcG8gLWMgLW8genl3cmxldGVtcGxhdGUubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi96eXdybGV0ZW1wbGF0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24venl3cmxldGVtcGxhdGUuYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3p5d3JsZXRlbXBsYXRlLlRwbyAkKERFUERJUikvenl3cmxldGVtcGxhdGUuUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi96eXdybGV0ZW1wbGF0ZS5jJyBvYmplY3Q9J3p5d3JsZXRlbXBsYXRlLmxvJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8genl3cmxldGVtcGxhdGUubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi96eXdybGV0ZW1wbGF0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24venl3cmxldGVtcGxhdGUuYwotCi10dXJib2pwZWcubG86IC4uL2NvbW1vbi90dXJib2pwZWcuYwotCSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdHVyYm9qcGVnLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS90dXJib2pwZWcuVHBvIC1jIC1vIHR1cmJvanBlZy5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3R1cmJvanBlZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vdHVyYm9qcGVnLmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90dXJib2pwZWcuVHBvICQoREVQRElSKS90dXJib2pwZWcuUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi90dXJib2pwZWcuYycgb2JqZWN0PSd0dXJib2pwZWcubG8nIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0dXJib2pwZWcubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi90dXJib2pwZWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3R1cmJvanBlZy5jCi0KLXJmYnRpZ2h0c2VydmVyLmxvOiB0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYwotCSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcmZidGlnaHRzZXJ2ZXIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3JmYnRpZ2h0c2VydmVyLlRwbyAtYyAtbyByZmJ0aWdodHNlcnZlci5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL3JmYnRpZ2h0c2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHNlcnZlci5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvcmZidGlnaHRzZXJ2ZXIuVHBvICQoREVQRElSKS9yZmJ0aWdodHNlcnZlci5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0ndGlnaHR2bmMtZmlsZXRyYW5zZmVyL3JmYnRpZ2h0c2VydmVyLmMnIG9iamVjdD0ncmZidGlnaHRzZXJ2ZXIubG8nIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyByZmJ0aWdodHNlcnZlci5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL3JmYnRpZ2h0c2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHNlcnZlci5jCi0KLWhhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QubG86IHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmMKLQkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGhhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuVHBvIC1jIC1vIGhhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QubG8gYHRlc3QgLWYgJ3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LlRwbyAkKERFUERJUikvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0ndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYycgb2JqZWN0PSdoYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmxvJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYwotCi1maWxldHJhbnNmZXJtc2cubG86IHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuYwotCSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmlsZXRyYW5zZmVybXNnLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9maWxldHJhbnNmZXJtc2cuVHBvIC1jIC1vIGZpbGV0cmFuc2Zlcm1zZy5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9maWxldHJhbnNmZXJtc2cuVHBvICQoREVQRElSKS9maWxldHJhbnNmZXJtc2cuUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9J3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuYycgb2JqZWN0PSdmaWxldHJhbnNmZXJtc2cubG8nIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmaWxldHJhbnNmZXJtc2cubG8gYHRlc3QgLWYgJ3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jCi0KLWZpbGVsaXN0aW5mby5sbzogdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5jCi0JJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmaWxlbGlzdGluZm8ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2ZpbGVsaXN0aW5mby5UcG8gLWMgLW8gZmlsZWxpc3RpbmZvLmxvIGB0ZXN0IC1mICd0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxlbGlzdGluZm8uYwotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2ZpbGVsaXN0aW5mby5UcG8gJChERVBESVIpL2ZpbGVsaXN0aW5mby5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0ndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5jJyBvYmplY3Q9J2ZpbGVsaXN0aW5mby5sbycgbGlidG9vbD15ZXMgXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZpbGVsaXN0aW5mby5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLWluc3RhbGwtaW5jbHVkZUhFQURFUlM6ICQoaW5jbHVkZV9IRUFERVJTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKGluY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIiB8fCBleGl0IDE7IFwKLQlmaTsgXAotCWZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGVjaG8gIiQkZCQkcCI7IFwKLQlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKLQl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAnJChERVNURElSKSQoaW5jbHVkZWRpciknIjsgXAotCSAgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAiJChERVNURElSKSQoaW5jbHVkZWRpcikiIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi11bmluc3RhbGwtaW5jbHVkZUhFQURFUlM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChpbmNsdWRlZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAotCWRpcj0nJChERVNURElSKSQoaW5jbHVkZWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpICQoSEVBREVSUykKLWluc3RhbGxkaXJzOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSI7IGRvIFwKLQkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKLQlkb25lCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgXAotCW1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWluY2x1ZGVIRUFERVJTCi0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcGRmLWFtOgotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKLQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGN0YWdzIGRpc3RjbGVhbiBcCi0JZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKLQlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCi0JaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAotCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluY2x1ZGVIRUFERVJTIGluc3RhbGwtaW5mbyBcCi0JaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAotCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKLQlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKLQltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCi0JdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBcCi0JdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLQotIyQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3o6IGRpc3QKLQotIyBSdWxlIHRvIGJ1aWxkIFJQTSBkaXN0cmlidXRpb24gcGFja2FnZQotI3JwbTogJChQQUNLQUdFKS0kKFZFUlNJT04pLnRhci5neiBsaWJ2bmNzZXJ2ZXIuc3BlYwotIwljcCAkKFBBQ0tBR0UpLSQoVkVSU0lPTikudGFyLmd6IE5PVC1GT1VORAotIwlycG1idWlsZCAtYmEgbGlidm5jc2VydmVyLnNwZWMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL01ha2VmaWxlLmFtIGIvbGlidm5jc2VydmVyL01ha2VmaWxlLmFtCmluZGV4IGRlYjBlMDkuLmNiMzhjNjQgMTAwNjQ0Ci0tLSBhL2xpYnZuY3NlcnZlci9NYWtlZmlsZS5hbQorKysgYi9saWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuYW0KQEAgLTEsNCArMSw0IEBACi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvY29tbW9uCitBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvY29tbW9uCiAKIGlmIFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSCiBUSUdIVFZOQ0ZJTEVUUkFOU0ZFUkhEUlM9dGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5oIFwKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci9NYWtlZmlsZS5pbiBiL2xpYnZuY3NlcnZlci9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiZDc3Ni4uMDAwMDAwMAotLS0gYS9saWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4MjQgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi0KLVZQQVRIID0gQHNyY2RpckAKLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1zdWJkaXIgPSBsaWJ2bmNzZXJ2ZXIKLURJU1RfQ09NTU9OID0gJChhbV9fbm9pbnN0X0hFQURFUlNfRElTVCkgJChpbmNsdWRlX0hFQURFUlMpIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLWFtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOwotYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKLSAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotICAgICopIGY9JCRwOzsgXAotICBlc2FjOwotYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotYW1fX2luc3RhbGxfbWF4ID0gNDAKLWFtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCi0gIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKLWFtX19ub2Jhc2Vfc3RyaXAgPSBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgotYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAotICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAotICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCi0gICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAotICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAotICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKLWFtX19iYXNlX2xpc3QgPSBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKLWFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKLSAgdGVzdCAteiAiJCRmaWxlcyIgXAotICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAotICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLSAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKLSAgfQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKLUxUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCi1hbV9fREVQRU5ERU5DSUVTXzEgPQotbGlidm5jc2VydmVyX2xhX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKQotYW1fX2xpYnZuY3NlcnZlcl9sYV9TT1VSQ0VTX0RJU1QgPSBtYWluLmMgcmZic2VydmVyLmMgcmZicmVnaW9uLmMgXAotCWF1dGguYyBzb2NrZXRzLmMgd2Vic29ja2V0cy5jIHJmYnNzbF9ub25lLmMgXAotCXJmYmNyeXB0b19pbmNsdWRlZC5jIC4uL2NvbW1vbi9tZDUuYyAuLi9jb21tb24vc2hhMS5jIFwKLQlyZmJzc2xfb3BlbnNzbC5jIHJmYmNyeXB0b19vcGVuc3NsLmMgcmZic3NsX2dudXRscy5jIFwKLQlyZmJjcnlwdG9fZ251dGxzLmMgc3RhdHMuYyBjb3JyZS5jIGhleHRpbGUuYyBycmUuYyB0cmFuc2xhdGUuYyBcCi0JY3V0cGFzdGUuYyBodHRwZC5jIGN1cnNvci5jIGZvbnQuYyBkcmF3LmMgc2VsYm94LmMgXAotCS4uL2NvbW1vbi9kM2Rlcy5jIC4uL2NvbW1vbi92bmNhdXRoLmMgY2FyZ3MuYyBcCi0JLi4vY29tbW9uL21pbmlsem8uYyB1bHRyYS5jIHNjYWxlLmMgemxpYi5jIHpybGUuYyBcCi0JenJsZW91dHN0cmVhbS5jIHpybGVwYWxldHRlaGVscGVyLmMgLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMgXAotCXRpZ2h0LmMgLi4vY29tbW9uL3R1cmJvanBlZy5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYyBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYyBcCi0JdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLUBIQVZFX0dOVVRMU19GQUxTRUBASEFWRV9MSUJTU0xfRkFMU0VAQFdJVEhfV0VCU09DS0VUU19UUlVFQGFtX19vYmplY3RzXzEgPSByZmJzc2xfbm9uZS5sbyBcCi1ASEFWRV9HTlVUTFNfRkFMU0VAQEhBVkVfTElCU1NMX0ZBTFNFQEBXSVRIX1dFQlNPQ0tFVFNfVFJVRUAJcmZiY3J5cHRvX2luY2x1ZGVkLmxvIFwKLUBIQVZFX0dOVVRMU19GQUxTRUBASEFWRV9MSUJTU0xfRkFMU0VAQFdJVEhfV0VCU09DS0VUU19UUlVFQAltZDUubG8gXAotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9GQUxTRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVACXNoYTEubG8KLUBIQVZFX0dOVVRMU19GQUxTRUBASEFWRV9MSUJTU0xfVFJVRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVAYW1fX29iamVjdHNfMSA9IHJmYnNzbF9vcGVuc3NsLmxvIFwKLUBIQVZFX0dOVVRMU19GQUxTRUBASEFWRV9MSUJTU0xfVFJVRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVACXJmYmNyeXB0b19vcGVuc3NsLmxvCi1ASEFWRV9HTlVUTFNfVFJVRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVAYW1fX29iamVjdHNfMSA9ICBcCi1ASEFWRV9HTlVUTFNfVFJVRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVACXJmYnNzbF9nbnV0bHMubG8gXAotQEhBVkVfR05VVExTX1RSVUVAQFdJVEhfV0VCU09DS0VUU19UUlVFQAlyZmJjcnlwdG9fZ251dGxzLmxvCi1AV0lUSF9XRUJTT0NLRVRTX1RSVUVAYW1fX29iamVjdHNfMiA9IHdlYnNvY2tldHMubG8gJChhbV9fb2JqZWN0c18xKQotQEhBVkVfTElCWl9UUlVFQGFtX19vYmplY3RzXzMgPSB6bGliLmxvIHpybGUubG8genJsZW91dHN0cmVhbS5sbyBcCi1ASEFWRV9MSUJaX1RSVUVACXpybGVwYWxldHRlaGVscGVyLmxvIHp5d3JsZXRlbXBsYXRlLmxvCi1ASEFWRV9MSUJKUEVHX1RSVUVAQEhBVkVfTElCWl9UUlVFQGFtX19vYmplY3RzXzQgPSB0aWdodC5sbyBcCi1ASEFWRV9MSUJKUEVHX1RSVUVAQEhBVkVfTElCWl9UUlVFQAl0dXJib2pwZWcubG8KLUBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFQGFtX19vYmplY3RzXzUgPSByZmJ0aWdodHNlcnZlci5sbyBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5sbyBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJZmlsZXRyYW5zZmVybXNnLmxvIFwKLUBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFQAlmaWxlbGlzdGluZm8ubG8KLWFtX19vYmplY3RzXzYgPSBtYWluLmxvIHJmYnNlcnZlci5sbyByZmJyZWdpb24ubG8gYXV0aC5sbyBzb2NrZXRzLmxvIFwKLQkkKGFtX19vYmplY3RzXzIpIHN0YXRzLmxvIGNvcnJlLmxvIGhleHRpbGUubG8gcnJlLmxvIFwKLQl0cmFuc2xhdGUubG8gY3V0cGFzdGUubG8gaHR0cGQubG8gY3Vyc29yLmxvIGZvbnQubG8gZHJhdy5sbyBcCi0Jc2VsYm94LmxvIGQzZGVzLmxvIHZuY2F1dGgubG8gY2FyZ3MubG8gbWluaWx6by5sbyB1bHRyYS5sbyBcCi0Jc2NhbGUubG8gJChhbV9fb2JqZWN0c18zKSAkKGFtX19vYmplY3RzXzQpICQoYW1fX29iamVjdHNfNSkKLWFtX2xpYnZuY3NlcnZlcl9sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c182KQotbGlidm5jc2VydmVyX2xhX09CSkVDVFMgPSAkKGFtX2xpYnZuY3NlcnZlcl9sYV9PQkpFQ1RTKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDX0BBTV9WQCkKLWFtX192X0NDXyA9ICQoYW1fX3ZfQ0NfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1BTV9WX0NDTEQgPSAkKGFtX192X0NDTERfQEFNX1ZAKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1TT1VSQ0VTID0gJChsaWJ2bmNzZXJ2ZXJfbGFfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQoYW1fX2xpYnZuY3NlcnZlcl9sYV9TT1VSQ0VTX0RJU1QpCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotYW1fX25vaW5zdF9IRUFERVJTX0RJU1QgPSAuLi9jb21tb24vZDNkZXMuaCAuLi9yZmIvZGVmYXVsdDh4MTYuaCBcCi0JenJsZW91dHN0cmVhbS5oIHpybGVwYWxldHRlaGVscGVyLmggenJsZXR5cGVzLmggcHJpdmF0ZS5oIFwKLQlzY2FsZS5oIHJmYnNzbC5oIHJmYmNyeXB0by5oIC4uL2NvbW1vbi9taW5pbHpvLmggXAotCS4uL2NvbW1vbi9sem9jb25mLmggLi4vY29tbW9uL2x6b2RlZnMuaCAuLi9jb21tb24vbWQ1LmggXAotCS4uL2NvbW1vbi9zaGExLmggdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5oIFwKLQl0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmggXAotCXRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmggXAotCXRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHByb3RvLmgKLUhFQURFUlMgPSAkKGluY2x1ZGVfSEVBREVSUykgJChub2luc3RfSEVBREVSUykKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVkFISV9DRkxBR1MgPSBAQVZBSElfQ0ZMQUdTQAotQVZBSElfTElCUyA9IEBBVkFISV9MSUJTQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DUllQVF9MSUJTID0gQENSWVBUX0xJQlNACi1DWFggPSBAQ1hYQAotQ1hYQ1BQID0gQENYWENQUEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1FQ0hPID0gQEVDSE9ACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1GNzcgPSBARjc3QAotRkZMQUdTID0gQEZGTEFHU0AKLUdOVVRMU19DRkxBR1MgPSBAR05VVExTX0NGTEFHU0AKLUdOVVRMU19MSUJTID0gQEdOVVRMU19MSUJTQAotR1JFUCA9IEBHUkVQQAotR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAotR1RLX0xJQlMgPSBAR1RLX0xJQlNACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUpQRUdfTERGTEFHUyA9IEBKUEVHX0xERkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJHQ1JZUFRfQ0ZMQUdTID0gQExJQkdDUllQVF9DRkxBR1NACi1MSUJHQ1JZUFRfQ09ORklHID0gQExJQkdDUllQVF9DT05GSUdACi1MSUJHQ1JZUFRfTElCUyA9IEBMSUJHQ1JZUFRfTElCU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKLVBLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAotUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKLVJBTkxJQiA9IEBSQU5MSUJACi1SUE1TT1VSQ0VESVIgPSBAUlBNU09VUkNFRElSQAotU0RMX0NGTEFHUyA9IEBTRExfQ0ZMQUdTQAotU0RMX0xJQlMgPSBAU0RMX0xJQlNACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1NMX0xJQlMgPSBAU1NMX0xJQlNACi1TVFJJUCA9IEBTVFJJUEAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdTT0NLTElCID0gQFdTT0NLTElCQAotWE1LTUYgPSBAWE1LTUZACi1YX0NGTEFHUyA9IEBYX0NGTEFHU0AKLVhfRVhUUkFfTElCUyA9IEBYX0VYVFJBX0xJQlNACi1YX0xJQlMgPSBAWF9MSUJTQAotWF9QUkVfTElCUyA9IEBYX1BSRV9MSUJTQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlL3JmYgotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotd2l0aF9mZm1wZWcgPSBAd2l0aF9mZm1wZWdACi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvY29tbW9uCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUBUSUdIVFZOQ0ZJTEVUUkFOU0ZFUkhEUlMgPSB0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmggXAotQFdJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSX1RSVUVACXRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuaCBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuaCBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJdGlnaHR2bmMtZmlsZXRyYW5zZmVyL3JmYnRpZ2h0cHJvdG8uaAotCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUBUSUdIVFZOQ0ZJTEVUUkFOU0ZFUlNSQ1MgPSB0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYyBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYyBcCi1AV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVJfVFJVRUAJdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jIFwKLUBXSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUl9UUlVFQAl0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLQotQEhBVkVfR05VVExTX0ZBTFNFQEBIQVZFX0xJQlNTTF9GQUxTRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVAV0VCU09DS0VUU1NTTFNSQ1MgPSByZmJzc2xfbm9uZS5jIHJmYmNyeXB0b19pbmNsdWRlZC5jIC4uL2NvbW1vbi9tZDUuYyAuLi9jb21tb24vc2hhMS5jCi1ASEFWRV9HTlVUTFNfRkFMU0VAQEhBVkVfTElCU1NMX1RSVUVAQFdJVEhfV0VCU09DS0VUU19UUlVFQFdFQlNPQ0tFVFNTU0xTUkNTID0gcmZic3NsX29wZW5zc2wuYyByZmJjcnlwdG9fb3BlbnNzbC5jCi1ASEFWRV9HTlVUTFNfVFJVRUBAV0lUSF9XRUJTT0NLRVRTX1RSVUVAV0VCU09DS0VUU1NTTFNSQ1MgPSByZmJzc2xfZ251dGxzLmMgcmZiY3J5cHRvX2dudXRscy5jCi1ASEFWRV9HTlVUTFNfRkFMU0VAQEhBVkVfTElCU1NMX1RSVUVAQFdJVEhfV0VCU09DS0VUU19UUlVFQFdFQlNPQ0tFVFNTU0xMSUJTID0gQFNTTF9MSUJTQCBAQ1JZUFRfTElCU0AKLUBIQVZFX0dOVVRMU19UUlVFQEBXSVRIX1dFQlNPQ0tFVFNfVFJVRUBXRUJTT0NLRVRTU1NMTElCUyA9IEBHTlVUTFNfTElCU0AKLUBXSVRIX1dFQlNPQ0tFVFNfVFJVRUBXRUJTT0NLRVRTU1JDUyA9IHdlYnNvY2tldHMuYyAkKFdFQlNPQ0tFVFNTU0xTUkNTKQotI2luY2x1ZGVfSEVBREVSUz1yZmIuaCByZmJjb25maWcuaCByZmJpbnQuaCByZmJwcm90by5oIGtleXN5bS5oIHJmYnJlZ2lvbi5oCi1pbmNsdWRlX0hFQURFUlMgPSAuLi9yZmIvcmZiLmggLi4vcmZiL3JmYmNvbmZpZy5oIC4uL3JmYi9yZmJpbnQuaCBcCi0JLi4vcmZiL3JmYnByb3RvLmggLi4vcmZiL2tleXN5bS5oIC4uL3JmYi9yZmJyZWdpb24uaCAuLi9yZmIvcmZiY2xpZW50LmgKLQotbm9pbnN0X0hFQURFUlMgPSAuLi9jb21tb24vZDNkZXMuaCAuLi9yZmIvZGVmYXVsdDh4MTYuaCB6cmxlb3V0c3RyZWFtLmggXAotCXpybGVwYWxldHRlaGVscGVyLmggenJsZXR5cGVzLmggcHJpdmF0ZS5oIHNjYWxlLmggcmZic3NsLmggcmZiY3J5cHRvLmggXAotCS4uL2NvbW1vbi9taW5pbHpvLmggLi4vY29tbW9uL2x6b2NvbmYuaCAuLi9jb21tb24vbHpvZGVmcy5oIC4uL2NvbW1vbi9tZDUuaCAuLi9jb21tb24vc2hhMS5oIFwKLQkkKFRJR0hUVk5DRklMRVRSQU5TRkVSSERSUykKLQotRVhUUkFfRElTVCA9IHRhYmxlaW5pdDI0LmMgdGFibGVpbml0dGN0ZW1wbGF0ZS5jIHRhYmxldHJhbnN0ZW1wbGF0ZS5jIFwKLQl0YWJsZWluaXRjbXRlbXBsYXRlLmMgdGFibGV0cmFuczI0dGVtcGxhdGUuYyBcCi0JenJsZWVuY29kZXRlbXBsYXRlLmMKLQotQEhBVkVfTElCWl9UUlVFQFpMSUJTUkNTID0gemxpYi5jIHpybGUuYyB6cmxlb3V0c3RyZWFtLmMgenJsZXBhbGV0dGVoZWxwZXIuYyAuLi9jb21tb24venl3cmxldGVtcGxhdGUuYwotQEhBVkVfTElCSlBFR19UUlVFQEBIQVZFX0xJQlpfVFJVRUBUSUdIVFNSQ1MgPSB0aWdodC5jIC4uL2NvbW1vbi90dXJib2pwZWcuYwotTElCX1NSQ1MgPSBtYWluLmMgcmZic2VydmVyLmMgcmZicmVnaW9uLmMgYXV0aC5jIHNvY2tldHMuYyAkKFdFQlNPQ0tFVFNTUkNTKSBcCi0Jc3RhdHMuYyBjb3JyZS5jIGhleHRpbGUuYyBycmUuYyB0cmFuc2xhdGUuYyBjdXRwYXN0ZS5jIFwKLQlodHRwZC5jIGN1cnNvci5jIGZvbnQuYyBcCi0JZHJhdy5jIHNlbGJveC5jIC4uL2NvbW1vbi9kM2Rlcy5jIC4uL2NvbW1vbi92bmNhdXRoLmMgY2FyZ3MuYyAuLi9jb21tb24vbWluaWx6by5jIHVsdHJhLmMgc2NhbGUuYyBcCi0JJChaTElCU1JDUykgJChUSUdIVFNSQ1MpICQoVElHSFRWTkNGSUxFVFJBTlNGRVJTUkNTKQotCi1saWJ2bmNzZXJ2ZXJfbGFfU09VUkNFUyA9ICQoTElCX1NSQ1MpCi1saWJ2bmNzZXJ2ZXJfbGFfTElCQUREID0gJChXRUJTT0NLRVRTU1NMTElCUykKLWxpYl9MVExJQlJBUklFUyA9IGxpYnZuY3NlcnZlci5sYQotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgbGlidm5jc2VydmVyL01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCi0JbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmU7IFwKLQl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGxpYmRpcikiIHx8IGV4aXQgMTsgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICckKERFU1RESVIpJChsaWJkaXIpJyI7IFwKLQkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJGxpc3QyICIkKERFU1RESVIpJChsaWJkaXIpIjsgXAotCX0KLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IHRlc3QgLW4gIiQobGliZGlyKSIgfHwgbGlzdD07IFwKLQlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkZiciOyBcCi0JICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCi0JZG9uZQotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCi0JICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKLQkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKLQkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKLQlkb25lCi1saWJ2bmNzZXJ2ZXIubGE6ICQobGlidm5jc2VydmVyX2xhX09CSkVDVFMpICQobGlidm5jc2VydmVyX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJ2bmNzZXJ2ZXJfbGFfREVQRU5ERU5DSUVTKSAKLQkkKEFNX1ZfQ0NMRCkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJ2bmNzZXJ2ZXJfbGFfT0JKRUNUUykgJChsaWJ2bmNzZXJ2ZXJfbGFfTElCQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hdXRoLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2FyZ3MuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jb3JyZS5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2N1cnNvci5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2N1dHBhc3RlLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZDNkZXMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kcmF3LlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmlsZWxpc3RpbmZvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmlsZXRyYW5zZmVybXNnLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZm9udC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9oZXh0aWxlLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvaHR0cGQuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tYWluLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWQ1LlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWluaWx6by5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JmYmNyeXB0b19nbnV0bHMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZmJjcnlwdG9faW5jbHVkZWQuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZmJjcnlwdG9fb3BlbnNzbC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JmYnJlZ2lvbi5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JmYnNlcnZlci5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JmYnNzbF9nbnV0bHMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZmJzc2xfbm9uZS5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JmYnNzbF9vcGVuc3NsLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmZidGlnaHRzZXJ2ZXIuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycmUuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zY2FsZS5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NlbGJveC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NoYTEuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zb2NrZXRzLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3RhdHMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90aWdodC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3RyYW5zbGF0ZS5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3R1cmJvanBlZy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VsdHJhLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdm5jYXV0aC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3dlYnNvY2tldHMuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS96bGliLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvenJsZS5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3pybGVvdXRzdHJlYW0uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS96cmxlcGFsZXR0ZWhlbHBlci5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3p5d3JsZXRlbXBsYXRlLlBsb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCi0KLS5jLmxvOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAotCi1tZDUubG86IC4uL2NvbW1vbi9tZDUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtZDUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL21kNS5UcG8gLWMgLW8gbWQ1LmxvIGB0ZXN0IC1mICcuLi9jb21tb24vbWQ1LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9tZDUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbWQ1LlRwbyAkKERFUERJUikvbWQ1LlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi9tZDUuYycgb2JqZWN0PSdtZDUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtZDUubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9tZDUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL21kNS5jCi0KLXNoYTEubG86IC4uL2NvbW1vbi9zaGExLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc2hhMS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvc2hhMS5UcG8gLWMgLW8gc2hhMS5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3NoYTEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3NoYTEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvc2hhMS5UcG8gJChERVBESVIpL3NoYTEuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL3NoYTEuYycgb2JqZWN0PSdzaGExLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc2hhMS5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3NoYTEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3NoYTEuYwotCi1kM2Rlcy5sbzogLi4vY29tbW9uL2QzZGVzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZDNkZXMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2QzZGVzLlRwbyAtYyAtbyBkM2Rlcy5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL2QzZGVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi9kM2Rlcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kM2Rlcy5UcG8gJChERVBESVIpL2QzZGVzLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi9kM2Rlcy5jJyBvYmplY3Q9J2QzZGVzLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZDNkZXMubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi9kM2Rlcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vZDNkZXMuYwotCi12bmNhdXRoLmxvOiAuLi9jb21tb24vdm5jYXV0aC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHZuY2F1dGgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL3ZuY2F1dGguVHBvIC1jIC1vIHZuY2F1dGgubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi92bmNhdXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi92bmNhdXRoLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3ZuY2F1dGguVHBvICQoREVQRElSKS92bmNhdXRoLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi92bmNhdXRoLmMnIG9iamVjdD0ndm5jYXV0aC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHZuY2F1dGgubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi92bmNhdXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi92bmNhdXRoLmMKLQotbWluaWx6by5sbzogLi4vY29tbW9uL21pbmlsem8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtaW5pbHpvLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9taW5pbHpvLlRwbyAtYyAtbyBtaW5pbHpvLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vbWluaWx6by5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vbWluaWx6by5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9taW5pbHpvLlRwbyAkKERFUERJUikvbWluaWx6by5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPScuLi9jb21tb24vbWluaWx6by5jJyBvYmplY3Q9J21pbmlsem8ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5pbHpvLmxvIGB0ZXN0IC1mICcuLi9jb21tb24vbWluaWx6by5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vbWluaWx6by5jCi0KLXp5d3JsZXRlbXBsYXRlLmxvOiAuLi9jb21tb24venl3cmxldGVtcGxhdGUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCB6eXdybGV0ZW1wbGF0ZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvenl3cmxldGVtcGxhdGUuVHBvIC1jIC1vIHp5d3JsZXRlbXBsYXRlLmxvIGB0ZXN0IC1mICcuLi9jb21tb24venl3cmxldGVtcGxhdGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3p5d3JsZXRlbXBsYXRlLlRwbyAkKERFUERJUikvenl3cmxldGVtcGxhdGUuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMnIG9iamVjdD0nenl3cmxldGVtcGxhdGUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB6eXdybGV0ZW1wbGF0ZS5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3p5d3JsZXRlbXBsYXRlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi96eXdybGV0ZW1wbGF0ZS5jCi0KLXR1cmJvanBlZy5sbzogLi4vY29tbW9uL3R1cmJvanBlZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHR1cmJvanBlZy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvdHVyYm9qcGVnLlRwbyAtYyAtbyB0dXJib2pwZWcubG8gYHRlc3QgLWYgJy4uL2NvbW1vbi90dXJib2pwZWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3R1cmJvanBlZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90dXJib2pwZWcuVHBvICQoREVQRElSKS90dXJib2pwZWcuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL3R1cmJvanBlZy5jJyBvYmplY3Q9J3R1cmJvanBlZy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHR1cmJvanBlZy5sbyBgdGVzdCAtZiAnLi4vY29tbW9uL3R1cmJvanBlZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vdHVyYm9qcGVnLmMKLQotcmZidGlnaHRzZXJ2ZXIubG86IHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHNlcnZlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJmYnRpZ2h0c2VydmVyLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9yZmJ0aWdodHNlcnZlci5UcG8gLWMgLW8gcmZidGlnaHRzZXJ2ZXIubG8gYHRlc3QgLWYgJ3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9yZmJ0aWdodHNlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvcmZidGlnaHRzZXJ2ZXIuVHBvICQoREVQRElSKS9yZmJ0aWdodHNlcnZlci5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYycgb2JqZWN0PSdyZmJ0aWdodHNlcnZlci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJmYnRpZ2h0c2VydmVyLmxvIGB0ZXN0IC1mICd0aWdodHZuYy1maWxldHJhbnNmZXIvcmZidGlnaHRzZXJ2ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlnaHR2bmMtZmlsZXRyYW5zZmVyL3JmYnRpZ2h0c2VydmVyLmMKLQotaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5sbzogdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBoYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LlRwbyAtYyAtbyBoYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmxvIGB0ZXN0IC1mICd0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LlRwbyAkKERFUERJUikvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jJyBvYmplY3Q9J2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBoYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmxvIGB0ZXN0IC1mICd0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvaGFuZGxlZmlsZXRyYW5zZmVycmVxdWVzdC5jCi0KLWZpbGV0cmFuc2Zlcm1zZy5sbzogdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZpbGV0cmFuc2Zlcm1zZy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvZmlsZXRyYW5zZmVybXNnLlRwbyAtYyAtbyBmaWxldHJhbnNmZXJtc2cubG8gYHRlc3QgLWYgJ3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9maWxldHJhbnNmZXJtc2cuVHBvICQoREVQRElSKS9maWxldHJhbnNmZXJtc2cuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jJyBvYmplY3Q9J2ZpbGV0cmFuc2Zlcm1zZy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZpbGV0cmFuc2Zlcm1zZy5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMKLQotZmlsZWxpc3RpbmZvLmxvOiB0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmlsZWxpc3RpbmZvLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9maWxlbGlzdGluZm8uVHBvIC1jIC1vIGZpbGVsaXN0aW5mby5sbyBgdGVzdCAtZiAndGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGVsaXN0aW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2ZpbGVsaXN0aW5mby5UcG8gJChERVBESVIpL2ZpbGVsaXN0aW5mby5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMnIG9iamVjdD0nZmlsZWxpc3RpbmZvLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmlsZWxpc3RpbmZvLmxvIGB0ZXN0IC1mICd0aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZWxpc3RpbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxlbGlzdGluZm8uYwotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotaW5zdGFsbC1pbmNsdWRlSEVBREVSUzogJChpbmNsdWRlX0hFQURFUlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCi0JaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoaW5jbHVkZWRpciknIjsgXAotCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZWRpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgXAotCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChpbmNsdWRlZGlyKSciOyBcCi0JICAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIgfHwgZXhpdCAkJD87IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGluY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCi0JZGlyPSckKERFU1RESVIpJChpbmNsdWRlZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChIRUFERVJTKQotaW5zdGFsbGRpcnM6Ci0JZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtaW5jbHVkZUhFQURFUlMKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZHZpLWFtOgotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5jbHVkZUhFQURFUlMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAotCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY3RhZ3MgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1pbmZvIFwKLQlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCi0JaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAotCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKLQl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTIFwKLQl1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKLQotCi1ASEFWRV9SUE1fVFJVRUAkKFBBQ0tBR0UpLSQoVkVSU0lPTikudGFyLmd6OiBkaXN0Ci0KLSMgUnVsZSB0byBidWlsZCBSUE0gZGlzdHJpYnV0aW9uIHBhY2thZ2UKLUBIQVZFX1JQTV9UUlVFQHJwbTogJChQQUNLQUdFKS0kKFZFUlNJT04pLnRhci5neiBsaWJ2bmNzZXJ2ZXIuc3BlYwotQEhBVkVfUlBNX1RSVUVACWNwICQoUEFDS0FHRSktJChWRVJTSU9OKS50YXIuZ3ogQFJQTVNPVVJDRURJUkAKLUBIQVZFX1JQTV9UUlVFQAlycG1idWlsZCAtYmEgbGlidm5jc2VydmVyLnNwZWMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL2NvbmZpZy5oIGIvbGlidm5jc2VydmVyL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ5MjY5Li4wMDAwMDAwCi0tLSBhL2xpYnZuY3NlcnZlci9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLwotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIEVuYWJsZSAyNCBiaXQgcGVyIHBpeGVsIGluIG5hdGl2ZSBmcmFtZWJ1ZmZlciAqLwotI2RlZmluZSBBTExPVzI0QlBQIDAKLQotLyogRW5hYmxlIEJhY2tDaGFubmVsIGNvbW11bmljYXRpb24gKi8KLSNkZWZpbmUgQkFDS0NIQU5ORUwgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBkb24ndCBoYXZlIGB2cHJpbnRmJyBidXQgZG8gaGF2ZSBgX2RvcHJudC4nICovCi0vKiAjdW5kZWYgSEFWRV9ET1BSTlQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmb3JrJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9GT1JLIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGltZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRlRJTUUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RuYW1lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HRVRIT1NUTkFNRSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfbnRvYScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfSU5FVF9OVE9BIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjeWdpcGMnIGxpYnJhcnkgKC1sY3lnaXBjKS4gKi8KLS8qICN1bmRlZiBIQVZFX0xJQkNZR0lQQyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGpwZWcnIGxpYnJhcnkgKC1sanBlZykuICovCi0jZGVmaW5lIEhBVkVfTElCSlBFRyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCi0jZGVmaW5lIEhBVkVfTElCTlNMIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkJyBsaWJyYXJ5ICgtbHB0aHJlYWQpLiAqLwotI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLwotLyogI3VuZGVmIEhBVkVfTElCU09DS0VUICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSNkZWZpbmUgSEFWRV9MSUJaIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgbWFsbG9jJyBmdW5jdGlvbiwgYW5kCi0gICB0byAwIG90aGVyd2lzZS4gKi8KLSNkZWZpbmUgSEFWRV9NQUxMT0MgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX01FTU1PVkUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9NRU1TRVQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZmlmbycgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfTUtGSUZPIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9ORVREQl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VsZWN0JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRUxFQ1QgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU0VUU0lEIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NPQ0tFVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIGBzdGF0JyBoYXMgdGhlIGJ1ZyB0aGF0IGl0IHN1Y2NlZWRzIHdoZW4gZ2l2ZW4gdGhlCi0gICB6ZXJvLWxlbmd0aCBmaWxlIG5hbWUgYXJndW1lbnQuICovCi0vKiAjdW5kZWYgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJDSFIgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNzcG4nIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NUUkNTUE4gMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSRFVQIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmZ0aW1lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc3RyJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJTVFIgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2xvZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfVElNRUJfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmZvcmsnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1ZGT1JLIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx2Zm9yay5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1ZGT1JLX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2cHJpbnRmJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9WUFJJTlRGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgYGZvcmsnIHdvcmtzLiAqLwotI2RlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxCi0KLS8qIERlZmluZSB0byAxIGlmIGB2Zm9yaycgd29ya3MuICovCi0jZGVmaW5lIEhBVkVfV09SS0lOR19WRk9SSyAxCi0KLS8qIFhLRVlCT0FSRCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI2RlZmluZSBIQVZFX1hLRVlCT0FSRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIGBsc3RhdCcgZGVyZWZlcmVuY2VzIGEgc3ltbGluayBzcGVjaWZpZWQgd2l0aCBhIHRyYWlsaW5nCi0gICBzbGFzaC4gKi8KLSNkZWZpbmUgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksgMQotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSNkZWZpbmUgUEFDS0FHRSAiTGliVk5DU2VydmVyIgotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfTkFNRSAiTGliVk5DU2VydmVyIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJMaWJWTkNTZXJ2ZXIgMC43cHJlIgotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAibGlidm5jc2VydmVyIgotCi0vKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuN3ByZSIKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGNoYXIgKi8KLS8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgaW50ICovCi0vKiAjdW5kZWYgU0laRU9GX0lOVCAqLwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgbG9uZyAqLwotLyogI3VuZGVmIFNJWkVPRl9MT05HICovCi0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdHlwZSBzaG9ydCAqLwotLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgdm9pZCogKi8KLS8qICN1bmRlZiBTSVpFT0ZfVk9JRFAgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLwotI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jZGVmaW5lIFZFUlNJT04gIjAuN3ByZSIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICovCi0vKiAjdW5kZWYgV09SRFNfQklHRU5ESUFOICovCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgbWlzc2luZyBvciBub3QgYmVpbmcgdXNlZC4gKi8KLS8qICN1bmRlZiBYX0RJU1BMQVlfTUlTU0lORyAqLwotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KLS8qICN1bmRlZiBjb25zdCAqLwotCi0vKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKLSAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotLyogI3VuZGVmIGlubGluZSAqLwotI2VuZGlmCi0KLS8qIERlZmluZSB0byBycGxfbWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KLS8qICN1bmRlZiBtYWxsb2MgKi8KLQotLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotLyogI3VuZGVmIHBpZF90ICovCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotLyogI3VuZGVmIHNpemVfdCAqLwotCi0vKiBUaGUgdHlwZSBmb3Igc29ja2xlbiAqLwotLyogI3VuZGVmIHNvY2tsZW5fdCAqLwotCi0vKiBEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay4gKi8KLS8qICN1bmRlZiB2Zm9yayAqLwpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL2h0dHBkLmMgYi9saWJ2bmNzZXJ2ZXIvaHR0cGQuYwppbmRleCBlZDkxZTQ2Li4xMmQ3MWE4IDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIvaHR0cGQuYworKysgYi9saWJ2bmNzZXJ2ZXIvaHR0cGQuYwpAQCAtMjMsNiArMjMsMTEgQEAKICAqICBVU0EuCiAgKi8KIAorI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBfQlNEX1NPVVJDRQorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjZW5kaWYKKwogI2luY2x1ZGUgPHJmYi9yZmIuaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0zOCw4ICs0MywxNSBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAKICNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbnNvY2suaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KICNkZWZpbmUgY2xvc2UgY2xvc2Vzb2NrZXQKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPEJhc2VUc2QuaD4gLyogRm9yIHRoZSBtaXNzaW5nIHNzaXplX3QgKi8KKyNkZWZpbmUgc3NpemVfdCBTU0laRV9UCisjZGVmaW5lIHJlYWQgX3JlYWQgLyogUHJldmVudCBQT1NJWCBkZXByZWNhdGlvbiB3YXJuaW5ncyAqLworI2VuZGlmCiAjZWxzZQogI2lmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19USU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtMzg3LDExICszOTksMTMgQEAKIAogICAgIGdldHBlZXJuYW1lKHJmYlNjcmVlbi0+aHR0cFNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOwogI2lmZGVmIExJQlZOQ1NFUlZFUl9JUHY2Ci0gICAgY2hhciBob3N0WzEwMjRdOwotICAgIGlmKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBhZGRybGVuLCBob3N0LCBzaXplb2YoaG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSAhPSAwKSB7Ci0gICAgICByZmJMb2dQZXJyb3IoImh0dHBQcm9jZXNzSW5wdXQ6IGVycm9yIGluIGdldG5hbWVpbmZvIik7CisgICAgeworICAgICAgICBjaGFyIGhvc3RbMTAyNF07CisgICAgICAgIGlmKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBhZGRybGVuLCBob3N0LCBzaXplb2YoaG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSAhPSAwKSB7CisgICAgICAgICAgICByZmJMb2dQZXJyb3IoImh0dHBQcm9jZXNzSW5wdXQ6IGVycm9yIGluIGdldG5hbWVpbmZvIik7CisgICAgICAgIH0KKyAgICAgICAgcmZiTG9nKCJodHRwZDogZ2V0ICclcycgZm9yICVzXG4iLCBmbmFtZSsxLCBob3N0KTsKICAgICB9Ci0gICAgcmZiTG9nKCJodHRwZDogZ2V0ICclcycgZm9yICVzXG4iLCBmbmFtZSsxLCBob3N0KTsKICNlbHNlCiAgICAgcmZiTG9nKCJodHRwZDogZ2V0ICclcycgZm9yICVzXG4iLCBmbmFtZSsxLAogCSAgIGluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvbWFpbi5jIGIvbGlidm5jc2VydmVyL21haW4uYwppbmRleCA0Y2IxOGFjLi45ODM5Yzg1IDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIvbWFpbi5jCisrKyBiL2xpYnZuY3NlcnZlci9tYWluLmMKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAjZW5kaWYKICAgcmZiSW5pdFNvY2tldHMoc2NyZWVuKTsKICAgcmZiSHR0cEluaXRTb2NrZXRzKHNjcmVlbik7Ci0jaWZuZGVmIF9fTUlOR1czMl9fCisjaWZuZGVmIFdJTjMyCiAgIGlmKHNjcmVlbi0+aWdub3JlU0lHUElQRSkKICAgICBzaWduYWwoU0lHUElQRSxTSUdfSUdOKTsKICNlbmRpZgpAQCAtMTA2MSwxMCArMTA2MSwxMyBAQAogICBpZihkaXNjb25uZWN0Q2xpZW50cykgewogICAgIHJmYkNsaWVudFB0ciBjbDsKICAgICByZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLSAgICB3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApCi0gICAgICBpZiAoY2wtPnNvY2sgPiAtMSkKLQkvKiB3ZSBkb24ndCBjYXJlIGFib3V0IG1heGZkIGhlcmUsIGJlY2F1c2UgdGhlIHNlcnZlciBnb2VzIGF3YXkgKi8KLQlyZmJDbG9zZUNsaWVudChjbCk7CisgICAgd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7CisgICAgICBpZiAoY2wtPnNvY2sgPiAtMSkgeworICAgICAgIC8qIHdlIGRvbid0IGNhcmUgYWJvdXQgbWF4ZmQgaGVyZSwgYmVjYXVzZSB0aGUgc2VydmVyIGdvZXMgYXdheSAqLworICAgICAgIHJmYkNsb3NlQ2xpZW50KGNsKTsKKyAgICAgICByZmJDbGllbnRDb25uZWN0aW9uR29uZShjbCk7CisgICAgICB9CisgICAgfQogICAgIHJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvcmZicmVnaW9uLmMgYi9saWJ2bmNzZXJ2ZXIvcmZicmVnaW9uLmMKaW5kZXggMGFiOGExMi4uMTk0N2Q3YyAxMDA2NDQKLS0tIGEvbGlidm5jc2VydmVyL3JmYnJlZ2lvbi5jCisrKyBiL2xpYnZuY3NlcnZlci9yZmJyZWdpb24uYwpAQCAtNzUxLDcgKzc1MSw3IEBACiAgICAgICBpLT5wdHJTaXplICs9IERFRlNURVA7CiAgICAgICBpLT5zUHRycyA9IChzcmFTcGFuKiopcmVhbGxvYyhpLT5zUHRycywgc2l6ZW9mKHNyYVNwYW4qKSppLT5wdHJTaXplKTsKICAgICB9Ci0gICAgaS0+cHRyUG9zID0rIDI7CisgICAgaS0+cHRyUG9zICs9IDI7CiAgICAgaWYoc3JhUmV2ZXJzZShpKSkgewogICAgICAgaS0+c1B0cnNbaS0+cHRyUG9zXSAgID0gICBpLT5zUHRyc1tpLT5wdHJQb3MtMl0tPnN1YnNwYW4tPmJhY2suX3ByZXY7CiAgICAgICBpLT5zUHRyc1tpLT5wdHJQb3MrMV0gPSAmKGktPnNQdHJzW2ktPnB0clBvcy0yXS0+c3Vic3Bhbi0+ZnJvbnQpOwpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL3JmYnNlcnZlci5jIGIvbGlidm5jc2VydmVyL3JmYnNlcnZlci5jCmluZGV4IDM5MmQwY2YuLmYxYzdjOTQgMTAwNjQ0Ci0tLSBhL2xpYnZuY3NlcnZlci9yZmJzZXJ2ZXIuYworKysgYi9saWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmMKQEAgLTI4LDcgKzI4LDExIEBACiAKICNpZmRlZiBfX1NUUklDVF9BTlNJX18KICNkZWZpbmUgX0JTRF9TT1VSQ0UKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMAogI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHJmYi9yZmIuaD4KICNpbmNsdWRlIDxyZmIvcmZicmVnaW9uLmg+CkBAIC0zOSw2ICs0Myw5IEBACiAjZW5kaWYKIAogI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorI2luY2x1ZGUgPGlvLmg+CiAjZGVmaW5lIHdyaXRlKHNvY2ssYnVmLGxlbikgc2VuZChzb2NrLGJ1ZixsZW4sMCkKICNlbHNlCiAjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfVU5JU1REX0gKQEAgLTY4LDggKzc1LDEyIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmbmRlZiBXSU4zMgogLyogcmVhZGRpcigpICovCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CisjZW5kaWYKKwogLyogZXJybm8gKi8KICNpbmNsdWRlIDxlcnJuby5oPgogLyogc3RyZnRpbWUoKSAqLwpAQCAtNzksMTIgKzkwLDIxIEBACiAjaW5jbHVkZSAicmZic3NsLmgiCiAjZW5kaWYKIAorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZiAvKiBNaXNzaW5nIGluIE1TVkMgKi8KKy8qIFByZXZlbnQgUE9TSVggZGVwcmVjYXRpb24gd2FybmluZ3MgKi8KKyNkZWZpbmUgY2xvc2UgX2Nsb3NlCisjZGVmaW5lIHN0cmR1cCBfc3RyZHVwIAorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgogI2lmZGVmIF9fTUlOR1czMl9fCi1zdGF0aWMgaW50IGNvbXBhdF9ta2Rpcihjb25zdCBjaGFyICpwYXRoLCBpbnQgbW9kZSkKLXsKLQlyZXR1cm4gbWtkaXIocGF0aCk7Ci19Ci0jZGVmaW5lIG1rZGlyIGNvbXBhdF9ta2RpcgorI2RlZmluZSBta2RpcihwYXRoLCBwZXJtcykgbWtkaXIocGF0aCkgLyogT21pdCB0aGUgcGVybXMgYXJndW1lbnQgdG8gbWF0Y2ggUE9TSVggc2lnbmF0dXJlICovCisjZWxzZSAvKiBNU1ZDIGFuZCBvdGhlciB3aW5kb3dzIGNvbXBpbGVycyAqLworI2RlZmluZSBta2RpcihwYXRoLCBwZXJtcykgX21rZGlyKHBhdGgpIC8qIE9taXQgdGhlIHBlcm1zIGFyZ3VtZW50IHRvIG1hdGNoIFBPU0lYIHNpZ25hdHVyZSAqLworI2VuZGlmIC8qIF9fTUlOR1czMl9fIGVsc2UuLi4gKi8KKyNkZWZpbmUgU19JU0RJUihtKQkoKChtKSAmIFNfSUZESVIpID09IFNfSUZESVIpCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CiAjZW5kaWYKIAogI2lmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQkpQRUcKQEAgLTMwOSwxMiArMzI5LDE0IEBACiAKICAgICBpZihpc1VEUCkgewogICAgICAgcmZiTG9nKCIgYWNjZXB0ZWQgVURQIGNsaWVudFxuIik7Ci0gICAgfSBlbHNlIHsKKwl9IGVsc2UgeworI2lmZGVmIExJQlZOQ1NFUlZFUl9JUHY2CisJCWNoYXIgaG9zdFsxMDI0XTsKKyNlbmRpZgogICAgICAgaW50IG9uZT0xOwogCiAgICAgICBnZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKICNpZmRlZiBMSUJWTkNTRVJWRVJfSVB2NgotICAgICAgY2hhciBob3N0WzEwMjRdOwogICAgICAgaWYoZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIGFkZHJsZW4sIGhvc3QsIHNpemVvZihob3N0KSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpICE9IDApIHsKIAlyZmJMb2dQZXJyb3IoInJmYk5ld0NsaWVudDogZXJyb3IgaW4gZ2V0bmFtZWluZm8iKTsKIAljbC0+aG9zdCA9IHN0cmR1cCgiIik7CkBAIC05MjksNyArOTUxLDcgQEAKICAgICByZmJTZXRCaXQobXNncy5jbGllbnQyc2VydmVyLCByZmJTZXRTY2FsZSk7CiAgICAgLypyZmJTZXRCaXQobXNncy5jbGllbnQyc2VydmVyLCByZmJTZXRTZXJ2ZXJJbnB1dCk7ICAqLwogICAgIC8qcmZiU2V0Qml0KG1zZ3MuY2xpZW50MnNlcnZlciwgcmZiU2V0U1cpOyAgICAgICAgICAgKi8KLSAgICByZmJTZXRCaXQobXNncy5jbGllbnQyc2VydmVyLCByZmJUZXh0Q2hhdCk7ICAgICAgICAKKyAgICAvKnJmYlNldEJpdChtc2dzLmNsaWVudDJzZXJ2ZXIsIHJmYlRleHRDaGF0KTsgICAgICAgICovCiAgICAgcmZiU2V0Qml0KG1zZ3MuY2xpZW50MnNlcnZlciwgcmZiUGFsbVZOQ1NldFNjYWxlRmFjdG9yKTsKICAgICByZmJTZXRCaXQobXNncy5jbGllbnQyc2VydmVyLCByZmJYdnApOwogCkBAIC0xMjM3LDEzICsxMjU5LDIwIEBACiAjZGVmaW5lIFJGQl9GSUxFX0FUVFJJQlVURV9URU1QT1JBUlkgIDB4MTAwCiAjZGVmaW5lIFJGQl9GSUxFX0FUVFJJQlVURV9DT01QUkVTU0VEIDB4ODAwCiAKLXJmYkJvb2wgcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChyZmJDbGllbnRQdHIgY2wsIGNoYXIgKnBhdGgsIGNoYXIgKnVuaXhQYXRoKQorcmZiQm9vbCByZmJGaWxlbmFtZVRyYW5zbGF0ZTJVTklYKHJmYkNsaWVudFB0ciBjbCwgLyogaW4gKi8gY2hhciAqcGF0aCwgLyogb3V0ICovIGNoYXIgKnVuaXhQYXRoLCBzaXplX3QgdW5peFBhdGhNYXhMZW4pCiB7CiAgICAgaW50IHg7CiAgICAgY2hhciAqaG9tZT1OVUxMOwogCiAgICAgRklMRVhGRVJfQUxMT1dFRF9PUl9DTE9TRV9BTkRfUkVUVVJOKCIiLCBjbCwgRkFMU0UpOwogCisgICAgLyoKKyAgICAgKiBEbyBub3QgdXNlIHN0cm5jcHkoKSAtIHRydW5jYXRpbmcgdGhlIGZpbGUgbmFtZSB3b3VsZCBwcm9iYWJseSBoYXZlIHVuZGVzaXJhYmxlIHNpZGUgZWZmZWN0cworICAgICAqIEluc3RlYWQgY2hlY2sgaWYgZGVzdGluYXRpb24gYnVmZmVyIGlzIGJpZyBlbm91Z2gKKyAgICAgKi8KKyAgICBpZiAoc3RybGVuKHBhdGgpID49IHVuaXhQYXRoTWF4TGVuKQorICAgICAgcmV0dXJuIEZBTFNFOworCiAgICAgLyogQzogKi8KICAgICBpZiAocGF0aFswXT09J0MnICYmIHBhdGhbMV09PSc6JykKICAgICAgIHN0cmNweSh1bml4UGF0aCwgJnBhdGhbMl0pOwpAQCAtMTI1Miw2ICsxMjgxLDEwIEBACiAgICAgICBob21lID0gZ2V0ZW52KCJIT01FIik7CiAgICAgICBpZiAoaG9tZSE9TlVMTCkKICAgICAgIHsKKyAgICAgICAgLyogUmUtY2hlY2sgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgaWYgKChzdHJsZW4ocGF0aCkgKyBzdHJsZW4oaG9tZSkgKyAxKSA+PSB1bml4UGF0aE1heExlbikKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisKICAgICAgICAgc3RyY3B5KHVuaXhQYXRoLCBob21lKTsKICAgICAgICAgc3RyY2F0KHVuaXhQYXRoLCIvIik7CiAgICAgICAgIHN0cmNhdCh1bml4UGF0aCwgcGF0aCk7CkBAIC0xMjgzLDMzICsxMzE2LDg1IEBACiAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKICAgICBSRkJfRklORF9EQVRBIHdpbjMyZmlsZW5hbWU7CiAgICAgaW50IG5PcHRMZW4gPSAwLCByZXR2YWw9MDsKKyNpZmRlZiBXSU4zMgorICAgIFdJTjMyX0ZJTkRfREFUQUEgd2luRmluZERhdGE7CisgICAgSEFORExFIGZpbmRIYW5kbGU7CisgICAgaW50IHBhdGhMZW4sIGJhc2VQYXRoTGVuZ3RoOworICAgIGNoYXIgKmJhc2VQYXRoOworI2Vsc2UKICAgICBESVIgKmRpcnA9TlVMTDsKICAgICBzdHJ1Y3QgZGlyZW50ICpkaXJlbnRwPU5VTEw7CisjZW5kaWYKIAogICAgIEZJTEVYRkVSX0FMTE9XRURfT1JfQ0xPU0VfQU5EX1JFVFVSTigiIiwgY2wsIEZBTFNFKTsKIAogICAgIC8qIENsaWVudCB0aGlua3Mgd2UgYXJlIFdpbmJsb3dzICovCi0gICAgcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChjbCwgYnVmZmVyLCBwYXRoKTsKKyAgICBpZiAoIXJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIGJ1ZmZlciwgcGF0aCwgc2l6ZW9mKHBhdGgpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKERCKSByZmJMb2coInJmYlByb2Nlc3NGaWxlVHJhbnNmZXIoKSByZmJEaXJDb250ZW50UmVxdWVzdDogcmZiUkRpckNvbnRlbnQ6IFwiJXNcIi0+XCIlc1wiXG4iLGJ1ZmZlciwgcGF0aCk7CiAKKyNpZmRlZiBXSU4zMgorICAgIC8vIENyZWF0ZSBhIHNlYXJjaCBzdHJpbmcsIGxpa2UgQzpcZm9sZGVyXCoKKworICAgIHBhdGhMZW4gPSBzdHJsZW4ocGF0aCk7CisgICAgYmFzZVBhdGggPSBtYWxsb2MocGF0aExlbiArIDMpOworICAgIG1lbWNweShiYXNlUGF0aCwgcGF0aCwgcGF0aExlbik7CisgICAgYmFzZVBhdGhMZW5ndGggPSBwYXRoTGVuOworICAgIGJhc2VQYXRoW2Jhc2VQYXRoTGVuZ3RoXSA9ICdcXCc7CisgICAgYmFzZVBhdGhbYmFzZVBhdGhMZW5ndGggKyAxXSA9ICcqJzsKKyAgICBiYXNlUGF0aFtiYXNlUGF0aExlbmd0aCArIDJdID0gJ1wwJzsKKworICAgIC8vIFN0YXJ0IGEgc2VhcmNoCisgICAgbWVtc2V0KCZ3aW5GaW5kRGF0YSwgMCwgc2l6ZW9mKHdpbkZpbmREYXRhKSk7CisgICAgZmluZEhhbmRsZSA9IEZpbmRGaXJzdEZpbGVBKHBhdGgsICZ3aW5GaW5kRGF0YSk7CisgICAgZnJlZShiYXNlUGF0aCk7CisKKyAgICBpZiAoZmluZEhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyNlbHNlCiAgICAgZGlycD1vcGVuZGlyKHBhdGgpOwogICAgIGlmIChkaXJwPT1OVUxMKQorI2VuZGlmCiAgICAgICAgIHJldHVybiByZmJTZW5kRmlsZVRyYW5zZmVyTWVzc2FnZShjbCwgcmZiRGlyUGFja2V0LCByZmJBRGlyZWN0b3J5LCAwLCAwLCBOVUxMKTsKKwogICAgIC8qIHNlbmQgYmFjayB0aGUgcGF0aCBuYW1lIChuZWNlc3NhcnkgZm9yIGxpbmtzKSAqLwogICAgIGlmIChyZmJTZW5kRmlsZVRyYW5zZmVyTWVzc2FnZShjbCwgcmZiRGlyUGFja2V0LCByZmJBRGlyZWN0b3J5LCAwLCBsZW5ndGgsIGJ1ZmZlcik9PUZBTFNFKSByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBXSU4zMgorICAgIHdoaWxlIChmaW5kSGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorI2Vsc2UKICAgICBmb3IgKGRpcmVudHA9cmVhZGRpcihkaXJwKTsgZGlyZW50cCE9TlVMTDsgZGlyZW50cD1yZWFkZGlyKGRpcnApKQorI2VuZGlmCiAgICAgewogICAgICAgICAvKiBnZXQgc3RhdHMgKi8KLSAgICAgICAgc25wcmludGYocmV0ZmlsZW5hbWUsc2l6ZW9mKHJldGZpbGVuYW1lKSwiJXMvJXMiLCBwYXRoLCBkaXJlbnRwLT5kX25hbWUpOworI2lmZGVmIFdJTjMyCisgICAgc25wcmludGYocmV0ZmlsZW5hbWUsc2l6ZW9mKHJldGZpbGVuYW1lKSwiJXMvJXMiLCBwYXRoLCB3aW5GaW5kRGF0YS5jRmlsZU5hbWUpOworI2Vsc2UKKyAgICBzbnByaW50ZihyZXRmaWxlbmFtZSxzaXplb2YocmV0ZmlsZW5hbWUpLCIlcy8lcyIsIHBhdGgsIGRpcmVudHAtPmRfbmFtZSk7CisjZW5kaWYKICAgICAgICAgcmV0dmFsID0gc3RhdChyZXRmaWxlbmFtZSwgJnN0YXRidWYpOwogCiAgICAgICAgIGlmIChyZXR2YWw9PTApCiAgICAgICAgIHsKICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSZ3aW4zMmZpbGVuYW1lLCAwLCBzaXplb2Yod2luMzJmaWxlbmFtZSkpOworI2lmZGVmIFdJTjMyCisgICAgICAgICAgICB3aW4zMmZpbGVuYW1lLmR3RmlsZUF0dHJpYnV0ZXMgPSB3aW5GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzOworICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5mdENyZWF0aW9uVGltZS5kd0xvd0RhdGVUaW1lID0gd2luRmluZERhdGEuZnRDcmVhdGlvblRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICAgICAgICAgIHdpbjMyZmlsZW5hbWUuZnRDcmVhdGlvblRpbWUuZHdIaWdoRGF0ZVRpbWUgPSB3aW5GaW5kRGF0YS5mdENyZWF0aW9uVGltZS5kd0hpZ2hEYXRlVGltZTsKKyAgICAgICAgICAgIHdpbjMyZmlsZW5hbWUuZnRMYXN0QWNjZXNzVGltZS5kd0xvd0RhdGVUaW1lID0gd2luRmluZERhdGEuZnRMYXN0QWNjZXNzVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5mdExhc3RBY2Nlc3NUaW1lLmR3SGlnaERhdGVUaW1lID0gd2luRmluZERhdGEuZnRMYXN0QWNjZXNzVGltZS5kd0hpZ2hEYXRlVGltZTsKKyAgICAgICAgICAgIHdpbjMyZmlsZW5hbWUuZnRMYXN0V3JpdGVUaW1lLmR3TG93RGF0ZVRpbWUgPSB3aW5GaW5kRGF0YS5mdExhc3RXcml0ZVRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICAgICAgICAgIHdpbjMyZmlsZW5hbWUuZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lID0gd2luRmluZERhdGEuZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lOworICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5uRmlsZVNpemVMb3cgPSB3aW5GaW5kRGF0YS5uRmlsZVNpemVMb3c7CisgICAgICAgICAgICB3aW4zMmZpbGVuYW1lLm5GaWxlU2l6ZUhpZ2ggPSB3aW5GaW5kRGF0YS5uRmlsZVNpemVIaWdoOworICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5kd1Jlc2VydmVkMCA9IHdpbkZpbmREYXRhLmR3UmVzZXJ2ZWQwOworICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5kd1Jlc2VydmVkMSA9IHdpbkZpbmREYXRhLmR3UmVzZXJ2ZWQxOworICAgICAgICAgICAgc3RyY3B5KChjaGFyICopd2luMzJmaWxlbmFtZS5jRmlsZU5hbWUsIHdpbkZpbmREYXRhLmNGaWxlTmFtZSk7CisgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKil3aW4zMmZpbGVuYW1lLmNBbHRlcm5hdGVGaWxlTmFtZSwgd2luRmluZERhdGEuY0FsdGVybmF0ZUZpbGVOYW1lKTsKKyNlbHNlCiAgICAgICAgICAgICB3aW4zMmZpbGVuYW1lLmR3RmlsZUF0dHJpYnV0ZXMgPSBTd2FwMzJJZkJFKFJGQl9GSUxFX0FUVFJJQlVURV9OT1JNQUwpOwogICAgICAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkKLSAgICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5kd0ZpbGVBdHRyaWJ1dGVzID0gU3dhcDMySWZCRShSRkJfRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKKyAgICAgICAgICAgICAgICB3aW4zMmZpbGVuYW1lLmR3RmlsZUF0dHJpYnV0ZXMgPSBTd2FwMzJJZkJFKFJGQl9GSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOwogICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5mdENyZWF0aW9uVGltZS5kd0xvd0RhdGVUaW1lID0gU3dhcDMySWZCRShzdGF0YnVmLnN0X2N0aW1lKTsgICAvKiBJbnRlbCBPcmRlciAqLwogICAgICAgICAgICAgd2luMzJmaWxlbmFtZS5mdENyZWF0aW9uVGltZS5kd0hpZ2hEYXRlVGltZSA9IDA7CiAgICAgICAgICAgICB3aW4zMmZpbGVuYW1lLmZ0TGFzdEFjY2Vzc1RpbWUuZHdMb3dEYXRlVGltZSA9IFN3YXAzMklmQkUoc3RhdGJ1Zi5zdF9hdGltZSk7IC8qIEludGVsIE9yZGVyICovCkBAIC0xMzI0LDkgKzE0MDksMTAgQEAKICAgICAgICAgICAgIC8qIElmIHRoaXMgaGFkIHRoZSBmdWxsIHBhdGgsIHdlIHdvdWxkIG5lZWQgdG8gdHJhbnNsYXRlIHRvIERPUyBmb3JtYXQgKCJDOlwiKSAqLwogICAgICAgICAgICAgLyogcmZiRmlsZW5hbWVUcmFuc2xhdGUyRE9TKGNsLCByZXRmaWxlbmFtZSwgd2luMzJmaWxlbmFtZS5jRmlsZU5hbWUpOyAqLwogICAgICAgICAgICAgc3RyY3B5KChjaGFyICopd2luMzJmaWxlbmFtZS5jRmlsZU5hbWUsIGRpcmVudHAtPmRfbmFtZSk7CisjZW5kaWYKICAgICAgICAgICAgIAogICAgICAgICAgICAgLyogRG8gbm90IHNob3cgaGlkZGVuIGZpbGVzIChidXQgc2hvdyBob3cgdG8gbW92ZSB1cCB0aGUgdHJlZSkgKi8KLSAgICAgICAgICAgIGlmICgoc3RyY21wKGRpcmVudHAtPmRfbmFtZSwgIi4uIik9PTApIHx8IChkaXJlbnRwLT5kX25hbWVbMF0hPScuJykpCisgICAgICAgICAgICBpZiAoKHN0cmNtcCgoY2hhciAqKXdpbjMyZmlsZW5hbWUuY0ZpbGVOYW1lLCAiLi4iKT09MCkgfHwgKHdpbjMyZmlsZW5hbWUuY0ZpbGVOYW1lWzBdIT0nLicpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5PcHRMZW4gPSBzaXplb2YoUkZCX0ZJTkRfREFUQSkgLSBNQVhfUEFUSCAtIDE0ICsgc3RybGVuKChjaGFyICopd2luMzJmaWxlbmFtZS5jRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgIC8qCkBAIC0xMzM0LDEzICsxNDIwLDMyIEBACiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpZiAocmZiU2VuZEZpbGVUcmFuc2Zlck1lc3NhZ2UoY2wsIHJmYkRpclBhY2tldCwgcmZiQURpcmVjdG9yeSwgMCwgbk9wdExlbiwgKGNoYXIgKikmd2luMzJmaWxlbmFtZSk9PUZBTFNFKQogICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXSU4zMgorICAgICAgICAgICAgICAgICAgICBGaW5kQ2xvc2UoZmluZEhhbmRsZSk7CisjZWxzZQogICAgICAgICAgICAgICAgICAgICBjbG9zZWRpcihkaXJwKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyNpZmRlZiBXSU4zMgorICAgICAgICBpZiAoRmluZE5leHRGaWxlQShmaW5kSGFuZGxlLCAmd2luRmluZERhdGEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbmRDbG9zZShmaW5kSGFuZGxlKTsKKyAgICAgICAgICAgIGZpbmRIYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgfQorI2lmZGVmIFdJTjMyCisgICAgaWYgKGZpbmRIYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgICBGaW5kQ2xvc2UoZmluZEhhbmRsZSk7CisgICAgfQorI2Vsc2UKICAgICBjbG9zZWRpcihkaXJwKTsKKyNlbmRpZgogICAgIC8qIEVuZCBvZiB0aGUgdHJhbnNmZXIgKi8KICAgICByZXR1cm4gcmZiU2VuZEZpbGVUcmFuc2Zlck1lc3NhZ2UoY2wsIHJmYkRpclBhY2tldCwgMCwgMCwgMCwgTlVMTCk7CiB9CkBAIC0xNTY2LDcgKzE2NzEsOCBAQAogICAgICAgICAvKiBhZGQgc29tZSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYXMgd2Ugd2lsbCBiZSBhZGRpbmcgYSB0aW1lc3BlYyB0byBpdCAqLwogICAgICAgICBpZiAoKGJ1ZmZlciA9IHJmYlByb2Nlc3NGaWxlVHJhbnNmZXJSZWFkQnVmZmVyKGNsLCBsZW5ndGgpKT09TlVMTCkgcmV0dXJuIEZBTFNFOwogICAgICAgICAvKiBUaGUgY2xpZW50IHJlcXVlc3RzIGEgRmlsZSAqLwotICAgICAgICByZmJGaWxlbmFtZVRyYW5zbGF0ZTJVTklYKGNsLCBidWZmZXIsIGZpbGVuYW1lMSk7CisgICAgICAgIGlmICghcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChjbCwgYnVmZmVyLCBmaWxlbmFtZTEsIHNpemVvZihmaWxlbmFtZTEpKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgY2wtPmZpbGVUcmFuc2Zlci5mZD1vcGVuKGZpbGVuYW1lMSwgT19SRE9OTFksIDA3NDQpOwogCiAgICAgICAgIC8qCkBAIC0xNjY0LDcgKzE3NzAsOCBAQAogICAgICAgICBwID0gc3RycmNocihidWZmZXIsICcsJyk7CiAgICAgICAgIGlmIChwIT1OVUxMKSB7CiAgICAgICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgICAgICBzdHJjcHkoc3pGaWxlVGltZSwgcCsxKTsKKyAgICAgICAgICAgIHN0cm5jcHkoc3pGaWxlVGltZSwgcCsxLCBzaXplb2Yoc3pGaWxlVGltZSkpOworICAgICAgICAgICAgc3pGaWxlVGltZVtzaXplb2Yoc3pGaWxlVGltZSktMV0gPSAnXHgwMCc7IC8qIGVuc3VyZSBOVUxMIHRlcm1pbmF0aW5nIGJ5dGUgaXMgcHJlc2VudCwgZXZlbiBpZiBjb3B5IG92ZXJmbG93ZWQgKi8KICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICBzekZpbGVUaW1lWzBdPTA7CiAKQEAgLTE2ODEsNyArMTc4OCw4IEBACiAgICAgICAgIH0KICAgICAgICAgc2l6ZUh0bXAgPSBTd2FwMzJJZkxFKHNpemVIdG1wKTsKICAgICAgICAgCi0gICAgICAgIHJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIGJ1ZmZlciwgZmlsZW5hbWUxKTsKKyAgICAgICAgaWYgKCFyZmJGaWxlbmFtZVRyYW5zbGF0ZTJVTklYKGNsLCBidWZmZXIsIGZpbGVuYW1lMSwgc2l6ZW9mKGZpbGVuYW1lMSkpKQorICAgICAgICAgICAgZ290byBmYWlsOwogCiAgICAgICAgIC8qIElmIHRoZSBmaWxlIGV4aXN0cy4uLiBXZSBjYW4gc2VuZCBhIHJmYkZpbGVDaGVja3N1bXMgYmFjayB0byB0aGUgY2xpZW50IGJlZm9yZSB3ZSBzZW5kIGFuIHJmYkZpbGVBY2NlcHRIZWFkZXIgKi8KICAgICAgICAgLyogVE9ETzogRGVsdGEgVHJhbnNmZXIgKi8KQEAgLTE4MTAsNyArMTkxOCw4IEBACiAgICAgICAgIGlmICgoYnVmZmVyID0gcmZiUHJvY2Vzc0ZpbGVUcmFuc2ZlclJlYWRCdWZmZXIoY2wsIGxlbmd0aCkpPT1OVUxMKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIHN3aXRjaCAoY29udGVudFBhcmFtKSB7CiAgICAgICAgIGNhc2UgcmZiQ0RpckNyZWF0ZTogIC8qIENsaWVudCByZXF1ZXN0cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3RvcnkgKi8KLSAgICAgICAgICAgIHJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIGJ1ZmZlciwgZmlsZW5hbWUxKTsKKyAgICAgICAgICAgIGlmICghcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChjbCwgYnVmZmVyLCBmaWxlbmFtZTEsIHNpemVvZihmaWxlbmFtZTEpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICByZXR2YWwgPSBta2RpcihmaWxlbmFtZTEsIDA3NTUpOwogICAgICAgICAgICAgaWYgKERCKSByZmJMb2coInJmYlByb2Nlc3NGaWxlVHJhbnNmZXIoKSByZmJDb21tYW5kOiByZmJDRGlyQ3JlYXRlKFwiJXNcIi0+XCIlc1wiKSAlc1xuIiwgYnVmZmVyLCBmaWxlbmFtZTEsIChyZXR2YWw9PS0xPyJGYWlsZWQiOiJTdWNjZXNzIikpOwogICAgICAgICAgICAgLyoKQEAgLTE4MTksNyArMTkyOCw4IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyIT1OVUxMKSBmcmVlKGJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICAgICBjYXNlIHJmYkNGaWxlRGVsZXRlOiAvKiBDbGllbnQgcmVxdWVzdHMgdGhlIGRlbGV0aW9uIG9mIGEgZmlsZSAqLwotICAgICAgICAgICAgcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChjbCwgYnVmZmVyLCBmaWxlbmFtZTEpOworICAgICAgICAgICAgaWYgKCFyZmJGaWxlbmFtZVRyYW5zbGF0ZTJVTklYKGNsLCBidWZmZXIsIGZpbGVuYW1lMSwgc2l6ZW9mKGZpbGVuYW1lMSkpKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIGlmIChzdGF0KGZpbGVuYW1lMSwmc3RhdGJ1Zik9PTApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkKQEAgLTE4MzcsOCArMTk0NywxMCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFNwbGl0IGludG8gMiBmaWxlbmFtZXMgKCcqJyBpcyBhIHNlcGVyYXRvcikgKi8KICAgICAgICAgICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgcmZiRmlsZW5hbWVUcmFuc2xhdGUyVU5JWChjbCwgYnVmZmVyLCBmaWxlbmFtZTEpOwotICAgICAgICAgICAgICAgIHJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIHArMSwgICAgZmlsZW5hbWUyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIGJ1ZmZlciwgZmlsZW5hbWUxLCBzaXplb2YoZmlsZW5hbWUxKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBpZiAoIXJmYkZpbGVuYW1lVHJhbnNsYXRlMlVOSVgoY2wsIHArMSwgICAgZmlsZW5hbWUyLCBzaXplb2YoZmlsZW5hbWUyKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByZW5hbWUoZmlsZW5hbWUxLGZpbGVuYW1lMik7CiAgICAgICAgICAgICAgICAgaWYgKERCKSByZmJMb2coInJmYlByb2Nlc3NGaWxlVHJhbnNmZXIoKSByZmJDb21tYW5kOiByZmJDRmlsZVJlbmFtZShcIiVzXCItPlwiJXNcIiAtLT4+IFwiJXNcIi0+XCIlc1wiKSAlc1xuIiwgYnVmZmVyLCBmaWxlbmFtZTEsIHArMSwgZmlsZW5hbWUyLCAocmV0dmFsPT0tMT8iRmFpbGVkIjoiU3VjY2VzcyIpKTsKICAgICAgICAgICAgICAgICAvKgpAQCAtMTg1OCw2ICsxOTcwLDEwIEBACiAgICAgLyogTk9URTogZG9uJ3QgZm9yZ2V0IHRvIGZyZWUoYnVmZmVyKSBpZiB5b3UgcmV0dXJuIGVhcmx5ISAqLwogICAgIGlmIChidWZmZXIhPU5VTEwpIGZyZWUoYnVmZmVyKTsKICAgICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgICBpZiAoYnVmZmVyIT1OVUxMKSBmcmVlKGJ1ZmZlcik7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAvKgpAQCAtMjQ1Nyw2ICsyNTczLDExIEBACiAJbXNnLmNjdC5sZW5ndGggPSBTd2FwMzJJZkxFKG1zZy5jY3QubGVuZ3RoKTsKIAogCXN0ciA9IChjaGFyICopbWFsbG9jKG1zZy5jY3QubGVuZ3RoKTsKKwlpZiAoc3RyID09IE5VTEwpIHsKKwkJcmZiTG9nUGVycm9yKCJyZmJQcm9jZXNzQ2xpZW50Tm9ybWFsTWVzc2FnZTogbm90IGVub3VnaCBtZW1vcnkiKTsKKwkJcmZiQ2xvc2VDbGllbnQoY2wpOworCQlyZXR1cm47CisJfQogCiAJaWYgKChuID0gcmZiUmVhZEV4YWN0KGNsLCBzdHIsIG1zZy5jY3QubGVuZ3RoKSkgPD0gMCkgewogCSAgICBpZiAobiAhPSAwKQpAQCAtMjQ4Miw2ICsyNjAzLDEzIEBACiAgICAgICAgICAgcmZiQ2xvc2VDbGllbnQoY2wpOwogICAgICAgICAgIHJldHVybjsKICAgICAgIH0KKworICAgICAgaWYgKG1zZy5zc2Muc2NhbGUgPT0gMCkgeworICAgICAgICAgIHJmYkxvZ1BlcnJvcigicmZiUHJvY2Vzc0NsaWVudE5vcm1hbE1lc3NhZ2U6IHdpbGwgbm90IGFjY2VwdCBhIHNjYWxlIGZhY3RvciBvZiB6ZXJvIik7CisgICAgICAgICAgcmZiQ2xvc2VDbGllbnQoY2wpOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwogICAgICAgcmZiU3RhdFJlY29yZE1lc3NhZ2VSY3ZkKGNsLCBtc2cudHlwZSwgc3pfcmZiU2V0U2NhbGVNc2csIHN6X3JmYlNldFNjYWxlTXNnKTsKICAgICAgIHJmYkxvZygicmZiU2V0U2NhbGUoJWQpXG4iLCBtc2cuc3NjLnNjYWxlKTsKICAgICAgIHJmYlNjYWxpbmdTZXR1cChjbCxjbC0+c2NyZWVuLT53aWR0aC9tc2cuc3NjLnNjYWxlLCBjbC0+c2NyZWVuLT5oZWlnaHQvbXNnLnNzYy5zY2FsZSk7CkBAIC0yNDk4LDYgKzI2MjYsMTMgQEAKICAgICAgICAgICByZmJDbG9zZUNsaWVudChjbCk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgfQorCisgICAgICBpZiAobXNnLnNzYy5zY2FsZSA9PSAwKSB7CisgICAgICAgICAgcmZiTG9nUGVycm9yKCJyZmJQcm9jZXNzQ2xpZW50Tm9ybWFsTWVzc2FnZTogd2lsbCBub3QgYWNjZXB0IGEgc2NhbGUgZmFjdG9yIG9mIHplcm8iKTsKKyAgICAgICAgICByZmJDbG9zZUNsaWVudChjbCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCiAgICAgICByZmJTdGF0UmVjb3JkTWVzc2FnZVJjdmQoY2wsIG1zZy50eXBlLCBzel9yZmJTZXRTY2FsZU1zZywgc3pfcmZiU2V0U2NhbGVNc2cpOwogICAgICAgcmZiTG9nKCJyZmJTZXRTY2FsZSglZClcbiIsIG1zZy5zc2Muc2NhbGUpOwogICAgICAgcmZiU2NhbGluZ1NldHVwKGNsLGNsLT5zY3JlZW4tPndpZHRoL21zZy5zc2Muc2NhbGUsIGNsLT5zY3JlZW4tPmhlaWdodC9tc2cuc3NjLnNjYWxlKTsKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci9zY2FsZS5jIGIvbGlidm5jc2VydmVyL3NjYWxlLmMKaW5kZXggNmY5MTM5MS4uZDExZGI0MCAxMDA2NDQKLS0tIGEvbGlidm5jc2VydmVyL3NjYWxlLmMKKysrIGIvbGlidm5jc2VydmVyL3NjYWxlLmMKQEAgLTY2LDYgKzY2LDEyIEBACiAgICAgICAgIChkb3VibGUpICgoaW50KSAoeCkpIDogKGRvdWJsZSkgKChpbnQpICh4KSArIDEpICkKICNkZWZpbmUgRkxPT1IoeCkgKCAoZG91YmxlKSAoKGludCkgKHgpKSApCiAKK3N0YXRpYyBpbmxpbmUgaW50IHBhZDQoaW50IHZhbHVlKQoreworICAgIGludCByZW1haW5kZXIgPSB2YWx1ZSAmIDM7CisgICAgaWYgKCFyZW1haW5kZXIpIHJldHVybiB2YWx1ZTsKKyAgICByZXR1cm4gdmFsdWUgKyA0IC0gcmVtYWluZGVyOworfQogCiBpbnQgU2NhbGVYKHJmYlNjcmVlbkluZm9QdHIgZnJvbSwgcmZiU2NyZWVuSW5mb1B0ciB0bywgaW50IHgpCiB7CkBAIC0yODEsMTQgKzI4NywyOSBAQAogICAgIHB0ciA9IG1hbGxvYyhzaXplb2YocmZiU2NyZWVuSW5mbykpOwogICAgIGlmIChwdHIhPU5VTEwpCiAgICAgeworICAgICAgICBpbnQgYWxsb2NTaXplOworCiAgICAgICAgIC8qIGNvcHkgKmV2ZXJ5dGhpbmcqICh3ZSBkb24ndCB1c2UgbW9zdCBvZiBpdCwgYnV0IGp1c3QgaW4gY2FzZSkgKi8KICAgICAgICAgbWVtY3B5KHB0ciwgY2wtPnNjcmVlbiwgc2l6ZW9mKHJmYlNjcmVlbkluZm8pKTsKKworICAgICAgICAvKiBTRUNVUklUWTogbWFrZSBzdXJlIHRoYXQgbm8gaW50ZWdlciBvdmVyZmxvdyB3aWxsIG9jY3VyIGFmdGVyd2FyZHMuCisgICAgICAgICAqIE5vdGU6IHRoaXMgaXMgZGVmZW5zaXZlIGNvZGluZywgYXMgdGhlIGNoZWNrIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbgorICAgICAgICAgKiBwZXJmb3JtZWQgZHVyaW5nIGluaXRpYWwsIG5vbi1zY2FsZWQgc2NyZWVuIHNldHVwLgorICAgICAgICAgKi8KKyAgICAgICAgYWxsb2NTaXplID0gcGFkNCh3aWR0aCAqIChwdHItPmJpdHNQZXJQaXhlbC84KSk7IC8qIHBlciBwcm90b2NvbCwgd2lkdGg8MioqMTYgYW5kIGJwcDwyNTYgKi8KKyAgICAgICAgaWYgKGhlaWdodCA9PSAwIHx8IGFsbG9jU2l6ZSA+PSBTSVpFX01BWCAvIGhlaWdodCkKKyAgICAgICAgeworICAgICAgICAgIGZyZWUocHRyKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbWFsbG9jKCkgd2lsbCBhbGxvY2F0ZSBhbiBpbmNvcnJlY3QgYnVmZmVyIHNpemUgLSBlYXJseSBhYm9ydCAqLworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzdW1lIGNvcHkgZXZlcnl0aGluZyAqLwogICAgICAgICBwdHItPndpZHRoID0gd2lkdGg7CiAgICAgICAgIHB0ci0+aGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICBwdHItPnBhZGRlZFdpZHRoSW5CeXRlcyA9IChwdHItPmJpdHNQZXJQaXhlbC84KSpwdHItPndpZHRoOwogCiAgICAgICAgIC8qIE5lZWQgdG8gYnkgbXVsdGlwbGVzIG9mIDQgZm9yIFNwYXJjIHN5c3RlbXMgKi8KLSAgICAgICAgcHRyLT5wYWRkZWRXaWR0aEluQnl0ZXMgKz0gKHB0ci0+cGFkZGVkV2lkdGhJbkJ5dGVzICUgNCk7CisgICAgICAgIHB0ci0+cGFkZGVkV2lkdGhJbkJ5dGVzID0gcGFkNChwdHItPnBhZGRlZFdpZHRoSW5CeXRlcyk7CiAKICAgICAgICAgLyogUmVzZXQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byAwISAqLwogICAgICAgICBwdHItPnNjYWxlZFNjcmVlblJlZkNvdW50ID0gMDsKQEAgLTM5Miw3ICs0MTMsNiBAQAogICAgICAgICBpZiAocmZiV3JpdGVFeGFjdChjbCwgKGNoYXIgKikmcG1zZywgc3pfcmZiUGFsbVZOQ1JlU2l6ZUZyYW1lQnVmZmVyTXNnKSA8IDApIHsKICAgICAgICAgICAgIHJmYkxvZ1BlcnJvcigicmZiTmV3Q2xpZW50OiB3cml0ZSIpOwogICAgICAgICAgICAgcmZiQ2xvc2VDbGllbnQoY2wpOwotICAgICAgICAgICAgcmZiQ2xpZW50Q29ubmVjdGlvbkdvbmUoY2wpOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgfQpAQCAtNDA3LDcgKzQyNyw2IEBACiAgICAgICAgIGlmIChyZmJXcml0ZUV4YWN0KGNsLCAoY2hhciAqKSZybXNnLCBzel9yZmJSZXNpemVGcmFtZUJ1ZmZlck1zZykgPCAwKSB7CiAgICAgICAgICAgICByZmJMb2dQZXJyb3IoInJmYk5ld0NsaWVudDogd3JpdGUiKTsKICAgICAgICAgICAgIHJmYkNsb3NlQ2xpZW50KGNsKTsKLSAgICAgICAgICAgIHJmYkNsaWVudENvbm5lY3Rpb25Hb25lKGNsKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci9zZWxib3guYyBiL2xpYnZuY3NlcnZlci9zZWxib3guYwppbmRleCBiYmM2ZDUyLi5hYjg0MzkwIDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIvc2VsYm94LmMKKysrIGIvbGlidm5jc2VydmVyL3NlbGJveC5jCkBAIC0yMzUsNyArMjM1LDcgQEAKIAogICAgaSA9IHJmYldpZHRoT2ZTdHJpbmcoZm9udCxva1N0cik7CiAgICBqID0gcmZiV2lkdGhPZlN0cmluZyhmb250LGNhbmNlbFN0cik7Ci0gICBzZWxEYXRhLmJ1dHRvbldpZHRoPSBrID0gNCpib3JkZXIrKGk8aik/ajppOworICAgc2VsRGF0YS5idXR0b25XaWR0aD0gayA9IDQqYm9yZGVyKyhpPGo/ajppKTsKICAgIHNlbERhdGEub2tCWCA9IHgxKyh4Mi14MS0yKmspLzM7CiAgICBpZihzZWxEYXRhLm9rQlg8eDErYm9yZGVyKSAvKiB0b28gbmFycm93ISAqLwogICAgICByZXR1cm4oLTEpOwpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL3NvY2tldHMuYyBiL2xpYnZuY3NlcnZlci9zb2NrZXRzLmMKaW5kZXggODRjOWM5OC4uYTljNWEyYyAxMDA2NDQKLS0tIGEvbGlidm5jc2VydmVyL3NvY2tldHMuYworKysgYi9saWJ2bmNzZXJ2ZXIvc29ja2V0cy5jCkBAIC00LDggKzQsOSBAQAogICogVGhpcyBjb2RlIHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBhbnkgY2hhbmdlcyBpbiB0aGUgUkZCIHByb3RvY29sLiAgSXQganVzdAogICogZGVhbHMgd2l0aCB0aGUgWCBzZXJ2ZXIgc2NoZWR1bGluZyBzdHVmZiwgY2FsbGluZyByZmJOZXdDbGllbnRDb25uZWN0aW9uIGFuZAogICogcmZiUHJvY2Vzc0NsaWVudE1lc3NhZ2UgdG8gYWN0dWFsbHkgZGVhbCB3aXRoIHRoZSBwcm90b2NvbC4gIElmIGEgc29ja2V0Ci0gKiBuZWVkcyB0byBiZSBjbG9zZWQgZm9yIGFueSByZWFzb24gdGhlbiByZmJDbG9zZUNsaWVudCBzaG91bGQgYmUgY2FsbGVkLCBhbmQKLSAqIHRoaXMgaW4gdHVybiB3aWxsIGNhbGwgcmZiQ2xpZW50Q29ubmVjdGlvbkdvbmUuICBUbyBtYWtlIGFuIGFjdGl2ZQorICogbmVlZHMgdG8gYmUgY2xvc2VkIGZvciBhbnkgcmVhc29uIHRoZW4gcmZiQ2xvc2VDbGllbnQgc2hvdWxkIGJlIGNhbGxlZC4gSW4gdHVybiwKKyAqIHJmYkNsaWVudENvbm5lY3Rpb25Hb25lIHdpbGwgYmUgY2FsbGVkIGJ5IHJmYlByb2Nlc3NFdmVudHMgKG5vbi10aHJlYWRlZCBjYXNlKQorICogb3IgY2xpZW50SW5wdXQgKHRocmVhZGVkIGNhc2UpIGluIG1haW4uYy4gIFRvIG1ha2UgYW4gYWN0aXZlCiAgKiBjb25uZWN0aW9uIG91dCwgY2FsbCByZmJDb25uZWN0IC0gbm90ZSB0aGF0IHRoaXMgZG9lcyBfbm90XyBjYWxsCiAgKiByZmJOZXdDbGllbnRDb25uZWN0aW9uLgogICoKQEAgLTQxLDYgKzQyLDE1IEBACiAgKiAgVVNBLgogICovCiAKKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgX0JTRF9TT1VSQ0UKKyNpZmRlZiBfX2xpbnV4X18KKy8qIFNldHRpbmcgdGhpcyBvbiBvdGhlciBzeXN0ZW1zIGhpZGVzIGRlZmluaXRpb25zIHN1Y2ggYXMgSU5BRERSX0xPT1BCQUNLLgorICogVGhlIGNoZWNrIHNob3VsZCBiZSBmb3IgX19HTElCQ19fIGluIGZhY3QuICovCisjIGRlZmluZSBfUE9TSVhfU09VUkNFCisjZW5kaWYKKyNlbmRpZgorCiAjaW5jbHVkZSA8cmZiL3JmYi5oPgogCiAjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1RZUEVTX0gKQEAgLTg5LDYgKzk5LDggQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChXSU4zMikKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CiAjaWZuZGVmIF9fTUlOR1czMl9fCiAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQwMTggNDc2MSkKICNlbmRpZgpAQCAtMTAwLDYgKzExMiwxMyBAQAogI2RlZmluZSBjbG9zZXNvY2tldCBjbG9zZQogI2VuZGlmCiAKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBTSFVUX1JEICAgMHgwMAorI2RlZmluZSBTSFVUX1dSICAgMHgwMQorI2RlZmluZSBTSFVUX1JEV1IgMHgwMgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYgLyogTWlzc2luZyBpbiBNU1ZDICovCisjZW5kaWYKKwogaW50IHJmYk1heENsaWVudFdhaXQgPSAyMDAwMDsgICAvKiB0aW1lIChtcykgYWZ0ZXIgd2hpY2ggd2UgZGVjaWRlIGNsaWVudCBoYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29uZSBhd2F5IC0gbmVlZGVkIHRvIHN0b3AgdXMgaGFuZ2luZyAqLwogCkBAIC0xMTMsOCArMTMyLDkgQEAKIHsKICAgICBpbl9hZGRyX3QgaWZhY2UgPSByZmJTY3JlZW4tPmxpc3RlbkludGVyZmFjZTsKIAotICAgIGlmIChyZmJTY3JlZW4tPnNvY2tldFN0YXRlIT1SRkJfU09DS0VUX0lOSVQpCi0JcmV0dXJuOworICAgIGlmIChyZmJTY3JlZW4tPnNvY2tldFN0YXRlID09IFJGQl9TT0NLRVRfUkVBRFkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHJmYlNjcmVlbi0+c29ja2V0U3RhdGUgPSBSRkJfU09DS0VUX1JFQURZOwogCkBAIC0xNzYsNyArMTk2LDkgQEAKIAlyZmJTY3JlZW4tPm1heEZkID0gbWF4KChpbnQpcmZiU2NyZWVuLT5saXN0ZW42U29jayxyZmJTY3JlZW4tPm1heEZkKTsKICNlbmRpZgogICAgIH0KLSAgICBlbHNlIGlmKHJmYlNjcmVlbi0+cG9ydD4wKSB7CisgICAgZWxzZQorICAgIHsKKwkgICAgaWYocmZiU2NyZWVuLT5wb3J0PjApIHsKICAgICAgIEZEX1pFUk8oJihyZmJTY3JlZW4tPmFsbEZkcykpOwogCiAgICAgICBpZiAoKHJmYlNjcmVlbi0+bGlzdGVuU29jayA9IHJmYkxpc3Rlbk9uVENQUG9ydChyZmJTY3JlZW4tPnBvcnQsIGlmYWNlKSkgPCAwKSB7CkBAIC0xODcsOCArMjA5LDEwIEBACiAgIAogICAgICAgRkRfU0VUKHJmYlNjcmVlbi0+bGlzdGVuU29jaywgJihyZmJTY3JlZW4tPmFsbEZkcykpOwogICAgICAgcmZiU2NyZWVuLT5tYXhGZCA9IHJmYlNjcmVlbi0+bGlzdGVuU29jazsKKwkgICAgfQogCiAjaWZkZWYgTElCVk5DU0VSVkVSX0lQdjYKKwkgICAgaWYgKHJmYlNjcmVlbi0+aXB2NnBvcnQ+MCkgewogICAgICAgaWYgKChyZmJTY3JlZW4tPmxpc3RlbjZTb2NrID0gcmZiTGlzdGVuT25UQ1A2UG9ydChyZmJTY3JlZW4tPmlwdjZwb3J0LCByZmJTY3JlZW4tPmxpc3RlbjZJbnRlcmZhY2UpKSA8IDApIHsKIAkvKiBMaXN0ZW5PblRDUDZQb3J0IGhhcyBpdHMgb3duIGRldGFpbGVkIGVycm9yIHByaW50b3V0ICovCiAJcmV0dXJuOwpAQCAtMTk3LDYgKzIyMSw3IEBACiAJCiAgICAgICBGRF9TRVQocmZiU2NyZWVuLT5saXN0ZW42U29jaywgJihyZmJTY3JlZW4tPmFsbEZkcykpOwogICAgICAgcmZiU2NyZWVuLT5tYXhGZCA9IG1heCgoaW50KXJmYlNjcmVlbi0+bGlzdGVuNlNvY2sscmZiU2NyZWVuLT5tYXhGZCk7CisJICAgIH0KICNlbmRpZgogCiAgICAgfQpAQCAtNDAyLDkgKzQyNyw5IEBACiAgICAgICByZmJMb2dQZXJyb3IoInJmYlByb2Nlc3NOZXdDb25uZWN0aW9uOiBlcnJvciBpbiBzZWxlY3QiKTsKICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKEZEX0lTU0VUKHJmYlNjcmVlbi0+bGlzdGVuU29jaywgJmxpc3Rlbl9mZHMpKSAKKyAgICBpZiAocmZiU2NyZWVuLT5saXN0ZW5Tb2NrID49IDAgJiYgRkRfSVNTRVQocmZiU2NyZWVuLT5saXN0ZW5Tb2NrLCAmbGlzdGVuX2ZkcykpCiAgICAgICBjaG9zZW5fbGlzdGVuX3NvY2sgPSByZmJTY3JlZW4tPmxpc3RlblNvY2s7Ci0gICAgaWYgKEZEX0lTU0VUKHJmYlNjcmVlbi0+bGlzdGVuNlNvY2ssICZsaXN0ZW5fZmRzKSkgCisgICAgaWYgKHJmYlNjcmVlbi0+bGlzdGVuNlNvY2sgPj0gMCAmJiBGRF9JU1NFVChyZmJTY3JlZW4tPmxpc3RlbjZTb2NrLCAmbGlzdGVuX2ZkcykpCiAgICAgICBjaG9zZW5fbGlzdGVuX3NvY2sgPSByZmJTY3JlZW4tPmxpc3RlbjZTb2NrOwogCiAgICAgaWYgKChzb2NrID0gYWNjZXB0KGNob3Nlbl9saXN0ZW5fc29jaywKQEAgLTQzNiwxMSArNDYxLDEzIEBACiAjZW5kaWYKIAogI2lmZGVmIExJQlZOQ1NFUlZFUl9JUHY2Ci0gICAgY2hhciBob3N0WzEwMjRdOwotICAgIGlmKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBhZGRybGVuLCBob3N0LCBzaXplb2YoaG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSAhPSAwKSB7Ci0gICAgICByZmJMb2dQZXJyb3IoInJmYlByb2Nlc3NOZXdDb25uZWN0aW9uOiBlcnJvciBpbiBnZXRuYW1laW5mbyIpOworICAgIHsKKyAgICAgICAgY2hhciBob3N0WzEwMjRdOworICAgICAgICBpZihnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcmxlbiwgaG9zdCwgc2l6ZW9mKGhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCkgIT0gMCkgeworICAgICAgICAgICAgcmZiTG9nUGVycm9yKCJyZmJQcm9jZXNzTmV3Q29ubmVjdGlvbjogZXJyb3IgaW4gZ2V0bmFtZWluZm8iKTsKKyAgICAgICAgfQorICAgICAgICByZmJMb2coIkdvdCBjb25uZWN0aW9uIGZyb20gY2xpZW50ICVzXG4iLCBob3N0KTsKICAgICB9Ci0gICAgcmZiTG9nKCJHb3QgY29ubmVjdGlvbiBmcm9tIGNsaWVudCAlc1xuIiwgaG9zdCk7CiAjZWxzZQogICAgIHJmYkxvZygiR290IGNvbm5lY3Rpb24gZnJvbSBjbGllbnQgJXNcbiIsIGluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci9zdGF0cy5jIGIvbGlidm5jc2VydmVyL3N0YXRzLmMKaW5kZXggMzlkZTFjNi4uYjk5ZGEwMSAxMDA2NDQKLS0tIGEvbGlidm5jc2VydmVyL3N0YXRzLmMKKysrIGIvbGlidm5jc2VydmVyL3N0YXRzLmMKQEAgLTI2LDYgKzI2LDEwIEBACiAKICNpbmNsdWRlIDxyZmIvcmZiLmg+CiAKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYgLyogTWlzc2luZyBpbiBNU1ZDICovCisjZW5kaWYKKwogY2hhciAqbWVzc2FnZU5hbWVTZXJ2ZXIyQ2xpZW50KHVpbnQzMl90IHR5cGUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CiBjaGFyICptZXNzYWdlTmFtZUNsaWVudDJTZXJ2ZXIodWludDMyX3QgdHlwZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKIGNoYXIgKmVuY29kaW5nTmFtZSh1aW50MzJfdCBlbmMsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9saWJ2bmNzZXJ2ZXIvdGFibGVpbml0MjQuYyBiL2xpYnZuY3NlcnZlci90YWJsZWluaXQyNC5jCmluZGV4IDhhNjBlYjcuLjM5ZTk5MjAgMTAwNjQ0Ci0tLSBhL2xpYnZuY3NlcnZlci90YWJsZWluaXQyNC5jCisrKyBiL2xpYnZuY3NlcnZlci90YWJsZWluaXQyNC5jCkBAIC0xLDQgKzEsOCBAQAogLyoKKyAgMjQgYml0CisgKi8KKworLyoKICAqICBPU1h2bmMgQ29weXJpZ2h0IChDKSAyMDAxIERhbiBNY0d1aXJrIDxtY2d1aXJrQGluY29tcGxldGVuZXNzLm5ldD4uCiAgKiAgT3JpZ2luYWwgWHZuYyBjb2RlIENvcHlyaWdodCAoQykgMTk5OSBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuICAKICAqICBBbGwgUmlnaHRzIFJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL3RpZ2h0LmMgYi9saWJ2bmNzZXJ2ZXIvdGlnaHQuYwppbmRleCA2ZDViY2JiLi4yNzZhMmUzIDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIvdGlnaHQuYworKysgYi9saWJ2bmNzZXJ2ZXIvdGlnaHQuYwpAQCAtODEsMTAgKzgxLDEwIEBACiB9IFRJR0hUX0NPTkY7CiAKIHN0YXRpYyBUSUdIVF9DT05GIHRpZ2h0Q29uZls0XSA9IHsKLSAgICB7IDY1NTM2LCAyMDQ4LCAgIDYsIDAsIDAsIDAsICAgNCwgMjQgfSwgLy8gMCAgKHVzZWQgb25seSB3aXRob3V0IEpQRUcpCi0gICAgeyA2NTUzNiwgMjA0OCwgIDMyLCAxLCAxLCAxLCAgOTYsIDI0IH0sIC8vIDEKLSAgICB7IDY1NTM2LCAyMDQ4LCAgMzIsIDMsIDMsIDIsICA5NiwgOTYgfSwgLy8gMiAgKHVzZWQgb25seSB3aXRoIEpQRUcpCi0gICAgeyA2NTUzNiwgMjA0OCwgIDMyLCA3LCA3LCA1LCAgOTYsIDI1NiB9IC8vIDkKKyAgICB7IDY1NTM2LCAyMDQ4LCAgIDYsIDAsIDAsIDAsICAgNCwgMjQgfSwgLyogMCAgKHVzZWQgb25seSB3aXRob3V0IEpQRUcpICovCisgICAgeyA2NTUzNiwgMjA0OCwgIDMyLCAxLCAxLCAxLCAgOTYsIDI0IH0sIC8qIDEgKi8KKyAgICB7IDY1NTM2LCAyMDQ4LCAgMzIsIDMsIDMsIDIsICA5NiwgOTYgfSwgLyogMiAgKHVzZWQgb25seSB3aXRoIEpQRUcpICovCisgICAgeyA2NTUzNiwgMjA0OCwgIDMyLCA3LCA3LCA1LCAgOTYsIDI1NiB9IC8qIDkgKi8KIH07CiAKICNpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJQTkcKZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMgYi9saWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5jCmluZGV4IGEwZDdhNWUuLjg4ZmJlOWEgMTAwNjQ0Ci0tLSBhL2xpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmMKKysrIGIvbGlidm5jc2VydmVyL3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuYwpAQCAtMjcsOCArMjcsMzQgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPHN5cy91dGltZS5oPgorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBfU19JRk1UKSA9PSBfU19JRlJFRykKKyNkZWZpbmUgU19JU0RJUihtKQkoKChtKSAmIFNfSUZESVIpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVdVU1IJCVNfSVdSSVRFCisjZGVmaW5lIFNfSVJVU1IJCVNfSVJFQUQKKyNkZWZpbmUgU19JV09USAkJMHgwMDAwMDAyCisjZGVmaW5lIFNfSVJPVEgJCTB4MDAwMDAwNAorI2RlZmluZSBTX0lXR1JQCQkweDAwMDAwMTAKKyNkZWZpbmUgU19JUkdSUAkJMHgwMDAwMDIwCisjZGVmaW5lIG1rZGlyKHBhdGgsIHBlcm1zKSBfbWtkaXIocGF0aCkgLyogTWF0Y2ggUE9TSVggc2lnbmF0dXJlICovCisvKiBQcmV2ZW50IFBPU0lYIGRlcHJlY2F0aW9uIHdhcm5pbmdzIG9uIE1TVkMgKi8KKyNkZWZpbmUgY3JlYXQgX2NyZWF0CisjZGVmaW5lIG9wZW4gX29wZW4KKyNkZWZpbmUgcmVhZCBfcmVhZAorI2RlZmluZSB3cml0ZSBfd3JpdGUKKyNkZWZpbmUgY2xvc2UgX2Nsb3NlCisjZGVmaW5lIHVubGluayBfdW5saW5rCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKyNlbHNlCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8dXRpbWUuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMTAwLDE3ICsxMjYsMTQwIEBACiAJcmV0dXJuIGZpbGVMaXN0TXNnOwogfQogCi0jaWZuZGVmIF9fR05VQ19fCisjaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9NU0NfVkVSKQogI2RlZmluZSBfX0ZVTkNUSU9OX18gInVua25vd24iCiAjZW5kaWYKIAorI2lmZGVmIFdJTjMyCisKKy8qIE1vc3Qgb2YgdGhlIFdpbmRvd3MgdmVyc2lvbiBoZXJlIGlzIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxnaW5kaS9GaWxlRGlyICovCisKKyNkZWZpbmUgRklMRVRJTUVfVE9fVElNRV9UKEZJTEVUSU1FKSAoKCgoKF9faW50NjQpRklMRVRJTUUuZHdMb3dEYXRlVGltZSkgfCAoKChfX2ludDY0KUZJTEVUSU1FLmR3SGlnaERhdGVUaW1lKSA8PCAzMikpIC0gMTE2NDQ0NzM2MDAwMDAwMDAwTCkgLyAxMDAwMDAwMEwpCisKKyNpZmRlZiBGSUxFX0FUVFJJQlVURV9JTlRFR1JJVFlfU1RSRUFNCisjZGVmaW5lIElTX1JFR1VMQVJfRklMRV9IQVNfQVRUUklCVVRFX0lOVEVHUklUWV9TVFJFQU0oZHdGaWxlQXR0cmlidXRlcykgKCEhKGR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9JTlRFR1JJVFlfU1RSRUFNKSkKKyNlbHNlCisjZGVmaW5lIElTX1JFR1VMQVJfRklMRV9IQVNfQVRUUklCVVRFX0lOVEVHUklUWV9TVFJFQU0oZHdGaWxlQXR0cmlidXRlcykgMAorI2VuZGlmCisKKyNpZmRlZiBGSUxFX0FUVFJJQlVURV9OT19TQ1JVQl9EQVRBCisjZGVmaW5lIElTX1JFR1VMQVJfRklMRV9IQVNfQVRUUklCVVRFX05PX1NDUlVCX0RBVEEoZHdGaWxlQXR0cmlidXRlcykgKCEhKGR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9OT19TQ1JVQl9EQVRBKSkKKyNlbHNlCisjZGVmaW5lIElTX1JFR1VMQVJfRklMRV9IQVNfQVRUUklCVVRFX05PX1NDUlVCX0RBVEEoZHdGaWxlQXR0cmlidXRlcykgMAorI2VuZGlmCisKKyNkZWZpbmUgSVNfUkVHVUxBUl9GSUxFKGR3RmlsZUF0dHJpYnV0ZXMpIFwKKwkoIFwKKwkhIShkd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfTk9STUFMKSB8fCBcCisJKCBcCisJIShkd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfREVWSUNFKSAmJiBcCisJIShkd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAmJiBcCisJIShkd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRU5DUllQVEVEKSAmJiBcCisJIUlTX1JFR1VMQVJfRklMRV9IQVNfQVRUUklCVVRFX0lOVEVHUklUWV9TVFJFQU0oZHdGaWxlQXR0cmlidXRlcykgJiYgXAorCSFJU19SRUdVTEFSX0ZJTEVfSEFTX0FUVFJJQlVURV9OT19TQ1JVQl9EQVRBKGR3RmlsZUF0dHJpYnV0ZXMpICYmIFwKKwkhKGR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9PRkZMSU5FKSAmJiBcCisJIShkd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfVEVNUE9SQVJZKSBcCisJKSBcCisJKQorCisjZGVmaW5lIElTX0ZPTERFUihkd0ZpbGVBdHRyaWJ1dGVzKSAoISEoZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisKK2ludAorQ3JlYXRlRmlsZUxpc3RJbmZvKEZpbGVMaXN0SW5mb1B0ciBwRmlsZUxpc3RJbmZvLCBjaGFyKiBwYXRoLCBpbnQgZmxhZykKK3sKKwlpbnQgcGF0aExlbiwgYmFzZVBhdGhMZW5ndGg7CisJY2hhciAqYmFzZVBhdGgsICpwQ2hhcjsKKwlXSU4zMl9GSU5EX0RBVEFBIHdpbkZpbmREYXRhOworCUhBTkRMRSBmaW5kSGFuZGxlOworCisJaWYocGF0aCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCWlmKHN0cmxlbihwYXRoKSA9PSAwKSB7CisJCS8qIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHNlbmQgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiBmdHAgcm9vdCovCisJCXNwcmludGYocGF0aCwgIiVzJXMiLCBHZXRGdHBSb290KCksICIvIik7CisJfQorCisJLyogQ3JlYXRlIGEgc2VhcmNoIHN0cmluZywgbGlrZSBDOlxmb2xkZXJcKiAqLworCisJcGF0aExlbiA9IHN0cmxlbihwYXRoKTsKKwliYXNlUGF0aCA9IG1hbGxvYyhwYXRoTGVuICsgMyk7CisJbWVtY3B5KGJhc2VQYXRoLCBwYXRoLCBwYXRoTGVuKTsKKwliYXNlUGF0aExlbmd0aCA9IHBhdGhMZW47CisJYmFzZVBhdGhbYmFzZVBhdGhMZW5ndGhdID0gJ1xcJzsKKwliYXNlUGF0aFtiYXNlUGF0aExlbmd0aCArIDFdID0gJyonOworCWJhc2VQYXRoW2Jhc2VQYXRoTGVuZ3RoICsgMl0gPSAnXDAnOworCisJLyogU3RhcnQgYSBzZWFyY2ggKi8KKwltZW1zZXQoJndpbkZpbmREYXRhLCAwLCBzaXplb2Yod2luRmluZERhdGEpKTsKKwlmaW5kSGFuZGxlID0gRmluZEZpcnN0RmlsZUEocGF0aCwgJndpbkZpbmREYXRhKTsKKworCWJhc2VQYXRoW2Jhc2VQYXRoTGVuZ3RoXSA9ICdcMCc7IC8qIFJlc3RvcmUgdG8gYSBiYXNlUGF0aCArIFwgKi8KKwkvKiBDb252ZXJ0IFwgdG8gLyAqLworCWZvcihwQ2hhciA9IGJhc2VQYXRoOyAqcENoYXI7IHBDaGFyKyspIHsKKwkJaWYgKCpwQ2hhciA9PSAnXFwnKSB7CisJCQkqcENoYXIgPSAnLyc7CisJCX0KKwl9CisKKwkvKiBXaGlsZSB3ZSBjYW4gZmluZCBhIG5leHQgZmlsZSBkby4uLgorCSAgIEJ1dCBpZ25vcmUgXC4gYW5kICcuLiBlbnRyaWVzLCB3aGljaCBhcmUgY3VycmVudCBmb2xkZXIgYW5kIHBhcmVudCBmb2xkZXIgcmVzcGVjdGl2ZWx5ICovCisJd2hpbGUoZmluZEhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSAmJiB3aW5GaW5kRGF0YS5jRmlsZU5hbWVbMF0gPT0gJy4nICYmIAorCQkod2luRmluZERhdGEuY0ZpbGVOYW1lWzFdID09ICdcMCcgfHwgCisJCSh3aW5GaW5kRGF0YS5jRmlsZU5hbWVbMV0gPT0gJy4nICYmIHdpbkZpbmREYXRhLmNGaWxlTmFtZVsyXSA9PSAnXDAnKSkpIHsKKwkJY2hhciBmdWxscGF0aFtQQVRIX01BWF07CisJCWZ1bGxwYXRoWzBdID0gMDsKKworCQlzdHJuY3B5X3MoZnVsbHBhdGgsIFBBVEhfTUFYLCBiYXNlUGF0aCwgYmFzZVBhdGhMZW5ndGgpOworCQlzdHJuY3B5X3MoZnVsbHBhdGggKyBiYXNlUGF0aExlbmd0aCwgUEFUSF9NQVggLSBiYXNlUGF0aExlbmd0aCwgd2luRmluZERhdGEuY0ZpbGVOYW1lLCAoaW50KXN0cmxlbih3aW5GaW5kRGF0YS5jRmlsZU5hbWUpKTsKKworCQlpZihJU19GT0xERVIod2luRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcykpIHsKKwkJCWlmIChBZGRGaWxlTGlzdEl0ZW1JbmZvKHBGaWxlTGlzdEluZm8sIHdpbkZpbmREYXRhLmNGaWxlTmFtZSwgLTEsIDApID09IDApIHsKKwkJCQlyZmJMb2coIkZpbGUgWyVzXTogTWV0aG9kIFslc106IEFkZCBkaXJlY3RvcnkgJXMgaW4gdGhlIgorCQkJCQkiIGxpc3QgZmFpbGVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBmdWxscGF0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gCisJCWVsc2UgaWYoSVNfUkVHVUxBUl9GSUxFKHdpbkZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMpKSB7CisJCQlpZihmbGFnKSB7CisJCQkJdW5zaWduZWQgaW50IGZpbGVTaXplID0gKHdpbkZpbmREYXRhLm5GaWxlU2l6ZUhpZ2ggKiAoTUFYRFdPUkQrMSkpICsgd2luRmluZERhdGEubkZpbGVTaXplTG93OworCQkJCWlmKEFkZEZpbGVMaXN0SXRlbUluZm8ocEZpbGVMaXN0SW5mbywgd2luRmluZERhdGEuY0ZpbGVOYW1lLCBmaWxlU2l6ZSwgRklMRVRJTUVfVE9fVElNRV9UKHdpbkZpbmREYXRhLmZ0TGFzdFdyaXRlVGltZSkpID09IDApIHsKKwkJCQkJcmZiTG9nKCJGaWxlIFslc106IE1ldGhvZCBbJXNdOiBBZGQgZmlsZSAlcyBpbiB0aGUgIgorCQkJCQkJImxpc3QgZmFpbGVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBmdWxscGF0aCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0JCQkKKwkJCX0KKwkJfQorCisJCWlmKEZpbmROZXh0RmlsZUEoZmluZEhhbmRsZSwgJndpbkZpbmREYXRhKSA9PSAwKSB7CisJCQlGaW5kQ2xvc2UoZmluZEhhbmRsZSk7CisJCQlmaW5kSGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJCX0KKwl9CisKKwlpZihmaW5kSGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUZpbmRDbG9zZShmaW5kSGFuZGxlKTsKKwl9CisKKwlmcmVlKGJhc2VQYXRoKTsKKwkKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworI2Vsc2UgLyogV0lOMzIgKi8KKwogaW50CiBDcmVhdGVGaWxlTGlzdEluZm8oRmlsZUxpc3RJbmZvUHRyIHBGaWxlTGlzdEluZm8sIGNoYXIqIHBhdGgsIGludCBmbGFnKQogewogCURJUiogcERpciA9IE5VTEw7CiAJc3RydWN0IGRpcmVudCogcERpcmVudCA9IE5VTEw7Ci0JCi0JaWYoKHBhdGggPT0gTlVMTCkgfHwgKHN0cmxlbihwYXRoKSA9PSAwKSkgeworCisJaWYocGF0aCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCWlmKHN0cmxlbihwYXRoKSA9PSAwKSB7CiAJCS8qIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHNlbmQgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiBmdHAgcm9vdCovCiAJCXNwcmludGYocGF0aCwgIiVzJXMiLCBHZXRGdHBSb290KCksICIvIik7CiAJfQpAQCAtMTcwLDYgKzMxOSw4IEBACiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKKyNlbmRpZgorCiAKIEZpbGVUcmFuc2Zlck1zZwogQ3JlYXRlRmlsZUxpc3RFcnJNc2coY2hhciBmbGFncykKQEAgLTYyMyw2ICs3NzQsMTAgQEAKICAqIE1ldGhvZCB0byBoYW5kbGUgY3JlYXRlIGRpcmVjdG9yeSByZXF1ZXN0LgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIF9NU0NfVkVSCisjdW5kZWYgQ3JlYXRlRGlyZWN0b3J5IC8qIFByZXZlbnQgbWFjcm8gY2xhc2hlcyB1bmRlciBXaW5kb3dzICovCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKwogdm9pZAogQ3JlYXRlRGlyZWN0b3J5KGNoYXIqIGRpck5hbWUpCiB7CkBAIC02MzMsNCArNzg4LDMgQEAKIAkJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBkaXJOYW1lKTsKIAl9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmggYi9saWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlcm1zZy5oCmluZGV4IDMwZTU4ZGYuLjNiMjdiZDAgMTAwNjQ0Ci0tLSBhL2xpYnZuY3NlcnZlci90aWdodHZuYy1maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVybXNnLmgKKysrIGIvbGlidm5jc2VydmVyL3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXJtc2cuaApAQCAtMjYsNiArMjYsMTEgQEAKICNpZm5kZWYgRklMRV9UUkFOU0ZFUl9NU0dfSAogI2RlZmluZSBGSUxFX1RSQU5TRkVSX01TR19ICiAKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSBwdXNoX21hY3JvKCJDcmVhdGVEaXJlY3RvcnkiKQorI3VuZGVmIENyZWF0ZURpcmVjdG9yeSAvKiBQcmV2ZW50IG1hY3JvIGNsYXNoZXMgdW5kZXIgV2luZG93cyAqLworI2VuZGlmIC8qIF9NU0NfVkVSICovCisKIHR5cGVkZWYgc3RydWN0IF9GaWxlVHJhbnNmZXJNc2cgewogCWNoYXIqIGRhdGE7CiAJdW5zaWduZWQgaW50IGxlbmd0aDsKQEAgLTUwLDUgKzU1LDkgQEAKIAogdm9pZCBGcmVlRmlsZVRyYW5zZmVyTXNnKEZpbGVUcmFuc2Zlck1zZyBmdG0pOwogCisjaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSBwb3BfbWFjcm8oIkNyZWF0ZURpcmVjdG9yeSIpIC8qIFJlc3RvcmUgb3JpZ2luYWwgbWFjcm8gKi8KKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL3RpZ2h0dm5jLWZpbGV0cmFuc2Zlci9oYW5kbGVmaWxldHJhbnNmZXJyZXF1ZXN0LmMgYi9saWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYwppbmRleCAyYmQ1YmExLi40MzE5MTJlIDEwMDY0NAotLS0gYS9saWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYworKysgYi9saWJ2bmNzZXJ2ZXIvdGlnaHR2bmMtZmlsZXRyYW5zZmVyL2hhbmRsZWZpbGV0cmFuc2ZlcnJlcXVlc3QuYwpAQCAtMjIsMTMgKzIyLDE4IEBACiAgKiBEYXRlCQk6IDE0dGggSnVseSAyMDA1CiAgKi8KICAKKyNpZm5kZWYgX01TQ19WRVIKICNpbmNsdWRlIDxwd2QuaD4KKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZm5kZWYgX01TQ19WRVIKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYgLyogX01TQ19WRVIgKi8KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgpkaWZmIC0tZ2l0IGEvbGlidm5jc2VydmVyL3dlYnNvY2tldHMuYyBiL2xpYnZuY3NlcnZlci93ZWJzb2NrZXRzLmMKaW5kZXggOGNkOTZkMy4uMzRmMDRkNyAxMDA2NDQKLS0tIGEvbGlidm5jc2VydmVyL3dlYnNvY2tldHMuYworKysgYi9saWJ2bmNzZXJ2ZXIvd2Vic29ja2V0cy5jCkBAIC0yNiwzMCArMjYsMzkgQEAKICAqICBVU0EuCiAgKi8KIAorI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBfQlNEX1NPVVJDRQorI2VuZGlmCisKICNpbmNsdWRlIDxyZmIvcmZiLmg+Ci0jaW5jbHVkZSA8cmVzb2x2Lmg+IC8qIF9fYjY0X250b3AgKi8KIC8qIGVycm5vICovCiAjaW5jbHVkZSA8ZXJybm8uaD4KIAotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8cmVzb2x2Lmg+IC8qIF9fYjY0X250b3AgKi8KKyNlbmRpZgorCisjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfRU5ESUFOX0gKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNlbGlmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19FTkRJQU5fSAorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyNlbmRpZgorCisjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicmZiY29uZmlnLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAicmZiL3JmYmNvbmZpZy5oIgogI2luY2x1ZGUgInJmYnNzbC5oIgogI2luY2x1ZGUgInJmYmNyeXB0by5oIgogCi0jaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIGRlZmluZWQoX19CSUdfRU5ESUFOKSAmJiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jZGVmaW5lIFdTX05UT0g2NChuKSAobikKLSNkZWZpbmUgV1NfTlRPSDMyKG4pIChuKQotI2RlZmluZSBXU19OVE9IMTYobikgKG4pCi0jZGVmaW5lIFdTX0hUT042NChuKSAobikKLSNkZWZpbmUgV1NfSFRPTjE2KG4pIChuKQotI2Vsc2UKLSNkZWZpbmUgV1NfTlRPSDY0KG4pIGJzd2FwXzY0KG4pCi0jZGVmaW5lIFdTX05UT0gzMihuKSBic3dhcF8zMihuKQotI2RlZmluZSBXU19OVE9IMTYobikgYnN3YXBfMTYobikKLSNkZWZpbmUgV1NfSFRPTjY0KG4pIGJzd2FwXzY0KG4pCi0jZGVmaW5lIFdTX0hUT04xNihuKSBic3dhcF8xNihuKQotI2VuZGlmCisjZGVmaW5lIFdTX05UT0g2NChuKSBodG9iZTY0KG4pCisjZGVmaW5lIFdTX05UT0gzMihuKSBodG9iZTMyKG4pCisjZGVmaW5lIFdTX05UT0gxNihuKSBodG9iZTE2KG4pCisjZGVmaW5lIFdTX0hUT042NChuKSBodG9iZTY0KG4pCisjZGVmaW5lIFdTX0hUT04xNihuKSBodG9iZTE2KG4pCiAKICNkZWZpbmUgQjY0TEVOKF9feCkgKCgoX194ICsgMikgLyAzKSAqIDEyIC8gMykKICNkZWZpbmUgV1NITEVOTUFYIDE0ICAvKiAyICsgc2l6ZW9mKHVpbnQ2NF90KSArIHNpemVvZih1aW50MzJfdCkgKi8KQEAgLTg4LDYgKzk3LDExIEBACiAgIHVpbnQzMl90IHU7CiB9IHdzX21hc2tfdDsKIAorLyogWFhYOiBUaGUgdW5pb24gYW5kIHRoZSBzdHJ1Y3RzIGRvIG5vdCBuZWVkIHRvIGJlIG5hbWVkLgorICogICAgICBXZSBhcmUgd29ya2luZyBhcm91bmQgYSBidWcgcHJlc2VudCBpbiBHQ0MgPCA0LjYgd2hpY2ggcHJldmVudGVkCisgKiAgICAgIGl0IGZyb20gcmVjb2duaXppbmcgYW5vbnltb3VzIHN0cnVjdHMgYW5kIHVuaW9ucy4KKyAqICAgICAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDc4NAorICovCiB0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHdzX2hlYWRlcl9zIHsKICAgdW5zaWduZWQgY2hhciBiMDsKICAgdW5zaWduZWQgY2hhciBiMTsKQEAgLTk1LDEzICsxMDksMTMgQEAKICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB7CiAgICAgICB1aW50MTZfdCBsMTY7CiAgICAgICB3c19tYXNrX3QgbTE2OwotICAgIH07CisgICAgfSBzMTY7CiAgICAgc3RydWN0IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgewogICAgICAgdWludDY0X3QgbDY0OwogICAgICAgd3NfbWFza190IG02NDsKLSAgICB9OworICAgIH0gczY0OwogICAgIHdzX21hc2tfdCBtOwotICB9OworICB9IHU7CiB9IHdzX2hlYWRlcl90OwogCiBlbnVtCkBAIC02MjUsNyArNjM5LDcgQEAKICAgICBpbnQgZmxlbmd0aCwgZmhsZW47CiAgICAgLyogaW50IGZpbjsgKi8gLyogbm90IHVzZWQgYXRtICovIAogCi0gICAgLy8gcmZiTG9nKCIgPD09ICVzWyVkXTogJWQgY2w6ICVwLCB3c2N0eDogJXAtJXAgKCVkKVxuIiwgX19mdW5jX18sIGdldHRpZCgpLCBsZW4sIGNsLCB3c2N0eCwgKGNoYXIgKil3c2N0eCArIHNpemVvZih3c19jdHhfdCksIHNpemVvZih3c19jdHhfdCkpOworICAgIC8qIHJmYkxvZygiIDw9PSAlc1slZF06ICVkIGNsOiAlcCwgd3NjdHg6ICVwLSVwICglZClcbiIsIF9fZnVuY19fLCBnZXR0aWQoKSwgbGVuLCBjbCwgd3NjdHgsIChjaGFyICopd3NjdHggKyBzaXplb2Yod3NfY3R4X3QpLCBzaXplb2Yod3NfY3R4X3QpKTsgKi8KIAogICAgIGlmICh3c2N0eC0+cmVhZGJ1ZmxlbikgewogICAgICAgLyogc2ltcGx5IHJldHVybiB3aGF0IHdlIGhhdmUgKi8KQEAgLTY4MCwxNSArNjk0LDE1IEBACiAKICAgICBpZiAoZmxlbmd0aCA8IDEyNikgewogCWZobGVuID0gMjsKLQltYXNrID0gaGVhZGVyLT5tOworCW1hc2sgPSBoZWFkZXItPnUubTsKICAgICB9IGVsc2UgaWYgKGZsZW5ndGggPT0gMTI2ICYmIDQgPD0gcmV0KSB7Ci0JZmxlbmd0aCA9IFdTX05UT0gxNihoZWFkZXItPmwxNik7CisJZmxlbmd0aCA9IFdTX05UT0gxNihoZWFkZXItPnUuczE2LmwxNik7CiAJZmhsZW4gPSA0OwotCW1hc2sgPSBoZWFkZXItPm0xNjsKKwltYXNrID0gaGVhZGVyLT51LnMxNi5tMTY7CiAgICAgfSBlbHNlIGlmIChmbGVuZ3RoID09IDEyNyAmJiAxMCA8PSByZXQpIHsKLQlmbGVuZ3RoID0gV1NfTlRPSDY0KGhlYWRlci0+bDY0KTsKKwlmbGVuZ3RoID0gV1NfTlRPSDY0KGhlYWRlci0+dS5zNjQubDY0KTsKIAlmaGxlbiA9IDEwOwotCW1hc2sgPSBoZWFkZXItPm02NDsKKwltYXNrID0gaGVhZGVyLT51LnM2NC5tNjQ7CiAgICAgfSBlbHNlIHsKICAgICAgIC8qIEluY29tcGxldGUgZnJhbWUgaGVhZGVyICovCiAgICAgICByZmJFcnIoIiVzOiBpbmNvbXBsZXRlIGZyYW1lIGhlYWRlclxuIiwgX19mdW5jX18sIHJldCk7CkBAIC03ODMsNiArNzk3LDcgQEAKIAkvKiBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplICovCiAJYmxlbiA9IEI2NExFTihsZW4pOwogICAgIH0gZWxzZSB7CisJb3Bjb2RlID0gV1NfT1BDT0RFX0JJTkFSWV9GUkFNRTsKIAlibGVuID0gbGVuOwogICAgIH0KIApAQCAtNzkyLDExICs4MDcsMTEgQEAKICAgICAgIHN6ID0gMjsKICAgICB9IGVsc2UgaWYgKGJsZW4gPD0gNjU1MzYpIHsKICAgICAgIGhlYWRlci0+YjEgPSAweDdlOwotICAgICAgaGVhZGVyLT5sMTYgPSBXU19IVE9OMTYoKHVpbnQxNl90KWJsZW4pOworICAgICAgaGVhZGVyLT51LnMxNi5sMTYgPSBXU19IVE9OMTYoKHVpbnQxNl90KWJsZW4pOwogICAgICAgc3ogPSA0OwogICAgIH0gZWxzZSB7CiAgICAgICBoZWFkZXItPmIxID0gMHg3ZjsKLSAgICAgIGhlYWRlci0+bDY0ID0gV1NfSFRPTjY0KGJsZW4pOworICAgICAgaGVhZGVyLT51LnM2NC5sNjQgPSBXU19IVE9ONjQoYmxlbik7CiAgICAgICBzeiA9IDEwOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbHRtYWluLnNoIGIvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjgyM2UwLi4wMDAwMDAwCi0tLSBhL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY4NjMgKzAsMCBAQAotIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gY29uZmlndXJlLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLWJhc2VuYW1lPSJzLF4uKi8sLGciCi0KLSMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAotIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKLSMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCi0jIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKLSMgZnVuY3Rpb24uCi1wcm9ncGF0aD0iJDAiCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgotcHJvZ25hbWU9YGVjaG8gIiRwcm9ncGF0aCIgfCAkU0VEICRiYXNlbmFtZWAKLW1vZGVuYW1lPSIkcHJvZ25hbWUiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLUVYSVRfU1VDQ0VTUz0wCi1FWElUX0ZBSUxVUkU9MQotCi1QUk9HUkFNPWx0bWFpbi5zaAotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuNS4yMgotVElNRVNUQU1QPSIgKDEuMTIyMC4yLjM2NSAyMDA1LzEyLzE4IDIyOjE0OjA2KSIKLQotIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgotIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZmkKLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgJEVYSVRfU1VDQ0VTUwotZmkKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCi0jIHRlc3QgRUJDRElDIG9yIEFTQ0lJCi1jYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCi0gQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KLSAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCi0gIFNQMk5MPSd0ciBcMDQwIFwwMTInCi0gIE5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKLSAgOzsKLSAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KLSAgU1AyTkw9J3RyIFwxMDAgXG4nCi0gIE5MMlNQPSd0ciBcclxuIFwxMDBcMTAwJwotICA7OwotZXNhYwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xDX0FMTD0iJExDX0FMTCI7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMCi1maQotaWYgdGVzdCAiJHtMQU5HK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTEFORz0iJExBTkciOyBMQU5HPUM7IGV4cG9ydCBMQU5HCi1maQotCi0jIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAotbHRfbmw9JwotJwotSUZTPSIgCSRsdF9ubCIKLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKLSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotZHVwbGljYXRlX2RlcHM9bm8KLXByZXNlcnZlX2FyZ3M9Ci1sbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCi1vMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnM6Ci0jIFRoaXMgc2VlbXMgdG8gYmUgdGhlIGJlc3QgcGxhY2UgZm9yIHRoZW0KLQotIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQotIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZwotIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgotIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCi1mdW5jX21rdGVtcGRpciAoKQotewotICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKLQotICAgIGlmIHRlc3QgIiRydW4iID0gIjoiOyB0aGVuCi0gICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQotICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKLSAgICBlbHNlCi0KLSAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKLSAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCi0KLSAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KLQkjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKLQlteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSR7UkFORE9NLTB9JCQiCi0KLQlzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCi0JdW1hc2sgMDA3NwotCSRta2RpciAiJG15X3RtcGRpciIKLQl1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQotICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgewotICAgICAgICAkZWNobyAiY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJG15X3RtcGRpciciIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIH0KLSAgICBmaQotCi0gICAgJGVjaG8gIlgkbXlfdG1wZGlyIiB8ICRYc2VkCi19Ci0KLQotIyBmdW5jX3dpbjMyX2xpYmlkIGFyZwotIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCi0jCi0jIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKLSMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50Ci0jIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KLWZ1bmNfd2luMzJfbGliaWQgKCkKLXsKLSAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKLSAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKLSAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgotICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKLSAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCi0gICAgOzsKLSAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYwotICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwgXAotICAgICAgJEVHUkVQIC1lICdmaWxlIGZvcm1hdCBwZS1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nID4vZGV2L251bGwgOyB0aGVuCi0gICAgICB3aW4zMl9ubXJlcz1gZXZhbCAkTk0gLWYgcG9zaXggLUEgJDEgfCBcCi0JJFNFRCAtbiAtZSAnMSwxMDB7LyBJIC97cywuKixpbXBvcnQsO3A7cTt9O30nYAotICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KLSAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKLSAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICAgIDs7Ci0gICpETEwqKQotICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgOzsKLSAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCi0gICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgotICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKLSAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gICRlY2hvICR3aW4zMl9saWJpZF90eXBlCi19Ci0KLQotIyBmdW5jX2luZmVyX3RhZyBhcmcKLSMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAotIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KLSMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKLSMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgotIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKLWZ1bmNfaW5mZXJfdGFnICgpCi17Ci0gICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIENDX3F1b3RlZD0KLSAgICAgIGZvciBhcmcgaW4gJENDOyBkbwotCWNhc2UgJGFyZyBpbgotCSAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCi0gICAgICBkb25lCi0gICAgICBjYXNlICRAIGluCi0gICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAotICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCi0gICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikgOzsKLSAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCi0gICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCi0gICAgICAqKQotCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KLQkgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgotCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgotCSAgICBDQ19xdW90ZWQ9Ci0JICAgIGZvciBhcmcgaW4gJENDOyBkbwotCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgIGNhc2UgJGFyZyBpbgotCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICAgIGFyZz0iXCIkYXJnXCIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKLQkgIGRvbmUKLQkgICAgY2FzZSAiJEAgIiBpbgotCSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKQotCSAgICAgICMgVGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUgY29tbWFuZCBtYXRjaGVzCi0JICAgICAgIyB0aGUgb25lIGluIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbi4KLQkgICAgICAjIEFzc3VtZSB0aGlzIGlzIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbiB3ZSB3YW50LgotCSAgICAgIHRhZ25hbWU9JHoKLQkgICAgICBicmVhawotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JZG9uZQotCSMgSWYgJHRhZ25hbWUgc3RpbGwgaXNuJ3Qgc2V0LCB0aGVuIG5vIHRhZ2dlZCBjb25maWd1cmF0aW9uCi0JIyB3YXMgZm91bmQgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdGhlICItLXRhZyIgY29tbWFuZAotCSMgbGluZSBvcHRpb24gbXVzdCBiZSB1c2VkLgotCWlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgotCSAgJGVjaG8gIiRtb2RlbmFtZTogc3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi19Ci0KLQotIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCi1mdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQotewotICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0Ci0gICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgotCi0gICAgJHNob3cgIihjZCAkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggJGZfZXhfYW5fYXJfb2xkbGliKSIKLSAgICAkcnVuIGV2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwkZl9leF9hbl9hcl9vbGRsaWIpIiB8fCBleGl0ICQ/Ci0gICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgOgotICAgIGVsc2UKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IEVSUk9SOiBvYmplY3QgbmFtZSBjb25mbGljdHM6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi19Ci0KLSMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCi1mdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKLXsKLSAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKLSAgICBteV9vbGRsaWJzPSR7MSsiJEAifQotICAgIG15X29sZG9ianM9IiIKLSAgICBteV94bGliPSIiCi0gICAgbXlfeGFicz0iIgotICAgIG15X3hkaXI9IiIKLSAgICBteV9zdGF0dXM9IiIKLQotICAgICRzaG93ICIke3JtfXIgJG15X2dlbnRvcCIKLSAgICAkcnVuICR7cm19ciAiJG15X2dlbnRvcCIKLSAgICAkc2hvdyAiJG1rZGlyICRteV9nZW50b3AiCi0gICAgJHJ1biAkbWtkaXIgIiRteV9nZW50b3AiCi0gICAgbXlfc3RhdHVzPSQ/Ci0gICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfZ2VudG9wIjsgdGhlbgotICAgICAgZXhpdCAkbXlfc3RhdHVzCi0gICAgZmkKLQotICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbwotICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotICAgICAgY2FzZSAkbXlfeGxpYiBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7Ci0JKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7Ci0gICAgICBlc2FjCi0gICAgICBteV94bGliPWAkZWNobyAiWCRteV94bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliIgotCi0gICAgICAkc2hvdyAiJHtybX1yICRteV94ZGlyIgotICAgICAgJHJ1biAke3JtfXIgIiRteV94ZGlyIgotICAgICAgJHNob3cgIiRta2RpciAkbXlfeGRpciIKLSAgICAgICRydW4gJG1rZGlyICIkbXlfeGRpciIKLSAgICAgIGV4aXRfc3RhdHVzPSQ/Ci0gICAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X3hkaXIiOyB0aGVuCi0JZXhpdCAkZXhpdF9zdGF0dXMKLSAgICAgIGZpCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLWRhcndpbiopCi0JJHNob3cgIkV4dHJhY3RpbmcgJG15X3hhYnMiCi0JIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCi0JaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAotCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPwotCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKLQkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKLQkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YCRlY2hvICJYJGRhcndpbl9hcmNoaXZlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkYXJ3aW5fYXJjaGVzPWBsaXBvIC1pbmZvICIkZGFyd2luX2FyY2hpdmUiIDI+L2Rldi9udWxsIHwgJEVHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGxgCi0JICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4gCi0JICAgIGRhcndpbl9hcmNoZXM9YGVjaG8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAotCSAgICBkYXJ3aW5fYXJjaD0KLQkgICAgJHNob3cgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgotCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KLQkgICAgICBta2RpciAtcCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICBsaXBvIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKLQkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgotCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKLQkgICAgICAkcm0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCi0gICAgICAjIyBPa2F5IG5vdyB3ZSBoYXZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQotCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnR8IHhhcmdzIGJhc2VuYW1lIHwgc29ydCAtdSB8ICROTDJTUGAKLQkgICAgZGFyd2luX2ZpbGU9Ci0JICAgIGRhcndpbl9maWxlcz0KLQkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCi0JICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCAkTkwyU1BgCi0JICAgICAgbGlwbyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcwotCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAotCSAgICAke3JtfXIgdW5mYXQtJCQKLQkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCi0JICBlbHNlCi0JICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgotIAkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCi0JICBmaSAjICRkYXJ3aW5fYXJjaGVzCi0JZmkgIyAkcnVuCi0JOzsKLSAgICAgICopCi0gICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLSAgICBkb25lCi0gICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCi19Ci0jIEVuZCBvZiBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9ucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERhcndpbiBzdWNrcwotZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKLQotZGlzYWJsZV9saWJzPW5vCi0KLSMgUGFyc2Ugb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuCi13aGlsZSB0ZXN0ICIkIyIgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYXJnIGluCi0gIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGNhc2UgJHByZXYgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJGFyZyIKLSAgICAgIDs7Ci0gICAgdGFnKQotICAgICAgdGFnbmFtZT0iJGFyZyIKLSAgICAgIHByZXNlcnZlX2FyZ3M9IiR7cHJlc2VydmVfYXJnc309JGFyZyIKLQotICAgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICAqWyEtX0EtWmEtejAtOSwvXSopCi0JJGVjaG8gIiRwcm9nbmFtZTogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICBDQykKLQkjIERvbid0IHRlc3QgZm9yIHRoZSAiZGVmYXVsdCIgQyB0YWcsIGFzIHdlIGtub3csIGl0J3MgdGhlcmUsIGJ1dAotCSMgbm90IHNwZWNpYWxseSBtYXJrZWQuCi0JOzsKLSAgICAgICopCi0JaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCi0JICB0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKLQkgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCi0JICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvcCcgPCAkcHJvZ3BhdGhgIgotCWVsc2UKLQkgICRlY2hvICIkcHJvZ25hbWU6IGlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIiAxPiYyCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAiJHByZXY9XCRhcmciCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIHByZXY9Ci0gICAgcHJldm9wdD0KLSAgICBjb250aW51ZQotICBmaQotCi0gICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KLSAgY2FzZSAkYXJnIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgJGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKLSAgICAkZWNobwotICAgICRlY2hvICJDb3B5cmlnaHQgKEMpIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiIKLSAgICAkZWNobyAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8iCi0gICAgJGVjaG8gIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLSAgICBleGl0ICQ/Ci0gICAgOzsKLQotICAtLWNvbmZpZykKLSAgICAke1NFRH0gLWUgJzEsL14jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jICMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkcHJvZ3BhdGgKLSAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgotICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbwotICAgICAgJHtTRUR9IC1uIC1lICIvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC9wIiA8ICIkcHJvZ3BhdGgiCi0gICAgZG9uZQotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0tZGVidWcpCi0gICAgJGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgotICAgIDs7Ci0KLSAgLS1kcnktcnVuIHwgLW4pCi0gICAgcnVuPToKLSAgICA7OwotCi0gIC0tZmVhdHVyZXMpCi0gICAgJGVjaG8gImhvc3Q6ICRob3N0IgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgJGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICAkZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKLQotICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7Ci0gIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OwotCi0gIC0tcHJlc2VydmUtZHVwLWRlcHMpIGR1cGxpY2F0ZV9kZXBzPSJ5ZXMiIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRhcmciCi0gICAgOzsKLQotICAtLXRhZykKLSAgICBwcmV2b3B0PSItLXRhZyIKLSAgICBwcmV2PXRhZwotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzIC0tdGFnIgotICAgIDs7Ci0gIC0tdGFnPSopCi0gICAgc2V0IHRhZyAiJG9wdGFyZyIgJHsxKyIkQCJ9Ci0gICAgc2hpZnQKLSAgICBwcmV2PXRhZwotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzIC0tdGFnIgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLWNhc2UgJGRpc2FibGVfbGlicyBpbgotbm8pIAotICA7Owotc2hhcmVkKQotICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0gIDs7Ci1zdGF0aWMpCi0gIGJ1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAotICA7OwotZXNhYwotCi0jIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKLSMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZwotIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgotZXhlY19jbWQ9Ci0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgICRlY2hvICIqKiogV2FybmluZzogaW5mZXJyaW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBpcyBkZXByZWNhdGVkLiIgMT4mMgotICAgICRlY2hvICIqKiogRnV0dXJlIHZlcnNpb25zIG9mIExpYnRvb2wgd2lsbCByZXF1aXJlIC0tbW9kZT1NT0RFIGJlIHNwZWNpZmllZC4iIDE+JjIKLSAgICBjYXNlICRub25vcHQgaW4KLSAgICAqY2MgfCBjYyogfCAqKysgfCBnY2MqIHwgKi1nY2MqIHwgZysrKiB8IHhsYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0JY2FzZSAkYXJnIGluCi0JLWMpCi0JICAgbW9kZT1jb21waWxlCi0JICAgYnJlYWsKLQkgICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgKmRiIHwgKmRieCB8ICpzdHJhY2UgfCAqdHJ1c3MpCi0gICAgICBtb2RlPWV4ZWN1dGUKLSAgICAgIDs7Ci0gICAgKmluc3RhbGwqfGNwfG12KQotICAgICAgbW9kZT1pbnN0YWxsCi0gICAgICA7OwotICAgICpybSkKLSAgICAgIG1vZGU9dW5pbnN0YWxsCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgotICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCi0KLSAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KLSAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLQotICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCi0gIGdlbmVyaWNfaGVscD0iJGhlbHAiCi0gIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCi0gIGNhc2UgJG1vZGUgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgotICAgIHN1cHByZXNzX29wdD15ZXMKLSAgICBzdXBwcmVzc19vdXRwdXQ9Ci0gICAgYXJnX21vZGU9bm9ybWFsCi0gICAgbGlib2JqPQotICAgIGxhdGVyPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmdfbW9kZSBpbgotICAgICAgYXJnICApCi0JIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQotCWxhc3Rhcmc9IiRhcmciCi0JYXJnX21vZGU9bm9ybWFsCi0JOzsKLQotICAgICAgdGFyZ2V0ICkKLQlsaWJvYmo9IiRhcmciCi0JYXJnX21vZGU9bm9ybWFsCi0JY29udGludWUKLQk7OwotCi0gICAgICBub3JtYWwgKQotCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLQljYXNlICRhcmcgaW4KLQktbykKLQkgIGlmIHRlc3QgLW4gIiRsaWJvYmoiIDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgYXJnX21vZGU9dGFyZ2V0Ci0JICBjb250aW51ZQotCSAgOzsKLQotCS1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKLQkgIGxhdGVyPSIkbGF0ZXIgJGFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLW5vLXN1cHByZXNzKQotCSAgc3VwcHJlc3Nfb3B0PW5vCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1YY29tcGlsZXIpCi0JICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0Ci0JICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgotCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KLQotCS1XYywqKQotCSAgYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14tV2MsLy8iYAotCSAgbGFzdGFyZz0KLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotIAkgIGZvciBhcmcgaW4gJGFyZ3M7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCi0JICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKLQkgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLQkgICAgY2FzZSAkYXJnIGluCi0JICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgICAgYXJnPSJcIiRhcmdcIiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRhcmciCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCi0KLQkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgotCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQkqICkKLQkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KLQkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgotCSAgIwotCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0JICBzcmNmaWxlPSIkYXJnIgotCSAgOzsKLQllc2FjICAjICBjYXNlICRhcmcKLQk7OwotICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgIGNhc2UgJGxhc3RhcmcgaW4KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0gICAgICAjIGluIHNjYW4gc2V0cywgYW5kIHNvbWUgU3VuT1Mga3NoIG1pc3RyZWF0IGJhY2tzbGFzaC1lc2NhcGluZwotICAgICAgIyBpbiBzY2FuIHNldHMgKHdvcmtlZCBhcm91bmQgd2l0aCB2YXJpYWJsZSBleHBhbnNpb24pLAotICAgICAgIyBhbmQgZnVydGhlcm1vcmUgY2Fubm90IGhhbmRsZSAnfCcgJyYnICcoJyAnKScgaW4gc2NhbiBzZXRzIAotICAgICAgIyBhdCBhbGwsIHNvIHdlIHNwZWNpZnkgdGhlbSBzZXBhcmF0ZWx5LgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICBkb25lICMgZm9yIGFyZwotCi0gICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICBhcmcpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGFyZ3VtZW50IGZvciAtWGNvbXBpbGUiCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgdGFyZ2V0KQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICAgIFsgLXogIiRsaWJvYmoiIF0gJiYgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNpZm1zb10nCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5hZGEpIHhmb3JtPWFkYSA7OwotICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKLSAgICAqLmFkcykgeGZvcm09YWRzIDs7Ci0gICAgKi5hc20pIHhmb3JtPWFzbSA7OwotICAgICouYysrKSB4Zm9ybT1jKysgOzsKLSAgICAqLmNjKSB4Zm9ybT1jYyA7OwotICAgICouaWkpIHhmb3JtPWlpIDs7Ci0gICAgKi5jbGFzcykgeGZvcm09Y2xhc3MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgKi5qYXZhKSB4Zm9ybT1qYXZhIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKLQotICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1waWMpCi0JcGljX21vZGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLW5vbi1waWMpCi0JcGljX21vZGU9bm8KLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgcWxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICRxbGlib2JqIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlxbGlib2JqPSJcIiRxbGlib2JqXCIiIDs7Ci0gICAgZXNhYwotICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRxbGlib2JqIiBcCi0JJiYgJGVjaG8gIlgkbGlib2JqIiB8IGdyZXAgJ1tdfiNeKnt9Ozw+PyInIiciJyAJJigpfGAkW10nIFwKLQkmJiAkZWNobyAiJG1vZGVuYW1lOiBsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgotICAgIG9iam5hbWU9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRvYmoiOyB0aGVuCi0gICAgICB4ZGlyPQotICAgIGVsc2UKLSAgICAgIHhkaXI9JHhkaXIvCi0gICAgZmkKLSAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCi0KLSAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCi0gICAgZWxzZQotICAgICAgcmVtb3ZlbGlzdD0iJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0gICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLSAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgIGZpCi0KLSAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcwotICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYwotICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KLSAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9Ci0gICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKLSAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotICAgIGVsc2UKLSAgICAgIG91dHB1dF9vYmo9Ci0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCAkcnVuIGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JJGVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0gICAgcXNyY2ZpbGU9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJHFzcmNmaWxlIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLSAgICAgIHFzcmNmaWxlPSJcIiRxc3JjZmlsZVwiIiA7OwotICAgIGVzYWMKLQotICAgICRydW4gJHJtICIkbGlib2JqIiAiJHtsaWJvYmp9VCIKLQotICAgICMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCi0gICAgIyBidXQgZG9uJ3QgY3JlYXRlIGl0IGlmIHdlJ3JlIGRvaW5nIGEgZHJ5IHJ1bi4KLSAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPiAke2xpYm9ian1UIDw8RU9GCi0jICRsaWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCi0jIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KLQotIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgotRU9GCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZWxzZQotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCi0JJHNob3cgIiRta2RpciAke3hkaXJ9JG9iamRpciIKLQkkcnVuICRta2RpciAke3hkaXJ9JG9iamRpcgotCWV4aXRfc3RhdHVzPSQ/Ci0JaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgotCSAgZXhpdCAkZXhpdF9zdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCi0JIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJGxvYmoiCi0gICAgICBmaQotCi0gICAgICAkcnVuICRybSAiJGxvYmoiICIkb3V0cHV0X29iaiIKLQotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIFBJQyBvYmplY3QgdG8gdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotcGljX29iamVjdD0nJG9iamRpci8kb2JqbmFtZScKLQotRU9GCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCi0gICAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgIyBObyBQSUMgb2JqZWN0IHNvIGluZGljYXRlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGxpYnRvb2wKLSAgICAgICMgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotcGljX29iamVjdD1ub25lCi0KLUVPRgotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCi0gICAgICBlbHNlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgJHJ1biAkcm0gIiRvYmoiICIkb3V0cHV0X29iaiIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCi0gICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KLW5vbl9waWNfb2JqZWN0PSckb2JqbmFtZScKLQotRU9GCi0gICAgZWxzZQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KLW5vbl9waWNfb2JqZWN0PW5vbmUKLQotRU9GCi0gICAgZmkKLQotICAgICRydW4gJG12ICIke2xpYm9ian1UIiAiJHtsaWJvYmp9IgotCi0gICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAgICAgJHJ1biAkcm0gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgbGluayBtb2RlCi0gIGxpbmsgfCByZWxpbmspCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKLSAgICBjYXNlICRob3N0IGluCi0gICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0gICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCi0gICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0Ci0gICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCi0gICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KLSAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCi0KLSAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZwotICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKLSAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5Ci0gICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KLSAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgICA7OwotICAgICopCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBsaWJ0b29sX2FyZ3M9IiRub25vcHQiCi0gICAgYmFzZV9jb21waWxlPSIkbm9ub3B0ICRAIgotICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgb2xkX2RlcGxpYnM9Ci0gICAgY29tcGlsZXJfZmxhZ3M9Ci0gICAgbGlua2VyX2ZsYWdzPQotICAgIGRsbHNlYXJjaHBhdGg9Ci0gICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCi0gICAgaW5zdF9wcmVmaXhfZGlyPQotCi0gICAgYXZvaWRfdmVyc2lvbj1ubwotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBkbHNlbGY9bm8KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGV4cG9ydF9zeW1ib2xzPQotICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQotICAgIGdlbmVyYXRlZD0KLSAgICBsaWJvYmpzPQotICAgIGx0bGlicz0KLSAgICBtb2R1bGU9bm8KLSAgICBub19pbnN0YWxsPW5vCi0gICAgb2Jqcz0KLSAgICBub25fcGljX29iamVjdHM9Ci0gICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9Ci0gICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCi0gICAgcHJlbG9hZD1ubwotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHhycGF0aD0KLSAgICBwZXJtX3JwYXRoPQotICAgIHRlbXBfcnBhdGg9Ci0gICAgdGhyZWFkX3NhZmU9bm8KLSAgICB2aW5mbz0KLSAgICB2aW5mb19udW1iZXI9bm8KLQotICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQllbHNlCi0JICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0Ci0JZmkKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlxYXJnPVwiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgXCIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0JOzsKLSAgICAgICopIHFhcmc9JGFyZyA7OwotICAgICAgZXNhYwotICAgICAgbGlidG9vbF9hcmdzPSIkbGlidG9vbF9hcmdzICRxYXJnIgotCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCWNhc2UgJHByZXYgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcHJldiBpbgotCWRsZmlsZXN8ZGxwcmVmaWxlcykKLQkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgcHJlbG9hZD15ZXMKLQkgIGZpCi0JICBjYXNlICRhcmcgaW4KLQkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0JICBmb3JjZSkKLQkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgc2VsZikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbHNlCi0JICAgICAgZGxzZWxmPW5lZWRsZXNzCi0JICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgICAgZWxzZQotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWV4cHN5bXMpCi0JICBleHBvcnRfc3ltYm9scz0iJGFyZyIKLQkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWV4cHN5bXNfcmVnZXgpCi0JICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlpbnN0X3ByZWZpeCkKLQkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlwcmVjaW91c19yZWdleCkKLQkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJlbGVhc2UpCi0JICByZWxlYXNlPSItJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlvYmplY3RsaXN0KQotCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KLQkgICAgc2F2ZV9hcmc9JGFyZwotCSAgICBtb3JlYXJncz0KLQkgICAgZm9yIGZpbCBpbiBgY2F0ICRzYXZlX2FyZ2AKLQkgICAgZG8KLSMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgotCSAgICAgIGFyZz0kZmlsCi0JICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JICAgICAgaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlwaWNfb2JqZWN0PQotCQlub25fcGljX29iamVjdD0KLQotCQkjIFJlYWQgdGhlIC5sbyBmaWxlCi0JCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCQljYXNlICRhcmcgaW4KLQkJKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JCSopIC4gLi8kYXJnIDs7Ci0JCWVzYWMKLQotCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAotCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8Ci0JCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAotCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWZpCi0KLQkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkJeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JCSAgeGRpcj0KLQkJZWxzZQotCQkgIHhkaXI9IiR4ZGlyLyIKLQkJZmkKLQotCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKLQotCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KLQkJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCi0JCSAgICAgIHByZXY9Ci0JCSAgICAgIGNvbnRpbnVlCi0JCSAgICBlbHNlCi0JCSAgICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JCSAgICAgIHByZXY9ZGxwcmVmaWxlcwotCQkgICAgZmkKLQkJICBmaQotCi0JCSAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKLQkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JCSAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKLQkJICAgIHByZXY9Ci0JCSAgZmkKLQotCQkgICMgQSBQSUMgb2JqZWN0LgotCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCQkgIGFyZz0iJHBpY19vYmplY3QiCi0JCWZpCi0KLQkJIyBOb24tUElDIG9iamVjdC4KLQkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCi0JCSAgZmkKLQkJZWxzZQotCQkgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KLQkJICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCi0JCSAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgotCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JCWZpCi0JICAgICAgZWxzZQotCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkJaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWVsc2UKLQkJICAjIERyeS1ydW4gY2FzZS4KLQotCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkJICAgIHhkaXI9Ci0JCSAgZWxzZQotCQkgICAgeGRpcj0iJHhkaXIvIgotCQkgIGZpCi0KLQkJICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JCSAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaW5rIGlucHV0IGZpbGUgXGAkc2F2ZV9hcmcnIGRvZXMgbm90IGV4aXN0IgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBhcmc9JHNhdmVfYXJnCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGggfCB4cnBhdGgpCi0JICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkgIGNhc2UgJGFyZyBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXhjb21waWxlcikKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQl4bGlua2VyKQotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkcWFyZyIKLQkgIHByZXY9Ci0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHdsJHFhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkd2wkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXhjY2xpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQlzaHJleHQpCi0gIAkgIHNocmV4dF9jbWRzPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWRhcndpbl9mcmFtZXdvcmt8ZGFyd2luX2ZyYW1ld29ya19za2lwKQotCSAgdGVzdCAiJHByZXYiID0gImRhcndpbl9mcmFtZXdvcmsiICYmIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQkqKQotCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMKLSAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCi0KLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWFsbC1zdGF0aWMpCi0JaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWFsbG93LXVuZGVmaW5lZCkKLQkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlleHBvcnRfZHluYW1pYz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgotCSAgcHJldj1leHBzeW1zCi0JZWxzZQotCSAgcHJldj1leHBzeW1zX3JlZ2V4Ci0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1mcmFtZXdvcmt8LWFyY2h8LWlzeXNyb290KQotCWNhc2UgIiAkQ0MgIiBpbgotCSAgKiIgJHthcmd9ICR7MX0gIiogfCAqIiAke2FyZ30JJHsxfSAiKikgCi0JCXByZXY9ZGFyd2luX2ZyYW1ld29ya19za2lwIDs7Ci0JICAqKSBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JICAgICBwcmV2PWRhcndpbl9mcmFtZXdvcmsgOzsKLQllc2FjCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1pbnN0LXByZWZpeC1kaXIpCi0JcHJldj1pbnN0X3ByZWZpeAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgotICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAotICAgICAgLUxbQS1aXVtBLVpdKjoqKQotCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCi0Jbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLUwqKQotCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCSAgICBhYnNkaXI9IiRkaXIiCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkZGlyIgotCSAgZmkKLQkgIGRpcj0iJGFic2RpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiRkZXBsaWJzICIgaW4KLQkqIiAtTCRkaXIgIiopIDs7Ci0JKikKLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKLQkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgdGVzdGJpbmRpcj1gJGVjaG8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW9zMiopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQotCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCi0JICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjCi0JZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgotCSBjYXNlICRob3N0IGluCi0JICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KLQkgICBjb250aW51ZQotCSAgIDs7Ci0JIGVzYWMKLQlmaQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCi0gICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCi0gICAgICAtbW9kZWwpCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JcHJldj14Y29tcGlsZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSkKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1tb2R1bGUpCi0JbW9kdWxlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyAtNjQsIC1taXBzWzAtOV0gZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXJbMC05XVswLTldKiBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU3VuIGNvbXBpbGVyCi0gICAgICAjICtEQSosICtERCogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBIUCBjb21waWxlcgotICAgICAgIyAtcSogcGFzcyB0aHJvdWdoIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKLSAgICAgICMgLW0qIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29tcGlsZXIgYXJncyBmb3IgR0NDCi0gICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKLSAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCi0gICAgICAjIC1wZyBwYXNzIHRocm91Z2ggcHJvZmlsaW5nIGZsYWcgZm9yIEdDQwotICAgICAgIyBAZmlsZSBHQ0MgcmVzcG9uc2UgZmlsZXMKLSAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwtcGd8IFwKLSAgICAgIC10WzQ1XSp8LXR4c2NhbGUqfEAqKQotCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1zaHJleHQpCi0JcHJldj1zaHJleHQKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1mYXN0LWluc3RhbGwpCi0JZmFzdF9pbnN0YWxsPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8taW5zdGFsbCkKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0JICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKLQkgICMgaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiIDE+JjIKLQkgIGZhc3RfaW5zdGFsbD1ubwotCSAgOzsKLQkqKSBub19pbnN0YWxsPXllcyA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtb2JqZWN0bGlzdCkKLQlwcmV2PW9iamVjdGxpc3QKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCi0JcHJldj1wcmVjaW91c19yZWdleAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQljYXNlICIkeHJwYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KLQkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKLQkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCi0JIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0Ci0JIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC12ZXJzaW9uLW51bWJlcikKLQlwcmV2PXZpbmZvCi0JdmluZm9fbnVtYmVyPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVdjLCopCi0JYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdjLC8vJ2AKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGNhc2UgJGZsYWcgaW4KLQkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgIGZsYWc9IlwiJGZsYWdcIiIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZsYWciCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCTs7Ci0KLSAgICAgIC1XbCwqKQotCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XbCwvLydgCi0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBjYXNlICRmbGFnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBmbGFnPSJcIiRmbGFnXCIiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBhcmc9IiRhcmcgJHdsJGZsYWciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmbGFnIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQk7OwotCi0gICAgICAtWGNvbXBpbGVyKQotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWGxpbmtlcikKLQlwcmV2PXhsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1YQ0NsaW5rZXIpCi0JcHJldj14Y2NsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAqLiRvYmpleHQpCi0JIyBBIHN0YW5kYXJkIG9iamVjdC4KLQlvYmpzPSIkb2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgcGljX29iamVjdD0KLQkgIG5vbl9waWNfb2JqZWN0PQotCi0JICAjIFJlYWQgdGhlIC5sbyBmaWxlCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJGFyZyBpbgotCSAgKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JICAqKSAuIC4vJGFyZyA7OwotCSAgZXNhYwotCi0JICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAotCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJiBcCi0JICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0KLQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JICAgIHhkaXI9Ci0gCSAgZWxzZQotCSAgICB4ZGlyPSIkeGRpci8iCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQlwcmV2PQotCQljb250aW51ZQotCSAgICAgIGVsc2UKLQkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJcHJldj1kbHByZWZpbGVzCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCSAgICAgIHByZXY9Ci0JICAgIGZpCi0KLQkgICAgIyBBIFBJQyBvYmplY3QuCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCSAgICBhcmc9IiRwaWNfb2JqZWN0IgotCSAgZmkKLQotCSAgIyBOb24tUElDIG9iamVjdC4KLQkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0Ci0JICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCi0JICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgotCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQllbHNlCi0JICAjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBlbHNlCi0JICAgICMgRHJ5LXJ1biBjYXNlLgotCi0JICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICAgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICAgIHhkaXI9Ci0JICAgIGVsc2UKLQkgICAgICB4ZGlyPSIkeGRpci8iCi0JICAgIGZpCi0KLQkgICAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgICBub25fcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICouJGxpYmV4dCkKLQkjIEFuIGFyY2hpdmUuCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQlvbGRfZGVwbGlicz0iJG9sZF9kZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KLQotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIHByZXY9Ci0JZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgotICAgICAgKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYyAjIGFyZwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCi0gICAgZWxzZQotICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9Ci0gICAgZmkKLSAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKLSAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCi0KLSAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotICAgICAgb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgIGZpCi0gICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCi0gICAgaWYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KLSAgICAgICRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0gICAgICAkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgotICAgICAgZXhpdF9zdGF0dXM9JD8KLSAgICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KLQlleGl0ICRleGl0X3N0YXR1cwotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0Ci0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgIiIpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OwotICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OwotICAgICoubGEpIGxpbmttb2RlPWxpYiA7OwotICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgZXNhYwotCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpwdzMyKikKLSAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCi0gICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9eWVzCi0gICAgICA7OwotICAgICopCi0gICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JGR1cGxpY2F0ZV9kZXBzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBzcGVjaWFsZGVwbGlicz0KLQotICAgIGxpYnM9Ci0gICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCi0gICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCi0gICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KLSAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCWNhc2UgIiRsaWJzICIgaW4KLQkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCi0KLSAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCi0gICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCi0gICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JZm9yIHByZV9wb3N0X2RlcCBpbiAkcHJlZGVwcyAkcG9zdGRlcHM7IGRvCi0JICBjYXNlICIkcHJlX3Bvc3RfZGVwcyAiIGluCi0JICAqIiAkcHJlX3Bvc3RfZGVwICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRwcmVfcG9zdF9kZXBzIiA7OwotCSAgZXNhYwotCSAgcHJlX3Bvc3RfZGVwcz0iJHByZV9wb3N0X2RlcHMgJHByZV9wb3N0X2RlcCIKLQlkb25lCi0gICAgICBmaQotICAgICAgcHJlX3Bvc3RfZGVwcz0KLSAgICBmaQotCi0gICAgZGVwbGlicz0KLSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0gICAgbmV3bGliX3NlYXJjaF9wYXRoPQotICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBsaWIpCi0JcGFzc2VzPSJjb252IGxpbmsiCi0JZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmxhKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgIHByb2cpCi0JY29tcGlsZV9kZXBsaWJzPQotCWZpbmFsaXplX2RlcGxpYnM9Ci0JYWxsZGVwbGlicz1ubwotCW5ld2RsZmlsZXM9Ci0JbmV3ZGxwcmVmaWxlcz0KLQlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCi0JOzsKLSAgICAqKSAgcGFzc2VzPSJjb252IgotCTs7Ci0gICAgZXNhYwotICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KLQlsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JY2FzZSAkcGFzcyBpbgotCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7Ci0JZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKLQlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcwotCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCi0JZGVwbGlicz0KLSAgICAgIGZpCi0gICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbwotCWxpYj0KLQlmb3VuZD1ubwotCWNhc2UgJGRlcGxpYiBpbgotCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCi0JICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYiIKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQktbCopCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCi0JICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCi0JICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQotCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKLQkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgotCQkgIGZvdW5kPXllcwotCQllbHNlCi0JCSAgZm91bmQ9bm8KLQkJZmkKLQkJYnJlYWsgMgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGRvbmUKLQkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCi0JICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQotCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKLQkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KLQkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopCi0JCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwKLSAgICAgICAgICAgICAgICAgICAgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJICBsaWJyYXJ5X25hbWVzPQotCQkgIG9sZF9saWJyYXJ5PQotCQkgIGNhc2UgJGxpYiBpbgotCQkgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCQkgICopIC4gLi8kbGliIDs7Ci0JCSAgZXNhYwotCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkJICAgIGxsPSIkbCIKLQkJICBkb25lCi0JCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKLQkJICAgIGZvdW5kPW5vCi0JCSAgICBsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCSAgICB0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCi0JCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQotCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCQkgICAgZWxzZQotCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCQkgICAgZmkKLQkJICAgIGNvbnRpbnVlCi0JCSAgZmkKLQkJZmkKLQkgICAgICAgIDs7Ci0JICAgICAgKikgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBmaQotCSAgOzsgIyAtbAotCS1MKikKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICBjb250aW51ZQotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGZpCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JICAgIDs7Ci0JICAqKQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCi0JICAgIDs7Ci0JICBlc2FjICMgbGlua21vZGUKLQkgIGNvbnRpbnVlCi0JICA7OyAjIC1MCi0JLVIqKQotCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgotCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBjb250aW51ZQotCSAgOzsKLQkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7Ci0JKi4kbGliZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIHZhbGlkX2FfbGliPW5vCi0JICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JICAgICAgbWF0Y2hfcGF0dGVybiopCi0JCXNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgICAgICAgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKLQkJaWYgZXZhbCAkZWNobyBcIiRkZXBsaWJcIiAyPi9kZXYvbnVsbCBcCi0JCSAgICB8ICRTRUQgMTBxIFwKLQkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICB2YWxpZF9hX2xpYj15ZXMKLQkJZmkKLQkJOzsKLQkgICAgICBwYXNzX2FsbCkKLQkJdmFsaWRfYV9saWI9eWVzCi0JCTs7Ci0gICAgICAgICAgICBlc2FjCi0JICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgotCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgotCSAgICAgICRlY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlZCBoZXJlLiIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgotCSAgICAgICRlY2hvICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICA7OyAjICouJGxpYmV4dAotCSoubG8gfCAqLiRvYmpleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKLQkgICAgZmkKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQklREVQTElCUyUpCi0JICBhbGxkZXBsaWJzPXllcwotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYyAjIGNhc2UgJGRlcGxpYgotCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKLQotCWRsbmFtZT0KLQlkbG9wZW49Ci0JZGxwcmVvcGVuPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCi0JIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCi0JaW5zdGFsbGVkPXllcwotCXNob3VsZG5vdGxpbms9bm8KLQlhdm9pZHRlbXBycGF0aD0KLQotCi0JIyBSZWFkIHRoZSAubGEgZmlsZQotCWNhc2UgJGxpYiBpbgotCSovKiB8ICpcXCopIC4gJGxpYiA7OwotCSopIC4gLi8kbGliIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKLQkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKLQkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgotCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKLQkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCi0JZmkKLQotCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCi0JICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIGZpCi0JICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIHRtcF9saWJzPQotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLSAgICAgICAgICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgICAgZXNhYwotICAgICAgICAgICAgICBmaQotCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgICAgZG9uZQotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGNvbnYKLQotCi0JIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgotCWxpbmtsaWI9Ci0JZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgbGlua2xpYj0iJGwiCi0JZG9uZQotCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAotCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKLQkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKLQkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKLQkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gZGxvcGVuCi0KLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRsYWRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7Ci0JKikKLQkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAotCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgotCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKLQkgIGZpCi0JICA7OwotCWVzYWMKLQlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgotCSAgICBkaXI9IiRsYWRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgotCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxpYmRpciIKLQkgICAgYWJzZGlyPSIkbGliZGlyIgotCSAgZmkKLQkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCi0JZWxzZQotCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgotCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBmaQotCWZpICMgJGluc3RhbGxlZCA9IHllcwotCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCi0JICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0JICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgotCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCi0JICBlbHNlCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0JICBmaQotCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCi0JICBmaQotCSAgY29udGludWUKLQlmaQotCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKLQkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCi0KLQkgIGxpbmthbGxkZXBsaWJzPW5vCi0JICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgIGxpbmthbGxkZXBsaWJzPXllcwotCSAgZmkKLQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0JICAgIGVzYWMKLQkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPwotCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocwotCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCi0JICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgZG9uZSAjIGZvciBkZXBsaWIKLQkgIGNvbnRpbnVlCi0JZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KLQkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKLQkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCi0JICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgICAqIiAkZGlyICIqKSA7OwotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGFic2RpciIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgotCi0JICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKLQkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8Ci0JICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKLQkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgotCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgY29udGludWUKLQkgIGZpCi0JZmkKLQotCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKLQl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicwotCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXMgOyB0aGVuCi0JICB1c2Vfc3RhdGljX2xpYnM9bm8KLQlmaQotCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgIHsgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCi0JICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgotCSAgICBuZWVkX3JlbGluaz15ZXMKLQkgIGZpCi0JICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQotCi0JICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24KLQkgICMgc29tZSBzeXN0ZW1zIChkYXJ3aW4pCi0JICBpZiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluayA7IHRoZW4KLQkgICAgJGVjaG8KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBmaQotCSAgICAkZWNobyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBmaQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgotCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCi0JICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCi0JICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCSAgICByZWFsbmFtZT0iJDIiCi0JICAgIHNoaWZ0OyBzaGlmdAotCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPwotCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKLQkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICAgICAgIyBibGVoIHdpbmRvd3MKLQkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgKmN5Z3dpbiogfCBtaW5ndyopCi0JCW1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkJdmVyc3VmZml4PSItJG1ham9yIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JICAgIGVsc2UKLQkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKLQkgICAgZmkKLQotCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQotCSAgICBzb3Jvb3Q9IiRzb25hbWUiCi0JICAgIHNvbmFtZT1gJGVjaG8gJHNvcm9vdCB8ICR7U0VEfSAtZSAncy9eLipcLy8vJ2AKLQkgICAgbmV3bGliPSJsaWJpbXAtYCRlY2hvICRzb25hbWUgfCAke1NFRH0gJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgotCi0JICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93Ci0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6Ci0JICAgIGVsc2UKLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgY21kcz0kZXh0cmFjdF9leHBzeW1zX2NtZHMKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQotCSAgICAjIENyZWF0ZSAkbmV3bGliCi0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKLQkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQotCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKLQkgICAgbGlua2xpYj0kbmV3bGliCi0JICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgIGxpYl9saW5rZWQ9eWVzCi0JICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgotCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkJY2FzZSAkaG9zdCBpbgotCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7Ci0JCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCi0JCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1kYXJ3aW4qICkKLQkJICAgICMgaWYgdGhlIGxpYiBpcyBhIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QgbGluayBhZ2FpbnN0Ci0JCSAgICAjIGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBuZXcgd2FybmluZ3MgSSBhZGRlZAotCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8Ci0gICAgICAgICAgICAgICAgICAgICAgJEVHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KLQkJICAgICAgJGVjaG8gIioqIFdhcm5pbmcsIGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCi0JCSAgICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCi0JCSAgICAgICAgJGVjaG8KLQkJICAgICAgICAkZWNobyAiKiogQW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHN0YXRpYyBhcmNoaXZlIGF2YWlsYWJsZSIKLQkJICAgICAgICAkZWNobyAiKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKLQkJICAgICAgZWxzZQotCQkgICAgICAgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCSAgICAgIGZpCi0JCSAgICBmaQotCQllc2FjCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCQljYXNlICRob3N0IGluCi0JCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7Ci0JCWVzYWMKLQkJYWRkX2Rpcj0iLUwkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICByZWxpbmspCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkJYWRkPSIkZGlyLyRsaW5rbGliIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCQkgIGNhc2UgJGxpYmRpciBpbgotCQkgICAgW1xcL10qKQotCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgotCQkgICAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JCWFkZF9zaGxpYnBhdGg9IiRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbHNlCi0JCWxpYl9saW5rZWQ9bm8KLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgICopIGxpYl9saW5rZWQ9bm8gOzsKLQkgICAgZXNhYwotCi0JICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgotCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKLQkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAotCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JCSoiOiRsaWJkaXI6IiopIDs7Ci0JCSopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgotCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgotCSAgICAgICAgYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBlbHNlCi0JICAgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgotCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCQljYXNlICRsaWJkaXIgaW4KLQkJICBbXFwvXSopCi0JCSAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgotCQkgICAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgZmkKLQkgIGZpCi0JZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAotCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCi0JICAjIHNoYXJlZCBwbGF0Zm9ybXMuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBmaQotCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKLQkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLQkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCi0JICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgotCi0JICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KLQkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCi0JICAgICRlY2hvCi0JICAgICRlY2hvICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKLQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgICAkZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgotCSAgICAgICRlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKLQkgICAgICAkZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgotCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JCSRlY2hvCi0JCSRlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkJJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JCSRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JCSRlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JCWJ1aWxkX29sZF9saWJzPXllcwotCSAgICAgIGVsc2UKLQkJYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCi0JICAgIGxpbmtfc3RhdGljPXllcwotCSAgZmkKLQlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PwotCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKLQkgICAgIHsgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8Ci0JICAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgfHwKLQkgICAgICAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IHllczsgfTsgdGhlbgotCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLQkgICAgdGVtcF9kZXBsaWJzPQotCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkbGliZGlyIGluCi0JICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkJICAgY2FzZSAiICR4cnBhdGggIiBpbgotCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7Ci0JCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJICAgZXNhYzs7Ci0JICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgotCSAgZmkKLQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCi0JICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKLQkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcwotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkZGVwbGliIGluCi0JICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OwotCSAgICAgICoubGEpCi0JCWRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCXRlc3QgIlgkZGlyIiA9ICJYJGRlcGxpYiIgJiYgZGlyPSIuIgotCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkJY2FzZSAkZGlyIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OwotCQkqKQotCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCi0JCSAgICBhYnNkaXI9IiRkaXIiCi0JCSAgZmkKLQkJICA7OwotCQllc2FjCi0JCWlmIGdyZXAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KLQkJICBwYXRoPSIkYWJzZGlyLyRvYmpkaXIiCi0JCWVsc2UKLQkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCSAgZmkKLQkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKLQkJICBmaQotCQkgIHBhdGg9IiRhYnNkaXIiCi0JCWZpCi0JCWRlcGRlcGw9Ci0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLWRhcndpbiopCi0JCSAgIyB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnMsCi0JCSAgIyBidXQgbmVlZCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkCi0JCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KLQkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbwotCQkgICAgICBkZXBkZXBsPSR0bXAKLQkJICAgIGRvbmUKLQkJICAgIGlmIHRlc3QgLWYgIiRwYXRoLyRkZXBkZXBsIiA7IHRoZW4KLQkJICAgICAgZGVwZGVwbD0iJHBhdGgvJGRlcGRlcGwiCi0JCSAgICBmaQotCQkgICAgIyBkbyBub3QgYWRkIHBhdGhzIHdoaWNoIGFyZSBhbHJlYWR5IHRoZXJlCi0JCSAgICBjYXNlICIgJG5ld2xpYl9zZWFyY2hfcGF0aCAiIGluCi0JCSAgICAqIiAkcGF0aCAiKikgOzsKLQkJICAgICopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkcGF0aCI7OwotCQkgICAgZXNhYwotCQkgIGZpCi0JCSAgcGF0aD0iIgotCQkgIDs7Ci0JCSopCi0JCSAgcGF0aD0iLUwkcGF0aCIKLQkJICA7OwotCQllc2FjCi0JCTs7Ci0JICAgICAgLWwqKQotCQljYXNlICRob3N0IGluCi0JCSotKi1kYXJ3aW4qKQotCQkgICMgQWdhaW4sIHdlIG9ubHkgd2FudCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcwotCQkgIGV2YWwgdG1wX2xpYnM9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAicyxeXC1sLCwiYAotCQkgIGZvciB0bXAgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aCA7IGRvCi0JCSAgICBpZiB0ZXN0IC1mICIkdG1wL2xpYiR0bXBfbGlicy5keWxpYiIgOyB0aGVuCi0JCSAgICAgIGV2YWwgZGVwZGVwbD0iJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiCi0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgIGRvbmUKLQkJICBwYXRoPSIiCi0JCSAgOzsKLQkJKikgY29udGludWUgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgICopIGNvbnRpbnVlIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAgICAgKiIgJHBhdGggIiopIDs7Ci0JICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGRlcGwgIiopIDs7Ci0JICAgICAgKikgZGVwbGlicz0iJGRlcGRlcGwgJGRlcGxpYnMiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KLQlmaSAjIGxpbmttb2RlID0gbGliCi0gICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicwotICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCi0JIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcwotCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JZG9uZQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KLQlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgotCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgbGliX3NlYXJjaF9wYXRoPQotCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLQlmaQotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgdmFycz0iZGVwbGlicyIKLQllbHNlCi0JICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKLQlmaQotCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgotCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCi0JICBuZXdfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbwotCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbwotCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQotCSAgICAjICAgICAgICBicm9rZW46Ci0JICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCi0JICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgotCSAgICAjIHByYWN0aWNlOgotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JICAgIC1SKikgOzsKLQkgICAgKikKLQkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQotCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgotCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCi0JICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKLQkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCi0JICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCi0JICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAotCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90Ci0JICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQotCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQotCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKLQkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5Ci0JICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKLQkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KLQkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JICAgICAgKikKLQkJY2FzZSAiICRuZXdfbGlicyAiIGluCi0JCSoiICRkZXBsaWIgIiopIDs7Ci0JCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKQotCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIDs7Ci0JICAgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCi0JZG9uZSAjIGZvciB2YXIKLSAgICAgIGZpCi0gICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicwotICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCi0gICAgICB0bXBfbGlicz0KLSAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbwotCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCi0JKiIgJGkgIiopCi0JICBpPSIiCi0JICA7OwotCWVzYWMKLQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JICB0bXBfbGlicz0iJHRtcF9saWJzICRpIgotCWZpCi0gICAgICBkb25lCi0gICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCi0gICAgZG9uZSAjIGZvciBwYXNzCi0gICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLSAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0gICAgZmkKLQotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgb2xkbGliKQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBvbGRsaWJzPSIkb3V0cHV0IgotICAgICAgb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMiCi0gICAgICA7OwotCi0gICAgbGliKQotICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgotICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KLQkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKLQkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIiAyPiYxCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQllbHNlCi0JICAkZWNobwotCSAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgotCSAgJGVjaG8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCi0gICAgICBmaQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgotCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQotCWlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0KLQlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0gICAgICBlbHNlCi0KLQkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcwotCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCi0JIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKLQotCWNhc2UgJHZpbmZvX251bWJlciBpbgotCXllcykKLQkgIG51bWJlcl9tYWpvcj0iJDIiCi0JICBudW1iZXJfbWlub3I9IiQzIgotCSAgbnVtYmVyX3JldmlzaW9uPSIkNCIKLQkgICMKLQkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0Ci0JICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgotCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKLQkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKLQkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCi0JICAjCi0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93cykKLQkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcmAKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKLQkgICAgOzsKLQkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxzdW5vcykKLQkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCi0JICAgIGFnZT0iMCIKLQkgICAgOzsKLQkgIGlyaXh8bm9uc3RvcHV4KQotCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yIC0gMWAKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0Jbm8pCi0JICBjdXJyZW50PSIkMiIKLQkgIHJldmlzaW9uPSIkMyIKLQkgIGFnZT0iJDQiCi0JICA7OwotCWVzYWMKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAkY3VycmVudCBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcmV2aXNpb24gaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkYWdlIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQlub25lKSA7OwotCi0JZGFyd2luKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgotCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KLQkgIG1pbm9yX2N1cnJlbnQ9YGV4cHIgJGN1cnJlbnQgKyAxYAotCSAgdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0JZnJlZWJzZC1hb3V0KQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7Ci0JICA7OwotCi0JZnJlZWJzZC1lbGYpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiOwotCSAgOzsKLQotCWlyaXggfCBub25zdG9wdXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCi0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgICAgbm9uc3RvcHV4KSB2ZXJzdHJpbmdfcHJlZml4PW5vbnN0b3B1eCA7OwotCSAgICAqKSAgICAgICAgIHZlcnN0cmluZ19wcmVmaXg9c2dpIDs7Ci0JICBlc2FjCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JHJldmlzaW9uCi0JICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRyZXZpc2lvbiAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQotCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgotCSAgbWFqb3I9LiRtYWpvcgotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgOzsKLQotCWxpbnV4KQotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQl3aW5kb3dzKQotCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQotCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgotCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICBtYWpvcj0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgZGFyd2luKQotCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKLQkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQotCSAgICB2ZXJzdHJpbmc9Ci0JICAgIDs7Ci0JICAqKQotCSAgICB2ZXJzdHJpbmc9IjAuMCIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgICAgdmVyc3VmZml4PQotCSAgZWxzZQotCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCi0JICBmaQotCWZpCi0KLQkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKLQlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdWZmaXg9Ci0JICB2ZXJzdHJpbmc9IiIKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgotCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICBmaQotCWVsc2UKLQkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCi0JIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKLQkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KLQlyZW1vdmVsaXN0PQotCXRlbXByZW1vdmVsaXN0PWAkZWNobyAiJG91dHB1dF9vYmpkaXIvKiJgCi0JZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbwotCSAgY2FzZSAkcCBpbgotCSAgICAqLiRvYmpleHQpCi0JICAgICAgIDs7Ci0JICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCi0JICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgotCSAgICAgICAgIGlmIGVjaG8gJHAgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCi0JICAgICAgICAgdGhlbgotCQkgICBjb250aW51ZQotCQkgZmkKLQkgICAgICAgZmkKLQkgICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJHAiCi0JICAgICAgIDs7Ci0JICAgICopIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgLW4gIiRyZW1vdmVsaXN0IjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkcmVtb3ZlbGlzdCIKLQkgICRydW4gJHtybX1yICRyZW1vdmVsaXN0Ci0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgotICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLQlsaWJfc2VhcmNoX3BhdGg9YCRlY2hvICIkbGliX3NlYXJjaF9wYXRoICIgfCAke1NFRH0gLWUgInMlICRwYXRoICUgJWciYAotCWRlcGxpYnM9YCRlY2hvICIkZGVwbGlicyAiIHwgJHtTRUR9IC1lICJzJSAtTCRwYXRoICUgJWciYAotCWRlcGVuZGVuY3lfbGlicz1gJGVjaG8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JdGVtcF94cnBhdGg9Ci0JZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0JaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAotICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgotICAgICAgZGxmaWxlcz0KLSAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbwotCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcwotICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgotICAgICAgZGxwcmVmaWxlcz0KLSAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbwotCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KLQkqIiAkbGliICIqKSA7OwotCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqKQotCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgotCSAgICA7OwotCSAgKi0qLW5ldGJzZCopCi0JICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgotCSAgICA7OwotCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgotCSAgICA7OwotCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQotCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKLQkgICAgOzsKLQkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKLQkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yawotCSAgICA7OwotIAkgICopCi0JICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCi0JICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JZmkKLQotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCXBhc3NfYWxsKQotCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCi0JICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCi0JICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKLQkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAiJD8iIC1lcSAwIDsgdGhlbgotCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9YGV4cHIgJGkgOiAnLWxcKC4qXCknYAotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotICAgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAiJG5hbWUiIC1uZSAiMCI7IHRoZW4KLQkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkgICoiICRpICIqKQotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBpPSIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkgICAgICAgIGZpCi0JCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgZGVwbGliX21hdGNoPSQyCi0JCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgZWxzZQotCQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAkZWNobwotCQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCi0JCSAgICAkZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgotCQkgICAgJGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICBmaQotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKLQkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkJJHJtIGNvbmZ0ZXN0Ci0JCSRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCi0JCSMgRGlkIGl0IHdvcms/Ci0JCWlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KLQkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSAgICAqIiAkaSAiKikKLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICAgIGk9IiIKLQkJICAgICAgOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgICBkZXBsaWJfbWF0Y2g9JDIKLQkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBlbHNlCi0JCSAgICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgICAkZWNobwotCQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCi0JCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgotCQkgICAgICAkZWNobyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgotCQkgICAgZmkKLQkJICBmaQotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgJGVjaG8KLQkJICAkZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgotCQkgICRlY2hvICIqKiogIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgotCQkgICRlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgICRlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCi0JCQljb250aW51ZQotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCi0JCQljYXNlICRwb3RsaWJsaW5rIGluCi0JCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKLQkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKLQkJCWVzYWMKLQkJICAgICAgZG9uZQotCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgXAotCQkJIHwgJHtTRUR9IDEwcSBcCi0JCQkgfCAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkJYV9kZXBsaWI9IiIKLQkJCWJyZWFrIDIKLQkJICAgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQkkZWNobwotCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCi0JCWVsc2UKLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkZWNobyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0JbWF0Y2hfcGF0dGVybiopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKLQkJICAgIGlmIGV2YWwgJGVjaG8gXCIkcG90ZW50X2xpYlwiIDI+L2Rldi9udWxsIFwKLQkJICAgICAgICB8ICR7U0VEfSAxMHEgXAotCQkgICAgICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgICAgICBhX2RlcGxpYj0iIgotCQkgICAgICBicmVhayAyCi0JCSAgICBmaQotCQkgIGRvbmUKLQkJZG9uZQotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCSRlY2hvCi0JCSRlY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkkZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKLQkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKLQkJZWxzZQotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgotCQkgICRlY2hvICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKLQkJZmkKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgIGZpCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopCi0JICBuZXdkZXBsaWJzPSIiCi0JICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAtZSAncy8gLVtMUl1bXiBdKi8vZydgCi0JICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCi0JICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJwotCSAgICAgIHRtcF9kZXBsaWJzPWAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJHtTRUR9IC1lICIxcyxeWCwsIiAtZSAicywkaSwsImAKLQkgICAgZG9uZQotCSAgZmkKLQkgIGlmICRlY2hvICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bIAldLy9nJyBcCi0JICAgIHwgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgJGVjaG8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICAkZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKLQltYWpvcj0kbWFqb3Jfc2F2ZQotCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQotCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQotCW5hbWU9JG5hbWVfc2F2ZQotCi0JY2FzZSAkaG9zdCBpbgotCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICBuZXdkZXBsaWJzPWAkZWNobyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgICRlY2hvCi0JICAgICRlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgJGVjaG8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgotCSAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgICRlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgJGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkgICAgICAkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICRlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICAkZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgJGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQotCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKLQkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCi0JICAgICAgJGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKLQkgICAgICAkZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCWZpCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotICAgICAgZmkKLQotCi0gICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKLSAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0Ci0gICAgICBuZXdfbGlicz0KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JY2FzZSAiICRuZXdfbGlicyAiIGluCi0JKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OwotCSopCi0JICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQotCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KLQljYXNlICRkZXBsaWIgaW4KLQktTCopCi0JICBjYXNlICIgJG5ld19saWJzICIgaW4KLQkgICoiICRkZXBsaWIgIiopIDs7Ci0JICAqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JICBlc2FjCi0JICA7OwotCSopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCi0KLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0JICBoYXJkY29kZV9saWJkaXJzPQotCSAgZGVwX3JwYXRoPQotCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKLQkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgotCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCQllbHNlCi0JCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgICAgOzsKLQkJICAqKQotCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkgICAgICBlbHNlCi0JCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgotCSAgICAgIGZpCi0JICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZG9uZQotCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgotCSAgICBlbHNlCi0JICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIGZpCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgICAgcnBhdGg9Ci0JICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICBkb25lCi0JICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgotCSAgZmkKLQkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCi0JZmkKLQotCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKLQl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKLQlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgotCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotCWZpCi0KLQkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KLQlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXJlYWxuYW1lPSIkMiIKLQlzaGlmdDsgc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICBkbG5hbWU9JHNvbmFtZQotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlsaW5rbmFtZXM9Ci0JZm9yIGxpbmsKLQlkbwotCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgotCWRvbmUKLQotCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLQkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcwotCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAgIGlmIGxlbj1gZXhwciAiWCRjbWQiIDogIi4qImAgJiYKLQkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICAgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgICAgc2tpcHBlZF9leHBvcnQ9ZmFsc2UKLQkgICAgICBlbHNlCi0JICAgICAgICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KLQkgICAgICAgICRzaG93ICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKLQkgICAgICAgIHNraXBwZWRfZXhwb3J0PToKLQkJIyBCcmVhayBvdXQgZWFybHksIG90aGVyd2lzZSBza2lwcGVkX2V4cG9ydCBtYXkgYmUKLQkJIyBzZXQgdG8gZmFsc2UgYnkgYSBsYXRlciBidXQgc2hvcnRlciBjbWQuCi0JCWJyZWFrCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICIkRUdSRVAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgICRzaG93ICIkbXYgXCIke2V4cG9ydF9zeW1ib2xzfVRcIiBcIiRleHBvcnRfc3ltYm9sc1wiIgotCSAgICAgICRydW4gZXZhbCAnJG12ICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgJHJ1biBldmFsICckZWNobyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkZXhwb3J0X3N5bWJvbHMiJwotCWZpCi0KLQl0bXBfZGVwbGlicz0KLQlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JCWNhc2UgIiAkY29udmVuaWVuY2UgIiBpbgotCQkqIiAkdGVzdF9kZXBsaWIgIiopIDs7Ci0JCSopCi0JCQl0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKLQkJCTs7Ci0JCWVzYWMKLQlkb25lCi0JZGVwbGlicz0iJHRtcF9kZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQkgIGZpCi0JZmkKLQkKLQlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKLQlmaQotCi0JIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCi0JaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1VICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1VKScgfHwgZXhpdCAkPwotCWZpCi0KLQkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2V4cHN5bV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgIGZpCi0JZWxzZQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKLQkgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQllbHNlCi0JICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCSAgY21kcz0kYXJjaGl2ZV9jbWRzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmCi0JICAgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZS4KLQkgICRlY2hvICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKLQotCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KLQkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQotCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQotCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKLQkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCi0JICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55Ci0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCi0JICAjIHRoZSBzcGVjLgotCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgZmkKLQkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKLQkgIG91dHB1dF9sYT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotCi0JICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAotCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgotCSAgdGVzdF9jbWRzPQotCSAgY29uY2F0X2NtZHM9Ci0JICBvYmpsaXN0PQotCSAgZGVsZmlsZXM9Ci0JICBsYXN0X3JvYmo9Ci0JICBrPTEKLQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCi0JICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKLQkgIGRvCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICBpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAotCSAgICAgICB7IGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkJIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgfTsgdGhlbgotCSAgICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCi0JICAgIGVsc2UKLQkgICAgICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQotCSAgICAgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCi0JICAgICAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgotCQkjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgotCQlldmFsIGNvbmNhdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICAgIGVsc2UKLQkJIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KLQkJIyB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICAgIGZpCi0JICAgICAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgaz1gZXhwciAkayArIDFgCi0JICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgb2JqbGlzdD0kb2JqCi0JICAgICAgbGVuPTEKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAotCSAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKLQkgICMgZmlsZXMgd2lsbCBsaW5rIGluIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgotCSAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCi0JICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICBsaWJvYmpzPSRvdXRwdXQKLQkgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KLQkgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JGV4cG9ydF9zeW1ib2xzX2NtZHNcIgotICAgICAgICAgIGZpCi0KLQkgICMgU2V0IHVwIGEgY29tbWFuZCB0byByZW1vdmUgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzCi0JICAjIGFmdGVyIHRoZXkgYXJlIHVzZWQuCi0JICBpPTAKLQkgIHdoaWxlIHRlc3QgIiRpIiAtbHQgIiRrIgotCSAgZG8KLQkgICAgaT1gZXhwciAkaSArIDFgCi0JICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2l9LiRvYmpleHQiCi0JICBkb25lCi0KLQkgICRlY2hvICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgotCi0JICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0KLQkgIGxpYm9ianM9JG91dHB1dAotCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCi0JICBvdXRwdXQ9JHNhdmVfb3V0cHV0Ci0KLQkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGZpCi0JICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQotCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCi0KLQkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKLQkgICAgZWxzZQotCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCi0JICAgIGZpCi0JICBlbHNlCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgICBmaQotCSAgZmkKLQotCSAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcwotCSAgIyB0byB0aGUganVzdC1yZXNldCAkY21kcy4KLQkgIGV2YWwgY21kcz1cIlwkY21kc35cJHJtICRkZWxmaWxlc1wiCi0JZmkKLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IHsKLQkgICAgbHRfZXhpdD0kPwotCi0JICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKLQkgICAgZmkKLQotCSAgICBleGl0ICRsdF9leGl0Ci0JICB9Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCi0JIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRtdiAiJHJlYWxuYW1lIlUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPwotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAgIGZpCi0JICBmaQotCi0JICBleGl0ICRFWElUX1NVQ0NFU1MKLQlmaQotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJG91dHB1dCBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKLSAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCi0gICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQotICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KLSAgICAgIHJlbG9hZF9jb252X29ianM9Ci0gICAgICBnZW50b3A9Ci0gICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgotICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotICAgICAgd2w9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIHJlbG9hZF9jb252X29ianM9XCJcJHJlbG9hZF9vYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JZWxzZQotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBjbWRzPSRyZWxvYWRfY21kcwotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCWV2YWwgY21kPVwiJGNtZFwiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAkcnVuICR7cm19ciAkZ2VudG9wCi0JZmkKLQotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICRnZW50b3AKLQlmaQotCi0JIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKLQkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkjICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQljbWRzPSRyZWxvYWRfY21kcwotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSRydW4gJHtybX1yICRnZW50b3AKLSAgICAgIGZpCi0KLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgOzsKLQotICAgIHByb2cpCi0gICAgICBjYXNlICRob3N0IGluCi0JKmN5Z3dpbiopIG91dHB1dD1gJGVjaG8gJG91dHB1dCB8ICR7U0VEfSAtZSAncywuZXhlJCwsO3MsJCwuZXhlLCdgIDs7Ci0gICAgICBlc2FjCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCi0JICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgotCWZpCi0gICAgICBmaQotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQljb21waWxlX2RlcGxpYnM9YCRlY2hvICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAotCWZpbmFsaXplX2RlcGxpYnM9YCRlY2hvICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqZGFyd2luKikKLSAgICAgICAgIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycwotICAgICAgICBpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotCi0gICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKLSAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0Ci0gICAgICBuZXdfbGlicz0KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JY2FzZSAiICRuZXdfbGlicyAiIGluCi0JKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OwotCSopCi0JICBjYXNlICIgJGNvbXBpbGVfZGVwbGlicyAiIGluCi0JICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCi0JICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBmb3IgZGVwbGliIGluICRjb21waWxlX2RlcGxpYnM7IGRvCi0JY2FzZSAkZGVwbGliIGluCi0JLUwqKQotCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCi0JICAqIiAkZGVwbGliICIqKSA7OwotCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCSAgZXNhYwotCSAgOzsKLQkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2xpYnMiCi0KLQotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRjb21waWxlX2RlcGxpYnMiCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmluYWxpemVfZGVwbGlicyIKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgdGVzdGJpbmRpcj1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRsaWJkaXIiOzsKLQkgIGVzYWMKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICRkbHN5bXMgaW4KLQkiIikgOzsKLQkqLmMpCi0JICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotCSAgbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0ubm0iCi0KLQkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotCSAgJHNob3cgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgIHRlc3QgLXogIiRydW4iICYmICRlY2hvID4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KLS8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gXCJDXCIgewotI2VuZGlmCi0KLS8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCi0jZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCi0iCi0KLQkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgotCi0JICAgIHRlc3QgLXogIiRydW4iICYmICRlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKLQotCSAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCi0JICAgIHByb2dmaWxlcz1gJGVjaG8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCSAgICBmb3IgYXJnIGluICRwcm9nZmlsZXM7IGRvCi0JICAgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICAgIGRvbmUKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0KLQkgICAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQkgICAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLSAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotCQkkcnVuIGV2YWwgJ2NhdCAiJGV4cG9ydF9zeW1ib2xzIiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICBlc2FjCi0JICAgIGVsc2UKLQkgICAgICAkcnVuIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJwotCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJwotICAgICAgICAgICAgICBjYXNlICRob3N0IGluCi0gICAgICAgICAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0JICAgICAgICAkcnVuIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0JCSRydW4gZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWAkZWNobyAiJGFyZyIgfCAke1NFRH0gLWUgJ3MlXi4qLyUlJ2AKLQkgICAgJHJ1biBldmFsICckZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJwotCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgotCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKLQkJaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCSAgc29ydCAtayAzCi0JCWVsc2UKLQkJICBzb3J0ICsyCi0JCWZpIHwKLQkJdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHIgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLSIKLQotCSAgICBjYXNlICRob3N0IGluCi0JICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0JICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLS8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY2FuJ3QgYmUgY29uc3QsIGJlY2F1c2UKLSAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCi0gICBvbiBwc2V1ZG8tcmVsb2NzICovCi1zdHJ1Y3QgewotIgotCSAgICAgIDs7Ci0JICAgICogKQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi1jb25zdCBzdHJ1Y3QgewotIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQotCi0JICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyIGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyKSAwfQotfTsKLQotLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCi0jaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECi1zdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgewotICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JICBmaQotCi0JICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9Ci0JICBjYXNlICRob3N0IGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7Ci0JICAgIGVzYWM7OwotCSAgKi0qLWhwdXgqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIjs7Ci0JICAgIGVzYWMKLQkgIGVzYWMKLQotCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQkgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJExUQ0MgICRMVENGTEFHUyAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlIFwiJGRsc3ltc1wiKSIKLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotICAgICAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQotICAgICAgICAgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5kZWYiIDsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5kZWYgJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotICAgICAgICAgICogKQotICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0JIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLQotCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIgotCWV4aXRfc3RhdHVzPSQ/Ci0KLQkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JZmkKLQotCWV4aXQgJGV4aXRfc3RhdHVzCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIFdlIHNob3VsZCBzZXQgdGhlIHNobGlicGF0aF92YXIKLQlycGF0aD0KLQlmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbwotCSAgY2FzZSAkZGlyIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCi0JIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQlsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgotCSRydW4gJHJtICRvdXRwdXQKLQkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKLQkkc2hvdyAiJGxpbmtfY29tbWFuZCIKLQkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQlleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0JIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbHNlCi0JICAgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBmaQotCWRvbmUKLQlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgotCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgJHByb2dwYXRoIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRlY2hvICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JIyB3aW4zMiB3aWxsIHRoaW5rIHRoZSBzY3JpcHQgaXMgYSBiaW5hcnkgaWYgaXQgaGFzCi0JIyBhIC5leGUgc3VmZml4LCBzbyB3ZSBzdHJpcCBpdCBvZmYgaGVyZS4KLQljYXNlICRvdXRwdXQgaW4KLQkgICouZXhlKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXR8JHtTRUR9ICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKikKLQkgICAgZXhlZXh0PS5leGUKLQkgICAgb3V0cHV0bmFtZT1gJGVjaG8gJG91dHB1dG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYCA7OwotCSAgKikgZXhlZXh0PSA7OwotCWVzYWMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogKQotICAgICAgICAgICAgb3V0cHV0X25hbWU9YGJhc2VuYW1lICRvdXRwdXRgCi0gICAgICAgICAgICBvdXRwdXRfcGF0aD1gZGlybmFtZSAkb3V0cHV0YAotICAgICAgICAgICAgY3dyYXBwZXJzb3VyY2U9IiRvdXRwdXRfcGF0aC8kb2JqZGlyL2x0LSRvdXRwdXRfbmFtZS5jIgotICAgICAgICAgICAgY3dyYXBwZXI9IiRvdXRwdXRfcGF0aC8kb3V0cHV0X25hbWUuZXhlIgotICAgICAgICAgICAgJHJtICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKLSAgICAgICAgICAgIHRyYXAgIiRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0JICAgIGNhdCA+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotCi0vKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0gICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0KLSAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotCi0gICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0gICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSAgIEN1cnJlbnRseSwgaXQgc2ltcGx5IGV4ZWNzIHRoZSB3cmFwcGVyICpzY3JpcHQqICIvYmluL3NoICRvdXRwdXQiLAotICAgYnV0IGNvdWxkIGV2ZW50dWFsbHkgYWJzb3JiIGFsbCBvZiB0aGUgc2NyaXB0cyBmdW5jdGlvbmFsaXR5IGFuZAotICAgZXhlYyAkb2JqZGlyLyRvdXRwdXRuYW1lIGRpcmVjdGx5LgotKi8KLUVPRgotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlPDwiRU9GIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZChQQVRIX01BWCkKLSMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKLSNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgotI2Vsc2UKLSMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCi0gIGRlZmluZWQgKF9fT1MyX18pCi0jIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQotIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKLSMgZW5kaWYKLSMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKLSMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQotI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCi0gICAgICAgICgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQotI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotCi0jaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUikKLSNlbHNlIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLSMgZGVmaW5lIElTX1BBVEhfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBQQVRIX1NFUEFSQVRPUl8yKQotI2VuZGlmIC8qIFBBVEhfU0VQQVJBVE9SXzIgKi8KLQotI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQotI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCi0gIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCi19IHdoaWxlICgwKQotCi0vKiAtRERFQlVHIGlzIGZhaXJseSBjb21tb24gaW4gQ0ZMQUdTLiAgKi8KLSN1bmRlZiBERUJVRwotI2lmIGRlZmluZWQgREVCVUdXUkFQUEVSCi0jIGRlZmluZSBERUJVRyhmb3JtYXQsIC4uLikgZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgX19WQV9BUkdTX18pCi0jZWxzZQotIyBkZWZpbmUgREVCVUcoZm9ybWF0LCAuLi4pCi0jZW5kaWYKLQotY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gTlVMTDsKLQotdm9pZCAqIHhtYWxsb2MgKHNpemVfdCBudW0pOwotY2hhciAqIHhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci1jb25zdCBjaGFyICogYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKLWNoYXIgKiBmaW5kX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqd3JhcHBlcik7Ci1pbnQgICAgY2hlY2tfZXhlY3V0YWJsZShjb25zdCBjaGFyICpwYXRoKTsKLWNoYXIgKiBzdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwotdm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBjaGFyICoqbmV3YXJnejsKLSAgaW50IGk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7Ci0gIERFQlVHKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsYXJndlswXSk7Ci0gIERFQlVHKCIobWFpbikgcHJvZ3JhbV9uYW1lIDogJXNcbiIscHJvZ3JhbV9uYW1lKTsKLSAgbmV3YXJneiA9IFhNQUxMT0MoY2hhciAqLCBhcmdjKzIpOwotRU9GCi0KLSAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLSAgbmV3YXJnelswXSA9IChjaGFyICopIHhzdHJkdXAoIiRTSEVMTCIpOwotRU9GCi0KLSAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDwiRU9GIgotICBuZXdhcmd6WzFdID0gZmluZF9leGVjdXRhYmxlKGFyZ3ZbMF0pOwotICBpZiAobmV3YXJnelsxXSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsKCJDb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7Ci0gIERFQlVHKCIobWFpbikgZm91bmQgZXhlIGF0IDogJXNcbiIsbmV3YXJnelsxXSk7Ci0gIC8qIHdlIGtub3cgdGhlIHNjcmlwdCBoYXMgdGhlIHNhbWUgbmFtZSwgd2l0aG91dCB0aGUgLmV4ZSAqLwotICAvKiBzbyBtYWtlIHN1cmUgbmV3YXJnelsxXSBkb2Vzbid0IGVuZCBpbiAuZXhlICovCi0gIHN0cmVuZHphcChuZXdhcmd6WzFdLCIuZXhlIik7Ci0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgbmV3YXJneltpKzFdID0geHN0cmR1cChhcmd2W2ldKTsKLSAgbmV3YXJnelthcmdjKzFdID0gTlVMTDsKLQotICBmb3IgKGk9MDsgaTxhcmdjKzE7IGkrKykKLSAgewotICAgIERFQlVHKCIobWFpbikgbmV3YXJnelslZF0gICA6ICVzXG4iLGksbmV3YXJneltpXSk7Ci0gICAgOwotICB9Ci0KLUVPRgotCi0gICAgICAgICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICAgICAgICAgIG1pbmd3KikKLSAgICAgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCi0gIGV4ZWN2KCIkU0hFTEwiLChjaGFyIGNvbnN0ICoqKW5ld2FyZ3opOwotRU9GCi0gICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotICBleGVjdigiJFNIRUxMIixuZXdhcmd6KTsKLUVPRgotICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKLSAgcmV0dXJuIDEyNzsKLX0KLQotdm9pZCAqCi14bWFsbG9jIChzaXplX3QgbnVtKQotewotICB2b2lkICogcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKLSAgaWYgKCFwKQotICAgIGx0X2ZhdGFsICgiTWVtb3J5IGV4aGF1c3RlZCIpOwotCi0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksIHN0cmluZykgOiBOVUxMCi07Ci19Ci0KLWNvbnN0IGNoYXIgKgotYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQotewotICBjb25zdCBjaGFyICpiYXNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCi0gIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KLSAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKW5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQotICAgIG5hbWUgKz0gMjsKLSNlbmRpZgotCi0gIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCi0gICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKLSAgICAgIGJhc2UgPSBuYW1lICsgMTsKLSAgcmV0dXJuIGJhc2U7Ci19Ci0KLWludAotY2hlY2tfZXhlY3V0YWJsZShjb25zdCBjaGFyICogcGF0aCkKLXsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgREVCVUcoIihjaGVja19leGVjdXRhYmxlKSAgOiAlc1xuIiwgcGF0aCA/ICgqcGF0aCA/IHBhdGggOiAiRU1QVFkhIikgOiAiTlVMTCEiKTsKLSAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApICYmCi0gICAgICAoCi0gICAgICAgIC8qIE1pbkdXICYgbmF0aXZlIFdJTjMyIGRvIG5vdCBzdXBwb3J0IFNfSVhPVEggb3IgU19JWEdSUCAqLwotI2lmIGRlZmluZWQgKFNfSVhPVEgpCi0gICAgICAgKChzdC5zdF9tb2RlICYgU19JWE9USCkgPT0gU19JWE9USCkgfHwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNfSVhHUlApCi0gICAgICAgKChzdC5zdF9tb2RlICYgU19JWEdSUCkgPT0gU19JWEdSUCkgfHwKLSNlbmRpZgotICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhVU1IpID09IFNfSVhVU1IpKQotICAgICAgKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucwotICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZSAqLwotY2hhciAqCi1maW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIqIHdyYXBwZXIpCi17Ci0gIGludCBoYXNfc2xhc2ggPSAwOwotICBjb25zdCBjaGFyKiBwOwotICBjb25zdCBjaGFyKiBwX25leHQ7Ci0gIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLwotICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07Ci0gIGludCB0bXBfbGVuOwotICBjaGFyKiBjb25jYXRfbmFtZTsKLQotICBERUJVRygiKGZpbmRfZXhlY3V0YWJsZSkgIDogJXNcbiIsIHdyYXBwZXIgPyAoKndyYXBwZXIgPyB3cmFwcGVyIDogIkVNUFRZISIpIDogIk5VTEwhIik7Ci0KLSAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBYnNvbHV0ZSBwYXRoPyAqLwotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCi0gIHsKLSAgICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOwotICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKLSAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgICBYRlJFRShjb25jYXRfbmFtZSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0jZW5kaWYKLSAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCi0gICAgewotICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKLSAgICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKLSAgICAgICAgcmV0dXJuIGNvbmNhdF9uYW1lOwotICAgICAgWEZSRUUoY29uY2F0X25hbWUpOwotICAgIH0KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgfQotI2VuZGlmCi0KLSAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKLSAgICBpZiAoKnAgPT0gJy8nKQotICAgIHsKLSAgICAgIGhhc19zbGFzaCA9IDE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmICghaGFzX3NsYXNoKQotICB7Ci0gICAgLyogbm8gc2xhc2hlczsgc2VhcmNoIFBBVEggKi8KLSAgICBjb25zdCBjaGFyKiBwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOwotICAgIGlmIChwYXRoICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHE7Ci0gICAgICAgIHNpemVfdCBwX2xlbjsKLSAgICAgICAgZm9yIChxID0gcDsgKnE7IHErKykKLSAgICAgICAgICBpZiAoSVNfUEFUSF9TRVBBUkFUT1IoKnEpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHBfbGVuID0gcSAtIHA7Ci0gICAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKLSAgICAgICAgaWYgKHBfbGVuID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBlbXB0eSBwYXRoOiBjdXJyZW50IGRpcmVjdG9yeSAqLwotICAgICAgICAgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKLSAgICAgICAgICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOwotICAgICAgICAgIHRtcF9sZW4gPSBzdHJsZW4odG1wKTsKLSAgICAgICAgICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKLSAgICAgICAgICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotICAgICAgICAgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOwotICAgICAgICAgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbih3cmFwcGVyKSArIDEpOwotICAgICAgICAgIG1lbWNweSAoY29uY2F0X25hbWUsIHAsIHBfbGVuKTsKLSAgICAgICAgICBjb25jYXRfbmFtZVtwX2xlbl0gPSAnLyc7Ci0gICAgICAgICAgc3RyY3B5IChjb25jYXRfbmFtZSArIHBfbGVuICsgMSwgd3JhcHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQotICAgICAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgICAgICAgWEZSRUUoY29uY2F0X25hbWUpOwotICAgICAgfQotICAgIH0KLSAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLwotICB9Ci0gIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KLSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOwotICB0bXBfbGVuID0gc3RybGVuKHRtcCk7Ci0gIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbih3cmFwcGVyKSArIDEpOwotICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKLSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQotICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCi0gICAgcmV0dXJuIGNvbmNhdF9uYW1lOwotICBYRlJFRShjb25jYXRfbmFtZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jaGFyICoKLXN0cmVuZHphcChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKLXsKLSAgc2l6ZV90IGxlbiwgcGF0bGVuOwotCi0gIGFzc2VydChzdHIgIT0gTlVMTCk7Ci0gIGFzc2VydChwYXQgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuKHN0cik7Ci0gIHBhdGxlbiA9IHN0cmxlbihwYXQpOwotCi0gIGlmIChwYXRsZW4gPD0gbGVuKQotICB7Ci0gICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKLSAgICBpZiAoc3RyY21wKHN0ciwgcGF0KSA9PSAwKQotICAgICAgKnN0ciA9ICdcMCc7Ci0gIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHZvaWQKLWx0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqIG1vZGUsCi0gICAgICAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2UsIHZhX2xpc3QgYXApCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBtb2RlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOwotICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKLQotICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKLSAgICBleGl0IChleGl0X3N0YXR1cyk7Ci19Ci0KLXZvaWQKLWx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgbWVzc2FnZSk7Ci0gIGx0X2Vycm9yX2NvcmUgKEVYSVRfRkFJTFVSRSwgIkZBVEFMIiwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLUVPRgotICAgICAgICAgICMgd2Ugc2hvdWxkIHJlYWxseSB1c2UgYSBidWlsZC1wbGF0Zm9ybSBzcGVjaWZpYyBjb21waWxlcgotICAgICAgICAgICMgaGVyZSwgYnV0IE9UT0gsIHRoZSB3cmFwcGVycyAoc2hlbGwgc2NyaXB0IGFuZCB0aGlzIEMgb25lKQotICAgICAgICAgICMgYXJlIG9ubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGV4ZWN1dGUgdGhlICJyZWFsIiBiaW5hcnkuCi0gICAgICAgICAgIyBTaW5jZSB0aGUgInJlYWwiIGJpbmFyeSBpcyBidWlsdCBmb3IgJGhvc3QsIHRoZW4gdGhpcwotICAgICAgICAgICMgd3JhcHBlciBtaWdodCBhcyB3ZWxsIGJlIGJ1aWx0IGZvciAkaG9zdCwgdG9vLgotICAgICAgICAgICRydW4gJExUQ0MgJExUQ0ZMQUdTIC1zIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgICRybSAkb3V0cHV0Ci0gICAgICAgIHRyYXAgIiRybSAkb3V0cHV0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgotICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKLSAgZG9uZQotCi0gICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCi0gIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKLSAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKLSIKLQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLQotICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKLSAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAotICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCi0KLSAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgotCi0gICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KLSAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCi0gICAgZWxzZQotICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gICAgZmkiCi0KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJGVjaG8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSIKLQlmaQotCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCi0KLQkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KLQlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgotIgotCWNhc2UgJGhvc3QgaW4KLQkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKLQkqLSotbWluZ3cgfCAqLSotb3MyKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgJGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2xkX2RlcGxpYnMgJG5vbl9waWNfb2JqZWN0cyIKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KLQlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKLQlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotICAgICAgZWxzZQotCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQotCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCi0JIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKLQkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZwotCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5Ci0JIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgotCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCi0JICAgIGRvCi0JICAgICAgJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJScKLQkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgJGVjaG8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKLQotCSAgaWYgdGVzdCAteiAiJGdlbnRvcCI7IHRoZW4KLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKLQkgICAgJHNob3cgIiRta2RpciAkZ2VudG9wIgotCSAgICAkcnVuICRta2RpciAiJGdlbnRvcCIKLQkgICAgZXhpdF9zdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCi0JICAgICAgZXhpdCAkZXhpdF9zdGF0dXMKLQkgICAgZmkKLQkgIGZpCi0KLQkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcwotCSAgb2xkb2Jqcz0KLQkgIGNvdW50ZXI9MQotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBvYmpiYXNlPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgY2FzZSAiICRvbGRvYmpzICIgaW4KLQkgICAgIiAiKSBvbGRvYmpzPSRvYmogOzsKLQkgICAgKltcIC9dIiRvYmpiYXNlICIqKQotCSAgICAgIHdoaWxlIDo7IGRvCi0JCSMgTWFrZSBzdXJlIHdlIGRvbid0IHBpY2sgYW4gYWx0ZXJuYXRlIG5hbWUgdGhhdCBhbHNvCi0JCSMgb3ZlcmxhcHMuCi0JCW5ld29iaj1sdCRjb3VudGVyLSRvYmpiYXNlCi0JCWNvdW50ZXI9YGV4cHIgJGNvdW50ZXIgKyAxYAotCQljYXNlICIgJG9sZG9ianMgIiBpbgotCQkqW1wgL10iJG5ld29iaiAiKikgOzsKLQkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OwotCQllc2FjCi0JICAgICAgZG9uZQotCSAgICAgICRzaG93ICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKLQkgICAgICAkcnVuIGxuICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIiB8fAotCSAgICAgICRydW4gY3AgIiRvYmoiICIkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIDs7Ci0JICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCi0JaWYgbGVuPWBleHByICJYJGNtZHMiIDogIi4qImAgJiYKLQkgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcwotCWVsc2UKLQkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCi0JICAkZWNobyAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKLQkgIHNhdmVfUkFOTElCPSRSQU5MSUIKLQkgIFJBTkxJQj06Ci0JICBvYmpsaXN0PQotCSAgY29uY2F0X2NtZHM9Ci0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQotCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/Ci0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIGxhc3Rfb2xkb2JqPSRvYmoKLQkgIGRvbmUKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgb2xkb2Jqcz0iJG9iamxpc3QgJG9iaiIKLQkgICAgb2JqbGlzdD0iJG9iamxpc3QgJG9iaiIKLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0JICAgIGlmIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iOyB0aGVuCi0JICAgICAgOgotCSAgICBlbHNlCi0JICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZwotCSAgICAgIG9sZG9ianM9JG9iamxpc3QKLQkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgotCSAgICAgICAgUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgICAgIGZpCi0JICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgICAgICBvYmpsaXN0PQotCSAgICBmaQotCSAgZG9uZQotCSAgUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgb2xkb2Jqcz0kb2JqbGlzdAotCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KLQkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCi0JICBlbHNlCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0gICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgotICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCi0gICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0gICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQllbHNlCi0JICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKLSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KLQlyZWxpbmtfY29tbWFuZD0KLSAgICAgIGZpCi0KLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbwotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgICoubGEpCi0JCW5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWZpCi0JCW5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkbGliZGlyLyRuYW1lIgotCQk7OwotCSAgICAgICopIG5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIG5ld2RsZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQlleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgICBmaQotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWJkaXIvJG5hbWUiCi0JICAgIGRvbmUKLQkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0JICAgIG5ld2RscHJlZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQlleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgICBmaQotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCi0JICAgIGRvbmUKLQkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OwotCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRhYnMiCi0JICAgIGRvbmUKLQkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0JICAgIG5ld2RscHJlZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OwotCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRhYnMiCi0JICAgIGRvbmUKLQkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0JICBmaQotCSAgJHJtICRvdXRwdXQKLQkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgotCSAgdGRsbmFtZT0kZGxuYW1lCi0JICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KLQkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsKSB0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lIDs7Ci0JICBlc2FjCi0JICAkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckdGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/Ci1pbnN0YWxsZWQ9JGluc3RhbGxlZAotCi0jIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPwotc2hvdWxkbm90bGluaz0kbW9kdWxlCi0KLSMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgotZGxvcGVuPSckZGxmaWxlcycKLWRscHJlb3Blbj0nJGRscHJlZmlsZXMnCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJyIKLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm8gJiYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IHllczsgdGhlbgotCSAgICAkZWNobyA+PiAkb3V0cHV0ICJcCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgotCSAgZmkKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKScgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAotICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgotICAgICAgICRlY2hvICJYJG5vbm9wdCIgfCBncmVwIHNodG9vbCA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlhcmc9IlwiJGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgaW5zdGFsbF9wcm9nPQotICAgICAgYXJnPSRub25vcHQKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAkYXJnIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSRhcmcKLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgCi0gICAgICAJY2FzZSAiICRpbnN0YWxsX3Byb2cgIiBpbgotCSpbXFxcIC9dY3BcICopIDs7Ci0JKikgcHJldj0kYXJnIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAtZyB8IC1tIHwgLW8pIHByZXY9JGFyZyA7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKQotCTs7Ci0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0kYXJnCi0JICBjb250aW51ZQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCi0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICBmaQotICAgIGNhc2UgJGRlc3RkaXIgaW4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICRmaWxlIGluCi0JKi5sbykgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouJGxpYmV4dCkKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCXJlbGlua19jb21tYW5kPQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgJGZpbGUgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLwotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0JZGlyPSIkZGlyJG9iamRpciIKLQotCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCi0JICBpbnN0X3ByZWZpeF9kaXI9YCRlY2hvICIkZGVzdGRpciIgfCAkU0VEICJzJSRsaWJkaXJcJCUlImAKLQotCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAotCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KLQkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0Ci0JICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCi0JICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KLQkgIGlmIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGluc3RhbGwgXGAkZmlsZScgdG8gYSBkaXJlY3Rvcnkgbm90IGVuZGluZyBpbiAkbGliZGlyIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAotCSAgZWxzZQotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAotCSAgZmkKLQotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIiAxPiYyCi0JICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgotCSAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgIGVsc2UKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQlmaQotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICBzcmNuYW1lPSIkcmVhbG5hbWUiCi0JICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCi0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgotCSAgICAkc2hvdyAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICAgJHJ1biBldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBmaQotCi0JICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgIyBUcnkgYGxuIC1zZicgZmlyc3QsIGJlY2F1c2UgdGhlIGBsbicgYmluYXJ5IG1pZ2h0IGRlcGVuZCBvbgotCSAgICAjIHRoZSBzeW1saW5rIHdlIHJlcGxhY2UhICBTb2xhcmlzIC9iaW4vbG4gZG9lcyBub3QgdW5kZXJzdGFuZCAtZiwKLQkgICAgIyBzbyB3ZSBhbHNvIG5lZWQgdG8gdHJ5IHJtICYmIGxuIC1zLgotCSAgICBmb3IgbGlua25hbWUKLQkgICAgZG8KLQkgICAgICBpZiB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiOyB0aGVuCi0gICAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgotICAgICAgICAgICAgICAgICRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0JICBjbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCB7Ci0JICAgICAgbHRfZXhpdD0kPwotCi0JICAgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JICAgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JCSRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJwotCSAgICAgIGZpCi0KLQkgICAgICBleGl0ICRsdF9leGl0Ci0JICAgIH0KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0KLQkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KLQluYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQotCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/Ci0KLQkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0JdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAkZGVzdGZpbGUgaW4KLQkqLmxvKQotCSAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIDs7Ci0JKi4kb2JqZXh0KQotCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgotCSAgZGVzdGZpbGU9Ci0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCWZpCi0KLQkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCSAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/Ci0JZmkKLQlleGl0ICRFWElUX1NVQ0NFU1MKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKLQkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCi0JIyBpbnN0YWxsCi0Jc3RyaXBwZWRfZXh0PSIiCi0JY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JICAgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKLQkgICAgZmkKLQkgICAgOzsKLQllc2FjCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qfCptaW5ndyopCi0JICAgIHdyYXBwZXI9YCRlY2hvICRmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAotCSAgICA7OwotCSopCi0JICAgIHdyYXBwZXI9JGZpbGUKLQkgICAgOzsKLQllc2FjCi0JaWYgKCR7U0VEfSAtZSAnNHEnICR3cmFwcGVyIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKT4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgbm90aW5zdF9kZXBsaWJzPQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0KLQkgICMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bwotCSAgIyBmb28gZXZlbiBpZiBib3RoIGZvbyBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQotCSAgIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCi0JICAjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCi0JICAjCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJHdyYXBwZXIgaW4KLQkgICovKiB8ICpcXCopIC4gJHt3cmFwcGVyfSA7OwotCSAgKikgLiAuLyR7d3JhcHBlcn0gOzsKLQkgIGVzYWMKLQotCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0JICBpZiB0ZXN0IC16ICIkbm90aW5zdF9kZXBsaWJzIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAkbGliIGluCi0JICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JICAgICAgKikgLiAuLyRsaWIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZmluYWxpemU9bm8KLQkgICAgZmkKLQkgIGRvbmUKLQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KLQkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLQkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotCSAgIwotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICR3cmFwcGVyIGluCi0JICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKLQkgICopIC4gLi8ke3dyYXBwZXJ9IDs7Ci0JICBlc2FjCi0KLQkgIG91dHB1dG5hbWU9Ci0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllcyAmJiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCi0JICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQkgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAotCi0JICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgICAgIGVsc2UKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JCSR7cm19ciAiJHRtcGRpciIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyIgMT4mMgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCi0JIyBvbmUgYW55d2F5IAotCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgotCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKLQkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCi0JICAqLmV4ZToqLmV4ZSkKLQkgICAgIyB0aGlzIGlzIG9rCi0JICAgIDs7Ci0JICAqLmV4ZToqKQotCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCi0JICAgIDs7Ci0JICAqOiouZXhlKQotCSAgICBkZXN0ZmlsZT1gJGVjaG8gJGRlc3RmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICR7cm19ciAiJHRtcGRpciIKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KLQkkc2hvdyAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIgotCSRydW4gZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBjbWRzPSRvbGRfcG9zdGluc3RhbGxfY21kcwotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCWV2YWwgY21kPVwiJGNtZFwiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJwotICAgIGVsc2UKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotICAgIGFkbWluY21kcz0KLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGNtZHM9JGZpbmlzaF9jbWRzCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0ICRFWElUX1NVQ0NFU1MKLQotICAgICRlY2hvICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAotICAgICRlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCi0gICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLSAgICAgICRlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICAkZWNobwotICAgICRlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKLSAgICAkZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCi0gICAgJGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCi0gICAgJGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgJGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgICRlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgotICAgICAgJGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgICRlY2hvCi0gICAgJGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgICRlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICAkZWNobyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICA7OwotCi0gICMgbGlidG9vbCBleGVjdXRlIG1vZGUKLSAgZXhlY3V0ZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgotCi0gICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KLSAgICBjbWQ9IiRub25vcHQiCi0gICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICBkaXI9Ci0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KLQlkbG5hbWU9Ci0JbGlicmFyeV9uYW1lcz0KLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgJGZpbGUgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLQlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0JTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQlldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotCSRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgY2xlYW4gYW5kIHVuaW5zdGFsbCBtb2RlCi0gIGNsZWFuIHwgdW5pbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6ICRtb2RlIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotICAgIHJtZm9yY2U9Ci0gICAgZXhpdF9zdGF0dXM9MAotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWYpIHJtPSIkcm0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7Ci0gICAgICAtKikgcm09IiRybSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgcm1kaXJzPQotCi0gICAgb3JpZ29iamRpcj0iJG9iamRpciIKLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiOyB0aGVuCi0JZGlyPS4KLQlvYmpkaXI9IiRvcmlnb2JqZGlyIgotICAgICAgZWxzZQotCW9iamRpcj0iJGRpci8kb3JpZ29iamRpciIKLSAgICAgIGZpCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgJiYgb2JqZGlyPSIkZGlyIgotCi0gICAgICAjIFJlbWVtYmVyIG9iamRpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgdGhlbgotCWNhc2UgIiAkcm1kaXJzICIgaW4KLQkgICoiICRvYmpkaXIgIiopIDs7Ci0JICAqKSBybWRpcnM9IiRybWRpcnMgJG9iamRpciIgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICAjIERvbid0IGVycm9yIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgYW5kIHJtIC1mIHdhcyB1c2VkLgotICAgICAgaWYgKHRlc3QgLUwgIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCAodGVzdCAtaCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCToKLSAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCi0JZXhpdF9zdGF0dXM9MQotCWNvbnRpbnVlCi0gICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBybWZpbGVzPSIkZmlsZSIKLQotICAgICAgY2FzZSAkbmFtZSBpbgotICAgICAgKi5sYSkKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCi0JICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCi0JICBjYXNlICIkbW9kZSIgaW4KLQkgIGNsZWFuKQotCSAgICBjYXNlICIgICRsaWJyYXJ5X25hbWVzICIgaW4KLQkgICAgIyAiICAiIGluIHRoZSBiZWdpbm5pbmcgY2F0Y2hlcyBlbXB0eSAkZGxuYW1lCi0JICAgICoiICRkbG5hbWUgIiopIDs7Ci0JICAgICopIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJGRsbmFtZSIgOzsKLQkgICAgZXNhYwotCSAgICAgdGVzdCAtbiAiJGxpYmRpciIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgotCSAgICA7OwotCSAgdW5pbnN0YWxsKQotCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBjbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIKLQkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KLQkJICBleGl0X3N0YXR1cz0xCi0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgY21kcz0kb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIgotCQlpZiB0ZXN0ICIkPyIgLW5lIDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgotCQkgIGV4aXRfc3RhdHVzPTEKLQkJZmkKLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0JICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotCSAgICA7OwotCSAgZXNhYwotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBvYmplY3QsIHNvIHZlcmlmeSBpdC4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCi0JICAjIFJlYWQgdGhlIC5sbyBmaWxlCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgXAotCSAgICAgJiYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgQWRkIG5vbi1QSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KLQkgIGlmIHRlc3QgLW4gIiRub25fcGljX29iamVjdCIgXAotCSAgICAgJiYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCi0JICBub2V4ZW5hbWU9JG5hbWUKLQkgIGNhc2UgJGZpbGUgaW4KLQkgICouZXhlKQotCSAgICBmaWxlPWAkZWNobyAkZmlsZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCi0JICAgIG5vZXhlbmFtZT1gJGVjaG8gJG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCi0JICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgotCSAgaWYgKCR7U0VEfSAtZSAnNHEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgIC4gJGRpci8kbm9leGVuYW1lCi0KLQkgICAgIyBub3RlICRuYW1lIHN0aWxsIGNvbnRhaW5zIC5leGUgaWYgaXQgd2FzIGluICRmaWxlIG9yaWdpbmFsbHkKLQkgICAgIyBhcyBkb2VzIHRoZSB2ZXJzaW9uIG9mICRmaWxlIHRoYXQgd2FzIGFkZGVkIGludG8gJHJtZmlsZXMKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKLQkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJG5hbWUiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSR7bm9leGVuYW1lfS5jIgotCSAgICBmaQotCSAgZmkKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAkc2hvdyAiJHJtICRybWZpbGVzIgotICAgICAgJHJ1biAkcm0gJHJtZmlsZXMgfHwgZXhpdF9zdGF0dXM9MQotICAgIGRvbmUKLSAgICBvYmpkaXI9IiRvcmlnb2JqZGlyIgotCi0gICAgIyBUcnkgdG8gcmVtb3ZlIHRoZSAke29iamRpcn1zIGluIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB3ZSBkZWxldGVkIGZpbGVzCi0gICAgZm9yIGRpciBpbiAkcm1kaXJzOyBkbwotICAgICAgaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KLQkkc2hvdyAicm1kaXIgJGRpciIKLQkkcnVuIHJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0gICAgOzsKLQotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgLXogIiRleGVjX2NtZCI7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLWZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKLQotaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgotICBldmFsIGV4ZWMgJGV4ZWNfY21kCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCi1jYXNlICRtb2RlIGluCi0iIikgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgotCi1Qcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLQotICAgIC0tY29uZmlnICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCi0gICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCi0gICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQotICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS10YWc9VEFHICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjbGVhbiAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQotICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKLSAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcwotICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0KLU1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgotYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCi0gIGV4aXQgJEVYSVRfU1VDQ0VTUwotICA7OwotCi1jbGVhbikKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNsZWFuIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgb2JqZWN0IG9yIHByb2dyYW0sIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZAotd2l0aCBpdCBhcmUgZGVsZXRlZC4gT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGRpbmcgUElDIG9iamVjdHMgb25seQotICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGRpbmcgbm9uLVBJQyBvYmplY3RzIG9ubHkKLSAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKLSAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKLSAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcwotICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQotICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKLSAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKLSAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKLSAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCi0gICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcwotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotCQkgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQotCi1BbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgotCi1FdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQotdHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKLW9iamVjdCBmaWxlcy4KLQotSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCi1vbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCi1yZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKLXVzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQotaXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKLSAgOzsKLQotdW5pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgOzsKLWVzYWMKLQotJGVjaG8KLSRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLWV4aXQgJD8KLQotIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KLSMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCi0jIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAotIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKLSMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0Ci0jIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0Ci0jIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKLSMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KLSMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKLSMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCi1kaXNhYmxlX2xpYnM9c2hhcmVkCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi1kaXNhYmxlX2xpYnM9c3RhdGljCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYwotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9tNC8uZ2l0aWdub3JlIGIvbTQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlmOWFjCi0tLSAvZGV2L251bGwKKysrIGIvbTQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLm00ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWlzc2luZyBiL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2YThmYzMuLjAwMDAwMDAKLS0tIGEvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMTItMDEtMDYuMTM7ICMgVVRDCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAotIyAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49Ogotc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJwotc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJwotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgJDEgaW4KLS0tcnVuKQotICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCi0gIHJ1bj0KLSAgc2hpZnQKLSAgIiRAIiAmJiBleGl0IDAKLSAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucwotICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCi0gICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKLSAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgotICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KLSAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCi0gICAgcnVuPToKLSAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCi0gIGZpCi0gIDs7Ci0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCi0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0KLVZlcnNpb24gc3VmZml4ZXMgdG8gUFJPR1JBTSBhcyB3ZWxsIGFzIHRoZSBwcmVmaXhlcyBcYGdudS0nLCBcYGdudScsIGFuZAotXGBnJyBhcmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHRoZSBuYW1lLgotCi1TZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi1lc2FjCi0KLSMgbm9ybWFsaXplIHByb2dyYW0gbmFtZSB0byBjaGVjayBmb3IuCi1wcm9ncmFtPWBlY2hvICIkMSIgfCBzZWQgJwotICBzL15nbnUtLy87IHQKLSAgcy9eZ251Ly87IHQKLSAgcy9eZy8vOyB0J2AKLQotIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQotIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0Ci0jIHRoZSBwcm9ncmFtKS4gIFRoaXMgaXMgYWJvdXQgbm9uLUdOVSBwcm9ncmFtcywgc28gdXNlICQxIG5vdAotIyAkcHJvZ3JhbS4KLWNhc2UgJDEgaW4KLSAgbGV4Knx5YWNjKikKLSAgICAjIE5vdCBHTlUgcHJvZ3JhbXMsIHRoZXkgZG9uJ3QgaGF2ZSAtLXZlcnNpb24uCi0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KLSAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQotICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCi0gICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KLSAgICAgICBleGl0IDEKLSAgICBmaQotICAgIDs7Ci1lc2FjCi0KLSMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCi0jIHRyeSB0byBlbXVsYXRlIGl0LgotY2FzZSAkcHJvZ3JhbSBpbgotICBhY2xvY2FsKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQotICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGFjbG9jYWwubTQKLSAgICA7OwotCi0gIGF1dG9jb25mKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICRmIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGF1dG9tNHRlKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCi0gICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKLSAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIjISAvYmluL3NoIgotCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgotCWVjaG8gIiMgICQgJEAiCi0JZWNobyAiZXhpdCAwIgotCWNobW9kICt4ICRmaWxlCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIGJpc29uKnx5YWNjKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9XCR7JCN9Ci0JY2FzZSAkTEFTVEFSRyBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleCp8ZmxleCopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPVwkeyQjfQotCWNhc2UgJExBU1RBUkcgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgdGVzdCAhIC1mIGxleC55eS5jOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBoZWxwMm1hbiopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLQkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQotCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKLQkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCi0gICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKLQlleGl0ICQ/Ci0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotICAgICAgIyAuLi4gb3IgaXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgd2l0aCBAc2V0ZmlsZW5hbWUgLi4uCi0gICAgICBpbmZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnCi0JL15Ac2V0ZmlsZW5hbWUvewotCSAgcy8uKiBcKFteIF0qXCkgKiQvXDEvCi0JICBwCi0JICBxCi0JfScgJGluZmlsZWAKLSAgICAgICMgLi4uIG9yIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIG5hbWUgKGRpci9mLnRleGkgYmVjb21lcyBmLmluZm8pCi0gICAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJGluZmlsZSIgfCBzZWQgJ3MsLiovLCw7cywuW14uXSokLCwnYC5pbmZvCi0gICAgZmkKLSAgICAjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgdXNlciByZWFsbHkgbmVlZHMgbWFrZWluZm87Ci0gICAgIyBsZXQncyBmYWlsIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCi0gICAgdGVzdCAtZiAkZmlsZSB8fCBleGl0IDEKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKLSMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9wcmVwYXJlX3gxMXZuY19kaXN0LnNoIGIvcHJlcGFyZV94MTF2bmNfZGlzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2N2QwOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3gxMXZuY19kaXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLVZFUlNJT049IjAuOS4xMyIKLQotY2QgIiQoZGlybmFtZSAiJDAiKSIKLQotbXYgY29uZmlndXJlLmFjIGNvbmZpZ3VyZS5hYy5MaWJWTkNTZXJ2ZXIKLQotY2F0IGNvbmZpZ3VyZS5hYy5MaWJWTkNTZXJ2ZXIgfCBcCi1lZ3JlcCAtdiAnKEFDX0NPTkZJR19DT01NQU5EU3xjaG1vZCkuKmxpYnZuY3NlcnZlci1jb25maWcnIHwgXAotZWdyZXAgLXYgJ15bIAldKmxpYnZuY3NlcnZlci1jb25maWckJyB8IFwKLXNlZCAtZSAicy9MaWJWTkNTZXJ2ZXIsIFteLCldKlwoWygsXVwpKi94MTF2bmMsICRWRVJTSU9OXDEvZyIgXAotICAgIC1lICJzL1woY29udHJpYlx8ZXhhbXBsZXNcfHZuY3Rlcm1cfHRlc3RcfGNsaWVudF9leGFtcGxlc1wpXC9NYWtlZmlsZS8vZyIgXAotICAgIC1lICJzL0xpYlZOQ1NlcnZlci5zcGVjL3gxMXZuYy5zcGVjL2ciIFwKLSAgICAtZSAicy9BQ19QUk9HX0xJQlRPT0wvQUNfUFJPR19SQU5MSUIvIiBcCi0gICAgLWUgInMvUEtHX0NIRUNLLyNQS0dfQ0hFQ0svIiBcCi0gICAgLWUgJ3MvaWYgdGVzdCAieCR3aXRoX2dudXRscy93aXRoX2dudXRscz1ubzsgaWYgdGVzdCAieCR3aXRoX2dudXRscy8nIFwKLSAgICAtZSAncy9pZiB0ZXN0ICJ4JHdpdGhfaXB2Ni93aXRoX2lwdjY9bm87IGlmIHRlc3QgIngkd2l0aF9pcHY2LycgXAotPiBjb25maWd1cmUuYWMKLQotbXYgTWFrZWZpbGUuYW0gTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyCi0KLWVjaG8gIkVYVFJBX0RJU1Q9dGlnaHR2bmMtMS4zZGV2NS12bmN2aWV3ZXItYWxwaGEtY3Vyc29yLnBhdGNoIFJFTEVBU0UtTk9URVMgUkVBRE1FLkxpYlZOQ1NlcnZlciIgPiBNYWtlZmlsZS5hbQotZWNobyAiIiA+PiBNYWtlZmlsZS5hbQotZWNobyAiaWYgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSIiA+PiBNYWtlZmlsZS5hbQotZWNobyAiU1VCRElSUz14MTF2bmMgY2xhc3NlcyIgPj4gTWFrZWZpbGUuYW0KLWVjaG8gIkRJU1RfU1VCRElSUz14MTF2bmMgY2xhc3NlcyIgPj4gTWFrZWZpbGUuYW0KLWVjaG8gImVsc2UiID4+IE1ha2VmaWxlLmFtCi1lY2hvICJTVUJESVJTPWxpYnZuY3NlcnZlciBsaWJ2bmNjbGllbnQgeDExdm5jIGNsYXNzZXMiID4+IE1ha2VmaWxlLmFtCi1lY2hvICJESVNUX1NVQkRJUlM9bGlidm5jc2VydmVyIGxpYnZuY2NsaWVudCB4MTF2bmMgY2xhc3NlcyIgPj4gTWFrZWZpbGUuYW0KLWVjaG8gImVuZGlmIiA+PiBNYWtlZmlsZS5hbQotZWNobyAiIiA+PiBNYWtlZmlsZS5hbQotCi1jYXQgTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyIHwgXAotc2VkIC1lICJzL15TVUJESVJTLiokLyNTVUJESVJTPWxpYnZuY3NlcnZlciBsaWJ2bmNjbGllbnQgeDExdm5jIGNsYXNzZXMvIiBcCi0gICAgLWUgInMvXkRJU1RfU1VCRElSUy4qJC8jRElTVF9TVUJESVJTPWxpYnZuY3NlcnZlciBsaWJ2bmNjbGllbnQgeDExdm5jIGNsYXNzZXMvIiBcCi0gICAgLWUgIi9eLipiaW5fU0NSSVBUUy4qJC9kIiBcCi0gICAgLWUgInMvXmluY2x1ZGVfSEVBREVSUy9pZiBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJeZWxzZV5pbmNsdWRlX0hFQURFUlMvIiBcCi0gICAgLWUgInMvcmZiY2xpZW50XC5oL3JmYmNsaWVudC5oXmVuZGlmLyIgXAotICAgIHwgdHIgJ14nICdcbicgXAotPj4gTWFrZWZpbGUuYW0KLQotbXYgUkVBRE1FIFJFQURNRS5MaWJWTkNTZXJ2ZXIKLWNwIHgxMXZuYy9SRUFETUUgLi9SRUFETUUKLWNwIHgxMXZuYy9SRUxFQVNFLU5PVEVTIC4vUkVMRUFTRS1OT1RFUwotCi1jYXQgTGliVk5DU2VydmVyLnNwZWMuaW4gfCBcCi1zZWQgLWUgInMvSm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGUvcnVuZ2VAa2FybHJ1bmdlLmNvbS9naSIgXAotICAgIC1lICJzL0pvaGFubmVzLlNjaGluZGVsaW4vS2FybCBSdW5nZS9nIiBcCi0gICAgLWUgInMvYSBsaWJyYXJ5IHRvIG1ha2Ugd3JpdGluZyBhIHZuYyBzZXJ2ZXIgZWFzeS9hIFZOQyBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50IFgxMSBzZXNzaW9uLyIgXAotICAgIC1lICIvXiVkZXNjcmlwdGlvbiQvLC8lZGVzY3JpcHRpb24gZGV2ZWwkL2QiIFwKLSAgICAtZSAncy9eU3RhdGljIGxpYnJhcmllcy4qJC8lZGVzY3JpcHRpb25cCi14MTF2bmMgaXMgdG8gWCBXaW5kb3cgU3lzdGVtIHdoYXQgV2luVk5DIGlzIHRvIFdpbmRvd3MsIGkuZS4gYSBzZXJ2ZXJcCi13aGljaCBzZXJ2ZXMgdGhlIGN1cnJlbnQgWHdpbmRvd3MgZGVza3RvcCB2aWEgUkZCIChWTkMpIHByb3RvY29sXAotdG8gdGhlIHVzZXIuXAotXAotQmFzZWQgb24gdGhlIGlkZWFzIG9mIHgwcmZic2VydmVyIGFuZCBvbiBMaWJWTkNTZXJ2ZXIsIGl0IGhhcyBldm9sdmVkXAotaW50byBhIHZlcnNhdGlsZSBhbmQgcGVyZm9ybWFudCB3aGlsZSBzdGlsbCBlYXN5IHRvIHVzZSBwcm9ncmFtLlwKLVwKLXgxMXZuYyB3YXMgcHV0IHRvZ2V0aGVyIGFuZCBpcyAoYWN0aXZlbHkgOy0pIG1haW50YWluZWQgYnlcCi1LYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPlwKLVwKLS9pJyBcCi0+IHgxMXZuYy5zcGVjLmluLnRtcAotCi1wZXJsIC1lICcKLSAgICAkcyA9IDA7Ci0gICAgd2hpbGUgKDw+KSB7Ci0JaWYgKCRzKSB7Ci0JCWlmICgvXlxzKiQvKSB7Ci0JCQkkcyA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoL14lZmlsZXNccyokLyB8fCAvXiVmaWxlcyBkZXZlbC8pIHsKLQkJCSRzID0gMTsKLQkJfQotCX0KLQluZXh0IGlmICRzOwotCWlmICgvXiVmaWxlcyB4MTF2bmMvKSB7Ci0JCXByaW50ICJcJWZpbGVzXG4iOwotCQlwcmludCAiXCVkb2MgUkVBRE1FIHgxMXZuYy9DaGFuZ2VMb2dcbiI7Ci0JCW5leHQ7Ci0JfQotCXByaW50OwotICAgIH0nIDwgeDExdm5jLnNwZWMuaW4udG1wID4geDExdm5jLnNwZWMuaW4KLQotcm0gLWYgeDExdm5jLnNwZWMuaW4udG1wCi0KLW12IGxpYnZuY3NlcnZlci9NYWtlZmlsZS5hbSBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyCi0KLWNhdCBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyIHwgXAotc2VkIC1lICJzL1woaW5jbHVkZVx8TElCXHxsaWJcKV8vbm9pbnN0Xy9nIiBcCi0gICAgLWUgInMvX2xhXy9fYV8vIiBcCi0gICAgLWUgInMvXC5sYS8uYS8iIFwKLSAgICAtZSAicy9fTFRMSUJSQVJJRVMvX0xJQlJBUklFUy8iIFwKLT4gbGlidm5jc2VydmVyL01ha2VmaWxlLmFtCi0KLW12IGxpYnZuY2NsaWVudC9NYWtlZmlsZS5hbSBsaWJ2bmNjbGllbnQvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyCi0KLWNhdCBsaWJ2bmNjbGllbnQvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyIHwgXAotc2VkIC1lICJzL1woaW5jbHVkZVx8TElCXHxsaWJcKV8vbm9pbnN0Xy9nIiBcCi0gICAgLWUgInMvX2xhXy9fYV8vIiBcCi0gICAgLWUgInMvXC5sYS8uYS8iIFwKLSAgICAtZSAicy9fTFRMSUJSQVJJRVMvX0xJQlJBUklFUy8iIFwKLT4gbGlidm5jY2xpZW50L01ha2VmaWxlLmFtCi0KLW12IHgxMXZuYy9NYWtlZmlsZS5hbSB4MTF2bmMvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyCi0KLWNhdCB4MTF2bmMvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyIHwgXAotc2VkIC1lICJzL19sYV8vX2FfLyIgXAotICAgIC1lICJzL1wubGEvLmEvZyIgXAotICAgIC1lICJzL19MVExJQlJBUklFUy9fTElCUkFSSUVTLyIgXAotPiB4MTF2bmMvTWFrZWZpbGUuYW0KLQotCi1jcCBjbGFzc2VzL01ha2VmaWxlLmFtIGNsYXNzZXMvTWFrZWZpbGUuYW0uTGliVk5DU2VydmVyCi1lY2hvICdwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAvY2xhc3NlcycgPj4gY2xhc3Nlcy9NYWtlZmlsZS5hbQotZWNobyAncGtnZGF0YV9EQVRBPVZuY1ZpZXdlci5qYXIgaW5kZXgudm5jJyA+PiBjbGFzc2VzL01ha2VmaWxlLmFtCi0KLWNwIGNsYXNzZXMvc3NsL01ha2VmaWxlLmFtIGNsYXNzZXMvc3NsL01ha2VmaWxlLmFtLkxpYlZOQ1NlcnZlcgotc2VkIC1lICdzL0VYVFJBX0RJU1Q9L0VYVFJBX0RJU1Q9dGlnaHR2bmMtMS4zZGV2N19qYXZhc3JjLXZuY3ZpZXdlci1zc2wucGF0Y2ggdGlnaHR2bmMtMS4zZGV2N19qYXZhc3JjLXZuY3ZpZXdlci1jdXJzb3ItY29sb3JzK25vLXRhYi10cmF2ZXJzYWwucGF0Y2ggLycgXAotCWNsYXNzZXMvc3NsL01ha2VmaWxlLmFtLkxpYlZOQ1NlcnZlciA+IGNsYXNzZXMvc3NsL01ha2VmaWxlLmFtCi1lY2hvICdwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAvY2xhc3Nlcy9zc2wnID4+IGNsYXNzZXMvc3NsL01ha2VmaWxlLmFtCi1lY2hvICdwa2dkYXRhX0RBVEE9Vm5jVmlld2VyLmphciBpbmRleC52bmMgU2lnbmVkVm5jVmlld2VyLmphciBwcm94eS52bmMgUkVBRE1FIFVsdHJhVmlld2VyU1NMLmphciBTaWduZWRVbHRyYVZpZXdlclNTTC5qYXIgdWx0cmEudm5jIHVsdHJhc2lnbmVkLnZuYycgPj4gY2xhc3Nlcy9zc2wvTWFrZWZpbGUuYW0KLWVjaG8gJ3BrZ2RhdGFfU0NSSVBUUz1zc192bmN2aWV3ZXInID4+IGNsYXNzZXMvc3NsL01ha2VmaWxlLmFtCi0KLWNobW9kIDc1NSBjbGFzc2VzL3NzbC9zc192bmN2aWV3ZXIKLQotbXYgYWNpbmNsdWRlLm00IGFjaW5jbHVkZS5tNC5MaWJWTkNTZXJ2ZXIKLQotY2F0IGFjaW5jbHVkZS5tNC5MaWJWTkNTZXJ2ZXIgfCBcCi1zZWQgLWUgInMvXlwoX1BLRy4qXClcJFBBQ0tBR0VcKC4qXCkkL1wxTGliVk5DU2VydmVyXDIvIiBcCi0+IGFjaW5jbHVkZS5tNAotCi1tYWtlIHgxMXZuYy0ke1ZFUlNJT059LnRhci5negotZm9yIGYgaW4gY29uZmlndXJlLmFjIE1ha2VmaWxlLmFtIHgxMXZuYy9NYWtlZmlsZS5hbSBsaWJ2bmNzZXJ2ZXIvTWFrZWZpbGUuYW0gbGlidm5jY2xpZW50L01ha2VmaWxlLmFtIGNsYXNzZXMvTWFrZWZpbGUuYW0gY2xhc3Nlcy9zc2wvTWFrZWZpbGUuYW0gYWNpbmNsdWRlLm00IFJFQURNRTsgZG8KLQltdiAtZiAkZi5MaWJWTkNTZXJ2ZXIgJGYKLWRvbmUKLXJtIC1mIC4vUkVMRUFTRS1OT1RFUwotCmRpZmYgLS1naXQgYS9yZmIvcmZiLmggYi9yZmIvcmZiLmgKaW5kZXggNjZhOGRjMi4uZjc5MTljNiAxMDA2NDQKLS0tIGEvcmZiL3JmYi5oCisrKyBiL3JmYi9yZmIuaApAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmCiAKLSNpZmRlZiBfX01JTkdXMzJfXworI2lmZGVmIFdJTjMyCiAjdW5kZWYgU09DS0VUCiAjaW5jbHVkZSA8d2luc29jazIuaD4KICNpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9XUzJUQ1BJUF9ICkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICBTT0NLRVQgbGlzdGVuU29jazsKICAgICBpbnQgbWF4U29jazsKICAgICBpbnQgbWF4RmQ7Ci0jaWZkZWYgX19NSU5HVzMyX18KKyNpZmRlZiBXSU4zMgogICAgIHN0cnVjdCBmZF9zZXQgYWxsRmRzOwogI2Vsc2UKICAgICBmZF9zZXQgYWxsRmRzOwpAQCAtNjg2LDcgKzY4Niw3IEBACiAjaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfTElCSlBFRwogICAgIC8qIFR1cmJvVk5DIEVuY29kaW5nIHN1cHBvcnQgKGV4dGVuZHMgVGlnaHRWTkMpICovCiAgICAgaW50IHR1cmJvU3Vic2FtcExldmVsOwotICAgIGludCB0dXJib1F1YWxpdHlMZXZlbDsgIC8vIDEtMTAwIHNjYWxlCisgICAgaW50IHR1cmJvUXVhbGl0eUxldmVsOyAgLyogMS0xMDAgc2NhbGUgKi8KICNlbmRpZgogI2VuZGlmCiAKQEAgLTEwOTAsNyArMTA5MCw2IEBACiAvKiogc2VuZCBhIFRleHRDaGF0IG1lc3NhZ2UgdG8gYSBjbGllbnQgKi8KIGV4dGVybiByZmJCb29sIHJmYlNlbmRUZXh0Q2hhdE1lc3NhZ2UocmZiQ2xpZW50UHRyIGNsLCB1aW50MzJfdCBsZW5ndGgsIGNoYXIgKmJ1ZmZlcik7CiAKLWV4dGVybiB2b2lkIHJmYlNjYWxpbmdTZXR1cChyZmJDbGllbnRQdHIgY2wsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKIC8qCiAgKiBBZGRpdGlvbnMgZm9yIFF0IGV2ZW50IGxvb3AgaW50ZWdyYXRpb24KZGlmZiAtLWdpdCBhL3JmYi9yZmJjbGllbnQuaCBiL3JmYi9yZmJjbGllbnQuaAppbmRleCAwZWNjNWU0Li5hZWRiNGY0IDEwMDY0NAotLS0gYS9yZmIvcmZiY2xpZW50LmgKKysrIGIvcmZiL3JmYmNsaWVudC5oCkBAIC0zMSw2ICszMSwxMCBAQAogICogQGZpbGUgcmZiY2xpZW50LmgKICAqLwogCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAvKiBQcmV2ZW50IGxvYWRpbmcgYW55IFdpbnNvY2sgMS54IGhlYWRlcnMgZnJvbSB3aW5kb3dzLmggKi8KKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTM0Niw2ICszNTAsMTAgQEAKICAgICAgICAgaW50IGxpc3RlbjZTb2NrOwogICAgICAgICBjaGFyKiBsaXN0ZW42QWRkcmVzczsKICAgICAgICAgaW50IGxpc3RlbjZQb3J0OworCisgICAgICAgIC8qIE91dHB1dCBXaW5kb3cgSUQuIFdoZW4gc2V0LCBjbGllbnQgYXBwbGljYXRpb24gZW5hYmxlcyBsaWJ2bmNjbGllbnQgdG8gcGVyZm9ybSBkaXJlY3QgcmVuZGVyaW5nIGluIGl0cyB3aW5kb3cgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBvdXRwdXRXaW5kb3c7CisKIH0gcmZiQ2xpZW50OwogCiAvKiBjdXJzb3IuYyAqLwpkaWZmIC0tZ2l0IGEvcmZiL3JmYmNvbmZpZy5oLmNtYWtlIGIvcmZiL3JmYmNvbmZpZy5oLmNtYWtlCmluZGV4IGIwOTU5NDguLjNlMzE1NWIgMTAwNjQ0Ci0tLSBhL3JmYi9yZmJjb25maWcuaC5jbWFrZQorKysgYi9yZmIvcmZiY29uZmlnLmguY21ha2UKQEAgLTksNiArOSw5IEBACiAvKiB3b3JrIGFyb3VuZCB3aGVuIHdyaXRlKCkgcmV0dXJucyBFTk9FTlQgYnV0IGRvZXMgbm90IG1lYW4gaXQgKi8KICNjbWFrZWRlZmluZSBMSUJWTkNTRVJWRVJfRU5PRU5UX1dPUktBUk9VTkQgMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGVuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9FTkRJQU5fSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfRkNOVExfSCAgMSAKIApAQCAtMzAsNiArMzMsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX05FVElORVRfSU5fSCAgMSAKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZW5kaWFuLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19FTkRJQU5fSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfU09DS0VUX0ggIDEgCiAKQEAgLTU2LDYgKzYyLDEwIEBACiAKIC8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiAjZGVmaW5lIExJQlZOQ1NFUlZFUl9QQUNLQUdFX1ZFUlNJT04gICJAUEFDS0FHRV9WRVJTSU9OQCIKKyNkZWZpbmUgTElCVk5DU0VSVkVSX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgorI2RlZmluZSBMSUJWTkNTRVJWRVJfVkVSU0lPTl9NQUpPUiAiQFZFUlNJT05fTUFKT1JAIgorI2RlZmluZSBMSUJWTkNTRVJWRVJfVkVSU0lPTl9NSU5PUiAiQFZFUlNJT05fTUlOT1JAIgorI2RlZmluZSBMSUJWTkNTRVJWRVJfVkVSU0lPTl9QQVRDSExFVkVMICJAVkVSU0lPTl9QQVRDSExFVkVMQCIKIAogLyogRGVmaW5lIHRvIDEgaWYgbGliZ2NyeXB0IGlzIHByZXNlbnQgKi8KICNjbWFrZWRlZmluZSBMSUJWTkNTRVJWRVJfV0lUSF9DTElFTlRfR0NSWVBUIDEKQEAgLTcxLDEzICs4MSwxMyBAQAogI2NtYWtlZGVmaW5lIExJQlZOQ1NFUlZFUl9XT1JEU19CSUdFTkRJQU4gMQogCiAvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KLS8vI2NtYWtlZGVmaW5lIGNvbnN0IEBDTUFLRV9DT05TVEAKKy8qICNjbWFrZWRlZmluZSBjb25zdCBAQ01BS0VfQ09OU1RAICovCiAKIC8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgogICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCi0vLyNpZm5kZWYgX19jcGx1c3BsdXMKLS8vI2NtYWtlZGVmaW5lIGlubGluZSBAQ01BS0VfSU5MSU5FQAotLy8jZW5kaWYKKy8qICNpZm5kZWYgX19jcGx1c3BsdXMgKi8KKy8qICNjbWFrZWRlZmluZSBpbmxpbmUgQENNQUtFX0lOTElORUAgKi8KKy8qICNlbmRpZiAqLwogCiAvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9MSUJWTkNTRVJWRVJfUElEX1QgMQpkaWZmIC0tZ2l0IGEvcmZiL3JmYnByb3RvLmggYi9yZmIvcmZicHJvdG8uaAppbmRleCBhY2IyZTdiLi40MTY5ZmQ2IDEwMDY0NAotLS0gYS9yZmIvcmZicHJvdG8uaAorKysgYi9yZmIvcmZicHJvdG8uaApAQCAtNjUsNyArNjUsNyBAQAogI2RlZmluZSBMSUJWTkNTRVJWRVJfV09SRFNfQklHRU5ESUFOCiAjZGVmaW5lIHJmYkJvb2wgaW50CiAjaW5jbHVkZSA8c3lzL3RpbWViLmg+Ci0jaW5jbHVkZSA8d2luc29jay5oPgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CiAjdW5kZWYgU09DS0VUCiAjZGVmaW5lIFNPQ0tFVCBpbnQKICNlbHNlCkBAIC0xMDgsNiArMTA4LDEwIEBACiAjZGVmaW5lIFRSVUUgLTEKICNlbmRpZgogCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCiB0eXBlZGVmIHVpbnQzMl90IHJmYktleVN5bTsKIHR5cGVkZWYgdWludDMyX3QgcmZiUGl4ZWw7CiAKQEAgLTQ0Miw2ICs0NDYsOCBAQAogI2RlZmluZSByZmJFbmNvZGluZ1pSTEUgMTYKICNkZWZpbmUgcmZiRW5jb2RpbmdaWVdSTEUgMTcKIAorI2RlZmluZSByZmJFbmNvZGluZ0gyNjQgICAgICAgICAgICAgICAweDQ4MzIzNjM0CisKIC8qIENhY2hlICYgWE9SLVpsaWIgLSByZHZAMjAwMiAqLwogI2RlZmluZSByZmJFbmNvZGluZ0NhY2hlICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCiAjZGVmaW5lIHJmYkVuY29kaW5nQ2FjaGVFbmFibGUgICAgICAgICAgIDB4RkZGRjAwMDEKQEAgLTg2OSw2ICs4NzUsMjEgQEAKICNlbmRpZgogCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgKiBoMjY0IC0gaDI2NCBlbmNvZGluZy4gIFdlIGhhdmUgYW4gcmZiSDI2NEhlYWRlciBzdHJ1Y3R1cmUKKyAqIGdpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZy4gIEZpbmFsbHkgdGhlIGRhdGEgZm9sbG93cyBpcworICogaDI2NCBlbmNvZGVkIGZyYW1lLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBuQnl0ZXM7CisJdWludDMyX3Qgc2xpY2VfdHlwZTsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBoZWlnaHQ7Cit9IHJmYkgyNjRIZWFkZXI7CisKKyNkZWZpbmUgc3pfcmZiSDI2NEhlYWRlciAxNgorCisvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCiAgKiBYQ3Vyc29yIGVuY29kaW5nLiBUaGlzIGlzIGEgc3BlY2lhbCBlbmNvZGluZyB1c2VkIHRvIHRyYW5zbWl0IFgtc3R5bGUKICAqIGN1cnNvciBzaGFwZXMgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50cy4gTm90ZSB0aGF0IGZvciB0aGlzIGVuY29kaW5nLAogICogY29vcmRpbmF0ZXMgaW4gcmZiRnJhbWVidWZmZXJVcGRhdGVSZWN0SGVhZGVyIHN0cnVjdHVyZSBob2xkIGhvdHNwb3QKZGlmZiAtLWdpdCBhL3JmYmNvbmZpZy5oLmluIGIvcmZiY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTAzOWUuLjAwMDAwMDAKLS0tIGEvcmZiY29uZmlnLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyogcmZiY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KLSN1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKLQotLyogRW5hYmxlIDI0IGJpdCBwZXIgcGl4ZWwgaW4gbmF0aXZlIGZyYW1lYnVmZmVyICovCi0jdW5kZWYgQUxMT1cyNEJQUAotCi0vKiB3b3JrIGFyb3VuZCB3aGVuIHdyaXRlKCkgcmV0dXJucyBFTk9FTlQgYnV0IGRvZXMgbm90IG1lYW4gaXQgKi8KLSN1bmRlZiBFTk9FTlRfV09SS0FST1VORAotCi0vKiBVc2UgZmZtcGVnIChmb3Igdm5jMm1wZykgKi8KLSN1bmRlZiBGRk1QRUcKLQotLyogQW5kcm9pZCBob3N0IHN5c3RlbSBkZXRlY3RlZCAqLwotI3VuZGVmIEhBVkVfQU5EUk9JRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0FSUEFfSU5FVF9ICi0KLS8qIEF2YWhpL21ETlMgY2xpZW50IGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX0FWQUhJCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY3J5cHQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQ1JZUFQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0RMRkNOX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGRvbid0IGhhdmUgYHZwcmludGYnIGJ1dCBkbyBoYXZlIGBfZG9wcm50LicgKi8KLSN1bmRlZiBIQVZFX0RPUFJOVAotCi0vKiBEUE1TIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9EUE1TCi0KLS8qIEZCUE0gZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX0ZCUE0KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmb3JrJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0ZPUksKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGltZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9GVElNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGV1aWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VURVVJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RuYW1lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVEhPU1ROQU1FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHduYW0nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUUFdOQU0KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwd3VpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRQV1VJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNwbmFtJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFNQTkFNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHVpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRVSUQKLQotLyogR251VExTIGxpYnJhcnkgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfR05VVExTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ3JhbnRwdCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HUkFOVFBUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5ldF9udG9hJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0lORVRfTlRPQQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluaXRncm91cHMnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfSU5JVEdST1VQUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBJUklYIFhSZWFkRGlzcGxheSBhdmFpbGFibGUgKi8KLSN1bmRlZiBIQVZFX0lSSVhfWFJFQURESVNQTEFZCi0KLS8qIGxpYmNyeXB0IGxpYnJhcnkgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfTElCQ1JZUFQKLQotLyogb3BlbnNzbCBsaWJjcnlwdG8gbGlicmFyeSBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9MSUJDUllQVE8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjeWdpcGMnIGxpYnJhcnkgKC1sY3lnaXBjKS4gKi8KLSN1bmRlZiBIQVZFX0xJQkNZR0lQQwotCi0vKiBsaWJqcGVnIHN1cHBvcnQgZW5hYmxlZCAqLwotI3VuZGVmIEhBVkVfTElCSlBFRwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbCcgbGlicmFyeSAoLWxuc2wpLiAqLwotI3VuZGVmIEhBVkVfTElCTlNMCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG5nJyBsaWJyYXJ5ICgtbHBuZykuICovCi0jdW5kZWYgSEFWRV9MSUJQTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkJyBsaWJyYXJ5ICgtbHB0aHJlYWQpLiAqLwotI3VuZGVmIEhBVkVfTElCUFRIUkVBRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLwotI3VuZGVmIEhBVkVfTElCU09DS0VUCi0KLS8qIG9wZW5zc2wgbGlic3NsIGxpYnJhcnkgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfTElCU1NMCi0KLS8qIFhEQU1BR0UgZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX0xJQlhEQU1BR0UKLQotLyogWEZJWEVTIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9MSUJYRklYRVMKLQotLyogWElORVJBTUEgZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX0xJQlhJTkVSQU1BCi0KLS8qIFhSQU5EUiBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfTElCWFJBTkRSCi0KLS8qIERFQy1YVFJBUCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfTElCWFRSQVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB6JyBsaWJyYXJ5ICgtbHopLiAqLwotI3VuZGVmIEhBVkVfTElCWgotCi0vKiBsaW51eCBmYiBkZXZpY2UgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfTElOVVhfRkJfSAotCi0vKiBsaW51eC9pbnB1dC5oIHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX0xJTlVYX0lOUFVUX0gKLQotLyogbGludXggdWlucHV0IGRldmljZSBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9MSU5VWF9VSU5QVVRfSAotCi0vKiB2aWRlbzRsaW51eCBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9MSU5VWF9WSURFT0RFVl9ICi0KLS8qIGJ1aWxkIE1hY09TIFggbmF0aXZlIGRpc3BsYXkgc3VwcG9ydCAqLwotI3VuZGVmIEhBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZCi0KLS8qIE1hY09TIFggT3BlbkdMIHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX01BQ09TWF9PUEVOR0xfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfTUVNTU9WRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZmlmbycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9NS0ZJRk8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX05FVERCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkVUSU5FVF9JTl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHdkLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfUFdEX0gKLQotLyogUkVDT1JEIGV4dGVuc2lvbiBidWlsZCBlbnZpcm9ubWVudCBwcmVzZW50ICovCi0jdW5kZWYgSEFWRV9SRUNPUkQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZWxlY3QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VMRUNUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZWdpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRFR0lECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZXVpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRFVUlECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z2lkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVEdJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHBncnAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUUEdSUAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRTSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1aWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUVUlECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dXR4ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVFVUWEVOVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNobWF0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NITUFUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc29ja2V0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NPQ0tFVAotCi0vKiBTb2xhcmlzIFhSZWFkU2NyZWVuIGF2YWlsYWJsZSAqLwotI3VuZGVmIEhBVkVfU09MQVJJU19YUkVBRFNDUkVFTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBgc3RhdCcgaGFzIHRoZSBidWcgdGhhdCBpdCBzdWNjZWVkcyB3aGVuIGdpdmVuIHRoZQotICAgemVyby1sZW5ndGggZmlsZSBuYW1lIGFyZ3VtZW50LiAqLwotI3VuZGVmIEhBVkVfU1RBVF9FTVBUWV9TVFJJTkdfQlVHCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjc3BuJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUUkNTUE4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJGVElNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnN0cicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJTVFIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNsb2cuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNMT0dfSAotCi0vKiBVc2UgdGhlIHN5c3RlbSBsaWJ2bmNzZXJ2ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHgxMXZuYy4gKi8KLSN1bmRlZiBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfSU9DVExfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVFJPUFRTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19XQUlUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtaW9zLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVEVSTUlPU19ICi0KLS8qIERlZmluZSB0byAxIGlmIGNvbXBpbGVyIHN1cHBvcnRzIF9fdGhyZWFkICovCi0jdW5kZWYgSEFWRV9UTFMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0bXB4Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVVRNUFhfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZmb3JrJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1ZGT1JLCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dmZvcmsuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9WRk9SS19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9WUFJJTlRGCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdHBpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9XQUlUUElECi0KLS8qIERlZmluZSB0byAxIGlmIGBmb3JrJyB3b3Jrcy4gKi8KLSN1bmRlZiBIQVZFX1dPUktJTkdfRk9SSwotCi0vKiBEZWZpbmUgdG8gMSBpZiBgdmZvcmsnIHdvcmtzLiAqLwotI3VuZGVmIEhBVkVfV09SS0lOR19WRk9SSwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdzMnRjcGlwLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfV1MyVENQSVBfSAotCi0vKiBYMTEgYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfWDExCi0KLS8qIG9wZW4gc3NsIFg1MDlfcHJpbnRfZXhfZnAgYXZhaWxhYmxlICovCi0jdW5kZWYgSEFWRV9YNTA5X1BSSU5UX0VYX0ZQCi0KLS8qIFhLRVlCT0FSRCBleHRlbnNpb24gYnVpbGQgZW52aXJvbm1lbnQgcHJlc2VudCAqLwotI3VuZGVmIEhBVkVfWEtFWUJPQVJECi0KLS8qIE1JVC1TSE0gZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX1hTSE0KLQotLyogWFRFU1QgZXh0ZW5zaW9uIGJ1aWxkIGVudmlyb25tZW50IHByZXNlbnQgKi8KLSN1bmRlZiBIQVZFX1hURVNUCi0KLS8qIFhURVNUIGV4dGVuc2lvbiBoYXMgWFRlc3RHcmFiQ29udHJvbCAqLwotI3VuZGVmIEhBVkVfWFRFU1RHUkFCQ09OVFJPTAotCi0vKiBFbmFibGUgSVB2NiBzdXBwb3J0ICovCi0jdW5kZWYgSVB2NgotCi0vKiBEZWZpbmUgdG8gMSBpZiBgbHN0YXQnIGRlcmVmZXJlbmNlcyBhIHN5bWxpbmsgc3BlY2lmaWVkIHdpdGggYSB0cmFpbGluZwotICAgc2xhc2guICovCi0jdW5kZWYgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksKLQotLyogTmVlZCBhIHR5cGVkZWYgZm9yIGluX2FkZHJfdCAqLwotI3VuZGVmIE5FRURfSU5BRERSX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci4gKi8KLSN1bmRlZiBOT19NSU5VU19DX01JTlVTX08KLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9VUkwKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGNoYXIgKi8KLSN1bmRlZiBTSVpFT0ZfQ0hBUgotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgaW50ICovCi0jdW5kZWYgU0laRU9GX0lOVAotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgbG9uZyAqLwotI3VuZGVmIFNJWkVPRl9MT05HCi0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdHlwZSBzaG9ydCAqLwotI3VuZGVmIFNJWkVPRl9TSE9SVAotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgdm9pZCogKi8KLSN1bmRlZiBTSVpFT0ZfVk9JRFAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLwotI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBFbmFibGUgc3VwcG9ydCBmb3IgbGliZ2NyeXB0IGluIGxpYnZuY2NsaWVudCAqLwotI3VuZGVmIFdJVEhfQ0xJRU5UX0dDUllQVAotCi0vKiBEaXNhYmxlIFRpZ2h0Vk5DRmlsZVRyYW5zZmVyIHByb3RvY29sICovCi0jdW5kZWYgV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIKLQotLyogRGlzYWJsZSBXZWJTb2NrZXRzIHN1cHBvcnQgKi8KLSN1bmRlZiBXSVRIX1dFQlNPQ0tFVFMKLQotLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0Ci0gICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KLSNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAotIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCi0jICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKLSMgZW5kaWYKLSNlbHNlCi0jIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KLSMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgbWlzc2luZyBvciBub3QgYmVpbmcgdXNlZC4gKi8KLSN1bmRlZiBYX0RJU1BMQVlfTUlTU0lORwotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKLSAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotI3VuZGVmIGlubGluZQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KLSN1bmRlZiBwaWRfdAotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIFRoZSB0eXBlIGZvciBzb2NrbGVuICovCi0jdW5kZWYgc29ja2xlbl90Ci0KLS8qIERlZmluZSBhcyBgZm9yaycgaWYgYHZmb3JrJyBkb2VzIG5vdCB3b3JrLiAqLwotI3VuZGVmIHZmb3JrCmRpZmYgLS1naXQgYS9zdGFtcC1oMSBiL3N0YW1wLWgxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU4OWFiLi4wMDAwMDAwCi0tLSBhL3N0YW1wLWgxCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wIGZvciByZmJjb25maWcuaApkaWZmIC0tZ2l0IGEvdGVzdC8uZGVwcy9ibG9vcHRlc3QuUG8gYi90ZXN0Ly5kZXBzL2Jsb29wdGVzdC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5kZXBzL2Jsb29wdGVzdC5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3Rlc3QvLmRlcHMvYm1wLlBvIGIvdGVzdC8uZGVwcy9ibXAuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvdGVzdC8uZGVwcy9ibXAuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS90ZXN0Ly5kZXBzL2NhcmdzdGVzdC5QbyBiL3Rlc3QvLmRlcHMvY2FyZ3N0ZXN0LlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvLmRlcHMvY2FyZ3N0ZXN0LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvdGVzdC8uZGVwcy9jb3B5cmVjdHRlc3QuUG8gYi90ZXN0Ly5kZXBzL2NvcHlyZWN0dGVzdC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5kZXBzL2NvcHlyZWN0dGVzdC5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3Rlc3QvLmRlcHMvY3Vyc29ydGVzdC5QbyBiL3Rlc3QvLmRlcHMvY3Vyc29ydGVzdC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5kZXBzL2N1cnNvcnRlc3QuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS90ZXN0Ly5kZXBzL2VuY29kaW5nc3Rlc3QuUG8gYi90ZXN0Ly5kZXBzL2VuY29kaW5nc3Rlc3QuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvdGVzdC8uZGVwcy9lbmNvZGluZ3N0ZXN0LlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvdGVzdC8uZGVwcy90amJlbmNoLlBvIGIvdGVzdC8uZGVwcy90amJlbmNoLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvLmRlcHMvdGpiZW5jaC5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3Rlc3QvLmRlcHMvdGp1bml0dGVzdC5QbyBiL3Rlc3QvLmRlcHMvdGp1bml0dGVzdC5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5kZXBzL3RqdW5pdHRlc3QuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS90ZXN0Ly5kZXBzL3RqdXRpbC5QbyBiL3Rlc3QvLmRlcHMvdGp1dGlsLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvLmRlcHMvdGp1dGlsLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvdGVzdC8uZGVwcy90dXJib2pwZWcuUG8gYi90ZXN0Ly5kZXBzL3R1cmJvanBlZy5QbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMDZhOC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5kZXBzL3R1cmJvanBlZy5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUgYi90ZXN0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRlODM2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIHRlc3QvTWFrZWZpbGUuICBHZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi0KLQotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0xpYlZOQ1NlcnZlcgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9MaWJWTkNTZXJ2ZXIKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotbm9pbnN0X1BST0dSQU1TID0gdGp1bml0dGVzdCQoRVhFRVhUKSBcCi0JdGpiZW5jaCQoRVhFRVhUKQotY2hlY2tfUFJPR1JBTVMgPSAkKGFtX19FWEVFWFRfMSkgY2FyZ3N0ZXN0JChFWEVFWFQpIFwKLQljb3B5cmVjdHRlc3QkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzIpIGN1cnNvcnRlc3QkKEVYRUVYVCkKLXN1YmRpciA9IHRlc3QKLURJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1hbV9fRVhFRVhUXzEgPSBlbmNvZGluZ3N0ZXN0JChFWEVFWFQpCi1hbV9fRVhFRVhUXzIgPSBibG9vcHRlc3QkKEVYRUVYVCkKLVBST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCi1ibG9vcHRlc3RfU09VUkNFUyA9IGJsb29wdGVzdC5jCi1ibG9vcHRlc3RfT0JKRUNUUyA9IGJsb29wdGVzdC4kKE9CSkVYVCkKLWJsb29wdGVzdF9MREFERCA9ICQoTERBREQpCi1ibG9vcHRlc3RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBcCi0JLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfJChWKSkKLWFtX192X2x0XyA9ICQoYW1fX3ZfbHRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9sdF8wID0gLS1zaWxlbnQKLWNhcmdzdGVzdF9TT1VSQ0VTID0gY2FyZ3N0ZXN0LmMKLWNhcmdzdGVzdF9PQkpFQ1RTID0gY2FyZ3N0ZXN0LiQoT0JKRVhUKQotY2FyZ3N0ZXN0X0xEQUREID0gJChMREFERCkKLWNhcmdzdGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLQkuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1jb3B5cmVjdHRlc3RfU09VUkNFUyA9IGNvcHlyZWN0dGVzdC5jCi1jb3B5cmVjdHRlc3RfT0JKRUNUUyA9IGNvcHlyZWN0dGVzdC4kKE9CSkVYVCkKLWFtX19ERVBFTkRFTkNJRVNfMSA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgXAotCS4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLWNvcHlyZWN0dGVzdF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKLWN1cnNvcnRlc3RfU09VUkNFUyA9IGN1cnNvcnRlc3QuYwotY3Vyc29ydGVzdF9PQkpFQ1RTID0gY3Vyc29ydGVzdC4kKE9CSkVYVCkKLWN1cnNvcnRlc3RfTERBREQgPSAkKExEQUREKQotY3Vyc29ydGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLQkuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1lbmNvZGluZ3N0ZXN0X1NPVVJDRVMgPSBlbmNvZGluZ3N0ZXN0LmMKLWVuY29kaW5nc3Rlc3RfT0JKRUNUUyA9IGVuY29kaW5nc3Rlc3QuJChPQkpFWFQpCi1lbmNvZGluZ3N0ZXN0X0xEQUREID0gJChMREFERCkKLWVuY29kaW5nc3Rlc3RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBcCi0JLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYQotYW1fX3RqYmVuY2hfU09VUkNFU19ESVNUID0gdGpiZW5jaC5jIC4uL2NvbW1vbi90dXJib2pwZWcuYyBcCi0JLi4vY29tbW9uL3R1cmJvanBlZy5oIHRqdXRpbC5jIHRqdXRpbC5oIGJtcC5jIGJtcC5oCi1hbV90amJlbmNoX09CSkVDVFMgPSB0amJlbmNoLiQoT0JKRVhUKSBcCi0JdHVyYm9qcGVnLiQoT0JKRVhUKSB0anV0aWwuJChPQkpFWFQpIFwKLQlibXAuJChPQkpFWFQpCi10amJlbmNoX09CSkVDVFMgPSAkKGFtX3RqYmVuY2hfT0JKRUNUUykKLXRqYmVuY2hfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpCi1hbV9fdGp1bml0dGVzdF9TT1VSQ0VTX0RJU1QgPSB0anVuaXR0ZXN0LmMgLi4vY29tbW9uL3R1cmJvanBlZy5jIFwKLQkuLi9jb21tb24vdHVyYm9qcGVnLmggdGp1dGlsLmMgdGp1dGlsLmgKLWFtX3RqdW5pdHRlc3RfT0JKRUNUUyA9IHRqdW5pdHRlc3QuJChPQkpFWFQpIFwKLQl0dXJib2pwZWcuJChPQkpFWFQpIHRqdXRpbC4kKE9CSkVYVCkKLXRqdW5pdHRlc3RfT0JKRUNUUyA9ICQoYW1fdGp1bml0dGVzdF9PQkpFQ1RTKQotdGp1bml0dGVzdF9MREFERCA9ICQoTERBREQpCi10anVuaXR0ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgXAotCS4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9IGJsb29wdGVzdC5jIGNhcmdzdGVzdC5jIGNvcHlyZWN0dGVzdC5jIGN1cnNvcnRlc3QuYyBcCi0JZW5jb2RpbmdzdGVzdC5jICQodGpiZW5jaF9TT1VSQ0VTKSAkKHRqdW5pdHRlc3RfU09VUkNFUykKLURJU1RfU09VUkNFUyA9IGJsb29wdGVzdC5jIGNhcmdzdGVzdC5jIGNvcHlyZWN0dGVzdC5jIGN1cnNvcnRlc3QuYyBcCi0JZW5jb2RpbmdzdGVzdC5jICQoYW1fX3RqYmVuY2hfU09VUkNFU19ESVNUKSBcCi0JJChhbV9fdGp1bml0dGVzdF9TT1VSQ0VTX0RJU1QpCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYWNsb2NhbC0xLjExCi1BTVRBUiA9ICQke1RBUi10YXJ9Ci1BTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IDAKLUFSID0gL3Vzci9iaW4vYXIKLUFTID0gYXMKLUFVVE9DT05GID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9jb25mCi1BVVRPSEVBREVSID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKLUFVVE9NQUtFID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLTEuMTEKLUFWQUhJX0NGTEFHUyA9IAotQVZBSElfTElCUyA9IAotQVdLID0gbWF3awotQ0MgPSBnY2MKLUNDREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ0ZMQUdTID0gLWcgLU8yIC1XYWxsICAKLUNQUCA9IGdjYyAtRQotQ1BQRkxBR1MgPSAKLUNSWVBUX0xJQlMgPSAtbGNyeXB0Ci1DWFggPSBnKysKLUNYWENQUCA9IGcrKyAtRQotQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ1hYRkxBR1MgPSAtZyAtTzIKLUNZR1BBVEhfVyA9IGVjaG8KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLURFUERJUiA9IC5kZXBzCi1ETExUT09MID0gZGxsdG9vbAotRUNITyA9IGVjaG8KLUVDSE9fQyA9IAotRUNIT19OID0gLW4KLUVDSE9fVCA9IAotRUdSRVAgPSAvYmluL2dyZXAgLUUKLUVYRUVYVCA9IAotRjc3ID0gCi1GRkxBR1MgPSAKLUdOVVRMU19DRkxBR1MgPSAKLUdOVVRMU19MSUJTID0gCi1HUkVQID0gL2Jpbi9ncmVwCi1HVEtfQ0ZMQUdTID0gCi1HVEtfTElCUyA9IAotSU5TVEFMTCA9IC91c3IvYmluL2luc3RhbGwgLWMKLUlOU1RBTExfREFUQSA9ICR7SU5TVEFMTH0gLW0gNjQ0Ci1JTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMgLXMKLUpQRUdfTERGTEFHUyA9IAotTERGTEFHUyA9IAotTElCR0NSWVBUX0NGTEFHUyA9IAotTElCR0NSWVBUX0NPTkZJRyA9IG5vCi1MSUJHQ1JZUFRfTElCUyA9IAotTElCT0JKUyA9IAotTElCUyA9IC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgCi1MSUJUT09MID0gJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wKLUxOX1MgPSBsbiAtcwotTFRMSUJPQkpTID0gCi1NQUtFSU5GTyA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBtYWtlaW5mbwotTUtESVJfUCA9IC9iaW4vbWtkaXIgLXAKLU9CSkRVTVAgPSBvYmpkdW1wCi1PQkpFWFQgPSBvCi1QQUNLQUdFID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX0JVR1JFUE9SVCA9IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyCi1QQUNLQUdFX05BTUUgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfU1RSSU5HID0gTGliVk5DU2VydmVyIDAuOS45Ci1QQUNLQUdFX1RBUk5BTUUgPSBsaWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfVVJMID0gCi1QQUNLQUdFX1ZFUlNJT04gPSAwLjkuOQotUEFUSF9TRVBBUkFUT1IgPSA6Ci1QS0dfQ09ORklHID0gL3Vzci9iaW4vcGtnLWNvbmZpZwotUEtHX0NPTkZJR19MSUJESVIgPSAKLVBLR19DT05GSUdfUEFUSCA9IAotUkFOTElCID0gcmFubGliCi1SUE1TT1VSQ0VESVIgPSBOT1QtRk9VTkQKLVNETF9DRkxBR1MgPSAKLVNETF9MSUJTID0gCi1TRVRfTUFLRSA9IAotU0hFTEwgPSAvYmluL2Jhc2gKLVNTTF9MSUJTID0gCi1TVFJJUCA9IHN0cmlwCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyA9IAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gCi1WRVJTSU9OID0gMC45LjkKLVdTT0NLTElCID0gCi1YTUtNRiA9IAotWF9DRkxBR1MgPSAKLVhfRVhUUkFfTElCUyA9IAotWF9MSUJTID0gCi1YX1BSRV9MSUJTID0gIC1sU00gLWxJQ0UKLWFic19idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvdGVzdAotYWJzX3NyY2RpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvdGVzdAotYWJzX3RvcF9idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFic190b3Bfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWNfY3RfQ0MgPSBnY2MKLWFjX2N0X0NYWCA9IGcrKwotYWNfY3RfRjc3ID0gCi1hbV9faW5jbHVkZSA9IGluY2x1ZGUKLWFtX19sZWFkaW5nX2RvdCA9IC4KLWFtX19xdW90ZSA9IAotYW1fX3RhciA9ICQke1RBUi10YXJ9IGNob2YgLSAiJCR0YXJkaXIiCi1hbV9fdW50YXIgPSAkJHtUQVItdGFyfSB4ZiAtCi1iaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9iaW4KLWJ1aWxkID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1idWlsZF9hbGlhcyA9IAotYnVpbGRfY3B1ID0geDg2XzY0Ci1idWlsZF9vcyA9IGxpbnV4LWdudQotYnVpbGRfdmVuZG9yID0gdW5rbm93bgotYnVpbGRkaXIgPSAuCi1kYXRhZGlyID0gJHtkYXRhcm9vdGRpcn0KLWRhdGFyb290ZGlyID0gJHtwcmVmaXh9L3NoYXJlCi1kb2NkaXIgPSAke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9Ci1kdmlkaXIgPSAke2RvY2Rpcn0KLWV4ZWNfcHJlZml4ID0gJHtwcmVmaXh9Ci1ob3N0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1ob3N0X2FsaWFzID0gCi1ob3N0X2NwdSA9IHg4Nl82NAotaG9zdF9vcyA9IGxpbnV4LWdudQotaG9zdF92ZW5kb3IgPSB1bmtub3duCi1odG1sZGlyID0gJHtkb2NkaXJ9Ci1pbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLWluZm9kaXIgPSAke2RhdGFyb290ZGlyfS9pbmZvCi1pbnN0YWxsX3NoID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9pbnN0YWxsLXNoCi1saWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLWxpYmV4ZWNkaXIgPSAke2V4ZWNfcHJlZml4fS9saWJleGVjCi1sb2NhbGVkaXIgPSAke2RhdGFyb290ZGlyfS9sb2NhbGUKLWxvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCi1tYW5kaXIgPSAke2RhdGFyb290ZGlyfS9tYW4KLW1rZGlyX3AgPSAvYmluL21rZGlyIC1wCi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi1wZGZkaXIgPSAke2RvY2Rpcn0KLXByZWZpeCA9IC91c3IvbG9jYWwKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBzLHgseCwKLXBzZGlyID0gJHtkb2NkaXJ9Ci1zYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2Jpbgotc2hhcmVkc3RhdGVkaXIgPSAke3ByZWZpeH0vY29tCi1zcmNkaXIgPSAuCi1zeXNjb25mZGlyID0gJHtwcmVmaXh9L2V0YwotdGFyZ2V0X2FsaWFzID0gCi10b3BfYnVpbGRfcHJlZml4ID0gLi4vCi10b3BfYnVpbGRkaXIgPSAuLgotdG9wX3NyY2RpciA9IC4uCi13aXRoX2ZmbXBlZyA9IAotdGp1bml0dGVzdF9TT1VSQ0VTID0gdGp1bml0dGVzdC5jIC4uL2NvbW1vbi90dXJib2pwZWcuYyAuLi9jb21tb24vdHVyYm9qcGVnLmggXAotCXRqdXRpbC5jIHRqdXRpbC5oCi0KLXRqYmVuY2hfU09VUkNFUyA9IHRqYmVuY2guYyAuLi9jb21tb24vdHVyYm9qcGVnLmMgLi4vY29tbW9uL3R1cmJvanBlZy5oIFwKLQl0anV0aWwuYyB0anV0aWwuaCBibXAuYyBibXAuaAotCi10amJlbmNoX0xEQUREID0gJChMREFERCkgLWxtCi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvY29tbW9uCi1MREFERCA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYSAKLUJBQ0tHUk9VTkRfVEVTVCA9IGJsb29wdGVzdAotRU5DT0RJTkdTX1RFU1QgPSBlbmNvZGluZ3N0ZXN0Ci1jb3B5cmVjdHRlc3RfTERBREQgPSAkKExEQUREKSAtbG0KLWFsbDogYWxsLWFtCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCi0JICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdGVzdC9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSB0ZXN0L01ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLQotY2xlYW4tY2hlY2tQUk9HUkFNUzoKLQlAbGlzdD0nJChjaGVja19QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKLQl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAotCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdAotYmxvb3B0ZXN0JChFWEVFWFQpOiAkKGJsb29wdGVzdF9PQkpFQ1RTKSAkKGJsb29wdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfYmxvb3B0ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGJsb29wdGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChibG9vcHRlc3RfT0JKRUNUUykgJChibG9vcHRlc3RfTERBREQpICQoTElCUykKLWNhcmdzdGVzdCQoRVhFRVhUKTogJChjYXJnc3Rlc3RfT0JKRUNUUykgJChjYXJnc3Rlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2NhcmdzdGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBjYXJnc3Rlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoY2FyZ3N0ZXN0X09CSkVDVFMpICQoY2FyZ3N0ZXN0X0xEQUREKSAkKExJQlMpCi1jb3B5cmVjdHRlc3QkKEVYRUVYVCk6ICQoY29weXJlY3R0ZXN0X09CSkVDVFMpICQoY29weXJlY3R0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9jb3B5cmVjdHRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgY29weXJlY3R0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGNvcHlyZWN0dGVzdF9PQkpFQ1RTKSAkKGNvcHlyZWN0dGVzdF9MREFERCkgJChMSUJTKQotY3Vyc29ydGVzdCQoRVhFRVhUKTogJChjdXJzb3J0ZXN0X09CSkVDVFMpICQoY3Vyc29ydGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfY3Vyc29ydGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBjdXJzb3J0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGN1cnNvcnRlc3RfT0JKRUNUUykgJChjdXJzb3J0ZXN0X0xEQUREKSAkKExJQlMpCi1lbmNvZGluZ3N0ZXN0JChFWEVFWFQpOiAkKGVuY29kaW5nc3Rlc3RfT0JKRUNUUykgJChlbmNvZGluZ3N0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9lbmNvZGluZ3N0ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGVuY29kaW5nc3Rlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoZW5jb2RpbmdzdGVzdF9PQkpFQ1RTKSAkKGVuY29kaW5nc3Rlc3RfTERBREQpICQoTElCUykKLXRqYmVuY2gkKEVYRUVYVCk6ICQodGpiZW5jaF9PQkpFQ1RTKSAkKHRqYmVuY2hfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3RqYmVuY2hfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgdGpiZW5jaCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh0amJlbmNoX09CSkVDVFMpICQodGpiZW5jaF9MREFERCkgJChMSUJTKQotdGp1bml0dGVzdCQoRVhFRVhUKTogJCh0anVuaXR0ZXN0X09CSkVDVFMpICQodGp1bml0dGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfdGp1bml0dGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiB0anVuaXR0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKHRqdW5pdHRlc3RfT0JKRUNUUykgJCh0anVuaXR0ZXN0X0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLWluY2x1ZGUgLi8kKERFUERJUikvYmxvb3B0ZXN0LlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2JtcC5QbwotaW5jbHVkZSAuLyQoREVQRElSKS9jYXJnc3Rlc3QuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvY29weXJlY3R0ZXN0LlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2N1cnNvcnRlc3QuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvZW5jb2RpbmdzdGVzdC5QbwotaW5jbHVkZSAuLyQoREVQRElSKS90amJlbmNoLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL3RqdW5pdHRlc3QuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvdGp1dGlsLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL3R1cmJvanBlZy5QbwotCi0uYy5vOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotIwkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci0JJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLQkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotdHVyYm9qcGVnLm86IC4uL2NvbW1vbi90dXJib2pwZWcuYwotCSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdHVyYm9qcGVnLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3R1cmJvanBlZy5UcG8gLWMgLW8gdHVyYm9qcGVnLm8gYHRlc3QgLWYgJy4uL2NvbW1vbi90dXJib2pwZWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3R1cmJvanBlZy5jCi0JJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdHVyYm9qcGVnLlRwbyAkKERFUERJUikvdHVyYm9qcGVnLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9Jy4uL2NvbW1vbi90dXJib2pwZWcuYycgb2JqZWN0PSd0dXJib2pwZWcubycgbGlidG9vbD1ubyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdHVyYm9qcGVnLm8gYHRlc3QgLWYgJy4uL2NvbW1vbi90dXJib2pwZWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgLi4vY29tbW9uL3R1cmJvanBlZy5jCi0KLXR1cmJvanBlZy5vYmo6IC4uL2NvbW1vbi90dXJib2pwZWcuYwotCSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdHVyYm9qcGVnLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvdHVyYm9qcGVnLlRwbyAtYyAtbyB0dXJib2pwZWcub2JqIGBpZiB0ZXN0IC1mICcuLi9jb21tb24vdHVyYm9qcGVnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnLi4vY29tbW9uL3R1cmJvanBlZy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS8uLi9jb21tb24vdHVyYm9qcGVnLmMnOyBmaWAKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90dXJib2pwZWcuVHBvICQoREVQRElSKS90dXJib2pwZWcuUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL3R1cmJvanBlZy5jJyBvYmplY3Q9J3R1cmJvanBlZy5vYmonIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHR1cmJvanBlZy5vYmogYGlmIHRlc3QgLWYgJy4uL2NvbW1vbi90dXJib2pwZWcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICcuLi9jb21tb24vdHVyYm9qcGVnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLy4uL2NvbW1vbi90dXJib2pwZWcuYyc7IGZpYAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkKGNoZWNrX1BST0dSQU1TKQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZHZpLWFtOgotCi1pbnN0YWxsLWV4ZWMtYW06Ci0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcGRmLWFtOgotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6IGNoZWNrLWFtIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gXAotCWNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQljbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAotCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKLQlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAotCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCi0JaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAotCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKLQl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotCi10ZXN0OiBlbmNvZGluZ3N0ZXN0JChFWEVFWFQpIGNhcmdzdGVzdCQoRVhFRVhUKSBjb3B5cmVjdHRlc3QkKEVYRUVYVCkKLQkuL2VuY29kaW5nc3Rlc3QgJiYgLi9jYXJnc3Rlc3QKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggODA4ZWJmMy4uM2IxOWQ2MSAxMDA2NDQKLS0tIGEvdGVzdC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L01ha2VmaWxlLmFtCkBAIC05LDcgKzksNyBAQAogdGpiZW5jaF9MREFERD0kKExEQUREKSAtbG0KIGVuZGlmCiAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9jb21tb24KIExEQUREID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSAuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhIEBXU09DS0xJQkAKIAogaWYgSEFWRV9MSUJQVEhSRUFECmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlLmluIGIvdGVzdC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNWM4My4uMDAwMDAwMAotLS0gYS90ZXN0L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLUBIQVZFX0xJQkpQRUdfVFJVRUBub2luc3RfUFJPR1JBTVMgPSB0anVuaXR0ZXN0JChFWEVFWFQpIFwKLUBIQVZFX0xJQkpQRUdfVFJVRUAJdGpiZW5jaCQoRVhFRVhUKQotY2hlY2tfUFJPR1JBTVMgPSAkKGFtX19FWEVFWFRfMSkgY2FyZ3N0ZXN0JChFWEVFWFQpIFwKLQljb3B5cmVjdHRlc3QkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzIpIGN1cnNvcnRlc3QkKEVYRUVYVCkKLXN1YmRpciA9IHRlc3QKLURJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1ASEFWRV9MSUJQVEhSRUFEX1RSVUVAYW1fX0VYRUVYVF8xID0gZW5jb2RpbmdzdGVzdCQoRVhFRVhUKQotQEhBVkVfTElCUFRIUkVBRF9UUlVFQGFtX19FWEVFWFRfMiA9IGJsb29wdGVzdCQoRVhFRVhUKQotUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKLWJsb29wdGVzdF9TT1VSQ0VTID0gYmxvb3B0ZXN0LmMKLWJsb29wdGVzdF9PQkpFQ1RTID0gYmxvb3B0ZXN0LiQoT0JKRVhUKQotYmxvb3B0ZXN0X0xEQUREID0gJChMREFERCkKLWJsb29wdGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLQkuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1BTV9WX2x0ID0gJChhbV9fdl9sdF9AQU1fVkApCi1hbV9fdl9sdF8gPSAkKGFtX192X2x0X0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfbHRfMCA9IC0tc2lsZW50Ci1jYXJnc3Rlc3RfU09VUkNFUyA9IGNhcmdzdGVzdC5jCi1jYXJnc3Rlc3RfT0JKRUNUUyA9IGNhcmdzdGVzdC4kKE9CSkVYVCkKLWNhcmdzdGVzdF9MREFERCA9ICQoTERBREQpCi1jYXJnc3Rlc3RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBcCi0JLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYQotY29weXJlY3R0ZXN0X1NPVVJDRVMgPSBjb3B5cmVjdHRlc3QuYwotY29weXJlY3R0ZXN0X09CSkVDVFMgPSBjb3B5cmVjdHRlc3QuJChPQkpFWFQpCi1hbV9fREVQRU5ERU5DSUVTXzEgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLQkuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1jb3B5cmVjdHRlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpCi1jdXJzb3J0ZXN0X1NPVVJDRVMgPSBjdXJzb3J0ZXN0LmMKLWN1cnNvcnRlc3RfT0JKRUNUUyA9IGN1cnNvcnRlc3QuJChPQkpFWFQpCi1jdXJzb3J0ZXN0X0xEQUREID0gJChMREFERCkKLWN1cnNvcnRlc3RfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBcCi0JLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYQotZW5jb2RpbmdzdGVzdF9TT1VSQ0VTID0gZW5jb2RpbmdzdGVzdC5jCi1lbmNvZGluZ3N0ZXN0X09CSkVDVFMgPSBlbmNvZGluZ3N0ZXN0LiQoT0JKRVhUKQotZW5jb2RpbmdzdGVzdF9MREFERCA9ICQoTERBREQpCi1lbmNvZGluZ3N0ZXN0X0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgXAotCS4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLWFtX190amJlbmNoX1NPVVJDRVNfRElTVCA9IHRqYmVuY2guYyAuLi9jb21tb24vdHVyYm9qcGVnLmMgXAotCS4uL2NvbW1vbi90dXJib2pwZWcuaCB0anV0aWwuYyB0anV0aWwuaCBibXAuYyBibXAuaAotQEhBVkVfTElCSlBFR19UUlVFQGFtX3RqYmVuY2hfT0JKRUNUUyA9IHRqYmVuY2guJChPQkpFWFQpIFwKLUBIQVZFX0xJQkpQRUdfVFJVRUAJdHVyYm9qcGVnLiQoT0JKRVhUKSB0anV0aWwuJChPQkpFWFQpIFwKLUBIQVZFX0xJQkpQRUdfVFJVRUAJYm1wLiQoT0JKRVhUKQotdGpiZW5jaF9PQkpFQ1RTID0gJChhbV90amJlbmNoX09CSkVDVFMpCi1ASEFWRV9MSUJKUEVHX1RSVUVAdGpiZW5jaF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKLWFtX190anVuaXR0ZXN0X1NPVVJDRVNfRElTVCA9IHRqdW5pdHRlc3QuYyAuLi9jb21tb24vdHVyYm9qcGVnLmMgXAotCS4uL2NvbW1vbi90dXJib2pwZWcuaCB0anV0aWwuYyB0anV0aWwuaAotQEhBVkVfTElCSlBFR19UUlVFQGFtX3RqdW5pdHRlc3RfT0JKRUNUUyA9IHRqdW5pdHRlc3QuJChPQkpFWFQpIFwKLUBIQVZFX0xJQkpQRUdfVFJVRUAJdHVyYm9qcGVnLiQoT0JKRVhUKSB0anV0aWwuJChPQkpFWFQpCi10anVuaXR0ZXN0X09CSkVDVFMgPSAkKGFtX3RqdW5pdHRlc3RfT0JKRUNUUykKLXRqdW5pdHRlc3RfTERBREQgPSAkKExEQUREKQotdGp1bml0dGVzdF9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLQkuLi9saWJ2bmNjbGllbnQvbGlidm5jY2xpZW50LmxhCi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLWFtX19tdiA9IG12IC1mCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCi0JJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCi0JJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfQEFNX1ZAKQotYW1fX3ZfQ0NfID0gJChhbV9fdl9DQ19AQU1fREVGQVVMVF9WQCkKLWFtX192X0NDXzAgPSBAZWNobyAiICBDQyAgICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF9AQU1fVkApCi1hbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF9AQU1fREVGQVVMVF9WQCkKLWFtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLVNPVVJDRVMgPSBibG9vcHRlc3QuYyBjYXJnc3Rlc3QuYyBjb3B5cmVjdHRlc3QuYyBjdXJzb3J0ZXN0LmMgXAotCWVuY29kaW5nc3Rlc3QuYyAkKHRqYmVuY2hfU09VUkNFUykgJCh0anVuaXR0ZXN0X1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSBibG9vcHRlc3QuYyBjYXJnc3Rlc3QuYyBjb3B5cmVjdHRlc3QuYyBjdXJzb3J0ZXN0LmMgXAotCWVuY29kaW5nc3Rlc3QuYyAkKGFtX190amJlbmNoX1NPVVJDRVNfRElTVCkgXAotCSQoYW1fX3RqdW5pdHRlc3RfU09VUkNFU19ESVNUKQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVkFISV9DRkxBR1MgPSBAQVZBSElfQ0ZMQUdTQAotQVZBSElfTElCUyA9IEBBVkFISV9MSUJTQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DUllQVF9MSUJTID0gQENSWVBUX0xJQlNACi1DWFggPSBAQ1hYQAotQ1hYQ1BQID0gQENYWENQUEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1FQ0hPID0gQEVDSE9ACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1GNzcgPSBARjc3QAotRkZMQUdTID0gQEZGTEFHU0AKLUdOVVRMU19DRkxBR1MgPSBAR05VVExTX0NGTEFHU0AKLUdOVVRMU19MSUJTID0gQEdOVVRMU19MSUJTQAotR1JFUCA9IEBHUkVQQAotR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAotR1RLX0xJQlMgPSBAR1RLX0xJQlNACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUpQRUdfTERGTEFHUyA9IEBKUEVHX0xERkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJHQ1JZUFRfQ0ZMQUdTID0gQExJQkdDUllQVF9DRkxBR1NACi1MSUJHQ1JZUFRfQ09ORklHID0gQExJQkdDUllQVF9DT05GSUdACi1MSUJHQ1JZUFRfTElCUyA9IEBMSUJHQ1JZUFRfTElCU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKLVBLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAotUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKLVJBTkxJQiA9IEBSQU5MSUJACi1SUE1TT1VSQ0VESVIgPSBAUlBNU09VUkNFRElSQAotU0RMX0NGTEFHUyA9IEBTRExfQ0ZMQUdTQAotU0RMX0xJQlMgPSBAU0RMX0xJQlNACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1NMX0xJQlMgPSBAU1NMX0xJQlNACi1TVFJJUCA9IEBTVFJJUEAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdTT0NLTElCID0gQFdTT0NLTElCQAotWE1LTUYgPSBAWE1LTUZACi1YX0NGTEFHUyA9IEBYX0NGTEFHU0AKLVhfRVhUUkFfTElCUyA9IEBYX0VYVFJBX0xJQlNACi1YX0xJQlMgPSBAWF9MSUJTQAotWF9QUkVfTElCUyA9IEBYX1BSRV9MSUJTQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotd2l0aF9mZm1wZWcgPSBAd2l0aF9mZm1wZWdACi1ASEFWRV9MSUJKUEVHX1RSVUVAdGp1bml0dGVzdF9TT1VSQ0VTID0gdGp1bml0dGVzdC5jIC4uL2NvbW1vbi90dXJib2pwZWcuYyAuLi9jb21tb24vdHVyYm9qcGVnLmggXAotQEhBVkVfTElCSlBFR19UUlVFQAl0anV0aWwuYyB0anV0aWwuaAotCi1ASEFWRV9MSUJKUEVHX1RSVUVAdGpiZW5jaF9TT1VSQ0VTID0gdGpiZW5jaC5jIC4uL2NvbW1vbi90dXJib2pwZWcuYyAuLi9jb21tb24vdHVyYm9qcGVnLmggXAotQEhBVkVfTElCSlBFR19UUlVFQAl0anV0aWwuYyB0anV0aWwuaCBibXAuYyBibXAuaAotCi1ASEFWRV9MSUJKUEVHX1RSVUVAdGpiZW5jaF9MREFERCA9ICQoTERBREQpIC1sbQotSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikgLUkkKHRvcF9zcmNkaXIpL2NvbW1vbgotTERBREQgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEgQFdTT0NLTElCQAotQEhBVkVfTElCUFRIUkVBRF9UUlVFQEJBQ0tHUk9VTkRfVEVTVCA9IGJsb29wdGVzdAotQEhBVkVfTElCUFRIUkVBRF9UUlVFQEVOQ09ESU5HU19URVNUID0gZW5jb2RpbmdzdGVzdAotY29weXJlY3R0ZXN0X0xEQUREID0gJChMREFERCkgLWxtCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHRlc3QvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgdGVzdC9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLWNsZWFuLWNoZWNrUFJPR1JBTVM6Ci0JQGxpc3Q9JyQoY2hlY2tfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLWJsb29wdGVzdCQoRVhFRVhUKTogJChibG9vcHRlc3RfT0JKRUNUUykgJChibG9vcHRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2Jsb29wdGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBibG9vcHRlc3QkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoYmxvb3B0ZXN0X09CSkVDVFMpICQoYmxvb3B0ZXN0X0xEQUREKSAkKExJQlMpCi1jYXJnc3Rlc3QkKEVYRUVYVCk6ICQoY2FyZ3N0ZXN0X09CSkVDVFMpICQoY2FyZ3N0ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9jYXJnc3Rlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgY2FyZ3N0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGNhcmdzdGVzdF9PQkpFQ1RTKSAkKGNhcmdzdGVzdF9MREFERCkgJChMSUJTKQotY29weXJlY3R0ZXN0JChFWEVFWFQpOiAkKGNvcHlyZWN0dGVzdF9PQkpFQ1RTKSAkKGNvcHlyZWN0dGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfY29weXJlY3R0ZXN0X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGNvcHlyZWN0dGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChjb3B5cmVjdHRlc3RfT0JKRUNUUykgJChjb3B5cmVjdHRlc3RfTERBREQpICQoTElCUykKLWN1cnNvcnRlc3QkKEVYRUVYVCk6ICQoY3Vyc29ydGVzdF9PQkpFQ1RTKSAkKGN1cnNvcnRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2N1cnNvcnRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgY3Vyc29ydGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChjdXJzb3J0ZXN0X09CSkVDVFMpICQoY3Vyc29ydGVzdF9MREFERCkgJChMSUJTKQotZW5jb2RpbmdzdGVzdCQoRVhFRVhUKTogJChlbmNvZGluZ3N0ZXN0X09CSkVDVFMpICQoZW5jb2RpbmdzdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfZW5jb2RpbmdzdGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiBlbmNvZGluZ3N0ZXN0JChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGVuY29kaW5nc3Rlc3RfT0JKRUNUUykgJChlbmNvZGluZ3N0ZXN0X0xEQUREKSAkKExJQlMpCi10amJlbmNoJChFWEVFWFQpOiAkKHRqYmVuY2hfT0JKRUNUUykgJCh0amJlbmNoX0RFUEVOREVOQ0lFUykgJChFWFRSQV90amJlbmNoX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHRqYmVuY2gkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQodGpiZW5jaF9PQkpFQ1RTKSAkKHRqYmVuY2hfTERBREQpICQoTElCUykKLXRqdW5pdHRlc3QkKEVYRUVYVCk6ICQodGp1bml0dGVzdF9PQkpFQ1RTKSAkKHRqdW5pdHRlc3RfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3RqdW5pdHRlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgdGp1bml0dGVzdCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh0anVuaXR0ZXN0X09CSkVDVFMpICQodGp1bml0dGVzdF9MREFERCkgJChMSUJTKQotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLiQoT0JKRVhUKQotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYmxvb3B0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ibXAuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NhcmdzdGVzdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY29weXJlY3R0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jdXJzb3J0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9lbmNvZGluZ3N0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90amJlbmNoLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90anVuaXR0ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90anV0aWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3R1cmJvanBlZy5Qb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCi0KLS5jLmxvOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAotCi10dXJib2pwZWcubzogLi4vY29tbW9uL3R1cmJvanBlZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHR1cmJvanBlZy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS90dXJib2pwZWcuVHBvIC1jIC1vIHR1cmJvanBlZy5vIGB0ZXN0IC1mICcuLi9jb21tb24vdHVyYm9qcGVnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYC4uL2NvbW1vbi90dXJib2pwZWcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdHVyYm9qcGVnLlRwbyAkKERFUERJUikvdHVyYm9qcGVnLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nLi4vY29tbW9uL3R1cmJvanBlZy5jJyBvYmplY3Q9J3R1cmJvanBlZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0dXJib2pwZWcubyBgdGVzdCAtZiAnLi4vY29tbW9uL3R1cmJvanBlZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AuLi9jb21tb24vdHVyYm9qcGVnLmMKLQotdHVyYm9qcGVnLm9iajogLi4vY29tbW9uL3R1cmJvanBlZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHR1cmJvanBlZy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3R1cmJvanBlZy5UcG8gLWMgLW8gdHVyYm9qcGVnLm9iaiBgaWYgdGVzdCAtZiAnLi4vY29tbW9uL3R1cmJvanBlZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJy4uL2NvbW1vbi90dXJib2pwZWcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvLi4vY29tbW9uL3R1cmJvanBlZy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90dXJib2pwZWcuVHBvICQoREVQRElSKS90dXJib2pwZWcuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPScuLi9jb21tb24vdHVyYm9qcGVnLmMnIG9iamVjdD0ndHVyYm9qcGVnLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdHVyYm9qcGVnLm9iaiBgaWYgdGVzdCAtZiAnLi4vY29tbW9uL3R1cmJvanBlZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJy4uL2NvbW1vbi90dXJib2pwZWcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvLi4vY29tbW9uL3R1cmJvanBlZy5jJzsgZmlgCi0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoY2hlY2tfUFJPR1JBTVMpCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykKLWluc3RhbGxkaXJzOgotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICAgaW5zdGFsbDsgXAotCWVsc2UgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCi0JZmkKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBcCi0JY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgXAotCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCi0JaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCi0JaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKLQlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKLQlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCi0JaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCi0JbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAotCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQotCi0KLXRlc3Q6IGVuY29kaW5nc3Rlc3QkKEVYRUVYVCkgY2FyZ3N0ZXN0JChFWEVFWFQpIGNvcHlyZWN0dGVzdCQoRVhFRVhUKQotCS4vZW5jb2RpbmdzdGVzdCAmJiAuL2NhcmdzdGVzdAotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS90ZXN0L2JtcC5jIGIvdGVzdC9ibXAuYwppbmRleCA2ZjI3ZjZiLi43ZGNiZjEzIDEwMDY0NAotLS0gYS90ZXN0L2JtcC5jCisrKyBiL3Rlc3QvYm1wLmMKQEAgLTI4LDkgKzI4LDYgQEAKICNpbmNsdWRlICIuL3RqdXRpbC5oIgogI2luY2x1ZGUgIi4vYm1wLmgiCiAKLSNkZWZpbmUgTE9HX1RBRyAiYm1wLmMiCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCiAjZGVmaW5lIGJ5dGVzd2FwKGkpICggXAogCSgoKGkpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAogCSgoKGkpICYgMHgwMGZmMDAwMCkgPj4gIDgpIHwgXApAQCAtMzI2LDE0ICszMjMsMTQgQEAKIAlkc3RwaXRjaD0oKHcqMykrMykmKH4zKTsKIAogCWJoLmJmVHlwZT0weDRkNDI7Ci0JYmguYmZTaXplPUJNUEhEUlNJWkUrc3JjcGl0Y2gqaDsKKwliaC5iZlNpemU9Qk1QSERSU0laRStkc3RwaXRjaCpoOwogCWJoLmJmUmVzZXJ2ZWQxPTA7ICBiaC5iZlJlc2VydmVkMj0wOwogCWJoLmJmT2ZmQml0cz1CTVBIRFJTSVpFOwogCWJoLmJpU2l6ZT00MDsKIAliaC5iaVdpZHRoPXc7ICBiaC5iaUhlaWdodD1oOwotCWJoLmJpUGxhbmVzPTE7ICBiaC5iaUJpdENvdW50PTMyOworCWJoLmJpUGxhbmVzPTA7ICBiaC5iaUJpdENvdW50PTI0OwogCWJoLmJpQ29tcHJlc3Npb249QklfUkdCOyAgYmguYmlTaXplSW1hZ2U9MDsKLQliaC5iaVhQZWxzUGVyTWV0ZXI9dzsgIGJoLmJpWVBlbHNQZXJNZXRlcj1oOworCWJoLmJpWFBlbHNQZXJNZXRlcj0wOyAgYmguYmlZUGVsc1Blck1ldGVyPTA7CiAJYmguYmlDbHJVc2VkPTA7ICBiaC5iaUNsckltcG9ydGFudD0wOwogCiAJaWYoIWxpdHRsZWVuZGlhbigpKQpAQCAtMzcxLDcgKzM2OCw2IEBACiAJd3JpdGVtZShmZCwgJmJoLmJpQ2xyVXNlZCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogCXdyaXRlbWUoZmQsICZiaC5iaUNsckltcG9ydGFudCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogCi0jaWYgMAogCWlmKCh0ZW1wYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKGRzdHBpdGNoKmgpKT09TlVMTCkKIAkJX3Rocm93KCJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvciIpOwogCkBAIC0zODAsMTEgKzM3Niw2IEBACiAKIAlpZigoYnl0ZXN3cml0dGVuPXdyaXRlKGZkLCB0ZW1wYnVmLCBkc3RwaXRjaCpoKSkhPWRzdHBpdGNoKmgpCiAJCV90aHJvdyhzdHJlcnJvcihlcnJubykpOwotI2Vsc2UKLSAgICAgICAgQUxPR0koIndyaXR0aW5nIGJpdG1hcCBkYXRhICgldSBieXRlcyksIHNyY3BpdGNoID0gJWQsIGggPSAlZCIsIHNyY3BpdGNoKmgsIHNyY3BpdGNoLCBoKTsKLQlpZigoYnl0ZXN3cml0dGVuPXdyaXRlKGZkLCBidWYsIHNyY3BpdGNoKmgpKSE9c3JjcGl0Y2gqaCkKLQkJX3Rocm93KHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYKIAogCWZpbmFsbHk6CiAJaWYodGVtcGJ1ZikgZnJlZSh0ZW1wYnVmKTsKZGlmZiAtLWdpdCBhL3Rlc3QvYm1wLmggYi90ZXN0L2JtcC5oCmluZGV4IDA1NWIxZWUuLjlkMWMyNjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvYm1wLmgKKysrIGIvdGVzdC9ibXAuaApAQCAtMTMsOCArMTMsOCBAQAogICogd3hXaW5kb3dzIExpYnJhcnkgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKi8KIAotLy8gVGhpcyBwcm92aWRlcyBydWRpbWVudGFyeSBmYWNpbGl0aWVzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgdHJ1ZSBjb2xvcgotLy8gQk1QIGFuZCBQUE0gZmlsZXMKKy8qIFRoaXMgcHJvdmlkZXMgcnVkaW1lbnRhcnkgZmFjaWxpdGllcyBmb3IgbG9hZGluZyBhbmQgc2F2aW5nIHRydWUgY29sb3IgKi8KKy8qIEJNUCBhbmQgUFBNIGZpbGVzICovCiAKICNpZm5kZWYgX19CTVBfSF9fCiAjZGVmaW5lIF9fQk1QX0hfXwpAQCAtMjYsMTYgKzI2LDIwIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vLyBUaGlzIHdpbGwgbG9hZCBhIFdpbmRvd3MgYml0bWFwIGZyb20gYSBmaWxlIGFuZCByZXR1cm4gYSBidWZmZXIgd2l0aCB0aGUKLS8vIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQsIHNjYW5saW5lIGFsaWdubWVudCwgYW5kIG9yaWVudGF0aW9uLiAgVGhlIHdpZHRoIGFuZAotLy8gaGVpZ2h0IGFyZSByZXR1cm5lZCBpbiB3IGFuZCBoLgorLyoKKyAqIFRoaXMgd2lsbCBsb2FkIGEgV2luZG93cyBiaXRtYXAgZnJvbSBhIGZpbGUgYW5kIHJldHVybiBhIGJ1ZmZlciB3aXRoIHRoZQorICogc3BlY2lmaWVkIHBpeGVsIGZvcm1hdCwgc2NhbmxpbmUgYWxpZ25tZW50LCBhbmQgb3JpZW50YXRpb24uICBUaGUgd2lkdGggYW5kCisgKiBoZWlnaHQgYXJlIHJldHVybmVkIGluIHcgYW5kIGguCisgKi8KIAogaW50IGxvYWRibXAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKipidWYsIGludCAqdywgaW50ICpoLAogCWVudW0gQk1QUElYRUxGT1JNQVQgZiwgaW50IGFsaWduLCBpbnQgZHN0Ym90dG9tdXApOwogCi0vLyBUaGlzIHdpbGwgc2F2ZSBhIGJ1ZmZlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0LCBwaXRjaCwgb3JpZW50YXRpb24sCi0vLyB3aWR0aCwgYW5kIGhlaWdodCBhcyBhIDI0LWJpdCBXaW5kb3dzIGJpdG1hcCBvciBQUE0gKHRoZSBmaWxlbmFtZSBkZXRlcm1pbmVzCi0vLyB3aGljaCBmb3JtYXQgdG8gdXNlKQorLyoKKyAqIFRoaXMgd2lsbCBzYXZlIGEgYnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQsIHBpdGNoLCBvcmllbnRhdGlvbiwKKyAqIHdpZHRoLCBhbmQgaGVpZ2h0IGFzIGEgMjQtYml0IFdpbmRvd3MgYml0bWFwIG9yIFBQTSAodGhlIGZpbGVuYW1lIGRldGVybWluZXMKKyAqIHdoaWNoIGZvcm1hdCB0byB1c2UpCisgKi8KIAogaW50IHNhdmVibXAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHcsIGludCBoLAogCWVudW0gQk1QUElYRUxGT1JNQVQgZiwgaW50IHNyY3BpdGNoLCBpbnQgc3JjYm90dG9tdXApOwpkaWZmIC0tZ2l0IGEvdGVzdC9lbmNvZGluZ3N0ZXN0LmMgYi90ZXN0L2VuY29kaW5nc3Rlc3QuYwppbmRleCBlNzlmN2U3Li43MTVlODg3IDEwMDY0NAotLS0gYS90ZXN0L2VuY29kaW5nc3Rlc3QuYworKysgYi90ZXN0L2VuY29kaW5nc3Rlc3QuYwpAQCAtMTcyLDYgKzE3Miw3IEBACiAJfQogCWZyZWUoKChjbGllbnREYXRhKiljbGllbnQtPmNsaWVudERhdGEpLT5kaXNwbGF5KTsKIAlmcmVlKGNsaWVudC0+Y2xpZW50RGF0YSk7CisJY2xpZW50LT5jbGllbnREYXRhID0gTlVMTDsKIAlpZihjbGllbnQtPmZyYW1lQnVmZmVyKQogCQlmcmVlKGNsaWVudC0+ZnJhbWVCdWZmZXIpOwogCXJmYkNsaWVudENsZWFudXAoY2xpZW50KTsKQEAgLTI1Niw3ICsyNTcsNyBAQAogCiAJdGltZSgmbG9nX2Nsb2NrKTsKIAlzdHJmdGltZShidWYsIDI1NSwgIiVkLyVtLyVZICVYIChjbGllbnQpICIsIGxvY2FsdGltZSgmbG9nX2Nsb2NrKSk7Ci0JZnByaW50ZihzdGRlcnIsYnVmKTsKKwlmcHJpbnRmKHN0ZGVyciwiJXMiLGJ1Zik7CiAKIAl2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CiAJZmZsdXNoKHN0ZGVycik7CmRpZmYgLS1naXQgYS90aWdodHZuYy0xLjNkZXY1LXZuY3ZpZXdlci1hbHBoYS1jdXJzb3IucGF0Y2ggYi90aWdodHZuYy0xLjNkZXY1LXZuY3ZpZXdlci1hbHBoYS1jdXJzb3IucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjMxZTcuLjAwMDAwMDAKLS0tIGEvdGlnaHR2bmMtMS4zZGV2NS12bmN2aWV3ZXItYWxwaGEtY3Vyc29yLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9jdXJzb3IuYwkyMDAzLTAxLTE1IDA0OjQ2OjUyLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9jdXJzb3IuYwkyMDA1LTAyLTA1IDEyOjI4OjEwLjAwMDAwMDAwMCAtMDUwMAotQEAgLTQ3Miw2ICs0NzIsMTQwIEBACi0gICBpbnQgb2Zmc2V0LCBieXRlc1BlclBpeGVsOwotICAgY2hhciAqcG9zOwotIAotKyNkZWZpbmUgYWxwaGFoYWNrCi0rI2lmZGVmIGFscGhhaGFjawotKyAgLyogaGFjayB0byBoYXZlIGN1cnNvciB0cmFuc3BhcmVuY3kgYXQgMzJicHAgPHJ1bmdlQGthcmxydW5nZS5jb20+ICovCi0rICBzdGF0aWMgaW50IGFscGhhYmxlbmQgPSAtMTsKLSsKLSsgIGlmIChhbHBoYWJsZW5kIDwgMCkgewotKwkvKiB5b3UgaGF2ZSB0byBzZXQgTk9fQUxQSEFCTEVORD0xIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gZGlzYWJsZSAqLwotKwlpZiAoZ2V0ZW52KCJOT19BTFBIQUJMRU5EIikpIHsKLSsJCWFscGhhYmxlbmQgPSAwOwotKwl9IGVsc2UgewotKwkJYWxwaGFibGVuZCA9IDE7Ci0rCX0KLSsgIH0KLSsKLSsgIGJ5dGVzUGVyUGl4ZWwgPSBteUZvcm1hdC5iaXRzUGVyUGl4ZWwgLyA4OwotKwotKyAgaWYgKGFscGhhYmxlbmQgJiYgYnl0ZXNQZXJQaXhlbCA9PSA0KSB7Ci0rCXVuc2lnbmVkIGxvbmcgcGl4ZWwsIHB1dCwgKnVwb3MsICp1cGl4OwotKwlpbnQgZ290X2FscGhhID0gMCwgcnNYLCByc1ksIHJzVywgcnNIOwotKwlzdGF0aWMgWEltYWdlICppbWFnZSA9IE5VTEw7Ci0rCXN0YXRpYyBpbnQgaXdpZHRoID0gMTI4OwotKwotKwlpZiAoISBpbWFnZSkgewotKwkJLyogd2F0Y2ggb3V0IGZvciB0aW55IGZiIChyYXJlKSAqLwotKwkJaWYgKGl3aWR0aCA+IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCQlpd2lkdGggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJfQotKwkJaWYgKGl3aWR0aCA+IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSB7Ci0rCQkJaXdpZHRoID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCQl9Ci0rCi0rCQkvKiBpbml0aWFsaXplIGFuIFhJbWFnZSB3aXRoIGEgY2h1bmsgb2YgZGVza3RvcFdpbiAqLwotKwkJaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCBkZXNrdG9wV2luLCAwLCAwLCBpd2lkdGgsIGl3aWR0aCwKLSsJCSAgICBBbGxQbGFuZXMsIFpQaXhtYXApOwotKwl9Ci0rCi0rCS8qIGZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGFueSBub24temVybyBhbHBoYSBjaGFubmVsIGRhdGEgYXQgYWxsOiAqLwotKwlmb3IgKHkgPSAwOyB5IDwgcmNIZWlnaHQ7IHkrKykgewotKwkJZm9yICh4ID0gMDsgeCA8IHJjV2lkdGg7IHgrKykgewotKwkJCWludCBhbHBoYTsKLSsKLSsJCQlvZmZzZXQgPSB5ICogcmNXaWR0aCArIHg7Ci0rCQkJcG9zID0gKGNoYXIgKikmcmNTb3VyY2Vbb2Zmc2V0ICogYnl0ZXNQZXJQaXhlbF07Ci0rCi0rCQkJdXBvcyA9ICh1bnNpZ25lZCBsb25nICopIHBvczsKLSsJCQlhbHBoYSA9ICgqdXBvcyAmIDB4ZmYwMDAwMDApID4+IDI0OwotKwkJCWlmIChhbHBoYSkgewotKwkJCQlnb3RfYWxwaGEgPSAxOwotKwkJCQlicmVhazsKLSsJCQl9Ci0rCQl9Ci0rCQlpZiAoZ290X2FscGhhKSB7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKCFnb3RfYWxwaGEpIHsKLSsJCS8qIG5vIGFscGhhIGNoYW5uZWwgZGF0YSwgZmFsbGJhY2sgdG8gdGhlIG9sZCB3YXkgKi8KLSsJCWdvdG8gb2xkd2F5OwotKwl9Ci0rCi0rCS8qIGxvYWQgdGhlIHNhdmVkIGZiIHBhdGNoIGluIHRvIGltYWdlIChmYXN0ZXIgd2F5PykgKi8KLSsJWEdldFN1YkltYWdlKGRweSwgcmNTYXZlZEFyZWEsIDAsIDAsIHJjV2lkdGgsIHJjSGVpZ2h0LAotKwkgICAgQWxsUGxhbmVzLCBaUGl4bWFwLCBpbWFnZSwgMCwgMCk7Ci0rCXVwaXggPSAodW5zaWduZWQgbG9uZyAqKWltYWdlLT5kYXRhOwotKwotKwkvKiBpZiB0aGUgcmljaGN1cnNvciBpcyBjbGlwcGVkLCB0aGUgZmIgcGF0Y2ggd2lsbCBiZSBzbWFsbGVyICovCi0rCXJzVyA9IHJjV2lkdGg7Ci0rCXJzWCA9IDA7CS8qIHVzZWQgdG8gZGVub3RlIGEgc2hpZnQgZnJvbSB0aGUgbGVmdCBzaWRlICovCi0rCXggPSByY0N1cnNvclggLSByY0hvdFg7Ci0rCWlmICh4IDwgMCkgewotKwkJcnNXICs9IHg7Ci0rCQlyc1ggPSAteDsKLSsJfSBlbHNlIGlmICh4ICsgcnNXID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgewotKwkJcnNXID0gc2kuZnJhbWVidWZmZXJXaWR0aCAtIHg7Ci0rCX0KLSsJcnNIID0gcmNIZWlnaHQ7Ci0rCXJzWSA9IDA7CS8qIHVzZWQgdG8gZGVub3RlIGEgc2hpZnQgZnJvbSB0aGUgdG9wIHNpZGUgKi8KLSsJeSA9IHJjQ3Vyc29yWSAtIHJjSG90WTsKLSsJaWYgKHkgPCAwKSB7Ci0rCQlyc0ggKz0geTsKLSsJCXJzWSA9IC15OwotKwl9IGVsc2UgaWYgKHkgKyByc0ggPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJcnNIID0gc2kuZnJhbWVidWZmZXJIZWlnaHQgLSB5OwotKwl9Ci0rCi0rCS8qCi0rCSAqIG5vdyBsb29wIG92ZXIgdGhlIGN1cnNvciBkYXRhLCBibGVuZCBpbiB0aGUgZmIgdmFsdWVzLAotKwkgKiBhbmQgdGhlbiBvdmVyd3JpdGUgdGhlIGZiIChDb3B5RGF0YVRvU2NyZWVuKCkpCi0rCSAqLwotKwlmb3IgKHkgPSAwOyB5IDwgcmNIZWlnaHQ7IHkrKykgewotKwkJeTAgPSByY0N1cnNvclkgLSByY0hvdFkgKyB5OwotKwkJaWYgKHkwIDwgMCB8fCB5MCA+PSBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJCWNvbnRpbnVlOwkvKiBjbGlwcGVkICovCi0rCQl9Ci0rCQlmb3IgKHggPSAwOyB4IDwgcmNXaWR0aDsgeCsrKSB7Ci0rCQkJaW50IGFscGhhLCBjb2xvcl9jdXJzLCBjb2xvcl9mYiwgaTsKLSsKLSsJCQl4MCA9IHJjQ3Vyc29yWCAtIHJjSG90WCArIHg7Ci0rCQkJaWYgKHgwIDwgMCB8fCB4MCA+PSBzaS5mcmFtZWJ1ZmZlcldpZHRoKSB7Ci0rCQkJCWNvbnRpbnVlOwkvKiBjbGlwcGVkICovCi0rCQkJfQotKwotKwkJCW9mZnNldCA9IHkgKiByY1dpZHRoICsgeDsKLSsJCQlwb3MgPSAoY2hhciAqKSZyY1NvdXJjZVtvZmZzZXQgKiBieXRlc1BlclBpeGVsXTsKLSsKLSsJCQkvKiBleHRyYWN0IHNlY3JldCBhbHBoYSBieXRlIGZyb20gcmljaCBjdXJzb3I6ICovCi0rCQkJdXBvcyA9ICh1bnNpZ25lZCBsb25nICopIHBvczsKLSsJCQlhbHBoYSA9ICgqdXBvcyAmIDB4ZmYwMDAwMDApID4+IDI0OwkvKiBYWFggTVNCPyAqLwotKwotKwkJCS8qIGV4dHJhY3QgdGhlIHBpeGVsIGZyb20gdGhlIGZiOiAqLwotKwkJCXBpeGVsID0gKih1cGl4ICsgKHktcnNZKSppd2lkdGggKyAoeC1yc1gpKTsKLSsKLSsJCQlwdXQgPSAwOwotKwkJCS8qIGZvciBzaW1wbGljaXR5LCBibGVuZCBhbGwgNCBieXRlcyAqLwotKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSsJCQkJaW50IHNoID0gaSo4OwotKwkJCQljb2xvcl9jdXJzID0gKCgweGZmIDw8IHNoKSAmICp1cG9zKSA+PiBzaDsKLSsJCQkJY29sb3JfZmIgICA9ICgoMHhmZiA8PCBzaCkgJiBwaXhlbCkgPj4gc2g7Ci0rCi0rCQkJCS8qIFhYWCBhc3N1bWVzIHByZS1tdWx0aXBsZWQgY29sb3JfY3VycyAqLwotKwkJCQljb2xvcl9mYiA9IGNvbG9yX2N1cnMKLSsJCQkJICAgICsgKCgweGZmIC0gYWxwaGEpICogY29sb3JfZmIpLzB4ZmY7Ci0rCQkJCXB1dCB8PSBjb2xvcl9mYiA8PCBzaDsKLSsJCQl9Ci0rCQkJLyogcGxhY2UgaW4gdGhlIGZiOiAqLwotKwkgICAgCQlDb3B5RGF0YVRvU2NyZWVuKChjaGFyICopJnB1dCwgeDAsIHkwLCAxLCAxKTsKLSsJCX0KLSsJfQotKwlyZXR1cm47Ci0rICB9Ci0rb2xkd2F5OgotKyNlbmRpZgotKwotICAgYnl0ZXNQZXJQaXhlbCA9IG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0gCi0gICAvKiBGSVhNRTogU3BlZWQgb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlLiAqLwpkaWZmIC0tZ2l0IGEvdm5jdGVybS8uZGVwcy9MaW51eFZOQy5QbyBiL3ZuY3Rlcm0vLmRlcHMvTGludXhWTkMuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvdm5jdGVybS8uZGVwcy9MaW51eFZOQy5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3ZuY3Rlcm0vLmRlcHMvVk5Db21tYW5kLlBvIGIvdm5jdGVybS8uZGVwcy9WTkNvbW1hbmQuUG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTA2YTguLjAwMDAwMDAKLS0tIGEvdm5jdGVybS8uZGVwcy9WTkNvbW1hbmQuUG8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIGR1bW15CmRpZmYgLS1naXQgYS92bmN0ZXJtLy5kZXBzL1ZOQ29uc29sZS5QbyBiL3ZuY3Rlcm0vLmRlcHMvVk5Db25zb2xlLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL3ZuY3Rlcm0vLmRlcHMvVk5Db25zb2xlLlBvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBkdW1teQpkaWZmIC0tZ2l0IGEvdm5jdGVybS8uZGVwcy9leGFtcGxlLlBvIGIvdm5jdGVybS8uZGVwcy9leGFtcGxlLlBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwNmE4Li4wMDAwMDAwCi0tLSBhL3ZuY3Rlcm0vLmRlcHMvZXhhbXBsZS5QbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgZHVtbXkKZGlmZiAtLWdpdCBhL3ZuY3Rlcm0vQ2hhbmdlTG9nIGIvdm5jdGVybS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYTljMzcuLjAwMDAwMDAKLS0tIGEvdm5jdGVybS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1pbmNsdWRlZCBpbiBMaWJWTkNTZXJ2ZXIgcGFja2FnZSwgYXV0b2NvbmYnZWQgaXQKLVNldFhDdXRUZXh0IGltcGxlbWVudGVkCi1maXggZm9yIGNhcmdzCi1hdHRyaWJ1dGVzIHdvcmsuCi1jdXJzb3IgaW4gTGludXhWTkMgaXMgc2hvd24uCi1wYXN0ZSB3b3Jrcwotc2VsZWN0aW9uIHdvcmtzIChubyBjdXJzb3IgdHJhaWxzKQotTGludXhWTkMgZ2V0cyBpdCdzIGRpbWVuc2lvbnMgdmlhIGlvY3RsIFRJT0NHV0lOU1oKLUZpcnN0IHdvcmtpbmcga2V5IGluamVjdGlvbiBpbiBMaW51eFZOQyEKLUFkZGVkIE1vdXNlIG1hcmtpbmcKLWFkZGVkIHNjcmVlbkJ1ZmZlciAoc28geW91IGhhdmUgQVNDSUkgc2NyZWVuIGFsc28pCi1maXhlZCBDb3B5UmVjdCBmb3Igc2Nyb2xsaW5nIChuZWVkIHRvIHByb3BhZ2F0ZSB0byBsaWJ2bmNzZXJ2ZXIpCi1tYWRlIFZOQ29tbWFuZCB3b3JrIChubyBwcm9tcHQgZm9yIGJhc2gsIGJ1dCBlbHNlIHNlZW1zIG9rKQotYWRkZWQgZmxhZyBmb3IgVk5Db21tYW5kIHRvIHNlbmQgaW5wdXQgb25seSBhZnRlciBhIG5ld2xpbmUKLQkgKGdvb2QgZm9yIGludGVyYWN0aXZlIGJhc2gpCmRpZmYgLS1naXQgYS92bmN0ZXJtL0xpbnV4Vk5DLmMgYi92bmN0ZXJtL0xpbnV4Vk5DLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTg5NTQuLjAwMDAwMDAKLS0tIGEvdm5jdGVybS9MaW51eFZOQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLSNpbmNsdWRlIDxyZmIva2V5c3ltLmg+Ci0jaW5jbHVkZSAiVk5Db25zb2xlLmgiCi0jaW5jbHVkZSAidmdhLmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotc3RhdGljIGludCB0dHk9MjsKLXN0YXRpYyBpbnQgdHR5X2luamVjdF9kZXZpY2U7Ci0KLXZvaWQgZG9fa2V5KHJmYkJvb2wgZG93bixyZmJLZXlTeW0ga2V5U3ltLHJmYkNsaWVudFB0ciBjbCkKLXsKLSAgc3RhdGljIGNoYXIgaXNDb250cm9sPTA7Ci0KLSAgaWYoZG93bikgewotICAgIC8qIGlmKGtleVN5bT09WEtfRXNjYXBlKQotICAgICAgcmZiQ2xvc2VDbGllbnQoY2wpOwotICAgIGVsc2UgKi8gaWYoa2V5U3ltPT1YS19Db250cm9sX0wgfHwga2V5U3ltPT1YS19Db250cm9sX1IpCi0gICAgICBpc0NvbnRyb2wrKzsKLSAgICBlbHNlIGlmKHR0eV9pbmplY3RfZGV2aWNlPj0wKSB7Ci0gICAgICBpZihrZXlTeW09PVhLX0VzY2FwZSkKLQlrZXlTeW09Mjc7Ci0gICAgICBpZihpc0NvbnRyb2wpIHsKLQlpZihrZXlTeW0+PSdhJyAmJiBrZXlTeW08PSd6JykKLQkgIGtleVN5bS09J2EnLTE7Ci0JZWxzZSBpZihrZXlTeW0+PSdBJyAmJiBrZXlTeW08PSdaJykKLQkgIGtleVN5bS09J0EnLTE7Ci0JZWxzZQotCSAga2V5U3ltPTB4ZmZmZjsKLSAgICAgIH0KLQotICAgICAgaWYoa2V5U3ltPT1YS19UYWIpCi0Ja2V5U3ltPSdcdCc7Ci0gICAgICBlbHNlIGlmKGtleVN5bT09WEtfUmV0dXJuKQotCWtleVN5bT0nXHInOwotICAgICAgZWxzZSBpZihrZXlTeW09PVhLX0JhY2tTcGFjZSkKLQlrZXlTeW09ODsKLSAgICAgIGVsc2UgaWYoa2V5U3ltPT1YS19Ib21lIHx8IGtleVN5bT09WEtfS1BfSG9tZSkKLQlrZXlTeW09MTsKLSAgICAgIGVsc2UgaWYoa2V5U3ltPT1YS19FbmQgfHwga2V5U3ltPT1YS19LUF9FbmQpCi0Ja2V5U3ltPTU7Ci0gICAgICBlbHNlIGlmKGtleVN5bT09WEtfVXAgfHwga2V5U3ltPT1YS19LUF9VcCkKLQlrZXlTeW09MTY7Ci0gICAgICBlbHNlIGlmKGtleVN5bT09WEtfRG93biB8fCBrZXlTeW09PVhLX0tQX0Rvd24pCi0Ja2V5U3ltPTE0OwotICAgICAgZWxzZSBpZihrZXlTeW09PVhLX1JpZ2h0IHx8IGtleVN5bT09WEtfS1BfUmlnaHQpCi0Ja2V5U3ltPTY7Ci0gICAgICBlbHNlIGlmKGtleVN5bT09WEtfTGVmdCB8fCBrZXlTeW09PVhLX0tQX0xlZnQpCi0Ja2V5U3ltPTI7Ci0KLSAgICAgIGlmKGtleVN5bTwweDEwMCkgewotCWludCByZXQ7Ci0JcmV0PWlvY3RsKHR0eV9pbmplY3RfZGV2aWNlLFRJT0NTVEksJmtleVN5bSk7Ci0JaWYocmV0PDApIHsKLQkgIHN0YXRpYyBjaGFyIGRldmljZVs2NF07Ci0JICBjbG9zZSh0dHlfaW5qZWN0X2RldmljZSk7Ci0JICBzcHJpbnRmKGRldmljZSwiL2Rldi90dHklZCIsdHR5KTsKLQkgIHR0eV9pbmplY3RfZGV2aWNlPW9wZW4oZGV2aWNlLE9fV1JPTkxZKTsKLQkgIHJldD1pb2N0bCh0dHlfaW5qZWN0X2RldmljZSxUSU9DU1RJLCZrZXlTeW0pOwotCSAgaWYocmV0PDApCi0JICAgIHJmYkVycigiQ291bGRuJ3QgcmVvcGVuIGRldmljZSAlcyFcbiIsZGV2aWNlKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYoa2V5U3ltPT1YS19Db250cm9sX0wgfHwga2V5U3ltPT1YS19Db250cm9sX1IpCi0gICAgaWYoaXNDb250cm9sPjApCi0gICAgICBpc0NvbnRyb2wtLTsKLX0KLQotLyogdGhlc2UgY29sb3VycyBhcmUgZnJvbSBsaW51eCBrZXJuZWwgZHJpdmVycy9jaGFyL2NvbnNvbGUuYyAqLwotdW5zaWduZWQgY2hhciBjb2xvcl90YWJsZVtdID0geyAwLCA0LCAyLCA2LCAxLCA1LCAzLCA3LAotCQkJCSAgICAgICA4LDEyLDEwLDE0LCA5LDEzLDExLDE1IH07Ci0vKiB0aGUgZGVmYXVsdCBjb2xvdXIgdGFibGUsIGZvciBWR0ErIGNvbG91ciBzeXN0ZW1zICovCi1pbnQgZGVmYXVsdF9yZWRbXSA9IHsweDAwLDB4YWEsMHgwMCwweGFhLDB4MDAsMHhhYSwweDAwLDB4YWEsCi0gICAgMHg1NSwweGZmLDB4NTUsMHhmZiwweDU1LDB4ZmYsMHg1NSwweGZmfTsKLWludCBkZWZhdWx0X2dybltdID0gezB4MDAsMHgwMCwweGFhLDB4NTUsMHgwMCwweDAwLDB4YWEsMHhhYSwKLSAgICAweDU1LDB4NTUsMHhmZiwweGZmLDB4NTUsMHg1NSwweGZmLDB4ZmZ9OwotaW50IGRlZmF1bHRfYmx1W10gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweGFhLDB4YWEsMHhhYSwweGFhLAotICAgIDB4NTUsMHg1NSwweDU1LDB4NTUsMHhmZiwweGZmLDB4ZmYsMHhmZn07Ci0KLWludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQotewotICBpbnQgd2lkdGg9ODAsaGVpZ2h0PTI1OwotICBjaGFyICpidWZmZXI7Ci0gIHZuY0NvbnNvbGVQdHIgY29uc29sZTsKLSAgY2hhciB0dHlfZGV2aWNlWzY0XSx0aXRsZVsxMjhdOwotICBpbnQgaTsKLSAgRklMRSogdHR5X2ZpbGU7Ci0gIHN0cnVjdCB3aW5zaXplIGRpbWVuc2lvbnM7Ci0KLSAgaWYoYXJnYz4xKSB7Ci0gICAgaWYoKHR0eT1hdG9pKGFyZ3ZbMV0pKTwxKSB7Ci0gICAgICByZmJFcnIoIlVzYWdlOiAlcyBbdHR5X251bWJlciBbdm5jIGFyZ3NdXVxuIixhcmd2WzBdKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFyZ3YrKzsKLSAgICAgIGFyZ2MtLTsKLSAgICB9Ci0gIH0KLQotICAvKiBnZXRvcHQgZ29lcyBoZXJlISAqLwotCi0gIHNwcmludGYodHR5X2RldmljZSwiL2Rldi90dHklZCIsdHR5KTsKLSAgaWYoKHR0eV9pbmplY3RfZGV2aWNlPW9wZW4odHR5X2RldmljZSxPX1dST05MWSkpPDApIHsKLSAgICByZmJFcnIoIkNvdWxkbid0IG9wZW4gdHR5IGRldmljZSAlcyFcbiIsdHR5X2RldmljZSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotICByZmJMb2coIlVzaW5nIGRldmljZSAlcy5cbiIsdHR5X2RldmljZSk7Ci0KLSAgaWYoaW9jdGwodHR5X2luamVjdF9kZXZpY2UsVElPQ0dXSU5TWiwmZGltZW5zaW9ucyk+PTApIHsKLSAgICB3aWR0aD1kaW1lbnNpb25zLndzX2NvbDsKLSAgICBoZWlnaHQ9ZGltZW5zaW9ucy53c19yb3c7Ci0gIH0KLQotICBzcHJpbnRmKHRpdGxlLCJMaW51eFZOQzogL2Rldi90dHklZCIsdHR5KTsKLQotICAvKiBjb25zb2xlIGluaXQgKi8KLSAgaWYoIShjb25zb2xlPXZjR2V0Q29uc29sZSgmYXJnYyxhcmd2LHdpZHRoLGhlaWdodCwmdmdhRm9udCxUUlVFKSkpCi0gICAgZXhpdCgxKTsKLQotICBmb3IoaT0wO2k8MTY7aSsrKSB7Ci0gICAgY29uc29sZS0+c2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5ieXRlc1tpKjMrMF09ZGVmYXVsdF9yZWRbY29sb3JfdGFibGVbaV1dOwotICAgIGNvbnNvbGUtPnNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuYnl0ZXNbaSozKzFdPWRlZmF1bHRfZ3JuW2NvbG9yX3RhYmxlW2ldXTsKLSAgICBjb25zb2xlLT5zY3JlZW4tPmNvbG91ck1hcC5kYXRhLmJ5dGVzW2kqMysyXT1kZWZhdWx0X2JsdVtjb2xvcl90YWJsZVtpXV07Ci0gIH0KLSAgY29uc29sZS0+c2NyZWVuLT5kZXNrdG9wTmFtZT10aXRsZTsKLSAgY29uc29sZS0+c2NyZWVuLT5rYmRBZGRFdmVudD1kb19rZXk7Ci0gIGNvbnNvbGUtPnNlbGVjdFRpbWVPdXQ9MTAwMDAwOwotICBjb25zb2xlLT53cmFwQm90dG9tVG9Ub3A9VFJVRTsKLSNpZmRlZiBVU0VfT0xEX1ZDUwotICBidWZmZXI9bWFsbG9jKHdpZHRoKmhlaWdodCk7Ci0gIGNvbnNvbGUtPmN1cnNvckFjdGl2ZT1GQUxTRTsKLSNlbHNlCi0gIGJ1ZmZlcj1tYWxsb2Mod2lkdGgqaGVpZ2h0KjIrNCk7Ci0gIGNvbnNvbGUtPmN1cnNvckFjdGl2ZT1UUlVFOwotI2VuZGlmCi0gIC8qIG1lbWNweShidWZmZXIsY29uc29sZS0+c2NyZWVuQnVmZmVyLHdpZHRoKmhlaWdodCk7ICovCi0KLSNpZmRlZiBVU0VfT0xEX1ZDUwotICBzcHJpbnRmKHR0eV9kZXZpY2UsIi9kZXYvdmNzJWQiLHR0eSk7Ci0jZWxzZQotICBzcHJpbnRmKHR0eV9kZXZpY2UsIi9kZXYvdmNzYSVkIix0dHkpOwotI2VuZGlmCi0KLSAgd2hpbGUocmZiSXNBY3RpdmUoY29uc29sZS0+c2NyZWVuKSkgewotICAgIGlmKCFjb25zb2xlLT5jdXJyZW50bHlNYXJraW5nKSB7Ci0gICAgICB0dHlfZmlsZT1mb3Blbih0dHlfZGV2aWNlLCJyYiIpOwotICAgICAgaWYoIXR0eV9maWxlKSB7Ci0JcmZiRXJyKCJjYW5ub3Qgb3BlbiBkZXZpY2UgXCIlc1wiXG4iLAotCQl0dHlfZGV2aWNlKTsKLQlleGl0KDEpOwotICAgICAgfQotI2lmZGVmIFVTRV9PTERfVkNTCi0gICAgICBmcmVhZChidWZmZXIsd2lkdGgsaGVpZ2h0LHR0eV9maWxlKTsKLSNlbHNlCi0gICAgICBmcmVhZChidWZmZXIsd2lkdGgqaGVpZ2h0KjIrNCwxLHR0eV9maWxlKTsKLSAgICAgIHZjSGlkZUN1cnNvcihjb25zb2xlKTsKLSNlbmRpZgotICAgICAgZmNsb3NlKHR0eV9maWxlKTsKLQotICAgICAgZm9yKGk9MDtpPGNvbnNvbGUtPndpZHRoKmNvbnNvbGUtPmhlaWdodDtpKyspIHsKLQlpZgotI2lmZGVmIFVTRV9PTERfVkNTCi0JIChidWZmZXJbaV0hPWNvbnNvbGUtPnNjcmVlbkJ1ZmZlcltpXSkKLSNlbHNlCi0JIChidWZmZXJbNCsyKmldIT1jb25zb2xlLT5zY3JlZW5CdWZmZXJbaV0gfHwKLQkgIGJ1ZmZlcls1KzIqaV0hPWNvbnNvbGUtPmF0dHJpYnV0ZUJ1ZmZlcltpXSkKLSNlbmRpZgotCSAgewotCSAgICBjb25zb2xlLT54PShpJWNvbnNvbGUtPndpZHRoKTsKLQkgICAgY29uc29sZS0+eT0oaS9jb25zb2xlLT53aWR0aCk7Ci0JICAgIC8qCi0JICAgICAgcmZiTG9nKCJjaGFuZ2VzOiAlZCwlZCAoJWQhPSVkIHx8ICVkIT0lZClcbiIsCi0JICAgICAgY29uc29sZS0+eCxjb25zb2xlLT55LAotCSAgICAgIGJ1ZmZlcls0KzIqaV0sY29uc29sZS0+c2NyZWVuQnVmZmVyW2ldLAotCSAgICAgIGJ1ZmZlcls1KzIqaV0sY29uc29sZS0+YXR0cmlidXRlQnVmZmVyW2ldKTsKLQkgICAgKi8KLQkgICAgCi0jaWZkZWYgVVNFX09MRF9WQ1MKLQkgICAgdmNQdXRDaGFyKGNvbnNvbGUsYnVmZmVyW2ldKTsKLSNlbHNlCi0JICAgIHZjUHV0Q2hhckNvbG91cihjb25zb2xlLGJ1ZmZlcls0K2kqMl0sYnVmZmVyWzUraSoyXSYweDcsYnVmZmVyWzUraSoyXT4+NCk7Ci0jZW5kaWYKLQkgIH0KLSAgICAgIH0KLSAgICAgIGNvbnNvbGUtPng9YnVmZmVyWzJdOwotICAgICAgY29uc29sZS0+eT1idWZmZXJbM107Ci0gICAgfQotICAgIHZjUHJvY2Vzc0V2ZW50cyhjb25zb2xlKTsKLSAgfQotICByZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS92bmN0ZXJtL01ha2VmaWxlIGIvdm5jdGVybS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkOTRiZS4uMDAwMDAwMAotLS0gYS92bmN0ZXJtL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyB2bmN0ZXJtL01ha2VmaWxlLiAgR2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotCi0KLQotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0xpYlZOQ1NlcnZlcgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9MaWJWTkNTZXJ2ZXIKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotYmluX1BST0dSQU1TID0gIFwKLQlsaW51eHZuYyQoRVhFRVhUKQotbm9pbnN0X1BST0dSQU1TID0gZXhhbXBsZSQoRVhFRVhUKSAkKGFtX19FWEVFWFRfMSkKLXN1YmRpciA9IHZuY3Rlcm0KLURJU1RfQ09NTU9OID0gUkVBRE1FICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluIENoYW5nZUxvZyBUT0RPCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLWFtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIgotYW1fX0VYRUVYVF8xID0gdm5jb21tYW5kJChFWEVFWFQpCi1QUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLWFtX19vYmplY3RzXzEgPSBWTkNvbnNvbGUuJChPQkpFWFQpCi1hbV9leGFtcGxlX09CSkVDVFMgPSBleGFtcGxlLiQoT0JKRVhUKSAkKGFtX19vYmplY3RzXzEpCi1leGFtcGxlX09CSkVDVFMgPSAkKGFtX2V4YW1wbGVfT0JKRUNUUykKLWV4YW1wbGVfTERBREQgPSAkKExEQUREKQotZXhhbXBsZV9ERVBFTkRFTkNJRVMgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhCi1BTV9WX2x0ID0gJChhbV9fdl9sdF8kKFYpKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotYW1fX2xpbnV4dm5jX1NPVVJDRVNfRElTVCA9IExpbnV4Vk5DLmMgVk5Db25zb2xlLmMKLWFtX2xpbnV4dm5jX09CSkVDVFMgPSAgXAotCUxpbnV4Vk5DLiQoT0JKRVhUKSBcCi0JJChhbV9fb2JqZWN0c18xKQotbGludXh2bmNfT0JKRUNUUyA9ICQoYW1fbGludXh2bmNfT0JKRUNUUykKLWxpbnV4dm5jX0xEQUREID0gJChMREFERCkKLWxpbnV4dm5jX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLWFtX3ZuY29tbWFuZF9PQkpFQ1RTID0gVk5Db21tYW5kLiQoT0JKRVhUKSAkKGFtX19vYmplY3RzXzEpCi12bmNvbW1hbmRfT0JKRUNUUyA9ICQoYW1fdm5jb21tYW5kX09CSkVDVFMpCi12bmNvbW1hbmRfTERBREQgPSAkKExEQUREKQotdm5jb21tYW5kX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2F0XzAgPSBACi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLUFNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9ICQoZXhhbXBsZV9TT1VSQ0VTKSAkKGxpbnV4dm5jX1NPVVJDRVMpICQodm5jb21tYW5kX1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGV4YW1wbGVfU09VUkNFUykgJChhbV9fbGludXh2bmNfU09VUkNFU19ESVNUKSBcCi0JJCh2bmNvbW1hbmRfU09VUkNFUykKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1IRUFERVJTID0gJChub2luc3RfSEVBREVSUykKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGFjbG9jYWwtMS4xMQotQU1UQVIgPSAkJHtUQVItdGFyfQotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSAwCi1BUiA9IC91c3IvYmluL2FyCi1BUyA9IGFzCi1BVVRPQ09ORiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvY29uZgotQVVUT0hFQURFUiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCi1BVVRPTUFLRSA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvbWFrZS0xLjExCi1BVkFISV9DRkxBR1MgPSAKLUFWQUhJX0xJQlMgPSAKLUFXSyA9IG1hd2sKLUNDID0gZ2NjCi1DQ0RFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNGTEFHUyA9IC1nIC1PMiAtV2FsbCAgCi1DUFAgPSBnY2MgLUUKLUNQUEZMQUdTID0gCi1DUllQVF9MSUJTID0gLWxjcnlwdAotQ1hYID0gZysrCi1DWFhDUFAgPSBnKysgLUUKLUNYWERFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNYWEZMQUdTID0gLWcgLU8yCi1DWUdQQVRIX1cgPSBlY2hvCi1ERUZTID0gLURIQVZFX0NPTkZJR19ICi1ERVBESVIgPSAuZGVwcwotRExMVE9PTCA9IGRsbHRvb2wKLUVDSE8gPSBlY2hvCi1FQ0hPX0MgPSAKLUVDSE9fTiA9IC1uCi1FQ0hPX1QgPSAKLUVHUkVQID0gL2Jpbi9ncmVwIC1FCi1FWEVFWFQgPSAKLUY3NyA9IAotRkZMQUdTID0gCi1HTlVUTFNfQ0ZMQUdTID0gCi1HTlVUTFNfTElCUyA9IAotR1JFUCA9IC9iaW4vZ3JlcAotR1RLX0NGTEFHUyA9IAotR1RLX0xJQlMgPSAKLUlOU1RBTEwgPSAvdXNyL2Jpbi9pbnN0YWxsIC1jCi1JTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAotSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jIC1zCi1KUEVHX0xERkxBR1MgPSAKLUxERkxBR1MgPSAKLUxJQkdDUllQVF9DRkxBR1MgPSAKLUxJQkdDUllQVF9DT05GSUcgPSBubwotTElCR0NSWVBUX0xJQlMgPSAKLUxJQk9CSlMgPSAKLUxJQlMgPSAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgIAotTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCi1MTl9TID0gbG4gLXMKLUxUTElCT0JKUyA9IAotTUFLRUlORk8gPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gbWFrZWluZm8KLU1LRElSX1AgPSAvYmluL21rZGlyIC1wCi1PQkpEVU1QID0gb2JqZHVtcAotT0JKRVhUID0gbwotUEFDS0FHRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9CVUdSRVBPUlQgPSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcgotUEFDS0FHRV9OQU1FID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX1NUUklORyA9IExpYlZOQ1NlcnZlciAwLjkuOQotUEFDS0FHRV9UQVJOQU1FID0gbGlidm5jc2VydmVyCi1QQUNLQUdFX1VSTCA9IAotUEFDS0FHRV9WRVJTSU9OID0gMC45LjkKLVBBVEhfU0VQQVJBVE9SID0gOgotUEtHX0NPTkZJRyA9IC91c3IvYmluL3BrZy1jb25maWcKLVBLR19DT05GSUdfTElCRElSID0gCi1QS0dfQ09ORklHX1BBVEggPSAKLVJBTkxJQiA9IHJhbmxpYgotUlBNU09VUkNFRElSID0gTk9ULUZPVU5ECi1TRExfQ0ZMQUdTID0gCi1TRExfTElCUyA9IAotU0VUX01BS0UgPSAKLVNIRUxMID0gL2Jpbi9iYXNoCi1TU0xfTElCUyA9IAotU1RSSVAgPSBzdHJpcAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyA9IAotVkVSU0lPTiA9IDAuOS45Ci1XU09DS0xJQiA9IAotWE1LTUYgPSAKLVhfQ0ZMQUdTID0gCi1YX0VYVFJBX0xJQlMgPSAKLVhfTElCUyA9IAotWF9QUkVfTElCUyA9ICAtbFNNIC1sSUNFCi1hYnNfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL3ZuY3Rlcm0KLWFic19zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL3ZuY3Rlcm0KLWFic190b3BfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hYnNfdG9wX3NyY2RpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFjX2N0X0NDID0gZ2NjCi1hY19jdF9DWFggPSBnKysKLWFjX2N0X0Y3NyA9IAotYW1fX2luY2x1ZGUgPSBpbmNsdWRlCi1hbV9fbGVhZGluZ19kb3QgPSAuCi1hbV9fcXVvdGUgPSAKLWFtX190YXIgPSAkJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIgotYW1fX3VudGFyID0gJCR7VEFSLXRhcn0geGYgLQotYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCi1idWlsZCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotYnVpbGRfYWxpYXMgPSAKLWJ1aWxkX2NwdSA9IHg4Nl82NAotYnVpbGRfb3MgPSBsaW51eC1nbnUKLWJ1aWxkX3ZlbmRvciA9IHVua25vd24KLWJ1aWxkZGlyID0gLgotZGF0YWRpciA9ICR7ZGF0YXJvb3RkaXJ9Ci1kYXRhcm9vdGRpciA9ICR7cHJlZml4fS9zaGFyZQotZG9jZGlyID0gJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfQotZHZpZGlyID0gJHtkb2NkaXJ9Ci1leGVjX3ByZWZpeCA9ICR7cHJlZml4fQotaG9zdCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF9hbGlhcyA9IAotaG9zdF9jcHUgPSB4ODZfNjQKLWhvc3Rfb3MgPSBsaW51eC1nbnUKLWhvc3RfdmVuZG9yID0gdW5rbm93bgotaHRtbGRpciA9ICR7ZG9jZGlyfQotaW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCi1pbmZvZGlyID0gJHtkYXRhcm9vdGRpcn0vaW5mbwotaW5zdGFsbF9zaCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaAotbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCi1saWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYwotbG9jYWxlZGlyID0gJHtkYXRhcm9vdGRpcn0vbG9jYWxlCi1sb2NhbHN0YXRlZGlyID0gJHtwcmVmaXh9L3ZhcgotbWFuZGlyID0gJHtkYXRhcm9vdGRpcn0vbWFuCi1ta2Rpcl9wID0gL2Jpbi9ta2RpciAtcAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotcGRmZGlyID0gJHtkb2NkaXJ9Ci1wcmVmaXggPSAvdXNyL2xvY2FsCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcyx4LHgsCi1wc2RpciA9ICR7ZG9jZGlyfQotc2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L3NiaW4KLXNoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQotc3JjZGlyID0gLgotc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKLXRhcmdldF9hbGlhcyA9IAotdG9wX2J1aWxkX3ByZWZpeCA9IC4uLwotdG9wX2J1aWxkZGlyID0gLi4KLXRvcF9zcmNkaXIgPSAuLgotd2l0aF9mZm1wZWcgPSAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpCi1DT05TT0xFX1NSQ1MgPSBWTkNvbnNvbGUuYwotbm9pbnN0X0hFQURFUlMgPSBWTkNvbnNvbGUuaCB2Z2EuaAotTERBREQgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIAotbGludXh2bmNfU09VUkNFUyA9IExpbnV4Vk5DLmMgJChDT05TT0xFX1NSQ1MpCi1WTkNPTU1BTkQgPSB2bmNvbW1hbmQKLWV4YW1wbGVfU09VUkNFUyA9IGV4YW1wbGUuYyAkKENPTlNPTEVfU1JDUykKLXZuY29tbWFuZF9TT1VSQ0VTID0gVk5Db21tYW5kLmMgJChDT05TT0xFX1NSQ1MpCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHZuY3Rlcm0vTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgdm5jdGVybS9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpciknIjsgXAotCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIgfHwgZXhpdCAxOyBcCi0JZmk7IFwKLQlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAotCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKLQl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAotCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCi0JZG9uZSB8IFwKLQlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCi0JICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCi0Jc2VkICdOO047TjtzLFxuLCAsZycgfCBcCi0JJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKLQkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKLQkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAotCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAotCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAotCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKLQkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCi0JICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAotCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCi0JICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCi0JICAgIH0gXAotCTsgZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAotCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCi0JICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAotCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKLQl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLQljZCAiJChERVNURElSKSQoYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcwotCi1jbGVhbi1iaW5QUk9HUkFNUzoKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCi0JdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKLQlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QKLWV4YW1wbGUkKEVYRUVYVCk6ICQoZXhhbXBsZV9PQkpFQ1RTKSAkKGV4YW1wbGVfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2V4YW1wbGVfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgZXhhbXBsZSQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChleGFtcGxlX09CSkVDVFMpICQoZXhhbXBsZV9MREFERCkgJChMSUJTKQotbGludXh2bmMkKEVYRUVYVCk6ICQobGludXh2bmNfT0JKRUNUUykgJChsaW51eHZuY19ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGludXh2bmNfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgbGludXh2bmMkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQobGludXh2bmNfT0JKRUNUUykgJChsaW51eHZuY19MREFERCkgJChMSUJTKQotdm5jb21tYW5kJChFWEVFWFQpOiAkKHZuY29tbWFuZF9PQkpFQ1RTKSAkKHZuY29tbWFuZF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfdm5jb21tYW5kX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHZuY29tbWFuZCQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh2bmNvbW1hbmRfT0JKRUNUUykgJCh2bmNvbW1hbmRfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotaW5jbHVkZSAuLyQoREVQRElSKS9MaW51eFZOQy5QbwotaW5jbHVkZSAuLyQoREVQRElSKS9WTkNvbW1hbmQuUG8KLWluY2x1ZGUgLi8kKERFUERJUikvVk5Db25zb2xlLlBvCi1pbmNsdWRlIC4vJChERVBESVIpL2V4YW1wbGUuUG8KLQotLmMubzoKLQkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLSMJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAotIwlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIFwKLSMJJChBTV9WX0NDX25vKSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotCSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLQkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIFwKLSMJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBcCi0jCSQoQU1fVl9DQ19ubykkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotLmMubG86Ci0JJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotCSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi0jCSQoQU1fVl9DQylzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBcCi0jCURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgXAotIwkkKEFNX1ZfQ0Nfbm8pJChMVENPTVBJTEUpIC1jIC1vICRAICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXNoaWZ0OyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCi0JICBlbHNlIFwKLQkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAgICQkdW5pcXVlOyBcCi0JICBmaTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoSEVBREVSUykKLWluc3RhbGxkaXJzOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICAgaW5zdGFsbDsgXAotCWVsc2UgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCi0JZmkKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZHZpLWFtOgotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAotCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBcCi0JZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCi0JaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtYmluUFJPR1JBTVMgXAotCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCi0JaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAotCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKLQl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdm5jdGVybS9NYWtlZmlsZS5hbSBiL3ZuY3Rlcm0vTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTE4NzYuLjAwMDAwMDAKLS0tIGEvdm5jdGVybS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLUlOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpCi0KLUNPTlNPTEVfU1JDUz1WTkNvbnNvbGUuYwotCi1ub2luc3RfSEVBREVSUz1WTkNvbnNvbGUuaCB2Z2EuaAotCi1MREFERD0uLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIEBXU09DS0xJQkAKLQotaWYgTElOVVgKLWlmICEgTUlOR1cKLWlmICEgQU5EUk9JRAotYmluX1BST0dSQU1TPWxpbnV4dm5jCi1saW51eHZuY19TT1VSQ0VTPUxpbnV4Vk5DLmMgJChDT05TT0xFX1NSQ1MpCi1lbmRpZgotZW5kaWYKLWVuZGlmCi0KLWlmICEgTUlOR1cKLVZOQ09NTUFORD12bmNvbW1hbmQKLWVuZGlmCi0KLW5vaW5zdF9QUk9HUkFNUz1leGFtcGxlICQoVk5DT01NQU5EKQotZXhhbXBsZV9TT1VSQ0VTPWV4YW1wbGUuYyAkKENPTlNPTEVfU1JDUykKLXZuY29tbWFuZF9TT1VSQ0VTPVZOQ29tbWFuZC5jICQoQ09OU09MRV9TUkNTKQotCi0KLQpkaWZmIC0tZ2l0IGEvdm5jdGVybS9NYWtlZmlsZS5pbiBiL3ZuY3Rlcm0vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjYzZWEuLjAwMDAwMDAKLS0tIGEvdm5jdGVybS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLQotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLUBBTkRST0lEX0ZBTFNFQEBMSU5VWF9UUlVFQEBNSU5HV19GQUxTRUBiaW5fUFJPR1JBTVMgPSAgXAotQEFORFJPSURfRkFMU0VAQExJTlVYX1RSVUVAQE1JTkdXX0ZBTFNFQAlsaW51eHZuYyQoRVhFRVhUKQotbm9pbnN0X1BST0dSQU1TID0gZXhhbXBsZSQoRVhFRVhUKSAkKGFtX19FWEVFWFRfMSkKLXN1YmRpciA9IHZuY3Rlcm0KLURJU1RfQ09NTU9OID0gUkVBRE1FICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluIENoYW5nZUxvZyBUT0RPCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLWFtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIgotQE1JTkdXX0ZBTFNFQGFtX19FWEVFWFRfMSA9IHZuY29tbWFuZCQoRVhFRVhUKQotUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi1hbV9fb2JqZWN0c18xID0gVk5Db25zb2xlLiQoT0JKRVhUKQotYW1fZXhhbXBsZV9PQkpFQ1RTID0gZXhhbXBsZS4kKE9CSkVYVCkgJChhbV9fb2JqZWN0c18xKQotZXhhbXBsZV9PQkpFQ1RTID0gJChhbV9leGFtcGxlX09CSkVDVFMpCi1leGFtcGxlX0xEQUREID0gJChMREFERCkKLWV4YW1wbGVfREVQRU5ERU5DSUVTID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2x0XzAgPSAtLXNpbGVudAotYW1fX2xpbnV4dm5jX1NPVVJDRVNfRElTVCA9IExpbnV4Vk5DLmMgVk5Db25zb2xlLmMKLUBBTkRST0lEX0ZBTFNFQEBMSU5VWF9UUlVFQEBNSU5HV19GQUxTRUBhbV9saW51eHZuY19PQkpFQ1RTID0gIFwKLUBBTkRST0lEX0ZBTFNFQEBMSU5VWF9UUlVFQEBNSU5HV19GQUxTRUAJTGludXhWTkMuJChPQkpFWFQpIFwKLUBBTkRST0lEX0ZBTFNFQEBMSU5VWF9UUlVFQEBNSU5HV19GQUxTRUAJJChhbV9fb2JqZWN0c18xKQotbGludXh2bmNfT0JKRUNUUyA9ICQoYW1fbGludXh2bmNfT0JKRUNUUykKLWxpbnV4dm5jX0xEQUREID0gJChMREFERCkKLWxpbnV4dm5jX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLWFtX3ZuY29tbWFuZF9PQkpFQ1RTID0gVk5Db21tYW5kLiQoT0JKRVhUKSAkKGFtX19vYmplY3RzXzEpCi12bmNvbW1hbmRfT0JKRUNUUyA9ICQoYW1fdm5jb21tYW5kX09CSkVDVFMpCi12bmNvbW1hbmRfTERBREQgPSAkKExEQUREKQotdm5jb21tYW5kX0RFUEVOREVOQ0lFUyA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEKLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotYW1fX212ID0gbXYgLWYKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKLQkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1BTV9WX0NDID0gJChhbV9fdl9DQ19AQU1fVkApCi1hbV9fdl9DQ18gPSAkKGFtX192X0NDX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF9AQU1fVkApCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0X0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfYXRfMCA9IEAKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEX0BBTV9WQCkKLWFtX192X0NDTERfID0gJChhbV9fdl9DQ0xEX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgIiAkQDsKLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotU09VUkNFUyA9ICQoZXhhbXBsZV9TT1VSQ0VTKSAkKGxpbnV4dm5jX1NPVVJDRVMpICQodm5jb21tYW5kX1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGV4YW1wbGVfU09VUkNFUykgJChhbV9fbGludXh2bmNfU09VUkNFU19ESVNUKSBcCi0JJCh2bmNvbW1hbmRfU09VUkNFUykKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1IRUFERVJTID0gJChub2luc3RfSEVBREVSUykKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVkFISV9DRkxBR1MgPSBAQVZBSElfQ0ZMQUdTQAotQVZBSElfTElCUyA9IEBBVkFISV9MSUJTQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DUllQVF9MSUJTID0gQENSWVBUX0xJQlNACi1DWFggPSBAQ1hYQAotQ1hYQ1BQID0gQENYWENQUEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1FQ0hPID0gQEVDSE9ACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1GNzcgPSBARjc3QAotRkZMQUdTID0gQEZGTEFHU0AKLUdOVVRMU19DRkxBR1MgPSBAR05VVExTX0NGTEFHU0AKLUdOVVRMU19MSUJTID0gQEdOVVRMU19MSUJTQAotR1JFUCA9IEBHUkVQQAotR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAotR1RLX0xJQlMgPSBAR1RLX0xJQlNACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUpQRUdfTERGTEFHUyA9IEBKUEVHX0xERkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJHQ1JZUFRfQ0ZMQUdTID0gQExJQkdDUllQVF9DRkxBR1NACi1MSUJHQ1JZUFRfQ09ORklHID0gQExJQkdDUllQVF9DT05GSUdACi1MSUJHQ1JZUFRfTElCUyA9IEBMSUJHQ1JZUFRfTElCU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKLVBLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAotUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKLVJBTkxJQiA9IEBSQU5MSUJACi1SUE1TT1VSQ0VESVIgPSBAUlBNU09VUkNFRElSQAotU0RMX0NGTEFHUyA9IEBTRExfQ0ZMQUdTQAotU0RMX0xJQlMgPSBAU0RMX0xJQlNACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1NMX0xJQlMgPSBAU1NMX0xJQlNACi1TVFJJUCA9IEBTVFJJUEAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdTT0NLTElCID0gQFdTT0NLTElCQAotWE1LTUYgPSBAWE1LTUZACi1YX0NGTEFHUyA9IEBYX0NGTEFHU0AKLVhfRVhUUkFfTElCUyA9IEBYX0VYVFJBX0xJQlNACi1YX0xJQlMgPSBAWF9MSUJTQAotWF9QUkVfTElCUyA9IEBYX1BSRV9MSUJTQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotd2l0aF9mZm1wZWcgPSBAd2l0aF9mZm1wZWdACi1JTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKQotQ09OU09MRV9TUkNTID0gVk5Db25zb2xlLmMKLW5vaW5zdF9IRUFERVJTID0gVk5Db25zb2xlLmggdmdhLmgKLUxEQUREID0gLi4vbGlidm5jc2VydmVyL2xpYnZuY3NlcnZlci5sYSBAV1NPQ0tMSUJACi1AQU5EUk9JRF9GQUxTRUBATElOVVhfVFJVRUBATUlOR1dfRkFMU0VAbGludXh2bmNfU09VUkNFUyA9IExpbnV4Vk5DLmMgJChDT05TT0xFX1NSQ1MpCi1ATUlOR1dfRkFMU0VAVk5DT01NQU5EID0gdm5jb21tYW5kCi1leGFtcGxlX1NPVVJDRVMgPSBleGFtcGxlLmMgJChDT05TT0xFX1NSQ1MpCi12bmNvbW1hbmRfU09VUkNFUyA9IFZOQ29tbWFuZC5jICQoQ09OU09MRV9TUkNTKQotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB2bmN0ZXJtL01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IHZuY3Rlcm0vTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKLQlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChiaW5kaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKLQlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCi0Jd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKLQkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAotCWRvbmUgfCBcCi0Jc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAotCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAotCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAotCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCi0JICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCi0JICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKLQkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKLQkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKLQl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCi0JICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAotCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKLQkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChiaW5kaXIpJCRkaXInIjsgXAotCSAgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAiJChERVNURElSKSQoYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAotCSAgICB9IFwKLQk7IGRvbmUKLQotdW5pbnN0YWxsLWJpblBST0dSQU1TOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAotCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKLQkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCi0JdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgKCBjZCAnJChERVNURElSKSQoYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCi0JY2QgIiQoREVTVERJUikkKGJpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKLQl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAotCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdAotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAotCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCi0JbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCi0Jcm0gLWYgJCRsaXN0Ci1leGFtcGxlJChFWEVFWFQpOiAkKGV4YW1wbGVfT0JKRUNUUykgJChleGFtcGxlX0RFUEVOREVOQ0lFUykgJChFWFRSQV9leGFtcGxlX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGV4YW1wbGUkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoZXhhbXBsZV9PQkpFQ1RTKSAkKGV4YW1wbGVfTERBREQpICQoTElCUykKLWxpbnV4dm5jJChFWEVFWFQpOiAkKGxpbnV4dm5jX09CSkVDVFMpICQobGludXh2bmNfREVQRU5ERU5DSUVTKSAkKEVYVFJBX2xpbnV4dm5jX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIGxpbnV4dm5jJChFWEVFWFQpCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGxpbnV4dm5jX09CSkVDVFMpICQobGludXh2bmNfTERBREQpICQoTElCUykKLXZuY29tbWFuZCQoRVhFRVhUKTogJCh2bmNvbW1hbmRfT0JKRUNUUykgJCh2bmNvbW1hbmRfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3ZuY29tbWFuZF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiB2bmNvbW1hbmQkKEVYRUVYVCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQodm5jb21tYW5kX09CSkVDVFMpICQodm5jb21tYW5kX0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9MaW51eFZOQy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvVk5Db21tYW5kLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9WTkNvbnNvbGUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2V4YW1wbGUuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChIRUFERVJTKQotaW5zdGFsbGRpcnM6Ci0JZm9yIGRpciBpbiAiJChERVNURElSKSQoYmluZGlyKSI7IGRvIFwKLQkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKLQlkb25lCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUwotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1iaW5QUk9HUkFNUyBcCi0JY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKLQlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi0JaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCi0JaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKLQlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKLQlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCi0JaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCi0JbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAotCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtYmluUFJPR1JBTVMKLQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS92bmN0ZXJtL1JFQURNRSBiL3ZuY3Rlcm0vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDFlODhhLi4wMDAwMDAwCi0tLSBhL3ZuY3Rlcm0vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCi1JbiB0aGlzIHN0YWdlIChiZXRhKSwgdGhlcmUgYXJlIHR3byBwcm9ncmFtcyBmdW5jdGlvbmFsOgotCi1MaW51eFZOQyA8dHR5IG51bWJlcj4KLQltb25pdG9yIGEgdmlydHVhbCBjb25zb2xlICh0ZXh0IG1vZGUpIG9mIExpbnV4LiBZb3UgbmVlZAotCXJvb3QgcHJpdmlsZWdlcywgb3IgYXQgbGVhc3QgYmUgaW4gdGhlICJ0dHkiIGdyb3VwLCBiZWNhdXNlCi0JaXQgcmVhZHMgL2Rldi92Y3NOIGFuZCB3cml0ZXMgL2Rldi90dHlOLgotCUl0IGZvbGxvd3MgdGhlIHNhbWUgaWRlYSBhcyBXaW5WTkMsIHgxMXZuYyBvciBPU1h2bmMsIGkuZS4gaXQKLQl0YWtlcyBhbiBleGlzdGluZyBkZXNrdG9wIGFuZCBleHBvcnRzIGl0IHZpYSBSRkIgKFZOQyksIGp1c3QgdGhhdAotCUxpbnV4Vk5DIGV4cG9ydHMgdGV4dC4KLQotVk5Db21tYW5kIDxjb21tYW5kPiA8YXJncz4KLQlleGVjdXRlcyA8Y29tbWFuZD4gcmVkaXJlY3Rpbmcgc3RkaW4gZnJvbSBhIHZuY3ZpZXdlciBhbmQgc3Rkb3V0ICYKLQlzdGRlcnIgdG8gdGhlIHZuYyBjbGllbnRzLiBUaGlzIG1pZ2h0IGJlIHJlbmFtZWQgdG8gdm5jVGVybSBpZgotCXRoZXJlIGFyZSBzb21lIHRlcm0gY2FwYWJpbGl0aWVzIGFkZGVkICh1cCB0byBub3csIGJhc2ggZG9lc24ndCBsb29rCi0JbmljZSkuIENvbG91cnMgYW5kIG90aGVyIEFOU0kgc2VxdWVuY2VzIG5lZWQgdG8gYmUgYWRkZWQuCi0KLU15IG9yaWdpbmFsIHBsYW4gd2FzIHRvIGNyZWF0ZSBhIHByb2dyYW0gbmFtZWQgdm5jVGVybS4gSXQgd2FzIG1lYW50IHRvCi1vdmVyY29tZSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCBURVJNcywgYnV0IEkgZm91bmQgInNjcmVlbiIgdG8KLWJlIGp1c3Qgc3VjaCBhIHByb2dyYW0uIE1heWJlIG9uY2Ugc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgSSdsbCBtYWtlIGEKLXBhdGNoIGZvciBzY3JlZW4gdG8gdXNlIFZOQ29uc29sZSB0byBleHBvcnQgaXQncyBjb250ZW50cyB2aWEgUkZCLi4uCi0KLVRoZXNlIHR3byBwcm9ncmFtcyBhcmUgYSBzaW1wbGUgYXBwbGljYXRpb24gb2YgTGliVk5DU2VydmVyIHdpdGggYSBzbWFsbAotY29uc29sZSBsYXllciBpbiBiZXR3ZWVuIChWTkNvbnNvbGUpLiBZb3UgY2FuIHVzZSB0aGVtIHVuZGVyIHRoZSB0ZXJtcwotKG5vdCB2bmNUZXJtcyA7LSkgb2YgdGhlIEdQTC4gVGhleSB3aGVyZSB3cml0dGVuIGJ5IEpvaGFubmVzIEUuIFNjaGluZGVsaW4uCmRpZmYgLS1naXQgYS92bmN0ZXJtL1RPRE8gYi92bmN0ZXJtL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNmYxODkuLjAwMDAwMDAKLS0tIGEvdm5jdGVybS9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotVk5Db25zb2xlOgotTGludXhWTkM6Ci1WTkNvbW1hbmQ6Ci0JbWFrZSBDb250cm9sIG9yIEFsdCBzZXF1ZW5jZXMgd29yay4KLQlGaW5kIG91dCBob3cgdG8gc2F0aXNmeSBpc2F0dHkoKS4gPT4gL2Rldi9wdHlOCi0JRml4IGNoZWNrIGlmIGNoaWxkIGlzIGFsaXZlLgotCUFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciByZWFsIGludGVyYWN0aXZlIG1vZGUuCi0KLWRvbmU6Ci0KLS50cmVhdCBjb2xvdXJzIGNvcnJlY3RseSAodXNlIC9kZXYvdmNzYU4ncyBhdHRyaWJ1dGVzKS4KLS5pbnRyb2R1Y2UgcGVyIGNlbGwgY29sb3VycyAoZm9yIGF0dHJpYnV0ZXMpCi0uZml4IGN1cnNvciBmdWNrdXAgd2hlbiBzZWxlY3RpbmcuCi0uZGVmYXVsdCB0byBwYXN0ZSBmb3IgcmlnaHQgbW91c2UgYnV0dG9uLgotLmhhdmUgYW4gaWRlYSBob3cgdG8gaW5zZXJ0IGtleXMKLS5jb252ZXJ0IFZOQ29tbWFuZCB0byBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAodm5jVGVybSkKLS5iaWRpcmVjdGlvbmFsIHBpcGVzIChzcGF3biBhIHNoZWxsIC4uLikKLS5tYXJrIHdpdGggbW91c2UgKGNvcHkgdGV4dCkKLS53aGVuIHNjcm9sbGluZywgY3Vyc29yIG11c3QgYmUgaGlkZGVuIQotCi0JbW9kaWZpZWRSZWdpb24gd2hpY2ggYXJlIGNvcGllZCB3aXRoIENvcHlSZWN0IGhhdmUgdG8gYmUgbW9kaWZpZWQgYWxzby4KZGlmZiAtLWdpdCBhL3ZuY3Rlcm0vVk5Db21tYW5kLmMgYi92bmN0ZXJtL1ZOQ29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2YyNTQzLi4wMDAwMDAwCi0tLSBhL3ZuY3Rlcm0vVk5Db21tYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotI2lmZGVmIF9fU1RSSUNUX0FOU0lfXwotI2RlZmluZSBfQlNEX1NPVVJDRQotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jZW5kaWYKLSNpbmNsdWRlICJWTkNvbnNvbGUuaCIKLSNpbmNsdWRlICJ2Z2EuaCIKLSNpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2lmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0jaWZkZWYgTElCVk5DU0VSVkVSX0hBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHJmYkJvb2wgaW50ZXJhY3RpdmU9RkFMU0Usc2VuZE9ubHlXaG9sZUxpbmVzPVRSVUU7Ci0gIGludCBzZXJ2ZXJBcmdjLHByb2dyYW1BcmcwOwotICBmb3Ioc2VydmVyQXJnYz0xO3NlcnZlckFyZ2M8YXJnYwotCSYmIGFyZ3Zbc2VydmVyQXJnY11bMF09PSctJyAmJiBhcmd2W3NlcnZlckFyZ2NdWzFdIT0nLSc7c2VydmVyQXJnYysrKQotICAgIGlmKCFzdHJjbXAoYXJndltzZXJ2ZXJBcmdjXSwiLWludGVyYWN0aXZlIikpIHsKLSAgICAgIGludGVyYWN0aXZlPVRSVUU7Ci0gICAgICBzZW5kT25seVdob2xlTGluZXM9RkFMU0U7Ci0KLSAgICAgIHJmYlB1cmdlQXJndW1lbnRzKCZhcmdjLCZzZXJ2ZXJBcmdjLDEsYXJndik7Ci0gICAgfQotICBwcm9ncmFtQXJnMD1zZXJ2ZXJBcmdjOwotICBpZihwcm9ncmFtQXJnMDxhcmdjICYmIGFyZ3ZbcHJvZ3JhbUFyZzBdWzBdPT0nLScgJiYgYXJndltwcm9ncmFtQXJnMF1bMV09PSctJykKLSAgICBwcm9ncmFtQXJnMCsrOwotICBhcmd2W2FyZ2NdPTA7Ci0KLSAgaWYocHJvZ3JhbUFyZzA8YXJnYykgewotICAgIGludCBpblsyXSxvdXRbMl0sZXJyWzJdLHBpZDsKLSAgICBpZihwaXBlKGluKTwwIHx8IHBpcGUob3V0KTwwIHx8IHBpcGUoZXJyKTwwKSB7Ci0gICAgICByZmJFcnIoIkNvdWxkbid0IG1ha2UgcGlwZXMhIik7Ci0gICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgcGlkPWZvcmsoKTsKLSAgICBpZighcGlkKSB7Ci0gICAgICBkdXAyKGluWzBdLDApOwotICAgICAgZHVwMihvdXRbMV0sMSk7Ci0gICAgICBkdXAyKGVyclsxXSwyKTsKLSAgICAgIC8qc2V0YnVmKHN0ZGluLE5VTEwpOyovCi0gICAgICBleGVjdnAoYXJndltwcm9ncmFtQXJnMF0sYXJnditwcm9ncmFtQXJnMCk7Ci0gICAgfQotCi0gICAgewotICAgICAgY2hhciBidWZmZXJbMTAyNF07Ci0gICAgICBmZF9zZXQgZnMsZnMxLyosaWZzLGlmczEqLzsKLSAgICAgIHN0cnVjdCB0aW1ldmFsIHR2LHR2MTsKLSAgICAgIGludCBpLGM9MSxudW1fZmRzLG1heF9mZD1vdXRbMF0sc3RhdHVzOwotICAgICAgRklMRSAqaW5wdXRfcGlwZTsKLSAgICAgIHZuY0NvbnNvbGVQdHIgY29uc29sZT12Y0dldENvbnNvbGUoJnNlcnZlckFyZ2MsYXJndiw4MCwyNSwmdmdhRm9udCxGQUxTRSk7Ci0gICAgICBpZihpbnRlcmFjdGl2ZSkKLQljb25zb2xlLT5kb0VjaG8gPSBGQUxTRTsKLQotICAgICAgaWYobWF4X2ZkPGVyclswXSkKLQltYXhfZmQ9ZXJyWzBdOwotICAgICAgRkRfWkVSTygmZnMpOwotICAgICAgRkRfU0VUKG91dFswXSwmZnMpOwotICAgICAgRkRfU0VUKGVyclswXSwmZnMpOwotICAgICAgLypGRF9TRVQoMCwmZnMpOyovCi0gICAgICB0di50dl9zZWM9MDsgdHYudHZfdXNlYz01MDAwOwotCi0gICAgICBpbnB1dF9waXBlPWZkb3BlbihpblsxXSwidyIpOwotICAgICAgc2V0YnVmKGlucHV0X3BpcGUsTlVMTCk7Ci0gICAgICB3aGlsZShjIHx8IHdhaXRwaWQocGlkLCZzdGF0dXMsV05PSEFORyk9PTApIHsKLQkvKiBldmVudCBsb29wICovCi0JdmNQcm9jZXNzRXZlbnRzKGNvbnNvbGUpOwotCi0JLyogZ2V0IGlucHV0ICovCi0JaWYoY29uc29sZS0+aW5wdXRDb3VudCkgewotCSAgaWYoc2VuZE9ubHlXaG9sZUxpbmVzKSB7Ci0JICAgIGZvcihpPTA7aTxjb25zb2xlLT5pbnB1dENvdW50O2krKykKLQkgICAgICBpZihjb25zb2xlLT5pbnB1dEJ1ZmZlcltpXT09J1xuJykgewotCQlpKys7Ci0JCWZ3cml0ZShjb25zb2xlLT5pbnB1dEJ1ZmZlcixpLDEsaW5wdXRfcGlwZSk7Ci0JCWZmbHVzaChpbnB1dF9waXBlKTsKLQkJLyogZndyaXRlKGNvbnNvbGUtPmlucHV0QnVmZmVyLGksMSxzdGRlcnIpOyAqLwotCQlpZihjb25zb2xlLT5pbnB1dENvdW50PmkpCi0JCSAgbWVtbW92ZShjb25zb2xlLT5pbnB1dEJ1ZmZlcixjb25zb2xlLT5pbnB1dEJ1ZmZlcitpLGNvbnNvbGUtPmlucHV0Q291bnQtaSk7Ci0JCWNvbnNvbGUtPmlucHV0Q291bnQtPWk7Ci0JCWk9MDsKLQkgICAgICB9Ci0JICB9IGVsc2UgewotCSAgICBmd3JpdGUoY29uc29sZS0+aW5wdXRCdWZmZXIsY29uc29sZS0+aW5wdXRDb3VudCwxLGlucHV0X3BpcGUpOwotCSAgICBmZmx1c2goaW5wdXRfcGlwZSk7Ci0JICAgIC8qIGZ3cml0ZShjb25zb2xlLT5pbnB1dEJ1ZmZlcixjb25zb2xlLT5pbnB1dENvdW50LDEsc3RkZXJyKTsgKi8KLQkgICAgY29uc29sZS0+aW5wdXRDb3VudD0wOwotCSAgfQotCX0KLQkvKiBwcm9jZXNzIG91dHB1dCAqLwotCWZzMT1mczsgdHYxPXR2OwotCW51bV9mZHM9c2VsZWN0KG1heF9mZCsxLCZmczEsTlVMTCxOVUxMLCZ0djEpOwotCWlmKG51bV9mZHM+MCkgewotCSAgLyoKLQkgIGlmKEZEX0lTU0VUKDAsJmZzMSkpIHsKLQkgICAgY2g9Z2V0Y2hhcigpOwotCSAgICBmcHV0YyhjaCxmKTsKLQkgIH0KLQkgICovCi0JICBpZihGRF9JU1NFVChvdXRbMF0sJmZzMSkpIHsKLQkgICAgYz1yZWFkKG91dFswXSxidWZmZXIsMTAyNCk7Ci0JICAgIGZvcihpPTA7aTxjO2krKykKLQkgICAgICB2Y1B1dENoYXIoY29uc29sZSxidWZmZXJbaV0pOwotCSAgfQotCSAgaWYoRkRfSVNTRVQoZXJyWzBdLCZmczEpKSB7Ci0JICAgIGM9cmVhZChlcnJbMF0sYnVmZmVyLDEwMjQpOwotCSAgICBmb3IoaT0wO2k8YztpKyspCi0JICAgICAgdmNQdXRDaGFyKGNvbnNvbGUsYnVmZmVyW2ldKTsKLQkgIH0JCQotCX0gZWxzZQotCSAgYz0wOwotICAgICAgfQotICAgIH0KLSAgfQotICByZmJMb2coImV4aXRcbiIpOwotICByZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS92bmN0ZXJtL1ZOQ29uc29sZS5jIGIvdm5jdGVybS9WTkNvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3ZGY1NC4uMDAwMDAwMAotLS0gYS92bmN0ZXJtL1ZOQ29uc29sZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxyZmIva2V5c3ltLmg+Ci0jaW5jbHVkZSAiVk5Db25zb2xlLmgiCi0KLSNkZWZpbmUgREVCVUcoeCkKLQotdW5zaWduZWQgY2hhciBjb2xvdXJNYXAxNlsxNiozXT17Ci0gIC8qIDAgYmxhY2sgICAgICAgIzAwMDAwMCAqLyAweDAwLDB4MDAsMHgwMCwKLSAgLyogMSBtYXJvb24gICAgICAjODAwMDAwICovIDB4ODAsMHgwMCwweDAwLAotICAvKiAyIGdyZWVuICAgICAgICMwMDgwMDAgKi8gMHgwMCwweDgwLDB4MDAsCi0gIC8qIDMga2hha2kgICAgICAgIzgwODAwMCAqLyAweDgwLDB4ODAsMHgwMCwKLSAgLyogNCBuYXZ5ICAgICAgICAjMDAwMDgwICovIDB4MDAsMHgwMCwweDgwLAotICAvKiA1IHB1cnBsZSAgICAgICM4MDAwODAgKi8gMHg4MCwweDAwLDB4ODAsCi0gIC8qIDYgYXF1YS1ncmVlbiAgIzAwODA4MCAqLyAweDAwLDB4ODAsMHg4MCwKLSAgLyogNyBsaWdodCBncmV5ICAjYzBjMGMwICovIDB4YzAsMHhjMCwweGMwLAotICAvKiA4IGRhcmsgZ3JleSAgICM4MDgwODAgKi8gMHg4MCwweDgwLDB4ODAsCi0gIC8qIDkgcmVkICAgICAgICAgI2ZmMDAwMCAqLyAweGZmLDB4MDAsMHgwMCwKLSAgLyogYSBsaWdodCBncmVlbiAjMDBmZjAwICovIDB4MDAsMHhmZiwweDAwLAotICAvKiBiIHllbGxvdyAgICAgICNmZmZmMDAgKi8gMHhmZiwweGZmLDB4MDAsCi0gIC8qIGMgYmx1ZSAgICAgICAgIzAwMDBmZiAqLyAweDAwLDB4MDAsMHhmZiwKLSAgLyogZCBwaW5rICAgICAgICAjZmYwMGZmICovIDB4ZmYsMHgwMCwweGZmLAotICAvKiBlIGxpZ2h0IGJsdWUgICMwMGZmZmYgKi8gMHgwMCwweGZmLDB4ZmYsCi0gIC8qIGYgd2hpdGUgICAgICAgI2ZmZmZmZiAqLyAweGZmLDB4ZmYsMHhmZgotfTsKLQotdm9pZCBNYWtlQ29sb3VyTWFwMTYodm5jQ29uc29sZVB0ciBjKQotewotICByZmJDb2xvdXJNYXAqIGNvbG91ck1hcD0mKGMtPnNjcmVlbi0+Y29sb3VyTWFwKTsKLSAgaWYoY29sb3VyTWFwLT5jb3VudCkKLSAgICBmcmVlKGNvbG91ck1hcC0+ZGF0YS5ieXRlcyk7Ci0gIGNvbG91ck1hcC0+ZGF0YS5ieXRlcz1tYWxsb2MoMTYqMyk7Ci0gIG1lbWNweShjb2xvdXJNYXAtPmRhdGEuYnl0ZXMsY29sb3VyTWFwMTYsMTYqMyk7Ci0gIGNvbG91ck1hcC0+Y291bnQ9MTY7Ci0gIGNvbG91ck1hcC0+aXMxNj1GQUxTRTsKLSAgYy0+c2NyZWVuLT5zZXJ2ZXJGb3JtYXQudHJ1ZUNvbG91cj1GQUxTRTsKLX0KLQotdm9pZCB2Y0RyYXdPckhpZGVDdXJzb3Iodm5jQ29uc29sZVB0ciBjKQotewotICBpbnQgaSxqLHc9Yy0+c2NyZWVuLT5wYWRkZWRXaWR0aEluQnl0ZXM7Ci0gIGNoYXIgKmI9Yy0+c2NyZWVuLT5mcmFtZUJ1ZmZlcitjLT55KmMtPmNIZWlnaHQqdytjLT54KmMtPmNXaWR0aDsKLSAgZm9yKGo9Yy0+Y3kxO2o8Yy0+Y3kyO2orKykKLSAgICBmb3IoaT1jLT5jeDE7aTxjLT5jeDI7aSsrKQotICAgICAgYltqKncraV1ePTB4MGY7Ci0gIHJmYk1hcmtSZWN0QXNNb2RpZmllZChjLT5zY3JlZW4sCi0JCQljLT54KmMtPmNXaWR0aCtjLT5jeDEsYy0+eSpjLT5jSGVpZ2h0K2MtPmN5MSwKLQkJCWMtPngqYy0+Y1dpZHRoK2MtPmN4MixjLT55KmMtPmNIZWlnaHQrYy0+Y3kyKTsKLSAgYy0+Y3Vyc29ySXNEcmF3bj1jLT5jdXJzb3JJc0RyYXduP0ZBTFNFOlRSVUU7Ci19Ci0KLXZvaWQgdmNEcmF3Q3Vyc29yKHZuY0NvbnNvbGVQdHIgYykKLXsKLSAgaWYoYy0+Y3Vyc29yQWN0aXZlICYmIGMtPnk8Yy0+aGVpZ2h0ICYmIGMtPng8Yy0+d2lkdGgpIHsKLSAgICAvKiByZmJMb2coIkRyYXdDdXJzb3I6ICVkLCVkXG4iLGMtPngsYy0+eSk7ICovCi0gICAgdmNEcmF3T3JIaWRlQ3Vyc29yKGMpOwotICB9Ci19Ci0KLXZvaWQgdmNIaWRlQ3Vyc29yKHZuY0NvbnNvbGVQdHIgYykKLXsKLSAgaWYoYy0+Y3VycmVudGx5TWFya2luZykKLSAgICB2Y1VubWFyayhjKTsKLSAgdmNEcmF3T3JIaWRlQ3Vyc29yKGMpOwotfQotCi12b2lkIHZjTWFrZVN1cmVDdXJzb3JJc0RyYXduKHJmYkNsaWVudFB0ciBjbCkKLXsKLSAgdm5jQ29uc29sZVB0ciBjPSh2bmNDb25zb2xlUHRyKWNsLT5zY3JlZW4tPnNjcmVlbkRhdGE7Ci0gIGlmKCFjLT5kb250RHJhd0N1cnNvcikKLSAgICB2Y0RyYXdDdXJzb3IoYyk7Ci19Ci0KLXZuY0NvbnNvbGVQdHIgdmNHZXRDb25zb2xlKGludCAqYXJnYyxjaGFyICoqYXJndiwKLQkJCSAgIGludCB3aWR0aCxpbnQgaGVpZ2h0LHJmYkZvbnREYXRhUHRyIGZvbnQKLSNpZmRlZiBVU0VfQVRUUklCVVRFX0JVRkZFUgotCQkJICAgLHJmYkJvb2wgd2l0aEF0dHJpYnV0ZXMKLSNlbmRpZgotCQkJICAgKQotewotICB2bmNDb25zb2xlUHRyIGM9KHZuY0NvbnNvbGVQdHIpbWFsbG9jKHNpemVvZih2bmNDb25zb2xlKSk7Ci0KLSAgYy0+Zm9udD1mb250OwotICBjLT53aWR0aD13aWR0aDsKLSAgYy0+aGVpZ2h0PWhlaWdodDsKLSAgYy0+c2NyZWVuQnVmZmVyPShjaGFyKiltYWxsb2Mod2lkdGgqaGVpZ2h0KTsKLSAgbWVtc2V0KGMtPnNjcmVlbkJ1ZmZlciwnICcsd2lkdGgqaGVpZ2h0KTsKLSNpZmRlZiBVU0VfQVRUUklCVVRFX0JVRkZFUgotICBpZih3aXRoQXR0cmlidXRlcykgewotICAgIGMtPmF0dHJpYnV0ZUJ1ZmZlcj0oY2hhciopbWFsbG9jKHdpZHRoKmhlaWdodCk7Ci0gICAgbWVtc2V0KGMtPmF0dHJpYnV0ZUJ1ZmZlciwweDA3LHdpZHRoKmhlaWdodCk7Ci0gIH0gZWxzZQotICAgIGMtPmF0dHJpYnV0ZUJ1ZmZlcj1OVUxMOwotI2VuZGlmCi0gIGMtPng9MDsKLSAgYy0+eT0wOwotICBjLT53cmFwQm90dG9tVG9Ub3A9RkFMU0U7Ci0gIGMtPmN1cnNvckFjdGl2ZT1UUlVFOwotICBjLT5jdXJzb3JJc0RyYXduPUZBTFNFOwotICBjLT5kb250RHJhd0N1cnNvcj1GQUxTRTsKLSAgYy0+aW5wdXRCdWZmZXI9KGNoYXIqKW1hbGxvYygxMDI0KTsKLSAgYy0+aW5wdXRTaXplPTEwMjQ7Ci0gIGMtPmlucHV0Q291bnQ9MDsKLSAgYy0+c2VsZWN0aW9uPTA7Ci0gIGMtPnNlbGVjdFRpbWVPdXQ9NDAwMDA7IC8qIDQwIG1zICovCi0gIGMtPmRvRWNobz1UUlVFOwotCi0gIGMtPndhc1JpZ2h0QnV0dG9uRG93bj1GQUxTRTsKLSAgYy0+Y3VycmVudGx5TWFya2luZz1GQUxTRTsKLQotICByZmJXaG9sZUZvbnRCQm94KGZvbnQsJmMtPnhob3QsJmMtPmNIZWlnaHQsJmMtPmNXaWR0aCwmYy0+eWhvdCk7Ci0gIGMtPmNXaWR0aC09Yy0+eGhvdDsKLSAgYy0+Y0hlaWdodD0tYy0+Y0hlaWdodC1jLT55aG90OwotCi0gIC8qIHRleHQgY3Vyc29yICovCi0gIGMtPmN4MT1jLT5jV2lkdGgvODsKLSAgYy0+Y3gyPWMtPmNXaWR0aCo3Lzg7Ci0gIGMtPmN5Mj1jLT5jSGVpZ2h0LTEtYy0+eWhvdCtjLT5jSGVpZ2h0LzE2OwotICBpZihjLT5jeTI+PWMtPmNIZWlnaHQpCi0gICAgYy0+Y3kyPWMtPmNIZWlnaHQtMTsKLSAgYy0+Y3kxPWMtPmN5Mi1jLT5jSGVpZ2h0Lzg7Ci0gIGlmKGMtPmN5MTwwKQotICAgIGMtPmN5Mj0wOwotCi0gIGlmKCEoYy0+c2NyZWVuID0gcmZiR2V0U2NyZWVuKGFyZ2MsYXJndixjLT5jV2lkdGgqYy0+d2lkdGgsYy0+Y0hlaWdodCpjLT5oZWlnaHQsOCwxLDEpKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgYy0+c2NyZWVuLT5zY3JlZW5EYXRhPSh2b2lkKiljOwotICBjLT5zY3JlZW4tPmRpc3BsYXlIb29rPXZjTWFrZVN1cmVDdXJzb3JJc0RyYXduOwotICBjLT5zY3JlZW4tPmZyYW1lQnVmZmVyPQotICAgIChjaGFyKiltYWxsb2MoYy0+c2NyZWVuLT53aWR0aCpjLT5zY3JlZW4tPmhlaWdodCk7Ci0gIG1lbXNldChjLT5zY3JlZW4tPmZyYW1lQnVmZmVyLGMtPmJhY2tDb2xvdXIsCi0JIGMtPnNjcmVlbi0+d2lkdGgqYy0+c2NyZWVuLT5oZWlnaHQpOwotICBjLT5zY3JlZW4tPmtiZEFkZEV2ZW50PXZjS2JkQWRkRXZlbnRQcm9jOwotICBjLT5zY3JlZW4tPnB0ckFkZEV2ZW50PXZjUHRyQWRkRXZlbnRQcm9jOwotICBjLT5zY3JlZW4tPnNldFhDdXRUZXh0PXZjU2V0WEN1dFRleHRQcm9jOwotCi0gIE1ha2VDb2xvdXJNYXAxNihjKTsKLSAgYy0+Zm9yZUNvbG91cj0weDc7Ci0gIGMtPmJhY2tDb2xvdXI9MDsKLQotICByZmJJbml0U2VydmVyKGMtPnNjcmVlbik7Ci0KLSAgcmV0dXJuKGMpOwotfQotCi0jaW5jbHVkZSA8cmZiL3JmYnJlZ2lvbi5oPgotCi0vKiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiwgaGlkZSB0aGUgY3Vyc29yICovCi12b2lkIHZjU2Nyb2xsKHZuY0NvbnNvbGVQdHIgYyxpbnQgbGluZUNvdW50KQotewotICBpbnQgeTEseTI7Ci0gIHJmYlNjcmVlbkluZm9QdHIgcz1jLT5zY3JlZW47Ci0KLSAgaWYobGluZUNvdW50PT0wKQotICAgIHJldHVybjsKLQotICAvKiByZmJMb2coImJlZ2luIHNjcm9sbFxuIik7ICovCi0gIHZjSGlkZUN1cnNvcihjKTsKLSAgYy0+ZG9udERyYXdDdXJzb3I9VFJVRTsKLQotICBpZihsaW5lQ291bnQ+PWMtPmhlaWdodCB8fCBsaW5lQ291bnQ8PS1jLT5oZWlnaHQpIHsKLSAgICB5MT0wOyB5Mj1zLT5oZWlnaHQ7Ci0gIH0gZWxzZSBpZihsaW5lQ291bnQ+MCkgewotICAgIHkxPXMtPmhlaWdodC1saW5lQ291bnQqYy0+Y0hlaWdodDsgeTI9cy0+aGVpZ2h0OwotICAgIHJmYkRvQ29weVJlY3QocywwLDAscy0+d2lkdGgseTEsMCwtbGluZUNvdW50KmMtPmNIZWlnaHQpOwotICAgIG1lbW1vdmUoYy0+c2NyZWVuQnVmZmVyLAotCSAgICBjLT5zY3JlZW5CdWZmZXIrKGMtPmhlaWdodC1saW5lQ291bnQpKmMtPndpZHRoLAotCSAgICAoYy0+aGVpZ2h0LWxpbmVDb3VudCkqYy0+d2lkdGgpOwotI2lmZGVmIFVTRV9BVFRSSUJVVEVfQlVGRkVSCi0gICAgaWYoYy0+YXR0cmlidXRlQnVmZmVyKQotCSAgICBtZW1tb3ZlKGMtPmF0dHJpYnV0ZUJ1ZmZlciwKLQkJICAgIGMtPmF0dHJpYnV0ZUJ1ZmZlcisoYy0+aGVpZ2h0LWxpbmVDb3VudCkqYy0+d2lkdGgsCi0JCSAgICAoYy0+aGVpZ2h0LWxpbmVDb3VudCkqYy0+d2lkdGgpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgeTE9MDsgeTI9LWxpbmVDb3VudCpjLT5jSGVpZ2h0OwotICAgIHJmYkRvQ29weVJlY3QocywwLHkyLHMtPndpZHRoLHMtPmhlaWdodCwwLC1saW5lQ291bnQqYy0+Y0hlaWdodCk7Ci0gICAgbWVtbW92ZShjLT5zY3JlZW5CdWZmZXItbGluZUNvdW50KmMtPndpZHRoLAotCSAgICBjLT5zY3JlZW5CdWZmZXIsCi0JICAgIChjLT5oZWlnaHQrbGluZUNvdW50KSpjLT53aWR0aCk7Ci0jaWZkZWYgVVNFX0FUVFJJQlVURV9CVUZGRVIKLSAgICBpZihjLT5hdHRyaWJ1dGVCdWZmZXIpCi0JICAgIG1lbW1vdmUoYy0+YXR0cmlidXRlQnVmZmVyLWxpbmVDb3VudCpjLT53aWR0aCwKLQkJICAgIGMtPmF0dHJpYnV0ZUJ1ZmZlciwKLQkJICAgIChjLT5oZWlnaHQrbGluZUNvdW50KSpjLT53aWR0aCk7Ci0jZW5kaWYKLSAgfQotCi0gIGMtPmRvbnREcmF3Q3Vyc29yPUZBTFNFOwotICBtZW1zZXQocy0+ZnJhbWVCdWZmZXIreTEqcy0+d2lkdGgsYy0+YmFja0NvbG91ciwoeTIteTEpKnMtPndpZHRoKTsKLSAgcmZiTWFya1JlY3RBc01vZGlmaWVkKHMsMCx5MS1jLT5jSGVpZ2h0LHMtPndpZHRoLHkyKTsKLSAgbWVtc2V0KGMtPnNjcmVlbkJ1ZmZlcit5MS9jLT5jSGVpZ2h0KmMtPndpZHRoLCcgJywKLQkgKHkyLXkxKS9jLT5jSGVpZ2h0KmMtPndpZHRoKTsKLSNpZmRlZiBVU0VfQVRUUklCVVRFX0JVRkZFUgotICBpZihjLT5hdHRyaWJ1dGVCdWZmZXIpCi0JICBtZW1zZXQoYy0+YXR0cmlidXRlQnVmZmVyK3kxL2MtPmNIZWlnaHQqYy0+d2lkdGgsMHgwNywKLQkJICh5Mi15MSkvYy0+Y0hlaWdodCpjLT53aWR0aCk7Ci0jZW5kaWYKLSAgLyogcmZiTG9nKCJlbmQgc2Nyb2xsXG4iKTsgKi8KLX0gIAotCi12b2lkIHZjQ2hlY2tDb29yZGluYXRlcyh2bmNDb25zb2xlUHRyIGMpCi17Ci0gIGlmKGMtPng+PWMtPndpZHRoKSB7Ci0gICAgYy0+eD0wOwotICAgIGMtPnkrKzsKLSAgfQotICBpZihjLT55Pj1jLT5oZWlnaHQpIHsKLSAgICBpZihjLT53cmFwQm90dG9tVG9Ub3ApCi0gICAgICBjLT55PTA7Ci0gICAgZWxzZSB7Ci0gICAgICB2Y1Njcm9sbChjLGMtPnkrMS1jLT5oZWlnaHQpOwotICAgICAgYy0+eT1jLT5oZWlnaHQtMTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB2Y1B1dENoYXIodm5jQ29uc29sZVB0ciBjLHVuc2lnbmVkIGNoYXIgY2gpCi17Ci0jaWZkZWYgVVNFX0FUVFJJQlVURV9CVUZGRVIKLSAgaWYoYy0+YXR0cmlidXRlQnVmZmVyKSB7Ci0gICAgdW5zaWduZWQgY2hhciBjb2xvdXI9Yy0+YXR0cmlidXRlQnVmZmVyW2MtPngrYy0+eSpjLT53aWR0aF07Ci0gICAgdmNQdXRDaGFyQ29sb3VyKGMsY2gsY29sb3VyJjB4Nyxjb2xvdXI+PjQpOwotICB9IGVsc2UKLSNlbmRpZgotICAgIHZjUHV0Q2hhckNvbG91cihjLGNoLGMtPmZvcmVDb2xvdXIsYy0+YmFja0NvbG91cik7Ci19Ci0KLXZvaWQgdmNQdXRDaGFyQ29sb3VyKHZuY0NvbnNvbGVQdHIgYyx1bnNpZ25lZCBjaGFyIGNoLHVuc2lnbmVkIGNoYXIgZm9yZUNvbG91cix1bnNpZ25lZCBjaGFyIGJhY2tDb2xvdXIpCi17Ci0gIHJmYlNjcmVlbkluZm9QdHIgcz1jLT5zY3JlZW47Ci0gIGludCBqLHgseTsKLQotICB2Y0hpZGVDdXJzb3IoYyk7Ci0gIGlmKGNoPCcgJykgewotICAgIHN3aXRjaChjaCkgewotICAgIGNhc2UgNzoKLSAgICBjYXNlIDEzOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OiAvKiBCYWNrU3BhY2UgKi8KLSAgICAgIGlmKGMtPng+MCkgewotCWMtPngtLTsKLQl2Y1B1dENoYXIoYywnICcpOwotCWMtPngtLTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6IC8qIHJldHVybiAqLwotICAgICAgYy0+eD0wOwotICAgICAgYy0+eSsrOwotICAgICAgdmNDaGVja0Nvb3JkaW5hdGVzKGMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OiAvKiB0YWJ1bGF0b3IgKi8KLSAgICAgIGRvIHsKLQl2Y1B1dENoYXIoYywnICcpOwotICAgICAgfSB3aGlsZShjLT54JTgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICByZmJMb2coInB1dGNoYXIgb2YgdW5rbm93biBjaGFyYWN0ZXI6ICVjKCVkKS5cbiIsY2gsY2gpOwotICAgICAgdmNQdXRDaGFyKGMsJyAnKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0jaWZkZWYgVVNFX0FUVFJJQlVURV9CVUZGRVIKLSAgICBpZihjLT5hdHRyaWJ1dGVCdWZmZXIpCi0gICAgICBjLT5hdHRyaWJ1dGVCdWZmZXJbYy0+eCtjLT55KmMtPndpZHRoXT1mb3JlQ29sb3VyfChiYWNrQ29sb3VyPDw0KTsKLSNlbmRpZgotICAgIHg9Yy0+eCpjLT5jV2lkdGg7Ci0gICAgeT1jLT55KmMtPmNIZWlnaHQ7Ci0gICAgZm9yKGo9eStjLT5jSGVpZ2h0LTE7aj49eTtqLS0pCi0gICAgICBtZW1zZXQocy0+ZnJhbWVCdWZmZXIraipzLT53aWR0aCt4LGJhY2tDb2xvdXIsYy0+Y1dpZHRoKTsKLSAgICByZmJEcmF3Q2hhcihzLGMtPmZvbnQsCi0JCXgtYy0+eGhvdCsoYy0+Y1dpZHRoLXJmYldpZHRoT2ZDaGFyKGMtPmZvbnQsY2gpKS8yLAotCQl5K2MtPmNIZWlnaHQtYy0+eWhvdC0xLAotCQljaCxmb3JlQ29sb3VyKTsKLSAgICBjLT5zY3JlZW5CdWZmZXJbYy0+eSpjLT53aWR0aCtjLT54XT1jaDsKLSAgICBjLT54Kys7Ci0gICAgcmZiTWFya1JlY3RBc01vZGlmaWVkKHMseCx5LWMtPmNIZWlnaHQrMSx4K2MtPmNXaWR0aCx5K2MtPmNIZWlnaHQrMSk7Ci0gICAgdmNDaGVja0Nvb3JkaW5hdGVzKGMpOwotICB9Ci19Ci0KLXZvaWQgdmNQcmludCh2bmNDb25zb2xlUHRyIGMsdW5zaWduZWQgY2hhciogc3RyKQotewotICB3aGlsZSgqc3RyKSB7Ci0gICAgdmNQdXRDaGFyKGMsKnN0cik7Ci0gICAgc3RyKys7Ci0gIH0KLX0KLQotdm9pZCB2Y1ByaW50Q29sb3VyKHZuY0NvbnNvbGVQdHIgYyx1bnNpZ25lZCBjaGFyKiBzdHIsdW5zaWduZWQgY2hhciBmb3JlQ29sb3VyLHVuc2lnbmVkIGNoYXIgYmFja0NvbG91cikKLXsKLSAgd2hpbGUoKnN0cikgewotICAgIHZjUHV0Q2hhckNvbG91cihjLCpzdHIsZm9yZUNvbG91cixiYWNrQ29sb3VyKTsKLSAgICBzdHIrKzsKLSAgfQotfQotCi12b2lkIHZjUHJpbnRGKHZuY0NvbnNvbGVQdHIgYyxjaGFyKiBmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmWzQwOTZdOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICB2c3ByaW50ZihidWYsIGZvcm1hdCwgYXJncyk7Ci0gIHZjUHJpbnQoYywodW5zaWduZWQgY2hhciopYnVmKTsKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi12b2lkIHZjUHJpbnRGQ29sb3VyKHZuY0NvbnNvbGVQdHIgYyx1bnNpZ25lZCBjaGFyIGZvcmVDb2xvdXIsdW5zaWduZWQgY2hhciBiYWNrQ29sb3VyLGNoYXIqIGZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZbNDA5Nl07Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhcmdzKTsKLSAgdmNQcmludENvbG91cihjLCh1bnNpZ25lZCBjaGFyKilidWYsZm9yZUNvbG91cixiYWNrQ29sb3VyKTsKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi1jaGFyIHZjR2V0Q2godm5jQ29uc29sZVB0ciBjKQotewotICBpZihjLT5pbnB1dENvdW50PjApIHsKLSAgICBjaGFyIGNoOwotICAgIGNoPWMtPmlucHV0QnVmZmVyWzBdOwotICAgIGMtPmlucHV0Q291bnQtLTsKLSAgICBpZihjLT5pbnB1dENvdW50PjApCi0gICAgICBtZW1tb3ZlKGMtPmlucHV0QnVmZmVyLGMtPmlucHV0QnVmZmVyKzEsYy0+aW5wdXRDb3VudCk7Ci0gICAgcmV0dXJuKGNoKTsKLSAgfSBlbHNlCi0gICAgcmV0dXJuKDApOwotfQotCi1jaGFyIHZjR2V0Q2hhcih2bmNDb25zb2xlUHRyIGMpCi17Ci0gIHdoaWxlKHJmYklzQWN0aXZlKGMtPnNjcmVlbikgJiYgYy0+aW5wdXRDb3VudD09MCkKLSAgICB2Y1Byb2Nlc3NFdmVudHMoYyk7Ci0gIHJldHVybih2Y0dldENoKGMpKTsKLX0KLQotY2hhciAqdmNHZXRTdHJpbmcodm5jQ29uc29sZVB0ciBjLGNoYXIgKmJ1ZmZlcixpbnQgYnVmZmVyU2l6ZSkKLXsKLSAgY2hhciAqYnVmZmVyQmFja3VwPWMtPmlucHV0QnVmZmVyOwotICBpbnQgaSxjb3VudD1idWZmZXJTaXplLTE7Ci0KLSAgaWYoY291bnQ+Yy0+aW5wdXRDb3VudCkKLSAgICBjb3VudD1jLT5pbnB1dENvdW50OwotICBmb3IoaT0xO2k8Y291bnQgJiYgYnVmZmVyQmFja3VwW2ktMV0hPSdcbic7aSsrKTsKLSAgaWYoaTxjb3VudCB8fCBpPT1idWZmZXJTaXplLTEpIHsKLSAgICBtZW1jcHkoYnVmZmVyLGJ1ZmZlckJhY2t1cCxpKTsKLSAgICBidWZmZXJbaSsxXT0wOwotICAgIGMtPmlucHV0Q291bnQtPWk7Ci0gICAgbWVtbW92ZShidWZmZXJCYWNrdXAsYnVmZmVyQmFja3VwK2krMixjLT5pbnB1dENvdW50KTsKLSAgICByZXR1cm4oYnVmZmVyKTsKLSAgfQotICBtZW1jcHkoYnVmZmVyLGJ1ZmZlckJhY2t1cCxjLT5pbnB1dENvdW50KTsKLSAgY291bnQ9Yy0+aW5wdXRTaXplOwotICBjLT5pbnB1dFNpemU9YnVmZmVyU2l6ZTsKLSAgYy0+aW5wdXRCdWZmZXI9YnVmZmVyOwotICB3aGlsZShyZmJJc0FjdGl2ZShjLT5zY3JlZW4pCi0gICAgICAmJiBjLT5pbnB1dENvdW50PGJ1ZmZlclNpemUtMSAmJiBidWZmZXJbYy0+aW5wdXRDb3VudC0xXSE9J1xuJykKLSAgICB2Y1Byb2Nlc3NFdmVudHMoYyk7Ci0gIGJ1ZmZlcltjLT5pbnB1dENvdW50XT0wOwotICBjLT5pbnB1dEJ1ZmZlcj1idWZmZXJCYWNrdXA7Ci0gIGMtPmlucHV0U2l6ZT1jb3VudDsKLSAgYy0+aW5wdXRDb3VudD0wOwotICByZXR1cm4oYnVmZmVyKTsKLX0KLQotdm9pZCB2Y0tiZEFkZEV2ZW50UHJvYyhyZmJCb29sIGRvd24scmZiS2V5U3ltIGtleVN5bSxyZmJDbGllbnRQdHIgY2wpCi17Ci0gIHZuY0NvbnNvbGVQdHIgYz0odm5jQ29uc29sZVB0ciljbC0+c2NyZWVuLT5zY3JlZW5EYXRhOwotICBpZihkb3duKSB7Ci0gICAgaWYoYy0+aW5wdXRDb3VudDxjLT5pbnB1dFNpemUpIHsKLSAgICAgIGlmKGtleVN5bTwwIHx8IGtleVN5bT4weGZmKSB7Ci0JaWYoa2V5U3ltPT1YS19SZXR1cm4pIGtleVN5bT0nXG4nOwotCWVsc2UgaWYoa2V5U3ltPT1YS19CYWNrU3BhY2UpIGtleVN5bT04OwotICAgICAgICBlbHNlIGlmKGtleVN5bT09WEtfVGFiKSBrZXlTeW09OTsKLQllbHNlIGtleVN5bT0wOwotICAgICAgfQotICAgICAgaWYoa2V5U3ltPjApIHsKLQlpZihrZXlTeW09PTgpIHsKLQkgIGlmKGMtPmlucHV0Q291bnQ+MCkKLQkgICAgYy0+aW5wdXRDb3VudC0tOwotCX0gZWxzZQotCSAgYy0+aW5wdXRCdWZmZXJbYy0+aW5wdXRDb3VudCsrXT0oY2hhcilrZXlTeW07Ci0JaWYoYy0+ZG9FY2hvKQotCSAgdmNQdXRDaGFyKGMsKHVuc2lnbmVkIGNoYXIpa2V5U3ltKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB2Y1B0ckFkZEV2ZW50UHJvYyhpbnQgYnV0dG9uTWFzayxpbnQgeCxpbnQgeSxyZmJDbGllbnRQdHIgY2wpCi17Ci0gIHZuY0NvbnNvbGVQdHIgYz0odm5jQ29uc29sZVB0ciljbC0+c2NyZWVuLT5zY3JlZW5EYXRhOwotCi0gIGlmKGMtPndhc1JpZ2h0QnV0dG9uRG93bikgewotICAgIGlmKChidXR0b25NYXNrJjQpPT0wKSB7Ci0gICAgICBpZihjLT5zZWxlY3Rpb24pIHsKLQljaGFyKiBzOwotCWZvcihzPWMtPnNlbGVjdGlvbjsqcztzKyspIHsKLQkgIGMtPnNjcmVlbi0+a2JkQWRkRXZlbnQoMSwqcyxjbCk7Ci0JICBjLT5zY3JlZW4tPmtiZEFkZEV2ZW50KDAsKnMsY2wpOwotCX0KLSAgICAgIH0KLSAgICAgIGMtPndhc1JpZ2h0QnV0dG9uRG93bj0wOwotICAgIH0KLSAgfSBlbHNlIGlmKGJ1dHRvbk1hc2smNCkKLSAgICBjLT53YXNSaWdodEJ1dHRvbkRvd249MTsKLSAgICAgIAotICBpZihidXR0b25NYXNrJjEpIHsKLSAgICBpbnQgY3g9eC9jLT5jV2lkdGgsY3k9eS9jLT5jSGVpZ2h0LHBvczsKLSAgICBpZihjeDwwKSBjeD0wOyBlbHNlIGlmKGN4Pj1jLT53aWR0aCkgY3g9Yy0+d2lkdGgtMTsKLSAgICBpZihjeTwwKSBjeT0wOyBlbHNlIGlmKGN5Pj1jLT5oZWlnaHQpIGN5PWMtPmhlaWdodC0xOwotICAgIHBvcz1jeSpjLT53aWR0aCtjeDsKLQotICAgIC8qIG1hcmsgKi8KLSAgICBpZighYy0+Y3VycmVudGx5TWFya2luZykgewotICAgICAgYy0+Y3VycmVudGx5TWFya2luZz1UUlVFOwotICAgICAgYy0+bWFya1N0YXJ0PXBvczsKLSAgICAgIGMtPm1hcmtFbmQ9cG9zOwotICAgICAgdmNUb2dnbGVNYXJrQ2VsbChjLHBvcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERFQlVHKHJmYkxvZygibWFya1N0YXJ0OiAlZCwgbWFya0VuZDogJWQsIHBvczogJWRcbiIsCi0JICAgICAgYy0+bWFya1N0YXJ0LGMtPm1hcmtFbmQscG9zKSk7Ci0gICAgICBpZihjLT5tYXJrRW5kIT1wb3MpIHsKLQlpZihjLT5tYXJrRW5kPHBvcykgewotCSAgY3g9Yy0+bWFya0VuZDsgY3k9cG9zOwotCX0gZWxzZSB7Ci0JICBjeD1wb3M7IGN5PWMtPm1hcmtFbmQ7Ci0JfQotCWlmKGN4PGMtPm1hcmtTdGFydCkgewotCSAgaWYoY3k8Yy0+bWFya1N0YXJ0KQotCSAgICBjeS0tOwotCX0gZWxzZQotCSAgY3grKzsKLQl3aGlsZShjeDw9Y3kpIHsKLQkgIHZjVG9nZ2xlTWFya0NlbGwoYyxjeCk7Ci0JICBjeCsrOwotCX0KLQljLT5tYXJrRW5kPXBvczsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZihjLT5jdXJyZW50bHlNYXJraW5nKSB7Ci0gICAgaW50IGksajsKLSAgICBpZihjLT5tYXJrU3RhcnQ8Yy0+bWFya0VuZCkgewotICAgICAgaT1jLT5tYXJrU3RhcnQ7IGo9Yy0+bWFya0VuZCsxOwotICAgIH0gZWxzZSB7Ci0gICAgICBpPWMtPm1hcmtFbmQ7IGo9Yy0+bWFya1N0YXJ0OwotICAgIH0KLSAgICBpZihjLT5zZWxlY3Rpb24pIGZyZWUoYy0+c2VsZWN0aW9uKTsKLSAgICBjLT5zZWxlY3Rpb249KGNoYXIqKW1hbGxvYyhqLWkrMSk7Ci0gICAgbWVtY3B5KGMtPnNlbGVjdGlvbixjLT5zY3JlZW5CdWZmZXIraSxqLWkpOwotICAgIGMtPnNlbGVjdGlvbltqLWldPTA7Ci0gICAgdmNVbm1hcmsoYyk7Ci0gICAgcmZiR290WEN1dFRleHQoYy0+c2NyZWVuLGMtPnNlbGVjdGlvbixqLWkpOwotICB9Ci0gIHJmYkRlZmF1bHRQdHJBZGRFdmVudChidXR0b25NYXNrLHgseSxjbCk7Ci19Ci0KLXZvaWQgdmNTZXRYQ3V0VGV4dFByb2MoY2hhciogc3RyLGludCBsZW4sIHN0cnVjdCBfcmZiQ2xpZW50UmVjKiBjbCkKLXsKLSAgdm5jQ29uc29sZVB0ciBjPSh2bmNDb25zb2xlUHRyKWNsLT5zY3JlZW4tPnNjcmVlbkRhdGE7Ci0KLSAgaWYoYy0+c2VsZWN0aW9uKSBmcmVlKGMtPnNlbGVjdGlvbik7Ci0gIGMtPnNlbGVjdGlvbj0oY2hhciopbWFsbG9jKGxlbisxKTsKLSAgbWVtY3B5KGMtPnNlbGVjdGlvbixzdHIsbGVuKTsKLSAgYy0+c2VsZWN0aW9uW2xlbl09MDsKLX0KLQotdm9pZCB2Y1RvZ2dsZU1hcmtDZWxsKHZuY0NvbnNvbGVQdHIgYyxpbnQgcG9zKQotewotICBpbnQgeD0ocG9zJWMtPndpZHRoKSpjLT5jV2lkdGgsCi0gICAgeT0ocG9zL2MtPndpZHRoKSpjLT5jSGVpZ2h0OwotICBpbnQgaSxqOwotICByZmJTY3JlZW5JbmZvUHRyIHM9Yy0+c2NyZWVuOwotICBjaGFyICpiPXMtPmZyYW1lQnVmZmVyK3kqcy0+d2lkdGgreDsKLSAgZm9yKGo9MDtqPGMtPmNIZWlnaHQ7aisrKQotICAgIGZvcihpPTA7aTxjLT5jV2lkdGg7aSsrKQotICAgICAgYltqKnMtPndpZHRoK2ldXj0weDBmOwotICByZmJNYXJrUmVjdEFzTW9kaWZpZWQoYy0+c2NyZWVuLHgseSx4K2MtPmNXaWR0aCx5K2MtPmNIZWlnaHQpOwotfQotCi12b2lkIHZjVW5tYXJrKHZuY0NvbnNvbGVQdHIgYykKLXsKLSAgaW50IGksajsKLSAgYy0+Y3VycmVudGx5TWFya2luZz1GQUxTRTsKLSAgaWYoYy0+bWFya1N0YXJ0PGMtPm1hcmtFbmQpIHsKLSAgICBpPWMtPm1hcmtTdGFydDsgaj1jLT5tYXJrRW5kKzE7Ci0gIH0gZWxzZSB7Ci0gICAgaT1jLT5tYXJrRW5kOyBqPWMtPm1hcmtTdGFydDsKLSAgfQotICBmb3IoO2k8ajtpKyspCi0gICAgdmNUb2dnbGVNYXJrQ2VsbChjLGkpOwotfQotCi12b2lkIHZjUHJvY2Vzc0V2ZW50cyh2bmNDb25zb2xlUHRyIGMpCi17Ci0gIHJmYlByb2Nlc3NFdmVudHMoYy0+c2NyZWVuLGMtPnNlbGVjdFRpbWVPdXQpOwotfQotCmRpZmYgLS1naXQgYS92bmN0ZXJtL1ZOQ29uc29sZS5oIGIvdm5jdGVybS9WTkNvbnNvbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ODIyZC4uMDAwMDAwMAotLS0gYS92bmN0ZXJtL1ZOQ29uc29sZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI2luY2x1ZGUgPHJmYi9yZmIuaD4KLQotLyogdGhpcyBpcyBub3cgdGhlIGRlZmF1bHQgKi8KLSNkZWZpbmUgVVNFX0FUVFJJQlVURV9CVUZGRVIKLQotdHlwZWRlZiBzdHJ1Y3Qgdm5jQ29uc29sZSB7Ci0gIC8qIHdpZHRoIGFuZCBoZWlnaHQgaW4gY2VsbHMgKD1jaGFyYWN0ZXJzKSAqLwotICBpbnQgd2lkdGgsIGhlaWdodDsKLQotICAvKiBjdXJyZW50IHBvc2l0aW9uICovCi0gIGludCB4LHk7Ci0KLSAgLyogY2hhcmFjdGVycyAqLwotICBjaGFyICpzY3JlZW5CdWZmZXI7Ci0KLSNpZmRlZiBVU0VfQVRUUklCVVRFX0JVRkZFUgotICAvKiBhdHRyaWJ1dGVzOiBjb2xvdXJzLiBJZiBOVUxMLCBkZWZhdWx0IHRvIGdyYXkgb24gYmxhY2ssIGVsc2UKLSAgICAgZm9yIGVhY2ggY2VsbCBhbiB1bnNpZ25lZCBjaGFyIGhvbGRzIGZvcmVDb2xvdXJ8KGJhY2tDb2xvdXI8PDQpICovCi0gIGNoYXIgKmF0dHJpYnV0ZUJ1ZmZlcjsKLSNlbmRpZgotCi0gIC8qIGlmIHRoaXMgaXMgc2V0LCB0aGUgc2NyZWVuIGRvZXNuJ3Qgc2Nyb2xsLiAqLwotICByZmJCb29sIHdyYXBCb3R0b21Ub1RvcDsKLQotICAvKiBoZWlnaHQgYW5kIHdpZHRoIG9mIG9uZSBjaGFyYWN0ZXIgKi8KLSAgaW50IGNXaWR0aCwgY0hlaWdodDsKLSAgLyogb2Zmc2V0IG9mIGNoYXJhY3RlcnMgKi8KLSAgaW50IHhob3QseWhvdDsKLQotICAvKiBjb2xvdXIgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JlQ29sb3VyLGJhY2tDb2xvdXI7Ci0gIGludDhfdCBjeDEsY3kxLGN4MixjeTI7Ci0KLSAgLyogaW5wdXQgYnVmZmVyICovCi0gIGNoYXIgKmlucHV0QnVmZmVyOwotICBpbnQgaW5wdXRDb3VudDsKLSAgaW50IGlucHV0U2l6ZTsKLSAgbG9uZyBzZWxlY3RUaW1lT3V0OwotICByZmJCb29sIGRvRWNobzsgLyogaWYgcmVhZGluZyBpbnB1dCwgZG8gb3V0cHV0IGRpcmVjdGx5PyAqLwotCi0gIC8qIHNlbGVjdGlvbiAqLwotICBjaGFyICpzZWxlY3Rpb247Ci0KLSAgLyogbW91c2UgKi8KLSAgcmZiQm9vbCB3YXNSaWdodEJ1dHRvbkRvd247Ci0gIHJmYkJvb2wgY3VycmVudGx5TWFya2luZzsKLSAgaW50IG1hcmtTdGFydCxtYXJrRW5kOwotCi0gIC8qIHNob3VsZCB0ZXh0IGN1cnNvciBiZSBkcmF3bj8gKGFuIHVuZGVyc2NvcmUgYXQgY3VycmVudCBwb3NpdGlvbikgKi8KLSAgcmZiQm9vbCBjdXJzb3JBY3RpdmU7Ci0gIHJmYkJvb2wgY3Vyc29ySXNEcmF3bjsKLSAgcmZiQm9vbCBkb250RHJhd0N1cnNvcjsgLyogZm9yIGV4YW1wbGUsIHdoaWxlIHNjcm9sbGluZyAqLwotCi0gIHJmYkZvbnREYXRhUHRyIGZvbnQ7Ci0gIHJmYlNjcmVlbkluZm9QdHIgc2NyZWVuOwotfSB2bmNDb25zb2xlLCAqdm5jQ29uc29sZVB0cjsKLQotI2lmZGVmIFVTRV9BVFRSSUJVVEVfQlVGRkVSCi12bmNDb25zb2xlUHRyIHZjR2V0Q29uc29sZShpbnQgKmFyZ2MsY2hhciAqKmFyZ3YsCi0JCQkgICBpbnQgd2lkdGgsaW50IGhlaWdodCxyZmJGb250RGF0YVB0ciBmb250LAotCQkJICAgcmZiQm9vbCB3aXRoQXR0cmlidXRlcyk7Ci0jZWxzZQotdm5jQ29uc29sZVB0ciB2Y0dldENvbnNvbGUoaW50IGFyZ2MsY2hhciAqKmFyZ3YsCi0JCQkgICBpbnQgd2lkdGgsaW50IGhlaWdodCxyZmJGb250RGF0YVB0ciBmb250KTsKLSNlbmRpZgotdm9pZCB2Y0RyYXdDdXJzb3Iodm5jQ29uc29sZVB0ciBjKTsKLXZvaWQgdmNIaWRlQ3Vyc29yKHZuY0NvbnNvbGVQdHIgYyk7Ci12b2lkIHZjQ2hlY2tDb29yZGluYXRlcyh2bmNDb25zb2xlUHRyIGMpOwotCi12b2lkIHZjUHV0Q2hhcih2bmNDb25zb2xlUHRyIGMsdW5zaWduZWQgY2hhciBjaCk7Ci12b2lkIHZjUHJpbnQodm5jQ29uc29sZVB0ciBjLHVuc2lnbmVkIGNoYXIqIHN0cik7Ci12b2lkIHZjUHJpbnRGKHZuY0NvbnNvbGVQdHIgYyxjaGFyKiBmb3JtYXQsLi4uKTsKLQotdm9pZCB2Y1B1dENoYXJDb2xvdXIodm5jQ29uc29sZVB0ciBjLHVuc2lnbmVkIGNoYXIgY2gsCi0JCSAgICAgdW5zaWduZWQgY2hhciBmb3JlQ29sb3VyLHVuc2lnbmVkIGNoYXIgYmFja0NvbG91cik7Ci12b2lkIHZjUHJpbnRDb2xvdXIodm5jQ29uc29sZVB0ciBjLHVuc2lnbmVkIGNoYXIqIHN0ciwKLQkJICAgdW5zaWduZWQgY2hhciBmb3JlQ29sb3VyLHVuc2lnbmVkIGNoYXIgYmFja0NvbG91cik7Ci12b2lkIHZjUHJpbnRGQ29sb3VyKHZuY0NvbnNvbGVQdHIgYyx1bnNpZ25lZCBjaGFyIGZvcmVDb2xvdXIsCi0JCSAgICB1bnNpZ25lZCBjaGFyIGJhY2tDb2xvdXIsY2hhciogZm9ybWF0LC4uLik7Ci0KLWNoYXIgdmNHZXRDaCh2bmNDb25zb2xlUHRyIGMpOwotY2hhciB2Y0dldENoYXIodm5jQ29uc29sZVB0ciBjKTsgLyogYmxvY2tpbmcgKi8KLWNoYXIgKnZjR2V0U3RyaW5nKHZuY0NvbnNvbGVQdHIgYyxjaGFyICpidWZmZXIsaW50IG1heExlbik7Ci0KLXZvaWQgdmNLYmRBZGRFdmVudFByb2MocmZiQm9vbCBkb3duLHJmYktleVN5bSBrZXlTeW0scmZiQ2xpZW50UHRyIGNsKTsKLXZvaWQgdmNQdHJBZGRFdmVudFByb2MoaW50IGJ1dHRvbk1hc2ssaW50IHgsaW50IHkscmZiQ2xpZW50UHRyIGNsKTsKLXZvaWQgdmNTZXRYQ3V0VGV4dFByb2MoY2hhciogc3RyLGludCBsZW4sIHN0cnVjdCBfcmZiQ2xpZW50UmVjKiBjbCk7Ci0KLXZvaWQgdmNUb2dnbGVNYXJrQ2VsbCh2bmNDb25zb2xlUHRyIGMsaW50IHBvcyk7Ci12b2lkIHZjVW5tYXJrKHZuY0NvbnNvbGVQdHIgYyk7Ci0KLXZvaWQgdmNQcm9jZXNzRXZlbnRzKHZuY0NvbnNvbGVQdHIgYyk7Ci0KLS8qIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLCBoaWRlIHRoZSBjdXJzb3IgKi8KLXZvaWQgdmNTY3JvbGwodm5jQ29uc29sZVB0ciBjLGludCBsaW5lQ291bnQpOwpkaWZmIC0tZ2l0IGEvdm5jdGVybS9leGFtcGxlLmMgYi92bmN0ZXJtL2V4YW1wbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZTY2Ni4uMDAwMDAwMAotLS0gYS92bmN0ZXJtL2V4YW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpbmNsdWRlICJWTkNvbnNvbGUuaCIKLSNpbmNsdWRlICJ2Z2EuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gIHZuY0NvbnNvbGVQdHIgYz12Y0dldENvbnNvbGUoJmFyZ2MsYXJndiw4MCwyNSwmdmdhRm9udCxGQUxTRSk7Ci0gIGNoYXIgYnVmZmVyWzEwMjRdOwotICBpbnQgaSxqLGw7Ci0gIGZvcihqPTMyO2o8MjU2O2orPTE2KSB7Ci0gICAgdmNQcmludEYoYywiJTAyeDogIixqKTsKLSAgICBmb3IoaT1qO2k8aisxNjtpKyspCi0gICAgICB2Y1B1dENoYXIoYyxpKTsKLSAgICB2Y1B1dENoYXIoYywnXG4nKTsKLSAgfQotICBpPTA7Ci0gIHdoaWxlKDEpIHsKLSAgICB2Y1ByaW50RihjLCIlZCA6PiAiLGkpOwotICAgIHZjR2V0U3RyaW5nKGMsYnVmZmVyLDEwMjQpOwotICAgIGw9c3RybGVuKGJ1ZmZlciktMTsKLSAgICB3aGlsZShsPj0wICYmIGJ1ZmZlcltsXT09J1xuJykKLSAgICAgIGJ1ZmZlcltsXT0wOwotICAgIGlmKCFzdHJjbXAoYnVmZmVyLCJxdWl0IikpCi0gICAgICByZXR1cm4oMCk7Ci0gICAgaWYoIXN0cmNtcChidWZmZXIsInMiKSkKLSAgICAgIHZjU2Nyb2xsKGMsMik7Ci0gICAgaWYoIXN0cmNtcChidWZmZXIsIlMiKSkKLSAgICAgIHZjU2Nyb2xsKGMsLTIpOwotICAgIGkrKzsKLSAgfQotICByZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS92bmN0ZXJtL3ZnYS5oIGIvdm5jdGVybS92Z2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMDNlYi4uMDAwMDAwMAotLS0gYS92bmN0ZXJtL3ZnYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLXVuc2lnbmVkIGNoYXIgdmdhRm9udERhdGFbMjM5OV09ewotMHg3YywweGM2LDB4YzYsMHhkZSwweGRlLDB4ZGUsMHhkYywweGMwLDB4N2MsIC8qIDAgKi8KLTB4N2UsMHg4MSwweGE1LDB4ODEsMHg4MSwweGE1LDB4OTksMHg4MSwweDgxLDB4N2UsIC8qIDEgKi8KLTB4N2UsMHhmZiwweGRiLDB4ZmYsMHhmZiwweGRiLDB4ZTcsMHhmZiwweGZmLDB4N2UsIC8qIDIgKi8KLTB4NmMsMHhmZSwweGZlLDB4ZmUsMHhmZSwweDdjLDB4MzgsMHgxMCwgLyogMyAqLwotMHgxMCwweDM4LDB4N2MsMHhmZSwweDdjLDB4MzgsMHgxMCwgLyogNCAqLwotMHgxOCwweDNjLDB4M2MsMHhlNywweGU3LDB4ZTcsMHgxOCwweDE4LDB4M2MsIC8qIDUgKi8KLTB4MTgsMHgzYywweDdlLDB4ZmYsMHhmZiwweDdlLDB4MTgsMHgxOCwweDNjLCAvKiA2ICovCi0weDYwLDB4ZjAsMHhmMCwweDYwLCAvKiA3ICovCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGU3LDB4YzMsMHhjMywweGU3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLCAvKiA4ICovCi0weDc4LDB4Y2MsMHg4NCwweDg0LDB4Y2MsMHg3OCwgLyogOSAqLwotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YzMsMHg5OSwweGJkLDB4YmQsMHg5OSwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwgLyogMTAgKi8KLTB4MWUsMHgwNiwweDBlLDB4MWEsMHg3OCwweGNjLDB4Y2MsMHhjYywweGNjLDB4NzgsIC8qIDExICovCi0weDc4LDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3OCwweDMwLDB4ZmMsMHgzMCwweDMwLCAvKiAxMiAqLwotMHgzZiwweDMzLDB4M2YsMHgzMCwweDMwLDB4MzAsMHgzMCwweDcwLDB4ZjAsMHhlMCwgLyogMTMgKi8KLTB4N2YsMHg2MywweDdmLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2NywweGU3LDB4ZTYsMHhjMCwgLyogMTQgKi8KLTB4MTgsMHgxOCwweGRiLDB4M2MsMHhlNywweDNjLDB4ZGIsMHgxOCwweDE4LCAvKiAxNSAqLwotMHg4MCwweGMwLDB4ZTAsMHhmMCwweGY4LDB4ZmUsMHhmOCwweGYwLDB4ZTAsMHhjMCwweDgwLCAvKiAxNiAqLwotMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4ZmUsMHgzZSwweDFlLDB4MGUsMHgwNiwweDAyLCAvKiAxNyAqLwotMHgzMCwweDc4LDB4ZmMsMHgzMCwweDMwLDB4MzAsMHhmYywweDc4LDB4MzAsIC8qIDE4ICovCi0weGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4MDAsMHhjYywweGNjLCAvKiAxOSAqLwotMHg3ZiwweGRiLDB4ZGIsMHhkYiwweDdiLDB4MWIsMHgxYiwweDFiLDB4MWIsMHgxYiwgLyogMjAgKi8KLTB4N2MsMHhjNiwweDYwLDB4MzgsMHg2YywweGM2LDB4YzYsMHg2YywweDM4LDB4MGMsMHhjNiwweDdjLCAvKiAyMSAqLwotMHhmZSwweGZlLDB4ZmUsMHhmZSwgLyogMjIgKi8KLTB4MzAsMHg3OCwweGZjLDB4MzAsMHgzMCwweDMwLDB4ZmMsMHg3OCwweDMwLDB4ZmMsIC8qIDIzICovCi0weDMwLDB4NzgsMHhmYywweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLCAvKiAyNCAqLwotMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweGZjLDB4NzgsMHgzMCwgLyogMjUgKi8KLTB4MTgsMHgwYywweGZlLDB4MGMsMHgxOCwgLyogMjYgKi8KLTB4MzAsMHg2MCwweGZlLDB4NjAsMHgzMCwgLyogMjcgKi8KLTB4YzAsMHhjMCwweGMwLDB4ZmUsIC8qIDI4ICovCi0weDI4LDB4NmMsMHhmZSwweDZjLDB4MjgsIC8qIDI5ICovCi0weDEwLDB4MzgsMHgzOCwweDdjLDB4N2MsMHhmZSwweGZlLCAvKiAzMCAqLwotMHhmZSwweGZlLDB4N2MsMHg3YywweDM4LDB4MzgsMHgxMCwgLyogMzEgKi8KLSAvKiAzMiAqLwotMHg2MCwweGYwLDB4ZjAsMHhmMCwweDYwLDB4NjAsMHg2MCwweDAwLDB4NjAsMHg2MCwgLyogMzMgKi8KLTB4Y2MsMHhjYywweGNjLDB4NDgsIC8qIDM0ICovCi0weDZjLDB4NmMsMHhmZSwweDZjLDB4NmMsMHg2YywweGZlLDB4NmMsMHg2YywgLyogMzUgKi8KLTB4MTgsMHgxOCwweDdjLDB4YzYsMHhjMiwweGMwLDB4N2MsMHgwNiwweDA2LDB4ODYsMHhjNiwweDdjLDB4MTgsMHgxOCwgLyogMzYgKi8KLTB4YzIsMHhjNiwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzYsMHg4NiwgLyogMzcgKi8KLTB4MzgsMHg2YywweDZjLDB4MzgsMHg3NiwweGRjLDB4Y2MsMHhjYywweGNjLDB4NzYsIC8qIDM4ICovCi0weDYwLDB4NjAsMHg2MCwweGMwLCAvKiAzOSAqLwotMHgzMCwweDYwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4NjAsMHgzMCwgLyogNDAgKi8KLTB4YzAsMHg2MCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDYwLDB4YzAsIC8qIDQxICovCi0weDY2LDB4M2MsMHhmZiwweDNjLDB4NjYsIC8qIDQyICovCi0weDMwLDB4MzAsMHhmYywweDMwLDB4MzAsIC8qIDQzICovCi0weDYwLDB4NjAsMHg2MCwweGMwLCAvKiA0NCAqLwotMHhmZSwgLyogNDUgKi8KLTB4YzAsMHhjMCwgLyogNDYgKi8KLTB4MDIsMHgwNiwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzAsMHg4MCwgLyogNDcgKi8KLTB4MzgsMHg2YywweGM2LDB4YzYsMHhkNiwweGQ2LDB4YzYsMHhjNiwweDZjLDB4MzgsIC8qIDQ4ICovCi0weDMwLDB4NzAsMHhmMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweGZjLCAvKiA0OSAqLwotMHg3YywweGM2LDB4MDYsMHgwYywweDE4LDB4MzAsMHg2MCwweGMwLDB4YzYsMHhmZSwgLyogNTAgKi8KLTB4N2MsMHhjNiwweDA2LDB4MDYsMHgzYywweDA2LDB4MDYsMHgwNiwweGM2LDB4N2MsIC8qIDUxICovCi0weDBjLDB4MWMsMHgzYywweDZjLDB4Y2MsMHhmZSwweDBjLDB4MGMsMHgwYywweDFlLCAvKiA1MiAqLwotMHhmZSwweGMwLDB4YzAsMHhjMCwweGZjLDB4MDYsMHgwNiwweDA2LDB4YzYsMHg3YywgLyogNTMgKi8KLTB4MzgsMHg2MCwweGMwLDB4YzAsMHhmYywweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsIC8qIDU0ICovCi0weGZlLDB4YzYsMHgwNiwweDA2LDB4MGMsMHgxOCwweDMwLDB4MzAsMHgzMCwweDMwLCAvKiA1NSAqLwotMHg3YywweGM2LDB4YzYsMHhjNiwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywgLyogNTYgKi8KLTB4N2MsMHhjNiwweGM2LDB4YzYsMHg3ZSwweDA2LDB4MDYsMHgwNiwweDBjLDB4NzgsIC8qIDU3ICovCi0weGMwLDB4YzAsMHgwMCwweDAwLDB4MDAsMHhjMCwweGMwLCAvKiA1OCAqLwotMHg2MCwweDYwLDB4MDAsMHgwMCwweDAwLDB4NjAsMHg2MCwweGMwLCAvKiA1OSAqLwotMHgwYywweDE4LDB4MzAsMHg2MCwweGMwLDB4NjAsMHgzMCwweDE4LDB4MGMsIC8qIDYwICovCi0weGZjLDB4MDAsMHgwMCwweGZjLCAvKiA2MSAqLwotMHhjMCwweDYwLDB4MzAsMHgxOCwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzAsIC8qIDYyICovCi0weDdjLDB4YzYsMHhjNiwweDBjLDB4MTgsMHgxOCwweDE4LDB4MDAsMHgxOCwweDE4LCAvKiA2MyAqLwotMHg3YywweGM2LDB4YzYsMHhkZSwweGRlLDB4ZGUsMHhkYywweGMwLDB4N2MsIC8qIDY0ICovCi0weDEwLDB4MzgsMHg2YywweGM2LDB4YzYsMHhmZSwweGM2LDB4YzYsMHhjNiwweGM2LCAvKiA2NSAqLwotMHhmYywweDY2LDB4NjYsMHg2NiwweDdjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHhmYywgLyogNjYgKi8KLTB4M2MsMHg2NiwweGMyLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMiwweDY2LDB4M2MsIC8qIDY3ICovCi0weGY4LDB4NmMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2YywweGY4LCAvKiA2OCAqLwotMHhmZSwweDY2LDB4NjIsMHg2OCwweDc4LDB4NjgsMHg2MCwweDYyLDB4NjYsMHhmZSwgLyogNjkgKi8KLTB4ZmUsMHg2NiwweDYyLDB4NjgsMHg3OCwweDY4LDB4NjAsMHg2MCwweDYwLDB4ZjAsIC8qIDcwICovCi0weDNjLDB4NjYsMHhjMiwweGMwLDB4YzAsMHhkZSwweGM2LDB4YzYsMHg2NiwweDNhLCAvKiA3MSAqLwotMHhjNiwweGM2LDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwgLyogNzIgKi8KLTB4ZjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4ZjAsIC8qIDczICovCi0weDFlLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweGNjLDB4Y2MsMHhjYywweDc4LCAvKiA3NCAqLwotMHhlNiwweDY2LDB4NjYsMHg2YywweDc4LDB4NzgsMHg2YywweDY2LDB4NjYsMHhlNiwgLyogNzUgKi8KLTB4ZjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MiwweDY2LDB4ZmUsIC8qIDc2ICovCi0weGM2LDB4ZWUsMHhmZSwweGZlLDB4ZDYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LCAvKiA3NyAqLwotMHhjNiwweGU2LDB4ZjYsMHhmZSwweGRlLDB4Y2UsMHhjNiwweGM2LDB4YzYsMHhjNiwgLyogNzggKi8KLTB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsIC8qIDc5ICovCi0weGZjLDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLCAvKiA4MCAqLwotMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGQ2LDB4ZGUsMHg3YywweDBjLDB4MGUsIC8qIDgxICovCi0weGZjLDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2YywweDY2LDB4NjYsMHg2NiwweGU2LCAvKiA4MiAqLwotMHg3YywweGM2LDB4YzYsMHg2MCwweDM4LDB4MGMsMHgwNiwweGM2LDB4YzYsMHg3YywgLyogODMgKi8KLTB4ZmMsMHhmYywweGI0LDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4NzgsIC8qIDg0ICovCi0weGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLCAvKiA4NSAqLwotMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDZjLDB4MzgsMHgxMCwgLyogODYgKi8KLTB4YzYsMHhjNiwweGM2LDB4YzYsMHhkNiwweGQ2LDB4ZDYsMHhmZSwweGVlLDB4NmMsIC8qIDg3ICovCi0weGM2LDB4YzYsMHg2YywweDdjLDB4MzgsMHgzOCwweDdjLDB4NmMsMHhjNiwweGM2LCAvKiA4OCAqLwotMHhjYywweGNjLDB4Y2MsMHhjYywweDc4LDB4MzAsMHgzMCwweDMwLDB4MzAsMHg3OCwgLyogODkgKi8KLTB4ZmUsMHhjNiwweDg2LDB4MGMsMHgxOCwweDMwLDB4NjAsMHhjMiwweGM2LDB4ZmUsIC8qIDkwICovCi0weGYwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGYwLCAvKiA5MSAqLwotMHg4MCwweGMwLDB4ZTAsMHg3MCwweDM4LDB4MWMsMHgwZSwweDA2LDB4MDIsIC8qIDkyICovCi0weGYwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweGYwLCAvKiA5MyAqLwotMHgxMCwweDM4LDB4NmMsMHhjNiwgLyogOTQgKi8KLTB4ZmYsIC8qIDk1ICovCi0weGMwLDB4YzAsMHg2MCwgLyogOTYgKi8KLTB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsIC8qIDk3ICovCi0weGUwLDB4NjAsMHg2MCwweDc4LDB4NmMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDdjLCAvKiA5OCAqLwotMHg3YywweGM2LDB4YzAsMHhjMCwweGMwLDB4YzYsMHg3YywgLyogOTkgKi8KLTB4MWMsMHgwYywweDBjLDB4M2MsMHg2YywweGNjLDB4Y2MsMHhjYywweGNjLDB4NzYsIC8qIDEwMCAqLwotMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywgLyogMTAxICovCi0weDM4LDB4NmMsMHg2NCwweDYwLDB4ZjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLCAvKiAxMDIgKi8KLTB4NzYsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4N2MsMHgwYywweGNjLDB4NzgsIC8qIDEwMyAqLwotMHhlMCwweDYwLDB4NjAsMHg2YywweDc2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHhlNiwgLyogMTA0ICovCi0weDYwLDB4NjAsMHgwMCwweGUwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLCAvKiAxMDUgKi8KLTB4MGMsMHgwYywweDAwLDB4MWMsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHhjYywweGNjLDB4NzgsIC8qIDEwNiAqLwotMHhlMCwweDYwLDB4NjAsMHg2NiwweDZjLDB4NzgsMHg3OCwweDZjLDB4NjYsMHhlNiwgLyogMTA3ICovCi0weGUwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLCAvKiAxMDggKi8KLTB4ZWMsMHhmZSwweGQ2LDB4ZDYsMHhkNiwweGQ2LDB4YzYsIC8qIDEwOSAqLwotMHhkYywweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwgLyogMTEwICovCi0weDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLCAvKiAxMTEgKi8KLTB4ZGMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4ZjAsIC8qIDExMiAqLwotMHg3NiwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3YywweDBjLDB4MGMsMHgxZSwgLyogMTEzICovCi0weGRjLDB4NzYsMHg2NiwweDYwLDB4NjAsMHg2MCwweGYwLCAvKiAxMTQgKi8KLTB4N2MsMHhjNiwweDYwLDB4MzgsMHgwYywweGM2LDB4N2MsIC8qIDExNSAqLwotMHgxMCwweDMwLDB4MzAsMHhmYywweDMwLDB4MzAsMHgzMCwweDMwLDB4MzYsMHgxYywgLyogMTE2ICovCi0weGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LCAvKiAxMTcgKi8KLTB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc4LDB4MzAsIC8qIDExOCAqLwotMHhjNiwweGM2LDB4ZDYsMHhkNiwweGQ2LDB4ZmUsMHg2YywgLyogMTE5ICovCi0weGM2LDB4NmMsMHgzOCwweDM4LDB4MzgsMHg2YywweGM2LCAvKiAxMjAgKi8KLTB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2UsMHgwNiwweDBjLDB4ZjgsIC8qIDEyMSAqLwotMHhmZSwweGNjLDB4MTgsMHgzMCwweDYwLDB4YzYsMHhmZSwgLyogMTIyICovCi0weDFjLDB4MzAsMHgzMCwweDMwLDB4ZTAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDFjLCAvKiAxMjMgKi8KLTB4YzAsMHhjMCwweGMwLDB4YzAsMHgwMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsIC8qIDEyNCAqLwotMHhlMCwweDMwLDB4MzAsMHgzMCwweDFjLDB4MzAsMHgzMCwweDMwLDB4MzAsMHhlMCwgLyogMTI1ICovCi0weDc2LDB4ZGMsIC8qIDEyNiAqLwotMHgxMCwweDM4LDB4NmMsMHhjNiwweGM2LDB4YzYsMHhmZSwgLyogMTI3ICovCi0weDNjLDB4NjYsMHhjMiwweGMwLDB4YzAsMHhjMCwweGMyLDB4NjYsMHgzYywweDBjLDB4MDYsMHg3YywgLyogMTI4ICovCi0weGNjLDB4MDAsMHgwMCwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LCAvKiAxMjkgKi8KLTB4MGMsMHgxOCwweDMwLDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywgLyogMTMwICovCi0weDEwLDB4MzgsMHg2YywweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsIC8qIDEzMSAqLwotMHhjYywweDAwLDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwgLyogMTMyICovCi0weDYwLDB4MzAsMHgxOCwweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsIC8qIDEzMyAqLwotMHgzOCwweDZjLDB4MzgsMHgwMCwweDc4LDB4MGMsMHg3YywweGNjLDB4Y2MsMHhjYywweDc2LCAvKiAxMzQgKi8KLTB4NzgsMHhjYywweGMwLDB4YzAsMHhjYywweDc4LDB4MTgsMHgwYywweDc4LCAvKiAxMzUgKi8KLTB4MTAsMHgzOCwweDZjLDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywgLyogMTM2ICovCi0weGM2LDB4MDAsMHgwMCwweDdjLDB4YzYsMHhmZSwweGMwLDB4YzAsMHhjNiwweDdjLCAvKiAxMzcgKi8KLTB4NjAsMHgzMCwweDE4LDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywgLyogMTM4ICovCi0weGNjLDB4MDAsMHgwMCwweDcwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDc4LCAvKiAxMzkgKi8KLTB4MzAsMHg3OCwweGNjLDB4MDAsMHg3MCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHg3OCwgLyogMTQwICovCi0weGMwLDB4NjAsMHgzMCwweDAwLDB4NzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4NzgsIC8qIDE0MSAqLwotMHhjNiwweDAwLDB4MTAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LCAvKiAxNDIgKi8KLTB4MzgsMHg2YywweDM4LDB4MDAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LCAvKiAxNDMgKi8KLTB4MTgsMHgzMCwweDYwLDB4MDAsMHhmZSwweDY2LDB4NjAsMHg3YywweDYwLDB4NjAsMHg2NiwweGZlLCAvKiAxNDQgKi8KLTB4Y2MsMHg3NiwweDM2LDB4N2UsMHhkOCwweGQ4LDB4NmUsIC8qIDE0NSAqLwotMHgzZSwweDZjLDB4Y2MsMHhjYywweGZlLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjZSwgLyogMTQ2ICovCi0weDEwLDB4MzgsMHg2YywweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsIC8qIDE0NyAqLwotMHhjNiwweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywgLyogMTQ4ICovCi0weDYwLDB4MzAsMHgxOCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsIC8qIDE0OSAqLwotMHgzMCwweDc4LDB4Y2MsMHgwMCwweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDc2LCAvKiAxNTAgKi8KLTB4NjAsMHgzMCwweDE4LDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwgLyogMTUxICovCi0weGM2LDB4MDAsMHgwMCwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdlLDB4MDYsMHgwYywweDc4LCAvKiAxNTIgKi8KLTB4YzYsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywgLyogMTUzICovCi0weGM2LDB4MDAsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsIC8qIDE1NCAqLwotMHgzMCwweDMwLDB4NzgsMHhjYywweGMwLDB4YzAsMHhjMCwweGNjLDB4NzgsMHgzMCwweDMwLCAvKiAxNTUgKi8KLTB4MzgsMHg2YywweDY0LDB4NjAsMHhmMCwweDYwLDB4NjAsMHg2MCwweDYwLDB4ZTYsMHhmYywgLyogMTU2ICovCi0weGNjLDB4Y2MsMHg3OCwweDMwLDB4ZmMsMHgzMCwweGZjLDB4MzAsMHgzMCwweDMwLCAvKiAxNTcgKi8KLTB4ZjgsMHhjYywweGNjLDB4ZjgsMHhjNCwweGNjLDB4ZGUsMHhjYywweGNjLDB4Y2MsMHhjNiwgLyogMTU4ICovCi0weDBlLDB4MWIsMHgxOCwweDE4LDB4MTgsMHg3ZSwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhkOCwweDcwLCAvKiAxNTkgKi8KLTB4MTgsMHgzMCwweDYwLDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwgLyogMTYwICovCi0weDMwLDB4NjAsMHhjMCwweDAwLDB4ZTAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4ZjAsIC8qIDE2MSAqLwotMHgxOCwweDMwLDB4NjAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLCAvKiAxNjIgKi8KLTB4MTgsMHgzMCwweDYwLDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwgLyogMTYzICovCi0weDc2LDB4ZGMsMHgwMCwweGRjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LCAvKiAxNjQgKi8KLTB4NzYsMHhkYywweDAwLDB4YzYsMHhlNiwweGY2LDB4ZmUsMHhkZSwweGNlLDB4YzYsMHhjNiwweGM2LCAvKiAxNjUgKi8KLTB4NzgsMHhkOCwweGQ4LDB4N2MsMHgwMCwweGZjLCAvKiAxNjYgKi8KLTB4NzAsMHhkOCwweGQ4LDB4NzAsMHgwMCwweGY4LCAvKiAxNjcgKi8KLTB4MzAsMHgzMCwweDAwLDB4MzAsMHgzMCwweDYwLDB4YzAsMHhjNiwweGM2LDB4N2MsIC8qIDE2OCAqLwotMHhmZSwweGMwLDB4YzAsMHhjMCwweGMwLCAvKiAxNjkgKi8KLTB4ZmUsMHgwNiwweDA2LDB4MDYsMHgwNiwgLyogMTcwICovCi0weGMwLDB4YzAsMHhjMiwweGM2LDB4Y2MsMHgxOCwweDMwLDB4NjAsMHhkYywweDg2LDB4MGMsMHgxOCwweDNlLCAvKiAxNzEgKi8KLTB4YzAsMHhjMCwweGMyLDB4YzYsMHhjYywweDE4LDB4MzAsMHg2NiwweGNlLDB4OWUsMHgzZSwweDA2LDB4MDYsIC8qIDE3MiAqLwotMHg2MCwweDYwLDB4MDAsMHg2MCwweDYwLDB4NjAsMHhmMCwweGYwLDB4ZjAsMHg2MCwgLyogMTczICovCi0weDM2LDB4NmMsMHhkOCwweDZjLDB4MzYsIC8qIDE3NCAqLwotMHhkOCwweDZjLDB4MzYsMHg2YywweGQ4LCAvKiAxNzUgKi8KLTB4MjIsMHg4OCwweDIyLDB4ODgsMHgyMiwweDg4LDB4MjIsMHg4OCwweDIyLDB4ODgsMHgyMiwweDg4LDB4MjIsMHg4OCwweDIyLDB4ODgsIC8qIDE3NiAqLwotMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwgLyogMTc3ICovCi0weGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LCAvKiAxNzggKi8KLTB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsIC8qIDE3OSAqLwotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGY4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwgLyogMTgwICovCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmOCwweDE4LDB4ZjgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LCAvKiAxODEgKi8KLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsIC8qIDE4MiAqLwotMHhmZSwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsIC8qIDE4MyAqLwotMHhmOCwweDE4LDB4ZjgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LCAvKiAxODQgKi8KLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGY2LDB4MDYsMHhmNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsIC8qIDE4NSAqLwotMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwgLyogMTg2ICovCi0weGZlLDB4MDYsMHhmNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsIC8qIDE4NyAqLwotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjYsMHgwNiwweGZlLCAvKiAxODggKi8KLTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmZSwgLyogMTg5ICovCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmOCwweDE4LDB4ZjgsIC8qIDE5MCAqLwotMHhmOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsIC8qIDE5MSAqLwotMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGY4LCAvKiAxOTIgKi8KLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmZiwgLyogMTkzICovCi0weGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwgLyogMTk0ICovCi0weGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4ZjgsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLCAvKiAxOTUgKi8KLTB4ZmYsIC8qIDE5NiAqLwotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwgLyogMTk3ICovCi0weGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhmOCwweGMwLDB4ZjgsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLCAvKiAxOTggKi8KLTB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkYywweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsIC8qIDE5OSAqLwotMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZGMsMHhjMCwweGZjLCAvKiAyMDAgKi8KLTB4ZmMsMHhjMCwweGRjLDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwgLyogMjAxICovCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmNywweDAwLDB4ZmYsIC8qIDIwMiAqLwotMHhmZiwweDAwLDB4ZjcsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LCAvKiAyMDMgKi8KLTB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGRjLDB4YzAsMHhkYywweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsIC8qIDIwNCAqLwotMHhmZiwweDAwLDB4ZmYsIC8qIDIwNSAqLwotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjcsMHgwMCwweGY3LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwgLyogMjA2ICovCi0weDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmZiwweDAwLDB4ZmYsIC8qIDIwNyAqLwotMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGZmLCAvKiAyMDggKi8KLTB4ZmYsMHgwMCwweGZmLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwgLyogMjA5ICovCi0weGZmLDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwgLyogMjEwICovCi0weGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZmMsIC8qIDIxMSAqLwotMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4ZjgsMHhjMCwweGY4LCAvKiAyMTIgKi8KLTB4ZjgsMHhjMCwweGY4LDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwgLyogMjEzICovCi0weGZjLDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4ZDgsMHhkOCwgLyogMjE0ICovCi0weDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZmYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LCAvKiAyMTUgKi8KLTB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MTgsMHhmZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsIC8qIDIxNiAqLwotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGY4LCAvKiAyMTcgKi8KLTB4ZjgsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLCAvKiAyMTggKi8KLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsIC8qIDIxOSAqLwotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsIC8qIDIyMCAqLwotMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwgLyogMjIxICovCi0weGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLCAvKiAyMjIgKi8KLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsIC8qIDIyMyAqLwotMHg3NiwweGRjLDB4ZDgsMHhkOCwweGQ4LDB4ZGMsMHg3NiwgLyogMjI0ICovCi0weDc4LDB4Y2MsMHhjYywweGNjLDB4ZDgsMHhjYywweGM2LDB4YzYsMHhjNiwweGNjLCAvKiAyMjUgKi8KLTB4ZmUsMHhjNiwweGM2LDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsIC8qIDIyNiAqLwotMHhmZSwweDZjLDB4NmMsMHg2YywweDZjLDB4NmMsMHg2YywweDZjLCAvKiAyMjcgKi8KLTB4ZmUsMHhjNiwweDYwLDB4MzAsMHgxOCwweDMwLDB4NjAsMHhjNiwweGZlLCAvKiAyMjggKi8KLTB4N2UsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4NzAsIC8qIDIyOSAqLwotMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4YzAsIC8qIDIzMCAqLwotMHg3NiwweGRjLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LCAvKiAyMzEgKi8KLTB4ZmMsMHgzMCwweDc4LDB4Y2MsMHhjYywweGNjLDB4NzgsMHgzMCwweGZjLCAvKiAyMzIgKi8KLTB4MzgsMHg2YywweGM2LDB4YzYsMHhmZSwweGM2LDB4YzYsMHg2YywweDM4LCAvKiAyMzMgKi8KLTB4MzgsMHg2YywweGM2LDB4YzYsMHhjNiwweDZjLDB4NmMsMHg2YywweDZjLDB4ZWUsIC8qIDIzNCAqLwotMHgzYywweDYwLDB4MzAsMHgxOCwweDdjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3OCwgLyogMjM1ICovCi0weDdlLDB4ZGIsMHhkYiwweGRiLDB4N2UsIC8qIDIzNiAqLwotMHgwMywweDA2LDB4N2UsMHhkYiwweGRiLDB4ZjMsMHg3ZSwweDYwLDB4YzAsIC8qIDIzNyAqLwotMHgzOCwweDYwLDB4YzAsMHhjMCwweGY4LDB4YzAsMHhjMCwweGMwLDB4NjAsMHgzOCwgLyogMjM4ICovCi0weDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwgLyogMjM5ICovCi0weGZlLDB4MDAsMHgwMCwweGZlLDB4MDAsMHgwMCwweGZlLCAvKiAyNDAgKi8KLTB4MTgsMHgxOCwweDdlLDB4MTgsMHgxOCwweDAwLDB4MDAsMHhmZiwgLyogMjQxICovCi0weDYwLDB4MzAsMHgxOCwweDBjLDB4MTgsMHgzMCwweDYwLDB4MDAsMHhmYywgLyogMjQyICovCi0weDE4LDB4MzAsMHg2MCwweGMwLDB4NjAsMHgzMCwweDE4LDB4MDAsMHhmYywgLyogMjQzICovCi0weDcwLDB4ZDgsMHhkOCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsIC8qIDI0NCAqLwotMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZDgsMHhkOCwweGQ4LDB4NzAsIC8qIDI0NSAqLwotMHgzMCwweDMwLDB4MDAsMHhmYywweDAwLDB4MzAsMHgzMCwgLyogMjQ2ICovCi0weDc2LDB4ZGMsMHgwMCwweDc2LDB4ZGMsIC8qIDI0NyAqLwotMHg3MCwweGQ4LDB4ZDgsMHg3MCwgLyogMjQ4ICovCi0weGMwLDB4YzAsIC8qIDI0OSAqLwotMHhjMCwgLyogMjUwICovCi0weDBmLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweGVjLDB4NmMsMHg2YywweDNjLDB4MWMsIC8qIDI1MSAqLwotMHhkOCwweDZjLDB4NmMsMHg2YywweDZjLDB4NmMsIC8qIDI1MiAqLwotMHg3MCwweGQ4LDB4MzAsMHg2MCwweGM4LDB4ZjgsIC8qIDI1MyAqLwotMHhmOCwweGY4LDB4ZjgsMHhmOCwweGY4LDB4ZjgsMHhmOCwgLyogMjU0ICovCi0gLyogMjU1ICovCi19OwotaW50IHZnYUZvbnRNZXRhRGF0YVsyNTYqNV09ewotMCw4LDksMCwwLDksOCwxMCwwLDAsMTksOCwxMCwwLDAsMjksOCw4LDAsMCwzNyw4LDcsMCwxLDQ0LDgsOSwwLDAsNTMsOCw5LDAsMCw2Miw4LDQsMiwyLDY2LDgsMTYsMCwtNCw4Miw4LDYsMSwxLDg4LDgsMTYsMCwtNCwxMDQsOCwxMCwwLDAsMTE0LDgsMTAsMSwwLDEyNCw4LDEwLDAsMCwxMzQsOCwxMSwwLC0xLDE0NSw4LDksMCwwLDE1NCw4LDExLDAsMCwxNjUsOCwxMSwwLDAsMTc2LDgsOSwxLDEsMTg1LDgsMTAsMSwwLDE5NSw4LDEwLDAsMCwyMDUsOCwxMiwwLC0xLDIxNyw4LDQsMCwwLDIyMSw4LDEwLDEsMCwyMzEsOCwxMCwxLDAsMjQxLDgsMTAsMSwwLDI1MSw4LDUsMCwyLDI1Niw4LDUsMCwyLDI2MSw4LDQsMCwyLDI2NSw4LDUsMCwyLDI3MCw4LDcsMCwxLDI3Nyw4LDcsMCwxLDI4NCw4LDAsMCwwLDI4NCw4LDEwLDIsMCwyOTQsOCw0LDEsNywyOTgsOCw5LDAsMCwzMDcsOCwxNCwwLC0yLDMyMSw4LDgsMCwwLDMyOSw4LDEwLDAsMCwzMzksOCw0LDEsNywzNDMsOCwxMCwyLDAsMzUzLDgsMTAsMiwwLDM2Myw4LDUsMCwyLDM2OCw4LDUsMSwyLDM3Myw4LDQsMiwtMSwzNzcsOCwxLDAsNCwzNzgsOCwyLDMsMCwzODAsOCw4LDAsMCwzODgsOCwxMCwwLDAsMzk4LDgsMTAsMSwwLDQwOCw4LDEwLDAsMCw0MTgsOCwxMCwwLDAsNDI4LDgsMTAsMCwwLDQzOCw4LDEwLDAsMCw0NDgsOCwxMCwwLDAsNDU4LDgsMTAsMCwwLDQ2OCw4LDEwLDAsMCw0NzgsOCwxMCwwLDAsNDg4LDgsNywzLDEsNDk1LDgsOCwyLDAsNTAzLDgsOSwxLDAsNTEyLDgsNCwxLDMsNTE2LDgsOSwxLDAsNTI1LDgsMTAsMCwwLDUzNSw4LDksMCwwLDU0NCw4LDEwLDAsMCw1NTQsOCwxMCwwLDAsNTY0LDgsMTAsMCwwLDU3NCw4LDEwLDAsMCw1ODQsOCwxMCwwLDAsNTk0LDgsMTAsMCwwLDYwNCw4LDEwLDAsMCw2MTQsOCwxMCwwLDAsNjI0LDgsMTAsMiwwLDYzNCw4LDEwLDAsMCw2NDQsOCwxMCwwLDAsNjU0LDgsMTAsMCwwLDY2NCw4LDEwLDAsMCw2NzQsOCwxMCwwLDAsNjg0LDgsMTAsMCwwLDY5NCw4LDEwLDAsMCw3MDQsOCwxMiwwLC0yLDcxNiw4LDEwLDAsMCw3MjYsOCwxMCwwLDAsNzM2LDgsMTAsMSwwLDc0Niw4LDEwLDAsMCw3NTYsOCwxMCwwLDAsNzY2LDgsMTAsMCwwLDc3Niw4LDEwLDAsMCw3ODYsOCwxMCwxLDAsNzk2LDgsMTAsMCwwLDgwNiw4LDEwLDIsMCw4MTYsOCw5LDAsMCw4MjUsOCwxMCwyLDAsODM1LDgsNCwwLDgsODM5LDgsMSwwLC0yLDg0MCw4LDMsMiw5LDg0Myw4LDcsMCwwLDg1MCw4LDEwLDAsMCw4NjAsOCw3LDAsMCw4NjcsOCwxMCwwLDAsODc3LDgsNywwLDAsODg0LDgsMTAsMCwwLDg5NCw4LDEwLDAsLTMsOTA0LDgsMTAsMCwwLDkxNCw4LDEwLDIsMCw5MjQsOCwxMywxLC0zLDkzNyw4LDEwLDAsMCw5NDcsOCwxMCwyLDAsOTU3LDgsNywwLDAsOTY0LDgsNywwLDAsOTcxLDgsNywwLDAsOTc4LDgsMTAsMCwtMyw5ODgsOCwxMCwwLC0zLDk5OCw4LDcsMCwwLDEwMDUsOCw3LDAsMCwxMDEyLDgsMTAsMCwwLDEwMjIsOCw3LDAsMCwxMDI5LDgsNywxLDAsMTAzNiw4LDcsMCwwLDEwNDMsOCw3LDAsMCwxMDUwLDgsMTAsMCwtMywxMDYwLDgsNywwLDAsMTA2Nyw4LDEwLDEsMCwxMDc3LDgsMTAsMywwLDEwODcsOCwxMCwxLDAsMTA5Nyw4LDIsMCw4LDEwOTksOCw3LDAsMSwxMTA2LDgsMTIsMCwtMiwxMTE4LDgsMTAsMCwwLDExMjgsOCwxMSwwLDAsMTEzOSw4LDExLDAsMCwxMTUwLDgsMTAsMCwwLDExNjAsOCwxMSwwLDAsMTE3MSw4LDExLDAsMCwxMTgyLDgsOSwxLC0xLDExOTEsOCwxMSwwLDAsMTIwMiw4LDEwLDAsMCwxMjEyLDgsMTEsMCwwLDEyMjMsOCwxMCwxLDAsMTIzMyw4LDExLDEsMCwxMjQ0LDgsMTEsMSwwLDEyNTUsOCwxMSwwLDAsMTI2Niw4LDEyLDAsMCwxMjc4LDgsMTIsMCwwLDEyOTAsOCw3LDAsMCwxMjk3LDgsMTAsMCwwLDEzMDcsOCwxMSwwLDAsMTMxOCw4LDEwLDAsMCwxMzI4LDgsMTEsMCwwLDEzMzksOCwxMSwwLDAsMTM1MCw4LDExLDAsMCwxMzYxLDgsMTMsMCwtMywxMzc0LDgsMTEsMCwwLDEzODUsOCwxMSwwLDAsMTM5Niw4LDExLDEsMCwxNDA3LDgsMTEsMCwwLDE0MTgsOCwxMCwxLDAsMTQyOCw4LDExLDAsMCwxNDM5LDgsMTMsMCwtMiwxNDUyLDgsMTEsMCwwLDE0NjMsOCwxMSwyLDAsMTQ3NCw4LDExLDAsMCwxNDg1LDgsMTEsMCwwLDE0OTYsOCwxMCwwLDAsMTUwNiw4LDEyLDAsMCwxNTE4LDgsNiwxLDUsMTUyNCw4LDYsMSw1LDE1MzAsOCwxMCwwLDAsMTU0MCw4LDUsMCwxLDE1NDUsOCw1LDAsMSwxNTUwLDgsMTMsMCwtMiwxNTYzLDgsMTMsMCwtMiwxNTc2LDgsMTAsMiwwLDE1ODYsOCw1LDAsMiwxNTkxLDgsNSwwLDIsMTU5Niw4LDE2LDEsLTQsMTYxMiw4LDE2LDAsLTQsMTYyOCw4LDE2LDAsLTQsMTY0NCw4LDE2LDMsLTQsMTY2MCw4LDE2LDAsLTQsMTY3Niw4LDE2LDAsLTQsMTY5Miw4LDE2LDAsLTQsMTcwOCw4LDksMCwtNCwxNzE3LDgsMTEsMCwtNCwxNzI4LDgsMTYsMCwtNCwxNzQ0LDgsMTYsMiwtNCwxNzYwLDgsMTEsMCwtNCwxNzcxLDgsOCwwLDQsMTc3OSw4LDgsMCw0LDE3ODcsOCw4LDAsNCwxNzk1LDgsOSwwLC00LDE4MDQsOCw4LDMsNCwxODEyLDgsOCwwLDQsMTgyMCw4LDksMCwtNCwxODI5LDgsMTYsMywtNCwxODQ1LDgsMSwwLDQsMTg0Niw4LDE2LDAsLTQsMTg2Miw4LDE2LDMsLTQsMTg3OCw4LDE2LDIsLTQsMTg5NCw4LDgsMiw0LDE5MDIsOCwxMSwyLC00LDE5MTMsOCw4LDAsNCwxOTIxLDgsMTEsMCwtNCwxOTMyLDgsMTYsMiwtNCwxOTQ4LDgsMywwLDQsMTk1MSw4LDE2LDAsLTQsMTk2Nyw4LDgsMCw0LDE5NzUsOCw4LDAsNCwxOTgzLDgsMTEsMCwtNCwxOTk0LDgsOSwwLC00LDIwMDMsOCw4LDIsNCwyMDExLDgsOCwzLDQsMjAxOSw4LDExLDMsLTQsMjAzMCw4LDksMiwtNCwyMDM5LDgsMTYsMCwtNCwyMDU1LDgsMTYsMCwtNCwyMDcxLDgsOCwwLDQsMjA3OSw4LDksMywtNCwyMDg4LDgsMTYsMCwtNCwyMTA0LDgsOSwwLC00LDIxMTMsOCwxNiwwLC00LDIxMjksOCwxNiw0LC00LDIxNDUsOCw3LDAsNSwyMTUyLDgsNywwLDAsMjE1OSw4LDEwLDAsMCwyMTY5LDgsMTAsMCwwLDIxNzksOCw4LDAsMCwyMTg3LDgsOSwwLDAsMjE5Niw4LDcsMCwwLDIyMDMsOCw5LDAsLTEsMjIxMiw4LDgsMCwwLDIyMjAsOCw5LDEsMCwyMjI5LDgsOSwwLDAsMjIzOCw4LDEwLDAsMCwyMjQ4LDgsMTAsMSwwLDIyNTgsOCw1LDAsMiwyMjYzLDgsOSwwLDAsMjI3Miw4LDEwLDEsMCwyMjgyLDgsOSwwLDAsMjI5MSw4LDcsMCwxLDIyOTgsOCw4LDAsMCwyMzA2LDgsOSwxLDAsMjMxNSw4LDksMSwwLDIzMjQsOCwxNCwzLC00LDIzMzgsOCwxMiwwLDAsMjM1MCw4LDcsMSwxLDIzNTcsOCw1LDAsMiwyMzYyLDgsNCwxLDcsMjM2Niw4LDIsMywzLDIzNjgsOCwxLDMsMywyMzY5LDgsMTEsMCwwLDIzODAsOCw2LDAsNSwyMzg2LDgsNiwwLDUsMjM5Miw4LDcsMSwxLDIzOTksOCwwLDAsMCx9OwotcmZiRm9udERhdGEgdmdhRm9udD17dmdhRm9udERhdGEsIHZnYUZvbnRNZXRhRGF0YX07CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL01ha2VmaWxlIGIvd2ViY2xpZW50cy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYTk0Zi4uMDAwMDAwMAotLS0gYS93ZWJjbGllbnRzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyB3ZWJjbGllbnRzL01ha2VmaWxlLiAgR2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotCi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvTGliVk5DU2VydmVyCi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0xpYlZOQ1NlcnZlcgotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1zdWJkaXIgPSB3ZWJjbGllbnRzCi1ESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvcmZiY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1DT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQotQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfJChWKSkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9hdF8wID0gQAotU09VUkNFUyA9Ci1ESVNUX1NPVVJDRVMgPQotUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLQlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLQlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAotCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAotCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCi0JJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKLQlkaXN0ZGlyCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotYW1fX3JlbGF0aXZpemUgPSBcCi0gIGRpcjA9YHB3ZGA7IFwKLSAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCi0gIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCi0gIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCi0gIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAotICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCi0gICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAotICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKLSAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCi0gICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAotICAgICAgZWxzZSBcCi0gICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAotICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCi0gICAgICBmaTsgXAotICAgIGZpOyBcCi0gICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gIGRvbmU7IFwKLSAgcmVsZGlyPSIkJGRpcjIiCi1BQ0xPQ0FMID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGFjbG9jYWwtMS4xMQotQU1UQVIgPSAkJHtUQVItdGFyfQotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSAwCi1BUiA9IC91c3IvYmluL2FyCi1BUyA9IGFzCi1BVVRPQ09ORiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvY29uZgotQVVUT0hFQURFUiA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCi1BVVRPTUFLRSA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhdXRvbWFrZS0xLjExCi1BVkFISV9DRkxBR1MgPSAKLUFWQUhJX0xJQlMgPSAKLUFXSyA9IG1hd2sKLUNDID0gZ2NjCi1DQ0RFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNGTEFHUyA9IC1nIC1PMiAtV2FsbCAgCi1DUFAgPSBnY2MgLUUKLUNQUEZMQUdTID0gCi1DUllQVF9MSUJTID0gLWxjcnlwdAotQ1hYID0gZysrCi1DWFhDUFAgPSBnKysgLUUKLUNYWERFUE1PREUgPSBkZXBtb2RlPWdjYzMKLUNYWEZMQUdTID0gLWcgLU8yCi1DWUdQQVRIX1cgPSBlY2hvCi1ERUZTID0gLURIQVZFX0NPTkZJR19ICi1ERVBESVIgPSAuZGVwcwotRExMVE9PTCA9IGRsbHRvb2wKLUVDSE8gPSBlY2hvCi1FQ0hPX0MgPSAKLUVDSE9fTiA9IC1uCi1FQ0hPX1QgPSAKLUVHUkVQID0gL2Jpbi9ncmVwIC1FCi1FWEVFWFQgPSAKLUY3NyA9IAotRkZMQUdTID0gCi1HTlVUTFNfQ0ZMQUdTID0gCi1HTlVUTFNfTElCUyA9IAotR1JFUCA9IC9iaW4vZ3JlcAotR1RLX0NGTEFHUyA9IAotR1RLX0xJQlMgPSAKLUlOU1RBTEwgPSAvdXNyL2Jpbi9pbnN0YWxsIC1jCi1JTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAotSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jIC1zCi1KUEVHX0xERkxBR1MgPSAKLUxERkxBR1MgPSAKLUxJQkdDUllQVF9DRkxBR1MgPSAKLUxJQkdDUllQVF9DT05GSUcgPSBubwotTElCR0NSWVBUX0xJQlMgPSAKLUxJQk9CSlMgPSAKLUxJQlMgPSAtbG5zbCAtbHB0aHJlYWQgLWx6IC1scG5nIC1sanBlZyAtbHJlc29sdiAgIAotTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCi1MTl9TID0gbG4gLXMKLUxUTElCT0JKUyA9IAotTUFLRUlORk8gPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gbWFrZWluZm8KLU1LRElSX1AgPSAvYmluL21rZGlyIC1wCi1PQkpEVU1QID0gb2JqZHVtcAotT0JKRVhUID0gbwotUEFDS0FHRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9CVUdSRVBPUlQgPSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcgotUEFDS0FHRV9OQU1FID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX1NUUklORyA9IExpYlZOQ1NlcnZlciAwLjkuOQotUEFDS0FHRV9UQVJOQU1FID0gbGlidm5jc2VydmVyCi1QQUNLQUdFX1VSTCA9IAotUEFDS0FHRV9WRVJTSU9OID0gMC45LjkKLVBBVEhfU0VQQVJBVE9SID0gOgotUEtHX0NPTkZJRyA9IC91c3IvYmluL3BrZy1jb25maWcKLVBLR19DT05GSUdfTElCRElSID0gCi1QS0dfQ09ORklHX1BBVEggPSAKLVJBTkxJQiA9IHJhbmxpYgotUlBNU09VUkNFRElSID0gTk9ULUZPVU5ECi1TRExfQ0ZMQUdTID0gCi1TRExfTElCUyA9IAotU0VUX01BS0UgPSAKLVNIRUxMID0gL2Jpbi9iYXNoCi1TU0xfTElCUyA9IAotU1RSSVAgPSBzdHJpcAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfTElCUyA9IAotVkVSU0lPTiA9IDAuOS45Ci1XU09DS0xJQiA9IAotWE1LTUYgPSAKLVhfQ0ZMQUdTID0gCi1YX0VYVFJBX0xJQlMgPSAKLVhfTElCUyA9IAotWF9QUkVfTElCUyA9ICAtbFNNIC1sSUNFCi1hYnNfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL3dlYmNsaWVudHMKLWFic19zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL3dlYmNsaWVudHMKLWFic190b3BfYnVpbGRkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hYnNfdG9wX3NyY2RpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIKLWFjX2N0X0NDID0gZ2NjCi1hY19jdF9DWFggPSBnKysKLWFjX2N0X0Y3NyA9IAotYW1fX2luY2x1ZGUgPSBpbmNsdWRlCi1hbV9fbGVhZGluZ19kb3QgPSAuCi1hbV9fcXVvdGUgPSAKLWFtX190YXIgPSAkJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIgotYW1fX3VudGFyID0gJCR7VEFSLXRhcn0geGYgLQotYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCi1idWlsZCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotYnVpbGRfYWxpYXMgPSAKLWJ1aWxkX2NwdSA9IHg4Nl82NAotYnVpbGRfb3MgPSBsaW51eC1nbnUKLWJ1aWxkX3ZlbmRvciA9IHVua25vd24KLWJ1aWxkZGlyID0gLgotZGF0YWRpciA9ICR7ZGF0YXJvb3RkaXJ9Ci1kYXRhcm9vdGRpciA9ICR7cHJlZml4fS9zaGFyZQotZG9jZGlyID0gJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfQotZHZpZGlyID0gJHtkb2NkaXJ9Ci1leGVjX3ByZWZpeCA9ICR7cHJlZml4fQotaG9zdCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF9hbGlhcyA9IAotaG9zdF9jcHUgPSB4ODZfNjQKLWhvc3Rfb3MgPSBsaW51eC1nbnUKLWhvc3RfdmVuZG9yID0gdW5rbm93bgotaHRtbGRpciA9ICR7ZG9jZGlyfQotaW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCi1pbmZvZGlyID0gJHtkYXRhcm9vdGRpcn0vaW5mbwotaW5zdGFsbF9zaCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvaW5zdGFsbC1zaAotbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCi1saWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYwotbG9jYWxlZGlyID0gJHtkYXRhcm9vdGRpcn0vbG9jYWxlCi1sb2NhbHN0YXRlZGlyID0gJHtwcmVmaXh9L3ZhcgotbWFuZGlyID0gJHtkYXRhcm9vdGRpcn0vbWFuCi1ta2Rpcl9wID0gL2Jpbi9ta2RpciAtcAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotcGRmZGlyID0gJHtkb2NkaXJ9Ci1wcmVmaXggPSAvdXNyL2xvY2FsCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcyx4LHgsCi1wc2RpciA9ICR7ZG9jZGlyfQotc2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L3NiaW4KLXNoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQotc3JjZGlyID0gLgotc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKLXRhcmdldF9hbGlhcyA9IAotdG9wX2J1aWxkX3ByZWZpeCA9IC4uLwotdG9wX2J1aWxkZGlyID0gLi4KLXRvcF9zcmNkaXIgPSAuLgotd2l0aF9mZm1wZWcgPSAKLVNVQkRJUlMgPSBqYXZhLWFwcGxldAotRElTVF9TVUJESVJTID0gamF2YS1hcHBsZXQKLUVYVFJBX0RJU1QgPSBpbmRleC52bmMgbm92bmMKLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi0uU1VGRklYRVM6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHdlYmNsaWVudHMvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgd2ViY2xpZW50cy9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQljYXNlICIkQCIgaW4gXAotCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAotCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAotCWVzYWM7IFwKLQlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCi0JICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlyZXY9IiQkcmV2IC4iOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCi0JZG9uZQotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD0uOyBcCi0JZWxzZSBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD07IFwKLQlmaTsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAotCSAgICAgIHNldCAiJCRAIiAiJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgICQoYW1fX21ha2VfZHJ5cnVuKSBcCi0JICAgICAgfHwgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCi0JICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKLQkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCi0JICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCi0JICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCi0JCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKLQkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAotCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKLQkgICAgICAgIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZQotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLXJlY3Vyc2l2ZQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtcmVjdXJzaXZlCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tcmVjdXJzaXZlCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtcmVjdXJzaXZlCi0KLXBkZi1hbToKLQotcHM6IHBzLXJlY3Vyc2l2ZQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY3RhZ3MtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKLQlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAotCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCi0JaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKLQlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKLQl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9NYWtlZmlsZS5pbiBiL3dlYmNsaWVudHMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzhjZTYuLjAwMDAwMDAKLS0tIGEvd2ViY2xpZW50cy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi1WUEFUSCA9IEBzcmNkaXJACi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotc3ViZGlyID0gd2ViY2xpZW50cwotRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2F0XzAgPSBACi1TT1VSQ0VTID0KLURJU1RfU09VUkNFUyA9Ci1SRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCi0JcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1SRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAotICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi1BTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKLQkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAotCWRpc3RkaXIKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1hbV9fcmVsYXRpdml6ZSA9IFwKLSAgZGlyMD1gcHdkYDsgXAotICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKLSAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKLSAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKLSAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCi0gIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKLSAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCi0gICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAotICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKLSAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCi0gICAgICBlbHNlIFwKLSAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCi0gICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCi0gICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKLSAgICAgICAgZmk7IFwKLSAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKLSAgICAgIGZpOyBcCi0gICAgZmk7IFwKLSAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKLSAgZG9uZTsgXAotICByZWxkaXI9IiQkZGlyMiIKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLVNVQkRJUlMgPSBqYXZhLWFwcGxldAotRElTVF9TVUJESVJTID0gamF2YS1hcHBsZXQKLUVYVFJBX0RJU1QgPSBpbmRleC52bmMgbm92bmMKLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi0uU1VGRklYRVM6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHdlYmNsaWVudHMvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgd2ViY2xpZW50cy9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQljYXNlICIkQCIgaW4gXAotCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAotCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAotCWVzYWM7IFwKLQlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCi0JICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlyZXY9IiQkcmV2IC4iOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCi0JZG9uZQotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD0uOyBcCi0JZWxzZSBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD07IFwKLQlmaTsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAotCSAgICAgIHNldCAiJCRAIiAiJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgICQoYW1fX21ha2VfZHJ5cnVuKSBcCi0JICAgICAgfHwgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCi0JICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKLQkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCi0JICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCi0JICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCi0JCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKLQkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAotCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKLQkgICAgICAgIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZQotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLXJlY3Vyc2l2ZQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtcmVjdXJzaXZlCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tcmVjdXJzaXZlCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtcmVjdXJzaXZlCi0KLXBkZi1hbToKLQotcHM6IHBzLXJlY3Vyc2l2ZQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY3RhZ3MtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKLQlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAotCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCi0JaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKLQlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKLQl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZSBiL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDE0ZGYuLjAwMDAwMDAKLS0tIGEvd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgd2ViY2xpZW50cy9qYXZhLWFwcGxldC9NYWtlZmlsZS4gIEdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluIGJ5IGNvbmZpZ3VyZS4KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLQotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0xpYlZOQ1NlcnZlcgotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvTGliVk5DU2VydmVyCi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9MaWJWTkNTZXJ2ZXIKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotc3ViZGlyID0gd2ViY2xpZW50cy9qYXZhLWFwcGxldAotRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fJChWKSkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCi1hbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQotYW1fX3ZfYXRfMCA9IEAKLVNPVVJDRVMgPQotRElTVF9TT1VSQ0VTID0KLVJFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi0JaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKLQlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKLQlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLVJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTID0gbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZQlcCi0gIGRpc3RjbGVhbi1yZWN1cnNpdmUgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLUFNX1JFQ1VSU0lWRV9UQVJHRVRTID0gJChSRUNVUlNJVkVfVEFSR0VUUzotcmVjdXJzaXZlPSkgXAotCSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIHRhZ3MgVEFHUyBjdGFncyBDVEFHUyBcCi0JZGlzdGRpcgotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLWFtX19yZWxhdGl2aXplID0gXAotICBkaXIwPWBwd2RgOyBcCi0gIHNlZF9maXJzdD0ncyxeXChbXi9dKlwpLy4qJCQsXDEsJzsgXAotICBzZWRfcmVzdD0ncyxeW14vXSovKiwsJzsgXAotICBzZWRfbGFzdD0ncyxeLiovXChbXi9dKlwpJCQsXDEsJzsgXAotICBzZWRfYnV0bGFzdD0ncywvKlteL10qJCQsLCc7IFwKLSAgd2hpbGUgdGVzdCAtbiAiJCRkaXIxIjsgZG8gXAotICAgIGZpcnN0PWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCi0gICAgaWYgdGVzdCAiJCRmaXJzdCIgIT0gIi4iOyB0aGVuIFwKLSAgICAgIGlmIHRlc3QgIiQkZmlyc3QiID0gIi4uIjsgdGhlbiBcCi0gICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2xhc3QiYC8iJCRkaXIyIjsgXAotICAgICAgICBkaXIwPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9idXRsYXN0ImA7IFwKLSAgICAgIGVsc2UgXAotICAgICAgICBmaXJzdDI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICAgICAgaWYgdGVzdCAiJCRmaXJzdDIiID0gIiQkZmlyc3QiOyB0aGVuIFwKLSAgICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKLSAgICAgICAgZWxzZSBcCi0gICAgICAgICAgZGlyMj0iLi4vJCRkaXIyIjsgXAotICAgICAgICBmaTsgXAotICAgICAgICBkaXIwPSIkJGRpcjAiLyIkJGZpcnN0IjsgXAotICAgICAgZmk7IFwKLSAgICBmaTsgXAotICAgIGRpcjE9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICBkb25lOyBcCi0gIHJlbGRpcj0iJCRkaXIyIgotQUNMT0NBTCA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBhY2xvY2FsLTEuMTEKLUFNVEFSID0gJCR7VEFSLXRhcn0KLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gMAotQVIgPSAvdXNyL2Jpbi9hcgotQVMgPSBhcwotQVVUT0NPTkYgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2NvbmYKLUFVVE9IRUFERVIgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlcgotQVVUT01BS0UgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS4xMQotQVZBSElfQ0ZMQUdTID0gCi1BVkFISV9MSUJTID0gCi1BV0sgPSBtYXdrCi1DQyA9IGdjYwotQ0NERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DRkxBR1MgPSAtZyAtTzIgLVdhbGwgIAotQ1BQID0gZ2NjIC1FCi1DUFBGTEFHUyA9IAotQ1JZUFRfTElCUyA9IC1sY3J5cHQKLUNYWCA9IGcrKwotQ1hYQ1BQID0gZysrIC1FCi1DWFhERVBNT0RFID0gZGVwbW9kZT1nY2MzCi1DWFhGTEFHUyA9IC1nIC1PMgotQ1lHUEFUSF9XID0gZWNobwotREVGUyA9IC1ESEFWRV9DT05GSUdfSAotREVQRElSID0gLmRlcHMKLURMTFRPT0wgPSBkbGx0b29sCi1FQ0hPID0gZWNobwotRUNIT19DID0gCi1FQ0hPX04gPSAtbgotRUNIT19UID0gCi1FR1JFUCA9IC9iaW4vZ3JlcCAtRQotRVhFRVhUID0gCi1GNzcgPSAKLUZGTEFHUyA9IAotR05VVExTX0NGTEFHUyA9IAotR05VVExTX0xJQlMgPSAKLUdSRVAgPSAvYmluL2dyZXAKLUdUS19DRkxBR1MgPSAKLUdUS19MSUJTID0gCi1JTlNUQUxMID0gL3Vzci9iaW4vaW5zdGFsbCAtYwotSU5TVEFMTF9EQVRBID0gJHtJTlNUQUxMfSAtbSA2NDQKLUlOU1RBTExfUFJPR1JBTSA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMfQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYyAtcwotSlBFR19MREZMQUdTID0gCi1MREZMQUdTID0gCi1MSUJHQ1JZUFRfQ0ZMQUdTID0gCi1MSUJHQ1JZUFRfQ09ORklHID0gbm8KLUxJQkdDUllQVF9MSUJTID0gCi1MSUJPQkpTID0gCi1MSUJTID0gLWxuc2wgLWxwdGhyZWFkIC1seiAtbHBuZyAtbGpwZWcgLWxyZXNvbHYgICAKLUxJQlRPT0wgPSAkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbAotTE5fUyA9IGxuIC1zCi1MVExJQk9CSlMgPSAKLU1BS0VJTkZPID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIG1ha2VpbmZvCi1NS0RJUl9QID0gL2Jpbi9ta2RpciAtcAotT0JKRFVNUCA9IG9iamR1bXAKLU9CSkVYVCA9IG8KLVBBQ0tBR0UgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfQlVHUkVQT1JUID0gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfTkFNRSA9IExpYlZOQ1NlcnZlcgotUEFDS0FHRV9TVFJJTkcgPSBMaWJWTkNTZXJ2ZXIgMC45LjkKLVBBQ0tBR0VfVEFSTkFNRSA9IGxpYnZuY3NlcnZlcgotUEFDS0FHRV9VUkwgPSAKLVBBQ0tBR0VfVkVSU0lPTiA9IDAuOS45Ci1QQVRIX1NFUEFSQVRPUiA9IDoKLVBLR19DT05GSUcgPSAvdXNyL2Jpbi9wa2ctY29uZmlnCi1QS0dfQ09ORklHX0xJQkRJUiA9IAotUEtHX0NPTkZJR19QQVRIID0gCi1SQU5MSUIgPSByYW5saWIKLVJQTVNPVVJDRURJUiA9IE5PVC1GT1VORAotU0RMX0NGTEFHUyA9IAotU0RMX0xJQlMgPSAKLVNFVF9NQUtFID0gCi1TSEVMTCA9IC9iaW4vYmFzaAotU1NMX0xJQlMgPSAKLVNUUklQID0gc3RyaXAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gCi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSAKLVZFUlNJT04gPSAwLjkuOQotV1NPQ0tMSUIgPSAKLVhNS01GID0gCi1YX0NGTEFHUyA9IAotWF9FWFRSQV9MSUJTID0gCi1YX0xJQlMgPSAKLVhfUFJFX0xJQlMgPSAgLWxTTSAtbElDRQotYWJzX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci93ZWJjbGllbnRzL2phdmEtYXBwbGV0Ci1hYnNfc3JjZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci93ZWJjbGllbnRzL2phdmEtYXBwbGV0Ci1hYnNfdG9wX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hY19jdF9DQyA9IGdjYwotYWNfY3RfQ1hYID0gZysrCi1hY19jdF9GNzcgPSAKLWFtX19pbmNsdWRlID0gaW5jbHVkZQotYW1fX2xlYWRpbmdfZG90ID0gLgotYW1fX3F1b3RlID0gCi1hbV9fdGFyID0gJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciIKLWFtX191bnRhciA9ICQke1RBUi10YXJ9IHhmIC0KLWJpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2JpbgotYnVpbGQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX2FsaWFzID0gCi1idWlsZF9jcHUgPSB4ODZfNjQKLWJ1aWxkX29zID0gbGludXgtZ251Ci1idWlsZF92ZW5kb3IgPSB1bmtub3duCi1idWlsZGRpciA9IC4KLWRhdGFkaXIgPSAke2RhdGFyb290ZGlyfQotZGF0YXJvb3RkaXIgPSAke3ByZWZpeH0vc2hhcmUKLWRvY2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0KLWR2aWRpciA9ICR7ZG9jZGlyfQotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWhvc3QgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfYWxpYXMgPSAKLWhvc3RfY3B1ID0geDg2XzY0Ci1ob3N0X29zID0gbGludXgtZ251Ci1ob3N0X3ZlbmRvciA9IHVua25vd24KLWh0bWxkaXIgPSAke2RvY2Rpcn0KLWluY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQotaW5mb2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2luZm8KLWluc3RhbGxfc2ggPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2luc3RhbGwtc2gKLWxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgotbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWxvY2FsZWRpciA9ICR7ZGF0YXJvb3RkaXJ9L2xvY2FsZQotbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKLW1hbmRpciA9ICR7ZGF0YXJvb3RkaXJ9L21hbgotbWtkaXJfcCA9IC9iaW4vbWtkaXIgLXAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLXBkZmRpciA9ICR7ZG9jZGlyfQotcHJlZml4ID0gL3Vzci9sb2NhbAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMseCx4LAotcHNkaXIgPSAke2RvY2Rpcn0KLXNiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCi1zaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KLXNyY2RpciA9IC4KLXN5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCi10YXJnZXRfYWxpYXMgPSAKLXRvcF9idWlsZF9wcmVmaXggPSAuLi8uLi8KLXRvcF9idWlsZGRpciA9IC4uLy4uCi10b3Bfc3JjZGlyID0gLi4vLi4KLXdpdGhfZmZtcGVnID0gCi1FWFRSQV9ESVNUID0gVm5jVmlld2VyLmphciBqYXZhdmlld2VyLnBzZXVkb19wcm94eS5wYXRjaAotU1VCRElSUyA9IHNzbAotRElTVF9TVUJESVJTID0gc3NsCi1hbGw6IGFsbC1yZWN1cnNpdmUKLQotLlNVRkZJWEVTOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IHdlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotJChSRUNVUlNJVkVfVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JY2FzZSAiJEAiIGluIFwKLQkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKLQkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKLQllc2FjOyBcCi0JcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAotCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JcmV2PSIkJHJldiAuIjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotY3RhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAotCWRvbmUKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICAkKGFtX19tYWtlX2RyeXJ1bikgXAotCSAgICAgIHx8IHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAotCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCi0JICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAotCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAotCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkJYW1fX3NraXBfbW9kZV9maXg9OiBcCi0JICAgICAgICBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1yZWN1cnNpdmUKLQotZHZpLWFtOgotCi1odG1sOiBodG1sLXJlY3Vyc2l2ZQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLXJlY3Vyc2l2ZQotCi1wZGYtYW06Ci0KLXBzOiBwcy1yZWN1cnNpdmUKLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGN0YWdzLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCi0KLS5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAotCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQljdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCi0JaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCi0JaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCi0JaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKLQlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAotCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCi0JaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCi0JdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQotCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUuaW4gYi93ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFhZGMwLi4wMDAwMDAwCi0tLSBhL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXN1YmRpciA9IHdlYmNsaWVudHMvamF2YS1hcHBsZXQKLURJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotU09VUkNFUyA9Ci1ESVNUX1NPVVJDRVMgPQotUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLQlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLQlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAotCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAotCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKLSAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCi0JJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKLQlkaXN0ZGlyCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotYW1fX3JlbGF0aXZpemUgPSBcCi0gIGRpcjA9YHB3ZGA7IFwKLSAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCi0gIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCi0gIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCi0gIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAotICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCi0gICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKLSAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAotICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKLSAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCi0gICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAotICAgICAgZWxzZSBcCi0gICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAotICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCi0gICAgICBmaTsgXAotICAgIGZpOyBcCi0gICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gIGRvbmU7IFwKLSAgcmVsZGlyPSIkJGRpcjIiCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVkFISV9DRkxBR1MgPSBAQVZBSElfQ0ZMQUdTQAotQVZBSElfTElCUyA9IEBBVkFISV9MSUJTQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DUllQVF9MSUJTID0gQENSWVBUX0xJQlNACi1DWFggPSBAQ1hYQAotQ1hYQ1BQID0gQENYWENQUEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1FQ0hPID0gQEVDSE9ACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1GNzcgPSBARjc3QAotRkZMQUdTID0gQEZGTEFHU0AKLUdOVVRMU19DRkxBR1MgPSBAR05VVExTX0NGTEFHU0AKLUdOVVRMU19MSUJTID0gQEdOVVRMU19MSUJTQAotR1JFUCA9IEBHUkVQQAotR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAotR1RLX0xJQlMgPSBAR1RLX0xJQlNACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUpQRUdfTERGTEFHUyA9IEBKUEVHX0xERkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJHQ1JZUFRfQ0ZMQUdTID0gQExJQkdDUllQVF9DRkxBR1NACi1MSUJHQ1JZUFRfQ09ORklHID0gQExJQkdDUllQVF9DT05GSUdACi1MSUJHQ1JZUFRfTElCUyA9IEBMSUJHQ1JZUFRfTElCU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKLVBLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAotUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKLVJBTkxJQiA9IEBSQU5MSUJACi1SUE1TT1VSQ0VESVIgPSBAUlBNU09VUkNFRElSQAotU0RMX0NGTEFHUyA9IEBTRExfQ0ZMQUdTQAotU0RMX0xJQlMgPSBAU0RMX0xJQlNACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1NMX0xJQlMgPSBAU1NMX0xJQlNACi1TVFJJUCA9IEBTVFJJUEAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdTT0NLTElCID0gQFdTT0NLTElCQAotWE1LTUYgPSBAWE1LTUZACi1YX0NGTEFHUyA9IEBYX0NGTEFHU0AKLVhfRVhUUkFfTElCUyA9IEBYX0VYVFJBX0xJQlNACi1YX0xJQlMgPSBAWF9MSUJTQAotWF9QUkVfTElCUyA9IEBYX1BSRV9MSUJTQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotd2l0aF9mZm1wZWcgPSBAd2l0aF9mZm1wZWdACi1FWFRSQV9ESVNUID0gVm5jVmlld2VyLmphciBqYXZhdmlld2VyLnBzZXVkb19wcm94eS5wYXRjaAotU1VCRElSUyA9IHNzbAotRElTVF9TVUJESVJTID0gc3NsCi1hbGw6IGFsbC1yZWN1cnNpdmUKLQotLlNVRkZJWEVTOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L01ha2VmaWxlJzsgXAotCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251IHdlYmNsaWVudHMvamF2YS1hcHBsZXQvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotJChSRUNVUlNJVkVfVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JY2FzZSAiJEAiIGluIFwKLQkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKLQkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKLQllc2FjOyBcCi0JcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAotCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JcmV2PSIkJHJldiAuIjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotY3RhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAotCWRvbmUKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICAkKGFtX19tYWtlX2RyeXJ1bikgXAotCSAgICAgIHx8IHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAotCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCi0JICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAotCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAotCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkJYW1fX3NraXBfbW9kZV9maXg9OiBcCi0JICAgICAgICBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1yZWN1cnNpdmUKLQotZHZpLWFtOgotCi1odG1sOiBodG1sLXJlY3Vyc2l2ZQotCi1odG1sLWFtOgotCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaHRtbC1hbToKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLXJlY3Vyc2l2ZQotCi1wZGYtYW06Ci0KLXBzOiBwcy1yZWN1cnNpdmUKLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGN0YWdzLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCi0KLS5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAotCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQljdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCi0JaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCi0JaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCi0JaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKLQlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAotCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCi0JaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCi0JdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQotCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlIGIvd2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDVlYzkuLjAwMDAwMDAKLS0tIGEvd2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIHdlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlLiAgR2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotCi1hbV9fbWFrZV9kcnlydW4gPSBcCi0gIHsgXAotICAgIGFtX19kcnk9bm87IFwKLSAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKLSAgICAgICpcXFtcIFwJXSopIFwKLSAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKLSAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAotICAgICAgKikgXAotICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAotICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKLSAgICAgICAgICAgICo9KnwtLSopIDs7IFwKLSAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAotICAgICAgICAgIGVzYWM7IFwKLSAgICAgICAgZG9uZTs7IFwKLSAgICBlc2FjOyBcCi0gICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKLSAgfQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvTGliVk5DU2VydmVyCi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9MaWJWTkNTZXJ2ZXIKLXBrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0xpYlZOQ1NlcnZlcgotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotaG9zdF90cmlwbGV0ID0geDg2XzY0LXVua25vd24tbGludXgtZ251Ci1zdWJkaXIgPSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbAotRElTVF9DT01NT04gPSBSRUFETUUgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOXyQoVikpCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1BTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKLWFtX192X2F0XzAgPSBACi1TT1VSQ0VTID0KLURJU1RfU09VUkNFUyA9Ci1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL21pc3NpbmcgLS1ydW4gYWNsb2NhbC0xLjExCi1BTVRBUiA9ICQke1RBUi10YXJ9Ci1BTV9ERUZBVUxUX1ZFUkJPU0lUWSA9IDAKLUFSID0gL3Vzci9iaW4vYXIKLUFTID0gYXMKLUFVVE9DT05GID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9jb25mCi1BVVRPSEVBREVSID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKLUFVVE9NQUtFID0gJHtTSEVMTH0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlci9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLTEuMTEKLUFWQUhJX0NGTEFHUyA9IAotQVZBSElfTElCUyA9IAotQVdLID0gbWF3awotQ0MgPSBnY2MKLUNDREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ0ZMQUdTID0gLWcgLU8yIC1XYWxsICAKLUNQUCA9IGdjYyAtRQotQ1BQRkxBR1MgPSAKLUNSWVBUX0xJQlMgPSAtbGNyeXB0Ci1DWFggPSBnKysKLUNYWENQUCA9IGcrKyAtRQotQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjMwotQ1hYRkxBR1MgPSAtZyAtTzIKLUNZR1BBVEhfVyA9IGVjaG8KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLURFUERJUiA9IC5kZXBzCi1ETExUT09MID0gZGxsdG9vbAotRUNITyA9IGVjaG8KLUVDSE9fQyA9IAotRUNIT19OID0gLW4KLUVDSE9fVCA9IAotRUdSRVAgPSAvYmluL2dyZXAgLUUKLUVYRUVYVCA9IAotRjc3ID0gCi1GRkxBR1MgPSAKLUdOVVRMU19DRkxBR1MgPSAKLUdOVVRMU19MSUJTID0gCi1HUkVQID0gL2Jpbi9ncmVwCi1HVEtfQ0ZMQUdTID0gCi1HVEtfTElCUyA9IAotSU5TVEFMTCA9IC91c3IvYmluL2luc3RhbGwgLWMKLUlOU1RBTExfREFUQSA9ICR7SU5TVEFMTH0gLW0gNjQ0Ci1JTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9Ci1JTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTH0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMgLXMKLUpQRUdfTERGTEFHUyA9IAotTERGTEFHUyA9IAotTElCR0NSWVBUX0NGTEFHUyA9IAotTElCR0NSWVBUX0NPTkZJRyA9IG5vCi1MSUJHQ1JZUFRfTElCUyA9IAotTElCT0JKUyA9IAotTElCUyA9IC1sbnNsIC1scHRocmVhZCAtbHogLWxwbmcgLWxqcGVnIC1scmVzb2x2ICAgCi1MSUJUT09MID0gJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wKLUxOX1MgPSBsbiAtcwotTFRMSUJPQkpTID0gCi1NQUtFSU5GTyA9ICR7U0hFTEx9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvbWlzc2luZyAtLXJ1biBtYWtlaW5mbwotTUtESVJfUCA9IC9iaW4vbWtkaXIgLXAKLU9CSkRVTVAgPSBvYmpkdW1wCi1PQkpFWFQgPSBvCi1QQUNLQUdFID0gTGliVk5DU2VydmVyCi1QQUNLQUdFX0JVR1JFUE9SVCA9IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlidm5jc2VydmVyCi1QQUNLQUdFX05BTUUgPSBMaWJWTkNTZXJ2ZXIKLVBBQ0tBR0VfU1RSSU5HID0gTGliVk5DU2VydmVyIDAuOS45Ci1QQUNLQUdFX1RBUk5BTUUgPSBsaWJ2bmNzZXJ2ZXIKLVBBQ0tBR0VfVVJMID0gCi1QQUNLQUdFX1ZFUlNJT04gPSAwLjkuOQotUEFUSF9TRVBBUkFUT1IgPSA6Ci1QS0dfQ09ORklHID0gL3Vzci9iaW4vcGtnLWNvbmZpZwotUEtHX0NPTkZJR19MSUJESVIgPSAKLVBLR19DT05GSUdfUEFUSCA9IAotUkFOTElCID0gcmFubGliCi1SUE1TT1VSQ0VESVIgPSBOT1QtRk9VTkQKLVNETF9DRkxBR1MgPSAKLVNETF9MSUJTID0gCi1TRVRfTUFLRSA9IAotU0hFTEwgPSAvYmluL2Jhc2gKLVNTTF9MSUJTID0gCi1TVFJJUCA9IHN0cmlwCi1TWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHUyA9IAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gCi1WRVJTSU9OID0gMC45LjkKLVdTT0NLTElCID0gCi1YTUtNRiA9IAotWF9DRkxBR1MgPSAKLVhfRVhUUkFfTElCUyA9IAotWF9MSUJTID0gCi1YX1BSRV9MSUJTID0gIC1sU00gLWxJQ0UKLWFic19idWlsZGRpciA9IC9kYXRhL3NyYy9hbmRyb2lkLW1hc3Rlci9leHRlcm5hbC9saWJ2bmNzZXJ2ZXIvd2ViY2xpZW50cy9qYXZhLWFwcGxldC9zc2wKLWFic19zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsCi1hYnNfdG9wX2J1aWxkZGlyID0gL2RhdGEvc3JjL2FuZHJvaWQtbWFzdGVyL2V4dGVybmFsL2xpYnZuY3NlcnZlcgotYWJzX3RvcF9zcmNkaXIgPSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyCi1hY19jdF9DQyA9IGdjYwotYWNfY3RfQ1hYID0gZysrCi1hY19jdF9GNzcgPSAKLWFtX19pbmNsdWRlID0gaW5jbHVkZQotYW1fX2xlYWRpbmdfZG90ID0gLgotYW1fX3F1b3RlID0gCi1hbV9fdGFyID0gJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciIKLWFtX191bnRhciA9ICQke1RBUi10YXJ9IHhmIC0KLWJpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2JpbgotYnVpbGQgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWJ1aWxkX2FsaWFzID0gCi1idWlsZF9jcHUgPSB4ODZfNjQKLWJ1aWxkX29zID0gbGludXgtZ251Ci1idWlsZF92ZW5kb3IgPSB1bmtub3duCi1idWlsZGRpciA9IC4KLWRhdGFkaXIgPSAke2RhdGFyb290ZGlyfQotZGF0YXJvb3RkaXIgPSAke3ByZWZpeH0vc2hhcmUKLWRvY2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0KLWR2aWRpciA9ICR7ZG9jZGlyfQotZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLWhvc3QgPSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLWhvc3RfYWxpYXMgPSAKLWhvc3RfY3B1ID0geDg2XzY0Ci1ob3N0X29zID0gbGludXgtZ251Ci1ob3N0X3ZlbmRvciA9IHVua25vd24KLWh0bWxkaXIgPSAke2RvY2Rpcn0KLWluY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQotaW5mb2RpciA9ICR7ZGF0YXJvb3RkaXJ9L2luZm8KLWluc3RhbGxfc2ggPSAke1NIRUxMfSAvZGF0YS9zcmMvYW5kcm9pZC1tYXN0ZXIvZXh0ZXJuYWwvbGlidm5jc2VydmVyL2luc3RhbGwtc2gKLWxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgotbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWxvY2FsZWRpciA9ICR7ZGF0YXJvb3RkaXJ9L2xvY2FsZQotbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKLW1hbmRpciA9ICR7ZGF0YXJvb3RkaXJ9L21hbgotbWtkaXJfcCA9IC9iaW4vbWtkaXIgLXAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLXBkZmRpciA9ICR7ZG9jZGlyfQotcHJlZml4ID0gL3Vzci9sb2NhbAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMseCx4LAotcHNkaXIgPSAke2RvY2Rpcn0KLXNiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCi1zaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KLXNyY2RpciA9IC4KLXN5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCi10YXJnZXRfYWxpYXMgPSAKLXRvcF9idWlsZF9wcmVmaXggPSAuLi8uLi8uLi8KLXRvcF9idWlsZGRpciA9IC4uLy4uLy4uCi10b3Bfc3JjZGlyID0gLi4vLi4vLi4KLXdpdGhfZmZtcGVnID0gCi1FWFRSQV9ESVNUID0gVm5jVmlld2VyLmphciBpbmRleC52bmMgU2lnbmVkVm5jVmlld2VyLmphciBwcm94eS52bmMgUkVBRE1FIHNzX3ZuY3ZpZXdlciBvbmV0aW1la2V5IFVsdHJhVmlld2VyU1NMLmphciBTaWduZWRVbHRyYVZpZXdlclNTTC5qYXIgdWx0cmEudm5jIHVsdHJhc2lnbmVkLnZuYyB1bHRyYXByb3h5LnZuYwotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi10YWdzOiBUQUdTCi1UQUdTOgotCi1jdGFnczogQ1RBR1MKLUNUQUdTOgotCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAotCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCi0JaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCi0JaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKLQlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKLQlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCi0JaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZS5pbiBiL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY2NWUwLi4wMDAwMDAwCi0tLSBhL3dlYmNsaWVudHMvamF2YS1hcHBsZXQvc3NsL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLVZQQVRIID0gQHNyY2RpckAKLWFtX19tYWtlX2RyeXJ1biA9IFwKLSAgeyBcCi0gICAgYW1fX2RyeT1ubzsgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAotICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCi0gICAgICAqKSBcCi0gICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCi0gICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAotICAgICAgICAgICAgKj0qfC0tKikgOzsgXAotICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCi0gICAgICAgICAgZXNhYzsgXAotICAgICAgICBkb25lOzsgXAotICAgIGVzYWM7IFwKLSAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAotICB9Ci1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1zdWJkaXIgPSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbAotRElTVF9DT01NT04gPSBSRUFETUUgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotU09VUkNFUyA9Ci1ESVNUX1NPVVJDRVMgPQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVkFISV9DRkxBR1MgPSBAQVZBSElfQ0ZMQUdTQAotQVZBSElfTElCUyA9IEBBVkFISV9MSUJTQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DUllQVF9MSUJTID0gQENSWVBUX0xJQlNACi1DWFggPSBAQ1hYQAotQ1hYQ1BQID0gQENYWENQUEAKLUNYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKLUNYWEZMQUdTID0gQENYWEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1FQ0hPID0gQEVDSE9ACi1FQ0hPX0MgPSBARUNIT19DQAotRUNIT19OID0gQEVDSE9fTkAKLUVDSE9fVCA9IEBFQ0hPX1RACi1FR1JFUCA9IEBFR1JFUEAKLUVYRUVYVCA9IEBFWEVFWFRACi1GNzcgPSBARjc3QAotRkZMQUdTID0gQEZGTEFHU0AKLUdOVVRMU19DRkxBR1MgPSBAR05VVExTX0NGTEFHU0AKLUdOVVRMU19MSUJTID0gQEdOVVRMU19MSUJTQAotR1JFUCA9IEBHUkVQQAotR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAotR1RLX0xJQlMgPSBAR1RLX0xJQlNACi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKLUpQRUdfTERGTEFHUyA9IEBKUEVHX0xERkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJHQ1JZUFRfQ0ZMQUdTID0gQExJQkdDUllQVF9DRkxBR1NACi1MSUJHQ1JZUFRfQ09ORklHID0gQExJQkdDUllQVF9DT05GSUdACi1MSUJHQ1JZUFRfTElCUyA9IEBMSUJHQ1JZUFRfTElCU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlMgPSBATElCU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLUxUTElCT0JKUyA9IEBMVExJQk9CSlNACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LRElSX1AgPSBATUtESVJfUEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKLVBLR19DT05GSUdfTElCRElSID0gQFBLR19DT05GSUdfTElCRElSQAotUEtHX0NPTkZJR19QQVRIID0gQFBLR19DT05GSUdfUEFUSEAKLVJBTkxJQiA9IEBSQU5MSUJACi1SUE1TT1VSQ0VESVIgPSBAUlBNU09VUkNFRElSQAotU0RMX0NGTEFHUyA9IEBTRExfQ0ZMQUdTQAotU0RMX0xJQlMgPSBAU0RMX0xJQlNACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1NMX0xJQlMgPSBAU1NMX0xJQlNACi1TVFJJUCA9IEBTVFJJUEAKLVNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfQ0ZMQUdTQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdTT0NLTElCID0gQFdTT0NLTElCQAotWE1LTUYgPSBAWE1LTUZACi1YX0NGTEFHUyA9IEBYX0NGTEFHU0AKLVhfRVhUUkFfTElCUyA9IEBYX0VYVFJBX0xJQlNACi1YX0xJQlMgPSBAWF9MSUJTQAotWF9QUkVfTElCUyA9IEBYX1BSRV9MSUJTQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotd2l0aF9mZm1wZWcgPSBAd2l0aF9mZm1wZWdACi1FWFRSQV9ESVNUID0gVm5jVmlld2VyLmphciBpbmRleC52bmMgU2lnbmVkVm5jVmlld2VyLmphciBwcm94eS52bmMgUkVBRE1FIHNzX3ZuY3ZpZXdlciBvbmV0aW1la2V5IFVsdHJhVmlld2VyU1NMLmphciBTaWduZWRVbHRyYVZpZXdlclNTTC5qYXIgdWx0cmEudm5jIHVsdHJhc2lnbmVkLnZuYyB1bHRyYXByb3h5LnZuYwotYWxsOiBhbGwtYW0KLQotLlNVRkZJWEVTOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSB3ZWJjbGllbnRzL2phdmEtYXBwbGV0L3NzbC9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi10YWdzOiBUQUdTCi1UQUdTOgotCi1jdGFnczogQ1RBR1MKLUNUQUdTOgotCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgXAotCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKLQkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCi0JICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAotCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKLQkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKLQkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKLQkJCSAgIHNvcnQgLXVgIDs7IFwKLQllc2FjOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAotCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAotCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCi0JaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCi0JaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKLQlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKLQlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCi0JaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL0xJQ0VOU0UudHh0IGIvd2ViY2xpZW50cy9ub3ZuYy9MSUNFTlNFLnR4dAppbmRleCA2YTExMzFiLi4yZDA5NDA4IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL0xJQ0VOU0UudHh0CisrKyBiL3dlYmNsaWVudHMvbm92bmMvTElDRU5TRS50eHQKQEAgLTEsMjIgKzEsMzUgQEAKIG5vVk5DIGlzIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbiA8Z2l0aHViQG1hcnRpbnRyaWJlLm9yZz4KIAotU29tZSBwb3J0aW9ucyBvZiBub1ZOQyBhcmUgY29weXJpZ2h0IHRvIHRoZWlyIGluZGl2aWR1YWwgYXV0aG9ycy4KLVBsZWFzZSByZWZlciB0byB0aGUgaW5kaXZpZHVhbCBzb3VyY2UgZmlsZXMgYW5kL29yIHRvIHRoZSBub1ZOQyBjb21taXQKLWhpc3Rvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYW5ha2Evbm9WTkMvY29tbWl0cy9tYXN0ZXIKK1RoZSBub1ZOQyBjb3JlIGxpYnJhcnkgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgMi4wIChNb3ppbGxhCitQdWJsaWMgTGljZW5zZSAyLjApLiBUaGUgbm9WTkMgY29yZSBsaWJyYXJ5IGlzIGNvbXBvc2VkIG9mIHRoZQorSmF2YXNjcmlwdCBjb2RlIG5lY2Vzc2FyeSBmb3IgZnVsbCBub1ZOQyBvcGVyYXRpb24uIFRoaXMgaW5jbHVkZXMgKGJ1dAoraXMgbm90IGxpbWl0ZWQgdG8pOgogCi1ub1ZOQyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTCAoR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKQotdmVyc2lvbiAzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zIChhbGwgTEdQTC0zIGNvbXBhdGlibGUpOgorICAgIGluY2x1ZGUvYmFzZTY0LmpzCisgICAgaW5jbHVkZS9kZXMuanMKKyAgICBpbmNsdWRlL2Rpc3BsYXkuanMKKyAgICBpbmNsdWRlL2lucHV0LmpzCisgICAgaW5jbHVkZS9qc3VuemlwLmpzCisgICAgaW5jbHVkZS9rZXlzeW0uanMKKyAgICBpbmNsdWRlL2xvZ28uanMKKyAgICBpbmNsdWRlL3JmYi5qcworICAgIGluY2x1ZGUvdWkuanMKKyAgICBpbmNsdWRlL3V0aWwuanMKKyAgICBpbmNsdWRlL3ZuYy5qcworICAgIGluY2x1ZGUvd2Vic29jay5qcworICAgIGluY2x1ZGUvd2VidXRpbC5qcwogCi0gICAgaW5jbHVkZS9pbnB1dC5qcyAgICAgICAgICAgOiBMR1BMLTIgb3IgYW55IGxhdGVyIHZlcnNpb24KLSAgIAotICAgIGluY2x1ZGUvYmFzZTY0LmpzICAgICAgICAgIDogRHVhbCBHUEwtMiBvciBMR1BMLTIuMQotICAgCi0gICAgaW5jbHVkZS9kZXMuanMgICAgICAgICAgICAgOiBWYXJpb3VzIEJTRCBzdHlsZSBsaWNlbnNlcworVGhlIEhUTUwsIENTUywgZm9udCBhbmQgaW1hZ2VzIGZpbGVzIHRoYXQgaW5jbHVkZWQgd2l0aCB0aGUgbm9WTkMKK3NvdXJjZSBkaXN0aWJ1dGlvbiAob3IgcmVwb3NpdG9yeSkgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCitub1ZOQyBjb3JlIGxpYnJhcnkgYW5kIGFyZSBsaWNlbnNlZCB1bmRlciBtb3JlIHBlcm1pc3NpdmUgbGljZW5zZXMuCitUaGUgaW50ZW50IGlzIHRvIGFsbG93IGVhc3kgaW50ZWdyYXRpb24gb2Ygbm9WTkMgaW50byBleGlzdGluZyB3ZWIKK3NpdGVzIGFuZCB3ZWIgYXBwbGljYXRpb25zLgogCi0gICAgaW5jbHVkZS9qc3VuemlwLmpzICAgICAgICAgOiB6bGliL2xpYnBuZyBsaWNlbnNlCitUaGUgSFRNTCwgQ1NTLCBmb250IGFuZCBpbWFnZSBmaWxlcyBhcmUgbGljZW5zZWQgYXMgZm9sbG93czoKIAotICAgIGluY2x1ZGUvd2ViLXNvY2tldC1qcy8gICAgIDogTmV3IEJTRCBsaWNlbnNlLiBTb3VyY2UgY29kZSBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2dpdGh1Yi5jb20vZ2ltaXRlL3dlYi1zb2NrZXQtanMKKyAgICAqLmh0bWwgICAgICAgICAgICAgICAgICAgICA6IDItQ2xhdXNlIEJTRCBsaWNlbnNlCisKKyAgICBpbmNsdWRlLyouY3NzICAgICAgICAgICAgICA6IDItQ2xhdXNlIEJTRCBsaWNlbnNlCiAKICAgICBpbmNsdWRlL09yYml0cm9uKiAgICAgICAgICA6IFNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb3B5cmlnaHQgMjAwOSBNYXR0IE1jSW5lcm5leSkKQEAgLTI0LDEyICszNyw0NiBAQAogICAgIGltYWdlcy8gICAgICAgICAgICAgICAgICAgIDogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAvCiAKLVRoZSBsaWNlbnNlIHRleHRzIGFyZSBpbmNsdWRlZCBhdDoKK1NvbWUgcG9ydGlvbnMgb2Ygbm9WTkMgYXJlIGNvcHlyaWdodCB0byB0aGVpciBpbmRpdmlkdWFsIGF1dGhvcnMuCitQbGVhc2UgcmVmZXIgdG8gdGhlIGluZGl2aWR1YWwgc291cmNlIGZpbGVzIGFuZC9vciB0byB0aGUgbm9WTkMgY29tbWl0CitoaXN0b3J5OiBodHRwczovL2dpdGh1Yi5jb20va2FuYWthL25vVk5DL2NvbW1pdHMvbWFzdGVyCisKK1RoZSBhcmUgc2V2ZXJhbCBmaWxlcyBhbmQgcHJvamVjdHMgdGhhdCBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkIGludG8KK3RoZSBub1ZOQyBjb3JlIGxpYnJhcnkuIEhlcmUgaXMgYSBsaXN0IG9mIHRob3NlIGZpbGVzIGFuZCB0aGUgb3JpZ2luYWwKK2xpY2Vuc2VzIChhbGwgTVBMIDIuMCBjb21wYXRpYmxlKToKKworICAgIGluY2x1ZGUvYmFzZTY0LmpzICAgICAgICAgIDogTVBMIDIuMAorICAgCisgICAgaW5jbHVkZS9kZXMuanMgICAgICAgICAgICAgOiBWYXJpb3VzIEJTRCBzdHlsZSBsaWNlbnNlcworCisgICAgaW5jbHVkZS9qc3VuemlwLmpzICAgICAgICAgOiB6bGliL2xpYnBuZyBsaWNlbnNlCisKKyAgICBpbmNsdWRlL3dlYi1zb2NrZXQtanMvICAgICA6IE5ldyBCU0QgbGljZW5zZSAoMy1jbGF1c2UpLiBTb3VyY2UgY29kZSBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2dpdGh1Yi5jb20vZ2ltaXRlL3dlYi1zb2NrZXQtanMKKworICAgIGluY2x1ZGUvY2hyb21lLWFwcC90Y3Atc3RyZWFtLmpzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBcGFjaGUgMi4wIGxpY2Vuc2UKKworICAgIHV0aWxzL3dlYnNvY2tpZnkKKyAgICB1dGlscy93ZWJzb2NrZXQucHkgICAgICAgICA6IExHUEwgMworCitUaGUgZm9sbG93aW5nIGxpY2Vuc2UgdGV4dHMgYXJlIGluY2x1ZGVkOgorCisgICAgZG9jcy9MSUNFTlNFLk1QTC0yLjAKICAgICBkb2NzL0xJQ0VOU0UuTEdQTC0zIGFuZAogICAgIGRvY3MvTElDRU5TRS5HUEwtMwogICAgIGRvY3MvTElDRU5TRS5PRkwtMS4xCisgICAgZG9jcy9MSUNFTlNFLkJTRC0zLUNsYXVzZSAoTmV3IEJTRCkKKyAgICBkb2NzL0xJQ0VOU0UuQlNELTItQ2xhdXNlIChTaW1wbGlmaWVkIEJTRCAvIEZyZWVCU0QpCisgICAgZG9jcy9MSUNFTlNFLnpsaWIKKyAgICBkb2NzL0xJQ0VOU0UuQXBhY2hlLTIuMAogCiBPciBhbHRlcm5hdGl2ZWx5IHRoZSBsaWNlbnNlIHRleHRzIG1heSBiZSBmb3VuZCBoZXJlOgorCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvMi4wLwogICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwgYW5kCiAgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAgICAgaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwKKyAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JTRF9saWNlbnNlcworICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2xpY2Vuc2UuaHRtbAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sCmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL1JFQURNRS5tZCBiL3dlYmNsaWVudHMvbm92bmMvUkVBRE1FLm1kCmluZGV4IDg4N2M5NmMuLmI1Njc5Y2QgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvUkVBRE1FLm1kCisrKyBiL3dlYmNsaWVudHMvbm92bmMvUkVBRE1FLm1kCkBAIC0xLDE2ICsxLDQ1IEBACiAjIyBub1ZOQzogSFRNTDUgVk5DIENsaWVudAogCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9rYW5ha2Evbm9WTkMuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcva2FuYWthL25vVk5DKQogCiAjIyMgRGVzY3JpcHRpb24KIAogbm9WTkMgaXMgYSBIVE1MNSBWTkMgY2xpZW50IHRoYXQgcnVucyB3ZWxsIGluIGFueSBtb2Rlcm4gYnJvd3NlcgogaW5jbHVkaW5nIG1vYmlsZSBicm93c2VycyAoaVBob25lL2lQYWQgYW5kIEFuZHJvaWQpLgogCi1Ob3RhYmxlIGNvbW1pdHMsIGFubm91bmNlbWVudHMgYW5kIG5ld3MgYXJlIHBvc3RlZCB0bwotQDxhIGhyZWY9Imh0dHA6Ly93d3cudHdpdHRlci5jb20vbm9WTkMiPm5vVk5DPC9hPgorTWFueSBjb21wYW5pZXMvcHJvamVjdHMgaGF2ZSBpbnRlZ3JhdGVkIG5vVk5DIGluY2x1ZGluZyBbR2FuZXRpIFdlYgorTWFuYWdlcl0oaHR0cDovL2NvZGUub3N1b3NsLm9yZy9wcm9qZWN0cy9nYW5ldGktd2VibWdyKSwKK1tPcGVuU3RhY2tdKGh0dHA6Ly93d3cub3BlbnN0YWNrLm9yZyksCitbT3Blbk5lYnVsYV0oaHR0cDovL29wZW5uZWJ1bGEub3JnLyksIGFuZAorW0xpYlZOQ1NlcnZlcl0oaHR0cDovL2xpYnZuY3NlcnZlci5zb3VyY2Vmb3JnZS5uZXQpLiBTZWUgW3RoZSBQcm9qZWN0cworYW5kIENvbXBhbmllcyB3aWtpCitwYWdlXShodHRwczovL2dpdGh1Yi5jb20va2FuYWthL25vVk5DL3dpa2kvUHJvamVjdHNDb21wYW5pZXMtdXNpbmctbm9WTkMpCitmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgd2l0aCBhZGRpdGlvbmFsIGluZm8gYW5kIGxpbmtzLgogCi1UaGVyZSBhcmUgbWFueSBjb21wYW5pZXMvcHJvamVjdHMgdGhhdCBoYXZlIGludGVncmF0ZWQgbm9WTkMgaW50bwotdGhlaXIgcHJvZHVjdHMgaW5jbHVkaW5nOiBbR2FuZXRpIFdlYiBNYW5hZ2VyXShodHRwOi8vY29kZS5vc3Vvc2wub3JnL3Byb2plY3RzL2dhbmV0aS13ZWJtZ3IpLCBbQXJjaGlwZWxdKGh0dHA6Ly9hcmNoaXBlbHByb2plY3Qub3JnKSwgW29wZW5RUk1dKGh0dHA6Ly93d3cub3BlbnFybS5jb20vKSwgW09wZW5Ob2RlXShodHRwOi8vd3d3Lm9wZW5ub2RlY2xvdWQuY29tLyksIFtPcGVuU3RhY2tdKGh0dHA6Ly93d3cub3BlbnN0YWNrLm9yZyksIFtCcm9hZHdheSAoSFRNTDUgR0RLL0dUSysgYmFja2VuZCldKGh0dHA6Ly9ibG9ncy5nbm9tZS5vcmcvYWxleGwvMjAxMS8wMy8xNS9ndGstaHRtbC1iYWNrZW5kLXVwZGF0ZS8pLCBbT3Blbk5lYnVsYV0oaHR0cDovL29wZW5uZWJ1bGEub3JnLyksIFtDbG91ZFNpZ21hXShodHRwOi8vd3d3LmNsb3Vkc2lnbWEuY29tLyksIFtaZW50eWFsIChmb3JtZXJseSBlQm94KV0oaHR0cDovL3d3dy56ZW50eWFsLm9yZy8pLCBbU2xhcE9TXShodHRwOi8vd3d3LnNsYXBvcy5vcmcpLCBbSW50ZWwgTWVzaENlbnRyYWxdKGh0dHBzOi8vbWVzaGNlbnRyYWwuY29tKSwgW0FtYWhpXShodHRwOi8vYW1haGkub3JnKSwgW0JyaWdodGJveF0oaHR0cDovL2JyaWdodGJveC5jb20vKSwgW0ZvcmVtYW5dKGh0dHA6Ly90aGVmb3JlbWFuLm9yZykgYW5kIFtMaWJWTkNTZXJ2ZXJdKGh0dHA6Ly9saWJ2bmNzZXJ2ZXIuc291cmNlZm9yZ2UubmV0KS4gU2VlIFt0aGlzIHdpa2kgcGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy93aWtpL1Byb2plY3RzQ29tcGFuaWVzLXVzaW5nLW5vVk5DKSBmb3IgbW9yZSBpbmZvIGFuZCBsaW5rcy4KKyMjIyBOZXdzL2hlbHAvY29udGFjdAorCitOb3RhYmxlIGNvbW1pdHMsIGFubm91bmNlbWVudHMgYW5kIG5ld3MgYXJlIHBvc3RlZCB0bworPGEgaHJlZj0iaHR0cDovL3d3dy50d2l0dGVyLmNvbS9ub1ZOQyI+QG5vVk5DPC9hPgorCitJZiB5b3UgYXJlIGEgbm9WTkMgZGV2ZWxvcGVyL2ludGVncmF0b3IvdXNlciAob3Igd2FudCB0byBiZSkgcGxlYXNlCitqb2luIHRoZSA8YQoraHJlZj0iaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8/ZnJvbWdyb3VwcyMhZm9ydW0vbm92bmMiPm5vVk5DCitkaXNjdXNzaW9uIGdyb3VwPC9hPgorCitCdWdzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIGNhbiBiZSBzdWJtaXR0ZWQgdmlhIFtnaXRodWIKK2lzc3Vlc10oaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy9pc3N1ZXMpLiBJZiB5b3UgYXJlIGxvb2tpbmcKK2ZvciBhIHBsYWNlIHRvIHN0YXJ0IGNvbnRyaWJ1dGluZyB0byBub1ZOQywgYSBnb29kIHBsYWNlIHRvIHN0YXJ0Cit3b3VsZCBiZSB0aGUgaXNzdWVzIHRoYXQgYXJlIG1hcmtlZCBhcworWyJwYXRjaHdlbGNvbWUiXShodHRwczovL2dpdGh1Yi5jb20va2FuYWthL25vVk5DL2lzc3Vlcz9sYWJlbHM9cGF0Y2h3ZWxjb21lKS4KKworSWYgeW91IHdhbnQgdG8gc2hvdyBhcHByZWNpYXRpb24gZm9yIG5vVk5DIHlvdSBjb3VsZCBkb25hdGUgdG8gYSBncmVhdAorbm9uLXByb2ZpdHMgc3VjaCBhczogW0NvbXBhc3Npb24KK0ludGVybmF0aW9uYWxdKGh0dHA6Ly93d3cuY29tcGFzc2lvbi5jb20vKSwgW1NJTF0oaHR0cDovL3d3dy5zaWwub3JnKSwKK1tIYWJpdGF0IGZvciBIdW1hbml0eV0oaHR0cDovL3d3dy5oYWJpdGF0Lm9yZyksIFtFbGVjdHJvbmljIEZyb250aWVyCitGb3VuZGF0aW9uXShodHRwczovL3d3dy5lZmYub3JnLyksIFtBZ2FpbnN0IE1hbGFyaWEKK0ZvdW5kYXRpb25dKGh0dHA6Ly93d3cuYWdhaW5zdG1hbGFyaWEuY29tLyksIFtOb3RoaW5nIEJ1dAorTmV0c10oaHR0cDovL3d3dy5ub3RoaW5nYnV0bmV0cy5uZXQvKSwgZXRjLiBQbGVhc2UgdHdlZXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cudHdpdHRlci5jb20vbm9WTkMiPkBub1ZOQzwvYT4gaWYgeW91IGRvLgogCiAKICMjIyBGZWF0dXJlcwpAQCAtMjQsNyArNTMsNyBAQAogKiBDbGlwYm9hcmQgY29weS9wYXN0ZQogKiBDbGlwcGluZyBvciBzY29sbGluZyBtb2RlcyBmb3IgbGFyZ2UgcmVtb3RlIHNjcmVlbnMKICogRWFzeSBzaXRlIGludGVncmF0aW9uIGFuZCB0aGVtaW5nICgzIGV4YW1wbGUgdGhlbWVzIGluY2x1ZGVkKQotKiBMaWNlbnNlZCB1bmRlciB0aGUgW0xHUEx2M10oaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbCkKKyogTGljZW5zZWQgdW5kZXIgdGhlIFtNUEwgMi4wXShodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8yLjAvKQogCiAjIyMgU2NyZWVuc2hvdHMKIApAQCAtNDksMTYgKzc4LDE4IEBACiAqIEZhc3QgSmF2YXNjcmlwdCBFbmdpbmU6IHRoaXMgaXMgbm90IHN0cmljdGx5IGEgcmVxdWlyZW1lbnQsIGJ1dAogICB3aXRob3V0IGEgZmFzdCBKYXZhc2NyaXB0IGVuZ2luZSwgbm9WTkMgbWlnaHQgYmUgcGFpbmZ1bGx5IHNsb3cuCiAKLSogSSBtYWludGFpbiBhIG1vcmUgZGV0YWlsZWQgYnJvd3NlciBjb21wYXRpYmlsaXR5IGxpc3QgPGEKLSAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy93aWtpL0Jyb3dzZXItc3VwcG9ydCI+aGVyZTwvYT4uCisqIFNlZSB0aGUgbW9yZSBkZXRhaWxlZCBbYnJvd3NlciBjb21wYXRpYmlsaXR5IHdpa2kgcGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy93aWtpL0Jyb3dzZXItc3VwcG9ydCkuCiAKIAogIyMjIFNlcnZlciBSZXF1aXJlbWVudHMKIAogVW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBWTkMgc2VydmVyIHdpdGggc3VwcG9ydCBmb3IgV2ViU29ja2V0cwotY29ubmVjdGlvbnMgKHN1Y2ggYXMgW3gxMXZuYy9saWJ2bmNzZXJ2ZXJdKGh0dHA6Ly9saWJ2bmNzZXJ2ZXIuc291cmNlZm9yZ2UubmV0LykpLAoteW91IG5lZWQgdG8gdXNlIGEgV2ViU29ja2V0cyB0byBUQ1Agc29ja2V0IHByb3h5LiBUaGVyZSBpcwotYSBweXRob24gcHJveHkgaW5jbHVkZWQgKCd3ZWJzb2NraWZ5JykuCitjb25uZWN0aW9ucyAoc3VjaCBhcworW3gxMXZuYy9saWJ2bmNzZXJ2ZXJdKGh0dHA6Ly9saWJ2bmNzZXJ2ZXIuc291cmNlZm9yZ2UubmV0LyksCitbUUVNVV0oaHR0cDovL3d3dy5xZW11Lm9yZy8pLCBvcgorW1BvY2tldFZOQ10oaHR0cDovL3d3dy5wb2NrZXR2bmMuY29tL2Jsb2cvP3BhZ2VfaWQ9ODY2KSksIHlvdSBuZWVkIHRvCit1c2UgYSBXZWJTb2NrZXRzIHRvIFRDUCBzb2NrZXQgcHJveHkuIFRoZXJlIGlzIGEgcHl0aG9uIHByb3h5IGluY2x1ZGVkCisoJ3dlYnNvY2tpZnknKS4KIAogCiAjIyMgUXVpY2sgU3RhcnQKQEAgLTc2LDggKzEwNyw5IEBACiAKICMjIyBPdGhlciBQYWdlcwogCi0qIFtBZHZhbmNlZCBVc2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy93aWtpL0FkdmFuY2VkLXVzYWdlKS4gR2VuZXJhdGluZyBhbiBTU0wKLSAgY2VydGlmaWNhdGUsIHN0YXJ0aW5nIGEgVk5DIHNlcnZlciwgYWR2YW5jZWQgd2Vic29ja2lmeSB1c2FnZSwgZXRjLgorKiBbRW5jcnlwdGVkIENvbm5lY3Rpb25zXShodHRwczovL2dpdGh1Yi5jb20va2FuYWthL3dlYnNvY2tpZnkvd2lraS9FbmNyeXB0ZWQtQ29ubmVjdGlvbnMpLiBIb3cgdG8gc2V0dXAgd2Vic29ja2lmeSBzbyB0aGF0IHlvdSBjYW4gdXNlIGVuY3J5cHRlZCBjb25uZWN0aW9ucyBmcm9tIG5vVk5DLgorCisqIFtBZHZhbmNlZCBVc2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2thbmFrYS9ub1ZOQy93aWtpL0FkdmFuY2VkLXVzYWdlKS4gU3RhcnRpbmcgYSBWTkMgc2VydmVyLCBhZHZhbmNlZCB3ZWJzb2NraWZ5IHVzYWdlLCBldGMuCiAKICogW0ludGVncmF0aW5nIG5vVk5DXShodHRwczovL2dpdGh1Yi5jb20va2FuYWthL25vVk5DL3dpa2kvSW50ZWdyYXRpb24pIGludG8gZXhpc3RpbmcgcHJvamVjdHMuCiAKQEAgLTg2LDggKzExOCwxNCBAQAogCiAjIyMgQXV0aG9ycy9Db250cmlidXRvcnMKIAotKiBub1ZOQyA6IEpvZWwgTWFydGluIChnaXRodWIuY29tL2thbmFrYSkKLSAgICAqIE5ldyBVSSBhbmQgSWNvbnMgOiBDaHJpcyBHb3Jkb24KKyogQ29yZSB0ZWFtOgorICAgICogW0pvZWwgTWFydGluXShodHRwczovL2dpdGh1Yi5jb20va2FuYWthKQorICAgICogW1NhbXVlbCBNYW5uZWhlZF0oaHR0cHM6Ly9naXRodWIuY29tL3NhbWhlZCkgKENlbmRpbykKKyAgICAqIFtQZXRlciDDhXN0cmFuZF0oaHR0cHM6Ly9naXRodWIuY29tL2FzdHJhbmQpIChDZW5kaW8pCisgICAgKiBbU29sbHkgUm9zc10oaHR0cHM6Ly9naXRodWIuY29tL0RpcmVjdFhNYW4xMikgKFJlZCBIYXQgLyBPcGVuU3RhY2spCisKKyogTm90YWJsZSBjb250cmlidXRpb25zOgorICAgICogVUkgYW5kIEljb25zIDogQ2hyaXMgR29yZG9uCiAgICAgKiBPcmlnaW5hbCBMb2dvIDogTWljaGFlbCBTZXJzZW4KICAgICAqIHRpZ2h0IGVuY29kaW5nIDogTWljaGFlbCBUaW5nbG9mIChNZXJjdXJpLmNhKQogCkBAIC05OCw1ICsxMzYsMyBAQAogICAgICoganN1bnppcCA6IEVyaWsgTW9sbGVyIChnaXRodWIuY29tL29wZXJhc29mdHdhcmUvanN1bnppcCksCiAgICAgKiB0aW5mbGF0ZSA6IEpvZXJnZW4gSWJzZW4gKGlic2Vuc29mdHdhcmUuY29tKQogICAgICogREVTIDogRGF2ZSBaaW1tZXJtYW4gKFdpZGdldCBXb3Jrc2hvcCksIEplZiBQb3NrYW56ZXIgKEFDTUUgTGFicykKLQotCmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2Zhdmljb24uaWNvIGIvd2ViY2xpZW50cy9ub3ZuYy9mYXZpY29uLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5OTYzNC4uMDAwMDAwMAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2Zhdmljb24uaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9mYXZpY29uLmljbyBiL3dlYmNsaWVudHMvbm92bmMvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDUzOTljOAotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvZmF2aWNvbi5pY28KQEAgLTAsMCArMSBAQAoraW1hZ2VzL2Zhdmljb24uaWNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvYWx0LnBuZyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL2FsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyYWY3YgotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL2FsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvY3RybC5wbmcgYi93ZWJjbGllbnRzL25vdm5jL2ltYWdlcy9jdHJsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjNiNjAxCi0tLSAvZGV2L251bGwKKysrIGIvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvY3RybC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvZXNjLnBuZyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL2VzYy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNWY3YwotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL2VzYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvcG93ZXIucG5nIGIvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvcG93ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGZkMDgKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjbGllbnRzL25vdm5jL2ltYWdlcy9wb3dlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvc2hvd2V4dHJha2V5cy5wbmcgYi93ZWJjbGllbnRzL25vdm5jL2ltYWdlcy9zaG93ZXh0cmFrZXlzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhlMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvc2hvd2V4dHJha2V5cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbWFnZXMvdGFiLnBuZyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL3RhYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxMzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW1hZ2VzL3RhYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Jhc2UuY3NzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Jhc2UuY3NzCmluZGV4IDEwNTk4NGQuLmUyYzlhOTYgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9iYXNlLmNzcworKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmFzZS5jc3MKQEAgLTEsMyArMSwxMSBAQAorLyoKKyAqIG5vVk5DIGJhc2UgQ1NTCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQgorICogbm9WTkMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgMi1DbGF1c2UgQlNEIGxpY2Vuc2UgKHNlZSBMSUNFTlNFLnR4dCkuCisgKi8KKwogYm9keSB7CiAgIG1hcmdpbjowOwogICBwYWRkaW5nOjA7CkBAIC0zMyw5ICs0MSw2IEBACiB9CiAjbm9WTkNfZW5jcnlwdCB7CiB9Ci0jbm9WTkNfY29ubmVjdFRpbWVvdXQgewotICB3aWR0aDogMzBweDsKLX0KICNub1ZOQ19wYXRoIHsKICAgd2lkdGg6IDEwMHB4OwogfQpAQCAtNDQsNiArNDksOSBAQAogICBmbG9hdDpyaWdodDsKIH0KIAorI25vVk5DX2J1dHRvbnMgeworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQogCiAjbm9WTkNfdmlld19kcmFnX2J1dHRvbiB7CiAgIGRpc3BsYXk6IG5vbmU7CkBAIC01MSwzOCArNTksNDMgQEAKICNzZW5kQ3RybEFsdERlbEJ1dHRvbiB7CiAgIGRpc3BsYXk6IG5vbmU7CiB9Cisjbm9WTkNfeHZwX2J1dHRvbnMgeworICBkaXNwbGF5OiBub25lOworfQogI25vVk5DX21vYmlsZV9idXR0b25zIHsKICAgZGlzcGxheTogbm9uZTsKIH0KIAorI25vVk5DX2V4dHJhX2tleXMgeworICBkaXNwbGF5OiBpbmxpbmU7CisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgcGFkZGluZzogMHB4OworICBtYXJnaW46IDBweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCiAubm9WTkMtYnV0dG9ucy1sZWZ0IHsKICAgZmxvYXQ6IGxlZnQ7Ci0gIHBhZGRpbmctbGVmdDoxMHB4OwotICBwYWRkaW5nLXRvcDo0cHg7CisgIHotaW5kZXg6IDE7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKIH0KIAogLm5vVk5DLWJ1dHRvbnMtcmlnaHQgewogICBmbG9hdDpyaWdodDsKICAgcmlnaHQ6IDBweDsKLSAgcGFkZGluZy1yaWdodDoxMHB4OwotICBwYWRkaW5nLXRvcDo0cHg7Ci19Ci0KLSNub1ZOQ19zdGF0dXNfYmFyIHsKLSAgbWFyZ2luLXRvcDogMHB4OwotICBwYWRkaW5nOiAwcHg7Ci19Ci0KLSNub1ZOQ19zdGF0dXNfYmFyIGRpdiB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgcGFkZGluZy10b3A6IDRweDsKLSAgd2lkdGg6MTAwJTsKKyAgei1pbmRleDogMjsKKyAgcG9zaXRpb246IGFic29sdXRlOwogfQogCiAjbm9WTkNfc3RhdHVzIHsKLSAgaGVpZ2h0OjIwcHg7CisgIGZvbnQtc2l6ZTogMTJweDsKKyAgcGFkZGluZy10b3A6IDRweDsKKyAgaGVpZ2h0OjMycHg7CiAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGNvbG9yOiAjZmZmOwogfQorCiAjbm9WTkNfc2V0dGluZ3NfbWVudSB7CiAgIG1hcmdpbjogM3B4OwogICB0ZXh0LWFsaWduOiBsZWZ0OwpAQCAtOTcsMjIgKzExMCwxMiBAQAogICBmbG9hdDpyaWdodDsKIH0KIAotLm5vVk5DX3N0YXR1c19ub3JtYWwgewotICBiYWNrZ3JvdW5kOiAjZWVlOwotfQotLm5vVk5DX3N0YXR1c19lcnJvciB7Ci0gIGJhY2tncm91bmQ6ICNmNDQ7Ci19Ci0ubm9WTkNfc3RhdHVzX3dhcm4gewotICBiYWNrZ3JvdW5kOiAjZmY0OwotfQotCiAvKiBEbyBub3Qgc2V0IHdpZHRoL2hlaWdodCBmb3IgVk5DX3NjcmVlbiBvciBWTkNfY2FudmFzIG9yIGluY29ycmVjdAogICogc2NhbGluZyB3aWxsIG9jY3VyLiBDYW52YXMgcmVzaXplcyB0byByZW1vdGUgVk5DIHNldHRpbmdzICovCiAjbm9WTkNfc2NyZWVuX3BhZCB7CiAgIG1hcmdpbjogMHB4OwogICBwYWRkaW5nOiAwcHg7Ci0gIGhlaWdodDogNDRweDsKKyAgaGVpZ2h0OiAzNnB4OwogfQogI25vVk5DX3NjcmVlbiB7CiAgIHRleHQtYWxpZ246IGNlbnRlcjsKQEAgLTE0NywxNCArMTUwLDE0IEBACiAvKkJ1YmJsZSBjb250ZW50cyBkaXZzKi8KICNub1ZOQ19zZXR0aW5ncyB7CiAgIGRpc3BsYXk6bm9uZTsKLSAgbWFyZ2luLXRvcDo3N3B4OworICBtYXJnaW4tdG9wOjczcHg7CiAgIHJpZ2h0OjIwcHg7CiAgIHBvc2l0aW9uOmZpeGVkOwogfQogCiAjbm9WTkNfY29udHJvbHMgewogICBkaXNwbGF5Om5vbmU7Ci0gIG1hcmdpbi10b3A6NzdweDsKKyAgbWFyZ2luLXRvcDo3M3B4OwogICByaWdodDoxMnB4OwogICBwb3NpdGlvbjpmaXhlZDsKIH0KQEAgLTE2Niw3ICsxNjksNyBAQAogICBkaXNwbGF5Om5vbmU7CiAgIHBvc2l0aW9uOmZpeGVkOwogCi0gIG1hcmdpbi10b3A6NzdweDsKKyAgbWFyZ2luLXRvcDo3M3B4OwogICByaWdodDoyMHB4OwogICBsZWZ0OjIwcHg7CiAgIHBhZGRpbmc6MTVweDsKQEAgLTE3OSw5ICsxODIsNDAgQEAKICAgYm9yZGVyLXJhZGl1czoxMHB4OwogfQogCisjbm9WTkNfcG9wdXBfc3RhdHVzX3BhbmVsIHsKKyAgZGlzcGxheTpub25lOworICBwb3NpdGlvbjogZml4ZWQ7CisgIHotaW5kZXg6IDE7CisKKyAgbWFyZ2luOjE1cHg7CisgIG1hcmdpbi10b3A6NjBweDsKKyAgcGFkZGluZzoxNXB4OworICB3aWR0aDphdXRvOworCisgIHRleHQtYWxpZ246Y2VudGVyOworICBmb250LXdlaWdodDpib2xkOworICB3b3JkLXdyYXA6YnJlYWstd29yZDsKKyAgY29sb3I6I2ZmZjsKKyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNjUpOworCisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czoxMHB4OworICAtbW96LWJvcmRlci1yYWRpdXM6MTBweDsKKyAgYm9yZGVyLXJhZGl1czoxMHB4OworfQorCisjbm9WTkNfeHZwIHsKKyAgZGlzcGxheTpub25lOworICBtYXJnaW4tdG9wOjczcHg7CisgIHJpZ2h0OjMwcHg7CisgIHBvc2l0aW9uOmZpeGVkOworfQorI25vVk5DX3h2cC50b3A6YWZ0ZXIgeworICByaWdodDoxMjVweDsKK30KKwogI25vVk5DX2NsaXBib2FyZCB7CiAgIGRpc3BsYXk6bm9uZTsKLSAgbWFyZ2luLXRvcDo3N3B4OworICBtYXJnaW4tdG9wOjczcHg7CiAgIHJpZ2h0OjMwcHg7CiAgIHBvc2l0aW9uOmZpeGVkOwogfQpAQCAtMjAwLDE3ICsyMzQsMTEgQEAKICAgei1pbmRleDogLTE7CiB9CiAKLS5ub1ZOQ19zdGF0dXNfd2FybiB7Ci0gIGJhY2tncm91bmQtY29sb3I6eWVsbG93OwotfQotCiAvKgogICogQWR2YW5jZWQgU3R5bGluZwogICovCiAKLS8qIENvbnRyb2wgYmFyICovCi0jbm9WTkMtY29udHJvbC1iYXIgewotICBwb3NpdGlvbjpmaXhlZDsKKy5ub1ZOQ19zdGF0dXNfbm9ybWFsIHsKICAgYmFja2dyb3VuZDogI2IyYmRjZDsgLyogT2xkIGJyb3dzZXJzICovCiAgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2IyYmRjZCAwJSwgIzg5OWNiMyA0OSUsICM3ZTkzYWYgNTElLCAjNmU4NGEzIDEwMCUpOyAvKiBGRjMuNisgKi8KICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCgwJSwjYjJiZGNkKSwgY29sb3Itc3RvcCg0OSUsIzg5OWNiMyksIGNvbG9yLXN0b3AoNTElLCM3ZTkzYWYpLCBjb2xvci1zdG9wKDEwMCUsIzZlODRhMykpOyAvKiBDaHJvbWUsU2FmYXJpNCsgKi8KQEAgLTIxOCw5ICsyNDYsMzIgQEAKICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2IyYmRjZCAwJSwjODk5Y2IzIDQ5JSwjN2U5M2FmIDUxJSwjNmU4NGEzIDEwMCUpOyAvKiBPcGVyYTExLjEwKyAqLwogICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2IyYmRjZCAwJSwjODk5Y2IzIDQ5JSwjN2U5M2FmIDUxJSwjNmU4NGEzIDEwMCUpOyAvKiBJRTEwKyAqLwogICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjYjJiZGNkIDAlLCM4OTljYjMgNDklLCM3ZTkzYWYgNTElLCM2ZTg0YTMgMTAwJSk7IC8qIFczQyAqLworfQorLm5vVk5DX3N0YXR1c19lcnJvciB7CisgIGJhY2tncm91bmQ6ICNmMDQwNDA7IC8qIE9sZCBicm93c2VycyAqLworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmMDQwNDAgMCUsICM4OTljYjMgNDklLCAjN2U5M2FmIDUxJSwgIzZlODRhMyAxMDAlKTsgLyogRkYzLjYrICovCisgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUsI2YwNDA0MCksIGNvbG9yLXN0b3AoNDklLCM4OTljYjMpLCBjb2xvci1zdG9wKDUxJSwjN2U5M2FmKSwgY29sb3Itc3RvcCgxMDAlLCM2ZTg0YTMpKTsgLyogQ2hyb21lLFNhZmFyaTQrICovCisgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwNDA0MCAwJSwjODk5Y2IzIDQ5JSwjN2U5M2FmIDUxJSwjNmU4NGEzIDEwMCUpOyAvKiBDaHJvbWUxMCssU2FmYXJpNS4xKyAqLworICBiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZjA0MDQwIDAlLCM4OTljYjMgNDklLCM3ZTkzYWYgNTElLCM2ZTg0YTMgMTAwJSk7IC8qIE9wZXJhMTEuMTArICovCisgIGJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZjA0MDQwIDAlLCM4OTljYjMgNDklLCM3ZTkzYWYgNTElLCM2ZTg0YTMgMTAwJSk7IC8qIElFMTArICovCisgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICNmMDQwNDAgMCUsIzg5OWNiMyA0OSUsIzdlOTNhZiA1MSUsIzZlODRhMyAxMDAlKTsgLyogVzNDICovCit9Cisubm9WTkNfc3RhdHVzX3dhcm4geworICBiYWNrZ3JvdW5kOiAjZjBmMDQwOyAvKiBPbGQgYnJvd3NlcnMgKi8KKyAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZjBmMDQwIDAlLCAjODk5Y2IzIDQ5JSwgIzdlOTNhZiA1MSUsICM2ZTg0YTMgMTAwJSk7IC8qIEZGMy42KyAqLworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLCNmMGYwNDApLCBjb2xvci1zdG9wKDQ5JSwjODk5Y2IzKSwgY29sb3Itc3RvcCg1MSUsIzdlOTNhZiksIGNvbG9yLXN0b3AoMTAwJSwjNmU4NGEzKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmMGYwNDAgMCUsIzg5OWNiMyA0OSUsIzdlOTNhZiA1MSUsIzZlODRhMyAxMDAlKTsgLyogQ2hyb21lMTArLFNhZmFyaTUuMSsgKi8KKyAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwZjA0MCAwJSwjODk5Y2IzIDQ5JSwjN2U5M2FmIDUxJSwjNmU4NGEzIDEwMCUpOyAvKiBPcGVyYTExLjEwKyAqLworICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwZjA0MCAwJSwjODk5Y2IzIDQ5JSwjN2U5M2FmIDUxJSwjNmU4NGEzIDEwMCUpOyAvKiBJRTEwKyAqLworICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjBmMDQwIDAlLCM4OTljYjMgNDklLCM3ZTkzYWYgNTElLCM2ZTg0YTMgMTAwJSk7IC8qIFczQyAqLworfQogCisvKiBDb250cm9sIGJhciAqLworI25vVk5DLWNvbnRyb2wtYmFyIHsKKyAgcG9zaXRpb246Zml4ZWQ7CisgIAogICBkaXNwbGF5OmJsb2NrOwotICBoZWlnaHQ6NDRweDsKKyAgaGVpZ2h0OjM2cHg7CiAgIGxlZnQ6MDsKICAgdG9wOjA7CiAgIHdpZHRoOjEwMCU7CkBAIC0zNjEsMjIgKzQxMiw4NSBAQAogICBmb250LXNpemU6IDE4MHB4OwogfQogCi1AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0ODFweCkgYW5kIChtYXgtd2lkdGg6IDY0MHB4KSB7Ci0gIC5ub1ZOQ19zdGF0dXNfYnV0dG9uIHsKLSAgICBmb250LXNpemU6IDEwcHg7Cisubm9WTkMtYnV0dG9ucy1sZWZ0IHsKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworfQorCisubm9WTkMtYnV0dG9ucy1yaWdodCB7CisgIHBhZGRpbmctcmlnaHQ6IDEwcHg7Cit9CisKKyNub1ZOQ19zdGF0dXMgeworICB6LWluZGV4OiAwOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHdpZHRoOiAxMDAlOworICBtYXJnaW4tbGVmdDogMHB4OworfQorCisjc2hvd0V4dHJhS2V5c0J1dHRvbiB7IGRpc3BsYXk6IG5vbmU7IH0KKyN0b2dnbGVDdHJsQnV0dG9uIHsgZGlzcGxheTogaW5saW5lOyB9CisjdG9nZ2xlQWx0QnV0dG9uIHsgIGRpc3BsYXk6IGlubGluZTsgfQorI3NlbmRUYWJCdXR0b24geyBkaXNwbGF5OiBpbmxpbmU7IH0KKyNzZW5kRXNjQnV0dG9uIHsgZGlzcGxheTogaW5saW5lOyB9CisKKy8qIGxlZnQtYWxpZ24gdGhlIHN0YXR1cyB0ZXh0IG9uIGxvd2VyIHJlc29sdXRpb25zICovCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MDBweCl7CisgICNub1ZOQ19zdGF0dXMgeworICAgIHotaW5kZXg6IDE7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHdpZHRoOiBhdXRvOworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgIH0KK30KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpewogICAjbm9WTkNfY2xpcGJvYXJkX3RleHQgewogICAgIHdpZHRoOiA0MTBweDsKICAgfQogICAjbm9WTkNfbG9nbyB7CiAgICAgZm9udC1zaXplOiAxNTBweDsKICAgfQotfQotCi1AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAzMjFweCkgYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgIC5ub1ZOQ19zdGF0dXNfYnV0dG9uIHsKICAgICBmb250LXNpemU6IDEwcHg7CiAgIH0KKyAgLm5vVk5DLWJ1dHRvbnMtbGVmdCB7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7CisgIH0KKyAgLm5vVk5DLWJ1dHRvbnMtcmlnaHQgeworICAgIHBhZGRpbmctcmlnaHQ6IDBweDsKKyAgfQorICAvKiBjb2xsYXBzZSB0aGUgZXh0cmEga2V5cyBvbiBsb3dlciByZXNvbHV0aW9ucyAqLworICAjc2hvd0V4dHJhS2V5c0J1dHRvbiB7CisgICAgZGlzcGxheTogaW5saW5lOworICB9CisgICN0b2dnbGVDdHJsQnV0dG9uIHsKKyAgICBkaXNwbGF5OiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDMwcHg7CisgICAgbGVmdDogMHB4OworICB9CisgICN0b2dnbGVBbHRCdXR0b24geworICAgIGRpc3BsYXk6IG5vbmU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNjVweDsKKyAgICBsZWZ0OiAwcHg7CisgIH0KKyAgI3NlbmRUYWJCdXR0b24geworICAgIGRpc3BsYXk6IG5vbmU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMTAwcHg7CisgICAgbGVmdDogMHB4OworICB9CisgICNzZW5kRXNjQnV0dG9uIHsKKyAgICBkaXNwbGF5OiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDEzNXB4OworICAgIGxlZnQ6IDBweDsKKyAgfQorfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAzMjFweCkgYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgICNub1ZOQ19jbGlwYm9hcmRfdGV4dCB7CiAgICAgd2lkdGg6IDI1MHB4OwogICB9CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmFzZTY0LmpzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Jhc2U2NC5qcwppbmRleCBlOWIzYzUyLi42NTFmYmFkIDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmFzZTY0LmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9iYXNlNjQuanMKQEAgLTEsMTQ3ICsxLDExMyBAQAotLyoKLSAqIE1vZGlmaWVkIGZyb206Ci0gKiBodHRwOi8vbHhyLm1vemlsbGEub3JnL21vemlsbGEvc291cmNlL2V4dGVuc2lvbnMveG1sLXJwYy9zcmMvbnNYbWxScGNDbGllbnQuanMjOTU2Ci0gKi8KKy8qIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKKyAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uICovCiAKLS8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKLSAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQotICoKLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgotICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSAqCi0gKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAotICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCi0gKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICogTGljZW5zZS4KLSAqCi0gKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFhNTC1SUEMgQ2xpZW50IGNvbXBvbmVudC4KLSAqCi0gKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKLSAqIERpZ2l0YWwgQ3JlYXRpb25zIDIsIEluYy4KLSAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDAKLSAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBDb250cmlidXRvcihzKToKLSAqICAgTWFydGlqbiBQaWV0ZXJzIDxtakBkaWdpY29vbC5jb20+IChvcmlnaW5hbCBhdXRob3IpCi0gKiAgIFNhbXVlbCBTaWViIDxzYW11ZWxAc2llYi5uZXQ+Ci0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKLSAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgotICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCi0gKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAotICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KLSAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCi0gKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKLSAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCi0gKgotICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKy8vIEZyb206IGh0dHA6Ly9oZy5tb3ppbGxhLm9yZy9tb3ppbGxhLWNlbnRyYWwvcmF3LWZpbGUvZWMxMDYzMGIxYTU0L2pzL3NyYy9kZXZ0b29scy9qaW50L3N1bnNwaWRlci9zdHJpbmctYmFzZTY0LmpzCiAKLS8qanNsaW50IHdoaXRlOiBmYWxzZSwgYml0d2lzZTogZmFsc2UsIHBsdXNwbHVzOiBmYWxzZSAqLworLypqc2xpbnQgd2hpdGU6IGZhbHNlICovCiAvKmdsb2JhbCBjb25zb2xlICovCiAKIHZhciBCYXNlNjQgPSB7CisgICAgLyogQ29udmVydCBkYXRhIChhbiBhcnJheSBvZiBpbnRlZ2VycykgdG8gYSBCYXNlNjQgc3RyaW5nLiAqLworICAgIHRvQmFzZTY0VGFibGUgOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nLnNwbGl0KCcnKSwKKyAgICBiYXNlNjRQYWQgICAgIDogJz0nLAogCi0vKiBDb252ZXJ0IGRhdGEgKGFuIGFycmF5IG9mIGludGVnZXJzKSB0byBhIEJhc2U2NCBzdHJpbmcuICovCi10b0Jhc2U2NFRhYmxlIDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLAotYmFzZTY0UGFkICAgICA6ICc9JywKKyAgICBlbmNvZGU6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICJ1c2Ugc3RyaWN0IjsKKyAgICAgICAgdmFyIHJlc3VsdCA9ICcnOworICAgICAgICB2YXIgdG9CYXNlNjRUYWJsZSA9IEJhc2U2NC50b0Jhc2U2NFRhYmxlOworICAgICAgICB2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHZhciBsZW5ndGhwYWQgPSAobGVuZ3RoICUgMyk7CisgICAgICAgIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBhc2NpaSBjaGFyYWN0ZXJzLgogCi1lbmNvZGU6IGZ1bmN0aW9uIChkYXRhKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciByZXN1bHQgPSAnJywKLSAgICAgICAgY2hyVGFibGUgPSBCYXNlNjQudG9CYXNlNjRUYWJsZS5zcGxpdCgnJyksCi0gICAgICAgIHBhZCA9IEJhc2U2NC5iYXNlNjRQYWQsCi0gICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoLAotICAgICAgICBpOwotICAgIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBhc2NpaSBjaGFyYWN0ZXJzLgotICAgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoIC0gMik7IGkgKz0gMykgewotICAgICAgICByZXN1bHQgKz0gY2hyVGFibGVbZGF0YVtpXSA+PiAyXTsKLSAgICAgICAgcmVzdWx0ICs9IGNoclRhYmxlWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpICsgKGRhdGFbaSsxXSA+PiA0KV07Ci0gICAgICAgIHJlc3VsdCArPSBjaHJUYWJsZVsoKGRhdGFbaSsxXSAmIDB4MGYpIDw8IDIpICsgKGRhdGFbaSsyXSA+PiA2KV07Ci0gICAgICAgIHJlc3VsdCArPSBjaHJUYWJsZVtkYXRhW2krMl0gJiAweDNmXTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSByZW1haW5pbmcgMSBvciAyIGJ5dGVzLCBwYWQgb3V0IHRvIDQgY2hhcmFjdGVycy4KLSAgICBpZiAobGVuZ3RoJTMpIHsKLSAgICAgICAgaSA9IGxlbmd0aCAtIChsZW5ndGglMyk7Ci0gICAgICAgIHJlc3VsdCArPSBjaHJUYWJsZVtkYXRhW2ldID4+IDJdOwotICAgICAgICBpZiAoKGxlbmd0aCUzKSA9PT0gMikgewotICAgICAgICAgICAgcmVzdWx0ICs9IGNoclRhYmxlWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpICsgKGRhdGFbaSsxXSA+PiA0KV07Ci0gICAgICAgICAgICByZXN1bHQgKz0gY2hyVGFibGVbKGRhdGFbaSsxXSAmIDB4MGYpIDw8IDJdOwotICAgICAgICAgICAgcmVzdWx0ICs9IHBhZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSBjaHJUYWJsZVsoZGF0YVtpXSAmIDB4MDMpIDw8IDRdOwotICAgICAgICAgICAgcmVzdWx0ICs9IHBhZCArIHBhZDsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAobGVuZ3RoIC0gMik7IGkgKz0gMykgeworICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbZGF0YVtpXSA+PiAyXTsKKyAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpICsgKGRhdGFbaSArIDFdID4+IDQpXTsKKyAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWygoZGF0YVtpICsgMV0gJiAweDBmKSA8PCAyKSArIChkYXRhW2kgKyAyXSA+PiA2KV07CisgICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVtkYXRhW2kgKyAyXSAmIDB4M2ZdOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0sCi0KLS8qIENvbnZlcnQgQmFzZTY0IGRhdGEgdG8gYSBzdHJpbmcgKi8KLXRvQmluYXJ5VGFibGUgOiBbCi0gICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0gICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0gICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCi0gICAgNTIsNTMsNTQsNTUsIDU2LDU3LDU4LDU5LCA2MCw2MSwtMSwtMSwgLTEsIDAsLTEsLTEsCi0gICAgLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsCi0gICAgMTUsMTYsMTcsMTgsIDE5LDIwLDIxLDIyLCAyMywyNCwyNSwtMSwgLTEsLTEsLTEsLTEsCi0gICAgLTEsMjYsMjcsMjgsIDI5LDMwLDMxLDMyLCAzMywzNCwzNSwzNiwgMzcsMzgsMzksNDAsCi0gICAgNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTEKLV0sCi0KLWRlY29kZTogZnVuY3Rpb24gKGRhdGEsIG9mZnNldCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICBvZmZzZXQgPSB0eXBlb2Yob2Zmc2V0KSAhPT0gJ3VuZGVmaW5lZCcgPyBvZmZzZXQgOiAwOwotICAgIHZhciBiaW5UYWJsZSA9IEJhc2U2NC50b0JpbmFyeVRhYmxlLAotICAgICAgICBwYWQgPSBCYXNlNjQuYmFzZTY0UGFkLAotICAgICAgICByZXN1bHQsIHJlc3VsdF9sZW5ndGgsIGlkeCwgaSwgYywgcGFkZGluZywKLSAgICAgICAgbGVmdGJpdHMgPSAwLCAvLyBudW1iZXIgb2YgYml0cyBkZWNvZGVkLCBidXQgeWV0IHRvIGJlIGFwcGVuZGVkCi0gICAgICAgIGxlZnRkYXRhID0gMCwgLy8gYml0cyBkZWNvZGVkLCBidXQgeWV0IHRvIGJlIGFwcGVuZGVkCi0gICAgICAgIGRhdGFfbGVuZ3RoID0gZGF0YS5pbmRleE9mKCc9JykgLSBvZmZzZXQ7Ci0KLSAgICBpZiAoZGF0YV9sZW5ndGggPCAwKSB7IGRhdGFfbGVuZ3RoID0gZGF0YS5sZW5ndGggLSBvZmZzZXQ7IH0KLQotICAgIC8qIEV2ZXJ5IGZvdXIgY2hhcmFjdGVycyBpcyAzIHJlc3VsdGluZyBudW1iZXJzICovCi0gICAgcmVzdWx0X2xlbmd0aCA9IChkYXRhX2xlbmd0aCA+PiAyKSAqIDMgKyBNYXRoLmZsb29yKChkYXRhX2xlbmd0aCU0KS8xLjUpOwotICAgIHJlc3VsdCA9IG5ldyBBcnJheShyZXN1bHRfbGVuZ3RoKTsKLQotICAgIC8vIENvbnZlcnQgb25lIGJ5IG9uZS4KLSAgICBmb3IgKGlkeCA9IDAsIGkgPSBvZmZzZXQ7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGMgPSBiaW5UYWJsZVtkYXRhLmNoYXJDb2RlQXQoaSkgJiAweDdmXTsKLSAgICAgICAgcGFkZGluZyA9IChkYXRhLmNoYXJBdChpKSA9PT0gcGFkKTsKLSAgICAgICAgLy8gU2tpcCBpbGxlZ2FsIGNoYXJhY3RlcnMgYW5kIHdoaXRlc3BhY2UKLSAgICAgICAgaWYgKGMgPT09IC0xKSB7Ci0gICAgICAgICAgICBjb25zb2xlLmVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciBjb2RlICIgKyBkYXRhLmNoYXJDb2RlQXQoaSkgKyAiIGF0IHBvc2l0aW9uICIgKyBpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBDb252ZXJ0IHRoZSByZW1haW5pbmcgMSBvciAyIGJ5dGVzLCBwYWQgb3V0IHRvIDQgY2hhcmFjdGVycy4KKyAgICAgICAgdmFyIGogPSAwOworICAgICAgICBpZiAobGVuZ3RocGFkID09PSAyKSB7CisgICAgICAgICAgICBqID0gbGVuZ3RoIC0gbGVuZ3RocGFkOworICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbZGF0YVtqXSA+PiAyXTsKKyAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWygoZGF0YVtqXSAmIDB4MDMpIDw8IDQpICsgKGRhdGFbaiArIDFdID4+IDQpXTsKKyAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWyhkYXRhW2ogKyAxXSAmIDB4MGYpIDw8IDJdOworICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbNjRdOworICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aHBhZCA9PT0gMSkgeworICAgICAgICAgICAgaiA9IGxlbmd0aCAtIGxlbmd0aHBhZDsKKyAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlW2RhdGFbal0gPj4gMl07CisgICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVsoZGF0YVtqXSAmIDB4MDMpIDw8IDRdOworICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbNjRdOworICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbNjRdOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDb2xsZWN0IGRhdGEgaW50byBsZWZ0ZGF0YSwgdXBkYXRlIGJpdGNvdW50Ci0gICAgICAgIGxlZnRkYXRhID0gKGxlZnRkYXRhIDw8IDYpIHwgYzsKLSAgICAgICAgbGVmdGJpdHMgKz0gNjsKIAotICAgICAgICAvLyBJZiB3ZSBoYXZlIDggb3IgbW9yZSBiaXRzLCBhcHBlbmQgOCBiaXRzIHRvIHRoZSByZXN1bHQKLSAgICAgICAgaWYgKGxlZnRiaXRzID49IDgpIHsKLSAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7Ci0gICAgICAgICAgICAvLyBBcHBlbmQgaWYgbm90IHBhZGRpbmcuCi0gICAgICAgICAgICBpZiAoIXBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaWR4KytdID0gKGxlZnRkYXRhID4+IGxlZnRiaXRzKSAmIDB4ZmY7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwKKworICAgIC8qIENvbnZlcnQgQmFzZTY0IGRhdGEgdG8gYSBzdHJpbmcgKi8KKyAgICAvKiBqc2hpbnQgLVcwMTMgKi8KKyAgICB0b0JpbmFyeVRhYmxlIDogWworICAgICAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKKyAgICAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCisgICAgICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsNjIsIC0xLC0xLC0xLDYzLAorICAgICAgICA1Miw1Myw1NCw1NSwgNTYsNTcsNTgsNTksIDYwLDYxLC0xLC0xLCAtMSwgMCwtMSwtMSwKKyAgICAgICAgLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsCisgICAgICAgIDE1LDE2LDE3LDE4LCAxOSwyMCwyMSwyMiwgMjMsMjQsMjUsLTEsIC0xLC0xLC0xLC0xLAorICAgICAgICAtMSwyNiwyNywyOCwgMjksMzAsMzEsMzIsIDMzLDM0LDM1LDM2LCAzNywzOCwzOSw0MCwKKyAgICAgICAgNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTEKKyAgICBdLAorICAgIC8qIGpzaGludCArVzAxMyAqLworCisgICAgZGVjb2RlOiBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KSB7CisgICAgICAgICJ1c2Ugc3RyaWN0IjsKKyAgICAgICAgb2Zmc2V0ID0gdHlwZW9mKG9mZnNldCkgIT09ICd1bmRlZmluZWQnID8gb2Zmc2V0IDogMDsKKyAgICAgICAgdmFyIHRvQmluYXJ5VGFibGUgPSBCYXNlNjQudG9CaW5hcnlUYWJsZTsKKyAgICAgICAgdmFyIGJhc2U2NFBhZCA9IEJhc2U2NC5iYXNlNjRQYWQ7CisgICAgICAgIHZhciByZXN1bHQsIHJlc3VsdF9sZW5ndGg7CisgICAgICAgIHZhciBsZWZ0Yml0cyA9IDA7IC8vIG51bWJlciBvZiBiaXRzIGRlY29kZWQsIGJ1dCB5ZXQgdG8gYmUgYXBwZW5kZWQKKyAgICAgICAgdmFyIGxlZnRkYXRhID0gMDsgLy8gYml0cyBkZWNvZGVkLCBidXQgeWV0IHRvIGJlIGFwcGVuZGVkCisgICAgICAgIHZhciBkYXRhX2xlbmd0aCA9IGRhdGEuaW5kZXhPZignPScpIC0gb2Zmc2V0OworCisgICAgICAgIGlmIChkYXRhX2xlbmd0aCA8IDApIHsgZGF0YV9sZW5ndGggPSBkYXRhLmxlbmd0aCAtIG9mZnNldDsgfQorCisgICAgICAgIC8qIEV2ZXJ5IGZvdXIgY2hhcmFjdGVycyBpcyAzIHJlc3VsdGluZyBudW1iZXJzICovCisgICAgICAgIHJlc3VsdF9sZW5ndGggPSAoZGF0YV9sZW5ndGggPj4gMikgKiAzICsgTWF0aC5mbG9vcigoZGF0YV9sZW5ndGggJSA0KSAvIDEuNSk7CisgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShyZXN1bHRfbGVuZ3RoKTsKKworICAgICAgICAvLyBDb252ZXJ0IG9uZSBieSBvbmUuCisgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGkgPSBvZmZzZXQ7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgYyA9IHRvQmluYXJ5VGFibGVbZGF0YS5jaGFyQ29kZUF0KGkpICYgMHg3Zl07CisgICAgICAgICAgICB2YXIgcGFkZGluZyA9IChkYXRhLmNoYXJBdChpKSA9PT0gYmFzZTY0UGFkKTsKKyAgICAgICAgICAgIC8vIFNraXAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlCisgICAgICAgICAgICBpZiAoYyA9PT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciBjb2RlICIgKyBkYXRhLmNoYXJDb2RlQXQoaSkgKyAiIGF0IHBvc2l0aW9uICIgKyBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZnRkYXRhICY9ICgxIDw8IGxlZnRiaXRzKSAtIDE7CisgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb2xsZWN0IGRhdGEgaW50byBsZWZ0ZGF0YSwgdXBkYXRlIGJpdGNvdW50CisgICAgICAgICAgICBsZWZ0ZGF0YSA9IChsZWZ0ZGF0YSA8PCA2KSB8IGM7CisgICAgICAgICAgICBsZWZ0Yml0cyArPSA2OworCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIDggb3IgbW9yZSBiaXRzLCBhcHBlbmQgOCBiaXRzIHRvIHRoZSByZXN1bHQKKyAgICAgICAgICAgIGlmIChsZWZ0Yml0cyA+PSA4KSB7CisgICAgICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgaWYgbm90IHBhZGRpbmcuCisgICAgICAgICAgICAgICAgaWYgKCFwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpZHgrK10gPSAobGVmdGRhdGEgPj4gbGVmdGJpdHMpICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVmdGRhdGEgJj0gKDEgPDwgbGVmdGJpdHMpIC0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYml0cyBsZWZ0LCB0aGUgYmFzZTY0IHN0cmluZyB3YXMgY29ycnVwdGVkCisgICAgICAgIGlmIChsZWZ0Yml0cykgeworICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdDb3JydXB0ZWQgYmFzZTY0IHN0cmluZycpOworICAgICAgICAgICAgZXJyLm5hbWUgPSAnQmFzZTY0LUVycm9yJzsKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotCi0gICAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHRoZSBiYXNlNjQgc3RyaW5nIHdhcyBjb3JydXB0ZWQKLSAgICBpZiAobGVmdGJpdHMpIHsKLSAgICAgICAgdGhyb3cge25hbWU6ICdCYXNlNjQtRXJyb3InLCAKLSAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDb3JydXB0ZWQgYmFzZTY0IHN0cmluZyd9OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIH07IC8qIEVuZCBvZiBCYXNlNjQgbmFtZXNwYWNlICovCmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmxhY2suY3NzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2JsYWNrLmNzcwppbmRleCA4ZjgwZjY2Li43ZDk0MGM1IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmxhY2suY3NzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9ibGFjay5jc3MKQEAgLTEsOCArMSwxNiBAQAorLyoKKyAqIG5vVk5DIGJsYWNrIENTUworICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUIKKyAqIG5vVk5DIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIDItQ2xhdXNlIEJTRCBsaWNlbnNlIChzZWUgTElDRU5TRS50eHQpLgorICovCisKICNrZXlib2FyZGlucHV0IHsKICAgYmFja2dyb3VuZC1jb2xvcjojMDAwOwogfQogCi0jbm9WTkMtY29udHJvbC1iYXIgeworLm5vVk5DX3N0YXR1c19ub3JtYWwgewogICBiYWNrZ3JvdW5kOiAjNGM0YzRjOyAvKiBPbGQgYnJvd3NlcnMgKi8KICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjNGM0YzRjIDAlLCAjMmMyYzJjIDUwJSwgIzAwMDAwMCA1MSUsICMxMzEzMTMgMTAwJSk7IC8qIEZGMy42KyAqLwogICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLCM0YzRjNGMpLCBjb2xvci1zdG9wKDUwJSwjMmMyYzJjKSwgY29sb3Itc3RvcCg1MSUsIzAwMDAwMCksIGNvbG9yLXN0b3AoMTAwJSwjMTMxMzEzKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLwpAQCAtMTEsNiArMTksMjQgQEAKICAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICM0YzRjNGMgMCUsIzJjMmMyYyA1MCUsIzAwMDAwMCA1MSUsIzEzMTMxMyAxMDAlKTsgLyogSUUxMCsgKi8KICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgIzRjNGM0YyAwJSwjMmMyYzJjIDUwJSwjMDAwMDAwIDUxJSwjMTMxMzEzIDEwMCUpOyAvKiBXM0MgKi8KIH0KKy5ub1ZOQ19zdGF0dXNfZXJyb3IgeworICBiYWNrZ3JvdW5kOiAjZjA0MDQwOyAvKiBPbGQgYnJvd3NlcnMgKi8KKyAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZjA0MDQwIDAlLCAjMmMyYzJjIDUwJSwgIzAwMDAwMCA1MSUsICMxMzEzMTMgMTAwJSk7IC8qIEZGMy42KyAqLworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLCNmMDQwNDApLCBjb2xvci1zdG9wKDUwJSwjMmMyYzJjKSwgY29sb3Itc3RvcCg1MSUsIzAwMDAwMCksIGNvbG9yLXN0b3AoMTAwJSwjMTMxMzEzKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLworICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmMDQwNDAgMCUsIzJjMmMyYyA1MCUsIzAwMDAwMCA1MSUsIzEzMTMxMyAxMDAlKTsgLyogQ2hyb21lMTArLFNhZmFyaTUuMSsgKi8KKyAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwNDA0MCAwJSwjMmMyYzJjIDUwJSwjMDAwMDAwIDUxJSwjMTMxMzEzIDEwMCUpOyAvKiBPcGVyYTExLjEwKyAqLworICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwNDA0MCAwJSwjMmMyYzJjIDUwJSwjMDAwMDAwIDUxJSwjMTMxMzEzIDEwMCUpOyAvKiBJRTEwKyAqLworICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjA0MDQwIDAlLCMyYzJjMmMgNTAlLCMwMDAwMDAgNTElLCMxMzEzMTMgMTAwJSk7IC8qIFczQyAqLworfQorLm5vVk5DX3N0YXR1c193YXJuIHsKKyAgYmFja2dyb3VuZDogI2YwZjA0MDsgLyogT2xkIGJyb3dzZXJzICovCisgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwZjA0MCAwJSwgIzJjMmMyYyA1MCUsICMwMDAwMDAgNTElLCAjMTMxMzEzIDEwMCUpOyAvKiBGRjMuNisgKi8KKyAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCgwJSwjZjBmMDQwKSwgY29sb3Itc3RvcCg1MCUsIzJjMmMyYyksIGNvbG9yLXN0b3AoNTElLCMwMDAwMDApLCBjb2xvci1zdG9wKDEwMCUsIzEzMTMxMykpOyAvKiBDaHJvbWUsU2FmYXJpNCsgKi8KKyAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZjBmMDQwIDAlLCMyYzJjMmMgNTAlLCMwMDAwMDAgNTElLCMxMzEzMTMgMTAwJSk7IC8qIENocm9tZTEwKyxTYWZhcmk1LjErICovCisgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNmMGYwNDAgMCUsIzJjMmMyYyA1MCUsIzAwMDAwMCA1MSUsIzEzMTMxMyAxMDAlKTsgLyogT3BlcmExMS4xMCsgKi8KKyAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICNmMGYwNDAgMCUsIzJjMmMyYyA1MCUsIzAwMDAwMCA1MSUsIzEzMTMxMyAxMDAlKTsgLyogSUUxMCsgKi8KKyAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgI2YwZjA0MCAwJSwjMmMyYzJjIDUwJSwjMDAwMDAwIDUxJSwjMTMxMzEzIDEwMCUpOyAvKiBXM0MgKi8KK30KIAogLnRyaWFuZ2xlLXJpZ2h0IHsKICAgYm9yZGVyOjJweCBzb2xpZCAjZmZmOwpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2JsdWUuY3NzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2JsdWUuY3NzCmluZGV4IGE4YmFmNzAuLmIyYTBhZGMgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9ibHVlLmNzcworKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvYmx1ZS5jc3MKQEAgLTEsNSArMSwxMiBAQAorLyoKKyAqIG5vVk5DIGJsdWUgQ1NTCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQgorICogbm9WTkMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgMi1DbGF1c2UgQlNEIGxpY2Vuc2UgKHNlZSBMSUNFTlNFLnR4dCkuCisgKi8KIAotI25vVk5DLWNvbnRyb2wtYmFyIHsKKy5ub1ZOQ19zdGF0dXNfbm9ybWFsIHsKICAgYmFja2dyb3VuZC1jb2xvcjojMDQwNzNkOwogICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KAogICAgIGxpbmVhciwKQEAgLTE0LDYgKzIxLDM2IEBACiAgICAgcmdiKDQsNyw2MSkgNTAlCiAgICk7CiB9Cisubm9WTkNfc3RhdHVzX2Vycm9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjojZjA0MDQwOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KAorICAgIGxpbmVhciwKKyAgICBsZWZ0IGJvdHRvbSwKKyAgICBsZWZ0IHRvcCwKKyAgICBjb2xvci1zdG9wKDAuNTQsIHJnYigyNDAsNjQsNjQpKSwKKyAgICBjb2xvci1zdG9wKDAuNSwgcmdiKDQsNyw2MSkpCisgICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KAorICAgIGNlbnRlciBib3R0b20sCisgICAgcmdiKDQsNyw2MSkgNTQlLAorICAgIHJnYigyNDksNjQsNjQpIDUwJQorICApOworfQorLm5vVk5DX3N0YXR1c193YXJuIHsKKyAgYmFja2dyb3VuZC1jb2xvcjojZjBmMDQwOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KAorICAgIGxpbmVhciwKKyAgICBsZWZ0IGJvdHRvbSwKKyAgICBsZWZ0IHRvcCwKKyAgICBjb2xvci1zdG9wKDAuNTQsIHJnYigyNDAsMjQwLDY0KSksCisgICAgY29sb3Itc3RvcCgwLjUsIHJnYig0LDcsNjEpKQorICApOworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCgKKyAgICBjZW50ZXIgYm90dG9tLAorICAgIHJnYig0LDcsNjEpIDU0JSwKKyAgICByZ2IoMjQwLDI0MCw2NCkgNTAlCisgICk7Cit9CiAKIC50cmlhbmdsZS1yaWdodCB7CiAgIGJvcmRlcjoycHggc29saWQgI2ZmZjsKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9jaHJvbWUtYXBwL3RjcC1jbGllbnQuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvY2hyb21lLWFwcC90Y3AtY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzEyNWYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvY2hyb21lLWFwcC90Y3AtY2xpZW50LmpzCkBAIC0wLDAgKzEsMzIxIEBACisvKgorQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0F1dGhvcjogQm9yaXMgU211cyAoc211c0BjaHJvbWl1bS5vcmcpCisqLworCisoZnVuY3Rpb24oZXhwb3J0cykgeworCisgIC8vIERlZmluZSBzb21lIGxvY2FsIHZhcmlhYmxlcyBoZXJlLgorICB2YXIgc29ja2V0ID0gY2hyb21lLnNvY2tldCB8fCBjaHJvbWUuZXhwZXJpbWVudGFsLnNvY2tldDsKKyAgdmFyIGRucyA9IGNocm9tZS5leHBlcmltZW50YWwuZG5zOworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGllbnQKKyAgICoKKyAgICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgVGhlIHJlbW90ZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICogQHBhcmFtIHtOdW1iZXJ9IHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCB0byBhdCB0aGUgcmVtb3RlIGhvc3QKKyAgICovCisgIGZ1bmN0aW9uIFRjcENsaWVudChob3N0LCBwb3J0LCBwb2xsSW50ZXJ2YWwpIHsKKyAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWwgfHwgMTU7CisKKyAgICAvLyBDYWxsYmFjayBmdW5jdGlvbnMuCisgICAgdGhpcy5jYWxsYmFja3MgPSB7CisgICAgICBjb25uZWN0OiBudWxsLCAgICAvLyBDYWxsZWQgd2hlbiBzb2NrZXQgaXMgY29ubmVjdGVkLgorICAgICAgZGlzY29ubmVjdDogbnVsbCwgLy8gQ2FsbGVkIHdoZW4gc29ja2V0IGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgIHJlY3ZCdWZmZXI6IG51bGwsIC8vIENhbGxlZCAoYXMgQXJyYXlCdWZmZXIpIHdoZW4gY2xpZW50IHJlY2VpdmVzIGRhdGEgZnJvbSBzZXJ2ZXIuCisgICAgICByZWN2U3RyaW5nOiBudWxsLCAvLyBDYWxsZWQgKGFzIHN0cmluZykgd2hlbiBjbGllbnQgcmVjZWl2ZXMgZGF0YSBmcm9tIHNlcnZlci4KKyAgICAgIHNlbnQ6IG51bGwgICAgICAgIC8vIENhbGxlZCB3aGVuIGNsaWVudCBzZW5kcyBkYXRhIHRvIHNlcnZlci4KKyAgICB9OworCisgICAgLy8gU29ja2V0LgorICAgIHRoaXMuc29ja2V0SWQgPSBudWxsOworICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTsKKworICAgIGxvZygnaW5pdGlhbGl6ZWQgdGNwIGNsaWVudCcpOworICB9CisKKyAgLyoqCisgICAqIENvbm5lY3RzIHRvIHRoZSBUQ1Agc29ja2V0LCBhbmQgY3JlYXRlcyBhbiBvcGVuIHNvY2tldC4KKyAgICoKKyAgICogQHNlZSBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vdHJ1bmsvYXBwcy9zb2NrZXQuaHRtbCNtZXRob2QtY3JlYXRlCisgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIG9uIGNvbm5lY3Rpb24KKyAgICovCisgIFRjcENsaWVudC5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgLy8gRmlyc3QgcmVzb2x2ZSB0aGUgaG9zdG5hbWUgdG8gYW4gSVAuCisgICAgZG5zLnJlc29sdmUodGhpcy5ob3N0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIHRoaXMuYWRkciA9IHJlc3VsdC5hZGRyZXNzOworICAgICAgc29ja2V0LmNyZWF0ZSgndGNwJywge30sIHRoaXMuX29uQ3JlYXRlLmJpbmQodGhpcykpOworCisgICAgICAvLyBSZWdpc3RlciBjb25uZWN0IGNhbGxiYWNrLgorICAgICAgdGhpcy5jYWxsYmFja3MuY29ubmVjdCA9IGNhbGxiYWNrOworICAgIH0uYmluZCh0aGlzKSk7CisgIH07CisKKyAgLyoqCisgICAqIFNlbmRzIGFuIGFycmF5YnVmZmVyL3ZpZXcgZG93biB0aGUgd2lyZSB0byB0aGUgcmVtb3RlIHNpZGUKKyAgICoKKyAgICogQHNlZSBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vdHJ1bmsvYXBwcy9zb2NrZXQuaHRtbCNtZXRob2Qtd3JpdGUKKyAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBUaGUgYXJyYXlidWZmZXIvdmlldyB0byBzZW5kCisgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG1lc3NhZ2UgaGFzIHNlbnQKKyAgICovCisgIFRjcENsaWVudC5wcm90b3R5cGUuc2VuZEJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZiwgY2FsbGJhY2spIHsKKyAgICBpZiAoYnVmLmJ1ZmZlcikgeworICAgICAgICBidWYgPSBidWYuYnVmZmVyOworICAgIH0KKworICAgIC8qCisgICAgLy8gRGVidWcKKyAgICB2YXIgYnl0ZXMgPSBbXSwgdTggPSBuZXcgVWludDhBcnJheShidWYpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdTgubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYnl0ZXMucHVzaCh1OFtpXSk7CisgICAgfQorICAgIGxvZygic2VuZGluZyBieXRlczogIiArIChieXRlcy5qb2luKCcsJykpKTsKKyAgICAqLworICAgIAorICAgIHNvY2tldC53cml0ZSh0aGlzLnNvY2tldElkLCBidWYsIHRoaXMuX29uV3JpdGVDb21wbGV0ZS5iaW5kKHRoaXMpKTsKKworICAgIC8vIFJlZ2lzdGVyIHNlbnQgY2FsbGJhY2suCisgICAgdGhpcy5jYWxsYmFja3Muc2VudCA9IGNhbGxiYWNrOworICB9OworCisgIC8qKgorICAgKiBTZW5kcyBhIHN0cmluZyBkb3duIHRoZSB3aXJlIHRvIHRoZSByZW1vdGUgc2lkZQorICAgKgorICAgKiBAc2VlIGh0dHA6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS90cnVuay9hcHBzL3NvY2tldC5odG1sI21ldGhvZC13cml0ZQorICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIFRoZSBzdHJpbmcgdG8gc2VuZAorICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBtZXNzYWdlIGhhcyBzZW50CisgICAqLworICBUY3BDbGllbnQucHJvdG90eXBlLnNlbmRTdHJpbmcgPSBmdW5jdGlvbihtc2csIGNhbGxiYWNrKSB7CisgICAgLyoKKyAgICAvLyBEZWJ1ZworICAgIGxvZygic2VuZGluZyBzdHJpbmc6ICIgKyBtc2cpOworICAgICovCisKKyAgICB0aGlzLl9zdHJpbmdUb0FycmF5QnVmZmVyKG1zZywgZnVuY3Rpb24oYXJyYXlCdWZmZXIpIHsKKyAgICAgIHNvY2tldC53cml0ZSh0aGlzLnNvY2tldElkLCBhcnJheUJ1ZmZlciwgdGhpcy5fb25Xcml0ZUNvbXBsZXRlLmJpbmQodGhpcykpOworICAgIH0uYmluZCh0aGlzKSk7CisKKyAgICAvLyBSZWdpc3RlciBzZW50IGNhbGxiYWNrLgorICAgIHRoaXMuY2FsbGJhY2tzLnNlbnQgPSBjYWxsYmFjazsKKyAgfTsKKworICAvKioKKyAgICogU2V0cyB0aGUgY2FsbGJhY2sgZm9yIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkCisgICAqCisgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBtZXNzYWdlIGhhcyBhcnJpdmVkCisgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBjYWxsYmFjayBhcmd1bWVudCB0eXBlOiAiYXJyYXlidWZmZXIiIG9yICJzdHJpbmciCisgICAqLworICBUY3BDbGllbnQucHJvdG90eXBlLmFkZFJlc3BvbnNlTGlzdGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgdHlwZSkgeworICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgdHlwZSA9ICJhcnJheWJ1ZmZlciI7CisgICAgfQorICAgIC8vIFJlZ2lzdGVyIHJlY2VpdmVkIGNhbGxiYWNrLgorICAgIGlmICh0eXBlID09PSAic3RyaW5nIikgeworICAgICAgdGhpcy5jYWxsYmFja3MucmVjdlN0cmluZyA9IGNhbGxiYWNrOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmNhbGxiYWNrcy5yZWN2QnVmZmVyID0gY2FsbGJhY2s7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBTZXRzIHRoZSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgc29ja2V0IGRpc2Nvbm5lY3RzCisgICAqCisgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHNvY2tldCBkaXNjb25uZWN0cworICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgY2FsbGJhY2sgYXJndW1lbnQgdHlwZTogImFycmF5YnVmZmVyIiBvciAic3RyaW5nIgorICAgKi8KKyAgVGNwQ2xpZW50LnByb3RvdHlwZS5hZGREaXNjb25uZWN0TGlzdGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgeworICAgIC8vIFJlZ2lzdGVyIGRpc2Nvbm5lY3QgY2FsbGJhY2suCisgICAgdGhpcy5jYWxsYmFja3MuZGlzY29ubmVjdCA9IGNhbGxiYWNrOworICB9OworCisgIC8qKgorICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSByZW1vdGUgc2lkZQorICAgKgorICAgKiBAc2VlIGh0dHA6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS90cnVuay9hcHBzL3NvY2tldC5odG1sI21ldGhvZC1kaXNjb25uZWN0CisgICAqLworICBUY3BDbGllbnQucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgeworICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlOworICAgICAgc29ja2V0LmRpc2Nvbm5lY3QodGhpcy5zb2NrZXRJZCk7CisgICAgICBpZiAodGhpcy5jYWxsYmFja3MuZGlzY29ubmVjdCkgeworICAgICAgICB0aGlzLmNhbGxiYWNrcy5kaXNjb25uZWN0KCk7CisgICAgICB9CisgICAgICBsb2coJ3NvY2tldCBkaXNjb25uZWN0ZWQnKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGZvciB3aGVuIHdlIGF0dGVtcHQgdG8gaGF2ZSBDaHJvbWUKKyAgICogY3JlYXRlIGEgc29ja2V0LiBJZiB0aGUgc29ja2V0IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgICAqIHdlIGdvIGFoZWFkIGFuZCBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2lkZS4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHNlZSBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vdHJ1bmsvYXBwcy9zb2NrZXQuaHRtbCNtZXRob2QtY29ubmVjdAorICAgKiBAcGFyYW0ge09iamVjdH0gY3JlYXRlSW5mbyBUaGUgc29ja2V0IGRldGFpbHMKKyAgICovCisgIFRjcENsaWVudC5wcm90b3R5cGUuX29uQ3JlYXRlID0gZnVuY3Rpb24oY3JlYXRlSW5mbykgeworICAgIHRoaXMuc29ja2V0SWQgPSBjcmVhdGVJbmZvLnNvY2tldElkOworICAgIGlmICh0aGlzLnNvY2tldElkID4gMCkgeworICAgICAgc29ja2V0LmNvbm5lY3QodGhpcy5zb2NrZXRJZCwgdGhpcy5hZGRyLCB0aGlzLnBvcnQsIHRoaXMuX29uQ29ubmVjdENvbXBsZXRlLmJpbmQodGhpcykpOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvcignVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQnKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGZvciB3aGVuIHdlIGF0dGVtcHQgdG8gaGF2ZSBDaHJvbWUKKyAgICogY29ubmVjdCB0byB0aGUgcmVtb3RlIHNpZGUuIElmIGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlzCisgICAqIG1hZGUgdGhlbiBwb2xsaW5nIHN0YXJ0cyB0byBjaGVjayBmb3IgZGF0YSB0byByZWFkCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7TnVtYmVyfSByZXN1bHRDb2RlIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAqLworICBUY3BDbGllbnQucHJvdG90eXBlLl9vbkNvbm5lY3RDb21wbGV0ZSA9IGZ1bmN0aW9uKHJlc3VsdENvZGUpIHsKKyAgICAvLyBTdGFydCBwb2xsaW5nIGZvciByZWFkcy4KKyAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICBzZXRUaW1lb3V0KHRoaXMuX3BlcmlvZGljYWxseVJlYWQuYmluZCh0aGlzKSwgdGhpcy5wb2xsSW50ZXJ2YWwpOworCisgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmNvbm5lY3QpIHsKKyAgICAgIGxvZygnY29ubmVjdCBjb21wbGV0ZScpOworICAgICAgdGhpcy5jYWxsYmFja3MuY29ubmVjdCgpOworICAgIH0KKyAgICBsb2coJ29uQ29ubmVjdENvbXBsZXRlJyk7CisgIH07CisKKyAgLyoqCisgICAqIENoZWNrcyBmb3IgbmV3IGRhdGEgdG8gcmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgICoKKyAgICogQHNlZSBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vdHJ1bmsvYXBwcy9zb2NrZXQuaHRtbCNtZXRob2QtcmVhZAorICAgKi8KKyAgVGNwQ2xpZW50LnByb3RvdHlwZS5fcGVyaW9kaWNhbGx5UmVhZCA9IGZ1bmN0aW9uKCkgeworICAgIHZhciB0aGF0ID0gdGhpczsKKyAgICBzb2NrZXQuZ2V0SW5mbyh0aGlzLnNvY2tldElkLCBmdW5jdGlvbiAoaW5mbykgeworICAgICAgaWYgKGluZm8uY29ubmVjdGVkKSB7CisgICAgICAgIHNldFRpbWVvdXQodGhhdC5fcGVyaW9kaWNhbGx5UmVhZC5iaW5kKHRoYXQpLCB0aGF0LnBvbGxJbnRlcnZhbCk7CisgICAgICAgIHNvY2tldC5yZWFkKHRoYXQuc29ja2V0SWQsIG51bGwsIHRoYXQuX29uRGF0YVJlYWQuYmluZCh0aGF0KSk7CisgICAgICB9IGVsc2UgaWYgKHRoYXQuaXNDb25uZWN0ZWQpIHsKKyAgICAgICAgbG9nKCdzb2NrZXQgZGlzY29ubmVjdCBkZXRlY3RlZCcpOworICAgICAgICB0aGF0LmRpc2Nvbm5lY3QoKTsKKyAgICAgIH0KKyAgIH0pOworICB9OworCisgIC8qKgorICAgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiBkYXRhIGhhcyBiZWVuIHJlYWQgZnJvbSB0aGUgc29ja2V0LgorICAgKiBDb252ZXJ0cyB0aGUgYXJyYXkgYnVmZmVyIHRoYXQgaXMgcmVhZCBpbiB0byBhIHN0cmluZworICAgKiBhbmQgc2VuZHMgaXQgb24gZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSBwYXNzaW5nIGl0IHRvCisgICAqIHRoZSBwcmV2aW91c2x5IGFzc2lnbmVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAc2VlIFRjcENsaWVudC5wcm90b3R5cGUuYWRkUmVzcG9uc2VMaXN0ZW5lcgorICAgKiBAcGFyYW0ge09iamVjdH0gcmVhZEluZm8gVGhlIGluY29taW5nIG1lc3NhZ2UKKyAgICovCisgIFRjcENsaWVudC5wcm90b3R5cGUuX29uRGF0YVJlYWQgPSBmdW5jdGlvbihyZWFkSW5mbykgeworICAgIC8vIENhbGwgcmVjZWl2ZWQgY2FsbGJhY2sgaWYgdGhlcmUncyBkYXRhIGluIHRoZSByZXNwb25zZS4KKyAgICBpZiAocmVhZEluZm8ucmVzdWx0Q29kZSA+IDApIHsKKyAgICAgIGxvZygnb25EYXRhUmVhZCcpOworCisgICAgICAvKgorICAgICAgLy8gRGVidWcKKyAgICAgIHZhciBieXRlcyA9IFtdLCB1OCA9IG5ldyBVaW50OEFycmF5KHJlYWRJbmZvLmRhdGEpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1OC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGJ5dGVzLnB1c2godThbaV0pOworICAgICAgfQorICAgICAgbG9nKCJyZWNlaXZlZCBieXRlczogIiArIChieXRlcy5qb2luKCcsJykpKTsKKyAgICAgICovCisgICAgICAKKyAgICAgIGlmICh0aGlzLmNhbGxiYWNrcy5yZWN2QnVmZmVyKSB7CisgICAgICAgIC8vIFJldHVybiByYXcgQXJyYXlCdWZmZXIgZGlyZWN0bHkuCisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnJlY3ZCdWZmZXIocmVhZEluZm8uZGF0YSk7CisgICAgICB9CisgICAgICBpZiAodGhpcy5jYWxsYmFja3MucmVjdlN0cmluZykgeworICAgICAgICAvLyBDb252ZXJ0IEFycmF5QnVmZmVyIHRvIHN0cmluZy4KKyAgICAgICAgdGhpcy5fYXJyYXlCdWZmZXJUb1N0cmluZyhyZWFkSW5mby5kYXRhLCBmdW5jdGlvbihzdHIpIHsKKyAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5yZWN2U3RyaW5nKHN0cik7CisgICAgICAgIH0uYmluZCh0aGlzKSk7CisgICAgICB9CisKKyAgICAgIC8vIFRyaWdnZXIgYW5vdGhlciByZWFkIHJpZ2h0IGF3YXkKKyAgICAgIHNldFRpbWVvdXQodGhpcy5fcGVyaW9kaWNhbGx5UmVhZC5iaW5kKHRoaXMpLCAwKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIENhbGxiYWNrIGZvciB3aGVuIGRhdGEgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgICAqIHdyaXR0ZW4gdG8gdGhlIHNvY2tldC4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtPYmplY3R9IHdyaXRlSW5mbyBUaGUgb3V0Z29pbmcgbWVzc2FnZQorICAgKi8KKyAgVGNwQ2xpZW50LnByb3RvdHlwZS5fb25Xcml0ZUNvbXBsZXRlID0gZnVuY3Rpb24od3JpdGVJbmZvKSB7CisgICAgbG9nKCdvbldyaXRlQ29tcGxldGUnKTsKKyAgICAvLyBDYWxsIHNlbnQgY2FsbGJhY2suCisgICAgaWYgKHRoaXMuY2FsbGJhY2tzLnNlbnQpIHsKKyAgICAgIHRoaXMuY2FsbGJhY2tzLnNlbnQod3JpdGVJbmZvKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIENvbnZlcnRzIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZworICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjb252ZXJ0CisgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gY29udmVyc2lvbiBpcyBjb21wbGV0ZQorICAgKi8KKyAgVGNwQ2xpZW50LnByb3RvdHlwZS5fYXJyYXlCdWZmZXJUb1N0cmluZyA9IGZ1bmN0aW9uKGJ1ZiwgY2FsbGJhY2spIHsKKyAgICB2YXIgYmIgPSBuZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkoYnVmKV0pOworICAgIHZhciBmID0gbmV3IEZpbGVSZWFkZXIoKTsKKyAgICBmLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgIGNhbGxiYWNrKGUudGFyZ2V0LnJlc3VsdCk7CisgICAgfTsKKyAgICBmLnJlYWRBc1RleHQoYmIpOworICB9OworCisgIC8qKgorICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhbiBhcnJheSBidWZmZXIKKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnQKKyAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBjb252ZXJzaW9uIGlzIGNvbXBsZXRlCisgICAqLworICBUY3BDbGllbnQucHJvdG90eXBlLl9zdHJpbmdUb0FycmF5QnVmZmVyID0gZnVuY3Rpb24oc3RyLCBjYWxsYmFjaykgeworICAgIHZhciBiYiA9IG5ldyBCbG9iKFtzdHJdKTsKKyAgICB2YXIgZiA9IG5ldyBGaWxlUmVhZGVyKCk7CisgICAgZi5vbmxvYWQgPSBmdW5jdGlvbihlKSB7CisgICAgICAgIGNhbGxiYWNrKGUudGFyZ2V0LnJlc3VsdCk7CisgICAgfTsKKyAgICBmLnJlYWRBc0FycmF5QnVmZmVyKGJiKTsKKyAgfTsKKworICAvKioKKyAgICogV3JhcHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZworICAgKi8KKyAgZnVuY3Rpb24gbG9nKG1zZykgeworICAgIGNvbnNvbGUubG9nKG1zZyk7CisgIH0KKworICAvKioKKyAgICogV3JhcHBlciBmdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZworICAgKi8KKyAgZnVuY3Rpb24gZXJyb3IobXNnKSB7CisgICAgY29uc29sZS5lcnJvcihtc2cpOworICB9CisKKyAgZXhwb3J0cy5UY3BDbGllbnQgPSBUY3BDbGllbnQ7CisKK30pKHdpbmRvdyk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvZGVzLmpzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Rlcy5qcwppbmRleCAxZjk1Mjg1Li5lY2JjODE5IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvZGVzLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9kZXMuanMKQEAgLTc1LDE5OSArNzUsMjAyIEBACiAgKiBmaW5lIEphdmEgdXRpbGl0aWVzOiBodHRwOi8vd3d3LmFjbWUuY29tL2phdmEvCiAgKi8KIAotInVzZSBzdHJpY3QiOwotLypqc2xpbnQgd2hpdGU6IGZhbHNlLCBiaXR3aXNlOiBmYWxzZSwgcGx1c3BsdXM6IGZhbHNlICovCisvKiBqc2xpbnQgd2hpdGU6IGZhbHNlICovCiAKIGZ1bmN0aW9uIERFUyhwYXNzd2QpIHsKKyAgICAidXNlIHN0cmljdCI7CiAKLS8vIFRhYmxlcywgcGVybXV0YXRpb25zLCBTLWJveGVzLCBldGMuCi12YXIgUEMyID0gWzEzLDE2LDEwLDIzLCAwLCA0LCAyLDI3LDE0LCA1LDIwLCA5LDIyLDE4LDExLCAzLAotICAgICAgICAgICAyNSwgNywxNSwgNiwyNiwxOSwxMiwgMSw0MCw1MSwzMCwzNiw0Niw1NCwyOSwzOSwKLSAgICAgICAgICAgNTAsNDQsMzIsNDcsNDMsNDgsMzgsNTUsMzMsNTIsNDUsNDEsNDksMzUsMjgsMzEgXSwKLSAgICB0b3Ryb3QgPSBbIDEsIDIsIDQsIDYsIDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjhdLAotICAgIHogPSAweDAsIGEsYixjLGQsZSxmLCBTUDEsU1AyLFNQMyxTUDQsU1A1LFNQNixTUDcsU1A4LAotICAgIGtleXMgPSBbXTsKKyAgICAvLyBUYWJsZXMsIHBlcm11dGF0aW9ucywgUy1ib3hlcywgZXRjLgorICAgIC8vIGpzaGludCAtVzAxMworICAgIHZhciBQQzIgPSBbMTMsMTYsMTAsMjMsIDAsIDQsIDIsMjcsMTQsIDUsMjAsIDksMjIsMTgsMTEsIDMsCisgICAgICAgICAgICAgICAyNSwgNywxNSwgNiwyNiwxOSwxMiwgMSw0MCw1MSwzMCwzNiw0Niw1NCwyOSwzOSwKKyAgICAgICAgICAgICAgIDUwLDQ0LDMyLDQ3LDQzLDQ4LDM4LDU1LDMzLDUyLDQ1LDQxLDQ5LDM1LDI4LDMxIF0sCisgICAgICAgIHRvdHJvdCA9IFsgMSwgMiwgNCwgNiwgOCwxMCwxMiwxNCwxNSwxNywxOSwyMSwyMywyNSwyNywyOF0sCisgICAgICAgIHogPSAweDAsIGEsYixjLGQsZSxmLCBTUDEsU1AyLFNQMyxTUDQsU1A1LFNQNixTUDcsU1A4LAorICAgICAgICBrZXlzID0gW107CiAKLWE9MTw8MTY7IGI9MTw8MjQ7IGM9YXxiOyBkPTE8PDI7IGU9MTw8MTA7IGY9ZHxlOwotU1AxID0gW2N8ZSx6fHosYXx6LGN8ZixjfGQsYXxmLHp8ZCxhfHosenxlLGN8ZSxjfGYsenxlLGJ8ZixjfGQsYnx6LHp8ZCwKLSAgICAgICB6fGYsYnxlLGJ8ZSxhfGUsYXxlLGN8eixjfHosYnxmLGF8ZCxifGQsYnxkLGF8ZCx6fHosenxmLGF8ZixifHosCi0gICAgICAgYXx6LGN8Zix6fGQsY3x6LGN8ZSxifHosYnx6LHp8ZSxjfGQsYXx6LGF8ZSxifGQsenxlLHp8ZCxifGYsYXxmLAotICAgICAgIGN8ZixhfGQsY3x6LGJ8ZixifGQsenxmLGF8ZixjfGUsenxmLGJ8ZSxifGUsenx6LGF8ZCxhfGUsenx6LGN8ZF07Ci1hPTE8PDIwOyBiPTE8PDMxOyBjPWF8YjsgZD0xPDw1OyBlPTE8PDE1OyBmPWR8ZTsKLVNQMiA9IFtjfGYsYnxlLHp8ZSxhfGYsYXx6LHp8ZCxjfGQsYnxmLGJ8ZCxjfGYsY3xlLGJ8eixifGUsYXx6LHp8ZCxjfGQsCi0gICAgICAgYXxlLGF8ZCxifGYsenx6LGJ8eix6fGUsYXxmLGN8eixhfGQsYnxkLHp8eixhfGUsenxmLGN8ZSxjfHosenxmLAotICAgICAgIHp8eixhfGYsY3xkLGF8eixifGYsY3x6LGN8ZSx6fGUsY3x6LGJ8ZSx6fGQsY3xmLGF8Zix6fGQsenxlLGJ8eiwKLSAgICAgICB6fGYsY3xlLGF8eixifGQsYXxkLGJ8ZixifGQsYXxkLGF8ZSx6fHosYnxlLHp8ZixifHosY3xkLGN8ZixhfGVdOwotYT0xPDwxNzsgYj0xPDwyNzsgYz1hfGI7IGQ9MTw8MzsgZT0xPDw5OyBmPWR8ZTsKLVNQMyA9IFt6fGYsY3xlLHp8eixjfGQsYnxlLHp8eixhfGYsYnxlLGF8ZCxifGQsYnxkLGF8eixjfGYsYXxkLGN8eix6fGYsCi0gICAgICAgYnx6LHp8ZCxjfGUsenxlLGF8ZSxjfHosY3xkLGF8ZixifGYsYXxlLGF8eixifGYsenxkLGN8Zix6fGUsYnx6LAotICAgICAgIGN8ZSxifHosYXxkLHp8ZixhfHosY3xlLGJ8ZSx6fHosenxlLGF8ZCxjfGYsYnxlLGJ8ZCx6fGUsenx6LGN8ZCwKLSAgICAgICBifGYsYXx6LGJ8eixjfGYsenxkLGF8ZixhfGUsYnxkLGN8eixifGYsenxmLGN8eixhfGYsenxkLGN8ZCxhfGVdOwotYT0xPDwxMzsgYj0xPDwyMzsgYz1hfGI7IGQ9MTw8MDsgZT0xPDw3OyBmPWR8ZTsKLVNQNCA9IFtjfGQsYXxmLGF8Zix6fGUsY3xlLGJ8ZixifGQsYXxkLHp8eixjfHosY3x6LGN8Zix6fGYsenx6LGJ8ZSxifGQsCi0gICAgICAgenxkLGF8eixifHosY3xkLHp8ZSxifHosYXxkLGF8ZSxifGYsenxkLGF8ZSxifGUsYXx6LGN8ZSxjfGYsenxmLAotICAgICAgIGJ8ZSxifGQsY3x6LGN8Zix6fGYsenx6LHp8eixjfHosYXxlLGJ8ZSxifGYsenxkLGN8ZCxhfGYsYXxmLHp8ZSwKLSAgICAgICBjfGYsenxmLHp8ZCxhfHosYnxkLGF8ZCxjfGUsYnxmLGF8ZCxhfGUsYnx6LGN8ZCx6fGUsYnx6LGF8eixjfGVdOwotYT0xPDwyNTsgYj0xPDwzMDsgYz1hfGI7IGQ9MTw8ODsgZT0xPDwxOTsgZj1kfGU7Ci1TUDUgPSBbenxkLGF8ZixhfGUsY3xkLHp8ZSx6fGQsYnx6LGF8ZSxifGYsenxlLGF8ZCxifGYsY3xkLGN8ZSx6fGYsYnx6LAotICAgICAgIGF8eixifGUsYnxlLHp8eixifGQsY3xmLGN8ZixhfGQsY3xlLGJ8ZCx6fHosY3x6LGF8ZixhfHosY3x6LHp8ZiwKLSAgICAgICB6fGUsY3xkLHp8ZCxhfHosYnx6LGF8ZSxjfGQsYnxmLGF8ZCxifHosY3xlLGF8ZixifGYsenxkLGF8eixjfGUsCi0gICAgICAgY3xmLHp8ZixjfHosY3xmLGF8ZSx6fHosYnxlLGN8eix6fGYsYXxkLGJ8ZCx6fGUsenx6LGJ8ZSxhfGYsYnxkXTsKLWE9MTw8MjI7IGI9MTw8Mjk7IGM9YXxiOyBkPTE8PDQ7IGU9MTw8MTQ7IGY9ZHxlOwotU1A2ID0gW2J8ZCxjfHosenxlLGN8ZixjfHosenxkLGN8ZixhfHosYnxlLGF8ZixhfHosYnxkLGF8ZCxifGUsYnx6LHp8ZiwKLSAgICAgICB6fHosYXxkLGJ8Zix6fGUsYXxlLGJ8Zix6fGQsY3xkLGN8ZCx6fHosYXxmLGN8ZSx6fGYsYXxlLGN8ZSxifHosCi0gICAgICAgYnxlLHp8ZCxjfGQsYXxlLGN8ZixhfHosenxmLGJ8ZCxhfHosYnxlLGJ8eix6fGYsYnxkLGN8ZixhfGUsY3x6LAotICAgICAgIGF8ZixjfGUsenx6LGN8ZCx6fGQsenxlLGN8eixhfGYsenxlLGF8ZCxifGYsenx6LGN8ZSxifHosYXxkLGJ8Zl07Ci1hPTE8PDIxOyBiPTE8PDI2OyBjPWF8YjsgZD0xPDwxOyBlPTE8PDExOyBmPWR8ZTsKLVNQNyA9IFthfHosY3xkLGJ8Zix6fHosenxlLGJ8ZixhfGYsY3xlLGN8ZixhfHosenx6LGJ8ZCx6fGQsYnx6LGN8ZCx6fGYsCi0gICAgICAgYnxlLGF8ZixhfGQsYnxlLGJ8ZCxjfHosY3xlLGF8ZCxjfHosenxlLHp8ZixjfGYsYXxlLHp8ZCxifHosYXxlLAotICAgICAgIGJ8eixhfGUsYXx6LGJ8ZixifGYsY3xkLGN8ZCx6fGQsYXxkLGJ8eixifGUsYXx6LGN8ZSx6fGYsYXxmLGN8ZSwKLSAgICAgICB6fGYsYnxkLGN8ZixjfHosYXxlLHp8eix6fGQsY3xmLHp8eixhfGYsY3x6LHp8ZSxifGQsYnxlLHp8ZSxhfGRdOwotYT0xPDwxODsgYj0xPDwyODsgYz1hfGI7IGQ9MTw8NjsgZT0xPDwxMjsgZj1kfGU7Ci1TUDggPSBbYnxmLHp8ZSxhfHosY3xmLGJ8eixifGYsenxkLGJ8eixhfGQsY3x6LGN8ZixhfGUsY3xlLGF8Zix6fGUsenxkLAotICAgICAgIGN8eixifGQsYnxlLHp8ZixhfGUsYXxkLGN8ZCxjfGUsenxmLHp8eix6fHosY3xkLGJ8ZCxifGUsYXxmLGF8eiwKLSAgICAgICBhfGYsYXx6LGN8ZSx6fGUsenxkLGN8ZCx6fGUsYXxmLGJ8ZSx6fGQsYnxkLGN8eixjfGQsYnx6LGF8eixifGYsCi0gICAgICAgenx6LGN8ZixhfGQsYnxkLGN8eixifGUsYnxmLHp8eixjfGYsYXxlLGF8ZSx6fGYsenxmLGF8ZCxifHosY3xlXTsKKyAgICAvLyBqc2hpbnQgLVcwMTUKKyAgICBhPTE8PDE2OyBiPTE8PDI0OyBjPWF8YjsgZD0xPDwyOyBlPTE8PDEwOyBmPWR8ZTsKKyAgICBTUDEgPSBbY3xlLHp8eixhfHosY3xmLGN8ZCxhfGYsenxkLGF8eix6fGUsY3xlLGN8Zix6fGUsYnxmLGN8ZCxifHosenxkLAorICAgICAgICAgICB6fGYsYnxlLGJ8ZSxhfGUsYXxlLGN8eixjfHosYnxmLGF8ZCxifGQsYnxkLGF8ZCx6fHosenxmLGF8ZixifHosCisgICAgICAgICAgIGF8eixjfGYsenxkLGN8eixjfGUsYnx6LGJ8eix6fGUsY3xkLGF8eixhfGUsYnxkLHp8ZSx6fGQsYnxmLGF8ZiwKKyAgICAgICAgICAgY3xmLGF8ZCxjfHosYnxmLGJ8ZCx6fGYsYXxmLGN8ZSx6fGYsYnxlLGJ8ZSx6fHosYXxkLGF8ZSx6fHosY3xkXTsKKyAgICBhPTE8PDIwOyBiPTE8PDMxOyBjPWF8YjsgZD0xPDw1OyBlPTE8PDE1OyBmPWR8ZTsKKyAgICBTUDIgPSBbY3xmLGJ8ZSx6fGUsYXxmLGF8eix6fGQsY3xkLGJ8ZixifGQsY3xmLGN8ZSxifHosYnxlLGF8eix6fGQsY3xkLAorICAgICAgICAgICBhfGUsYXxkLGJ8Zix6fHosYnx6LHp8ZSxhfGYsY3x6LGF8ZCxifGQsenx6LGF8ZSx6fGYsY3xlLGN8eix6fGYsCisgICAgICAgICAgIHp8eixhfGYsY3xkLGF8eixifGYsY3x6LGN8ZSx6fGUsY3x6LGJ8ZSx6fGQsY3xmLGF8Zix6fGQsenxlLGJ8eiwKKyAgICAgICAgICAgenxmLGN8ZSxhfHosYnxkLGF8ZCxifGYsYnxkLGF8ZCxhfGUsenx6LGJ8ZSx6fGYsYnx6LGN8ZCxjfGYsYXxlXTsKKyAgICBhPTE8PDE3OyBiPTE8PDI3OyBjPWF8YjsgZD0xPDwzOyBlPTE8PDk7IGY9ZHxlOworICAgIFNQMyA9IFt6fGYsY3xlLHp8eixjfGQsYnxlLHp8eixhfGYsYnxlLGF8ZCxifGQsYnxkLGF8eixjfGYsYXxkLGN8eix6fGYsCisgICAgICAgICAgIGJ8eix6fGQsY3xlLHp8ZSxhfGUsY3x6LGN8ZCxhfGYsYnxmLGF8ZSxhfHosYnxmLHp8ZCxjfGYsenxlLGJ8eiwKKyAgICAgICAgICAgY3xlLGJ8eixhfGQsenxmLGF8eixjfGUsYnxlLHp8eix6fGUsYXxkLGN8ZixifGUsYnxkLHp8ZSx6fHosY3xkLAorICAgICAgICAgICBifGYsYXx6LGJ8eixjfGYsenxkLGF8ZixhfGUsYnxkLGN8eixifGYsenxmLGN8eixhfGYsenxkLGN8ZCxhfGVdOworICAgIGE9MTw8MTM7IGI9MTw8MjM7IGM9YXxiOyBkPTE8PDA7IGU9MTw8NzsgZj1kfGU7CisgICAgU1A0ID0gW2N8ZCxhfGYsYXxmLHp8ZSxjfGUsYnxmLGJ8ZCxhfGQsenx6LGN8eixjfHosY3xmLHp8Zix6fHosYnxlLGJ8ZCwKKyAgICAgICAgICAgenxkLGF8eixifHosY3xkLHp8ZSxifHosYXxkLGF8ZSxifGYsenxkLGF8ZSxifGUsYXx6LGN8ZSxjfGYsenxmLAorICAgICAgICAgICBifGUsYnxkLGN8eixjfGYsenxmLHp8eix6fHosY3x6LGF8ZSxifGUsYnxmLHp8ZCxjfGQsYXxmLGF8Zix6fGUsCisgICAgICAgICAgIGN8Zix6fGYsenxkLGF8eixifGQsYXxkLGN8ZSxifGYsYXxkLGF8ZSxifHosY3xkLHp8ZSxifHosYXx6LGN8ZV07CisgICAgYT0xPDwyNTsgYj0xPDwzMDsgYz1hfGI7IGQ9MTw8ODsgZT0xPDwxOTsgZj1kfGU7CisgICAgU1A1ID0gW3p8ZCxhfGYsYXxlLGN8ZCx6fGUsenxkLGJ8eixhfGUsYnxmLHp8ZSxhfGQsYnxmLGN8ZCxjfGUsenxmLGJ8eiwKKyAgICAgICAgICAgYXx6LGJ8ZSxifGUsenx6LGJ8ZCxjfGYsY3xmLGF8ZCxjfGUsYnxkLHp8eixjfHosYXxmLGF8eixjfHosenxmLAorICAgICAgICAgICB6fGUsY3xkLHp8ZCxhfHosYnx6LGF8ZSxjfGQsYnxmLGF8ZCxifHosY3xlLGF8ZixifGYsenxkLGF8eixjfGUsCisgICAgICAgICAgIGN8Zix6fGYsY3x6LGN8ZixhfGUsenx6LGJ8ZSxjfHosenxmLGF8ZCxifGQsenxlLHp8eixifGUsYXxmLGJ8ZF07CisgICAgYT0xPDwyMjsgYj0xPDwyOTsgYz1hfGI7IGQ9MTw8NDsgZT0xPDwxNDsgZj1kfGU7CisgICAgU1A2ID0gW2J8ZCxjfHosenxlLGN8ZixjfHosenxkLGN8ZixhfHosYnxlLGF8ZixhfHosYnxkLGF8ZCxifGUsYnx6LHp8ZiwKKyAgICAgICAgICAgenx6LGF8ZCxifGYsenxlLGF8ZSxifGYsenxkLGN8ZCxjfGQsenx6LGF8ZixjfGUsenxmLGF8ZSxjfGUsYnx6LAorICAgICAgICAgICBifGUsenxkLGN8ZCxhfGUsY3xmLGF8eix6fGYsYnxkLGF8eixifGUsYnx6LHp8ZixifGQsY3xmLGF8ZSxjfHosCisgICAgICAgICAgIGF8ZixjfGUsenx6LGN8ZCx6fGQsenxlLGN8eixhfGYsenxlLGF8ZCxifGYsenx6LGN8ZSxifHosYXxkLGJ8Zl07CisgICAgYT0xPDwyMTsgYj0xPDwyNjsgYz1hfGI7IGQ9MTw8MTsgZT0xPDwxMTsgZj1kfGU7CisgICAgU1A3ID0gW2F8eixjfGQsYnxmLHp8eix6fGUsYnxmLGF8ZixjfGUsY3xmLGF8eix6fHosYnxkLHp8ZCxifHosY3xkLHp8ZiwKKyAgICAgICAgICAgYnxlLGF8ZixhfGQsYnxlLGJ8ZCxjfHosY3xlLGF8ZCxjfHosenxlLHp8ZixjfGYsYXxlLHp8ZCxifHosYXxlLAorICAgICAgICAgICBifHosYXxlLGF8eixifGYsYnxmLGN8ZCxjfGQsenxkLGF8ZCxifHosYnxlLGF8eixjfGUsenxmLGF8ZixjfGUsCisgICAgICAgICAgIHp8ZixifGQsY3xmLGN8eixhfGUsenx6LHp8ZCxjfGYsenx6LGF8ZixjfHosenxlLGJ8ZCxifGUsenxlLGF8ZF07CisgICAgYT0xPDwxODsgYj0xPDwyODsgYz1hfGI7IGQ9MTw8NjsgZT0xPDwxMjsgZj1kfGU7CisgICAgU1A4ID0gW2J8Zix6fGUsYXx6LGN8ZixifHosYnxmLHp8ZCxifHosYXxkLGN8eixjfGYsYXxlLGN8ZSxhfGYsenxlLHp8ZCwKKyAgICAgICAgICAgY3x6LGJ8ZCxifGUsenxmLGF8ZSxhfGQsY3xkLGN8ZSx6fGYsenx6LHp8eixjfGQsYnxkLGJ8ZSxhfGYsYXx6LAorICAgICAgICAgICBhfGYsYXx6LGN8ZSx6fGUsenxkLGN8ZCx6fGUsYXxmLGJ8ZSx6fGQsYnxkLGN8eixjfGQsYnx6LGF8eixifGYsCisgICAgICAgICAgIHp8eixjfGYsYXxkLGJ8ZCxjfHosYnxlLGJ8Zix6fHosY3xmLGF8ZSxhfGUsenxmLHp8ZixhfGQsYnx6LGN8ZV07CisgICAgLy8ganNoaW50ICtXMDEzLCtXMDE1CiAKLS8vIFNldCB0aGUga2V5LgotZnVuY3Rpb24gc2V0S2V5cyhrZXlCbG9jaykgewotICAgIHZhciBpLCBqLCBsLCBtLCBuLCBvLCBwYzFtID0gW10sIHBjciA9IFtdLCBrbiA9IFtdLAotICAgICAgICByYXcwLCByYXcxLCByYXdpLCBLbkxpOworICAgIC8vIFNldCB0aGUga2V5LgorICAgIGZ1bmN0aW9uIHNldEtleXMoa2V5QmxvY2spIHsKKyAgICAgICAgdmFyIGksIGosIGwsIG0sIG4sIG8sIHBjMW0gPSBbXSwgcGNyID0gW10sIGtuID0gW10sCisgICAgICAgICAgICByYXcwLCByYXcxLCByYXdpLCBLbkxpOwogCi0gICAgZm9yIChqID0gMCwgbCA9IDU2OyBqIDwgNTY7ICsraiwgbC09OCkgewotICAgICAgICBsICs9IGw8LTUgPyA2NSA6IGw8LTMgPyAzMSA6IGw8LTEgPyA2MyA6IGw9PT0yNyA/IDM1IDogMDsgLy8gUEMxCi0gICAgICAgIG0gPSBsICYgMHg3OwotICAgICAgICBwYzFtW2pdID0gKChrZXlCbG9ja1tsID4+PiAzXSAmICgxPDxtKSkgIT09IDApID8gMTogMDsKLSAgICB9CisgICAgICAgIGZvciAoaiA9IDAsIGwgPSA1NjsgaiA8IDU2OyArK2osIGwgLT0gOCkgeworICAgICAgICAgICAgbCArPSBsIDwgLTUgPyA2NSA6IGwgPCAtMyA/IDMxIDogbCA8IC0xID8gNjMgOiBsID09PSAyNyA/IDM1IDogMDsgLy8gUEMxCisgICAgICAgICAgICBtID0gbCAmIDB4NzsKKyAgICAgICAgICAgIHBjMW1bal0gPSAoKGtleUJsb2NrW2wgPj4+IDNdICYgKDE8PG0pKSAhPT0gMCkgPyAxOiAwOworICAgICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgICBtID0gaSA8PCAxOwotICAgICAgICBuID0gbSArIDE7Ci0gICAgICAgIGtuW21dID0ga25bbl0gPSAwOwotICAgICAgICBmb3IgKG89Mjg7IG88NTk7IG8rPTI4KSB7Ci0gICAgICAgICAgICBmb3IgKGogPSBvLTI4OyBqIDwgbzsgKytqKSB7Ci0gICAgICAgICAgICAgICAgbCA9IGogKyB0b3Ryb3RbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGwgPCBvKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBjcltqXSA9IHBjMW1bbF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGNyW2pdID0gcGMxbVtsIC0gMjhdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbSA9IGkgPDwgMTsKKyAgICAgICAgICAgIG4gPSBtICsgMTsKKyAgICAgICAgICAgIGtuW21dID0ga25bbl0gPSAwOworICAgICAgICAgICAgZm9yIChvID0gMjg7IG8gPCA1OTsgbyArPSAyOCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IG8gLSAyODsgaiA8IG87ICsraikgeworICAgICAgICAgICAgICAgICAgICBsID0gaiArIHRvdHJvdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGwgPCBvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwY3Jbal0gPSBwYzFtW2xdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGNyW2pdID0gcGMxbVtsIC0gMjhdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI0OyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAocGNyW1BDMltqXV0gIT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAga25bbV0gfD0gMSA8PCAoMjMgLSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBjcltQQzJbaiArIDI0XV0gIT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAga25bbl0gfD0gMSA8PCAoMjMgLSBqKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI0OyArK2opIHsKLSAgICAgICAgICAgIGlmIChwY3JbUEMyW2pdXSAhPT0gMCkgewotICAgICAgICAgICAgICAgIGtuW21dIHw9IDE8PCgyMy1qKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwY3JbUEMyW2ogKyAyNF1dICE9PSAwKSB7Ci0gICAgICAgICAgICAgICAga25bbl0gfD0gMTw8KDIzLWopOwotICAgICAgICAgICAgfQorCisgICAgICAgIC8vIGNvb2tleQorICAgICAgICBmb3IgKGkgPSAwLCByYXdpID0gMCwgS25MaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICByYXcwID0ga25bcmF3aSsrXTsKKyAgICAgICAgICAgIHJhdzEgPSBrbltyYXdpKytdOworICAgICAgICAgICAga2V5c1tLbkxpXSA9IChyYXcwICYgMHgwMGZjMDAwMCkgPDwgNjsKKyAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzAgJiAweDAwMDAwZmMwKSA8PCAxMDsKKyAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwZmMwMDAwKSA+Pj4gMTA7CisgICAgICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcxICYgMHgwMDAwMGZjMCkgPj4+IDY7CisgICAgICAgICAgICArK0tuTGk7CisgICAgICAgICAgICBrZXlzW0tuTGldID0gKHJhdzAgJiAweDAwMDNmMDAwKSA8PCAxMjsKKyAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzAgJiAweDAwMDAwMDNmKSA8PCAxNjsKKyAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwMDNmMDAwKSA+Pj4gNDsKKyAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwMDAwMDNmKTsKKyAgICAgICAgICAgICsrS25MaTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGNvb2tleQotICAgIGZvciAoaSA9IDAsIHJhd2kgPSAwLCBLbkxpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgcmF3MCA9IGtuW3Jhd2krK107Ci0gICAgICAgIHJhdzEgPSBrbltyYXdpKytdOwotICAgICAgICBrZXlzW0tuTGldID0gKHJhdzAgJiAweDAwZmMwMDAwKSA8PCA2OwotICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcwICYgMHgwMDAwMGZjMCkgPDwgMTA7Ci0gICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwZmMwMDAwKSA+Pj4gMTA7Ci0gICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwMDAwZmMwKSA+Pj4gNjsKLSAgICAgICAgKytLbkxpOwotICAgICAgICBrZXlzW0tuTGldID0gKHJhdzAgJiAweDAwMDNmMDAwKSA8PCAxMjsKLSAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MCAmIDB4MDAwMDAwM2YpIDw8IDE2OwotICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcxICYgMHgwMDAzZjAwMCkgPj4+IDQ7Ci0gICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwMDAwMDNmKTsKLSAgICAgICAgKytLbkxpOwotICAgIH0KLX0KKyAgICAvLyBFbmNyeXB0IDggYnl0ZXMgb2YgdGV4dAorICAgIGZ1bmN0aW9uIGVuYzgodGV4dCkgeworICAgICAgICB2YXIgaSA9IDAsIGIgPSB0ZXh0LnNsaWNlKCksIGZ2YWwsIGtleXNpID0gMCwKKyAgICAgICAgICAgIGwsIHIsIHg7IC8vIGxlZnQsIHJpZ2h0LCBhY2N1bXVsYXRvcgogCi0vLyBFbmNyeXB0IDggYnl0ZXMgb2YgdGV4dAotZnVuY3Rpb24gZW5jOCh0ZXh0KSB7Ci0gICAgdmFyIGkgPSAwLCBiID0gdGV4dC5zbGljZSgpLCBmdmFsLCBrZXlzaSA9IDAsCi0gICAgICAgIGwsIHIsIHg7IC8vIGxlZnQsIHJpZ2h0LCBhY2N1bXVsYXRvcgorICAgICAgICAvLyBTcXVhc2ggOCBieXRlcyB0byAyIGludHMKKyAgICAgICAgbCA9IGJbaSsrXTw8MjQgfCBiW2krK108PDE2IHwgYltpKytdPDw4IHwgYltpKytdOworICAgICAgICByID0gYltpKytdPDwyNCB8IGJbaSsrXTw8MTYgfCBiW2krK108PDggfCBiW2krK107CiAKLSAgICAvLyBTcXVhc2ggOCBieXRlcyB0byAyIGludHMKLSAgICBsID0gYltpKytdPDwyNCB8IGJbaSsrXTw8MTYgfCBiW2krK108PDggfCBiW2krK107Ci0gICAgciA9IGJbaSsrXTw8MjQgfCBiW2krK108PDE2IHwgYltpKytdPDw4IHwgYltpKytdOworICAgICAgICB4ID0gKChsID4+PiA0KSBeIHIpICYgMHgwZjBmMGYwZjsKKyAgICAgICAgciBePSB4OworICAgICAgICBsIF49ICh4IDw8IDQpOworICAgICAgICB4ID0gKChsID4+PiAxNikgXiByKSAmIDB4MDAwMGZmZmY7CisgICAgICAgIHIgXj0geDsKKyAgICAgICAgbCBePSAoeCA8PCAxNik7CisgICAgICAgIHggPSAoKHIgPj4+IDIpIF4gbCkgJiAweDMzMzMzMzMzOworICAgICAgICBsIF49IHg7CisgICAgICAgIHIgXj0gKHggPDwgMik7CisgICAgICAgIHggPSAoKHIgPj4+IDgpIF4gbCkgJiAweDAwZmYwMGZmOworICAgICAgICBsIF49IHg7CisgICAgICAgIHIgXj0gKHggPDwgOCk7CisgICAgICAgIHIgPSAociA8PCAxKSB8ICgociA+Pj4gMzEpICYgMSk7CisgICAgICAgIHggPSAobCBeIHIpICYgMHhhYWFhYWFhYTsKKyAgICAgICAgbCBePSB4OworICAgICAgICByIF49IHg7CisgICAgICAgIGwgPSAobCA8PCAxKSB8ICgobCA+Pj4gMzEpICYgMSk7CiAKLSAgICB4ID0gKChsID4+PiA0KSBeIHIpICYgMHgwZjBmMGYwZjsKLSAgICByIF49IHg7Ci0gICAgbCBePSAoeCA8PCA0KTsKLSAgICB4ID0gKChsID4+PiAxNikgXiByKSAmIDB4MDAwMGZmZmY7Ci0gICAgciBePSB4OwotICAgIGwgXj0gKHggPDwgMTYpOwotICAgIHggPSAoKHIgPj4+IDIpIF4gbCkgJiAweDMzMzMzMzMzOwotICAgIGwgXj0geDsKLSAgICByIF49ICh4IDw8IDIpOwotICAgIHggPSAoKHIgPj4+IDgpIF4gbCkgJiAweDAwZmYwMGZmOwotICAgIGwgXj0geDsKLSAgICByIF49ICh4IDw8IDgpOwotICAgIHIgPSAociA8PCAxKSB8ICgociA+Pj4gMzEpICYgMSk7Ci0gICAgeCA9IChsIF4gcikgJiAweGFhYWFhYWFhOwotICAgIGwgXj0geDsKLSAgICByIF49IHg7Ci0gICAgbCA9IChsIDw8IDEpIHwgKChsID4+PiAzMSkgJiAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgeCA9IChyIDw8IDI4KSB8IChyID4+PiA0KTsKKyAgICAgICAgICAgIHggXj0ga2V5c1trZXlzaSsrXTsKKyAgICAgICAgICAgIGZ2YWwgPSAgU1A3W3ggJiAweDNmXTsKKyAgICAgICAgICAgIGZ2YWwgfD0gU1A1Wyh4ID4+PiA4KSAmIDB4M2ZdOworICAgICAgICAgICAgZnZhbCB8PSBTUDNbKHggPj4+IDE2KSAmIDB4M2ZdOworICAgICAgICAgICAgZnZhbCB8PSBTUDFbKHggPj4+IDI0KSAmIDB4M2ZdOworICAgICAgICAgICAgeCA9IHIgXiBrZXlzW2tleXNpKytdOworICAgICAgICAgICAgZnZhbCB8PSBTUDhbeCAmIDB4M2ZdOworICAgICAgICAgICAgZnZhbCB8PSBTUDZbKHggPj4+IDgpICYgMHgzZl07CisgICAgICAgICAgICBmdmFsIHw9IFNQNFsoeCA+Pj4gMTYpICYgMHgzZl07CisgICAgICAgICAgICBmdmFsIHw9IFNQMlsoeCA+Pj4gMjQpICYgMHgzZl07CisgICAgICAgICAgICBsIF49IGZ2YWw7CisgICAgICAgICAgICB4ID0gKGwgPDwgMjgpIHwgKGwgPj4+IDQpOworICAgICAgICAgICAgeCBePSBrZXlzW2tleXNpKytdOworICAgICAgICAgICAgZnZhbCA9ICBTUDdbeCAmIDB4M2ZdOworICAgICAgICAgICAgZnZhbCB8PSBTUDVbKHggPj4+IDgpICYgMHgzZl07CisgICAgICAgICAgICBmdmFsIHw9IFNQM1soeCA+Pj4gMTYpICYgMHgzZl07CisgICAgICAgICAgICBmdmFsIHw9IFNQMVsoeCA+Pj4gMjQpICYgMHgzZl07CisgICAgICAgICAgICB4ID0gbCBeIGtleXNba2V5c2krK107CisgICAgICAgICAgICBmdmFsIHw9IFNQOFt4ICYgMHgwMDAwMDAzZl07CisgICAgICAgICAgICBmdmFsIHw9IFNQNlsoeCA+Pj4gOCkgJiAweDNmXTsKKyAgICAgICAgICAgIGZ2YWwgfD0gU1A0Wyh4ID4+PiAxNikgJiAweDNmXTsKKyAgICAgICAgICAgIGZ2YWwgfD0gU1AyWyh4ID4+PiAyNCkgJiAweDNmXTsKKyAgICAgICAgICAgIHIgXj0gZnZhbDsKKyAgICAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotICAgICAgICB4ID0gKHIgPDwgMjgpIHwgKHIgPj4+IDQpOwotICAgICAgICB4IF49IGtleXNba2V5c2krK107Ci0gICAgICAgIGZ2YWwgPSAgU1A3W3ggJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDVbKHggPj4+IDgpICYgMHgzZl07Ci0gICAgICAgIGZ2YWwgfD0gU1AzWyh4ID4+PiAxNikgJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDFbKHggPj4+IDI0KSAmIDB4M2ZdOwotICAgICAgICB4ID0gciBeIGtleXNba2V5c2krK107Ci0gICAgICAgIGZ2YWwgfD0gU1A4W3ggJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDZbKHggPj4+IDgpICYgMHgzZl07Ci0gICAgICAgIGZ2YWwgfD0gU1A0Wyh4ID4+PiAxNikgJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDJbKHggPj4+IDI0KSAmIDB4M2ZdOwotICAgICAgICBsIF49IGZ2YWw7Ci0gICAgICAgIHggPSAobCA8PCAyOCkgfCAobCA+Pj4gNCk7Ci0gICAgICAgIHggXj0ga2V5c1trZXlzaSsrXTsKLSAgICAgICAgZnZhbCA9ICBTUDdbeCAmIDB4M2ZdOwotICAgICAgICBmdmFsIHw9IFNQNVsoeCA+Pj4gOCkgJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDNbKHggPj4+IDE2KSAmIDB4M2ZdOwotICAgICAgICBmdmFsIHw9IFNQMVsoeCA+Pj4gMjQpICYgMHgzZl07Ci0gICAgICAgIHggPSBsIF4ga2V5c1trZXlzaSsrXTsKLSAgICAgICAgZnZhbCB8PSBTUDhbeCAmIDB4MDAwMDAwM2ZdOwotICAgICAgICBmdmFsIHw9IFNQNlsoeCA+Pj4gOCkgJiAweDNmXTsKLSAgICAgICAgZnZhbCB8PSBTUDRbKHggPj4+IDE2KSAmIDB4M2ZdOwotICAgICAgICBmdmFsIHw9IFNQMlsoeCA+Pj4gMjQpICYgMHgzZl07Ci0gICAgICAgIHIgXj0gZnZhbDsKKyAgICAgICAgciA9IChyIDw8IDMxKSB8IChyID4+PiAxKTsKKyAgICAgICAgeCA9IChsIF4gcikgJiAweGFhYWFhYWFhOworICAgICAgICBsIF49IHg7CisgICAgICAgIHIgXj0geDsKKyAgICAgICAgbCA9IChsIDw8IDMxKSB8IChsID4+PiAxKTsKKyAgICAgICAgeCA9ICgobCA+Pj4gOCkgXiByKSAmIDB4MDBmZjAwZmY7CisgICAgICAgIHIgXj0geDsKKyAgICAgICAgbCBePSAoeCA8PCA4KTsKKyAgICAgICAgeCA9ICgobCA+Pj4gMikgXiByKSAmIDB4MzMzMzMzMzM7CisgICAgICAgIHIgXj0geDsKKyAgICAgICAgbCBePSAoeCA8PCAyKTsKKyAgICAgICAgeCA9ICgociA+Pj4gMTYpIF4gbCkgJiAweDAwMDBmZmZmOworICAgICAgICBsIF49IHg7CisgICAgICAgIHIgXj0gKHggPDwgMTYpOworICAgICAgICB4ID0gKChyID4+PiA0KSBeIGwpICYgMHgwZjBmMGYwZjsKKyAgICAgICAgbCBePSB4OworICAgICAgICByIF49ICh4IDw8IDQpOworCisgICAgICAgIC8vIFNwcmVhZCBpbnRzIHRvIGJ5dGVzCisgICAgICAgIHggPSBbciwgbF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGJbaV0gPSAoeFtpPj4+Ml0gPj4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICUgMjU2OworICAgICAgICAgICAgaWYgKGJbaV0gPCAwKSB7IGJbaV0gKz0gMjU2OyB9IC8vIHVuc2lnbmVkCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCi0gICAgciA9IChyIDw8IDMxKSB8IChyID4+PiAxKTsKLSAgICB4ID0gKGwgXiByKSAmIDB4YWFhYWFhYWE7Ci0gICAgbCBePSB4OwotICAgIHIgXj0geDsKLSAgICBsID0gKGwgPDwgMzEpIHwgKGwgPj4+IDEpOwotICAgIHggPSAoKGwgPj4+IDgpIF4gcikgJiAweDAwZmYwMGZmOwotICAgIHIgXj0geDsKLSAgICBsIF49ICh4IDw8IDgpOwotICAgIHggPSAoKGwgPj4+IDIpIF4gcikgJiAweDMzMzMzMzMzOwotICAgIHIgXj0geDsKLSAgICBsIF49ICh4IDw8IDIpOwotICAgIHggPSAoKHIgPj4+IDE2KSBeIGwpICYgMHgwMDAwZmZmZjsKLSAgICBsIF49IHg7Ci0gICAgciBePSAoeCA8PCAxNik7Ci0gICAgeCA9ICgociA+Pj4gNCkgXiBsKSAmIDB4MGYwZjBmMGY7Ci0gICAgbCBePSB4OwotICAgIHIgXj0gKHggPDwgNCk7Ci0KLSAgICAvLyBTcHJlYWQgaW50cyB0byBieXRlcwotICAgIHggPSBbciwgbF07Ci0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBiW2ldID0gKHhbaT4+PjJdID4+PiAoOCooMyAtIChpJTQpKSkpICUgMjU2OwotICAgICAgICBpZiAoYltpXSA8IDApIHsgYltpXSArPSAyNTY7IH0gLy8gdW5zaWduZWQKKyAgICAvLyBFbmNyeXB0IDE2IGJ5dGVzIG9mIHRleHQgdXNpbmcgcGFzc3dkIGFzIGtleQorICAgIGZ1bmN0aW9uIGVuY3J5cHQodCkgeworICAgICAgICByZXR1cm4gZW5jOCh0LnNsaWNlKDAsIDgpKS5jb25jYXQoZW5jOCh0LnNsaWNlKDgsIDE2KSkpOwogICAgIH0KLSAgICByZXR1cm4gYjsKLX0KIAotLy8gRW5jcnlwdCAxNiBieXRlcyBvZiB0ZXh0IHVzaW5nIHBhc3N3ZCBhcyBrZXkKLWZ1bmN0aW9uIGVuY3J5cHQodCkgewotICAgIHJldHVybiBlbmM4KHQuc2xpY2UoMCw4KSkuY29uY2F0KGVuYzgodC5zbGljZSg4LDE2KSkpOwotfQotCi1zZXRLZXlzKHBhc3N3ZCk7ICAgICAgICAgICAgIC8vIFNldHVwIGtleXMKLXJldHVybiB7J2VuY3J5cHQnOiBlbmNyeXB0fTsgLy8gUHVibGljIGludGVyZmFjZQorICAgIHNldEtleXMocGFzc3dkKTsgICAgICAgICAgICAgLy8gU2V0dXAga2V5cworICAgIHJldHVybiB7J2VuY3J5cHQnOiBlbmNyeXB0fTsgLy8gUHVibGljIGludGVyZmFjZQogCiB9IC8vIGZ1bmN0aW9uIERFUwpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2Rpc3BsYXkuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvZGlzcGxheS5qcwppbmRleCBmMmVjZGJhLi44NzYzZmE0IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvZGlzcGxheS5qcworKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvZGlzcGxheS5qcwpAQCAtMSw3MDAgKzEsNzQwIEBACiAvKgogICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnQKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICogTGljZW5zZWQgdW5kZXIgTEdQTC0zIChzZWUgTElDRU5TRS50eHQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKICAqCiAgKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgogICovCiAKLS8qanNsaW50IGJyb3dzZXI6IHRydWUsIHdoaXRlOiBmYWxzZSwgYml0d2lzZTogZmFsc2UgKi8KKy8qanNsaW50IGJyb3dzZXI6IHRydWUsIHdoaXRlOiBmYWxzZSAqLwogLypnbG9iYWwgVXRpbCwgQmFzZTY0LCBjaGFuZ2VDdXJzb3IgKi8KIAotZnVuY3Rpb24gRGlzcGxheShkZWZhdWx0cykgewotInVzZSBzdHJpY3QiOwordmFyIERpc3BsYXk7CiAKLXZhciB0aGF0ICAgICAgICAgICA9IHt9LCAgLy8gUHVibGljIEFQSSBtZXRob2RzCi0gICAgY29uZiAgICAgICAgICAgPSB7fSwgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcworKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CiAKLSAgICAvLyBQcml2YXRlIERpc3BsYXkgbmFtZXNwYWNlIHZhcmlhYmxlcwotICAgIGNfY3R4ICAgICAgICAgID0gbnVsbCwKLSAgICBjX2ZvcmNlQ2FudmFzICA9IGZhbHNlLAorICAgIERpc3BsYXkgPSBmdW5jdGlvbiAoZGVmYXVsdHMpIHsKKyAgICAgICAgdGhpcy5fZHJhd0N0eCA9IG51bGw7CisgICAgICAgIHRoaXMuX2NfZm9yY2VDYW52YXMgPSBmYWxzZTsKIAotICAgIC8vIFByZWRlZmluZSBmdW5jdGlvbiB2YXJpYWJsZXMgKGpzbGludCkKLSAgICBpbWFnZURhdGFHZXQsIHJnYkltYWdlRGF0YSwgYmdyeEltYWdlRGF0YSwgY21hcEltYWdlRGF0YSwKLSAgICBzZXRGaWxsQ29sb3IsIHJlc2NhbGUsCisgICAgICAgIHRoaXMuX3JlbmRlclEgPSBbXTsgIC8vIHF1ZXVlIGRyYXdpbmcgYWN0aW9ucyBmb3IgaW4tb2RlciByZW5kZXJpbmcKIAotICAgIC8vIFRoZSBmdWxsIGZyYW1lIGJ1ZmZlciAobG9naWNhbCBjYW52YXMpIHNpemUKLSAgICBmYl93aWR0aCAgICAgICAgPSAwLAotICAgIGZiX2hlaWdodCAgICAgICA9IDAsCi0gICAgLy8gVGhlIHZpc2libGUgInBoeXNpY2FsIGNhbnZhcyIgdmlld3BvcnQKLSAgICB2aWV3cG9ydCAgICAgICA9IHsneCc6IDAsICd5JzogMCwgJ3cnIDogMCwgJ2gnIDogMCB9LAotICAgIGNsZWFuUmVjdCAgICAgID0geyd4MSc6IDAsICd5MSc6IDAsICd4Mic6IC0xLCAneTInOiAtMX0sCisgICAgICAgIC8vIHRoZSBmdWxsIGZyYW1lIGJ1ZmZlciAobG9naWNhbCBjYW52YXMpIHNpemUKKyAgICAgICAgdGhpcy5fZmJfd2lkdGggPSAwOworICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSAwOwogCi0gICAgY19wcmV2U3R5bGUgICAgPSAiIiwKLSAgICB0aWxlICAgICAgICAgICA9IG51bGwsCi0gICAgdGlsZTE2eDE2ICAgICAgPSBudWxsLAotICAgIHRpbGVfeCAgICAgICAgID0gMCwKLSAgICB0aWxlX3kgICAgICAgICA9IDA7CisgICAgICAgIC8vIHRoZSB2aXNpYmxlICJwaHlzaWNhbCBjYW52YXMiIHZpZXdwb3J0CisgICAgICAgIHRoaXMuX3ZpZXdwb3J0TG9jID0geyAneCc6IDAsICd5JzogMCwgJ3cnOiAwLCAnaCc6IDAgfTsKKyAgICAgICAgdGhpcy5fY2xlYW5SZWN0ID0geyAneDEnOiAwLCAneTEnOiAwLCAneDInOiAtMSwgJ3kyJzogLTEgfTsKIAorICAgICAgICB0aGlzLl9wcmV2RHJhd1N0eWxlID0gIiI7CisgICAgICAgIHRoaXMuX3RpbGUgPSBudWxsOworICAgICAgICB0aGlzLl90aWxlMTZ4MTYgPSBudWxsOworICAgICAgICB0aGlzLl90aWxlX3ggPSAwOworICAgICAgICB0aGlzLl90aWxlX3kgPSAwOwogCi0vLyBDb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMKLVV0aWwuY29uZl9kZWZhdWx0cyhjb25mLCB0aGF0LCBkZWZhdWx0cywgWwotICAgIFsndGFyZ2V0JywgICAgICAnd28nLCAnZG9tJywgIG51bGwsICdDYW52YXMgZWxlbWVudCBmb3IgcmVuZGVyaW5nJ10sCi0gICAgWydjb250ZXh0JywgICAgICdybycsICdyYXcnLCAgbnVsbCwgJ0NhbnZhcyAyRCBjb250ZXh0IGZvciByZW5kZXJpbmcgKHJlYWQtb25seSknXSwKLSAgICBbJ2xvZ28nLCAgICAgICAgJ3J3JywgJ3JhdycsICBudWxsLCAnTG9nbyB0byBkaXNwbGF5IHdoZW4gY2xlYXJlZDogeyJ3aWR0aCI6IHdpZHRoLCAiaGVpZ2h0IjogaGVpZ2h0LCAiZGF0YSI6IGRhdGF9J10sCi0gICAgWyd0cnVlX2NvbG9yJywgICdydycsICdib29sJywgdHJ1ZSwgJ1VzZSB0cnVlLWNvbG9yIHBpeGVsIGRhdGEnXSwKLSAgICBbJ2NvbG91ck1hcCcsICAgJ3J3JywgJ2FycicsICBbXSwgJ0NvbG91ciBtYXAgYXJyYXkgKHdoZW4gbm90IHRydWUtY29sb3IpJ10sCi0gICAgWydzY2FsZScsICAgICAgICdydycsICdmbG9hdCcsIDEuMCwgJ0Rpc3BsYXkgYXJlYSBzY2FsZSBmYWN0b3IgMC4wIC0gMS4wJ10sCi0gICAgWyd2aWV3cG9ydCcsICAgICdydycsICdib29sJywgZmFsc2UsICdVc2UgYSB2aWV3cG9ydCBzZXQgd2l0aCB2aWV3cG9ydENoYW5nZSgpJ10sCi0gICAgWyd3aWR0aCcsICAgICAgICdydycsICdpbnQnLCBudWxsLCAnRGlzcGxheSBhcmVhIHdpZHRoJ10sCi0gICAgWydoZWlnaHQnLCAgICAgICdydycsICdpbnQnLCBudWxsLCAnRGlzcGxheSBhcmVhIGhlaWdodCddLAorICAgICAgICBVdGlsLnNldF9kZWZhdWx0cyh0aGlzLCBkZWZhdWx0cywgeworICAgICAgICAgICAgJ3RydWVfY29sb3InOiB0cnVlLAorICAgICAgICAgICAgJ2NvbG91ck1hcCc6IFtdLAorICAgICAgICAgICAgJ3NjYWxlJzogMS4wLAorICAgICAgICAgICAgJ3ZpZXdwb3J0JzogZmFsc2UsCisgICAgICAgICAgICAncmVuZGVyX21vZGUnOiAnJworICAgICAgICB9KTsKIAotICAgIFsncmVuZGVyX21vZGUnLCAncm8nLCAnc3RyJywgJycsICdDYW52YXMgcmVuZGVyaW5nIG1vZGUgKHJlYWQtb25seSknXSwKKyAgICAgICAgVXRpbC5EZWJ1ZygiPj4gRGlzcGxheS5jb25zdHJ1Y3RvciIpOwogCi0gICAgWydwcmVmZXJfanMnLCAgICdydycsICdzdHInLCBudWxsLCAnUHJlZmVyIEphdmFzY3JpcHQgb3ZlciBjYW52YXMgbWV0aG9kcyddLAotICAgIFsnY3Vyc29yX3VyaScsICAncncnLCAncmF3JywgbnVsbCwgJ0NhbiB3ZSByZW5kZXIgY3Vyc29yIHVzaW5nIGRhdGEgVVJJJ10KKyAgICAgICAgaWYgKCF0aGlzLl90YXJnZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGFyZ2V0IG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3RhcmdldCA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0IG11c3QgYmUgYSBET00gZWxlbWVudCcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0aGlzLl90YXJnZXQuZ2V0Q29udGV4dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJubyBnZXRDb250ZXh0IG1ldGhvZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0aGlzLl9kcmF3Q3R4KSB7CisgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4ID0gdGhpcy5fdGFyZ2V0LmdldENvbnRleHQoJzJkJyk7CisgICAgICAgIH0KKworICAgICAgICBVdGlsLkRlYnVnKCJVc2VyIEFnZW50OiAiICsgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CisgICAgICAgIGlmIChVdGlsLkVuZ2luZS5nZWNrbykgeyBVdGlsLkRlYnVnKCJCcm93c2VyOiBnZWNrbyAiICsgVXRpbC5FbmdpbmUuZ2Vja28pOyB9CisgICAgICAgIGlmIChVdGlsLkVuZ2luZS53ZWJraXQpIHsgVXRpbC5EZWJ1ZygiQnJvd3Nlcjogd2Via2l0ICIgKyBVdGlsLkVuZ2luZS53ZWJraXQpOyB9CisgICAgICAgIGlmIChVdGlsLkVuZ2luZS50cmlkZW50KSB7IFV0aWwuRGVidWcoIkJyb3dzZXI6IHRyaWRlbnQgIiArIFV0aWwuRW5naW5lLnRyaWRlbnQpOyB9CisgICAgICAgIGlmIChVdGlsLkVuZ2luZS5wcmVzdG8pIHsgVXRpbC5EZWJ1ZygiQnJvd3NlcjogcHJlc3RvICIgKyBVdGlsLkVuZ2luZS5wcmVzdG8pOyB9CisKKyAgICAgICAgdGhpcy5jbGVhcigpOworCisgICAgICAgIC8vIENoZWNrIGNhbnZhcyBmZWF0dXJlcworICAgICAgICBpZiAoJ2NyZWF0ZUltYWdlRGF0YScgaW4gdGhpcy5fZHJhd0N0eCkgeworICAgICAgICAgICAgdGhpcy5fcmVuZGVyX21vZGUgPSAnY2FudmFzIHJlbmRlcmluZyc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IGNyZWF0ZUltYWdlRGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuX3ByZWZlcl9qcyA9PT0gbnVsbCkgeworICAgICAgICAgICAgVXRpbC5JbmZvKCJQcmVmZXJpbmcgamF2YXNjcmlwdCBvcGVyYXRpb25zIik7CisgICAgICAgICAgICB0aGlzLl9wcmVmZXJfanMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGJyb3dzZXIgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgY3Vyc29yIHZpYSBkYXRhIFVSSSBzY2hlbWUKKyAgICAgICAgdmFyIGN1ckRhdCA9IFtdOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDggKiA4ICogNDsgaSsrKSB7CisgICAgICAgICAgICBjdXJEYXQucHVzaCgyNTUpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgY3VyU2F2ZSA9IHRoaXMuX3RhcmdldC5zdHlsZS5jdXJzb3I7CisgICAgICAgICAgICBEaXNwbGF5LmNoYW5nZUN1cnNvcih0aGlzLl90YXJnZXQsIGN1ckRhdCwgY3VyRGF0LCAyLCAyLCA4LCA4KTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnNvcl91cmkgPT09IG51bGwgfHwgdGhpcy5fY3Vyc29yX3VyaSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvcl91cmkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBVdGlsLkluZm8oIkRhdGEgVVJJIHNjaGVtZSBjdXJzb3Igc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJzb3JfdXJpID09PSBudWxsIHx8IHRoaXMuX2N1cnNvcl91cmkgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3JfdXJpID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFV0aWwuV2FybigiRGF0YSBVUkkgc2NoZW1lIGN1cnNvciBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yID0gY3VyU2F2ZTsKKyAgICAgICAgfSBjYXRjaCAoZXhjKSB7CisgICAgICAgICAgICBVdGlsLkVycm9yKCJEYXRhIFVSSSBzY2hlbWUgY3Vyc29yIHRlc3QgZXhjZXB0aW9uOiAiICsgZXhjKTsKKyAgICAgICAgICAgIHRoaXMuX2N1cnNvcl91cmkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWwuRGVidWcoIjw8IERpc3BsYXkuY29uc3RydWN0b3IiKTsKKyAgICB9OworCisgICAgRGlzcGxheS5wcm90b3R5cGUgPSB7CisgICAgICAgIC8vIFB1YmxpYyBtZXRob2RzCisgICAgICAgIHZpZXdwb3J0Q2hhbmdlOiBmdW5jdGlvbiAoZGVsdGFYLCBkZWx0YVksIHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgICAgICAgIHZhciB2cCA9IHRoaXMuX3ZpZXdwb3J0TG9jOworICAgICAgICAgICAgdmFyIGNyID0gdGhpcy5fY2xlYW5SZWN0OworICAgICAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX3RhcmdldDsKKworICAgICAgICAgICAgaWYgKCF0aGlzLl92aWV3cG9ydCkgeworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIlNldHRpbmcgdmlld3BvcnQgdG8gZnVsbCBkaXNwbGF5IHJlZ2lvbiIpOworICAgICAgICAgICAgICAgIGRlbHRhWCA9IC12cC53OyAgLy8gY2xhbXBlZCBsYXRlciBvZiBvdXQgb2YgYm91bmRzCisgICAgICAgICAgICAgICAgZGVsdGFZID0gLXZwLmg7CisgICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9mYl93aWR0aDsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLl9mYl9oZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlb2YoZGVsdGFYKSA9PT0gInVuZGVmaW5lZCIpIHsgZGVsdGFYID0gMDsgfQorICAgICAgICAgICAgaWYgKHR5cGVvZihkZWx0YVkpID09PSAidW5kZWZpbmVkIikgeyBkZWx0YVkgPSAwOyB9CisgICAgICAgICAgICBpZiAodHlwZW9mKHdpZHRoKSA9PT0gInVuZGVmaW5lZCIpIHsgd2lkdGggPSB2cC53OyB9CisgICAgICAgICAgICBpZiAodHlwZW9mKGhlaWdodCkgPT09ICJ1bmRlZmluZWQiKSB7IGhlaWdodCA9IHZwLmg7IH0KKworICAgICAgICAgICAgLy8gU2l6ZSBjaGFuZ2UKKyAgICAgICAgICAgIGlmICh3aWR0aCA+IHRoaXMuX2ZiX3dpZHRoKSB7IHdpZHRoID0gdGhpcy5fZmJfd2lkdGg7IH0KKyAgICAgICAgICAgIGlmIChoZWlnaHQgPiB0aGlzLl9mYl9oZWlnaHQpIHsgaGVpZ2h0ID0gdGhpcy5fZmJfaGVpZ2h0OyB9CisKKyAgICAgICAgICAgIGlmICh2cC53ICE9PSB3aWR0aCB8fCB2cC5oICE9PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugd2lkdGgKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPCB2cC53ICYmICBjci54MiA+IHZwLnggKyB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY3IueDIgPSB2cC54ICsgd2lkdGggLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2cC53ID0gd2lkdGg7CisKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaGVpZ2h0CisgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8IHZwLmggJiYgIGNyLnkyID4gdnAueSArIGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY3IueTIgPSB2cC55ICsgaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdnAuaCA9IGhlaWdodDsKKworICAgICAgICAgICAgICAgIHZhciBzYXZlSW1nID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodnAudyA+IDAgJiYgdnAuaCA+IDAgJiYgY2FudmFzLndpZHRoID4gMCAmJiBjYW52YXMuaGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgaW1nX3dpZHRoID0gY2FudmFzLndpZHRoIDwgdnAudyA/IGNhbnZhcy53aWR0aCA6IHZwLnc7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbWdfaGVpZ2h0ID0gY2FudmFzLmhlaWdodCA8IHZwLmggPyBjYW52YXMuaGVpZ2h0IDogdnAuaDsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUltZyA9IHRoaXMuX2RyYXdDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGltZ193aWR0aCwgaW1nX2hlaWdodCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdnAudzsKKyAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdnAuaDsKKworICAgICAgICAgICAgICAgIGlmIChzYXZlSW1nKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKHNhdmVJbWcsIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZ4MiA9IHZwLnggKyB2cC53IC0gMTsKKyAgICAgICAgICAgIHZhciB2eTIgPSB2cC55ICsgdnAuaCAtIDE7CisKKyAgICAgICAgICAgIC8vIFBvc2l0aW9uIGNoYW5nZQorCisgICAgICAgICAgICBpZiAoZGVsdGFYIDwgMCAmJiB2cC54ICsgZGVsdGFYIDwgMCkgeworICAgICAgICAgICAgICAgIGRlbHRhWCA9IC12cC54OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZ4MiArIGRlbHRhWCA+PSB0aGlzLl9mYl93aWR0aCkgeworICAgICAgICAgICAgICAgIGRlbHRhWCAtPSB2eDIgKyBkZWx0YVggLSB0aGlzLl9mYl93aWR0aCArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2cC55ICsgZGVsdGFZIDwgMCkgeworICAgICAgICAgICAgICAgIGRlbHRhWSA9IC12cC55OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZ5MiArIGRlbHRhWSA+PSB0aGlzLl9mYl9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YVkgLT0gKHZ5MiArIGRlbHRhWSAtIHRoaXMuX2ZiX2hlaWdodCArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVsdGFYID09PSAwICYmIGRlbHRhWSA9PT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWwuRGVidWcoInZpZXdwb3J0Q2hhbmdlIGRlbHRhWDogIiArIGRlbHRhWCArICIsIGRlbHRhWTogIiArIGRlbHRhWSk7CisKKyAgICAgICAgICAgIHZwLnggKz0gZGVsdGFYOworICAgICAgICAgICAgdngyICs9IGRlbHRhWDsKKyAgICAgICAgICAgIHZwLnkgKz0gZGVsdGFZOworICAgICAgICAgICAgdnkyICs9IGRlbHRhWTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjbGVhbiByZWN0YW5nbGUKKyAgICAgICAgICAgIGlmICh2cC54ID4gY3IueDEpIHsKKyAgICAgICAgICAgICAgICBjci54MSA9IHZwLng7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodngyIDwgY3IueDIpIHsKKyAgICAgICAgICAgICAgICBjci54MiA9IHZ4MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2cC55ID4gY3IueTEpIHsKKyAgICAgICAgICAgICAgICBjci55MSA9IHZwLnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodnkyIDwgY3IueTIpIHsKKyAgICAgICAgICAgICAgICBjci55MiA9IHZ5MjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHgxLCB3OworICAgICAgICAgICAgaWYgKGRlbHRhWCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCBsZWZ0LCByZWRyYXcgbGVmdCBzZWN0aW9uCisgICAgICAgICAgICAgICAgeDEgPSAwOworICAgICAgICAgICAgICAgIHcgPSAtZGVsdGFYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCByaWdodCwgcmVkcmF3IHJpZ2h0IHNlY3Rpb24KKyAgICAgICAgICAgICAgICB4MSA9IHZwLncgLSBkZWx0YVg7CisgICAgICAgICAgICAgICAgdyA9IGRlbHRhWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHkxLCBoOworICAgICAgICAgICAgaWYgKGRlbHRhWSA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCB1cCwgcmVkcmF3IHRvcCBzZWN0aW9uCisgICAgICAgICAgICAgICAgeTEgPSAwOworICAgICAgICAgICAgICAgIGggPSAtZGVsdGFZOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCBkb3duLCByZWRyYXcgYm90dG9tIHNlY3Rpb24KKyAgICAgICAgICAgICAgICB5MSA9IHZwLmggLSBkZWx0YVk7CisgICAgICAgICAgICAgICAgaCA9IGRlbHRhWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSB0aGUgdmFsaWQgcGFydCBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHNoaWZ0ZWQgbG9jYXRpb24KKyAgICAgICAgICAgIHZhciBzYXZlU3R5bGUgPSB0aGlzLl9kcmF3Q3R4LmZpbGxTdHlsZTsKKyAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFN0eWxlID0gInJnYigyNTUsMjU1LDI1NSkiOworICAgICAgICAgICAgaWYgKGRlbHRhWCAhPT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZHJhd0ltYWdlKGNhbnZhcywgMCwgMCwgdnAudywgdnAuaCwgLWRlbHRhWCwgMCwgdnAudywgdnAuaCk7CisgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsUmVjdCh4MSwgMCwgdywgdnAuaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVsdGFZICE9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwLCB2cC53LCB2cC5oLCAwLCAtZGVsdGFZLCB2cC53LCB2cC5oKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmZpbGxSZWN0KDAsIHkxLCB2cC53LCBoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFN0eWxlID0gc2F2ZVN0eWxlOworICAgICAgICB9LAorCisgICAgICAgIC8vIFJldHVybiBhIG1hcCBvZiBjbGVhbiBhbmQgZGlydHkgYXJlYXMgb2YgdGhlIHZpZXdwb3J0IGFuZCByZXNldCB0aGUKKyAgICAgICAgLy8gdHJhY2tpbmcgb2YgY2xlYW4gYW5kIGRpcnR5IGFyZWFzCisgICAgICAgIC8vCisgICAgICAgIC8vIFJldHVybnM6IHsgJ2NsZWFuQm94JzogeyAneCc6IHgsICd5JzogeSwgJ3cnOiB3LCAnaCc6IGh9LAorICAgICAgICAvLyAgICAgICAgICAgICdkaXJ0eUJveGVzJzogW3sgJ3gnOiB4LCAneSc6IHksICd3JzogdywgJ2gnOiBoIH0sIC4uLl0gfQorICAgICAgICBnZXRDbGVhbkRpcnR5UmVzZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHZhciB2cCA9IHRoaXMuX3ZpZXdwb3J0TG9jOworICAgICAgICAgICAgdmFyIGNyID0gdGhpcy5fY2xlYW5SZWN0OworCisgICAgICAgICAgICB2YXIgY2xlYW5Cb3ggPSB7ICd4JzogY3IueDEsICd5JzogY3IueTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JzogY3IueDIgLSBjci54MSArIDEsICdoJzogY3IueTIgLSBjci55MSArIDEgfTsKKworICAgICAgICAgICAgdmFyIGRpcnR5Qm94ZXMgPSBbXTsKKyAgICAgICAgICAgIGlmIChjci54MSA+PSBjci54MiB8fCBjci55MSA+PSBjci55MikgeworICAgICAgICAgICAgICAgIC8vIFdob2xlIHZpZXdwb3J0IGlzIGRpcnR5CisgICAgICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsgJ3gnOiB2cC54LCAneSc6IHZwLnksICd3JzogdnAudywgJ2gnOiB2cC5oIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZWRyYXcgZGlydHkgcmVnaW9ucworICAgICAgICAgICAgICAgIHZhciB2eDIgPSB2cC54ICsgdnAudyAtIDE7CisgICAgICAgICAgICAgICAgdmFyIHZ5MiA9IHZwLnkgKyB2cC5oIC0gMTsKKworICAgICAgICAgICAgICAgIGlmICh2cC54IDwgY3IueDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVmdCBzaWRlIGRpcnR5IHJlZ2lvbgorICAgICAgICAgICAgICAgICAgICBkaXJ0eUJveGVzLnB1c2goeyd4JzogdnAueCwgJ3knOiB2cC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JzogY3IueDEgLSB2cC54ICsgMSwgJ2gnOiB2cC5ofSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2eDIgPiBjci54MikgeworICAgICAgICAgICAgICAgICAgICAvLyByaWdodCBzaWRlIGRpcnR5IHJlZ2lvbgorICAgICAgICAgICAgICAgICAgICBkaXJ0eUJveGVzLnB1c2goeyd4JzogY3IueDIgKyAxLCAneSc6IHZwLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnOiB2eDIgLSBjci54MiwgJ2gnOiB2cC5ofSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHZwLnkgPCBjci55MSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0b3AvbWlkZGxlIGRpcnR5IHJlZ2lvbgorICAgICAgICAgICAgICAgICAgICBkaXJ0eUJveGVzLnB1c2goeyd4JzogY3IueDEsICd5JzogdnAueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndyc6IGNyLngyIC0gY3IueDEgKyAxLCAnaCc6IGNyLnkxIC0gdnAueX0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodnkyID4gY3IueTIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tL21pZGRsZSBkaXJ0eSByZWdpb24KKyAgICAgICAgICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IGNyLngxLCAneSc6IGNyLnkyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndyc6IGNyLngyIC0gY3IueDEgKyAxLCAnaCc6IHZ5MiAtIGNyLnkyfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl9jbGVhblJlY3QgPSB7J3gxJzogdnAueCwgJ3kxJzogdnAueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneDInOiB2cC54ICsgdnAudyAtIDEsICd5Mic6IHZwLnkgKyB2cC5oIC0gMX07CisKKyAgICAgICAgICAgIHJldHVybiB7J2NsZWFuQm94JzogY2xlYW5Cb3gsICdkaXJ0eUJveGVzJzogZGlydHlCb3hlc307CisgICAgICAgIH0sCisKKyAgICAgICAgYWJzWDogZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgICAgIHJldHVybiB4ICsgdGhpcy5fdmlld3BvcnRMb2MueDsKKyAgICAgICAgfSwKKworICAgICAgICBhYnNZOiBmdW5jdGlvbiAoeSkgeworICAgICAgICAgICAgcmV0dXJuIHkgKyB0aGlzLl92aWV3cG9ydExvYy55OworICAgICAgICB9LAorCisgICAgICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgICAgICAgIHRoaXMuX3ByZXZEcmF3U3R5bGUgPSAiIjsKKworICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIHRoaXMuX2ZiX2hlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgdGhpcy5fcmVzY2FsZSh0aGlzLl9zY2FsZSk7CisKKyAgICAgICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UoKTsKKyAgICAgICAgfSwKKworICAgICAgICBjbGVhcjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ28pIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSh0aGlzLl9sb2dvLndpZHRoLCB0aGlzLl9sb2dvLmhlaWdodCk7CisgICAgICAgICAgICAgICAgdGhpcy5ibGl0U3RyaW5nSW1hZ2UodGhpcy5fbG9nby5kYXRhLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFV0aWwuRW5naW5lLnRyaWRlbnQgPT09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTkIoZGlyZWN0eG1hbjEyKTogdGhlcmUncyBhIGJ1ZyBpbiBJRTEwIHdoZXJlIHdlIGNhbiBmYWlsIHRvIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNsZWFyIHRoZSBjYW52YXMgaGVyZSBiZWNhdXNlIG9mIHRoZSByZXNpemUuCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIENsZWFyaW5nIHRoZSBjdXJyZW50IHZpZXdwb3J0IGZpcnN0IGZpeGVzIHRoZSBpc3N1ZQorICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl92aWV3cG9ydExvYy53LCB0aGlzLl92aWV3cG9ydExvYy5oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZXNpemUoNjQwLCAyMCk7CisgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fdmlld3BvcnRMb2MudywgdGhpcy5fdmlld3BvcnRMb2MuaCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX3JlbmRlclEgPSBbXTsKKyAgICAgICAgfSwKKworICAgICAgICBmaWxsUmVjdDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNvbG9yKSB7CisgICAgICAgICAgICB0aGlzLl9zZXRGaWxsQ29sb3IoY29sb3IpOworICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsUmVjdCh4IC0gdGhpcy5fdmlld3BvcnRMb2MueCwgeSAtIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9LAorCisgICAgICAgIGNvcHlJbWFnZTogZnVuY3Rpb24gKG9sZF94LCBvbGRfeSwgbmV3X3gsIG5ld195LCB3LCBoKSB7CisgICAgICAgICAgICB2YXIgeDEgPSBvbGRfeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLng7CisgICAgICAgICAgICB2YXIgeTEgPSBvbGRfeSAtIHRoaXMuX3ZpZXdwb3J0TG9jLnk7CisgICAgICAgICAgICB2YXIgeDIgPSBuZXdfeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLng7CisgICAgICAgICAgICB2YXIgeTIgPSBuZXdfeSAtIHRoaXMuX3ZpZXdwb3J0TG9jLnk7CisKKyAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZHJhd0ltYWdlKHRoaXMuX3RhcmdldCwgeDEsIHkxLCB3LCBoLCB4MiwgeTIsIHcsIGgpOworICAgICAgICB9LAorCisgICAgICAgIC8vIHN0YXJ0IHVwZGF0aW5nIGEgdGlsZQorICAgICAgICBzdGFydFRpbGU6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcikgeworICAgICAgICAgICAgdGhpcy5fdGlsZV94ID0geDsKKyAgICAgICAgICAgIHRoaXMuX3RpbGVfeSA9IHk7CisgICAgICAgICAgICBpZiAod2lkdGggPT09IDE2ICYmIGhlaWdodCA9PT0gMTYpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl90aWxlID0gdGhpcy5fdGlsZTE2eDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl90aWxlID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9wcmVmZXJfanMpIHsKKyAgICAgICAgICAgICAgICB2YXIgYmdyOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGJnciA9IGNvbG9yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByZWQgPSBiZ3JbMl07CisgICAgICAgICAgICAgICAgdmFyIGdyZWVuID0gYmdyWzFdOworICAgICAgICAgICAgICAgIHZhciBibHVlID0gYmdyWzBdOworCisgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl90aWxlLmRhdGE7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICBkYXRhW2ldID0gcmVkOworICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGdyZWVuOworICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJsdWU7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaSArIDNdID0gMjU1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5maWxsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gdXBkYXRlIHN1Yi1yZWN0YW5nbGUgb2YgdGhlIGN1cnJlbnQgdGlsZQorICAgICAgICBzdWJUaWxlOiBmdW5jdGlvbiAoeCwgeSwgdywgaCwgY29sb3IpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9wcmVmZXJfanMpIHsKKyAgICAgICAgICAgICAgICB2YXIgYmdyOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGJnciA9IGNvbG9yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciByZWQgPSBiZ3JbMl07CisgICAgICAgICAgICAgICAgdmFyIGdyZWVuID0gYmdyWzFdOworICAgICAgICAgICAgICAgIHZhciBibHVlID0gYmdyWzBdOworICAgICAgICAgICAgICAgIHZhciB4ZW5kID0geCArIHc7CisgICAgICAgICAgICAgICAgdmFyIHllbmQgPSB5ICsgaDsKKworICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fdGlsZS5kYXRhOworICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3RpbGUud2lkdGg7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IHk7IGogPCB5ZW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHg7IGkgPCB4ZW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gKGkgKyAoaiAqIHdpZHRoKSkgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtwXSA9IHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcCArIDFdID0gZ3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAyXSA9IGJsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAzXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5maWxsUmVjdCh0aGlzLl90aWxlX3ggKyB4LCB0aGlzLl90aWxlX3kgKyB5LCB3LCBoLCBjb2xvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB0aWxlIHRvIHRoZSBzY3JlZW4KKyAgICAgICAgZmluaXNoVGlsZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3ByZWZlcl9qcykgeworICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKHRoaXMuX3RpbGUsIHRoaXMuX3RpbGVfeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlsZV95IC0gdGhpcy5fdmlld3BvcnRMb2MueSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBlbHNlOiBOby1vcCAtLSBhbHJlYWR5IGRvbmUgYnkgc2V0U3ViVGlsZQorICAgICAgICB9LAorCisgICAgICAgIGJsaXRJbWFnZTogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAodGhpcy5fdHJ1ZV9jb2xvcikgeworICAgICAgICAgICAgICAgIHRoaXMuX2JncnhJbWFnZURhdGEoeCwgeSwgdGhpcy5fdmlld3BvcnRMb2MueCwgdGhpcy5fdmlld3BvcnRMb2MueSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jbWFwSW1hZ2VEYXRhKHgsIHksIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBibGl0UmdiSW1hZ2U6IGZ1bmN0aW9uICh4LCB5ICwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fcmdiSW1hZ2VEYXRhKHgsIHksIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgd3Jvbmc/CisgICAgICAgICAgICAgICAgdGhpcy5fY21hcEltYWdlRGF0YSh4LCB5LCB0aGlzLl92aWV3cG9ydExvYy54LCB0aGlzLl92aWV3cG9ydExvYy55LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgYmxpdFN0cmluZ0ltYWdlOiBmdW5jdGlvbiAoc3RyLCB4LCB5KSB7CisgICAgICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7CisgICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZHJhd0ltYWdlKGltZywgeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHkgLSB0aGlzLl92aWV3cG9ydExvYy55KTsKKyAgICAgICAgICAgIH0uYmluZCh0aGlzKTsKKyAgICAgICAgICAgIGltZy5zcmMgPSBzdHI7CisgICAgICAgICAgICByZXR1cm4gaW1nOyAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gd3JhcCBjdHguZHJhd0ltYWdlIGJ1dCByZWxhdGl2ZSB0byB2aWV3cG9ydAorICAgICAgICBkcmF3SW1hZ2U6IGZ1bmN0aW9uIChpbWcsIHgsIHkpIHsKKyAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZHJhd0ltYWdlKGltZywgeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHkgLSB0aGlzLl92aWV3cG9ydExvYy55KTsKKyAgICAgICAgfSwKKworICAgICAgICByZW5kZXJRX3B1c2g6IGZ1bmN0aW9uIChhY3Rpb24pIHsKKyAgICAgICAgICAgIHRoaXMuX3JlbmRlclEucHVzaChhY3Rpb24pOworICAgICAgICAgICAgaWYgKHRoaXMuX3JlbmRlclEubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjYW4gYmUgcmVuZGVyZWQgaW1tZWRpYXRlbHkgaXQgd2lsbCBiZSwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gdGhlIHNjYW5uZXIgd2lsbCBzdGFydCBwb2xsaW5nIHRoZSBxdWV1ZSAoZXZlcnkKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgdGhpcy5fc2Nhbl9yZW5kZXJRKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgY2hhbmdlQ3Vyc29yOiBmdW5jdGlvbiAocGl4ZWxzLCBtYXNrLCBob3R4LCBob3R5LCB3LCBoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yX3VyaSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBVdGlsLldhcm4oImNoYW5nZUN1cnNvciBjYWxsZWQgYnV0IG5vIGN1cnNvciBkYXRhIFVSSSBzdXBwb3J0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fdHJ1ZV9jb2xvcikgeworICAgICAgICAgICAgICAgIERpc3BsYXkuY2hhbmdlQ3Vyc29yKHRoaXMuX3RhcmdldCwgcGl4ZWxzLCBtYXNrLCBob3R4LCBob3R5LCB3LCBoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fdGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcsIGgsIHRoaXMuX2NvbG91ck1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgZGVmYXVsdEN1cnNvcjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdGhpcy5fdGFyZ2V0LnN0eWxlLmN1cnNvciA9ICJkZWZhdWx0IjsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBPdmVycmlkZGVuIGdldHRlcnMvc2V0dGVycworICAgICAgICBnZXRfY29udGV4dDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYXdDdHg7CisgICAgICAgIH0sCisKKyAgICAgICAgc2V0X3NjYWxlOiBmdW5jdGlvbiAoc2NhbGUpIHsKKyAgICAgICAgICAgIHRoaXMuX3Jlc2NhbGUoc2NhbGUpOworICAgICAgICB9LAorCisgICAgICAgIHNldF93aWR0aDogZnVuY3Rpb24gKHcpIHsKKyAgICAgICAgICAgIHRoaXMucmVzaXplKHcsIHRoaXMuX2ZiX2hlaWdodCk7CisgICAgICAgIH0sCisgICAgICAgIGdldF93aWR0aDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZiX3dpZHRoOworICAgICAgICB9LAorCisgICAgICAgIHNldF9oZWlnaHQ6IGZ1bmN0aW9uIChoKSB7CisgICAgICAgICAgICB0aGlzLnJlc2l6ZSh0aGlzLl9mYl93aWR0aCwgaCk7CisgICAgICAgIH0sCisgICAgICAgIGdldF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYl9oZWlnaHQ7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gUHJpdmF0ZSBNZXRob2RzCisgICAgICAgIF9yZXNjYWxlOiBmdW5jdGlvbiAoZmFjdG9yKSB7CisgICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5fdGFyZ2V0OworICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBbJ3RyYW5zZm9ybScsICdXZWJraXRUcmFuc2Zvcm0nLCAnTW96VHJhbnNmb3JtJ107CisgICAgICAgICAgICB2YXIgdHJhbnNmb3JtX3Byb3A7CisgICAgICAgICAgICB3aGlsZSAoKHRyYW5zZm9ybV9wcm9wID0gcHJvcGVydGllcy5zaGlmdCgpKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FudmFzLnN0eWxlW3RyYW5zZm9ybV9wcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtX3Byb3AgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCJObyBzY2FsaW5nIHN1cHBvcnQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlb2YoZmFjdG9yKSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSB0aGlzLl9zY2FsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFjdG9yID4gMS4wKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yID0gMS4wOworICAgICAgICAgICAgfSBlbHNlIGlmIChmYWN0b3IgPCAwLjEpIHsKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSAwLjE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9zY2FsZSA9PT0gZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl9zY2FsZSA9IGZhY3RvcjsKKyAgICAgICAgICAgIHZhciB4ID0gY2FudmFzLndpZHRoIC0gKGNhbnZhcy53aWR0aCAqIGZhY3Rvcik7CisgICAgICAgICAgICB2YXIgeSA9IGNhbnZhcy5oZWlnaHQgLSAoY2FudmFzLmhlaWdodCAqIGZhY3Rvcik7CisgICAgICAgICAgICBjYW52YXMuc3R5bGVbdHJhbnNmb3JtX3Byb3BdID0gJ3NjYWxlKCcgKyB0aGlzLl9zY2FsZSArICcpIHRyYW5zbGF0ZSgtJyArIHggKyAncHgsIC0nICsgeSArICdweCknOworICAgICAgICB9LAorCisgICAgICAgIF9zZXRGaWxsQ29sb3I6IGZ1bmN0aW9uIChjb2xvcikgeworICAgICAgICAgICAgdmFyIGJncjsKKyAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7CisgICAgICAgICAgICAgICAgYmdyID0gY29sb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBuZXdTdHlsZSA9ICdyZ2IoJyArIGJnclsyXSArICcsJyArIGJnclsxXSArICcsJyArIGJnclswXSArICcpJzsKKyAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPT0gdGhpcy5fcHJldkRyYXdTdHlsZSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFN0eWxlID0gbmV3U3R5bGU7CisgICAgICAgICAgICAgICAgdGhpcy5fcHJldkRyYXdTdHlsZSA9IG5ld1N0eWxlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIF9yZ2JJbWFnZURhdGE6IGZ1bmN0aW9uICh4LCB5LCB2eCwgdnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7CisgICAgICAgICAgICB2YXIgaW1nID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB2YXIgZGF0YSA9IGltZy5kYXRhOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBvZmZzZXQ7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCwgaiArPSAzKSB7CisgICAgICAgICAgICAgICAgZGF0YVtpXSAgICAgPSBhcnJbal07CisgICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdOworICAgICAgICAgICAgICAgIGRhdGFbaSArIDJdID0gYXJyW2ogKyAyXTsKKyAgICAgICAgICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsgIC8vIEFscGhhCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShpbWcsIHggLSB2eCwgeSAtIHZ5KTsKKyAgICAgICAgfSwKKworICAgICAgICBfYmdyeEltYWdlRGF0YTogZnVuY3Rpb24gKHgsIHksIHZ4LCB2eSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLl9kcmF3Q3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHZhciBkYXRhID0gaW1nLmRhdGE7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG9mZnNldDsgaSA8IHdpZHRoICogaGVpZ2h0ICogNDsgaSArPSA0LCBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBkYXRhW2ldICAgICA9IGFycltqICsgMl07CisgICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdOworICAgICAgICAgICAgICAgIGRhdGFbaSArIDJdID0gYXJyW2pdOworICAgICAgICAgICAgICAgIGRhdGFbaSArIDNdID0gMjU1OyAgLy8gQWxwaGEKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKGltZywgeCAtIHZ4LCB5IC0gdnkpOworICAgICAgICB9LAorCisgICAgICAgIF9jbWFwSW1hZ2VEYXRhOiBmdW5jdGlvbiAoeCwgeSwgdngsIHZ5LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCkgeworICAgICAgICAgICAgdmFyIGltZyA9IHRoaXMuX2RyYXdDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgdmFyIGRhdGEgPSBpbWcuZGF0YTsKKyAgICAgICAgICAgIHZhciBjbWFwID0gdGhpcy5fY29sb3VyTWFwOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBvZmZzZXQ7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCwgaisrKSB7CisgICAgICAgICAgICAgICAgdmFyIGJnciA9IGNtYXBbYXJyW2pdXTsKKyAgICAgICAgICAgICAgICBkYXRhW2ldICAgICA9IGJnclsyXTsKKyAgICAgICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGJnclsxXTsKKyAgICAgICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJnclswXTsKKyAgICAgICAgICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsgIC8vIEFscGhhCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShpbWcsIHggLSB2eCwgeSAtIHZ5KTsKKyAgICAgICAgfSwKKworICAgICAgICBfc2Nhbl9yZW5kZXJROiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgcmVhZHkgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKHJlYWR5ICYmIHRoaXMuX3JlbmRlclEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcmVuZGVyUVswXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGEudHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3B5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUltYWdlKGEub2xkX3gsIGEub2xkX3ksIGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmlsbCc6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxSZWN0KGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgYS5jb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxpdCc6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxpdFJnYic6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRSZ2JJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW1nJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmltZy5jb21wbGV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0ltYWdlKGEuaW1nLCBhLngsIGEueSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhpcyBpbWFnZSB0byAnbG9hZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBrZWVwIHRoaW5ncyBpbi1vcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyUS5zaGlmdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX3JlbmRlclEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltRnJhbWUodGhpcy5fc2Nhbl9yZW5kZXJRLmJpbmQodGhpcykpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07CisKKyAgICBVdGlsLm1ha2VfcHJvcGVydGllcyhEaXNwbGF5LCBbCisgICAgICAgIFsndGFyZ2V0JywgJ3dvJywgJ2RvbSddLCAgICAgICAvLyBDYW52YXMgZWxlbWVudCBmb3IgcmVuZGVyaW5nCisgICAgICAgIFsnY29udGV4dCcsICdybycsICdyYXcnXSwgICAgICAvLyBDYW52YXMgMkQgY29udGV4dCBmb3IgcmVuZGVyaW5nIChyZWFkLW9ubHkpCisgICAgICAgIFsnbG9nbycsICdydycsICdyYXcnXSwgICAgICAgICAvLyBMb2dvIHRvIGRpc3BsYXkgd2hlbiBjbGVhcmVkOiB7IndpZHRoIjogdywgImhlaWdodCI6IGgsICJkYXRhIjogZGF0YX0KKyAgICAgICAgWyd0cnVlX2NvbG9yJywgJ3J3JywgJ2Jvb2wnXSwgIC8vIFVzZSB0cnVlLWNvbG9yIHBpeGVsIGRhdGEKKyAgICAgICAgWydjb2xvdXJNYXAnLCAncncnLCAnYXJyJ10sICAgIC8vIENvbG91ciBtYXAgYXJyYXkgKHdoZW4gbm90IHRydWUtY29sb3IpCisgICAgICAgIFsnc2NhbGUnLCAncncnLCAnZmxvYXQnXSwgICAgICAvLyBEaXNwbGF5IGFyZWEgc2NhbGUgZmFjdG9yIDAuMCAtIDEuMAorICAgICAgICBbJ3ZpZXdwb3J0JywgJ3J3JywgJ2Jvb2wnXSwgICAgLy8gVXNlIGEgdmlld3BvcnQgc2V0IHdpdGggdmlld3BvcnRDaGFuZ2UoKQorICAgICAgICBbJ3dpZHRoJywgJ3J3JywgJ2ludCddLCAgICAgICAgLy8gRGlzcGxheSBhcmVhIHdpZHRoCisgICAgICAgIFsnaGVpZ2h0JywgJ3J3JywgJ2ludCddLCAgICAgICAvLyBEaXNwbGF5IGFyZWEgaGVpZ2h0CisKKyAgICAgICAgWydyZW5kZXJfbW9kZScsICdybycsICdzdHInXSwgIC8vIENhbnZhcyByZW5kZXJpbmcgbW9kZSAocmVhZC1vbmx5KQorCisgICAgICAgIFsncHJlZmVyX2pzJywgJ3J3JywgJ3N0ciddLCAgICAvLyBQcmVmZXIgSmF2YXNjcmlwdCBvdmVyIGNhbnZhcyBtZXRob2RzCisgICAgICAgIFsnY3Vyc29yX3VyaScsICdydycsICdyYXcnXSAgICAvLyBDYW4gd2UgcmVuZGVyIGN1cnNvciB1c2luZyBkYXRhIFVSSQogICAgIF0pOwogCi0vLyBPdmVycmlkZSBzb21lIHNwZWNpZmljIGdldHRlcnMvc2V0dGVycwotdGhhdC5nZXRfY29udGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNfY3R4OyB9OwotCi10aGF0LnNldF9zY2FsZSA9IGZ1bmN0aW9uKHNjYWxlKSB7IHJlc2NhbGUoc2NhbGUpOyB9OwotCi10aGF0LnNldF93aWR0aCA9IGZ1bmN0aW9uICh2YWwpIHsgdGhhdC5yZXNpemUodmFsLCBmYl9oZWlnaHQpOyB9OwotdGhhdC5nZXRfd2lkdGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIGZiX3dpZHRoOyB9OwotCi10aGF0LnNldF9oZWlnaHQgPSBmdW5jdGlvbiAodmFsKSB7IHRoYXQucmVzaXplKGZiX3dpZHRoLCB2YWwpOyB9OwotdGhhdC5nZXRfaGVpZ2h0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYl9oZWlnaHQ7IH07Ci0KLQotCi0vLwotLy8gUHJpdmF0ZSBmdW5jdGlvbnMKLS8vCi0KLS8vIENyZWF0ZSB0aGUgcHVibGljIEFQSSBpbnRlcmZhY2UKLWZ1bmN0aW9uIGNvbnN0cnVjdG9yKCkgewotICAgIFV0aWwuRGVidWcoIj4+IERpc3BsYXkuY29uc3RydWN0b3IiKTsKLQotICAgIHZhciBjLCBmdW5jLCBpLCBjdXJEYXQsIGN1clNhdmUsCi0gICAgICAgIGhhc19pbWFnZURhdGEgPSBmYWxzZSwgVUUgPSBVdGlsLkVuZ2luZTsKLQotICAgIGlmICghIGNvbmYudGFyZ2V0KSB7IHRocm93KCJ0YXJnZXQgbXVzdCBiZSBzZXQiKTsgfQotCi0gICAgaWYgKHR5cGVvZiBjb25mLnRhcmdldCA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgdGhyb3coInRhcmdldCBtdXN0IGJlIGEgRE9NIGVsZW1lbnQiKTsKLSAgICB9Ci0KLSAgICBjID0gY29uZi50YXJnZXQ7Ci0KLSAgICBpZiAoISBjLmdldENvbnRleHQpIHsgdGhyb3coIm5vIGdldENvbnRleHQgbWV0aG9kIik7IH0KLQotICAgIGlmICghIGNfY3R4KSB7IGNfY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpOyB9Ci0KLSAgICBVdGlsLkRlYnVnKCJVc2VyIEFnZW50OiAiICsgbmF2aWdhdG9yLnVzZXJBZ2VudCk7Ci0gICAgaWYgKFVFLmdlY2tvKSB7IFV0aWwuRGVidWcoIkJyb3dzZXI6IGdlY2tvICIgKyBVRS5nZWNrbyk7IH0KLSAgICBpZiAoVUUud2Via2l0KSB7IFV0aWwuRGVidWcoIkJyb3dzZXI6IHdlYmtpdCAiICsgVUUud2Via2l0KTsgfQotICAgIGlmIChVRS50cmlkZW50KSB7IFV0aWwuRGVidWcoIkJyb3dzZXI6IHRyaWRlbnQgIiArIFVFLnRyaWRlbnQpOyB9Ci0gICAgaWYgKFVFLnByZXN0bykgeyBVdGlsLkRlYnVnKCJCcm93c2VyOiBwcmVzdG8gIiArIFVFLnByZXN0byk7IH0KLQotICAgIHRoYXQuY2xlYXIoKTsKLQotICAgIC8vIENoZWNrIGNhbnZhcyBmZWF0dXJlcwotICAgIGlmICgnY3JlYXRlSW1hZ2VEYXRhJyBpbiBjX2N0eCkgewotICAgICAgICBjb25mLnJlbmRlcl9tb2RlID0gImNhbnZhcyByZW5kZXJpbmciOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93KCJDYW52YXMgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGVJbWFnZURhdGEiKTsKLSAgICB9Ci0gICAgaWYgKGNvbmYucHJlZmVyX2pzID09PSBudWxsKSB7Ci0gICAgICAgIFV0aWwuSW5mbygiUHJlZmVyaW5nIGphdmFzY3JpcHQgb3BlcmF0aW9ucyIpOwotICAgICAgICBjb25mLnByZWZlcl9qcyA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSBjYWNoZWQgdGlsZSBpbWFnZURhdGEKLSAgICB0aWxlMTZ4MTYgPSBjX2N0eC5jcmVhdGVJbWFnZURhdGEoMTYsIDE2KTsKLQotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lIGJyb3dzZXIgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgY3Vyc29yIHZpYSBkYXRhIFVSSQotICAgICAqIHNjaGVtZQotICAgICAqLwotICAgIGN1ckRhdCA9IFtdOwotICAgIGZvciAoaT0wOyBpIDwgOCAqIDggKiA0OyBpICs9IDEpIHsKLSAgICAgICAgY3VyRGF0LnB1c2goMjU1KTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgICAgY3VyU2F2ZSA9IGMuc3R5bGUuY3Vyc29yOwotICAgICAgICBjaGFuZ2VDdXJzb3IoY29uZi50YXJnZXQsIGN1ckRhdCwgY3VyRGF0LCAyLCAyLCA4LCA4KTsKLSAgICAgICAgaWYgKGMuc3R5bGUuY3Vyc29yKSB7Ci0gICAgICAgICAgICBpZiAoY29uZi5jdXJzb3JfdXJpID09PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZi5jdXJzb3JfdXJpID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFV0aWwuSW5mbygiRGF0YSBVUkkgc2NoZW1lIGN1cnNvciBzdXBwb3J0ZWQiKTsKKyAgICAvLyBDbGFzcyBNZXRob2RzCisgICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IgPSBmdW5jdGlvbiAodGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcwLCBoMCwgY21hcCkgeworICAgICAgICB2YXIgdyA9IHcwOworICAgICAgICB2YXIgaCA9IGgwOworICAgICAgICBpZiAoaCA8IHcpIHsKKyAgICAgICAgICAgIGggPSB3OyAgLy8gaW5jcmVhc2UgaCB0byBtYWtlIGl0IHNxdWFyZQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNvbmYuY3Vyc29yX3VyaSA9PT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbmYuY3Vyc29yX3VyaSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVXRpbC5XYXJuKCJEYXRhIFVSSSBzY2hlbWUgY3Vyc29yIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBjLnN0eWxlLmN1cnNvciA9IGN1clNhdmU7Ci0gICAgfSBjYXRjaCAoZXhjMikgeyAKLSAgICAgICAgVXRpbC5FcnJvcigiRGF0YSBVUkkgc2NoZW1lIGN1cnNvciB0ZXN0IGV4Y2VwdGlvbjogIiArIGV4YzIpOwotICAgICAgICBjb25mLmN1cnNvcl91cmkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBVdGlsLkRlYnVnKCI8PCBEaXNwbGF5LmNvbnN0cnVjdG9yIik7Ci0gICAgcmV0dXJuIHRoYXQgOwotfQotCi1yZXNjYWxlID0gZnVuY3Rpb24oZmFjdG9yKSB7Ci0gICAgdmFyIGMsIHRwLCB4LCB5LCAKLSAgICAgICAgcHJvcGVydGllcyA9IFsndHJhbnNmb3JtJywgJ1dlYmtpdFRyYW5zZm9ybScsICdNb3pUcmFuc2Zvcm0nLCBudWxsXTsKLSAgICBjID0gY29uZi50YXJnZXQ7Ci0gICAgdHAgPSBwcm9wZXJ0aWVzLnNoaWZ0KCk7Ci0gICAgd2hpbGUgKHRwKSB7Ci0gICAgICAgIGlmICh0eXBlb2YgYy5zdHlsZVt0cF0gIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0cCA9IHByb3BlcnRpZXMuc2hpZnQoKTsKLSAgICB9Ci0KLSAgICBpZiAodHAgPT09IG51bGwpIHsKLSAgICAgICAgVXRpbC5EZWJ1ZygiTm8gc2NhbGluZyBzdXBwb3J0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIGlmICh0eXBlb2YoZmFjdG9yKSA9PT0gInVuZGVmaW5lZCIpIHsKLSAgICAgICAgZmFjdG9yID0gY29uZi5zY2FsZTsKLSAgICB9IGVsc2UgaWYgKGZhY3RvciA+IDEuMCkgewotICAgICAgICBmYWN0b3IgPSAxLjA7Ci0gICAgfSBlbHNlIGlmIChmYWN0b3IgPCAwLjEpIHsKLSAgICAgICAgZmFjdG9yID0gMC4xOwotICAgIH0KLQotICAgIGlmIChjb25mLnNjYWxlID09PSBmYWN0b3IpIHsKLSAgICAgICAgLy9VdGlsLkRlYnVnKCJEaXNwbGF5IGFscmVhZHkgc2NhbGVkIHRvICciICsgZmFjdG9yICsgIiciKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbmYuc2NhbGUgPSBmYWN0b3I7Ci0gICAgeCA9IGMud2lkdGggLSBjLndpZHRoICogZmFjdG9yOwotICAgIHkgPSBjLmhlaWdodCAtIGMuaGVpZ2h0ICogZmFjdG9yOwotICAgIGMuc3R5bGVbdHBdID0gInNjYWxlKCIgKyBjb25mLnNjYWxlICsgIikgdHJhbnNsYXRlKC0iICsgeCArICJweCwgLSIgKyB5ICsgInB4KSI7Ci19OwotCi1zZXRGaWxsQ29sb3IgPSBmdW5jdGlvbihjb2xvcikgewotICAgIHZhciBiZ3IsIG5ld1N0eWxlOwotICAgIGlmIChjb25mLnRydWVfY29sb3IpIHsKLSAgICAgICAgYmdyID0gY29sb3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYmdyID0gY29uZi5jb2xvdXJNYXBbY29sb3JbMF1dOwotICAgIH0KLSAgICBuZXdTdHlsZSA9ICJyZ2IoIiArIGJnclsyXSArICIsIiArIGJnclsxXSArICIsIiArIGJnclswXSArICIpIjsKLSAgICBpZiAobmV3U3R5bGUgIT09IGNfcHJldlN0eWxlKSB7Ci0gICAgICAgIGNfY3R4LmZpbGxTdHlsZSA9IG5ld1N0eWxlOwotICAgICAgICBjX3ByZXZTdHlsZSA9IG5ld1N0eWxlOwotICAgIH0KLX07Ci0KLQotLy8KLS8vIFB1YmxpYyBBUEkgaW50ZXJmYWNlIGZ1bmN0aW9ucwotLy8KLQotLy8gU2hpZnQgYW5kL29yIHJlc2l6ZSB0aGUgdmlzaWJsZSB2aWV3cG9ydAotdGhhdC52aWV3cG9ydENoYW5nZSA9IGZ1bmN0aW9uKGRlbHRhWCwgZGVsdGFZLCB3aWR0aCwgaGVpZ2h0KSB7Ci0gICAgdmFyIGMgPSBjb25mLnRhcmdldCwgdiA9IHZpZXdwb3J0LCBjciA9IGNsZWFuUmVjdCwKLSAgICAgICAgc2F2ZUltZyA9IG51bGwsIHNhdmVTdHlsZSwgeDEsIHkxLCB2eDIsIHZ5MiwgdywgaDsKLQotICAgIGlmICghY29uZi52aWV3cG9ydCkgewotICAgICAgICBVdGlsLkRlYnVnKCJTZXR0aW5nIHZpZXdwb3J0IHRvIGZ1bGwgZGlzcGxheSByZWdpb24iKTsKLSAgICAgICAgZGVsdGFYID0gLXYudzsgLy8gQ2xhbXBlZCBsYXRlciBpZiBvdXQgb2YgYm91bmRzCi0gICAgICAgIGRlbHRhWSA9IC12Lmg7IC8vIENsYW1wZWQgbGF0ZXIgaWYgb3V0IG9mIGJvdW5kcwotICAgICAgICB3aWR0aCA9IGZiX3dpZHRoOwotICAgICAgICBoZWlnaHQgPSBmYl9oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVvZihkZWx0YVgpID09PSAidW5kZWZpbmVkIikgeyBkZWx0YVggPSAwOyB9Ci0gICAgaWYgKHR5cGVvZihkZWx0YVkpID09PSAidW5kZWZpbmVkIikgeyBkZWx0YVkgPSAwOyB9Ci0gICAgaWYgKHR5cGVvZih3aWR0aCkgPT09ICJ1bmRlZmluZWQiKSB7IHdpZHRoID0gdi53OyB9Ci0gICAgaWYgKHR5cGVvZihoZWlnaHQpID09PSAidW5kZWZpbmVkIikgeyBoZWlnaHQgPSB2Lmg7IH0KLQotICAgIC8vIFNpemUgY2hhbmdlCi0KLSAgICBpZiAod2lkdGggPiBmYl93aWR0aCkgeyB3aWR0aCA9IGZiX3dpZHRoOyB9Ci0gICAgaWYgKGhlaWdodCA+IGZiX2hlaWdodCkgeyBoZWlnaHQgPSBmYl9oZWlnaHQ7IH0KLQotICAgIGlmICgodi53ICE9PSB3aWR0aCkgfHwgKHYuaCAhPT0gaGVpZ2h0KSkgewotICAgICAgICAvLyBDaGFuZ2Ugd2lkdGgKLSAgICAgICAgaWYgKCh3aWR0aCA8IHYudykgJiYgKGNyLngyID4gdi54ICsgd2lkdGggLTEpKSB7Ci0gICAgICAgICAgICBjci54MiA9IHYueCArIHdpZHRoIC0gMTsKLSAgICAgICAgfQotICAgICAgICB2LncgPSB3aWR0aDsKLQotICAgICAgICAvLyBDaGFuZ2UgaGVpZ2h0Ci0gICAgICAgIGlmICgoaGVpZ2h0IDwgdi5oKSAmJiAoY3IueTIgPiB2LnkgKyBoZWlnaHQgLTEpKSB7Ci0gICAgICAgICAgICBjci55MiA9IHYueSArIGhlaWdodCAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgdi5oID0gaGVpZ2h0OwotCi0KLSAgICAgICAgaWYgKHYudyA+IDAgJiYgdi5oID4gMCAmJiBjLndpZHRoID4gMCAmJiBjLmhlaWdodCA+IDApIHsKLSAgICAgICAgICAgIHNhdmVJbWcgPSBjX2N0eC5nZXRJbWFnZURhdGEoMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgKGMud2lkdGggPCB2LncpID8gYy53aWR0aCA6IHYudywKLSAgICAgICAgICAgICAgICAgICAgKGMuaGVpZ2h0IDwgdi5oKSA/IGMuaGVpZ2h0IDogdi5oKTsKKyAgICAgICAgICAgIHcgPSBoOyAgLy8gaW5jcmVhc2UgdyB0byBtYWtlIGl0IHNxdWFyZQogICAgICAgICB9CiAKLSAgICAgICAgYy53aWR0aCA9IHYudzsKLSAgICAgICAgYy5oZWlnaHQgPSB2Lmg7CisgICAgICAgIHZhciBjdXIgPSBbXTsKIAotICAgICAgICBpZiAoc2F2ZUltZykgewotICAgICAgICAgICAgY19jdHgucHV0SW1hZ2VEYXRhKHNhdmVJbWcsIDAsIDApOwotICAgICAgICB9Ci0gICAgfQorICAgICAgICAvLyBQdXNoIG11bHRpLWJ5dGUgbGl0dGxlLWVuZGlhbiB2YWx1ZXMKKyAgICAgICAgY3VyLnB1c2gxNmxlID0gZnVuY3Rpb24gKG51bSkgeworICAgICAgICAgICAgdGhpcy5wdXNoKG51bSAmIDB4RkYsIChudW0gPj4gOCkgJiAweEZGKTsKKyAgICAgICAgfTsKKyAgICAgICAgY3VyLnB1c2gzMmxlID0gZnVuY3Rpb24gKG51bSkgeworICAgICAgICAgICAgdGhpcy5wdXNoKG51bSAmIDB4RkYsCisgICAgICAgICAgICAgICAgICAgICAgKG51bSA+PiA4KSAmIDB4RkYsCisgICAgICAgICAgICAgICAgICAgICAgKG51bSA+PiAxNikgJiAweEZGLAorICAgICAgICAgICAgICAgICAgICAgIChudW0gPj4gMjQpICYgMHhGRik7CisgICAgICAgIH07CiAKLSAgICB2eDIgPSB2LnggKyB2LncgLSAxOwotICAgIHZ5MiA9IHYueSArIHYuaCAtIDE7CisgICAgICAgIHZhciBJSERSc3ogPSA0MDsKKyAgICAgICAgdmFyIFJHQnN6ID0gdyAqIGggKiA0OworICAgICAgICB2YXIgWE9Sc3ogPSBNYXRoLmNlaWwoKHcgKiBoKSAvIDguMCk7CisgICAgICAgIHZhciBBTkRzeiA9IE1hdGguY2VpbCgodyAqIGgpIC8gOC4wKTsKIAorICAgICAgICBjdXIucHVzaDE2bGUoMCk7ICAgICAgICAvLyAwOiBSZXNlcnZlZAorICAgICAgICBjdXIucHVzaDE2bGUoMik7ICAgICAgICAvLyAyOiAuQ1VSIHR5cGUKKyAgICAgICAgY3VyLnB1c2gxNmxlKDEpOyAgICAgICAgLy8gNDogTnVtYmVyIG9mIGltYWdlcywgMSBmb3Igbm9uLWFuaW1hdGVkIGljbwogCi0gICAgLy8gUG9zaXRpb24gY2hhbmdlCisgICAgICAgIC8vIEN1cnNvciAjMSBoZWFkZXIgKElDT05ESVJFTlRSWSkKKyAgICAgICAgY3VyLnB1c2godyk7ICAgICAgICAgICAgLy8gNjogd2lkdGgKKyAgICAgICAgY3VyLnB1c2goaCk7ICAgICAgICAgICAgLy8gNzogaGVpZ2h0CisgICAgICAgIGN1ci5wdXNoKDApOyAgICAgICAgICAgIC8vIDg6IGNvbG9ycywgMCAtPiB0cnVlLWNvbG9yCisgICAgICAgIGN1ci5wdXNoKDApOyAgICAgICAgICAgIC8vIDk6IHJlc2VydmVkCisgICAgICAgIGN1ci5wdXNoMTZsZShob3R4KTsgICAgIC8vIDEwOiBob3RzcG90IHggY29vcmRpbmF0ZQorICAgICAgICBjdXIucHVzaDE2bGUoaG90eSk7ICAgICAvLyAxMjogaG90c3BvdCB5IGNvb3JkaW5hdGUKKyAgICAgICAgY3VyLnB1c2gzMmxlKElIRFJzeiArIFJHQnN6ICsgWE9Sc3ogKyBBTkRzeik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE0OiBjdXJzb3IgZGF0YSBieXRlIHNpemUKKyAgICAgICAgY3VyLnB1c2gzMmxlKDIyKTsgICAgICAgLy8gMTg6IG9mZnNldCBvZiBjdXJzb3IgZGF0YSBpbiB0aGUgZmlsZQogCi0gICAgaWYgKChkZWx0YVggPCAwKSAmJiAoKHYueCArIGRlbHRhWCkgPCAwKSkgewotICAgICAgICBkZWx0YVggPSAtIHYueDsKLSAgICB9Ci0gICAgaWYgKCh2eDIgKyBkZWx0YVgpID49IGZiX3dpZHRoKSB7Ci0gICAgICAgIGRlbHRhWCAtPSAoKHZ4MiArIGRlbHRhWCkgLSBmYl93aWR0aCArIDEpOwotICAgIH0KKyAgICAgICAgLy8gQ3Vyc29yICMxIEluZm9IZWFkZXIgKElDT05JTUFHRS9CSVRNQVBJTkZPKQorICAgICAgICBjdXIucHVzaDMybGUoSUhEUnN6KTsgICAvLyAyMjogSW5mb0hlYWRlciBzaXplCisgICAgICAgIGN1ci5wdXNoMzJsZSh3KTsgICAgICAgIC8vIDI2OiBDdXJzb3Igd2lkdGgKKyAgICAgICAgY3VyLnB1c2gzMmxlKGggKiAyKTsgICAgLy8gMzA6IFhPUitBTkQgaGVpZ2h0CisgICAgICAgIGN1ci5wdXNoMTZsZSgxKTsgICAgICAgIC8vIDM0OiBudW1iZXIgb2YgcGxhbmVzCisgICAgICAgIGN1ci5wdXNoMTZsZSgzMik7ICAgICAgIC8vIDM2OiBiaXRzIHBlciBwaXhlbAorICAgICAgICBjdXIucHVzaDMybGUoMCk7ICAgICAgICAvLyAzODogVHlwZSBvZiBjb21wcmVzc2lvbgogCi0gICAgaWYgKCh2LnkgKyBkZWx0YVkpIDwgMCkgewotICAgICAgICBkZWx0YVkgPSAtIHYueTsKLSAgICB9Ci0gICAgaWYgKCh2eTIgKyBkZWx0YVkpID49IGZiX2hlaWdodCkgewotICAgICAgICBkZWx0YVkgLT0gKCh2eTIgKyBkZWx0YVkpIC0gZmJfaGVpZ2h0ICsgMSk7Ci0gICAgfQorICAgICAgICBjdXIucHVzaDMybGUoWE9Sc3ogKyBBTkRzeik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQyOiBTaXplIG9mIEltYWdlCisgICAgICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAgIC8vIDQ2OiByZXNlcnZlZAorICAgICAgICBjdXIucHVzaDMybGUoMCk7ICAgICAgICAvLyA1MDogcmVzZXJ2ZWQKKyAgICAgICAgY3VyLnB1c2gzMmxlKDApOyAgICAgICAgLy8gNTQ6IHJlc2VydmVkCisgICAgICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAgIC8vIDU4OiByZXNlcnZlZAogCi0gICAgaWYgKChkZWx0YVggPT09IDApICYmIChkZWx0YVkgPT09IDApKSB7Ci0gICAgICAgIC8vVXRpbC5EZWJ1Zygic2tpcHBpbmcgdmlld3BvcnQgY2hhbmdlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVXRpbC5EZWJ1Zygidmlld3BvcnRDaGFuZ2UgZGVsdGFYOiAiICsgZGVsdGFYICsgIiwgZGVsdGFZOiAiICsgZGVsdGFZKTsKLQotICAgIHYueCArPSBkZWx0YVg7Ci0gICAgdngyICs9IGRlbHRhWDsKLSAgICB2LnkgKz0gZGVsdGFZOwotICAgIHZ5MiArPSBkZWx0YVk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGNsZWFuIHJlY3RhbmdsZQotICAgIGlmICh2LnggPiBjci54MSkgewotICAgICAgICBjci54MSA9IHYueDsKLSAgICB9Ci0gICAgaWYgKHZ4MiA8IGNyLngyKSB7Ci0gICAgICAgIGNyLngyID0gdngyOwotICAgIH0KLSAgICBpZiAodi55ID4gY3IueTEpIHsKLSAgICAgICAgY3IueTEgPSB2Lnk7Ci0gICAgfQotICAgIGlmICh2eTIgPCBjci55MikgewotICAgICAgICBjci55MiA9IHZ5MjsKLSAgICB9Ci0KLSAgICBpZiAoZGVsdGFYIDwgMCkgewotICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCBsZWZ0LCByZWRyYXcgbGVmdCBzZWN0aW9uCi0gICAgICAgIHgxID0gMDsKLSAgICAgICAgdyA9IC0gZGVsdGFYOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNoaWZ0IHZpZXdwb3J0IHJpZ2h0LCByZWRyYXcgcmlnaHQgc2VjdGlvbgotICAgICAgICB4MSA9IHYudyAtIGRlbHRhWDsKLSAgICAgICAgdyA9IGRlbHRhWDsKLSAgICB9Ci0gICAgaWYgKGRlbHRhWSA8IDApIHsKLSAgICAgICAgLy8gU2hpZnQgdmlld3BvcnQgdXAsIHJlZHJhdyB0b3Agc2VjdGlvbgotICAgICAgICB5MSA9IDA7Ci0gICAgICAgIGggPSAtIGRlbHRhWTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBTaGlmdCB2aWV3cG9ydCBkb3duLCByZWRyYXcgYm90dG9tIHNlY3Rpb24KLSAgICAgICAgeTEgPSB2LmggLSBkZWx0YVk7Ci0gICAgICAgIGggPSBkZWx0YVk7Ci0gICAgfQotCi0gICAgLy8gQ29weSB0aGUgdmFsaWQgcGFydCBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHNoaWZ0ZWQgbG9jYXRpb24KLSAgICBzYXZlU3R5bGUgPSBjX2N0eC5maWxsU3R5bGU7Ci0gICAgY19jdHguZmlsbFN0eWxlID0gInJnYigyNTUsMjU1LDI1NSkiOwotICAgIGlmIChkZWx0YVggIT09IDApIHsKLSAgICAgICAgLy90aGF0LmNvcHlJbWFnZSgwLCAwLCAtZGVsdGFYLCAwLCB2LncsIHYuaCk7Ci0gICAgICAgIC8vdGhhdC5maWxsUmVjdCh4MSwgMCwgdywgdi5oLCBbMjU1LDI1NSwyNTVdKTsKLSAgICAgICAgY19jdHguZHJhd0ltYWdlKGMsIDAsIDAsIHYudywgdi5oLCAtZGVsdGFYLCAwLCB2LncsIHYuaCk7Ci0gICAgICAgIGNfY3R4LmZpbGxSZWN0KHgxLCAwLCB3LCB2LmgpOwotICAgIH0KLSAgICBpZiAoZGVsdGFZICE9PSAwKSB7Ci0gICAgICAgIC8vdGhhdC5jb3B5SW1hZ2UoMCwgMCwgMCwgLWRlbHRhWSwgdi53LCB2LmgpOwotICAgICAgICAvL3RoYXQuZmlsbFJlY3QoMCwgeTEsIHYudywgaCwgWzI1NSwyNTUsMjU1XSk7Ci0gICAgICAgIGNfY3R4LmRyYXdJbWFnZShjLCAwLCAwLCB2LncsIHYuaCwgMCwgLWRlbHRhWSwgdi53LCB2LmgpOwotICAgICAgICBjX2N0eC5maWxsUmVjdCgwLCB5MSwgdi53LCBoKTsKLSAgICB9Ci0gICAgY19jdHguZmlsbFN0eWxlID0gc2F2ZVN0eWxlOwotfTsKLQotCi0vLyBSZXR1cm4gYSBtYXAgb2YgY2xlYW4gYW5kIGRpcnR5IGFyZWFzIG9mIHRoZSB2aWV3cG9ydCBhbmQgcmVzZXQgdGhlCi0vLyB0cmFja2luZyBvZiBjbGVhbiBhbmQgZGlydHkgYXJlYXMuCi0vLwotLy8gUmV0dXJuczogeydjbGVhbkJveCc6ICAgeyd4JzogeCwgJ3knOiB5LCAndyc6IHcsICdoJzogaH0sCi0vLyAgICAgICAgICAgJ2RpcnR5Qm94ZXMnOiBbeyd4JzogeCwgJ3knOiB5LCAndyc6IHcsICdoJzogaH0sIC4uLl19Ci10aGF0LmdldENsZWFuRGlydHlSZXNldCA9IGZ1bmN0aW9uKCkgewotICAgIHZhciB2ID0gdmlld3BvcnQsIGMgPSBjbGVhblJlY3QsIGNsZWFuQm94LCBkaXJ0eUJveGVzID0gW10sCi0gICAgICAgIHZ4MiA9IHYueCArIHYudyAtIDEsIHZ5MiA9IHYueSArIHYuaCAtIDE7Ci0KLQotICAgIC8vIENvcHkgdGhlIGNsZWFuUmVjdAotICAgIGNsZWFuQm94ID0geyd4JzogYy54MSwgJ3knOiBjLnkxLAotICAgICAgICAgICAgICAgICd3JzogYy54MiAtIGMueDEgKyAxLCAnaCc6IGMueTIgLSBjLnkxICsgMX07Ci0KLSAgICBpZiAoKGMueDEgPj0gYy54MikgfHwgKGMueTEgPj0gYy55MikpIHsKLSAgICAgICAgLy8gV2hvbGUgdmlld3BvcnQgaXMgZGlydHkKLSAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IHYueCwgJ3knOiB2LnksICd3Jzogdi53LCAnaCc6IHYuaH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlZHJhdyBkaXJ0eSByZWdpb25zCi0gICAgICAgIGlmICh2LnggPCBjLngxKSB7Ci0gICAgICAgICAgICAvLyBsZWZ0IHNpZGUgZGlydHkgcmVnaW9uCi0gICAgICAgICAgICBkaXJ0eUJveGVzLnB1c2goeyd4Jzogdi54LCAneSc6IHYueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnOiBjLngxIC0gdi54ICsgMSwgJ2gnOiB2Lmh9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodngyID4gYy54MikgewotICAgICAgICAgICAgLy8gcmlnaHQgc2lkZSBkaXJ0eSByZWdpb24KLSAgICAgICAgICAgIGRpcnR5Qm94ZXMucHVzaCh7J3gnOiBjLngyICsgMSwgJ3knOiB2LnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JzogdngyIC0gYy54MiwgJ2gnOiB2Lmh9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodi55IDwgYy55MSkgewotICAgICAgICAgICAgLy8gdG9wL21pZGRsZSBkaXJ0eSByZWdpb24KLSAgICAgICAgICAgIGRpcnR5Qm94ZXMucHVzaCh7J3gnOiBjLngxLCAneSc6IHYueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnOiBjLngyIC0gYy54MSArIDEsICdoJzogYy55MSAtIHYueX0pOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2eTIgPiBjLnkyKSB7Ci0gICAgICAgICAgICAvLyBib3R0b20vbWlkZGxlIGRpcnR5IHJlZ2lvbgotICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IGMueDEsICd5JzogYy55MiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JzogYy54MiAtIGMueDEgKyAxLCAnaCc6IHZ5MiAtIGMueTJ9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSBjbGVhblJlY3QgdG8gdGhlIHdob2xlIHZpZXdwb3J0Ci0gICAgY2xlYW5SZWN0ID0geyd4MSc6IHYueCwgJ3kxJzogdi55LAotICAgICAgICAgICAgICAgICAneDInOiB2LnggKyB2LncgLSAxLCAneTInOiB2LnkgKyB2LmggLSAxfTsKLQotICAgIHJldHVybiB7J2NsZWFuQm94JzogY2xlYW5Cb3gsICdkaXJ0eUJveGVzJzogZGlydHlCb3hlc307Ci19OwotCi0vLyBUcmFuc2xhdGUgdmlld3BvcnQgY29vcmRpbmF0ZXMgdG8gYWJzb2x1dGUgY29vcmRpbmF0ZXMKLXRoYXQuYWJzWCA9IGZ1bmN0aW9uKHgpIHsKLSAgICByZXR1cm4geCArIHZpZXdwb3J0Lng7Ci19OwotdGhhdC5hYnNZID0gZnVuY3Rpb24oeSkgewotICAgIHJldHVybiB5ICsgdmlld3BvcnQueTsKLX07Ci0KLQotdGhhdC5yZXNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7Ci0gICAgY19wcmV2U3R5bGUgICAgPSAiIjsKLQotICAgIGZiX3dpZHRoID0gd2lkdGg7Ci0gICAgZmJfaGVpZ2h0ID0gaGVpZ2h0OwotCi0gICAgcmVzY2FsZShjb25mLnNjYWxlKTsKLSAgICB0aGF0LnZpZXdwb3J0Q2hhbmdlKCk7Ci19OwotCi10aGF0LmNsZWFyID0gZnVuY3Rpb24oKSB7Ci0KLSAgICBpZiAoY29uZi5sb2dvKSB7Ci0gICAgICAgIHRoYXQucmVzaXplKGNvbmYubG9nby53aWR0aCwgY29uZi5sb2dvLmhlaWdodCk7Ci0gICAgICAgIHRoYXQuYmxpdFN0cmluZ0ltYWdlKGNvbmYubG9nby5kYXRhLCAwLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0aGF0LnJlc2l6ZSg2NDAsIDIwKTsKLSAgICAgICAgY19jdHguY2xlYXJSZWN0KDAsIDAsIHZpZXdwb3J0LncsIHZpZXdwb3J0LmgpOwotICAgIH0KLQotICAgIC8vIE5vIGJlbmVmaXQgb3ZlciBkZWZhdWx0ICgic291cmNlLW92ZXIiKSBpbiBDaHJvbWUgYW5kIGZpcmVmb3gKLSAgICAvL2NfY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJjb3B5IjsKLX07Ci0KLXRoYXQuZmlsbFJlY3QgPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcikgewotICAgIHNldEZpbGxDb2xvcihjb2xvcik7Ci0gICAgY19jdHguZmlsbFJlY3QoeCAtIHZpZXdwb3J0LngsIHkgLSB2aWV3cG9ydC55LCB3aWR0aCwgaGVpZ2h0KTsKLX07Ci0KLXRoYXQuY29weUltYWdlID0gZnVuY3Rpb24ob2xkX3gsIG9sZF95LCBuZXdfeCwgbmV3X3ksIHcsIGgpIHsKLSAgICB2YXIgeDEgPSBvbGRfeCAtIHZpZXdwb3J0LngsIHkxID0gb2xkX3kgLSB2aWV3cG9ydC55LAotICAgICAgICB4MiA9IG5ld194IC0gdmlld3BvcnQueCwgeTIgPSBuZXdfeSAgLSB2aWV3cG9ydC55OwotICAgIGNfY3R4LmRyYXdJbWFnZShjb25mLnRhcmdldCwgeDEsIHkxLCB3LCBoLCB4MiwgeTIsIHcsIGgpOwotfTsKLQotCi0vLyBTdGFydCB1cGRhdGluZyBhIHRpbGUKLXRoYXQuc3RhcnRUaWxlID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHsKLSAgICB2YXIgZGF0YSwgYmdyLCByZWQsIGdyZWVuLCBibHVlLCBpOwotICAgIHRpbGVfeCA9IHg7Ci0gICAgdGlsZV95ID0geTsKLSAgICBpZiAoKHdpZHRoID09PSAxNikgJiYgKGhlaWdodCA9PT0gMTYpKSB7Ci0gICAgICAgIHRpbGUgPSB0aWxlMTZ4MTY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGlsZSA9IGNfY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgZGF0YSA9IHRpbGUuZGF0YTsKLSAgICBpZiAoY29uZi5wcmVmZXJfanMpIHsKLSAgICAgICAgaWYgKGNvbmYudHJ1ZV9jb2xvcikgewotICAgICAgICAgICAgYmdyID0gY29sb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiZ3IgPSBjb25mLmNvbG91ck1hcFtjb2xvclswXV07Ci0gICAgICAgIH0KLSAgICAgICAgcmVkID0gYmdyWzJdOwotICAgICAgICBncmVlbiA9IGJnclsxXTsKLSAgICAgICAgYmx1ZSA9IGJnclswXTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCAqIGhlaWdodCAqIDQpOyBpKz00KSB7Ci0gICAgICAgICAgICBkYXRhW2kgICAgXSA9IHJlZDsKLSAgICAgICAgICAgIGRhdGFbaSArIDFdID0gZ3JlZW47Ci0gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJsdWU7Ci0gICAgICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoYXQuZmlsbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IpOwotICAgIH0KLX07Ci0KLS8vIFVwZGF0ZSBzdWItcmVjdGFuZ2xlIG9mIHRoZSBjdXJyZW50IHRpbGUKLXRoYXQuc3ViVGlsZSA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIGNvbG9yKSB7Ci0gICAgdmFyIGRhdGEsIHAsIGJnciwgcmVkLCBncmVlbiwgYmx1ZSwgd2lkdGgsIGosIGksIHhlbmQsIHllbmQ7Ci0gICAgaWYgKGNvbmYucHJlZmVyX2pzKSB7Ci0gICAgICAgIGRhdGEgPSB0aWxlLmRhdGE7Ci0gICAgICAgIHdpZHRoID0gdGlsZS53aWR0aDsKLSAgICAgICAgaWYgKGNvbmYudHJ1ZV9jb2xvcikgewotICAgICAgICAgICAgYmdyID0gY29sb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiZ3IgPSBjb25mLmNvbG91ck1hcFtjb2xvclswXV07Ci0gICAgICAgIH0KLSAgICAgICAgcmVkID0gYmdyWzJdOwotICAgICAgICBncmVlbiA9IGJnclsxXTsKLSAgICAgICAgYmx1ZSA9IGJnclswXTsKLSAgICAgICAgeGVuZCA9IHggKyB3OwotICAgICAgICB5ZW5kID0geSArIGg7Ci0gICAgICAgIGZvciAoaiA9IHk7IGogPCB5ZW5kOyBqICs9IDEpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHg7IGkgPCB4ZW5kOyBpICs9IDEpIHsKLSAgICAgICAgICAgICAgICBwID0gKGkgKyAoaiAqIHdpZHRoKSApICogNDsKLSAgICAgICAgICAgICAgICBkYXRhW3AgICAgXSA9IHJlZDsKLSAgICAgICAgICAgICAgICBkYXRhW3AgKyAxXSA9IGdyZWVuOwotICAgICAgICAgICAgICAgIGRhdGFbcCArIDJdID0gYmx1ZTsKLSAgICAgICAgICAgICAgICBkYXRhW3AgKyAzXSA9IDI1NTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgfSAKLSAgICB9IGVsc2UgewotICAgICAgICB0aGF0LmZpbGxSZWN0KHRpbGVfeCArIHgsIHRpbGVfeSArIHksIHcsIGgsIGNvbG9yKTsKLSAgICB9Ci19OwotCi0vLyBEcmF3IHRoZSBjdXJyZW50IHRpbGUgdG8gdGhlIHNjcmVlbgotdGhhdC5maW5pc2hUaWxlID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKGNvbmYucHJlZmVyX2pzKSB7Ci0gICAgICAgIGNfY3R4LnB1dEltYWdlRGF0YSh0aWxlLCB0aWxlX3ggLSB2aWV3cG9ydC54LCB0aWxlX3kgLSB2aWV3cG9ydC55KTsKLSAgICB9Ci0gICAgLy8gZWxzZTogTm8tb3AsIGlmIG5vdCBwcmVmZXJfanMgdGhlbiBhbHJlYWR5IGRvbmUgYnkgc2V0U3ViVGlsZQotfTsKLQotcmdiSW1hZ2VEYXRhID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHsKLSAgICB2YXIgaW1nLCBpLCBqLCBkYXRhLCB2ID0gdmlld3BvcnQ7Ci0gICAgLyoKLSAgICBpZiAoKHggLSB2LnggPj0gdi53KSB8fCAoeSAtIHYueSA+PSB2LmgpIHx8Ci0gICAgICAgICh4IC0gdi54ICsgd2lkdGggPCAwKSB8fCAoeSAtIHYueSArIGhlaWdodCA8IDApKSB7Ci0gICAgICAgIC8vIFNraXBwaW5nIGJlY2F1c2Ugb3V0c2lkZSBvZiB2aWV3cG9ydAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICovCi0gICAgaW1nID0gY19jdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwotICAgIGRhdGEgPSBpbWcuZGF0YTsKLSAgICBmb3IgKGk9MCwgaj1vZmZzZXQ7IGkgPCAod2lkdGggKiBoZWlnaHQgKiA0KTsgaT1pKzQsIGo9aiszKSB7Ci0gICAgICAgIGRhdGFbaSAgICBdID0gYXJyW2ogICAgXTsKLSAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdOwotICAgICAgICBkYXRhW2kgKyAyXSA9IGFycltqICsgMl07Ci0gICAgICAgIGRhdGFbaSArIDNdID0gMjU1OyAvLyBTZXQgQWxwaGEKLSAgICB9Ci0gICAgY19jdHgucHV0SW1hZ2VEYXRhKGltZywgeCAtIHYueCwgeSAtIHYueSk7Ci19OwotCi1iZ3J4SW1hZ2VEYXRhID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHsKLSAgICB2YXIgaW1nLCBpLCBqLCBkYXRhLCB2ID0gdmlld3BvcnQ7Ci0gICAgLyoKLSAgICBpZiAoKHggLSB2LnggPj0gdi53KSB8fCAoeSAtIHYueSA+PSB2LmgpIHx8Ci0gICAgICAgICh4IC0gdi54ICsgd2lkdGggPCAwKSB8fCAoeSAtIHYueSArIGhlaWdodCA8IDApKSB7Ci0gICAgICAgIC8vIFNraXBwaW5nIGJlY2F1c2Ugb3V0c2lkZSBvZiB2aWV3cG9ydAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICovCi0gICAgaW1nID0gY19jdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwotICAgIGRhdGEgPSBpbWcuZGF0YTsKLSAgICBmb3IgKGk9MCwgaj1vZmZzZXQ7IGkgPCAod2lkdGggKiBoZWlnaHQgKiA0KTsgaT1pKzQsIGo9ais0KSB7Ci0gICAgICAgIGRhdGFbaSAgICBdID0gYXJyW2ogKyAyXTsKLSAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdOwotICAgICAgICBkYXRhW2kgKyAyXSA9IGFycltqICAgIF07Ci0gICAgICAgIGRhdGFbaSArIDNdID0gMjU1OyAvLyBTZXQgQWxwaGEKLSAgICB9Ci0gICAgY19jdHgucHV0SW1hZ2VEYXRhKGltZywgeCAtIHYueCwgeSAtIHYueSk7Ci19OwotCi1jbWFwSW1hZ2VEYXRhID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHsKLSAgICB2YXIgaW1nLCBpLCBqLCBkYXRhLCBiZ3IsIGNtYXA7Ci0gICAgaW1nID0gY19jdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwotICAgIGRhdGEgPSBpbWcuZGF0YTsKLSAgICBjbWFwID0gY29uZi5jb2xvdXJNYXA7Ci0gICAgZm9yIChpPTAsIGo9b2Zmc2V0OyBpIDwgKHdpZHRoICogaGVpZ2h0ICogNCk7IGkrPTQsIGorPTEpIHsKLSAgICAgICAgYmdyID0gY21hcFthcnJbal1dOwotICAgICAgICBkYXRhW2kgICAgXSA9IGJnclsyXTsKLSAgICAgICAgZGF0YVtpICsgMV0gPSBiZ3JbMV07Ci0gICAgICAgIGRhdGFbaSArIDJdID0gYmdyWzBdOwotICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsgLy8gU2V0IEFscGhhCi0gICAgfQotICAgIGNfY3R4LnB1dEltYWdlRGF0YShpbWcsIHggLSB2aWV3cG9ydC54LCB5IC0gdmlld3BvcnQueSk7Ci19OwotCi10aGF0LmJsaXRJbWFnZSA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7Ci0gICAgaWYgKGNvbmYudHJ1ZV9jb2xvcikgewotICAgICAgICBiZ3J4SW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBjbWFwSW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTsKLSAgICB9Ci19OwotCi10aGF0LmJsaXRSZ2JJbWFnZSA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7Ci0gICAgaWYgKGNvbmYudHJ1ZV9jb2xvcikgewotICAgICAgICByZ2JJbWFnZURhdGEoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHByb2xseSB3cm9uZy4uLgotICAgICAgICBjbWFwSW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTsKLSAgICB9Ci19OwotCi10aGF0LmJsaXRTdHJpbmdJbWFnZSA9IGZ1bmN0aW9uKHN0ciwgeCwgeSkgewotICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKLSAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewotICAgICAgICBjX2N0eC5kcmF3SW1hZ2UoaW1nLCB4IC0gdmlld3BvcnQueCwgeSAtIHZpZXdwb3J0LnkpOwotICAgIH07Ci0gICAgaW1nLnNyYyA9IHN0cjsKLX07Ci0KLXRoYXQuY2hhbmdlQ3Vyc29yID0gZnVuY3Rpb24ocGl4ZWxzLCBtYXNrLCBob3R4LCBob3R5LCB3LCBoKSB7Ci0gICAgaWYgKGNvbmYuY3Vyc29yX3VyaSA9PT0gZmFsc2UpIHsKLSAgICAgICAgVXRpbC5XYXJuKCJjaGFuZ2VDdXJzb3IgY2FsbGVkIGJ1dCBubyBjdXJzb3IgZGF0YSBVUkkgc3VwcG9ydCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNvbmYudHJ1ZV9jb2xvcikgewotICAgICAgICBjaGFuZ2VDdXJzb3IoY29uZi50YXJnZXQsIHBpeGVscywgbWFzaywgaG90eCwgaG90eSwgdywgaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hhbmdlQ3Vyc29yKGNvbmYudGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcsIGgsIGNvbmYuY29sb3VyTWFwKTsKLSAgICB9Ci19OwotCi10aGF0LmRlZmF1bHRDdXJzb3IgPSBmdW5jdGlvbigpIHsKLSAgICBjb25mLnRhcmdldC5zdHlsZS5jdXJzb3IgPSAiZGVmYXVsdCI7Ci19OwotCi1yZXR1cm4gY29uc3RydWN0b3IoKTsgIC8vIFJldHVybiB0aGUgcHVibGljIEFQSSBpbnRlcmZhY2UKLQotfSAgLy8gRW5kIG9mIERpc3BsYXkoKQotCi0KLS8qIFNldCBDU1MgY3Vyc29yIHByb3BlcnR5IHVzaW5nIGRhdGEgVVJJIGVuY29kZWQgY3Vyc29yIGZpbGUgKi8KLWZ1bmN0aW9uIGNoYW5nZUN1cnNvcih0YXJnZXQsIHBpeGVscywgbWFzaywgaG90eCwgaG90eSwgdywgaCwgY21hcCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgY3VyID0gW10sIHJnYiwgSUhEUnN6LCBSR0JzeiwgQU5Ec3osIFhPUnN6LCB1cmwsIGlkeCwgYWxwaGEsIHgsIHk7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBjaGFuZ2VDdXJzb3IsIHg6ICIgKyBob3R4ICsgIiwgeTogIiArIGhvdHkgKyAiLCB3OiAiICsgdyArICIsIGg6ICIgKyBoKTsKLSAgICAKLSAgICAvLyBQdXNoIG11bHRpLWJ5dGUgbGl0dGxlLWVuZGlhbiB2YWx1ZXMKLSAgICBjdXIucHVzaDE2bGUgPSBmdW5jdGlvbiAobnVtKSB7Ci0gICAgICAgIHRoaXMucHVzaCgobnVtICAgICApICYgMHhGRiwKLSAgICAgICAgICAgICAgICAgIChudW0gPj4gOCkgJiAweEZGICApOwotICAgIH07Ci0gICAgY3VyLnB1c2gzMmxlID0gZnVuY3Rpb24gKG51bSkgewotICAgICAgICB0aGlzLnB1c2goKG51bSAgICAgICkgJiAweEZGLAotICAgICAgICAgICAgICAgICAgKG51bSA+PiAgOCkgJiAweEZGLAotICAgICAgICAgICAgICAgICAgKG51bSA+PiAxNikgJiAweEZGLAotICAgICAgICAgICAgICAgICAgKG51bSA+PiAyNCkgJiAweEZGICApOwotICAgIH07Ci0KLSAgICBJSERSc3ogPSA0MDsKLSAgICBSR0JzeiA9IHcgKiBoICogNDsKLSAgICBYT1JzeiA9IE1hdGguY2VpbCggKHcgKiBoKSAvIDguMCApOwotICAgIEFORHN6ID0gTWF0aC5jZWlsKCAodyAqIGgpIC8gOC4wICk7Ci0KLSAgICAvLyBNYWluIGhlYWRlcgotICAgIGN1ci5wdXNoMTZsZSgwKTsgICAgICAvLyAwOiBSZXNlcnZlZAotICAgIGN1ci5wdXNoMTZsZSgyKTsgICAgICAvLyAyOiAuQ1VSIHR5cGUKLSAgICBjdXIucHVzaDE2bGUoMSk7ICAgICAgLy8gNDogTnVtYmVyIG9mIGltYWdlcywgMSBmb3Igbm9uLWFuaW1hdGVkIGljbwotCi0gICAgLy8gQ3Vyc29yICMxIGhlYWRlciAoSUNPTkRJUkVOVFJZKQotICAgIGN1ci5wdXNoKHcpOyAgICAgICAgICAvLyA2OiB3aWR0aAotICAgIGN1ci5wdXNoKGgpOyAgICAgICAgICAvLyA3OiBoZWlnaHQKLSAgICBjdXIucHVzaCgwKTsgICAgICAgICAgLy8gODogY29sb3JzLCAwIC0+IHRydWUtY29sb3IKLSAgICBjdXIucHVzaCgwKTsgICAgICAgICAgLy8gOTogcmVzZXJ2ZWQKLSAgICBjdXIucHVzaDE2bGUoaG90eCk7ICAgLy8gMTA6IGhvdHNwb3QgeCBjb29yZGluYXRlCi0gICAgY3VyLnB1c2gxNmxlKGhvdHkpOyAgIC8vIDEyOiBob3RzcG90IHkgY29vcmRpbmF0ZQotICAgIGN1ci5wdXNoMzJsZShJSERSc3ogKyBSR0JzeiArIFhPUnN6ICsgQU5Ec3opOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNDogY3Vyc29yIGRhdGEgYnl0ZSBzaXplCi0gICAgY3VyLnB1c2gzMmxlKDIyKTsgICAgIC8vIDE4OiBvZmZzZXQgb2YgY3Vyc29yIGRhdGEgaW4gdGhlIGZpbGUKLQotCi0gICAgLy8gQ3Vyc29yICMxIEluZm9IZWFkZXIgKElDT05JTUFHRS9CSVRNQVBJTkZPKQotICAgIGN1ci5wdXNoMzJsZShJSERSc3opOyAvLyAyMjogSW5mb2hlYWRlciBzaXplCi0gICAgY3VyLnB1c2gzMmxlKHcpOyAgICAgIC8vIDI2OiBDdXJzb3Igd2lkdGgKLSAgICBjdXIucHVzaDMybGUoaCoyKTsgICAgLy8gMzA6IFhPUitBTkQgaGVpZ2h0Ci0gICAgY3VyLnB1c2gxNmxlKDEpOyAgICAgIC8vIDM0OiBudW1iZXIgb2YgcGxhbmVzCi0gICAgY3VyLnB1c2gxNmxlKDMyKTsgICAgIC8vIDM2OiBiaXRzIHBlciBwaXhlbAotICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAvLyAzODogVHlwZSBvZiBjb21wcmVzc2lvbgotCi0gICAgY3VyLnB1c2gzMmxlKFhPUnN6ICsgQU5Ec3opOyAvLyA0MzogU2l6ZSBvZiBJbWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2ltcCBsZWF2ZXMgdGhpcyBhcyAwCi0KLSAgICBjdXIucHVzaDMybGUoMCk7ICAgICAgLy8gNDY6IHJlc2VydmVkCi0gICAgY3VyLnB1c2gzMmxlKDApOyAgICAgIC8vIDUwOiByZXNlcnZlZAotICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAvLyA1NDogcmVzZXJ2ZWQKLSAgICBjdXIucHVzaDMybGUoMCk7ICAgICAgLy8gNTg6IHJlc2VydmVkCi0KLSAgICAvLyA2MjogY29sb3IgZGF0YSAoUkdCUVVBRCBpY0NvbG9yc1tdKQotICAgIGZvciAoeSA9IGgtMTsgeSA+PSAwOyB5IC09IDEpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMSkgewotICAgICAgICAgICAgaWR4ID0geSAqIE1hdGguY2VpbCh3IC8gOCkgKyBNYXRoLmZsb29yKHgvOCk7Ci0gICAgICAgICAgICBhbHBoYSA9IChtYXNrW2lkeF0gPDwgKHggJSA4KSkgJiAweDgwID8gMjU1IDogMDsKLQotICAgICAgICAgICAgaWYgKGNtYXApIHsKLSAgICAgICAgICAgICAgICBpZHggPSAodyAqIHkpICsgeDsKLSAgICAgICAgICAgICAgICByZ2IgPSBjbWFwW3BpeGVsc1tpZHhdXTsKLSAgICAgICAgICAgICAgICBjdXIucHVzaChyZ2JbMl0pOyAgICAgICAgICAvLyBibHVlCi0gICAgICAgICAgICAgICAgY3VyLnB1c2gocmdiWzFdKTsgICAgICAgICAgLy8gZ3JlZW4KLSAgICAgICAgICAgICAgICBjdXIucHVzaChyZ2JbMF0pOyAgICAgICAgICAvLyByZWQKLSAgICAgICAgICAgICAgICBjdXIucHVzaChhbHBoYSk7ICAgICAgICAgICAvLyBhbHBoYQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZHggPSAoKHcgKiB5KSArIHgpICogNDsKLSAgICAgICAgICAgICAgICBjdXIucHVzaChwaXhlbHNbaWR4ICsgMl0pOyAvLyBibHVlCi0gICAgICAgICAgICAgICAgY3VyLnB1c2gocGl4ZWxzW2lkeCArIDFdKTsgLy8gZ3JlZW4KLSAgICAgICAgICAgICAgICBjdXIucHVzaChwaXhlbHNbaWR4ICAgIF0pOyAvLyByZWQKLSAgICAgICAgICAgICAgICBjdXIucHVzaChhbHBoYSk7ICAgICAgICAgICAvLyBhbHBoYQorICAgICAgICAvLyA2MjogY29sb3IgZGF0YSAoUkdCUVVBRCBpY0NvbG9yc1tdKQorICAgICAgICB2YXIgeSwgeDsKKyAgICAgICAgZm9yICh5ID0gaCAtIDE7IHkgPj0gMDsgeS0tKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPj0gdzAgfHwgeSA+PSBoMCkgeworICAgICAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgIC8vIGJsdWUKKyAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2goMCk7ICAvLyBncmVlbgorICAgICAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgIC8vIHJlZAorICAgICAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgIC8vIGFscGhhCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IHkgKiBNYXRoLmNlaWwodzAgLyA4KSArIE1hdGguZmxvb3IoeCAvIDgpOworICAgICAgICAgICAgICAgICAgICB2YXIgYWxwaGEgPSAobWFza1tpZHhdIDw8ICh4ICUgOCkpICYgMHg4MCA/IDI1NSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAodzAgKiB5KSArIHg7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmdiID0gY21hcFtwaXhlbHNbaWR4XV07CisgICAgICAgICAgICAgICAgICAgICAgICBjdXIucHVzaChyZ2JbMl0pOyAgLy8gYmx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocmdiWzFdKTsgIC8vIGdyZWVuCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIucHVzaChyZ2JbMF0pOyAgLy8gcmVkCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIucHVzaChhbHBoYSk7ICAgLy8gYWxwaGEKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KIAotICAgIC8vIFhPUi9iaXRtYXNrIGRhdGEgKEJZVEUgaWNYT1JbXSkKLSAgICAvLyAoaWdub3JlZCwganVzdCBuZWVkcyB0byBiZSByaWdodCBzaXplKQotICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5ICs9IDEpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IE1hdGguY2VpbCh3IC8gOCk7IHggKz0gMSkgewotICAgICAgICAgICAgY3VyLnB1c2goMHgwMCk7CisgICAgICAgIC8vIFhPUi9iaXRtYXNrIGRhdGEgKEJZVEUgaWNYT1JbXSkKKyAgICAgICAgLy8gKGlnbm9yZWQsIGp1c3QgbmVlZHMgdG8gYmUgdGhlIHJpZ2h0IHNpemUpCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBNYXRoLmNlaWwodyAvIDgpOyB4KyspIHsKKyAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KIAotICAgIC8vIEFORC9iaXRtYXNrIGRhdGEgKEJZVEUgaWNBTkRbXSkKLSAgICAvLyAoaWdub3JlZCwganVzdCBuZWVkcyB0byBiZSByaWdodCBzaXplKQotICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5ICs9IDEpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IE1hdGguY2VpbCh3IC8gOCk7IHggKz0gMSkgewotICAgICAgICAgICAgY3VyLnB1c2goMHgwMCk7CisgICAgICAgIC8vIEFORC9iaXRtYXNrIGRhdGEgKEJZVEUgaWNBTkRbXSkKKyAgICAgICAgLy8gKGlnbm9yZWQsIGp1c3QgbmVlZHMgdG8gYmUgdGhlIHJpZ2h0IHNpemUpCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBNYXRoLmNlaWwodyAvIDgpOyB4KyspIHsKKyAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KIAotICAgIHVybCA9ICJkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsIiArIEJhc2U2NC5lbmNvZGUoY3VyKTsKLSAgICB0YXJnZXQuc3R5bGUuY3Vyc29yID0gInVybCgiICsgdXJsICsgIikgIiArIGhvdHggKyAiICIgKyBob3R5ICsgIiwgZGVmYXVsdCI7Ci0gICAgLy9VdGlsLkRlYnVnKCI8PCBjaGFuZ2VDdXJzb3IsIGN1ci5sZW5ndGg6ICIgKyBjdXIubGVuZ3RoKTsKLX0KKyAgICAgICAgdmFyIHVybCA9ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsJyArIEJhc2U2NC5lbmNvZGUoY3VyKTsKKyAgICAgICAgdGFyZ2V0LnN0eWxlLmN1cnNvciA9ICd1cmwoJyArIHVybCArICcpJyArIGhvdHggKyAnICcgKyBob3R5ICsgJywgZGVmYXVsdCc7CisgICAgfTsKK30pKCk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvaW5wdXQuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvaW5wdXQuanMKaW5kZXggMWRmZTcxOS4uNWQ5ZTIwOSAxMDA2NDQKLS0tIGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2lucHV0LmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9pbnB1dC5qcwpAQCAtMSwxOTExICsxLDM4OCBAQAogLyoKICAqIG5vVk5DOiBIVE1MNSBWTkMgY2xpZW50Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9lbCBNYXJ0aW4KLSAqIExpY2Vuc2VkIHVuZGVyIExHUEwtMiBvciBhbnkgbGF0ZXIgdmVyc2lvbiAoc2VlIExJQ0VOU0UudHh0KQorICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUIKKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgb3IgYW55IGxhdGVyIHZlcnNpb24gKHNlZSBMSUNFTlNFLnR4dCkKICAqLwogCi0vKmpzbGludCBicm93c2VyOiB0cnVlLCB3aGl0ZTogZmFsc2UsIGJpdHdpc2U6IGZhbHNlICovCisvKmpzbGludCBicm93c2VyOiB0cnVlLCB3aGl0ZTogZmFsc2UgKi8KIC8qZ2xvYmFsIHdpbmRvdywgVXRpbCAqLwogCit2YXIgS2V5Ym9hcmQsIE1vdXNlOwogCi0vLwotLy8gS2V5Ym9hcmQgZXZlbnQgaGFuZGxlcgotLy8KKyhmdW5jdGlvbiAoKSB7CisgICAgInVzZSBzdHJpY3QiOwogCi1mdW5jdGlvbiBLZXlib2FyZChkZWZhdWx0cykgewotInVzZSBzdHJpY3QiOworICAgIC8vCisgICAgLy8gS2V5Ym9hcmQgZXZlbnQgaGFuZGxlcgorICAgIC8vCiAKLXZhciB0aGF0ICAgICAgICAgICA9IHt9LCAgLy8gUHVibGljIEFQSSBtZXRob2RzCi0gICAgY29uZiAgICAgICAgICAgPSB7fSwgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcworICAgIEtleWJvYXJkID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7CisgICAgICAgIHRoaXMuX2tleURvd25MaXN0ID0gW107ICAgICAgICAgLy8gTGlzdCBvZiBkZXByZXNzZWQga2V5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChldmVuIGlmIHRoZXkgYXJlIGhhcHB5KQogCi0gICAga2V5RG93bkxpc3QgICAgPSBbXTsgICAgICAgICAvLyBMaXN0IG9mIGRlcHJlc3NlZCBrZXlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGV2ZW4gaWYgdGhleSBhcmUgaGFwcHkpCisgICAgICAgIFV0aWwuc2V0X2RlZmF1bHRzKHRoaXMsIGRlZmF1bHRzLCB7CisgICAgICAgICAgICAndGFyZ2V0JzogZG9jdW1lbnQsCisgICAgICAgICAgICAnZm9jdXNlZCc6IHRydWUKKyAgICAgICAgfSk7CiAKLS8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcwotVXRpbC5jb25mX2RlZmF1bHRzKGNvbmYsIHRoYXQsIGRlZmF1bHRzLCBbCi0gICAgWyd0YXJnZXQnLCAgICAgICd3bycsICdkb20nLCAgZG9jdW1lbnQsICdET00gZWxlbWVudCB0aGF0IGNhcHR1cmVzIGtleWJvYXJkIGlucHV0J10sCi0gICAgWydmb2N1c2VkJywgICAgICdydycsICdib29sJywgdHJ1ZSwgJ0NhcHR1cmUgYW5kIHNlbmQga2V5IGV2ZW50cyddLAorICAgICAgICAvLyBjcmVhdGUgdGhlIGtleWJvYXJkIGhhbmRsZXIKKyAgICAgICAgdGhpcy5faGFuZGxlciA9IG5ldyBLZXlFdmVudERlY29kZXIoa2JkVXRpbC5Nb2RpZmllclN5bmMoKSwKKyAgICAgICAgICAgIFZlcmlmeUNoYXJNb2RpZmllciggLyoganNoaW50IG5ld2NhcDogZmFsc2UgKi8KKyAgICAgICAgICAgICAgICBUcmFja0tleVN0YXRlKAorICAgICAgICAgICAgICAgICAgICBFc2NhcGVNb2RpZmllcnModGhpcy5faGFuZGxlUmZiRXZlbnQuYmluZCh0aGlzKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICk7IC8qIGpzaGludCBuZXdjYXA6IHRydWUgKi8KIAotICAgIFsnb25LZXlQcmVzcycsICAncncnLCAnZnVuYycsIG51bGwsICdIYW5kbGVyIGZvciBrZXkgcHJlc3MvcmVsZWFzZSddCi0gICAgXSk7CisgICAgICAgIC8vIGtlZXAgdGhlc2UgaGVyZSBzbyB3ZSBjYW4gcmVmZXIgdG8gdGhlbSBsYXRlcgorICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0geworICAgICAgICAgICAgJ2tleXVwJzogdGhpcy5faGFuZGxlS2V5VXAuYmluZCh0aGlzKSwKKyAgICAgICAgICAgICdrZXlkb3duJzogdGhpcy5faGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpLAorICAgICAgICAgICAgJ2tleXByZXNzJzogdGhpcy5faGFuZGxlS2V5UHJlc3MuYmluZCh0aGlzKSwKKyAgICAgICAgICAgICdibHVyJzogdGhpcy5fYWxsS2V5c1VwLmJpbmQodGhpcykKKyAgICAgICAgfTsKKyAgICB9OwogCisgICAgS2V5Ym9hcmQucHJvdG90eXBlID0geworICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHMKIAotLy8gCi0vLyBQcml2YXRlIGZ1bmN0aW9ucwotLy8KLQotLy8gRnJvbSB0aGUgZXZlbnQga2V5Q29kZSByZXR1cm4gdGhlIGtleXN5bSB2YWx1ZSBmb3Iga2V5cyB0aGF0IG5lZWQKLS8vIHRvIGJlIHN1cHByZXNzZWQgb3RoZXJ3aXNlIHRoZXkgbWF5IHRyaWdnZXIgdW5pbnRlbmRlZCBicm93c2VyCi0vLyBhY3Rpb25zCi1mdW5jdGlvbiBnZXRLZXlzeW1TcGVjaWFsKGV2dCkgewotICAgIHZhciBrZXlzeW0gPSBudWxsOwotCi0gICAgc3dpdGNoICggZXZ0LmtleUNvZGUgKSB7Ci0gICAgICAgIC8vIFRoZXNlIGdlbmVyYXRlIGEga2V5RG93biBhbmQga2V5UHJlc3MgaW4gRmlyZWZveCBhbmQgT3BlcmEKLSAgICAgICAgY2FzZSA4ICAgICAgICAgOiBrZXlzeW0gPSAweEZGMDg7IGJyZWFrOyAvLyBCQUNLU1BBQ0UKLSAgICAgICAgY2FzZSAxMyAgICAgICAgOiBrZXlzeW0gPSAweEZGMEQ7IGJyZWFrOyAvLyBFTlRFUgotCi0gICAgICAgIC8vIFRoaXMgZ2VuZXJhdGVzIGEga2V5RG93biBhbmQga2V5UHJlc3MgaW4gT3BlcmEKLSAgICAgICAgY2FzZSA5ICAgICAgICAgOiBrZXlzeW0gPSAweEZGMDk7IGJyZWFrOyAvLyBUQUIKLSAgICAgICAgZGVmYXVsdCAgICAgICAgOiAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChldnQudHlwZSA9PT0gJ2tleWRvd24nKSB7Ci0gICAgICAgIHN3aXRjaCAoIGV2dC5rZXlDb2RlICkgewotICAgICAgICAgICAgY2FzZSAyNyAgICAgICAgOiBrZXlzeW0gPSAweEZGMUI7IGJyZWFrOyAvLyBFU0NBUEUKLSAgICAgICAgICAgIGNhc2UgNDYgICAgICAgIDoga2V5c3ltID0gMHhGRkZGOyBicmVhazsgLy8gREVMRVRFCi0KLSAgICAgICAgICAgIGNhc2UgMzYgICAgICAgIDoga2V5c3ltID0gMHhGRjUwOyBicmVhazsgLy8gSE9NRQotICAgICAgICAgICAgY2FzZSAzNSAgICAgICAgOiBrZXlzeW0gPSAweEZGNTc7IGJyZWFrOyAvLyBFTkQKLSAgICAgICAgICAgIGNhc2UgMzMgICAgICAgIDoga2V5c3ltID0gMHhGRjU1OyBicmVhazsgLy8gUEFHRV9VUAotICAgICAgICAgICAgY2FzZSAzNCAgICAgICAgOiBrZXlzeW0gPSAweEZGNTY7IGJyZWFrOyAvLyBQQUdFX0RPV04KLSAgICAgICAgICAgIGNhc2UgNDUgICAgICAgIDoga2V5c3ltID0gMHhGRjYzOyBicmVhazsgLy8gSU5TRVJUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICctJyBkdXJpbmcga2V5UHJlc3MKLSAgICAgICAgICAgIGNhc2UgMzcgICAgICAgIDoga2V5c3ltID0gMHhGRjUxOyBicmVhazsgLy8gTEVGVAotICAgICAgICAgICAgY2FzZSAzOCAgICAgICAgOiBrZXlzeW0gPSAweEZGNTI7IGJyZWFrOyAvLyBVUAotICAgICAgICAgICAgY2FzZSAzOSAgICAgICAgOiBrZXlzeW0gPSAweEZGNTM7IGJyZWFrOyAvLyBSSUdIVAotICAgICAgICAgICAgY2FzZSA0MCAgICAgICAgOiBrZXlzeW0gPSAweEZGNTQ7IGJyZWFrOyAvLyBET1dOCi0gICAgICAgICAgICBjYXNlIDE2ICAgICAgICA6IGtleXN5bSA9IDB4RkZFMTsgYnJlYWs7IC8vIFNISUZUCi0gICAgICAgICAgICBjYXNlIDE3ICAgICAgICA6IGtleXN5bSA9IDB4RkZFMzsgYnJlYWs7IC8vIENPTlRST0wKLSAgICAgICAgICAgIC8vY2FzZSAxOCAgICAgICAgOiBrZXlzeW0gPSAweEZGRTc7IGJyZWFrOyAvLyBMZWZ0IE1ldGEgKE1hYyBPcHRpb24pCi0gICAgICAgICAgICBjYXNlIDE4ICAgICAgICA6IGtleXN5bSA9IDB4RkZFOTsgYnJlYWs7IC8vIExlZnQgQUxUIChNYWMgQ29tbWFuZCkKLQotICAgICAgICAgICAgY2FzZSAxMTIgICAgICAgOiBrZXlzeW0gPSAweEZGQkU7IGJyZWFrOyAvLyBGMQotICAgICAgICAgICAgY2FzZSAxMTMgICAgICAgOiBrZXlzeW0gPSAweEZGQkY7IGJyZWFrOyAvLyBGMgotICAgICAgICAgICAgY2FzZSAxMTQgICAgICAgOiBrZXlzeW0gPSAweEZGQzA7IGJyZWFrOyAvLyBGMwotICAgICAgICAgICAgY2FzZSAxMTUgICAgICAgOiBrZXlzeW0gPSAweEZGQzE7IGJyZWFrOyAvLyBGNAotICAgICAgICAgICAgY2FzZSAxMTYgICAgICAgOiBrZXlzeW0gPSAweEZGQzI7IGJyZWFrOyAvLyBGNQotICAgICAgICAgICAgY2FzZSAxMTcgICAgICAgOiBrZXlzeW0gPSAweEZGQzM7IGJyZWFrOyAvLyBGNgotICAgICAgICAgICAgY2FzZSAxMTggICAgICAgOiBrZXlzeW0gPSAweEZGQzQ7IGJyZWFrOyAvLyBGNwotICAgICAgICAgICAgY2FzZSAxMTkgICAgICAgOiBrZXlzeW0gPSAweEZGQzU7IGJyZWFrOyAvLyBGOAotICAgICAgICAgICAgY2FzZSAxMjAgICAgICAgOiBrZXlzeW0gPSAweEZGQzY7IGJyZWFrOyAvLyBGOQotICAgICAgICAgICAgY2FzZSAxMjEgICAgICAgOiBrZXlzeW0gPSAweEZGQzc7IGJyZWFrOyAvLyBGMTAKLSAgICAgICAgICAgIGNhc2UgMTIyICAgICAgIDoga2V5c3ltID0gMHhGRkM4OyBicmVhazsgLy8gRjExCi0gICAgICAgICAgICBjYXNlIDEyMyAgICAgICA6IGtleXN5bSA9IDB4RkZDOTsgYnJlYWs7IC8vIEYxMgotCi0gICAgICAgICAgICBkZWZhdWx0ICAgICAgICA6ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKCFrZXlzeW0pICYmIChldnQuY3RybEtleSB8fCBldnQuYWx0S2V5KSkgewotICAgICAgICBpZiAoKHR5cGVvZihldnQud2hpY2gpICE9PSAidW5kZWZpbmVkIikgJiYgKGV2dC53aGljaCA+IDApKSB7Ci0gICAgICAgICAgICBrZXlzeW0gPSBldnQud2hpY2g7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJRTkgYWx3YXlzCi0gICAgICAgICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aGVuIGN0cmwvYWx0ICsgc3BlY2lhbAotICAgICAgICAgICAgVXRpbC5XYXJuKCJ3aGljaCBub3Qgc2V0LCB1c2luZyBrZXlDb2RlIik7Ci0gICAgICAgICAgICBrZXlzeW0gPSBldnQua2V5Q29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbWFwIHN5bWJvbHMgKi8KLSAgICAgICAgc3dpdGNoIChrZXlzeW0pIHsKLSAgICAgICAgICAgIGNhc2UgMTg2ICAgICAgIDoga2V5c3ltID0gNTk7IGJyZWFrOyAvLyA7ICAoSUUpCi0gICAgICAgICAgICBjYXNlIDE4NyAgICAgICA6IGtleXN5bSA9IDYxOyBicmVhazsgLy8gPSAgKElFKQotICAgICAgICAgICAgY2FzZSAxODggICAgICAgOiBrZXlzeW0gPSA0NDsgYnJlYWs7IC8vICwgIChNb3ppbGxhLCBJRSkKLSAgICAgICAgICAgIGNhc2UgMTA5ICAgICAgIDogICAgICAgICAgICAgICAgICAgICAvLyAtICAoTW96aWxsYSwgT3BlcmEpCi0gICAgICAgICAgICAgICAgaWYgKFV0aWwuRW5naW5lLmdlY2tvIHx8IFV0aWwuRW5naW5lLnByZXN0bykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IDQ1OyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4OSAgICAgICA6IGtleXN5bSA9IDQ1OyBicmVhazsgLy8gLSAgKElFKQotICAgICAgICAgICAgY2FzZSAxOTAgICAgICAgOiBrZXlzeW0gPSA0NjsgYnJlYWs7IC8vIC4gIChNb3ppbGxhLCBJRSkKLSAgICAgICAgICAgIGNhc2UgMTkxICAgICAgIDoga2V5c3ltID0gNDc7IGJyZWFrOyAvLyAvICAoTW96aWxsYSwgSUUpCi0gICAgICAgICAgICBjYXNlIDE5MiAgICAgICA6IGtleXN5bSA9IDk2OyBicmVhazsgLy8gYCAgKE1vemlsbGEsIElFKQotICAgICAgICAgICAgY2FzZSAyMTkgICAgICAgOiBrZXlzeW0gPSA5MTsgYnJlYWs7IC8vIFsgIChNb3ppbGxhLCBJRSkKLSAgICAgICAgICAgIGNhc2UgMjIwICAgICAgIDoga2V5c3ltID0gOTI7IGJyZWFrOyAvLyBcICAoTW96aWxsYSwgSUUpCi0gICAgICAgICAgICBjYXNlIDIyMSAgICAgICA6IGtleXN5bSA9IDkzOyBicmVhazsgLy8gXSAgKE1vemlsbGEsIElFKQotICAgICAgICAgICAgY2FzZSAyMjIgICAgICAgOiBrZXlzeW0gPSAzOTsgYnJlYWs7IC8vICcgIChNb3ppbGxhLCBJRSkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogUmVtYXAgc2hpZnRlZCBhbmQgdW5zaGlmdGVkIGtleXMgKi8KLSAgICAgICAgaWYgKCEhZXZ0LnNoaWZ0S2V5KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkgewotICAgICAgICAgICAgICAgIGNhc2UgNDggICAgICAgIDoga2V5c3ltID0gNDEgOyBicmVhazsgLy8gKSAgKHNoaWZ0ZWQgMCkKLSAgICAgICAgICAgICAgICBjYXNlIDQ5ICAgICAgICA6IGtleXN5bSA9IDMzIDsgYnJlYWs7IC8vICEgIChzaGlmdGVkIDEpCi0gICAgICAgICAgICAgICAgY2FzZSA1MCAgICAgICAgOiBrZXlzeW0gPSA2NCA7IGJyZWFrOyAvLyBAICAoc2hpZnRlZCAyKQotICAgICAgICAgICAgICAgIGNhc2UgNTEgICAgICAgIDoga2V5c3ltID0gMzUgOyBicmVhazsgLy8gIyAgKHNoaWZ0ZWQgMykKLSAgICAgICAgICAgICAgICBjYXNlIDUyICAgICAgICA6IGtleXN5bSA9IDM2IDsgYnJlYWs7IC8vICQgIChzaGlmdGVkIDQpCi0gICAgICAgICAgICAgICAgY2FzZSA1MyAgICAgICAgOiBrZXlzeW0gPSAzNyA7IGJyZWFrOyAvLyAlICAoc2hpZnRlZCA1KQotICAgICAgICAgICAgICAgIGNhc2UgNTQgICAgICAgIDoga2V5c3ltID0gOTQgOyBicmVhazsgLy8gXiAgKHNoaWZ0ZWQgNikKLSAgICAgICAgICAgICAgICBjYXNlIDU1ICAgICAgICA6IGtleXN5bSA9IDM4IDsgYnJlYWs7IC8vICYgIChzaGlmdGVkIDcpCi0gICAgICAgICAgICAgICAgY2FzZSA1NiAgICAgICAgOiBrZXlzeW0gPSA0MiA7IGJyZWFrOyAvLyAqICAoc2hpZnRlZCA4KQotICAgICAgICAgICAgICAgIGNhc2UgNTcgICAgICAgIDoga2V5c3ltID0gNDAgOyBicmVhazsgLy8gKCAgKHNoaWZ0ZWQgOSkKLQotICAgICAgICAgICAgICAgIGNhc2UgNTkgICAgICAgIDoga2V5c3ltID0gNTggOyBicmVhazsgLy8gOiAgKHNoaWZ0ZWQgYCkKLSAgICAgICAgICAgICAgICBjYXNlIDYxICAgICAgICA6IGtleXN5bSA9IDQzIDsgYnJlYWs7IC8vICsgIChzaGlmdGVkIDspCi0gICAgICAgICAgICAgICAgY2FzZSA0NCAgICAgICAgOiBrZXlzeW0gPSA2MCA7IGJyZWFrOyAvLyA8ICAoc2hpZnRlZCAsKQotICAgICAgICAgICAgICAgIGNhc2UgNDUgICAgICAgIDoga2V5c3ltID0gOTUgOyBicmVhazsgLy8gXyAgKHNoaWZ0ZWQgLSkKLSAgICAgICAgICAgICAgICBjYXNlIDQ2ICAgICAgICA6IGtleXN5bSA9IDYyIDsgYnJlYWs7IC8vID4gIChzaGlmdGVkIC4pCi0gICAgICAgICAgICAgICAgY2FzZSA0NyAgICAgICAgOiBrZXlzeW0gPSA2MyA7IGJyZWFrOyAvLyA/ICAoc2hpZnRlZCAvKQotICAgICAgICAgICAgICAgIGNhc2UgOTYgICAgICAgIDoga2V5c3ltID0gMTI2OyBicmVhazsgLy8gfiAgKHNoaWZ0ZWQgYCkKLSAgICAgICAgICAgICAgICBjYXNlIDkxICAgICAgICA6IGtleXN5bSA9IDEyMzsgYnJlYWs7IC8vIHsgIChzaGlmdGVkIFspCi0gICAgICAgICAgICAgICAgY2FzZSA5MiAgICAgICAgOiBrZXlzeW0gPSAxMjQ7IGJyZWFrOyAvLyB8ICAoc2hpZnRlZCBcKQotICAgICAgICAgICAgICAgIGNhc2UgOTMgICAgICAgIDoga2V5c3ltID0gMTI1OyBicmVhazsgLy8gfSAgKHNoaWZ0ZWQgXSkKLSAgICAgICAgICAgICAgICBjYXNlIDM5ICAgICAgICA6IGtleXN5bSA9IDM0IDsgYnJlYWs7IC8vICIgIChzaGlmdGVkICcpCisgICAgICAgIF9oYW5kbGVSZmJFdmVudDogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9vbktleVByZXNzKSB7CisgICAgICAgICAgICAgICAgVXRpbC5EZWJ1Zygib25LZXlQcmVzcyAiICsgKGUudHlwZSA9PSAna2V5ZG93bicgPyAiZG93biIgOiAidXAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBrZXlzeW06ICIgKyBlLmtleXN5bS5rZXlzeW0gKyAiKCIgKyBlLmtleXN5bS5rZXluYW1lICsgIikiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9vbktleVByZXNzKGUua2V5c3ltLmtleXN5bSwgZS50eXBlID09ICdrZXlkb3duJyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGtleXN5bSA+PSA2NSkgJiYgKGtleXN5bSA8PTkwKSkgewotICAgICAgICAgICAgLyogUmVtYXAgdW5zaGlmdGVkIEEtWiAqLwotICAgICAgICAgICAga2V5c3ltICs9IDMyOwotICAgICAgICB9IGVsc2UgaWYgKGV2dC5rZXlMb2NhdGlvbiA9PT0gMykgewotICAgICAgICAgICAgLy8gbnVtcGFkIGtleXMKLSAgICAgICAgICAgIHN3aXRjaCAoa2V5c3ltKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5NiA6IGtleXN5bSA9IDQ4OyBicmVhazsgLy8gMAotICAgICAgICAgICAgICAgIGNhc2UgOTcgOiBrZXlzeW0gPSA0OTsgYnJlYWs7IC8vIDEKLSAgICAgICAgICAgICAgICBjYXNlIDk4IDoga2V5c3ltID0gNTA7IGJyZWFrOyAvLyAyCi0gICAgICAgICAgICAgICAgY2FzZSA5OSA6IGtleXN5bSA9IDUxOyBicmVhazsgLy8gMwotICAgICAgICAgICAgICAgIGNhc2UgMTAwOiBrZXlzeW0gPSA1MjsgYnJlYWs7IC8vIDQKLSAgICAgICAgICAgICAgICBjYXNlIDEwMToga2V5c3ltID0gNTM7IGJyZWFrOyAvLyA1Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDI6IGtleXN5bSA9IDU0OyBicmVhazsgLy8gNgotICAgICAgICAgICAgICAgIGNhc2UgMTAzOiBrZXlzeW0gPSA1NTsgYnJlYWs7IC8vIDcKLSAgICAgICAgICAgICAgICBjYXNlIDEwNDoga2V5c3ltID0gNTY7IGJyZWFrOyAvLyA4Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDU6IGtleXN5bSA9IDU3OyBicmVhazsgLy8gOQotICAgICAgICAgICAgICAgIGNhc2UgMTA5OiBrZXlzeW0gPSA0NTsgYnJlYWs7IC8vIC0KLSAgICAgICAgICAgICAgICBjYXNlIDExMDoga2V5c3ltID0gNDY7IGJyZWFrOyAvLyAuCi0gICAgICAgICAgICAgICAgY2FzZSAxMTE6IGtleXN5bSA9IDQ3OyBicmVhazsgLy8gLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAgICAgICB9LAogCi0gICAgcmV0dXJuIGtleXN5bTsKLX0KKyAgICAgICAgX2hhbmRsZUtleURvd246IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH0KIAotLyogVHJhbnNsYXRlIERPTSBrZXlQcmVzcyBldmVudCB0byBrZXlzeW0gdmFsdWUgKi8KLWZ1bmN0aW9uIGdldEtleXN5bShldnQpIHsKLSAgICB2YXIga2V5c3ltLCBtc2c7Ci0KLSAgICBpZiAodHlwZW9mKGV2dC53aGljaCkgIT09ICJ1bmRlZmluZWQiKSB7Ci0gICAgICAgIC8vIFdlYktpdCwgRmlyZWZveCwgT3BlcmEKLSAgICAgICAga2V5c3ltID0gZXZ0LndoaWNoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElFOQotICAgICAgICBVdGlsLldhcm4oIndoaWNoIG5vdCBzZXQsIHVzaW5nIGtleUNvZGUiKTsKLSAgICAgICAga2V5c3ltID0gZXZ0LmtleUNvZGU7Ci0gICAgfQotCi0gICAgaWYgKChrZXlzeW0gPiAyNTUpICYmIChrZXlzeW0gPCAweEZGMDApKSB7Ci0gICAgICAgIG1zZyA9ICJNYXBwaW5nIGNoYXJhY3RlciBjb2RlICIgKyBrZXlzeW07Ci0gICAgICAgIC8vIE1hcCBVbmljb2RlIG91dHNpZGUgTGF0aW4gMSB0byBYMTEga2V5c3ltcwotICAgICAgICBrZXlzeW0gPSB1bmljb2RlVGFibGVba2V5c3ltXTsKLSAgICAgICAgaWYgKHR5cGVvZihrZXlzeW0pID09PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICBrZXlzeW0gPSAwOyAKLSAgICAgICAgfQotICAgICAgICBVdGlsLkRlYnVnKG1zZyArICIgdG8gIiArIGtleXN5bSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGtleXN5bTsKLX0KLQotZnVuY3Rpb24gc2hvd19rZXlEb3duTGlzdChraW5kKSB7Ci0gICAgdmFyIGM7Ci0gICAgdmFyIG1zZyA9ICJrZXlEb3duTGlzdCAoIiArIGtpbmQgKyAiKTpcbiI7Ci0gICAgZm9yIChjID0gMDsgYyA8IGtleURvd25MaXN0Lmxlbmd0aDsgYysrKSB7Ci0gICAgICAgIG1zZyA9IG1zZyArICIgICAgIiArIGMgKyAiIC0ga2V5Q29kZTogIiArIGtleURvd25MaXN0W2NdLmtleUNvZGUgKwotICAgICAgICAgICAgICAiIC0gd2hpY2g6ICIgKyBrZXlEb3duTGlzdFtjXS53aGljaCArICJcbiI7Ci0gICAgfQotICAgIFV0aWwuRGVidWcobXNnKTsKLX0KLQotZnVuY3Rpb24gY29weUtleUV2ZW50KGV2dCkgewotICAgIHZhciBtZW1iZXJzID0gWyd0eXBlJywgJ2tleUNvZGUnLCAnY2hhckNvZGUnLCAnd2hpY2gnLAotICAgICAgICAgICAgICAgICAgICdhbHRLZXknLCAnY3RybEtleScsICdzaGlmdEtleScsCi0gICAgICAgICAgICAgICAgICAgJ2tleUxvY2F0aW9uJywgJ2tleUlkZW50aWZpZXInXSwgaSwgb2JqID0ge307Ci0gICAgZm9yIChpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKHR5cGVvZihldnRbbWVtYmVyc1tpXV0pICE9PSAidW5kZWZpbmVkIikgewotICAgICAgICAgICAgb2JqW21lbWJlcnNbaV1dID0gZXZ0W21lbWJlcnNbaV1dOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvYmo7Ci19Ci0KLWZ1bmN0aW9uIHB1c2hLZXlFdmVudChmZXZ0KSB7Ci0gICAga2V5RG93bkxpc3QucHVzaChmZXZ0KTsKLX0KLQotZnVuY3Rpb24gZ2V0S2V5RXZlbnQoa2V5Q29kZSwgcG9wKSB7Ci0gICAgdmFyIGksIGZldnQgPSBudWxsOwotICAgIGZvciAoaSA9IGtleURvd25MaXN0Lmxlbmd0aC0xOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAoa2V5RG93bkxpc3RbaV0ua2V5Q29kZSA9PT0ga2V5Q29kZSkgewotICAgICAgICAgICAgaWYgKCh0eXBlb2YocG9wKSAhPT0gInVuZGVmaW5lZCIpICYmIChwb3ApKSB7Ci0gICAgICAgICAgICAgICAgZmV2dCA9IGtleURvd25MaXN0LnNwbGljZShpLCAxKVswXTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9oYW5kbGVyLmtleWRvd24oZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBidWJibGluZy9kZWZhdWx0IGFjdGlvbnMKKyAgICAgICAgICAgICAgICBVdGlsLnN0b3BFdmVudChlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZldnQgPSBrZXlEb3duTGlzdFtpXTsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIGFuZCBiZWNvbWUgYSBrZXlQcmVzcyBldmVudCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGUgY2hhcmFjdGVyIGNvZGUgdHJhbnNsYXRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZUtleVByZXNzOiBmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9oYW5kbGVyLmtleXByZXNzKGUpKSB7CisgICAgICAgICAgICAgICAgLy8gU3VwcHJlc3MgYnViYmxpbmcvZGVmYXVsdCBhY3Rpb25zCisgICAgICAgICAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIGFuZCBiZWNvbWUgYSBrZXlQcmVzcyBldmVudCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGUgY2hhcmFjdGVyIGNvZGUgdHJhbnNsYXRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIF9oYW5kbGVLZXlVcDogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgICAgICBpZiAodGhpcy5faGFuZGxlci5rZXl1cChlKSkgeworICAgICAgICAgICAgICAgIC8vIFN1cHByZXNzIGJ1YmJsaW5nL2RlZmF1bHQgYWN0aW9ucworICAgICAgICAgICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGV2ZW50IHRvIGJ1YmJsZSBhbmQgYmVjb21lIGEga2V5UHJlc3MgZXZlbnQgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGhhdmUgdGhlIGNoYXJhY3RlciBjb2RlIHRyYW5zbGF0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfYWxsS2V5c1VwOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBVdGlsLkRlYnVnKCI+PiBLZXlib2FyZC5hbGxLZXlzVXAiKTsKKyAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIucmVsZWFzZUFsbCgpOworICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPDwgS2V5Ym9hcmQuYWxsS2V5c1VwIik7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gUHVibGljIG1ldGhvZHMKKworICAgICAgICBncmFiOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAvL1V0aWwuRGVidWcoIj4+IEtleWJvYXJkLmdyYWIiKTsKKyAgICAgICAgICAgIHZhciBjID0gdGhpcy5fdGFyZ2V0OworCisgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KGMsICdrZXlkb3duJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXlkb3duKTsKKyAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ2tleXVwJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXl1cCk7CisgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KGMsICdrZXlwcmVzcycsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5cHJlc3MpOworCisgICAgICAgICAgICAvLyBSZWxlYXNlIChrZXkgdXApIGlmIHdpbmRvdyBsb3NlcyBmb2N1cworICAgICAgICAgICAgVXRpbC5hZGRFdmVudCh3aW5kb3csICdibHVyJywgdGhpcy5fZXZlbnRIYW5kbGVycy5ibHVyKTsKKworICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCI8PCBLZXlib2FyZC5ncmFiIik7CisgICAgICAgIH0sCisKKyAgICAgICAgdW5ncmFiOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAvL1V0aWwuRGVidWcoIj4+IEtleWJvYXJkLnVuZ3JhYiIpOworICAgICAgICAgICAgdmFyIGMgPSB0aGlzLl90YXJnZXQ7CisKKyAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgJ2tleWRvd24nLCB0aGlzLl9ldmVudEhhbmRsZXJzLmtleWRvd24pOworICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAna2V5dXAnLCB0aGlzLl9ldmVudEhhbmRsZXJzLmtleXVwKTsKKyAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgJ2tleXByZXNzJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXlwcmVzcyk7CisgICAgICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KHdpbmRvdywgJ2JsdXInLCB0aGlzLl9ldmVudEhhbmRsZXJzLmJsdXIpOworCisgICAgICAgICAgICAvLyBSZWxlYXNlIChrZXkgdXApIGFsbCBrZXlzIHRoYXQgYXJlIGluIGEgZG93biBzdGF0ZQorICAgICAgICAgICAgdGhpcy5fYWxsS2V5c1VwKCk7CisKKyAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiPj4gS2V5Ym9hcmQudW5ncmFiIik7CisgICAgICAgIH0sCisKKyAgICAgICAgc3luYzogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIuc3luY01vZGlmaWVycyhlKTsKICAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmV2dDsKLX0KKyAgICB9OwogCi1mdW5jdGlvbiBpZ25vcmVLZXlFdmVudChldnQpIHsKLSAgICAvLyBCbGFyZy4gU29tZSBrZXlzIGhhdmUgYSBkaWZmZXJlbnQga2V5Q29kZSBvbiBrZXlEb3duIHZzIGtleVVwCi0gICAgaWYgKGV2dC5rZXlDb2RlID09PSAyMjkpIHsKLSAgICAgICAgLy8gRnJlbmNoIEFaRVJUWSBrZXlib2FyZCBkZWFkIGtleS4KLSAgICAgICAgLy8gTGFtZSB0aGluZyBpcyB0aGF0IHRoZSByZXNwZWN0aXZlIGtleVVwIGlzIDIxOSBzbyB3ZSBjYW4ndAotICAgICAgICAvLyBwcm9wZXJseSBpZ25vcmUgdGhlIGtleVVwIGV2ZW50Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19CisgICAgVXRpbC5tYWtlX3Byb3BlcnRpZXMoS2V5Ym9hcmQsIFsKKyAgICAgICAgWyd0YXJnZXQnLCAgICAgJ3dvJywgJ2RvbSddLCAgLy8gRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBrZXlib2FyZCBpbnB1dAorICAgICAgICBbJ2ZvY3VzZWQnLCAgICAncncnLCAnYm9vbCddLCAvLyBDYXB0dXJlIGFuZCBzZW5kIGtleSBldmVudHMKIAotCi0vLwotLy8gS2V5IEV2ZW50IEhhbmRsaW5nOgotLy8KLS8vIFRoZXJlIGFyZSBzZXZlcmFsIGNoYWxsZW5nZXMgd2hlbiBkZWFsaW5nIHdpdGgga2V5IGV2ZW50czoKLS8vICAgLSBUaGUgbWVhbmluZyBhbmQgdXNlIG9mIGtleUNvZGUsIGNoYXJDb2RlIGFuZCB3aGljaCBkZXBlbmRzIG9uCi0vLyAgICAgYm90aCB0aGUgYnJvd3NlciBhbmQgdGhlIGV2ZW50IHR5cGUgKGtleURvd24vVXAgdnMga2V5UHJlc3MpLgotLy8gICAtIFdlIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUga2V5Ym9hcmQgbGF5b3V0Ci0vLyAgIC0gVGhlIGtleURvd24gYW5kIGtleVVwIGV2ZW50cyBoYXZlIGEga2V5Q29kZSB2YWx1ZSB0aGF0IGhhcyBub3QKLS8vICAgICBiZWVuIHRyYW5zbGF0ZWQgYnkgbW9kaWZpZXIga2V5cy4KLS8vICAgLSBUaGUga2V5UHJlc3MgZXZlbnQgaGFzIGEgdHJhbnNsYXRlZCAoZm9yIGxheW91dCBhbmQgbW9kaWZpZXJzKQotLy8gICAgIGNoYXJhY3RlciBjb2RlIGJ1dCB0aGUgYXR0cmlidXRlIGNvbnRhaW5pbmcgaXQgZGlmZmVycy4ga2V5Q29kZQotLy8gICAgIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGVkIHZhbHVlIGluIFdlYktpdCAoQ2hyb21lL1NhZmFyaSksIE9wZXJhCi0vLyAgICAgMTEgYW5kIElFOS4gY2hhckNvZGUgY29udGFpbnMgdGhlIHZhbHVlIGluIFdlYktpdCBhbmQgRmlyZWZveC4KLS8vICAgICBUaGUgd2hpY2ggYXR0cmlidXRlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvbiBXZWJLaXQsIEZpcmVmb3ggYW5kCi0vLyAgICAgT3BlcmEgMTEuCi0vLyAgIC0gVGhlIGtleURvd24vVXAga2V5Q29kZSB2YWx1ZSBpbmRpY2F0ZXMgKHNvcnQgb2YpIHRoZSBwaHlzaWNhbAotLy8gICAgIGtleSB3YXMgcHJlc3NlZCBidXQgb25seSBmb3Igc3RhbmRhcmQgVVMgbGF5b3V0LiBPbiBhIFVTCi0vLyAgICAga2V5Ym9hcmQsIHRoZSAnLScgYW5kICdfJyBjaGFyYWN0ZXJzIGFyZSBvbiB0aGUgc2FtZSBrZXkgYW5kCi0vLyAgICAgZ2VuZXJhdGUgYSBrZXlDb2RlIHZhbHVlIG9mIDE4OS4gQnV0IG9uIGFuIEFaRVJUWSBrZXlib2FyZCBldmVuCi0vLyAgICAgdGhvdWdoIHRoZXkgYXJlIGRpZmZlcmVudCBwaHlzaWNhbCBrZXlzIHRoZXkgYm90aCBzdGlsbAotLy8gICAgIGdlbmVyYXRlIGEga2V5Q29kZSBvZiAxODkhCi0vLyAgIC0gVG8gcHJldmVudCBhIGtleSBldmVudCBmcm9tIHByb3BhZ2F0aW5nIHRvIHRoZSBicm93c2VyIGFuZAotLy8gICAgIGNhdXNpbmcgdW53YW50ZWQgZGVmYXVsdCBhY3Rpb25zIChzdWNoIGFzIGNsb3NpbmcgYSB0YWIsCi0vLyAgICAgb3BlbmluZyBhIG1lbnUsIHNoaWZ0aW5nIGZvY3VzLCBldGMpIHdlIG11c3Qgc3VwcHJlc3MgdGhpcwotLy8gICAgIGV2ZW50IGluIGJvdGgga2V5RG93biBhbmQga2V5UHJlc3MgYmVjYXVzZSBub3QgYWxsIGtleSBzdHJva2VzCi0vLyAgICAgZ2VuZXJhdGUgb24gYSBrZXlQcmVzcyBldmVudC4gQWxzbywgaW4gV2ViS2l0IGFuZCBJRTkKLS8vICAgICBzdXBwcmVzc2luZyB0aGUga2V5RG93biBwcmV2ZW50cyBhIGtleVByZXNzIGJ1dCBvdGhlciBicm93c2VycwotLy8gICAgIHN0aWxsIGdlbmVyYXRlZCBhIGtleVByZXNzIGV2ZW4gaWYga2V5RG93biBpcyBzdXBwcmVzc2VkLgotLy8KLS8vIEZvciBzYWZlIGtleSBldmVudHMsIHdlIHdhaXQgdW50aWwgdGhlIGtleVByZXNzIGV2ZW50IGJlZm9yZQotLy8gcmVwb3J0aW5nIGEga2V5IGRvd24gZXZlbnQuIEZvciB1bnNhZmUga2V5IGV2ZW50cywgd2UgcmVwb3J0IGEga2V5Ci0vLyBkb3duIGV2ZW50IHdoZW4gdGhlIGtleURvd24gZXZlbnQgZmlyZXMgYW5kIHdlIHN1cHByZXNzIGFueSBmdXJ0aGVyCi0vLyBhY3Rpb25zIChpbmNsdWRpbmcga2V5UHJlc3MpLgotLy8KLS8vIEluIG9yZGVyIHRvIHJlcG9ydCBhIGtleSB1cCBldmVudCB0aGF0IG1hdGNoZXMgd2hhdCB3ZSByZXBvcnRlZAotLy8gZm9yIHRoZSBrZXkgZG93biBldmVudCwgd2Uga2VlcCBhIGxpc3Qgb2Yga2V5cyB0aGF0IGFyZSBjdXJyZW50bHkKLS8vIGRvd24uIFdoZW4gdGhlIGtleURvd24gZXZlbnQgaGFwcGVucywgd2UgYWRkIHRoZSBrZXkgZXZlbnQgdG8gdGhlCi0vLyBsaXN0LiBJZiBpdCBpcyBhIHNhZmUga2V5IGV2ZW50LCB0aGVuIHdlIHVwZGF0ZSB0aGUgd2hpY2ggYXR0cmlidXRlCi0vLyBpbiB0aGUgbW9zdCByZWNlbnQgaXRlbSBvbiB0aGUgbGlzdCB3aGVuIHdlIHJlY2VpdmVkIGEga2V5UHJlc3MKLS8vIGV2ZW50IChrZXlQcmVzcyBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IGtleURvd24pLiBXaGVuIHdlCi0vLyByZWNlaXZlZCBhIGtleVVwIGV2ZW50IHdlIHNlYXJjaCBmb3IgdGhlIGV2ZW50IG9uIHRoZSBsaXN0IHdpdGgKLS8vIGEgbWF0Y2hpbmcga2V5Q29kZSBhbmQgd2UgcmVwb3J0IHRoZSBjaGFyYWN0ZXIgY29kZSB1c2luZyB0aGUgdmFsdWUKLS8vIGluIHRoZSAnd2hpY2gnIGF0dHJpYnV0ZSB0aGF0IHdhcyBzdG9yZWQgd2l0aCB0aGF0IGtleS4KLS8vCi0KLWZ1bmN0aW9uIG9uS2V5RG93bihlKSB7Ci0gICAgaWYgKCEgY29uZi5mb2N1c2VkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB2YXIgZmV2dCA9IG51bGwsIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCksCi0gICAgICAgIGtleXN5bSA9IG51bGwsIHN1cHByZXNzID0gZmFsc2U7Ci0gICAgLy9VdGlsLkRlYnVnKCJvbktleURvd24ga0M6IiArIGV2dC5rZXlDb2RlICsgIiBjQzoiICsgZXZ0LmNoYXJDb2RlICsgIiB3OiIgKyBldnQud2hpY2gpOwotCi0gICAgZmV2dCA9IGNvcHlLZXlFdmVudChldnQpOwotCi0gICAga2V5c3ltID0gZ2V0S2V5c3ltU3BlY2lhbChldnQpOwotICAgIC8vIFNhdmUga2V5c3ltIGRlY29kaW5nIGZvciB1c2UgaW4ga2V5VXAKLSAgICBmZXZ0LmtleXN5bSA9IGtleXN5bTsKLSAgICBpZiAoa2V5c3ltKSB7Ci0gICAgICAgIC8vIElmIGl0IGlzIGEga2V5IG9yIGtleSBjb21iaW5hdGlvbiB0aGF0IG1pZ2h0IHRyaWdnZXIKLSAgICAgICAgLy8gYnJvd3NlciBiZWhhdmlvcnMgb3IgaXQgaGFzIG5vIGNvcnJlc3BvbmRpbmcga2V5UHJlc3MKLSAgICAgICAgLy8gZXZlbnQsIHRoZW4gc2VuZCBpdCBpbW1lZGlhdGVseQotICAgICAgICBpZiAoY29uZi5vbktleVByZXNzICYmICFpZ25vcmVLZXlFdmVudChldnQpKSB7Ci0gICAgICAgICAgICBVdGlsLkRlYnVnKCJvbktleVByZXNzIGRvd24sIGtleXN5bTogIiArIGtleXN5bSArCi0gICAgICAgICAgICAgICAgICAgIiAob25LZXlEb3duIGtleTogIiArIGV2dC5rZXlDb2RlICsKLSAgICAgICAgICAgICAgICAgICAiLCB3aGljaDogIiArIGV2dC53aGljaCArICIpIik7Ci0gICAgICAgICAgICBjb25mLm9uS2V5UHJlc3Moa2V5c3ltLCAxLCBldnQpOwotICAgICAgICB9Ci0gICAgICAgIHN1cHByZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoISBpZ25vcmVLZXlFdmVudChldnQpKSB7Ci0gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBkZXByZXNzZWQga2V5cwotICAgICAgICBwdXNoS2V5RXZlbnQoZmV2dCk7Ci0gICAgICAgIC8vc2hvd19rZXlEb3duTGlzdCgnZG93bicpOwotICAgIH0KLQotICAgIGlmIChzdXBwcmVzcykgewotICAgICAgICAvLyBTdXBwcmVzcyBidWJibGluZy9kZWZhdWx0IGFjdGlvbnMKLSAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIGFuZCBiZWNvbWUgYSBrZXlQcmVzcyBldmVudCB3aGljaAotICAgICAgICAvLyB3aWxsIGhhdmUgdGhlIGNoYXJhY3RlciBjb2RlIHRyYW5zbGF0ZWQKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvbktleVByZXNzKGUpIHsKLSAgICBpZiAoISBjb25mLmZvY3VzZWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHZhciBldnQgPSAoZSA/IGUgOiB3aW5kb3cuZXZlbnQpLAotICAgICAgICBrZGxlbiA9IGtleURvd25MaXN0Lmxlbmd0aCwga2V5c3ltID0gbnVsbDsKLSAgICAvL1V0aWwuRGVidWcoIm9uS2V5UHJlc3Mga0M6IiArIGV2dC5rZXlDb2RlICsgIiBjQzoiICsgZXZ0LmNoYXJDb2RlICsgIiB3OiIgKyBldnQud2hpY2gpOwotICAgIAotICAgIGlmICgoKGV2dC53aGljaCAhPT0gInVuZGVmaW5lZCIpICYmIChldnQud2hpY2ggPT09IDApKSB8fAotICAgICAgICAoZ2V0S2V5c3ltU3BlY2lhbChldnQpKSkgewotICAgICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSBnZW5lcmF0ZSBhIGtleVByZXNzIGV2ZW50IGV2ZW4gaWYga2V5RG93bgotICAgICAgICAvLyBpcyBzdXBwcmVzc2VkLiBCdXQgdGhlIGtleXMgd2Ugd2FudCB0byBzdXBwcmVzcyB3aWxsIGhhdmUKLSAgICAgICAgLy8gZWl0aGVyOgotICAgICAgICAvLyAgICAgLSB0aGUgd2hpY2ggYXR0cmlidXRlIHNldCB0byAwCi0gICAgICAgIC8vICAgICAtIGdldEtleXN5bVNwZWNpYWwoKSB3aWxsIGlkZW50aWZ5IGl0Ci0gICAgICAgIFV0aWwuRGVidWcoIklnbm9yaW5nIHNwZWNpYWwga2V5IGluIGtleVByZXNzIik7Ci0gICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAga2V5c3ltID0gZ2V0S2V5c3ltKGV2dCk7Ci0KLSAgICAvLyBNb2RpZnkgdGhlIHRoZSB3aGljaCBhdHRyaWJ1dGUgaW4gdGhlIGRlcHJlc3NlZCBrZXlzIGxpc3Qgc28KLSAgICAvLyB0aGF0IHRoZSBrZXlVcCBldmVudCB3aWxsIGJlIGFibGUgdG8gaGF2ZSB0aGUgY2hhcmFjdGVyIGNvZGUKLSAgICAvLyB0cmFuc2xhdGlvbiBhdmFpbGFibGUuCi0gICAgaWYgKGtkbGVuID4gMCkgewotICAgICAgICBrZXlEb3duTGlzdFtrZGxlbi0xXS5rZXlzeW0gPSBrZXlzeW07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVXRpbC5XYXJuKCJrZXlEb3duTGlzdCBlbXB0eSB3aGVuIGtleVByZXNzIHRyaWdnZXJlZCIpOwotICAgIH0KLQotICAgIC8vc2hvd19rZXlEb3duTGlzdCgncHJlc3MnKTsKLSAgICAKLSAgICAvLyBTZW5kIHRoZSB0cmFuc2xhdGVkIGtleXN5bQotICAgIGlmIChjb25mLm9uS2V5UHJlc3MgJiYgKGtleXN5bSA+IDApKSB7Ci0gICAgICAgIFV0aWwuRGVidWcoIm9uS2V5UHJlc3MgZG93biwga2V5c3ltOiAiICsga2V5c3ltICsKLSAgICAgICAgICAgICAgICAgICAiIChvbktleVByZXNzIGtleTogIiArIGV2dC5rZXlDb2RlICsKLSAgICAgICAgICAgICAgICAgICAiLCB3aGljaDogIiArIGV2dC53aGljaCArICIpIik7Ci0gICAgICAgIGNvbmYub25LZXlQcmVzcyhrZXlzeW0sIDEsIGV2dCk7Ci0gICAgfQotCi0gICAgLy8gU3RvcCBrZXlwcmVzcyBldmVudHMganVzdCBpbiBjYXNlCi0gICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBvbktleVVwKGUpIHsKLSAgICBpZiAoISBjb25mLmZvY3VzZWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHZhciBmZXZ0ID0gbnVsbCwgZXZ0ID0gKGUgPyBlIDogd2luZG93LmV2ZW50KSwga2V5c3ltOwotICAgIC8vVXRpbC5EZWJ1Zygib25LZXlVcCAgIGtDOiIgKyBldnQua2V5Q29kZSArICIgY0M6IiArIGV2dC5jaGFyQ29kZSArICIgdzoiICsgZXZ0LndoaWNoKTsKLQotICAgIGZldnQgPSBnZXRLZXlFdmVudChldnQua2V5Q29kZSwgdHJ1ZSk7Ci0gICAgCi0gICAgaWYgKGZldnQpIHsKLSAgICAgICAga2V5c3ltID0gZmV2dC5rZXlzeW07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVXRpbC5XYXJuKCJLZXkgZXZlbnQgKGtleUNvZGUgPSAiICsgZXZ0LmtleUNvZGUgKwotICAgICAgICAgICAgICAgICIpIG5vdCBmb3VuZCBvbiBrZXlEb3duTGlzdCIpOwotICAgICAgICBrZXlzeW0gPSAwOwotICAgIH0KLQotICAgIC8vc2hvd19rZXlEb3duTGlzdCgndXAnKTsKLQotICAgIGlmIChjb25mLm9uS2V5UHJlc3MgJiYgKGtleXN5bSA+IDApKSB7Ci0gICAgICAgIC8vVXRpbC5EZWJ1Zygia2V5UHJlc3MgdXAsICAga2V5c3ltOiAiICsga2V5c3ltICsKLSAgICAgICAgLy8gICAgICAgICIgKGtleTogIiArIGV2dC5rZXlDb2RlICsgIiwgd2hpY2g6ICIgKyBldnQud2hpY2ggKyAiKSIpOwotICAgICAgICBVdGlsLkRlYnVnKCJvbktleVByZXNzIHVwLCBrZXlzeW06ICIgKyBrZXlzeW0gKwotICAgICAgICAgICAgICAgICAgICIgKG9uS2V5UHJlc3Mga2V5OiAiICsgZXZ0LmtleUNvZGUgKwotICAgICAgICAgICAgICAgICAgICIsIHdoaWNoOiAiICsgZXZ0LndoaWNoICsgIikiKTsKLSAgICAgICAgY29uZi5vbktleVByZXNzKGtleXN5bSwgMCwgZXZ0KTsKLSAgICB9Ci0gICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBhbGxLZXlzVXAoKSB7Ci0gICAgVXRpbC5EZWJ1ZygiPj4gS2V5Ym9hcmQuYWxsS2V5c1VwIik7Ci0gICAgaWYgKGtleURvd25MaXN0Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgVXRpbC5JbmZvKCJSZWxlYXNpbmcgcHJlc3NlZC9kb3duIGtleXMiKTsKLSAgICB9Ci0gICAgdmFyIGksIGtleXN5bSwgZmV2dCA9IG51bGw7Ci0gICAgZm9yIChpID0ga2V5RG93bkxpc3QubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGZldnQgPSBrZXlEb3duTGlzdC5zcGxpY2UoaSwgMSlbMF07Ci0gICAgICAgIGtleXN5bSA9IGZldnQua2V5c3ltOwotICAgICAgICBpZiAoY29uZi5vbktleVByZXNzICYmIChrZXlzeW0gPiAwKSkgewotICAgICAgICAgICAgVXRpbC5EZWJ1ZygiYWxsS2V5c1VwLCBrZXlzeW06ICIgKyBrZXlzeW0gKwotICAgICAgICAgICAgICAgICAgICAiIChrZXlDb2RlOiAiICsgZmV2dC5rZXlDb2RlICsKLSAgICAgICAgICAgICAgICAgICAgIiwgd2hpY2g6ICIgKyBmZXZ0LndoaWNoICsgIikiKTsKLSAgICAgICAgICAgIGNvbmYub25LZXlQcmVzcyhrZXlzeW0sIDAsIGZldnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIFV0aWwuRGVidWcoIjw8IEtleWJvYXJkLmFsbEtleXNVcCIpOwotICAgIHJldHVybjsKLX0KLQotLy8KLS8vIFB1YmxpYyBBUEkgaW50ZXJmYWNlIGZ1bmN0aW9ucwotLy8KLQotdGhhdC5ncmFiID0gZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBLZXlib2FyZC5ncmFiIik7Ci0gICAgdmFyIGMgPSBjb25mLnRhcmdldDsKLQotICAgIFV0aWwuYWRkRXZlbnQoYywgJ2tleWRvd24nLCBvbktleURvd24pOwotICAgIFV0aWwuYWRkRXZlbnQoYywgJ2tleXVwJywgb25LZXlVcCk7Ci0gICAgVXRpbC5hZGRFdmVudChjLCAna2V5cHJlc3MnLCBvbktleVByZXNzKTsKLQotICAgIC8vIFJlbGVhc2UgKGtleSB1cCkgaWYgd2luZG93IGxvc2VzIGZvY3VzCi0gICAgVXRpbC5hZGRFdmVudCh3aW5kb3csICdibHVyJywgYWxsS2V5c1VwKTsKLQotICAgIC8vVXRpbC5EZWJ1ZygiPDwgS2V5Ym9hcmQuZ3JhYiIpOwotfTsKLQotdGhhdC51bmdyYWIgPSBmdW5jdGlvbigpIHsKLSAgICAvL1V0aWwuRGVidWcoIj4+IEtleWJvYXJkLnVuZ3JhYiIpOwotICAgIHZhciBjID0gY29uZi50YXJnZXQ7Ci0KLSAgICBVdGlsLnJlbW92ZUV2ZW50KGMsICdrZXlkb3duJywgb25LZXlEb3duKTsKLSAgICBVdGlsLnJlbW92ZUV2ZW50KGMsICdrZXl1cCcsIG9uS2V5VXApOwotICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgJ2tleXByZXNzJywgb25LZXlQcmVzcyk7Ci0gICAgVXRpbC5yZW1vdmVFdmVudCh3aW5kb3csICdibHVyJywgYWxsS2V5c1VwKTsKLQotICAgIC8vIFJlbGVhc2UgKGtleSB1cCkgYWxsIGtleXMgdGhhdCBhcmUgaW4gYSBkb3duIHN0YXRlCi0gICAgYWxsS2V5c1VwKCk7Ci0KLSAgICAvL1V0aWwuRGVidWcoIj4+IEtleWJvYXJkLnVuZ3JhYiIpOwotfTsKLQotcmV0dXJuIHRoYXQ7ICAvLyBSZXR1cm4gdGhlIHB1YmxpYyBBUEkgaW50ZXJmYWNlCi0KLX0gIC8vIEVuZCBvZiBLZXlib2FyZCgpCi0KLQotLy8KLS8vIE1vdXNlIGV2ZW50IGhhbmRsZXIKLS8vCi0KLWZ1bmN0aW9uIE1vdXNlKGRlZmF1bHRzKSB7Ci0idXNlIHN0cmljdCI7Ci0KLXZhciB0aGF0ICAgICAgICAgICA9IHt9LCAgLy8gUHVibGljIEFQSSBtZXRob2RzCi0gICAgY29uZiAgICAgICAgICAgPSB7fTsgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcwotCi0vLyBDb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMKLVV0aWwuY29uZl9kZWZhdWx0cyhjb25mLCB0aGF0LCBkZWZhdWx0cywgWwotICAgIFsndGFyZ2V0JywgICAgICAgICAncm8nLCAnZG9tJywgIGRvY3VtZW50LCAnRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBtb3VzZSBpbnB1dCddLAotICAgIFsnZm9jdXNlZCcsICAgICAgICAncncnLCAnYm9vbCcsIHRydWUsICdDYXB0dXJlIGFuZCBzZW5kIG1vdXNlIGNsaWNrcy9tb3ZlbWVudCddLAotICAgIFsnc2NhbGUnLCAgICAgICAgICAncncnLCAnZmxvYXQnLCAxLjAsICdWaWV3cG9ydCBzY2FsZSBmYWN0b3IgMC4wIC0gMS4wJ10sCi0KLSAgICBbJ29uTW91c2VCdXR0b24nLCAgJ3J3JywgJ2Z1bmMnLCBudWxsLCAnSGFuZGxlciBmb3IgbW91c2UgYnV0dG9uIGNsaWNrL3JlbGVhc2UnXSwKLSAgICBbJ29uTW91c2VNb3ZlJywgICAgJ3J3JywgJ2Z1bmMnLCBudWxsLCAnSGFuZGxlciBmb3IgbW91c2UgbW92ZW1lbnQnXSwKLSAgICBbJ3RvdWNoQnV0dG9uJywgICAgJ3J3JywgJ2ludCcsIDEsICdCdXR0b24gbWFzayAoMSwgMiwgNCkgZm9yIHRvdWNoIGRldmljZXMgKDAgbWVhbnMgaWdub3JlIGNsaWNrcyknXQorICAgICAgICBbJ29uS2V5UHJlc3MnLCAncncnLCAnZnVuYyddIC8vIEhhbmRsZXIgZm9yIGtleSBwcmVzcy9yZWxlYXNlCiAgICAgXSk7CiAKKyAgICAvLworICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXIKKyAgICAvLwogCi0vLyAKLS8vIFByaXZhdGUgZnVuY3Rpb25zCi0vLworICAgIE1vdXNlID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7CisgICAgICAgIHRoaXMuX21vdXNlQ2FwdHVyZWQgID0gZmFsc2U7CiAKLWZ1bmN0aW9uIG9uTW91c2VCdXR0b24oZSwgZG93bikgewotICAgIHZhciBldnQsIHBvcywgYm1hc2s7Ci0gICAgaWYgKCEgY29uZi5mb2N1c2VkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBldnQgPSAoZSA/IGUgOiB3aW5kb3cuZXZlbnQpOwotICAgIHBvcyA9IFV0aWwuZ2V0RXZlbnRQb3NpdGlvbihlLCBjb25mLnRhcmdldCwgY29uZi5zY2FsZSk7Ci0gICAgaWYgKGUudG91Y2hlcyB8fCBlLmNoYW5nZWRUb3VjaGVzKSB7Ci0gICAgICAgIC8vIFRvdWNoIGRldmljZQotICAgICAgICBibWFzayA9IGNvbmYudG91Y2hCdXR0b247Ci0gICAgICAgIC8vIElmIGJtYXNrIGlzIHNldAotICAgIH0gZWxzZSBpZiAoZXZ0LndoaWNoKSB7Ci0gICAgICAgIC8qIGV2ZXJ5dGhpbmcgZXhjZXB0IElFICovCi0gICAgICAgIGJtYXNrID0gMSA8PCBldnQuYnV0dG9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIElFIGluY2x1ZGluZyA5ICovCi0gICAgICAgIGJtYXNrID0gKGV2dC5idXR0b24gJiAweDEpICsgICAgICAvLyBMZWZ0Ci0gICAgICAgICAgICAgICAgKGV2dC5idXR0b24gJiAweDIpICogMiArICAvLyBSaWdodAotICAgICAgICAgICAgICAgIChldnQuYnV0dG9uICYgMHg0KSAvIDI7ICAgLy8gTWlkZGxlCi0gICAgfQotICAgIC8vVXRpbC5EZWJ1ZygibW91c2UgIiArIHBvcy54ICsgIiwiICsgcG9zLnkgKyAiIGRvd246ICIgKyBkb3duICsKLSAgICAvLyAgICAgICAgICAgIiBibWFzazogIiArIGJtYXNrICsgIihldnQuYnV0dG9uOiAiICsgZXZ0LmJ1dHRvbiArICIpIik7Ci0gICAgaWYgKGJtYXNrID4gMCAmJiBjb25mLm9uTW91c2VCdXR0b24pIHsKLSAgICAgICAgVXRpbC5EZWJ1Zygib25Nb3VzZUJ1dHRvbiAiICsgKGRvd24gPyAiZG93biIgOiAidXAiKSArCi0gICAgICAgICAgICAgICAgICAgIiwgeDogIiArIHBvcy54ICsgIiwgeTogIiArIHBvcy55ICsgIiwgYm1hc2s6ICIgKyBibWFzayk7Ci0gICAgICAgIGNvbmYub25Nb3VzZUJ1dHRvbihwb3MueCwgcG9zLnksIGRvd24sIGJtYXNrKTsKLSAgICB9Ci0gICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQorICAgICAgICB0aGlzLl9kb3VibGVDbGlja1RpbWVyID0gbnVsbDsKKyAgICAgICAgdGhpcy5fbGFzdFRvdWNoUG9zID0gbnVsbDsKIAotZnVuY3Rpb24gb25Nb3VzZURvd24oZSkgewotICAgIG9uTW91c2VCdXR0b24oZSwgMSk7Ci19CisgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcworICAgICAgICBVdGlsLnNldF9kZWZhdWx0cyh0aGlzLCBkZWZhdWx0cywgeworICAgICAgICAgICAgJ3RhcmdldCc6IGRvY3VtZW50LAorICAgICAgICAgICAgJ2ZvY3VzZWQnOiB0cnVlLAorICAgICAgICAgICAgJ3NjYWxlJzogMS4wLAorICAgICAgICAgICAgJ3RvdWNoQnV0dG9uJzogMQorICAgICAgICB9KTsKIAotZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHsKLSAgICBvbk1vdXNlQnV0dG9uKGUsIDApOwotfQorICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0geworICAgICAgICAgICAgJ21vdXNlZG93bic6IHRoaXMuX2hhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpLAorICAgICAgICAgICAgJ21vdXNldXAnOiB0aGlzLl9oYW5kbGVNb3VzZVVwLmJpbmQodGhpcyksCisgICAgICAgICAgICAnbW91c2Vtb3ZlJzogdGhpcy5faGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyksCisgICAgICAgICAgICAnbW91c2V3aGVlbCc6IHRoaXMuX2hhbmRsZU1vdXNlV2hlZWwuYmluZCh0aGlzKSwKKyAgICAgICAgICAgICdtb3VzZWRpc2FibGUnOiB0aGlzLl9oYW5kbGVNb3VzZURpc2FibGUuYmluZCh0aGlzKQorICAgICAgICB9OworICAgIH07CiAKLWZ1bmN0aW9uIG9uTW91c2VXaGVlbChlKSB7Ci0gICAgdmFyIGV2dCwgcG9zLCBibWFzaywgd2hlZWxEYXRhOwotICAgIGlmICghIGNvbmYuZm9jdXNlZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZXZ0ID0gKGUgPyBlIDogd2luZG93LmV2ZW50KTsKLSAgICBwb3MgPSBVdGlsLmdldEV2ZW50UG9zaXRpb24oZSwgY29uZi50YXJnZXQsIGNvbmYuc2NhbGUpOwotICAgIHdoZWVsRGF0YSA9IGV2dC5kZXRhaWwgPyBldnQuZGV0YWlsICogLTEgOiBldnQud2hlZWxEZWx0YSAvIDQwOwotICAgIGlmICh3aGVlbERhdGEgPiAwKSB7Ci0gICAgICAgIGJtYXNrID0gMSA8PCAzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJtYXNrID0gMSA8PCA0OwotICAgIH0KLSAgICAvL1V0aWwuRGVidWcoJ21vdXNlIHNjcm9sbCBieSAnICsgd2hlZWxEYXRhICsgJzonICsgcG9zLnggKyAiLCIgKyBwb3MueSk7Ci0gICAgaWYgKGNvbmYub25Nb3VzZUJ1dHRvbikgewotICAgICAgICBjb25mLm9uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAxLCBibWFzayk7Ci0gICAgICAgIGNvbmYub25Nb3VzZUJ1dHRvbihwb3MueCwgcG9zLnksIDAsIGJtYXNrKTsKLSAgICB9Ci0gICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQorICAgIE1vdXNlLnByb3RvdHlwZSA9IHsKKyAgICAgICAgLy8gcHJpdmF0ZSBtZXRob2RzCisgICAgICAgIF9jYXB0dXJlTW91c2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIC8vIGNhcHR1cmluZyB0aGUgbW91c2UgZW5zdXJlcyB3ZSBnZXQgdGhlIG1vdXNldXAgZXZlbnQKKyAgICAgICAgICAgIGlmICh0aGlzLl90YXJnZXQuc2V0Q2FwdHVyZSkgeworICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldC5zZXRDYXB0dXJlKCk7CisgICAgICAgICAgICB9CiAKLWZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHsKLSAgICB2YXIgZXZ0LCBwb3M7Ci0gICAgaWYgKCEgY29uZi5mb2N1c2VkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBldnQgPSAoZSA/IGUgOiB3aW5kb3cuZXZlbnQpOwotICAgIHBvcyA9IFV0aWwuZ2V0RXZlbnRQb3NpdGlvbihlLCBjb25mLnRhcmdldCwgY29uZi5zY2FsZSk7Ci0gICAgLy9VdGlsLkRlYnVnKCdtb3VzZSAnICsgZXZ0LndoaWNoICsgJy8nICsgZXZ0LmJ1dHRvbiArICcgdXA6JyArIHBvcy54ICsgIiwiICsgcG9zLnkpOwotICAgIGlmIChjb25mLm9uTW91c2VNb3ZlKSB7Ci0gICAgICAgIGNvbmYub25Nb3VzZU1vdmUocG9zLngsIHBvcy55KTsKLSAgICB9Ci0gICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQorICAgICAgICAgICAgLy8gc29tZSBicm93c2VycyBnaXZlIHVzIG1vdXNldXAgZXZlbnRzIHJlZ2FyZGxlc3MsCisgICAgICAgICAgICAvLyBzbyBpZiB3ZSBuZXZlciBjYXB0dXJlZCB0aGUgbW91c2UsIHdlIGNhbiBkaXNyZWdhcmQgdGhlIGV2ZW50CisgICAgICAgICAgICB0aGlzLl9tb3VzZUNhcHR1cmVkID0gdHJ1ZTsKKyAgICAgICAgfSwKIAotZnVuY3Rpb24gb25Nb3VzZURpc2FibGUoZSkgewotICAgIHZhciBldnQsIHBvczsKLSAgICBpZiAoISBjb25mLmZvY3VzZWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7Ci0gICAgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIGNvbmYudGFyZ2V0LCBjb25mLnNjYWxlKTsKLSAgICAvKiBTdG9wIHByb3BhZ2F0aW9uIGlmIGluc2lkZSBjYW52YXMgYXJlYSAqLwotICAgIGlmICgocG9zLnggPj0gMCkgJiYgKHBvcy55ID49IDApICYmCi0gICAgICAgIChwb3MueCA8IGNvbmYudGFyZ2V0Lm9mZnNldFdpZHRoKSAmJgotICAgICAgICAocG9zLnkgPCBjb25mLnRhcmdldC5vZmZzZXRIZWlnaHQpKSB7Ci0gICAgICAgIC8vVXRpbC5EZWJ1ZygibW91c2UgZXZlbnQgZGlzYWJsZWQiKTsKLSAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy9VdGlsLkRlYnVnKCJtb3VzZSBldmVudCBub3QgZGlzYWJsZWQiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KKyAgICAgICAgX3JlbGVhc2VNb3VzZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3RhcmdldC5yZWxlYXNlQ2FwdHVyZSkgeworICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldC5yZWxlYXNlQ2FwdHVyZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5fbW91c2VDYXB0dXJlZCA9IGZhbHNlOworICAgICAgICB9LAogCi0vLwotLy8gUHVibGljIEFQSSBpbnRlcmZhY2UgZnVuY3Rpb25zCi0vLworICAgICAgICBfcmVzZXREb3VibGVDbGlja1RpbWVyOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB0aGlzLl9kb3VibGVDbGlja1RpbWVyID0gbnVsbDsKKyAgICAgICAgfSwKIAotdGhhdC5ncmFiID0gZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBNb3VzZS5ncmFiIik7Ci0gICAgdmFyIGMgPSBjb25mLnRhcmdldDsKKyAgICAgICAgX2hhbmRsZU1vdXNlQnV0dG9uOiBmdW5jdGlvbiAoZSwgZG93bikgeworICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7Ci0gICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ3RvdWNoc3RhcnQnLCBvbk1vdXNlRG93bik7Ci0gICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ3RvdWNoZW5kJywgb25Nb3VzZVVwKTsKLSAgICAgICAgVXRpbC5hZGRFdmVudChjLCAndG91Y2htb3ZlJywgb25Nb3VzZU1vdmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTsKLSAgICAgICAgVXRpbC5hZGRFdmVudChjLCAnbW91c2V1cCcsIG9uTW91c2VVcCk7Ci0gICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTsKLSAgICAgICAgVXRpbC5hZGRFdmVudChjLCAoVXRpbC5FbmdpbmUuZ2Vja28pID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdoZWVsJywKLSAgICAgICAgICAgICAgICBvbk1vdXNlV2hlZWwpOwotICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLl9ub3RpZnkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnkoZSk7CisgICAgICAgICAgICB9CiAKLSAgICAvKiBXb3JrIGFyb3VuZCByaWdodCBhbmQgbWlkZGxlIGNsaWNrIGJyb3dzZXIgYmVoYXZpb3JzICovCi0gICAgVXRpbC5hZGRFdmVudChkb2N1bWVudCwgJ2NsaWNrJywgb25Nb3VzZURpc2FibGUpOwotICAgIFV0aWwuYWRkRXZlbnQoZG9jdW1lbnQuYm9keSwgJ2NvbnRleHRtZW51Jywgb25Nb3VzZURpc2FibGUpOworICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7CisgICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpOwogCi0gICAgLy9VdGlsLkRlYnVnKCI8PCBNb3VzZS5ncmFiIik7Ci19OworICAgICAgICAgICAgdmFyIGJtYXNrOworICAgICAgICAgICAgaWYgKGUudG91Y2hlcyB8fCBlLmNoYW5nZWRUb3VjaGVzKSB7CisgICAgICAgICAgICAgICAgLy8gVG91Y2ggZGV2aWNlCiAKLXRoYXQudW5ncmFiID0gZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBNb3VzZS51bmdyYWIiKTsKLSAgICB2YXIgYyA9IGNvbmYudGFyZ2V0OworICAgICAgICAgICAgICAgIC8vIFdoZW4gdHdvIHRvdWNoZXMgb2NjdXIgd2l0aGluIDUwMCBtcyBvZiBlYWNoIG90aGVyIGFuZCBhcmUKKyAgICAgICAgICAgICAgICAvLyBjbG9zZXIgdGhhbiAyMCBwaXhlbHMgdG9nZXRoZXIgYSBkb3VibGUgY2xpY2sgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgICAgICAgIGlmIChkb3duID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RvdWJsZUNsaWNrVGltZXIgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RUb3VjaFBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9kb3VibGVDbGlja1RpbWVyKTsKIAotICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKLSAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAndG91Y2hzdGFydCcsIG9uTW91c2VEb3duKTsKLSAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAndG91Y2hlbmQnLCBvbk1vdXNlVXApOwotICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KGMsICd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAnbW91c2Vkb3duJywgb25Nb3VzZURvd24pOwotICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KGMsICdtb3VzZXVwJywgb25Nb3VzZVVwKTsKLSAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpOwotICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KGMsIChVdGlsLkVuZ2luZS5nZWNrbykgPyAnRE9NTW91c2VTY3JvbGwnIDogJ21vdXNld2hlZWwnLAotICAgICAgICAgICAgICAgIG9uTW91c2VXaGVlbCk7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHRvdWNoZXMgaXMgc21hbGwgZW5vdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxhdHRlciB0b3VjaCB0byB0aGUgcG9zaXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdC4KIAotICAgIC8qIFdvcmsgYXJvdW5kIHJpZ2h0IGFuZCBtaWRkbGUgY2xpY2sgYnJvd3NlciBiZWhhdmlvcnMgKi8KLSAgICBVdGlsLnJlbW92ZUV2ZW50KGRvY3VtZW50LCAnY2xpY2snLCBvbk1vdXNlRGlzYWJsZSk7Ci0gICAgVXRpbC5yZW1vdmVFdmVudChkb2N1bWVudC5ib2R5LCAnY29udGV4dG1lbnUnLCBvbk1vdXNlRGlzYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeHMgPSB0aGlzLl9sYXN0VG91Y2hQb3MueCAtIHBvcy54OworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlzID0gdGhpcy5fbGFzdFRvdWNoUG9zLnkgLSBwb3MueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KCh4cyAqIHhzKSArICh5cyAqIHlzKSk7CiAKLSAgICAvL1V0aWwuRGVidWcoIj4+IE1vdXNlLnVuZ3JhYiIpOwotfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBnb2FsIGlzIHRvIHRyaWdnZXIgb24gYSBjZXJ0YWluIHBoeXNpY2FsIHdpZHRoLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZVBpeGVsUmF0aW8gYnJpbmdzIHVzIGEgYml0IGNsb3NlciBidXQgaXMgbm90IG9wdGltYWwuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDIwICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB0aGlzLl9sYXN0VG91Y2hQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQodGhpcy5fcmVzZXREb3VibGVDbGlja1RpbWVyLmJpbmQodGhpcyksIDUwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJtYXNrID0gdGhpcy5fdG91Y2hCdXR0b247CisgICAgICAgICAgICAgICAgLy8gSWYgYm1hc2sgaXMgc2V0CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2dC53aGljaCkgeworICAgICAgICAgICAgICAgIC8qIGV2ZXJ5dGhpbmcgZXhjZXB0IElFICovCisgICAgICAgICAgICAgICAgYm1hc2sgPSAxIDw8IGV2dC5idXR0b247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElFIGluY2x1ZGluZyA5ICovCisgICAgICAgICAgICAgICAgYm1hc2sgPSAoZXZ0LmJ1dHRvbiAmIDB4MSkgKyAgICAgIC8vIExlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChldnQuYnV0dG9uICYgMHgyKSAqIDIgKyAgLy8gUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIChldnQuYnV0dG9uICYgMHg0KSAvIDI7ICAgLy8gTWlkZGxlCisgICAgICAgICAgICB9CiAKLXJldHVybiB0aGF0OyAgLy8gUmV0dXJuIHRoZSBwdWJsaWMgQVBJIGludGVyZmFjZQorICAgICAgICAgICAgaWYgKHRoaXMuX29uTW91c2VCdXR0b24pIHsKKyAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCJvbk1vdXNlQnV0dG9uICIgKyAoZG93biA/ICJkb3duIiA6ICJ1cCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHg6ICIgKyBwb3MueCArICIsIHk6ICIgKyBwb3MueSArICIsIGJtYXNrOiAiICsgYm1hc2spOworICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCBkb3duLCBibWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlsLnN0b3BFdmVudChlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSwKIAotfSAgLy8gRW5kIG9mIE1vdXNlKCkKKyAgICAgICAgX2hhbmRsZU1vdXNlRG93bjogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIHRoaXMuX2NhcHR1cmVNb3VzZSgpOworICAgICAgICAgICAgdGhpcy5faGFuZGxlTW91c2VCdXR0b24oZSwgMSk7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZU1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX21vdXNlQ2FwdHVyZWQpIHsgcmV0dXJuOyB9CisKKyAgICAgICAgICAgIHRoaXMuX2hhbmRsZU1vdXNlQnV0dG9uKGUsIDApOworICAgICAgICAgICAgdGhpcy5fcmVsZWFzZU1vdXNlKCk7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZU1vdXNlV2hlZWw6IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX25vdGlmeSkgeworICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7CisgICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpOworICAgICAgICAgICAgdmFyIHdoZWVsRGF0YSA9IGV2dC5kZXRhaWwgPyBldnQuZGV0YWlsICogLTEgOiBldnQud2hlZWxEZWx0YSAvIDQwOworICAgICAgICAgICAgdmFyIGJtYXNrOworICAgICAgICAgICAgaWYgKHdoZWVsRGF0YSA+IDApIHsKKyAgICAgICAgICAgICAgICBibWFzayA9IDEgPDwgMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm1hc2sgPSAxIDw8IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9vbk1vdXNlQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZUJ1dHRvbihwb3MueCwgcG9zLnksIDEsIGJtYXNrKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMCwgYm1hc2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZU1vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIGlmICghIHRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX25vdGlmeSkgeworICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7CisgICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpOworICAgICAgICAgICAgaWYgKHRoaXMuX29uTW91c2VNb3ZlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZU1vdmUocG9zLngsIHBvcy55KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9LAorCisgICAgICAgIF9oYW5kbGVNb3VzZURpc2FibGU6IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7CisgICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpOworCisgICAgICAgICAgICAvKiBTdG9wIHByb3BhZ2F0aW9uIGlmIGluc2lkZSBjYW52YXMgYXJlYSAqLworICAgICAgICAgICAgaWYgKChwb3MucmVhbHggPj0gMCkgJiYgKHBvcy5yZWFseSA+PSAwKSAmJgorICAgICAgICAgICAgICAgIChwb3MucmVhbHggPCB0aGlzLl90YXJnZXQub2Zmc2V0V2lkdGgpICYmCisgICAgICAgICAgICAgICAgKHBvcy5yZWFseSA8IHRoaXMuX3RhcmdldC5vZmZzZXRIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJtb3VzZSBldmVudCBkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCiAKIAotLyoKLSAqIEJyb3dzZXIga2V5cHJlc3MgdG8gWDExIGtleXN5bSBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzID4gVSswMEZGCi0gKi8KLXVuaWNvZGVUYWJsZSA9IHsKLSAgICAweDAxMDQgOiAweDAxYTEsCi0gICAgMHgwMkQ4IDogMHgwMWEyLAotICAgIDB4MDE0MSA6IDB4MDFhMywKLSAgICAweDAxM0QgOiAweDAxYTUsCi0gICAgMHgwMTVBIDogMHgwMWE2LAotICAgIDB4MDE2MCA6IDB4MDFhOSwKLSAgICAweDAxNUUgOiAweDAxYWEsCi0gICAgMHgwMTY0IDogMHgwMWFiLAotICAgIDB4MDE3OSA6IDB4MDFhYywKLSAgICAweDAxN0QgOiAweDAxYWUsCi0gICAgMHgwMTdCIDogMHgwMWFmLAotICAgIDB4MDEwNSA6IDB4MDFiMSwKLSAgICAweDAyREIgOiAweDAxYjIsCi0gICAgMHgwMTQyIDogMHgwMWIzLAotICAgIDB4MDEzRSA6IDB4MDFiNSwKLSAgICAweDAxNUIgOiAweDAxYjYsCi0gICAgMHgwMkM3IDogMHgwMWI3LAotICAgIDB4MDE2MSA6IDB4MDFiOSwKLSAgICAweDAxNUYgOiAweDAxYmEsCi0gICAgMHgwMTY1IDogMHgwMWJiLAotICAgIDB4MDE3QSA6IDB4MDFiYywKLSAgICAweDAyREQgOiAweDAxYmQsCi0gICAgMHgwMTdFIDogMHgwMWJlLAotICAgIDB4MDE3QyA6IDB4MDFiZiwKLSAgICAweDAxNTQgOiAweDAxYzAsCi0gICAgMHgwMTAyIDogMHgwMWMzLAotICAgIDB4MDEzOSA6IDB4MDFjNSwKLSAgICAweDAxMDYgOiAweDAxYzYsCi0gICAgMHgwMTBDIDogMHgwMWM4LAotICAgIDB4MDExOCA6IDB4MDFjYSwKLSAgICAweDAxMUEgOiAweDAxY2MsCi0gICAgMHgwMTBFIDogMHgwMWNmLAotICAgIDB4MDExMCA6IDB4MDFkMCwKLSAgICAweDAxNDMgOiAweDAxZDEsCi0gICAgMHgwMTQ3IDogMHgwMWQyLAotICAgIDB4MDE1MCA6IDB4MDFkNSwKLSAgICAweDAxNTggOiAweDAxZDgsCi0gICAgMHgwMTZFIDogMHgwMWQ5LAotICAgIDB4MDE3MCA6IDB4MDFkYiwKLSAgICAweDAxNjIgOiAweDAxZGUsCi0gICAgMHgwMTU1IDogMHgwMWUwLAotICAgIDB4MDEwMyA6IDB4MDFlMywKLSAgICAweDAxM0EgOiAweDAxZTUsCi0gICAgMHgwMTA3IDogMHgwMWU2LAotICAgIDB4MDEwRCA6IDB4MDFlOCwKLSAgICAweDAxMTkgOiAweDAxZWEsCi0gICAgMHgwMTFCIDogMHgwMWVjLAotICAgIDB4MDEwRiA6IDB4MDFlZiwKLSAgICAweDAxMTEgOiAweDAxZjAsCi0gICAgMHgwMTQ0IDogMHgwMWYxLAotICAgIDB4MDE0OCA6IDB4MDFmMiwKLSAgICAweDAxNTEgOiAweDAxZjUsCi0gICAgMHgwMTcxIDogMHgwMWZiLAotICAgIDB4MDE1OSA6IDB4MDFmOCwKLSAgICAweDAxNkYgOiAweDAxZjksCi0gICAgMHgwMTYzIDogMHgwMWZlLAotICAgIDB4MDJEOSA6IDB4MDFmZiwKLSAgICAweDAxMjYgOiAweDAyYTEsCi0gICAgMHgwMTI0IDogMHgwMmE2LAotICAgIDB4MDEzMCA6IDB4MDJhOSwKLSAgICAweDAxMUUgOiAweDAyYWIsCi0gICAgMHgwMTM0IDogMHgwMmFjLAotICAgIDB4MDEyNyA6IDB4MDJiMSwKLSAgICAweDAxMjUgOiAweDAyYjYsCi0gICAgMHgwMTMxIDogMHgwMmI5LAotICAgIDB4MDExRiA6IDB4MDJiYiwKLSAgICAweDAxMzUgOiAweDAyYmMsCi0gICAgMHgwMTBBIDogMHgwMmM1LAotICAgIDB4MDEwOCA6IDB4MDJjNiwKLSAgICAweDAxMjAgOiAweDAyZDUsCi0gICAgMHgwMTFDIDogMHgwMmQ4LAotICAgIDB4MDE2QyA6IDB4MDJkZCwKLSAgICAweDAxNUMgOiAweDAyZGUsCi0gICAgMHgwMTBCIDogMHgwMmU1LAotICAgIDB4MDEwOSA6IDB4MDJlNiwKLSAgICAweDAxMjEgOiAweDAyZjUsCi0gICAgMHgwMTFEIDogMHgwMmY4LAotICAgIDB4MDE2RCA6IDB4MDJmZCwKLSAgICAweDAxNUQgOiAweDAyZmUsCi0gICAgMHgwMTM4IDogMHgwM2EyLAotICAgIDB4MDE1NiA6IDB4MDNhMywKLSAgICAweDAxMjggOiAweDAzYTUsCi0gICAgMHgwMTNCIDogMHgwM2E2LAotICAgIDB4MDExMiA6IDB4MDNhYSwKLSAgICAweDAxMjIgOiAweDAzYWIsCi0gICAgMHgwMTY2IDogMHgwM2FjLAotICAgIDB4MDE1NyA6IDB4MDNiMywKLSAgICAweDAxMjkgOiAweDAzYjUsCi0gICAgMHgwMTNDIDogMHgwM2I2LAotICAgIDB4MDExMyA6IDB4MDNiYSwKLSAgICAweDAxMjMgOiAweDAzYmIsCi0gICAgMHgwMTY3IDogMHgwM2JjLAotICAgIDB4MDE0QSA6IDB4MDNiZCwKLSAgICAweDAxNEIgOiAweDAzYmYsCi0gICAgMHgwMTAwIDogMHgwM2MwLAotICAgIDB4MDEyRSA6IDB4MDNjNywKLSAgICAweDAxMTYgOiAweDAzY2MsCi0gICAgMHgwMTJBIDogMHgwM2NmLAotICAgIDB4MDE0NSA6IDB4MDNkMSwKLSAgICAweDAxNEMgOiAweDAzZDIsCi0gICAgMHgwMTM2IDogMHgwM2QzLAotICAgIDB4MDE3MiA6IDB4MDNkOSwKLSAgICAweDAxNjggOiAweDAzZGQsCi0gICAgMHgwMTZBIDogMHgwM2RlLAotICAgIDB4MDEwMSA6IDB4MDNlMCwKLSAgICAweDAxMkYgOiAweDAzZTcsCi0gICAgMHgwMTE3IDogMHgwM2VjLAotICAgIDB4MDEyQiA6IDB4MDNlZiwKLSAgICAweDAxNDYgOiAweDAzZjEsCi0gICAgMHgwMTREIDogMHgwM2YyLAotICAgIDB4MDEzNyA6IDB4MDNmMywKLSAgICAweDAxNzMgOiAweDAzZjksCi0gICAgMHgwMTY5IDogMHgwM2ZkLAotICAgIDB4MDE2QiA6IDB4MDNmZSwKLSAgICAweDFFMDIgOiAweDEwMDFlMDIsCi0gICAgMHgxRTAzIDogMHgxMDAxZTAzLAotICAgIDB4MUUwQSA6IDB4MTAwMWUwYSwKLSAgICAweDFFODAgOiAweDEwMDFlODAsCi0gICAgMHgxRTgyIDogMHgxMDAxZTgyLAotICAgIDB4MUUwQiA6IDB4MTAwMWUwYiwKLSAgICAweDFFRjIgOiAweDEwMDFlZjIsCi0gICAgMHgxRTFFIDogMHgxMDAxZTFlLAotICAgIDB4MUUxRiA6IDB4MTAwMWUxZiwKLSAgICAweDFFNDAgOiAweDEwMDFlNDAsCi0gICAgMHgxRTQxIDogMHgxMDAxZTQxLAotICAgIDB4MUU1NiA6IDB4MTAwMWU1NiwKLSAgICAweDFFODEgOiAweDEwMDFlODEsCi0gICAgMHgxRTU3IDogMHgxMDAxZTU3LAotICAgIDB4MUU4MyA6IDB4MTAwMWU4MywKLSAgICAweDFFNjAgOiAweDEwMDFlNjAsCi0gICAgMHgxRUYzIDogMHgxMDAxZWYzLAotICAgIDB4MUU4NCA6IDB4MTAwMWU4NCwKLSAgICAweDFFODUgOiAweDEwMDFlODUsCi0gICAgMHgxRTYxIDogMHgxMDAxZTYxLAotICAgIDB4MDE3NCA6IDB4MTAwMDE3NCwKLSAgICAweDFFNkEgOiAweDEwMDFlNmEsCi0gICAgMHgwMTc2IDogMHgxMDAwMTc2LAotICAgIDB4MDE3NSA6IDB4MTAwMDE3NSwKLSAgICAweDFFNkIgOiAweDEwMDFlNmIsCi0gICAgMHgwMTc3IDogMHgxMDAwMTc3LAotICAgIDB4MDE1MiA6IDB4MTNiYywKLSAgICAweDAxNTMgOiAweDEzYmQsCi0gICAgMHgwMTc4IDogMHgxM2JlLAotICAgIDB4MjAzRSA6IDB4MDQ3ZSwKLSAgICAweDMwMDIgOiAweDA0YTEsCi0gICAgMHgzMDBDIDogMHgwNGEyLAotICAgIDB4MzAwRCA6IDB4MDRhMywKLSAgICAweDMwMDEgOiAweDA0YTQsCi0gICAgMHgzMEZCIDogMHgwNGE1LAotICAgIDB4MzBGMiA6IDB4MDRhNiwKLSAgICAweDMwQTEgOiAweDA0YTcsCi0gICAgMHgzMEEzIDogMHgwNGE4LAotICAgIDB4MzBBNSA6IDB4MDRhOSwKLSAgICAweDMwQTcgOiAweDA0YWEsCi0gICAgMHgzMEE5IDogMHgwNGFiLAotICAgIDB4MzBFMyA6IDB4MDRhYywKLSAgICAweDMwRTUgOiAweDA0YWQsCi0gICAgMHgzMEU3IDogMHgwNGFlLAotICAgIDB4MzBDMyA6IDB4MDRhZiwKLSAgICAweDMwRkMgOiAweDA0YjAsCi0gICAgMHgzMEEyIDogMHgwNGIxLAotICAgIDB4MzBBNCA6IDB4MDRiMiwKLSAgICAweDMwQTYgOiAweDA0YjMsCi0gICAgMHgzMEE4IDogMHgwNGI0LAotICAgIDB4MzBBQSA6IDB4MDRiNSwKLSAgICAweDMwQUIgOiAweDA0YjYsCi0gICAgMHgzMEFEIDogMHgwNGI3LAotICAgIDB4MzBBRiA6IDB4MDRiOCwKLSAgICAweDMwQjEgOiAweDA0YjksCi0gICAgMHgzMEIzIDogMHgwNGJhLAotICAgIDB4MzBCNSA6IDB4MDRiYiwKLSAgICAweDMwQjcgOiAweDA0YmMsCi0gICAgMHgzMEI5IDogMHgwNGJkLAotICAgIDB4MzBCQiA6IDB4MDRiZSwKLSAgICAweDMwQkQgOiAweDA0YmYsCi0gICAgMHgzMEJGIDogMHgwNGMwLAotICAgIDB4MzBDMSA6IDB4MDRjMSwKLSAgICAweDMwQzQgOiAweDA0YzIsCi0gICAgMHgzMEM2IDogMHgwNGMzLAotICAgIDB4MzBDOCA6IDB4MDRjNCwKLSAgICAweDMwQ0EgOiAweDA0YzUsCi0gICAgMHgzMENCIDogMHgwNGM2LAotICAgIDB4MzBDQyA6IDB4MDRjNywKLSAgICAweDMwQ0QgOiAweDA0YzgsCi0gICAgMHgzMENFIDogMHgwNGM5LAotICAgIDB4MzBDRiA6IDB4MDRjYSwKLSAgICAweDMwRDIgOiAweDA0Y2IsCi0gICAgMHgzMEQ1IDogMHgwNGNjLAotICAgIDB4MzBEOCA6IDB4MDRjZCwKLSAgICAweDMwREIgOiAweDA0Y2UsCi0gICAgMHgzMERFIDogMHgwNGNmLAotICAgIDB4MzBERiA6IDB4MDRkMCwKLSAgICAweDMwRTAgOiAweDA0ZDEsCi0gICAgMHgzMEUxIDogMHgwNGQyLAotICAgIDB4MzBFMiA6IDB4MDRkMywKLSAgICAweDMwRTQgOiAweDA0ZDQsCi0gICAgMHgzMEU2IDogMHgwNGQ1LAotICAgIDB4MzBFOCA6IDB4MDRkNiwKLSAgICAweDMwRTkgOiAweDA0ZDcsCi0gICAgMHgzMEVBIDogMHgwNGQ4LAotICAgIDB4MzBFQiA6IDB4MDRkOSwKLSAgICAweDMwRUMgOiAweDA0ZGEsCi0gICAgMHgzMEVEIDogMHgwNGRiLAotICAgIDB4MzBFRiA6IDB4MDRkYywKLSAgICAweDMwRjMgOiAweDA0ZGQsCi0gICAgMHgzMDlCIDogMHgwNGRlLAotICAgIDB4MzA5QyA6IDB4MDRkZiwKLSAgICAweDA2RjAgOiAweDEwMDA2ZjAsCi0gICAgMHgwNkYxIDogMHgxMDAwNmYxLAotICAgIDB4MDZGMiA6IDB4MTAwMDZmMiwKLSAgICAweDA2RjMgOiAweDEwMDA2ZjMsCi0gICAgMHgwNkY0IDogMHgxMDAwNmY0LAotICAgIDB4MDZGNSA6IDB4MTAwMDZmNSwKLSAgICAweDA2RjYgOiAweDEwMDA2ZjYsCi0gICAgMHgwNkY3IDogMHgxMDAwNmY3LAotICAgIDB4MDZGOCA6IDB4MTAwMDZmOCwKLSAgICAweDA2RjkgOiAweDEwMDA2ZjksCi0gICAgMHgwNjZBIDogMHgxMDAwNjZhLAotICAgIDB4MDY3MCA6IDB4MTAwMDY3MCwKLSAgICAweDA2NzkgOiAweDEwMDA2NzksCi0gICAgMHgwNjdFIDogMHgxMDAwNjdlLAotICAgIDB4MDY4NiA6IDB4MTAwMDY4NiwKLSAgICAweDA2ODggOiAweDEwMDA2ODgsCi0gICAgMHgwNjkxIDogMHgxMDAwNjkxLAotICAgIDB4MDYwQyA6IDB4MDVhYywKLSAgICAweDA2RDQgOiAweDEwMDA2ZDQsCi0gICAgMHgwNjYwIDogMHgxMDAwNjYwLAotICAgIDB4MDY2MSA6IDB4MTAwMDY2MSwKLSAgICAweDA2NjIgOiAweDEwMDA2NjIsCi0gICAgMHgwNjYzIDogMHgxMDAwNjYzLAotICAgIDB4MDY2NCA6IDB4MTAwMDY2NCwKLSAgICAweDA2NjUgOiAweDEwMDA2NjUsCi0gICAgMHgwNjY2IDogMHgxMDAwNjY2LAotICAgIDB4MDY2NyA6IDB4MTAwMDY2NywKLSAgICAweDA2NjggOiAweDEwMDA2NjgsCi0gICAgMHgwNjY5IDogMHgxMDAwNjY5LAotICAgIDB4MDYxQiA6IDB4MDViYiwKLSAgICAweDA2MUYgOiAweDA1YmYsCi0gICAgMHgwNjIxIDogMHgwNWMxLAotICAgIDB4MDYyMiA6IDB4MDVjMiwKLSAgICAweDA2MjMgOiAweDA1YzMsCi0gICAgMHgwNjI0IDogMHgwNWM0LAotICAgIDB4MDYyNSA6IDB4MDVjNSwKLSAgICAweDA2MjYgOiAweDA1YzYsCi0gICAgMHgwNjI3IDogMHgwNWM3LAotICAgIDB4MDYyOCA6IDB4MDVjOCwKLSAgICAweDA2MjkgOiAweDA1YzksCi0gICAgMHgwNjJBIDogMHgwNWNhLAotICAgIDB4MDYyQiA6IDB4MDVjYiwKLSAgICAweDA2MkMgOiAweDA1Y2MsCi0gICAgMHgwNjJEIDogMHgwNWNkLAotICAgIDB4MDYyRSA6IDB4MDVjZSwKLSAgICAweDA2MkYgOiAweDA1Y2YsCi0gICAgMHgwNjMwIDogMHgwNWQwLAotICAgIDB4MDYzMSA6IDB4MDVkMSwKLSAgICAweDA2MzIgOiAweDA1ZDIsCi0gICAgMHgwNjMzIDogMHgwNWQzLAotICAgIDB4MDYzNCA6IDB4MDVkNCwKLSAgICAweDA2MzUgOiAweDA1ZDUsCi0gICAgMHgwNjM2IDogMHgwNWQ2LAotICAgIDB4MDYzNyA6IDB4MDVkNywKLSAgICAweDA2MzggOiAweDA1ZDgsCi0gICAgMHgwNjM5IDogMHgwNWQ5LAotICAgIDB4MDYzQSA6IDB4MDVkYSwKLSAgICAweDA2NDAgOiAweDA1ZTAsCi0gICAgMHgwNjQxIDogMHgwNWUxLAotICAgIDB4MDY0MiA6IDB4MDVlMiwKLSAgICAweDA2NDMgOiAweDA1ZTMsCi0gICAgMHgwNjQ0IDogMHgwNWU0LAotICAgIDB4MDY0NSA6IDB4MDVlNSwKLSAgICAweDA2NDYgOiAweDA1ZTYsCi0gICAgMHgwNjQ3IDogMHgwNWU3LAotICAgIDB4MDY0OCA6IDB4MDVlOCwKLSAgICAweDA2NDkgOiAweDA1ZTksCi0gICAgMHgwNjRBIDogMHgwNWVhLAotICAgIDB4MDY0QiA6IDB4MDVlYiwKLSAgICAweDA2NEMgOiAweDA1ZWMsCi0gICAgMHgwNjREIDogMHgwNWVkLAotICAgIDB4MDY0RSA6IDB4MDVlZSwKLSAgICAweDA2NEYgOiAweDA1ZWYsCi0gICAgMHgwNjUwIDogMHgwNWYwLAotICAgIDB4MDY1MSA6IDB4MDVmMSwKLSAgICAweDA2NTIgOiAweDA1ZjIsCi0gICAgMHgwNjUzIDogMHgxMDAwNjUzLAotICAgIDB4MDY1NCA6IDB4MTAwMDY1NCwKLSAgICAweDA2NTUgOiAweDEwMDA2NTUsCi0gICAgMHgwNjk4IDogMHgxMDAwNjk4LAotICAgIDB4MDZBNCA6IDB4MTAwMDZhNCwKLSAgICAweDA2QTkgOiAweDEwMDA2YTksCi0gICAgMHgwNkFGIDogMHgxMDAwNmFmLAotICAgIDB4MDZCQSA6IDB4MTAwMDZiYSwKLSAgICAweDA2QkUgOiAweDEwMDA2YmUsCi0gICAgMHgwNkNDIDogMHgxMDAwNmNjLAotICAgIDB4MDZEMiA6IDB4MTAwMDZkMiwKLSAgICAweDA2QzEgOiAweDEwMDA2YzEsCi0gICAgMHgwNDkyIDogMHgxMDAwNDkyLAotICAgIDB4MDQ5MyA6IDB4MTAwMDQ5MywKLSAgICAweDA0OTYgOiAweDEwMDA0OTYsCi0gICAgMHgwNDk3IDogMHgxMDAwNDk3LAotICAgIDB4MDQ5QSA6IDB4MTAwMDQ5YSwKLSAgICAweDA0OUIgOiAweDEwMDA0OWIsCi0gICAgMHgwNDlDIDogMHgxMDAwNDljLAotICAgIDB4MDQ5RCA6IDB4MTAwMDQ5ZCwKLSAgICAweDA0QTIgOiAweDEwMDA0YTIsCi0gICAgMHgwNEEzIDogMHgxMDAwNGEzLAotICAgIDB4MDRBRSA6IDB4MTAwMDRhZSwKLSAgICAweDA0QUYgOiAweDEwMDA0YWYsCi0gICAgMHgwNEIwIDogMHgxMDAwNGIwLAotICAgIDB4MDRCMSA6IDB4MTAwMDRiMSwKLSAgICAweDA0QjIgOiAweDEwMDA0YjIsCi0gICAgMHgwNEIzIDogMHgxMDAwNGIzLAotICAgIDB4MDRCNiA6IDB4MTAwMDRiNiwKLSAgICAweDA0QjcgOiAweDEwMDA0YjcsCi0gICAgMHgwNEI4IDogMHgxMDAwNGI4LAotICAgIDB4MDRCOSA6IDB4MTAwMDRiOSwKLSAgICAweDA0QkEgOiAweDEwMDA0YmEsCi0gICAgMHgwNEJCIDogMHgxMDAwNGJiLAotICAgIDB4MDREOCA6IDB4MTAwMDRkOCwKLSAgICAweDA0RDkgOiAweDEwMDA0ZDksCi0gICAgMHgwNEUyIDogMHgxMDAwNGUyLAotICAgIDB4MDRFMyA6IDB4MTAwMDRlMywKLSAgICAweDA0RTggOiAweDEwMDA0ZTgsCi0gICAgMHgwNEU5IDogMHgxMDAwNGU5LAotICAgIDB4MDRFRSA6IDB4MTAwMDRlZSwKLSAgICAweDA0RUYgOiAweDEwMDA0ZWYsCi0gICAgMHgwNDUyIDogMHgwNmExLAotICAgIDB4MDQ1MyA6IDB4MDZhMiwKLSAgICAweDA0NTEgOiAweDA2YTMsCi0gICAgMHgwNDU0IDogMHgwNmE0LAotICAgIDB4MDQ1NSA6IDB4MDZhNSwKLSAgICAweDA0NTYgOiAweDA2YTYsCi0gICAgMHgwNDU3IDogMHgwNmE3LAotICAgIDB4MDQ1OCA6IDB4MDZhOCwKLSAgICAweDA0NTkgOiAweDA2YTksCi0gICAgMHgwNDVBIDogMHgwNmFhLAotICAgIDB4MDQ1QiA6IDB4MDZhYiwKLSAgICAweDA0NUMgOiAweDA2YWMsCi0gICAgMHgwNDkxIDogMHgwNmFkLAotICAgIDB4MDQ1RSA6IDB4MDZhZSwKLSAgICAweDA0NUYgOiAweDA2YWYsCi0gICAgMHgyMTE2IDogMHgwNmIwLAotICAgIDB4MDQwMiA6IDB4MDZiMSwKLSAgICAweDA0MDMgOiAweDA2YjIsCi0gICAgMHgwNDAxIDogMHgwNmIzLAotICAgIDB4MDQwNCA6IDB4MDZiNCwKLSAgICAweDA0MDUgOiAweDA2YjUsCi0gICAgMHgwNDA2IDogMHgwNmI2LAotICAgIDB4MDQwNyA6IDB4MDZiNywKLSAgICAweDA0MDggOiAweDA2YjgsCi0gICAgMHgwNDA5IDogMHgwNmI5LAotICAgIDB4MDQwQSA6IDB4MDZiYSwKLSAgICAweDA0MEIgOiAweDA2YmIsCi0gICAgMHgwNDBDIDogMHgwNmJjLAotICAgIDB4MDQ5MCA6IDB4MDZiZCwKLSAgICAweDA0MEUgOiAweDA2YmUsCi0gICAgMHgwNDBGIDogMHgwNmJmLAotICAgIDB4MDQ0RSA6IDB4MDZjMCwKLSAgICAweDA0MzAgOiAweDA2YzEsCi0gICAgMHgwNDMxIDogMHgwNmMyLAotICAgIDB4MDQ0NiA6IDB4MDZjMywKLSAgICAweDA0MzQgOiAweDA2YzQsCi0gICAgMHgwNDM1IDogMHgwNmM1LAotICAgIDB4MDQ0NCA6IDB4MDZjNiwKLSAgICAweDA0MzMgOiAweDA2YzcsCi0gICAgMHgwNDQ1IDogMHgwNmM4LAotICAgIDB4MDQzOCA6IDB4MDZjOSwKLSAgICAweDA0MzkgOiAweDA2Y2EsCi0gICAgMHgwNDNBIDogMHgwNmNiLAotICAgIDB4MDQzQiA6IDB4MDZjYywKLSAgICAweDA0M0MgOiAweDA2Y2QsCi0gICAgMHgwNDNEIDogMHgwNmNlLAotICAgIDB4MDQzRSA6IDB4MDZjZiwKLSAgICAweDA0M0YgOiAweDA2ZDAsCi0gICAgMHgwNDRGIDogMHgwNmQxLAotICAgIDB4MDQ0MCA6IDB4MDZkMiwKLSAgICAweDA0NDEgOiAweDA2ZDMsCi0gICAgMHgwNDQyIDogMHgwNmQ0LAotICAgIDB4MDQ0MyA6IDB4MDZkNSwKLSAgICAweDA0MzYgOiAweDA2ZDYsCi0gICAgMHgwNDMyIDogMHgwNmQ3LAotICAgIDB4MDQ0QyA6IDB4MDZkOCwKLSAgICAweDA0NEIgOiAweDA2ZDksCi0gICAgMHgwNDM3IDogMHgwNmRhLAotICAgIDB4MDQ0OCA6IDB4MDZkYiwKLSAgICAweDA0NEQgOiAweDA2ZGMsCi0gICAgMHgwNDQ5IDogMHgwNmRkLAotICAgIDB4MDQ0NyA6IDB4MDZkZSwKLSAgICAweDA0NEEgOiAweDA2ZGYsCi0gICAgMHgwNDJFIDogMHgwNmUwLAotICAgIDB4MDQxMCA6IDB4MDZlMSwKLSAgICAweDA0MTEgOiAweDA2ZTIsCi0gICAgMHgwNDI2IDogMHgwNmUzLAotICAgIDB4MDQxNCA6IDB4MDZlNCwKLSAgICAweDA0MTUgOiAweDA2ZTUsCi0gICAgMHgwNDI0IDogMHgwNmU2LAotICAgIDB4MDQxMyA6IDB4MDZlNywKLSAgICAweDA0MjUgOiAweDA2ZTgsCi0gICAgMHgwNDE4IDogMHgwNmU5LAotICAgIDB4MDQxOSA6IDB4MDZlYSwKLSAgICAweDA0MUEgOiAweDA2ZWIsCi0gICAgMHgwNDFCIDogMHgwNmVjLAotICAgIDB4MDQxQyA6IDB4MDZlZCwKLSAgICAweDA0MUQgOiAweDA2ZWUsCi0gICAgMHgwNDFFIDogMHgwNmVmLAotICAgIDB4MDQxRiA6IDB4MDZmMCwKLSAgICAweDA0MkYgOiAweDA2ZjEsCi0gICAgMHgwNDIwIDogMHgwNmYyLAotICAgIDB4MDQyMSA6IDB4MDZmMywKLSAgICAweDA0MjIgOiAweDA2ZjQsCi0gICAgMHgwNDIzIDogMHgwNmY1LAotICAgIDB4MDQxNiA6IDB4MDZmNiwKLSAgICAweDA0MTIgOiAweDA2ZjcsCi0gICAgMHgwNDJDIDogMHgwNmY4LAotICAgIDB4MDQyQiA6IDB4MDZmOSwKLSAgICAweDA0MTcgOiAweDA2ZmEsCi0gICAgMHgwNDI4IDogMHgwNmZiLAotICAgIDB4MDQyRCA6IDB4MDZmYywKLSAgICAweDA0MjkgOiAweDA2ZmQsCi0gICAgMHgwNDI3IDogMHgwNmZlLAotICAgIDB4MDQyQSA6IDB4MDZmZiwKLSAgICAweDAzODYgOiAweDA3YTEsCi0gICAgMHgwMzg4IDogMHgwN2EyLAotICAgIDB4MDM4OSA6IDB4MDdhMywKLSAgICAweDAzOEEgOiAweDA3YTQsCi0gICAgMHgwM0FBIDogMHgwN2E1LAotICAgIDB4MDM4QyA6IDB4MDdhNywKLSAgICAweDAzOEUgOiAweDA3YTgsCi0gICAgMHgwM0FCIDogMHgwN2E5LAotICAgIDB4MDM4RiA6IDB4MDdhYiwKLSAgICAweDAzODUgOiAweDA3YWUsCi0gICAgMHgyMDE1IDogMHgwN2FmLAotICAgIDB4MDNBQyA6IDB4MDdiMSwKLSAgICAweDAzQUQgOiAweDA3YjIsCi0gICAgMHgwM0FFIDogMHgwN2IzLAotICAgIDB4MDNBRiA6IDB4MDdiNCwKLSAgICAweDAzQ0EgOiAweDA3YjUsCi0gICAgMHgwMzkwIDogMHgwN2I2LAotICAgIDB4MDNDQyA6IDB4MDdiNywKLSAgICAweDAzQ0QgOiAweDA3YjgsCi0gICAgMHgwM0NCIDogMHgwN2I5LAotICAgIDB4MDNCMCA6IDB4MDdiYSwKLSAgICAweDAzQ0UgOiAweDA3YmIsCi0gICAgMHgwMzkxIDogMHgwN2MxLAotICAgIDB4MDM5MiA6IDB4MDdjMiwKLSAgICAweDAzOTMgOiAweDA3YzMsCi0gICAgMHgwMzk0IDogMHgwN2M0LAotICAgIDB4MDM5NSA6IDB4MDdjNSwKLSAgICAweDAzOTYgOiAweDA3YzYsCi0gICAgMHgwMzk3IDogMHgwN2M3LAotICAgIDB4MDM5OCA6IDB4MDdjOCwKLSAgICAweDAzOTkgOiAweDA3YzksCi0gICAgMHgwMzlBIDogMHgwN2NhLAotICAgIDB4MDM5QiA6IDB4MDdjYiwKLSAgICAweDAzOUMgOiAweDA3Y2MsCi0gICAgMHgwMzlEIDogMHgwN2NkLAotICAgIDB4MDM5RSA6IDB4MDdjZSwKLSAgICAweDAzOUYgOiAweDA3Y2YsCi0gICAgMHgwM0EwIDogMHgwN2QwLAotICAgIDB4MDNBMSA6IDB4MDdkMSwKLSAgICAweDAzQTMgOiAweDA3ZDIsCi0gICAgMHgwM0E0IDogMHgwN2Q0LAotICAgIDB4MDNBNSA6IDB4MDdkNSwKLSAgICAweDAzQTYgOiAweDA3ZDYsCi0gICAgMHgwM0E3IDogMHgwN2Q3LAotICAgIDB4MDNBOCA6IDB4MDdkOCwKLSAgICAweDAzQTkgOiAweDA3ZDksCi0gICAgMHgwM0IxIDogMHgwN2UxLAotICAgIDB4MDNCMiA6IDB4MDdlMiwKLSAgICAweDAzQjMgOiAweDA3ZTMsCi0gICAgMHgwM0I0IDogMHgwN2U0LAotICAgIDB4MDNCNSA6IDB4MDdlNSwKLSAgICAweDAzQjYgOiAweDA3ZTYsCi0gICAgMHgwM0I3IDogMHgwN2U3LAotICAgIDB4MDNCOCA6IDB4MDdlOCwKLSAgICAweDAzQjkgOiAweDA3ZTksCi0gICAgMHgwM0JBIDogMHgwN2VhLAotICAgIDB4MDNCQiA6IDB4MDdlYiwKLSAgICAweDAzQkMgOiAweDA3ZWMsCi0gICAgMHgwM0JEIDogMHgwN2VkLAotICAgIDB4MDNCRSA6IDB4MDdlZSwKLSAgICAweDAzQkYgOiAweDA3ZWYsCi0gICAgMHgwM0MwIDogMHgwN2YwLAotICAgIDB4MDNDMSA6IDB4MDdmMSwKLSAgICAweDAzQzMgOiAweDA3ZjIsCi0gICAgMHgwM0MyIDogMHgwN2YzLAotICAgIDB4MDNDNCA6IDB4MDdmNCwKLSAgICAweDAzQzUgOiAweDA3ZjUsCi0gICAgMHgwM0M2IDogMHgwN2Y2LAotICAgIDB4MDNDNyA6IDB4MDdmNywKLSAgICAweDAzQzggOiAweDA3ZjgsCi0gICAgMHgwM0M5IDogMHgwN2Y5LAotICAgIDB4MjNCNyA6IDB4MDhhMSwKLSAgICAweDIzMjAgOiAweDA4YTQsCi0gICAgMHgyMzIxIDogMHgwOGE1LAotICAgIDB4MjNBMSA6IDB4MDhhNywKLSAgICAweDIzQTMgOiAweDA4YTgsCi0gICAgMHgyM0E0IDogMHgwOGE5LAotICAgIDB4MjNBNiA6IDB4MDhhYSwKLSAgICAweDIzOUIgOiAweDA4YWIsCi0gICAgMHgyMzlEIDogMHgwOGFjLAotICAgIDB4MjM5RSA6IDB4MDhhZCwKLSAgICAweDIzQTAgOiAweDA4YWUsCi0gICAgMHgyM0E4IDogMHgwOGFmLAotICAgIDB4MjNBQyA6IDB4MDhiMCwKLSAgICAweDIyNjQgOiAweDA4YmMsCi0gICAgMHgyMjYwIDogMHgwOGJkLAotICAgIDB4MjI2NSA6IDB4MDhiZSwKLSAgICAweDIyMkIgOiAweDA4YmYsCi0gICAgMHgyMjM0IDogMHgwOGMwLAotICAgIDB4MjIxRCA6IDB4MDhjMSwKLSAgICAweDIyMUUgOiAweDA4YzIsCi0gICAgMHgyMjA3IDogMHgwOGM1LAotICAgIDB4MjIzQyA6IDB4MDhjOCwKLSAgICAweDIyNDMgOiAweDA4YzksCi0gICAgMHgyMUQ0IDogMHgwOGNkLAotICAgIDB4MjFEMiA6IDB4MDhjZSwKLSAgICAweDIyNjEgOiAweDA4Y2YsCi0gICAgMHgyMjFBIDogMHgwOGQ2LAotICAgIDB4MjI4MiA6IDB4MDhkYSwKLSAgICAweDIyODMgOiAweDA4ZGIsCi0gICAgMHgyMjI5IDogMHgwOGRjLAotICAgIDB4MjIyQSA6IDB4MDhkZCwKLSAgICAweDIyMjcgOiAweDA4ZGUsCi0gICAgMHgyMjI4IDogMHgwOGRmLAotICAgIDB4MjIwMiA6IDB4MDhlZiwKLSAgICAweDAxOTIgOiAweDA4ZjYsCi0gICAgMHgyMTkwIDogMHgwOGZiLAotICAgIDB4MjE5MSA6IDB4MDhmYywKLSAgICAweDIxOTIgOiAweDA4ZmQsCi0gICAgMHgyMTkzIDogMHgwOGZlLAotICAgIDB4MjVDNiA6IDB4MDllMCwKLSAgICAweDI1OTIgOiAweDA5ZTEsCi0gICAgMHgyNDA5IDogMHgwOWUyLAotICAgIDB4MjQwQyA6IDB4MDllMywKLSAgICAweDI0MEQgOiAweDA5ZTQsCi0gICAgMHgyNDBBIDogMHgwOWU1LAotICAgIDB4MjQyNCA6IDB4MDllOCwKLSAgICAweDI0MEIgOiAweDA5ZTksCi0gICAgMHgyNTE4IDogMHgwOWVhLAotICAgIDB4MjUxMCA6IDB4MDllYiwKLSAgICAweDI1MEMgOiAweDA5ZWMsCi0gICAgMHgyNTE0IDogMHgwOWVkLAotICAgIDB4MjUzQyA6IDB4MDllZSwKLSAgICAweDIzQkEgOiAweDA5ZWYsCi0gICAgMHgyM0JCIDogMHgwOWYwLAotICAgIDB4MjUwMCA6IDB4MDlmMSwKLSAgICAweDIzQkMgOiAweDA5ZjIsCi0gICAgMHgyM0JEIDogMHgwOWYzLAotICAgIDB4MjUxQyA6IDB4MDlmNCwKLSAgICAweDI1MjQgOiAweDA5ZjUsCi0gICAgMHgyNTM0IDogMHgwOWY2LAotICAgIDB4MjUyQyA6IDB4MDlmNywKLSAgICAweDI1MDIgOiAweDA5ZjgsCi0gICAgMHgyMDAzIDogMHgwYWExLAotICAgIDB4MjAwMiA6IDB4MGFhMiwKLSAgICAweDIwMDQgOiAweDBhYTMsCi0gICAgMHgyMDA1IDogMHgwYWE0LAotICAgIDB4MjAwNyA6IDB4MGFhNSwKLSAgICAweDIwMDggOiAweDBhYTYsCi0gICAgMHgyMDA5IDogMHgwYWE3LAotICAgIDB4MjAwQSA6IDB4MGFhOCwKLSAgICAweDIwMTQgOiAweDBhYTksCi0gICAgMHgyMDEzIDogMHgwYWFhLAotICAgIDB4MjAyNiA6IDB4MGFhZSwKLSAgICAweDIwMjUgOiAweDBhYWYsCi0gICAgMHgyMTUzIDogMHgwYWIwLAotICAgIDB4MjE1NCA6IDB4MGFiMSwKLSAgICAweDIxNTUgOiAweDBhYjIsCi0gICAgMHgyMTU2IDogMHgwYWIzLAotICAgIDB4MjE1NyA6IDB4MGFiNCwKLSAgICAweDIxNTggOiAweDBhYjUsCi0gICAgMHgyMTU5IDogMHgwYWI2LAotICAgIDB4MjE1QSA6IDB4MGFiNywKLSAgICAweDIxMDUgOiAweDBhYjgsCi0gICAgMHgyMDEyIDogMHgwYWJiLAotICAgIDB4MjE1QiA6IDB4MGFjMywKLSAgICAweDIxNUMgOiAweDBhYzQsCi0gICAgMHgyMTVEIDogMHgwYWM1LAotICAgIDB4MjE1RSA6IDB4MGFjNiwKLSAgICAweDIxMjIgOiAweDBhYzksCi0gICAgMHgyMDE4IDogMHgwYWQwLAotICAgIDB4MjAxOSA6IDB4MGFkMSwKLSAgICAweDIwMUMgOiAweDBhZDIsCi0gICAgMHgyMDFEIDogMHgwYWQzLAotICAgIDB4MjExRSA6IDB4MGFkNCwKLSAgICAweDIwMzIgOiAweDBhZDYsCi0gICAgMHgyMDMzIDogMHgwYWQ3LAotICAgIDB4MjcxRCA6IDB4MGFkOSwKLSAgICAweDI2NjMgOiAweDBhZWMsCi0gICAgMHgyNjY2IDogMHgwYWVkLAotICAgIDB4MjY2NSA6IDB4MGFlZSwKLSAgICAweDI3MjAgOiAweDBhZjAsCi0gICAgMHgyMDIwIDogMHgwYWYxLAotICAgIDB4MjAyMSA6IDB4MGFmMiwKLSAgICAweDI3MTMgOiAweDBhZjMsCi0gICAgMHgyNzE3IDogMHgwYWY0LAotICAgIDB4MjY2RiA6IDB4MGFmNSwKLSAgICAweDI2NkQgOiAweDBhZjYsCi0gICAgMHgyNjQyIDogMHgwYWY3LAotICAgIDB4MjY0MCA6IDB4MGFmOCwKLSAgICAweDI2MEUgOiAweDBhZjksCi0gICAgMHgyMzE1IDogMHgwYWZhLAotICAgIDB4MjExNyA6IDB4MGFmYiwKLSAgICAweDIwMzggOiAweDBhZmMsCi0gICAgMHgyMDFBIDogMHgwYWZkLAotICAgIDB4MjAxRSA6IDB4MGFmZSwKLSAgICAweDIyQTQgOiAweDBiYzIsCi0gICAgMHgyMzBBIDogMHgwYmM0LAotICAgIDB4MjIxOCA6IDB4MGJjYSwKLSAgICAweDIzOTUgOiAweDBiY2MsCi0gICAgMHgyMkE1IDogMHgwYmNlLAotICAgIDB4MjVDQiA6IDB4MGJjZiwKLSAgICAweDIzMDggOiAweDBiZDMsCi0gICAgMHgyMkEzIDogMHgwYmRjLAotICAgIDB4MjJBMiA6IDB4MGJmYywKLSAgICAweDIwMTcgOiAweDBjZGYsCi0gICAgMHgwNUQwIDogMHgwY2UwLAotICAgIDB4MDVEMSA6IDB4MGNlMSwKLSAgICAweDA1RDIgOiAweDBjZTIsCi0gICAgMHgwNUQzIDogMHgwY2UzLAotICAgIDB4MDVENCA6IDB4MGNlNCwKLSAgICAweDA1RDUgOiAweDBjZTUsCi0gICAgMHgwNUQ2IDogMHgwY2U2LAotICAgIDB4MDVENyA6IDB4MGNlNywKLSAgICAweDA1RDggOiAweDBjZTgsCi0gICAgMHgwNUQ5IDogMHgwY2U5LAotICAgIDB4MDVEQSA6IDB4MGNlYSwKLSAgICAweDA1REIgOiAweDBjZWIsCi0gICAgMHgwNURDIDogMHgwY2VjLAotICAgIDB4MDVERCA6IDB4MGNlZCwKLSAgICAweDA1REUgOiAweDBjZWUsCi0gICAgMHgwNURGIDogMHgwY2VmLAotICAgIDB4MDVFMCA6IDB4MGNmMCwKLSAgICAweDA1RTEgOiAweDBjZjEsCi0gICAgMHgwNUUyIDogMHgwY2YyLAotICAgIDB4MDVFMyA6IDB4MGNmMywKLSAgICAweDA1RTQgOiAweDBjZjQsCi0gICAgMHgwNUU1IDogMHgwY2Y1LAotICAgIDB4MDVFNiA6IDB4MGNmNiwKLSAgICAweDA1RTcgOiAweDBjZjcsCi0gICAgMHgwNUU4IDogMHgwY2Y4LAotICAgIDB4MDVFOSA6IDB4MGNmOSwKLSAgICAweDA1RUEgOiAweDBjZmEsCi0gICAgMHgwRTAxIDogMHgwZGExLAotICAgIDB4MEUwMiA6IDB4MGRhMiwKLSAgICAweDBFMDMgOiAweDBkYTMsCi0gICAgMHgwRTA0IDogMHgwZGE0LAotICAgIDB4MEUwNSA6IDB4MGRhNSwKLSAgICAweDBFMDYgOiAweDBkYTYsCi0gICAgMHgwRTA3IDogMHgwZGE3LAotICAgIDB4MEUwOCA6IDB4MGRhOCwKLSAgICAweDBFMDkgOiAweDBkYTksCi0gICAgMHgwRTBBIDogMHgwZGFhLAotICAgIDB4MEUwQiA6IDB4MGRhYiwKLSAgICAweDBFMEMgOiAweDBkYWMsCi0gICAgMHgwRTBEIDogMHgwZGFkLAotICAgIDB4MEUwRSA6IDB4MGRhZSwKLSAgICAweDBFMEYgOiAweDBkYWYsCi0gICAgMHgwRTEwIDogMHgwZGIwLAotICAgIDB4MEUxMSA6IDB4MGRiMSwKLSAgICAweDBFMTIgOiAweDBkYjIsCi0gICAgMHgwRTEzIDogMHgwZGIzLAotICAgIDB4MEUxNCA6IDB4MGRiNCwKLSAgICAweDBFMTUgOiAweDBkYjUsCi0gICAgMHgwRTE2IDogMHgwZGI2LAotICAgIDB4MEUxNyA6IDB4MGRiNywKLSAgICAweDBFMTggOiAweDBkYjgsCi0gICAgMHgwRTE5IDogMHgwZGI5LAotICAgIDB4MEUxQSA6IDB4MGRiYSwKLSAgICAweDBFMUIgOiAweDBkYmIsCi0gICAgMHgwRTFDIDogMHgwZGJjLAotICAgIDB4MEUxRCA6IDB4MGRiZCwKLSAgICAweDBFMUUgOiAweDBkYmUsCi0gICAgMHgwRTFGIDogMHgwZGJmLAotICAgIDB4MEUyMCA6IDB4MGRjMCwKLSAgICAweDBFMjEgOiAweDBkYzEsCi0gICAgMHgwRTIyIDogMHgwZGMyLAotICAgIDB4MEUyMyA6IDB4MGRjMywKLSAgICAweDBFMjQgOiAweDBkYzQsCi0gICAgMHgwRTI1IDogMHgwZGM1LAotICAgIDB4MEUyNiA6IDB4MGRjNiwKLSAgICAweDBFMjcgOiAweDBkYzcsCi0gICAgMHgwRTI4IDogMHgwZGM4LAotICAgIDB4MEUyOSA6IDB4MGRjOSwKLSAgICAweDBFMkEgOiAweDBkY2EsCi0gICAgMHgwRTJCIDogMHgwZGNiLAotICAgIDB4MEUyQyA6IDB4MGRjYywKLSAgICAweDBFMkQgOiAweDBkY2QsCi0gICAgMHgwRTJFIDogMHgwZGNlLAotICAgIDB4MEUyRiA6IDB4MGRjZiwKLSAgICAweDBFMzAgOiAweDBkZDAsCi0gICAgMHgwRTMxIDogMHgwZGQxLAotICAgIDB4MEUzMiA6IDB4MGRkMiwKLSAgICAweDBFMzMgOiAweDBkZDMsCi0gICAgMHgwRTM0IDogMHgwZGQ0LAotICAgIDB4MEUzNSA6IDB4MGRkNSwKLSAgICAweDBFMzYgOiAweDBkZDYsCi0gICAgMHgwRTM3IDogMHgwZGQ3LAotICAgIDB4MEUzOCA6IDB4MGRkOCwKLSAgICAweDBFMzkgOiAweDBkZDksCi0gICAgMHgwRTNBIDogMHgwZGRhLAotICAgIDB4MEUzRiA6IDB4MGRkZiwKLSAgICAweDBFNDAgOiAweDBkZTAsCi0gICAgMHgwRTQxIDogMHgwZGUxLAotICAgIDB4MEU0MiA6IDB4MGRlMiwKLSAgICAweDBFNDMgOiAweDBkZTMsCi0gICAgMHgwRTQ0IDogMHgwZGU0LAotICAgIDB4MEU0NSA6IDB4MGRlNSwKLSAgICAweDBFNDYgOiAweDBkZTYsCi0gICAgMHgwRTQ3IDogMHgwZGU3LAotICAgIDB4MEU0OCA6IDB4MGRlOCwKLSAgICAweDBFNDkgOiAweDBkZTksCi0gICAgMHgwRTRBIDogMHgwZGVhLAotICAgIDB4MEU0QiA6IDB4MGRlYiwKLSAgICAweDBFNEMgOiAweDBkZWMsCi0gICAgMHgwRTREIDogMHgwZGVkLAotICAgIDB4MEU1MCA6IDB4MGRmMCwKLSAgICAweDBFNTEgOiAweDBkZjEsCi0gICAgMHgwRTUyIDogMHgwZGYyLAotICAgIDB4MEU1MyA6IDB4MGRmMywKLSAgICAweDBFNTQgOiAweDBkZjQsCi0gICAgMHgwRTU1IDogMHgwZGY1LAotICAgIDB4MEU1NiA6IDB4MGRmNiwKLSAgICAweDBFNTcgOiAweDBkZjcsCi0gICAgMHgwRTU4IDogMHgwZGY4LAotICAgIDB4MEU1OSA6IDB4MGRmOSwKLSAgICAweDA1ODcgOiAweDEwMDA1ODcsCi0gICAgMHgwNTg5IDogMHgxMDAwNTg5LAotICAgIDB4MDU1RCA6IDB4MTAwMDU1ZCwKLSAgICAweDA1OEEgOiAweDEwMDA1OGEsCi0gICAgMHgwNTVDIDogMHgxMDAwNTVjLAotICAgIDB4MDU1QiA6IDB4MTAwMDU1YiwKLSAgICAweDA1NUUgOiAweDEwMDA1NWUsCi0gICAgMHgwNTMxIDogMHgxMDAwNTMxLAotICAgIDB4MDU2MSA6IDB4MTAwMDU2MSwKLSAgICAweDA1MzIgOiAweDEwMDA1MzIsCi0gICAgMHgwNTYyIDogMHgxMDAwNTYyLAotICAgIDB4MDUzMyA6IDB4MTAwMDUzMywKLSAgICAweDA1NjMgOiAweDEwMDA1NjMsCi0gICAgMHgwNTM0IDogMHgxMDAwNTM0LAotICAgIDB4MDU2NCA6IDB4MTAwMDU2NCwKLSAgICAweDA1MzUgOiAweDEwMDA1MzUsCi0gICAgMHgwNTY1IDogMHgxMDAwNTY1LAotICAgIDB4MDUzNiA6IDB4MTAwMDUzNiwKLSAgICAweDA1NjYgOiAweDEwMDA1NjYsCi0gICAgMHgwNTM3IDogMHgxMDAwNTM3LAotICAgIDB4MDU2NyA6IDB4MTAwMDU2NywKLSAgICAweDA1MzggOiAweDEwMDA1MzgsCi0gICAgMHgwNTY4IDogMHgxMDAwNTY4LAotICAgIDB4MDUzOSA6IDB4MTAwMDUzOSwKLSAgICAweDA1NjkgOiAweDEwMDA1NjksCi0gICAgMHgwNTNBIDogMHgxMDAwNTNhLAotICAgIDB4MDU2QSA6IDB4MTAwMDU2YSwKLSAgICAweDA1M0IgOiAweDEwMDA1M2IsCi0gICAgMHgwNTZCIDogMHgxMDAwNTZiLAotICAgIDB4MDUzQyA6IDB4MTAwMDUzYywKLSAgICAweDA1NkMgOiAweDEwMDA1NmMsCi0gICAgMHgwNTNEIDogMHgxMDAwNTNkLAotICAgIDB4MDU2RCA6IDB4MTAwMDU2ZCwKLSAgICAweDA1M0UgOiAweDEwMDA1M2UsCi0gICAgMHgwNTZFIDogMHgxMDAwNTZlLAotICAgIDB4MDUzRiA6IDB4MTAwMDUzZiwKLSAgICAweDA1NkYgOiAweDEwMDA1NmYsCi0gICAgMHgwNTQwIDogMHgxMDAwNTQwLAotICAgIDB4MDU3MCA6IDB4MTAwMDU3MCwKLSAgICAweDA1NDEgOiAweDEwMDA1NDEsCi0gICAgMHgwNTcxIDogMHgxMDAwNTcxLAotICAgIDB4MDU0MiA6IDB4MTAwMDU0MiwKLSAgICAweDA1NzIgOiAweDEwMDA1NzIsCi0gICAgMHgwNTQzIDogMHgxMDAwNTQzLAotICAgIDB4MDU3MyA6IDB4MTAwMDU3MywKLSAgICAweDA1NDQgOiAweDEwMDA1NDQsCi0gICAgMHgwNTc0IDogMHgxMDAwNTc0LAotICAgIDB4MDU0NSA6IDB4MTAwMDU0NSwKLSAgICAweDA1NzUgOiAweDEwMDA1NzUsCi0gICAgMHgwNTQ2IDogMHgxMDAwNTQ2LAotICAgIDB4MDU3NiA6IDB4MTAwMDU3NiwKLSAgICAweDA1NDcgOiAweDEwMDA1NDcsCi0gICAgMHgwNTc3IDogMHgxMDAwNTc3LAotICAgIDB4MDU0OCA6IDB4MTAwMDU0OCwKLSAgICAweDA1NzggOiAweDEwMDA1NzgsCi0gICAgMHgwNTQ5IDogMHgxMDAwNTQ5LAotICAgIDB4MDU3OSA6IDB4MTAwMDU3OSwKLSAgICAweDA1NEEgOiAweDEwMDA1NGEsCi0gICAgMHgwNTdBIDogMHgxMDAwNTdhLAotICAgIDB4MDU0QiA6IDB4MTAwMDU0YiwKLSAgICAweDA1N0IgOiAweDEwMDA1N2IsCi0gICAgMHgwNTRDIDogMHgxMDAwNTRjLAotICAgIDB4MDU3QyA6IDB4MTAwMDU3YywKLSAgICAweDA1NEQgOiAweDEwMDA1NGQsCi0gICAgMHgwNTdEIDogMHgxMDAwNTdkLAotICAgIDB4MDU0RSA6IDB4MTAwMDU0ZSwKLSAgICAweDA1N0UgOiAweDEwMDA1N2UsCi0gICAgMHgwNTRGIDogMHgxMDAwNTRmLAotICAgIDB4MDU3RiA6IDB4MTAwMDU3ZiwKLSAgICAweDA1NTAgOiAweDEwMDA1NTAsCi0gICAgMHgwNTgwIDogMHgxMDAwNTgwLAotICAgIDB4MDU1MSA6IDB4MTAwMDU1MSwKLSAgICAweDA1ODEgOiAweDEwMDA1ODEsCi0gICAgMHgwNTUyIDogMHgxMDAwNTUyLAotICAgIDB4MDU4MiA6IDB4MTAwMDU4MiwKLSAgICAweDA1NTMgOiAweDEwMDA1NTMsCi0gICAgMHgwNTgzIDogMHgxMDAwNTgzLAotICAgIDB4MDU1NCA6IDB4MTAwMDU1NCwKLSAgICAweDA1ODQgOiAweDEwMDA1ODQsCi0gICAgMHgwNTU1IDogMHgxMDAwNTU1LAotICAgIDB4MDU4NSA6IDB4MTAwMDU4NSwKLSAgICAweDA1NTYgOiAweDEwMDA1NTYsCi0gICAgMHgwNTg2IDogMHgxMDAwNTg2LAotICAgIDB4MDU1QSA6IDB4MTAwMDU1YSwKLSAgICAweDEwRDAgOiAweDEwMDEwZDAsCi0gICAgMHgxMEQxIDogMHgxMDAxMGQxLAotICAgIDB4MTBEMiA6IDB4MTAwMTBkMiwKLSAgICAweDEwRDMgOiAweDEwMDEwZDMsCi0gICAgMHgxMEQ0IDogMHgxMDAxMGQ0LAotICAgIDB4MTBENSA6IDB4MTAwMTBkNSwKLSAgICAweDEwRDYgOiAweDEwMDEwZDYsCi0gICAgMHgxMEQ3IDogMHgxMDAxMGQ3LAotICAgIDB4MTBEOCA6IDB4MTAwMTBkOCwKLSAgICAweDEwRDkgOiAweDEwMDEwZDksCi0gICAgMHgxMERBIDogMHgxMDAxMGRhLAotICAgIDB4MTBEQiA6IDB4MTAwMTBkYiwKLSAgICAweDEwREMgOiAweDEwMDEwZGMsCi0gICAgMHgxMEREIDogMHgxMDAxMGRkLAotICAgIDB4MTBERSA6IDB4MTAwMTBkZSwKLSAgICAweDEwREYgOiAweDEwMDEwZGYsCi0gICAgMHgxMEUwIDogMHgxMDAxMGUwLAotICAgIDB4MTBFMSA6IDB4MTAwMTBlMSwKLSAgICAweDEwRTIgOiAweDEwMDEwZTIsCi0gICAgMHgxMEUzIDogMHgxMDAxMGUzLAotICAgIDB4MTBFNCA6IDB4MTAwMTBlNCwKLSAgICAweDEwRTUgOiAweDEwMDEwZTUsCi0gICAgMHgxMEU2IDogMHgxMDAxMGU2LAotICAgIDB4MTBFNyA6IDB4MTAwMTBlNywKLSAgICAweDEwRTggOiAweDEwMDEwZTgsCi0gICAgMHgxMEU5IDogMHgxMDAxMGU5LAotICAgIDB4MTBFQSA6IDB4MTAwMTBlYSwKLSAgICAweDEwRUIgOiAweDEwMDEwZWIsCi0gICAgMHgxMEVDIDogMHgxMDAxMGVjLAotICAgIDB4MTBFRCA6IDB4MTAwMTBlZCwKLSAgICAweDEwRUUgOiAweDEwMDEwZWUsCi0gICAgMHgxMEVGIDogMHgxMDAxMGVmLAotICAgIDB4MTBGMCA6IDB4MTAwMTBmMCwKLSAgICAweDEwRjEgOiAweDEwMDEwZjEsCi0gICAgMHgxMEYyIDogMHgxMDAxMGYyLAotICAgIDB4MTBGMyA6IDB4MTAwMTBmMywKLSAgICAweDEwRjQgOiAweDEwMDEwZjQsCi0gICAgMHgxMEY1IDogMHgxMDAxMGY1LAotICAgIDB4MTBGNiA6IDB4MTAwMTBmNiwKLSAgICAweDFFOEEgOiAweDEwMDFlOGEsCi0gICAgMHgwMTJDIDogMHgxMDAwMTJjLAotICAgIDB4MDFCNSA6IDB4MTAwMDFiNSwKLSAgICAweDAxRTYgOiAweDEwMDAxZTYsCi0gICAgMHgwMUQyIDogMHgxMDAwMWQxLAotICAgIDB4MDE5RiA6IDB4MTAwMDE5ZiwKLSAgICAweDFFOEIgOiAweDEwMDFlOGIsCi0gICAgMHgwMTJEIDogMHgxMDAwMTJkLAotICAgIDB4MDFCNiA6IDB4MTAwMDFiNiwKLSAgICAweDAxRTcgOiAweDEwMDAxZTcsCi0gICAgMHgwMUQyIDogMHgxMDAwMWQyLAotICAgIDB4MDI3NSA6IDB4MTAwMDI3NSwKLSAgICAweDAxOEYgOiAweDEwMDAxOGYsCi0gICAgMHgwMjU5IDogMHgxMDAwMjU5LAotICAgIDB4MUUzNiA6IDB4MTAwMWUzNiwKLSAgICAweDFFMzcgOiAweDEwMDFlMzcsCi0gICAgMHgxRUEwIDogMHgxMDAxZWEwLAotICAgIDB4MUVBMSA6IDB4MTAwMWVhMSwKLSAgICAweDFFQTIgOiAweDEwMDFlYTIsCi0gICAgMHgxRUEzIDogMHgxMDAxZWEzLAotICAgIDB4MUVBNCA6IDB4MTAwMWVhNCwKLSAgICAweDFFQTUgOiAweDEwMDFlYTUsCi0gICAgMHgxRUE2IDogMHgxMDAxZWE2LAotICAgIDB4MUVBNyA6IDB4MTAwMWVhNywKLSAgICAweDFFQTggOiAweDEwMDFlYTgsCi0gICAgMHgxRUE5IDogMHgxMDAxZWE5LAotICAgIDB4MUVBQSA6IDB4MTAwMWVhYSwKLSAgICAweDFFQUIgOiAweDEwMDFlYWIsCi0gICAgMHgxRUFDIDogMHgxMDAxZWFjLAotICAgIDB4MUVBRCA6IDB4MTAwMWVhZCwKLSAgICAweDFFQUUgOiAweDEwMDFlYWUsCi0gICAgMHgxRUFGIDogMHgxMDAxZWFmLAotICAgIDB4MUVCMCA6IDB4MTAwMWViMCwKLSAgICAweDFFQjEgOiAweDEwMDFlYjEsCi0gICAgMHgxRUIyIDogMHgxMDAxZWIyLAotICAgIDB4MUVCMyA6IDB4MTAwMWViMywKLSAgICAweDFFQjQgOiAweDEwMDFlYjQsCi0gICAgMHgxRUI1IDogMHgxMDAxZWI1LAotICAgIDB4MUVCNiA6IDB4MTAwMWViNiwKLSAgICAweDFFQjcgOiAweDEwMDFlYjcsCi0gICAgMHgxRUI4IDogMHgxMDAxZWI4LAotICAgIDB4MUVCOSA6IDB4MTAwMWViOSwKLSAgICAweDFFQkEgOiAweDEwMDFlYmEsCi0gICAgMHgxRUJCIDogMHgxMDAxZWJiLAotICAgIDB4MUVCQyA6IDB4MTAwMWViYywKLSAgICAweDFFQkQgOiAweDEwMDFlYmQsCi0gICAgMHgxRUJFIDogMHgxMDAxZWJlLAotICAgIDB4MUVCRiA6IDB4MTAwMWViZiwKLSAgICAweDFFQzAgOiAweDEwMDFlYzAsCi0gICAgMHgxRUMxIDogMHgxMDAxZWMxLAotICAgIDB4MUVDMiA6IDB4MTAwMWVjMiwKLSAgICAweDFFQzMgOiAweDEwMDFlYzMsCi0gICAgMHgxRUM0IDogMHgxMDAxZWM0LAotICAgIDB4MUVDNSA6IDB4MTAwMWVjNSwKLSAgICAweDFFQzYgOiAweDEwMDFlYzYsCi0gICAgMHgxRUM3IDogMHgxMDAxZWM3LAotICAgIDB4MUVDOCA6IDB4MTAwMWVjOCwKLSAgICAweDFFQzkgOiAweDEwMDFlYzksCi0gICAgMHgxRUNBIDogMHgxMDAxZWNhLAotICAgIDB4MUVDQiA6IDB4MTAwMWVjYiwKLSAgICAweDFFQ0MgOiAweDEwMDFlY2MsCi0gICAgMHgxRUNEIDogMHgxMDAxZWNkLAotICAgIDB4MUVDRSA6IDB4MTAwMWVjZSwKLSAgICAweDFFQ0YgOiAweDEwMDFlY2YsCi0gICAgMHgxRUQwIDogMHgxMDAxZWQwLAotICAgIDB4MUVEMSA6IDB4MTAwMWVkMSwKLSAgICAweDFFRDIgOiAweDEwMDFlZDIsCi0gICAgMHgxRUQzIDogMHgxMDAxZWQzLAotICAgIDB4MUVENCA6IDB4MTAwMWVkNCwKLSAgICAweDFFRDUgOiAweDEwMDFlZDUsCi0gICAgMHgxRUQ2IDogMHgxMDAxZWQ2LAotICAgIDB4MUVENyA6IDB4MTAwMWVkNywKLSAgICAweDFFRDggOiAweDEwMDFlZDgsCi0gICAgMHgxRUQ5IDogMHgxMDAxZWQ5LAotICAgIDB4MUVEQSA6IDB4MTAwMWVkYSwKLSAgICAweDFFREIgOiAweDEwMDFlZGIsCi0gICAgMHgxRURDIDogMHgxMDAxZWRjLAotICAgIDB4MUVERCA6IDB4MTAwMWVkZCwKLSAgICAweDFFREUgOiAweDEwMDFlZGUsCi0gICAgMHgxRURGIDogMHgxMDAxZWRmLAotICAgIDB4MUVFMCA6IDB4MTAwMWVlMCwKLSAgICAweDFFRTEgOiAweDEwMDFlZTEsCi0gICAgMHgxRUUyIDogMHgxMDAxZWUyLAotICAgIDB4MUVFMyA6IDB4MTAwMWVlMywKLSAgICAweDFFRTQgOiAweDEwMDFlZTQsCi0gICAgMHgxRUU1IDogMHgxMDAxZWU1LAotICAgIDB4MUVFNiA6IDB4MTAwMWVlNiwKLSAgICAweDFFRTcgOiAweDEwMDFlZTcsCi0gICAgMHgxRUU4IDogMHgxMDAxZWU4LAotICAgIDB4MUVFOSA6IDB4MTAwMWVlOSwKLSAgICAweDFFRUEgOiAweDEwMDFlZWEsCi0gICAgMHgxRUVCIDogMHgxMDAxZWViLAotICAgIDB4MUVFQyA6IDB4MTAwMWVlYywKLSAgICAweDFFRUQgOiAweDEwMDFlZWQsCi0gICAgMHgxRUVFIDogMHgxMDAxZWVlLAotICAgIDB4MUVFRiA6IDB4MTAwMWVlZiwKLSAgICAweDFFRjAgOiAweDEwMDFlZjAsCi0gICAgMHgxRUYxIDogMHgxMDAxZWYxLAotICAgIDB4MUVGNCA6IDB4MTAwMWVmNCwKLSAgICAweDFFRjUgOiAweDEwMDFlZjUsCi0gICAgMHgxRUY2IDogMHgxMDAxZWY2LAotICAgIDB4MUVGNyA6IDB4MTAwMWVmNywKLSAgICAweDFFRjggOiAweDEwMDFlZjgsCi0gICAgMHgxRUY5IDogMHgxMDAxZWY5LAotICAgIDB4MDFBMCA6IDB4MTAwMDFhMCwKLSAgICAweDAxQTEgOiAweDEwMDAxYTEsCi0gICAgMHgwMUFGIDogMHgxMDAwMWFmLAotICAgIDB4MDFCMCA6IDB4MTAwMDFiMCwKLSAgICAweDIwQTAgOiAweDEwMDIwYTAsCi0gICAgMHgyMEExIDogMHgxMDAyMGExLAotICAgIDB4MjBBMiA6IDB4MTAwMjBhMiwKLSAgICAweDIwQTMgOiAweDEwMDIwYTMsCi0gICAgMHgyMEE0IDogMHgxMDAyMGE0LAotICAgIDB4MjBBNSA6IDB4MTAwMjBhNSwKLSAgICAweDIwQTYgOiAweDEwMDIwYTYsCi0gICAgMHgyMEE3IDogMHgxMDAyMGE3LAotICAgIDB4MjBBOCA6IDB4MTAwMjBhOCwKLSAgICAweDIwQTkgOiAweDEwMDIwYTksCi0gICAgMHgyMEFBIDogMHgxMDAyMGFhLAotICAgIDB4MjBBQiA6IDB4MTAwMjBhYiwKLSAgICAweDIwQUMgOiAweDIwYWMsCi0gICAgMHgyMDcwIDogMHgxMDAyMDcwLAotICAgIDB4MjA3NCA6IDB4MTAwMjA3NCwKLSAgICAweDIwNzUgOiAweDEwMDIwNzUsCi0gICAgMHgyMDc2IDogMHgxMDAyMDc2LAotICAgIDB4MjA3NyA6IDB4MTAwMjA3NywKLSAgICAweDIwNzggOiAweDEwMDIwNzgsCi0gICAgMHgyMDc5IDogMHgxMDAyMDc5LAotICAgIDB4MjA4MCA6IDB4MTAwMjA4MCwKLSAgICAweDIwODEgOiAweDEwMDIwODEsCi0gICAgMHgyMDgyIDogMHgxMDAyMDgyLAotICAgIDB4MjA4MyA6IDB4MTAwMjA4MywKLSAgICAweDIwODQgOiAweDEwMDIwODQsCi0gICAgMHgyMDg1IDogMHgxMDAyMDg1LAotICAgIDB4MjA4NiA6IDB4MTAwMjA4NiwKLSAgICAweDIwODcgOiAweDEwMDIwODcsCi0gICAgMHgyMDg4IDogMHgxMDAyMDg4LAotICAgIDB4MjA4OSA6IDB4MTAwMjA4OSwKLSAgICAweDIyMDIgOiAweDEwMDIyMDIsCi0gICAgMHgyMjA1IDogMHgxMDAyMjA1LAotICAgIDB4MjIwOCA6IDB4MTAwMjIwOCwKLSAgICAweDIyMDkgOiAweDEwMDIyMDksCi0gICAgMHgyMjBCIDogMHgxMDAyMjBCLAotICAgIDB4MjIxQSA6IDB4MTAwMjIxQSwKLSAgICAweDIyMUIgOiAweDEwMDIyMUIsCi0gICAgMHgyMjFDIDogMHgxMDAyMjFDLAotICAgIDB4MjIyQyA6IDB4MTAwMjIyQywKLSAgICAweDIyMkQgOiAweDEwMDIyMkQsCi0gICAgMHgyMjM1IDogMHgxMDAyMjM1LAotICAgIDB4MjI0NSA6IDB4MTAwMjI0OCwKLSAgICAweDIyNDcgOiAweDEwMDIyNDcsCi0gICAgMHgyMjYyIDogMHgxMDAyMjYyLAotICAgIDB4MjI2MyA6IDB4MTAwMjI2MywKLSAgICAweDI4MDAgOiAweDEwMDI4MDAsCi0gICAgMHgyODAxIDogMHgxMDAyODAxLAotICAgIDB4MjgwMiA6IDB4MTAwMjgwMiwKLSAgICAweDI4MDMgOiAweDEwMDI4MDMsCi0gICAgMHgyODA0IDogMHgxMDAyODA0LAotICAgIDB4MjgwNSA6IDB4MTAwMjgwNSwKLSAgICAweDI4MDYgOiAweDEwMDI4MDYsCi0gICAgMHgyODA3IDogMHgxMDAyODA3LAotICAgIDB4MjgwOCA6IDB4MTAwMjgwOCwKLSAgICAweDI4MDkgOiAweDEwMDI4MDksCi0gICAgMHgyODBhIDogMHgxMDAyODBhLAotICAgIDB4MjgwYiA6IDB4MTAwMjgwYiwKLSAgICAweDI4MGMgOiAweDEwMDI4MGMsCi0gICAgMHgyODBkIDogMHgxMDAyODBkLAotICAgIDB4MjgwZSA6IDB4MTAwMjgwZSwKLSAgICAweDI4MGYgOiAweDEwMDI4MGYsCi0gICAgMHgyODEwIDogMHgxMDAyODEwLAotICAgIDB4MjgxMSA6IDB4MTAwMjgxMSwKLSAgICAweDI4MTIgOiAweDEwMDI4MTIsCi0gICAgMHgyODEzIDogMHgxMDAyODEzLAotICAgIDB4MjgxNCA6IDB4MTAwMjgxNCwKLSAgICAweDI4MTUgOiAweDEwMDI4MTUsCi0gICAgMHgyODE2IDogMHgxMDAyODE2LAotICAgIDB4MjgxNyA6IDB4MTAwMjgxNywKLSAgICAweDI4MTggOiAweDEwMDI4MTgsCi0gICAgMHgyODE5IDogMHgxMDAyODE5LAotICAgIDB4MjgxYSA6IDB4MTAwMjgxYSwKLSAgICAweDI4MWIgOiAweDEwMDI4MWIsCi0gICAgMHgyODFjIDogMHgxMDAyODFjLAotICAgIDB4MjgxZCA6IDB4MTAwMjgxZCwKLSAgICAweDI4MWUgOiAweDEwMDI4MWUsCi0gICAgMHgyODFmIDogMHgxMDAyODFmLAotICAgIDB4MjgyMCA6IDB4MTAwMjgyMCwKLSAgICAweDI4MjEgOiAweDEwMDI4MjEsCi0gICAgMHgyODIyIDogMHgxMDAyODIyLAotICAgIDB4MjgyMyA6IDB4MTAwMjgyMywKLSAgICAweDI4MjQgOiAweDEwMDI4MjQsCi0gICAgMHgyODI1IDogMHgxMDAyODI1LAotICAgIDB4MjgyNiA6IDB4MTAwMjgyNiwKLSAgICAweDI4MjcgOiAweDEwMDI4MjcsCi0gICAgMHgyODI4IDogMHgxMDAyODI4LAotICAgIDB4MjgyOSA6IDB4MTAwMjgyOSwKLSAgICAweDI4MmEgOiAweDEwMDI4MmEsCi0gICAgMHgyODJiIDogMHgxMDAyODJiLAotICAgIDB4MjgyYyA6IDB4MTAwMjgyYywKLSAgICAweDI4MmQgOiAweDEwMDI4MmQsCi0gICAgMHgyODJlIDogMHgxMDAyODJlLAotICAgIDB4MjgyZiA6IDB4MTAwMjgyZiwKLSAgICAweDI4MzAgOiAweDEwMDI4MzAsCi0gICAgMHgyODMxIDogMHgxMDAyODMxLAotICAgIDB4MjgzMiA6IDB4MTAwMjgzMiwKLSAgICAweDI4MzMgOiAweDEwMDI4MzMsCi0gICAgMHgyODM0IDogMHgxMDAyODM0LAotICAgIDB4MjgzNSA6IDB4MTAwMjgzNSwKLSAgICAweDI4MzYgOiAweDEwMDI4MzYsCi0gICAgMHgyODM3IDogMHgxMDAyODM3LAotICAgIDB4MjgzOCA6IDB4MTAwMjgzOCwKLSAgICAweDI4MzkgOiAweDEwMDI4MzksCi0gICAgMHgyODNhIDogMHgxMDAyODNhLAotICAgIDB4MjgzYiA6IDB4MTAwMjgzYiwKLSAgICAweDI4M2MgOiAweDEwMDI4M2MsCi0gICAgMHgyODNkIDogMHgxMDAyODNkLAotICAgIDB4MjgzZSA6IDB4MTAwMjgzZSwKLSAgICAweDI4M2YgOiAweDEwMDI4M2YsCi0gICAgMHgyODQwIDogMHgxMDAyODQwLAotICAgIDB4Mjg0MSA6IDB4MTAwMjg0MSwKLSAgICAweDI4NDIgOiAweDEwMDI4NDIsCi0gICAgMHgyODQzIDogMHgxMDAyODQzLAotICAgIDB4Mjg0NCA6IDB4MTAwMjg0NCwKLSAgICAweDI4NDUgOiAweDEwMDI4NDUsCi0gICAgMHgyODQ2IDogMHgxMDAyODQ2LAotICAgIDB4Mjg0NyA6IDB4MTAwMjg0NywKLSAgICAweDI4NDggOiAweDEwMDI4NDgsCi0gICAgMHgyODQ5IDogMHgxMDAyODQ5LAotICAgIDB4Mjg0YSA6IDB4MTAwMjg0YSwKLSAgICAweDI4NGIgOiAweDEwMDI4NGIsCi0gICAgMHgyODRjIDogMHgxMDAyODRjLAotICAgIDB4Mjg0ZCA6IDB4MTAwMjg0ZCwKLSAgICAweDI4NGUgOiAweDEwMDI4NGUsCi0gICAgMHgyODRmIDogMHgxMDAyODRmLAotICAgIDB4Mjg1MCA6IDB4MTAwMjg1MCwKLSAgICAweDI4NTEgOiAweDEwMDI4NTEsCi0gICAgMHgyODUyIDogMHgxMDAyODUyLAotICAgIDB4Mjg1MyA6IDB4MTAwMjg1MywKLSAgICAweDI4NTQgOiAweDEwMDI4NTQsCi0gICAgMHgyODU1IDogMHgxMDAyODU1LAotICAgIDB4Mjg1NiA6IDB4MTAwMjg1NiwKLSAgICAweDI4NTcgOiAweDEwMDI4NTcsCi0gICAgMHgyODU4IDogMHgxMDAyODU4LAotICAgIDB4Mjg1OSA6IDB4MTAwMjg1OSwKLSAgICAweDI4NWEgOiAweDEwMDI4NWEsCi0gICAgMHgyODViIDogMHgxMDAyODViLAotICAgIDB4Mjg1YyA6IDB4MTAwMjg1YywKLSAgICAweDI4NWQgOiAweDEwMDI4NWQsCi0gICAgMHgyODVlIDogMHgxMDAyODVlLAotICAgIDB4Mjg1ZiA6IDB4MTAwMjg1ZiwKLSAgICAweDI4NjAgOiAweDEwMDI4NjAsCi0gICAgMHgyODYxIDogMHgxMDAyODYxLAotICAgIDB4Mjg2MiA6IDB4MTAwMjg2MiwKLSAgICAweDI4NjMgOiAweDEwMDI4NjMsCi0gICAgMHgyODY0IDogMHgxMDAyODY0LAotICAgIDB4Mjg2NSA6IDB4MTAwMjg2NSwKLSAgICAweDI4NjYgOiAweDEwMDI4NjYsCi0gICAgMHgyODY3IDogMHgxMDAyODY3LAotICAgIDB4Mjg2OCA6IDB4MTAwMjg2OCwKLSAgICAweDI4NjkgOiAweDEwMDI4NjksCi0gICAgMHgyODZhIDogMHgxMDAyODZhLAotICAgIDB4Mjg2YiA6IDB4MTAwMjg2YiwKLSAgICAweDI4NmMgOiAweDEwMDI4NmMsCi0gICAgMHgyODZkIDogMHgxMDAyODZkLAotICAgIDB4Mjg2ZSA6IDB4MTAwMjg2ZSwKLSAgICAweDI4NmYgOiAweDEwMDI4NmYsCi0gICAgMHgyODcwIDogMHgxMDAyODcwLAotICAgIDB4Mjg3MSA6IDB4MTAwMjg3MSwKLSAgICAweDI4NzIgOiAweDEwMDI4NzIsCi0gICAgMHgyODczIDogMHgxMDAyODczLAotICAgIDB4Mjg3NCA6IDB4MTAwMjg3NCwKLSAgICAweDI4NzUgOiAweDEwMDI4NzUsCi0gICAgMHgyODc2IDogMHgxMDAyODc2LAotICAgIDB4Mjg3NyA6IDB4MTAwMjg3NywKLSAgICAweDI4NzggOiAweDEwMDI4NzgsCi0gICAgMHgyODc5IDogMHgxMDAyODc5LAotICAgIDB4Mjg3YSA6IDB4MTAwMjg3YSwKLSAgICAweDI4N2IgOiAweDEwMDI4N2IsCi0gICAgMHgyODdjIDogMHgxMDAyODdjLAotICAgIDB4Mjg3ZCA6IDB4MTAwMjg3ZCwKLSAgICAweDI4N2UgOiAweDEwMDI4N2UsCi0gICAgMHgyODdmIDogMHgxMDAyODdmLAotICAgIDB4Mjg4MCA6IDB4MTAwMjg4MCwKLSAgICAweDI4ODEgOiAweDEwMDI4ODEsCi0gICAgMHgyODgyIDogMHgxMDAyODgyLAotICAgIDB4Mjg4MyA6IDB4MTAwMjg4MywKLSAgICAweDI4ODQgOiAweDEwMDI4ODQsCi0gICAgMHgyODg1IDogMHgxMDAyODg1LAotICAgIDB4Mjg4NiA6IDB4MTAwMjg4NiwKLSAgICAweDI4ODcgOiAweDEwMDI4ODcsCi0gICAgMHgyODg4IDogMHgxMDAyODg4LAotICAgIDB4Mjg4OSA6IDB4MTAwMjg4OSwKLSAgICAweDI4OGEgOiAweDEwMDI4OGEsCi0gICAgMHgyODhiIDogMHgxMDAyODhiLAotICAgIDB4Mjg4YyA6IDB4MTAwMjg4YywKLSAgICAweDI4OGQgOiAweDEwMDI4OGQsCi0gICAgMHgyODhlIDogMHgxMDAyODhlLAotICAgIDB4Mjg4ZiA6IDB4MTAwMjg4ZiwKLSAgICAweDI4OTAgOiAweDEwMDI4OTAsCi0gICAgMHgyODkxIDogMHgxMDAyODkxLAotICAgIDB4Mjg5MiA6IDB4MTAwMjg5MiwKLSAgICAweDI4OTMgOiAweDEwMDI4OTMsCi0gICAgMHgyODk0IDogMHgxMDAyODk0LAotICAgIDB4Mjg5NSA6IDB4MTAwMjg5NSwKLSAgICAweDI4OTYgOiAweDEwMDI4OTYsCi0gICAgMHgyODk3IDogMHgxMDAyODk3LAotICAgIDB4Mjg5OCA6IDB4MTAwMjg5OCwKLSAgICAweDI4OTkgOiAweDEwMDI4OTksCi0gICAgMHgyODlhIDogMHgxMDAyODlhLAotICAgIDB4Mjg5YiA6IDB4MTAwMjg5YiwKLSAgICAweDI4OWMgOiAweDEwMDI4OWMsCi0gICAgMHgyODlkIDogMHgxMDAyODlkLAotICAgIDB4Mjg5ZSA6IDB4MTAwMjg5ZSwKLSAgICAweDI4OWYgOiAweDEwMDI4OWYsCi0gICAgMHgyOGEwIDogMHgxMDAyOGEwLAotICAgIDB4MjhhMSA6IDB4MTAwMjhhMSwKLSAgICAweDI4YTIgOiAweDEwMDI4YTIsCi0gICAgMHgyOGEzIDogMHgxMDAyOGEzLAotICAgIDB4MjhhNCA6IDB4MTAwMjhhNCwKLSAgICAweDI4YTUgOiAweDEwMDI4YTUsCi0gICAgMHgyOGE2IDogMHgxMDAyOGE2LAotICAgIDB4MjhhNyA6IDB4MTAwMjhhNywKLSAgICAweDI4YTggOiAweDEwMDI4YTgsCi0gICAgMHgyOGE5IDogMHgxMDAyOGE5LAotICAgIDB4MjhhYSA6IDB4MTAwMjhhYSwKLSAgICAweDI4YWIgOiAweDEwMDI4YWIsCi0gICAgMHgyOGFjIDogMHgxMDAyOGFjLAotICAgIDB4MjhhZCA6IDB4MTAwMjhhZCwKLSAgICAweDI4YWUgOiAweDEwMDI4YWUsCi0gICAgMHgyOGFmIDogMHgxMDAyOGFmLAotICAgIDB4MjhiMCA6IDB4MTAwMjhiMCwKLSAgICAweDI4YjEgOiAweDEwMDI4YjEsCi0gICAgMHgyOGIyIDogMHgxMDAyOGIyLAotICAgIDB4MjhiMyA6IDB4MTAwMjhiMywKLSAgICAweDI4YjQgOiAweDEwMDI4YjQsCi0gICAgMHgyOGI1IDogMHgxMDAyOGI1LAotICAgIDB4MjhiNiA6IDB4MTAwMjhiNiwKLSAgICAweDI4YjcgOiAweDEwMDI4YjcsCi0gICAgMHgyOGI4IDogMHgxMDAyOGI4LAotICAgIDB4MjhiOSA6IDB4MTAwMjhiOSwKLSAgICAweDI4YmEgOiAweDEwMDI4YmEsCi0gICAgMHgyOGJiIDogMHgxMDAyOGJiLAotICAgIDB4MjhiYyA6IDB4MTAwMjhiYywKLSAgICAweDI4YmQgOiAweDEwMDI4YmQsCi0gICAgMHgyOGJlIDogMHgxMDAyOGJlLAotICAgIDB4MjhiZiA6IDB4MTAwMjhiZiwKLSAgICAweDI4YzAgOiAweDEwMDI4YzAsCi0gICAgMHgyOGMxIDogMHgxMDAyOGMxLAotICAgIDB4MjhjMiA6IDB4MTAwMjhjMiwKLSAgICAweDI4YzMgOiAweDEwMDI4YzMsCi0gICAgMHgyOGM0IDogMHgxMDAyOGM0LAotICAgIDB4MjhjNSA6IDB4MTAwMjhjNSwKLSAgICAweDI4YzYgOiAweDEwMDI4YzYsCi0gICAgMHgyOGM3IDogMHgxMDAyOGM3LAotICAgIDB4MjhjOCA6IDB4MTAwMjhjOCwKLSAgICAweDI4YzkgOiAweDEwMDI4YzksCi0gICAgMHgyOGNhIDogMHgxMDAyOGNhLAotICAgIDB4MjhjYiA6IDB4MTAwMjhjYiwKLSAgICAweDI4Y2MgOiAweDEwMDI4Y2MsCi0gICAgMHgyOGNkIDogMHgxMDAyOGNkLAotICAgIDB4MjhjZSA6IDB4MTAwMjhjZSwKLSAgICAweDI4Y2YgOiAweDEwMDI4Y2YsCi0gICAgMHgyOGQwIDogMHgxMDAyOGQwLAotICAgIDB4MjhkMSA6IDB4MTAwMjhkMSwKLSAgICAweDI4ZDIgOiAweDEwMDI4ZDIsCi0gICAgMHgyOGQzIDogMHgxMDAyOGQzLAotICAgIDB4MjhkNCA6IDB4MTAwMjhkNCwKLSAgICAweDI4ZDUgOiAweDEwMDI4ZDUsCi0gICAgMHgyOGQ2IDogMHgxMDAyOGQ2LAotICAgIDB4MjhkNyA6IDB4MTAwMjhkNywKLSAgICAweDI4ZDggOiAweDEwMDI4ZDgsCi0gICAgMHgyOGQ5IDogMHgxMDAyOGQ5LAotICAgIDB4MjhkYSA6IDB4MTAwMjhkYSwKLSAgICAweDI4ZGIgOiAweDEwMDI4ZGIsCi0gICAgMHgyOGRjIDogMHgxMDAyOGRjLAotICAgIDB4MjhkZCA6IDB4MTAwMjhkZCwKLSAgICAweDI4ZGUgOiAweDEwMDI4ZGUsCi0gICAgMHgyOGRmIDogMHgxMDAyOGRmLAotICAgIDB4MjhlMCA6IDB4MTAwMjhlMCwKLSAgICAweDI4ZTEgOiAweDEwMDI4ZTEsCi0gICAgMHgyOGUyIDogMHgxMDAyOGUyLAotICAgIDB4MjhlMyA6IDB4MTAwMjhlMywgCi0gICAgMHgyOGU0IDogMHgxMDAyOGU0LAotICAgIDB4MjhlNSA6IDB4MTAwMjhlNSwKLSAgICAweDI4ZTYgOiAweDEwMDI4ZTYsCi0gICAgMHgyOGU3IDogMHgxMDAyOGU3LAotICAgIDB4MjhlOCA6IDB4MTAwMjhlOCwKLSAgICAweDI4ZTkgOiAweDEwMDI4ZTksCi0gICAgMHgyOGVhIDogMHgxMDAyOGVhLAotICAgIDB4MjhlYiA6IDB4MTAwMjhlYiwKLSAgICAweDI4ZWMgOiAweDEwMDI4ZWMsCi0gICAgMHgyOGVkIDogMHgxMDAyOGVkLAotICAgIDB4MjhlZSA6IDB4MTAwMjhlZSwKLSAgICAweDI4ZWYgOiAweDEwMDI4ZWYsCi0gICAgMHgyOGYwIDogMHgxMDAyOGYwLAotICAgIDB4MjhmMSA6IDB4MTAwMjhmMSwKLSAgICAweDI4ZjIgOiAweDEwMDI4ZjIsCi0gICAgMHgyOGYzIDogMHgxMDAyOGYzLAotICAgIDB4MjhmNCA6IDB4MTAwMjhmNCwKLSAgICAweDI4ZjUgOiAweDEwMDI4ZjUsCi0gICAgMHgyOGY2IDogMHgxMDAyOGY2LAotICAgIDB4MjhmNyA6IDB4MTAwMjhmNywKLSAgICAweDI4ZjggOiAweDEwMDI4ZjgsCi0gICAgMHgyOGY5IDogMHgxMDAyOGY5LAotICAgIDB4MjhmYSA6IDB4MTAwMjhmYSwKLSAgICAweDI4ZmIgOiAweDEwMDI4ZmIsCi0gICAgMHgyOGZjIDogMHgxMDAyOGZjLAotICAgIDB4MjhmZCA6IDB4MTAwMjhmZCwKLSAgICAweDI4ZmUgOiAweDEwMDI4ZmUsCi0gICAgMHgyOGZmIDogMHgxMDAyOGZmCi19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAgICAgZ3JhYjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIGMgPSB0aGlzLl90YXJnZXQ7CisKKyAgICAgICAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KGMsICd0b3VjaHN0YXJ0JywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRvd24pOworICAgICAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQod2luZG93LCAndG91Y2hlbmQnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApOworICAgICAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ3RvdWNoZW5kJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXVwKTsKKyAgICAgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KGMsICd0b3VjaG1vdmUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlbW92ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ21vdXNlZG93bicsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vkb3duKTsKKyAgICAgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KHdpbmRvdywgJ21vdXNldXAnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApOworICAgICAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ21vdXNldXAnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApOworICAgICAgICAgICAgICAgIFV0aWwuYWRkRXZlbnQoYywgJ21vdXNlbW92ZScsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vtb3ZlKTsKKyAgICAgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KGMsIChVdGlsLkVuZ2luZS5nZWNrbykgPyAnRE9NTW91c2VTY3JvbGwnIDogJ21vdXNld2hlZWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXdoZWVsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV29yayBhcm91bmQgcmlnaHQgYW5kIG1pZGRsZSBjbGljayBicm93c2VyIGJlaGF2aW9ycyAqLworICAgICAgICAgICAgVXRpbC5hZGRFdmVudChkb2N1bWVudCwgJ2NsaWNrJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRpc2FibGUpOworICAgICAgICAgICAgVXRpbC5hZGRFdmVudChkb2N1bWVudC5ib2R5LCAnY29udGV4dG1lbnUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZGlzYWJsZSk7CisgICAgICAgIH0sCisKKyAgICAgICAgdW5ncmFiOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgYyA9IHRoaXMuX3RhcmdldDsKKworICAgICAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgeworICAgICAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgJ3RvdWNoc3RhcnQnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZG93bik7CisgICAgICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudCh3aW5kb3csICd0b3VjaGVuZCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7CisgICAgICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAndG91Y2hlbmQnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApOworICAgICAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgJ3RvdWNobW92ZScsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vtb3ZlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAnbW91c2Vkb3duJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRvd24pOworICAgICAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQod2luZG93LCAnbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7CisgICAgICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAnbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7CisgICAgICAgICAgICAgICAgVXRpbC5yZW1vdmVFdmVudChjLCAnbW91c2Vtb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpOworICAgICAgICAgICAgICAgIFV0aWwucmVtb3ZlRXZlbnQoYywgKFV0aWwuRW5naW5lLmdlY2tvKSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNld2hlZWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXb3JrIGFyb3VuZCByaWdodCBhbmQgbWlkZGxlIGNsaWNrIGJyb3dzZXIgYmVoYXZpb3JzICovCisgICAgICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KGRvY3VtZW50LCAnY2xpY2snLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZGlzYWJsZSk7CisgICAgICAgICAgICBVdGlsLnJlbW92ZUV2ZW50KGRvY3VtZW50LmJvZHksICdjb250ZXh0bWVudScsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2VkaXNhYmxlKTsKKworICAgICAgICB9CisgICAgfTsKKworICAgIFV0aWwubWFrZV9wcm9wZXJ0aWVzKE1vdXNlLCBbCisgICAgICAgIFsndGFyZ2V0JywgICAgICAgICAncm8nLCAnZG9tJ10sICAgLy8gRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBtb3VzZSBpbnB1dAorICAgICAgICBbJ25vdGlmeScsICAgICAgICAgJ3JvJywgJ2Z1bmMnXSwgIC8vIEZ1bmN0aW9uIHRvIGNhbGwgdG8gbm90aWZ5IHdoZW5ldmVyIGEgbW91c2UgZXZlbnQgaXMgcmVjZWl2ZWQKKyAgICAgICAgWydmb2N1c2VkJywgICAgICAgICdydycsICdib29sJ10sICAvLyBDYXB0dXJlIGFuZCBzZW5kIG1vdXNlIGNsaWNrcy9tb3ZlbWVudAorICAgICAgICBbJ3NjYWxlJywgICAgICAgICAgJ3J3JywgJ2Zsb2F0J10sIC8vIFZpZXdwb3J0IHNjYWxlIGZhY3RvciAwLjAgLSAxLjAKKworICAgICAgICBbJ29uTW91c2VCdXR0b24nLCAgJ3J3JywgJ2Z1bmMnXSwgIC8vIEhhbmRsZXIgZm9yIG1vdXNlIGJ1dHRvbiBjbGljay9yZWxlYXNlCisgICAgICAgIFsnb25Nb3VzZU1vdmUnLCAgICAncncnLCAnZnVuYyddLCAgLy8gSGFuZGxlciBmb3IgbW91c2UgbW92ZW1lbnQKKyAgICAgICAgWyd0b3VjaEJ1dHRvbicsICAgICdydycsICdpbnQnXSAgICAvLyBCdXR0b24gbWFzayAoMSwgMiwgNCkgZm9yIHRvdWNoIGRldmljZXMgKDAgbWVhbnMgaWdub3JlIGNsaWNrcykKKyAgICBdKTsKK30pKCk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvanN1bnppcC5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9qc3VuemlwLmpzCmluZGV4IGY4MTUyMTguLjg5NjhmODYgMTAwNzU1Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9qc3VuemlwLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9qc3VuemlwLmpzCkBAIC0zNTIsMjAgKzM1MiwyOCBAQAogfQogCiAvKiByZWFkIGEgbnVtIGJpdCB2YWx1ZSBmcm9tIGEgc3RyZWFtIGFuZCBhZGQgYmFzZSAqLworZnVuY3Rpb24gcmVhZF9iaXRzX2RpcmVjdChzb3VyY2UsIGJpdGNvdW50LCB0YWcsIGlkeCwgbnVtKQoreworICAgIHZhciB2YWwgPSAwOworICAgIHdoaWxlIChiaXRjb3VudCA8IDI0KSB7CisgICAgICAgIHRhZyA9IHRhZyB8IChzb3VyY2VbaWR4KytdICYgMHhmZikgPDwgYml0Y291bnQ7CisgICAgICAgIGJpdGNvdW50ICs9IDg7CisgICAgfQorICAgIHZhbCA9IHRhZyAmICgweGZmZmYgPj4gKDE2IC0gbnVtKSk7CisgICAgdGFnID4+PSBudW07CisgICAgYml0Y291bnQgLT0gbnVtOworICAgIHJldHVybiBbYml0Y291bnQsIHRhZywgaWR4LCB2YWxdOworfQogdGhpcy5yZWFkX2JpdHMgPSBmdW5jdGlvbihkLCBudW0sIGJhc2UpCiB7CiAgICAgaWYgKCFudW0pCiAgICAgICAgIHJldHVybiBiYXNlOwogCi0gICAgdmFyIHZhbCA9IDA7Ci0gICAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkgewotICAgICAgICBkLnRhZyA9IGQudGFnIHwgKGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gJiAweGZmKSA8PCBkLmJpdGNvdW50OwotICAgICAgICBkLmJpdGNvdW50ICs9IDg7Ci0gICAgfQotICAgIHZhbCA9IGQudGFnICYgKDB4ZmZmZiA+PiAoMTYgLSBudW0pKTsKLSAgICBkLnRhZyA+Pj0gbnVtOwotICAgIGQuYml0Y291bnQgLT0gbnVtOwotICAgIHJldHVybiB2YWwgKyBiYXNlOworICAgIHZhciByZXQgPSByZWFkX2JpdHNfZGlyZWN0KGQuc291cmNlLCBkLmJpdGNvdW50LCBkLnRhZywgZC5zb3VyY2VJbmRleCwgbnVtKTsKKyAgICBkLmJpdGNvdW50ID0gcmV0WzBdOworICAgIGQudGFnID0gcmV0WzFdOworICAgIGQuc291cmNlSW5kZXggPSByZXRbMl07CisgICAgcmV0dXJuIHJldFszXSArIGJhc2U7CiB9CiAKIC8qIGdpdmVuIGEgZGF0YSBzdHJlYW0gYW5kIGEgdHJlZSwgZGVjb2RlIGEgc3ltYm9sICovCmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUva2V5Ym9hcmQuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUva2V5Ym9hcmQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0NDMyMQotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlib2FyZC5qcwpAQCAtMCwwICsxLDU0MyBAQAordmFyIGtiZFV0aWwgPSAoZnVuY3Rpb24oKSB7CisgICAgInVzZSBzdHJpY3QiOworCisgICAgZnVuY3Rpb24gc3Vic3RpdHV0ZUNvZGVwb2ludChjcCkgeworICAgICAgICAvLyBBbnkgVW5pY29kZSBjb2RlIHBvaW50cyB3aGljaCBkbyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGtleXN5bSBlbnRyaWVzCisgICAgICAgIC8vIGNhbiBiZSBzd2FwcGVkIG91dCBmb3IgYW5vdGhlciBjb2RlIHBvaW50IGJ5IGFkZGluZyB0aGVtIHRvIHRoaXMgdGFibGUKKyAgICAgICAgdmFyIHN1YnN0aXR1dGlvbnMgPSB7CisgICAgICAgICAgICAvLyB7UyxzfSB3aXRoIGNvbW1hIGJlbG93IC0+IHtTLHN9IHdpdGggY2VkaWxsYQorICAgICAgICAgICAgMHgyMTggOiAweDE1ZSwKKyAgICAgICAgICAgIDB4MjE5IDogMHgxNWYsCisgICAgICAgICAgICAvLyB7VCx0fSB3aXRoIGNvbW1hIGJlbG93IC0+IHtULHR9IHdpdGggY2VkaWxsYQorICAgICAgICAgICAgMHgyMWEgOiAweDE2MiwKKyAgICAgICAgICAgIDB4MjFiIDogMHgxNjMKKyAgICAgICAgfTsKKworICAgICAgICB2YXIgc3ViID0gc3Vic3RpdHV0aW9uc1tjcF07CisgICAgICAgIHJldHVybiBzdWIgPyBzdWIgOiBjcDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBpc01hYygpIHsKKyAgICAgICAgcmV0dXJuIG5hdmlnYXRvciAmJiAhISgvbWFjL2kpLmV4ZWMobmF2aWdhdG9yLnBsYXRmb3JtKTsKKyAgICB9CisgICAgZnVuY3Rpb24gaXNXaW5kb3dzKCkgeworICAgICAgICByZXR1cm4gbmF2aWdhdG9yICYmICEhKC93aW4vaSkuZXhlYyhuYXZpZ2F0b3IucGxhdGZvcm0pOworICAgIH0KKyAgICBmdW5jdGlvbiBpc0xpbnV4KCkgeworICAgICAgICByZXR1cm4gbmF2aWdhdG9yICYmICEhKC9saW51eC9pKS5leGVjKG5hdmlnYXRvci5wbGF0Zm9ybSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgYSBtb2RpZmllciB3aGljaCBpcyBub3QgdGhlIHNwZWNpZmllZCBjaGFyIG1vZGlmaWVyIChhbmQgaXMgbm90IHNoaWZ0KSBpcyBkb3duCisgICAgZnVuY3Rpb24gaGFzU2hvcnRjdXRNb2RpZmllcihjaGFyTW9kaWZpZXIsIGN1cnJlbnRNb2RpZmllcnMpIHsKKyAgICAgICAgdmFyIG1vZHMgPSB7fTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIGN1cnJlbnRNb2RpZmllcnMpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZUludChrZXkpICE9PSAweGZmZTEpIHsKKyAgICAgICAgICAgICAgICBtb2RzW2tleV0gPSBjdXJyZW50TW9kaWZpZXJzW2tleV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3VtID0gMDsKKyAgICAgICAgZm9yICh2YXIgayBpbiBjdXJyZW50TW9kaWZpZXJzKSB7CisgICAgICAgICAgICBpZiAobW9kc1trXSkgeworICAgICAgICAgICAgICAgICsrc3VtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoYXNDaGFyTW9kaWZpZXIoY2hhck1vZGlmaWVyLCBtb2RzKSkgeworICAgICAgICAgICAgcmV0dXJuIHN1bSA+IGNoYXJNb2RpZmllci5sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VtID4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhciBtb2RpZmllciBpcyBjdXJyZW50bHkgZG93bgorICAgIGZ1bmN0aW9uIGhhc0NoYXJNb2RpZmllcihjaGFyTW9kaWZpZXIsIGN1cnJlbnRNb2RpZmllcnMpIHsKKyAgICAgICAgaWYgKGNoYXJNb2RpZmllci5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyTW9kaWZpZXIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghY3VycmVudE1vZGlmaWVyc1tjaGFyTW9kaWZpZXJbaV1dKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEhlbHBlciBvYmplY3QgdHJhY2tpbmcgbW9kaWZpZXIga2V5IHN0YXRlCisgICAgLy8gYW5kIGdlbmVyYXRlcyBmYWtlIGtleSBldmVudHMgdG8gY29tcGVuc2F0ZSBpZiBpdCBnZXRzIG91dCBvZiBzeW5jCisgICAgZnVuY3Rpb24gTW9kaWZpZXJTeW5jKGNoYXJNb2RpZmllcikgeworICAgICAgICB2YXIgY3RybCA9IDB4ZmZlMzsKKyAgICAgICAgdmFyIGFsdCA9IDB4ZmZlOTsKKyAgICAgICAgdmFyIGFsdEdyID0gMHhmZTAzOworICAgICAgICB2YXIgc2hpZnQgPSAweGZmZTE7CisgICAgICAgIHZhciBtZXRhID0gMHhmZmU3OworCisgICAgICAgIGlmICghY2hhck1vZGlmaWVyKSB7CisgICAgICAgICAgICBpZiAoaXNNYWMoKSkgeworICAgICAgICAgICAgICAgIC8vIG9uIE1hYywgT3B0aW9uIChBS0EgQWx0KSBpcyB1c2VkIGFzIGEgY2hhciBtb2RpZmllcgorICAgICAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFthbHRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCBDdHJsK0FsdCBpcyB1c2VkIGFzIGEgY2hhciBtb2RpZmllcgorICAgICAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFthbHQsIGN0cmxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMaW51eCgpKSB7CisgICAgICAgICAgICAgICAgLy8gb24gTGludXgsIEFsdEdyIGlzIHVzZWQgYXMgYSBjaGFyIG1vZGlmaWVyCisgICAgICAgICAgICAgICAgY2hhck1vZGlmaWVyID0gW2FsdEdyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFtdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0YXRlID0ge307CisgICAgICAgIHN0YXRlW2N0cmxdID0gZmFsc2U7CisgICAgICAgIHN0YXRlW2FsdF0gPSBmYWxzZTsKKyAgICAgICAgc3RhdGVbYWx0R3JdID0gZmFsc2U7CisgICAgICAgIHN0YXRlW3NoaWZ0XSA9IGZhbHNlOworICAgICAgICBzdGF0ZVttZXRhXSA9IGZhbHNlOworCisgICAgICAgIGZ1bmN0aW9uIHN5bmMoZXZ0LCBrZXlzeW0pIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIHN5bmNLZXkoa2V5c3ltKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHtrZXlzeW06IGtleXN5bXMubG9va3VwKGtleXN5bSksIHR5cGU6IHN0YXRlW2tleXN5bV0gPyAna2V5ZG93bicgOiAna2V5dXAnfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGV2dC5jdHJsS2V5ICE9PSB1bmRlZmluZWQgJiYgZXZ0LmN0cmxLZXkgIT09IHN0YXRlW2N0cmxdICYmIGtleXN5bSAhPT0gY3RybCkgeworICAgICAgICAgICAgICAgIHN0YXRlW2N0cmxdID0gZXZ0LmN0cmxLZXk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShjdHJsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXZ0LmFsdEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5hbHRLZXkgIT09IHN0YXRlW2FsdF0gJiYga2V5c3ltICE9PSBhbHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVthbHRdID0gZXZ0LmFsdEtleTsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzeW5jS2V5KGFsdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2dC5hbHRHcmFwaEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5hbHRHcmFwaEtleSAhPT0gc3RhdGVbYWx0R3JdICYmIGtleXN5bSAhPT0gYWx0R3IpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVthbHRHcl0gPSBldnQuYWx0R3JhcGhLZXk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShhbHRHcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5zaGlmdEtleSAhPT0gc3RhdGVbc2hpZnRdICYmIGtleXN5bSAhPT0gc2hpZnQpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVtzaGlmdF0gPSBldnQuc2hpZnRLZXk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShzaGlmdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2dC5tZXRhS2V5ICE9PSB1bmRlZmluZWQgJiYgZXZ0Lm1ldGFLZXkgIT09IHN0YXRlW21ldGFdICYmIGtleXN5bSAhPT0gbWV0YSkgeworICAgICAgICAgICAgICAgIHN0YXRlW21ldGFdID0gZXZ0Lm1ldGFLZXk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShtZXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGZ1bmN0aW9uIHN5bmNLZXlFdmVudChldnQsIGRvd24pIHsKKyAgICAgICAgICAgIHZhciBvYmogPSBnZXRLZXlzeW0oZXZ0KTsKKyAgICAgICAgICAgIHZhciBrZXlzeW0gPSBvYmogPyBvYmoua2V5c3ltIDogbnVsbDsKKworICAgICAgICAgICAgLy8gZmlyc3QsIGFwcGx5IHRoZSBldmVudCBpdHNlbGYsIGlmIHJlbGV2YW50CisgICAgICAgICAgICBpZiAoa2V5c3ltICE9PSBudWxsICYmIHN0YXRlW2tleXN5bV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIHN0YXRlW2tleXN5bV0gPSBkb3duOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN5bmMoZXZ0LCBrZXlzeW0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIC8vIHN5bmMgb24gdGhlIGFwcHJvcHJpYXRlIGtleWJvYXJkIGV2ZW50CisgICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbihldnQpIHsgcmV0dXJuIHN5bmNLZXlFdmVudChldnQsIHRydWUpO30sCisgICAgICAgICAgICBrZXl1cDogZnVuY3Rpb24oZXZ0KSB7IHJldHVybiBzeW5jS2V5RXZlbnQoZXZ0LCBmYWxzZSk7fSwKKyAgICAgICAgICAgIC8vIENhbGwgdGhpcyB3aXRoIGEgbm9uLWtleWJvYXJkIGV2ZW50IChzdWNoIGFzIG1vdXNlIGV2ZW50cykgdG8gdXNlIGl0cyBtb2RpZmllciBzdGF0ZSB0byBzeW5jaHJvbml6ZSBhbnl3YXkKKyAgICAgICAgICAgIHN5bmNBbnk6IGZ1bmN0aW9uKGV2dCkgeyByZXR1cm4gc3luYyhldnQpO30sCisKKyAgICAgICAgICAgIC8vIGlzIGEgc2hvcnRjdXQgbW9kaWZpZXIgZG93bj8KKyAgICAgICAgICAgIGhhc1Nob3J0Y3V0TW9kaWZpZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaGFzU2hvcnRjdXRNb2RpZmllcihjaGFyTW9kaWZpZXIsIHN0YXRlKTsgfSwKKyAgICAgICAgICAgIC8vIGlmIGEgY2hhciBtb2RpZmllciBpcyBkb3duLCByZXR1cm4gdGhlIGtleXMgaXQgY29uc2lzdHMgb2YsIG90aGVyd2lzZSByZXR1cm4gbnVsbAorICAgICAgICAgICAgYWN0aXZlQ2hhck1vZGlmaWVyOiBmdW5jdGlvbigpIHsgcmV0dXJuIGhhc0NoYXJNb2RpZmllcihjaGFyTW9kaWZpZXIsIHN0YXRlKSA/IGNoYXJNb2RpZmllciA6IG51bGw7IH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvLyBHZXQgYSBrZXkgSUQgZnJvbSBhIGtleWJvYXJkIGV2ZW50CisgICAgLy8gTWF5IGJlIGEgc3RyaW5nIG9yIGFuIGludGVnZXIgZGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcworICAgIGZ1bmN0aW9uIGdldEtleShldnQpeworICAgICAgICBpZiAoJ2tleUNvZGUnIGluIGV2dCAmJiAna2V5JyBpbiBldnQpIHsKKyAgICAgICAgICAgIHJldHVybiBldnQua2V5ICsgJzonICsgZXZ0LmtleUNvZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoJ2tleUNvZGUnIGluIGV2dCkgeworICAgICAgICAgICAgcmV0dXJuIGV2dC5rZXlDb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGV2dC5rZXk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIG1vc3QgcmVsaWFibGUga2V5c3ltIHZhbHVlIHdlIGNhbiBnZXQgZnJvbSBhIGtleSBldmVudAorICAgIC8vIGlmIGNoYXIvY2hhckNvZGUgaXMgYXZhaWxhYmxlLCBwcmVmZXIgdGhvc2UsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8ga2V5L2tleUNvZGUvd2hpY2gKKyAgICBmdW5jdGlvbiBnZXRLZXlzeW0oZXZ0KXsKKyAgICAgICAgdmFyIGNvZGVwb2ludDsKKyAgICAgICAgaWYgKGV2dC5jaGFyICYmIGV2dC5jaGFyLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgICAgY29kZXBvaW50ID0gZXZ0LmNoYXIuY2hhckNvZGVBdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGV2dC5jaGFyQ29kZSkgeworICAgICAgICAgICAgY29kZXBvaW50ID0gZXZ0LmNoYXJDb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGV2dC5rZXlDb2RlICYmIGV2dC50eXBlID09PSAna2V5cHJlc3MnKSB7CisgICAgICAgICAgICAvLyBJRTEwIHN0b3JlcyB0aGUgY2hhciBjb2RlIGFzIGtleUNvZGUsIGFuZCBoYXMgbm8gb3RoZXIgdXNlZnVsIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGNvZGVwb2ludCA9IGV2dC5rZXlDb2RlOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlcG9pbnQpIHsKKyAgICAgICAgICAgIHZhciByZXMgPSBrZXlzeW1zLmZyb21Vbmljb2RlKHN1YnN0aXR1dGVDb2RlcG9pbnQoY29kZXBvaW50KSk7CisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBjb3VsZCBjaGVjayBldnQua2V5IGhlcmUuCisgICAgICAgIC8vIExlZ2FsIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleS12YWx1ZXMtbGlzdCwKKyAgICAgICAgLy8gc28gd2UgImp1c3QiIG5lZWQgdG8gbWFwIHRoZW0gdG8ga2V5c3ltLCBidXQgQUZBSUsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBJRTEwLCB3aGljaCBhbHNvIHByb3ZpZGVzIGV2dC5rZXkKKyAgICAgICAgLy8gc28gd2UgZG9uJ3QgKm5lZWQqIGl0IHlldAorICAgICAgICBpZiAoZXZ0LmtleUNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXlzeW1zLmxvb2t1cChrZXlzeW1Gcm9tS2V5Q29kZShldnQua2V5Q29kZSwgZXZ0LnNoaWZ0S2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2dC53aGljaCkgeworICAgICAgICAgICAgcmV0dXJuIGtleXN5bXMubG9va3VwKGtleXN5bUZyb21LZXlDb2RlKGV2dC53aGljaCwgZXZ0LnNoaWZ0S2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gR2l2ZW4gYSBrZXljb2RlLCB0cnkgdG8gcHJlZGljdCB3aGljaCBrZXlzeW0gaXQgbWlnaHQgYmUuCisgICAgLy8gSWYgdGhlIGtleWNvZGUgaXMgdW5rbm93biwgbnVsbCBpcyByZXR1cm5lZC4KKyAgICBmdW5jdGlvbiBrZXlzeW1Gcm9tS2V5Q29kZShrZXljb2RlLCBzaGlmdFByZXNzZWQpIHsKKyAgICAgICAgaWYgKHR5cGVvZihrZXljb2RlKSAhPT0gJ251bWJlcicpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIHdvbid0IGJlIGFjY3VyYXRlIGZvciBhemVydHkKKyAgICAgICAgaWYgKGtleWNvZGUgPj0gMHgzMCAmJiBrZXljb2RlIDw9IDB4MzkpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXljb2RlOyAvLyBkaWdpdAorICAgICAgICB9CisgICAgICAgIGlmIChrZXljb2RlID49IDB4NDEgJiYga2V5Y29kZSA8PSAweDVhKSB7CisgICAgICAgICAgICAvLyByZW1hcCB0byBsb3dlcmNhc2UgdW5sZXNzIHNoaWZ0IGlzIGRvd24KKyAgICAgICAgICAgIHJldHVybiBzaGlmdFByZXNzZWQgPyBrZXljb2RlIDoga2V5Y29kZSArIDMyOyAvLyBBLVoKKyAgICAgICAgfQorICAgICAgICBpZiAoa2V5Y29kZSA+PSAweDYwICYmIGtleWNvZGUgPD0gMHg2OSkgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZiMCArIChrZXljb2RlIC0gMHg2MCk7IC8vIG51bXBhZCAwLTkKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChrZXljb2RlKSB7CisgICAgICAgICAgICBjYXNlIDB4MjA6IHJldHVybiAweDIwOyAvLyBzcGFjZQorICAgICAgICAgICAgY2FzZSAweDZhOiByZXR1cm4gMHhmZmFhOyAvLyBtdWx0aXBseQorICAgICAgICAgICAgY2FzZSAweDZiOiByZXR1cm4gMHhmZmFiOyAvLyBhZGQKKyAgICAgICAgICAgIGNhc2UgMHg2YzogcmV0dXJuIDB4ZmZhYzsgLy8gc2VwYXJhdG9yCisgICAgICAgICAgICBjYXNlIDB4NmQ6IHJldHVybiAweGZmYWQ7IC8vIHN1YnRyYWN0CisgICAgICAgICAgICBjYXNlIDB4NmU6IHJldHVybiAweGZmYWU7IC8vIGRlY2ltYWwKKyAgICAgICAgICAgIGNhc2UgMHg2ZjogcmV0dXJuIDB4ZmZhZjsgLy8gZGl2aWRlCisgICAgICAgICAgICBjYXNlIDB4YmI6IHJldHVybiAweDJiOyAvLyArCisgICAgICAgICAgICBjYXNlIDB4YmM6IHJldHVybiAweDJjOyAvLyAsCisgICAgICAgICAgICBjYXNlIDB4YmQ6IHJldHVybiAweDJkOyAvLyAtCisgICAgICAgICAgICBjYXNlIDB4YmU6IHJldHVybiAweDJlOyAvLyAuCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbm9uQ2hhcmFjdGVyS2V5KHtrZXlDb2RlOiBrZXljb2RlfSk7CisgICAgfQorCisgICAgLy8gaWYgdGhlIGtleSBpcyBhIGtub3duIG5vbi1jaGFyYWN0ZXIga2V5IChhbnkga2V5IHdoaWNoIGRvZXNuJ3QgZ2VuZXJhdGUgY2hhcmFjdGVyIGRhdGEpCisgICAgLy8gcmV0dXJuIGl0cyBrZXlzeW0gdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gbnVsbAorICAgIGZ1bmN0aW9uIG5vbkNoYXJhY3RlcktleShldnQpIHsKKyAgICAgICAgLy8gZXZ0LmtleSBub3QgaW1wbGVtZW50ZWQgeWV0CisgICAgICAgIGlmICghZXZ0LmtleUNvZGUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgICAgdmFyIGtleWNvZGUgPSBldnQua2V5Q29kZTsKKworICAgICAgICBpZiAoa2V5Y29kZSA+PSAweDcwICYmIGtleWNvZGUgPD0gMHg4NykgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZiZSArIGtleWNvZGUgLSAweDcwOyAvLyBGMS1GMjQKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHsKKworICAgICAgICAgICAgY2FzZSA4IDogcmV0dXJuIDB4RkYwODsgLy8gQkFDS1NQQUNFCisgICAgICAgICAgICBjYXNlIDEzIDogcmV0dXJuIDB4RkYwRDsgLy8gRU5URVIKKworICAgICAgICAgICAgY2FzZSA5IDogcmV0dXJuIDB4RkYwOTsgLy8gVEFCCisKKyAgICAgICAgICAgIGNhc2UgMjcgOiByZXR1cm4gMHhGRjFCOyAvLyBFU0NBUEUKKyAgICAgICAgICAgIGNhc2UgNDYgOiByZXR1cm4gMHhGRkZGOyAvLyBERUxFVEUKKworICAgICAgICAgICAgY2FzZSAzNiA6IHJldHVybiAweEZGNTA7IC8vIEhPTUUKKyAgICAgICAgICAgIGNhc2UgMzUgOiByZXR1cm4gMHhGRjU3OyAvLyBFTkQKKyAgICAgICAgICAgIGNhc2UgMzMgOiByZXR1cm4gMHhGRjU1OyAvLyBQQUdFX1VQCisgICAgICAgICAgICBjYXNlIDM0IDogcmV0dXJuIDB4RkY1NjsgLy8gUEFHRV9ET1dOCisgICAgICAgICAgICBjYXNlIDQ1IDogcmV0dXJuIDB4RkY2MzsgLy8gSU5TRVJUCisKKyAgICAgICAgICAgIGNhc2UgMzcgOiByZXR1cm4gMHhGRjUxOyAvLyBMRUZUCisgICAgICAgICAgICBjYXNlIDM4IDogcmV0dXJuIDB4RkY1MjsgLy8gVVAKKyAgICAgICAgICAgIGNhc2UgMzkgOiByZXR1cm4gMHhGRjUzOyAvLyBSSUdIVAorICAgICAgICAgICAgY2FzZSA0MCA6IHJldHVybiAweEZGNTQ7IC8vIERPV04KKyAgICAgICAgICAgIGNhc2UgMTYgOiByZXR1cm4gMHhGRkUxOyAvLyBTSElGVAorICAgICAgICAgICAgY2FzZSAxNyA6IHJldHVybiAweEZGRTM7IC8vIENPTlRST0wKKyAgICAgICAgICAgIGNhc2UgMTggOiByZXR1cm4gMHhGRkU5OyAvLyBMZWZ0IEFMVCAoTWFjIE9wdGlvbikKKworICAgICAgICAgICAgY2FzZSAyMjQgOiByZXR1cm4gMHhGRTA3OyAvLyBNZXRhCisgICAgICAgICAgICBjYXNlIDIyNSA6IHJldHVybiAweEZFMDM7IC8vIEFsdEdyCisgICAgICAgICAgICBjYXNlIDkxIDogcmV0dXJuIDB4RkZFQzsgLy8gU3VwZXJfTCAoV2luIEtleSkKKyAgICAgICAgICAgIGNhc2UgOTIgOiByZXR1cm4gMHhGRkVEOyAvLyBTdXBlcl9SIChXaW4gS2V5KQorICAgICAgICAgICAgY2FzZSA5MyA6IHJldHVybiAweEZGNjc7IC8vIE1lbnUgKFdpbiBNZW51KSwgTWFjIENvbW1hbmQKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7CisgICAgICAgIGhhc1Nob3J0Y3V0TW9kaWZpZXIgOiBoYXNTaG9ydGN1dE1vZGlmaWVyLAorICAgICAgICBoYXNDaGFyTW9kaWZpZXIgOiAgaGFzQ2hhck1vZGlmaWVyLAorICAgICAgICBNb2RpZmllclN5bmMgOiBNb2RpZmllclN5bmMsCisgICAgICAgIGdldEtleSA6IGdldEtleSwKKyAgICAgICAgZ2V0S2V5c3ltIDogZ2V0S2V5c3ltLAorICAgICAgICBrZXlzeW1Gcm9tS2V5Q29kZSA6IGtleXN5bUZyb21LZXlDb2RlLAorICAgICAgICBub25DaGFyYWN0ZXJLZXkgOiBub25DaGFyYWN0ZXJLZXksCisgICAgICAgIHN1YnN0aXR1dGVDb2RlcG9pbnQgOiBzdWJzdGl0dXRlQ29kZXBvaW50CisgICAgfTsKK30pKCk7CisKKy8vIFRha2VzIGEgRE9NIGtleWJvYXJkIGV2ZW50IGFuZDoKKy8vIC0gZGV0ZXJtaW5lcyB3aGljaCBrZXlzeW0gaXQgcmVwcmVzZW50cworLy8gLSBkZXRlcm1pbmVzIGEga2V5SWQgIGlkZW50aWZ5aW5nIHRoZSBrZXkgdGhhdCB3YXMgcHJlc3NlZCAoY29ycmVzcG9uZGluZyB0byB0aGUga2V5L2tleUNvZGUgcHJvcGVydGllcyBvbiB0aGUgRE9NIGV2ZW50KQorLy8gLSBzeW50aGVzaXplcyBldmVudHMgdG8gc3luY2hyb25pemUgbW9kaWZpZXIga2V5IHN0YXRlIGJldHdlZW4gd2hpY2ggbW9kaWZpZXJzIGFyZSBhY3R1YWxseSBkb3duLCBhbmQgd2hpY2ggd2UgdGhvdWdodCB3ZXJlIGRvd24KKy8vIC0gbWFya3MgZWFjaCBldmVudCB3aXRoIGFuICdlc2NhcGUnIHByb3BlcnR5IGlmIGEgbW9kaWZpZXIgd2FzIGRvd24gd2hpY2ggc2hvdWxkIGJlICJlc2NhcGVkIgorLy8gLSBnZW5lcmF0ZXMgYSAic3RhbGwiIGV2ZW50IGluIGNhc2VzIHdoZXJlIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byB3YWl0IGFuZCBzZWUgaWYgYSBrZXlwcmVzcyBldmVudCBmb2xsb3dzIGEga2V5ZG93bgorLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgaW50byBhbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBuZXh0KCkgZnVuY3Rpb24uIChvbmUgY2FsbCBwZXIgZXZlbnQpCitmdW5jdGlvbiBLZXlFdmVudERlY29kZXIobW9kaWZpZXJTdGF0ZSwgbmV4dCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICBmdW5jdGlvbiBzZW5kQWxsKGV2dHMpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBuZXh0KGV2dHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGZ1bmN0aW9uIHByb2Nlc3MoZXZ0LCB0eXBlKSB7CisgICAgICAgIHZhciByZXN1bHQgPSB7dHlwZTogdHlwZX07CisgICAgICAgIHZhciBrZXlJZCA9IGtiZFV0aWwuZ2V0S2V5KGV2dCk7CisgICAgICAgIGlmIChrZXlJZCkgeworICAgICAgICAgICAgcmVzdWx0LmtleUlkID0ga2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICB2YXIga2V5c3ltID0ga2JkVXRpbC5nZXRLZXlzeW0oZXZ0KTsKKworICAgICAgICB2YXIgaGFzTW9kaWZpZXIgPSBtb2RpZmllclN0YXRlLmhhc1Nob3J0Y3V0TW9kaWZpZXIoKSB8fCAhIW1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7CisgICAgICAgIC8vIElzIHRoaXMgYSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gZGVjaWRlIG9uIHRoZSBrZXlzeW0gcmlnaHQgYXdheSwgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIGtleXByZXNzPworICAgICAgICAvLyAic3BlY2lhbCIga2V5cyBsaWtlIGVudGVyLCB0YWIgb3IgYmFja3NwYWNlIGRvbid0IHNlbmQga2V5cHJlc3MgZXZlbnRzLAorICAgICAgICAvLyBhbmQgc29tZSBicm93c2VycyBkb24ndCBzZW5kIGtleXByZXNzZXMgYXQgYWxsIGlmIGEgbW9kaWZpZXIgaXMgZG93bgorICAgICAgICBpZiAoa2V5c3ltICYmICh0eXBlICE9PSAna2V5ZG93bicgfHwga2JkVXRpbC5ub25DaGFyYWN0ZXJLZXkoZXZ0KSB8fCBoYXNNb2RpZmllcikpIHsKKyAgICAgICAgICAgIHJlc3VsdC5rZXlzeW0gPSBrZXlzeW07CisgICAgICAgIH0KKworICAgICAgICB2YXIgaXNTaGlmdCA9IGV2dC5rZXlDb2RlID09PSAweDEwIHx8IGV2dC5rZXkgPT09ICdTaGlmdCc7CisKKyAgICAgICAgLy8gU2hvdWxkIHdlIHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBoYW5kbGluZyB0aGUgZXZlbnQ/CisgICAgICAgIC8vIERvaW5nIHNvIG9uIGEga2V5ZG93biAoaW4gbW9zdCBicm93c2VycykgcHJldmVudHMga2V5cHJlc3MgZnJvbSBiZWluZyBnZW5lcmF0ZWQKKyAgICAgICAgLy8gc28gb25seSBkbyB0aGF0IGlmIHdlIGhhdmUgdG8uCisgICAgICAgIHZhciBzdXBwcmVzcyA9ICFpc1NoaWZ0ICYmICh0eXBlICE9PSAna2V5ZG93bicgfHwgbW9kaWZpZXJTdGF0ZS5oYXNTaG9ydGN1dE1vZGlmaWVyKCkgfHwgISFrYmRVdGlsLm5vbkNoYXJhY3RlcktleShldnQpKTsKKworICAgICAgICAvLyBJZiBhIGNoYXIgbW9kaWZpZXIgaXMgZG93biBvbiBhIGtleWRvd24sIHdlIG5lZWQgdG8gaW5zZXJ0IGEgc3RhbGwsCisgICAgICAgIC8vIHNvIFZlcmlmeUNoYXJNb2RpZmllciBrbm93cyB0byB3YWl0IGFuZCBzZWUgaWYgYSBrZXlwcmVzcyBpcyBjb21uaWcKKyAgICAgICAgdmFyIHN0YWxsID0gdHlwZSA9PT0gJ2tleWRvd24nICYmIG1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCkgJiYgIWtiZFV0aWwubm9uQ2hhcmFjdGVyS2V5KGV2dCk7CisKKyAgICAgICAgLy8gaWYgYSBjaGFyIG1vZGlmaWVyIGlzIHByZXNzZWQsIGdldCB0aGUga2V5cyBpdCBjb25zaXN0cyBvZiAob24gV2luZG93cywgQWx0R3IgaXMgZXF1aXZhbGVudCB0byBDdHJsK0FsdCkKKyAgICAgICAgdmFyIGFjdGl2ZSA9IG1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNoYXIgbW9kaWZpZXIgZG93biwgYW5kIHdlJ3JlIGFibGUgdG8gZGV0ZXJtaW5lIGEga2V5c3ltIHJlbGlhYmx5CisgICAgICAgIC8vIHRoZW4gKGEpIHdlIGtub3cgdG8gdHJlYXQgdGhlIG1vZGlmaWVyIGFzIGEgY2hhciBtb2RpZmllciwKKyAgICAgICAgLy8gYW5kIChiKSB3ZSdsbCBoYXZlIHRvICJlc2NhcGUiIHRoZSBtb2RpZmllciB0byB1bmRvIHRoZSBtb2RpZmllciB3aGVuIHNlbmRpbmcgdGhlIGNoYXIuCisgICAgICAgIGlmIChhY3RpdmUgJiYga2V5c3ltKSB7CisgICAgICAgICAgICB2YXIgaXNDaGFyTW9kaWZpZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVbaV0gPT09IGtleXN5bS5rZXlzeW0pIHsKKyAgICAgICAgICAgICAgICAgICAgaXNDaGFyTW9kaWZpZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnICYmICFpc0NoYXJNb2RpZmllcikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5lc2NhcGUgPSBtb2RpZmllclN0YXRlLmFjdGl2ZUNoYXJNb2RpZmllcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YWxsKSB7CisgICAgICAgICAgICAvLyBpbnNlcnQgYSBmYWtlICJzdGFsbCIgZXZlbnQKKyAgICAgICAgICAgIG5leHQoe3R5cGU6ICdzdGFsbCd9KTsKKyAgICAgICAgfQorICAgICAgICBuZXh0KHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuIHN1cHByZXNzOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLmtleWRvd24oZXZ0KSk7CisgICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXlkb3duJyk7CisgICAgICAgIH0sCisgICAgICAgIGtleXByZXNzOiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKGV2dCwgJ2tleXByZXNzJyk7CisgICAgICAgIH0sCisgICAgICAgIGtleXVwOiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICAgIHNlbmRBbGwobW9kaWZpZXJTdGF0ZS5rZXl1cChldnQpKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKGV2dCwgJ2tleXVwJyk7CisgICAgICAgIH0sCisgICAgICAgIHN5bmNNb2RpZmllcnM6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLnN5bmNBbnkoZXZ0KSk7CisgICAgICAgIH0sCisgICAgICAgIHJlbGVhc2VBbGw6IGZ1bmN0aW9uKCkgeyBuZXh0KHt0eXBlOiAncmVsZWFzZWFsbCd9KTsgfQorICAgIH07Cit9CisKKy8vIENvbWJpbmVzIGtleWRvd24gYW5kIGtleXByZXNzIGV2ZW50cyB3aGVyZSBuZWNlc3NhcnkgdG8gaGFuZGxlIGNoYXIgbW9kaWZpZXJzLgorLy8gT24gc29tZSBPUydlcywgYSBjaGFyIG1vZGlmaWVyIGlzIHNvbWV0aW1lcyB1c2VkIGFzIGEgc2hvcnRjdXQgbW9kaWZpZXIuCisvLyBGb3IgZXhhbXBsZSwgb24gV2luZG93cywgQWx0R3IgaXMgc3lub255bW91cyB3aXRoIEN0cmwtQWx0LiBPbiBhIERhbmlzaCBrZXlib2FyZCBsYXlvdXQsIEFsdEdyLTIgeWllbGRzIGEgQCwgYnV0IEN0cmwtQWx0LUQgZG9lcyBub3RoaW5nCisvLyBzbyB3aGVuIHVzZWQgd2l0aCB0aGUgJzInIGtleSwgQ3RybC1BbHQgY291bnRzIGFzIGEgY2hhciBtb2RpZmllciAoYW5kIHNob3VsZCBiZSBlc2NhcGVkKSwgYnV0IHdoZW4gdXNlZCB3aXRoICdEJywgaXQgZG9lcyBub3QuCisvLyBUaGUgb25seSB3YXkgd2UgY2FuIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzIGlzIHRvIHdhaXQgYW5kIHNlZSBpZiBhIGtleXByZXNzIGV2ZW50IGFycml2ZXMKKy8vIFdoZW4gd2UgcmVjZWl2ZSBhICJzdGFsbCIgZXZlbnQsIHdhaXQgYSBmZXcgbXMgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIG5leHQga2V5ZG93bi4gSWYgYSBrZXlwcmVzcyBoYXMgYWxzbyBhcnJpdmVkLCBtZXJnZSB0aGUgdHdvCitmdW5jdGlvbiBWZXJpZnlDaGFyTW9kaWZpZXIobmV4dCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgcXVldWUgPSBbXTsKKyAgICB2YXIgdGltZXIgPSBudWxsOworICAgIGZ1bmN0aW9uIHByb2Nlc3MoKSB7CisgICAgICAgIGlmICh0aW1lcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRlbGF5UHJvY2VzcyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CisgICAgICAgICAgICB0aW1lciA9IG51bGw7CisgICAgICAgICAgICBwcm9jZXNzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkgeworICAgICAgICAgICAgdmFyIGN1ciA9IHF1ZXVlWzBdOworICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS5zcGxpY2UoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKGN1ci50eXBlKSB7CisgICAgICAgICAgICBjYXNlICdzdGFsbCc6CisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGEgZGVsYXkgYmVmb3JlIHByb2Nlc3NpbmcgYXZhaWxhYmxlIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6IHRydWUgKi8KKyAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZGVsYXlQcm9jZXNzLCA1KTsKKyAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6IGZhbHNlICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAna2V5ZG93bic6CisgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG5leHQgZWxlbWVudCBhIGtleXByZXNzPyBUaGVuIHdlIHNob3VsZCBtZXJnZSB0aGUgdHdvCisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBxdWV1ZVswXS50eXBlID09PSAna2V5cHJlc3MnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc2VuZHMga2V5cHJlc3MgZXZlbiB3aGVuIG5vIGNoYXIgaXMgZ2VuZXJhdGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBzbywgaWYga2V5cHJlc3Mga2V5c3ltIGlzIHRoZSBzYW1lIGFzIHdlJ2QgaGF2ZSBndWVzc2VkIGZyb20ga2V5ZG93biwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1vZGlmaWVyIGRpZG4ndCBoYXZlIGFueSBlZmZlY3QsIGFuZCBzaG91bGQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlWzBdLmVzY2FwZSAmJiAoIWN1ci5rZXlzeW0gfHwgY3VyLmtleXN5bS5rZXlzeW0gIT09IHF1ZXVlWzBdLmtleXN5bS5rZXlzeW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXIuZXNjYXBlID0gcXVldWVbMF0uZXNjYXBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1ci5rZXlzeW0gPSBxdWV1ZVswXS5rZXlzeW07CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlID0gcXVldWUuc3BsaWNlKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3dhbGxvdyBzdGFsbCBldmVudHMsIGFuZCBwYXNzIGFsbCBvdGhlcnMgdG8gdGhlIG5leHQgc3RhZ2UKKyAgICAgICAgICAgIGlmIChjdXIudHlwZSAhPT0gJ3N0YWxsJykgeworICAgICAgICAgICAgICAgIG5leHQoY3VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIHF1ZXVlLnB1c2goZXZ0KTsKKyAgICAgICAgcHJvY2VzcygpOworICAgIH07Cit9CisKKy8vIEtlZXBzIHRyYWNrIG9mIHdoaWNoIGtleXMgd2UgKGFuZCB0aGUgc2VydmVyKSBiZWxpZXZlIGFyZSBkb3duCisvLyBXaGVuIGEga2V5dXAgaXMgcmVjZWl2ZWQsIG1hdGNoIGl0IGFnYWluc3QgdGhpcyBsaXN0LCB0byBkZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcga2V5c3ltKHMpCisvLyBpbiBzb21lIGNhc2VzLCBhIHNpbmdsZSBrZXkgbWF5IHByb2R1Y2UgbXVsdGlwbGUga2V5c3ltcywgc28gdGhlIGNvcnJlc3BvbmRpbmcga2V5dXAgZXZlbnQgbXVzdCByZWxlYXNlIGFsbCBvZiB0aGVzZSBjaGFycworLy8ga2V5IHJlcGVhdCBldmVudHMgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGVudHJ5LgorLy8gQmVjYXVzZSB3ZSBjYW4ndCBhbHdheXMgaWRlbnRpZnkgd2hpY2ggZW50cnkgYSBrZXlkb3duIG9yIGtleXVwIGV2ZW50IGNvcnJlc3BvbmRzIHRvLCB3ZSBzb21ldGltZXMgaGF2ZSB0byBndWVzcworZnVuY3Rpb24gVHJhY2tLZXlTdGF0ZShuZXh0KSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHZhciBzdGF0ZSA9IFtdOworCisgICAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgdmFyIGxhc3QgPSBzdGF0ZS5sZW5ndGggIT09IDAgPyBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gOiBudWxsOworCisgICAgICAgIHN3aXRjaCAoZXZ0LnR5cGUpIHsKKyAgICAgICAgY2FzZSAna2V5ZG93bic6CisgICAgICAgICAgICAvLyBpbnNlcnQgYSBuZXcgZW50cnkgaWYgbGFzdCBzZWVuIGtleSB3YXMgZGlmZmVyZW50LgorICAgICAgICAgICAgaWYgKCFsYXN0IHx8ICFldnQua2V5SWQgfHwgbGFzdC5rZXlJZCAhPT0gZXZ0LmtleUlkKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IHtrZXlJZDogZXZ0LmtleUlkLCBrZXlzeW1zOiB7fX07CisgICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChldnQua2V5c3ltKSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxhc3QgZXZlbnQgY29udGFpbnMgdGhpcyBrZXlzeW0gKGEgc2luZ2xlICJsb2dpY2FsIiBrZXlldmVudAorICAgICAgICAgICAgICAgIC8vIGNhbiBjYXVzZSBtdWx0aXBsZSBrZXkgZXZlbnRzIHRvIGJlIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIpCisgICAgICAgICAgICAgICAgbGFzdC5rZXlzeW1zW2V2dC5rZXlzeW0ua2V5c3ltXSA9IGV2dC5rZXlzeW07CisgICAgICAgICAgICAgICAgbGFzdC5pZ25vcmVLZXlQcmVzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgbmV4dChldnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2tleXByZXNzJzoKKyAgICAgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB7a2V5SWQ6IGV2dC5rZXlJZCwga2V5c3ltczoge319OworICAgICAgICAgICAgICAgIHN0YXRlLnB1c2gobGFzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWV2dC5rZXlzeW0pIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygna2V5cHJlc3Mgd2l0aCBubyBrZXlzeW06JywgZXZ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGV4cGVjdCBhIGtleXByZXNzLCBhbmQgYWxyZWFkeSBzZW50IGEga2V5ZG93biB0byB0aGUgVk5DIHNlcnZlcgorICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGtleWRvd24sIG1ha2Ugc3VyZSB0byBza2lwIHRoaXMgZXZlbnQuCisgICAgICAgICAgICBpZiAoZXZ0LmtleXN5bSAmJiAhbGFzdC5pZ25vcmVLZXlQcmVzcykgeworICAgICAgICAgICAgICAgIGxhc3Qua2V5c3ltc1tldnQua2V5c3ltLmtleXN5bV0gPSBldnQua2V5c3ltOworICAgICAgICAgICAgICAgIGV2dC50eXBlID0gJ2tleWRvd24nOworICAgICAgICAgICAgICAgIG5leHQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdrZXl1cCc6CisgICAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGlkeCA9IG51bGw7CisgICAgICAgICAgICAvLyBkbyB3ZSBoYXZlIGEgbWF0Y2hpbmcga2V5IHRyYWNrZWQgYXMgYmVpbmcgZG93bj8KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpICE9PSBzdGF0ZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZVtpXS5rZXlJZCA9PT0gZXZ0LmtleUlkKSB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHdlIGNvdWxkbid0IGZpbmQgYSBtYXRjaCAoaXQgaGFwcGVucyksIGFzc3VtZSBpdCB3YXMgdGhlIGxhc3Qga2V5IHByZXNzZWQKKyAgICAgICAgICAgIGlmIChpZHggPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZHggPSBzdGF0ZS5sZW5ndGggLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaXRlbSA9IHN0YXRlLnNwbGljZShpZHgsIDEpWzBdOworICAgICAgICAgICAgLy8gZm9yIGVhY2gga2V5c3ltIHRyYWNrZWQgYnkgdGhpcyBrZXkgZW50cnksIGNsb25lIHRoZSBjdXJyZW50IGV2ZW50IGFuZCBvdmVycmlkZSB0aGUga2V5c3ltCisgICAgICAgICAgICB2YXIgY2xvbmUgPSAoZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBDbG9uZSgpe30KKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikgeyBDbG9uZS5wcm90b3R5cGU9b2JqOyByZXR1cm4gbmV3IENsb25lKCk7IH07CisgICAgICAgICAgICB9KCkpOworICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGl0ZW0ua2V5c3ltcykgeworICAgICAgICAgICAgICAgIHZhciBvdXQgPSBjbG9uZShldnQpOworICAgICAgICAgICAgICAgIG91dC5rZXlzeW0gPSBpdGVtLmtleXN5bXNba2V5XTsKKyAgICAgICAgICAgICAgICBuZXh0KG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncmVsZWFzZWFsbCc6CisgICAgICAgICAgICAvKiBqc2hpbnQgc2hhZG93OiB0cnVlICovCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHN0YXRlW2ldLmtleXN5bXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGtleXN5bSA9IHN0YXRlW2ldLmtleXN5bXNba2V5XTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCh7a2V5SWQ6IDAsIGtleXN5bToga2V5c3ltLCB0eXBlOiAna2V5dXAnfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoganNoaW50IHNoYWRvdzogZmFsc2UgKi8KKyAgICAgICAgICAgIHN0YXRlID0gW107CisgICAgICAgIH0KKyAgICB9OworfQorCisvLyBIYW5kbGVzICJlc2NhcGluZyIgb2YgbW9kaWZpZXJzOiBpZiBhIGNoYXIgbW9kaWZpZXIgaXMgdXNlZCB0byBwcm9kdWNlIGEga2V5c3ltIChzdWNoIGFzIEFsdEdyLTIgdG8gZ2VuZXJhdGUgYW4gQCksCisvLyB0aGVuIHRoZSBtb2RpZmllciBtdXN0IGJlICJ1bmRvbmUiIGJlZm9yZSBzZW5kaW5nIHRoZSBALCBhbmQgInJlZG9uZSIgYWZ0ZXJ3YXJkcy4KK2Z1bmN0aW9uIEVzY2FwZU1vZGlmaWVycyhuZXh0KSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHJldHVybiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgaWYgKGV2dC50eXBlICE9PSAna2V5ZG93bicgfHwgZXZ0LmVzY2FwZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBuZXh0KGV2dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gdW5kbyBtb2RpZmllcnMKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnQuZXNjYXBlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBuZXh0KHt0eXBlOiAna2V5dXAnLCBrZXlJZDogMCwga2V5c3ltOiBrZXlzeW1zLmxvb2t1cChldnQuZXNjYXBlW2ldKX0pOworICAgICAgICB9CisgICAgICAgIC8vIHNlbmQgdGhlIGNoYXJhY3RlciBldmVudAorICAgICAgICBuZXh0KGV2dCk7CisgICAgICAgIC8vIHJlZG8gbW9kaWZpZXJzCisgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IHRydWUgKi8KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnQuZXNjYXBlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBuZXh0KHt0eXBlOiAna2V5ZG93bicsIGtleUlkOiAwLCBrZXlzeW06IGtleXN5bXMubG9va3VwKGV2dC5lc2NhcGVbaV0pfSk7CisgICAgICAgIH0KKyAgICAgICAgLyoganNoaW50IHNoYWRvdzogZmFsc2UgKi8KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL2tleXN5bS5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlzeW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwZDU5NQotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlzeW0uanMKQEAgLTAsMCArMSwzNzYgQEAKK3ZhciBYS19Wb2lkU3ltYm9sID0gICAgICAgICAgICAgICAgMHhmZmZmZmYsIC8qIFZvaWQgc3ltYm9sICovCisKK1hLX0JhY2tTcGFjZSA9ICAgICAgICAgICAgICAgICAgIDB4ZmYwOCwgLyogQmFjayBzcGFjZSwgYmFjayBjaGFyICovCitYS19UYWIgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDksCitYS19MaW5lZmVlZCA9ICAgICAgICAgICAgICAgICAgICAweGZmMGEsIC8qIExpbmVmZWVkLCBMRiAqLworWEtfQ2xlYXIgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjBiLAorWEtfUmV0dXJuID0gICAgICAgICAgICAgICAgICAgICAgMHhmZjBkLCAvKiBSZXR1cm4sIGVudGVyICovCitYS19QYXVzZSA9ICAgICAgICAgICAgICAgICAgICAgICAweGZmMTMsIC8qIFBhdXNlLCBob2xkICovCitYS19TY3JvbGxfTG9jayA9ICAgICAgICAgICAgICAgICAweGZmMTQsCitYS19TeXNfUmVxID0gICAgICAgICAgICAgICAgICAgICAweGZmMTUsCitYS19Fc2NhcGUgPSAgICAgICAgICAgICAgICAgICAgICAweGZmMWIsCitYS19EZWxldGUgPSAgICAgICAgICAgICAgICAgICAgICAweGZmZmYsIC8qIERlbGV0ZSwgcnVib3V0ICovCisKKy8qIEN1cnNvciBjb250cm9sICYgbW90aW9uICovCisKK1hLX0hvbWUgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MCwKK1hLX0xlZnQgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MSwgLyogTW92ZSBsZWZ0LCBsZWZ0IGFycm93ICovCitYS19VcCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTIsIC8qIE1vdmUgdXAsIHVwIGFycm93ICovCitYS19SaWdodCA9ICAgICAgICAgICAgICAgICAgICAgICAweGZmNTMsIC8qIE1vdmUgcmlnaHQsIHJpZ2h0IGFycm93ICovCitYS19Eb3duID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNTQsIC8qIE1vdmUgZG93biwgZG93biBhcnJvdyAqLworWEtfUHJpb3IgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU1LCAvKiBQcmlvciwgcHJldmlvdXMgKi8KK1hLX1BhZ2VfVXAgPSAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NSwKK1hLX05leHQgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NiwgLyogTmV4dCAqLworWEtfUGFnZV9Eb3duID0gICAgICAgICAgICAgICAgICAgMHhmZjU2LAorWEtfRW5kID0gICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU3LCAvKiBFT0wgKi8KK1hLX0JlZ2luID0gICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1OCwgLyogQk9MICovCisKKworLyogTWlzYyBmdW5jdGlvbnMgKi8KKworWEtfU2VsZWN0ID0gICAgICAgICAgICAgICAgICAgICAgMHhmZjYwLCAvKiBTZWxlY3QsIG1hcmsgKi8KK1hLX1ByaW50ID0gICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MSwKK1hLX0V4ZWN1dGUgPSAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MiwgLyogRXhlY3V0ZSwgcnVuLCBkbyAqLworWEtfSW5zZXJ0ID0gICAgICAgICAgICAgICAgICAgICAgMHhmZjYzLCAvKiBJbnNlcnQsIGluc2VydCBoZXJlICovCitYS19VbmRvID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNjUsCitYS19SZWRvID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNjYsIC8qIFJlZG8sIGFnYWluICovCitYS19NZW51ID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNjcsCitYS19GaW5kID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNjgsIC8qIEZpbmQsIHNlYXJjaCAqLworWEtfQ2FuY2VsID0gICAgICAgICAgICAgICAgICAgICAgMHhmZjY5LCAvKiBDYW5jZWwsIHN0b3AsIGFib3J0LCBleGl0ICovCitYS19IZWxwID0gICAgICAgICAgICAgICAgICAgICAgICAweGZmNmEsIC8qIEhlbHAgKi8KK1hLX0JyZWFrID0gICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2YiwKK1hLX01vZGVfc3dpdGNoID0gICAgICAgICAgICAgICAgIDB4ZmY3ZSwgLyogQ2hhcmFjdGVyIHNldCBzd2l0Y2ggKi8KK1hLX3NjcmlwdF9zd2l0Y2ggPSAgICAgICAgICAgICAgIDB4ZmY3ZSwgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCitYS19OdW1fTG9jayA9ICAgICAgICAgICAgICAgICAgICAweGZmN2YsCisKKy8qIEtleXBhZCBmdW5jdGlvbnMsIGtleXBhZCBudW1iZXJzIGNsZXZlcmx5IGNob3NlbiB0byBtYXAgdG8gQVNDSUkgKi8KKworWEtfS1BfU3BhY2UgPSAgICAgICAgICAgICAgICAgICAgMHhmZjgwLCAvKiBTcGFjZSAqLworWEtfS1BfVGFiID0gICAgICAgICAgICAgICAgICAgICAgMHhmZjg5LAorWEtfS1BfRW50ZXIgPSAgICAgICAgICAgICAgICAgICAgMHhmZjhkLCAvKiBFbnRlciAqLworWEtfS1BfRjEgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkxLCAvKiBQRjEsIEtQX0EsIC4uLiAqLworWEtfS1BfRjIgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkyLAorWEtfS1BfRjMgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkzLAorWEtfS1BfRjQgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk0LAorWEtfS1BfSG9tZSA9ICAgICAgICAgICAgICAgICAgICAgMHhmZjk1LAorWEtfS1BfTGVmdCA9ICAgICAgICAgICAgICAgICAgICAgMHhmZjk2LAorWEtfS1BfVXAgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk3LAorWEtfS1BfUmlnaHQgPSAgICAgICAgICAgICAgICAgICAgMHhmZjk4LAorWEtfS1BfRG93biA9ICAgICAgICAgICAgICAgICAgICAgMHhmZjk5LAorWEtfS1BfUHJpb3IgPSAgICAgICAgICAgICAgICAgICAgMHhmZjlhLAorWEtfS1BfUGFnZV9VcCA9ICAgICAgICAgICAgICAgICAgMHhmZjlhCitYS19LUF9OZXh0ID0gICAgICAgICAgICAgICAgICAgICAweGZmOWIsCitYS19LUF9QYWdlX0Rvd24gPSAgICAgICAgICAgICAgICAweGZmOWIsCitYS19LUF9FbmQgPSAgICAgICAgICAgICAgICAgICAgICAweGZmOWMsCitYS19LUF9CZWdpbiA9ICAgICAgICAgICAgICAgICAgICAweGZmOWQsCitYS19LUF9JbnNlcnQgPSAgICAgICAgICAgICAgICAgICAweGZmOWUsCitYS19LUF9EZWxldGUgPSAgICAgICAgICAgICAgICAgICAweGZmOWYsCitYS19LUF9FcXVhbCA9ICAgICAgICAgICAgICAgICAgICAweGZmYmQsIC8qIEVxdWFscyAqLworWEtfS1BfTXVsdGlwbHkgPSAgICAgICAgICAgICAgICAgMHhmZmFhLAorWEtfS1BfQWRkID0gICAgICAgICAgICAgICAgICAgICAgMHhmZmFiLAorWEtfS1BfU2VwYXJhdG9yID0gICAgICAgICAgICAgICAgMHhmZmFjLCAvKiBTZXBhcmF0b3IsIG9mdGVuIGNvbW1hICovCitYS19LUF9TdWJ0cmFjdCA9ICAgICAgICAgICAgICAgICAweGZmYWQsCitYS19LUF9EZWNpbWFsID0gICAgICAgICAgICAgICAgICAweGZmYWUsCitYS19LUF9EaXZpZGUgPSAgICAgICAgICAgICAgICAgICAweGZmYWYsCisKK1hLX0tQXzAgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMCwKK1hLX0tQXzEgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMSwKK1hLX0tQXzIgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMiwKK1hLX0tQXzMgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMywKK1hLX0tQXzQgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNCwKK1hLX0tQXzUgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNSwKK1hLX0tQXzYgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNiwKK1hLX0tQXzcgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNywKK1hLX0tQXzggPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiOCwKK1hLX0tQXzkgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiOSwKKworLyoKKyAqIEF1eGlsaWFyeSBmdW5jdGlvbnM7IG5vdGUgdGhlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBmb3IgbGVmdCBhbmQgcmlnaHQKKyAqIGZ1bmN0aW9uIGtleXM7ICBTdW4ga2V5Ym9hcmRzIGFuZCBhIGZldyBvdGhlciBtYW51ZmFjdHVyZXJzIGhhdmUgc3VjaAorICogZnVuY3Rpb24ga2V5IGdyb3VwcyBvbiB0aGUgbGVmdCBhbmQvb3IgcmlnaHQgc2lkZXMgb2YgdGhlIGtleWJvYXJkLgorICogV2UndmUgbm90IGZvdW5kIGEga2V5Ym9hcmQgd2l0aCBtb3JlIHRoYW4gMzUgZnVuY3Rpb24ga2V5cyB0b3RhbC4KKyAqLworCitYS19GMSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYmUsCitYS19GMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYmYsCitYS19GMyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzAsCitYS19GNCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzEsCitYS19GNSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzIsCitYS19GNiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzMsCitYS19GNyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzQsCitYS19GOCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzUsCitYS19GOSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzYsCitYS19GMTAgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzcsCitYS19GMTEgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzgsCitYS19MMSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzgsCitYS19GMTIgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzksCitYS19MMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzksCitYS19GMTMgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2EsCitYS19MMyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2EsCitYS19GMTQgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2IsCitYS19MNCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2IsCitYS19GMTUgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2MsCitYS19MNSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2MsCitYS19GMTYgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2QsCitYS19MNiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2QsCitYS19GMTcgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2UsCitYS19MNyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2UsCitYS19GMTggPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2YsCitYS19MOCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2YsCitYS19GMTkgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDAsCitYS19MOSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDAsCitYS19GMjAgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDEsCitYS19MMTAgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDEsCitYS19GMjEgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDIsCitYS19SMSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDIsCitYS19GMjIgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDMsCitYS19SMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDMsCitYS19GMjMgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDQsCitYS19SMyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDQsCitYS19GMjQgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDUsCitYS19SNCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDUsCitYS19GMjUgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDYsCitYS19SNSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDYsCitYS19GMjYgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDcsCitYS19SNiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDcsCitYS19GMjcgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDgsCitYS19SNyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDgsCitYS19GMjggPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDksCitYS19SOCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDksCitYS19GMjkgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGEsCitYS19SOSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGEsCitYS19GMzAgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGIsCitYS19SMTAgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGIsCitYS19GMzEgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGMsCitYS19SMTEgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGMsCitYS19GMzIgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGQsCitYS19SMTIgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGQsCitYS19GMzMgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGUsCitYS19SMTMgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGUsCitYS19GMzQgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGYsCitYS19SMTQgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGYsCitYS19GMzUgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTAsCitYS19SMTUgPSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTAsCisKKy8qIE1vZGlmaWVycyAqLworCitYS19TaGlmdF9MID0gICAgICAgICAgICAgICAgICAgICAweGZmZTEsIC8qIExlZnQgc2hpZnQgKi8KK1hLX1NoaWZ0X1IgPSAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMiwgLyogUmlnaHQgc2hpZnQgKi8KK1hLX0NvbnRyb2xfTCA9ICAgICAgICAgICAgICAgICAgIDB4ZmZlMywgLyogTGVmdCBjb250cm9sICovCitYS19Db250cm9sX1IgPSAgICAgICAgICAgICAgICAgICAweGZmZTQsIC8qIFJpZ2h0IGNvbnRyb2wgKi8KK1hLX0NhcHNfTG9jayA9ICAgICAgICAgICAgICAgICAgIDB4ZmZlNSwgLyogQ2FwcyBsb2NrICovCitYS19TaGlmdF9Mb2NrID0gICAgICAgICAgICAgICAgICAweGZmZTYsIC8qIFNoaWZ0IGxvY2sgKi8KKworWEtfTWV0YV9MID0gICAgICAgICAgICAgICAgICAgICAgMHhmZmU3LCAvKiBMZWZ0IG1ldGEgKi8KK1hLX01ldGFfUiA9ICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlOCwgLyogUmlnaHQgbWV0YSAqLworWEtfQWx0X0wgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZmU5LCAvKiBMZWZ0IGFsdCAqLworWEtfQWx0X1IgPSAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVhLCAvKiBSaWdodCBhbHQgKi8KK1hLX1N1cGVyX0wgPSAgICAgICAgICAgICAgICAgICAgIDB4ZmZlYiwgLyogTGVmdCBzdXBlciAqLworWEtfU3VwZXJfUiA9ICAgICAgICAgICAgICAgICAgICAgMHhmZmVjLCAvKiBSaWdodCBzdXBlciAqLworWEtfSHlwZXJfTCA9ICAgICAgICAgICAgICAgICAgICAgMHhmZmVkLCAvKiBMZWZ0IGh5cGVyICovCitYS19IeXBlcl9SID0gICAgICAgICAgICAgICAgICAgICAweGZmZWUsIC8qIFJpZ2h0IGh5cGVyICovCisKKy8qCisgKiBMYXRpbiAxCisgKiAoSVNPL0lFQyA4ODU5LTEgPSBVbmljb2RlIFUrMDAyMC4uVSswMEZGKQorICogQnl0ZSAzID0gMAorICovCisKK1hLX3NwYWNlID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCwgLyogVSswMDIwIFNQQUNFICovCitYS19leGNsYW0gPSAgICAgICAgICAgICAgICAgICAgICAweDAwMjEsIC8qIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICovCitYS19xdW90ZWRibCA9ICAgICAgICAgICAgICAgICAgICAweDAwMjIsIC8qIFUrMDAyMiBRVU9UQVRJT04gTUFSSyAqLworWEtfbnVtYmVyc2lnbiA9ICAgICAgICAgICAgICAgICAgMHgwMDIzLCAvKiBVKzAwMjMgTlVNQkVSIFNJR04gKi8KK1hLX2RvbGxhciA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDAyNCwgLyogVSswMDI0IERPTExBUiBTSUdOICovCitYS19wZXJjZW50ID0gICAgICAgICAgICAgICAgICAgICAweDAwMjUsIC8qIFUrMDAyNSBQRVJDRU5UIFNJR04gKi8KK1hLX2FtcGVyc2FuZCA9ICAgICAgICAgICAgICAgICAgIDB4MDAyNiwgLyogVSswMDI2IEFNUEVSU0FORCAqLworWEtfYXBvc3Ryb3BoZSA9ICAgICAgICAgICAgICAgICAgMHgwMDI3LCAvKiBVKzAwMjcgQVBPU1RST1BIRSAqLworWEtfcXVvdGVyaWdodCA9ICAgICAgICAgICAgICAgICAgMHgwMDI3LCAvKiBkZXByZWNhdGVkICovCitYS19wYXJlbmxlZnQgPSAgICAgICAgICAgICAgICAgICAweDAwMjgsIC8qIFUrMDAyOCBMRUZUIFBBUkVOVEhFU0lTICovCitYS19wYXJlbnJpZ2h0ID0gICAgICAgICAgICAgICAgICAweDAwMjksIC8qIFUrMDAyOSBSSUdIVCBQQVJFTlRIRVNJUyAqLworWEtfYXN0ZXJpc2sgPSAgICAgICAgICAgICAgICAgICAgMHgwMDJhLCAvKiBVKzAwMkEgQVNURVJJU0sgKi8KK1hLX3BsdXMgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYiwgLyogVSswMDJCIFBMVVMgU0lHTiAqLworWEtfY29tbWEgPSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJjLCAvKiBVKzAwMkMgQ09NTUEgKi8KK1hLX21pbnVzID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAyZCwgLyogVSswMDJEIEhZUEhFTi1NSU5VUyAqLworWEtfcGVyaW9kID0gICAgICAgICAgICAgICAgICAgICAgMHgwMDJlLCAvKiBVKzAwMkUgRlVMTCBTVE9QICovCitYS19zbGFzaCA9ICAgICAgICAgICAgICAgICAgICAgICAweDAwMmYsIC8qIFUrMDAyRiBTT0xJRFVTICovCitYS18wID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAsIC8qIFUrMDAzMCBESUdJVCBaRVJPICovCitYS18xID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzEsIC8qIFUrMDAzMSBESUdJVCBPTkUgKi8KK1hLXzIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMiwgLyogVSswMDMyIERJR0lUIFRXTyAqLworWEtfMyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMzLCAvKiBVKzAwMzMgRElHSVQgVEhSRUUgKi8KK1hLXzQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNCwgLyogVSswMDM0IERJR0lUIEZPVVIgKi8KK1hLXzUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNSwgLyogVSswMDM1IERJR0lUIEZJVkUgKi8KK1hLXzYgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNiwgLyogVSswMDM2IERJR0lUIFNJWCAqLworWEtfNyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM3LCAvKiBVKzAwMzcgRElHSVQgU0VWRU4gKi8KK1hLXzggPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOCwgLyogVSswMDM4IERJR0lUIEVJR0hUICovCitYS185ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzksIC8qIFUrMDAzOSBESUdJVCBOSU5FICovCitYS19jb2xvbiA9ICAgICAgICAgICAgICAgICAgICAgICAweDAwM2EsIC8qIFUrMDAzQSBDT0xPTiAqLworWEtfc2VtaWNvbG9uID0gICAgICAgICAgICAgICAgICAgMHgwMDNiLCAvKiBVKzAwM0IgU0VNSUNPTE9OICovCitYS19sZXNzID0gICAgICAgICAgICAgICAgICAgICAgICAweDAwM2MsIC8qIFUrMDAzQyBMRVNTLVRIQU4gU0lHTiAqLworWEtfZXF1YWwgPSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNkLCAvKiBVKzAwM0QgRVFVQUxTIFNJR04gKi8KK1hLX2dyZWF0ZXIgPSAgICAgICAgICAgICAgICAgICAgIDB4MDAzZSwgLyogVSswMDNFIEdSRUFURVItVEhBTiBTSUdOICovCitYS19xdWVzdGlvbiA9ICAgICAgICAgICAgICAgICAgICAweDAwM2YsIC8qIFUrMDAzRiBRVUVTVElPTiBNQVJLICovCitYS19hdCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAsIC8qIFUrMDA0MCBDT01NRVJDSUFMIEFUICovCitYS19BID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDEsIC8qIFUrMDA0MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovCitYS19CID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDIsIC8qIFUrMDA0MiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCICovCitYS19DID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDMsIC8qIFUrMDA0MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDICovCitYS19EID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDQsIC8qIFUrMDA0NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovCitYS19FID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDUsIC8qIFUrMDA0NSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFICovCitYS19GID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDYsIC8qIFUrMDA0NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGICovCitYS19HID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDcsIC8qIFUrMDA0NyBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovCitYS19IID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDgsIC8qIFUrMDA0OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBIICovCitYS19JID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDksIC8qIFUrMDA0OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJICovCitYS19KID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGEsIC8qIFUrMDA0QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCitYS19LID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGIsIC8qIFUrMDA0QiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLICovCitYS19MID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGMsIC8qIFUrMDA0QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCitYS19NID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGQsIC8qIFUrMDA0RCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCitYS19OID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGUsIC8qIFUrMDA0RSBMQVRJTiBDQVBJVEFMIExFVFRFUiBOICovCitYS19PID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGYsIC8qIFUrMDA0RiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCitYS19QID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTAsIC8qIFUrMDA1MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCitYS19RID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTEsIC8qIFUrMDA1MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBRICovCitYS19SID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTIsIC8qIFUrMDA1MiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCitYS19TID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTMsIC8qIFUrMDA1MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovCitYS19UID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTQsIC8qIFUrMDA1NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBUICovCitYS19VID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTUsIC8qIFUrMDA1NSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVICovCitYS19WID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTYsIC8qIFUrMDA1NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovCitYS19XID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTcsIC8qIFUrMDA1NyBMQVRJTiBDQVBJVEFMIExFVFRFUiBXICovCitYS19YID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTgsIC8qIFUrMDA1OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYICovCitYS19ZID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTksIC8qIFUrMDA1OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovCitYS19aID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNWEsIC8qIFUrMDA1QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBaICovCitYS19icmFja2V0bGVmdCA9ICAgICAgICAgICAgICAgICAweDAwNWIsIC8qIFUrMDA1QiBMRUZUIFNRVUFSRSBCUkFDS0VUICovCitYS19iYWNrc2xhc2ggPSAgICAgICAgICAgICAgICAgICAweDAwNWMsIC8qIFUrMDA1QyBSRVZFUlNFIFNPTElEVVMgKi8KK1hLX2JyYWNrZXRyaWdodCA9ICAgICAgICAgICAgICAgIDB4MDA1ZCwgLyogVSswMDVEIFJJR0hUIFNRVUFSRSBCUkFDS0VUICovCitYS19hc2NpaWNpcmN1bSA9ICAgICAgICAgICAgICAgICAweDAwNWUsIC8qIFUrMDA1RSBDSVJDVU1GTEVYIEFDQ0VOVCAqLworWEtfdW5kZXJzY29yZSA9ICAgICAgICAgICAgICAgICAgMHgwMDVmLCAvKiBVKzAwNUYgTE9XIExJTkUgKi8KK1hLX2dyYXZlID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MCwgLyogVSswMDYwIEdSQVZFIEFDQ0VOVCAqLworWEtfcXVvdGVsZWZ0ID0gICAgICAgICAgICAgICAgICAgMHgwMDYwLCAvKiBkZXByZWNhdGVkICovCitYS19hID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEsIC8qIFUrMDA2MSBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLworWEtfYiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYyLCAvKiBVKzAwNjIgTEFUSU4gU01BTEwgTEVUVEVSIEIgKi8KK1hLX2MgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MywgLyogVSswMDYzIExBVElOIFNNQUxMIExFVFRFUiBDICovCitYS19kID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjQsIC8qIFUrMDA2NCBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLworWEtfZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY1LCAvKiBVKzAwNjUgTEFUSU4gU01BTEwgTEVUVEVSIEUgKi8KK1hLX2YgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NiwgLyogVSswMDY2IExBVElOIFNNQUxMIExFVFRFUiBGICovCitYS19nID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjcsIC8qIFUrMDA2NyBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLworWEtfaCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY4LCAvKiBVKzAwNjggTEFUSU4gU01BTEwgTEVUVEVSIEggKi8KK1hLX2kgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OSwgLyogVSswMDY5IExBVElOIFNNQUxMIExFVFRFUiBJICovCitYS19qID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmEsIC8qIFUrMDA2QSBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLworWEtfayA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZiLCAvKiBVKzAwNkIgTEFUSU4gU01BTEwgTEVUVEVSIEsgKi8KK1hLX2wgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YywgLyogVSswMDZDIExBVElOIFNNQUxMIExFVFRFUiBMICovCitYS19tID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmQsIC8qIFUrMDA2RCBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLworWEtfbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZlLCAvKiBVKzAwNkUgTEFUSU4gU01BTEwgTEVUVEVSIE4gKi8KK1hLX28gPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZiwgLyogVSswMDZGIExBVElOIFNNQUxMIExFVFRFUiBPICovCitYS19wID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAsIC8qIFUrMDA3MCBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLworWEtfcSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcxLCAvKiBVKzAwNzEgTEFUSU4gU01BTEwgTEVUVEVSIFEgKi8KK1hLX3IgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MiwgLyogVSswMDcyIExBVElOIFNNQUxMIExFVFRFUiBSICovCitYS19zID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzMsIC8qIFUrMDA3MyBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLworWEtfdCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc0LCAvKiBVKzAwNzQgTEFUSU4gU01BTEwgTEVUVEVSIFQgKi8KK1hLX3UgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NSwgLyogVSswMDc1IExBVElOIFNNQUxMIExFVFRFUiBVICovCitYS192ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzYsIC8qIFUrMDA3NiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLworWEtfdyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc3LCAvKiBVKzAwNzcgTEFUSU4gU01BTEwgTEVUVEVSIFcgKi8KK1hLX3ggPSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OCwgLyogVSswMDc4IExBVElOIFNNQUxMIExFVFRFUiBYICovCitYS195ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzksIC8qIFUrMDA3OSBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLworWEtfeiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdhLCAvKiBVKzAwN0EgTEFUSU4gU01BTEwgTEVUVEVSIFogKi8KK1hLX2JyYWNlbGVmdCA9ICAgICAgICAgICAgICAgICAgIDB4MDA3YiwgLyogVSswMDdCIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLworWEtfYmFyID0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdjLCAvKiBVKzAwN0MgVkVSVElDQUwgTElORSAqLworWEtfYnJhY2VyaWdodCA9ICAgICAgICAgICAgICAgICAgMHgwMDdkLCAvKiBVKzAwN0QgUklHSFQgQ1VSTFkgQlJBQ0tFVCAqLworWEtfYXNjaWl0aWxkZSA9ICAgICAgICAgICAgICAgICAgMHgwMDdlLCAvKiBVKzAwN0UgVElMREUgKi8KKworWEtfbm9icmVha3NwYWNlID0gICAgICAgICAgICAgICAgMHgwMGEwLCAvKiBVKzAwQTAgTk8tQlJFQUsgU1BBQ0UgKi8KK1hLX2V4Y2xhbWRvd24gPSAgICAgICAgICAgICAgICAgIDB4MDBhMSwgLyogVSswMEExIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksgKi8KK1hLX2NlbnQgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhMiwgLyogVSswMEEyIENFTlQgU0lHTiAqLworWEtfc3RlcmxpbmcgPSAgICAgICAgICAgICAgICAgICAgMHgwMGEzLCAvKiBVKzAwQTMgUE9VTkQgU0lHTiAqLworWEtfY3VycmVuY3kgPSAgICAgICAgICAgICAgICAgICAgMHgwMGE0LCAvKiBVKzAwQTQgQ1VSUkVOQ1kgU0lHTiAqLworWEtfeWVuID0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGE1LCAvKiBVKzAwQTUgWUVOIFNJR04gKi8KK1hLX2Jyb2tlbmJhciA9ICAgICAgICAgICAgICAgICAgIDB4MDBhNiwgLyogVSswMEE2IEJST0tFTiBCQVIgKi8KK1hLX3NlY3Rpb24gPSAgICAgICAgICAgICAgICAgICAgIDB4MDBhNywgLyogVSswMEE3IFNFQ1RJT04gU0lHTiAqLworWEtfZGlhZXJlc2lzID0gICAgICAgICAgICAgICAgICAgMHgwMGE4LCAvKiBVKzAwQTggRElBRVJFU0lTICovCitYS19jb3B5cmlnaHQgPSAgICAgICAgICAgICAgICAgICAweDAwYTksIC8qIFUrMDBBOSBDT1BZUklHSFQgU0lHTiAqLworWEtfb3JkZmVtaW5pbmUgPSAgICAgICAgICAgICAgICAgMHgwMGFhLCAvKiBVKzAwQUEgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KK1hLX2d1aWxsZW1vdGxlZnQgPSAgICAgICAgICAgICAgIDB4MDBhYiwgLyogVSswMEFCIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCitYS19ub3RzaWduID0gICAgICAgICAgICAgICAgICAgICAweDAwYWMsIC8qIFUrMDBBQyBOT1QgU0lHTiAqLworWEtfaHlwaGVuID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGFkLCAvKiBVKzAwQUQgU09GVCBIWVBIRU4gKi8KK1hLX3JlZ2lzdGVyZWQgPSAgICAgICAgICAgICAgICAgIDB4MDBhZSwgLyogVSswMEFFIFJFR0lTVEVSRUQgU0lHTiAqLworWEtfbWFjcm9uID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGFmLCAvKiBVKzAwQUYgTUFDUk9OICovCitYS19kZWdyZWUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwYjAsIC8qIFUrMDBCMCBERUdSRUUgU0lHTiAqLworWEtfcGx1c21pbnVzID0gICAgICAgICAgICAgICAgICAgMHgwMGIxLCAvKiBVKzAwQjEgUExVUy1NSU5VUyBTSUdOICovCitYS190d29zdXBlcmlvciA9ICAgICAgICAgICAgICAgICAweDAwYjIsIC8qIFUrMDBCMiBTVVBFUlNDUklQVCBUV08gKi8KK1hLX3RocmVlc3VwZXJpb3IgPSAgICAgICAgICAgICAgIDB4MDBiMywgLyogVSswMEIzIFNVUEVSU0NSSVBUIFRIUkVFICovCitYS19hY3V0ZSA9ICAgICAgICAgICAgICAgICAgICAgICAweDAwYjQsIC8qIFUrMDBCNCBBQ1VURSBBQ0NFTlQgKi8KK1hLX211ID0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNSwgLyogVSswMEI1IE1JQ1JPIFNJR04gKi8KK1hLX3BhcmFncmFwaCA9ICAgICAgICAgICAgICAgICAgIDB4MDBiNiwgLyogVSswMEI2IFBJTENST1cgU0lHTiAqLworWEtfcGVyaW9kY2VudGVyZWQgPSAgICAgICAgICAgICAgMHgwMGI3LCAvKiBVKzAwQjcgTUlERExFIERPVCAqLworWEtfY2VkaWxsYSA9ICAgICAgICAgICAgICAgICAgICAgMHgwMGI4LCAvKiBVKzAwQjggQ0VESUxMQSAqLworWEtfb25lc3VwZXJpb3IgPSAgICAgICAgICAgICAgICAgMHgwMGI5LCAvKiBVKzAwQjkgU1VQRVJTQ1JJUFQgT05FICovCitYS19tYXNjdWxpbmUgPSAgICAgICAgICAgICAgICAgICAweDAwYmEsIC8qIFUrMDBCQSBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KK1hLX2d1aWxsZW1vdHJpZ2h0ID0gICAgICAgICAgICAgIDB4MDBiYiwgLyogVSswMEJCIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworWEtfb25lcXVhcnRlciA9ICAgICAgICAgICAgICAgICAgMHgwMGJjLCAvKiBVKzAwQkMgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSICovCitYS19vbmVoYWxmID0gICAgICAgICAgICAgICAgICAgICAweDAwYmQsIC8qIFUrMDBCRCBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi8KK1hLX3RocmVlcXVhcnRlcnMgPSAgICAgICAgICAgICAgIDB4MDBiZSwgLyogVSswMEJFIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUyAqLworWEtfcXVlc3Rpb25kb3duID0gICAgICAgICAgICAgICAgMHgwMGJmLCAvKiBVKzAwQkYgSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqLworWEtfQWdyYXZlID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGMwLCAvKiBVKzAwQzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCitYS19BYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwYzEsIC8qIFUrMDBDMSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KK1hLX0FjaXJjdW1mbGV4ID0gICAgICAgICAgICAgICAgIDB4MDBjMiwgLyogVSswMEMyIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCitYS19BdGlsZGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwYzMsIC8qIFUrMDBDMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KK1hLX0FkaWFlcmVzaXMgPSAgICAgICAgICAgICAgICAgIDB4MDBjNCwgLyogVSswMEM0IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KK1hLX0FyaW5nID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDBjNSwgLyogVSswMEM1IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCitYS19BRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzYsIC8qIFUrMDBDNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLworWEtfQ2NlZGlsbGEgPSAgICAgICAgICAgICAgICAgICAgMHgwMGM3LCAvKiBVKzAwQzcgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KK1hLX0VncmF2ZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBjOCwgLyogVSswMEM4IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLworWEtfRWFjdXRlID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGM5LCAvKiBVKzAwQzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCitYS19FY2lyY3VtZmxleCA9ICAgICAgICAgICAgICAgICAweDAwY2EsIC8qIFUrMDBDQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLworWEtfRWRpYWVyZXNpcyA9ICAgICAgICAgICAgICAgICAgMHgwMGNiLCAvKiBVKzAwQ0IgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLworWEtfSWdyYXZlID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGNjLCAvKiBVKzAwQ0MgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCitYS19JYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwY2QsIC8qIFUrMDBDRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KK1hLX0ljaXJjdW1mbGV4ID0gICAgICAgICAgICAgICAgIDB4MDBjZSwgLyogVSswMENFIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCitYS19JZGlhZXJlc2lzID0gICAgICAgICAgICAgICAgICAweDAwY2YsIC8qIFUrMDBDRiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCitYS19FVEggPSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDAsIC8qIFUrMDBEMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEggKi8KK1hLX0V0aCA9ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMCwgLyogZGVwcmVjYXRlZCAqLworWEtfTnRpbGRlID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGQxLCAvKiBVKzAwRDEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCitYS19PZ3JhdmUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZDIsIC8qIFUrMDBEMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KK1hLX09hY3V0ZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMywgLyogVSswMEQzIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLworWEtfT2NpcmN1bWZsZXggPSAgICAgICAgICAgICAgICAgMHgwMGQ0LCAvKiBVKzAwRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KK1hLX090aWxkZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkNSwgLyogVSswMEQ1IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLworWEtfT2RpYWVyZXNpcyA9ICAgICAgICAgICAgICAgICAgMHgwMGQ2LCAvKiBVKzAwRDYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLworWEtfbXVsdGlwbHkgPSAgICAgICAgICAgICAgICAgICAgMHgwMGQ3LCAvKiBVKzAwRDcgTVVMVElQTElDQVRJT04gU0lHTiAqLworWEtfT3NsYXNoID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGQ4LCAvKiBVKzAwRDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworWEtfT29ibGlxdWUgPSAgICAgICAgICAgICAgICAgICAgMHgwMGQ4LCAvKiBVKzAwRDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworWEtfVWdyYXZlID0gICAgICAgICAgICAgICAgICAgICAgMHgwMGQ5LCAvKiBVKzAwRDkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCitYS19VYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZGEsIC8qIFUrMDBEQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KK1hLX1VjaXJjdW1mbGV4ID0gICAgICAgICAgICAgICAgIDB4MDBkYiwgLyogVSswMERCIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCitYS19VZGlhZXJlc2lzID0gICAgICAgICAgICAgICAgICAweDAwZGMsIC8qIFUrMDBEQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCitYS19ZYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZGQsIC8qIFUrMDBERCBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUgKi8KK1hLX1RIT1JOID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZSwgLyogVSswMERFIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOICovCitYS19UaG9ybiA9ICAgICAgICAgICAgICAgICAgICAgICAweDAwZGUsIC8qIGRlcHJlY2F0ZWQgKi8KK1hLX3NzaGFycCA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZiwgLyogVSswMERGIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTICovCitYS19hZ3JhdmUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZTAsIC8qIFUrMDBFMCBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCitYS19hYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZTEsIC8qIFUrMDBFMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCitYS19hY2lyY3VtZmxleCA9ICAgICAgICAgICAgICAgICAweDAwZTIsIC8qIFUrMDBFMiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KK1hLX2F0aWxkZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMywgLyogVSswMEUzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUgKi8KK1hLX2FkaWFlcmVzaXMgPSAgICAgICAgICAgICAgICAgIDB4MDBlNCwgLyogVSswMEU0IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCitYS19hcmluZyA9ICAgICAgICAgICAgICAgICAgICAgICAweDAwZTUsIC8qIFUrMDBFNSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KK1hLX2FlID0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlNiwgLyogVSswMEU2IExBVElOIFNNQUxMIExFVFRFUiBBRSAqLworWEtfY2NlZGlsbGEgPSAgICAgICAgICAgICAgICAgICAgMHgwMGU3LCAvKiBVKzAwRTcgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCitYS19lZ3JhdmUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZTgsIC8qIFUrMDBFOCBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCitYS19lYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZTksIC8qIFUrMDBFOSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCitYS19lY2lyY3VtZmxleCA9ICAgICAgICAgICAgICAgICAweDAwZWEsIC8qIFUrMDBFQSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KK1hLX2VkaWFlcmVzaXMgPSAgICAgICAgICAgICAgICAgIDB4MDBlYiwgLyogVSswMEVCIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCitYS19pZ3JhdmUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZWMsIC8qIFUrMDBFQyBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCitYS19pYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZWQsIC8qIFUrMDBFRCBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCitYS19pY2lyY3VtZmxleCA9ICAgICAgICAgICAgICAgICAweDAwZWUsIC8qIFUrMDBFRSBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KK1hLX2lkaWFlcmVzaXMgPSAgICAgICAgICAgICAgICAgIDB4MDBlZiwgLyogVSswMEVGIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCitYS19ldGggPSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjAsIC8qIFUrMDBGMCBMQVRJTiBTTUFMTCBMRVRURVIgRVRIICovCitYS19udGlsZGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZjEsIC8qIFUrMDBGMSBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFICovCitYS19vZ3JhdmUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZjIsIC8qIFUrMDBGMiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCitYS19vYWN1dGUgPSAgICAgICAgICAgICAgICAgICAgICAweDAwZjMsIC8qIFUrMDBGMyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCitYS19vY2lyY3VtZmxleCA9ICAgICAgICAgICAgICAgICAweDAwZjQsIC8qIFUrMDBGNCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KK1hLX290aWxkZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmNSwgLyogVSswMEY1IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUgKi8KK1hLX29kaWFlcmVzaXMgPSAgICAgICAgICAgICAgICAgIDB4MDBmNiwgLyogVSswMEY2IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCitYS19kaXZpc2lvbiA9ICAgICAgICAgICAgICAgICAgICAweDAwZjcsIC8qIFUrMDBGNyBESVZJU0lPTiBTSUdOICovCitYS19vc2xhc2ggPSAgICAgICAgICAgICAgICAgICAgICAweDAwZjgsIC8qIFUrMDBGOCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworWEtfb29ibGlxdWUgPSAgICAgICAgICAgICAgICAgICAgMHgwMGY4LCAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KK1hLX3VncmF2ZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmOSwgLyogVSswMEY5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KK1hLX3VhY3V0ZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmYSwgLyogVSswMEZBIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KK1hLX3VjaXJjdW1mbGV4ID0gICAgICAgICAgICAgICAgIDB4MDBmYiwgLyogVSswMEZCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworWEtfdWRpYWVyZXNpcyA9ICAgICAgICAgICAgICAgICAgMHgwMGZjLCAvKiBVKzAwRkMgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KK1hLX3lhY3V0ZSA9ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZCwgLyogVSswMEZEIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUgKi8KK1hLX3Rob3JuID0gICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZSwgLyogVSswMEZFIExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAqLworWEtfeWRpYWVyZXNpcyA9ICAgICAgICAgICAgICAgICAgMHgwMGZmOyAvKiBVKzAwRkYgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9rZXlzeW1kZWYuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUva2V5c3ltZGVmLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUva2V5c3ltZGVmLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgbWFwcGluZ3MgZnJvbSBVbmljb2RlIGNvZGVwb2ludHMgdG8gdGhlIGtleXN5bSB2YWx1ZXMKKy8vIChhbmQgb3B0aW9uYWxseSwga2V5IG5hbWVzKSBleHBlY3RlZCBieSB0aGUgUkZCIHByb3RvY29sCisvLyBIb3cgdGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQ6CisvLyBub2RlIC9Vc2Vycy9qYWxmL2Rldi9taS9ub3ZuYy91dGlscy9wYXJzZS5qcyAvb3B0L1gxMS9pbmNsdWRlL1gxMS9rZXlzeW1kZWYuaAordmFyIGtleXN5bXMgPSAoZnVuY3Rpb24oKXsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGtleW5hbWVzID0gbnVsbDsKKyAgICB2YXIgY29kZXBvaW50cyA9IHsiMzIiOjMyLCIzMyI6MzMsIjM0IjozNCwiMzUiOjM1LCIzNiI6MzYsIjM3IjozNywiMzgiOjM4LCIzOSI6MzksIjQwIjo0MCwiNDEiOjQxLCI0MiI6NDIsIjQzIjo0MywiNDQiOjQ0LCI0NSI6NDUsIjQ2Ijo0NiwiNDciOjQ3LCI0OCI6NDgsIjQ5Ijo0OSwiNTAiOjUwLCI1MSI6NTEsIjUyIjo1MiwiNTMiOjUzLCI1NCI6NTQsIjU1Ijo1NSwiNTYiOjU2LCI1NyI6NTcsIjU4Ijo1OCwiNTkiOjU5LCI2MCI6NjAsIjYxIjo2MSwiNjIiOjYyLCI2MyI6NjMsIjY0Ijo2NCwiNjUiOjY1LCI2NiI6NjYsIjY3Ijo2NywiNjgiOjY4LCI2OSI6NjksIjcwIjo3MCwiNzEiOjcxLCI3MiI6NzIsIjczIjo3MywiNzQiOjc0LCI3NSI6NzUsIjc2Ijo3NiwiNzciOjc3LCI3OCI6NzgsIjc5Ijo3OSwiODAiOjgwLCI4MSI6ODEsIjgyIjo4MiwiODMiOjgzLCI4NCI6ODQsIjg1Ijo4NSwiODYiOjg2LCI4NyI6ODcsIjg4Ijo4OCwiODkiOjg5LCI5MCI6OTAsIjkxIjo5MSwiOTIiOjkyLCI5MyI6OTMsIjk0Ijo5NCwiOTUiOjk1LCI5NiI6OTYsIjk3Ijo5NywiOTgiOjk4LCI5OSI6OTksIjEwMCI6MTAwLCIxMDEiOjEwMSwiMTAyIjoxMDIsIjEwMyI6MTAzLCIxMDQiOjEwNCwiMTA1IjoxMDUsIjEwNiI6MTA2LCIxMDciOjEwNywiMTA4IjoxMDgsIjEwOSI6MTA5LCIxMTAiOjExMCwiMTExIjoxMTEsIjExMiI6MTEyLCIxMTMiOjExMywiMTE0IjoxMTQsIjExNSI6MTE1LCIxMTYiOjExNiwiMTE3IjoxMTcsIjExOCI6MTE4LCIxMTkiOjExOSwiMTIwIjoxMjAsIjEyMSI6MTIxLCIxMjIiOjEyMiwiMTIzIjoxMjMsIjEyNCI6MTI0LCIxMjUiOjEyNSwiMTI2IjoxMjYsIjE2MCI6MTYwLCIxNjEiOjE2MSwiMTYyIjoxNjIsIjE2MyI6MTYzLCIxNjQiOjE2NCwiMTY1IjoxNjUsIjE2NiI6MTY2LCIxNjciOjE2NywiMTY4IjoxNjgsIjE2OSI6MTY5LCIxNzAiOjE3MCwiMTcxIjoxNzEsIjE3MiI6MTcyLCIxNzMiOjE3MywiMTc0IjoxNzQsIjE3NSI6MTc1LCIxNzYiOjE3NiwiMTc3IjoxNzcsIjE3OCI6MTc4LCIxNzkiOjE3OSwiMTgwIjoxODAsIjE4MSI6MTgxLCIxODIiOjE4MiwiMTgzIjoxODMsIjE4NCI6MTg0LCIxODUiOjE4NSwiMTg2IjoxODYsIjE4NyI6MTg3LCIxODgiOjE4OCwiMTg5IjoxODksIjE5MCI6MTkwLCIxOTEiOjE5MSwiMTkyIjoxOTIsIjE5MyI6MTkzLCIxOTQiOjE5NCwiMTk1IjoxOTUsIjE5NiI6MTk2LCIxOTciOjE5NywiMTk4IjoxOTgsIjE5OSI6MTk5LCIyMDAiOjIwMCwiMjAxIjoyMDEsIjIwMiI6MjAyLCIyMDMiOjIwMywiMjA0IjoyMDQsIjIwNSI6MjA1LCIyMDYiOjIwNiwiMjA3IjoyMDcsIjIwOCI6MjA4LCIyMDkiOjIwOSwiMjEwIjoyMTAsIjIxMSI6MjExLCIyMTIiOjIxMiwiMjEzIjoyMTMsIjIxNCI6MjE0LCIyMTUiOjIxNSwiMjE2IjoyMTYsIjIxNyI6MjE3LCIyMTgiOjIxOCwiMjE5IjoyMTksIjIyMCI6MjIwLCIyMjEiOjIyMSwiMjIyIjoyMjIsIjIyMyI6MjIzLCIyMjQiOjIyNCwiMjI1IjoyMjUsIjIyNiI6MjI2LCIyMjciOjIyNywiMjI4IjoyMjgsIjIyOSI6MjI5LCIyMzAiOjIzMCwiMjMxIjoyMzEsIjIzMiI6MjMyLCIyMzMiOjIzMywiMjM0IjoyMzQsIjIzNSI6MjM1LCIyMzYiOjIzNiwiMjM3IjoyMzcsIjIzOCI6MjM4LCIyMzkiOjIzOSwiMjQwIjoyNDAsIjI0MSI6MjQxLCIyNDIiOjI0MiwiMjQzIjoyNDMsIjI0NCI6MjQ0LCIyNDUiOjI0NSwiMjQ2IjoyNDYsIjI0NyI6MjQ3LCIyNDgiOjI0OCwiMjQ5IjoyNDksIjI1MCI6MjUwLCIyNTEiOjI1MSwiMjUyIjoyNTIsIjI1MyI6MjUzLCIyNTQiOjI1NCwiMjU1IjoyNTUsIjI1NiI6OTYwLCIyNTciOjk5MiwiMjU4Ijo0NTEsIjI1OSI6NDgzLCIyNjAiOjQxNywiMjYxIjo0MzMsIjI2MiI6NDU0LCIyNjMiOjQ4NiwiMjY0Ijo3MTAsIjI2NSI6NzQyLCIyNjYiOjcwOSwiMjY3Ijo3NDEsIjI2OCI6NDU2LCIyNjkiOjQ4OCwiMjcwIjo0NjMsIjI3MSI6NDk1LCIyNzIiOjQ2NCwiMjczIjo0OTYsIjI3NCI6OTM4LCIyNzUiOjk1NCwiMjc4Ijo5NzIsIjI3OSI6MTAwNCwiMjgwIjo0NTgsIjI4MSI6NDkwLCIyODIiOjQ2MCwiMjgzIjo0OTIsIjI4NCI6NzI4LCIyODUiOjc2MCwiMjg2Ijo2ODMsIjI4NyI6Njk5LCIyODgiOjcyNSwiMjg5Ijo3NTcsIjI5MCI6OTM5LCIyOTEiOjk1NSwiMjkyIjo2NzgsIjI5MyI6Njk0LCIyOTQiOjY3MywiMjk1Ijo2ODksIjI5NiI6OTMzLCIyOTciOjk0OSwiMjk4Ijo5NzUsIjI5OSI6MTAwNywiMzAwIjoxNjc3NzUxNiwiMzAxIjoxNjc3NzUxNywiMzAyIjo5NjcsIjMwMyI6OTk5LCIzMDQiOjY4MSwiMzA1Ijo2OTcsIjMwOCI6Njg0LCIzMDkiOjcwMCwiMzEwIjo5NzksIjMxMSI6MTAxMSwiMzEyIjo5MzAsIjMxMyI6NDUzLCIzMTQiOjQ4NSwiMzE1Ijo5MzQsIjMxNiI6OTUwLCIzMTciOjQyMSwiMzE4Ijo0MzcsIjMyMSI6NDE5LCIzMjIiOjQzNSwiMzIzIjo0NjUsIjMyNCI6NDk3LCIzMjUiOjk3NywiMzI2IjoxMDA5LCIzMjciOjQ2NiwiMzI4Ijo0OTgsIjMzMCI6OTU3LCIzMzEiOjk1OSwiMzMyIjo5NzgsIjMzMyI6MTAxMCwiMzM2Ijo0NjksIjMzNyI6NTAxLCIzMzgiOjUwNTIsIjMzOSI6NTA1MywiMzQwIjo0NDgsIjM0MSI6NDgwLCIzNDIiOjkzMSwiMzQzIjo5NDcsIjM0NCI6NDcyLCIzNDUiOjUwNCwiMzQ2Ijo0MjIsIjM0NyI6NDM4LCIzNDgiOjczNCwiMzQ5Ijo3NjYsIjM1MCI6NDI2LCIzNTEiOjQ0MiwiMzUyIjo0MjUsIjM1MyI6NDQxLCIzNTQiOjQ3OCwiMzU1Ijo1MTAsIjM1NiI6NDI3LCIzNTciOjQ0MywiMzU4Ijo5NDAsIjM1OSI6OTU2LCIzNjAiOjk4OSwiMzYxIjoxMDIxLCIzNjIiOjk5MCwiMzYzIjoxMDIyLCIzNjQiOjczMywiMzY1Ijo3NjUsIjM2NiI6NDczLCIzNjciOjUwNSwiMzY4Ijo0NzUsIjM2OSI6NTA3LCIzNzAiOjk4NSwiMzcxIjoxMDE3LCIzNzIiOjE2Nzc3NTg4LCIzNzMiOjE2Nzc3NTg5LCIzNzQiOjE2Nzc3NTkwLCIzNzUiOjE2Nzc3NTkxLCIzNzYiOjUwNTQsIjM3NyI6NDI4LCIzNzgiOjQ0NCwiMzc5Ijo0MzEsIjM4MCI6NDQ3LCIzODEiOjQzMCwiMzgyIjo0NDYsIjM5OSI6MTY3Nzc2MTUsIjQwMiI6MjI5NCwiNDE1IjoxNjc3NzYzMSwiNDE2IjoxNjc3NzYzMiwiNDE3IjoxNjc3NzYzMywiNDMxIjoxNjc3NzY0NywiNDMyIjoxNjc3NzY0OCwiNDM3IjoxNjc3NzY1MywiNDM4IjoxNjc3NzY1NCwiNDM5IjoxNjc3NzY1NSwiNDY2IjoxNjc3NzY4MSwiNDg2IjoxNjc3NzcwMiwiNDg3IjoxNjc3NzcwMywiNjAxIjoxNjc3NzgxNywiNjI5IjoxNjc3Nzg0NSwiNjU4IjoxNjc3Nzg3NCwiNzExIjo0MzksIjcyOCI6NDE4LCI3MjkiOjUxMSwiNzMxIjo0MzQsIjczMyI6NDQ1LCI5MDEiOjE5NjYsIjkwMiI6MTk1MywiOTA0IjoxOTU0LCI5MDUiOjE5NTUsIjkwNiI6MTk1NiwiOTA4IjoxOTU5LCI5MTAiOjE5NjAsIjkxMSI6MTk2MywiOTEyIjoxOTc0LCI5MTMiOjE5ODUsIjkxNCI6MTk4NiwiOTE1IjoxOTg3LCI5MTYiOjE5ODgsIjkxNyI6MTk4OSwiOTE4IjoxOTkwLCI5MTkiOjE5OTEsIjkyMCI6MTk5MiwiOTIxIjoxOTkzLCI5MjIiOjE5OTQsIjkyMyI6MTk5NSwiOTI0IjoxOTk2LCI5MjUiOjE5OTcsIjkyNiI6MTk5OCwiOTI3IjoxOTk5LCI5MjgiOjIwMDAsIjkyOSI6MjAwMSwiOTMxIjoyMDAyLCI5MzIiOjIwMDQsIjkzMyI6MjAwNSwiOTM0IjoyMDA2LCI5MzUiOjIwMDcsIjkzNiI6MjAwOCwiOTM3IjoyMDA5LCI5MzgiOjE5NTcsIjkzOSI6MTk2MSwiOTQwIjoxOTY5LCI5NDEiOjE5NzAsIjk0MiI6MTk3MSwiOTQzIjoxOTcyLCI5NDQiOjE5NzgsIjk0NSI6MjAxNywiOTQ2IjoyMDE4LCI5NDciOjIwMTksIjk0OCI6MjAyMCwiOTQ5IjoyMDIxLCI5NTAiOjIwMjIsIjk1MSI6MjAyMywiOTUyIjoyMDI0LCI5NTMiOjIwMjUsIjk1NCI6MjAyNiwiOTU1IjoyMDI3LCI5NTYiOjIwMjgsIjk1NyI6MjAyOSwiOTU4IjoyMDMwLCI5NTkiOjIwMzEsIjk2MCI6MjAzMiwiOTYxIjoyMDMzLCI5NjIiOjIwMzUsIjk2MyI6MjAzNCwiOTY0IjoyMDM2LCI5NjUiOjIwMzcsIjk2NiI6MjAzOCwiOTY3IjoyMDM5LCI5NjgiOjIwNDAsIjk2OSI6MjA0MSwiOTcwIjoxOTczLCI5NzEiOjE5NzcsIjk3MiI6MTk3NSwiOTczIjoxOTc2LCI5NzQiOjE5NzksIjEwMjUiOjE3MTUsIjEwMjYiOjE3MTMsIjEwMjciOjE3MTQsIjEwMjgiOjE3MTYsIjEwMjkiOjE3MTcsIjEwMzAiOjE3MTgsIjEwMzEiOjE3MTksIjEwMzIiOjE3MjAsIjEwMzMiOjE3MjEsIjEwMzQiOjE3MjIsIjEwMzUiOjE3MjMsIjEwMzYiOjE3MjQsIjEwMzgiOjE3MjYsIjEwMzkiOjE3MjcsIjEwNDAiOjE3NjEsIjEwNDEiOjE3NjIsIjEwNDIiOjE3ODMsIjEwNDMiOjE3NjcsIjEwNDQiOjE3NjQsIjEwNDUiOjE3NjUsIjEwNDYiOjE3ODIsIjEwNDciOjE3ODYsIjEwNDgiOjE3NjksIjEwNDkiOjE3NzAsIjEwNTAiOjE3NzEsIjEwNTEiOjE3NzIsIjEwNTIiOjE3NzMsIjEwNTMiOjE3NzQsIjEwNTQiOjE3NzUsIjEwNTUiOjE3NzYsIjEwNTYiOjE3NzgsIjEwNTciOjE3NzksIjEwNTgiOjE3ODAsIjEwNTkiOjE3ODEsIjEwNjAiOjE3NjYsIjEwNjEiOjE3NjgsIjEwNjIiOjE3NjMsIjEwNjMiOjE3OTAsIjEwNjQiOjE3ODcsIjEwNjUiOjE3ODksIjEwNjYiOjE3OTEsIjEwNjciOjE3ODUsIjEwNjgiOjE3ODQsIjEwNjkiOjE3ODgsIjEwNzAiOjE3NjAsIjEwNzEiOjE3NzcsIjEwNzIiOjE3MjksIjEwNzMiOjE3MzAsIjEwNzQiOjE3NTEsIjEwNzUiOjE3MzUsIjEwNzYiOjE3MzIsIjEwNzciOjE3MzMsIjEwNzgiOjE3NTAsIjEwNzkiOjE3NTQsIjEwODAiOjE3MzcsIjEwODEiOjE3MzgsIjEwODIiOjE3MzksIjEwODMiOjE3NDAsIjEwODQiOjE3NDEsIjEwODUiOjE3NDIsIjEwODYiOjE3NDMsIjEwODciOjE3NDQsIjEwODgiOjE3NDYsIjEwODkiOjE3NDcsIjEwOTAiOjE3NDgsIjEwOTEiOjE3NDksIjEwOTIiOjE3MzQsIjEwOTMiOjE3MzYsIjEwOTQiOjE3MzEsIjEwOTUiOjE3NTgsIjEwOTYiOjE3NTUsIjEwOTciOjE3NTcsIjEwOTgiOjE3NTksIjEwOTkiOjE3NTMsIjExMDAiOjE3NTIsIjExMDEiOjE3NTYsIjExMDIiOjE3MjgsIjExMDMiOjE3NDUsIjExMDUiOjE2OTksIjExMDYiOjE2OTcsIjExMDciOjE2OTgsIjExMDgiOjE3MDAsIjExMDkiOjE3MDEsIjExMTAiOjE3MDIsIjExMTEiOjE3MDMsIjExMTIiOjE3MDQsIjExMTMiOjE3MDUsIjExMTQiOjE3MDYsIjExMTUiOjE3MDcsIjExMTYiOjE3MDgsIjExMTgiOjE3MTAsIjExMTkiOjE3MTEsIjExNjgiOjE3MjUsIjExNjkiOjE3MDksIjExNzAiOjE2Nzc4Mzg2LCIxMTcxIjoxNjc3ODM4NywiMTE3NCI6MTY3NzgzOTAsIjExNzUiOjE2Nzc4MzkxLCIxMTc4IjoxNjc3ODM5NCwiMTE3OSI6MTY3NzgzOTUsIjExODAiOjE2Nzc4Mzk2LCIxMTgxIjoxNjc3ODM5NywiMTE4NiI6MTY3Nzg0MDIsIjExODciOjE2Nzc4NDAzLCIxMTk4IjoxNjc3ODQxNCwiMTE5OSI6MTY3Nzg0MTUsIjEyMDAiOjE2Nzc4NDE2LCIxMjAxIjoxNjc3ODQxNywiMTIwMiI6MTY3Nzg0MTgsIjEyMDMiOjE2Nzc4NDE5LCIxMjA2IjoxNjc3ODQyMiwiMTIwNyI6MTY3Nzg0MjMsIjEyMDgiOjE2Nzc4NDI0LCIxMjA5IjoxNjc3ODQyNSwiMTIxMCI6MTY3Nzg0MjYsIjEyMTEiOjE2Nzc4NDI3LCIxMjQwIjoxNjc3ODQ1NiwiMTI0MSI6MTY3Nzg0NTcsIjEyNTAiOjE2Nzc4NDY2LCIxMjUxIjoxNjc3ODQ2NywiMTI1NiI6MTY3Nzg0NzIsIjEyNTciOjE2Nzc4NDczLCIxMjYyIjoxNjc3ODQ3OCwiMTI2MyI6MTY3Nzg0NzksIjEzMjkiOjE2Nzc4NTQ1LCIxMzMwIjoxNjc3ODU0NiwiMTMzMSI6MTY3Nzg1NDcsIjEzMzIiOjE2Nzc4NTQ4LCIxMzMzIjoxNjc3ODU0OSwiMTMzNCI6MTY3Nzg1NTAsIjEzMzUiOjE2Nzc4NTUxLCIxMzM2IjoxNjc3ODU1MiwiMTMzNyI6MTY3Nzg1NTMsIjEzMzgiOjE2Nzc4NTU0LCIxMzM5IjoxNjc3ODU1NSwiMTM0MCI6MTY3Nzg1NTYsIjEzNDEiOjE2Nzc4NTU3LCIxMzQyIjoxNjc3ODU1OCwiMTM0MyI6MTY3Nzg1NTksIjEzNDQiOjE2Nzc4NTYwLCIxMzQ1IjoxNjc3ODU2MSwiMTM0NiI6MTY3Nzg1NjIsIjEzNDciOjE2Nzc4NTYzLCIxMzQ4IjoxNjc3ODU2NCwiMTM0OSI6MTY3Nzg1NjUsIjEzNTAiOjE2Nzc4NTY2LCIxMzUxIjoxNjc3ODU2NywiMTM1MiI6MTY3Nzg1NjgsIjEzNTMiOjE2Nzc4NTY5LCIxMzU0IjoxNjc3ODU3MCwiMTM1NSI6MTY3Nzg1NzEsIjEzNTYiOjE2Nzc4NTcyLCIxMzU3IjoxNjc3ODU3MywiMTM1OCI6MTY3Nzg1NzQsIjEzNTkiOjE2Nzc4NTc1LCIxMzYwIjoxNjc3ODU3NiwiMTM2MSI6MTY3Nzg1NzcsIjEzNjIiOjE2Nzc4NTc4LCIxMzYzIjoxNjc3ODU3OSwiMTM2NCI6MTY3Nzg1ODAsIjEzNjUiOjE2Nzc4NTgxLCIxMzY2IjoxNjc3ODU4MiwiMTM3MCI6MTY3Nzg1ODYsIjEzNzEiOjE2Nzc4NTg3LCIxMzcyIjoxNjc3ODU4OCwiMTM3MyI6MTY3Nzg1ODksIjEzNzQiOjE2Nzc4NTkwLCIxMzc3IjoxNjc3ODU5MywiMTM3OCI6MTY3Nzg1OTQsIjEzNzkiOjE2Nzc4NTk1LCIxMzgwIjoxNjc3ODU5NiwiMTM4MSI6MTY3Nzg1OTcsIjEzODIiOjE2Nzc4NTk4LCIxMzgzIjoxNjc3ODU5OSwiMTM4NCI6MTY3Nzg2MDAsIjEzODUiOjE2Nzc4NjAxLCIxMzg2IjoxNjc3ODYwMiwiMTM4NyI6MTY3Nzg2MDMsIjEzODgiOjE2Nzc4NjA0LCIxMzg5IjoxNjc3ODYwNSwiMTM5MCI6MTY3Nzg2MDYsIjEzOTEiOjE2Nzc4NjA3LCIxMzkyIjoxNjc3ODYwOCwiMTM5MyI6MTY3Nzg2MDksIjEzOTQiOjE2Nzc4NjEwLCIxMzk1IjoxNjc3ODYxMSwiMTM5NiI6MTY3Nzg2MTIsIjEzOTciOjE2Nzc4NjEzLCIxMzk4IjoxNjc3ODYxNCwiMTM5OSI6MTY3Nzg2MTUsIjE0MDAiOjE2Nzc4NjE2LCIxNDAxIjoxNjc3ODYxNywiMTQwMiI6MTY3Nzg2MTgsIjE0MDMiOjE2Nzc4NjE5LCIxNDA0IjoxNjc3ODYyMCwiMTQwNSI6MTY3Nzg2MjEsIjE0MDYiOjE2Nzc4NjIyLCIxNDA3IjoxNjc3ODYyMywiMTQwOCI6MTY3Nzg2MjQsIjE0MDkiOjE2Nzc4NjI1LCIxNDEwIjoxNjc3ODYyNiwiMTQxMSI6MTY3Nzg2MjcsIjE0MTIiOjE2Nzc4NjI4LCIxNDEzIjoxNjc3ODYyOSwiMTQxNCI6MTY3Nzg2MzAsIjE0MTUiOjE2Nzc4NjMxLCIxNDE3IjoxNjc3ODYzMywiMTQxOCI6MTY3Nzg2MzQsIjE0ODgiOjMyOTYsIjE0ODkiOjMyOTcsIjE0OTAiOjMyOTgsIjE0OTEiOjMyOTksIjE0OTIiOjMzMDAsIjE0OTMiOjMzMDEsIjE0OTQiOjMzMDIsIjE0OTUiOjMzMDMsIjE0OTYiOjMzMDQsIjE0OTciOjMzMDUsIjE0OTgiOjMzMDYsIjE0OTkiOjMzMDcsIjE1MDAiOjMzMDgsIjE1MDEiOjMzMDksIjE1MDIiOjMzMTAsIjE1MDMiOjMzMTEsIjE1MDQiOjMzMTIsIjE1MDUiOjMzMTMsIjE1MDYiOjMzMTQsIjE1MDciOjMzMTUsIjE1MDgiOjMzMTYsIjE1MDkiOjMzMTcsIjE1MTAiOjMzMTgsIjE1MTEiOjMzMTksIjE1MTIiOjMzMjAsIjE1MTMiOjMzMjEsIjE1MTQiOjMzMjIsIjE1NDgiOjE0NTIsIjE1NjMiOjE0NjcsIjE1NjciOjE0NzEsIjE1NjkiOjE0NzMsIjE1NzAiOjE0NzQsIjE1NzEiOjE0NzUsIjE1NzIiOjE0NzYsIjE1NzMiOjE0NzcsIjE1NzQiOjE0NzgsIjE1NzUiOjE0NzksIjE1NzYiOjE0ODAsIjE1NzciOjE0ODEsIjE1NzgiOjE0ODIsIjE1NzkiOjE0ODMsIjE1ODAiOjE0ODQsIjE1ODEiOjE0ODUsIjE1ODIiOjE0ODYsIjE1ODMiOjE0ODcsIjE1ODQiOjE0ODgsIjE1ODUiOjE0ODksIjE1ODYiOjE0OTAsIjE1ODciOjE0OTEsIjE1ODgiOjE0OTIsIjE1ODkiOjE0OTMsIjE1OTAiOjE0OTQsIjE1OTEiOjE0OTUsIjE1OTIiOjE0OTYsIjE1OTMiOjE0OTcsIjE1OTQiOjE0OTgsIjE2MDAiOjE1MDQsIjE2MDEiOjE1MDUsIjE2MDIiOjE1MDYsIjE2MDMiOjE1MDcsIjE2MDQiOjE1MDgsIjE2MDUiOjE1MDksIjE2MDYiOjE1MTAsIjE2MDciOjE1MTEsIjE2MDgiOjE1MTIsIjE2MDkiOjE1MTMsIjE2MTAiOjE1MTQsIjE2MTEiOjE1MTUsIjE2MTIiOjE1MTYsIjE2MTMiOjE1MTcsIjE2MTQiOjE1MTgsIjE2MTUiOjE1MTksIjE2MTYiOjE1MjAsIjE2MTciOjE1MjEsIjE2MTgiOjE1MjIsIjE2MTkiOjE2Nzc4ODM1LCIxNjIwIjoxNjc3ODgzNiwiMTYyMSI6MTY3Nzg4MzcsIjE2MzIiOjE2Nzc4ODQ4LCIxNjMzIjoxNjc3ODg0OSwiMTYzNCI6MTY3Nzg4NTAsIjE2MzUiOjE2Nzc4ODUxLCIxNjM2IjoxNjc3ODg1MiwiMTYzNyI6MTY3Nzg4NTMsIjE2MzgiOjE2Nzc4ODU0LCIxNjM5IjoxNjc3ODg1NSwiMTY0MCI6MTY3Nzg4NTYsIjE2NDEiOjE2Nzc4ODU3LCIxNjQyIjoxNjc3ODg1OCwiMTY0OCI6MTY3Nzg4NjQsIjE2NTciOjE2Nzc4ODczLCIxNjYyIjoxNjc3ODg3OCwiMTY3MCI6MTY3Nzg4ODYsIjE2NzIiOjE2Nzc4ODg4LCIxNjgxIjoxNjc3ODg5NywiMTY4OCI6MTY3Nzg5MDQsIjE3MDAiOjE2Nzc4OTE2LCIxNzA1IjoxNjc3ODkyMSwiMTcxMSI6MTY3Nzg5MjcsIjE3MjIiOjE2Nzc4OTM4LCIxNzI2IjoxNjc3ODk0MiwiMTcyOSI6MTY3Nzg5NDUsIjE3NDAiOjE2Nzc4OTU2LCIxNzQ2IjoxNjc3ODk2MiwiMTc0OCI6MTY3Nzg5NjQsIjE3NzYiOjE2Nzc4OTkyLCIxNzc3IjoxNjc3ODk5MywiMTc3OCI6MTY3Nzg5OTQsIjE3NzkiOjE2Nzc4OTk1LCIxNzgwIjoxNjc3ODk5NiwiMTc4MSI6MTY3Nzg5OTcsIjE3ODIiOjE2Nzc4OTk4LCIxNzgzIjoxNjc3ODk5OSwiMTc4NCI6MTY3NzkwMDAsIjE3ODUiOjE2Nzc5MDAxLCIzNDU4IjoxNjc4MDY3NCwiMzQ1OSI6MTY3ODA2NzUsIjM0NjEiOjE2NzgwNjc3LCIzNDYyIjoxNjc4MDY3OCwiMzQ2MyI6MTY3ODA2NzksIjM0NjQiOjE2NzgwNjgwLCIzNDY1IjoxNjc4MDY4MSwiMzQ2NiI6MTY3ODA2ODIsIjM0NjciOjE2NzgwNjgzLCIzNDY4IjoxNjc4MDY4NCwiMzQ2OSI6MTY3ODA2ODUsIjM0NzAiOjE2NzgwNjg2LCIzNDcxIjoxNjc4MDY4NywiMzQ3MiI6MTY3ODA2ODgsIjM0NzMiOjE2NzgwNjg5LCIzNDc0IjoxNjc4MDY5MCwiMzQ3NSI6MTY3ODA2OTEsIjM0NzYiOjE2NzgwNjkyLCIzNDc3IjoxNjc4MDY5MywiMzQ3OCI6MTY3ODA2OTQsIjM0ODIiOjE2NzgwNjk4LCIzNDgzIjoxNjc4MDY5OSwiMzQ4NCI6MTY3ODA3MDAsIjM0ODUiOjE2NzgwNzAxLCIzNDg2IjoxNjc4MDcwMiwiMzQ4NyI6MTY3ODA3MDMsIjM0ODgiOjE2NzgwNzA0LCIzNDg5IjoxNjc4MDcwNSwiMzQ5MCI6MTY3ODA3MDYsIjM0OTEiOjE2NzgwNzA3LCIzNDkyIjoxNjc4MDcwOCwiMzQ5MyI6MTY3ODA3MDksIjM0OTQiOjE2NzgwNzEwLCIzNDk1IjoxNjc4MDcxMSwiMzQ5NiI6MTY3ODA3MTIsIjM0OTciOjE2NzgwNzEzLCIzNDk4IjoxNjc4MDcxNCwiMzQ5OSI6MTY3ODA3MTUsIjM1MDAiOjE2NzgwNzE2LCIzNTAxIjoxNjc4MDcxNywiMzUwMiI6MTY3ODA3MTgsIjM1MDMiOjE2NzgwNzE5LCIzNTA0IjoxNjc4MDcyMCwiMzUwNSI6MTY3ODA3MjEsIjM1MDciOjE2NzgwNzIzLCIzNTA4IjoxNjc4MDcyNCwiMzUwOSI6MTY3ODA3MjUsIjM1MTAiOjE2NzgwNzI2LCIzNTExIjoxNjc4MDcyNywiMzUxMiI6MTY3ODA3MjgsIjM1MTMiOjE2NzgwNzI5LCIzNTE0IjoxNjc4MDczMCwiMzUxNSI6MTY3ODA3MzEsIjM1MTciOjE2NzgwNzMzLCIzNTIwIjoxNjc4MDczNiwiMzUyMSI6MTY3ODA3MzcsIjM1MjIiOjE2NzgwNzM4LCIzNTIzIjoxNjc4MDczOSwiMzUyNCI6MTY3ODA3NDAsIjM1MjUiOjE2NzgwNzQxLCIzNTI2IjoxNjc4MDc0MiwiMzUzMCI6MTY3ODA3NDYsIjM1MzUiOjE2NzgwNzUxLCIzNTM2IjoxNjc4MDc1MiwiMzUzNyI6MTY3ODA3NTMsIjM1MzgiOjE2NzgwNzU0LCIzNTM5IjoxNjc4MDc1NSwiMzU0MCI6MTY3ODA3NTYsIjM1NDIiOjE2NzgwNzU4LCIzNTQ0IjoxNjc4MDc2MCwiMzU0NSI6MTY3ODA3NjEsIjM1NDYiOjE2NzgwNzYyLCIzNTQ3IjoxNjc4MDc2MywiMzU0OCI6MTY3ODA3NjQsIjM1NDkiOjE2NzgwNzY1LCIzNTUwIjoxNjc4MDc2NiwiMzU1MSI6MTY3ODA3NjcsIjM1NzAiOjE2NzgwNzg2LCIzNTcxIjoxNjc4MDc4NywiMzU3MiI6MTY3ODA3ODgsIjM1ODUiOjM0ODksIjM1ODYiOjM0OTAsIjM1ODciOjM0OTEsIjM1ODgiOjM0OTIsIjM1ODkiOjM0OTMsIjM1OTAiOjM0OTQsIjM1OTEiOjM0OTUsIjM1OTIiOjM0OTYsIjM1OTMiOjM0OTcsIjM1OTQiOjM0OTgsIjM1OTUiOjM0OTksIjM1OTYiOjM1MDAsIjM1OTciOjM1MDEsIjM1OTgiOjM1MDIsIjM1OTkiOjM1MDMsIjM2MDAiOjM1MDQsIjM2MDEiOjM1MDUsIjM2MDIiOjM1MDYsIjM2MDMiOjM1MDcsIjM2MDQiOjM1MDgsIjM2MDUiOjM1MDksIjM2MDYiOjM1MTAsIjM2MDciOjM1MTEsIjM2MDgiOjM1MTIsIjM2MDkiOjM1MTMsIjM2MTAiOjM1MTQsIjM2MTEiOjM1MTUsIjM2MTIiOjM1MTYsIjM2MTMiOjM1MTcsIjM2MTQiOjM1MTgsIjM2MTUiOjM1MTksIjM2MTYiOjM1MjAsIjM2MTciOjM1MjEsIjM2MTgiOjM1MjIsIjM2MTkiOjM1MjMsIjM2MjAiOjM1MjQsIjM2MjEiOjM1MjUsIjM2MjIiOjM1MjYsIjM2MjMiOjM1MjcsIjM2MjQiOjM1MjgsIjM2MjUiOjM1MjksIjM2MjYiOjM1MzAsIjM2MjciOjM1MzEsIjM2MjgiOjM1MzIsIjM2MjkiOjM1MzMsIjM2MzAiOjM1MzQsIjM2MzEiOjM1MzUsIjM2MzIiOjM1MzYsIjM2MzMiOjM1MzcsIjM2MzQiOjM1MzgsIjM2MzUiOjM1MzksIjM2MzYiOjM1NDAsIjM2MzciOjM1NDEsIjM2MzgiOjM1NDIsIjM2MzkiOjM1NDMsIjM2NDAiOjM1NDQsIjM2NDEiOjM1NDUsIjM2NDIiOjM1NDYsIjM2NDciOjM1NTEsIjM2NDgiOjM1NTIsIjM2NDkiOjM1NTMsIjM2NTAiOjM1NTQsIjM2NTEiOjM1NTUsIjM2NTIiOjM1NTYsIjM2NTMiOjM1NTcsIjM2NTQiOjM1NTgsIjM2NTUiOjM1NTksIjM2NTYiOjM1NjAsIjM2NTciOjM1NjEsIjM2NTgiOjM1NjIsIjM2NTkiOjM1NjMsIjM2NjAiOjM1NjQsIjM2NjEiOjM1NjUsIjM2NjQiOjM1NjgsIjM2NjUiOjM1NjksIjM2NjYiOjM1NzAsIjM2NjciOjM1NzEsIjM2NjgiOjM1NzIsIjM2NjkiOjM1NzMsIjM2NzAiOjM1NzQsIjM2NzEiOjM1NzUsIjM2NzIiOjM1NzYsIjM2NzMiOjM1NzcsIjQzMDQiOjE2NzgxNTIwLCI0MzA1IjoxNjc4MTUyMSwiNDMwNiI6MTY3ODE1MjIsIjQzMDciOjE2NzgxNTIzLCI0MzA4IjoxNjc4MTUyNCwiNDMwOSI6MTY3ODE1MjUsIjQzMTAiOjE2NzgxNTI2LCI0MzExIjoxNjc4MTUyNywiNDMxMiI6MTY3ODE1MjgsIjQzMTMiOjE2NzgxNTI5LCI0MzE0IjoxNjc4MTUzMCwiNDMxNSI6MTY3ODE1MzEsIjQzMTYiOjE2NzgxNTMyLCI0MzE3IjoxNjc4MTUzMywiNDMxOCI6MTY3ODE1MzQsIjQzMTkiOjE2NzgxNTM1LCI0MzIwIjoxNjc4MTUzNiwiNDMyMSI6MTY3ODE1MzcsIjQzMjIiOjE2NzgxNTM4LCI0MzIzIjoxNjc4MTUzOSwiNDMyNCI6MTY3ODE1NDAsIjQzMjUiOjE2NzgxNTQxLCI0MzI2IjoxNjc4MTU0MiwiNDMyNyI6MTY3ODE1NDMsIjQzMjgiOjE2NzgxNTQ0LCI0MzI5IjoxNjc4MTU0NSwiNDMzMCI6MTY3ODE1NDYsIjQzMzEiOjE2NzgxNTQ3LCI0MzMyIjoxNjc4MTU0OCwiNDMzMyI6MTY3ODE1NDksIjQzMzQiOjE2NzgxNTUwLCI0MzM1IjoxNjc4MTU1MSwiNDMzNiI6MTY3ODE1NTIsIjQzMzciOjE2NzgxNTUzLCI0MzM4IjoxNjc4MTU1NCwiNDMzOSI6MTY3ODE1NTUsIjQzNDAiOjE2NzgxNTU2LCI0MzQxIjoxNjc4MTU1NywiNDM0MiI6MTY3ODE1NTgsIjc2ODIiOjE2Nzg0ODk4LCI3NjgzIjoxNjc4NDg5OSwiNzY5MCI6MTY3ODQ5MDYsIjc2OTEiOjE2Nzg0OTA3LCI3NzEwIjoxNjc4NDkyNiwiNzcxMSI6MTY3ODQ5MjcsIjc3MzQiOjE2Nzg0OTUwLCI3NzM1IjoxNjc4NDk1MSwiNzc0NCI6MTY3ODQ5NjAsIjc3NDUiOjE2Nzg0OTYxLCI3NzY2IjoxNjc4NDk4MiwiNzc2NyI6MTY3ODQ5ODMsIjc3NzYiOjE2Nzg0OTkyLCI3Nzc3IjoxNjc4NDk5MywiNzc4NiI6MTY3ODUwMDIsIjc3ODciOjE2Nzg1MDAzLCI3ODA4IjoxNjc4NTAyNCwiNzgwOSI6MTY3ODUwMjUsIjc4MTAiOjE2Nzg1MDI2LCI3ODExIjoxNjc4NTAyNywiNzgxMiI6MTY3ODUwMjgsIjc4MTMiOjE2Nzg1MDI5LCI3ODE4IjoxNjc4NTAzNCwiNzgxOSI6MTY3ODUwMzUsIjc4NDAiOjE2Nzg1MDU2LCI3ODQxIjoxNjc4NTA1NywiNzg0MiI6MTY3ODUwNTgsIjc4NDMiOjE2Nzg1MDU5LCI3ODQ0IjoxNjc4NTA2MCwiNzg0NSI6MTY3ODUwNjEsIjc4NDYiOjE2Nzg1MDYyLCI3ODQ3IjoxNjc4NTA2MywiNzg0OCI6MTY3ODUwNjQsIjc4NDkiOjE2Nzg1MDY1LCI3ODUwIjoxNjc4NTA2NiwiNzg1MSI6MTY3ODUwNjcsIjc4NTIiOjE2Nzg1MDY4LCI3ODUzIjoxNjc4NTA2OSwiNzg1NCI6MTY3ODUwNzAsIjc4NTUiOjE2Nzg1MDcxLCI3ODU2IjoxNjc4NTA3MiwiNzg1NyI6MTY3ODUwNzMsIjc4NTgiOjE2Nzg1MDc0LCI3ODU5IjoxNjc4NTA3NSwiNzg2MCI6MTY3ODUwNzYsIjc4NjEiOjE2Nzg1MDc3LCI3ODYyIjoxNjc4NTA3OCwiNzg2MyI6MTY3ODUwNzksIjc4NjQiOjE2Nzg1MDgwLCI3ODY1IjoxNjc4NTA4MSwiNzg2NiI6MTY3ODUwODIsIjc4NjciOjE2Nzg1MDgzLCI3ODY4IjoxNjc4NTA4NCwiNzg2OSI6MTY3ODUwODUsIjc4NzAiOjE2Nzg1MDg2LCI3ODcxIjoxNjc4NTA4NywiNzg3MiI6MTY3ODUwODgsIjc4NzMiOjE2Nzg1MDg5LCI3ODc0IjoxNjc4NTA5MCwiNzg3NSI6MTY3ODUwOTEsIjc4NzYiOjE2Nzg1MDkyLCI3ODc3IjoxNjc4NTA5MywiNzg3OCI6MTY3ODUwOTQsIjc4NzkiOjE2Nzg1MDk1LCI3ODgwIjoxNjc4NTA5NiwiNzg4MSI6MTY3ODUwOTcsIjc4ODIiOjE2Nzg1MDk4LCI3ODgzIjoxNjc4NTA5OSwiNzg4NCI6MTY3ODUxMDAsIjc4ODUiOjE2Nzg1MTAxLCI3ODg2IjoxNjc4NTEwMiwiNzg4NyI6MTY3ODUxMDMsIjc4ODgiOjE2Nzg1MTA0LCI3ODg5IjoxNjc4NTEwNSwiNzg5MCI6MTY3ODUxMDYsIjc4OTEiOjE2Nzg1MTA3LCI3ODkyIjoxNjc4NTEwOCwiNzg5MyI6MTY3ODUxMDksIjc4OTQiOjE2Nzg1MTEwLCI3ODk1IjoxNjc4NTExMSwiNzg5NiI6MTY3ODUxMTIsIjc4OTciOjE2Nzg1MTEzLCI3ODk4IjoxNjc4NTExNCwiNzg5OSI6MTY3ODUxMTUsIjc5MDAiOjE2Nzg1MTE2LCI3OTAxIjoxNjc4NTExNywiNzkwMiI6MTY3ODUxMTgsIjc5MDMiOjE2Nzg1MTE5LCI3OTA0IjoxNjc4NTEyMCwiNzkwNSI6MTY3ODUxMjEsIjc5MDYiOjE2Nzg1MTIyLCI3OTA3IjoxNjc4NTEyMywiNzkwOCI6MTY3ODUxMjQsIjc5MDkiOjE2Nzg1MTI1LCI3OTEwIjoxNjc4NTEyNiwiNzkxMSI6MTY3ODUxMjcsIjc5MTIiOjE2Nzg1MTI4LCI3OTEzIjoxNjc4NTEyOSwiNzkxNCI6MTY3ODUxMzAsIjc5MTUiOjE2Nzg1MTMxLCI3OTE2IjoxNjc4NTEzMiwiNzkxNyI6MTY3ODUxMzMsIjc5MTgiOjE2Nzg1MTM0LCI3OTE5IjoxNjc4NTEzNSwiNzkyMCI6MTY3ODUxMzYsIjc5MjEiOjE2Nzg1MTM3LCI3OTIyIjoxNjc4NTEzOCwiNzkyMyI6MTY3ODUxMzksIjc5MjQiOjE2Nzg1MTQwLCI3OTI1IjoxNjc4NTE0MSwiNzkyNiI6MTY3ODUxNDIsIjc5MjciOjE2Nzg1MTQzLCI3OTI4IjoxNjc4NTE0NCwiNzkyOSI6MTY3ODUxNDUsIjgxOTQiOjI3MjIsIjgxOTUiOjI3MjEsIjgxOTYiOjI3MjMsIjgxOTciOjI3MjQsIjgxOTkiOjI3MjUsIjgyMDAiOjI3MjYsIjgyMDEiOjI3MjcsIjgyMDIiOjI3MjgsIjgyMTAiOjI3NDcsIjgyMTEiOjI3MzAsIjgyMTIiOjI3MjksIjgyMTMiOjE5NjcsIjgyMTUiOjMyOTUsIjgyMTYiOjI3NjgsIjgyMTciOjI3NjksIjgyMTgiOjI4MTMsIjgyMjAiOjI3NzAsIjgyMjEiOjI3NzEsIjgyMjIiOjI4MTQsIjgyMjQiOjI4MDEsIjgyMjUiOjI4MDIsIjgyMjYiOjI3OTAsIjgyMjkiOjI3MzUsIjgyMzAiOjI3MzQsIjgyNDAiOjI3NzMsIjgyNDIiOjI3NzQsIjgyNDMiOjI3NzUsIjgyNDgiOjI4MTIsIjgyNTQiOjExNTAsIjgzMDQiOjE2Nzg1NTIwLCI4MzA4IjoxNjc4NTUyNCwiODMwOSI6MTY3ODU1MjUsIjgzMTAiOjE2Nzg1NTI2LCI4MzExIjoxNjc4NTUyNywiODMxMiI6MTY3ODU1MjgsIjgzMTMiOjE2Nzg1NTI5LCI4MzIwIjoxNjc4NTUzNiwiODMyMSI6MTY3ODU1MzcsIjgzMjIiOjE2Nzg1NTM4LCI4MzIzIjoxNjc4NTUzOSwiODMyNCI6MTY3ODU1NDAsIjgzMjUiOjE2Nzg1NTQxLCI4MzI2IjoxNjc4NTU0MiwiODMyNyI6MTY3ODU1NDMsIjgzMjgiOjE2Nzg1NTQ0LCI4MzI5IjoxNjc4NTU0NSwiODM1MiI6MTY3ODU1NjgsIjgzNTMiOjE2Nzg1NTY5LCI4MzU0IjoxNjc4NTU3MCwiODM1NSI6MTY3ODU1NzEsIjgzNTYiOjE2Nzg1NTcyLCI4MzU3IjoxNjc4NTU3MywiODM1OCI6MTY3ODU1NzQsIjgzNTkiOjE2Nzg1NTc1LCI4MzYwIjoxNjc4NTU3NiwiODM2MSI6MzgzOSwiODM2MiI6MTY3ODU1NzgsIjgzNjMiOjE2Nzg1NTc5LCI4MzY0Ijo4MzY0LCI4NDUzIjoyNzQ0LCI4NDcwIjoxNzEyLCI4NDcxIjoyODExLCI4NDc4IjoyNzcyLCI4NDgyIjoyNzYxLCI4NTMxIjoyNzM2LCI4NTMyIjoyNzM3LCI4NTMzIjoyNzM4LCI4NTM0IjoyNzM5LCI4NTM1IjoyNzQwLCI4NTM2IjoyNzQxLCI4NTM3IjoyNzQyLCI4NTM4IjoyNzQzLCI4NTM5IjoyNzU1LCI4NTQwIjoyNzU2LCI4NTQxIjoyNzU3LCI4NTQyIjoyNzU4LCI4NTkyIjoyMjk5LCI4NTkzIjoyMzAwLCI4NTk0IjoyMzAxLCI4NTk1IjoyMzAyLCI4NjU4IjoyMjU0LCI4NjYwIjoyMjUzLCI4NzA2IjoyMjg3LCI4NzA5IjoxNjc4NTkyNSwiODcxMSI6MjI0NSwiODcxMiI6MTY3ODU5MjgsIjg3MTMiOjE2Nzg1OTI5LCI4NzE1IjoxNjc4NTkzMSwiODcyOCI6MzAxOCwiODczMCI6MjI2MiwiODczMSI6MTY3ODU5NDcsIjg3MzIiOjE2Nzg1OTQ4LCI4NzMzIjoyMjQxLCI4NzM0IjoyMjQyLCI4NzQzIjoyMjcwLCI4NzQ0IjoyMjcxLCI4NzQ1IjoyMjY4LCI4NzQ2IjoyMjY5LCI4NzQ3IjoyMjM5LCI4NzQ4IjoxNjc4NTk2NCwiODc0OSI6MTY3ODU5NjUsIjg3NTYiOjIyNDAsIjg3NTciOjE2Nzg1OTczLCI4NzY0IjoyMjQ4LCI4NzcxIjoyMjQ5LCI4NzczIjoxNjc4NTk5MiwiODc3NSI6MTY3ODU5OTEsIjg4MDAiOjIyMzcsIjg4MDEiOjIyNTUsIjg4MDIiOjE2Nzg2MDE4LCI4ODAzIjoxNjc4NjAxOSwiODgwNCI6MjIzNiwiODgwNSI6MjIzOCwiODgzNCI6MjI2NiwiODgzNSI6MjI2NywiODg2NiI6MzA2OCwiODg2NyI6MzAzNiwiODg2OCI6MzAxMCwiODg2OSI6MzAyMiwiODk2OCI6MzAyNywiODk3MCI6MzAxMiwiODk4MSI6MjgxMCwiODk5MiI6MjIxMiwiODk5MyI6MjIxMywiOTEwOSI6MzAyMCwiOTExNSI6MjIxOSwiOTExNyI6MjIyMCwiOTExOCI6MjIyMSwiOTEyMCI6MjIyMiwiOTEyMSI6MjIxNSwiOTEyMyI6MjIxNiwiOTEyNCI6MjIxNywiOTEyNiI6MjIxOCwiOTEyOCI6MjIyMywiOTEzMiI6MjIyNCwiOTE0MyI6MjIwOSwiOTE0NiI6MjU0MywiOTE0NyI6MjU0NCwiOTE0OCI6MjU0NiwiOTE0OSI6MjU0NywiOTIyNSI6MjUzMCwiOTIyNiI6MjUzMywiOTIyNyI6MjUzNywiOTIyOCI6MjUzMSwiOTIyOSI6MjUzMiwiOTI1MSI6MjczMiwiOTI1MiI6MjUzNiwiOTQ3MiI6MjIxMSwiOTQ3NCI6MjIxNCwiOTQ4NCI6MjIxMCwiOTQ4OCI6MjUzOSwiOTQ5MiI6MjU0MSwiOTQ5NiI6MjUzOCwiOTUwMCI6MjU0OCwiOTUwOCI6MjU0OSwiOTUxNiI6MjU1MSwiOTUyNCI6MjU1MCwiOTUzMiI6MjU0MiwiOTYxOCI6MjUyOSwiOTY0MiI6Mjc5MSwiOTY0MyI6Mjc4NSwiOTY0NCI6Mjc3OSwiOTY0NSI6Mjc4NiwiOTY0NiI6Mjc4MywiOTY0NyI6Mjc2NywiOTY1MCI6Mjc5MiwiOTY1MSI6Mjc4NywiOTY1NCI6Mjc4MSwiOTY1NSI6Mjc2NSwiOTY2MCI6Mjc5MywiOTY2MSI6Mjc4OCwiOTY2NCI6Mjc4MCwiOTY2NSI6Mjc2NCwiOTY3MCI6MjUyOCwiOTY3NSI6Mjc2NiwiOTY3OSI6Mjc4MiwiOTcwMiI6Mjc4NCwiOTczNCI6Mjc4OSwiOTc0MiI6MjgwOSwiOTc0NyI6Mjc2MiwiOTc1NiI6Mjc5NCwiOTc1OCI6Mjc5NSwiOTc5MiI6MjgwOCwiOTc5NCI6MjgwNywiOTgyNyI6Mjc5NiwiOTgyOSI6Mjc5OCwiOTgzMCI6Mjc5NywiOTgzNyI6MjgwNiwiOTgzOSI6MjgwNSwiMTAwMDMiOjI4MDMsIjEwMDA3IjoyODA0LCIxMDAxMyI6Mjc3NywiMTAwMTYiOjI4MDAsIjEwMjE2IjoyNzQ4LCIxMDIxNyI6Mjc1MCwiMTAyNDAiOjE2Nzg3NDU2LCIxMDI0MSI6MTY3ODc0NTcsIjEwMjQyIjoxNjc4NzQ1OCwiMTAyNDMiOjE2Nzg3NDU5LCIxMDI0NCI6MTY3ODc0NjAsIjEwMjQ1IjoxNjc4NzQ2MSwiMTAyNDYiOjE2Nzg3NDYyLCIxMDI0NyI6MTY3ODc0NjMsIjEwMjQ4IjoxNjc4NzQ2NCwiMTAyNDkiOjE2Nzg3NDY1LCIxMDI1MCI6MTY3ODc0NjYsIjEwMjUxIjoxNjc4NzQ2NywiMTAyNTIiOjE2Nzg3NDY4LCIxMDI1MyI6MTY3ODc0NjksIjEwMjU0IjoxNjc4NzQ3MCwiMTAyNTUiOjE2Nzg3NDcxLCIxMDI1NiI6MTY3ODc0NzIsIjEwMjU3IjoxNjc4NzQ3MywiMTAyNTgiOjE2Nzg3NDc0LCIxMDI1OSI6MTY3ODc0NzUsIjEwMjYwIjoxNjc4NzQ3NiwiMTAyNjEiOjE2Nzg3NDc3LCIxMDI2MiI6MTY3ODc0NzgsIjEwMjYzIjoxNjc4NzQ3OSwiMTAyNjQiOjE2Nzg3NDgwLCIxMDI2NSI6MTY3ODc0ODEsIjEwMjY2IjoxNjc4NzQ4MiwiMTAyNjciOjE2Nzg3NDgzLCIxMDI2OCI6MTY3ODc0ODQsIjEwMjY5IjoxNjc4NzQ4NSwiMTAyNzAiOjE2Nzg3NDg2LCIxMDI3MSI6MTY3ODc0ODcsIjEwMjcyIjoxNjc4NzQ4OCwiMTAyNzMiOjE2Nzg3NDg5LCIxMDI3NCI6MTY3ODc0OTAsIjEwMjc1IjoxNjc4NzQ5MSwiMTAyNzYiOjE2Nzg3NDkyLCIxMDI3NyI6MTY3ODc0OTMsIjEwMjc4IjoxNjc4NzQ5NCwiMTAyNzkiOjE2Nzg3NDk1LCIxMDI4MCI6MTY3ODc0OTYsIjEwMjgxIjoxNjc4NzQ5NywiMTAyODIiOjE2Nzg3NDk4LCIxMDI4MyI6MTY3ODc0OTksIjEwMjg0IjoxNjc4NzUwMCwiMTAyODUiOjE2Nzg3NTAxLCIxMDI4NiI6MTY3ODc1MDIsIjEwMjg3IjoxNjc4NzUwMywiMTAyODgiOjE2Nzg3NTA0LCIxMDI4OSI6MTY3ODc1MDUsIjEwMjkwIjoxNjc4NzUwNiwiMTAyOTEiOjE2Nzg3NTA3LCIxMDI5MiI6MTY3ODc1MDgsIjEwMjkzIjoxNjc4NzUwOSwiMTAyOTQiOjE2Nzg3NTEwLCIxMDI5NSI6MTY3ODc1MTEsIjEwMjk2IjoxNjc4NzUxMiwiMTAyOTciOjE2Nzg3NTEzLCIxMDI5OCI6MTY3ODc1MTQsIjEwMjk5IjoxNjc4NzUxNSwiMTAzMDAiOjE2Nzg3NTE2LCIxMDMwMSI6MTY3ODc1MTcsIjEwMzAyIjoxNjc4NzUxOCwiMTAzMDMiOjE2Nzg3NTE5LCIxMDMwNCI6MTY3ODc1MjAsIjEwMzA1IjoxNjc4NzUyMSwiMTAzMDYiOjE2Nzg3NTIyLCIxMDMwNyI6MTY3ODc1MjMsIjEwMzA4IjoxNjc4NzUyNCwiMTAzMDkiOjE2Nzg3NTI1LCIxMDMxMCI6MTY3ODc1MjYsIjEwMzExIjoxNjc4NzUyNywiMTAzMTIiOjE2Nzg3NTI4LCIxMDMxMyI6MTY3ODc1MjksIjEwMzE0IjoxNjc4NzUzMCwiMTAzMTUiOjE2Nzg3NTMxLCIxMDMxNiI6MTY3ODc1MzIsIjEwMzE3IjoxNjc4NzUzMywiMTAzMTgiOjE2Nzg3NTM0LCIxMDMxOSI6MTY3ODc1MzUsIjEwMzIwIjoxNjc4NzUzNiwiMTAzMjEiOjE2Nzg3NTM3LCIxMDMyMiI6MTY3ODc1MzgsIjEwMzIzIjoxNjc4NzUzOSwiMTAzMjQiOjE2Nzg3NTQwLCIxMDMyNSI6MTY3ODc1NDEsIjEwMzI2IjoxNjc4NzU0MiwiMTAzMjciOjE2Nzg3NTQzLCIxMDMyOCI6MTY3ODc1NDQsIjEwMzI5IjoxNjc4NzU0NSwiMTAzMzAiOjE2Nzg3NTQ2LCIxMDMzMSI6MTY3ODc1NDcsIjEwMzMyIjoxNjc4NzU0OCwiMTAzMzMiOjE2Nzg3NTQ5LCIxMDMzNCI6MTY3ODc1NTAsIjEwMzM1IjoxNjc4NzU1MSwiMTAzMzYiOjE2Nzg3NTUyLCIxMDMzNyI6MTY3ODc1NTMsIjEwMzM4IjoxNjc4NzU1NCwiMTAzMzkiOjE2Nzg3NTU1LCIxMDM0MCI6MTY3ODc1NTYsIjEwMzQxIjoxNjc4NzU1NywiMTAzNDIiOjE2Nzg3NTU4LCIxMDM0MyI6MTY3ODc1NTksIjEwMzQ0IjoxNjc4NzU2MCwiMTAzNDUiOjE2Nzg3NTYxLCIxMDM0NiI6MTY3ODc1NjIsIjEwMzQ3IjoxNjc4NzU2MywiMTAzNDgiOjE2Nzg3NTY0LCIxMDM0OSI6MTY3ODc1NjUsIjEwMzUwIjoxNjc4NzU2NiwiMTAzNTEiOjE2Nzg3NTY3LCIxMDM1MiI6MTY3ODc1NjgsIjEwMzUzIjoxNjc4NzU2OSwiMTAzNTQiOjE2Nzg3NTcwLCIxMDM1NSI6MTY3ODc1NzEsIjEwMzU2IjoxNjc4NzU3MiwiMTAzNTciOjE2Nzg3NTczLCIxMDM1OCI6MTY3ODc1NzQsIjEwMzU5IjoxNjc4NzU3NSwiMTAzNjAiOjE2Nzg3NTc2LCIxMDM2MSI6MTY3ODc1NzcsIjEwMzYyIjoxNjc4NzU3OCwiMTAzNjMiOjE2Nzg3NTc5LCIxMDM2NCI6MTY3ODc1ODAsIjEwMzY1IjoxNjc4NzU4MSwiMTAzNjYiOjE2Nzg3NTgyLCIxMDM2NyI6MTY3ODc1ODMsIjEwMzY4IjoxNjc4NzU4NCwiMTAzNjkiOjE2Nzg3NTg1LCIxMDM3MCI6MTY3ODc1ODYsIjEwMzcxIjoxNjc4NzU4NywiMTAzNzIiOjE2Nzg3NTg4LCIxMDM3MyI6MTY3ODc1ODksIjEwMzc0IjoxNjc4NzU5MCwiMTAzNzUiOjE2Nzg3NTkxLCIxMDM3NiI6MTY3ODc1OTIsIjEwMzc3IjoxNjc4NzU5MywiMTAzNzgiOjE2Nzg3NTk0LCIxMDM3OSI6MTY3ODc1OTUsIjEwMzgwIjoxNjc4NzU5NiwiMTAzODEiOjE2Nzg3NTk3LCIxMDM4MiI6MTY3ODc1OTgsIjEwMzgzIjoxNjc4NzU5OSwiMTAzODQiOjE2Nzg3NjAwLCIxMDM4NSI6MTY3ODc2MDEsIjEwMzg2IjoxNjc4NzYwMiwiMTAzODciOjE2Nzg3NjAzLCIxMDM4OCI6MTY3ODc2MDQsIjEwMzg5IjoxNjc4NzYwNSwiMTAzOTAiOjE2Nzg3NjA2LCIxMDM5MSI6MTY3ODc2MDcsIjEwMzkyIjoxNjc4NzYwOCwiMTAzOTMiOjE2Nzg3NjA5LCIxMDM5NCI6MTY3ODc2MTAsIjEwMzk1IjoxNjc4NzYxMSwiMTAzOTYiOjE2Nzg3NjEyLCIxMDM5NyI6MTY3ODc2MTMsIjEwMzk4IjoxNjc4NzYxNCwiMTAzOTkiOjE2Nzg3NjE1LCIxMDQwMCI6MTY3ODc2MTYsIjEwNDAxIjoxNjc4NzYxNywiMTA0MDIiOjE2Nzg3NjE4LCIxMDQwMyI6MTY3ODc2MTksIjEwNDA0IjoxNjc4NzYyMCwiMTA0MDUiOjE2Nzg3NjIxLCIxMDQwNiI6MTY3ODc2MjIsIjEwNDA3IjoxNjc4NzYyMywiMTA0MDgiOjE2Nzg3NjI0LCIxMDQwOSI6MTY3ODc2MjUsIjEwNDEwIjoxNjc4NzYyNiwiMTA0MTEiOjE2Nzg3NjI3LCIxMDQxMiI6MTY3ODc2MjgsIjEwNDEzIjoxNjc4NzYyOSwiMTA0MTQiOjE2Nzg3NjMwLCIxMDQxNSI6MTY3ODc2MzEsIjEwNDE2IjoxNjc4NzYzMiwiMTA0MTciOjE2Nzg3NjMzLCIxMDQxOCI6MTY3ODc2MzQsIjEwNDE5IjoxNjc4NzYzNSwiMTA0MjAiOjE2Nzg3NjM2LCIxMDQyMSI6MTY3ODc2MzcsIjEwNDIyIjoxNjc4NzYzOCwiMTA0MjMiOjE2Nzg3NjM5LCIxMDQyNCI6MTY3ODc2NDAsIjEwNDI1IjoxNjc4NzY0MSwiMTA0MjYiOjE2Nzg3NjQyLCIxMDQyNyI6MTY3ODc2NDMsIjEwNDI4IjoxNjc4NzY0NCwiMTA0MjkiOjE2Nzg3NjQ1LCIxMDQzMCI6MTY3ODc2NDYsIjEwNDMxIjoxNjc4NzY0NywiMTA0MzIiOjE2Nzg3NjQ4LCIxMDQzMyI6MTY3ODc2NDksIjEwNDM0IjoxNjc4NzY1MCwiMTA0MzUiOjE2Nzg3NjUxLCIxMDQzNiI6MTY3ODc2NTIsIjEwNDM3IjoxNjc4NzY1MywiMTA0MzgiOjE2Nzg3NjU0LCIxMDQzOSI6MTY3ODc2NTUsIjEwNDQwIjoxNjc4NzY1NiwiMTA0NDEiOjE2Nzg3NjU3LCIxMDQ0MiI6MTY3ODc2NTgsIjEwNDQzIjoxNjc4NzY1OSwiMTA0NDQiOjE2Nzg3NjYwLCIxMDQ0NSI6MTY3ODc2NjEsIjEwNDQ2IjoxNjc4NzY2MiwiMTA0NDciOjE2Nzg3NjYzLCIxMDQ0OCI6MTY3ODc2NjQsIjEwNDQ5IjoxNjc4NzY2NSwiMTA0NTAiOjE2Nzg3NjY2LCIxMDQ1MSI6MTY3ODc2NjcsIjEwNDUyIjoxNjc4NzY2OCwiMTA0NTMiOjE2Nzg3NjY5LCIxMDQ1NCI6MTY3ODc2NzAsIjEwNDU1IjoxNjc4NzY3MSwiMTA0NTYiOjE2Nzg3NjcyLCIxMDQ1NyI6MTY3ODc2NzMsIjEwNDU4IjoxNjc4NzY3NCwiMTA0NTkiOjE2Nzg3Njc1LCIxMDQ2MCI6MTY3ODc2NzYsIjEwNDYxIjoxNjc4NzY3NywiMTA0NjIiOjE2Nzg3Njc4LCIxMDQ2MyI6MTY3ODc2NzksIjEwNDY0IjoxNjc4NzY4MCwiMTA0NjUiOjE2Nzg3NjgxLCIxMDQ2NiI6MTY3ODc2ODIsIjEwNDY3IjoxNjc4NzY4MywiMTA0NjgiOjE2Nzg3Njg0LCIxMDQ2OSI6MTY3ODc2ODUsIjEwNDcwIjoxNjc4NzY4NiwiMTA0NzEiOjE2Nzg3Njg3LCIxMDQ3MiI6MTY3ODc2ODgsIjEwNDczIjoxNjc4NzY4OSwiMTA0NzQiOjE2Nzg3NjkwLCIxMDQ3NSI6MTY3ODc2OTEsIjEwNDc2IjoxNjc4NzY5MiwiMTA0NzciOjE2Nzg3NjkzLCIxMDQ3OCI6MTY3ODc2OTQsIjEwNDc5IjoxNjc4NzY5NSwiMTA0ODAiOjE2Nzg3Njk2LCIxMDQ4MSI6MTY3ODc2OTcsIjEwNDgyIjoxNjc4NzY5OCwiMTA0ODMiOjE2Nzg3Njk5LCIxMDQ4NCI6MTY3ODc3MDAsIjEwNDg1IjoxNjc4NzcwMSwiMTA0ODYiOjE2Nzg3NzAyLCIxMDQ4NyI6MTY3ODc3MDMsIjEwNDg4IjoxNjc4NzcwNCwiMTA0ODkiOjE2Nzg3NzA1LCIxMDQ5MCI6MTY3ODc3MDYsIjEwNDkxIjoxNjc4NzcwNywiMTA0OTIiOjE2Nzg3NzA4LCIxMDQ5MyI6MTY3ODc3MDksIjEwNDk0IjoxNjc4NzcxMCwiMTA0OTUiOjE2Nzg3NzExLCIxMjI4OSI6MTE4OCwiMTIyOTAiOjExODUsIjEyMzAwIjoxMTg2LCIxMjMwMSI6MTE4NywiMTI0NDMiOjEyNDYsIjEyNDQ0IjoxMjQ3LCIxMjQ0OSI6MTE5MSwiMTI0NTAiOjEyMDEsIjEyNDUxIjoxMTkyLCIxMjQ1MiI6MTIwMiwiMTI0NTMiOjExOTMsIjEyNDU0IjoxMjAzLCIxMjQ1NSI6MTE5NCwiMTI0NTYiOjEyMDQsIjEyNDU3IjoxMTk1LCIxMjQ1OCI6MTIwNSwiMTI0NTkiOjEyMDYsIjEyNDYxIjoxMjA3LCIxMjQ2MyI6MTIwOCwiMTI0NjUiOjEyMDksIjEyNDY3IjoxMjEwLCIxMjQ2OSI6MTIxMSwiMTI0NzEiOjEyMTIsIjEyNDczIjoxMjEzLCIxMjQ3NSI6MTIxNCwiMTI0NzciOjEyMTUsIjEyNDc5IjoxMjE2LCIxMjQ4MSI6MTIxNywiMTI0ODMiOjExOTksIjEyNDg0IjoxMjE4LCIxMjQ4NiI6MTIxOSwiMTI0ODgiOjEyMjAsIjEyNDkwIjoxMjIxLCIxMjQ5MSI6MTIyMiwiMTI0OTIiOjEyMjMsIjEyNDkzIjoxMjI0LCIxMjQ5NCI6MTIyNSwiMTI0OTUiOjEyMjYsIjEyNDk4IjoxMjI3LCIxMjUwMSI6MTIyOCwiMTI1MDQiOjEyMjksIjEyNTA3IjoxMjMwLCIxMjUxMCI6MTIzMSwiMTI1MTEiOjEyMzIsIjEyNTEyIjoxMjMzLCIxMjUxMyI6MTIzNCwiMTI1MTQiOjEyMzUsIjEyNTE1IjoxMTk2LCIxMjUxNiI6MTIzNiwiMTI1MTciOjExOTcsIjEyNTE4IjoxMjM3LCIxMjUxOSI6MTE5OCwiMTI1MjAiOjEyMzgsIjEyNTIxIjoxMjM5LCIxMjUyMiI6MTI0MCwiMTI1MjMiOjEyNDEsIjEyNTI0IjoxMjQyLCIxMjUyNSI6MTI0MywiMTI1MjciOjEyNDQsIjEyNTMwIjoxMTkwLCIxMjUzMSI6MTI0NSwiMTI1MzkiOjExODksIjEyNTQwIjoxMjAwfTsKKworICAgIGZ1bmN0aW9uIGxvb2t1cChrKSB7IHJldHVybiBrID8ge2tleXN5bTogaywga2V5bmFtZToga2V5bmFtZXMgPyBrZXluYW1lc1trXSA6IGt9IDogdW5kZWZpbmVkOyB9CisgICAgcmV0dXJuIHsKKyAgICAgICAgZnJvbVVuaWNvZGUgOiBmdW5jdGlvbih1KSB7IHJldHVybiBsb29rdXAoY29kZXBvaW50c1t1XSk7IH0sCisgICAgICAgIGxvb2t1cCA6IGxvb2t1cAorICAgIH07Cit9KSgpOwpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3BsYXliYWNrLmpzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3BsYXliYWNrLmpzCmluZGV4IDIyYTAwYTMuLjc3NTY1MjkgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9wbGF5YmFjay5qcworKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvcGxheWJhY2suanMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnQKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICogTGljZW5zZWQgdW5kZXIgTEdQTC0zIChzZWUgTElDRU5TRS5MR1BMLTMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKICAqLwogCiAidXNlIHN0cmljdCI7CkBAIC03OSwxMCArNzksMjIgQEAKICAgICB9CiB9OwogCit2YXIgYnl0ZXNfcHJvY2Vzc2VkID0gMDsKKwogZG9fcGFja2V0ID0gZnVuY3Rpb24gKCkgewogICAgIC8vVXRpbC5EZWJ1ZygiUHJvY2Vzc2luZyBmcmFtZTogIiArIGZyYW1lX2lkeCk7Ci0gICAgdmFyIGZyYW1lID0gVk5DX2ZyYW1lX2RhdGFbZnJhbWVfaWR4XTsKLSAgICByZmIucmVjdl9tZXNzYWdlKHsnZGF0YScgOiBmcmFtZS5zbGljZShmcmFtZS5pbmRleE9mKCd7JywgMSkgKyAxKX0pOworICAgIHZhciBmcmFtZSA9IFZOQ19mcmFtZV9kYXRhW2ZyYW1lX2lkeF0sCisgICAgICAgIHN0YXJ0ID0gZnJhbWUuaW5kZXhPZigneycsIDEpICsgMTsKKyAgICBieXRlc19wcm9jZXNzZWQgKz0gZnJhbWUubGVuZ3RoIC0gc3RhcnQ7CisgICAgaWYgKFZOQ19mcmFtZV9lbmNvZGluZyA9PT0gJ2JpbmFyeScpIHsKKyAgICAgICAgdmFyIHU4ID0gbmV3IFVpbnQ4QXJyYXkoZnJhbWUubGVuZ3RoIC0gc3RhcnQpOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lLmxlbmd0aCAtIHN0YXJ0OyBpKyspIHsKKyAgICAgICAgICAgIHU4W2ldID0gZnJhbWUuY2hhckNvZGVBdChzdGFydCArIGkpOworICAgICAgICB9CisgICAgICAgIHJmYi5yZWN2X21lc3NhZ2UoeydkYXRhJyA6IHU4fSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmZiLnJlY3ZfbWVzc2FnZSh7J2RhdGEnIDogZnJhbWUuc2xpY2Uoc3RhcnQpfSk7CisgICAgfQogICAgIGZyYW1lX2lkeCArPSAxOwogCiAgICAgcXVldWVfbmV4dF9wYWNrZXQoKTsKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9yZmIuanMgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvcmZiLmpzCmluZGV4IDc1Yjk3OTcuLjBhZmU2NTYgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS9yZmIuanMKKysrIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3JmYi5qcwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudAotICogQ29weXJpZ2h0IChDKSAyMDExIEpvZWwgTWFydGluCi0gKiBMaWNlbnNlZCB1bmRlciBMR1BMLTMgKHNlZSBMSUNFTlNFLnR4dCkKKyAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpbgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXVlbCBNYW5uZWhlZCBmb3IgQ2VuZGlvIEFCCisgKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpCiAgKgogICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy4KICAqCkBAIC05LDE4MzkgKzEwLDE4NzQgQEAKICAqIChjKSAyMDEyIE1pY2hhZWwgVGluZ2xvZiwgSm9lIEJhbGF6LCBMZXMgUGllY2ggKE1lcmN1cmkuY2EpCiAgKi8KIAotLypqc2xpbnQgd2hpdGU6IGZhbHNlLCBicm93c2VyOiB0cnVlLCBiaXR3aXNlOiBmYWxzZSwgcGx1c3BsdXM6IGZhbHNlICovCisvKmpzbGludCB3aGl0ZTogZmFsc2UsIGJyb3dzZXI6IHRydWUgKi8KIC8qZ2xvYmFsIHdpbmRvdywgVXRpbCwgRGlzcGxheSwgS2V5Ym9hcmQsIE1vdXNlLCBXZWJzb2NrLCBXZWJzb2NrX25hdGl2ZSwgQmFzZTY0LCBERVMgKi8KIAordmFyIFJGQjsKIAotZnVuY3Rpb24gUkZCKGRlZmF1bHRzKSB7Ci0idXNlIHN0cmljdCI7Ci0KLXZhciB0aGF0ICAgICAgICAgICA9IHt9LCAgLy8gUHVibGljIEFQSSBtZXRob2RzCi0gICAgY29uZiAgICAgICAgICAgPSB7fSwgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlcwotCi0gICAgLy8gUHJlLWRlY2xhcmUgcHJpdmF0ZSBmdW5jdGlvbnMgdXNlZCBiZWZvcmUgZGVmaW5pdGlvbnMgKGpzbGludCkKLSAgICBpbml0X3ZhcnMsIHVwZGF0ZVN0YXRlLCBmYWlsLCBoYW5kbGVfbWVzc2FnZSwKLSAgICBpbml0X21zZywgbm9ybWFsX21zZywgZnJhbWVidWZmZXJVcGRhdGUsIHByaW50X3N0YXRzLAotCi0gICAgcGl4ZWxGb3JtYXQsIGNsaWVudEVuY29kaW5ncywgZmJVcGRhdGVSZXF1ZXN0LCBmYlVwZGF0ZVJlcXVlc3RzLAotICAgIGtleUV2ZW50LCBwb2ludGVyRXZlbnQsIGNsaWVudEN1dFRleHQsCi0KLSAgICBnZXRUaWdodENMZW5ndGgsIGV4dHJhY3RfZGF0YV91cmksIHNjYW5fdGlnaHRfaW1nUSwKLSAgICBrZXlQcmVzcywgbW91c2VCdXR0b24sIG1vdXNlTW92ZSwKLQotICAgIGNoZWNrRXZlbnRzLCAgLy8gT3ZlcnJpZGFibGUgZm9yIHRlc3RpbmcKLQotCi0gICAgLy8KLSAgICAvLyBQcml2YXRlIFJGQiBuYW1lc3BhY2UgdmFyaWFibGVzCi0gICAgLy8KLSAgICByZmJfaG9zdCAgICAgICA9ICcnLAotICAgIHJmYl9wb3J0ICAgICAgID0gNTkwMCwKLSAgICByZmJfcGFzc3dvcmQgICA9ICcnLAotICAgIHJmYl9wYXRoICAgICAgID0gJycsCi0KLSAgICByZmJfc3RhdGUgICAgICA9ICdkaXNjb25uZWN0ZWQnLAotICAgIHJmYl92ZXJzaW9uICAgID0gMCwKLSAgICByZmJfbWF4X3ZlcnNpb249IDMuOCwKLSAgICByZmJfYXV0aF9zY2hlbWU9ICcnLAotCi0KLSAgICAvLyBJbiBwcmVmZXJlbmNlIG9yZGVyCi0gICAgZW5jb2RpbmdzICAgICAgPSBbCi0gICAgICAgIFsnQ09QWVJFQ1QnLCAgICAgICAgIDB4MDEgXSwKLSAgICAgICAgWydUSUdIVCcsICAgICAgICAgICAgMHgwNyBdLAotICAgICAgICBbJ1RJR0hUX1BORycsICAgICAgICAtMjYwIF0sCi0gICAgICAgIFsnSEVYVElMRScsICAgICAgICAgIDB4MDUgXSwKLSAgICAgICAgWydSUkUnLCAgICAgICAgICAgICAgMHgwMiBdLAotICAgICAgICBbJ1JBVycsICAgICAgICAgICAgICAweDAwIF0sCi0gICAgICAgIFsnRGVza3RvcFNpemUnLCAgICAgIC0yMjMgXSwKLSAgICAgICAgWydDdXJzb3InLCAgICAgICAgICAgLTIzOSBdLAotCi0gICAgICAgIC8vIFBzdWVkby1lbmNvZGluZyBzZXR0aW5ncwotICAgICAgICAvL1snSlBFR19xdWFsaXR5X2xvJywgICAtMzIgXSwKLSAgICAgICAgWydKUEVHX3F1YWxpdHlfbWVkJywgICAgLTI2IF0sCi0gICAgICAgIC8vWydKUEVHX3F1YWxpdHlfaGknLCAgIC0yMyBdLAotICAgICAgICAvL1snY29tcHJlc3NfbG8nLCAgICAgIC0yNTUgXSwKLSAgICAgICAgWydjb21wcmVzc19oaScsICAgICAgICAtMjQ3IF0sCi0gICAgICAgIFsnbGFzdF9yZWN0JywgICAgICAgICAgLTIyNCBdCi0gICAgICAgIF0sCi0KLSAgICBlbmNIYW5kbGVycyAgICA9IHt9LAotICAgIGVuY05hbWVzICAgICAgID0ge30sIAotICAgIGVuY1N0YXRzICAgICAgID0ge30sICAgICAvLyBbcmVjdENudCwgcmVjdENudFRvdF0KLQotICAgIHdzICAgICAgICAgICAgID0gbnVsbCwgICAvLyBXZWJzb2NrIG9iamVjdAotICAgIGRpc3BsYXkgICAgICAgID0gbnVsbCwgICAvLyBEaXNwbGF5IG9iamVjdAotICAgIGtleWJvYXJkICAgICAgID0gbnVsbCwgICAvLyBLZXlib2FyZCBpbnB1dCBoYW5kbGVyIG9iamVjdAotICAgIG1vdXNlICAgICAgICAgID0gbnVsbCwgICAvLyBNb3VzZSBpbnB1dCBoYW5kbGVyIG9iamVjdAotICAgIHNlbmRUaW1lciAgICAgID0gbnVsbCwgICAvLyBTZW5kIFF1ZXVlIGNoZWNrIHRpbWVyCi0gICAgY29ublRpbWVyICAgICAgPSBudWxsLCAgIC8vIGNvbm5lY3Rpb24gdGltZXIKLSAgICBkaXNjb25uVGltZXIgICA9IG51bGwsICAgLy8gZGlzY29ubmVjdGlvbiB0aW1lcgotICAgIG1zZ1RpbWVyICAgICAgID0gbnVsbCwgICAvLyBxdWV1ZWQgaGFuZGxlX21lc3NhZ2UgdGltZXIKLQotICAgIC8vIEZyYW1lIGJ1ZmZlciB1cGRhdGUgc3RhdGUKLSAgICBGQlUgICAgICAgICAgICA9IHsKLSAgICAgICAgcmVjdHMgICAgICAgICAgOiAwLAotICAgICAgICBzdWJyZWN0cyAgICAgICA6IDAsICAvLyBSUkUKLSAgICAgICAgbGluZXMgICAgICAgICAgOiAwLCAgLy8gUkFXCi0gICAgICAgIHRpbGVzICAgICAgICAgIDogMCwgIC8vIEhFWFRJTEUKLSAgICAgICAgYnl0ZXMgICAgICAgICAgOiAwLAotICAgICAgICB4ICAgICAgICAgICAgICA6IDAsCi0gICAgICAgIHkgICAgICAgICAgICAgIDogMCwKLSAgICAgICAgd2lkdGggICAgICAgICAgOiAwLCAKLSAgICAgICAgaGVpZ2h0ICAgICAgICAgOiAwLAotICAgICAgICBlbmNvZGluZyAgICAgICA6IDAsCi0gICAgICAgIHN1YmVuY29kaW5nICAgIDogLTEsCi0gICAgICAgIGJhY2tncm91bmQgICAgIDogbnVsbCwKLSAgICAgICAgaW1nUSAgICAgICAgICAgOiBbXSwgIC8vIFRJR0hUX1BORyBpbWFnZSBxdWV1ZQotICAgICAgICB6bGlicyAgICAgICAgICA6IFtdICAgLy8gVElHSFQgemxpYiBzdHJlYW1zCi0gICAgfSwKLQotICAgIGZiX0JwcCAgICAgICAgID0gNCwKLSAgICBmYl9kZXB0aCAgICAgICA9IDMsCi0gICAgZmJfd2lkdGggICAgICAgPSAwLAotICAgIGZiX2hlaWdodCAgICAgID0gMCwKLSAgICBmYl9uYW1lICAgICAgICA9ICIiLAotCi0gICAgc2Nhbl9pbWdRX3JhdGUgPSA0MCwgLy8gMjUgdGltZXMgcGVyIHNlY29uZCBvciBzbwotICAgIGxhc3RfcmVxX3RpbWUgID0gMCwKLSAgICBycmVfY2h1bmtfc3ogICA9IDEwMCwKLQotICAgIHRpbWluZyAgICAgICAgID0gewotICAgICAgICBsYXN0X2ZidSAgICAgICA6IDAsCi0gICAgICAgIGZidV90b3RhbCAgICAgIDogMCwKLSAgICAgICAgZmJ1X3RvdGFsX2NudCAgOiAwLAotICAgICAgICBmdWxsX2ZidV90b3RhbCA6IDAsCi0gICAgICAgIGZ1bGxfZmJ1X2NudCAgIDogMCwKLQotICAgICAgICBmYnVfcnRfc3RhcnQgICA6IDAsCi0gICAgICAgIGZidV9ydF90b3RhbCAgIDogMCwKLSAgICAgICAgZmJ1X3J0X2NudCAgICAgOiAwLAotICAgICAgICBwaXhlbHMgICAgICAgICA6IDAKLSAgICB9LAotCi0gICAgdGVzdF9tb2RlICAgICAgICA9IGZhbHNlLAotCi0gICAgZGVmX2Nvbl90aW1lb3V0ICA9IFdlYnNvY2tfbmF0aXZlID8gMiA6IDUsCi0KLSAgICAvKiBNb3VzZSBzdGF0ZSAqLwotICAgIG1vdXNlX2J1dHRvbk1hc2sgPSAwLAotICAgIG1vdXNlX2FyciAgICAgICAgPSBbXSwKLSAgICB2aWV3cG9ydERyYWdnaW5nID0gZmFsc2UsCi0gICAgdmlld3BvcnREcmFnUG9zICA9IHt9OwotCi0vLyBDb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMKLVV0aWwuY29uZl9kZWZhdWx0cyhjb25mLCB0aGF0LCBkZWZhdWx0cywgWwotICAgIFsndGFyZ2V0JywgICAgICAgICAgICAgJ3dvJywgJ2RvbScsIG51bGwsICdWTkMgZGlzcGxheSByZW5kZXJpbmcgQ2FudmFzIG9iamVjdCddLAotICAgIFsnZm9jdXNDb250YWluZXInLCAgICAgJ3dvJywgJ2RvbScsIGRvY3VtZW50LCAnRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBrZXlib2FyZCBpbnB1dCddLAotCi0gICAgWydlbmNyeXB0JywgICAgICAgICAgICAncncnLCAnYm9vbCcsIGZhbHNlLCAnVXNlIFRMUy9TU0wvd3NzIGVuY3J5cHRpb24nXSwKLSAgICBbJ3RydWVfY29sb3InLCAgICAgICAgICdydycsICdib29sJywgdHJ1ZSwgICdSZXF1ZXN0IHRydWUgY29sb3IgcGl4ZWwgZGF0YSddLAotICAgIFsnbG9jYWxfY3Vyc29yJywgICAgICAgJ3J3JywgJ2Jvb2wnLCBmYWxzZSwgJ1JlcXVlc3QgbG9jYWxseSByZW5kZXJlZCBjdXJzb3InXSwKLSAgICBbJ3NoYXJlZCcsICAgICAgICAgICAgICdydycsICdib29sJywgdHJ1ZSwgICdSZXF1ZXN0IHNoYXJlZCBtb2RlJ10sCi0gICAgWyd2aWV3X29ubHknLCAgICAgICAgICAncncnLCAnYm9vbCcsIGZhbHNlLCAnRGlzYWJsZSBjbGllbnQgbW91c2Uva2V5Ym9hcmQnXSwKLQotICAgIFsnY29ubmVjdFRpbWVvdXQnLCAgICAgJ3J3JywgJ2ludCcsIGRlZl9jb25fdGltZW91dCwgJ1RpbWUgKHMpIHRvIHdhaXQgZm9yIGNvbm5lY3Rpb24nXSwKLSAgICBbJ2Rpc2Nvbm5lY3RUaW1lb3V0JywgICdydycsICdpbnQnLCAzLCAgICAnVGltZSAocykgdG8gd2FpdCBmb3IgZGlzY29ubmVjdGlvbiddLAotCi0gICAgWyd2aWV3cG9ydERyYWcnLCAgICAgICAncncnLCAnYm9vbCcsIGZhbHNlLCAnTW92ZSB0aGUgdmlld3BvcnQgb24gbW91c2UgZHJhZ3MnXSwKLQotICAgIFsnY2hlY2tfcmF0ZScsICAgICAgICAgJ3J3JywgJ2ludCcsIDIxNywgICdUaW1pbmcgKG1zKSBvZiBzZW5kL3JlY2VpdmUgY2hlY2snXSwKLSAgICBbJ2ZidV9yZXFfcmF0ZScsICAgICAgICdydycsICdpbnQnLCAxNDEzLCAnVGltaW5nIChtcykgb2YgZnJhbWVCdWZmZXJVcGRhdGUgcmVxdWVzdHMnXSwKLQotICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9ucwotICAgIFsnb25VcGRhdGVTdGF0ZScsICAgICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29uVXBkYXRlU3RhdGUocmZiLCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk6IFJGQiBzdGF0ZSB1cGRhdGUvY2hhbmdlICddLAotICAgIFsnb25QYXNzd29yZFJlcXVpcmVkJywgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29uUGFzc3dvcmRSZXF1aXJlZChyZmIpOiBWTkMgcGFzc3dvcmQgaXMgcmVxdWlyZWQgJ10sCi0gICAgWydvbkNsaXBib2FyZCcsICAgICAgICAncncnLCAnZnVuYycsIGZ1bmN0aW9uKCkgeyB9LAotICAgICAgICAnb25DbGlwYm9hcmQocmZiLCB0ZXh0KTogUkZCIGNsaXBib2FyZCBjb250ZW50cyByZWNlaXZlZCddLAotICAgIFsnb25CZWxsJywgICAgICAgICAgICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29uQmVsbChyZmIpOiBSRkIgQmVsbCBtZXNzYWdlIHJlY2VpdmVkICddLAotICAgIFsnb25GQlVSZWNlaXZlJywgICAgICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29uRkJVUmVjZWl2ZShyZmIsIGZidSk6IFJGQiBGQlUgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgcHJvY2Vzc2VkICddLAotICAgIFsnb25GQlVDb21wbGV0ZScsICAgICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29uRkJVQ29tcGxldGUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgJ10sCi0KLSAgICAvLyBUaGVzZSBjYWxsYmFjayBuYW1lcyBhcmUgZGVwcmVjYXRlZAotICAgIFsndXBkYXRlU3RhdGUnLCAgICAgICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29ic29sZXRlLCB1c2Ugb25VcGRhdGVTdGF0ZSddLAotICAgIFsnY2xpcGJvYXJkUmVjZWl2ZScsICAgJ3J3JywgJ2Z1bmMnLCBmdW5jdGlvbigpIHsgfSwKLSAgICAgICAgJ29ic29sZXRlLCB1c2Ugb25DbGlwYm9hcmQnXQotICAgIF0pOwotCi0KLS8vIE92ZXJyaWRlL2FkZCBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZ2V0dGVycy9zZXR0ZXJzCi10aGF0LnNldF9sb2NhbF9jdXJzb3IgPSBmdW5jdGlvbihjdXJzb3IpIHsKLSAgICBpZiAoKCFjdXJzb3IpIHx8IChjdXJzb3IgaW4geycwJzoxLCAnbm8nOjEsICdmYWxzZSc6MX0pKSB7Ci0gICAgICAgIGNvbmYubG9jYWxfY3Vyc29yID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRpc3BsYXkuZ2V0X2N1cnNvcl91cmkoKSkgewotICAgICAgICAgICAgY29uZi5sb2NhbF9jdXJzb3IgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVXRpbC5XYXJuKCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY3Vyc29yIik7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0vLyBUaGVzZSBhcmUgZmFrZSBjb25maWd1cmF0aW9uIGdldHRlcnMKLXRoYXQuZ2V0X2Rpc3BsYXkgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGRpc3BsYXk7IH07Ci0KLXRoYXQuZ2V0X2tleWJvYXJkID0gZnVuY3Rpb24oKSB7IHJldHVybiBrZXlib2FyZDsgfTsKLQotdGhhdC5nZXRfbW91c2UgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG1vdXNlOyB9OwotCi0KLQotLy8KLS8vIFNldHVwIHJvdXRpbmVzCi0vLwotCi0vLyBDcmVhdGUgdGhlIHB1YmxpYyBBUEkgaW50ZXJmYWNlIGFuZCBpbml0aWFsaXplIHZhbHVlcyB0aGF0IHN0YXkKLS8vIGNvbnN0YW50IGFjcm9zcyBjb25uZWN0L2Rpc2Nvbm5lY3QKLWZ1bmN0aW9uIGNvbnN0cnVjdG9yKCkgewotICAgIHZhciBpLCBybW9kZTsKLSAgICBVdGlsLkRlYnVnKCI+PiBSRkIuY29uc3RydWN0b3IiKTsKLQotICAgIC8vIENyZWF0ZSBsb29rdXAgdGFibGVzIGJhc2VkIGVuY29kaW5nIG51bWJlcgotICAgIGZvciAoaT0wOyBpIDwgZW5jb2RpbmdzLmxlbmd0aDsgaSs9MSkgewotICAgICAgICBlbmNIYW5kbGVyc1tlbmNvZGluZ3NbaV1bMV1dID0gZW5jSGFuZGxlcnNbZW5jb2RpbmdzW2ldWzBdXTsKLSAgICAgICAgZW5jTmFtZXNbZW5jb2RpbmdzW2ldWzFdXSA9IGVuY29kaW5nc1tpXVswXTsKLSAgICAgICAgZW5jU3RhdHNbZW5jb2RpbmdzW2ldWzFdXSA9IFswLCAwXTsKLSAgICB9Ci0gICAgLy8gSW5pdGlhbGl6ZSBkaXNwbGF5LCBtb3VzZSwga2V5Ym9hcmQsIGFuZCB3ZWJzb2NrCi0gICAgdHJ5IHsKLSAgICAgICAgZGlzcGxheSAgID0gbmV3IERpc3BsYXkoeyd0YXJnZXQnOiBjb25mLnRhcmdldH0pOwotICAgIH0gY2F0Y2ggKGV4YykgewotICAgICAgICBVdGlsLkVycm9yKCJEaXNwbGF5IGV4Y2VwdGlvbjogIiArIGV4Yyk7Ci0gICAgICAgIHVwZGF0ZVN0YXRlKCdmYXRhbCcsICJObyB3b3JraW5nIERpc3BsYXkiKTsKLSAgICB9Ci0gICAga2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmQoeyd0YXJnZXQnOiBjb25mLmZvY3VzQ29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25LZXlQcmVzcyc6IGtleVByZXNzfSk7Ci0gICAgbW91c2UgICAgPSBuZXcgTW91c2Uoeyd0YXJnZXQnOiBjb25mLnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25Nb3VzZUJ1dHRvbic6IG1vdXNlQnV0dG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbk1vdXNlTW92ZSc6IG1vdXNlTW92ZX0pOwotCi0gICAgcm1vZGUgPSBkaXNwbGF5LmdldF9yZW5kZXJfbW9kZSgpOwotCi0gICAgd3MgPSBuZXcgV2Vic29jaygpOwotICAgIHdzLm9uKCdtZXNzYWdlJywgaGFuZGxlX21lc3NhZ2UpOwotICAgIHdzLm9uKCdvcGVuJywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmIChyZmJfc3RhdGUgPT09ICJjb25uZWN0IikgewotICAgICAgICAgICAgdXBkYXRlU3RhdGUoJ1Byb3RvY29sVmVyc2lvbicsICJTdGFydGluZyBWTkMgaGFuZHNoYWtlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJHb3QgdW5leHBlY3RlZCBXZWJTb2NrZXRzIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHdzLm9uKCdjbG9zZScsIGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgaWYgKGUuY29kZSkgewotICAgICAgICAgICAgVXRpbC5JbmZvKCJDbG9zZSBjb2RlOiAiICsgZS5jb2RlICsgIiwgcmVhc29uOiAiICsgZS5yZWFzb24gKyAiLCB3YXNDbGVhbjogIiArIGUud2FzQ2xlYW4pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZmJfc3RhdGUgPT09ICdkaXNjb25uZWN0JykgewotICAgICAgICAgICAgdXBkYXRlU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcsICdWTkMgZGlzY29ubmVjdGVkJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmZiX3N0YXRlID09PSAnUHJvdG9jb2xWZXJzaW9uJykgewotICAgICAgICAgICAgZmFpbCgnRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmZiX3N0YXRlIGluIHsnZmFpbGVkJzoxLCAnZGlzY29ubmVjdGVkJzoxfSkgewotICAgICAgICAgICAgVXRpbC5FcnJvcigiUmVjZWl2ZWQgb25jbG9zZSB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICBmYWlsKCdTZXJ2ZXIgZGlzY29ubmVjdGVkJyk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICB3cy5vbignZXJyb3InLCBmdW5jdGlvbihlKSB7Ci0gICAgICAgIGZhaWwoIldlYlNvY2sgZXJyb3I6ICIgKyBlKTsKLSAgICB9KTsKLQotCi0gICAgaW5pdF92YXJzKCk7Ci0KLSAgICAvKiBDaGVjayB3ZWItc29ja2V0LWpzIGlmIG5vIGJ1aWx0aW4gV2ViU29ja2V0IHN1cHBvcnQgKi8KLSAgICBpZiAoV2Vic29ja19uYXRpdmUpIHsKLSAgICAgICAgVXRpbC5JbmZvKCJVc2luZyBuYXRpdmUgV2ViU29ja2V0cyIpOwotICAgICAgICB1cGRhdGVTdGF0ZSgnbG9hZGVkJywgJ25vVk5DIHJlYWR5OiBuYXRpdmUgV2ViU29ja2V0cywgJyArIHJtb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBVdGlsLldhcm4oIlVzaW5nIHdlYi1zb2NrZXQtanMgYnJpZGdlLiBGbGFzaCB2ZXJzaW9uOiAiICsKLSAgICAgICAgICAgICAgICAgIFV0aWwuRmxhc2gudmVyc2lvbik7Ci0gICAgICAgIGlmICgoISBVdGlsLkZsYXNoKSB8fAotICAgICAgICAgICAgKFV0aWwuRmxhc2gudmVyc2lvbiA8IDkpKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0ZSgnZmF0YWwnLCAiV2ViU29ja2V0cyBvciA8YSBocmVmPSdodHRwOi8vZ2V0LmFkb2JlLmNvbS9mbGFzaHBsYXllcic+QWRvYmUgRmxhc2g8XC9hPiBpcyByZXF1aXJlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsIDcpID09PSAiZmlsZTovLyIpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlKCdmYXRhbCcsCi0gICAgICAgICAgICAgICAgICAgICInZmlsZTovLycgVVJMIGlzIGluY29tcGF0aWJsZSB3aXRoIEFkb2JlIEZsYXNoIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0ZSgnbG9hZGVkJywgJ25vVk5DIHJlYWR5OiBXZWJTb2NrZXRzIGVtdWxhdGlvbiwgJyArIHJtb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFV0aWwuRGVidWcoIjw8IFJGQi5jb25zdHJ1Y3RvciIpOwotICAgIHJldHVybiB0aGF0OyAgLy8gUmV0dXJuIHRoZSBwdWJsaWMgQVBJIGludGVyZmFjZQotfQotCi1mdW5jdGlvbiBjb25uZWN0KCkgewotICAgIFV0aWwuRGVidWcoIj4+IFJGQi5jb25uZWN0Iik7Ci0gICAgdmFyIHVyaTsKLSAgICAKLSAgICBpZiAodHlwZW9mIFVzaW5nU29ja2V0SU8gIT09ICJ1bmRlZmluZWQiKSB7Ci0gICAgICAgIHVyaSA9ICJodHRwOi8vIiArIHJmYl9ob3N0ICsgIjoiICsgcmZiX3BvcnQgKyAiLyIgKyByZmJfcGF0aDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoY29uZi5lbmNyeXB0KSB7Ci0gICAgICAgICAgICB1cmkgPSAid3NzOi8vIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVyaSA9ICJ3czovLyI7Ci0gICAgICAgIH0KLSAgICAgICAgdXJpICs9IHJmYl9ob3N0ICsgIjoiICsgcmZiX3BvcnQgKyAiLyIgKyByZmJfcGF0aDsKLSAgICB9Ci0gICAgVXRpbC5JbmZvKCJjb25uZWN0aW5nIHRvICIgKyB1cmkpOwotICAgIHdzLm9wZW4odXJpKTsKLQotICAgIFV0aWwuRGVidWcoIjw8IFJGQi5jb25uZWN0Iik7Ci19Ci0KLS8vIEluaXRpYWxpemUgdmFyaWFibGVzIHRoYXQgYXJlIHJlc2V0IGJlZm9yZSBlYWNoIGNvbm5lY3Rpb24KLWluaXRfdmFycyA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBpOwotCi0gICAgLyogUmVzZXQgc3RhdGUgKi8KLSAgICB3cy5pbml0KCk7Ci0KLSAgICBGQlUucmVjdHMgICAgICAgID0gMDsKLSAgICBGQlUuc3VicmVjdHMgICAgID0gMDsgIC8vIFJSRSBhbmQgSEVYVElMRQotICAgIEZCVS5saW5lcyAgICAgICAgPSAwOyAgLy8gUkFXCi0gICAgRkJVLnRpbGVzICAgICAgICA9IDA7ICAvLyBIRVhUSUxFCi0gICAgRkJVLmltZ1EgICAgICAgICA9IFtdOyAvLyBUSUdIVF9QTkcgaW1hZ2UgcXVldWUKLSAgICBGQlUuemxpYnMgICAgICAgID0gW107IC8vIFRJR0hUIHpsaWIgZW5jb2RlcnMKLSAgICBtb3VzZV9idXR0b25NYXNrID0gMDsKLSAgICBtb3VzZV9hcnIgICAgICAgID0gW107Ci0KLSAgICAvLyBDbGVhciB0aGUgcGVyIGNvbm5lY3Rpb24gZW5jb2Rpbmcgc3RhdHMKLSAgICBmb3IgKGk9MDsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrPTEpIHsKLSAgICAgICAgZW5jU3RhdHNbZW5jb2RpbmdzW2ldWzFdXVswXSA9IDA7Ci0gICAgfQotICAgIAotICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIC8vRkJVLnpsaWJzW2ldID0gbmV3IEluZmxhdGVTdHJlYW0oKTsKLSAgICAgICAgRkJVLnpsaWJzW2ldID0gbmV3IFRJTkYoKTsKLSAgICAgICAgRkJVLnpsaWJzW2ldLmluaXQoKTsKLSAgICB9Ci19OwotCi0vLyBQcmludCBzdGF0aXN0aWNzCi1wcmludF9zdGF0cyA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBpLCBzOwotICAgIFV0aWwuSW5mbygiRW5jb2Rpbmcgc3RhdHMgZm9yIHRoaXMgY29ubmVjdGlvbjoiKTsKLSAgICBmb3IgKGk9MDsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrPTEpIHsKLSAgICAgICAgcyA9IGVuY1N0YXRzW2VuY29kaW5nc1tpXVsxXV07Ci0gICAgICAgIGlmICgoc1swXSArIHNbMV0pID4gMCkgewotICAgICAgICAgICAgVXRpbC5JbmZvKCIgICAgIiArIGVuY29kaW5nc1tpXVswXSArICI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgIHNbMF0gKyAiIHJlY3RzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgVXRpbC5JbmZvKCJFbmNvZGluZyBzdGF0cyBzaW5jZSBwYWdlIGxvYWQ6Iik7Ci0gICAgZm9yIChpPTA7IGkgPCBlbmNvZGluZ3MubGVuZ3RoOyBpKz0xKSB7Ci0gICAgICAgIHMgPSBlbmNTdGF0c1tlbmNvZGluZ3NbaV1bMV1dOwotICAgICAgICBpZiAoKHNbMF0gKyBzWzFdKSA+IDApIHsKLSAgICAgICAgICAgIFV0aWwuSW5mbygiICAgICIgKyBlbmNvZGluZ3NbaV1bMF0gKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICBzWzFdICsgIiByZWN0cyIpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotLy8KLS8vIFV0aWxpdHkgcm91dGluZXMKLS8vCi0KLQotLyoKLSAqIFBhZ2Ugc3RhdGVzOgotICogICBsb2FkZWQgICAgICAgLSBwYWdlIGxvYWQsIGVxdWl2YWxlbnQgdG8gZGlzY29ubmVjdGVkCi0gKiAgIGRpc2Nvbm5lY3RlZCAtIGlkbGUgc3RhdGUKLSAqICAgY29ubmVjdCAgICAgIC0gc3RhcnRpbmcgdG8gY29ubmVjdCAodG8gUHJvdG9jb2xWZXJzaW9uKQotICogICBub3JtYWwgICAgICAgLSBjb25uZWN0ZWQKLSAqICAgZGlzY29ubmVjdCAgIC0gc3RhcnRpbmcgdG8gZGlzY29ubmVjdAotICogICBmYWlsZWQgICAgICAgLSBhYm5vcm1hbCBkaXNjb25uZWN0Ci0gKiAgIGZhdGFsICAgICAgICAtIGZhaWxlZCB0byBsb2FkIHBhZ2UsIG9yIGZhdGFsIGVycm9yCi0gKgotICogUkZCIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHN0YXRlczoKLSAqICAgUHJvdG9jb2xWZXJzaW9uIAotICogICBTZWN1cml0eQotICogICBBdXRoZW50aWNhdGlvbgotICogICBwYXNzd29yZCAgICAgLSB3YWl0aW5nIGZvciBwYXNzd29yZCwgbm90IHBhcnQgb2YgUkZCCi0gKiAgIFNlY3VyaXR5UmVzdWx0Ci0gKiAgIENsaWVudEluaXRpYWxpemF0aW9uIC0gbm90IHRyaWdnZXJlZCBieSBzZXJ2ZXIgbWVzc2FnZQotICogICBTZXJ2ZXJJbml0aWFsaXphdGlvbiAodG8gbm9ybWFsKQotICovCi11cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBzdGF0dXNNc2cpIHsKLSAgICB2YXIgZnVuYywgY21zZywgb2xkc3RhdGUgPSByZmJfc3RhdGU7Ci0KLSAgICBpZiAoc3RhdGUgPT09IG9sZHN0YXRlKSB7Ci0gICAgICAgIC8qIEFscmVhZHkgaGVyZSwgaWdub3JlICovCi0gICAgICAgIFV0aWwuRGVidWcoIkFscmVhZHkgaW4gc3RhdGUgJyIgKyBzdGF0ZSArICInLCBpZ25vcmluZy4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIFRoZXNlIGFyZSBkaXNjb25uZWN0ZWQgc3RhdGVzLiBBIHByZXZpb3VzIGNvbm5lY3QgbWF5Ci0gICAgICogYXN5bmNocm9ub3VzbHkgY2F1c2UgYSBjb25uZWN0aW9uIHNvIG1ha2Ugc3VyZSB3ZSBhcmUgY2xvc2VkLgotICAgICAqLwotICAgIGlmIChzdGF0ZSBpbiB7J2Rpc2Nvbm5lY3RlZCc6MSwgJ2xvYWRlZCc6MSwgJ2Nvbm5lY3QnOjEsCi0gICAgICAgICAgICAgICAgICAnZGlzY29ubmVjdCc6MSwgJ2ZhaWxlZCc6MSwgJ2ZhdGFsJzoxfSkgewotICAgICAgICBpZiAoc2VuZFRpbWVyKSB7Ci0gICAgICAgICAgICBjbGVhckludGVydmFsKHNlbmRUaW1lcik7Ci0gICAgICAgICAgICBzZW5kVGltZXIgPSBudWxsOworKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgUkZCID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7CisgICAgICAgIGlmICghZGVmYXVsdHMpIHsKKyAgICAgICAgICAgIGRlZmF1bHRzID0ge307CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobXNnVGltZXIpIHsKLSAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobXNnVGltZXIpOwotICAgICAgICAgICAgbXNnVGltZXIgPSBudWxsOworICAgICAgICB0aGlzLl9yZmJfaG9zdCA9ICcnOworICAgICAgICB0aGlzLl9yZmJfcG9ydCA9IDU5MDA7CisgICAgICAgIHRoaXMuX3JmYl9wYXNzd29yZCA9ICcnOworICAgICAgICB0aGlzLl9yZmJfcGF0aCA9ICcnOworCisgICAgICAgIHRoaXMuX3JmYl9zdGF0ZSA9ICdkaXNjb25uZWN0ZWQnOworICAgICAgICB0aGlzLl9yZmJfdmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMuX3JmYl9tYXhfdmVyc2lvbiA9IDMuODsKKyAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gJyc7CisKKyAgICAgICAgdGhpcy5fcmZiX3RpZ2h0dm5jID0gZmFsc2U7CisgICAgICAgIHRoaXMuX3JmYl94dnBfdmVyID0gMDsKKworICAgICAgICAvLyBJbiBwcmVmZXJlbmNlIG9yZGVyCisgICAgICAgIHRoaXMuX2VuY29kaW5ncyA9IFsKKyAgICAgICAgICAgIFsnQ09QWVJFQ1QnLCAgICAgICAgIDB4MDEgXSwKKyAgICAgICAgICAgIFsnVElHSFQnLCAgICAgICAgICAgIDB4MDcgXSwKKyAgICAgICAgICAgIFsnVElHSFRfUE5HJywgICAgICAgIC0yNjAgXSwKKyAgICAgICAgICAgIFsnSEVYVElMRScsICAgICAgICAgIDB4MDUgXSwKKyAgICAgICAgICAgIFsnUlJFJywgICAgICAgICAgICAgIDB4MDIgXSwKKyAgICAgICAgICAgIFsnUkFXJywgICAgICAgICAgICAgIDB4MDAgXSwKKyAgICAgICAgICAgIFsnRGVza3RvcFNpemUnLCAgICAgIC0yMjMgXSwKKyAgICAgICAgICAgIFsnQ3Vyc29yJywgICAgICAgICAgIC0yMzkgXSwKKworICAgICAgICAgICAgLy8gUHN1ZWRvLWVuY29kaW5nIHNldHRpbmdzCisgICAgICAgICAgICAvL1snSlBFR19xdWFsaXR5X2xvJywgICAtMzIgXSwKKyAgICAgICAgICAgIFsnSlBFR19xdWFsaXR5X21lZCcsICAgIC0yNiBdLAorICAgICAgICAgICAgLy9bJ0pQRUdfcXVhbGl0eV9oaScsICAgLTIzIF0sCisgICAgICAgICAgICAvL1snY29tcHJlc3NfbG8nLCAgICAgIC0yNTUgXSwKKyAgICAgICAgICAgIFsnY29tcHJlc3NfaGknLCAgICAgICAgLTI0NyBdLAorICAgICAgICAgICAgWydsYXN0X3JlY3QnLCAgICAgICAgICAtMjI0IF0sCisgICAgICAgICAgICBbJ3h2cCcsICAgICAgICAgICAgICAgIC0zMDkgXQorICAgICAgICBdOworCisgICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzID0ge307CisgICAgICAgIHRoaXMuX2VuY05hbWVzID0ge307CisgICAgICAgIHRoaXMuX2VuY1N0YXRzID0ge307CisKKyAgICAgICAgdGhpcy5fc29jayA9IG51bGw7ICAgICAgICAgICAgICAvLyBXZWJzb2NrIG9iamVjdAorICAgICAgICB0aGlzLl9kaXNwbGF5ID0gbnVsbDsgICAgICAgICAgIC8vIERpc3BsYXkgb2JqZWN0CisgICAgICAgIHRoaXMuX2tleWJvYXJkID0gbnVsbDsgICAgICAgICAgLy8gS2V5Ym9hcmQgaW5wdXQgaGFuZGxlciBvYmplY3QKKyAgICAgICAgdGhpcy5fbW91c2UgPSBudWxsOyAgICAgICAgICAgICAvLyBNb3VzZSBpbnB1dCBoYW5kbGVyIG9iamVjdAorICAgICAgICB0aGlzLl9zZW5kVGltZXIgPSBudWxsOyAgICAgICAgIC8vIFNlbmQgUXVldWUgY2hlY2sgdGltZXIKKyAgICAgICAgdGhpcy5fZGlzY29ublRpbWVyID0gbnVsbDsgICAgICAvLyBkaXNjb25uZWN0aW9uIHRpbWVyCisgICAgICAgIHRoaXMuX21zZ1RpbWVyID0gbnVsbDsgICAgICAgICAgLy8gcXVldWVkIGhhbmRsZV9tc2cgdGltZXIKKworICAgICAgICAvLyBGcmFtZSBidWZmZXIgdXBkYXRlIHN0YXRlCisgICAgICAgIHRoaXMuX0ZCVSA9IHsKKyAgICAgICAgICAgIHJlY3RzOiAwLAorICAgICAgICAgICAgc3VicmVjdHM6IDAsICAgICAgICAgICAgLy8gUlJFCisgICAgICAgICAgICBsaW5lczogMCwgICAgICAgICAgICAgICAvLyBSQVcKKyAgICAgICAgICAgIHRpbGVzOiAwLCAgICAgICAgICAgICAgIC8vIEhFWFRJTEUKKyAgICAgICAgICAgIGJ5dGVzOiAwLAorICAgICAgICAgICAgeDogMCwKKyAgICAgICAgICAgIHk6IDAsCisgICAgICAgICAgICB3aWR0aDogMCwKKyAgICAgICAgICAgIGhlaWdodDogMCwKKyAgICAgICAgICAgIGVuY29kaW5nOiAwLAorICAgICAgICAgICAgc3ViZW5jb2Rpbmc6IC0xLAorICAgICAgICAgICAgYmFja2dyb3VuZDogbnVsbCwKKyAgICAgICAgICAgIHpsaWI6IFtdICAgICAgICAgICAgICAgIC8vIFRJR0hUIHpsaWIgc3RyZWFtcworICAgICAgICB9OworCisgICAgICAgIHRoaXMuX2ZiX0JwcCA9IDQ7CisgICAgICAgIHRoaXMuX2ZiX2RlcHRoID0gMzsKKyAgICAgICAgdGhpcy5fZmJfd2lkdGggPSAwOworICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSAwOworICAgICAgICB0aGlzLl9mYl9uYW1lID0gIiI7CisKKyAgICAgICAgdGhpcy5fcnJlX2NodW5rX3N6ID0gMTAwOworCisgICAgICAgIHRoaXMuX3RpbWluZyA9IHsKKyAgICAgICAgICAgIGxhc3RfZmJ1OiAwLAorICAgICAgICAgICAgZmJ1X3RvdGFsOiAwLAorICAgICAgICAgICAgZmJ1X3RvdGFsX2NudDogMCwKKyAgICAgICAgICAgIGZ1bGxfZmJ1X3RvdGFsOiAwLAorICAgICAgICAgICAgZnVsbF9mYnVfY250OiAwLAorCisgICAgICAgICAgICBmYnVfcnRfc3RhcnQ6IDAsCisgICAgICAgICAgICBmYnVfcnRfdG90YWw6IDAsCisgICAgICAgICAgICBmYnVfcnRfY250OiAwLAorICAgICAgICAgICAgcGl4ZWxzOiAwCisgICAgICAgIH07CisKKyAgICAgICAgLy8gTW91c2Ugc3RhdGUKKyAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayA9IDA7CisgICAgICAgIHRoaXMuX21vdXNlX2FyciA9IFtdOworICAgICAgICB0aGlzLl92aWV3cG9ydERyYWdnaW5nID0gZmFsc2U7CisgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ1BvcyA9IHt9OworCisgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvbiB1c2VyLWZhY2luZyBwcm9wZXJ0aWVzCisgICAgICAgIFV0aWwuc2V0X2RlZmF1bHRzKHRoaXMsIGRlZmF1bHRzLCB7CisgICAgICAgICAgICAndGFyZ2V0JzogJ251bGwnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVk5DIGRpc3BsYXkgcmVuZGVyaW5nIENhbnZhcyBvYmplY3QKKyAgICAgICAgICAgICdmb2N1c0NvbnRhaW5lcic6IGRvY3VtZW50LCAgICAgICAgICAgICAvLyBET00gZWxlbWVudCB0aGF0IGNhcHR1cmVzIGtleWJvYXJkIGlucHV0CisgICAgICAgICAgICAnZW5jcnlwdCc6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFRMUy9TU0wvd3NzIGVuY3J5cHRpb24KKyAgICAgICAgICAgICd0cnVlX2NvbG9yJzogdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHRydWUgY29sb3IgcGl4ZWwgZGF0YQorICAgICAgICAgICAgJ2xvY2FsX2N1cnNvcic6IGZhbHNlLCAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgbG9jYWxseSByZW5kZXJlZCBjdXJzb3IKKyAgICAgICAgICAgICdzaGFyZWQnOiB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHNoYXJlZCBtb2RlCisgICAgICAgICAgICAndmlld19vbmx5JzogZmFsc2UsICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBjbGllbnQgbW91c2Uva2V5Ym9hcmQKKyAgICAgICAgICAgICd4dnBfcGFzc3dvcmRfc2VwJzogJ0AnLCAgICAgICAgICAgICAgICAvLyBTZXBhcmF0b3IgZm9yIFhWUCBwYXNzd29yZCBmaWVsZHMKKyAgICAgICAgICAgICdkaXNjb25uZWN0VGltZW91dCc6IDMsICAgICAgICAgICAgICAgICAvLyBUaW1lIChzKSB0byB3YWl0IGZvciBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICAnd3NQcm90b2NvbHMnOiBbJ2JpbmFyeScsICdiYXNlNjQnXSwgICAgLy8gUHJvdG9jb2xzIHRvIHVzZSBpbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24KKyAgICAgICAgICAgICdyZXBlYXRlcklEJzogJycsICAgICAgICAgICAgICAgICAgICAgICAvLyBbVWx0cmFWTkNdIFJlcGVhdGVySUQgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgJ3ZpZXdwb3J0RHJhZyc6IGZhbHNlLCAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIHZpZXdwb3J0IG9uIG1vdXNlIGRyYWdzCisKKyAgICAgICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9ucworICAgICAgICAgICAgJ29uVXBkYXRlU3RhdGUnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgIC8vIG9uVXBkYXRlU3RhdGUocmZiLCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk6IHN0YXRlIHVwZGF0ZS9jaGFuZ2UKKyAgICAgICAgICAgICdvblBhc3N3b3JkUmVxdWlyZWQnOiBmdW5jdGlvbiAoKSB7IH0sICAvLyBvblBhc3N3b3JkUmVxdWlyZWQocmZiKTogVk5DIHBhc3N3b3JkIGlzIHJlcXVpcmVkCisgICAgICAgICAgICAnb25DbGlwYm9hcmQnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgICAgLy8gb25DbGlwYm9hcmQocmZiLCB0ZXh0KTogUkZCIGNsaXBib2FyZCBjb250ZW50cyByZWNlaXZlZAorICAgICAgICAgICAgJ29uQmVsbCc6IGZ1bmN0aW9uICgpIHsgfSwgICAgICAgICAgICAgIC8vIG9uQmVsbChyZmIpOiBSRkIgQmVsbCBtZXNzYWdlIHJlY2VpdmVkCisgICAgICAgICAgICAnb25GQlVSZWNlaXZlJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgICAgLy8gb25GQlVSZWNlaXZlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWQKKyAgICAgICAgICAgICdvbkZCVUNvbXBsZXRlJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgICAvLyBvbkZCVUNvbXBsZXRlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkCisgICAgICAgICAgICAnb25GQlJlc2l6ZSc6IGZ1bmN0aW9uICgpIHsgfSwgICAgICAgICAgLy8gb25GQlJlc2l6ZShyZmIsIHdpZHRoLCBoZWlnaHQpOiBmcmFtZSBidWZmZXIgcmVzaXplZAorICAgICAgICAgICAgJ29uRGVza3RvcE5hbWUnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgIC8vIG9uRGVza3RvcE5hbWUocmZiLCBuYW1lKTogZGVza3RvcCBuYW1lIHJlY2VpdmVkCisgICAgICAgICAgICAnb25YdnBJbml0JzogZnVuY3Rpb24gKCkgeyB9LCAgICAgICAgICAgLy8gb25YdnBJbml0KHZlcnNpb24pOiBYVlAgZXh0ZW5zaW9ucyBhY3RpdmUgZm9yIHRoaXMgY29ubmVjdGlvbgorICAgICAgICB9KTsKKworICAgICAgICAvLyBtYWluIHNldHVwCisgICAgICAgIFV0aWwuRGVidWcoIj4+IFJGQi5jb25zdHJ1Y3RvciIpOworCisgICAgICAgIC8vIHBvcHVsYXRlIGVuY0hhbmRsZXJzIHdpdGggYm91bmQgdmVyc2lvbnMKKyAgICAgICAgT2JqZWN0LmtleXMoUkZCLmVuY29kaW5nSGFuZGxlcnMpLmZvckVhY2goZnVuY3Rpb24gKGVuY05hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzW2VuY05hbWVdID0gUkZCLmVuY29kaW5nSGFuZGxlcnNbZW5jTmFtZV0uYmluZCh0aGlzKTsKKyAgICAgICAgfS5iaW5kKHRoaXMpKTsKKworICAgICAgICAvLyBDcmVhdGUgbG9va3VwIHRhYmxlcyBiYXNlZCBvbiBlbmNvZGluZyBudW1iZXIKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV0gPSB0aGlzLl9lbmNIYW5kbGVyc1t0aGlzLl9lbmNvZGluZ3NbaV1bMF1dOworICAgICAgICAgICAgdGhpcy5fZW5jTmFtZXNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXSA9IHRoaXMuX2VuY29kaW5nc1tpXVswXTsKKyAgICAgICAgICAgIHRoaXMuX2VuY1N0YXRzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV0gPSBbMCwgMF07CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGlzcGxheSAmJiBkaXNwbGF5LmdldF9jb250ZXh0KCkpIHsKLSAgICAgICAgICAgIGtleWJvYXJkLnVuZ3JhYigpOwotICAgICAgICAgICAgbW91c2UudW5ncmFiKCk7Ci0gICAgICAgICAgICBkaXNwbGF5LmRlZmF1bHRDdXJzb3IoKTsKLSAgICAgICAgICAgIGlmICgoVXRpbC5nZXRfbG9nZ2luZygpICE9PSAnZGVidWcnKSB8fAotICAgICAgICAgICAgICAgIChzdGF0ZSA9PT0gJ2xvYWRlZCcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdyBub1ZOQyBsb2dvIG9uIGxvYWQgYW5kIHdoZW4gZGlzY29ubmVjdGVkIGlmCi0gICAgICAgICAgICAgICAgLy8gZGVidWcgaXMgb2ZmCi0gICAgICAgICAgICAgICAgZGlzcGxheS5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5fZGlzcGxheSA9IG5ldyBEaXNwbGF5KHt0YXJnZXQ6IHRoaXMuX3RhcmdldH0pOworICAgICAgICB9IGNhdGNoIChleGMpIHsKKyAgICAgICAgICAgIFV0aWwuRXJyb3IoIkRpc3BsYXkgZXhjZXB0aW9uOiAiICsgZXhjKTsKKyAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdmYXRhbCcsICJObyB3b3JraW5nIERpc3BsYXkiKTsKICAgICAgICAgfQogCi0gICAgICAgIHdzLmNsb3NlKCk7Ci0gICAgfQorICAgICAgICB0aGlzLl9rZXlib2FyZCA9IG5ldyBLZXlib2FyZCh7dGFyZ2V0OiB0aGlzLl9mb2N1c0NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5UHJlc3M6IHRoaXMuX2hhbmRsZUtleVByZXNzLmJpbmQodGhpcyl9KTsKIAotICAgIGlmIChvbGRzdGF0ZSA9PT0gJ2ZhdGFsJykgewotICAgICAgICBVdGlsLkVycm9yKCJGYXRhbCBlcnJvciwgY2Fubm90IGNvbnRpbnVlIik7Ci0gICAgfQorICAgICAgICB0aGlzLl9tb3VzZSA9IG5ldyBNb3VzZSh7dGFyZ2V0OiB0aGlzLl90YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlQnV0dG9uOiB0aGlzLl9oYW5kbGVNb3VzZUJ1dHRvbi5iaW5kKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZU1vdmU6IHRoaXMuX2hhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5OiB0aGlzLl9rZXlib2FyZC5zeW5jLmJpbmQodGhpcy5fa2V5Ym9hcmQpfSk7CiAKLSAgICBpZiAoKHN0YXRlID09PSAnZmFpbGVkJykgfHwgKHN0YXRlID09PSAnZmF0YWwnKSkgewotICAgICAgICBmdW5jID0gVXRpbC5FcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBmdW5jID0gVXRpbC5XYXJuOwotICAgIH0KLQotICAgIGlmICgob2xkc3RhdGUgPT09ICdmYWlsZWQnKSAmJiAoc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKSkgewotICAgICAgICAvLyBEbyBkaXNjb25uZWN0IGFjdGlvbiwgYnV0IHN0YXkgaW4gZmFpbGVkIHN0YXRlLgotICAgICAgICByZmJfc3RhdGUgPSAnZmFpbGVkJzsKLSAgICB9IGVsc2UgewotICAgICAgICByZmJfc3RhdGUgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICBjbXNnID0gdHlwZW9mKHN0YXR1c01zZykgIT09ICd1bmRlZmluZWQnID8gKCIgTXNnOiAiICsgc3RhdHVzTXNnKSA6ICIiOwotICAgIGZ1bmMoIk5ldyBzdGF0ZSAnIiArIHJmYl9zdGF0ZSArICInLCB3YXMgJyIgKyBvbGRzdGF0ZSArICInLiIgKyBjbXNnKTsKLQotICAgIGlmIChjb25uVGltZXIgJiYgKHJmYl9zdGF0ZSAhPT0gJ2Nvbm5lY3QnKSkgewotICAgICAgICBVdGlsLkRlYnVnKCJDbGVhcmluZyBjb25uZWN0IHRpbWVyIik7Ci0gICAgICAgIGNsZWFySW50ZXJ2YWwoY29ublRpbWVyKTsKLSAgICAgICAgY29ublRpbWVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoZGlzY29ublRpbWVyICYmIChyZmJfc3RhdGUgIT09ICdkaXNjb25uZWN0JykpIHsKLSAgICAgICAgVXRpbC5EZWJ1ZygiQ2xlYXJpbmcgZGlzY29ubmVjdCB0aW1lciIpOwotICAgICAgICBjbGVhckludGVydmFsKGRpc2Nvbm5UaW1lcik7Ci0gICAgICAgIGRpc2Nvbm5UaW1lciA9IG51bGw7Ci0gICAgfQotCi0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgJ25vcm1hbCc6Ci0gICAgICAgIGlmICgob2xkc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKSB8fCAob2xkc3RhdGUgPT09ICdmYWlsZWQnKSkgewotICAgICAgICAgICAgVXRpbC5FcnJvcigiSW52YWxpZCB0cmFuc2l0aW9uIGZyb20gJ2Rpc2Nvbm5lY3RlZCcgb3IgJ2ZhaWxlZCcgdG8gJ25vcm1hbCciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlICdjb25uZWN0JzoKLSAgICAgICAgCi0gICAgICAgIGNvbm5UaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgICAgIGZhaWwoIkNvbm5lY3QgdGltZW91dCIpOwotICAgICAgICAgICAgfSwgY29uZi5jb25uZWN0VGltZW91dCAqIDEwMDApOwotCi0gICAgICAgIGluaXRfdmFycygpOwotICAgICAgICBjb25uZWN0KCk7Ci0KLSAgICAgICAgLy8gV2ViU29ja2V0Lm9ub3BlbiB0cmFuc2l0aW9ucyB0byAnUHJvdG9jb2xWZXJzaW9uJwotICAgICAgICBicmVhazsKLQotCi0gICAgY2FzZSAnZGlzY29ubmVjdCc6Ci0KLSAgICAgICAgaWYgKCEgdGVzdF9tb2RlKSB7Ci0gICAgICAgICAgICBkaXNjb25uVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiRGlzY29ubmVjdCB0aW1lb3V0Iik7Ci0gICAgICAgICAgICAgICAgfSwgY29uZi5kaXNjb25uZWN0VGltZW91dCAqIDEwMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRfc3RhdHMoKTsKLQotICAgICAgICAvLyBXZWJTb2NrZXQub25jbG9zZSB0cmFuc2l0aW9ucyB0byAnZGlzY29ubmVjdGVkJwotICAgICAgICBicmVhazsKLQotCi0gICAgY2FzZSAnZmFpbGVkJzoKLSAgICAgICAgaWYgKG9sZHN0YXRlID09PSAnZGlzY29ubmVjdGVkJykgewotICAgICAgICAgICAgVXRpbC5FcnJvcigiSW52YWxpZCB0cmFuc2l0aW9uIGZyb20gJ2Rpc2Nvbm5lY3RlZCcgdG8gJ2ZhaWxlZCciKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2xkc3RhdGUgPT09ICdub3JtYWwnKSB7Ci0gICAgICAgICAgICBVdGlsLkVycm9yKCJFcnJvciB3aGlsZSBjb25uZWN0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9sZHN0YXRlID09PSAnaW5pdCcpIHsKLSAgICAgICAgICAgIFV0aWwuRXJyb3IoIkVycm9yIHdoaWxlIGluaXRpYWxpemluZy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmFuc2l0aW9uIHRvIGRpc2Nvbm5lY3RlZAotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB1cGRhdGVTdGF0ZSgnZGlzY29ubmVjdGVkJyk7IH0sIDUwKTsKLQotICAgICAgICBicmVhazsKLQotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gTm8gc3RhdGUgY2hhbmdlIGFjdGlvbiB0byB0YWtlCi0KLSAgICB9Ci0KLSAgICBpZiAoKG9sZHN0YXRlID09PSAnZmFpbGVkJykgJiYgKHN0YXRlID09PSAnZGlzY29ubmVjdGVkJykpIHsKLSAgICAgICAgLy8gTGVhdmUgdGhlIGZhaWxlZCBtZXNzYWdlCi0gICAgICAgIGNvbmYudXBkYXRlU3RhdGUodGhhdCwgc3RhdGUsIG9sZHN0YXRlKTsgLy8gT2Jzb2xldGUKLSAgICAgICAgY29uZi5vblVwZGF0ZVN0YXRlKHRoYXQsIHN0YXRlLCBvbGRzdGF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uZi51cGRhdGVTdGF0ZSh0aGF0LCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk7IC8vIE9ic29sZXRlCi0gICAgICAgIGNvbmYub25VcGRhdGVTdGF0ZSh0aGF0LCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk7Ci0gICAgfQotfTsKLQotZmFpbCA9IGZ1bmN0aW9uKG1zZykgewotICAgIHVwZGF0ZVN0YXRlKCdmYWlsZWQnLCBtc2cpOwotICAgIHJldHVybiBmYWxzZTsKLX07Ci0KLWhhbmRsZV9tZXNzYWdlID0gZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBoYW5kbGVfbWVzc2FnZSB3cy5yUWxlbigpOiAiICsgd3MuclFsZW4oKSk7Ci0gICAgLy9VdGlsLkRlYnVnKCJ3cy5yUXNsaWNlKDAsMjApOiAiICsgd3MuclFzbGljZSgwLDIwKSArICIgKCIgKyB3cy5yUWxlbigpICsgIikiKTsKLSAgICBpZiAod3MuclFsZW4oKSA9PT0gMCkgewotICAgICAgICBVdGlsLldhcm4oImhhbmRsZV9tZXNzYWdlIGNhbGxlZCBvbiBlbXB0eSByZWNlaXZlIHF1ZXVlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoIChyZmJfc3RhdGUpIHsKLSAgICBjYXNlICdkaXNjb25uZWN0ZWQnOgotICAgIGNhc2UgJ2ZhaWxlZCc6Ci0gICAgICAgIFV0aWwuRXJyb3IoIkdvdCBkYXRhIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdub3JtYWwnOgotICAgICAgICBpZiAobm9ybWFsX21zZygpICYmIHdzLnJRbGVuKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyB0cnVlIG1lYW5zIHdlIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nCi0gICAgICAgICAgICAvLyBHaXZlIG90aGVyIGV2ZW50cyBhIGNoYW5jZSB0byBydW4KLSAgICAgICAgICAgIGlmIChtc2dUaW1lciA9PT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIk1vcmUgZGF0YSB0byBwcm9jZXNzLCBjcmVhdGluZyB0aW1lciIpOwotICAgICAgICAgICAgICAgIG1zZ1RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnVGltZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9tZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMCk7CisgICAgICAgIHRoaXMuX3NvY2sgPSBuZXcgV2Vic29jaygpOworICAgICAgICB0aGlzLl9zb2NrLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlX21lc3NhZ2UuYmluZCh0aGlzKSk7CisgICAgICAgIHRoaXMuX3NvY2sub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3N0YXRlID09PSAnY29ubmVjdCcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSgnUHJvdG9jb2xWZXJzaW9uJywgIlN0YXJ0aW5nIFZOQyBoYW5kc2hha2UiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygiTW9yZSBkYXRhIHRvIHByb2Nlc3MsIGV4aXN0aW5nIHRpbWVyIik7CisgICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgiR290IHVuZXhwZWN0ZWQgV2ViU29ja2V0IGNvbm5lY3Rpb24iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBpbml0X21zZygpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19OwotCi0KLWZ1bmN0aW9uIGdlbkRFUyhwYXNzd29yZCwgY2hhbGxlbmdlKSB7Ci0gICAgdmFyIGksIHBhc3N3ZCA9IFtdOwotICAgIGZvciAoaT0wOyBpIDwgcGFzc3dvcmQubGVuZ3RoOyBpICs9IDEpIHsKLSAgICAgICAgcGFzc3dkLnB1c2gocGFzc3dvcmQuY2hhckNvZGVBdChpKSk7Ci0gICAgfQotICAgIHJldHVybiAobmV3IERFUyhwYXNzd2QpKS5lbmNyeXB0KGNoYWxsZW5nZSk7Ci19Ci0KLWZ1bmN0aW9uIGZsdXNoQ2xpZW50KCkgewotICAgIGlmIChtb3VzZV9hcnIubGVuZ3RoID4gMCkgewotICAgICAgICAvL3NlbmQobW91c2VfYXJyLmNvbmNhdChmYlVwZGF0ZVJlcXVlc3RzKCkpKTsKLSAgICAgICAgd3Muc2VuZChtb3VzZV9hcnIpOwotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIHdzLnNlbmQoZmJVcGRhdGVSZXF1ZXN0cygpKTsKLSAgICAgICAgICAgIH0sIDUwKTsKLQotICAgICAgICBtb3VzZV9hcnIgPSBbXTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLy8gb3ZlcnJpZGFibGUgZm9yIHRlc3RpbmcKLWNoZWNrRXZlbnRzID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5vdzsKLSAgICBpZiAocmZiX3N0YXRlID09PSAnbm9ybWFsJyAmJiAhdmlld3BvcnREcmFnZ2luZykgewotICAgICAgICBpZiAoISBmbHVzaENsaWVudCgpKSB7Ci0gICAgICAgICAgICBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgICAgIGlmIChub3cgPiBsYXN0X3JlcV90aW1lICsgY29uZi5mYnVfcmVxX3JhdGUpIHsKLSAgICAgICAgICAgICAgICBsYXN0X3JlcV90aW1lID0gbm93OwotICAgICAgICAgICAgICAgIHdzLnNlbmQoZmJVcGRhdGVSZXF1ZXN0cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBzZXRUaW1lb3V0KGNoZWNrRXZlbnRzLCBjb25mLmNoZWNrX3JhdGUpOwotfTsKLQota2V5UHJlc3MgPSBmdW5jdGlvbihrZXlzeW0sIGRvd24pIHsKLSAgICB2YXIgYXJyOwotCi0gICAgaWYgKGNvbmYudmlld19vbmx5KSB7IHJldHVybjsgfSAvLyBWaWV3IG9ubHksIHNraXAga2V5Ym9hcmQgZXZlbnRzCi0KLSAgICBhcnIgPSBrZXlFdmVudChrZXlzeW0sIGRvd24pOwotICAgIGFyciA9IGFyci5jb25jYXQoZmJVcGRhdGVSZXF1ZXN0cygpKTsKLSAgICB3cy5zZW5kKGFycik7Ci19OwotCi1tb3VzZUJ1dHRvbiA9IGZ1bmN0aW9uKHgsIHksIGRvd24sIGJtYXNrKSB7Ci0gICAgaWYgKGRvd24pIHsKLSAgICAgICAgbW91c2VfYnV0dG9uTWFzayB8PSBibWFzazsKLSAgICB9IGVsc2UgewotICAgICAgICBtb3VzZV9idXR0b25NYXNrIF49IGJtYXNrOwotICAgIH0KLQotICAgIGlmIChjb25mLnZpZXdwb3J0RHJhZykgewotICAgICAgICBpZiAoZG93biAmJiAhdmlld3BvcnREcmFnZ2luZykgewotICAgICAgICAgICAgdmlld3BvcnREcmFnZ2luZyA9IHRydWU7Ci0gICAgICAgICAgICB2aWV3cG9ydERyYWdQb3MgPSB7J3gnOiB4LCAneSc6IHl9OwotCi0gICAgICAgICAgICAvLyBTa2lwIHNlbmRpbmcgbW91c2UgZXZlbnRzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2aWV3cG9ydERyYWdnaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5zZW5kKGZiVXBkYXRlUmVxdWVzdHMoKSk7IC8vIEZvcmNlIGltbWVkaWF0ZSByZWRyYXcKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjb25mLnZpZXdfb25seSkgeyByZXR1cm47IH0gLy8gVmlldyBvbmx5LCBza2lwIG1vdXNlIGV2ZW50cwotCi0gICAgbW91c2VfYXJyID0gbW91c2VfYXJyLmNvbmNhdCgKLSAgICAgICAgICAgIHBvaW50ZXJFdmVudChkaXNwbGF5LmFic1goeCksIGRpc3BsYXkuYWJzWSh5KSkgKTsKLSAgICBmbHVzaENsaWVudCgpOwotfTsKLQotbW91c2VNb3ZlID0gZnVuY3Rpb24oeCwgeSkgewotICAgIC8vVXRpbC5EZWJ1ZygnPj4gbW91c2VNb3ZlICcgKyB4ICsgIiwiICsgeSk7Ci0gICAgdmFyIGRlbHRhWCwgZGVsdGFZOwotCi0gICAgaWYgKHZpZXdwb3J0RHJhZ2dpbmcpIHsKLSAgICAgICAgLy9kZWx0YVggPSB4IC0gdmlld3BvcnREcmFnUG9zLng7IC8vIGRyYWcgdmlld3BvcnQKLSAgICAgICAgZGVsdGFYID0gdmlld3BvcnREcmFnUG9zLnggLSB4OyAvLyBkcmFnIGZyYW1lIGJ1ZmZlcgotICAgICAgICAvL2RlbHRhWSA9IHkgLSB2aWV3cG9ydERyYWdQb3MueTsgLy8gZHJhZyB2aWV3cG9ydAotICAgICAgICBkZWx0YVkgPSB2aWV3cG9ydERyYWdQb3MueSAtIHk7IC8vIGRyYWcgZnJhbWUgYnVmZmVyCi0gICAgICAgIHZpZXdwb3J0RHJhZ1BvcyA9IHsneCc6IHgsICd5JzogeX07Ci0KLSAgICAgICAgZGlzcGxheS52aWV3cG9ydENoYW5nZShkZWx0YVgsIGRlbHRhWSk7Ci0KLSAgICAgICAgLy8gU2tpcCBzZW5kaW5nIG1vdXNlIGV2ZW50cwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNvbmYudmlld19vbmx5KSB7IHJldHVybjsgfSAvLyBWaWV3IG9ubHksIHNraXAgbW91c2UgZXZlbnRzCi0KLSAgICBtb3VzZV9hcnIgPSBtb3VzZV9hcnIuY29uY2F0KAotICAgICAgICAgICAgcG9pbnRlckV2ZW50KGRpc3BsYXkuYWJzWCh4KSwgZGlzcGxheS5hYnNZKHkpKSApOwotfTsKLQotCi0vLwotLy8gU2VydmVyIG1lc3NhZ2UgaGFuZGxlcnMKLS8vCi0KLS8vIFJGQi9WTkMgaW5pdGlhbGlzYXRpb24gbWVzc2FnZSBoYW5kbGVyCi1pbml0X21zZyA9IGZ1bmN0aW9uKCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gaW5pdF9tc2cgW3JmYl9zdGF0ZSAnIiArIHJmYl9zdGF0ZSArICInXSIpOwotCi0gICAgdmFyIHN0cmxlbiwgcmVhc29uLCBsZW5ndGgsIHN2ZXJzaW9uLCBjdmVyc2lvbiwKLSAgICAgICAgaSwgdHlwZXMsIG51bV90eXBlcywgY2hhbGxlbmdlLCByZXNwb25zZSwgYnBwLCBkZXB0aCwKLSAgICAgICAgYmlnX2VuZGlhbiwgcmVkX21heCwgZ3JlZW5fbWF4LCBibHVlX21heCwgcmVkX3NoaWZ0LAotICAgICAgICBncmVlbl9zaGlmdCwgYmx1ZV9zaGlmdCwgdHJ1ZV9jb2xvciwgbmFtZV9sZW5ndGg7Ci0KLSAgICAvL1V0aWwuRGVidWcoIndzLnJRICgiICsgd3MuclFsZW4oKSArICIpICIgKyB3cy5yUXNsaWNlKDApKTsKLSAgICBzd2l0Y2ggKHJmYl9zdGF0ZSkgewotCi0gICAgY2FzZSAnUHJvdG9jb2xWZXJzaW9uJyA6Ci0gICAgICAgIGlmICh3cy5yUWxlbigpIDwgMTIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWlsKCJJbmNvbXBsZXRlIHByb3RvY29sIHZlcnNpb24iKTsKLSAgICAgICAgfQotICAgICAgICBzdmVyc2lvbiA9IHdzLnJRc2hpZnRTdHIoMTIpLnN1YnN0cig0LDcpOwotICAgICAgICBVdGlsLkluZm8oIlNlcnZlciBQcm90b2NvbFZlcnNpb246ICIgKyBzdmVyc2lvbik7Ci0gICAgICAgIHN3aXRjaCAoc3ZlcnNpb24pIHsKLSAgICAgICAgICAgIGNhc2UgIjAwMy4wMDMiOiByZmJfdmVyc2lvbiA9IDMuMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICIwMDMuMDA2IjogcmZiX3ZlcnNpb24gPSAzLjM7IGJyZWFrOyAgLy8gVWx0cmFWTkMKLSAgICAgICAgICAgIGNhc2UgIjAwMy44ODkiOiByZmJfdmVyc2lvbiA9IDMuMzsgYnJlYWs7ICAvLyBBcHBsZSBSZW1vdGUgRGVza3RvcAotICAgICAgICAgICAgY2FzZSAiMDAzLjAwNyI6IHJmYl92ZXJzaW9uID0gMy43OyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIjAwMy4wMDgiOiByZmJfdmVyc2lvbiA9IDMuODsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICIwMDQuMDAwIjogcmZiX3ZlcnNpb24gPSAzLjg7IGJyZWFrOyAgLy8gSW50ZWwgQU1UIEtWTQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgiSW52YWxpZCBzZXJ2ZXIgdmVyc2lvbiAiICsgc3ZlcnNpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZmJfdmVyc2lvbiA+IHJmYl9tYXhfdmVyc2lvbikgeyAKLSAgICAgICAgICAgIHJmYl92ZXJzaW9uID0gcmZiX21heF92ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgdGVzdF9tb2RlKSB7Ci0gICAgICAgICAgICBzZW5kVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB1cGRhdGVzIGVpdGhlciBhdCBhIHJhdGUgb2Ygb25lIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSA1MG1zLCBvciB3aGF0ZXZlciBzbG93ZXIgcmF0ZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAgICAvLyBjYW4gaGFuZGxlLgotICAgICAgICAgICAgICAgICAgICB3cy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0sIDUwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGN2ZXJzaW9uID0gIjAwIiArIHBhcnNlSW50KHJmYl92ZXJzaW9uLDEwKSArCi0gICAgICAgICAgICAgICAgICAgIi4wMCIgKyAoKHJmYl92ZXJzaW9uICogMTApICUgMTApOwotICAgICAgICB3cy5zZW5kX3N0cmluZygiUkZCICIgKyBjdmVyc2lvbiArICJcbiIpOwotICAgICAgICB1cGRhdGVTdGF0ZSgnU2VjdXJpdHknLCAiU2VudCBQcm90b2NvbFZlcnNpb246ICIgKyBjdmVyc2lvbik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnU2VjdXJpdHknIDoKLSAgICAgICAgaWYgKHJmYl92ZXJzaW9uID49IDMuNykgewotICAgICAgICAgICAgLy8gU2VydmVyIHNlbmRzIHN1cHBvcnRlZCBsaXN0LCBjbGllbnQgZGVjaWRlcyAKLSAgICAgICAgICAgIG51bV90eXBlcyA9IHdzLnJRc2hpZnQ4KCk7Ci0gICAgICAgICAgICBpZiAod3MuclF3YWl0KCJzZWN1cml0eSB0eXBlIiwgbnVtX3R5cGVzLCAxKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgICAgIGlmIChudW1fdHlwZXMgPT09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJsZW4gPSB3cy5yUXNoaWZ0MzIoKTsKLSAgICAgICAgICAgICAgICByZWFzb24gPSB3cy5yUXNoaWZ0U3RyKHN0cmxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoIlNlY3VyaXR5IGZhaWx1cmU6ICIgKyByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmZiX2F1dGhfc2NoZW1lID0gMDsKLSAgICAgICAgICAgIHR5cGVzID0gd3MuclFzaGlmdEJ5dGVzKG51bV90eXBlcyk7Ci0gICAgICAgICAgICBVdGlsLkRlYnVnKCJTZXJ2ZXIgc2VjdXJpdHkgdHlwZXM6ICIgKyB0eXBlcyk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHR5cGVzLmxlbmd0aDsgaSs9MSkgewotICAgICAgICAgICAgICAgIGlmICgodHlwZXNbaV0gPiByZmJfYXV0aF9zY2hlbWUpICYmICh0eXBlc1tpXSA8IDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJmYl9hdXRoX3NjaGVtZSA9IHR5cGVzW2ldOworICAgICAgICB9LmJpbmQodGhpcykpOworICAgICAgICB0aGlzLl9zb2NrLm9uKCdjbG9zZScsIGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBVdGlsLldhcm4oIldlYlNvY2tldCBvbi1jbG9zZSBldmVudCIpOworICAgICAgICAgICAgdmFyIG1zZyA9ICIiOworICAgICAgICAgICAgaWYgKGUuY29kZSkgeworICAgICAgICAgICAgICAgIG1zZyA9ICIgKGNvZGU6ICIgKyBlLmNvZGU7CisgICAgICAgICAgICAgICAgaWYgKGUucmVhc29uKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiLCByZWFzb246ICIgKyBlLnJlYXNvbjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnICs9ICIpIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZmJfYXV0aF9zY2hlbWUgPT09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZXM6ICIgKyB0eXBlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdzLnNlbmQoW3JmYl9hdXRoX3NjaGVtZV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2VydmVyIGRlY2lkZXMKLSAgICAgICAgICAgIGlmICh3cy5yUXdhaXQoInNlY3VyaXR5IHNjaGVtZSIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgcmZiX2F1dGhfc2NoZW1lID0gd3MuclFzaGlmdDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlU3RhdGUoJ0F1dGhlbnRpY2F0aW9uJywKLSAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpbmcgdXNpbmcgc2NoZW1lOiAiICsgcmZiX2F1dGhfc2NoZW1lKTsKLSAgICAgICAgaW5pdF9tc2coKTsgIC8vIFJlY3Vyc2l2ZSBmYWxsdGhyb3VnaCAod29ya2Fyb3VuZCBKU0xpbnQgY29tcGxhaW50KQotICAgICAgICBicmVhazsKLQotICAgIC8vIFRyaWdnZXJlZCBieSBmYWxsdGhvdWdoLCBub3QgYnkgc2VydmVyIG1lc3NhZ2UKLSAgICBjYXNlICdBdXRoZW50aWNhdGlvbicgOgotICAgICAgICAvL1V0aWwuRGVidWcoIlNlY3VyaXR5IGF1dGggc2NoZW1lOiAiICsgcmZiX2F1dGhfc2NoZW1lKTsKLSAgICAgICAgc3dpdGNoIChyZmJfYXV0aF9zY2hlbWUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogIC8vIGNvbm5lY3Rpb24gZmFpbGVkCi0gICAgICAgICAgICAgICAgaWYgKHdzLnJRd2FpdCgiYXV0aCByZWFzb24iLCA0KSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgICAgICAgICBzdHJsZW4gPSB3cy5yUXNoaWZ0MzIoKTsKLSAgICAgICAgICAgICAgICByZWFzb24gPSB3cy5yUXNoaWZ0U3RyKHN0cmxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoIkF1dGggZmFpbHVyZTogIiArIHJlYXNvbik7Ci0gICAgICAgICAgICBjYXNlIDE6ICAvLyBubyBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgIGlmIChyZmJfdmVyc2lvbiA+PSAzLjgpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGUoJ1NlY3VyaXR5UmVzdWx0Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIENsaWVudEluaXRpYWxpc2F0aW9uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6ICAvLyBWTkMgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICBpZiAocmZiX3Bhc3N3b3JkLmxlbmd0aCA9PT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgdmlhIGJvdGggY2FsbGJhY2tzIHNpbmNlIGl0IGlzIGtpbmQgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBSRkIgc3RhdGUgY2hhbmdlIGFuZCBhIFVJIGludGVyZmFjZSBpc3N1ZS4KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGUoJ3Bhc3N3b3JkJywgIlBhc3N3b3JkIFJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmYub25QYXNzd29yZFJlcXVpcmVkKHRoYXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3cy5yUXdhaXQoImF1dGggY2hhbGxlbmdlIiwgMTYpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgICAgIGNoYWxsZW5nZSA9IHdzLnJRc2hpZnRCeXRlcygxNik7Ci0gICAgICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJQYXNzd29yZDogIiArIHJmYl9wYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJDaGFsbGVuZ2U6ICIgKyBjaGFsbGVuZ2UgKwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAiICgiICsgY2hhbGxlbmdlLmxlbmd0aCArICIpIik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZW5ERVMocmZiX3Bhc3N3b3JkLCBjaGFsbGVuZ2UpOwotICAgICAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiUmVzcG9uc2U6ICIgKyByZXNwb25zZSArCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICIgKCIgKyByZXNwb25zZS5sZW5ndGggKyAiKSIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiU2VuZGluZyBERVMgZW5jcnlwdGVkIGF1dGggcmVzcG9uc2UiKTsKLSAgICAgICAgICAgICAgICB3cy5zZW5kKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSgnU2VjdXJpdHlSZXN1bHQnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkIGF1dGggc2NoZW1lOiAiICsgcmZiX2F1dGhfc2NoZW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlU3RhdGUoJ0NsaWVudEluaXRpYWxpc2F0aW9uJywgIk5vIGF1dGggcmVxdWlyZWQiKTsKLSAgICAgICAgaW5pdF9tc2coKTsgIC8vIFJlY3Vyc2l2ZSBmYWxsdGhyb3VnaCAod29ya2Fyb3VuZCBKU0xpbnQgY29tcGxhaW50KQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgJ1NlY3VyaXR5UmVzdWx0JyA6Ci0gICAgICAgIGlmICh3cy5yUXdhaXQoIlZOQyBhdXRoIHJlc3BvbnNlICIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICBzd2l0Y2ggKHdzLnJRc2hpZnQzMigpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICAvLyBPSwotICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBDbGllbnRJbml0aWFsaXNhdGlvbgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgLy8gZmFpbGVkCi0gICAgICAgICAgICAgICAgaWYgKHJmYl92ZXJzaW9uID49IDMuOCkgewotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSB3cy5yUXNoaWZ0MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzLnJRd2FpdCgiU2VjdXJpdHlSZXN1bHQgcmVhc29uIiwgbGVuZ3RoLCA4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IHdzLnJRc2hpZnRTdHIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbChyZWFzb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIDI6ICAvLyB0b28tbWFueQotICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCJUb28gbWFueSBhdXRoIGF0dGVtcHRzIik7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlU3RhdGUoJ0NsaWVudEluaXRpYWxpc2F0aW9uJywgIkF1dGhlbnRpY2F0aW9uIE9LIik7Ci0gICAgICAgIGluaXRfbXNnKCk7ICAvLyBSZWN1cnNpdmUgZmFsbHRocm91Z2ggKHdvcmthcm91bmQgSlNMaW50IGNvbXBsYWludCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAvLyBUcmlnZ2VyZWQgYnkgZmFsbHRob3VnaCwgbm90IGJ5IHNlcnZlciBtZXNzYWdlCi0gICAgY2FzZSAnQ2xpZW50SW5pdGlhbGlzYXRpb24nIDoKLSAgICAgICAgd3Muc2VuZChbY29uZi5zaGFyZWQgPyAxIDogMF0pOyAvLyBDbGllbnRJbml0aWFsaXNhdGlvbgotICAgICAgICB1cGRhdGVTdGF0ZSgnU2VydmVySW5pdGlhbGlzYXRpb24nLCAiQXV0aGVudGljYXRpb24gT0siKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTZXJ2ZXJJbml0aWFsaXNhdGlvbicgOgotICAgICAgICBpZiAod3MuclF3YWl0KCJzZXJ2ZXIgaW5pdGlhbGl6YXRpb24iLCAyNCkpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgLyogU2NyZWVuIHNpemUgKi8KLSAgICAgICAgZmJfd2lkdGggID0gd3MuclFzaGlmdDE2KCk7Ci0gICAgICAgIGZiX2hlaWdodCA9IHdzLnJRc2hpZnQxNigpOwotCi0gICAgICAgIC8qIFBJWEVMX0ZPUk1BVCAqLwotICAgICAgICBicHAgICAgICAgICAgICA9IHdzLnJRc2hpZnQ4KCk7Ci0gICAgICAgIGRlcHRoICAgICAgICAgID0gd3MuclFzaGlmdDgoKTsKLSAgICAgICAgYmlnX2VuZGlhbiAgICAgPSB3cy5yUXNoaWZ0OCgpOwotICAgICAgICB0cnVlX2NvbG9yICAgICA9IHdzLnJRc2hpZnQ4KCk7Ci0KLSAgICAgICAgcmVkX21heCAgICAgICAgPSB3cy5yUXNoaWZ0MTYoKTsKLSAgICAgICAgZ3JlZW5fbWF4ICAgICAgPSB3cy5yUXNoaWZ0MTYoKTsKLSAgICAgICAgYmx1ZV9tYXggICAgICAgPSB3cy5yUXNoaWZ0MTYoKTsKLSAgICAgICAgcmVkX3NoaWZ0ICAgICAgPSB3cy5yUXNoaWZ0OCgpOwotICAgICAgICBncmVlbl9zaGlmdCAgICA9IHdzLnJRc2hpZnQ4KCk7Ci0gICAgICAgIGJsdWVfc2hpZnQgICAgID0gd3MuclFzaGlmdDgoKTsKLSAgICAgICAgd3MuclFzaGlmdFN0cigzKTsgLy8gcGFkZGluZwotCi0gICAgICAgIFV0aWwuSW5mbygiU2NyZWVuOiAiICsgZmJfd2lkdGggKyAieCIgKyBmYl9oZWlnaHQgKyAKLSAgICAgICAgICAgICAgICAgICIsIGJwcDogIiArIGJwcCArICIsIGRlcHRoOiAiICsgZGVwdGggKwotICAgICAgICAgICAgICAgICAgIiwgYmlnX2VuZGlhbjogIiArIGJpZ19lbmRpYW4gKwotICAgICAgICAgICAgICAgICAgIiwgdHJ1ZV9jb2xvcjogIiArIHRydWVfY29sb3IgKwotICAgICAgICAgICAgICAgICAgIiwgcmVkX21heDogIiArIHJlZF9tYXggKwotICAgICAgICAgICAgICAgICAgIiwgZ3JlZW5fbWF4OiAiICsgZ3JlZW5fbWF4ICsKLSAgICAgICAgICAgICAgICAgICIsIGJsdWVfbWF4OiAiICsgYmx1ZV9tYXggKwotICAgICAgICAgICAgICAgICAgIiwgcmVkX3NoaWZ0OiAiICsgcmVkX3NoaWZ0ICsKLSAgICAgICAgICAgICAgICAgICIsIGdyZWVuX3NoaWZ0OiAiICsgZ3JlZW5fc2hpZnQgKwotICAgICAgICAgICAgICAgICAgIiwgYmx1ZV9zaGlmdDogIiArIGJsdWVfc2hpZnQpOwotCi0gICAgICAgIGlmIChiaWdfZW5kaWFuICE9PSAwKSB7Ci0gICAgICAgICAgICBVdGlsLldhcm4oIlNlcnZlciBuYXRpdmUgZW5kaWFuIGlzIG5vdCBsaXR0bGUgZW5kaWFuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZF9zaGlmdCAhPT0gMTYpIHsKLSAgICAgICAgICAgIFV0aWwuV2FybigiU2VydmVyIG5hdGl2ZSByZWQtc2hpZnQgaXMgbm90IDE2Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJsdWVfc2hpZnQgIT09IDApIHsKLSAgICAgICAgICAgIFV0aWwuV2FybigiU2VydmVyIG5hdGl2ZSBibHVlLXNoaWZ0IGlzIG5vdCAwIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb25uZWN0aW9uIG5hbWUvdGl0bGUgKi8KLSAgICAgICAgbmFtZV9sZW5ndGggICA9IHdzLnJRc2hpZnQzMigpOwotICAgICAgICBmYl9uYW1lID0gd3MuclFzaGlmdFN0cihuYW1lX2xlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29uZi50cnVlX2NvbG9yICYmIGZiX25hbWUgPT09ICJJbnRlbChyKSBBTVQgS1ZNIikKLSAgICAgICAgewotICAgICAgICAgICAgVXRpbC5XYXJuKCJJbnRlbCBBTVQgS1ZNIG9ubHkgc3VwcG9ydCA4LzE2IGJpdCBkZXB0aHMuIERpc2FibGluZyB0cnVlIGNvbG9yIik7Ci0gICAgICAgICAgICBjb25mLnRydWVfY29sb3IgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRpc3BsYXkuc2V0X3RydWVfY29sb3IoY29uZi50cnVlX2NvbG9yKTsKLSAgICAgICAgZGlzcGxheS5yZXNpemUoZmJfd2lkdGgsIGZiX2hlaWdodCk7Ci0gICAgICAgIGtleWJvYXJkLmdyYWIoKTsKLSAgICAgICAgbW91c2UuZ3JhYigpOwotCi0gICAgICAgIGlmIChjb25mLnRydWVfY29sb3IpIHsKLSAgICAgICAgICAgIGZiX0JwcCAgICAgICAgICAgPSA0OwotICAgICAgICAgICAgZmJfZGVwdGggICAgICAgICA9IDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYl9CcHAgICAgICAgICAgID0gMTsKLSAgICAgICAgICAgIGZiX2RlcHRoICAgICAgICAgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzcG9uc2UgPSBwaXhlbEZvcm1hdCgpOwotICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLmNvbmNhdChjbGllbnRFbmNvZGluZ3MoKSk7Ci0gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuY29uY2F0KGZiVXBkYXRlUmVxdWVzdHMoKSk7Ci0gICAgICAgIHRpbWluZy5mYnVfcnRfc3RhcnQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotICAgICAgICB3cy5zZW5kKHJlc3BvbnNlKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFN0YXJ0IHB1c2hpbmcvcG9sbGluZyAqLwotICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRXZlbnRzLCBjb25mLmNoZWNrX3JhdGUpOwotICAgICAgICBzZXRUaW1lb3V0KHNjYW5fdGlnaHRfaW1nUSwgc2Nhbl9pbWdRX3JhdGUpOwotCi0gICAgICAgIGlmIChjb25mLmVuY3J5cHQpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlKCdub3JtYWwnLCAiQ29ubmVjdGVkIChlbmNyeXB0ZWQpIHRvOiAiICsgZmJfbmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0ZSgnbm9ybWFsJywgIkNvbm5lY3RlZCAodW5lbmNyeXB0ZWQpIHRvOiAiICsgZmJfbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8vVXRpbC5EZWJ1ZygiPDwgaW5pdF9tc2ciKTsKLX07Ci0KLQotLyogTm9ybWFsIFJGQi9WTkMgc2VydmVyIG1lc3NhZ2UgaGFuZGxlciAqLwotbm9ybWFsX21zZyA9IGZ1bmN0aW9uKCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gbm9ybWFsX21zZyIpOwotCi0gICAgdmFyIHJldCA9IHRydWUsIG1zZ190eXBlLCBsZW5ndGgsIHRleHQsCi0gICAgICAgIGMsIGZpcnN0X2NvbG91ciwgbnVtX2NvbG91cnMsIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICBpZiAoRkJVLnJlY3RzID4gMCkgewotICAgICAgICBtc2dfdHlwZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXNnX3R5cGUgPSB3cy5yUXNoaWZ0OCgpOwotICAgIH0KLSAgICBzd2l0Y2ggKG1zZ190eXBlKSB7Ci0gICAgY2FzZSAwOiAgLy8gRnJhbWVidWZmZXJVcGRhdGUKLSAgICAgICAgcmV0ID0gZnJhbWVidWZmZXJVcGRhdGUoKTsgLy8gZmFsc2UgbWVhbnMgbmVlZCBtb3JlIGRhdGEKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOiAgLy8gU2V0Q29sb3VyTWFwRW50cmllcwotICAgICAgICBVdGlsLkRlYnVnKCJTZXRDb2xvdXJNYXBFbnRyaWVzIik7Ci0gICAgICAgIHdzLnJRc2hpZnQ4KCk7ICAvLyBQYWRkaW5nCi0gICAgICAgIGZpcnN0X2NvbG91ciA9IHdzLnJRc2hpZnQxNigpOyAvLyBGaXJzdCBjb2xvdXIKLSAgICAgICAgbnVtX2NvbG91cnMgPSB3cy5yUXNoaWZ0MTYoKTsKLSAgICAgICAgaWYgKHdzLnJRd2FpdCgiU2V0Q29sb3VyTWFwRW50cmllcyIsIG51bV9jb2xvdXJzKjYsIDYpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAKLSAgICAgICAgZm9yIChjPTA7IGMgPCBudW1fY29sb3VyczsgYys9MSkgeyAKLSAgICAgICAgICAgIHJlZCA9IHdzLnJRc2hpZnQxNigpOwotICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJyZWQgYmVmb3JlOiAiICsgcmVkKTsKLSAgICAgICAgICAgIHJlZCA9IHBhcnNlSW50KHJlZCAvIDI1NiwgMTApOwotICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJyZWQgYWZ0ZXI6ICIgKyByZWQpOwotICAgICAgICAgICAgZ3JlZW4gPSBwYXJzZUludCh3cy5yUXNoaWZ0MTYoKSAvIDI1NiwgMTApOwotICAgICAgICAgICAgYmx1ZSA9IHBhcnNlSW50KHdzLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7Ci0gICAgICAgICAgICBkaXNwbGF5LnNldF9jb2xvdXJNYXAoW2JsdWUsIGdyZWVuLCByZWRdLCBmaXJzdF9jb2xvdXIgKyBjKTsKLSAgICAgICAgfQotICAgICAgICBVdGlsLkRlYnVnKCJjb2xvdXJNYXA6ICIgKyBkaXNwbGF5LmdldF9jb2xvdXJNYXAoKSk7Ci0gICAgICAgIFV0aWwuSW5mbygiUmVnaXN0ZXJlZCAiICsgbnVtX2NvbG91cnMgKyAiIGNvbG91ck1hcCBlbnRyaWVzIik7Ci0gICAgICAgIC8vVXRpbC5EZWJ1ZygiY29sb3VyTWFwOiAiICsgZGlzcGxheS5nZXRfY29sb3VyTWFwKCkpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6ICAvLyBCZWxsCi0gICAgICAgIFV0aWwuRGVidWcoIkJlbGwiKTsKLSAgICAgICAgY29uZi5vbkJlbGwodGhhdCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzogIC8vIFNlcnZlckN1dFRleHQKLSAgICAgICAgVXRpbC5EZWJ1ZygiU2VydmVyQ3V0VGV4dCIpOwotICAgICAgICBpZiAod3MuclF3YWl0KCJTZXJ2ZXJDdXRUZXh0IGhlYWRlciIsIDcsIDEpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICB3cy5yUXNoaWZ0Qnl0ZXMoMyk7ICAvLyBQYWRkaW5nCi0gICAgICAgIGxlbmd0aCA9IHdzLnJRc2hpZnQzMigpOwotICAgICAgICBpZiAod3MuclF3YWl0KCJTZXJ2ZXJDdXRUZXh0IiwgbGVuZ3RoLCA4KSkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgICB0ZXh0ID0gd3MuclFzaGlmdFN0cihsZW5ndGgpOwotICAgICAgICBjb25mLmNsaXBib2FyZFJlY2VpdmUodGhhdCwgdGV4dCk7IC8vIE9ic29sZXRlCi0gICAgICAgIGNvbmYub25DbGlwYm9hcmQodGhhdCwgdGV4dCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZhaWwoIkRpc2Nvbm5lY3RlZDogaWxsZWdhbCBzZXJ2ZXIgbWVzc2FnZSB0eXBlICIgKyBtc2dfdHlwZSk7Ci0gICAgICAgIFV0aWwuRGVidWcoIndzLnJRc2xpY2UoMCwzMCk6IiArIHdzLnJRc2xpY2UoMCwzMCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLy9VdGlsLkRlYnVnKCI8PCBub3JtYWxfbXNnIik7Ci0gICAgcmV0dXJuIHJldDsKLX07Ci0KLWZyYW1lYnVmZmVyVXBkYXRlID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5vdywgaGRyLCBmYnVfcnRfZGlmZiwgcmV0ID0gdHJ1ZTsKLQotICAgIGlmIChGQlUucmVjdHMgPT09IDApIHsKLSAgICAgICAgLy9VdGlsLkRlYnVnKCJOZXcgRkJVOiB3cy5yUXNsaWNlKDAsMjApOiAiICsgd3MuclFzbGljZSgwLDIwKSk7Ci0gICAgICAgIGlmICh3cy5yUXdhaXQoIkZCVSBoZWFkZXIiLCAzKSkgewotICAgICAgICAgICAgd3MuclF1bnNoaWZ0OCgwKTsgIC8vIEZCVSBtc2dfdHlwZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHdzLnJRc2hpZnQ4KCk7ICAvLyBwYWRkaW5nCi0gICAgICAgIEZCVS5yZWN0cyA9IHdzLnJRc2hpZnQxNigpOwotICAgICAgICAvL1V0aWwuRGVidWcoIkZyYW1lYnVmZmVyVXBkYXRlLCByZWN0czoiICsgRkJVLnJlY3RzKTsKLSAgICAgICAgRkJVLmJ5dGVzID0gMDsKLSAgICAgICAgdGltaW5nLmN1cl9mYnUgPSAwOwotICAgICAgICBpZiAodGltaW5nLmZidV9ydF9zdGFydCA+IDApIHsKLSAgICAgICAgICAgIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBVdGlsLkluZm8oIkZpcnN0IEZCVSBsYXRlbmN5OiAiICsgKG5vdyAtIHRpbWluZy5mYnVfcnRfc3RhcnQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChGQlUucmVjdHMgPiAwKSB7Ci0gICAgICAgIGlmIChyZmJfc3RhdGUgIT09ICJub3JtYWwiKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdzLnJRd2FpdCgiRkJVIiwgRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgaWYgKEZCVS5ieXRlcyA9PT0gMCkgewotICAgICAgICAgICAgaWYgKHdzLnJRd2FpdCgicmVjdCBoZWFkZXIiLCAxMikpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgICAgICAvKiBOZXcgRnJhbWVidWZmZXJVcGRhdGUgKi8KLQotICAgICAgICAgICAgaGRyID0gd3MuclFzaGlmdEJ5dGVzKDEyKTsKLSAgICAgICAgICAgIEZCVS54ICAgICAgPSAoaGRyWzBdIDw8IDgpICsgaGRyWzFdOwotICAgICAgICAgICAgRkJVLnkgICAgICA9IChoZHJbMl0gPDwgOCkgKyBoZHJbM107Ci0gICAgICAgICAgICBGQlUud2lkdGggID0gKGhkcls0XSA8PCA4KSArIGhkcls1XTsKLSAgICAgICAgICAgIEZCVS5oZWlnaHQgPSAoaGRyWzZdIDw8IDgpICsgaGRyWzddOwotICAgICAgICAgICAgRkJVLmVuY29kaW5nID0gcGFyc2VJbnQoKGhkcls4XSA8PCAyNCkgKyAoaGRyWzldIDw8IDE2KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGRyWzEwXSA8PCA4KSArICBoZHJbMTFdLCAxMCk7Ci0KLSAgICAgICAgICAgIGNvbmYub25GQlVSZWNlaXZlKHRoYXQsCi0gICAgICAgICAgICAgICAgICAgIHsneCc6IEZCVS54LCAneSc6IEZCVS55LAotICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogRkJVLndpZHRoLCAnaGVpZ2h0JzogRkJVLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZyc6IEZCVS5lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZ05hbWUnOiBlbmNOYW1lc1tGQlUuZW5jb2RpbmddfSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmNOYW1lc1tGQlUuZW5jb2RpbmddKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVidWc6Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICB2YXIgbXNnID0gICJGcmFtZWJ1ZmZlclVwZGF0ZSByZWN0czoiICsgRkJVLnJlY3RzOwotICAgICAgICAgICAgICAgIG1zZyArPSAiIHg6ICIgKyBGQlUueCArICIgeTogIiArIEZCVS55OwotICAgICAgICAgICAgICAgIG1zZyArPSAiIHdpZHRoOiAiICsgRkJVLndpZHRoICsgIiBoZWlnaHQ6ICIgKyBGQlUuaGVpZ2h0OwotICAgICAgICAgICAgICAgIG1zZyArPSAiIGVuY29kaW5nOiIgKyBGQlUuZW5jb2Rpbmc7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIoIiArIGVuY05hbWVzW0ZCVS5lbmNvZGluZ10gKyAiKSI7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIsIHdzLnJRbGVuKCk6ICIgKyB3cy5yUWxlbigpOwotICAgICAgICAgICAgICAgIFV0aWwuRGVidWcobXNnKTsKLSAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9zdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3QnKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcsICdWTkMgZGlzY29ubmVjdGVkJyArIG1zZyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3JmYl9zdGF0ZSA9PT0gJ1Byb3RvY29sVmVyc2lvbicpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKCdGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2ZXInICsgbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcmZiX3N0YXRlIGluIHsnZmFpbGVkJzogMSwgJ2Rpc2Nvbm5lY3RlZCc6IDF9KSB7CisgICAgICAgICAgICAgICAgVXRpbC5FcnJvcigiUmVjZWl2ZWQgb25jbG9zZSB3aGlsZSBkaXNjb25uZWN0ZWQiICsgbXNnKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRGlzY29ubmVjdGVkOiB1bnN1cHBvcnRlZCBlbmNvZGluZyAiICsKLSAgICAgICAgICAgICAgICAgICAgRkJVLmVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgiU2VydmVyIGRpc2Nvbm5lY3RlZCIgKyBtc2cpOwogICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIH0uYmluZCh0aGlzKSk7CisgICAgICAgIHRoaXMuX3NvY2sub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIFV0aWwuV2FybigiV2ViU29ja2V0IG9uLWVycm9yIGV2ZW50Iik7CisgICAgICAgIH0pOwogCi0gICAgICAgIHRpbWluZy5sYXN0X2ZidSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisgICAgICAgIHRoaXMuX2luaXRfdmFycygpOwogCi0gICAgICAgIHJldCA9IGVuY0hhbmRsZXJzW0ZCVS5lbmNvZGluZ10oKTsKLQotICAgICAgICBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotICAgICAgICB0aW1pbmcuY3VyX2ZidSArPSAobm93IC0gdGltaW5nLmxhc3RfZmJ1KTsKLQotICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICBlbmNTdGF0c1tGQlUuZW5jb2RpbmddWzBdICs9IDE7Ci0gICAgICAgICAgICBlbmNTdGF0c1tGQlUuZW5jb2RpbmddWzFdICs9IDE7Ci0gICAgICAgICAgICB0aW1pbmcucGl4ZWxzICs9IEZCVS53aWR0aCAqIEZCVS5oZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRkJVLnJlY3RzID09PSAwIHx8ICh0aW1pbmcucGl4ZWxzID49IChmYl93aWR0aCAqIGZiX2hlaWdodCkpKSB7Ci0gICAgICAgICAgICBpZiAoKChGQlUud2lkdGggPT09IGZiX3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKEZCVS5oZWlnaHQgPT09IGZiX2hlaWdodCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh0aW1pbmcuZmJ1X3J0X3N0YXJ0ID4gMCkpIHsKLSAgICAgICAgICAgICAgICB0aW1pbmcuZnVsbF9mYnVfdG90YWwgKz0gdGltaW5nLmN1cl9mYnU7Ci0gICAgICAgICAgICAgICAgdGltaW5nLmZ1bGxfZmJ1X2NudCArPSAxOwotICAgICAgICAgICAgICAgIFV0aWwuSW5mbygiVGltaW5nIG9mIGZ1bGwgRkJVLCBjdXI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcuY3VyX2ZidSArICIsIHRvdGFsOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLmZ1bGxfZmJ1X3RvdGFsICsgIiwgY250OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLmZ1bGxfZmJ1X2NudCArICIsIGF2ZzogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1pbmcuZnVsbF9mYnVfdG90YWwgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLmZ1bGxfZmJ1X2NudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRpbWluZy5mYnVfcnRfc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmJ1X3J0X2RpZmYgPSBub3cgLSB0aW1pbmcuZmJ1X3J0X3N0YXJ0OwotICAgICAgICAgICAgICAgIHRpbWluZy5mYnVfcnRfdG90YWwgKz0gZmJ1X3J0X2RpZmY7Ci0gICAgICAgICAgICAgICAgdGltaW5nLmZidV9ydF9jbnQgKz0gMTsKLSAgICAgICAgICAgICAgICBVdGlsLkluZm8oImZ1bGwgRkJVIHJvdW5kLXRyaXAsIGN1cjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZidV9ydF9kaWZmICsgIiwgdG90YWw6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcuZmJ1X3J0X3RvdGFsICsgIiwgY250OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLmZidV9ydF9jbnQgKyAiLCBhdmc6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAodGltaW5nLmZidV9ydF90b3RhbCAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcuZmJ1X3J0X2NudCkpOwotICAgICAgICAgICAgICAgIHRpbWluZy5mYnVfcnRfc3RhcnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghIHJldCkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsgLy8gZmFsc2UgcmV0IG1lYW5zIG5lZWQgbW9yZSBkYXRhCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25mLm9uRkJVQ29tcGxldGUodGhhdCwKLSAgICAgICAgICAgIHsneCc6IEZCVS54LCAneSc6IEZCVS55LAotICAgICAgICAgICAgICAgICd3aWR0aCc6IEZCVS53aWR0aCwgJ2hlaWdodCc6IEZCVS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgJ2VuY29kaW5nJzogRkJVLmVuY29kaW5nLAotICAgICAgICAgICAgICAgICdlbmNvZGluZ05hbWUnOiBlbmNOYW1lc1tGQlUuZW5jb2RpbmddfSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgZmluaXNoZWQgdGhpcyBGQlUKLX07Ci0KLS8vCi0vLyBGcmFtZWJ1ZmZlclVwZGF0ZSBlbmNvZGluZ3MKLS8vCi0KLWVuY0hhbmRsZXJzLlJBVyA9IGZ1bmN0aW9uIGRpc3BsYXlfcmF3KCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGlzcGxheV9yYXcgKCIgKyB3cy5yUWxlbigpICsgIiBieXRlcykiKTsKLQotICAgIHZhciBjdXJfeSwgY3VyX2hlaWdodDsKLQotICAgIGlmIChGQlUubGluZXMgPT09IDApIHsKLSAgICAgICAgRkJVLmxpbmVzID0gRkJVLmhlaWdodDsKLSAgICB9Ci0gICAgRkJVLmJ5dGVzID0gRkJVLndpZHRoICogZmJfQnBwOyAvLyBBdCBsZWFzdCBhIGxpbmUKLSAgICBpZiAod3MuclF3YWl0KCJSQVciLCBGQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQotICAgIGN1cl95ID0gRkJVLnkgKyAoRkJVLmhlaWdodCAtIEZCVS5saW5lcyk7Ci0gICAgY3VyX2hlaWdodCA9IE1hdGgubWluKEZCVS5saW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih3cy5yUWxlbigpLyhGQlUud2lkdGggKiBmYl9CcHApKSk7Ci0gICAgZGlzcGxheS5ibGl0SW1hZ2UoRkJVLngsIGN1cl95LCBGQlUud2lkdGgsIGN1cl9oZWlnaHQsCi0gICAgICAgICAgICB3cy5nZXRfclEoKSwgd3MuZ2V0X3JRaSgpKTsKLSAgICB3cy5yUXNoaWZ0Qnl0ZXMoRkJVLndpZHRoICogY3VyX2hlaWdodCAqIGZiX0JwcCk7Ci0gICAgRkJVLmxpbmVzIC09IGN1cl9oZWlnaHQ7Ci0KLSAgICBpZiAoRkJVLmxpbmVzID4gMCkgewotICAgICAgICBGQlUuYnl0ZXMgPSBGQlUud2lkdGggKiBmYl9CcHA7IC8vIEF0IGxlYXN0IGFub3RoZXIgbGluZQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZCVS5yZWN0cyAtPSAxOwotICAgICAgICBGQlUuYnl0ZXMgPSAwOwotICAgIH0KLSAgICAvL1V0aWwuRGVidWcoIjw8IGRpc3BsYXlfcmF3ICgiICsgd3MuclFsZW4oKSArICIgYnl0ZXMpIik7Ci0gICAgcmV0dXJuIHRydWU7Ci19OwotCi1lbmNIYW5kbGVycy5DT1BZUkVDVCA9IGZ1bmN0aW9uIGRpc3BsYXlfY29weV9yZWN0KCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGlzcGxheV9jb3B5X3JlY3QiKTsKLQotICAgIHZhciBvbGRfeCwgb2xkX3k7Ci0KLSAgICBpZiAod3MuclF3YWl0KCJDT1BZUkVDVCIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQotICAgIG9sZF94ID0gd3MuclFzaGlmdDE2KCk7Ci0gICAgb2xkX3kgPSB3cy5yUXNoaWZ0MTYoKTsKLSAgICBkaXNwbGF5LmNvcHlJbWFnZShvbGRfeCwgb2xkX3ksIEZCVS54LCBGQlUueSwgRkJVLndpZHRoLCBGQlUuaGVpZ2h0KTsKLSAgICBGQlUucmVjdHMgLT0gMTsKLSAgICBGQlUuYnl0ZXMgPSAwOwotICAgIHJldHVybiB0cnVlOwotfTsKLQotZW5jSGFuZGxlcnMuUlJFID0gZnVuY3Rpb24gZGlzcGxheV9ycmUoKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBkaXNwbGF5X3JyZSAoIiArIHdzLnJRbGVuKCkgKyAiIGJ5dGVzKSIpOwotICAgIHZhciBjb2xvciwgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2h1bms7Ci0KLSAgICBpZiAoRkJVLnN1YnJlY3RzID09PSAwKSB7Ci0gICAgICAgIGlmICh3cy5yUXdhaXQoIlJSRSIsIDQrZmJfQnBwKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgRkJVLnN1YnJlY3RzID0gd3MuclFzaGlmdDMyKCk7Ci0gICAgICAgIGNvbG9yID0gd3MuclFzaGlmdEJ5dGVzKGZiX0JwcCk7IC8vIEJhY2tncm91bmQKLSAgICAgICAgZGlzcGxheS5maWxsUmVjdChGQlUueCwgRkJVLnksIEZCVS53aWR0aCwgRkJVLmhlaWdodCwgY29sb3IpOwotICAgIH0KLSAgICB3aGlsZSAoKEZCVS5zdWJyZWN0cyA+IDApICYmICh3cy5yUWxlbigpID49IChmYl9CcHAgKyA4KSkpIHsKLSAgICAgICAgY29sb3IgPSB3cy5yUXNoaWZ0Qnl0ZXMoZmJfQnBwKTsKLSAgICAgICAgeCA9IHdzLnJRc2hpZnQxNigpOwotICAgICAgICB5ID0gd3MuclFzaGlmdDE2KCk7Ci0gICAgICAgIHdpZHRoID0gd3MuclFzaGlmdDE2KCk7Ci0gICAgICAgIGhlaWdodCA9IHdzLnJRc2hpZnQxNigpOwotICAgICAgICBkaXNwbGF5LmZpbGxSZWN0KEZCVS54ICsgeCwgRkJVLnkgKyB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcik7Ci0gICAgICAgIEZCVS5zdWJyZWN0cyAtPSAxOwotICAgIH0KLSAgICAvL1V0aWwuRGVidWcoIiAgIGRpc3BsYXlfcnJlOiByZWN0czogIiArIEZCVS5yZWN0cyArCi0gICAgLy8gICAgICAgICAgICIsIEZCVS5zdWJyZWN0czogIiArIEZCVS5zdWJyZWN0cyk7Ci0KLSAgICBpZiAoRkJVLnN1YnJlY3RzID4gMCkgewotICAgICAgICBjaHVuayA9IE1hdGgubWluKHJyZV9jaHVua19zeiwgRkJVLnN1YnJlY3RzKTsKLSAgICAgICAgRkJVLmJ5dGVzID0gKGZiX0JwcCArIDgpICogY2h1bms7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRkJVLnJlY3RzIC09IDE7Ci0gICAgICAgIEZCVS5ieXRlcyA9IDA7Ci0gICAgfQotICAgIC8vVXRpbC5EZWJ1ZygiPDwgZGlzcGxheV9ycmUsIEZCVS5ieXRlczogIiArIEZCVS5ieXRlcyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19OwotCi1lbmNIYW5kbGVycy5IRVhUSUxFID0gZnVuY3Rpb24gZGlzcGxheV9oZXh0aWxlKCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGlzcGxheV9oZXh0aWxlIik7Ci0gICAgdmFyIHN1YmVuY29kaW5nLCBzdWJyZWN0cywgY29sb3IsIGN1cl90aWxlLAotICAgICAgICB0aWxlX3gsIHgsIHcsIHRpbGVfeSwgeSwgaCwgeHksIHMsIHN4LCBzeSwgd2gsIHN3LCBzaCwKLSAgICAgICAgclEgPSB3cy5nZXRfclEoKSwgclFpID0gd3MuZ2V0X3JRaSgpOyAKLQotICAgIGlmIChGQlUudGlsZXMgPT09IDApIHsKLSAgICAgICAgRkJVLnRpbGVzX3ggPSBNYXRoLmNlaWwoRkJVLndpZHRoLzE2KTsKLSAgICAgICAgRkJVLnRpbGVzX3kgPSBNYXRoLmNlaWwoRkJVLmhlaWdodC8xNik7Ci0gICAgICAgIEZCVS50b3RhbF90aWxlcyA9IEZCVS50aWxlc194ICogRkJVLnRpbGVzX3k7Ci0gICAgICAgIEZCVS50aWxlcyA9IEZCVS50b3RhbF90aWxlczsKLSAgICB9Ci0KLSAgICAvKiBGQlUuYnl0ZXMgY29tZXMgaW4gYXMgMSwgd3MuclFsZW4oKSBhdCBsZWFzdCAxICovCi0gICAgd2hpbGUgKEZCVS50aWxlcyA+IDApIHsKLSAgICAgICAgRkJVLmJ5dGVzID0gMTsKLSAgICAgICAgaWYgKHdzLnJRd2FpdCgiSEVYVElMRSBzdWJlbmNvZGluZyIsIEZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIHN1YmVuY29kaW5nID0gclFbclFpXTsgIC8vIFBlZWsKLSAgICAgICAgaWYgKHN1YmVuY29kaW5nID4gMzApIHsgLy8gUmF3Ci0gICAgICAgICAgICBmYWlsKCJEaXNjb25uZWN0ZWQ6IGlsbGVnYWwgaGV4dGlsZSBzdWJlbmNvZGluZyAiICsgc3ViZW5jb2RpbmcpOwotICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJ3cy5yUXNsaWNlKDAsMzApOiIgKyB3cy5yUXNsaWNlKDAsMzApKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdWJyZWN0cyA9IDA7Ci0gICAgICAgIGN1cl90aWxlID0gRkJVLnRvdGFsX3RpbGVzIC0gRkJVLnRpbGVzOwotICAgICAgICB0aWxlX3ggPSBjdXJfdGlsZSAlIEZCVS50aWxlc194OwotICAgICAgICB0aWxlX3kgPSBNYXRoLmZsb29yKGN1cl90aWxlIC8gRkJVLnRpbGVzX3gpOwotICAgICAgICB4ID0gRkJVLnggKyB0aWxlX3ggKiAxNjsKLSAgICAgICAgeSA9IEZCVS55ICsgdGlsZV95ICogMTY7Ci0gICAgICAgIHcgPSBNYXRoLm1pbigxNiwgKEZCVS54ICsgRkJVLndpZHRoKSAtIHgpOwotICAgICAgICBoID0gTWF0aC5taW4oMTYsIChGQlUueSArIEZCVS5oZWlnaHQpIC0geSk7Ci0KLSAgICAgICAgLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBhcmUgZXhwZWN0aW5nICovCi0gICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDEpIHsgLy8gUmF3Ci0gICAgICAgICAgICAvL1V0aWwuRGVidWcoIiAgIFJhdyBzdWJlbmNvZGluZyIpOwotICAgICAgICAgICAgRkJVLmJ5dGVzICs9IHcgKiBoICogZmJfQnBwOworICAgICAgICB2YXIgcm1vZGUgPSB0aGlzLl9kaXNwbGF5LmdldF9yZW5kZXJfbW9kZSgpOworICAgICAgICBpZiAoV2Vic29ja19uYXRpdmUpIHsKKyAgICAgICAgICAgIFV0aWwuSW5mbygiVXNpbmcgbmF0aXZlIFdlYlNvY2tldHMiKTsKKyAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdsb2FkZWQnLCAnbm9WTkMgcmVhZHk6IG5hdGl2ZSBXZWJTb2NrZXRzLCAnICsgcm1vZGUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nICYgMHgwMikgeyAvLyBCYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgRkJVLmJ5dGVzICs9IGZiX0JwcDsKKyAgICAgICAgICAgIFV0aWwuV2FybigiVXNpbmcgd2ViLXNvY2tldC1qcyBicmlkZ2UuICBGbGFzaCB2ZXJzaW9uOiAiICsgVXRpbC5GbGFzaC52ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmICghVXRpbC5GbGFzaCB8fCBVdGlsLkZsYXNoLnZlcnNpb24gPCA5KSB7CisgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ2ZhdGFsJywgIldlYlNvY2tldHMgb3IgPGEgaHJlZj0naHR0cDovL2dldC5hZG9iZS5jb20vZmxhc2hwbGF5ZXInPkFkb2JlIEZsYXNoPC9hPiBpcyByZXF1aXJlZCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnN1YnN0cigwLCA3KSA9PT0gJ2ZpbGU6Ly8nKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ2ZhdGFsJywgIidmaWxlOi8vJyBVUkwgaXMgaW5jb21wYXRpYmxlIHdpdGggQWRvYmUgRmxhc2giKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ2xvYWRlZCcsICdub1ZOQyByZWFkeTogV2ViU29ja2V0cyBlbXVsYXRpb24sICcgKyBybW9kZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDA0KSB7IC8vIEZvcmVncm91bmQKLSAgICAgICAgICAgICAgICBGQlUuYnl0ZXMgKz0gZmJfQnBwOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5EZWJ1ZygiPDwgUkZCLmNvbnN0cnVjdG9yIik7CisgICAgfTsKKworICAgIFJGQi5wcm90b3R5cGUgPSB7CisgICAgICAgIC8vIFB1YmxpYyBtZXRob2RzCisgICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChob3N0LCBwb3J0LCBwYXNzd29yZCwgcGF0aCkgeworICAgICAgICAgICAgdGhpcy5fcmZiX2hvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5fcmZiX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5fcmZiX3Bhc3N3b3JkID0gKHBhc3N3b3JkICE9PSB1bmRlZmluZWQpID8gcGFzc3dvcmQgOiAiIjsKKyAgICAgICAgICAgIHRoaXMuX3JmYl9wYXRoID0gKHBhdGggIT09IHVuZGVmaW5lZCkgPyBwYXRoIDogIiI7CisKKyAgICAgICAgICAgIGlmICghdGhpcy5fcmZiX2hvc3QgfHwgIXRoaXMuX3JmYl9wb3J0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoIk11c3Qgc2V0IGhvc3QgYW5kIHBvcnQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDgpIHsgLy8gQW55U3VicmVjdHMKLSAgICAgICAgICAgICAgICBGQlUuYnl0ZXMgKz0gMTsgICAvLyBTaW5jZSB3ZSBhcmVuJ3Qgc2hpZnRpbmcgaXQgb2ZmCi0gICAgICAgICAgICAgICAgaWYgKHdzLnJRd2FpdCgiaGV4dGlsZSBzdWJyZWN0cyBoZWFkZXIiLCBGQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgICAgIHN1YnJlY3RzID0gclFbclFpICsgRkJVLmJ5dGVzLTFdOyAvLyBQZWVrCi0gICAgICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nICYgMHgxMCkgeyAvLyBTdWJyZWN0c0NvbG91cmVkCi0gICAgICAgICAgICAgICAgICAgIEZCVS5ieXRlcyArPSBzdWJyZWN0cyAqIChmYl9CcHAgKyAyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBGQlUuYnl0ZXMgKz0gc3VicmVjdHMgKiAyOworCisgICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSgnY29ubmVjdCcpOworICAgICAgICB9LAorCisgICAgICAgIGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdkaXNjb25uZWN0JywgJ0Rpc2Nvbm5lY3RpbmcnKTsKKyAgICAgICAgfSwKKworICAgICAgICBzZW5kUGFzc3dvcmQ6IGZ1bmN0aW9uIChwYXNzd2QpIHsKKyAgICAgICAgICAgIHRoaXMuX3JmYl9wYXNzd29yZCA9IHBhc3N3ZDsKKyAgICAgICAgICAgIHRoaXMuX3JmYl9zdGF0ZSA9ICdBdXRoZW50aWNhdGlvbic7CisgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuX2luaXRfbXNnLmJpbmQodGhpcyksIDEpOworICAgICAgICB9LAorCisgICAgICAgIHNlbmRDdHJsQWx0RGVsOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3N0YXRlICE9PSAnbm9ybWFsJyB8fCB0aGlzLl92aWV3X29ubHkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBVdGlsLkluZm8oIlNlbmRpbmcgQ3RybC1BbHQtRGVsIik7CisKKyAgICAgICAgICAgIHZhciBhcnIgPSBbXTsKKyAgICAgICAgICAgIGFyciA9IGFyci5jb25jYXQoUkZCLm1lc3NhZ2VzLmtleUV2ZW50KDB4RkZFMywgMSkpOyAvLyBDb250cm9sCisgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudCgweEZGRTksIDEpKTsgLy8gQWx0CisgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudCgweEZGRkYsIDEpKTsgLy8gRGVsZXRlCisgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudCgweEZGRkYsIDApKTsgLy8gRGVsZXRlCisgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudCgweEZGRTksIDApKTsgLy8gQWx0CisgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudCgweEZGRTMsIDApKTsgLy8gQ29udHJvbAorICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKGFycik7CisgICAgICAgIH0sCisKKyAgICAgICAgeHZwT3A6IGZ1bmN0aW9uICh2ZXIsIG9wKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3h2cF92ZXIgPCB2ZXIpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBVdGlsLkluZm8oIlNlbmRpbmcgWFZQIG9wZXJhdGlvbiAiICsgb3AgKyAiICh2ZXJzaW9uICIgKyB2ZXIgKyAiKSIpOworICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZygiXHhGQVx4MDAiICsgU3RyaW5nLmZyb21DaGFyQ29kZSh2ZXIpICsgU3RyaW5nLmZyb21DaGFyQ29kZShvcCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgeHZwU2h1dGRvd246IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnh2cE9wKDEsIDIpOworICAgICAgICB9LAorCisgICAgICAgIHh2cFJlYm9vdDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMueHZwT3AoMSwgMyk7CisgICAgICAgIH0sCisKKyAgICAgICAgeHZwUmVzZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnh2cE9wKDEsIDQpOworICAgICAgICB9LAorCisgICAgICAgIC8vIFNlbmQgYSBrZXkgcHJlc3MuIElmICdkb3duJyBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gc2VuZCBhIGRvd24ga2V5CisgICAgICAgIC8vIGZvbGxvd2VkIGJ5IGFuIHVwIGtleS4KKyAgICAgICAgc2VuZEtleTogZnVuY3Rpb24gKGNvZGUsIGRvd24pIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfc3RhdGUgIT09ICJub3JtYWwiIHx8IHRoaXMuX3ZpZXdfb25seSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZhciBhcnIgPSBbXTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YgZG93biAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICBVdGlsLkluZm8oIlNlbmRpbmcga2V5IGNvZGUgKCIgKyAoZG93biA/ICJkb3duIiA6ICJ1cCIpICsgIik6ICIgKyBjb2RlKTsKKyAgICAgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5rZXlFdmVudChjb2RlLCBkb3duID8gMSA6IDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCJTZW5kaW5nIGtleSBjb2RlIChkb3duICsgdXApOiAiICsgY29kZSk7CisgICAgICAgICAgICAgICAgYXJyID0gYXJyLmNvbmNhdChSRkIubWVzc2FnZXMua2V5RXZlbnQoY29kZSwgMSkpOworICAgICAgICAgICAgICAgIGFyciA9IGFyci5jb25jYXQoUkZCLm1lc3NhZ2VzLmtleUV2ZW50KGNvZGUsIDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChhcnIpOworICAgICAgICB9LAorCisgICAgICAgIGNsaXBib2FyZFBhc3RlRnJvbTogZnVuY3Rpb24gKHRleHQpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfc3RhdGUgIT09ICdub3JtYWwnKSB7IHJldHVybjsgfQorICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKFJGQi5tZXNzYWdlcy5jbGllbnRDdXRUZXh0KHRleHQpKTsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBQcml2YXRlIG1ldGhvZHMKKworICAgICAgICBfY29ubmVjdDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPj4gUkZCLmNvbm5lY3QiKTsKKworICAgICAgICAgICAgdmFyIHVyaTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YgVXNpbmdTb2NrZXRJTyAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cCc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVyaSA9IHRoaXMuX2VuY3J5cHQgPyAnd3NzJyA6ICd3cyc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVyaSArPSAnOi8vJyArIHRoaXMuX3JmYl9ob3N0ICsgJzonICsgdGhpcy5fcmZiX3BvcnQgKyAnLycgKyB0aGlzLl9yZmJfcGF0aDsKKyAgICAgICAgICAgIFV0aWwuSW5mbygiY29ubmVjdGluZyB0byAiICsgdXJpKTsKKworICAgICAgICAgICAgdGhpcy5fc29jay5vcGVuKHVyaSwgdGhpcy5fd3NQcm90b2NvbHMpOworCisgICAgICAgICAgICBVdGlsLkRlYnVnKCI8PCBSRkIuY29ubmVjdCIpOworICAgICAgICB9LAorCisgICAgICAgIF9pbml0X3ZhcnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCisgICAgICAgICAgICB0aGlzLl9zb2NrLmluaXQoKTsKKworICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzICAgICAgICA9IDA7CisgICAgICAgICAgICB0aGlzLl9GQlUuc3VicmVjdHMgICAgID0gMDsgIC8vIFJSRSBhbmQgSEVYVElMRQorICAgICAgICAgICAgdGhpcy5fRkJVLmxpbmVzICAgICAgICA9IDA7ICAvLyBSQVcKKyAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlcyAgICAgICAgPSAwOyAgLy8gSEVYVElMRQorICAgICAgICAgICAgdGhpcy5fRkJVLnpsaWJzICAgICAgICA9IFtdOyAvLyBUSUdIVCB6bGliIGVuY29kZXJzCisgICAgICAgICAgICB0aGlzLl9tb3VzZV9idXR0b25NYXNrID0gMDsKKyAgICAgICAgICAgIHRoaXMuX21vdXNlX2FyciAgICAgICAgPSBbXTsKKyAgICAgICAgICAgIHRoaXMuX3JmYl90aWdodHZuYyAgICAgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHBlciBjb25uZWN0aW9uIGVuY29kaW5nIHN0YXRzCisgICAgICAgICAgICB2YXIgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9lbmNTdGF0c1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dWzBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS56bGlic1tpXSA9IG5ldyBUSU5GKCk7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnpsaWJzW2ldLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfcHJpbnRfc3RhdHM6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIFV0aWwuSW5mbygiRW5jb2Rpbmcgc3RhdHMgZm9yIHRoaXMgY29ubmVjdGlvbjoiKTsKKyAgICAgICAgICAgIHZhciBpLCBzOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2VuY29kaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHMgPSB0aGlzLl9lbmNTdGF0c1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dOworICAgICAgICAgICAgICAgIGlmIChzWzBdICsgc1sxXSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCIgICAgIiArIHRoaXMuX2VuY29kaW5nc1tpXVswXSArICI6ICIgKyBzWzBdICsgIiByZWN0cyIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCisgICAgICAgICAgICBVdGlsLkluZm8oIkVuY29kaW5nIHN0YXRzIHNpbmNlIHBhZ2UgbG9hZDoiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzID0gdGhpcy5fZW5jU3RhdHNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXTsKKyAgICAgICAgICAgICAgICBVdGlsLkluZm8oIiAgICAiICsgdGhpcy5fZW5jb2RpbmdzW2ldWzBdICsgIjogIiArIHNbMV0gKyAiIHJlY3RzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKIAogICAgICAgICAvKgotICAgICAgICBVdGlsLkRlYnVnKCIgICB0aWxlOiIgKyBjdXJfdGlsZSArICIvIiArIChGQlUudG90YWxfdGlsZXMgLSAxKSArCi0gICAgICAgICAgICAgICIgKCIgKyB0aWxlX3ggKyAiLCIgKyB0aWxlX3kgKyAiKSIgKwotICAgICAgICAgICAgICAiIFsiICsgeCArICIsIiArIHkgKyAiXUAiICsgdyArICJ4IiArIGggKwotICAgICAgICAgICAgICAiLCBzdWJlbmM6IiArIHN1YmVuY29kaW5nICsKLSAgICAgICAgICAgICAgIihsYXN0OiAiICsgRkJVLmxhc3RzdWJlbmNvZGluZyArICIpLCBzdWJyZWN0czoiICsKLSAgICAgICAgICAgICAgc3VicmVjdHMgKwotICAgICAgICAgICAgICAiLCB3cy5yUWxlbigpOiIgKyB3cy5yUWxlbigpICsgIiwgRkJVLmJ5dGVzOiIgKyBGQlUuYnl0ZXMgKwotICAgICAgICAgICAgICAiIGxhc3Q6IiArIHdzLnJRc2xpY2UoRkJVLmJ5dGVzLTEwLCBGQlUuYnl0ZXMpICsKLSAgICAgICAgICAgICAgIiBuZXh0OiIgKyB3cy5yUXNsaWNlKEZCVS5ieXRlcy0xLCBGQlUuYnl0ZXMrMTApKTsKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHdzLnJRd2FpdCgiaGV4dGlsZSIsIEZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAqIFBhZ2Ugc3RhdGVzOgorICAgICAgICAgKiAgIGxvYWRlZCAgICAgICAtIHBhZ2UgbG9hZCwgZXF1aXZhbGVudCB0byBkaXNjb25uZWN0ZWQKKyAgICAgICAgICogICBkaXNjb25uZWN0ZWQgLSBpZGxlIHN0YXRlCisgICAgICAgICAqICAgY29ubmVjdCAgICAgIC0gc3RhcnRpbmcgdG8gY29ubmVjdCAodG8gUHJvdG9jb2xWZXJzaW9uKQorICAgICAgICAgKiAgIG5vcm1hbCAgICAgICAtIGNvbm5lY3RlZAorICAgICAgICAgKiAgIGRpc2Nvbm5lY3QgICAtIHN0YXJ0aW5nIHRvIGRpc2Nvbm5lY3QKKyAgICAgICAgICogICBmYWlsZWQgICAgICAgLSBhYm5vcm1hbCBkaXNjb25uZWN0CisgICAgICAgICAqICAgZmF0YWwgICAgICAgIC0gZmFpbGVkIHRvIGxvYWQgcGFnZSwgb3IgZmF0YWwgZXJyb3IKKyAgICAgICAgICoKKyAgICAgICAgICogUkZCIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHN0YXRlczoKKyAgICAgICAgICogICBQcm90b2NvbFZlcnNpb24KKyAgICAgICAgICogICBTZWN1cml0eQorICAgICAgICAgKiAgIEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAqICAgcGFzc3dvcmQgICAgIC0gd2FpdGluZyBmb3IgcGFzc3dvcmQsIG5vdCBwYXJ0IG9mIFJGQgorICAgICAgICAgKiAgIFNlY3VyaXR5UmVzdWx0CisgICAgICAgICAqICAgQ2xpZW50SW5pdGlhbGl6YXRpb24gLSBub3QgdHJpZ2dlcmVkIGJ5IHNlcnZlciBtZXNzYWdlCisgICAgICAgICAqICAgU2VydmVySW5pdGlhbGl6YXRpb24gKHRvIG5vcm1hbCkKKyAgICAgICAgICovCisgICAgICAgIF91cGRhdGVTdGF0ZTogZnVuY3Rpb24gKHN0YXRlLCBzdGF0dXNNc2cpIHsKKyAgICAgICAgICAgIHZhciBvbGRzdGF0ZSA9IHRoaXMuX3JmYl9zdGF0ZTsKIAotICAgICAgICAvKiBXZSBrbm93IHRoZSBlbmNvZGluZyBhbmQgaGF2ZSBhIHdob2xlIHRpbGUgKi8KLSAgICAgICAgRkJVLnN1YmVuY29kaW5nID0gclFbclFpXTsKLSAgICAgICAgclFpICs9IDE7Ci0gICAgICAgIGlmIChGQlUuc3ViZW5jb2RpbmcgPT09IDApIHsKLSAgICAgICAgICAgIGlmIChGQlUubGFzdHN1YmVuY29kaW5nICYgMHgwMSkgewotICAgICAgICAgICAgICAgIC8qIFdlaXJkOiBpZ25vcmUgYmxhbmtzIGFmdGVyIFJBVyAqLwotICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIiAgICAgSWdub3JpbmcgYmxhbmsgYWZ0ZXIgUkFXIik7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT09IG9sZHN0YXRlKSB7CisgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBoZXJlLCBpZ25vcmUKKyAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCJBbHJlYWR5IGluIHN0YXRlICciICsgc3RhdGUgKyAiJywgaWdub3JpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZXNlIGFyZSBkaXNjb25uZWN0ZWQgc3RhdGVzLiBBIHByZXZpb3VzIGNvbm5lY3QgbWF5CisgICAgICAgICAgICAgKiBhc3luY2hyb25vdXNseSBjYXVzZSBhIGNvbm5lY3Rpb24gc28gbWFrZSBzdXJlIHdlIGFyZSBjbG9zZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZSBpbiB7J2Rpc2Nvbm5lY3RlZCc6IDEsICdsb2FkZWQnOiAxLCAnY29ubmVjdCc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNjb25uZWN0JzogMSwgJ2ZhaWxlZCc6IDEsICdmYXRhbCc6IDF9KSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VuZFRpbWVyKSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fc2VuZFRpbWVyKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VuZFRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fbXNnVGltZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9tc2dUaW1lcik7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZ1RpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheSAmJiB0aGlzLl9kaXNwbGF5LmdldF9jb250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmQudW5ncmFiKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlLnVuZ3JhYigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmRlZmF1bHRDdXJzb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFV0aWwuZ2V0X2xvZ2dpbmcoKSAhPT0gJ2RlYnVnJyB8fCBzdGF0ZSA9PT0gJ2xvYWRlZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgbm9WTkMgbG9nbyBvbiBsb2FkIGFuZCB3aGVuIGRpc2Nvbm5lY3RlZCwgdW5sZXNzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvbGRzdGF0ZSA9PT0gJ2ZhdGFsJykgeworICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoJ0ZhdGFsIGVycm9yLCBjYW5ub3QgY29udGludWUnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNtc2cgPSB0eXBlb2Yoc3RhdHVzTXNnKSAhPT0gJ3VuZGVmaW5lZCcgPyAoIiBNc2c6ICIgKyBzdGF0dXNNc2cpIDogIiI7CisgICAgICAgICAgICB2YXIgZnVsbG1zZyA9ICJOZXcgc3RhdGUgJyIgKyBzdGF0ZSArICInLCB3YXMgJyIgKyBvbGRzdGF0ZSArICInLiIgKyBjbXNnOworICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnZmFpbGVkJyB8fCBzdGF0ZSA9PT0gJ2ZhdGFsJykgeworICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoY21zZyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpc3BsYXkuZmlsbFJlY3QoeCwgeSwgdywgaCwgRkJVLmJhY2tncm91bmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKEZCVS5zdWJlbmNvZGluZyAmIDB4MDEpIHsgLy8gUmF3Ci0gICAgICAgICAgICBkaXNwbGF5LmJsaXRJbWFnZSh4LCB5LCB3LCBoLCByUSwgclFpKTsKLSAgICAgICAgICAgIHJRaSArPSBGQlUuYnl0ZXMgLSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKEZCVS5zdWJlbmNvZGluZyAmIDB4MDIpIHsgLy8gQmFja2dyb3VuZAotICAgICAgICAgICAgICAgIEZCVS5iYWNrZ3JvdW5kID0gclEuc2xpY2UoclFpLCByUWkgKyBmYl9CcHApOwotICAgICAgICAgICAgICAgIHJRaSArPSBmYl9CcHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRkJVLnN1YmVuY29kaW5nICYgMHgwNCkgeyAvLyBGb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgRkJVLmZvcmVncm91bmQgPSByUS5zbGljZShyUWksIHJRaSArIGZiX0JwcCk7Ci0gICAgICAgICAgICAgICAgclFpICs9IGZiX0JwcDsKKyAgICAgICAgICAgICAgICBVdGlsLldhcm4oY21zZyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGRpc3BsYXkuc3RhcnRUaWxlKHgsIHksIHcsIGgsIEZCVS5iYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIGlmIChGQlUuc3ViZW5jb2RpbmcgJiAweDA4KSB7IC8vIEFueVN1YnJlY3RzCi0gICAgICAgICAgICAgICAgc3VicmVjdHMgPSByUVtyUWldOwotICAgICAgICAgICAgICAgIHJRaSArPSAxOwotICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBzdWJyZWN0czsgcyArPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGQlUuc3ViZW5jb2RpbmcgJiAweDEwKSB7IC8vIFN1YnJlY3RzQ29sb3VyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gclEuc2xpY2UoclFpLCByUWkgKyBmYl9CcHApOwotICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IGZiX0JwcDsKKyAgICAgICAgICAgIGlmIChvbGRzdGF0ZSA9PT0gJ2ZhaWxlZCcgJiYgc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gZGlzY29ubmVjdCBhY3Rpb24sIGJ1dCBzdGF5IGluIGZhaWxlZCBzdGF0ZQorICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9zdGF0ZSA9ICdmYWlsZWQnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9yZmJfc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc2Nvbm5UaW1lciAmJiB0aGlzLl9yZmJfc3RhdGUgIT09ICdkaXNjb25uZWN0JykgeworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIkNsZWFyaW5nIGRpc2Nvbm5lY3QgdGltZXIiKTsKKyAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZGlzY29ublRpbWVyKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9kaXNjb25uVGltZXIgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnbm9ybWFsJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZHN0YXRlID09PSAnZGlzY29ubmVjdGVkJyB8fCBvbGRzdGF0ZSA9PT0gJ2ZhaWxlZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoIkludmFsaWQgdHJhbnNpdGlvbiBmcm9tICdkaXNjb25uZWN0ZWQnIG9yICdmYWlsZWQnIHRvICdub3JtYWwnIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0JzoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdF92YXJzKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2ViU29ja2V0Lm9ub3BlbiB0cmFuc2l0aW9ucyB0byAnUHJvdG9jb2xWZXJzaW9uJworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3QnOgorICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNjb25uVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoIkRpc2Nvbm5lY3QgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuX2Rpc2Nvbm5lY3RUaW1lb3V0ICogMTAwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJpbnRfc3RhdHMoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZWJTb2NrZXQub25jbG9zZSB0cmFuc2l0aW9ucyB0byAnZGlzY29ubmVjdGVkJworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ2ZhaWxlZCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRzdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoIkludmFsaWQgdHJhbnNpdGlvbiBmcm9tICdkaXNjb25uZWN0ZWQnIHRvICdmYWlsZWQnIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2xkc3RhdGUgPT09ICdub3JtYWwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKCJFcnJvciB3aGlsZSBjb25uZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2xkc3RhdGUgPT09ICdpbml0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5FcnJvcigiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nLiIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHRyYW5zaXRpb24gdG8gZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpOworICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDUwKTsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIHN0YXRlIGNoYW5nZSBhY3Rpb24gdG8gdGFrZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2xkc3RhdGUgPT09ICdmYWlsZWQnICYmIHN0YXRlID09PSAnZGlzY29ubmVjdGVkJykgeworICAgICAgICAgICAgICAgIHRoaXMuX29uVXBkYXRlU3RhdGUodGhpcywgc3RhdGUsIG9sZHN0YXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5fb25VcGRhdGVTdGF0ZSh0aGlzLCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgX2ZhaWw6IGZ1bmN0aW9uIChtc2cpIHsKKyAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdmYWlsZWQnLCBtc2cpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9LAorCisgICAgICAgIF9oYW5kbGVfbWVzc2FnZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA9PT0gMCkgeworICAgICAgICAgICAgICAgIFV0aWwuV2FybigiaGFuZGxlX21lc3NhZ2UgY2FsbGVkIG9uIGFuIGVtcHR5IHJlY2VpdmUgcXVldWUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdmYWlsZWQnOgorICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKCJHb3QgZGF0YSB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbm9ybWFsJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25vcm1hbF9tc2coKSAmJiB0aGlzLl9zb2NrLnJRbGVuKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIG1lYW5zIHdlIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIG90aGVyIGV2ZW50cyBhIGNoYW5jZSB0byBydW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tc2dUaW1lciA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIk1vcmUgZGF0YSB0byBwcm9jZXNzLCBjcmVhdGluZyB0aW1lciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZ1RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZ1RpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlX21lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygiTW9yZSBkYXRhIHRvIHByb2Nlc3MsIGV4aXN0aW5nIHRpbWVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdF9tc2coKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgX2NoZWNrRXZlbnRzOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3N0YXRlID09PSAnbm9ybWFsJyAmJiAhdGhpcy5fdmlld3BvcnREcmFnZ2luZyAmJiB0aGlzLl9tb3VzZV9hcnIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZCh0aGlzLl9tb3VzZV9hcnIpOworICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlX2FyciA9IFtdOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIF9oYW5kbGVLZXlQcmVzczogZnVuY3Rpb24gKGtleXN5bSwgZG93bikgeworICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdfb25seSkgeyByZXR1cm47IH0gLy8gVmlldyBvbmx5LCBza2lwIGtleWJvYXJkLCBldmVudHMKKyAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChSRkIubWVzc2FnZXMua2V5RXZlbnQoa2V5c3ltLCBkb3duKSk7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZU1vdXNlQnV0dG9uOiBmdW5jdGlvbiAoeCwgeSwgZG93biwgYm1hc2spIHsKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayB8PSBibWFzazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayBePSBibWFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0RHJhZykgeworICAgICAgICAgICAgICAgIGlmIChkb3duICYmICF0aGlzLl92aWV3cG9ydERyYWdnaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydERyYWdQb3MgPSB7J3gnOiB4LCAneSc6IHl9OworCisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgc2VuZGluZyBtb3VzZSBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl92aWV3X29ubHkpIHsgcmV0dXJuOyB9IC8vIFZpZXcgb25seSwgc2tpcCBtb3VzZSBldmVudHMKKworICAgICAgICAgICAgdGhpcy5fbW91c2VfYXJyID0gdGhpcy5fbW91c2VfYXJyLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLnBvaW50ZXJFdmVudCh0aGlzLl9kaXNwbGF5LmFic1goeCksIHRoaXMuX2Rpc3BsYXkuYWJzWSh5KSwgdGhpcy5fbW91c2VfYnV0dG9uTWFzaykpOworICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKHRoaXMuX21vdXNlX2Fycik7CisgICAgICAgICAgICB0aGlzLl9tb3VzZV9hcnIgPSBbXTsKKyAgICAgICAgfSwKKworICAgICAgICBfaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbiAoeCwgeSkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICB2YXIgZGVsdGFYID0gdGhpcy5fdmlld3BvcnREcmFnUG9zLnggLSB4OworICAgICAgICAgICAgICAgIHZhciBkZWx0YVkgPSB0aGlzLl92aWV3cG9ydERyYWdQb3MueSAtIHk7CisgICAgICAgICAgICAgICAgdGhpcy5fdmlld3BvcnREcmFnUG9zID0geyd4JzogeCwgJ3knOiB5fTsKKworICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkudmlld3BvcnRDaGFuZ2UoZGVsdGFYLCBkZWx0YVkpOworCisgICAgICAgICAgICAgICAgLy8gU2tpcCBzZW5kaW5nIG1vdXNlIGV2ZW50cworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdfb25seSkgeyByZXR1cm47IH0gLy8gVmlldyBvbmx5LCBza2lwIG1vdXNlIGV2ZW50cworCisgICAgICAgICAgICB0aGlzLl9tb3VzZV9hcnIgPSB0aGlzLl9tb3VzZV9hcnIuY29uY2F0KAorICAgICAgICAgICAgICAgICAgICBSRkIubWVzc2FnZXMucG9pbnRlckV2ZW50KHRoaXMuX2Rpc3BsYXkuYWJzWCh4KSwgdGhpcy5fZGlzcGxheS5hYnNZKHkpLCB0aGlzLl9tb3VzZV9idXR0b25NYXNrKSk7CisKKyAgICAgICAgICAgIHRoaXMuX2NoZWNrRXZlbnRzKCk7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTWVzc2FnZSBIYW5kbGVycworCisgICAgICAgIF9uZWdvdGlhdGVfcHJvdG9jb2xfdmVyc2lvbjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA8IDEyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoIkluY29tcGxldGUgcHJvdG9jb2wgdmVyc2lvbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3ZlcnNpb24gPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoMTIpLnN1YnN0cig0LCA3KTsKKyAgICAgICAgICAgIFV0aWwuSW5mbygiU2VydmVyIFByb3RvY29sVmVyc2lvbjogIiArIHN2ZXJzaW9uKTsKKyAgICAgICAgICAgIHZhciBpc19yZXBlYXRlciA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKHN2ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAiMDAwLjAwMCI6ICAvLyBVbHRyYVZOQyByZXBlYXRlcgorICAgICAgICAgICAgICAgICAgICBpc19yZXBlYXRlciA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIjAwMy4wMDMiOgorICAgICAgICAgICAgICAgIGNhc2UgIjAwMy4wMDYiOiAgLy8gVWx0cmFWTkMKKyAgICAgICAgICAgICAgICBjYXNlICIwMDMuODg5IjogIC8vIEFwcGxlIFJlbW90ZSBEZXNrdG9wCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl92ZXJzaW9uID0gMy4zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICIwMDMuMDA3IjoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX3ZlcnNpb24gPSAzLjc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIjAwMy4wMDgiOgorICAgICAgICAgICAgICAgIGNhc2UgIjAwNC4wMDAiOiAgLy8gSW50ZWwgQU1UIEtWTQorICAgICAgICAgICAgICAgIGNhc2UgIjAwNC4wMDEiOiAgLy8gUmVhbFZOQyA0LjYKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX3ZlcnNpb24gPSAzLjg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCJJbnZhbGlkIHNlcnZlciB2ZXJzaW9uICIgKyBzdmVyc2lvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc19yZXBlYXRlcikgeworICAgICAgICAgICAgICAgIHZhciByZXBlYXRlcklEID0gdGhpcy5fcmVwZWF0ZXJJRDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVwZWF0ZXJJRC5sZW5ndGggPCAyNTApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZXJJRCArPSAiXDAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmRfc3RyaW5nKHJlcGVhdGVySUQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3ZlcnNpb24gPiB0aGlzLl9yZmJfbWF4X3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9yZmJfdmVyc2lvbiA9IHRoaXMuX3JmYl9tYXhfdmVyc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCB1cGRhdGVzIGVpdGhlciBhdCBhIHJhdGUgb2YgMSB1cGRhdGUgcGVyIDUwbXMsIG9yCisgICAgICAgICAgICAvLyB3aGF0ZXZlciBzbG93ZXIgcmF0ZSB0aGUgbmV0d29yayBjYW4gaGFuZGxlCisgICAgICAgICAgICB0aGlzLl9zZW5kVGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLl9zb2NrLmZsdXNoLmJpbmQodGhpcy5fc29jayksIDUwKTsKKworICAgICAgICAgICAgdmFyIGN2ZXJzaW9uID0gIjAwIiArIHBhcnNlSW50KHRoaXMuX3JmYl92ZXJzaW9uLCAxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4wMCIgKyAoKHRoaXMuX3JmYl92ZXJzaW9uICogMTApICUgMTApOworICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZygiUkZCICIgKyBjdmVyc2lvbiArICJcbiIpOworICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ1NlY3VyaXR5JywgJ1NlbnQgUHJvdG9jb2xWZXJzaW9uOiAnICsgY3ZlcnNpb24pOworICAgICAgICB9LAorCisgICAgICAgIF9uZWdvdGlhdGVfc2VjdXJpdHk6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfdmVyc2lvbiA+PSAzLjcpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2VuZHMgc3VwcG9ydGVkIGxpc3QsIGNsaWVudCBkZWNpZGVzCisgICAgICAgICAgICAgICAgdmFyIG51bV90eXBlcyA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoInNlY3VyaXR5IHR5cGUiLCBudW1fdHlwZXMsIDEpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgaWYgKG51bV90eXBlcyA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3RybGVuID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlYXNvbiA9IHRoaXMuX3NvY2suclFzaGlmdFN0cihzdHJsZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbCgiU2VjdXJpdHkgZmFpbHVyZTogIiArIHJlYXNvbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMDsKKyAgICAgICAgICAgICAgICB2YXIgdHlwZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhudW1fdHlwZXMpOworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIlNlcnZlciBzZWN1cml0eSB0eXBlczogIiArIHR5cGVzKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlc1tpXSA+IHRoaXMuX3JmYl9hdXRoX3NjaGVtZSAmJiAodHlwZXNbaV0gPD0gMTYgfHwgdHlwZXNbaV0gPT0gMjIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSB0eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoIlVuc3VwcG9ydGVkIHNlY3VyaXR5IHR5cGVzOiAiICsgdHlwZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbdGhpcy5fcmZiX2F1dGhfc2NoZW1lXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNlcnZlciBkZWNpZGVzCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJzZWN1cml0eSBzY2hlbWUiLCA0KSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSgnQXV0aGVudGljYXRpb24nLCAnQXV0aGVudGljYXRpbmcgdXNpbmcgc2NoZW1lOiAnICsgdGhpcy5fcmZiX2F1dGhfc2NoZW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0X21zZygpOyAvLyBqdW1wIHRvIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gYXV0aGVudGljYXRpb24KKyAgICAgICAgX25lZ290aWF0ZV94dnBfYXV0aDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIHh2cF9zZXAgPSB0aGlzLl94dnBfcGFzc3dvcmRfc2VwOworICAgICAgICAgICAgdmFyIHh2cF9hdXRoID0gdGhpcy5fcmZiX3Bhc3N3b3JkLnNwbGl0KHh2cF9zZXApOworICAgICAgICAgICAgaWYgKHh2cF9hdXRoLmxlbmd0aCA8IDMpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSgncGFzc3dvcmQnLCAnWFZQIGNyZWRlbnRpYWxzIHJlcXVpcmVkICh1c2VyJyArIHh2cF9zZXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXJnZXQnICsgeHZwX3NlcCArICdwYXNzd29yZCkgLS0gZ290IG9ubHkgJyArIHRoaXMuX3JmYl9wYXNzd29yZCk7CisgICAgICAgICAgICAgICAgdGhpcy5fb25QYXNzd29yZFJlcXVpcmVkKHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHh2cF9hdXRoX3N0ciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoeHZwX2F1dGhbMF0ubGVuZ3RoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSh4dnBfYXV0aFsxXS5sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dnBfYXV0aFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHZwX2F1dGhbMV07CisgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmRfc3RyaW5nKHh2cF9hdXRoX3N0cik7CisgICAgICAgICAgICB0aGlzLl9yZmJfcGFzc3dvcmQgPSB4dnBfYXV0aC5zbGljZSgyKS5qb2luKHh2cF9zZXApOworICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfYXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgfSwKKworICAgICAgICBfbmVnb3RpYXRlX3N0ZF92bmNfYXV0aDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9wYXNzd29yZC5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgdmlhIGJvdGggY2FsbGJhY2tzIHNpbmNlIGl0J3Mga2luZCBvZgorICAgICAgICAgICAgICAgIC8vIGFuIFJGQiBzdGF0ZSBjaGFuZ2UgYW5kIGEgVUkgaW50ZXJmYWNlIGlzc3VlCisgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ3Bhc3N3b3JkJywgIlBhc3N3b3JkIFJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgdGhpcy5fb25QYXNzd29yZFJlcXVpcmVkKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoImF1dGggY2hhbGxlbmdlIiwgMTYpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICB2YXIgY2hhbGxlbmdlID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoMTYpOworICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gUkZCLmdlbkRFUyh0aGlzLl9yZmJfcGFzc3dvcmQsIGNoYWxsZW5nZSk7CisgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQocmVzcG9uc2UpOworICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoIlNlY3VyaXR5UmVzdWx0Iik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKworICAgICAgICBfbmVnb3RpYXRlX3RpZ2h0X3R1bm5lbHM6IGZ1bmN0aW9uIChudW1UdW5uZWxzKSB7CisgICAgICAgICAgICB2YXIgY2xpZW50U3VwcG9ydGVkVHVubmVsVHlwZXMgPSB7CisgICAgICAgICAgICAgICAgMDogeyB2ZW5kb3I6ICdUR0hUJywgc2lnbmF0dXJlOiAnTk9UVU5ORUwnIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXMgPSB7fTsKKyAgICAgICAgICAgIC8vIHJlY2VpdmUgdHVubmVsIGNhcGFiaWxpdGllcworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UdW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FwX2NvZGUgPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpOworICAgICAgICAgICAgICAgIHZhciBjYXBfdmVuZG9yID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDQpOworICAgICAgICAgICAgICAgIHZhciBjYXBfc2lnbmF0dXJlID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDgpOworICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFR1bm5lbFR5cGVzW2NhcF9jb2RlXSA9IHsgdmVuZG9yOiBjYXBfdmVuZG9yLCBzaWduYXR1cmU6IGNhcF9zaWduYXR1cmUgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2hvb3NlIHRoZSBub3R1bm5lbCB0eXBlCisgICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXNbMF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXNbMF0udmVuZG9yICE9IGNsaWVudFN1cHBvcnRlZFR1bm5lbFR5cGVzWzBdLnZlbmRvciB8fAorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTdXBwb3J0ZWRUdW5uZWxUeXBlc1swXS5zaWduYXR1cmUgIT0gY2xpZW50U3VwcG9ydGVkVHVubmVsVHlwZXNbMF0uc2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCJDbGllbnQncyB0dW5uZWwgdHlwZSBoYWQgdGhlIGluY29ycmVjdCB2ZW5kb3Igb3Igc2lnbmF0dXJlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbMCwgMCwgMCwgMF0pOyAgLy8gdXNlIE5PVFVOTkVMCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3YWl0IHVudGlsIHdlIHJlY2VpdmUgdGhlIHN1YiBhdXRoIGNvdW50IHRvIGNvbnRpbnVlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCJTZXJ2ZXIgd2FudGVkIHR1bm5lbHMsIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIG5vdHVubmVsIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfbmVnb3RpYXRlX3RpZ2h0X2F1dGg6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5fcmZiX3RpZ2h0dm5jKSB7ICAvLyBmaXJzdCBwYXNzLCBkbyB0aGUgdHVubmVsIG5lZ290aWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJudW0gdHVubmVscyIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHZhciBudW1UdW5uZWxzID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtVHVubmVscyA+IDAgJiYgdGhpcy5fc29jay5yUXdhaXQoInR1bm5lbCBjYXBhYmlsaXRpZXMiLCAxNiAqIG51bVR1bm5lbHMsIDQpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fcmZiX3RpZ2h0dm5jID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmIChudW1UdW5uZWxzID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZWdvdGlhdGVfdGlnaHRfdHVubmVscyhudW1UdW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gd2FpdCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBzdWIgYXV0aCB0byBjb250aW51ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2Vjb25kIHBhc3MsIGRvIHRoZSBzdWItYXV0aCBuZWdvdGlhdGlvbgorICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJzdWIgYXV0aCBjb3VudCIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdmFyIHN1YkF1dGhDb3VudCA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoInN1YiBhdXRoIGNhcGFiaWxpdGllcyIsIDE2ICogc3ViQXV0aENvdW50LCA0KSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgdmFyIGNsaWVudFN1cHBvcnRlZFR5cGVzID0geworICAgICAgICAgICAgICAgICdTVERWTk9BVVRIX18nOiAxLAorICAgICAgICAgICAgICAgICdTVERWVk5DQVVUSF8nOiAyCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgc2VydmVyU3VwcG9ydGVkVHlwZXMgPSBbXTsKKworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJBdXRoQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBjYXBOdW0gPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpOworICAgICAgICAgICAgICAgIHZhciBjYXBhYmlsaXRpZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoMTIpOworICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFR5cGVzLnB1c2goY2FwYWJpbGl0aWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh2YXIgYXV0aFR5cGUgaW4gY2xpZW50U3VwcG9ydGVkVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHlwZXMuaW5kZXhPZihhdXRoVHlwZSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKFswLCAwLCAwLCBjbGllbnRTdXBwb3J0ZWRUeXBlc1thdXRoVHlwZV1dKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF1dGhUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVERWTk9BVVRIX18nOiAgLy8gbm8gYXV0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdTZWN1cml0eVJlc3VsdCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1REVlZOQ0FVVEhfJzogLy8gVk5DIGF1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0X21zZygpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbCgiVW5zdXBwb3J0ZWQgdGlueSBhdXRoIHNjaGVtZTogIiArIGF1dGhUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fZmFpbCgiTm8gc3VwcG9ydGVkIHN1Yi1hdXRoIHR5cGVzISIpOworICAgICAgICB9LAorCisgICAgICAgIF9uZWdvdGlhdGVfYXV0aGVudGljYXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX2F1dGhfc2NoZW1lKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAgLy8gY29ubmVjdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJhdXRoIHJlYXNvbiIsIDQpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgICAgICB2YXIgc3RybGVuID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlYXNvbiA9IHRoaXMuX3NvY2suclFzaGlmdFN0cihzdHJsZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbCgiQXV0aCBmYWlsdXJlOiAiICsgcmVhc29uKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMTogIC8vIG5vIGF1dGgKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID49IDMuOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoJ1NlY3VyaXR5UmVzdWx0Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSgnQ2xpZW50SW5pdGlhbGlzYXRpb24nLCAiTm8gYXV0aCByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdF9tc2coKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMjI6ICAvLyBYVlAgYXV0aAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3h2cF9hdXRoKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICAvLyBWTkMgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9zdGRfdm5jX2F1dGgoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMTY6ICAvLyBUaWdodFZOQyBTZWN1cml0eSBUeXBlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfdGlnaHRfYXV0aCgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoIlVuc3VwcG9ydGVkIGF1dGggc2NoZW1lOiAiICsgdGhpcy5fcmZiX2F1dGhfc2NoZW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfaGFuZGxlX3NlY3VyaXR5X3Jlc3VsdDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdWTkMgYXV0aCByZXNwb25zZSAnLCA0KSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fc29jay5yUXNoaWZ0MzIoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIE9LCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdDbGllbnRJbml0aWFsaXNhdGlvbicsICdBdXRoZW50aWNhdGlvbiBPSycpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdF9tc2coKTsKKyAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID49IDMuOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlNlY3VyaXR5UmVzdWx0IHJlYXNvbiIsIGxlbmd0aCwgOCkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhc29uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBGQlUuZm9yZWdyb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeHkgPSByUVtyUWldOwotICAgICAgICAgICAgICAgICAgICByUWkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgc3ggPSAoeHkgPj4gNCk7Ci0gICAgICAgICAgICAgICAgICAgIHN5ID0gKHh5ICYgMHgwZik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCJUb28gbWFueSBhdXRoIGF0dGVtcHRzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAKLSAgICAgICAgICAgICAgICAgICAgd2ggPSByUVtyUWldOwotICAgICAgICAgICAgICAgICAgICByUWkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgc3cgPSAod2ggPj4gNCkgICArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHNoID0gKHdoICYgMHgwZikgKyAxOworICAgICAgICBfbmVnb3RpYXRlX3NlcnZlcl9pbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoInNlcnZlciBpbml0aWFsaXphdGlvbiIsIDI0KSkgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnN1YlRpbGUoc3gsIHN5LCBzdywgc2gsIGNvbG9yKTsKKyAgICAgICAgICAgIC8qIFNjcmVlbiBzaXplICovCisgICAgICAgICAgICB0aGlzLl9mYl93aWR0aCAgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpOworICAgICAgICAgICAgdGhpcy5fZmJfaGVpZ2h0ID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTsKKworICAgICAgICAgICAgLyogUElYRUxfRk9STUFUICovCisgICAgICAgICAgICB2YXIgYnBwICAgICAgICAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisgICAgICAgICAgICB2YXIgZGVwdGggICAgICAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisgICAgICAgICAgICB2YXIgYmlnX2VuZGlhbiAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisgICAgICAgICAgICB2YXIgdHJ1ZV9jb2xvciAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisKKyAgICAgICAgICAgIHZhciByZWRfbWF4ICAgICA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7CisgICAgICAgICAgICB2YXIgZ3JlZW5fbWF4ICAgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpOworICAgICAgICAgICAgdmFyIGJsdWVfbWF4ICAgID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTsKKyAgICAgICAgICAgIHZhciByZWRfc2hpZnQgICA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTsKKyAgICAgICAgICAgIHZhciBncmVlbl9zaGlmdCA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTsKKyAgICAgICAgICAgIHZhciBibHVlX3NoaWZ0ICA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTsKKyAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7ICAvLyBwYWRkaW5nCisKKyAgICAgICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgY2FsbGJhY2tzIG9yIHByaW50IG1lc3NhZ2VzIHVudGlsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAqYWZ0ZXIqIHdlJ3JlIHBhc3QgdGhlIHBvaW50IHdoZXJlIHdlIGNvdWxkIGJhY2t0cmFjaworCisgICAgICAgICAgICAvKiBDb25uZWN0aW9uIG5hbWUvdGl0bGUgKi8KKyAgICAgICAgICAgIHZhciBuYW1lX2xlbmd0aCA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ3NlcnZlciBpbml0IG5hbWUnLCBuYW1lX2xlbmd0aCwgMjQpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdGhpcy5fZmJfbmFtZSA9IFV0aWwuZGVjb2RlVVRGOCh0aGlzLl9zb2NrLnJRc2hpZnRTdHIobmFtZV9sZW5ndGgpKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl90aWdodHZuYykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgnVGlnaHRWTkMgZXh0ZW5kZWQgc2VydmVyIGluaXQgaGVhZGVyJywgOCwgMjQgKyBuYW1lX2xlbmd0aCkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAgICAgLy8gSW4gVGlnaHRWTkMgbW9kZSwgU2VydmVySW5pdCBtZXNzYWdlIGlzIGV4dGVuZGVkCisgICAgICAgICAgICAgICAgdmFyIG51bVNlcnZlck1lc3NhZ2VzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTsKKyAgICAgICAgICAgICAgICB2YXIgbnVtQ2xpZW50TWVzc2FnZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpOworICAgICAgICAgICAgICAgIHZhciBudW1FbmNvZGluZ3MgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpOworICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMik7ICAvLyBwYWRkaW5nCisKKyAgICAgICAgICAgICAgICB2YXIgdG90YWxNZXNzYWdlc0xlbmd0aCA9IChudW1TZXJ2ZXJNZXNzYWdlcyArIG51bUNsaWVudE1lc3NhZ2VzICsgbnVtRW5jb2RpbmdzKSAqIDE2OworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgnVGlnaHRWTkMgZXh0ZW5kZWQgc2VydmVyIGluaXQgaGVhZGVyJywgdG90YWxNZXNzYWdlc0xlbmd0aCwgMzIgKyBuYW1lX2xlbmd0aCkpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICB2YXIgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2VydmVyTWVzc2FnZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3J2TXNnID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDE2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2xpZW50TWVzc2FnZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50TXNnID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDE2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRW5jb2RpbmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5nID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDE2KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXNwbGF5LmZpbmlzaFRpbGUoKTsKLSAgICAgICAgfQotICAgICAgICB3cy5zZXRfclFpKHJRaSk7Ci0gICAgICAgIEZCVS5sYXN0c3ViZW5jb2RpbmcgPSBGQlUuc3ViZW5jb2Rpbmc7Ci0gICAgICAgIEZCVS5ieXRlcyA9IDA7Ci0gICAgICAgIEZCVS50aWxlcyAtPSAxOwotICAgIH0KIAotICAgIGlmIChGQlUudGlsZXMgPT09IDApIHsKLSAgICAgICAgRkJVLnJlY3RzIC09IDE7Ci0gICAgfQorICAgICAgICAgICAgLy8gTkIoZGlyZWN0eG1hbjEyKTogdGhlc2UgYXJlIGRvd24gaGVyZSBzbyB0aGF0IHdlIGRvbid0IHJ1biB0aGVtIG11bHRpcGxlIHRpbWVzCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBpZiB3ZSBiYWNrdHJhY2sKKyAgICAgICAgICAgIFV0aWwuSW5mbygiU2NyZWVuOiAiICsgdGhpcy5fZmJfd2lkdGggKyAieCIgKyB0aGlzLl9mYl9oZWlnaHQgKworICAgICAgICAgICAgICAgICAgICAgICIsIGJwcDogIiArIGJwcCArICIsIGRlcHRoOiAiICsgZGVwdGggKworICAgICAgICAgICAgICAgICAgICAgICIsIGJpZ19lbmRpYW46ICIgKyBiaWdfZW5kaWFuICsKKyAgICAgICAgICAgICAgICAgICAgICAiLCB0cnVlX2NvbG9yOiAiICsgdHJ1ZV9jb2xvciArCisgICAgICAgICAgICAgICAgICAgICAgIiwgcmVkX21heDogIiArIHJlZF9tYXggKworICAgICAgICAgICAgICAgICAgICAgICIsIGdyZWVuX21heDogIiArIGdyZWVuX21heCArCisgICAgICAgICAgICAgICAgICAgICAgIiwgYmx1ZV9tYXg6ICIgKyBibHVlX21heCArCisgICAgICAgICAgICAgICAgICAgICAgIiwgcmVkX3NoaWZ0OiAiICsgcmVkX3NoaWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAiLCBncmVlbl9zaGlmdDogIiArIGdyZWVuX3NoaWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAiLCBibHVlX3NoaWZ0OiAiICsgYmx1ZV9zaGlmdCk7CiAKLSAgICAvL1V0aWwuRGVidWcoIjw8IGRpc3BsYXlfaGV4dGlsZSIpOwotICAgIHJldHVybiB0cnVlOwotfTsKLQotCi0vLyBHZXQgJ2NvbXBhY3QgbGVuZ3RoJyBoZWFkZXIgYW5kIGRhdGEgc2l6ZQotZ2V0VGlnaHRDTGVuZ3RoID0gZnVuY3Rpb24gKGFycikgewotICAgIHZhciBoZWFkZXIgPSAxLCBkYXRhID0gMDsKLSAgICBkYXRhICs9IGFyclswXSAmIDB4N2Y7Ci0gICAgaWYgKGFyclswXSAmIDB4ODApIHsKLSAgICAgICAgaGVhZGVyICs9IDE7Ci0gICAgICAgIGRhdGEgKz0gKGFyclsxXSAmIDB4N2YpIDw8IDc7Ci0gICAgICAgIGlmIChhcnJbMV0gJiAweDgwKSB7Ci0gICAgICAgICAgICBoZWFkZXIgKz0gMTsKLSAgICAgICAgICAgIGRhdGEgKz0gYXJyWzJdIDw8IDE0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBbaGVhZGVyLCBkYXRhXTsKLX07Ci0KLWZ1bmN0aW9uIGRpc3BsYXlfdGlnaHQoaXNUaWdodFBORykgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGlzcGxheV90aWdodCIpOwotCi0gICAgaWYgKGZiX2RlcHRoID09PSAxKSB7Ci0gICAgICAgIGZhaWwoIlRpZ2h0IHByb3RvY29sIGhhbmRsZXIgb25seSBpbXBsZW1lbnRzIHRydWUgY29sb3IgbW9kZSIpOwotICAgIH0KLQotICAgIHZhciBjdGwsIGNtb2RlLCBjbGVuZ3RoLCBjb2xvciwgaW1nLCBkYXRhOwotICAgIHZhciBmaWx0ZXJJZCA9IC0xLCByZXNldFN0cmVhbXMgPSAwLCBzdHJlYW1JZCA9IC0xOwotICAgIHZhciByUSA9IHdzLmdldF9yUSgpLCByUWkgPSB3cy5nZXRfclFpKCk7IAotCi0gICAgRkJVLmJ5dGVzID0gMTsgLy8gY29tcHJlc3Npb24tY29udHJvbCBieXRlCi0gICAgaWYgKHdzLnJRd2FpdCgiVElHSFQgY29tcHJlc3Npb24tY29udHJvbCIsIEZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2YXIgY2hlY2tzdW0gPSBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgIHZhciBzdW09MCwgaTsKLSAgICAgICAgZm9yIChpPTA7IGk8ZGF0YS5sZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gZGF0YVtpXTsKLSAgICAgICAgICAgIGlmIChzdW0gPiA2NTUzNikgc3VtIC09IDY1NTM2OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdW07Ci0gICAgfQotCi0gICAgdmFyIGRlY29tcHJlc3MgPSBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgIGZvciAodmFyIGk9MDsgaTw0OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgocmVzZXRTdHJlYW1zID4+IGkpICYgMSkgewotICAgICAgICAgICAgICAgIEZCVS56bGlic1tpXS5yZXNldCgpOwotICAgICAgICAgICAgICAgIFV0aWwuSW5mbygiUmVzZXQgemxpYiBzdHJlYW0gIiArIGkpOworICAgICAgICAgICAgaWYgKGJpZ19lbmRpYW4gIT09IDApIHsKKyAgICAgICAgICAgICAgICBVdGlsLldhcm4oIlNlcnZlciBuYXRpdmUgZW5kaWFuIGlzIG5vdCBsaXR0bGUgZW5kaWFuIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIHVuY29tcHJlc3NlZCA9IEZCVS56bGlic1tzdHJlYW1JZF0udW5jb21wcmVzcyhkYXRhLCAwKTsKLSAgICAgICAgaWYgKHVuY29tcHJlc3NlZC5zdGF0dXMgIT09IDApIHsKLSAgICAgICAgICAgIFV0aWwuRXJyb3IoIkludmFsaWQgZGF0YSBpbiB6bGliIHN0cmVhbSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vVXRpbC5XYXJuKCJEZWNvbXByZXNzZWQgIiArIGRhdGEubGVuZ3RoICsgIiB0byAiICsKLSAgICAgICAgLy8gICAgdW5jb21wcmVzc2VkLmRhdGEubGVuZ3RoICsgIiBjaGVja3N1bXMgIiArCi0gICAgICAgIC8vICAgIGNoZWNrc3VtKGRhdGEpICsgIjoiICsgY2hlY2tzdW0odW5jb21wcmVzc2VkLmRhdGEpKTsKIAotICAgICAgICByZXR1cm4gdW5jb21wcmVzc2VkLmRhdGE7Ci0gICAgfQotCi0gICAgdmFyIGhhbmRsZVBhbGV0dGUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIG51bUNvbG9ycyA9IHJRW3JRaSArIDJdICsgMTsKLSAgICAgICAgdmFyIHBhbGV0dGVTaXplID0gbnVtQ29sb3JzICogZmJfZGVwdGg7IAotICAgICAgICBGQlUuYnl0ZXMgKz0gcGFsZXR0ZVNpemU7Ci0gICAgICAgIGlmICh3cy5yUXdhaXQoIlRJR0hUIHBhbGV0dGUgIiArIGNtb2RlLCBGQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIHZhciBicHAgPSAobnVtQ29sb3JzIDw9IDIpID8gMSA6IDg7Ci0gICAgICAgIHZhciByb3dTaXplID0gTWF0aC5mbG9vcigoRkJVLndpZHRoICogYnBwICsgNykgLyA4KTsKLSAgICAgICAgdmFyIHJhdyA9IGZhbHNlOwotICAgICAgICBpZiAocm93U2l6ZSAqIEZCVS5oZWlnaHQgPCAxMikgewotICAgICAgICAgICAgcmF3ID0gdHJ1ZTsKLSAgICAgICAgICAgIGNsZW5ndGggPSBbMCwgcm93U2l6ZSAqIEZCVS5oZWlnaHRdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xlbmd0aCA9IGdldFRpZ2h0Q0xlbmd0aCh3cy5yUXNsaWNlKDMgKyBwYWxldHRlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICsgcGFsZXR0ZVNpemUgKyAzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRkJVLmJ5dGVzICs9IGNsZW5ndGhbMF0gKyBjbGVuZ3RoWzFdOwotICAgICAgICBpZiAod3MuclF3YWl0KCJUSUdIVCAiICsgY21vZGUsIEZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgLy8gU2hpZnQgY3RsLCBmaWx0ZXIgaWQsIG51bSBjb2xvcnMsIHBhbGV0dGUgZW50cmllcywgYW5kIGNsZW5ndGggb2ZmCi0gICAgICAgIHdzLnJRc2hpZnRCeXRlcygzKTsgCi0gICAgICAgIHZhciBwYWxldHRlID0gd3MuclFzaGlmdEJ5dGVzKHBhbGV0dGVTaXplKTsKLSAgICAgICAgd3MuclFzaGlmdEJ5dGVzKGNsZW5ndGhbMF0pOwotCi0gICAgICAgIGlmIChyYXcpIHsKLSAgICAgICAgICAgIGRhdGEgPSB3cy5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhID0gZGVjb21wcmVzcyh3cy5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udmVydCBpbmRleGVkIChwYWxldHRlIGJhc2VkKSBpbWFnZSBkYXRhIHRvIFJHQgotICAgICAgICAvLyBUT0RPOiByZWR1Y2UgbnVtYmVyIG9mIGNhbGN1bGF0aW9ucyBpbnNpZGUgbG9vcAotICAgICAgICB2YXIgZGVzdCA9IFtdOwotICAgICAgICB2YXIgeCwgeSwgYiwgdywgdzEsIGRwLCBzcDsKLSAgICAgICAgaWYgKG51bUNvbG9ycyA9PT0gMikgewotICAgICAgICAgICAgdyA9IE1hdGguZmxvb3IoKEZCVS53aWR0aCArIDcpIC8gOCk7Ci0gICAgICAgICAgICB3MSA9IE1hdGguZmxvb3IoRkJVLndpZHRoIC8gOCk7Ci0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgRkJVLmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHcxOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSAwOyBiLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gKHkqRkJVLndpZHRoICsgeCo4ICsgNy1iKSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcCA9IChkYXRhW3kqdyArIHhdID4+IGIgJiAxKSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICBdID0gcGFsZXR0ZVtzcCAgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHArMV0gPSBwYWxldHRlW3NwKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCsyXSA9IHBhbGV0dGVbc3ArMl07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSA4IC0gRkJVLndpZHRoICUgODsgYi0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwID0gKHkqRkJVLndpZHRoICsgeCo4ICsgNy1iKSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgIHNwID0gKGRhdGFbeSp3ICsgeF0gPj4gYiAmIDEpICogMzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCAgXSA9IHBhbGV0dGVbc3AgIF07Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RbZHArMV0gPSBwYWxldHRlW3NwKzFdOwotICAgICAgICAgICAgICAgICAgICBkZXN0W2RwKzJdID0gcGFsZXR0ZVtzcCsyXTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVkX3NoaWZ0ICE9PSAxNikgeworICAgICAgICAgICAgICAgIFV0aWwuV2FybigiU2VydmVyIG5hdGl2ZSByZWQtc2hpZnQgaXMgbm90IDE2Iik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgRkJVLmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IEZCVS53aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwID0gKHkqRkJVLndpZHRoICsgeCkgKiAzOwotICAgICAgICAgICAgICAgICAgICBzcCA9IGRhdGFbeSpGQlUud2lkdGggKyB4XSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgIF0gPSBwYWxldHRlW3NwICBdOwotICAgICAgICAgICAgICAgICAgICBkZXN0W2RwKzFdID0gcGFsZXR0ZVtzcCsxXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCsyXSA9IHBhbGV0dGVbc3ArMl07Ci0gICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmx1ZV9zaGlmdCAhPT0gMCkgeworICAgICAgICAgICAgICAgIFV0aWwuV2FybigiU2VydmVyIG5hdGl2ZSBibHVlLXNoaWZ0IGlzIG5vdCAwIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBGQlUuaW1nUS5wdXNoKHsKLSAgICAgICAgICAgICAgICAndHlwZSc6ICdyZ2InLAotICAgICAgICAgICAgICAgICdpbWcnOiAgeydjb21wbGV0ZSc6IHRydWUsICdkYXRhJzogZGVzdH0sCi0gICAgICAgICAgICAgICAgJ3gnOiBGQlUueCwKLSAgICAgICAgICAgICAgICAneSc6IEZCVS55LAotICAgICAgICAgICAgICAgICd3aWR0aCc6IEZCVS53aWR0aCwKLSAgICAgICAgICAgICAgICAnaGVpZ2h0JzogRkJVLmhlaWdodH0pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CisgICAgICAgICAgICAvLyB3ZSdyZSBwYXN0IHRoZSBwb2ludCB3aGVyZSB3ZSBjb3VsZCBiYWNrdHJhY2ssIHNvIGl0J3Mgc2FmZSB0byBjYWxsIHRoaXMKKyAgICAgICAgICAgIHRoaXMuX29uRGVza3RvcE5hbWUodGhpcywgdGhpcy5fZmJfbmFtZSk7CiAKLSAgICB2YXIgaGFuZGxlQ29weSA9IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgcmF3ID0gZmFsc2U7Ci0gICAgICAgIHZhciB1bmNvbXByZXNzZWRTaXplID0gRkJVLndpZHRoICogRkJVLmhlaWdodCAqIGZiX2RlcHRoOwotICAgICAgICBpZiAodW5jb21wcmVzc2VkU2l6ZSA8IDEyKSB7Ci0gICAgICAgICAgICByYXcgPSB0cnVlOwotICAgICAgICAgICAgY2xlbmd0aCA9IFswLCB1bmNvbXByZXNzZWRTaXplXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsZW5ndGggPSBnZXRUaWdodENMZW5ndGgod3MuclFzbGljZSgxLCA0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgRkJVLmJ5dGVzID0gMSArIGNsZW5ndGhbMF0gKyBjbGVuZ3RoWzFdOwotICAgICAgICBpZiAod3MuclF3YWl0KCJUSUdIVCAiICsgY21vZGUsIEZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBpZiAodGhpcy5fdHJ1ZV9jb2xvciAmJiB0aGlzLl9mYl9uYW1lID09PSAiSW50ZWwocikgQU1UIEtWTSIpIHsKKyAgICAgICAgICAgICAgICBVdGlsLldhcm4oIkludGVsIEFNVCBLVk0gb25seSBzdXBwb3J0cyA4LzE2IGJpdCBkZXB0aHMuICBEaXNhYmxpbmcgdHJ1ZSBjb2xvciIpOworICAgICAgICAgICAgICAgIHRoaXMuX3RydWVfY29sb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAvLyBTaGlmdCBjdGwsIGNsZW5ndGggb2ZmCi0gICAgICAgIHdzLnJRc2hpZnRCeXRlcygxICsgY2xlbmd0aFswXSk7CisgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LnNldF90cnVlX2NvbG9yKHRoaXMuX3RydWVfY29sb3IpOworICAgICAgICAgICAgdGhpcy5fb25GQlJlc2l6ZSh0aGlzLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTsKKyAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVzaXplKHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpOworICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmQuZ3JhYigpOworICAgICAgICAgICAgdGhpcy5fbW91c2UuZ3JhYigpOwogCi0gICAgICAgIGlmIChyYXcpIHsKLSAgICAgICAgICAgIGRhdGEgPSB3cy5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhID0gZGVjb21wcmVzcyh3cy5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRkJVLmltZ1EucHVzaCh7Ci0gICAgICAgICAgICAgICAgJ3R5cGUnOiAncmdiJywKLSAgICAgICAgICAgICAgICAnaW1nJzogIHsnY29tcGxldGUnOiB0cnVlLCAnZGF0YSc6IGRhdGF9LAotICAgICAgICAgICAgICAgICd4JzogRkJVLngsCi0gICAgICAgICAgICAgICAgJ3knOiBGQlUueSwKLSAgICAgICAgICAgICAgICAnd2lkdGgnOiBGQlUud2lkdGgsCi0gICAgICAgICAgICAgICAgJ2hlaWdodCc6IEZCVS5oZWlnaHR9KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY3RsID0gd3MuclFwZWVrOCgpOwotCi0gICAgLy8gS2VlcCB0aWdodCByZXNldCBiaXRzCi0gICAgcmVzZXRTdHJlYW1zID0gY3RsICYgMHhGOwotCi0gICAgLy8gRmlndXJlIG91dCBmaWx0ZXIKLSAgICBjdGwgPSBjdGwgPj4gNDsgCi0gICAgc3RyZWFtSWQgPSBjdGwgJiAweDM7Ci0KLSAgICBpZiAoY3RsID09PSAweDA4KSAgICAgIGNtb2RlID0gImZpbGwiOwotICAgIGVsc2UgaWYgKGN0bCA9PT0gMHgwOSkgY21vZGUgPSAianBlZyI7Ci0gICAgZWxzZSBpZiAoY3RsID09PSAweDBBKSBjbW9kZSA9ICJwbmciOwotICAgIGVsc2UgaWYgKGN0bCAmIDB4MDQpICAgY21vZGUgPSAiZmlsdGVyIjsKLSAgICBlbHNlIGlmIChjdGwgPCAweDA0KSAgIGNtb2RlID0gImNvcHkiOwotICAgIGVsc2UgdGhyb3coIklsbGVnYWwgdGlnaHQgY29tcHJlc3Npb24gcmVjZWl2ZWQsIGN0bDogIiArIGN0bCk7Ci0KLSAgICBpZiAoaXNUaWdodFBORyAmJiAoY21vZGUgPT09ICJmaWx0ZXIiIHx8IGNtb2RlID09PSAiY29weSIpKSB7Ci0gICAgICAgIHRocm93KCJmaWx0ZXIvY29weSByZWNlaXZlZCBpbiB0aWdodFBORyBtb2RlIik7Ci0gICAgfQotCi0gICAgc3dpdGNoIChjbW9kZSkgewotICAgICAgICAvLyBmaWxsIHVzZXMgZmJfZGVwdGggYmVjYXVzZSBUUElYRUxzIGRyb3AgdGhlIHBhZGRpbmcgYnl0ZQotICAgICAgICBjYXNlICJmaWxsIjogICBGQlUuYnl0ZXMgKz0gZmJfZGVwdGg7IGJyZWFrOyAvLyBUUElYRUwKLSAgICAgICAgY2FzZSAianBlZyI6ICAgRkJVLmJ5dGVzICs9IDM7ICAgICAgICBicmVhazsgLy8gbWF4IGNsZW5ndGgKLSAgICAgICAgY2FzZSAicG5nIjogICAgRkJVLmJ5dGVzICs9IDM7ICAgICAgICBicmVhazsgLy8gbWF4IGNsZW5ndGgKLSAgICAgICAgY2FzZSAiZmlsdGVyIjogRkJVLmJ5dGVzICs9IDI7ICAgICAgICBicmVhazsgLy8gZmlsdGVyIGlkICsgbnVtIGNvbG9ycyBpZiBwYWxldHRlCi0gICAgICAgIGNhc2UgImNvcHkiOiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHdzLnJRd2FpdCgiVElHSFQgIiArIGNtb2RlLCBGQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLy9VdGlsLkRlYnVnKCIgICB3cy5yUXNsaWNlKDAsMjApOiAiICsgd3MuclFzbGljZSgwLDIwKSArICIgKCIgKyB3cy5yUWxlbigpICsgIikiKTsKLSAgICAvL1V0aWwuRGVidWcoIiAgIGNtb2RlOiAiICsgY21vZGUpOwotCi0gICAgLy8gRGV0ZXJtaW5lIEZCVS5ieXRlcwotICAgIHN3aXRjaCAoY21vZGUpIHsKLSAgICBjYXNlICJmaWxsIjoKLSAgICAgICAgd3MuclFzaGlmdDgoKTsgLy8gc2hpZnQgb2ZmIGN0bAotICAgICAgICBjb2xvciA9IHdzLnJRc2hpZnRCeXRlcyhmYl9kZXB0aCk7Ci0gICAgICAgIEZCVS5pbWdRLnB1c2goewotICAgICAgICAgICAgICAgICd0eXBlJzogJ2ZpbGwnLAotICAgICAgICAgICAgICAgICdpbWcnOiB7J2NvbXBsZXRlJzogdHJ1ZX0sCi0gICAgICAgICAgICAgICAgJ3gnOiBGQlUueCwKLSAgICAgICAgICAgICAgICAneSc6IEZCVS55LAotICAgICAgICAgICAgICAgICd3aWR0aCc6IEZCVS53aWR0aCwKLSAgICAgICAgICAgICAgICAnaGVpZ2h0JzogRkJVLmhlaWdodCwKLSAgICAgICAgICAgICAgICAnY29sb3InOiBbY29sb3JbMl0sIGNvbG9yWzFdLCBjb2xvclswXV0gfSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgInBuZyI6Ci0gICAgY2FzZSAianBlZyI6Ci0gICAgICAgIGNsZW5ndGggPSBnZXRUaWdodENMZW5ndGgod3MuclFzbGljZSgxLCA0KSk7Ci0gICAgICAgIEZCVS5ieXRlcyA9IDEgKyBjbGVuZ3RoWzBdICsgY2xlbmd0aFsxXTsgLy8gY3RsICsgY2xlbmd0aCBzaXplICsganBlZy1kYXRhCi0gICAgICAgIGlmICh3cy5yUXdhaXQoIlRJR0hUICIgKyBjbW9kZSwgRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgICAvLyBXZSBoYXZlIGV2ZXJ5dGhpbmcsIHJlbmRlciBpdAotICAgICAgICAvL1V0aWwuRGVidWcoIiAgIGpwZWcsIHdzLnJRbGVuKCk6ICIgKyB3cy5yUWxlbigpICsgIiwgY2xlbmd0aFswXTogIiArCi0gICAgICAgIC8vICAgICAgICAgICBjbGVuZ3RoWzBdICsgIiwgY2xlbmd0aFsxXTogIiArIGNsZW5ndGhbMV0pOwotICAgICAgICB3cy5yUXNoaWZ0Qnl0ZXMoMSArIGNsZW5ndGhbMF0pOyAvLyBzaGlmdCBvZmYgY3RsICsgY29tcGFjdCBsZW5ndGgKLSAgICAgICAgaW1nID0gbmV3IEltYWdlKCk7Ci0gICAgICAgIC8vaW1nLm9ubG9hZCA9IHNjYW5fdGlnaHRfaW1nUTsKLSAgICAgICAgRkJVLmltZ1EucHVzaCh7Ci0gICAgICAgICAgICAgICAgJ3R5cGUnOiAnaW1nJywKLSAgICAgICAgICAgICAgICAnaW1nJzogaW1nLAotICAgICAgICAgICAgICAgICd4JzogRkJVLngsCi0gICAgICAgICAgICAgICAgJ3knOiBGQlUueX0pOwotICAgICAgICBpbWcuc3JjID0gImRhdGE6aW1hZ2UvIiArIGNtb2RlICsKLSAgICAgICAgICAgIGV4dHJhY3RfZGF0YV91cmkod3MuclFzaGlmdEJ5dGVzKGNsZW5ndGhbMV0pKTsKLSAgICAgICAgaW1nID0gbnVsbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAiZmlsdGVyIjoKLSAgICAgICAgZmlsdGVySWQgPSByUVtyUWkgKyAxXTsKLSAgICAgICAgaWYgKGZpbHRlcklkID09PSAxKSB7Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZVBhbGV0dGUoKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZpbHRlciAwLCBDb3B5IGNvdWxkIGJlIHZhbGlkIGhlcmUsIGJ1dCBzZXJ2ZXJzIGRvbid0IHNlbmQgaXQgYXMgYW4gZXhwbGljaXQgZmlsdGVyCi0gICAgICAgICAgICAvLyBGaWx0ZXIgMiwgR3JhZGllbnQgaXMgdmFsaWQgYnV0IG5vdCB1c2VkIGlmIGpwZWcgaXMgZW5hYmxlZAotICAgICAgICAgICAgdGhyb3coIlVuc3VwcG9ydGVkIHRpZ2h0IHN1YmVuY29kaW5nIHJlY2VpdmVkLCBmaWx0ZXI6ICIgKyBmaWx0ZXJJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAiY29weSI6Ci0gICAgICAgIGlmICghaGFuZGxlQ29weSgpKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBGQlUuYnl0ZXMgPSAwOwotICAgIEZCVS5yZWN0cyAtPSAxOwotICAgIC8vVXRpbC5EZWJ1ZygiICAgZW5kaW5nIHdzLnJRc2xpY2UoMCwyMCk6ICIgKyB3cy5yUXNsaWNlKDAsMjApICsgIiAoIiArIHdzLnJRbGVuKCkgKyAiKSIpOwotICAgIC8vVXRpbC5EZWJ1ZygiPDwgZGlzcGxheV90aWdodF9wbmciKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZXh0cmFjdF9kYXRhX3VyaSA9IGZ1bmN0aW9uKGFycikgewotICAgIC8vdmFyIGksIHN0cmEgPSBbXTsKLSAgICAvL2ZvciAoaT0wOyBpPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKLSAgICAvLyAgICBzdHJhLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pKTsKLSAgICAvL30KLSAgICAvL3JldHVybiAiLCIgKyBlc2NhcGUoc3RyYS5qb2luKCcnKSk7Ci0gICAgcmV0dXJuICI7YmFzZTY0LCIgKyBCYXNlNjQuZW5jb2RlKGFycik7Ci19OwotCi1zY2FuX3RpZ2h0X2ltZ1EgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgZGF0YSwgaW1nUSwgY3R4OwotICAgIGN0eCA9IGRpc3BsYXkuZ2V0X2NvbnRleHQoKTsKLSAgICBpZiAocmZiX3N0YXRlID09PSAnbm9ybWFsJykgewotICAgICAgICBpbWdRID0gRkJVLmltZ1E7Ci0gICAgICAgIHdoaWxlICgoaW1nUS5sZW5ndGggPiAwKSAmJiAoaW1nUVswXS5pbWcuY29tcGxldGUpKSB7Ci0gICAgICAgICAgICBkYXRhID0gaW1nUS5zaGlmdCgpOwotICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpbGwnKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS5maWxsUmVjdChkYXRhLngsIGRhdGEueSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQsIGRhdGEuY29sb3IpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdyZ2InKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheS5ibGl0UmdiSW1hZ2UoZGF0YS54LCBkYXRhLnksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBkYXRhLmltZy5kYXRhLCAwKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZmJfQnBwID0gNDsKKyAgICAgICAgICAgICAgICB0aGlzLl9mYl9kZXB0aCA9IDM7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoZGF0YS5pbWcsIGRhdGEueCwgZGF0YS55KTsKKyAgICAgICAgICAgICAgICB0aGlzLl9mYl9CcHAgPSAxOworICAgICAgICAgICAgICAgIHRoaXMuX2ZiX2RlcHRoID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gUkZCLm1lc3NhZ2VzLnBpeGVsRm9ybWF0KHRoaXMuX2ZiX0JwcCwgdGhpcy5fZmJfZGVwdGgsIHRoaXMuX3RydWVfY29sb3IpOworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmNsaWVudEVuY29kaW5ncyh0aGlzLl9lbmNvZGluZ3MsIHRoaXMuX2xvY2FsX2N1cnNvciwgdGhpcy5fdHJ1ZV9jb2xvcikpOworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5jb25jYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmZiVXBkYXRlUmVxdWVzdHModGhpcy5fZGlzcGxheS5nZXRDbGVhbkRpcnR5UmVzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KSk7CisKKyAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOworICAgICAgICAgICAgdGhpcy5fdGltaW5nLnBpeGVscyA9IDA7CisgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQocmVzcG9uc2UpOworCisgICAgICAgICAgICB0aGlzLl9jaGVja0V2ZW50cygpOworCisgICAgICAgICAgICBpZiAodGhpcy5fZW5jcnlwdCkgeworICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdub3JtYWwnLCAnQ29ubmVjdGVkIChlbmNyeXB0ZWQpIHRvOiAnICsgdGhpcy5fZmJfbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdub3JtYWwnLCAnQ29ubmVjdGVkICh1bmVuY3J5cHRlZCkgdG86ICcgKyB0aGlzLl9mYl9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfaW5pdF9tc2c6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnUHJvdG9jb2xWZXJzaW9uJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9wcm90b2NvbF92ZXJzaW9uKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlICdTZWN1cml0eSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfc2VjdXJpdHkoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0F1dGhlbnRpY2F0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9hdXRoZW50aWNhdGlvbigpOworCisgICAgICAgICAgICAgICAgY2FzZSAnU2VjdXJpdHlSZXN1bHQnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlX3NlY3VyaXR5X3Jlc3VsdCgpOworCisgICAgICAgICAgICAgICAgY2FzZSAnQ2xpZW50SW5pdGlhbGlzYXRpb24nOgorICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQoW3RoaXMuX3NoYXJlZCA/IDEgOiAwXSk7IC8vIENsaWVudEluaXRpYWxpc2F0aW9uCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdTZXJ2ZXJJbml0aWFsaXNhdGlvbicsICJBdXRoZW50aWNhdGlvbiBPSyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1NlcnZlckluaXRpYWxpc2F0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9zZXJ2ZXJfaW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIF9oYW5kbGVfc2V0X2NvbG91cl9tYXBfbXNnOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBVdGlsLkRlYnVnKCJTZXRDb2xvck1hcEVudHJpZXMiKTsKKyAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwOCgpOyAgLy8gUGFkZGluZworCisgICAgICAgICAgICB2YXIgZmlyc3RfY29sb3VyID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTsKKyAgICAgICAgICAgIHZhciBudW1fY29sb3VycyA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ1NldENvbG9yTWFwRW50cmllcycsIG51bV9jb2xvdXJzICogNiwgNikpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgbnVtX2NvbG91cnM7IGMrKykgeworICAgICAgICAgICAgICAgIHZhciByZWQgPSBwYXJzZUludCh0aGlzLl9zb2NrLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7CisgICAgICAgICAgICAgICAgdmFyIGdyZWVuID0gcGFyc2VJbnQodGhpcy5fc29jay5yUXNoaWZ0MTYoKSAvIDI1NiwgMTApOworICAgICAgICAgICAgICAgIHZhciBibHVlID0gcGFyc2VJbnQodGhpcy5fc29jay5yUXNoaWZ0MTYoKSAvIDI1NiwgMTApOworICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuc2V0X2NvbG91ck1hcChbYmx1ZSwgZ3JlZW4sIHJlZF0sIGZpcnN0X2NvbG91ciArIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbC5EZWJ1ZygiY29sb3VyTWFwOiAiICsgdGhpcy5fZGlzcGxheS5nZXRfY29sb3VyTWFwKCkpOworICAgICAgICAgICAgVXRpbC5JbmZvKCJSZWdpc3RlcmVkICIgKyBudW1fY29sb3VycyArICIgY29sb3VyTWFwIGVudHJpZXMiKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZV9zZXJ2ZXJfY3V0X3RleHQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIFV0aWwuRGVidWcoIlNlcnZlckN1dFRleHQiKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgiU2VydmVyQ3V0VGV4dCBoZWFkZXIiLCA3LCAxKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7ICAvLyBQYWRkaW5nCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgiU2VydmVyQ3V0VGV4dCIsIGxlbmd0aCwgOCkpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKGxlbmd0aCk7CisgICAgICAgICAgICB0aGlzLl9vbkNsaXBib2FyZCh0aGlzLCB0ZXh0KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgX2hhbmRsZV94dnBfbXNnOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlhWUCB2ZXJzaW9uIGFuZCBtZXNzYWdlIiwgMywgMSkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcDgoKTsgIC8vIFBhZGRpbmcKKyAgICAgICAgICAgIHZhciB4dnBfdmVyID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpOworICAgICAgICAgICAgdmFyIHh2cF9tc2cgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoeHZwX21zZykgeworICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIFhWUF9GQUlMCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHRoaXMuX3JmYl9zdGF0ZSwgIk9wZXJhdGlvbiBGYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gWFZQX0lOSVQKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX3h2cF92ZXIgPSB4dnBfdmVyOworICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oIlhWUCBleHRlbnNpb25zIGVuYWJsZWQgKHZlcnNpb24gIiArIHRoaXMuX3JmYl94dnBfdmVyICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25YdnBJbml0KHRoaXMuX3JmYl94dnBfdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgiRGlzY29ubmVjdGVkOiBpbGxlZ2FsIHNlcnZlciBYVlAgbWVzc2FnZSAiICsgeHZwX21zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKworICAgICAgICBfbm9ybWFsX21zZzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIG1zZ190eXBlOworCisgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnJlY3RzID4gMCkgeworICAgICAgICAgICAgICAgIG1zZ190eXBlID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXNnX3R5cGUgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6ICAvLyBGcmFtZWJ1ZmZlclVwZGF0ZQorICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdGhpcy5fZnJhbWVidWZmZXJVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKFJGQi5tZXNzYWdlcy5mYlVwZGF0ZVJlcXVlc3RzKHRoaXMuX2Rpc3BsYXkuZ2V0Q2xlYW5EaXJ0eVJlc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGgsIHRoaXMuX2ZiX2hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBTZXRDb2xvck1hcEVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV9zZXRfY29sb3VyX21hcF9tc2coKTsKKworICAgICAgICAgICAgICAgIGNhc2UgMjogIC8vIEJlbGwKKyAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygiQmVsbCIpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkJlbGwodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSAzOiAgLy8gU2VydmVyQ3V0VGV4dAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlX3NlcnZlcl9jdXRfdGV4dCgpOworCisgICAgICAgICAgICAgICAgY2FzZSAyNTA6ICAvLyBYVlAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV94dnBfbXNnKCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKCJEaXNjb25uZWN0ZWQ6IGlsbGVnYWwgc2VydmVyIG1lc3NhZ2UgdHlwZSAiICsgbXNnX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCJzb2NrLnJRc2xpY2UoMCwgMzApOiAiICsgdGhpcy5fc29jay5yUXNsaWNlKDAsIDMwKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIF9mcmFtZWJ1ZmZlclVwZGF0ZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIHJldCA9IHRydWU7CisgICAgICAgICAgICB2YXIgbm93OworCisgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnJlY3RzID09PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJGQlUgaGVhZGVyIiwgMywgMSkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXA4KCk7ICAvLyBQYWRkaW5nCisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5jdXJfZmJ1ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCJGaXJzdCBGQlUgbGF0ZW5jeTogIiArIChub3cgLSB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAodGhpcy5fRkJVLnJlY3RzID4gMCkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfc3RhdGUgIT09ICJub3JtYWwiKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJGQlUiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuYnl0ZXMgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJyZWN0IGhlYWRlciIsIDEyKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICAgICAgLyogTmV3IEZyYW1lYnVmZmVyVXBkYXRlICovCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGhkciA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKDEyKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnggICAgICAgID0gKGhkclswXSA8PCA4KSArIGhkclsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnkgICAgICAgID0gKGhkclsyXSA8PCA4KSArIGhkclszXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLndpZHRoICAgID0gKGhkcls0XSA8PCA4KSArIGhkcls1XTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmhlaWdodCAgID0gKGhkcls2XSA8PCA4KSArIGhkcls3XTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmVuY29kaW5nID0gcGFyc2VJbnQoKGhkcls4XSA8PCAyNCkgKyAoaGRyWzldIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZHJbMTBdIDw8IDgpICsgaGRyWzExXSwgMTApOworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRkJVUmVjZWl2ZSh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgeyd4JzogdGhpcy5fRkJVLngsICd5JzogdGhpcy5fRkJVLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLCAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnOiB0aGlzLl9GQlUuZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nTmFtZSc6IHRoaXMuX2VuY05hbWVzW3RoaXMuX0ZCVS5lbmNvZGluZ119KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2VuY05hbWVzW3RoaXMuX0ZCVS5lbmNvZGluZ10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoIkRpc2Nvbm5lY3RlZDogdW5zdXBwb3J0ZWQgZW5jb2RpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5lbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcubGFzdF9mYnUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOworCisgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fZW5jSGFuZGxlcnNbdGhpcy5fRkJVLmVuY29kaW5nXSgpOworCisgICAgICAgICAgICAgICAgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuY3VyX2ZidSArPSAobm93IC0gdGhpcy5fdGltaW5nLmxhc3RfZmJ1KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jU3RhdHNbdGhpcy5fRkJVLmVuY29kaW5nXVswXSsrOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNTdGF0c1t0aGlzLl9GQlUuZW5jb2RpbmddWzFdKys7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5waXhlbHMgKz0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fRkJVLmhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGltaW5nLnBpeGVscyA+PSAodGhpcy5fZmJfd2lkdGggKiB0aGlzLl9mYl9oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5fRkJVLndpZHRoID09PSB0aGlzLl9mYl93aWR0aCAmJiB0aGlzLl9GQlUuaGVpZ2h0ID09PSB0aGlzLl9mYl9oZWlnaHQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X3RvdGFsICs9IHRoaXMuX3RpbWluZy5jdXJfZmJ1OworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCJUaW1pbmcgb2YgZnVsbCBGQlUsIGN1cnI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5jdXJfZmJ1ICsgIiwgdG90YWw6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mdWxsX2ZidV90b3RhbCArICIsIGNudDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCArICIsIGF2ZzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3RpbWluZy5mdWxsX2ZidV90b3RhbCAvIHRoaXMuX3RpbWluZy5mdWxsX2ZidV9jbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZidV9ydF9kaWZmID0gbm93IC0gdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgKz0gZmJ1X3J0X2RpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X2NudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCJmdWxsIEZCVSByb3VuZC10cmlwLCBjdXI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZidV9ydF9kaWZmICsgIiwgdG90YWw6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgKyAiLCBjbnQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfY250ICsgIiwgYXZnOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fdGltaW5nLmZidV9ydF90b3RhbCAvIHRoaXMuX3RpbWluZy5mYnVfcnRfY250KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghcmV0KSB7IHJldHVybiByZXQ7IH0gIC8vIG5lZWQgbW9yZSBkYXRhCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX29uRkJVQ29tcGxldGUodGhpcywKKyAgICAgICAgICAgICAgICAgICAgeyd4JzogdGhpcy5fRkJVLngsICd5JzogdGhpcy5fRkJVLnksCisgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLl9GQlUud2lkdGgsICdoZWlnaHQnOiB0aGlzLl9GQlUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJzogdGhpcy5fRkJVLmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nTmFtZSc6IHRoaXMuX2VuY05hbWVzW3RoaXMuX0ZCVS5lbmNvZGluZ119KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBXZSBmaW5pc2hlZCB0aGlzIEZCVQorICAgICAgICB9LAorICAgIH07CisKKyAgICBVdGlsLm1ha2VfcHJvcGVydGllcyhSRkIsIFsKKyAgICAgICAgWyd0YXJnZXQnLCAnd28nLCAnZG9tJ10sICAgICAgICAgICAgICAgIC8vIFZOQyBkaXNwbGF5IHJlbmRlcmluZyBDYW52YXMgb2JqZWN0CisgICAgICAgIFsnZm9jdXNDb250YWluZXInLCAnd28nLCAnZG9tJ10sICAgICAgICAvLyBET00gZWxlbWVudCB0aGF0IGNhcHR1cmVzIGtleWJvYXJkIGlucHV0CisgICAgICAgIFsnZW5jcnlwdCcsICdydycsICdib29sJ10sICAgICAgICAgICAgICAvLyBVc2UgVExTL1NTTC93c3MgZW5jcnlwdGlvbgorICAgICAgICBbJ3RydWVfY29sb3InLCAncncnLCAnYm9vbCddLCAgICAgICAgICAgLy8gUmVxdWVzdCB0cnVlIGNvbG9yIHBpeGVsIGRhdGEKKyAgICAgICAgWydsb2NhbF9jdXJzb3InLCAncncnLCAnYm9vbCddLCAgICAgICAgIC8vIFJlcXVlc3QgbG9jYWxseSByZW5kZXJlZCBjdXJzb3IKKyAgICAgICAgWydzaGFyZWQnLCAncncnLCAnYm9vbCddLCAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgc2hhcmVkIG1vZGUKKyAgICAgICAgWyd2aWV3X29ubHknLCAncncnLCAnYm9vbCddLCAgICAgICAgICAgIC8vIERpc2FibGUgY2xpZW50IG1vdXNlL2tleWJvYXJkCisgICAgICAgIFsneHZwX3Bhc3N3b3JkX3NlcCcsICdydycsICdzdHInXSwgICAgICAvLyBTZXBhcmF0b3IgZm9yIFhWUCBwYXNzd29yZCBmaWVsZHMKKyAgICAgICAgWydkaXNjb25uZWN0VGltZW91dCcsICdydycsICdpbnQnXSwgICAgIC8vIFRpbWUgKHMpIHRvIHdhaXQgZm9yIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgWyd3c1Byb3RvY29scycsICdydycsICdhcnInXSwgICAgICAgICAgIC8vIFByb3RvY29scyB0byB1c2UgaW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uCisgICAgICAgIFsncmVwZWF0ZXJJRCcsICdydycsICdzdHInXSwgICAgICAgICAgICAvLyBbVWx0cmFWTkNdIFJlcGVhdGVySUQgdG8gY29ubmVjdCB0bworICAgICAgICBbJ3ZpZXdwb3J0RHJhZycsICdydycsICdib29sJ10sICAgICAgICAgLy8gTW92ZSB0aGUgdmlld3BvcnQgb24gbW91c2UgZHJhZ3MKKworICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbnMKKyAgICAgICAgWydvblVwZGF0ZVN0YXRlJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgIC8vIG9uVXBkYXRlU3RhdGUocmZiLCBzdGF0ZSwgb2xkc3RhdGUsIHN0YXR1c01zZyk6IFJGQiBzdGF0ZSB1cGRhdGUvY2hhbmdlCisgICAgICAgIFsnb25QYXNzd29yZFJlcXVpcmVkJywgJ3J3JywgJ2Z1bmMnXSwgICAvLyBvblBhc3N3b3JkUmVxdWlyZWQocmZiKTogVk5DIHBhc3N3b3JkIGlzIHJlcXVpcmVkCisgICAgICAgIFsnb25DbGlwYm9hcmQnLCAncncnLCAnZnVuYyddLCAgICAgICAgICAvLyBvbkNsaXBib2FyZChyZmIsIHRleHQpOiBSRkIgY2xpcGJvYXJkIGNvbnRlbnRzIHJlY2VpdmVkCisgICAgICAgIFsnb25CZWxsJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgICAgICAgICAvLyBvbkJlbGwocmZiKTogUkZCIEJlbGwgbWVzc2FnZSByZWNlaXZlZAorICAgICAgICBbJ29uRkJVUmVjZWl2ZScsICdydycsICdmdW5jJ10sICAgICAgICAgLy8gb25GQlVSZWNlaXZlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWQKKyAgICAgICAgWydvbkZCVUNvbXBsZXRlJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgIC8vIG9uRkJVQ29tcGxldGUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQKKyAgICAgICAgWydvbkZCUmVzaXplJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgICAgIC8vIG9uRkJSZXNpemUocmZiLCB3aWR0aCwgaGVpZ2h0KTogZnJhbWUgYnVmZmVyIHJlc2l6ZWQKKyAgICAgICAgWydvbkRlc2t0b3BOYW1lJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgIC8vIG9uRGVza3RvcE5hbWUocmZiLCBuYW1lKTogZGVza3RvcCBuYW1lIHJlY2VpdmVkCisgICAgICAgIFsnb25YdnBJbml0JywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgICAgICAvLyBvblh2cEluaXQodmVyc2lvbik6IFhWUCBleHRlbnNpb25zIGFjdGl2ZSBmb3IgdGhpcyBjb25uZWN0aW9uCisgICAgXSk7CisKKyAgICBSRkIucHJvdG90eXBlLnNldF9sb2NhbF9jdXJzb3IgPSBmdW5jdGlvbiAoY3Vyc29yKSB7CisgICAgICAgIGlmICghY3Vyc29yIHx8IChjdXJzb3IgaW4geycwJzogMSwgJ25vJzogMSwgJ2ZhbHNlJzogMX0pKSB7CisgICAgICAgICAgICB0aGlzLl9sb2NhbF9jdXJzb3IgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5LmdldF9jdXJzb3JfdXJpKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbF9jdXJzb3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVdGlsLldhcm4oIkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBjdXJzb3IiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBzZXRUaW1lb3V0KHNjYW5fdGlnaHRfaW1nUSwgc2Nhbl9pbWdRX3JhdGUpOwotICAgIH0KLX07CisgICAgfTsKIAotZW5jSGFuZGxlcnMuVElHSFQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNwbGF5X3RpZ2h0KGZhbHNlKTsgfTsKLWVuY0hhbmRsZXJzLlRJR0hUX1BORyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXlfdGlnaHQodHJ1ZSk7IH07CisgICAgUkZCLnByb3RvdHlwZS5nZXRfZGlzcGxheSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2Rpc3BsYXk7IH07CisgICAgUkZCLnByb3RvdHlwZS5nZXRfa2V5Ym9hcmQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlib2FyZDsgfTsKKyAgICBSRkIucHJvdG90eXBlLmdldF9tb3VzZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21vdXNlOyB9OwogCi1lbmNIYW5kbGVycy5sYXN0X3JlY3QgPSBmdW5jdGlvbiBsYXN0X3JlY3QoKSB7Ci0gICAgVXRpbC5EZWJ1ZygiPj4gc2V0X2Rlc2t0b3BzaXplIik7Ci0gICAgRkJVLnJlY3RzID0gMDsKLSAgICBVdGlsLkRlYnVnKCI8PCBzZXRfZGVza3RvcHNpemUiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX07CisgICAgLy8gQ2xhc3MgTWV0aG9kcworICAgIFJGQi5tZXNzYWdlcyA9IHsKKyAgICAgICAga2V5RXZlbnQ6IGZ1bmN0aW9uIChrZXlzeW0sIGRvd24pIHsKKyAgICAgICAgICAgIHZhciBhcnIgPSBbNF07CisgICAgICAgICAgICBhcnIucHVzaDgoZG93bik7CisgICAgICAgICAgICBhcnIucHVzaDE2KDApOworICAgICAgICAgICAgYXJyLnB1c2gzMihrZXlzeW0pOworICAgICAgICAgICAgcmV0dXJuIGFycjsKKyAgICAgICAgfSwKIAotZW5jSGFuZGxlcnMuRGVza3RvcFNpemUgPSBmdW5jdGlvbiBzZXRfZGVza3RvcHNpemUoKSB7Ci0gICAgVXRpbC5EZWJ1ZygiPj4gc2V0X2Rlc2t0b3BzaXplIik7Ci0gICAgZmJfd2lkdGggPSBGQlUud2lkdGg7Ci0gICAgZmJfaGVpZ2h0ID0gRkJVLmhlaWdodDsKLSAgICBkaXNwbGF5LnJlc2l6ZShmYl93aWR0aCwgZmJfaGVpZ2h0KTsKLSAgICB0aW1pbmcuZmJ1X3J0X3N0YXJ0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLSAgICAvLyBTZW5kIGEgbmV3IG5vbi1pbmNyZW1lbnRhbCByZXF1ZXN0Ci0gICAgd3Muc2VuZChmYlVwZGF0ZVJlcXVlc3RzKCkpOworICAgICAgICBwb2ludGVyRXZlbnQ6IGZ1bmN0aW9uICh4LCB5LCBtYXNrKSB7CisgICAgICAgICAgICB2YXIgYXJyID0gWzVdOyAgLy8gbXNnLXR5cGUKKyAgICAgICAgICAgIGFyci5wdXNoOChtYXNrKTsKKyAgICAgICAgICAgIGFyci5wdXNoMTYoeCk7CisgICAgICAgICAgICBhcnIucHVzaDE2KHkpOworICAgICAgICAgICAgcmV0dXJuIGFycjsKKyAgICAgICAgfSwKIAotICAgIEZCVS5ieXRlcyA9IDA7Ci0gICAgRkJVLnJlY3RzIC09IDE7CisgICAgICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogbWFrZSB0aGlzIHVuaWNvZGUgY29tcGF0aWJsZT8KKyAgICAgICAgY2xpZW50Q3V0VGV4dDogZnVuY3Rpb24gKHRleHQpIHsKKyAgICAgICAgICAgIHZhciBhcnIgPSBbNl07ICAvLyBtc2ctdHlwZQorICAgICAgICAgICAgYXJyLnB1c2g4KDApOyAgIC8vIHBhZGRpbmcKKyAgICAgICAgICAgIGFyci5wdXNoOCgwKTsgICAvLyBwYWRkaW5nCisgICAgICAgICAgICBhcnIucHVzaDgoMCk7ICAgLy8gcGFkZGluZworICAgICAgICAgICAgYXJyLnB1c2gzMih0ZXh0Lmxlbmd0aCk7CisgICAgICAgICAgICB2YXIgbiA9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhcnIucHVzaCh0ZXh0LmNoYXJDb2RlQXQoaSkpOworICAgICAgICAgICAgfQogCi0gICAgVXRpbC5EZWJ1ZygiPDwgc2V0X2Rlc2t0b3BzaXplIik7Ci0gICAgcmV0dXJuIHRydWU7Ci19OworICAgICAgICAgICAgcmV0dXJuIGFycjsKKyAgICAgICAgfSwKIAotZW5jSGFuZGxlcnMuQ3Vyc29yID0gZnVuY3Rpb24gc2V0X2N1cnNvcigpIHsKLSAgICB2YXIgeCwgeSwgdywgaCwgcGl4ZWxzbGVuZ3RoLCBtYXNrbGVuZ3RoOwotICAgIC8vVXRpbC5EZWJ1ZygiPj4gc2V0X2N1cnNvciIpOwotICAgIHggPSBGQlUueDsgIC8vIGhvdHNwb3QteAotICAgIHkgPSBGQlUueTsgIC8vIGhvdHNwb3QteQotICAgIHcgPSBGQlUud2lkdGg7Ci0gICAgaCA9IEZCVS5oZWlnaHQ7CisgICAgICAgIHBpeGVsRm9ybWF0OiBmdW5jdGlvbiAoYnBwLCBkZXB0aCwgdHJ1ZV9jb2xvcikgeworICAgICAgICAgICAgdmFyIGFyciA9IFswXTsgLy8gbXNnLXR5cGUKKyAgICAgICAgICAgIGFyci5wdXNoOCgwKTsgIC8vIHBhZGRpbmcKKyAgICAgICAgICAgIGFyci5wdXNoOCgwKTsgIC8vIHBhZGRpbmcKKyAgICAgICAgICAgIGFyci5wdXNoOCgwKTsgIC8vIHBhZGRpbmcKIAotICAgIHBpeGVsc2xlbmd0aCA9IHcgKiBoICogZmJfQnBwOwotICAgIG1hc2tsZW5ndGggPSBNYXRoLmZsb29yKCh3ICsgNykgLyA4KSAqIGg7CisgICAgICAgICAgICBhcnIucHVzaDgoYnBwICogOCk7IC8vIGJpdHMtcGVyLXBpeGVsCisgICAgICAgICAgICBhcnIucHVzaDgoZGVwdGggKiA4KTsgLy8gZGVwdGgKKyAgICAgICAgICAgIGFyci5wdXNoOCgwKTsgIC8vIGxpdHRsZS1lbmRpYW4KKyAgICAgICAgICAgIGFyci5wdXNoOCh0cnVlX2NvbG9yID8gMSA6IDApOyAgLy8gdHJ1ZS1jb2xvcgogCi0gICAgRkJVLmJ5dGVzID0gcGl4ZWxzbGVuZ3RoICsgbWFza2xlbmd0aDsKLSAgICBpZiAod3MuclF3YWl0KCJjdXJzb3IgZW5jb2RpbmciLCBGQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYXJyLnB1c2gxNigyNTUpOyAgLy8gcmVkLW1heAorICAgICAgICAgICAgYXJyLnB1c2gxNigyNTUpOyAgLy8gZ3JlZW4tbWF4CisgICAgICAgICAgICBhcnIucHVzaDE2KDI1NSk7ICAvLyBibHVlLW1heAorICAgICAgICAgICAgYXJyLnB1c2g4KDE2KTsgICAgLy8gcmVkLXNoaWZ0CisgICAgICAgICAgICBhcnIucHVzaDgoOCk7ICAgICAvLyBncmVlbi1zaGlmdAorICAgICAgICAgICAgYXJyLnB1c2g4KDApOyAgICAgLy8gYmx1ZS1zaGlmdAogCi0gICAgLy9VdGlsLkRlYnVnKCIgICBzZXRfY3Vyc29yLCB4OiAiICsgeCArICIsIHk6ICIgKyB5ICsgIiwgdzogIiArIHcgKyAiLCBoOiAiICsgaCk7CisgICAgICAgICAgICBhcnIucHVzaDgoMCk7ICAgICAvLyBwYWRkaW5nCisgICAgICAgICAgICBhcnIucHVzaDgoMCk7ICAgICAvLyBwYWRkaW5nCisgICAgICAgICAgICBhcnIucHVzaDgoMCk7ICAgICAvLyBwYWRkaW5nCisgICAgICAgICAgICByZXR1cm4gYXJyOworICAgICAgICB9LAogCi0gICAgZGlzcGxheS5jaGFuZ2VDdXJzb3Iod3MuclFzaGlmdEJ5dGVzKHBpeGVsc2xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuclFzaGlmdEJ5dGVzKG1hc2tsZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHcsIGgpOworICAgICAgICBjbGllbnRFbmNvZGluZ3M6IGZ1bmN0aW9uIChlbmNvZGluZ3MsIGxvY2FsX2N1cnNvciwgdHJ1ZV9jb2xvcikgeworICAgICAgICAgICAgdmFyIGksIGVuY0xpc3QgPSBbXTsKIAotICAgIEZCVS5ieXRlcyA9IDA7Ci0gICAgRkJVLnJlY3RzIC09IDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc1tpXVswXSA9PT0gIkN1cnNvciIgJiYgIWxvY2FsX2N1cnNvcikgeworICAgICAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCJTa2lwcGluZyBDdXJzb3IgcHNldWRvLWVuY29kaW5nIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZ3NbaV1bMF0gPT09ICJUSUdIVCIgJiYgIXRydWVfY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiB3ZSBoYXZlIHRpZ2h0K25vbi10cnVlLWNvbG9yCisgICAgICAgICAgICAgICAgICAgIFV0aWwuV2FybigiU2tpcHBpbmcgdGlnaHQgYXMgaXQgaXMgb25seSBzdXBwb3J0ZWQgd2l0aCB0cnVlIGNvbG9yIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jTGlzdC5wdXNoKGVuY29kaW5nc1tpXVsxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgLy9VdGlsLkRlYnVnKCI8PCBzZXRfY3Vyc29yIik7Ci0gICAgcmV0dXJuIHRydWU7Ci19OworICAgICAgICAgICAgdmFyIGFyciA9IFsyXTsgIC8vIG1zZy10eXBlCisgICAgICAgICAgICBhcnIucHVzaDgoMCk7ICAgLy8gcGFkZGluZwogCi1lbmNIYW5kbGVycy5KUEVHX3F1YWxpdHlfbG8gPSBmdW5jdGlvbiBzZXRfanBlZ19xdWFsaXR5KCkgewotICAgIFV0aWwuRXJyb3IoIlNlcnZlciBzZW50IGpwZWdfcXVhbGl0eSBwc2V1ZG8tZW5jb2RpbmciKTsKLX07CisgICAgICAgICAgICBhcnIucHVzaDE2KGVuY0xpc3QubGVuZ3RoKTsgIC8vIGVuY29kaW5nIGNvdW50CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jTGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFyci5wdXNoMzIoZW5jTGlzdFtpXSk7CisgICAgICAgICAgICB9CiAKLWVuY0hhbmRsZXJzLmNvbXByZXNzX2xvID0gZnVuY3Rpb24gc2V0X2NvbXByZXNzX2xldmVsKCkgewotICAgIFV0aWwuRXJyb3IoIlNlcnZlciBzZW50IGNvbXByZXNzIGxldmVsIHBzZXVkby1lbmNvZGluZyIpOwotfTsKKyAgICAgICAgICAgIHJldHVybiBhcnI7CisgICAgICAgIH0sCiAKLS8qCi0gKiBDbGllbnQgbWVzc2FnZSByb3V0aW5lcwotICovCisgICAgICAgIGZiVXBkYXRlUmVxdWVzdHM6IGZ1bmN0aW9uIChjbGVhbkRpcnR5LCBmYl93aWR0aCwgZmJfaGVpZ2h0KSB7CisgICAgICAgICAgICB2YXIgYXJyID0gW107CiAKLXBpeGVsRm9ybWF0ID0gZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBwaXhlbEZvcm1hdCIpOwotICAgIHZhciBhcnI7Ci0gICAgYXJyID0gWzBdOyAgICAgLy8gbXNnLXR5cGUKLSAgICBhcnIucHVzaDgoMCk7ICAvLyBwYWRkaW5nCi0gICAgYXJyLnB1c2g4KDApOyAgLy8gcGFkZGluZwotICAgIGFyci5wdXNoOCgwKTsgIC8vIHBhZGRpbmcKKyAgICAgICAgICAgIHZhciBjYiA9IGNsZWFuRGlydHkuY2xlYW5Cb3g7CisgICAgICAgICAgICB2YXIgdywgaDsKKyAgICAgICAgICAgIGlmIChjYi53ID4gMCAmJiBjYi5oID4gMCkgeworICAgICAgICAgICAgICAgIHcgPSB0eXBlb2YgY2IudyA9PT0gInVuZGVmaW5lZCIgPyBmYl93aWR0aCA6IGNiLnc7CisgICAgICAgICAgICAgICAgaCA9IHR5cGVvZiBjYi5oID09PSAidW5kZWZpbmVkIiA/IGZiX2hlaWdodCA6IGNiLmg7CisgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBpbmNyZW1lbnRhbCBmb3IgY2xlYW4gYm94CisgICAgICAgICAgICAgICAgYXJyID0gYXJyLmNvbmNhdChSRkIubWVzc2FnZXMuZmJVcGRhdGVSZXF1ZXN0KDEsIGNiLngsIGNiLnksIHcsIGgpKTsKKyAgICAgICAgICAgIH0KIAotICAgIGFyci5wdXNoOChmYl9CcHAgKiA4KTsgLy8gYml0cy1wZXItcGl4ZWwKLSAgICBhcnIucHVzaDgoZmJfZGVwdGggKiA4KTsgLy8gZGVwdGgKLSAgICBhcnIucHVzaDgoMCk7ICAvLyBsaXR0bGUtZW5kaWFuCi0gICAgYXJyLnB1c2g4KGNvbmYudHJ1ZV9jb2xvciA/IDEgOiAwKTsgIC8vIHRydWUtY29sb3IKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xlYW5EaXJ0eS5kaXJ0eUJveGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGRiID0gY2xlYW5EaXJ0eS5kaXJ0eUJveGVzW2ldOworICAgICAgICAgICAgICAgIC8vIEZvcmNlIGFsbCAobm9uLWluY3JlbWVudGFsKSBmb3IgZGlydHkgYm94CisgICAgICAgICAgICAgICAgdyA9IHR5cGVvZiBkYi53ID09PSAidW5kZWZpbmVkIiA/IGZiX3dpZHRoIDogZGIudzsKKyAgICAgICAgICAgICAgICBoID0gdHlwZW9mIGRiLmggPT09ICJ1bmRlZmluZWQiID8gZmJfaGVpZ2h0IDogZGIuaDsKKyAgICAgICAgICAgICAgICBhcnIgPSBhcnIuY29uY2F0KFJGQi5tZXNzYWdlcy5mYlVwZGF0ZVJlcXVlc3QoMCwgZGIueCwgZGIueSwgdywgaCkpOworICAgICAgICAgICAgfQogCi0gICAgYXJyLnB1c2gxNigyNTUpOyAgLy8gcmVkLW1heAotICAgIGFyci5wdXNoMTYoMjU1KTsgIC8vIGdyZWVuLW1heAotICAgIGFyci5wdXNoMTYoMjU1KTsgIC8vIGJsdWUtbWF4Ci0gICAgYXJyLnB1c2g4KDE2KTsgICAgLy8gcmVkLXNoaWZ0Ci0gICAgYXJyLnB1c2g4KDgpOyAgICAgLy8gZ3JlZW4tc2hpZnQKLSAgICBhcnIucHVzaDgoMCk7ICAgICAvLyBibHVlLXNoaWZ0CisgICAgICAgICAgICByZXR1cm4gYXJyOworICAgICAgICB9LAogCi0gICAgYXJyLnB1c2g4KDApOyAgICAgLy8gcGFkZGluZwotICAgIGFyci5wdXNoOCgwKTsgICAgIC8vIHBhZGRpbmcKLSAgICBhcnIucHVzaDgoMCk7ICAgICAvLyBwYWRkaW5nCi0gICAgLy9VdGlsLkRlYnVnKCI8PCBwaXhlbEZvcm1hdCIpOwotICAgIHJldHVybiBhcnI7Ci19OworICAgICAgICBmYlVwZGF0ZVJlcXVlc3Q6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCwgeCwgeSwgdywgaCkgeworICAgICAgICAgICAgaWYgKHR5cGVvZih4KSA9PT0gInVuZGVmaW5lZCIpIHsgeCA9IDA7IH0KKyAgICAgICAgICAgIGlmICh0eXBlb2YoeSkgPT09ICJ1bmRlZmluZWQiKSB7IHkgPSAwOyB9CiAKLWNsaWVudEVuY29kaW5ncyA9IGZ1bmN0aW9uKCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gY2xpZW50RW5jb2RpbmdzIik7Ci0gICAgdmFyIGFyciwgaSwgZW5jTGlzdCA9IFtdOworICAgICAgICAgICAgdmFyIGFyciA9IFszXTsgIC8vIG1zZy10eXBlCisgICAgICAgICAgICBhcnIucHVzaDgoaW5jcmVtZW50YWwpOworICAgICAgICAgICAgYXJyLnB1c2gxNih4KTsKKyAgICAgICAgICAgIGFyci5wdXNoMTYoeSk7CisgICAgICAgICAgICBhcnIucHVzaDE2KHcpOworICAgICAgICAgICAgYXJyLnB1c2gxNihoKTsKIAotICAgIGZvciAoaT0wOyBpPGVuY29kaW5ncy5sZW5ndGg7IGkgKz0gMSkgewotICAgICAgICBpZiAoKGVuY29kaW5nc1tpXVswXSA9PT0gIkN1cnNvciIpICYmCi0gICAgICAgICAgICAoISBjb25mLmxvY2FsX2N1cnNvcikpIHsKLSAgICAgICAgICAgIFV0aWwuRGVidWcoIlNraXBwaW5nIEN1cnNvciBwc2V1ZG8tZW5jb2RpbmciKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiQWRkaW5nIGVuY29kaW5nOiAiICsgZW5jb2RpbmdzW2ldWzBdKTsKLSAgICAgICAgICAgIGVuY0xpc3QucHVzaChlbmNvZGluZ3NbaV1bMV0pOworICAgICAgICAgICAgcmV0dXJuIGFycjsKICAgICAgICAgfQotICAgIH0KKyAgICB9OwogCi0gICAgYXJyID0gWzJdOyAgICAgLy8gbXNnLXR5cGUKLSAgICBhcnIucHVzaDgoMCk7ICAvLyBwYWRkaW5nCisgICAgUkZCLmdlbkRFUyA9IGZ1bmN0aW9uIChwYXNzd29yZCwgY2hhbGxlbmdlKSB7CisgICAgICAgIHZhciBwYXNzd2QgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGFzc3dkLnB1c2gocGFzc3dvcmQuY2hhckNvZGVBdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChuZXcgREVTKHBhc3N3ZCkpLmVuY3J5cHQoY2hhbGxlbmdlKTsKKyAgICB9OwogCi0gICAgYXJyLnB1c2gxNihlbmNMaXN0Lmxlbmd0aCk7IC8vIGVuY29kaW5nIGNvdW50Ci0gICAgZm9yIChpPTA7IGkgPCBlbmNMaXN0Lmxlbmd0aDsgaSArPSAxKSB7Ci0gICAgICAgIGFyci5wdXNoMzIoZW5jTGlzdFtpXSk7Ci0gICAgfQotICAgIC8vVXRpbC5EZWJ1ZygiPDwgY2xpZW50RW5jb2RpbmdzOiAiICsgYXJyKTsKLSAgICByZXR1cm4gYXJyOwotfTsKKyAgICBSRkIuZXh0cmFjdF9kYXRhX3VyaSA9IGZ1bmN0aW9uIChhcnIpIHsKKyAgICAgICAgcmV0dXJuICI7YmFzZTY0LCIgKyBCYXNlNjQuZW5jb2RlKGFycik7CisgICAgfTsKIAotZmJVcGRhdGVSZXF1ZXN0ID0gZnVuY3Rpb24oaW5jcmVtZW50YWwsIHgsIHksIHh3LCB5dykgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZmJVcGRhdGVSZXF1ZXN0Iik7Ci0gICAgaWYgKHR5cGVvZih4KSA9PT0gInVuZGVmaW5lZCIpIHsgeCA9IDA7IH0KLSAgICBpZiAodHlwZW9mKHkpID09PSAidW5kZWZpbmVkIikgeyB5ID0gMDsgfQotICAgIGlmICh0eXBlb2YoeHcpID09PSAidW5kZWZpbmVkIikgeyB4dyA9IGZiX3dpZHRoOyB9Ci0gICAgaWYgKHR5cGVvZih5dykgPT09ICJ1bmRlZmluZWQiKSB7IHl3ID0gZmJfaGVpZ2h0OyB9Ci0gICAgdmFyIGFycjsKLSAgICBhcnIgPSBbM107ICAvLyBtc2ctdHlwZQotICAgIGFyci5wdXNoOChpbmNyZW1lbnRhbCk7Ci0gICAgYXJyLnB1c2gxNih4KTsKLSAgICBhcnIucHVzaDE2KHkpOwotICAgIGFyci5wdXNoMTYoeHcpOwotICAgIGFyci5wdXNoMTYoeXcpOwotICAgIC8vVXRpbC5EZWJ1ZygiPDwgZmJVcGRhdGVSZXF1ZXN0Iik7Ci0gICAgcmV0dXJuIGFycjsKLX07CisgICAgUkZCLmVuY29kaW5nSGFuZGxlcnMgPSB7CisgICAgICAgIFJBVzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5saW5lcyA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5saW5lcyA9IHRoaXMuX0ZCVS5oZWlnaHQ7CisgICAgICAgICAgICB9CiAKLS8vIEJhc2VkIG9uIGNsZWFuL2RpcnR5IGFyZWFzLCBnZW5lcmF0ZSByZXF1ZXN0cyB0byBzZW5kCi1mYlVwZGF0ZVJlcXVlc3RzID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNsZWFuRGlydHkgPSBkaXNwbGF5LmdldENsZWFuRGlydHlSZXNldCgpLAotICAgICAgICBhcnIgPSBbXSwgaSwgY2IsIGRiOworICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fZmJfQnBwOyAgLy8gYXQgbGVhc3QgYSBsaW5lCisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlJBVyIsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2YXIgY3VyX3kgPSB0aGlzLl9GQlUueSArICh0aGlzLl9GQlUuaGVpZ2h0IC0gdGhpcy5fRkJVLmxpbmVzKTsKKyAgICAgICAgICAgIHZhciBjdXJyX2hlaWdodCA9IE1hdGgubWluKHRoaXMuX0ZCVS5saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5fc29jay5yUWxlbigpIC8gKHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX2ZiX0JwcCkpKTsKKyAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdEltYWdlKHRoaXMuX0ZCVS54LCBjdXJfeSwgdGhpcy5fRkJVLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9oZWlnaHQsIHRoaXMuX3NvY2suZ2V0X3JRKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLmdldF9yUWkoKSk7CisgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKHRoaXMuX0ZCVS53aWR0aCAqIGN1cnJfaGVpZ2h0ICogdGhpcy5fZmJfQnBwKTsKKyAgICAgICAgICAgIHRoaXMuX0ZCVS5saW5lcyAtPSBjdXJyX2hlaWdodDsKIAotICAgIGNiID0gY2xlYW5EaXJ0eS5jbGVhbkJveDsKLSAgICBpZiAoY2IudyA+IDAgJiYgY2IuaCA+IDApIHsKLSAgICAgICAgLy8gUmVxdWVzdCBpbmNyZW1lbnRhbCBmb3IgY2xlYW4gYm94Ci0gICAgICAgIGFyciA9IGFyci5jb25jYXQoZmJVcGRhdGVSZXF1ZXN0KDEsIGNiLngsIGNiLnksIGNiLncsIGNiLmgpKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGNsZWFuRGlydHkuZGlydHlCb3hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBkYiA9IGNsZWFuRGlydHkuZGlydHlCb3hlc1tpXTsKLSAgICAgICAgLy8gRm9yY2UgYWxsIChub24taW5jcmVtZW50YWwgZm9yIGRpcnR5IGJveAotICAgICAgICBhcnIgPSBhcnIuY29uY2F0KGZiVXBkYXRlUmVxdWVzdCgwLCBkYi54LCBkYi55LCBkYi53LCBkYi5oKSk7Ci0gICAgfQotICAgIHJldHVybiBhcnI7Ci19OworICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5saW5lcyA+IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSB0aGlzLl9GQlUud2lkdGggKiB0aGlzLl9mYl9CcHA7ICAvLyBBdCBsZWFzdCBhbm90aGVyIGxpbmUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgQ09QWVJFQ1Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDQ7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIkNPUFlSRUNUIiwgNCkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LnJlbmRlclFfcHVzaCh7CisgICAgICAgICAgICAgICAgJ3R5cGUnOiAnY29weScsCisgICAgICAgICAgICAgICAgJ29sZF94JzogdGhpcy5fc29jay5yUXNoaWZ0MTYoKSwKKyAgICAgICAgICAgICAgICAnb2xkX3knOiB0aGlzLl9zb2NrLnJRc2hpZnQxNigpLAorICAgICAgICAgICAgICAgICd4JzogdGhpcy5fRkJVLngsCisgICAgICAgICAgICAgICAgJ3knOiB0aGlzLl9GQlUueSwKKyAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLl9GQlUud2lkdGgsCisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IHRoaXMuX0ZCVS5oZWlnaHQKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07CisgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgUlJFOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgY29sb3I7CisgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YnJlY3RzID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gNCArIHRoaXMuX2ZiX0JwcDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlJSRSIsIDQgKyB0aGlzLl9mYl9CcHApKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJyZWN0cyA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7CisgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyh0aGlzLl9mYl9CcHApOyAgLy8gQmFja2dyb3VuZAorICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QodGhpcy5fRkJVLngsIHRoaXMuX0ZCVS55LCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQsIGNvbG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKHRoaXMuX0ZCVS5zdWJyZWN0cyA+IDAgJiYgdGhpcy5fc29jay5yUWxlbigpID49ICh0aGlzLl9mYl9CcHAgKyA4KSkgeworICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXModGhpcy5fZmJfQnBwKTsKKyAgICAgICAgICAgICAgICB2YXIgeCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7CisgICAgICAgICAgICAgICAgdmFyIHkgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpOworICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7CisgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7CisgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5maWxsUmVjdCh0aGlzLl9GQlUueCArIHgsIHRoaXMuX0ZCVS55ICsgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IpOworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJyZWN0cy0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YnJlY3RzID4gMCkgeworICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IE1hdGgubWluKHRoaXMuX3JyZV9jaHVua19zeiwgdGhpcy5fRkJVLnN1YnJlY3RzKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAodGhpcy5fZmJfQnBwICsgOCkgKiBjaHVuazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCisKKyAgICAgICAgSEVYVElMRTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIHJRID0gdGhpcy5fc29jay5nZXRfclEoKTsKKyAgICAgICAgICAgIHZhciByUWkgPSB0aGlzLl9zb2NrLmdldF9yUWkoKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS50aWxlcyA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlc194ID0gTWF0aC5jZWlsKHRoaXMuX0ZCVS53aWR0aCAvIDE2KTsKKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUudGlsZXNfeSA9IE1hdGguY2VpbCh0aGlzLl9GQlUuaGVpZ2h0IC8gMTYpOworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS50b3RhbF90aWxlcyA9IHRoaXMuX0ZCVS50aWxlc194ICogdGhpcy5fRkJVLnRpbGVzX3k7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLnRpbGVzID0gdGhpcy5fRkJVLnRvdGFsX3RpbGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAodGhpcy5fRkJVLnRpbGVzID4gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJIRVhUSUxFIHN1YmVuY29kaW5nIiwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICB2YXIgc3ViZW5jb2RpbmcgPSByUVtyUWldOyAgLy8gUGVlaworICAgICAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyA+IDMwKSB7ICAvLyBSYXcKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgiRGlzY29ubmVjdGVkOiBpbGxlZ2FsIGhleHRpbGUgc3ViZW5jb2RpbmcgIiArIHN1YmVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBzdWJyZWN0cyA9IDA7CisgICAgICAgICAgICAgICAgdmFyIGN1cnJfdGlsZSA9IHRoaXMuX0ZCVS50b3RhbF90aWxlcyAtIHRoaXMuX0ZCVS50aWxlczsKKyAgICAgICAgICAgICAgICB2YXIgdGlsZV94ID0gY3Vycl90aWxlICUgdGhpcy5fRkJVLnRpbGVzX3g7CisgICAgICAgICAgICAgICAgdmFyIHRpbGVfeSA9IE1hdGguZmxvb3IoY3Vycl90aWxlIC8gdGhpcy5fRkJVLnRpbGVzX3gpOworICAgICAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fRkJVLnggKyB0aWxlX3ggKiAxNjsKKyAgICAgICAgICAgICAgICB2YXIgeSA9IHRoaXMuX0ZCVS55ICsgdGlsZV95ICogMTY7CisgICAgICAgICAgICAgICAgdmFyIHcgPSBNYXRoLm1pbigxNiwgKHRoaXMuX0ZCVS54ICsgdGhpcy5fRkJVLndpZHRoKSAtIHgpOworICAgICAgICAgICAgICAgIHZhciBoID0gTWF0aC5taW4oMTYsICh0aGlzLl9GQlUueSArIHRoaXMuX0ZCVS5oZWlnaHQpIC0geSk7CisKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSBleHBlY3RpbmcKKyAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDAxKSB7ICAvLyBSYXcKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHcgKiBoICogdGhpcy5fZmJfQnBwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDIpIHsgIC8vIEJhY2tncm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSB0aGlzLl9mYl9CcHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nICYgMHgwNCkgeyAgLy8gRm9yZWdyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHRoaXMuX2ZiX0JwcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDA4KSB7ICAvLyBBbnlTdWJyZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzKys7ICAvLyBTaW5jZSB3ZSBhcmVuJ3Qgc2hpZnRpbmcgaXQgb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoImhleHRpbGUgc3VicmVjdHMgaGVhZGVyIiwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlY3RzID0gclFbclFpICsgdGhpcy5fRkJVLmJ5dGVzIC0gMV07ICAvLyBQZWVrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDEwKSB7ICAvLyBTdWJyZWN0c0NvbG91cmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHN1YnJlY3RzICogKHRoaXMuX2ZiX0JwcCArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gc3VicmVjdHMgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJoZXh0aWxlIiwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIGVuY29kaW5nIGFuZCBoYXZlIGEgd2hvbGUgdGlsZQorICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJlbmNvZGluZyA9IHJRW3JRaV07CisgICAgICAgICAgICAgICAgclFpKys7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLmxhc3RzdWJlbmNvZGluZyAmIDB4MDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlaXJkOiBpZ25vcmUgYmxhbmtzIGFyZSBSQVcKKyAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIiAgICAgSWdub3JpbmcgYmxhbmsgYWZ0ZXIgUkFXIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmZpbGxSZWN0KHgsIHksIHcsIGgsIHJRLCByUWkpOworICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX0ZCVS5ieXRlcyAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyAmIDB4MDEpIHsgIC8vIFJhdworICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmJsaXRJbWFnZSh4LCB5LCB3LCBoLCByUSwgclFpKTsKKyAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX0ZCVS5ieXRlcyAtIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyAmIDB4MDIpIHsgIC8vIEJhY2tncm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5iYWNrZ3JvdW5kID0gclEuc2xpY2UoclFpLCByUWkgKyB0aGlzLl9mYl9CcHApOworICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwNCkgeyAgLy8gRm9yZWdyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmZvcmVncm91bmQgPSByUS5zbGljZShyUWksIHJRaSArIHRoaXMuX2ZiX0JwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByUWkgKz0gdGhpcy5fZmJfQnBwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5zdGFydFRpbGUoeCwgeSwgdywgaCwgdGhpcy5fRkJVLmJhY2tncm91bmQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwOCkgeyAgLy8gQW55U3VicmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlY3RzID0gclFbclFpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJRaSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHN1YnJlY3RzOyBzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyAmIDB4MTApIHsgIC8vIFN1YnJlY3RzQ29sb3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSByUS5zbGljZShyUWksIHJRaSArIHRoaXMuX2ZiX0JwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRaSArPSB0aGlzLl9mYl9CcHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLl9GQlUuZm9yZWdyb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHh5ID0gclFbclFpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByUWkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ggPSAoeHkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5ID0gKHh5ICYgMHgwZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2ggPSByUVtyUWldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdyA9ICh3aCA+PiA0KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoID0gKHdoICYgMHgwZikgKyAxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5zdWJUaWxlKHN4LCBzeSwgc3csIHNoLCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5maW5pc2hUaWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2V0X3JRaShyUWkpOworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5sYXN0c3ViZW5jb2RpbmcgPSB0aGlzLl9GQlUuc3ViZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDsKKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUudGlsZXMtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS50aWxlcyA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5yZWN0cy0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKworICAgICAgICBnZXRUaWdodENMZW5ndGg6IGZ1bmN0aW9uIChhcnIpIHsKKyAgICAgICAgICAgIHZhciBoZWFkZXIgPSAxLCBkYXRhID0gMDsKKyAgICAgICAgICAgIGRhdGEgKz0gYXJyWzBdICYgMHg3ZjsKKyAgICAgICAgICAgIGlmIChhcnJbMF0gJiAweDgwKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyKys7CisgICAgICAgICAgICAgICAgZGF0YSArPSAoYXJyWzFdICYgMHg3ZikgPDwgNzsKKyAgICAgICAgICAgICAgICBpZiAoYXJyWzFdICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBoZWFkZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBhcnJbMl0gPDwgMTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFtoZWFkZXIsIGRhdGFdOworICAgICAgICB9LAorCisgICAgICAgIGRpc3BsYXlfdGlnaHQ6IGZ1bmN0aW9uIChpc1RpZ2h0UE5HKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fZmJfZGVwdGggPT09IDEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKCJUaWdodCBwcm90b2NvbCBoYW5kbGVyIG9ubHkgaW1wbGVtZW50cyB0cnVlIGNvbG9yIG1vZGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMTsgIC8vIGNvbXByZXNzaW9uLWNvbnRyb2wgYnl0ZQorICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJUSUdIVCBjb21wcmVzc2lvbi1jb250cm9sIiwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgdmFyIGNoZWNrc3VtID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICB2YXIgc3VtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGRhdGFbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gPiA2NTUzNikgc3VtIC09IDY1NTM2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdmFyIHJlc2V0U3RyZWFtcyA9IDA7CisgICAgICAgICAgICB2YXIgc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgICAgIHZhciBkZWNvbXByZXNzID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc2V0U3RyZWFtcyA+PiBpKSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS56bGlic1tpXS5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKCJSZXNldCB6bGliIHN0cmVhbSAiICsgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkID0gdGhpcy5fRkJVLnpsaWJzW3N0cmVhbUlkXS51bmNvbXByZXNzKGRhdGEsIDApOworICAgICAgICAgICAgICAgIGlmICh1bmNvbXByZXNzZWQuc3RhdHVzICE9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoIkludmFsaWQgZGF0YSBpbiB6bGliIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB1bmNvbXByZXNzZWQuZGF0YTsKKyAgICAgICAgICAgIH0uYmluZCh0aGlzKTsKKworICAgICAgICAgICAgdmFyIGluZGV4ZWRUb1JHQiA9IGZ1bmN0aW9uIChkYXRhLCBudW1Db2xvcnMsIHBhbGV0dGUsIHdpZHRoLCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGluZGV4ZWQgKHBhbGV0dGUgYmFzZWQpIGltYWdlIGRhdGEgdG8gUkdCCisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVkdWNlIG51bWJlciBvZiBjYWxjdWxhdGlvbnMgaW5zaWRlIGxvb3AKKyAgICAgICAgICAgICAgICB2YXIgZGVzdCA9IFtdOworICAgICAgICAgICAgICAgIHZhciB4LCB5LCBkcCwgc3A7CisgICAgICAgICAgICAgICAgaWYgKG51bUNvbG9ycyA9PT0gMikgeworICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3IoKHdpZHRoICsgNykgLyA4KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHcxID0gTWF0aC5mbG9vcih3aWR0aCAvIDgpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGI7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzE7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gKHkgKiB3aWR0aCArIHggKiA4ICsgNyAtIGIpICogMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAoZGF0YVt5ICogdyArIHhdID4+IGIgJiAxKSAqIDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHBdID0gcGFsZXR0ZVtzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAxXSA9IHBhbGV0dGVbc3AgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDJdID0gcGFsZXR0ZVtzcCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSA4IC0gd2lkdGggJSA4OyBiLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCA9ICh5ICogd2lkdGggKyB4ICogOCArIDcgLSBiKSAqIDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAoZGF0YVt5ICogdyArIHhdID4+IGIgJiAxKSAqIDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcF0gPSBwYWxldHRlW3NwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMV0gPSBwYWxldHRlW3NwICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDJdID0gcGFsZXR0ZVtzcCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gKHkgKiB3aWR0aCArIHgpICogMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IGRhdGFbeSAqIHdpZHRoICsgeF0gKiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHBdID0gcGFsZXR0ZVtzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDFdID0gcGFsZXR0ZVtzcCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAyXSA9IHBhbGV0dGVbc3AgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkZXN0OworICAgICAgICAgICAgfS5iaW5kKHRoaXMpOworCisgICAgICAgICAgICB2YXIgclEgPSB0aGlzLl9zb2NrLmdldF9yUSgpOworICAgICAgICAgICAgdmFyIHJRaSA9IHRoaXMuX3NvY2suZ2V0X3JRaSgpOworICAgICAgICAgICAgdmFyIGNtb2RlLCBjbGVuZ3RoLCBkYXRhOworCisgICAgICAgICAgICB2YXIgaGFuZGxlUGFsZXR0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICB2YXIgbnVtQ29sb3JzID0gclFbclFpICsgMl0gKyAxOworICAgICAgICAgICAgICAgIHZhciBwYWxldHRlU2l6ZSA9IG51bUNvbG9ycyAqIHRoaXMuX2ZiX2RlcHRoOworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSBwYWxldHRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlRJR0hUIHBhbGV0dGUgIiArIGNtb2RlLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgdmFyIGJwcCA9IChudW1Db2xvcnMgPD0gMikgPyAxIDogODsKKyAgICAgICAgICAgICAgICB2YXIgcm93U2l6ZSA9IE1hdGguZmxvb3IoKHRoaXMuX0ZCVS53aWR0aCAqIGJwcCArIDcpIC8gOCk7CisgICAgICAgICAgICAgICAgdmFyIHJhdyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChyb3dTaXplICogdGhpcy5fRkJVLmhlaWdodCA8IDEyKSB7CisgICAgICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNsZW5ndGggPSBbMCwgcm93U2l6ZSAqIHRoaXMuX0ZCVS5oZWlnaHRdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNsZW5ndGggPSBSRkIuZW5jb2RpbmdIYW5kbGVycy5nZXRUaWdodENMZW5ndGgodGhpcy5fc29jay5yUXNsaWNlKDMgKyBwYWxldHRlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyArIHBhbGV0dGVTaXplICsgMykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSBjbGVuZ3RoWzBdICsgY2xlbmd0aFsxXTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoIlRJR0hUICIgKyBjbW9kZSwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGN0bCwgZmlsdGVyIGlkLCBudW0gY29sb3JzLCBwYWxldHRlIGVudHJpZXMsIGFuZCBjbGVuZ3RoIG9mZgorICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7CisgICAgICAgICAgICAgICAgdmFyIHBhbGV0dGUgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhwYWxldHRlU2l6ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcyhjbGVuZ3RoWzBdKTsKKworICAgICAgICAgICAgICAgIGlmIChyYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsZW5ndGhbMV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZWNvbXByZXNzKHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsZW5ndGhbMV0pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGluZGV4ZWQgKHBhbGV0dGUgYmFzZWQpIGltYWdlIGRhdGEgdG8gUkdCCisgICAgICAgICAgICAgICAgdmFyIHJnYiA9IGluZGV4ZWRUb1JHQihkYXRhLCBudW1Db2xvcnMsIHBhbGV0dGUsIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LnJlbmRlclFfcHVzaCh7CisgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2JsaXRSZ2InLAorICAgICAgICAgICAgICAgICAgICAnZGF0YSc6IHJnYiwKKyAgICAgICAgICAgICAgICAgICAgJ3gnOiB0aGlzLl9GQlUueCwKKyAgICAgICAgICAgICAgICAgICAgJ3knOiB0aGlzLl9GQlUueSwKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodAorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9LmJpbmQodGhpcyk7CisKKyAgICAgICAgICAgIHZhciBoYW5kbGVDb3B5ID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHZhciByYXcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkU2l6ZSA9IHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX0ZCVS5oZWlnaHQgKiB0aGlzLl9mYl9kZXB0aDsKKyAgICAgICAgICAgICAgICBpZiAodW5jb21wcmVzc2VkU2l6ZSA8IDEyKSB7CisgICAgICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNsZW5ndGggPSBbMCwgdW5jb21wcmVzc2VkU2l6ZV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlbmd0aCA9IFJGQi5lbmNvZGluZ0hhbmRsZXJzLmdldFRpZ2h0Q0xlbmd0aCh0aGlzLl9zb2NrLnJRc2xpY2UoMSwgNCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxICsgY2xlbmd0aFswXSArIGNsZW5ndGhbMV07CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJUSUdIVCAiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCBjdGwsIGNsZW5ndGggb2ZmCisgICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoMSArIGNsZW5ndGhbMF0pOworCisgICAgICAgICAgICAgICAgaWYgKHJhdykgeworICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRlY29tcHJlc3ModGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoY2xlbmd0aFsxXSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVuZGVyUV9wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYmxpdFJnYicsCisgICAgICAgICAgICAgICAgICAgICdkYXRhJzogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJ3gnOiB0aGlzLl9GQlUueCwKKyAgICAgICAgICAgICAgICAgICAgJ3knOiB0aGlzLl9GQlUueSwKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodAorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9LmJpbmQodGhpcyk7CisKKyAgICAgICAgICAgIHZhciBjdGwgPSB0aGlzLl9zb2NrLnJRcGVlazgoKTsKKworICAgICAgICAgICAgLy8gS2VlcCB0aWdodCByZXNldCBiaXRzCisgICAgICAgICAgICByZXNldFN0cmVhbXMgPSBjdGwgJiAweEY7CisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgZmlsdGVyCisgICAgICAgICAgICBjdGwgPSBjdGwgPj4gNDsKKyAgICAgICAgICAgIHN0cmVhbUlkID0gY3RsICYgMHgzOworCisgICAgICAgICAgICBpZiAoY3RsID09PSAweDA4KSAgICAgICBjbW9kZSA9ICJmaWxsIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGN0bCA9PT0gMHgwOSkgIGNtb2RlID0gImpwZWciOworICAgICAgICAgICAgZWxzZSBpZiAoY3RsID09PSAweDBBKSAgY21vZGUgPSAicG5nIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGN0bCAmIDB4MDQpICAgIGNtb2RlID0gImZpbHRlciI7CisgICAgICAgICAgICBlbHNlIGlmIChjdGwgPCAweDA0KSAgICBjbW9kZSA9ICJjb3B5IjsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuX2ZhaWwoIklsbGVnYWwgdGlnaHQgY29tcHJlc3Npb24gcmVjZWl2ZWQsIGN0bDogIiArIGN0bCk7CisKKyAgICAgICAgICAgIGlmIChpc1RpZ2h0UE5HICYmIChjbW9kZSA9PT0gImZpbHRlciIgfHwgY21vZGUgPT09ICJjb3B5IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbCgiZmlsdGVyL2NvcHkgcmVjZWl2ZWQgaW4gdGlnaHRQTkcgbW9kZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGNtb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gZmlsbCB1c2UgZmJfZGVwdGggYmVjYXVzZSBUUElYRUxzIGRyb3AgdGhlIHBhZGRpbmcgYnl0ZQorICAgICAgICAgICAgICAgIGNhc2UgImZpbGwiOiAgLy8gVFBJWEVMCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSB0aGlzLl9mYl9kZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAianBlZyI6ICAvLyBtYXggY2xlbmd0aAorICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAicG5nIjogIC8vIG1heCBjbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJmaWx0ZXIiOiAgLy8gZmlsdGVyIGlkICsgbnVtIGNvbG9ycyBpZiBwYWxldHRlCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJjb3B5IjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgiVElHSFQgIiArIGNtb2RlLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgRkJVLmJ5dGVzCisgICAgICAgICAgICBzd2l0Y2ggKGNtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAiZmlsbCI6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwOCgpOyAgLy8gc2hpZnQgb2ZmIGN0bAorICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyh0aGlzLl9mYl9kZXB0aCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVuZGVyUV9wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2ZpbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3gnOiB0aGlzLl9GQlUueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICd5JzogdGhpcy5fRkJVLnksCisgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLl9GQlUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcic6IFtjb2xvclsyXSwgY29sb3JbMV0sIGNvbG9yWzBdXQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAicG5nIjoKKyAgICAgICAgICAgICAgICBjYXNlICJqcGVnIjoKKyAgICAgICAgICAgICAgICAgICAgY2xlbmd0aCA9IFJGQi5lbmNvZGluZ0hhbmRsZXJzLmdldFRpZ2h0Q0xlbmd0aCh0aGlzLl9zb2NrLnJRc2xpY2UoMSwgNCkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxICsgY2xlbmd0aFswXSArIGNsZW5ndGhbMV07ICAvLyBjdGwgKyBjbGVuZ3RoIHNpemUgKyBqcGVnLWRhdGEKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCJUSUdIVCAiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBldmVyeXRoaW5nLCByZW5kZXIgaXQKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygxICsgY2xlbmd0aFswXSk7ICAvLyBzaGlmdCBvZmYgY2x0ICsgY29tcGFjdCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpOworICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gImRhdGE6IGltYWdlLyIgKyBjbW9kZSArCisgICAgICAgICAgICAgICAgICAgICAgICBSRkIuZXh0cmFjdF9kYXRhX3VyaSh0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhjbGVuZ3RoWzFdKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVuZGVyUV9wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2ltZycsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW1nJzogaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3gnOiB0aGlzLl9GQlUueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICd5JzogdGhpcy5fRkJVLnkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGltZyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgImZpbHRlciI6CisgICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJJZCA9IHJRW3JRaSArIDFdOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVySWQgPT09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlUGFsZXR0ZSgpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIDAsIENvcHkgY291bGQgYmUgdmFsaWQgaGVyZSwgYnV0IHNlcnZlcnMgZG9uJ3Qgc2VuZCBpdCBhcyBhbiBleHBsaWNpdCBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciAyLCBHcmFkaWVudCBpcyB2YWxpZCBidXQgbm90IHVzZSBpZiBqcGVnIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogd2h5IGFyZW4ndCB3ZSBqdXN0IGNhbGxpbmcgJ19mYWlsJyBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHRpZ2h0IHN1YmVuY29kaW5nIHJlY2VpdmVkLCBmaWx0ZXI6ICIgKyBmaWx0ZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiY29weSI6CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlQ29weSgpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogCisgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwOworICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07CiAKLWtleUV2ZW50ID0gZnVuY3Rpb24oa2V5c3ltLCBkb3duKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBrZXlFdmVudCwga2V5c3ltOiAiICsga2V5c3ltICsgIiwgZG93bjogIiArIGRvd24pOwotICAgIHZhciBhcnI7Ci0gICAgYXJyID0gWzRdOyAgLy8gbXNnLXR5cGUKLSAgICBhcnIucHVzaDgoZG93bik7Ci0gICAgYXJyLnB1c2gxNigwKTsKLSAgICBhcnIucHVzaDMyKGtleXN5bSk7Ci0gICAgLy9VdGlsLkRlYnVnKCI8PCBrZXlFdmVudCIpOwotICAgIHJldHVybiBhcnI7Ci19OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCiAKLXBvaW50ZXJFdmVudCA9IGZ1bmN0aW9uKHgsIHkpIHsKLSAgICAvL1V0aWwuRGVidWcoIj4+IHBvaW50ZXJFdmVudCwgeCx5OiAiICsgeCArICIsIiArIHkgKwotICAgIC8vICAgICAgICAgICAiICwgbWFzazogIiArIG1vdXNlX2J1dHRvbk1hc2spOwotICAgIHZhciBhcnI7Ci0gICAgYXJyID0gWzVdOyAgLy8gbXNnLXR5cGUKLSAgICBhcnIucHVzaDgobW91c2VfYnV0dG9uTWFzayk7Ci0gICAgYXJyLnB1c2gxNih4KTsKLSAgICBhcnIucHVzaDE2KHkpOwotICAgIC8vVXRpbC5EZWJ1ZygiPDwgcG9pbnRlckV2ZW50Iik7Ci0gICAgcmV0dXJuIGFycjsKLX07CisgICAgICAgIFRJR0hUOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9lbmNIYW5kbGVycy5kaXNwbGF5X3RpZ2h0KGZhbHNlKTsgfSwKKyAgICAgICAgVElHSFRfUE5HOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9lbmNIYW5kbGVycy5kaXNwbGF5X3RpZ2h0KHRydWUpOyB9LAogCi1jbGllbnRDdXRUZXh0ID0gZnVuY3Rpb24odGV4dCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gY2xpZW50Q3V0VGV4dCIpOwotICAgIHZhciBhcnIsIGksIG47Ci0gICAgYXJyID0gWzZdOyAgICAgLy8gbXNnLXR5cGUKLSAgICBhcnIucHVzaDgoMCk7ICAvLyBwYWRkaW5nCi0gICAgYXJyLnB1c2g4KDApOyAgLy8gcGFkZGluZwotICAgIGFyci5wdXNoOCgwKTsgIC8vIHBhZGRpbmcKLSAgICBhcnIucHVzaDMyKHRleHQubGVuZ3RoKTsKLSAgICBuID0gdGV4dC5sZW5ndGg7Ci0gICAgZm9yIChpPTA7IGkgPCBuOyBpKz0xKSB7Ci0gICAgICAgIGFyci5wdXNoKHRleHQuY2hhckNvZGVBdChpKSk7Ci0gICAgfQotICAgIC8vVXRpbC5EZWJ1ZygiPDwgY2xpZW50Q3V0VGV4dDoiICsgYXJyKTsKLSAgICByZXR1cm4gYXJyOwotfTsKKyAgICAgICAgbGFzdF9yZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCiAKKyAgICAgICAgRGVza3RvcFNpemU6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIFV0aWwuRGVidWcoIj4+IHNldF9kZXNrdG9wc2l6ZSIpOworICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGggPSB0aGlzLl9GQlUud2lkdGg7CisgICAgICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSB0aGlzLl9GQlUuaGVpZ2h0OworICAgICAgICAgICAgdGhpcy5fb25GQlJlc2l6ZSh0aGlzLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTsKKyAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVzaXplKHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpOworICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAKKyAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7CisgICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTsKIAotLy8KLS8vIFB1YmxpYyBBUEkgaW50ZXJmYWNlIGZ1bmN0aW9ucwotLy8KKyAgICAgICAgICAgIFV0aWwuRGVidWcoIjw8IHNldF9kZXNrdG9wc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sCiAKLXRoYXQuY29ubmVjdCA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIHBhc3N3b3JkLCBwYXRoKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBjb25uZWN0Iik7CisgICAgICAgIEN1cnNvcjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPj4gc2V0X2N1cnNvciIpOworICAgICAgICAgICAgdmFyIHggPSB0aGlzLl9GQlUueDsgIC8vIGhvdHNwb3QteAorICAgICAgICAgICAgdmFyIHkgPSB0aGlzLl9GQlUueTsgIC8vIGhvdHNwb3QteQorICAgICAgICAgICAgdmFyIHcgPSB0aGlzLl9GQlUud2lkdGg7CisgICAgICAgICAgICB2YXIgaCA9IHRoaXMuX0ZCVS5oZWlnaHQ7CiAKLSAgICByZmJfaG9zdCAgICAgICA9IGhvc3Q7Ci0gICAgcmZiX3BvcnQgICAgICAgPSBwb3J0OwotICAgIHJmYl9wYXNzd29yZCAgID0gKHBhc3N3b3JkICE9PSB1bmRlZmluZWQpICAgPyBwYXNzd29yZCA6ICIiOwotICAgIHJmYl9wYXRoICAgICAgID0gKHBhdGggIT09IHVuZGVmaW5lZCkgPyBwYXRoIDogIiI7CisgICAgICAgICAgICB2YXIgcGl4ZWxzbGVuZ3RoID0gdyAqIGggKiB0aGlzLl9mYl9CcHA7CisgICAgICAgICAgICB2YXIgbWFza2xlbmd0aCA9IE1hdGguZmxvb3IoKHcgKyA3KSAvIDgpICogaDsKIAotICAgIGlmICgoIXJmYl9ob3N0KSB8fCAoIXJmYl9wb3J0KSkgewotICAgICAgICByZXR1cm4gZmFpbCgiTXVzdCBzZXQgaG9zdCBhbmQgcG9ydCIpOwotICAgIH0KKyAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IHBpeGVsc2xlbmd0aCArIG1hc2tsZW5ndGg7CisgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoImN1cnNvciBlbmNvZGluZyIsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICB1cGRhdGVTdGF0ZSgnY29ubmVjdCcpOwotICAgIC8vVXRpbC5EZWJ1ZygiPDwgY29ubmVjdCIpOworICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMocGl4ZWxzbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKG1hc2tsZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgdywgaCk7CiAKLX07CisgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwOworICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07CiAKLXRoYXQuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGlzY29ubmVjdCIpOwotICAgIHVwZGF0ZVN0YXRlKCdkaXNjb25uZWN0JywgJ0Rpc2Nvbm5lY3RpbmcnKTsKLSAgICAvL1V0aWwuRGVidWcoIjw8IGRpc2Nvbm5lY3QiKTsKLX07CisgICAgICAgICAgICBVdGlsLkRlYnVnKCI8PCBzZXRfY3Vyc29yIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKIAotdGhhdC5zZW5kUGFzc3dvcmQgPSBmdW5jdGlvbihwYXNzd2QpIHsKLSAgICByZmJfcGFzc3dvcmQgPSBwYXNzd2Q7Ci0gICAgcmZiX3N0YXRlID0gIkF1dGhlbnRpY2F0aW9uIjsKLSAgICBzZXRUaW1lb3V0KGluaXRfbXNnLCAxKTsKLX07CisgICAgICAgIEpQRUdfcXVhbGl0eV9sbzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgVXRpbC5FcnJvcigiU2VydmVyIHNlbnQganBlZ19xdWFsaXR5IHBzZXVkby1lbmNvZGluZyIpOworICAgICAgICB9LAogCi10aGF0LnNlbmRDdHJsQWx0RGVsID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHJmYl9zdGF0ZSAhPT0gIm5vcm1hbCIgfHwgY29uZi52aWV3X29ubHkpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgVXRpbC5JbmZvKCJTZW5kaW5nIEN0cmwtQWx0LURlbCIpOwotICAgIHZhciBhcnIgPSBbXTsKLSAgICBhcnIgPSBhcnIuY29uY2F0KGtleUV2ZW50KDB4RkZFMywgMSkpOyAvLyBDb250cm9sCi0gICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudCgweEZGRTksIDEpKTsgLy8gQWx0Ci0gICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudCgweEZGRkYsIDEpKTsgLy8gRGVsZXRlCi0gICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudCgweEZGRkYsIDApKTsgLy8gRGVsZXRlCi0gICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudCgweEZGRTksIDApKTsgLy8gQWx0Ci0gICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudCgweEZGRTMsIDApKTsgLy8gQ29udHJvbAotICAgIGFyciA9IGFyci5jb25jYXQoZmJVcGRhdGVSZXF1ZXN0cygpKTsKLSAgICB3cy5zZW5kKGFycik7Ci19OwotCi0vLyBTZW5kIGEga2V5IHByZXNzLiBJZiAnZG93bicgaXMgbm90IHNwZWNpZmllZCB0aGVuIHNlbmQgYSBkb3duIGtleQotLy8gZm9sbG93ZWQgYnkgYW4gdXAga2V5LgotdGhhdC5zZW5kS2V5ID0gZnVuY3Rpb24oY29kZSwgZG93bikgewotICAgIGlmIChyZmJfc3RhdGUgIT09ICJub3JtYWwiIHx8IGNvbmYudmlld19vbmx5KSB7IHJldHVybiBmYWxzZTsgfQotICAgIHZhciBhcnIgPSBbXTsKLSAgICBpZiAodHlwZW9mIGRvd24gIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgIFV0aWwuSW5mbygiU2VuZGluZyBrZXkgY29kZSAoIiArIChkb3duID8gImRvd24iIDogInVwIikgKyAiKTogIiArIGNvZGUpOwotICAgICAgICBhcnIgPSBhcnIuY29uY2F0KGtleUV2ZW50KGNvZGUsIGRvd24gPyAxIDogMCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFV0aWwuSW5mbygiU2VuZGluZyBrZXkgY29kZSAoZG93biArIHVwKTogIiArIGNvZGUpOwotICAgICAgICBhcnIgPSBhcnIuY29uY2F0KGtleUV2ZW50KGNvZGUsIDEpKTsKLSAgICAgICAgYXJyID0gYXJyLmNvbmNhdChrZXlFdmVudChjb2RlLCAwKSk7Ci0gICAgfQotICAgIGFyciA9IGFyci5jb25jYXQoZmJVcGRhdGVSZXF1ZXN0cygpKTsKLSAgICB3cy5zZW5kKGFycik7Ci19OwotCi10aGF0LmNsaXBib2FyZFBhc3RlRnJvbSA9IGZ1bmN0aW9uKHRleHQpIHsKLSAgICBpZiAocmZiX3N0YXRlICE9PSAibm9ybWFsIikgeyByZXR1cm47IH0KLSAgICAvL1V0aWwuRGVidWcoIj4+IGNsaXBib2FyZFBhc3RlRnJvbTogIiArIHRleHQuc3Vic3RyKDAsNDApICsgIi4uLiIpOwotICAgIHdzLnNlbmQoY2xpZW50Q3V0VGV4dCh0ZXh0KSk7Ci0gICAgLy9VdGlsLkRlYnVnKCI8PCBjbGlwYm9hcmRQYXN0ZUZyb20iKTsKLX07Ci0KLS8vIE92ZXJyaWRlIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgdGVzdGluZwotdGhhdC50ZXN0TW9kZSA9IGZ1bmN0aW9uKG92ZXJyaWRlX3NlbmQpIHsKLSAgICB0ZXN0X21vZGUgPSB0cnVlOwotICAgIHRoYXQucmVjdl9tZXNzYWdlID0gd3MudGVzdE1vZGUob3ZlcnJpZGVfc2VuZCk7Ci0KLSAgICBjaGVja0V2ZW50cyA9IGZ1bmN0aW9uICgpIHsgLyogU3R1YiBPdXQgKi8gfTsKLSAgICB0aGF0LmNvbm5lY3QgPSBmdW5jdGlvbihob3N0LCBwb3J0LCBwYXNzd29yZCkgewotICAgICAgICAgICAgcmZiX2hvc3QgPSBob3N0OwotICAgICAgICAgICAgcmZiX3BvcnQgPSBwb3J0OwotICAgICAgICAgICAgcmZiX3Bhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0ZSgnUHJvdG9jb2xWZXJzaW9uJywgIlN0YXJ0aW5nIFZOQyBoYW5kc2hha2UiKTsKLSAgICAgICAgfTsKLX07Ci0KLQotcmV0dXJuIGNvbnN0cnVjdG9yKCk7ICAvLyBSZXR1cm4gdGhlIHB1YmxpYyBBUEkgaW50ZXJmYWNlCi0KLX0gIC8vIEVuZCBvZiBSRkIoKQorICAgICAgICBjb21wcmVzc19sbzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgVXRpbC5FcnJvcigiU2VydmVyIHNlbnQgY29tcHJlc3MgbGV2ZWwgcHNldWRvLWVuY29kaW5nIik7CisgICAgICAgIH0KKyAgICB9OworfSkoKTsKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91aS5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91aS5qcwppbmRleCBlZGRmYTZjLi5lODY5YWE2IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdWkuanMKKysrIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3VpLmpzCkBAIC0xLDY1MyArMSw5NzkgQEAKIC8qCiAgKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudAotICogQ29weXJpZ2h0IChDKSAyMDExIEpvZWwgTWFydGluCi0gKiBMaWNlbnNlZCB1bmRlciBMR1BMLTMgKHNlZSBMSUNFTlNFLnR4dCkKKyAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpbgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXVlbCBNYW5uZWhlZCBmb3IgQ2VuZGlvIEFCCisgKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpCiAgKgogICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy4KICAqLwogCi0idXNlIHN0cmljdCI7Ci0vKmpzbGludCB3aGl0ZTogZmFsc2UsIGJyb3dzZXI6IHRydWUgKi8KLS8qZ2xvYmFsIHdpbmRvdywgJEQsIFV0aWwsIFdlYlV0aWwsIFJGQiwgRGlzcGxheSAqLworLyoganNsaW50IHdoaXRlOiBmYWxzZSwgYnJvd3NlcjogdHJ1ZSAqLworLyogZ2xvYmFsIHdpbmRvdywgJEQsIFV0aWwsIFdlYlV0aWwsIFJGQiwgRGlzcGxheSAqLwogCi12YXIgVUkgPSB7Cit2YXIgVUk7CiAKLXJmYl9zdGF0ZSA6ICdsb2FkZWQnLAotc2V0dGluZ3NPcGVuIDogZmFsc2UsCi1jb25uU2V0dGluZ3NPcGVuIDogZmFsc2UsCi1jbGlwYm9hcmRPcGVuOiBmYWxzZSwKLWtleWJvYXJkVmlzaWJsZTogZmFsc2UsCisoZnVuY3Rpb24gKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKIAotLy8gUmVuZGVyIGRlZmF1bHQgVUkgYW5kIGluaXRpYWxpemUgc2V0dGluZ3MgbWVudQotbG9hZDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGh0bWwgPSAnJywgaSwgc2hlZXQsIHNoZWV0cywgbGxldmVsczsKKyAgICAvLyBMb2FkIHN1cHBvcnRpbmcgc2NyaXB0cworICAgIHdpbmRvdy5vbnNjcmlwdHNsb2FkID0gZnVuY3Rpb24gKCkgeyBVSS5sb2FkKCk7IH07CisgICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgVUkua2V5Ym9hcmRpbnB1dFJlc2V0KCk7IH07CisgICAgVXRpbC5sb2FkX3NjcmlwdHMoWyJ3ZWJ1dGlsLmpzIiwgImJhc2U2NC5qcyIsICJ3ZWJzb2NrLmpzIiwgImRlcy5qcyIsCisgICAgICAgICAgICAgICAgICAgICAgICJrZXlzeW1kZWYuanMiLCAia2V5Ym9hcmQuanMiLCAiaW5wdXQuanMiLCAiZGlzcGxheS5qcyIsCisgICAgICAgICAgICAgICAgICAgICAgICJqc3VuemlwLmpzIiwgInJmYi5qcyIsICJrZXlzeW0uanMiXSk7CiAKLSAgICAvLyBTdHlsZXNoZWV0IHNlbGVjdGlvbiBkcm9wZG93bgotICAgIHNoZWV0ID0gV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0KCk7Ci0gICAgc2hlZXRzID0gV2ViVXRpbC5nZXRTdHlsZXNoZWV0cygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaGVldHMubGVuZ3RoOyBpICs9IDEpIHsKLSAgICAgICAgVUkuYWRkT3B0aW9uKCREKCdub1ZOQ19zdHlsZXNoZWV0Jyksc2hlZXRzW2ldLnRpdGxlLCBzaGVldHNbaV0udGl0bGUpOwotICAgIH0KKyAgICB2YXIgVUkgPSB7CiAKLSAgICAvLyBMb2dnaW5nIHNlbGVjdGlvbiBkcm9wZG93bgotICAgIGxsZXZlbHMgPSBbJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbycsICdkZWJ1ZyddOwotICAgIGZvciAoaSA9IDA7IGkgPCBsbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7Ci0gICAgICAgIFVJLmFkZE9wdGlvbigkRCgnbm9WTkNfbG9nZ2luZycpLGxsZXZlbHNbaV0sIGxsZXZlbHNbaV0pOwotICAgIH0KKyAgICAgICAgcmZiX3N0YXRlIDogJ2xvYWRlZCcsCisgICAgICAgIHNldHRpbmdzT3BlbiA6IGZhbHNlLAorICAgICAgICBjb25uU2V0dGluZ3NPcGVuIDogZmFsc2UsCisgICAgICAgIHBvcHVwU3RhdHVzT3BlbiA6IGZhbHNlLAorICAgICAgICBjbGlwYm9hcmRPcGVuOiBmYWxzZSwKKyAgICAgICAga2V5Ym9hcmRWaXNpYmxlOiBmYWxzZSwKKyAgICAgICAgaGlkZUtleWJvYXJkVGltZW91dDogbnVsbCwKKyAgICAgICAgbGFzdEtleWJvYXJkaW5wdXQ6IG51bGwsCisgICAgICAgIGRlZmF1bHRLZXlib2FyZGlucHV0TGVuOiAxMDAsCisgICAgICAgIGV4dHJhS2V5c1Zpc2libGU6IGZhbHNlLAorICAgICAgICBjdHJsT246IGZhbHNlLAorICAgICAgICBhbHRPbjogZmFsc2UsCisgICAgICAgIGlzVG91Y2hEZXZpY2U6IGZhbHNlLAogCi0gICAgLy8gU2V0dGluZ3Mgd2l0aCBpbW1lZGlhdGUgZWZmZWN0cwotICAgIFVJLmluaXRTZXR0aW5nKCdsb2dnaW5nJywgJ3dhcm4nKTsKLSAgICBXZWJVdGlsLmluaXRfbG9nZ2luZyhVSS5nZXRTZXR0aW5nKCdsb2dnaW5nJykpOworICAgICAgICAvLyBTZXR1cCByZmIgb2JqZWN0LCBsb2FkIHNldHRpbmdzIGZyb20gYnJvd3NlciBzdG9yYWdlLCB0aGVuIGNhbGwKKyAgICAgICAgLy8gVUkuaW5pdCB0byBzZXR1cCB0aGUgVUkvbWVudXMKKyAgICAgICAgbG9hZDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBXZWJVdGlsLmluaXRTZXR0aW5ncyhVSS5zdGFydCwgY2FsbGJhY2spOworICAgICAgICB9LAogCi0gICAgVUkuaW5pdFNldHRpbmcoJ3N0eWxlc2hlZXQnLCAnZGVmYXVsdCcpOwotICAgIFdlYlV0aWwuc2VsZWN0U3R5bGVzaGVldChudWxsKTsKLSAgICAvLyBjYWxsIHR3aWNlIHRvIGdldCBhcm91bmQgd2Via2l0IGJ1ZwotICAgIFdlYlV0aWwuc2VsZWN0U3R5bGVzaGVldChVSS5nZXRTZXR0aW5nKCdzdHlsZXNoZWV0JykpOworICAgICAgICAvLyBSZW5kZXIgZGVmYXVsdCBVSSBhbmQgaW5pdGlhbGl6ZSBzZXR0aW5ncyBtZW51CisgICAgICAgIHN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgICAgICAgICAgVUkuaXNUb3VjaERldmljZSA9ICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKIAotICAgIC8qIFBvcHVsYXRlIHRoZSBjb250cm9scyBpZiBkZWZhdWx0cyBhcmUgcHJvdmlkZWQgaW4gdGhlIFVSTCAqLwotICAgIFVJLmluaXRTZXR0aW5nKCdob3N0Jywgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKLSAgICBVSS5pbml0U2V0dGluZygncG9ydCcsIHdpbmRvdy5sb2NhdGlvbi5wb3J0KTsKLSAgICBVSS5pbml0U2V0dGluZygncGFzc3dvcmQnLCAnJyk7Ci0gICAgVUkuaW5pdFNldHRpbmcoJ2VuY3J5cHQnLCAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAiaHR0cHM6IikpOwotICAgIFVJLmluaXRTZXR0aW5nKCd0cnVlX2NvbG9yJywgdHJ1ZSk7Ci0gICAgVUkuaW5pdFNldHRpbmcoJ2N1cnNvcicsIGZhbHNlKTsKLSAgICBVSS5pbml0U2V0dGluZygnc2hhcmVkJywgdHJ1ZSk7Ci0gICAgVUkuaW5pdFNldHRpbmcoJ3ZpZXdfb25seScsIGZhbHNlKTsKLSAgICBVSS5pbml0U2V0dGluZygnY29ubmVjdFRpbWVvdXQnLCAyKTsKLSAgICBVSS5pbml0U2V0dGluZygncGF0aCcsICd3ZWJzb2NraWZ5Jyk7Ci0KLSAgICBVSS5yZmIgPSBSRkIoeyd0YXJnZXQnOiAkRCgnbm9WTkNfY2FudmFzJyksCi0gICAgICAgICAgICAgICAgICAnb25VcGRhdGVTdGF0ZSc6IFVJLnVwZGF0ZVN0YXRlLAotICAgICAgICAgICAgICAgICAgJ29uQ2xpcGJvYXJkJzogVUkuY2xpcFJlY2VpdmV9KTsKLSAgICBVSS51cGRhdGVWaXN1YWxTdGF0ZSgpOwotCi0gICAgLy8gVW5mb2N1cyBjbGlwYm9hcmQgd2hlbiBvdmVyIHRoZSBWTkMgYXJlYQotICAgIC8vJEQoJ1ZOQ19zY3JlZW4nKS5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uICgpIHsKLSAgICAvLyAgICAgICAgIHZhciBrZXlib2FyZCA9IFVJLnJmYi5nZXRfa2V5Ym9hcmQoKTsKLSAgICAvLyAgICAgICAgaWYgKCghIGtleWJvYXJkKSB8fCAoISBrZXlib2FyZC5nZXRfZm9jdXNlZCgpKSkgewotICAgIC8vICAgICAgICAgICAgJEQoJ1ZOQ19jbGlwYm9hcmRfdGV4dCcpLmJsdXIoKTsKLSAgICAvLyAgICAgICAgIH0KLSAgICAvLyAgICB9OwotCi0gICAgLy8gU2hvdyBtb3VzZSBzZWxlY3RvciBidXR0b25zIG9uIHRvdWNoIHNjcmVlbiBkZXZpY2VzCi0gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewotICAgICAgICAvLyBTaG93IG1vYmlsZSBidXR0b25zCi0gICAgICAgICREKCdub1ZOQ19tb2JpbGVfYnV0dG9ucycpLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKLSAgICAgICAgVUkuc2V0TW91c2VCdXR0b24oKTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBhZGRyZXNzIGJhcgotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB3aW5kb3cuc2Nyb2xsVG8oMCwgMSk7IH0sIDEwMCk7Ci0gICAgICAgIFVJLmZvcmNlU2V0dGluZygnY2xpcCcsIHRydWUpOwotICAgICAgICAkRCgnbm9WTkNfY2xpcCcpLmRpc2FibGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBVSS5pbml0U2V0dGluZygnY2xpcCcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvL2lPUyBTYWZhcmkgZG9lcyBub3Qgc3VwcG9ydCBDU1MgcG9zaXRpb246Zml4ZWQuCi0gICAgLy9UaGlzIGRldGVjdHMgaU9TIGRldmljZXMgYW5kIGVuYWJsZXMgamF2YXNjcmlwdCB3b3JrYXJvdW5kLgotICAgIGlmICgobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lL2kpKSB8fAotICAgICAgICAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBvZC9pKSkgfHwKLSAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQYWQvaSkpKSB7Ci0gICAgICAgIC8vVUkuc2V0T25zY3JvbGwoKTsKLSAgICAgICAgLy9VSS5zZXRSZXNpemUoKTsKLSAgICB9Ci0KLSAgICAkRCgnbm9WTkNfaG9zdCcpLmZvY3VzKCk7Ci0KLSAgICBVSS5zZXRWaWV3Q2xpcCgpOwotICAgIFV0aWwuYWRkRXZlbnQod2luZG93LCAncmVzaXplJywgVUkuc2V0Vmlld0NsaXApOwotCi0gICAgVXRpbC5hZGRFdmVudCh3aW5kb3csICdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIGlmIChVSS5yZmJfc3RhdGUgPT09ICdub3JtYWwnKSB7Ci0gICAgICAgICAgICByZXR1cm4gIllvdSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZC4iOwotICAgICAgICB9Ci0gICAgfSApOwotCi0gICAgLy8gU2hvdyBkZXNjcmlwdGlvbiBieSBkZWZhdWx0IHdoZW4gaG9zdGVkIGF0IGZvciBrYW5ha2EuZ2l0aHViLmNvbQotICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAia2FuYWthLmdpdGh1Yi5jb20iKSB7Ci0gICAgICAgIC8vIE9wZW4gdGhlIGRlc2NyaXB0aW9uIGRpYWxvZwotICAgICAgICAkRCgnbm9WTkNfZGVzY3JpcHRpb24nKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBPcGVuIHRoZSBjb25uZWN0IHBhbmVsIG9uIGZpcnN0IGxvYWQKLSAgICAgICAgVUkudG9nZ2xlQ29ubmVjdFBhbmVsKCk7Ci0gICAgfQotfSwKLQotLy8gUmVhZCBmb3JtIGNvbnRyb2wgY29tcGF0aWJsZSBzZXR0aW5nIGZyb20gY29va2llCi1nZXRTZXR0aW5nOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgdmFyIHZhbCwgY3RybCA9ICREKCdub1ZOQ18nICsgbmFtZSk7Ci0gICAgdmFsID0gV2ViVXRpbC5yZWFkQ29va2llKG5hbWUpOwotICAgIGlmIChjdHJsLnR5cGUgPT09ICdjaGVja2JveCcpIHsKLSAgICAgICAgaWYgKHZhbC50b0xvd2VyQ2FzZSgpIGluIHsnMCc6MSwgJ25vJzoxLCAnZmFsc2UnOjF9KSB7Ci0gICAgICAgICAgICB2YWwgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbDsKLX0sCi0KLS8vIFVwZGF0ZSBjb29raWUgYW5kIGZvcm0gY29udHJvbCBzZXR0aW5nLiBJZiB2YWx1ZSBpcyBub3Qgc2V0LCB0aGVuCi0vLyB1cGRhdGVzIGZyb20gY29udHJvbCB0byBjdXJyZW50IGNvb2tpZSBzZXR0aW5nLgotdXBkYXRlU2V0dGluZzogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKLQotICAgIHZhciBpLCBjdHJsID0gJEQoJ25vVk5DXycgKyBuYW1lKTsKLSAgICAvLyBTYXZlIHRoZSBjb29raWUgZm9yIHRoaXMgc2Vzc2lvbgotICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgIFdlYlV0aWwuY3JlYXRlQ29va2llKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHNldHRpbmdzIGNvbnRyb2wKLSAgICB2YWx1ZSA9IFVJLmdldFNldHRpbmcobmFtZSk7Ci0KLSAgICBpZiAoY3RybC50eXBlID09PSAnY2hlY2tib3gnKSB7Ci0gICAgICAgIGN0cmwuY2hlY2tlZCA9IHZhbHVlOwotCi0gICAgfSBlbHNlIGlmICh0eXBlb2YgY3RybC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3RybC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7Ci0gICAgICAgICAgICBpZiAoY3RybC5vcHRpb25zW2ldLnZhbHVlID09PSB2YWx1ZSkgewotICAgICAgICAgICAgICAgIGN0cmwuc2VsZWN0ZWRJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBTdHlsZXNoZWV0IHNlbGVjdGlvbiBkcm9wZG93bgorICAgICAgICAgICAgdmFyIHNoZWV0ID0gV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0KCk7CisgICAgICAgICAgICB2YXIgc2hlZXRzID0gV2ViVXRpbC5nZXRTdHlsZXNoZWV0cygpOworICAgICAgICAgICAgdmFyIGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2hlZXRzLmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgVUkuYWRkT3B0aW9uKCREKCdub1ZOQ19zdHlsZXNoZWV0Jyksc2hlZXRzW2ldLnRpdGxlLCBzaGVldHNbaV0udGl0bGUpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLypXZWlyZCBJRTkgZXJyb3IgbGVhZHMgdG8gJ251bGwnIGFwcGVhcnJpbmcKLSAgICAgICAgaW4gdGV4dGJveGVzIGluc3RlYWQgb2YgJycuKi8KLSAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGN0cmwudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19LAogCi0vLyBTYXZlIGNvbnRyb2wgc2V0dGluZyB0byBjb29raWUKLXNhdmVTZXR0aW5nOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgdmFyIHZhbCwgY3RybCA9ICREKCdub1ZOQ18nICsgbmFtZSk7Ci0gICAgaWYgKGN0cmwudHlwZSA9PT0gJ2NoZWNrYm94JykgewotICAgICAgICB2YWwgPSBjdHJsLmNoZWNrZWQ7Ci0gICAgfSBlbHNlIGlmICh0eXBlb2YgY3RybC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICB2YWwgPSBjdHJsLm9wdGlvbnNbY3RybC5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWwgPSBjdHJsLnZhbHVlOwotICAgIH0KLSAgICBXZWJVdGlsLmNyZWF0ZUNvb2tpZShuYW1lLCB2YWwpOwotICAgIC8vVXRpbC5EZWJ1ZygiU2V0dGluZyBzYXZlZCAnIiArIG5hbWUgKyAiPSIgKyB2YWwgKyAiJyIpOwotICAgIHJldHVybiB2YWw7Ci19LAorICAgICAgICAgICAgLy8gTG9nZ2luZyBzZWxlY3Rpb24gZHJvcGRvd24KKyAgICAgICAgICAgIHZhciBsbGV2ZWxzID0gWydlcnJvcicsICd3YXJuJywgJ2luZm8nLCAnZGVidWcnXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgVUkuYWRkT3B0aW9uKCREKCdub1ZOQ19sb2dnaW5nJyksbGxldmVsc1tpXSwgbGxldmVsc1tpXSk7CisgICAgICAgICAgICB9CiAKLS8vIEluaXRpYWwgcGFnZSBsb2FkIHJlYWQvaW5pdGlhbGl6YXRpb24gb2Ygc2V0dGluZ3MKLWluaXRTZXR0aW5nOiBmdW5jdGlvbihuYW1lLCBkZWZWYWwpIHsKLSAgICB2YXIgdmFsOworICAgICAgICAgICAgLy8gU2V0dGluZ3Mgd2l0aCBpbW1lZGlhdGUgZWZmZWN0cworICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ2xvZ2dpbmcnLCAnd2FybicpOworICAgICAgICAgICAgV2ViVXRpbC5pbml0X2xvZ2dpbmcoVUkuZ2V0U2V0dGluZygnbG9nZ2luZycpKTsKIAotICAgIC8vIENoZWNrIFF1ZXJ5IHN0cmluZyBmb2xsb3dlZCBieSBjb29raWUKLSAgICB2YWwgPSBXZWJVdGlsLmdldFF1ZXJ5VmFyKG5hbWUpOwotICAgIGlmICh2YWwgPT09IG51bGwpIHsKLSAgICAgICAgdmFsID0gV2ViVXRpbC5yZWFkQ29va2llKG5hbWUsIGRlZlZhbCk7Ci0gICAgfQotICAgIFVJLnVwZGF0ZVNldHRpbmcobmFtZSwgdmFsKTsKLSAvL1V0aWwuRGVidWcoIlNldHRpbmcgJyIgKyBuYW1lICsgIicgaW5pdGlhbGl6ZWQgdG8gJyIgKyB2YWwgKyAiJyIpOwotICAgIHJldHVybiB2YWw7Ci19LAorICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ3N0eWxlc2hlZXQnLCAnZGVmYXVsdCcpOworICAgICAgICAgICAgV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0KG51bGwpOworICAgICAgICAgICAgLy8gY2FsbCB0d2ljZSB0byBnZXQgYXJvdW5kIHdlYmtpdCBidWcKKyAgICAgICAgICAgIFdlYlV0aWwuc2VsZWN0U3R5bGVzaGVldChVSS5nZXRTZXR0aW5nKCdzdHlsZXNoZWV0JykpOwogCi0vLyBGb3JjZSBhIHNldHRpbmcgdG8gYmUgYSBjZXJ0YWluIHZhbHVlCi1mb3JjZVNldHRpbmc6IGZ1bmN0aW9uKG5hbWUsIHZhbCkgewotICAgIFVJLnVwZGF0ZVNldHRpbmcobmFtZSwgdmFsKTsKLSAgICByZXR1cm4gdmFsOwotfSwKKyAgICAgICAgICAgIC8vIGlmIHBvcnQgPT0gODAgKG9yIDQ0MykgdGhlbiBpdCB3b24ndCBiZSBwcmVzZW50IGFuZCBzaG91bGQgYmUKKyAgICAgICAgICAgIC8vIHNldCBtYW51YWxseQorICAgICAgICAgICAgdmFyIHBvcnQgPSB3aW5kb3cubG9jYXRpb24ucG9ydDsKKyAgICAgICAgICAgIGlmICghcG9ydCkgeworICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuc3Vic3RyaW5nKDAsNSkgPT0gJ2h0dHBzJykgeworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gNDQzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuc3Vic3RyaW5nKDAsNCkgPT0gJ2h0dHAnKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSA4MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBvcHVsYXRlIHRoZSBjb250cm9scyBpZiBkZWZhdWx0cyBhcmUgcHJvdmlkZWQgaW4gdGhlIFVSTCAqLworICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ2hvc3QnLCB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOworICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ3BvcnQnLCBwb3J0KTsKKyAgICAgICAgICAgIFVJLmluaXRTZXR0aW5nKCdwYXNzd29yZCcsICcnKTsKKyAgICAgICAgICAgIFVJLmluaXRTZXR0aW5nKCdlbmNyeXB0JywgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gImh0dHBzOiIpKTsKKyAgICAgICAgICAgIFVJLmluaXRTZXR0aW5nKCd0cnVlX2NvbG9yJywgdHJ1ZSk7CisgICAgICAgICAgICBVSS5pbml0U2V0dGluZygnY3Vyc29yJywgIVVJLmlzVG91Y2hEZXZpY2UpOworICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ3NoYXJlZCcsIHRydWUpOworICAgICAgICAgICAgVUkuaW5pdFNldHRpbmcoJ3ZpZXdfb25seScsIGZhbHNlKTsKKyAgICAgICAgICAgIFVJLmluaXRTZXR0aW5nKCdwYXRoJywgJ3dlYnNvY2tpZnknKTsKKyAgICAgICAgICAgIFVJLmluaXRTZXR0aW5nKCdyZXBlYXRlcklEJywgJycpOworCisgICAgICAgICAgICBVSS5yZmIgPSBuZXcgUkZCKHsndGFyZ2V0JzogJEQoJ25vVk5DX2NhbnZhcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uVXBkYXRlU3RhdGUnOiBVSS51cGRhdGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvblh2cEluaXQnOiBVSS51cGRhdGVYdnBWaXN1YWxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbkNsaXBib2FyZCc6IFVJLmNsaXBSZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uRGVza3RvcE5hbWUnOiBVSS51cGRhdGVEb2N1bWVudFRpdGxlfSk7CisKKyAgICAgICAgICAgIHZhciBhdXRvY29ubmVjdCA9IFdlYlV0aWwuZ2V0UXVlcnlWYXIoJ2F1dG9jb25uZWN0JywgZmFsc2UpOworICAgICAgICAgICAgaWYgKGF1dG9jb25uZWN0ID09PSAndHJ1ZScgfHwgYXV0b2Nvbm5lY3QgPT0gJzEnKSB7CisgICAgICAgICAgICAgICAgYXV0b2Nvbm5lY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIFVJLmNvbm5lY3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0b2Nvbm5lY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVUkudXBkYXRlVmlzdWFsU3RhdGUoKTsKKworICAgICAgICAgICAgLy8gU2hvdyBtb3VzZSBzZWxlY3RvciBidXR0b25zIG9uIHRvdWNoIHNjcmVlbiBkZXZpY2VzCisgICAgICAgICAgICBpZiAoVUkuaXNUb3VjaERldmljZSkgeworICAgICAgICAgICAgICAgIC8vIFNob3cgbW9iaWxlIGJ1dHRvbnMKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfbW9iaWxlX2J1dHRvbnMnKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICAgICAgVUkuc2V0TW91c2VCdXR0b24oKTsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFkZHJlc3MgYmFyCisgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgd2luZG93LnNjcm9sbFRvKDAsIDEpOyB9LCAxMDApOworICAgICAgICAgICAgICAgIFVJLmZvcmNlU2V0dGluZygnY2xpcCcsIHRydWUpOworICAgICAgICAgICAgICAgICREKCdub1ZOQ19jbGlwJykuZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVSS5pbml0U2V0dGluZygnY2xpcCcsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9pT1MgU2FmYXJpIGRvZXMgbm90IHN1cHBvcnQgQ1NTIHBvc2l0aW9uOmZpeGVkLgorICAgICAgICAgICAgLy9UaGlzIGRldGVjdHMgaU9TIGRldmljZXMgYW5kIGVuYWJsZXMgamF2YXNjcmlwdCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgaWYgKChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmUvaSkpIHx8CisgICAgICAgICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQb2QvaSkpIHx8CisgICAgICAgICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQYWQvaSkpKSB7CisgICAgICAgICAgICAgICAgLy9VSS5zZXRPbnNjcm9sbCgpOworICAgICAgICAgICAgICAgIC8vVUkuc2V0UmVzaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVSS5zZXRCYXJQb3NpdGlvbigpOworCisgICAgICAgICAgICAkRCgnbm9WTkNfaG9zdCcpLmZvY3VzKCk7CisKKyAgICAgICAgICAgIFVJLnNldFZpZXdDbGlwKCk7CisgICAgICAgICAgICBVdGlsLmFkZEV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScsIFVJLnNldFZpZXdDbGlwKTsKKworICAgICAgICAgICAgVXRpbC5hZGRFdmVudCh3aW5kb3csICdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgaWYgKFVJLnJmYl9zdGF0ZSA9PT0gJ25vcm1hbCcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZb3UgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICk7CisKKyAgICAgICAgICAgIC8vIFNob3cgZGVzY3JpcHRpb24gYnkgZGVmYXVsdCB3aGVuIGhvc3RlZCBhdCBmb3Iga2FuYWthLmdpdGh1Yi5jb20KKyAgICAgICAgICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAia2FuYWthLmdpdGh1Yi5pbyIpIHsKKyAgICAgICAgICAgICAgICAvLyBPcGVuIHRoZSBkZXNjcmlwdGlvbiBkaWFsb2cKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfZGVzY3JpcHRpb24nKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgY29ubmVjdCBwYW5lbCBvbiBmaXJzdCBsb2FkIHVubGVzcyBhdXRvY29ubmVjdGluZworICAgICAgICAgICAgICAgIGlmIChhdXRvY29ubmVjdCA9PT0gVUkuY29ublNldHRpbmdzT3BlbikgeworICAgICAgICAgICAgICAgICAgICBVSS50b2dnbGVDb25uZWN0UGFuZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBtb3VzZSBldmVudCBjbGljay9mb2N1cy9ibHVyIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSBVSQorICAgICAgICAgICAgVUkuYWRkTW91c2VIYW5kbGVycygpOworCisgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2soVUkucmZiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBhZGRNb3VzZUhhbmRsZXJzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIC8vIFNldHVwIGludGVyZmFjZSBoYW5kbGVycyB0aGF0IGNhbid0IGJlIGlubGluZQorICAgICAgICAgICAgJEQoIm5vVk5DX3ZpZXdfZHJhZ19idXR0b24iKS5vbmNsaWNrID0gVUkuc2V0Vmlld0RyYWc7CisgICAgICAgICAgICAkRCgibm9WTkNfbW91c2VfYnV0dG9uMCIpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IFVJLnNldE1vdXNlQnV0dG9uKDEpOyB9OworICAgICAgICAgICAgJEQoIm5vVk5DX21vdXNlX2J1dHRvbjEiKS5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeyBVSS5zZXRNb3VzZUJ1dHRvbigyKTsgfTsKKyAgICAgICAgICAgICREKCJub1ZOQ19tb3VzZV9idXR0b24yIikub25jbGljayA9IGZ1bmN0aW9uICgpIHsgVUkuc2V0TW91c2VCdXR0b24oNCk7IH07CisgICAgICAgICAgICAkRCgibm9WTkNfbW91c2VfYnV0dG9uNCIpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IFVJLnNldE1vdXNlQnV0dG9uKDApOyB9OworICAgICAgICAgICAgJEQoInNob3dLZXlib2FyZCIpLm9uY2xpY2sgPSBVSS5zaG93S2V5Ym9hcmQ7CisKKyAgICAgICAgICAgICREKCJrZXlib2FyZGlucHV0Iikub25pbnB1dCA9IFVJLmtleUlucHV0OworICAgICAgICAgICAgJEQoImtleWJvYXJkaW5wdXQiKS5vbmJsdXIgPSBVSS5rZXlJbnB1dEJsdXI7CisKKyAgICAgICAgICAgICREKCJzaG93RXh0cmFLZXlzQnV0dG9uIikub25jbGljayA9IFVJLnNob3dFeHRyYUtleXM7CisgICAgICAgICAgICAkRCgidG9nZ2xlQ3RybEJ1dHRvbiIpLm9uY2xpY2sgPSBVSS50b2dnbGVDdHJsOworICAgICAgICAgICAgJEQoInRvZ2dsZUFsdEJ1dHRvbiIpLm9uY2xpY2sgPSBVSS50b2dnbGVBbHQ7CisgICAgICAgICAgICAkRCgic2VuZFRhYkJ1dHRvbiIpLm9uY2xpY2sgPSBVSS5zZW5kVGFiOworICAgICAgICAgICAgJEQoInNlbmRFc2NCdXR0b24iKS5vbmNsaWNrID0gVUkuc2VuZEVzYzsKKworICAgICAgICAgICAgJEQoInNlbmRDdHJsQWx0RGVsQnV0dG9uIikub25jbGljayA9IFVJLnNlbmRDdHJsQWx0RGVsOworICAgICAgICAgICAgJEQoInh2cFNodXRkb3duQnV0dG9uIikub25jbGljayA9IFVJLnh2cFNodXRkb3duOworICAgICAgICAgICAgJEQoInh2cFJlYm9vdEJ1dHRvbiIpLm9uY2xpY2sgPSBVSS54dnBSZWJvb3Q7CisgICAgICAgICAgICAkRCgieHZwUmVzZXRCdXR0b24iKS5vbmNsaWNrID0gVUkueHZwUmVzZXQ7CisgICAgICAgICAgICAkRCgibm9WTkNfc3RhdHVzIikub25jbGljayA9IFVJLnRvZ2dsZVBvcHVwU3RhdHVzUGFuZWw7CisgICAgICAgICAgICAkRCgibm9WTkNfcG9wdXBfc3RhdHVzX3BhbmVsIikub25jbGljayA9IFVJLnRvZ2dsZVBvcHVwU3RhdHVzUGFuZWw7CisgICAgICAgICAgICAkRCgieHZwQnV0dG9uIikub25jbGljayA9IFVJLnRvZ2dsZVh2cFBhbmVsOworICAgICAgICAgICAgJEQoImNsaXBib2FyZEJ1dHRvbiIpLm9uY2xpY2sgPSBVSS50b2dnbGVDbGlwYm9hcmRQYW5lbDsKKyAgICAgICAgICAgICREKCJzZXR0aW5nc0J1dHRvbiIpLm9uY2xpY2sgPSBVSS50b2dnbGVTZXR0aW5nc1BhbmVsOworICAgICAgICAgICAgJEQoImNvbm5lY3RCdXR0b24iKS5vbmNsaWNrID0gVUkudG9nZ2xlQ29ubmVjdFBhbmVsOworICAgICAgICAgICAgJEQoImRpc2Nvbm5lY3RCdXR0b24iKS5vbmNsaWNrID0gVUkuZGlzY29ubmVjdDsKKyAgICAgICAgICAgICREKCJkZXNjcmlwdGlvbkJ1dHRvbiIpLm9uY2xpY2sgPSBVSS50b2dnbGVDb25uZWN0UGFuZWw7CisKKyAgICAgICAgICAgICREKCJub1ZOQ19jbGlwYm9hcmRfdGV4dCIpLm9uZm9jdXMgPSBVSS5kaXNwbGF5Qmx1cjsKKyAgICAgICAgICAgICREKCJub1ZOQ19jbGlwYm9hcmRfdGV4dCIpLm9uYmx1ciA9IFVJLmRpc3BsYXlGb2N1czsKKyAgICAgICAgICAgICREKCJub1ZOQ19jbGlwYm9hcmRfdGV4dCIpLm9uY2hhbmdlID0gVUkuY2xpcFNlbmQ7CisgICAgICAgICAgICAkRCgibm9WTkNfY2xpcGJvYXJkX2NsZWFyX2J1dHRvbiIpLm9uY2xpY2sgPSBVSS5jbGlwQ2xlYXI7CisKKyAgICAgICAgICAgICREKCJub1ZOQ19zZXR0aW5nc19tZW51Iikub25tb3VzZW92ZXIgPSBVSS5kaXNwbGF5Qmx1cjsKKyAgICAgICAgICAgICREKCJub1ZOQ19zZXR0aW5nc19tZW51Iikub25tb3VzZW92ZXIgPSBVSS5kaXNwbGF5Rm9jdXM7CisgICAgICAgICAgICAkRCgibm9WTkNfYXBwbHkiKS5vbmNsaWNrID0gVUkuc2V0dGluZ3NBcHBseTsKKworICAgICAgICAgICAgJEQoIm5vVk5DX2Nvbm5lY3RfYnV0dG9uIikub25jbGljayA9IFVJLmNvbm5lY3Q7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gUmVhZCBmb3JtIGNvbnRyb2wgY29tcGF0aWJsZSBzZXR0aW5nIGZyb20gY29va2llCisgICAgICAgIGdldFNldHRpbmc6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgICAgIHZhciBjdHJsID0gJEQoJ25vVk5DXycgKyBuYW1lKTsKKyAgICAgICAgICAgIHZhciB2YWwgPSBXZWJVdGlsLnJlYWRTZXR0aW5nKG5hbWUpOworICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCAmJiBjdHJsLnR5cGUgPT09ICdjaGVja2JveCcpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSBpbiB7JzAnOjEsICdubyc6MSwgJ2ZhbHNlJzoxfSkgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gVXBkYXRlIGNvb2tpZSBhbmQgZm9ybSBjb250cm9sIHNldHRpbmcuIElmIHZhbHVlIGlzIG5vdCBzZXQsIHRoZW4KKyAgICAgICAgLy8gdXBkYXRlcyBmcm9tIGNvbnRyb2wgdG8gY3VycmVudCBjb29raWUgc2V0dGluZy4KKyAgICAgICAgdXBkYXRlU2V0dGluZzogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY29va2llIGZvciB0aGlzIHNlc3Npb24KKyAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgV2ViVXRpbC53cml0ZVNldHRpbmcobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNldHRpbmdzIGNvbnRyb2wKKyAgICAgICAgICAgIHZhbHVlID0gVUkuZ2V0U2V0dGluZyhuYW1lKTsKKworICAgICAgICAgICAgdmFyIGN0cmwgPSAkRCgnbm9WTkNfJyArIG5hbWUpOworICAgICAgICAgICAgaWYgKGN0cmwudHlwZSA9PT0gJ2NoZWNrYm94JykgeworICAgICAgICAgICAgICAgIGN0cmwuY2hlY2tlZCA9IHZhbHVlOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdHJsLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHJsLm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0cmwub3B0aW9uc1tpXS52YWx1ZSA9PT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwuc2VsZWN0ZWRJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLypXZWlyZCBJRTkgZXJyb3IgbGVhZHMgdG8gJ251bGwnIGFwcGVhcnJpbmcKKyAgICAgICAgICAgICAgICBpbiB0ZXh0Ym94ZXMgaW5zdGVhZCBvZiAnJy4qLworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdHJsLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gU2F2ZSBjb250cm9sIHNldHRpbmcgdG8gY29va2llCisgICAgICAgIHNhdmVTZXR0aW5nOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgICAgICB2YXIgdmFsLCBjdHJsID0gJEQoJ25vVk5DXycgKyBuYW1lKTsKKyAgICAgICAgICAgIGlmIChjdHJsLnR5cGUgPT09ICdjaGVja2JveCcpIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBjdHJsLmNoZWNrZWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdHJsLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgdmFsID0gY3RybC5vcHRpb25zW2N0cmwuc2VsZWN0ZWRJbmRleF0udmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbCA9IGN0cmwudmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBXZWJVdGlsLndyaXRlU2V0dGluZyhuYW1lLCB2YWwpOworICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCJTZXR0aW5nIHNhdmVkICciICsgbmFtZSArICI9IiArIHZhbCArICInIik7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9LAorCisgICAgICAgIC8vIEluaXRpYWwgcGFnZSBsb2FkIHJlYWQvaW5pdGlhbGl6YXRpb24gb2Ygc2V0dGluZ3MKKyAgICAgICAgaW5pdFNldHRpbmc6IGZ1bmN0aW9uKG5hbWUsIGRlZlZhbCkgeworICAgICAgICAgICAgLy8gQ2hlY2sgUXVlcnkgc3RyaW5nIGZvbGxvd2VkIGJ5IGNvb2tpZQorICAgICAgICAgICAgdmFyIHZhbCA9IFdlYlV0aWwuZ2V0UXVlcnlWYXIobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsID0gV2ViVXRpbC5yZWFkU2V0dGluZyhuYW1lLCBkZWZWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUkudXBkYXRlU2V0dGluZyhuYW1lLCB2YWwpOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBGb3JjZSBhIHNldHRpbmcgdG8gYmUgYSBjZXJ0YWluIHZhbHVlCisgICAgICAgIGZvcmNlU2V0dGluZzogZnVuY3Rpb24obmFtZSwgdmFsKSB7CisgICAgICAgICAgICBVSS51cGRhdGVTZXR0aW5nKG5hbWUsIHZhbCk7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9LAogCiAKLS8vIFNob3cgdGhlIGNsaXBib2FyZCBwYW5lbAotdG9nZ2xlQ2xpcGJvYXJkUGFuZWw6IGZ1bmN0aW9uKCkgewotICAgIC8vIENsb3NlIHRoZSBkZXNjcmlwdGlvbiBwYW5lbAotICAgICREKCdub1ZOQ19kZXNjcmlwdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgLy9DbG9zZSBzZXR0aW5ncyBpZiBvcGVuCi0gICAgaWYgKFVJLnNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgewotICAgICAgICBVSS5zZXR0aW5nc0FwcGx5KCk7Ci0gICAgICAgIFVJLmNsb3NlU2V0dGluZ3NNZW51KCk7Ci0gICAgfQotICAgIC8vQ2xvc2UgY29ubmVjdGlvbiBzZXR0aW5ncyBpZiBvcGVuCi0gICAgaWYgKFVJLmNvbm5TZXR0aW5nc09wZW4gPT09IHRydWUpIHsKLSAgICAgICAgVUkudG9nZ2xlQ29ubmVjdFBhbmVsKCk7Ci0gICAgfQotICAgIC8vVG9nZ2xlIENsaXBib2FyZCBQYW5lbAotICAgIGlmIChVSS5jbGlwYm9hcmRPcGVuID09PSB0cnVlKSB7Ci0gICAgICAgICREKCdub1ZOQ19jbGlwYm9hcmQnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAkRCgnY2xpcGJvYXJkQnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b24iOwotICAgICAgICBVSS5jbGlwYm9hcmRPcGVuID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgJEQoJ25vVk5DX2NsaXBib2FyZCcpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwotICAgICAgICAkRCgnY2xpcGJvYXJkQnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOwotICAgICAgICBVSS5jbGlwYm9hcmRPcGVuID0gdHJ1ZTsKLSAgICB9Ci19LAorICAgICAgICAvLyBTaG93IHRoZSBwb3B1cCBzdGF0dXMgcGFuZWwKKyAgICAgICAgdG9nZ2xlUG9wdXBTdGF0dXNQYW5lbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgcHNwID0gJEQoJ25vVk5DX3BvcHVwX3N0YXR1c19wYW5lbCcpOworICAgICAgICAgICAgaWYgKFVJLnBvcHVwU3RhdHVzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIHBzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgIFVJLnBvcHVwU3RhdHVzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwc3AuaW5uZXJIVE1MID0gJEQoJ25vVk5DX3N0YXR1cycpLmlubmVySFRNTDsKKyAgICAgICAgICAgICAgICBwc3Auc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisgICAgICAgICAgICAgICAgcHNwLnN0eWxlLmxlZnQgPSB3aW5kb3cuaW5uZXJXaWR0aC8yIC0KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUocHNwLCBmYWxzZSkud2lkdGgpLzIgLTMwICsgInB4IjsKKyAgICAgICAgICAgICAgICBVSS5wb3B1cFN0YXR1c09wZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0vLyBTaG93IHRoZSBjb25uZWN0aW9uIHNldHRpbmdzIHBhbmVsL21lbnUKLXRvZ2dsZUNvbm5lY3RQYW5lbDogZnVuY3Rpb24oKSB7Ci0gICAgLy8gQ2xvc2UgdGhlIGRlc2NyaXB0aW9uIHBhbmVsCi0gICAgJEQoJ25vVk5DX2Rlc2NyaXB0aW9uJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAvL0Nsb3NlIGNvbm5lY3Rpb24gc2V0dGluZ3MgaWYgb3BlbgotICAgIGlmIChVSS5zZXR0aW5nc09wZW4gPT09IHRydWUpIHsKLSAgICAgICAgVUkuc2V0dGluZ3NBcHBseSgpOwotICAgICAgICBVSS5jbG9zZVNldHRpbmdzTWVudSgpOwotICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKLSAgICB9Ci0gICAgaWYgKFVJLmNsaXBib2FyZE9wZW4gPT09IHRydWUpIHsKLSAgICAgICAgVUkudG9nZ2xlQ2xpcGJvYXJkUGFuZWwoKTsKLSAgICB9CisgICAgICAgIC8vIFNob3cgdGhlIFhWUCBwYW5lbAorICAgICAgICB0b2dnbGVYdnBQYW5lbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGVzY3JpcHRpb24gcGFuZWwKKyAgICAgICAgICAgICREKCdub1ZOQ19kZXNjcmlwdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAvLyBDbG9zZSBzZXR0aW5ncyBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkuc2V0dGluZ3NPcGVuID09PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgVUkuc2V0dGluZ3NBcHBseSgpOworICAgICAgICAgICAgICAgIFVJLmNsb3NlU2V0dGluZ3NNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbG9zZSBjb25uZWN0aW9uIHNldHRpbmdzIGlmIG9wZW4KKyAgICAgICAgICAgIGlmIChVSS5jb25uU2V0dGluZ3NPcGVuID09PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgVUkudG9nZ2xlQ29ubmVjdFBhbmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbG9zZSBwb3B1cCBzdGF0dXMgcGFuZWwgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLnBvcHVwU3RhdHVzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZVBvcHVwU3RhdHVzUGFuZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsb3NlIGNsaXBib2FyZCBwYW5lbCBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkuY2xpcGJvYXJkT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZUNsaXBib2FyZFBhbmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUb2dnbGUgWFZQIHBhbmVsCisgICAgICAgICAgICBpZiAoVUkueHZwT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICREKCdub1ZOQ194dnAnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgICREKCd4dnBCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7CisgICAgICAgICAgICAgICAgVUkueHZwT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfeHZwJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisgICAgICAgICAgICAgICAgJEQoJ3h2cEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uX3NlbGVjdGVkIjsKKyAgICAgICAgICAgICAgICBVSS54dnBPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKIAotICAgIC8vVG9nZ2xlIENvbm5lY3Rpb24gUGFuZWwKLSAgICBpZiAoVUkuY29ublNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgewotICAgICAgICAkRCgnbm9WTkNfY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKLSAgICAgICAgVUkuY29ublNldHRpbmdzT3BlbiA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICREKCdub1ZOQ19jb250cm9scycpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwotICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uX3NlbGVjdGVkIjsKLSAgICAgICAgVUkuY29ublNldHRpbmdzT3BlbiA9IHRydWU7Ci0gICAgICAgICREKCdub1ZOQ19ob3N0JykuZm9jdXMoKTsKLSAgICB9Ci19LAorICAgICAgICAvLyBTaG93IHRoZSBjbGlwYm9hcmQgcGFuZWwKKyAgICAgICAgdG9nZ2xlQ2xpcGJvYXJkUGFuZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRlc2NyaXB0aW9uIHBhbmVsCisgICAgICAgICAgICAkRCgnbm9WTkNfZGVzY3JpcHRpb24nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgLy8gQ2xvc2Ugc2V0dGluZ3MgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLnNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnNldHRpbmdzQXBwbHkoKTsKKyAgICAgICAgICAgICAgICBVSS5jbG9zZVNldHRpbmdzTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2xvc2UgY29ubmVjdGlvbiBzZXR0aW5ncyBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkuY29ublNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZUNvbm5lY3RQYW5lbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2xvc2UgcG9wdXAgc3RhdHVzIHBhbmVsIGlmIG9wZW4KKyAgICAgICAgICAgIGlmIChVSS5wb3B1cFN0YXR1c09wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS50b2dnbGVQb3B1cFN0YXR1c1BhbmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbG9zZSBYVlAgcGFuZWwgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLnh2cE9wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS50b2dnbGVYdnBQYW5lbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVG9nZ2xlIENsaXBib2FyZCBQYW5lbAorICAgICAgICAgICAgaWYgKFVJLmNsaXBib2FyZE9wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfY2xpcGJvYXJkJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgICAgICAkRCgnY2xpcGJvYXJkQnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b24iOworICAgICAgICAgICAgICAgIFVJLmNsaXBib2FyZE9wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2NsaXBib2FyZCcpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworICAgICAgICAgICAgICAgICREKCdjbGlwYm9hcmRCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbl9zZWxlY3RlZCI7CisgICAgICAgICAgICAgICAgVUkuY2xpcGJvYXJkT3BlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAKLS8vIFRvZ2dsZSB0aGUgc2V0dGluZ3MgbWVudToKLS8vICAgT24gb3Blbiwgc2V0dGluZ3MgYXJlIHJlZnJlc2hlZCBmcm9tIHNhdmVkIGNvb2tpZXMuCi0vLyAgIE9uIGNsb3NlLCBzZXR0aW5ncyBhcmUgYXBwbGllZAotdG9nZ2xlU2V0dGluZ3NQYW5lbDogZnVuY3Rpb24oKSB7Ci0gICAgLy8gQ2xvc2UgdGhlIGRlc2NyaXB0aW9uIHBhbmVsCi0gICAgJEQoJ25vVk5DX2Rlc2NyaXB0aW9uJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICBpZiAoVUkuc2V0dGluZ3NPcGVuKSB7Ci0gICAgICAgIFVJLnNldHRpbmdzQXBwbHkoKTsKLSAgICAgICAgVUkuY2xvc2VTZXR0aW5nc01lbnUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCdlbmNyeXB0Jyk7Ci0gICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ3RydWVfY29sb3InKTsKLSAgICAgICAgaWYgKFVJLnJmYi5nZXRfZGlzcGxheSgpLmdldF9jdXJzb3JfdXJpKCkpIHsKLSAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2N1cnNvcicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVUkudXBkYXRlU2V0dGluZygnY3Vyc29yJywgZmFsc2UpOwotICAgICAgICAgICAgJEQoJ25vVk5DX2N1cnNvcicpLmRpc2FibGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCdjbGlwJyk7Ci0gICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ3NoYXJlZCcpOwotICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCd2aWV3X29ubHknKTsKLSAgICAgICAgVUkudXBkYXRlU2V0dGluZygnY29ubmVjdFRpbWVvdXQnKTsKLSAgICAgICAgVUkudXBkYXRlU2V0dGluZygncGF0aCcpOwotICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCdzdHlsZXNoZWV0Jyk7Ci0gICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2xvZ2dpbmcnKTsKKyAgICAgICAgLy8gU2hvdyB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBwYW5lbC9tZW51CisgICAgICAgIHRvZ2dsZUNvbm5lY3RQYW5lbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGVzY3JpcHRpb24gcGFuZWwKKyAgICAgICAgICAgICREKCdub1ZOQ19kZXNjcmlwdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAvLyBDbG9zZSBjb25uZWN0aW9uIHNldHRpbmdzIGlmIG9wZW4KKyAgICAgICAgICAgIGlmIChVSS5zZXR0aW5nc09wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS5zZXR0aW5nc0FwcGx5KCk7CisgICAgICAgICAgICAgICAgVUkuY2xvc2VTZXR0aW5nc01lbnUoKTsKKyAgICAgICAgICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsb3NlIGNsaXBib2FyZCBwYW5lbCBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkuY2xpcGJvYXJkT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZUNsaXBib2FyZFBhbmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbG9zZSBwb3B1cCBzdGF0dXMgcGFuZWwgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLnBvcHVwU3RhdHVzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZVBvcHVwU3RhdHVzUGFuZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsb3NlIFhWUCBwYW5lbCBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkueHZwT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZVh2cFBhbmVsKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgVUkub3BlblNldHRpbmdzTWVudSgpOwotICAgIH0KLX0sCisgICAgICAgICAgICAvLyBUb2dnbGUgQ29ubmVjdGlvbiBQYW5lbAorICAgICAgICAgICAgaWYgKFVJLmNvbm5TZXR0aW5nc09wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgICREKCdjb25uZWN0QnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b24iOworICAgICAgICAgICAgICAgIFVJLmNvbm5TZXR0aW5nc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBVSS5zYXZlU2V0dGluZygnaG9zdCcpOworICAgICAgICAgICAgICAgIFVJLnNhdmVTZXR0aW5nKCdwb3J0Jyk7CisgICAgICAgICAgICAgICAgLy9VSS5zYXZlU2V0dGluZygncGFzc3dvcmQnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2NvbnRyb2xzJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisgICAgICAgICAgICAgICAgJEQoJ2Nvbm5lY3RCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbl9zZWxlY3RlZCI7CisgICAgICAgICAgICAgICAgVUkuY29ublNldHRpbmdzT3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2hvc3QnKS5mb2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0vLyBPcGVuIG1lbnUKLW9wZW5TZXR0aW5nc01lbnU6IGZ1bmN0aW9uKCkgewotICAgIC8vIENsb3NlIHRoZSBkZXNjcmlwdGlvbiBwYW5lbAotICAgICREKCdub1ZOQ19kZXNjcmlwdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgaWYgKFVJLmNsaXBib2FyZE9wZW4gPT09IHRydWUpIHsKLSAgICAgICAgVUkudG9nZ2xlQ2xpcGJvYXJkUGFuZWwoKTsKLSAgICB9Ci0gICAgLy9DbG9zZSBjb25uZWN0aW9uIHNldHRpbmdzIGlmIG9wZW4KLSAgICBpZiAoVUkuY29ublNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgewotICAgICAgICBVSS50b2dnbGVDb25uZWN0UGFuZWwoKTsKLSAgICB9Ci0gICAgJEQoJ25vVk5DX3NldHRpbmdzJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgJEQoJ3NldHRpbmdzQnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOwotICAgIFVJLnNldHRpbmdzT3BlbiA9IHRydWU7Ci19LAorICAgICAgICAvLyBUb2dnbGUgdGhlIHNldHRpbmdzIG1lbnU6CisgICAgICAgIC8vICAgT24gb3Blbiwgc2V0dGluZ3MgYXJlIHJlZnJlc2hlZCBmcm9tIHNhdmVkIGNvb2tpZXMuCisgICAgICAgIC8vICAgT24gY2xvc2UsIHNldHRpbmdzIGFyZSBhcHBsaWVkCisgICAgICAgIHRvZ2dsZVNldHRpbmdzUGFuZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRlc2NyaXB0aW9uIHBhbmVsCisgICAgICAgICAgICAkRCgnbm9WTkNfZGVzY3JpcHRpb24nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgaWYgKFVJLnNldHRpbmdzT3BlbikgeworICAgICAgICAgICAgICAgIFVJLnNldHRpbmdzQXBwbHkoKTsKKyAgICAgICAgICAgICAgICBVSS5jbG9zZVNldHRpbmdzTWVudSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCdlbmNyeXB0Jyk7CisgICAgICAgICAgICAgICAgVUkudXBkYXRlU2V0dGluZygndHJ1ZV9jb2xvcicpOworICAgICAgICAgICAgICAgIGlmIChVSS5yZmIuZ2V0X2Rpc3BsYXkoKS5nZXRfY3Vyc29yX3VyaSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2N1cnNvcicpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2N1cnNvcicsICFVSS5pc1RvdWNoRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2N1cnNvcicpLmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVUkudXBkYXRlU2V0dGluZygnY2xpcCcpOworICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ3NoYXJlZCcpOworICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ3ZpZXdfb25seScpOworICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ3BhdGgnKTsKKyAgICAgICAgICAgICAgICBVSS51cGRhdGVTZXR0aW5nKCdyZXBlYXRlcklEJyk7CisgICAgICAgICAgICAgICAgVUkudXBkYXRlU2V0dGluZygnc3R5bGVzaGVldCcpOworICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2xvZ2dpbmcnKTsKIAotLy8gQ2xvc2UgbWVudSAod2l0aG91dCBhcHBseWluZyBzZXR0aW5ncykKLWNsb3NlU2V0dGluZ3NNZW51OiBmdW5jdGlvbigpIHsKLSAgICAkRCgnbm9WTkNfc2V0dGluZ3MnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICREKCdzZXR0aW5nc0J1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKLSAgICBVSS5zZXR0aW5nc09wZW4gPSBmYWxzZTsKLX0sCisgICAgICAgICAgICAgICAgVUkub3BlblNldHRpbmdzTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0vLyBTYXZlL2FwcGx5IHNldHRpbmdzIHdoZW4gJ0FwcGx5JyBidXR0b24gaXMgcHJlc3NlZAotc2V0dGluZ3NBcHBseTogZnVuY3Rpb24oKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBzZXR0aW5nc0FwcGx5Iik7Ci0gICAgVUkuc2F2ZVNldHRpbmcoJ2VuY3J5cHQnKTsKLSAgICBVSS5zYXZlU2V0dGluZygndHJ1ZV9jb2xvcicpOwotICAgIGlmIChVSS5yZmIuZ2V0X2Rpc3BsYXkoKS5nZXRfY3Vyc29yX3VyaSgpKSB7Ci0gICAgICAgIFVJLnNhdmVTZXR0aW5nKCdjdXJzb3InKTsKLSAgICB9Ci0gICAgVUkuc2F2ZVNldHRpbmcoJ2NsaXAnKTsKLSAgICBVSS5zYXZlU2V0dGluZygnc2hhcmVkJyk7Ci0gICAgVUkuc2F2ZVNldHRpbmcoJ3ZpZXdfb25seScpOwotICAgIFVJLnNhdmVTZXR0aW5nKCdjb25uZWN0VGltZW91dCcpOwotICAgIFVJLnNhdmVTZXR0aW5nKCdwYXRoJyk7Ci0gICAgVUkuc2F2ZVNldHRpbmcoJ3N0eWxlc2hlZXQnKTsKLSAgICBVSS5zYXZlU2V0dGluZygnbG9nZ2luZycpOworICAgICAgICAvLyBPcGVuIG1lbnUKKyAgICAgICAgb3BlblNldHRpbmdzTWVudTogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGVzY3JpcHRpb24gcGFuZWwKKyAgICAgICAgICAgICREKCdub1ZOQ19kZXNjcmlwdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAvLyBDbG9zZSBjbGlwYm9hcmQgcGFuZWwgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLmNsaXBib2FyZE9wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS50b2dnbGVDbGlwYm9hcmRQYW5lbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2xvc2UgY29ubmVjdGlvbiBzZXR0aW5ncyBpZiBvcGVuCisgICAgICAgICAgICBpZiAoVUkuY29ublNldHRpbmdzT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnRvZ2dsZUNvbm5lY3RQYW5lbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2xvc2UgcG9wdXAgc3RhdHVzIHBhbmVsIGlmIG9wZW4KKyAgICAgICAgICAgIGlmIChVSS5wb3B1cFN0YXR1c09wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS50b2dnbGVQb3B1cFN0YXR1c1BhbmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbG9zZSBYVlAgcGFuZWwgaWYgb3BlbgorICAgICAgICAgICAgaWYgKFVJLnh2cE9wZW4gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBVSS50b2dnbGVYdnBQYW5lbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJEQoJ25vVk5DX3NldHRpbmdzJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisgICAgICAgICAgICAkRCgnc2V0dGluZ3NCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbl9zZWxlY3RlZCI7CisgICAgICAgICAgICBVSS5zZXR0aW5nc09wZW4gPSB0cnVlOworICAgICAgICB9LAogCi0gICAgLy8gU2V0dGluZ3Mgd2l0aCBpbW1lZGlhdGUgKG5vbi1jb25uZWN0ZWQgcmVsYXRlZCkgZWZmZWN0Ci0gICAgV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0KFVJLmdldFNldHRpbmcoJ3N0eWxlc2hlZXQnKSk7Ci0gICAgV2ViVXRpbC5pbml0X2xvZ2dpbmcoVUkuZ2V0U2V0dGluZygnbG9nZ2luZycpKTsKLSAgICBVSS5zZXRWaWV3Q2xpcCgpOwotICAgIFVJLnNldFZpZXdEcmFnKFVJLnJmYi5nZXRfdmlld3BvcnREcmFnKCkpOwotICAgIC8vVXRpbC5EZWJ1ZygiPDwgc2V0dGluZ3NBcHBseSIpOwotfSwKKyAgICAgICAgLy8gQ2xvc2UgbWVudSAod2l0aG91dCBhcHBseWluZyBzZXR0aW5ncykKKyAgICAgICAgY2xvc2VTZXR0aW5nc01lbnU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgJEQoJ25vVk5DX3NldHRpbmdzJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgICREKCdzZXR0aW5nc0J1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKKyAgICAgICAgICAgIFVJLnNldHRpbmdzT3BlbiA9IGZhbHNlOworICAgICAgICB9LAorCisgICAgICAgIC8vIFNhdmUvYXBwbHkgc2V0dGluZ3Mgd2hlbiAnQXBwbHknIGJ1dHRvbiBpcyBwcmVzc2VkCisgICAgICAgIHNldHRpbmdzQXBwbHk6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCI+PiBzZXR0aW5nc0FwcGx5Iik7CisgICAgICAgICAgICBVSS5zYXZlU2V0dGluZygnZW5jcnlwdCcpOworICAgICAgICAgICAgVUkuc2F2ZVNldHRpbmcoJ3RydWVfY29sb3InKTsKKyAgICAgICAgICAgIGlmIChVSS5yZmIuZ2V0X2Rpc3BsYXkoKS5nZXRfY3Vyc29yX3VyaSgpKSB7CisgICAgICAgICAgICAgICAgVUkuc2F2ZVNldHRpbmcoJ2N1cnNvcicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUkuc2F2ZVNldHRpbmcoJ2NsaXAnKTsKKyAgICAgICAgICAgIFVJLnNhdmVTZXR0aW5nKCdzaGFyZWQnKTsKKyAgICAgICAgICAgIFVJLnNhdmVTZXR0aW5nKCd2aWV3X29ubHknKTsKKyAgICAgICAgICAgIFVJLnNhdmVTZXR0aW5nKCdwYXRoJyk7CisgICAgICAgICAgICBVSS5zYXZlU2V0dGluZygncmVwZWF0ZXJJRCcpOworICAgICAgICAgICAgVUkuc2F2ZVNldHRpbmcoJ3N0eWxlc2hlZXQnKTsKKyAgICAgICAgICAgIFVJLnNhdmVTZXR0aW5nKCdsb2dnaW5nJyk7CisKKyAgICAgICAgICAgIC8vIFNldHRpbmdzIHdpdGggaW1tZWRpYXRlIChub24tY29ubmVjdGVkIHJlbGF0ZWQpIGVmZmVjdAorICAgICAgICAgICAgV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0KFVJLmdldFNldHRpbmcoJ3N0eWxlc2hlZXQnKSk7CisgICAgICAgICAgICBXZWJVdGlsLmluaXRfbG9nZ2luZyhVSS5nZXRTZXR0aW5nKCdsb2dnaW5nJykpOworICAgICAgICAgICAgVUkuc2V0Vmlld0NsaXAoKTsKKyAgICAgICAgICAgIFVJLnNldFZpZXdEcmFnKFVJLnJmYi5nZXRfdmlld3BvcnREcmFnKCkpOworICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCI8PCBzZXR0aW5nc0FwcGx5Iik7CisgICAgICAgIH0sCiAKIAogCi1zZXRQYXNzd29yZDogZnVuY3Rpb24oKSB7Ci0gICAgVUkucmZiLnNlbmRQYXNzd29yZCgkRCgnbm9WTkNfcGFzc3dvcmQnKS52YWx1ZSk7Ci0gICAgLy9SZXNldCBjb25uZWN0IGJ1dHRvbi4KLSAgICAkRCgnbm9WTkNfY29ubmVjdF9idXR0b24nKS52YWx1ZSA9ICJDb25uZWN0IjsKLSAgICAkRCgnbm9WTkNfY29ubmVjdF9idXR0b24nKS5vbmNsaWNrID0gVUkuQ29ubmVjdDsKLSAgICAvL0hpZGUgY29ubmVjdGlvbiBwYW5lbC4KLSAgICBVSS50b2dnbGVDb25uZWN0UGFuZWwoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19LAorICAgICAgICBzZXRQYXNzd29yZDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5yZmIuc2VuZFBhc3N3b3JkKCREKCdub1ZOQ19wYXNzd29yZCcpLnZhbHVlKTsKKyAgICAgICAgICAgIC8vUmVzZXQgY29ubmVjdCBidXR0b24uCisgICAgICAgICAgICAkRCgnbm9WTkNfY29ubmVjdF9idXR0b24nKS52YWx1ZSA9ICJDb25uZWN0IjsKKyAgICAgICAgICAgICREKCdub1ZOQ19jb25uZWN0X2J1dHRvbicpLm9uY2xpY2sgPSBVSS5Db25uZWN0OworICAgICAgICAgICAgLy9IaWRlIGNvbm5lY3Rpb24gcGFuZWwuCisgICAgICAgICAgICBVSS50b2dnbGVDb25uZWN0UGFuZWwoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSwKIAotc2VuZEN0cmxBbHREZWw6IGZ1bmN0aW9uKCkgewotICAgIFVJLnJmYi5zZW5kQ3RybEFsdERlbCgpOwotfSwKKyAgICAgICAgc2VuZEN0cmxBbHREZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVUkucmZiLnNlbmRDdHJsQWx0RGVsKCk7CisgICAgICAgIH0sCiAKLXNldE1vdXNlQnV0dG9uOiBmdW5jdGlvbihudW0pIHsKLSAgICB2YXIgYiwgYmxpc3QgPSBbMCwgMSwyLDRdLCBidXR0b247CisgICAgICAgIHh2cFNodXRkb3duOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIFVJLnJmYi54dnBTaHV0ZG93bigpOworICAgICAgICB9LAogCi0gICAgaWYgKHR5cGVvZiBudW0gPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgIC8vIERpc2FibGUgbW91c2UgYnV0dG9ucwotICAgICAgICBudW0gPSAtMTsKLSAgICB9Ci0gICAgaWYgKFVJLnJmYikgewotICAgICAgICBVSS5yZmIuZ2V0X21vdXNlKCkuc2V0X3RvdWNoQnV0dG9uKG51bSk7Ci0gICAgfQorICAgICAgICB4dnBSZWJvb3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVUkucmZiLnh2cFJlYm9vdCgpOworICAgICAgICB9LAogCi0gICAgZm9yIChiID0gMDsgYiA8IGJsaXN0Lmxlbmd0aDsgYisrKSB7Ci0gICAgICAgIGJ1dHRvbiA9ICREKCdub1ZOQ19tb3VzZV9idXR0b24nICsgYmxpc3RbYl0pOwotICAgICAgICBpZiAoYmxpc3RbYl0gPT09IG51bSkgewotICAgICAgICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiYmxhY2siOwotICAgICAgICAgICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gImxpZ2h0Z3JheSI7Ci0gICAgICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiI7Ci0gICAgICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSAiIjsKLSAgICAgICAgICAgICovCi0gICAgICAgIH0KLSAgICB9Ci19LAorICAgICAgICB4dnBSZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5yZmIueHZwUmVzZXQoKTsKKyAgICAgICAgfSwKIAotdXBkYXRlU3RhdGU6IGZ1bmN0aW9uKHJmYiwgc3RhdGUsIG9sZHN0YXRlLCBtc2cpIHsKLSAgICB2YXIgcywgc2IsIGMsIGQsIGNhZCwgdmQsIGtsYXNzOwotICAgIFVJLnJmYl9zdGF0ZSA9IHN0YXRlOwotICAgIHMgPSAkRCgnbm9WTkNfc3RhdHVzJyk7Ci0gICAgc2IgPSAkRCgnbm9WTkNfc3RhdHVzX2JhcicpOwotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSAnZmFpbGVkJzoKLSAgICAgICAgY2FzZSAnZmF0YWwnOgotICAgICAgICAgICAga2xhc3MgPSAibm9WTkNfc3RhdHVzX2Vycm9yIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdub3JtYWwnOgotICAgICAgICAgICAga2xhc3MgPSAibm9WTkNfc3RhdHVzX25vcm1hbCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzoKLSAgICAgICAgICAgICREKCdub1ZOQ19sb2dvJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLSAgICAgICAgY2FzZSAnbG9hZGVkJzoKLSAgICAgICAgICAgIGtsYXNzID0gIm5vVk5DX3N0YXR1c19ub3JtYWwiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzoKKyAgICAgICAgc2V0TW91c2VCdXR0b246IGZ1bmN0aW9uKG51bSkgeworICAgICAgICAgICAgaWYgKHR5cGVvZiBudW0gPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBtb3VzZSBidXR0b25zCisgICAgICAgICAgICAgICAgbnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVUkucmZiKSB7CisgICAgICAgICAgICAgICAgVUkucmZiLmdldF9tb3VzZSgpLnNldF90b3VjaEJ1dHRvbihudW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmxpc3QgPSBbMCwgMSwyLDRdOworICAgICAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBibGlzdC5sZW5ndGg7IGIrKykgeworICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSAkRCgnbm9WTkNfbW91c2VfYnV0dG9uJyArIGJsaXN0W2JdKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxpc3RbYl0gPT09IG51bSkgeworICAgICAgICAgICAgICAgICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICB1cGRhdGVTdGF0ZTogZnVuY3Rpb24ocmZiLCBzdGF0ZSwgb2xkc3RhdGUsIG1zZykgeworICAgICAgICAgICAgVUkucmZiX3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB2YXIga2xhc3M7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZmFpbGVkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdmYXRhbCc6CisgICAgICAgICAgICAgICAgICAgIGtsYXNzID0gIm5vVk5DX3N0YXR1c19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ25vcm1hbCc6CisgICAgICAgICAgICAgICAgICAgIGtsYXNzID0gIm5vVk5DX3N0YXR1c19ub3JtYWwiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOgorICAgICAgICAgICAgICAgICAgICAkRCgnbm9WTkNfbG9nbycpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworICAgICAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSAnbG9hZGVkJzoKKyAgICAgICAgICAgICAgICAgICAga2xhc3MgPSAibm9WTkNfc3RhdHVzX25vcm1hbCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzoKKyAgICAgICAgICAgICAgICAgICAgVUkudG9nZ2xlQ29ubmVjdFBhbmVsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2Nvbm5lY3RfYnV0dG9uJykudmFsdWUgPSAiU2VuZCBQYXNzd29yZCI7CisgICAgICAgICAgICAgICAgICAgICREKCdub1ZOQ19jb25uZWN0X2J1dHRvbicpLm9uY2xpY2sgPSBVSS5zZXRQYXNzd29yZDsKKyAgICAgICAgICAgICAgICAgICAgJEQoJ25vVk5DX3Bhc3N3b3JkJykuZm9jdXMoKTsKKworICAgICAgICAgICAgICAgICAgICBrbGFzcyA9ICJub1ZOQ19zdGF0dXNfd2FybiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGtsYXNzID0gIm5vVk5DX3N0YXR1c193YXJuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlb2YobXNnKSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkMtY29udHJvbC1iYXInKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwga2xhc3MpOworICAgICAgICAgICAgICAgICREKCdub1ZOQ19zdGF0dXMnKS5pbm5lckhUTUwgPSBtc2c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVJLnVwZGF0ZVZpc3VhbFN0YXRlKCk7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gRGlzYWJsZS9lbmFibGUgY29udHJvbHMgZGVwZW5kaW5nIG9uIGNvbm5lY3Rpb24gc3RhdGUKKyAgICAgICAgdXBkYXRlVmlzdWFsU3RhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGNvbm5lY3RlZCA9IFVJLnJmYl9zdGF0ZSA9PT0gJ25vcm1hbCcgPyB0cnVlIDogZmFsc2U7CisKKyAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiPj4gdXBkYXRlVmlzdWFsU3RhdGUiKTsKKyAgICAgICAgICAgICREKCdub1ZOQ19lbmNyeXB0JykuZGlzYWJsZWQgPSBjb25uZWN0ZWQ7CisgICAgICAgICAgICAkRCgnbm9WTkNfdHJ1ZV9jb2xvcicpLmRpc2FibGVkID0gY29ubmVjdGVkOworICAgICAgICAgICAgaWYgKFVJLnJmYiAmJiBVSS5yZmIuZ2V0X2Rpc3BsYXkoKSAmJgorICAgICAgICAgICAgICAgIFVJLnJmYi5nZXRfZGlzcGxheSgpLmdldF9jdXJzb3JfdXJpKCkpIHsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfY3Vyc29yJykuZGlzYWJsZWQgPSBjb25uZWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2N1cnNvcicsICFVSS5pc1RvdWNoRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfY3Vyc29yJykuZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJEQoJ25vVk5DX3NoYXJlZCcpLmRpc2FibGVkID0gY29ubmVjdGVkOworICAgICAgICAgICAgJEQoJ25vVk5DX3ZpZXdfb25seScpLmRpc2FibGVkID0gY29ubmVjdGVkOworICAgICAgICAgICAgJEQoJ25vVk5DX3BhdGgnKS5kaXNhYmxlZCA9IGNvbm5lY3RlZDsKKyAgICAgICAgICAgICREKCdub1ZOQ19yZXBlYXRlcklEJykuZGlzYWJsZWQgPSBjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBVSS5zZXRWaWV3Q2xpcCgpOworICAgICAgICAgICAgICAgIFVJLnNldE1vdXNlQnV0dG9uKDEpOworICAgICAgICAgICAgICAgICREKCdjbGlwYm9hcmRCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICAgICAgJEQoJ3Nob3dLZXlib2FyZCcpLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKyAgICAgICAgICAgICAgICAkRCgnbm9WTkNfZXh0cmFfa2V5cycpLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICAgICAgICAgICAgICAkRCgnc2VuZEN0cmxBbHREZWxCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVJLnNldE1vdXNlQnV0dG9uKCk7CisgICAgICAgICAgICAgICAgJEQoJ2NsaXBib2FyZEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgJEQoJ3Nob3dLZXlib2FyZCcpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2V4dHJhX2tleXMnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgICREKCdzZW5kQ3RybEFsdERlbEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgVUkudXBkYXRlWHZwVmlzdWFsU3RhdGUoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXRlIGNoYW5nZSBkaXNhYmxlcyB2aWV3cG9ydCBkcmFnZ2luZy4KKyAgICAgICAgICAgIC8vIEl0IGlzIGVuYWJsZWQgKHRvZ2dsZWQpIGJ5IGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uCisgICAgICAgICAgICBVSS5zZXRWaWV3RHJhZyhmYWxzZSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoVUkucmZiX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZmF0YWwnOgorICAgICAgICAgICAgICAgIGNhc2UgJ2ZhaWxlZCc6CisgICAgICAgICAgICAgICAgY2FzZSAnbG9hZGVkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOgorICAgICAgICAgICAgICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgJEQoJ2Rpc2Nvbm5lY3RCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgICAgICREKCdkaXNjb25uZWN0QnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICIiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9VdGlsLkRlYnVnKCI8PCB1cGRhdGVWaXN1YWxTdGF0ZSIpOworICAgICAgICB9LAorCisgICAgICAgIC8vIERpc2FibGUvZW5hYmxlIFhWUCBidXR0b24KKyAgICAgICAgdXBkYXRlWHZwVmlzdWFsU3RhdGU6IGZ1bmN0aW9uKHZlcikgeworICAgICAgICAgICAgaWYgKHZlciA+PSAxKSB7CisgICAgICAgICAgICAgICAgJEQoJ3h2cEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJEQoJ3h2cEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgICAgICAgICAgICAgLy8gQ2xvc2UgWFZQIHBhbmVsIGlmIG9wZW4KKyAgICAgICAgICAgICAgICBpZiAoVUkueHZwT3BlbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBVSS50b2dnbGVYdnBQYW5lbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvLyBEaXNwbGF5IHRoZSBkZXNrdG9wIG5hbWUgaW4gdGhlIGRvY3VtZW50IHRpdGxlCisgICAgICAgIHVwZGF0ZURvY3VtZW50VGl0bGU6IGZ1bmN0aW9uKHJmYiwgbmFtZSkgeworICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBuYW1lICsgIiAtIG5vVk5DIjsKKyAgICAgICAgfSwKKworICAgICAgICBjbGlwUmVjZWl2ZTogZnVuY3Rpb24ocmZiLCB0ZXh0KSB7CisgICAgICAgICAgICBVdGlsLkRlYnVnKCI+PiBVSS5jbGlwUmVjZWl2ZTogIiArIHRleHQuc3Vic3RyKDAsNDApICsgIi4uLiIpOworICAgICAgICAgICAgJEQoJ25vVk5DX2NsaXBib2FyZF90ZXh0JykudmFsdWUgPSB0ZXh0OworICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPDwgVUkuY2xpcFJlY2VpdmUiKTsKKyAgICAgICAgfSwKKworICAgICAgICBjb25uZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIFVJLmNsb3NlU2V0dGluZ3NNZW51KCk7CiAgICAgICAgICAgICBVSS50b2dnbGVDb25uZWN0UGFuZWwoKTsKIAotICAgICAgICAgICAgJEQoJ25vVk5DX2Nvbm5lY3RfYnV0dG9uJykudmFsdWUgPSAiU2VuZCBQYXNzd29yZCI7Ci0gICAgICAgICAgICAkRCgnbm9WTkNfY29ubmVjdF9idXR0b24nKS5vbmNsaWNrID0gVUkuc2V0UGFzc3dvcmQ7Ci0gICAgICAgICAgICAkRCgnbm9WTkNfcGFzc3dvcmQnKS5mb2N1cygpOworICAgICAgICAgICAgdmFyIGhvc3QgPSAkRCgnbm9WTkNfaG9zdCcpLnZhbHVlOworICAgICAgICAgICAgdmFyIHBvcnQgPSAkRCgnbm9WTkNfcG9ydCcpLnZhbHVlOworICAgICAgICAgICAgdmFyIHBhc3N3b3JkID0gJEQoJ25vVk5DX3Bhc3N3b3JkJykudmFsdWU7CisgICAgICAgICAgICB2YXIgcGF0aCA9ICREKCdub1ZOQ19wYXRoJykudmFsdWU7CisgICAgICAgICAgICBpZiAoKCFob3N0KSB8fCAoIXBvcnQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNdXN0IHNldCBob3N0IGFuZCBwb3J0Iik7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGtsYXNzID0gIm5vVk5DX3N0YXR1c193YXJuIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAga2xhc3MgPSAibm9WTkNfc3RhdHVzX3dhcm4iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgICAgICAgVUkucmZiLnNldF9lbmNyeXB0KFVJLmdldFNldHRpbmcoJ2VuY3J5cHQnKSk7CisgICAgICAgICAgICBVSS5yZmIuc2V0X3RydWVfY29sb3IoVUkuZ2V0U2V0dGluZygndHJ1ZV9jb2xvcicpKTsKKyAgICAgICAgICAgIFVJLnJmYi5zZXRfbG9jYWxfY3Vyc29yKFVJLmdldFNldHRpbmcoJ2N1cnNvcicpKTsKKyAgICAgICAgICAgIFVJLnJmYi5zZXRfc2hhcmVkKFVJLmdldFNldHRpbmcoJ3NoYXJlZCcpKTsKKyAgICAgICAgICAgIFVJLnJmYi5zZXRfdmlld19vbmx5KFVJLmdldFNldHRpbmcoJ3ZpZXdfb25seScpKTsKKyAgICAgICAgICAgIFVJLnJmYi5zZXRfcmVwZWF0ZXJJRChVSS5nZXRTZXR0aW5nKCdyZXBlYXRlcklEJykpOwogCi0gICAgaWYgKHR5cGVvZihtc2cpICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICBzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBrbGFzcyk7Ci0gICAgICAgIHNiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBrbGFzcyk7Ci0gICAgICAgIHMuaW5uZXJIVE1MID0gbXNnOwotICAgIH0KKyAgICAgICAgICAgIFVJLnJmYi5jb25uZWN0KGhvc3QsIHBvcnQsIHBhc3N3b3JkLCBwYXRoKTsKIAotICAgIFVJLnVwZGF0ZVZpc3VhbFN0YXRlKCk7Ci19LAorICAgICAgICAgICAgLy9DbG9zZSBkaWFsb2cuCisgICAgICAgICAgICBzZXRUaW1lb3V0KFVJLnNldEJhclBvc2l0aW9uLCAxMDApOworICAgICAgICAgICAgJEQoJ25vVk5DX2xvZ28nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworICAgICAgICB9LAogCi0vLyBEaXNhYmxlL2VuYWJsZSBjb250cm9scyBkZXBlbmRpbmcgb24gY29ubmVjdGlvbiBzdGF0ZQotdXBkYXRlVmlzdWFsU3RhdGU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb25uZWN0ZWQgPSBVSS5yZmJfc3RhdGUgPT09ICdub3JtYWwnID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBkaXNjb25uZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIFVJLmNsb3NlU2V0dGluZ3NNZW51KCk7CisgICAgICAgICAgICBVSS5yZmIuZGlzY29ubmVjdCgpOwogCi0gICAgLy9VdGlsLkRlYnVnKCI+PiB1cGRhdGVWaXN1YWxTdGF0ZSIpOwotICAgICREKCdub1ZOQ19lbmNyeXB0JykuZGlzYWJsZWQgPSBjb25uZWN0ZWQ7Ci0gICAgJEQoJ25vVk5DX3RydWVfY29sb3InKS5kaXNhYmxlZCA9IGNvbm5lY3RlZDsKLSAgICBpZiAoVUkucmZiICYmIFVJLnJmYi5nZXRfZGlzcGxheSgpICYmCi0gICAgICAgIFVJLnJmYi5nZXRfZGlzcGxheSgpLmdldF9jdXJzb3JfdXJpKCkpIHsKLSAgICAgICAgJEQoJ25vVk5DX2N1cnNvcicpLmRpc2FibGVkID0gY29ubmVjdGVkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2N1cnNvcicsIGZhbHNlKTsKLSAgICAgICAgJEQoJ25vVk5DX2N1cnNvcicpLmRpc2FibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgJEQoJ25vVk5DX3NoYXJlZCcpLmRpc2FibGVkID0gY29ubmVjdGVkOwotICAgICREKCdub1ZOQ192aWV3X29ubHknKS5kaXNhYmxlZCA9IGNvbm5lY3RlZDsKLSAgICAkRCgnbm9WTkNfY29ubmVjdFRpbWVvdXQnKS5kaXNhYmxlZCA9IGNvbm5lY3RlZDsKLSAgICAkRCgnbm9WTkNfcGF0aCcpLmRpc2FibGVkID0gY29ubmVjdGVkOworICAgICAgICAgICAgJEQoJ25vVk5DX2xvZ28nKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKyAgICAgICAgICAgIFVJLmNvbm5TZXR0aW5nc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIFVJLnRvZ2dsZUNvbm5lY3RQYW5lbCgpOworICAgICAgICB9LAogCi0gICAgaWYgKGNvbm5lY3RlZCkgewotICAgICAgICBVSS5zZXRWaWV3Q2xpcCgpOwotICAgICAgICBVSS5zZXRNb3VzZUJ1dHRvbigxKTsKLSAgICAgICAgJEQoJ2NsaXBib2FyZEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKLSAgICAgICAgJEQoJ3Nob3dLZXlib2FyZCcpLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKLSAgICAgICAgJEQoJ3NlbmRDdHJsQWx0RGVsQnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFVJLnNldE1vdXNlQnV0dG9uKCk7Ci0gICAgICAgICREKCdjbGlwYm9hcmRCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAkRCgnc2hvd0tleWJvYXJkJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgJEQoJ3NlbmRDdHJsQWx0RGVsQnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICB9Ci0gICAgLy8gU3RhdGUgY2hhbmdlIGRpc2FibGVzIHZpZXdwb3J0IGRyYWdnaW5nLgotICAgIC8vIEl0IGlzIGVuYWJsZWQgKHRvZ2dsZWQpIGJ5IGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uCi0gICAgVUkuc2V0Vmlld0RyYWcoZmFsc2UpOworICAgICAgICBkaXNwbGF5Qmx1cjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5yZmIuZ2V0X2tleWJvYXJkKCkuc2V0X2ZvY3VzZWQoZmFsc2UpOworICAgICAgICAgICAgVUkucmZiLmdldF9tb3VzZSgpLnNldF9mb2N1c2VkKGZhbHNlKTsKKyAgICAgICAgfSwKIAotICAgIHN3aXRjaCAoVUkucmZiX3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgJ2ZhdGFsJzoKLSAgICAgICAgY2FzZSAnZmFpbGVkJzoKLSAgICAgICAgY2FzZSAnbG9hZGVkJzoKLSAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzoKLSAgICAgICAgICAgICREKCdjb25uZWN0QnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgICAgICAgJEQoJ2Rpc2Nvbm5lY3RCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAkRCgnY29ubmVjdEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgICAgICAkRCgnZGlzY29ubmVjdEJ1dHRvbicpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgICAgZGlzcGxheUZvY3VzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIFVJLnJmYi5nZXRfa2V5Ym9hcmQoKS5zZXRfZm9jdXNlZCh0cnVlKTsKKyAgICAgICAgICAgIFVJLnJmYi5nZXRfbW91c2UoKS5zZXRfZm9jdXNlZCh0cnVlKTsKKyAgICAgICAgfSwKIAotICAgIC8vVXRpbC5EZWJ1ZygiPDwgdXBkYXRlVmlzdWFsU3RhdGUiKTsKLX0sCisgICAgICAgIGNsaXBDbGVhcjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAkRCgnbm9WTkNfY2xpcGJvYXJkX3RleHQnKS52YWx1ZSA9ICIiOworICAgICAgICAgICAgVUkucmZiLmNsaXBib2FyZFBhc3RlRnJvbSgiIik7CisgICAgICAgIH0sCiAKKyAgICAgICAgY2xpcFNlbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIHRleHQgPSAkRCgnbm9WTkNfY2xpcGJvYXJkX3RleHQnKS52YWx1ZTsKKyAgICAgICAgICAgIFV0aWwuRGVidWcoIj4+IFVJLmNsaXBTZW5kOiAiICsgdGV4dC5zdWJzdHIoMCw0MCkgKyAiLi4uIik7CisgICAgICAgICAgICBVSS5yZmIuY2xpcGJvYXJkUGFzdGVGcm9tKHRleHQpOworICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPDwgVUkuY2xpcFNlbmQiKTsKKyAgICAgICAgfSwKIAotY2xpcFJlY2VpdmU6IGZ1bmN0aW9uKHJmYiwgdGV4dCkgewotICAgIFV0aWwuRGVidWcoIj4+IFVJLmNsaXBSZWNlaXZlOiAiICsgdGV4dC5zdWJzdHIoMCw0MCkgKyAiLi4uIik7Ci0gICAgJEQoJ25vVk5DX2NsaXBib2FyZF90ZXh0JykudmFsdWUgPSB0ZXh0OwotICAgIFV0aWwuRGVidWcoIjw8IFVJLmNsaXBSZWNlaXZlIik7Ci19LAorICAgICAgICAvLyBFbmFibGUvZGlzYWJsZSBhbmQgY29uZmlndXJlIHZpZXdwb3J0IGNsaXBwaW5nCisgICAgICAgIHNldFZpZXdDbGlwOiBmdW5jdGlvbihjbGlwKSB7CisgICAgICAgICAgICB2YXIgZGlzcGxheTsKKyAgICAgICAgICAgIGlmIChVSS5yZmIpIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5ID0gVUkucmZiLmdldF9kaXNwbGF5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgdmFyIGN1cl9jbGlwID0gZGlzcGxheS5nZXRfdmlld3BvcnQoKTsKIAotY29ubmVjdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGhvc3QsIHBvcnQsIHBhc3N3b3JkLCBwYXRoOworICAgICAgICAgICAgaWYgKHR5cGVvZihjbGlwKSAhPT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnJlbnQgc2V0dGluZworICAgICAgICAgICAgICAgIGNsaXAgPSBVSS5nZXRTZXR0aW5nKCdjbGlwJyk7CisgICAgICAgICAgICB9CiAKLSAgICBVSS5jbG9zZVNldHRpbmdzTWVudSgpOwotICAgIFVJLnRvZ2dsZUNvbm5lY3RQYW5lbCgpOworICAgICAgICAgICAgaWYgKGNsaXAgJiYgIWN1cl9jbGlwKSB7CisgICAgICAgICAgICAgICAgLy8gVHVybiBjbGlwcGluZyBvbgorICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2NsaXAnLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaXAgJiYgY3VyX2NsaXApIHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIGNsaXBwaW5nIG9mZgorICAgICAgICAgICAgICAgIFVJLnVwZGF0ZVNldHRpbmcoJ2NsaXAnLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZGlzcGxheS5zZXRfdmlld3BvcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICREKCdub1ZOQ19jYW52YXMnKS5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnOworICAgICAgICAgICAgICAgIGRpc3BsYXkudmlld3BvcnRDaGFuZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChVSS5nZXRTZXR0aW5nKCdjbGlwJykpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBjbGlwcGluZywgdXBkYXRlIGNsaXBwaW5nIHNldHRpbmdzCisgICAgICAgICAgICAgICAgJEQoJ25vVk5DX2NhbnZhcycpLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKyAgICAgICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRQb3NpdGlvbigkRCgnbm9WTkNfY2FudmFzJykpOworICAgICAgICAgICAgICAgIHZhciBuZXdfdyA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcG9zLng7CisgICAgICAgICAgICAgICAgdmFyIG5ld19oID0gd2luZG93LmlubmVySGVpZ2h0IC0gcG9zLnk7CisgICAgICAgICAgICAgICAgZGlzcGxheS5zZXRfdmlld3BvcnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgZGlzcGxheS52aWV3cG9ydENoYW5nZSgwLCAwLCBuZXdfdywgbmV3X2gpOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0gICAgaG9zdCA9ICREKCdub1ZOQ19ob3N0JykudmFsdWU7Ci0gICAgcG9ydCA9ICREKCdub1ZOQ19wb3J0JykudmFsdWU7Ci0gICAgcGFzc3dvcmQgPSAkRCgnbm9WTkNfcGFzc3dvcmQnKS52YWx1ZTsKLSAgICBwYXRoID0gJEQoJ25vVk5DX3BhdGgnKS52YWx1ZTsKLSAgICBpZiAoKCFob3N0KSB8fCAoIXBvcnQpKSB7Ci0gICAgICAgIHRocm93KCJNdXN0IHNldCBob3N0IGFuZCBwb3J0Iik7Ci0gICAgfQorICAgICAgICAvLyBUb2dnbGUvc2V0L3Vuc2V0IHRoZSB2aWV3cG9ydCBkcmFnL21vdmUgYnV0dG9uCisgICAgICAgIHNldFZpZXdEcmFnOiBmdW5jdGlvbihkcmFnKSB7CisgICAgICAgICAgICB2YXIgdm1iID0gJEQoJ25vVk5DX3ZpZXdfZHJhZ19idXR0b24nKTsKKyAgICAgICAgICAgIGlmICghVUkucmZiKSB7IHJldHVybjsgfQogCi0gICAgVUkucmZiLnNldF9lbmNyeXB0KFVJLmdldFNldHRpbmcoJ2VuY3J5cHQnKSk7Ci0gICAgVUkucmZiLnNldF90cnVlX2NvbG9yKFVJLmdldFNldHRpbmcoJ3RydWVfY29sb3InKSk7Ci0gICAgVUkucmZiLnNldF9sb2NhbF9jdXJzb3IoVUkuZ2V0U2V0dGluZygnY3Vyc29yJykpOwotICAgIFVJLnJmYi5zZXRfc2hhcmVkKFVJLmdldFNldHRpbmcoJ3NoYXJlZCcpKTsKLSAgICBVSS5yZmIuc2V0X3ZpZXdfb25seShVSS5nZXRTZXR0aW5nKCd2aWV3X29ubHknKSk7Ci0gICAgVUkucmZiLnNldF9jb25uZWN0VGltZW91dChVSS5nZXRTZXR0aW5nKCdjb25uZWN0VGltZW91dCcpKTsKKyAgICAgICAgICAgIGlmIChVSS5yZmJfc3RhdGUgPT09ICdub3JtYWwnICYmCisgICAgICAgICAgICAgICAgVUkucmZiLmdldF9kaXNwbGF5KCkuZ2V0X3ZpZXdwb3J0KCkpIHsKKyAgICAgICAgICAgICAgICB2bWIuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2bWIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgIH0KIAotICAgIFVJLnJmYi5jb25uZWN0KGhvc3QsIHBvcnQsIHBhc3N3b3JkLCBwYXRoKTsKLSAgICAvL0Nsb3NlIGRpYWxvZy4KLSAgICBzZXRUaW1lb3V0KFVJLnNldEJhclBvc2l0aW9uLCAxMDApOwotICAgICREKCdub1ZOQ19sb2dvJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLX0sCisgICAgICAgICAgICBpZiAodHlwZW9mKGRyYWcpID09PSAidW5kZWZpbmVkIiB8fAorICAgICAgICAgICAgICAgIHR5cGVvZihkcmFnKSA9PT0gIm9iamVjdCIpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRvZ2dsZQorICAgICAgICAgICAgICAgIGRyYWcgPSAhVUkucmZiLmdldF92aWV3cG9ydERyYWcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkcmFnKSB7CisgICAgICAgICAgICAgICAgdm1iLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uX3NlbGVjdGVkIjsKKyAgICAgICAgICAgICAgICBVSS5yZmIuc2V0X3ZpZXdwb3J0RHJhZyh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdm1iLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKKyAgICAgICAgICAgICAgICBVSS5yZmIuc2V0X3ZpZXdwb3J0RHJhZyhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAKLWRpc2Nvbm5lY3Q6IGZ1bmN0aW9uKCkgewotICAgIFVJLmNsb3NlU2V0dGluZ3NNZW51KCk7Ci0gICAgVUkucmZiLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgLy8gT24gdG91Y2ggZGV2aWNlcywgc2hvdyB0aGUgT1Mga2V5Ym9hcmQKKyAgICAgICAgc2hvd0tleWJvYXJkOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBrYmkgPSAkRCgna2V5Ym9hcmRpbnB1dCcpOworICAgICAgICAgICAgdmFyIHNrYiA9ICREKCdzaG93S2V5Ym9hcmQnKTsKKyAgICAgICAgICAgIHZhciBsID0ga2JpLnZhbHVlLmxlbmd0aDsKKyAgICAgICAgICAgIGlmKFVJLmtleWJvYXJkVmlzaWJsZSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBrYmkuZm9jdXMoKTsKKyAgICAgICAgICAgICAgICB0cnkgeyBrYmkuc2V0U2VsZWN0aW9uUmFuZ2UobCwgbCk7IH0gLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZAorICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHt9IC8vIHNldFNlbGVjdGlvblJhbmdlIGlzIHVuZGVmaW5lZCBpbiBHb29nbGUgQ2hyb21lCisgICAgICAgICAgICAgICAgVUkua2V5Ym9hcmRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBza2IuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOworICAgICAgICAgICAgfSBlbHNlIGlmKFVJLmtleWJvYXJkVmlzaWJsZSA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIGtiaS5ibHVyKCk7CisgICAgICAgICAgICAgICAgc2tiLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKKyAgICAgICAgICAgICAgICBVSS5rZXlib2FyZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKIAotICAgICREKCdub1ZOQ19sb2dvJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgVUkuY29ublNldHRpbmdzT3BlbiA9IGZhbHNlOwotICAgIFVJLnRvZ2dsZUNvbm5lY3RQYW5lbCgpOwotfSwKKyAgICAgICAga2VlcEtleWJvYXJkOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNsZWFyVGltZW91dChVSS5oaWRlS2V5Ym9hcmRUaW1lb3V0KTsKKyAgICAgICAgICAgIGlmKFVJLmtleWJvYXJkVmlzaWJsZSA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICREKCdrZXlib2FyZGlucHV0JykuZm9jdXMoKTsKKyAgICAgICAgICAgICAgICAkRCgnc2hvd0tleWJvYXJkJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOworICAgICAgICAgICAgfSBlbHNlIGlmKFVJLmtleWJvYXJkVmlzaWJsZSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAkRCgna2V5Ym9hcmRpbnB1dCcpLmJsdXIoKTsKKyAgICAgICAgICAgICAgICAkRCgnc2hvd0tleWJvYXJkJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b24iOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi1kaXNwbGF5Qmx1cjogZnVuY3Rpb24oKSB7Ci0gICAgVUkucmZiLmdldF9rZXlib2FyZCgpLnNldF9mb2N1c2VkKGZhbHNlKTsKLSAgICBVSS5yZmIuZ2V0X21vdXNlKCkuc2V0X2ZvY3VzZWQoZmFsc2UpOwotfSwKKyAgICAgICAga2V5Ym9hcmRpbnB1dFJlc2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBrYmkgPSAkRCgna2V5Ym9hcmRpbnB1dCcpOworICAgICAgICAgICAga2JpLnZhbHVlID0gbmV3IEFycmF5KFVJLmRlZmF1bHRLZXlib2FyZGlucHV0TGVuKS5qb2luKCJfIik7CisgICAgICAgICAgICBVSS5sYXN0S2V5Ym9hcmRpbnB1dCA9IGtiaS52YWx1ZTsKKyAgICAgICAgfSwKIAotZGlzcGxheUZvY3VzOiBmdW5jdGlvbigpIHsKLSAgICBVSS5yZmIuZ2V0X2tleWJvYXJkKCkuc2V0X2ZvY3VzZWQodHJ1ZSk7Ci0gICAgVUkucmZiLmdldF9tb3VzZSgpLnNldF9mb2N1c2VkKHRydWUpOwotfSwKKyAgICAgICAgLy8gV2hlbiBub3JtYWwga2V5Ym9hcmQgZXZlbnRzIGFyZSBsZWZ0IHVuY291Z2h0LCB1c2UgdGhlIGlucHV0IGV2ZW50cyBmcm9tCisgICAgICAgIC8vIHRoZSBrZXlib2FyZGlucHV0IGVsZW1lbnQgaW5zdGVhZCBhbmQgZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGV2ZW50cy4KKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHJlcXVpcmVkIHNpbmNlIHNvbWUgYnJvd3NlcnMgb24gQW5kcm9pZCBhcmUgaW5jb25zaXN0ZW50IGluCisgICAgICAgIC8vIHNlbmRpbmcga2V5Q29kZXMgaW4gdGhlIG5vcm1hbCBrZXlib2FyZCBldmVudHMgd2hlbiB1c2luZyBvbiBzY3JlZW4ga2V5Ym9hcmRzLgorICAgICAgICBrZXlJbnB1dDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTsKKyAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IFVJLmxhc3RLZXlib2FyZGlucHV0OwogCi1jbGlwQ2xlYXI6IGZ1bmN0aW9uKCkgewotICAgICREKCdub1ZOQ19jbGlwYm9hcmRfdGV4dCcpLnZhbHVlID0gIiI7Ci0gICAgVUkucmZiLmNsaXBib2FyZFBhc3RlRnJvbSgiIik7Ci19LAorICAgICAgICAgICAgdmFyIG5ld0xlbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGNoZWNrIGNhcmV0IHBvc2l0aW9uIHNpbmNlIHdoaXRlc3BhY2UgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgIC8vIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYnkgdmFsdWUubGVuZ3RoIGluIHNvbWUgYnJvd3NlcnMKKyAgICAgICAgICAgICAgICBuZXdMZW4gPSBNYXRoLm1heChldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsIG5ld1ZhbHVlLmxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb25TdGFydCBpcyB1bmRlZmluZWQgaW4gR29vZ2xlIENocm9tZQorICAgICAgICAgICAgICAgIG5ld0xlbiA9IG5ld1ZhbHVlLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBvbGRMZW4gPSBvbGRWYWx1ZS5sZW5ndGg7CiAKLWNsaXBTZW5kOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGV4dCA9ICREKCdub1ZOQ19jbGlwYm9hcmRfdGV4dCcpLnZhbHVlOwotICAgIFV0aWwuRGVidWcoIj4+IFVJLmNsaXBTZW5kOiAiICsgdGV4dC5zdWJzdHIoMCw0MCkgKyAiLi4uIik7Ci0gICAgVUkucmZiLmNsaXBib2FyZFBhc3RlRnJvbSh0ZXh0KTsKLSAgICBVdGlsLkRlYnVnKCI8PCBVSS5jbGlwU2VuZCIpOwotfSwKKyAgICAgICAgICAgIHZhciBiYWNrc3BhY2VzOworICAgICAgICAgICAgdmFyIGlucHV0cyA9IG5ld0xlbiAtIG9sZExlbjsKKyAgICAgICAgICAgIGlmIChpbnB1dHMgPCAwKSB7CisgICAgICAgICAgICAgICAgYmFja3NwYWNlcyA9IC1pbnB1dHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhY2tzcGFjZXMgPSAwOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDb21wYXJlIHRoZSBvbGQgc3RyaW5nIHdpdGggdGhlIG5ldyB0byBhY2NvdW50IGZvcgorICAgICAgICAgICAgLy8gdGV4dC1jb3JyZWN0aW9ucyBvciBvdGhlciBpbnB1dCB0aGF0IG1vZGlmeSBleGlzdGluZyB0ZXh0CisgICAgICAgICAgICB2YXIgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNYXRoLm1pbihvbGRMZW4sIG5ld0xlbik7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5jaGFyQXQoaSkgIT0gb2xkVmFsdWUuY2hhckF0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0cyA9IG5ld0xlbiAtIGk7CisgICAgICAgICAgICAgICAgICAgIGJhY2tzcGFjZXMgPSBvbGRMZW4gLSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLS8vIEVuYWJsZS9kaXNhYmxlIGFuZCBjb25maWd1cmUgdmlld3BvcnQgY2xpcHBpbmcKLXNldFZpZXdDbGlwOiBmdW5jdGlvbihjbGlwKSB7Ci0gICAgdmFyIGRpc3BsYXksIGN1cl9jbGlwLCBwb3MsIG5ld193LCBuZXdfaDsKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGtleSBldmVudHMKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiYWNrc3BhY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBVSS5yZmIuc2VuZEtleShYS19CYWNrU3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gbmV3TGVuIC0gaW5wdXRzOyBpIDwgbmV3TGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBVSS5yZmIuc2VuZEtleShuZXdWYWx1ZS5jaGFyQ29kZUF0KGkpKTsKKyAgICAgICAgICAgIH0KIAotICAgIGlmIChVSS5yZmIpIHsKLSAgICAgICAgZGlzcGxheSA9IFVJLnJmYi5nZXRfZGlzcGxheSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgICAgICAgICAvLyBDb250cm9sIHRoZSB0ZXh0IGNvbnRlbnQgbGVuZ3RoIGluIHRoZSBrZXlib2FyZGlucHV0IGVsZW1lbnQKKyAgICAgICAgICAgIGlmIChuZXdMZW4gPiAyICogVUkuZGVmYXVsdEtleWJvYXJkaW5wdXRMZW4pIHsKKyAgICAgICAgICAgICAgICBVSS5rZXlib2FyZGlucHV0UmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3TGVuIDwgMSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFsd2F5cyBoYXZlIHRvIGJlIHNvbWUgdGV4dCBpbiB0aGUga2V5Ym9hcmRpbnB1dAorICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgd2l0aCB3aGljaCBiYWNrc3BhY2UgY2FuIGludGVyYWN0LgorICAgICAgICAgICAgICAgIFVJLmtleWJvYXJkaW5wdXRSZXNldCgpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgc29tZXRpbWVzIGNhdXNlcyB0aGUga2V5Ym9hcmQgdG8gZGlzYXBwZWFyIGZvciBhIHNlY29uZAorICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCBpcyByZXF1aXJlZCBmb3IgdGhlIGFuZHJvaWQga2V5Ym9hcmQgdG8gcmVjb2duaXplIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5ibHVyKCk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgcmFuIG91dHNpZGUgb2YgdGhlIGlucHV0IGhhbmRsZXIgaW4gb3JkZXIgdG8gd29yaworICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFVJLmtlZXBLZXlib2FyZCgpOyB9LCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVUkubGFzdEtleWJvYXJkaW5wdXQgPSBuZXdWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKIAotICAgIGN1cl9jbGlwID0gZGlzcGxheS5nZXRfdmlld3BvcnQoKTsKKyAgICAgICAga2V5SW5wdXRCbHVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICREKCdzaG93S2V5Ym9hcmQnKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7CisgICAgICAgICAgICAvL1dlaXJkIGJ1ZyBpbiBpT1MgaWYgeW91IGNoYW5nZSBrZXlib2FyZFZpc2libGUKKyAgICAgICAgICAgIC8vaGVyZSBpdCBkb2VzIG5vdCBhY3R1YWxseSBvY2N1ciBzbyBuZXh0IHRpbWUKKyAgICAgICAgICAgIC8veW91IGNsaWNrIGtleWJvYXJkIGljb24gaXQgZG9lc250IHdvcmsuCisgICAgICAgICAgICBVSS5oaWRlS2V5Ym9hcmRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgVUkuc2V0S2V5Ym9hcmQoKTsgfSwxMDApOworICAgICAgICB9LAogCi0gICAgaWYgKHR5cGVvZihjbGlwKSAhPT0gJ2Jvb2xlYW4nKSB7Ci0gICAgICAgIC8vIFVzZSBjdXJyZW50IHNldHRpbmcKLSAgICAgICAgY2xpcCA9IFVJLmdldFNldHRpbmcoJ2NsaXAnKTsKLSAgICB9CisgICAgICAgIHNob3dFeHRyYUtleXM6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVUkua2VlcEtleWJvYXJkKCk7CisgICAgICAgICAgICBpZihVSS5leHRyYUtleXNWaXNpYmxlID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICREKCd0b2dnbGVDdHJsQnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOworICAgICAgICAgICAgICAgICREKCd0b2dnbGVBbHRCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICAgICAgJEQoJ3NlbmRUYWJCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICAgICAgJEQoJ3NlbmRFc2NCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgICAgICAgICAgICAgICAgJEQoJ3Nob3dFeHRyYUtleXNCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbl9zZWxlY3RlZCI7CisgICAgICAgICAgICAgICAgVUkuZXh0cmFLZXlzVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoVUkuZXh0cmFLZXlzVmlzaWJsZSA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICREKCd0b2dnbGVDdHJsQnV0dG9uJykuc3R5bGUuZGlzcGxheSA9ICIiOworICAgICAgICAgICAgICAgICREKCd0b2dnbGVBbHRCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIiI7CisgICAgICAgICAgICAgICAgJEQoJ3NlbmRUYWJCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIiI7CisgICAgICAgICAgICAgICAgJEQoJ3NlbmRFc2NCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gIiI7CisgICAgICAgICAgICAgICAgJEQoJ3Nob3dFeHRyYUtleXNCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7CisgICAgICAgICAgICAgICAgVUkuZXh0cmFLZXlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0gICAgaWYgKGNsaXAgJiYgIWN1cl9jbGlwKSB7Ci0gICAgICAgIC8vIFR1cm4gY2xpcHBpbmcgb24KLSAgICAgICAgVUkudXBkYXRlU2V0dGluZygnY2xpcCcsIHRydWUpOwotICAgIH0gZWxzZSBpZiAoIWNsaXAgJiYgY3VyX2NsaXApIHsKLSAgICAgICAgLy8gVHVybiBjbGlwcGluZyBvZmYKLSAgICAgICAgVUkudXBkYXRlU2V0dGluZygnY2xpcCcsIGZhbHNlKTsKLSAgICAgICAgZGlzcGxheS5zZXRfdmlld3BvcnQoZmFsc2UpOwotICAgICAgICAkRCgnbm9WTkNfY2FudmFzJykuc3R5bGUucG9zaXRpb24gPSAnc3RhdGljJzsKLSAgICAgICAgZGlzcGxheS52aWV3cG9ydENoYW5nZSgpOwotICAgIH0KLSAgICBpZiAoVUkuZ2V0U2V0dGluZygnY2xpcCcpKSB7Ci0gICAgICAgIC8vIElmIGNsaXBwaW5nLCB1cGRhdGUgY2xpcHBpbmcgc2V0dGluZ3MKLSAgICAgICAgJEQoJ25vVk5DX2NhbnZhcycpLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKLSAgICAgICAgcG9zID0gVXRpbC5nZXRQb3NpdGlvbigkRCgnbm9WTkNfY2FudmFzJykpOwotICAgICAgICBuZXdfdyA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcG9zLng7Ci0gICAgICAgIG5ld19oID0gd2luZG93LmlubmVySGVpZ2h0IC0gcG9zLnk7Ci0gICAgICAgIGRpc3BsYXkuc2V0X3ZpZXdwb3J0KHRydWUpOwotICAgICAgICBkaXNwbGF5LnZpZXdwb3J0Q2hhbmdlKDAsIDAsIG5ld193LCBuZXdfaCk7Ci0gICAgfQotfSwKKyAgICAgICAgdG9nZ2xlQ3RybDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5rZWVwS2V5Ym9hcmQoKTsKKyAgICAgICAgICAgIGlmKFVJLmN0cmxPbiA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBVSS5yZmIuc2VuZEtleShYS19Db250cm9sX0wsIHRydWUpOworICAgICAgICAgICAgICAgICREKCd0b2dnbGVDdHJsQnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOworICAgICAgICAgICAgICAgIFVJLmN0cmxPbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoVUkuY3RybE9uID09PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgVUkucmZiLnNlbmRLZXkoWEtfQ29udHJvbF9MLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgJEQoJ3RvZ2dsZUN0cmxCdXR0b24nKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7CisgICAgICAgICAgICAgICAgVUkuY3RybE9uID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAKLS8vIFRvZ2dsZS9zZXQvdW5zZXQgdGhlIHZpZXdwb3J0IGRyYWcvbW92ZSBidXR0b24KLXNldFZpZXdEcmFnOiBmdW5jdGlvbihkcmFnKSB7Ci0gICAgdmFyIHZtYiA9ICREKCdub1ZOQ192aWV3X2RyYWdfYnV0dG9uJyk7Ci0gICAgaWYgKCFVSS5yZmIpIHsgcmV0dXJuOyB9CisgICAgICAgIHRvZ2dsZUFsdDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5rZWVwS2V5Ym9hcmQoKTsKKyAgICAgICAgICAgIGlmKFVJLmFsdE9uID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIFVJLnJmYi5zZW5kS2V5KFhLX0FsdF9MLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAkRCgndG9nZ2xlQWx0QnV0dG9uJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOworICAgICAgICAgICAgICAgIFVJLmFsdE9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihVSS5hbHRPbiA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIFVJLnJmYi5zZW5kS2V5KFhLX0FsdF9MLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgJEQoJ3RvZ2dsZUFsdEJ1dHRvbicpLmNsYXNzTmFtZSA9ICJub1ZOQ19zdGF0dXNfYnV0dG9uIjsKKyAgICAgICAgICAgICAgICBVSS5hbHRPbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAogCi0gICAgaWYgKFVJLnJmYl9zdGF0ZSA9PT0gJ25vcm1hbCcgJiYKLSAgICAgICAgVUkucmZiLmdldF9kaXNwbGF5KCkuZ2V0X3ZpZXdwb3J0KCkpIHsKLSAgICAgICAgdm1iLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKLSAgICB9IGVsc2UgewotICAgICAgICB2bWIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICB9CisgICAgICAgIHNlbmRUYWI6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVUkua2VlcEtleWJvYXJkKCk7CisgICAgICAgICAgICBVSS5yZmIuc2VuZEtleShYS19UYWIpOworICAgICAgICB9LAogCi0gICAgaWYgKHR5cGVvZihkcmFnKSA9PT0gInVuZGVmaW5lZCIpIHsKLSAgICAgICAgLy8gSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0b2dnbGUKLSAgICAgICAgZHJhZyA9ICFVSS5yZmIuZ2V0X3ZpZXdwb3J0RHJhZygpOwotICAgIH0KLSAgICBpZiAoZHJhZykgewotICAgICAgICB2bWIuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOwotICAgICAgICBVSS5yZmIuc2V0X3ZpZXdwb3J0RHJhZyh0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2bWIuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b24iOwotICAgICAgICBVSS5yZmIuc2V0X3ZpZXdwb3J0RHJhZyhmYWxzZSk7Ci0gICAgfQotfSwKKyAgICAgICAgc2VuZEVzYzogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBVSS5rZWVwS2V5Ym9hcmQoKTsKKyAgICAgICAgICAgIFVJLnJmYi5zZW5kS2V5KFhLX0VzY2FwZSk7CisgICAgICAgIH0sCiAKLS8vIE9uIHRvdWNoIGRldmljZXMsIHNob3cgdGhlIE9TIGtleWJvYXJkCi1zaG93S2V5Ym9hcmQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKFVJLmtleWJvYXJkVmlzaWJsZSA9PT0gZmFsc2UpIHsKLSAgICAgICAgJEQoJ2tleWJvYXJkaW5wdXQnKS5mb2N1cygpOwotICAgICAgICBVSS5rZXlib2FyZFZpc2libGUgPSB0cnVlOwotICAgICAgICAkRCgnc2hvd0tleWJvYXJkJykuY2xhc3NOYW1lID0gIm5vVk5DX3N0YXR1c19idXR0b25fc2VsZWN0ZWQiOwotICAgIH0gZWxzZSBpZihVSS5rZXlib2FyZFZpc2libGUgPT09IHRydWUpIHsKLSAgICAgICAgJEQoJ2tleWJvYXJkaW5wdXQnKS5ibHVyKCk7Ci0gICAgICAgICREKCdzaG93S2V5Ym9hcmQnKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7Ci0gICAgICAgIFVJLmtleWJvYXJkVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLX0sCisgICAgICAgIHNldEtleWJvYXJkOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIFVJLmtleWJvYXJkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICB9LAogCi1rZXlJbnB1dEJsdXI6IGZ1bmN0aW9uKCkgewotICAgICREKCdzaG93S2V5Ym9hcmQnKS5jbGFzc05hbWUgPSAibm9WTkNfc3RhdHVzX2J1dHRvbiI7Ci0gICAgLy9XZWlyZCBidWcgaW4gaU9TIGlmIHlvdSBjaGFuZ2Uga2V5Ym9hcmRWaXNpYmxlCi0gICAgLy9oZXJlIGl0IGRvZXMgbm90IGFjdHVhbGx5IG9jY3VyIHNvIG5leHQgdGltZQotICAgIC8veW91IGNsaWNrIGtleWJvYXJkIGljb24gaXQgZG9lc250IHdvcmsuCi0gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgVUkuc2V0S2V5Ym9hcmQoKTsgfSwxMDApOwotfSwKKyAgICAgICAgLy8gaU9TIDwgVmVyc2lvbiA1IGRvZXMgbm90IHN1cHBvcnQgcG9zaXRpb24gZml4ZWQuIEphdmFzY3JpcHQgd29ya2Fyb3VuZDoKKyAgICAgICAgc2V0T25zY3JvbGw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgd2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgVUkuc2V0QmFyUG9zaXRpb24oKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0sCiAKLXNldEtleWJvYXJkOiBmdW5jdGlvbigpIHsKLSAgICBVSS5rZXlib2FyZFZpc2libGUgPSBmYWxzZTsKLX0sCisgICAgICAgIHNldFJlc2l6ZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgd2luZG93Lm9uUmVzaXplID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgVUkuc2V0QmFyUG9zaXRpb24oKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0sCiAKLS8vIGlPUyA8IFZlcnNpb24gNSBkb2VzIG5vdCBzdXBwb3J0IHBvc2l0aW9uIGZpeGVkLiBKYXZhc2NyaXB0IHdvcmthcm91bmQ6Ci1zZXRPbnNjcm9sbDogZnVuY3Rpb24oKSB7Ci0gICAgd2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIFVJLnNldEJhclBvc2l0aW9uKCk7CisgICAgICAgIC8vSGVscGVyIHRvIGFkZCBvcHRpb25zIHRvIGRyb3Bkb3duLgorICAgICAgICBhZGRPcHRpb246IGZ1bmN0aW9uKHNlbGVjdGJveCwgdGV4dCwgdmFsdWUpIHsKKyAgICAgICAgICAgIHZhciBvcHRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiT1BUSU9OIik7CisgICAgICAgICAgICBvcHRuLnRleHQgPSB0ZXh0OworICAgICAgICAgICAgb3B0bi52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgc2VsZWN0Ym94Lm9wdGlvbnMuYWRkKG9wdG4pOworICAgICAgICB9LAorCisgICAgICAgIHNldEJhclBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICREKCdub1ZOQy1jb250cm9sLWJhcicpLnN0eWxlLnRvcCA9ICh3aW5kb3cucGFnZVlPZmZzZXQpICsgJ3B4JzsKKyAgICAgICAgICAgICREKCdub1ZOQ19tb2JpbGVfYnV0dG9ucycpLnN0eWxlLmxlZnQgPSAod2luZG93LnBhZ2VYT2Zmc2V0KSArICdweCc7CisKKyAgICAgICAgICAgIHZhciB2bmN3aWR0aCA9ICREKCdub1ZOQ19zY3JlZW4nKS5zdHlsZS5vZmZzZXRXaWR0aDsKKyAgICAgICAgICAgICREKCdub1ZOQy1jb250cm9sLWJhcicpLnN0eWxlLndpZHRoID0gdm5jd2lkdGggKyAncHgnOworICAgICAgICB9CisKICAgICB9OwotfSwKLQotc2V0UmVzaXplOiBmdW5jdGlvbiAoKSB7Ci0gICAgd2luZG93Lm9uUmVzaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIFVJLnNldEJhclBvc2l0aW9uKCk7Ci0gICAgfTsKLX0sCi0KLS8vSGVscGVyIHRvIGFkZCBvcHRpb25zIHRvIGRyb3Bkb3duLgotYWRkT3B0aW9uOiBmdW5jdGlvbihzZWxlY3Rib3gsdGV4dCx2YWx1ZSApCi17Ci0gICAgdmFyIG9wdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJPUFRJT04iKTsKLSAgICBvcHRuLnRleHQgPSB0ZXh0OwotICAgIG9wdG4udmFsdWUgPSB2YWx1ZTsKLSAgICBzZWxlY3Rib3gub3B0aW9ucy5hZGQob3B0bik7Ci19LAotCi1zZXRCYXJQb3NpdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgJEQoJ25vVk5DLWNvbnRyb2wtYmFyJykuc3R5bGUudG9wID0gKHdpbmRvdy5wYWdlWU9mZnNldCkgKyAncHgnOwotICAgICREKCdub1ZOQ19tb2JpbGVfYnV0dG9ucycpLnN0eWxlLmxlZnQgPSAod2luZG93LnBhZ2VYT2Zmc2V0KSArICdweCc7Ci0KLSAgICB2YXIgdm5jd2lkdGggPSAkRCgnbm9WTkNfc2NyZWVuJykuc3R5bGUub2Zmc2V0V2lkdGg7Ci0gICAgJEQoJ25vVk5DLWNvbnRyb2wtYmFyJykuc3R5bGUud2lkdGggPSB2bmN3aWR0aCArICdweCc7Ci19Ci0KLX07Ci0KLQotCi0KK30pKCk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdXRpbC5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91dGlsLmpzCmluZGV4IGRkYzE5MTQuLjkwOWQwNGIgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91dGlsLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS91dGlsLmpzCkBAIC0xLDE0ICsxLDEzIEBACiAvKgogICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnQKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICogTGljZW5zZWQgdW5kZXIgTEdQTC0zIChzZWUgTElDRU5TRS50eHQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKICAqCiAgKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgogICovCiAKLSJ1c2Ugc3RyaWN0IjsKLS8qanNsaW50IGJpdHdpc2U6IGZhbHNlLCB3aGl0ZTogZmFsc2UgKi8KLS8qZ2xvYmFsIHdpbmRvdywgY29uc29sZSwgZG9jdW1lbnQsIG5hdmlnYXRvciwgQWN0aXZlWE9iamVjdCAqLworLyoganNoaW50IHdoaXRlOiBmYWxzZSwgbm9uc3RhbmRhcmQ6IHRydWUgKi8KKy8qZ2xvYmFsIHdpbmRvdywgY29uc29sZSwgZG9jdW1lbnQsIG5hdmlnYXRvciwgQWN0aXZlWE9iamVjdCwgSU5DTFVERV9VUkkgKi8KIAogLy8gR2xvYmFscyBkZWZpbmVkIGhlcmUKIHZhciBVdGlsID0ge307CkBAIC0xOCw0NiArMTcsMTYzIEBACiAgKiBNYWtlIGFycmF5cyBxdWFjawogICovCiAKLUFycmF5LnByb3RvdHlwZS5wdXNoOCA9IGZ1bmN0aW9uIChudW0pIHsKLSAgICB0aGlzLnB1c2gobnVtICYgMHhGRik7Cit2YXIgYWRkRnVuYyA9IGZ1bmN0aW9uIChjbCwgbmFtZSwgZnVuYykgeworICAgIGlmICghY2wucHJvdG90eXBlW25hbWVdKSB7CisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbC5wcm90b3R5cGUsIG5hbWUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiBmdW5jIH0pOworICAgIH0KIH07CiAKLUFycmF5LnByb3RvdHlwZS5wdXNoMTYgPSBmdW5jdGlvbiAobnVtKSB7CithZGRGdW5jKEFycmF5LCAncHVzaDgnLCBmdW5jdGlvbiAobnVtKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHRoaXMucHVzaChudW0gJiAweEZGKTsKK30pOworCithZGRGdW5jKEFycmF5LCAncHVzaDE2JywgZnVuY3Rpb24gKG51bSkgeworICAgICJ1c2Ugc3RyaWN0IjsKICAgICB0aGlzLnB1c2goKG51bSA+PiA4KSAmIDB4RkYsCi0gICAgICAgICAgICAgIChudW0gICAgICkgJiAweEZGICApOwotfTsKLUFycmF5LnByb3RvdHlwZS5wdXNoMzIgPSBmdW5jdGlvbiAobnVtKSB7CisgICAgICAgICAgICAgIG51bSAmIDB4RkYpOworfSk7CisKK2FkZEZ1bmMoQXJyYXksICdwdXNoMzInLCBmdW5jdGlvbiAobnVtKSB7CisgICAgInVzZSBzdHJpY3QiOwogICAgIHRoaXMucHVzaCgobnVtID4+IDI0KSAmIDB4RkYsCiAgICAgICAgICAgICAgIChudW0gPj4gMTYpICYgMHhGRiwKICAgICAgICAgICAgICAgKG51bSA+PiAgOCkgJiAweEZGLAotICAgICAgICAgICAgICAobnVtICAgICAgKSAmIDB4RkYgICk7Ci19OworICAgICAgICAgICAgICBudW0gJiAweEZGKTsKK30pOwogCiAvLyBJRSBkb2VzIG5vdCBzdXBwb3J0IG1hcCAoZXZlbiBpbiBJRTkpCiAvL1RoaXMgcHJvdG90eXBlIGlzIHByb3ZpZGVkIGJ5IHRoZSBNb3ppbGxhIGZvdW5kYXRpb24gYW5kCiAvL2lzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KIC8vaHR0cDovL3d3dy5pYmlibGlvLm9yZy9wdWIvTGludXgvTElDRU5TRVMvbWl0LmxpY2Vuc2UKLWlmICghQXJyYXkucHJvdG90eXBlLm1hcCkKLXsKLSAgQXJyYXkucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AqLykKLSAgeworYWRkRnVuYyhBcnJheSwgJ21hcCcsIGZ1bmN0aW9uIChmdW4gLyosIHRoaXNwKi8pIHsKKyAgICAidXNlIHN0cmljdCI7CiAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwotICAgIGlmICh0eXBlb2YgZnVuICE9ICJmdW5jdGlvbiIpCi0gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgICAgaWYgKHR5cGVvZiBmdW4gIT0gImZ1bmN0aW9uIikgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgICAgfQogCiAgICAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4pOwogICAgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpIGluIHRoaXMpCi0gICAgICAgIHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0aGlzW2ldLCBpLCB0aGlzKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmIChpIGluIHRoaXMpIHsKKyAgICAgICAgICAgIHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0aGlzW2ldLCBpLCB0aGlzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7Ci0gIH07Cit9KTsKKworLy8gSUUgPDkgZG9lcyBub3Qgc3VwcG9ydCBpbmRleE9mCisvL1RoaXMgcHJvdG90eXBlIGlzIHByb3ZpZGVkIGJ5IHRoZSBNb3ppbGxhIGZvdW5kYXRpb24gYW5kCisvL2lzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKy8vaHR0cDovL3d3dy5pYmlibGlvLm9yZy9wdWIvTGludXgvTElDRU5TRVMvbWl0LmxpY2Vuc2UKK2FkZEZ1bmMoQXJyYXksICdpbmRleE9mJywgZnVuY3Rpb24gKGVsdCAvKiwgZnJvbSovKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCA+Pj4gMDsKKworICAgIHZhciBmcm9tID0gTnVtYmVyKGFyZ3VtZW50c1sxXSkgfHwgMDsKKyAgICBmcm9tID0gKGZyb20gPCAwKSA/IE1hdGguY2VpbChmcm9tKSA6IE1hdGguZmxvb3IoZnJvbSk7CisgICAgaWYgKGZyb20gPCAwKSB7CisgICAgICAgIGZyb20gKz0gbGVuOworICAgIH0KKworICAgIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspIHsKKyAgICAgICAgaWYgKGZyb20gaW4gdGhpcyAmJgorICAgICAgICAgICAgICAgIHRoaXNbZnJvbV0gPT09IGVsdCkgeworICAgICAgICAgICAgcmV0dXJuIGZyb207CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfSk7CisKKy8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2tleXMKK2lmICghT2JqZWN0LmtleXMpIHsKKyAgICBPYmplY3Qua2V5cyA9IChmdW5jdGlvbiAoKSB7CisgICAgICAgICd1c2Ugc3RyaWN0JzsKKyAgICAgICAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKKyAgICAgICAgICAgIGhhc0RvbnRFbnVtQnVnID0gISh7dG9TdHJpbmc6IG51bGx9KS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKSwKKyAgICAgICAgICAgIGRvbnRFbnVtcyA9IFsKKyAgICAgICAgICAgICAgICAndG9TdHJpbmcnLAorICAgICAgICAgICAgICAgICd0b0xvY2FsZVN0cmluZycsCisgICAgICAgICAgICAgICAgJ3ZhbHVlT2YnLAorICAgICAgICAgICAgICAgICdoYXNPd25Qcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ2lzUHJvdG90eXBlT2YnLAorICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsCisgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yJworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiAodHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyB8fCBvYmogPT09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCBwcm9wLCBpOworCisgICAgICAgICAgICBmb3IgKHByb3AgaW4gb2JqKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGRvbnRFbnVtc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OworICAgIH0pKCk7CiB9CiAKLS8qIAorLy8gUGhhbnRvbUpTIDEueCBkb2Vzbid0IHN1cHBvcnQgYmluZCwKKy8vIHNvIGxlYXZlIHRoaXMgaW4gdW50aWwgUGhhbnRvbUpTIDIuMCBpcyByZWxlYXNlZAorLy9UaGlzIHByb3RvdHlwZSBpcyBwcm92aWRlZCBieSB0aGUgTW96aWxsYSBmb3VuZGF0aW9uIGFuZAorLy9pcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCisvL2h0dHA6Ly93d3cuaWJpYmxpby5vcmcvcHViL0xpbnV4L0xJQ0VOU0VTL21pdC5saWNlbnNlCithZGRGdW5jKEZ1bmN0aW9uLCAnYmluZCcsIGZ1bmN0aW9uIChvVGhpcykgeworICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gImZ1bmN0aW9uIikgeworICAgICAgICAvLyBjbG9zZXN0IHRoaW5nIHBvc3NpYmxlIHRvIHRoZSBFQ01BU2NyaXB0IDUKKyAgICAgICAgLy8gaW50ZXJuYWwgSXNDYWxsYWJsZSBmdW5jdGlvbgorICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IGlzIHRyeWluZyB0byBiZSBib3VuZCBpcyBub3QgY2FsbGFibGUiKTsKKyAgICB9CisKKyAgICB2YXIgYUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLAorICAgICAgICAgICAgZlRvQmluZCA9IHRoaXMsCisgICAgICAgICAgICBmTk9QID0gZnVuY3Rpb24gKCkge30sCisgICAgICAgICAgICBmQm91bmQgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1AgJiYgb1RoaXMgPyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOworICAgICAgICAgICAgfTsKKworICAgIGZOT1AucHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7CisgICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7CisKKyAgICByZXR1cm4gZkJvdW5kOworfSk7CisKKy8vCisvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgc2hpbSB3aXRoIHNldFRpbWVvdXQgZmFsbGJhY2sKKy8vCisKK3dpbmRvdy5yZXF1ZXN0QW5pbUZyYW1lID0gKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgcmV0dXJuICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgIHx8CisgICAgICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8CisgICAgICAgICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgIHx8CisgICAgICAgICAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgIHx8CisgICAgICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgIHx8CisgICAgICAgICAgICBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTsKKyAgICAgICAgICAgIH07Cit9KSgpOworCisvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBOYW1lc3BhY2VkIGluIFV0aWwKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjksNiArMTg1LDcgQEAKIAogVXRpbC5fbG9nX2xldmVsID0gJ3dhcm4nOwogVXRpbC5pbml0X2xvZ2dpbmcgPSBmdW5jdGlvbiAobGV2ZWwpIHsKKyAgICAidXNlIHN0cmljdCI7CiAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgbGV2ZWwgPSBVdGlsLl9sb2dfbGV2ZWw7CiAgICAgfSBlbHNlIHsKQEAgLTc5LDI2ICsxOTYsMzQgQEAKICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlID0gewogICAgICAgICAgICAgICAgICdsb2cnICA6IHdpbmRvdy5vcGVyYS5wb3N0RXJyb3IsCiAgICAgICAgICAgICAgICAgJ3dhcm4nIDogd2luZG93Lm9wZXJhLnBvc3RFcnJvciwKLSAgICAgICAgICAgICAgICAnZXJyb3InOiB3aW5kb3cub3BlcmEucG9zdEVycm9yIH07CisgICAgICAgICAgICAgICAgJ2Vycm9yJzogd2luZG93Lm9wZXJhLnBvc3RFcnJvcgorICAgICAgICAgICAgfTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlID0gewotICAgICAgICAgICAgICAgICdsb2cnICA6IGZ1bmN0aW9uKG0pIHt9LAotICAgICAgICAgICAgICAgICd3YXJuJyA6IGZ1bmN0aW9uKG0pIHt9LAotICAgICAgICAgICAgICAgICdlcnJvcic6IGZ1bmN0aW9uKG0pIHt9fTsKKyAgICAgICAgICAgICAgICAnbG9nJyAgOiBmdW5jdGlvbiAobSkge30sCisgICAgICAgICAgICAgICAgJ3dhcm4nIDogZnVuY3Rpb24gKG0pIHt9LAorICAgICAgICAgICAgICAgICdlcnJvcic6IGZ1bmN0aW9uIChtKSB7fQorICAgICAgICAgICAgfTsKICAgICAgICAgfQogICAgIH0KIAogICAgIFV0aWwuRGVidWcgPSBVdGlsLkluZm8gPSBVdGlsLldhcm4gPSBVdGlsLkVycm9yID0gZnVuY3Rpb24gKG1zZykge307CisgICAgLyoganNoaW50IC1XMDg2ICovCiAgICAgc3dpdGNoIChsZXZlbCkgewotICAgICAgICBjYXNlICdkZWJ1Zyc6IFV0aWwuRGVidWcgPSBmdW5jdGlvbiAobXNnKSB7IGNvbnNvbGUubG9nKG1zZyk7IH07Ci0gICAgICAgIGNhc2UgJ2luZm8nOiAgVXRpbC5JbmZvICA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS5sb2cobXNnKTsgfTsKLSAgICAgICAgY2FzZSAnd2Fybic6ICBVdGlsLldhcm4gID0gZnVuY3Rpb24gKG1zZykgeyBjb25zb2xlLndhcm4obXNnKTsgfTsKLSAgICAgICAgY2FzZSAnZXJyb3InOiBVdGlsLkVycm9yID0gZnVuY3Rpb24gKG1zZykgeyBjb25zb2xlLmVycm9yKG1zZyk7IH07CisgICAgICAgIGNhc2UgJ2RlYnVnJzoKKyAgICAgICAgICAgIFV0aWwuRGVidWcgPSBmdW5jdGlvbiAobXNnKSB7IGNvbnNvbGUubG9nKG1zZyk7IH07CisgICAgICAgIGNhc2UgJ2luZm8nOgorICAgICAgICAgICAgVXRpbC5JbmZvICA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS5sb2cobXNnKTsgfTsKKyAgICAgICAgY2FzZSAnd2Fybic6CisgICAgICAgICAgICBVdGlsLldhcm4gID0gZnVuY3Rpb24gKG1zZykgeyBjb25zb2xlLndhcm4obXNnKTsgfTsKKyAgICAgICAgY2FzZSAnZXJyb3InOgorICAgICAgICAgICAgVXRpbC5FcnJvciA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS5lcnJvcihtc2cpOyB9OwogICAgICAgICBjYXNlICdub25lJzoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3coImludmFsaWQgbG9nZ2luZyB0eXBlICciICsgbGV2ZWwgKyAiJyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGxvZ2dpbmcgdHlwZSAnIiArIGxldmVsICsgIiciKTsKICAgICB9CisgICAgLyoganNoaW50ICtXMDg2ICovCiB9OwogVXRpbC5nZXRfbG9nZ2luZyA9IGZ1bmN0aW9uICgpIHsKICAgICByZXR1cm4gVXRpbC5fbG9nX2xldmVsOwpAQCAtMTA2LDEwNSArMjMxLDI3OSBAQAogLy8gSW5pdGlhbGl6ZSBsb2dnaW5nIGxldmVsCiBVdGlsLmluaXRfbG9nZ2luZygpOwogCitVdGlsLm1ha2VfcHJvcGVydHkgPSBmdW5jdGlvbiAocHJvdG8sIG5hbWUsIG1vZGUsIHR5cGUpIHsKKyAgICAidXNlIHN0cmljdCI7CiAKLS8vIFNldCBjb25maWd1cmF0aW9uIGRlZmF1bHQgZm9yIENyb2NrZm9yZCBzdHlsZSBmdW5jdGlvbiBuYW1lc3BhY2VzCi1VdGlsLmNvbmZfZGVmYXVsdCA9IGZ1bmN0aW9uKGNmZywgYXBpLCBkZWZhdWx0cywgdiwgbW9kZSwgdHlwZSwgZGVmdmFsLCBkZXNjKSB7Ci0gICAgdmFyIGdldHRlciwgc2V0dGVyOwotCi0gICAgLy8gRGVmYXVsdCBnZXR0ZXIgZnVuY3Rpb24KLSAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoaWR4KSB7Ci0gICAgICAgIGlmICgodHlwZSBpbiB7J2Fycic6MSwgJ2FycmF5JzoxfSkgJiYKLSAgICAgICAgICAgICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykpIHsKLSAgICAgICAgICAgIHJldHVybiBjZmdbdl1baWR4XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjZmdbdl07Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gRGVmYXVsdCBzZXR0ZXIgZnVuY3Rpb24KLSAgICBzZXR0ZXIgPSBmdW5jdGlvbiAodmFsLCBpZHgpIHsKLSAgICAgICAgaWYgKHR5cGUgaW4geydib29sZWFuJzoxLCAnYm9vbCc6MX0pIHsKLSAgICAgICAgICAgIGlmICgoIXZhbCkgfHwgKHZhbCBpbiB7JzAnOjEsICdubyc6MSwgJ2ZhbHNlJzoxfSkpIHsKLSAgICAgICAgICAgICAgICB2YWwgPSBmYWxzZTsKKyAgICB2YXIgZ2V0dGVyOworICAgIGlmICh0eXBlID09PSAnYXJyJykgeworICAgICAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoaWR4KSB7CisgICAgICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1snXycgKyBuYW1lXVtpZHhdOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWwgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzWydfJyArIG5hbWVdOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW4geydpbnRlZ2VyJzoxLCAnaW50JzoxfSkgewotICAgICAgICAgICAgdmFsID0gcGFyc2VJbnQodmFsLCAxMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Z1bmMnKSB7Ci0gICAgICAgICAgICBpZiAoIXZhbCkgewotICAgICAgICAgICAgICAgIHZhbCA9IGZ1bmN0aW9uICgpIHt9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgY2ZnW3ZdW2lkeF0gPSB2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjZmdbdl0gPSB2YWw7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gU2V0IHRoZSBkZXNjcmlwdGlvbgotICAgIGFwaVt2ICsgJ19kZXNjcmlwdGlvbiddID0gZGVzYzsKLQotICAgIC8vIFNldCB0aGUgZ2V0dGVyIGZ1bmN0aW9uCi0gICAgaWYgKHR5cGVvZiBhcGlbJ2dldF8nICsgdl0gPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgIGFwaVsnZ2V0XycgKyB2XSA9IGdldHRlcjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHNldHRlciBmdW5jdGlvbiB3aXRoIGV4dHJhIHNhbml0eSBjaGVja3MKLSAgICBpZiAodHlwZW9mIGFwaVsnc2V0XycgKyB2XSA9PT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgYXBpWydzZXRfJyArIHZdID0gZnVuY3Rpb24gKHZhbCwgaWR4KSB7Ci0gICAgICAgICAgICBpZiAobW9kZSBpbiB7J1JPJzoxLCAncm8nOjF9KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3codiArICIgaXMgcmVhZC1vbmx5Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtb2RlIGluIHsnV08nOjEsICd3byc6MX0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY2ZnW3ZdICE9PSAndW5kZWZpbmVkJykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyh2ICsgIiBjYW4gb25seSBiZSBzZXQgb25jZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGVyKHZhbCwgaWR4KTsKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpc1snXycgKyBuYW1lXTsKICAgICAgICAgfTsKICAgICB9CiAKLSAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICBpZiAodHlwZW9mIGRlZmF1bHRzW3ZdICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICBkZWZ2YWwgPSBkZWZhdWx0c1t2XTsKLSAgICB9IGVsc2UgaWYgKCh0eXBlIGluIHsnYXJyJzoxLCAnYXJyYXknOjF9KSAmJgotICAgICAgICAgICAgKCEgKGRlZnZhbCBpbnN0YW5jZW9mIEFycmF5KSkpIHsKLSAgICAgICAgZGVmdmFsID0gW107CisgICAgdmFyIG1ha2Vfc2V0dGVyID0gZnVuY3Rpb24gKHByb2Nlc3NfdmFsKSB7CisgICAgICAgIGlmIChwcm9jZXNzX3ZhbCkgeworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIGlkeCkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdW2lkeF0gPSBwcm9jZXNzX3ZhbCh2YWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgbmFtZV0gPSBwcm9jZXNzX3ZhbCh2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgaWR4KSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgbmFtZV1baWR4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdID0gdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmFyIHNldHRlcjsKKyAgICBpZiAodHlwZSA9PT0gJ2Jvb2wnKSB7CisgICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKGZ1bmN0aW9uICh2YWwpIHsKKyAgICAgICAgICAgIGlmICghdmFsIHx8ICh2YWwgaW4geycwJzogMSwgJ25vJzogMSwgJ2ZhbHNlJzogMX0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50JykgeworICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihmdW5jdGlvbiAodmFsKSB7IHJldHVybiBwYXJzZUludCh2YWwsIDEwKTsgfSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZmxvYXQnKSB7CisgICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKHBhcnNlRmxvYXQpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cicpIHsKKyAgICAgICAgc2V0dGVyID0gbWFrZV9zZXR0ZXIoU3RyaW5nKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmdW5jJykgeworICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihmdW5jdGlvbiAodmFsKSB7CisgICAgICAgICAgICBpZiAoIXZhbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyJyB8fCB0eXBlID09PSAnZG9tJyB8fCB0eXBlID09ICdyYXcnKSB7CisgICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByb3BlcnR5IHR5cGUgJyArIHR5cGUpOyAgLy8gc29tZSBzYW5pdHkgY2hlY2tpbmcKICAgICB9Ci0gICAgLy8gQ29lcmNlIGV4aXN0aW5nIHNldHRpbmcgdG8gdGhlIHJpZ2h0IHR5cGUKLSAgICAvL1V0aWwuRGVidWcoInY6ICIgKyB2ICsgIiwgZGVmdmFsOiAiICsgZGVmdmFsICsgIiwgZGVmYXVsdHNbdl06ICIgKyBkZWZhdWx0c1t2XSk7Ci0gICAgc2V0dGVyKGRlZnZhbCk7CisKKyAgICAvLyBzZXQgdGhlIGdldHRlcgorICAgIGlmICh0eXBlb2YgcHJvdG9bJ2dldF8nICsgbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIHByb3RvWydnZXRfJyArIG5hbWVdID0gZ2V0dGVyOworICAgIH0KKworICAgIC8vIHNldCB0aGUgc2V0dGVyIGlmIG5lZWRlZAorICAgIGlmICh0eXBlb2YgcHJvdG9bJ3NldF8nICsgbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIGlmIChtb2RlID09PSAncncnKSB7CisgICAgICAgICAgICBwcm90b1snc2V0XycgKyBuYW1lXSA9IHNldHRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnd28nKSB7CisgICAgICAgICAgICBwcm90b1snc2V0XycgKyBuYW1lXSA9IGZ1bmN0aW9uICh2YWwsIGlkeCkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1snXycgKyBuYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAiIGNhbiBvbmx5IGJlIHNldCBvbmNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIHZhbCwgaWR4KTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtYWtlIGEgc3BlY2lhbCBzZXR0ZXIgdGhhdCB3ZSBjYW4gdXNlIGluIHNldCBkZWZhdWx0cworICAgIHByb3RvWydfcmF3X3NldF8nICsgbmFtZV0gPSBmdW5jdGlvbiAodmFsLCBpZHgpIHsKKyAgICAgICAgc2V0dGVyLmNhbGwodGhpcywgdmFsLCBpZHgpOworICAgICAgICAvL2RlbGV0ZSB0aGlzWydfaW5pdF9zZXRfJyArIG5hbWVdOyAgLy8gcmVtb3ZlIGl0IGFmdGVyIHVzZQorICAgIH07CiB9OwogCi0vLyBTZXQgZ3JvdXAgb2YgY29uZmlndXJhdGlvbiBkZWZhdWx0cwotVXRpbC5jb25mX2RlZmF1bHRzID0gZnVuY3Rpb24oY2ZnLCBhcGksIGRlZmF1bHRzLCBhcnIpIHsKLSAgICB2YXIgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFV0aWwuY29uZl9kZWZhdWx0KGNmZywgYXBpLCBkZWZhdWx0cywgYXJyW2ldWzBdLCBhcnJbaV1bMV0sCi0gICAgICAgICAgICAgICAgYXJyW2ldWzJdLCBhcnJbaV1bM10sIGFycltpXVs0XSk7CitVdGlsLm1ha2VfcHJvcGVydGllcyA9IGZ1bmN0aW9uIChjb25zdHJ1Y3RvciwgYXJyKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIFV0aWwubWFrZV9wcm9wZXJ0eShjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGFycltpXVswXSwgYXJyW2ldWzFdLCBhcnJbaV1bMl0pOwogICAgIH0KIH07CiAKK1V0aWwuc2V0X2RlZmF1bHRzID0gZnVuY3Rpb24gKG9iaiwgY29uZiwgZGVmYXVsdHMpIHsKKyAgICB2YXIgZGVmYXVsdHNfa2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzKTsKKyAgICB2YXIgY29uZl9rZXlzID0gT2JqZWN0LmtleXMoY29uZik7CisgICAgdmFyIGtleXNfb2JqID0ge307CisgICAgdmFyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IGRlZmF1bHRzX2tleXMubGVuZ3RoOyBpKyspIHsga2V5c19vYmpbZGVmYXVsdHNfa2V5c1tpXV0gPSAxOyB9CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZfa2V5cy5sZW5ndGg7IGkrKykgeyBrZXlzX29ialtjb25mX2tleXNbaV1dID0gMTsgfQorICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoa2V5c19vYmopOworCisgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHNldHRlciA9IG9ialsnX3Jhd19zZXRfJyArIGtleXNbaV1dOworICAgICAgICBpZiAoIXNldHRlcikgeworICAgICAgICAgIFV0aWwuV2FybignSW52YWxpZCBwcm9wZXJ0eSAnICsga2V5c1tpXSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5c1tpXSBpbiBjb25mKSB7CisgICAgICAgICAgICBzZXR0ZXIuY2FsbChvYmosIGNvbmZba2V5c1tpXV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBkZWZhdWx0c1trZXlzW2ldXSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKgorICogRGVjb2RlIGZyb20gVVRGLTgKKyAqLworVXRpbC5kZWNvZGVVVEY4ID0gZnVuY3Rpb24gKHV0ZjhzdHJpbmcpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodXRmOHN0cmluZykpOworfTsKKworCiAKIC8qCiAgKiBDcm9zcy1icm93c2VyIHJvdXRpbmVzCiAgKi8KIAotLy8gR2V0IERPTSBlbGVtZW50IHBvc2l0aW9uIG9uIHBhZ2UKLVV0aWwuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAob2JqKSB7Ci0gICAgdmFyIHggPSAwLCB5ID0gMDsKLSAgICBpZiAob2JqLm9mZnNldFBhcmVudCkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB4ICs9IG9iai5vZmZzZXRMZWZ0OwotICAgICAgICAgICAgeSArPSBvYmoub2Zmc2V0VG9wOwotICAgICAgICAgICAgb2JqID0gb2JqLm9mZnNldFBhcmVudDsKLSAgICAgICAgfSB3aGlsZSAob2JqKTsKLSAgICB9Ci0gICAgcmV0dXJuIHsneCc6IHgsICd5JzogeX07CisKKy8vIER5bmFtaWNhbGx5IGxvYWQgc2NyaXB0cyB3aXRob3V0IHVzaW5nIGRvY3VtZW50LndyaXRlKCkKKy8vIFJlZmVyZW5jZTogaHR0cDovL3VuaXhwYXBhLmNvbS9qcy9keW5hLmh0bWwKKy8vCisvLyBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxvYWRfc2NyaXB0cyBpcyBpbnZva2VkIGZyb20gYSBzY3JpcHQgdGhhdAorLy8gaXRzZWxmIGlzIGxvYWRlZCB2aWEgbG9hZF9zY3JpcHRzLiBPbmNlIGFsbCBzY3JpcHRzIGFyZSBsb2FkZWQgdGhlCisvLyB3aW5kb3cub25zY3JpcHRzbG9hZGVkIGhhbmRsZXIgaXMgY2FsbGVkIChpZiBzZXQpLgorVXRpbC5nZXRfaW5jbHVkZV91cmkgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICh0eXBlb2YgSU5DTFVERV9VUkkgIT09ICJ1bmRlZmluZWQiKSA/IElOQ0xVREVfVVJJIDogImluY2x1ZGUvIjsKIH07CitVdGlsLl9sb2FkaW5nX3NjcmlwdHMgPSBbXTsKK1V0aWwuX3BlbmRpbmdfc2NyaXB0cyA9IFtdOworVXRpbC5sb2FkX3NjcmlwdHMgPSBmdW5jdGlvbiAoZmlsZXMpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLCBzY3JpcHQsCisgICAgICAgIGxzID0gVXRpbC5fbG9hZGluZ19zY3JpcHRzLCBwcyA9IFV0aWwuX3BlbmRpbmdfc2NyaXB0czsKKworICAgIHZhciBsb2FkRnVuYyA9IGZ1bmN0aW9uIChlKSB7CisgICAgICAgIHdoaWxlIChscy5sZW5ndGggPiAwICYmIChsc1swXS5yZWFkeVN0YXRlID09PSAnbG9hZGVkJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNbMF0ucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykpIHsKKyAgICAgICAgICAgIC8vIEZvciBJRSwgYXBwZW5kIHRoZSBzY3JpcHQgdG8gdHJpZ2dlciBleGVjdXRpb24KKyAgICAgICAgICAgIHZhciBzID0gbHMuc2hpZnQoKTsKKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coImxvYWRlZCBzY3JpcHQ6ICIgKyBzLnNyYyk7CisgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHMpOworICAgICAgICB9CisgICAgICAgIGlmICghdGhpcy5yZWFkeVN0YXRlIHx8CisgICAgICAgICAgICAoVXRpbC5FbmdpbmUucHJlc3RvICYmIHRoaXMucmVhZHlTdGF0ZSA9PT0gJ2xvYWRlZCcpIHx8CisgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKKyAgICAgICAgICAgIGlmIChwcy5pbmRleE9mKHRoaXMpID49IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9ubG9hZCA9IHRoaXMub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJjb21wbGV0ZWQgc2NyaXB0OiAiICsgdGhpcy5zcmMpOworICAgICAgICAgICAgICAgIHBzLnNwbGljZShwcy5pbmRleE9mKHRoaXMpLCAxKTsKKworICAgICAgICAgICAgICAgIC8vIENhbGwgd2luZG93Lm9uc2NyaXB0c2xvYWQgYWZ0ZXIgbGFzdCBzY3JpcHQgbG9hZHMKKyAgICAgICAgICAgICAgICBpZiAocHMubGVuZ3RoID09PSAwICYmIHdpbmRvdy5vbnNjcmlwdHNsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnNjcmlwdHNsb2FkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGZvciAodmFyIGYgPSAwOyBmIDwgZmlsZXMubGVuZ3RoOyBmKyspIHsKKyAgICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisgICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CisgICAgICAgIHNjcmlwdC5zcmMgPSBVdGlsLmdldF9pbmNsdWRlX3VyaSgpICsgZmlsZXNbZl07CisgICAgICAgIC8vY29uc29sZS5sb2coImxvYWRpbmcgc2NyaXB0OiAiICsgc2NyaXB0LnNyYyk7CisgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbG9hZEZ1bmM7CisgICAgICAgIC8vIEluLW9yZGVyIHNjcmlwdCBleGVjdXRpb24gdHJpY2tzCisgICAgICAgIGlmIChVdGlsLkVuZ2luZS50cmlkZW50KSB7CisgICAgICAgICAgICAvLyBGb3IgSUUgd2FpdCB1bnRpbCByZWFkeVN0YXRlIGlzICdsb2FkZWQnIGJlZm9yZQorICAgICAgICAgICAgLy8gYXBwZW5kaW5nIGl0IHdoaWNoIHdpbGwgdHJpZ2dlciBleGVjdXRpb24KKyAgICAgICAgICAgIC8vIGh0dHA6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9EeW5hbWljX1NjcmlwdF9FeGVjdXRpb25fT3JkZXIKKyAgICAgICAgICAgIGxzLnB1c2goc2NyaXB0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciB3ZWJraXQgYW5kIGZpcmVmb3ggc2V0IGFzeW5jPWZhbHNlIGFuZCBhcHBlbmQgbm93CisgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0hUTUwvRWxlbWVudC9zY3JpcHQKKyAgICAgICAgICAgIHNjcmlwdC5hc3luYyA9IGZhbHNlOworICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOworICAgICAgICB9CisgICAgICAgIHBzLnB1c2goc2NyaXB0KTsKKyAgICB9Cit9OworCisKKy8vIEdldCBET00gZWxlbWVudCBwb3NpdGlvbiBvbiBwYWdlCisvLyAgVGhpcyBzb2x1dGlvbiBpcyBiYXNlZCBiYXNlZCBvbiBodHRwOi8vd3d3LmdyZXl3eXZlcm4uY29tLz9wb3N0PTMzMQorLy8gIFRoYW5rcyB0byBCcmlhbiBIdWlzbWFuIEFLQSBHcmV5V3l2ZXJuIQorVXRpbC5nZXRQb3NpdGlvbiA9IChmdW5jdGlvbiAoKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIGZ1bmN0aW9uIGdldFN0eWxlKG9iaiwgc3R5bGVQcm9wKSB7CisgICAgICAgIHZhciB5OworICAgICAgICBpZiAob2JqLmN1cnJlbnRTdHlsZSkgeworICAgICAgICAgICAgeSA9IG9iai5jdXJyZW50U3R5bGVbc3R5bGVQcm9wXTsKKyAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkKKyAgICAgICAgICAgIHkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvYmosIG51bGwpW3N0eWxlUHJvcF07CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworICAgIGZ1bmN0aW9uIHNjcm9sbERpc3QoKSB7CisgICAgICAgIHZhciBteVNjcm9sbFRvcCA9IDAsIG15U2Nyb2xsTGVmdCA9IDA7CisgICAgICAgIHZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTsKKworICAgICAgICAvLyBnZXQgdGhlIHNjcm9sbFRvcCBwYXJ0CisgICAgICAgIGlmIChodG1sLnNjcm9sbFRvcCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSB7CisgICAgICAgICAgICBteVNjcm9sbFRvcCA9IGh0bWwuc2Nyb2xsVG9wOworICAgICAgICB9IGVsc2UgaWYgKGh0bWwuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApIHsKKyAgICAgICAgICAgIG15U2Nyb2xsVG9wID0gaHRtbC5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOworICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSB7CisgICAgICAgICAgICBteVNjcm9sbFRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXlTY3JvbGxUb3AgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRoZSBzY3JvbGxMZWZ0IHBhcnQKKyAgICAgICAgaWYgKGh0bWwuc2Nyb2xsTGVmdCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgeworICAgICAgICAgICAgbXlTY3JvbGxMZWZ0ID0gaHRtbC5zY3JvbGxMZWZ0OworICAgICAgICB9IGVsc2UgaWYgKGh0bWwuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgeworICAgICAgICAgICAgbXlTY3JvbGxMZWZ0ID0gaHRtbC5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7CisgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSB7CisgICAgICAgICAgICBteVNjcm9sbExlZnQgPSBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBteVNjcm9sbExlZnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFtteVNjcm9sbExlZnQsIG15U2Nyb2xsVG9wXTsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikgeworICAgICAgICB2YXIgY3VybGVmdCA9IDAsIGN1cnRvcCA9IDAsIHNjciA9IG9iaiwgZml4ZWQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKChzY3IgPSBzY3IucGFyZW50Tm9kZSkgJiYgc2NyICE9IGRvY3VtZW50LmJvZHkpIHsKKyAgICAgICAgICAgIGN1cmxlZnQgLT0gc2NyLnNjcm9sbExlZnQgfHwgMDsKKyAgICAgICAgICAgIGN1cnRvcCAtPSBzY3Iuc2Nyb2xsVG9wIHx8IDA7CisgICAgICAgICAgICBpZiAoZ2V0U3R5bGUoc2NyLCAicG9zaXRpb24iKSA9PSAiZml4ZWQiKSB7CisgICAgICAgICAgICAgICAgZml4ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmaXhlZCAmJiAhd2luZG93Lm9wZXJhKSB7CisgICAgICAgICAgICB2YXIgc2NyRGlzdCA9IHNjcm9sbERpc3QoKTsKKyAgICAgICAgICAgIGN1cmxlZnQgKz0gc2NyRGlzdFswXTsKKyAgICAgICAgICAgIGN1cnRvcCArPSBzY3JEaXN0WzFdOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgY3VybGVmdCArPSBvYmoub2Zmc2V0TGVmdDsKKyAgICAgICAgICAgIGN1cnRvcCArPSBvYmoub2Zmc2V0VG9wOworICAgICAgICB9IHdoaWxlICgob2JqID0gb2JqLm9mZnNldFBhcmVudCkpOworCisgICAgICAgIHJldHVybiB7J3gnOiBjdXJsZWZ0LCAneSc6IGN1cnRvcH07CisgICAgfTsKK30pKCk7CisKIAogLy8gR2V0IG1vdXNlIGV2ZW50IHBvc2l0aW9uIGluIERPTSBlbGVtZW50CiBVdGlsLmdldEV2ZW50UG9zaXRpb24gPSBmdW5jdGlvbiAoZSwgb2JqLCBzY2FsZSkgeworICAgICJ1c2Ugc3RyaWN0IjsKICAgICB2YXIgZXZ0LCBkb2NYLCBkb2NZLCBwb3M7CiAgICAgLy9pZiAoIWUpIGV2dCA9IHdpbmRvdy5ldmVudDsKICAgICBldnQgPSAoZSA/IGUgOiB3aW5kb3cuZXZlbnQpOwpAQCAtMjIyLDM2ICs1MjEsNDMgQEAKICAgICBpZiAodHlwZW9mIHNjYWxlID09PSAidW5kZWZpbmVkIikgewogICAgICAgICBzY2FsZSA9IDE7CiAgICAgfQotICAgIHJldHVybiB7J3gnOiAoZG9jWCAtIHBvcy54KSAvIHNjYWxlLCAneSc6IChkb2NZIC0gcG9zLnkpIC8gc2NhbGV9OworICAgIHZhciByZWFseCA9IGRvY1ggLSBwb3MueDsKKyAgICB2YXIgcmVhbHkgPSBkb2NZIC0gcG9zLnk7CisgICAgdmFyIHggPSBNYXRoLm1heChNYXRoLm1pbihyZWFseCwgb2JqLndpZHRoIC0gMSksIDApOworICAgIHZhciB5ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVhbHksIG9iai5oZWlnaHQgLSAxKSwgMCk7CisgICAgcmV0dXJuIHsneCc6IHggLyBzY2FsZSwgJ3knOiB5IC8gc2NhbGUsICdyZWFseCc6IHJlYWx4IC8gc2NhbGUsICdyZWFseSc6IHJlYWx5IC8gc2NhbGV9OwogfTsKIAogCiAvLyBFdmVudCByZWdpc3RyYXRpb24uIEJhc2VkIG9uOiBodHRwOi8vd3d3LnNjb3R0YW5kcmV3LmNvbS93ZWJsb2cvYXJ0aWNsZXMvY2JzLWV2ZW50cwotVXRpbC5hZGRFdmVudCA9IGZ1bmN0aW9uIChvYmosIGV2VHlwZSwgZm4pewotICAgIGlmIChvYmouYXR0YWNoRXZlbnQpewotICAgICAgICB2YXIgciA9IG9iai5hdHRhY2hFdmVudCgib24iK2V2VHlwZSwgZm4pOworVXRpbC5hZGRFdmVudCA9IGZ1bmN0aW9uIChvYmosIGV2VHlwZSwgZm4pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgaWYgKG9iai5hdHRhY2hFdmVudCkgeworICAgICAgICB2YXIgciA9IG9iai5hdHRhY2hFdmVudCgib24iICsgZXZUeXBlLCBmbik7CiAgICAgICAgIHJldHVybiByOwotICAgIH0gZWxzZSBpZiAob2JqLmFkZEV2ZW50TGlzdGVuZXIpewotICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldlR5cGUsIGZuLCBmYWxzZSk7IAorICAgIH0gZWxzZSBpZiAob2JqLmFkZEV2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBmbiwgZmFsc2UpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdygiSGFuZGxlciBjb3VsZCBub3QgYmUgYXR0YWNoZWQiKTsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyIGNvdWxkIG5vdCBiZSBhdHRhY2hlZCIpOwogICAgIH0KIH07CiAKLVV0aWwucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbihvYmosIGV2VHlwZSwgZm4pewotICAgIGlmIChvYmouZGV0YWNoRXZlbnQpewotICAgICAgICB2YXIgciA9IG9iai5kZXRhY2hFdmVudCgib24iK2V2VHlwZSwgZm4pOworVXRpbC5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uIChvYmosIGV2VHlwZSwgZm4pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgaWYgKG9iai5kZXRhY2hFdmVudCkgeworICAgICAgICB2YXIgciA9IG9iai5kZXRhY2hFdmVudCgib24iICsgZXZUeXBlLCBmbik7CiAgICAgICAgIHJldHVybiByOwotICAgIH0gZWxzZSBpZiAob2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIpeworICAgIH0gZWxzZSBpZiAob2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZUeXBlLCBmbiwgZmFsc2UpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdygiSGFuZGxlciBjb3VsZCBub3QgYmUgcmVtb3ZlZCIpOworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXIgY291bGQgbm90IGJlIHJlbW92ZWQiKTsKICAgICB9CiB9OwogCi1VdGlsLnN0b3BFdmVudCA9IGZ1bmN0aW9uKGUpIHsKK1V0aWwuc3RvcEV2ZW50ID0gZnVuY3Rpb24gKGUpIHsKKyAgICAidXNlIHN0cmljdCI7CiAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IH0KICAgICBlbHNlICAgICAgICAgICAgICAgICAgIHsgZS5jYW5jZWxCdWJibGUgPSB0cnVlOyB9CiAKQEAgLTI2Myw0MSArNTY5LDg4IEBACiAvLyBTZXQgYnJvd3NlciBlbmdpbmUgdmVyc2lvbnMuIEJhc2VkIG9uIG1vb3Rvb2xzLgogVXRpbC5GZWF0dXJlcyA9IHt4cGF0aDogISEoZG9jdW1lbnQuZXZhbHVhdGUpLCBhaXI6ICEhKHdpbmRvdy5ydW50aW1lKSwgcXVlcnk6ICEhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpfTsKIAotVXRpbC5FbmdpbmUgPSB7Ci0gICAgLy8gVmVyc2lvbiBkZXRlY3Rpb24gYnJlYWsgaW4gT3BlcmEgMTEuNjAgKGVycm9ycyBvbiBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciByZWZlcmVuY2UpCi0gICAgLy8ncHJlc3RvJzogKGZ1bmN0aW9uKCkgewotICAgIC8vICAgICAgICAgcmV0dXJuICghd2luZG93Lm9wZXJhKSA/IGZhbHNlIDogKChhcmd1bWVudHMuY2FsbGVlLmNhbGxlcikgPyA5NjAgOiAoKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpID8gOTUwIDogOTI1KSk7IH0oKSksCi0gICAgJ3ByZXN0byc6IChmdW5jdGlvbigpIHsgcmV0dXJuICghd2luZG93Lm9wZXJhKSA/IGZhbHNlIDogdHJ1ZTsgfSgpKSwKKyhmdW5jdGlvbiAoKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIC8vICdwcmVzdG8nOiAoZnVuY3Rpb24gKCkgeyByZXR1cm4gKCF3aW5kb3cub3BlcmEpID8gZmFsc2UgOiB0cnVlOyB9KCkpLAorICAgIHZhciBkZXRlY3RQcmVzdG8gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAhIXdpbmRvdy5vcGVyYTsKKyAgICB9OwogCi0gICAgJ3RyaWRlbnQnOiAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gKCF3aW5kb3cuQWN0aXZlWE9iamVjdCkgPyBmYWxzZSA6ICgod2luZG93LlhNTEh0dHBSZXF1ZXN0KSA/ICgoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCkgPyA2IDogNSkgOiA0KTsgfSgpKSwKLSAgICAnd2Via2l0JzogKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIChuYXZpZ2F0b3IudGFpbnRFbmFibGVkKSA/IGZhbHNlIDogKChVdGlsLkZlYXR1cmVzLnhwYXRoKSA/ICgoVXRpbC5GZWF0dXJlcy5xdWVyeSkgPyA1MjUgOiA0MjApIDogNDE5KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfSgpKSwKLSAgICAvLyd3ZWJraXQnOiAoZnVuY3Rpb24oKSB7Ci0gICAgLy8gICAgICAgIHJldHVybiAoKHR5cGVvZiBuYXZpZ2F0b3IudGFpbnRFbmFibGVkICE9PSAidW5rbm93biIpICYmIG5hdmlnYXRvci50YWludEVuYWJsZWQpID8gZmFsc2UgOiAoKFV0aWwuRmVhdHVyZXMueHBhdGgpID8gKChVdGlsLkZlYXR1cmVzLnF1ZXJ5KSA/IDUyNSA6IDQyMCkgOiA0MTkpOyB9KCkpLAotICAgICdnZWNrbyc6IChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAoIWRvY3VtZW50LmdldEJveE9iamVjdEZvciAmJiB3aW5kb3cubW96SW5uZXJTY3JlZW5YID09IG51bGwpID8gZmFsc2UgOiAoKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpID8gMTkgOiAxOCk7IH0oKSkKLX07Ci1pZiAoVXRpbC5FbmdpbmUud2Via2l0KSB7Ci0gICAgLy8gRXh0cmFjdCBhY3R1YWwgd2Via2l0IHZlcnNpb24gaWYgYXZhaWxhYmxlCi0gICAgVXRpbC5FbmdpbmUud2Via2l0ID0gKGZ1bmN0aW9uKHYpIHsKLSAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1dlYktpdC8oWzAtOVwuXSopICcpOwotICAgICAgICAgICAgdiA9IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHJlKSB8fCBbJycsIHZdKVsxXTsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHYsIDEwKTsKLSAgICAgICAgfSkoVXRpbC5FbmdpbmUud2Via2l0KTsKLX0KKyAgICAvLyAndHJpZGVudCc6IChmdW5jdGlvbiAoKSB7IHJldHVybiAoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KSA/IGZhbHNlIDogKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpID8gKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKSA/IDYgOiA1KSA6IDQpOworICAgIHZhciBkZXRlY3RUcmlkZW50ID0gZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKSA/IDYgOiA1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CiAKLVV0aWwuRmxhc2ggPSAoZnVuY3Rpb24oKXsKKyAgICAvLyAnd2Via2l0JzogKGZ1bmN0aW9uICgpIHsgdHJ5IHsgcmV0dXJuIChuYXZpZ2F0b3IudGFpbnRFbmFibGVkKSA/IGZhbHNlIDogKChVdGlsLkZlYXR1cmVzLnhwYXRoKSA/ICgoVXRpbC5GZWF0dXJlcy5xdWVyeSkgPyA1MjUgOiA0MjApIDogNDE5KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfSgpKSwKKyAgICB2YXIgZGV0ZWN0SW5pdGlhbFdlYmtpdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudGFpbnRFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoVXRpbC5GZWF0dXJlcy54cGF0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFV0aWwuRmVhdHVyZXMucXVlcnkpID8gNTI1IDogNDIwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmFyIGRldGVjdEFjdHVhbFdlYmtpdCA9IGZ1bmN0aW9uIChpbml0aWFsX3ZlcikgeworICAgICAgICB2YXIgcmUgPSAvV2ViS2l0XC8oWzAtOVwuXSopIC87CisgICAgICAgIHZhciBzdHJfdmVyID0gKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gocmUpIHx8IFsnJywgaW5pdGlhbF92ZXJdKVsxXTsKKyAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyX3ZlciwgMTApOworICAgIH07CisKKyAgICAvLyAnZ2Vja28nOiAoZnVuY3Rpb24gKCkgeyByZXR1cm4gKCFkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IgJiYgd2luZG93Lm1veklubmVyU2NyZWVuWCA9PSBudWxsKSA/IGZhbHNlIDogKChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSA/IDE5c3NOYW1lKSA/IDE5IDogMTggOiAxOCk7IH0oKSkKKyAgICB2YXIgZGV0ZWN0R2Vja28gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8qIGpzaGludCAtVzA0MSAqLworICAgICAgICBpZiAoIWRvY3VtZW50LmdldEJveE9iamVjdEZvciAmJiB3aW5kb3cubW96SW5uZXJTY3JlZW5YID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyAxOSA6IDE4OworICAgICAgICB9CisgICAgICAgIC8qIGpzaGludCArVzA0MSAqLworICAgIH07CisKKyAgICBVdGlsLkVuZ2luZSA9IHsKKyAgICAgICAgLy8gVmVyc2lvbiBkZXRlY3Rpb24gYnJlYWsgaW4gT3BlcmEgMTEuNjAgKGVycm9ycyBvbiBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciByZWZlcmVuY2UpCisgICAgICAgIC8vJ3ByZXN0byc6IChmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gICAgICAgICByZXR1cm4gKCF3aW5kb3cub3BlcmEpID8gZmFsc2UgOiAoKGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyKSA/IDk2MCA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyA5NTAgOiA5MjUpKTsgfSgpKSwKKyAgICAgICAgJ3ByZXN0byc6IGRldGVjdFByZXN0bygpLAorICAgICAgICAndHJpZGVudCc6IGRldGVjdFRyaWRlbnQoKSwKKyAgICAgICAgJ3dlYmtpdCc6IGRldGVjdEluaXRpYWxXZWJraXQoKSwKKyAgICAgICAgJ2dlY2tvJzogZGV0ZWN0R2Vja28oKSwKKyAgICB9OworCisgICAgaWYgKFV0aWwuRW5naW5lLndlYmtpdCkgeworICAgICAgICAvLyBFeHRyYWN0IGFjdHVhbCB3ZWJraXQgdmVyc2lvbiBpZiBhdmFpbGFibGUKKyAgICAgICAgVXRpbC5FbmdpbmUud2Via2l0ID0gZGV0ZWN0QWN0dWFsV2Via2l0KFV0aWwuRW5naW5lLndlYmtpdCk7CisgICAgfQorfSkoKTsKKworVXRpbC5GbGFzaCA9IChmdW5jdGlvbiAoKSB7CisgICAgInVzZSBzdHJpY3QiOwogICAgIHZhciB2LCB2ZXJzaW9uOwogICAgIHRyeSB7CiAgICAgICAgIHYgPSBuYXZpZ2F0b3IucGx1Z2luc1snU2hvY2t3YXZlIEZsYXNoJ10uZGVzY3JpcHRpb247Ci0gICAgfSBjYXRjaChlcnIxKSB7CisgICAgfSBjYXRjaCAoZXJyMSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgdiA9IG5ldyBBY3RpdmVYT2JqZWN0KCdTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCcpLkdldFZhcmlhYmxlKCckdmVyc2lvbicpOwotICAgICAgICB9IGNhdGNoKGVycjIpIHsKKyAgICAgICAgfSBjYXRjaCAoZXJyMikgewogICAgICAgICAgICAgdiA9ICcwIHIwJzsKICAgICAgICAgfQogICAgIH0KICAgICB2ZXJzaW9uID0gdi5tYXRjaCgvXGQrL2cpOwogICAgIHJldHVybiB7dmVyc2lvbjogcGFyc2VJbnQodmVyc2lvblswXSB8fCAwICsgJy4nICsgdmVyc2lvblsxXSwgMTApIHx8IDAsIGJ1aWxkOiBwYXJzZUludCh2ZXJzaW9uWzJdLCAxMCkgfHwgMH07Ci19KCkpOyAKK30oKSk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdm5jLmpzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3ZuYy5qcwppbmRleCAyYjMxZjQ1Li43Njc5ZDg0IDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvdm5jLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS92bmMuanMKQEAgLTEsNiArMSw2IEBACiAvKgogICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnQKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgorICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluCiAgKiBMaWNlbnNlZCB1bmRlciBMR1BMLTMgKHNlZSBMSUNFTlNFLnR4dCkKICAqCiAgKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3dlYi1zb2NrZXQtanMvV2ViU29ja2V0TWFpbi5zd2YgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy9XZWJTb2NrZXRNYWluLnN3ZgppbmRleCAyNDRjNDQ1Li5mMjg2YzgxIDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy9XZWJTb2NrZXRNYWluLnN3ZgorKysgYi93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy9XZWJTb2NrZXRNYWluLnN3ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy93ZWJfc29ja2V0LmpzIGIvd2ViY2xpZW50cy9ub3ZuYy9pbmNsdWRlL3dlYi1zb2NrZXQtanMvd2ViX3NvY2tldC5qcwppbmRleCBlYzJhOGI3Li4wNmNjNWQwIDEwMDY0NAotLS0gYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2ViLXNvY2tldC1qcy93ZWJfc29ja2V0LmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWItc29ja2V0LWpzL3dlYl9zb2NrZXQuanMKQEAgLTEsNDkgKzEsNjkgQEAKIC8vIENvcHlyaWdodDogSGlyb3NoaSBJY2hpa2F3YSA8aHR0cDovL2dpbWl0ZS5uZXQvZW4vPgogLy8gTGljZW5zZTogTmV3IEJTRCBMaWNlbnNlCiAvLyBSZWZlcmVuY2U6IGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnNvY2tldHMvCi0vLyBSZWZlcmVuY2U6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWhpeGllLXRoZXdlYnNvY2tldHByb3RvY29sCisvLyBSZWZlcmVuY2U6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY0NTUKIAogKGZ1bmN0aW9uKCkgewogICAKLSAgaWYgKHdpbmRvdy5XZWJTb2NrZXQpIHJldHVybjsKLQotICB2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwotICBpZiAoIWNvbnNvbGUgfHwgIWNvbnNvbGUubG9nIHx8ICFjb25zb2xlLmVycm9yKSB7Ci0gICAgY29uc29sZSA9IHtsb2c6IGZ1bmN0aW9uKCl7IH0sIGVycm9yOiBmdW5jdGlvbigpeyB9fTsKKyAgaWYgKHdpbmRvdy5XRUJfU09DS0VUX0ZPUkNFX0ZMQVNIKSB7CisgICAgLy8gS2VlcHMgZ29pbmcuCisgIH0gZWxzZSBpZiAod2luZG93LldlYlNvY2tldCkgeworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh3aW5kb3cuTW96V2ViU29ja2V0KSB7CisgICAgLy8gRmlyZWZveC4KKyAgICB3aW5kb3cuV2ViU29ja2V0ID0gTW96V2ViU29ja2V0OworICAgIHJldHVybjsKICAgfQogICAKLSAgaWYgKCFzd2ZvYmplY3QuaGFzRmxhc2hQbGF5ZXJWZXJzaW9uKCIxMC4wLjAiKSkgewotICAgIGNvbnNvbGUuZXJyb3IoIkZsYXNoIFBsYXllciA+PSAxMC4wLjAgaXMgcmVxdWlyZWQuIik7CisgIHZhciBsb2dnZXI7CisgIGlmICh3aW5kb3cuV0VCX1NPQ0tFVF9MT0dHRVIpIHsKKyAgICBsb2dnZXIgPSBXRUJfU09DS0VUX0xPR0dFUjsKKyAgfSBlbHNlIGlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgJiYgd2luZG93LmNvbnNvbGUuZXJyb3IpIHsKKyAgICAvLyBJbiBzb21lIGVudmlyb25tZW50LCBjb25zb2xlIGlzIGRlZmluZWQgYnV0IGNvbnNvbGUubG9nIG9yIGNvbnNvbGUuZXJyb3IgaXMgbWlzc2luZy4KKyAgICBsb2dnZXIgPSB3aW5kb3cuY29uc29sZTsKKyAgfSBlbHNlIHsKKyAgICBsb2dnZXIgPSB7bG9nOiBmdW5jdGlvbigpeyB9LCBlcnJvcjogZnVuY3Rpb24oKXsgfX07CisgIH0KKyAgCisgIC8vIHN3Zm9iamVjdC5oYXNGbGFzaFBsYXllclZlcnNpb24oIjEwLjAuMCIpIGRvZXNuJ3Qgd29yayB3aXRoIEduYXNoLgorICBpZiAoc3dmb2JqZWN0LmdldEZsYXNoUGxheWVyVmVyc2lvbigpLm1ham9yIDwgMTApIHsKKyAgICBsb2dnZXIuZXJyb3IoIkZsYXNoIFBsYXllciA+PSAxMC4wLjAgaXMgcmVxdWlyZWQuIik7CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiKSB7Ci0gICAgY29uc29sZS5lcnJvcigKKyAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAiV0FSTklORzogd2ViLXNvY2tldC1qcyBkb2Vzbid0IHdvcmsgaW4gZmlsZTovLy8uLi4gVVJMICIgKwogICAgICAgInVubGVzcyB5b3Ugc2V0IEZsYXNoIFNlY3VyaXR5IFNldHRpbmdzIHByb3Blcmx5LiAiICsKICAgICAgICJPcGVuIHRoZSBwYWdlIHZpYSBXZWIgc2VydmVyIGkuZS4gaHR0cDovLy4uLiIpOwogICB9CiAKICAgLyoqCi0gICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGZhdXggd2ViIHNvY2tldC4KKyAgICogT3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBXZWJTb2NrZXQgY2xhc3MgdXNpbmcgRmxhc2guCiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKLSAgICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sCisgICAqIEBwYXJhbSB7YXJyYXkgb3Igc3RyaW5nfSBwcm90b2NvbHMKICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdAogICAgKiBAcGFyYW0ge2ludH0gcHJveHlQb3J0CiAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJzCiAgICAqLwotICBXZWJTb2NrZXQgPSBmdW5jdGlvbih1cmwsIHByb3RvY29sLCBwcm94eUhvc3QsIHByb3h5UG9ydCwgaGVhZGVycykgeworICB3aW5kb3cuV2ViU29ja2V0ID0gZnVuY3Rpb24odXJsLCBwcm90b2NvbHMsIHByb3h5SG9zdCwgcHJveHlQb3J0LCBoZWFkZXJzKSB7CiAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgIHNlbGYuX19pZCA9IFdlYlNvY2tldC5fX25leHRJZCsrOwogICAgIFdlYlNvY2tldC5fX2luc3RhbmNlc1tzZWxmLl9faWRdID0gc2VsZjsKICAgICBzZWxmLnJlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ09OTkVDVElORzsKICAgICBzZWxmLmJ1ZmZlcmVkQW1vdW50ID0gMDsKICAgICBzZWxmLl9fZXZlbnRzID0ge307CisgICAgaWYgKCFwcm90b2NvbHMpIHsKKyAgICAgIHByb3RvY29scyA9IFtdOworICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvY29scyA9PSAic3RyaW5nIikgeworICAgICAgcHJvdG9jb2xzID0gW3Byb3RvY29sc107CisgICAgfQogICAgIC8vIFVzZXMgc2V0VGltZW91dCgpIHRvIG1ha2Ugc3VyZSBfX2NyZWF0ZUZsYXNoKCkgcnVucyBhZnRlciB0aGUgY2FsbGVyIHNldHMgd3Mub25vcGVuIGV0Yy4KICAgICAvLyBPdGhlcndpc2UsIHdoZW4gb25vcGVuIGZpcmVzIGltbWVkaWF0ZWx5LCBvbm9wZW4gaXMgY2FsbGVkIGJlZm9yZSBpdCBpcyBzZXQuCi0gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICBzZWxmLl9fY3JlYXRlVGFzayA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICBXZWJTb2NrZXQuX19hZGRUYXNrKGZ1bmN0aW9uKCkgeworICAgICAgICBzZWxmLl9fY3JlYXRlVGFzayA9IG51bGw7CiAgICAgICAgIFdlYlNvY2tldC5fX2ZsYXNoLmNyZWF0ZSgKLSAgICAgICAgICAgIHNlbGYuX19pZCwgdXJsLCBwcm90b2NvbCwgcHJveHlIb3N0IHx8IG51bGwsIHByb3h5UG9ydCB8fCAwLCBoZWFkZXJzIHx8IG51bGwpOworICAgICAgICAgICAgc2VsZi5fX2lkLCB1cmwsIHByb3RvY29scywgcHJveHlIb3N0IHx8IG51bGwsIHByb3h5UG9ydCB8fCAwLCBoZWFkZXJzIHx8IG51bGwpOwogICAgICAgfSk7CiAgICAgfSwgMCk7CiAgIH07CkBAIC03OCw2ICs5OCwxMiBAQAogICAgKiBDbG9zZSB0aGlzIHdlYiBzb2NrZXQgZ3JhY2VmdWxseS4KICAgICovCiAgIFdlYlNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5fX2NyZWF0ZVRhc2spIHsKKyAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9fY3JlYXRlVGFzayk7CisgICAgICB0aGlzLl9fY3JlYXRlVGFzayA9IG51bGw7CisgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0VEOworICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5DTE9TRUQgfHwgdGhpcy5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5DTE9TSU5HKSB7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMxLDcgKzE1Nyw3IEBACiAgICAgICBldmVudHNbaV0oZXZlbnQpOwogICAgIH0KICAgICB2YXIgaGFuZGxlciA9IHRoaXNbIm9uIiArIGV2ZW50LnR5cGVdOwotICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGV2ZW50KTsKKyAgICBpZiAoaGFuZGxlcikgaGFuZGxlci5hcHBseSh0aGlzLCBbZXZlbnRdKTsKICAgfTsKIAogICAvKioKQEAgLTEzOSwxNiArMTY1LDIyIEBACiAgICAqIEBwYXJhbSB7T2JqZWN0fSBmbGFzaEV2ZW50CiAgICAqLwogICBXZWJTb2NrZXQucHJvdG90eXBlLl9faGFuZGxlRXZlbnQgPSBmdW5jdGlvbihmbGFzaEV2ZW50KSB7CisgICAgCiAgICAgaWYgKCJyZWFkeVN0YXRlIiBpbiBmbGFzaEV2ZW50KSB7CiAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBmbGFzaEV2ZW50LnJlYWR5U3RhdGU7CiAgICAgfQorICAgIGlmICgicHJvdG9jb2wiIGluIGZsYXNoRXZlbnQpIHsKKyAgICAgIHRoaXMucHJvdG9jb2wgPSBmbGFzaEV2ZW50LnByb3RvY29sOworICAgIH0KICAgICAKICAgICB2YXIganNFdmVudDsKICAgICBpZiAoZmxhc2hFdmVudC50eXBlID09ICJvcGVuIiB8fCBmbGFzaEV2ZW50LnR5cGUgPT0gImVycm9yIikgewogICAgICAganNFdmVudCA9IHRoaXMuX19jcmVhdGVTaW1wbGVFdmVudChmbGFzaEV2ZW50LnR5cGUpOwogICAgIH0gZWxzZSBpZiAoZmxhc2hFdmVudC50eXBlID09ICJjbG9zZSIpIHsKLSAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGpzRXZlbnQud2FzQ2xlYW4KICAgICAgIGpzRXZlbnQgPSB0aGlzLl9fY3JlYXRlU2ltcGxlRXZlbnQoImNsb3NlIik7CisgICAgICBqc0V2ZW50Lndhc0NsZWFuID0gZmxhc2hFdmVudC53YXNDbGVhbiA/IHRydWUgOiBmYWxzZTsKKyAgICAgIGpzRXZlbnQuY29kZSA9IGZsYXNoRXZlbnQuY29kZTsKKyAgICAgIGpzRXZlbnQucmVhc29uID0gZmxhc2hFdmVudC5yZWFzb247CiAgICAgfSBlbHNlIGlmIChmbGFzaEV2ZW50LnR5cGUgPT0gIm1lc3NhZ2UiKSB7CiAgICAgICB2YXIgZGF0YSA9IGRlY29kZVVSSUNvbXBvbmVudChmbGFzaEV2ZW50Lm1lc3NhZ2UpOwogICAgICAganNFdmVudCA9IHRoaXMuX19jcmVhdGVNZXNzYWdlRXZlbnQoIm1lc3NhZ2UiLCBkYXRhKTsKQEAgLTE1Nyw2ICsxODksNyBAQAogICAgIH0KICAgICAKICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoanNFdmVudCk7CisgICAgCiAgIH07CiAgIAogICBXZWJTb2NrZXQucHJvdG90eXBlLl9fY3JlYXRlU2ltcGxlRXZlbnQgPSBmdW5jdGlvbih0eXBlKSB7CkBAIC0xODgsNiArMjIxLDkgQEAKICAgV2ViU29ja2V0LkNMT1NJTkcgPSAyOwogICBXZWJTb2NrZXQuQ0xPU0VEID0gMzsKIAorICAvLyBGaWVsZCB0byBjaGVjayBpbXBsZW1lbnRhdGlvbiBvZiBXZWJTb2NrZXQuCisgIFdlYlNvY2tldC5fX2lzRmxhc2hJbXBsZW1lbnRhdGlvbiA9IHRydWU7CisgIFdlYlNvY2tldC5fX2luaXRpYWxpemVkID0gZmFsc2U7CiAgIFdlYlNvY2tldC5fX2ZsYXNoID0gbnVsbDsKICAgV2ViU29ja2V0Ll9faW5zdGFuY2VzID0ge307CiAgIFdlYlNvY2tldC5fX3Rhc2tzID0gW107CkBAIC0yMDcsMTYgKzI0MywzMSBAQAogICAgKiBMb2FkcyBXZWJTb2NrZXRNYWluLnN3ZiBhbmQgY3JlYXRlcyBXZWJTb2NrZXRNYWluIG9iamVjdCBpbiBGbGFzaC4KICAgICovCiAgIFdlYlNvY2tldC5fX2luaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoV2ViU29ja2V0Ll9fZmxhc2gpIHJldHVybjsKKyAgICAKKyAgICBpZiAoV2ViU29ja2V0Ll9faW5pdGlhbGl6ZWQpIHJldHVybjsKKyAgICBXZWJTb2NrZXQuX19pbml0aWFsaXplZCA9IHRydWU7CiAgICAgCiAgICAgaWYgKFdlYlNvY2tldC5fX3N3ZkxvY2F0aW9uKSB7CiAgICAgICAvLyBGb3IgYmFja3dvcmQgY29tcGF0aWJpbGl0eS4KICAgICAgIHdpbmRvdy5XRUJfU09DS0VUX1NXRl9MT0NBVElPTiA9IFdlYlNvY2tldC5fX3N3ZkxvY2F0aW9uOwogICAgIH0KICAgICBpZiAoIXdpbmRvdy5XRUJfU09DS0VUX1NXRl9MT0NBVElPTikgewotICAgICAgY29uc29sZS5lcnJvcigiW1dlYlNvY2tldF0gc2V0IFdFQl9TT0NLRVRfU1dGX0xPQ0FUSU9OIHRvIGxvY2F0aW9uIG9mIFdlYlNvY2tldE1haW4uc3dmIik7CisgICAgICBsb2dnZXIuZXJyb3IoIltXZWJTb2NrZXRdIHNldCBXRUJfU09DS0VUX1NXRl9MT0NBVElPTiB0byBsb2NhdGlvbiBvZiBXZWJTb2NrZXRNYWluLnN3ZiIpOwogICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBpZiAoIXdpbmRvdy5XRUJfU09DS0VUX1NVUFBSRVNTX0NST1NTX0RPTUFJTl9TV0ZfRVJST1IgJiYKKyAgICAgICAgIVdFQl9TT0NLRVRfU1dGX0xPQ0FUSU9OLm1hdGNoKC8oXnxcLylXZWJTb2NrZXRNYWluSW5zZWN1cmVcLnN3ZihcPy4qKT8kLykgJiYKKyAgICAgICAgV0VCX1NPQ0tFVF9TV0ZfTE9DQVRJT04ubWF0Y2goL15cdys6XC9cLyhbXlwvXSspLykpIHsKKyAgICAgIHZhciBzd2ZIb3N0ID0gUmVnRXhwLiQxOworICAgICAgaWYgKGxvY2F0aW9uLmhvc3QgIT0gc3dmSG9zdCkgeworICAgICAgICBsb2dnZXIuZXJyb3IoCisgICAgICAgICAgICAiW1dlYlNvY2tldF0gWW91IG11c3QgaG9zdCBIVE1MIGFuZCBXZWJTb2NrZXRNYWluLnN3ZiBpbiB0aGUgc2FtZSBob3N0ICIgKworICAgICAgICAgICAgIignIiArIGxvY2F0aW9uLmhvc3QgKyAiJyAhPSAnIiArIHN3Zkhvc3QgKyAiJykuICIgKworICAgICAgICAgICAgIlNlZSBhbHNvICdIb3cgdG8gaG9zdCBIVE1MIGZpbGUgYW5kIFNXRiBmaWxlIGluIGRpZmZlcmVudCBkb21haW5zJyBzZWN0aW9uICIgKworICAgICAgICAgICAgImluIFJFQURNRS5tZC4gSWYgeW91IHVzZSBXZWJTb2NrZXRNYWluSW5zZWN1cmUuc3dmLCB5b3UgY2FuIHN1cHByZXNzIHRoaXMgbWVzc2FnZSAiICsKKyAgICAgICAgICAgICJieSBXRUJfU09DS0VUX1NVUFBSRVNTX0NST1NTX0RPTUFJTl9TV0ZfRVJST1IgPSB0cnVlOyIpOworICAgICAgfQorICAgIH0KICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgY29udGFpbmVyLmlkID0gIndlYlNvY2tldENvbnRhaW5lciI7CiAgICAgLy8gSGlkZXMgRmxhc2ggYm94LiBXZSBjYW5ub3QgdXNlIGRpc3BsYXk6IG5vbmUgb3IgdmlzaWJpbGl0eTogaGlkZGVuIGJlY2F1c2UgaXQgcHJldmVudHMKQEAgLTI1MCw5ICszMDEsMTEgQEAKICAgICAgIG51bGwsCiAgICAgICBmdW5jdGlvbihlKSB7CiAgICAgICAgIGlmICghZS5zdWNjZXNzKSB7Ci0gICAgICAgICAgY29uc29sZS5lcnJvcigiW1dlYlNvY2tldF0gc3dmb2JqZWN0LmVtYmVkU1dGIGZhaWxlZCIpOworICAgICAgICAgIGxvZ2dlci5lcnJvcigiW1dlYlNvY2tldF0gc3dmb2JqZWN0LmVtYmVkU1dGIGZhaWxlZCIpOwogICAgICAgICB9Ci0gICAgICB9KTsKKyAgICAgIH0KKyAgICApOworICAgIAogICB9OwogICAKICAgLyoqCkBAIC0yODcsNyArMzQwLDcgQEAKICAgICAgICAgICBXZWJTb2NrZXQuX19pbnN0YW5jZXNbZXZlbnRzW2ldLndlYlNvY2tldElkXS5fX2hhbmRsZUV2ZW50KGV2ZW50c1tpXSk7CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgICAgY29uc29sZS5lcnJvcihlKTsKKyAgICAgICAgbG9nZ2VyLmVycm9yKGUpOwogICAgICAgfQogICAgIH0sIDApOwogICAgIHJldHVybiB0cnVlOwpAQCAtMjk1LDEyICszNDgsMTIgQEAKICAgCiAgIC8vIENhbGxlZCBieSBGbGFzaC4KICAgV2ViU29ja2V0Ll9fbG9nID0gZnVuY3Rpb24obWVzc2FnZSkgewotICAgIGNvbnNvbGUubG9nKGRlY29kZVVSSUNvbXBvbmVudChtZXNzYWdlKSk7CisgICAgbG9nZ2VyLmxvZyhkZWNvZGVVUklDb21wb25lbnQobWVzc2FnZSkpOwogICB9OwogICAKICAgLy8gQ2FsbGVkIGJ5IEZsYXNoLgogICBXZWJTb2NrZXQuX19lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICBjb25zb2xlLmVycm9yKGRlY29kZVVSSUNvbXBvbmVudChtZXNzYWdlKSk7CisgICAgbG9nZ2VyLmVycm9yKGRlY29kZVVSSUNvbXBvbmVudChtZXNzYWdlKSk7CiAgIH07CiAgIAogICBXZWJTb2NrZXQuX19hZGRUYXNrID0gZnVuY3Rpb24odGFzaykgewpAQCAtMzI3LDE1ICszODAsMTIgQEAKICAgfTsKICAgCiAgIGlmICghd2luZG93LldFQl9TT0NLRVRfRElTQUJMRV9BVVRPX0lOSVRJQUxJWkFUSU9OKSB7Ci0gICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7Ci0gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCl7Ci0gICAgICAgIFdlYlNvY2tldC5fX2luaXRpYWxpemUoKTsKLSAgICAgIH0sIGZhbHNlKTsKLSAgICB9IGVsc2UgewotICAgICAgd2luZG93LmF0dGFjaEV2ZW50KCJvbmxvYWQiLCBmdW5jdGlvbigpewotICAgICAgICBXZWJTb2NrZXQuX19pbml0aWFsaXplKCk7Ci0gICAgICB9KTsKLSAgICB9CisgICAgLy8gTk9URToKKyAgICAvLyAgIFRoaXMgZmlyZXMgaW1tZWRpYXRlbHkgaWYgd2ViX3NvY2tldC5qcyBpcyBkeW5hbWljYWxseSBsb2FkZWQgYWZ0ZXIKKyAgICAvLyAgIHRoZSBkb2N1bWVudCBpcyBsb2FkZWQuCisgICAgc3dmb2JqZWN0LmFkZERvbUxvYWRFdmVudChmdW5jdGlvbigpIHsKKyAgICAgIFdlYlNvY2tldC5fX2luaXRpYWxpemUoKTsKKyAgICB9KTsKICAgfQogICAKIH0pKCk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2Vic29jay5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJzb2NrLmpzCmluZGV4IDMzMzUwZGYuLjFiODlhOTEgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJzb2NrLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJzb2NrLmpzCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFdlYnNvY2s6IGhpZ2gtcGVyZm9ybWFuY2UgYmluYXJ5IFdlYlNvY2tldHMKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICogTGljZW5zZWQgdW5kZXIgTEdQTC0zIChzZWUgTElDRU5TRS50eHQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKICAqCiAgKiBXZWJzb2NrIGlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIFdlYlNvY2tldCBvYmplY3QgYnV0IFdlYnNvY2sKICAqIGVuYWJsZXMgY29tbXVuaWNhdGlvbiB3aXRoIHJhdyBUQ1Agc29ja2V0cyAoaS5lLiB0aGUgYmluYXJ5IHN0cmVhbSkKQEAgLTE0LDEyICsxNCwxNyBAQAogICogcmVhZCBiaW5hcnkgZGF0YSBvZmYgb2YgdGhlIHJlY2VpdmUgcXVldWUuCiAgKi8KIAotLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgYml0d2lzZTogZmFsc2UsIHBsdXNwbHVzOiBmYWxzZSAqLworLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgYml0d2lzZTogdHJ1ZSAqLwogLypnbG9iYWwgVXRpbCwgQmFzZTY0ICovCiAKIAogLy8gTG9hZCBGbGFzaCBXZWJTb2NrZXQgZW11bGF0b3IgaWYgbmVlZGVkCiAKKy8vIFRvIGZvcmNlIFdlYlNvY2tldCBlbXVsYXRvciBldmVuIHdoZW4gbmF0aXZlIFdlYlNvY2tldCBhdmFpbGFibGUKKy8vd2luZG93LldFQl9TT0NLRVRfRk9SQ0VfRkxBU0ggPSB0cnVlOworLy8gVG8gZW5hYmxlIFdlYlNvY2tldCBlbXVsYXRvciBkZWJ1ZzoKKy8vd2luZG93LldFQl9TT0NLRVRfREVCVUc9MTsKKwogaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgIXdpbmRvdy5XRUJfU09DS0VUX0ZPUkNFX0ZMQVNIKSB7CiAgICAgV2Vic29ja19uYXRpdmUgPSB0cnVlOwogfSBlbHNlIGlmICh3aW5kb3cuTW96V2ViU29ja2V0ICYmICF3aW5kb3cuV0VCX1NPQ0tFVF9GT1JDRV9GTEFTSCkgewpAQCAtMjgsMzI5ICszMywzNTIgQEAKIH0gZWxzZSB7CiAgICAgLyogbm8gYnVpbHRpbiBXZWJTb2NrZXQgc28gbG9hZCB3ZWJfc29ja2V0LmpzICovCiAKLSAgICAvLyBUbyBlbmFibGUgZGVidWc6Ci0gICAgLy8gd2luZG93LldFQl9TT0NLRVRfREVCVUc9MTsKLQogICAgIFdlYnNvY2tfbmF0aXZlID0gZmFsc2U7CiAgICAgKGZ1bmN0aW9uICgpIHsKLSAgICAgICAgZnVuY3Rpb24gZ2V0X0lOQ0xVREVfVVJJKCkgewotICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgSU5DTFVERV9VUkkgIT09ICJ1bmRlZmluZWQiKSA/Ci0gICAgICAgICAgICAgICAgSU5DTFVERV9VUkkgOiAiaW5jbHVkZS8iOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHN0YXJ0ID0gIjxzY3JpcHQgc3JjPSciICsgZ2V0X0lOQ0xVREVfVVJJKCksCi0gICAgICAgICAgICBlbmQgPSAiJz48XC9zY3JpcHQ+IiwgZXh0cmEgPSAiIjsKLQotICAgICAgICB3aW5kb3cuV0VCX1NPQ0tFVF9TV0ZfTE9DQVRJT04gPSBnZXRfSU5DTFVERV9VUkkoKSArCisgICAgICAgIHdpbmRvdy5XRUJfU09DS0VUX1NXRl9MT0NBVElPTiA9IFV0aWwuZ2V0X2luY2x1ZGVfdXJpKCkgKwogICAgICAgICAgICAgICAgICAgICAid2ViLXNvY2tldC1qcy9XZWJTb2NrZXRNYWluLnN3ZiI7CiAgICAgICAgIGlmIChVdGlsLkVuZ2luZS50cmlkZW50KSB7CiAgICAgICAgICAgICBVdGlsLkRlYnVnKCJGb3JjaW5nIHVuY2FjaGVkIGxvYWQgb2YgV2ViU29ja2V0TWFpbi5zd2YiKTsKICAgICAgICAgICAgIHdpbmRvdy5XRUJfU09DS0VUX1NXRl9MT0NBVElPTiArPSAiPyIgKyBNYXRoLnJhbmRvbSgpOwogICAgICAgICB9Ci0gICAgICAgIGV4dHJhICs9IHN0YXJ0ICsgIndlYi1zb2NrZXQtanMvc3dmb2JqZWN0LmpzIiArIGVuZDsKLSAgICAgICAgZXh0cmEgKz0gc3RhcnQgKyAid2ViLXNvY2tldC1qcy93ZWJfc29ja2V0LmpzIiArIGVuZDsKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoZXh0cmEpOwotICAgIH0oKSk7CisgICAgICAgIFV0aWwubG9hZF9zY3JpcHRzKFsid2ViLXNvY2tldC1qcy9zd2ZvYmplY3QuanMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYi1zb2NrZXQtanMvd2ViX3NvY2tldC5qcyJdKTsKKyAgICB9KSgpOwogfQogCiAKIGZ1bmN0aW9uIFdlYnNvY2soKSB7Ci0idXNlIHN0cmljdCI7CisgICAgInVzZSBzdHJpY3QiOwogCi12YXIgYXBpID0ge30sICAgICAgICAgLy8gUHVibGljIEFQSQotICAgIHdlYnNvY2tldCA9IG51bGwsIC8vIFdlYlNvY2tldCBvYmplY3QKLSAgICByUSA9IFtdLCAgICAgICAgICAvLyBSZWNlaXZlIHF1ZXVlCi0gICAgclFpID0gMCwgICAgICAgICAgLy8gUmVjZWl2ZSBxdWV1ZSBpbmRleAotICAgIHJRbWF4ID0gMTAwMDAsICAgIC8vIE1heCByZWNlaXZlIHF1ZXVlIHNpemUgYmVmb3JlIGNvbXBhY3RpbmcKLSAgICBzUSA9IFtdLCAgICAgICAgICAvLyBTZW5kIHF1ZXVlCisgICAgdGhpcy5fd2Vic29ja2V0ID0gbnVsbDsgIC8vIFdlYlNvY2tldCBvYmplY3QKKyAgICB0aGlzLl9yUSA9IFtdOyAgICAgICAgICAgLy8gUmVjZWl2ZSBxdWV1ZQorICAgIHRoaXMuX3JRaSA9IDA7ICAgICAgICAgICAvLyBSZWNlaXZlIHF1ZXVlIGluZGV4CisgICAgdGhpcy5fclFtYXggPSAxMDAwMDsgICAgIC8vIE1heCByZWNlaXZlIHF1ZXVlIHNpemUgYmVmb3JlIGNvbXBhY3RpbmcKKyAgICB0aGlzLl9zUSA9IFtdOyAgICAgICAgICAgLy8gU2VuZCBxdWV1ZQogCi0gICAgZXZlbnRIYW5kbGVycyA9IHsKLSAgICAgICAgJ21lc3NhZ2UnIDogZnVuY3Rpb24oKSB7fSwKLSAgICAgICAgJ29wZW4nICAgIDogZnVuY3Rpb24oKSB7fSwKLSAgICAgICAgJ2Nsb3NlJyAgIDogZnVuY3Rpb24oKSB7fSwKLSAgICAgICAgJ2Vycm9yJyAgIDogZnVuY3Rpb24oKSB7fQotICAgIH0sCisgICAgdGhpcy5fbW9kZSA9ICdiYXNlNjQnOyAgICAvLyBDdXJyZW50IFdlYlNvY2tldCBtb2RlOiAnYmluYXJ5JywgJ2Jhc2U2NCcKKyAgICB0aGlzLm1heEJ1ZmZlcmVkQW1vdW50ID0gMjAwOwogCi0gICAgdGVzdF9tb2RlID0gZmFsc2U7Ci0KLQotLy8KLS8vIFF1ZXVlIHB1YmxpYyBmdW5jdGlvbnMKLS8vCi0KLWZ1bmN0aW9uIGdldF9zUSgpIHsKLSAgICByZXR1cm4gc1E7CisgICAgdGhpcy5fZXZlbnRIYW5kbGVycyA9IHsKKyAgICAgICAgJ21lc3NhZ2UnOiBmdW5jdGlvbiAoKSB7fSwKKyAgICAgICAgJ29wZW4nOiBmdW5jdGlvbiAoKSB7fSwKKyAgICAgICAgJ2Nsb3NlJzogZnVuY3Rpb24gKCkge30sCisgICAgICAgICdlcnJvcic6IGZ1bmN0aW9uICgpIHt9CisgICAgfTsKIH0KIAotZnVuY3Rpb24gZ2V0X3JRKCkgewotICAgIHJldHVybiByUTsKLX0KLWZ1bmN0aW9uIGdldF9yUWkoKSB7Ci0gICAgcmV0dXJuIHJRaTsKLX0KLWZ1bmN0aW9uIHNldF9yUWkodmFsKSB7Ci0gICAgclFpID0gdmFsOwotfQorKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgV2Vic29jay5wcm90b3R5cGUgPSB7CisgICAgICAgIC8vIEdldHRlcnMgYW5kIFNldHRlcnMKKyAgICAgICAgZ2V0X3NROiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc1E7CisgICAgICAgIH0sCiAKLWZ1bmN0aW9uIHJRbGVuKCkgewotICAgIHJldHVybiByUS5sZW5ndGggLSByUWk7Ci19CisgICAgICAgIGdldF9yUTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JROworICAgICAgICB9LAogCi1mdW5jdGlvbiByUXBlZWs4KCkgewotICAgIHJldHVybiAoclFbclFpXSAgICAgICk7Ci19Ci1mdW5jdGlvbiByUXNoaWZ0OCgpIHsKLSAgICByZXR1cm4gKHJRW3JRaSsrXSAgICAgICk7Ci19Ci1mdW5jdGlvbiByUXVuc2hpZnQ4KG51bSkgewotICAgIGlmIChyUWkgPT09IDApIHsKLSAgICAgICAgclEudW5zaGlmdChudW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJRaSAtPSAxOwotICAgICAgICByUVtyUWldID0gbnVtOwotICAgIH0KKyAgICAgICAgZ2V0X3JRaTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JRaTsKKyAgICAgICAgfSwKIAotfQotZnVuY3Rpb24gclFzaGlmdDE2KCkgewotICAgIHJldHVybiAoclFbclFpKytdIDw8ICA4KSArCi0gICAgICAgICAgIChyUVtyUWkrK10gICAgICApOwotfQotZnVuY3Rpb24gclFzaGlmdDMyKCkgewotICAgIHJldHVybiAoclFbclFpKytdIDw8IDI0KSArCi0gICAgICAgICAgIChyUVtyUWkrK10gPDwgMTYpICsKLSAgICAgICAgICAgKHJRW3JRaSsrXSA8PCAgOCkgKwotICAgICAgICAgICAoclFbclFpKytdICAgICAgKTsKLX0KLWZ1bmN0aW9uIHJRc2hpZnRTdHIobGVuKSB7Ci0gICAgaWYgKHR5cGVvZihsZW4pID09PSAndW5kZWZpbmVkJykgeyBsZW4gPSByUWxlbigpOyB9Ci0gICAgdmFyIGFyciA9IHJRLnNsaWNlKHJRaSwgclFpICsgbGVuKTsKLSAgICByUWkgKz0gbGVuOwotICAgIHJldHVybiBhcnIubWFwKGZ1bmN0aW9uIChudW0pIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG51bSk7IH0gKS5qb2luKCcnKTsKKyAgICAgICAgc2V0X3JRaTogZnVuY3Rpb24gKHZhbCkgeworICAgICAgICAgICAgdGhpcy5fclFpID0gdmFsOworICAgICAgICB9LAogCi19Ci1mdW5jdGlvbiByUXNoaWZ0Qnl0ZXMobGVuKSB7Ci0gICAgaWYgKHR5cGVvZihsZW4pID09PSAndW5kZWZpbmVkJykgeyBsZW4gPSByUWxlbigpOyB9Ci0gICAgclFpICs9IGxlbjsKLSAgICByZXR1cm4gclEuc2xpY2UoclFpLWxlbiwgclFpKTsKLX0KKyAgICAgICAgLy8gUmVjZWl2ZSBRdWV1ZQorICAgICAgICByUWxlbjogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JRLmxlbmd0aCAtIHRoaXMuX3JRaTsKKyAgICAgICAgfSwKIAotZnVuY3Rpb24gclFzbGljZShzdGFydCwgZW5kKSB7Ci0gICAgaWYgKGVuZCkgewotICAgICAgICByZXR1cm4gclEuc2xpY2UoclFpICsgc3RhcnQsIHJRaSArIGVuZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJRLnNsaWNlKHJRaSArIHN0YXJ0KTsKLSAgICB9Ci19CisgICAgICAgIHJRcGVlazg6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9yUVt0aGlzLl9yUWldOworICAgICAgICB9LAogCi0vLyBDaGVjayB0byBzZWUgaWYgd2UgbXVzdCB3YWl0IGZvciAnbnVtJyBieXRlcyAoZGVmYXVsdCB0byBGQlUuYnl0ZXMpCi0vLyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIHJlY2VpdmUgcXVldWUuIFJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8KLS8vIHdhaXQgKGFuZCBwb3NzaWJseSBwcmludCBhIGRlYnVnIG1lc3NhZ2UpLCBvdGhlcndpc2UgZmFsc2UuCi1mdW5jdGlvbiByUXdhaXQobXNnLCBudW0sIGdvYmFjaykgewotICAgIHZhciByUWxlbiA9IHJRLmxlbmd0aCAtIHJRaTsgLy8gU2tpcCByUWxlbigpIGZ1bmN0aW9uIGNhbGwKLSAgICBpZiAoclFsZW4gPCBudW0pIHsKLSAgICAgICAgaWYgKGdvYmFjaykgewotICAgICAgICAgICAgaWYgKHJRaSA8IGdvYmFjaykgewotICAgICAgICAgICAgICAgIHRocm93KCJyUXdhaXQgY2Fubm90IGJhY2t1cCAiICsgZ29iYWNrICsgIiBieXRlcyIpOworICAgICAgICByUXNoaWZ0ODogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JRW3RoaXMuX3JRaSsrXTsKKyAgICAgICAgfSwKKworICAgICAgICByUXNraXA4OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB0aGlzLl9yUWkrKzsKKyAgICAgICAgfSwKKworICAgICAgICByUXNraXBCeXRlczogZnVuY3Rpb24gKG51bSkgeworICAgICAgICAgICAgdGhpcy5fclFpICs9IG51bTsKKyAgICAgICAgfSwKKworICAgICAgICByUXVuc2hpZnQ4OiBmdW5jdGlvbiAobnVtKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fclFpID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fclEudW5zaGlmdChudW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9yUWktLTsKKyAgICAgICAgICAgICAgICB0aGlzLl9yUVt0aGlzLl9yUWldID0gbnVtOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgclFpIC09IGdvYmFjazsKLSAgICAgICAgfQotICAgICAgICAvL1V0aWwuRGVidWcoIiAgIHdhaXRpbmcgZm9yICIgKyAobnVtLXJRbGVuKSArCi0gICAgICAgIC8vICAgICAgICAgICAiICIgKyBtc2cgKyAiIGJ5dGUocykiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7ICAvLyB0cnVlIG1lYW5zIG5lZWQgbW9yZSBkYXRhCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICAgICAgfSwKIAotLy8KLS8vIFByaXZhdGUgdXRpbGl0eSByb3V0aW5lcwotLy8KKyAgICAgICAgclFzaGlmdDE2OiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICByZXR1cm4gKHRoaXMuX3JRW3RoaXMuX3JRaSsrXSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgdGhpcy5fclFbdGhpcy5fclFpKytdOworICAgICAgICB9LAogCi1mdW5jdGlvbiBlbmNvZGVfbWVzc2FnZSgpIHsKLSAgICAvKiBiYXNlNjQgZW5jb2RlICovCi0gICAgcmV0dXJuIEJhc2U2NC5lbmNvZGUoc1EpOwotfQorICAgICAgICByUXNoaWZ0MzI6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiAodGhpcy5fclFbdGhpcy5fclFpKytdIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgKHRoaXMuX3JRW3RoaXMuX3JRaSsrXSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICh0aGlzLl9yUVt0aGlzLl9yUWkrK10gPDwgOCkgKworICAgICAgICAgICAgICAgICAgIHRoaXMuX3JRW3RoaXMuX3JRaSsrXTsKKyAgICAgICAgfSwKIAotZnVuY3Rpb24gZGVjb2RlX21lc3NhZ2UoZGF0YSkgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gZGVjb2RlX21lc3NhZ2U6ICIgKyBkYXRhKTsKLSAgICAvKiBiYXNlNjQgZGVjb2RlICovCi0gICAgclEgPSByUS5jb25jYXQoQmFzZTY0LmRlY29kZShkYXRhLCAwKSk7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBkZWNvZGVfbWVzc2FnZSwgclE6ICIgKyByUSk7Ci19CisgICAgICAgIHJRc2hpZnRTdHI6IGZ1bmN0aW9uIChsZW4pIHsKKyAgICAgICAgICAgIGlmICh0eXBlb2YobGVuKSA9PT0gJ3VuZGVmaW5lZCcpIHsgbGVuID0gdGhpcy5yUWxlbigpOyB9CisgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy5fclEuc2xpY2UodGhpcy5fclFpLCB0aGlzLl9yUWkgKyBsZW4pOworICAgICAgICAgICAgdGhpcy5fclFpICs9IGxlbjsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycik7CisgICAgICAgIH0sCiAKKyAgICAgICAgclFzaGlmdEJ5dGVzOiBmdW5jdGlvbiAobGVuKSB7CisgICAgICAgICAgICBpZiAodHlwZW9mKGxlbikgPT09ICd1bmRlZmluZWQnKSB7IGxlbiA9IHRoaXMuclFsZW4oKTsgfQorICAgICAgICAgICAgdGhpcy5fclFpICs9IGxlbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9yUS5zbGljZSh0aGlzLl9yUWkgLSBsZW4sIHRoaXMuX3JRaSk7CisgICAgICAgIH0sCiAKLS8vCi0vLyBQdWJsaWMgU2VuZCBmdW5jdGlvbnMKLS8vCi0KLWZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmICh3ZWJzb2NrZXQuYnVmZmVyZWRBbW91bnQgIT09IDApIHsKLSAgICAgICAgVXRpbC5EZWJ1ZygiYnVmZmVyZWRBbW91bnQ6ICIgKyB3ZWJzb2NrZXQuYnVmZmVyZWRBbW91bnQpOwotICAgIH0KLSAgICBpZiAod2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50IDwgYXBpLm1heEJ1ZmZlcmVkQW1vdW50KSB7Ci0gICAgICAgIC8vVXRpbC5EZWJ1ZygiYXJyOiAiICsgYXJyKTsKLSAgICAgICAgLy9VdGlsLkRlYnVnKCJzUTogIiArIHNRKTsKLSAgICAgICAgaWYgKHNRLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHdlYnNvY2tldC5zZW5kKGVuY29kZV9tZXNzYWdlKHNRKSk7Ci0gICAgICAgICAgICBzUSA9IFtdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFV0aWwuSW5mbygiRGVsYXlpbmcgc2VuZCwgYnVmZmVyZWRBbW91bnQ6ICIgKwotICAgICAgICAgICAgICAgIHdlYnNvY2tldC5idWZmZXJlZEFtb3VudCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8vIG92ZXJyaWRhYmxlIGZvciB0ZXN0aW5nCi1mdW5jdGlvbiBzZW5kKGFycikgewotICAgIC8vVXRpbC5EZWJ1ZygiPj4gc2VuZF9hcnJheTogIiArIGFycik7Ci0gICAgc1EgPSBzUS5jb25jYXQoYXJyKTsKLSAgICByZXR1cm4gZmx1c2goKTsKLX0KLQotZnVuY3Rpb24gc2VuZF9zdHJpbmcoc3RyKSB7Ci0gICAgLy9VdGlsLkRlYnVnKCI+PiBzZW5kX3N0cmluZzogIiArIHN0cik7Ci0gICAgYXBpLnNlbmQoc3RyLnNwbGl0KCcnKS5tYXAoCi0gICAgICAgIGZ1bmN0aW9uIChjaHIpIHsgcmV0dXJuIGNoci5jaGFyQ29kZUF0KDApOyB9ICkgKTsKLX0KLQotLy8KLS8vIE90aGVyIHB1YmxpYyBmdW5jdGlvbnMKLQotZnVuY3Rpb24gcmVjdl9tZXNzYWdlKGUpIHsKLSAgICAvL1V0aWwuRGVidWcoIj4+IHJlY3ZfbWVzc2FnZTogIiArIGUuZGF0YS5sZW5ndGgpOwotCi0gICAgdHJ5IHsKLSAgICAgICAgZGVjb2RlX21lc3NhZ2UoZS5kYXRhKTsKLSAgICAgICAgaWYgKHJRbGVuKCkgPiAwKSB7Ci0gICAgICAgICAgICBldmVudEhhbmRsZXJzLm1lc3NhZ2UoKTsKLSAgICAgICAgICAgIC8vIENvbXBhY3QgdGhlIHJlY2VpdmUgcXVldWUKLSAgICAgICAgICAgIGlmIChyUS5sZW5ndGggPiByUW1heCkgewotICAgICAgICAgICAgICAgIC8vVXRpbC5EZWJ1ZygiQ29tcGFjdGluZyByZWNlaXZlIHF1ZXVlIik7Ci0gICAgICAgICAgICAgICAgclEgPSByUS5zbGljZShyUWkpOwotICAgICAgICAgICAgICAgIHJRaSA9IDA7CisgICAgICAgIHJRc2xpY2U6IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7CisgICAgICAgICAgICBpZiAoZW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JRLnNsaWNlKHRoaXMuX3JRaSArIHN0YXJ0LCB0aGlzLl9yUWkgKyBlbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fclEuc2xpY2UodGhpcy5fclFpICsgc3RhcnQpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVXRpbC5EZWJ1ZygiSWdub3JpbmcgZW1wdHkgbWVzc2FnZSIpOworICAgICAgICB9LAorCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBtdXN0IHdhaXQgZm9yICdudW0nIGJ5dGVzIChkZWZhdWx0IHRvIEZCVS5ieXRlcykKKyAgICAgICAgLy8gdG8gYmUgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLiBSZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvCisgICAgICAgIC8vIHdhaXQgKGFuZCBwb3NzaWJseSBwcmludCBhIGRlYnVnIG1lc3NhZ2UpLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICAgIHJRd2FpdDogZnVuY3Rpb24gKG1zZywgbnVtLCBnb2JhY2spIHsKKyAgICAgICAgICAgIHZhciByUWxlbiA9IHRoaXMuX3JRLmxlbmd0aCAtIHRoaXMuX3JRaTsgLy8gU2tpcCByUWxlbigpIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgIGlmIChyUWxlbiA8IG51bSkgeworICAgICAgICAgICAgICAgIGlmIChnb2JhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JRaSA8IGdvYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJyUXdhaXQgY2Fubm90IGJhY2t1cCAiICsgZ29iYWNrICsgIiBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JRaSAtPSBnb2JhY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyB0cnVlIG1lYW5zIG5lZWQgbW9yZSBkYXRhCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gU2VuZCBRdWV1ZQorCisgICAgICAgIGZsdXNoOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fd2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50ICE9PSAwKSB7CisgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygiYnVmZmVyZWRBbW91bnQ6ICIgKyB0aGlzLl93ZWJzb2NrZXQuYnVmZmVyZWRBbW91bnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fd2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50IDwgdGhpcy5tYXhCdWZmZXJlZEFtb3VudCkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zUS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5zZW5kKHRoaXMuX2VuY29kZV9tZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9zUSA9IFtdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVdGlsLkluZm8oIkRlbGF5aW5nIHNlbmQsIGJ1ZmZlcmVkQW1vdW50OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5idWZmZXJlZEFtb3VudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChhcnIpIHsKKyAgICAgICAgICAgdGhpcy5fc1EgPSB0aGlzLl9zUS5jb25jYXQoYXJyKTsKKyAgICAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2goKTsKKyAgICAgICAgfSwKKworICAgICAgICBzZW5kX3N0cmluZzogZnVuY3Rpb24gKHN0cikgeworICAgICAgICAgICAgdGhpcy5zZW5kKHN0ci5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hyLmNoYXJDb2RlQXQoMCk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gRXZlbnQgSGFuZGxlcnMKKyAgICAgICAgb246IGZ1bmN0aW9uIChldnQsIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZ0XSA9IGhhbmRsZXI7CisgICAgICAgIH0sCisKKyAgICAgICAgaW5pdDogZnVuY3Rpb24gKHByb3RvY29scywgd3Nfc2NoZW1hKSB7CisgICAgICAgICAgICB0aGlzLl9yUSA9IFtdOworICAgICAgICAgICAgdGhpcy5fclFpID0gMDsKKyAgICAgICAgICAgIHRoaXMuX3NRID0gW107CisgICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQgPSBudWxsOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgZnVsbCB0eXBlZCBhcnJheSBzdXBwb3J0CisgICAgICAgICAgICB2YXIgYnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgoJ1VpbnQ4QXJyYXknIGluIHdpbmRvdykgJiYKKyAgICAgICAgICAgICAgICAgICAgKCdzZXQnIGluIFVpbnQ4QXJyYXkucHJvdG90eXBlKSkgeworICAgICAgICAgICAgICAgIGJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGZ1bGwgYmluYXJ5IHR5cGUgc3VwcG9ydCBpbiBXZWJTb2NrZXRzCisgICAgICAgICAgICAvLyBJbnNwaXJlZCBieToKKyAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy8zNzAKKyAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy93ZWJzb2NrZXRzL2JpbmFyeS5qcworICAgICAgICAgICAgdmFyIHdzYnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGJ0ICYmICgnYmluYXJ5VHlwZScgaW4gV2ViU29ja2V0LnByb3RvdHlwZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgISEobmV3IFdlYlNvY2tldCh3c19zY2hlbWEgKyAnOi8vLicpLmJpbmFyeVR5cGUpKSkgeworICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oIkRldGVjdGVkIGJpbmFyeVR5cGUgc3VwcG9ydCBpbiBXZWJTb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgIHdzYnQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGV4YykgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGZhaWxlZCB0ZXN0IGxvY2FsaG9zdCBjb25uZWN0aW9uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlZmF1bHQgcHJvdG9jb2xzIGlmIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgICAgIGlmICh0eXBlb2YocHJvdG9jb2xzKSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAgICAgICBpZiAod3NidCkgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHMgPSBbJ2JpbmFyeScsICdiYXNlNjQnXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHMgPSAnYmFzZTY0JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghd3NidCkgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbHMgPT09ICdiaW5hcnknKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGJpbmFyeSBzdWItcHJvdG9jb2wgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkJyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihwcm90b2NvbHMpID09PSAnb2JqZWN0JykgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X3Byb3RvY29scyA9IFtdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdG9jb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xzW2ldID09PSAnYmluYXJ5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoJ1NraXBwaW5nIHVuc3VwcG9ydGVkIFdlYlNvY2tldCBiaW5hcnkgc3ViLXByb3RvY29sJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19wcm90b2NvbHMucHVzaChwcm90b2NvbHNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld19wcm90b2NvbHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzID0gbmV3X3Byb3RvY29sczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiT25seSBXZWJTb2NrZXQgYmluYXJ5IHN1Yi1wcm90b2NvbCB3YXMgcmVxdWVzdGVkIGFuZCBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xzOworICAgICAgICB9LAorCisgICAgICAgIG9wZW46IGZ1bmN0aW9uICh1cmksIHByb3RvY29scykgeworICAgICAgICAgICAgdmFyIHdzX3NjaGVtYSA9IHVyaS5tYXRjaCgvXihbYS16XSspOlwvXC8vKVsxXTsKKyAgICAgICAgICAgIHByb3RvY29scyA9IHRoaXMuaW5pdChwcm90b2NvbHMsIHdzX3NjaGVtYSk7CisKKyAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJpLCBwcm90b2NvbHMpOworCisgICAgICAgICAgICBpZiAocHJvdG9jb2xzLmluZGV4T2YoJ2JpbmFyeScpID49IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9yZWN2X21lc3NhZ2UuYmluZCh0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbm9wZW4gPSAoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoJz4+IFdlYlNvY2sub25vcGVuJyk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldC5wcm90b2NvbCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gdGhpcy5fd2Vic29ja2V0LnByb3RvY29sOworICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oIlNlcnZlciBjaG9vc2Ugc3ViLXByb3RvY29sOiAiICsgdGhpcy5fd2Vic29ja2V0LnByb3RvY29sKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gJ2Jhc2U2NCc7CisgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoJ1NlcnZlciBzZWxlY3Qgbm8gc3ViLXByb3RvY29sITogJyArIHRoaXMuX3dlYnNvY2tldC5wcm90b2NvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMub3BlbigpOworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIjw8IFdlYlNvY2sub25vcGVuIik7CisgICAgICAgICAgICB9KS5iaW5kKHRoaXMpOworICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9uY2xvc2UgPSAoZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCI+PiBXZWJTb2NrLm9uY2xvc2UiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLmNsb3NlKGUpOworICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIjw8IFdlYlNvY2sub25jbG9zZSIpOworICAgICAgICAgICAgfSkuYmluZCh0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbmVycm9yID0gKGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygiPj4gV2ViU29jay5vbmVycm9yOiAiICsgZSk7CisgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCI8PCBXZWJTb2NrLm9uZXJyb3I6ICIgKyBlKTsKKyAgICAgICAgICAgIH0pLmJpbmQodGhpcyk7CisgICAgICAgIH0sCisKKyAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl93ZWJzb2NrZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX3dlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLl93ZWJzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpKSB7CisgICAgICAgICAgICAgICAgICAgIFV0aWwuSW5mbygiQ2xvc2luZyBXZWJTb2NrZXQgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuOyB9OworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIC8vIHByaXZhdGUgbWV0aG9kcworICAgICAgICBfZW5jb2RlX21lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09PSAnYmluYXJ5JykgeworICAgICAgICAgICAgICAgIC8vIFB1dCBpbiBhIGJpbmFyeSBhcnJheWJ1ZmZlcgorICAgICAgICAgICAgICAgIHJldHVybiAobmV3IFVpbnQ4QXJyYXkodGhpcy5fc1EpKS5idWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGJhc2U2NCBlbmNvZGUKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LmVuY29kZSh0aGlzLl9zUSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgX2RlY29kZV9tZXNzYWdlOiBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09ICdiaW5hcnknKSB7CisgICAgICAgICAgICAgICAgLy8gcHVzaCBhcnJheWJ1ZmZlciB2YWx1ZXMgb250byB0aGUgZW5kCisgICAgICAgICAgICAgICAgdmFyIHU4ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1OC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUS5wdXNoKHU4W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGJhc2U2NCBkZWNvZGUgYW5kIGNvbmNhdCB0byBlbmQKKyAgICAgICAgICAgICAgICB0aGlzLl9yUSA9IHRoaXMuX3JRLmNvbmNhdChCYXNlNjQuZGVjb2RlKGRhdGEsIDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBfcmVjdl9tZXNzYWdlOiBmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLl9kZWNvZGVfbWVzc2FnZShlLmRhdGEpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnJRbGVuKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMubWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBDb21wYWN0IHRoZSByZWNlaXZlIHF1ZXVlCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yUS5sZW5ndGggPiB0aGlzLl9yUW1heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fclEgPSB0aGlzLl9yUS5zbGljZSh0aGlzLl9yUWkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fclFpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoIklnbm9yaW5nIGVtcHR5IG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChleGMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZXhjZXB0aW9uX3N0ciA9ICIiOworICAgICAgICAgICAgICAgIGlmIChleGMubmFtZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RyICs9ICJcbiAgICBuYW1lOiAiICsgZXhjLm5hbWUgKyAiXG4iOworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RyICs9ICIgICAgbWVzc2FnZTogIiArIGV4Yy5tZXNzYWdlICsgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4Yy5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0ciArPSAiICAgIGRlc2NyaXB0aW9uOiAiICsgZXhjLmRlc2NyaXB0aW9uICsgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4Yy5zdGFjayAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0ciArPSBleGMuc3RhY2s7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbl9zdHIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKCJyZWN2X21lc3NhZ2UsIGNhdWdodCBleGNlcHRpb246ICIgKyBleGNlcHRpb25fc3RyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKCJyZWN2X21lc3NhZ2UsIGNhdWdodCBleGNlcHRpb246ICIgKyBleGMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjLm5hbWUgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuZXJyb3IoZXhjLm5hbWUgKyAiOiAiICsgZXhjLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuZXJyb3IoZXhjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGNhdGNoIChleGMpIHsKLSAgICAgICAgaWYgKHR5cGVvZiBleGMuc3RhY2sgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICBVdGlsLldhcm4oInJlY3ZfbWVzc2FnZSwgY2F1Z2h0IGV4Y2VwdGlvbjogIiArIGV4Yy5zdGFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4Yy5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICAgIFV0aWwuV2FybigicmVjdl9tZXNzYWdlLCBjYXVnaHQgZXhjZXB0aW9uOiAiICsgZXhjLmRlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFV0aWwuV2FybigicmVjdl9tZXNzYWdlLCBjYXVnaHQgZXhjZXB0aW9uOiIgKyBleGMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlb2YgZXhjLm5hbWUgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICBldmVudEhhbmRsZXJzLmVycm9yKGV4Yy5uYW1lICsgIjogIiArIGV4Yy5tZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV2ZW50SGFuZGxlcnMuZXJyb3IoZXhjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL1V0aWwuRGVidWcoIjw8IHJlY3ZfbWVzc2FnZSIpOwotfQotCi0KLS8vIFNldCBldmVudCBoYW5kbGVycwotZnVuY3Rpb24gb24oZXZ0LCBoYW5kbGVyKSB7IAotICAgIGV2ZW50SGFuZGxlcnNbZXZ0XSA9IGhhbmRsZXI7Ci19Ci0KLWZ1bmN0aW9uIGluaXQoKSB7Ci0gICAgclEgICAgICAgICA9IFtdOwotICAgIHJRaSAgICAgICAgPSAwOwotICAgIHNRICAgICAgICAgPSBbXTsKLSAgICB3ZWJzb2NrZXQgID0gbnVsbDsKLX0KLQotZnVuY3Rpb24gb3Blbih1cmkpIHsKLSAgICBpbml0KCk7Ci0KLSAgICBpZiAodGVzdF9tb2RlKSB7Ci0gICAgICAgIHdlYnNvY2tldCA9IHt9OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJpLCAnYmFzZTY0Jyk7Ci0gICAgICAgIC8vIFRPRE86IGZ1dHVyZSBuYXRpdmUgYmluYXJ5IHN1cHBvcnQKLSAgICAgICAgLy93ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVyaSwgWydiaW5hcnknLCAnYmFzZTY0J10pOwotICAgIH0KLQotICAgIHdlYnNvY2tldC5vbm1lc3NhZ2UgPSByZWN2X21lc3NhZ2U7Ci0gICAgd2Vic29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCkgewotICAgICAgICBVdGlsLkRlYnVnKCI+PiBXZWJTb2NrLm9ub3BlbiIpOwotICAgICAgICBpZiAod2Vic29ja2V0LnByb3RvY29sKSB7Ci0gICAgICAgICAgICBVdGlsLkluZm8oIlNlcnZlciBjaG9zZSBzdWItcHJvdG9jb2w6ICIgKyB3ZWJzb2NrZXQucHJvdG9jb2wpOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50SGFuZGxlcnMub3BlbigpOwotICAgICAgICBVdGlsLkRlYnVnKCI8PCBXZWJTb2NrLm9ub3BlbiIpOwogICAgIH07Ci0gICAgd2Vic29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbihlKSB7Ci0gICAgICAgIFV0aWwuRGVidWcoIj4+IFdlYlNvY2sub25jbG9zZSIpOwotICAgICAgICBldmVudEhhbmRsZXJzLmNsb3NlKGUpOwotICAgICAgICBVdGlsLkRlYnVnKCI8PCBXZWJTb2NrLm9uY2xvc2UiKTsKLSAgICB9OwotICAgIHdlYnNvY2tldC5vbmVycm9yID0gZnVuY3Rpb24oZSkgewotICAgICAgICBVdGlsLkRlYnVnKCI+PiBXZWJTb2NrLm9uZXJyb3I6ICIgKyBlKTsKLSAgICAgICAgZXZlbnRIYW5kbGVycy5lcnJvcihlKTsKLSAgICAgICAgVXRpbC5EZWJ1ZygiPDwgV2ViU29jay5vbmVycm9yIik7Ci0gICAgfTsKLX0KLQotZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgaWYgKHdlYnNvY2tldCkgewotICAgICAgICBpZiAoKHdlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikgfHwKLSAgICAgICAgICAgICh3ZWJzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICBVdGlsLkluZm8oIkNsb3NpbmcgV2ViU29ja2V0IGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgIHdlYnNvY2tldC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIHdlYnNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm47IH07Ci0gICAgfQotfQotCi0vLyBPdmVycmlkZSBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHRlc3RpbmcKLS8vIFRha2VzIGEgc2VuZCBmdW5jdGlvbiwgcmV0dXJucyByZWZlcmVuY2UgdG8gcmVjdiBmdW5jdGlvbgotZnVuY3Rpb24gdGVzdE1vZGUob3ZlcnJpZGVfc2VuZCkgewotICAgIHRlc3RfbW9kZSA9IHRydWU7Ci0gICAgYXBpLnNlbmQgPSBvdmVycmlkZV9zZW5kOwotICAgIGFwaS5jbG9zZSA9IGZ1bmN0aW9uICgpIHt9OwotICAgIHJldHVybiByZWN2X21lc3NhZ2U7Ci19Ci0KLWZ1bmN0aW9uIGNvbnN0cnVjdG9yKCkgewotICAgIC8vIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICBhcGkubWF4QnVmZmVyZWRBbW91bnQgPSAyMDA7Ci0KLSAgICAvLyBEaXJlY3QgYWNjZXNzIHRvIHNlbmQgYW5kIHJlY2VpdmUgcXVldWVzCi0gICAgYXBpLmdldF9zUSAgICAgICA9IGdldF9zUTsKLSAgICBhcGkuZ2V0X3JRICAgICAgID0gZ2V0X3JROwotICAgIGFwaS5nZXRfclFpICAgICAgPSBnZXRfclFpOwotICAgIGFwaS5zZXRfclFpICAgICAgPSBzZXRfclFpOwotCi0gICAgLy8gUm91dGluZXMgdG8gcmVhZCBmcm9tIHRoZSByZWNlaXZlIHF1ZXVlCi0gICAgYXBpLnJRbGVuICAgICAgICA9IHJRbGVuOwotICAgIGFwaS5yUXBlZWs4ICAgICAgPSByUXBlZWs4OwotICAgIGFwaS5yUXNoaWZ0OCAgICAgPSByUXNoaWZ0ODsKLSAgICBhcGkuclF1bnNoaWZ0OCAgID0gclF1bnNoaWZ0ODsKLSAgICBhcGkuclFzaGlmdDE2ICAgID0gclFzaGlmdDE2OwotICAgIGFwaS5yUXNoaWZ0MzIgICAgPSByUXNoaWZ0MzI7Ci0gICAgYXBpLnJRc2hpZnRTdHIgICA9IHJRc2hpZnRTdHI7Ci0gICAgYXBpLnJRc2hpZnRCeXRlcyA9IHJRc2hpZnRCeXRlczsKLSAgICBhcGkuclFzbGljZSAgICAgID0gclFzbGljZTsKLSAgICBhcGkuclF3YWl0ICAgICAgID0gclF3YWl0OwotCi0gICAgYXBpLmZsdXNoICAgICAgICA9IGZsdXNoOwotICAgIGFwaS5zZW5kICAgICAgICAgPSBzZW5kOwotICAgIGFwaS5zZW5kX3N0cmluZyAgPSBzZW5kX3N0cmluZzsKLQotICAgIGFwaS5vbiAgICAgICAgICAgPSBvbjsKLSAgICBhcGkuaW5pdCAgICAgICAgID0gaW5pdDsKLSAgICBhcGkub3BlbiAgICAgICAgID0gb3BlbjsKLSAgICBhcGkuY2xvc2UgICAgICAgID0gY2xvc2U7Ci0gICAgYXBpLnRlc3RNb2RlICAgICA9IHRlc3RNb2RlOwotCi0gICAgcmV0dXJuIGFwaTsKLX0KLQotcmV0dXJuIGNvbnN0cnVjdG9yKCk7Ci0KLX0KK30pKCk7CmRpZmYgLS1naXQgYS93ZWJjbGllbnRzL25vdm5jL2luY2x1ZGUvd2VidXRpbC5qcyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJ1dGlsLmpzCmluZGV4IDdhMGEwNzYuLmU2NzRiZjkgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJ1dGlsLmpzCisrKyBiL3dlYmNsaWVudHMvbm92bmMvaW5jbHVkZS93ZWJ1dGlsLmpzCkBAIC0xLDEzICsxLDEzIEBACiAvKgogICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnQKLSAqIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICogTGljZW5zZWQgdW5kZXIgTEdQTC0zIChzZWUgTElDRU5TRS50eHQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBOVFQgY29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dCkKICAqCiAgKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgogICovCiAKLSJ1c2Ugc3RyaWN0IjsKLS8qanNsaW50IGJpdHdpc2U6IGZhbHNlLCB3aGl0ZTogZmFsc2UgKi8KKy8qanNsaW50IGJpdHdpc2U6IGZhbHNlLCB3aGl0ZTogZmFsc2UsIGJyb3dzZXI6IHRydWUsIGRldmVsOiB0cnVlICovCiAvKmdsb2JhbCBVdGlsLCB3aW5kb3csIGRvY3VtZW50ICovCiAKIC8vIEdsb2JhbHMgZGVmaW5lZCBoZXJlCkBAIC0zMCw0MyArMzAsNDcgQEAKIH0KIAogCi0vKiAKKy8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE5hbWVzcGFjZWQgaW4gV2ViVXRpbAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAogLy8gaW5pdCBsb2cgbGV2ZWwgcmVhZGluZyB0aGUgbG9nZ2luZyBIVFRQIHBhcmFtCi1XZWJVdGlsLmluaXRfbG9nZ2luZyA9IGZ1bmN0aW9uKCkgewotICAgIFV0aWwuX2xvZ19sZXZlbCA9IChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLm1hdGNoKAotICAgICAgICAgL2xvZ2dpbmc9KFtBLVphLXowLTlcLl9cLV0qKS8pIHx8Ci0gICAgICAgICBbJycsIFV0aWwuX2xvZ19sZXZlbF0pWzFdOwotICAgIAorV2ViVXRpbC5pbml0X2xvZ2dpbmcgPSBmdW5jdGlvbiAobGV2ZWwpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgaWYgKHR5cGVvZiBsZXZlbCAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgVXRpbC5fbG9nX2xldmVsID0gbGV2ZWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHBhcmFtID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5tYXRjaCgvbG9nZ2luZz0oW0EtWmEtejAtOVwuX1wtXSopLyk7CisgICAgICAgIFV0aWwuX2xvZ19sZXZlbCA9IChwYXJhbSB8fCBbJycsIFV0aWwuX2xvZ19sZXZlbF0pWzFdOworICAgIH0KICAgICBVdGlsLmluaXRfbG9nZ2luZygpOwogfTsKLVdlYlV0aWwuaW5pdF9sb2dnaW5nKCk7CiAKIAogV2ViVXRpbC5kaXJPYmogPSBmdW5jdGlvbiAob2JqLCBkZXB0aCwgcGFyZW50KSB7Ci0gICAgdmFyIGksIG1zZyA9ICIiLCB2YWwgPSAiIjsKLSAgICBpZiAoISBkZXB0aCkgeyBkZXB0aD0yOyB9Ci0gICAgaWYgKCEgcGFyZW50KSB7IHBhcmVudD0gIiI7IH0KKyAgICAidXNlIHN0cmljdCI7CisgICAgaWYgKCEgZGVwdGgpIHsgZGVwdGggPSAyOyB9CisgICAgaWYgKCEgcGFyZW50KSB7IHBhcmVudCA9ICIiOyB9CiAKLSAgICAvLyBQcmludCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGFzc2VkLWluIG9iamVjdCAKLSAgICBmb3IgKGkgaW4gb2JqKSB7Ci0gICAgICAgIGlmICgoZGVwdGggPiAxKSAmJiAodHlwZW9mIG9ialtpXSA9PT0gIm9iamVjdCIpKSB7IAorICAgIC8vIFByaW50IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwYXNzZWQtaW4gb2JqZWN0CisgICAgdmFyIG1zZyA9ICIiOworICAgIGZvciAodmFyIGkgaW4gb2JqKSB7CisgICAgICAgIGlmICgoZGVwdGggPiAxKSAmJiAodHlwZW9mIG9ialtpXSA9PT0gIm9iamVjdCIpKSB7CiAgICAgICAgICAgICAvLyBSZWN1cnNlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgb2JqZWN0cwotICAgICAgICAgICAgbXNnICs9IFdlYlV0aWwuZGlyT2JqKG9ialtpXSwgZGVwdGgtMSwgcGFyZW50ICsgIi4iICsgaSk7CisgICAgICAgICAgICBtc2cgKz0gV2ViVXRpbC5kaXJPYmoob2JqW2ldLCBkZXB0aCAtIDEsIHBhcmVudCArICIuIiArIGkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy92YWwgPSBuZXcgU3RyaW5nKG9ialtpXSkucmVwbGFjZSgiXG4iLCAiICIpOworICAgICAgICAgICAgdmFyIHZhbCA9ICIiOwogICAgICAgICAgICAgaWYgKHR5cGVvZihvYmpbaV0pID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgIHZhbCA9ICJ1bmRlZmluZWQiOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB2YWwgPSBvYmpbaV0udG9TdHJpbmcoKS5yZXBsYWNlKCJcbiIsICIgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDMwKSB7Ci0gICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cigwLDMwKSArICIuLi4iOwotICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyKDAsIDMwKSArICIuLi4iOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbXNnICs9IHBhcmVudCArICIuIiArIGkgKyAiOiAiICsgdmFsICsgIlxuIjsKICAgICAgICAgfQogICAgIH0KQEAgLTc0LDEwICs3OCwxNiBAQAogfTsKIAogLy8gUmVhZCBhIHF1ZXJ5IHN0cmluZyB2YXJpYWJsZQotV2ViVXRpbC5nZXRRdWVyeVZhciA9IGZ1bmN0aW9uKG5hbWUsIGRlZlZhbCkgewotICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1s/XVteI10qJyArIG5hbWUgKyAnPShbXiYjXSopJyk7CitXZWJVdGlsLmdldFF1ZXJ5VmFyID0gZnVuY3Rpb24gKG5hbWUsIGRlZlZhbCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCcuKls/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSwKKyAgICAgICAgbWF0Y2ggPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLm1hdGNoKHJlKTsKICAgICBpZiAodHlwZW9mIGRlZlZhbCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVmVmFsID0gbnVsbDsgfQotICAgIHJldHVybiAoZG9jdW1lbnQubG9jYXRpb24uaHJlZi5tYXRjaChyZSkgfHwgWycnLGRlZlZhbF0pWzFdOworICAgIGlmIChtYXRjaCkgeworICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGVmVmFsOworICAgIH0KIH07CiAKIApAQCAtODYsMzkgKzk2LDExOCBAQAogICovCiAKIC8vIE5vIGRheXMgbWVhbnMgb25seSBmb3IgdGhpcyBicm93c2VyIHNlc3Npb24KLVdlYlV0aWwuY3JlYXRlQ29va2llID0gZnVuY3Rpb24obmFtZSx2YWx1ZSxkYXlzKSB7CitXZWJVdGlsLmNyZWF0ZUNvb2tpZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgZGF5cykgeworICAgICJ1c2Ugc3RyaWN0IjsKICAgICB2YXIgZGF0ZSwgZXhwaXJlczsKICAgICBpZiAoZGF5cykgewogICAgICAgICBkYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKyhkYXlzKjI0KjYwKjYwKjEwMDApKTsKLSAgICAgICAgZXhwaXJlcyA9ICI7IGV4cGlyZXM9IitkYXRlLnRvR01UU3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTsKKyAgICAgICAgZXhwaXJlcyA9ICI7IGV4cGlyZXM9IiArIGRhdGUudG9HTVRTdHJpbmcoKTsKKyAgICB9IGVsc2UgewogICAgICAgICBleHBpcmVzID0gIiI7CiAgICAgfQotICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUrIj0iK3ZhbHVlK2V4cGlyZXMrIjsgcGF0aD0vIjsKKworICAgIHZhciBzZWN1cmU7CisgICAgaWYgKGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sID09PSAiaHR0cHM6IikgeworICAgICAgICBzZWN1cmUgPSAiOyBzZWN1cmUiOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlY3VyZSA9ICIiOworICAgIH0KKyAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgIj0iICsgdmFsdWUgKyBleHBpcmVzICsgIjsgcGF0aD0vIiArIHNlY3VyZTsKIH07CiAKLVdlYlV0aWwucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAgIHZhciBpLCBjLCBuYW1lRVEgPSBuYW1lICsgIj0iLCBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwotICAgIGZvcihpPTA7IGkgPCBjYS5sZW5ndGg7IGkgKz0gMSkgewotICAgICAgICBjID0gY2FbaV07Ci0gICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSB7IGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsgfQotICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT09IDApIHsgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsYy5sZW5ndGgpOyB9CitXZWJVdGlsLnJlYWRDb29raWUgPSBmdW5jdGlvbiAobmFtZSwgZGVmYXVsdFZhbHVlKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iLAorICAgICAgICBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkgKz0gMSkgeworICAgICAgICB2YXIgYyA9IGNhW2ldOworICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykgeyBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpOyB9CisgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCwgYy5sZW5ndGgpOyB9CiAgICAgfQogICAgIHJldHVybiAodHlwZW9mIGRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpID8gZGVmYXVsdFZhbHVlIDogbnVsbDsKIH07CiAKLVdlYlV0aWwuZXJhc2VDb29raWUgPSBmdW5jdGlvbihuYW1lKSB7Ci0gICAgV2ViVXRpbC5jcmVhdGVDb29raWUobmFtZSwiIiwtMSk7CitXZWJVdGlsLmVyYXNlQ29va2llID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgV2ViVXRpbC5jcmVhdGVDb29raWUobmFtZSwgIiIsIC0xKTsKK307CisKKy8qCisgKiBTZXR0aW5nIGhhbmRsaW5nLgorICovCisKK1dlYlV0aWwuaW5pdFNldHRpbmdzID0gZnVuY3Rpb24gKGNhbGxiYWNrIC8qLCAuLi5jYWxsYmFja0FyZ3MgKi8pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGNhbGxiYWNrQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgaWYgKHdpbmRvdy5jaHJvbWUgJiYgd2luZG93LmNocm9tZS5zdG9yYWdlKSB7CisgICAgICAgIHdpbmRvdy5jaHJvbWUuc3RvcmFnZS5zeW5jLmdldChmdW5jdGlvbiAoY2ZnKSB7CisgICAgICAgICAgICBXZWJVdGlsLnNldHRpbmdzID0gY2ZnOworICAgICAgICAgICAgY29uc29sZS5sb2coV2ViVXRpbC5zZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBjYWxsYmFja0FyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOby1vcAorICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBObyBkYXlzIG1lYW5zIG9ubHkgZm9yIHRoaXMgYnJvd3NlciBzZXNzaW9uCitXZWJVdGlsLndyaXRlU2V0dGluZyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICBpZiAod2luZG93LmNocm9tZSAmJiB3aW5kb3cuY2hyb21lLnN0b3JhZ2UpIHsKKyAgICAgICAgLy9jb25zb2xlLmxvZygid3JpdGVTZXR0aW5nOiIsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgaWYgKFdlYlV0aWwuc2V0dGluZ3NbbmFtZV0gIT09IHZhbHVlKSB7CisgICAgICAgICAgICBXZWJVdGlsLnNldHRpbmdzW25hbWVdID0gdmFsdWU7CisgICAgICAgICAgICB3aW5kb3cuY2hyb21lLnN0b3JhZ2Uuc3luYy5zZXQoV2ViVXRpbC5zZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZSk7CisgICAgfQorfTsKKworV2ViVXRpbC5yZWFkU2V0dGluZyA9IGZ1bmN0aW9uIChuYW1lLCBkZWZhdWx0VmFsdWUpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIHZhbHVlOworICAgIGlmICh3aW5kb3cuY2hyb21lICYmIHdpbmRvdy5jaHJvbWUuc3RvcmFnZSkgeworICAgICAgICB2YWx1ZSA9IFdlYlV0aWwuc2V0dGluZ3NbbmFtZV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTsKKyAgICB9CisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgIH0KKyAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK307CisKK1dlYlV0aWwuZXJhc2VTZXR0aW5nID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgaWYgKHdpbmRvdy5jaHJvbWUgJiYgd2luZG93LmNocm9tZS5zdG9yYWdlKSB7CisgICAgICAgIHdpbmRvdy5jaHJvbWUuc3RvcmFnZS5zeW5jLnJlbW92ZShuYW1lKTsKKyAgICAgICAgZGVsZXRlIFdlYlV0aWwuc2V0dGluZ3NbbmFtZV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7CisgICAgfQogfTsKIAogLyoKICAqIEFsdGVybmF0ZSBzdHlsZXNoZWV0IHNlbGVjdGlvbgogICovCi1XZWJVdGlsLmdldFN0eWxlc2hlZXRzID0gZnVuY3Rpb24oKSB7IHZhciBpLCBsaW5rcywgc2hlZXRzID0gW107Ci0gICAgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkgKz0gMSkgeworV2ViVXRpbC5nZXRTdHlsZXNoZWV0cyA9IGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKKyAgICB2YXIgc2hlZXRzID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgIGlmIChsaW5rc1tpXS50aXRsZSAmJgogICAgICAgICAgICAgbGlua3NbaV0ucmVsLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiU1RZTEVTSEVFVCIpID4gLTEpIHsKICAgICAgICAgICAgIHNoZWV0cy5wdXNoKGxpbmtzW2ldKTsKQEAgLTEyOSwxNCArMjE4LDE2IEBACiAKIC8vIE5vIHNoZWV0IG1lYW5zIHRyeSBhbmQgdXNlIHZhbHVlIGZyb20gY29va2llLCBudWxsIHNoZWV0IHVzZWQgdG8KIC8vIGNsZWFyIGFsbCBhbHRlcm5hdGVzLgotV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0ID0gZnVuY3Rpb24oc2hlZXQpIHsKLSAgICB2YXIgaSwgbGluaywgc2hlZXRzID0gV2ViVXRpbC5nZXRTdHlsZXNoZWV0cygpOworV2ViVXRpbC5zZWxlY3RTdHlsZXNoZWV0ID0gZnVuY3Rpb24gKHNoZWV0KSB7CisgICAgInVzZSBzdHJpY3QiOwogICAgIGlmICh0eXBlb2Ygc2hlZXQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgIHNoZWV0ID0gJ2RlZmF1bHQnOwogICAgIH0KLSAgICBmb3IgKGk9MDsgaSA8IHNoZWV0cy5sZW5ndGg7IGkgKz0gMSkgewotICAgICAgICBsaW5rID0gc2hlZXRzW2ldOwotICAgICAgICBpZiAobGluay50aXRsZSA9PT0gc2hlZXQpIHsgICAgCisKKyAgICB2YXIgc2hlZXRzID0gV2ViVXRpbC5nZXRTdHlsZXNoZWV0cygpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hlZXRzLmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgIHZhciBsaW5rID0gc2hlZXRzW2ldOworICAgICAgICBpZiAobGluay50aXRsZSA9PT0gc2hlZXQpIHsKICAgICAgICAgICAgIFV0aWwuRGVidWcoIlVzaW5nIHN0eWxlc2hlZXQgIiArIHNoZWV0KTsKICAgICAgICAgICAgIGxpbmsuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3dlYmNsaWVudHMvbm92bmMvdm5jLmh0bWwgYi93ZWJjbGllbnRzL25vdm5jL3ZuYy5odG1sCmluZGV4IGI2Y2Y4NWIuLmFkYjAxNTcgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvdm5jLmh0bWwKKysrIGIvd2ViY2xpZW50cy9ub3ZuYy92bmMuaHRtbApAQCAtMSwxMSArMSwxNiBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjEvL0VOIiAiaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvRFREL3hodG1sLW1vYmlsZTExLmR0ZCI+Cis8IURPQ1RZUEUgaHRtbD4KIDxodG1sPgogPGhlYWQ+CiAKLSAgIDwhLS0KKyAgICA8IS0tCiAgICAgbm9WTkMgZXhhbXBsZTogc2ltcGxlIGV4YW1wbGUgdXNpbmcgZGVmYXVsdCBVSQotICAgIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICAgIExpY2Vuc2VkIHVuZGVyIExHUEwtMyAoc2VlIExJQ0VOU0UudHh0KQorICAgIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpbgorICAgIENvcHlyaWdodCAoQykgMjAxMyBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQgorICAgIG5vVk5DIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpCisgICAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSAyLUNsYXVzZSBCU0QgbGljZW5zZSAoc2VlIExJQ0VOU0UudHh0KS4KKworICAgIENvbm5lY3QgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQgaW4gcXVlcnkgc3RyaW5nOgorICAgICAgICBodHRwOi8vZXhhbXBsZS5jb20vP2hvc3Q9SE9TVCZwb3J0PVBPUlQmZW5jcnlwdD0xJnRydWVfY29sb3I9MQogICAgIC0tPgogICAgIDx0aXRsZT5ub1ZOQzwvdGl0bGU+CiAKQEAgLTE4LDcgKzIzLDcgQEAKICAgICA8IS0tIEFwcGxlIGlPUyBTYWZhcmkgc2V0dGluZ3MgLS0+CiAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPW5vIj4KICAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiIC8+Ci0gICAgPG1ldGEgbmFtZXM9ImFwcGxlLW1vYmlsZS13ZWItYXBwLXN0YXR1cy1iYXItc3R5bGUiIGNvbnRlbnQ9ImJsYWNrLXRyYW5zbHVjZW50IiAvPgorICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLXN0YXR1cy1iYXItc3R5bGUiIGNvbnRlbnQ9ImJsYWNrLXRyYW5zbHVjZW50IiAvPgogICAgIDwhLS0gQXBwIFN0YXJ0IEljb24gIC0tPgogICAgIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtc3RhcnR1cC1pbWFnZSIgaHJlZj0iaW1hZ2VzL3NjcmVlbl8zMjB4NDYwLnBuZyIgLz4KICAgICA8IS0tIEZvciBpT1MgZGV2aWNlcyBzZXQgdGhlIGljb24gdG8gdXNlIGlmIHVzZXIgYm9va21hcmtzIGFwcCBvbiB0aGVpciBob21lc2NyZWVuIC0tPgpAQCAtMzgsNzAgKzQzLDc3IEBACiAgICAgICAgIHNyYz0naHR0cDovL2dldGZpcmVidWcuY29tL3JlbGVhc2VzL2xpdGUvMS4yL2ZpcmVidWctbGl0ZS1jb21wcmVzc2VkLmpzJz48L3NjcmlwdD4KICAgICAtLT4KIAotICAgIDxzY3JpcHQgc3JjPSJpbmNsdWRlL3ZuYy5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9ImluY2x1ZGUvdWkuanMiPjwvc2NyaXB0PgotCiA8L2hlYWQ+CiAKIDxib2R5PgogICAgIDxkaXYgaWQ9Im5vVk5DLWNvbnRyb2wtYmFyIj4KICAgICAgICAgPCEtLW5vVk5DIE1vYmlsZSBEZXZpY2Ugb25seSBCdXR0b25zLS0+CiAgICAgICAgIDxkaXYgY2xhc3M9Im5vVk5DLWJ1dHRvbnMtbGVmdCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaW1hZ2VzL2RyYWcucG5nIgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9InZpZXdwb3J0IGRyYWciIHNyYz0iaW1hZ2VzL2RyYWcucG5nIgogICAgICAgICAgICAgICAgIGlkPSJub1ZOQ192aWV3X2RyYWdfYnV0dG9uIiBjbGFzcz0ibm9WTkNfc3RhdHVzX2J1dHRvbiIKLSAgICAgICAgICAgICAgICB0aXRsZT0iTW92ZS9EcmFnIFZpZXdwb3J0IgotICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLnNldFZpZXdEcmFnKCk7Ij4KKyAgICAgICAgICAgICAgICB0aXRsZT0iTW92ZS9EcmFnIFZpZXdwb3J0Ij4KICAgICAgICAgICAgIDxkaXYgaWQ9Im5vVk5DX21vYmlsZV9idXR0b25zIj4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaW1hZ2VzL21vdXNlX25vbmUucG5nIgotICAgICAgICAgICAgICAgICAgICBpZD0ibm9WTkNfbW91c2VfYnV0dG9uMCIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iCi0gICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLnNldE1vdXNlQnV0dG9uKDEpOyI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9ImltYWdlcy9tb3VzZV9sZWZ0LnBuZyIKLSAgICAgICAgICAgICAgICAgICAgaWQ9Im5vVk5DX21vdXNlX2J1dHRvbjEiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgotICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJVSS5zZXRNb3VzZUJ1dHRvbigyKTsiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJpbWFnZXMvbW91c2VfbWlkZGxlLnBuZyIKLSAgICAgICAgICAgICAgICAgICAgaWQ9Im5vVk5DX21vdXNlX2J1dHRvbjIiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgotICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJVSS5zZXRNb3VzZUJ1dHRvbig0KTsiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJpbWFnZXMvbW91c2VfcmlnaHQucG5nIgotICAgICAgICAgICAgICAgICAgICBpZD0ibm9WTkNfbW91c2VfYnV0dG9uNCIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iCi0gICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLnNldE1vdXNlQnV0dG9uKDApOyI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9ImltYWdlcy9rZXlib2FyZC5wbmciCisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9Ik5vIG1vdXNlYnV0dG9uIiBzcmM9ImltYWdlcy9tb3VzZV9ub25lLnBuZyIKKyAgICAgICAgICAgICAgICAgICAgaWQ9Im5vVk5DX21vdXNlX2J1dHRvbjAiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iTGVmdCBtb3VzZWJ1dHRvbiIgc3JjPSJpbWFnZXMvbW91c2VfbGVmdC5wbmciCisgICAgICAgICAgICAgICAgICAgIGlkPSJub1ZOQ19tb3VzZV9idXR0b24xIiBjbGFzcz0ibm9WTkNfc3RhdHVzX2J1dHRvbiI+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9Ik1pZGRsZSBtb3VzZWJ1dHRvbiIgc3JjPSJpbWFnZXMvbW91c2VfbWlkZGxlLnBuZyIKKyAgICAgICAgICAgICAgICAgICAgaWQ9Im5vVk5DX21vdXNlX2J1dHRvbjIiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iUmlnaHQgbW91c2VidXR0b24iIHNyYz0iaW1hZ2VzL21vdXNlX3JpZ2h0LnBuZyIKKyAgICAgICAgICAgICAgICAgICAgaWQ9Im5vVk5DX21vdXNlX2J1dHRvbjQiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iS2V5Ym9hcmQiIHNyYz0iaW1hZ2VzL2tleWJvYXJkLnBuZyIKICAgICAgICAgICAgICAgICAgICAgaWQ9InNob3dLZXlib2FyZCIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJLZXlib2FyZCIgdGl0bGU9IlNob3cgS2V5Ym9hcmQiCi0gICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLnNob3dLZXlib2FyZCgpIi8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImVtYWlsIgotICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT0ib2ZmIiBhdXRvY29ycmVjdD0ib2ZmIgotICAgICAgICAgICAgICAgICAgICBpZD0ia2V5Ym9hcmRpbnB1dCIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iCi0gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj0ib25LZXlEb3duKGV2ZW50KTsiIG9uYmx1cj0iVUkua2V5SW5wdXRCbHVyKCk7Ii8+CisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJLZXlib2FyZCIgdGl0bGU9IlNob3cgS2V5Ym9hcmQiLz4KKyAgICAgICAgICAgICAgICA8IS0tIE5vdGUgdGhhdCBHb29nbGUgQ2hyb21lIG9uIEFuZHJvaWQgZG9lc24ndCByZXNwZWN0IGFueSBvZiB0aGVzZSwKKyAgICAgICAgICAgICAgICAgICAgIGh0bWwgYXR0cmlidXRlcyB3aGljaCBhdHRlbXB0IHRvIGRpc2FibGUgdGV4dCBzdWdnZXN0aW9ucyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIG9uLXNjcmVlbiBrZXlib2FyZC4gTGV0J3MgaG9wZSBDaHJvbWUgaW1wbGVtZW50cyB0aGUgaW1lLW1vZGUKKyAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGZvciBleGFtcGxlIC0tPgorICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0ia2V5Ym9hcmRpbnB1dCIgYXV0b2NhcGl0YWxpemU9Im9mZiIKKyAgICAgICAgICAgICAgICAgICAgYXV0b2NvcnJlY3Q9Im9mZiIgYXV0b2NvbXBsZXRlPSJvZmYiIHNwZWxsY2hlY2s9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgICBtb3phY3Rpb25oaW50PSJFbnRlciIgb25zdWJtaXQ9InJldHVybiBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJpbWUtbW9kZTogZGlzYWJsZWQ7Ij48L3RleHRhcmVhPgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im5vVk5DX2V4dHJhX2tleXMiPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iRXh0cmEga2V5cyIgc3JjPSJpbWFnZXMvc2hvd2V4dHJha2V5cy5wbmciCisgICAgICAgICAgICAgICAgICAgICAgICBpZD0ic2hvd0V4dHJhS2V5c0J1dHRvbiIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iQ3RybCIgc3JjPSJpbWFnZXMvY3RybC5wbmciCisgICAgICAgICAgICAgICAgICAgICAgICBpZD0idG9nZ2xlQ3RybEJ1dHRvbiIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iQWx0IiBzcmM9ImltYWdlcy9hbHQucG5nIgorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InRvZ2dsZUFsdEJ1dHRvbiIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iVGFiIiBzcmM9ImltYWdlcy90YWIucG5nIgorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InNlbmRUYWJCdXR0b24iIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9IkVzYyIgc3JjPSJpbWFnZXMvZXNjLnBuZyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJzZW5kRXNjQnV0dG9uIiBjbGFzcz0ibm9WTkNfc3RhdHVzX2J1dHRvbiI+CisgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+CiAKKyAgICAgICAgPGRpdiBpZD0ibm9WTkNfc3RhdHVzIj5Mb2FkaW5nPC9kaXY+CisKICAgICAgICAgPCEtLW5vVk5DIEJ1dHRvbnMtLT4KICAgICAgICAgPGRpdiBjbGFzcz0ibm9WTkMtYnV0dG9ucy1yaWdodCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaW1hZ2VzL2N0cmxhbHRkZWwucG5nIgotICAgICAgICAgICAgICAgICBpZD0ic2VuZEN0cmxBbHREZWxCdXR0b24iIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgotICAgICAgICAgICAgICAgIHRpdGxlPSJTZW5kIEN0cmwtQWx0LURlbCIKLSAgICAgICAgICAgICAgICBvbmNsaWNrPSJVSS5zZW5kQ3RybEFsdERlbCgpOyIgLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJpbWFnZXMvY2xpcGJvYXJkLnBuZyIKKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgYWx0PSJDdHJsK0FsdCtEZWwiIHNyYz0iaW1hZ2VzL2N0cmxhbHRkZWwucG5nIgorICAgICAgICAgICAgICAgIGlkPSJzZW5kQ3RybEFsdERlbEJ1dHRvbiIgY2xhc3M9Im5vVk5DX3N0YXR1c19idXR0b24iCisgICAgICAgICAgICAgICAgdGl0bGU9IlNlbmQgQ3RybC1BbHQtRGVsIiAvPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9IlNodXRkb3duL1JlYm9vdCIgc3JjPSJpbWFnZXMvcG93ZXIucG5nIgorICAgICAgICAgICAgICAgIGlkPSJ4dnBCdXR0b24iIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgorICAgICAgICAgICAgICAgIHRpdGxlPSJTaHV0ZG93bi9SZWJvb3QuLi4iIC8+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iQ2xpcGJvYXJkIiBzcmM9ImltYWdlcy9jbGlwYm9hcmQucG5nIgogICAgICAgICAgICAgICAgIGlkPSJjbGlwYm9hcmRCdXR0b24iIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgotICAgICAgICAgICAgICAgIHRpdGxlPSJDbGlwYm9hcmQiCi0gICAgICAgICAgICAgICAgb25jbGljaz0iVUkudG9nZ2xlQ2xpcGJvYXJkUGFuZWwoKTsiIC8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaW1hZ2VzL3NldHRpbmdzLnBuZyIKKyAgICAgICAgICAgICAgICB0aXRsZT0iQ2xpcGJvYXJkIiAvPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9IlNldHRpbmdzIiBzcmM9ImltYWdlcy9zZXR0aW5ncy5wbmciCiAgICAgICAgICAgICAgICAgaWQ9InNldHRpbmdzQnV0dG9uIiBjbGFzcz0ibm9WTkNfc3RhdHVzX2J1dHRvbiIKLSAgICAgICAgICAgICAgICB0aXRsZT0iU2V0dGluZ3MiCi0gICAgICAgICAgICAgICAgb25jbGljaz0iVUkudG9nZ2xlU2V0dGluZ3NQYW5lbCgpOyIgLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJpbWFnZXMvY29ubmVjdC5wbmciCisgICAgICAgICAgICAgICAgdGl0bGU9IlNldHRpbmdzIiAvPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImltYWdlIiBhbHQ9IkNvbm5lY3QiIHNyYz0iaW1hZ2VzL2Nvbm5lY3QucG5nIgogICAgICAgICAgICAgICAgIGlkPSJjb25uZWN0QnV0dG9uIiBjbGFzcz0ibm9WTkNfc3RhdHVzX2J1dHRvbiIKLSAgICAgICAgICAgICAgICB0aXRsZT0iQ29ubmVjdCIKLSAgICAgICAgICAgICAgICBvbmNsaWNrPSJVSS50b2dnbGVDb25uZWN0UGFuZWwoKSIgLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJpbWFnZXMvZGlzY29ubmVjdC5wbmciCisgICAgICAgICAgICAgICAgdGl0bGU9IkNvbm5lY3QiIC8+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaW1hZ2UiIGFsdD0iRGlzY29ubmVjdCIgc3JjPSJpbWFnZXMvZGlzY29ubmVjdC5wbmciCiAgICAgICAgICAgICAgICAgaWQ9ImRpc2Nvbm5lY3RCdXR0b24iIGNsYXNzPSJub1ZOQ19zdGF0dXNfYnV0dG9uIgotICAgICAgICAgICAgICAgIHRpdGxlPSJEaXNjb25uZWN0IgotICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLmRpc2Nvbm5lY3QoKSIgLz4KKyAgICAgICAgICAgICAgICB0aXRsZT0iRGlzY29ubmVjdCIgLz4KICAgICAgICAgPC9kaXY+CiAKICAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiBQYW5lbCAtLT4KICAgICAgICAgPCEtLSBTaG93biBieSBkZWZhdWx0IHdoZW4gaG9zdGVkIGF0IGZvciBrYW5ha2EuZ2l0aHViLmNvbSAtLT4KLSAgICAgICAgPGRpdiBpZD0ibm9WTkNfZGVzY3JpcHRpb24iIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBjbGFzcz0iIj4KKyAgICAgICAgPGRpdiBpZD0ibm9WTkNfZGVzY3JpcHRpb24iIGNsYXNzPSIiPgogICAgICAgICAgICAgbm9WTkMgaXMgYSBicm93c2VyIGJhc2VkIFZOQyBjbGllbnQgaW1wbGVtZW50ZWQgdXNpbmcgSFRNTDUgQ2FudmFzCiAgICAgICAgICAgICBhbmQgV2ViU29ja2V0cy4gWW91IHdpbGwgZWl0aGVyIG5lZWQgYSBWTkMgc2VydmVyIHdpdGggV2ViU29ja2V0cwogICAgICAgICAgICAgc3VwcG9ydCAoc3VjaCBhcyA8YSBocmVmPSJodHRwOi8vbGlidm5jc2VydmVyLnNvdXJjZWZvcmdlLm5ldC8iPmxpYnZuY3NlcnZlcjwvYT4pCkBAIC0xMTIsMjUgKzEyNCwzNCBAQAogICAgICAgICAgICAgYW5kIDxhIGhyZWY9Imh0dHA6Ly9rYW5ha2EuZ2l0aHViLmNvbS9ub1ZOQyI+d2Vic2l0ZTwvYT4KICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgPGJyIC8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQ2xvc2UiCi0gICAgICAgICAgICAgICAgb25jbGljaz0iVUkudG9nZ2xlQ29ubmVjdFBhbmVsKCk7Ij4KKyAgICAgICAgICAgIDxpbnB1dCBpZD0iZGVzY3JpcHRpb25CdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNsb3NlIj4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPCEtLSBQb3B1cCBTdGF0dXMgUGFuZWwgLS0+CisgICAgICAgIDxkaXYgaWQ9Im5vVk5DX3BvcHVwX3N0YXR1c19wYW5lbCIgY2xhc3M9IiI+CiAgICAgICAgIDwvZGl2PgogCiAgICAgICAgIDwhLS0gQ2xpcGJvYXJkIFBhbmVsIC0tPgogICAgICAgICA8ZGl2IGlkPSJub1ZOQ19jbGlwYm9hcmQiIGNsYXNzPSJ0cmlhbmdsZS1yaWdodCB0b3AiPgotICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJub1ZOQ19jbGlwYm9hcmRfdGV4dCIgcm93cz01Ci0gICAgICAgICAgICAgICAgb25mb2N1cz0iVUkuZGlzcGxheUJsdXIoKTsiIG9uYmx1cj0iVUkuZGlzcGxheUZvY3VzKCk7IgotICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJVSS5jbGlwU2VuZCgpOyI+CisgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9Im5vVk5DX2NsaXBib2FyZF90ZXh0IiByb3dzPTU+CiAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5vVk5DX2NsaXBib2FyZF9jbGVhcl9idXR0b24iIHR5cGU9ImJ1dHRvbiIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iQ2xlYXIiIG9uY2xpY2s9IlVJLmNsaXBDbGVhcigpOyI+CisgICAgICAgICAgICAgICAgdmFsdWU9IkNsZWFyIj4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPCEtLSBYVlAgU2h1dGRvd24vUmVib290IFBhbmVsIC0tPgorICAgICAgICA8ZGl2IGlkPSJub1ZOQ194dnAiIGNsYXNzPSJ0cmlhbmdsZS1yaWdodCB0b3AiPgorICAgICAgICAgICAgPHNwYW4gaWQ9Im5vVk5DX3h2cF9tZW51Ij4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0ieHZwU2h1dGRvd25CdXR0b24iIHZhbHVlPSJTaHV0ZG93biIgLz4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0ieHZwUmVib290QnV0dG9uIiB2YWx1ZT0iUmVib290IiAvPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJ4dnBSZXNldEJ1dHRvbiIgdmFsdWU9IlJlc2V0IiAvPgorICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICA8L2Rpdj4KIAogICAgICAgICA8IS0tIFNldHRpbmdzIFBhbmVsIC0tPgogICAgICAgICA8ZGl2IGlkPSJub1ZOQ19zZXR0aW5ncyIgY2xhc3M9InRyaWFuZ2xlLXJpZ2h0IHRvcCI+Ci0gICAgICAgICAgICA8c3BhbiBpZD0ibm9WTkNfc2V0dGluZ3NfbWVudSIgb25tb3VzZW92ZXI9IlVJLmRpc3BsYXlCbHVyKCk7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubW91c2VvdXQ9IlVJLmRpc3BsYXlGb2N1cygpOyI+CisgICAgICAgICAgICA8c3BhbiBpZD0ibm9WTkNfc2V0dGluZ3NfbWVudSI+CiAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICA8bGk+PGlucHV0IGlkPSJub1ZOQ19lbmNyeXB0IiB0eXBlPSJjaGVja2JveCI+IEVuY3J5cHQ8L2xpPgogICAgICAgICAgICAgICAgICAgICA8bGk+PGlucHV0IGlkPSJub1ZOQ190cnVlX2NvbG9yIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD4gVHJ1ZSBDb2xvcjwvbGk+CkBAIC0xMzgsOCArMTU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgPGxpPjxpbnB1dCBpZD0ibm9WTkNfY2xpcCIgdHlwZT0iY2hlY2tib3giPiBDbGlwIHRvIFdpbmRvdzwvbGk+CiAgICAgICAgICAgICAgICAgICAgIDxsaT48aW5wdXQgaWQ9Im5vVk5DX3NoYXJlZCIgdHlwZT0iY2hlY2tib3giPiBTaGFyZWQgTW9kZTwvbGk+CiAgICAgICAgICAgICAgICAgICAgIDxsaT48aW5wdXQgaWQ9Im5vVk5DX3ZpZXdfb25seSIgdHlwZT0iY2hlY2tib3giPiBWaWV3IE9ubHk8L2xpPgotICAgICAgICAgICAgICAgICAgICA8bGk+PGlucHV0IGlkPSJub1ZOQ19jb25uZWN0VGltZW91dCIgdHlwZT0iaW5wdXQiPiBDb25uZWN0IFRpbWVvdXQgKHMpPC9saT4KICAgICAgICAgICAgICAgICAgICAgPGxpPjxpbnB1dCBpZD0ibm9WTkNfcGF0aCIgdHlwZT0iaW5wdXQiIHZhbHVlPSJ3ZWJzb2NraWZ5Ij4gUGF0aDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDxsaT48aW5wdXQgaWQ9Im5vVk5DX3JlcGVhdGVySUQiIHR5cGU9ImlucHV0IiB2YWx1ZT0iIj4gUmVwZWF0ZXIgSUQ8L2xpPgogICAgICAgICAgICAgICAgICAgICA8aHI+CiAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3R5bGVzaGVldCBzZWxlY3Rpb24gZHJvcGRvd24gLS0+CiAgICAgICAgICAgICAgICAgICAgIDxsaT48bGFiZWw+PHN0cm9uZz5TdHlsZTogPC9zdHJvbmc+CkBAIC0xNTQsOCArMTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgIDxocj4KLSAgICAgICAgICAgICAgICAgICAgPGxpPjxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJub1ZOQ19hcHBseSIgdmFsdWU9IkFwcGx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IlVJLnNldHRpbmdzQXBwbHkoKSI+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgPGxpPjxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJub1ZOQ19hcHBseSIgdmFsdWU9IkFwcGx5Ij48L2xpPgogICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgIDwvZGl2PgpAQCAtMTY2LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgPGxpPjxsYWJlbD48c3Ryb25nPkhvc3Q6IDwvc3Ryb25nPjxpbnB1dCBpZD0ibm9WTkNfaG9zdCIgLz48L2xhYmVsPjwvbGk+CiAgICAgICAgICAgICAgICAgPGxpPjxsYWJlbD48c3Ryb25nPlBvcnQ6IDwvc3Ryb25nPjxpbnB1dCBpZD0ibm9WTkNfcG9ydCIgLz48L2xhYmVsPjwvbGk+CiAgICAgICAgICAgICAgICAgPGxpPjxsYWJlbD48c3Ryb25nPlBhc3N3b3JkOiA8L3N0cm9uZz48aW5wdXQgaWQ9Im5vVk5DX3Bhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgLz48L2xhYmVsPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPjxpbnB1dCBpZD0ibm9WTkNfY29ubmVjdF9idXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNvbm5lY3QiIG9uY2xpY2s9IlVJLmNvbm5lY3QoKTsiPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxpbnB1dCBpZD0ibm9WTkNfY29ubmVjdF9idXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNvbm5lY3QiPjwvbGk+CiAgICAgICAgICAgICA8L3VsPgogICAgICAgICA8L2Rpdj4KIApAQCAtMTc2LDEwICsxOTYsNiBAQAogICAgIDxkaXYgaWQ9Im5vVk5DX3NjcmVlbiI+CiAgICAgICAgIDxkaXYgaWQ9Im5vVk5DX3NjcmVlbl9wYWQiPjwvZGl2PgogCi0gICAgICAgIDxkaXYgaWQ9Im5vVk5DX3N0YXR1c19iYXIiIGNsYXNzPSJub1ZOQ19zdGF0dXNfYmFyIj4KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJub1ZOQ19zdGF0dXMiPkxvYWRpbmc8L2Rpdj4KLSAgICAgICAgPC9kaXY+Ci0KICAgICAgICAgPGgxIGlkPSJub1ZOQ19sb2dvIj48c3Bhbj5ubzwvc3Bhbj48YnIgLz5WTkM8L2gxPgogCiAgICAgICAgIDwhLS0gSFRNTDUgQ2FudmFzIC0tPgpAQCAtMTkwLDkgKzIwNiw4IEBACiAgICAgICAgIDwvZGl2PgogCiAgICAgPC9kaXY+CisgICAgPHNjcmlwdCBzcmM9ImluY2x1ZGUvdXRpbC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImluY2x1ZGUvdWkuanMiPjwvc2NyaXB0PgogCi0gICAgPHNjcmlwdD4KLSAgICAgICAgd2luZG93Lm9ubG9hZCA9IFVJLmxvYWQ7Ci0gICAgPC9zY3JpcHQ+CiAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvd2ViY2xpZW50cy9ub3ZuYy92bmNfYXV0by5odG1sIGIvd2ViY2xpZW50cy9ub3ZuYy92bmNfYXV0by5odG1sCmluZGV4IDhkMzcwYjUuLmZmMzc2ZmUgMTAwNjQ0Ci0tLSBhL3dlYmNsaWVudHMvbm92bmMvdm5jX2F1dG8uaHRtbAorKysgYi93ZWJjbGllbnRzL25vdm5jL3ZuY19hdXRvLmh0bWwKQEAgLTEsMzIgKzEsNjYgQEAKIDwhRE9DVFlQRSBodG1sPgogPGh0bWw+Ci0gICAgPCEtLSAKLSAgICBub1ZOQyBFeGFtcGxlOiBBdXRvbWF0aWNhbGx5IGNvbm5lY3Qgb24gcGFnZSBsb2FkLgotICAgIENvcHlyaWdodCAoQykgMjAxMSBKb2VsIE1hcnRpbgotICAgIExpY2Vuc2VkIHVuZGVyIExHUEwtMyAoc2VlIExJQ0VOU0UudHh0KQorPGhlYWQ+CisKKyAgICA8IS0tCisgICAgbm9WTkMgZXhhbXBsZTogc2ltcGxlIGV4YW1wbGUgdXNpbmcgZGVmYXVsdCBVSQorICAgIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpbgorICAgIENvcHlyaWdodCAoQykgMjAxMyBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQgorICAgIG5vVk5DIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpCisgICAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSAyLUNsYXVzZSBCU0QgbGljZW5zZSAoc2VlIExJQ0VOU0UudHh0KS4KIAogICAgIENvbm5lY3QgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQgaW4gcXVlcnkgc3RyaW5nOgogICAgICAgICBodHRwOi8vZXhhbXBsZS5jb20vP2hvc3Q9SE9TVCZwb3J0PVBPUlQmZW5jcnlwdD0xJnRydWVfY29sb3I9MQogICAgIC0tPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+bm9WTkM8L3RpdGxlPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9ImNocm9tZT0xIj4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJpbmNsdWRlL2Jhc2UuY3NzIiB0aXRsZT0icGxhaW4iPgotICAgICAgICA8IS0tCi0gICAgICAgIDxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyAKLSAgICAgICAgICAgIHNyYz0naHR0cDovL2dldGZpcmVidWcuY29tL3JlbGVhc2VzL2xpdGUvMS4yL2ZpcmVidWctbGl0ZS1jb21wcmVzc2VkLmpzJz48L3NjcmlwdD4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxzY3JpcHQgc3JjPSJpbmNsdWRlL3ZuYy5qcyI+PC9zY3JpcHQ+Ci0gICAgPC9oZWFkPgorICAgIDx0aXRsZT5ub1ZOQzwvdGl0bGU+CiAKLSAgICA8Ym9keSBzdHlsZT0ibWFyZ2luOiAwcHg7Ij4KLSAgICAgICAgPGRpdiBpZD0ibm9WTkNfc2NyZWVuIj4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICA8IS0tIEFsd2F5cyBmb3JjZSBsYXRlc3QgSUUgcmVuZGVyaW5nIGVuZ2luZSAoZXZlbiBpbiBpbnRyYW5ldCkgJiBDaHJvbWUgRnJhbWUKKyAgICAgICAgICAgICAgICBSZW1vdmUgdGhpcyBpZiB5b3UgdXNlIHRoZSAuaHRhY2Nlc3MgLS0+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlLGNocm9tZT0xIj4KKworICAgIDwhLS0gQXBwbGUgaU9TIFNhZmFyaSBzZXR0aW5ncyAtLT4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iPgorICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyIgLz4KKyAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1zdGF0dXMtYmFyLXN0eWxlIiBjb250ZW50PSJibGFjay10cmFuc2x1Y2VudCIgLz4KKyAgICA8IS0tIEFwcCBTdGFydCBJY29uICAtLT4KKyAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLXN0YXJ0dXAtaW1hZ2UiIGhyZWY9ImltYWdlcy9zY3JlZW5fMzIweDQ2MC5wbmciIC8+CisgICAgPCEtLSBGb3IgaU9TIGRldmljZXMgc2V0IHRoZSBpY29uIHRvIHVzZSBpZiB1c2VyIGJvb2ttYXJrcyBhcHAgb24gdGhlaXIgaG9tZXNjcmVlbiAtLT4KKyAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9ImltYWdlcy9zY3JlZW5fNTd4NTcucG5nIj4KKyAgICA8IS0tCisgICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uLXByZWNvbXBvc2VkIiBocmVmPSJpbWFnZXMvc2NyZWVuXzU3eDU3LnBuZyIgLz4KKyAgICAtLT4KKworCisgICAgPCEtLSBTdHlsZXNoZWV0cyAtLT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImluY2x1ZGUvYmFzZS5jc3MiIHRpdGxlPSJwbGFpbiI+CisKKyAgICAgPCEtLQorICAgIDxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JworICAgICAgICBzcmM9J2h0dHA6Ly9nZXRmaXJlYnVnLmNvbS9yZWxlYXNlcy9saXRlLzEuMi9maXJlYnVnLWxpdGUtY29tcHJlc3NlZC5qcyc+PC9zY3JpcHQ+CisgICAgLS0+CisgICAgICAgIDxzY3JpcHQgc3JjPSJpbmNsdWRlL3V0aWwuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBzdHlsZT0ibWFyZ2luOiAwcHg7Ij4KKyAgICA8ZGl2IGlkPSJub1ZOQ19zY3JlZW4iPgogICAgICAgICAgICAgPGRpdiBpZD0ibm9WTkNfc3RhdHVzX2JhciIgY2xhc3M9Im5vVk5DX3N0YXR1c19iYXIiIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7Ij4KICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiPjx0cj4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjxkaXYgaWQ9Im5vVk5DX3N0YXR1cyI+TG9hZGluZzwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGlkPSJub1ZOQ19zdGF0dXMiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDogYXV0bzsiPgorICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGluZworICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjElIj48ZGl2IGlkPSJub1ZOQ19idXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0iU2VuZCBDdHJsQWx0RGVsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJzZW5kQ3RybEFsdERlbEJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ibm9WTkNfeHZwX2J1dHRvbnMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9YnV0dG9uIHZhbHVlPSJTaHV0ZG93biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0ieHZwU2h1dGRvd25CdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9YnV0dG9uIHZhbHVlPSJSZWJvb3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Inh2cFJlYm9vdEJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9IlJlc2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJ4dnBSZXNldEJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICA8L3RyPjwvdGFibGU+CiAgICAgICAgICAgICA8L2Rpdj4KQEAgLTQwLDYgKzc0LDExIEBACiAgICAgICAgIC8qZ2xvYmFsIHdpbmRvdywgJCwgVXRpbCwgUkZCLCAqLwogICAgICAgICAidXNlIHN0cmljdCI7CiAKKyAgICAgICAgLy8gTG9hZCBzdXBwb3J0aW5nIHNjcmlwdHMKKyAgICAgICAgVXRpbC5sb2FkX3NjcmlwdHMoWyJ3ZWJ1dGlsLmpzIiwgImJhc2U2NC5qcyIsICJ3ZWJzb2NrLmpzIiwgImRlcy5qcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5c3ltZGVmLmpzIiwgImtleWJvYXJkLmpzIiwgImlucHV0LmpzIiwgImRpc3BsYXkuanMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzdW56aXAuanMiLCAicmZiLmpzIl0pOworCiAgICAgICAgIHZhciByZmI7CiAKICAgICAgICAgZnVuY3Rpb24gcGFzc3dvcmRSZXF1aXJlZChyZmIpIHsKQEAgLTYwLDYgKzk5LDE4IEBACiAgICAgICAgICAgICByZmIuc2VuZEN0cmxBbHREZWwoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBmdW5jdGlvbiB4dnBTaHV0ZG93bigpIHsKKyAgICAgICAgICAgIHJmYi54dnBTaHV0ZG93bigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZ1bmN0aW9uIHh2cFJlYm9vdCgpIHsKKyAgICAgICAgICAgIHJmYi54dnBSZWJvb3QoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmdW5jdGlvbiB4dnBSZXNldCgpIHsKKyAgICAgICAgICAgIHJmYi54dnBSZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKHJmYiwgc3RhdGUsIG9sZHN0YXRlLCBtc2cpIHsKICAgICAgICAgICAgIHZhciBzLCBzYiwgY2FkLCBsZXZlbDsKICAgICAgICAgICAgIHMgPSAkRCgnbm9WTkNfc3RhdHVzJyk7CkBAIC03NCw4ICsxMjUsMTIgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICBsZXZlbCA9ICJ3YXJuIjsgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHN0YXRlID09PSAibm9ybWFsIikgeyBjYWQuZGlzYWJsZWQgPSBmYWxzZTsgfQotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgeyBjYWQuZGlzYWJsZWQgPSB0cnVlOyB9CisgICAgICAgICAgICBpZiAoc3RhdGUgPT09ICJub3JtYWwiKSB7CisgICAgICAgICAgICAgICAgY2FkLmRpc2FibGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhZC5kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgeHZwSW5pdCgwKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHR5cGVvZihtc2cpICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgIHNiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAibm9WTkNfc3RhdHVzXyIgKyBsZXZlbCk7CkBAIC04MywxNyArMTM4LDQyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkgeworICAgICAgICBmdW5jdGlvbiB4dnBJbml0KHZlcikgeworICAgICAgICAgICAgdmFyIHh2cGJ1dHRvbnM7CisgICAgICAgICAgICB4dnBidXR0b25zID0gJEQoJ25vVk5DX3h2cF9idXR0b25zJyk7CisgICAgICAgICAgICBpZiAodmVyID49IDEpIHsKKyAgICAgICAgICAgICAgICB4dnBidXR0b25zLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeHZwYnV0dG9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2luZG93Lm9uc2NyaXB0c2xvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICB2YXIgaG9zdCwgcG9ydCwgcGFzc3dvcmQsIHBhdGgsIHRva2VuOwogCiAgICAgICAgICAgICAkRCgnc2VuZEN0cmxBbHREZWxCdXR0b24nKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CiAgICAgICAgICAgICAkRCgnc2VuZEN0cmxBbHREZWxCdXR0b24nKS5vbmNsaWNrID0gc2VuZEN0cmxBbHREZWw7CisgICAgICAgICAgICAkRCgneHZwU2h1dGRvd25CdXR0b24nKS5vbmNsaWNrID0geHZwU2h1dGRvd247CisgICAgICAgICAgICAkRCgneHZwUmVib290QnV0dG9uJykub25jbGljayA9IHh2cFJlYm9vdDsKKyAgICAgICAgICAgICREKCd4dnBSZXNldEJ1dHRvbicpLm9uY2xpY2sgPSB4dnBSZXNldDsKIAorICAgICAgICAgICAgV2ViVXRpbC5pbml0X2xvZ2dpbmcoV2ViVXRpbC5nZXRRdWVyeVZhcignbG9nZ2luZycsICd3YXJuJykpOwogICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSB1bmVzY2FwZShXZWJVdGlsLmdldFF1ZXJ5VmFyKCd0aXRsZScsICdub1ZOQycpKTsKICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHVzZSB0aGUgaG9zdCBhbmQgcG9ydCBvZiBzZXJ2ZXIgdGhhdCBzZXJ2ZWQgdGhpcyBmaWxlCiAgICAgICAgICAgICBob3N0ID0gV2ViVXRpbC5nZXRRdWVyeVZhcignaG9zdCcsIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CiAgICAgICAgICAgICBwb3J0ID0gV2ViVXRpbC5nZXRRdWVyeVZhcigncG9ydCcsIHdpbmRvdy5sb2NhdGlvbi5wb3J0KTsKIAorICAgICAgICAgICAgLy8gaWYgcG9ydCA9PSA4MCAob3IgNDQzKSB0aGVuIGl0IHdvbid0IGJlIHByZXNlbnQgYW5kIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gc2V0IG1hbnVhbGx5CisgICAgICAgICAgICBpZiAoIXBvcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sLnN1YnN0cmluZygwLDUpID09ICdodHRwcycpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDQ0MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sLnN1YnN0cmluZygwLDQpID09ICdodHRwJykgeworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gODA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBJZiBhIHRva2VuIHZhcmlhYmxlIGlzIHBhc3NlZCBpbiwgc2V0IHRoZSBwYXJhbWV0ZXIgaW4gYSBjb29raWUuCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgbm92YS1ub3ZuY3Byb3h5LgogICAgICAgICAgICAgdG9rZW4gPSBXZWJVdGlsLmdldFF1ZXJ5VmFyKCd0b2tlbicsIG51bGwpOwpAQCAtMTAzLDYgKzE4Myw3IEBACiAKICAgICAgICAgICAgIHBhc3N3b3JkID0gV2ViVXRpbC5nZXRRdWVyeVZhcigncGFzc3dvcmQnLCAnJyk7CiAgICAgICAgICAgICBwYXRoID0gV2ViVXRpbC5nZXRRdWVyeVZhcigncGF0aCcsICd3ZWJzb2NraWZ5Jyk7CisKICAgICAgICAgICAgIGlmICgoIWhvc3QpIHx8ICghcG9ydCkpIHsKICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSgnZmFpbGVkJywKICAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBob3N0IGFuZCBwb3J0IGluIFVSTCIpOwpAQCAtMTEyLDExICsxOTMsMTMgQEAKICAgICAgICAgICAgIHJmYiA9IG5ldyBSRkIoeyd0YXJnZXQnOiAgICAgICAkRCgnbm9WTkNfY2FudmFzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jcnlwdCc6ICAgICAgV2ViVXRpbC5nZXRRdWVyeVZhcignZW5jcnlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAiaHR0cHM6IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGVhdGVySUQnOiAgIFdlYlV0aWwuZ2V0UXVlcnlWYXIoJ3JlcGVhdGVySUQnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJ1ZV9jb2xvcic6ICAgV2ViVXRpbC5nZXRRdWVyeVZhcigndHJ1ZV9jb2xvcicsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvY2FsX2N1cnNvcic6IFdlYlV0aWwuZ2V0UXVlcnlWYXIoJ2N1cnNvcicsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJlZCc6ICAgICAgIFdlYlV0aWwuZ2V0UXVlcnlWYXIoJ3NoYXJlZCcsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZXdfb25seSc6ICAgIFdlYlV0aWwuZ2V0UXVlcnlWYXIoJ3ZpZXdfb25seScsIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cGRhdGVTdGF0ZSc6ICB1cGRhdGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdvblVwZGF0ZVN0YXRlJzogIHVwZGF0ZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uWHZwSW5pdCc6ICAgIHh2cEluaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25QYXNzd29yZFJlcXVpcmVkJzogIHBhc3N3b3JkUmVxdWlyZWR9KTsKICAgICAgICAgICAgIHJmYi5jb25uZWN0KGhvc3QsIHBvcnQsIHBhc3N3b3JkLCBwYXRoKTsKICAgICAgICAgfTsKQEAgLTEyNCw0ICsyMDcsMyBAQAogCiAgICAgPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS94MTF2bmMvLmN2c2lnbm9yZSBiL3gxMXZuYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U5YjdhLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0uZGVwcwotTWFrZWZpbGUKLU1ha2VmaWxlLmluCi14MTF2bmMKLQpkaWZmIC0tZ2l0IGEveDExdm5jLzh0bzI0LmMgYi94MTF2bmMvOHRvMjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjM2RhMi4uMDAwMDAwMAotLS0gYS94MTF2bmMvOHRvMjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNTUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSA4dG8yNC5jIC0tICovCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0KLWludCBtdWx0aXZpc19jb3VudCA9IDA7Ci1pbnQgbXVsdGl2aXNfMjRjb3VudCA9IDA7Ci0KLXZvaWQgY2hlY2tfZm9yX211bHRpdmlzKHZvaWQpOwotdm9pZCBicHA4dG8yNChpbnQsIGludCwgaW50LCBpbnQpOwotdm9pZCBtYXJrXzhicHAoaW50KTsKLQotI2lmIFNLSVBfOFRPMjQKLXZvaWQgY2hlY2tfZm9yX211bHRpdmlzKHZvaWQpIHt9Ci12b2lkIGJwcDh0bzI0KGludCB4LCBpbnQgeSwgaW50IHosIGludCB0KSB7fQotdm9pZCBtYXJrXzhicHAoaW50IHgpIHt9Ci0jZWxzZQotLyogbG90cy4uLiAqLwotCi1zdGF0aWMgdm9pZCBzZXRfcm9vdF9jbWFwKHZvaWQpOwotc3RhdGljIGludCBjaGVja19wb2ludGVyX2luX2RlcHRoMjQodm9pZCk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9jbWFwOHRvMjQodm9pZCk7Ci1zdGF0aWMgdm9pZCBzZXRfcG9sbF9mYih2b2lkKTsKLXN0YXRpYyBpbnQgY2hlY2tfZGVwdGgoV2luZG93IHdpbiwgV2luZG93IHRvcCwgaW50IGRvYWxsKTsKLXN0YXRpYyBpbnQgY2hlY2tfZGVwdGhfd2luKFdpbmRvdyB3aW4sIFdpbmRvdyB0b3AsIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyKTsKLXN0YXRpYyBYSW1hZ2UgKnBfeGkoWEltYWdlICp4aSwgVmlzdWFsICp2aXN1YWwsIGludCB3aW5fZGVwdGgsIGludCAqdyk7Ci1zdGF0aWMgaW50IHBvbGxfbGluZShpbnQgeDEsIGludCB4MiwgaW50IHkxLCBpbnQgbiwgc3JhUmVnaW9uUHRyIG1vZCk7Ci1zdGF0aWMgdm9pZCBwb2xsX2xpbmVfY29tcGxlbWVudChpbnQgeDEsIGludCB4MiwgaW50IHkxLCBzcmFSZWdpb25QdHIgbW9kKTsKLXN0YXRpYyBpbnQgcG9sbF84YnBwKHNyYVJlZ2lvblB0ciwgaW50KTsKLXN0YXRpYyB2b2lkIHBvbGxfOGJwcF9jb21wbGVtZW50KHNyYVJlZ2lvblB0cik7Ci1zdGF0aWMgdm9pZCBtYXJrX3Jnbl9yZWN0cyhzcmFSZWdpb25QdHIgbW9kKTsKLXN0YXRpYyBpbnQgZ2V0XzhicHBfcmVnaW9ucyhpbnQgdmFsaWRhdGUpOwotc3RhdGljIGludCBnZXRfY21hcChpbnQgaiwgQ29sb3JtYXAgY21hcCk7Ci1zdGF0aWMgdm9pZCBkb184YnBwX3JlZ2lvbihpbnQgbiwgc3JhUmVnaW9uUHRyIG1hcmspOwotc3RhdGljIFhJbWFnZSAqY21hcF94aShYSW1hZ2UgKnhpLCBXaW5kb3cgd2luLCBpbnQgd2luX2RlcHRoKTsKLXN0YXRpYyB2b2lkIHRyYW5zZm9ybV9yZWN0KHNyYVJlY3QgcmVjdCwgV2luZG93IHdpbiwgaW50IHdpbl9kZXB0aCwgaW50IGNtKTsKLQotLyogc3RydWN0IGZvciBrZWVwaW5nIGluZm8gYWJvdXQgdGhlIDhicHAgd2luZG93czogKi8KLXR5cGVkZWYgc3RydWN0IHdpbmRvdzggewotCVdpbmRvdyB3aW47Ci0JV2luZG93IHRvcDsKLQlpbnQgZGVwdGg7Ci0JaW50IHgsIHk7Ci0JaW50IHcsIGg7Ci0JaW50IG1hcF9zdGF0ZTsKLQlDb2xvcm1hcCBjbWFwOwotCUJvb2wgbWFwX2luc3RhbGxlZDsKLQlpbnQgZmV0Y2hlZDsKLQlkb3VibGUgbGFzdF9mZXRjaGVkOwotCXNyYVJlZ2lvblB0ciBjbGlwX3JlZ2lvbjsKLX0gd2luZG93OGJwcF90OwotCi1lbnVtIG1hcmtfOGJwcF9tb2RlcyB7Ci0JTUFSS184QlBQX0FMTCA9IDAsCi0JTUFSS184QlBQX1BPSU5URVIsCi0JTUFSS184QlBQX1RPUAotfTsKLQotCi0jZGVmaW5lIE5DT0xPUiAyNTYKLQotc3RhdGljIENvbG9ybWFwIHJvb3RfY21hcCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50ICpyb290X3JnYiA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIHNldF9yb290X2NtYXAodm9pZCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JcmV0dXJuOwotI2Vsc2UKLQlzdGF0aWMgdGltZV90IGxhc3Rfc2V0ID0gMDsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCXN0YXRpYyBYQ29sb3IgKmNvbG9yID0gTlVMTDsKLQlpbnQgcmVkbyA9IDA7Ci0JaW50IG5jb2xvciA9IDA7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKGRlcHRoID4gMTYpIHsKLQkJbmNvbG9yID0gTkNPTE9SOwotCX0gZWxzZSBpZiAoZGVwdGggPiA4KSB7Ci0JCW5jb2xvciA9IDEgPDwgZGVwdGg7Ci0JfSBlbHNlIHsKLQkJbmNvbG9yID0gTkNPTE9SOwotCX0KLQotCWlmICghcm9vdF9yZ2IpIHsKLQkJcm9vdF9yZ2IgPSAodW5zaWduZWQgaW50ICopIG1hbGxvYyhuY29sb3IgKiBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0JfQotCWlmICghY29sb3IpIHsKLQkJY29sb3IgPSAoWENvbG9yICopIG1hbGxvYyhuY29sb3IgKiBzaXplb2YoWENvbG9yKSk7Ci0JfQotCi0JaWYgKG5vdyA+IGxhc3Rfc2V0ICsgMTApIHsKLQkJcmVkbyA9IDE7Ci0JfQotCWlmICghIHJvb3RfY21hcCB8fCByZWRvKSB7Ci0JCVhfTE9DSzsKLQkJaWYgKCEgdmFsaWRfd2luZG93KHdpbmRvdywgJmF0dHIsIDEpKSB7Ci0JCQlYX1VOTE9DSzsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYXR0ci5jb2xvcm1hcCkgewotCQkJaW50IGksIG5jZWxscyA9IG5jb2xvcjsKLQotCQkJaWYgKGRlcHRoIDwgOCkgewotCQkJCW5jZWxscyA9IENlbGxzT2ZTY3JlZW4oU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSk7Ci0JCQl9Ci0JCQlmb3IgKGk9MDsgaSA8IG5jZWxsczsgaSsrKSB7Ci0JCQkJY29sb3JbaV0ucGl4ZWwgPSBpOwotCQkJCWNvbG9yW2ldLnBhZCA9IDA7Ci0JCQl9Ci0JCQlsYXN0X3NldCA9IG5vdzsKLQkJCXJvb3RfY21hcCA9IGF0dHIuY29sb3JtYXA7Ci0JCQlYUXVlcnlDb2xvcnMoZHB5LCByb290X2NtYXAsIGNvbG9yLCBuY2VsbHMpOwotCQkJZm9yIChpPTA7IGkgPCBuY2VsbHM7IGkrKykgewotCQkJCXVuc2lnbmVkIGludCByZWQsIGdyZWVuLCBibHVlOwotCQkJCS8qIHN0cmlwIG91dCBoaWdoZXN0IDggYml0cyBvZiB2YWx1ZXM6ICovCi0JCQkJcmVkICAgPSAoY29sb3JbaV0ucmVkICAgJiAweGZmMDApID4+IDg7Ci0JCQkJZ3JlZW4gPSAoY29sb3JbaV0uZ3JlZW4gJiAweGZmMDApID4+IDg7Ci0JCQkJYmx1ZSAgPSAoY29sb3JbaV0uYmx1ZSAgJiAweGZmMDApID4+IDg7Ci0KLQkJCQkvKgotCQkJCSAqIHRoZSBtYXhlcyBzaG91bGQgYmUgYXQgMjU1IGFscmVhZHksCi0JCQkJICogYnV0IGp1c3QgaW4gY2FzZS4uLgotCQkJCSAqLwotCQkJCXJlZCAgID0gKG1haW5fcmVkX21heCAgICogcmVkICApLzI1NTsKLQkJCQlncmVlbiA9IChtYWluX2dyZWVuX21heCAqIGdyZWVuKS8yNTU7Ci0JCQkJYmx1ZSAgPSAobWFpbl9ibHVlX21heCAgKiBibHVlICkvMjU1OwotCi0JCQkJLyogc2hpZnQgdGhlbSBvdmVyIGFuZCBvciB0b2dldGhlciBmb3IgdmFsdWUgKi8KLQkJCQlyZWQgICA9IHJlZCAgICA8PCBtYWluX3JlZF9zaGlmdDsKLQkJCQlncmVlbiA9IGdyZWVuICA8PCBtYWluX2dyZWVuX3NoaWZ0OwotCQkJCWJsdWUgID0gYmx1ZSAgIDw8IG1haW5fYmx1ZV9zaGlmdDsKLQotCQkJCS8qIHN0b3JlIGl0IGluIHRoZSBhcnJheSB0byBiZSB1c2VkIGxhdGVyICovCi0JCQkJcm9vdF9yZ2JbaV0gPSByZWQgfCBncmVlbiB8IGJsdWU7Ci0JCQl9Ci0JCX0KLQkJWF9VTkxPQ0s7Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0vKiBmaXhlZCBzaXplIGFycmF5LiAgV2lsbCBwcmltYXJpbHkgaG9sZCB2aXNpYmxlIDhicHAgd2luZG93cyAqLwotI2RlZmluZSBNQVhfOEJQUF9XSU5ET1dTIDY0Ci1zdGF0aWMgd2luZG93OGJwcF90IHdpbmRvd3NfOGJwcFtNQVhfOEJQUF9XSU5ET1dTXTsKLQotc3RhdGljIGludCBkYjI0ID0gMDsKLXN0YXRpYyBpbnQgeGdldGltYWdlXzh0bzI0ID0gMTsKLXN0YXRpYyBkb3VibGUgcG9sbF84dG8yNF9kZWxheSA9IFBPTExfOFRPMjRfREVMQVk7Ci1zdGF0aWMgZG91YmxlIGNhY2hlX3dpbiA9IDAuMDsKLXN0YXRpYyBpbnQgbGV2ZWwyXzh0bzI0ID0gMDsKLQotc3RhdGljIGludCBjaGVja19wb2ludGVyX2luX2RlcHRoMjQodm9pZCkgewotCWludCB0cmllcyA9IDAsIGluXzI0ID0gMDsKLQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCVdpbmRvdyBjLCB3OwotCWRvdWJsZSBub3cgPSBkbm93KCk7Ci0KLQljID0gd2luZG93OwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAobm93ID4gbGFzdF9rZXlib2FyZF90aW1lICsgMS4wICYmIG5vdyA+IGxhc3RfcG9pbnRlcl90aW1lICsgMS4wKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCVhfTE9DSzsKLQl3aGlsZSAoYyAmJiB0cmllcysrIDwgMykgewotCQljID0gcXVlcnlfcG9pbnRlcihjKTsKLQkJaWYgKHZhbGlkX3dpbmRvdyhjLCAmYXR0ciwgMSkpIAl7Ci0JCQlpZiAoYXR0ci5kZXB0aCA9PSAyNCkgewotCQkJCWluXzI0ID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlYX1VOTE9DSzsKLQlpZiAoaW5fMjQpIHsKLQkJaW50IHgxLCB5MSwgeDIsIHkyOwotCQlYX0xPQ0s7Ci0JCXh0cmFuc2xhdGUoYywgd2luZG93LCAwLCAwLCAmeDEsICZ5MSwgJncsIDEpOwotCQlYX1VOTE9DSzsKLQkJeDIgPSB4MSArIGF0dHIud2lkdGg7Ci0JCXkyID0geTEgKyBhdHRyLmhlaWdodDsKLQkJeDEgPSBuZml4KHgxLCBkcHlfeCk7Ci0JCXkxID0gbmZpeCh5MSwgZHB5X3kpOwotCQl4MiA9IG5maXgoeDIsIGRweV94KzEpOwotCQl5MiA9IG5maXgoeTIsIGRweV95KzEpOwotCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeDEsIHkxLCB4MiwgeTIsIDApOwotCi1pZiAoZGIyNCA+IDEpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfcG9pbnRlcl9pbl9kZXB0aDI0ICVkICVkICVkICVkXG4iLCB4MSwgeTEsIHgyLCB5Mik7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9jbWFwOHRvMjQodm9pZCkgewotCWlmIChjbWFwOHRvMjRfc3RyKSB7Ci0JCWNoYXIgKnAsICpzdHIgPSBzdHJkdXAoY21hcDh0bzI0X3N0cik7Ci0JCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCQkvKiBkZWZhdWx0czogKi8KLQkJZGIyNCA9IDA7Ci0JCXhnZXRpbWFnZV84dG8yNCA9IDE7Ci0JCXBvbGxfOHRvMjRfZGVsYXkgPSBQT0xMXzhUTzI0X0RFTEFZOwotCQlsZXZlbDJfOHRvMjQgPSAwOwotCQljYWNoZV93aW4gPSAwLjA7Ci0JCXdoaWxlIChwKSB7Ci0JCQlpZiAoc3Ryc3RyKHAsICJkYmc9IikgPT0gcCkgewotCQkJCWRiMjQgPSBhdG9pKHAgKyBzdHJsZW4oImRiZz0iKSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAicG9sbD0iKSA9PSBwKSB7Ci0JCQkJcG9sbF84dG8yNF9kZWxheSA9IGF0b2YocCArIHN0cmxlbigicG9sbD0iKSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiY2FjaGV3aW49IikgPT0gcCkgewotCQkJCWNhY2hlX3dpbiA9IGF0b2YocCArIHN0cmxlbigiY2FjaGV3aW49IikpOwotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJub2dldGltYWdlIikpIHsKLQkJCQl4Z2V0aW1hZ2VfOHRvMjQgPSAwOwotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJsZXZlbDIiKSkgewotCQkJCWxldmVsMl84dG8yNCA9IDE7Ci0JCQl9Ci0JCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0gZWxzZSB7Ci0JCWlmIChnZXRlbnYoIkRFQlVHXzhUTzI0IikgIT0gTlVMTCkgewotCQkJZGIyNCA9IGF0b2koZ2V0ZW52KCJERUJVR184VE8yNCIpKTsKLQkJfQotCQlpZiAoZ2V0ZW52KCJOT1hHRVRJTUFHRV84VE8yNCIpICE9IE5VTEwpIHsKLQkJCXhnZXRpbWFnZV84dG8yNCA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICpwb2xsOF9mYiA9IE5VTEwsICpwb2xsMjRfZmIgPSBOVUxMOwotc3RhdGljIGludCBwb2xsOF9mYl93ID0gMCwgcG9sbDhfZmJfaCA9IDA7Ci1zdGF0aWMgaW50IHBvbGwyNF9mYl93ID0gMCwgcG9sbDI0X2ZiX2ggPSAwOwotCi1zdGF0aWMgdm9pZCBwZmIoaW50IGZhYywgY2hhciAqKmZiLCBpbnQgKncsIGludCAqaCkgIHsKLQlpZiAoISAqZmIgfHwgKncgIT0gZHB5X3ggfHwgKmggIT0gZHB5X3kpIHsKLQkJaWYgKCpmYikgewotCQkJZnJlZSgqZmIpOwotCQl9Ci0JCSpmYiA9IChjaGFyICopIGNhbGxvYyhmYWMgKiBkcHlfeCAqIGRweV95LCAxKTsKLQkJKncgPSBkcHlfeDsKLQkJKmggPSBkcHlfeTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9wb2xsX2ZiKHZvaWQpIHsKLQkvKiBjcmVhdGUgcG9sbGluZyBmcmFtZWJ1ZmZlcnMgb3IgcmVjcmVhdGUgaWYgdG9vIHNtYWxsLiAqLwotCi0JaWYgKCEgeGdldGltYWdlXzh0bzI0KSB7Ci0JCXJldHVybjsJCS8qIHRoaXMgc2F2ZXMgYSBiaXQgb2YgUkFNICovCi0JfQotCXBmYig0LCAmcG9sbDI0X2ZiLCAmcG9sbDI0X2ZiX3csICZwb2xsMjRfZmJfaCk7Ci0JaWYgKGRlcHRoID4gOCAmJiBkZXB0aCA8PSAxNikgewotCQlwZmIoMiwgJnBvbGw4X2ZiLCAgJnBvbGw4X2ZiX3csICAmcG9sbDhfZmJfaCk7CS8qIDJYIGZvciByYXJlIDE2YnBwIGNvbG9ybWFwIGNhc2UgKi8KLQl9IGVsc2UgewotCQlwZmIoMSwgJnBvbGw4X2ZiLCAgJnBvbGw4X2ZiX3csICAmcG9sbDhfZmJfaCk7Ci0JfQotfQotCi1pbnQgTVZfZ2xvYiA9IDA7Ci1pbnQgTVZfY291bnQ7Ci1pbnQgTVZfaGl0OwotZG91YmxlIE1WX3N0YXJ0OwotCi12b2lkIGNoZWNrX2Zvcl9tdWx0aXZpcyh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlyZXR1cm47Ci0jZWxzZQotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JaW50IGRvYWxsID0gMDsKLQlpbnQgaywgaSwgY250LCBkaWZmOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCXN0YXRpYyBXaW5kb3cgKnN0YWNrX29sZCA9IE5VTEw7Ci0Jc3RhdGljIGludCBzdGFja19vbGRfbGVuID0gMDsKLQlzdGF0aWMgZG91YmxlIGxhc3RfcGFyc2UgPSAwLjA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3VwZGF0ZSA9IDAuMDsKLQlzdGF0aWMgZG91YmxlIGxhc3RfY2xlYXIgPSAwLjA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3BvbGwgPSAwLjA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X2ZpeHVwID0gMC4wOwotCXN0YXRpYyBkb3VibGUgbGFzdF9jYWxsID0gMC4wOwotCXN0YXRpYyBkb3VibGUgbGFzdF9xdWVyeSA9IDAuMDsKLQlkb3VibGUgbm93ID0gZG5vdygpOwotCWRvdWJsZSBkZWxheTsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAobm93ID4gbGFzdF9wYXJzZSArIDEuMCkgewotCQlsYXN0X3BhcnNlID0gbm93OwotCQlwYXJzZV9jbWFwOHRvMjQoKTsKLQl9Ci1pZiAoZGIyNCA+IDIpIGZwcmludGYoc3RkZXJyLCAiIGNoZWNrX2Zvcl9tdWx0aXZpczogJS40ZlxuIiwgbm93IC0gbGFzdF9jYWxsKTsKLQlsYXN0X2NhbGwgPSBub3c7Ci0KLQlpZiAoZmlyc3QpIHsKLQkJaW50IGk7Ci0JCS8qIGluaXRpYWxpemUgOGJwcCB3aW5kb3cgdGFibGU6ICovCi0JCWZvciAoaT0wOyBpIDwgTUFYXzhCUFBfV0lORE9XUzsgaSsrKSAJewotCQkJd2luZG93c184YnBwW2ldLndpbiA9IE5vbmU7Ci0JCQl3aW5kb3dzXzhicHBbaV0udG9wID0gTm9uZTsKLQkJCXdpbmRvd3NfOGJwcFtpXS5tYXBfc3RhdGUgPSBJc1VubWFwcGVkOwotCQkJd2luZG93c184YnBwW2ldLmNtYXAgPSAoQ29sb3JtYXApIDA7Ci0JCQl3aW5kb3dzXzhicHBbaV0uZmV0Y2hlZCA9IDA7Ci0JCQl3aW5kb3dzXzhicHBbaV0ubGFzdF9mZXRjaGVkID0gLTEuMDsKLQkJCXdpbmRvd3NfOGJwcFtpXS5jbGlwX3JlZ2lvbiA9IE5VTEw7Ci0JCX0KLQkJc2V0X3BvbGxfZmIoKTsKLQotCQlmaXJzdCA9IDA7Ci0JCWRvYWxsID0gMTsJLyogZmV0Y2ggZXZlcnl0aGluZyBmaXJzdCB0aW1lICovCi0JfQotCi0JaWYgKHdpcmVmcmFtZV9pbl9wcm9ncmVzcykgewotCQlyZXR1cm47Ci0JfQotCi0Jc2V0X3Jvb3RfY21hcCgpOwotCi0JLyoKLQkgKiBhbGxvY2F0ZSBhbiAib2xkIHN0YWNrIiBsaXN0IG9mIGFsbCB0b3BsZXZlbHMuICB3ZSBjb21wYXJlCi0JICogdGhpcyB0byB0aGUgY3VycmVudCBzdGFjayB0byBndWVzcyBzdGFja2luZyBvcmRlciBjaGFuZ2VzLgotCSAqLwotCWlmICghc3RhY2tfb2xkIHx8IHN0YWNrX29sZF9sZW4gPCBzdGFja19saXN0X2xlbikgewotCQlpbnQgbiA9IHN0YWNrX2xpc3RfbGVuOwotCQlpZiAobiA8IDI1NikgewotCQkJbiA9IDI1NjsKLQkJfQotCQlpZiAoc3RhY2tfb2xkKSB7Ci0JCQlmcmVlKHN0YWNrX29sZCk7Ci0JCX0KLQkJc3RhY2tfb2xkID0gKFdpbmRvdyAqKSBjYWxsb2MobipzaXplb2YoV2luZG93KSwgMSk7Ci0JCXN0YWNrX29sZF9sZW4gPSBuOwotCX0KLQotCS8qIGZpbGwgdGhlIG9sZCBzdGFjayB3aXRoIHZpc2libGUgd2luZG93czogKi8KLQljbnQgPSAwOwotCWZvciAoaz0wOyBrIDwgc3RhY2tfbGlzdF9udW07IGsrKykgewotCQlpZiAoc3RhY2tfbGlzdFtrXS52YWxpZCAmJgotCQkgICAgc3RhY2tfbGlzdFtrXS5tYXBfc3RhdGUgPT0gSXNWaWV3YWJsZSkgewotCQkJc3RhY2tfb2xkW2NudCsrXSA9IHN0YWNrX2xpc3Rba10ud2luOwotCQl9Ci0JfQotCi0JLyogc25hcHNob3QgKyB1cGRhdGUgdGhlIGN1cnJlbnQgc3RhY2tpbmcgb3JkZXI6ICovCi0JLyogVFVOQUJMRSAqLwotCWlmIChwb2xsXzh0bzI0X2RlbGF5ID49IFBPTExfOFRPMjRfREVMQVkpIHsKLQkJZGVsYXkgPSAzLjAgKiBwb2xsXzh0bzI0X2RlbGF5OwotCX0gZWxzZSB7Ci0JCWRlbGF5ID0gMy4wICogUE9MTF84VE8yNF9ERUxBWTsJLyogMC4xNSAqLwotCX0KLQlpZiAoZG9hbGwgfHwgbm93ID4gbGFzdF91cGRhdGUgKyBkZWxheSkgewotCQlzbmFwc2hvdF9zdGFja19saXN0KDAsIDAuMCk7Ci0JCXVwZGF0ZV9zdGFja19saXN0KCk7Ci0JCWxhc3RfdXBkYXRlID0gbm93OwotCX0KLQotCS8qIGxvb2sgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSB2aXNpYmxlIHRvcGxldmVsczogKi8KLQlkaWZmID0gMDsKLQljbnQgPSAwOwotCWZvciAoaz0wOyBrIDwgc3RhY2tfbGlzdF9udW07IGsrKykgewotCQlpZiAoc3RhY2tfbGlzdFtrXS52YWxpZCAmJiBzdGFja19saXN0W2tdLm1hcF9zdGF0ZSA9PQotCQkgICAgSXNWaWV3YWJsZSkgewotCQkJaWYgKHN0YWNrX29sZFtjbnRdICE9IHN0YWNrX2xpc3Rba10ud2luKSB7Ci0JCQkJZGlmZiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljbnQrKzsKLQkJfQotCX0KLQotCW11bHRpdmlzX2NvdW50ID0gMDsKLQltdWx0aXZpc18yNGNvdW50ID0gMDsKLQotCS8qCi0JICogZXZlcnkgMTAgc2Vjb25kcyB3ZSB0cnkgdG8gY2xlYW4gb3V0IGFuZCBhbHNvIHJlZnJlc2ggdGhlIHdpbmRvdwotCSAqIGluZm8gaW4gdGhlIDhicHAgd2luZG93IHRhYmxlOgotCSAqLwotCWlmIChub3cgPiBsYXN0X2NsZWFyICsgMTApIHsKLQkJbGFzdF9jbGVhciA9IG5vdzsKLQkJWF9MT0NLOwotCQlmb3IgKGk9MDsgaSA8IE1BWF84QlBQX1dJTkRPV1M7IGkrKykgewotCQkJV2luZG93IHcgPSB3aW5kb3dzXzhicHBbaV0ud2luOwotCQkJaWYgKCEgdmFsaWRfd2luZG93KHcsICZhdHRyLCAxKSkgewotCQkJCS8qIGNhdGNoIHdpbmRvd3MgdGhhdCB3ZW50IGF3YXk6ICovCi0JCQkJd2luZG93c184YnBwW2ldLndpbiA9IE5vbmU7Ci0JCQkJd2luZG93c184YnBwW2ldLnRvcCA9IE5vbmU7Ci0JCQkJd2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSA9IElzVW5tYXBwZWQ7Ci0JCQkJd2luZG93c184YnBwW2ldLmNtYXAgPSAoQ29sb3JtYXApIDA7Ci0JCQkJd2luZG93c184YnBwW2ldLmZldGNoZWQgPSAwOwotCQkJCXdpbmRvd3NfOGJwcFtpXS5sYXN0X2ZldGNoZWQgPSAtMS4wOwotCQkJfQotCQl9Ci0JCVhfVU5MT0NLOwotCX0KLQotCU1WX2NvdW50ID0gMDsKLQlNVl9oaXQgPSAwOwotCU1WX3N0YXJ0ID0gZG5vdygpOwotCi0Jc2V0X3Jvb3RfY21hcCgpOwotCi0JLyogbG9vcCBvdmVyIGFsbCB0b3BsZXZlbHMsIGJvdGggOCBhbmQgMjQgZGVwdGhzOiAqLwotCi0JWF9MT0NLOwkvKiBhIGdpYW50IGxvY2sgYXJvdW5kIHRoZSB3aG9sZSBhY3Rpdml0eSAqLwotCi0JZm9yIChrPTA7IGsgPCBzdGFja19saXN0X251bTsgaysrKSB7Ci0JCVdpbmRvdyByLCBwYXJlbnQ7Ci0JCVdpbmRvdyAqbGlzdDA7Ci0JCVN0YXR1cyByYzsKLQkJdW5zaWduZWQgaW50IG5jMDsKLQkJaW50IGkxOwotCQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCQlkb3VibGUgZGVsYXk7Ci0KLQkJV2luZG93IHdpbiA9IHN0YWNrX2xpc3Rba10ud2luOwotCi0JCS8qIFRVTkFCTEUgKi8KLQkJaWYgKHBvbGxfOHRvMjRfZGVsYXkgPj0gUE9MTF84VE8yNF9ERUxBWSkgewotCQkJZGVsYXkgPSAxLjUgKiBwb2xsXzh0bzI0X2RlbGF5OwotCQl9IGVsc2UgewotCQkJZGVsYXkgPSAxLjUgKiBQT0xMXzhUTzI0X0RFTEFZOwkvKiAwLjA3NSAqLwotCQl9Ci0KLQkJaWYgKG5vdyA8IGxhc3RfcXVlcnkgKyBkZWxheSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAod2luID09IE5vbmUpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHN0YWNrX2xpc3Rba10ubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCWludCBpOwotCQkJLyoKLQkJCSAqIGlmIHRoZSB0b3BsZXZlbCBiZWNhbWUgdW5tYXBwZWQsIG1hcmsgaXQKLQkJCSAqIGZvciB0aGUgY2hpbGRyZW4gYXMgd2VsbC4uLgotCQkJICovCi0JCQlmb3IgKGk9MDsgaSA8IE1BWF84QlBQX1dJTkRPV1M7IGkrKykgewotCQkJCWlmICh3aW5kb3dzXzhicHBbaV0udG9wID09IHdpbikgewotCQkJCQl3aW5kb3dzXzhicHBbaV0ubWFwX3N0YXRlID0KLQkJCQkJICAgIHN0YWNrX2xpc3Rba10ubWFwX3N0YXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjaGVja19kZXB0aCh3aW4sIHdpbiwgZG9hbGwpKSB7Ci0JCQkvKgotCQkJICogcmV0dXJucyAxIGlmIG5vIG5lZWQgdG8gcmVjdXJzZSBkb3duIGUuZy4gSXQKLQkJCSAqIGlzIDhicHAgYW5kIHdlIGFzc3VtZSBhbGwgbG93ZXIgb25lcyBhcmUgdG9vLgotCQkJICovCi0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHdlIHJlY3Vyc2UgdXAgdG8gdHdvIGxldmVscyBkb3duIGZyb20gc3RhY2tfbGlzdCB3aW5kb3dzICovCi0KLQkJb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlyYyA9IFhRdWVyeVRyZWVfd3IoZHB5LCB3aW4sICZyLCAmcGFyZW50LCAmbGlzdDAsICZuYzApOwotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQotCQlpZiAoISByYyB8fCB0cmFwcGVkX3hlcnJvcikgewotCQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCi0JCS8qIGxvb3Agb3ZlciBncmFuZGNoaWxkcmVuIG9mIHJvb3R3aW46ICovCi0JCWZvciAoaTE9MDsgaTEgPCAoaW50KSBuYzA7IGkxKyspIHsKLQkJCVdpbmRvdyB3aW4xID0gbGlzdDBbaTFdOwotCQkJV2luZG93ICpsaXN0MTsKLQkJCXVuc2lnbmVkIGludCBuYzE7Ci0JCQlpbnQgaTI7Ci0KLQkJCWlmIChjaGVja19kZXB0aCh3aW4xLCB3aW4sIGRvYWxsKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobGV2ZWwyXzh0bzI0KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0JCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCQlyYyA9IFhRdWVyeVRyZWVfd3IoZHB5LCB3aW4xLCAmciwgJnBhcmVudCwgJmxpc3QxLCAmbmMxKTsKLQkJCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCi0JCQlpZiAoISByYyB8fCB0cmFwcGVkX3hlcnJvcikgewotCQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCQkJLyogbG9vcCBvdmVyIGdyZWF0LWdyYW5kY2hpbGRyZW4gb2Ygcm9vdHdpbjogKi8KLQkJCWZvciAoaTI9MDsgaTI8IChpbnQpIG5jMTsgaTIrKykgewotCQkJCVdpbmRvdyB3aW4yID0gbGlzdDFbaTJdOwotCi0JCQkJaWYgKGNoZWNrX2RlcHRoKHdpbjIsIHdpbiwgZG9hbGwpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvKiBtb3JlPyBXaGljaCB3bSBkb2VzIHRoaXM/ICovCi0JCQl9Ci0JCQlpZiAobmMxKSB7Ci0JCQkJWEZyZWVfd3IobGlzdDEpOwotCQkJfQotCQl9Ci0JCWlmIChuYzApIHsKLQkJCVhGcmVlX3dyKGxpc3QwKTsKLQkJfQotCX0KLQlYX1VOTE9DSzsKLQotCWxhc3RfcXVlcnkgPSBkbm93KCk7Ci0KLU1WX2dsb2IgKz0gTVZfY291bnQ7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJNVl9jb3VudDogJWQgaGl0OiAlZCAlLjRmICAlMTAuMmZcbiIsIE1WX2NvdW50LCBNVl9oaXQsIGxhc3RfcXVlcnkgLSBNVl9zdGFydCwgTVZfZ2xvYiAvIChsYXN0X3F1ZXJ5IC0geDExdm5jX3N0YXJ0KSk7Ci0KLQlpZiAoc2NyZWVuX2ZpeHVwXzggPiAwLjAgJiYgbm93ID4gbGFzdF9maXh1cCArIHNjcmVlbl9maXh1cF84KSB7Ci0JCWxhc3RfZml4dXAgPSBub3c7Ci0JCW1hcmtfOGJwcChNQVJLXzhCUFBfQUxMKTsKLQkJbGFzdF9wb2xsID0gbm93OwotCi0JfSBlbHNlIGlmIChwb2xsXzh0bzI0X2RlbGF5ID4gMC4wKSB7Ci0JCWludCBhcmVhID0gLTE7Ci0JCWludCB2YWxpZGF0ZSA9IDA7Ci0KLQkJaWYgKGRpZmYgJiYgbXVsdGl2aXNfY291bnQpIHsKLQkJCXZhbGlkYXRlID0gMTsKLQkJfQotCQlpZiAobm93ID4gbGFzdF9wb2xsICsgcG9sbF84dG8yNF9kZWxheSkgewotCQkJc3JhUmVnaW9uUHRyIG1vZDsKLQotCQkJbGFzdF9wb2xsID0gbm93OwotCQkJbW9kID0gc3JhUmduQ3JlYXRlKCk7Ci0JCQlhcmVhID0gcG9sbF84YnBwKG1vZCwgdmFsaWRhdGUpOwotCQkJaWYgKGRlcHRoID09IDI0KSB7Ci0JCQkJcG9sbF84YnBwX2NvbXBsZW1lbnQobW9kKTsKLQkJCX0KLQkJCW1hcmtfcmduX3JlY3RzKG1vZCk7Ci0JCQlzcmFSZ25EZXN0cm95KG1vZCk7Ci0JCX0KLQkJaWYgKDAgJiYgYXJlYSA8IGRweV94ICogZHB5X3kgLyAyICYmIGRpZmYgJiYgbXVsdGl2aXNfY291bnQpIHsKLQkJCW1hcmtfOGJwcChNQVJLXzhCUFBfUE9JTlRFUik7Ci0JCQlsYXN0X3BvbGwgPSBub3c7Ci0JCX0KLQotCX0gZWxzZSBpZiAoZGlmZiAmJiBtdWx0aXZpc19jb3VudCkgewotCQltYXJrXzhicHAoTUFSS184QlBQX0FMTCk7Ci0JCWxhc3RfcG9sbCA9IG5vdzsKLQotCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYgJiYgbXVsdGl2aXNfMjRjb3VudCkgewotCQlzdGF0aWMgZG91YmxlIGxhc3RfY2hlY2sgPSAwLjA7Ci0JCWlmIChub3cgPiBsYXN0X2NoZWNrICsgMC40KSB7Ci0JCQlsYXN0X2NoZWNrID0gbm93OwotCQkJaWYgKGNoZWNrX3BvaW50ZXJfaW5fZGVwdGgyNCgpKSB7Ci0JCQkJbGFzdF9wb2xsID0gbm93OwotCQkJfQotCQl9Ci0JfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZG9uZTogJS40ZlxuIiwgZG5vdygpIC0gbGFzdF9xdWVyeSk7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLSNkZWZpbmUgVldfQ0FDSEVfTUFYIDEwMjQKLXN0YXRpYyBYV2luZG93QXR0cmlidXRlcyB2d19jYWNoZV9hdHRyW1ZXX0NBQ0hFX01BWF07Ci1zdGF0aWMgV2luZG93IHZ3X2NhY2hlX3dpbltWV19DQUNIRV9NQVhdOwotCi1zdGF0aWMgdm9pZCBzZXRfYXR0cihYV2luZG93QXR0cmlidXRlcyAqYXR0ciwgaW50IGopIHsKLQltZW1jcHkoKHZvaWQgKikgKHZ3X2NhY2hlX2F0dHIraiksICh2b2lkICopIGF0dHIsCi0JICAgIHNpemVvZihYV2luZG93QXR0cmlidXRlcykpOwotfQotI2lmIDAKLXN0YXRpYyBpbnQgZ2V0X2F0dHIoWFdpbmRvd0F0dHJpYnV0ZXMgKmF0dHIsIGludCBqKSB7Ci0JbWVtY3B5KCh2b2lkICopIGF0dHIsICh2b2lkICopICh2d19jYWNoZV9hdHRyK2opLAotCSAgICBzaXplb2YoWFdpbmRvd0F0dHJpYnV0ZXMpKTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgWFdpbmRvd0F0dHJpYnV0ZXMgd2F0dHI7Ci0KLXN0YXRpYyBYV2luZG93QXR0cmlidXRlcyAqdndfbG9va3VwKFdpbmRvdyB3aW4pIHsKLQlzdGF0aWMgZG91YmxlIGxhc3RfcHVyZ2UgPSAwLjA7Ci0JZG91YmxlIG5vdzsKLQlpbnQgaSwgaiwgazsKLQotCWlmICh3aW4gPT0gTm9uZSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlub3cgPSBkbm93KCk7Ci0JaWYgKG5vdyA+IGxhc3RfcHVyZ2UgKyBjYWNoZV93aW4pIHsKLQkJbGFzdF9wdXJnZSA9IG5vdzsKLQkJZm9yIChpPTA7IGk8VldfQ0FDSEVfTUFYOyBpKyspIHsKLQkJCXZ3X2NhY2hlX3dpbltpXSA9IE5vbmU7Ci0JCX0KLQl9Ci0KLQlqID0gLTE7Ci0JayA9IC0xOwotCWZvciAoaT0wOyBpPFZXX0NBQ0hFX01BWDsgaSsrKSB7Ci0JCWlmICh2d19jYWNoZV93aW5baV0gPT0gd2luKSB7Ci0JCQlqID0gaTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHZ3X2NhY2hlX3dpbltpXSA9PSBOb25lKSB7Ci0JCQlrID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGogPj0gMCkgewotTVZfaGl0Kys7Ci0JCXJldHVybiB2d19jYWNoZV9hdHRyK2o7Ci0JCQotCX0gZWxzZSBpZiAoayA+PSAwKSB7Ci0JCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHIyOwotCQlpbnQgcmMgPSB2YWxpZF93aW5kb3cod2luLCAmYXR0cjIsIDEpOwotCQlpZiAocmMpIHsKLQkJCXZ3X2NhY2hlX3dpbltrXSA9IHdpbjsKLQkJCXNldF9hdHRyKCZhdHRyMiwgayk7Ci0JCQlyZXR1cm4gdndfY2FjaGVfYXR0citrOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBGdWxsICovCi0JCWludCByYyA9IHZhbGlkX3dpbmRvdyh3aW4sICZ3YXR0ciwgMSk7Ci0JCWlmIChyYykgewotCQkJcmV0dXJuICZ3YXR0cjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX2RlcHRoKFdpbmRvdyB3aW4sIFdpbmRvdyB0b3AsIGludCBkb2FsbCkgewotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHIsICpwYXR0cjsKLQotCS8qIGZpcnN0IHNlZSBpZiBpdCBpcyAoc3RpbGwpIGEgdmFsaWQgd2luZG93OiAqLwotTVZfY291bnQrKzsKLQotCWlmIChjYWNoZV93aW4gPiAwLjApIHsKLQkJcGF0dHIgPSB2d19sb29rdXAod2luKTsKLQkJaWYgKHBhdHRyID09IE5VTEwpIHsKLQkJCXJldHVybiAxOwkvKiBpbmRpY2F0ZSBkb25lICovCi0JCX0KLQl9IGVsc2UgewotCQlpZiAoISB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSkpIHsKLQkJCXJldHVybiAxOwkvKiBpbmRpY2F0ZSBkb25lICovCi0JCX0KLQkJcGF0dHIgPSAmYXR0cjsKLQl9Ci0KLQlpZiAoISBkb2FsbCAmJiBwYXR0ci0+bWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJLyoKLQkJICogc3RvcmUgcmVzdWx0cyBhbnl3YXkuLi4gIHRoaXMgbWF5IGxlYWQgdG8gdGFibGUKLQkJICogZmlsbGluZyB1cCwgYnV0IGN1cnJlbnRseSB0aGlzIGFsbG93cyB1cyB0byB1cGRhdGUKLQkJICogc3RhdGUgb2Ygb25ldGltZSBtYXBwZWQgd2luZG93cy4KLQkJICovCi0JCWNoZWNrX2RlcHRoX3dpbih3aW4sIHRvcCwgcGF0dHIpOwotCQlyZXR1cm4gMTsJLyogaW5kaWNhdGUgZG9uZSAqLwotCX0gZWxzZSBpZiAoY2hlY2tfZGVwdGhfd2luKHdpbiwgdG9wLCBwYXR0cikpIHsKLQkJcmV0dXJuIDE7CS8qIGluZGljYXRlIGRvbmUgKi8KLQl9IGVsc2UgewotCQlyZXR1cm4gMDsJLyogaW5kaWNhdGUgbm90IGRvbmUgKi8KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfZGVwdGhfd2luKFdpbmRvdyB3aW4sIFdpbmRvdyB0b3AsIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyKSB7Ci0JaW50IHN0b3JlX2l0ID0gMDsKLQkvKgotCSAqIG9ubHkgc3RvcmUgd2luZG93cyB3aXRoIGRlcHRoIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2aXN1YWwncwotCSAqIGRlcHRoIG5vdGUgc29tZSB3aW5kb3dzIGNhbiBoYXZlIGRlcHRoID09IDAgLi4uIChza2lwIHRoZW0pLgotCSAqLwotCWlmIChhdHRyLT5kZXB0aCA+IDApIHsKLQkJaWYgKGRlcHRoID09IDI0ICYmIGF0dHItPmRlcHRoICE9IDI0KSB7Ci0JCQlzdG9yZV9pdCA9IDE7Ci0JCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYgJiYgcm9vdF9jbWFwICYmIGF0dHItPmNvbG9ybWFwICE9IHJvb3RfY21hcCkgewotCQkJc3RvcmVfaXQgPSAxOwotCQl9Ci0JfQotCi0JaWYgKHN0b3JlX2l0KSB7Ci0JCWludCBpLCBqID0gLTEsIG5vbmUgPSAtMSwgbm9tYXAgPSAtMTsKLQkJaW50IG5ld2MgPSAwOwotCQlpZiAoYXR0ci0+bWFwX3N0YXRlID09IElzVmlld2FibGUpIHsKLQkJCS8qIGNvdW50IHRoZSB2aXNpYmxlIG9uZXM6ICovCi0JCQltdWx0aXZpc19jb3VudCsrOwotCQkJaWYgKGF0dHItPmRlcHRoID09IDI0KSB7Ci0JCQkJbXVsdGl2aXNfMjRjb3VudCsrOwotCQkJfQotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIm11bHRpdmlzOiAweCVseCAlZFxuIiwgd2luLCBhdHRyLT5kZXB0aCk7Ci0JCX0KLQotCQkvKiB0cnkgdG8gZmluZCBhIHRhYmxlIHNsb3QgZm9yIHRoaXMgd2luZG93OiAqLwotCQlmb3IgKGk9MDsgaSA8IE1BWF84QlBQX1dJTkRPV1M7IGkrKykgewotCQkJaWYgKG5vbmUgPCAwICYmIHdpbmRvd3NfOGJwcFtpXS53aW4gPT0gTm9uZSkgewotCQkJCS8qIGZvdW5kIGZpcnN0IE5vbmUgKi8KLQkJCQlub25lID0gaTsKLQkJCX0KLQkJCWlmICh3aW5kb3dzXzhicHBbaV0ud2luID09IHdpbikgewotCQkJCS8qIGZvdW5kIG15c2VsZiAqLwotCQkJCWogPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5vbWFwIDwgMCAmJiB3aW5kb3dzXzhicHBbaV0ud2luICE9IE5vbmUgJiYKLQkJCSAgICB3aW5kb3dzXzhicHBbaV0ubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCQkvKiBmb3VuZCBmaXJzdCB1bm1hcHBlZCAqLwotCQkJCW5vbWFwID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA8IDApIHsKLQkJCWlmIChhdHRyLT5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCS8qIG5vIHNsb3QgYW5kIG5vdCB2aXNpYmxlOiBub3Qgd29ydGgga2VlcGluZyAqLwotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChub25lID49IDApIHsKLQkJCQkvKiBwdXQgaXQgaW4gdGhlIGZpcnN0IE5vbmUgc2xvdCAqLwotCQkJCWogPSBub25lOwotCQkJCW5ld2MgPSAxOwotCQkJfSBlbHNlIGlmIChub21hcCA+PTApIHsKLQkJCQkvKiBwdXQgaXQgaW4gdGhlIGZpcnN0IHVubWFwcGVkIHNsb3QgKi8KLQkJCQlqID0gbm9tYXA7Ci0JCQl9Ci0JCQkvKiBvdGhlcndpc2Ugd2UgY2Fubm90IHN0b3JlIGl0Li4uICovCi0JCX0KLQotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIm11bHRpdmlzOiAweCVseCBtczogJWQgajogJWQgbm86ICVkIG5tOiAlZCBkZXA9JWRcbiIsIHdpbiwgYXR0ci0+bWFwX3N0YXRlLCBqLCBub25lLCBub21hcCwgYXR0ci0+ZGVwdGgpOwotCi0JCS8qIHN0b3JlIGlmIGlmIHdlIGZvdW5kIGEgc2xvdCBqOiAqLwotCQlpZiAoaiA+PSAwKSB7Ci0JCQlXaW5kb3cgdzsKLQkJCWludCB4LCB5OwotCQkJaW50IG5vd192aXMgPSAwOwotCi0JCQlpZiAoYXR0ci0+bWFwX3N0YXRlID09IElzVmlld2FibGUgJiYKLQkJCSAgICB3aW5kb3dzXzhicHBbal0ubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCQlub3dfdmlzID0gMTsKLQkJCX0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJtdWx0aXZpczogU1RPUkUgMHglbHggajogJTNkIG1zOiAlZCBkZXA9JWRcbiIsIHdpbiwgaiwgYXR0ci0+bWFwX3N0YXRlLCBhdHRyLT5kZXB0aCk7Ci0JCQl3aW5kb3dzXzhicHBbal0ud2luID0gd2luOwotCQkJd2luZG93c184YnBwW2pdLnRvcCA9IHRvcDsKLQkJCXdpbmRvd3NfOGJwcFtqXS5kZXB0aCA9IGF0dHItPmRlcHRoOwotCQkJd2luZG93c184YnBwW2pdLm1hcF9zdGF0ZSA9IGF0dHItPm1hcF9zdGF0ZTsKLQkJCXdpbmRvd3NfOGJwcFtqXS5jbWFwID0gYXR0ci0+Y29sb3JtYXA7Ci0JCQl3aW5kb3dzXzhicHBbal0ubWFwX2luc3RhbGxlZCA9IGF0dHItPm1hcF9pbnN0YWxsZWQ7Ci0JCQl3aW5kb3dzXzhicHBbal0udyA9IGF0dHItPndpZHRoOwotCQkJd2luZG93c184YnBwW2pdLmggPSBhdHRyLT5oZWlnaHQ7Ci0JCQl3aW5kb3dzXzhicHBbal0uZmV0Y2hlZCA9IDE7Ci0JCQl3aW5kb3dzXzhicHBbal0ubGFzdF9mZXRjaGVkID0gZG5vdygpOwotCi0JCQkvKiB0cmFuc2xhdGUgeCB5IHRvIGJlIFdSVCB0aGUgcm9vdCB3aW5kb3cgKG5vdCBwYXJlbnQpICovCi0JCQl4dHJhbnNsYXRlKHdpbiwgd2luZG93LCAwLCAwLCAmeCwgJnksICZ3LCAxKTsKLQkJCXdpbmRvd3NfOGJwcFtqXS54ID0geDsKLQkJCXdpbmRvd3NfOGJwcFtqXS55ID0geTsKLQotCQkJaWYgKG5ld2MgfHwgbm93X3ZpcykgewotaWYgKGRiMjQpIGZwcmludGYoc3RkZXJyLCAibmV3L25vd192aXM6IDB4JWx4ICVkLyVkXG4iLCB3aW4sIG5ld2MsIG5vd192aXMpOwotCQkJCS8qIG1hcmsgaXQgaW1tZWRpYXRlbHkgaWYgYSBuZXcgb25lOiAqLwotCQkJCVhfVU5MT0NLOwkvKiBkb250IGZvcmdldCB0aGUgZ2lhbnQgbG9jayAqLwotCQkJCW1hcmtfcmVjdF9hc19tb2RpZmllZCh4LCB5LCB4ICsgYXR0ci0+d2lkdGgsCi0JCQkJICAgIHkgKyBhdHRyLT5oZWlnaHQsIDApOwotCQkJCVhfTE9DSzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBFcnJvcjogY291bGQgbm90IGZpbmQgYSBzbG90LgotCQkJICogcGVyaGFwcyBrZWVwIGFnZSBhbmQgZXhwaXJlIG9sZCBvbmVzPz8KLQkJCSAqLwotaWYgKGRiMjQpIGZwcmludGYoc3RkZXJyLCAibXVsdGl2aXM6IENBTk5PVCBTVE9SRSAweCVseCBqPSVkXG4iLCB3aW4sIGopOwotCQkJZm9yIChpPTA7IGkgPCBNQVhfOEJQUF9XSU5ET1dTOyBpKyspIHsKLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgLS0tLS0tLS0tLS0tIDB4JWx4IGk9JWRcbiIsIHdpbmRvd3NfOGJwcFtpXS53aW4sIGkpOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBwb2xsaW5nIGxpbmUgWEltYWdlICovCi1zdGF0aWMgWEltYWdlICpwX3hpKFhJbWFnZSAqeGksIFZpc3VhbCAqdmlzdWFsLCBpbnQgd2luX2RlcHRoLCBpbnQgKncpIHsKLQlSQVdGQl9SRVQoTlVMTCkKLQotI2lmIE5PX1gxMQotCWlmICgheGkgfHwgIXZpc3VhbCB8fCAhd2luX2RlcHRoIHx8ICF3KSB7fQotCXJldHVybiBOVUxMOwotI2Vsc2UKLQlpZiAoeGkgPT0gTlVMTCB8fCAqdyA8IGRweV94KSB7Ci0JCWNoYXIgKmQ7Ci0JCWlmICh4aSkgewotCQkJWERlc3Ryb3lJbWFnZSh4aSk7Ci0JCX0KLQkJaWYgKHdpbl9kZXB0aCAhPSAyNCkgewotCQkJaWYgKHdpbl9kZXB0aCA+IDgpIHsKLQkJCQlkID0gKGNoYXIgKikgbWFsbG9jKGRweV94ICogMik7Ci0JCQl9IGVsc2UgewotCQkJCWQgPSAoY2hhciAqKSBtYWxsb2MoZHB5X3ggKiAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWQgPSAoY2hhciAqKSBtYWxsb2MoZHB5X3ggKiA0KTsKLQkJfQotCQkqdyA9IGRweV94OwotCQl4aSA9IFhDcmVhdGVJbWFnZShkcHksIHZpc3VhbCwgd2luX2RlcHRoLCBaUGl4bWFwLCAwLCBkLAotCQkgICAgZHB5X3gsIDEsIDgsIDApOwotCX0KLQlyZXR1cm4geGk7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyBpbnQgcG9sbF9saW5lKGludCB4MSwgaW50IHgyLCBpbnQgeTEsIGludCBuLCBzcmFSZWdpb25QdHIgbW9kKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUKDEpCi0JaWYgKCF4MSB8fCAheDIgfHwgIXkxIHx8ICFuIHx8ICFtb2QpIHt9Ci0JcmV0dXJuIDE7Ci0jZWxzZQotCWludCBmYWMsIG5fb2ZmLCB3LCB4bywgeW87Ci0JY2hhciAqcG9sbF9mYiwgKmRzdCwgKnNyYzsKLQlpbnQgdzIsIHhsLCB4aCwgc3RyaWRlID0gMzI7Ci0JaW50IGlucnVuID0gMCwgcngxID0gLTEsIHJ4MiA9IC0xOwotCi0Jc3RhdGljIFhJbWFnZSAqeGk4ID0gTlVMTCwgKnhpMjQgPSBOVUxMLCAqeGlfcjsKLQlzdGF0aWMgaW50IHhpOF93ID0gMCwgeGkyNF93ID0gMDsKLQotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCVhJbWFnZSAqeGk7Ci0JV2luZG93IGMsIHdpbiA9IHdpbmRvd3NfOGJwcFtuXS53aW47Ci0KLQlzdGF0aWMgWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQlzdGF0aWMgV2luZG93IGxhc3Rfd2luID0gTm9uZTsgCi0Jc3RhdGljIGRvdWJsZSBsYXN0X3RpbWUgPSAwLjA7Ci0JZG91YmxlIG5vdzsKLQotCXNyYVJlZ2lvblB0ciByZWN0OwotCWludCBteDEsIG14MiwgbXkxLCBteTI7Ci0JaW50IG5zID0gTlNDQU4vMjsKLQotCVJBV0ZCX1JFVCgxKQotCi0JaWYgKHdpbiA9PSBOb25lKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAod2luZG93c184YnBwW25dLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoISB4Z2V0aW1hZ2VfOHRvMjQpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JWF9MT0NLOwotCW5vdyA9IGRub3coKTsKLQlpZiAobGFzdF93aW4gIT0gTm9uZSAmJiB3aW4gPT0gbGFzdF93aW4gJiYgbm93IDwgbGFzdF90aW1lICsgMC41KSB7Ci0JCTsJLyogdXNlIHByZXZpb3VzIGF0dHIgKi8KLQl9IGVsc2UgewotCQlpZiAoISB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSkpIHsKLQkJCVhfVU5MT0NLOwotCQkJbGFzdF93aW4gPSBOb25lOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbGFzdF90aW1lID0gbm93OwotCQlsYXN0X3dpbiA9IHdpbjsKLQl9Ci0KLQlpZiAoYXR0ci5kZXB0aCA+IDE2ICYmIGF0dHIuZGVwdGggIT0gMjQpIHsKLQkJWF9VTkxPQ0s7Ci0JCXJldHVybiAxOwotCX0gZWxzZSBpZiAoYXR0ci5kZXB0aCA8PSAxNikgewotCQl4aSA9IHhpOCA9IHBfeGkoeGk4LCBhdHRyLnZpc3VhbCwgYXR0ci5kZXB0aCwgJnhpOF93KTsKLQotCQlwb2xsX2ZiID0gcG9sbDhfZmI7Ci0JCWlmIChhdHRyLmRlcHRoID4gOCkgewotCQkJZmFjID0gMjsKLQkJfSBlbHNlIHsKLQkJCWZhYyA9IDE7Ci0JCX0KLQkJbl9vZmYgPSBwb2xsOF9mYl93ICogeTEgKyB4MTsKLQl9IGVsc2UgewotCQl4aSA9IHhpMjQgPSBwX3hpKHhpMjQsIGF0dHIudmlzdWFsLCAyNCwgJnhpMjRfdyk7Ci0KLQkJcG9sbF9mYiA9IHBvbGwyNF9mYjsKLQkJZmFjID0gNDsKLQkJbl9vZmYgPSBwb2xsMjRfZmJfdyAqIHkxICsgeDE7Ci0JfQotCi0Jb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0KLQkvKiB4dHJhbnNsYXRlKCkgbm90IHVzZWQgdG8gc2F2ZSB0d28gWFNldEVycm9ySGFuZGxlciBjYWxscyAqLwotCVhUcmFuc2xhdGVDb29yZGluYXRlcyhkcHksIHdpbiwgd2luZG93LCAwLCAwLCAmeG8sICZ5bywgJmMpOwotCi0JeG8gPSB4MSAtIHhvOwotCXlvID0geTEgLSB5bzsKLQl3ID0geDIgLSB4MTsKLQotCWlmICh0cmFwcGVkX3hlcnJvciB8fCB4byA8IDAgfHwgeW8gPCAwIHx8IHhvICsgdyA+IGF0dHIud2lkdGgpIHsKLWlmIChkYjI0ID4gMikgZnByaW50ZihzdGRlcnIsICJhdm9pZCBiYWQgbWF0Y2guLi5cbiIpOwotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlYX1VOTE9DSzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCXhpX3IgPSBYR2V0U3ViSW1hZ2UoZHB5LCB3aW4sIHhvLCB5bywgdywgMSwgQWxsUGxhbmVzLCBaUGl4bWFwLCB4aSwKLQkgICAgMCwgMCk7Ci0JWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0KLQlYX1VOTE9DSzsKLQotCWlmICghIHhpX3IgfHwgdHJhcHBlZF94ZXJyb3IpIHsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCi0Jc3JjID0geGktPmRhdGE7Ci0JZHN0ID0gcG9sbF9mYiArIGZhYyAqIG5fb2ZmOwotCi0JaW5ydW4gPSAwOwotCi0JeGwgPSB4MTsKLQl3aGlsZSAoeGwgPCB4MikgewotCQl4aCA9IHhsICsgc3RyaWRlOwotCQlpZiAoeGggPiB4MikgewotCQkJeGggPSB4MjsKLQkJfQotCQl3MiA9IHhoIC0geGw7Ci0JCWlmIChtZW1jbXAoZHN0LCBzcmMsIGZhYyAqIHcyKSkgewotCQkJaWYgKGlucnVuKSB7Ci0JCQkJcngyID0geGg7Ci0JCQl9IGVsc2UgewotCQkJCXJ4MSA9IHhsOwotCQkJCXJ4MiA9IHhoOwotCQkJCWlucnVuID0gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChpbnJ1bikgewotCQkJCW14MSA9IHJ4MTsKLQkJCQlteDIgPSByeDI7Ci0JCQkJbXkxID0gbmZpeCh5MSAtIG5zLCBkcHlfeSk7Ci0JCQkJbXkyID0gbmZpeCh5MSArIG5zLCBkcHlfeSsxKTsKLQotCQkJCXJlY3QgPSBzcmFSZ25DcmVhdGVSZWN0KG14MSwgbXkxLCBteDIsIG15Mik7Ci0JCQkJc3JhUmduT3IobW9kLCByZWN0KTsKLQkJCQlzcmFSZ25EZXN0cm95KHJlY3QpOwkKLQkJCQlpbnJ1biA9IDA7Ci0JCQl9Ci0JCX0KLQotCQl4bCArPSBzdHJpZGU7Ci0JCWRzdCArPSBmYWMgKiBzdHJpZGU7Ci0JCXNyYyArPSBmYWMgKiBzdHJpZGU7Ci0JfQotCi0JaWYgKGlucnVuKSB7Ci0JCW14MSA9IHJ4MTsKLQkJbXgyID0gcngyOwotCQlteTEgPSBuZml4KHkxIC0gbnMsIGRweV95KTsKLQkJbXkyID0gbmZpeCh5MSArIG5zLCBkcHlfeSsxKTsKLQotCQlyZWN0ID0gc3JhUmduQ3JlYXRlUmVjdChteDEsIG15MSwgbXgyLCBteTIpOwotCQlzcmFSZ25Pcihtb2QsIHJlY3QpOwotCQlzcmFSZ25EZXN0cm95KHJlY3QpOwkKLQl9Ci0JcmV0dXJuIDE7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyB2b2lkIHBvbGxfbGluZV9jb21wbGVtZW50KGludCB4MSwgaW50IHgyLCBpbnQgeTEsIHNyYVJlZ2lvblB0ciBtb2QpIHsKLQlpbnQgbl9vZmYsIHcsIHhsLCB4aCwgc3RyaWRlID0gMzI7Ci0JY2hhciAqZHN0LCAqc3JjOwotCWludCBpbnJ1biA9IDAsIHJ4MSA9IC0xLCByeDIgPSAtMTsKLQlzcmFSZWdpb25QdHIgcmVjdDsKLQlpbnQgbXgxLCBteDIsIG15MSwgbXkyOwotCWludCBucyA9IE5TQ0FOLzI7Ci0KLQlpZiAoZGVwdGggIT0gMjQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBjbWFwOHRvMjRfZmIpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISB4Z2V0aW1hZ2VfOHRvMjQpIHsKLQkJcmV0dXJuOwotCX0KLQotCW5fb2ZmID0gbWFpbl9ieXRlc19wZXJfbGluZSAqIHkxICsgNCAqIHgxOwotCi0Jc3JjID0gbWFpbl9mYiArIG5fb2ZmOwotCWRzdCA9IGNtYXA4dG8yNF9mYiArIG5fb2ZmOwotCi0JaW5ydW4gPSAwOwotCi0JeGwgPSB4MTsKLQl3aGlsZSAoeGwgPCB4MikgewotCQl4aCA9IHhsICsgc3RyaWRlOwotCQlpZiAoeGggPiB4MikgewotCQkJeGggPSB4MjsKLQkJfQotCQl3ID0geGggLSB4bDsKLQkJaWYgKG1lbWNtcChkc3QsIHNyYywgNCAqIHcpKSB7Ci0JCQlpZiAoaW5ydW4pIHsKLQkJCQlyeDIgPSB4aDsKLQkJCX0gZWxzZSB7Ci0JCQkJcngxID0geGw7Ci0JCQkJcngyID0geGg7Ci0JCQkJaW5ydW4gPSAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGlucnVuKSB7Ci0JCQkJbXgxID0gcngxOwotCQkJCW14MiA9IHJ4MjsKLQkJCQlteTEgPSBuZml4KHkxIC0gbnMsIGRweV95KTsKLQkJCQlteTIgPSBuZml4KHkxICsgbnMsIGRweV95KzEpOwotCi0JCQkJcmVjdCA9IHNyYVJnbkNyZWF0ZVJlY3QobXgxLCBteTEsIG14MiwgbXkyKTsKLQkJCQlzcmFSZ25Pcihtb2QsIHJlY3QpOwotCQkJCXNyYVJnbkRlc3Ryb3kocmVjdCk7CQotCi0JCQkJaW5ydW4gPSAwOwotCQkJfQotCQl9Ci0KLQkJeGwgKz0gc3RyaWRlOwotCQlkc3QgKz0gNCAqIHN0cmlkZTsKLQkJc3JjICs9IDQgKiBzdHJpZGU7Ci0JfQotCi0JaWYgKGlucnVuKSB7Ci0JCW14MSA9IHJ4MTsKLQkJbXgyID0gcngyOwotCQlteTEgPSBuZml4KHkxIC0gbnMsIGRweV95KTsKLQkJbXkyID0gbmZpeCh5MSArIG5zLCBkcHlfeSsxKTsKLQotCQlyZWN0ID0gc3JhUmduQ3JlYXRlUmVjdChteDEsIG15MSwgbXgyLCBteTIpOwotCQlzcmFSZ25Pcihtb2QsIHJlY3QpOwotCQlzcmFSZ25EZXN0cm95KHJlY3QpOwkKLQotCQlpbnJ1biA9IDA7Ci0JfQotfQotCi0jZGVmaW5lIENNQVBNQVggNjQKLXN0YXRpYyBDb2xvcm1hcCBjbWFwc1tDTUFQTUFYXTsKLXN0YXRpYyBpbnQgbmNtYXBzOwotCi1zdGF0aWMgaW50IHBvbGxfOGJwcChzcmFSZWdpb25QdHIgbW9kLCBpbnQgdmFsaWRhdGUpIHsKLQlpbnQgaSwgeSwgeXNoLCBtYXBfY291bnQ7Ci0Jc3RhdGljIGludCB5Y250ID0gMDsKLQlzcmFSZWdpb25QdHIgbGluZTsKLQlzcmFSZWN0IHJlY3Q7Ci0Jc3JhUmVjdGFuZ2xlSXRlcmF0b3IgKml0ZXI7Ci0JaW50IGJyID0gMCwgYXJlYSA9IDA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X2NhbGwgPSAwLjA7Ci0JCi0JbWFwX2NvdW50ID0gZ2V0XzhicHBfcmVnaW9ucyh2YWxpZGF0ZSk7Ci0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJwb2xsXzhicHAgbWM6ICVkXG4iLCBtYXBfY291bnQpOwotCi0JaWYgKCEgbWFwX2NvdW50KSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXNldF9wb2xsX2ZiKCk7Ci0KLQl5c2ggPSBzY2FubGluZXNbKHljbnQrKykgJSBOU0NBTl07Ci1pZiAoZGIyNCA+IDIpIGZwcmludGYoc3RkZXJyLCAicG9sbF84YnBwOiB5c2g6ICUyZCAgJS40ZlxuIiwgeXNoLCBkbm93KCkgLSBsYXN0X2NhbGwpOwotCWxhc3RfY2FsbCA9IGRub3coKTsKLQotCWZvciAoaT0wOyBpIDwgTUFYXzhCUFBfV0lORE9XUzsgaSsrKSB7Ci0JCXNyYVJlZ2lvblB0ciByZWcgPSB3aW5kb3dzXzhicHBbaV0uY2xpcF9yZWdpb247Ci0KLQkJaWYgKCEgcmVnIHx8IHNyYVJnbkVtcHR5KHJlZykpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXkgPSB5c2g7Ci0JCXdoaWxlICh5IDwgZHB5X3kpIHsKLQkJCWxpbmUgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIHksIGRweV94LCB5KzEpOwotCi0JCQlpZiAoc3JhUmduQW5kKGxpbmUsIHJlZykpIHsKLQkJCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IobGluZSk7Ci0JCQkJd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCQkJaWYgKCEgcG9sbF9saW5lKHJlY3QueDEsIHJlY3QueDIsCi0JCQkJCSAgICByZWN0LnkxLCBpLCBtb2QpKSB7Ci0JCQkJCQliciA9IDE7Ci0JCQkJCQlicmVhazsJLyogZXhjZXB0aW9uICovCi0JCQkJCX0KLQkJCQl9Ci0JCQkJc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCQkJfQotCi0JCQlzcmFSZ25EZXN0cm95KGxpbmUpOwotCQkJeSArPSBOU0NBTjsKLQkJCWlmIChicikgYnJlYWs7Ci0JCX0KLQkJaWYgKGJyKSBicmVhazsKLQl9Ci0KLQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IobW9kKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQlhcmVhICs9IG5hYnMoKHJlY3QueDIgLSByZWN0LngxKSoocmVjdC55MiAtIHJlY3QueTEpKTsKLQl9Ci0Jc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCi0JcmV0dXJuIGFyZWE7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvbGxfOGJwcF9jb21wbGVtZW50KHNyYVJlZ2lvblB0ciBtb2QpIHsKLQlpbnQgaSwgeSwgeXNoOwotCXN0YXRpYyBpbnQgeWNudCA9IDA7Ci0Jc3JhUmVnaW9uUHRyIGRpc3AsIGxpbmU7Ci0Jc3JhUmVjdCByZWN0OwotCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCi0JZGlzcCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQotCXlzaCA9IHNjYW5saW5lc1soeWNudCsrKSAlIE5TQ0FOXTsKLQotCWZvciAoaT0wOyBpIDwgTUFYXzhCUFBfV0lORE9XUzsgaSsrKSB7Ci0JCXNyYVJlZ2lvblB0ciByZWcgPSB3aW5kb3dzXzhicHBbaV0uY2xpcF9yZWdpb247Ci0KLQkJaWYgKCEgcmVnKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAod2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQljb250aW51ZTsJCi0JCX0KLQkJc3JhUmduU3VidHJhY3QoZGlzcCwgcmVnKTsKLQl9Ci0KLQl5ID0geXNoOwotCXdoaWxlICh5IDwgZHB5X3kpIHsKLQkJbGluZSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgeSwgZHB5X3gsIHkrMSk7Ci0KLQkJaWYgKHNyYVJnbkFuZChsaW5lLCBkaXNwKSkgewotCQkJaXRlciA9IHNyYVJnbkdldEl0ZXJhdG9yKGxpbmUpOwotCQkJd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCQlwb2xsX2xpbmVfY29tcGxlbWVudChyZWN0LngxLCByZWN0LngyLAotCQkJCSAgICByZWN0LnkxLCBtb2QpOwotCQkJfQotCQkJc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCQl9Ci0KLQkJc3JhUmduRGVzdHJveShsaW5lKTsKLQotCQl5ICs9IE5TQ0FOOwotCX0KLQotCXNyYVJnbkRlc3Ryb3koZGlzcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hcmtfcmduX3JlY3RzKHNyYVJlZ2lvblB0ciBtb2QpIHsKLQlzcmFSZWN0IHJlY3Q7Ci0Jc3JhUmVjdGFuZ2xlSXRlcmF0b3IgKml0ZXI7Ci0JaW50IGFyZWEgPSAwOwotCi0JaWYgKHNyYVJnbkVtcHR5KG1vZCkpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IobW9kKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQocmVjdC54MSwgcmVjdC55MSwgcmVjdC54MiwgcmVjdC55MiwgMCk7Ci0JCWFyZWEgKz0gbmFicygocmVjdC54MiAtIHJlY3QueDEpKihyZWN0LnkyIC0gcmVjdC55MSkpOwotCX0KLQlzcmFSZ25SZWxlYXNlSXRlcmF0b3IoaXRlcik7Ci0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICIgbWFya19yZ25fcmVjdHMgYXJlYTogJWRcbiIsIGFyZWEpOwotfQotCi1zdGF0aWMgaW50IGdldF84YnBwX3JlZ2lvbnMoaW50IHZhbGlkYXRlKSB7Ci0KLQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCWludCBpLCBrLCBtYXBjb3VudCA9IDA7Ci0KLQkvKiBpbml0aWFsaXplIGNvbG9yIG1hcCBsaXN0ICovCi0JbmNtYXBzID0gMDsKLQlmb3IgKGk9MDsgaSA8IENNQVBNQVg7IGkrKykgewotCQljbWFwc1tpXSA9IChDb2xvcm1hcCkgMDsKLQl9Ci0KLQkvKiBsb29wIG92ZXIgdGhlIHRhYmxlIG9mIDhicHAgd2luZG93czogKi8KLQlmb3IgKGk9MDsgaSA8IE1BWF84QlBQX1dJTkRPV1M7IGkrKykgewotCQlzcmFSZWdpb25QdHIgdG1wX3JlZywgdG1wX3JlZzI7Ci0JCVdpbmRvdyBjLCB3ID0gd2luZG93c184YnBwW2ldLndpbjsKLQkJaW50IHgsIHk7Ci0KLQkJaWYgKHdpbmRvd3NfOGJwcFtpXS5jbGlwX3JlZ2lvbikgewotCQkJc3JhUmduRGVzdHJveSh3aW5kb3dzXzhicHBbaV0uY2xpcF9yZWdpb24pOwkKLQkJfQotCQl3aW5kb3dzXzhicHBbaV0uY2xpcF9yZWdpb24gPSBOVUxMOwotCi0JCWlmICh3ID09IE5vbmUpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJnZXRfOGJwcF9yZWdpb25zOiAweCVseCBtcz0lZCBkZXA9JWQgaT0lZFxuIiwgdywgd2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSwgd2luZG93c184YnBwW2ldLmRlcHRoLCBpKTsKLQkJaWYgKHZhbGlkYXRlKSB7Ci0JCQkvKgotCQkJICogdGhpcyBjb3VsZCBiZSBzbG93OiB2YWxpZGF0aW5nIDhicHAgd2luZG93cyBlYWNoCi0JCQkgKiB0aW1lLi4uCi0JCQkgKi8KLQotCQkJWF9MT0NLOwotCQkJaWYgKCEgdmFsaWRfd2luZG93KHcsICZhdHRyLCAxKSkgewotCQkJCVhfVU5MT0NLOwotCQkJCXdpbmRvd3NfOGJwcFtpXS53aW4gPSBOb25lOwotCQkJCXdpbmRvd3NfOGJwcFtpXS50b3AgPSBOb25lOwotCQkJCXdpbmRvd3NfOGJwcFtpXS5tYXBfc3RhdGUgPSBJc1VubWFwcGVkOwotCQkJCXdpbmRvd3NfOGJwcFtpXS5jbWFwID0gKENvbG9ybWFwKSAwOwotCQkJCXdpbmRvd3NfOGJwcFtpXS5mZXRjaGVkID0gMDsKLQkJCQl3aW5kb3dzXzhicHBbaV0ubGFzdF9mZXRjaGVkID0gLTEuMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVhfVU5MT0NLOwotCi0JCQl3aW5kb3dzXzhicHBbaV0uZGVwdGggPSBhdHRyLmRlcHRoOwotCQkJd2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSA9IGF0dHIubWFwX3N0YXRlOwotCQkJd2luZG93c184YnBwW2ldLmNtYXAgPSBhdHRyLmNvbG9ybWFwOwotCQkJd2luZG93c184YnBwW2ldLm1hcF9pbnN0YWxsZWQgPSBhdHRyLm1hcF9pbnN0YWxsZWQ7Ci0JCQl3aW5kb3dzXzhicHBbaV0udyA9IGF0dHIud2lkdGg7Ci0JCQl3aW5kb3dzXzhicHBbaV0uaCA9IGF0dHIuaGVpZ2h0OwotCQkJd2luZG93c184YnBwW2ldLmZldGNoZWQgPSAxOwotCQkJd2luZG93c184YnBwW2ldLmxhc3RfZmV0Y2hlZCA9IGRub3coKTsKLQotCQkJaWYgKGF0dHIubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJWF9MT0NLOwotCQkJeHRyYW5zbGF0ZSh3LCB3aW5kb3csIDAsIDAsICZ4LCAmeSwgJmMsIDEpOwotCQkJWF9VTkxPQ0s7Ci0JCQl3aW5kb3dzXzhicHBbaV0ueCA9IHg7Ci0JCQl3aW5kb3dzXzhicHBbaV0ueSA9IHk7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIHRoaXMgd2lsbCBiZSBmYXN0ZXI6IG5vIGNhbGwgdG8gWCBzZXJ2ZXI6ICovCi0JCQlpZiAod2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhdHRyLmRlcHRoID0gd2luZG93c184YnBwW2ldLmRlcHRoOwotCQkJYXR0ci5tYXBfc3RhdGUgPSB3aW5kb3dzXzhicHBbaV0ubWFwX3N0YXRlOwotCQkJYXR0ci5jb2xvcm1hcCA9IHdpbmRvd3NfOGJwcFtpXS5jbWFwOwotCQkJYXR0ci5tYXBfaW5zdGFsbGVkID0gd2luZG93c184YnBwW2ldLm1hcF9pbnN0YWxsZWQ7Ci0JCQlhdHRyLndpZHRoID0gd2luZG93c184YnBwW2ldLnc7Ci0JCQlhdHRyLmhlaWdodCA9IHdpbmRvd3NfOGJwcFtpXS5oOwotCi0JCQl4ID0gIHdpbmRvd3NfOGJwcFtpXS54OyAKLQkJCXkgPSAgd2luZG93c184YnBwW2ldLnk7IAotCQl9Ci0KLQkJbWFwY291bnQrKzsKLQotCQkvKiB0bXAgcmVnaW9uIGZvciB0aGlzIDhicHAgcmVjdGFuZ2xlOiAqLwotCQl0bXBfcmVnID0gc3JhUmduQ3JlYXRlUmVjdChuZml4KHgsIGRweV94KSwgbmZpeCh5LCBkcHlfeSksCi0JCSAgICBuZml4KHggKyBhdHRyLndpZHRoLCBkcHlfeCsxKSwgbmZpeCh5ICsgYXR0ci5oZWlnaHQsIGRweV95KzEpKTsKLQotCQkvKiBsb29wIG92ZXIgYWxsIHRvcGxldmVscywgdG9wIHRvIGJvdHRvbSBjbGlwcGluZzogKi8KLQkJZm9yIChrID0gc3RhY2tfbGlzdF9udW0gLSAxOyBrID49IDA7IGstLSkgewotCQkJV2luZG93IHN3aW4gPSBzdGFja19saXN0W2tdLndpbjsKLQkJCWludCBzeCwgc3ksIHN3LCBzaDsKLQotaWYgKGRiMjQgPiAxICYmIHN0YWNrX2xpc3Rba10ubWFwX3N0YXRlID09IElzVmlld2FibGUpIGZwcmludGYoc3RkZXJyLCAiU3RhY2sgd2luOiAweCVseCAlZCBpdj0lZFxuIiwgc3dpbiwgaywgc3RhY2tfbGlzdFtrXS5tYXBfc3RhdGUpOwotCi0JCQlpZiAoc3dpbiA9PSB3aW5kb3dzXzhicHBbaV0udG9wKSB7Ci0JCQkJLyogZm91bmQgb3VyIHRvcCBsZXZlbDogd2Ugc2tpcCB0aGUgcmVzdC4gKi8KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJmb3VuZCB0b3A6IDB4JWx4ICVkIGl2PSVkXG4iLCBzd2luLCBrLCBzdGFja19saXN0W2tdLm1hcF9zdGF0ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhY2tfbGlzdFtrXS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCS8qIHNraXAgdW5tYXBwZWQgb25lczogKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogbWFrZSBhIHRlbXAgcmVjdCBmb3IgdGhpcyB0b3BsZXZlbDogKi8KLQkJCXN4ID0gc3RhY2tfbGlzdFtrXS54OwotCQkJc3kgPSBzdGFja19saXN0W2tdLnk7Ci0JCQlzdyA9IHN0YWNrX2xpc3Rba10ud2lkdGg7Ci0JCQlzaCA9IHN0YWNrX2xpc3Rba10uaGVpZ2h0OwotCi1pZiAoZGIyNCA+IDEpIGZwcmludGYoc3RkZXJyLCAic3VidHJhY3Q6ICAweCVseCAlZCAtLSAlZCAlZCAlZCAlZFxuIiwgc3dpbiwgaywgc3gsIHN5LCBzdywgc2gpOwotCi0JCQl0bXBfcmVnMiA9IHNyYVJnbkNyZWF0ZVJlY3QobmZpeChzeCwgZHB5X3gpLAotCQkJICAgIG5maXgoc3ksIGRweV95KSwgbmZpeChzeCArIHN3LCBkcHlfeCsxKSwKLQkJCSAgICBuZml4KHN5ICsgc2gsIGRweV95KzEpKTsKLQotCQkJLyogc3VidHJhY3QgaXQgZnJvbSB0aGUgOGJwcCB3aW5kb3cgcmVnaW9uICovCi0JCQlzcmFSZ25TdWJ0cmFjdCh0bXBfcmVnLCB0bXBfcmVnMik7Ci0KLQkJCXNyYVJnbkRlc3Ryb3kodG1wX3JlZzIpOwotCi0JCQlpZiAoc3JhUmduRW1wdHkodG1wX3JlZykpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzcmFSZ25FbXB0eSh0bXBfcmVnKSkgewotCQkJLyogc2tpcCB0aGlzIDhicHAgaWYgY29tcGxldGVseSBjbGlwcGVkIGF3YXk6ICovCi0JCQlzcmFSZ25EZXN0cm95KHRtcF9yZWcpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBvdGhlcndpc2UsIHN0b3JlIGFueSBuZXcgY29sb3JtYXBzOiAqLwotCQlpZiAobmNtYXBzIDwgQ01BUE1BWCAmJiBhdHRyLmNvbG9ybWFwICE9IChDb2xvcm1hcCkgMCkgewotCQkJaW50IG0sIHNlZW4gPSAwOwotCQkJZm9yIChtPTA7IG0gPCBuY21hcHM7IG0rKykgewotCQkJCWlmIChjbWFwc1ttXSA9PSBhdHRyLmNvbG9ybWFwKSB7Ci0JCQkJCXNlZW4gPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXNlZW4gJiYgYXR0ci5kZXB0aCA8PSAxNikgewotCQkJCS8qIHN0b3JlIG9ubHkgbmV3IG9uZXM6ICovCi0JCQkJY21hcHNbbmNtYXBzKytdID0gYXR0ci5jb2xvcm1hcDsKLQkJCX0KLQkJfQotCi0JCXdpbmRvd3NfOGJwcFtpXS5jbGlwX3JlZ2lvbiA9IHRtcF9yZWc7Ci0JfQotCi0JcmV0dXJuIG1hcGNvdW50OwotfQotCi1zdGF0aWMgWENvbG9yICpjb2xvcltDTUFQTUFYXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgKnJnYltDTUFQTUFYXTsKLXN0YXRpYyBpbnQgY21hcF9mYWlsZWRbQ01BUE1BWF07Ci1zdGF0aWMgaW50IGNvbG9yX2luaXQgPSAwOwotaW50IGhpc3RvWzY1NTM2XTsKLQotc3RhdGljIGludCBnZXRfY21hcChpbnQgaiwgQ29sb3JtYXAgY21hcCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVCgwKQotCWlmICghaiB8fCAhY21hcCkge30KLQlyZXR1cm4gMDsKLSNlbHNlCi0JaW50IGksIG5jZWxscywgbmNvbG9yOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAoZGVwdGggPiAxNikgewotCQkvKiAyNCAqLwotCQluY29sb3IgPSBOQ09MT1I7Ci0JfSBlbHNlIGlmIChkZXB0aCA+IDgpIHsKLQkJbmNvbG9yID0gMSA8PCBkZXB0aDsKLQl9IGVsc2UgewotCQluY29sb3IgPSBOQ09MT1I7Ci0JfQotCWlmICghY29sb3JfaW5pdCkgewotCQlpbnQgY207Ci0JCWZvciAoY20gPSAwOyBjbSA8IENNQVBNQVg7IGNtKyspIHsKLQkJCWNvbG9yW2NtXSA9IChYQ29sb3IgKikgbWFsbG9jKG5jb2xvciAqIHNpemVvZihYQ29sb3IpKTsKLQkJCXJnYltjbV0gPSAodW5zaWduZWQgaW50ICopIG1hbGxvYyhuY29sb3IgKiBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0JCX0KLQkJY29sb3JfaW5pdCA9IDE7Ci0JfQotCi0JaWYgKGRlcHRoIDw9IDE2KSB7Ci0JCS8qIG5vdCB3b3JraW5nIHByb3Blcmx5IGZvciBkZXB0aCAyNC4uLiAqLwotCQlYX0xPQ0s7Ci0JCW5jZWxscyA9IENlbGxzT2ZTY3JlZW4oU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSk7Ci0JCVhfVU5MT0NLOwotCX0gZWxzZSB7Ci0JCW5jZWxscyA9IE5DT0xPUjsKLQl9Ci0KLQlpZiAoZGVwdGggPiAxNikgewotCQk7Ci0JfSBlbHNlIGlmIChuY2VsbHMgPiBuY29sb3IpIHsKLQkJbmNlbGxzID0gbmNvbG9yOwotCX0gZWxzZSBpZiAobmNlbGxzID09IDggJiYgZGVwdGggIT0gMykgewotCQkvKiBYWFguIHNlZSBzZXRfY29sb3JtYXAoKSAqLwotCQluY2VsbHMgPSAxIDw8IGRlcHRoOwotCX0KLQotCS8qIGluaXRpYWxpemUgWENvbG9yIGFycmF5OiAqLwotCWZvciAoaT0wOyBpIDwgbmNlbGxzOyBpKyspIHsKLQkJY29sb3Jbal1baV0ucGl4ZWwgPSBpOwotCQljb2xvcltqXVtpXS5wYWQgPSAwOwotCX0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJnZXRfY21hcDogJWQgMHgleCBuY29sb3I9JWQgbmNlbGxzPSVkXG4iLCBqLCAodW5zaWduZWQgaW50KSBjbWFwLCBuY29sb3IsIG5jZWxscyk7Ci0KLQkvKiB0cnkgdG8gcXVlcnkgdGhlIGNvbG9ybWFwLCB0cmFwIGVycm9ycyAqLwotCVhfTE9DSzsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0Jb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQlYUXVlcnlDb2xvcnMoZHB5LCBjbWFwLCBjb2xvcltqXSwgbmNlbGxzKTsKLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQlYX1VOTE9DSzsKLQotCWlmICh0cmFwcGVkX3hlcnJvcikgewotCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0KLQkvKiBub3cgbWFwIGVhY2ggaW5kZXggdG8gZGVwdGggMjQgUkdCICovCi0JZm9yIChpPTA7IGkgPCBuY2VsbHM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgcmVkLCBncmVlbiwgYmx1ZTsKLQkJLyogc3RyaXAgb3V0IGhpZ2hlc3QgOCBiaXRzIG9mIHZhbHVlczogKi8KLQkJcmVkICAgPSAoY29sb3Jbal1baV0ucmVkICAgJiAweGZmMDApID4+IDg7Ci0JCWdyZWVuID0gKGNvbG9yW2pdW2ldLmdyZWVuICYgMHhmZjAwKSA+PiA4OwotCQlibHVlICA9IChjb2xvcltqXVtpXS5ibHVlICAmIDB4ZmYwMCkgPj4gODsKLQotCQkvKgotCQkgKiB0aGUgbWF4ZXMgc2hvdWxkIGJlIGF0IDI1NSBhbHJlYWR5LAotCQkgKiBidXQganVzdCBpbiBjYXNlLi4uCi0JCSAqLwotCQlyZWQgICA9IChtYWluX3JlZF9tYXggICAqIHJlZCAgKS8yNTU7Ci0JCWdyZWVuID0gKG1haW5fZ3JlZW5fbWF4ICogZ3JlZW4pLzI1NTsKLQkJYmx1ZSAgPSAobWFpbl9ibHVlX21heCAgKiBibHVlICkvMjU1OwotCi1pZiAoZGIyNCA+IDIpIGZwcmludGYoc3RkZXJyLCAiIGNtYXBbJTAyZF1bJTAzZF06ICUwM2QgJTAzZCAlMDNkICAweCUwOHggXG4iLCBqLCBpLCByZWQsIGdyZWVuLCBibHVlLCAoIHJlZCA8PCBtYWluX3JlZF9zaGlmdCB8IGdyZWVuIDw8IG1haW5fZ3JlZW5fc2hpZnQgfCBibHVlIDw8IG1haW5fYmx1ZV9zaGlmdCkpOwotCi0JCS8qIHNoaWZ0IHRoZW0gb3ZlciBhbmQgb3IgdG9nZXRoZXIgZm9yIHZhbHVlICovCi0JCXJlZCAgID0gcmVkICAgIDw8IG1haW5fcmVkX3NoaWZ0OwotCQlncmVlbiA9IGdyZWVuICA8PCBtYWluX2dyZWVuX3NoaWZ0OwotCQlibHVlICA9IGJsdWUgICA8PCBtYWluX2JsdWVfc2hpZnQ7Ci0KLQkJLyogc3RvcmUgaXQgaW4gdGhlIGFycmF5IHRvIGJlIHVzZWQgbGF0ZXIgKi8KLQkJcmdiW2pdW2ldID0gcmVkIHwgZ3JlZW4gfCBibHVlOwotCX0KLQlyZXR1cm4gMTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotc3RhdGljIHZvaWQgZG9fOGJwcF9yZWdpb24oaW50IG4sIHNyYVJlZ2lvblB0ciBtYXJrKSB7Ci0JaW50IGssIGNtID0gLTEsIGZhaWxlZCA9IDA7Ci0Jc3JhUmVjdGFuZ2xlSXRlcmF0b3IgKml0ZXI7Ci0Jc3JhUmVnaW9uUHRyIGNsaXA7Ci0Jc3JhUmVjdCByZWN0OwotCi0JaWYgKCEgd2luZG93c184YnBwW25dLmNsaXBfcmVnaW9uKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHdpbmRvd3NfOGJwcFtuXS53aW4gPT0gTm9uZSkgewotCQlyZXR1cm47Ci0JfQotCWlmICh3aW5kb3dzXzhicHBbbl0ubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJcmV0dXJuOwotCX0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJuY21hcHM6ICVkXG4iLCBuY21hcHMpOwotCi0JLyogc2VlIGlmIFhRdWVyeUNvbG9ycyBmYWlsZWQ6ICovCi0JZm9yIChrPTA7IGs8bmNtYXBzOyBrKyspIHsKLQkJaWYgKHdpbmRvd3NfOGJwcFtuXS5jbWFwID09IGNtYXBzW2tdKSB7Ci0JCQljbSA9IGs7Ci0JCQlpZiAoY21hcF9mYWlsZWRba10pIHsKLQkJCQlmYWlsZWQgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAod2luZG93c184YnBwW25dLmRlcHRoICE9IDI0KSB7CS8qIDI0IHdvbid0IGhhdmUgYSBjbWFwICovCi0JCWlmIChmYWlsZWQgfHwgY20gPT0gLTEpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWNsaXAgPSBzcmFSZ25DcmVhdGVSZ24obWFyayk7Ci0Jc3JhUmduQW5kKGNsaXAsIHdpbmRvd3NfOGJwcFtuXS5jbGlwX3JlZ2lvbik7Ci0KLQkvKiBsb29wIG92ZXIgdGhlIHJlY3RhbmdsZXMgbWFraW5nIHVwIHJlZ2lvbiAqLwotCWl0ZXIgPSBzcmFSZ25HZXRJdGVyYXRvcihjbGlwKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQlpZiAocmVjdC54MSA+IHJlY3QueDIpIHsKLQkJCWludCB0bXAgPSByZWN0LngyOwotCQkJcmVjdC54MiA9IHJlY3QueDE7Ci0JCQlyZWN0LngxID0gdG1wOwotCQl9Ci0JCWlmIChyZWN0LnkxID4gcmVjdC55MikgewotCQkJaW50IHRtcCA9IHJlY3QueTI7Ci0JCQlyZWN0LnkyID0gcmVjdC55MTsKLQkJCXJlY3QueTEgPSB0bXA7Ci0JCX0KLQotCQl0cmFuc2Zvcm1fcmVjdChyZWN0LCB3aW5kb3dzXzhicHBbbl0ud2luLAotCQkgICAgd2luZG93c184YnBwW25dLmRlcHRoLCBjbSk7Ci0JfQotCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQlzcmFSZ25EZXN0cm95KGNsaXApOwotfQotCi1zdGF0aWMgWEltYWdlICpjbWFwX3hpKFhJbWFnZSAqeGksIFdpbmRvdyB3aW4sIGludCB3aW5fZGVwdGgpIHsKLSNpZiBOT19YMTEKLQlpZiAoIXhpIHx8ICF3aW4gfHwgIXdpbl9kZXB0aCkge30KLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQljaGFyICpkOwotCi0JaWYgKHhpKSB7Ci0JCVhEZXN0cm95SW1hZ2UoeGkpOwotCX0KLQlpZiAoISBkcHkgfHwgISB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSkpIHsKLQkJcmV0dXJuIChYSW1hZ2UgKikgTlVMTDsKLQl9Ci0JaWYgKHdpbl9kZXB0aCA9PSAyNCkgewotCQlkID0gKGNoYXIgKikgbWFsbG9jKGRweV94ICogZHB5X3kgKiA0KTsKLQl9IGVsc2UgaWYgKHdpbl9kZXB0aCA8PSAxNikgewotCQlpZiAod2luX2RlcHRoID4gOCkgewotCQkJZCA9IChjaGFyICopIG1hbGxvYyhkcHlfeCAqIGRweV95ICogMik7Ci0JCX0gZWxzZSB7Ci0JCQlkID0gKGNoYXIgKikgbWFsbG9jKGRweV94ICogZHB5X3kgKiAxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiAoWEltYWdlICopIE5VTEw7Ci0JfQotCXJldHVybiBYQ3JlYXRlSW1hZ2UoZHB5LCBhdHRyLnZpc3VhbCwgd2luX2RlcHRoLCBaUGl4bWFwLCAwLCBkLCBkcHlfeCwgZHB5X3ksIDgsIDApOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0KLXN0YXRpYyB2b2lkIHRyYW5zZm9ybV9yZWN0KHNyYVJlY3QgcmVjdCwgV2luZG93IHdpbiwgaW50IHdpbl9kZXB0aCwgaW50IGNtKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlpZiAoIXJlY3QueDEgfHwgIXdpbiB8fCAhd2luX2RlcHRoIHx8ICFjbSkge30KLQlyZXR1cm47Ci0jZWxzZQotCi0JY2hhciAqc3JjLCAqZHN0LCAqcG9sbDsKLQl1bnNpZ25lZCBpbnQgKnVpOwotCXVuc2lnbmVkIHNob3J0ICp1czsKLQl1bnNpZ25lZCBjaGFyICp1YzsKLQlpbnQgcHMsIHBpeGVsc2l6ZSA9IGJwcC84OwotCWludCBwb2xsX0JwbDsKLQotCWludCBkb19nZXRpbWFnZSA9IHhnZXRpbWFnZV84dG8yNDsKLQlpbnQgbGluZSwgbl9vZmYsIGosIGgsIHc7Ci0JdW5zaWduZWQgaW50IGhpLCBpZHg7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyID0gTlVMTDsKLQotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInRyYW5zZm9ybSAlNGQgJTRkICU0ZCAlNGQgY206ICVkXG4iLCByZWN0LngxLCByZWN0LnkxLCByZWN0LngyLCByZWN0LnkyLCBjbSk7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JYXR0ci53aWR0aCA9IDA7Ci0JYXR0ci5oZWlnaHQgPSAwOwotCi0JLyogbm93IHRyYW5zZm9ybSB0aGUgcGl4ZWxzIGluIHRoaXMgcmVjdGFuZ2xlOiAqLwotCW5fb2ZmID0gbWFpbl9ieXRlc19wZXJfbGluZSAqIHJlY3QueTEgKyBwaXhlbHNpemUgKiByZWN0LngxOwotCi0JaCA9IHJlY3QueTIgLSByZWN0LnkxOwotCXcgPSByZWN0LngyIC0gcmVjdC54MTsKLQotCWlmIChkZXB0aCAhPSAyNCkgewotCQkvKiBuZWVkIHRvIGZldGNoIGRlcHRoIDI0IGRhdGEuICovCi0JCWRvX2dldGltYWdlID0gMTsKLQl9Ci0KLSNpZiAwCi0JaWYgKGRvX2dldGltYWdlKSB7Ci0JCVhfTE9DSzsKLQkJdncgPSB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSk7Ci0JCVhfVU5MT0NLOwotCX0KLQotCWlmIChkb19nZXRpbWFnZSAmJiB2dykgewotI2Vsc2UKLQlpZiAoZG9fZ2V0aW1hZ2UpIHsKLSNlbmRpZgotCQlzdGF0aWMgWEltYWdlICp4aV84ICA9IE5VTEw7Ci0JCXN0YXRpYyBYSW1hZ2UgKnhpXzI0ID0gTlVMTDsKLQkJWEltYWdlICp4aSA9IE5VTEwsICp4aV9yOwotCQlXaW5kb3cgYzsKLQkJdW5zaWduZWQgaW50IHd1LCBodTsKLQkJaW50IHhvLCB5bzsKLQotCQl3dSA9ICh1bnNpZ25lZCBpbnQpIHc7Ci0JCWh1ID0gKHVuc2lnbmVkIGludCkgaDsKLQotCQlYX0xPQ0s7Ci0jZGVmaW5lIEdFVFNVQklNQUdFCi0jaWZkZWYgR0VUU1VCSU1BR0UKLQkJaWYgKHdpbl9kZXB0aCA9PSAyNCkgewotCQkJaWYgKHhpXzI0ID09IE5VTEwgfHwgeGlfMjQtPndpZHRoICE9IGRweV94IHx8Ci0JCQkgICAgeGlfMjQtPmhlaWdodCAhPSBkcHlfeSkgewotCQkJCXhpXzI0ID0gY21hcF94aSh4aV8yNCwgd2luLCAyNCk7Ci0JCQl9Ci0JCQl4aSA9IHhpXzI0OwotCQl9IGVsc2UgaWYgKHdpbl9kZXB0aCA8PSAxNikgewotCQkJaWYgKHhpXzggPT0gTlVMTCB8fCB4aV84LT53aWR0aCAhPSBkcHlfeCB8fAotCQkJICAgIHhpXzgtPmhlaWdodCAhPSBkcHlfeSkgewotCQkJCWlmICh3aW5fZGVwdGggPiA4KSB7Ci0JCQkJCS8qIFhYWCAqLwotCQkJCQl4aV84ID0gY21hcF94aSh4aV84LCB3aW4sIDE2KTsKLQkJCQl9IGVsc2UgewotCQkJCQl4aV84ID0gY21hcF94aSh4aV84LCB3aW4sIDgpOwotCQkJCX0KLQkJCX0KLQkJCXhpID0geGlfODsKLQkJfQotI2VuZGlmCi0KLQkJaWYgKHhpID09IE5VTEwpIHsKLQkJCXJmYkxvZygidHJhbnNmb3JtX3JlY3Q6IHhpIGlzIE5VTExcbiIpOwotCQkJWF9VTkxPQ0s7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0KLQkJb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCi0JCVhUcmFuc2xhdGVDb29yZGluYXRlcyhkcHksIHdpbiwgd2luZG93LCAwLCAwLCAmeG8sICZ5bywgJmMpOwotCi0JCXhvID0gcmVjdC54MSAtIHhvOwotCQl5byA9IHJlY3QueTEgLSB5bzsKLQotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInh5d2g6ICVkICVkICVkICVkIHZzLiAlZCAlZFxuIiwgeG8sIHlvLCB3LCBoLCBhdHRyLndpZHRoLCBhdHRyLmhlaWdodCk7Ci0KLQkJaWYgKHRyYXBwZWRfeGVycm9yIHx8IHhvIDwgMCB8fCB5byA8IDApIHsKLQkJICAgICAgICAvKiB3ID4gYXR0ci53aWR0aCB8fCBoID4gYXR0ci5oZWlnaHQgKi8KLQkJCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQkJWF9VTkxPQ0s7Ci0JCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci1pZiAoZGIyNCA+IDEpIGZwcmludGYoc3RkZXJyLCAic2tpcHBpbmcgZHVlIHRvIHBvdGVudGlhbCBiYWQgbWF0Y2guLi5cbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQotI2lmbmRlZiBHRVRTVUJJTUFHRQotCQl4aSA9IFhHZXRJbWFnZShkcHksIHdpbiwgeG8sIHlvLCB3dSwgaHUsIEFsbFBsYW5lcywgWlBpeG1hcCk7Ci0JCXhpX3IgPSB4aTsKLSNlbHNlCi0JCXhpX3IgPSBYR2V0U3ViSW1hZ2UoZHB5LCB3aW4sIHhvLCB5bywgd3UsIGh1LCBBbGxQbGFuZXMsCi0JCSAgICBaUGl4bWFwLCB4aSwgMCwgMCk7Ci0jZW5kaWYKLQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0KLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKCEgeGlfciB8fCB0cmFwcGVkX3hlcnJvcikgewotCQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInhpLWZhaWw6IDB4JXAgdHJhcD0lZCAgJWQgJWQgJWQgJWRcbiIsICh2b2lkICopeGksIHRyYXBwZWRfeGVycm9yLCB4bywgeW8sIHcsIGgpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInhpOiAweCVwICAlZCAlZCAlZCAlZCAtLSAlZCAlZFxuIiwgKHZvaWQgKil4aSwgeG8sIHlvLCB3LCBoLCB4aS0+d2lkdGgsIHhpLT5oZWlnaHQpOwotCQl9Ci0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCQlpZiAoeGktPmRlcHRoID4gMTYgJiYgeGktPmRlcHRoICE9IDI0KSB7Ci0jaWZuZGVmIEdFVFNVQklNQUdFCi0JCQlYX0xPQ0s7Ci0JCQlYRGVzdHJveUltYWdlKHhpKTsKLQkJCVhfVU5MT0NLOwotI2VuZGlmCi1pZiAoZGIyNCkgZnByaW50ZihzdGRlcnIsICJ4aTogd3JvbmcgZGVwdGg6ICVkXG4iLCB4aS0+ZGVwdGgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0X3BvbGxfZmIoKTsKLQotCQlpZiAoeGktPmRlcHRoID09IDI0KSB7Ci0JCQkvKiBsaW5lIGJ5IGxpbmUgLi4uICovCi0JCQlpbnQgcHMxID0gNCwgZmFjOwotCQkJaWYgKGRlcHRoIDw9IDgpIHsKLQkJCQlmYWMgPSA0OwotCQkJfSBlbHNlIGlmIChkZXB0aCA8PSAxNikgewotCQkJCWZhYyA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWZhYyA9IDE7CS8qIHdpbGwgbm90IGhhcHBlbiAyNCBvbiAyNCAqLwotCQkJfQotCi0JCQlzcmMgPSB4aS0+ZGF0YTsKLQkJCWRzdCA9IGNtYXA4dG8yNF9mYiArIGZhYyAqIG5fb2ZmOwotCi0JCQlwb2xsID0gcG9sbDI0X2ZiICsgKHBvbGwyNF9mYl93ICogcmVjdC55MSArIHJlY3QueDEpICogNDsKLQkJCXBvbGxfQnBsID0gcG9sbDI0X2ZiX3cgKiA0OwotCi0JCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7Ci0JCQkJbWVtY3B5KGRzdCwgIHNyYywgdyAqIHBzMSk7Ci0JCQkJbWVtY3B5KHBvbGwsIHNyYywgdyAqIHBzMSk7Ci0KLQkJCQlzcmMgKz0geGktPmJ5dGVzX3Blcl9saW5lOwotCQkJCWRzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lICogZmFjOwotCQkJCXBvbGwgKz0gcG9sbF9CcGw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoeGktPmRlcHRoIDw9IDE2KSB7Ci0JCQlpbnQgcHMxLCBwczIsIGZhYzsKLQotCQkJaWYgKGRlcHRoIDw9IDgpIHsKLQkJCQlwczEgPSAxOwotCQkJCXBzMiA9IDQ7Ci0JCQkJZmFjID0gNDsKLQkJCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYpIHsKLQkJCQlwczEgPSAyOwotCQkJCXBzMiA9IDQ7Ci0JCQkJZmFjID0gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogc2hvdWxkIGJlIDI0IGNhc2UgKi8KLQkJCQlwczEgPSAxOwotCQkJCXBzMiA9IHBpeGVsc2l6ZTsKLQkJCQlmYWMgPSAxOwotCQkJfQotCi0JCQlzcmMgPSB4aS0+ZGF0YTsKLQkJCWRzdCA9IGNtYXA4dG8yNF9mYiArIChmYWMvcHMxKSAqIG5fb2ZmOwotCi0JCQlwb2xsID0gcG9sbDhfZmIgKyBwb2xsOF9mYl93ICogcmVjdC55MSAqIHBzMSArIHJlY3QueDEgKiBwczE7Ci0JCQlwb2xsX0JwbCA9IHBvbGw4X2ZiX3cgKiBwczE7Ci0KLQkJCS8qIGxpbmUgYnkgbGluZSAuLi4gKi8KLQkJCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKLQkJCQkvKiBwaXhlbCBieSBwaXhlbC4uLiAqLwotCQkJCWZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKLQkJCQkJaWYgKHBzMSA9PSAyKSB7Ci0JCQkJCQl1bnNpZ25lZCBzaG9ydCAqcHRtcDsKLQkJCQkJCXVzICAgID0gKHVuc2lnbmVkIHNob3J0ICopIChzcmMgKyBwczEgKiBqKTsKLQkJCQkJCWlkeCAgID0gKGludCkgKCp1cyk7Ci0JCQkJCQlwdG1wICA9ICh1bnNpZ25lZCBzaG9ydCAqKSAocG9sbCArIHBzMSAqIGopOwotCQkJCQkJKnB0bXAgPSAqdXM7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl1YyAgPSAodW5zaWduZWQgY2hhciAqKSAoc3JjICsgcHMxICogaik7Ci0JCQkJCQlpZHggPSAoaW50KSAoKnVjKTsKLQkJCQkJCSoocG9sbCArIHBzMSAqIGopID0gKnVjOwotCQkJCQl9Ci0JCQkJCXVpID0gKHVuc2lnbmVkIGludCAqKSAoZHN0ICsgcHMyICogaik7Ci0JCQkJCSp1aSA9IHJnYltjbV1baWR4XTsKLQotCQkJCX0KLQkJCQlzcmMgKz0geGktPmJ5dGVzX3Blcl9saW5lOwotCQkJCWRzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lICogKGZhYy9wczEpOwotCQkJCXBvbGwgKz0gcG9sbF9CcGw7Ci0JCQl9Ci0JCX0KLQotI2lmbmRlZiBHRVRTVUJJTUFHRQotCQlYX0xPQ0s7Ci0JCVhEZXN0cm95SW1hZ2UoeGkpOwotCQlYX1VOTE9DSzsKLSNlbmRpZgotCi0JfSBlbHNlIGlmICghIGRvX2dldGltYWdlKSB7Ci0JCWludCBmYWM7Ci0KLQkJaWYgKGRlcHRoIDw9IDE2KSB7Ci0JCQkvKiBjb29rZWQgdXAgZGVwdGggMjQgVHJ1ZUNvbG9yICAqLwotCQkJLyogYnV0IGN1cnJlbnRseSBkaXNhYmxlZCAoaGlnaCBiaXRzIG5vIHVzZWZ1bD8pICovCi0JCQlwcyA9IDQ7Ci0JCQlmYWMgPSA0OwotCQkJLyogWFhYIG5vdCBjb3JyZWN0IGZvciBkZXB0aCA+IDgsIGJ1dCBkbyB3ZSBldmVyIGNvbWUgaGVyZSBpbiB0aGF0IGNhc2U/ICovCi0JCQlzcmMgPSBjbWFwOHRvMjRfZmIgKyA0ICogbl9vZmY7Ci0JCX0gZWxzZSB7Ci0JCQlwcyA9IHBpeGVsc2l6ZTsKLQkJCWZhYyA9IDE7Ci0JCQlzcmMgPSBjbWFwOHRvMjRfZmIgKyBuX29mZjsKLQkJfQotCQkKLQkJLyogbGluZSBieSBsaW5lIC4uLiAqLwotCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7Ci0JCQkvKiBwaXhlbCBieSBwaXhlbC4uLiAqLwotCQkJZm9yIChqID0gMDsgaiA8IHc7IGorKykgewotCi0JCQkJLyogZ3JhYiAzMiBiaXQgdmFsdWUgKi8KLQkJCQl1aSA9ICh1bnNpZ25lZCBpbnQgKikgKHNyYyArIHBzICogaik7Ci0KLQkJCQkvKiBleHRyYWN0IHRvcCA4IGJpdHMgKEZJWE1FOiBtYXNrcz8pICovCi0JCQkJaGkgPSAoKnVpKSAmIDB4ZmYwMDAwMDA7IAotCi0JCQkJLyogbWFwIHRvIGxvb2t1cCBpbmRleDsgcmV3cml0ZSBwaXhlbCAqLwotCQkJCWlkeCA9IGhpID4+IDI0OwotCQkJCSp1aSA9IGhpIHwgcmdiW2NtXVtpZHhdOwotCQkJfQotCQkJc3JjICs9IG1haW5fYnl0ZXNfcGVyX2xpbmUgKiBmYWM7Ci0JCX0KLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgYnBwOHRvMjQoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JY2hhciAqc3JjLCAqZHN0OwotCXVuc2lnbmVkIGNoYXIgKnVjOwotCXVuc2lnbmVkIHNob3J0ICp1czsKLQl1bnNpZ25lZCBpbnQgKnVpOwotCWludCBpZHgsIHBpeGVsc2l6ZSA9IGJwcC84OwotCWludCBsaW5lLCBrLCBpLCBqLCBoLCB3OwotCWludCBuX29mZjsKLQlzcmFSZWdpb25QdHIgcmVjdDsKLQlpbnQgdmFsaWRhdGUgPSAxOwotCXN0YXRpYyBpbnQgbGFzdF9tYXBfY291bnQgPSAwLCBjYWxsX2NvdW50ID0gMDsKLQlzdGF0aWMgZG91YmxlIGxhc3RfZ2V0XzhicHBfdmFsaWRhdGUgPSAwLjA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3NuYXBzaG90ID0gMC4wOwotCWRvdWJsZSBub3c7Ci0JZG91YmxlIGR0LCBkMCA9IDAuMCwgdDI7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKCEgY21hcDh0bzI0IHx8ICEgY21hcDh0bzI0X2ZiKSB7Ci0JCS8qIGhtbW0sIHdoeSB3ZXJlIHdlIGNhbGxlZD8gKi8KLQkJcmV0dXJuOwotCX0KLQotaWYgKGRiMjQgPiAxKSBmcHJpbnRmKHN0ZGVyciwgImJwcDh0bzI0ICVkICVkICVkICVkICUuNGZcbiIsIHgxLCB5MSwgeDIsIHkyLCBkbm93KCkgLSBsYXN0X2dldF84YnBwX3ZhbGlkYXRlKTsKLQotCWNhbGxfY291bnQrKzsKLQotCS8qIGNsaXAgdG8gZGlzcGxheSBqdXN0IGluIGNhc2U6ICovCi0JaWYgKCFuY2FjaGUpIHsKLQkJeDEgPSBuZml4KHgxLCBkcHlfeCk7Ci0JCXkxID0gbmZpeCh5MSwgZHB5X3kpOwotCQl4MiA9IG5maXgoeDIsIGRweV94KzEpOwotCQl5MiA9IG5maXgoeTIsIGRweV95KzEpOwotCX0KLQotCWlmICh3aXJlZnJhbWVfaW5fcHJvZ3Jlc3MpIHsKLQkJLyoKLQkJICogZHJhd19ib3goKSBtYW5hZ2VzIGNtYXA4dG8yNF9mYiBmb3IgdXMgc28gd2UgZ2V0IG91dCBhcwotCQkgKiBzb29uIGFzIHdlIGNhbi4gIE5vIG5lZWQgdG8gY3AgbWFpbl9mYiAtPiBjbWFwOHRvMjRfZmIuCi0JCSAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogY29weSBmcm9tIG1haW5fZmIgdG8gY21hcDh0bzI0X2ZiIHJlZ2FyZGxlc3Mgb2YgOGJwcCB3aW5kb3dzOiAqLwotCi0JaCA9IHkyIC0geTE7Ci0JdyA9IHgyIC0geDE7Ci0KLQlpZiAoZGVwdGggPT0gMjQpIHsKLQkJLyogcGl4ZWxzaXplID0gNCAqLwotCQluX29mZiA9IG1haW5fYnl0ZXNfcGVyX2xpbmUgKiB5MSArIHBpeGVsc2l6ZSAqIHgxOwotCi0JCXNyYyA9IG1haW5fZmIgICAgICArIG5fb2ZmOwotCQlkc3QgPSBjbWFwOHRvMjRfZmIgKyBuX29mZjsKLQotCQkvKiBvdGhlcndpc2UsIHRoZSBwaXhlbCBkYXRhIGFzIGlzICovCi0JCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKLQkJCW1lbWNweShkc3QsIHNyYywgdyAqIHBpeGVsc2l6ZSk7Ci0JCQlzcmMgKz0gbWFpbl9ieXRlc19wZXJfbGluZTsKLQkJCWRzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lOwotCQl9Ci0JfSBlbHNlIGlmIChkZXB0aCA8PSAxNikgewotCQkvKiBuZWVkIHRvIGNvb2sgdXAgdG8gZGVwdGggMjQgVHJ1ZUNvbG9yICAqLwotCQlpbnQgcHMxID0gMSwgcHMyID0gNDsKLQkJaWYgKGRlcHRoID4gOCkgewotCQkJcHMxID0gMjsKLQkJfQotCi0JCS8qIHBpeGVsc2l6ZSA9IDEsIDIgKi8KLQkJbl9vZmYgPSBtYWluX2J5dGVzX3Blcl9saW5lICogeTEgKyBwaXhlbHNpemUgKiB4MTsKLQotCQlzcmMgPSBtYWluX2ZiICsgbl9vZmY7Ci0JCWRzdCA9IGNtYXA4dG8yNF9mYiArICg0L3BzMSkgKiBuX29mZjsKLQotCQlzZXRfcm9vdF9jbWFwKCk7Ci0JCWlmIChyb290X2NtYXApIHsKLSNpZiAwCi0JCQl1bnNpZ25lZCBpbnQgaGk7Ci0jZW5kaWYKLQotCQkJLyogbGluZSBieSBsaW5lIC4uLiAqLwotCQkJZm9yIChsaW5lID0gMDsgbGluZSA8IGg7IGxpbmUrKykgewotCQkJCS8qIHBpeGVsIGJ5IHBpeGVsLi4uICovCi0JCQkJZm9yIChqID0gMDsgaiA8IHc7IGorKykgewotCQkJCQlpZiAocHMxID09IDIpIHsKLQkJCQkJCXVzID0gKHVuc2lnbmVkIHNob3J0ICopIChzcmMgKyBwczEgKiBqKTsKLQkJCQkJCWlkeCA9IChpbnQpICgqdXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdWMgPSAodW5zaWduZWQgY2hhciAqKSAgKHNyYyArIHBzMSAqIGopOwotCQkJCQkJaWR4ID0gKGludCkgKCp1Yyk7Ci0JCQkJCX0KLQkJCQkJdWkgPSAodW5zaWduZWQgaW50ICopICAoZHN0ICsgcHMyICogaik7Ci0KLWlmICgwICYmIGxpbmUgJSAxMDAgPT0gMCAmJiBqICUgMzIgPT0gMCkgZnByaW50ZihzdGRlcnIsICIlZCAlZCAldSAgeDE9JWQgeTE9JWRcbiIsIGxpbmUsIGosIHJvb3RfcmdiW2lkeF0sIHgxLCB5MSk7Ci0jaWYgMAotCQkJCQlpZiAoZG9faGliaXRzKSB7Ci0JCQkJCQloaSA9IGlkeCA8PCAyNDsKLQkJCQkJCSp1aSA9IGhpIHwgcmdiWzBdW2lkeF07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCX0KLSNlbmRpZgotCQkJCQkqdWkgPSByb290X3JnYltpZHhdOwotaWYgKGRiMjQgPiAyKSBoaXN0b1tpZHhdKys7Ci0JCQkJfQotCQkJCXNyYyArPSBtYWluX2J5dGVzX3Blcl9saW5lOwotCQkJCWRzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lICogKDQvcHMxKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQlpZiAobGFzdF9tYXBfY291bnQgPiBNQVhfOEJQUF9XSU5ET1dTLzQpIHsKLQkJLyogdGFibGUgaXMgZmlsbGluZyB1cC4uLiBza2lwIHZhbGlkYXRpbmcgc29tZXRpbWVzOiAqLwotCQlpbnQgc2tpcCA9IDM7Ci0JCWlmIChsYXN0X21hcF9jb3VudCA+IE1BWF84QlBQX1dJTkRPV1MvMikgewotCQkJc2tpcCA9IDY7Ci0JCX0gZWxzZSBpZiAobGFzdF9tYXBfY291bnQgPiAzKk1BWF84QlBQX1dJTkRPV1MvNCkgewotCQkJc2tpcCA9IDEyOwotCQl9Ci0JCWlmIChjYWxsX2NvdW50ICUgc2tpcCAhPSAwKSB7Ci0JCQl2YWxpZGF0ZSA9IDA7Ci0JCX0KLQl9Ci0KLWlmIChkYjI0ID4gMikge2ZvcihpPTA7aTwyNTY7aSsrKXtoaXN0b1tpXT0wO319Ci0KLQlub3cgPSBkbm93KCk7Ci0JZHQgPSBub3cgLSBsYXN0X2dldF84YnBwX3ZhbGlkYXRlOwotCS8qIFRVTkFCTEVTICAqLwotCWlmIChkdCA8IDAuMDAzKSB7Ci0JCTsJLyogWFhYIGRvZXMgdGhpcyBzdGlsbCBnaXZlIHBhaW50aW5nIGVycm9ycz8gKi8KLQl9IGVsc2UgewotCQlpbnQgc25hcGl0ID0gMDsKLQkJZG91YmxlIGRlbGF5MSwgZGVsYXkyLCBkZWxheTM7Ci0JCWlmIChwb2xsXzh0bzI0X2RlbGF5ID49IFBPTExfOFRPMjRfREVMQVkpIHsKLQkJCWRlbGF5MSA9IDEuMCAqIHBvbGxfOHRvMjRfZGVsYXk7Ci0JCQlkZWxheTIgPSAyLjAgKiBwb2xsXzh0bzI0X2RlbGF5OwotCQkJZGVsYXkzID0gMTAuICogcG9sbF84dG8yNF9kZWxheTsKLQkJfSBlbHNlIHsKLQkJCWRlbGF5MSA9IDEuMCAqIFBPTExfOFRPMjRfREVMQVk7CS8qIDAuMDUgKi8KLQkJCWRlbGF5MiA9IDIuMCAqIFBPTExfOFRPMjRfREVMQVk7CS8qIDAuMSAgKi8KLQkJCWRlbGF5MyA9IDEwLiAqIFBPTExfOFRPMjRfREVMQVk7CS8qIDAuNSAgKi8KLQkJfQotCQlpZiAoY2FjaGVfd2luID4gMS4wKSB7Ci0JCQlkZWxheTIgKj0gMjsKLQkJCWRlbGF5MyAqPSAyOwotCQl9Ci0JCWlmIChkdCA8IGRlbGF5MSkgewotCQkJdmFsaWRhdGUgPSAwOwotCQl9Ci0JCWlmIChsYXN0X21hcF9jb3VudCkgewotCQkJaWYgKG5vdyA+IGxhc3Rfc25hcHNob3QgKyBkZWxheTIpIHsKLQkJCQlzbmFwaXQgPSAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG5vdyA+IGxhc3Rfc25hcHNob3QgKyBkZWxheTMpIHsKLQkJCQlzbmFwaXQgPSAxOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNuYXBpdCkgewotCQkJLyogbGVzcyBwcm9ibGVtcyBpZiB3ZSB1cGRhdGUgdGhlIHN0YWNrIGZyZXF1ZW50bHkgKi8KLQkJCXNuYXBzaG90X3N0YWNrX2xpc3QoMCwgMC4wKTsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlNOQVAgdGltZTogJS40ZlxuIiwgZG5vdygpIC0gbm93KTsKLQkJCXVwZGF0ZV9zdGFja19saXN0KCk7Ci0JCQlsYXN0X3NuYXBzaG90ID0gZG5vdygpOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiVVBEQSB0aW1lOiAlLjRmXG4iLCBsYXN0X3NuYXBzaG90IC0gbm93KTsKLQkJfQotCi1pZiAoMCkgdDIgPSBkbm93KCk7Ci0JCWxhc3RfbWFwX2NvdW50ID0gZ2V0XzhicHBfcmVnaW9ucyh2YWxpZGF0ZSk7Ci0JCWlmICh2YWxpZGF0ZSkgewotCQkJbGFzdF9nZXRfOGJwcF92YWxpZGF0ZSA9IGRub3coKTsKLQkJfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZ2V0OGJwcC0lZDogJS40ZlxuIiwgdmFsaWRhdGUsIGRub3coKSAtIHQyKTsKLQl9Ci1pZiAoZGIyNCkgZDAgPSBkbm93KCk7Ci0KLWlmIChkYjI0ID4gMSkgZnByaW50ZihzdGRlcnIsICJicHA4dG8yNCB3PSVkIGg9JWQgbT0lcCBjPSVwIHI9JXAgbmNtYXBzPSVkXG4iLCB3LCBoLCBtYWluX2ZiLCBjbWFwOHRvMjRfZmIsIHJmYl9mYiwgbmNtYXBzKTsKLQotCS8qCi0JICogbm93IGdvIGJhY2sgYW5kIHRyYW5zZm9ybSBhbmQgOGJwcCByZWdpb25zIHRvIFRydWVDb2xvciBpbgotCSAqIGNtYXA4dG8yNF9mYi4KLQkgKi8KLQlpZiAobGFzdF9tYXBfY291bnQgJiYgKG5jbWFwcyB8fCBkZXB0aCA8PSAxNikpIHsKLQkJaW50IGksIGo7Ci0JCWludCB3aW5bTUFYXzhCUFBfV0lORE9XU107Ci0JCWludCBkaWRbTUFYXzhCUFBfV0lORE9XU107Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJLyoKLQkJICogZmlyc3QsIGdyYWIgYWxsIG9mIHRoZSBhc3NvY2lhdGVkIGNvbG9ybWFwcyBmcm9tIHRoZQotCQkgKiBYIHNlcnZlci4gIEhvcGVmdWxseSBqdXN0IDEgb3IgMi4uLgotCQkgKi8KLQkJZm9yIChqPTA7IGo8bmNtYXBzOyBqKyspIHsKLQkJCWlmICghIGdldF9jbWFwKGosIGNtYXBzW2pdKSkgewotCQkJCWNtYXBfZmFpbGVkW2pdID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21hcF9mYWlsZWRbal0gPSAwOwotCQkJfQotaWYgKGRiMjQgPiAyKSBmcHJpbnRmKHN0ZGVyciwgImNtYXAgJWQgICUuNGZcbiIsIChpbnQpIGNtYXBzW2pdLCBkbm93KCkgLSBkMCk7Ci0JCX0KLQkJZm9yIChpPTA7IGkgPCBNQVhfOEJQUF9XSU5ET1dTOyBpKyspIHsKLQkJCXNyYVJlZ2lvblB0ciByZWcgPSB3aW5kb3dzXzhicHBbaV0uY2xpcF9yZWdpb247Ci0JCQlpZiAocmVnKSB7Ci0JCQkJcmVjdCA9IHNyYVJnbkNyZWF0ZVJlY3QoeDEsIHkxLCB4MiwgeTIpOwotCQkJCWlmIChzcmFSZ25BbmQocmVjdCwgcmVnKSkgewotCQkJCQl3aW5bY291bnRdID0gaTsKLQkJCQkJZGlkW2NvdW50KytdID0gMDsKLQkJCQl9Ci0JCQkJc3JhUmduRGVzdHJveShyZWN0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb3VudCkgewotCi0JCQlyZWN0ID0gc3JhUmduQ3JlYXRlUmVjdCh4MSwgeTEsIHgyLCB5Mik7Ci0JCQkvKiB0cnkgdG8gYXBwbHkgbG93ZXIgd2luZG93cyBmaXJzdCAqLwotCQkJZm9yIChrPTA7IGsgPCBzdGFja19saXN0X251bTsgaysrKSB7Ci0JCQkJV2luZG93IHN3aW4gPSBzdGFja19saXN0W2tdLndpbjsKLQkJCQlmb3IgKGo9MDsgajxjb3VudDsgaisrKSB7Ci0JCQkJCWkgPSB3aW5bal07Ci0JCQkJCWlmIChkaWRbal0pIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmICh3aW5kb3dzXzhicHBbaV0udG9wID09IHN3aW4pIHsKLQkJCQkJCWRvXzhicHBfcmVnaW9uKGksIHJlY3QpOwotCQkJCQkJZGlkW2pdID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZm9yIChqPTA7IGo8Y291bnQ7IGorKykgewotCQkJCWlmICghIGRpZFtqXSkgewotCQkJCQlpID0gd2luW2pdOwotCQkJCQlkb184YnBwX3JlZ2lvbihpLCByZWN0KTsKLQkJCQkJZGlkW2pdID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlzcmFSZ25EZXN0cm95KHJlY3QpOwotCQl9Ci0JfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZG9uZSB0aW1lOiAlLjRmXG4iLCBkbm93KCkgLSBkMCk7Ci0KLWlmIChkYjI0ID4gMikge2ZvcihpPTA7IGk8MjU2O2krKykge2ZwcmludGYoc3RkZXJyLCAiIGNtYXAgaGlzdG9bJTAzZF0gJWRcbiIsIGksIGhpc3RvW2ldKTt9fQotfQotCi12b2lkIG1hcmtfOGJwcChpbnQgbW9kZSkgewotCWludCBpLCBjbnQgPSAwOwotCVdpbmRvdyB0b3AgPSBOb25lOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmICghIGNtYXA4dG8yNCB8fCAhY21hcDh0bzI0X2ZiKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKG1vZGUgPT0gTUFSS184QlBQX1RPUCkgewotCQlpbnQgazsKLQkJZm9yIChrID0gc3RhY2tfbGlzdF9udW0gLSAxOyBrID49IDA7IGstLSkgewotCQkJV2luZG93IHN3aW4gPSBzdGFja19saXN0W2tdLndpbjsKLQkJCWZvciAoaT0wOyBpIDwgTUFYXzhCUFBfV0lORE9XUzsgaSsrKSB7Ci0JCQkJaWYgKHdpbmRvd3NfOGJwcFtpXS53aW4gPT0gTm9uZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHdpbmRvd3NfOGJwcFtpXS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHN3aW4gPT0gd2luZG93c184YnBwW2ldLnRvcCkgewotCQkJCQl0b3AgPSBzd2luOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodG9wICE9IE5vbmUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGZvciBlYWNoIG1hcHBlZCA4YnBwIHdpbmRvdywgbWFyayBpdCBjaGFuZ2VkOiAqLwotCi0JZm9yIChpPTA7IGkgPCBNQVhfOEJQUF9XSU5ET1dTOyBpKyspIHsKLQkJaW50IHgxLCB5MSwgeDIsIHkyLCB3LCBoLCBmID0gMzI7Ci0KLQkJZiA9IDA7CS8qIHNraXAgZnV6eiwgbWF5IGJyaW5nIGluIG90aGVyIHdpbmRvd3MuLi4gKi8KLQotCQlpZiAod2luZG93c184YnBwW2ldLndpbiA9PSBOb25lKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAobW9kZSA9PSBNQVJLXzhCUFBfVE9QKSB7Ci0JCQlpZiAod2luZG93c184YnBwW2ldLnRvcCAhPSB0b3ApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAod2luZG93c184YnBwW2ldLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCQkJaW50IHZ3ID0gMDsKLQotCQkJWF9MT0NLOwotCQkJdncgPSB2YWxpZF93aW5kb3cod2luZG93c184YnBwW2ldLndpbiwgJmF0dHIsIDEpOwotCQkJWF9VTkxPQ0s7Ci0JCQlpZiAodncpIHsKLQkJCQlpZiAoYXR0ci5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJeDEgPSB3aW5kb3dzXzhicHBbaV0ueDsKLQkJeTEgPSB3aW5kb3dzXzhicHBbaV0ueTsKLQkJdyAgPSB3aW5kb3dzXzhicHBbaV0udzsKLQkJaCAgPSB3aW5kb3dzXzhicHBbaV0uaDsKLQotCQl4MiA9IHgxICsgdzsKLQkJeTIgPSB5MSArIGg7Ci0KLQkJaWYgKG1vZGUgPT0gTUFSS184QlBQX1BPSU5URVIpIHsKLQkJCWludCBiID0gMzI7CS8qIGFwcGx5IHNvbWUgZnV6eiBmb3Igd20gYm9yZGVyICovCi0JCQlpZiAoY3Vyc29yX3ggPCB4MSAtIGIgfHwgY3Vyc29yX3kgPCB5MSAtIGIpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjdXJzb3JfeCA+IHgyICsgYiB8fCBjdXJzb3JfeSA+IHkyICsgYikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJLyogYXBwbHkgZnV6eiBmIGFyb3VuZCBlYWNoIG9uZTsgY29uc3RyYWluIHRvIHNjcmVlbiAqLwotCQl4MSA9IG5maXgoeDEgLSBmLCBkcHlfeCk7Ci0JCXkxID0gbmZpeCh5MSAtIGYsIGRweV95KTsKLQkJeDIgPSBuZml4KHgyICsgZiwgZHB5X3grMSk7Ci0JCXkyID0gbmZpeCh5MiArIGYsIGRweV95KzEpOwotCi1pZiAoZGIyNCA+IDEpIGZwcmludGYoc3RkZXJyLCAibWFya184YnBwOiAweCVseCAlZCAlZCAlZCAlZFxuIiwgd2luZG93c184YnBwW2ldLndpbiwgeDEsIHkxLCB4MiwgeTIpOwotCi0JCW1hcmtfcmVjdF9hc19tb2RpZmllZCh4MSwgeTEsIHgyLCB5MiwgMCk7Ci0JCWNudCsrOwotCX0KLQlpZiAoY250KSB7Ci0JCS8qIHB1c2ggaXQgdG8gdmlld2VycyBpZiBwb3NzaWJsZS4gKi8KLQkJcmZiUEUoLTEpOwotCX0KLX0KLQotI2VuZGlmIC8qIFNLSVBfOFRPMjQgKi8KLQpkaWZmIC0tZ2l0IGEveDExdm5jLzh0bzI0LmggYi94MTF2bmMvOHRvMjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNDEyYi4uMDAwMDAwMAotLS0gYS94MTF2bmMvOHRvMjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DXzhUTzI0X0gKLSNkZWZpbmUgX1gxMVZOQ184VE8yNF9ICi0KLS8qIC0tIDh0bzI0LmggLS0gKi8KLQotZXh0ZXJuIGludCBtdWx0aXZpc19jb3VudDsKLWV4dGVybiBpbnQgbXVsdGl2aXNfMjRjb3VudDsKLQotZXh0ZXJuIHZvaWQgY2hlY2tfZm9yX211bHRpdmlzKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnBwOHRvMjQoaW50LCBpbnQsIGludCwgaW50KTsKLWV4dGVybiB2b2lkIG1hcmtfOGJwcChpbnQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ184VE8yNF9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvQ2hhbmdlTG9nIGIveDExdm5jL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlMzNiMi4uMDAwMDAwMAotLS0gYS94MTF2bmMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NyArMCwwIEBACi0yMDEwLTEyLTI5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBVc2Ugb3BlbmdsIHRvIHJlYWQgc2NyZWVuIG9uIG1hY29zeC4gRXhwZXJpbWVudGFsCi0JICB1c2Ugb2Ygbm9uLWRlcHJlY2F0ZWQgbWFjb3N4IGludGVyZmFjZXMgZm9yIGlucHV0IGluamVjdGlvbi4KLQkgIEZpeCBjdXJzb3JzIGZvciA2NGJpdCBtYWNvc3guIEFkZCAtdW5peHNvY2sgb3B0aW9uLiAgV29yayBhcm91bmQKLQkgIGdyZXAgaXNzdWUgb24gT3BlbkJTRCBpbiBjcmVhdGVfZGlzcGxheS4KLQotMjAxMC0xMi0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogQWRkIFJFTEVBU0UtTk9URVMuIENhbGwgc2h1dGRvd25fdWlucHV0KCkgd2hlbiBleGl0aW5nLgotCSAgRnJlZSBzb21lIG1pbm9yIG1lbW9yeS4gIERvIG5vdCB1c2UgR2V0TWFpbkRldmljZSgpIG9uIG1hY29zeC4KLQkgIEFkZCB1dGlsaXR5IHNjcmlwdHMgcXRfdHNsaWJfaW5qZWN0LnBsIGFuZCB1aW5wdXQucGwuIE9wdGlvbgotCSAgLXVuZ3JhYmJvdGggKG5vdCB1c2VmdWwuKSAgWDExVk5DX1NCX0ZBQ1RPUiAtc2IgdXNlciB0d2Vhay4KLQkgIFgxMVZOQ19SRUZMRUNUX3tiaXRzUGVyU2FtcGxlLHNhbXBsZXNQZXJQaXhlbCxieXRlc1BlclBpeGVsfQotCSAgZm9yIC1yZWZsZWN0IHZuY2NsaWVudC4gIEZpeCBtaW5vciBmZCBsZWFrcy4gRm9yIC1jcmVhdGUgbW9kZQotCSAgcHJlc2VydmUgTENfQUxMOyBGSU5EX0RJU1BMQVlfTk9fVlRfRklORCwgRklORF9ESVNQTEFZX05PX0xTT0YsCi0JICBhbmQgWDExVk5DX0NSRUFURV9MQ19BTExfQ19PSy4gIFNwZWVkIHVwIC1maW5kIGFuZCAgLWNyZWF0ZSBzY3JpcHRzCi0JICBmb3IgbGFyZ2UgaW5zdGFsbGF0aW9ucy4gIEVuYWJsZSBkaXJlY3QgZXZlbnQgaW5wdXQgbW9kZXMgdG8KLQkgIGJ5cGFzcyB1aW5wdXQuICBUU0xJQiBzdXBwb3J0IGZvciB1aW5wdXQgdG91Y2hzY3JlZW5zLiAgSGFuZGxlCi0JICBwcmVzc3VyZSBldmVudHMgb24gdG91Y2hzY3JlZW5zLiAgVXNlciBjYW4gc2V0IFgxMVZOQ19VSU5QVVRfQlVTCi0JICBhbmQgWDExVk5DX1VJTlBVVF9WRVJTSU9OLiAgQWxsb3cgVGFiIHN3aXRjaCBpbiAtY3JlYXRlIGxvZ2luOgotCSAgcHJvbXB0LiAgRml4IGJ1ZyBpbiBzZXR0aW5nIGJwcCBmb3IgLXJhd2ZiLiAgSmF2YSB2aWV3ZXJzIG5vdwotCSAgaGFuZGxlIG1vdXNld2hlZWwgZXZlbnRzLiBObyB2YXJzIG5hbWVkIG5ldy4KLQotMjAxMC0wOS0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogdXBkYXRlIGNsYXNzZXMvc3NsIGphcnMsIHBhdGNoZXMsIGFuZCBzY3JpcHQuIAotCSAgdXBkYXRlIHByZXBhcmVfeDExdm5jX2Rpc3Quc2ggdG8gMC45LjEzLiBNYWtlZmlsZS5hbSBubyB0b3Bfc3JjZGlyCi0JICBBbGxvdyB1c2VyIHRvIHNldCBhdmFoaSBuYW1lIGFuZCBwb3J0IHZpYSBlbnYuIHZhcnMuICBBZGQKLQkgIGF2YWhpX3RpbWVvdXQoKSBzaWdhbGFybS4gIFJlbmFtZSBwb2ludGVyKCkgdG8gcG9pbnRlcl9ldmVudCgpCi0JICBiZWNhdXNlIFhkZWZzLmggaXMgaW5jbHVkZWQgZm9yIHNvbWUgdW5rbm93biByZWFzb24uIEFkZAotCSAgLWFsd2F5c19pbmplY3Qgb3B0aW9uLiAgQWRkIHZuY19yZWZsZWN0X2N1cnNvcl9wb3MoKSBmb3IgLXJlZmxlY3QKLQkgIG1vZGUuICBBdHRlbXB0IGF0IGxpYnZuY2NsaWVudCBWZU5DcnlwdCAoZGlzYWJsZWQuKSAgRml4IGJ1ZwotCSAgd2l0aCAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciBtaXNzaW5nIEZpbmlzaGVkRnJhbWVCdWZmZXJVcGRhdGUuCi0JICBNb3JlIGluZm8gaW4gVm5jVmlld2VyLmNsYXNzIGh0dHAgd2FybmluZy4gIExvb2sgZm9yIGdkbSogaW4KLQkgIGZpbmQgZGlzcGxheSBoZXVyaXN0aWNzIChlLmcuIGdkbTMpLiAgTW9yZSBoZXVyaXN0aWNzIHdpdGgKLQkgIFhBVVRITE9DQUxIT1NUTkFNRSBhdHRlbXB0cy4gIFgxMVZOQ19DUkVBVEVfTUFYX0RJU1BMQVlTOiBsZXQgdXNlcgotCSAgc3BlY2lmeSBtYXggbnVtYmVyIG9mIC1jcmVhdGUgZGlzcGxheXMuICBGRF9VU0VSUFJFRlMgbW9kZXMgZm9yCi0JICAtdW5peHB3ICh1c2VyIGNvbmYgZmlsZS4pIERvY3VtZW50IGFsbCBleGl0aW5nIGJlaGF2aW9yLiAgTGV0Ci0JICB1c2VyIHNldCBYMTFWTkNfTk9fTElNSVRfU0hNIHRvIGF2b2lkIGF1dG9yZWR1Y3Rpb24uICBMb29rIGZvcgotCSAga2RtIHdoZW4gYXZvaWRpbmcgYmVpbmcga2lsbGVkIGJ5IGRtLCBjaGFuZ2UgdGltaW5ncyB0b28uCi0KLTIwMTAtMDUtMDggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHNldCBjZC0+dW5peG5hbWUgaW4gYXBwbHlfb3B0cy4gIFByaW50IG1lc3NhZ2UgaW4KLQkgIHZuY19yZWZsZWN0X3Jlc2l6ZS4gIFNvbWUgdHdlYWtzIHRvIHByZXBhcmVfeDExdm5jX2Rpc3Quc2gKLQotMjAxMC0wNS0wMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFIG9wdGlvbiB0byBkaXNhYmxlIFNTTAotCSAgY2xpZW50IHJvbGUgaW4gcmV2ZXJzZSBjb25uZWN0aW9ucy4gIEltcHJvdmVtZW50cyB0byBsb2dnaW5nIGluCi0JICB1bHRyYXZuY19yZXBlYXRlciwgVUxUUkFWTkNfUkVQRUFURVJfTk9fUkZCIG9wdGlvbi4gIEluY3JlYXNlCi0JICBTU0wgdGltZW91dCBhbmQgcHJpbnQgbWVzc2FnZSBpZiAncmVwZWF0ZXInIG1vZGUgaXMgZGV0ZWN0ZWQgZm9yCi0JICByZXZlcnNlIFNTTCBjb25uZWN0aW9uLiAgRml4IFJFQ09SRCBzY3JvbGwgWENvcHlBcmVhIGRldGVjdGlvbgotCSAgd2l0aCByZWNlbnQgZ3RrL2dkayBsaWJyYXJ5OyBzZXQgWDExVk5DX1NDUk9MTF9NVVNUX0VRVUFMCi0JICB0byBkaXNhYmxlLiAgTGltaXQgbG9nZ2luZyBvZiBSRUNPUkQgZXJyb3IgbWVzc2FnZXMuCi0KLTIwMTAtMDQtMjUgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGluY29ycG9yYXRlIG5ldyB1bHRyYXZuY19kc21faGVscGVyLmMsIGFkZCBwb2ludGVyX21hc2sKLQkgIHJlbW90ZSBjb250cm9sIHF1ZXJ5LiAgQ3V0IG9wZW5zc2wgZGVmYXVsdCAtcGluZyBkZWxheS4KLQotMjAxMC0wNC0xOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYy9taXNjOiBpbXByb3ZlbWVudHMgdG8gZGVtbyBzY3JpcHRzCi0JKiB4MTF2bmM6IEFsaWFzIC1jb2UgZm9yIC1jb25uZWN0X29yX2V4aXQuICBtb3JlIGFjY3VyYXRlCi0JICBkb3R0ZWRfaXAoKSBhbmQgLWxpc3RlbjYuICBJbXByb3ZlbWVudHMgdG8gaXB2NiBtb2RlLgotCSAgaHR0cCBpbnRlcmZhY2UgZm9yIFgxMVZOQ19IVFRQX0xJU1RFTl9MT0NBTEhPU1QuICBQcmludAotCSAgd2FybmluZyBhYm91dCBtaXNzaW5nIFh2ZmIsIFhkdW1teSwgb3IgWHZuYyBpbiAtY3JlYXRlLgotCSAgRml4IF9fTElOVVhfVklERU9ERVYyX0ggLyBIQVZFX1Y0TDIuIEFsd2F5cyBwcmludCBvdXQgaW5mbwotCSAgYWJvdXQgWGluZXJhbWEgc2NyZWVucy4KLQkqIHgxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlcjogY2hlY2sgZm9yIGhvc3QgY21kLgotCSAgZml4IHN0dW5uZWwgbW9kZSB3L28gcHJveHkuICBVcGRhdGUgdG8gc3R1bm5lbCA0LjMzLCBGaXgKLQkgIGJ1aWxkLnVuaXggd2l0aCBuZXcgc3R1bm5lbCBvbiBTb2xhcmlzLiBpcHY2IHN1cHBvcnQgZm9yCi0JICB1bml4IHNzdm5jdmlld2VyCi0KLTIwMTAtMDQtMDkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBjbGFzc2VzL3NzbDogZGVidWdnaW5nIGFuZCB3b3JrYXJvdW5kcyBmb3IgamF2YSB2aWV3ZXIKLQkqIHgxMXZuYy9taXNjOiBzeW5jIHNzdm5jLCBpbXByb3ZlIHV0aWwgc2NyaXB0cy4KLQkqIHgxMXZuYzogZXhpdCgxKSBmb3IgLWNvbm5lY3Rfb3JfZXhpdCBmYWlsdXJlLCBxdWlldCBxdWVyeQotCSAgbW9kZSBmb3IgZ3JhYl9zdGF0ZSwgZXRjLiBpcHY2IHN1cHBvcnQuIFNUVU5ORUxfTElTVEVOIGZvcgotCSAgcGFydGljdWxhciBpbnRlcmZhY2UuIC1pbnB1dF9lYWdlcmx5IGluIGFkZGl0aW9uIHRvIC1hbGxpbnB1dC4KLQkgIHF1aWV0IFhpbmVyYW1hIG1lc3NhZ2UuCi0KLTIwMTAtMDMtMjAgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBjbGFzc2VzL3NzbDogTWFueSBpbXByb3ZlbWVudHMgdG8gSmF2YSBTU0wgYXBwbGV0LCBvbmV0aW1la2V5Ci0JICBzZXJ2ZXJDZXJ0IHBhcmFtLCBkZWJ1Z2dpbmcgcHJpbnRvdXQsIHVzZXIgZGlhbG9ncywgY2F0Y2gKLQkgIHNvY2tldCBleGNlcHRpb25zLCBhdXRvZGV0ZWN0IHgxMXZuYyBmb3IgR0VUPTEuCi0JKiB4MTF2bmM6IG1pc2Mvc2NyaXB0czogZGVza3RvcC5jZ2ksIGluZXQ2dG80LCBwYW5uZXIucGwuCi0JICBYMTFWTkNfSFRUUFNfRE9XTkxPQURfV0FJVF9USU1FLCAtdW5peHB3ICV4eHggZG9jdW1lbnRlZCwgYW5kCi0JICBjYW4gcnVuIHVzZXIgY21kIGluIFVOSVhQV19DTUQuIEZEX1hETUNQX0lGIGZvciBjcmVhdGUgc2NyaXB0LAotCSAgYXV0b2RldGVjdCBkbSBvbiB1ZHA2IG9ubHkuICBRdWVyaWVzOiBwb2ludGVyX3gsIHBvaW50ZXJfeSwKLQkgIHBvaW50ZXJfc2FtZSwgcG9pbnRlcl9yb290LiAgU3dpdGNoIG9uIC14a2QgaWYga2V5c3ltcyBwZXIga2V5ID4KLQkgIDQgaW4gYWxsIGNhc2VzLiAgZGFlbW9uIG1vZGUgaW1wcm92ZW1lbnRzIGZvciBjb25uZWN0X3N3aXRjaCwKLQkgIGluZXQ2dG80LCB1bHRyYXZuY19yZXBlYXRlci5wbC4gIER5bmFtaWMgY2hhbmdlIG9mIC1jbGlwIGRvCi0JICBub3QgY3JlYXRlIG5ldyBmYiBpZiBXeEggaXMgdW5jaGFuZ2VkLgotCi0yMDEwLTAyLTIyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogY2xhc3Nlcy9zc2w6IEphdmEgU1NMIGFwcGxldCB2aWV3ZXIgbm93IHdvcmtzIHdpdGggY2VydGlmaWNhdGUKLQkgIGNoYWlucy4KLQkqIHgxMXZuYzogUHJpbnRvdXQgb3B0aW9uIC1zc2xTY3JpcHRzLiAgU3VnZ2VzdCAtYXV0aCBndWVzcwotCSAgaW4gZXJyb3IgbWVzc2FnZS4gIFNldCBmYWtlX3NjcmVlbiB3aWR0aCBhbmQgaGVpZ2h0LiAgVGVzdAotCSAgZm9yICtrYiBpbiBYdmZiLgotCi0yMDEwLTAxLTAyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBzbWFsbCB0d2Vha3MgdG8gWGR1bW15LCByeDExdm5jKi4gIEFwcGx5Ci0JICBTTUFMTF9GT09UUFJJTlQgdG8gLWFwcHNoYXJlIHRleHQuICBDb3B5cmlnaHQgeWVhciBjaGFuZ2UuCi0KLTIwMDktMTItMjkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHJlbmFtZSAtY3JlYXRlX3ggdG8gLWNyZWF0ZV94c3J2LiAgSG9wZWZ1bGx5Ci0JICBkb25lIGZpeGluZyBYZHVtbXkuCi0KLTIwMDktMTItMjggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IEZpeCBwcm9ibGVtcyBpbiAtLXdpdGhvdXQteCBidWlsZHMuICBGaXggY3Jhc2gKLQkgIHdpdGggLVFEIHF1ZXJ5IGZvciBkYnVzIGluZm8uICBBZGp1c3Qgd2luZG93IHNpemUgZm9yCi0JICBzbWFsbCBzY3JlZW5zIGluIC1ndWkuICBJbXByb3ZlIEYxIGhlbHAgZm9yIHhkbSwgZXRjLgotCSAgaW5jbHVkZSBzc3ZuYyAxLjAuMjUgc291cmNlLgotCi0yMDA5LTEyLTI0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBwcmVwYXJlX3gxMXZuY19kaXN0LnNoIGZvciAwLjkuMTAuIC14ZHVtbXlfeHZmYiwKLQkgIC1zdmNfeGR1bW15X3h2ZmIgYW5kIC1jcmVhdGVfeCBzaG9ydGhhbmQuIGx4ZGUgc2Vzc2lvbi4KLQkgIFhkdW1teSBpbXByb3ZlbWVudHMgYW5kIHJvb3Qgbm8gbG9uZ2VyIHJlcXVpcmVkLgotCi0yMDA5LTEyLTIxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtREVOQ19IQVZFX09QRU5TU0w9MCB0byBkaXNhYmxlIGVuYy5oIGJ1dCBzdGlsbAotCSAgaGF2ZSBzc2wuIFR3ZWFrIHBzIGNvbW1hbmQgaW4gZmluZF9kaXNwbGF5LiBUcnkgdG8gaGFuZGxlCi0JICBBSVggc3UuIElnbm9yZSBhbiBpbml0aWFsIG5ld2xpbmUgYXQgbG9naW46IGZvciAtdW5peHB3LgotCi0yMDA5LTEyLTE4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBmaXgga2V5Y29kZSBhbmQgb3RoZXIgcmVtb3RlIGNvbnRyb2wgYWN0aW9ucyB1bmRlcgotCSAgRElSRUNUOiB3aXRoIGFuIGV4dHJhIFhGbHVzaCBhbmQgb3RoZXIgc2FmZXR5IG1lYXN1cmVzLgotCSAgZmZsdXNoKHN0ZGVycikgbXVjaCBpbiBzdV92ZXJpZnkuICBNYWtlIHRoZSAtdW5peHB3IGVudi4gdmFycwotCSAgVU5JWFBXX0RJU0FCTEVfU1NMIGFuZCBVTklYUFdfRElTQUJMRV9MT0NBTEhPU1Qgd29yayBjb3JyZWN0bHkuCi0JICBNYWtlIC1sb29wYmcgYWN0dWFsbHkgaW1wbHkgLWJnLiAgQWRkIHRhZz0uLi4gdG8gdW5peHB3IG9wdHMKLQkgIHRvIHNldCBGRF9UQUcuICBQcmVmZXIgWHZmYiBvdmVyIFhkdW1teS4gIFJlZHVjZSB3YWl0IHRpbWUKLQkgIGZvciBodHRwcy4gQWRkICdMb2dpbiBzdWNjZWVkZWQnIG91dHB1dCB0byB1bml4cHcgcGFuZWwuCi0KLTIwMDktMTItMTUgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IFgxMVZOQ19SRU1PVEUsIFgxMVZOQ19USUNLRVIsIGFuZCBWTkNfQ09OTkVDVCBwcm9wZXJ0aWVzCi0JICBuYW1lcyBjYW4gYmUgY2hhbmdlZCB2aWEgZW52LiB2YXJzIChlLmcuIGZvciBtdWx0aXBsZQotCSAgeDExdm5jIGluc3RhbmNlcy4pIFRoZSAtcXVpZXQgb3B0aW9uIGRvY3VtZW50ZWQgYmV0dGVyLgotCSAgQWRkIGZha2VidXR0b25ldmVudCByZW1vdGUgY29udHJvbCBhY3Rpb24uICBJbXByb3ZlIGNoaWxkCi0JICB0ZXN0IGZvciBjb25uZWN0aW5nIHRvIHBvcnQgMTEzLiAgQWRkIGNvbm5lY3Rfc3dpdGNoIGFuZAotCSAgdWx0cmF2bmNfcmVwZWF0ZXIucGwgdG8gQ1ZTLiBSZXBvcnQgWCBzZXJ2ZXIgbnVtYmVyIG9mIG1vdXNlCi0JICBidXR0b25zLiAgQ2hhbmdlIGZpbmRfZGlzcGxheSBzY3JpcHQgdG8gY2hlY2sgZm9yIHN0YWxlIHBpZHMKLQkgIGluIC90bXAvLlhOTi1sb2NrLiAgSWYgcm9vdCB1bmRlciBmaW5kX2Rpc3BsYXksIHRyeSBGRF9YRE0KLQkgIGlmIHByZXZpb3VzIGZhaWxlZCB0byBmaW5kIGF1dGguICBQcmludCBlcnJvciByZWFzb25zIGZvcgotCSAgLXN0b3JlcGFzc3dkIGZhaWx1cmVzLgotCi0yMDA5LTEyLTA2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBmaW5kYXV0aC8tYXV0aCBndWVzcyB3b3JrcyB3aXRoIEZEX1hETT0xIGZvciByb290Ci0JICBmaW5kaW5nIGRtJ3MgeGF1dGhvcml0eS4gIFdvcmsgYXJvdW5kIGZvciBHRE0ncyByZWNlbnQgCi0JICAneGhvc3QgU0k6bG9jYWx1c2VyOnJvb3QnIHVzYWdlLiBYMTFWTkNfUkVPUEVOX1NMRUVQX01BWAotCSAgZm9yIGxvbmdlciBsaXZlZCAtcmVvcGVuLWluZy4gWDExVk5DX0VYVFJBX0hUVFBTX1BBUkFNUyBmb3IKLQkgIGFkZGl0aW9uYWwgVVJMIHBhcmFtZXRlcnMsIFgxMVZOQ19IVFRQX0xJU1RFTl9MT0NBTEhPU1Q9MSB0bwotCSAgZm9yY2UgbGlidm5jc2VydmVyIGh0dHAgdG8gbGlzdGVuIG9uIGxvY2FsaG9zdC4KLQotMjAwOS0xMi0wNCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGNsYXNzZXMvc3NsOiB1cGRhdGUgYmluYXJpZXM7IG5ldyBzaWduaW5nIGtleTsgc3Nfdm5jdmlld2VyLgotCSogeDExdm5jOiBhZGQgbW9yZSB3aXNoIHBvc3NpYmlsaXRpZXMgZm9yIC1ndWkuICBEZWNsYXJlIGNyeXB0KCkKLQkgIG9uIGFsbCBwbGF0Zm9ybXMgKGRpc2FibGUgd2l0aCAtRERPX05PVF9ERUNMQVJFX0NSWVBULikKLQotMjAwOS0xMi0wMiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLWFwcHNoYXJlIG1vZGUgZm9yIHNoYXJpbmcgYW4gYXBwbGljYXRpb24gd2luZG93cyBvZiB0aGUKLQkgIGVudGlyZSBkZXNrdG9wLiBtYXAgcG9ydCArIDU1MDAgaW4gcmV2ZXJzZSBjb25uZWN0LiAgQWRkIGlkX2NtZAotCSAgcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zIGZvciBpZCAoYW5kIG90aGVyKSB3aW5kb3dzLiAgQWxsb3cgemVybwotCSAgcG9ydCBpbiBTU0wgcmV2ZXJzZSBjb25uZWN0aW9ucy4gIEFkanVzdCBkZWxheXMgYmV0d2VlbiBtdWx0aXBsZQotCSAgcmV2ZXJzZSBjb25uZWN0aW9uczsgWDExVk5DX1JFVkVSU0VfU0xFRVBfTUFYIGVudiB2YXIuICBBZGQgc29tZQotCSAgbWlzc2luZyBtdXRleCBsb2NrczsgYWRkIElOUFVUX0xPQ0sgYW5kIHRocmVhZHNfZHJvcF9pbnB1dC4KLQkgIE1vcmUgc2FmZXR5IGluIC10aHJlYWRzIG1vZGUgZm9yIG5ldyBmcmFtZWJ1ZmZlciBjaGFuZ2UuICBGaXgKLQkgIHNvbWUgc3RkZXJyIGxlYWtpbmcgaW4gLWluZXRkIG1vZGUuCi0KLTIwMDktMTEtMTggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHVzZSAtdGltZW91dCBzZXR0aW5nIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zIHRvby4KLQkgIERlbGF5IGNhbGxpbmcgeGZpeGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgMXN0IGNvbm5lY3Rpb24gdG8gYXZvaWQKLQkgIGRpc3BsYXkgbWFuYWdlciBYb3JnIHNlcnZlciBjcmFzaC4gIERlbGF5IHNlbHdpbiBjcmVhdGlvbiBhdCB0aGUKLQkgIGJlZ2luIDFzdCBjb25uZWN0aW9uIHRvIGF2b2lkIGJlaW5nIGtpbGxlZCBieSBkaXNwbGF5IG1hbmFnZXIuCi0JICBPcHRpb25zIC1maW5kYXV0aCBhbmQgJy1hdXRoIGd1ZXNzJy4gRXhwb3J0IGljb25fbW9kZSBxdWVyeS4KLQkgIERvIG5vdCBvcGVuIFggZGlzcGxheSBpbiAtcmF3ZmIgbW9kZSB1bmxlc3MgYXNrZWQuIEJ1Z2ZpeCBmb3IKLQkgIC1zaWQvLWlkIGhhbmRsaW5nIHdpbmRvdyBvZmZzY3JlZW4gb3IgYmlnZ2VyIHRoYW4gZGlzcGxheS4KLQkgIFNlYXJjaCBmb3Igd2luZG93cyB3aXRoIF9EQlVTX1NFU1NJT05fQlVTX1BJRCB0byBkZWNpZGUgd2hpY2gKLQkgIGRidXNfbGF1bmNoIGlzIG91cnMuIEZpeCBtaXNzaW5nIGRpc3BsYXlzIGluIEZJTkRfRElTUExBWQotCSAgc2NyaXB0LiAgQWRkIFgxMVZOQ19TS0lQX0RJU1BMQVlfTkVHQVRFLiAgSW1wcm92ZW1lbnRzIHRvCi0JICAneDExdm5jIFByb3BlcnRpZXMnIGd1aSBkaWFsb2cgYW5kIGNvbm5lY3Rpbmcgd2l0aCB4MTF2bmMgdmlhCi0JICBzb2NrZXQgKGNsaWVudCBsaXN0LikgWDExVk5DX1NZU1RFTV9HUkVFVEVSMSBmb3IgcHJldmlvdXMgdGV4dAotCSAgZm9udCBzaXplLiAgRml4IGJ1ZyB3aXRoIHVuaXhwdyBhbmQgdmVuY3J5cHQgcGxhaW4gbG9naW4uCi0JICBIYXZlIGZhc3QgZmIgcmVhZCByYXRlIGtlZXAgd2FpdG1zIGFuZCBkZWZlciB0aGUgc2FtZS4KLQkgIE1vcmUgaGV1cmlzdGljcyB0byBjaGVjayB0cnkgaWYgR0RNIGlzIHN0aWxsIHJ1bm5pbmcgKHdpbmRvdwotCSAgbmFtZXMgZ2RtLSopCi0KLTIwMDktMTAtMTcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHN1cHBvcnQgZm9yIC1zb2xpZCBvcHRpb24gaW4geGZjZSBkZXNrdG9wLiAgCi0JICBMaXN0IC1RIGd1ZXNzX2RidXMgcXVlcnkuIEltcGxlbWVudCAtc2hvd3JmYmF1dGggb3B0aW9uLgotCSAgV29ya2Fyb3VuZCBmb3IgaW5hbmUgWF9TaG1BdHRhY2ggaW5jb21wYXRpYmlsaXR5IGluIFhvcmcuCi0KLTIwMDktMTAtMDggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGJjeF94YXR0YWNoL3gyeCBkZXNrdG9wIHN3aXRjaGluZyBmYWNpbGl0eS4KLQkgIE1vcmUgcmVtb3RlIGNvbnRyb2wgZmVhdHVyZXM6IGdyYWJfc3RhdGUsIHBpbmc6bXlzdHJpbmcsCi0JICBncmFibG9jYWwsIHJlc2VuZF9jdXRidWZmZXIsIHJlc2VuZF9jbGlwYm9hcmQsIHJlc2VuZF9wcmltYXJ5LAotCSAga2V5Y29kZSwga2V5c3ltLCBwdHIsIHNsZWVwLCBnZXRfeHByb3AsIHNldF94cHJvcCwgd2luaW5mbywKLQkgIHBvaW50ZXJfcG9zLCBtb3VzZV94eSwgbm9vcCwgZ3Vlc3NfZGJ1cyBBZGQgRElSRUNUOiBmb3IKLQkgIHJlbW90ZSBjb250cm9sIHcvbyBzZXJ2ZXIuICBYMTFWTkNfTk9fQ0hFQ0tfUE0gZm9yIG1vcmUKLQkgIHF1aWV0IERJUkVDVDogdXNhZ2UuICBPcHRpb25zIC1xdWVyeV9yZXRyaWVzLCAtcmVtb3RlX3ByZWZpeCwKLQkgIGFuZCBYMTFWTkNfU1lOQ19USU1FT1VUIGZvciByZW1vdGUgY29udHJvbC4gIEFkZCBzY3JpcHRpbmcKLQkgIHRvIHJlbW90ZSBjb250cm9sLiAgcGluZyBjbGllbnRzIGR1cmluZyBpbiB1bml4cHcgbG9naW4uCi0JICBPcHRpb24gLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBhcyBzaG9ydGN1dCB0byBYRE0vR0RNL2V0YyBwYW5lbC4KLQkgIEFkZCBjbGVhcl9hbGwsIHZpZXdvbmx5LCBub2Rpc3BsYXksIHRvIHVuaXhwdyB1c2VybmFtZTpvcHRzLgotCSAgRjEgaGVscCBmb3Igb3B0aW9ucyAoaW5jbHVkaW5nIHNtYWxsZXIgY29uc29sZSBmb250KS4KLQkgIERvY3VtZW50IEZEX1RBRy4gIEVhdCBtdWx0aXBsZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGluIG9uZQotCSAgc2l0dGluZyAoYWxzbyBQUk9QX0RCRz0xKS4gIFN1cHBvcnQgbW9yZSAtc3NsIGZlYXR1cmVzIChzcGVjaWFsCi0JICBjZXJ0IG5hbWVzLCBzaW5nbGUgcG9ydCwgY2xpZW50IGNlcnRzLCBldGMuKSBpbiAtc3R1bm5lbAotCSAgZXh0ZXJuYWwgU1NMIGhlbHBlciBtb2RlLiAgUmVvcmdhbml6ZSBvcGVuc3NsIGNvZGUgdG8gYWxsb3cKLQkgIGludGVncmF0aW9uIHdpdGggc3R1bm5lbCBmZWF0dXJlcyBpZiBub3QgY29tcGlsZWQgd2l0aCBvcGVuc3NsLgotCSAgWDExVk5DX0hUVFBTX1ZTX1ZOQ19USU1FT1VUIEZpeCBkYnVzIHNlc3Npb24gYWRkcmVzcyBmb3IgLXNvbGlkCi0JICBpbiBnbm9tZS4gIFVzZSBkYnVzLWxhdW5jaCBpbiAtY3JlYXRlIG1vZGUgaWYgYXZhaWxhYmxlLgotCSAgWDExVk5DX1NLSVBfRElTUExBWT1hbGwgaW4gLWZpbmQvLWNyZWF0ZSBtb2RlLiAgbGV0IG5veGF1dGgKLQkgIHVuc2V0IFhBVVRIT1JJVFkgZm9yIHVzZSB3aXRoIHN1IC0gJFVTRVIuIENSRUFURV9ESVNQTEFZX0VYRUMKLQkgIGRlYnVnZ2luZy4gIEFkZCB4X3Rlcm1pbmFsX2VtdWxhdG9yIHRvIC1jcmVhdGUgY21kIHNlYXJjaC4KLQkgIE9wdGlvbiAtZXh0cmFfZmJ1ciB0byB0dW5lIGZiIHVwZGF0ZSByZXF1ZXN0cyB0cmFja2luZzsgbWFrZQotCSAgZGVmYXVsdCB0cmFja2luZyBtb3JlIGFnZ3Jlc3NpdmUuICBSQVRFX1ZFUkIvQ0hFQ0tfUkFURSBlbnYuIGZvcgotCSAgZmJ1ciByYXRlLiAgRW52LiB2YXJzIHRvIHNldCBUayBndWkgZm9udHMuICBDYXRjaCBjbG9zZWQKLQkgIHNvY2tldCByZWFkcy93cml0ZXMuICBUcnkgdG8gZGV0ZWN0ICdjcmF6eScgeGRhbWFnZSBpbnNlcnRpb24sCi0JICBlLmcuIGZyb20gc29tZSB4c2NyZWVuc2F2ZXJzIChuZWVkcyB3b3JrLikuICBEb24ndCBzd2l0Y2gKLQkgIG9uIHNlcnZlciBhdXRvcmVwZWF0IGlmIGFueSBrZXlzIGFyZSBwcmVzc2VkIGRvd24gdG8gd29yawotCSAgYXJvdW5kIFhvcmcgc2VydmVyIGFuZC9vciBnbm9tZSBidWcuICBJZiBQQVRIIGlzIGVtcHR5LCBzZXQKLQkgIGl0IHRvIG1pbmltYWwgb25lLiAgRml4IGJ1ZyB3aXRoIC1iZyBhbmQgLWRwLy1kayBwcmludG91dCBpZgotCSAgbG9nZmlsZSBwcmVzZW50LgotCSogY2xhc3Nlcy9zc2w6IGxpY2Vuc2Ugc3RhdGVtZW50LgotCi0yMDA5LTA2LTE4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogY2xhc3Nlcy9zc2w6IGphdmEgdmlld2VyIG5vdyBoYW5kbGVzIGF1dGgtYmFzaWMgcHJveHkgbG9naW5zLgotCSogbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXI6IHVwZGF0ZSBzc3ZuYy4KLQotMjAwOS0wNi0xNCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogQWRkIFgxMVZOQ19SRUZMRUNUX1BBU1NXT1JEIGVudi4gdmFyLiBmb3IgLXJlZmxlY3QgbW9kZS4KLQkgIE1lc3NhZ2UgdG8gdXNlciBhYm91dCBjb21waXogcHJvYmxlbXMgc3VnZ2VzdGluZyAtbm94ZGFtYWdlLgotCSAgSW1wcm92ZW1lbnRzIHRvIHNpbmdsZS1wb3J0IGRldGVjdGlvbiBhbmQgbG9nZ2luZy4KLQotMjAwOS0wNS0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogVGhyZWFkIHNhZmV0eSBpbXByb3ZlbWVudHMuIEFkZCAnT3Blbk9mZmljZScgdG8gc3BlY2lhbAotCSAgY2FzZSBsaXN0IGZvciBzY3JvbGwgZGV0ZWN0aW9uLiAgRml4IC1jbGlwIG1vZGUgdW5kZXIgLXJhd2ZiLgotCSAgV29ya2Fyb3VuZCBYb3JnIGJ1ZyB0aGF0IHlpZWxkcyBpbmZpbml0ZWx5IHJlcGVhdGluZyBrZXlzCi0JICB3aGVuICd4c2V0IHIgb2ZmJyBhY3Rpb24gaXMgZG9uZSB3aXRoIGtleXMgcHJlc3NlZC4gRW52LiB2YXIKLQkgIFgxMVZOQ19JRExFX1RJTUVPVVQuCi0KLTIwMDktMDMtMTIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IEZpeCBvZmYtc2NyZWVuIGJ1ZyBmb3IgLW5jYWNoZV9jciBjb3B5cmVjdC4KLQotMjAwOS0wMy0wNyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWxsb3cgcmFuZ2UgZm9yIFgxMVZOQ19TS0lQX0RJU1BMQVksIGRvY3VtZW50IGdyYWIKLQkgIFhzZXJ2ZXIgaXNzdWUuICBBZGQgcHJvZ3Jlc3NfY2xpZW50KCkgdG8gcHJvY2VlZCBtb3JlIHF1aWNrbHkKLQkgIHRocnUgaGFuZHNoYWtlLiAgSW1wcm92ZW1lbnRzIHRvIHR1cmJvdm5jIGhhY2suCi0KLTIwMDktMDItMjggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCBrbHVkZ2UgdG8gZXhwZXJpbWVudCB3aXRoIHR1cmJvdm5jLgotCi0yMDA5LTAyLTI1ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBmaXggc29tZSAtUUQgY2FzZXMgZm9yIHVzZSBpbiB0a3gxMXZuYy4KLQotMjAwOS0wMi0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC1ub3NraXBfbG9ja2tleXMgb3B0aW9uIGZvciBmdXR1cmUgdXNlLgotCi0yMDA5LTAyLTAzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBBZGQgInNlbmRiZWxsIiByZW1vdGUgY21kLiAgRml4IGNvcHlyZWN0IHVwZGF0ZXMgdW5kZXIKLQkgIC1yZWZsZWN0LiAgV29ya2Fyb3VuZCB0aGF0IGNoZWNrcyB2YWxpZCB3aW5kb3cgb2Ygc2VsZWN0aW9uCi0JICByZXF1ZXN0b3IuICBXYWl0IG9uIHNvbWUgc3NsIGhlbHBlciBwaWRzIGVhcmxpZXIuICBXb3JrYXJvdW5kCi0JICBYQVVUSExPQ0FMSE9TVE5BTUUgZm9yIHNvbWUgbmV3IHVzYWdlIG1vZGVzLiAgU2V0IGZha2UgZmIgdG8KLQkgIHJlcXVlc3RlZCBicHAgd2l0aCBjb3JyZWN0IG1hc2tzLiAgLXBhZGdlb20gb25jZTouLi4gbW9kZS4KLQkgIFNldCBMSUJYQ0JfQUxMT1dfU0xPUFBZX0xPQ0sgYnkgZGVmYXVsdC4gcmZiUmFuZG9tQnl0ZXMgZWFybGllci4KLQkqIGNsYXNzZXMvc3NsOiBVcGRhdGUgamFycy4gIEFkZCAiVE9QXyIgZHJvcGRvd24gY3VzdG9taXphdGlvbiB0bwotCSAgdWx0cmF2bmMgamF2YSB2aWV3ZXIgYXBwbGV0IEZUUCBwYW5lbC4KLQotMjAwOS0wMS0xMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGNsYXNzZXMvc3NsOiBBZGQgY29uZmlndXJhYmxlIFVsdHJhIGphdmEgYXBwbGV0IEZpbGV4ZmVyIERyaXZlcwotCSAgZHJvcCBkb3duIChlLmcuIGZ0cERyb3BEb3duPUhvbWUuRGVza3RvcC5iaW4pLiAgRG9jdW1lbnQgYWxsICAKLQkgIGFwcGxldCBwYXJhbWV0ZXJzIGluIGNsYXNzZXMvc3NsL1JFQURNRS4KLQotMjAwOS0wMS0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogZml4IGZhaWx1cmUgb2YgLTh0bzI0IG9uIGRlZmF1bHQgZGVwdGggMjQgZHVlIHRvIAotCSAgbm9uc3RhbmRhcmQgaW5kZXhlZCBjb2xvciBzdXBwb3J0IGNoYW5nZXMuICBGaXggc21hbGwgd2luZG93Ci0JICBmb3IgZmFpbHVyZSBhZnRlciBYU2VuZEV2ZW50IHNlbGVjdGlvbiBjYWxsOyBhZGQgZW52IHZhci4KLQkgIFgxMVZOQ19TRU5ERVZFTlRfU1lOQz0xIHRvIHRha2UgZXZlbiBtb3JlIGNhcmUuCi0KLTIwMDktMDEtMDMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCAtcm1mbGFnIG9wdGlvbiwgLXJhd2ZiIHZ0IHN1cHBvcnQsIGJwcCA8IDggc3VwcG9ydAotCSAgZm9yIHJhd2ZiLCBmaW5kIC9kZXYvdmlkZW8gYmV0dGVyLiBGaXggcmV2ZXJzZSBTU0wgY29ubmVjdGlvbgotCSAgZm9yIERILiAgU29tZSBpbXByb3ZlbWVudHMgZm9yIENVUFMgVFMgaGVscGVyLCByZXN0YXJ0IGlmIG5lZWRlZC4KLQotMjAwOC0xMi0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogMC45LjYgcmVsZWFzZS4gIFNvbWUgc3RydG9rIGJ1Z2ZpeGVzLiByZW5hbWUgLXRsc3ZuYwotCSAgdG8gLWFub250bHMuIERpc2FibGUgc3NsIGNhY2hpbmcuICBObyBjZXJ0IGNyZWF0aW9uIHByb21wdGluZwotCSAgaW4gaW5ldGQgb3IgYmcgbW9kZXMuICB3YWl0cGlkIGEgYml0IG1vcmUgY2FyZWZ1bGx5IG9uIHNzbAotCSAgaGVscGVycy4gIFR1bmUgc3NsIGluaXRpYWwgdGltZW91dHMuIExldCAtY3JlYXRlIHVzZXIgc3BlY2lmeQotCSAgc3RhcnRpbmcgWCBkaXNwbGF5LiAgZml4IC1yZmJwb3J0IHByb21wdCBndWkgZm9yIG9sZGVyIHRrLgotCSAgLXNzbG9ubHkgb3B0aW9uLiBFcnJvciBpZiBubyAtc3NsIHdpdGggcmVsYXRlZCBvcHRpb25zLiAtcmFuZAotCSAgb3B0aW9uLiAgLXNzbCBpbXBsaWVzIC1zc2wgU0FWRQotCi0yMDA4LTExLTIyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiB4MTF2bmMuZGVza3RvcCBmaWxlLiAtcmVvcGVuLCAtZGhwYXJhbXMsIC1zc2xDUkwsCi0JICAtc2V0ZGVmZXIgb3B0aW9ucy4gLXJmYnBvcnQgUFJPTVBUIFZlTkNyeXB0IGFuZCBUTFNWTkMgU1NML1RMUwotCSAgZW5jcnlwdGlvbiBzdXBwb3J0LiAgVHdlYWtzIHRvIGNob29zZV9kZWxheSgpIGFsZ29yaXRobS4KLQkgIC1zc2wgQU5PTiBhbm9ueW1vdXNlIERpZmZpZS1IZWxsbWFuIG1vZGUuICBGaXggYnVncyBpbiBjZXJ0cwotCSAgbWFuYWdlbWVudC4gIEFkZGl0aW9ucyB0byB0cmF5PXNldHBhc3MgbmFpdmUgdXNlciBtb2RlLgotCi0yMDA4LTExLTA5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgemVyb2NvbmYgZXh0ZXJuYWwgaGVscGVycyAoYXZhaGktcHVibGlzaCBhbmQKLQkgIGRucy1zZCkuICBBbGlhcyAtemVyb2NvbmYuICBDbG9zZSBwaXBlaW5wdXRfZmggb24gZXhpdC4KLQkgIEtsdWRnZSB0byBtYWtlIC1zb2xpZCB3b3JrIG9uIE1hY09TWCBjb25zb2xlLiAgQXR0ZW1wdCBhdAotCSAgY3BwIG1hY3JvcyB0byBkaXNhYmxlIG5ld2VyIGxpYnZuY3NlcnZlciBpbnRlcmZhY2VzLgotCi0yMDA4LTEwLTI5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtaHR0cF9vbmVwb3J0IGZvciBzaW5nbGUgcG9ydCBIVFRQIGFuZCBWTkMuCi0JICBJbXByb3ZlIGZpbmRfZGlzcGxheSB3cnQgbHNvZiBibG9ja2luZyB3aXRoIC1iLgotCi0yMDA4LTEwLTE5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtY2hhdHdpbmRvdyBmb3IgY2hhdCB3aW5kb3cgb24gWCBjb25zb2xlIHVzaW5nIFNTVk5DCi0JICBhcyBhIGhlbHBlci4gUHJpbnQgc3VnZ2VzdGlvbiBmb3IgWF9TaG1BdHRhY2ggZmFpbHVyZS4KLQkgIEFsbG93IC1zY2FsZSBXeEggZm9yIGRpZmZlcmVudCBYLSBhbmQgWS1zY2FsaW5nIGZhY3RvcnMuCi0JICBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIC1lbmMgY2lwaGVyIEVWUF9hZXNfMjU2X2NmYi4gIE1vZGlmeQotCSAgbWVzc2FnZSBkaWdlc3QgYW5kIHNhbHQvSVYgcGFyYW1ldGVycy4gIFRyeSB0byBpbXByb3ZlIGNvbXBpbGUKLQkgIHRpbWUgYnkgYnJlYWtpbmcgdXAgbGFyZ2UgaWYgYmxvY2tzLgotCi0yMDA4LTA5LTIxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBBZGQgc3ltbWV0cmljIGtleSBlbmNyeXB0aW9uIC1lbmMgY2lwaGVyOmtleWZpbGUsCi0JICB3b3JrcyB3aXRoIFNTVk5DLiAgTWFrZSAtcmVtYXAgd29yayBvbiBNYWNPU1ggY29uc29sZS4KLQkgIHVwZGF0ZSB0byAwLjkuNSBzdHJpbmdzLiAgQWRkIGEgY291cGxlIG1lbnUgaXRlbXMgdG8gdGt4MTF2bmMuCi0KLTIwMDgtMDktMTcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1ha2UgLWFsbG93IHdvcmsgaW4gLXNzbCBtb2RlLgotCi0yMDA4LTA5LTE0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtc2xlZXBpbiBtLW4gZm9yIHJhbmRvbSBzbGVlcC4gTW9yZSBta3RlbXAgYW5kIG1rc3RlbXAKLQkgIHByb3RlY3Rpb25zLiBTU0xfSU5JVF9USU1FT1VUPW4gZW52LiB2YXIuICBGaXggbWFjb3N4IGNvbnNvbGUKLQkgIFggY2FsbCBidWcuICBTeW5jaHJvbml6ZSBvdGhlciBwcm9qZWN0cyBzb3VyY2VzLgotCi0yMDA4LTA5LTA2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBraWxsIGd1aV9waWQgb24gZXhpdCBpbiAtY29ubmVjdC8tY29ubmVjdF9vcl9leGl0IG1vZGUuCi0JICAtZ3JhYmxvY2FsIG4gZXhwZXJpbWVudCAobm90IGNvbXBpbGVkIGJ5IGRlZmF1bHQpLiAgLW1hY3Vza2JkCi0JICBvcHRpb24gZm9yIG1hY29zeCBmb3Igb3JpZyB1c2tkYiBjb2RlLiBrZXljb2RlPU4gcmVtb3RlIGNvbnRvbAotCSAgY21kLiAgRmluZCBkcHkgbG9vayBhdCBub24tTkZTIGNvb2tpZXMgaW4gL3RtcC4gIEZpeCBndWkgdHJheQotCSAgaW5zZXJ0aW9uIG9uIHJlY2VudCBnbm9tZSBkdC4gRml4IGNvbm5lY3RfZmlsZSBidWcuIFN5bmMgU1NWTkMKLQotMjAwOC0wNi0wNyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLWNsaXAgeGluZXJhbWFOIG9wdGlvbiwgLURJR05PUkVfR0VUU1BOQU0gZm9yIEhQLVVYLgotCSAgUHJpbnQgaW5mbyBvbiBTU0hfQ09OTkVDVElPTiBvdmVycmlkZS4KLQotMjAwOC0wNS0zMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogSW1wcm92ZW1lbnRzIHRvIG5vbnN0YW5kYXJkIGluZGV4ZWQgY29sb3Igc3VwcG9ydCwgZS5nLgotCSAgZGVwdGhzIDEsIDQsIDEyLCBldGMuIGluc3RlYWQgb2Ygb25seSA4LiAgT25seSBlbmFibGUgeGluZXJhbWEKLQkgIHh3YXJwcG9pbnRlciBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBzdWJzY3JlZW4uCi0KLTIwMDgtMDUtMDcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCBVbHRyYVZOQyByZXBlYXRlciBwcm94eSBzdXBwb3J0LiAgZml4IHRvIHNldHAgZ3VpCi0JICBtb2RlLiAtdGhyZWFkcyBpcyBub3cgc3Ryb25nbHkgZGlzY291cmFnZWQuICBSZWFkIFBPUlQ9IGluIHVybC4KLQkgIFVzZXIgY2FuIHNldCBub2xpc3RlbiBmb3IgWHZmYiBpbiAtY3JlYXRlIG1vZGUuICBjbGVhbiB1cCAKLQkgIHdhaXRfZm9yX2NsaWVudCgpIHRvIHNvbWUgZGVncmVlLgotCi0yMDA4LTAxLTMxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBkdXJpbmcgc3BlZWRzIGVzdGltYXRlLCBndWFyZCBhZ2FpbnN0IGNsaWVudAotCSAgZGlzY29ubmVjdGluZy4gIHNzdm5jIHN5bmMuCi0KLTIwMDgtMDEtMTQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IC1waW5nIG9wdGlvbiwgZml4IG1lbW9yeSBjb3JydXB0aW9uIGluIGNvcHlfdGlsZXMKLQkgIGFmdGVyIHhyYW5kciByZXNpemUuCi0KLTIwMDctMTItMTYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHNldHVwIHJlbW90ZS1jdHJsIGZpbGUgYnkgZGVmYXVsdCBvbiBtYWNvc3guIGltcHJvdmUKLQkgIHRreDExdm5jIHdydCBhdHRhY2hpbmcgdG8gZXhpc3Rpbmcgc2VydmVyIGluIGljb24vdHJheSBtb2RlLiAKLQotMjAwNy0xMi0xNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogZml4IGZpbmRfZGlzcGxheSBhbmQgdXNsZWVwKCkgcHJvdG90eXBlIG9uIG1hY29zeC4KLQkgIC1kaXNwbGF5IGNvbnNvbGUgYW5kIGNoZWNrIERJU1BMQVkgL3RtcC8uLi46MCBvbiBtYWNvc3guCi0JICBpbXBsZW1lbnQgLW5veGluZXJhbWEuCi0KLTIwMDctMTEtMTIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCBjbGVhcl9sb2NrcyAoQ2Fwc19Mb2NrLCBldGMpIGFjdGlvbi4gIEZpeAotCSAgc3NoIHR1bm5lbCBvbiBEYXJ3aW4uCi0KLTIwMDctMTAtMjcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGZpeCBuY2FjaGUgYnVnIGFuZCBvdGhlcnMgdW5kZXIgLTh0bzI0LCAtc3NoCi0JICBvcHRpb24sIHNvY2tzIGFuZCBvdGhlciBwcm94aWVzIGluIC1wcm94eSBvcHRpb24uCi0JICBjb21waWxlciB3YXJuaW5ncy4gIGZpeCBUQVJHRVRTIHNlbGVjdGlvbiByZXF1ZXN0IGJ1ZwotCSAgKGphdmEsIGtvbnNvbGUpLgotCi0yMDA3LTEwLTAzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgeGZjZSB0byBjcmVhdGVkaXNwbGF5Ci0KLTIwMDctMDktMjYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IENPTFVNTlM9MjU2IHRvIGZpbmQvY3JlYXRlIHNjcmlwdHMuIE1vcmUgcmF0ZWNoZWNrLgotCi0yMDA3LTA5LTE0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBBZGQgLXNzaHhkbXN2Yy4gRml4IGZpbmRfZGlzcGxheSBmb3IgaW5ldGQuICBJbXByb3ZlCi0JICAtYWxsaW5wdXQgbWV0aG9kOyBlbnYgQ0hFQ0tfUkFURSB0byB3YXRjaCBmb3IgRkJVUiBidWlsZCB1cAotCSAgKGkuZS4gSkZWTkMpLgotCi0yMDA3LTA5LTExICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBmaXggd2lyZWZyYW1lIGNyYXNoIHVuZGVyIC1jbGlwLiAgQWRkIC1yZWRpcmVjdCBmb3IKLQkgIFZOQyByZWRpci4gIC1yYXdmYiBudWxsYmlnLCByYW5kYmlnLCBzb2xpZCwgc3dpcmwsIGV0Yy4KLQkgIEZEX1hETSBtb2RlIHRvIGZpbmRfZGlzcGxheS4gLWxpc3RkcHkuICBBZGQgZW5saWdodGVubWVudC4KLQkgIFh2bmMucmVkaXJlY3QgRklORERJU1BMQVktdm5jX3JlZGlyZWN0LiAteHZuYywgLXh2bmNfcmVkaXJlY3QsCi0JICAtc3ZjX3h2bmMuIEFVVE9fUE9SVC4KLQkqIHNzdm5jOiBzc2h2bmMgc3NoLW9ubHksIHRzdm5jIFRlcm1pbmFsIFNlcnZpY2VzIG1vZGVzLgotCSAgSW1wcm92ZW1lbnRzIHRvIHNzX3ZuY3ZpZXdlci4gIEF1dG9tYXRpY2FsbHkgZmluZCBYIGRweSBhbmQKLQkgIFggbG9naW4uICBSZW9yZ2FuaXplIG1lbnVzIGEgYml0LiAgfi8uc3N2bmNyYyBmaWxlLgotCi0yMDA3LTA5LTA0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBBZGQgLWF1dG9wb3J0IGFuZCAtZmluZGRweSB1dGlscy4gLXhkdW1teSBjcmVhdGlvbi4KLQkgIHR3ZWFrIHhrYiB0aWVicmVha2luZyBhZ2Fpbi4gIFNodXQgb2ZmIC1uY2FjaGUgaW4gZGV2IG1vZGUuCi0JICB3YXRjaCBmb3IgeHJhbmRyIGV2ZW50cyBldmVuIGlmIG5vIC14cmFuZHIuICBUaXBzIGZvciB0eXBlcwotCSAgb2YgVVJMcyBmb3IgamF2YSB2aWV3ZXJzLiAgQWRkIGNoZWNrX3JlZGlyX3NlcnZpY2VzKCkgdG8KLQkgIGNyZWF0ZV9kaXNwbGF5IGFuZCB0c2RvKCkgcmVkaXIgaGVscGVyIHV0aWxpdHkgKC10c2QpLgotCSAgSW1wcm92ZW1lbnRzIHRvIFhkdW1teS4gIFByZXZlbnQgZGNvcCBYQVVUSE9SSVRZPScnCi0KLTIwMDctMDgtMTkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGJldHRlciAteGtiIHRpZS1icmVha2luZyBmb3IgdXAga2V5c3Ryb2tlcy4gIEFkZCAKLQkgIFhzcnYvRkRfWFNSViBjdXN0b20gc2VydmVyIHRvIEZJTkRDUkVBVEVESVNQTEFZIGxpc3QuCi0KLTIwMDctMDgtMTggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGltcHJvdmUgRklORENSRUFURURJU1BMQVkgKC1jcmVhdGUpIHNjcmlwdC4gIERvY3VtZW50Ci0JICBGRF9HRU9NLCBGRF9TRVNTLCBGRF9PUFRTLCBGRF9QUk9HIGVudiB2YXJzLCBhZGQgWHZuYyBzdXBwb3J0LiAKLQotMjAwNy0wOC0xNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIHJldmVyc2UgLWNvbm5lY3Qgc3VwcG9ydCB0byAtZGlzcGxheSBXQUlUOgotCSAgaS5lLiAtZmluZCwgLWNyZWF0ZSwgLXN2YywgLi4uIG1vZGUuICBEb2N1bWVudCBuZWVkIGZvcgotCSAgLXNoYXJlZCB1bmRlciAtY29ubmVjdCBob3N0MSxob3N0MiwuLi4gIEZpeCBidWcgaW4gLWRpc3BsYXkKLQkgIFdBSVQ6IG1vZGUgaWYgdm5jIGNsaWVudCB0cmllcyB0byBvbmx5IHJldHJpZXZlIFNTTCBjZXJ0LgotCi0yMDA3LTA4LTAzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgLXhyZWZyZXNoIG9wdGlvbiwgZml4IEtERSAuRENPUHNlcnZlciBwYXJzZSBidWcsCi0JICBtYWtlIHN1cmUgVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NULy11bml4cHdfdW5zYWZlIGlnbm9yZQotCSAgYW55IFNTSCB0dW5uZWwgdGhhdCB3b3VsZCBpbXBseSAtbG9jYWxob3N0LgotCi0yMDA3LTA3LTA0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtZGVidWdfbmNhY2hlLCBmaXggYmlnIGZvbnRzIGluIHRreDExdm5jLgotCi0yMDA3LTA2LTE0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgZGV0ZWN0b3JzIGlmIHVsdHJhdm5jIGNoYXQgb3IgZmlsZSB4ZmVyIHRvb2sgcGxhY2UsCi0JICBpZiBzbyBwaW5nIGNsaWVudHMgbW9yZSBmcmVxdWVudGx5LiAgRml4IGNvbXBpbGUgYnVnIGlmIGxpYnNzbAotCSAgbm90IGF2YWlsYWJsZS4KLQkqIHNzdm5jOiBhZGQgdWx0cmF2bmMgZnRwIGphciBmZWF0dXJlLiBBZGQgY2VydGlmaWNhdGUgbWFuYWdlbWVudAotCSAgIlZlcmlmeSBBbGwgQ2VydHMiLgotCi0yMDA3LTA1LTI2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBzZXQgdG8gdmVyc2lvbiAwLjkuMiwgYmFjayB0byBOQ0FDSEUgLTEyIGZvciB0ZXN0aW5nLgotCSAgaW4gLXVuaXhwdywgaW5pdGlhbCBFc2NhcGUgbWVhbnMgbm8gZWNobyB1c2VybmFtZSAoc2VlIHNzdm5jKS4KLQotMjAwNy0wNS0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogc2V0IHRoaW5ncyB1cCAoTkNBQ0hFID0gLTEpIHRvIG5vdCBoYXZlIC1uY2FjaGUKLQkgIG9uIGJ5IGRlZmF1bHQ7IGp1c3QgZ2l2ZSBhIGJsdXJiIGFib3V0IGl0LgotCi0yMDA3LTA1LTE2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBwcmludCBvdXQgcGVlciBob3N0IGFuZCBwb3J0IGZvciBkZWJ1Z2dpbmcgU1NMLiAKLQkqIHNzdm5jOiByYW5kIGNoZWNrLCBTT0NLUyBzdXBwb3J0LCBQT1JUPSwgVmVyaWZ5IGFsbCBDZXJ0cwotCSAgYW5kIGFjY2VwdGVkIGNlcnRzIGxvZ2dpbmcuCi0KLTIwMDctMDUtMDYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGxvd2VyIC13YWl0IGFuZCAtZGVmZXIgdG8gMjBtcy4gIENoYW5nZSBzb21lIFNTTAotCSAgZGVidWcgb3V0cHV0LiAgRHJvcCBjbGllbnQgZG9pbmcgdWx0cmF2bmMgc3R1ZmYgaW4gLXVuaXhwdwotCSAgZHVyaW5nIGxvZ2luIHBoYXNlLgotCi0yMDA3LTA1LTA1ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgZ3JvdXBzIGhhbmRsaW5nIGZvciAtdXNlcnMgbW9kZS4KLQotMjAwNy0wNS0wMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNzbDogdXBkYXRlIHRvIGphdmEgdmlld2VyIGFuZCB1dGlsaXR5IHNjcmlwdHMgKGFkZCBvbmV0aW1la2V5KS4KLQkqIHgxMXZuYzogc2V0c2lkKCkgZm9yIC1nb25lIG1vZGUuIHNldHBncnAgZm9yIC1jcmVhdGUgc2NyaXB0IGFuZAotCSAgYWRkIC1jYyA0IHRvIGF2b2lkIERpcmVjdENvbG9yLgotCi0yMDA3LTA0LTI4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtdXNlcnMgc3NscGVlcj0gb3B0aW9uLiBSRkJfU1NMX0NMSUVOVF9DRVJUIHZhci4KLQkgIFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFMgdmFyLiAtbmNhY2hlIGRlZmF1bHQgMTAuCi0JICBnaWQgc3dpdGNoIGZpeC4KLQkqIHNzdm5jOiBMaW51eC5pKjg2IGZpeCBhbmQgY29kZSBzeW5jLgotCi0yMDA3LTA0LTA3ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgZ25vbWUsIGtkZSwgZXRjLiBGSU5EQ1JFQVRFRElTUExBWSB0YWdzLgotCSAgSW4gY2hlY2tfbmNhY2hlIHBlcmlvZGljYWxseSBjaGVjayBmb3IgY2hhbmdlZCBkZXNrdG9wLiAKLQotMjAwNy0wMy0yNCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogcmV2ZXJzZSBTU0wgY29ubmVjdGlvbnMuICAtc2xlZXBpbiBvcHRpb24uCi0KLTIwMDctMDMtMjAgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IEFkZCAtaHR0cHNyZWRpciBvcHRpb24gZm9yIHJvdXRlciBwb3J0IHJlZGlycy4KLQkgIHNldCBYY3Vyc29yIGJnL2ZnIGNvbG9yIHZhbHVlcyB0byB6ZXJvLiAgRW52IHZhciB0bwotCSAgZm9yY2UgdGltZW91dDogWDExVk5DX0hUVFBTX1ZTX1ZOQ19USU1FT1VULiAgTGV0IHVzZXIKLQkgIHN1cHBseSBuYz1OIGF0IGxvZ2luIHByb21wdC4gIERpc2FibGUgLW5jYWNoZSBiZXRhCi0JICB0ZXN0IHVuZGVyIC1odHRwLy1odHRwZGlyLgotCi0yMDA3LTAzLTEzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBmaXggY3Jhc2ggZm9yIGtkZSBkY29wLiBsaW1pdCBuY2FjaGUgYmV0YQotCSAgdGVzdGVyIHRvIDk2TUIgdmlld2Vycy4gCi0KLTIwMDctMDItMTggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IEdldCB1bHRyYXZuYyB0ZXh0Y2hhdCB3b3JraW5nIHdpdGggc3N2bmMuCi0KLTIwMDctMDItMTYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCBGaWxlcyBtb2RlIHRvIHVzZXIgY29udHJvbGxlZCBpbnB1dC4gbW9yZQotCSAgdWx0cmEvdGlnaHQgZmlsZXhmZXIgdHdlYWtzLiAgcmZidmVyc2lvbiByZW1vdGUgY29udHJvbC4KLQkgIG5vbmNhY2hlL25jIHVuaXhwdyB1c2VyIG9wdC4KLQotMjAwNy0wMi0xNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogdGlnaHR2bmMgZmlsZXRyYW5zZmVyIG9mZiBieSBkZWZhdWx0LiBhdmFoaQotCSAgZml4ZXMuICBGSU5EQ1JFQVRFRElTUExBWSBnZW9tZXRyeS4gIC1ub3VsdHJhZXh0LgotCi0yMDA3LTAyLTEyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgYXZhaGkgKGFrYSBtRE5TL1plcm9jb25mL0JvbmpvdXIuLi4pCi0JICBzdXBwb3J0IHRoYW5rcyB0byBEaWVnbyBQZXR0ZW7yLiAgLWF2YWhpLy1tZG5zLgotCSAgQWRkIC1maW5kIGFuZCAtY3JlYXRlIEZJTkRJU1BMQVkgYWxpYXNlcy4KLQotMjAwNy0wMi0xMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC1ncmFiYWx3YXlzLCAtZm9yY2VkcG1zLCAtY2xpZW50ZHBtcywgYW5kIAotCSAgLW5vc2VydmVyZHBtcyAodWx0cmF2bmMgdmlld2VyKSBmb3IgaW1wcm92ZW1lbnRzIGluCi0JICB0aGUgc3RpbGwgYXBwcm94aW1hdGUgc2VydmVyIGxvY2tpbmcuICBBZGQgLWxvb3BiZwotCSAgYW5kIC1zdmMsIC14ZG1zdmMgYWxpYXNlcy4gQnVnIGZpeCBjcmVhdGVfZGlzcGxheS4KLQotMjAwNy0wMi0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogd2F0Y2ggdGhpbmdzIGxpa2UgdGV4dGNoYXQsIGV0Yy4gbW9yZSBjYXJlZnVsbHkgCi0JICBpbiB1bml4cHcgc3RhdGUuICBNb25pdG9yIGJyb2tlbiBYREFNQUdFIHJlcG9ydHMgd2hlbgotCSAgT3BlbkdMIGFwcHMgbGlrZSBiZXJ5bCBhcmUgcnVubmluZy4gIEltcGxlbWVudCBzaW1wbGUKLQkgIGtiZFJlbGVhc2VBbGxLZXlzLCBzZXRTaW5nbGVXaW5kb3csIHNldFNlcnZlcklucHV0IGFjdGlvbnMKLQkgICh1bHRyYXZuYyBleHRlbnRpb25zKS4gIFRyeSB0byBzZW5kIFhETSB0aGUgdXNlcm5hbWUgaW4KLQkgIEZJTkRDUkVBVEVESVNQTEFZLCBhbHNvIHRyeSAuZG1yYyBiZWZvcmUgLnhzZXNzaW9uLgotCi0yMDA3LTAxLTMxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtcmVmbGVjdCByZWZsZWN0b3IvcmVwZWF0ZXIgbW9kZSB3aXRoIGxpYnZuY2NsaWVudC4KLQkgIC1uY2FjaGUgdHdlYWtzOiBubyBrZGUgYW5pbWF0aW9ucyBhbmQgd20gaW1wcm92ZW1lbnRzLAotCSAgZml4ZXMgdG8gRklORERJU1BMQVkgYW5kIEZJTkRDUkVBVEVESVNQTEFZIGxvZ2luIG1vZGVzLAotCSAgTU9EVFdFQUtfTE9XRVNUIGVudnZhciBmb3IgSFAtVVgga2V5Ym9hcmQgd29ya2Fyb3VuZC4KLQkgIC1OIG9wdGlvbiBmb3IgZGlzcGxheSBhbmQgcmZicG9ydCBtYXRjaGluZy4KLQotMjAwNy0wMS0xMiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLU4gb3B0aW9uLCBtb3JlIC1uY2FjaGUgaW1wcm92ZW1lbnRzLCBrZGUvZ25vbWUuCi0KLTIwMDctMDEtMDMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1vcmUgLW5jYWNoZSBpbXByb3ZlbWVudHMuCi0KLTIwMDctMDEtMDEgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1vcmUgLW5jYWNoZSBpbXByb3ZlbWVudHMuCi0KLTIwMDYtMTItMjggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1vcmUgd29yayBvbiAtbmNhY2hlLCBhZGQgbWFjb3N4IHN1cHBvcnQsIGZpeCBYIGVycm9ycwotCSAgYW5kIGltcHJvdmUgY2FjaGUgZXhwaXJhdGlvbiBhbGdvcml0aG0uCi0KLTIwMDYtMTItMTcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGZpcnN0IHBhc3MgYXQgY2xpZW50LXNpZGUgY2FjaGluZywgLW5jYWNoZSBvcHRpb24uCi0JICBoYXZlIC1odHRwIGd1ZXNzIC4uL2NsYXNzZXMvLi4gdG8gcnVuIG91dCBvZiBidWlsZCBhcmVhLgotCi0yMDA2LTEyLTE3ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBtYWtlIC14d2FycHBvaW50ZXIgdGhlIGRlZmF1bHQgaWYgeGluZXJhbWEgaXMgYWN0aXZlLgotCi0yMDA2LTEyLTA5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogamF2YSBTU0wgdmlld2VyOiBndWFyZCBhZ2FpbnN0IGVtcHR5IHVybFByZWZpeAotCSogeDExdm5jOiBGSU5EQ1JFQVRFRElTUExBWSBzdXBwb3J0IHRvIGNyZWF0ZSBYIHNlc3Npb24gaWYKLQkgIG9uZSBjYW5ub3QgYmUgZm91bmQuICBjbG9zZSBmZHMgdXRpbGl0eS4gIFByaW50IFZOQyBWaWV3ZXIKLQkgIGlzLi4gZm9yIGZpbmQgZGlzcGxheSBtb2RlLiAgY2h2dCgxKSB1dGlsaXR5LgotCi0yMDA2LTExLTIzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogcHJlcGFyZV94MTF2bmNfZGlzdC5zaDogbWFrZSBzc192bmN2aWV3ZXIgaW5zdGFsbGVkIDc1NS4KLQkqIHgxMXZuYzogZm9yIEhUVFBPTkNFIG9wZW4gbmV3IGh0dHAgcG9ydCBpbiAtaW5ldGQgbW9kZS4KLQkgIC1wcm9nIG9wdGlvbiB0byBpbmRpY2F0ZSBmdWxsIHBhdGggdG8gcHJvZ3JhbSAobm90IGtub3cKLQkgIHdoZW4gaW4gLWluZXRkIGFuZCB0Y3BkKQotCi0yMDA2LTExLTIxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBtYWNvc3g6IHByb2JsZW0gd2l0aCBwYWRkZWQgZnJhbWVidWZmZXIgcm93cywgd2FpdCBmb3IKLQkgIHVzZXIgdG8gc3dpdGNoIGJhY2ssIEN1dFRleHQgeGZlciBzdXBwb3J0LCBpZ25vcmUgYSBmZXcgbW9yZQotCSAgdHlwZXMgb2YgdG9wbGV2ZWxzLiAgQWRkIGxvY2FsIHVzZXIgd2lyZWZyYW1pbmcuICAtZHBtcy8tbm9kcG1zCi0JICBvcHRpb24gdG8gd29yayBhcm91bmQga2Rlc2t0b3BfbG9jayBwcm9ibGVtLgotCi0yMDA2LTExLTEzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBOYXRpdmUgTWFjIE9TIFggc3VwcG9ydC4KLQotMjAwNi0xMS0wNyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNzbF92bmN2aWV3ZXI6IHZuYzovLyBkaXJlY3QgY29ubmVjdCwgYWRkIC14IHRvIHNzaCwKLQkgIFNTTF9WTkNfTElTVEVOIHZhcmlhYmxlIGZvciBkaXJlY3QgcHJveHkuCi0KLTIwMDYtMTAtMjkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IEFkZCB0aXAgYWJvdXQgaG93IHRvIHJlZW5hYmxlIFJFQ09SRCBleHRlbnNpb24uCi0KLTIwMDYtMTAtMTEgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IC1jdXJzb3JfZHJhZyBmb3IgRG5ELCBldGMuCi0KLTIwMDYtMDktMjMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBKYXZhIHZpZXdlcjogaW1wcm92ZW1lbnRzIHRvIGNvbm5lY3Rpb24gcmVzcG9uc2UsIGZhc3RlcgotCSAgY29ubmVjdGlvbnMuCi0JKiB4MTF2bmM6IHNvbWUgY2xlYW51cCBmb3IgLXVuaXhwdyBsb2dpbiBwcm9jZXNzLgotCi0yMDA2LTA5LTIwICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtdW5peHB3X2NtZCwgLXBhc3N3ZmlsZSBjbWQ6L2N1c3RvbTosIC1zc2xub2ZhaWwsCi0JICAtdWx0cmFmaWxleGZlcgotCi0yMDA2LTA5LTE3ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBtb3ZlIHNvbWUgaW5mbyBwcmludG91dCB0byAtdiwgLXZlcmJvc2UgbW9kZS4gIEFkZCAKLQkgIC1jb25uZWN0X29yX2V4aXQgb3B0aW9uLiAgSGF2ZSAtcmZicG9ydCAwIGxlYWQgdG8gbm8gVENQCi0JICBsaXN0ZW5pbmcuICBFbGltaW5hdGUgZG91YmxlIGNlcnRpZmljYXRlcyBpbiAucGVtIGZpbGVzLgotCSAgQWx3YXlzIHByaW50IFNTTCBjZXJ0aWZpY2F0ZSB0byB0aGUgc2NyZWVuIHRvIGFpZCBwYXN0aW5nLgotCi0yMDA2LTA5LTE1ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhbGxvdyB1c2VyIHNldCBzaWduYWxzIHRvIGlnbm9yZSwgY2xlYXIgRElTUExBWSBpbiAKLQkgIC11bml4cHcgc3VfdmVyaWZ5LiAtcmF3ZmIgbm9uZSBzYW1lIGFzIG51bGwuIAotCSogcmZic2VydmVyLmM6IHNob3J0ZW4gcmZiRW5jb2RpbmdOZXdGQlNpemUgbWVzc2FnZS4KLQotMjAwNi0wOS0xMyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogZG9jdW1lbnQgJ3NzaCAtdCcgaW1wcm92ZWQga2V5Ym9hcmQgcmVzcG9uc2UuICBhZGQKLQkgIGV4dHJhIHJmYlBFKCkgYXJvdW5kIGtleXN0cm9rZXMuIAotCSAgbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXI6IGluY29ycG9yYXRlIHNjcmlwdHMsIGRvY3VtZW50YXRpb24sCi0JICBldGMuIGZvciB0aGUgZW5oYW5jZWQgdGlnaHR2bmMgdmlld2VyIHBhY2thZ2UuCi0KLTIwMDYtMDktMTAgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1pbm9yIGNoYW5nZXM6IFJFUV9BUkdTIGZvciAtc3NsR2VuQ2VydCwgRVZfU1lOCi0JICBTWU5fUkVQT1JUIGNoZWNrIHJlc3RvcmUgY3Vyc29yIG1vc3QgdW5kZXIgLWRpc3BsYXkgV0FJVC4KLQotMjAwNi0wOC0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogZmlyc3QgcGFzcyBhdCB0b3VjaHNjcmVlbnMgdmlhIHVpbnB1dC4KLQotMjAwNi0wOC0wMiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC1zc2x0aW1lb3V0IG9wdGlvbjsgdHdlYWsgc3NsIHRpbWVvdXRzLgotCi0yMDA2LTA3LTI4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogc3NsX3ZuY3ZpZXdlcjogcmVtb3ZlIHNvbWUgYmFzaGlzbXMsIGFkZCBmZWF0dXJlcy4KLQkqIHgxMXZuYzogLXJvdGF0ZSBvcHRpb24gKGUuZy4gaGFuZGhlbGQpLCBmaXggRlBFIG9uIHRydTY0LgotCi0yMDA2LTA3LTE3ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBlbmFibGUgLS13aXRob3V0LXggYnVpbGRzIGZvciAtcmF3ZmIgb25seSAoTk9fWDExKQotCi0yMDA2LTA3LTExICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBtb3JlIHR3ZWFrcyB0byBVSU5QVVQsIG1vc3RseSBtb3VzZSBtb3Rpb24uCi0KLTIwMDYtMDctMDggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGFkZCB1aW5wdXQgc3VwcG9ydCAoLXBpcGVpbnB1dCBVSU5QVVQ6Li4uKSBmb3IgZnVsbAotCSAgbW91c2UgYW5kIGtleSBpbnB1dCB0byBsaW51eCBjb25zb2xlIChlLmcuIGZvciBxdC1lbWJlZGRlZCBhcHBzKQotCSAgYWRkIC1hbGxpbnB1dCBmb3IgaGFuZGxlRXZlbnRzRWFnZXJseS4KLQotMjAwNi0wNy0wNCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogMm5kIC1hY2NlcHQgcG9wdXAgd2l0aCBXQUlULCBhbmQgVU5JWDogaW5mbyBmb3IgdW5peHB3Ci0JICBsb2dpbi4gIFVzZSBSRkJfQ0xJRU5UX09OX0hPTEQgZm9yIC11bml4cHcuIC11bml4cHcgd2hpdGUgYXJyb3cKLQkgIC1saWNlbnNlIG9wdGlvbi4gIFVzZSBnZXRzcG5hbSBpZiBnZXRwd25hbSBpcyBzaG9ydC4KLQkgIGFiYnJldnMgc2M9LCBjbSwgY2sgZm9yIHVzZXI6b3B0cy4KLQotMjAwNi0wNi0yMyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogbWlzYyBjbGVhbnVwLgotCi0yMDA2LTA2LTE4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtZ3JhYmtiZCwgLWdyYWJwdHIsIC1lbnYgb3B0aW9ucy4gIHVuZGVyIC11bml4cHcgKwotCSAgV0FJVCBsZXQgdXNlciBhZGQgc29tZSBvcHRpb25zIGFmdGVyIGhpcyB1c2VybmFtZSAoZS5nLiBydW5nZTozLzQpCi0JICAtYWxsb3dlZGNtZHMgdG8gZmluZSB0dW5lIHZzLiAtbm9jbWRzLiAgZ2VuZXJhbCBjbGVhbnVwLgotCi0yMDA2LTA2LTEyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiB3b3JkIHR1bmUgU1NMIEphdmEgdmlld2VyOyBmaXggbXVsdGktY2VydHMgYnVnLiBBZGQgCi0JICAtZGlzcGxheSBXQUlUOmNtZD1GSU5ERElTUExBWSBidWlsdGluIHNjcmlwdCBhbmQgY21kPUhUVFBPTkNFCi0JICBhY3Rpb24uICAtaHR0cF9zc2wgb3B0aW9uIGZvciBzc2wgc3ViZGlyIG9ubHkuICBBZGQgLXJhd2ZiIFJBTkQKLQkgIHRlc3QgY2FzZS4gIGltcHJvdmUgcmF3X3hmZXIoKSBmb3IgdXNlIGluIGluZXRkIGh0dHBzIHRyYW5zZmVyLgotCSAgZml4IGJ1ZyBTU0ggKyAtdW5peHB3IC0+IC1sb2NhbGhvc3QuICBmaXggYnVnIHNldHVwIGN1cnNvcnMKLQkgIGluIFdBSVQgbW9kZS4gIE1hYyBPUyBYIHB0eSB0d2Vhay4KLQotMjAwNi0wNi0wOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogbWFrZSAtZGlzcGxheSBXQUlUICsgLXVuaXhwdyB3b3JrIG9uIFNvbGFyaXMuCi0KLTIwMDYtMDYtMDggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IFhPcGVuRGlzcGxheSB3cmFwcGVyIGZvciByYXcgeGF1dGggZGF0YSwgLXVuaXhwdyAKLQkgIHN1X3ZlcmlmeSgpIHRvIHJ1biBhbnkgY21kLCAtdXNlcnMgdW5peHB3PSBtb2RlLiAtZGlzcGxheSBXQUlUOi4uLgotCSAgbW9kZXMgZm9yIGRlbGF5ZWQgWCBkaXNwbGF5IG9wZW5pbmcgYW5kIGR5bmFtaWMgY2hvb3NpbmcuCi0KLTIwMDYtMDYtMDMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IC1jYXBzbG9jayBhbmQgLXNraXBfbG9ja2tleXMgb3B0aW9ucy4gIG1hcCBzb21lIEFsdCBrZXlzCi0JICB0byBMYXRpbiB1bmRlciBsaW51eGZiLiAgc3dpdGNoIHRvIG5ldyBzdGF0cyBBUEkuICBIYW5kbGUgbW9yZQotCSAgY2FzZXMgY2FyZWZ1bGx5IHdoZW4gc3dpdGNoaW5nIGZiLgotCQotMjAwNi0wNS0wNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogaW1wcm92ZWQgc3VwcG9ydCBmb3Igd2ViY2FtcyBhbmQgdHYgdHVuZXJzIHdpdGgKLQkgIHZpZGVvNGxpbnV4IC9kZXYvdmlkZW86IC1yYXdmYiB2aWRlbywgLWZyZXF0YWIgZXRjLgotCSAgQ29udmVuaWVuY2Ugb3B0aW9uIGZvciBsaW51eCBWVCdzOiAtcmF3ZmIgY29ucyAoTGludXhWTkMKLQkgIG1ldGhvZCkuICAtcGlwZWlucHV0IGJ1aWx0aW5zIGZvciB2aWRlbyBhbmQgY29uc29sZS4KLQkgIC0yNHRvMzIgb3B0aW9uIHRvIGF2b2lkIDI0YnBwIHByb2JsZW1zLiAic25hcDoiIG1ldGhvZCBmb3IKLQkgIC1yYXdmYi4KLQotMjAwNi0wNC0yNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogc2tpcCBleGl0IGluIGNoZWNrX29wZW5zc2woKSBpZiBub3QgY29tcGlsZWQgd2l0aAotCSAgbGlic3NsLiAgc2V0IFNLSVBfSEVMUCAoYWdhaW4pIGluIHNtYWxsIGZvb3RwcmludCBidWlsZHMuCi0KLTIwMDYtMDQtMTYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IE1vcmUgd2ViIHByb3h5IHdvcmsgZm9yIEphdmEgU1NMIGFwcGxldCBhbmQgd3JhcHBlcgotCSAgc2NyaXB0IHNzbF92bmN2aWV3ZXIuICBBcGFjaGUgU1NMIGdhdGV3YXkgc3VwcG9ydCBmb3IKLQkgIGluY29taW5nIHgxMXZuYyBjb25uZWN0aW9ucy4gIEhhbmRsZSAiZG91YmxlIHByb3h5IiBjYXNlLgotCi0yMDA2LTA0LTA1ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBhZGQgRkJQTSBzdXBwb3J0ICgtZmJwbSkgZm9yIFN1bnMuIC1yYXdmYiBaRVJPIGZvcgotCSAgdGVzdGluZy4gIEJhc2ljIGtleStjZXJ0IG1hbmFnZW1lbnQgdXRpbGl0aWVzOiAtc3NsR2VuQ0EsCi0JICAtc3NsR2VuQ2VydCwgLXNzbEVuY0tleSwgLXNzbERlbENlcnQsIC1zc2xDZXJ0SW5mbywgYW5kCi0JICBhZGRsbiBmZWF0dXJlcy4gIFNTTCBwcm94eSBjb25uZWN0aW9uLiAgLXN0b3JlcGFzc3dkIHdpdGgKLQkgIG5vIGFyZ3Mgb3IgcHcgZWNoby4KLQotMjAwNi0wMy0yNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLXhpbmVyYW1hIG5vdyBvbiBieSBkZWZhdWx0LiAgSW4gLXNzbCBtb2RlIGFjY2VwdCBodHRwcwotCSAgYXBwbGV0IGRvd25sb2FkcyB0aHJ1IFZOQyBwb3J0LiAgLWh0dHBzIG9wdGlvbiBmb3IgMm5kIGh0dHBzCi0JICBwb3J0LiAgTG9vayBmb3IgY2xhc3Nlcy9zc2wgdW5kZXIgLWh0dHAuICBhZGQgSmF2YSBVUkwgbWVzc2FnZXMKLQkgIHRvIGZpbmFsIG91dHB1dCBsaW5lcy4gIG1ha2UgLWluZXRkIHdvcmsgd2l0aCAtc3NsIChldmVuIGZvcgotCSAgaHR0cHMpLiAgZml4IC11bml4cHcgbG9naW4gcHJvbXB0IHVuZGVyIC1zY2FsZS4gIGd1YXJkIGFnYWluc3QKLQkgIGNsaWVudERhdGEgPSBOVUxMLiAKLQotMjAwNi0wMy0xMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC1zc2wgbW9kZSB1c2luZyBsaWJzc2wuICBJbmNsdWRlIFhkdW1teSBpbiBtaXNjLgotCSAgYSBmZXcgbW9yZSBtYWNyb3MgZm9yIHNtYWxsZXJmb290LCBldGMuCi0KLTIwMDYtMDMtMDggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1hbmFnZSBDTElQQk9BUkQgaW4gYWRkaXRpb24gdG8gUFJJTUFSWS4gIC1kZWJ1Z19zZWwKLQkgIE1ha2UgcmV2ZXJzZSBjb25uZWN0aW9ucyByZXF1aXJlIHBhc3N3b3Jkcy4gIC11c2VwdyBvcHRpb24uCi0JICAtc3RvcmVwYXNzd2Qgdy9vIGFyZ3MgcHJvbXB0cyBhbmQgd3JpdGVzIH4vLnZuYy9wYXNzd2QuCi0KLTIwMDYtMDMtMDYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IHN3aXRjaCByZW1vdGUgY29udHJvbCB0byBYMTFWTkNfUkVNT1RFIHByb3BlcnR5LiAgUHV0Ci0JICBpbiAtdW5peHB3IGNvbnN0cmFpbnRzIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zIHVuZGVyIC1pbmV0ZC4KLQkgIC1pbmV0ZCB3b24ndCBxdWl0IHdoZW4gcmV2ZXJzZSBjb25uIGNsaWVudCBsZWF2ZXMuIEFsbG93IGtleWJvYXJkCi0JICBpbnB1dCBmb3Igdmlld29ubHkgLXVuaXhwdyBsb2dpbnMuICAiJSoiIHV0aWxzIGZvciB0ZXN0aW5nCi0JICAtdW5peHB3LiAgaW1wcm92ZSBzdGFydCB0aW1lIGZpeCBidWdzLCBzbWFsbCBzY3JlZW4gaW4gZ3VpLgotCi0yMDA2LTAzLTA0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtdW5peHB3IG9uICpic2QsIGhwdXggYW5kIHRydTY0LiAgQWRkIC11bml4cHdfbmlzIGZvcgotCSAgbm9uLXNoYWRvdyBzeXN0ZW1zLiBjaGVjayBzdHVubmVsIGR5aW5nLiAgY2hlY2sgU1NIX0NPTk5FQ1RJT04KLQkgIGluIC11bml4cHcuICBndWkgaWNvbiB0d2Vha3MsIHVuaXggdXNlcm5hbWUuCi0KLTIwMDYtMDMtMDIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IG1vcmUgdHdlYWtzIHRvIC11bml4cHcgbW9kZS4gIEFkZCAtZ29uZSBwb3B1cCBtb2RlLgotCSAgQ2hhbmdlIGZpbGV4ZmVyIHZpYSAtUi4gIFR1bmUgU01BTExfRk9PVFBSSU5ULiAgZ3VpIGZpeGVzLgotCi0yMDA2LTAyLTI0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtdW5peHB3IGZvciBVbml4IHBhc3N3b3JkIGF1dGgsIC1zdHVubmVsIHRvIHNldHVwCi0JICBzdHVubmVsKDEpIGZvciBhbiBTU0wgdHVubmVsIG9uIHRoZSBzZXJ2ZXIgZW5kLiAgQWRkIGNsaXBib2FyZAotCSAgaW5wdXQgdG8gcGVyLWNsaWVudCBpbnB1dCBjb250cm9scy4KLQotMjAwNi0wMi0yMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIFNJR0lOVCBTSUdRVUlUIGhhbmRsaW5nIGZvciBydW5fdXNlcl9jb21tYW5kKCksCi0JICBzZXQgc29tZSBzaWduYWwgaGFuZGxlcnMgdG8gU0lHX0RMRiBmb3IgZm9ya2VkIGNoaWxkcmVuLCAKLQkgIHB1dCBhIHRpbWVvdXQgb24gcG9ydCAxMTMgY29ubmVjdGlvbiB0byB2aWV3ZXIgbWFjaGluZS4KLQotMjAwNi0wMi0wNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogZml4IEFJWCBidWlsZCB3cnQgaF9lcnJuby4KLQotMjAwNi0wMi0wNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLTh0bzI0IG1vcmUgc3BlZWR1cHM7IHR1bmFibGVzIGZvciB2ZXJ5IHNsb3cgbWFjaGluZXMuCi0KLTIwMDYtMDItMDQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IC04dG8yNCBzcGVlZHVwcyBhbmQgaW1wcm92ZW1lbnRzLgotCi0yMDA2LTAxLTIxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiAtOHRvMjQgb3B0cywgdXNlIFhHZXRTdWJJbWFnZS4gZml4IC10aHJlYWRzIGRlYWRsb2NrcyBhbmQKLQkgIC1yYXdmYiBjcmFzaC4KLQotMjAwNi0wMS0xOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogLTh0bzI0IG5vdyB3b3JrcyBvbiBkZWZhdWx0IGRlcHRoIDggc2NyZWVucy4KLQotMjAwNi0wMS0xNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogbW9yZSB0d2Vha3MgdG8gLTh0bzI0LCBhZGQgWEdFVElNQUdFXzhUTzI0IG1vZGUgdG8gY2FsbAotCSAgWEdldEltYWdlKCkgb24gdGhlIDhicHAgcmVnaW9ucy4KLQotMjAwNi0wMS0xNCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC04dG8yNCBvcHRpb24gZm9yIHNvbWUgbXVsdGktZGVwdGggZGlzcGxheXMgKGJ1dCB1c2UKLQkgIG9mIC1vdmVybGF5IGlzIHByZWZlcnJlZCBpZiBzdXBwb3J0ZWQpLgotCi0yMDA2LTAxLTEyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogZml4IC1EU01BTExfRk9PVFBSSU5UPU4gYnVpbGRzLgotCi0yMDA2LTAxLTExICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiBjbG9zZSBmZCA+IDIgaW4gcnVuX3VzZXJfY29tbWFuZCgpLCAtbm9jbWRzIGluIGNyYXNoX2RlYnVnLAotCSAgZml4IDY0Yml0IGJ1ZyBmb3IgLXNvbGlkLgotCi0yMDA2LTAxLTA4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogeDExdm5jOiB0aGUgYmlnIHNwbGl0LiBvcHRzOiAtYWZ0ZXJhY2NlcHQgYW5kIC1wYXNzd2RmaWxlIHJlYWQ6Ci0KLTIwMDUtMTItMjQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiB4MTF2bmM6IGVuaGFuY2UgLXBhc3N3ZGZpbGUgZmVhdHVyZXMsIGZpbGV0cmFuc2ZlciBvbiBieSBkZWZhdWx0LAotCSAgY2FsbCByZmJSZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uKCkgZWFybGllci4KLQotMjAwNS0xMS0yOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogYWRkIC1sb29wIG9wdGlvbi4KLQotMjAwNS0xMS0yNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHgxMXZuYzogdGhyb3R0bGUgbG9hZCBpZiBmYiB1cGRhdGUgcmVxdWVzdHMgbm90IHRha2luZyBwbGFjZS4KLQkqIG1pc2MveDExdm5jX3B3OiBhZGQgdXRpbGl0eSBzY3JpcHQKLQotMjAwNS0xMC0yMiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZCB0aWdodFZOQyBGaWxlVHJhbnNmZXIgKC1maWxleGZlcikgYW5kIC1ERklMRVhGRVI9MQotCSogLXNsb3dfZmIgZm9yIHNwZWNpYWwgcHVycG9zZSBpbmZyZXF1ZW50IHBvbGxpbmcuCi0JKiBtYWtlIC1ibGFja291dCB3b3JrIHdpdGggY29weXJlY3QgY2xpcHBpbmcuCi0JKiAtYmxhY2tvdXQgbm9wdHIsV3hIK1grWSwuLi4gdG8gcHJldmVudCBwb2ludGVyIGZyb20gZ29pbmcKLQkgIGludG8gYSBibGFja2VkIG91dCByZWdpb24uCi0KLTIwMDUtMDctMTcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtb3JlIGltcHJvdmVtZW50cyB0byBndWkgVUUuICBndWkgcmVxdWVzdHMgdmlhIGNsaWVudF9zb2NrCi0JICBQQVNTV0RfUkVRVUlSRUQgYW5kIFBBU1NXRF9VTkxFU1NfTk9QVyBidWlsZCBvcHRpb25zLgotCi0yMDA1LTA3LTEyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogZ3VpOiByZW1vdmUgbmV2ZXJzaGFyZWQgZXRjLiwgcGFyc2UgY21kIGxpbmUsIGJ1ZyBmaXhlcy4KLQkqIHgxMXZuYzogZml4IHBvaW50ZXIgcXVldWUgYnVpbGR1cCB1bmRlciAtdmlld29ubHkuCi0KLTIwMDUtMDctMTAgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtb3JlIGltcHJvdmVtZW50cyB0byBndWksIGRlZmF1bHQgdmFsdWVzLCBzYXZlLXNldHRpbmdzLi4KLQkqIHgxMXZuYyBzY2FyeSBwYXNzd29yZCB3YXJuaW5ncy4gUmVsZWFzZSBzZXR0aW5ncy4gLVFEIG9wdGlvbi4KLQkgIGFkZCBcIyB0byByYyBmaWxlcyBhbmQgZml4IHJjZmlsZSByZWFkIGJ1Zy4KLQotMjAwNS0wNy0wOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZCAtZ3JhYl9idXN0ZXIgaGVscGVyIHRocmVhZCB0byBicmVhayB1cCBncmFicyAobWlnaHQgbm90IGJlCi0JICBuZWVkIGFueSBsb25nZXIgZHVlIHRvIGdldHQgWEZsdXNoLWluZykuICBGaXggc2Nyb2xscyBhbmQKLQkgIGNvcHlyZWN0IGZvciAtY2xpcCBhbmQgLWlkIGNhc2VzLgotCi0yMDA1LTA3LTA2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogbWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIGd1aS4gbm93IGVtYmVkcyBpbnRvIHN5c3RlbSB0cmF5IG9rLgotCSAgeDExdm5jIC1kZWJ1Z19ncmFicywgLXByaW50Z3VpLCAtbm9zeW5jCi0KLTIwMDUtMDctMDEgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBzdXBwb3J0IGZvciBzaW1wbGUgIi1ndWkgdHJheSIgbW9kZSAoc21hbGwgaWNvbiBsaWtlIHRoZSBvcmlnaW5hbAotCSAgeDByZmJzZXJ2ZXIgaGFkKS4gIENhbid0IGZpZ3VyZSBob3cgdG8gZ2V0IGEgdHJheSB0byBzd2FsbG93IGl0Li4KLQkqIHBhc3N3ZCwgdmlld3Bhc3N3ZCBjaGFuZ2luZyBpbiB0cmF5IG1vZGUuCi0JKiBhbGxvdyB0eXBvcyBsaWtlOiB4MTF2bmMgLVIgLXNjYWxlIDMvNAotCi0yMDA1LTA2LTI2ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogdHJhY2sga2V5Y29kZSBzdGF0ZSBmb3IgaGV1cmlzdGljcywgLXNsb3BweV9rZXlzLCAtd21kdAotCSogYWRkIC1ub2RiZyBhcyBvcHRpb24KLQotMjAwNS0wNi0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHJlaW5zdGF0ZSAiYmFkIGRlc2t0b3AiIGZvciB3aXJlZnJhbWUuCi0JKiBleHRyYSBsb25nIGluZm8gYW5kIHRpcHMgb2YgWE9wZW5EaXNwbGF5IGZhaWxzLgotCi0yMDA1LTA2LTE4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogY2xlYW4gdXAgc29tZSBtYWxsb2MvZnJlZSBwcm9ibGVtcyAoZG9uJ3QgZnJlZSB0aGUgY3VycmVudCBjdXJzb3IpCi0JKiBzZXQgRElTUExBWSBiZWZvcmUgY2FsbGluZyBnY29uZiwgZGNvcCB1bmRlciAtc29saWQKLQkqIC1pbmV0ZCAtcSBhbmQgbm8gLW8gbG9nZmlsZSBpbXBsaWVzIGNsb3Npbmcgc3RkZXJyLgotCi0yMDA1LTA2LTE0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogLUROT0dVSSBhbmQgLURWSUVXT05MWSBidWlsZCBvcHRpb25zCi0JKiAtbm9za2lwX2R1cHMgdGhlIGRlZmF1bHQgKHdpbmRvd3Mgdmlld2VyIHNlbmRzIG5vIHVwcyB3aGVuCi0JICByZXBlYXRpbmcpCi0JKiBIQVZFX1NPTEFSSVNfWFJFQURTQ1JFRU4gYW5kIEhBVkVfSVJJWF9YUkVBRERJU1BMQVkKLQkqIEFsdCtCdXR0b24rTW90aW9uIHRvIHdpcmVmcmFtZS4gIHR1bmFibGUgaW4gV0lSRUZSQU1FX1BBUk1TCi0JKiBjb3B5cmVjdCBub3cgdGhlIGRlZmF1bHQgdW5kZXIgLXNjYWxlICh3b3JrcyBPSywgYnV0IG11c3QKLQkgIHNlbmQgYSBjbGVhbnVwIHVwZGF0ZSkKLQkqIGZpeCAtcGVkYW50aWMgYW5kIFN1biBjYyB3YXJuaW5ncyBhbmQgZXJyb3JzICh1bnNpZ25lZCwgZXRjLi4pCi0JKiBwcmludCBvdXQgZmF0YWwgZXJyb3IgbWVzc2FnZXMgdW5kZXIgLXF1aWV0Ci0JKiAtc2VsZGlyIHRvIGNvbnRyb2wgYW5kIGRlYnVnIHNlbGVjdGlvbiB0cmFuc2ZlcnMuCi0JKiBmaXggY3Jhc2hlcyBvbiA2NGJpdCB3cnQgdW5zaWduZWQgbG9uZyBpbiByaWNoIGN1cnNvcnMuCi0JKiBmaXgga2RlIGd1ZXNzaW5nIGVycm9ycwotCSogbW9yZSBzY3JvbGxpbmcgYW5kIHdpcmVmcmFtZSB0d2Vha3MuCi0KLTIwMDUtMDYtMDMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtYWtlIHNjcm9sbGNvcHlyZWN0IG1vcmUgb3IgbGVzcyB1c2FibGUgdW5kZXIgLXNjYWxlCi0JKiBhZGQgLWZpeHNjcmVlbiBmb3IgcGVyaW9kaWMgY2xlYW51cCBvZiBwYWludGluZyBlcnJvcnMuCi0JKiBhZGp1c3Qga2V5cmVwZWF0IHNjcm9sbCBiZWhhdmlvci4KLQotMjAwNS0wNS0zMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFsdGVyICJtYWdpYyBjbGVhbnVwIGtleSBzZXF1ZW5jZXMiIChOKkFsdF9MIGFuZCBOKlN1cGVyX0wpCi0JKiBkaWFsIGRvd24gY2hlY2tfeHJlY29yZF9yZXNldCgpIHJlc2V0IHRpbWVzLgotCi0yMDA1LTA1LTI0ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogbW9yZSAtc2Nyb2xsY29weXJlY3Q6IEdyYWJTZXJ2ZXIgZGV0ZWN0aW9uLCBhdXRvcmVwZWF0IHRocm90dGxpbmcsCi0JICBoYWNrIHRvIGNsZWFuIHNjcmVlbiAzLDQsNSBBbHRfTCBpbiBhIHJvdywgbW91c2Ugd2hlZWwgZGV0ZWN0LgotCSogZml4IGJ1ZyB3cnQgc3dpdGNoaW5nIHRvIHNpbmdsZV9jb3B5dGlsZSwgYWRkIERhcndpbiB0byBzaG0gbGltaXQuCi0KLTIwMDUtMDUtMTcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtb3JlIC1zY3JvbGxjb3B5cmVjdCwgLXNjcl90ZXJtIGhhY2tzIGZvciB0ZXJtaW5hbHMuCi0JKiAtd2FpdF91aSwgLW5vd2FpdF9ib2cgdHVuYWJsZXMuICBwdXNoIGN1cnNvciBzb29uZXIuCi0KLTIwMDUtMDUtMTQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtdWNoIG1vcmUgd29yayBvbiAgIi1zY3JvbGxjb3B5cmVjdCIgbW9kZS4uLiBnZXR0aW5nIHVzYWJsZS4KLQkqIHJlbW92ZSAtcG9pbnRlcl9tb2RlIDMsIHNoaWZ0IGV2ZXJ5b25lIGJhY2sgZG93bgotCSogLWRiZyAiY3Jhc2ggc2hlbGwiIGZvciBkZWJ1Z2dpbmcKLQkqIC1hZGRfa2V5c3ltcyBub3cgdGhlIGRlZmF1bHQsIHBlcmlvZGljYWxseSBjbGVhcnMgaWYgbmVlZGVkLgotCSogdHJ5IHRvIGF1dG9kZXRlY3QgaWYgLXhrYiB3b3VsZCBiZSBhIGdvb2QgaWRlYS4KLQkqIGltcHJvdmUga2V5Y29kZSBndWVzc2luZyBmb3IgLXhrYiBtb2RlIChmb3JjZSBJU09fTGV2ZWwzX1NoaWZ0KQotCSogLXJlbWFwIERFQUQsIGV0Yy4gZm9yIGRlYWQvbXV0ZSBrZXlzIHJlbWFwcGluZ3MuCi0KLTIwMDUtMDUtMDIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBpbml0aWFsIHN1cHBvcnQgZm9yIHVzaW5nIFJFQ09SRCB0byBkZXRlY3Qgc29tZSB0eXBlcyBvZiB3aW5kb3cKLQkgIHNjcm9sbHMuICBUaGlzIGlzICItc2Nyb2xsY29weXJlY3QiIG1vZGUsIHVzZSAtbm9zY3JvbGxjb3B5cmVjdAotCSAgdG8gZGlzYWJsZS4gIE11Y2ggdHVuaW5nIGFuZCBwYWludGluZyBlcnJvciByZXBhaXIgc3RpbGwgcmVxdWlyZWQuICAKLQkqIG1vcmUgYnVpbGQgdGltZSBjdXN0b21pemF0aW9uczogUkVNT1RFX0RFRkFVTFQsIFJFTU9URV9DT05UUk9MLAotCSAgRVhURVJOQUxfQ09NTUFORFMsIE5PUkVQRUFULCBXSVJFRlJBTUUqLCBTQ1JPTEwqLCAuLi4KLQkqIGFkZGVkIGJhbmR3aWR0aCBhbmQgbGF0ZW5jeSBtZWFzdXJlbWVudHMuCi0JKiBhZGRlZCBYTGlzdEhvc3RzIHRvIC1wcml2cmVtb3RlIGNoZWNrLgotCSogZGVidWdfKiByZW1vdGUtY29udHJvbCB2YXJpYWJsZXMuCi0JKiByZW1vdmVkIE9MRF9UUkVFIHN0dWZmLgotCi0yMDA1LTA0LTE5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogc29tZXdoYXQgc2FmZXIgcmVtb3RlLWNvbnRyb2wgZGVmYXVsdHMsIGFuZCBhZGRubCBvcHRpb25zIGZvcgotCSAgbW9yZSBzYWZlIG9wZXJhdGlvbjogLXByaXZyZW1vdGUsIC1zYWZlciwgLW5vY21kcywgLXVuc2FmZQotCSogLXdpcmVmcmFtZSwgLXdpcmVjb3B5cmVjdDogaW5zdGVhZCBvZiBoYXZpbmcgdXNlciBsb29rIGF0IGEKLQkgIHNsb3dseSBtb3ZpbmcsIGx1cmNoaW5nIHdpbmRvdywgZ3Vlc3Mgd2hlbiBhIHdpbmRvdyBpcyBiZWluZwotCSAgbW92ZWQvcmVzaXplZCBhbmQganVzdCBzaG93IGEgd2lyZWZyYW1lLiAtd2lyZWNvcHlyZWN0IG1lYW5zIHRvCi0JICBhcHBseSByZmJEb0NvcHlSZWdpb24gdG8gdGhlIGRldGVjdGVkIG1vdmUgYXMgd2VsbC4KLQkqIGRlYnVnZ2luZyBzd2l0Y2hlcyBmb3IgWCBldmVudHMgYW5kIFggZGFtYWdlOiBkZWJ1Z194ZXZlbnRzCi0JICBkZWJ1Z194ZGFtYWdlLgotCSogLXJhd2ZiIGJ1Z2ZpeGVzLiAtbm92aWV3b25seSBoYWNrIHRvIHN0aWxsIHNlbmQgVUkgdG8gWC4KLQotMjAwNS0wNC0xMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGZpeCAtY2xpcCB1bmRlciAtcmF3ZmIsIGZpeCBvZmZzZXQgYnVnIHVuZGVyIGZpbGUgbHNlZWtpbmcuCi0JKiBhZGQgLXJhd2ZiIHNldHVwOmNtZCBtb2RlIHRvIGluaXRpYWxpemUgZmIuIGV4YW1wbGU6IG1pc2MvcmFuZmIucGwKLQotMjAwNS0wNC0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIC1yYXdmYiBub24gWC1wb2xsaW5nIChpLmUuIHNobSwgbW1hcCwgbHNlZWspLgotCSogLXBpcGVpbnB1dCBlbmFibGUgZXh0ZXJuYWwgdXNlciBpbnB1dCBwcm9jZXNzaW5nIGNvbW1hbmQuCi0JKiAteHRyYXAgdXNlIFhFU2ltdWxhdGVYRXZlbnRSZXF1ZXN0IHRvIGluamVjdCB1c2VyIGlucHV0LgotCSogc2NhbGluZyBibGVuZCBmb3IgU3RhdGljR3JheSwgYWRkIDpmYiBzY2FsaW5nIG9wdGlvbi4KLQkqIGRlZmF1bHQgcGFzc3dvcmQgbWFjcm9zLgotCSogaW1wcm92ZSAtbm9yZXBlYXQgdXNlIHVuZGVyIC12aWV3b25seS4KLQkqIC1mbGFnIGZsYWdmaWxlIHRvIGFpZCB3cmFwcGVyIHNjcmlwdHMuCi0JKiBhZGQgdXRpbGl0eSBzY3JpcHRzLCBldGMuIGRpciAuL21pc2MKLQotMjAwNS0wNC0wMyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHRyeSBERUMtWFRSQVAgb24gWDExUjUgaWYgWFRlc3RHcmFiQ29udHJvbCBpcyBtaXNzaW5nLgotCSogLXNoaWZ0Y21hcCBuLCBmb3IgOGJwcCBkaXNwbGF5cyB1c2luZyA8IDI1NiBjb2xvciBjZWxscwotCSAgYW5kIHdpdGggcGl4ZWwgdmFsdWVzIHNoaWZ0ZWQgZnJvbSB6ZXJvLgotCSogZml4IERBTUFHRSBldmVudCBsZWFrIGFmdGVyIHZpZXdlcnMgZGlzY29ubmVjdC4KLQkqIC1odHRwIG9wdGlvbiB0byB0cnkgdG8gZ3Vlc3Mgd2hlcmUgdGhlIGphdmEgdmlld2VyIGlzLgotCi0yMDA1LTAzLTI5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogYnVpbGQtdGltZSBjdXN0b21pemF0aW9ucyBYMTFWTkNfU0hBUkVELCBYMTFWTkNfRk9SRVZFUiwKLQkgIFJFTU9URV9DT05UUk9MLCBTTUFMTF9GT09UUFJJTlQgZm9yIENQUEZMQUdTCi0JKiBmaXggZXZlbnQgbGVha3MgZm9yIHhrYiBCZWxsTm90aWZ5IGFuZCBDbGllbnRNZXNzYWdlIGFuZCBvdGhlcnMsCi0JICBlc3AuIHVuZGVyIC1ub2ZiLiAgbWFrZSBub2ZiIHdvcmsgd2l0aCByZW1vdGUgY29udHJvbC4KLQkqIC1ub2xvb2t1cCBmb3IgYmFkIEROUyBzZXR1cHMuCi0JKiBtb3JlIHBsYXlpbmcgd2l0aCBwb2ludGVyX21vZGU6IGNoZWNrX3VzZXJfaW5wdXQzKCkKLQotMjAwNS0wMy0xOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNjYWxlIGN1cnNvcnMgYWxvbmcgd2l0aCBkaXNwbGF5LiBVc2UgLXNjYWxlX2N1cnNvciB0byBjaGFuZ2UKLQkgIG9yIGRpc2FibGUgY3Vyc29yIHNjYWxpbmcuCi0JKiBzcGVlZCB1cCBzY2FsaW5nIGluIHNvbWUgY2FzZXMsIDpuYiBhbmQgaW50ZWdlciBtYWduaWZpY2F0aW9uLgotCSogcHJvdmlkZSBhbHRlcm5hdGl2ZSBhcnJvdyBjdXJzb3JzICgxLTYpIHZpYSAtYXJyb3cgbi4KLQkqIHJlc2V0IG5vIGF1dG9yZXBlYXQgYSBjb3VwbGUgdGltZXMgaWYgc29tZXRoaW5nIHR1cm5zIGl0IG9mZiwKLQkgIHNldCB3aXRoIC1ub3JlcGVhdCBOLgotCSogZG8gbm90IHRha2UgYSBuYXAgaWYgREFNQUdFIHNlZW1zIHRvIGJlIGRvaW5nIGl0cyBqb2IuCi0KLTIwMDUtMDMtMTIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBzdXBwb3J0IGZvciB0aGUgWCBEQU1BR0UgZXh0ZW5zaW9uIHRvIHJlY2VpdmUgZGFtYWdlCi0JICByZWN0YW5nbGUgcmVwb3J0cyBmcm9tIHRoZSBYIHNlcnZlci4gIE9uIGJ5IGRlZmF1bHQsIGRpc2FibGUKLQkgIHdpdGggLW5veGRhbWFnZS4gIEN1cnJlbnRseSBvbmx5IHRydXN0cyBzbWFsbCByZWN0cwotCSAgKGJ1dCBzZWUgLXhkX2FyZWEgbikgYW5kIHVzZXMgdGhlIHJlc3QgYXMgImhpbnRzIiBmb3IgdGhlCi0JICBzY2FubGluZSBwb2xsaW5nLgotCSogLWNsaXAgV3hIK1grWSB0byBzaG93IGEgY2xpcHBlZCBzdWItcmVnaW9uIG9mIHRoZSBzY3JlZW4uCi0JKiB1c2UgUkZDIDE0MTMgKGlkZW50ZCkgdG8gYXR0YWNoIGEgbmFtZSB0byBhIGNsaWVudCBpbiAKLQkgIGZyaWVuZGx5IGVudmlyb25tZW50cy4KLQkqIGZpeCBYQVVUSE9SSVRZIHdydCAnLWF1dGggLi4uIC1ndWkgb3RoZXI6MCcuCi0KLTIwMDUtMDMtMDQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhZGQgY2hhbmdlcyB0byBjb3VwbGUgd2l0aCAtbGlzdGVuIG9wdGlvbiwgaW4gcGFydGljdWxhcgotCSAgdGhlIGJlaGF2aW9yIG9mIC1sb2NhbGhvc3QgYW5kIHJlbW90ZSBjb250cm9sIGNtZHMuCi0JKiB3b3JrYXJvdW5kcyBmb3Igb2xkIHRyZWVzLgotCi0yMDA1LTAyLTIzICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogZmluYWwgY2hhbmdlcyBmb3IgMC43LjEgcmVsZWFzZS4KLQotMjAwNS0wMi0yMSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIC1uYXAgaXMgbm93IHRoZSBkZWZhdWx0LCBkaXNhYmxlIHdpdGggLW5vbmFwCi0JKiBzZXQgdmVyc2lvbiB0byAwLjcuMSwgd29yZCB0dW5lIC1oZWxwLCBldGMuCi0KLTIwMDUtMDItMTQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBjbGVhbnVwIC11c2VycyBzdHVmZiwgYWRkICJsdXJrPSIgbW9kZQotCSogc3VwcG9ydCBjZGUgaW4gLXNvbGlkCi0JKiBzaW1wbGUgZ3VpIG1vZGUgZm9yIGJlZ2lubmVycywgLWd1aSBleiwuLi4KLQotMjAwNS0wMi0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIEFkZCAtaW5wdXQgdG8gZmluZSB0dW5lIGNsaWVudCBpbnB1dCAoa2V5c3Ryb2tlLCBtb3VzZSBtb3Rpb24sCi0JICBhbmQgYnV0dG9uIHByZXNzZXMpLiAgQWxsb3cgcGVyLWNsaWVudCBzZXR0aW5nIHZpYSByZW1vdGUgY250bC4KLQkqIGZpeCBidWcgaW4gZ2V0X3JlbW90ZV9wb3J0LCBhZGQgaXAyaG9zdCBmb3IgY2xpZW50IGluZm8uCi0KLTIwMDUtMDItMDkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBBZGQgLXVzZXJzIHN3aXRjaCB1c2VyIG1lY2hhbmlzbSBhbmQgcmVsYXRlZCB1dGlsaXRpZXMuCi0JKiBmaXggLXNvbGlkIGZvciBnbm9tZSBhbmQga2RlLgotCSogZXhpdCBlYXJsaWVyIG9uIHRyYXBwZWQgWElPIGVycm9ycy4KLQotMjAwNS0wMi0wNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIC1zb2xpZCBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kIHdoZW4gY2xpZW50cyBhcmUgY29ubmVjdGVkLiAKLQkqIC1vcHRzLy0/IHRvIHNob3cgb3B0aW9uIG5hbWVzIG9ubHkuCi0KLTIwMDUtMDEtMjMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBzeW5jIHdpdGggbmV3IGRyYXcgY3Vyc29yIG1lY2hhbmlzbSwga2VlcCBvbGQgd2F5IGluIE9MRF9UUkVFLgotCSogYWRkIC10aW1lb3V0IG9wdGlvbiwgY2hhbmdlIC1hbHBoYWJsZW5kIHRvIGJlIGRlZmF1bHQKLQkqIC1SIG5vcmVwZWF0IG5vdyBmb3JjZXMgdGhlIGlzc3VlIChYc2Vzc2lvbiBtYXkgdHVybiBpdCBiYWNrIG9uKS4KLQkqIHRyeSA6MCBpZiBubyBvdGhlciBpbmZvLgotCi0yMDA1LTAxLTE1ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogYWRqdXN0IGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMsIC1hbHBoYWJsZW5kLCBoYW5kbGUgMjRicHAuCi0JKiBhZGQgLXNuYXBmYiBzbmFwc2hvdCBmYiwgbm90IGNsZWFyIGhvdyB1c2VmdWwgaXQgaXMuLgotCSogbW9yZSBmdW5jdGlvbnMgZXRjIGZvciAtcG9pbnRlcl9tb2RlIDQsIHN0aWxsIG5vdCBmaW5pc2hlZC4KLQkqIHNjYW5fZm9yX3VwZGF0ZXMoKSAiY291bnQgb25seSIgbW9kZS4KLQkqIGluY3JlYXNlIG1heCBzaG0gc2l6ZSBvbiBMaW51eC4KLQkqIC1vYSAtbG9nYXBwZW5kLCAtcG0sIC1zcGVlZHMgCi0JKiBmaXggYnVncyBpbiAtYWxsb3csIC1SIGNvbm5lY3QsIHNjcmVlbiA9PSBOVUxMCi0KLTIwMDQtMTItMjcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhbGxvdyAtRExJQlZOQ1NFUlZFUl9IQVZFX0ZPTz0wIG92ZXJyaWRlIGV2ZXJ5dGhpbmcKLQkqIGdldF94Zml4ZXNfY3Vyc29yKCkgdHJ5IHRvIG1vcmUgY2FyZWZ1bGx5IGNvbnZlcnQgYWxwaGEgY2hhbm5lbAotCSAgdG8gb3BhcXVlIHBpeGVsLiAgT3B0aW9ucyAtYWxwaGFjdXQsIC1hbHBoYWZyYWMsIC1hbHBoYXJlbW92ZQotCSogbW9yZSBjb21tYW5kcyB1bmRlciByZW1vdGUgY29udHJvbDogcmZid2FpdCwgcmZicG9ydCwgaHR0cCwKLQkgIGh0dHBwb3J0LCBodHRwZGlyLCBlbmFibGVodHRwcHJveHksIGRlc2t0b3AsIGFsd2F5c3NoYXJlZCwKLQkgIGRvbnRkaXNjb25uZWN0LiAgQWRkIHRvIHRreDExdm5jLgotCi0yMDA0LTEyLTIyICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogZmluYWwgcG9saXNoaW5nIGZvciAwLjcgcmVsZWFzZSwgdGt4MTF2bmMgdHdlYWtzCi0JKiBtb3JlIGNhcmVmdWwgcmZiUEUgaW4gcGlja193aW5kb3csIHN0YXJ0IGNoZWNrX3VzZXJfaW5wdXQ0KCkKLQotMjAwNC0xMi0xOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGNsZWFudXAgcHV0ZW52LCBzbnByaW50LCBvdGhlciBzdHJpbmcgbWFuaXAuCi0JKiBhZGQgLXN5bmMgbW9kZSB0byByZW1vdGUgY29udHJvbCBmb3IgYmV0dGVyIGNvbnRyb2wKLQkqIGFsbG93IC1yZW1vdGUgYW5kIC1xdWVyeSBhdCBzYW1lIHRpbWUuCi0KLTIwMDQtMTItMTYgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBzdXBwb3J0IGZvciBYRklYRVMgZXh0ZW5zaW9uIHRvIHNob3cgdGhlIGV4YWN0IGN1cnNvciBzaGFwZSwKLQkgIHdvcmtpbmcgb24gTGludXgvWG9yZyBhbmQgU29sYXJpcyAxMC4gIGRpc2FibGUgd2l0aCAtbm94Zml4ZXMKLQkqIHJlbW90ZSBjb250cm9sIG1hbmlhIC0gbmVhcmx5IGV2ZXJ5dGhpbmcgY2FuIGJlIGNoYW5nZWQgZHluYW1pY2FsbHkhCi0JICBzZWUgdGhlIC1yZW1vdGUvLXF1ZXJ5IChha2EgLVIvLVEpIG9wdGlvbnMuIGUuZy4gLVIgc2NhbGU6NS82Ci0JKiBzaW1wbGUgZ3VpIHRreDExdm5jIGJhc2VkIG9uIHRoZSByZW1vdGUgY29udHJvbCBtZWNoYW5pc20sIHNlZSAtZ3VpCi0JKiBzdXBwb3J0IGZvciBYUkFORFIgZXh0ZW5zaW9uLCBpZiB0aGUgWCBzY3JlZW4gY2hhbmdlcyBzaXplIChzZWUKLQkgIHhyYW5kcigxKSksIHgxMXZuYyB3aWxsIHJlc2l6ZSB0aGUgZmIuIFBheXMgdG8gaGF2ZSBOZXdGQlNpemUgdmlld2VyIAotCSogLW92ZXJsYXkgc3VwcG9ydCBvbiBJUklYIHdpdGggWFJlYWREaXNwbGF5IChub3QgdGVzdGVkKS4KLQkqIFJGQl9NT0RFIGlzIHNldCB0byAiYWNjZXB0IiBvciAiZ29uZSIgaW4gZW52aXJvbm1lbnQKLQkqICItaWQgcGljayIgd2lsbCBsZXQgeW91IHBpY2sgdGhlIHdpbmRvdyAoY2FsbHMgeHdpbmluZm8oMSkuLi4pCi0JKiAiLXBvaW50ZXJfbW9kZSBuIiByZXBsYWNlcyAtb2xkX3BvaW50ZXIgKG49MSkgYW5kIC1vbGRfcG9pbnRlcjIgKG49MikKLQkgIGEgbmV3IG1vZGUgbj0zIGlzIGFkZGVkIChzaW1pbGFyeSB0byBub2RyYWdnaW5nLCBidXQgZHluYW1pYykuCi0JKiAiLXNiIG4iIHNjcmVlbiBibGFuayB0aW1lb3V0IG9wdGlvbiBpcyBub3cgZG9jdW1lbnRlZC4KLQkqIHJlbmFtZWQgTk9OX0NWUyB0byBPTERfVFJFRQotCi0yMDA0LTA4LTMxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogbmV3IGNoZWNrX3VzZXJfaW5wdXQoKSBwb2ludGVyIGlucHV0IGFsZ29yaXRobSwgaXQgdHJpZXMgdG8gYXZvaWQKLQkgIGV4dHJhLWRyYXdzLiBzdGlsbCBuZWVkcyB0dW5pbmcsIGdldCBwcmV2aW91cyBvbmUgd2l0aCAtb2xkX3BvaW50ZXIyCi0JKiBhZGQgTk9OX0NWUyBtYWNybyBmb3IgYnVpbGRpbmcgaW4gb2xkZXIgQ1ZTIHRyZWVzLgotCi0yMDA0LTA4LTI5ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogcmVtb3ZlIG9sZCBtb3VzZSBwYXRjaCBjb2RlLCBub3cgdXNlIHJmYlNldEN1cnNvciAoKyB3b3JrYXJvdW5kcykKLQkqIGNoYW5nZWQgY3Vyc29yIHNoYXBlIG9wdGlvbnMgKG5vIG1vcmUgLW1vdXNlLCAuLi4pIHRvICctY3Vyc29yIG1vZGUnCi0JICB3aGVyZSAnbW9kZScgY2FuIGJlIGVtcHR5ICJYIiwgInNvbWUiLCBvciAibW9zdCIuICAic29tZSIgYWRkcwotCSAgaGV1cmlzdGljcyBmb3IgdHdvIG1vcmUgY3Vyc29ycy4KLQkqIC1ub2N1cnNvcnNoYXBlIGFkZGVkLgotCSogaWZkZWYgY2hlY2tzIGZvciBYU0hNIGFuZCBYVEVTVC4gIEFkZCAqX3dyIHdyYXBwZXJzIGFzIHdlbGwuCi0JKiAtdm5jY29ubmVjdCBpcyBub3cgdGhlIGRlZmF1bHQuCi0KLTIwMDQtMDgtMTUgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiAtb3ZlcmxheSBvcHRpb24gdG8gZml4IGNvbG9yIHByb2JsZW1zIG9uIFN1biBtYWNoaW5lcyB3aXRoIDgrMjQKLQkgIGFuZCAyNCs4IG92ZXJsYXkgdmlzdWFscywgdXNlcyBTb2xhcmlzIFhSZWFkU2NyZWVuKCkuCi0JKiBleHBvc2UgLXNpZCBvcHRpb24gKHNoaWZ0ZWQgLWlkIHdpbmRvd2lkKSB0byBhbGxvdyBleHBsaWNpdAotCSAgd3JhcHBpbmcgb2YgWEdldEltYWdlLCBldGMgZm9yIC1vdmVybGF5Ci0JKiBmaXggbWlzYyBidWdzOiBtaXNzaW5nIHZhciB0eXBlcywgaGFyZHdpcmVkIGJsYWNrb3V0cyBzaXplcywKLQkgIHN1YndpbiBkZXNrdG9wIG5hbWUgY3Jhc2guCi0JICAKLTIwMDQtMDgtMDMgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhZGQgbWFuIHBhZ2UgeDExdm5jLjEgYXV0b2dlbmVyYXRlZCBmcm9tIHgxMXZuYyAtaGVscDsgdHdlYWsKLQkgIGhlbHAgb3V0cHV0IGEgbGl0dGxlIGJpdC4gIEFkanVzdCBhdXRvY29uZiB0byBwaWNrIHVwIG1hbnBhZ2UuCi0JKiBhZGQgUkVBRE1FIGZyb20gd2Vic2l0ZSBkb2NzLgotCSogemVybyB3YXRjaF9iZWxsIGFuZCB1c2VfeGtiX21vZHR3ZWFrIGlmIG5vIFhLRVlCT0FSRAotCi0yMDA0LTA3LTMxICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogLWN1cnNvcnBvcyBub3cgdGhlIGRlZmF1bHQ7IG1ha2UgY3Vyc29ycG9zIHdvcmsgd2hlbiBzY2FsaW5nCi0JKiBmaXggYnVnIHdpdGggbXVsdGlwbGUgYWRkcyBvZiB0aGUgc2FtZSBrZXlzeW0gZm9yIC1hZGRfa2V5c3ltcwotCSogcmV3aGFjayAtaGVscCBvdXRwdXQgYWdhaW4KLQkqIGFkanVzdCB2ZXJzaW9uIG51bWJlciBhbmQgb3V0cHV0LgotCi0yMDA0LTA3LTI4ICBLYXJsIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCSogLWFkZF9rZXlzeW1zIGR5bmFtaWNhbGx5IGFkZCBtaXNzaW5nIGtleXN5bXMgdG8gWCBzZXJ2ZXIKLQotMjAwNC0wNy0yNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGZpcnN0IHBhc3MgYXQgZG9pbmcgbW9kdHdlYWsgdmlhIFhLRVlCT0FSRCBleHRlbnNpb24gKC14a2IpCi0JKiAtc2tpcF9rZXljb2RlcyBvcHRpb24gZm9yIHVzZSB3aXRoIC14a2IKLQkqIHJlc2V0IG1vZHR3ZWFrIGFuZCB4a2JfbW9kdHdlYWsgb24gZXZlbnQgTWFwcGluZ05vdGlmeS4KLQkqIHRyYXAgWGVycm9yIGR1cmluZyBYU2VuZEV2ZW50L1hDaGFuZ2VQcm9wZXJ0eS4KLQkqIGZpeCBidWcgcmVxdWVzdGluZyBQUklNQVJZIHdheSB0b28gb2Z0ZW4uCi0JKiBtb3JlIGNhcmVmdWwgdG8gY2hlY2sgaWYgWEtleXN5bVRvU3RyaW5nIHJldHVybnMgTlVMTC4KLQkqIGNvbnRpbnVhdGlvbiBsaW5lcyAiXCIgaW4geDExdm5jcmMuCi0JKiB1bmRvYydkIGV4cHRzOiAtaXNvbGV2ZWwzLCAteGtiY29tcGF0Ci0KLTIwMDQtMDctMTkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBpZ25vcmUga2V5c3ltcyA1LTggZm9yIGtleWNvZGUga2V5bWFwcGluZy4KLQkqIGhlbHAgdG8gc3Rkb3V0IGZvciBlYXN5IHBhZ2luZywgYWRkIGxhc3Rtb2QgdG8gaGVscCBhbmQgLXZlcnNpb24uCi0KLTIwMDQtMDctMTUgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBtYWtlICJtb2R0d2VhayIgdGhlIGRlZmF1bHQsIGRpc2FibGUgd2l0aCAtbm9tb2R0d2Vhay4gIHRoaXMKLQkgIGNvcnJlY3RzIGdob3N0ICI8ID4iIGtleSBvbiBwYzEwNCB1cyBpbiBYRnJlZTg2LgotCSogZml4IGJ1ZyB3cnQgbm8gZ290X2tleWJvYXJkX2lucHV0IHVuZGVyIG1vZHR3ZWFrCi0KLTIwMDQtMDctMTAgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiAtbm9yZXBlYXQgdG8gdHVybiBvZmYgWCBzZXJ2ZXIgYXV0b3JlcGVhdCB3aGVuIGNsaWVudHMgZXhpc3QsCi0JICAodGhpcyBpcyB3b3JrYXJvdW5kIGZvciB0aGUgcmVwZWF0aW5nIGtleXN0cm9rZSBidWcuICBOb3RlIHRoYXQKLQkgIGNsaWVudCBzaWRlIGRvZXMgYXV0b3JlcGVhdGluZyBzbyBub3QgYSBiaWcgbG9zcykuCi0KLTIwMDQtMDctMDQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBleHRlbmQgLWFsbG93IHRvIHJlLXJlYWQgYSBmaWxlIHdpdGggYWxsb3dlZCBJUCBhZGRyZXNzZXMuIAotCSogaW1wcm92ZW1lbnRzIHRvIC1oZWxwIHRleHQuCi0KLTIwMDQtMDctMDEgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBpbXByb3ZlIHNjYWxlZCBncmlkIGNhbGN1bGF0aW9uIHRvIHByZXZlbnQgZHJpZnQgKHdoaWNoIGNhdXNlcwotCSAgZHJpZnQgaW4gcGl4ZWwgd2VpZ2h0cyBhbmQgcG9vcmVyIHRpZ2h0dm5jIGNvbXByZXNzaW9uKQotCSogYWRkICI6cGFkIiBzY2FsZSBvcHRpb24sIGRldGVjdCBzbWFsbCBmcmFjdGlvbiBzY2FsZSA9IG0vbi4KLQotMjAwNC0wNi0yOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHJvdW5kIHNjYWxlZCB3aWR0aCB0byBtdWx0aXBsZSBvZiA0IHRvIG1ha2Ugdm5jdmlld2VyIGhhcHB5LgotCSogYWxsb3cgb3ZlcnJpZGUgb2YgYWJvdmUgIjpuNCIgYW5kIGFsbG93IDQgcG9pbnQgaW50ZXJwb2xhdGlvbgotCSAgdG8gYmUgdXNlZCBldmVuIHdpdGggc2hyaW5raW5nICI6aW4iLiAKLQotMjAwNC0wNi0yNyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNwZWVkIHVwIHNjYWxpbmcgYSBiaXQgZm9yIHNsb3cgbWFjaGluZXMgKHN0aWxsIGFsbCBmbG9hdGluZyBwb2ludCkKLQkqIGFkZCBubyBibGVuZGluZyBvcHRpb24gKC1zY2FsZSBmcmFjdGlvbjpuYikKLQotMjAwNC0wNi0yNiAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZCAtc2NhbGUgZnJhY3QgZm9yIGdsb2JhbCAobm90IHBlci1jbGllbnQpIHNlcnZlci1zaWRlIHNjYWxpbmcKLQkgIHdvcmtpbmcgbW9yZSBvciBsZXNzIE9LLCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgYXQgc29tZSBwb2ludC4KLQkqIHJlbW92ZSAtaGludHMvLW5vaGludHMgb3B0aW9ucy4KLQotMjAwNC0wNi0xNyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNpbXBsZSB+Ly54MTF2bmNyYyBjb25maWcgZmlsZSBzdXBwb3J0LCAtcmMsIC1ub3JjCi0KLTIwMDQtMDYtMTIgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhZGQgLWNsZWFyX21vZHMgLWNsZWFyX2tleXMgZm9yIChyYXJlKSBjYXNlIHdoZXJlIGtleXMgYXJlCi0JICBub3QgYmVpbmcgcmVsZWFzZWQgKGUuZy4gQ3RybC1DIHgxMXZuYyB0aHJ1IHgxMXZuYykuCi0JKiBleHBvcnQgUkZCX1NFUlZFUl9JUCBhbmQgUkZCX1NFUlZFUl9QT1JUIHRvIC1hY2NlcHQgcHJvZ3JhbQotCSAgc28gdGhhdCB0aGUgdGNwIDQtdHVwbGUgaXMgY29tcGxldGVseSBzcGVjaWZpZWQuICAKLQkqIGFkZCAtc3RvcmVwYXNzd2QgPHBhc3M+IDxmaWxlPiBzbyBzdG9yZXBhc3N3ZCBwcm9ncmFtIG5vdCBuZWVkZWQKLQotMjAwNC0wNi0wNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHJlYXJyYW5nZSBmaWxlIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UsIGluZGljYXRpbmcgZmlsZSBicmVha3VwLgotCSogYWRkIFJGQl9DTElFTlRfQ09VTlQsIG51bWJlciBvZiBvdGhlciBjb25uZWN0ZWQgY2xpZW50cyB0bwotCSAgLWFjY2VwdCBhbmQgLWdvbmUgY29tbWFuZHMuCi0KLTIwMDQtMDUtMjcgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhZGQgdmlldy1vbmx5IHBhc3N3ZCB2aWEgLXZpZXdwYXNzd2QgYW5kIDJuZCBsaW5lIG9mIC1wYXNzd2RmaWxlCi0KLTIwMDQtMDUtMjEgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiAtYWNjZXB0OiBhZGQgdmlldy1vbmx5IGRlY2lzaW9uIGFuZCBvdGhlciBpbXByb3ZlbWVudHMuCi0JKiBhZGQgLWdvbmUgY29tbWFuZCBvcHRpb24gZm9yIHdoZW4gYSBjbGllbnQgbGVhdmVzLgotCSAgVGhhbmtzIHRvIEplc3VzIEFsdmFyZXogZm9yIHRoZXNlIGlkZWFzLgotCSogLXBhc3N3ZGZpbGUgdG8ga2VlcCBwYXNzd2Qgb2ZmIG9mIGNtZCBsaW5lLgotCSogLW8gbG9nZmlsZSBzZW5kIHN0ZGVyciB0byBhIGxvZ2ZpbGUuCi0KLTIwMDQtMDUtMTQgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBpbXByb3ZlbWVudHMgdG8gLWFjY2VwdCBwb3B1cDogeWVzL25vIGJ1dHRvbnMgYW5kIHRpbWVvdXQuIAotCSogbGVzcyBmcHJpbnRmIHVuZGVyIC1xIHNvICctcSAtaW5ldGQnIGhhcyBubyBzdGRlcnIgb3V0cHV0LiAKLQotMjAwNC0wNS0wOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZCAtYWNjZXB0IHNvbWUtY29tbWFuZC94bWVzc2FnZS9wb3B1cCB0byBwcm9tcHQgbG9jYWwgWDExIHVzZXIKLQkgIG9yIG90aGVyd2lzZSBkZWNpZGUgdG8gYWNjZXB0IGFuIGluY29taW5nIGNsaWVudC4gCi0JKiBjbGVhbiB1cCAtV2FsbCB3YXJuaW5ncy4KLQotMjAwNC0wNS0wNSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGVuYWJsZSBtb3VzZSBidXR0b24gLT4ga2V5c3Ryb2tlcyBtYXBwaW5nIGluIC1idXR0b25tYXAgKG1vdXNld2hlZWwpCi0JKiBlbmFibGUga2V5c3Ryb2tlIC0+IG1vdXNlIGJ1dHRvbiBtYXBwaW5nIGluIC1yZW1hcCAodG91Y2hwYWQgcGFzdGUpCi0JICAoLXJlbWFwIGluY29tcGF0ICc6JyAtPiAnLScsIHNvcnJ5Li4uKQotCSogc2htIE9TIGJsYWNrbGlzdCAoaS5lLiA8PSBTdW5PUyA1LjgpIC0+IC1vbmV0aWxlCi0JKiByZXZlcnQgdG8gY2hlY2tfdXNlcl9pbnB1dCgpIHVuZGVyIC1ub2ZiCi0JKiBjbGVhbnVwOiBsYXN0bW9kLCByZW1vdmUgdGlsZV9zaG0gYW5kIHVwZGF0ZV9jbGllbnRfcG9pbnRlciwKLQkgIGRlYnVnIG91dHB1dCwgcmZiUG9ydCBmYWlsdXJlLiAKLQkqIHVzZXIgZnJpZW5kbHkgbGFzdCBsaW5lOiAnVGhlIFZOQyBkZXNrdG9wIGlzIGhvc3RuYW1lOjAnCi0KLTIwMDQtMDQtMjggIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiAtYXV0aCBjbWRsaW5lIG9wdGlvbiBmb3IgeGF1dGhvcml0eS4KLQkqIGRlY3JlYXNlIGRlZmF1bHQgZGVmZXJ1cGRhdGUgdW5kZXIgLW5vZmIuCi0JKiB1cGRhdGVfY2xpZW50X3BvaW50ZXIoKSBmcm9tIEVkb2FyZG8gVGlydGFyYWhhcmRqYS4KLQkqIHJlbW92ZSBzb21lIGFzc3VtcHRpb25zIGFib3V0IGxpYnZuY3NlcnZlciBkZWZhdWx0cy4KLQotMjAwNC0wNC0xOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHN1cHBvcnQgZm9yIGN1cnNvciBwb3NpdGlvbnMgdXBkYXRlcyAtY3Vyc29ycG9zCi0JKiBvcHRpb24gZm9yIFNJR1BJUEUgaGFuZGxpbmcgLXNpZ3BpcGUKLQotMjAwNC0wNC0xMyAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIHNvbHZlIHByb2JsZW0gd2l0aCBzZW5kaW5nIHNlbGVjdGlvbiB3aGVuIGNsaWVudCBpbml0aWFsaXppbmcKLQkgIChub3QgeWV0IGluIFJGQl9OT1JNQUwgc3RhdGUpLiAgSW5jcmVhc2UgZGVsYXkgdG8gMTVzIGFzIHdlbGwuIAotCSogd2hlbiB0aHJlYWRlZDogbGltaXQgcmZiTWF4Q2xpZW50V2FpdCB0byA+PSAyMCBzZWNzIGFuZAotCSAgaW5jcmVhc2UgaXQgdG8gYSBodWdlIHZhbHVlIHVubGVzcyAtcmZid2FpdCBpcyBzdXBwbGllZC4KLQotMjAwNC0wNC0wOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZGVkIHN1cHBvcnQgZm9yIGJsYWNraW5nIG91dCByZWdpb25zIG9mIHRoZSBzY3JlZW4sIHByaW1hcmlseQotCSAgZm9yIFhpbmVyYW1hIHVzYWdlLCBvcHRpb25zOiAtYmxhY2tvdXQgLXhpbmVyYW1hCi0JKiBYaW5lcmFtYSB3b3JrYXJvdW5kIG1vdXNlIHByb2JsZW0gb24gJ2VtYmVkZGVkJyBzeXN0ZW0sIAotCSAgb3B0aW9uIC14d2FycHBvaW50ZXIgKFhXYXJwUG9pbnRlciBpbnN0ZWFkIG9mIFhURVNUKQotCSogbGV0IC1yZW1hcCBvcHRpb24gdGFrZSBrZXkgcmVtYXBwaW5ncyBvbiBjbWRsaW5lIGFzIHdlbGwgYXMgZmlsZS4KLQkqIHVzZSBjYXJncyBmaXggdG8gdGVzdCBmb3IgaW52YWxpZCBjbWRsaW5lIG9wdGlvbnMuIEFkZCAtLW9wdGlvbi4KLQkqIHJlbW92ZSBjb3B5X3RpbGUsIHVzZSBjb3B5X3RpbGVzKC4uLiwgMSkgaW5zdGVhZC4KLQotMjAwNC0wMy0xMCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZGVkIHJldmVyc2UgY29ubmVjdGlvbiBmb3Igdm5jY29ubmVjdCgxKSBhbmQgb3RoZXIgbWVhbnMKLQkgIC12bmNjb25uZWN0LCAtY29ubmVjdCBob3N0OnBvcnQsIGFuZCAtY29ubmVjdCB3YXRjaGZpbGUgCi0JKiBhZGRlZCBmaXJzdCBwYXNzIGF0IHVzZXIga2V5c3ltIHJlbWFwcGluZyBmZWF0dXJlIHZpYQotCSAgLXJlbWFwIGZpbGUuICBJZ25vcmVzIG1vZGlmaWVyIHN0YXRlLCBuZWVkIHRvIGdlbmVyYWxpemUuCi0JKiBkZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdXNlcnMgLWRlYnVnX3BvaW50ZXIgYW5kIC1kZWJ1Z19rZXlib2FyZAotCSogY2xlYXIgLXBhc3N3ZCBmcm9tIGFyZ3YgZm9yIHByaXZhY3kgKGlmIE9TIGFsbG93cykuCi0KLTIwMDQtMDItMTkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBhZGRlZCBoYW5kbGluZyBvZiBjbGlwYm9hcmQvc2VsZWN0aW9uIGV4Y2hhbmdlIHRvL2Zyb20gY2xpZW50cywKLQkgIGV2ZW4gaG9sZHMgUFJJTUFSWSB3aGljaCBYdm5jIGRvZXMgbm90IGRvLiAgZGlzYWJsZSB3aXRoIC1ub3NlbC4KLQkgIHVzZSAtbm9wcmltYXJ5IHRvIGRpc2FibGUgcG9sbGluZyBvZiBQUklNQVJZIHNlbGVjdGlvbi4KLQkqIGFkZGVkIC12aXN1YWwgb3B0aW9uIHRvIGZvcmNlIGZyYW1lYnVmZmVyIHZpc3VhbC4gIG5vdCByZWFsbHkKLQkgIG9mIGdlbmVyYWwgdXNlLCBtb3JlIGZvciB0ZXN0aW5nIGFuZCB3b3JrYXJvdW5kcyAoZS5nLiB3aW4ydm5jCi0JICBmYWlscyB1bmRlciA4YnBwIGluZGV4IGNvbG9yKQotCSogaW1wcm92ZSBjbGVhbnVwIGFuZCBlcnJvciBoYW5kbGluZyBXUlQgc2htIGFuZCBvdGhlciBmYWlsdXJlcy4KLQotMjAwNC0wMS0xOSAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGltcHJvdmVtZW50cyB0byBwb2ludGVyIGV2ZW50IGhhbmRsaW5nIHByaW1hcmlseSBkdXJpbmcgd2luZG93Ci0JICBkcmFnZ2luZy4gIGNoZWNrX3VzZXJfaW5wdXQoKSBmb3Igbm9uLXRocmVhZGVkIGFuZCBwb2ludGVyKCkKLQkgIGZvciB0aHJlYWRlZC4gIFJldmVydCB0byBvbGQgd2F5IHZpYSAtb2xkX3BvaW50ZXIgb3B0aW9uLgotCSogc29tZSBtZW1vcnkgSS9PIGltcHJvdmVtZW50IGJ5IHVzaW5nIGNvcHlfdGlsZXMoKSBpbnN0ZWFkCi0JICBvZiBjb3B5X3RpbGUoKS4gIE5ldyBvbmUgZG9lcyByb3dzIG9mIHRpbGVzIGF0IHNhbWUgdGltZS4KLQkgIFJldmVydCB0byBvbGQgd2F5IHZpYSAtb2xkX2NvcHl0aWxlLgotCSogaGFuZGxlIGNhc2Ugb2YgbW9yZSBtb3VzZSBidXR0b25zIG9uIGNsaWVudCB0aGFuIG9uIFggc2VydmVyLgotCSogYWRkZWQgLWJ1dHRvbm1hcCBvcHRpb24gZm9yIGZpbmVyIGNvbnRyb2wgb3ZlciBidXR0b24gZGlmZmVyZW5jZXMuCi0KLTIwMDQtMDEtMDkgIEthcmwgUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0JKiBvcHRpb25zIC1hbGxvdyAvIC1sb2NhbGhvc3QgZm9yIHNpbXBsZSBJUCBiYXNlZCBhY2Nlc3Mgc2NyZWVuaW5nCi0JKiBvcHRpb24gLW5vZHJhZ2dpbmcgdG8gc2tpcCBhbGwgc2NyZWVuIHVwZGF0ZXMgZHVyaW5nIG1vdXNlIGRyYWdzCi0JICAodGhhbmtzIHRvIE1pY2hhbCBTYWJhbGEpCi0JKiBvcHRpb24gLWlucHV0X3NraXAgdG8gYWxsb3cgdXNlcnMgdG8gdHVuZSB3YXRjaF9sb29wIGRyb3B0aHJ1IHJhdGUKLQkqIHRyeSB0byBhdm9pZCB3YXN0aW5nIFJBTSBmb3IgZnJhbWVidWZmZXIgdW5kZXIgLW5vZmIKLQkqIGNsZWFudXAgd3J0IGJwcCB2cy4gZGVwdGgKLQotMjAwMy0xMi0wOCAgS2FybCBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLQkqIGFkZCBYYmVsbCBzdXBwb3J0IHVzaW5nIFhLRVlCT0FSRCBleHRlbnNpb24gKGRpc2FibGU6IC1ub2JlbGwpCi0JKiBhZGQgIi1ub2ZiIiB0byBkaXNhYmxlIGZyYW1lYnVmZmVyLCBpLmUuIG1vdXNlICsga2V5Ym9hcmQgb25seSAoISkKLQkqIGFkZCAiLW5vdHJ1ZWNvbG9yIiB0byBmb3JjZSBpbmRleGVkIDhicHAgY29sb3IgKHdoZW4gOGJwcCkgCi0JKiBtYWtlIGFsaWFzICItZm9yZXZlciIgZm9yICItbWFueSIKLQotRnJvbSBLYXJsICh4MTF2bmMncyBmYXRoZXIpIG9uIEFwciAyLCAyMDAzOgotCQotTmV3IG9wdGlvbiAtbm9jdXJzb3IgdG8gbm90IGRpc3BsYXkgdGhlIHZuY3ZpZXdlciBsb2NhbCBjdXJzb3IgaWYgdXNlcgotZG9lcyBub3Qgd2FudCBpdCAoYWxzbyBjYXVzZWQgc29tZSBwcm9ibGVtcyB3aXRoIG9sZGVyIHZuY3ZpZXdlcnMpCi0KLU5ldyBvcHRpb24gLW1vdXNlIHRvIHNob3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBYIHNlcnZlciBtb3VzZSAoaS5lLiBsYWdnZWQKLWZyb20gdGhlIHVzZXIncyB2bmMgY3Vyc29yIHBvc2l0aW9uKS4gIEFsc286IC1tb3VzZVggd2lsbCB0cnkgdG8gc2hvdwotdGhlIGEgZGlmZmVyZW50IGN1cnNvciAoWCkgd2hlbiBvbiB0aGUgcm9vdCBiYWNrZ3JvdW5kLgotCi1OZXcgb3B0aW9uIC1tYW55IHRvIHdhaXQgZm9yIG1vcmUgY29ubmVjdGlvbnMgcmF0aGVyIHRoYW4gZXhpdGluZyB3aGVuCi10aGUgZmlyc3QgY2xpZW50KHMpIGRpc2Nvbm5lY3QuCi0KLU5ldyBvcHRpb24gLWZsYXNoY21hcCB0byB0cnkgdG8gZm9sbG93IGluc3RhbGxlZCBjb2xvcm1hcHMgdW5kZXIgOGJwcAotaW5kZXhlZCBjb2xvciBhcyBwb2ludGVyIGlzIG1vdmVkLgotCi1OZXcgb3B0aW9uIC1uYXAgdG8gd2F0Y2ggZm9yIGxvdyBhY3Rpdml0eSBhbmQgdGhyb3R0bGUgZG93biB0aGUgcG9sbGluZwotcmF0ZS4gIFVzZWZ1bCBvbiBzaGFyZWQgbWFjaGluZXMgdG8ga2VlcCB0aGUgbG9hZCBkb3duLgotCi1FeHBlcmltZW50YWwgb3B0aW9uIC1pZCA8d2luZG93aWQ+IHRvIHNob3cganVzdCB0aGF0IHdpbmRvdyBhbmQgbm90Ci10aGUgd2hvbGUgZGlzcGxheS4gIFNvbWUgcmVtYWluaW5nIGJ1Z3MgYW5kIGluY29udmVuaWVudCBiZWhhdmlvci4uLgotKGUuZy4gbmV3IHRvcGxldmVscyBjYW4gYmUgdW5zZWVuKQotCi1GaXhlZCBidWcgb24gbXVsdGktaGVhZGVkIG1hY2hpbmVzIHdoZXJlIHRoZSBzY3JlZW4gbnVtYmVyIHdhcyBiZWluZwotaWdub3JlZCBpbiBhIG51bWJlciBvZiBwbGFjZXMuCi0KLUZpeGVkIGJ1ZyB3cnQgY29ubmVjdF9vbmNlIG1vZGUuICBOb3cganVzdCByZWZ1c2VzIG5ldyBjbGllbnRzIHVubGVzcwotc2hhcmVkIHJhdGhlciB0aGFuIHRlcm1pbmF0aW5nIGFsbCBjbGllbnRzLgotCi1UcnkgdG8gZm9sbG93IGNoYW5naW5nIGRlZmF1bHQgY29sb3JtYXAgdW5kZXIgOGJwcCBpbmRleGVkIGNvbG9yCi1hcyBjb2xvciBjZWxscyBhcmUgYWRkZWQuCi0KLU5lZWRlZCB0byBwaWNrIHVwIEhBVkVfTElCUFRIUkVBRCBmcm9tIGF1dG9jb25mLgotCi1kZWZpbmVkIGEgc2VsZWN0KCkgbWFjcm8gZm9yIHVzbGVlcCgpIHNpbmNlIHVzbGVlcCBpcyBub3QgYWx3YXlzIHRocmVhZAotc2FmZS4KLQotQ2F0Y2ggYW5kIGV4aXQgb24gZXJyb3JzIGluIHRoZSBzaG0gc2V0dXAgd29yayAoWFNobUNyZWF0ZUltYWdlLCBzaG1nZXQsLi4uKQotYW5kIG1vdmVkIHRoZSBjcmVhdGlvbiBhbmQgcmVtb3ZhbCB3b3JrIHRvIHNlcGFyYXRlIHV0aWxpdHkgZnVuY3Rpb25zLgotCi1BZGRlZCBzaWduYWwgYW5kIFggZXJyb3IgaGFuZGxlcnMgdG8gdHJ5IHRvIGNsZWFuIG91dCB0aGUgc2htIG9iamVjdHMKLWJlZm9yZSBleGl0aW5nIG9uIGludGVycnVwdCwgZXRjLgotCi1JbXByb3ZlZCBwZXJmb3JtYW5jZSBhIGJpdCBvbiB0aGUgbWVtY21wKCkgaW4gc2Nhbl9kaXNwbGF5KCkgYnkgY2hlY2tpbmcKLXRoZSB3aG9sZSBsaW5lIGZpcnN0LgotCi1BZGRlZCBhIHdvcmthcm91bmQgd2hlbiB0aHJlYWRlZCB3aGVyZSBsaWJ2bmNzZXJ2ZXIgbWF5IGRpc2Nvbm5lY3QgdG9vCi1lYXJseSBpZiBpdCBkb2VzIG5vdCBoZWFyIGZyb20gYSBjbGllbnQgKGEgc21hbGwgaGVhcnRiZWF0IGlzIHNlbnQpLgotVGhpcyBtYXkgbm90IGJlIG5lZWRlZCBhbnkgbG9uZ2VyLgotCi1JZiAtZGVza3RvcCBoYXMgbm90IGJlZW4gcHJlc2NyaWJlZCwgdHJ5IHRvIGNob29zZSBhIHRpdGxlIGJhc2VkIG9uIERJU1BMQVkKLWFuZCB0aGUgaG9zdG5hbWUgKGFuZCB3aW5kb3cgbmFtZSB1bmRlciAtaWQpLgpkaWZmIC0tZ2l0IGEveDExdm5jL01ha2VmaWxlLmFtIGIveDExdm5jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmNhOWYxLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLWlmIEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUgotTERBREQgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQCBAV1NPQ0tMSUJACi1lbHNlCi1MREFERCA9IC4uL2xpYnZuY3NlcnZlci9saWJ2bmNzZXJ2ZXIubGEgLi4vbGlidm5jY2xpZW50L2xpYnZuY2NsaWVudC5sYSBAV1NPQ0tMSUJACi1lbmRpZgotCi1pZiBPU1gKLUZSQU1FV09SS1MgPSAtZnJhbWV3b3JrIEFwcGxpY2F0aW9uU2VydmljZXMgLWZyYW1ld29yayBDYXJib24gLWZyYW1ld29yayBJT0tpdCAtZnJhbWV3b3JrIENvY29hCi1pZiBPU1hfT1BFTkdMCi1GUkFNRVdPUktTICs9IC1mcmFtZXdvcmsgT3BlbkdMCi1pZiBIQVZFX1gxMQotR0wgPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrL1ZlcnNpb25zL0EvTGlicmFyaWVzL2xpYkdMLmR5bGliCi1GUkFNRVdPUktTICs9IC1keWxpYl9maWxlICQoR0wpOiQoR0wpCi1lbmRpZgotZW5kaWYKLXgxMXZuY19MREZMQUdTID0gJChGUkFNRVdPUktTKQoteDExdm5jX0NGTEFHUyA9IC1PYmpDCi1lbmRpZgotCi1TVUJESVJTID0gbWlzYwotRElTVF9TVUJESVJTID0gbWlzYwotCi1kZXNrdG9wZGlyID0gJChkYXRhZGlyKS9hcHBsaWNhdGlvbnMKLWRlc2t0b3BfREFUQSA9IHgxMXZuYy5kZXNrdG9wCi0KLW1hbl9NQU5TPXgxMXZuYy4xCi1FWFRSQV9ESVNUPUNoYW5nZUxvZyBSRUFETUUgUkVMRUFTRS1OT1RFUyB0a3gxMXZuYyAkKG1hbl9NQU5TKSAkKGRlc2t0b3BfREFUQSkKLQotaWYgQ1lHSVBDCi1MRF9DWUdJUEM9LWxjeWdpcGMKLWVuZGlmCi0KLWJpbl9QUk9HUkFNUz14MTF2bmMKLXgxMXZuY19TT1VSQ0VTID0gOHRvMjQuYyBhcHBzaGFyZS5jIGF2YWhpLmMgY2xlYW51cC5jIGNvbm5lY3Rpb25zLmMgY3Vyc29yLmMgZ3VpLmMgaGVscC5jIGluZXQuYyBrZXlib2FyZC5jIGxpbnV4ZmIuYyBtYWNvc3guYyBtYWNvc3hDRy5jIG1hY29zeENHUC5jIG1hY29zeENHUy5jIG1hY29zeF9vcGVuZ2wuYyBvcHRpb25zLmMgcG0uYyBwb2ludGVyLmMgcmF0ZXMuYyByZW1vdGUuYyBzY2FuLmMgc2NyZWVuLmMgc2VsZWN0aW9uLmMgc29saWQuYyBzc2xjbWRzLmMgc3NsaGVscGVyLmMgdWlucHV0LmMgdW5peHB3LmMgdXNlci5jIHVzZXJpbnB1dC5jIHV0aWwuYyB2NGwuYyB3aW5fdXRpbHMuYyB4MTF2bmMuYyB4MTF2bmNfZGVmcy5jIHhkYW1hZ2UuYyB4ZXZlbnRzLmMgeGluZXJhbWEuYyB4a2JfYmVsbC5jIHhyYW5kci5jIHhyZWNvcmQuYyB4d3JhcHBlcnMuYyA4dG8yNC5oIGFsbG93ZWRfaW5wdXRfdC5oIGF2YWhpLmggYmxhY2tvdXRfdC5oIGNsZWFudXAuaCBjb25uZWN0aW9ucy5oIGN1cnNvci5oIGVuYy5oIGVudW1zLmggZ3VpLmggaGVscC5oIGluZXQuaCBrZXlib2FyZC5oIGxpbnV4ZmIuaCBtYWNvc3guaCBtYWNvc3hDRy5oIG1hY29zeENHUC5oIG1hY29zeENHUy5oIG1hY29zeF9vcGVuZ2wuaCBub3gxMS5oIG5veDExX2Z1bmNzLmggb3B0aW9ucy5oIHBhcmFtcy5oIHBtLmggcG9pbnRlci5oIHJhdGVzLmggcmVtb3RlLmggc2Nhbi5oIHNjcmVlbi5oIHNjcm9sbGV2ZW50X3QuaCBzZWxlY3Rpb24uaCBzb2xpZC5oIHNzbGNtZHMuaCBzc2xoZWxwZXIuaCBzc2x0b29scy5oIHRreDExdm5jLmggdWlucHV0LmggdW5peHB3LmggdXNlci5oIHVzZXJpbnB1dC5oIHV0aWwuaCB2NGwuaCB3aW5fdXRpbHMuaCB3aW5hdHRyX3QuaCB4MTF2bmMuaCB4ZGFtYWdlLmggeGV2ZW50cy5oIHhpbmVyYW1hLmggeGtiX2JlbGwuaCB4cmFuZHIuaCB4cmVjb3JkLmggeHdyYXBwZXJzLmgKLQotaWYgSEFWRV9TWVNURU1fTElCVk5DU0VSVkVSCi1JTkNMVURFU19MSUJWTkNTRVJWRVIgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1lbHNlCi1JTkNMVURFU19MSUJWTkNTRVJWRVIgPSAtSSR7dG9wX3NyY2Rpcn0KLWVuZGlmCi1JTkNMVURFUyA9ICQoSU5DTFVERVNfTElCVk5DU0VSVkVSKSBAWF9DRkxBR1NAIEBBVkFISV9DRkxBR1NACi0KLXgxMXZuY19MREFERD0kKExEQUREKSBAU1NMX0xJQlNAIEBDUllQVF9MSUJTQCBAWF9MSUJTQCBAQVZBSElfTElCU0AgJChMRF9DWUdJUEMpCmRpZmYgLS1naXQgYS94MTF2bmMvTWFrZWZpbGUuaW4gYi94MTF2bmMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTExZWEuLjAwMDAwMDAKLS0tIGEveDExdm5jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjYgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLQotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLUBPU1hfT1BFTkdMX1RSVUVAQE9TWF9UUlVFQGFtX19hcHBlbmRfMSA9IC1mcmFtZXdvcmsgT3BlbkdMCi1ASEFWRV9YMTFfVFJVRUBAT1NYX09QRU5HTF9UUlVFQEBPU1hfVFJVRUBhbV9fYXBwZW5kXzIgPSAtZHlsaWJfZmlsZSAkKEdMKTokKEdMKQotYmluX1BST0dSQU1TID0geDExdm5jJChFWEVFWFQpCi1zdWJkaXIgPSB4MTF2bmMKLURJU1RfQ09NTU9OID0gUkVBRE1FICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAotCUNoYW5nZUxvZwotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9yZmJjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUNPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjFkaXIpIiBcCi0JIiQoREVTVERJUikkKGRlc2t0b3BkaXIpIgotUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKLWFtX3gxMXZuY19PQkpFQ1RTID0geDExdm5jLTh0bzI0LiQoT0JKRVhUKSB4MTF2bmMtYXBwc2hhcmUuJChPQkpFWFQpIFwKLQl4MTF2bmMtYXZhaGkuJChPQkpFWFQpIHgxMXZuYy1jbGVhbnVwLiQoT0JKRVhUKSBcCi0JeDExdm5jLWNvbm5lY3Rpb25zLiQoT0JKRVhUKSB4MTF2bmMtY3Vyc29yLiQoT0JKRVhUKSBcCi0JeDExdm5jLWd1aS4kKE9CSkVYVCkgeDExdm5jLWhlbHAuJChPQkpFWFQpIFwKLQl4MTF2bmMtaW5ldC4kKE9CSkVYVCkgeDExdm5jLWtleWJvYXJkLiQoT0JKRVhUKSBcCi0JeDExdm5jLWxpbnV4ZmIuJChPQkpFWFQpIHgxMXZuYy1tYWNvc3guJChPQkpFWFQpIFwKLQl4MTF2bmMtbWFjb3N4Q0cuJChPQkpFWFQpIHgxMXZuYy1tYWNvc3hDR1AuJChPQkpFWFQpIFwKLQl4MTF2bmMtbWFjb3N4Q0dTLiQoT0JKRVhUKSB4MTF2bmMtbWFjb3N4X29wZW5nbC4kKE9CSkVYVCkgXAotCXgxMXZuYy1vcHRpb25zLiQoT0JKRVhUKSB4MTF2bmMtcG0uJChPQkpFWFQpIFwKLQl4MTF2bmMtcG9pbnRlci4kKE9CSkVYVCkgeDExdm5jLXJhdGVzLiQoT0JKRVhUKSBcCi0JeDExdm5jLXJlbW90ZS4kKE9CSkVYVCkgeDExdm5jLXNjYW4uJChPQkpFWFQpIFwKLQl4MTF2bmMtc2NyZWVuLiQoT0JKRVhUKSB4MTF2bmMtc2VsZWN0aW9uLiQoT0JKRVhUKSBcCi0JeDExdm5jLXNvbGlkLiQoT0JKRVhUKSB4MTF2bmMtc3NsY21kcy4kKE9CSkVYVCkgXAotCXgxMXZuYy1zc2xoZWxwZXIuJChPQkpFWFQpIHgxMXZuYy11aW5wdXQuJChPQkpFWFQpIFwKLQl4MTF2bmMtdW5peHB3LiQoT0JKRVhUKSB4MTF2bmMtdXNlci4kKE9CSkVYVCkgXAotCXgxMXZuYy11c2VyaW5wdXQuJChPQkpFWFQpIHgxMXZuYy11dGlsLiQoT0JKRVhUKSBcCi0JeDExdm5jLXY0bC4kKE9CSkVYVCkgeDExdm5jLXdpbl91dGlscy4kKE9CSkVYVCkgXAotCXgxMXZuYy14MTF2bmMuJChPQkpFWFQpIHgxMXZuYy14MTF2bmNfZGVmcy4kKE9CSkVYVCkgXAotCXgxMXZuYy14ZGFtYWdlLiQoT0JKRVhUKSB4MTF2bmMteGV2ZW50cy4kKE9CSkVYVCkgXAotCXgxMXZuYy14aW5lcmFtYS4kKE9CSkVYVCkgeDExdm5jLXhrYl9iZWxsLiQoT0JKRVhUKSBcCi0JeDExdm5jLXhyYW5kci4kKE9CSkVYVCkgeDExdm5jLXhyZWNvcmQuJChPQkpFWFQpIFwKLQl4MTF2bmMteHdyYXBwZXJzLiQoT0JKRVhUKQoteDExdm5jX09CSkVDVFMgPSAkKGFtX3gxMXZuY19PQkpFQ1RTKQotQEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9GQUxTRUBhbV9fREVQRU5ERU5DSUVTXzEgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIFwKLUBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0VACS4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEKLWFtX19ERVBFTkRFTkNJRVNfMiA9Ci14MTF2bmNfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18yKQotQU1fVl9sdCA9ICQoYW1fX3ZfbHRfQEFNX1ZAKQotYW1fX3ZfbHRfID0gJChhbV9fdl9sdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2x0XzAgPSAtLXNpbGVudAoteDExdm5jX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJCh4MTF2bmNfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1hbV9fbXYgPSBtdiAtZgotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAotCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUFNX1ZfQ0MgPSAkKGFtX192X0NDX0BBTV9WQCkKLWFtX192X0NDXyA9ICQoYW1fX3ZfQ0NfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCi0JJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1BTV9WX0NDTEQgPSAkKGFtX192X0NDTERfQEFNX1ZAKQotYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOwotQU1fVl9HRU4gPSAkKGFtX192X0dFTl9AQU1fVkApCi1hbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7Ci1TT1VSQ0VTID0gJCh4MTF2bmNfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQoeDExdm5jX1NPVVJDRVMpCi1SRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCi0JcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1hbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKLWFtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCi0gICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKLSAgICAqKSBmPSQkcDs7IFwKLSAgZXNhYzsKLWFtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKLWFtX19pbnN0YWxsX21heCA9IDQwCi1hbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAotICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCi1hbV9fbm9iYXNlX3N0cmlwID0gXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKLWFtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKLSAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKLSAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKLSAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAotICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKLSAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKLSAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCi1hbV9fYmFzZV9saXN0ID0gXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAotICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCi1hbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCi0gIHRlc3QgLXogIiQkZmlsZXMiIFwKLSAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKLSAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCi0gICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCi0gIH0KLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTlJPRkYgPSBucm9mZgotTUFOUyA9ICQobWFuX01BTlMpCi1EQVRBID0gJChkZXNrdG9wX0RBVEEpCi1SRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAotICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi1BTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKLQkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAotCWRpc3RkaXIKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1hbV9fcmVsYXRpdml6ZSA9IFwKLSAgZGlyMD1gcHdkYDsgXAotICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKLSAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKLSAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKLSAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCi0gIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKLSAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCi0gICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAotICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKLSAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCi0gICAgICBlbHNlIFwKLSAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCi0gICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCi0gICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKLSAgICAgICAgZmk7IFwKLSAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKLSAgICAgIGZpOyBcCi0gICAgZmk7IFwKLSAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKLSAgZG9uZTsgXAotICByZWxkaXI9IiQkZGlyMiIKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUBIQVZFX1NZU1RFTV9MSUJWTkNTRVJWRVJfRkFMU0VATERBREQgPSAuLi9saWJ2bmNzZXJ2ZXIvbGlidm5jc2VydmVyLmxhIC4uL2xpYnZuY2NsaWVudC9saWJ2bmNjbGllbnQubGEgQFdTT0NLTElCQAotQEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFQExEQUREID0gQFNZU1RFTV9MSUJWTkNTRVJWRVJfTElCU0AgQFdTT0NLTElCQAotQE9TWF9UUlVFQEZSQU1FV09SS1MgPSAtZnJhbWV3b3JrIEFwcGxpY2F0aW9uU2VydmljZXMgLWZyYW1ld29yayBcCi1AT1NYX1RSVUVACUNhcmJvbiAtZnJhbWV3b3JrIElPS2l0IC1mcmFtZXdvcmsgQ29jb2EgXAotQE9TWF9UUlVFQAkkKGFtX19hcHBlbmRfMSkgJChhbV9fYXBwZW5kXzIpCi1ASEFWRV9YMTFfVFJVRUBAT1NYX09QRU5HTF9UUlVFQEBPU1hfVFJVRUBHTCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL09wZW5HTC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9MaWJyYXJpZXMvbGliR0wuZHlsaWIKLUBPU1hfVFJVRUB4MTF2bmNfTERGTEFHUyA9ICQoRlJBTUVXT1JLUykKLUBPU1hfVFJVRUB4MTF2bmNfQ0ZMQUdTID0gLU9iakMKLVNVQkRJUlMgPSBtaXNjCi1ESVNUX1NVQkRJUlMgPSBtaXNjCi1kZXNrdG9wZGlyID0gJChkYXRhZGlyKS9hcHBsaWNhdGlvbnMKLWRlc2t0b3BfREFUQSA9IHgxMXZuYy5kZXNrdG9wCi1tYW5fTUFOUyA9IHgxMXZuYy4xCi1FWFRSQV9ESVNUID0gQ2hhbmdlTG9nIFJFQURNRSBSRUxFQVNFLU5PVEVTIHRreDExdm5jICQobWFuX01BTlMpICQoZGVza3RvcF9EQVRBKQotQENZR0lQQ19UUlVFQExEX0NZR0lQQyA9IC1sY3lnaXBjCi14MTF2bmNfU09VUkNFUyA9IDh0bzI0LmMgYXBwc2hhcmUuYyBhdmFoaS5jIGNsZWFudXAuYyBjb25uZWN0aW9ucy5jIGN1cnNvci5jIGd1aS5jIGhlbHAuYyBpbmV0LmMga2V5Ym9hcmQuYyBsaW51eGZiLmMgbWFjb3N4LmMgbWFjb3N4Q0cuYyBtYWNvc3hDR1AuYyBtYWNvc3hDR1MuYyBtYWNvc3hfb3BlbmdsLmMgb3B0aW9ucy5jIHBtLmMgcG9pbnRlci5jIHJhdGVzLmMgcmVtb3RlLmMgc2Nhbi5jIHNjcmVlbi5jIHNlbGVjdGlvbi5jIHNvbGlkLmMgc3NsY21kcy5jIHNzbGhlbHBlci5jIHVpbnB1dC5jIHVuaXhwdy5jIHVzZXIuYyB1c2VyaW5wdXQuYyB1dGlsLmMgdjRsLmMgd2luX3V0aWxzLmMgeDExdm5jLmMgeDExdm5jX2RlZnMuYyB4ZGFtYWdlLmMgeGV2ZW50cy5jIHhpbmVyYW1hLmMgeGtiX2JlbGwuYyB4cmFuZHIuYyB4cmVjb3JkLmMgeHdyYXBwZXJzLmMgOHRvMjQuaCBhbGxvd2VkX2lucHV0X3QuaCBhdmFoaS5oIGJsYWNrb3V0X3QuaCBjbGVhbnVwLmggY29ubmVjdGlvbnMuaCBjdXJzb3IuaCBlbmMuaCBlbnVtcy5oIGd1aS5oIGhlbHAuaCBpbmV0Lmgga2V5Ym9hcmQuaCBsaW51eGZiLmggbWFjb3N4LmggbWFjb3N4Q0cuaCBtYWNvc3hDR1AuaCBtYWNvc3hDR1MuaCBtYWNvc3hfb3BlbmdsLmggbm94MTEuaCBub3gxMV9mdW5jcy5oIG9wdGlvbnMuaCBwYXJhbXMuaCBwbS5oIHBvaW50ZXIuaCByYXRlcy5oIHJlbW90ZS5oIHNjYW4uaCBzY3JlZW4uaCBzY3JvbGxldmVudF90Lmggc2VsZWN0aW9uLmggc29saWQuaCBzc2xjbWRzLmggc3NsaGVscGVyLmggc3NsdG9vbHMuaCB0a3gxMXZuYy5oIHVpbnB1dC5oIHVuaXhwdy5oIHVzZXIuaCB1c2VyaW5wdXQuaCB1dGlsLmggdjRsLmggd2luX3V0aWxzLmggd2luYXR0cl90LmggeDExdm5jLmggeGRhbWFnZS5oIHhldmVudHMuaCB4aW5lcmFtYS5oIHhrYl9iZWxsLmggeHJhbmRyLmggeHJlY29yZC5oIHh3cmFwcGVycy5oCi1ASEFWRV9TWVNURU1fTElCVk5DU0VSVkVSX0ZBTFNFQElOQ0xVREVTX0xJQlZOQ1NFUlZFUiA9IC1JJHt0b3Bfc3JjZGlyfQotQEhBVkVfU1lTVEVNX0xJQlZOQ1NFUlZFUl9UUlVFQElOQ0xVREVTX0xJQlZOQ1NFUlZFUiA9IEBTWVNURU1fTElCVk5DU0VSVkVSX0NGTEFHU0AKLUlOQ0xVREVTID0gJChJTkNMVURFU19MSUJWTkNTRVJWRVIpIEBYX0NGTEFHU0AgQEFWQUhJX0NGTEFHU0AKLXgxMXZuY19MREFERCA9ICQoTERBREQpIEBTU0xfTElCU0AgQENSWVBUX0xJQlNAIEBYX0xJQlNAIEBBVkFISV9MSUJTQCAkKExEX0NZR0lQQykKLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAotCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHgxMXZuYy9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSB4MTF2bmMvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKLQlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKLQkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChiaW5kaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKLQlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCi0Jd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKLQkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAotCWRvbmUgfCBcCi0Jc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAotCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAotCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAotCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCi0JICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCi0JICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKLQkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKLQkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKLQl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCi0JICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAotCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKLQkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChiaW5kaXIpJCRkaXInIjsgXAotCSAgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAiJChERVNURElSKSQoYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAotCSAgICB9IFwKLQk7IGRvbmUKLQotdW5pbnN0YWxsLWJpblBST0dSQU1TOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKLQlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAotCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKLQkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCi0JdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKLQllY2hvICIgKCBjZCAnJChERVNURElSKSQoYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCi0JY2QgIiQoREVTVERJUikkKGJpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCi0JZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKLQlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKLQl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAotCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQllY2hvICIgcm0gLWYiICQkbGlzdDsgXAotCXJtIC1mICQkbGlzdAoteDExdm5jJChFWEVFWFQpOiAkKHgxMXZuY19PQkpFQ1RTKSAkKHgxMXZuY19ERVBFTkRFTkNJRVMpICQoRVhUUkFfeDExdm5jX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHgxMXZuYyQoRVhFRVhUKQotCSQoQU1fVl9DQ0xEKSQoeDExdm5jX0xJTkspICQoeDExdm5jX09CSkVDVFMpICQoeDExdm5jX0xEQUREKSAkKExJQlMpCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtOHRvMjQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1hcHBzaGFyZS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLWF2YWhpLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtY2xlYW51cC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLWNvbm5lY3Rpb25zLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtY3Vyc29yLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtZ3VpLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtaGVscC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLWluZXQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1rZXlib2FyZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLWxpbnV4ZmIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1tYWNvc3guUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1tYWNvc3hDRy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLW1hY29zeENHUC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLW1hY29zeENHUy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLW1hY29zeF9vcGVuZ2wuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1vcHRpb25zLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtcG0uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1wb2ludGVyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtcmF0ZXMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1yZW1vdGUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1zY2FuLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtc2NyZWVuLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtc2VsZWN0aW9uLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtc29saWQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy1zc2xjbWRzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtc3NsaGVscGVyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtdWlucHV0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtdW5peHB3LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMtdXNlci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLXVzZXJpbnB1dC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLXV0aWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy12NGwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy13aW5fdXRpbHMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy14MTF2bmMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy14MTF2bmNfZGVmcy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLXhkYW1hZ2UuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy14ZXZlbnRzLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94MTF2bmMteGluZXJhbWEuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy14a2JfYmVsbC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLXhyYW5kci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveDExdm5jLXhyZWNvcmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3gxMXZuYy14d3JhcHBlcnMuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDT01QSUxFKSAtYyAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKLQoteDExdm5jLTh0bzI0Lm86IDh0bzI0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy04dG8yNC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtOHRvMjQuVHBvIC1jIC1vIHgxMXZuYy04dG8yNC5vIGB0ZXN0IC1mICc4dG8yNC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2A4dG8yNC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtOHRvMjQuVHBvICQoREVQRElSKS94MTF2bmMtOHRvMjQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSc4dG8yNC5jJyBvYmplY3Q9J3gxMXZuYy04dG8yNC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLTh0bzI0Lm8gYHRlc3QgLWYgJzh0bzI0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDh0bzI0LmMKLQoteDExdm5jLTh0bzI0Lm9iajogOHRvMjQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLTh0bzI0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLTh0bzI0LlRwbyAtYyAtbyB4MTF2bmMtOHRvMjQub2JqIGBpZiB0ZXN0IC1mICc4dG8yNC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzh0bzI0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzh0bzI0LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy04dG8yNC5UcG8gJChERVBESVIpL3gxMXZuYy04dG8yNC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9Jzh0bzI0LmMnIG9iamVjdD0neDExdm5jLTh0bzI0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy04dG8yNC5vYmogYGlmIHRlc3QgLWYgJzh0bzI0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnOHRvMjQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvOHRvMjQuYyc7IGZpYAotCi14MTF2bmMtYXBwc2hhcmUubzogYXBwc2hhcmUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWFwcHNoYXJlLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1hcHBzaGFyZS5UcG8gLWMgLW8geDExdm5jLWFwcHNoYXJlLm8gYHRlc3QgLWYgJ2FwcHNoYXJlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFwcHNoYXJlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1hcHBzaGFyZS5UcG8gJChERVBESVIpL3gxMXZuYy1hcHBzaGFyZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2FwcHNoYXJlLmMnIG9iamVjdD0neDExdm5jLWFwcHNoYXJlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtYXBwc2hhcmUubyBgdGVzdCAtZiAnYXBwc2hhcmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYXBwc2hhcmUuYwotCi14MTF2bmMtYXBwc2hhcmUub2JqOiBhcHBzaGFyZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtYXBwc2hhcmUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtYXBwc2hhcmUuVHBvIC1jIC1vIHgxMXZuYy1hcHBzaGFyZS5vYmogYGlmIHRlc3QgLWYgJ2FwcHNoYXJlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXBwc2hhcmUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYXBwc2hhcmUuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWFwcHNoYXJlLlRwbyAkKERFUERJUikveDExdm5jLWFwcHNoYXJlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nYXBwc2hhcmUuYycgb2JqZWN0PSd4MTF2bmMtYXBwc2hhcmUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWFwcHNoYXJlLm9iaiBgaWYgdGVzdCAtZiAnYXBwc2hhcmUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhcHBzaGFyZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hcHBzaGFyZS5jJzsgZmlgCi0KLXgxMXZuYy1hdmFoaS5vOiBhdmFoaS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtYXZhaGkubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWF2YWhpLlRwbyAtYyAtbyB4MTF2bmMtYXZhaGkubyBgdGVzdCAtZiAnYXZhaGkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYXZhaGkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWF2YWhpLlRwbyAkKERFUERJUikveDExdm5jLWF2YWhpLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nYXZhaGkuYycgb2JqZWN0PSd4MTF2bmMtYXZhaGkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1hdmFoaS5vIGB0ZXN0IC1mICdhdmFoaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhdmFoaS5jCi0KLXgxMXZuYy1hdmFoaS5vYmo6IGF2YWhpLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1hdmFoaS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1hdmFoaS5UcG8gLWMgLW8geDExdm5jLWF2YWhpLm9iaiBgaWYgdGVzdCAtZiAnYXZhaGkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhdmFoaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hdmFoaS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtYXZhaGkuVHBvICQoREVQRElSKS94MTF2bmMtYXZhaGkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdhdmFoaS5jJyBvYmplY3Q9J3gxMXZuYy1hdmFoaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtYXZhaGkub2JqIGBpZiB0ZXN0IC1mICdhdmFoaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2F2YWhpLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2F2YWhpLmMnOyBmaWAKLQoteDExdm5jLWNsZWFudXAubzogY2xlYW51cC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtY2xlYW51cC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtY2xlYW51cC5UcG8gLWMgLW8geDExdm5jLWNsZWFudXAubyBgdGVzdCAtZiAnY2xlYW51cC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjbGVhbnVwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1jbGVhbnVwLlRwbyAkKERFUERJUikveDExdm5jLWNsZWFudXAuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjbGVhbnVwLmMnIG9iamVjdD0neDExdm5jLWNsZWFudXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1jbGVhbnVwLm8gYHRlc3QgLWYgJ2NsZWFudXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2xlYW51cC5jCi0KLXgxMXZuYy1jbGVhbnVwLm9iajogY2xlYW51cC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtY2xlYW51cC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1jbGVhbnVwLlRwbyAtYyAtbyB4MTF2bmMtY2xlYW51cC5vYmogYGlmIHRlc3QgLWYgJ2NsZWFudXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbGVhbnVwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NsZWFudXAuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWNsZWFudXAuVHBvICQoREVQRElSKS94MTF2bmMtY2xlYW51cC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2NsZWFudXAuYycgb2JqZWN0PSd4MTF2bmMtY2xlYW51cC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtY2xlYW51cC5vYmogYGlmIHRlc3QgLWYgJ2NsZWFudXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbGVhbnVwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NsZWFudXAuYyc7IGZpYAotCi14MTF2bmMtY29ubmVjdGlvbnMubzogY29ubmVjdGlvbnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWNvbm5lY3Rpb25zLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1jb25uZWN0aW9ucy5UcG8gLWMgLW8geDExdm5jLWNvbm5lY3Rpb25zLm8gYHRlc3QgLWYgJ2Nvbm5lY3Rpb25zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbm5lY3Rpb25zLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1jb25uZWN0aW9ucy5UcG8gJChERVBESVIpL3gxMXZuYy1jb25uZWN0aW9ucy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2Nvbm5lY3Rpb25zLmMnIG9iamVjdD0neDExdm5jLWNvbm5lY3Rpb25zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtY29ubmVjdGlvbnMubyBgdGVzdCAtZiAnY29ubmVjdGlvbnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29ubmVjdGlvbnMuYwotCi14MTF2bmMtY29ubmVjdGlvbnMub2JqOiBjb25uZWN0aW9ucy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtY29ubmVjdGlvbnMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtY29ubmVjdGlvbnMuVHBvIC1jIC1vIHgxMXZuYy1jb25uZWN0aW9ucy5vYmogYGlmIHRlc3QgLWYgJ2Nvbm5lY3Rpb25zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29ubmVjdGlvbnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29ubmVjdGlvbnMuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWNvbm5lY3Rpb25zLlRwbyAkKERFUERJUikveDExdm5jLWNvbm5lY3Rpb25zLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nY29ubmVjdGlvbnMuYycgb2JqZWN0PSd4MTF2bmMtY29ubmVjdGlvbnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWNvbm5lY3Rpb25zLm9iaiBgaWYgdGVzdCAtZiAnY29ubmVjdGlvbnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25uZWN0aW9ucy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25uZWN0aW9ucy5jJzsgZmlgCi0KLXgxMXZuYy1jdXJzb3IubzogY3Vyc29yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1jdXJzb3IubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWN1cnNvci5UcG8gLWMgLW8geDExdm5jLWN1cnNvci5vIGB0ZXN0IC1mICdjdXJzb3IuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3Vyc29yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1jdXJzb3IuVHBvICQoREVQRElSKS94MTF2bmMtY3Vyc29yLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nY3Vyc29yLmMnIG9iamVjdD0neDExdm5jLWN1cnNvci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWN1cnNvci5vIGB0ZXN0IC1mICdjdXJzb3IuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3Vyc29yLmMKLQoteDExdm5jLWN1cnNvci5vYmo6IGN1cnNvci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtY3Vyc29yLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWN1cnNvci5UcG8gLWMgLW8geDExdm5jLWN1cnNvci5vYmogYGlmIHRlc3QgLWYgJ2N1cnNvci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2N1cnNvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jdXJzb3IuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWN1cnNvci5UcG8gJChERVBESVIpL3gxMXZuYy1jdXJzb3IuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdjdXJzb3IuYycgb2JqZWN0PSd4MTF2bmMtY3Vyc29yLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1jdXJzb3Iub2JqIGBpZiB0ZXN0IC1mICdjdXJzb3IuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjdXJzb3IuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY3Vyc29yLmMnOyBmaWAKLQoteDExdm5jLWd1aS5vOiBndWkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWd1aS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtZ3VpLlRwbyAtYyAtbyB4MTF2bmMtZ3VpLm8gYHRlc3QgLWYgJ2d1aS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BndWkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWd1aS5UcG8gJChERVBESVIpL3gxMXZuYy1ndWkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdndWkuYycgb2JqZWN0PSd4MTF2bmMtZ3VpLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtZ3VpLm8gYHRlc3QgLWYgJ2d1aS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BndWkuYwotCi14MTF2bmMtZ3VpLm9iajogZ3VpLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1ndWkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtZ3VpLlRwbyAtYyAtbyB4MTF2bmMtZ3VpLm9iaiBgaWYgdGVzdCAtZiAnZ3VpLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3VpLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2d1aS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtZ3VpLlRwbyAkKERFUERJUikveDExdm5jLWd1aS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2d1aS5jJyBvYmplY3Q9J3gxMXZuYy1ndWkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWd1aS5vYmogYGlmIHRlc3QgLWYgJ2d1aS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2d1aS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ndWkuYyc7IGZpYAotCi14MTF2bmMtaGVscC5vOiBoZWxwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1oZWxwLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1oZWxwLlRwbyAtYyAtbyB4MTF2bmMtaGVscC5vIGB0ZXN0IC1mICdoZWxwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGhlbHAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWhlbHAuVHBvICQoREVQRElSKS94MTF2bmMtaGVscC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2hlbHAuYycgb2JqZWN0PSd4MTF2bmMtaGVscC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWhlbHAubyBgdGVzdCAtZiAnaGVscC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BoZWxwLmMKLQoteDExdm5jLWhlbHAub2JqOiBoZWxwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1oZWxwLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWhlbHAuVHBvIC1jIC1vIHgxMXZuYy1oZWxwLm9iaiBgaWYgdGVzdCAtZiAnaGVscC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2hlbHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaGVscC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtaGVscC5UcG8gJChERVBESVIpL3gxMXZuYy1oZWxwLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0naGVscC5jJyBvYmplY3Q9J3gxMXZuYy1oZWxwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1oZWxwLm9iaiBgaWYgdGVzdCAtZiAnaGVscC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2hlbHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaGVscC5jJzsgZmlgCi0KLXgxMXZuYy1pbmV0Lm86IGluZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWluZXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWluZXQuVHBvIC1jIC1vIHgxMXZuYy1pbmV0Lm8gYHRlc3QgLWYgJ2luZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgaW5ldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtaW5ldC5UcG8gJChERVBESVIpL3gxMXZuYy1pbmV0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0naW5ldC5jJyBvYmplY3Q9J3gxMXZuYy1pbmV0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtaW5ldC5vIGB0ZXN0IC1mICdpbmV0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGluZXQuYwotCi14MTF2bmMtaW5ldC5vYmo6IGluZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWluZXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtaW5ldC5UcG8gLWMgLW8geDExdm5jLWluZXQub2JqIGBpZiB0ZXN0IC1mICdpbmV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaW5ldC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pbmV0LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1pbmV0LlRwbyAkKERFUERJUikveDExdm5jLWluZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdpbmV0LmMnIG9iamVjdD0neDExdm5jLWluZXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWluZXQub2JqIGBpZiB0ZXN0IC1mICdpbmV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaW5ldC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pbmV0LmMnOyBmaWAKLQoteDExdm5jLWtleWJvYXJkLm86IGtleWJvYXJkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1rZXlib2FyZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMta2V5Ym9hcmQuVHBvIC1jIC1vIHgxMXZuYy1rZXlib2FyZC5vIGB0ZXN0IC1mICdrZXlib2FyZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BrZXlib2FyZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMta2V5Ym9hcmQuVHBvICQoREVQRElSKS94MTF2bmMta2V5Ym9hcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdrZXlib2FyZC5jJyBvYmplY3Q9J3gxMXZuYy1rZXlib2FyZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWtleWJvYXJkLm8gYHRlc3QgLWYgJ2tleWJvYXJkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGtleWJvYXJkLmMKLQoteDExdm5jLWtleWJvYXJkLm9iajoga2V5Ym9hcmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLWtleWJvYXJkLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWtleWJvYXJkLlRwbyAtYyAtbyB4MTF2bmMta2V5Ym9hcmQub2JqIGBpZiB0ZXN0IC1mICdrZXlib2FyZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2tleWJvYXJkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2tleWJvYXJkLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1rZXlib2FyZC5UcG8gJChERVBESVIpL3gxMXZuYy1rZXlib2FyZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2tleWJvYXJkLmMnIG9iamVjdD0neDExdm5jLWtleWJvYXJkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1rZXlib2FyZC5vYmogYGlmIHRlc3QgLWYgJ2tleWJvYXJkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAna2V5Ym9hcmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikva2V5Ym9hcmQuYyc7IGZpYAotCi14MTF2bmMtbGludXhmYi5vOiBsaW51eGZiLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1saW51eGZiLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1saW51eGZiLlRwbyAtYyAtbyB4MTF2bmMtbGludXhmYi5vIGB0ZXN0IC1mICdsaW51eGZiLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGxpbnV4ZmIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLWxpbnV4ZmIuVHBvICQoREVQRElSKS94MTF2bmMtbGludXhmYi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J2xpbnV4ZmIuYycgb2JqZWN0PSd4MTF2bmMtbGludXhmYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLWxpbnV4ZmIubyBgdGVzdCAtZiAnbGludXhmYi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BsaW51eGZiLmMKLQoteDExdm5jLWxpbnV4ZmIub2JqOiBsaW51eGZiLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1saW51eGZiLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLWxpbnV4ZmIuVHBvIC1jIC1vIHgxMXZuYy1saW51eGZiLm9iaiBgaWYgdGVzdCAtZiAnbGludXhmYi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xpbnV4ZmIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbGludXhmYi5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtbGludXhmYi5UcG8gJChERVBESVIpL3gxMXZuYy1saW51eGZiLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbGludXhmYi5jJyBvYmplY3Q9J3gxMXZuYy1saW51eGZiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1saW51eGZiLm9iaiBgaWYgdGVzdCAtZiAnbGludXhmYi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xpbnV4ZmIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbGludXhmYi5jJzsgZmlgCi0KLXgxMXZuYy1tYWNvc3gubzogbWFjb3N4LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1tYWNvc3gubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW1hY29zeC5UcG8gLWMgLW8geDExdm5jLW1hY29zeC5vIGB0ZXN0IC1mICdtYWNvc3guYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFjb3N4LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1tYWNvc3guVHBvICQoREVQRElSKS94MTF2bmMtbWFjb3N4LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbWFjb3N4LmMnIG9iamVjdD0neDExdm5jLW1hY29zeC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLW1hY29zeC5vIGB0ZXN0IC1mICdtYWNvc3guYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFjb3N4LmMKLQoteDExdm5jLW1hY29zeC5vYmo6IG1hY29zeC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtbWFjb3N4Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW1hY29zeC5UcG8gLWMgLW8geDExdm5jLW1hY29zeC5vYmogYGlmIHRlc3QgLWYgJ21hY29zeC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21hY29zeC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWNvc3guYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLW1hY29zeC5UcG8gJChERVBESVIpL3gxMXZuYy1tYWNvc3guUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdtYWNvc3guYycgb2JqZWN0PSd4MTF2bmMtbWFjb3N4Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1tYWNvc3gub2JqIGBpZiB0ZXN0IC1mICdtYWNvc3guYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWNvc3guYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFjb3N4LmMnOyBmaWAKLQoteDExdm5jLW1hY29zeENHLm86IG1hY29zeENHLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1tYWNvc3hDRy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0cuVHBvIC1jIC1vIHgxMXZuYy1tYWNvc3hDRy5vIGB0ZXN0IC1mICdtYWNvc3hDRy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWNvc3hDRy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0cuVHBvICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0cuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdtYWNvc3hDRy5jJyBvYmplY3Q9J3gxMXZuYy1tYWNvc3hDRy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLW1hY29zeENHLm8gYHRlc3QgLWYgJ21hY29zeENHLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1hY29zeENHLmMKLQoteDExdm5jLW1hY29zeENHLm9iajogbWFjb3N4Q0cuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLW1hY29zeENHLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW1hY29zeENHLlRwbyAtYyAtbyB4MTF2bmMtbWFjb3N4Q0cub2JqIGBpZiB0ZXN0IC1mICdtYWNvc3hDRy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21hY29zeENHLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21hY29zeENHLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1tYWNvc3hDRy5UcG8gJChERVBESVIpL3gxMXZuYy1tYWNvc3hDRy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J21hY29zeENHLmMnIG9iamVjdD0neDExdm5jLW1hY29zeENHLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1tYWNvc3hDRy5vYmogYGlmIHRlc3QgLWYgJ21hY29zeENHLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWFjb3N4Q0cuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFjb3N4Q0cuYyc7IGZpYAotCi14MTF2bmMtbWFjb3N4Q0dQLm86IG1hY29zeENHUC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtbWFjb3N4Q0dQLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1tYWNvc3hDR1AuVHBvIC1jIC1vIHgxMXZuYy1tYWNvc3hDR1AubyBgdGVzdCAtZiAnbWFjb3N4Q0dQLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1hY29zeENHUC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0dQLlRwbyAkKERFUERJUikveDExdm5jLW1hY29zeENHUC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J21hY29zeENHUC5jJyBvYmplY3Q9J3gxMXZuYy1tYWNvc3hDR1AubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1tYWNvc3hDR1AubyBgdGVzdCAtZiAnbWFjb3N4Q0dQLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1hY29zeENHUC5jCi0KLXgxMXZuYy1tYWNvc3hDR1Aub2JqOiBtYWNvc3hDR1AuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLW1hY29zeENHUC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1tYWNvc3hDR1AuVHBvIC1jIC1vIHgxMXZuYy1tYWNvc3hDR1Aub2JqIGBpZiB0ZXN0IC1mICdtYWNvc3hDR1AuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWNvc3hDR1AuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFjb3N4Q0dQLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1tYWNvc3hDR1AuVHBvICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0dQLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbWFjb3N4Q0dQLmMnIG9iamVjdD0neDExdm5jLW1hY29zeENHUC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtbWFjb3N4Q0dQLm9iaiBgaWYgdGVzdCAtZiAnbWFjb3N4Q0dQLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWFjb3N4Q0dQLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21hY29zeENHUC5jJzsgZmlgCi0KLXgxMXZuYy1tYWNvc3hDR1MubzogbWFjb3N4Q0dTLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1tYWNvc3hDR1MubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW1hY29zeENHUy5UcG8gLWMgLW8geDExdm5jLW1hY29zeENHUy5vIGB0ZXN0IC1mICdtYWNvc3hDR1MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFjb3N4Q0dTLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1tYWNvc3hDR1MuVHBvICQoREVQRElSKS94MTF2bmMtbWFjb3N4Q0dTLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nbWFjb3N4Q0dTLmMnIG9iamVjdD0neDExdm5jLW1hY29zeENHUy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLW1hY29zeENHUy5vIGB0ZXN0IC1mICdtYWNvc3hDR1MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFjb3N4Q0dTLmMKLQoteDExdm5jLW1hY29zeENHUy5vYmo6IG1hY29zeENHUy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtbWFjb3N4Q0dTLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW1hY29zeENHUy5UcG8gLWMgLW8geDExdm5jLW1hY29zeENHUy5vYmogYGlmIHRlc3QgLWYgJ21hY29zeENHUy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21hY29zeENHUy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWNvc3hDR1MuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLW1hY29zeENHUy5UcG8gJChERVBESVIpL3gxMXZuYy1tYWNvc3hDR1MuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdtYWNvc3hDR1MuYycgb2JqZWN0PSd4MTF2bmMtbWFjb3N4Q0dTLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1tYWNvc3hDR1Mub2JqIGBpZiB0ZXN0IC1mICdtYWNvc3hDR1MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWNvc3hDR1MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFjb3N4Q0dTLmMnOyBmaWAKLQoteDExdm5jLW1hY29zeF9vcGVuZ2wubzogbWFjb3N4X29wZW5nbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtbWFjb3N4X29wZW5nbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtbWFjb3N4X29wZW5nbC5UcG8gLWMgLW8geDExdm5jLW1hY29zeF9vcGVuZ2wubyBgdGVzdCAtZiAnbWFjb3N4X29wZW5nbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWNvc3hfb3BlbmdsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1tYWNvc3hfb3BlbmdsLlRwbyAkKERFUERJUikveDExdm5jLW1hY29zeF9vcGVuZ2wuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdtYWNvc3hfb3BlbmdsLmMnIG9iamVjdD0neDExdm5jLW1hY29zeF9vcGVuZ2wubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1tYWNvc3hfb3BlbmdsLm8gYHRlc3QgLWYgJ21hY29zeF9vcGVuZ2wuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFjb3N4X29wZW5nbC5jCi0KLXgxMXZuYy1tYWNvc3hfb3BlbmdsLm9iajogbWFjb3N4X29wZW5nbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtbWFjb3N4X29wZW5nbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1tYWNvc3hfb3BlbmdsLlRwbyAtYyAtbyB4MTF2bmMtbWFjb3N4X29wZW5nbC5vYmogYGlmIHRlc3QgLWYgJ21hY29zeF9vcGVuZ2wuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWNvc3hfb3BlbmdsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21hY29zeF9vcGVuZ2wuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLW1hY29zeF9vcGVuZ2wuVHBvICQoREVQRElSKS94MTF2bmMtbWFjb3N4X29wZW5nbC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J21hY29zeF9vcGVuZ2wuYycgb2JqZWN0PSd4MTF2bmMtbWFjb3N4X29wZW5nbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtbWFjb3N4X29wZW5nbC5vYmogYGlmIHRlc3QgLWYgJ21hY29zeF9vcGVuZ2wuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWNvc3hfb3BlbmdsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21hY29zeF9vcGVuZ2wuYyc7IGZpYAotCi14MTF2bmMtb3B0aW9ucy5vOiBvcHRpb25zLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1vcHRpb25zLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1vcHRpb25zLlRwbyAtYyAtbyB4MTF2bmMtb3B0aW9ucy5vIGB0ZXN0IC1mICdvcHRpb25zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG9wdGlvbnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLW9wdGlvbnMuVHBvICQoREVQRElSKS94MTF2bmMtb3B0aW9ucy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J29wdGlvbnMuYycgb2JqZWN0PSd4MTF2bmMtb3B0aW9ucy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLW9wdGlvbnMubyBgdGVzdCAtZiAnb3B0aW9ucy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BvcHRpb25zLmMKLQoteDExdm5jLW9wdGlvbnMub2JqOiBvcHRpb25zLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1vcHRpb25zLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLW9wdGlvbnMuVHBvIC1jIC1vIHgxMXZuYy1vcHRpb25zLm9iaiBgaWYgdGVzdCAtZiAnb3B0aW9ucy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ29wdGlvbnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvb3B0aW9ucy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtb3B0aW9ucy5UcG8gJChERVBESVIpL3gxMXZuYy1vcHRpb25zLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nb3B0aW9ucy5jJyBvYmplY3Q9J3gxMXZuYy1vcHRpb25zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1vcHRpb25zLm9iaiBgaWYgdGVzdCAtZiAnb3B0aW9ucy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ29wdGlvbnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvb3B0aW9ucy5jJzsgZmlgCi0KLXgxMXZuYy1wbS5vOiBwbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtcG0ubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXBtLlRwbyAtYyAtbyB4MTF2bmMtcG0ubyBgdGVzdCAtZiAncG0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG0uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXBtLlRwbyAkKERFUERJUikveDExdm5jLXBtLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ncG0uYycgb2JqZWN0PSd4MTF2bmMtcG0ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1wbS5vIGB0ZXN0IC1mICdwbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbS5jCi0KLXgxMXZuYy1wbS5vYmo6IHBtLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1wbS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1wbS5UcG8gLWMgLW8geDExdm5jLXBtLm9iaiBgaWYgdGVzdCAtZiAncG0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wbS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtcG0uVHBvICQoREVQRElSKS94MTF2bmMtcG0uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdwbS5jJyBvYmplY3Q9J3gxMXZuYy1wbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtcG0ub2JqIGBpZiB0ZXN0IC1mICdwbS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BtLmMnOyBmaWAKLQoteDExdm5jLXBvaW50ZXIubzogcG9pbnRlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtcG9pbnRlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtcG9pbnRlci5UcG8gLWMgLW8geDExdm5jLXBvaW50ZXIubyBgdGVzdCAtZiAncG9pbnRlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwb2ludGVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1wb2ludGVyLlRwbyAkKERFUERJUikveDExdm5jLXBvaW50ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdwb2ludGVyLmMnIG9iamVjdD0neDExdm5jLXBvaW50ZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1wb2ludGVyLm8gYHRlc3QgLWYgJ3BvaW50ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG9pbnRlci5jCi0KLXgxMXZuYy1wb2ludGVyLm9iajogcG9pbnRlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtcG9pbnRlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1wb2ludGVyLlRwbyAtYyAtbyB4MTF2bmMtcG9pbnRlci5vYmogYGlmIHRlc3QgLWYgJ3BvaW50ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwb2ludGVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BvaW50ZXIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXBvaW50ZXIuVHBvICQoREVQRElSKS94MTF2bmMtcG9pbnRlci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3BvaW50ZXIuYycgb2JqZWN0PSd4MTF2bmMtcG9pbnRlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtcG9pbnRlci5vYmogYGlmIHRlc3QgLWYgJ3BvaW50ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwb2ludGVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BvaW50ZXIuYyc7IGZpYAotCi14MTF2bmMtcmF0ZXMubzogcmF0ZXMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXJhdGVzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1yYXRlcy5UcG8gLWMgLW8geDExdm5jLXJhdGVzLm8gYHRlc3QgLWYgJ3JhdGVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJhdGVzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1yYXRlcy5UcG8gJChERVBESVIpL3gxMXZuYy1yYXRlcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3JhdGVzLmMnIG9iamVjdD0neDExdm5jLXJhdGVzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtcmF0ZXMubyBgdGVzdCAtZiAncmF0ZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcmF0ZXMuYwotCi14MTF2bmMtcmF0ZXMub2JqOiByYXRlcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtcmF0ZXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtcmF0ZXMuVHBvIC1jIC1vIHgxMXZuYy1yYXRlcy5vYmogYGlmIHRlc3QgLWYgJ3JhdGVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncmF0ZXMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcmF0ZXMuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXJhdGVzLlRwbyAkKERFUERJUikveDExdm5jLXJhdGVzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ncmF0ZXMuYycgb2JqZWN0PSd4MTF2bmMtcmF0ZXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXJhdGVzLm9iaiBgaWYgdGVzdCAtZiAncmF0ZXMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdyYXRlcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yYXRlcy5jJzsgZmlgCi0KLXgxMXZuYy1yZW1vdGUubzogcmVtb3RlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1yZW1vdGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXJlbW90ZS5UcG8gLWMgLW8geDExdm5jLXJlbW90ZS5vIGB0ZXN0IC1mICdyZW1vdGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcmVtb3RlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1yZW1vdGUuVHBvICQoREVQRElSKS94MTF2bmMtcmVtb3RlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ncmVtb3RlLmMnIG9iamVjdD0neDExdm5jLXJlbW90ZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXJlbW90ZS5vIGB0ZXN0IC1mICdyZW1vdGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcmVtb3RlLmMKLQoteDExdm5jLXJlbW90ZS5vYmo6IHJlbW90ZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtcmVtb3RlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXJlbW90ZS5UcG8gLWMgLW8geDExdm5jLXJlbW90ZS5vYmogYGlmIHRlc3QgLWYgJ3JlbW90ZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JlbW90ZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yZW1vdGUuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXJlbW90ZS5UcG8gJChERVBESVIpL3gxMXZuYy1yZW1vdGUuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdyZW1vdGUuYycgb2JqZWN0PSd4MTF2bmMtcmVtb3RlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1yZW1vdGUub2JqIGBpZiB0ZXN0IC1mICdyZW1vdGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdyZW1vdGUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcmVtb3RlLmMnOyBmaWAKLQoteDExdm5jLXNjYW4ubzogc2Nhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtc2Nhbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtc2Nhbi5UcG8gLWMgLW8geDExdm5jLXNjYW4ubyBgdGVzdCAtZiAnc2Nhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzY2FuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1zY2FuLlRwbyAkKERFUERJUikveDExdm5jLXNjYW4uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzY2FuLmMnIG9iamVjdD0neDExdm5jLXNjYW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zY2FuLm8gYHRlc3QgLWYgJ3NjYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2Nhbi5jCi0KLXgxMXZuYy1zY2FuLm9iajogc2Nhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtc2Nhbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1zY2FuLlRwbyAtYyAtbyB4MTF2bmMtc2Nhbi5vYmogYGlmIHRlc3QgLWYgJ3NjYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzY2FuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NjYW4uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXNjYW4uVHBvICQoREVQRElSKS94MTF2bmMtc2Nhbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3NjYW4uYycgb2JqZWN0PSd4MTF2bmMtc2Nhbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtc2Nhbi5vYmogYGlmIHRlc3QgLWYgJ3NjYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzY2FuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NjYW4uYyc7IGZpYAotCi14MTF2bmMtc2NyZWVuLm86IHNjcmVlbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtc2NyZWVuLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1zY3JlZW4uVHBvIC1jIC1vIHgxMXZuYy1zY3JlZW4ubyBgdGVzdCAtZiAnc2NyZWVuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNjcmVlbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtc2NyZWVuLlRwbyAkKERFUERJUikveDExdm5jLXNjcmVlbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3NjcmVlbi5jJyBvYmplY3Q9J3gxMXZuYy1zY3JlZW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zY3JlZW4ubyBgdGVzdCAtZiAnc2NyZWVuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNjcmVlbi5jCi0KLXgxMXZuYy1zY3JlZW4ub2JqOiBzY3JlZW4uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXNjcmVlbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1zY3JlZW4uVHBvIC1jIC1vIHgxMXZuYy1zY3JlZW4ub2JqIGBpZiB0ZXN0IC1mICdzY3JlZW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzY3JlZW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2NyZWVuLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1zY3JlZW4uVHBvICQoREVQRElSKS94MTF2bmMtc2NyZWVuLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc2NyZWVuLmMnIG9iamVjdD0neDExdm5jLXNjcmVlbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtc2NyZWVuLm9iaiBgaWYgdGVzdCAtZiAnc2NyZWVuLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2NyZWVuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NjcmVlbi5jJzsgZmlgCi0KLXgxMXZuYy1zZWxlY3Rpb24ubzogc2VsZWN0aW9uLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1zZWxlY3Rpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNlbGVjdGlvbi5UcG8gLWMgLW8geDExdm5jLXNlbGVjdGlvbi5vIGB0ZXN0IC1mICdzZWxlY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VsZWN0aW9uLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1zZWxlY3Rpb24uVHBvICQoREVQRElSKS94MTF2bmMtc2VsZWN0aW9uLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc2VsZWN0aW9uLmMnIG9iamVjdD0neDExdm5jLXNlbGVjdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXNlbGVjdGlvbi5vIGB0ZXN0IC1mICdzZWxlY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VsZWN0aW9uLmMKLQoteDExdm5jLXNlbGVjdGlvbi5vYmo6IHNlbGVjdGlvbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtc2VsZWN0aW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNlbGVjdGlvbi5UcG8gLWMgLW8geDExdm5jLXNlbGVjdGlvbi5vYmogYGlmIHRlc3QgLWYgJ3NlbGVjdGlvbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NlbGVjdGlvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZWxlY3Rpb24uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXNlbGVjdGlvbi5UcG8gJChERVBESVIpL3gxMXZuYy1zZWxlY3Rpb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzZWxlY3Rpb24uYycgb2JqZWN0PSd4MTF2bmMtc2VsZWN0aW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zZWxlY3Rpb24ub2JqIGBpZiB0ZXN0IC1mICdzZWxlY3Rpb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZWxlY3Rpb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2VsZWN0aW9uLmMnOyBmaWAKLQoteDExdm5jLXNvbGlkLm86IHNvbGlkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1zb2xpZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtc29saWQuVHBvIC1jIC1vIHgxMXZuYy1zb2xpZC5vIGB0ZXN0IC1mICdzb2xpZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bzb2xpZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtc29saWQuVHBvICQoREVQRElSKS94MTF2bmMtc29saWQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzb2xpZC5jJyBvYmplY3Q9J3gxMXZuYy1zb2xpZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXNvbGlkLm8gYHRlc3QgLWYgJ3NvbGlkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNvbGlkLmMKLQoteDExdm5jLXNvbGlkLm9iajogc29saWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXNvbGlkLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNvbGlkLlRwbyAtYyAtbyB4MTF2bmMtc29saWQub2JqIGBpZiB0ZXN0IC1mICdzb2xpZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NvbGlkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NvbGlkLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1zb2xpZC5UcG8gJChERVBESVIpL3gxMXZuYy1zb2xpZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3NvbGlkLmMnIG9iamVjdD0neDExdm5jLXNvbGlkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zb2xpZC5vYmogYGlmIHRlc3QgLWYgJ3NvbGlkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc29saWQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc29saWQuYyc7IGZpYAotCi14MTF2bmMtc3NsY21kcy5vOiBzc2xjbWRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1zc2xjbWRzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy1zc2xjbWRzLlRwbyAtYyAtbyB4MTF2bmMtc3NsY21kcy5vIGB0ZXN0IC1mICdzc2xjbWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNzbGNtZHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXNzbGNtZHMuVHBvICQoREVQRElSKS94MTF2bmMtc3NsY21kcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3NzbGNtZHMuYycgb2JqZWN0PSd4MTF2bmMtc3NsY21kcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXNzbGNtZHMubyBgdGVzdCAtZiAnc3NsY21kcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bzc2xjbWRzLmMKLQoteDExdm5jLXNzbGNtZHMub2JqOiBzc2xjbWRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1zc2xjbWRzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNzbGNtZHMuVHBvIC1jIC1vIHgxMXZuYy1zc2xjbWRzLm9iaiBgaWYgdGVzdCAtZiAnc3NsY21kcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NzbGNtZHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3NsY21kcy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtc3NsY21kcy5UcG8gJChERVBESVIpL3gxMXZuYy1zc2xjbWRzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3NsY21kcy5jJyBvYmplY3Q9J3gxMXZuYy1zc2xjbWRzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zc2xjbWRzLm9iaiBgaWYgdGVzdCAtZiAnc3NsY21kcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NzbGNtZHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3NsY21kcy5jJzsgZmlgCi0KLXgxMXZuYy1zc2xoZWxwZXIubzogc3NsaGVscGVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy1zc2xoZWxwZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNzbGhlbHBlci5UcG8gLWMgLW8geDExdm5jLXNzbGhlbHBlci5vIGB0ZXN0IC1mICdzc2xoZWxwZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3NsaGVscGVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy1zc2xoZWxwZXIuVHBvICQoREVQRElSKS94MTF2bmMtc3NsaGVscGVyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0nc3NsaGVscGVyLmMnIG9iamVjdD0neDExdm5jLXNzbGhlbHBlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXNzbGhlbHBlci5vIGB0ZXN0IC1mICdzc2xoZWxwZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3NsaGVscGVyLmMKLQoteDExdm5jLXNzbGhlbHBlci5vYmo6IHNzbGhlbHBlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtc3NsaGVscGVyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXNzbGhlbHBlci5UcG8gLWMgLW8geDExdm5jLXNzbGhlbHBlci5vYmogYGlmIHRlc3QgLWYgJ3NzbGhlbHBlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NzbGhlbHBlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zc2xoZWxwZXIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXNzbGhlbHBlci5UcG8gJChERVBESVIpL3gxMXZuYy1zc2xoZWxwZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSdzc2xoZWxwZXIuYycgb2JqZWN0PSd4MTF2bmMtc3NsaGVscGVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy1zc2xoZWxwZXIub2JqIGBpZiB0ZXN0IC1mICdzc2xoZWxwZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzc2xoZWxwZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3NsaGVscGVyLmMnOyBmaWAKLQoteDExdm5jLXVpbnB1dC5vOiB1aW5wdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXVpbnB1dC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtdWlucHV0LlRwbyAtYyAtbyB4MTF2bmMtdWlucHV0Lm8gYHRlc3QgLWYgJ3VpbnB1dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1aW5wdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXVpbnB1dC5UcG8gJChERVBESVIpL3gxMXZuYy11aW5wdXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd1aW5wdXQuYycgb2JqZWN0PSd4MTF2bmMtdWlucHV0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtdWlucHV0Lm8gYHRlc3QgLWYgJ3VpbnB1dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1aW5wdXQuYwotCi14MTF2bmMtdWlucHV0Lm9iajogdWlucHV0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy11aW5wdXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtdWlucHV0LlRwbyAtYyAtbyB4MTF2bmMtdWlucHV0Lm9iaiBgaWYgdGVzdCAtZiAndWlucHV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndWlucHV0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3VpbnB1dC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtdWlucHV0LlRwbyAkKERFUERJUikveDExdm5jLXVpbnB1dC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3VpbnB1dC5jJyBvYmplY3Q9J3gxMXZuYy11aW5wdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXVpbnB1dC5vYmogYGlmIHRlc3QgLWYgJ3VpbnB1dC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3VpbnB1dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91aW5wdXQuYyc7IGZpYAotCi14MTF2bmMtdW5peHB3Lm86IHVuaXhwdy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtdW5peHB3Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy11bml4cHcuVHBvIC1jIC1vIHgxMXZuYy11bml4cHcubyBgdGVzdCAtZiAndW5peHB3LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHVuaXhwdy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtdW5peHB3LlRwbyAkKERFUERJUikveDExdm5jLXVuaXhwdy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3VuaXhwdy5jJyBvYmplY3Q9J3gxMXZuYy11bml4cHcubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy11bml4cHcubyBgdGVzdCAtZiAndW5peHB3LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHVuaXhwdy5jCi0KLXgxMXZuYy11bml4cHcub2JqOiB1bml4cHcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXVuaXhwdy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy11bml4cHcuVHBvIC1jIC1vIHgxMXZuYy11bml4cHcub2JqIGBpZiB0ZXN0IC1mICd1bml4cHcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1bml4cHcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdW5peHB3LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy11bml4cHcuVHBvICQoREVQRElSKS94MTF2bmMtdW5peHB3LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndW5peHB3LmMnIG9iamVjdD0neDExdm5jLXVuaXhwdy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtdW5peHB3Lm9iaiBgaWYgdGVzdCAtZiAndW5peHB3LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndW5peHB3LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3VuaXhwdy5jJzsgZmlgCi0KLXgxMXZuYy11c2VyLm86IHVzZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXVzZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXVzZXIuVHBvIC1jIC1vIHgxMXZuYy11c2VyLm8gYHRlc3QgLWYgJ3VzZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXNlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtdXNlci5UcG8gJChERVBESVIpL3gxMXZuYy11c2VyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndXNlci5jJyBvYmplY3Q9J3gxMXZuYy11c2VyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtdXNlci5vIGB0ZXN0IC1mICd1c2VyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHVzZXIuYwotCi14MTF2bmMtdXNlci5vYmo6IHVzZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXVzZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtdXNlci5UcG8gLWMgLW8geDExdm5jLXVzZXIub2JqIGBpZiB0ZXN0IC1mICd1c2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXNlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91c2VyLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy11c2VyLlRwbyAkKERFUERJUikveDExdm5jLXVzZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd1c2VyLmMnIG9iamVjdD0neDExdm5jLXVzZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXVzZXIub2JqIGBpZiB0ZXN0IC1mICd1c2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXNlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91c2VyLmMnOyBmaWAKLQoteDExdm5jLXVzZXJpbnB1dC5vOiB1c2VyaW5wdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXVzZXJpbnB1dC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtdXNlcmlucHV0LlRwbyAtYyAtbyB4MTF2bmMtdXNlcmlucHV0Lm8gYHRlc3QgLWYgJ3VzZXJpbnB1dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1c2VyaW5wdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXVzZXJpbnB1dC5UcG8gJChERVBESVIpL3gxMXZuYy11c2VyaW5wdXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd1c2VyaW5wdXQuYycgb2JqZWN0PSd4MTF2bmMtdXNlcmlucHV0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtdXNlcmlucHV0Lm8gYHRlc3QgLWYgJ3VzZXJpbnB1dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1c2VyaW5wdXQuYwotCi14MTF2bmMtdXNlcmlucHV0Lm9iajogdXNlcmlucHV0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy11c2VyaW5wdXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtdXNlcmlucHV0LlRwbyAtYyAtbyB4MTF2bmMtdXNlcmlucHV0Lm9iaiBgaWYgdGVzdCAtZiAndXNlcmlucHV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXNlcmlucHV0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3VzZXJpbnB1dC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtdXNlcmlucHV0LlRwbyAkKERFUERJUikveDExdm5jLXVzZXJpbnB1dC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3VzZXJpbnB1dC5jJyBvYmplY3Q9J3gxMXZuYy11c2VyaW5wdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXVzZXJpbnB1dC5vYmogYGlmIHRlc3QgLWYgJ3VzZXJpbnB1dC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3VzZXJpbnB1dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91c2VyaW5wdXQuYyc7IGZpYAotCi14MTF2bmMtdXRpbC5vOiB1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy11dGlsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy11dGlsLlRwbyAtYyAtbyB4MTF2bmMtdXRpbC5vIGB0ZXN0IC1mICd1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXV0aWwuVHBvICQoREVQRElSKS94MTF2bmMtdXRpbC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3V0aWwuYycgb2JqZWN0PSd4MTF2bmMtdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXV0aWwubyBgdGVzdCAtZiAndXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1dGlsLmMKLQoteDExdm5jLXV0aWwub2JqOiB1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy11dGlsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXV0aWwuVHBvIC1jIC1vIHgxMXZuYy11dGlsLm9iaiBgaWYgdGVzdCAtZiAndXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtdXRpbC5UcG8gJChERVBESVIpL3gxMXZuYy11dGlsLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndXRpbC5jJyBvYmplY3Q9J3gxMXZuYy11dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy11dGlsLm9iaiBgaWYgdGVzdCAtZiAndXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbC5jJzsgZmlgCi0KLXgxMXZuYy12NGwubzogdjRsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy12NGwubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXY0bC5UcG8gLWMgLW8geDExdm5jLXY0bC5vIGB0ZXN0IC1mICd2NGwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdjRsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy12NGwuVHBvICQoREVQRElSKS94MTF2bmMtdjRsLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0ndjRsLmMnIG9iamVjdD0neDExdm5jLXY0bC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXY0bC5vIGB0ZXN0IC1mICd2NGwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdjRsLmMKLQoteDExdm5jLXY0bC5vYmo6IHY0bC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMtdjRsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXY0bC5UcG8gLWMgLW8geDExdm5jLXY0bC5vYmogYGlmIHRlc3QgLWYgJ3Y0bC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Y0bC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92NGwuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXY0bC5UcG8gJChERVBESVIpL3gxMXZuYy12NGwuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd2NGwuYycgb2JqZWN0PSd4MTF2bmMtdjRsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy12NGwub2JqIGBpZiB0ZXN0IC1mICd2NGwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd2NGwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdjRsLmMnOyBmaWAKLQoteDExdm5jLXdpbl91dGlscy5vOiB3aW5fdXRpbHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXdpbl91dGlscy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtd2luX3V0aWxzLlRwbyAtYyAtbyB4MTF2bmMtd2luX3V0aWxzLm8gYHRlc3QgLWYgJ3dpbl91dGlscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3aW5fdXRpbHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXdpbl91dGlscy5UcG8gJChERVBESVIpL3gxMXZuYy13aW5fdXRpbHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd3aW5fdXRpbHMuYycgb2JqZWN0PSd4MTF2bmMtd2luX3V0aWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMtd2luX3V0aWxzLm8gYHRlc3QgLWYgJ3dpbl91dGlscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3aW5fdXRpbHMuYwotCi14MTF2bmMtd2luX3V0aWxzLm9iajogd2luX3V0aWxzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy13aW5fdXRpbHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMtd2luX3V0aWxzLlRwbyAtYyAtbyB4MTF2bmMtd2luX3V0aWxzLm9iaiBgaWYgdGVzdCAtZiAnd2luX3V0aWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnd2luX3V0aWxzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3dpbl91dGlscy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMtd2luX3V0aWxzLlRwbyAkKERFUERJUikveDExdm5jLXdpbl91dGlscy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3dpbl91dGlscy5jJyBvYmplY3Q9J3gxMXZuYy13aW5fdXRpbHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXdpbl91dGlscy5vYmogYGlmIHRlc3QgLWYgJ3dpbl91dGlscy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3dpbl91dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS93aW5fdXRpbHMuYyc7IGZpYAotCi14MTF2bmMteDExdm5jLm86IHgxMXZuYy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteDExdm5jLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14MTF2bmMuVHBvIC1jIC1vIHgxMXZuYy14MTF2bmMubyBgdGVzdCAtZiAneDExdm5jLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHgxMXZuYy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteDExdm5jLlRwbyAkKERFUERJUikveDExdm5jLXgxMXZuYy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3gxMXZuYy5jJyBvYmplY3Q9J3gxMXZuYy14MTF2bmMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14MTF2bmMubyBgdGVzdCAtZiAneDExdm5jLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHgxMXZuYy5jCi0KLXgxMXZuYy14MTF2bmMub2JqOiB4MTF2bmMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXgxMXZuYy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14MTF2bmMuVHBvIC1jIC1vIHgxMXZuYy14MTF2bmMub2JqIGBpZiB0ZXN0IC1mICd4MTF2bmMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4MTF2bmMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikveDExdm5jLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy14MTF2bmMuVHBvICQoREVQRElSKS94MTF2bmMteDExdm5jLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neDExdm5jLmMnIG9iamVjdD0neDExdm5jLXgxMXZuYy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteDExdm5jLm9iaiBgaWYgdGVzdCAtZiAneDExdm5jLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneDExdm5jLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3gxMXZuYy5jJzsgZmlgCi0KLXgxMXZuYy14MTF2bmNfZGVmcy5vOiB4MTF2bmNfZGVmcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteDExdm5jX2RlZnMubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXgxMXZuY19kZWZzLlRwbyAtYyAtbyB4MTF2bmMteDExdm5jX2RlZnMubyBgdGVzdCAtZiAneDExdm5jX2RlZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgeDExdm5jX2RlZnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXgxMXZuY19kZWZzLlRwbyAkKERFUERJUikveDExdm5jLXgxMXZuY19kZWZzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neDExdm5jX2RlZnMuYycgb2JqZWN0PSd4MTF2bmMteDExdm5jX2RlZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14MTF2bmNfZGVmcy5vIGB0ZXN0IC1mICd4MTF2bmNfZGVmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4MTF2bmNfZGVmcy5jCi0KLXgxMXZuYy14MTF2bmNfZGVmcy5vYmo6IHgxMXZuY19kZWZzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14MTF2bmNfZGVmcy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14MTF2bmNfZGVmcy5UcG8gLWMgLW8geDExdm5jLXgxMXZuY19kZWZzLm9iaiBgaWYgdGVzdCAtZiAneDExdm5jX2RlZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4MTF2bmNfZGVmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS94MTF2bmNfZGVmcy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteDExdm5jX2RlZnMuVHBvICQoREVQRElSKS94MTF2bmMteDExdm5jX2RlZnMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4MTF2bmNfZGVmcy5jJyBvYmplY3Q9J3gxMXZuYy14MTF2bmNfZGVmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteDExdm5jX2RlZnMub2JqIGBpZiB0ZXN0IC1mICd4MTF2bmNfZGVmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3gxMXZuY19kZWZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3gxMXZuY19kZWZzLmMnOyBmaWAKLQoteDExdm5jLXhkYW1hZ2UubzogeGRhbWFnZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteGRhbWFnZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMteGRhbWFnZS5UcG8gLWMgLW8geDExdm5jLXhkYW1hZ2UubyBgdGVzdCAtZiAneGRhbWFnZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4ZGFtYWdlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy14ZGFtYWdlLlRwbyAkKERFUERJUikveDExdm5jLXhkYW1hZ2UuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4ZGFtYWdlLmMnIG9iamVjdD0neDExdm5jLXhkYW1hZ2UubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14ZGFtYWdlLm8gYHRlc3QgLWYgJ3hkYW1hZ2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgeGRhbWFnZS5jCi0KLXgxMXZuYy14ZGFtYWdlLm9iajogeGRhbWFnZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteGRhbWFnZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14ZGFtYWdlLlRwbyAtYyAtbyB4MTF2bmMteGRhbWFnZS5vYmogYGlmIHRlc3QgLWYgJ3hkYW1hZ2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4ZGFtYWdlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3hkYW1hZ2UuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXhkYW1hZ2UuVHBvICQoREVQRElSKS94MTF2bmMteGRhbWFnZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3hkYW1hZ2UuYycgb2JqZWN0PSd4MTF2bmMteGRhbWFnZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteGRhbWFnZS5vYmogYGlmIHRlc3QgLWYgJ3hkYW1hZ2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4ZGFtYWdlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3hkYW1hZ2UuYyc7IGZpYAotCi14MTF2bmMteGV2ZW50cy5vOiB4ZXZlbnRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14ZXZlbnRzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14ZXZlbnRzLlRwbyAtYyAtbyB4MTF2bmMteGV2ZW50cy5vIGB0ZXN0IC1mICd4ZXZlbnRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHhldmVudHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXhldmVudHMuVHBvICQoREVQRElSKS94MTF2bmMteGV2ZW50cy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3hldmVudHMuYycgb2JqZWN0PSd4MTF2bmMteGV2ZW50cy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXhldmVudHMubyBgdGVzdCAtZiAneGV2ZW50cy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4ZXZlbnRzLmMKLQoteDExdm5jLXhldmVudHMub2JqOiB4ZXZlbnRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14ZXZlbnRzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXhldmVudHMuVHBvIC1jIC1vIHgxMXZuYy14ZXZlbnRzLm9iaiBgaWYgdGVzdCAtZiAneGV2ZW50cy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3hldmVudHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikveGV2ZW50cy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteGV2ZW50cy5UcG8gJChERVBESVIpL3gxMXZuYy14ZXZlbnRzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neGV2ZW50cy5jJyBvYmplY3Q9J3gxMXZuYy14ZXZlbnRzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14ZXZlbnRzLm9iaiBgaWYgdGVzdCAtZiAneGV2ZW50cy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3hldmVudHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikveGV2ZW50cy5jJzsgZmlgCi0KLXgxMXZuYy14aW5lcmFtYS5vOiB4aW5lcmFtYS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteGluZXJhbWEubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXhpbmVyYW1hLlRwbyAtYyAtbyB4MTF2bmMteGluZXJhbWEubyBgdGVzdCAtZiAneGluZXJhbWEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgeGluZXJhbWEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXhpbmVyYW1hLlRwbyAkKERFUERJUikveDExdm5jLXhpbmVyYW1hLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neGluZXJhbWEuYycgb2JqZWN0PSd4MTF2bmMteGluZXJhbWEubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14aW5lcmFtYS5vIGB0ZXN0IC1mICd4aW5lcmFtYS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4aW5lcmFtYS5jCi0KLXgxMXZuYy14aW5lcmFtYS5vYmo6IHhpbmVyYW1hLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14aW5lcmFtYS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14aW5lcmFtYS5UcG8gLWMgLW8geDExdm5jLXhpbmVyYW1hLm9iaiBgaWYgdGVzdCAtZiAneGluZXJhbWEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4aW5lcmFtYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS94aW5lcmFtYS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteGluZXJhbWEuVHBvICQoREVQRElSKS94MTF2bmMteGluZXJhbWEuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4aW5lcmFtYS5jJyBvYmplY3Q9J3gxMXZuYy14aW5lcmFtYS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteGluZXJhbWEub2JqIGBpZiB0ZXN0IC1mICd4aW5lcmFtYS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3hpbmVyYW1hLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3hpbmVyYW1hLmMnOyBmaWAKLQoteDExdm5jLXhrYl9iZWxsLm86IHhrYl9iZWxsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14a2JfYmVsbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMteGtiX2JlbGwuVHBvIC1jIC1vIHgxMXZuYy14a2JfYmVsbC5vIGB0ZXN0IC1mICd4a2JfYmVsbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4a2JfYmVsbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteGtiX2JlbGwuVHBvICQoREVQRElSKS94MTF2bmMteGtiX2JlbGwuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4a2JfYmVsbC5jJyBvYmplY3Q9J3gxMXZuYy14a2JfYmVsbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXhrYl9iZWxsLm8gYHRlc3QgLWYgJ3hrYl9iZWxsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHhrYl9iZWxsLmMKLQoteDExdm5jLXhrYl9iZWxsLm9iajogeGtiX2JlbGwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXhrYl9iZWxsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXhrYl9iZWxsLlRwbyAtYyAtbyB4MTF2bmMteGtiX2JlbGwub2JqIGBpZiB0ZXN0IC1mICd4a2JfYmVsbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3hrYl9iZWxsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3hrYl9iZWxsLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy14a2JfYmVsbC5UcG8gJChERVBESVIpL3gxMXZuYy14a2JfYmVsbC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3hrYl9iZWxsLmMnIG9iamVjdD0neDExdm5jLXhrYl9iZWxsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14a2JfYmVsbC5vYmogYGlmIHRlc3QgLWYgJ3hrYl9iZWxsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneGtiX2JlbGwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikveGtiX2JlbGwuYyc7IGZpYAotCi14MTF2bmMteHJhbmRyLm86IHhyYW5kci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4MTF2bmMteHJhbmRyLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14cmFuZHIuVHBvIC1jIC1vIHgxMXZuYy14cmFuZHIubyBgdGVzdCAtZiAneHJhbmRyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHhyYW5kci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteHJhbmRyLlRwbyAkKERFUERJUikveDExdm5jLXhyYW5kci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3hyYW5kci5jJyBvYmplY3Q9J3gxMXZuYy14cmFuZHIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDQGFtX19ub2RlcEApJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeDExdm5jX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHgxMXZuYy14cmFuZHIubyBgdGVzdCAtZiAneHJhbmRyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHhyYW5kci5jCi0KLXgxMXZuYy14cmFuZHIub2JqOiB4cmFuZHIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXhyYW5kci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3gxMXZuYy14cmFuZHIuVHBvIC1jIC1vIHgxMXZuYy14cmFuZHIub2JqIGBpZiB0ZXN0IC1mICd4cmFuZHIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd4cmFuZHIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikveHJhbmRyLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy14cmFuZHIuVHBvICQoREVQRElSKS94MTF2bmMteHJhbmRyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neHJhbmRyLmMnIG9iamVjdD0neDExdm5jLXhyYW5kci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteHJhbmRyLm9iaiBgaWYgdGVzdCAtZiAneHJhbmRyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneHJhbmRyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3hyYW5kci5jJzsgZmlgCi0KLXgxMXZuYy14cmVjb3JkLm86IHhyZWNvcmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXhyZWNvcmQubyAtTUQgLU1QIC1NRiAkKERFUERJUikveDExdm5jLXhyZWNvcmQuVHBvIC1jIC1vIHgxMXZuYy14cmVjb3JkLm8gYHRlc3QgLWYgJ3hyZWNvcmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgeHJlY29yZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteHJlY29yZC5UcG8gJChERVBESVIpL3gxMXZuYy14cmVjb3JkLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKXNvdXJjZT0neHJlY29yZC5jJyBvYmplY3Q9J3gxMXZuYy14cmVjb3JkLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteHJlY29yZC5vIGB0ZXN0IC1mICd4cmVjb3JkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHhyZWNvcmQuYwotCi14MTF2bmMteHJlY29yZC5vYmo6IHhyZWNvcmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXhyZWNvcmQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMteHJlY29yZC5UcG8gLWMgLW8geDExdm5jLXhyZWNvcmQub2JqIGBpZiB0ZXN0IC1mICd4cmVjb3JkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneHJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS94cmVjb3JkLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3gxMXZuYy14cmVjb3JkLlRwbyAkKERFUERJUikveDExdm5jLXhyZWNvcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4cmVjb3JkLmMnIG9iamVjdD0neDExdm5jLXhyZWNvcmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXhyZWNvcmQub2JqIGBpZiB0ZXN0IC1mICd4cmVjb3JkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneHJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS94cmVjb3JkLmMnOyBmaWAKLQoteDExdm5jLXh3cmFwcGVycy5vOiB4d3JhcHBlcnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeDExdm5jLXh3cmFwcGVycy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMteHdyYXBwZXJzLlRwbyAtYyAtbyB4MTF2bmMteHdyYXBwZXJzLm8gYHRlc3QgLWYgJ3h3cmFwcGVycy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4d3JhcHBlcnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikveDExdm5jLXh3cmFwcGVycy5UcG8gJChERVBESVIpL3gxMXZuYy14d3JhcHBlcnMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0Mpc291cmNlPSd4d3JhcHBlcnMuYycgb2JqZWN0PSd4MTF2bmMteHdyYXBwZXJzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQ0BhbV9fbm9kZXBAKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHgxMXZuY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4MTF2bmMteHdyYXBwZXJzLm8gYHRlc3QgLWYgJ3h3cmFwcGVycy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B4d3JhcHBlcnMuYwotCi14MTF2bmMteHdyYXBwZXJzLm9iajogeHdyYXBwZXJzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHgxMXZuYy14d3JhcHBlcnMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS94MTF2bmMteHdyYXBwZXJzLlRwbyAtYyAtbyB4MTF2bmMteHdyYXBwZXJzLm9iaiBgaWYgdGVzdCAtZiAneHdyYXBwZXJzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAneHdyYXBwZXJzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3h3cmFwcGVycy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS94MTF2bmMteHdyYXBwZXJzLlRwbyAkKERFUERJUikveDExdm5jLXh3cmFwcGVycy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQylzb3VyY2U9J3h3cmFwcGVycy5jJyBvYmplY3Q9J3gxMXZuYy14d3JhcHBlcnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0NAYW1fX25vZGVwQCkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4MTF2bmNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geDExdm5jLXh3cmFwcGVycy5vYmogYGlmIHRlc3QgLWYgJ3h3cmFwcGVycy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3h3cmFwcGVycy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS94d3JhcHBlcnMuYyc7IGZpYAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotaW5zdGFsbC1tYW4xOiAkKG1hbl9NQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCUBsaXN0MT0nJzsgXAotCWxpc3QyPSckKG1hbl9NQU5TKSc7IFwKLQl0ZXN0IC1uICIkKG1hbjFkaXIpIiBcCi0JICAmJiB0ZXN0IC1uICJgZWNobyAkJGxpc3QxJCRsaXN0MmAiIFwKLQkgIHx8IGV4aXQgMDsgXAotCWVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChtYW4xZGlyKSciOyBcCi0JJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuMWRpcikiIHx8IGV4aXQgMTsgXAotCXsgZm9yIGkgaW4gJCRsaXN0MTsgZG8gZWNobyAiJCRpIjsgZG9uZTsgIFwKLQlpZiB0ZXN0IC1uICIkJGxpc3QyIjsgdGhlbiBcCi0JICBmb3IgaSBpbiAkJGxpc3QyOyBkbyBlY2hvICIkJGkiOyBkb25lIFwKLQkgICAgfCBzZWQgLW4gJy9cLjFbYS16XSokJC9wJzsgXAotCWZpOyBcCi0JfSB8IHdoaWxlIHJlYWQgcDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBcCi0JZG9uZSB8IFwKLQlzZWQgLWUgJ247cywuKi8sLDtwO2g7cywuKlwuLCw7cyxeW14xXVswLTlhLXpdKiQkLDEsO3gnIFwKLQkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCcgfCBcCi0Jc2VkICdOO047cyxcbiwgLGcnIHwgeyBcCi0JbGlzdD07IHdoaWxlIHJlYWQgZmlsZSBiYXNlIGluc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkYmFzZSIgPSAiJCRpbnN0IjsgdGhlbiBsaXN0PSIkJGxpc3QgJCRmaWxlIjsgZWxzZSBcCi0JICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCciOyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IiB8fCBleGl0ICQkPzsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKLQl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCi0JICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKLQkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtYW4xZGlyKSciOyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtYW4xZGlyKSIgfHwgZXhpdCAkJD87IH07IFwKLQlkb25lOyB9Ci0KLXVuaW5zdGFsbC1tYW4xOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9Jyc7IHRlc3QgLW4gIiQobWFuMWRpcikiIHx8IGV4aXQgMDsgXAotCWZpbGVzPWB7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCBcCi0JICBzZWQgLW4gJy9cLjFbYS16XSokJC9wJzsgXAotCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjFdWzAtOWEtel0qJCQsMSw7eCcgXAotCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKLQlkaXI9JyQoREVTVERJUikkKG1hbjFkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQotaW5zdGFsbC1kZXNrdG9wREFUQTogJChkZXNrdG9wX0RBVEEpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQoZGVza3RvcF9EQVRBKSc7IHRlc3QgLW4gIiQoZGVza3RvcGRpcikiIHx8IGxpc3Q9OyBcCi0JaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCi0JICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoZGVza3RvcGRpciknIjsgXAotCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQoZGVza3RvcGRpcikiIHx8IGV4aXQgMTsgXAotCWZpOyBcCi0JZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgZWNobyAiJCRkJCRwIjsgXAotCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAotCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoZGVza3RvcGRpciknIjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKGRlc2t0b3BkaXIpIiB8fCBleGl0ICQkPzsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWRlc2t0b3BEQVRBOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQoZGVza3RvcF9EQVRBKSc7IHRlc3QgLW4gIiQoZGVza3RvcGRpcikiIHx8IGxpc3Q9OyBcCi0JZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKLQlkaXI9JyQoREVTVERJUikkKGRlc2t0b3BkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotJChSRUNVUlNJVkVfVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgotCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCi0JZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAotCSAgY2FzZSAkJGYgaW4gXAotCSAgICAqPSogfCAtLVsha10qKTs7IFwKLQkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWRvdF9zZWVuPW5vOyBcCi0JY2FzZSAiJEAiIGluIFwKLQkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKLQkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKLQllc2FjOyBcCi0JcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAotCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JcmV2PSIkJHJldiAuIjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotY3RhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAotCWRvbmUKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXNldCB4OyBcCi0JaGVyZT1gcHdkYDsgXAotCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9LjsgXAotCWVsc2UgXAotCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCi0JICBlbXB0eV9maXg9OyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKLQkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQGxpc3Q9JyQoTUFOUyknOyBpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKLQkgIGxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAotCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCi0JICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAotCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAotCSAgICBncmVwIC1sICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCB8IHNlZCAncy9eLyAgICAgICAgIC8nID4mMjsgXAotCSAgICBlY2hvICIgICAgICAgdG8gZml4IHRoZW0sIGluc3RhbGwgaGVscDJtYW4sIHJlbW92ZSBhbmQgcmVnZW5lcmF0ZSB0aGUgbWFuIHBhZ2VzOyIgPiYyOyBcCi0JICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgXGBtYWtlIG1haW50YWluZXItY2xlYW4nIHdpbGwgcmVtb3ZlIHRoZW0iID4mMjsgXAotCSAgICBleGl0IDE7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQllbHNlIDo7IGZpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCi0JICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICAkKGFtX19tYWtlX2RyeXJ1bikgXAotCSAgICAgIHx8IHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCi0JICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAotCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAotCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAotCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCi0JICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAotCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAotCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkJYW1fX3NraXBfbW9kZV9maXg9OiBcCi0JICAgICAgICBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSAkKERBVEEpCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQobWFuMWRpcikiICIkKERFU1RESVIpJChkZXNrdG9wZGlyKSI7IGRvIFwKLQkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKLQlkb25lCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktcmVjdXJzaXZlCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1yZWN1cnNpdmUKLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1yZWN1cnNpdmUKLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWRlc2t0b3BEQVRBIGluc3RhbGwtbWFuCi0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjogaW5zdGFsbC1tYW4xCi0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCi0KLWluc3RhbGwtcHMtYW06Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1yZWN1cnNpdmUKLQotcGRmLWFtOgotCi1wczogcHMtcmVjdXJzaXZlCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtZGVza3RvcERBVEEgXAotCXVuaW5zdGFsbC1tYW4KLQotdW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjEKLQotLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGN0YWdzLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCi0KLS5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAotCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAotCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZGF0YSBcCi0JaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGVza3RvcERBVEEgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjEgXAotCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCi0JaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKLQlpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCi0JdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtYmluUFJPR1JBTVMgXAotCXVuaW5zdGFsbC1kZXNrdG9wREFUQSB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1tYW4xCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEveDExdm5jL1JFQURNRSBiL3gxMXZuYy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDU3ZTYuLjAwMDAwMDAKLS0tIGEveDExdm5jL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE4MjQ2ICswLDAgQEAKLQotQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLXgxMXZuYyBSRUFETUUgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNb24gRGVjIDI3IDIwOjU4OjU3IEVTVCAyMDEwCi0KLVRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGVzZSBVUkxzOgotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9pbmRleC5odG1sCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0JLi4uCi0KLXRoZXkgY29udGFpbiB0aGUgbW9zdCB1cCB0byBkYXRlIGluZm8uCi0KLQkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2luZGV4Lmh0bWw6Ci0KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi14MTF2bmM6IGEgVk5DIHNlcnZlciBmb3IgcmVhbCBYIGRpc3BsYXlzCi0gICAgICAgICAgICAgICAgKHRvIEZBUSkgICAgKHRvIERvd25sb2FkcykgICAgKHRvIEJ1aWxkaW5nKSAgICAodG8gQmV0YSBUZXN0KQotICAodG8gRG9uYXRpb25zKSBbUGF5UGFsXSAKLQotICAgeDExdm5jIGFsbG93cyBvbmUgdG8gdmlldyByZW1vdGVseSBhbmQgaW50ZXJhY3Qgd2l0aCByZWFsIFggZGlzcGxheXMKLSAgIChpLmUuIGEgZGlzcGxheSBjb3JyZXNwb25kaW5nIHRvIGEgcGh5c2ljYWwgbW9uaXRvciwga2V5Ym9hcmQsIGFuZAotICAgbW91c2UpIHdpdGggYW55IFZOQyB2aWV3ZXIuIEluIHRoaXMgd2F5IGl0IHBsYXlzIHRoZSByb2xlIGZvciBVbml4L1gxMQotICAgdGhhdCBXaW5WTkMgcGxheXMgZm9yIFdpbmRvd3MuCi0KLSAgIEl0IGhhcyBidWlsdC1pbiBTU0wvVExTIGVuY3J5cHRpb24gYW5kIDIwNDggYml0IFJTQSBhdXRoZW50aWNhdGlvbiwKLSAgIGluY2x1ZGluZyBWZU5DcnlwdCBzdXBwb3J0OyBVTklYIGFjY291bnQgYW5kIHBhc3N3b3JkIGxvZ2luIHN1cHBvcnQ7Ci0gICBzZXJ2ZXItc2lkZSBzY2FsaW5nOyBzaW5nbGUgcG9ydCBIVFRQUy9IVFRQK1ZOQzsgWmVyb2NvbmYgc2VydmljZQotICAgYWR2ZXJ0aXNpbmc7IGFuZCBUaWdodFZOQyBhbmQgVWx0cmFWTkMgZmlsZS10cmFuc2Zlci4gSXQgaGFzIGFsc28gYmVlbgotICAgZXh0ZW5kZWQgdG8gd29yayB3aXRoIG5vbi1YIGRldmljZXM6IG5hdGl2ZWx5IG9uIE1hYyBPUyBYIEFxdWEvUXVhcnR6LAotICAgd2ViY2FtcyBhbmQgVFYgdHVuZXIgY2FwdHVyZSBkZXZpY2VzLCBhbmQgZW1iZWRkZWQgTGludXggc3lzdGVtcyBzdWNoCi0gICBhcyBRdG9waWEgQ29yZS4gRnVsbCBJUHY2IHN1cHBvcnQgaXMgcHJvdmlkZWQuIE1vcmUgZmVhdHVyZXMgYXJlCi0gICBkZXNjcmliZWQgaGVyZS4KLQotICAgSXQgYWxzbyBwcm92aWRlcyBhbiBlbmNyeXB0ZWQgVGVybWluYWwgU2VydmljZXMgbW9kZSAoLWNyZWF0ZSwgLXN2YywKLSAgIG9yIC14ZG1zdmMgb3B0aW9ucykgYmFzZWQgb24gVW5peCB1c2VybmFtZXMgYW5kIFVuaXggcGFzc3dvcmRzIHdoZXJlCi0gICB0aGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIG1lbW9yaXplIGhpcyBWTkMgZGlzcGxheS9wb3J0IG51bWJlci4KLSAgIE5vcm1hbGx5IGEgdmlydHVhbCBYIHNlc3Npb24gKFh2ZmIpIGlzIGNyZWF0ZWQgZm9yIGVhY2ggdXNlciwgYnV0IGl0Ci0gICBhbHNvIHdvcmtzIHdpdGggWCBzZXNzaW9ucyBvbiBwaHlzaWNhbCBoYXJkd2FyZS4gU2VlIHRoZSB0c3ZuYwotICAgdGVybWluYWwgc2VydmljZXMgbW9kZSBvZiB0aGUgU1NWTkMgdmlld2VyIGZvciBvbmUgd2F5IHRvIHRha2UKLSAgIGFkdmFudGFnZSBvZiB0aGlzIG1vZGUuCi0KLSAgIEkgd3JvdGUgeDExdm5jIGJhY2sgaW4gMjAwMiBiZWNhdXNlIHgwcmZic2VydmVyIHdhcyBiYXNpY2FsbHkKLSAgIGltcG9zc2libGUgdG8gYnVpbGQgb24gU29sYXJpcyBhbmQgaGFkIHBvb3IgcGVyZm9ybWFuY2UuIFRoZSBwcmltYXJ5Ci0gICB4MHJmYnNlcnZlciBidWlsZCBwcm9ibGVtcyBjZW50ZXJlZCBhcm91bmQgZXNvdGVyaWMgQysrIHRvb2xraXRzLgotICAgeDExdm5jIGlzIHdyaXR0ZW4gaW4gcGxhaW4gQyBhbmQgbmVlZHMgb25seSBzdGFuZGFyZCBsaWJyYXJpZXMgYW5kIHNvCi0gICBzaG91bGQgd29yayBvbiBuZWFybHkgYWxsIFVuaXhlcywgZXZlbiB2ZXJ5IG9sZCBvbmVzLiBJIGFsc28gY3JlYXRlZAotICAgZW5oYW5jZW1lbnRzIHRvIGltcHJvdmUgdGhlIGludGVyYWN0aXZlIHJlc3BvbnNlLCBhZGRlZCBtYW55IGZlYXR1cmVzLAotICAgYW5kIGV0Yy4KLQotICAgVGhpcyBwYWdlIGluY2x1ZGluZyB0aGUgRkFRIGNvbnRhaW5zIG11Y2ggaW5mb3JtYXRpb24gWypdOyBzb2x1dGlvbnMKLSAgIHRvIG1hbnkgcHJvYmxlbXM7IGFuZCBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbnMsIGJ1dCBuZXZlcnRoZWxlc3MKLSAgIHBsZWFzZSBmZWVsIGZyZWUgdG8gY29udGFjdCBtZSBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBvciBxdWVzdGlvbnMgKGFuZAotICAgaWYgSSBzYXZlIHlvdSB0aW1lIG9yIGV4cGVuc2UgYnkgZ2l2aW5nIHlvdSBzb21lIG9mIG15IHRpbWUsIHBsZWFzZQotICAgY29uc2lkZXIgYSBQYXlQYWwgRG9uYXRpb24uKSBEbyBjaGVjayB0aGUgRkFRIGFuZCB0aGlzIHBhZ2UgZmlyc3Q7IEkKLSAgIHJlYWxpemUgdGhlIHBhZ2VzIGFyZSBtYXNzaXZlLCBidXQgeW91IGNhbiBvZnRlbiB1c2UgeW91ciBicm93c2VyJ3MKLSAgIGZpbmQtaW4tcGFnZSBzZWFyY2ggYWN0aW9uIHVzaW5nIGEga2V5d29yZCB0byBmaW5kIHRoZSBhbnN3ZXIgdG8geW91cgotICAgcHJvYmxlbSBvciBxdWVzdGlvbi4KLQotICAgU1NWTkM6ICBBbiB4MTF2bmMgc2lkZS1wcm9qZWN0IHByb3ZpZGVzIGFuIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlcgotICAgcGFja2FnZSAoU1NWTkMpIGZvciBVbml4LCBXaW5kb3dzLCBhbmQgTWFjIE9TIFggd2l0aCBhdXRvbWF0aWMgU1NMCi0gICBhbmQvb3IgU1NIIHR1bm5lbGxpbmcgc3VwcG9ydCwgU1NMIENlcnRpZmljYXRlIGNyZWF0aW9uLCBTYXZlZAotICAgY29ubmVjdGlvbiBwcm9maWxlcywgWmVyb2NvbmYsIFZlTkNyeXB0LCBhbmQgYnVpbHQtaW4gUHJveHkgc3VwcG9ydC4KLSAgIEFkZGVkIGZlYXR1cmVzIGZvciB0aGUgVGlnaHRWTkMgVW5peCB2aWV3ZXI6IE5ld0ZCU2l6ZSwgWlJMRSBlbmNvZGluZywKLSAgIFZpZXdlci1zaWRlIFNjYWxpbmcsIGN1cnNvciBhbHBoYWJsZW5kaW5nLCBsb3cgY29sb3IgbW9kZXMsIGFuZAotICAgZW5oYW5jZWQgcG9wdXAgbWVudTsgVWx0cmFWTkMgZXh0ZW5zaW9ucyBzdXBwb3J0IGZvcjogRmlsZSBUcmFuc2ZlciwKLSAgIFRleHQgQ2hhdCwgU2luZ2xlIFdpbmRvdywgU2VydmVyIElucHV0LCBhbmQgMS9uIFNjYWxpbmcgZXh0ZW5zaW9ucywKLSAgIGFuZCBVbHRyYVZOQyBEU00gZW5jcnlwdGlvbi4gVGhlIFNTVk5DIGJ1bmRsZSBjb3VsZCBiZSBwbGFjZWQgb24sIHNheSwKLSAgIGEgVVNCIG1lbW9yeSBzdGljayBmb3IgU1NML1NTSCBWTkMgdmlld2luZyBmcm9tIG5lYXJseSBhbnkgbmV0d29ya2VkCi0gICBjb21wdXRlci4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgQW5ub3VuY2VtZW50czoKLQotICAgSW1wb3J0YW50OiBJZiB5b3UgY3JlYXRlZCBhbnkgcGVybWFuZW50IFNTTCBjZXJ0aWZpY2F0ZXMgKGUuZy4gdmlhCi0gICAieDExdm5jIC1zc2wgU0FWRSAuLi4iKSBvbiBhIERlYmlhbiBvciBVYnVudHUgc3lzdGVtIGZyb20gU2VwdC4gMjAwNgotICAgdGhyb3VnaCBNYXkgMjAwOCwgdGhlbiB0aG9zZSBrZXlzIGFyZSBsaWtlbHkgZXh0cmVtZWx5IHdlYWsgYW5kIGNhbiBiZQotICAgZWFzaWx5IGNyYWNrZWQuIFRoZSBjZXJ0aWZpY2F0ZSBmaWxlcyBzaG91bGQgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkCi0gICBvbiBhIG5vbi1EZWJpYW4gc3lzdGVtIG9yIGFuIHVwZGF0ZWQgb25lLiBTZWUKLSAgIGh0dHA6Ly93d3cuZGViaWFuLm9yZy9zZWN1cml0eS8yMDA4L2RzYS0xNTcxIGZvciBkZXRhaWxzLiBUaGUgc2FtZQotICAgYXBwbGllcyB0byBTU0gga2V5cyAobm90IHVzZWQgYnkgeDExdm5jIGRpcmVjdGx5LCBidXQgbWFueSBwZW9wbGUgdXNlCi0gICBTU0ggdHVubmVscyBmb3IgVk5DIGFjY2Vzcy4pCi0KLSAgIEZBUSBtb3ZlZDogVGhlIGh1Z2UgRkFRIGhhcyBmaW5hbGx5IGJlZW4gbW92ZWQgdG8gaXRzIG93biBwYWdlLiBJZiB5b3UKLSAgIGFyZSB0cnlpbmcgdG8gZm9sbG93IHNvbWVvbmUncyBsaW5rIHRvIGFuIEZBUSBvbmNlIG9uIHRoaXMgcGFnZSBpdCBpcwotICAgbm93IGEgYnJva2VuIGxpbmsuIFRyeSBpbnNlcnRpbmcgdGhlIHN0cmluZyAiZmFxLmh0bWwiLCBlLmcuOgotZnJvbTogICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLyNmYXEtc2luZ2xlY2xpY2sKLXRvOiAgICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc2luZ2xlY2xpY2sKLQotICAgQXBvbG9naWVzIGZvciB0aGUgaW5jb252ZW5pZW5jZSwgdW5mb3J0dW5hdGVseSBpdCBpcyBub3QgcG9zc2libGUgdG8KLSAgIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgdG8gdGhlIG5ldyBwYWdlIHNpbmNlIHRoZSAnIycgYW5jaG9yIGlzIG5vdAotICAgc2VudCB0byB0aGUgd2Vic2VydmVyLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgICBCYWNrZ3JvdW5kOgotCi0gICBWTkMgKFZpcnR1YWwgTmV0d29yayBDb21wdXRpbmcpIGlzIGEgdmVyeSB1c2VmdWwgbmV0d29yayBncmFwaGljcwotICAgcHJvdG9jb2wgKGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIG9uZSBjb21wdXRlciBidXQgZGlzcGxheWluZyB0aGVpcgotICAgd2luZG93cyBvbiBhbm90aGVyKSBpbiB0aGUgc3Bpcml0IG9mIFgsIGhvd2V2ZXIsIHVubGlrZSBYLCB0aGUKLSAgIHZpZXdpbmctZW5kIGlzIHZlcnkgc2ltcGxlIGFuZCBtYWludGFpbnMgbm8gc3RhdGUuIEl0IGlzIGEgcmVtb3RlCi0gICBmcmFtZWJ1ZmZlciAoUkZCKSBwcm90b2NvbC4KLQotICAgU29tZSBWTkMgbGlua3M6Ci0gICAgICogaHR0cDovL3d3dy5yZWFsdm5jLmNvbQotICAgICAqIGh0dHA6Ly93d3cudGlnaHR2bmMuY29tCi0gICAgICogaHR0cDovL3d3dy51bHRyYXZuYy5jb20vCi0gICAgICogaHR0cDovL3d3dy50ZXN0cGxhbnQuY29tL3Byb2R1Y3RzL3ZpbmVfc2VydmVyL09TX1gKLQotICAgRm9yIFVuaXgsIHRoZSB0cmFkaXRpb25hbCBWTkMgaW1wbGVtZW50YXRpb24gaW5jbHVkZXMgYSAidmlydHVhbCIgWDExCi0gICBzZXJ2ZXIgWHZuYyAodXN1YWxseSBsYXVuY2hlZCB2aWEgdGhlIHZuY3NlcnZlciBjb21tYW5kKSB0aGF0IGlzIG5vdAotICAgYXNzb2NpYXRlZCB3aXRoIGEgcGh5c2ljYWwgZGlzcGxheSwgYnV0IHByb3ZpZGVzIGEgImZha2UiIG9uZSBYMTEKLSAgIGNsaWVudHMgKHh0ZXJtLCBmaXJlZm94LCBldGMuKSBjYW4gYXR0YWNoIHRvLiBBIHJlbW90ZSB1c2VyIHRoZW4KLSAgIGNvbm5lY3RzIHRvIFh2bmMgdmlhIHRoZSBWTkMgY2xpZW50IHZuY3ZpZXdlciBmcm9tIGFueXdoZXJlIG9uIHRoZQotICAgbmV0d29yayB0byB2aWV3IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSB3aG9sZSB2aXJ0dWFsIFgxMSBkZXNrdG9wLgotCi0gICBUaGUgVk5DIHByb3RvY29sIGlzIGluIG1vc3QgY2FzZXMgYmV0dGVyIHN1aXRlZCBmb3IgcmVtb3RlIGNvbm5lY3Rpb25zCi0gICB3aXRoIGxvdyBiYW5kd2lkdGggYW5kIGhpZ2ggbGF0ZW5jeSB0aGFuIGlzIHRoZSBYMTEgcHJvdG9jb2wgYmVjYXVzZQotICAgaXQgaW52b2x2ZXMgZmFyIGZld2VyICJyb3VuZHRyaXBzIiAoYW4gZXhjZXB0aW9uIGlzIHRoZSBjYWNoZWQgcGl4bWFwCi0gICBkYXRhIG9uIHRoZSB2aWV3aW5nLWVuZCBwcm92aWRlZCBieSBYLikgQWxzbywgd2l0aCBubyBzdGF0ZSBtYWludGFpbmVkCi0gICB0aGUgdmlld2luZy1lbmQgY2FuIGNyYXNoLCBiZSByZWJvb3RlZCwgb3IgcmVsb2NhdGVkIGFuZCB0aGUKLSAgIGFwcGxpY2F0aW9ucyBhbmQgZGVza3RvcCBjb250aW51ZSBydW5uaW5nLiBOb3Qgc28gd2l0aCBYMTEuCi0KLSAgIFNvIHRoZSBzdGFuZGFyZCBYdm5jL3ZuY3NlcnZlciBwcm9ncmFtIGlzIHZlcnkgdXNlZnVsLCBJIHVzZSBpdCBmb3IKLSAgIHRoaW5ncyBsaWtlOgotICAgICAqIERlc2t0b3AgY29uZmVyZW5jaW5nIHdpdGggb3RoZXIgdXNlcnMgKGUuZy4gY29kZSByZXZpZXdzLikKLSAgICAgKiBMb25nIHJ1bm5pbmcgYXBwcy90YXNrcyBJIHdhbnQgdG8gYmUgYWJsZSB0byB2aWV3IGZyb20gbWFueSBwbGFjZXMKLSAgICAgICAoZS5nLiBmcm9tIGhvbWUgYW5kIHdvcmsuKQotICAgICAqIE1vdGlmLCBHTk9NRSwgYW5kIHNpbWlsYXIgYXBwbGljYXRpb25zIHRoYXQgd291bGQgeWllbGQgdmVyeSBwb29yCi0gICAgICAgcGVyZm9ybWFuY2Ugb3ZlciBhIGhpZ2ggbGF0ZW5jeSBsaW5rLgotCi0gICBIb3dldmVyLCBzb21ldGltZXMgb25lIHdhbnRzIHRvIGNvbm5lY3QgdG8gYSByZWFsIFgxMSBkaXNwbGF5IChpLmUuCi0gICBvbmUgYXR0YWNoZWQgdG8gYSBwaHlzaWNhbCBtb25pdG9yLCBrZXlib2FyZCwgYW5kIG1vdXNlOiBhIFdvcmtzdGF0aW9uCi0gICBvciBhIFN1blJheSBzZXNzaW9uKSBmcm9tIGZhciBhd2F5LiBNYXliZSB5b3Ugd2FudCB0byBjbG9zZSBkb3duIGFuCi0gICBhcHBsaWNhdGlvbiBjbGVhbmx5IHJhdGhlciB0aGFuIHVzaW5nIGtpbGwsIG9yIHdhbnQgdG8gd29yayBhIGJpdCBpbgotICAgYW4gYWxyZWFkeSBydW5uaW5nIGFwcGxpY2F0aW9uLCBvciB3b3VsZCBsaWtlIHRvIGhlbHAgYSBkaXN0YW50Ci0gICBjb2xsZWFndWUgc29sdmUgYSBwcm9ibGVtIHdpdGggdGhlaXIgZGVza3RvcCwgb3Igd291bGQganVzdCBsaWtlIHRvCi0gICB3b3JrIG91dCBvbiB0aGUgZGVjayBmb3IgYSB3aGlsZS4gVGhpcyBpcyB3aGVyZSB4MTF2bmMgaXMgdXNlZnVsLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgSG93IHRvIHVzZSB4MTF2bmM6Ci0KLSAgIEluIHRoaXMgYmFzaWMgZXhhbXBsZSBsZXQncyBhc3N1bWUgdGhlIHJlbW90ZSBtYWNoaW5lIHdpdGggdGhlIFgKLSAgIGRpc3BsYXkgeW91IHdpc2ggdG8gdmlldyBpcyAiZmFyLWF3YXkuZWFzdDowIiBhbmQgdGhlIHdvcmtzdGF0aW9uIHlvdQotICAgYXJlIHByZXNlbnRseSB3b3JraW5nIGF0IGlzICJzaXR0aW5nLWhlcmUud2VzdCIuCi0KLSAgIFN0ZXAgMC4gRG93bmxvYWQgeDExdm5jIChzZWUgYmVsb3cpIGFuZCBoYXZlIGl0IGF2YWlsYWJsZSB0byBydW4gb24KLSAgIGZhci1hd2F5LmVhc3QgKG9uIHNvbWUgbGludXggZGlzdHJvcyBpdCBpcyBhcyBlYXN5IGFzICJhcHQtZ2V0IGluc3RhbGwKLSAgIHgxMXZuYyIsICJlbWVyZ2UgeDExdm5jIiwgZXRjLikgU2ltaWxhcmx5LCBoYXZlIGEgVk5DIHZpZXdlciAoZS5nLgotICAgdm5jdmlld2VyKSByZWFkeSB0byBydW4gb24gc2l0dGluZy1oZXJlLndlc3QuIFdlIHJlY29tbWVuZCBUaWdodFZOQwotICAgVmlld2VycyAoc2VlIGFsc28gb3VyIFNTVk5DIHZpZXdlci4pCi0KLSAgIFN0ZXAgMS4gQnkgc29tZSBtZWFucyBsb2cgaW4gdG8gZmFyLWF3YXkuZWFzdCBhbmQgZ2V0IGEgY29tbWFuZCBzaGVsbAotICAgcnVubmluZyB0aGVyZS4gWW91IGNhbiB1c2Ugc3NoLCBvciBldmVuIHJsb2dpbiwgdGVsbmV0LCBvciBhbnkgb3RoZXIKLSAgIG1ldGhvZCB0byBkbyB0aGlzLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIHgxMXZuYyBwcm9jZXNzIG5lZWRzIHRvIGJlCi0gICBydW4gb24gdGhlIHNhbWUgbWFjaGluZSB0aGUgWCBzZXJ2ZXIgcHJvY2VzcyBpcyBydW5uaW5nIG9uIChvdGhlcndpc2UKLSAgIHRoaW5ncyB3b3VsZCBiZSBleHRyZW1lbHkgc2xvdy4pCi0KLSAgIFN0ZXAgMi4gSW4gdGhhdCBmYXItYXdheS5lYXN0IHNoZWxsICh3aXRoIGNvbW1hbmQgcHJvbXB0ICJmYXItYXdheT4iCi0gICBpbiB0aGlzIGV4YW1wbGUpIHJ1biB4MTF2bmMgZGlyZWN0ZWQgYXQgdGhlIGZhci1hd2F5LmVhc3QgWCBzZXNzaW9uCi0gICBkaXNwbGF5OgotCi0gIGZhci1hd2F5PiB4MTF2bmMgLWRpc3BsYXkgOjAKLQotICAgWW91IGNvdWxkIGhhdmUgYWxzbyBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERJU1BMQVk9OjAgaW5zdGVhZCBvZgotICAgdXNpbmcgIi1kaXNwbGF5IDowIi4gVGhpcyBzdGVwIGF0dGFjaGVzIHgxMXZuYyB0byB0aGUgZmFyLWF3YXkuZWFzdDowCi0gICBYIGRpc3BsYXkgKGkuZS4gbm8gdmlld2VyIGNsaWVudHMgeWV0LikKLQotICAgQ29tbW9uIEdvdGNoYTogVG8gZ2V0IFgxMSBwZXJtaXNzaW9ucyByaWdodCwgeW91IG1heSBhbHNvIG5lZWQgdG8gc2V0Ci0gICB0aGUgWEFVVEhPUklUWSBlbnZpcm9ubWVudCB2YXJpYWJsZSAob3IgdXNlIHRoZSAtYXV0aCBvcHRpb24pIHRvIHBvaW50Ci0gICB0byB0aGUgY29ycmVjdCBNSVQtTUFHSUMtQ09PS0lFIGZpbGUgKGUuZy4gL2hvbWUvam9lLy5YYXV0aG9yaXR5LikgSWYKLSAgIHgxMXZuYyBkb2VzIG5vdCBoYXZlIHRoZSBhdXRob3JpdHkgdG8gY29ubmVjdCB0byB0aGUgZGlzcGxheSBpdCBleGl0cwotICAgaW1tZWRpYXRlbHkuIE1vcmUgb24gaG93IHRvIGZpeCB0aGlzIGJlbG93LgotCi0gICBJZiB5b3Ugc3VzcGVjdCBhbiBYMTEgcGVybWlzc2lvbnMgcHJvYmxlbSBkbyB0aGlzIHNpbXBsZSB0ZXN0OiB3aGlsZQotICAgc2l0dGluZyBhdCB0aGUgcGh5c2ljYWwgWCBkaXNwbGF5IG9wZW4gYSB0ZXJtaW5hbCB3aW5kb3cKLSAgIChnbm9tZS10ZXJtaW5hbCwgeHRlcm0sIGV0Yy4pIFlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4geDExdm5jCi0gICBzdWNjZXNzZnVsbHkgaW4gdGhhdCB0ZXJtaW5hbCB3aXRob3V0IGFueSBuZWVkIGZvciBjb21tYW5kIGxpbmUKLSAgIG9wdGlvbnMuIElmIHRoYXQgd29ya3MgT0sgdGhlbiB5b3Uga25vdyBYMTEgcGVybWlzc2lvbnMgYXJlIHRoZSBvbmx5Ci0gICB0aGluZyBwcmV2ZW50aW5nIGl0IGZyb20gd29ya2luZyB3aGVuIHlvdSB0cnkgdG8gc3RhcnQgeDExdm5jIHZpYSBhCi0gICByZW1vdGUgc2hlbGwuIFRoZW4gZml4IHRoaXMgd2l0aCB0aGUgdGlwcyBiZWxvdy4KLQotICAgTm90ZSBhcyBvZiBGZWIvMjAwNyB5b3UgY2FuIGFsc28gdHJ5IHRoZSAtZmluZCBvcHRpb24gaW5zdGVhZCBvZgotICAgIi1kaXNwbGF5IC4uLiIgYW5kIHNlZSBpZiB0aGF0IGZpbmRzIHlvdXIgZGlzcGxheSBhbmQgWGF1dGhvcml0eS4gTm90ZQotICAgYXMgb2YgRGVjLzIwMDkgdGhlIC1maW5kYXV0aCBhbmQgIi1hdXRoIGd1ZXNzIiBvcHRpb25zIG1heSBiZSBoZWxwZnVsCi0gICBhcyB3ZWxsLgotICAgKEVuZCBvZiBDb21tb24gR290Y2hhKQotCi0gICBXaGVuIHgxMXZuYyBzdGFydHMgdXAgdGhlcmUgd2lsbCB0aGVuIGJlIG11Y2ggY2hhdHRlciBwcmludGVkIG91dCAodXNlCi0gICAiLXEiIHRvIHF1aWV0IGl0KSwgdW50aWwgaXQgZmluYWxseSBzYXlzIHNvbWV0aGluZyBsaWtlOgotICAuCi0gIC4KLSAgMTMvMDUvMjAwNCAxNDo1OTo1NCBBdXRvcHJvYmluZyBzZWxlY3RlZCBwb3J0IDU5MDAKLSAgMTMvMDUvMjAwNCAxNDo1OTo1NCBzY3JlZW4gc2V0dXAgZmluaXNoZWQuCi0gIDEzLzA1LzIwMDQgMTQ6NTk6NTQKLSAgMTMvMDUvMjAwNCAxNDo1OTo1NCBUaGUgVk5DIGRlc2t0b3AgaXMgZmFyLWF3YXk6MAotICBQT1JUPTU5MDAKLQotICAgd2hpY2ggbWVhbnMgYWxsIGlzIE9LLCBhbmQgd2UgYXJlIHJlYWR5IGZvciB0aGUgZmluYWwgc3RlcC4KLQotICAgU3RlcCAzLiBBdCB0aGUgcGxhY2Ugd2hlcmUgeW91IGFyZSBzaXR0aW5nIChzaXR0aW5nLWhlcmUud2VzdCBpbiB0aGlzCi0gICBleGFtcGxlKSB5b3Ugbm93IHdhbnQgdG8gcnVuIGEgVk5DIHZpZXdlciBwcm9ncmFtLiBUaGVyZSBhcmUgVk5DCi0gICB2aWV3ZXJzIGZvciBVbml4LCBXaW5kb3dzLCBNYWNPUywgSmF2YS1lbmFibGVkIHdlYiBicm93c2VycywgYW5kIGV2ZW4KLSAgIGZvciBQREEncyBsaWtlIHRoZSBQYWxtIFBpbG90IGFuZCBDZWxsIFBob25lcyEgWW91IGNhbiB1c2UgYW55IG9mIHRoZW0KLSAgIHRvIGNvbm5lY3QgdG8geDExdm5jIChzZWUgdGhlIGFib3ZlIFZOQyBsaW5rcyB1bmRlciAiQmFja2dyb3VuZDoiIG9uCi0gICBob3cgdG8gb2J0YWluIGEgdmlld2VyIGZvciB5b3VyIHBsYXRmb3JtIG9yIHNlZSB0aGlzIEZBUS4gRm9yIFNvbGFyaXMsCi0gICB2bmN2aWV3ZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBDb21wYW5pb24gQ0QgcGFja2FnZSBTRld2bmMuKQotCi0gICBJbiB0aGlzIGV4YW1wbGUgd2UnbGwgdXNlIHRoZSBVbml4IHZuY3ZpZXdlciBwcm9ncmFtIG9uIHNpdHRpbmctaGVyZQotICAgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiBhIHNlY29uZCB0ZXJtaW5hbCB3aW5kb3c6Ci0KLSAgc2l0dGluZy1oZXJlPiB2bmN2aWV3ZXIgZmFyLWF3YXkuZWFzdDowCi0KLSAgIFRoYXQgc2hvdWxkIHBvcCB1cCBhIHZpZXdlciB3aW5kb3cgb24gc2l0dGluZy1oZXJlLndlc3Qgc2hvd2luZyBhbmQKLSAgIGFsbG93aW5nIGludGVyYWN0aW9uIHdpdGggdGhlIGZhci1hd2F5LmVhc3Q6MCAgWDExIGRlc2t0b3AuIFByZXR0eQotICAgbmlmdHkhIFdoZW4gZmluaXNoZWQsIGV4aXQgdGhlIHZpZXdlcjogdGhlIHJlbW90ZSB4MTF2bmMgcHJvY2VzcyB3aWxsCi0gICBzaHV0ZG93biBhdXRvbWF0aWNhbGx5IChvciB5b3UgY2FuIHVzZSB0aGUgLWZvcmV2ZXIgb3B0aW9uIHRvIGhhdmUgaXQKLSAgIHdhaXQgZm9yIGFkZGl0aW9uYWwgdmlld2VyIGNvbm5lY3Rpb25zLikKLQotICAgQ29tbW9uIEdvdGNoYTogTm93YWRheXMgdGhlcmUgd2lsbCBsaWtlbHkgYmUgYSBob3N0LWxldmVsIGZpcmV3YWxsIG9uCi0gICB0aGUgeDExdm5jIHNpZGUgdGhhdCBpcyBibG9ja2luZyByZW1vdGUgYWNjZXNzIHRvIHRoZSBWTkMgcG9ydCAoZS5nLgotICAgNTkwMC4pIFlvdSB3aWxsIGVpdGhlciBoYXZlIHRvIG9wZW4gdXAgdGhhdCBwb3J0IChvciBhIHJhbmdlIG9mIHBvcnRzKQotICAgaW4geW91ciBmaXJld2FsbCBhZG1pbmlzdHJhdGlvbiB0b29sLCBvciB0cnkgdGhlIFNTSCB0dW5uZWxsaW5nIG1ldGhvZAotICAgYmVsb3cgKGV2ZW4gc3RpbGwgdGhlIGZpcmV3YWxsIG11c3QgYWxsb3cgaW4gdGhlIFNTSCBwb3J0LCAyMi4pCi0KLQotICAgU2hvcnRjdXQ6IE9mIGNvdXJzZSBpZiB5b3UgbGVmdCB4MTF2bmMgcnVubmluZyBvbiBmYXItYXdheS5lYXN0OjAgaW4gYQotICAgdGVybWluYWwgd2luZG93IHdpdGggdGhlIC1mb3JldmVyIG9wdGlvbiBvciBhcyBhIHNlcnZpY2UsIHlvdSdkIG9ubHkKLSAgIGhhdmUgdG8gZG8gU3RlcCAzIGFzIHlvdSBtb3ZlZCBhcm91bmQuIEJlIHN1cmUgdG8gdXNlIGEgVk5DIFBhc3N3b3JkCi0gICBvciBvdGhlciBtZWFzdXJlcyBpZiB5b3UgZG8gdGhhdC4KLQotCi0gICBTdXBlciBTaG9ydGN1dDogSGVyZSBpcyBhIHBvdGVudGlhbGx5IHZlcnkgZWFzeSB3YXkgdG8gZ2V0IGFsbCBvZiBpdAotICAgd29ya2luZy4KLSAgICAgKiBIYXZlIHgxMXZuYyAoMC45LjMgb3IgbGF0ZXIpIGF2YWlsYWJsZSB0byBydW4gb24gdGhlIHJlbW90ZSBob3N0Ci0gICAgICAgKGkuZS4gaW4gJFBBVEguKQotICAgICAqIERvd25sb2FkIGFuZCB1bnBhY2sgYSBTU1ZOQyBidW5kbGUgKDEuMC4xOSBvciBsYXRlciwgZS5nLgotICAgICAgIHNzdm5jX25vX3dpbmRvd3MtMS4wLjI4LnRhci5neikgb24gdGhlIFZpZXdlci1zaWRlIG1hY2hpbmUuCi0gICAgICogU3RhcnQgdGhlIFNTVk5DIFRlcm1pbmFsIFNlcnZpY2VzIG1vZGUgR1VJOiAuL3Nzdm5jL2Jpbi90c3ZuYwotICAgICAqIEVudGVyIHlvdXIgcmVtb3RlIHVzZXJuYW1lQGhvc3RuYW1lIChlLmcuIGZyZWRAZmFyLWF3YXkuZWFzdCkgaW4KLSAgICAgICB0aGUgIlZOQyBUZXJtaW5hbCBTZXJ2ZXIiIGVudHJ5LgotICAgICAqIENsaWNrICJDb25uZWN0Ii4KLQotICAgVGhhdCB3aWxsIGRvIGFuIFNTSCB0byB1c2VybmFtZUBob3N0bmFtZSBhbmQgc3RhcnQgdXAgeDExdm5jIGFuZCB0aGVuCi0gICBjb25uZWN0IGEgVk5DIFZpZXdlciB0aHJvdWdoIHRoZSBTU0ggZW5jcnlwdGVkIHR1bm5lbC4KLQotICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyBhc3N1bWVkIGhlcmUsIGZpcnN0IHRoYXQgeW91IGFyZSBhYmxlIHRvCi0gICBTU0ggaW50byB0aGUgcmVtb3RlIGhvc3Q7IGkuZS4gdGhhdCB5b3UgaGF2ZSBhIFVuaXggYWNjb3VudCB0aGVyZSBhbmQKLSAgIHRoZSBTU0ggc2VydmVyIGlzIHJ1bm5pbmcuIE9uIFVuaXggYW5kIE1hY09TIFggaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQotICAgc3NoIGNsaWVudCBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbiB0aGUgbG9jYWwgbWFjaGluZSAob24gV2luZG93cyBhCi0gICBwbGluayBiaW5hcnkgaXMgaW5jbHVkZWQgaW4gdGhlIFNTVk5DIGJ1bmRsZS4pIEZpbmFsbHksIGl0IGlzIGFzc3VtZWQKLSAgIHRoYXQgeW91IGFyZSBhbHJlYWR5IGxvZ2dlZCBpbnRvIGFuIFggc2Vzc2lvbiBvbiB0aGUgcmVtb3RlIG1hY2hpbmUsCi0gICBlLmcuIHlvdXIgd29ya3N0YXRpb24gKG90aGVyd2lzZSwgYSB2aXJ0dWFsIFggc2VydmVyLCBlLmcuIFh2ZmIsIHdpbGwKLSAgIGJlIHN0YXJ0ZWQgZm9yIHlvdS4pCi0KLSAgIEluIHNvbWUgY2FzZXMgdGhlIHJlbW90ZSBTU0ggc2VydmVyIHdpbGwgbm90IHJ1biBjb21tYW5kcyB3aXRoIHRoZQotICAgc2FtZSAkUEFUSCB0aGF0IHlvdSBub3JtYWxseSBoYXZlIGluIHlvdXIgc2hlbGwgdGhlcmUuIEluIHRoaXMgY2FzZQotICAgY2xpY2sgb24gT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBYMTFWTkMgT3B0aW9ucywgYW5kIHR5cGUgaW4gdGhlCi0gICBsb2NhdGlvbiBvZiB0aGUgeDExdm5jIGJpbmFyeSB1bmRlciAiRnVsbCBQYXRoIi4gKEVuZCBvZiBTdXBlcgotICAgU2hvcnRjdXQpCi0KLQotICAgRGVza3RvcCBTaGFyaW5nOiBUaGUgYWJvdmUgbW9yZSBvciBsZXNzIGFzc3VtZWQgbm9ib2R5IHdhcyBzaXR0aW5nIGF0Ci0gICB0aGUgd29ya3N0YXRpb24gZGlzcGxheSAiZmFyLWF3YXkuZWFzdDowIi4gVGhpcyBpcyBvZnRlbiB0aGUgY2FzZTogYQotICAgdXNlciB3YW50cyB0byBhY2Nlc3MgaGVyIHdvcmtzdGF0aW9uIHJlbW90ZWx5LiBBbm90aGVyIHVzYWdlIHBhdHRlcm4KLSAgIGhhcyB0aGUgdXNlciBzaXR0aW5nIGF0ICJmYXItYXdheS5lYXN0OjAiIGFuZCBpbnZpdGVzIG9uZSBvciBtb3JlCi0gICBvdGhlciBwZW9wbGUgdG8gdmlldyBhbmQgaW50ZXJhY3Qgd2l0aCBoaXMgZGVza3RvcC4gUGVyaGFwcyB0aGUgdXNlcgotICAgZ2l2ZXMgYSBkZW1vIG9yIHByZXNlbnRhdGlvbiB0aGlzIHdheSAodXNpbmcgdGhlIHRlbGVwaG9uZSBmb3Igdm9jYWwKLSAgIGNvbW11bmljYXRpb24uKSBBICJSZW1vdGUgSGVscCBEZXNrIiBtb2RlIHdvdWxkIGJlIHNpbWlsYXI6IGEKLSAgIHRlY2huaWNpYW4gY29ubmVjdHMgcmVtb3RlbHkgdG8gdGhlIHVzZXIncyBkZXNrdG9wIHRvIGludGVyYWN0aXZlbHkKLSAgIHNvbHZlIGEgcHJvYmxlbSB0aGUgdXNlciBpcyBoYXZpbmcuCi0KLSAgIEZvciB0aGVzZSBjYXNlcyBpdCBzaG91bGQgYmUgb2J2aW91cyBob3cgaXQgaXMgZG9uZS4gVGhlIGFib3ZlIHN0ZXBzCi0gICB3aWxsIHdvcmssIGJ1dCBtb3JlIGVhc2lseSB0aGUgdXNlciBzaXR0aW5nIGF0IGZhci1hd2F5LmVhc3Q6MCBzaW1wbHkKLSAgIHN0YXJ0cyB1cCB4MTF2bmMgZnJvbSBhIHRlcm1pbmFsIHdpbmRvdywgYWZ0ZXIgd2hpY2ggdGhlIGd1ZXN0cyB3b3VsZAotICAgc3RhcnQgdGhlaXIgVk5DIHZpZXdlcnMuIEZvciB0aGlzIHVzYWdlIG1vZGUgdGhlICItY29ubmVjdAotICAgaG9zdDEsaG9zdDIiIG9wdGlvbiBtYXkgYmUgb2YgdXNlIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0byB0aGUKLSAgIHZuY3ZpZXdlcnMgaW4gIi1saXN0ZW4iIG1vZGUgb24gdGhlIGxpc3Qgb2YgaG9zdHMuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgICBUdW5uZWxsaW5nIHgxMXZuYyB2aWEgU1NIOgotCi0gICBUaGUgYWJvdmUgZXhhbXBsZSBoYWQgbm8gc2VjdXJpdHkgb3IgcHJpdmFjeSBhdCBhbGwuIFdoZW4gbG9nZ2luZyBpbnRvCi0gICByZW1vdGUgbWFjaGluZXMgKGNlcnRhaW5seSB3aGVuIGdvaW5nIG92ZXIgdGhlIGludGVybmV0KSBpdCBpcyBiZXN0IHRvCi0gICB1c2Ugc3NoLCBvciB1c2UgYSBWUE4gKGZvciBhIFZQTiwgVmlydHVhbCBQcml2YXRlIE5ldHdvcmssIHRoZSBhYm92ZQotICAgZXhhbXBsZSBzaG91bGQgYmUgcHJldHR5IHNhZmUuKQotCi0gICBGb3IgeDExdm5jIG9uZSBjYW4gdHVubmVsIHRoZSBWTkMgcHJvdG9jb2wgdGhyb3VnaCBhbiBlbmNyeXB0ZWQgc3NoCi0gICBjaGFubmVsLiBJdCB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKLSAgc2l0dGluZy1oZXJlPiBzc2ggLXQgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMCBmYXItYXdheS5lYXN0ICd4MTF2bmMgLWxvY2FsaG9zdAotLWRpc3BsYXkgOjAnCi0KLSAgICh5b3Ugd2lsbCBsaWtlbHkgaGF2ZSB0byBwcm92aWRlIHBhc3N3b3Jkcy9wYXNzcGhyYXNlcyB0byBsb2dpbiBmcm9tCi0gICBzaXR0aW5nLWhlcmUgaW50byB5b3VyIGZhci1hd2F5LmVhc3QgVW5peCBhY2NvdW50OyB3ZSBhc3N1bWUgeW91IGhhdmUKLSAgIGEgbG9naW4gYWNjb3VudCBvbiBmYXItYXdheS5lYXN0IGFuZCBpdCBpcyBydW5uaW5nIHRoZSBTU0ggc2VydmVyKQotCi0gICBBbmQgdGhlbiBpbiBhbm90aGVyIHRlcm1pbmFsIHdpbmRvdyBvbiBzaXR0aW5nLWhlcmUgcnVuIHRoZSBjb21tYW5kOgotICBzaXR0aW5nLWhlcmU+IHZuY3ZpZXdlciAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUiIGxvY2FsaG9zdDowCi0KLSAgIE5vdGU6IFRoZSAtZW5jb2RpbmdzIG9wdGlvbiBpcyB2ZXJ5IGltcG9ydGFudDogdm5jdmlld2VyIHdpbGwgb2Z0ZW4KLSAgIGRlZmF1bHQgdG8gInJhdyIgZW5jb2RpbmcgaWYgaXQgdGhpbmtzIHRoZSBjb25uZWN0aW9uIGlzIHRvIHRoZSBsb2NhbAotICAgbWFjaGluZSwgYW5kIHNvIHZuY3ZpZXdlciBnZXRzIHRyaWNrZWQgdGhpcyB3YXkgYnkgdGhlIHNzaAotICAgcmVkaXJlY3Rpb24uICJyYXciIGVuY29kaW5nIHdpbGwgYmUgZXh0cmVtZWx5IHNsb3cgb3ZlciBhIG5ldHdvcmtlZAotICAgbGluaywgc28geW91IG5lZWQgdG8gZm9yY2UgdGhlIGlzc3VlIHdpdGggLWVuY29kaW5ncyAiY29weXJlY3QgdGlnaHQKLSAgIC4uLiIuIE5vd2FkYXlzLCBub3QgYWxsIHZpZXdlcnMgdXNlIHRoZSAtZW5jb2RpbmdzIG9wdGlvbiwgdHJ5Ci0gICAiLVByZWZlcnJlZEVuY29kaW5nPVpSTEUiIChhbHRob3VnaCB0aGUgbmV3ZXIgdmlld2VycyBzZWVtIHRvCi0gICBhdXRvZGV0ZWN0IHdlbGwgd2hlbiB0byB1c2UgcmF3IG9yIG5vdC4pCi0KLSAgIE5vdGUgdGhhdCAieDExdm5jIC1sb2NhbGhvc3QgLi4uIiBsaW1pdHMgaW5jb21pbmcgdm5jdmlld2VyCi0gICBjb25uZWN0aW9ucyB0byBvbmx5IHRob3NlIGZyb20gdGhlIHNhbWUgbWFjaGluZS4gVGhpcyBpcyB2ZXJ5IG5hdHVyYWwKLSAgIGZvciBzc2ggdHVubmVsbGluZyAodGhlIHJlZGlyZWN0aW9uIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRoZSBzYW1lCi0gICBtYWNoaW5lLikgVXNlIG9mIGEgVk5DIHBhc3N3b3JkIGlzIGFsc28gc3Ryb25nbHkgcmVjb21tZW5kZWQuCi0KLSAgIE5vdGUgYWxzbyB0aGUgLXQgd2UgdXNlZCBhYm92ZSAoZm9yY2UgYWxsb2NhdGUgcHNldWRvdGVybWluYWwpLCBpdAotICAgYWN0dWFsbHkgc2VlbXMgdG8gaW1wcm92ZSBpbnRlcmFjdGl2ZSB0eXBpbmcgcmVzcG9uc2UgdmlhIFZOQyEKLQotICAgWW91IG1heSB3YW50IHRvIGFkZCB0aGUgLUMgb3B0aW9uIHRvIHNzaCB0byBlbmFibGUgY29tcHJlc3Npb24uIFRoZQotICAgVk5DIGNvbXByZXNzaW9uIGlzIG5vdCBwZXJmZWN0LCBhbmQgc28gdGhpcyBtYXkgaGVscCBhIGJpdC4gSG93ZXZlciwKLSAgIG92ZXIgYSBmYXN0IExBTiB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBlbmFibGUgU1NIIGNvbXByZXNzaW9uCi0gICBiZWNhdXNlIGl0IGNhbiBzbG93IHRoaW5ncyBkb3duLiBUcnkgYm90aCBhbmQgc2VlIHdoaWNoIGlzIGZhc3Rlci4KLQotICAgSWYgeW91ciB1c2VybmFtZSBpcyBkaWZmZXJlbnQgb24gdGhlIHJlbW90ZSBtYWNoaW5lIHVzZSBzb21ldGhpbmcKLSAgIGxpa2U6ICJmcmVkQGZhci1hd2F5LmVhc3QiIGluIHRoZSBhYm92ZSBzc2ggY29tbWFuZCBsaW5lLgotCi0gICBTb21lIFZOQyB2aWV3ZXJzIHdpbGwgZG8gdGhlIHNzaCB0dW5uZWxsaW5nIGZvciB5b3UgYXV0b21hdGljYWxseSwgdGhlCi0gICBUaWdodFZOQyBVbml4IHZuY3ZpZXdlciBkb2VzIHRoaXMgd2hlbiB0aGUgIi12aWEgZmFyLWF3YXkuZWFzdCIgb3B0aW9uCi0gICBpcyBzdXBwbGllZCB0byBpdCAodGhpcyByZXF1aXJlcyB4MTF2bmMgdG8gYmUgYWxyZWFkeSBydW5uaW5nIG9uCi0gICBmYXItYXdheS5lYXN0IG9yIGhhdmluZyBpdCBzdGFydGVkIGJ5IGluZXRkKDgpLikgU2VlIHRoZSAzcmQgc2NyaXB0Ci0gICBleGFtcGxlIGJlbG93IGZvciBtb3JlIGluZm8uCi0KLSAgIFNTVk5DOiAgWW91IG1heSBhbHNvIHdhbnQgdG8gbG9vayBhdCB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyCi0gICAoc3N2bmMpIGJ1bmRsZXMgYmVjYXVzZSB0aGV5IGNvbnRhaW4gc2NyaXB0cyBhbmQgR1VJcyB0byBhdXRvbWF0aWNhbGx5Ci0gICBzZXQgdXAgU1NIIHR1bm5lbHMgKGUuZy4gdGhlIEdVSSwgInNzdm5jIiwgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGFuZAotICAgc28gZG9lcyB0aGlzIGNvbW1hbmQ6ICJzc3ZuY19jbWQgLXNzaCB1c2VyQGZhci1hd2F5LmVhc3Q6MCIpIGFuZCBjYW4KLSAgIGV2ZW4gc3RhcnQgdXAgeDExdm5jIGFzIHdlbGwuCi0KLSAgIFRoZSBUZXJtaW5hbCBTZXJ2aWNlcyBtb2RlIG9mIFNTVk5DIGlzIHBlcmhhcHMgdGhlIGVhc2llc3Qgd2F5IHRvIHVzZQotICAgeDExdm5jLiBZb3UganVzdCBuZWVkIHRvIGhhdmUgeDExdm5jIGF2YWlsYWJsZSBpbiAkUEFUSCBvbiB0aGUgcmVtb3RlCi0gICBzaWRlIChhbmQgY2FuIFNTSCB0byB0aGUgaG9zdCksIGFuZCB0aGVuIG9uIHRoZSB2aWV3ZXItc2lkZSB5b3UgdHlwZQotICAgc29tZXRoaW5nIGxpa2U6Ci0gIHRzdm5jIGZyZWRAZmFyLWF3YXkuZWFzdAotCi0gICBldmVyeXRoaW5nIGVsc2UgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGZvciB5b3UuIE5vcm1hbGx5IHRoaXMgd2lsbAotICAgc3RhcnQgYSB2aXJ0dWFsIFRlcm1pbmFsIFNlcnZpY2VzIFggc2Vzc2lvbiAoUkFNLW9ubHkpLCBidXQgaWYgeW91Ci0gICBhbHJlYWR5IGhhdmUgYSByZWFsIFggc2Vzc2lvbiB1cCBvbiB0aGUgcGh5c2ljYWwgaGFyZHdhcmUgaXQgd2lsbCBmaW5kCi0gICB0aGF0IG9uZSBmb3IgeW91LgotCi0gICBHYXRld2F5czogIElmIHRoZSBtYWNoaW5lIHlvdSBTU0ggaW50byBpcyBub3QgdGhlIHNhbWUgbWFjaGluZSB3aXRoCi0gICB0aGUgWCBkaXNwbGF5IHlvdSB3aXNoIHRvIHZpZXcgKGUuZy4geW91ciBjb21wYW55IHByb3ZpZGVzIGluY29taW5nCi0gICBTU0ggYWNjZXNzIHRvIGEgZ2F0ZXdheSBtYWNoaW5lKSwgdGhlbiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGFib3ZlCi0gICB0bywgZS5nLjogIi1MIDU5MDA6T3RoZXJIb3N0OjU5MDAiOgotICBzaXR0aW5nLWhlcmU+IHNzaCAtdCAtTCA1OTAwOk90aGVySG9zdDo1OTAwIGdhdGV3YXkuZWFzdAotCi0gICBXaGVyZSBnYXRld2F5LmVhc3QgaXMgdGhlIGludGVybmV0IGhvc3RuYW1lIChvciBJUCkgb2YgdGhlIGdhdGV3YXkKLSAgIG1hY2hpbmUgKFNTSCBzZXJ2ZXIuKSAnT3RoZXJIb3N0JyBtaWdodCBiZSwgZS5nLiwgZnJlZHMtcGMgb3IKLSAgIDE5Mi4xNjguMi4zMyAoaXQgaXMgT0sgZm9yIHRoZXNlIHRvIGJlIHByaXZhdGUgaG9zdG5hbWVzIG9yIHByaXZhdGUgSVAKLSAgIGFkZHJlc3NlcywgdGhlIGhvc3QgaW4gLUwgaXMgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgc2lkZS4pCi0KLSAgIE9uY2UgbG9nZ2VkIGluLCB5b3UnbGwgbmVlZCB0byBkbyBhIHNlY29uZCBsb2dpbiAoc3NoLCByc2gsIGV0Yy4pIHRvCi0gICB0aGUgd29ya3N0YXRpb24gbWFjaGluZSAnT3RoZXJIb3N0JyBhbmQgdGhlbiBzdGFydCB1cCB4MTF2bmMgb24gaXQgKGlmCi0gICBpdCBpc24ndCBhbHJlYWR5IHJ1bm5pbmcuKSAoVGhlICItY29ubmVjdCBnYXRld2F5OjU5eHgiIG9wdGlvbiBtYXkgYmUKLSAgIGFub3RoZXIgYWx0ZXJuYXRpdmUgaGVyZSB3aXRoIHRoZSB2aWV3ZXIgYWxyZWFkeSBpbiAtbGlzdGVuIG1vZGUuKSBGb3IKLSAgIGFuIGF1dG9tYXRpYyB3YXkgdG8gdXNlIGEgZ2F0ZXdheSBhbmQgaGF2ZSBhbGwgdGhlIG5ldHdvcmsgdHJhZmZpYwotICAgZW5jcnlwdGVkIChpbmNsdWRpbmcgaW5zaWRlIHRoZSBmaXJld2FsbCkgc2VlIENoYWluaW5nIFNTSCdzLgotCi0gICBUaGVzZSBnYXRld2F5IGFjY2VzcyBtb2RlcyBhbHNvIGNhbiBiZSBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB2aWEKLSAgIHRoZSAiUHJveHkvR2F0ZXdheSIgc2V0dGluZyBpbiBTU1ZOQyAoaW5jbHVkaW5nIHRoZSBDaGFpbmluZyBTU0gncwotICAgY2FzZSwgIkRvdWJsZSBQcm94eSIuKQotCi0gICBGaXJld2FsbHMvUm91dGVyczoKLQotICAgQSBsb3Qgb2YgcGVvcGxlIGhhdmUgaW5leHBlbnNpdmUgZGV2aWNlcyBmb3IgaG9tZSBvciBvZmZpY2UgdGhhdCBhY3QKLSAgIGFzIGEgRmlyZXdhbGwgYW5kIFJvdXRlciB0byB0aGUgbWFjaGluZXMgaW5zaWRlIG9uIGEgcHJpdmF0ZSBMQU4uIE9uZQotICAgY2FuIHVzdWFsbHkgY29uZmlndXJlIHRoZSBGaXJld2FsbC9Sb3V0ZXIgZnJvbSBpbnNpZGUgdGhlIExBTiB2aWEgYQotICAgd2ViIGJyb3dzZXIuCi0KLSAgIE9mdGVuIGhhdmluZyBhIEZpcmV3YWxsL1JvdXRlciBzaXR0aW5nIGJldHdlZW4gdGhlIHZuY3ZpZXdlciBhbmQKLSAgIHgxMXZuYyB3aWxsIG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIHZpZXdlciB0byBjb25uZWN0IHRvIHgxMXZuYy4KLQotICAgT25lIHRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgaXMgdG8gcmVkaXJlY3QgYSBwb3J0IG9uIHRoZQotICAgRmlyZXdhbGwvUm91dGVyIHRvLCBzYXksIHRoZSBTU0ggcG9ydCAoMjIpIG9uIGFuIGluc2lkZSBtYWNoaW5lIChob3cKLSAgIHRvIGRvIHRoaXMgZGVwZW5kcyBvbiB5b3VyIHBhcnRpY3VsYXIgRmlyZXdhbGwvUm91dGVyLCBvZnRlbiB0aGUKLSAgIHJvdXRlciBjb25maWcgVVJMIGlzIGh0dHA6Ly8xOTIuMTY4LjEwMC4xIFNlZSB3d3cucG9ydGZvcndhcmQuY29tIGZvcgotICAgbW9yZSBpbmZvLikgVGhpcyB3YXkgeW91IHJlYWNoIHRoZXNlIGNvbXB1dGVycyBmcm9tIGFueXdoZXJlIG9uIHRoZQotICAgSW50ZXJuZXQgYW5kIHVzZSB4MTF2bmMgdG8gdmlldyBYIHNlc3Npb25zIHJ1bm5pbmcgb24gdGhlbS4KLQotICAgU3VwcG9zZSB5b3UgY29uZmlndXJlZCB0aGUgRmlyZXdhbGwvUm91dGVyIHRvIHJlZGlyZWN0IHRoZXNlIHBvcnRzIHRvCi0gICB0d28gaW50ZXJuYWwgbWFjaGluZXM6Ci0gIFBvcnQgMTIzMDAgLT4gMTkyLjE2OC4xLjMsIFBvcnQgMjIgKFNTSCkKLSAgUG9ydCAxMjMwMSAtPiAxOTIuMTY4LjEuNCwgUG9ydCAyMiAoU1NIKQotCi0gICAod2hlcmUgMTkyLjE2OC4xLjMgaXMgImppbGxzLXBjIiBhbmQgMTkyLjE2OC4xLjQgaXMgImZyZWRzLXBjIi4pIFRoZW4KLSAgIHRoZSBzc2gncyB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgotICBzaXR0aW5nLWhlcmU+IHNzaCAtdCAtcCAxMjMwMCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwIGppbGxAZmFyLWF3YXkuZWFzdCAneDExdgotbmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKLSAgc2l0dGluZy1oZXJlPiBzc2ggLXQgLXAgMTIzMDEgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMCBmcmVkQGZhci1hd2F5LmVhc3QgJ3gxMXYKLW5jIC1sb2NhbGhvc3QgLWRpc3BsYXkgOjAnCi0KLSAgIFdoZXJlIGZhci1hd2F5LmVhc3QgbWVhbnMgdGhlIGhvc3RuYW1lIChvciBJUCkgdGhhdCB0aGUKLSAgIFJvdXRlci9GaXJld2FsbCBpcyB1c2luZyAoZm9yIGhvbWUgc2V0dXBzIHRoaXMgaXMgdXN1YWxseSB0aGUgSVAKLSAgIGdvdHRlbiBmcm9tIHlvdXIgSVNQIHZpYSBESENQLCB0aGUgc2l0ZSBodHRwOi8vd3d3LndoYXRpc215aXAuY29tLyBpcwotICAgYSBjb252ZW5pZW50IHdheSB0byBkZXRlcm1pbmUgd2hhdCBpdCBpcy4pCi0KLSAgIEl0IGlzIGEgZ29vZCBpZGVhIHRvIGFkZCBzb21lIG9ic2N1cml0eSB0byBhY2Nlc3NpbmcgeW91ciBzeXN0ZW0gdmlhCi0gICBTU0ggYnkgdXNpbmcgc29tZSBoaWdoIHJhbmRvbSBwb3J0IChlLmcuIDEyMzAwIGluIHRoZSBhYm92ZSBleGFtcGxlLikKLSAgIElmIHlvdSBjYW4ndCByZW1lbWJlciBpdCwgb3IgYXJlIG90aGVyd2lzZSBub3Qgd29ycmllZCBhYm91dCBwb3J0Ci0gICBzY2FubmVycyBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mIHlvdXIgU1NIIHNlcnZlciBhbmQgdGhlcmUgaXMganVzdAotICAgb25lIGludGVybmFsIFBDIGludm9sdmVkIHlvdSBjb3VsZCBtYXAgMjI6Ci0gIFBvcnQgMjIgLT4gMTkyLjE2OC4xLjMsIFBvcnQgMjIgKFNTSCkKLQotICAgQWdhaW4sIHRoaXMgU1NIIGdhdGV3YXkgYWNjZXNzIGNhbiBiZSBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB2aWEKLSAgIHRoZSAiUHJveHkvR2F0ZXdheSIgc2V0dGluZyBpbiBTU1ZOQy4gQW5kIHVuZGVyIHRoZSAiUmVtb3RlIFNTSAotICAgQ29tbWFuZCIgc2V0dGluZyB5b3UgY2FuIGVudGVyIHRoZSB4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MC4KLQotICAgSG9zdC1MZXZlbC1GaXJld2FsbHM6IGV2ZW4gd2l0aCB0aGUgaGFyZHdhcmUgRmlyZXdhbGwvUm91dGVyIHByb2JsZW0KLSAgIHNvbHZlZCB2aWEgYSBwb3J0IHJlZGlyZWN0aW9uLCBtb3N0IFBDIHN5c3RlbXMgaGF2ZSB0aGVpciBvd24gSG9zdAotICAgbGV2ZWwgImZpcmV3YWxscyIgZW5hYmxlZCB0byBwcm90ZWN0IHVzZXJzIGZyb20gdGhlbXNlbHZlcy4gSS5lLiB0aGUKLSAgIHN5c3RlbSBpdHNlbGYgYmxvY2tzIGFsbCBpbmNvbWluZyBjb25uZWN0aW9ucy4gU28geW91IHdpbGwgbmVlZCB0byBzZWUKLSAgIHdoYXQgaXMgbmVlZGVkIHRvIGNvbmZpZ3VyZSBpdCB0byBhbGxvdyBpbiB0aGUgcG9ydCAoZS5nLiAyMikgdGhhdCB5b3UKLSAgIGRlc2lyZS4gRS5nLiBZYXN0LCBGaXJlc3RhcnRlciwgaXB0YWJsZXMoMSksIGV0Yy4uCi0KLSAgIFZOQyBQb3J0cyBhbmQgRmlyZXdhbGxzOiBUaGUgYWJvdmUgZGlzY3Vzc2lvbiB3YXMgZm9yIGNvbmZpZ3VyaW5nIHRoZQotICAgRmlyZXdhbGwvUm91dGVyIHRvIGxldCBpbiBwb3J0IDIyIChTU0gpLCBidXQgdGhlIHNhbWUgdGhpbmcgY2FuIGJlCi0gICBkb25lIGZvciB0aGUgZGVmYXVsdCBWTkMgcG9ydCA1OTAwOgotICBQb3J0IDU5MDAgLT4gMTkyLjE2OC4xLjMsIFBvcnQgNTkwMCAoVk5DKQotICBQb3J0IDU5MDEgLT4gMTkyLjE2OC4xLjQsIFBvcnQgNTkwMCAoVk5DKQotCi0gICAod2hlcmUgMTkyLjE2OC4xLjMgaXMgImppbGxzLXBjIiBhbmQgMTkyLjE2OC4xLjQgaXMgImZyZWRzLXBjIi4pIFRoaXMKLSAgIGNvdWxkIGJlIHVzZWQgZm9yIG5vcm1hbCwgdW5lbmNyeXB0ZWQgY29ubmVjdGlvbnMgYW5kIGFsc28gZm9yIFNTTAotICAgZW5jcnlwdGVkIG9uZXMuCi0KLSAgIFRoZSBWTkMgZGlzcGxheXMgdG8gZW50ZXIgaW4gdGhlIFZOQyB2aWV3ZXIgd291bGQgYmUsIHNheSwKLSAgICJmYXItYXdheS5lYXN0OjAiIHRvIHJlYWNoIGppbGxzLXBjIGFuZCAiZmFyLWF3YXkuZWFzdDoxIiB0byByZWFjaAotICAgZnJlZHMtcGMuIFdlIGFzc3VtZSBhYm92ZSB0aGF0IHgxMXZuYyBpcyB1c2luZyBwb3J0IDU5MDAgKGFuZCBhbnkKLSAgIEhvc3QtTGV2ZWwtZmlyZXdhbGxzIG9uIGppbGxzLXBjIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gbGV0IHRoYXQgcG9ydAotICAgaW4uKSBVc2UgdGhlICItcmZicG9ydCIgb3B0aW9uIHRvIHRlbGwgd2hpY2ggcG9ydCB4MTF2bmMgc2hvdWxkIGxpc3RlbgotICAgb24uCi0KLSAgIEZvciBhIGhvbWUgc3lzdGVtIG9uZSBsaWtlbHkgZG9lcyBub3QgaGF2ZSBhIGhvc3RuYW1lIGFuZCB3b3VsZCBoYXZlCi0gICB0byB1c2UgdGhlIElQIGFkZHJlc3MsIHNheSwgIjI0LjU2Ljc4LjkzOjAiLiBFLmcuOgotICB2bmN2aWV3ZXIgMjQuNTYuNzguOTM6MAotCi0gICBZb3UgbWF5IHdhbnQgdG8gY2hvb3NlIGEgbW9yZSBvYnNjdXJlIHBvcnQgb24gdGhlIHJvdXRlciBzaWRlLCBlLmcuCi0gICA1OTQ0LCB0byBhdm9pZCBhIGxvdCBvZiBwb3J0IHNjYW5zIGZpbmRpbmcgeW91ciBWTkMgc2VydmVyLiBGb3IgNTk0NAotICAgeW91IHdvdWxkIHRlbGwgdGhlIHZpZXdlciB0byB1c2U6Ci0gIHZuY3ZpZXdlciAyNC41Ni43OC45Mzo0NAotCi0gICBUaGUgSVAgYWRkcmVzcyB3b3VsZCBuZWVkIHRvIGJlIGNvbW11bmljYXRlZCB0byB0aGUgcGVyc29uIHJ1bm5pbmcgdGhlCi0gICBWTkMgVmlld2VyLiBUaGUgc2l0ZSBodHRwOi8vd3d3LndoYXRpc215aXAuY29tLyBjYW4gaGVscCBoZXJlLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFNjcmlwdHMgdG8gYXV0b21hdGUgc3NoIHR1bm5lbGluZzogQXMgZGlzY3Vzc2VkIGJlbG93LCB0aGVyZSBtYXkgYmUKLSAgIHNvbWUgcHJvYmxlbXMgd2l0aCBwb3J0IDU5MDAgYmVpbmcgYXZhaWxhYmxlLiBJZiB0aGF0IGhhcHBlbnMsIHRoZQotICAgYWJvdmUgcG9ydCBhbmQgZGlzcGxheSBudW1iZXJzIG1heSBjaGFuZ2UgYSBiaXQgKGUuZy4gLT4gNTkwMSBhbmQgOjEpLgotICAgSG93ZXZlciwgaWYgeW91ICJrbm93IiBwb3J0IDU5MDAgd2lsbCBiZSBmcmVlIG9uIHRoZSBsb2NhbCBhbmQgcmVtb3RlCi0gICBtYWNoaW5lcywgeW91IGNhbiBlYXNpbHkgYXV0b21hdGUgdGhlIGFib3ZlIHR3byBzdGVwcyBieSB1c2luZyB0aGUKLSAgIHgxMXZuYyBvcHRpb24gLWJnIChmb3JrcyBpbnRvIGJhY2tncm91bmQgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUKLSAgIGRpc3BsYXkgaXMgc2V0IHVwKSBvciB1c2luZyB0aGUgLWYgb3B0aW9uIG9mIHNzaC4gU29tZSBleGFtcGxlIHNjcmlwdHMKLSAgIGFyZSBzaG93biBiZWxvdy4gRmVlbCBmcmVlIHRvIHRyeSB0aGUgc3NoIC1DIHRvIGVuYWJsZSBpdHMgY29tcHJlc3Npb24KLSAgIGFuZCBzZWUgaWYgdGhhdCBzcGVlZHMgdGhpbmdzIHVwIG5vdGljZWFibHkuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgICMxLiBBIHNpbXBsZSBleGFtcGxlIHNjcmlwdCwgYXNzdW1pbmcgbm8gcHJvYmxlbXMgd2l0aCBwb3J0IDU5MDAgYmVpbmcKLSAgIHRha2VuIG9uIHRoZSBsb2NhbCBvciByZW1vdGUgc2lkZXMsIGxvb2tzIGxpa2U6Ci0jIS9iaW4vc2gKLSMgdXNhZ2U6IHgxMXZuY19zc2ggPGhvc3Q+Ojx4ZGlzcGxheT4KLSMgIGUuZy46IHgxMXZuY19zc2ggc25vb3B5LnBlYW51dHMuY29tOjAKLSMgICh1c2VyQGhvc3Q6TiBhbHNvIHdvcmtzKQotCi1ob3N0PWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi1kaXNwPWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQyfSdgCi1pZiBbICJ4JGRpc3AiID0gIngiIF07IHRoZW4gZGlzcD0wOyBmaQotCi1jbWQ9IngxMXZuYyAtZGlzcGxheSA6JGRpc3AgLWxvY2FsaG9zdCAtcmZiYXV0aCAudm5jL3Bhc3N3ZCIKLWVuYz0iY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlIHpsaWIgY29ycmUgcnJlIHJhdyIKLQotc3NoIC1mIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgJGhvc3QgIiRjbWQiCi0KLWZvciBpIGluIDEgMiAzCi1kbwotICAgICAgICBzbGVlcCAyCi0gICAgICAgIGlmIHZuY3ZpZXdlciAtZW5jb2RpbmdzICIkZW5jIiA6MDsgdGhlbiBicmVhazsgZmkKLWRvbmUKLQotICAgU2VlIGFsc28gcngxMXZuYy5wbCBiZWxvdy4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgIzIuIEFub3RoZXIgbWV0aG9kIGlzIHRvIHN0YXJ0IHRoZSBWTkMgdmlld2VyIGluIGxpc3RlbiBtb2RlCi0gICAidm5jdmlld2VyIC1saXN0ZW4iIGFuZCBoYXZlIHgxMXZuYyBpbml0aWF0ZSBhIHJldmVyc2UgY29ubmVjdGlvbgotICAgdXNpbmcgdGhlIC1jb25uZWN0IG9wdGlvbjoKLSMhL2Jpbi9zaAotIyB1c2FnZTogeDExdm5jX3NzaCA8aG9zdD46PHhkaXNwbGF5PgotIyAgZS5nLjogeDExdm5jX3NzaCBzbm9vcHkucGVhbnV0cy5jb206MAotIyAgKHVzZXJAaG9zdDpOIGFsc28gd29ya3MpCi0KLWhvc3Q9YGVjaG8gJDEgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J2AKLWRpc3A9YGVjaG8gJDEgfCBhd2sgLUY6ICd7cHJpbnQgJDJ9J2AKLWlmIFsgIngkZGlzcCIgPSAieCIgXTsgdGhlbiBkaXNwPTA7IGZpCi0KLWNtZD0ieDExdm5jIC1kaXNwbGF5IDokZGlzcCAtbG9jYWxob3N0IC1jb25uZWN0IGxvY2FsaG9zdCIgICAjIDw9PSBub3RlIG5ldyBvcHQKLWlvbgotZW5jPSJjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3IgotCi12bmN2aWV3ZXIgLWVuY29kaW5ncyAiJGVuYyIgLWxpc3RlbiAmCi1waWQ9JCEKLXNzaCAtdCAtUiA1NTAwOmxvY2FsaG9zdDo1NTAwICRob3N0ICIkY21kIgota2lsbCAkcGlkCi0KLSAgIE5vdGUgdGhlIHVzZSBvZiB0aGUgc3NoIG9wdGlvbiAiLVIiIGluc3RlYWQgb2YgIi1MIiB0byBzZXQgdXAgYSByZW1vdGUKLSAgIHBvcnQgcmVkaXJlY3Rpb24uCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgICMzLiBBIHRoaXJkIHdheSBpcyBzcGVjaWZpYyB0byB0aGUgVGlnaHRWTkMgdm5jdmlld2VyIHNwZWNpYWwgb3B0aW9uCi0gICAtdmlhIGZvciBnYXRld2F5cy4gVGhlIG9ubHkgdHJpY2t5IHBhcnQgaXMgd2UgbmVlZCB0byBzdGFydCB1cCB4MTF2bmMKLSAgIGFuZCBnaXZlIGl0IHNvbWUgdGltZSAoNSBzZWNvbmRzIGluIHRoaXMgZXhhbXBsZSkgdG8gc3RhcnQgbGlzdGVuaW5nCi0gICBmb3IgY29ubmVjdGlvbnMgKHNvIHdlIGNhbm5vdCB1c2UgdGhlIFRpZ2h0Vk5DIGRlZmF1bHQgc2V0dGluZyBmb3IKLSAgIFZOQ19WSUFfQ01EKToKLSMhL2Jpbi9zaAotIyB1c2FnZTogeDExdm5jX3NzaCA8aG9zdD46PHhkaXNwbGF5PgotIyAgZS5nLjogeDExdm5jX3NzaCBzbm9vcHkucGVhbnV0cy5jb206MAotCi1ob3N0PWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi1kaXNwPWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQyfSdgCi1pZiBbICJ4JGRpc3AiID0gIngiIF07IHRoZW4gZGlzcD0wOyBmaQotCi1WTkNfVklBX0NNRD0ic3NoIC1mIC10IC1MICVMOiVIOiVSICVHIHgxMXZuYyAtbG9jYWxob3N0IC1yZmJwb3J0IDU5MDAgLWRpc3BsYXkKLTokZGlzcDsgc2xlZXAgNSIKLWV4cG9ydCBWTkNfVklBX0NNRAotCi12bmN2aWV3ZXIgLXZpYSAkaG9zdCBsb2NhbGhvc3Q6MCAgICAgICMgbXVzdCBiZSBUaWdodFZOQyB2bmN2aWV3ZXIuCi0KLSAgIE9mIGNvdXJzZSBpZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSB4MTF2bmMgcnVubmluZyB3YWl0aW5nIGZvcgotICAgY29ubmVjdGlvbnMgKG9yIGhhdmUgaXQgc3RhcnRlZCBvdXQgb2YgaW5ldGQoOCkpLCB5b3UgY2FuIHNpbXBseSB1c2UKLSAgIHRoZSBUaWdodFZOQyAidm5jdmlld2VyIC12aWEgZ2F0ZXdheSBob3N0OnBvcnQiIGluIGl0cyBkZWZhdWx0IG1vZGUgdG8KLSAgIHByb3ZpZGUgc2VjdXJlIHNzaCB0dW5uZWxsaW5nLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0KLQotICAgVk5DIHBhc3N3b3JkIGZpbGU6IEFsc28gbm90ZSBpbiB0aGUgIzEuIGV4YW1wbGUgc2NyaXB0IHRoYXQgdGhlIG9wdGlvbgotICAgIi1yZmJhdXRoIC52bmMvcGFzc3dkIiBwcm92aWRlcyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gYnkgcmVxdWlyaW5nIGEKLSAgIFZOQyBwYXNzd29yZCBmb3IgZXZlcnkgVk5DIHZpZXdlciB0aGF0IGNvbm5lY3RzLiBUaGUgdm5jcGFzc3dkIG9yCi0gICBzdG9yZXBhc3N3ZCBwcm9ncmFtcywgb3IgdGhlIHgxMXZuYyAtc3RvcmVwYXNzd2Qgb3B0aW9uIGNhbiBiZSB1c2VkIHRvCi0gICBjcmVhdGUgdGhlIHBhc3N3b3JkIGZpbGUuIHgxMXZuYyBhbHNvIGhhcyB0aGUgc2xpZ2h0bHkgbGVzcyBzZWN1cmUKLSAgIC1wYXNzd2RmaWxlIGFuZCAiLXBhc3N3ZCBYWFhYWCIgb3B0aW9ucyB0byBzcGVjaWZ5IHBhc3N3b3Jkcy4KLQotICAgVmVyeSBJbXBvcnRhbnQ6IEl0IGlzIHVwIHRvIFlPVSB0byB0ZWxsIHgxMXZuYyB0byB1c2UgcGFzc3dvcmQKLSAgIHByb3RlY3Rpb24gKC1yZmJhdXRoIG9yIC1wYXNzd2RmaWxlKSwgaXQgd2lsbCBOT1QgZG8gaXQgZm9yIHlvdQotICAgYXV0b21hdGljYWxseSBvciBmb3JjZSB5b3UgdG8gKHVzZSAtdXNlcHcgaWYgeW91IHdhbnQgdG8gYmUgZm9yY2VkCi0gICB0by4pIFRoZSBzYW1lIGdvZXMgZm9yIGVuY3J5cHRpbmcgdGhlIGNoYW5uZWwgYmV0d2VlbiB0aGUgdmlld2VyIGFuZAotICAgeDExdm5jOiBpdCBpcyB1cCB0byB5b3UgdG8gdXNlIHNzaCwgc3R1bm5lbCwgLXNzbCBtb2RlLCBhIFZQTiwgZXRjLgotICAgKHVzZSB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgR1VJIGlmIHlvdSB3YW50IHRvIGJlIGZvcmNlZAotICAgdG8gdXNlIFNTTCBvciBTU0guKSBGb3IgYWRkaXRpb25hbCBzYWZldHksIGFsc28gbG9vayBpbnRvIHRoZSAtYWxsb3cKLSAgIGFuZCAtbG9jYWxob3N0IG9wdGlvbnMgYW5kIGJ1aWxkaW5nIHgxMXZuYyB3aXRoIHRjcF93cmFwcGVycyBzdXBwb3J0Ci0gICB0byBsaW1pdCBob3N0IGFjY2Vzcy4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgVHVubmVsbGluZyB4MTF2bmMgdmlhIFNTTC9UTFM6Ci0KLSAgIE9uZSBjYW4gYWxzbyBlbmNyeXB0IHRoZSBWTkMgdHJhZmZpYyB1c2luZyBhbiBTU0wvVExTIHR1bm5lbCBzdWNoIGFzCi0gICBzdHVubmVsLm1pcnQubmV0IChhbHNvIHN0dW5uZWwub3JnKSBvciB1c2luZyB0aGUgYnVpbHQtaW4gKE1hci8yMDA2KQotICAgLXNzbCBvcGVuc3NsIG1vZGUuIEEgU1NMLWVuYWJsZWQgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciBpcyBhbHNvCi0gICBwcm92aWRlZCBpbiB0aGUgeDExdm5jIHBhY2thZ2UgKGFuZCBodHRwcyBjYW4gYmUgdXNlZCB0byBkb3dubG9hZCBpdC4pCi0KLSAgIEFsdGhvdWdoIG5vdCBhcyB1YmlxdWl0b3VzIGFzIHNzaCwgU1NMIHR1bm5lbGxpbmcgc3RpbGwgcHJvdmlkZXMgYQotICAgdXNlZnVsIGFsdGVybmF0aXZlLiBTZWUgdGhpcyBGQVEgb24gLXNzbCBhbmQgLXN0dW5uZWwgbW9kZXMgZm9yCi0gICBkZXRhaWxzIGFuZCBleGFtcGxlcy4KLQotICAgVGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIGJ1bmRsZXMgY29udGFpbiBzb21lIGNvbnZlbmllbnQKLSAgIHV0aWxpdGllcyB0byBhdXRvbWF0aWNhbGx5IHNldCB1cCBhbiBTU0wgdHVubmVsIGZyb20gdGhlIHZpZXdlci1zaWRlCi0gICAoaS5lLiB0byBjb25uZWN0IHRvICJ4MTF2bmMgLXNzbCAuLi4iLikgQW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzCi0gICB0b28uCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgICBEb3dubG9hZGluZyB4MTF2bmM6Ci0KLSAgIHgxMXZuYyBpcyBhIGNvbnRyaWJ1dGVkIHByb2dyYW0gdG8gdGhlIExpYlZOQ1NlcnZlciBwcm9qZWN0IGF0Ci0gICBTb3VyY2VGb3JnZS5uZXQuIEkgdXNlIGxpYnZuY3NlcnZlciBmb3IgYWxsIG9mIHRoZSBWTkMgYXNwZWN0czsgSQotICAgY291bGRuJ3QgaGF2ZSBkb25lIHdpdGhvdXQgaXQuIFRoZSBmdWxsIHNvdXJjZSBjb2RlIG1heSBiZSBmb3VuZCBhbmQKLSAgIGRvd25sb2FkZWQgKGVpdGhlciBmaWxlLXJlbGVhc2UgdGFyYmFsbCBvciBHSVQgdHJlZSkgZnJvbSB0aGUgYWJvdmUKLSAgIGxpbmsuIEFzIG9mIFNlcCAyMDEwLCB0aGUgeDExdm5jLTAuOS4xMi50YXIuZ3ogc291cmNlIHBhY2thZ2UgaXMKLSAgIHJlbGVhc2VkIChyZWNvbW1lbmRlZCBkb3dubG9hZCkuIFRoZSB4MTF2bmMgMC45LjEyIHJlbGVhc2Ugbm90ZXMuCi0KLSAgIFRoZSB4MTF2bmMgcGFja2FnZSBpcyB0aGUgc3Vic2V0IG9mIHRoZSBsaWJ2bmNzZXJ2ZXIgcGFja2FnZSBuZWVkZWQgdG8KLSAgIGJ1aWxkIHRoZSB4MTF2bmMgcHJvZ3JhbS4gQWxzbywgeW91IGNhbiBnZXQgYSBjb3B5IG9mIG15IGxhdGVzdCwKLSAgIGJsZWVkaW5nIGVkZ2UgeDExdm5jLTAuOS4xMy1kZXYudGFyLmd6IHRhcmJhbGwgdG8gYnVpbGQgdGhlIG1vc3QgdXAgdG8KLSAgIGRhdGUgb25lLgotCi0gICBQcmVjb21waWxlZCBCaW5hcmllcy9QYWNrYWdlczogIFNlZSB0aGUgRkFRIGJlbG93IGZvciBpbmZvcm1hdGlvbgotICAgYWJvdXQgd2hlcmUgeW91IG1pZ2h0IG9idGFpbiBhIHByZWNvbXBpbGVkIHgxMXZuYyBiaW5hcnkgZnJvbSAzcmQKLSAgIHBhcnRpZXMgYW5kIHNvbWUgb25lcyBJIGNyZWF0ZS4KLQotICAgVk5DIFZpZXdlcnM6ICBUbyBvYnRhaW4gVk5DIHZpZXdlcnMgZm9yIHRoZSB2aWV3aW5nIHNpZGUgKFdpbmRvd3MsIE1hYwotICAgT1MsIG9yIFVuaXgpIHRyeSB0aGVzZSBsaW5rczoKLSAgICAgKiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS9kb3dubG9hZC5odG1sCi0gICAgICogaHR0cDovL3d3dy5yZWFsdm5jLmNvbS9kb3dubG9hZC1mcmVlLmh0bWwKLSAgICAgKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2NvdHZuYy8KLSAgICAgKiBodHRwOi8vd3d3LnVsdHJhdm5jLmNvbS8KLSAgICAgKiBPdXIgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykKLQotICAgICAgIFtzc3ZuYy5naWZdCi0KLQotICAgTW9yZSB0b29sczogSGVyZSBpcyBhIHNzaC9yc2ggd3JhcHBlciBzY3JpcHQgcngxMXZuYyB0aGF0IGF0dGVtcHRzIHRvCi0gICBhdXRvbWF0aWNhbGx5IGRvIHRoZSBhYm92ZSBTdGVwcyAxLTMgZm9yIHlvdSAocHJvdmlkZWQgeW91IGhhdmUKLSAgIHNzaC9yc2ggbG9naW4gcGVybWlzc2lvbiBvbiB0aGUgbWFjaGluZSB4MTF2bmMgaXMgdG8gYmUgcnVuIG9uLikgVGhlCi0gICBhYm92ZSBleGFtcGxlIHdvdWxkIGJlOiAicngxMXZuYyBmYXItYXdheS5lYXN0OjAiIHR5cGVkIGludG8gYSBzaGVsbAotICAgb24gc2l0dGluZy1oZXJlLndlc3QuIEFsc28gaW5jbHVkZWQgaXMgYW4gZXhwZXJpbWVudGFsIHNjcmlwdAotICAgcngxMXZuYy5wbCB0aGF0IGF0dGVtcHRzIHRvIHR1bm5lbCB0aGUgdm5jIHRyYWZmaWMgdGhyb3VnaCBhbiBzc2ggcG9ydAotICAgcmVkaXJlY3Rpb24gKGFuZCBkb2VzIG5vdCBhc3N1bWUgcG9ydCA1OTAwIGlzIGZyZWUuKSBIYXZlIGEgbG9vayBhdAotICAgdGhlbSB0byBzZWUgd2hhdCB0aGV5IGRvIGFuZCBjdXN0b21pemUgYXMgbmVlZGVkOgotICAgICAqIHJ4MTF2bmMgd3JhcHBlciBzY3JpcHQKLSAgICAgKiByeDExdm5jLnBsIHdyYXBwZXIgc2NyaXB0IHRvIHR1bm5lbCB0cmFmZmljIHRocnUgc3NoCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgIEJ1aWxkaW5nIHgxMXZuYzoKLQotICAgTWFrZSBzdXJlIHlvdSBoYXZlIGFsbCB0aGUgbmVlZGVkIGJ1aWxkL2NvbXBpbGUvZGV2ZWxvcG1lbnQgcGFja2FnZXMKLSAgIGluc3RhbGxlZCAoZS5nLiBMaW51eCBkaXN0cmlidXRpb25zIGZvb2xpc2hseSBkb24ndCBpbnN0YWxsIHRoZW0gYnkKLSAgIGRlZmF1bHQuKSBTZWUgdGhpcyBidWlsZCBGQVEgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgSWYgeW91ciBPUyBoYXMgbGlianBlZy5zbyBhbmQgbGliei5zbyBpbiBzdGFuZGFyZCBsb2NhdGlvbnMgeW91IGNhbgotICAgYnVpbGQgYXMgZm9sbG93cyAoZXhhbXBsZSBnaXZlbiBmb3IgdGhlIDAuOS4xMiByZWxlYXNlIG9mIHgxMXZuYzoKLSAgIHJlcGxhY2Ugd2l0aCB0aGUgdmVyc2lvbiB5b3UgZG93bmxvYWRlZCk6Ci0odW4tdGFyIHRoZSB4MTF2bmMrbGlidm5jc2VydmVyIHRhcmJhbGwpCi0jIGd6aXAgLWRjIHgxMXZuYy0wLjkuMTIudGFyLmd6IHwgdGFyIC14dmYgLQotCi0oY2QgdG8gdGhlIHNvdXJjZSBkaXJlY3RvcnkpCi0jIGNkIHgxMXZuYy0wLjkuMTIKLQotKHJ1biBjb25maWd1cmUgYW5kIHRoZW4gcnVuIG1ha2UpCi0jIC4vY29uZmlndXJlCi0jIG1ha2UKLQotKGlmIGFsbCB3ZW50IE9LLCBjb3B5IHgxMXZuYyB0byB0aGUgZGVzaXJlZCBkZXN0aW5hdGlvbiwgZS5nLiAkSE9NRS9iaW4pCi0jIGNwIC4veDExdm5jL3gxMXZuYyAkSE9NRS9iaW4KLQotICAgT3IgZG8gbWFrZSBpbnN0YWxsLCBpdCB3aWxsIHByb2JhYmx5IGluc3RhbGwgdG8gL3Vzci9sb2NhbC9iaW4gKHJ1bgotICAgLi9jb25maWd1cmUgLS1oZWxwIGZvciBpbmZvcm1hdGlvbiBvbiBjdXN0b21pemluZyB5b3VyIGNvbmZpZ3VyYXRpb24sCi0gICBlLmcuIC0tcHJlZml4PS9teS9wbGFjZS4pIFlvdSBjYW4gbm93IHJ1biBpdCB2aWEgdHlwaW5nICJ4MTF2bmMiLAotICAgIngxMXZuYyAtaGVscCB8IG1vcmUiLCAieDExdm5jIC1mb3JldmVyIC1zaGFyZWQgLWRpc3BsYXkgOjAiLCBldGMuCi0KLQotICAgTm90ZTogQ3VycmVudGx5IGdjYyBpcyByZWNvbW1lbmRlZCB0byBidWlsZCBsaWJ2bmNzZXJ2ZXIuIEluIHNvbWUKLSAgIGNhc2VzIGl0IHdpbGwgYnVpbGQgd2l0aCBub24tZ2NjIGNvbXBpbGVycywgYnV0IHRoZSByZXN1bHRpbmcgYmluYXJ5Ci0gICBzb21ldGltZXMgZmFpbHMgdG8gcnVuIHByb3Blcmx5LiBGb3IgU29sYXJpcyBwcmUtYnVpbHQgZ2NjIGJpbmFyaWVzCi0gICBhcmUgYXQgaHR0cDovL3d3dy5zdW5mcmVld2FyZS5jb20vLiBTb21lIFNvbGFyaXMgcHJlLWJ1aWx0IHgxMXZuYwotICAgYmluYXJpZXMgYXJlIGhlcmUuCi0KLSAgIEhvd2V2ZXIsIG9uZSB1c2VyIHJlcG9ydHMgaXQgZG9lcyB3b3JrIGZpbmUgd2hlbiBidWlsdCB3aXRoIFN1biBTdHVkaW8KLSAgIDEwLCBzbyBZTU1WLiBJbiBmYWN0LCBoZXJlIGlzIGEgbGl0dGxlIGJ1aWxkIHNjcmlwdCB0byBkbyB0aGlzIG9uCi0gICBTb2xhcmlzIDEwOgotIyEvYmluL3NoCi1QQVRIPS91c3IvY2NzL2Jpbjovb3B0L1NVTldzcHJvL2JpbjokUEFUSDsgZXhwb3J0IFBBVEgKLQotQ0M9J2NjJyBcCi1DRkxBR1M9Jy14TzQnIFwKLUxERkxBR1M9Jy1ML3Vzci9zZncvbGliIC1ML3Vzci9YMTEvbGliIC1SL3Vzci9zZncvbGliIC1SL3Vzci9YMTEvbGliJyBcCi1DUFBGTEFHUz0nLUkgL3Vzci9zZncvaW5jbHVkZSAtSS91c3IvWDExL2luY2x1ZGUnIFwKLS4vY29uZmlndXJlCi0KLU1BS0U9Im1ha2UgLWUiCi1BTV9DRkxBR1M9IiIKLWV4cG9ydCBNQUtFIEFNX0NGTEFHUwotJE1BS0UKLQotICAgSW4gZ2VuZXJhbCB5b3UgY2FuIHVzZSB0aGUgIm1ha2UgLWUiIHRyaWNrIGlmIHlvdSBkb24ndCBsaWtlCi0gICBsaWJ2bmNzZXJ2ZXIncyBjaG9pY2Ugb2YgQU1fQ0ZMQUdTLiBTZWUgdGhlIGJ1aWxkIHNjcmlwdHMgYmVsb3cgZm9yCi0gICBtb3JlIGlkZWFzLiBTY3JpcHRzIHNpbWlsYXIgdG8gdGhlIGFib3ZlIGhhdmUgYmVlbiBzaG93biB0byB3b3JrIHdpdGgKLSAgIHZlbmRvciBDIGNvbXBpbGVycyBvbiBIUC1VWCAoY2NvbTogSFA5MjQ1My0wMSkgYW5kIFRydTY0IChDb21wYXEgQwotICAgVjYuNS0wMTEuKQotCi0gICBZb3UgY2FuIGZpbmQgaW5mb3JtYXRpb24gb24gTWlzYy4gQnVpbGQgcHJvYmxlbXMgaGVyZS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBCdWlsZGluZyBvbiBTb2xhcmlzLCBGcmVlQlNELCBldGM6ICAgRGVwZW5kaW5nIG9uIHlvdXIgdmVyc2lvbiBvZgotICAgU29sYXJpcyBvciBvdGhlciBVbml4IE9TIHRoZSBqcGVnIGFuZC9vciB6bGliIGxpYnJhcmllcyBtYXkgYmUgaW4KLSAgIG5vbi1zdGFuZGFyZCBwbGFjZXMgKGUuZy4gL3Vzci9sb2NhbCwgL3Vzci9zZncsIC9vcHQvc2Z3LCBldGMuKQotCi0gICBOb3RlOiBJZiBjb25maWd1cmUgY2Fubm90IGZpbmQgdGhlc2UgdHdvIGxpYnJhcmllcyB0aGVuIFRpZ2h0Vk5DIGFuZAotICAgWlJMRSBlbmNvZGluZyBzdXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQsIGFuZCB5b3UgZG9uJ3Qgd2FudCB0aGF0ISEhIFRoZQotICAgVGlnaHRWTkMgZW5jb2RpbmcgZ2l2ZXMgdmVyeSBnb29kIGNvbXByZXNzaW9uIGFuZCBwZXJmb3JtYW5jZSwgaXQgZXZlbgotICAgbWFrZXMgYSBub3RpY2VhYmxlIGRpZmZlcmVuY2Ugb3ZlciBhIGZhc3QgTEFOLgotCi0KLSAgIFNob3J0Y3V0czogT24gU29sYXJpcyAxMCB5b3UgY2FuIHBpY2sgdXAgYWxtb3N0IGV2ZXJ5dGhpbmcganVzdCBieQotICAgaW5zdXJpbmcgdGhhdCB5b3VyIFBBVEggaGFzIC91c3Ivc2Z3L2JpbiAoZm9yIGdjYykgYW5kIC91c3IvY2NzL2JpbgotICAgKGZvciBvdGhlciBidWlsZCB0b29scyksIGUuZy46Ci0gIGVudiBQQVRIPS91c3Ivc2Z3L2JpbjovdXNyL2Njcy9iaW46JFBBVEggc2ggLWMgJy4vY29uZmlndXJlOyBtYWtlJwotCi0gICAoVGhlIG9ubHkgdGhpbmcgdGhpcyBtaXNzZXMgaXMgL3Vzci9YMTEvbGliL2xpYlhyYW5kci5zby4yLCB3aGljaCBpcwotICAgZm9yIHRoZSBsaXR0bGUgdXNlZCAteHJhbmRyIG9wdGlvbiwgc2VlIHRoZSBzY3JpcHQgYmVsb3cgdG8gcGljayBpdCB1cAotICAgYXMgd2VsbC4pCi0KLQotICAgbGlianBlZyBpcyBpbmNsdWRlZCBpbiBTb2xhcmlzIDkgYW5kIGxhdGVyICgvdXNyL3Nmdy9pbmNsdWRlIGFuZAotICAgL3Vzci9zZncvbGliKSwgYW5kIHpsaWIgaW4gU29sYXJpcyA4IGFuZCBsYXRlciAoL3Vzci9pbmNsdWRlIGFuZAotICAgL3Vzci9saWIuKSBTbyBvbiBTb2xhcmlzIDkgeW91IGNhbiBwaWNrIHVwIGV2ZXJ5dGhpbmcgd2l0aCBzb21ldGhpbmcKLSAgIGxpa2UgdGhpczoKLSAgZW52IFBBVEg9L3Vzci9sb2NhbC9iaW46L3Vzci9jY3MvYmluOiRQQVRIIHNoIC1jICcuL2NvbmZpZ3VyZSAtLXdpdGgtanBlZz0vdXMKLXIvc2Z3OyBtYWtlJwotCi0gICBhc3N1bWluZyB5b3VyIGdjYyBpcyBpbiAvdXNyL2xvY2FsL2JpbiBhbmQgeDExdm5jIDAuNy4xIG9yIGxhdGVyLgotICAgVGhlc2UgYXJlIGdldHRpbmcgcHJldHR5IGxvbmcsIHNlZSB0aG9zZSBhc3NpZ25tZW50cyBzcGxpdCB1cCBpbiB0aGUKLSAgIGJ1aWxkIHNjcmlwdCBiZWxvdy4KLQotCi0gICBJZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZXNlIGxpYnJhcmllcyBhdCBhbGwgeW91IGNhbiBnZXQgdGhlCi0gICBzb3VyY2UgZm9yIHRoZSBsaWJyYXJpZXMgdG8gYnVpbGQgdGhlbTogbGlianBlZyBpcyBhdmFpbGFibGUgYXQKLSAgIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy8gYW5kIHpsaWIgYXQgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLy4KLSAgIFNlZSBhbHNvIGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tLyBmb3IgU29sYXJpcyBiaW5hcnkgcGFja2FnZXMgb2YKLSAgIHRoZXNlIGxpYnJhcmllcyBhcyB3ZWxsIGFzIGZvciBnY2MuIE5vcm1hbGx5IHRoZXkgd2lsbCBpbnN0YWxsIGludG8KLSAgIC91c3IvbG9jYWwgYnV0IHlvdSBjYW4gaW5zdGFsbCB0aGVtIGFueXdoZXJlIHdpdGggdGhlCi0gICAtLXByZWZpeD0vcGF0aC90by9hbnl3aGVyZSwgZXRjLgotCi0KLSAgIEhlcmUgaXMgYSBidWlsZCBzY3JpcHQgdGhhdCBpbmRpY2F0ZXMgb25lIHdheSB0byBwYXNzIHRoZSBsaWJyYXJ5Ci0gICBsb2NhdGlvbnMgaW5mb3JtYXRpb24gdG8gdGhlIGxpYnZuY3NlcnZlciBjb25maWd1cmF0aW9uIHZpYSB0aGUKLSAgIENQUEZMQUdTIGFuZCBMREZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTgKLTwtLS0KLSMhL2Jpbi9zaAotCi0jIEJ1aWxkIHNjcmlwdCBmb3IgU29sYXJpcywgZXRjLCB3aXRoIGdjYywgbGlianBlZyBhbmQgbGlieiBpbgotIyBub24tc3RhbmRhcmQgbG9jYXRpb25zLgotCi0jIHNldCB0byBnZXQgeW91ciBnY2MsIGV0YzoKLSMKLVBBVEg9L3BhdGgvdG8vZ2NjL2JpbjovdXNyL2Njcy9iaW46L3Vzci9zZncvYmluOiRQQVRICi0KLUpQRUc9L3BhdGgvdG8vanBlZyAgICAgICMgc2V0IHRvIG1heWJlICIvdXNyL2xvY2FsIiwgIi91c3Ivc2Z3Iiwgb3IgIi9vcHQvc2Z3IgotWkxJQj0vcGF0aC90by96bGliICAgICAgIyBzZXQgdG8gbWF5YmUgIi91c3IvbG9jYWwiLCAiL3Vzci9zZnciLCBvciAiL29wdC9zZnciCi0KLSMgQmVsb3cgd2UgYXNzdW1lIGhlYWRlcnMgaW4gJEpQRUcvaW5jbHVkZSBhbmQgJFpMSUIvaW5jbHVkZSBhbmQgdGhlCi0jIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGluICRKUEVHL2xpYiBhbmQgJFpMSUIvbGliLiAgSWYgeW91ciBzaXR1YXRpb24KLSMgaXMgZGlmZmVyZW50IGNoYW5nZSB0aGUgbG9jYXRpb25zIGluIHRoZSB0d28gbGluZXMgYmVsb3cuCi0jCi1DUFBGTEFHUz0iLUkgJEpQRUcvaW5jbHVkZSAtSSAkWkxJQi9pbmNsdWRlIgotTERGTEFHUz0iLUwkSlBFRy9saWIgLVIgJEpQRUcvbGliIC1MJFpMSUIvbGliIC1SICRaTElCL2xpYiIKLQotIyBUaGVzZSB0d28gbGluZXMgbWF5IG5vdCBiZSBuZWVkZWQgb24gbW9yZSByZWNlbnQgU29sYXJpcyByZWxlYXNlczoKLSMKLUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkgL3Vzci9vcGVud2luL2luY2x1ZGUiCi1MREZMQUdTPSIkTERGTEFHUyAtTC91c3Ivb3Blbndpbi9saWIgLVIgL3Vzci9vcGVud2luL2xpYiIKLQotIyBUaGVzZSBhcmUgZm9yIGxpYlhyYW5kci5zbyBvbiBTb2xhcmlzIDEwOgotIwotQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSAvdXNyL1gxMS9pbmNsdWRlIgotTERGTEFHUz0iJExERkxBR1MgLUwvdXNyL1gxMS9saWIgLVIgL3Vzci9YMTEvbGliIgotCi0jIEV2ZXJ5dGhpbmcgbmVlZHMgdG8gYnVpbHQgd2l0aCBfUkVFTlRSQU5UIGZvciB0aHJlYWQgc2FmZSBlcnJubzoKLSMKLUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfUkVFTlRSQU5UIgotCi1leHBvcnQgUEFUSCBDUFBGTEFHUyBMREZMQUdTCi0KLS4vY29uZmlndXJlCi1tYWtlCi0KLWxzIC1sIC4veDExdm5jL3gxMXZuYwotCi0tLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04Ci08LS0tCi0KLSAgIFRoZW4gZG8gbWFrZSBpbnN0YWxsIG9yIGNvcHkgdGhlIHgxMXZuYyBiaW5hcnkgdG8geW91ciBkZXNpcmVkCi0gICBkZXN0aW5hdGlvbi4KLQotICAgQlRXLCBUbyBydW4gYSBzaGVsbCBzY3JpcHQsIGp1c3QgY3V0LWFuZC1wYXN0ZSB0aGUgYWJvdmUgaW50byBhIGZpbGUsCi0gICBzYXkgIm15c2NyaXB0IiwgdGhlbiBtb2RpZnkgdGhlICIvcGF0aC90by8uLi4iIGl0ZW1zIHRvIGNvcnJlc3BvbmQgdG8KLSAgIHlvdXIgc3lzdGVtL2Vudmlyb25tZW50LCBhbmQgdGhlbiB0eXBlOiAic2ggbXlzY3JpcHQiIHRvIHJ1biBpdC4KLQotICAgTm90ZSB0aGF0IG9uIFNvbGFyaXMgbWFrZSBpcyAvdXNyL2Njcy9iaW4vbWFrZSwgc28gdGhhdCBpcyB3aHkgdGhlCi0gICBhYm92ZSBwdXRzIC91c3IvY2NzL2JpbiBpbiBQQVRILiBPdGhlciBpbXBvcnRhbnQgYnVpbGQgdXRpbGl0aWVzIGFyZQotICAgdGhlcmUgdG9vOiBsZCwgYXIsIGV0Yy4gQWxzbywgaXQgaXMgcHJvYmFibHkgYSBiYWQgaWRlYSB0byBoYXZlCi0gICAvdXNyL3VjYiBpbiB5b3VyIFBBVEggd2hpbGUgYnVpbGRpbmcuCi0KLSAgIFN0YXJ0aW5nIHdpdGggdGhlIDAuNy4xIHgxMXZuYyByZWxlYXNlIHRoZSAiY29uZmlndXJlIC0td2l0aC1qcGVnPURJUgotICAgLS13aXRoLXpsaWI9RElSIiBvcHRpb25zIGFyZSBoYW5keSBpZiB5b3Ugd2FudCB0byBhdm9pZCBtYWtpbmcgYQotICAgc2NyaXB0LgotCi0gICBJZiB5b3UgbmVlZCB0byBsaW5rIE9wZW5TU0wgbGlic3NsLmEgb24gU29sYXJpcyBzZWUgdGhpcyBtZXRob2QuCi0KLSAgIElmIHlvdSBuZWVkIHRvIGJ1aWxkIG9uIFNvbGFyaXMgMi41LjEgb3IgZWFybGllciBvciBvdGhlciBvbGRlciBVbml4Ci0gICBPUydzLCBzZWUgdGhpcyB3b3JrYXJvdW5kIEZBUS4KLQotCi0gICBCdWlsZGluZyBvbiBGcmVlQlNELCBPcGVuQlNELCAuLi46ICAgVGhlIGpwZWcgbGlicmFyaWVzIHNlZW0gdG8gYmUgaW4KLSAgIC91c3IvbG9jYWwgb3IgL3Vzci9wa2cgb24gdGhlc2UgT1Mncy4gWW91IHdvbid0IG5lZWQgdGhlIG9wZW53aW4gc3R1ZmYKLSAgIGluIHRoZSBhYm92ZSBzY3JpcHQgKGJ1dCB5b3UgbWF5IG5lZWQgL3Vzci9YMTFSNi8uLi4uKSBBbHNvIHN0YXJ0aW5nCi0gICB3aXRoIHRoZSAwLjcuMSB4MTF2bmMgcmVsZWFzZSwgdGhpcyB1c3VhbGx5IHdvcmtzOgotICAuL2NvbmZpZ3VyZSAtLXdpdGgtanBlZz0vdXNyL2xvY2FsCi0gIG1ha2UKLQotCi0gICBCdWlsZGluZyBvbiBIUC1VWDogICBGb3IganBlZyBhbmQgemxpYiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHRoZSBzYW1lCi0gICBzb3J0IG9mIHRoaW5nIGFzIGRlc2NyaWJlZCBhYm92ZSBmb3IgU29sYXJpcy4gWW91IHNldCBDUFBGTEFHUyBhbmQKLSAgIExERkxBR1MgdG8gZmluZCB0aGVtIChzZWUgYmVsb3cgZm9yIGFuIGV4YW1wbGUuKSBZb3UgZG8gbm90IG5lZWQgdG8gZG8KLSAgIGFueSBvZiB0aGUgYWJvdmUgL3Vzci9vcGVud2luIHN0dWZmLiBBbHNvLCBIUC1VWCBkb2VzIG5vdCBzZWVtIHRvCi0gICBzdXBwb3J0IC1SLCBzbyBnZXQgcmlkIG9mIHRoZSAtUiBpdGVtcyBpbiBMREZMQUdTLiBCZWNhdXNlIG9mIHRoaXMsIGF0Ci0gICBydW50aW1lIHlvdSBtYXkgbmVlZCB0byBzZXQgTERfTElCUkFSWV9QQVRIIG9yIFNITElCX1BBVEggdG8gaW5kaWNhdGUKLSAgIHRoZSBkaXJlY3RvcnkgcGF0aHMgc28gdGhlIGxpYnJhcmllcyBjYW4gYmUgZm91bmQuIEl0IGlzIGEgZ29vZCBpZGVhCi0gICB0byBoYXZlIHN0YXRpYyBhcmNoaXZlcywgZS5nLiBsaWJ6LmEgYW5kIGxpYmpwZWcuYSBmb3IgdGhlIG5vbnN0YW5kYXJkCi0gICBsaWJyYXJpZXMgc28gdGhhdCB0aGV5IGdldCBib2x0ZWQgaW50byB0aGUgeDExdm5jIGJpbmFyeSAoYW5kIHNvIHdvbid0Ci0gICBnZXQgImxvc3QiLikKLQotICAgSGVyZSBpcyB3aGF0IHdlIHJlY2VudGx5IGRpZCB0byBidWlsZCB4MTF2bmMgMC43LjIgb24gSFAtVVggMTEuMTEKLS4vY29uZmlndXJlIC0td2l0aC1qcGVnPSRIT01FL2hwdXgvanBlZyAtLXdpdGgtemxpYj0kSE9NRS9ocHV4L3psaWIKLW1ha2UKLQotICAgV2hlcmUgd2UgaGFkIHN0YXRpYyBhcmNoaXZlcyAobGlianBlZy5hLCBsaWJ6LmEpIG9ubHkgYW5kIGhlYWRlciBmaWxlcwotICAgaW4gdGhlICRIT01FL2hwdXgvLi4uIGRpcmVjdG9yaWVzIGFzIGRpc2N1c3NlZCBmb3IgdGhlIGJ1aWxkIHNjcmlwdC4KLQotICAgT24gSFAtVVggMTEuMjMgYW5kIDExLjMxIHdlIGhhdmUgaGFkIHByb2JsZW1zIGNvbXBpbGluZyB3aXRoIGdjYy4KLSAgICIvdXNyL2luY2x1ZGUvcnBjL2F1dGguaDo4NzogZXJyb3I6IGZpZWxkICdzeW5jYWRkcicgaGFzIGluY29tcGxldGUKLSAgIHR5cGUiLiBBcyBhIHdvcmthcm91bmQgZm9yIHgxMXZuYyAwLjkuNCBhbmQgbGF0ZXIgc2V0IHlvdXIgQ1BQRkxBR1MgdG8KLSAgIGluY2x1ZGU6Ci0gIENQUEZMQUdTPSItRElHTk9SRV9HRVRTUE5BTSIKLSAgZXhwb3J0IENQUEZMQUdTCi0KLSAgIFRoaXMgZGlzYWJsZXMgYSB2ZXJ5IHJhcmUgdXNhZ2UgbW9kZSBmb3IgLXVuaXhwd19uaXMgYnkgbm90IHRyeWluZwotICAgZ2V0c3BuYW0oMykuCi0KLSAgIFVzaW5nIEhQLVVYJ3MgQyBjb21waWxlciBvbiAxMS4yMyBhbmQgMTEuMzEgd2UgaGF2ZSBzb21lIHNldmVyZQotICAgY29tcGlsZXIgZXJyb3JzIHRoYXQgaGF2ZSBub3QgYmVlbiB3b3JrZWQgYXJvdW5kIHlldC4gSWYgeW91IG5lZWQgdG8KLSAgIGRvIHRoaXMsIGNvbnRhY3QgbWUgYW5kIEkgd2lsbCBnaXZlIHlvdSBhIGRyYXN0aWMgcmVjaXBlIHRoYXQgd2lsbAotICAgcHJvZHVjZSBhIHdvcmtpbmcgYmluYXJ5LgotCi0KLSAgIEJ1aWxkaW5nIG9uIEFJWDogICBBSVg6IG9uZSB1c2VyIGhhZCB0byBhZGQgdGhlICJYMTEuYWR0IiBwYWNrYWdlIHRvCi0gICBBSVggNC4zLjMgYW5kIDUuMiB0byBnZXQgYnVpbGQgaGVhZGVyIGZpbGVzIGxpa2UgWFNobS5oLCBldGMuIFlvdSBtYXkKLSAgIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhhdCAvdXNyL2xwcC9YMTEvaW5jbHVkZSwgZXRjIGlzIGJlaW5nIHBpY2tlZAotICAgdXAgYnkgdGhlIGNvbmZpZ3VyZSBhbmQgbWFrZS4KLQotICAgRm9yIGEgcmVjZW50IGJ1aWxkIG9uIEFJWCA1LjMgd2UgbmVlZGVkIHRvIGFkZCB0aGVzZSBDRkxBR1MgdG8gYmUgYWJsZQotICAgdG8gYnVpbGQgd2l0aCBnY2M6Ci0gIGVudiBDRkxBR1M9Jy1tYWl4NjQgLVhsaW5rZXIgLWJiaWd0b2MnIC4vY29uZmlndXJlIC4uLgotCi0gICB3ZSBhbHNvIGJ1aWx0IG91ciBvd24gbGlianBlZyBhbmQgbGlieiB1c2luZyAtbWFpeDY0LgotCi0gICBCVFcsIG9uZSB3YXkgdG8gcnVuIGFuIFh2ZmItbGlrZSB2aXJ0dWFsIFggc2VydmVyIGZvciB0ZXN0aW5nIG9uIEFJWAotICAgaXMgc29tZXRoaW5nIGxpa2UgIi91c3IvYmluL1gxMS9YIC1mb3JjZSAtdmZiIC1hYyA6MSIuCi0KLQotICAgQnVpbGRpbmcgb24gTWFjIE9TIFg6ICAgVGhlcmUgaXMgbm93IG5hdGl2ZSBNYWMgT1MgWCBzdXBwb3J0IGZvcgotICAgeDExdm5jIGJ5IHVzaW5nIHRoZSByYXcgZnJhbWVidWZmZXIgZmVhdHVyZS4gVGhpcyBtb2RlIGRvZXMgbm90IHVzZSBvcgotICAgbmVlZCBYMTEgYXQgYWxsLiBUbyBidWlsZCB5b3UgbWF5IG5lZWQgdG8gZGlzYWJsZSBYMTE6Ci0uL2NvbmZpZ3VyZSAtLXdpdGhvdXQteCAuLi4KLW1ha2UKLQotICAgSG93ZXZlciwgaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBNYWMgT1MgWCBidWlsZCBwYWNrYWdlIGZvciBYMTEgYXBwcwotICAgeW91IHdpbGwgbm90IG5lZWQgdG8gc3VwcGx5IHRoZSAiLS13aXRob3V0LXgiIG9wdGlvbiAoaW4gdGhpcyBjYXNlIHRoZQotICAgcmVzdWx0aW5nIHgxMXZuYyB3b3VsZCBiZSBhYmxlIHRvIGV4cG9ydCBib3RoIHRoZSBuYXRpdmUgTWFjIE9TIFgKLSAgIGRpc3BsYXkgYW5kIHdpbmRvd3MgZGlzcGxheWVkIGluIHRoZSBYRGFyd2luIFggc2VydmVyLikgQmUgc3VyZSB0bwotICAgaW5jbHVkZSB0aGUgLi9jb25maWd1cmUgb3B0aW9uIHRvIGZpbmQgbGlianBlZyBvbiB5b3VyIHN5c3RlbS4KLQotCi0gICBPcGVuU1NMOiAgIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAwLjguMyB4MTF2bmMgY2FuIG5vdyBiZSBidWlsdCB3aXRoCi0gICBTU0wvVExTIHN1cHBvcnQuIEZvciB0aGlzIHRvIGJlIGVuYWJsZWQgdGhlIGxpYnNzbC5zbyBsaWJyYXJ5IG5lZWRzIHRvCi0gICBiZSBhdmFpbGFibGUgYXQgYnVpbGQgdGltZS4gU28geW91IG1heSBuZWVkIHRvIGhhdmUgYWRkaXRpb25hbAotICAgQ1BQRkxBR1MgYW5kIExERkxBR1MgaXRlbXMgaWYgeW91ciBsaWJzc2wuc28gaXMgaW4gYSBub24tc3RhbmRhcmQKLSAgIHBsYWNlLiBBcyBvZiB4MTF2bmMgMC45LjQgdGhlcmUgaXMgYWxzbyB0aGUgLS13aXRoLXNzbD1ESVIgY29uZmlndXJlCi0gICBvcHRpb24uCi0KLSAgIE9uIFNvbGFyaXMgdXNpbmcgc3RhdGljIGFyY2hpdmVzIGxpYnNzbC5hIGFuZCBsaWJjcnlwdG8uYSBpbnN0ZWFkIG9mCi0gICAuc28gc2hhcmVkIGxpYnJhcmllcyAoZS5nLiBmcm9tIHd3dy5zdW5mcmVld2FyZS5jb20pLCB3ZSBmb3VuZCB3ZQotICAgbmVlZGVkIHRvIGFsc28gc2V0IExERkxBR1MgYXMgZm9sbG93cyB0byBnZXQgdGhlIGNvbmZpZ3VyZSB0byB3b3JrOgotZW52IExERkxBR1M9Jy1sc29ja2V0IC1sZGwnIC4vY29uZmlndXJlIC0td2l0aC1zc2w9L3BhdGgvdG8vb3BlbnNzbCAuLi4KLW1ha2UKLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgQmV0YSBUZXN0aW5nOgotCi0gICBJIGRvbid0IGhhdmUgYW55IGZvcm1hbCBiZXRhLXRlc3RlcnMgZm9yIHRoZSByZWxlYXNlcyBvZiB4MTF2bmMsIHNvCi0gICBJJ2QgYXBwcmVjaWF0ZSBhbnkgYWRkaXRpb25hbCB0ZXN0aW5nIHZlcnkgbXVjaC4KLQotICAgVGhhbmtzIHRvIHRob3NlIHdobyBzdWdnZXN0ZWQgZmVhdHVyZXMgYW5kIGhlbHBlZCBiZXRhIHRlc3QgeDExdm5jCi0gICAwLjkuMTIgcmVsZWFzZWQgaW4gU2VwIDIwMTAhCi0KLSAgIFBsZWFzZSBoZWxwIHRlc3QgYW5kIGRlYnVnIHRoZSAwLjkuMTMgdmVyc2lvbiBmb3IgcmVsZWFzZSBzb21ldGltZSBpbgotICAgV2ludGVyIDIwMTAuCi0KLSAgIFRoZSB2ZXJzaW9uIDAuOS4xMyBiZXRhIHRhcmJhbGwgaXMga2VwdCBoZXJlOgotICAgeDExdm5jLTAuOS4xMy1kZXYudGFyLmd6Ci0KLSAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgTGludXgsIFNvbGFyaXMsIE1hYyBPUyBYLCBhbmQgb3RoZXIgT1MgdGVzdAotICAgYmluYXJpZXMgaGVyZS4gUGxlYXNlIGtpY2sgdGhlIHRpcmVzIGFuZCByZXBvcnQgYnVncywgcGVyZm9ybWFuY2UKLSAgIHJlZ3Jlc3Npb25zLCB1bmRlc2lyZWQgYmVoYXZpb3IsIGV0Yy4gdG8gbWUuCi0KLSAgIFRvIGFpZCB0ZXN0aW5nIG9mIHRoZSBidWlsdC1pbiBTU0wvVExTIHN1cHBvcnQgZm9yIHgxMXZuYywgYSBudW1iZXIgb2YKLSAgIFZOQyBWaWV3ZXIgcGFja2FnZXMgZm9yIFVuaXgsIE1hYyBPUyBYLCBhbmQgV2luZG93cyBoYXZlIGJlZW4gY3JlYXRlZAotICAgdGhhdCBwcm92aWRlIFNTTCBTdXBwb3J0IGZvciB0aGUgVGlnaHRWTkMgVmlld2VyICh0aGlzIGlzIGRvbmUgYnkKLSAgIHdyYXBwZXIgc2NyaXB0cyBhbmQgYSBHVUkgdGhhdCBzdGFydHMgU1RVTk5FTC4pIEl0IHNob3VsZCBiZSBwcmV0dHkKLSAgIGNvbnZlbmllbnQgZm9yIGF1dG9tYXRpYyBTU0wgYW5kIFNTSCBjb25uZWN0aW9ucy4gSXQgaXMgZGVzY3JpYmVkIGluCi0gICBkZXRhaWwgYXQgYW5kIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlcgotICAgKFNTVk5DKSBwYWdlLiBUaGUgU1NWTkMgVW5peCB2aWV3ZXIgYWxzbyBzdXBwb3J0cyB4MTF2bmMncyBzeW1tZXRyaWMKLSAgIGtleSBlbmNyeXB0aW9uIGNpcGhlcnMgKHNlZSB0aGUgJ1VsdHJhVk5DIERTTSBFbmNyeXB0aW9uIFBsdWdpbicKLSAgIHNldHRpbmdzIHBhbmVsLikKLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIDAuOS4xMyByZWxlYXNlOgotICAgICAqIEltcHJvdmVkIHN1cHBvcnQgZm9yIG5vbi1YMTEgdG91Y2hzY3JlZW4gZGV2aWNlcyAoZS5nLiBoYW5kaGVsZCBvcgotICAgICAgIGNlbGwgcGhvbmUpIHZpYSBMaW51eCB1aW5wdXQgaW5wdXQgaW5qZWN0aW9uLiBBZGRpdGlvbmFsIHR1bmluZwotICAgICAgIHBhcmFtZXRlcnMgYXJlIGFkZGVkLiBUU0xJQiB0b3VjaHNjcmVlbiBjYWxpYnJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgICAgVGVzdGVkIG9uIFF0bW9rbyBOZW8gRnJlZXJ1bm5lci4gQSB0b29sLCBtaXNjL3VpbnB1dC5wbCwgaXMKLSAgICAgICBwcm92aWRlZCB0byBkaWFnbm9zZSB1aW5wdXQgYmVoYXZpb3Igb24gbmV3IGRldmljZXMuIFRoZSBlbnYuCi0gICAgICAgdmFycy4gWDExVk5DX1VJTlBVVF9CVVMgYW5kIFgxMVZOQ19VSU5QVVRfVkVSU0lPTiBhcmUgYXZhaWxhYmxlIGlmCi0gICAgICAgbGVhdmluZyB0aGVtIHVuc2V0IGRvZXMgbm90IHdvcmsuCi0gICAgICogVGhlIExpbnV4IHVpbnB1dCBub24tWDExIGlucHV0IGluamVjdGlvbiBjYW4gbm93IGJlIGJ5cGFzc2VkOgotICAgICAgIGV2ZW50cyBjYW4gYmUgZGlyZWN0bHkgd3JpdHRlbiB0byB0aGUgL2Rldi9pbnB1dC9ldmVudCBkZXZpY2VzCi0gICAgICAgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIChkaXJlY3RfYWJzPS4uLiwgZXRjLikgQSAtcGlwZWlucHV0IGlucHV0Ci0gICAgICAgaW5qZWN0aW9uIGhlbHBlciBzY3JpcHQsIG1pc2MvcXRfdHNsaWJfaW5qZWN0LnBsIGlzIHByb3ZpZGVkIGFzIGEKLSAgICAgICB0d2Vha2FibGUgbm9uLWJ1aWx0aW4gZGlyZWN0IGlucHV0IGluamVjdGlvbiBtZXRob2QuCi0gICAgICogVGhlIGxpc3Qgb2YgbmV3IHVpbnB1dCBwYXJhbWV0ZXJzIGZvciB0aGUgYWJvdmUgdHdvIGZlYXR1cmVzIGlzOgotICAgICAgIHByZXNzdXJlLCB0c2xpYl9jYWwsIHRvdWNoX2Fsd2F5cywgZHJhZ3NraXAsIGJ0bl90b3VjaDsKLSAgICAgICBkaXJlY3RfcmVsLCBkaXJlY3RfYWJzLCBkaXJlY3RfYnRuLCBkaXJlY3Rfa2V5LgotICAgICAqIFRoZSBNYWNPU1ggbmF0aXZlIHNlcnZlciBjYW4gbm93IHVzZSBPcGVuR0wgZm9yIHRoZSBzY3JlZW4KLSAgICAgICBjYXB0dXJlLiBJbiBuZWFybHkgYWxsIGNhc2VzIHRoaXMgaXMgZmFzdGVyIHRoYW4gdGhlIHJhdwotICAgICAgIGZyYW1lYnVmZmVyIGNhcHR1cmUgbWV0aG9kLiBUaGVyZSBhcmUgYnVpbGQgYW5kIHJ1biB0aW1lIGZsYWdzLAotICAgICAgIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRCwgZXRjLiB0byBkaXNhYmxlIHVzZSBvZiBkZXByZWNhdGVkCi0gICAgICAgaW5wdXQgaW5qZWN0aW9uIGFuZCBzY3JlZW4gYWNjZXNzIGludGVyZmFjZXMuIEN1cnNvciBzaGFwZSBub3cKLSAgICAgICB3b3JrcyBmb3IgNjRiaXQgYmluYXJpZXMuCi0gICAgICogVGhlIGluY2x1ZGVkIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlcnMgbm93IGhhbmRsZSBNb3VzZSBXaGVlbAotICAgICAgIGV2ZW50cy4KLSAgICAgKiBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLSAgICAgKiBJbiAtcmVmbGVjdCBtb2RlLCB0aGUgbGlidm5jY2xpZW50IGNvbm5lY3Rpb24gY2FuIG5vdyBoYXZlIHRoZQotICAgICAgIHBpeGVsIGZvcm1hdCBtb2RpZmllZCB2aWEgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgIFgxMVZOQ19SRUZMRUNUX2JpdHNQZXJTYW1wbGUsIFgxMVZOQ19SRUZMRUNUX3NhbXBsZXNQZXJQaXhlbCwgYW5kCi0gICAgICAgWDExVk5DX1JFRkxFQ1RfYnl0ZXNQZXJQaXhlbAotICAgICAqIEluIC1jcmVhdGUgbW9kZSB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWRkZWQgdG8KLSAgICAgICBmaW5lIHR1bmUgdGhlIGJlaGF2aW9yOiBGSU5EX0RJU1BMQVlfTk9fTFNPRjogZG8gbm90IHVzZSBsc29mKDEpCi0gICAgICAgdG8gdHJ5IHRvIGRldGVybWluZSB0aGUgTGludXggVlQsIEZJTkRfRElTUExBWV9OT19WVF9GSU5EOiBkbyBub3QKLSAgICAgICB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBMaW51eCBWVCBhdCBhbGwsIFgxMVZOQ19DUkVBVEVfTENfQUxMX0NfT0s6Ci0gICAgICAgZG8gbm90IGJvdGhlciB1bmRvaW5nIHRoZSBzZXR0aW5nIExDX0FMTD1DIHRoYXQgdGhlIGNyZWF0ZV9kaXNwbGF5Ci0gICAgICAgc2NyaXB0IHNldHMuIFRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgLWNyZWF0ZSBzY3JpcHQgaGFzIGJlZW4KLSAgICAgICBpbXByb3ZlZCBmb3IgbGFyZ2UgaW5zdGFsbGF0aW9ucyAoMTAwJ3Mgb2YgdXNlciBzZXNzaW9ucyBvbiBvbmUKLSAgICAgICBtYWNoaW5lLikKLSAgICAgKiBJbiAtdW5peHB3IG1vZGUsIG9uZSBjYW4gbm93IFRhYiBmcm9tIGxvZ2luOiB0byBQYXNzd29yZC4KLSAgICAgKiBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgWDExVk5DX1NCX0ZBQ1RPUiwgYWxsb3dzIG9uZSB0byBzY2FsZSB0aGUKLSAgICAgICAtc2Igc2NyZWVuYmxhbmsgc2xlZXAgdGltZSBmcm9tIHRoZSBkZWZhdWx0IDIgc2Vjcy4KLSAgICAgKiBBbiBleHBlcmltZW50YWwgb3B0aW9uIC11bml4c29jayBpcyBhdmFpbGFibGUgZm9yIHRlc3RpbmcuIE5vdGUsCi0gICAgICAgaG93ZXZlciwgdGhhdCBpdCByZXF1aXJlcyBhIG1hbnVhbCBjaGFuZ2UgdG8KLSAgICAgICBsaWJ2bmNzZXJ2ZXIvcmZic2VydmVyLmMgZm9yIGl0IHRvIHdvcmsuCi0gICAgICogRG9jdW1lbnRlZCB0aGF0IC1ncmFia2JkIGlzIG5vIGxvbmdlciB3b3JraW5nIHdpdGggc29tZS9tb3N0Ci0gICAgICAgd2luZG93IG1hbmFnZXJzIChpdCBjYW4gcHJldmVudCByZXNpemluZyBhbmQgbWVudSBwb3N0aW5nLikKLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS4xMiByZWxlYXNlIChTZXAvMjAxMCk6Ci0gICAgICogT25lIGNhbiBub3cgc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlzcGxheXMgdGhhdCBjYW4gYmUKLSAgICAgICBjcmVhdGVkIGluIC1jcmVhdGUgbW9kZSB2aWEgdGhlIGVudi4gdmFyLgotICAgICAgIFgxMVZOQ19DUkVBVEVfTUFYX0RJU1BMQVlTCi0gICAgICogVGhlIFgxMVZOQ19OT19MSU1JVF9TSE0gZW52LiB2YXIuIGlzIGFkZGVkIHRvIHNraXAgYW55IGF1dG9tYXRpYwotICAgICAgIHNoYXJlZCBtZW1vcnkgcmVkdWN0aW9uLgotICAgICAqIFRoZSBrZG0gZGlzcGxheSBtYW5hZ2VyIGlzIG5vdyBkZXRlY3RlZCB3aGVuIHRyeWluZyBub3QgdG8gZ2V0Ci0gICAgICAga2lsbGVkIGJ5IHRoZSBkaXNwbGF5IG1hbmFnZXIuCi0gICAgICogQSBjb21waWxlIHRpbWUgYnVnIGlzIGZpeGVkIHNvIHRoYXQgY29uZmlndXJpbmcgdXNpbmcKLSAgICAgICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciBwb2ludGluZyB0byBMaWJWTkNTZXJ2ZXIgMC45Ljcgd29ya3MKLSAgICAgICBhZ2Fpbi4gQSBidWcgZnJvbSBmb3JjZWQgdXNlIG9mIFhkZWZzLmggaXMgd29ya2VkIGFyb3VuZC4KLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS4xMSByZWxlYXNlIChBdWcvMjAxMCk6Ci0gICAgICogVGhlIHNvdXJjZSB0cmVlIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb3N0IHJlY2VudCBsaWJ2bmNjbGllbnQKLSAgICAgICAodGhpcyBvbmx5IGFmZmVjdHMgLXJlZmxlY3QgbW9kZS4pIEJ1aWxkIGlzIGZpeGVkIGZvcgotICAgICAgIGluY29tcGF0aWJpbGl0aWVzIHdoZW4gdXNpbmcgYW4gZXh0ZXJuYWwgTGliVk5DU2VydmVyIChlLmcuCi0gICAgICAgLi9jb25maWd1cmUgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIuLi4pIFBsZWFzZSBoZWxwIHRlc3QgdGhlc2UKLSAgICAgICBidWlsZCBhbmQgcnVudGltZSBhc3BlY3RzIGFuZCByZXBvcnQgYmFjayB3aGF0IHlvdSBmaW5kLCB0aGFua3MuCi0gICAgICogVGhlIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlciBNYWtlZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBzbyB0aGF0Ci0gICAgICAgdGhlIGphciBmaWxlcyB0aGF0IGFyZSBidWlsdCBhcmUgY29tcGF0aWJsZSBiYWNrIHRvIEphdmEgMS40LgotICAgICAqIEluIC1jcmVhdGUvLXVuaXhwdyBtb2RlLCB0aGUgZW52LiB2YXIuIEZEX1VTRVJQUkVGUyBtYXkgYmUgc2V0IHRvCi0gICAgICAgYSBmaWxlbmFtZSBpbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IHRoYXQgaW5jbHVkZXMgZGVmYXVsdAotICAgICAgIHVzZXJuYW1lOm9wdGlvbnMgdmFsdWVzIChzbyB0aGUgb3B0aW9ucyBkbyBub3QgbmVlZCB0byBiZSB0eXBlZAotICAgICAgIGV2ZXJ5IHRpbWUgYXQgdGhlIGxvZ2luIHByb21wdC4pCi0gICAgICogSW4gLXJlZmxlY3QgbW9kZSBjdXJzb3IgcG9zaXRpb24gdXBkYXRlcyBhcmUgbm93IGhhbmRsZWQKLSAgICAgICBjb3JyZWN0bHkuCi0KLQotICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuMTAgcmVsZWFzZSAoTWF5LzIwMTApOgotICAgICAqIFRoZSBpbmNsdWRlZCBTU0wgZW5hYmxlZCBKYXZhIGFwcGxldCB2aWV3ZXIgbm93IHN1cHBvcnRzIENoYWluZWQKLSAgICAgICBTU0wgQ2VydGlmaWNhdGVzLiBUaGUgZGVidWdDZXJ0cz15ZXMgYXBwbGV0IHBhcmFtZXRlciBhaWRzCi0gICAgICAgdHJvdWJsZXNob290aW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24uIFRoZSB4MTF2bmMgLXNzbCBtb2RlIGhhcwotICAgICAgIGFsd2F5cyBzdXBwb3J0ZWQgY2hhaW5lZCBTU0wgY2VydGlmaWNhdGVzIChzaW1wbHkgcHV0IHRoZQotICAgICAgIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZXMsIGluIG9yZGVyLCBhZnRlciB0aGUgc2VydmVyIGNlcnRpZmljYXRlCi0gICAgICAgaW4gdGhlIHBlbSBmaWxlLikKLSAgICAgKiBBIGRlbW8gQ0dJIHNjcmlwdCBkZXNrdG9wLmNnaSBzaG93cyBob3cgdG8gY3JlYXRlIGFuIFNTTAotICAgICAgIGVuY3J5cHRlZCwgbXVsdGktdXNlciB4MTF2bmMgd2ViIGxvZ2luIGRlc2t0b3Agc2VydmljZS4gVGhlIHNjcmlwdAotICAgICAgIHJlcXVpcmVzIHgxMXZuYyB2ZXJzaW9uIDAuOS4xMC4gVGhlIHVzZXIgbG9ncyBpbnRvIGEgc2VjdXJlIHdlYgotICAgICAgIHNpdGUgYW5kIGdldHMgaGlzL2hlciBvd24gdmlydHVhbCBkZXNrdG9wIChYdmZiLikgeDExdm5jJ3MgU1NMCi0gICAgICAgZW5hYmxlZCBKYXZhIFZpZXdlciBBcHBsZXQgaXMgbGF1bmNoZWQgYnkgdGhlIHdlYiBicm93c2VyIGZvcgotICAgICAgIHNlY3VyZSB2aWV3aW5nIChhbmQgc28gbm8gc29mdHdhcmUgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZQotICAgICAgIHZpZXdlci1zaWRlLikgT25lIGNhbiB1c2UgdGhlIGRlc2t0b3AuY2dpIHNjcmlwdCBmb3IgaWRlYXMgdG8KLSAgICAgICBjcmVhdGUgdGhlaXIgb3duIGZhbmNpZXIgb3IgY3VzdG9taXplZCB3ZWIgbG9naW4gZGVza3RvcCBzZXJ2aWNlCi0gICAgICAgKGUuZy4gdXNlci1jcmVhdGlvbiwgUEhQLCBTUUwsIHNwZWNpYWxpemVkIGRlc2t0b3AgYXBwbGljYXRpb24sCi0gICAgICAgZXRjLikgTW9yZSBpbmZvIGhlcmUuIFRoZXJlIGlzIGFsc28gYW4gb3B0aW9uYWwgJ3BvcnQgcmVkaXJlY3Rpb24nCi0gICAgICAgbW9kZSB0aGF0IGFsbG93cyByZWRpcmVjdGlvbiB0byBvdGhlciBTU0wgZW5hYmxlZCBWTkMgc2VydmVycwotICAgICAgIHJ1bm5pbmcgaW5zaWRlIHRoZSBmaXJld2FsbC4KLSAgICAgKiBCdWlsdC1pbiBzdXBwb3J0IGZvciBJUHY2ICgxMjggYml0IGludGVybmV0IGFkZHJlc3NlcykgaXMgbm93Ci0gICAgICAgcHJvdmlkZWQuIFNlZSB0aGUgLTYgYW5kIC1jb25uZWN0IG9wdGlvbnMgZm9yIGRldGFpbHMuCi0gICAgICAgQWRkaXRpb25hbGx5LCBpbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBwcm9ibGVtcyB3aXRoIGJ1aWx0LWluIElQdjYKLSAgICAgICBzdXBwb3J0LCBhIHRyYW5zaXRpb25hbCB0b29sIGlzIHByb3ZpZGVkIGluIGluZXQ2dG80IHRoYXQgYWxsb3dzCi0gICAgICAgeDExdm5jIChvciBhbnkgb3RoZXIgSVB2NCBhcHBsaWNhdGlvbikgdG8gcmVjZWl2ZSBjb25uZWN0aW9ucyBvdmVyCi0gICAgICAgSVB2Ni4KLSAgICAgKiBUaGUgWGR1bW15IHdyYXBwZXIgc2NyaXB0IGZvciBYb3JnJ3MgZHVtbXkgZHJpdmVyIGlzIHVwZGF0ZWQgYW5kCi0gICAgICAgbm8gbG9uZ2VyIHJlcXVpcmVzIGJlaW5nIHJ1biBhcyByb290LiBOZXcgc2VydmljZSBvcHRpb25zIGFyZQotICAgICAgIHByb3ZpZGVkIHRvIHNlbGVjdCBYZHVtbXkgb3ZlciBYdmZiIGFzIHRoZSB2aXJ0dWFsIFggc2VydmVyIHRvIGJlCi0gICAgICAgY3JlYXRlZC4KLSAgICAgKiBUaGUgIiUiIHVuaXggcGFzc3dvcmQgdmVyaWZpY2F0aW9uIHRyaWNrcyBmb3IgdGhlIC11bml4cHcgb3B0aW9uCi0gICAgICAgYXJlIG5vdyBkb2N1bWVudGVkLiBUaGV5IGhhdmUgYWxzbyBiZWVuIGV4dGVuZGVkIHRvIHJ1biBhIGNvbW1hbmQKLSAgICAgICBhcyB0aGUgdXNlciBpZiBvbmUgc2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVU5JWFBXX0NNRC4gVGhlCi0gICAgICAgZGVza3RvcC5jZ2kgZGVtbyBzY3JpcHQgdGFrZXMgYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZlYXR1cmUuCi0gICAgICogQSBidWcgaGFzIGJlZW4gZml4ZWQgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBKYXZhIGFwcGxldCB2aWV3ZXIKLSAgICAgICBmcm9tIGJlaW5nIGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5IGluIHNpbmdsZS1wb3J0IEhUVFBTL1ZOQyBpbmV0ZAotICAgICAgIG1vZGUuIFRoZSBlbnYuIHZhci4gWDExVk5DX0hUVFBTX0RPV05MT0FEX1dBSVRfVElNRSBjYW4gYmUgdXNlZCB0bwotICAgICAgIGFkanVzdCBmb3IgaG93IG1hbnkgc2Vjb25kcyBhIC1pbmV0ZCBvciAtaHR0cHMgaHR0cGQgZG93bmxvYWQgaXMKLSAgICAgICB3YWl0ZWQgZm9yIChkZWZhdWx0IDE1IHNlY29uZHMuKSBUaGUgYXBwbGV0IHdpbGwgbm93IGF1dG9kZXRlY3QKLSAgICAgICB4MTF2bmMgYW5kIHVzZSBHRVQ9MSBmb3IgZmFzdGVyIGNvbm5lY3RpbmcuIE1hbnkgb3RoZXIKLSAgICAgICBpbXByb3ZlbWVudHMgYW5kIGZpeGVzLgotICAgICAqIFRoZSBUaWdodFZOQyBzZWN1cml0eSB0eXBlIChUaWdodFZOQyBmZWF0dXJlcyBlbmFibGVyKSBub3cgd29ya3MKLSAgICAgICBmb3IgUkZCIHZlcnNpb24gMy44LgotICAgICAqIFRoZSBYIHByb3BlcnR5IFgxMVZOQ19UUkFQX1hSQU5EUiBjYW4gYmUgc2V0IG9uIGEgZGVza3RvcCB0byBmb3JjZQotICAgICAgIHgxMXZuYyB0byB1c2UgdGhlIC14cmFuZHIgc2NyZWVuIHNpemUgY2hhbmdlIHRyYXBwaW5nIGNvZGUuCi0gICAgICogTmV3IHJlbW90ZSBjb250cm9sIHF1ZXJ5IG9wdGlvbnM6IHBvaW50ZXJfeCwgcG9pbnRlcl95LAotICAgICAgIHBvaW50ZXJfc2FtZSwgcG9pbnRlcl9yb290LCBhbmQgcG9pbnRlcl9tYXNrLiBBIGRlbW8gc2NyaXB0IHVzaW5nCi0gICAgICAgdGhlbSBtaXNjL3Bhbm5lci5wbCBpcyBwcm92aWRlZC4KLSAgICAgKiBUaGUgLXNzbFNjcmlwdHMgb3B0aW9uIHByaW50cyBvdXQgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50Ci0gICAgICAgc2NyaXB0cy4KLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS45IHJlbGVhc2UgKERlYy8yMDA5KToKLSAgICAgKiBUaGUgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBvcHRpb24sIHdoZW4gdXNlZCBpbiBjb21iaW5lZCB1bml4cHcKLSAgICAgICBhbmQgWERNQ1AgRklORENSRUFURURJU1BMQVkgbW9kZSAoZm9yIGV4YW1wbGU6IC14ZG1zdmMpLCBlbmFibGVzCi0gICAgICAgdGhlIHVzZXIgdG8gcHJlc3MgRXNjYXBlIHRvIGp1bXAgZGlyZWN0bHkgdG8gdGhlIFhETS9HRE0vS0RNIGxvZ2luCi0gICAgICAgZ3JlZXRlciBzY3JlZW4uIFRoaXMgd2F5IHRoZSB1c2VyIGF2b2lkcyBlbnRlcmluZyBoaXMgdW5peAotICAgICAgIHBhc3N3b3JkIHR3aWNlIGF0IFggc2Vzc2lvbiBjcmVhdGlvbiB0aW1lLiBBbHNvLCB0aGUgdW5peHB3IGxvZ2luCi0gICAgICAgcGFuZWwgbm93IGhhcyBhIHNob3J0IGhlbHAgZGlzcGxheWVkIGlmIHRoZSB1c2VyIHByZXNzZXMgJ0YxJy4KLSAgICAgKiB4MTF2bmMgbm93IHRyaWVzIHRvIGJlIGEgbGl0dGxlIGJpdCBtb3JlIGFnZ3Jlc3NpdmUgaW4ga2VlcGluZyB1cAotICAgICAgIHdpdGggVk5DIGNsaWVudCdzIGZyYW1lYnVmZmVyIHVwZGF0ZSByZXF1ZXN0cy4gU29tZSBicm9rZW4gVk5DCi0gICAgICAgY2xpZW50cyBsaWtlIEVnZ3BsYW50IGFuZCBKb2xseXNGYXN0Vk5DIGNvbnRpbnVvdXNseSBzcHJheSB0aGVzZQotICAgICAgIHJlcXVlc3RzIGF0IFZOQyBzZXJ2ZXJzIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBoYXZlIHJlY2VpdmVkCi0gICAgICAgYW55IHVwZGF0ZXMgb3Igbm90LikgVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIHRoaXMgY291bGQgbGVhZCB0bwotICAgICAgIHgxMXZuYyBmYWxsaW5nIGJlaGluZC4gVGhlIC1leHRyYV9mYnVyIG9wdGlvbiBhbGxvd3Mgb25lIHRvIGZpbmUKLSAgICAgICB0dW5lIHRoZSBzZXR0aW5nLiBBZGRpdGlvbmFsbHksIG9uZSBtYXkgYWxzbyBkaWFsIGRvd24gZGVsYXlzOgotICAgICAgIGUuZy4gIi1kZWZlciA1IiBhbmQgIi13YWl0IDUiIChvciB0byAxIG9yIGV2ZW4gMCkgb3IgLW5vbmFwIG9yCi0gICAgICAgLWFsbGlucHV0IHRvIGtlZXAgdXAgd2l0aCB0aGVzZSBWTkMgY2xpZW50cyBhdCB0aGUgZXhwZW5zZSBvZgotICAgICAgIGluY3JlYXNlZCBzeXN0ZW0gbG9hZC4KLSAgICAgKiBIZXVyaXN0aWNzIGFyZSBhcHBsaWVkIHRvIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlIFggZGlzcGxheSBpcwotICAgICAgIGN1cnJlbnRseSBpbiBhIERpc3BsYXkgTWFuYWdlciBHcmVldGVyIExvZ2luIHBhbmVsIChlLmcuIEdETSkgSWYKLSAgICAgICBzbywgeDExdm5jJ3MgY3JlYXRpb24gb2YgYW55IHdpbmRvd3MgYW5kIHVzZSBvZiBYRklYRVMgYXJlCi0gICAgICAgZGVsYXllZC4gVGhpcyBpcyB0byB0cnkgdG8gYXZvaWQgeDExdm5jIGJlaW5nIGtpbGxlZCBhZnRlciB0aGUKLSAgICAgICB1c2VyIGxvZ3MgaW4gaWYgdGhlIEdETSBLaWxsSW5pdENsaWVudHM9dHJ1ZSBpcyBpbiBlZmZlY3QuIFNvIG9uZQotICAgICAgIGRvZXMgbm90IG5lZWQgdG8gc2V0IEtpbGxJbml0Q2xpZW50cz1mYWxzZS4gTm90ZSB0aGF0IGluIHJlY2VudAotICAgICAgIEdETSB0aGUgS2lsbEluaXRDbGllbnRzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLiBBbHNvIGRlbGF5ZWQgaXMKLSAgICAgICB0aGUgdXNlIG9mIHRoZSBYRklYRVMgY3Vyc29yIGZldGNoaW5nIGZ1bmN0aW9uYWxpdHk7IHRoaXMgYXZvaWRzCi0gICAgICAgYW4gWG9yZyBidWcgdGhhdCBjYXVzZXMgWG9yZyB0byBjcmFzaCByaWdodCBhZnRlciB0aGUgdXNlciBsb2dzCi0gICAgICAgaW4uCi0gICAgICogQSBuZXcgb3B0aW9uIC1maW5kYXV0aCBydW5zIHRoZSBGSU5ERElTUExBWSBzY3JpcHQgdGhhdCBhcHBsaWVzCi0gICAgICAgaGV1cmlzdGljcyB0aGF0IHRyeSB0byBkZXRlcm1pbmUgdGhlIFhBVVRIT1JJVFkgZmlsZS4gVGhlIHVzZSBvZgotICAgICAgICctYXV0aCBndWVzcycgd2lsbCB1c2UgdGhlIFhBVVRIT1JJVFkgdGhhdCAtZmluZGF1dGggcmV2ZWFscy4gVGhpcwotICAgICAgIGNhbiBiZSBoYW5keSBpbiB3aXRoIHRoZSBsYXN0ZXN0IEdETSB3aGVyZSB0aGUgYWJpbGl0eSB0byBzdG9yZQotICAgICAgIGNvb2tpZXMgaW4gfi8uWGF1dGhvcml0eSBoYXMgYmVlbiByZW1vdmVkLiBJZiB4MTF2bmMgaXMgcnVubmluZyBhcwotICAgICAgIHJvb3QgKGUuZy4gaW5ldGQpIGFuZCB5b3UgYWRkIC1lbnYgRkRfWERNPTEgdG8gdGhlIGFib3ZlIC1maW5kYXV0aAotICAgICAgIG9yIC1hdXRoIGd1ZXNzIGNvbW1hbmQgbGluZXMsIGl0IHdpbGwgZmluZCB0aGUgY29ycmVjdCBYQVVUSE9SSVRZCi0gICAgICAgZm9yIHRoZSBnaXZlbiBkaXNwbGF5ICh0aGlzIHdvcmtzIGZvciBYRE0vR0RNL0tETSBpZiB0aGUgbG9naW4KLSAgICAgICBncmVldGVyIHBhbmVsIGlzIHVwIG9yIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgbG9nZ2VkIGludG8gYW4gWAotICAgICAgIHNlc3Npb24uKQotICAgICAqIFRoZSBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbW9kZXMgKGkuZS4gIi1kaXNwbGF5Ci0gICAgICAgV0FJVDpjbWQ9Li4uIiwgLWZpbmQsIC1jcmVhdGUpIG5vdyB3b3JrIGNvcnJlY3RseSBmb3IgdGhlCi0gICAgICAgdXNlci1zdXBwbGllZCBsb2dpbiBwcm9ncmFtIHNjaGVtZSAiLXVuaXhwd19jbWQgLi4uIiwgYXMgbG9uZyBhcwotICAgICAgIHRoZSBsb2dpbiBwcm9ncmFtIHN1cHBvcnRzIHJ1bm5pbmcgY29tbWFuZHMgc3BlY2lmaWVkIGluIHRoZQotICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlICJSRkJfVU5JWFBXX0NNRF9SVU4iIGFzIHRoZSBsb2dnZWQtaW4gdXNlci4KLSAgICAgICBUaGUgbW9kZSAiLXVuaXhwd19uaXMgLi4uIiBoYXMgYWxzbyBiZWVuIG1hZGUgbW9yZSBjb25zaXN0ZW50LgotICAgICAqIFRoZSAtc3R1bm5lbCBvcHRpb24gKGxpa2UgLXNzbCBidXQgdXNlcyBzdHVubmVsIGFzIGFuIGV4dGVybmFsCi0gICAgICAgaGVscGVyIHByb2dyYW0pIG5vdyB3b3JrcyB3aXRoIHRoZSAtc3NsICJTQVZFIiBhbmQgIlRNUCIgc3BlY2lhbAotICAgICAgIGNlcnRpZmljYXRlIG5hbWVzLiBUaGUgLXNzbHZlcmlmeSBhbmQgLXNzbENSTCBvcHRpb25zIG5vdyB3b3JrCi0gICAgICAgY29ycmVjdGx5IGluIC1zdHVubmVsIG1vZGUuIFNpbmdsZSBwb3J0IEhUVFBTIGNvbm5lY3Rpb25zIGFyZSBhbHNvCi0gICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIG1vZGUuCi0gICAgICogVGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIEFwcGxpY2F0aW9uIFNoYXJpbmcgbW9kZSB0aGF0IGltcHJvdmVzCi0gICAgICAgdXBvbiB0aGUgLWlkLy1zaWQgc2luZ2xlIHdpbmRvdyBzaGFyaW5nOiAtYXBwc2hhcmUgKHJ1biAieDExdm5jCi0gICAgICAgLWFwcHNoYXJlIC1oZWxwIiBmb3IgbW9yZSBpbmZvLikgSXQgaXMgc3RpbGwgdmVyeSBwcmltaXRpdmUgYW5kCi0gICAgICAgYXBwcm94aW1hdGUsIGJ1dCBhdCBsZWFzdCBpdCBkaXNwbGF5cyBtdWx0aXBsZSB0b3AtbGV2ZWwgd2luZG93cy4KLSAgICAgKiBUaGUgcmVtb3RlIGNvbnRyb2wgY29tbWFuZCAtUiBjYW4gYmUgdXNlZCB0byBpbnN0cnVjdCB4MTF2bmMgdG8KLSAgICAgICByZXNlbmQgaXRzIG1vc3QgcmVjZW50IGNvcHkgb2YgdGhlIENsaXBib2FyZCwgUHJpbWFyeSwgb3IKLSAgICAgICBDdXRidWZmZXIgc2VsZWN0aW9uczogIngxMXZuYyAtUiByZXNlbmRfY2xpcGJvYXJkIiwgIngxMXZuYyAtUgotICAgICAgIHJlc2VuZF9wcmltYXJ5IiwgYW5kICJ4MTF2bmMgLVIgcmVzZW5kX2N1dGJ1ZmZlciIuCi0gICAgICogVGhlIGZvbnRzIGluIHRoZSBHVUkgKC1ndWkpIGNhbiBub3cgYnkgc2V0IHZpYSBlbnZpcm9ubWVudAotICAgICAgIHZhcmlhYmxlcywgZS5nLiAtZW52IFgxMVZOQ19GT05UX0JPTEQ9J0hlbHZldGljYSAtMTYgYm9sZCcgYW5kCi0gICAgICAgLWVudiBYMTFWTkNfRk9OVF9GSVhFRD0nQ291cmllciAtMTQnLgotICAgICAqIFRoZSBYREFNQUdFIG1lY2hhbmlzbSBpcyBub3cgYXV0b21hdGljYWxseSBkaXNhYmxlZCBmb3IgYSBwZXJpb2QKLSAgICAgICBvZiB0aW1lIGlmIGEgZ2FtZSBvciBzY3JlZW5zYXZlciBnZW5lcmF0ZXMgdG9vIG1hbnkgWERBTUFHRQotICAgICAgIHJlY3RhbmdsZXMgcGVyIHNlY29uZC4gVGhpcyBhdm9pZHMgdGhlIFgxMSBldmVudCBxdWV1ZSBmcm9tCi0gICAgICAgc29ha2luZyB1cCB0b28gbXVjaCBtZW1vcnkuCi0gICAgICogVGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIHdvcmthcm91bmQ6ICItZW52IFgxMVZOQ19XQVRDSF9EWF9EWT0xIgotICAgICAgIHRoYXQgdHJpZXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBwb29ybHkgY29uc3RydWN0ZWQgbWVudSB0aGVtZXMKLSAgICAgICB0aGF0IHBsYWNlIHRoZSBpbml0aWFsIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgaW5zaWRlIGEgbWVudQotICAgICAgIGl0ZW0ncyBhY3RpdmUgem9uZS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaGVyZS4KLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS44IHJlbGVhc2UgKEp1bC8yMDA5KToKLSAgICAgKiBTdGFiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIC10aHJlYWRzIG1vZGUuIFJ1bm5pbmcgeDExdm5jIHRoaXMgd2F5Ci0gICAgICAgaXMgbW9yZSByZWxpYWJsZSBub3cuIFRocmVhZGVkIG9wZXJhdGlvbiBzb21ldGltZXMgZ2l2ZXMgYmV0dGVyCi0gICAgICAgaW50ZXJhY3RpdmUgcmVzcG9uc2UgYW5kIGZhc3RlciB1cGRhdGVzOiB0cnkgaXQgb3V0LiBUaGUgdGhyZWFkZWQKLSAgICAgICBtb2RlIG5vdyBzdXBwb3J0cyBtdWx0aXBsZSBWTkMgdmlld2VycyB1c2luZyB0aGUgc2FtZSBWTkMKLSAgICAgICBlbmNvZGluZy4gVGhlIHRocmVhZGVkIG1vZGUgY2FuIGFsc28geWllbGQgYSBwZXJmb3JtYW5jZQotICAgICAgIGVuaGFuY2VtZW50IGluIHRoZSBtYW55IGNsaWVudCBjYXNlIChlLmcuIGNsYXNzLXJvb20gYnJvYWRjYXN0LikKLSAgICAgICBXZSBoYXZlIHRlc3RlZCB3aXRoIDMwIHRvIDUwIHNpbXVsdGFuZW91cyBjbGllbnRzLiBTZWUgYWxzbwotICAgICAgIC1yZWZsZWN0LgotICAgICAgIEZvciBzaW11bHRhbmVvdXMgY2xpZW50czogdGhlIFpSTEUgZW5jb2RpbmcgaXMgdGhyZWFkIHNhZmUgb24gYWxsCi0gICAgICAgcGxhdGZvcm1zLCBhbmQgdGhlIFRpZ2h0IGFuZCBabGliIGVuY29kaW5ncyBhcmUgY3VycmVudGx5IG9ubHkKLSAgICAgICB0aHJlYWQgc2FmZSBvbiBMaW51eCB3aGVyZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSwgX190aHJlYWQsIGlzCi0gICAgICAgdXNlZC4gSWYgeW91ciBub24tTGludXggc3lzdGVtIGFuZCBjb21waWxlciBzdXBwb3J0IF9fdGhyZWFkIG9uZQotICAgICAgIGNhbiBzdXBwbHkgLURUTFM9X190aHJlYWQgdG8gZW5hYmxlIGl0LiBXaGVuIHRoZXJlIGlzIG9ubHkgb25lCi0gICAgICAgY29ubmVjdGVkIGNsaWVudCwgYWxsIGVuY29kaW5ncyBhcmUgc2FmZSBvbiBhbGwgcGxhdGZvcm1zLiBOb3RlCi0gICAgICAgdGhhdCBzb21lIGZlYXR1cmVzIChlLmcuIHNjcm9sbCBkZXRlY3Rpb24gYW5kIC1uY2FjaGUpIG1heSBiZQotICAgICAgIGRpc2FibGVkIG9yIHJ1biB3aXRoIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSBpbiAtdGhyZWFkcyBtb2RlLgotICAgICAqIEF1dG9tYXRpY2FsbHkgdHJpZXMgdG8gd29yayBhcm91bmQgYW4gWG9yZyBzZXJ2ZXIgYW5kIEdOT01FIGJ1ZwotICAgICAgIGludm9sdmluZyBpbmZpbml0ZWx5IHJlcGVhdGluZyBrZXlzIHdoZW4gdHVybmluZyBvZmYga2V5Ci0gICAgICAgcmVwZWF0aW5nLiBVc2UgLXJlcGVhdCBpZiB0aGUgYXV0b21hdGljIHdvcmthcm91bmQgZmFpbHMuCi0gICAgICogSW1wcm92ZWQgcmVsaWFiaWxpdHkgb2YgdGhlIFNpbmdsZSBQb3J0IFNTTCBWTkMgYW5kIEhUVFBTIGphdmEKLSAgICAgICB2aWV3ZXIgYXBwbGV0IGRlbGl2ZXJ5IG1lY2hhbmlzbS4KLSAgICAgKiBUaGUgLWNsaXAgbW9kZSB3b3JrcyB1bmRlciAtcmF3ZmIuCi0KLQotICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuNyByZWxlYXNlIChNYXIvMjAwOSk6Ci0gICAgICogU3VwcG9ydCBmb3IgcG9sbGluZyBMaW51eCBWaXJ0dWFsIFRlcm1pbmFscyAoYWxzbyBjYWxsZWQgdmlydHVhbAotICAgICAgIGNvbnNvbGVzKSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIC9kZXYvZmIuIFRoZSBvcHRpb24gdG8gdXNlIGlzLAotICAgICAgIGZvciBleGFtcGxlLCAiLXJhd2ZiIHZ0MiIgZm9yIFZpcnR1YWwgVGVybWluYWwgMiwgZXRjLiBJbiB0aGlzCi0gICAgICAgY2FzZSB0aGUgc3BlY2lhbCBmaWxlIC9kZXYvdmNzYTIgaXMgdXNlZCB0byByZXRyaWV2ZSB2dDIncyBjdXJyZW50Ci0gICAgICAgdGV4dC4gVGV4dCBhbmQgY29sb3JzIGFyZSBzaG93biwgYnV0IG5vIGdyYXBoaWNzLgotICAgICAqIFN1cHBvcnQgZm9yIGxlc3MgdGhhbiA4IGJpdHMgcGVyIHBpeGVsIGZyYW1lYnVmZmVycyAoZS5nLiA0IG9yIDEKLSAgICAgICBicHApIGluIHRoZSAtcmF3ZmIgbW9kZS4KLSAgICAgKiBUaGUgU1NMIGVuYWJsZWQgVWx0cmFWTkMgSmF2YSB2aWV3ZXIgYXBwbGV0IG5vdyBoYXMgYSBbSG9tZV0gZW50cnkKLSAgICAgICBpbiB0aGUgImRyaXZlcyIgZHJvcCBkb3duIG1lbnUuIFRoaXMgbWVudSBjYW4gYmUgY29uZmlndXJlZCB3aXRoCi0gICAgICAgdGhlIGZ0cERyb3BEb3duIGFwcGxldCBwYXJhbWV0ZXIuIEFsbCBvZiB0aGUgYXBwbGV0IHBhcmFtZXRlcnMgYXJlCi0gICAgICAgZG9jdW1lbnRlZCBpbiBjbGFzc2VzL3NzbC9SRUFETUUuCi0gICAgICogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFZpcnR1YWxHTCdzIFR1cmJvVk5DIChhbiBlbmhhbmNlZAotICAgICAgIFRpZ2h0Vk5DIGZvciBmYXN0IExBTiBoaWdoIGZyYW1lcmF0ZSB1c2FnZS4pCi0gICAgICogVGhlIENVUFMgVGVybWluYWwgU2VydmljZXMgaGVscGVyIG1vZGUgaGFzIGJlZW4gaW1wcm92ZWQuCi0gICAgICogSW1wcm92ZW1lbnRzIHRvIHRoZSAtbmNhY2hlX2NyIHRoYXQgYWxsb3dzIHNtb290aCBvcGFxdWUgd2luZG93Ci0gICAgICAgbW90aW9ucyB1c2luZyB0aGUgJ2NvcHlyZWN0JyBlbmNvZGluZyB3aGVuIHVzaW5nIC1uY2FjaGUgbW9kZS4KLSAgICAgKiBUaGUgLXJtZmxhZyBvcHRpb24gZW5hYmxlcyBhIHdheSB0byBpbmRpY2F0ZSB0byBvdGhlciBwcm9jZXNzZXMKLSAgICAgICB4MTF2bmMgaGFzIGV4aXRlZC4KLSAgICAgKiBSZXZlcnNlIGNvbm5lY3Rpb25zIHVzaW5nIGFub255bW91cyBEaWZmaWUgSGVsbG1hbiBTU0wgZW5jcnlwdGlvbgotICAgICAgIG5vdyB3b3JrLgotCi0KLSAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjYgcmVsZWFzZSAoRGVjLzIwMDgpOgotICAgICAqIFN1cHBvcnQgZm9yIFZlTkNyeXB0IFNTTC9UTFMgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLiBJdCBpcyBlbmFibGVkCi0gICAgICAgYnkgZGVmYXVsdCBpbiB0aGUgLXNzbCBtb2RlLiBWTkMgVmlld2VycyBsaWtlIHZpbmFncmUsCi0gICAgICAgZ3ZuY3ZpZXdlci9ndGstdm5jLCB0aGUgdmVuY3J5cHQgcGFja2FnZSwgU1NWTkMsIGFuZCBvdGhlcnMKLSAgICAgICBzdXBwb3J0IHRoaXMgZW5jcnlwdGlvbiBtb2RlLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIC11bml4cHcKLSAgICAgICBvcHRpb24gdG8gZW5hYmxlIFVuaXggdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgKFZlTkNyeXB0J3MgIipQbGFpbiIgbW9kZXMuKSBBIHNpbWlsYXIgYnV0IG9sZGVyIFZOQyBzZWN1cml0eSB0eXBlCi0gICAgICAgIkFOT05UTFMiICh1c2VkIGJ5IHZpbm8pIGlzIHN1cHBvcnRlZCBhcyB3ZWxsLiBTZWUgdGhlIC12ZW5jcnlwdAotICAgICAgIGFuZCAtYW5vbnRscyBvcHRpb25zIGZvciBhZGRpdGlvbmFsIGNvbnRyb2wuIFRoZSBkaWZmZXJlbmNlCi0gICAgICAgYmV0d2VlbiB4MTF2bmMncyBub3JtYWwgLXNzbCBtb2RlIGFuZCBWZU5DcnlwdCBpcyB0aGF0IHRoZSBmb3JtZXIKLSAgICAgICB3cmFwcyB0aGUgZW50aXJlIFZOQyBjb25uZWN0aW9uIGluIFNTTCAobGlrZSBIVFRQUyBkb2VzIGZvciBIVFRQLAotICAgICAgIGkuZS4gInZuY3M6Ly8iKSB3aGlsZSBWZU5DcnlwdCBzd2l0Y2hlcyBvbiB0aGUgU1NML1RMUyBhdCBhCi0gICAgICAgY2VydGFpbiBwb2ludCBkdXJpbmcgdGhlIFZOQyBoYW5kc2hha2UuIFVzZSAtc3Nsb25seSB0byBkaXNhYmxlCi0gICAgICAgYm90aCBWZU5DcnlwdCBhbmQgQU5PTlRMUyAodmluby4pCi0gICAgICogVGhlICItc3NsIEFOT04iIG9wdGlvbiBlbmFibGVzIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiAoQURIKSBrZXkKLSAgICAgICBleGNoYW5nZSBmb3IgeDExdm5jJ3Mgbm9ybWFsIFNTTC9UTFMgb3BlcmF0aW9uLiBOb3RlIHRoYXQKLSAgICAgICBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gdXNlcyBlbmNyeXB0aW9uIGZvciBwcml2YWN5LCBidXQgcHJvdmlkZXMKLSAgICAgICBubyBhdXRoZW50aWNhdGlvbiBhbmQgc28gaXMgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUKLSAgICAgICBhdHRhY2tzIChhbmQgc28gd2UgZG8gbm90IHJlY29tbWVuZCBpdDogd2UgcHJlZmVyIHlvdSB1c2UgIi1zc2wKLSAgICAgICBTQVZFIiwgZXRjLiBhbmQgaGF2ZSB0aGUgVk5DIHZpZXdlciB2ZXJpZnkgdGhlIGNlcnQuKSBUaGUgQU5PTlRMUwotICAgICAgIG1vZGUgKHZpbm8pIG9ubHkgc3VwcG9ydHMgQURILiBWZU5DcnlwdCBtb2RlIHN1cHBvcnRzIGJvdGggQURIIGFuZAotICAgICAgIHJlZ3VsYXIgWDUwOSBTU0wgY2VydGlmaWNhdGVzIG1vZGVzLiBGb3IgdGhlc2UgQURIIGlzIGVuYWJsZWQgYnkKLSAgICAgICBkZWZhdWx0LiBTZWUgLXZlbmNyeXB0IGFuZCAtYW5vbnRscyBmb3IgaG93IHRvIGRpc2FibGUgQURILgotICAgICAqIEZvciB4MTF2bmMncyBTU0wvVExTIG1vZGVzLCBvbmUgY2FuIG5vdyBzcGVjaWZ5IGEgQ2VydGlmaWNhdGUKLSAgICAgICBSZXZvY2F0aW9uIExpc3QgKENSTCkgd2l0aCB0aGUgLXNzbENSTCBvcHRpb24uIFRoaXMgd2lsbCBvbmx5IGJlCi0gICAgICAgdXNlZnVsIGZvciB3aWRlIGRlcGxveW1lbnRzOiBzYXkgYSBjb21wYW55LXdpZGUgeDExdm5jIFNTTCBhY2Nlc3MKLSAgICAgICBkZXBsb3ltZW50IHVzaW5nIGEgY2VudHJhbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSB2aWEKLSAgICAgICAtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0LiBUaGlzIHdheSBpZiBhIHVzZXIgaGFzIGhpcyBsYXB0b3AgbG9zdAotICAgICAgIG9yIHN0b2xlbiwgeW91IG9ubHkgaGF2ZSB0byByZXZva2UgaGlzIGtleSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEKLSAgICAgICBuZXcgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGFuZCByZWRlcGxveWluZyBuZXcga2V5cyB0byBhbGwgdXNlcnMuCi0gICAgICogVGhlIGRlZmF1bHQgU1NML1RMUyBtb2RlLCAiLXNzbCIgKG5vIHBlbSBmaWxlIHBhcmFtZXRlciBzdXBwbGllZCksCi0gICAgICAgaXMgbm93IHRoZSBzYW1lIGFzICItc3NsIFNBVkUiIGFuZCB3aWxsIHNhdmUgdGhlIGdlbmVyYXRlZAotICAgICAgIHNlbGYtc2lnbmVkIGNlcnQgaW4gIn4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtIi4gUHJldmlvdXNseSAiLXNzbCIKLSAgICAgICB3b3VsZCBjcmVhdGUgYSB0ZW1wb3Jhcnkgc2VsZi1zaWduZWQgY2VydCB0aGF0IHdhcyBkaXNjYXJkZWQgd2hlbgotICAgICAgIHgxMXZuYyBleGl0ZWQuIFRoZSByZWFzb24gZm9yIHRoZSBjaGFuZ2UgaXMgdG8gYXQgbGVhc3QgZ2l2ZSB0aGUKLSAgICAgICBjaGFuY2UgZm9yIHRoZSBWTkMgVmlld2VyIHNpZGUgKGUuZy4gU1NWTkMpIHRvIHJlbWVtYmVyIHRoZSBjZXJ0Ci0gICAgICAgdG8gYXV0aGVudGljYXRlIHN1YnNlcXVlbnQgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgeDExdm5jIHNlcnZlci4KLSAgICAgICBVc2UgIi1zc2wgVE1QIiB0byByZWdhaW4gdGhlIHByZXZpb3VzIGJlaGF2aW9yLiBVc2UgIi1zc2wKLSAgICAgICBTQVZFX05PUFJPTVBUIiB0byBhdm9pZCBiZWluZyBwcm9tcHRlZCBhYm91dCB1c2luZyBwYXNzcGhyYXNlIHdoZW4KLSAgICAgICB0aGUgY2VydGlmaWNhdGUgaXMgY3JlYXRlZC4KLSAgICAgKiBUaGUgb3B0aW9uIC1odHRwX29uZXBvcnQgZW5hYmxlcyBzaW5nbGUtcG9ydCBIVFRQIGNvbm5lY3Rpb25zIHZpYQotICAgICAgIHRoZSBKYXZhIFZOQyBWaWV3ZXIuIFNvLCBmb3IgZXhhbXBsZSwgdGhlIHdlYiBicm93c2VyIFVSTAotICAgICAgICJodHRwOi8vbXlob3N0Lm9yZzo1OTAwIiB3b3JrcyB0aGUgc2FtZSBhcwotICAgICAgICJodHRwOi8vbXlob3N0Lm9yZzo1ODAwIiwgYnV0IHdpdGggdGhlIGNvbnZlbmllbmNlIG9mIG9ubHkKLSAgICAgICBpbnZvbHZpbmcgb25lIHBvcnQgaW5zdGVhZCBvZiB0d28uIFRoaXMgd29ya3MgZm9yIGJvdGggdW5lbmNyeXB0ZWQKLSAgICAgICBjb25uZWN0aW9ucyBhbmQgZm9yIFNTSCB0dW5uZWxzIChzZWUgLWh0dHBzcmVkaXIgaWYgdGhlIHR1bm5lbAotICAgICAgIHBvcnQgZGlmZmVycy4pIE5vdGUgdGhhdCBIVFRQUyBzaW5nbGUtcG9ydCBvcGVyYXRpb24gaW4gLXNzbCBTU0wKLSAgICAgICBlbmNyeXB0ZWQgbW9kZSBoYXMgYmVlbiBhdmFpbGFibGUgc2luY2UgeDExdm5jIHZlcnNpb24gMC44LjMuCi0gICAgICogRm9yIHRoZSAtYXZhaGkvLXplcm9jb25mIFNlcnZpY2UgQWR2ZXJ0aXppbmcgbW9kZSwgaWYgeDExdm5jIHdhcwotICAgICAgIG5vdCBjb21waWxlZCB3aXRoIHRoZSBhdmFoaS1jbGllbnQgbGlicmFyeSwgdGhlbiBhbiBleHRlcm5hbAotICAgICAgIGhlbHBlciBwcm9ncmFtLCBlaXRoZXIgYXZhaGktcHVibGlzaCgxKSAob24gVW5peCkgb3IgZG5zLXNkKDEpIChvbgotICAgICAgIE1hYyBPUyBYKSwgaXMgdXNlZCBpbnN0ZWFkLgotICAgICAqIFRoZSAiLXJmYnBvcnQgUFJPTVBUIiBvcHRpb24gd2lsbCBwcm9tcHQgdGhlIHVzZXIgdmlhIHRoZSBHVUkgdG8KLSAgICAgICBzZWxlY3QgdGhlIFZOQyBwb3J0IChlLmcuIDU5MDEpIHRvIGxpc3RlbiBvbiwgYW5kIGEgZmV3IG90aGVyCi0gICAgICAgYmFzaWMgc2V0dGluZ3MuIFRoaXMgZW5hYmxlcyBhIGhhbmR5IEdVSSBtb2RlIGZvciBuYWl2ZSB1c2VyczoKLSAgIHgxMXZuYyAtZ3VpIHRyYXk9c2V0cGFzcyAtcmZicG9ydCBQUk9NUFQgLWxvZ2ZpbGUgJEhPTUUvLngxMXZuYy5sb2cuJVZOQ0RJU1AKLUxBWQotICAgICAgIHN1aXRhYmxlIGZvciBwdXR0aW5nIGluIGEgbGF1bmNoZXIgb3IgbWVudSwgZS5nLiB4MTF2bmMuZGVza3RvcC4KLSAgICAgICBUaGUgLWxvZ2ZpbGUgZXhwYW5zaW9uIGlzIG5ldyB0b28uIEluIHRoZSBHVUksIHRoZSB0cmF5PXNldHBhc3MKLSAgICAgICBQcm9wZXJ0aWVzIHBhbmVsIGhhcyBiZWVuIGltcHJvdmVkLgotICAgICAqIFRoZSAtc29saWQgc29saWQgYmFja2dyb3VuZCBjb2xvciBvcHRpb24gbm93IHdvcmtzIGZvciB0aGUgTWFjIE9TCi0gICAgICAgWCBjb25zb2xlLgotICAgICAqIFRoZSAtcmVvcGVuIG9wdGlvbiBpbnN0cnVjdHMgeDExdm5jIHRvIHRyeSB0byByZW9wZW4gdGhlIFggZGlzcGxheQotICAgICAgIGlmIGl0IGlzIHByZW1hdHVyZWx5IGNsb3NlZCBieSwgc2F5LCB0aGUgZGlzcGxheSBtYW5hZ2VyIChlLmcuCi0gICAgICAgR0RNLikKLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS41IHJlbGVhc2UgKE9jdC8yMDA4KToKLSAgICAgKiBTeW1tZXRyaWMga2V5IGVuY3J5cHRpb24gY2lwaGVycy4gQVJDNCwgQUVTLTEyOCwgQUVTLTI1NiwKLSAgICAgICBibG93ZmlzaCwgYW5kIDNkZXMgYXJlIHN1cHBvcnRlZC4gU2FsdCBhbmQgaW5pdGlhbGl6YXRpb24gdmVjdG9yCi0gICAgICAgc2VlZGluZyBpcyBwcm92aWRlZC4gVGhlc2UgY29tcGxpbWVudCB0aGUgbW9yZSB3aWRlbHkgdXNlZCBTU0wgYW5kCi0gICAgICAgU1NIIGVuY3J5cHRpb24gYWNjZXNzIG1ldGhvZHMuIFNTVk5DIGFsc28gc3VwcG9ydHMgdGhlc2UKLSAgICAgICBlbmNyeXB0aW9uIG1vZGVzLgotICAgICAqIFNjYWxpbmcgZGlmZmVyZW50bHkgYWxvbmcgdGhlIFgtIGFuZCBZLWRpcmVjdGlvbnMuIEUuZy4gIi1zY2FsZQotICAgICAgIDEyODB4MTAyNCIgb3IgIi1zY2FsZSAwLjh4MC43NSIgICAgQWxzbywgIi1nZW9tZXRyeSBXeEgiIGlzIGFuCi0gICAgICAgYWxpYXMgZm9yICItc2NhbGUgV3hIIgotICAgICAqIEJ5IGhhdmluZyBTU1ZOQyB2ZXJzaW9uIDEuMC4yMSBvciBsYXRlciBhdmFpbGFibGUgaW4geW91ciAkUEFUSCwKLSAgICAgICB0aGUgLWNoYXR3aW5kb3cgb3B0aW9uIGFsbG93cyBhIFVsdHJhVk5DIFRleHQgQ2hhdCB3aW5kb3cgdG8KLSAgICAgICBhcHBlYXIgb24gdGhlIGxvY2FsIFgxMSBjb25zb2xlL2Rpc3BsYXkgKHRoaXMgd2F5IHRoZSByZW1vdGUKLSAgICAgICB2aWV3ZXIgY2FuIGNoYXQgd2l0aCB0aGUgcGVyc29uIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5OyBlLmcuCi0gICAgICAgaGVscGRlc2sgbW9kZS4pIFRoaXMgYWxzbyB3b3JrcyBvbiB0aGUgTWFjIE9TIFggY29uc29sZSBpZiB0aGUKLSAgICAgICBYcXVhcnR6IFgxMSBzZXJ2ZXIgKGVuYWJsZWQgYnkgZGVmYXVsdCBvbiBsZW9wYXJkKSBpcyBydW5uaW5nIGZvcgotICAgICAgIHRoZSBjaGF0d2luZG93LgotICAgICAqIFRoZSBIVFRQIEphdmEgdmlld2VyIGFwcGxldCBqYXIsIGNsYXNzZXMvVm5jVmlld2VyLmphciwgaGFzIGJlZW4KLSAgICAgICB1cGRhdGVkIHdpdGggYW4gaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIGNvZGUgdXNlZCBieQotICAgICAgIHRoZSBjbGFzc2VzL3NzbCBhcHBsZXRzLgotCi0KLSAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjQgcmVsZWFzZSAoU2VwLzIwMDgpOgotICAgICAqIEltcHJvdmVtZW50cyB0byB0aGUgLWZpbmQgYW5kIC1jcmVhdGUgWCBzZXNzaW9uIGZpbmRpbmcgb3IKLSAgICAgICBjcmVhdGluZyBtb2RlczogbmV3IGRlc2t0b3AgdHlwZXMgYW5kIHNlcnZpY2UgcmVkaXJlY3Rpb24gb3B0aW9ucy4KLSAgICAgICBQZXJzb25hbCBjdXBzZCBkYWVtb24gYW5kIFNTSCBwb3J0IHJlZGlyZWN0aW9uIGhlbHBlciBmb3IgdXNlIHdpdGgKLSAgICAgICBTU1ZOQydzIFRlcm1pbmFsIFNlcnZpY2VzIGZlYXR1cmUuCi0gICAgICogUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgdmlhIC1jb25uZWN0IHdvcmsgaW4gdGhlIC1maW5kLCAtY3JlYXRlCi0gICAgICAgYW5kIHJlbGF0ZWQgLWRpc3BsYXkgV0FJVDouLi4gbW9kZXMuCi0gICAgICogUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgKGVpdGhlciBub3JtYWwgb3IgU1NMKSBjYW4gdXNlIGEgV2ViIFByb3h5Ci0gICAgICAgb3IgYSBTT0NLUyBwcm94eSwgb3IgYSBTU0ggY29ubmVjdGlvbiwgb3IgZXZlbiBhIENHSSBVUkwgdG8gbWFrZQotICAgICAgIHRoZSBvdXRnb2luZyBjb25uZWN0aW9uLiBTZWU6IC1wcm94eS4gRm9yd2FyZCBjb25uZWN0aW9ucyBjYW4gYWxzbwotICAgICAgIHVzZTogLXNzaC4KLSAgICAgKiBSZXZlcnNlIFZOQyBjb25uZWN0aW9ucyB2aWEgdGhlIFVsdHJhVk5DIHJlcGVhdGVyIHByb3h5IChlaXRoZXIKLSAgICAgICBub3JtYWwgb3IgU1NMKSBhcmUgc3VwcG9ydGVkLiBVc2UgZWl0aGVyIHRoZSAiLWNvbm5lY3QKLSAgICAgICByZXBlYXRlcj1JRDpOTk5OK2hvc3Q6cG9ydCIgb3IgIi1jb25uZWN0Ci0gICAgICAgcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6Tk5OTiIgbm90YXRpb24uIFRoZSBTU1ZOQyBWTkMgdmlld2VyIGFsc28KLSAgICAgICBzdXBwb3J0cyB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIuIEFsc28sIGEgcGVybCByZXBlYXRlciBpbXBsZW1lbnRpb24KLSAgICAgICBpcyBoZXJlOiB1bHRyYXZuY19yZXBlYXRlci5wbAotICAgICAqIFN1cHBvcnQgZm9yIGluZGV4ZWQgY29sb3JtYXBzIChQc2V1ZG9Db2xvcikgd2l0aCBkZXB0aHMgb3RoZXIgdGhhbgotICAgICAgIDggKGZyb20gMSB0byAxNiBub3cgd29yaykgZm9yIG5vbi1zdGFuZGFyZCBoYXJkd2FyZS4gT3B0aW9uCi0gICAgICAgIi1hZHZlcnRpc2VfdHJ1ZWNvbG9yIiB0byBoYW5kbGUgc29tZSB3b3JrYXJvdW5kIGluIHRoaXMgbW9kZS4KLSAgICAgKiBTdXBwb3J0IGZvciB0aGUgWllXUkxFIGVuY29kaW5nLCB0aGlzIGlzIHRoZSBSZWFsVk5DIFpSTEUgZW5jb2RpbmcKLSAgICAgICBleHRlbmRlZCB0byBkbyBtb3Rpb24gdmlkZW8gYW5kIHBob3RvIHJlZ2lvbnMgbW9yZSBlZmZpY2llbnRseSBieQotICAgICAgIHdheSBvZiBhIFdhdmVsZXQgYmFzZWQgdHJhbnNmb3JtYXRpb24uCi0gICAgICogVGhlIC1maW5kZHB5IGFuZCAtbGlzdGRweSB1dGlsaXRpZXMgaGVscCB0byBkZWJ1ZyBhbmQgY29uZmlndXJlCi0gICAgICAgdGhlIC1maW5kLCAtY3JlYXRlLCBhbmQgLWRpc3BsYXkgV0FJVDouLi4gbW9kZXMuCi0gICAgICogU29tZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHNjcmVlbiByZXNpemVzIGFyZSBoYW5kbGVkIGV2ZW4gaWYgdGhlCi0gICAgICAgLXhyYW5kciBvcHRpb24gaXMgbm90IHN1cHBsaWVkLgotICAgICAqIFRoZSAtYXV0b3BvcnQgb3B0aW9ucyBnaXZlcyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgVk5DIHBvcnQgeDExdm5jCi0gICAgICAgY2hvb3Nlcy4KLSAgICAgKiBUaGUgLXBpbmcgc2VjcyBjYW4gYmUgdXNlZCB0byBoZWxwIGtlZXAgaWRsZSBjb25uZWN0aW9ucyBhbGl2ZS4KLSAgICAgKiBQYXN0aW5nIG9mIHRoZSBzZWxlY3Rpb24vY2xpcGJvYXJkIGludG8gcmVtb3RlIGFwcGxpY2F0aW9ucyAoZS5nLgotICAgICAgIEphdmEpIGhhcyBiZWVuIGltcHJvdmVkLgotICAgICAqIEZpeGVkIGEgYnVnIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3RzIGR1cmluZyB0aGUgJ3NwZWVkLWVzdGltYXRpb24nCi0gICAgICAgcGhhc2UuCi0gICAgICogVG8gdW5zZXQgQ2Fwc19Mb2NrLCBOdW1fTG9jayBhbmQgcmFpc2UgYWxsIGtleXMgaW4gdGhlIFggc2VydmVyCi0gICAgICAgdXNlIC1jbGVhcl9hbGwuCi0gICAgICogVXNhZ2Ugd2l0aCBkdm9yYWsga2V5Ym9hcmRzIGhhcyBiZWVuIGltcHJvdmVkLiBTZWUgYWxzbzogLXhrYi4KLSAgICAgKiBUaGUgSmF2YSBWaWV3ZXIgYXBwbGV0IHNvdXJjZSBjb2RlIGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUKLSAgICAgICB4MTF2bmMtMC45LioudGFyLmd6IHRhcmJhbGwuIFRoaXMgbWVhbnMgeW91IGNhbiBub3cgYnVpbGQgdGhlIEphdmEKLSAgICAgICB2aWV3ZXIgYXBwbGV0IGphciBmaWxlcyBmcm9tIHNvdXJjZS4gSWYgeW91IHN0b3BwZWQgc2hpcHBpbmcgdGhlCi0gICAgICAgSmF2YSB2aWV3ZXIgYXBwbGV0IGphciBmaWxlcyBkdWUgdG8gbGFjayBvZiBzb3VyY2UgY29kZSwgeW91IGNhbgotICAgICAgIHN0YXJ0IGFnYWluLgotCi0KLSAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjMgcmVsZWFzZSAoT2N0LzIwMDcpOgotICAgICAqIFZpZXdlci1zaWRlIHBpeG1hcCBjYWNoaW5nLiBBIGxhcmdlIGFyZWEgb2YgcGl4ZWxzIChhdCBsZWFzdCAyLTMKLSAgICAgICB0aW1lcyBhcyBiaWcgYXMgdGhlIGZyYW1lYnVmZmVyIGl0c2VsZjsgdGhlIGJpZ2dlciB0aGUgYmV0dGVyLi4uCi0gICAgICAgZGVmYXVsdCBpcyAxMFgpIGlzIHBsYWNlZCBiZWxvdyB0aGUgZnJhbWVidWZmZXIgdG8gYWN0IGFzIGEKLSAgICAgICBidWZmZXIvY2FjaGUgYXJlYSBmb3IgcGl4ZWwgZGF0YS4gVGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZyBpcwotICAgICAgIHVzZWQgdG8gbW92ZSBpdCBhcm91bmQsIHNvIGFueSB2aWV3ZXIgY2FuIHRha2UgYWR2YW50YWdlIG9mIGl0LgotICAgICAgIFVudGlsIHdlIHN0YXJ0IG1vZGlmeWluZyB2aWV3ZXJzIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBjYWNoZQotICAgICAgIGFyZWEgaWYgeW91IHNjcm9sbCBkb3duICh0aGlzIG1ha2VzIGl0IGVhc2llciB0byBkZWJ1ZyEpIEZvcgotICAgICAgIHRlc3RpbmcgdGhlIGRlZmF1bHQgaXMgIi1uY2FjaGUgMTAiLiBUaGUgdW5peCBFbmhhbmNlZCBUaWdodFZOQwotICAgICAgIFZpZXdlciBzc3ZuYyBoYXMgYSBuaWNlIC15Y3JvcCBvcHRpb24gdG8gaGVscCBoaWRlIHRoZSBwaXhlbCBjYWNoZQotICAgICAgIGFyZWEgZnJvbSB2aWV3LgotCi0KLSAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjIgcmVsZWFzZSAoSnVuLzIwMDcpOgotICAgICAqIEJ1aWxkaW5nIHdpdGggbm8gT3BlblNTTCBsaWJzc2wgYXZhaWxhYmxlIChvciB3aXRoIC0td2l0aG91dC1zc2wpCi0gICAgICAgaGFzIGJlZW4gZml4ZWQuCi0gICAgICogT25lIGNhbiBjb25maWd1cmUgeDExdm5jIHZpYSAiLi9jb25maWd1cmUKLSAgICAgICAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlciIgdG8gdXNlIGEgc3lzdGVtIGluc3RhbGxlZCBsaWJ2bmNzZXJ2ZXIKLSAgICAgICBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIG9uZSBidW5kbGVkIGluIHRoZSByZWxlYXNlIHRhcmJhbGwuCi0gICAgICogSWYgVWx0cmFWTkMgZmlsZSB0cmFuc2ZlciBvciBjaGF0IGlzIGRldGVjdGVkLCB0aGVuIFZOQyBjbGllbnRzCi0gICAgICAgYXJlICJwaW5nZWQiIG1vcmUgb2Z0ZW4gdG8gcHJldmVudCB0aGVzZSBzaWRlIGNoYW5uZWxzIGZyb20KLSAgICAgICBiZWNvbWluZyBzZXJ2aWNlZCB0b28gaW5mcmVxdWVudGx5LgotICAgICAqIEluIC11bml4cHcgbW9kZSBpbiB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGRpYWxvZyBubyB0ZXh0IHdpbGwKLSAgICAgICBiZSBlY2hvZWQgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBzZW50IGlzICJFc2NhcGUiLiBUaGlzIGVuYWJsZXMgYQotICAgICAgIGNvbnZlbmllbmNlIGZlYXR1cmUgaW4gU1NWTkMgdG8gc2VuZCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICAgYXV0b21hdGljYWxseS4KLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS4xIHJlbGVhc2UgKE1heS8yMDA3KToKLSAgICAgKiBUaGUgVWx0cmFWTkMgSmF2YSB2aWV3ZXIgaGFzIGJlZW4gZW5oYW5jZWQgdG8gc3VwcG9ydCBTU0wgKGFzIHRoZQotICAgICAgIFRpZ2h0Vk5DIHZpZXdlciBoYWQgYmVlbiBwcmV2aW91c2x5LikgVGhlIFVsdHJhVk5DIEphdmEgc3VwcG9ydHMKLSAgICAgICB1bHRyYXZuYyBmaWxldHJhbnNmZXIsIGFuZCBzbyBjYW4gYmUgdXNlZCBhcyBhIFZOQyB2aWV3ZXIgb24gVW5peAotICAgICAgIHRoYXQgc3VwcG9ydHMgdWx0cmF2bmMgZmlsZXRyYW5zZmVyLiBJdCBpcyBpbiB0aGUKLSAgICAgICBjbGFzc2VzL3NzbC9VbHRyYVZpZXdlclNTTC5qYXIgZmlsZSAodGhhdCBpcyBwb2ludGVkIHRvIGJ5Ci0gICAgICAgdWx0cmEudm5jLikgVGhlIHNpZ25lZCBhcHBsZXQgU2lnbmVkVWx0cmFWaWV3ZXJTU0wuamFyIHZlcnNpb24KLSAgICAgICAocG9pbnRlZCB0byBieSB1bHRyYXNpZ25lZC52bmMpIHdpbGwgYmUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgbG9jYWwKLSAgICAgICBkcml2ZSBpZiB5b3UgYXJlIHVzaW5nIGl0IGZvciBmaWxlIHRyYW5zZmVyIHZpYSBhIFdlYiBicm93c2VyLgotICAgICAgIFNvbWUgb3RoZXIgYnVncyBpbiB0aGUgVWx0cmFWTkMgSmF2YSB2aWV3ZXIgd2VyZSBmaXhlZCBhbmQgYSBmZXcKLSAgICAgICBpbXByb3ZlbWVudHMgdG8gdGhlIFVJIG1hZGUuCi0gICAgICogQSBuZXcgVW5peCB1c2VybmFtZSBsb2dpbiBtb2RlIGZvciBWTkMgVmlld2VycyBhdXRoZW50aWNhdGVkIHZpYSBhCi0gICAgICAgQ2xpZW50IFNTTCBDZXJ0aWZpY2F0ZTogIi11c2VycyBzc2xwZWVyPSIuIFRoZSBlbWFpbEFkZHJlc3MKLSAgICAgICBzdWJqZWN0IGZpZWxkIGlzIGluc3BlY3RlZCBmb3IgdXNlcm5hbWVAaG9zdG5hbWUgYW5kIHRoZW4gYWN0cyBhcwotICAgICAgIHRob3VnaCAiLXVzZXJzICt1c2VybmFtZSIgaGFzIGJlZW4gc3VwcGxpZWQuIFRoaXMgd2F5IHRoZSBVbml4Ci0gICAgICAgdXNlcm5hbWUgaXMgaWRlbnRpZmllZCBieSAoaS5lLiBzaW1wbHkgZXh0cmFjdGVkIGZyb20pIHRoZSBDbGllbnQKLSAgICAgICBTU0wgQ2VydGlmaWNhdGUuIFRoaXMgY291bGQgYmUgdXNlZnVsIHdpdGggLWZpbmQsIC1jcmVhdGUgYW5kIC1zdmMKLSAgICAgICBtb2RlcyBpZiB5b3UgYXJlIGFsc28gaGF2ZSBzZXQgdXAgYW5kIHVzZSBWTkMgQ2xpZW50IFNTTAotICAgICAgIENlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uLgotICAgICAqIEZvciBleHRlcm5hbCBkaXNwbGF5IGZpbmRpbmcvY3JlYXRpbmcgcHJvZ3JhbXMgKGUuZy4gV0FJVDpjbWQ9Li4uKQotICAgICAgIGlmIHRoZSBWTkMgVmlld2VyIGlzIGF1dGhlbnRpY2F0ZWQgdmlhIGEgQ2xpZW50IFNTTCBDZXJ0aWZpY2F0ZSwKLSAgICAgICB0aGVuIHRoYXQgQ2VydGlmaWNhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICAgIFJGQl9TU0xfQ0xJRU5UX0NFUlQuCi0KLQotICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkgcmVsZWFzZSAoQXByLzIwMDcpOgotICAgICAqIFZOQyBTZXJ2aWNlIGFkdmVydGlzaW5nIHZpYSBtRE5TIC8gWmVyb0NvbmYgLyBCb25Kb3VyIHdpdGggdGhlCi0gICAgICAgQXZhaGkgY2xpZW50IGxpYnJhcnkuIEVuYWJsZSB2aWEgIi1hdmFoaSIgb3IgIi16ZXJvY29uZiIuCi0gICAgICogSW1wbGVtZW50YXRpb25zIG9mIFVsdHJhVk5DJ3MgVGV4dENoYXQsIFNpbmdsZVdpbmRvdywgYW5kCi0gICAgICAgU2VydmVySW5wdXQgZXh0ZW5zaW9ucyAocmVxdWlyZXMgdWx0cmF2bmMgdmlld2VyIG9yIHNzdm5jIFVuaXgKLSAgICAgICB2aWV3ZXIuKSBUaGV5IHRvZ2dsZSB0aGUgc2VsZWN0aW9uIG9mIGEgc2luZ2xlIHdpbmRvdyAoLWlkKSwgYW5kCi0gICAgICAgZGlzYWJsZSAoZnJpZW5kbHkpIHVzZXIgaW5wdXQgYW5kIHZpZXdpbmcgKG1vbml0b3IgYmxhbmspIGF0IHRoZQotICAgICAgIFZOQyBzZXJ2ZXIuCi0gICAgICogU2hvcnQgYWxpYXNlcyAiLWZpbmQiLCAiLWNyZWF0ZSIsICItc3ZjIiwgYW5kICIteGRtc3ZjIiBmb3IKLSAgICAgICBjb21tb25seSB1c2VkIEZJTkRDUkVBVEVESVNQTEFZIHVzYWdlIG1vZGVzLgotICAgICAqIFJldmVyc2UgVk5DIGNvbm5lY3Rpb25zICh2aWV3ZXIgbGlzdGVuaW5nKSBub3cgd29yayBpbiBTU0wgKC1zc2wpCi0gICAgICAgbW9kZS4KLSAgICAgKiBOZXcgb3B0aW9ucyB0byBjb250cm9sIHRoZSBNb25pdG9yIHBvd2VyIHN0YXRlIGFuZCBrZXlib2FyZC9tb3VzZQotICAgICAgIGdyYWJiaW5nOiAtZm9yY2VkcG1zLCAtY2xpZW50ZHBtcywgLW5vc2VydmVyZHBtcywgYW5kIC1ncmFiYWx3YXlzLgotICAgICAqIEEgc2ltcGxlIHdheSB0byBlbXVsYXRlIGluZXRkKDgpIHRvIHNvbWUgZGVncmVlIHZpYSB0aGUgIi1sb29wYmciCi0gICAgICAgb3B0aW9uLgotICAgICAqIE1vbml0b3IgdGhlIGFjY3VyYWN5IG9mIFhEQU1BR0UgYW5kIGFwcGx5ICItbm94ZGFtYWdlIiBpZiBpdCBpcwotICAgICAgIG5vdCB3b3JraW5nIHdlbGwuIE9wZW5HTCBhcHBsaWNhdGlvbnMgbGlrZSBsaWtlIGJlcnlsIGFuZCBNeXRoVHYKLSAgICAgICBoYXZlIGJlZW4gc2hvd24gdG8gbWFrZSBYREFNQUdFIG5vdCB3b3JrIHByb3Blcmx5LgotICAgICAqIEZvciBKYXZhIFNTTCBjb25uZWN0aW9ucyBpbnZvbHZpbmcgYSByb3V0ZXIvZmlyZXdhbGwgcG9ydAotICAgICAgIHJlZGlyZWN0aW9uLCBhbiBvcHRpb24gLWh0dHBzcmVkaXIgdG8gc3BhcmUgdGhlIHVzZXIgZnJvbSBuZWVkaW5nCi0gICAgICAgdG8gaW5jbHVkZSAmUE9SVD1OTk4gaW4gdGhlIGJyb3dzZXIgVVJMLgotCi0KLSAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC44LjQgcmVsZWFzZSAoRmViLzIwMDcpOgotICAgICAqIE5hdGl2ZSBNYWMgT1MgWCBBcXVhL1F1YXJ0eiBzdXBwb3J0LiAoaS5lLiBPU1h2bmMgYWx0ZXJuYXRpdmU7Ci0gICAgICAgc29tZSBhY3Rpdml0aWVzIGFyZSBmYXN0ZXIpCi0gICAgICogQSBuZXcgbG9naW4gbW9kZTogIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZIC11bml4cHcKLSAgICAgICAuLi4iIHRoYXQgd2lsbCBDcmVhdGUgYSBuZXcgWCBzZXNzaW9uIChlaXRoZXIgdmlydHVhbCBvciByZWFsIGFuZAotICAgICAgIHdpdGggb3Igd2l0aG91dCBhIGRpc3BsYXkgbWFuYWdlciwgZS5nLiBrZG0pIGZvciB0aGUgdXNlciBpZiBpdAotICAgICAgIGNhbm5vdCBmaW5kIHRoZSB1c2VyJ3MgWCBzZXNzaW9uIGRpc3BsYXkgdmlhIHRoZSBGSU5ERElTUExBWQotICAgICAgIG1ldGhvZC4gU2VlIHRoZSAtc3ZjIGFuZCB0aGUgLXhkbXN2YyBhbGlhc2VzLgotICAgICAqIHgxMXZuYyBjYW4gYWN0IGFzIGEgVk5DIHJlZmxlY3Rvci9yZXBlYXRlciB1c2luZyB0aGUgIi1yZWZsZWN0Ci0gICAgICAgaG9zdDpOIiBvcHRpb24uIEluc3RlYWQgb2YgcG9sbGluZyBhbiBYIGRpc3BsYXksIHRoZSByZW1vdGUgVk5DCi0gICAgICAgU2VydmVyIGhvc3Q6TiBpcyBjb25uZWN0ZWQgdG8gYW5kIHJlLWV4cG9ydGVkIHZpYSBWTkMuIFRoaXMgaXMKLSAgICAgICBpbnRlbmRlZCBmb3IgdXNlIGluIGJyb2FkY2FzdGluZyBhIGRpc3BsYXkgdG8gbWFueSAoZS5nLiA+IDE2OwotICAgICAgIGNsYXNzcm9vbSBvciBsYXJnZSBkZW1vKSBWTkMgdmlld2VycyB3aGVyZSBiYW5kd2lkdGggYW5kIG90aGVyCi0gICAgICAgcmVzb3VyY2VzIGFyZSBjb25zZXJ2ZWQgYnkgc3ByZWFkaW5nIHRoZSBsb2FkIG92ZXIgYSBudW1iZXIgb2YKLSAgICAgICByZXBlYXRlcnMuCi0gICAgICogV2lyZWZyYW1lIGNvcHlyZWN0IGRldGVjdGlvbiBmb3IgbG9jYWwgdXNlciBhY3Rpdml0eSAoZS5nLiBzb21lb25lCi0gICAgICAgc2l0dGluZyBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBtb3Zpbmcgd2luZG93cykgVXNlCi0gICAgICAgLW5vd2lyZWZyYW1lbG9jYWwgdG8gZGlzYWJsZS4KLSAgICAgKiBUaGUgIi1OIiBvcHRpb24gY291cGxlcyB0aGUgVk5DIERpc3BsYXkgbnVtYmVyIHRvIHRoZSBYIERpc3BsYXkKLSAgICAgICBudW1iZXIuIEUuZy4gaWYgeW91ciBYIERJU1BMQVkgaXMgOjIgdGhlbiB0aGUgVk5DIGRpc3BsYXkgd2lsbCBiZQotICAgICAgIDoyIChpLmUuIHVzaW5nIHBvcnQgNTkwMi4pIElmIHRoYXQgcG9ydCBpcyB0YWtlbiB4MTF2bmMgd2lsbCBleGl0LgotICAgICAqIE9wdGlvbiAtbm9kcG1zIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggcHJvZ3JhbXMgbGlrZSBLREUncwotICAgICAgIGtkZXNrdG9wX2xvY2sgdGhhdCBrZWVwIHJlc3RhcnRpbmcgdGhlIHNjcmVlbiBzYXZlciBldmVyeSBmZXcKLSAgICAgICBzZWNvbmRzLgotICAgICAqIFRvIGF1dG9tYXRpY2FsbHkgZml4IHRoZSBjb21tb24gbW91c2UgbW90aW9uIHByb2JsZW0gb24gWElORVJBTUEKLSAgICAgICAobXVsdGktaGVhZGVkKSBkaXNwbGF5cywgdGhlIC14d2FycHBvaW50ZXIgb3B0aW9uIGlzIGVuYWJsZWQgYnkKLSAgICAgICBkZWZhdWx0IHdoZW4gWElORVJBTUEgaXMgYWN0aXZlLgotCi0gICBJZiB5b3UgaGF2ZSBhIE1hYyBwbGVhc2UgdHJ5IG91dCB0aGUgbmF0aXZlIE1hYyBPUyBYIHN1cHBvcnQsIGJ1aWxkCi0gICB3aXRoICIuL2NvbmZpZ3VyZSAtLXdpdGhvdXQteCIsIG9yIGRvd25sb2FkIGEgYmluYXJ5IG1lbnRpb25lZCBhYm92ZSwKLSAgIChldmVuIGlmIHlvdSBkb24ndCBwbGFuIG9uIGV2ZXIgdXNpbmcgaXQgaW4gdGhpcyBtb2RlISksIGFuZCBsZXQgbWUKLSAgIGtub3cgaG93IGl0IHdlbnQuIFRoYW5rcy4KLQotCi0gICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOC4zIHJlbGVhc2UgKE5vdi8yMDA2KToKLSAgICAgKiBUaGUgLXNzbCBvcHRpb24gcHJvdmlkZXMgU1NMIGVuY3J5cHRpb24gYW5kIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgbmF0aXZlbHkgdmlhIHRoZSB3d3cub3BlbnNzbC5vcmcgbGlicmFyeS4gT25lIGNhbiB1c2UgZnJvbSBhCi0gICAgICAgc2ltcGxlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHNlcnZlciBjZXJ0aWZpY2F0ZSB1cCB0byBmdWxsIENBCi0gICAgICAgYW5kIGNsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBzY2hlbWVzLgotICAgICAqIFNpbWlsYXIgdG8gLXNzbCwgdGhlIC1zdHVubmVsIG9wdGlvbiBzdGFydHMgdXAgYSBTU0wgdHVubmVsIHNlcnZlcgotICAgICAgIHN0dW5uZWwgKHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseSBvbiB0aGUgc3lzdGVtOgotICAgICAgIHN0dW5uZWwubWlydC5uZXQgKSB0byBhbGxvdyBvbmx5IGVuY3J5cHRlZCBTU0wgY29ubmVjdGlvbnMgZnJvbQotICAgICAgIHRoZSBuZXR3b3JrLgotICAgICAqIFRoZSAtc3NsdmVyaWZ5IG9wdGlvbiBhbGxvd3MgZm9yIGF1dGhlbnRpY2F0aW5nIFZOQyBjbGllbnRzIHZpYQotICAgICAgIHRoZWlyIGNlcnRpZmljYXRlcyBpbiBlaXRoZXIgLXNzbCBvciAtc3R1bm5lbCBtb2Rlcy4KLSAgICAgKiBDZXJ0aWZpY2F0ZSBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudCB0b29scyBhcmUgcHJvdmlkZSBpbiB0aGUKLSAgICAgICAtc3NsR2VuQ2VydCwgLXNzbEdlbkNBLCBhbmQgcmVsYXRlZCBvcHRpb25zLgotICAgICAqIEFuIFNTTCBlbmFibGVkIEphdmEgYXBwbGV0IFZOQyBWaWV3ZXIgYXBwbGV0IGlzIHByb3ZpZGVkIGJ5IHgxMXZuYwotICAgICAgIGluIGNsYXNzZXMvc3NsL1ZuY1ZpZXdlci5qYXIuIEluIGFkZGl0aW9uIHRvIG5vcm1hbCBIVFRQLCB0aGUKLSAgICAgICBhcHBsZXQgbWF5IGJlIGxvYWRlZCBpbnRvIHRoZSB3ZWIgYnJvd3NlciB2aWEgSFRUUFMgKEhUVFAgb3ZlcgotICAgICAgIFNTTC4pIChvbmUgY2FuIHVzZSB0aGUgVk5DIHBvcnQsIGUuZy4gaHR0cHM6Ly9ob3N0OjU5MDAvLCBvciBhbHNvCi0gICAgICAgdGhlIHNlcGFyYXRlIC1odHRwcyBwb3J0IG9wdGlvbi4pIEEgd3JhcHBlciBzaGVsbCBzY3JpcHQKLSAgICAgICBzc192bmN2aWV3ZXIgaXMgYWxzbyBwcm92aWRlZCB0aGF0IHNldHMgdXAgYSBzdHVubmVsIGNsaWVudC1zaWRlCi0gICAgICAgdHVubmVsIG9uIFVuaXggc3lzdGVtcy4gU2VlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIGZvcgotICAgICAgIG90aGVyIFNTTC9TU0ggdmlld2VyIHBvc3NpYmlsaXRpZXMuCi0gICAgICogVGhlIC11bml4cHcgb3B0aW9uIHN1cHBvcnRzIFVuaXggdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICAgYXV0aGVudGljYXRpb24gKGEgc2ltcGxlciB2YXJpYW50IGlzIHRoZSAtdW5peHB3X25pcyBvcHRpb24gdGhhdAotICAgICAgIHdvcmtzIGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcyBhcmUgcmVhZGFibGUsCi0gICAgICAgZS5nLiBOSVMuKSBUaGUgLXNzbCBvciAtbG9jYWxob3N0ICsgLXN0dW5uZWwgb3B0aW9ucyBhcmUgZW5mb3JjZWQKLSAgICAgICBpbiB0aGlzIG1vZGUgdG8gcHJldmVudCBwYXNzd29yZCBzbmlmZmluZy4gQXMgYSBjb252ZW5pZW5jZSwgdGhlc2UKLSAgICAgICByZXF1aXJlbWVudHMgYXJlIGxpZnRlZCBpZiBhIFNTSCB0dW5uZWwgY2FuIGJlIGRlZHVjZWQgKGJ1dAotICAgICAgIC1sb2NhbGhvc3Qgc3RpbGwgYXBwbGllcy4pCi0gICAgICogQ291cGxpbmcgLXVuaXhwdyB3aXRoICItZGlzcGxheSBXQUlUOmNtZD1GSU5ERElTUExBWSIgb3IgIi1kaXNwbGF5Ci0gICAgICAgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVkiIHByb3ZpZGVzIGEgd2F5IHRvIGFsbG93IGEgdXNlciB0bwotICAgICAgIGxvZ2luIHdpdGggdGhlaXIgVU5JWCBwYXNzd29yZCBhbmQgaGF2ZSB0aGVpciBkaXNwbGF5IGNvbm5lY3RlZCB0bwotICAgICAgIGF1dG9tYXRpY2FsbHkuIFNlZSB0aGUgLXN2YyBhbmQgdGhlIC14ZG1zdmMgYWxpYXNlcy4KLSAgICAgKiBIb29rcyBhcmUgcHJvdmlkZWQgaW4gdGhlIC11bml4cHdfY21kIGFuZCAiLXBhc3N3ZGZpbGUKLSAgICAgICBjbWQ6LGN1c3RvbTouLi4iIG9wdGlvbnMgdG8gYWxsb3cgeW91IHRvIHN1cHBseSB5b3VyIG93bgotICAgICAgIGF1dGhlbnRpY2F0aW9uIGFuZCBwYXNzd29yZCBsb29rdXAgcHJvZ3JhbXMuCi0gICAgICogeDExdm5jIGNhbiBiZSBjb25maWd1cmVkIGFuZCBidWlsdCB0byBub3QgZGVwZW5kIG9uIFgxMSBsaWJyYXJpZXMKLSAgICAgICAiLi9jb25maWd1cmUgLS13aXRob3V0LXgiIGZvciAtcmF3ZmIgb25seSBvcGVyYXRpb24gKGUuZy4gZW1iZWRkZWQKLSAgICAgICBsaW51eCBjb25zb2xlIGRldmljZXMuKQotICAgICAqIFRoZSAtcm90YXRlIG9wdGlvbiBlbmFibGVzIHlvdSB0byByb3RhdGUgb3IgcmVmbGVjdCB0aGUgc2NyZWVuCi0gICAgICAgYmVmb3JlIGV4cG9ydGluZyB2aWEgVk5DLiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2Ugb24gaGFuZGhlbGRzCi0gICAgICAgYW5kIG90aGVyIGRldmljZXMgd2hlcmUgdGhlIHJvdGF0aW9uIG9yaWVudGF0aW9uIGlzIG5vdCAibmF0dXJhbCIuCi0gICAgICogVGhlICItdWx0cmFmaWxleGZlciIgYWxpYXMgaXMgcHJvdmlkZWQgYW5kIGltcHJvdmVkIFVsdHJhVk5DCi0gICAgICAgZmlsZXRyYW5zZmVyIHJhdGVzIGhhdmUgYmVlbiBhY2hpZXZlZC4KLSAgICAgKiBVbmRlciB0aGUgIi1jb25uZWN0X29yX2V4aXQgaG9zdCIgb3B0aW9uIHgxMXZuYyB3aWxsIGV4aXQKLSAgICAgICBpbW1lZGlhdGVseSB1bmxlc3MgdGhlIHJldmVyc2UgY29ubmVjdGlvbiB0byBob3N0IHN1Y2NlZWRzLiBUaGUKLSAgICAgICAiLXJmYnBvcnQgMCIgb3B0aW9uIGRpc2FibGVzIFRDUCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zICh1c2VmdWwKLSAgICAgICBmb3IgdGhpcyBtb2RlLikKLSAgICAgKiBUaGUgIi1yYXdmYiByYW5kIiBhbmQgIi1yYXdmYiBub25lIiBvcHRpb25zIGFyZSB1c2VmdWwgZm9yIHRlc3RpbmcKLSAgICAgICBhdXRvbWF0aW9uIHNjcmlwdHMsIGV0Yy4sIHdpdGhvdXQgcmVxdWlyaW5nIGEgZnVsbCBkZXNrdG9wLgotICAgICAqIFJlZHVjZWQgc3Bld2luZyBvZiBpbmZvcm1hdGlvbiBhdCBzdGFydHVwLCB1c2UgIi12ZXJib3NlIiAoYWxzbwotICAgICAgICItdiIpIHRvIHR1cm4gaXQgYmFjayBvbiBmb3IgZGVidWdnaW5nIG9yIGlmIHlvdSBhcmUgZ29pbmcgdG8gc2VuZAotICAgICAgIG1lIGEgcHJvYmxlbSByZXBvcnQuCi0KLSAgIEhlcmUgYXJlIHNvbWUgUHJldmlvdXMgUmVsZWFzZSBOb3RlcwotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgU29tZSBOb3RlczoKLQotICAgQm90aCBhIGNsaWVudCBhbmQgYSBzZXJ2ZXI6ICAgSXQgaXMgc29tZXRpbWVzIGNvbmZ1c2luZyB0byBwZW9wbGUgdGhhdAotICAgeDExdm5jIGlzIGJvdGggYSBjbGllbnQgYW5kIGEgc2VydmVyIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGlzIGFuIFgKLSAgIGNsaWVudCBiZWNhdXNlIGl0IGNvbm5lY3RzIHRvIHRoZSBydW5uaW5nIFggc2VydmVyIHRvIGRvIHRoZSBzY3JlZW4KLSAgIHBvbGxzLiBUaGluayBvZiBpdCBhcyBhIHJhdGhlciBlZmZpY2llbnQgInNjcmVlbnNob3QiIHByb2dyYW0gcnVubmluZwotICAgY29udGludW91c2x5LiBJdCBpcyBhIHNlcnZlciBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBhIFZOQyBzZXJ2ZXIgdGhhdAotICAgVk5DIHZpZXdlcnMgb24gdGhlIG5ldHdvcmsgY2FuIGNvbm5lY3QgdG8gYW5kIHZpZXcgdGhlIHNjcmVlbgotICAgZnJhbWVidWZmZXIgaXQgbWFuYWdlcy4KLQotICAgV2hlbiB0cnlpbmcgdG8gZGVidWcgcHJvYmxlbXMsIHJlbWVtYmVyIHRvIHRoaW5rIG9mIGJvdGggcm9sZXMuIEUuZy4KLSAgICJob3cgaXMgeDExdm5jIGNvbm5lY3RpbmcgdG8gdGhlIFggc2VydmVyPyIsICJob3cgaXMgdGhlIHZuY3ZpZXdlcgotICAgY29ubmVjdGluZyB0byB4MTF2bmM/IiwgIndoYXQgcGVybWl0cy9yZXN0cmljdHMgdGhlIGNvbm5lY3Rpb24/Ii4gQm90aAotICAgbGlua3MgbWF5IGhhdmUgcmVhY2hhYmlsaXR5LCBwZXJtaXNzaW9uLCBhbmQgb3RoZXIgaXNzdWVzLgotCi0gICBOZXR3b3JrIHBlcmZvcm1hbmNlOiAgIFdoZXRoZXIgeW91IGFyZSB1c2luZyBYdm5jIG9yIHgxMXZuYyBpdCBpcwotICAgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGhhdmUgYSBzb2xpZCBiYWNrZ3JvdW5kIGNvbG9yIGluc3RlYWQgb2YgYQotICAgcHJldHR5IGJhY2tncm91bmQgaW1hZ2UuIEVhY2ggYW5kIGV2ZXJ5IHJlLWV4cG9zdXJlIG9mIHRoZSBiYWNrZ3JvdW5kCi0gICBtdXN0IGJlIHJlc2VudCBvdmVyIHRoZSBuZXR3b3JrOiBiZXR0ZXIgdG8gaGF2ZSB0aGF0IGJhY2tncm91bmQgYmUgYQotICAgc29saWQgY29sb3IgdGhhdCBjb21wcmVzc2VzIHZlcnkgd2VsbCBjb21wYXJlZCB0byBhIHBob3RvIGltYWdlLiAoVGhpcwotICAgaXMgb25lIHBsYWNlIHdoZXJlIHRoZSBYIHByb3RvY29sIGhhcyBhbiBhZHZhbnRhZ2Ugb3ZlciB0aGUgVk5DCi0gICBwcm90b2NvbC4pIEkgc3VnZ2VzdCB1c2luZyB4c2V0cm9vdCwgZHRzdHlsZSBvciBzaW1pbGFyIHV0aWxpdHkgdG8gc2V0Ci0gICBhIHNvbGlkIGJhY2tncm91bmQgd2hpbGUgdXNpbmcgeDExdm5jLiBZb3UgY2FuIHR1cm4gdGhlIHByZXR0eQotICAgYmFja2dyb3VuZCBpbWFnZSBiYWNrIG9uIHdoZW4geW91IGFyZSB1c2luZyB0aGUgZGlzcGxheSBkaXJlY3RseS4KLSAgIFVwZGF0ZTogQXMgb2YgRmViLzIwMDUgeDExdm5jIGhhcyB0aGUgLXNvbGlkIFtjb2xvcl0gb3B0aW9uIHRoYXQgd29ya3MKLSAgIG9uIHJlY2VudCBHTk9NRSwgS0RFLCBhbmQgQ0RFIGFuZCBhbHNvIG9uIGNsYXNzaWMgWCAoYmFja2dyb3VuZCBpbWFnZQotICAgaXMgb24gdGhlIHJvb3Qgd2luZG93LikgVXBkYXRlOiBBcyBvZiBPY3QvMjAwNyB4MTF2bmMgaGFzIHRoZSAtbmNhY2hlCi0gICBvcHRpb24gdGhhdCBkb2VzIGEgcmVhc29uYWJsZSBqb2IgY2FjaGluZyB0aGUgYmFja2dyb3VuZCAoYW5kIG90aGVyKQotICAgcGl4bWFwIGRhdGEgb24gdGhlIHZpZXdlciBzaWRlLgotCi0gICBJIGFsc28gZmluZCB0aGUgVGlnaHRWTkMgZW5jb2RpbmcgZ2l2ZXMgdGhlIGJlc3QgcmVzcG9uc2UgZm9yIG15IHVzYWdlCi0gICAoVW5peCA8LT4gVW5peCBvdmVyIGNhYmxlIG1vZGVtLikgT25lIG5lZWRzIGEgdGlnaHR2bmMtYXdhcmUgdm5jdmlld2VyCi0gICB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGVuY29kaW5nLgotCi0gICBUQ1AgcG9ydCBpc3N1ZXM6ICAgTm90aWNlIHRoZSBsaW5lcwotICAxOC8wNy8yMDAzIDE0OjM2OjMxIEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAotICBQT1JUPTU5MDAKLQotICAgaW4gdGhlIG91dHB1dC4gNTkwMCBpcyB0aGUgZGVmYXVsdCBWTkMgbGlzdGVuaW5nIHBvcnQgKGp1c3QgbGlrZSA2MDAwCi0gICBpcyBYMTEncyBkZWZhdWx0IGxpc3RlbmluZyBwb3J0LikgSGFkIHBvcnQgNTkwMCBiZWVuIHRha2VuIGJ5IHNvbWUKLSAgIG90aGVyIGFwcGxpY2F0aW9uLCB4MTF2bmMgd291bGQgaGF2ZSBuZXh0IHRyaWVkIDU5MDEuIFRoYXQgd291bGQgbWVhbgotICAgdGhlIHZpZXdlciBjb21tYW5kIGFib3ZlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHZuY3ZpZXdlcgotICAgZmFyLWF3YXkuZWFzdDoxLiBZb3UgY2FuIGZvcmNlIHRoZSBwb3J0IHdpdGggdGhlICItcmZicG9ydCBOTk5OIgotICAgb3B0aW9uIHdoZXJlIE5OTk4gaXMgdGhlIGRlc2lyZWQgcG9ydCBudW1iZXIuIElmIHRoYXQgcG9ydCBpcyBhbHJlYWR5Ci0gICB0YWtlbiwgeDExdm5jIHdpbGwgZXhpdCBpbW1lZGlhdGVseS4gVGhlICItTiIgb3B0aW9uIHdpbGwgdHJ5IHRvIG1hdGNoCi0gICB0aGUgVk5DIGRpc3BsYXkgbnVtYmVyIHRvIHRoZSBYIGRpc3BsYXkuICAgKGFsc28gc2VlIHRoZSAiU3VuUmF5Ci0gICBHb3RjaGEiIG5vdGUgYmVsb3cpCi0KLSAgIE9wdGlvbnM6ICAgeDExdm5jIGhhcyAoZmFyIHRvbykgbWFueSBmZWF0dXJlcyB0aGF0IG1heSBiZSBhY3RpdmF0ZWQKLSAgIHZpYSBpdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMuIFVzZWZ1bCBvcHRpb25zIGFyZSwgZS5nLiwgLXNjYWxlIHRvIGRvCi0gICBzZXJ2ZXItc2lkZSBzY2FsaW5nLCBhbmQgLXJmYmF1dGggcGFzc3dkLWZpbGUgdG8gdXNlIFZOQyBwYXNzd29yZAotICAgcHJvdGVjdGlvbiAodGhlIHZuY3Bhc3N3ZCBvciBzdG9yZXBhc3N3ZCBwcm9ncmFtcywgb3IgdGhlIHgxMXZuYwotICAgLXN0b3JlcGFzc3dkIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHBhc3N3b3JkIGZpbGUuKQotCi0gICBBbGdvcml0aG06ICAgSG93IGRvZXMgeDExdm5jIGRvIGl0PyBSYXRoZXIgYnJ1dGUtZm9yY2VkbHk6IGl0Ci0gICBjb250aW51b3VzbHkgcG9sbHMgdGhlIFgxMSBmcmFtZWJ1ZmZlciBmb3IgY2hhbmdlcyB1c2luZwotICAgWFNobUdldEltYWdlKCkuIFdoZW4gY2hhbmdlcyBhcmUgZGlzY292ZXJlZCwgaXQgaW5zdHJ1Y3RzIGxpYnZuY3NlcnZlcgotICAgd2hpY2ggcmVjdGFuZ3VsYXIgcmVnaW9ucyBvZiB0aGUgZnJhbWVidWZmZXIgaGF2ZSBjaGFuZ2VkLCBhbmQKLSAgIGxpYnZuY3NlcnZlciBjb21wcmVzc2VzIHRoZSBjaGFuZ2VzIGFuZCBzZW5kcyB0aGVtIG9mZiB0byBhbnkKLSAgIGNvbm5lY3RlZCBWTkMgdmlld2Vycy4gQSBudW1iZXIgb2YgYXBwbGljYXRpb25zIGRvIHNpbWlsYXIgdGhpbmdzLAotICAgc3VjaCBhcyB4MHJmYnNlcnZlciwga3JmYiwgeDB2bmNzZXJ2ZXIsIHZpbm8uIHgxMXZuYyB1c2VzIGEgMzIgeCAzMgotICAgcGl4ZWwgdGlsZSBtb2RlbCAodGhlIGRlc2t0b3AgaXMgZGVjb21wb3NlZCBpbnRvIHJvdWdobHkgMTAwMCBzdWNoCi0gICB0aWxlcyksIHdoZXJlIGNoYW5nZWQgdGlsZXMgYXJlIGZvdW5kIGJ5IHBzZXVkby1yYW5kb21seSBwb2xsaW5nIDEKLSAgIHBpeGVsIHRhbGwgaG9yaXpvbnRhbCBzY2FubGluZXMgc2VwYXJhdGVkIHZlcnRpY2FsbHkgYnkgMzIgcGl4ZWxzLgotICAgVGhpcyBpcyBhIHN1cnByaXNpbmdseSBlZmZlY3RpdmUgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGNoYW5nZWQKLSAgIHJlZ2lvbnMuIEZvciBrZXlib2FyZCBhbmQgbW91c2UgdXNlciBpbnB1dCB0aGUgWFRFU1QgZXh0ZW5zaW9uIGlzIHVzZWQKLSAgIHRvIHBhc3MgdGhlIGlucHV0IGV2ZW50cyB0byB0aGUgWCBzZXJ2ZXIuIFRvIGRldGVjdCBYQmVsbCAiYmVlcHMiIHRoZQotICAgWEtFWUJPQVJEIGV4dGVuc2lvbiBpcyB1c2VkLiBJZiBhdmFpbGFibGUsIHRoZSBYRklYRVMgZXh0ZW5zaW9uIGlzCi0gICB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBzaGFwZS4gQWxzbywgaWYgYXZhaWxhYmxlCi0gICB0aGUgWCBEQU1BR0UgZXh0ZW5zaW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBoaW50cyBmcm9tIHRoZSBYIHNlcnZlcgotICAgd2hlcmUgbW9kaWZpZWQgcmVnaW9ucyBvbiB0aGUgc2NyZWVuIGFyZS4gVGhpcyBncmVhdGx5IHJlZHVjZXMgdGhlCi0gICBzeXN0ZW0gbG9hZCB3aGVuIG5vdCBtdWNoIGlzIGNoYW5naW5nIG9uIHRoZSBzY3JlZW4gYW5kIGFsc28gaW1wcm92ZXMKLSAgIGhvdyBxdWlja2x5IHRoZSBzY3JlZW4gaXMgdXBkYXRlZC4KLQotICAgQmFyYmVyc2hvcCBtaXJyb3JzIGVmZmVjdDogICBXaGF0IGlmIHgxMXZuYyBpcyBzdGFydGVkIHVwLCBhbmQKLSAgIHZuY3ZpZXdlciBpcyB0aGVuIHN0YXJ0ZWQgdXAgb24gdGhlIHNhbWUgbWFjaGluZSBhbmQgZGlzcGxheWVkIG9uIHRoZQotICAgc2FtZSBkaXNwbGF5IHgxMXZuYyBpcyBwb2xsaW5nPyBPbmUgbWlnaHQgImFjY2lkZW50YWxseSIgZG8gdGhpcyB3aGVuCi0gICBmaXJzdCB0ZXN0aW5nIG91dCB0aGUgcHJvZ3JhbXMuIFlvdSBnZXQgYW4gaW50ZXJlc3RpbmcKLSAgIHJlY3Vyc2l2ZS9mZWVkYmFjayBlZmZlY3Qgd2hlcmUgdm5jdmlld2VyIGltYWdlcyBrZWVwIHBvcHBpbmcgdXAgZWFjaAotICAgb25lIGNvbnRhaW5lZCBpbiB0aGUgcHJldmlvdXMgb25lIGFuZCBzbGlnaHRseSBzaGlmdGVkIGEgYml0IGJ5IHRoZQotICAgd2luZG93IG1hbmFnZXIgZGVjb3JhdGlvbnMuIFRoZXJlIHdpbGwgYmUgYW4gZXZlbiBtb3JlIGludGVyZXN0aW5nCi0gICBlZmZlY3QgaWYgLXNjYWxlIGlzIHVzZWQuIEFsc28sIGlmIHRoZSBYS0VZQk9BUkQgaXMgc3VwcG9ydGVkIGFuZCB0aGUKLSAgIFhCZWxsICJiZWVwcyIgb25jZSwgeW91IGdldCBhbiBpbmZpbml0ZSBsb29wIG9mIGJlZXBzIGdvaW5nIG9mZi4KLSAgIEFsdGhvdWdoIGFsbCBvZiB0aGlzIGlzIG1pbGRseSBleGNpdGluZyBpdCBpcyBub3QgbXVjaCB1c2U6IHlvdSB3aWxsCi0gICBub3JtYWxseSBydW4gYW5kIGRpc3BsYXkgdGhlIHZpZXdlciBvbiBhIGRpZmZlcmVudCBtYWNoaW5lIQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgU3VuIFJheSBOb3RlczoKLQotICAgWW91IGNhbiBydW4geDExdm5jIG9uIHlvdXIgKGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQpIFN1blJheSBzZXNzaW9uLgotICAgSGVyZSBhcmUgc29tZSBub3RlcyBvbiBTdW5SYXkgdXNhZ2Ugd2l0aCB4MTF2bmMuCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgIExpbWl0YXRpb25zOgotCi0gICAgICogRHVlIHRvIHRoZSBwb2xsaW5nIG5hdHVyZSwgc29tZSBhY3Rpdml0aWVzIChvcGFxdWUgd2luZG93IG1vdmVzLAotICAgICAgIHNjcm9sbGluZyksIGNhbiBiZSBwcmV0dHkgY2hvcHB5L3JhZ2dlZCBhbmQgb3RoZXJzIChleHBvc3VyZXMgb2YKLSAgICAgICBsYXJnZSBhcmVhcykgc2xvdy4gRXhwZXJpbWVudCB3aXRoIGludGVyYWN0aW5nIGEgYml0IGRpZmZlcmVudGx5Ci0gICAgICAgdGhhbiB5b3Ugbm9ybWFsbHkgZG8gdG8gbWluaW1pemUgdGhlIGVmZmVjdHMgKGUuZy4gZG8gZnVsbHBhZ2UKLSAgICAgICBwYWdpbmcgcmF0aGVyIHRoYW4gbGluZS1ieS1saW5lIHNjcm9sbGluZywgYW5kIG1vdmUgd2luZG93cyBpbiBhCi0gICAgICAgc2luZ2xlLCBxdWljayBtb3Rpb24uKSBSZWNlbnQgd29yayBoYXMgcHJvdmlkZWQgdGhlCi0gICAgICAgLXNjcm9sbGNvcHlyZWN0IGFuZCAtd2lyZWZyYW1lIHNwZWVkdXBzIHVzaW5nIHRoZSBDb3B5UmVjdCBWTkMKLSAgICAgICBlbmNvZGluZyBhbmQgb3RoZXIgdGhpbmdzLCBidXQgdGhleSBvbmx5IHNwZWVkIHVwIHNvbWUgYWN0aXZpdGllcywKLSAgICAgICBub3QgYWxsLgotICAgICAqIEEgcmF0ZSBsaW1pdGluZyBmYWN0b3IgZm9yIHgxMXZuYyBwZXJmb3JtYW5jZSBpcyB0aGF0IGdyYXBoaWNzCi0gICAgICAgaGFyZHdhcmUgaXMgb3B0aW1pemVkIGZvciB3cml0aW5nLCBub3QgcmVhZGluZyAoeDExdm5jIHJlYWRzIHRoZQotICAgICAgIHZpZGVvIGZyYW1lYnVmZmVyIGZvciB0aGUgc2NyZWVuIGltYWdlIGRhdGEuKSBUaGUgZGlmZmVyZW5jZSBjYW4KLSAgICAgICBiZSBhIGZhY3RvciBvZiAxMCB0byAxMDAwLCBhbmQgc28gaXQgdXN1YWxseSB0YWtlcyBhYm91dCAwLjUtMSBzZWMKLSAgICAgICB0byByZWFkIGluIHRoZSB3aG9sZSB2aWRlbyBoYXJkd2FyZSBmcmFtZWJ1ZmZlciAoZS5nLiA1TUIgZm9yCi0gICAgICAgMTI4MHgxMDI0IGF0IGRlcHRoIDI0IHdpdGggYSByZWFkIHJhdGUgb2YgNS0xME1CL3NlYy4pIFNvIHdoZW5ldmVyCi0gICAgICAgYWN0aXZpdHkgY2hhbmdlcyBtb3N0IG9mIHRoZSBzY3JlZW4gKGUuZy4gbW92aW5nIG9yIGljb25pZnlpbmcgYQotICAgICAgIGxhcmdlIHdpbmRvdykgdGhlcmUgaXMgYSBkZWxheSBvZiAwLjUtMSBzZWMgd2hpbGUgeDExdm5jIHJlYWRzIHRoZQotICAgICAgIGNoYW5nZWQgcmVnaW9ucyBpbi4KLSAgICAgICBBIHNsb3cgZnJhbWVidWZmZXIgcmVhZCByYXRlIHdpbGwgb2Z0ZW4gYmUgdGhlIHBlcmZvcm1hbmNlCi0gICAgICAgYm90dGxlbmVjayBvbiBhIGZhc3QgTEFOICh3aGVyZWFzIG9uIHNsb3dlciBsaW5rcyB0aGUgcmVkdWNlZAotICAgICAgIG5ldHdvcmsgYmFuZHdpZHRoIGJlY29tZXMgdGhlIGJvdHRsZW5lY2suKQotICAgICAgIE5vdGU6IEEgcXVpY2sgd2F5IHRvIGdldCBhIDJYIHNwZWVkdXAgb2YgdGhpcyBmb3IgeDExdm5jIGlzIHRvCi0gICAgICAgc3dpdGNoIHlvdXIgWCBzZXJ2ZXIgZnJvbSBkZXB0aCAyNCAoMzJicHApIHRvIGRlcHRoIDE2ICgxNmJwcC4pCi0gICAgICAgWW91IGdldCBhIDRYIHNwZWVkdXAgZ29pbmcgdG8gOGJwcCwgYnV0IHRoZSBsYWNrIG9mIGNvbG9yIGNlbGxzIGlzCi0gICAgICAgdXN1YWxseSB1bmFjY2VwdGFibGUuCi0gICAgICAgVG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIHJlYWQgYW5kIHdyaXRlIHNwZWVkcyBvZiB5b3VyIHZpZGVvIGNhcmQsCi0gICAgICAgeW91IGNhbiBydW4gYmVuY2htYXJrcyBsaWtlOiAieDExcGVyZiAtZ2V0aW1hZ2U1MDAiLCAgIngxMXBlcmYKLSAgICAgICAtcHV0aW1hZ2U1MDAiLCAgIngxMXBlcmYgLXNobXB1dDUwMCIgYW5kIGZvciBYRnJlZTg2IGRpc3BsYXlzIHdpdGgKLSAgICAgICBkaXJlY3QgZ3JhcGhpY3MgYWNjZXNzIHRoZSAiZGdhIiBjb21tYW5kIChwcmVzcyAiYiIgdG8gcnVuIHRoZQotICAgICAgIGJlbmNobWFyayBhbmQgdGhlbiBhZnRlciBhIGZldyBzZWNvbmRzIHByZXNzICJxIiB0byBxdWl0LikgRXZlbgotICAgICAgIHRoaXMgImRkIGlmPS9kZXYvZmIwIG9mPS9kZXYvbnVsbCIgb2Z0ZW4gZ2l2ZXMgYSBnb29kIGVzdGltYXRlLgotICAgICAgIHgxMXZuYyBhbHNvIHByaW50cyBvdXQgaXRzIGVzdGltYXRlOgotICAyOC8wMi8yMDA5IDExOjExOjA3IEF1dG9wcm9iaW5nIFRDUCBwb3J0Ci0gIDI4LzAyLzIwMDkgMTE6MTE6MDcgQXV0b3Byb2Jpbmcgc2VsZWN0ZWQgcG9ydCA1OTAwCi0gIDI4LzAyLzIwMDkgMTE6MTE6MDggZmIgcmVhZCByYXRlOiAxMCBNQi9zZWMKLSAgMjgvMDIvMjAwOSAxMToxMTowOCBzY3JlZW4gc2V0dXAgZmluaXNoZWQuCi0gICAgICAgV2UgaGF2ZSBzZWVuIGEgZmV3IGNhc2VzIHdoZXJlIHRoZSBoYXJkd2FyZSBmYiByZWFkIHNwZWVkIGlzCi0gICAgICAgZ3JlYXRlciB0aGFuIDY1IE1CL3NlYzogb24gaGlnaCBlbmQgZ3JhcGhpY3Mgd29ya3N0YXRpb25zIGZyb20gU0dJCi0gICAgICAgYW5kIFN1biwgYW5kIGFsc28gZnJvbSBhIExpbnV4IHVzZXIgdXNpbmcgbnZpZGlhIHByb3ByaWV0YXJ5Ci0gICAgICAgZHJpdmVycyBmb3IgaGlzIG52aWRpYSB2aWRlbyBjYXJkLiBVcGRhdGUgMjAwODogdGhhbmtmdWxseSwgdGhlc2UKLSAgICAgICBzcGVkIHVwIGRyaXZlcnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uIG9uIExpbnV4IGFuZCAqQlNEIHN5c3RlbXMKLSAgICAgICBhbmQgdGhhdCBtYWtlcyB4MTF2bmMgcnVuIHNvbWV3aGF0IG1vcmUgcXVpY2tseS4gU29tZXRpbWVzIHRoZXkKLSAgICAgICBoYXZlIGEgcmVhZCByYXRlIG9mIG92ZXIgNDAwIE1CL3NlYy4KLSAgICAgICBPbiBYRnJlZTg2L1hvcmcgaXQgaXMgYWN0dWFsbHkgcG9zc2libGUgdG8gaW5jcmVhc2UgdGhlCi0gICAgICAgZnJhbWVidWZmZXIgcmVhZCBzcGVlZCBjb25zaWRlcmFibHkgKDEwLTEwMCB0aW1lcykgYnkgdXNpbmcgdGhlCi0gICAgICAgU2hhZG93IEZyYW1lYnVmZmVyIChhIGNvcHkgb2YgdGhlIGZyYW1lYnVmZmVyIGlzIGtlcHQgaW4gbWFpbgotICAgICAgIG1lbW9yeSBhbmQgdGhpcyBjYW4gYmUgcmVhZCBtdWNoIG1vcmUgcXVpY2tseS4pIFRvIGRvIHRoaXMgb25lCi0gICAgICAgcHV0cyB0aGUgbGluZSBPcHRpb24gIlNoYWRvd0ZCIiAidHJ1ZSIgaW4gdGhlIERldmljZSBzZWN0aW9uIG9mCi0gICAgICAgdGhlIC9ldGMvWDExL1hGODZDb25maWcgb3IgL2V0Yy9YMTEveG9yZy5jb25mIGZpbGUuIE5vdGUgdGhhdCB0aGlzCi0gICAgICAgZGlzYWJsZXMgMkQgYWNjZWxlcmF0aW9uIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5IGFuZCBzbyB0aGF0IG1pZ2h0Ci0gICAgICAgYmUgdW5hY2NlcHRhYmxlIGlmIG9uZSBwbGF5cyBnYW1lcywgZXRjLiBvbiB0aGUgbWFjaGluZSdzIGxvY2FsCi0gICAgICAgZGlzcGxheS4gTmV2ZXJ0aGVsZXNzIHRoaXMgY291bGQgYmUgaGFuZHkgaW4gc29tZSBjaXJjdW1zdGFuY2VzLAotICAgICAgIGUuZy4gaWYgdGhlIHNsb3dlciBzcGVlZCB3aGlsZSBzaXR0aW5nIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5IHdhcwotICAgICAgIGFjY2VwdGFibGUgKHRoaXMgc2VlbXMgdG8gYmUgdHJ1ZSBmb3IgbW9zdCB2aWRlbyBjYXJkcyB0aGVzZQotICAgICAgIGRheXMuKSBVbmZvcnR1bmF0ZWx5IGl0IGRvZXMgbm90IHNlZW0gc2hhZG93ZmIgY2FuIGJlIHR1cm5lZCBvbgotICAgICAgIGFuZCBvZmYgZHluYW1pY2FsbHkuLi4KLSAgICAgICBBbm90aGVyIGFtdXNpbmcgdGhpbmcgb25lIGNhbiBkbyBpcyB1c2UgWHZmYiBhcyB0aGUgWCBzZXJ2ZXIsIGUuZy4KLSAgICAgICAieGluaXQgJEhPTUUvLnhpbml0cmMgLS0gL3Vzci9YMTFSNi9iaW4vWHZmYiA6MSAtc2NyZWVuIDAKLSAgICAgICAxMDI0eDc2OHgxNiIgeDExdm5jIGNhbiBwb2xsIFh2ZmIgZWZmaWNpZW50bHkgdmlhIG1haW4gbWVtb3J5LgotICAgICAgIEl0J3Mgbm90IGV4YWN0bHkgY2xlYXIgd2h5IG9uZSB3b3VsZCB3YW50IHRvIGRvIHRoaXMgaW5zdGVhZCBvZgotICAgICAgIHVzaW5nIHZuY3NlcnZlci9Ydm5jLCAocGVyaGFwcyB0byB0YWtlIGFkdmFudGFnZSBvZiBhbiB4MTF2bmMKLSAgICAgICBmZWF0dXJlLCBzdWNoIGFzIGZyYW1lYnVmZmVyIHNjYWxpbmcgb3IgYnVpbHQtaW4gU1NMIGVuY3J5cHRpb24pLAotICAgICAgIGJ1dCB3ZSBtZW50aW9uIGl0IGJlY2F1c2UgaXQgbWF5IGJlIG9mIHVzZSBmb3Igc3BlY2lhbCBwdXJwb3NlCi0gICAgICAgYXBwbGljYXRpb25zLiBZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSAiLWNjIDQiIG9wdGlvbiB0byBmb3JjZSBYdmZiCi0gICAgICAgdG8gdXNlIGEgVHJ1ZUNvbG9yIHZpc3VhbCBpbnN0ZWFkIG9mIERpcmVjdENvbG9yLiBTZWUgYWxzbyB0aGUKLSAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgLWNyZWF0ZSBvcHRpb24gdGhhdCBkb2VzIGFsbCBvZiB0aGlzCi0gICAgICAgYXV0b21hdGljYWxseSBmb3IgeW91IChiZSBzdXJlIHRvIGluc3RhbGwgdGhlIFh2ZmIgcGFja2FnZSwgZS5nLgotICAgICAgIGFwdC1nZXQgaW5zdGFsbCB4dmZiLikKLSAgICAgICBBbHNvLCBhIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZSB3YXkgaXMgdG8gdXNlIHRoZSAiZHVtbXkiCi0gICAgICAgWG9yZy9YRnJlZTg2IGRldmljZSBkcml2ZXIgKG9yIG91ciBYZHVtbXkgd3JhcHBlciBzY3JpcHQuKSBTZWUKLSAgICAgICB0aGlzIEZBUSBmb3IgZGV0YWlscy4KLSAgICAgKiBTb21ld2hhdCBzdXJwcmlzaW5nbHksIHRoZSBYMTEgbW91c2UgKGN1cnNvcikgc2hhcGUgaXMgd3JpdGUtb25seQotICAgICAgIGFuZCBjYW5ub3QgYmUgcXVlcmllZCBmcm9tIHRoZSBYIHNlcnZlci4gU28gdHJhZGl0aW9uYWxseSBpbgotICAgICAgIHgxMXZuYyB0aGUgY3Vyc29yIHNoYXBlIHN0YXlzIGZpeGVkIGF0IGFuIGFycm93LiAoc2VlIHRoZSAiLWN1cnNvcgotICAgICAgIFgiIGFuZCAiLWN1cnNvciBzb21lIiBvcHRpb25zLCBob3dldmVyLCBmb3IgYSBwYXJ0aWFsIGhhY2sgZm9yIHRoZQotICAgICAgIHJvb3Qgd2luZG93LCBldGMuKSBIb3dldmVyLCBvbiBTb2xhcmlzIHVzaW5nIHRoZSBTVU5fT1ZMIG92ZXJsYXkKLSAgICAgICBleHRlbnNpb24sIHgxMXZuYyBjYW4gc2hvdyB0aGUgY29ycmVjdCBtb3VzZSBjdXJzb3Igd2hlbiB0aGUKLSAgICAgICAtb3ZlcmxheSBvcHRpb24gaXMgYWxzbyBzdXBwbGllZC4gQSBzaW1pbGFyIHRoaW5nIGlzIGRvbmUgb24gSVJJWAotICAgICAgIGFzIHdlbGwgd2hlbiAtb3ZlcmxheSBpcyBzdXBwbGllZC4KLSAgICAgICBNb3JlIGdlbmVyYWxseSwgYXMgb2YgRGVjLzIwMDQgeDExdm5jIHN1cHBvcnRzIHRoZSBuZXcgWEZJWEVTCi0gICAgICAgZXh0ZW5zaW9uIChpbiBYb3JnIGFuZCBTb2xhcmlzIDEwKSB0byBxdWVyeSB0aGUgWCBzZXJ2ZXIgZm9yIHRoZQotICAgICAgIGV4YWN0IGN1cnNvciBzaGFwZSwgdGhpcyB3b3JrcyBwcmV0dHkgd2VsbCBleGNlcHQgdGhhdCBjdXJzb3JzCi0gICAgICAgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhIGNoYW5uZWwpIG5lZWQgdG8gYXBwcm94aW1hdGVkIHRvIHNvbGlkCi0gICAgICAgUkdCIHZhbHVlcyAoc29tZSBjdXJzb3JzIGxvb2sgd29yc2UgdGhhbiBvdGhlcnMuKQotICAgICAqIEF1ZGlvIGZyb20gYXBwbGljYXRpb25zIGlzIG9mIGNvdXJzZSBub3QgcmVkaXJlY3RlZCAoc2VwYXJhdGUKLSAgICAgICByZWRpcmVjdG9ycyBkbyBleGlzdCwgZS5nLiBlc2QsIHNlZSB0aGUgRkFRIG9uIHRoaXMgYmVsb3cuKSBUaGUKLSAgICAgICBYQmVsbCgpICJiZWVwcyIgd2lsbCB3b3JrIGlmIHRoZSBYIHNlcnZlciBzdXBwb3J0cyB0aGUgWEtFWUJPQVJECi0gICAgICAgZXh0ZW5zaW9uLiAoTm90ZSB0aGF0IG9uIFNvbGFyaXMgWEtFWUJPQVJEIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gICAgICAgUGFzc2luZyAra2IgdG8gWHN1biBlbmFibGVzIGl0LikKLSAgICAgKiBUaGUgc2Nyb2xsIGRldGVjdGlvbiBhbGdvcml0aG0gZm9yIHRoZSAtc2Nyb2xsY29weXJlY3Qgb3B0aW9uIGNhbgotICAgICAgIGdpdmUgY2hvcHB5IG9yIGJ1bmNoZWQgdXAgdHJhbnNpZW50IG91dHB1dCBhbmQgb2NjYXNpb25hbGx5Ci0gICAgICAgcGFpbnRpbmcgZXJyb3JzLgotICAgICAqIFVzaW5nIC10aHJlYWRzIGNhbiBleHBvc2Ugc29tZSBidWdzL2NyYXNoZXMgaW4gbGlidm5jc2VydmVyLgotCi0gICBQbGVhc2UgZmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgcHJvYmxlbXMsIG9yCi0gICBjb21tZW50cyBhYm91dCB4MTF2bmMsIGV0Yy4gUGxlYXNlIGJlIHBvbGl0ZSwgdGhvcm91Z2gsIGFuZCBub3QKLSAgIGRlbWFuZGluZyAoc2FkbHksIHRoZSBudW1iZXIgb2YgcGVvcGxlIGNvbnRhY3RpbmcgbWUgdGhhdCBhcmUgcnVkZSBhbmQKLSAgIGRlbWFuZGluZyBpcyBpbmNyZWFzaW5nIGRyYW1hdGljYWxseS4pCi0gICBBbHNvLCBzb21lIHBlb3BsZSBhc2sgaWYgdGhleSBjYW4gbWFrZSBhIGRvbmF0aW9uLCBzZWUgdGhpcyBsaW5rIGZvcgotICAgdGhhdC4KLQkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sOgotCi0KLSAgIHgxMXZuYyBIb21lICAgIERvbmF0aW9ucwotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgeDExdm5jIEZBUToKLQotCi0gICBbQnVpbGRpbmcgYW5kIFN0YXJ0aW5nXQotCi0gICBRLTE6IEkgY2FuJ3QgZ2V0IHgxMXZuYyB0byBzdGFydCB1cC4gSXQgc2F5cyAiWE9wZW5EaXNwbGF5IGZhaWxlZAotICAgKG51bGwpIiBvciAiWGxpYjogY29ubmVjdGlvbiB0byAiOjAuMCIgcmVmdXNlZCBieSBzZXJ2ZXIgWGxpYjogTm8KLSAgIHByb3RvY29sIHNwZWNpZmllZCIgYW5kIHRoZW4gZXhpdHMuIFdoYXQgZG8gSSBuZWVkIHRvIGRvPyAKLQotICAgUS0yOiBJIGNhbid0IGdldCB4MTF2bmMgYW5kL29yIGxpYnZuY3NlcnZlciB0byBjb21waWxlLiAKLQotICAgUS0zOiBJIGp1c3QgYnVpbHQgeDExdm5jIHN1Y2Nlc3NmdWxseSwgYnV0IHdoZW4gSSB1c2UgaXQgbXkga2V5c3Ryb2tlcwotICAgYW5kIG1vdXNlIGJ1dHRvbiBjbGlja3MgYXJlIGlnbm9yZWQgIChJIGFtIGFibGUgdG8gbW92ZSB0aGUgbW91c2UKLSAgIHRob3VnaC4pIAotCi0gICBRLTQ6IEhlbHAsIEkgbmVlZCB0byBydW4geDExdm5jIG9uIFNvbGFyaXMgMi41LjEgKG9yIG90aGVyIG9sZAotICAgVW5peC9MaW51eCkgYW5kIGl0IGRvZXNuJ3QgY29tcGlsZSEgCi0KLSAgIFEtNTogV2hlcmUgY2FuIEkgZ2V0IGEgcHJlY29tcGlsZWQgeDExdm5jIGJpbmFyeSBmb3IgbXkgT3BlcmF0aW5nCi0gICBTeXN0ZW0/IAotCi0gICBRLTY6IFdoZXJlIGNhbiBJIGdldCBhIFZOQyBWaWV3ZXIgYmluYXJ5IChvciBzb3VyY2UgY29kZSkgZm9yIHRoZQotICAgT3BlcmF0aW5nIFN5c3RlbSBJIHdpbGwgYmUgdmlld2luZyBmcm9tPyAKLQotICAgUS03OiBIb3cgY2FuIEkgc2VlIGFsbCBvZiB4MTF2bmMncyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQKLSAgIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVtPyAKLQotICAgUS04OiBJIGRvbid0IGxpa2UgdHlwaW5nIGFyY2FuZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBldmVyeSB0aW1lIEkKLSAgIHN0YXJ0IHgxMXZuYy4gV2hhdCBjYW4gSSBkbz8gSXMgdGhlcmUgYSBjb25maWcgZmlsZT8gT3IgYSBHVUk/IAotCi0gICBRLTk6IEhvdyBjYW4gSSBnZXQgdGhlIEdVSSB0byBydW4gaW4gdGhlIFN5c3RlbSBUcmF5LCBvciBhdCBsZWFzdCBiZSBhCi0gICBzbWFsbGVyLCBzaW1wbGVyIGljb24/IAotCi0gICBRLTEwOiBIb3cgY2FuIEkgZ2V0IHgxMXZuYyB0byBsaXN0ZW4gb24gYSBkaWZmZXJlbnQgcG9ydCBiZXNpZGVzIHRoZQotICAgZGVmYXVsdCBWTkMgcG9ydCAoNTkwMCk/IAotCi0gICBRLTExOiBNeSBGaXJld2FsbC9Sb3V0ZXIgZG9lc24ndCBhbGxvdyBWTkMgVmlld2VycyB0byBjb25uZWN0IHRvCi0gICB4MTF2bmMuIAotCi0gICBRLTEyOiBJcyBpdCBwb3NzaWJsZSBmb3IgYSBWTkMgVmlld2VyIGFuZCBhIFZOQyBTZXJ2ZXIgdG8gY29ubmVjdCB0bwotICAgZWFjaCBvdGhlciBldmVuIHRob3VnaCBib3RoIGFyZSBiZWhpbmQgRmlyZXdhbGxzIHRoYXQgYmxvY2sgYWxsCi0gICBpbmNvbWluZyBjb25uZWN0aW9ucz8gCi0KLSAgIFEtMTM6IENhbiBJIG1ha2UgeDExdm5jIG1vcmUgcXVpZXQgYW5kIGFsc28gZ28gaW50byB0aGUgYmFja2dyb3VuZAotICAgYWZ0ZXIgc3RhcnRpbmcgdXA/IAotCi0gICBRLTE0OiBTb21ldGltZXMgd2hlbiBhIFZOQyB2aWV3ZXIgZGllcyBhYnJ1cHRseSwgeDExdm5jIGFsc28gZGllcyB3aXRoCi0gICB0aGUgZXJyb3IgbWVzc2FnZSBsaWtlOiAiQnJva2VuIHBpcGUiLiBJJ20gdXNpbmcgdGhlIC1mb3JldmVyIG1vZGUgYW5kCi0gICBJIHdhbnQgeDExdm5jIHRvIGtlZXAgcnVubmluZy4gCi0KLSAgIFEtMTU6IFRoZSBXaW5kb3dzIFRpZ2h0Vk5DIDEuMy45IFZpZXdlciBjYW5ub3QgY29ubmVjdCB0byB4MTF2bmMuIAotCi0gICBRLTE2OiBLREUncyBrcmRjIFZOQyB2aWV3ZXIgY2Fubm90IGNvbm5lY3QgdG8geDExdm5jLiAKLQotICAgUS0xNzogV2hlbiBJIHN0YXJ0IHgxMXZuYyBvbiBhbiBBbHBoYSBUcnU2NCB3b3Jrc3RhdGlvbiB0aGUgWCBzZXJ2ZXIKLSAgIGNyYXNoZXMhIAotCi0gICBRLTE4OiBXaGVuIHJ1bm5pbmcgeDExdm5jIG9uIGFuIElCTSBBSVggd29ya3N0YXRpb24gYWZ0ZXIgYSBmZXcKLSAgIG1pbnV0ZXMgdGhlIFZOQyBjb25uZWN0aW9uIGZyZWV6ZXMuIAotCi0gICBRLTE5OiBBcmUgdGhlcmUgYW55IGJ1aWxkLXRpbWUgY3VzdG9taXphdGlvbnMgcG9zc2libGUsIGUuZy4gY2hhbmdlCi0gICBkZWZhdWx0cywgY3JlYXRlIGEgc21hbGxlciBiaW5hcnksIGV0Yz8gCi0KLSAgIFtXaW4yVk5DIFJlbGF0ZWRdCi0KLSAgIFEtMjA6IEkgaGF2ZSB0d28gc2VwYXJhdGUgbWFjaGluZSBkaXNwbGF5cyBpbiBmcm9udCBvZiBtZSwgb25lIFdpbmRvd3MKLSAgIHRoZSBvdGhlciBYMTE6IGNhbiBJIHVzZSB4MTF2bmMgaW4gY29tYmluYXRpb24gd2l0aCBXaW4yVk5DIGluCi0gICBkdWFsLXNjcmVlbiBtb2RlIHRvIHBhc3MgdGhlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdGlvbnMgdG8gdGhlIFgxMQotICAgZGlzcGxheT8gCi0KLSAgIFEtMjE6IEkgYW0gcnVubmluZyBXaW4yVk5DIG9uIG15IFdpbmRvd3MgbWFjaGluZSBhbmQgIngxMXZuYyAtbm9mYiIgb24KLSAgIFVuaXggdG8gcGFzcyBrZXlib2FyZCBhbmQgbW91c2UgdG8gdGhlIFVuaXggbW9uaXRvci4gV2hlbmV2ZXIgSSBzdGFydAotICAgV2luMlZOQyBpdCBxdWlja2x5IGRpc2Nvbm5lY3RzIGFuZCB4MTF2bmMgc2F5czoKLSAgIHJmYlByb2Nlc3NDbGllbnROb3JtYWxNZXNzYWdlOiByZWFkOiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIgCi0KLSAgIFEtMjI6IENhbiBJIHJ1biAieDExdm5jIC1ub2ZiIiBvbiBhIE1hYyBPUyBYIG1hY2hpbmUgdG8gcmVkaXJlY3QgbW91c2UKLSAgIGFuZCBrZXlib2FyZCBpbnB1dCB0byBpdCBmcm9tIFdpbmRvd3MgYW5kIFgxMSBtYWNoaW5lcyB2aWEgV2luMlZOQyBhbmQKLSAgIHgydm5jLCByZXNwZWN0aXZlbHk/IAotCi0gICBbQ29sb3IgSXNzdWVzXQotCi0gICBRLTIzOiBUaGUgWCBkaXNwbGF5IEkgcnVuIHgxMXZuYyBvbiBpcyBvbmx5IDggYml0cyBwZXIgcGl4ZWwgKGJwcCkKLSAgIFBzZXVkb0NvbG9yIChpLmUuIG9ubHkgMjU2IGRpc3RpbmN0IGNvbG9ycy4pIFRoZSB4MTF2bmMgY29sb3JzIG1heQotICAgc3RhcnQgb3V0IE9LLCBidXQgYWZ0ZXIgYSB3aGlsZSB0aGV5IGFyZSBpbmNvcnJlY3QgaW4gY2VydGFpbiB3aW5kb3dzLgotICAgCi0gICBRLTI0OiBDb2xvciBwcm9ibGVtczogV2h5IGFyZSB0aGUgY29sb3JzIGZvciBzb21lIHdpbmRvd3MgaW5jb3JyZWN0IGluCi0gICB4MTF2bmM/IEJUVywgbXkgWCBkaXNwbGF5IGhhcyBuaWNlIG92ZXJsYXkvbXVsdGktZGVwdGggdmlzdWFscyBvZgotICAgZGlmZmVyZW50IGNvbG9yIGRlcHRoczogZS5nLiB0aGVyZSBhcmUgYm90aCBkZXB0aCA4IGFuZCAyNCB2aXN1YWxzCi0gICBhdmFpbGFibGUgYXQgdGhlIHNhbWUgdGltZS4gCi0KLSAgIFEtMjU6IEkgYW0gb24gYSBoaWdoIGNvbG9yIHN5c3RlbSAoZGVwdGggPj0gMjQpIGJ1dCBJIHNlZW0gdG8gaGF2ZQotICAgY29sb3JtYXAgcHJvYmxlbXMuIFRoZXkgZWl0aGVyIGZsYXNoIG9yIGV2ZXJ5dGhpbmcgaXMgdmVyeSBkYXJrLiAKLQotICAgUS0yNjogSG93IGRvIEkgZmlndXJlIG91dCB0aGUgd2luZG93IGlkIHRvIHN1cHBseSB0byB0aGUgLWlkIHdpbmRvd2lkCi0gICBvcHRpb24/IAotCi0gICBRLTI3OiBXaHkgZG9uJ3QgbWVudXMgb3Igb3RoZXIgdHJhbnNpZW50IHdpbmRvd3MgY29tZSB1cCB3aGVuIEkgYW0KLSAgIHVzaW5nIHRoZSAtaWQgd2luZG93aWQgb3B0aW9uIHRvIHZpZXcgYSBzaW5nbGUgYXBwbGljYXRpb24gd2luZG93PyAKLQotICAgUS0yODogTXkgWCBkaXNwbGF5IGlzIGRlcHRoIDI0IGF0IDI0YnBwIChpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZGVwdGgKLSAgIDI0IGF0IDMyYnBwLikgSSdtIGhhdmluZyBsb3RzIG9mIGNvbG9yIGFuZCB2aXN1YWwgcHJvYmxlbXMgd2l0aCB4MTF2bmMKLSAgIGFuZC9vciB2bmN2aWV3ZXIuIFdoYXQncyB1cD8gCi0KLSAgIFtYdGVybWluYWxzXQotCi0gICBRLTI5OiBDYW4gSSB1c2UgeDExdm5jIHRvIHZpZXcgYW5kIGludGVyYWN0IHdpdGggYW4gWHRlcm1pbmFsIChlLmcuCi0gICBOQ0QpIHRoYXQgaXMgbm90IHJ1bm5pbmcgVU5JWCBhbmQgc28geDExdm5jIGNhbm5vdCBiZSBydW4gb24gaXQKLSAgIGRpcmVjdGx5PyAKLQotICAgUS0zMDogSG93IGRvIEkgZ2V0IG15IFggcGVybWlzc2lvbnMgKE1JVC1NQUdJQy1DT09LSUUgZmlsZSkgY29ycmVjdAotICAgZm9yIGEgVW5peC9MaW51eCBtYWNoaW5lIGFjdGluZyBhcyBhbiBYdGVybWluYWw/IAotCi0gICBbU3VuIFJheXNdCi0KLSAgIFEtMzE6IEknbSBoYXZpbmcgdHJvdWJsZSB1c2luZyB4MTF2bmMgd2l0aCBteSBTdW4gUmF5IHNlc3Npb24uIAotCi0gICBbUmVtb3RlIENvbnRyb2xdCi0KLSAgIFEtMzI6IEhvdyBkbyBJIHN0b3AgeDExdm5jIG9uY2UgaXQgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZD8gCi0KLSAgIFEtMzM6IENhbiBJIGNoYW5nZSBzZXR0aW5ncyBpbiB4MTF2bmMgd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCBpdD8KLSAgIENhbiBJIHJlbW90ZSBjb250cm9sIGl0PyAKLQotICAgW1NlY3VyaXR5IGFuZCBQZXJtaXNzaW9uc10KLQotICAgUS0zNDogSG93IGRvIEkgY3JlYXRlIGEgVk5DIHBhc3N3b3JkIGZvciB1c2Ugd2l0aCB4MTF2bmM/IAotCi0gICBRLTM1OiBDYW4gSSBtYWtlIGl0IHNvIC1zdG9yZXBhc3N3ZCBkb2Vzbid0IHNob3cgbXkgcGFzc3dvcmQgb24gdGhlCi0gICBzY3JlZW4/IAotCi0gICBRLTM2OiBDYW4gSSBoYXZlIHR3byBwYXNzd29yZHMgZm9yIFZOQyB2aWV3ZXJzLCBvbmUgZm9yIGZ1bGwgYWNjZXNzCi0gICBhbmQgdGhlIG90aGVyIGZvciB2aWV3LW9ubHkgYWNjZXNzIHRvIHRoZSBkaXNwbGF5PyAKLQotICAgUS0zNzogQ2FuIEkgaGF2ZSBhcyBtYW55IGZ1bGwtYWNjZXNzIGFuZCB2aWV3LW9ubHkgcGFzc3dvcmRzIGFzIEkKLSAgIGxpa2U/IAotCi0gICBRLTM4OiBEb2VzIHgxMXZuYyBzdXBwb3J0IFVuaXggdXNlcm5hbWVzIGFuZCBwYXNzd29yZHM/IENhbiBJIGZ1cnRoZXIKLSAgIGxpbWl0IHRoZSBzZXQgb2YgVW5peCB1c2VybmFtZXMgd2hvIGNhbiBjb25uZWN0IHRvIHRoZSBWTkMgZGVza3RvcD8gCi0KLSAgIFEtMzk6IENhbiBJIHN1cHBseSBhbiBleHRlcm5hbCBwcm9ncmFtIHRvIHByb3ZpZGUgbXkgb3duIGN1c3RvbSBsb2dpbgotICAgbWV0aG9kIChlLmcuIER5bmFtaWMvT25lLXRpbWUgcGFzc3dvcmRzIG9yIG5vbi1Vbml4IChMREFQKSB1c2VybmFtZXMKLSAgIGFuZCBwYXNzd29yZHMpPyAKLQotICAgUS00MDogV2h5IGRvZXMgeDExdm5jIGV4aXQgYXMgc29vbiBhcyB0aGUgVk5DIHZpZXdlciBkaXNjb25uZWN0cz8gQW5kCi0gICB3aHkgZG9lc24ndCBpdCBhbGxvdyBtb3JlIHRoYW4gb25lIFZOQyB2aWV3ZXIgdG8gY29ubmVjdCBhdCB0aGUgc2FtZQotICAgdGltZT8gCi0KLSAgIFEtNDE6IENhbiBJIGxpbWl0IHdoaWNoIG1hY2hpbmVzIGluY29taW5nIFZOQyBjbGllbnRzIGNhbiBjb25uZWN0Ci0gICBmcm9tPyAKLQotICAgUS00MjogSG93IGRvIEkgYnVpbGQgeDExdm5jL2xpYnZuY3NlcnZlciB3aXRoIGxpYndyYXAgKHRjcF93cmFwcGVycykKLSAgIHN1cHBvcnQ/IAotCi0gICBRLTQzOiBDYW4gSSBoYXZlIHgxMXZuYyBvbmx5IGxpc3RlbiBvbiBvbmUgbmV0d29yayBpbnRlcmZhY2UgKGUuZy4KLSAgIGludGVybmFsIExBTikgcmF0aGVyIHRoYW4gaGF2aW5nIGl0IGxpc3RlbiBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzCi0gICBhbmQgcmVseWluZyBvbiAtYWxsb3cgdG8gZmlsdGVyIHVud2FudGVkIGNvbm5lY3Rpb25zIG91dD8gCi0KLSAgIFEtNDQ6IE5vdyB0aGF0IC1sb2NhbGhvc3QgaW1wbGllcyBsaXN0ZW5pbmcgb25seSBvbiB0aGUgbG9vcGJhY2sKLSAgIGludGVyZmFjZSwgaG93IEkgY2FuIG9jY2FzaW9uYWxseSBhbGxvdyBpbiBhIG5vbi1sb2NhbGhvc3QgdmlhIHRoZSAtUgotICAgYWxsb3dvbmNlIHJlbW90ZSBjb250cm9sIGNvbW1hbmQ/IAotCi0gICBRLTQ1OiBDYW4gSSBmaW5lIHR1bmUgd2hhdCB0eXBlcyBvZiB1c2VyIGlucHV0IGFyZSBhbGxvd2VkPyBFLmcuIGhhdmUKLSAgIHNvbWUgdXNlcnMganVzdCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlLCBidXQgbm90IGNsaWNrIG9yIHR5cGUKLSAgIGFueXRoaW5nPyAKLQotICAgUS00NjogQ2FuIEkgcHJvbXB0IHRoZSB1c2VyIGF0IHRoZSBsb2NhbCBYIGRpc3BsYXkgd2hldGhlciB0aGUKLSAgIGluY29taW5nIFZOQyBjbGllbnQgc2hvdWxkIGJlIGFjY2VwdGVkIG9yIG5vdD8gQ2FuIEkgZGVjaWRlIHRvIG1ha2UKLSAgIHNvbWUgY2xpZW50cyB2aWV3LW9ubHk/IEhvdyBhYm91dCBydW5uaW5nIGFuIGFyYml0cmFyeSBwcm9ncmFtIHRvIG1ha2UKLSAgIHRoZSBkZWNpc2lvbnM/IAotCi0gICBRLTQ3OiBJIHN0YXJ0IHgxMXZuYyBhcyByb290IGJlY2F1c2UgaXQgaXMgbGF1bmNoZWQgdmlhIGluZXRkKDgpIG9yIGEKLSAgIGRpc3BsYXkgbWFuYWdlciBsaWtlIGdkbSgxKS4gQ2FuIEkgaGF2ZSB4MTF2bmMgbGF0ZXIgc3dpdGNoIHRvIGEKLSAgIGRpZmZlcmVudCB1c2VyPyAKLQotICAgUS00ODogSSB1c2UgYSBzY3JlZW4tbG9jayB3aGVuIEkgbGVhdmUgbXkgd29ya3N0YXRpb24gKGUuZy4KLSAgIHhzY3JlZW5zYXZlciBvciB4bG9jay4pIFdoZW4gSSByZW1vdGVseSBhY2Nlc3MgbXkgd29ya3N0YXRpb24gZGVza3RvcAotICAgdmlhIHgxMXZuYyBJIGNhbiB1bmxvY2sgdGhlIGRlc2t0b3AgZmluZSwgYnV0IEkgYW0gd29ycmllZCBwZW9wbGUgd2lsbAotICAgc2VlIG15IGFjdGl2aXRpZXMgb24gdGhlIHBoeXNpY2FsIG1vbml0b3IuIFdoYXQgY2FuIEkgZG8gdG8gcHJldmVudAotICAgdGhpcywgb3IgYXQgbGVhc3QgbWFrZSBpdCBtb3JlIGRpZmZpY3VsdD8gCi0KLSAgIFEtNDk6IENhbiBJIGhhdmUgeDExdm5jIGF1dG9tYXRpY2FsbHkgbG9jayB0aGUgc2NyZWVuIHdoZW4gSQotICAgZGlzY29ubmVjdCB0aGUgVk5DIHZpZXdlcj8gCi0KLSAgIFtFbmNyeXB0ZWQgQ29ubmVjdGlvbnNdCi0KLSAgIFEtNTA6IEhvdyBjYW4gSSB0dW5uZWwgbXkgY29ubmVjdGlvbiB0byB4MTF2bmMgdmlhIGFuIGVuY3J5cHRlZCBTU0gKLSAgIGNoYW5uZWwgYmV0d2VlbiB0d28gVW5peCBtYWNoaW5lcz8gCi0KLSAgIFEtNTE6IEhvdyBjYW4gSSB0dW5uZWwgbXkgY29ubmVjdGlvbiB0byB4MTF2bmMgdmlhIGFuIGVuY3J5cHRlZCBTU0gKLSAgIGNoYW5uZWwgZnJvbSBXaW5kb3dzIHVzaW5nIGFuIFNTSCBjbGllbnQgbGlrZSBQdXR0eT8gCi0KLSAgIFEtNTI6IEhvdyBjYW4gSSB0dW5uZWwgbXkgY29ubmVjdGlvbiB0byB4MTF2bmMgdmlhIGFuIGVuY3J5cHRlZCBTU0wKLSAgIGNoYW5uZWwgdXNpbmcgYW4gZXh0ZXJuYWwgdG9vbCBsaWtlIHN0dW5uZWw/IAotCi0gICBRLTUzOiBEb2VzIHgxMXZuYyBoYXZlIGJ1aWx0LWluIFNTTCB0dW5uZWxpbmc/IAotCi0gICBRLTU0OiBIb3cgZG8gSSB1c2UgVk5DIFZpZXdlcnMgd2l0aCBidWlsdC1pbiBTU0wgdHVubmVsaW5nPyAKLQotICAgUS01NTogSG93IGRvIEkgdXNlIHRoZSBKYXZhIGFwcGxldCBWTkMgVmlld2VyIHdpdGggYnVpbHQtaW4gU1NMCi0gICB0dW5uZWxpbmcgd2hlbiBnb2luZyB0aHJvdWdoIGEgV2ViIFByb3h5PyAKLQotICAgUS01NjogQ2FuIEFwYWNoZSB3ZWIgc2VydmVyIGFjdCBhcyBhIGdhdGV3YXkgZm9yIHVzZXJzIHRvIGNvbm5lY3QgdmlhCi0gICBTU0wgZnJvbSB0aGUgSW50ZXJuZXQgd2l0aCBhIFdlYiBicm93c2VyIHRvIHgxMXZuYyBydW5uaW5nIG9uIHRoZWlyCi0gICB3b3Jrc3RhdGlvbnMgYmVoaW5kIGEgZmlyZXdhbGw/IAotCi0gICBRLTU3OiBDYW4gSSBjcmVhdGUgYW5kIHVzZSBteSBvd24gU1NMIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIHdpdGgKLSAgIHgxMXZuYz8gCi0KLSAgIFtEaXNwbGF5IE1hbmFnZXJzIGFuZCBTZXJ2aWNlc10KLQotICAgUS01ODogSG93IGNhbiBJIHJ1biB4MTF2bmMgYXMgYSAic2VydmljZSIgdGhhdCBpcyBhbHdheXMgYXZhaWxhYmxlPyAKLQotICAgUS01OTogSG93IGNhbiBJIHVzZSB4MTF2bmMgdG8gY29ubmVjdCB0byBhbiBYIGxvZ2luIHNjcmVlbiBsaWtlIHhkbSwKLSAgIEdOT01FIGdkbSwgS0RFIGtkbSwgb3IgQ0RFIGR0bG9naW4/IChpLmUuIG5vYm9keSBpcyBsb2dnZWQgaW50byBhbiBYCi0gICBzZXNzaW9uIHlldC4pIAotCi0gICBRLTYwOiBDYW4gSSBydW4geDExdm5jIG91dCBvZiBpbmV0ZCg4KT8gSG93IGFib3V0IHhpbmV0ZCg4KT8gCi0KLSAgIFEtNjE6IENhbiBJIGhhdmUgeDExdm5jIGFkdmVydGlzZSBpdHMgVk5DIHNlcnZpY2UgYW5kIHBvcnQgdmlhIG1ETlMgLwotICAgWmVyb2NvbmYgKGUuZy4gQXZhaGkpIHNvIFZOQyB2aWV3ZXJzIG9uIHRoZSBsb2NhbCBuZXR3b3JrIGNhbiBkZXRlY3QKLSAgIGl0IGF1dG9tYXRpY2FsbHk/IAotCi0gICBRLTYyOiBDYW4gSSBoYXZlIHgxMXZuYyBhbGxvdyBhIHVzZXIgdG8gbG9nIGluIHdpdGggaGVyIFVOSVggdXNlcm5hbWUKLSAgIGFuZCBwYXNzd29yZCBhbmQgdGhlbiBoYXZlIGl0IGZpbmQgaGVyIFggc2Vzc2lvbiBkaXNwbGF5IG9uIHRoYXQKLSAgIG1hY2hpbmUgYW5kIHRoZW4gYXR0YWNoIHRvIGl0PyBIb3cgYWJvdXQgc3RhcnRpbmcgYW4gWCBzZXNzaW9uIGlmIG9uZQotICAgY2Fubm90IGJlIGZvdW5kPyAKLQotICAgUS02MzogQ2FuIEkgaGF2ZSB4MTF2bmMgcmVzdGFydCBpdHNlbGYgYWZ0ZXIgaXQgdGVybWluYXRlcz8gCi0KLSAgIFEtNjQ6IEhvdyBkbyBJIG1ha2UgeDExdm5jIHdvcmsgd2l0aCB0aGUgSmF2YSBWTkMgdmlld2VyIGFwcGxldCBpbiBhCi0gICB3ZWIgYnJvd3Nlcj8gCi0KLSAgIFEtNjU6IEFyZSByZXZlcnNlIGNvbm5lY3Rpb25zIChpLmUuIHRoZSBWTkMgc2VydmVyIGNvbm5lY3RpbmcgdG8gdGhlCi0gICBWTkMgdmlld2VyKSB1c2luZyAidm5jdmlld2VyIC1saXN0ZW4iIGFuZCB2bmNjb25uZWN0KDEpIHN1cHBvcnRlZD8gCi0KLSAgIFEtNjY6IENhbiByZXZlcnNlIGNvbm5lY3Rpb25zIGJlIG1hZGUgdG8gZ28gdGhyb3VnaCBhIFdlYiBvciBTT0NLUwotICAgcHJveHkgb3IgU1NIPyAKLQotICAgUS02NzogQ2FuIHgxMXZuYyBwcm92aWRlIGEgbXVsdGktdXNlciBkZXNrdG9wIHdlYiBsb2dpbiBzZXJ2aWNlIGFzIGFuCi0gICBBcGFjaGUgQ0dJIG9yIFBIUCBzY3JpcHQ/IAotCi0gICBRLTY4OiBDYW4gSSB1c2UgeDExdm5jIGFzIGEgcmVwbGFjZW1lbnQgZm9yIFh2bmM/IChpLmUuIG5vdCBmb3IgYSByZWFsCi0gICBkaXNwbGF5LCBidXQgZm9yIGEgdmlydHVhbCBvbmUgSSBrZWVwIGFyb3VuZC4pIAotCi0gICBRLTY5OiBIb3cgY2FuIEkgdXNlIHgxMXZuYyBvbiAiaGVhZGxlc3MiIG1hY2hpbmVzPyBXaHkgbWlnaHQgSSB3YW50Ci0gICB0bz8gCi0KLSAgIFtSZXNvdXJjZSBVc2FnZSBhbmQgUGVyZm9ybWFuY2VdCi0KLSAgIFEtNzA6IEkgaGF2ZSBsb3RzIG9mIG1lbW9yeSwgYnV0IHdoeSBkb2VzIHgxMXZuYyBmYWlsIHdpdGggICAgc2htZ2V0OgotICAgTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgICAgb3IgICAgTWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0OiAxCi0gICAoWF9TaG1BdHRhY2gpPyAKLQotICAgUS03MTogSG93IGNhbiBJIG1ha2UgeDExdm5jIHVzZSBsZXNzIHN5c3RlbSByZXNvdXJjZXM/IAotCi0gICBRLTcyOiBIb3cgY2FuIEkgbWFrZSB4MTF2bmMgdXNlIE1PUkUgc3lzdGVtIHJlc291cmNlcz8gCi0KLSAgIFEtNzM6IEkgdXNlIHgxMXZuYyBvdmVyIGEgc2xvdyBsaW5rIHdpdGggaGlnaCBsYXRlbmN5IChlLmcuIGRpYWx1cAotICAgbW9kZW0gb3IgYnJvYWRiYW5kKSwgaXMgdGhlcmUgYW55dGhpbmcgSSBjYW4gZG8gdG8gc3BlZWQgdGhpbmdzIHVwPyAKLQotICAgUS03NDogRG9lcyB4MTF2bmMgc3VwcG9ydCB0aGUgWCBEQU1BR0UgWHNlcnZlciBleHRlbnNpb24gdG8gZmluZAotICAgbW9kaWZpZWQgcmVnaW9ucyBvZiB0aGUgc2NyZWVuIHF1aWNrbHkgYW5kIGVmZmljaWVudGx5PyAKLQotICAgUS03NTogTXkgT3BlbkdMIGFwcGxpY2F0aW9uIHNob3dzIG5vIHNjcmVlbiB1cGRhdGVzIHVubGVzcyBJIHN1cHBseQotICAgdGhlIC1ub3hkYW1hZ2Ugb3B0aW9uIHRvIHgxMXZuYy4gCi0KLSAgIFEtNzY6IFdoZW4gSSBkcmFnIHdpbmRvd3MgYXJvdW5kIHdpdGggdGhlIG1vdXNlIG9yIHNjcm9sbCB1cCBhbmQgZG93bgotICAgdGhpbmdzIHJlYWxseSBib2cgZG93biAodW5sZXNzIEkgZG8gdGhlIGRyYWcgaW4gYSBzaW5nbGUsIHF1aWNrCi0gICBtb3Rpb24uKSBJcyB0aGVyZSBhbnl0aGluZyB0byBkbyB0byBpbXByb3ZlIHRoaW5ncz8gCi0KLSAgIFEtNzc6IFdoeSBub3QgZG8gc29tZXRoaW5nIGxpa2Ugd2lyZWZyYW1lIGFuaW1hdGlvbnMgdG8gYXZvaWQgdGhlCi0gICB3aW5kb3dzICJsdXJjaGluZyIgd2hlbiBiZWluZyBtb3ZlZCBvciByZXNpemVkPyAKLQotICAgUS03ODogQ2FuIHgxMXZuYyB0cnkgdG8gYXBwbHkgaGV1cmlzdGljcyB0byBkZXRlY3Qgd2hlbiBhIHdpbmRvdyBpcwotICAgc2Nyb2xsaW5nIGl0cyBjb250ZW50cyBhbmQgdXNlIHRoZSBDb3B5UmVjdCBlbmNvZGluZyBmb3IgYSBzcGVlZHVwPyAKLQotICAgUS03OTogQ2FuIHgxMXZuYyBkbyBjbGllbnQtc2lkZSBjYWNoaW5nIG9mIHBpeGVsIGRhdGE/IEkuZS4gc28gd2hlbgotICAgdGhhdCBwaXhlbCBkYXRhIGlzIG5lZWRlZCBhZ2FpbiBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJldHJhbnNtaXR0ZWQKLSAgIG92ZXIgdGhlIG5ldHdvcmsuIAotCi0gICBRLTgwOiBEb2VzIHgxMXZuYyBzdXBwb3J0IFR1cmJvVk5DPyAKLQotICAgW01vdXNlIEN1cnNvciBTaGFwZXNdCi0KLSAgIFEtODE6IFdoeSBpc24ndCB0aGUgbW91c2UgY3Vyc29yIHNoYXBlICh0aGUgbGl0dGxlIGljb24gc2hhcGUgd2hlcmUKLSAgIHRoZSBtb3VzZSBwb2ludGVyIGlzKSBjb3JyZWN0IGFzIEkgbW92ZSBmcm9tIHdpbmRvdyB0byB3aW5kb3c/IAotCi0gICBRLTgyOiBXaGVuIHVzaW5nIFhGSVhFUyBjdXJzb3JzaGFwZSBtb2RlLCBzb21lIG9mIHRoZSBjdXJzb3JzIGxvb2sKLSAgIHJlYWxseSBiYWQgd2l0aCBleHRyYSBibGFjayBib3JkZXJzIGFyb3VuZCB0aGUgY3Vyc29yIGFuZCBvdGhlciBjcnVmdC4KLSAgIEhvdyBjYW4gSSBpbXByb3ZlIHRoZWlyIGFwcGVhcmFuY2U/IAotCi0gICBRLTgzOiBJbiBYRklYRVMgbW9kZSwgYXJlIHRoZXJlIGFueSBoYWNrcyB0byBoYW5kbGUgY3Vyc29yCi0gICB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIikgZXhhY3RseT8gCi0KLSAgIFtNb3VzZSBQb2ludGVyXQotCi0gICBRLTg0OiBXaHkgZG9lcyB0aGUgbW91c2UgYXJyb3cganVzdCBzdGF5IGluIG9uZSBjb3JuZXIgaW4gbXkKLSAgIHZuY3ZpZXdlciwgd2hlcmVhcyBteSBjdXJzb3IgKHRoYXQgZG9lcyBtb3ZlKSBpcyBqdXN0IGEgZG90PyAKLQotICAgUS04NTogQ2FuIEkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIFRpZ2h0Vk5DIGV4dGVuc2lvbiB0byB0aGUgVk5DCi0gICBwcm90b2NvbCB3aGVyZSBDdXJzb3IgUG9zaXRpb25zIFVwZGF0ZXMgYXJlIHNlbnQgYmFjayB0byBhbGwgY29ubmVjdGVkCi0gICBjbGllbnRzIChpLmUuIHBhc3NpdmUgdmlld2VycyBjYW4gc2VlIHRoZSBtb3VzZSBjdXJzb3IgYmVpbmcgbW92ZWQKLSAgIGFyb3VuZCBieSBhbm90aGVyIHZpZXdlcik/IAotCi0gICBRLTg2OiBJcyBpdCBwb3NzaWJsZSB0byBzd2FwIHRoZSBtb3VzZSBidXR0b25zIChlLmcuIGxlZnQtaGFuZGVkCi0gICBvcGVyYXRpb24pLCBvciBhcmJpdHJhcmlseSByZW1hcCB0aGVtPyBIb3cgYWJvdXQgbWFwcGluZyBidXR0b24gY2xpY2tzCi0gICB0byBrZXlzdHJva2VzLCBlLmcuIHRvIHBhcnRpYWxseSBlbXVsYXRlIE1vdXNlIHdoZWVsIHNjcm9sbGluZz8gCi0KLSAgIFtLZXlib2FyZCBJc3N1ZXNdCi0KLSAgIFEtODc6IEhvdyBjYW4gSSBnZXQgbXkgQWx0R3IgYW5kIFNoaWZ0IG1vZGlmaWVycyB0byB3b3JrIGJldHdlZW4KLSAgIGtleWJvYXJkcyBmb3IgZGlmZmVyZW50IGxhbmd1YWdlcz8gCi0KLSAgIFEtODg6IFdoZW4gSSB0cnkgdG8gdHlwZSBhICI8IiAoaS5lLiBsZXNzIHRoYW4pIGluc3RlYWQgSSBnZXQgIj4iCi0gICAoaS5lLiBncmVhdGVyIHRoYW4pISBTdHJhbmdlbHksIHR5cGluZyAiPiIgd29ya3MgT0shISAKLQotICAgUS04OTogRXh0cmEgQ2hhcmFjdGVyIEluc2VydGVkLCBFLmcuOiBXaGVuIEkgdHJ5IHRvIHR5cGUgYSAiPCIgKGkuZS4KLSAgIGxlc3MgdGhhbikgaW5zdGVhZCBJIGdldCAiPCwiIChpLmUuIGFuIGV4dHJhIGNvbW1hLikgCi0KLSAgIFEtOTA6IEknbSB1c2luZyBhbiAiaW50ZXJuYXRpb25hbCIga2V5Ym9hcmQgKGUuZy4gR2VybWFuICJkZSIsIG9yCi0gICBEYW5pc2ggImRrIikgYW5kIHRoZSAtbW9kdHdlYWsgbW9kZSB3b3JrcyB3ZWxsIGlmIHRoZSBWTkMgdmlld2VyIGlzCi0gICBydW4gb24gYSBVbml4L0xpbnV4IG1hY2hpbmUgd2l0aCBhIHNpbWlsYXIga2V5Ym9hcmQuICAgQnV0IGlmIEkgcnVuCi0gICB0aGUgVk5DIHZpZXdlciBvbiBVbml4L0xpbnV4IHdpdGggYSBkaWZmZXJlbnQga2V5Ym9hcmQgKGUuZy4gInVzIikgb3IKLSAgIFdpbmRvd3Mgd2l0aCBhbnkga2V5Ym9hcmQsIEkgY2FuJ3QgdHlwZSBzb21lIGtleXMgbGlrZTogICAiQCIsICIkIiwKLSAgICI8IiwgIj4iLCBldGMuIEhvdyBjYW4gSSBmaXggdGhpcz8gCi0KLSAgIFEtOTE6IFdoZW4gdHlwaW5nIEkgc29tZXRpbWVzIGdldCBkb3VibGUsIHRyaXBsZSwgb3IgbW9yZSBvZiBteQotICAga2V5c3Ryb2tlcyByZXBlYXRlZC4gSSdtIHN1cmUgSSBvbmx5IHR5cGVkIHRoZW0gb25jZSwgd2hhdCBjYW4gSSBkbz8gCi0KLSAgIFEtOTI6IFRoZSB4MTF2bmMgLW5vcmVwZWF0IG1vZGUgaXMgaW4gZWZmZWN0LCBidXQgSSBzdGlsbCBnZXQgcmVwZWF0ZWQKLSAgIGtleXN0cm9rZXMhISAKLQotICAgUS05MzogQWZ0ZXIgdXNpbmcgeDExdm5jIGZvciBhIHdoaWxlLCBJIGZpbmQgdGhhdCBJIGNhbm5vdCB0eXBlIHNvbWUKLSAgIChvciBhbnkpIGNoYXJhY3RlcnMgb3IgbXkgbW91c2UgY2xpY2tzIGFuZCBkcmFncyBubyBsb25nZXIgaGF2ZSBhbnkKLSAgIGVmZmVjdCwgb3IgdGhleSBsZWFkIHRvIHN0cmFuZ2UgZWZmZWN0cy4gV2hhdCBoYXBwZW5lZD8gCi0KLSAgIFEtOTQ6IFRoZSBtYWNoaW5lIHdoZXJlIEkgcnVuIHgxMXZuYyBoYXMgYW4gQWx0R3Iga2V5LCBidXQgdGhlIGxvY2FsCi0gICBtYWNoaW5lIHdoZXJlIEkgcnVuIHRoZSBWTkMgdmlld2VyIGRvZXMgbm90LiBJcyB0aGVyZSBhIHdheSBJIGNhbiBtYXAKLSAgIGEgbG9jYWwgdW51c2VkIGtleSB0byBzZW5kIGFuIEFsdEdyPyBIb3cgYWJvdXQgYSBDb21wb3NlIGtleSBhcyB3ZWxsPyAKLQotICAgUS05NTogSSBoYXZlIGEgU3VuIG1hY2hpbmUgSSBydW4geDExdm5jIG9uLiBJdHMgU3VuIGtleWJvYXJkIGhhcyBqdXN0Ci0gICBvbmUgQWx0IGtleSBsYWJlbGxlZCAiQWx0IiBhbmQgdHdvIE1ldGEga2V5cyBsYWJlbGxlZCB3aXRoIGxpdHRsZQotICAgZGlhbW9uZHMuIFRoZSBtYWNoaW5lIHdoZXJlIEkgcnVuIHRoZSBWTkMgdmlld2VyIG9ubHkgaGFzIEFsdCBrZXlzLgotICAgSG93IGNhbiBJIHNlbmQgYSBNZXRhIGtleXByZXNzPyAoZS5nLiBlbWFjcyBuZWVkcyB0aGlzKSAKLQotICAgUS05NjogUnVubmluZyB4MTF2bmMgb24gSFAtVVggSSBjYW5ub3QgdHlwZSAiIyIgSSBqdXN0IGdldCBhICIzIgotICAgaW5zdGVhZC4gCi0KLSAgIFEtOTc6IENhbiBJIG1hcCBhIGtleXN0cm9rZSB0byBhIG1vdXNlIGJ1dHRvbiBjbGljayBvbiB0aGUgcmVtb3RlCi0gICBtYWNoaW5lPyAKLQotICAgUS05ODogSG93IGNhbiBJIGdldCBDYXBzX0xvY2sgdG8gd29yayBiZXR3ZWVuIG15IFZOQyB2aWV3ZXIgYW5kCi0gICB4MTF2bmM/IAotCi0gICBbU2NyZWVuIFJlbGF0ZWQgSXNzdWVzIGFuZCBGZWF0dXJlc10KLQotICAgUS05OTogVGhlIHJlbW90ZSBkaXNwbGF5IGlzIGxhcmdlciAoaW4gbnVtYmVyIG9mIHBpeGVscykgdGhhbiB0aGUKLSAgIGxvY2FsIGRpc3BsYXkgSSBhbSBydW5uaW5nIHRoZSB2bmN2aWV3ZXIgb24uIEkgZG9uJ3QgbGlrZSB0aGUKLSAgIHZuY3ZpZXdlciBzY3JvbGxiYXJzLCB3aGF0IEkgY2FuIGRvPyAKLQotICAgUS0xMDA6IERvZXMgeDExdm5jIHN1cHBvcnQgc2VydmVyLXNpZGUgZnJhbWVidWZmZXIgc2NhbGluZz8gKEUuZy4gdG8KLSAgIG1ha2UgdGhlIGRlc2t0b3Agc21hbGxlci4pIAotCi0gICBRLTEwMTogRG9lcyB4MTF2bmMgd29yayB3aXRoIFhpbmVyYW1hPyAoaS5lLiBtdWx0aXBsZSBtb25pdG9ycyBqb2luZWQKLSAgIHRvZ2V0aGVyIHRvIGZvcm0gb25lIGJpZywgc2luZ2xlIHNjcmVlbi4pIAotCi0gICBRLTEwMjogQ2FuIEkgdXNlIHgxMXZuYyBvbiBhIG11bHRpLWhlYWRlZCBkaXNwbGF5IHRoYXQgaXMgbm90IFhpbmVyYW1hCi0gICAoaS5lLiBzZXBhcmF0ZSBzY3JlZW5zIDowLjAsIDowLjEsIC4uLiBmb3IgZWFjaCBtb25pdG9yKT8gCi0KLSAgIFEtMTAzOiBDYW4geDExdm5jIHNob3cgb25seSBhIHBvcnRpb24gb2YgdGhlIGRpc3BsYXk/IChFLmcuIGZvciBhCi0gICBzcGVjaWFsIHB1cnBvc2UgYXBwbGljYXRpb24gb3IgYSB2ZXJ5IGxhcmdlIHNjcmVlbi4pIAotCi0gICBRLTEwNDogRG9lcyB4MTF2bmMgc3VwcG9ydCB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlIGFuZAotICAgUmVmbGVjdGlvbikgZXh0ZW5zaW9uPyBXaGVuZXZlciBJIHJvdGF0ZSBvciByZXNpemUgdGhlIHNjcmVlbiB4MTF2bmMKLSAgIGp1c3Qgc2VlbXMgdG8gY3Jhc2guIAotCi0gICBRLTEwNTogSW5kZXBlbmRlbnQgb2YgYW55IFhSQU5EUiwgY2FuIEkgaGF2ZSB4MTF2bmMgcm90YXRlIGFuZC9vcgotICAgcmVmbGVjdCB0aGUgc2NyZWVuIHRoYXQgdGhlIFZOQyB2aWV3ZXJzIHNlZT8gKGUuZy4gZm9yIGEgaGFuZGhlbGQKLSAgIHdob3NlIHNjcmVlbiBpcyByb3RhdGVkIDkwIGRlZ3JlZXMuKSAKLQotICAgUS0xMDY6IFdoeSBpcyB0aGUgdmlldyBpbiBteSBWTkMgdmlld2VyIGNvbXBsZXRlbHkgYmxhY2s/IE9yIHdoeSBpcwotICAgZXZlcnl0aGluZyBmbGFzaGluZyBhcm91bmQgcmFuZG9tbHk/IAotCi0gICBRLTEwNzogSSB1c2UgTGludXggVmlydHVhbCBUZXJtaW5hbHMgKFZUJ3MpIHRvIGltcGxlbWVudCAnRmFzdCBVc2VyCi0gICBTd2l0Y2hpbmcnIGJldHdlZW4gdXNlcnMnIHNlc3Npb25zIChlLmcuIEJldHR5IGlzIG9uIEN0cmwtQWx0LUY3LAotICAgQm9iYnkgaXMgb24gQ3RybC1BbHQtRjgsIGFuZCBTaWQgaXMgb24gQ3RybC1BbHQtRjE6IHRoZXkgdXNlIHRob3NlCi0gICBrZXlzdHJva2VzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZWlyIHNlc3Npb25zLikgICBIb3cgY29tZSB0aGUgdmlldyBpbiBhCi0gICBWTkMgdmlld2VyIGNvbm5lY3RpbmcgdG8geDExdm5jIGlzIGVpdGhlciBjb21wbGV0ZWx5IGJsYWNrIG9yCi0gICBvdGhlcndpc2UgYWxsIG1lc3NlZCB1cCB1bmxlc3MgdGhlIFggc2Vzc2lvbiB4MTF2bmMgaXMgYXR0YWNoZWQgdG8gaXMKLSAgIGluIHRoZSBhY3RpdmUgVlQ/IAotCi0gICBRLTEwODogSSBhbSB1c2luZyB4MTF2bmMgd2hlcmUgbXkgbG9jYWwgbWFjaGluZSBoYXMgInBvcHVwL2hpZGRlbgotICAgdGFza2JhcnMiIGFuZCB0aGUgcmVtb3RlIGRpc3BsYXkgd2hlcmUgeDExdm5jIHJ1bnMgYWxzbyBoYXMKLSAgICJwb3B1cC9oaWRkZW4gdGFza2JhcnMiIGFuZCB0aGV5IGludGVyZmVyZSBhbmQgZmlnaHQgd2l0aCBlYWNoIG90aGVyLgotICAgV2hhdCBjYW4gSSBkbz8gCi0KLSAgIFEtMTA5OiBIZWxwISB4MTF2bmMgYW5kIG15IEtERSBzY3JlZW5zYXZlciBrZWVwIHN3aXRjaGluZyBlYWNoIG90aGVyCi0gICBvbiBhbmQgb2ZmIGV2ZXJ5IGZldyBzZWNvbmRzLiAKLQotICAgUS0xMTA6IEkgYW0gcnVubmluZyB0aGUgY29tcGl6IDNEIHdpbmRvdyBtYW5hZ2VyIChvciBiZXJ5bCwgTXl0aFR2LAotICAgR29vZ2xlIEVhcnRoLCBvciBzb21lIG90aGVyIE9wZW5HTCBhcHApIGFuZCBJIGRvIG5vdCBnZXQgc2NyZWVuCi0gICB1cGRhdGVzIGluIHgxMXZuYy4gCi0KLSAgIFEtMTExOiBDYW4gSSB1c2UgeDExdm5jIHRvIHZpZXcgbXkgVk1XYXJlIHNlc3Npb24gcmVtb3RlbHk/IAotCi0gICBbRXhwb3J0aW5nIG5vbi1YMTEgZGV2aWNlcyB2aWEgVk5DXQotCi0gICBRLTExMjogQ2FuIG5vbi1YIGRldmljZXMgKGUuZy4gYSByYXcgZnJhbWVidWZmZXIpIGJlIHZpZXdlZCAoYW5kIGV2ZW4KLSAgIGNvbnRyb2xsZWQpIHZpYSBWTkMgd2l0aCB4MTF2bmM/IAotCi0gICBRLTExMzogQ2FuIEkgZXhwb3J0IHRoZSBMaW51eCBDb25zb2xlIChWaXJ0dWFsIFRlcm1pbmFscykgdmlhIFZOQwotICAgdXNpbmcgeDExdm5jPyAKLQotICAgUS0xMTQ6IENhbiBJIGV4cG9ydCB2aWEgVk5DIGEgV2ViY2FtIG9yIFRWIHR1bmVyIGZyYW1lYnVmZmVyIHVzaW5nCi0gICB4MTF2bmM/IAotCi0gICBRLTExNTogQ2FuIEkgY29ubmVjdCB2aWEgVk5DIHRvIGEgUXQtZW1iZWRkZWQvUXQtZW5oYW5jZWQvUXRvcGlhCi0gICBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIG15IGhhbmRoZWxkLCBjZWxsIHBob25lLCBvciBQQyB1c2luZyB0aGUgTGludXgKLSAgIGNvbnNvbGUgZnJhbWVidWZmZXIgKGkuZS4gbm90IFgxMSk/IAotCi0gICBRLTExNjogSG93IGRvIEkgaW5qZWN0IHRvdWNoIHNjcmVlbiBpbnB1dCBpbnRvIGFuCi0gICBRdC1lbWJlZGRlZC9RdC1lbmhhbmNlZC9RdG9waWEgY2VsbCBwaG9uZSBzdWNoIGFzIG9wZW5tb2tvL3F0bW9rbyBOZW8KLSAgIEZyZWVydW5uZXI/IAotCi0gICBRLTExNzogTm93IHRoYXQgbm9uLVgxMSBkZXZpY2VzIGNhbiBiZSBleHBvcnRlZCB2aWEgVk5DIHVzaW5nIHgxMXZuYywKLSAgIGNhbiBJIGJ1aWxkIGl0IHdpdGggbm8gZGVwZW5kZW5jaWVzIG9uIFgxMSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcz8KLSAgIAotICAgUS0xMTg6IEhvdyBkbyBJIGNyb3NzIGNvbXBpbGUgeDExdm5jIGZvciBhIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgdGhhbgotICAgbXkgTGludXggaTM4NiBvciBhbWQ2NCBQQz8gCi0KLSAgIFEtMTE5OiBEb2VzIHgxMXZuYyBzdXBwb3J0IE1hYyBPUyBYIEFxdWEvUXVhcnR6IGRpc3BsYXlzIG5hdGl2ZWx5Ci0gICAoaS5lLiBubyBYMTEgaW52b2x2ZWQpPyAKLQotICAgUS0xMjA6IENhbiB4MTF2bmMgYmUgdXNlZCBhcyBhIFZOQyByZWZsZWN0b3IvcmVwZWF0ZXIgdG8gaW1wcm92ZQotICAgcGVyZm9ybWFuY2UgZm9yIHRoZSBjYXNlIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBWTkMgdmlld2VycwotICAgKGUuZy4gY2xhc3Nyb29tIGJyb2FkY2FzdGluZyBvciBhIGxhcmdlIGRlbW8pPyAKLQotICAgUS0xMjE6IENhbiB4MTF2bmMgYmUgdXNlZCBkdXJpbmcgYSBMaW51eCwgU29sYXJpcywgZXRjLiBzeXN0ZW0KLSAgIEluc3RhbGxhdGlvbiBzbyB0aGUgSW5zdGFsbGF0aW9uIGNhbiBiZSBkb25lIHJlbW90ZWx5PyAKLQotICAgW01pc2M6IENsaXBib2FyZCwgRmlsZSBUcmFuc2Zlci9TaGFyaW5nLCBQcmludGluZywgU291bmQsIEJlZXBzLAotICAgVGhhbmtzLCBldGMuXQotCi0gICBRLTEyMjogRG9lcyB0aGUgQ2xpcGJvYXJkL1NlbGVjdGlvbiBnZXQgdHJhbnNmZXJyZWQgYmV0d2VlbiB0aGUKLSAgIHZuY3ZpZXdlciBhbmQgdGhlIFggZGlzcGxheT8gCi0KLSAgIFEtMTIzOiBDYW4gSSB1c2UgeDExdm5jIHRvIHJlY29yZCBhIFNob2NrIFdhdmUgRmxhc2ggKG9yIG90aGVyIGZvcm1hdCkKLSAgIHZpZGVvIG9mIG15IGRlc2t0b3AsIGUuZy4gdG8gcmVjb3JkIGEgdHV0b3JpYWwgb3IgZGVtbz8gCi0KLSAgIFEtMTI0OiBDYW4gSSB0cmFuc2ZlciBmaWxlcyBiYWNrIGFuZCBmb3J0aCB3aXRoIHgxMXZuYz8gCi0KLSAgIFEtMTI1OiBXaGljaCBVbHRyYVZOQyBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQ/IAotCi0gICBRLTEyNjogQ2FuIHgxMXZuYyBlbXVsYXRlIFVsdHJhVk5DJ3MgU2luZ2xlIENsaWNrIGhlbHBkZXNrIG1vZGUgZm9yCi0gICBVbml4PyBJLmUuIHNvbWV0aGluZyB2ZXJ5IHNpbXBsZSBmb3IgYSBuYWl2ZSB1c2VyIHRvIGluaXRpYXRlIGEKLSAgIHJldmVyc2Ugdm5jIGNvbm5lY3Rpb24gZnJvbSB0aGVpciBVbml4IGRlc2t0b3AgdG8gYSBoZWxwZGVzawotICAgb3BlcmF0b3IncyBWTkMgVmlld2VyLiAKLQotICAgUS0xMjc6IENhbiBJICh0ZW1wb3JhcmlseSkgbW91bnQgbXkgbG9jYWwgKHZpZXdlci1zaWRlKSBXaW5kb3dzL1NhbWJhCi0gICBGaWxlIHNoYXJlIG9uIHRoZSBtYWNoaW5lIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nPyAKLQotICAgUS0xMjg6IENhbiBJIHJlZGlyZWN0IENVUFMgcHJpbnQgam9icyBmcm9tIHRoZSByZW1vdGUgZGVza3RvcCB3aGVyZQotICAgeDExdm5jIGlzIHJ1bm5pbmcgdG8gYSBwcmludGVyIG9uIG15IGxvY2FsICh2aWV3ZXItc2lkZSkgbWFjaGluZT8gCi0KLSAgIFEtMTI5OiBIb3cgY2FuIEkgaGVhciB0aGUgc291bmQgKGF1ZGlvKSBmcm9tIHRoZSByZW1vdGUgYXBwbGljYXRpb25zCi0gICBvbiB0aGUgZGVza3RvcCBJIGFtIHZpZXdpbmcgdmlhIHgxMXZuYz8gCi0KLSAgIFEtMTMwOiBXaHkgZG9uJ3QgSSBoZWFyIHRoZSAiQmVlcHMiIGluIG15IFggc2Vzc2lvbiAoZS5nLiB3aGVuIHR5cGluZwotICAgdHB1dCBiZWwgaW4gYW4geHRlcm0pPyAKLQotICAgUS0xMzE6IERvZXMgeDExdm5jIHdvcmsgd2l0aCBJUHY2PyAKLQotICAgUS0xMzI6IFRoYW5rcyBmb3IgeW91ciBwcm9ncmFtIG9yIGZvciB5b3VyIGhlbHAhIENhbiBJIG1ha2UgYQotICAgZG9uYXRpb24/IAotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0KLSAgIFtCdWlsZGluZyBhbmQgU3RhcnRpbmddCi0KLSAgIFEtMTogSSBjYW4ndCBnZXQgeDExdm5jIHRvIHN0YXJ0IHVwLiBJdCBzYXlzICJYT3BlbkRpc3BsYXkgZmFpbGVkCi0gICAobnVsbCkiIG9yICJYbGliOiBjb25uZWN0aW9uIHRvICI6MC4wIiByZWZ1c2VkIGJ5IHNlcnZlciBYbGliOiBObwotICAgcHJvdG9jb2wgc3BlY2lmaWVkIiBhbmQgdGhlbiBleGl0cy4gV2hhdCBkbyBJIG5lZWQgdG8gZG8/Ci0KLSAgIEZvciB0aGUgZm9ybWVyIGVycm9yLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBYIGRpc3BsYXkgdG8gY29ubmVjdCB0bwotICAgKGl0IGFsc28gbmVlZHMgdG8gYmUgb24gdGhlIHNhbWUgbWFjaGluZSB0aGUgeDExdm5jIHByb2Nlc3MgaXMgdG8gcnVuCi0gICBvbi4pIFNldCB5b3VyIERJU1BMQVkgZW52aXJvbm1lbnQgdmFyaWFibGUgKG9yIHVzZSB0aGUgLWRpc3BsYXkKLSAgIG9wdGlvbikgdG8gc3BlY2lmeSBpdC4gTmVhcmx5IGFsd2F5cyB0aGUgY29ycmVjdCB2YWx1ZSB3aWxsIGJlICI6MCIKLSAgIChpbiBmYWN0LCB4MTF2bmMgd2lsbCBub3cgYXNzdW1lIDowIGlmIGdpdmVuIG5vIG90aGVyIGluZm9ybWF0aW9uLikKLQotCi0gICBGb3IgdGhlIGxhdHRlciBlcnJvciwgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBYMTEgcGVybWlzc2lvbnMKLSAgIGNvcnJlY3RseS4KLQotICAgVG8gbWFrZSBzdXJlIFgxMSBwZXJtaXNzaW9ucyBhcmUgdGhlIHByb2JsZW0gZG8gdGhpcyBzaW1wbGUgdGVzdDoKLSAgIHdoaWxlIHNpdHRpbmcgYXQgdGhlIHBoeXNpY2FsIFggZGlzcGxheSBvcGVuIGEgdGVybWluYWwgd2luZG93Ci0gICAoZ25vbWUtdGVybWluYWwsIHh0ZXJtLCBldGMuKSBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gcnVuIHgxMXZuYwotICAgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgYW55IG5lZWQgZm9yIHNwZWNpYWwgc3RlcHMgb3IgY29tbWFuZCBsaW5lCi0gICBvcHRpb25zIGluIHRoYXQgdGVybWluYWwgKGkuZS4ganVzdCB0eXBlICJ4MTF2bmMiLikgSWYgdGhhdCB3b3JrcyBPSwotICAgdGhlbiB5b3Uga25vdyBYMTEgcGVybWlzc2lvbnMgYXJlIHRoZSBvbmx5IHRoaW5nIHByZXZlbnRpbmcgaXQgZnJvbQotICAgd29ya2luZyB3aGVuIHlvdSB0cnkgdG8gc3RhcnQgeDExdm5jIHZpYSwgc2F5LCBhIHJlbW90ZSBzaGVsbC4KLQotICAgSG93IHRvIFNvbHZlOiAgU2VlIHRoZSB4YXV0aCgxKSwgWHNlY3VyaXR5KDcpLCBhbmQgeGhvc3QoMSkgbWFuIHBhZ2VzCi0gICBvciB0aGlzIEhvd3RvIGZvciBtdWNoIGluZm8gb24gWDExIHBlcm1pc3Npb25zLiBGb3IgZXhhbXBsZSwgeW91IG1heQotICAgbmVlZCB0byBzZXQgeW91ciBYQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlIChvciB1c2UgdGhlIC1hdXRoCi0gICBvcHRpb24pIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IE1JVC1NQUdJQy1DT09LSUUgZmlsZSAoZS5nLgotICAgL2hvbWUvam9lLy5YYXV0aG9yaXR5IG9yIC92YXIvZ2RtLzowLlhhdXRoIG9yIC92YXIvbGliL2tkbS9BOjAtY3JXazcySwotICAgb3IgL3RtcC8uZ2Rtem5kVmxSLCBldGMsIGV0Yy4pLCBvciBzaW1wbHkgYmUgc3VyZSB5b3UgcnVuIHgxMXZuYyBhcwotICAgdGhlIGNvcnJlY3QgdXNlciAoaS5lLiB0aGUgdXNlciB3aG8gaXMgbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbiB5b3UKLSAgIHdpc2ggdG8gdmlldy4pCi0KLSAgIE5vdGU6IFRoZSBNSVQgY29va2llIGZpbGUgY29udGFpbnMgdGhlIHNlY3JldCBrZXkgdGhhdCBhbGxvd3MgeDExdm5jCi0gICB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIFggZGlzcGxheS4KLQotICAgSWYsIHNheSwgc3NoZCBoYXMgc2V0IFhBVVRIT1JJVFkgdG8gcG9pbnQgdG8gYSByYW5kb20gZmlsZSBpdCBoYXMKLSAgIGNyZWF0ZWQgZm9yIFggZm9yd2FyZGluZyB0aGF0IHdpbGwgY2F1c2UgcHJvYmxlbXMuIChVbmRlciBzb21lCi0gICBjaXJjdW1zdGFuY2VzIGV2ZW4gc3UoMSkgYW5kIHRlbG5ldCgxKSBjYW4gc2V0IFhBVVRIT1JJVFkuIFNlZSBhbHNvCi0gICB0aGUgZ2RtIHBhcmFtZXRlciBOZXZlclBsYWNlQ29va2llc09uTkZTIHRoYXQgc2V0cyBYQVVUSE9SSVRZIHRvIGEKLSAgIHJhbmRvbSBmaWxlbmFtZSBpbiAvdG1wIGZvciB0aGUgd2hvbGUgWCBzZXNzaW9uLikKLQotICAgUnVubmluZyB4MTF2bmMgYXMgcm9vdCBpcyBvZnRlbiBub3QgZW5vdWdoOiB5b3UgbmVlZCB0byBrbm93IHdoZXJlIHRoZQotICAgTUlULU1BR0lDLUNPT0tJRSBmaWxlIGZvciB0aGUgZGVzaXJlZCBYIGRpc3BsYXkgaXMuCi0KLSAgIEV4YW1wbGUgc29sdXRpb246Ci0gIHgxMXZuYyAtZGlzcGxheSA6MCAtYXV0aCAvdmFyL2dkbS86MC5YYXV0aAotCi0gICAodGhpcyBpcyBmb3IgdGhlIGRpc3BsYXkgbWFuYWdlciBnZG0gYW5kIHJlcXVpcmVzIHJvb3QgcGVybWlzc2lvbiB0bwotICAgcmVhZCB0aGUgZ2RtIGNvb2tpZSBmaWxlLCBzZWUgdGhpcyBmYXEgZm9yIG90aGVyIGRpc3BsYXkgbWFuYWdlcgotICAgY29va2llIGZpbGUgbmFtZXMuKQotCi0gICBOb3RlIGFzIG9mIEZlYi8yMDA3IHlvdSBjYW4gYWxzbyB0cnkgdGhlIC1maW5kIG9wdGlvbiBpbnN0ZWFkIG9mCi0gICAiLWRpc3BsYXkgLi4uIiBhbmQgc2VlIGlmIHRoYXQgZmluZHMgeW91ciBkaXNwbGF5IGFuZCBYYXV0aG9yaXR5LgotCi0gICBMZXNzIHNhZmUsIGJ1dCB0byBhdm9pZCBmaWd1cmluZyBvdXQgd2hlcmUgdGhlIGNvcnJlY3QgWEFVVEhPUklUWSBmaWxlCi0gICBpcywgaWYgdGhlIHBlcnNvbiBzaXR0aW5nIGF0IHRoZSBwaHlzaWNhbCBYIHNlc3Npb24gdHlwZXMgInhob3N0Ci0gICArbG9jYWxob3N0IiB0aGVuIG9uZSBzaG91bGQgYmUgYWJsZSB0byBhdHRhY2ggeDExdm5jIHRvIHRoZSBzZXNzaW9uCi0gICAoZnJvbSB0aGUgc2FtZSBtYWNoaW5lLikgVGhlIHBlcnNvbiBjb3VsZCB0aGVuIHR5cGUgInhob3N0IC1sb2NhbGhvc3QiCi0gICBhZnRlciB4MTF2bmMgaGFzIGNvbm5lY3RlZCB0byBnbyBiYWNrIHRvIHRoZSBkZWZhdWx0IHBlcm1pc3Npb25zLgotICAgQWxzbywgZm9yIHNvbWUgc2l0dWF0aW9ucyB0aGUgIi11c2VycyBsdXJrPSIgb3B0aW9uIG1heSBzb29uIGJlIG9mIHVzZQotICAgKHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSAtdXNlcnMgb3B0aW9uLikKLQotICAgVG8gdGVzdCBvdXQgeW91ciBYMTEgcGVybWlzc2lvbnMgZnJvbSBhIHJlbW90ZSBzaGVsbCwgc2V0IERJU1BMQVkgYW5kCi0gICBwb3NzaWJseSBYQVVUSE9SSVRZIChzZWUgeW91ciBzaGVsbCdzIG1hbiBwYWdlLCBiYXNoKDEpLCB0Y3NoKDEpLCBvbgotICAgaG93IHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMpIGFuZCB0eXBlIHhkcHlpbmZvIGluIHRoZSBzYW1lIHBsYWNlCi0gICB5b3Ugd2lsbCBiZSB0eXBpbmcgKG9yIG90aGVyd2lzZSBydW5uaW5nKSB4MTF2bmMuIElmIGluZm9ybWF0aW9uIGlzCi0gICBwcmludGVkIG91dCBhYm91dCB0aGUgWCBkaXNwbGF5IChzY3JlZW4gc2l6ZXMsIHN1cHBvcnRlZCBleHRlbnNpb25zLAotICAgY29sb3IgdmlzdWFscyBpbmZvKSB0aGF0IG1lYW5zIHRoZSBYMTEgcGVybWlzc2lvbnMgYXJlIHNldCB1cAotICAgcHJvcGVybHk6IHhkcHlpbmZvIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gRElTUExBWSEgWW91IGNvdWxkIGFsc28KLSAgIHR5cGUgeGNsb2NrIGFuZCBtYWtlIHN1cmUgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCAoYSBjbG9jayBzaG91bGQKLSAgIGFwcGVhciBvbiB0aGUgWCBkaXNwbGF5LCBwcmVzcyBDdHJsLUMgdG8gc3RvcCBpdC4pIElmIHRoZXNlIHdvcmssIHRoZW4KLSAgIHR5cGluZyAieDExdm5jIiBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCBzaG91bGQgYWxzbyB3b3JrLgotCi0gICBJbXBvcnRhbnQ6IGlmIHlvdSBjYW5ub3QgZ2V0IHlvdXIgWDExIHBlcm1pc3Npb25zIHNvIHRoYXQgdGhlIHhkcHlpbmZvCi0gICBvciB4Y2xvY2sgdGVzdHMgd29yaywgeDExdm5jIGFsc28gd2lsbCBub3Qgd29yayAoYWxsIG9mIHRoZXNlIFgKLSAgIGNsaWVudHMgbXVzdCBiZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gdGhlIFggc2VydmVyIHRvIGZ1bmN0aW9uCi0gICBwcm9wZXJseS4pCi0KLSAgIEZpcmV3YWxsczogU3BlYWtpbmcgb2YgcGVybWlzc2lvbnMsIGl0IHNob3VsZCBnbyB3aXRob3V0IHNheWluZyB0aGF0Ci0gICB0aGUgaG9zdC1sZXZlbCBmaXJld2FsbCB3aWxsIG5lZWQgdG8gYmUgY29uZmlndXJlZCB0byBhbGxvdwotICAgY29ubmVjdGlvbnMgaW4gb24gYSBwb3J0LiBFLmcuIDU5MDAgKGRlZmF1bHQgVk5DIHBvcnQpIG9yIDIyIChkZWZhdWx0Ci0gICBTU0ggcG9ydCBmb3IgdHVubmVsbGluZyBWTkMuKSBNb3N0IHN5c3RlbXMgdGhlc2UgZGF5cyBoYXZlIGZpcmV3YWxscwotICAgdHVybmVkIG9uIGJ5IGRlZmF1bHQsIHNvIHlvdSB3aWxsIGFjdGl2ZWx5IGhhdmUgdG8gZG8gc29tZXRoaW5nIHRvCi0gICBwb2tlIGEgaG9sZSBpbiB0aGUgZmlyZXdhbGwgYXQgdGhlIGRlc2lyZWQgcG9ydCBudW1iZXIuIFNlZSB5b3VyCi0gICBzeXN0ZW0gYWRtaW5pc3RyYXRpb24gdG9vbCBmb3IgRmlyZXdhbGwgc2V0dGluZ3MgKFlhc3QsIEZpcmVzdGFydGVyLAotICAgZXRjLikKLQotCi0gICBRLTI6IEkgY2FuJ3QgZ2V0IHgxMXZuYyBhbmQvb3IgbGlidm5jc2VydmVyIHRvIGNvbXBpbGUuCi0KLSAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBnY2MgKG9yIG90aGVyIEMgY29tcGlsZXIpIGFuZCBhbGwgb2YgdGhlIHJlcXVpcmVkCi0gICBsaWJyYXJpZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIC1kZXYvLWRldmVsIHBhY2thZ2VzIGluc3RhbGxlZC4gVGhlc2UKLSAgIGluY2x1ZGUgWG9yZy9YRnJlZTg2LCBsaWJYMTEsIGxpYmpwZWcsIGxpYnosIGxpYnNzbCwgLi4uIGFuZCBkb24ndAotICAgZm9yZ2V0IHRoZSBkZXZzOiBsaWJqcGVnLWRldiwgbGlic3NsLWRldiAuLi4KLQotICAgVGhlIG1vc3QgY29tbW9uIGJ1aWxkIHByb2JsZW0gdGhhdCBwZW9wbGUgZW5jb3VudGVyIGlzIHRoYXQgdGhlCi0gICBuZWNlc3NhcnkgWDExIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIG9uIHRoZWlyIHN5c3RlbSBob3dldmVyIGl0IGRvZXMKLSAgIG5vdCBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIC1kZXYvLWRldmVsIHBhY2thZ2VzIGluc3RhbGxlZC4gVGhlc2UgZGV2Ci0gICBwYWNrYWdlcyBpbmNsdWRlIEMgaGVhZGVyIGZpbGVzIGFuZCBidWlsZC10aW1lIC5zbyBzeW1saW5rLiBJdCBpcyBhCi0gICBzaGFtZSB0aGUgY3VycmVudCB0cmVuZCBpbiBkaXN0cm9zIGlzIHRvIG5vdCBpbnN0YWxsIHRoZSBkZXYgcGFja2FnZQotICAgYnkgZGVmYXVsdCB3aGVuIHRoZSB0aGUgbGlicmFyeSBydW50aW1lIHBhY2thZ2UgaXMgaW5zdGFsbGVkLi4uIChpdAotICAgZGltaW5pc2hlcyB0aGUgcG93ZXIgb2Ygb3BlbiBzb3VyY2UpCi0KLSAgIEFzIG9mIE5vdi8yMDA2IGhlcmUgaXMgYSBsaXN0IG9mIGxpYnJhcmllcyB0aGF0IHgxMXZuYyB1c3VhbGx5IGxpa2VzCi0gICB0byB1c2U6Ci1saWJjLnNvICAgICAgICBsaWJYMTEuc28gICAgICAgbGliWHRzdC5zbyAgICAgICBsaWJYZXh0LnNvCi1saWJYZml4ZXMuc28gICBsaWJYZGFtYWdlLnNvICAgbGliWGluZXJhbWEuc28gICBsaWJYcmFuZHIuc28KLWxpYnouc28gICAgICAgIGxpYmpwZWcuc28gICAgICBsaWJwdGhyZWFkLnNvCi1saWJzc2wuc28gICAgICBsaWJjcnlwdG8uc28gICAgbGliY3J5cHQuc28KLQotICAgYWx0aG91Z2ggeDExdm5jIHdpbGwgYmUgcHJldHR5IHVzYWJsZSB3aXRoIHRoZSBzdWJzZXQ6IGxpYmMuc28sCi0gICBsaWJYMTEuc28sIGxpYlh0c3Quc28sIGxpYlhleHQuc28sIGxpYnouc28sIGFuZCBsaWJqcGVnLnNvLgotCi0gICBBZnRlciBydW5uaW5nIHRoZSBsaWJ2bmNzZXJ2ZXIgY29uZmlndXJlLCBjYXJlZnVsbHkgZXhhbWluZSB0aGUgb3V0cHV0Ci0gICBhbmQgdGhlIG1lc3NhZ2VzIGluIHRoZSBjb25maWcubG9nIGZpbGUgbG9va2luZyBmb3IgbWlzc2luZwotICAgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb25maWd1cmUgb3V0cHV0IGxvb2tzIGxpa2U6Ci0gIGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uIGdjYyAtRQotICBjaGVja2luZyBmb3IgWC4uLiBubwotICBjaGVja2luZyBmb3IgWGtiU2VsZWN0RXZlbnRzIGluIC1sWDExLi4uIG5vCi0gIGNoZWNraW5nIGZvciBYaW5lcmFtYVF1ZXJ5U2NyZWVucyBpbiAtbFhpbmVyYW1hLi4uIG5vCi0gIGNoZWNraW5nIGZvciBYVGVzdEZha2VLZXlFdmVudCBpbiAtbFh0c3QuLi4gbm8KLQotICAgb3IgZXZlbiB3b3JzZToKLSAgY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uIGNvbmZpZ3VyZTogZXJyb3I6Ci0gIEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotICBTZWUgYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIHRoZXJlIGlzIHF1aXRlIGEgYml0IHdyb25nIHdpdGggdGhlIGJ1aWxkIGVudmlyb25tZW50LiBIb3BlZnVsbHkKLSAgIHNpbXBseSBhZGRpbmcgLWRldiBwYWNrYWdlcyBhbmQvb3IgZ2NjIG9yIG1ha2Ugd2lsbCBmaXggaXQuCi0KLSAgIEZvciBEZWJpYW4gdGhlIGxpc3Qgc2VlbXMgdG8gYmU6Ci0gIGdjYwotICBtYWtlCi0gIGxpYmM2LWRldgotICBsaWJqcGVnOC1kZXYgICAgICAgICAgIChmb3JtZXJseSBsaWJqcGVnNjItZGV2KQotICBsaWJ4MTEtZGV2Ci0gIHgxMXByb3RvLWNvcmUtZGV2ICAgICAgKGZvcm1lcmx5IHgtZGV2KQotICBsaWJ4ZXh0LWRldgotICBsaWJ4dHN0LWRldgotICBsaWJ4ZGFtYWdlLWRldgotICBsaWJ4Zml4ZXMtZGV2Ci0gIGxpYnhyYW5kci1kZXYKLSAgbGlieGluZXJhbWEtZGV2Ci0gIGxpYnhzcy1kZXYgICAgICAgICAgICAgKGZvcm1lcmx5IHhsaWJzLXN0YXRpYy1kZXYpCi0gIHpsaWIxZy1kZXYKLSAgbGlic3NsLWRldgotICBsaWJhdmFoaS1jbGllbnQtZGV2Ci0gIGxpbnV4LWxpYmMtZGV2ICAgICAgICAgKG9ubHkgbmVlZGVkIGZvciBsaW51eCBjb25zb2xlIHJhd2ZiIHN1cHBvcnQpCi0KLSAgIE5vdGUgdGhhdCBkZXBlbmRpbmcgb24geW91ciBPUyB2ZXJzaW9uIHRoZSBhYm92ZSBuYW1lcyBtYXkgaGF2ZSBiZWVuCi0gICBjaGFuZ2VkIGFuZC9vciBhZGRpdGlvbmFsIHBhY2thZ2VzIG1heSBiZSBuZWVkZWQuCi0KLSAgIEZvciBSZWRoYXQgdGhlIGxpc3Qgc2VlbXMgdG8gYmU6Ci0gIGdjYwotICBtYWtlCi0gIGdsaWJjLWRldmVsCi0gIGxpYmpwZWctZGV2ZWwKLSAgbGliWDExLWRldmVsCi0gIHhvcmcteDExLXByb3RvLWRldmVsCi0gIGxpYlhkYW1hZ2UtZGV2ZWwKLSAgbGliWGZpeGVzLWRldmVsCi0gIGxpYlhyYW5kci1kZXZlbAotICB6bGliLWRldmVsCi0gIG9wZW5zc2wtZGV2ZWwKLSAgYXZhaGktZGV2ZWwKLSAga2VybmVsLWhlYWRlcnMgICAgICAgICAob25seSBuZWVkZWQgZm9yIGxpbnV4IGNvbnNvbGUgcmF3ZmIgc3VwcG9ydCkKLQotICAgRm9yIG90aGVyIGRpc3Ryb3Mgb3IgT1MncyB0aGUgcGFja2FnZSBuYW1lcyBtYXkgbm90IGJlIHRoZSBzYW1lIGJ1dAotICAgd2lsbCBsb29rIHNpbWlsYXIuIEFsc28sIGRpc3Ryb3MgdGVuZCB0byByZW5hbWUgcGFja2FnZXMgYXMgd2VsbCBzbwotICAgdGhlIGFib3ZlIGxpc3QgbWF5IGJlIG91dCBvZiBkYXRlLiBTbyBvbmx5IHVzZSB0aGUgYWJvdmUgbGlzdHMgYXMKLSAgIGhpbnRzIGZvciB0aGUgcGFja2FnZSBuYW1lcyB0aGF0IGFyZSBuZWVkZWQuCi0KLSAgIEhhdmUgYSBsb29rIGF0IE1pc2MuIEJ1aWxkIFByb2JsZW1zIGZvciBhZGRpdGlvbmFsIGZpeGVzLgotCi0gICBOb3RlOiB0aGVyZSBpcyBncm93aW5nIHRyZW5kIGluIExpbnV4IGFuZCBvdGhlciBkaXN0cm9zIHRvIHNsaWNlIHVwCi0gICBjb3JlIFgxMSBzb2Z0d2FyZSBpbnRvIG1vcmUgYW5kIHNtYWxsZXIgcGFja2FnZXMuIFNvIGJlIHByZXBhcmVkIGZvcgotICAgbW9yZSBoZWFkYWNoZXMgY29tcGlsaW5nIHNvZnR3YXJlLi4uCi0KLQotICAgUS0zOiBJIGp1c3QgYnVpbHQgeDExdm5jIHN1Y2Nlc3NmdWxseSwgYnV0IHdoZW4gSSB1c2UgaXQgbXkga2V5c3Ryb2tlcwotICAgYW5kIG1vdXNlIGJ1dHRvbiBjbGlja3MgYXJlIGlnbm9yZWQgIChJIGFtIGFibGUgdG8gbW92ZSB0aGUgbW91c2UKLSAgIHRob3VnaC4pCi0KLSAgIFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHlvdSBub3QgaGF2aW5nIGEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudAotICAgZm9yIHRoZSBYVEVTVCBjbGllbnQgbGlicmFyeSBsaWJYdHN0LnNvLiBUaGUgbGlicmFyeSBpcyBwcm9iYWJseQotICAgcHJlc2VudCBvbiB5b3VyIHN5c3RlbSwgYnV0IHRoZSBwYWNrYWdlIGluc3RhbGxpbmcgdGhlIGJ1aWxkIGhlYWRlcgotICAgZmlsZSBpcyBtaXNzaW5nLgotCi0gICBJZiB5b3Ugd2VyZSB3YXRjaGluZyBjYXJlZnVsbHkgd2hpbGUgY29uZmlndXJlIHdhcyBydW5uaW5nIHlvdSB3b3VsZAotICAgaGF2ZSBzZWVuOgotICBjaGVja2luZyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQgaW4gLWxYdHN0Li4uIG5vCi0KLSAgIFRoZSBzb2x1dGlvbiBpcyB0byBhZGQgdGhlIG5lY2Vzc2FyeSBidWlsZCBlbnZpcm9ubWVudCBwYWNrYWdlIChhbmQKLSAgIHRoZSBsaWJyYXJ5IHBhY2thZ2UgaWYgdGhhdCBpcyBtaXNzaW5nIHRvby4pIE9uIERlYmlhbiB0aGUgYnVpbGQKLSAgIHBhY2thZ2UgaXMgbGlieHRzdC1kZXYuIE90aGVyIGRpc3Ryb3MvT1MncyBtYXkgaGF2ZSBpdCBpbiBhbm90aGVyCi0gICBwYWNrYWdlLgotCi0gICB4MTF2bmMgd2lsbCBidWlsZCB3aXRob3V0IHN1cHBvcnQgZm9yIHRoaXMgbGlicmFyeSAoZS5nLiBwZXJoYXBzIG9uZQotICAgd2FudHMgYSB2aWV3LW9ubHkgeDExdm5jIG9uIGEgc3RyaXBwZWQgZG93biBvciBlbWJlZGRlZCBzeXN0ZW0uLi4pIEFuZAotICAgYXQgcnVudGltZSBpdCB3aWxsIGFsc28gY29udGludWUgdG8gcnVuIGV2ZW4gaWYgdGhlIFggc2VydmVyIGl0Ci0gICBjb25uZWN0cyB0byBkb2VzIG5vdCBzdXBwb3J0IFhURVNULiBJbiBib3RoIGNhc2VzIGl0IGNhbm5vdCBpbmplY3QKLSAgIGtleXN0cm9rZXMgb3IgYnV0dG9uIGNsaWNrcyBzaW5jZSBYVEVTVCBpcyBuZWVkZWQgZm9yIHRoYXQgKGl0IGNhbgotICAgc3RpbGwgbW92ZSB0aGUgbW91c2UgcG9pbnRlciB1c2luZyB0aGUgWCBBUEkgWFdhcnBQb2ludGVyKCkuKQotCi0gICBZb3Ugd2lsbCBzZWUgYSB3YXJuaW5nIG1lc3NhZ2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBhdCBydW4gdGltZToKLSAgMjAvMDMvMjAwNSAyMjozMzowOSBXQVJOSU5HOiBYVEVTVCBleHRlbnNpb24gbm90IGF2YWlsYWJsZSAoZWl0aGVyIG1pc3NpbmcgZnIKLW9tCi0gIDIwLzAzLzIwMDUgMjI6MzM6MDkgICBkaXNwbGF5IG9yIGNsaWVudCBsaWJyYXJ5IGxpYlh0c3QgbWlzc2luZyBhdCBidWlsZCB0aW1lCi0uKQotICAyMC8wMy8yMDA1IDIyOjMzOjA5ICAgTU9TVCB1c2VyIGlucHV0IChwb2ludGVyIGFuZCBrZXlib2FyZCkgd2lsbCBiZSBESVNDQVJERQotRC4KLSAgMjAvMDMvMjAwNSAyMjozMzowOSAgIElmIGRpc3BsYXkgZG9lcyBoYXZlIFhURVNULCBiZSBzdXJlIHRvIGJ1aWxkIHgxMXZuYyB3aXQKLWgKLSAgMjAvMDMvMjAwNSAyMjozMzowOSAgIGEgd29ya2luZyBsaWJYdHN0IGJ1aWxkIGVudmlyb25tZW50IChlLmcuIGxpYnh0c3QtZGV2LAotICAyMC8wMy8yMDA1IDIyOjMzOjA5ICAgb3Igb3RoZXIgcGFja2FnZXMuKQotICAyMC8wMy8yMDA1IDIyOjMzOjA5IE5vIFhURVNUIGV4dGVuc2lvbiwgc3dpdGNoaW5nIHRvIC14d2FycHBvaW50ZXIgbW9kZSBmb3IKLSAgMjAvMDMvMjAwNSAyMjozMzowOSAgIHBvaW50ZXIgbW90aW9uIGlucHV0LgotCi0gICBBbHNvLCBhcyBvZiBOb3YvMjAwNiB0aGVyZSB3aWxsIGJlIGEgY29uZmlndXJlIGJ1aWxkIHRpbWUgd2FybmluZyBhcwotICAgd2VsbDoKLSAgLi4uCi0gIGNoZWNraW5nIGZvciBYRml4ZXNHZXRDdXJzb3JJbWFnZSBpbiAtbFhmaXhlcy4uLiB5ZXMKLSAgY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UuLi4geWVzCi0gIGNvbmZpZ3VyZTogV0FSTklORzoKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgQSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgWFRFU1QgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQgKGxpYlh0c3QpLgotICBBbiB4MTF2bmMgYnVpbHQgdGhpcyB3YXkgd2lsbCBiZSBvbmx5IGJhcmVseSB1c2FibGUuICBZb3Ugd2lsbCBiZSBhYmxlIHRvCi0gIG1vdmUgdGhlIG1vdXNlIGJ1dCBub3QgY2xpY2sgb3IgdHlwZS4gIFRoZXJlIGNhbiBhbHNvIGJlIGRlYWRsb2NrcyBpZiBhbgotICBhcHBsaWNhdGlvbiBncmFicyB0aGUgWCBzZXJ2ZXIuCi0KLSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgaW5zdGFsbCB0aGUgbmVjZXNzYXJ5IGRldmVsb3BtZW50IHBhY2thZ2VzCi0gIGZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgotICBjb25maWd1cmUgYWdhaW4uCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotICAgUS00OiBIZWxwLCBJIG5lZWQgdG8gcnVuIHgxMXZuYyBvbiBTb2xhcmlzIDIuNS4xIChvciBvdGhlciBvbGQKLSAgIFVuaXgvTGludXgpIGFuZCBpdCBkb2Vzbid0IGNvbXBpbGUhCi0KLSAgIFdlIGFwb2xvZ2l6ZSB0aGF0IHgxMXZuYyBkb2VzIG5vdCBidWlsZCBjbGVhbmx5IG9uIG9sZGVyIHZlcnNpb25zIG9mCi0gICBTb2xhcmlzLCBMaW51eCwgZXRjLjogdmVyeSBmZXcgdXNlcnMgYXJlIG9uIHRoZXNlIG9sZCByZWxlYXNlcy4KLQotICAgV2UgaGF2ZSBoZWFyZCB0aGF0IHNpbmNlIERlYy8yMDA0IGEgU29sYXJpcyAyLjYgYnVpbHQgeDExdm5jIHdpbGwgcnVuCi0gICBvbiBTb2xhcmlzIFNvbGFyaXMgMi41IGFuZCAyLjUuMSAoc2luY2UgYSB3b3JrYXJvdW5kIGZvciBYQ29udmVydENhc2UKLSAgIGlzIHByb3ZpZGVkLikKLQotICAgSW4gYW55IGV2ZW50LCBoZXJlIGlzIGEgd29ya2Fyb3VuZCBmb3IgU29sYXJpcyAyLjUuMSAoYW5kIHBlcmhhcHMKLSAgIGVhcmxpZXIgYW5kIHBlcmhhcHMgbm9uLVNvbGFyaXMpOgotCi0gICBGaXJzdCB1c2UgdGhlIGVudmlyb25tZW50IHNldHRpbmdzIChDUFBGTEFHUywgTERGTEFHUywgZXRjLikgaW4gdGhlCi0gICBhYm92ZSBTb2xhcmlzIGJ1aWxkIHNjcmlwdCB0byBydW4gdGhlIGNvbmZpZ3VyZSBjb21tYW5kLiBUaGF0IHNob3VsZAotICAgc3VjY2VlZCB3aXRob3V0IGZhaWx1cmUuIFRoZW4geW91IGhhdmUgdG8gaGFuZCBlZGl0IHRoZSBhdXRvZ2VuZXJhdGVkCi0gICByZmIvcmZiY29uZmlnLmggZmlsZSBpbiB0aGUgc291cmNlIHRyZWUsIGFuZCBqdXN0IGJlZm9yZSB0aGUgbGFzdAotICAgI2VuZGlmIGF0IHRoZSBib3R0b20gb2YgdGhhdCBmaWxlIGluc2VydCB0aGVzZSB3b3JrYXJvdW5kIGxpbmVzOgotc3RydWN0IHRpbWV2YWwgX3RtcF91c2xlZXBfdHY7Ci0jZGVmaW5lIHVzbGVlcCh4KSBcCi0gICAgX3RtcF91c2xlZXBfdHYudHZfc2VjICA9ICh4KSAvIDEwMDAwMDA7IFwKLSAgICBfdG1wX3VzbGVlcF90di50dl91c2VjID0gKHgpICUgMTAwMDAwMDsgXAotICAgIHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmX3RtcF91c2xlZXBfdHYpOwotaW50IGdldGhvc3RuYW1lKGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKLWxvbmcgcmFuZG9tKCk7Ci1pbnQgc3JhbmRvbSh1bnNpZ25lZCBpbnQgc2VlZCk7Ci0jdW5kZWYgTElCVk5DU0VSVkVSX0hBVkVfTElCUFRIUkVBRAotI2RlZmluZSBTSFVUX1JEV1IgMgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgaW5fYWRkcl90OwotI2RlZmluZSBzbnByaW50ZihhLCBuLCBhcmdzLi4uKSBzcHJpbnRmKChhKSwgIyMgYXJncykKLQotICAgVGhlbiBydW4gbWFrZSB3aXRoIHRoZSBTb2xhcmlzIGJ1aWxkIHNjcmlwdCBlbnZpcm9ubWVudCwgZXZlcnl0aGluZwotICAgc2hvdWxkIGNvbXBpbGUgd2l0aG91dCBwcm9ibGVtcywgYW5kIHRoZSByZXN1bHRpbmcgeDExdm5jIGJpbmFyeQotICAgc2hvdWxkIHdvcmsgT0suIElmIHNvbWUgbm9uLXgxMXZuYyByZWxhdGVkIHByb2dyYW1zIGZhaWwgKGUuZy4gdGVzdAotICAgcHJvZ3JhbXMpIGFuZCB0aGUgeDExdm5jIGJpbmFyeSBpcyBub3QgY3JlYXRlZCB0cnkgIm1ha2UgLWsiIHRvIGhhdmUKLSAgIGl0IGtlZXAgZ29pbmcuIFNpbWlsYXIgc29ydHMgb2Yga2x1ZGdlcyBpbiByZmIvcmZiY29uZmlnLmggY2FuIGJlIGRvbmUKLSAgIG9uIG90aGVyIG9sZGVyIE9TIChTb2xhcmlzLCBMaW51eCwgLi4uKSByZWxlYXNlcy4KLQotICAgSGVyZSBhcmUgc29tZSBub3RlcyBmb3Igc2ltaWxhciBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgZG9uZSB0byBidWlsZCBvbgotICAgU3VuT1MgNC54Ci0KLSAgIFBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgaGFkIHRvIHVzZSB0aGUgYWJvdmUgd29ya2Fyb3VuZCAoYW5kIHdoZXRoZXIKLSAgIGl0IHdvcmtlZCBvciBub3QuKSBJZiB0aGVyZSBpcyBlbm91Z2ggZGVtYW5kIHdlIHdpbGwgdHJ5IHRvIHB1c2ggY2xlYW4KLSAgIGNvbXBpbGF0aW9ucyBiYWNrIHRvIGVhcmxpZXIgU29sYXJpcywgTGludXgsIGV0YywgcmVsZWFzZXMuCi0KLQotICAgUS01OiBXaGVyZSBjYW4gSSBnZXQgYSBwcmVjb21waWxlZCB4MTF2bmMgYmluYXJ5IGZvciBteSBPcGVyYXRpbmcKLSAgIFN5c3RlbT8KLQotICAgSG9wZWZ1bGx5IHRoZSBidWlsZCBzdGVwcyBhYm92ZSBhbmQgRkFRIHByb3ZpZGUgZW5vdWdoIGluZm8gZm9yIGEKLSAgIHBhaW5sZXNzIGNvbXBpbGUgZm9yIG1vc3QgZW52aXJvbm1lbnRzLiBQbGVhc2UgcmVwb3J0IHByb2JsZW1zIHdpdGgKLSAgIHRoZSB4MTF2bmMgY29uZmlndXJlLCBtYWtlLCBldGMuIG9uIHlvdXIgc3lzdGVtIChpZiB5b3VyIHN5c3RlbSBpcwotICAga25vd24gdG8gY29tcGlsZSBvdGhlciBHTlUgcGFja2FnZXMgc3VjY2Vzc2Z1bGx5LikKLQotICAgVGhlcmUgYXJlIHByZWNvbXBpbGVkIHgxMXZuYyBiaW5hcmllcyBidWlsdCBieSBvdGhlciBncm91cHMgdGhhdCBhcmUKLSAgIGF2YWlsYWJsZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAgICBTbGFja3dhcmU6ICAgICAgKC50Z3opICBodHRwOi8vd3d3LmxpbnV4cGFja2FnZXMubmV0LwotCi0gICBTdVNFOiAoLnJwbSkgaHR0cDovc29mdHdhcmUub3BlbnN1c2Uub3JnLyBHZW50b286IChpbmZvKQotICAgaHR0cDovL2dlbnRvby13aWtpLmNvbS8gYW5kIGh0dHA6Ly9nZW50b28tcG9ydGFnZS5jb20vIEZyZWVCU0Q6ICgudGJ6KQotICAgaHR0cDovL3d3dy5mcmVlYnNkLm9yZy8gaHR0cDovL3d3dy5mcmVzaHBvcnRzLm9yZy9uZXQveDExdm5jIE5ldEJTRDoKLSAgIChzcmMpIGh0dHA6Ly9wa2dzcmMuc2UveDExL3gxMXZuYyBPcGVuQlNEOiAoLnRneikgaHR0cDovL29wZW5wb3J0cy5zZS8KLSAgIEFyY2ggTGludXg6ICgudGd6KSBodHRwOi8vd3d3LmFyY2hsaW51eC5vcmcvIE5va2lhIDc3MCAoLmRlYikKLSAgIGh0dHA6Ly9taWtlLnNhdW5ieS5nb29nbGVwYWdlcy5jb20veDExdm5jZm9ybm9raWE3NzAyIFNoYXJwIFphdXJ1cwotICAgaHR0cDovL3d3dy5mb2N2LmNvbS8gRGViaWFuOiAoLmRlYikgaHR0cDovL3BhY2thZ2VzLmRlYmlhbi5vcmcveDExdm5jCi0gICBSZWRoYXQvRmVkb3JhOiAoLnJwbSkgaHR0cDovL3BhY2thZ2VzLnN3LmJlL3gxMXZuYyBSUE1mb3JnZQotICAgaHR0cDovL2RhZy53aWVlcnMuY29tL3JwbS9wYWNrYWdlcy94MTF2bmMvIChOLkIuOiB1bm1haW50YWluZWQgYWZ0ZXIKLSAgIDAuOS4zKSBTb2xhcmlzOiAocGtnKSBodHRwOi8vd3d3LnN1bmZyZWV3YXJlLmNvbS8KLQotICAgSWYgdGhlIGFib3ZlIGJpbmFyaWVzIGRvbid0IHdvcmsgYW5kIGJ1aWxkaW5nIHgxMXZuYyBvbiB5b3VyIE9TIGZhaWxzCi0gICAoYW5kIGFsbCBlbHNlIGZhaWxzISkgeW91IGNhbiB0cnkgb25lIG9mIE15IENvbGxlY3Rpb24gb2YgeDExdm5jCi0gICBCaW5hcmllcyBmb3IgdmFyaW91cyBPUydzIGFuZCB4MTF2bmMgcmVsZWFzZXMuCi0KLSAgIEFzIGEgZ2VuZXJhbCBub3RlLCB0aGUgeDExdm5jIHByb2dyYW0gaXMgc2ltcGxlIGVub3VnaCB5b3UgZG9uJ3QKLSAgIHJlYWxseSBuZWVkIHRvIGluc3RhbGwgYSBwYWNrYWdlOiB0aGUgYmluYXJ5IHdpbGwgaW4gbW9zdCBjYXNlcyB3b3JrCi0gICBhcyBpcyBhbmQgZnJvbSBhbnkgbG9jYXRpb24gKGFzIGxvbmcgYXMgeW91ciBzeXN0ZW0gbGlicmFyaWVzIGFyZSBub3QKLSAgIHRvbyBvbGQsIGV0Yy4pIFNvLCBmb3IgTGludXggZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBub3Qgb25lIG9mIHRoZQotICAgYWJvdmUsIHRoZSB4MTF2bmMgYmluYXJ5IGZyb20gdGhlIGFib3ZlIHBhY2thZ2VzIGhhcyBhIGdvb2QgY2hhbmNlIG9mCi0gICB3b3JraW5nLiBZb3UgY2FuICJpbnN0YWxsIiBpdCBieSBqdXN0IGNvcHlpbmcgdGhlIHgxMXZuYyBiaW5hcnkgdG8gdGhlCi0gICBkZXNpcmVkIGRpcmVjdG9yeSBpbiB5b3VyIFBBVEguIFRpcCBvbiBleHRyYWN0aW5nIGZpbGVzIGZyb20gYSBEZWJpYW4KLSAgIHBhY2thZ2U6IGV4dHJhY3QgdGhlIGFyY2hpdmUgdmlhIGEgY29tbWFuZCBsaWtlOiAiYXIgeAotICAgeDExdm5jXzAuNi0yX2kzODYuZGViIiBhbmQgdGhlbiB5b3UgY2FuIGZpbmQgdGhlIGJpbmFyeSBpbiB0aGUKLSAgIHJlc3VsdGluZyBkYXRhLnRhci5neiB0YXIgZmlsZS4gQWxzbywgcnBtMmNwaW8oMSkgaXMgdXNlZnVsIGluCi0gICBleHRyYWN0aW5nIGZpbGVzIGZyb20gcnBtIHBhY2thZ2VzLgotCi0gICBJZiB5b3UgdXNlIGEgc3RhbmRhbG9uZSBiaW5hcnkgbGlrZSB0aGlzIGFuZCBhbHNvIHdhbnQgeDExdm5jIHRvIHNlcnZlCi0gICB1cCB0aGUgSmF2YSBWTkMgVmlld2VyIGphciBmaWxlIChlaXRoZXIgU1NMIGVuYWJsZWQgb3IgcmVndWxhciBvbmUpLAotICAgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGV4dHJhY3QgdGhlIGNsYXNzZXMgc3ViZGlyZWN0b3J5IGZyb20gdGhlIHNvdXJjZQotICAgdGFyYmFsbCBhbmQgcG9pbnQgeDExdm5jIHRvIGl0IHZpYSB0aGUgLWh0dHBkaXIgb3B0aW9uLiBFLmcuOgotICAgIHgxMXZuYyAtaHR0cGRpciAvcGF0aC90by94MTF2bmMtMC45LjkvY2xhc3Nlcy9zc2wgLi4uCi0KLQotICAgUS02OiBXaGVyZSBjYW4gSSBnZXQgYSBWTkMgVmlld2VyIGJpbmFyeSAob3Igc291cmNlIGNvZGUpIGZvciB0aGUKLSAgIE9wZXJhdGluZyBTeXN0ZW0gSSB3aWxsIGJlIHZpZXdpbmcgZnJvbT8KLQotICAgVG8gb2J0YWluIFZOQyB2aWV3ZXJzIGZvciB0aGUgdmlld2luZyBzaWRlIChXaW5kb3dzLCBNYWMgT1MsIG9yIFVuaXgpCi0gICB0cnkgaGVyZToKLSAgICAgKiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS9kb3dubG9hZC5odG1sCi0gICAgICogaHR0cDovL3d3dy5yZWFsdm5jLmNvbS9kb3dubG9hZC1mcmVlLmh0bWwKLSAgICAgKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2NvdHZuYy8KLSAgICAgKiBodHRwOi8vd3d3LnVsdHJhdm5jLmNvbS8KLSAgICAgKiBPdXIgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykKLQotICAgICAgIFtzc3ZuYy5naWZdCi0KLQotICAgUS03OiBIb3cgY2FuIEkgc2VlIGFsbCBvZiB4MTF2bmMncyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQKLSAgIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVtPwotCi0gICBSdW46ICB4MTF2bmMgLW9wdHMgICB0byBsaXN0IGp1c3QgdGhlIG9wdGlvbiBuYW1lcyBvciBydW46ICB4MTF2bmMKLSAgIC1oZWxwICAgZm9yIGxvbmcgZGVzY3JpcHRpb25zIGFib3V0IGVhY2ggb3B0aW9uLiBUaGUgb3V0cHV0IGlzIGxpc3RlZAotICAgaGVyZSBhcyB3ZWxsLiBZZXMsIHgxMXZuYyBkb2VzIGhhdmUgYSBsb3Qgb2Ygb3B0aW9ucywgZG9lc24ndCBpdC4uLgotCi0KLSAgIFEtODogSSBkb24ndCBsaWtlIHR5cGluZyBhcmNhbmUgY29tbWFuZCBsaW5lIG9wdGlvbnMgZXZlcnkgdGltZSBJCi0gICBzdGFydCB4MTF2bmMuIFdoYXQgY2FuIEkgZG8/IElzIHRoZXJlIGEgY29uZmlnIGZpbGU/IE9yIGEgR1VJPwotCi0gICBZb3UgY291bGQgY3JlYXRlIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FsbHMgeDExdm5jIHdpdGggeW91ciBvcHRpb25zOgotIyEvYmluL3NoCi0jCi0jIGZpbGVuYW1lOiBYMTF2bmMgIChpLmUuIG5vdCAieDExdm5jIikKLSMgSXQgcmVzaWRlcyBpbiBhIGRpcmVjdG9yeSBpbiAkUEFUSC4gImNobW9kIDc1NSBYMTF2bmMiIGhhcyBiZWVuIHJ1biBvbiBpdC4KLSMKLXgxMXZuYyAtd2FpdCA1MCAtbG9jYWxob3N0IC1yZmJhdXRoICRIT01FLy52bmMvcGFzc3dkIC1kaXNwbGF5IDowICQqCi0KLSAgIGEgc2ltaWxhciB0aGluZyBjYW4gYmUgZG9uZSB2aWEgYWxpYXNlcyBpbiB5b3VyIHNoZWxsIChiYXNoLCB0Y3NoLAotICAgY3NoLCBldGMuLikKLQotICAgT3IgYXMgb2YgSnVuLzIwMDQgeW91IGNhbiB1c2UgdGhlIHNpbXBsZSAkSE9NRS8ueDExdm5jcmMgY29uZmlnIGZpbGUKLSAgIHN1cHBvcnQuIElmIHRoYXQgZmlsZSBleGlzdHMsIGVhY2ggbGluZSBpcyB0YWtlbiBhcyBhIGNvbW1hbmQgbGluZQotICAgb3B0aW9uLiBFLmcuIHRoZSBhYm92ZSB3b3VsZCBiZToKLSMgdGhpcyBpcyBhIGNvbW1lbnQgaW4gbXkgfi8ueDExdm5jcmMgZmlsZQotd2FpdCA1MCAgICAgICAgIyB0aGlzIGlzIGEgY29tbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotLWxvY2FsaG9zdCAgICAgIyBub3RlOiB0aGUgbGVhZGluZyAiLSIgaXMgb3B0aW9uYWwuCi1yZmJhdXRoICAvaG9tZS9mcmVkLy52bmMvcGFzc3dkCi1kaXNwbGF5IDowCi0KLSAgIEFzIG9mIERlYy8yMDA0IHRoZXJlIGlzIG5vdyBhIHNpbXBsZSBUY2wvVGsgR1VJIGJhc2VkIG9uIHRoZQotICAgcmVtb3RlLWNvbnRyb2wgZnVuY3Rpb25hbGl0eSAoIi1SIikgdGhhdCB3YXMgYWRkZWQuIFRoZSAvdXNyL2Jpbi93aXNoCi0gICBwcm9ncmFtIGlzIG5lZWRlZCBmb3Igb3BlcmF0aW9uLiBUaGUgZ3VpIGlzIG5vdCBwYXJ0aWN1bGFybHkKLSAgIHVzZXItZnJpZW5kbHksIGl0IGp1c3QgcHJvdmlkZXMgYSBwb2ludCBhbmQgY2xpY2sgbW9kZSB0byBzZXQgYWxsIHRoZQotICAgbWFueSB4MTF2bmMgcGFyYW1ldGVycyBhbmQgb2J0YWluIGhlbHAgb24gdGhlbS4gSXQgaXMgYWxzbyB2ZXJ5IHVzZWZ1bAotICAgZm9yIHRlc3RpbmcuIFNlZSB0aGUgLWd1aSBvcHRpb24gZm9yIG1vcmUgaW5mby4gRXhhbXBsZXM6ICJ4MTF2bmMgLi4uCi0gICAtZ3VpIiBhbmQgIngxMXZuYyAuLi4gLWd1aSBvdGhlcjowIiBpbiB0aGUgbGF0dGVyIGNhc2UgdGhlIGd1aSBpcwotICAgZGlzcGxheWVkIG9uIG90aGVyOjAsIG5vdCB0aGUgWCBkaXNwbGF5IHgxMXZuYyBpcyBwb2xsaW5nLiBUaGVyZSBpcwotICAgYWxzbyBhICItZ3VpIHRyYXkiIHN5c3RlbSB0cmF5IG1vZGUuCi0KLSAgIFt0a3gxMXZuYy5naWZdCi0KLSAgIE5PVEU6IFlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIHRoZSAid2lzaCIgb3IgInRrIiBvciAidGs4LjQiIHBhY2thZ2UKLSAgIGZvciB0aGUgZ3VpIG1vZGUgdG8gd29yayAodGhlIHBhY2thZ2UgbmFtZSBkZXBlbmRzIG9uIHlvdXIgT1MvZGlzdHJvLikKLSAgIFRoZSB0Y2wvdGsgIndpc2giIGludGVycHJldGVyIGlzIHVzZWQuIEluIGRlYmlhbiAoYW5kIHNvIHVidW50dSB0b28pCi0gICBvbmUgd291bGQgcnVuICJhcHQtZ2V0IGluc3RhbGwgdGsiIG9yIHBlcmhhcHMgImFwdC1nZXQgaW5zdGFsbCB0azguNCIKLQotCi0gICBRLTk6IEhvdyBjYW4gSSBnZXQgdGhlIEdVSSB0byBydW4gaW4gdGhlIFN5c3RlbSBUcmF5LCBvciBhdCBsZWFzdCBiZSBhCi0gICBzbWFsbGVyLCBzaW1wbGVyIGljb24/Ci0KLSAgIEFzIG9mIEp1bC8yMDA1IHRoZSBndWkgY2FuIHJ1biBpbiBhIG1vcmUgZnJpZW5kbHkgc21hbGwgaWNvbiBtb2RlCi0gICAiLWd1aSBpY29uIiBvciBpbiB0aGUgc3lzdGVtIHRyYXk6ICItZ3VpIHRyYXkiLiBJdCBoYXMgYmFsbG9vbiBzdGF0dXMsCi0gICBhIHNpbXBsZSBtZW51LCBhbmQgYSBQcm9wZXJpdGllcyBkaWFsb2cuIFRoZSBmdWxsLCBjb21wbGljYXRlZCwgZ3VpIGlzCi0gICBvbmx5IGF2YWlsYWJsZSB1bmRlciAiQWR2YW5jZWQiLiBPdGhlciBpbXByb3ZlbWVudHMgd2VyZSBhZGRlZCBhcwotICAgd2VsbC4gVHJ5ICJNaXNjIC0+IHNpbXBsZV9ndWkiIGZvciBhIGd1aSB3aXRoIGZld2VyIGVzb3RlcmljIG1lbnUKLSAgIGl0ZW1zLgotCi0gICBJZiB0aGUgZ3VpIGZhaWxzIHRvIGVtYmVkIGl0c2VsZiBpbiB0aGUgc3lzdGVtIHRyYXksIGRvIGEgcmV0cnkgdmlhCi0gICAiV2luZG93IFZpZXcgLT4gaWNvbiIgZm9sbG93ZWQgYnkgIldpbmRvdyBWaWV3IC0+IHRyYXkiIHdpdGggdGhlIHBvcHVwCi0gICBtZW51LgotCi0gICBGb3IgaW5leHBlcmllbmNlZCB1c2VycyBzdGFydGluZyB1cCB4MTF2bmMgYW5kIHRoZSBHVUkgd2hpbGUgc2l0dGluZwotICAgYXQgdGhlIHBoeXNpY2FsIFggZGlzcGxheSAobm90IHJlbW90ZWx5KSwgdXNpbmcgc29tZXRoaW5nIGxpa2UgIngxMXZuYwotICAgLWRpc3BsYXkgOjAgLWd1aSB0cmF5PXNldHBhc3MiIG1pZ2h0IGJlIHNvbWV0aGluZyBmb3IgdGhlbSB0aGF0IHRoZXkKLSAgIGFyZSBhY2N1c3RvbWVkIHRvIGluIGEgRGVza3RvcCBlbnZpcm9ubWVudCAoaXQgcHJvbXB0cyBmb3IgYW4gaW5pdGlhbAotICAgcGFzc3dvcmQsIGV0Yy4pIFRoaXMgaXMgYSBiYXNpYyAiU2hhcmUgTXkgRGVza3RvcCIgdXNhZ2UgbW9kZS4KLQotICAgQXMgb2YgTm92LzIwMDggaW4geDExdm5jIDAuOS42IHRoZXJlIGlzIGEgZGVza3RvcCBtZW51IGl0ZW0KLSAgICh4MTF2bmMuZGVza3RvcCkgdGhhdCBydW5zIHRoaXMgY29tbWFuZDoKLSAgIHgxMXZuYyAtZ3VpIHRyYXk9c2V0cGFzcyAtcmZicG9ydCBQUk9NUFQgLWxvZ2ZpbGUgJUhPTUUvLngxMXZuYy5sb2cuJVZOQ0RJU1AKLUxBWQotCi0gICB3aGljaCBhbHNvIHByb21wdHMgZm9yIHdoaWNoIFZOQyBwb3J0IHRvIHVzZSBhbmQgYSBjb3VwbGUgb3RoZXIKLSAgIHBhcmFtZXRlcnMuCi0KLQotICAgUS0xMDogSG93IGNhbiBJIGdldCB4MTF2bmMgdG8gbGlzdGVuIG9uIGEgZGlmZmVyZW50IHBvcnQgYmVzaWRlcyB0aGUKLSAgIGRlZmF1bHQgVk5DIHBvcnQgKDU5MDApPwotCi0gICBVc2Ugc29tZXRoaW5nIGxpa2UsIGUuZy4sICJ4MTF2bmMgLXJmYnBvcnQgNTkwMSIgdG8gZm9yY2UgaXQgdG8gdXNlCi0gICBwb3J0IDU5MDEgKHRoaXMgaXMgVk5DIGRpc3BsYXkgOjEuKSBJZiBzb21ldGhpbmcgZWxzZSBpcyB1c2luZyB0aGF0Ci0gICBwb3J0IHgxMXZuYyB3aWxsIGV4aXQgaW1tZWRpYXRlbHkuIElmIHlvdSBkbyBub3Qgc3VwcGx5IHRoZSAtcmZicG9ydAotICAgb3B0aW9uLCBpdCB3aWxsIGF1dG9wcm9iZSBzdGFydGluZyBhdCA1OTAwIGFuZCB3b3JrIGl0cyB3YXkgdXAgdG8gNTk5OQotICAgbG9va2luZyBmb3IgYSBmcmVlIHBvcnQgdG8gbGlzdGVuIG9uLiBJbiB0aGF0IGNhc2UsIHdhdGNoIGZvciB0aGUKLSAgIFBPUlQ9NTl4eCBsaW5lIHRvIHNlZSB3aGljaCBwb3J0IGl0IGZvdW5kLCB0aGVuIHN1YnRyYWN0IDU5MDAgZnJvbSBpdAotICAgZm9yIHRoZSBWTkMgZGlzcGxheSBudW1iZXIgdG8gZW50ZXIgaW50byB0aGUgVk5DIFZpZXdlcihzKS4KLQotICAgVGhlICItTiIgb3B0aW9uIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBWTkMgZGlzcGxheSBudW1iZXIgdG8gdGhlIFgKLSAgIGRpc3BsYXkgKGUuZy4gWDExIERJU1BMQVkgb2YgOjUgKHBvcnQgNjAwNSkgd2lsbCBoYXZlIFZOQyBkaXNwbGF5IDo1Ci0gICAocG9ydCA1OTA1KS4pCi0KLSAgIEFsc28gc2VlIHRoZSAiLWF1dG9wb3J0IG4iIG9wdGlvbiB0byBpbmRpY2F0ZWQgYXQgd2hpY2ggdmFsdWUgdGhlIGF1dG8KLSAgIHByb2Jpbmcgc2hvdWxkIHN0YXJ0IGF0LgotCi0KLSAgIFEtMTE6IE15IEZpcmV3YWxsL1JvdXRlciBkb2Vzbid0IGFsbG93IFZOQyBWaWV3ZXJzIHRvIGNvbm5lY3QgdG8KLSAgIHgxMXZuYy4KLQotICAgU2VlIHRoZSBGaXJld2FsbHMvUm91dGVycyBkaXNjdXNzaW9uLgotCi0KLSAgIFEtMTI6IElzIGl0IHBvc3NpYmxlIGZvciBhIFZOQyBWaWV3ZXIgYW5kIGEgVk5DIFNlcnZlciB0byBjb25uZWN0IHRvCi0gICBlYWNoIG90aGVyIGV2ZW4gdGhvdWdoIGJvdGggYXJlIGJlaGluZCBGaXJld2FsbHMgdGhhdCBibG9jayBhbGwKLSAgIGluY29taW5nIGNvbm5lY3Rpb25zPwotCi0gICBUaGlzIGlzIHZlcnkgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gZG8gdW5sZXNzIGEgdGhpcmQgbWFjaGluZSwKLSAgIHJlYWNoYWJsZSBieSBib3RoLCBpcyB1c2VkIGFzIGEgcmVsYXkuIFNvIHdlIGFzc3VtZSBhIHRoaXJkIG1hY2hpbmUgaXMKLSAgIHNvbWVob3cgYmVpbmcgdXNlZCBhcyBhIHJlbGF5LgotCi0gICAoVXBkYXRlOiBJdCBtYXkgYmUgcG9zc2libGUgdG8gZG8gIk5BVC0yLU5BVCIgd2l0aG91dCBhIHJlbGF5IG1hY2hpbmUKLSAgIGJ5IHVzaW5nIGEgVURQIHR1bm5lbCBzdWNoIGFzIGh0dHA6Ly9zYW15LnBsL3B3bmF0Ly4gQWxsIHRoYXQgaXMKLSAgIHJlcXVpcmVkIGlzIHRoYXQgYm90aCBOQVQgZmlyZXdhbGxzIGFsbG93IGluIFVEUCBwYWNrZXRzIGZyb20gYW4gSVAKLSAgIGFkZHJlc3MgdG8gd2hpY2ggYSBVRFAgcGFja2V0IGhhcyByZWNlbnRseSBiZWVuIHNlbnQgdG8uIElmIHlvdSB0cnkgaXQKLSAgIG91dCBsZXQgdXMga25vdyBob3cgaXQgd2VudC4pCi0KLSAgIEluIHRoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiwgd2Ugd2lsbCBzdXBwb3NlIHBvcnQgNTk1MCBpcyBiZWluZyB1c2VkCi0gICBvbiB0aGUgcmVsYXkgbWFjaGluZSBhcyB0aGUgVk5DIHBvcnQgZm9yIHRoZSByZW5kZXp2b3VzLgotCi0gICBBIHdheSB0byByZW5kZXp2b3VzIGlzIHRvIGhhdmUgdGhlIFZOQyBTZXJ2ZXIgc3RhcnQgYSByZXZlcnNlCi0gICBjb25uZWN0aW9uIHRvIHRoZSByZWxheSBtYWNoaW5lOgotICAgeDExdm5jIC1jb25uZWN0IHRoaXJkLW1hY2hpbmUubmV0OjU5NTAgLi4uCi0KLSAgIGFuZCB0aGUgVk5DIHZpZXdlciBmb3J3YXJkIGNvbm5lY3RzIGFzIHVzdWFsOgotICAgdm5jdmlld2VyIHRoaXJkLW1hY2hpbmUubmV0OjUwCi0KLSAgIE9yIG1heWJlIHR3byBwb3J0cyB3b3VsZCBiZSBpbnZvbHZlZCwgZS5nLiB0aGUgdmlld2VyIGdvZXMgdG8gZGlzcGxheQotICAgOjUxICg1OTUxLikgSXQgZGVwZW5kcyBvbiB0aGUgcmVsYXkgc29mdHdhcmUgYmVpbmcgdXNlZC4KLQotICAgV2hhdCBzb2Z0d2FyZSB0byBydW4gb24gdGhpcmQtbWFjaGluZT8gQSBUQ1AgcmVsYXkgb2Ygc29tZSBzb3J0IGNvdWxkCi0gICBiZSB1c2VkLi4uIFRyeSBhIGdvb2dsZSBzZWFyY2ggb24gInRjcCByZWxheSIgb3IgImlwIHJlbGF5Ii4gSG93ZXZlciwKLSAgIG5vdGUgdGhhdCB0aGlzIGlzbid0IGEgc2ltcGxlIHJlZGlyZWN0aW9uIGJlY2F1c2UgaXQgaG9va3MgdXAgdHdvCi0gICBpbmNvbWluZyBjb25uZWN0aW9ucy4gWW91IGNhbiBsb29rIGF0IG91ciBVbHRyYVZOQyByZXBlYXRlcgotICAgaW1wbGVtZW50YXRpb24gdWx0cmF2bmNfcmVwZWF0ZXIucGwgZm9yIGlkZWFzIGFuZCBwb3NzaWJseSB0bwotICAgY3VzdG9taXplLgotCi0gICBBbHNvLCBpZiB5b3UgYXJlIG5vdCB0aGUgYWRtaW4gb2YgdGhpcmQtbWFjaGluZSB5b3UnZCBoYXZlIHRvIGNvbnZpbmNlCi0gICB0aGUgb3duZXIgdG8gYWxsb3cgeW91IHRvIGluc3RhbGwgdGhpcyBzb2Z0d2FyZSAoYW5kIGhlIHdvdWxkIGxpa2VseQotICAgbmVlZCB0byBvcGVuIGhpcyBzZXJ2ZXIncyBmaXJld2FsbCB0byBhbGxvdyB0aGUgcG9ydCB0aHJvdWdoLikKLQotICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBTU0wgaXMgdXNlZCBmb3IgZW5jcnlwdGlvbiAoZS5nLiAiLXNzbCBTQVZFIikKLSAgIHdoZW4gZ29pbmcgb3ZlciB0aGUgaW50ZXJuZXQuCi0KLSAgIFdlIGhhdmUgYSBwcm90b3R5cGUgZm9yIHBlcmZvcm1pbmcgYSByZW5kZXp2b3VzIHZpYSBhIFdlYiBTZXJ2ZXIKLSAgIGFjdGluZyBhcyB0aGUgcmVsYXkgbWFjaGluZS4gRG93bmxvYWQgdGhlIHZuY3hmZXIgQ0dJIHNjcmlwdCBhbmQgc2VlCi0gICB0aGUgaW5zdHJ1Y3Rpb25zIGF0IHRoZSB0b3AuCi0KLSAgIE9uY2UgdGhhdCBDR0kgc2NyaXB0IGlzIHNldCB1cCBvbiB0aGUgd2Vic2l0ZSwgYm90aCB1c2VycyBnbyB0bywgc2F5LAotICAgaHR0cDovL3NvbWVzaXRlLmNvbS92bmN4ZmVyIChvciBtYXliZSBhICIvY2dpLWJpbiIgZGlyZWN0b3J5IG9yICIuY2dpIgotICAgc3VmZml4IG11c3QgYmUgdXNlZC4pIFByZXZpb3VzbHksIGJvdGggaGF2ZSBhZ3JlZWQgb24gdGhlIHNhbWUgc2Vzc2lvbgotICAgbmFtZSAoc2F5IGJ5IHBob25lIG9yIGVtYWlsKSAsIGUuZy4gIjVjb3dzIiwgYW5kIHB1dCB0aGF0IGludG8gdGhlCi0gICBlbnRyeSBmb3JtIG9uIHRoZSB2bmN4ZmVyIHN0YXJ0aW5nIHBhZ2UgKGhvcGVmdWxseSBzZXBhcmF0ZWQgYnkgYSBmZXcKLSAgIHNlY29uZHMsIHNvIHRoZSByZWxheSBoZWxwZXIgY2FuIGZ1bGx5IHN0YXJ0IHVwIGF0IHRoZSBmaXJzdCByZXF1ZXN0LikKLQotICAgVGhlIHBhZ2UgcmV0dXJuZWQgdGVsbHMgdGhlbSB0aGUgaG9zdG5hbWUgYW5kIHBvcnQgbnVtYmVyIGFuZCBwb3NzaWJsZQotICAgY29tbWFuZCB0byB1c2UgZm9yIGZvcndhcmQgKFZOQyBWaWV3ZXIpIGFuZCByZXZlcnNlIChWTkMgU2VydmVyLCBpLmUuCi0gICB4MTF2bmMpIGNvbm5lY3Rpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotICAgQWxzbyBzaW5jZSBPY3QvMjAwNywgeDExdm5jIGNhbiBjb25uZWN0IGRpcmVjdGx5IChubyB3ZWIgYnJvd3NlciksCi0gICBsaWtlIHRoaXM6Ci0gICB4MTF2bmMgLi4uIC1jb25uZWN0IGxvY2FsaG9zdDowIC1wcm94eSAnaHR0cDovL3NvbWVzaXRlLmNvbS92bmN4ZmVyP3Nlc3Npb249Ci01Y293cyYnCi0KLSAgIFVuZm9ydHVuYXRlbHkgdGhlIHByb3RvdHlwZSByZXF1aXJlcyB0aGF0IHRoZSBXZWIgc2VydmVyJ3MgZmlyZXdhbGwKLSAgIGFsbG93IGluIHRoZSBwb3J0IChlLmcuIDU5NTApIHVzZWQgZm9yIHRoZSByZW5kZXp2b3VzLiBNb3N0IHdlYgotICAgc2VydmVycyBhcmUgbm90IGNvbmZpZ3VyZWQgdG8gZG8gdGhpcywgc28geW91IHdvdWxkIG5lZWQgdG8gYXNrIHRoZQotICAgYWRtaW4gdG8gZG8gdGhpcyBmb3IgeW91LiBOZWFybHkgYWxsIGZyZWUgd2Vic3BhY2Ugc2l0ZXMsIGUuZy4KLSAgIHd3dy56ZW5kdXJsLmNvbSwgd2lsbCBub3QgYWxsb3cgeW91ciBDR0kgc2NyaXB0IHRvIGJlIGFuIG9wZW4gcmVsYXkKLSAgIGxpa2UgdGhpcy4gKElmIHlvdSBmaW5kIG9uZSB0aGF0IGRvZXMgYWxsb3cgdGhpcywgbGV0IG1lIGtub3chKQotCi0gICBNYXliZSBzb21lZGF5IGEgY2xldmVyIHRyaWNrIHdpbGwgYmUgdGhvdWdodCB1cCB0byByZWxheCB0aGUgbGlzdGVuaW5nCi0gICBwb3J0IHJlcXVpcmVtZW50IChlLmcuIHVzZSBIVFRQL0NHSSBpdHNlbGYgZm9yIHRoZSB0cmFuc2Zlci4uLiBpdCBpcwotICAgZGlmZmljdWx0IHRvIGVtdWxhdGUgYSBmdWxsLWR1cGxleCBUQ1AgY29ubmVjdGlvbiB3aXRoIHRoZW0uKQotCi0gICBTZWUgYWxzbyB0aGUgRmlyZXdhbGxzL1JvdXRlcnMgZGlzY3Vzc2lvbiBhbmQgUmV2ZXJzZSBDb25uZWN0aW9uIFByb3h5Ci0gICBkaXNjdXNzaW9uLgotCi0KLSAgIFNTSCBtZXRob2Q6IElmIGJvdGggdXNlcnMgKGkuZS4gb25lIG9uIFZpZXdlci1zaWRlIGFuZCB0aGUgb3RoZXIgb24KLSAgIHgxMXZuYyBzZXJ2ZXIgc2lkZSkgaGF2ZSBTU0ggYWNjZXNzIHRvIGEgY29tbW9uIG1hY2hpbmUgb24gdGhlCi0gICBpbnRlcm5ldCAob3Igb3RoZXJ3aXNlIG11dHVhbGx5IHJlYWNoYWJsZSksIHRoZW4gU1NIIHBsdW1iaW5nIGNhbiBiZQotICAgdXNlZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0uIFRoZSB1c2VycyBjcmVhdGUgU1NIIHR1bm5lbHMgZ29pbmcgdGhyb3VnaAotICAgdGhlIFNTSCBsb2dpbiBtYWNoaW5lLgotCi0gICBJbnN0ZWFkIG9mIGFzc3VtaW5nIHBvcnQgNTkwMCBpcyBmcmVlIG9uIHRoZSBTU0ggbWFjaGluZSwgd2Ugd2lsbAotICAgYXNzdW1lIGJvdGggdXNlcnMgYWdyZWVkIHRvIHVzZSA1OTMzLiBUaGlzIHdpbGwgaWxsdXN0cmF0ZSBob3cgdG8gdXNlCi0gICBhIGRpZmZlcmVudCBwb3J0IGZvciB0aGUgcmVkaXIuIEl0IGNvdWxkIGJlIGFueSBwb3J0LCB3aGF0IG1hdHRlcnMgaXMKLSAgIHRoYXQgYm90aCBwYXJ0aWVzIHJlZmVyIHRvIHRoZSBzYW1lIG9uZS4KLQotICAgU2V0IHVwIHRoZSBUdW5uZWwgZnJvbSB0aGUgVk5DIFNlcnZlciBzaWRlOgotICAgc3NoIC10IC1SIDU5MzM6bG9jYWxob3N0OjU5MDAgdXNlckB0aGlyZC1tYWNoaW5lLm5ldAotCi0gICBTZXQgdXAgdGhlIFR1bm5lbCBmcm9tIHRoZSBWTkMgVmlld2VyIHNpZGU6Ci0gICBzc2ggLXQgLUwgNTkwMDpsb2NhbGhvc3Q6NTkzMyB1c2VyQHRoaXJkLW1hY2hpbmUubmV0Ci0KLSAgIFJ1biBTZXJ2ZXIgb24gdGhlIFZOQyBTZXJ2ZXIgc2lkZToKLSAgIHgxMXZuYyAtcmZicG9ydCA1OTAwIC1sb2NhbGhvc3QgLi4uCi0KLSAgIFJ1biBWaWV3ZXIgb24gdGhlIFZOQyBWaWV3ZXIgc2lkZToKLSAgIHZuY3ZpZXdlciAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUiIGxvY2FsaG9zdDowCi0KLSAgICh3ZSBhc3N1bWUgdGhlIG9sZC1zdHlsZSAtZW5jb2RpbmdzIG9wdGlvbiBuZWVkcyB0byBiZSB1c2VkLiBTZWUgaGVyZQotICAgZm9yIGRldGFpbHMuKQotCi0gICBJZiB0aGUgU1NIIG1hY2hpbmUgaGFzIGJlZW4gY29uZmlndXJlZCAoc2VlIHNzaGRfY29uZmlnKDUpKSB3aXRoIHRoZQotICAgb3B0aW9uIEdhdGV3YXlQb3J0cz15ZXMsIHRoZW4gdGhlIHR1bm5lbCBzZXQgdXAgYnkgdGhlIFZOQyBTZXJ2ZXIgd2lsbAotICAgYmUgcmVhY2hhYmxlIGRpcmVjdGx5IGJ5IHRoZSBWTkMgdmlld2VyIChhcyBsb25nIGFzIHRoZSBTU0ggbWFjaGluZSdzCi0gICBmaXJld2FsbCBkb2VzIG5vdCBibG9jayB0aGUgcG9ydCwgNTkzMyBpbiB0aGlzIGV4YW1wbGUuKSBTbyBpbiB0aGF0Ci0gICBjYXNlIHRoZSBWaWV3ZXIgc2lkZSBkb2VzIG5vdCBuZWVkIHRvIHJ1biBhbnkgc3NoIGNvbW1hbmQsIGJ1dCByYXRoZXIKLSAgIG9ubHkgcnVuczoKLSAgIHZuY3ZpZXdlciB0aGlyZC1tYWNoaW5lLm5ldDozMwotCi0gICBJbiB0aGlzIGNhc2Ugd2UgcmVjb21tZW5kIFNTTCBiZSB1c2VkIGZvciBlbmNyeXB0aW9uLgotCi0gICBUaGUgY3JlYXRpb24gb2YgYm90aCB0dW5uZWxzIGNhbiBiZSBhdXRvbWF0ZWQuIEFzIG9mIE9jdC8yMDA3IHRoZSAtc3NoCi0gICB4MTF2bmMgb3B0aW9uIGlzIGF2YWlsYWJsZSBhbmQgc28gb25seSB0aGlzIGNvbW1hbmQgbmVlZHMgdG8gYmUgcnVuIG9uCi0gICB0aGUgVk5DIFNlcnZlciBzaWRlOgotICAgeDExdm5jIC1zc2ggdXNlckB0aGlyZC1tYWNoaW5lLm5ldDozMyAuLi4KLQotICAgKHRoZSBTU0ggcGFzc3BocmFzZSBtYXkgbmVlZCB0byBiZSBzdXBwbGllZC4pCi0KLSAgIFRvIGF1dG9tYXRlIG9uIHRoZSBWTkMgVmlld2VyIHNpZGUsIHRoZSB1c2VyIGNhbiB1c2UgdGhlIEVuaGFuY2VkCi0gICBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBieToKLSAgICAgKiBDbGlja2luZyBvbiAnVXNlIFNTSCcKLSAgICAgKiBFbnRlcmluZyB1c2VyQHRoaXJkLW1hY2hpbmUubmV0OjMzIGludG8gJ1ZOQyBIb3N0OkRpc3BsYXknIGVudHJ5Ci0gICAgICAgYm94Ci0gICAgICogQ2xpY2tpbmcgb24gJ0Nvbm5lY3QnCi0KLSAgIEFzIGFib3ZlLCBpZiB0aGUgU1NIIEdhdGV3YXlQb3J0cz15ZXMgc2V0dGluZyBpcyBjb25maWd1cmVkIHRoZSBWaWV3ZXIKLSAgIHNpZGUgZG9lc24ndCBuZWVkIHRvIGNyZWF0ZSBhIFNTSCB0dW5uZWwuIEluIFNTVk5DIHRoZSBWaWV3ZXIgdXNlcgotICAgY291bGQgaW5zdGVhZCBzZWxlY3QgJ1VzZSBTU0wnIGFuZCB0aGVuLCBlLmcuLCBvbiB0aGUgU2VydmVyIHNpZGUKLSAgIHN1cHBseSAiLXNzbCBTQVZFIiB0byB4MTF2bmMuIFRoZW4gZW5kLXRvLWVuZCBTU0wgZW5jcnlwdGlvbiB3b3VsZCBiZQotICAgdXNlZCAoaW4gYWRkaXRpb24gdG8gdGhlIFNTSCBlbmNyeXB0aW9uIG9uIHRoZSBTZXJ2ZXItc2lkZSBsZWcuKQotCi0KLSAgIFEtMTM6IENhbiBJIG1ha2UgeDExdm5jIG1vcmUgcXVpZXQgYW5kIGFsc28gZ28gaW50byB0aGUgYmFja2dyb3VuZAotICAgYWZ0ZXIgc3RhcnRpbmcgdXA/Ci0KLSAgIFVzZSB0aGUgLXEgYW5kIC1iZyBvcHRpb25zLCByZXNwZWN0aXZlbHkuICAoYWxzbzogLXF1aWV0IGlzIGFuIGFsaWFzCi0gICBmb3IgLXEpCi0KLSAgIE5vdGUgdGhhdCB1bmRlciAtYmcgdGhlIHN0ZGVyciBtZXNzYWdlcyB3aWxsIGJlIGxvc3QgdW5sZXNzIHlvdSB1c2UKLSAgIHRoZSAiLW8gbG9nZmlsZSIgb3B0aW9uLgotCi0KLSAgIFEtMTQ6IFNvbWV0aW1lcyB3aGVuIGEgVk5DIHZpZXdlciBkaWVzIGFicnVwdGx5LCB4MTF2bmMgYWxzbyBkaWVzIHdpdGgKLSAgIHRoZSBlcnJvciBtZXNzYWdlIGxpa2U6ICJCcm9rZW4gcGlwZSIuIEknbSB1c2luZyB0aGUgLWZvcmV2ZXIgbW9kZSBhbmQKLSAgIEkgd2FudCB4MTF2bmMgdG8ga2VlcCBydW5uaW5nLgotCi0gICBBcyBvZiBKYW4vMjAwNCB0aGUgU0lHUElQRSBzaWduYWwgaXMgaWdub3JlZC4gU28gaWYgYSB2aWV3ZXIgY2xpZW50Ci0gICB0ZXJtaW5hdGVzIGFicnVwdGx5LCBsaWJ2bmNzZXJ2ZXIgd2lsbCBub3RpY2Ugb24gdGhlIG5leHQgSS9PCi0gICBvcGVyYXRpb24gYW5kIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlIG9uLgotCi0gICBVcCB1bnRpbCBvZiBBcHIvMjAwNCB0aGUgYWJvdmUgZml4IG9ubHkgd29ya3MgZm9yIEJTRCBzaWduYWwgc3lzdGVtcwotICAgKExpbnV4LCBGcmVlQlNELCAuLi4pIEZvciBTWVNWIHN5c3RlbXMgdGhlcmUgaXMgYSB3b3JrYXJvdW5kIGluIHBsYWNlCi0gICBzaW5jZSBhYm91dCBKdW4vMjAwNC4KLQotCi0gICBRLTE1OiBUaGUgV2luZG93cyBUaWdodFZOQyAxLjMuOSBWaWV3ZXIgY2Fubm90IGNvbm5lY3QgdG8geDExdm5jLgotCi0gICBUaGlzIGFwcGVhcnMgdG8gYmUgZml4ZWQgaW4geDExdm5jIHZlcnNpb24gMC45IGFuZCBsYXRlci4gSWYgeW91IG5lZWQKLSAgIHRvIHVzZSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgeDExdm5jLCB0cnkgdXNpbmcgdGhlICItcmZidmVyc2lvbiAzLjciCi0gICBvcHRpb24uIEluIGdlbmVyYWwgc29tZXRpbWVzIG9uZSBjYW4gZ2V0IGEgbWlzYmVoYXZpbmcgdmlld2VyIHRvIHdvcmsKLSAgIGJ5IHN1cHBseWluZyByZmIgdmVyc2lvbnMgMy43IG9yIDMuMy4KLQotCi0gICBRLTE2OiBLREUncyBrcmRjIFZOQyB2aWV3ZXIgY2Fubm90IGNvbm5lY3QgdG8geDExdm5jLgotCi0gICBUaGlzIGhhcyBiZWVuIGZpeGVkIGluIHgxMXZuYyB2ZXJzaW9uIDAuOC40LiBNb3JlIGluZm8gaGVyZSwgaGVyZSwgYW5kCi0gICBoZXJlLgotCi0KLSAgIFEtMTc6IFdoZW4gSSBzdGFydCB4MTF2bmMgb24gYW4gQWxwaGEgVHJ1NjQgd29ya3N0YXRpb24gdGhlIFggc2VydmVyCi0gICBjcmFzaGVzIQotCi0gICBUaGlzIGlzIGEgYnVnIGluIHRoZSBYIHNlcnZlciBvYnZpb3VzbHk7IGFuIFggY2xpZW50IHNob3VsZCBuZXZlciBiZQotICAgYWJsZSB0byBjcmFzaCBpdC4KLQotICAgVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUgd2l0aCB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uIGFuZCBzbyBhCi0gICB3b3JrYXJvdW5kIGlzIHRvIHVzZSB0aGUgIi1ub3hyZWNvcmQiIHgxMXZuYyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi0KLSAgIFEtMTg6IFdoZW4gcnVubmluZyB4MTF2bmMgb24gYW4gSUJNIEFJWCB3b3Jrc3RhdGlvbiBhZnRlciBhIGZldwotICAgbWludXRlcyB0aGUgVk5DIGNvbm5lY3Rpb24gZnJlZXplcy4KLQotICAgT25lIHVzZXIgcmVwb3J0cyB3aGVuIHJ1bm5pbmcgeDExdm5jIG9uIEFJWCA1LjMgaW4gaGlzIENERSBzZXNzaW9uCi0gICBhZnRlciBhIGZldyBtaW51dGVzIG9yIHNlY29uZHMgeDExdm5jIHdpbGwgImZyZWV6ZSIgKG5vIG1vcmUgdXBkYXRlcwotICAgYmVpbmcgc2VudCwgZXRjLikgVGhlIGZyZWV6aW5nIGFwcGVhcmVkIHRvIGJlIHdvcnNlIGZvciB2ZXJzaW9ucyBsYXRlcgotICAgdGhhbiAwLjkuMi4KLQotICAgVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUgd2l0aCB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uIG9uIEFJWCBhbmQgc28gYQotICAgd29ya2Fyb3VuZCBpcyB0byB1c2UgdGhlICItbm94cmVjb3JkIiB4MTF2bmMgY29tbWFuZCBsaW5lIG9wdGlvbi4gVGhlCi0gICB1c2VyIGZvdW5kIG5vIGZyZWV6ZXMgb2NjdXJyZWQgd2hlbiB1c2luZyB0aGF0IG9wdGlvbi4KLQotCi0gICBRLTE5OiBBcmUgdGhlcmUgYW55IGJ1aWxkLXRpbWUgY3VzdG9taXphdGlvbnMgcG9zc2libGUsIGUuZy4gY2hhbmdlCi0gICBkZWZhdWx0cywgY3JlYXRlIGEgc21hbGxlciBiaW5hcnksIGV0Yz8KLQotICAgVGhlcmUgYXJlIHNvbWUgb3B0aW9ucy4gVGhleSBhcmUgZW5hYmxlZCBieSBhZGRpbmcgc29tZXRoaW5nIGxpa2UKLSAgIC1EeHh4eD0xIHRvIHRoZSBDUFBGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBjb25maWd1cmUKLSAgIChzZWUgdGhlIGJ1aWxkIG5vdGVzIGZvciBnZW5lcmFsIGJhY2tncm91bmQuKQotLyoKLSAqIE1hci8yMDA2Ci0gKiBCdWlsZC10aW1lIGN1c3RvbWl6YXRpb24gdmlhIENQUEZMQUdTLgotICoKLSAqIFN1bW1hcnkgb2Ygb3B0aW9ucyB0byBpbmNsdWRlIGluIENQUEZMQUdTIGZvciBjdXN0b20gYnVpbGRzOgotICoKLSAqIC1EVk5DU0hBUkVEICB0byBoYXZlIHRoZSB2bmMgZGlzcGxheSBzaGFyZWQgYnkgZGVmYXVsdC4KLSAqIC1ERk9SRVZFUiAgdG8gaGF2ZSAtZm9yZXZlciBvbiBieSBkZWZhdWx0LgotICogLUROT1JFUEVBVD0wICB0byBoYXZlIC1yZXBlYXQgb24gYnkgZGVmYXVsdC4KLSAqIC1EQURES0VZU1lNUz0wICB0byBoYXZlIC1ub2FkZF9rZXlzeW1zIHRoZSBkZWZhdWx0LgotICoKLSAqIC1EUkVNT1RFX0RFRkFVTFQ9MCAgdG8gZGlzYWJsZSByZW1vdGUtY29udHJvbCBvbiBieSBkZWZhdWx0ICgteWVzcmVtb3RlLikKLSAqIC1EUkVNT1RFX0NPTlRST0w9MCAgdG8gZGlzYWJsZSByZW1vdGUtY29udHJvbCBtZWNoYW5pc20gY29tcGxldGVseS4KLSAqIC1ERVhURVJOQUxfQ09NTUFORFM9MCAgdG8gZGlzYWJsZSB0aGUgcnVubmluZyBvZiBhbGwgZXh0ZXJuYWwgY29tbWFuZHMuCi0gKiAtREZJTEVYRkVSPTAgIGRpc2FibGUgZmlsZXhmZXIuCi0gKgotICogLURIQVJEV0lSRV9QQVNTV0Q9Li4uICAgICAgaGFyZHdpcmVkIHBhc3N3b3JkcywgcXVvdGluZyBuZWNlc3NhcnkuCi0gKiAtREhBUkRXSVJFX1ZJRVdQQVNTV0Q9Li4uCi0gKiAtRE5PUFc9MSAgICAgICAgICAgICAgICAgICBtYWtlIC1ub3B3IHRoZSBkZWZhdWx0IChza2lwIHdhcm5pbmcpCi0gKiAtRFVTRVBXPTEgICAgICAgICAgICAgICAgICBtYWtlIC11c2VwdyB0aGUgZGVmYXVsdAotICogLURQQVNTV0RfUkVRVUlSRUQ9MSAgICAgICAgZXhpdCB1bmxlc3MgYSBwYXNzd29yZCBpcyBzdXBwbGllZC4KLSAqIC1EUEFTU1dEX1VOTEVTU19OT1BXPTEgICAgIGV4aXQgdW5sZXNzIGEgcGFzc3dvcmQgaXMgc3VwcGxpZWQgYW5kIG5vIC1ub3B3LgotICoKLSAqIC1EV0lSRUZSQU1FPTAgIHRvIGhhdmUgLW5vd2lyZWZyYW1lIGFzIHRoZSBkZWZhdWx0LgotICogLURXSVJFRlJBTUVfQ09QWVJFQ1Q9MCAgdG8gaGF2ZSAtbm93aXJlY29weXJlY3QgYXMgdGhlIGRlZmF1bHQuCi0gKiAtRFdJUkVGUkFNRV9QQVJNUz0uLi4gICBzZXQgZGVmYXVsdCAtd2lyZWNvcHlyZWN0IHBhcmFtZXRlcnMuCi0gKiAtRFNDUk9MTF9DT1BZUkVDVD0wICAgICB0byBoYXZlIC1ub3Njcm9sbGNvcHlyZWN0IGFzIHRoZSBkZWZhdWx0LgotICogLURTQ1JPTExfQ09QWVJFQ1RfUEFSTVM9Li4uICBzZXQgZGVmYXVsdCAtc2Nyb2xsY29weXJlY3QgcGFyYW1ldGVycy4KLSAqIC1EU0NBTElOR19DT1BZUkVDVD0wCi0gKiAtRFhEQU1BR0U9MCAgICB0byBoYXZlIC1ub3hkYW1hZ2UgYXMgdGhlIGRlZmF1bHQuCi0gKiAtRFNLSVBEVVBTPTAgICB0byBoYXZlIC1ub3NraXBfZHVwcyBhcyB0aGUgZGVmYXVsdCBvciB2aWNlIHZlcnNhLgotICoKLSAqIC1EUE9JTlRFUl9NT0RFX0RFRkFVTFQ9ezAsMSwyLDMsNH0gIHNldCBkZWZhdWx0IC1wb2ludGVyX21vZGUuCi0gKiAtREJPTERMWV9DTE9TRV9ESVNQTEFZPTAgIHRvIG5vdCBjbG9zZSBYIERJU1BMQVkgdW5kZXIgLXJhd2ZiLgotICogLURTTUFMTF9GT09UUFJJTlQ9MSAgZm9yIHNtYWxsZXIgYmluYXJ5IHNpemUgKG5vIGhlbHAsIG5vIGd1aSwgZXRjKQotICogICAgICAgICAgICAgICAgICAgICAgdXNlIDIgb3IgMyBmb3IgZXZlbiBzbWFsbGVyIGZvb3RwcmludC4KLSAqIC1ETk9HVUkgIGRvIG5vdCBpbmNsdWRlIHRoZSBndWkgdGt4MTF2bmMuCi0gKiAtRFBPTExfOFRPMjRfREVMQVk9TgotICogLURERUJVR19YRVZFTlRTPTEgIGVuYWJsZSBwcmludG91dCBmb3IgWCBldmVudHMuCi0gKgotICogU2V0IHRoZXNlIGluIENQUEZMQUdTIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS4gRS5nLjoKLSAqCi0gKiAgICUgZW52IENQUEZMQUdTPSItREZPUkVWRVIgLURSRU1PVEVfQ09OVFJPTD0wIiAuL2NvbmZpZ3VyZQotICogICAlIG1ha2UKLSAqLwotCi0gICBJZiBvdGhlciB0aGluZ3MgKGUuZy4gIi1JIC4uLiIpIGFyZSBuZWVkZWQgaW4gQ1BQRkxBR1MgYWRkIHRoZW0gYXMKLSAgIHdlbGwuCi0KLSAgIE9uIHNvbWUgc3lzdGVtcyBpcyBzZWVtcyB5b3UgbmVlZCB0byBzZXQgTENfQUxMPUMgZm9yIGNvbmZpZ3VyZSB0bwotICAgd29yayBwcm9wZXJseS4uLgotCi0gICBCZSBjYXJlZnVsIHRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlczogSEFSRFdJUkVfUEFTU1dEIGFuZAotICAgSEFSRFdJUkVfVklFV1BBU1NXRC4gSWYgc2V0IChyZW1lbWJlciB0byBpbmNsdWRlIHRoZSBkb3VibGUgcXVvdGVzCi0gICBhcm91bmQgdGhlIHN0cmluZyksIHRoZXkgd2lsbCBiZSB1c2VkIGFzIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUKLSAgIC1wYXNzd2QgYW5kIC12aWV3cGFzc3dkIG9wdGlvbnMuIE9mIGNvdXJzZSB0aGUgc3RyaW5ncyB3aWxsIGV4aXN0Ci0gICB1bm9ic2N1cmVkIGluIHRoZSB4MTF2bmMgYmluYXJ5OiBpdCBiZXR0ZXIgbm90IGJlIHJlYWRhYmxlIGJ5Ci0gICB1bmludGVuZGVkcy4gUGVyaGFwcyB0aGlzIGlzIG9mIHVzZSBpbiByZW1vdGUgYWNjZXNzIGZvciBhbiBlbWJlZGRlZAotICAgYXBwbGljYXRpb24sIGV0Yy4uLgotCi0gICBMZXQgdXMga25vdyBpZiBtb3JlIGJ1aWxkLXRpbWUgY3VzdG9taXphdGlvbnMgd291bGQgYmUgdXNlZnVsLgotCi0KLSAgIFtXaW4yVk5DIFJlbGF0ZWRdCi0KLSAgIFEtMjA6IEkgaGF2ZSB0d28gc2VwYXJhdGUgbWFjaGluZSBkaXNwbGF5cyBpbiBmcm9udCBvZiBtZSwgb25lIFdpbmRvd3MKLSAgIHRoZSBvdGhlciBYMTE6IGNhbiBJIHVzZSB4MTF2bmMgaW4gY29tYmluYXRpb24gd2l0aCBXaW4yVk5DIGluCi0gICBkdWFsLXNjcmVlbiBtb2RlIHRvIHBhc3MgdGhlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdGlvbnMgdG8gdGhlIFgxMQotICAgZGlzcGxheT8KLQotICAgWWVzLCBmb3IgYmVzdCByZXNwb25zZSBzdGFydCB1cCB4MTF2bmMgd2l0aCB0aGUgIi1ub2ZiIiBvcHRpb24KLSAgIChkaXNhYmxlcyBmcmFtZWJ1ZmZlciBwb2xsaW5nLCBhbmQgZG9lcyBvdGhlciBvcHRpbWl6YXRpb25zKSBvbiB0aGUKLSAgIHNlY29uZGFyeSBkaXNwbGF5IChYMTEpIG1hY2hpbmUuIFRoZW4gc3RhcnQgdXAgV2luMlZOQyBvbiB0aGUgcHJpbWFyeQotICAgZGlzcGxheSAoV2luZG93cykgcmVmZXJyaW5nIGl0IHRvIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KLQotICAgVGhpcyB3aWxsIGFsc28gd29yayBYMTEgdG8gWDExIHVzaW5nIHgydm5jLCBob3dldmVyIHlvdSB3b3VsZCBwcm9iYWJseQotICAganVzdCB3YW50IHRvIGF2b2lkIFZOQyBhbmQgdXNlIHgyeCBmb3IgdGhhdC4KLQotICAgRm9yIHJlZmVyZW5jZSwgaGVyZSBhcmUgc29tZSBsaW5rcyB0byBXaW4yVk5DLWxpa2UgcHJvZ3JhbXMgZm9yCi0gICBtdWx0aXBsZSBtb25pdG9yIHNldHVwczoKLSAgICAgKiBPcmlnaW5hbCBXaW4yVk5DCi0gICAgICogRW5oYW5jZWQgV2luMlZOQyAoYnJva2VuPykgYW5kIHNvdXJjZWZvcmdlIGxpbmsKLSAgICAgKiB4MnZuYwotICAgICAqIHgyeAotICAgICAqIHp2bmMgKE1vcnBoT1MpCi0KLSAgIEFsbCBvZiB0aGVtIHdpbGwgd29yayB3aXRoIHgxMXZuYyAoZXhjZXB0IHgyeCB3aGVyZSBpdCBpcyBub3QgbmVlZGVkLikKLQotCi0gICBRLTIxOiBJIGFtIHJ1bm5pbmcgV2luMlZOQyBvbiBteSBXaW5kb3dzIG1hY2hpbmUgYW5kICJ4MTF2bmMgLW5vZmIiIG9uCi0gICBVbml4IHRvIHBhc3Mga2V5Ym9hcmQgYW5kIG1vdXNlIHRvIHRoZSBVbml4IG1vbml0b3IuIFdoZW5ldmVyIEkgc3RhcnQKLSAgIFdpbjJWTkMgaXQgcXVpY2tseSBkaXNjb25uZWN0cyBhbmQgeDExdm5jIHNheXM6Ci0gICByZmJQcm9jZXNzQ2xpZW50Tm9ybWFsTWVzc2FnZTogcmVhZDogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyCi0KLSAgIElzIHRoZSBkZWZhdWx0IHZpc3VhbCBvZiB0aGUgWCBkaXNwbGF5IHlvdSBydW4geDExdm5jIG9uIGxvdyBjb2xvcgotICAgKGUuZy4gOCBiaXQgcGVyIHBpeGVsIFBzZXVkb0NvbG9yKT8gKHlvdSBjYW4gcnVuIHhkcHlpbmZvIHRvIGNoZWNrLAotICAgbG9vayBpbiB0aGUgInNjcmVlbiIgc2VjdGlvbi4pIFRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIFdpbjJWTkMgaW4KLSAgIHRoYXQgaXQgY2Fubm90IGRlYWwgY29ycmVjdGx5IHdpdGggY29sb3JtYXBzIChQc2V1ZG9Db2xvciBpcyB0aGUgbW9zdAotICAgY29tbW9uIGV4YW1wbGUgb2YgYSB2aXN1YWwgd2l0aCBhIGNvbG9ybWFwLikKLQotICAgSWYgc28sIHRoZXJlIGFyZSBhIGNvdXBsZSBvcHRpb25zLiAxKSBDYW4geW91IHNldCB0aGUgZGVmYXVsdCB2aXN1YWwKLSAgIG9uIHlvdXIgZGlzcGxheSB0byBiZSBkZXB0aCAyNCBUcnVlQ29sb3I/IFN1biBtYWNoaW5lcyBvZnRlbiBoYXZlIDgrMjQKLSAgIG92ZXJsYXkvbXVsdGktZGVwdGggdmlzdWFscywgYW5kIHlvdSBjYW4gbWFrZSB0aGUgZGVmYXVsdCB2aXN1YWwgZGVwdGgKLSAgIDI0IFRydWVDb2xvciAoc2VlIGZiY29uZmlnKDEpIGFuZCBYc3VuKDEpLikgMikgQXMgb2YgRmViLzIwMDQgeDExdm5jCi0gICBoYXMgdGhlIC12aXN1YWwgb3B0aW9uIHRvIGFsbG93IHlvdSB0byBmb3JjZSB0aGUgZnJhbWVidWZmZXIgdmlzdWFsIHRvCi0gICB3aGF0ZXZlciB5b3Ugd2FudCAodGhpcyB1c3VhbGx5IG1lc3NlcyB1cCB0aGUgY29sb3JzIHVubGVzcyB5b3UgYXJlCi0gICB2ZXJ5IGNsZXZlci4pIEluIHRoaXMgY2FzZSwgdGhlIG9wdGlvbiBwcm92aWRlcyBhIGNvbnZlbmllbnQKLSAgIHdvcmthcm91bmQgZm9yIHRoZSBXaW4yVk5DIGJ1ZzoKLSAgeDExdm5jIC1ub2ZiIC12aXN1YWwgVHJ1ZUNvbG9yIC1kaXNwbGF5IDowIC4uLgotCi0gICBTbyB0aGUgdmlzdWFsIHdpbGwgYmUgc2V0IHRvIDhicHAgVHJ1ZUNvbG9yIGFuZCBXaW4yVk5DIGNhbiBoYW5kbGUKLSAgIHRoaXMuIFNpbmNlIFdpbjJWTkMgZG9lcyBub3QgdXNlIHRoZSBmcmFtZWJ1ZmZlciBkYXRhIHRoZXJlIHNob3VsZCBiZQotICAgbm8gcHJvYmxlbXMgaW4gZG9pbmcgdGhpcy4KLQotICAgUS0yMjogQ2FuIEkgcnVuICJ4MTF2bmMgLW5vZmIiIG9uIGEgTWFjIE9TIFggbWFjaGluZSB0byByZWRpcmVjdCBtb3VzZQotICAgYW5kIGtleWJvYXJkIGlucHV0IHRvIGl0IGZyb20gV2luZG93cyBhbmQgWDExIG1hY2hpbmVzIHZpYSBXaW4yVk5DIGFuZAotICAgeDJ2bmMsIHJlc3BlY3RpdmVseT8KLQotICAgWWVzLCBhcyBvZiBOb3YvMjAwNiB5b3UgY2FuLiBUaGVyZSBtYXkgYmUgYSB0cmljayBvciB0d28geW91J2xsIG5lZWQKLSAgIHRvIGRvIHRvIGdldCB0aGUgQ2xpcGJvYXJkIGV4Y2hhbmdlIGJldHdlZW4gdGhlIG1hY2hpbmVzIHRvIHdvcmsuCi0KLQotCi0gICBbQ29sb3IgSXNzdWVzXQotCi0gICBRLTIzOiBUaGUgWCBkaXNwbGF5IEkgcnVuIHgxMXZuYyBvbiBpcyBvbmx5IDggYml0cyBwZXIgcGl4ZWwgKGJwcCkKLSAgIFBzZXVkb0NvbG9yIChpLmUuIG9ubHkgMjU2IGRpc3RpbmN0IGNvbG9ycy4pIFRoZSB4MTF2bmMgY29sb3JzIG1heQotICAgc3RhcnQgb3V0IE9LLCBidXQgYWZ0ZXIgYSB3aGlsZSB0aGV5IGFyZSBpbmNvcnJlY3QgaW4gY2VydGFpbiB3aW5kb3dzLgotCi0gICBVc2UgdGhlIC1mbGFzaGNtYXAgb3B0aW9uIHRvIGhhdmUgeDExdm5jIHdhdGNoIGZvciBjaGFuZ2VzIGluIHRoZQotICAgY29sb3JtYXAsIGFuZCBwcm9wYWdhdGUgdGhvc2UgY2hhbmdlcyBiYWNrIHRvIGNvbm5lY3RlZCBjbGllbnRzLiBUaGlzCi0gICBjYW4gYmUgc2xvdyAoc2luY2UgdGhlIHdob2xlIHNjcmVlbiBtdXN0IGJlIHVwZGF0ZWQgb3ZlciB0aGUgbmV0d29yawotICAgd2hlbmV2ZXIgdGhlIGNvbG9ybWFwIGNoYW5nZXMuKSBUaGlzIGZsYXNoaW5nIGNvbG9ybWFwIGJlaGF2aW9yIG9mdGVuCi0gICBoYXBwZW5zIGlmIGFuIGFwcGxpY2F0aW9uIGluc3RhbGxzIGl0cyBvd24gcHJpdmF0ZSBjb2xvcm1hcCB3aGVuIHRoZQotICAgbW91c2UgaXMgaW4gaXRzIHdpbmRvdy4gIm5ldHNjYXBlIC1pbnN0YWxsIiBpcyBhIHdlbGwta25vd24gaGlzdG9yaWNhbAotICAgZXhhbXBsZSBvZiB0aGlzLiBDb25zaWRlciByZWNvbmZpZ3VyaW5nIHRoZSBzeXN0ZW0gdG8gMTYgYnBwIG9yIGRlcHRoCi0gICAyNCBUcnVlQ29sb3IgaWYgYXQgYWxsIHBvc3NpYmxlLgotCi0gICBBbHNvIG5vdGUgdGhlIG9wdGlvbiAtOHRvMjQgKEphbi8yMDA2KSBjYW4gb2Z0ZW4gcmVtb3ZlIHRoZSBuZWVkIGZvcgotICAgZmxhc2hpbmcgdGhlIGNvbG9ybWFwLiBFdmVyeXRoaW5nIGlzIGR5bmFtaWNhbGx5IHRyYW5zZm9ybWVkIHRvIGRlcHRoCi0gICAyNCBhdCAzMiBicHAgdXNpbmcgdGhlIGNvbG9ybWFwcy4gVGhlcmUgbWF5IGJlIHBhaW50aW5nIGVycm9ycyBob3dldmVyCi0gICAoc2VlIHRoZSBmb2xsb3dpbmcgRkFRIGZvciB0aXBzIG9uIHJlZHVjaW5nIGFuZCBjb3JyZWN0aW5nIHRoZW0uKQotCi0gICBJbiBzb21lIHJhcmUgY2FzZXMgKFNDTyB1bml4d2FyZSkgdGhlIC1ub3RydWVjb2xvciBvcHRpb24gaGFzCi0gICBjb3JyZWN0ZWQgY29sb3JzIG9uIDhicHAgZGlzcGxheXMuIFRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBtYXNrcyB3ZXJlCi0gICBub24temVybyBpbiA4YnBwIFBzZXVkb0NvbG9yIG9uIGFuIG9ic2N1cmUgc2V0dXAsIGFuZCB0aGlzIG9wdGlvbgotICAgY29ycmVjdGVkIHRoZSBwcm9ibGVtcy4KLQotCi0gICBRLTI0OiBDb2xvciBwcm9ibGVtczogV2h5IGFyZSB0aGUgY29sb3JzIGZvciBzb21lIHdpbmRvd3MgaW5jb3JyZWN0IGluCi0gICB4MTF2bmM/IEJUVywgbXkgWCBkaXNwbGF5IGhhcyBuaWNlIG92ZXJsYXkvbXVsdGktZGVwdGggdmlzdWFscyBvZgotICAgZGlmZmVyZW50IGNvbG9yIGRlcHRoczogZS5nLiB0aGVyZSBhcmUgYm90aCBkZXB0aCA4IGFuZCAyNCB2aXN1YWxzCi0gICBhdmFpbGFibGUgYXQgdGhlIHNhbWUgdGltZS4KLQotICAgWW91IG1heSB3YW50IHRvIHJldmlldyB0aGUgcHJldmlvdXMgcXVlc3Rpb24gcmVnYXJkaW5nIDggYnBwCi0gICBQc2V1ZG9Db2xvci4KLQotICAgT24gc29tZSBoYXJkd2FyZSAoU3VuL1NQQVJDIGFuZCBTR0kpLCB0aGUgLW92ZXJsYXkgb3B0aW9uIGRpc2N1c3NlZCBhCi0gICBjb3VwbGUgcGFyYWdyYXBocyBkb3duIG1heSBzb2x2ZSB0aGlzIGZvciB5b3UgKHlvdSBtYXkgd2FudCB0byBza2lwIHRvCi0gICBpdCBkaXJlY3RseS4pIE9uIG90aGVyIGhhcmR3YXJlIHRoZSBsZXNzIHJvYnVzdCAtOHRvMjQgb3B0aW9uIG1heSBoZWxwCi0gICAoYWxzbyBkaXNjdXNzZWQgYmVsb3cuKQotCi0gICBSdW4geGRweWluZm8oMSkgdG8gc2VlIHdoYXQgdGhlIGRlZmF1bHQgdmlzdWFsIGlzIGFuZCB3aGF0IHRoZSBkZXB0aHMKLSAgIG9mIHRoZSBvdGhlciB2aXN1YWxzIGFyZS4gRG9lcyB0aGUgZGVmYXVsdCB2aXN1YWwgaGF2ZSBhIGRlcHRoIG9mIDgKLSAgIGJ1dCB0aGVyZSBhcmUgb3RoZXIgdmlzdWFscyBvZiBkZXB0aCAyND8gSWYgaXQgZG9lcywgY2FuIHlvdSBwb3NzaWJseQotICAgcmUtY29uZmlndXJlIHlvdXIgWCBzZXJ2ZXIgdG8gbWFrZSBhIGRlcHRoIDI0IHZpc3VhbCB0aGUgZGVmYXVsdD8gSWYKLSAgIHlvdSBjYW4gZG8gaXQsIHRoaXMgd2lsbCBzYXZlIHlvdSBhIGxvdCBvZiBncmllZiBXUlQgY29sb3JzIGFuZCB4MTF2bmMKLSAgIChhbmQgZm9yIGdlbmVyYWwgdXNhZ2UgdG9vISkgSGVyZSBpcyBob3cgSSBkbyB0aGlzIG9uIGFuIG9sZAotICAgU3BhcmNzdGF0aW9uIDIwIHJ1bm5pbmcgU29sYXJpcyA5IHdpdGggU1ggZ3JhcGhpY3MKLSAgeGluaXQgLS0gLWRldiAvZGV2L2ZiIGRlZmNsYXNzIFRydWVDb2xvciBkZWZkZXB0aCAyNAotCi0gICBhbmQgaXQgd29ya3MgbmljZWx5IChub3RlOiB0byBsb2cgaW50byBjb25zb2xlIGZyb20gdGhlIGR0bG9naW4KLSAgIHdpbmRvdywgc2VsZWN0ICJPcHRpb25zIC0+IENvbW1hbmQgTGluZSBMb2dpbiIsIHRoZW4gbG9naW4gYW5kIGVudGVyCi0gICB0aGUgYWJvdmUgY29tbWFuZC4pIFNlZSB0aGUgLWRldiBzZWN0aW9uIG9mIHRoZSBYc3VuKDEpIG1hbnBhZ2UgZm9yIGEKLSAgIGRlc2NyaXB0aW9uIG9mIHRoZSBhYm92ZSBhcmd1bWVudHMuIElmIHlvdSBoYXZlIHJvb3QgcGVybWlzc2lvbiwgYQotICAgbW9yZSBwZXJtYW5lbnQgYW5kIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMgdG8gcmVjb3JkIHRoZSBhcmd1bWVudHMKLSAgIGluIGEgbGluZSBsaWtlOgotICA6MCAgTG9jYWwgbG9jYWxfdWlkQGNvbnNvbGUgcm9vdCAvdXNyL29wZW53aW4vYmluL1hzdW4gLWRldiAvZGV2L2ZiIGRlZmNsYXNzCi1UcnVlQ29sb3IgZGVmZGVwdGggMjQKLQotICAgaW4gL2V0Yy9kdC9jb25maWcvWHNlcnZlcnMgKGNvcHkgL3Vzci9kdC9jb25maWcvWHNlcnZlcnMuKSBBbHNvIGxvb2sKLSAgIGF0IHRoZSBmYmNvbmZpZygxKSBhbmQgcmVsYXRlZCBtYW5wYWdlcyAoZS5nLiBmZmJjb25maWcsIG02NGNvbmZpZywKLSAgIHBneGNvbmZpZywgU1VOV2pmYl9jb25maWcsIGV0YyAuLi4pIGZvciBoYXJkd2FyZSBmcmFtZWJ1ZmZlciBzZXR0aW5ncwotICAgdGhhdCBtYXkgYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QuCi0KLSAgIEluIGdlbmVyYWwgZm9yIG5vbi1TdW4gbWFjaGluZXMsIGxvb2sgYXQgdGhlICItY2MgY2xhc3MiIGFuZCByZWxhdGVkCi0gICBvcHRpb25zIGluIHlvdXIgWCBzZXJ2ZXIgbWFucGFnZSAocGVyaGFwcyBYc2VydmVyKDEpKSwgaXQgbWF5IGFsbG93Ci0gICBtb2RpZnlpbmcgdGhlIGRlZmF1bHQgdmlzdWFsIChlLmcuICItY2MgNCIsIHNlZSA8WDExL1guaD4gZm9yIHRoZQotICAgdmlzdWFsIGNsYXNzIG51bWJlcnMuKSBPbiBYRnJlZTg2IHNvbWUgdmlkZW8gY2FyZCBkcml2ZXJzIChlLmcuIE1hdHJveAotICAgbWdhKSBoYXZlIHNldHRpbmdzIGxpa2UgT3B0aW9uICJPdmVybGF5IiAiMjQsOCIgdG8gc3VwcG9ydCBtdWx0aS1kZXB0aAotICAgb3ZlcmxheXMuIEZvciB0aGVzZSwgdXNlIHRoZSAiLWNjIDQiIFggc2VydmVyIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLSAgIGdldCBhIGRlcHRoIDI0IGRlZmF1bHQgdmlzdWFsLgotCi0KLSAgIFRoZSAtb3ZlcmxheSBtb2RlOiBBbm90aGVyIG9wdGlvbiBpcyBpZiB0aGUgc3lzdGVtIHdpdGggb3ZlcmxheQotICAgdmlzdWFscyBpcyBhIFN1biBzeXN0ZW0gcnVubmluZyBTb2xhcmlzIG9yIFNHSSBydW5uaW5nIElSSVggeW91IGNhbgotICAgdXNlIHRoZSAtb3ZlcmxheSB4MTF2bmMgb3B0aW9uIChBdWcvMjAwNCkgdG8gaGF2ZSB4MTF2bmMgdXNlIHRoZQotICAgU29sYXJpcyBYUmVhZFNjcmVlbigzWDExKSBmdW5jdGlvbiB0byBwb2xsIHRoZSAidHJ1ZSB2aWV3IiBvZiB0aGUKLSAgIHdob2xlIHNjcmVlbiBhdCBkZXB0aCAyNCBUcnVlQ29sb3IuIFhSZWFkRGlzcGxheSgzWDExKSBpcyB1c2VkIG9uCi0gICBJUklYLiBUaGlzIGlzIHVzZWZ1bCBmb3IgTGVnYWN5IGFwcGxpY2F0aW9ucyAob2xkZXIgdmVyc2lvbnMgb2YKLSAgIENhZGVuY2UgQ0FEIGFwcHMgYXJlIG1lbnRpb25lZCBieSB4MTF2bmMgdXNlcnMpIHRoYXQgcmVxdWlyZSB0aGUKLSAgIGRlZmF1bHQgZGVwdGggYmUgOGJwcCwgb3IgdGhlIGFwcCB3aWxsIHVzZSBhIDhicHAgdmlzdWFsIGV2ZW4gaWYgZGVwdGgKLSAgIDI0IHZpc3VhbHMgYXJlIGF2YWlsYWJsZSwgYW5kIHNvIHRoZSBkZWZhdWx0IGRlcHRoIHdvcmthcm91bmQKLSAgIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGlzIG5vdCBzdWZmaWNpZW50IGZvciB0aGVzZSBhcHBzLgotCi0gICBJdCBzZWVtcyB0aGF0IFhvcmcgaXMgd29ya2luZyB0b3dhcmQgc3VwcG9ydGluZyBYUmVhZERpc3BsYXkoM1gxMSkgYXMKLSAgIHBhcnQgb2YgdGhlIFJFTkRFUiBleHRlbnNpb24gd29yay4gV2hlbiBpdCBkb2VzIHN1cHBvcnQgaXQgYW5kCi0gICBwcm92aWRlcyBhIGxpYnJhcnkgQVBJIHgxMXZuYyB3aWxsIGJlIG1vZGlmaWVkIHRvIHRha2UgYWR2YW50YWdlIG9mCi0gICB0aGUgZmVhdHVyZSB0byBzdXBwb3J0IC1vdmVybGF5IG9uIExpbnV4LCAqQlNELCBldGMuIFVudGlsIHRoZW4gc2VlCi0gICB0aGUgLTh0bzI0IG1vZGUgYmVsb3cuCi0KLSAgIE1pc2MuIG5vdGVzIG9uIC1vdmVybGF5IG1vZGU6IEFuIGFtdXNpbmcgYnktcHJvZHVjdCBvZiAtb3ZlcmxheSBtb2RlCi0gICBpcyB0aGF0IHRoZSBtb3VzZSBjdXJzb3Igc2hhcGUgaXMgY29ycmVjdCEgKGkuZS4gWEZJWEVTIGlzIG5vdAotICAgbmVlZGVkLikgVGhlIC1vdmVybGF5IG1vZGUgbWF5IGJlIHNvbWV3aGF0IHNsb3dlciB0aGFuIG5vcm1hbCBtb2RlIGR1ZQotICAgdG8gdGhlIGV4dHJhIGZyYW1lYnVmZmVyIG1hbmlwdWxhdGlvbnMgdGhhdCBtdXN0IGJlIHBlcmZvcm1lZC4gQWxzbywKLSAgIG9uIFNvbGFyaXMgdGhlcmUgaXMgYSBidWcgaW4gdGhhdCBmb3Igc29tZSBwb3B1cCBtZW51cywgdGhlIHdpbmRvd3MKLSAgIHRoZXkgb3ZlcmxhcCB3aWxsIGhhdmUgcGFpbnRpbmcgZXJyb3JzIChmbGFzaGluZyBjb2xvcnMpIHdoaWxlIHRoZQotICAgcG9wdXAgaXMgdXAgKGEgd29ya2Fyb3VuZCBpcyB0byBkaXNhYmxlIFNhdmVVbmRlcnMgYnkgcGFzc2luZyAtc3UgdG8KLSAgIFhzdW4sIGUuZy4gaW4geW91ciAvZXRjL2R0L2NvbmZpZy9Yc2VydmVycyBmaWxlLikKLQotCi0gICBUaGUgLTh0bzI0IG1vZGU6IFRoZSAtOHRvMjQgeDExdm5jIG9wdGlvbiAoSmFuLzIwMDYpIGlzIGEga2x1ZGdlIHRvCi0gICB0cnkgdG8gZHluYW1pY2FsbHkgcmV3cml0ZSB0aGUgcGl4ZWwgdmFsdWVzIHNvIHRoYXQgdGhlIDhicHAgcGFydCBvZgotICAgdGhlIHNjcmVlbiBpcyBtYXBwZWQgb250byBkZXB0aCAyNCBUcnVlQ29sb3IuIFRoaXMgaXMgbGVzcyByb2J1c3QgdGhhbgotICAgdGhlIC1vdmVybGF5IG1vZGUgYmVjYXVzZSBpdCBpcyBkb25lIGJ5IHgxMXZuYyBvdXRzaWRlIG9mIHRoZSBYCi0gICBzZXJ2ZXIuIFNvIG9ubHkgdXNlIGl0IG9uIE9TJ3MgdGhhdCBkbyBub3Qgc3VwcG9ydCAtb3ZlcmxheS4gVGhlCi0gICAtOHRvMjQgbW9kZSB3aWxsIHdvcmsgaWYgdGhlIGRlZmF1bHQgdmlzdWFsIGlzIGRlcHRoIDI0IG9yIGRlcHRoIDguIEl0Ci0gICBzY2FucyBmb3IgYW55IHdpbmRvd3Mgd2l0aGluIDMgbGV2ZWxzIG9mIHRoZSByb290IHdpbmRvdyB0aGF0IGFyZSA4YnBwCi0gICAoaS5lLiBsZWdhY3kgYXBwbGljYXRpb24pLCBvciBpbiBnZW5lcmFsIG9uZXMgdGhhdCBhcmUgbm90IHVzaW5nIHRoZQotICAgZGVmYXVsdCB2aXN1YWwuIEZvciB0aGUgd2luZG93cyBpdCBmaW5kcyBpdCB1c2VzIFhHZXRTdWJJbWFnZSgpIHRvCi0gICByZXRyaWV2ZSB0aGUgcGl4ZWxzIHZhbHVlcyBhbmQgdXNlcyB0aGUgY29ycmVjdCBpbmRleGVkIGNvbG9ybWFwIHRvCi0gICBjcmVhdGUgYSBkZXB0aCAyNCBUcnVlQ29sb3IgdmlldyBvZiB0aGUgd2hvbGUgc2NyZWVuLiBUaGlzIGRlcHRoIDI0LAotICAgMzJicHAgdmlldyBpcyBleHBvcnRlZCB2aWEgVk5DLgotCi0gICBFdmVuIG9uIHB1cmUgOGJwcCBkaXNwbGF5cyBpdCBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0bwotICAgLWZsYXNoY21hcCB0byBhdm9pZCBjb2xvciBmbGFzaGluZyBjb21wbGV0ZWx5LgotCi0gICBUaGlzIHNjaGVtZSBpcyBhcHByb3hpbWF0ZSBhbmQgY2FuIG9mdGVuIGxlYWQgdG8gcGFpbnRpbmcgZXJyb3JzLiBZb3UKLSAgIGNhbiBtYW51YWxseSBjb3JyZWN0IG1vc3QgcGFpbnRpbmcgZXJyb3JzIGJ5IHByZXNzaW5nIDMgQWx0X0wncyBpbiBhCi0gICByb3csIG9yIGJ5IHVzaW5nIHNvbWV0aGluZyBsaWtlOiAtZml4c2NyZWVuIFY9My4wIHRvIGF1dG9tYXRpY2FsbHkKLSAgIHJlZnJlc2ggdGhlIHNjcmVlbiBldmVyeSAzIHNlY29uZHMuIEFsc28gLWZpeHNjcmVlbiA4PTMuMCBoYXMgYmVlbgotICAgYWRkZWQgdG8ganVzdCByZWZyZXNoIHRoZSBub24tZGVmYXVsdCB2aXN1YWwgcGFydHMgb2YgdGhlIHNjcmVlbi4KLQotICAgSW4gZ2VuZXJhbCB0aGUgc2NoZW1lIHVzZXMgbWFueSByZXNvdXJjZXMgYW5kIG1heSBnaXZlIHJpc2UgdG8KLSAgIHNsdWdnaXNoIGJlaGF2aW9yLiBJZiBtdWx0aXBsZSB3aW5kb3dzIGFyZSB1c2luZyBkaWZmZXJlbnQgOGJwcAotICAgaW5kZXhlZCBjb2xvcm1hcHMgYWxsIGJ1dCBvbmUgd2luZG93IG1heSBuZWVkIHRvIGJlIGljb25pZmllZCBmb3IgdGhlCi0gICBjb2xvcnMgdG8gYmUgY29ycmVjdC4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHR1bmFibGUgcGFyYW1ldGVycyB0byB0cnkKLSAgIHRvIGFkanVzdCBwZXJmb3JtYW5jZSBhbmQgcGFpbnRpbmcgYWNjdXJhY3kuIFRoZSBvcHRpb24gLTh0bzI0Ci0gICBub2dldGltYWdlIGNhbiBnaXZlIGEgbmljZSBzcGVlZHVwIGlmIHRoZSBkZWZhdWx0IGRlcHRoIDI0IFggc2VydmVyCi0gICBzdXBwb3J0cyBoaWRpbmcgdGhlIDhicHAgYml0cyBpbiBiaXRzIDI1LTMyIG9mIHRoZSBmcmFtZWJ1ZmZlciBkYXRhLgotICAgT24gdmVyeSBzbG93IG1hY2hpbmVzIC04dG8yNCBwb2xsPTAuMixjYWNoZXdpbj01LjAgZ2l2ZXMgYW4gdXNlZnVsCi0gICBzcGVlZHVwLiBTZWUgdGhlIC04dG8yNCBoZWxwIGRlc2NyaXB0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB0dW5hYmxlCi0gICBwYXJhbWV0ZXJzLCBldGMuCi0KLQotICAgQ29sb3JzIHN0aWxsIG5vdCB3b3JraW5nIGNvcnJlY3RseT8gUnVuIHh3aW5pbmZvIG9uIHRoZSBhcHBsaWNhdGlvbgotICAgd2l0aCB0aGUgaW5jb3JyZWN0IGNvbG9ycyB0byB2ZXJpZnkgdGhhdCB0aGUgZGVwdGggb2YgaXRzIHZpc3VhbCBpcwotICAgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgdmlzdWFsIGRlcHRoIChnb3R0ZW4gZnJvbSB4ZHB5aW5mby4pIE9uZQotICAgcG9zc2libGUgd29ya2Fyb3VuZCBpbiB0aGlzIGNhc2UgaXMgdG8gdXNlIHRoZSAtaWQgb3B0aW9uIHRvIHBvaW50Ci0gICB4MTF2bmMgYXQgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyBpdHNlbGYuIElmIHRoZSBhcHBsaWNhdGlvbiBpcwotICAgY29tcGxpY2F0ZWQgKGxvdHMgb2YgdG9wbGV2ZWwgd2luZG93cyBhbmQgcG9wdXAgbWVudXMpIHRoaXMgbWF5IG5vdCBiZQotICAgYWNjZXB0YWJsZSwgYW5kIG1heSBldmVuIGNyYXNoIHgxMXZuYyAoYnV0IG5vdCB0aGUgYXBwbGljYXRpb24uKSBTZWUKLSAgIGFsc28gLWFwcHNoYXJlLgotCi0gICBJdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHNvbHZlIHRoaXMgcHJvYmxlbSBpbiBnZW5lcmFsIChzZWUKLSAgIHh3ZCgxKSBmb3IgZXhhbXBsZSksIGJ1dCBpdCBkb2VzIG5vdCBzZWVtIHRyaXZpYWwgb3Igc3VmZmljaWVudGx5IGZhc3QKLSAgIGZvciB4MTF2bmMgdG8gYmUgYWJsZSB0byBkbyBzbyBpbiByZWFsIHRpbWUuIFRoZSAtOHRvMjQgbWV0aG9kIGRvZXMKLSAgIHRoaXMgYXBwcm94aW1hdGVseSBhbmQgaXMgc29tZXdoYXQgdXNhYmxlLiBGb3J0dW5hdGVseSB0aGUgLW92ZXJsYXkKLSAgIG9wdGlvbiB3b3JrcyBmb3IgU29sYXJpcyBtYWNoaW5lcyB3aXRoIG92ZXJsYXkgdmlzdWFscyB3aGVyZSBtb3N0IG9mCi0gICB0aGlzIHByb2JsZW0gb2NjdXJzLgotCi0KLSAgIFEtMjU6IEkgYW0gb24gYSBoaWdoIGNvbG9yIHN5c3RlbSAoZGVwdGggPj0gMjQpIGJ1dCBJIHNlZW0gdG8gaGF2ZQotICAgY29sb3JtYXAgcHJvYmxlbXMuIFRoZXkgZWl0aGVyIGZsYXNoIG9yIGV2ZXJ5dGhpbmcgaXMgdmVyeSBkYXJrLgotCi0gICBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGRlZmF1bHQgVmlzdWFsICh1c2UgeGRweWluZm8gdG8gbGlzdCB0aGVtKSBpcwotICAgRGlyZWN0Q29sb3IgaW5zdGVhZCBvZiBUcnVlQ29sb3IuIFRoZXNlIGFyZSBib3RoIHVzdWFsbHkgdXNlZCBpbiBoaWdoCi0gICBjb2xvciBtb2RlcywgYnV0IHdoZXJlYXMgVHJ1ZUNvbG9yIHVzZXMgc3RhdGljIHJhbXBzIGZvciB0aGUgUmVkLAotICAgR3JlZW4sIGFuZCBCbHVlIGNvbXBvbmVudHMsIERpcmVjdENvbG9yIGhhcyBhcmJpdHJhcnkgY29sb3JtYXBzIGZvcgotICAgdGhlIFJlZCwgR3JlZW4sIGFuZCBCbHVlIENvbXBvbmVudHMuIEN1cnJlbnRseSB4MTF2bmMgY2Fubm90IGRlY29kZQotICAgdGhlc2UgY29sb3JtYXBzIGFuZCB0cmVhdHMgdGhlbSBqdXN0IGxpa2UgVHJ1ZUNvbG9yLgotCi0gICBUaGUgb25seSB3b3JrYXJvdW5kIHNvIGZhciBpcyB0byByZXN0YXJ0IHRoZSBYIHNlcnZlciB3aXRoIHRoZSAiLWNjIDQiCi0gICBvcHRpb24gdG8gZm9yY2UgVHJ1ZUNvbG9yIGFzIHRoZSBkZWZhdWx0IHZpc3VhbCAoRGlyZWN0Q29sb3IgaXMgIi1jYwotICAgNSI7IHNlZSAvdXNyL2luY2x1ZGUvWDExL1guaC4pIFRoZSBvbmx5IHBsYWNlIHdlIGhhdmUgc2VlbiB0aGlzIGlzCi0gICB3aXRoIHRoZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIHNlcnZlciBYdmZiIG9uIFhvcmcgNy4yLiBTbyBpbiB0aGF0IGNhc2UKLSAgIHlvdSBwcm9iYWJseSBzaG91bGQgcmVzdGFydCBpdCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoaXM6ICJYdmZiIDoxIC1jYwotICAgNCAtc2NyZWVuIDAgMTI4MHgxMDI0eDI0Ii4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIGZvciB4MTF2bmMgdG8gaGFuZGxlCi0gICBEaXJlY3RDb2xvciwgYnV0IHRoaXMgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgZHVlIHRvIGl0cyByYXJlIHVzYWdlLgotCi0gICBZb3UgbWF5IGFsc28gc2VlIHRoaXMgcHJvYmxlbSBvbiBhbiBYIGRpc3BsYXkgd2l0aCBhIFRydWVDb2xvciBkZWZhdWx0Ci0gICB2aXN1YWwgd2hlcmUgYW4gYXBwbGljYXRpb24gY2hvb3NlcyBhIERpcmVjdENvbG9yIHZpc3VhbCBmb3IgaXRzCi0gICB3aW5kb3cocykuIEl0IHNlZW1zIHRoZSBhcHBsaWNhdGlvbiBhbHNvIG5lZWRzIHRvIGluc3RhbGwgaXRzIG93bgotICAgY29sb3JtYXAgZm9yIHRoZSB2aXN1YWwgZm9yIHRoZSBjb2xvcnMgdG8gYmUgbWVzc2VkIHVwIGluIHgxMXZuYy4gT25lCi0gICBjYW4gbWFrZSB4d3VkIGRvIHRoaXMgZm9yIGV4YW1wbGUuCi0KLQotICAgUS0yNjogSG93IGRvIEkgZmlndXJlIG91dCB0aGUgd2luZG93IGlkIHRvIHN1cHBseSB0byB0aGUgLWlkIHdpbmRvd2lkCi0gICBvcHRpb24/Ci0KLSAgIFJ1biB0aGUgeHdpbmluZm8gcHJvZ3JhbSBpbiBhIHRlcm1pbmFsLiBJdCB3aWxsIGFzayB5b3UgdG8gY2xpY2sgb24KLSAgIHRoZSBkZXNpcmVkIGFwcGxpY2F0aW9uIHdpbmRvdy4gQWZ0ZXIgY2xpY2tpbmcsIGl0IHdpbGwgcHJpbnQgb3V0IG11Y2gKLSAgIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHdpbmRvdyBpZCAoZS5nLiAweDYwMDAwMTAuKSBBbHNvLCB0aGUKLSAgIHZpc3VhbCBhbmQgZGVwdGggb2YgdGhlIHdpbmRvdyBwcmludGVkIG91dCBpcyBvZnRlbiB1c2VmdWwgaW4KLSAgIGRlYnVnZ2luZyB4MTF2bmMgY29sb3IgcHJvYmxlbXMuCi0KLSAgIEFsc28sIGFzIG9mIERlYy8yMDA0IHlvdSBjYW4gdXNlICItaWQgcGljayIgdG8gaGF2ZSB4MTF2bmMgcnVuCi0gICB4d2luaW5mbygxKSBmb3IgeW91IGFuZCBhZnRlciB5b3UgY2xpY2sgdGhlIHdpbmRvdyBpdCBleHRyYWN0cyB0aGUKLSAgIHdpbmRvd2lkLiBCZXNpZGVzICJwaWNrIiB0aGVyZSBpcyBhbHNvICJpZDpyb290IiB0byBhbGxvdyB5b3UgdG8gZ28KLSAgIGJhY2sgdG8gcm9vdCB3aW5kb3cgd2hlbiBkb2luZyByZW1vdGUtY29udHJvbC4KLQotCi0gICBRLTI3OiBXaHkgZG9uJ3QgbWVudXMgb3Igb3RoZXIgdHJhbnNpZW50IHdpbmRvd3MgY29tZSB1cCB3aGVuIEkgYW0KLSAgIHVzaW5nIHRoZSAtaWQgd2luZG93aWQgb3B0aW9uIHRvIHZpZXcgYSBzaW5nbGUgYXBwbGljYXRpb24gd2luZG93PwotCi0gICBUaGlzIGlzIHJlbGF0ZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBYR2V0SW1hZ2UoM1gxMSkgYW5kCi0gICBYU2htR2V0SW1hZ2UoKSBpbnRlcmZhY2VzIHJlZ2FyZGluZyBiYWNraW5nc3RvcmUsIHNhdmV1bmRlcnMsIGV0Yy4gVGhlCi0gICB3YXkgdGhlIGltYWdlIGlzIHJldHJpZXZlZCBkZXBlbmRzIG9uIHNvbWUgYXNwZWN0cyBvZiBob3cgdGhlIFggc2VydmVyCi0gICBtYWludGFpbnMgdGhlIGRpc3BsYXkgaW1hZ2UgZGF0YSBhbmQgd2hldGhlciBvdGhlciB3aW5kb3dzIGFyZQotICAgY2xpcHBpbmcgb3Igb2JzY3VyaW5nIGl0LiBTZWUgdGhlIFhHZXRJbWFnZSgzWDExKSBtYW4gcGFnZSBmb3IgbW9yZQotICAgZGV0YWlscy4gSWYgeW91IGRpc2FibGUgQmFja2luZ1N0b3JlIGFuZCBTYXZlVW5kZXJzIGluIHRoZSBYIHNlcnZlcgotICAgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNlZSB0aGVzZSB0cmFuc2llbnQgd2luZG93cy4KLQotICAgSWYgdGhpbmdzIGFyZSBub3Qgd29ya2luZyBhbmQgeW91IHN0aWxsIHdhbnQgdG8gZG8gdGhlIHNpbmdsZSB3aW5kb3cKLSAgIHBvbGxpbmcsIHRyeSB0aGUgLXNpZCB3aW5kb3dpZCBvcHRpb24gKCJzaGlmdGVkIiB3aW5kb3dpZC4pCi0KLSAgIFVwZGF0ZTogYXMgb2YgTm92LzIwMDkgaW4gdGhlIDAuOS45IHgxMXZuYyBkZXZlbG9wbWVudCB0YXJiYWxsLCB0aGVyZQotICAgaXMgYW4gZXhwZXJpbWVudGFsIEFwcGxpY2F0aW9uIFNoYXJpbmcgbW9kZSB0aGF0IGltcHJvdmVzIHVwb24gdGhlCi0gICAtaWQvLXNpZCBzaW5nbGUgd2luZG93IHNoYXJpbmc6IC1hcHBzaGFyZSAocnVuICJ4MTF2bmMgLWFwcHNoYXJlCi0gICAtaGVscCIgZm9yIG1vcmUgaW5mby4pIEl0IGlzIHN0aWxsIHZlcnkgcHJpbWl0aXZlIGFuZCBhcHByb3hpbWF0ZSwgYnV0Ci0gICBhdCBsZWFzdCBpdCBkaXNwbGF5cyBtdWx0aXBsZSB0b3AtbGV2ZWwgd2luZG93cy4KLQotCi0gICBRLTI4OiBNeSBYIGRpc3BsYXkgaXMgZGVwdGggMjQgYXQgMjRicHAgKGluc3RlYWQgb2YgdGhlIG5vcm1hbCBkZXB0aAotICAgMjQgYXQgMzJicHAuKSBJJ20gaGF2aW5nIGxvdHMgb2YgY29sb3IgYW5kIHZpc3VhbCBwcm9ibGVtcyB3aXRoIHgxMXZuYwotICAgYW5kL29yIHZuY3ZpZXdlci4gV2hhdCdzIHVwPwotCi0gICBGaXJzdCBvZmYsIGRlcHRoIDI0IGF0IDI0YnBwIChicHA9Yml0cy1wZXItcGl4ZWwpIGlzIGZhaXJseSB1bmNvbW1vbgotICAgYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyBpbiBnZW5lcmFsLiBJdCBhbHNvIGNhbiBiZSBzbG93ZXIgdGhhbiBkZXB0aCAyNAotICAgYXQgMzJicHAuIFlvdSBtaWdodCB3YW50IHRvIHN3aXRjaCB0byAzMmJwcCAoZm9yIFhGcmVlODYgc2VlIHRoZQotICAgIi1mYmJwcCAzMiIsIERlZmF1bHRGYkJwcCwgRmJCcHAgYW5kIHJlbGF0ZWQgb3B0aW9ucy4pIFBlcmhhcHMgeW91Ci0gICBoYXZlIDI0YnBwIGJlY2F1c2UgdGhlIHZpZGVvIG1lbW9yeSBvZiB0aGUgbWFjaGluZSBpcyBsb3cgYW5kIHRoZQotICAgc2NyZWVuIHdvdWxkbid0IGZpdCBpbiB2aWRlbyBSQU0gYXQgMzJicHAuIEZvciB0aGlzIGNhc2UgZGVwdGggMTYgYXQKLSAgIDE2YnBwIG1pZ2h0IGJlIGFuIGFjY2VwdGFibGUgb3B0aW9uLgotCi0gICBJbiBhbnkgZXZlbnQgeDExdm5jIHNob3VsZCBoYW5kbGUgZGVwdGggMjQgYXQgMjRicHAgKGFsdGhvdWdoCi0gICBwZXJmb3JtYW5jZSBtYXkgYmUgc2xvd2VyLCBhbmQgeW91IG1heSBuZWVkIHRvIHVzZSB0aGUgWlJMRSBlbmNvZGluZwotICAgaW5zdGVhZCBvZiBUaWdodC4pIFRoZXJlIGFyZSBzb21lIGNhdmVhdHMgaW52b2x2aW5nIHRoZSB2aWV3ZXIKLSAgIGhvd2V2ZXI6Ci0KLSAgIFRoZSBSZWFsVk5DIFVuaXggdmlld2VyIGNhbm5vdCBoYW5kbGUgMjRicHAgZnJvbSB0aGUgc2VydmVyLCBpdCB3aWxsCi0gICBzYXk6ICJtYWluOiBzZXRQRjogbm90IDgsIDE2IG9yIDMyIGJwcD8iIGFuZCBleGl0LiBJIGhhdmUgbm90IGNoZWNrZWQKLSAgIHRoZSBSZWFsVk5DIFdpbmRvd3Mgdmlld2VyLgotCi0gICBTbyB5b3UgbmVlZCB0byB1c2UgdGhlIFRpZ2h0Vk5DIFVuaXggdmlld2VyLiBIb3dldmVyIHRoZXJlIGFyZSBzb21lCi0gICBwcm9ibGVtcyB3aXRoIHRoYXQgdG9vLiBJdCBzZWVtcyBsaWJ2bmNzZXJ2ZXIgZG9lcyBub3QgZG8gMjRicHAKLSAgIGNvcnJlY3RseSB3aXRoIHRoZSBUaWdodCBlbmNvZGluZy4gVGhlIGNvbG9ycyBhbmQgc2NyZWVuIHVsdGltYXRlbHkKLSAgIGdldCBtZXNzZWQgdXAuIFNvIHlvdSBoYXZlIHRvIHVzZSBhIGRpZmZlcmVudCBlbmNvZGluZyB3aXRoIHRoZQotICAgVGlnaHRWTkMgdm5jdmlld2VyLCB0cnkgInpsaWIiLCAiaGV4dGlsZSIsIG9yIG9uZSBvZiB0aGUgb3RoZXIKLSAgIGVuY29kaW5ncyAoZS5nLiB2bmN2aWV3ZXIgLWVuY29kaW5ncyAiemxpYiBoZXh0aWxlIiAuLi4uKSBJIGhhdmUgbm90Ci0gICBjaGVja2VkIHRoZSBUaWdodFZOQyBvciBVbHRyYVZOQyBXaW5kb3dzIHZpZXdlcnMuCi0KLSAgIEl0IGFwcGVhcnMgdGhlIG9sZGVyIFJlYWxWTkMgVW5peCB2aWV3ZXJzIChlLmcuIDMuMy4zIGFuZCAzLjMuNykgY2FuCi0gICBoYW5kbGUgMjRicHAgZnJvbSB0aGUgc2VydmVyLCBzbyB5b3UgbWF5IHdhbnQgdG8gdXNlIHRob3NlLiBUaGV5Ci0gICBldmlkZW50bHkgcmVxdWVzdCAzMiBicHAgYW5kIGxpYnZuY3NlcnZlciBvYmxpZ2VzLgotCi0gICBVcGRhdGU6IGFzIG9mIEFwci8yMDA2IHlvdSBjYW4gdXNlIHRoZSAtMjR0bzMyIG9wdGlvbiB0byBoYXZlIHgxMXZuYwotICAgZHluYW1pY2FsbHkgdHJhbnNmb3JtIHRoZSAyNGJwcCBwaXhlbCBkYXRhIHRvIDMyYnBwLiBUaGlzIGV4dHJhCi0gICB0cmFuc2Zvcm1hdGlvbiBjb3VsZCBzbG93IHRoaW5ncyBkb3duIGZ1cnRoZXIgaG93ZXZlci4KLQotICAgTm93IGNvbWluZyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGlmIHlvdSBhcmUgcnVubmluZyB0aGUgdm5jdmlld2VyIG9uCi0gICB0aGUgMjRicHAgZGlzcGxheSwgVGlnaHRWTkMgd2lsbCBmYWlsIHdpdGggIkNhbid0IGNvcGUgd2l0aCAyNAotICAgYml0cy1wZXItcGl4ZWwuIFNvcnJ5LiIgYW5kIFJlYWxWTkMgd2lsbCBmYWlsIHdpdGggIm1haW46IEVycm9yOgotICAgY291bGRuJ3QgZmluZCBzdWl0YWJsZSBwaXhtYXAgZm9ybWF0IiBzbyBldmlkZW50bHkgeW91IGNhbm5vdCB1c2UKLSAgIDI0YnBwIGZvciB0aGUgdm5jdmlld2VycyB0byB3b3JrIG9uIHRoYXQgWCBkaXNwbGF5LgotCi0gICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBVbml4IHZpZXdlciBpbiB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyCi0gICAoU1NWTkMpIHByb2plY3QgY2FuIGhhbmRsZSAyNGJwcCBYIGRpc3BsYXlzLiBJdCBkb2VzIHRoaXMgYnkKLSAgIHJlcXVlc3RpbmcgYSAxNmJwcCBwaXhlbCBmb3JtYXQgKG9yIDhicHAgaWYgdGhlIC1iZ3IyMzMgb3B0aW9uIGhhcwotICAgYmVlbiBzdXBwbGllZCkgZnJvbSB0aGUgVk5DIHNlcnZlciwgYW5kIHRyYW5zbGF0ZXMgdGhhdCB0byAyNGJwcAotICAgbG9jYWxseS4KLSAgIFtYdGVybWluYWxzXQotCi0gICBRLTI5OiBDYW4gSSB1c2UgeDExdm5jIHRvIHZpZXcgYW5kIGludGVyYWN0IHdpdGggYW4gWHRlcm1pbmFsIChlLmcuCi0gICBOQ0QpIHRoYXQgaXMgbm90IHJ1bm5pbmcgVU5JWCBhbmQgc28geDExdm5jIGNhbm5vdCBiZSBydW4gb24gaXQKLSAgIGRpcmVjdGx5PwotCi0gICBZb3UgY2FuLCBidXQgaXQgd2lsbCBsaWtlbHkgYmUgdmVyeSB3YXN0ZWZ1bCBvZiBuZXR3b3JrIGJhbmR3aWR0aAotICAgc2luY2UgeW91IHdpbGwgYmUgcG9sbGluZyB0aGUgWCBkaXNwbGF5IG92ZXIgdGhlIG5ldHdvcmsgYXMgb3Bwb3NlZCB0bwotICAgb3ZlciB0aGUgbG9jYWwgaGFyZHdhcmUuIFRvIGRvIHRoaXMsIHJ1biB4MTF2bmMgb24gYSBVTklYIG1hY2hpbmUgYXMKLSAgIGNsb3NlIGFzIHBvc3NpYmxlIG5ldHdvcmstd2lzZSAoZS5nLiBzYW1lIHN3aXRjaCkgdG8gdGhlIFh0ZXJtaW5hbAotICAgbWFjaGluZS4gVXNlIHRoZSAtZGlzcGxheSBvcHRpb24gdG8gcG9pbnQgdGhlIGRpc3BsYXkgdG8gdGhhdCBvZiB0aGUKLSAgIFh0ZXJtaW5hbCAoeW91J2xsIG9mIGNvdXJzZSBuZWVkIGJhc2ljIFgxMSBwZXJtaXNzaW9uIHRvIGRvIHRoYXQpIGFuZAotICAgZmluYWxseSBzdXBwbHkgdGhlIC1ub3NobSBvcHRpb24gKHRoaXMgZW5hYmxlcyB0aGUgcG9sbGluZyBvdmVyIHRoZQotICAgbmV0d29yay4pCi0KLSAgIElmIHRoZSBYdGVybWluYWwncyBYIGRpc3BsYXkgaXMgb3BlbiB0byB0aGUgbmV0d29yayBmb3IgY29ubmVjdGlvbnMsCi0gICB5b3UgbWlnaHQgdXNlIHNvbWV0aGluZyBsaWtlICItZGlzcGxheSB4dGVybTEyMzowIi4gSWYgeW91IGFyZSB0cnlpbmcKLSAgIHRvIGRvIHRoaXMgdmlhIGFuIFNTSCB0dW5uZWwgKGFzc3VtaW5nIHlvdSBjYW4gYWN0dWFsbHkgc3NoIGludG8gdGhlCi0gICBYdGVybWluYWwpIGl0IHdpbGwgYmUgYSBsaXR0bGUgdHJpY2t5IChlaXRoZXIgdXNlIHRoZSBzc2ggIi1SIiBvcHRpb24KLSAgIG9yIGNvbnNpZGVyIHNzaC1pbmcgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi4pIEluIGFsbCBjYXNlcyB0aGUgWDExCi0gICBwZXJtaXNzaW9ucyBuZWVkIHRvIGFsbG93IHRoZSBjb25uZWN0aW9uLgotCi0gICBUaGUgcmVzcG9uc2Ugd2lsbCBsaWtlbHkgYmUgc2x1Z2dpc2ggKG1heWJlIG9ubHkgb25lICJmcmFtZSIgcGVyCi0gICBzZWNvbmQuKSBUaGlzIG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGV4Y2VwdCBmb3IgInF1aWNrIGNoZWNrcyIgb2YKLSAgIGhhcmQgdG8gZ2V0IHRvIFggc2VydmVycy4gVXNlIHNvbWV0aGluZyBsaWtlICItd2FpdCAxNTAiIHRvIGN1dCBkb3duCi0gICBvbiB0aGUgcG9sbGluZyByYXRlLiBZb3UgbWF5IGFsc28gbmVlZCAtZmxpcGJ5dGVvcmRlciBpZiB0aGUgY29sb3JzCi0gICBnZXQgbWVzc2VkIHVwIGR1ZSB0byBlbmRpYW4gYnl0ZSBvcmRlciBkaWZmZXJlbmNlcy4KLQotICAgUS0zMDogSG93IGRvIEkgZ2V0IG15IFggcGVybWlzc2lvbnMgKE1JVC1NQUdJQy1DT09LSUUgZmlsZSkgY29ycmVjdAotICAgZm9yIGEgVW5peC9MaW51eCBtYWNoaW5lIGFjdGluZyBhcyBhbiBYdGVybWluYWw/Ci0KLSAgIElmIHRoZSBYIGRpc3BsYXkgbWFjaGluZSBpcyBhIHRyYWRpdGlvbmFsIFh0ZXJtaW5hbCAod2hlcmUgdGhlIFgKLSAgIHNlcnZlciBwcm9jZXNzIHJ1bnMgb24gdGhlIFh0ZXJtaW5hbCBib3gsIGJ1dCBhbGwgb2YgdGhlIFggY2xpZW50Ci0gICBhcHBsaWNhdGlvbnMgKGZpcmVmb3gsIGV0YykgcnVuIG9uIGEgY2VudHJhbCBzZXJ2ZXIgKGFrYSAidGVybWluYWwKLSAgIHNlcnZlciIpKSwgeW91IHdpbGwgbmVlZCB0byBsb2cgaW50byB0aGUgWHRlcm1pbmFsIG1hY2hpbmUgKGkuZS4gZ2V0IGEKLSAgIHNoZWxsIHJ1bm5pbmcgdGhlcmUpIGFuZCB0aGVuIHN0YXJ0IHRoZSB4MTF2bmMgcHJvZ3JhbS4gSWYgdGhlCi0gICBYdGVybWluYWwgTGludXgvVW5peCBtYWNoaW5lIGlzIHN0cmlwcGVkIGRvd24gKGUuZy4gbm8gdXNlcnMgYmVzaWRlcwotICAgcm9vdCkgdGhhdCBtYXkgYmUgZGlmZmljdWx0LgotCi0gICBUaGUgbmV4dCBwcm9ibGVtIGlzIHRoZSBsb2dpbiBEaXNwbGF5IE1hbmFnZXIgKGUuZy4gZ2RtLCBrZG0pLCBhbmQKLSAgIGhlbmNlIHRoZSBNSVQtTUFHSUMtQ09PS0lFIGF1dGggZmlsZXMsIGFyZSBvbiB0aGUgY2VudHJhbCBzZXJ2ZXIgYW5kCi0gICBub3Qgb24gdGhlIFh0ZXJtaW5hbCBib3ggd2hlcmUgdGhlIFggc2VydmVyIGFuZCB4MTF2bmMgcHJvY2Vzc2VzIGFyZS4KLQotICAgU28gdW5sZXNzIFggcGVybWlzc2lvbnMgYXJlIGNvbXBsZXRlbHkgdHVybmVkIG9mZiAoZS5nLiAieGhvc3QgKyIpLCB0bwotICAgcnVuIHRoZSB4MTF2bmMgcHJvY2VzcyBvbiB0aGUgWHRlcm1pbmFsIGJveCB0aGUgTUlULU1BR0lDLUNPT0tJRSBhdXRoCi0gICBmaWxlIGRhdGEgKFhBVVRIT1JJVFkgb3IgJEhPTUUvLlhhdXRob3JpdHkpIG11c3QgYmUgYWNjZXNzaWJsZSBieSBvcgotICAgY29waWVkIHRvIHRoZSBYdGVybWluYWwuIElmICRIT01FLy5YYXV0aG9yaXR5IGlzIGV4cG9ydGVkIHZpYSBORlMKLSAgICh0aGlzIGlzIGluc2VjdXJlIG9mIGNvdXJzZSwgYnV0IGhhcyBiZWVuIGdvaW5nIG9uIGZvciBkZWNhZGVzKSwgdGhlbgotICAgeDExdm5jIGNhbiBzaW1wbHkgcGljayBpdCB1cCB2aWEgTkZTICh5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSAtYXV0aAotICAgb3B0aW9uIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGZpbGUuKSBPdGhlciBvcHRpb25zIGluY2x1ZGUgY29weWluZwotICAgdGhlIGF1dGggZmlsZSB1c2luZyBzY3AsIG9yIHNvbWV0aGluZyBsaWtlOgotICBjZW50cmFsLXNlcnZlcj4gIHhhdXRoIG5leHRyYWN0IC0geHRlcm0xMjM6MCB8IHNzaCB4dGVybTEyMyB4YXV0aCBubWVyZ2UgLQotCi0gICBhbmQgdGhlbiwgc2F5LCBzc2ggZnJvbSBjZW50cmFsLXNlcnZlciB0byB4dGVybTEyMyB0byBzdGFydCB4MTF2bmMuCi0gICBIZXJlICJ4dGVybTEyMyIgcmVmZXJzIHRvIHRoZSBjb21wdXRlciBhY3RpbmcgYXMgdGhlIFh0ZXJtaW5hbCBhbmQKLSAgICJjZW50cmFsLXNlcnZlciIgaXMgdGhlIHRlcm1pbmFsIHNlcnZlci4gWW91IGNhbiB1c2UgInhhdXRoIC1mCi0gICAvcGF0aC90by9jb29raWUtZmlsZSBsaXN0IiB0byBleGFtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgY29va2llKHMpIGluCi0gICBhIGZpbGUgIi9wYXRoL3RvL2Nvb2tpZS1maWxlIi4gU2VlIHRoZSB4YXV0aCgxKSBtYW5wYWdlIGZvciBtb3JlCi0gICBkZXRhaWxzLgotCi0gICBJZiB0aGUgZGlzcGxheSBuYW1lIGluIHRoZSBjb29raWUgZmlsZSBuZWVkcyB0byBiZSBjaGFuZ2VkIGJldHdlZW4gdGhlCi0gICB0d28gaG9zdHMsIHNlZSB0aGlzIG5vdGUgb24gdGhlICJ4YXV0aCBhZGQgLi4uIiBjb21tYW5kLgotCi0gICBBIGxlc3Mgc2VjdXJlIG9wdGlvbiBpcyB0byBydW4gc29tZXRoaW5nIGxpa2UgInhob3N0ICsxMjcuMC4wLjEiIHdoaWxlCi0gICBzaXR0aW5nIGF0IHRoZSBYdGVybWluYWwgYm94IHRvIGFsbG93IGNvb2tpZS1mcmVlIGxvY2FsIGFjY2VzcyBmb3IKLSAgIHgxMXZuYy4gWW91IGNhbiBydW4gInhob3N0IC0xMjcuMC4wLjEiIGFmdGVyIHgxMXZuYyBjb25uZWN0cyBpZiB5b3UKLSAgIHdhbnQgdG8gZ28gYmFjayB0byB0aGUgb3JpZ2luYWwgcGVybWlzc2lvbnMuCi0KLSAgIElmIHRoZSBYdGVybWluYWwgaXMgcmVhbGx5IHN0cmlwcGVkIGRvd24gYW5kIGRvZXNuJ3QgaGF2ZSBhbnkgdXNlcgotICAgYWNjb3VudHMsIE5GUywgZXRjLiB5b3UnbGwgbmVlZCB0byBjb250YWN0IHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IKLSAgIHRvIHNldCBzb21ldGhpbmcgdXAuIEl0IGNhbiBiZSBkb25lISEhICBTb21lIFh0ZXJtaW5hbCBwcm9qZWN0cyBoYXZlCi0gICBhY3R1YWxseSBlbmFibGVkICJydW4gbG9jYWxseSIgZmFjaWxpdGllcyBmb3IgdGhlIHJ1bm5pbmcgb2YgYW4KLSAgIG9jY2FzaW9uYWwgYXBwIG1vcmUgZWZmaWNpZW50bHkgbG9jYWxseSBvbiB0aGUgWHRlcm1pbmFsIGJveCAoZS5nLgotICAgcmVhbHBsYXllci4pCi0KLSAgIE5vdCByZWNvbW1lbmRlZCwgYnV0IGFzIGEgbGFzdCByZXNvcnQsIHlvdSBjb3VsZCBoYXZlIHgxMXZuYyBwb2xsIHRoZQotICAgWHRlcm1pbmFsIERpc3BsYXkgb3ZlciB0aGUgbmV0d29yay4gRm9yIHRoaXMgeW91IHdvdWxkIHJ1biBhICJ4MTF2bmMKLSAgIC1ub3NobSAuLi4iIHByb2Nlc3Mgb24gdGhlIGNlbnRyYWwtc2VydmVyIChhbmQgaG9wZSB0aGUgbmV0d29yayBhZG1pbgotICAgZG9lc24ndCBnZXQgYW5ncnkuLi4pCi0KLSAgIE5vdGU6IHVzZSBvZiBEaXNwbGF5IE1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGF1dGggY29va2llIGZpbGVzIChpLmUuCi0gICBmcm9tIC92YXIvLi4uLCAgL3RtcC8uLi4sIG9yIGVsc2V3aGVyZSkgbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uIHZpYQotICAgeGF1dGgoMSkgdG8gY29ycmVjdGx5IGluY2x1ZGUgdGhlIGRpc3BsYXkgeDExdm5jIHJlZmVycyB0byAoZS5nLgotICAgInhhdXRoIC1mIGNvb2tpZS1maWxlIGFkZCA6MCAuIDQ1YmU1MWFlMmNlOWRmYmFjZDg4MmFiM2VmOGU5NmIxIiwKLSAgIHdoZXJlIHRoZSAiNDViZTUxLi4uIiBjb29raWUgdmFsdWUgd2FzIGZvdW5kIGZyb20gYW4gInhhdXRoIC1mCi0gICAvcGF0aC90by9vcmlnaW5hbC9jb29raWUtZmlsZSBsaXN0Iikgb3Igb3RoZXIgcmVhc29ucy4gU2VlIHhhdXRoKDEpCi0gICBtYW5wYWdlIGZvciBmdWxsIGRldGFpbHMgb24gaG93IHRvIHRyYW5zZmVyIGFuIE1JVC1NQUdJQy1DT09LSUUKLSAgIGJldHdlZW4gbWFjaGluZXMgYW5kIGRpc3BsYXlzLgotCi0gICBWTkN2aWV3ZXIgcGVyZm9ybWFuY2Ugb24gWHRlcm1pbmFsczogIFRoaXMgaXNuJ3QgcmVsYXRlZCB0byB4MTF2bmMgb24KLSAgIFh0ZXJtaW5hbHMsIGJ1dCB3ZSBtZW50aW9uIGl0IGhlcmUgYW55d2F5IGJlY2F1c2Ugb2YgdGhlIHNpbWlsYXIKLSAgIGlzc3Vlcy4gSWYgeW91IGFyZSBvbiBhbiBYdGVybWluYWwgYW5kIHdhbnQgdG8gdXNlIHZuY3ZpZXdlciB0bwotICAgY29ubmVjdCB0byBhIFZOQyBzZXJ2ZXIgc29tZXdoZXJlLCB0aGVuIHBlcmZvcm1hbmNlIHdvdWxkIGJlIGJlc3QgaWYKLSAgIHlvdSByYW4gdGhlIHZpZXdlciBvbiB0aGUgWHRlcm1pbmFsIGJveC4gT3RoZXJ3aXNlLCAoaS5lLiBydW5uaW5nIHRoZQotICAgdmlld2VyIHByb2Nlc3Mgb24gdGhlIGNlbnRyYWwtc2VydmVyKSBhbGwgb2YgdGhlIHZuY3ZpZXdlciBzY3JlZW4KLSAgIGRyYXdpbmcgaXMgZG9uZSBtb3JlIGluZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yay4gU29tZXRoaW5nIHRvCi0gICBjb25zaWRlciwgZXNwZWNpYWxseSBvbiBhIGJ1c3kgbmV0d29yay4gKEJUVywgdGhpcyBoYXMgYWxsIG9mIHRoZQotICAgYWJvdmUgcGVybWlzc2lvbiwgZXRjLCBwcm9ibGVtczogYm90aCB2bmN2aWV3ZXIgYW5kIHgxMXZuYyBhcmUgWAotICAgY2xpZW50IGFwcHMgZGVzaXJlZCB0byBiZSBydW4gb24gdGhlIFh0ZXJtaW5hbCBib3guKQotCi0gICBbU3VuIFJheXNdCi0KLSAgIFEtMzE6IEknbSBoYXZpbmcgdHJvdWJsZSB1c2luZyB4MTF2bmMgd2l0aCBteSBTdW4gUmF5IHNlc3Npb24uCi0KLSAgIFRoZSBTdW4gUmF5IHRlY2hub2xvZ3kgaXMgYSBiaXQgbGlrZSAiVk5DIGRvbmUgaW4gaGFyZHdhcmUiICh0aGUgU3VuCi0gICBSYXkgdGVybWluYWwgZGV2aWNlLCBEVFUsIHBsYXlpbmcgdGhlIHJvbGUgb2YgdGhlIHZuY3ZpZXdlci4pCi0gICBDb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoYXQsIHRoZSBTdW5SYXkgdXNlcidzIHNlc3Npb24gaXMgc3RpbGwgYW4KLSAgIFggc2VydmVyIHRoYXQgc3BlYWtzIHRoZSBYMTEgcHJvdG9jb2wgYW5kIHNvIHgxMXZuYyBzaW1wbHkgdGFsa3MgdG8KLSAgIHRoZSBYIHNlcnZlciBwYXJ0IHRvIGV4cG9ydCB0aGUgU3VuUmF5IGRlc2t0b3AgdG8gYW55IHBsYWNlIGluIHRoZQotICAgd29ybGQgKGkuZS4gbm90IG9ubHkgdG8gYSBTdW4gUmF5IHRlcm1pbmFsIGRldmljZSksIGNyZWF0aW5nIGEgc29ydCBvZgotICAgIlNvZnQgUmF5Ii4gUGxlYXNlIHNlZSB0aGlzIGRpc2N1c3Npb24gb2YgU3VuIFJheSBpc3N1ZXMgZm9yIHNvbHV0aW9ucwotICAgdG8gcHJvYmxlbXMuCi0KLSAgIEFsc28gc2VlIHRoZSBTdW4gUmF5IFJlbW90ZSBDb250cm9sIFRvb2xraXQgdGhhdCB1c2VzIHgxMXZuYy4KLQotICAgW1JlbW90ZSBDb250cm9sXQotCi0gICBRLTMyOiBIb3cgZG8gSSBzdG9wIHgxMXZuYyBvbmNlIGl0IGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQ/Ci0KLSAgIEFzIG9mIERlYy8yMDA0IHRoZXJlIGlzIGEgcmVtb3RlIGNvbnRyb2wgZmVhdHVyZS4gSXQgY2FuIGNoYW5nZSBhIGh1Z2UKLSAgIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6IHNlZSB0aGUgLXJlbW90ZSBhbmQgLXF1ZXJ5IG9wdGlvbnMuCi0gICBUbyBzaHV0IGRvd24gdGhlIHJ1bm5pbmcgeDExdm5jIHNlcnZlciBqdXN0IHR5cGUgIngxMXZuYyAtUiBzdG9wIi4gVG8KLSAgIGRpc2Nvbm5lY3QgYWxsIGNsaWVudHMgZG8gIngxMXZuYyAtUiBkaXNjb25uZWN0OmFsbCIsIGV0Yy4KLQotICAgSWYgdGhlIC1mb3JldmVyIG9wdGlvbiBoYXMgbm90IGJlZW4gc3VwcGxpZWQsIHgxMXZuYyB3aWxsCi0gICBhdXRvbWF0aWNhbGx5IGV4aXQgYWZ0ZXIgdGhlIGZpcnN0IGNsaWVudCBkaXNjb25uZWN0cy4gSW4gZ2VuZXJhbCBpZgotICAgeW91IGNhbm5vdCB1c2UgdGhlIHJlbW90ZSBjb250cm9sLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8ga2lsbCB0aGUKLSAgIHgxMXZuYyBwcm9jZXNzIFRoaXMgY2FuIGJlIGRvbmUgdmlhOiAia2lsbCBOTk5OTiIgKHdoZXJlIE5OTk5OIGlzIHRoZQotICAgeDExdm5jIHByb2Nlc3MgaWQgbnVtYmVyIGZvdW5kIGZyb20gcHMoMSkpLCBvciAicGtpbGwgeDExdm5jIiwgb3IKLSAgICJraWxsYWxsIHgxMXZuYyIgKExpbnV4IG9ubHkuKQotCi0gICBJZiB5b3UgaGF2ZSBub3QgcHV0IHgxMXZuYyBpbiB0aGUgYmFja2dyb3VuZCB2aWEgdGhlIC1iZyBvcHRpb24gb3IKLSAgIHNoZWxsICYgb3BlcmF0b3IsIHRoZW4gc2ltcGx5IHByZXNzIEN0cmwtQyBpbiB0aGUgc2hlbGwgd2hlcmUgeDExdm5jCi0gICBpcyBydW5uaW5nIHRvIHN0b3AgaXQuCi0KLSAgIFBvdGVudGlhbCBHb3RjaGE6IElmIHNvbWVob3cgeW91ciBLZXlwcmVzcyBvZiBDdHJsLUMgd2VudCB0aHJvdWdoCi0gICB4MTF2bmMgdG8gdGhlIFhzZXJ2ZXIgdGhhdCB0aGVuIGRlbGl2ZXJlZCBpdCB0byB4MTF2bmMgaXQgaXMgcG9zc2libGUKLSAgIG9uZSBvciBib3RoIG9mIHRoZSBDdHJsIG9yIEMga2V5cyB3aWxsIGJlIGxlZnQgc3R1Y2sgaW4gdGhlIHByZXNzZWQKLSAgIGRvd24gc3RhdGUgaW4gdGhlIFhzZXJ2ZXIuIFRhcHBpbmcgdGhlIHN0dWNrIGtleSAoZWl0aGVyIHZpYSBhIG5ldwotICAgeDExdm5jIG9yIGF0IHRoZSBwaHlzaWNhbCBjb25zb2xlKSB3aWxsIHJlbGVhc2UgaXQgZnJvbSB0aGUgc3R1Y2sKLSAgIHN0YXRlLiBJZiB0aGUga2V5Ym9hcmQgc2VlbXMgdG8gYmUgYWN0aW5nIHN0cmFuZ2VseSBpdCBpcyBvZnRlbiBmaXhlZAotICAgYnkgdGFwcGluZyBDdHJsLCBTaGlmdCwgYW5kIEFsdC4gQWx0ZXJuYXRpdmVseSwgdGhlIC1jbGVhcl9tb2RzIG9wdGlvbgotICAgYW5kIC1jbGVhcl9rZXlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWxlYXNlIHByZXNzZWQga2V5cyBhdCBzdGFydHVwCi0gICBhbmQgZXhpdC4gVGhlIG9wdGlvbiAtY2xlYXJfYWxsIHdpbGwgYWxzbyB0cnkgdG8gdW5zZXQgQ2Fwc19Mb2NrLAotICAgTnVtX0xvY2ssIGV0Yy4KLQotCi0gICBRLTMzOiBDYW4gSSBjaGFuZ2Ugc2V0dGluZ3MgaW4geDExdm5jIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgaXQ/Ci0gICBDYW4gSSByZW1vdGUgY29udHJvbCBpdD8KLQotICAgTG9vayBhdCB0aGUgLXJlbW90ZSAoYW4gYWxpYXMgaXMgLVIpIGFuZCAtcXVlcnkgKGFuIGFsaWFzIGlzIC1RKQotICAgb3B0aW9ucyBhZGRlZCBpbiBEZWMvMjAwNC4gVGhleSBhbGxvdyBuZWFybHkgZXZlcnl0aGluZyB0byBiZSBjaGFuZ2VkCi0gICBkeW5hbWljYWxseSBhbmQgc2V0dGluZ3MgdG8gYmUgcXVlcmllZC4gRXhhbXBsZXM6ICJ4MTF2bmMgLVIgc2hhcmVkIiwKLSAgICJ4MTF2bmMgLVIgZm9yZXZlciIsICJ4MTF2bmMgLVIgc2NhbGU6My80IiwgIngxMXZuYyAtUSBtb2R0d2VhayIsCi0gICAieDExdm5jIC1SIHN0b3AiLCAieDExdm5jIC1SIGRpc2Nvbm5lY3Q6YWxsIiwgZXRjLi4KLQotICAgVGhlc2UgY29tbWFuZHMgZG8gbm90IHN0YXJ0IGEgeDExdm5jIHNlcnZlciwgYnV0IHJhdGhlciBjb21tdW5pY2F0ZQotICAgd2l0aCBvbmUgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcuIFRoZSBYIGRpc3BsYXkgKFgxMVZOQ19SRU1PVEUKLSAgIHByb3BlcnR5KSBpcyB1c2VkIGFzIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHNvIHRoZSBYIHBlcm1pc3Npb25zCi0gICBhbmQgRElTUExBWSBtdXN0IGJlIHNldCB1cCBjb3JyZWN0bHkgZm9yIGNvbW11bmljYXRpb24gdG8gYmUgcG9zc2libGUuCi0KLSAgIFRoZXJlIGlzIGFsc28gYSBzaW1wbGUgVGNsL1RrIGd1aSBiYXNlZCBvbiB0aGlzIHJlbW90ZSBjb250cm9sCi0gICBtZWNoYW5pc20uIFNlZSB0aGUgLWd1aSBvcHRpb24gZm9yIG1vcmUgaW5mby4gWW91IHdpbGwgbmVlZCB0byBoYXZlCi0gICBUY2wvVGsgKGkuZS4gL3Vzci9iaW4vd2lzaCkgaW5zdGFsbGVkIGZvciBpdCB0byB3b3JrLiBJdCBjYW4gYWxzbyBydW4KLSAgIGluIHRoZSBzeXN0ZW0gdHJheTogIi1ndWkgdHJheSIgb3IgYXMgYSBzdGFuZGFsb25lIHNtYWxsIGljb24gd2luZG93OgotICAgIi1ndWkgaWNvbiIuIFVzZSAiLWd1aSB0cmF5PXNldHBhc3MiIGZvciBhIG5haXZlIHVzZXIgIlNoYXJlIE15Ci0gICBEZXNrdG9wIiBtb2RlLgotCi0gICBbU2VjdXJpdHkgYW5kIFBlcm1pc3Npb25zXQotCi0gICBRLTM0OiBIb3cgZG8gSSBjcmVhdGUgYSBWTkMgcGFzc3dvcmQgZm9yIHVzZSB3aXRoIHgxMXZuYz8KLQotICAgWW91IG1heSBhbHJlYWR5IGhhdmUgb25lIGluICRIT01FLy52bmMvcGFzc3dkIGlmIHlvdSBoYXZlIHVzZWQsIHNheSwKLSAgIHRoZSB2bmNzZXJ2ZXIgcHJvZ3JhbSBmcm9tIHRoZSByZWd1bGFyIFJlYWxWTkMgb3IgVGlnaHRWTkMgcGFja2FnZXMKLSAgIChpLmUuIGxhdW5jaGluZyB0aGUgWHZuYyBzZXJ2ZXIuKSBPdGhlcndpc2UsIHlvdSBjb3VsZCB1c2UgdGhlCi0gICB2bmNwYXNzd2QoMSkgcHJvZ3JhbSBmcm9tIHRob3NlIHBhY2thZ2VzLgotCi0gICBBcyBvZiBKdW4vMjAwNCB4MTF2bmMgc3VwcG9ydHMgdGhlIC1zdG9yZXBhc3N3ZCAicGFzcyIgImZpbGUiIG9wdGlvbiwKLSAgIHdoaWNoIGlzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2Ygc3RvcmVwYXNzd2QuIEJlIHN1cmUgdG8gcXVvdGUgdGhlCi0gICAicGFzcyIgaWYgaXQgY29udGFpbnMgc2hlbGwgbWV0YSBjaGFyYWN0ZXJzLCBzcGFjZXMsIGV0Yy4gRXhhbXBsZToKLSAgeDExdm5jIC1zdG9yZXBhc3N3ZCAnc3dvcmQqZmlzaCcgJEhPTUUvbXl2bmNwYXNzd2QKLQotICAgWW91IHRoZW4gdXNlIHRoZSBwYXNzd29yZCB2aWEgdGhlIHgxMXZuYyBvcHRpb246ICItcmZiYXV0aAotICAgJEhPTUUvbXl2bmNwYXNzd2QiCi0KLSAgIEFzIG9mIEphbi8yMDA2IGlmIHlvdSBkbyBub3Qgc3VwcGx5IGFueSBhcmd1bWVudHM6Ci0gIHgxMXZuYyAtc3RvcmVwYXNzd2QKLQotICAgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQgdG8gc2F2ZSB0byB+Ly52bmMvcGFzc3dkICh5b3VyCi0gICBrZXlzdHJva2VzIHdoZW4gZW50ZXJpbmcgdGhlIHBhc3N3b3JkIHdpbGwgbm90IGJlIGVjaG9lZCB0byB0aGUKLSAgIHNjcmVlbi4pIElmIHlvdSBzdXBwbHkgb25lIGFyZ3VtZW50LCBlLmcuICJ4MTF2bmMgLXN0b3JlcGFzc3dkCi0gICB+Ly5teXBhc3MiLCB0aGUgcGFzc3dvcmQgeW91IGFyZSBwcm9tcHRlZCBmb3Igd2lsbCBiZSBzdG9yZWQgaW4gdGhhdAotICAgZmlsZS4KLQotICAgeDExdm5jIGFsc28gaGFzIHRoZSAtcGFzc3dkZmlsZSBhbmQgLXBhc3N3ZC8tdmlld3Bhc3N3ZCBwbGFpbiB0ZXh0Ci0gICAoaS5lLiBub3Qgb2JzY3VyZWQgbGlrZSB0aGUgLXJmYmF1dGggVk5DIHBhc3N3b3JkcykgcGFzc3dvcmQgb3B0aW9ucy4KLQotICAgWW91IGNhbiB1c2UgdGhlIC11c2VwdyBvcHRpb24gdG8gYXV0b21hdGljYWxseSB1c2UgYW55IHBhc3N3b3JkIGZpbGUKLSAgIHlvdSBoYXZlIGluIH4vLnZuYy9wYXNzd2Qgb3Igfi8udm5jL3Bhc3N3ZGZpbGUgKHRoZSBsYXR0ZXIgaXMgdXNlZAotICAgd2l0aCB0aGUgLXBhc3N3ZGZpbGUgb3B0aW9uLikKLQotICB4MTF2bmMgLXVzZXB3IC1kaXNwbGF5IDowIC4uLgotCi0gICBJZiBuZWl0aGVyIGZpbGUgZXhpc3RzIHlvdSBhcmUgcHJvbXB0ZWQgdG8gc3RvcmUgYSBwYXNzd29yZCBpbgotICAgfi8udm5jL3Bhc3N3ZC4gSWYgYSBwYXNzd29yZCBmaWxlIGNhbm5vdCBiZSBmb3VuZCBvciBjcmVhdGVkIHgxMXZuYwotICAgZXhpdHMgaW1tZWRpYXRlbHkuIEFuIGFkbWluIG1heSB3YW50IHRvIHNldCBpdCB1cCB0aGlzIHdheSBmb3IgdXNlcnMKLSAgIHdobyBkbyBub3Qga25vdyBiZXR0ZXIuCi0KLQotICAgUS0zNTogQ2FuIEkgbWFrZSBpdCBzbyAtc3RvcmVwYXNzd2QgZG9lc24ndCBzaG93IG15IHBhc3N3b3JkIG9uIHRoZQotICAgc2NyZWVuPwotCi0gICBZb3UgY2FuIHVzZSB0aGUgdm5jcGFzc3dkIHByb2dyYW0gZnJvbSBSZWFsVk5DIG9yIFRpZ2h0Vk5DIG1lbnRpb25lZAotICAgYWJvdmUuIEFzIG9mIEphbi8yMDA2IHRoZSAtc3RvcmVwYXNzd2Qgb3B0aW9uIHdpdGhvdXQgYW55IGFyZ3VtZW50cwotICAgd2lsbCBub3QgZWNobyB5b3VyIHBhc3N3b3JkIGFzIHlvdSB0eXBlIGl0IGFuZCBzYXZlIHRoZSBmaWxlIHRvCi0gICB+Ly52bmMvcGFzc3dkOgotICAjIHgxMXZuYyAtc3RvcmVwYXNzd2QKLSAgRW50ZXIgVk5DIHBhc3N3b3JkOgotICBWZXJpZnkgcGFzc3dvcmQ6Ci0gIFdyaXRlIHBhc3N3b3JkIHRvIC9ob21lL215bmFtZS8udm5jL3Bhc3N3ZD8gIFt5XS9uCi0gIFBhc3N3b3JkIHdyaXR0ZW4gdG86IC9ob21lL215bmFtZS8udm5jL3Bhc3N3ZAotCi0gICBZb3UgY2FuIGFsc28gZ2l2ZSBpdCBhbiBhbHRlcm5hdGUgZmlsZW5hbWUsIGUuZy4gIngxMXZuYyAtc3RvcmVwYXNzd2QKLSAgIH4vLm15cGFzcyIKLQotCi0gICBRLTM2OiBDYW4gSSBoYXZlIHR3byBwYXNzd29yZHMgZm9yIFZOQyB2aWV3ZXJzLCBvbmUgZm9yIGZ1bGwgYWNjZXNzCi0gICBhbmQgdGhlIG90aGVyIGZvciB2aWV3LW9ubHkgYWNjZXNzIHRvIHRoZSBkaXNwbGF5PwotCi0gICBZZXMsIGFzIG9mIE1heS8yMDA0IHRoZXJlIGlzIHRoZSAtdmlld3Bhc3N3ZCBvcHRpb24gdG8gc3VwcGx5IHRoZQotICAgdmlldy1vbmx5IHBhc3N3b3JkLiBOb3RlIHRoZSBmdWxsLWFjY2VzcyBwYXNzd29yZCBvcHRpb24gLXBhc3N3ZCBtdXN0Ci0gICBiZSBzdXBwbGllZCBhdCB0aGUgc2FtZSB0aW1lLiBFLmcuOiAtcGFzc3dkIHN3b3JkIC12aWV3cGFzc3dkIGZpc2guCi0KLSAgIFRvIGF2b2lkIHNwZWNpZnlpbmcgdGhlIHBhc3N3b3JkcyBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSB0aGV5Ci0gICBjb3VsZCBiZSBvYnNlcnZlZCB2aWEgdGhlIHBzKDEpIGNvbW1hbmQgYnkgYW55IHVzZXIpIHlvdSBjYW4gdXNlIHRoZQotICAgLXBhc3N3ZGZpbGUgb3B0aW9uIHRvIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgcGxhaW4gdGV4dCBwYXNzd29yZHMuCi0gICBQcmVzdW1hYmx5IHRoaXMgZmlsZSBpcyByZWFkYWJsZSBvbmx5IGJ5IHlvdSwgYW5kIGlkZWFsbHkgaXQgaXMKLSAgIGxvY2F0ZWQgb24gdGhlIG1hY2hpbmUgeDExdm5jIGlzIHJ1biBvbiAodG8gYXZvaWQgYmVpbmcgc25vb3BlZCBvbgotICAgb3ZlciB0aGUgbmV0d29yay4pIFRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0aGUgZnVsbC1hY2Nlc3MKLSAgIHBhc3N3b3JkLiBJZiB0aGVyZSBpcyBhIHNlY29uZCBsaW5lIGluIHRoZSBmaWxlIGFuZCBpdCBpcyBub24tYmxhbmssCi0gICBpdCBpcyB0YWtlbiBhcyB0aGUgdmlldy1vbmx5IHBhc3N3b3JkLiAodXNlICJfX0VNUFRZX18iIHRvIHN1cHBseSBhbgotICAgZW1wdHkgb25lLikKLQotICAgVmlldy1vbmx5IHBhc3N3b3JkcyBjdXJyZW50bHkgZG8gbm90IHdvcmsgZm9yIHRoZSAtcmZiYXV0aCBwYXNzd29yZAotICAgb3B0aW9uIChzdGFuZGFyZCBWTkMgcGFzc3dvcmQgc3RvcmluZyBtZWNoYW5pc20uKSBGV0lXLCBub3RlIHRoYXQKLSAgIGFsdGhvdWdoIHRoZSBvdXRwdXQgKHVzdWFsbHkgcGxhY2VkIGluICRIT01FLy52bmMvcGFzc3dkKSBieSB0aGUKLSAgIHZuY3Bhc3N3ZCBvciBzdG9yZXBhc3N3ZCBwcm9ncmFtcyAob3IgZnJvbSB4MTF2bmMgLXN0b3JlcGFzc3dkKSBsb29rcwotICAgZW5jcnlwdGVkIHRoZXkgYXJlIHJlYWxseSBqdXN0IG9ic2N1cmVkIHRvIGF2b2lkICJjYXN1YWwiIHBhc3N3b3JkCi0gICBzdGVhbGluZy4gSXQgdGFrZXMgYWxtb3N0IG5vIHNraWxsIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGV4dHJhY3QgdGhlCi0gICBwbGFpbiB0ZXh0IHBhc3N3b3JkcyBmcm9tICRIT01FLy52bmMvcGFzc3dkIHNpbmNlIGl0IGlzIHZlcnkKLSAgIHN0cmFpZ2h0LWZvcndhcmQgdG8gd29yayBvdXQgd2hhdCB0byBkbyBmcm9tIHRoZSBWTkMgc291cmNlIGNvZGUuCi0KLQotICAgUS0zNzogQ2FuIEkgaGF2ZSBhcyBtYW55IGZ1bGwtYWNjZXNzIGFuZCB2aWV3LW9ubHkgcGFzc3dvcmRzIGFzIEkKLSAgIGxpa2U/Ci0KLSAgIFllcywgYXMgb2YgSmFuLzIwMDYgaW4gdGhlIGxpYnZuY3NlcnZlciBDVlMgdGhlIC1wYXNzd2RmaWxlIG9wdGlvbiBoYXMKLSAgIGJlZW4gZXh0ZW5kZWQgdG8gaGFuZGxlIGFzIG1hbnkgcGFzc3dvcmRzIGFzIHlvdSBsaWtlLiBZb3UgcHV0IHRoZQotICAgdmlldy1vbmx5IHBhc3N3b3JkcyBhZnRlciBhIGxpbmUgX19CRUdJTl9WSUVXT05MWV9fLgotCi0gICBZb3UgY2FuIGFsc28gZWFzaWx5IGFubm90YXRlIGFuZCBjb21tZW50IG91dCBwYXNzd29yZHMgaW4gdGhlIGZpbGUuCi0gICBZb3UgY2FuIGhhdmUgeDExdm5jIHJlLXJlYWQgdGhlIGZpbGUgZHluYW1pY2FsbHkgd2hlbiBpdCBpcyBtb2RpZmllZC4KLQotCi0gICBRLTM4OiBEb2VzIHgxMXZuYyBzdXBwb3J0IFVuaXggdXNlcm5hbWVzIGFuZCBwYXNzd29yZHM/IENhbiBJIGZ1cnRoZXIKLSAgIGxpbWl0IHRoZSBzZXQgb2YgVW5peCB1c2VybmFtZXMgd2hvIGNhbiBjb25uZWN0IHRvIHRoZSBWTkMgZGVza3RvcD8KLSAgIFVwZGF0ZTogYXMgb2YgRmViLzIwMDYgeDExdm5jIGhhcyB0aGUgLXVuaXhwdyBvcHRpb24gdGhhdCBkb2VzIHRoaXMKLSAgIG91dHNpZGUgb2YgdGhlIFZOQyBwcm90b2NvbCBhbmQgbGlidm5jc2VydmVyLiBUaGUgc3RhbmRhcmQgc3UoMSkKLSAgIHByb2dyYW0gaXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIHBhc3N3b3JkLiBBIGZhbWlsaWFyICJsb2dpbjoiCi0gICBhbmQgIlBhc3N3b3JkOiIgZGlhbG9nIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBvbiBhIGJsYWNrIHNjcmVlbgotICAgaW5zaWRlIHRoZSB2bmN2aWV3ZXIuIFRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgaWYgdGhlIHVzZXIgZmFpbHMgdG8KLSAgIHN1cHBseSB0aGUgY29ycmVjdCBwYXNzd29yZCBpbiAzIHRyaWVzIG9yIGRvZXMgbm90IHNlbmQgb25lIGJlZm9yZSBhCi0gICAyNSBzZWNvbmQgdGltZW91dC4gRXhpc3RpbmcgY2xpZW50cyBhcmUgdmlldy1vbmx5IGR1cmluZyB0aGlzIHBlcmlvZC4KLSAgIEEgbGlzdCBvZiBhbGxvd2VkIFVuaXggdXNlcm5hbWVzIG1heSBhbHNvIGJlIHN1cHBsaWVkIGFsb25nIHdpdGgKLSAgIHBlci11c2VyIHNldHRpbmdzLgotCi0gICBUaGVyZSBpcyBhbHNvIHRoZSAtdW5peHB3X25pcyBvcHRpb24gZm9yIG5vbi1zaGFkb3ctcGFzc3dvcmQKLSAgICh0eXBpY2FsbHkgTklTIGVudmlyb25tZW50cywgaGVuY2UgdGhlIG5hbWUpIHN5c3RlbXMgd2hlcmUgdGhlCi0gICB0cmFkaXRpb25hbCBnZXRwd25hbSgpIGFuZCBjcnlwdCgpIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnN0ZWFkIG9mCi0gICBzdSgxKS4gVGhlIGVuY3J5cHRlZCB1c2VyIHBhc3N3b3JkcyBtdXN0IGJlIGFjY2Vzc2libGUgdG8gdGhlIHVzZXIKLSAgIHJ1bm5pbmcgeDExdm5jIGluIC11bml4cHdfbmlzIG1vZGUsIG90aGVyd2lzZSB0aGUgbG9naW5zIHdpbGwgYWx3YXlzCi0gICBmYWlsIGV2ZW4gd2hlbiB0aGUgY29ycmVjdCBwYXNzd29yZCBpcyBzdXBwbGllZC4gU2VlIHlwY2F0KDEpIGFuZAotICAgc2hhZG93KDUpLgotCi0gICBUd28gc2V0dGluZ3MgYXJlIGVuZm9yY2VkIGluIHRoZSAtdW5peHB3IGFuZCAtdW5peHB3X25pcyBtb2RlcyB0bwotICAgcHJvdmlkZSBleHRyYSBzZWN1cml0eTogdGhlIDEpIC1sb2NhbGhvc3QgYW5kIDIpIC1zdHVubmVsIG9yIC1zc2wKLSAgIG9wdGlvbnMuIFdpdGhvdXQgdGhlc2Ugb25lIG1pZ2h0IHNlbmQgdGhlIFVuaXggdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICBkYXRhIGluIGNsZWFyIHRleHQgb3ZlciB0aGUgbmV0d29yayB3aGljaCBpcyBhIHZlcnkgYmFkIGlkZWEuIFRoZXkgY2FuCi0gICBiZSByZWxheGVkIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUgZW5jcnlwdGlvbiBvdGhlciB0aGFuIHN0dW5uZWwgb3IKLSAgIC1zc2wgKHRoZSBjb25zdHJhaW50IGlzIGF1dG9tYXRpY2FsbHkgcmVsYXhlZCBpZiBTU0hfQ09OTkVDVElPTiBpcyBzZXQKLSAgIGFuZCBpbmRpY2F0ZXMgeW91IGhhdmUgc3NoLWVkIGluLCBob3dldmVyIHRoZSAtbG9jYWxob3N0IHJlcXVpcmVtZW50Ci0gICBpcyBzdGlsbCBlbmZvcmNlZC4pCi0KLSAgIFRoZSB0d28gLXVuaXhwdyBtb2RlcyBoYXZlIGJlZW4gdGVzdGVkIG9uIExpbnV4LCBTb2xhcmlzLCBNYWMgT1MgWCwKLSAgIEhQLVVYLCBBSVgsIFRydTY0LCBGcmVlQlNELCBPcGVuQlNELCBhbmQgTmV0QlNELiBBZGRpdGlvbmFsIHRlc3RpbmcgaXMKLSAgIGFwcHJlY2lhdGVkLiBGb3IgdGhlIGxhc3QgNCBpdCBhcHBlYXJzIHRoYXQgc3UoMSkgd2lsbCBub3QgcHJvbXB0IGZvcgotICAgYSBwYXNzd29yZCBpZiBzdS1pbmcgdG8gb25lc2VsZi4gU2luY2UgeDExdm5jIHJlcXVpcmVzIGEgcGFzc3dvcmQKLSAgIHByb21wdCBmcm9tIHN1LCB4MTF2bmMgZm9yY2VzIHRob3NlIGxvZ2lucyB0byBmYWlsIGV2ZW4gd2hlbiB0aGUKLSAgIGNvcnJlY3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQuIE9uICpCU0QgaXQgYXBwZWFycyB0aGlzIGNhbiBiZSBjb3JyZWN0ZWQKLSAgIGJ5IHJlbW92aW5nIHRoZSBwYW1fc2VsZi5zbyBlbnRyeSBpbiAvZXRjL3BhbS5kL3N1LgotCi0KLSAgIFByZXZpb3VzIG9sZGVyIGRpc2N1c3Npb24gKHByaW9yIHRvIHRoZSAtdW5peHB3IG9wdGlvbik6Ci0KLSAgIFVudGlsIHRoZSBWTkMgcHJvdG9jb2wgYW5kIGxpYnZuY3NlcnZlciBzdXBwb3J0IHRoaXMgdGhpbmdzIHdpbGwgYmUKLSAgIGFwcHJveGltYXRlIGF0IGJlc3QuCi0KLSAgIE9uZSBhcHByb3hpbWF0ZSBtZXRob2QgaW52b2x2ZXMgc3RhcnRpbmcgeDExdm5jIHdpdGggdGhlIC1sb2NhbGhvc3QKLSAgIG9wdGlvbi4gVGhpcyBiYXNpY2FsbHkgcmVxdWlyZXMgdGhlIHZpZXdlciB1c2VyIHRvIGxvZyBpbnRvIHRoZQotICAgd29ya3N0YXRpb24gd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmcgdmlhIHRoZWlyIFVuaXggdXNlcm5hbWUgYW5kCi0gICBwYXNzd29yZCwgYW5kIHRoZW4gc29tZWhvdyBzZXQgdXAgYSBwb3J0IHJlZGlyZWN0aW9uIG9mIGhpcyB2bmN2aWV3ZXIKLSAgIGNvbm5lY3Rpb24gdG8gbWFrZSBpdCBhcHBlYXIgdG8gZW1hbmF0ZSBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLiBBcwotICAgZGlzY3Vzc2VkIGFib3ZlLCBzc2ggaXMgdXNlZnVsIGZvciB0aGlzOiAic3NoIC1MIDU5MDA6bG9jYWxob3N0OjU5MDAKLSAgIHVzZXJAaG9zdG5hbWUgLi4uIiBTZWUgdGhlIHNzaCB3cmFwcGVyIHNjcmlwdHMgbWVudGlvbmVkIGVsc2V3aGVyZSBvbgotICAgdGhpcyBwYWdlLiBzdHVubmVsIGRvZXMgdGhpcyBhcyB3ZWxsLgotCi0gICBPZiBjb3Vyc2UgYSBtYWxpY2lvdXMgdXNlciBjb3VsZCBhbGxvdyBvdGhlciB1c2VycyB0byBnZXQgaW4gdGhyb3VnaAotICAgaGlzIGNoYW5uZWwsIGJ1dCB0aGF0IGlzIGEgcHJvYmxlbSB3aXRoIGV2ZXJ5IG1ldGhvZC4gQW5vdGhlciB0aGluZyB0bwotICAgd2F0Y2ggb3V0IGZvciBpcyBhIG1hbGljaW91cyB1c2VyIG9uIHRoZSB2aWV3ZXIgc2lkZSAod2hlcmUgc3NoIGlzCi0gICBydW5uaW5nKSB0cnlpbmcgdG8gc25lYWsgaW4gdGhyb3VnaCB0aGUgc3NoIHBvcnQgcmVkaXJlY3Rpb24gdGhlcmUuCi0KLSAgIFJlZ2FyZGluZyBsaW1pdGluZyB0aGUgc2V0IG9mIFVuaXggdXNlcm5hbWVzIHdobyBjYW4gY29ubmVjdCwgdGhlCi0gICB0cmFkaXRpb25hbCB3YXkgd291bGQgYmUgdG8gZnVydGhlciByZXF1aXJlIGEgVk5DIHBhc3N3b3JkIHRvIHN1cHBsaWVkCi0gICAoLXJmYmF1dGgsIC1wYXNzd2QsIGV0YykgYW5kIG9ubHkgdGVsbCB0aGUgcGVvcGxlIGFsbG93ZWQgaW4gd2hhdCB0aGUKLSAgIFZOQyBwYXNzd29yZCBpcy4gQSBzY2hlbWUgdGhhdCBhdm9pZHMgYSBzZWNvbmQgcGFzc3dvcmQgaW52b2x2ZXMgdXNpbmcKLSAgIHRoZSAtYWNjZXB0IG9wdGlvbiB0aGF0IHJ1bnMgYSBwcm9ncmFtIHRvIGV4YW1pbmUgdGhlIGNvbm5lY3Rpb24KLSAgIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGljaCB1c2VyIGlzIGNvbm5lY3RpbmcgZnJvbSB0aGUgbG9jYWwKLSAgIG1hY2hpbmUuIFRoYXQgbWF5IGJlIGRpZmZpY3VsdCB0byBkbywgYnV0LCBmb3IgZXhhbXBsZSwgdGhlIHByb2dyYW0KLSAgIGNvdWxkIHVzZSB0aGUgaWRlbnQgc2VydmljZSBvbiB0aGUgbG9jYWwgbWFjaGluZSAobm9ybWFsbHkgaWRlbnQKLSAgIHNob3VsZCBub3QgYmUgdHJ1c3RlZCBvdmVyIHRoZSBuZXR3b3JrLCBidXQgb24gdGhlIGxvY2FsIG1hY2hpbmUgaXQKLSAgIHNob3VsZCBiZSBhY2N1cmF0ZTogb3RoZXJ3aXNlIHJvb3QgaGFzIGJlZW4gY29tcHJvbWlzZWQgYW5kIHNvIHRoZXJlCi0gICBhcmUgbW9yZSBzZXJpb3VzIHByb2JsZW1zISBVbmZvcnR1bmF0ZWx5IHJlY2VudCBMaW51eCBkaXN0cm9zIHNlZW0gdG8KLSAgIHByb3ZpZGUgYSByYW5kb20gc3RyaW5nIChNRDUgaGFzaD8pIGluc3RlYWQgb2YgdGhlIHVzZXJuYW1lLikgQW4KLSAgIGV4YW1wbGUgc2NyaXB0IHBhc3NlZCBpbiB2aWEgLWFjY2VwdCBzY3JpcHRuYW1lIHRoYXQgZGVkdWNlcyB0aGUgVW5peAotICAgdXNlcm5hbWUgYW5kIGxpbWl0cyB3aG8gY2FuIGJlIGFjY2VwdGVkIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UKLSAgIHRoaXM6Ci0jIS9iaW4vc2gKLWlmIFsgIiRSRkJfQ0xJRU5UX0lQIiAhPSAiMTI3LjAuMC4xIiAtbyAiJFJGQl9TRVJWRVJfSVAiICE9ICIxMjcuMC4wLjEiIF07IHRoZW4KLSAgICAgICAgZXhpdCAxICAjIHNvbWV0aGluZyBmaXNoeS4uLiByZWplY3QgaXQuCi1maQotdXNlcj1gZWNobyAiJFJGQl9DTElFTlRfUE9SVCwgJFJGQl9TRVJWRVJfUE9SVCIgfCBuYyAtdyAxICRSRkJfQ0xJRU5UX0lQIDExMyBcCi0gICAgICAgIHwgZ3JlcCAnVVNFUklELipVTklYJyB8IGhlYWQgLW4gMSB8IHNlZCAtZSAncy9bXHIgXS8vZycgfCBhd2sgLUY6ICd7cHJpCi1udCAkNH0nYAotCi1mb3Igb2t1c2VyIGluIGZyZWQgYmFybmV5IHdpbG1hIGJldHR5Ci1kbwotICAgICAgICBpZiBbICJYJHVzZXIiID0gIlgkb2t1c2VyIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZXhpdCAwICAjIGFjY2VwdCBpdAotICAgICAgICBmaQotZG9uZQotZXhpdCAxICAjIHJlamVjdCBpdAotCi0gICBGb3IgdGhpcyB0byB3b3JrIHdpdGggc3NoIHBvcnQgcmVkaXJlY3Rpb24sIHRoZSBzc2ggb3B0aW9uCi0gICBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvdGhlcndpc2UgdGhlIHVzZXJpZCB3aWxsCi0gICBhbHdheXMgYmUgInJvb3QiLgotCi0gICBIZXJlIGlzIGEgc2ltaWxhciBleGFtcGxlIGJhc2VkIG9uIExpbnV4IG5ldHN0YXQoMSkgb3V0cHV0OgotIyEvYmluL3NoCi0jCi0jIGFjY2VwdF9sb2NhbF9uZXRzdGF0OiAgeDExdm5jIC1hY2NlcHQgY29tbWFuZCB0byBhY2NlcHQgYSBsb2NhbAotIyB2bmN2aWV3ZXIgY29ubmVjdGlvbiBmcm9tIGFjY2VwdGFibGUgdXNlcnMuICBMaW51eCBuZXRzdGF0IC1udGUgaXMgdXNlZC4KLQotUEFUSD0vYmluOi91c3IvYmluOiRQQVRIOyBleHBvcnQgUEFUSDsgICMgc2V0IHRvIGdldCBzeXN0ZW0gdXRpbHMKLQotYWxsb3dlZD0iYGlkIC11IGZyZWRgIjsgICAgICAgICAgICAgICAgICMgYWRkIG1vcmUgdXNlciBudW1iZXJzIGlmIGRlc2lyZWQuCi0KLSMgY2hlY2sgcmVxdWlyZWQgc2V0dGluZ3MKLW9rPTEKLWlmIFsgIlgkYWxsb3dlZCIgPSAiWCIgXTsgdGhlbgotICAgICAgICBvaz0wOyAgICMgc29tZXRoaW5nIHdyb25nIHdpdGggYWxsb3dlZCBsaXN0Ci1maQotaWYgWyAiWCRSRkJfQ0xJRU5UX0lQIiAhPSAiWDEyNy4wLjAuMSIgLW8gIlgkUkZCX1NFUlZFUl9JUCIgIT0gIlgxMjcuMC4wLjEiIF07Ci10aGVuCi0gICAgICAgIG9rPTA7ICAgIyBjb25uZWN0aW9uIG5vdCBvdmVyIGxvY2FsaG9zdAotZmkKLWlmIFsgIiRSRkJfQ0xJRU5UX1BPUlQiIC1sZSAwIC1vICIkUkZCX1NFUlZFUl9QT1JUIiAtbGUgMCBdOyB0aGVuCi0gICAgICAgIG9rPTA7ICAgIyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0Y3AgcG9ydCBudW1iZXJzCi1maQotaWYgWyAiJG9rIiA9IDAgXTsgdGhlbgotICAgICAgICBlY2hvICIkMDogaW52YWxpZCBzZXR0aW5nOiIgMT4mMgotICAgICAgICBlbnYgfCBncmVwIF5SRkIgfCBzb3J0IDE+JjIKLSAgICAgICAgZXhpdCAxCi1maQotCi0jIExpbnV4IG5ldHN0YXQgLW50ZToKLSMgUHJvdG8gUmVjdi1RIFNlbmQtUSBMb2NhbCBBZGRyZXNzICAgICAgICAgICBGb3JlaWduIEFkZHJlc3MgICAgICAgICBTdGF0ZQotICAgVXNlciAgICAgICBJbm9kZQotIyAwICAgICAwICAgICAgMCAgICAgIFJGQl9DTElFTlQgICAgICAgICAgICAgIFJGQl9TRVJWRVIgICAgICAgICAgIEVTVEFCTElTSEVECi0gICBubm5uICAgICAgIC4uLi4KLSMKLXVzZXI9YG5ldHN0YXQgLW50ZSB8IGdyZXAgRVNUQUJMSVNIRUQgXAotICAgICAgICB8IGdyZXAgIiAkUkZCX0NMSUVOVF9JUDokUkZCX0NMSUVOVF9QT1JUICAqJFJGQl9TRVJWRVJfSVA6JFJGQl9TRVJWRVJfUAotT1JUICJgCi0KLWVjaG8gIm5ldHN0YXQgbWF0Y2g6ICR1c2VyIiAxPiYyCi11c2VyPWBlY2hvICIkdXNlciIgfCBoZWFkIC1uIDEgfCBzZWQgLWUgJ3MvXi4qRVNUQUJMSVNIRUQvIC8nIHwgYXdrICd7cHJpbnQgJDF9Ci0nYAotCi1vaz0wCi1mb3IgdSBpbiAkYWxsb3dlZAotZG8KLSAgICAgICAgaWYgWyAiWCR1c2VyIiA9ICJYJHUiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBvaz0xCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLWRvbmUKLQotaWYgWyAiWCRvayIgPSAiWDEiIF07IHRoZW4KLSAgICAgICAgZWNobyAiJDA6IHVzZXIgYWNjZXB0ZWQ6ICckdXNlciciIDE+JjIKLSAgICAgICAgZXhpdCAwCi1lbHNlCi0gICAgICAgIGVjaG8gIiQwOiB1c2VyICckdXNlcicgaW52YWxpZDoiIDE+JjIKLSAgICAgICAgZWNobyAiJDA6IGFsbG93ZWQ6ICRhbGxvd2VkIiAxPiYyCi0gICAgICAgIGVudiB8IGdyZXAgXlJGQiB8IHNvcnQgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLQotICAgUS0zOTogQ2FuIEkgc3VwcGx5IGFuIGV4dGVybmFsIHByb2dyYW0gdG8gcHJvdmlkZSBteSBvd24gY3VzdG9tIGxvZ2luCi0gICBtZXRob2QgKGUuZy4gRHluYW1pYy9PbmUtdGltZSBwYXNzd29yZHMgb3Igbm9uLVVuaXggKExEQVApIHVzZXJuYW1lcwotICAgYW5kIHBhc3N3b3Jkcyk/Ci0gICBZZXMsIHRoZXJlIGFyZSBzZXZlcmFsIHBvc3NpYmlsaXRpZXMuIEZvciBiYWNrZ3JvdW5kIHNlZSB0aGUgRkFRIG9uCi0gICB0aGUgLWFjY2VwdCB3aGVyZSBhbiBleHRlcm5hbCBwcm9ncmFtIG1heSBiZSBydW4gdG8gZGVjaWRlIGlmIGEgVk5DCi0gICBjbGllbnQgc2hvdWxkIGJlIGFsbG93ZWQgdG8gdHJ5IHRvIGNvbm5lY3QgYW5kIGxvZyBpbi4gSWYgdGhlIHByb2dyYW0KLSAgIChvciBsb2NhbCB1c2VyIHByb21wdGVkIGJ5IGEgcG9wdXApIGFuc3dlcnMgInllcyIsIHRoZW4gLWFjY2VwdAotICAgcHJvY2VlZHMgdG8gdGhlIG5vcm1hbCBWTkMgYW5kIHgxMXZuYyBhdXRoZW50aWNhdGlvbiBtZXRob2RzLAotICAgb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCi0KLSAgIFRvIHByb3ZpZGUgbW9yZSBkaXJlY3QgY291cGxpbmcgdG8gdGhlIFZOQyBjbGllbnQncyB1c2VybmFtZSBhbmQvb3IKLSAgIHN1cHBsaWVkIHBhc3N3b3JkIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIGFkZGVkIGluIFNlcC8yMDA2OgotICAgICAqIC11bml4cHdfY21kIGNvbW1hbmQKLSAgICAgKiAtcGFzc3dkZmlsZSBjbWQ6Y29tbWFuZAotICAgICAqIC1wYXNzd2RmaWxlIGN1c3RvbTpjb21tYW5kCi0KLSAgIEluIGVhY2ggY2FzZSAiY29tbWFuZCIgaXMgYW4gZXh0ZXJuYWwgY29tbWFuZCBydW4gYnkgeDExdm5jLiBZb3UKLSAgIHN1cHBseSBpdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb3VwbGUgdG8geW91ciBMREFQIHN5c3RlbSBvciBvdGhlcgotICAgc2VydmVycyB5b3Ugc2V0IHVwLgotCi0gICBGb3IgLXVuaXhwd19jbWQgdGhlIG5vcm1hbCAtdW5peHB3IExvZ2luOiBhbmQgUGFzc3dvcmQ6IHByb21wdHMgYXJlCi0gICBzdXBwbGllZCB0byB0aGUgVk5DIHZpZXdlciBhbmQgdGhlIHN0cmluZ3MgdGhlIGNsaWVudCByZXR1cm5zIGFyZSB0aGVuCi0gICBwaXBlZCBpbnRvICJjb21tYW5kIiBhcyB0aGUgZmlyc3QgdHdvIGxpbmVzIG9mIGl0cyBzdGFuZGFyZCBpbnB1dC4gSWYKLSAgIHRoZSBjb21tYW5kIHJldHVybnMgc3VjY2VzcywgaS5lLiBleGl0KDApLCB0aGUgVk5DIGNsaWVudCBpcyBhY2NlcHRlZCwKLSAgIG90aGVyd2lzZSBpdCBpcyByZWplY3RlZC4KLQotICAgRm9yICItcGFzc3dkZmlsZSBjbWQ6Y29tbWFuZCIgdGhlIGNvbW1hbmQgaXMgcnVuIGFuZCBpdCByZXR1cm5zIGEKLSAgIHBhc3N3b3JkIGxpc3QgKGxpa2UgYSBwYXNzd29yZCBmaWxlLCBzZWUgdGhlIC1wYXNzd2RmaWxlIHJlYWQ6ZmlsZW5hbWUKLSAgIG1vZGUuKSBQZXJoYXBzIGEgZHluYW1pYywgb25lLXRpbWUgcGFzc3dvcmQgaXMgcmV0cmlldmVkIGZyb20gYSBzZXJ2ZXIKLSAgIHRoaXMgd2F5LgotCi0gICBGb3IgIi1wYXNzd2RmaWxlIGN1c3RvbTpjb21tYW5kIiBvbmUgZ2V0cyBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlCi0gICBWTkMgY2hhbGxlbmdlLXJlc3BvbnNlIGRpYWxvZyB3aXRoIHRoZSBWTkMgY2xpZW50LiB4MTF2bmMgc2VuZHMgb3V0IGEKLSAgIHN0cmluZyBvZiByYW5kb20gYnl0ZXMgKDE2IGJ5IHRoZSBWTkMgc3BlYykgYW5kIHRoZSBjbGllbnQgcmV0dXJucyB0aGUKLSAgIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgd2F5IHRoZSBzZXJ2ZXIgY2FuIHZlcmlmeSBvbmx5IHRoZQotICAgYXV0aG9yaXplZCB1c2VyIGNvdWxkIGhhdmUgY3JlYXRlZC4gVGhlIFZOQyBwcm90b2NvbCBzcGVjaWZpZXMgREVTCi0gICBlbmNyeXB0aW9uIHdpdGggYSBwYXNzd29yZC4gSWYgeW91IGFyZSB3aWxsaW5nIHRvIG1vZGlmeSB0aGUgVk5DCi0gICB2aWV3ZXJzLCB5b3UgY2FuIGhhdmUgaXQgYmUgYW55dGhpbmcgeW91IHdhbnQsIHBlcmhhcHMgYSBsZXNzCi0gICBjcmFja2FibGUgTUQ1IGhhc2ggc2NoZW1lIG9yIG9uZS10aW1lIHBhZC4gWW91ciBwcm9ncmFtIHdpbGwgcmVhZCBmcm9tCi0gICBpdHMgc3RhbmRhcmQgaW5wdXQgdGhlIHNpemUgb2YgdGhlIGNoYWxsZW5nZS1yZXNwb25zZSBmb2xsb3dlZCBieSBhCi0gICBuZXdsaW5lLCB0aGVuIHRoZSBjaGFsbGVuZ2UgYnl0ZXMgZm9sbG93ZWQgYnkgdGhlIHJlc3BvbnNlIGJ5dGVzLiBJZgotICAgeW91ciBjb21tYW5kIHRoZW4gcmV0dXJucyBzdWNjZXNzLCBpLmUuIGV4aXQoMCksIHRoZSBWTkMgY2xpZW50IGlzCi0gICBhY2NlcHRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlamVjdGVkLgotCi0gICBJbiBhbGwgY2FzZXMgdGhlICJSRkJfKiIgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgdW5kZXIKLSAgIC1hY2NlcHQuIFRoZXNlIHZhcmlhYmxlcyBjYW4gcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIHRoZQotICAgZXh0ZXJuYWxseSBzdXBwbGllZCBwcm9ncmFtIHRvIHVzZS4KLQotCi0gICBRLTQwOiBXaHkgZG9lcyB4MTF2bmMgZXhpdCBhcyBzb29uIGFzIHRoZSBWTkMgdmlld2VyIGRpc2Nvbm5lY3RzPyBBbmQKLSAgIHdoeSBkb2Vzbid0IGl0IGFsbG93IG1vcmUgdGhhbiBvbmUgVk5DIHZpZXdlciB0byBjb25uZWN0IGF0IHRoZSBzYW1lCi0gICB0aW1lPwotCi0gICBUaGVzZSBkZWZhdWx0cyBhcmUgc2ltcGxlIHNhZmV0eSBtZWFzdXJlcyB0byBhdm9pZCBzb21lb25lIHVua25vd2luZ2x5Ci0gICBsZWF2aW5nIGhpcyBYMTEgZGVza3RvcCBleHBvc2VkICh0byB0aGUgaW50ZXJuZXQsIHNheSkgZm9yIGxvbmcKLSAgIHBlcmlvZHMgb2YgdGltZS4gVXNlIHRoZSAtZm9yZXZlciBvcHRpb24gKGFrYSAtbWFueSkgdG8gaGF2ZSB4MTF2bmMKLSAgIHdhaXQgZm9yIG1vcmUgY29ubmVjdGlvbnMgYWZ0ZXIgdGhlIGZpcnN0IGNsaWVudCBkaXNjb25uZWN0cy4gVXNlIHRoZQotICAgLXNoYXJlZCBvcHRpb24gdG8gaGF2ZSB4MTF2bmMgYWxsb3cgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0Ci0gICBzaW11bHRhbmVvdXNseS4KLQotICAgUmVjb21tZW5kZWQgYWRkaXRpb25hbCBzYWZldHkgbWVhc3VyZXMgaW5jbHVkZSB1c2luZyBzc2ggKHNlZSBhYm92ZSksCi0gICBzdHVubmVsLCAtc3NsLCBvciBhIFZQTiB0byBhdXRoZW50aWNhdGUgYW5kIGVuY3J5cHQgdGhlIHZpZXdlcgotICAgY29ubmVjdGlvbnMgb3IgdG8gYXQgbGVhc3QgdXNlIHRoZSAtcmZiYXV0aCBwYXNzd2QtZmlsZSBvcHRpb24gdG8gdXNlCi0gICBWTkMgcGFzc3dvcmQgcHJvdGVjdGlvbiAob3IgLXBhc3N3ZGZpbGUpIEl0IGlzIHVwIHRvIFlPVSB0byBhcHBseQotICAgdGhlc2Ugc2VjdXJpdHkgbWVhc3VyZXMsIHRoZXkgd2lsbCBub3QgYmUgZG9uZSBmb3IgeW91IGF1dG9tYXRpY2FsbHkuCi0KLQotICAgUS00MTogQ2FuIEkgbGltaXQgd2hpY2ggbWFjaGluZXMgaW5jb21pbmcgVk5DIGNsaWVudHMgY2FuIGNvbm5lY3QKLSAgIGZyb20/Ci0KLSAgIFllcywgbG9vayBhdCB0aGUgLWFsbG93IGFuZCAtbG9jYWxob3N0IG9wdGlvbnMgdG8gbGltaXQgY29ubmVjdGlvbnMgYnkKLSAgIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MuIEUuZy4KLSAgeDExdm5jIC1hbGxvdyAxOTIuMTY4LjAuMSwxOTIuMTY4LjAuMgotCi0gICBmb3IgdGhvc2UgdHdvIGhvc3RzIG9yCi0gIHgxMXZuYyAtYWxsb3cgMTkyLjE2OC4wLgotCi0gICBmb3IgYSBzdWJuZXQuIEZvciBpbmRpdmlkdWFsIGhvc3RzIHlvdSBjYW4gdXNlIHRoZSBob3N0bmFtZSBpbnN0ZWFkIG9mCi0gICB0aGUgSVAgbnVtYmVyLCBlLmcuOiAiLWFsbG93IHNub29weSIsIGFuZCAiLWFsbG93IGRhcmtzdGFyLHdvbWJhdCIuCi0gICBOb3RlIHRoYXQgLWxvY2FsaG9zdCBhY2hpZXZlcyB0aGUgc2FtZSB0aGluZyBhcyAiLWFsbG93IDEyNy4wLjAuMSIKLQotICAgRm9yIG1vcmUgY29udHJvbCwgYnVpbGQgbGlidm5jc2VydmVyIHdpdGggbGlid3JhcCBzdXBwb3J0Ci0gICAodGNwX3dyYXBwZXJzKSBhbmQgdGhlbiB1c2UgL2V0Yy9ob3N0cy5hbGxvdyBTZWUgaG9zdHNfYWNjZXNzKDUpIGZvcgotICAgY29tcGxldGUgZGV0YWlscy4KLQotCi0gICBRLTQyOiBIb3cgZG8gSSBidWlsZCB4MTF2bmMvbGlidm5jc2VydmVyIHdpdGggbGlid3JhcCAodGNwX3dyYXBwZXJzKQotICAgc3VwcG9ydD8KLQotICAgSGVyZSBpcyBvbmUgd2F5IHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgY29uZmlndXJlIHNjcmlwdDoKLSAgZW52IENQUEZMQUdTPS1EVVNFX0xJQldSQVAgTERGTEFHUz0tbHdyYXAgLi9jb25maWd1cmUKLQotICAgdGhlbiBydW4gbWFrZSBhcyB1c3VhbC4gVGhpcyByZXF1aXJlcyBsaWJ3cmFwIGFuZCBpdHMgZGV2ZWxvcG1lbnQKLSAgIHBhY2thZ2UgKHRjcGQuaCkgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lLiBJZiBhZGRpdGlvbmFsCi0gICBDUFBGTEFHUyBvciBMREZMQUdTIG9wdGlvbnMgYXJlIG5lZWRlZCBzdXBwbHkgdGhlbSBhcyB3ZWxsIHVzaW5nCi0gICBxdW90ZXMuCi0KLSAgIFRoZSByZXN1bHRpbmcgeDExdm5jIHRoZW4gdXNlcyBsaWJ3cmFwL3RjcF93cmFwcGVycyBmb3IgY29ubmVjdGlvbnMuCi0gICBUaGUgc2VydmljZSBuYW1lIHlvdSB3aWxsIHVzZSBpbiAvZXRjL2hvc3RzLmFsbG93IGFuZCAvZXRjL2hvc3RzLmRlbnkKLSAgIGlzICJ2bmMiLCBlLmcuOgotICB2bmM6IDE5Mi4xNjguMTAwLjMgLmV4YW1wbGUuY29tCi0KLSAgIE5vdGUgdGhhdCBpZiB5b3UgcnVuIHgxMXZuYyBvdXQgb2YgaW5ldGQgeW91IGRvIG5vdCBuZWVkIHRvIGJ1aWxkCi0gICB4MTF2bmMgd2l0aCBsaWJ3cmFwIHN1cHBvcnQgYmVjYXVzZSB0aGUgL3Vzci9zYmluL3RjcGQgcmVmZXJlbmNlIGluCi0gICAvZXRjL2luZXRkLmNvbmYgaGFuZGxlcyB0aGUgdGNwX3dyYXBwZXJzIHN0dWZmLgotCi0KLSAgIFEtNDM6IENhbiBJIGhhdmUgeDExdm5jIG9ubHkgbGlzdGVuIG9uIG9uZSBuZXR3b3JrIGludGVyZmFjZSAoZS5nLgotICAgaW50ZXJuYWwgTEFOKSByYXRoZXIgdGhhbiBoYXZpbmcgaXQgbGlzdGVuIG9uIGFsbCBuZXR3b3JrIGludGVyZmFjZXMKLSAgIGFuZCByZWx5aW5nIG9uIC1hbGxvdyB0byBmaWx0ZXIgdW53YW50ZWQgY29ubmVjdGlvbnMgb3V0PwotCi0gICBBcyBvZiBNYXIvMjAwNSB0aGVyZSBpcyB0aGUgIi1saXN0ZW4gaXBhZGRyIiBvcHRpb24gdGhhdCBlbmFibGVzIHRoaXMuCi0gICBGb3IgaXBhZGRyIGVpdGhlciBzdXBwbHkgdGhlIGRlc2lyZWQgbmV0d29yayBpbnRlcmZhY2UncyBJUCBhZGRyZXNzCi0gICAob3IgdXNlIGEgaG9zdG5hbWUgdGhhdCByZXNvbHZlcyB0byBpdCkgb3IgdXNlIHRoZSBzdHJpbmcgImxvY2FsaG9zdCIuCi0gICBGb3IgYWRkaXRpb25hbCBmaWx0ZXJpbmcgc2ltdWx0YW5lb3VzbHkgdXNlIHRoZSAiLWFsbG93IGhvc3QxLC4uLiIKLSAgIG9wdGlvbiB0byBhbGxvdyBvbmx5IHNwZWNpZmljIGhvc3RzIGluLgotCi0gICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gaW5zdXJlIHRoYXQgbm8gb25lIGNhbiBldmVuIGJlZ2luCi0gICBhIGRpYWxvZyB3aXRoIHgxMXZuYyBmcm9tIHVudHJ1c3RlZCBuZXR3b3JrIGludGVyZmFjZXMgKGUuZy4gcHBwMC4pCi0gICBUaGUgb3B0aW9uIC1sb2NhbGhvc3Qgbm93IGltcGxpZXMgIi1saXN0ZW4gbG9jYWxob3N0IiBzaW5jZSB0aGF0IGlzCi0gICB3aGF0IG1vc3QgcGVvcGxlIGV4cGVjdCBpdCB0byBkby4KLQotCi0gICBRLTQ0OiBOb3cgdGhhdCAtbG9jYWxob3N0IGltcGxpZXMgbGlzdGVuaW5nIG9ubHkgb24gdGhlIGxvb3BiYWNrCi0gICBpbnRlcmZhY2UsIGhvdyBJIGNhbiBvY2Nhc2lvbmFsbHkgYWxsb3cgaW4gYSBub24tbG9jYWxob3N0IHZpYSB0aGUgLVIKLSAgIGFsbG93b25jZSByZW1vdGUgY29udHJvbCBjb21tYW5kPwotCi0gICBUbyBkbyB0aGlzIHNwZWNpZnkgIi1hbGxvdyBsb2NhbGhvc3QiLiBVbmxpa2UgLWxvY2FsaG9zdCB0aGlzIHdpbGwKLSAgIGxlYXZlIHgxMXZuYyBsaXN0ZW5pbmcgb24gYWxsIGludGVyZmFjZXMgKGJ1dCBvZiBjb3Vyc2Ugb25seSBhbGxvd2luZwotICAgaW4gbG9jYWwgY29ubmVjdGlvbnMsIGUuZy4gc3NoIHJlZGlycy4pIFRoZW4geW91IGNhbiBsYXRlciBydW4gIngxMXZuYwotICAgLVIgYWxsb3dvbmNlOnNvbWVob3N0IiBvciB1c2UgdG8gZ3VpIHRvIHBlcm1pdCBhIG9uZS1zaG90IGNvbm5lY3Rpb24KLSAgIGZyb20gYSByZW1vdGUgaG9zdC4KLQotCi0gICBRLTQ1OiBDYW4gSSBmaW5lIHR1bmUgd2hhdCB0eXBlcyBvZiB1c2VyIGlucHV0IGFyZSBhbGxvd2VkPyBFLmcuIGhhdmUKLSAgIHNvbWUgdXNlcnMganVzdCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlLCBidXQgbm90IGNsaWNrIG9yIHR5cGUKLSAgIGFueXRoaW5nPwotCi0gICBBcyBvZiBGZWIvMjAwNSwgdGhlIC1pbnB1dCBvcHRpb24gYWxsb3dzIHlvdSB0byBkbyB0aGlzLiAiSyIsICJNIiwKLSAgICJCIiwgIkMiLCBhbmQgIkYiIHN0YW5kIGZvciBLZXlzdHJva2UsIE1vdXNlLW1vdGlvbiwgQnV0dG9uLWNsaWNrcywKLSAgIENsaXBib2FyZCwgYW5kIEZpbGUtVHJhbnNmZXIsIHJlc3BlY3RpdmVseS4gVGhlIHNldHRpbmc6ICItaW5wdXQgTSIKLSAgIG1ha2VzIGF0dGFjaGVkIHZpZXdlcnMgb25seSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlLiAiLWlucHV0IEtNQkMsTSIKLSAgIGxldHMgbm9ybWFsIGNsaWVudHMgZG8gZXZlcnl0aGluZyBhbmQgZW5hYmxlcyB2aWV3LW9ubHkgY2xpZW50cyB0bwotICAgbW92ZSB0aGUgbW91c2UuCi0KLSAgIFRoZXNlIHNldHRpbmdzIGNhbiBhbHNvIGJlIGFwcGxpZWQgb24gYSBwZXItdmlld2VyIGJhc2lzIHZpYSB0aGUKLSAgIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSBvciB0aGUgR1VJLiBFLmcuIHgxMXZuYyAtUiBpbnB1dDpob3N0bmFtZTpNCi0KLQotICAgUS00NjogQ2FuIEkgcHJvbXB0IHRoZSB1c2VyIGF0IHRoZSBsb2NhbCBYIGRpc3BsYXkgd2hldGhlciB0aGUKLSAgIGluY29taW5nIFZOQyBjbGllbnQgc2hvdWxkIGJlIGFjY2VwdGVkIG9yIG5vdD8gQ2FuIEkgZGVjaWRlIHRvIG1ha2UKLSAgIHNvbWUgY2xpZW50cyB2aWV3LW9ubHk/IEhvdyBhYm91dCBydW5uaW5nIGFuIGFyYml0cmFyeSBwcm9ncmFtIHRvIG1ha2UKLSAgIHRoZSBkZWNpc2lvbnM/Ci0KLSAgIFllcywgbG9vayBhdCB0aGUgIi1hY2NlcHQgY29tbWFuZCIgb3B0aW9uLCBpdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KLSAgIGV4dGVybmFsIGNvbW1hbmQgdGhhdCBpcyBydW4gZm9yIGVhY2ggbmV3IGNsaWVudC4gKHVzZSBxdW90ZXMgYXJvdW5kCi0gICB0aGUgY29tbWFuZCBpZiBpdCBjb250YWlucyBzcGFjZXMsIGV0Yy4pIElmIHRoZSBleHRlcm5hbCBjb21tYW5kCi0gICByZXR1cm5zIDAgKHN1Y2Nlc3MpIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQsIG90aGVyd2lzZSB3aXRoIGFueSBvdGhlcgotICAgcmV0dXJuIGNvZGUgdGhlIGNsaWVudCBpcyByZWplY3RlZC4gU2VlIGJlbG93IGhvdyB0byBhbHNvIGFjY2VwdAotICAgY2xpZW50cyB2aWV3LW9ubHkuCi0KLSAgIFRoZSBleHRlcm5hbCBjb21tYW5kIHdpbGwgaGF2ZSB0aGUgUkZCX0NMSUVOVF9JUCBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgc2V0IHRvIHRoZSBjbGllbnQncyBudW1lcmljYWwgSVAgYWRkcmVzcywgUkZCX0NMSUVOVF9QT1JUIGl0cyBwb3J0Ci0gICBudW1iZXIuIFNpbWlsYXJseSBmb3IgUkZCX1NFUlZFUl9JUCBhbmQgUkZCX1NFUlZFUl9QT1JUIHRvIGFsbG93Ci0gICBpZGVudGlmaWNhdGlvbiBvZiB0aGUgdGNwIHZpcnR1YWwgY2lyY3VpdC4gRElTUExBWSB3aWxsIGJlIHNldCB0byB0aGF0Ci0gICBvZiB0aGUgWDExIGRpc3BsYXkgYmVpbmcgcG9sbGVkLiBBbHNvLCBSRkJfWDExVk5DX1BJRCBpcyBzZXQgdG8gdGhlCi0gICB4MTF2bmMgcHJvY2VzcyBpZCAoZS5nLiBpbiBjYXNlIHlvdSBkZWNpZGVkIHRvIGtpbGwgaXQpLCBSRkJfQ0xJRU5UX0lECi0gICB3aWxsIGJlIGFuIGlkIG51bWJlciwgYW5kIFJGQl9DTElFTlRfQ09VTlQgdGhlIG51bWJlciBvZiBvdGhlciBjbGllbnRzCi0gICBjdXJyZW50bHkgY29ubmVjdGVkLiBSRkJfTU9ERSB3aWxsIGJlICJhY2NlcHQiLgotCi0gICBCdWlsdC1pbiBQb3B1cCBXaW5kb3c6IEFzIGEgc3BlY2lhbCBjYXNlLCAiLWFjY2VwdCBwb3B1cCIgd2lsbAotICAgaW5zdHJ1Y3QgeDExdm5jIHRvIGNyZWF0ZSBpdHMgb3duIHNpbXBsZSBwb3B1cCB3aW5kb3cuIFRvIGFjY2VwdCB0aGUKLSAgIGNsaWVudCBwcmVzcyAieSIgb3IgY2xpY2sgbW91c2Ugb24gdGhlICJZZXMiIGJ1dHRvbi4gVG8gcmVqZWN0IHRoZQotICAgY2xpZW50IHByZXNzICJuIiBvciBjbGljayBtb3VzZSBvbiB0aGUgIk5vIiBidXR0b24uIFRvIGFjY2VwdCB0aGUKLSAgIGNsaWVudCBWaWV3LW9ubHksIHByZXNzICJ2IiBvciBjbGljayBtb3VzZSBvbiB0aGUgIlZpZXciIGJ1dHRvbi4gSWYKLSAgIHRoZSAtdmlld29ubHkgb3B0aW9uIGhhcyBiZWVuIHN1cHBsaWVkLCB0aGUgIlZpZXciIGFjdGlvbiB3aWxsIG5vdCBiZQotICAgcHJlc2VudDogdGhlIHdob2xlIGRpc3BsYXkgaXMgdmlldyBvbmx5IGluIHRoYXQgY2FzZS4KLQotICAgVGhlIHBvcHVwIHdpbmRvdyB0aW1lcyBvdXQgYWZ0ZXIgMTIwIHNlY29uZHMsIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW9yCi0gICB1c2UgIi1hY2NlcHQgcG9wdXA6TiIgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgKHVzZSAwIGZvciBubwotICAgdGltZW91dC4pIE1vcmUgdHJpY2tzOiAiLWFjY2VwdCBwb3B1cG1vdXNlIiB3aWxsIG9ubHkgdGFrZSBtb3VzZSBjbGljawotICAgcmVzcG9uc2VzLCB3aGlsZSAiLWFjY2VwdCBwb3B1cGtleSIgd2lsbCBvbmx5IHRha2Uga2V5c3Ryb2tlIHJlc3BvbnNlcwotICAgKHBvcHVwIHRha2VzIGJvdGguKSBBZnRlciBhbnkgb2YgdGhlIDMgcG9wdXAga2V5d29yZHMgeW91IGNhbiBzdXBwbHkgYQotICAgcG9zaXRpb24gb2YgdGhlIHdpbmRvdzogK04rTSwgKHRoZSBkZWZhdWx0IGlzIHRvIGNlbnRlciB0aGUgd2luZG93KQotICAgZS5nLiAtYWNjZXB0IHBvcHVwbW91c2UrMTArMTAuCi0KLSAgIEFsc28gYXMgYSBzcGVjaWFsIGNhc2UgIi1hY2NlcHQgeG1lc3NhZ2UiIHdpbGwgcnVuIHRoZSB4bWVzc2FnZSgxKQotICAgcHJvZ3JhbSB0byBwcm9tcHQgdGhlIHVzZXIgd2hldGhlciB0aGUgY2xpZW50IHNob3VsZCBiZSBhY2NlcHRlZCBvcgotICAgbm90LiBUaGlzIHJlcXVpcmVzIHRoYXQgeW91IGhhdmUgeG1lc3NhZ2UgaW5zdGFsbGVkIGFuZCBhdmFpbGFibGUgdmlhCi0gICBQQVRILiBJbiBjYXNlIGl0IGlzIG5vdCBhbHJlYWR5IG9uIHlvdXIgc3lzdGVtLCB0aGUgeG1lc3NhZ2UgcHJvZ3JhbQotICAgaXMgYXZhaWxhYmxlIGF0IGZ0cDovL2Z0cC54Lm9yZy8KLSAgIChFbmQgb2YgQnVpbHQtaW4gUG9wdXAgV2luZG93OikKLQotICAgVG8gaW5jbHVkZSB2aWV3LW9ubHkgZGVjaXNpb25zIGZvciB0aGUgZXh0ZXJuYWwgY29tbWFuZHMsIHByZWZpeCB0aGUKLSAgIGNvbW1hbmQgc29tZXRoaW5nIGxpa2UgdGhpczogInllczowLG5vOiosdmlldzozIG15Y29tbWFuZCAuLi4iIFRoaXMKLSAgIGFzc29jaWF0ZXMgdGhlIHRocmVlIGFjdGlvbnM6IHllcyhhY2NlcHQpLCBubyhyZWplY3QpLCBhbmQKLSAgIHZpZXcoYWNjZXB0LXZpZXctb25seSksIHdpdGggdGhlIG51bWVyaWNhbCByZXR1cm4gKGkuZS4gZXhpdCgpKSBjb2Rlcy4KLSAgIFVzZSAiKiIgaW5zdGVhZCBvZiBhIG51bWJlciB0byBzZXQgdGhlIGRlZmF1bHQgYWN0aW9uIChlLmcuIGluIGNhc2UKLSAgIHRoZSBleHRlcm5hbCBjb21tYW5kIHJldHVybnMgYW4gdW5leHBlY3RlZCByZXR1cm4gY29kZS4pCi0KLSAgIEhlcmUgaXMgYW4gZXhhbXBsZSAtYWNjZXB0IHNjcmlwdCBjYWxsZWQgYWNjZXB0X29yX2xvY2suIEl0IHVzZXMKLSAgIHhtZXNzYWdlIGFuZCB4bG9jayAocmVwbGFjZSB3aXRoIHlvdXIgc2NyZWVuIGxvY2sgY29tbWFuZCwgbWF5YmUgaXQgaXMKLSAgICJ4c2NyZWVuc2F2ZXItY29tbWFuZCAtbG9jayIsIG9yIGtkZXNrdG9wX2xvY2ssIG9yICJkdGFjdGlvbgotICAgTG9ja0Rpc3BsYXkiLikgSXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgYXQgdGhlIFggZGlzcGxheSB3aGV0aGVyIHRvCi0gICBhY2NlcHQsIHJlamVjdCwgb3IgYWNjZXB0IHZpZXctb25seSB0aGUgY2xpZW50LCBidXQgaWYgdGhlIHByb21wdAotICAgdGltZXMgb3V0IGFmdGVyIDYwIHNlY29uZHMgdGhlIHNjcmVlbiBpcyBsb2NrZWQgYW5kIHRoZSBWTkMgY2xpZW50IGlzCi0gICBhY2NlcHRlZC4gVGhpcyBhbGxvd3MgdGhlIHJlbW90ZSBhY2Nlc3Mgd2hlbiBubyBvbmUgaXMgYXQgdGhlIGRpc3BsYXkuCi0jIS9iaW4vc2gKLSMKLSMgYWNjZXB0X29yX2xvY2s6IHByb21wdCB1c2VyIGF0IFggZGlzcGxheSB3aGV0aGVyIHRvIGFjY2VwdCBhbiBpbmNvbWluZwotIyAgICAgICAgICAgICAgICAgVk5DIGNvbm5lY3Rpb24uICBJZiB0aW1lb3V0IGV4cGlyZXMsIHNjcmVlbiBpcyBsb2NrZWQKLSMgICAgICAgICAgICAgICAgIGFuZCB0aGUgVk5DIHZpZXdlciBpcyBhY2NlcHRlZCAoYWxsb3dzIHJlbW90ZSBhY2Nlc3MKLSMgICAgICAgICAgICAgICAgIHdoZW4gbm8gb25lIGlzIHNpdHRpbmcgYXQgdGhlIGRpc3BsYXkuKQotIwotIyB1c2FnZTogeDExdm5jIC4uLiAtZm9yZXZlciAtYWNjZXB0ICd5ZXM6MCxubzoqLHZpZXc6NCBhY2NlcHRfb3JfbG9jaycKLSMKLXhtZXNzYWdlIC1idXR0b25zIHllczoyLG5vOjMsdmlldy1vbmx5OjQgLWNlbnRlciBcCi0gICAgICAgICAtdGltZW91dCA2MCAieDExdm5jOiBhY2NlcHQgY29ubmVjdGlvbiBmcm9tICRSRkJfQ0xJRU5UX0lQPyIKLXJjPSQ/Ci1pZiBbICRyYyA9IDAgXTsgdGhlbgotICAgICAgICB4bG9jayAmICMgb3IgInhsb2NrIC1tb2RlIGJsYW5rIiBmb3Igbm8gYW5pbWF0aW9ucy4KLSAgICAgICAgc2xlZXAgNQotICAgICAgICBleGl0IDAKLWVsaWYgWyAkcmMgPSAyIF07IHRoZW4KLSAgICAgICAgZXhpdCAwCi1lbGlmIFsgJHJjID0gNCBdOyB0aGVuCi0gICAgICAgIGV4aXQgNAotZmkKLWV4aXQgMQotCi0gICBTdGVmYW4gUmFkbWFuIGhhcyB3cml0dGVuIGEgbmljZSBkdGtzaCBzY3JpcHQgZHRWbmNQb3B1cCBmb3IgdXNlIGluCi0gICBDREUgZW52aXJvbm1lbnRzIHRvIGRvIHRoZSBzYW1lIHNvcnQgb2YgdGhpbmcuIEluZm9ybWF0aW9uIG9uIGhvdyB0bwotICAgdXNlIGl0IGlzIGZvdW5kIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuIEhlIGVuY291cmFnZXMgeW91IHRvIHByb3ZpZGUKLSAgIGZlZWRiYWNrIHRvIGhpbSB0byBoZWxwIGltcHJvdmUgdGhlIHNjcmlwdC4KLQotICAgTm90ZSB0aGF0IGluIGFsbCBjYXNlcyB4MTF2bmMgd2lsbCBibG9jayB3aGlsZSB0aGUgZXh0ZXJuYWwgY29tbWFuZCBvcgotICAgcG9wdXAgaXMgYmVpbmcgcnVuLCBzbyBhdHRhY2hlZCBjbGllbnRzIHdpbGwgbm90IHJlY2VpdmUgc2NyZWVuCi0gICB1cGRhdGVzLCBldGMgZHVyaW5nIHRoaXMgcGVyaW9kLgotCi0gICBUbyBydW4gYSBjb21tYW5kIHdoZW4gYSBjbGllbnQgZGlzY29ubmVjdHMsIHVzZSB0aGUgIi1nb25lIGNvbW1hbmQiCi0gICBvcHRpb24uIFRoaXMgaXMgZm9yIHRoZSB1c2VyJ3MgY29udmVuaWVuY2Ugb25seTogdGhlIHJldHVybiBjb2RlIG9mCi0gICB0aGUgY29tbWFuZCBpcyBub3QgaW50ZXJwcmV0ZWQgYnkgeDExdm5jLiBUaGUgc2FtZSBlbnZpcm9ubWVudAotICAgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gIi1hY2NlcHQgY29tbWFuZCIgKGV4Y2VwdCB0aGF0IFJGQl9NT0RFIHdpbGwKLSAgIGJlICJnb25lIi4pCi0KLSAgIEFzIG9mIEphbi8yMDA2IHRoZSAiLWFmdGVyYWNjZXB0IGNvbW1hbmQiIG9wdGlvbiB3aWxsIHJ1biB0aGUgY29tbWFuZAotICAgb25seSBhZnRlciB0aGUgVk5DIGNsaWVudCBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgYXV0aGVudGljYXRlZC4gTGlrZQotICAgLWdvbmUgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBpbnRlcnByZXRlZC4gUkZCX01PREUgd2lsbCBiZQotICAgImFmdGVyYWNjZXB0Ii4pCi0KLQotICAgUS00NzogSSBzdGFydCB4MTF2bmMgYXMgcm9vdCBiZWNhdXNlIGl0IGlzIGxhdW5jaGVkIHZpYSBpbmV0ZCg4KSBvciBhCi0gICBkaXNwbGF5IG1hbmFnZXIgbGlrZSBnZG0oMSkuIENhbiBJIGhhdmUgeDExdm5jIGxhdGVyIHN3aXRjaCB0byBhCi0gICBkaWZmZXJlbnQgdXNlcj8KLQotICAgQXMgb2YgRmViLzIwMDUgeDExdm5jIGhhcyB0aGUgLXVzZXJzIG9wdGlvbiB0aGF0IGFsbG93cyB0aGluZ3MgbGlrZQotICAgdGhpcy4gUGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb24gaXQgKGFsc28gaW4gdGhlIHgxMXZuYyAtaGVscAotICAgb3V0cHV0KSBjYXJlZnVsbHkgZm9yIGZlYXR1cmVzIGFuZCBjYXZlYXRzLiBJdCdzIHVzZSBjYW4gb2Z0ZW4KLSAgIGRlY3JlYXNlIHNlY3VyaXR5IHVubGVzcyBjYXJlIGlzIHRha2VuLgotCi0gICBCVFcsIGEgbmljZSB1c2Ugb2YgaXQgaXMgIi11c2VycyArbm9ib2R5IiB0aGF0IHN3aXRjaGVzIHRvIHRoZSBVbml4Ci0gICB1c2VyIG5vYm9keSByaWdodCBhZnRlciBjb25uZWN0aW9ucyB0byB0aGUgWCBkaXNwbGF5IGFyZSBlc3RhYmxpc2hlZC4KLQotICAgSW4gYW55IGV2ZW50LCB3aGlsZSBydW5uaW5nIHgxMXZuYyBhcyByb290LCByZW1lbWJlciBpdCBjb21lcyB3aXRoIG5vCi0gICB3YXJyYW50eSA7LSkuCi0KLQotICAgUS00ODogSSB1c2UgYSBzY3JlZW4tbG9jayB3aGVuIEkgbGVhdmUgbXkgd29ya3N0YXRpb24gKGUuZy4KLSAgIHhzY3JlZW5zYXZlciBvciB4bG9jay4pIFdoZW4gSSByZW1vdGVseSBhY2Nlc3MgbXkgd29ya3N0YXRpb24gZGVza3RvcAotICAgdmlhIHgxMXZuYyBJIGNhbiB1bmxvY2sgdGhlIGRlc2t0b3AgZmluZSwgYnV0IEkgYW0gd29ycmllZCBwZW9wbGUgd2lsbAotICAgc2VlIG15IGFjdGl2aXRpZXMgb24gdGhlIHBoeXNpY2FsIG1vbml0b3IuIFdoYXQgY2FuIEkgZG8gdG8gcHJldmVudAotICAgdGhpcywgb3IgYXQgbGVhc3QgbWFrZSBpdCBtb3JlIGRpZmZpY3VsdD8KLQotICAgUHJvYmFibHkgbW9zdCB3b3JrIGVudmlyb25tZW50cyB3b3VsZCByZXNwZWN0IHlvdXIgcHJpdmFjeSBpZiB5b3UKLSAgIHBvd2VyZWQgb2ZmIHRoZSBtb25pdG9yLiBBbHNvIHJlbWVtYmVyIGlmIHBlb3BsZSBoYXZlIHBoeXNpY2FsIGFjY2VzcwotICAgdG8geW91ciB3b3Jrc3RhdGlvbiB0aGV5IGJhc2ljYWxseSBjYW4gZG8gYW55dGhpbmcgdGhleSB3YW50IHdpdGggaXQKLSAgIChlLmcuIGluc3RhbGwgYSBiYWNrZG9vciBmb3IgbGF0ZXIgdXNlLCBldGMuKQotCi0gICBJbiBhbnkgZXZlbnQsIGFzIG9mIEp1bi8yMDA0IHRoZXJlIGlzIGFuIGV4cGVyaW1lbnRhbCB1dGlsaXR5IHRvIG1ha2UKLSAgIGl0IG1vcmUgZGlmZmljdWx0IGZvciBub3NleSBwZW9wbGUgdG8gc2VlIHlvdXIgeDExdm5jIGFjdGl2aXRpZXMuIFRoZQotICAgc291cmNlIGZvciBpdCBpcyBibG9ja2RweS5jIFRoZSBpZGVhIGJlaGluZCBpdCBpcyBzaW1wbGUgKGJ1dAotICAgb2J2aW91c2x5IG5vdCBidWxsZXRwcm9vZik6IHdoZW4gYSBWTkMgY2xpZW50IGF0dGFjaGVzIHRvIHgxMXZuYyBwdXQKLSAgIHRoZSBkaXNwbGF5IG1vbml0b3IgaW4gdGhlIERQTVMgIm9mZiIgc3RhdGUsIGlmIHRoZSBEUE1TIHN0YXRlIGV2ZXIKLSAgIGNoYW5nZXMgaW1tZWRpYXRlbHkgc3RhcnQgdXAgdGhlIHNjcmVlbi1sb2NrIHByb2dyYW0uIFRoZSB4MTF2bmMgdXNlcgotICAgd2lsbCBub3RpY2Ugc29tZXRoaW5nIGlzIGhhcHBlbmluZyBhbmQgdGhpbmsgYWJvdXQgd2hhdCB0byBkbyBuZXh0Ci0gICAod2hpbGUgdGhlIHNjcmVlbiBpcyBpbiBhIGxvY2tlZCBzdGF0ZS4pCi0KLSAgIFRoaXMgd29ya3MgKG9yIGF0IGxlYXN0IGhhcyBhIGNoYW5jZSBvZiB3b3JraW5nKSBiZWNhdXNlIGlmIHRoZQotICAgaW50cnVkZXIgbW92ZXMgdGhlIG1vdXNlIG9yIHByZXNzZXMgYSBrZXkgb24gdGhlIGtleWJvYXJkLCB0aGUgbW9uaXRvcgotICAgd2FrZXMgdXAgb3V0IG9mIHRoZSBEUE1TIG9mZiBzdGF0ZSwgYW5kIHRoaXMgaW5kdWNlcyB0aGUgc2NyZWVuIGxvY2sKLSAgIHByb2dyYW0gdG8gYWN0aXZhdGUgYXMgc29vbiBhcyBwb3NzaWJsZS4gT2YgY291cnNlIHRoZXJlIGFyZSBjcmFja3MgaW4KLSAgIHRoaXMsIHRoZSBlYXZlc2Ryb3BwZXIgY291bGQgZGV0YWNoIHlvdXIgbW9uaXRvciBhbmQgaW5zZXJ0IGEgbm9uLURQTVMKLSAgIG9uZSwgYW5kIHRoZXJlIGFyZSByYWNlIGNvbmRpdGlvbnMuIEFzIG1lbnRpb25lZCBhYm92ZSB0aGlzIGlzIG5vdAotICAgYnVsbGV0cHJvb2YuIEEgcmVhbGx5IHJvYnVzdCBzb2x1dGlvbiB3b3VsZCBsaWtlbHkgcmVxdWlyZSBYIHNlcnZlcgotICAgYW5kIHBlcmhhcHMgZXZlbiB2aWRlbyBoYXJkd2FyZSBzdXBwb3J0LgotCi0gICBUaGUgYmxvY2tkcHkgdXRpbGl0eSBpcyBsYXVuY2hlZCBieSB0aGUgLWFjY2VwdCBvcHRpb24gYW5kIHRvbGQgdG8KLSAgIGV4aXQgdmlhIHRoZSAtZ29uZSBvcHRpb24gKHRoZSB2bmMgY2xpZW50IHVzZXIgc2hvdWxkIG9idmlvdXNseQotICAgcmUtbG9jayB0aGUgc2NyZWVuIGJlZm9yZSBkaXNjb25uZWN0aW5nISkgSW5zdHJ1Y3Rpb25zIGNhbiBiZSBmb3VuZCBpbgotICAgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdXRpbGl0eSBhdCB0aGUgYWJvdmUgbGluay4gUm91Z2hseSBpdCBpcwotICAgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAgeDExdm5jIC4uLiAtYWNjZXB0ICJibG9ja2RweSAtYmcgLWYgJEhPTUUvLmJkcHkiIC1nb25lICJ0b3VjaCAkSE9NRS8uYmRweSIKLQotICAgYnV0IHBsZWFzZSByZWFkIHRoZSB0b3Agb2YgdGhlIGZpbGUuCi0KLSAgIFVwZGF0ZTogQXMgb2YgRmViLzIwMDcgdGhlcmUgaXMgc29tZSBidWlsdGluIHN1cHBvcnQgZm9yIHRoaXM6Ci0gICAtZm9yY2VkcG1zIGFuZCAtY2xpZW50ZHBtcyBob3dldmVyLCB0aGV5IGFyZSBwcm9iYWJseSBsZXNzIHJvYnVzdCB0aGFuCi0gICB0aGUgYWJvdmUgYmxvY2tkcHkuYyBzY2hlbWUsIHNpbmNlIGlmIHRoZSBwZXJzb24gZmxvb2RzIHRoZSBwaHlzaWNhbAotICAgbWFjaGluZSB3aXRoIG1vdXNlIG9yIHBvaW50ZXIgaW5wdXQgaGUgY2FuIHVzdWFsbHkgc2VlIGZsYXNoZXMgb2YgdGhlCi0gICBzY3JlZW4gYmVmb3JlIHRoZSBtb25pdG9yIGlzIHBvd2VyZWQgb2ZmIGFnYWluLiBTZWUgYWxzbyB0aGUgLWdyYWJrYmQsCi0gICAtZ3JhYnB0ciwgYW5kIC1ncmFiYWx3YXlzIG9wdGlvbnMuCi0KLQotICAgUS00OTogQ2FuIEkgaGF2ZSB4MTF2bmMgYXV0b21hdGljYWxseSBsb2NrIHRoZSBzY3JlZW4gd2hlbiBJCi0gICBkaXNjb25uZWN0IHRoZSBWTkMgdmlld2VyPwotCi0gICBZZXMsIGEgdXNlciBtZW50aW9ucyBoZSB1c2VzIHRoZSAtZ29uZSBvcHRpb24gdW5kZXIgQ0RFIHRvIHJ1biBhCi0gICBzY3JlZW4gbG9jayBwcm9ncmFtOgotICB4MTF2bmMgLWRpc3BsYXkgOjAgLWZvcmV2ZXIgLWdvbmUgJ2R0YWN0aW9uIExvY2tEaXNwbGF5JwotCi0gICBPdGhlciBwb3NzaWJpbGl0aWVzIGFyZToKLSAgeDExdm5jIC1kaXNwbGF5IDowIC1mb3JldmVyIC1nb25lICd4c2NyZWVuc2F2ZXItY29tbWFuZCAtbG9jaycKLSAgeDExdm5jIC1kaXNwbGF5IDowIC1mb3JldmVyIC1nb25lICdrZGVza3RvcF9sb2NrJwotICB4MTF2bmMgLWRpc3BsYXkgOjAgLWZvcmV2ZXIgLWdvbmUgJ3hsb2NrICYnCi0gIHgxMXZuYyAtZGlzcGxheSA6MCAtZm9yZXZlciAtZ29uZSAneGxvY2sgLW1vZGUgYmxhbmsgJicKLQotICAgSGVyZSBpcyBhIHNjaGVtZSB1c2luZyB0aGUgLWFmdGVyYWNjZXB0IG9wdGlvbiAoaW4gdmVyc2lvbiAwLjgpIHRvCi0gICB1bmxvY2sgdGhlIHNjcmVlbiBhZnRlciB0aGUgZmlyc3QgdmFsaWQgVk5DIGxvZ2luIGFuZCB0byBsb2NrIHRoZQotICAgc2NyZWVuIGFmdGVyIHRoZSBsYXN0IHZhbGlkIFZOQyBsb2dpbiBkaXNjb25uZWN0czoKLSAgeDExdm5jIC1kaXNwbGF5IDowIC1mb3JldmVyIC1zaGFyZWQgLWFmdGVyYWNjZXB0IC4vbXl4bG9ja2VyIC1nb25lIC4vbXl4bG9ja2UKLXIKLQotICAgV2hlcmUgdGhlIHNjcmlwdCAuL215eGxvY2tlciBpczoKLSMhL2Jpbi9zaAotCi0jL3Vzci9iaW4vZW52IHwgZ3JlcCBSRkJfIHwgc29ydCAgICAgICAgIyBmb3Igdmlld2luZyBSRkJfKiBzZXR0aW5ncy4KLQotaWYgWyAiWCRSRkJfTU9ERSIgPSAiWGFmdGVyYWNjZXB0IiBdOyB0aGVuCi0gICAgICAgIGlmIFsgIlgkUkZCX1NUQVRFIiA9ICJYTk9STUFMIiBdOyB0aGVuICAjIHJlcXVpcmUgdmFsaWQgbG9naW4KLSAgICAgICAgICAgICAgICBpZiBbICJYJFJGQl9DTElFTlRfQ09VTlQiID0gIlgxIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBraWxsYWxsIHhsb2NrICAgIyBMaW51eCBvbmx5LgotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi1lbGlmIFsgIlgkUkZCX01PREUiID0gIlhnb25lIiBdOyB0aGVuCi0gICAgICAgIGlmIFsgIlgkUkZCX1NUQVRFIiA9ICJYTk9STUFMIiBdOyB0aGVuICAjIHJlcXVpcmUgdmFsaWQgbG9naW4KLSAgICAgICAgICAgICAgICBpZiBbICJYJFJGQl9DTElFTlRfQ09VTlQiID0gIlgwIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICB4bG9jayAtbW9kZSBibGFuayAmCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLWZpCi0KLSAgIE5vdGUgdGhlIHhsb2NrIG9wdGlvbiAiLW1vZGUgYmxhbmsiIHRvIGF2b2lkIGFuaW1hdGlvbnMuCi0KLSAgIFRoZXJlIGlzIGEgcHJvYmxlbSBpZiB5b3UgaGF2ZSB4MTF2bmMgcnVubmluZyB0aGlzIHdheSBpbiAtZm9yZXZlcgotICAgbW9kZSBhbmQgeW91IGhpdCBDdHJsLUMgdG8gc3RvcCBpdC4gVGhlIHhsb2NrIChvciBvdGhlciBwcm9ncmFtKSB3aWxsCi0gICBnZXQga2lsbGVkIHRvby4gVG8gd29yayBhcm91bmQgdGhpcyBtYWtlIGEgbGl0dGxlIHNjcmlwdCBjYWxsZWQKLSAgIHNldHBncnAgdGhhdCBsb29rcyBsaWtlOgotIyEvdXNyL2Jpbi9wZXJsCi1zZXRwZ3JwKDAsIDApOwotZXhlYyBAQVJHVjsKLQotICAgdGhlbiB1c2UgLWdvbmUgInNldHBncnAgeGxvY2sgJiIsIGV0Yy4KLSAgIFtFbmNyeXB0ZWQgQ29ubmVjdGlvbnNdCi0KLSAgIFEtNTA6IEhvdyBjYW4gSSB0dW5uZWwgbXkgY29ubmVjdGlvbiB0byB4MTF2bmMgdmlhIGFuIGVuY3J5cHRlZCBTU0gKLSAgIGNoYW5uZWwgYmV0d2VlbiB0d28gVW5peCBtYWNoaW5lcz8KLQotICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBlYXJsaWVyIG9uIHRoaXMgcGFnZSBvbiBob3cgdG8gdHVubmVsIFZOQyB2aWEgU1NICi0gICBmcm9tIFVuaXggdG8gVW5peC4gQSBudW1iZXIgb2Ygd2F5cyBhcmUgZGVzY3JpYmVkIGFsb25nIHdpdGggc29tZQotICAgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgotCi0gICBPdGhlciBzZWN1cmUgZW5jcnlwdGVkIG1ldGhvZHMgZXhpc3RzLCBlLmcuIHN0dW5uZWwsIElQU0VDLCB2YXJpb3VzCi0gICBWUE5zLCBldGMuCi0KLSAgIFNlZSBhbHNvIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBwYWdlIHdoZXJlIG11Y2ggb2YgdGhpcwotICAgaXMgbm93IGF1dG9tYXRlZC4KLQotCi0gICBRLTUxOiBIb3cgY2FuIEkgdHVubmVsIG15IGNvbm5lY3Rpb24gdG8geDExdm5jIHZpYSBhbiBlbmNyeXB0ZWQgU1NICi0gICBjaGFubmVsIGZyb20gV2luZG93cyB1c2luZyBhbiBTU0ggY2xpZW50IGxpa2UgUHV0dHk/Ci0KLSAgIEFib3ZlIHdlIGRlc2NyaWJlZCBob3cgdG8gdHVubmVsIFZOQyB2aWEgU1NIIGZyb20gVW5peCB0byBVbml4LCB5b3UKLSAgIG1heSB3YW50IHRvIHJldmlldyBpdC4gVG8gZG8gdGhpcyBmcm9tIFdpbmRvd3MgdXNpbmcgUHV0dHkgaXQgd291bGQgZ28KLSAgIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICAgICogSW4gdGhlIFB1dHR5IGRpYWxvZyB3aW5kb3cgdW5kZXIgJ1Nlc3Npb24nIGVudGVyIHRoZSBob3N0bmFtZSBvcgotICAgICAgIElQIG51bWJlciBvZiB0aGUgVW5peCBtYWNoaW5lIHdpdGggZGlzcGxheSB0byBiZSB2aWV3ZWQuCi0gICAgICogTWFrZSBzdXJlIHRoZSBTU0ggcHJvdG9jb2wgaXMgc2VsZWN0ZWQgYW5kIHRoZSBzZXJ2ZXIgcG9ydCBpcwotICAgICAgIGNvcnJlY3QuCi0gICAgICogVW5kZXIgJ0Nvbm5lY3Rpb25zL1NTSC9UdW5uZWxzJyBBZGQgYSBMb2NhbCBjb25uZWN0aW9uIHdpdGgKLSAgICAgICAnU291cmNlIHBvcnQ6ICA1OTAwJyBhbmQgJ0Rlc3RpbmF0aW9uOiAgbG9jYWxob3N0OjU5MDAnCi0gICAgICogTG9nIGludG8gdGhlIHJlbW90ZSBtYWNoaW5lIGJ5IHByZXNzaW5nICdPcGVuJyBhbmQgc3VwcGx5aW5nCi0gICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkLCBldGMuCi0gICAgICogSW4gdGhhdCBTU0ggc2hlbGwsIHN0YXJ0IHVwIHgxMXZuYyBieSB0eXBpbmcgdGhlIGNvbW1hbmQ6IHgxMXZuYwotICAgICAgIC1kaXNwbGF5IDowIHBsdXMgYW55IG90aGVyIGRlc2lyZWQgb3B0aW9ucyAoZS5nLiAtbG9jYWxob3N0LikKLSAgICAgKiBGaW5hbGx5LCBzdGFydCB1cCB5b3VyIFZOQyBWaWV3ZXIgaW4gV2luZG93cyBhbmQgZW50ZXIKLSAgICAgICAnbG9jYWxob3N0OjAnIGFzIHRoZSBWTkMgc2VydmVyLgotCi0gICBZb3UgY2FuIGtlZXAgYWxsIG9mIHRoZSBzZXR0aW5ncyBpbiBhIFB1dHR5ICdTYXZlZCBTZXNzaW9uJy4gQWxzbywKLSAgIG9uY2UgZXZlcnl0aGluZyBpcyB3b3JraW5nLCB5b3UgY2FuIGNvbnNpZGVyIHB1dHRpbmcgeDExdm5jIC1kaXNwbGF5Ci0gICA6MCAocGx1cyBvdGhlciBjbWRsaW5lIG9wdGlvbnMpIGluIHRoZSAnUmVtb3RlIGNvbW1hbmQnIFB1dHR5IHNldHRpbmcKLSAgIHVuZGVyICdDb25uZWN0aW9ucy9TU0gnLgotCi0gICBTZWUgYWxzbyB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFnZSB3aGVyZSBtdWNoIG9mIHRoaXMKLSAgIGlzIG5vdyBhdXRvbWF0ZWQgdmlhIHRoZSBQdXR0eSBwbGluayB1dGlsaXR5LgotCi0gICBGb3IgZXh0cmEgcHJvdGVjdGlvbiBmZWVsIGZyZWUgdG8gcnVuIHgxMXZuYyB3aXRoIHRoZSAtbG9jYWxob3N0IGFuZAotICAgLXJmYmF1dGgvLXBhc3N3ZGZpbGUgb3B0aW9ucy4KLQotICAgSWYgdGhlIG1hY2hpbmUgeW91IFNTSCBpbnRvIHZpYSBQdXR0eSBpcyBub3QgdGhlIHNhbWUgbWFjaGluZSB3aXRoIHRoZQotICAgWCBkaXNwbGF5IHlvdSB3aXNoIHRvIHZpZXcgKGUuZy4geW91ciBjb21wYW55IHByb3ZpZGVzIGluY29taW5nIFNTSAotICAgYWNjZXNzIHRvIGEgZ2F0ZXdheSBtYWNoaW5lKSwgdGhlbiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGFib3ZlIFB1dHR5Ci0gICBkaWFsb2cgc2V0dGluZyB0bzogJ0Rlc3RpbmF0aW9uOiBvdGhlcmhvc3Q6NTkwMCcsIE9uY2UgbG9nZ2VkIGluLAotICAgeW91J2xsIG5lZWQgdG8gZG8gYSBzZWNvbmQgbG9naW4gKHNzaCBvciByc2gpIHRvIHRoZSB3b3Jrc3RhdGlvbgotICAgbWFjaGluZSAnb3RoZXJob3N0JyBhbmQgdGhlbiBzdGFydCB1cCB4MTF2bmMgb24gaXQuIFRoaXMgY2FuIGFsc28gYmUKLSAgIGF1dG9tYXRlZCBieSBDaGFpbmluZyBTU0gncy4KLQotICAgQXMgZGlzY3Vzc2VkIGFib3ZlIGFub3RoZXIgb3B0aW9uIGlzIHRvIGZpcnN0IHN0YXJ0IHRoZSBWTkMgdmlld2VyIGluCi0gICAibGlzdGVuIiBtb2RlLCBhbmQgdGhlbiBsYXVuY2ggeDExdm5jIHdpdGggdGhlICItY29ubmVjdCBsb2NhbGhvc3QiCi0gICBvcHRpb24gdG8gZXN0YWJsaXNoIHRoZSByZXZlcnNlIGNvbm5lY3Rpb24uIEluIHRoaXMgY2FzZSBhIFJlbW90ZSBwb3J0Ci0gICByZWRpcmVjdGlvbiAobm90IExvY2FsKSBpcyBuZWVkZWQgZm9yIHBvcnQgNTUwMCBpbnN0ZWFkIG9mIDU5MDAgKGkuZS4KLSAgICdTb3VyY2UgcG9ydDogIDU1MDAnIGFuZCAnRGVzdGluYXRpb246ICBsb2NhbGhvc3Q6NTUwMCcgZm9yIGEgUmVtb3RlCi0gICBjb25uZWN0aW9uLikKLQotCi0gICBRLTUyOiBIb3cgY2FuIEkgdHVubmVsIG15IGNvbm5lY3Rpb24gdG8geDExdm5jIHZpYSBhbiBlbmNyeXB0ZWQgU1NMCi0gICBjaGFubmVsIHVzaW5nIGFuIGV4dGVybmFsIHRvb2wgbGlrZSBzdHVubmVsPwotCi0gICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSAibGlnaHRlciB3ZWlnaHQiIGVuY3J5cHRpb24gc2V0dXAgdGhhbiBTU0ggb3IKLSAgIElQU0VDLiBTU0wgdHVubmVscyBzdWNoIGFzIHN0dW5uZWwgKGFsc28gc3R1bm5lbC5vcmcpIHByb3ZpZGUgYW4KLSAgIGVuY3J5cHRlZCBjaGFubmVsIHdpdGhvdXQgdGhlIG5lZWQgZm9yIFVuaXggdXNlcnMsIHBhc3N3b3JkcywgYW5kIGtleQotICAgcGFzc3BocmFzZXMgcmVxdWlyZWQgZm9yIHNzaCAoYW5kIGF0IHRoZSBvdGhlciBleHRyZW1lIFNTTCBjYW4gYWxzbwotICAgcHJvdmlkZSBhIGNvbXBsZXRlIHNpZ25lZCBjZXJ0aWZpY2F0ZSBjaGFpbiBvZiB0cnVzdC4pIE9uIHRoZSBvdGhlcgotICAgaGFuZCwgc2luY2UgU1NIIGlzIHVzdWFsbHkgaW5zdGFsbGVkIGV2ZXJ5d2hlcmUgYW5kIGZpcmV3YWxscyBvZnRlbgotICAgbGV0IGl0cyBwb3J0IHRocm91Z2gsIHNzaCBpcyBmcmVxdWVudGx5IHRoZSBwYXRoIG9mIGxlYXN0IHJlc2lzdGFuY2UKLSAgIChpdCBhbHNvIG5pY2VseSBtYW5hZ2VzIHB1YmxpYyBrZXlzIGZvciB5b3UuKQotCi0gICBVcGRhdGU6IEFzIG9mIEZlYi8yMDA2IHgxMXZuYyBoYXMgdGhlIG9wdGlvbnMgLXNzbCwgLXN0dW5uZWwsIGFuZAotICAgLXNzbHZlcmlmeSB0byBwcm92aWRlIGludGVncmF0ZWQgU1NMIHNjaGVtZXMuIFRoZXkgYXJlIGRpc2N1c3NlZCBpbgotICAgdGhlIE5leHQgRkFRICh5b3UgcHJvYmFibHkgd2FudCB0byBza2lwIHRvIGl0IG5vdy4pCi0KLSAgIFdlIGluY2x1ZGUgdGhlc2Ugbm9uLWJ1aWx0LWluIG1ldGhvZCBkZXNjcmlwdGlvbnMgYmVsb3cgZm9yIGhpc3RvcmljYWwKLSAgIHJlZmVyZW5jZS4gVGhleSBhcmUgaGFuZHkgYmVjYXVzZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgU1NMIHR1bm5lbHMgdG8KLSAgIGFueSBWTkMgKG9yIG90aGVyIHR5cGUgb2YpIHNlcnZlci4KLQotCi0gICBIZXJlIGFyZSBzb21lIGJhc2ljIGV4YW1wbGVzIHVzaW5nIHN0dW5uZWwgYnV0IHRoZSBnZW5lcmFsIGlkZWEgZm9yCi0gICBhbnkgU1NMIHR1bm5lbCB1dGlsaXR5IGlzIHRoZSBzYW1lOgotICAgICAqIFN0YXJ0IHVwIHgxMXZuYyBhbmQgY29uc3RyYWluIGl0IHRvIGxpc3RlbiBvbiBsb2NhbGhvc3QuCi0gICAgICogVGhlbiBzdGFydCB1cCB0aGUgU1NMIHR1bm5lbCBydW5uaW5nIG9uIHRoZSBzYW1lIG1hY2hpbmUgdG8KLSAgICAgICBmb3J3YXJkIGluY29taW5nIGNvbm5lY3Rpb25zIHRvIHRoYXQgeDExdm5jLgotICAgICAqIFNldCB1cCBhbmQgcnVuIGEgc2ltaWxhciBTU0wgdHVubmVsIGZvciB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbiBvbgotICAgICAgIHRoZSBWTkMgdmlld2VyIG1hY2hpbmUgcG9pbnRpbmcgaXQgdG8gdGhlIFNTTC94MTF2bmMgc2VydmVyLgotICAgICAqIE9wdGlvbmFsbHksIHNldCB1cCBzZXJ2ZXIgKG9yIGV2ZW4gY2xpZW50KSBwdWJsaWMvcHJpdmF0ZSBrZXlzIGZvcgotICAgICAgIHVzZSBpbiBhdXRoZW50aWNhdGluZyBvbmUgc2lkZSB0byB0aGUgb3RoZXIuCi0gICAgICogRmluYWxseSwgc3RhcnQgdGhlIFZOQyBWaWV3ZXIgYW5kIHRlbGwgaXQgdG8gY29ubmVjdCB0byB0aGUgbG9jYWwKLSAgICAgICBwb3J0IChlLmcuIGEgdm5jIGRpc3BsYXkgbG9jYWxob3N0OjApIHdoZXJlIGl0cyBvdXRnb2luZyBTU0wKLSAgICAgICB0dW5uZWwgaXMgbGlzdGVuaW5nLgotCi0gICBXZSdsbCBmaXJzdCB1c2UgdGhlIHN0dW5uZWwgdmVyc2lvbiAzIHN5bnRheCBzaW5jZSBpdCBpcyB0aGUgbW9zdAotICAgY29uY2lzZSBhbmQgVW5peHkuCi0KLSAgIFN0YXJ0IHVwIHgxMXZuYyBsaXN0ZW5pbmcgb24gcG9ydCA1OTAwOgotICB4MTF2bmMgLWRpc3BsYXkgOjAgLXJmYnBvcnQgNTkwMCAtbG9jYWxob3N0IC1iZyAtcGFzc3dkZmlsZSB+L215cGFzcwotCi0gICBUaGVuIHN0YXJ0IHN0dW5uZWwgKHZlcnNpb24gMywgbm90IDQpIHdpdGggdGhpcyBjb21tYW5kOgotICBzdHVubmVsIC1kIDU5MDEgLXIgNTkwMCAtcCAvcGF0aC90by9zdHVubmVsLnBlbQotCi0gICBUaGUgYWJvdmUgdHdvIGNvbW1hbmRzIGFyZSBydW4gb24gaG9zdCAiZmFyLWF3YXkuZWFzdCIuIFRoZQotICAgc3R1bm5lbC5wZW0gaXMgdGhlIHNlbGYtc2lnbmVkIFBFTSBmaWxlIGNlcnRpZmljYXRlIGNyZWF0ZWQgd2hlbgotICAgc3R1bm5lbCBpcyBidWlsdC4gT25lIGNhbiBhbHNvIGNyZWF0ZSBjZXJ0aWZpY2F0ZXMgc2lnbmVkIGJ5Ci0gICBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyBvciBzZWxmLXNpZ25lZCBpZiBkZXNpcmVkIHVzaW5nIHRoZSB4MTF2bmMKLSAgIHV0aWxpdGllcyBkZXNjcmliZWQgdGhlcmUuCi0KLSAgIFNTTCBWaWV3ZXJzOiAgTmV4dCwgb24gdGhlIFZOQyB2aWV3ZXIgc2lkZSB3ZSBuZWVkIGFuIFNTTCB0dW5uZWwgdG8KLSAgIGVuY3J5cHQgdGhlIG91dGdvaW5nIGNvbm5lY3Rpb24uIFRoZSBuaWNlIHRoaW5nIGlzIGFueSBTU0wgdHVubmVsIGNhbgotICAgYmUgdXNlZCBiZWNhdXNlIHRoZSBwcm90b2NvbCBpcyBhIHN0YW5kYXJkLiBGb3IgdGhpcyBleGFtcGxlIHdlJ2xsCi0gICBhbHNvIHVzZSBzdHVubmVsIG9uIHRoZSB2aWV3ZXIgc2lkZSBvbiBVbml4LiBGaXJzdCBzdGFydCB1cCB0aGUKLSAgIGNsaWVudC1zaWRlIHN0dW5uZWwgKHZlcnNpb24gMywgbm90IDQpOgotICBzdHVubmVsIC1jIC1kIGxvY2FsaG9zdDo1OTAyIC1yIGZhci1hd2F5LmVhc3Q6NTkwMQotCi0gICBUaGVuIHBvaW50IHRoZSB2aWV3ZXIgdG8gdGhlIGxvY2FsIHR1bm5lbCBvbiBwb3J0IDU5MDI6Ci0gIHZuY3ZpZXdlciAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUiIGxvY2FsaG9zdDoyCi0KLSAgIFRoYXQncyBpdC4gIE5vdGUgdGhhdCB0aGUgc3Nfdm5jdmlld2VyIHNjcmlwdCBjYW4gYXV0b21hdGUgdGhpcwotICAgZWFzaWx5LCBhbmQgc28gY2FuIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBwYWNrYWdlLgotCi0gICBCZSBzdXJlIHRvIHVzZSBhIFZOQyBwYXNzd29yZCBiZWNhdXNlIHVubGlrZSBzc2ggYnkgZGVmYXVsdCB0aGUKLSAgIGVuY3J5cHRlZCBTU0wgY2hhbm5lbCBwcm92aWRlcyBubyBhdXRoZW50aWNhdGlvbiAob25seSBwcml2YWN5LikgV2l0aAotICAgc29tZSBleHRyYSBjb25maWd1cmF0aW9uIG9uZSBjb3VsZCBhbHNvIHNldCB1cCBjZXJ0aWZpY2F0ZXMgdG8gcHJvdmlkZQotICAgYXV0aGVudGljYXRpb24gb2YgZWl0aGVyIG9yIGJvdGggc2lkZXMgYXMgd2VsbCAoYW5kIGhlbmNlIGF2b2lkCi0gICBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLikgU2VlIHRoZSBzdHVubmVsIGFuZCBvcGVuc3NsIGRvY3VtZW50YXRpb24KLSAgIGFuZCBhbHNvIHRoZSBrZXkgbWFuYWdlbWVudCBzZWN0aW9uIGZvciBkZXRhaWxzLgotCi0gICBzdHVubmVsIGhhcyBhbHNvIGJlZW4gcG9ydGVkIHRvIFdpbmRvd3MsIGFuZCB0aGVyZSBhcmUgbGlrZWx5IG90aGVycwotICAgdG8gY2hvb3NlIGZyb20gZm9yIHRoYXQgT1MuIE11Y2ggaW5mbyBmb3IgdXNpbmcgaXQgb24gV2luZG93cyBjYW4gYmUKLSAgIGZvdW5kIGF0IHRoZSBzdHVubmVsIHNpdGUgYW5kIGluIHRoaXMgYXJ0aWNsZSBUaGUgYXJ0aWNsZSBhbHNvIHNob3dzCi0gICB0aGUgZGV0YWlsZWQgc3RlcHMgdG8gc2V0IHVwIGFsbCB0aGUgYXV0aGVudGljYXRpb24gY2VydGlmaWNhdGVzLiAoZm9yCi0gICBib3RoIHNlcnZlciBhbmQgY2xpZW50cywgc2VlIGFsc28gdGhlIHgxMXZuYyB1dGlsaXRpZXMgdGhhdCBkbyB0aGlzLikKLSAgIFRoZSBkZWZhdWx0IFdpbmRvd3MgY2xpZW50IHNldHVwIChubyBjZXJ0cykgaXMgc2ltcGxlciBhbmQgb25seSA0Ci0gICBmaWxlcyBhcmUgbmVlZGVkIGluIGEgZm9sZGVyOiBzdHVubmVsLmV4ZSwgc3R1bm5lbC5jb25mLCBsaWJzc2wzMi5kbGwsCi0gICBsaWJlYXkzMi5kbGwuIFdlIHVzZWQgYW4gc3R1bm5lbC5jb25mIGNvbnRhaW5pbmc6Ci0jIHN0dW5uZWwuY29uZjoKLWNsaWVudCA9IHllcwotb3B0aW9ucyA9IEFMTAotW215dm5jc3NsXQotYWNjZXB0ID0gbG9jYWxob3N0OjU5MDIKLWNvbm5lY3QgPSBmYXItYXdheS5lYXN0OjU5MDEKLQotICAgdGhlbiBkb3VibGUgY2xpY2sgb24gdGhlIHN0dW5uZWwuZXhlIGljb24gdG8gbGF1bmNoIGl0IChmb2xsb3dlZCBieQotICAgcG9pbnRpbmcgdGhlIFZOQyB2aWV3ZXIgdG8gbG9jYWxob3N0OjIpLgotCi0KLSAgIHN0dW5uZWwgaW5ldGQtbGlrZSBtb2RlOgotCi0gICBBcyBhbiBhc2lkZSwgaWYgeW91IGRvbid0IGxpa2UgdGhlIGxpdHRsZSAiZ2FwIiBvZiB1bmVuY3J5cHRlZCBUQ1AKLSAgIHRyYWZmaWMgKGFuZCBhIGxvY2FsaG9zdCBsaXN0ZW5pbmcgc29ja2V0KSBvbiB0aGUgbG9jYWwgbWFjaGluZQotICAgYmV0d2VlbiBzdHVubmVsIGFuZCB4MTF2bmMgaXQgY2FuIGFjdHVhbGx5IGJlIGNsb3NlZCBieSBoYXZpbmcgc3R1bm5lbAotICAgc3RhcnQgdXAgeDExdm5jIGluIC1pbmV0ZCBtb2RlOgotICBzdHVubmVsIC1wIC9wYXRoL3RvL3N0dW5uZWwucGVtIC1QIG5vbmUgLWQgNTkwMCAtbCAuL3gxMXZuY19zaAotCi0gICBXaGVyZSB0aGUgc2NyaXB0IHgxMXZuY19zaCBzdGFydHMgdXAgeDExdm5jOgotIyEvYmluL3NoCi14MTF2bmMgLXEgLWluZXRkIC1kaXNwbGF5IDowIC1wYXNzd2RmaWxlIH4vbXlwYXNzCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGNyZWF0ZXMgYSBzZXBhcmF0ZSB4MTF2bmMgcHJvY2VzcyBmb3IgZWFjaCBpbmNvbWluZwotICAgY29ubmVjdGlvbiAoYXMgYW55IGluZXRkIHgxMXZuYyB1c2FnZSB3b3VsZCksIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLSAgIG5vcm1hbGx5IGp1c3Qgb25lIHZpZXdlciBhdCBhIHRpbWUgaXQgc2hvdWxkIG5vdCBiZSBhIGJpZyBwcm9ibGVtLgotCi0KLSAgIHN0dW5uZWwgNCBzeW50YXg6Ci0KLSAgIFNvbWV3aGF0IHNhZGx5LCB0aGUgc3R1bm5lbCB2ZXJzaW9uIDQgc3ludGF4IGlzIG5vdCBzbyBhbWVuYWJsZSB0byB0aGUKLSAgIGNvbW1hbmQgbGluZSBvciBzY3JpcHRzLiBZb3UgbmVlZCB0byBjcmVhdGUgYSBjb25maWcgZmlsZSB3aXRoIHRoZQotICAgcGFyYW1ldGVycy4gRS5nLjoKLSAgc3R1bm5lbCB4MTF2bmMuY2ZnCi0KLSAgIFdoZXJlIHRoZSBmaWxlIHgxMXZuYy5jZmcgY29udGFpbnM6Ci1mb3JlZ3JvdW5kID0geWVzCi1waWQgPQotY2VydCA9IC9wYXRoL3RvL3N0dW5uZWwucGVtCi1beDExdm5jX3N0dW5uZWxdCi1hY2NlcHQgID0gNTkwMQotY29ubmVjdCA9IDU5MDAKLQotICAgT25lIG5pY2UgdGhpbmcgYWJvdXQgdmVyc2lvbiA0IGlzIG9mdGVuIHRoZSBQRU0gZmlsZSBkb2VzIG5vdCBuZWVkIHRvCi0gICBiZSBzcGVjaWZpZWQgYmVjYXVzZSBzdHVubmVsIGZpbmRzIGl0IGluIGl0cyBpbnN0YWxsZWQgYXJlYS4gT25lIG90aGVyCi0gICBnb3RjaGEgdGhlIFBFTSBmaWxlIGlzIHVzdWFsbHkgb25seSByZWFkYWJsZSBieSByb290IChpdCBoYXMgdGhlCi0gICBwcml2YXRlIGtleSBhZnRlcmFsbCksIHNvIHlvdSdsbCBuZWVkIHRvIHJlbGF4IHRoZSBwZXJtaXNzaW9ucyBvciBtYWtlCi0gICBhIGNvcHkgdGhhdCB0aGUgdXNlciBydW5uaW5nIHgxMXZuYy9zdHVubmVsIGNhbiByZWFkLgotCi0KLSAgIFNTTCBWTkMgVmlld2VyczoKLQotICAgUmVnYXJkaW5nIFZOQyB2aWV3ZXJzIHRoYXQgIm5hdGl2ZWx5IiBkbyBTU0wgdW5mb3J0dW5hdGVseSB0aGVyZSBkbwotICAgbm90IHNlZW0gdG8gYmUgbWFueS4gVGhlIFNpbmdsZUNsaWNrIFVsdHJhVk5DIEphdmEgVmlld2VyIGlzIFNTTCBhbmQKLSAgIGlzIGNvbXBhdGlibGUgd2l0aCB4MTF2bmMncyAtc3NsIG9wdGlvbiBhbmQgc3R1bm5lbC4pIENvbW1lcmNpYWwKLSAgIHZlcnNpb25zIG9mIFZOQyBzZWVtIHRvIGhhdmUgc29tZSBTU0wtbGlrZSBlbmNyeXB0aW9uIGJ1aWx0IGluLCBidXQgd2UKLSAgIGhhdmVuJ3QgdHJpZWQgdGhvc2UgZWl0aGVyIGFuZCB0aGV5IHByb2JhYmx5IHdvdWxkbid0IHdvcmsgc2luY2UgdGhlaXIKLSAgIChwcm9wcmlldGFyeSkgU1NMLWxpa2UgbmVnb3RpYXRpb24gaXMgbGlrZWx5IGVtYmVkZGVkIGluIHRoZSBWTkMKLSAgIHByb3RvY29sIHVubGlrZSBvdXIgY2FzZSB3aGVyZSBpdCBpcyBleHRlcm5hbC4KLQotICAgTm90ZTogYXMgb2YgTWFyLzIwMDYgbGlidm5jc2VydmVyL3gxMXZuYyBwcm92aWRlcyBhIFNTTC1lbmFibGVkIEphdmEKLSAgIGFwcGxldCB0aGF0IGNhbiBiZSBzZXJ2ZWQgdXAgdmlhIHRoZSAtaHR0cGRpciBvciAtaHR0cCBvcHRpb25zIHdoZW4KLSAgIC1zc2wgaXMgZW5hYmxlZC4gSXQgd2lsbCBhbHNvIGJlIHNlcnZlZCB2aWEgSFRUUFMgdmlhIGVpdGhlciB0aGUgVk5DCi0gICBwb3J0IChlLmcuIGh0dHBzOi8vaG9zdDo1OTAwLykgb3IgYSAybmQgcG9ydCB2aWEgdGhlIC1odHRwcyBvcHRpb24uCi0KLSAgIEluIGdlbmVyYWwgY3VycmVudCBTU0wgVk5DIHNvbHV0aW9ucyBhcmUgbm90IHBhcnRpY3VsYXJseSAic2VlbWxlc3MiLgotICAgQnV0IGl0IGNhbiBiZSBkb25lLCBhbmQgd2l0aCBhIHdyYXBwZXIgc2NyaXB0IG9uIHRoZSB2aWV3ZXIgc2lkZSBhbmQKLSAgIHRoZSAtc3R1bm5lbCBvciAtc3NsIG9wdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUgaXQgd29ya3Mgd2VsbCBhbmQgaXMKLSAgIGNvbnZlbmllbnQuIEhlcmUgaXMgYSBzaW1wbGUgc2NyaXB0IHNzX3ZuY3ZpZXdlciB0aGF0IGF1dG9tYXRlcwotICAgcnVubmluZyBzdHVubmVsIG9uIHRoZSBWTkMgdmlld2VyIHNpZGUgb24gVW5peCBhIGxpdHRsZSBtb3JlIGNhcmVmdWxseQotICAgdGhhbiB0aGUgY29tbWFuZHMgcHJpbnRlZCBhYm92ZS4gKE9uZSBjb3VsZCBwcm9iYWJseSBkbyBhIHNpbWlsYXIKLSAgIHRoaW5nIHdpdGggYSAuQkFUIGZpbGUgb24gV2luZG93cyBpbiB0aGUgc3R1bm5lbCBmb2xkZXIuKQotCi0gICBVcGRhdGUgSnVsLzIwMDY6IHdlIG5vdyBwcm92aWRlIGFuIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpCi0gICBwYWNrYWdlIHRoYXQgc3RhcnRzIHVwIFNUVU5ORUwgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHNvbWUgb3RoZXIKLSAgIGZlYXR1cmVzLiBBbGwgYmluYXJpZXMgKHN0dW5uZWwsIHZuY3ZpZXdlciwgYW5kIHNvbWUgdXRpbGl0aWVzKSBhcmUKLSAgIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlLiBJdCB3b3JrcyBvbiBVbml4LCBNYWMgT1MgWCwgYW5kIFdpbmRvd3MuCi0KLQotICAgUS01MzogRG9lcyB4MTF2bmMgaGF2ZSBidWlsdC1pbiBTU0wgdHVubmVsaW5nPwotCi0gICBZb3UgY2FuIHJlYWQgYWJvdXQgbm9uLWJ1aWx0LWluIG1ldGhvZHMgaW4gdGhlIFByZXZpb3VzIEZBUSBmb3IKLSAgIGJhY2tncm91bmQuCi0KLSAgIFNTTCB0dW5uZWxzIHByb3ZpZGUgYW4gZW5jcnlwdGVkIGNoYW5uZWwgd2l0aG91dCB0aGUgbmVlZCBmb3IgVW5peAotICAgdXNlcnMsIHBhc3N3b3JkcywgYW5kIGtleSBwYXNzcGhyYXNlcyByZXF1aXJlZCBmb3Igc3NoIChhbmQgYXQgdGhlCi0gICBvdGhlciBleHRyZW1lIFNTTCBjYW4gYWxzbyBwcm92aWRlIGEgY29tcGxldGUgc2lnbmVkIGNlcnRpZmljYXRlIGNoYWluCi0gICBvZiB0cnVzdC4pIE9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSBTU0ggaXMgdXN1YWxseSBpbnN0YWxsZWQKLSAgIGV2ZXJ5d2hlcmUgYW5kIGZpcmV3YWxscyBvZnRlbiBsZXQgaXRzIHBvcnQgdGhyb3VnaCwgc3NoIGlzIGZyZXF1ZW50bHkKLSAgIHRoZSBwYXRoIG9mIGxlYXN0IHJlc2lzdGFuY2UuCi0KLSAgIEJ1aWx0LWluIFNTTCB4MTF2bmMgb3B0aW9uczoKLQotICAgQXMgb2YgRmViLzIwMDYgdGhlIHgxMXZuYyAtc3NsIG9wdGlvbiBhdXRvbWF0ZXMgdGhlIFNTTCB0dW5uZWwKLSAgIGNyZWF0aW9uIG9uIHRoZSB4MTF2bmMgc2VydmVyIHNpZGUuIEFuIFNTTC1lbmFibGVkIEphdmEgVmlld2VyIGFwcGxldAotICAgaXMgYWxzbyBwcm92aWRlZCB0aGF0IGNhbiBiZSBzZXJ2ZWQgdmlhIEhUVFAgb3IgSFRUUFMgdG8gYXV0b21hdGUgU1NMCi0gICBvbiB0aGUgY2xpZW50IHNpZGUuCi0KLSAgIFRoZSAtc3NsIG1vZGUgdXNlcyB0aGUgd3d3Lm9wZW5zc2wub3JnIGxpYnJhcnkgaWYgYXZhaWxhYmxlIGF0IGJ1aWxkCi0gICB0aW1lLgotCi0gICBUaGUgbW9kZSByZXF1aXJlcyBhbiBTU0wgY2VydGlmaWNhdGUgYW5kIGtleSAoaS5lLiAucGVtIGZpbGUuKSBUaGVzZQotICAgYXJlIHVzdWFsbHkgY3JlYXRlZCB2aWEgdGhlIG9wZW5zc2woMSkgcHJvZ3JhbSAoaW4gZmFjdCBpbiBmb3IgIi1zc2wiCi0gICAoc2FtZSBhcyAiLXNzbCBTQVZFIikgaXQgd2lsbCBydW4gb3BlbnNzbCBmb3IgeW91IGF1dG9tYXRpY2FsbHkuKSBTbwotICAgdGhlIFNTTCBpcyBub3QgY29tcGxldGVseSAiYnVpbHQtaW4iIHNpbmNlIHRoaXMgZXh0ZXJuYWwgdG9vbCBuZWVkcyB0bwotICAgYmUgaW5zdGFsbGVkLCBidXQgYXQgbGVhc3QgeDExdm5jIHJ1bnMgaXQgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LgotCi0gICBBbiAtc3NsIGV4YW1wbGU6Ci0gIHgxMXZuYyAtZGlzcGxheSA6MCAtc3NsIC1wYXNzd2RmaWxlIH4vbXlwYXNzCi0KLSAgIFlvdSdsbCBnZXQgb3V0cHV0IGxpa2UgdGhpczoKLSAgMDkvMDQvMjAwNiAxOToyNzozNSBDcmVhdGluZyBhIHNlbGYtc2lnbmVkIFBFTSBjZXJ0aWZpY2F0ZS4uLgotICAwOS8wNC8yMDA2IDE5OjI3OjM1Ci0gIC4uLgotCi0gIFRoZSBTU0wgVk5DIGRlc2t0b3AgaXM6ICBmYXItYXdheS5lYXN0OjAKLSAgUE9SVD01OTAwCi0gIFNTTFBPUlQ9NTkwMAotCi0gICBJbiB0aGlzIGNhc2Ugb3BlbnNzbCgxKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBQRU0gYXV0b21hdGljYWxseS4gSXQKLSAgIHdpbGwgcHJvbXB0IHlvdSBpZiB5b3Ugd2FudCB0byBwcm90ZWN0IGl0IHdpdGggd2l0aCBhIHBhc3NwaHJhc2UuIFVzZQotICAgIi1zc2wgU0FWRV9OT1BST01QVCIgdG8gbm90IGJlIHByb21wdGVkLiBVc2UgIi1zc2wgVE1QIiB0byBjcmVhdGUgYQotICAgdGVtcG9yYXJ5IHNlbGYtc2lnbmVkIGNlcnQgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHgxMXZuYyBleGl0cy4KLQotICAgVXBkYXRlOiBBcyBvZiBOb3YvMjAwOCB4MTF2bmMgYWxzbyBzdXBwb3J0cyB0aGUgVmVOQ3J5cHQgU1NML1RMUwotICAgdHVubmVsIGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sLiBUaGUgb2xkZXIgQU5PTlRMUyBtZXRob2QgKHZpbm8pCi0gICBpcyBhbHNvIHN1cHBvcnRlZC4gVGhpcyBzdXBwb3J0IGlzIG9uIGJ5IGRlZmF1bHQgd2hlbiB0aGUgLXNzbCBvcHRpb24KLSAgIGlzIGluIHVzZSBhbmQgY2FuIGJlIGZpbmUtdHVuZWQgdXNpbmcgdGhlc2Ugb3B0aW9uczogLXZlbmNyeXB0LAotICAgLWFub250bHMsIGFuZCAtc3Nsb25seS4KLQotICAgVGhlIG5vcm1hbCB4MTF2bmMgLXNzbCBvcGVyYXRpb24gaXMgc29tZXdoYXQgbGlrZSBhIFVSTCBtZXRob2QKLSAgIHZuY3M6Ly9ob3N0bmFtZSBpZiB2bmM6Ly9ob3N0bmFtZSBpbmRpY2F0ZXMgYSBzdGFuZGFyZCB1bmVuY3J5cHRlZCBWTkMKLSAgIGNvbm5lY3Rpb24uIEp1c3QgYXMgaHR0cHM6Ly9ob3N0bmFtZSBpcyBhbiBTU0wgZW5jcnlwdGVkIHZlcnNpb24gb2YKLSAgIGh0dHA6Ly9ob3N0bmFtZS4gVGhlIGVudGlyZSBWTkMgc2Vzc2lvbiBnb2VzIHRocm91Z2ggdGhlIFNTTCB0dW5uZWwuCi0gICBWZU5DcnlwdCwgb24gdGhlIG90aGVyIGhhbmQsIHN3aXRjaGVzIHRvIFNTTC9UTFMgZWFybHkgaW4gdGhlIFZOQwotICAgcHJvdG9jb2wgaGFuZHNoYWtlLiB4MTF2bmMgMC45LjYgc3VwcG9ydHMgYm90aCBzaW11bHRhbmVvdXNseSB3aGVuCi0gICAtc3NsIGlzIGFjdGl2ZS4KLQotCi0gICBTU0wgVk5DIFZpZXdlcnM6LiBWaWV3ZXItc2lkZSB3aWxsIG5lZWQgdG8gdXNlIFNTTCBhcyB3ZWxsLiBTZWUgdGhlCi0gICBuZXh0IEZBUSBhbmQgaGVyZSBmb3IgU1NMIGVuYWJsZWQgVk5DIFZpZXdlcnMsIGluY2x1ZGluZyBTU1ZOQywgdG8KLSAgIGNvbm5lY3QgdG8gdGhlIGFib3ZlIHgxMXZuYyB2aWEgU1NMLgotCi0KLSAgIEFzIHNlZW4gYWJvdmUsIHRoZSBQRU0gKHByaXZhY3kgZW5oYW5jZWQgbWFpbCkgZmlsZSBkb2VzIG5vdCBuZWVkIHRvCi0gICBiZSBzdXBwbGllZCBpZiB0aGUgb3BlbnNzbCgxKSBjb21tYW5kIGlzIGF2YWlsYWJsZSBpbiBQQVRILCBpbiB0aGF0Ci0gICBjYXNlIGEgc2VsZi1zaWduZWQsIGNlcnRpZmljYXRlIGdvb2QgdGhlIGN1cnJlbnQgYW5kIHN1YnNlcXVlbnQgeDExdm5jCi0gICBzZXNzaW9ucyBpcyBjcmVhdGVkICh0aGlzIG1heSB0YWtlIGEgd2hpbGUgb24gdmVyeSBzbG93IG1hY2hpbmVzLikKLQotICAgSW4gZ2VuZXJhbCwgdGhlIFBFTSBmaWxlIGNvbnRhaW5zIGJvdGggdGhlIENlcnRpZmljYXRlIChpLmUuIHB1YmxpYwotICAga2V5KSBhbmQgdGhlIFByaXZhdGUgS2V5LiBCZWNhdXNlIG9mIHRoZSBsYXR0ZXIsIHRoZSBmaWxlIHNob3VsZCBiZQotICAgcHJvdGVjdGVkIGZyb20gYmVpbmcgcmVhZCBieSB1bnRydXN0ZWQgdXNlcnMuIFRoZSBiZXN0IHdheSB0byBkbyB0aGlzCi0gICBpcyB0byBlbmNyeXB0IHRoZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UgKG5vdGUgaG93ZXZlciB0aGlzIHJlcXVpcmVzCi0gICBzdXBwbHlpbmcgdGhlIHBhc3NwaHJhc2UgZWFjaCB0aW1lIHgxMXZuYyBpcyBzdGFydGVkIHVwLikKLQotICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9uIHgxMXZuYyBLZXkgTWFuYWdlbWVudCBmb3Igc29tZSB1dGlsaXRpZXMKLSAgIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGFuZCBldmVuIGZvcgotICAgY3JlYXRpbmcgeW91ciBvd24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgZm9yIHNpZ25pbmcgVk5DIHNlcnZlcgotICAgYW5kIGNsaWVudCBjZXJ0aWZpY2F0ZXMuIFRoaXMgbWF5IGJlIGRvbmUgYnkgaW1wb3J0aW5nIHRoZSBjZXJ0aWZpY2F0ZQotICAgaW50byBXZWIgQnJvd3NlciBvciBKYXZhIHBsdWdpbiBrZXlzdG9yZXMsIG9yIHBvaW50aW5nIHN0dW5uZWwgdG8gaXQuCi0gICBUaGUgd3JhcHBlciBzY3JpcHQgc3Nfdm5jdmlld2VyIHByb3ZpZGVzIGFuIGV4YW1wbGUgb24gdW5peCAoc2VlIHRoZQotICAgLXZlcmlmeSBvcHRpb24uKQotCi0gICBIZXJlIGFyZSBzb21lIG5vdGVzIG9uIHRoZSBzaW1wbGVyIGRlZmF1bHQgKG5vbi1DQSkgb3BlcmF0aW9uLiBUbyBoYXZlCi0gICB4MTF2bmMgc2F2ZSB0aGUgZ2VuZXJhdGVkIGNlcnRpZmljYXRlIGFuZCBrZXksIHVzZSB0aGUgIlNBVkUiIGtleXdvcmQKLSAgIGxpa2UgdGhpczoKLSAgeDExdm5jIC1zc2wgU0FWRSAtZGlzcGxheSA6MCAuLi4KLQotICAgKHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQ6ICItc3NsIi4pIFRoaXMgd2F5IGl0IHdpbGwgYmUgc2F2ZWQKLSAgIGluIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSB+Ly52bmMvY2VydHMvIGFzIHNlcnZlci5jcnQgKHRoZSBjZXJ0aWZpY2F0ZQotICAgb25seSkgYW5kIHNlcnZlci5wZW0gKGJvdGggY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5LikgVGhpcyBvcGVucyB1cAotICAgdGhlIHBvc3NpYmlsaXR5IG9mIGNvcHlpbmcgdGhlIHNlcnZlci5jcnQgdG8gbWFjaGluZXMgd2hlcmUgdGhlIFZOQwotICAgVmlld2VyIHdpbGwgYmUgcnVuIHRvIGVuYWJsZSBhdXRoZW50aWNhdGluZyB0aGUgeDExdm5jIFNTTCBWTkMgc2VydmVyCi0gICB0byB0aGUgY2xpZW50cy4gV2hlbiBhdXRoZW50aWNhdGlvbiB0YWtlcyBwbGFjZSB0aGlzIHdheSAob3IgdmlhIHRoZQotICAgbW9yZSBzb3BoaXN0aWNhdGVkIENBIHNpZ25pbmcgZGVzY3JpYmVkIGhlcmUpLCB0aGVuCi0gICBNYW4tSW4tVGhlLU1pZGRsZS1BdHRhY2tzIGFyZSBwcmV2ZW50ZWQuIE90aGVyd2lzZSwgdGhlIFNTTCBlbmNyeXB0aW9uCi0gICBvbmx5IHByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBwYXNzaXZlIG5ldHdvcmsgdHJhZmZpYyAic25pZmZpbmciCi0gICAoaS5lLiB5b3UgYXJlIG5vdCBwcm90ZWN0ZWQgYWdhaW5zdCBNLUktVC1NIGF0dGFja3MuKSBOb3dhZGF5cywgbW9zdAotICAgcGVvcGxlIHNlZW0gbW9zdGx5IGNvbmNlcm5lZCBtYWlubHkgYWJvdXQgcGFzc2l2ZSBzbmlmZmluZyAoYW5kIHRoZQotICAgZGVmYXVsdCB4MTF2bmMgU1NMIG1vZGUgcHJvdGVjdHMgYWdhaW5zdCBpdC4pIE5vdGUgdGhhdCB0aGVyZSBhcmUKLSAgIGhhY2tlciB0b29scyBsaWtlIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluIHRoYXQgaW1wbGVtZW50IFNTTAotICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gVGhleSByZWx5IG9uIHRoZSBjbGllbnQgbm90IGJvdGhlcmluZyB0bwotICAgY2hlY2sgdGhlIGNlcnQuCi0KLQotICAgT25lIGNhbiB0ZXN0IHRvIHNvbWUgZGVncmVlIHRoYXQgU1NMIGlzIHdvcmtpbmcgYWZ0ZXIgc3RhcnRpbmcgeDExdm5jCi0gICB3aXRoIHRoZSAtc3R1bm5lbCBvciAtc3NsIG9wdGlvbi4gRnJvbSBhbm90aGVyIG1hY2hpbmUgb25lIGNhbiB1c2UgdGhlCi0gICBvcGVuc3NsIGNvbW1hbmQgc29tZXRoaW5nIGxpa2UgdGhpczoKLSBvcGVuc3NsIHNfY2xpZW50IC1kZWJ1ZyAtbXNnIC1zaG93Y2VydHMgLWNvbm5lY3QgZmFyLWF3YXkuZWFzdDo1OTAwCi0KLSAgIEFmdGVyIGFsbCBvZiB0aGUgZGVidWdnaW5nIG91dHB1dCBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB5b3UnbGwKLSAgIHNlZSB0aGUgc3RyaW5nICJSRkIgMDAzLjAwOCIgdGhhdCBjYW1lIGZyb20geDExdm5jLiBQb2ludGluZyBhIHdlYgotICAgYnJvd3NlciBjb25uZWN0aW5nIHRvOiBodHRwczovL2Zhci1hd2F5LmVhc3Q6NTkwMC8gYW5kIHRoZW4gdmlld2luZwotICAgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGlvbiBpbiB0aGUgcGFuZWxzCi0gICB3aWxsIGFsc28gd29yay4KLQotICAgTm90ZTogSWYgeW91IHNlcnZlIHVwIHRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyBWaWV3ZXIgdmlhIHNvbWV0aGluZwotICAgbGlrZToKLSB4MTF2bmMgLXNzbCAtaHR0cGRpciAvdXNyL2xvY2FsL3NoYXJlL3gxMXZuYy9jbGFzc2VzL3NzbAotCi0gICAob3IganVzdCB0aGUgLWh0dHAgb3B0aW9uKSwgeW91IGNhbiB0ZXN0IGl0IG91dCBjb21wbGV0ZWx5IHVzaW5nIHRoYXQsCi0gICBpbmNsdWRpbmcgdXNpbmcgaHR0cHMgdG8gZG93bmxvYWQgaXQgaW50byB0aGUgYnJvd3NlciBhbmQgY29ubmVjdCB0bwotICAgeDExdm5jLgotCi0KLSAgIFRoZSBvbGRlciAtc3R1bm5lbCBvcHRpb246IEJlZm9yZSB0aGUgLXNzbCBvcHRpb24gdGhlcmUgd2FzIGEKLSAgIGNvbnZlbmllbmNlIG9wdGlvbiAtc3R1bm5lbCB0aGF0IHdvdWxkIHN0YXJ0IGFuIGV4dGVybmFsIFNTTCB0dW5uZWwKLSAgIGZvciB5b3UgdXNpbmcgc3R1bm5lbC4gVGhlIC1zc2wgbWV0aG9kIGlzIHRoZSBwcmVmZXJyZWQgd2F5LCBidXQgZm9yCi0gICBoaXN0b3JpY2FsIHJlZmVyZW5jZSB3ZSBrZWVwIHRoZSAtc3R1bm5lbCBpbmZvIGhlcmUuCi0KLSAgIFRoZSAtc3R1bm5lbCBtb2RlIHJlcXVpcmVzIHRoZSBzdHVubmVsLm1pcnQubmV0IGNvbW1hbmQgc3R1bm5lbCg4KSB0bwotICAgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uCi0KLSAgIFNvbWUgLXN0dW5uZWwgZXhhbXBsZXM6Ci0gIHgxMXZuYyAtZGlzcGxheSA6MCAtc3R1bm5lbCAvcGF0aC90by9zdHVubmVsLnBlbSAtcGFzc3dkZmlsZSB+L215cGFzcwotCi0gIHgxMXZuYyAtZGlzcGxheSA6MCAtc3R1bm5lbCBTQVZFIC4uLgotCi0gICBZb3UnbGwgZ2V0IG91dHB1dCBsaWtlIHRoaXM6Ci0gIFRoZSBWTkMgZGVza3RvcCBpczogICAgICBsb2NhbGhvc3Q6NTAKLSAgVGhlIFNTTCBWTkMgZGVza3RvcCBpczogIGZhci1hd2F5LmVhc3Q6MAotICBQT1JUPTU5NTAKLSAgU1NMUE9SVD01OTAwCi0KLSAgIFRoYXQgaW5kaWNhdGVzIHN0dW5uZWwgaXMgbGlzdGVuaW5nIG9uIHBvcnQgNTkwMCBmb3IgaW5jb21pbmcKLSAgIFNTTC13cmFwcGVkIFZOQyBjb25uZWN0aW9ucyBmcm9tIHZpZXdlcnMuIHgxMXZuYyBpcyBsaXN0ZW5pbmcgZm9yCi0gICBsb2NhbCBjb25uZWN0aW9ucyBvbiBwb3J0IDU5NTAgaW4gdGhpcyBjYXNlIChyZW1vdGUgdmlld2VycyBjYW5ub3QKLSAgIGNvbm5lY3QgdG8gaXQgZGlyZWN0bHkuKSBGb3IgLXN0dW5uZWwgdG8gd29yayB0aGUgc3R1bm5lbCBjb21tYW5kIG11c3QKLSAgIGJlIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBhbmQgYXZhaWxhYmxlIGluIFBBVEggKG5vdGUgc3R1bm5lbCBpcwotICAgb2Z0ZW4gaW5zdGFsbGVkIGluIHNiaW4gZGlyZWN0b3JpZXMgcmF0aGVyIHRoYW4gYmluLikgTm90ZSB0aGF0IHRoZQotICAgZGVmYXVsdCAiLXN0dW5uZWwiIGJ5IGl0c2VsZiBjcmVhdGVzIGEgdGVtcG9yYXJ5IGNlcnQgKGFzIGluICItc3NsCi0gICBUTVAiLikKLQotCi0gICBRLTU0OiBIb3cgZG8gSSB1c2UgVk5DIFZpZXdlcnMgd2l0aCBidWlsdC1pbiBTU0wgdHVubmVsaW5nPwotCi0gICBOb3RlcyBvbiB1c2luZyAibmF0aXZlIiBWTkMgVmlld2VycyB3aXRoIFNTTDoKLQotICAgVGhlcmUgYXJlbid0IGFueSBuYXRpdmUgVk5DIFZpZXdlcnMgdGhhdCBkbyBTU0wgKGFzayB5b3VyIFZOQyB2aWV3ZXIKLSAgIGRldmVsb3BlciB0byBhZGQgdGhlIGZlYXR1cmUuKSBTbyBhIHR1bm5lbCBtdXN0IGJlIHNldHVwIHRoYXQgeW91Ci0gICBwb2ludCB0aGUgVk5DIFZpZXdlciB0by4gVGhpcyBpcyBvZnRlbiBTVFVOTkVMLiBZb3UgY2FuIGRvIHRoaXMKLSAgIG1hbnVhbGx5LCBvciB1c2UgdGhlIHNzX3ZuY3ZpZXdlciBzY3JpcHQgb24gVW5peCwgb3Igb3VyIEVuaGFuY2VkCi0gICBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBwYWNrYWdlIG9uIFVuaXgsIFdpbmRvd3MsIG9yIE1hY09TWC4gU2VlIHRoZQotICAgbmV4dCBzZWN0aW9uIGZvciBKYXZhIFdlYiBicm93c2VyIFNTTCBWTkMgVmlld2VycyAoeW91IG9ubHkgbmVlZCBhCi0gICBKYXZhLWVuYWJsZWQgV2ViIGJyb3dzZXIgZm9yIGl0IHRvIHdvcmsuKQotCi0gICBOb3RlcyBvbiB0aGUgU1NMIGVuYWJsZWQgSmF2YSBWTkMgVmlld2VyIHByb3ZpZGVkIGluIHgxMXZuYwotICAgY2xhc3Nlcy9zc2wvVm5jVmlld2VyLmphcjoKLQotICAgQSBKYXZhIGFwcGxldCBWTkMgVmlld2VyIGFsbG93cyB5b3UgdG8gY29ubmVjdCB0byBhIFZOQyBTZXJ2ZXIgZnJvbSBhCi0gICBKYXZhLWVuYWJsZWQgV2ViIGJyb3dzZXIuCi0KLSAgIFRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyBWaWV3ZXIgKFZuY1ZpZXdlci5qYXIpIGluIHRoZSB4MTF2bmMgcGFja2FnZQotICAgc3VwcG9ydHMgb25seSBTU0wgYmFzZWQgY29ubmVjdGlvbnMgYnkgZGVmYXVsdC4gQXMgbWVudGlvbmVkIGFib3ZlIHRoZQotICAgLWh0dHBkaXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byAuLi4vY2xhc3Nlcy9zc2wuIEEgdHlwaWNhbAotICAgbG9jYXRpb24gbWlnaHQgYmUgL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wuIE9yIC1odHRwIGNhbiBiZQotICAgdXNlZCB0byB0cnkgdG8gaGF2ZSBpdCBmaW5kIHRoZSBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KLQotICAgQWxzbyBub3RlIHRoYXQgdGhlIFNpbmdsZUNsaWNrIFVsdHJhVk5DIEphdmEgVmlld2VyIGlzIGNvbXBhdGlibGUgd2l0aAotICAgeDExdm5jJ3MgLXNzbCBTU0wgbW9kZS4gKFdlIHRlc3RlZCBpdCB0aGlzIHdheTogImphdmEgLWNwCi0gICAuL1ZuY1ZpZXdlci5qYXIgVm5jVmlld2VyIEhPU1QgZmFyLWF3YXkuZWFzdCBQT1JUIDU5MDAgVVNFU1NMIDEKLSAgIFRSVVNUQUxMIDEiKQotCi0gICBUaGUgSmF2YSB2aWV3ZXIgdXNlcyBTU0wgdG8gY29tbXVuaWNhdGUgc2VjdXJlbHkgd2l0aCB4MTF2bmMuIE5vdGUKLSAgIHRoYXQgdGhlIGFwcGxldCBjYW4gb3B0aW9uYWxseSBhbHNvIGJlIGRvd25sb2FkZWQgaW50byB5b3VyIHdlYgotICAgYnJvd3NlciB2aWEgSFRUUFMgKHdoaWNoIGlzIEhUVFAgb3ZlciBTU0wuKSBUaGlzIHdheSB0aGUgSFRNTCBwYWdlIGFuZAotICAgdGhlIEphdmEgYXBwbGV0IGl0c2VsZiBhcmUgYWxzbyBkZWxpdmVyZWQgc2VjdXJlbHkgd2l0aCBTU0wgKGFzCi0gICBvcHBvc2VkIHRvIG9ubHkgdGhlIFZOQyB0cmFmZmljIGJlaW5nIGVuY3J5cHRlZCB3aXRoIFNTTC4pCi0KLSAgIEZvciB0aGlzIGNhc2UgdGhlIG91dHB1dCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHAKLSAgLi4uCi0gIFRoZSBTU0wgVk5DIGRlc2t0b3AgaXM6ICBmYXItYXdheS5lYXN0OjAKLSAgSmF2YSBTU0wgdmlld2VyIFVSTDogICAgIGh0dHBzOi8vZmFyLWF3YXkuZWFzdDo1OTAwLwotICBKYXZhIFNTTCB2aWV3ZXIgVVJMOiAgICAgaHR0cDovL2Zhci1hd2F5LmVhc3Q6NTgwMC8KLSAgUE9SVD01OTAwCi0gIFNTTFBPUlQ9NTkwMAotCi0gICBJbmRpY2F0aW5nIHRoZSB0d28gVVJMcyAodGhlIGZpcnN0IG9uZSBlbmNyeXB0ZWQsIHRoZSBzZWNvbmQgbm90KSBvbmUKLSAgIGNvdWxkIHBvaW50IHRoZSB3ZWIgYnJvd3NlciBhdCB0byBnZXQgdGhlIFZOQyB2aWV3ZXIgYXBwbGV0LiBFLmcuIHB1dAotICAgdGhpcwotICAgaHR0cDovL2Zhci1hd2F5LmVhc3Q6NTgwMC8KLQotICAgb3I6Ci0gICBodHRwczovL2Zhci1hd2F5LmVhc3Q6NTkwMC8KLQotICAgaW50byB5b3VyIEphdmEtZW5hYmxlZCBXZWIgYnJvd3Nlci4KLQotICAgTm90ZSB0aGF0IEtERSdzIEtvbnF1ZXJvciB3ZWIgYnJvd3NlciBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGgKLSAgIGh0dHBzIEphdmEgYXBwbGV0cywgc28geW91J2xsIGhhdmUgdG8gdXNlIHRoZSBodHRwLzU4MDAgd2l0aCBpdCAoaWYKLSAgIHlvdSBnZXQgaHR0cHMvNTkwMCB3b3JraW5nIGxldCB1cyBrbm93IGhvdyB5b3UgZGlkIGl0LikKLQotICAgSWYgeW91IGFyZSB1c2luZyBhIHJvdXRlci9maXJld2FsbCB3aXRoIHBvcnQtcmVkaXJlY3Rpb24sIGFuZCB5b3UgYXJlCi0gICByZWRpcmVjdGluZyBwb3J0cyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZXMgKDU4MDAsIDU5MDApIGxpc3RlZAotICAgYWJvdmUgc2VlIGhlcmUuCi0KLSAgIFRoZSBodHRwcyBzZXJ2aWNlIHByb3ZpZGVkIHRocnUgdGhlIGFjdHVhbCBWTkMgcG9ydCAoNTkwMCBpbiB0aGUgYWJvdmUKLSAgIGV4YW1wbGUpIGNhbiBvY2Nhc2lvbmFsbHkgYmUgc2xvdyBvciB1bnJlbGlhYmxlIChpdCBoYXMgdG8gcmVhZCBzb21lCi0gICBpbnB1dCBhbmQgdHJ5IHRvIGd1ZXNzIGlmIHRoZSBjb25uZWN0aW9uIGlzIFZOQyBvciBIVFRQLikgSWYgaXQgaXMKLSAgIHVucmVsaWFibGUgZm9yIHlvdSBhbmQgeW91IHN0aWxsIHdhbnQgdG8gc2VydmUgdGhlIEphdmEgYXBwbGV0IHZpYQotICAgaHR0cHMsIHVzZSB0aGUgLWh0dHBzIG9wdGlvbiB0byBnZXQgYW4gYWRkaXRpb25hbCBwb3J0IGRlZGljYXRlZCB0bwotICAgaHR0cHMgKGl0cyBVUkwgd2lsbCBhbHNvIGJlIHByaW50ZWQgaW4gdGhlIG91dHB1dC4pCi0KLSAgIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gYWRkIHRoZSBHRVQgYXBwbGV0IHBhcmFtZXRlcjoKLSAgaHR0cHM6Ly9mYXItYXdheS5lYXN0OjU5MDAvP0dFVD0xCi0KLSAgIFRoaXMgd2lsbCBoYXZlIHRoZSBWTkMgVmlld2VyIHNlbmQgYSBzcGVjaWFsIEhUVFAgR0VUIHN0cmluZyAiR0VUCi0gICAvcmVxdWVzdC5odHRwcy52bmMuY29ubmVjdGlvbiBIVFRQLzEuMCIgdGhhdCB4MTF2bmMgd2lsbCBub3RpY2UgbW9yZQotICAgcXVpY2tseSBhcyBhIHJlcXVlc3QgZm9yIGEgVk5DIGNvbm5lY3Rpb24uIE90aGVyd2lzZSBpdCBtdXN0IHdhaXQgZm9yCi0gICBhIHRpbWVvdXQgdG8gZXhwaXJlIGJlZm9yZSBpdCBhc3N1bWVzIGEgVk5DIGNvbm5lY3Rpb24uCi0KLSAgIFlvdSBtYXkgYWxzbyB1c2UgInVybFByZWZpeD1zb21lc3RyaW5nIiB0byBoYXZlIC9zb21lc3RyaW5nIHByZXBlbmRlZAotICAgdG8gL3JlcXVlc3QuaHR0cHMudm5jLmNvbm5lY3Rpb24iLiBQZXJoYXBzIHlvdSBhcmUgdXNpbmcgYSB3ZWIgc2VydmVyCi0gICBwcm94eSBzY2hlbWUgdG8gZW50ZXIgYSBmaXJld2FsbCBvciBvdGhlcndpc2UgaGF2ZSBydWxlcyBhcHBsaWVkIHRvCi0gICB0aGUgVVJMLiBJZiB5b3UgbmVlZCB0byBoYXZlIGFueSBzbGFzaGVzICIvIiBpbiAic29tZXN0cmluZyIgdXNlCi0gICAiXzJGXyIgKGEgZGVmaWNpZW5jeSBpbiBsaWJ2bmNzZXJ2ZXIgcHJldmVudHMgdXNpbmcgdGhlIG1vcmUgbmF0dXJhbAotICAgIiUyRiIuKQotCi0gICBZb3UgYXBwbHkgbXVsdGlwbGUgYXBwbGV0IHBhcmFtZXRlcnMgaW4gdGhlIHJlZ3VsYXIgVVJMIHdheSwgZS5nLjoKLSAgaHR0cHM6Ly9mYXItYXdheS5lYXN0OjU5MDAvP0dFVD0xJnVybFByZWZpeD1teXN1YmRpciYuLi4KLQotICAgQWxsIG9mIHRoZSB4MTF2bmMgSmF2YSBWaWV3ZXIgYXBwbGV0IHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKLSAgIGZpbGUgY2xhc3Nlcy9zc2wvUkVBRE1FCi0KLQotICAgVGlwcyBvbiBHZXR0aW5nIHRoZSBTU0wgSmF2YSBBcHBsZXQgV29ya2luZyB0aGUgRmlyc3QgVGltZToKLSAgIFVuZm9ydHVuYXRlbHksIGl0IGNhbiBiZSBhIGxpdHRsZSB0cmlja3kgZ2V0dGluZyB0aGUgU1NMIFZOQyBKYXZhCi0gICBWaWV3ZXIgd29ya2luZyB3aXRoIHgxMXZuYy4gSGVyZSBhcmUgc29tZSB0aXBzIHRvIGdldHRpbmcgd29ya2luZyB0aGUKLSAgIGZpcnN0IHRpbWUgKGFmdGVyd2FyZHMgeW91IGNhbiBpbmNyZW1lbnRhbGx5IGN1c3RvbWl6ZSB3aXRoIG1vcmUKLSAgIGNvbXBsZXggc2V0dGluZ3MuKQotICAgICAqIEZpcnN0IHRyeSBpdCBvbiB0aGUgTEFOOiBEbyBOT1QgdHJ5IHRvIGhhdmUgaXQgd29yayB0aGUgZmlyc3QgdGltZQotICAgICAgIGdvaW5nIHRocm91Z2ggZmlyZXdhbGxzLCBXZWIgcHJveGllcywgaG9tZSByb3V0ZXIgcG9ydAotICAgICAgIHJlZGlyZWN0aW9ucywgb3IgQXBhY2hlIHBvcnRhbC4gSnVzdCB0cnkgYSBkaXJlY3QgY29ubmVjdGlvbiBvdmVyCi0gICAgICAgeW91ciBMQU4gZmlyc3QgKGlmIHlvdSBvbmx5IGhhdmUgMSBtYWNoaW5lIGFuZCBubyBMQU4sIGp1c3QgZG8gYQotICAgICAgIGRpcmVjdCBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG1hY2hpbmU6IGxvY2FsaG9zdC4pIElmIHRoZSBMQU4KLSAgICAgICBtYWNoaW5lIHlvdSBydW4geDExdm5jIG9uIGhhcyBpdHMgb3duIGhvc3QtbGV2ZWwgZmlyZXdhbGwgKG1vc3QKLSAgICAgICBsaW51eCBtYWNoaW5lIGNvbWUgd2l0aCB0aGF0IG9uIGJ5IGRlZmF1bHQpLCBkaXNhYmxlIGl0IG9yIGF0Ci0gICAgICAgbGVhc3QgbGV0IHRjcCBwb3J0cyA1ODAwLTYwMDAgdGhyb3VnaC4KLSAgICAgKiBGaXJzdCB0cnkgSFRUUCB0byBkb3dubG9hZCB0aGUgSmF2YSBBcHBsZXQ6IHgxMXZuYyBjYW4gc2VydmUgYm90aAotICAgICAgIHRoZSBKYXZhIEFwcGxldCBqYXIgZmlsZSBhbmQgVk5DIG91dCBvZiB0aGUgc2FtZSBwb3J0IChib3RoCi0gICAgICAgdHVubmVsZWQgdGhyb3VnaCBTU0wsIHNlZSBiZWxvdy4pIEJ1dCBpdCBjYW4gbGVhZCB0byB0aW1pbmcgYW5kCi0gICAgICAgb3RoZXIgcHJvYmxlbXMuIFNvIGZpcnN0IHRyeSBIVFRQIGluc3RlYWQgb2YgSFRUUFMgdG8gZG93bmxvYWQgdGhlCi0gICAgICAgQXBwbGV0IGphciBmaWxlIChWbmNWaWV3ZXIuamFyLikgVGhhdCBpcyB0byBzYXkgdHJ5Ci0gICAgICAgaHR0cDovL2hvc3RuYW1lOjU4MDAgaW4geW91ciB3ZWIgYnJvd3NlciBmaXJzdCBiZWZvcmUgdHJ5aW5nCi0gICAgICAgaHR0cHM6Ly9ob3N0bmFtZTo1OTAwLiB4MTF2bmMgd2lsbCBwcmludCBvdXQgdGhlIHBvcnRzIGFuZCBVUkxzIGl0Ci0gICAgICAgaXMgdXNpbmcsIHNvIHVzZSB0aGUgSFRUUCBvbmUgaXQgcHJpbnRzIG91dC4KLSAgICAgKiBBbHdheXMgUmVzdGFydCB0aGUgQnJvd3NlcjogSWYgeW91IGFyZSBoYXZpbmcgZmFpbHVyZXMgYW5kIGhhdmUgdG8KLSAgICAgICByZXBlYXRlZGx5IHJldHJ5IHRoaW5ncyBBTFdBWVMgcmVzdGFydCB0aGUgYnJvd3NlciAoaS5lLgotICAgICAgIGNvbXBsZXRlbHkgZXhpdCBpdCBhbmQgdGhlbiBzdGFydCBhIG5ldyBicm93c2VyIHByb2Nlc3MpIGVhY2gKLSAgICAgICB0aW1lLiBPdGhlcndpc2UgYXMgeW91IGFyZSBjaGFuZ2luZyB0aGluZ3MgdGhlIGJyb3dzZXIgbWF5Ci0gICAgICAgInJlbWVtYmVyIiBmYWlsZWQgYXBwbGV0IGRvd25sb2FkcywgZXRjLiBhbmQganVzdCBhZGQgdG8gdGhlCi0gICAgICAgY29uZnVzaW9uIGFuZCBpcnJlcHJvZHVjaWJpbGl0eS4gSWYgeW91IHNlZSBpdCB0cnlpbmcgdG8gZG93bmxvYWQKLSAgICAgICBWbmNWaWV3ZXIuY2xhc3MgKGluc3RlYWQgb2YgVm5jVmlld2VyLmphcikgeW91IGtub3cgaXQgaXMgcmVhbGx5Ci0gICAgICAgY29uZnVzZWQgYW5kIG5lZWRzIHRvIGJlIHJlc3RhcnRlZC4KLSAgICAgKiBTdGVwIExpdmVseTogSWYgeW91IGdldCBCcm93c2VyIG9yIEphdmEgVk0gb3IgVk5DIFZpZXdlciBhcHBsZXQKLSAgICAgICBkaWFsb2cgYm94ZXMgc2F5aW5nIHRoaW5ncyBsaWtlICJEbyB5b3Ugd2FudCB0byB0cnVzdCB0aGlzCi0gICAgICAgY2VydGlmaWNhdGU/IiBvciAiVGhlIGhvc3RuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBvbmUgb24gdGhlCi0gICAgICAgY2VydGlmaWNhdGUiLCBldGMuIGp1c3QgZ28gdGhyb3VnaCB0aGVtIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi0gICAgICAgeDExdm5jIGNhbm5vdCB3YWl0IGZvcmV2ZXIgZm9yIGVhY2ggU1NMIGNvbm5lY3Rpb24sIGFuZCBzbyBpZiB5b3UKLSAgICAgICBkYXdkbGUgdG9vIGxvbmcgaW5zcGVjdGluZyB0aGUgY2VydHMsIGV0YyBpdCBjYW4gbGVhZCB0byBwcm9ibGVtcy4KLSAgICAgICBHZXQgaXQgd29ya2luZyBmaXJzdCBiZWZvcmUgdGFraW5nIHlvdXIgdGltZSB0byByZWFkIHRoZSBkZXRhaWxzCi0gICAgICAgaW4gdGhlIGRpYWxvZ3MsIGV0Yy4KLSAgICAgKiBObyBpbmV0ZCwgUGxlYXNlOiBFdmVuIGlmIHlvdSBpbnRlbmQgdG8gZGVwbG95IHZpYSBpbmV0ZCBvciB4aW5ldGQKLSAgICAgICBldmVudHVhbGx5LCBnZXQgdGhhdCB3b3JraW5nIGxhdGVyIChhbmQgcmVtZW1iZXIgZG8gbm90IHVzZQotICAgICAgIHNvbWV0aGluZyBsaWtlICItc3NsIFRNUCIgdGhhdCBjcmVhdGVzIGEgbmV3IHRlbXBvcmFyeSBTU0wKLSAgICAgICBjZXJ0aWZpY2F0ZSBmb3IgZXZlcnkgbmV3IHNvY2tldCBjb25uZWN0aW9uLikKLSAgICAgKiBOb3RoaW5nIEZhbmN5OiBEbyBub3QgdHJ5IGZhbmN5IHN0dWZmIGxpa2UgLXN2YywgLWNyZWF0ZSwgLXVuaXhwdywKLSAgICAgICAiLXVzZXJzIHVuaXhwdz0iLCAiLXVzZXJzIHNzbHBlZXI9IiwgLXNzbHZlcmlmeSwgZXRjLiBKdXN0IGdldCB0aGUKLSAgICAgICBzaW1wbGVzdCBjb25uZWN0aW9uIHdvcmtpbmcgZmlyc3QgYW5kIHRoZW4gaW5jcmVtZW50YWxseSBhZGQgd2hhdAotICAgICAgIHlvdSBuZWVkLgotCi0gICBTbyB0aGUgcmVjb21tZW5kZWQgdGVzdCBjb21tYW5kIGxpbmVzIGFyZToKLSAgIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHAKLSAgIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHBkaXIgL3BhdGgvdG8veDExdm5jL2NsYXNzZXMvc3NsCi0KLSAgIFVzZSB0aGUgbGF0dGVyIGlmIHgxMXZuYyBjYW5ub3QgYXV0b21hdGljYWxseSBmaW5kIHRoZSBjbGFzc2VzL3NzbAotICAgZGlyZWN0b3J5ICh0aGlzIHdoYXQgdGhlIC1odHRwIG9wdGlvbiBpbnN0cnVjdHMgaXQgdG8gZG8uKSBUaGVuIHBvaW50Ci0gICB5b3VyIGJyb3dzZXIgdG8gdGhlIEhUVFAgKG5vdCBIVFRQUykgVVJMIGl0IHByaW50cyBvdXQuCi0KLSAgIEZvbGxvd2luZyB0aGUgYWJvdmUgZ3VpZGVsaW5lcywgZGlkIGl0IHdvcms/IElmIHNvLCBDb25ncmF0dWxhdGlvbnMhIQotICAgeW91IGNyZWF0ZWQgYW4gU1NMIGVuY3J5cHRlZCBjb25uZWN0aW9uIGJldHdlZW4gdGhlIFNTTCBKYXZhIGFwcGxldAotICAgcnVubmluZyBpbiB5b3VyIHdlYiBicm93c2VyIGFuZCB4MTF2bmMuIFRoZSBmYWN0IHRoYXQgeW91IHVzZWQgSFRUUAotICAgaW5zdGVhZCBvZiBIVFRQUyB0byBkb3dubG9hZCB0aGUgYXBwbGV0IGlzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZAotICAgKHNvbWUgdXNlcnMgZG8gaXQgdGhpcyB3YXkpLCB0aGUgbWFpbiB0aGluZyBpcyB0aGF0IHRoZSBWTkMgdHJhZmZpYyBpcwotICAgZW5jcnlwdGVkIHdpdGggU1NMLiBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIGV2ZW4gd2l0aCB0aGUgYWJvdmUKLSAgIGJhc2VsaW5lIHRlc3QgY2FzZSBmZWVsIGZyZWUgdG8gY29udGFjdCBtZSAocGxlYXNlIHNlbmQgdGhlIEZ1bGwKLSAgIHgxMXZuYyBvdXRwdXQsIG5vdCBqdXN0IHBhcnQgb2YgaXQ7IHRoZSBjb21wbGV0ZSB4MTF2bmMgY29tbWFuZCBsaW5lOwotICAgdGhlIFVSTChzKSBlbnRlcmVkIGluIHRoZSBicm93c2VyOyB0aGUgZnVsbCBKYXZhIENvbnNvbGUgb3V0cHV0OyBhbmQKLSAgIGFueXRoaW5nIGVsc2UgeW91IGNhbiB0aGluayBvZi4pCi0KLSAgIE5leHQsIHlvdSBjYW4gYWRkIHRoZSBmZWF0dXJlcyB5b3Ugd2FudCBvbmUgYnkgb25lIHRlc3RpbmcgaXQgc3RpbGwKLSAgIHdvcmtzIGVhY2ggdGltZS4gSSBzdWdnZXN0IGZpcnN0IHR1cm5pbmcgb24gdGhlIEhUVFBTIGFwcGxldCBkb3dubG9hZAotICAgKGh0dHBzOi8vaG9zdG5hbWU6NTkwMCkgaWYgdGhhdCBpcyB3aGF0IHlvdSBpbnRlbmQgdG8gdXNlLiBUaGF0IG9uZQotICAgZ2l2ZXMgdGhlIG1vc3QgdHJvdWJsZSBiZWNhdXNlIG9mIHRoZSBhbWJpZ3VpdHkgb2YgcGFzc2luZyB0d28KLSAgIGRpZmZlcmVudCBwcm90b2NvbHMgKEhUVFAgYW5kIFZOQykgdGhyb3VnaCB0aGUgc2FtZSBTU0wgc2VydmljZSBwb3J0LgotCi0gICBOZXh0LCB0dXJuIG9uIGluZXRkIGlmIHlvdSBpbnRlbmQgdG8gdXNlIHRoYXQgKHRoaXMgY2FuIGJlIHRyaWNreSB0b28sCi0gICBiZSBzdXJlIHRvIHVzZSAtb2EgbG9nZmlsZSBhbmQgaW5zcGVjdCBpdCBjYXJlZnVsbHkgaWYgdGhlcmUgYXJlCi0gICBwcm9ibGVtcy4pIElmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIG5vbi1zdGFuZGFyZCBwb3J0cyAoZS5nLiAiLXJmYnBvcnQKLSAgIDQ0MyIgYXMgcm9vdCksIHdvcmsgb24gdGhhdCBuZXh0LiBUaGVuIGVuYWJsZSB0aGUgZmlyZXdhbGwsIHJvdXRlcgotICAgcG9ydCByZWRpcmVjdGlvbiBjaGFubmVsICh5b3Ugd2lsbCBzb21laG93IG5lZWQgdG8gYmUgb3V0c2lkZSB0byBkbwotICAgdGhhdCwgbWF5YmUgdGVzdCB0aGF0IHRocm91Z2ggYW5vdGhlciBWTkMgc2Vzc2lvbi4pCi0KLSAgIFRoZW4sIGlmIHlvdSBwbGFuIHRvIHVzZSB0aGVtLCBlbmFibGUgImZhbmN5IHN0dWZmIiBsaWtlICItc3ZjIiBvcgotICAgIi11bml4cHciLCBldGMsIGV0Yy4gQmUgc3VyZSB0byBhZGQgYSBwYXNzd29yZCBlaXRoZXIgIi1yZmJhdXRoIiBvcgotICAgIi11bml4cHciIG9yIGJvdGguIElmIHlvdSBuZWVkIHRvIGhhdmUgdGhlIHdlYiBicm93c2VyIHVzZSBhIGNvcnBvcmF0ZQotICAgV2ViIFByb3h5IChpLmUuIGl0IGNhbm5vdCBjb25uZWN0IGRpcmVjdGx5KSB3b3JrIG9uIHRoYXQgbGFzdC4gRGl0dG8KLSAgIGZvciB0aGUgQXBhY2hlIHBvcnRhbC4KLQotCi0gICBSb3V0ZXIvRmlyZXdhbGwgcG9ydCByZWRpcnM6ICBJZiB5b3UgYXJlIGRvaW5nIHBvcnQgcmVkaXJlY3Rpb24gYXQKLSAgIHlvdXIgcm91dGVyIHRvIGFuIGludGVybmFsIG1hY2hpbmUgcnVubmluZyB4MTF2bmMgQU5EIHRoZSBpbnRlcm5ldAotICAgZmFjaW5nIHBvcnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGludGVybmFsIG1hY2hpbmUncyBWTkMgcG9ydCwgeW91Ci0gICB3aWxsIG5lZWQgdG8gYXBwbHkgdGhlIFBPUlQgYXBwbGV0IHBhcmFtZXRlciB0byBpbmRpY2F0ZSB0byB0aGUgYXBwbGV0Ci0gICB0aGUgSW50ZXJuZXQgZmFjaW5nIHBvcnQgbnVtYmVyIChvdGhlcndpc2UgYnkgZGVmYXVsdCB0aGUgaW50ZXJuYWwKLSAgIG1hY2hpbmUncyBwb3J0LCBzYXkgNTkwMCwgaXMgc2VudCBhbmQgdGhhdCBvZiBjb3Vyc2UgaXMgcmVqZWN0ZWQgYXQKLSAgIHRoZSBmaXJld2FsbC9yb3V0ZXIuKSBGb3IgZXhhbXBsZToKLSAgaHR0cHM6Ly9mYXItYXdheS5lYXN0OjQ0My8/R0VUPTEmUE9SVD00NDMKLQotICAgU28gaW4gdGhpcyBleGFtcGxlIHRoZSB1c2VyIGNvbmZpZ3VyZXMgaGlzIHJvdXRlciB0byByZWRpcmVjdAotICAgY29ubmVjdGlvbnMgdG8gcG9ydCA0NDMgb24gaGlzIEludGVybmV0IHNpZGUgdG8sIHNheSwgcG9ydCA1OTAwIG9uIHRoZQotICAgaW50ZXJuYWwgbWFjaGluZSBydW5uaW5nIHgxMXZuYy4gU2VlIGFsc28gdGhlIC1odHRwc3JlZGlyIG9wdGlvbiB0aGF0Ci0gICB3aWxsIHRyeSB0byBhdXRvbWF0ZSB0aGlzIGZvciB5b3UuCi0KLSAgIFRvIGNvbmZpZ3VyZSB5b3VyIHJvdXRlciB0byBkbyBwb3J0IHJlZGlyZWN0aW9uLCBzZWUgaXRzIGluc3RydWN0aW9ucy4KLSAgIFR5cGljYWxseSwgZnJvbSB0aGUgaW5zaWRlIHlvdSBwb2ludCBhIHdlYiBicm93c2VyIHRvIGEgc3BlY2lhbCBVUkwKLSAgIChlLmcuIGh0dHA6Ly8xOTIuMTY4LjEuMSkgYW5kIHlvdSBnZXQgYSB3ZWIgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSBpdC4KLSAgIExvb2sgZm9yIHNvbWV0aGluZyBsaWtlICJQb3J0IFJlZGlyZWN0aW9uIiBvciAiUG9ydCBGb3J3YXJkaW5nIiwKLSAgIHByb2JhYmx5IHVuZGVyICJBZHZhbmNlZCIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gSWYgeW91IGhhdmUgYSBMaW51eAotICAgb3IgVW5peCBzeXN0ZW0gYWN0aW5nIGFzIHlvdXIgZmlyZXdhbGwvcm91dGVyLCBzZWUgaXRzIGZpcmV3YWxsCi0gICBjb25maWd1cmF0aW9uLgotCi0gICBZb3UgY2FuIGFsc28gdXNlIHgxMXZuYyBvcHRpb25zIC1yZmJwb3J0IE5OTk5OIGFuZCAtaHR0cHBvcnQgTk5OTk4gdG8KLSAgIG1hdGNoIHRoZSBwb3J0cyB0aGF0IHlvdXIgZmlyZXdhbGwgd2lsbCBiZSByZWRpcmVjdGluZyB0byB0aGUgbWFjaGluZQotICAgd2hlcmUgeDExdm5jIGlzIHJ1bi4KLQotCi0gICBUZWRpb3VzIERpYWxvZ3M6IElmIHlvdSBkbyBzZXJ2ZSB0aGUgU1NMIGVuYWJsZWQgSmF2YSB2aWV3ZXIgdmlhIGh0dHBzCi0gICBiZSBwcmVwYXJlZCBmb3IgcXVpdGUgYSBudW1iZXIgb2YgImFyZSB5b3Ugc3VyZSB5b3UgdHJ1c3QgdGhpcyBzaXRlPyIKLSAgIGRpYWxvZ3M6Ci0gICAgICogRmlyc3QgZnJvbSB0aGUgV2ViIGJyb3dzZXIgdGhhdCBjYW5ub3QgdmVyaWZ5IHRoZSBzZWxmLXNpZ25lZAotICAgICAgIGNlcnRpZmljYXRlIHdoZW4gaXQgZG93bmxvYWRzIGluZGV4LnZuYy4KLSAgICAgKiBGcm9tIHRoZSBXZWIgYnJvd3NlciBhZ2FpbiBub3RpbmcgdGhhdCB0aGUgY29tbW9uIG5hbWUgb24gdGhlCi0gICAgICAgY2VydGlmaWNhdGUgZG9lcyBub3QgbWF0Y2ggdGhlIGhvc3RuYW1lIG9mIHRoZSByZW1vdGUgbWFjaGluZS4KLSAgICAgKiBOZXh0IGZyb20gdGhlIEphdmEgVk0gdGhhdCBjYW5ub3QgdmVyaWZ5IHRoZSBzZWxmLXNpZ25lZAotICAgICAgIGNlcnRpZmljYXRlIHdoZW4gaXQgZG93bmxvYWRzIFZuY1ZpZXdlci5qYXIuCi0gICAgICogQW5kIGFsc28gZnJvbSB0aGUgSmF2YSBWTSBhZ2FpbiBub3RpbmcgdGhhdCB0aGUgY29tbW9uIG5hbWUgb24gdGhlCi0gICAgICAgY2VydGlmaWNhdGUgZG9lcyBub3QgbWF0Y2ggdGhlIGhvc3RuYW1lIG9mIHRoZSByZW1vdGUgbWFjaGluZS4KLSAgICAgKiBGaW5hbGx5IGZyb20gdGhlIEphdmEgVm5jVmlld2VyIGFwcGxldCBpdHNlbGYgc2F5aW5nIGl0IGNhbm5vdAotICAgICAgIHZlcmlmeSB0aGUgY2VydGlmaWNhdGUhIChvciBhIHBvcHVwIGFza2luZyB5b3UgaWYgeW91IHdhbnQgdG8gc2VlCi0gICAgICAgdGhlIGNlcnRpZmljYXRlLikKLQotICAgTm90ZSB0aGF0IHNvbWV0aW1lcyBpZiB5b3UgcGF1c2UgdG9vIGxvbmcgYXQgb25lIG9mIHRoZSBhYm92ZSBkaWFsb2dzCi0gICB0aGVuIHgxMXZuYyBtYXkgZXhjZWVkIGEgdGltZW91dCBhbmQgYXNzdW1lIHRoZSBjdXJyZW50IHNvY2tldAotICAgY29ubmVjdGlvbiBpcyBWTkMgaW5zdGVhZCBvZiB0aGUgSFRUUFMgaXQgYWN0dWFsbHkgaXMgKGJ1dCBzaW5jZSB5b3UKLSAgIGhhdmUgcGF1c2VkIHRvbyBsb25nIGF0IHRoZSBkaWFsb2cgdGhlIEdFVCByZXF1ZXN0IGNvbWVzIHRvbyBsYXRlLikKLSAgIE9mdGVuIGhpdHRpbmcgUmVsb2FkIGFuZCBnb2luZyB0aHJvdWdoIHRoZSBkaWFsb2dzIG1vcmUgcXVpY2tseSB3aWxsCi0gICBsZXQgeW91IGNvbm5lY3QuIFRoZSBKYXZhIFZNIGRpYWxvZ3MgYXJlIHRoZSBtb3N0IGltcG9ydGFudCBvbmVzIHRvCi0gICBOT1QgbGluZ2VyIGF0LiBJZiB5b3Ugc2VlIGluIHRoZSB4MTF2bmMgb3V0cHV0IGEgcmVxdWVzdCBmb3IKLSAgIFZuY1ZpZXdlci5jbGFzcyBpbnN0ZWFkIG9mIFZuY1ZpZXdlci5qYXIgaXQgaXMgdG9vIGxhdGUuLi4geW91IHdpbGwKLSAgIG5lZWQgdG8gY29tcGxldGVseSByZXN0YXJ0IHRoZSBXZWIgYnJvd3NlciB0byBnZXQgaXQgdG8gdHJ5IGZvciB0aGUKLSAgIGphciBhZ2Fpbi4gWW91IGNhbiB1c2UgdGhlIC1odHRwcyBvcHRpb24gaWYgeW91IHdhbnQgYSBkZWRpY2F0ZWQgcG9ydAotICAgZm9yIEhUVFBTIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2hhcmluZyB0aGUgVk5DIHBvcnQuCi0KLSAgIFRvIHNlZSBleGFtcGxlIHgxMXZuYyBvdXRwdXQgZm9yIGEgc3VjY2Vzc2Z1bCBodHRwczovL2hvc3Q6NTkwMC8KLSAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgSmF2YSBBcHBsZXQgc2VlIFRoaXMgUGFnZS4gQW5kIGhlcmUgaXMgYSBuZXdlcgotICAgZXhhbXBsZSBpbmNsdWRpbmcgdGhlIEphdmEgQ29uc29sZSBvdXRwdXQuCi0KLSAgIEFsbCBvZiB0aGUgeDExdm5jIEphdmEgVmlld2VyIGFwcGxldCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlCi0gICBmaWxlIGNsYXNzZXMvc3NsL1JFQURNRQotCi0KLSAgIE5vdGVzIG9uIHRoZSBWTkMgVmlld2VyIHNzX3ZuY3ZpZXdlciB3cmFwcGVyIHNjcmlwdDoKLQotICAgSWYgeW91IHdhbnQgdG8gdXNlIGEgbmF0aXZlIFZOQyBWaWV3ZXIgd2l0aCB0aGUgU1NMIGVuYWJsZWQgeDExdm5jIHlvdQotICAgd2lsbCBuZWVkIHRvIHJ1biBhbiBleHRlcm5hbCBTU0wgdHVubmVsIG9uIHRoZSBWaWV3ZXIgc2lkZS4gVGhlcmUgZG8KLSAgIG5vdCBzZWVtIHRvIGJlIGFueSBuYXRpdmUgU1NMIFZOQyBWaWV3ZXJzIG91dHNpZGUgb2Ygb3VyIHgxMXZuYyBhbmQKLSAgIFNTVk5DIHBhY2thZ2VzLiBUaGUgYmFzaWMgaWRlYXMgb2YgZG9pbmcgdGhpcyB3ZXJlIGRpc2N1c3NlZCBmb3IKLSAgIGV4dGVybmFsIHR1bm5lbCB1dGlsaXRpZXMgaGVyZS4KLQotICAgVGhlIHNzX3ZuY3ZpZXdlciBzY3JpcHQgcHJvdmlkZWQgd2l0aCB4MTF2bmMgYW5kIFNTVk5DIGNhbiBzZXQgdXAgdGhlCi0gICBzdHVubmVsIHR1bm5lbCBhdXRvbWF0aWNhbGx5IG9uIHVuaXggYXMgbG9uZyBhcyB0aGUgc3R1bm5lbCBjb21tYW5kIGlzCi0gICBpbnN0YWxsZWQgb24gdGhlIFZpZXdlciBtYWNoaW5lIGFuZCBhdmFpbGFibGUgaW4gUEFUSCAoYW5kIHZuY3ZpZXdlcgotICAgdG9vIG9mIGNvdXJzZS4pIE5vdGUgdGhhdCBvbiBhIERlYmlhbiBiYXNlZCBzeXN0ZW0geW91IHdpbGwgbmVlZCB0bwotICAgaW5zdGFsbCB0aGUgcGFja2FnZSBzdHVubmVsNCBub3Qgc3R1bm5lbC4gWW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50Ci0gICB2YXJpYWJsZXMgU1RVTk5FTCBhbmQgVk5DVklFV0VSQ01EIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IHByb2dyYW1zIGlmCi0gICB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCi0KLSAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6Ci0gIDEpICBzc192bmN2aWV3ZXIgZmFyLWF3YXkuZWFzdDowCi0KLSAgMikgIHNzX3ZuY3ZpZXdlciBmYXItYXdheS5lYXN0OjAgLWVuY29kaW5ncyAiY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlIgotCi0gIDMpICBzc192bmN2aWV3ZXIgLXZlcmlmeSAuL3NlcnZlci5jcnQgZmFyLWF3YXkuZWFzdDowCi0KLSAgNCkgIHNzX3ZuY3ZpZXdlciAtbXljZXJ0IC4vY2xpZW50LnBlbSBmYXItYXdheS5lYXN0OjAKLQotICA1KSAgc3Nfdm5jdmlld2VyIC1wcm94eSBmYXItYXdheS5lYXN0OjgwODAgbXl3b3Jrc3RhdGlvbjowCi0KLSAgIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgbW9kZSBhbmQgYWNjZXB0cyB0aGUgeDExdm5jIGNlcnRpZmljYXRlCi0gICB3aXRob3V0IHF1ZXN0aW9uLiBUaGUgc2Vjb25kIG9uZSBpcyBhcyB0aGUgZmlyc3QsIGJ1dCBhZGRzIHRoZQotICAgLWVuY29kaW5ncyBvcHRpb25zIHRvIHRoZSB2bmN2aWV3ZXIgY29tbWFuZCBsaW5lLgotCi0gICBUaGUgdGhpcmQgb25lIHJlcXVpcmVzIHRoYXQgdGhlIHgxMXZuYyBzZXJ2ZXIgYXV0aGVudGljYXRlIGl0c2VsZiB0bwotICAgdGhlIGNsaWVudCBhZ2FpbnN0IHRoZSBjZXJ0aWZpY2F0ZSBpbiB0aGUgZmlsZSAuL3NlcnZlci5jcnQgKGUuZy4gb25lCi0gICBjcmVhdGVkIGJ5ICJ4MTF2bmMgLXNzbCBTQVZFIiBhbmQgc2FmZWx5IGNvcGllZCB0byB0aGUgVk5DIHZpZXdlcgotICAgbWFjaGluZS4pCi0KLSAgIFRoZSBmb3VydGggb25lIGlzIGZvciBWTkMgVmlld2VyIGF1dGhlbnRpY2F0aW9uLCBpdCB1c2VzIC4vY2xpZW50LnBlbQotICAgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0byB4MTF2bmMuIE9uZSBjYW4gc3VwcGx5IGJvdGggLXZlcmlmeSBhbmQKLSAgIC1teWNlcnQgc2ltdWx0YW5lb3VzbHkuCi0KLSAgIFRoZSBmaWZ0aCBvbmUgc2hvd3MgdGhhdCBXZWIgcHJveGllcyBjYW4gYmUgdXNlZCBpZiB0aGF0IGlzIHRoZSBvbmx5Ci0gICB3YXkgdG8gZ2V0IG91dCBvZiB0aGUgZmlyZXdhbGwuIElmIHRoZSAiZG91YmxlIHByb3h5IiBzaXR1YXRpb24gYXJpc2VzCi0gICBzZXBhcmF0ZSB0aGUgdHdvIGJ5IGNvbW1hcy4gU2VlIHRoaXMgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cKLSAgIFdlYiBwcm94aWVzIGNvbWUgaW50byBwbGF5LgotCi0gICBJZiBvbmUgdXNlcyBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIHNjaGVtZSBkZXNjcmliZWQgaGVyZSwgdGhlCi0gICB3cmFwcGVyIHNjcmlwdCB3b3VsZCB1c2UgdGhlIENBIGNlcnQgaW5zdGVhZCBvZiB0aGUgc2VydmVyIGNlcnQ6Ci0gIDMnKSAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9jYWNlcnQuY3J0IGZhci1hd2F5LmVhc3Q6MAotCi0gICBVcGRhdGUgSnVsLzIwMDY6IHdlIG5vdyBwcm92aWRlIGFuIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpCi0gICBwYWNrYWdlIHRoYXQgc3RhcnRzIHVwIFNUVU5ORUwgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHNvbWUgb3RoZXIKLSAgIGZlYXR1cmVzLiBBbGwgYmluYXJpZXMgKHN0dW5uZWwsIHZuY3ZpZXdlciwgYW5kIHNvbWUgdXRpbGl0aWVzKSBhcmUKLSAgIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlLiBJdCB3b3JrcyBvbiBVbml4LCBNYWMgT1MgWCwgYW5kIFdpbmRvd3MuCi0KLQotICAgUS01NTogSG93IGRvIEkgdXNlIHRoZSBKYXZhIGFwcGxldCBWTkMgVmlld2VyIHdpdGggYnVpbHQtaW4gU1NMCi0gICB0dW5uZWxpbmcgd2hlbiBnb2luZyB0aHJvdWdoIGEgV2ViIFByb3h5PwotICAgVGhlIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlciBhbmQgZmlyZXdhbGwgUHJveGllczoKLQotICAgU1NMIGFuZCBIVFRQUyBhc2lkZSwgdGhlcmUgaXMgYSBnZW5lcmFsIHByb2JsZW0gd2l0aCBGaXJld2FsbCBQcm94aWVzCi0gICBhbmQgSmF2YSBBcHBsZXRzIHRoYXQgb3BlbiBzb2NrZXRzLiBUaGUgYXBwbGV0IGlzIGRvd25sb2FkZWQKLSAgIHN1Y2Nlc3NmdWxseSAodGhyb3VnaCB0aGUgYnJvd3NlcikgdXNpbmcgSFRUUCBhbmQgdGhlIHByb3h5LCBidXQgd2hlbgotICAgdGhlIGFwcGxldCB0cmllcyB0byByZWNvbm5lY3QgdG8gdGhlIG9yaWdpbmF0aW5nIGhvc3QgKHRoZSBvbmx5IG9uZQotICAgYWxsb3dlZCBieSBzZWN1cml0eSkgaXQgZG9lcyBub3QgdXNlIHRoZSBwcm94eSBjaGFubmVsLiBTbyBpdCBjYW5ub3QKLSAgIHJlY29ubmVjdCB0byB0aGUgc2VydmVyIHRoZSBhcHBsZXQgY2FtZSBmcm9tIQotCi0gICBXZSBoYXZlIGZvdW5kIGEgY29udmVuaWVudCB3b3JrYXJvdW5kOiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlCi0gICBWbmNWaWV3ZXIuamFyIHJlc2lkZXMgdGhlcmUgaXMgYSBkaWdpdGFsbHkgc2lnbmVkIHZlcnNpb24gb2YgdGhlIHNhbWUKLSAgIGFwcGxldCBjYWxsZWQgU2lnbmVkVm5jVmlld2VyLmphci4gU2luY2UgdGhlIGFwcGxldCBpcyBkaWdpdGFsbHkKLSAgIHNpZ25lZCwgdGhlcmUgd2lsbCBiZSBhbiBhZGRpdGlvbmFsIGRpYWxvZyBmcm9tIHRoZSBKYXZhIFZNIHBsdWdpbgotICAgYXNraW5nIHlvdSBpZiB5b3Ugd2FudCB0byB0cnVzdCB0aGUgYXBwbGV0IGZ1bGx5LgotCi0gICBZb3Ugc2hvdWxkIHNheSAiWWVzIi4gSWYgeW91IGRvLCB0aGUgYXBwbGV0IHdpbGwgYmUgcnVuIGluIGEgbW9kZQotICAgd2hlcmUgaXQgY2FuIHRyeSB0byBkZXRlcm1pbmUgdGhlIGZpcmV3YWxsIHByb3h5IGhvc3QgbmFtZSBhbmQgcG9ydAotICAgKGl0IHdpbGwgYXNrIHlvdSBmb3IgdGhlbSBpZiBpdCBjYW5ub3QgZmluZCB0aGVtLikgVGhpcyB3YXkgaXQgY2FuCi0gICBjb25uZWN0IGRpcmVjdGx5IHRvIHRoZSBQcm94eSBhbmQgdGhlbiByZXF1ZXN0IHRoZSBDT05ORUNUIG1ldGhvZCB0bwotICAgYmUgcmVkaXJlY3RlZCB0byB0aGUgb3JpZ2luYXRpbmcgaG9zdCAodGhlIHgxMXZuYyBWTkMgU2VydmVyLikgU1NMIGlzCi0gICB0aGVuIGxheWVyZWQgb3ZlciB0aGlzIHNvY2tldC4KLQotICAgVG8gZG8gdGhpcyB5b3Ugc2hvdWxkIHVzZSB0aGUgcHJveHkudm5jIEhUTUwgZmlsZSBsaWtlIHZpYSB0aGlzIFVSTCBpbgotICAgeW91ciBicm93c2VyOgotICBodHRwczovL3lvdXJtYWNoaW5lLmNvbTo1OTAwL3Byb3h5LnZuYwotCi0gICAoaW5zdGVhZCBvZiB0aGUgdW5zaWduZWQgb25lIGluIGh0dHBzOi8veW91cm1hY2hpbmUuY29tOjU5MDAvIHRoYXQKLSAgIGdpdmVzIHRoZSBkZWZhdWx0IGluZGV4LnZuYykKLQotICAgUHJveGllcyB0aGF0IGxpbWl0IENPTk5FQ1QgdG8gcG9ydHMgNDQzIGFuZCA1NjM6Ci0KLSAgIFRoaW5ncyBiZWNvbWUgdHJpY2tpZXIgaWYgdGhlIFdlYiBwcm94eSByZXN0cmljdHMgd2hpY2ggQ09OTkVDVCBwb3J0cwotICAgY2FuIGJlIHJlZGlyZWN0ZWQgdG8uIEZvciBzZWN1cml0eSwgc29tZSAobW9zdD8pIHByb3hpZXMgb25seSBhbGxvdwotICAgcG9ydCA0NDMgKEhUVFBTKSBhbmQgNTYzIChTTkVXUykgYnkgZGVmYXVsdC4gSW4gdGhpcyBjYXNlLCB0aGUgb25seQotICAgdGhpbmcgdG8gZG8gaXMgcnVuIHgxMXZuYyBvbiB0aGF0IGxvdyBwb3J0LCBlLmcuICItcmZicG9ydCA0NDMiLCAob3IKLSAgIHVzZSBhIHBvcnQgcmVkaXJlY3Rpb24gb24sIHNheSwgYSBmaXJld2FsbCBvciByb3V0ZXIgcG9ydCA0NDMgdG8gdGhlCi0gICBpbnRlcm5hbCBtYWNoaW5lLikKLQotICAgSWYgeW91IGRvIHN1Y2ggYSByZWRpcmVjdGlvbiB0byBhbiBpbnRlcm5hbCBtYWNoaW5lIGFuZCB4MTF2bmMgaXMgbm90Ci0gICBsaXN0ZW5pbmcgb24gcG9ydCA0NDMsIHlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gZWRpdCBwcm94eS52bmMuCi0gICBTdXBwb3NlIHRoZSBTU0wgeDExdm5jIHNlcnZlciB3YXMgbGlzdGVuaW5nIG9uIHBvcnQgNTkwMS4gWW91IHNob3VsZAotICAgY2hhbmdlIHRoZSBsaW5lIGluIHByb3h5LnZuYyBmcm9tOgotICA8cGFyYW0gbmFtZT1QT1JUIHZhbHVlPSRQT1JUPgotCi0gICB0bzoKLSAgPHBhcmFtIG5hbWU9UE9SVCB2YWx1ZT00NDM+Ci0KLSAgIFNpbmNlIG90aGVyd2lzZSAkUE9SVCB3aWxsIGJlIGV4cGFuZGVkIHRvIDU5MDEgYnkgeDExdm5jIGFuZCB0aGUKLSAgIHZpZXdlciBhcHBsZXQgd2lsbCBmYWlsIHRvIGNvbm5lY3QgdG8gdGhhdCBwb3J0IG9uIHRoZSBmaXJld2FsbC4KLQotICAgQW5vdGhlciB3YXkgdG8gYWNoaWV2ZSB0aGUgc2FtZSB0aGluZyBpcyB0byB1c2UgdGhlIGFwcGxldCBQT1JUCi0gICBwYXJhbWV0ZXI6Ci0gIGh0dHBzOi8veW91cm1hY2hpbmUuY29tL3Byb3h5LnZuYz9QT1JUPTQ0MwotCi0gICB0aGlzIGlzIGNsZWFuZXIgYmVjYXVzZSBpdCBhdm9pZHMgZWRpdGluZyB0aGUgZmlsZSwgYnV0IHJlcXVpcmVzIG1vcmUKLSAgIHBhcmFtZXRlcnMgaW4gdGhlIFVSTC4gU2VlIGFsc28gdGhlIC1odHRwc3JlZGlyIHgxMXZuYyBvcHRpb24gdGhhdAotICAgd2lsbCB0cnkgdG8gYXV0b21hdGUgdGhpcyBmb3IgeW91LiBUbyB1c2UgdGhlIEdFVCB0cmljayBkaXNjdXNzZWQKLSAgIGFib3ZlLCBkbzoKLSAgaHR0cHM6Ly95b3VybWFjaGluZS5jb20vcHJveHkudm5jP0dFVD0xJlBPUlQ9NDQzCi0KLSAgIEFsbCBvZiB0aGUgeDExdm5jIEphdmEgVmlld2VyIGFwcGxldCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlCi0gICBmaWxlIGNsYXNzZXMvc3NsL1JFQURNRQotCi0gICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgSmF2YSBDb25zb2xlIGFuZCB4MTF2bmMgb3V0cHV0IGZvciB0aGUgV2ViIHByb3h5Ci0gICBjYXNlLgotCi0KLSAgIE5vdGUgdGhhdCBib3RoIHRoZSBzc192bmN2aWV3ZXIgc3R1bm5lbCBVbml4IHdyYXBwZXIgc2NyaXB0IGFuZAotICAgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgY2FuIHVzZSBXZWIgcHJveGllcyBhcyB3ZWxsIGV2ZW4KLSAgIHRob3VnaCB0aGV5IGRvIG5vdCBpbnZvbHZlIGEgV2ViIGJyb3dzZXIuCi0KLQotICAgUS01NjogQ2FuIEFwYWNoZSB3ZWIgc2VydmVyIGFjdCBhcyBhIGdhdGV3YXkgZm9yIHVzZXJzIHRvIGNvbm5lY3QgdmlhCi0gICBTU0wgZnJvbSB0aGUgSW50ZXJuZXQgd2l0aCBhIFdlYiBicm93c2VyIHRvIHgxMXZuYyBydW5uaW5nIG9uIHRoZWlyCi0gICB3b3Jrc3RhdGlvbnMgYmVoaW5kIGEgZmlyZXdhbGw/Ci0gICBZZXMuIFlvdSB3aWxsIG5lZWQgdG8gY29uZmlndXJlIGFwYWNoZSB0byBmb3J3YXJkIHRoZXNlIGNvbm5lY3Rpb25zLgotICAgSXQgaXMgZGlzY3Vzc2VkIGhlcmUuIFRoaXMgU1NMIFZOQyBwb3J0YWwgcHJvdmlkZXMgYSBjbGVhbiBhbHRlcm5hdGl2ZQotICAgdG8gdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCB3aGVyZSB0aGUgdXNlciB1c2VzIFNTSCB0byBsb2cgaW4gdGhyb3VnaAotICAgdGhlIGdhdGV3YXkgdG8gY3JlYXRlIHRoZSBlbmNyeXB0ZWQgcG9ydCByZWRpcmVjdGlvbiB0byB4MTF2bmMgcnVubmluZwotICAgb24gaGVyIGRlc2t0b3AuCi0KLSAgIEFsc28gc2VlIHRoZSBkZXNrdG9wLmNnaSBDR0kgc2NyaXB0IG1ldGhvZCB0aGF0IGFjaGlldmVzIG11Y2ggb2Ygd2hhdAotICAgdGhpcyBBcGFjaGUgVk5DIFNTTCBwb3J0YWwgbWV0aG9kIGRvZXMgKGFzIGxvbmcgYXMgZGVza3RvcC5jZ2kncyAncG9ydAotICAgcmVkaXJlY3Rpb24nIG1vZGUgaXMgZW5hYmxlZC4pCi0KLQotICAgUS01NzogQ2FuIEkgY3JlYXRlIGFuZCB1c2UgbXkgb3duIFNTTCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSB3aXRoCi0gICB4MTF2bmM/Ci0gICBZZXMsIHNlZSB0aGlzIHBhZ2UgZm9yIGhvdyB0byBkbyB0aGlzIGFuZCB0aGUgdXRpbGl0eSBjb21tYW5kcyB4MTF2bmMKLSAgIHByb3ZpZGVzIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIG1hbnkgdHlwZXMgb2YgY2VydGlmaWNhdGVzIGFuZCBwcml2YXRlCi0gICBrZXlzLgotCi0KLQotICAgW0Rpc3BsYXkgTWFuYWdlcnMgYW5kIFNlcnZpY2VzXQotCi0gICBRLTU4OiBIb3cgY2FuIEkgcnVuIHgxMXZuYyBhcyBhICJzZXJ2aWNlIiB0aGF0IGlzIGFsd2F5cyBhdmFpbGFibGU/Ci0KLSAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHRvIGRvIHRoaXMuIFRoZSBwcmltYXJ5IHRoaW5nIHlvdSBuZWVkIHRvCi0gICBkZWNpZGUgaXMgd2hldGhlciB5b3Ugd2FudCB4MTF2bmMgdG8gY29ubmVjdCB0byB0aGUgWCBzZXNzaW9uIG9uIHRoZQotICAgbWFjaGluZSAxKSByZWdhcmRsZXNzIG9mIHdobyAob3IgaWYgYW55b25lKSBoYXMgdGhlIFggc2Vzc2lvbiwgb3IgMikKLSAgIG9ubHkgaWYgYSBjZXJ0YWluIHVzZXIgaGFzIHRoZSBYIHNlc3Npb24uIEJlY2F1c2UgWCBzZXNzaW9ucyBhcmUKLSAgIHByb3RlY3RlZCBieSBYIHBlcm1pc3Npb25zIChNSVQtTUFHSUMtQ09PS0lFIGZpbGVzIFhBVVRIT1JJVFkgYW5kCi0gICAkSE9NRS8uWGF1dGhvcml0eSkgdGhlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB4MTF2bmMgd2lsbCBvZiBjb3Vyc2UKLSAgIG5lZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGNvbm5lY3QgdG8gdGhlIFggZGlzcGxheS4KLQotICAgSGVyZSBhcmUgc29tZSBpZGVhczoKLSAgICAgKiBVc2UgdGhlIGRlc2NyaXB0aW9uIHVuZGVyICJDb250aW51b3VzbHkiIGluIHRoZSBGQVEgb24geDExdm5jIGFuZAotICAgICAgIERpc3BsYXkgTWFuYWdlcnMKLSAgICAgKiBVc2UgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBGQVEgb24geDExdm5jIGFuZCBpbmV0ZCg4KQotICAgICAqIFVzZSB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIEZBUSBvbiBVbml4IHVzZXIgbG9naW5zIGFuZCBpbmV0ZCg4KQotICAgICAqIFN0YXJ0IHgxMXZuYyBmcm9tIHlvdXIgJEhPTUUvLnhzZXNzaW9uIChvciAkSE9NRS8ueGluaXRyYyBvcgotICAgICAgIGF1dG9zdGFydCBzY3JpcHQgb3IgLi4uKQotICAgICAqIEFsdGhvdWdoIGxlc3MgcmVsaWFibGUsIHNlZSB0aGUgeDExdm5jX2xvb3AgcmMubG9jYWwgaGFjayBiZWxvdy4KLQotICAgVGhlIGRpc3BsYXkgbWFuYWdlciBzY2hlbWUgd2lsbCBub3QgYmUgc3BlY2lmaWMgdG8gd2hpY2ggdXNlciBoYXMgdGhlCi0gICBYIHNlc3Npb24gdW5sZXNzIGEgdGVzdCBpcyBzcGVjaWZpY2FsbHkgcHV0IGludG8gdGhlIGRpc3BsYXkgc3RhcnR1cAotICAgc2NyaXB0IChvZnRlbiBuYW1lZCBYc2V0dXAuKSBUaGUgaW5ldGQoOCkgc2NoZW1lIG1heSBvciBtYXkgbm90IGJlCi0gICBzcGVjaWZpYyB0byB3aGljaCB1c2VyIGhhcyB0aGUgWCBzZXNzaW9uIChhbmQgaXQgbWF5IG5vdCBiZSBhYmxlIHRvIGRvCi0gICBhbGwgdXNlcnMgdmlhIHRoZSBYQVVUSE9SSVRZIHBlcm1pc3Npb24gaXNzdWVzLikKLQotICAgVGhlIC54c2Vzc2lvbi8ueGluaXRyYyBzY2hlbWUgaXMgb2J2aW91c2x5IGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhcgotICAgdXNlciBhbmQgb25seSB3aGVuIHRoZXkgYXJlIGxvZ2dlZCBpbnRvIFguIElmIHlvdSBkbyBub3Qga25vdyB3aGF0IGEKLSAgICRIT01FLy54c2Vzc2lvbiBzY3JpcHQgaXMgb3IgaG93IHRvIHVzZSBvbmUsIHBlcmhhcHMgeW91ciBkZXNrdG9wIGhhcwotICAgYSAic2Vzc2lvbiBzdGFydHVwIGNvbW1hbmRzIiBjb25maWd1cmF0aW9uIG9wdGlvbi4gVGhlIGNvbW1hbmQgdG8gYmUKLSAgIHJ1biBpbiB0aGUgLnhzZXNzaW9uIG9yIC54aW5pdHJjIGZpbGUgbWF5IGxvb2sgbGlrZSB0aGlzOgoteDExdm5jIC1sb2dmaWxlICRIT01FLy54MTF2bmMubG9nIC1yZmJhdXRoICRIT01FLy52bmMvcGFzc3dkIC1mb3JldmVyIC1iZwotCi0gICBwbHVzIGFueSBvdGhlciBvcHRpb25zIHlvdSBkZXNpcmUuCi0KLSAgIERlcGVuZGluZyBvbiB5b3VyIGRlc2t0b3AgYW5kL29yIE9TL2Rpc3RyaWJ1dGlvbiB0aGUgYXV0b21hdGljYWxseSBydW4KLSAgIFggc3RhcnR1cCBzY3JpcHRzICh0cmFkaXRpb25hbGx5IC54c2Vzc2lvbi8ueGluaXRyYykgbWF5IGhhdmUgdG8gYmUgaW4KLSAgIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBvciBoYXZlIGEgZGlmZmVyZW50IGJhc2VuYW1lLiBPbmUgdXNlcgotICAgcmVjb21tZW5kcyB0aGUgZGVzY3JpcHRpb24gdW5kZXIgJ1J1bm5pbmcgU2NyaXB0cyBBdXRvbWF0aWNhbGx5JyBhdAotICAgdGhpcyBsaW5rLgotCi0gICBGaXJld2FsbHM6IG5vdGUgYWxsIG1ldGhvZHMgd2lsbCByZXF1aXJlIHRoZSBob3N0LWxldmVsIGZpcmV3YWxsIHRvIGJlCi0gICBjb25maWd1cmVkIHRvIGFsbG93IGNvbm5lY3Rpb25zIGluIG9uIGEgcG9ydC4gRS5nLiA1OTAwIChkZWZhdWx0IFZOQwotICAgcG9ydCkgb3IgMjIgKGRlZmF1bHQgU1NIIHBvcnQgZm9yIHR1bm5lbGxpbmcgVk5DLikgTW9zdCBzeXN0ZW1zIHRoZXNlCi0gICBkYXlzIGhhdmUgZmlyZXdhbGxzIHR1cm5lZCBvbiBieSBkZWZhdWx0LCBzbyB5b3Ugd2lsbCBhY3RpdmVseSBoYXZlIHRvCi0gICBkbyBzb21ldGhpbmcgdG8gcG9rZSBhIGhvbGUgaW4gdGhlIGZpcmV3YWxsIGF0IHRoZSBkZXNpcmVkIHBvcnQKLSAgIG51bWJlci4gU2VlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0aW9uIHRvb2wgZm9yIEZpcmV3YWxsIHNldHRpbmdzCi0gICAoWWFzdCwgRmlyZXN0YXJ0ZXIsIGV0Yy4pCi0KLQotICAgUS01OTogSG93IGNhbiBJIHVzZSB4MTF2bmMgdG8gY29ubmVjdCB0byBhbiBYIGxvZ2luIHNjcmVlbiBsaWtlIHhkbSwKLSAgIEdOT01FIGdkbSwgS0RFIGtkbSwgb3IgQ0RFIGR0bG9naW4/IChpLmUuIG5vYm9keSBpcyBsb2dnZWQgaW50byBhbiBYCi0gICBzZXNzaW9uIHlldC4pCi0KLSAgIFdlIGRlc2NyaWJlIHR3byBzY2VuYXJpb3MgaGVyZS4gVGhlIGZpcnN0IGlzIGNhbGxlZCAnT25lIHRpbWUgb25seScKLSAgIG1lYW5pbmcgeW91IGp1c3QgbmVlZCB0byBkbyBpdCBxdWlja2x5IG9uY2UgYW5kIGRvbid0IHdhbnQgdG8gcmVwZWF0OwotICAgYW5kIHRoZSBzZWNvbmQgaXMgY2FsbGVkICdDb250aW51b3VzbHknIG1lYW5pbmcgeW91IHdhbnQgdGhlIGFjY2VzcyB0bwotICAgYmUgYXZhaWxhYmxlIGFmdGVyIGV2ZXJ5IHJlYm9vdCBhbmQgYWZ0ZXIgZXZlcnkgZGVza3RvcCBsb2dvdXQuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIE9uZSB0aW1lIG9ubHk6ICAgSWYgdGhlIFggbG9naW4gc2NyZWVuIGlzIHJ1bm5pbmcgYW5kIHlvdSBqdXN0IHdhbnQgdG8KLSAgIGNvbm5lY3QgdG8gaXQgb25jZSAoaS5lLiBhIG9uZS1zaG90KToKLQotICAgSXQgaXMgdXN1YWxseSBwb3NzaWJsZSB0byBkbyB0aGlzIGJ5IGp1c3QgYWRqdXN0aW5nIHRoZSBYQVVUSE9SSVRZCi0gICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgY29ycmVjdCBNSVQtQ09PS0lFIGF1dGggZmlsZQotICAgd2hpbGUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCwgZS5nLiBmb3IgdGhlIGdub21lIGRpc3BsYXkgbWFuYWdlciwgR0RNOgotICB4MTF2bmMgLWF1dGggL3Zhci9nZG0vOjAuWGF1dGggLWRpc3BsYXkgOjAKLQotICAgKHRoZSAtYXV0aCBvcHRpb24gc2V0cyB0aGUgWEFVVEhPUklUWSB2YXJpYWJsZSBmb3IgeW91LikKLQotICAgVGhlcmUgd2lsbCBiZSBhIHNpbWlsYXIgdGhpbmcgdG8gZG8gZm9yIHhkbSB1c2luZyBob3dldmVyIGEgZGlmZmVyZW50Ci0gICBhdXRoIGRpcmVjdG9yeSBwYXRoIChwZXJoYXBzIHNvbWV0aGluZyBsaWtlCi0gICAvdmFyL2xpYi94ZG0vYXV0aGRpci9hdXRoZmlsZXMvQTowLVhRdmFKaykgZm9yIHRoZSB4ZG0gZ3JlZXRlciBvcgotICAgL3Zhci9saWIva2RtL0E6MC1jcldrNzIgKG9yIC92YXIvcnVuL3hhdXRoL0E6MC1xUVBmdHIsIGV0Yy4gZXRjKSBmb3IKLSAgIHRoZSBrZG0gZ3JlZXRlci4gT2YgY291cnNlLCB0aGUgcmFuZG9tIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGUgYmFzZW5hbWUKLSAgIHdpbGwgdmFyeSBhbmQgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIGFjdHVhbCBmaWxlbmFtZSBvbiB5b3VyIHN5c3RlbS4KLSAgIFJlYWQgeW91ciBzeXN0ZW0gZG9jcyB0byBmaW5kIG91dCB3aGVyZSB0aGUgZGlzcGxheSBtYW5hZ2VyIGNvb2tpZQotICAgZmlsZXMgYXJlIGtlcHQuCi0KLSAgIFRyaWNrOiBzb21ldGltZXMgcHMoMSkgY2FuIHJldmVhbCB0aGUgWCBzZXJ2ZXIgcHJvY2VzcyAtYXV0aCBhcmd1bWVudAotICAgKGUuZy4gInBzIHd3YXV4IHwgZ3JlcCBhdXRoIikgYW5kIGhlbmNlIHRoZSBwYXRoIHRvIHRoZSBhdXRoIGZpbGUuCi0KLSAgIHgxMXZuYyBtdXN0IGJlIHJ1biBhcyByb290IGZvciB0aGlzIGJlY2F1c2UgdGhlIC92YXIvZ2RtLzowLlhhdXRoLAotICAgL3Zhci9saWIva2RtL0E6MC1jcldrNzIsIGV0Yy4gYXV0aCBmaWxlcyBhcmUgb25seSByZWFkYWJsZSBieSByb290LiBJZgotICAgeW91IGRvIG5vdCB3YW50IHRvIHJ1biB4MTF2bmMgYXMgcm9vdCwgeW91IGNhbiBjb3B5IChhcyByb290IG9yIHN1ZG8pCi0gICB0aGUgYXV0aCBmaWxlIHRvIHNvbWUgbG9jYXRpb24gYW5kIG1ha2UgaXQgcmVhZGFibGUgYnkgeW91ciB1c2VyaWQuCi0gICBUaGVuIHJ1biB4MTF2bmMgYXMgeW91ciB1c2VyaWQgd2l0aCAtYXV0aCBwb2ludGVkIHRvIHRoZSBjb3BpZWQgZmlsZS4KLQotICAgVXBkYXRlIERlYy8yMDA5OiB1c2UgIi1hdXRoIGd1ZXNzIiB0byBoYXZlIHgxMXZuYyB0cnkgdG8gZ3Vlc3MgdGhlCi0gICBsb2NhdGlvbiBvZiB0aGUgYXV0aCBmaWxlIGZvciB5b3UuCi0KLSAgIFlvdSBuZXh0IGNvbm5lY3QgdG8geDExdm5jIHdpdGggYSBWTkMgdmlld2VyLCBnaXZlIHlvdXIgdXNlcm5hbWUgYW5kCi0gICBwYXNzd29yZCB0byB0aGUgWCBsb2dpbiBwcm9tcHQgdG8gc3RhcnQgeW91ciBzZXNzaW9uLgotCi0gICBOb3RlOiAgR0RNOiBnZG0gc2VlbXMgdG8gaGF2ZSBhbiBhbm5veWluZyBzZXR0aW5nIHRoYXQgY2F1c2VzIHgxMXZuYwotICAgKGFuZCBhbnkgb3RoZXIgWCBjbGllbnRzKSB0byBiZSBraWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbi4gU2V0dGluZwotICAgS2lsbEluaXRDbGllbnRzPWZhbHNlIGluIHRoZSBbZGFlbW9uXSBzZWN0aW9uIG9mIC9ldGMvWDExL2dkbS9nZG0uY29uZgotICAgKG9yIC9ldGMvZ2RtL2dkbS5jb25mLCBldGMuKSBhdm9pZHMgdGhpcy4gT3RoZXJ3aXNlLCBqdXN0IHJlc3RhcnQKLSAgIHgxMXZuYyBhbmQgdGhlbiByZWNvbm5lY3QgeW91ciB2aWV3ZXIuIE90aGVyIGRpc3BsYXkgbWFuYWdlcnMgKGtkbSwKLSAgIGV0YykgbWF5IGFsc28gaGF2ZSBhIHNpbWlsYXIgcHJvYmxlbS4gT25lIHVzZXIgcmVwb3J0cyBoYXZpbmcgdG8gYWx0ZXIKLSAgICJnZG0uY29uZi1jdXN0b20iIGFzIHdlbGwuCi0KLSAgIE5vdGU6ICBTb2xhcmlzOiBGb3IgZHRsb2dpbiBpbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgc29ydCBvZiB0cmljawotICAgKEJUVywgdGhlIGF1dGggZmlsZSBzaG91bGQgYmUgaW4gL3Zhci9kdCksIHlvdSdsbCBhbHNvIG5lZWQgdG8gYWRkCi0gICBzb21ldGhpbmcgbGlrZSBEdGxvZ2luKmdyYWJTZXJ2ZXI6RmFsc2UgdG8gdGhlIFhjb25maWcgZmlsZQotICAgKC9ldGMvZHQvY29uZmlnL1hjb25maWcgb3IgL3Vzci9kdC9jb25maWcvWGNvbmZpZyBvbiBTb2xhcmlzLCBzZWUgdGhlCi0gICBleGFtcGxlIGF0IHRoZSBlbmQgb2YgdGhpcyBGQVEuKSBUaGVuIHJlc3RhcnQgZHRsb2dpbiwgZS5nLjoKLSAgIC9ldGMvaW5pdC5kL2R0bG9naW4gc3RvcDsgL2V0Yy9pbml0LmQvZHRsb2dpbiBzdGFydCBvciByZWJvb3QuCi0KLSAgIFVwZGF0ZSBOb3YvMjAwODogUmVnYXJkaW5nIEdETSBLaWxsSW5pdENsaWVudHM6IHNlZSB0aGUgLXJlb3BlbiBvcHRpb24KLSAgIGZvciBhbm90aGVyIHBvc3NpYmxlIHdvcmthcm91bmQuCi0KLSAgIFVwZGF0ZSBPY3QvMjAwOTogUmVnYXJkaW5nIEdETSBLaWxsSW5pdENsaWVudHM6IHN0YXJ0aW5nIHdpdGggeDExdm5jCi0gICAwLjkuOSBpdCB3aWxsIHRyeSB0byBhcHBseSBoZXVyaXN0aWNzIHRvIGRldGVjdCBpZiBhIHdpbmRvdyBtYW5hZ2VyIGlzCi0gICBub3QgcnVubmluZyAoaS5lLiB3aGV0aGVyIHRoZSBEaXNwbGF5IE1hbmFnZXIgR3JlZXRlciBMb2dpbiBwYW5lbCBpcwotICAgc3RpbGwgdXAuKSBJZiBpdCB0aGlua3MgdGhlIGRpc3BsYXkgbWFuYWdlciBsb2dpbiBpcyBzdGlsbCB1cCBpdCB3aWxsCi0gICBkZWxheSBjcmVhdGluZyB3aW5kb3dzIG9yIHVzaW5nIFhGSVhFUy4gVGhlIGZvcm1lciBpcyB3aGF0IEdETSB1c2VzIHRvCi0gICBraWxsIHRoZSBpbml0aWFsIGNsaWVudHMsIHVzZSBvZiB0aGUgbGF0dGVyIGNhbiBjYXVzZSBhIGRpZmZlcmVudAotICAgcHJvYmxlbTogYW4gWG9yZyBzZXJ2ZXIgY3Jhc2guIFNvIHdpdGggMC45LjkgYW5kIGxhdGVyIGl0IHNob3VsZCBhbGwKLSAgIHdvcmsgd2l0aG91dCBuZWVkaW5nIHRvIHNldCBLaWxsSW5pdENsaWVudHM9ZmFsc2UgKHdoaWNoIGlzIGEgZ29vZAotICAgYmVjYXVzZSByZWNlbnQgR0RNLCB2Mi4yNCwgaGFzIHJlbW92ZWQgdGhpcyBvcHRpb24pIG9yIHVzZSAtbm94Zml4ZXMuCi0gICBUbyBkaXNhYmxlIHRoZSBoZXVyaXN0aWNzIGFuZCBkZWxheWluZyBzZXQgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXI7Ci0gICB0byBzZXQgdGhlIGRlbGF5IHRpbWUgZXhwbGljaXRseSB1c2UsIGUuZy4sIFgxMVZOQ19BVk9JRF9XSU5ET1dTPTEyMAotICAgKGRlbGF5cyBmb3IgMTIwIHNlY29uZHMgYWZ0ZXIgdGhlIFZOQyBjb25uZWN0aW9uOyB5b3UgaGF2ZSB0aGF0IGxvbmcKLSAgIHRvIGxvZyBpbi4pCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIENvbnRpbnVvdXNseTogICBIYXZlIHgxMXZuYyByZWF0dGFjaCBlYWNoIHRpbWUgdGhlIFggc2VydmVyIGlzCi0gICByZXN0YXJ0ZWQgKGkuZS4gYWZ0ZXIgZWFjaCBsb2dvdXQgYW5kIHJlYm9vdCk6Ci0KLSAgIFRvIG1ha2UgeDExdm5jIGFsd2F5cyBhdHRhY2hlZCB0byB0aGUgWCBzZXJ2ZXIgaW5jbHVkaW5nIHRoZSBsb2dpbgotICAgc2NyZWVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgY29tbWFuZCB0byBhIGRpc3BsYXkgbWFuYWdlciBzdGFydHVwCi0gICBzY3JpcHQuCi0KLSAgIFBsZWFzZSBjb25zaWRlciB0aGUgc2VjdXJpdHkgaW1wbGljYXRpb25zIG9mIHRoaXMhIFRoZSBWTkMgZGlzcGxheSBmb3IKLSAgIHRoZSBYIHNlc3Npb24gYWx3YXlzIGFjY2Vzc2libGUgKGJ1dCBob3BlZnVsbHkgcGFzc3dvcmQgcHJvdGVjdGVkLikKLSAgIEFkZCAtbG9jYWxob3N0IGlmIHlvdSBvbmx5IHBsYW4gdG8gYWNjZXNzIHZpYSBhIFNTSCB0dW5uZWwuCi0KLSAgIFRoZSBuYW1lIG9mIHRoZSBkaXNwbGF5IG1hbmFnZXIgc3RhcnR1cCBzY3JpcHQgZmlsZSBkZXBlbmRzIG9uIGRlc2t0b3AKLSAgIHVzZWQgYW5kIHNlZW0gdG8gYmU6Ci0gICAgIEdETSAoR05PTUUpICAvZXRjL1gxMS9nZG0vSW5pdC9EZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAvZXRjL2dkbS9Jbml0L0RlZmF1bHQKLSAgICAgS0RNIChLREUpICAgIC9ldGMva2RlKi9rZG0vWHNldHVwCi0gICAgIFhETSAgICAgICAgICAvZXRjL1gxMS94ZG0vWHNldHVwICAgICAgICAgIChvciBzb21ldGltZXMgeGRtL1hzZXR1cF8wKQotICAgICBDREUgICAgICAgICAgL2V0Yy9kdC9jb25maWcvWHNldHVwCi0KLSAgIGFsdGhvdWdoIHRoZSBleGFjdCBsb2NhdGlvbiBjYW4gYmUgb3BlcmF0aW5nIHN5c3RlbSwgZGlzdHJpYnV0aW9uLCBhbmQKLSAgIHRpbWUgZGVwZW5kZW50LiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHlvdXIgZGlzcGxheSBtYW5hZ2VyOgotICAgZ2RtKDEpLCBrZG0oMSksIHhkbSgxKSwgZHRsb2dpbigxKSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLiBUaGVyZSBtYXkKLSAgIGFsc28gYmUgZGlzcGxheSBudW1iZXIgc3BlY2lmaWMgc2NyaXB0czogZS5nLiBYc2V0dXBfMCB2cy4gWHNldHVwLCB5b3UKLSAgIG5lZWQgdG8gd2F0Y2ggb3V0IGZvci4KLQotICAgTm90ZTogIFlvdSBzaG91bGQgcmVhZCBhbmQgdW5kZXJzdGFuZCBhbGwgb2YgdGhlIE5vdGUncyBhbmQgVXBkYXRlJ3MKLSAgIGluIHRoZSAnT25lIHRpbWUgb25seScgc2VjdGlvbiBhYm92ZS4gQWxsIG9mIHRoZSBHRE0gdG9waWNzIGFwcGx5IGhlcmUKLSAgIGFzIHdlbGw6Ci0KLSAgIE5vdGU6ICBHRE06IFRoZSBhYm92ZSAoaW4gJ09uZSB0aW1lIG9ubHknKSBnZG0gc2V0dGluZyBvZgotICAgS2lsbEluaXRDbGllbnRzPWZhbHNlIGluIC9ldGMvWDExL2dkbS9nZG0uY29uZiAob3IgL2V0Yy9nZG0vZ2RtLmNvbmYsCi0gICBldGMuKSBmb3IgR0RNIGlzIG5lZWRlZCBoZXJlIGFzIHdlbGwuIE90aGVyIGRpc3BsYXkgbWFuYWdlcnMgKEtETSwKLSAgIGV0YykgbWF5IGFsc28gaGF2ZSBhIHNpbWlsYXIgcHJvYmxlbS4KLQotICAgQWxzbyBzZWUgdGhlIFVwZGF0ZSBPY3QvMjAwOSBhYm92ZSB3aGVyZSB4MTF2bmMgMC45LjkgYW5kIGxhdGVyCi0gICBhdXRvbWF0aWNhbGx5IGF2b2lkcyBiZWluZyBraWxsZWQuCi0KLSAgIE5vdGU6ICBEdExvZ2luOiBUaGUgYWJvdmUgKGluICdPbmUgdGltZSBvbmx5JykKLSAgIER0bG9naW4qZ3JhYlNlcnZlcjpGYWxzZSBzdGVwIGZvciBTb2xhcmlzIHdpbGwgYmUgbmVlZGVkIGZvciBkdGxvZ2luCi0gICBoZXJlIGFzIHdlbGwuCi0KLSAgIEluIGFueSBldmVudCwgdGhlIGxpbmUgeW91IHdpbGwgYWRkIHRvIHRoZSBkaXNwbGF5IG1hbmFnZXIgc2NyaXB0Ci0gICAoWHNldHVwLCBEZWZhdWx0LCBvciB3aGF0ZXZlcikgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlOgotICAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLXJmYmF1dGggL3BhdGgvdG8vdGhlL3ZuYy9wYXNzd2QgLW8gL3Zhci9sb2cveDExdm5jLmxvZwotIC1mb3JldmVyIC1iZwotCi0gICB3aGVyZSB5b3Ugc2hvdWxkIGN1c3RvbWl6ZSB0aGUgZXhhY3QgY29tbWFuZCB0byB5b3VyIG5lZWRzIChlLmcuCi0gICAtbG9jYWxob3N0IGZvciBTU0ggdHVubmVsLW9ubHkgYWNjZXNzOyAtc3NsIFNBVkUgZm9yIFNTTCBhY2Nlc3M7IGV0Yy4pCi0KLSAgIEhhcHB5LCBoYXBweSwgam95LCBqb3k6ICBOb3RlIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSAtZGlzcGxheQotICAgb3IgLWF1dGggYmVjYXVzZSBoYXBwaWx5IHRoZXkgYXJlIGFscmVhZHkgc2V0IGZvciB1cyBpbiB0aGUgRElTUExBWQotICAgYW5kIFhBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgWHNldHVwIHNjcmlwdCEhIQotCi0gICBZb3UgbWF5IGFsc28gd2FudCB0byBmb3JjZSB0aGUgVk5DIHBvcnQgd2l0aCBzb21ldGhpbmcgbGlrZSAiLXJmYnBvcnQKLSAgIDU5MDAiIChvciAtTikgdG8gYXZvaWQgYXV0b3NlbGVjdGluZyBvbmUgaWYgNTkwMCBpcyBhbHJlYWR5IHRha2VuLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBGZWRvcmEvZ2RtOiBIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCB3ZSBkaWQgb24gYSB2YW5pbGxhIGluc3RhbGwgb2YKLSAgIEZlZG9yYS1DMyAoc2VlbXMgdG8gdXNlIGdkbSBieSBkZWZhdWx0LikgQWRkIGEgbGluZSBsaWtlIHRoaXMgdG8KLSAgIC9ldGMvWDExL2dkbS9Jbml0LzowCi0gIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtcmZiYXV0aCAvZXRjL3gxMXZuYy5wYXNzd2QgLWZvcmV2ZXIgLWJnIC1vIC92YXIvbG9nL3gxCi0xdm5jLmxvZwotCi0gICBBbmQgdGhlbiBhZGQgdGhpcyBsaW5lIHRvIC9ldGMvWDExL2dkbS9nZG0uY29uZiAob3IgL2V0Yy9nZG0vZ2RtLmNvbmYsCi0gICBldGMuKSBpbiB0aGUgW2RhZW1vbl0gc2VjdGlvbjoKLSAgS2lsbEluaXRDbGllbnRzPWZhbHNlCi0KLSAgIFRoZW4gcmVzdGFydDogL3Vzci9zYmluL2dkbS1yZXN0YXJ0IChvciByZWJvb3QuKSBUaGUKLSAgIEtpbGxJbml0Q2xpZW50cz1mYWxzZSBzZXR0aW5nIGlzIGltcG9ydGFudDogd2l0aG91dCBpdCB4MTF2bmMgd2lsbCBiZQotICAga2lsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2VyIGxvZ3MgaW4uIEhlcmUgYXJlIGZ1bGwgZGV0YWlscyBvbgotICAgaG93IHRvIGNvbmZpZ3VyZSBnZG0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgU29sYXJpcy9kdGxvZ2luOiBIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCB3ZSBkaWQgb24gYSB2YW5pbGxhCi0gICBpbnN0YWxsIG9mIFNvbGFyaXM6Ci0gICBNYWtlIHRoZSBkaXJlY3RvcnkgL2V0Yy9kdC9jb25maWc6Ci0gIG1rZGlyIC1wIC9ldGMvZHQvY29uZmlnCi0KLSAgIENvcHkgb3ZlciB0aGUgWGNvbmZpZyBmaWxlIGZvciBjdXN0b21pemF0aW9uOgotICBjcCAvdXNyL2R0L2NvbmZpZy9YY29uZmlnIC9ldGMvZHQvY29uZmlnL1hjb25maWcKLQotICAgRWRpdCAvZXRjL2R0L2NvbmZpZy9YY29uZmlnIGFuZCB1bmNvbW1lbnQgdGhlIGxpbmU6Ci0gIER0bG9naW4qZ3JhYlNlcnZlcjogICAgICAgIEZhbHNlCi0KLSAgIE5leHQsIGNvcHkgb3ZlciBYc2V0dXAgZm9yIGN1c3RvbWl6YXRpb246Ci0gIGNwIC91c3IvZHQvY29uZmlnL1hzZXR1cCAvZXRjL2R0L2NvbmZpZy9Yc2V0dXAKLQotICAgRWRpdCAvZXRjL2R0L2NvbmZpZy9Yc2V0dXAgYW5kIGF0IHRoZSBib3R0b20gcHV0IGEgbGluZSBsaWtlOgotICAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWZvcmV2ZXIgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtYmcKLQotICAgKHR3ZWFrZWQgdG8geW91ciBsb2NhbCBzZXR1cCBhbmQgcHJlZmVyZW5jZXMsIGEgcGFzc3dvcmQgdmlhIC1yZmJhdXRoLAotICAgZXRjLiB3b3VsZCBiZSBhIHZlcnkgZ29vZCBpZGVhLikKLQotICAgUmVzdGFydCB0aGUgWCBzZXJ2ZXIgYW5kIGR0bG9naW46Ci0gIC9ldGMvaW5pdC5kL2R0bG9naW4gc3RvcAotICAvZXRjL2luaXQuZC9kdGxvZ2luIHN0YXJ0Ci0KLSAgIChvciByZWJvb3Qgb3IgbWF5YmUganVzdCByZXN0YXJ0IHRoZSBYIHNlc3Npb24uKQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBLRE06IE9uZSB1c2VyIHJ1bm5pbmcgdGhlIGtkbSBkaXNwbGF5IG1hbmFnZXIgcmVwb3J0cyBwdXR0aW5nIHRoaXMKLSAgIGxpbmU6Ci0gIHgxMXZuYyAtZm9yZXZlciAtcmZiYXV0aCAvaG9tZS94eXovLnZuYy9wYXNzd2QgLWJnIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cKLQotICAgaW4gL2V0Yy9rZGUva2RtL1hzZXR1cC4gQWZ0ZXIgcmVib290aW5nIHRoZSBzeXN0ZW0gaXQgYWxsIHNlZW1lZCB0bwotICAgd29yayBmaW5lLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0KLSAgIElmIHlvdSBkbyBub3Qgd2FudCB0byBkZWFsIHdpdGggYW55IGRpc3BsYXkgbWFuYWdlciBzdGFydHVwIHNjcmlwdHMsCi0gICBoZXJlIGlzIGEga2x1ZGdleSBzY3JpcHQgdGhhdCBjYW4gYmUgcnVuIG1hbnVhbGx5IG9yIG91dCBvZiBhIGJvb3QKLSAgIGZpbGUgbGlrZSByYy5sb2NhbDogeDExdm5jX2xvb3AgSXQgd2lsbCBuZWVkIHNvbWUgbG9jYWwgY3VzdG9taXphdGlvbgotICAgYmVmb3JlIHJ1bm5pbmcuIEJlY2F1c2UgdGhlIFhBVVRIT1JJVFkgYXV0aCBmaWxlIG11c3QgYmUgZ3Vlc3NlZCBieQotICAgdGhpcyBzY3JpcHQsIHVzZSBvZiB0aGUgZGlzcGxheSBtYW5hZ2VyIHNjcmlwdCBtZXRob2QgZGVzY3JpYmVkIGFib3ZlCi0gICBpcyBncmVhdGx5IHByZWZlcnJlZC4gVGhlcmUgaXMgYWxzbyB0aGUgLWxvb3Agb3B0aW9uIHRoYXQgZG9lcwotICAgc29tZXRoaW5nIHNpbWlsYXIuCi0KLSAgIElmIHRoZSBtYWNoaW5lIGlzIGEgdHJhZGl0aW9uYWwgWHRlcm1pbmFsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoaXMKLSAgIEZBUS4KLQotICAgRmlyZXdhbGxzOiBub3RlIGFsbCBtZXRob2RzIHdpbGwgcmVxdWlyZSB0aGUgaG9zdC1sZXZlbCBmaXJld2FsbCB0byBiZQotICAgY29uZmlndXJlZCB0byBhbGxvdyBjb25uZWN0aW9ucyBpbiBvbiBhIHBvcnQuIEUuZy4gNTkwMCAoZGVmYXVsdCBWTkMKLSAgIHBvcnQpIG9yIDIyIChkZWZhdWx0IFNTSCBwb3J0IGZvciB0dW5uZWxsaW5nIFZOQy4pIE1vc3Qgc3lzdGVtcyB0aGVzZQotICAgZGF5cyBoYXZlIGZpcmV3YWxscyB0dXJuZWQgb24gYnkgZGVmYXVsdCwgc28geW91IHdpbGwgYWN0aXZlbHkgaGF2ZSB0bwotICAgZG8gc29tZXRoaW5nIHRvIHBva2UgYSBob2xlIGluIHRoZSBmaXJld2FsbCBhdCB0aGUgZGVzaXJlZCBwb3J0Ci0gICBudW1iZXIuIFNlZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdGlvbiB0b29sIGZvciBGaXJld2FsbCBzZXR0aW5ncwotICAgKFlhc3QsIEZpcmVzdGFydGVyLCBldGMuKQotCi0KLSAgIFEtNjA6IENhbiBJIHJ1biB4MTF2bmMgb3V0IG9mIGluZXRkKDgpPyBIb3cgYWJvdXQgeGluZXRkKDgpPwotCi0gICBZZXMsIHBlcmhhcHMgYSBsaW5lIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gL2V0Yy9pbmV0ZC5jb25mIHdpbGwgZG8gaXQKLSAgIGZvciB5b3U6Ci0KLSAgNTkwMCBzdHJlYW0gdGNwIG5vd2FpdCByb290IC91c3Ivc2Jpbi90Y3BkIC91c3IvbG9jYWwvYmluL3gxMXZuY19zaAotCi0gICB3aGVyZSB0aGUgc2hlbGwgc2NyaXB0IC91c3IvbG9jYWwvYmluL3gxMXZuY19zaCB1c2VzIHRoZSAtaW5ldGQgb3B0aW9uCi0gICBhbmQgbG9va3Mgc29tZXRoaW5nIGxpa2UgKHlvdSdsbCBuZWVkIHRvIGN1c3RvbWl6ZSB0byB5b3VyIHNldHRpbmdzLikKLSMhL2Jpbi9zaAotL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCAtZGlzcGxheSA6MCAtYXV0aCAvaG9tZS9mcmVkLy5YYXV0aG9yaXR5IFwKLSAgICAgICAgLXJmYmF1dGggL2hvbWUvZnJlZC8udm5jL3Bhc3N3ZCAtbyAvdmFyL2xvZy94MTF2bmNfc2gubG9nCi0KLSAgIEltcG9ydGFudDogIE5vdGUgdGhhdCB5b3UgbXVzdCByZWRpcmVjdCB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHRvIGEKLSAgIGxvZyBmaWxlIChlLmcuIC1vIGxvZ2ZpbGUpIG9yICIyPi9kZXYvbnVsbCIgZm9yIHByb3BlciBvcGVyYXRpb24gdmlhCi0gICBpbmV0ZCAob3RoZXJ3aXNlIHRoZSBzdGFuZGFyZCBlcnJvciBhbHNvIGdvZXMgdG8gdGhlIFZOQyB2bmN2aWV3ZXIsCi0gICBhbmQgdGhhdCBjb25mdXNlcyBpdCBncmVhdGx5LCBjYXVzaW5nIGl0IHRvIGFib3J0LikgSWYgeW91IGRvIG5vdCB1c2UKLSAgIGEgd3JhcHBlciBzY3JpcHQgYXMgYWJvdmUgYnV0IHJhdGhlciBjYWxsIHgxMXZuYyBkaXJlY3RseSBpbgotICAgL2V0Yy9pbmV0ZC5jb25mIGFuZCBkbyBub3QgcmVkaXJlY3Qgc3RkZXJyIHRvIGEgZmlsZSwgdGhlbiB5b3UgbXVzdAotICAgc3BlY2lmeSB0aGUgLXEgKGFrYSAtcXVpZXQpIG9wdGlvbjogIi91c3IvbG9jYWwvYmluL3gxMXZuYyAtcSAtaW5ldGQKLSAgIC4uLiIuIFdoZW4geW91IHN1cHBseSBib3RoIC1xIGFuZCAtaW5ldCBhbmQgbm8gIi1vIGxvZ2ZpbGUiIHRoZW4KLSAgIHN0ZGVyciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xvc2VkICh0byBwcmV2ZW50LCBlLmcuIGxpYnJhcnkgc3RkZXJyCi0gICBtZXNzYWdlcyBsZWFraW5nIG91dCB0byB0aGUgdmlld2VyLikgVGhlIHJlY29tbWVuZGVkIHByYWN0aWNlIGlzIHRvCi0gICB1c2UgIi1vIGxvZ2ZpbGUiIHRvIGNvbGxlY3QgdGhlIG91dHB1dCBpbiBhIGZpbGUgb3Igd3JhcHBlciBzY3JpcHQKLSAgIHdpdGggIjI+bG9nZmlsZSIgcmVkaXJlY3Rpb24gYmVjYXVzZSB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBwcmludGVkCi0gICBvdXQgYXJlIHZlcnkgdXNlZnVsIGluIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcy4KLQotICAgTm90ZSBhbHNvIHRoZSBuZWVkIHRvIHNldCBYQVVUSE9SSVRZIHZpYSAtYXV0aCB0byBwb2ludCB0byB0aGUKLSAgIE1JVC1DT09LSUUgYXV0aCBmaWxlIHRvIGdldCBwZXJtaXNzaW9uIHRvIGNvbm5lY3QgdG8gdGhlIFggZGlzcGxheQotICAgKHNldHRpbmcgYW5kIGV4cG9ydGluZyB0aGUgWEFVVEhPUklUWSB2YXJpYWJsZSBhY2NvbXBsaXNoZXMgdGhlIHNhbWUKLSAgIHRoaW5nLikgU2VlIHRoZSB4MTF2bmNfbG9vcCBmaWxlIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBmb3IgbW9yZQotICAgaWRlYXMgb24gd2hhdCB0aGF0IGF1dGggZmlsZSBtYXkgYmUsIGV0Yy4gVGhlIHNjaGVtZSBkZXNjcmliZWQgaW4gdGhlCi0gICBGQVEgb24gVW5peCB1c2VyIGxvZ2lucyBhbmQgaW5ldGQoOCkgd29ya3MgYXJvdW5kIHRoZSBYQVVUSE9SSVRZIGlzc3VlCi0gICBuaWNlbHkuCi0KLSAgIE5vdGU6ICBPbiBTb2xhcmlzIHlvdSBjYW5ub3QgaGF2ZSB0aGUgYmFyZSBudW1iZXIgNTkwMCBpbgotICAgL2V0Yy9pbmV0ZC5jb25mLCB5b3UnbGwgbmVlZCB0byByZXBsYWNlIGl0IHdpdGggYSB3b3JkIGxpa2UgeDExdm5jIGFuCi0gICB0aGVuIHB1dCBzb21ldGhpbmcgbGlrZSAieDExdm5jIDU5MDAvdGNwIiBpbiAvZXRjL3NlcnZpY2VzLgotCi0gICBTaW5jZSB0aGUgcHJvY2VzcyBydW5zIGFzIHJvb3QsIGl0IG1pZ2h0IGJlIGEgYmFkIGlkZWEgdG8gaGF2ZSB0aGUKLSAgIGxvZ2ZpbGUgaW4gYSB3b3JsZC13cml0YWJsZSBhcmVhIGxpa2UgL3RtcCBpZiB0aGVyZSBhcmUgdW50cnVzdHdvcnRoeQotICAgdXNlcnMgb24gdGhlIG1hY2hpbmUuIFBlcmhhcHMgL3Zhci9sb2cgaXMgYSBiZXR0ZXIgcGxhY2UuCi0KLSAgIEJlIHN1cmUgdG8gbG9vayBhdCB5b3VyIC9ldGMvaG9zdHMuYWxsb3cgYW5kIC9ldGMvaG9zdHMuZGVueSBzZXR0aW5ncwotICAgdG8gbGltaXQgdGhlIG1hY2hpbmVzIHRoYXQgY2FuIGNvbm5lY3QgdG8gdGhpcyBzZXJ2aWNlICh5b3VyIGRlc2t0b3AhKQotICAgRm9yIHRoZSBhYm92ZSBleGFtcGxlIHdpdGggL2V0Yy9ob3N0cy5hbGxvdzoKLSAgeDExdm5jX3NoIDogMTIzLjQ1LjY3Ljg5Ci0KLSAgIEEgcmVhbGx5IHNhZmUgd2F5IHRvIGRvIHRoaW5ncyBpcyB0byBsaW1pdCB0aGUgYWJvdmUgaW5ldGQgdG8KLSAgIGxvY2FsaG9zdCBvbmx5ICh2aWEgL2V0Yy9ob3N0cy5hbGxvdykgYW5kIHVzZSBzc2ggdG8gdHVubmVsIHRoZQotICAgaW5jb21pbmcgY29ubmVjdGlvbi4gVXNpbmcgaW5ldGQgZm9yIHRoaXMgcHJldmVudHMgdGhlcmUgYmVpbmcgYSB0aW55Ci0gICB3aW5kb3cgb2Ygb3Bwb3J0dW5pdHkgYmV0d2VlbiB4MTF2bmMgc3RhcnRpbmcgdXAgYW5kIHlvdXIgdm5jdmlld2VyCi0gICBjb25uZWN0aW5nIHRvIGl0LiBBbHdheXMgdXNlIGEgVk5DIHBhc3N3b3JkIHRvIGZ1cnRoZXIgcHJvdGVjdCBhZ2FpbnN0Ci0gICB1bndhbnRlZCBhY2Nlc3MuCi0KLSAgIEZvciB4aW5ldGQoOCksIG9uZSB1c2VyIHJlcG9ydHMgaGUgY3JlYXRlZCB0aGUgZmlsZQotICAgL2V0Yy94aW5ldGQuZC94MTF2bmNzZXJ2aWNlIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZzoKLSMgZGVmYXVsdDogb2ZmCi0jIGRlc2NyaXB0aW9uOgotc2VydmljZSB4MTF2bmNzZXJ2aWNlCi17Ci0gICAgICAgIGZsYWdzICAgICAgICAgICA9IFJFVVNFIE5BTUVJTkFSR1MKLSAgICAgICAgcG9ydCAgICAgICAgICAgID0gNTkwMAotICAgICAgICB0eXBlICAgICAgICAgICAgPSBVTkxJU1RFRAotICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KLSAgICAgICAgcHJvdG9jb2wgICAgICAgID0gdGNwCi0gICAgICAgIHdhaXQgICAgICAgICAgICA9IG5vCi0gICAgICAgIHVzZXIgICAgICAgICAgICA9IHJvb3QKLSAgICAgICAgc2VydmVyICAgICAgICAgID0gL3Vzci9zYmluL3RjcGQKLSAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gL3Vzci9sb2NhbC9iaW4veDExdm5jX3NoCi0gICAgICAgIGRpc2FibGUgICAgICAgICA9IG5vCi19Ci0KLSAgIFdpdGggdGhlIGNvbnRlbnRzIG9mIC91c3IvbG9jYWwvYmluL3gxMXZuY19zaCBzaW1pbGFyIHRvIHRoZSBleGFtcGxlCi0gICBnaXZlbiBhYm92ZS4gT25lIHVzZXIgcmVwb3J0cyB0aGlzIHdvcmtzIHdpdGggYXZvaWRpbmcgdGhlIHdyYXBwZXIKLSAgIHNjcmlwdDoKLXNlcnZpY2UgeDExdm5jc2VydmljZQotewotICAgICAgICBwb3J0ICAgICAgICAgICAgPSA1OTAwCi0gICAgICAgIHR5cGUgICAgICAgICAgICA9IFVOTElTVEVECi0gICAgICAgIHNvY2tldF90eXBlICAgICA9IHN0cmVhbQotICAgICAgICBwcm90b2NvbCAgICAgICAgPSB0Y3AKLSAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KLSAgICAgICAgdXNlciAgICAgICAgICAgID0gcm9vdAotICAgICAgICBzZXJ2ZXIgICAgICAgICAgPSAvdXNyL2xvY2FsL2Jpbi94MTF2bmMKLSAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLWluZXRkIC1xIC1kaXNwbGF5IDowIC1hdXRoIC92YXIvZ2RtLzowLlhhdXRoCi0gICAgICAgIGRpc2FibGUgICAgICAgICA9IG5vCi19Ci0KLSAgIChvciBvbmUgY2FuIHJlcGxhY2UgdGhlIC1xIHdpdGggc2F5ICItbyAvdmFyL2xvZy94MTF2bmMubG9nIiB0bwotICAgY2FwdHVyZSBhIGxvZykKLQotICAgVGhlIGFib3ZlIHdvcmtzIG5pY2VseSBmb3IgR0RNIGJlY2F1c2UgdGhlIC1hdXRoIGZpbGUgaXMgYSBmaXhlZCBuYW1lLgotICAgRm9yIEtETSBvciBYRE0gdGhlIGZpbGVuYW1lIHZhcmllcy4gSGVyZSBpcyBvbmUgaWRlYSBmb3IgYSB4MTF2bmNfc2gKLSAgIHdyYXBwZXIgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBuYW1lOgotIyEvYmluL3NoCi1DT0xVTU5TPTI1NgotZXhwb3J0IENPTFVNTlMKLWF1dGhmaWxlPWBwcyB3d2F1eCB8IGdyZXAgJy9YLiotYXV0aCcgfCBncmVwIC12IGdyZXAgfCBzZWQgLWUgJ3MvXi4qLWF1dGggKi8vJwotLWUgJ3MvIC4qJC8vJyB8IGhlYWQgLW4gMWAKLQotaWYgWyAtciAiJGF1dGhmaWxlIiBdOyB0aGVuCi0gICAgICAgIGV4ZWMgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCAtbyAvdmFyL2xvZy94MTF2bmMubG9nIC1kaXNwbGF5IDowIC1hCi11dGggIiRhdXRoZmlsZSIKLWZpCi1leGl0IDEKLQotICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjMgdGhpcyBjYW4gYmUgYXV0b21hdGVkIGJ5OgotIyEvYmluL3NoCi1leGVjIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtZmluZCAtZW52IEZEX1hETT0xCi0KLQotICAgUS02MTogQ2FuIEkgaGF2ZSB4MTF2bmMgYWR2ZXJ0aXNlIGl0cyBWTkMgc2VydmljZSBhbmQgcG9ydCB2aWEgbUROUyAvCi0gICBaZXJvY29uZiAoZS5nLiBBdmFoaSkgc28gVk5DIHZpZXdlcnMgb24gdGhlIGxvY2FsIG5ldHdvcmsgY2FuIGRldGVjdAotICAgaXQgYXV0b21hdGljYWxseT8KLQotICAgWWVzLCBhcyBvZiBGZWIvMjAwNyB4MTF2bmMgc3VwcG9ydHMgbUROUyAvIFplcm9jb25mIGFkdmVydGlzaW5nIG9mIGl0cwotICAgc2VydmljZSB2aWEgdGhlIEF2YWhpIGNsaWVudCBsaWJyYXJ5LiBVc2UgdGhlIG9wdGlvbiAtYXZhaGkgKHNhbWUgYXMKLSAgIC1tZG5zIG9yIC16ZXJvY29uZikgdG8gZW5hYmxlIGl0LiBEZXBlbmRpbmcgb24geW91ciBzZXR1cCB5b3UgbWF5IG5lZWQKLSAgIHRvIGluc3RhbGwgQXZhaGkgKGluY2x1ZGluZyB0aGUgZGV2ZWxvcG1lbnQvYnVpbGQgcGFja2FnZXMpLCBlbmFibGUKLSAgIHRoZSBzZXJ2ZXI6IGF2YWhpLWRhZW1vbiBhbmQgYXZhaGktZG5zY29uZmQsIGFuZCBwb3NzaWJseSBvcGVuIHVwIFVEUAotICAgcG9ydCA1MzUzIG9uIHlvdXIgZmlyZXdhbGwuCi0KLSAgIElmIHRoZSBBdmFoaSBjbGllbnQgbGlicmFyeSBvciBidWlsZCBlbnZpcm9ubWVudCBpcyBub3QgYXZhaWxhYmxlIGF0Ci0gICBidWlsZC10aW1lLCB0aGVuIGF0IHJ1bi10aW1lIHgxMXZuYyB3aWxsIHRyeSB0byBsb29rIGZvciBleHRlcm5hbAotICAgaGVscGVyIHByb2dyYW1zLCBhdmFoaS1icm93c2UoMSkgb3IgZG5zLXNkKDEpLCB0byBkbyB0aGUgd29yay4KLQotICAgVGhlIHNlcnZpY2Ugd2FzIHRlc3RlZCB3aXRoIENoaWNrZW4gb2YgdGhlIFZOQyAoIlVzZSBCb25qb3VyIgotICAgc2VsZWN0ZWQpIG9uIGEgTWFjIG9uIHRoZSBzYW1lIG5ldHdvcmsgYW5kIHRoZSBzZXJ2aWNlIHdhcyBub3RlZCBhbmQKLSAgIGxpc3RlZCBpbiB0aGUgc2VydmVycyBsaXN0LiBDbGlja2luZyBvbiBpdCBhbmQgdGhlbiAiQ29ubmVjdCIKLSAgIGNvbm5lY3RlZCBhdXRvbWF0aWNhbGx5IHcvbyBoYXZpbmcgdG8gZW50ZXIgYW55IGhvc3RuYW1lcyBvciBwb3J0Ci0gICBudW1iZXJzLgotCi0gICBJdCBhcHBlYXJzIFN1U0UgMTAuMSBjb21lcyB3aXRoIGF2YWhpIChvciB5b3UgY2FuIGFkZCBwYWNrYWdlcywgZS5nLgotICAgYXZhaGktMC42LjUtMjcpIGJ1dCBub3QgdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgKHlvdSBjYW4gdXNlIHRoZQotICAgT3BlblN1U0UgYXZhaGktZGV2ZWwgcnBtLikgVW5mb3J0dW5hdGVseSwgeW91IG1heSBuZWVkIHRvIGRpc2FibGUKLSAgIGFub3RoZXIgWmVyb2NvbmYgZGFlbW9uICIvZXRjL2luaXQuZC9tZG5zZCBzdG9wIiwgYmVmb3JlIGRvaW5nCi0gICAiL2V0Yy9pbml0LmQvYXZhaGktZGFlbW9uIHN0YXJ0IiBhbmQgIi9ldGMvaW5pdC5kL2F2YWhpLWRuc2NvbmZkCi0gICBzdGFydCIuIFdlIGFsc28gaGFkIHRvIGNvbW1lbnQgb3V0IHRoZSBicm93c2UtZG9tYWlucyBsaW5lIGluCi0gICAvZXRjL2F2YWhpL2F2YWhpLWRhZW1vbi5jb25mLiBIb3BlZnVsbHkgdGhlcmUgaXMgIkxlc3NDb25mIiB0byBkbyBvbgotICAgb3RoZXIgZGlzdHJvcy9PUydzLi4uCi0KLQotICAgUS02MjogQ2FuIEkgaGF2ZSB4MTF2bmMgYWxsb3cgYSB1c2VyIHRvIGxvZyBpbiB3aXRoIGhlciBVTklYIHVzZXJuYW1lCi0gICBhbmQgcGFzc3dvcmQgYW5kIHRoZW4gaGF2ZSBpdCBmaW5kIGhlciBYIHNlc3Npb24gZGlzcGxheSBvbiB0aGF0Ci0gICBtYWNoaW5lIGFuZCB0aGVuIGF0dGFjaCB0byBpdD8gSG93IGFib3V0IHN0YXJ0aW5nIGFuIFggc2Vzc2lvbiBpZiBvbmUKLSAgIGNhbm5vdCBiZSBmb3VuZD8KLQotICAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdmlhIGluZXRkKDgpIHVzaW5nIHRoZSAtdW5peHB3IGFuZAotICAgLWRpc3BsYXkgV0FJVCBvcHRpb25zLiBUaGUgcmVhc29uIGluZXRkKDgpIG1ha2VzIHRoaXMgZWFzaWVyIGlzIHRoYXQKLSAgIGl0IHN0YXJ0cyBhIG5ldyB4MTF2bmMgcHJvY2VzcyBmb3IgZWFjaCBuZXcgdXNlciBjb25uZWN0aW9uLiBPdGhlcndpc2UKLSAgIGEgd3JhcHBlciB3b3VsZCBoYXZlIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgYW5kIHNwYXduIG5ldyB4MTF2bmMncwotICAgKHNlZSB0aGlzIGV4YW1wbGUgYW5kIGFsc28gdGhlIC1sb29wYmcgb3B0aW9uLikgaW5ldGQoOCkgaXMgbm90Ci0gICByZXF1aXJlZCBmb3IgdGhpcywgYnV0IGl0IG1ha2VzIHNvbWUgYXNwZWN0cyBtb3JlIGdlbmVyYWwuCi0KLSAgIEFsc28gd2l0aCBpbmV0ZCg4KSB1c2VycyBhbHdheXMgY29ubmVjdCB0byBhIGZpeGVkIFZOQyBkaXNwbGF5LCBzYXkKLSAgIGhvc3RuYW1lOjAsIGFuZCBkbyBub3QgbmVlZCB0byBtZW1vcml6ZSBhIHNwZWNpYWwgVk5DIGRpc3BsYXkgbnVtYmVyCi0gICBqdXN0IGZvciB0aGVpciBwZXJzb25hbCB1c2UsIGV0Yy4KLQotICAgVXBkYXRlOiBVc2UgdGhlIC1maW5kLCAtY3JlYXRlLCAtc3ZjLCBhbmQgLXhkbXN2YyBvcHRpb25zIHRoYXQgYXJlCi0gICBzaG9ydGhhbmQgZm9yIGNvbW1vbiBGSU5EQ1JFQVRFRElTUExBWSB1c2FnZSBtb2RlcyAoZS5nLiB0ZXJtaW5hbAotICAgc2VydmljZXMpIGRlc2NyaWJlZCBiZWxvdy4gKGkuZS4gc2ltcGx5IHVzZSAiLXN2YyIgaW5zdGVhZCBvZiB0aGUKLSAgIGN1bWJlcnNvbWUgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIgLXVuaXhwdyAtdXNlcnMKLSAgIHVuaXhwdz0gLXNzbCBTQVZFIikKLQotICAgVGhlIC1kaXNwbGF5IFdBSVQgb3B0aW9uIG1ha2VzIHgxMXZuYyB3YWl0IHVudGlsIGEgVk5DIHZpZXdlciBpcwotICAgY29ubmVjdGVkIGJlZm9yZSBhdHRhY2hpbmcgdG8gdGhlIFggZGlzcGxheS4KLQotICAgQWRkaXRpb25hbGx5IGl0IGNhbiBiZSB1c2VkIHRvIHJ1biBhbiBleHRlcm5hbCBjb21tYW5kIHRoYXQgcmV0dXJucwotICAgdGhlIERJU1BMQVkgYW5kIFhBVVRIT1JJVFkgZGF0YS4gV2UgcHJvdmlkZSBzb21lIHVzZWZ1bCBidWlsdGluIG9uZXMKLSAgIChGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgYmVsb3cpLCBidXQgaW4gcHJpbmNpcGxlIG9uZSBjb3VsZAotICAgc3VwcGx5IGhpcyBvd24gc2NyaXB0OiAiLWRpc3BsYXkgV0FJVDpjbWQ9L3BhdGgvdG8vZmluZF9kaXNwbGF5IiB3aGVyZQotICAgdGhlIHNjcmlwdCBmaW5kX2Rpc3BsYXkgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzLgotCi0gICBBIGRlZmF1bHQgc2NyaXB0IHNvbWV3aGF0IGxpa2UgdGhlIGFib3ZlIGlzIHVzZWQgdW5kZXIgIi1kaXNwbGF5Ci0gICBXQUlUOmNtZD1GSU5ERElTUExBWSIgKHNhbWUgYXMgLWZpbmQpIFRoZSBmb3JtYXQgZm9yIGFueSBzdWNoIGNvbW1hbmQKLSAgIGlzIHRoYXQgaXQgcmV0dXJucyBESVNQTEFZPTpkaXNwIGFzIHRoZSBmaXJzdCBsaW5lIGFuZCBhbnkgcmVtYWluaW5nCi0gICBsaW5lcyBhcmUgZWl0aGVyIFhBVVRIT1JJVFk9ZmlsZSBvciByYXcgeGF1dGggZGF0YSAodGhlIGFib3ZlIGV4YW1wbGUKLSAgIGRvZXMgdGhlIGxhdHRlci4pIElmIGFwcGxpY2FibGUgKC11bml4cHcgbW9kZSksIHRoZSBwcm9ncmFtIGlzIHJ1biBhcwotICAgdGhlIFVuaXggdXNlciBuYW1lIHdobyBsb2dnZWQgaW4uCi0KLSAgIE9uIExpbnV4IGlmIHRoZSB2aXJ0dWFsIHRlcm1pbmFsIGlzIGtub3duIHRoZSBwcm9ncmFtIGFwcGVuZHMgIixWVD1uIgotICAgdG8gdGhlIERJU1BMQVkgbGluZTsgYSBjaHZ0IG4gd2lsbCBiZSBhdHRlbXB0ZWQgYXV0b21hdGljYWxseS4gT3IgaWYKLSAgIG9ubHkgdGhlIFggc2VydmVyIHByb2Nlc3MgSUQgaXMga25vd24gaXQgYXBwZW5kcyAiLFhQSUQ9biIgKGEgY2h2dAotICAgd2lsbCBiZSBhdHRlbXB0ZWQgYnkgeDExdm5jLikKLQotICAgVGlwOiBOb3RlIHRoYXQgdGhlIC1maW5kIG9wdGlvbiBpcyBhbiBhbGlhcyBmb3IgIi1kaXNwbGF5Ci0gICBXQUlUOmNtZD1GSU5ERElTUExBWSIuIFVzZSBpdCEKLQotICAgVGhlIC11bml4cHcgb3B0aW9uIGFsbG93cyBVTklYIHBhc3N3b3JkIGxvZ2lucy4gSXQgY29udmVuaWVudGx5IGtub3dzCi0gICB0aGUgVW5peCB1c2VybmFtZSB3aG9zZSBYIGRpc3BsYXkgc2hvdWxkIGJlIGZvdW5kLiBIZXJlIGFyZSBhIGNvdXBsZQotICAgL2V0Yy9pbmV0ZC5jb25mIGV4YW1wbGVzIG9mIHRoaXMgdXNhZ2U6Ci01OTAwICBzdHJlYW0gIHRjcCAgbm93YWl0ICBub2JvZHkgIC91c3Ivc2Jpbi90Y3BkIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQKLS11bml4cHcgXAotICAgICAgLWZpbmQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtc3NsIFNBVkUgLXNzbGRpciAvdXNyL2xvY2FsL2NlcnRzCi01OTAwICBzdHJlYW0gIHRjcCAgbm93YWl0ICByb290ICAgIC91c3Ivc2Jpbi90Y3BkIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQKLS11bml4cHcgXAotICAgICAgLWZpbmQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtc3NsIFNBVkUgLXVzZXJzIHVuaXhwdz0KLQotICAgTm90ZSB3ZSBoYXZlIHVzZWQgdGhlIC1maW5kIGFsaWFzIGFuZCB0aGUgdmVyeSBsb25nIGxpbmVzIGhhdmUgYmVlbgotICAgc3BsaXQuIEFuIGFsdGVybmF0aXZlIGlzIHRvIHVzZSBhIHdyYXBwZXIgc2NyaXB0LCBlLmcuCi0gICAvdXNyL2xvY2FsL2Jpbi94MTF2bmMuc2ggdGhhdCBoYXMgYWxsIG9mIHRoZSBvcHRpb25zLiAoc2VlIGFsc28gdGhlCi0gICAtc3ZjIGFsaWFzLikKLQotICAgSW4gdGhlIGZpcnN0IGluZXRkIGxpbmUgeDExdm5jIGlzIHJ1biBhcyB1c2VyICJub2JvZHkiIGFuZCBzdGF5cyB1c2VyCi0gICBub2JvZHkgZHVyaW5nIHRoZSB3aG9sZSBzZXNzaW9uLiBUaGUgcGVybWlzc2lvbnMgb2YgdGhlIGxvZyBmaWxlcyBhbmQKLSAgIGNlcnRzIGRpcmVjdG9yeSB3aWxsIG5lZWQgdG8gYmUgc2V0IHVwIHRvIGFsbG93ICJub2JvZHkiIHRvIHVzZSB0aGVtLgotCi0gICBJbiB0aGUgc2Vjb25kIG9uZSB4MTF2bmMgaXMgcnVuIGFzIHJvb3QgYW5kIHN3aXRjaGVzIHRvIHRoZSB1c2VyIHRoYXQKLSAgIGxvZ3MgaW4gZHVlIHRvIHRoZSAiLXVzZXJzIHVuaXhwdz0iIG9wdGlvbi4KLQotICAgTm90ZSB0aGF0IFNTTCBpcyByZXF1aXJlZCBmb3IgdGhpcyBtb2RlIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBVbml4Ci0gICBwYXNzd29yZCB3b3VsZCBiZSBwYXNzZWQgaW4gY2xlYXIgdGV4dCBvdmVyIHRoZSBuZXR3b3JrLiBJbiBnZW5lcmFsCi0gICAtdW5peHB3IGlzIG5vdCByZXF1aXJlZCBmb3IgdGhpcyBzb3J0IG9mIHNjaGVtZSwgYnV0IGl0IGlzIGNvbnZlbmllbnQKLSAgIGJlY2F1c2UgaXQgZGV0ZXJtaW5lcyBleGFjdGx5IHdobyB0aGUgVW5peCB1c2VyIGlzIHdob3NlIGRpc3BsYXkKLSAgIHNob3VsZCBiZSBzb3VnaHQuIE90aGVyd2lzZSB0aGUgZmluZF9kaXNwbGF5IHNjcmlwdCB3b3VsZCBoYXZlIHRvIHVzZQotICAgc29tZSBtZXRob2QgdG8gd29yayBvdXQgRElTUExBWSwgWEFVVEhPUklUWSwgZXRjIChwZXJoYXBzIHlvdSB1c2UKLSAgIG11bHRpcGxlIGluZXRkIHBvcnRzIGFuZCBoYXJkd2lyZSB1c2VybmFtZXMgZm9yIGRpZmZlcmVudCBwb3J0cy4pCi0KLSAgIElmIHlvdSByZWFsbHkgd2FudCB0byBkaXNhYmxlIHRoZSBTU0wgb3IgU1NIIC1sb2NhbGhvc3QgY29uc3RyYWludHMKLSAgICh0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZzoKLSAgIFVuaXggcGFzc3dvcmRzIHNlbnQgaW4gY2xlYXIgdGV4dCBpcyBhIHZlcnkgYmFkIGlkZWEuLi4pIHJlYWQgdGhlCi0gICAtdW5peHB3IGRvY3VtZW50YXRpb24uCi0KLSAgIEEgaW5ldGQoOCkgc2NoZW1lIGZvciBhIGZpeGVkIHVzZXIgdGhhdCBkb2Vzbid0IHVzZSBTU0wgb3IgdW5peAotICAgcGFzc3dkcyBjb3VsZCBiZToKLSAgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCAtdXNlcnMgPWZyZWQgLWZpbmQgLXJmYmF1dGggL2hvbWUvZnJlZC8udm5jL3Bhc3MKLXdkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cKLQotICAgVGhlICItdXNlcnMgPWZyZWQiIG9wdGlvbiB3aWxsIGNhdXNlIHgxMXZuYyB0byBzd2l0Y2ggdG8gdXNlciBmcmVkIGFuZAotICAgdGhlbiBmaW5kIGhpcyBYIGRpc3BsYXkuIFRoZSBWTkMgcGFzc3dvcmQgKC1yZmJhdXRoKSBhcyBvcHBvc2VkIHRvCi0gICBVbml4IHBhc3N3b3JkICgtdW5peHB3KSBpcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgVk5DIGNsaWVudC4KLQotICAgU2ltaWxhciBsb29raW5nIGNvbW1hbmRzIHRvIHRoZSBhYm92ZSBleGFtcGxlcyBjYW4gYmUgcnVuIGRpcmVjdGx5IGFuZAotICAgZG8gbm90IHVzZSBpbmV0ZCAoanVzdCByZW1vdmUgdGhlIC1pbmV0ZCBvcHRpb24gYW5kIHJ1biBmcm9tIHRoZQotICAgY21kbGluZSwgZXRjLikKLQotCi0gICBYIFNlc3Npb24gQ3JlYXRpb246IEFuIGFkZGVkIChOb3YvMjAwNikgZXh0ZW5zaW9uIHRvIEZJTkRESVNQTEFZIGlzCi0gICBGSU5EQ1JFQVRFRElTUExBWSB3aGVyZSBpZiBpdCBkb2VzIG5vdCBmaW5kIGFuIFggZGlzcGxheSB2aWEgdGhlCi0gICBGSU5ERElTUExBWSBtZXRob2QgaXQgd2lsbCBjcmVhdGUgYW4gWCBzZXJ2ZXIgc2Vzc2lvbiBmb3IgdGhlIHVzZXIKLSAgIChpLmUuIGRlc2t0b3AvdGVybWluYWwgc2VydmVyLikgVGhpcyBpcyB0aGUgb25seSB0aW1lIHgxMXZuYyBhY3R1YWxseQotICAgdHJpZXMgdG8gc3RhcnQgdXAgYW4gWCBzZXJ2ZXIgKG5vcm1hbGx5IGl0IGp1c3QgYXR0YWNoZXMgdG8gYW4KLSAgIGV4aXN0aW5nIG9uZS4pCi0KLSAgIEZvciB2aXJ0dWFsIHNlc3Npb25zIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgWHZmYiBwcm9ncmFtIChlLmcuCi0gICBhcHQtZ2V0IGluc3RhbGwgeHZmYikgb3Igb3VyIFhkdW1teSBwcm9ncmFtIChzZWUgYmVsb3cuKQotCi0gICBCeSBkZWZhdWx0IGl0IHdpbGwgb25seSB0cnkgdG8gc3RhcnQgdXAgdmlydHVhbCAobm9uLWhhcmR3YXJlKSBYCi0gICBzZXJ2ZXJzOiBmaXJzdCBYdmZiIGFuZCBpZiB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiBYZHVtbXkgKGluY2x1ZGVkCi0gICBpbiB0aGUgeDExdm5jIHNvdXJjZSBjb2RlLikgTm90ZSB0aGF0IFhkdW1teSBvbmx5IHdvcmtzIG9uIExpbnV4Ci0gICB3aGVyZWFzIFh2ZmIgd29ya3MganVzdCBhYm91dCBldmVyeXdoZXJlIChhbmQgaW4gc29tZSBzaXR1YXRpb25zCi0gICBYZHVtbXkgbXVzdCBiZSBydW4gYXMgcm9vdC4pIEFuIGFkdmFudGFnZSBvZiBYZHVtbXkgb3ZlciBYdmZiIGlzIHRoYXQKLSAgIFhkdW1teSBzdXBwb3J0cyBSQU5EUiBkeW5hbWljIHNjcmVlbiByZXNpemluZywgd2hpY2ggY2FuIGJlIGhhbmR5IGlmCi0gICB0aGUgdXNlciBhY2Nlc3NlcyB0aGUgZGVza3RvcCBmcm9tIGRpZmZlcmVudCBzaXplZCBzY3JlZW5zIChlLmcuCi0gICB3b3Jrc3RhdGlvbiBhbmQgbGFwdG9wLikKLQotICAgU28gYW4gaW5ldGQoOCkgZXhhbXBsZSBtaWdodCBsb29rIGxpa2U6Ci01OTAwIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCBcCi0gICAgICAtbyAvdmFyL2xvZy94MTF2bmMubG9nIC1odHRwIC1wcm9nIC91c3IvbG9jYWwvYmluL3gxMXZuYyBcCi0gICAgICAtc3NsIFNBVkUgLXVuaXhwdyAtdXNlcnMgdW5peHB3PSAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWQotCi0gICBXaGVyZSB0aGUgdmVyeSBsb25nIGxpbmVzIGhhdmUgYmVlbiBzcGxpdC4gU2VlIGJlbG93IHdoZXJlIHRoYXQgbG9uZwotICAgYW5kIGN1bWJlcnNvbWUgbGFzdCBsaW5lIGlzIHJlcGxhY2VkIGJ5IHRoZSAtc3ZjIGFsaWFzLgotCi0gICBUaGUgYWJvdmUgbW9kZSB3aWxsIGFsbG93IGRpcmVjdCBTU0wgKGUuZy4gc3Nfdm5jdmlld2VyIG9yIFNTVk5DKQotICAgYWNjZXNzIGFuZCBhbHNvIEphdmEgV2ViIGJyb3dlcnMgYWNjZXNzIHZpYTogaHR0cHM6Ly9ob3N0bmFtZTo1OTAwLy4KLQotICAgVGlwOiBOb3RlIHRoYXQgdGhlIC1jcmVhdGUgb3B0aW9uIGlzIGFuIGFsaWFzIGZvciAiLWRpc3BsYXkKLSAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIiLgotCi0gICBUaXA6IE5vdGUgdGhhdCAtc3ZjIGlzIGEgc2hvcnQgaGFuZCBmb3IgdGhlIGxvbmcgIi1zc2wgU0FWRSAtdW5peHB3Ci0gICAtdXNlcnMgdW5peHB3PSAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSIgcGFydC4gVW5saWtlCi0gICAtY3JlYXRlLCB0aGlzIGFsaWFzIGFsc28gc2V0cyB1cCBTU0wgZW5jcnlwdGlvbiBhbmQgVW5peCBwYXNzd29yZAotICAgbG9naW4uCi0KLSAgIFRoZSBhYm92ZSBpbmV0ZCBleGFtcGxlIHRoZW4gc2ltcGxpZmllcyB0bzoKLTU5MDAgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIFwKLSAgICAgIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWh0dHAgLXByb2cgL3Vzci9sb2NhbC9iaW4veDExdm5jIFwKLSAgICAgIC1zdmMKLQotICAgVGlwOiBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgdW5peHB3IHBhcmFtZXRlcnMsIGluc2lkZSB0aGUgVk5DIHZpZXdlcgotICAgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYWZ0ZXIgaGlzIHVzZXJuYW1lIChmb2xsb3dpbmcgYSAiOiIgc2VlIC1kaXNwbGF5Ci0gICBXQUlUIGZvciBkZXRhaWxzKSBmb3IgRklORENSRUFURURJU1BMQVkgdGhleSBjYW4gYWRkICJnZW9tPVd4SCIgb3IKLSAgICJnZW9tPVd4SHhEIiB0byBzcGVjaWZ5IHRoZSB3aWR0aCwgaGVpZ2h0LCBhbmQgb3B0aW9uYWxseSB0aGUgY29sb3IKLSAgIGRlcHRoLiBFLmcuICJmcmVkOmdlb209ODAweDYwMCIgYXQgdGhlIGxvZ2luOiBwcm9tcHQuIEFsc28gaWYgdGhlIGVudi4KLSAgIHZhciBYMTFWTkNfQ1JFQVRFX0dFT00gaXMgc2V0IHRvIHRoZSBkZXNpcmVkIFd4SCBvciBXeEh4RCB0aGF0IHdpbGwgYmUKLSAgIHVzZWQgYnkgeDExdm5jLgotCi0gICBZb3UgY2FuIHNldCB0aGUgZW52LiB2YXIgWDExVk5DX1NLSVBfRElTUExBWSB0byBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0Ci0gICBvZiBkaXNwbGF5cyB0byBpZ25vcmUgaW4gdGhlIEZJTkRESVNQTEFZIHByb2Nlc3MgKHRvIGZvcmNlIGNyZWF0aW9uIG9mCi0gICBuZXcgZGlzcGxheXMgaW4gc29tZSBjYXNlcy4pIFRoZSB1c2VyIGxvZ2dpbmcgaW4gdmlhIHRoZSB2bmN2aWV3ZXIgY2FuCi0gICBhbHNvIHNldCB0aGlzIHZpYSB1c2VybmFtZTpub2Rpc3BsYXk9Li4uKQotCi0gICBJZiB5b3UgZG8gbm90IHBsYW4gb24gdXNpbmcgdGhlIEphdmEgV2ViIGJyb3dzZXIgYXBwbGV0IHlvdSBjYW4gcmVtb3ZlCi0gICB0aGUgLWh0dHAgKGFuZCAtcHJvZykgb3B0aW9uIHNpbmNlIHRoaXMgd2lsbCBzcGVlZCB1cCBsb2dnaW5nLWluIGJ5IGEKLSAgIGZldyBzZWNvbmRzICh4MTF2bmMgd2lsbCBub3QgaGF2ZSB0byB3YWl0IHRvIHNlZSBpZiBhIGNvbm5lY3Rpb24gaXMKLSAgIEhUVFBTIG9yIFZOQy4pCi0KLSAgIEZvciByZWZlcmVuY2UsIHhpbmV0ZCBmb3JtYXQgaW4gdGhlIGZpbGUsIHNheSwgL2V0Yy94aW5ldGQuZC94MTF2bmM6Ci1zZXJ2aWNlIHgxMXZuYwotewotICAgICAgICB0eXBlICAgICAgICAgICAgPSBVTkxJU1RFRAotICAgICAgICBwb3J0ICAgICAgICAgICAgPSA1OTAwCi0gICAgICAgIHNvY2tldF90eXBlICAgICA9IHN0cmVhbQotICAgICAgICBwcm90b2NvbCAgICAgICAgPSB0Y3AKLSAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KLSAgICAgICAgdXNlciAgICAgICAgICAgID0gcm9vdAotICAgICAgICBzZXJ2ZXIgICAgICAgICAgPSAvdXNyL2xvY2FsL2Jpbi94MTF2bmMKLSAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLWluZXRkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWh0dHAgLXByb2cgL3Vzci9sb2NhbC8KLWJpbi94MTF2bmMgLXN2YwotICAgICAgICBkaXNhYmxlICAgICAgICAgPSBubwotfQotCi0gICBUbyBwcmludCBvdXQgdGhlIHNjcmlwdCBpbiB0aGlzIGNhc2UgdXNlICItZGlzcGxheQotICAgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktcHJpbnQiLiBUbyBjaGFuZ2UgdGhlIHByZWZlcmVuY2Ugb2YKLSAgIFhzZXJ2ZXJzIGFuZCB3aGljaCB0byB0cnkgbGlzdCB0aGVtLCBlLmcuOiAiLWRpc3BsYXkKLSAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVgsWHZmYixYZHVtbXkiIG9yIHVzZSAiLWNyZWF0ZV94c3J2Ci0gICBYLFh2ZmIsWGR1bW15Ii4gVGhlICJYIiBvbmUgbWVhbnMgdG8gdHJ5IHRvIHN0YXJ0IHVwIGEgcmVhbCwgaGFyZHdhcmUKLSAgIFggc2VydmVyLCBlLmcuIHN0YXJ0eCgxKSAoaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlYWwgWCBzZXJ2ZXIgcnVubmluZwotICAgdGhpcyBtYXkgb25seSB3b3JrIG9uIExpbnV4IGFuZCB0aGUgY2h2dCBwcm9ncmFtIG1heSBuZWVkIHRvIGJlIHJ1biB0bwotICAgc3dpdGNoIHRvIHRoZSBjb3JyZWN0IExpbnV4IHZpcnR1YWwgdGVybWluYWwuKSB4MTF2bmMgd2lsbCB0cnkgdG8gcnVuCi0gICBjaHZ0IGF1dG9tYXRpY2FsbHkgaWYgaXQgY2FuIGRldGVybWluZSB3aGljaCBWVCBzaG91bGQgYmUgc3dpdGNoZWQgdG8uCi0KLSAgIFhETS9HRE0vS0RNIExvZ2luIEdyZWV0ZXIgUGFuZWw6IElmIHlvdSB3YW50IHRvIHByZXNlbnQgdGhlIHVzZXIgd2l0aAotICAgYSB4ZG0vZ2RtL2tkbSBkaXNwbGF5IG1hbmFnZXIgImdyZWV0ZXIiIGxvZ2luIHlvdSBjYW4gdXNlIFh2ZmIueGRtY3AKLSAgIGluc3RlYWQgb2YgWHZmYiwgZXRjIGluIHRoZSBhYm92ZSBsaXN0LiBIb3dldmVyLCB5b3UgbmVlZCB0byBjb25maWd1cmUKLSAgIHhkbS9nZG0va2RtIHRvIGFjY2VwdCBsb2NhbGhvc3QgWERNQ1AgbWVzc2FnZXMsIHRoaXMgY2FuIGJlIGRvbmUgYnkKLSAgIChmcm9tIC1oZWxwIG91dHB1dCk6Ci0gICAgICBJZiB5b3Ugd2FudCB0aGUgRklORENSRUFURURJU1BMQVkgc2Vzc2lvbiB0byBjb250YWN0IGFuIFhETUNQIGxvZ2luCi0gICAgICBtYW5hZ2VyICh4ZG0vZ2RtL2tkbSkgb24gdGhlIHNhbWUgbWFjaGluZSwgdGhlbiB1c2UgIlh2ZmIueGRtY3AiCi0gICAgICBpbnN0ZWFkIG9mICJYdmZiIiwgZXRjLiAgVGhlIHVzZXIgd2lsbCBoYXZlIHRvIHN1cHBseSBoaXMgdXNlcm5hbWUKLSAgICAgIGFuZCBwYXNzd29yZCBvbmUgbW9yZSB0aW1lIChidXQgaGUgZ2V0cyB0byBzZWxlY3QgaGlzIGRlc2t0b3AKLSAgICAgIHR5cGUgc28gdGhhdCBjYW4gYmUgdXNlZnVsLikgIEZvciB0aGlzIHRvIHdvcmssIHlvdSB3aWxsIG5lZWQgdG8KLSAgICAgIGVuYWJsZSBsb2NhbGhvc3QgWERNQ1AgKHVkcCBwb3J0IDE3NykgZm9yIHRoZSBkaXNwbGF5IG1hbmFnZXIuCi0gICAgICBUaGlzIHNlZW1zIHRvIGJlOgotCi0gICAgICAgZm9yIGdkbSBpbiBnZG0uY29uZjogICBFbmFibGU9dHJ1ZSBpbiBzZWN0aW9uIFt4ZG1jcF0KLSAgICAgICBmb3Iga2RtIGluIGtkbXJjOiAgICAgIEVuYWJsZT10cnVlIGluIHNlY3Rpb24gW1hkbWNwXQotICAgICAgIGZvciB4ZG0gaW4geGRtLWNvbmZpZzogRGlzcGxheU1hbmFnZXIucmVxdWVzdFBvcnQ6IDE3NwotCi0gICBVbmxlc3MgeW91IGFyZSBhbHNvIHByb3ZpZGluZyBYRE1DUCBzZXJ2aWNlIHRvIHh0ZXJtaW5hbHMgb3Igb3RoZXIKLSAgIG1hY2hpbmVzLCBtYWtlIHN1cmUgdGhhdCB0aGUgaG9zdCBhY2Nlc3MgbGlzdCBvbmx5IGFsbG93cyBsb2NhbAotICAgY29ubmVjdGlvbnMgKHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBpcyBvZnRlbiBYYWNjZXNzIGFuZCBpdCBpcyB1c3VhbGx5Ci0gICBzZXR1cCBieSBkZWZhdWx0IHRvIGRvIGp1c3QgdGhhdC4pIE5vd2FkYXlzLCBob3N0IGxldmVsIGZpcmV3YWxsaW5nCi0gICB3aWxsIGFsc28gdHlwaWNhbGx5IGJsb2NrIFVEUCAocG9ydCAxNzcgZm9yIFhETUNQKSBieSBkZWZhdWx0Ci0gICBlZmZlY3RpdmVseSBsaW1pdGluZyB0aGUgVURQIGNvbm5lY3Rpb25zIHRvIGxvY2FsaG9zdC4KLQotICAgVGlwOiBOb3RlIHRoYXQgLXhkbXN2YyBpcyBhIHNob3J0IGhhbmQgYWxpYXMgZm9yIHRoZSBsb25nICItc3NsIFNBVkUKLSAgIC11bml4cHcgLXVzZXJzIHVuaXhwdz0gLWRpc3BsYXkKLSAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AiLiBTbyB3ZSBzaW1wbHkgdXNlOgotc2VydmljZSB4MTF2bmMKLXsKLSAgICAgICAgdHlwZSAgICAgICAgICAgID0gVU5MSVNURUQKLSAgICAgICAgcG9ydCAgICAgICAgICAgID0gNTkwMAotICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KLSAgICAgICAgcHJvdG9jb2wgICAgICAgID0gdGNwCi0gICAgICAgIHdhaXQgICAgICAgICAgICA9IG5vCi0gICAgICAgIHVzZXIgICAgICAgICAgICA9IHJvb3QKLSAgICAgICAgc2VydmVyICAgICAgICAgID0gL3Vzci9sb2NhbC9iaW4veDExdm5jCi0gICAgICAgIHNlcnZlcl9hcmdzICAgICA9IC1pbmV0ZCAtbyAvdmFyL2xvZy94MTF2bmMubG9nIC14ZG1zdmMKLSAgICAgICAgZGlzYWJsZSAgICAgICAgID0gbm8KLX0KLQotICAgKE5vdGU6IHVzZSAiLXN2YyIgaW5zdGVhZCBvZiAiLXhkbXN2YyIgZm9yIG5vIFhETUNQIGxvZ2luIGdyZWV0ZXIuKQotCi0KLSAgIExvY2FsIGFjY2VzcyAoVk5DIFNlcnZlciBhbmQgVk5DIFZpZXdlciBvbiB0aGUgc2FtZSBtYWNoaW5lKTogVG8KLSAgIGFjY2VzcyB5b3VyIHZpcnR1YWwgWCBkaXNwbGF5IHNlc3Npb24gbG9jYWxseSAoaS5lLiB3aGlsZSBzaXR0aW5nIGF0Ci0gICB0aGUgc2FtZSBtYWNoaW5lIGl0IGlzIHJ1bm5pbmcgb24pIG9uZSBjYW4gcGVyaGFwcyBoYXZlIHNvbWV0aGluZyBsaWtlCi0gICB0aGlzIGluIHRoZWlyICRIT01FLy54aW5pdHJjCi0jIS9iaW4vc2gKLXgxMXZuYyAtY3JlYXRlIC1yZmJwb3J0IDU5MDUgLWVudiBXQUlUQkc9MQotdm5jdmlld2VyIC1nZW9tZXRyeSArMCswIC1lbmNvZGluZ3MgcmF3IC1wYXNzd2QgJEhPTUUvLnZuYy9wYXNzd2QgbG9jYWxob3N0OjUKLQotICAgWW91IG1heSBub3QgbmVlZCB0aGUgLXBhc3N3ZC4gUmVjZW50IFJlYWxWTkMgdmlld2VycyBtaWdodCBiZSB0aGlzOgotIyEvYmluL3NoCi14MTF2bmMgLWNyZWF0ZSAtcmZicG9ydCA1OTA1IC1lbnYgV0FJVEJHPTEKLXZuY3ZpZXdlciAtRnVsbFNjcmVlbiAtUHJlZmVycmVkRW5jb2RpbmcgcmF3IC1wYXNzd2QgJEhPTUUvLnZuYy9wYXNzd2QgbG9jYWxob3MKLXQ6NQotCi0gICBUaGlzIHdheSBhIGJhcmUgWCBzZXJ2ZXIgaXMgcnVuIHdpdGggbm8gd2luZG93IG1hbmFnZXIgb3IgZGVza3RvcDsgaXQKLSAgIHNpbXBseSBydW5zIG9ubHkgdGhlIFZOQyBWaWV3ZXIgb24gdGhlIHJlYWwgWCBzZXJ2ZXIuIFRoZSBWaWV3ZXIgdGhlbgotICAgZHJhd3MgdGhlIHZpcnR1YWwgWCBzZXNzaW9uIG9uIHRvIHRoZSByZWFsIG9uZS4gT24geW91ciBzeXN0ZW0gaXQKLSAgIG1pZ2h0IG5vdCBiZSAkSE9NRS8ueGluaXRyYywgYnV0IHJhdGhlciAueHNlc3Npb24sIC5YY2xpZW50cywgb3IKLSAgIHNvbWV0aGluZyBlbHNlLiBZb3Ugd2lsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBpdCBpcyBmb3IgeW91ciBzeXN0ZW0KLSAgIGFuZCBjb25maWd1cmF0aW9uLgotCi0gICBUaGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIHRoZSByZXNvbHV0aW9uIChXeEgpIG9mIHRoZSB2aXJ0dWFsIFgKLSAgIGRpc3BsYXkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGUgcGh5c2ljYWwgWCBkaXNwbGF5LgotCi0gICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gb3IgY2Fubm90IGZpZ3VyZSBvdXQgdGhlIFggc3RhcnR1cCBzY3JpcHQgbmFtZQotICAgKC54aW5pdHJjLCBldGMpIHlvdSBjb3VsZCBzYXZlIHRoZSBhYm92ZSBjb21tYW5kcyB0byBhIHNoZWxsIHNjcmlwdCwKLSAgIHNheSAidm5jbG9jYWwiLCBhbmQgdGhlIGxvZyBpbiB2aWEgdGhlIG5vcm1hbCBLRE0gb3IgR0RNIGdyZWV0ZXIKLSAgIHByb2dyYW0gdXNpbmcgdGhlICJGYWlsc2FmZSIgb3B0aW9uLiBUaGVuIGluIHRoZSBsb25lIHh0ZXJtIHRoYXQgY29tZXMKLSAgIHVwIHR5cGUgInZuY2xvY2FsIiB0byBjb25uZWN0IHRvIHlvdXIgdmlydHVhbCBYIGRpc3BsYXkgdmlhIHgxMXZuYyBhbmQKLSAgIHZuY3ZpZXdlci4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBTdW1tYXJ5OiBUaGUgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZIiBzY2hlbWUgY2FuIGJlIHVzZWQKLSAgIHRvIHByb3ZpZGUgYSAiZGVza3RvcCBzZXJ2aWNlIiAoaS5lLiB0ZXJtaW5hbCBzZXJ2aWNlKSBvbiB0aGUgc2VydmVyCi0gICBtYWNoaW5lOiB5b3UgYWx3YXlzIGdldCBzb21lIGRlc2t0b3AgdGhlcmUsIGVpdGhlciBhIHJlYWwgaGFyZHdhcmUgWAotICAgc2VydmVyIG9yIGEgdmlydHVhbCBvbmUgKGRlcGVuZGluZyBvbiBob3cgeW91IHNldCB0aGluZ3MgdXAuKQotCi0gICBTbyBpdCBwcm92aWRlcyBzaW1wbGUgInRlcm1pbmFsIHNlcnZpY2VzIiBiYXNlZCBvbiBVbml4IHVzZXJuYW1lIGFuZAotICAgcGFzc3dvcmQuIFRoZSBjcmVhdGVkIFggc2VydmVyIHNlc3Npb25zICh2aXJ0dWFsIG9yIHJlYWwgaGFyZHdhcmUpCi0gICB3aWxsIHJlbWFpbiBydW5uaW5nIGFmdGVyIHlvdSBkaXNjb25uZWN0IHRoZSBWTkMgdmlld2VyIGFuZCB3aWxsIGJlCi0gICBmb3VuZCBhZ2FpbiBvbiByZWNvbm5lY3RpbmcgdmlhIFZOQyBhbmQgbG9nZ2luZyBpbi4gVG8gdGVybWluYXRlIHRoZW0KLSAgIHVzZSB0aGUgbm9ybWFsIHdheSB0byBFeGl0L0xvZ091dCBmcm9tIGluc2lkZSB5b3VyIFggc2Vzc2lvbi4gVGhlIHVzZXIKLSAgIGRvZXMgbm90IGhhdmUgdG8gbWVtb3JpemUgd2hpY2ggVk5DIGRpc3BsYXkgbnVtYmVyIGlzIGhpcy4gVGhleSBhbGwgZ28KLSAgIHRoZSBzYW1lIG9uZSAoZS5nLiBob3N0bmFtZTowKSBhbmQgaXQgc3dpdGNoZXMgYmFzZWQgb24gdXNlcm5hbWUuCi0KLQotICAgUS02MzogQ2FuIEkgaGF2ZSB4MTF2bmMgcmVzdGFydCBpdHNlbGYgYWZ0ZXIgaXQgdGVybWluYXRlcz8KLQotICAgT25lIGNvdWxkIGRvIHRoaXMgaW4gYSBzaGVsbCBzY3JpcHQsIGJ1dCBub3cgdGhlcmUgaXMgYW4gb3B0aW9uIC1sb29wCi0gICB0aGF0IG1ha2VzIGl0IGVhc2llci4gT2YgY291cnNlIHdoZW4geDExdm5jIHJlc3RhcnRzIGl0IG5lZWRzIHRvIGhhdmUKLSAgIHBlcm1pc3Npb25zIHRvIGNvbm5lY3QgdG8gdGhlIChwb3RlbnRpYWxseSBuZXcpIFggZGlzcGxheS4gVGhpcyBtb2RlCi0gICBjb3VsZCBiZSB1c2VmdWwgaWYgdGhlIFggc2VydmVyIHJlc3RhcnRzIG9mdGVuLiBVc2UgZS5nLiAiLWxvb3A1MDAwIgotICAgdG8gc2xlZXAgNTAwMCBtcyBiZXR3ZWVuIHJlc3RhcnRzLiBBbHNvICItbG9vcDIwMDAsNSIgdG8gc2xlZXAgMjAwMCBtcwotICAgYW5kIG9ubHkgcmVzdGFydCA1IHRpbWVzLgotCi0gICBPbmUgY2FuIGFsc28gdXNlIHRoZSAtbG9vcGJnIHRvIGVtdWxhdGUgaW5ldGQoOCkgdG8gc29tZSBkZWdyZWUsIHdoZXJlCi0gICBlYWNoIGNvbm5lY3RlZCBwcm9jZXNzIHJ1bnMgaW4gdGhlIGJhY2tncm91bmQuIEl0IGNvdWxkIGJlIGNvbWJpbmVkLAotICAgc2F5LCB3aXRoIHRoZSAtc3ZjIG9wdGlvbiB0byBwcm92aWRlIHNpbXBsZSB0ZXJtaW5hbCBzZXJ2aWNlcyB3aXRob3V0Ci0gICB1c2luZyBpbmV0ZCg4KS4KLQotCi0gICBRLTY0OiBIb3cgZG8gSSBtYWtlIHgxMXZuYyB3b3JrIHdpdGggdGhlIEphdmEgVk5DIHZpZXdlciBhcHBsZXQgaW4gYQotICAgd2ViIGJyb3dzZXI/Ci0KLSAgIFRvIGhhdmUgeDExdm5jIHNlcnZlIHVwIGEgSmF2YSBWTkMgdmlld2VyIGFwcGxldCB0byBhbnkgd2ViIGJyb3dzZXJzCi0gICB0aGF0IGNvbm5lY3QgdG8gaXQsIHJ1biB4MTF2bmMgd2l0aCB0aGlzIG9wdGlvbjoKLSAgLWh0dHBkaXIgL3BhdGgvdG8vdGhlL2phdmEvY2xhc3Nlcy9kaXIKLQotICAgKHRoaXMgZGlyZWN0b3J5IHdpbGwgY29udGFpbiB0aGUgZmlsZXMgaW5kZXgudm5jIGFuZCwgZm9yIGV4YW1wbGUsCi0gICBWbmNWaWV3ZXIuamFyKSBOb3RlIHRoYXQgbGlidm5jc2VydmVyIGNvbnRhaW5zIHRoZSBUaWdodFZOQyBKYXZhCi0gICBjbGFzc2VzIGphciBmaWxlIGZvciB5b3VyIGNvbnZlbmllbmNlLiAoaXQgaXMgdGhlIGZpbGUKLSAgIGNsYXNzZXMvVm5jVmlld2VyLmphciBpbiB0aGUgc291cmNlIHRyZWUuKQotCi0gICBZb3Ugd2lsbCBzZWUgb3V0cHV0IHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gIDE0LzA1LzIwMDQgMTE6MTM6NTYgQXV0b3Byb2Jpbmcgc2VsZWN0ZWQgcG9ydCA1OTAwCi0gIDE0LzA1LzIwMDQgMTE6MTM6NTYgTGlzdGVuaW5nIGZvciBIVFRQIGNvbm5lY3Rpb25zIG9uIFRDUCBwb3J0IDU4MDAKLSAgMTQvMDUvMjAwNCAxMToxMzo1NiAgIFVSTCBodHRwOi8vd2FsbnV0OjU4MDAKLSAgMTQvMDUvMjAwNCAxMToxMzo1NiBzY3JlZW4gc2V0dXAgZmluaXNoZWQuCi0gIDE0LzA1LzIwMDQgMTE6MTM6NTYgVGhlIFZOQyBkZXNrdG9wIGlzIHdhbG51dDowCi0gIFBPUlQ9NTkwMAotCi0gICB0aGVuIHlvdSBjYW4gY29ubmVjdCB0byB0aGF0IFVSTCB3aXRoIGFueSBKYXZhIGVuYWJsZWQgYnJvd3Nlci4gRmVlbAotICAgZnJlZSB0byBjdXN0b21pemUgdGhlIGRlZmF1bHQgaW5kZXgudm5jIGZpbGUgaW4gdGhlIGNsYXNzZXMgZGlyZWN0b3J5LgotCi0gICBBcyBvZiBNYXkvMjAwNSB0aGUgLWh0dHAgb3B0aW9uIHdpbGwgdHJ5IHRvIGd1ZXNzIHdoZXJlIHRoZSBKYXZhCi0gICBjbGFzc2VzIGphciBmaWxlIGlzIGJ5IGxvb2tpbmcgaW4gZXhwZWN0ZWQgbG9jYXRpb25zIGFuZCBvbmVzIHJlbGF0aXZlCi0gICB0byB0aGUgeDExdm5jIGJpbmFyeS4KLQotICAgQWxzbyBub3RlIHRoYXQgaWYgeW91IHdhbnRlZCB0bywgeW91IGNvdWxkIGFsc28gc3RhcnQgdGhlIEphdmEgdmlld2VyCi0gICBlbnRpcmVseSBmcm9tIHRoZSB2aWV3ZXItc2lkZSBieSBoYXZpbmcgdGhlIGphciBmaWxlIHRoZXJlIGFuZCB1c2luZwotICAgZWl0aGVyIHRoZSBqYXZhIG9yIGFwcGxldHZpZXdlciBjb21tYW5kcyB0byBydW4gdGhlIHByb2dyYW0uCi0gIGphdmEgLWNwIC4vVm5jVmlld2VyLmphciBWbmNWaWV3ZXIgSE9TVCBmYXItYXdheS5lYXN0IFBPUlQgNTkwMAotCi0gICBQcm94aWVzOiBTZWUgdGhlIGRpc2N1c3Npb24gaGVyZSBpZiB0aGUgd2ViIGJyb3dzZXIgbXVzdCB1c2UgYSB3ZWIKLSAgIHByb3h5IHRvIGNvbm5lY3QgdG8gdGhlIGludGVybmV0LiBJdCBpcyB0cmlja3kgdG8gZ2V0IEphdmEgYXBwbGV0cyB0bwotICAgd29yayBpbiB0aGlzIGNhc2U6IGEgc2lnbmVkIGFwcGxldCBtdXN0IGJlIHVzZWQgc28gaXQgY2FuIGNvbm5lY3QgdG8KLSAgIHRoZSBwcm94eSBhbmQgYXNrIGZvciB0aGUgcmVkaXJlY3Rpb24gdG8gdGhlIFZOQyBzZXJ2ZXIuIE9uZSB3YXkgdG8gZG8KLSAgIHRoaXMgaXMgdG8gdXNlIHRoZSBzaWduZWQgU1NMIG9uZSByZWZlcnJlZCB0byBpbiBjbGFzc2VzL3NzbC9wcm94eS52bmMKLSAgIGFuZCBzZXQgZGlzYWJsZVNTTD15ZXMgKG5vdGUgdGhhdCB0aGlzIGhhcyBubyBlbmNyeXB0aW9uOyBwbGVhc2UgdXNlCi0gICBTU0wgb3IgU1NIIGFzIGRpc2N1c3MgZWxzZXdoZXJlIG9uIHRoaXMgcGFnZSkgaW4gdGhlIFVSTCBvciB0aGUgZmlsZS4KLQotCi0gICBRLTY1OiBBcmUgcmV2ZXJzZSBjb25uZWN0aW9ucyAoaS5lLiB0aGUgVk5DIHNlcnZlciBjb25uZWN0aW5nIHRvIHRoZQotICAgVk5DIHZpZXdlcikgdXNpbmcgInZuY3ZpZXdlciAtbGlzdGVuIiBhbmQgdm5jY29ubmVjdCgxKSBzdXBwb3J0ZWQ/Ci0KLSAgIEFzIG9mIE1hci8yMDA0IHgxMXZuYyBzdXBwb3J0cyByZXZlcnNlIGNvbm5lY3Rpb25zLiBPbiBVbml4IG9uZSBzdGFydHMKLSAgIHRoZSBWTkMgdmlld2VyIGluIGxpc3RlbiBtb2RlOiAidm5jdmlld2VyIC1saXN0ZW4iIChzZWUgeW91cgotICAgZG9jdW1lbnRhdGlvbiBmb3IgV2luZG93cywgZXRjKSwgYW5kIHRoZW4gc3RhcnRzIHVwIHgxMXZuYyB3aXRoIHRoZQotICAgLWNvbm5lY3Qgb3B0aW9uLiBUbyBjb25uZWN0IGltbWVkaWF0ZWx5IGF0IHgxMXZuYyBzdGFydHVwIHRpbWUgdXNlIHRoZQotICAgIi1jb25uZWN0IGhvc3Q6cG9ydCIgb3B0aW9uICh1c2UgY29tbWFzIGZvciBhIGxpc3Qgb2YgaG9zdHMgdG8gY29ubmVjdAotICAgdG8uKSBUaGUgIjpwb3J0IiBpcyBvcHRpb25hbCAoZGVmYXVsdCBpcyBWTkMgbGlzdGVuaW5nIHBvcnQgaXMgNTUwMC4pCi0KLSAgIElmIGEgZmlsZSBpcyBzcGVjaWZpZWQgaW5zdGVhZDogLWNvbm5lY3QgL3BhdGgvdG8vc29tZS9maWxlIHRoZW4gdGhhdAotICAgZmlsZSBpcyBjaGVja2VkIHBlcmlvZGljYWxseSAoYWJvdXQgb25jZSBhIHNlY29uZCkgZm9yIG5ldyBob3N0cyB0bwotICAgY29ubmVjdCB0by4KLQotICAgVGhlIC1yZW1vdGUgY29udHJvbCBvcHRpb24gKGFrYSAtUikgY2FuIGFsc28gYmUgdXNlZCB0byBkbyB0aGlzIGR1cmluZwotICAgYW4gYWN0aXZlIHgxMXZuYyBzZXNzaW9uLCBlLmcuOgoteDExdm5jIC1kaXNwbGF5IDowIC1SIGNvbm5lY3Q6aG9zdG5hbWUuZG9tYWluCi0KLSAgIFVzZSB0aGUgIi1jb25uZWN0X29yX2V4aXQiIG9wdGlvbiB0byBoYXZlIHgxMXZuYyBleGl0IGlmIHRoZSByZXZlcnNlCi0gICBjb25uZWN0aW9uIGZhaWxzLiBBbHNvLCBub3RlIHRoZSAiLXJmYnBvcnQgMCIgb3B0aW9uIGRpc2FibGVzIFRDUAotICAgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyAocG90ZW50aWFsbHkgdXNlZnVsIGZvciByZXZlcnNlIGNvbm5lY3Rpb24KLSAgIG1vZGUsIGFzc3VtaW5nIHlvdSBkbyBub3Qgd2FudCBhbnkgImZvcndhcmQiIGNvbm5lY3Rpb25zLikKLQotICAgTm90ZSB0aGF0IGFzIG9mIE1hci8yMDA2IHgxMXZuYyByZXF1aXJlcyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmb3IKLSAgIHJldmVyc2UgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBmb3IgZm9yd2FyZCBvbmVzIChhc3N1bWluZyBwYXNzd29yZAotICAgYXV0aCBoYXMgYmVlbiBlbmFibGVkLCBlLmcuIHZpYSAtcmZiYXV0aCwgLXBhc3N3ZGZpbGUsIGV0Yy4pIE1hbnkgVk5DCi0gICBzZXJ2ZXJzIGRvIG5vdCByZXF1aXJlIGFueSBwYXNzd29yZCBmb3IgcmV2ZXJzZSBjb25uZWN0aW9ucy4gVG8gcmVnYWluCi0gICB0aGUgb2xkIGJlaGF2aW9yIHN1cHBseSB0aGlzIG9wdGlvbiAiLWVudgotICAgWDExVk5DX1JFVkVSU0VfQ09OTkVDVElPTl9OT19BVVRIPTEiIHRvIHgxMXZuYy4KLQotICAgVm5jY29ubmVjdCBjb21tYW5kOiBUbyB1c2UgdGhlIHZuY2Nvbm5lY3QoMSkgcHJvZ3JhbSAoZnJvbSB0aGUgY29yZQotICAgVk5DIHBhY2thZ2UgYXQgd3d3LnJlYWx2bmMuY29tKSBzcGVjaWZ5IHRoZSAtdm5jY29ubmVjdCBvcHRpb24gdG8KLSAgIHgxMXZuYyAoTm90ZTogYXMgb2YgRGVjLzIwMDQgLXZuY2Nvbm5lY3QgaXMgbm93IHRoZSBkZWZhdWx0LikKLSAgIHZuY2Nvbm5lY3QoMSkgbXVzdCBiZSBwb2ludGVkIHRvIHRoZSBzYW1lIFgxMSBESVNQTEFZIGFzIHgxMXZuYyAoc2luY2UKLSAgIGl0IHVzZXMgWCBwcm9wZXJ0aWVzIHRvIGNvbW11bmljYXRlIHdpdGggeDExdm5jLikgSWYgeW91IGRvIG5vdCBoYXZlCi0gICBvciBkbyBub3Qgd2FudCB0byBnZXQgdGhlIHZuY2Nvbm5lY3QoMSkgcHJvZ3JhbSwgdGhlIGZvbGxvd2luZyBzY3JpcHQKLSAgIChuYW1lZCAiVm5jY29ubmVjdCIpIG1heSB3b3JrIGlmIHlvdXIgeHByb3AoMSkgc3VwcG9ydHMgdGhlIC1zZXQKLSAgIG9wdGlvbjoKLSMhL2Jpbi9zaAotIyB1c2FnZTogVm5jY29ubmVjdCA8aG9zdD4KLSMgICAgICAgIFZuY2Nvbm5lY3QgPGhvc3Q6cG9ydD4KLSMgbm90ZTogbm90IGFsbCB4cHJvcCgxKSBzdXBwb3J0IC1zZXQuCi0jCi14cHJvcCAtcm9vdCAtZiBWTkNfQ09OTkVDVCA4cyAtc2V0IFZOQ19DT05ORUNUICIkMSIKLQotCi0gICBRLTY2OiBDYW4gcmV2ZXJzZSBjb25uZWN0aW9ucyBiZSBtYWRlIHRvIGdvIHRocm91Z2ggYSBXZWIgb3IgU09DS1MKLSAgIHByb3h5IG9yIFNTSD8KLQotICAgWWVzLCBhcyBvZiBPY3QvMjAwNyB4MTF2bmMgc3VwcG9ydHMgcmV2ZXJzZSBjb25uZWN0aW9ucyB0aHJvdWdoCi0gICBwcm94aWVzOiB1c2UgdGhlICItcHJveHkgaG9zdDpwb3J0IiBvcHRpb24uIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZQotICAgdGhlIHByb3h5IGlzIGEgV2ViIHByb3h5LiBOb3RlIHRoYXQgbW9zdCBXZWIgcHJveGllcyBvbmx5IGFsbG93IHByb3h5Ci0gICBkZXN0aW5hdGlvbiBjb25uZWN0aW9ucyB0byBwb3J0cyA0NDMgKEhUVFBTKSBhbmQgNTYzIChTTkVXUykgYW5kIHNvCi0gICB0aGlzIG1pZ2h0IG5vdCBiZSB0b28gdXNlZnVsIHVubGVzcyB0aGUgcHJveHkgaGFzIGJlZW4gbW9kaWZpZWQKLSAgIChBbGxvd0NPTk5FQ1QgYXBhY2hlIHNldHRpbmcpIG9yIHRoZSBWTkMgdmlld2VyIGxpc3RlbnMgb24gb25lIG9mCi0gICB0aG9zZSBwb3J0cyAob3IgdGhlIHJvdXRlciBkb2VzIGEgcG9ydCByZWRpci4pIEEgd2ViIHByb3h5IG1heSBhbHNvIGJlCi0gICBzcGVjaWZpZWQgdmlhICItcHJveHkgaHR0cDovL2hvc3Q6cG9ydCIKLQotICAgRm9yIFNPQ0tTNCBhbmQgU09DS1M0YSBwcm94aWVzIHVzZSB0aGlzIGZvcm1hdCAiLXByb3h5Ci0gICBzb2NrczovL2hvc3Q6cG9ydCIuIElmIHRoZSByZXZlcnNlIGNvbm5lY3Rpb24gaG9zdG5hbWUgaXMgYSBudW1lcmljYWwKLSAgIElQIG9yICJsb2NhbGhvc3QiIHRoZW4gU09DS1M0IChubyBob3N0IGxvb2t1cCkgaXMgdXNlZCwgb3RoZXJ3aXNlCi0gICBTT0NLUzRhIHdpbGwgYmUgdXNlZC4gRm9yIFNPQ0tTNSAocHJveHkgd2lsbCBkbyBsb29rdXAgYW5kIG1hbnkgb3RoZXIKLSAgIHRoaW5ncykgdXNlICItcHJveHkgc29ja3M1Oi8vaG9zdDpwb3J0Ii4gTm90ZSB0aGF0IHRoZSBTU0ggYnVpbHRpbgotICAgU09DS1MgcHJveHkgInNzaCAtRCBwb3J0IiBvbmx5IGRvZXMgU09DS1M0IG9yIFNPQ0tTNSwgc28gdXNlIHNvY2tzNTovLwotICAgZm9yIGEgc3NoIC1EIHByb3h5LgotCi0gICBUaGUgcHJveHlpbmcgd29ya3MgZm9yIGJvdGggU1NMIGVuY3J5cHRlZCBhbmQgbm9ybWFsIHJldmVyc2UKLSAgIGNvbm5lY3Rpb25zLgotCi0gICBBbiBleHBlcmltZW50YWwgbW9kZSBpcyAiLXByb3h5IGh0dHA6Ly9ob3N0OnBvcnQvLi4uIiB3aGVyZSB0aGUgVVJMCi0gICAoZS5nLiBhIENHSSBzY3JpcHQpIGlzIHJldHJpZXZlZCB2aWEgdGhlIEdFVCBtZXRob2QuIFNlZSAtcHJveHkgZm9yCi0gICBtb3JlIGluZm8uCi0KLSAgIEFub3RoZXIgZXhwZXJpbWVudGFsIG1vZGUgaXMgIi1wcm94eSBzc2g6Ly91c2VyQGhvc3QiIGluIHdoaWNoIGNhc2UgYQotICAgU1NIIHR1bm5lbCBpcyB1c2VkIGZvciB0aGUgcHJveHlpbmcuIFNlZSAtcHJveHkgZm9yIG1vcmUgaW5mby4KLQotICAgVXAgdG8gMyBwcm94aWVzIG1heSBiZSBjaGFpbmVkIHRvZ2V0aGVyIGJ5IGxpc3RpbmcgdGhlbSBieSBjb21tYXMKLSAgIGUuZy46ICItcHJveHkgaHR0cDovL2hvc3QxOnBvcnQxLHNvY2tzNTovL2hvc3QyOnBvcnQyIiBpbiBjYXNlIG9uZQotICAgbmVlZHMgdG8gcmljb2NoZXQgb2ZmIG9mIHNldmVyYWwgbWFjaGluZXMgdG8gdWx0aW1hdGVseSByZWFjaCB0aGUKLSAgIGxpc3RlbmluZyB2aWV3ZXIuCi0KLQotICAgUS02NzogQ2FuIHgxMXZuYyBwcm92aWRlIGEgbXVsdGktdXNlciBkZXNrdG9wIHdlYiBsb2dpbiBzZXJ2aWNlIGFzIGFuCi0gICBBcGFjaGUgQ0dJIG9yIFBIUCBzY3JpcHQ/Ci0gICBZZXMuIFNlZSB0aGUgZXhhbXBsZSBzY3JpcHQgZGVza3RvcC5jZ2kgZm9yIGlkZWFzLiBJdCBpcyBpbiB0aGUgc291cmNlCi0gICB0cmVlIGluIHRoZSBkaXJlY3RvcnkgeDExdm5jL21pc2MuIEl0IHNlcnZlcyB4MTF2bmMncyBTU0wgZW5hYmxlZCBKYXZhCi0gICBBcHBsZXQgdG8gdGhlIHdlYiBicm93c2VyIHdpdGggdGhlIGNvcnJlY3QgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IKLSAgIHRoZSB1c2VyJ3MgdmlydHVhbCBkZXNrdG9wIChhbiBYdmZiIHNlc3Npb24gdmlhIC1jcmVhdGU7IGJlIHN1cmUgdG8KLSAgIGFkZCB0aGUgWHZmYiBwYWNrYWdlLikgSFRUUFMvU1NMIGVuYWJsZWQgQXBhY2hlIHNob3VsZCBiZSB1c2VkIHRvCi0gICBzZXJ2ZSB0aGUgc2NyaXB0IHRvIGF2b2lkIHVuaXggYW5kIHZuYyBwYXNzd29yZHMgZnJvbSBiZWluZyBzZW50IGluCi0gICBjbGVhcnRleHQgYW5kIHNuaWZmZWQuCi0KLSAgIEJ5IGRlZmF1bHQgaXQgdXNlcyBhIHNlcGFyYXRlIFZOQyBwb3J0IGZvciBlYWNoIHVzZXIgZGVza3RvcCAoZWl0aGVyCi0gICBieSBhdXRvcHJvYmluZyBpbiBhIHJhbmdlIG9mIHBvcnRzIG9yIHVzaW5nIGEgcG9ydCBiYXNlZCBvbiB0aGUgdXNlcmlkCi0gICBudW1iZXIuKSBUaGUgd2ViIHNlcnZlcidzIGZpcmV3YWxsIG11c3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbnMgdG8KLSAgIHRoZXNlIHBvcnRzLgotCi0gICBJdCBpcyBzb21ld2hhdCBkaWZmaWN1bHQgdG8gZG8gYWxsIG9mIHRoaXMgd2l0aCB4MTF2bmMgbGlzdGVuaW5nIG9uIGEKLSAgIHNpbmdsZSBwb3J0LCBob3dldmVyIHRoZXJlIGlzIGFsc28gYSAnZml4ZWQgcG9ydCcgc2NoZW1lIGRlc2NyaWJlZCBpbgotICAgdGhlIHNjcmlwdCBiYXNlZCBvbiAtbG9vcGJnIHRoYXQgd29ya3MgZmFpcmx5IHdlbGwgKGJ1dCBtb3JlCi0gICBleHBlcmllbmNlIGlzIG5lZWRlZCB0byBzZWUgd2hhdCBwcm9ibGVtcyBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBwb3J0Ci0gICBjYXVzZXM7IGhvd2V2ZXIgYXQgd29yc3Qgb25lIHVzZXIgbWF5IG5lZWQgdG8gcmUtbG9naW4uKQotCi0gICBUaGVyZSBpcyBhbHNvIGFuIG9wdGlvbmFsICdwb3J0IHJlZGlyZWN0aW9uJyBtb2RlIGZvciBkZXNrdG9wLmNnaSB0aGF0Ci0gICBhbGxvd3MgcmVkaXJlY3Rpb24gdG8gb3RoZXIgbWFjaGluZXMgaW5zaWRlIHRoZSBmaXJld2FsbCBhbHJlYWR5Ci0gICBydW5uaW5nIFNTTCBlbmFibGVkIFZOQyBzZXJ2ZXJzLiBUaGlzIHByb3ZpZGVzIG11Y2ggb2YgdGhlCi0gICBmdW5jdGlvbmFsaXR5IGFzIHRoZSBTU0wgUG9ydGFsIGFuZCBpcyBlYXNpZXIgdG8gc2V0IHVwLgotCi0KLSAgIFEtNjg6IENhbiBJIHVzZSB4MTF2bmMgYXMgYSByZXBsYWNlbWVudCBmb3IgWHZuYz8gKGkuZS4gbm90IGZvciBhIHJlYWwKLSAgIGRpc3BsYXksIGJ1dCBmb3IgYSB2aXJ0dWFsIG9uZSBJIGtlZXAgYXJvdW5kLikKLQotICAgWW91IGNhbiwgYnV0IHlvdSB3b3VsZCBub3QgYmUgZG9pbmcgdGhpcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAoZm9yCi0gICB2aXJ0dWFsIFggc2Vzc2lvbnMgdmlhIFZOQywgWHZuYyBzaG91bGQgZ2l2ZSB0aGUgZmFzdGVzdCByZXNwb25zZS4pCi0gICBZb3UgbWF5IHdhbnQgdG8gZG8gdGhpcyBiZWNhdXNlIFh2bmMgaXMgYnVnZ3kgYW5kIGNyYXNoZXMsIGRvZXMgbm90Ci0gICBzdXBwb3J0IGFuIFggc2VydmVyIGV4dGVuc2lvbiB5b3UgZGVzaXJlLCBvciB5b3Ugd2FudCB0byB0YWtlCi0gICBhZHZhbnRhZ2Ugb2Ygb25lIG9mIHgxMXZuYydzIHVuZW5kaW5nIG51bWJlciBvZiBvcHRpb25zIGFuZCBmZWF0dXJlcy4KLQotICAgT25lIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gaGF2ZSBhIFh2ZmIoMSkgdmlydHVhbCBmcmFtZWJ1ZmZlciBYCi0gICBzZXJ2ZXIgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGF2ZSB4MTF2bmMgYXR0YWNoZWQgdG8gaXQuCi0gICBBbm90aGVyIG1ldGhvZCwgZmFzdGVyIGFuZCBtb3JlIGFjY3VyYXRlLCBpcyB0byB1c2UgdGhlICJkdW1teSIgRGV2aWNlCi0gICBEcml2ZXIgaW4gWEZyZWU4Ni9Yb3JnIChzZWUgYmVsb3cuKQotCi0gICBGb3IgdGhlc2UgdmlydHVhbCBzZXNzaW9ucyB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlIFh2ZmIgcHJvZ3JhbQotICAgKGUuZy4gYXB0LWdldCBpbnN0YWxsIHh2ZmIpIG9yIG91ciBYZHVtbXkgcHJvZ3JhbSAoc2VlIGJlbG93LikKLQotICAgSW4gZWl0aGVyIGNhc2UsIG9uZSBjYW4gdmlldyB0aGlzIGRlc2t0b3AgYm90aCByZW1vdGVseSBhbmQgYWxzbwotICAgbG9jYWxseSB1c2luZyB2bmN2aWV3ZXIuIE1ha2Ugc3VyZSB2bmN2aWV3ZXIncyAiLWVuY29kaW5ncyByYXciIGlzIGluCi0gICBlZmZlY3QgZm9yIGxvY2FsIHZpZXdpbmcgKGNvbXByZXNzaW9uIHNlZW1zIHRvIHNsb3cgdGhpbmdzIGRvd24KLSAgIGxvY2FsbHkuKSBGb3IgbG9jYWwgdmlld2luZyB5b3Ugc2V0IHVwIGEgImJhcmUiIHdpbmRvdyBtYW5hZ2VyIHRoYXQKLSAgIGp1c3Qgc3RhcnRzIHVwIHZuY3ZpZXdlciBhbmQgbm90aGluZyBlbHNlIChTZWUgaG93IGJlbG93LikKLQotICAgSGVyZSBpcyBvbmUgd2F5IHRvIHN0YXJ0IHVwIFh2ZmI6Ci0gIHhpbml0IC0tIC91c3IvYmluL1h2ZmIgOjEgLWNjIDQgLXNjcmVlbiAwIDEwMjR4NzY4eDE2Ci0KLSAgIFRoaXMgc3RhcnRzIHVwIGEgMTZicHAgdmlydHVhbCBkaXNwbGF5LiBUbyBleHBvcnQgaXQgdmlhIFZOQyB1c2UKLSAgeDExdm5jIC1kaXNwbGF5IDoxIC4uLgotCi0gICBUaGVuIGhhdmUgdGhlIHJlbW90ZSB2bmN2aWV3ZXIgYXR0YWNoIHRvIHgxMXZuYydzIFZOQyBkaXNwbGF5IChlLmcuIDowCi0gICB3aGljaCBpcyBwb3J0IDU5MDAuKQotCi0gICBUaGUgIi1jYyA0IiBYdmZiIG9wdGlvbiBpcyB0byBmb3JjZSBpdCB0byB1c2UgYSBUcnVlQ29sb3IgdmlzdWFsCi0gICBpbnN0ZWFkIG9mIERpcmVjdENvbG9yICh0aGlzIHdvcmtzIGFyb3VuZCBhIHJlY2VudCBidWcgaW4gdGhlIFhvcmcKLSAgIFh2ZmIgc2VydmVyLikKLQotICAgT25lIGdvb2QgdGhpbmcgYWJvdXQgWHZmYiBpcyB0aGF0IHRoZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIGV4aXN0cyBpbgotICAgbWFpbiBtZW1vcnkgKHJhdGhlciB0aGFuIGluIHRoZSB2aWRlbyBoYXJkd2FyZSksIGFuZCBzbyB4MTF2bmMgY2FuCi0gICAic2NyZWVuIHNjcmFwZSIgaXQgdmVyeSBlZmZpY2llbnRseSAobW9yZSB0aGFuLCBzYXksIDEwMFggZmFzdGVyIHRoYW4KLSAgIG5vcm1hbCB2aWRlbyBoYXJkd2FyZS4pCi0KLSAgIFVwZGF0ZSBOb3YvMjAwNjogU2VlIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBkaXNjdXNzaW9uIG9mIHRoZSAiLWRpc3BsYXkKLSAgIFdBSVQ6Y21kPUZJTkRESVNQTEFZIiBvcHRpb24gd2hlcmUgdmlydHVhbCAoWHZmYiBvciBYZHVtbXksIG9yIGV2ZW4KLSAgIHJlYWwgb25lcyBieSBjaGFuZ2luZyBhbiBvcHRpb24pIFggc2VydmVycyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5Ci0gICBmb3IgbmV3IHVzZXJzIGNvbm5lY3RpbmcuIFRoaXMgcHJvdmlkZXMgYSAiZGVza3RvcCBzZXJ2aWNlIiBmb3IgdGhlCi0gICBtYWNoaW5lLiBZb3UgZWl0aGVyIGdldCB5b3VyIHJlYWwgWCBzZXNzaW9uIG9yIHlvdXIgdmlydHVhbAotICAgKFh2ZmIvWGR1bW15KSBvbmUgd2hlbmV2ZXIgeW91IGNvbm5lY3QgdG8gdGhlIG1hY2hpbmUgKGluZXRkKDgpIGlzIGEKLSAgIG5pY2Ugd2F5IHRvIHByb3ZpZGUgdGhpcyBzZXJ2aWNlLikgVGhlIC1maW5kLCAtY3JlYXRlLCAtc3ZjLCBhbmQKLSAgIC14ZG1zdmMgYWxpYXNlcyBjYW4gYWxzbyBjb21lIGluIGhhbmR5IGhlcmUuCi0KLSAgIFRoZXJlIGFyZSBzb21lIGFubm95YW5jZXMgV1JUIFh2ZmIgaG93ZXZlci4gVGhlIGRlZmF1bHQga2V5Ym9hcmQKLSAgIG1hcHBpbmcgc2VlbXMgdG8gYmUgdmVyeSBwb29yLiBPbmUgc2hvdWxkIHJ1biB4MTF2bmMgd2l0aCAtYWRkX2tleXN5bXMKLSAgIG9wdGlvbiB0byBoYXZlIGtleXN5bXMgYWRkZWQgYXV0b21hdGljYWxseS4gQWxzbywgdG8gYWRkIHRoZSBTaGlmdF9SCi0gICBhbmQgQ29udHJvbF9SIG1vZGlmaWVycyBzb21ldGhpbmcgbGlrZSB0aGlzIGlzIG5lZWRlZDoKLSMhL2Jpbi9zaAoteG1vZG1hcCAtZSAia2V5Y29kZSBhbnkgPSBTaGlmdF9SIgoteG1vZG1hcCAtZSAiYWRkIFNoaWZ0ID0gU2hpZnRfTCBTaGlmdF9SIgoteG1vZG1hcCAtZSAia2V5Y29kZSBhbnkgPSBDb250cm9sX1IiCi14bW9kbWFwIC1lICJhZGQgQ29udHJvbCA9IENvbnRyb2xfTCBDb250cm9sX1IiCi14bW9kbWFwIC1lICJrZXljb2RlIGFueSA9IEFsdF9MIgoteG1vZG1hcCAtZSAia2V5Y29kZSBhbnkgPSBBbHRfUiIKLXhtb2RtYXAgLWUgImtleWNvZGUgYW55ID0gTWV0YV9MIgoteG1vZG1hcCAtZSAiYWRkIE1vZDEgPSBBbHRfTCBBbHRfUiBNZXRhX0wiCi0KLSAgIChub3RlOiB0aGVzZSBhcmUgYXBwbGllZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBtb2RlCi0gICBvZiB4MTF2bmMuKSBQZXJoYXBzIHRoZSBYdmZiIG9wdGlvbnMgLXhrYmRiIG9yIC14a2JtYXAgY291bGQgYmUgdXNlZAotICAgdG8gZ2V0IGEgYmV0dGVyIGRlZmF1bHQga2V5Ym9hcmQgbWFwcGluZy4uLgotCi0gICBEdW1teSBEcml2ZXI6ICBBIHVzZXIgcG9pbnRzIG91dCBhIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZSBtZXRob2QgaXMKLSAgIHRvIHVzZSB0aGUgImR1bW15IiBEZXZpY2UgRHJpdmVyIG9mIFhGcmVlODYvWG9yZyBpbnN0ZWFkIG9mIFh2ZmIuIEhlCi0gICB1c2VzIHRoaXMgdG8gY3JlYXRlIGEgcGVyc2lzdGVudCBhbmQgcmVzaXphYmxlIGRlc2t0b3AgYWNjZXNzaWJsZSBmcm9tCi0gICBhbnl3aGVyZS4gSW4gdGhlIERldmljZSBTZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBzZXQgRHJpdmVyICJkdW1teSIuCi0gICBZb3UgbWF5IGFsc28gbmVlZCB0byBzZXQgVmlkZW9SYW0gTk5OIHRvIGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotICAgZnJhbWVidWZmZXIuIFRoZSBmcmFtZWJ1ZmZlciBpcyBrZXB0IGluIG1haW4gbWVtb3J5IGxpa2UgWHZmYiBleGNlcHQKLSAgIHRoYXQgdGhlIHNlcnZlciBjb2RlIGlzIGNsb3NlbHkgY29ycmVsYXRlZCB3aXRoIHRoZSByZWFsIFhGcmVlODYvWG9yZwotICAgWHNlcnZlciB1bmxpa2UgWHZmYi4KLQotICAgVGhlIG1haW4gZHJhd2JhY2sgdG8gdGhpcyBtZXRob2QgKGJlc2lkZXMgcmVxdWlyaW5nIGV4dHJhCi0gICBjb25maWd1cmF0aW9uIGFuZCBwb3NzaWJseSByb290IHBlcm1pc3Npb24pIGlzIHRoYXQgaXQgYWxzbyBkb2VzIHRoZQotICAgTGludXggVmlydHVhbCBDb25zb2xlL1Rlcm1pbmFsIChWQy9WVCkgc3dpdGNoaW5nIGV2ZW4gdGhvdWdoIGl0IGRvZXMKLSAgIG5vdCBuZWVkIHRvIChzaW5jZSBpdCBkb2Vzbid0IHVzZSBhIHJlYWwgZnJhbWVidWZmZXIuKSBUaGVyZSBhcmUgc29tZQotICAgImR1YWwgaGVhZGVkIiAoYWN0dWFsbHkgbXVsdGktaGVhZGVkL211bHRpLXVzZXIpIHBhdGNoZXMgdG8gdGhlIFgKLSAgIHNlcnZlciB0aGF0IHR1cm4gb2ZmIHRoZSBWVCB1c2FnZSBpbiB0aGUgWCBzZXJ2ZXIuIFVwZGF0ZTogQXMgb2YKLSAgIEp1bC8yMDA1IHdlIGhhdmUgYW4gTERfUFJFTE9BRCBzY3JpcHQgWGR1bW15IHRoYXQgYWxsb3dzIHlvdSB0byB1c2UgYQotICAgc3RvY2sgKGkuZS4gdW5wYXRjaGVkKSBYb3JnIG9yIFhGcmVlODYgc2VydmVyIHdpdGggdGhlICJkdW1teSIgZHJpdmVyCi0gICBhbmQgbm90IGhhdmUgYW55IFZUIHN3aXRjaGluZyBwcm9ibGVtcyEgQW4gYWR2YW50YWdlIG9mIFhkdW1teSBvdmVyCi0gICBYdmZiIGlzIHRoYXQgWGR1bW15IHN1cHBvcnRzIFJBTkRSIGR5bmFtaWMgc2NyZWVuIHJlc2l6aW5nLgotCi0gICBUaGUgc3RhbmRhcmQgd2F5IHRvIHN0YXJ0IHRoZSAiZHVtbXkiIGRyaXZlciB3b3VsZCBiZToKLXN0YXJ0eCAtLSA6MSAtY29uZmlnIC9ldGMvWDExL3hvcmcuY29uZi5kdW1teQotCi0gICB3aGVyZSB0aGUgZmlsZSAvZXRjL1gxMS94b3JnLmNvbmYuZHVtbXkgaGFzIGl0cyBEZXZpY2UgU2VjdGlvbgotICAgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGFib3ZlLiBUbyB1c2UgdGhlIExEX1BSRUxPQUQgd3JhcHBlciBzY3JpcHQ6Ci1zdGFydHggLS0gL3BhdGgvdG8vWGR1bW15IDoxCi0KLSAgIEFuIHhkbSgxKSBleGFtcGxlIGlzIGFsc28gcHJvdmlkZWQuCi0KLSAgIEluIGdlbmVyYWwsIG9uZSBjYW4gdXNlIHRoZXNlIHNvcnRzIG9mIHNjaGVtZXMgdG8gdXNlIHgxMXZuYyB0byBleHBvcnQKLSAgIG90aGVyIHZpcnR1YWwgWCBzZXNzaW9ucywgc2F5IFhuZXN0IG9yIGV2ZW4gWHZuYyBpdHNlbGYgKHVzZWZ1bCBmb3IKLSAgIHRlc3RpbmcgeDExdm5jLikKLQotICAgTG9jYWwgYWNjZXNzIChWTkMgU2VydmVyIGFuZCBWTkMgVmlld2VyIG9uIHRoZSBzYW1lIG1hY2hpbmUpOiBZb3UgdXNlCi0gICBhIFZOQyB2aWV3ZXIgdG8gYWNjZXNzIHRoZSBkaXNwbGF5IHJlbW90ZWx5OyB0byBhY2Nlc3MgeW91ciB2aXJ0dWFsIFgKLSAgIGRpc3BsYXkgbG9jYWxseSAoaS5lLiB3aGlsZSBzaXR0aW5nIGF0IHRoZSBzYW1lIG1hY2hpbmUgaXQgaXMgcnVubmluZwotICAgb24pIG9uZSBjYW4gcGVyaGFwcyBoYXZlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlaXIgJEhPTUUvLnhpbml0cmMKLSMhL2Jpbi9zaAoteDExdm5jIC1kaXNwbGF5IDo1IC1yZmJwb3J0IDU5MDUgLWJnCi12bmN2aWV3ZXIgLWdlb21ldHJ5ICswKzAgLWVuY29kaW5ncyByYXcgLXBhc3N3ZCAkSE9NRS8udm5jL3Bhc3N3ZCBsb2NhbGhvc3Q6NQotCi0gICBUaGUgZGlzcGxheSBudW1iZXJzIChWTkMgYW5kIFgpIHdpbGwgbGlrZWx5IGJlIGRpZmZlcmVudCAoeW91IGNvdWxkCi0gICBhbHNvIHRyeSAtZmluZCksIGFuZCB5b3UgbWF5IG5vdCBuZWVkIHRoZSAtcGFzc3dkLiBSZWNlbnQgUmVhbFZOQwotICAgdmlld2VycyBtaWdodCBiZSB0aGlzOgotIyEvYmluL3NoCi14MTF2bmMgLWRpc3BsYXkgOjUgLXJmYnBvcnQgNTkwNSAtYmcKLXZuY3ZpZXdlciAtRnVsbFNjcmVlbiAtUHJlZmVycmVkRW5jb2RpbmcgcmF3IC1wYXNzd2QgJEhPTUUvLnZuYy9wYXNzd2QgbG9jYWxob3MKLXQ6NQotCi0gICBUaGlzIHdheSBhIGJhcmUgWCBzZXJ2ZXIgaXMgcnVuIHdpdGggbm8gd2luZG93IG1hbmFnZXIgb3IgZGVza3RvcDsgaXQKLSAgIHNpbXBseSBydW5zIG9ubHkgdGhlIFZOQyBWaWV3ZXIgb24gdGhlIHJlYWwgWCBzZXJ2ZXIuIFRoZSBWaWV3ZXIgdGhlbgotICAgZHJhd3MgdGhlIHZpcnR1YWwgWCBzZXNzaW9uIG9uIHRvIHRoZSByZWFsIG9uZS4gT24geW91ciBzeXN0ZW0gaXQKLSAgIG1pZ2h0IG5vdCBiZSAkSE9NRS8ueGluaXRyYywgYnV0IHJhdGhlciAueHNlc3Npb24sIC5YY2xpZW50cywgb3IKLSAgIHNvbWV0aGluZyBlbHNlLiBZb3Ugd2lsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBpdCBpcyBmb3IgeW91ciBzeXN0ZW0KLSAgIGFuZCBjb25maWd1cmF0aW9uLgotCi0KLSAgIFhETS9HRE0vS0RNIE9uZS1TaG90IFggc2Vzc2lvbnM6IEZvciB0aGUgZ2VuZXJhbCByZXBsYWNlbWVudCBvZiBYdm5jCi0gICBieSBYdmZiK3gxMXZuYywgb25lIHVzZXIgZGVzY3JpYmVzIGEgc2ltaWxhciBzZXR1cCBoZSBjcmVhdGVkIHdoZXJlCi0gICB0aGUgWCBzZXNzaW9ucyBhcmUgb25lLXNob3QncyAoZGVzdHJveWVkIGFmdGVyIHRoZSB2bmN2aWV3ZXIKLSAgIGRpc2Nvbm5lY3RzKSBhbmQgaXQgdXNlcyB0aGUgWERNL0dETS9LRE0gbG9naW4gZ3JlZXRlciBoZXJlLgotCi0KLSAgIFEtNjk6IEhvdyBjYW4gSSB1c2UgeDExdm5jIG9uICJoZWFkbGVzcyIgbWFjaGluZXM/IFdoeSBtaWdodCBJIHdhbnQKLSAgIHRvPwotCi0gICBBbiBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiBvZiB4MTF2bmMgaXMgdG8gbGV0IGl0IGV4cG9ydCBkaXNwbGF5cyBvZgotICAgImhlYWRsZXNzIiBtYWNoaW5lcy4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgaGF2ZSBzb21lIGxhYiBvciBzZXJ2ZXIKLSAgIG1hY2hpbmVzIHdpdGggbm8ga2V5Ym9hcmQsIG1vdXNlLCBvciBtb25pdG9yLCBidXQgZWFjaCBvbmUgc3RpbGwgaGFzIGEKLSAgIHZpZGVvIGNhcmQuIE9uZSBjYW4gdXNlIHgxMXZuYyB0byBwcm92aWRlIGEgc2ltcGxlICJkZXNrdG9wIHNlcnZpY2UiCi0gICBmcm9tIHRoZXNlIHNlcnZlciBtYWNoaW5lcy4KLQotICAgQW4gWCBzZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQgb24gdGhlIGhlYWRsZXNzIG1hY2hpbmUgKHNvbWV0aW1lcyB0aGlzCi0gICByZXF1aXJlcyBjb25maWd1cmluZyB0aGUgWCBzZXJ2ZXIgdG8gbm90IGZhaWwgaWYgaXQgY2Fubm90IGRldGVjdCBhCi0gICBrZXlib2FyZCBvciBtb3VzZSwgc2VlIHRoZSBuZXh0IHBhcmFncmFwaC4pIFRoZW4geW91IGNhbiBleHBvcnQgdGhhdCBYCi0gICBkaXNwbGF5IHZpYSB4MTF2bmMgKGUuZy4gc2VlIHRoaXMgRkFRKSBhbmQgYWNjZXNzIGl0IGZyb20gYW55d2hlcmUgb24KLSAgIHRoZSBuZXR3b3JrIHZpYSBhIFZOQyB2aWV3ZXIuCi0KLSAgIFNvbWUgdGlwcyBvbiBnZXR0aW5nIFggc2VydmVycyB0byBzdGFydCBvbiBtYWNoaW5lcyB3aXRob3V0IGtleWJvYXJkCi0gICBvciBtb3VzZTogRm9yIFhGcmVlODYvWG9yZyB0aGUgT3B0aW9uICJBbGxvd01vdXNlT3BlbkZhaWwiICJ0cnVlIgotICAgIlNlcnZlckZsYWdzIiBjb25maWcgZmlsZSBvcHRpb24gaXMgdXNlZnVsLiBPbiBTb2xhcmlzIFhzdW4gdGhlCi0gICArbmtleWJvYXJkIGFuZCArbm1vdXNlIG9wdGlvbnMgYXJlIHVzZWZ1bCAocHV0IHRoZW0gaW4gdGhlIHNlcnZlcgotICAgY29tbWFuZCBsaW5lIGFyZ3MgaW4gL2V0Yy9kdC9jb25maWcvWHNlcnZlcnMuKSBUaGVyZSBhcmUgcGF0Y2hlcwotICAgYXZhaWxhYmxlIGZvciBYc3VuIGF0IGxlYXNlIGJhY2sgdG8gU29sYXJpcyA4IHRoYXQgc3VwcG9ydCB0aGlzLiBTZWUKLSAgIFhzZXJ2ZXIoMSkgZm9yIG1vcmUgaW5mby4KLQotICAgQWx0aG91Z2ggdGhpcyB1c2FnZSBtYXkgc291bmQgc3RyYW5nZSBpdCBjYW4gYmUgcXVpdGUgdXNlZnVsIGZvciBhIEdVSQotICAgKG9yIG90aGVyKSB0ZXN0aW5nIG9yIFFBIHNldHVwczogdGhlIGVuZ2luZWVycyBkbyBub3QgbmVlZCB0byB3YWxrIHRvCi0gICBsYWIgbWFjaGluZXMgcnVubmluZyBkaWZmZXJlbnQgaGFyZHdhcmUsIE9TJ3MsIHZlcnNpb25zLCBldGMgKG9yIGhhdmUKLSAgIG1hbnkgZGlmZmVyZW50IG1hY2hpbmVzIGluIHRoZWlyIG9mZmljZS4pIFRoZXkganVzdCBjb25uZWN0IHRvIHRoZQotICAgdmFyaW91cyB0ZXN0IG1hY2hpbmVzIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFZOQy4gVGhlIGFkdmFudGFnZSB0bwotICAgdGVzdGluZyB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nIFh2bmMgb3IgZXZlbiBYdmZiIGlzIHRoYXQgdGhlIHRlc3QKLSAgIGlzIGRvbmUgdXNpbmcgdGhlIHJlYWwgWCBzZXJ2ZXIsIGZvbnRzLCB2aWRlbyBoYXJkd2FyZSwgZXRjLiB0aGF0IHdpbGwKLSAgIGJlIHVzZWQgaW4gdGhlIGZpZWxkLgotCi0gICBPbmUgY2FuIGltYWdpbmUgYSBzaW5nbGUgc2VydmVyIG1hY2hpbmUgY3JhbW1lZCB3aXRoIGFzIG1hbnkgdmlkZW8KLSAgIGNhcmRzIGFzIGl0IGNhbiBob2xkIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGFjY2VzcyBvcgotICAgdGVzdGluZyBvbiBkaWZmZXJlbnQga2luZHMgb2YgdmlkZW8gaGFyZHdhcmUuCi0KLSAgIFNlZSBhbHNvIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBkaXNjdXNzaW9uIG9mIHRoZSAiLWRpc3BsYXkKLSAgIFdBSVQ6Y21kPUZJTkRESVNQTEFZIiBvcHRpb24gd2hlcmUgdmlydHVhbCBYdmZiIG9yIFhkdW1teSwgb3IgcmVhbCBYCi0gICBzZXJ2ZXJzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgZm9yIG5ldyB1c2VycyBjb25uZWN0aW5nLiBUaGUgLWZpbmQsCi0gICAtY3JlYXRlLCAtc3ZjLCBhbmQgLXhkbXN2YyBhbGlhc2VzIGNhbiBhbHNvIGNvbWUgaW4gaGFuZHkgaGVyZS4KLQotICAgW1Jlc291cmNlIFVzYWdlIGFuZCBQZXJmb3JtYW5jZV0KLQotICAgUS03MDogSSBoYXZlIGxvdHMgb2YgbWVtb3J5LCBidXQgd2h5IGRvZXMgeDExdm5jIGZhaWwgd2l0aCAgICBzaG1nZXQ6Ci0gICBObyBzcGFjZSBsZWZ0IG9uIGRldmljZSAgICBvciAgICBNaW5vciBvcGNvZGUgb2YgZmFpbGVkIHJlcXVlc3Q6IDEKLSAgIChYX1NobUF0dGFjaCk/Ci0KLSAgIEl0IGlzIG5vdCBhIG1hdHRlciBvZiBmcmVlIG1lbW9yeSwgYnV0IHJhdGhlciBmcmVlIHNoYXJlZCBtZW1vcnkgKHNobSkKLSAgIHNsb3RzLCBhbHNvIGtub3duIGFzIHNobSBzZWdtZW50cy4gVGhpcyBvZnRlbiBvY2N1cnMgb24gYSBwdWJsaWMKLSAgIFNvbGFyaXMgbWFjaGluZSB1c2luZyB0aGUgZGVmYXVsdCBvZiBvbmx5IDEwMCBzbG90cy4gWW91IChvciB0aGUgb3duZXIKLSAgIG9yIHJvb3QpIGNhbiBjbGVhbiB0aGVtIG91dCB3aXRoIGlwY3JtKDEpLiB4MTF2bmMgdHJpZXMgaGFyZCB0bwotICAgcmVsZWFzZSBpdHMgc2xvdHMsIGJ1dCBpdCwgYW5kIG90aGVyIHByb2dyYW1zLCBhcmUgbm90IGFsd2F5cyBhYmxlIHRvCi0gICAoZS5nLiBpZiBraWxsIC05J2QuKQotCi0gICBTb21ldGltZXMgeDExdm5jIHdpbGwgbm90aWNlIHRoZSBwcm9ibGVtIHdpdGggc2htIHNlZ21lbnRzIGFuZCB0cmllcwotICAgdG8gZ2V0IGJ5IHdpdGggZmV3ZXIsIG9ubHkgZ2l2aW5nIGEgd2FybmluZyBsaWtlIHRoaXM6Ci0gIDE5LzAzLzIwMDQgMTA6MTA6NTggc2htYXQodGlsZV9yb3cpIGZhaWxlZC4KLSAgc2htYXQ6IFRvbyBtYW55IG9wZW4gZmlsZXMKLSAgMTkvMDMvMjAwNCAxMDoxMDo1OCBlcnJvciBjcmVhdGluZyB0aWxlLXJvdyBzaG0gZm9yIGxlbj00Ci0gIDE5LzAzLzIwMDQgMTA6MTA6NTggcmV2ZXJ0aW5nIHRvIHNpbmdsZV9jb3B5dGlsZSBtb2RlCi0KLSAgIEhlcmUgaXMgYSBzaGVsbCBzY3JpcHQgc2htX2NsZWFyIHRvIGxpc3QgYW5kIHByb21wdCBmb3IgcmVtb3ZhbCBvZgotICAgeW91ciB1bmF0dGFjaGVkIHNobSBzZWdtZW50cyAoYXR0YWNoZWQgb25lcyBhcmUgc2tpcHBlZC4pIEkgdXNlIGl0Ci0gICB3aGlsZSBkZWJ1Z2dpbmcgeDExdm5jIChJIHVzZSAic2htX2NsZWFyIC15IiB0byBhc3N1bWUgInllcyIgZm9yIGVhY2gKLSAgIHByb21wdC4pIElmIHgxMXZuYyBpcyByZWd1bGFybHkgbm90IGNsZWFuaW5nIHVwIGl0cyBzaG0gc2VnbWVudHMsCi0gICBwbGVhc2UgY29udGFjdCBtZSBzbyB3ZSBjYW4gd29yayB0byBpbXByb3ZlIHRoZSBzaXR1YXRpb24uCi0KLSAgIExvbmdlciB0ZXJtLCBvbiBTb2xhcmlzIHlvdSBjYW4gcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4KLSAgIC9ldGMvc3lzdGVtOgotICBzZXQgc2htc3lzOnNobWluZm9fc2htbWF4ID0gMHgyMDAwMDAwCi0gIHNldCBzaG1zeXM6c2htaW5mb19zaG1tbmkgPSAweDEwMDAKLQotICAgdG8gc3dlZXAgdGhlIHByb2JsZW0gdW5kZXIgdGhlIHJ1ZyAoNDA5NiBzbG90cy4pIE9uIExpbnV4LCBleGFtaW5lCi0gICAvcHJvYy9zeXMva2VybmVsL3NobW1uaTsgeW91IGNhbiBtb2RpZnkgdGhlIHZhbHVlIGJ5IHdyaXRpbmcgdG8gdGhhdAotICAgZmlsZS4KLQotICAgVGhpbmdzIGFyZSBldmVuIG1vcmUgdGlnaHQgb24gU29sYXJpcyA4IGFuZCBlYXJsaWVyLCB0aGVyZSBpcyBhCi0gICBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHNobSBzZWdtZW50cyBwZXIgcHJvY2VzcyBvZiA2LiBUaGUgZXJyb3IgaXMKLSAgIHRoZSBYIHNlcnZlciAobm90IHgxMXZuYykgYmVpbmcgdW5hYmxlIHRvIGF0dGFjaCB0byB0aGUgc2VnbWVudHMsIGFuZAotICAgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAgMzAvMDQvMjAwNCAxNDowNDoyNiBHb3QgY29ubmVjdGlvbiBmcm9tIGNsaWVudCAxOTIuMTY4LjEuMjMKLSAgMzAvMDQvMjAwNCAxNDowNDoyNiAgIG90aGVyIGNsaWVudHM6Ci0gIFggRXJyb3Igb2YgZmFpbGVkIHJlcXVlc3Q6ICBCYWRBY2Nlc3MgKGF0dGVtcHQgdG8gYWNjZXNzIHByaXZhdGUgcmVzb3VyY2UgZGVuCi1pZWQpCi0gICAgIE1ham9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogIDEzMSAoTUlULVNITSkKLSAgICAgTWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0OiAgMSAoWF9TaG1BdHRhY2gpCi0gICAgIFNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3Q6ICAxNAotICAgICBDdXJyZW50IHNlcmlhbCBudW1iZXIgaW4gb3V0cHV0IHN0cmVhbTogIDE3Ci0KLSAgIFRoaXMgdGlnaHQgbGltaXQgb24gU29sYXJpcyA4IGNhbiBiZSBpbmNyZWFzZWQgdmlhOgotICBzZXQgc2htc3lzOnNobWluZm9fc2htc2VnID0gMTAwCi0KLSAgIGluIC9ldGMvc3lzdGVtLiBTZWUgdGhlIG5leHQgcGFyYWdyYXBoIGZvciBtb3JlIHdvcmthcm91bmRzLgotCi0gICBUbyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHNobSBzZWdtZW50cyB1c2VkIGJ5IHgxMXZuYyB0cnkgdXNpbmcgdGhlCi0gICAtb25ldGlsZSBvcHRpb24gKGNvcnJlc3BvbmRzIHRvIG9ubHkgMyBzaG0gc2VnbWVudHMgdXNlZCwgYW5kIGFkZGluZwotICAgLWZzIDEuMCBrbm9ja3MgaXQgZG93biB0byAyLikgSWYgeW91IGFyZSBoYXZpbmcgbXVjaCB0cm91YmxlIHdpdGggc2htCi0gICBzZWdtZW50cywgY29uc2lkZXIgZGlzYWJsaW5nIHNobSBjb21wbGV0ZWx5IHZpYSB0aGUgLW5vc2htIG9wdGlvbi4KLSAgIFBlcmZvcm1hbmNlIHdpbGwgYmUgc29tZXdoYXQgZGVncmFkZWQgYnV0IHdoZW4gZG9uZSBvdmVyIGxvY2FsIG1hY2hpbmUKLSAgIHNvY2tldHMgaXQgc2hvdWxkIGJlIGFjY2VwdGFibGUgKHNlZSBhbiBlYXJsaWVyIHF1ZXN0aW9uIGRpc2N1c3NpbmcKLSAgIC1ub3NobS4pCi0KLQotICAgUS03MTogSG93IGNhbiBJIG1ha2UgeDExdm5jIHVzZSBsZXNzIHN5c3RlbSByZXNvdXJjZXM/Ci0KLSAgIFRoZSAtbmFwIChub3cgb24gYnkgZGVmYXVsdDsgdXNlIC1ub25hcCB0byBkaXNhYmxlKSBhbmQgIi13YWl0IG4iCi0gICAod2hlcmUgbiBpcyB0aGUgc2xlZXAgYmV0d2VlbiBwb2xscyBpbiBtaWxsaXNlY29uZHMsIHRoZSBkZWZhdWx0IGlzIDMwCi0gICBvciBzbykgb3B0aW9uIGFyZSBnb29kIHBsYWNlcyB0byBzdGFydC4gSW4gYWRkaXRpb24sIHNvbWV0aGluZyBsaWtlCi0gICAiLXNiIDE1IiB3aWxsIGNhdXNlIHgxMXZuYyB0byBnbyBpbnRvIGEgZGVlcC1zbGVlcCBtb2RlIGFmdGVyIDE1Ci0gICBzZWNvbmRzIG9mIG5vIGFjdGl2aXR5IChpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDYwLikKLQotICAgUmVkdWNpbmcgdGhlIFggc2VydmVyIGJpdHMgcGVyIHBpeGVsIGRlcHRoIChlLmcuIHRvIDE2YnBwIG9yIGV2ZW4KLSAgIDhicHApIHdpbGwgZnVydGhlciBkZWNyZWFzZSBtZW1vcnkgSS9PIGFuZCBuZXR3b3JrIEkvTy4gVGhlIFNoYWRvd0ZCIFgKLSAgIHNlcnZlciBzZXR0aW5nIHdpbGwgbWFrZSB4MTF2bmMncyBzY3JlZW4gcG9sbGluZyBsZXNzIHNldmVyZS4gVXNpbmcKLSAgIHRoZSAtb25ldGlsZSBvcHRpb24gd2lsbCB1c2UgbGVzcyBtZW1vcnkgYW5kIHVzZSBmZXdlciBzaGFyZWQgbWVtb3J5Ci0gICBzbG90cyAoYWRkIC1mcyAxLjAgZm9yIG9uZSBsZXNzIHNsb3QuKQotCi0KLSAgIFEtNzI6IEhvdyBjYW4gSSBtYWtlIHgxMXZuYyB1c2UgTU9SRSBzeXN0ZW0gcmVzb3VyY2VzPwotCi0gICBZb3UgY2FuIHRyeSAtdGhyZWFkcyAobm90ZSB0aGlzIG1vZGUgY2FuIGJlIHVuc3RhYmxlIGFuZC9vciBjcmFzaDsgYW5kCi0gICBhcyBvZiBNYXkvMjAwOCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgc2VlIHRoZSBvcHRpb24gZGVzY3JpcHRpb24pIG9yCi0gICBkaWFsIGRvd24gdGhlIHdhaXQgdGltZSAoZS5nLiAtd2FpdCAxKSBhbmQgcG9zc2libHkgZGlhbCBkb3duIC1kZWZlcgotICAgYXMgd2VsbC4gTm90ZSB0aGF0IGlmIHlvdSB0cnkgdG8gaW5jcmVhc2UgdGhlICJmcmFtZSByYXRlIiB0b28gbXVjaAotICAgeW91IGNhbiBib2cgZG93biB0aGUgc2VydmVyIGVuZCB3aXRoIHRoZSBleHRyYSB3b3JrIGl0IG5lZWRzIHRvIGRvCi0gICBjb21wcmVzc2luZyB0aGUgZnJhbWVidWZmZXIgZGF0YSwgZXRjLgotCi0gICBUaGF0IHNhaWQsIGl0IGlzIHBvc3NpYmxlIHRvICJzdHJlYW0iIHZpZGVvIHZpYSB4MTF2bmMgaWYgdGhlIHZpZGVvCi0gICB3aW5kb3cgaXMgc21hbGwgZW5vdWdoLiBFLmcuIGEgMjU2eDE5MiB4YXd0diBUViBjYXB0dXJlIHdpbmRvdyAodXNpbmcKLSAgIHRoZSB4MTF2bmMgLWlkIG9wdGlvbikgY2FuIGJlIHN0cmVhbWVkIG92ZXIgYSBMQU4gb3Igd2lyZWxlc3MgYXQgYQotICAgcmVhc29uYWJsZSBmcmFtZSByYXRlLiBJZiB0aGUgZ3JhcGhpY3MgY2FyZCdzIGZyYW1lYnVmZmVyIHJlYWQgcmF0ZSBpcwotICAgZmFzdGVyIHRoYW4gbm9ybWFsIHRoZW4gdGhlIHZpZGVvIHdpbmRvdyBzaXplIGFuZCBmcmFtZSByYXRlIGNhbiBiZQotICAgbXVjaCBoaWdoZXIuIFRoZSB1c2Ugb2YgVHVyYm9WTkMgYW5kL29yIFR1cmJvSlBFRyBjYW4gbWFrZSB0aGUgZnJhbWUKLSAgIHJhdGUgc29tZXdoYXQgaGlnaGVyIHN0aWxsIChidXQgbW9zdCBvZiB0aGlzIGhpbmdlcyBvbiB0aGUgZ3JhcGhpY3MKLSAgIGNhcmQncyByZWFkIHJhdGUuKQotCi0KLSAgIFEtNzM6IEkgdXNlIHgxMXZuYyBvdmVyIGEgc2xvdyBsaW5rIHdpdGggaGlnaCBsYXRlbmN5IChlLmcuIGRpYWx1cAotICAgbW9kZW0gb3IgYnJvYWRiYW5kKSwgaXMgdGhlcmUgYW55dGhpbmcgSSBjYW4gZG8gdG8gc3BlZWQgdGhpbmdzIHVwPwotCi0gICBTb21lIHRoaW5ncyB5b3UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggKG1hbnkgb2Ygd2hpY2ggd2lsbCBoZWxwCi0gICBwZXJmb3JtYW5jZSBvbiBmYXN0ZXIgbGlua3MgYXMgd2VsbCk6Ci0KLSAgICAgWCBzZXJ2ZXIvc2Vzc2lvbiBwYXJhbWV0ZXJzOgotICAgICAqIENvbmZpZ3VyZSB0aGUgWCBzZXJ2ZXIgYml0cyBwZXIgcGl4ZWwgdG8gYmUgMTZicHAgb3IgZXZlbiA4YnBwLgotICAgICAgIChyZWR1Y2VzIGFtb3VudCBvZiBkYXRhIG5lZWRlZCB0byBiZSBwb2xsZWQsIGNvbXByZXNzZWQsIGFuZCBzZW50KQotICAgICAqIFVzZSBhIHNtYWxsZXIgZGVza3RvcCBzaXplIChlLmcuIDEwMjR4NzY4IGluc3RlYWQgb2YgMTI4MHgxMDI0KQotICAgICAqIE1ha2Ugc3VyZSB0aGUgZGVza3RvcCBiYWNrZ3JvdW5kIGlzIGEgc29saWQgY29sb3IgKHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgaXMgcmVzZW50IGV2ZXJ5IHRpbWUgaXQgaXMgcmUtZXhwb3NlZC4pIENvbnNpZGVyIHVzaW5nIHRoZSAtc29saWQKLSAgICAgICBbY29sb3JdIG9wdGlvbiB0byB0cnkgdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgICAqIENvbmZpZ3VyZSB5b3VyIHdpbmRvdyBtYW5hZ2VyIG9yIGRlc2t0b3AgInRoZW1lIiB0byBub3QgdXNlIGZhbmN5Ci0gICAgICAgaW1hZ2VzLCBzaGFkaW5nLCBhbmQgZ3JhZGllbnRzIGZvciB0aGUgd2luZG93IGRlY29yYXRpb25zLCBldGMuCi0gICAgICAgRGlzYWJsZSB3aW5kb3cgYW5pbWF0aW9ucywgZXRjLiBNYXliZSB5b3VyIGRlc2t0b3AgaGFzIGEgImxvdwotICAgICAgIGJhbmR3aWR0aCIgdGhlbWUgeW91IGNhbiBlYXNpbHkgc3dpdGNoIGludG8gYW5kIG91dCBvZi4gQWxzbyBpbgotICAgICAgIEZpcmVmb3ggZGlzYWJsZSBleWUtY2FuZHksIGUuZy46IEVkaXQgLT4gUHJlZmVyZW5jZXMgLT4gQWR2YW5jZWQKLSAgICAgICAtPiBVc2UgU21vb3RoIFNjcm9sbGluZyAoZGVzZWxlY3QgaXQuKQotICAgICAqIEF2b2lkIHNtYWxsIHNjcm9sbHMgb2YgbGFyZ2Ugd2luZG93cyB1c2luZyB0aGUgQXJyb3cga2V5cyBvcgotICAgICAgIHNjcm9sbGJhci4gVHJ5IHRvIHVzZSBQYWdlVXAvUGFnZURvd24gaW5zdGVhZC4gKG5vdCBzbyBtdWNoIG9mIGEKLSAgICAgICBwcm9ibGVtIGluIHgxMXZuYyAwLjcuMiBpZiAtc2Nyb2xsY29weXJlY3QgaXMgYWN0aXZlIGFuZCBkZXRlY3RpbmcKLSAgICAgICBzY3JvbGxzIGZvciB0aGUgYXBwbGljYXRpb24uKQotICAgICAqIElmIHRoZSAtd2lyZWZyYW1lIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIChlYXJsaWVyIHRoYW4geDExdm5jCi0gICAgICAgMC43LjIgb3IgeW91IGhhdmUgZGlzYWJsZWQgaXQgdmlhIC1ub3dpcmVmcmFtZSkgdGhlbiBEaXNhYmxlCi0gICAgICAgT3BhcXVlIE1vdmVzIGFuZCBSZXNpemVzIGluIHRoZSB3aW5kb3cgbWFuYWdlci9kZXNrdG9wLgotICAgICAqIEhvd2V2ZXIgaWYgLXdpcmVmcmFtZSBpcyBhY3RpdmUgKG9uIGJ5IGRlZmF1bHQgaW4geDExdm5jIDAuNy4yKQotICAgICAgIHRoZW4geW91IHNob3VsZCBFbmFibGUgT3BhcXVlIE1vdmVzIGFuZCBSZXNpemVzIGluIHRoZSB3aW5kb3cKLSAgICAgICBtYW5hZ2VyISBUaGlzIHNlZW1zIGNvdW50ZXItaW50dWl0aXZlLCBidXQgYmVjYXVzZSB4MTF2bmMgZGV0ZWN0cwotICAgICAgIHRoZSBtb3ZlL3Jlc2l6ZSBldmVudHMgZWFybHkgdGhlcmUgaXMgYSBodWdlIHNwZWVkdXAgb3ZlciBhIHNsb3cKLSAgICAgICBsaW5rIHdoZW4gT3BhcXVlIE1vdmVzIGFuZCBSZXNpemVzIGFyZSBlbmFibGVkLiAoZS5nLiBDb3B5UmVjdAotICAgICAgIGVuY29kaW5nIHdpbGwgYmUgdXNlZC4pCi0gICAgICogVHVybiBvZmYgQW50aS1hbGlhc2VkIGZvbnRzIG9uIHlvdXIgc3lzdGVtLCB3ZWIgYnJvd3NlciwgdGVybWluYWwKLSAgICAgICB3aW5kb3dzLCBldGMuIEFBIGZvbnRzIGRvIG5vdCBjb21wcmVzcyBhcyB3ZWxsIGFzIHRyYWRpdGlvbmFsCi0gICAgICAgZm9udHMgKHNvbWV0aW1lcyAxMFggbGVzcy4pCi0gICAgICogT24gRmlyZWZveC9Nb3ppbGxhIChhbmQgYW55dGhpbmcgZWxzZSkgdHVybiBvZmYgIlNtb290aCBTY3JvbGwiCi0gICAgICAgYW5pbWF0aW9ucy4gSW4gRmlyZWZveCBwdXQgaW4gdGhlIFVSTCAiYWJvdXQ6Y29uZmlnIiBhbmQgc2V0Ci0gICAgICAgZ2VuZXJhbC5zbW9vdGhTY3JvbGwgdG8gZmFsc2UuCi0gICAgICogT24gWG9yZy9YRnJlZTg2IHR1cm4gb24gdGhlIFNoYWRvdyBGcmFtZWJ1ZmZlciB0byBzcGVlZCB1cAotICAgICAgIHJlYWRpbmcuIChPcHRpb24gIlNoYWRvd0ZCIiAidHJ1ZSIgaW4gdGhlIERldmljZSBzZWN0aW9uIG9mCi0gICAgICAgL2V0Yy9YMTEvWEY4NkNvbmZpZykgVGhpcyBkaXNhYmxlcyAyRCBhY2NlbGVyYXRpb24gb24gdGhlIHBoeXNpY2FsCi0gICAgICAgZGlzcGxheSBhbmQgc28gbWF5IG5vdCBiZSB3b3J0aCBpdCAoaWYgeW91IHBsYXkgZ2FtZXMsIGV0YyksIGJ1dAotICAgICAgIGNvdWxkIGJlIG9mIHVzZSBpbiBzb21lIHNpdHVhdGlvbnMuIE5vdGU6IElmIHRoZSBuZXR3b3JrIGxpbmsgaXMKLSAgICAgICB2ZXJ5IHNsb3csIHRoaXMgc3BlZWR1cCBtYXkgbm90IGJlIG5vdGljZWQuCi0KLSAgICAgVk5DIHZpZXdlciBwYXJhbWV0ZXJzOgotICAgICAqIFVzZSBhIFRpZ2h0Vk5DIGVuYWJsZWQgdmlld2VyISAoQWN0dWFsbHksIFJlYWxWTkMgNC54IHZpZXdlciB3aXRoCi0gICAgICAgWlJMRSBlbmNvZGluZyBpcyBub3QgdG9vIGJhZCBlaXRoZXI7IHNvbWUgY2xhaW0gaXQgaXMgZmFzdGVyLikKLSAgICAgKiBNYWtlIHN1cmUgdGhlIHRpZ2h0IChvciB6cmxlKSBlbmNvZGluZyBpcyBiZWluZyB1c2VkIChsb29rIGF0Ci0gICAgICAgdm5jdmlld2VyIGFuZCB4MTF2bmMgb3V0cHV0cykKLSAgICAgKiBSZXF1ZXN0IDggYml0cyBwZXIgcGl4ZWwgdXNpbmcgLWJncjIzMyAodXAgdG8gNFggc3BlZWR1cCBvdmVyCi0gICAgICAgZGVwdGggMjQgVHJ1ZUNvbG9yICgzMmJwcCksIGJ1dCBjb2xvcnMgd2lsbCBiZSBvZmYpCi0gICAgICogUmVhbFZOQyA0Lnggdmlld2VyIGhhcyBzb21lIGV4dHJlbWVseSBsb3cgY29sb3IgbW9kZXMgKG9ubHkgNjQgYW5kCi0gICAgICAgZXZlbiA4IGNvbG9ycy4pIFNTVk5DIGRvZXMgdG9vLiBUaGUgY29sb3JzIGFyZSBwb29yLCBidXQgaXQgaXMKLSAgICAgICB1c3VhbGx5IG5vdGljZWFibHkgZmFzdGVyIHRoYW4gYmdyMjMzICgyNTYgY29sb3JzLikKLSAgICAgKiBUcnkgaW5jcmVhc2luZyB0aGUgVGlnaHRWTkMgLWNvbXByZXNzbGV2ZWwgKGNvbXByZXNzZXMgbW9yZSBvbgotICAgICAgIHNlcnZlciBzaWRlIGJlZm9yZSBzZW5kaW5nLCBidXQgdXNlcyBtb3JlIENQVSkKLSAgICAgKiBUcnkgcmVkdWNpbmcgdGhlIFRpZ2h0Vk5DIC1xdWFsaXR5IChpbmNyZWFzZXMgSlBFRyBjb21wcmVzc2lvbiwKLSAgICAgICBidXQgaXMgbG9zc3kgd2l0aCBwYWludGluZyBhcnRpZmFjdHMpCi0gICAgICogVHJ5IG90aGVyIFZOQyBlbmNvZGluZ3MgdmlhIC1lbmNvZGluZ3MgKHRpZ2h0IG1heSBiZSB0aGUgZmFzdGVzdCwKLSAgICAgICBidXQgeW91IHNob3VsZCBjb21wYXJlIGl0IHRvIHpybGUgYW5kIG1heWJlIHNvbWUgb2YgdGhlIG90aGVycykKLSAgICAgKiBPbiB0aGUgbWFjaGluZSB3aGVyZSB2bmN2aWV3ZXIgaXMgcnVuLCBtYWtlIHN1cmUgQmFja2luZyBTdG9yZSBpcwotICAgICAgIGVuYWJsZWQgKFhvcmcvWEZyZWU4NiBkaXNhYmxlcyBpdCBieSBkZWZhdWx0IGNhdXNpbmcgcmUtZXhwb3N1cmVzCi0gICAgICAgb2Ygdm5jdmlld2VyIHRvIGJlIHZlcnkgc2xvdykgT3B0aW9uICJiYWNraW5nc3RvcmUiIGluIGNvbmZpZwotICAgICAgIGZpbGUuCi0KLSAgICAgeDExdm5jIHBhcmFtZXRlcnM6Ci0gICAgICogTWFrZSBzdXJlIHRoZSAtd2lyZWZyYW1lIG9wdGlvbiBpcyBhY3RpdmUgKGl0IHNob3VsZCBiZSBvbiBieQotICAgICAgIGRlZmF1bHQpIGFuZCB5b3UgaGF2ZSBPcGFxdWUgTW92ZXMvUmVzaXplcyBFbmFibGVkIGluIHRoZSB3aW5kb3cKLSAgICAgICBtYW5hZ2VyLgotICAgICAqIE1ha2Ugc3VyZSB0aGUgLXNjcm9sbGNvcHlyZWN0IG9wdGlvbiBpcyBhY3RpdmUgKGl0IHNob3VsZCBiZSBvbiBieQotICAgICAgIGRlZmF1bHQuKSBUaGlzIGRldGVjdHMgc2Nyb2xscyBpbiBtYW55IChidXQgbm90IGFsbCkgYXBwbGljYXRpb25zCi0gICAgICAgYW4gYXBwbGllcyB0aGUgQ29weVJlY3QgZW5jb2RpbmcgZm9yIGEgYmlnIHNwZWVkdXAuCi0gICAgICogRW5mb3JjZSBhIHNvbGlkIGJhY2tncm91bmQgd2hlbiBWTkMgdmlld2VycyBhcmUgY29ubmVjdGVkIHZpYQotICAgICAgIC1zb2xpZAotICAgICAqIFRyeSB4MTF2bmMncyBjbGllbnQtc2lkZSBjYWNoaW5nIGNsaWVudC1zaWRlIGNhY2hpbmcgc2NoZW1lOgotICAgICAgIC1uY2FjaGUKLSAgICAgKiBTcGVjaWZ5IC1zcGVlZHMgbW9kZW0gdG8gZm9yY2UgdGhlIHdpcmVmcmFtZSBhbmQgc2Nyb2xsY29weXJlY3QKLSAgICAgICBoZXVyaXN0aWMgcGFyYW1ldGVycyAoYW5kIGFueSBmdXR1cmUgb25lcykgdG8gdGhvc2Ugb2YgYSBkaWFsdXAKLSAgICAgICBtb2RlbSBjb25uZWN0aW9uIChvciBzdXBwbHkgdGhlIHJkLGJ3LGxhdCBudW1lcmljYWwgdmFsdWVzIHRoYXQKLSAgICAgICBjaGFyYWN0ZXJpemUgeW91ciBsaW5rLikKLSAgICAgKiBJZiB3aXJlZnJhbWUgYW5kIHNjcm9sbGNvcHlyZWN0IGFyZW4ndCB3b3JraW5nLCB0cnkgdXNpbmcgdGhlIG1vcmUKLSAgICAgICBkcmFzdGljIC1ub2RyYWdnaW5nIChubyBzY3JlZW4gdXBkYXRlcyB3aGVuIGRyYWdnaW5nIG1vdXNlLCBidXQKLSAgICAgICBzb21ldGltZXMgeW91IG1pc3MgdmlzdWFsIGZlZWRiYWNrKQotICAgICAqIFNldCAtZnMgMS4wIChkaXNhYmxlcyBmdWxsc2NyZWVuIHVwZGF0ZXMpCi0gICAgICogVHJ5IGluY3JlYXNpbmcgLXdhaXQgb3IgLWRlZmVyIChyZWR1Y2VzIHRoZSBtYXhpbXVtICJmcmFtZSByYXRlIiwKLSAgICAgICBidXQgd29uJ3QgaGVscCBtdWNoIGZvciBsYXJnZSBzY3JlZW4gY2hhbmdlcykKLSAgICAgKiBUcnkgdGhlIC1wcm9ncmVzc2l2ZSBwaXhlbGhlaWdodCBtb2RlIHdpdGggdGhlIGJsb2NrIHBpeGVsaGVpZ2h0Ci0gICAgICAgMTAwIG9yIHNvIChkZWxheXMgc2VuZGluZyB2ZXJ0aWNhbCBibG9ja3Mgc2luY2UgdGhleSBtYXkgY2hhbmdlCi0gICAgICAgd2hpbGUgdmlld2VyIGlzIHJlY2VpdmluZyBlYXJsaWVyIG9uZXMpCi0gICAgICogSWYgeW91IGp1c3Qgd2FudCB0byB3YXRjaCBvbmUgKHNpbXBsZSkgd2luZG93IHVzZSAtaWQgb3IgLWFwcHNoYXJlCi0gICAgICAgKGN1dHMgZG93biBleHRyYW5lb3VzIHBvbGxpbmcgYW5kIHVwZGF0ZXMsIGJ1dCBjYW4gYmUgYnVnZ3kgb3IKLSAgICAgICBpbnN1ZmZpY2llbnQpCi0gICAgICogU2V0IC1ub3NlbCAoZGlzYWJsZXMgYWxsIGNsaXBib2FyZCBzZWxlY3Rpb24gZXhjaGFuZ2UpCi0gICAgICogVXNlIC1ub2N1cnNvciBhbmQgLW5vY3Vyc29ycG9zIChyZXBhaW50aW5nIHRoZSByZW1vdGUgY3Vyc29yCi0gICAgICAgcG9zaXRpb24gYW5kIHNoYXBlIHRha2VzIHJlc291cmNlcyBhbmQgcm91bmQgdHJpcHMpCi0gICAgICogT24gdmVyeSBzbG93IGxpbmtzIChlLmcuIDw9IDI4LjgpIHlvdSBtYXkgbmVlZCB0byBpbmNyZWFzZSB0aGUKLSAgICAgICAtcmVhZHRpbWVvdXQgbiBzZXR0aW5nIGlmIGl0IHNvbWV0aW1lcyB0YWtlcyBtb3JlIHRoYW4gMjBzZWMgdG8KLSAgICAgICBwYWludCB0aGUgZnVsbCBzY3JlZW4sIGV0Yy4KLSAgICAgKiBEbyBub3QgdXNlIC1maXhzY3JlZW4gdG8gYXV0b21hdGljYWxseSByZWZyZXNoIHRoZSB3aG9sZSBzY3JlZW4sCi0gICAgICAgdGFwIHRocmVlIEFsdF9MJ3MgdGhlbiB0aGUgc2NyZWVuIGhhcyBwYWludGluZyBlcnJvcnMgKHJhcmUKLSAgICAgICBwcm9ibGVtLikKLQotCi0gICBFeGFtcGxlIGZvciB0aGUgS0RFIGRlc2t0b3A6Ci0KLSAgIExhdW5jaCB0aGUgIktERSBDb250cm9sIENlbnRlciIgdXRpbGl0eS4gU29tZXRpbWVzIHRoaXMgaXMgY2FsbGVkCi0gICAiUGVyc29uYWwgU2V0dGluZ3MiLgotCi0gICBTZWxlY3QgIkRlc2t0b3AiLgotCi0gICAgVGhlbiBTZWxlY3QgIldpbmRvdyBCZWhhdmlvciIuIEluIHRoZSAiTW92aW5nIiBUYWIgc2V0IHRoZXNlOgotICAgICAqIFlFUyAtIERpc3BsYXkgY29udGVudCBpbiBtb3Zpbmcgd2luZG93cwotICAgICAqIFlFUyAtIERpc3BsYXkgY29udGVudCBpbiByZXNpemluZyB3aW5kb3dzCi0gICAgICogTk8gICAtIERpc3BsYXkgd2luZG93IGdlb21ldHJ5IHdoZW4gbW92aW5nIG9yIHJlc2l6aW5nCi0gICAgICogTk8gICAtIEFuaW1hdGUgbWluaW1pemUgYW5kIHJlc3RvcmUKLQotICAgIEluIHRoZSAiVHJhbnNsdWNlbmN5IiBUYWIgc2V0OgotICAgICAqIE5PICAgLSBVc2UgdHJhbnNsdWNlbmN5L3NoYWRvd3MKLQotICAgTmV4dCBoaXQgIkJhY2siIGFuZCB0aGVuIHNlbGVjdCAiUGFuZWxzIi4KLQotICAgIEluIHRoZSAiQXBwZWFyYW5jZSIgVGFiIHNldDoKLSAgICAgKiBOTyAgIC0gRW5hYmxlIGljb24gbW91c2VvdmVyIGVmZmVjdHMKLSAgICAgKiBOTyAgIC0gRW5hYmxlIHRyYW5zcGFyZW5jeQotCi0gICBOb3cgZ28gYWxsIHRoZSB3YXkgYmFjayB1cCB0byB0aGUgdG9wIGFuZCBTZWxlY3QgIkFwcGVhcmFuY2UgJgotICAgVGhlbWVzIi4KLQotICAgIFNlbGVjdCAiQmFja2dyb3VuZCIgYW5kIHNldDoKLSAgICAgKiBZRVMgLSBObyBwaWN0dXJlCi0gICAgICogQ29sb3JzOiBTaW5nbGUgQ29sb3IKLQotICAgIFNlbGVjdCAiRm9udHMiIGFuZCBkaXNhYmxlIGFudGktYWxpYXNlZCBmb250cyBpZiB5b3UgYXJlIGJvbGQgZW5vdWdoLgotCi0gICAgU2VsZWN0ICJMYXVuY2ggRmVlZGJhY2siIGFuZCBzZXQ6Ci0gICAgICogQnVzeSBDdXJzb3I6IE5vIEJ1c3kgQ3Vyc29yCi0gICAgICogTk8gICAtIEVuYWJsZSB0YXNrYmFyIG5vdGlmaWNhdGlvbgotCi0gICAgU2VsZWN0ICJTY3JlZW4gU2F2ZXIiIGFuZCBzZXQ6Ci0gICAgICogU2NyZWVuIFNhdmVyOiBCbGFuayBTY3JlZW4KLQotICAgIFNlbGVjdCAiU3R5bGUiIGFuZCBpbiB0aGUgIkVmZmVjdHMiIFRhYiBzZXQ6Ci0gICAgICogTk8gICAtIEVuYWJsZSBHVUkgZWZmZWN0cwotCi0KLSAgIEV4YW1wbGUgZm9yIHRoZSBHTk9NRSBkZXNrdG9wOgotICAgICAqIFRCRC4KLQotCi0gICBRLTc0OiBEb2VzIHgxMXZuYyBzdXBwb3J0IHRoZSBYIERBTUFHRSBYc2VydmVyIGV4dGVuc2lvbiB0byBmaW5kCi0gICBtb2RpZmllZCByZWdpb25zIG9mIHRoZSBzY3JlZW4gcXVpY2tseSBhbmQgZWZmaWNpZW50bHk/Ci0KLSAgIFllcywgYXMgb2YgTWFyLzIwMDUgeDExdm5jIHdpbGwgdXNlIHRoZSBYIERBTUFHRSBleHRlbnNpb24gYnkgZGVmYXVsdAotICAgaWYgaXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBkaXNwbGF5LiBUaGlzIHJlcXVpcmVzIGxpYlhkYW1hZ2UgdG8gYmUKLSAgIGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgYXMgd2VsbCAocmVjZW50IExpbnV4IGRpc3Ryb3MgYW5kCi0gICBTb2xhcmlzIDEwIGhhdmUgaXQuKQotCi0gICBUaGUgREFNQUdFIGV4dGVuc2lvbiBlbmFibGVzIHRoZSBYIHNlcnZlciB0byByZXBvcnQgY2hhbmdlZCByZWdpb25zIG9mCi0gICB0aGUgc2NyZWVuIGJhY2sgdG8geDExdm5jLiBTbyB4MTF2bmMgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIHdoZXJlIHRoZQotICAgY2hhbmdlcyBhcmUgKGJ5IHBvbGxpbmcgZXZlcnkgcGl4ZWwgb2YgdGhlIGVudGlyZSBzY3JlZW4gZXZlcnkgMi00Ci0gICBzZWNvbmRzLikgVGhlIHVzZSBvZiBYIERBTUFHRSBkcmFtYXRpY2FsbHkgcmVkdWNlcyB0aGUgbG9hZCB3aGVuIHRoZQotICAgc2NyZWVuIGlzIG5vdCBjaGFuZ2luZyB2ZXJ5IG11Y2ggKGkuZS4gbW9zdCBvZiB0aGUgdGltZS4pIEl0IGFsc28KLSAgIG5vdGljZWFibHkgaW1wcm92ZXMgdXBkYXRlcywgZXNwZWNpYWxseSBmb3IgdmVyeSBzbWFsbCBjaGFuZ2VkIGFyZWFzCi0gICAoZS5nLiBjbG9jayB0aWNraW5nLCBjdXJzb3IgZmxhc2hpbmcsIHR5cGluZywgZXRjLikKLQotICAgTm90ZSB0aGF0IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGRvZXMgbm90IHNwZWVkIHVwIHRoZSBhY3R1YWwgcmVhZGluZyBvZgotICAgcGl4ZWxzIGZyb20gdGhlIHZpZGVvIGNhcmQgZnJhbWVidWZmZXIgbWVtb3J5LCBieSwgc2F5LCBtaXJyb3JpbmcgdGhlbQotICAgaW4gbWFpbiBtZW1vcnkuIFNvIHJlYWRpbmcgdGhlIGZiIGlzIHN0aWxsIHBhaW5mdWxseSBzbG93IChlLmcuCi0gICA1TUIvc2VjKSwgYW5kIHNvIGV2ZW4gdXNpbmcgWCBEQU1BR0Ugd2hlbiBsYXJnZSBjaGFuZ2VzIG9jY3VyIG9uIHRoZQotICAgc2NyZWVuIHRoZSBidWxrIG9mIHRoZSB0aW1lIGlzIHN0aWxsIHNwZW50IHJldHJpZXZpbmcgdGhlbS4gTm90IGlkZWFsLAotICAgYnV0IHVzZSBvZiB0aGUgU2hhZG93RkIgWEZyZWU4Ni9Yb3JnIG9wdGlvbiBzcGVlZHMgdXAgdGhlIHJlYWRpbmcKLSAgIGNvbnNpZGVyYWJseSAoYXQgdGhlIGNvc3Qgb2YgaC93IGFjY2VsZXJhdGlvbi4pCi0KLSAgIFVuZm9ydHVuYXRlbHkgdGhlIGN1cnJlbnQgWG9yZyBEQU1BR0UgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIGNhbiBhdAotICAgdGltZXMgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSBhbmQgcmVwb3J0IHZlcnkgbGFyZ2UgcmVjdGFuZ2xlcyBhcwotICAgImRhbWFnZWQiIGV2ZW4gdGhvdWdoIG9ubHkgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSBwaXhlbHMgaGF2ZSBhY3R1YWxseQotICAgYmVlbiBtb2RpZmllZC4gVGhpcyBiZWhhdmlvciBpcyBvZnRlbiB0aGUgZmF1bHQgb2YgdGhlIHdpbmRvdyBtYW5hZ2VyCi0gICAoZS5nLiBpdCByZWRyYXdzIHRoZSBlbnRpcmUsIHVuc2VlbiwgZnJhbWUgd2luZG93IHVuZGVybmVhdGggdGhlCi0gICBhcHBsaWNhdGlvbiB3aW5kb3cgd2hlbiBpdCBnYWlucyBmb2N1cyksIG9yIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYKLSAgIChlLmcuIGRvZXMgbGFyZ2UsIHVubmVjZXNzYXJ5IHJlcGFpbnRzLikKLQotICAgVG8gd29yayBhcm91bmQgdGhpcyBkZWZpY2llbmN5LCB4MTF2bmMgY3VycmVudGx5IG9ubHkgdHJ1c3RzIHNtYWxsCi0gICBEQU1BR0UgcmVjdGFuZ2xlcyB0byBjb250YWluIHJlYWwgZGFtYWdlLiBUaGUgbGFyZ2VyIHJlY3RhbmdsZXMgYXJlCi0gICBvbmx5IHVzZWQgYXMgaGludHMgdG8gZm9jdXMgdGhlIHRyYWRpdGlvbmFsIHNjYW5saW5lIHBvbGxpbmcgKGkuZS4gaWYKLSAgIGEgc2NhbmxpbmUgZG9lc24ndCBpbnRlcnNlY3QgYSByZWNlbnQgREFNQUdFIHJlY3RhbmdsZSwgdGhlIHNjYW4gaXMKLSAgIHNraXBwZWQuKSBZb3UgY2FuIHVzZSB0aGUgIi14ZF9hcmVhIEEiIG9wdGlvbiB0byBhZGp1c3QgdGhlIHNpemUgb2YKLSAgIHRoZSB0cnVzdGVkIERBTUFHRSByZWN0YW5nbGVzLiBUaGUgZGVmYXVsdCBpcyAyMDAwMCBwaXhlbHMgKGUuZy4gYQotICAgMTQweDE0MCBzcXVhcmUsIGV0Yy4pIFVzZSAiLXhkX2FyZWEgMCIgdG8gZGlzYWJsZSB0aGUgY3V0b2ZmIGFuZCB0cnVzdAotICAgYWxsIERBTUFHRSByZWN0YW5nbGVzLgotCi0gICBUaGUgb3B0aW9uICIteGRfbWVtIGYiIG1heSBhbHNvIGJlIG9mIHVzZSBpbiB0dW5pbmcgdGhlIGFsZ29yaXRobS4gVG8KLSAgIGRpc2FibGUgdXNpbmcgREFNQUdFIGVudGlyZWx5IHVzZSAiLW5veGRhbWFnZSIuCi0KLQotICAgUS03NTogTXkgT3BlbkdMIGFwcGxpY2F0aW9uIHNob3dzIG5vIHNjcmVlbiB1cGRhdGVzIHVubGVzcyBJIHN1cHBseQotICAgdGhlIC1ub3hkYW1hZ2Ugb3B0aW9uIHRvIHgxMXZuYy4KLSAgIE9uZSB1c2VyIHJlcG9ydHMgaW4gaGlzIGVudmlyb25tZW50IChNeXRoVFYgdXNpbmcgdGhlIE5WSURJQSBPcGVuR0wKLSAgIGRyaXZlcnMpIGhlIGdldHMgbm8gdXBkYXRlcyBhZnRlciB0aGUgaW5pdGlhbCBzY3JlZW4gaXMgZHJhd24gdW5sZXNzCi0gICBoZSB1c2VzIHRoZSAiLW5veGRhbWFnZSIgb3B0aW9uLgotCi0gICBUaGlzIHNlZW1zIHRvIGJlIGEgYnVnIGluIHRoZSBYIERBTUFHRSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IGRyaXZlci4KLSAgIFlvdSBtYXkgaGF2ZSB0byB1c2UgLW5veGRhbWFnZSBhcyB3ZWxsLiBBIHdheSB0byBhdXRvZGV0ZWN0IHRoaXMgd2lsbAotICAgYmUgdHJpZWQsIHByb2JhYmx5IHRoZSBiZXN0IGl0IHdpbGwgZG8gaXMgYXV0b21hdGljYWxseSBzdG9wIHVzaW5nIFgKLSAgIERBTUFHRS4KLQotICAgQSBkZXZlbG9wZXIgZm9yIE1pbmlNeXRoIHJlcG9ydHMgdGhhdCB0aGUgJ2FscGhhcHVsc2UnIHRhZyBvZiB0aGUKLSAgIHRoZW1lIEcuQS5OLlQuIGNhbiBhbHNvIGNhdXNlIHByb2JsZW1zLCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbgotICAgdXNpbmcgVk5DLgotCi0gICBVcGRhdGU6IHNlZSB0aGlzIEZBUSB0b28uCi0KLQotICAgUS03NjogV2hlbiBJIGRyYWcgd2luZG93cyBhcm91bmQgd2l0aCB0aGUgbW91c2Ugb3Igc2Nyb2xsIHVwIGFuZCBkb3duCi0gICB0aGluZ3MgcmVhbGx5IGJvZyBkb3duICh1bmxlc3MgSSBkbyB0aGUgZHJhZyBpbiBhIHNpbmdsZSwgcXVpY2sKLSAgIG1vdGlvbi4pIElzIHRoZXJlIGFueXRoaW5nIHRvIGRvIHRvIGltcHJvdmUgdGhpbmdzPwotCi0gICBUaGlzIHByb2JsZW0gaXMgcHJpbWFyaWx5IGR1ZSB0byBzbG93IGhhcmR3YXJlIHJlYWQgcmF0ZXMgZnJvbSB2aWRlbwotICAgY2FyZHM6IGFzIHlvdSBzY3JvbGwgb3IgbW92ZSBhIGxhcmdlIHdpbmRvdyBhcm91bmQgdGhlIHNjcmVlbiBjaGFuZ2VzCi0gICBhcmUgbXVjaCB0b28gcmFwaWQgZm9yIHgxMXZuYyB0byBrZWVwIHVwIHRoZW0gKGl0IGNhbiB1c3VhbGx5IG9ubHkKLSAgIHJlYWQgdGhlIHZpZGVvIGNhcmQgYXQgYWJvdXQgNS0xMCBNQi9zZWMsIHNvIGl0IGNhbiB0YWtlIGEgZ29vZAotICAgZnJhY3Rpb24gb2YgYSBzZWNvbmQgdG8gcmVhZCB0aGUgY2hhbmdlcyBpbmR1Y2UgZnJvbSBtb3ZpbmcgYSBsYXJnZQotICAgd2luZG93LCBpZiB0aGlzIHRvIGJlIGRvbmUgYSBudW1iZXIgb2YgdGltZXMgaW4gc3VjY2Vzc2lvbiB0aGUgd2luZG93Ci0gICBvciBzY3JvbGwgYXBwZWFycyB0byAibHVyY2giIGZvcndhcmQuKSBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZQotICAgLXBvaW50ZXJfbW9kZSBvcHRpb24gZm9yIG1vcmUgaW5mby4gVGhlIG5leHQgYm90dGxlbmVjayBpcyBjb21wcmVzc2luZwotICAgYWxsIG9mIHRoZXNlIGNoYW5nZXMgYW5kIHNlbmRpbmcgdGhlbSBvdXQgdG8gY29ubmVjdGVkIHZpZXdlcnMsCi0gICBob3dldmVyIHRoZSBWTkMgcHJvdG9jb2wgaXMgcHJldHR5IG11Y2ggc2VsZi1hZGFwdGluZyB3aXRoIHJlc3BlY3QgdG8KLSAgIHRoYXQgKHVwZGF0ZXMgYXJlIG9ubHkgcGFja2FnZWQgYW5kIHNlbnQgd2hlbiB2aWV3ZXJzIGFzayBmb3IgdGhlbS4pCi0KLSAgIEFzIG9mIEphbi8yMDA0IHRoZXJlIGFyZSBzb21lIGltcHJvdmVtZW50cyB0byBsaWJ2bmNzZXJ2ZXIuIFRoZQotICAgZGVmYXVsdCBzaG91bGQgbm93IGJlIG11Y2ggYmV0dGVyIHRoYW4gYmVmb3JlIGFuZCBkcmFnZ2luZyBzbWFsbAotICAgd2luZG93cyBhcm91bmQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGh1Z2UgcGFpbi4gSWYgZm9yIHNvbWUgcmVhc29uCi0gICB0aGVzZSBjaGFuZ2VzIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQgd2F5IHZpYQotICAgdGhlICItcG9pbnRlcl9tb2RlIDEiIG9wdGlvbi4KLQotICAgQWxzbyBhZGRlZCB3YXMgdGhlIC1ub2RyYWdnaW5nIG9wdGlvbiB0aGF0IGRpc2FibGVzIGFsbCBzY3JlZW4gdXBkYXRlcwotICAgd2hpbGUgZHJhZ2dpbmcgd2l0aCB0aGUgbW91c2UgKGkuZS4gbW91c2UgbW90aW9uIHdpdGggYSBidXR0b24gaGVsZAotICAgZG93bi4pIFRoaXMgZ2l2ZXMgdGhlIHNuYXBwaWVzdCByZXNwb25zZSwgYnV0IG1pZ2h0IGJlIHVuZGVzaXJlZCBpbgotICAgc29tZSBjaXJjdW1zdGFuY2VzIHdoZW4geW91IHdhbnQgdG8gc2VlIHRoZSB2aXN1YWwgZmVlZGJhY2sgd2hpbGUKLSAgIGRyYWdnaW5nIChlLmcuIG1lbnUgdHJhdmVyc2FsIG9yIHRleHQgc2VsZWN0aW9uLikKLQotICAgQXMgb2YgRGVjLzIwMDQgdGhlIC1wb2ludGVyX21vZGUgbiBvcHRpb24gd2FzIGludHJvZHVjZWQuIG49MSBpcyB0aGUKLSAgIG9yaWdpbmFsIG1vZGUsIG49MiBhbiBpbXByb3ZlbWVudCwgZXRjLi4gU2VlIHRoZSAtcG9pbnRlcl9tb2RlIG4gaGVscAotICAgZm9yIG1vcmUgaW5mby4KLQotICAgQWxzbywgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHRoZSAtdGhyZWFkcyBvcHRpb24gY2FuIGltcHJvdmUgcmVzcG9uc2UKLSAgIGNvbnNpZGVyYWJseS4gQmUgZm9yZXdhcm5lZCB0aGF0IGlmIG1vcmUgdGhhbiBvbmUgdm5jdmlld2VyIGlzCi0gICBjb25uZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSB0aGVuIGxpYnZuY3NlcnZlciBtYXkgbm90IGJlIHRocmVhZCBzYWZlCi0gICAodHJ5IHRvIGdldCB0aGUgdmlld2VycyB0byB1c2UgZGlmZmVyZW50IFZOQyBlbmNvZGluZ3MsIGUuZy4gdGlnaHQgYW5kCi0gICBaUkxFLikgVGhpcyBvcHRpb24gY2FuIGJlIHVuc3RhYmxlIGFuZCBzbyBhcyBvZiBGZWIvMjAwOCBpdCBpcwotICAgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2V0IGVudi4gWDExVk5DX1RIUkVBREVEPTEgdG8gcmUtZW5hYmxlLgotCi0gICBBcyBvZiBBcHIvMjAwNSB0d28gbmV3IG9wdGlvbnMgKHNlZSB0aGUgd2lyZWZyYW1lIEZBUSBhbmQKLSAgIHNjcm9sbGNvcHlyZWN0IEZBUSBiZWxvdykgcHJvdmlkZSBzY2hlbWVzIHRvIHN3ZWVwIHRoaXMgcHJvYmxlbSB1bmRlcgotICAgdGhlIHJ1ZyBmb3Igd2luZG93IG1vdmVzIG9yIHJlc2l6ZXMgYW5kIGZvciBzb21lIChidXQgbm90IGFsbCkgd2luZG93Ci0gICBzY3JvbGxzLiBUaGVzZSBhcmUgdGhlIHByZWZlcnJlZCB3YXkgb2YgYXZvaWRpbmcgdGhlICJsdXJjaGluZyIKLSAgIHByb2JsZW0sIGNvbnRhY3QgbWUgaWYgdGhleSBhcmUgbm90IHdvcmtpbmcuIE5vdGUgb24gU3VTRSBhbmQgc29tZQotICAgb3RoZXIgZGlzdHJvcyB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uIHVzZWQgYnkgc2Nyb2xsY29weXJlY3QgaXMgbm90Ci0gICBlbmFibGVkIGJ5IGRlZmF1bHQsIHR1cm4gaXQgb24gaW4geG9yZy5jb25mOgotU2VjdGlvbiAiTW9kdWxlIgotICAgICAgICAuLi4KLSAgICAgICAgTG9hZCAgInJlY29yZCIKLSAgICAgICAgLi4uCi1FbmRTZWN0aW9uCi0KLQotICAgUS03NzogV2h5IG5vdCBkbyBzb21ldGhpbmcgbGlrZSB3aXJlZnJhbWUgYW5pbWF0aW9ucyB0byBhdm9pZCB0aGUKLSAgIHdpbmRvd3MgImx1cmNoaW5nIiB3aGVuIGJlaW5nIG1vdmVkIG9yIHJlc2l6ZWQ/Ci0KLSAgIE5pY2UgaWRlYSBmb3IgYSBoYWNrISBBcyBvZiBBcHIvMjAwNSB4MTF2bmMgYnkgZGVmYXVsdCB3aWxsIGFwcGx5Ci0gICBoZXVyaXN0aWNzIHRvIHRyeSB0byBndWVzcyBpZiBhIHdpbmRvdyBpcyBiZWluZyAob3BhcXVlbHkpIG1vdmVkIG9yCi0gICByZXNpemVkLiBJZiBzdWNoIGEgY2hhbmdlIGlzIGRldGVjdGVkIGZyYW1lYnVmZmVyIHBvbGxpbmcgYW5kIHVwZGF0ZXMKLSAgIHdpbGwgYmUgc3VzcGVuZGVkIGFuZCBvbmx5IGFuIGFuaW1hdGVkICJ3aXJlZnJhbWUiIChhIHJlY3RhbmdsZQotICAgb3V0bGluZSBkcmF3biB3aGVyZSB0aGUgbW92ZWQvcmVzaXplZCB3aW5kb3cgd291bGQgYmUpIGlzIHNob3duLiBXaGVuCi0gICB0aGUgd2luZG93IG1vdmUvcmVzaXplIHN0b3BzLCBpdCByZXR1cm5zIHRvIG5vcm1hbCBwcm9jZXNzaW5nOiB5b3UKLSAgIHNob3VsZCBvbmx5IHNlZSB0aGUgd2luZG93IGFwcGVhciBpbiB0aGUgbmV3IHBvc2l0aW9uLiBUaGlzIHNwYXJlcyB5b3UKLSAgIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCBhICJsdXJjaGluZyIgd2luZG93IGJldHdlZW4gYWxsIG9mIHRoZQotICAgaW50ZXJtZWRpYXRlIHN0ZXBzLiBCVFcgdGhlIGx1cmNoaW5nIGlzIGR1ZSB0byBzbG93IHZpZGVvIGNhcmQgcmVhZAotICAgcmF0ZXMgKHNlZSBoZXJlIHRvby4pIEEgZGlzcGxhY2VtZW50LCBldmVuIGEgc21hbGwgb25lLCBvZiBhIGxhcmdlCi0gICB3aW5kb3cgcmVxdWlyZXMgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZSwgYSBnb29kIGZyYWN0aW9uIG9mIGEKLSAgIHNlY29uZCwgdG8gcmVhZCBpbiBmcm9tIHRoZSBoYXJkd2FyZSBmcmFtZWJ1ZmZlci4KLQotICAgTm90ZSB0aGF0IE9wYXF1ZSBNb3Zlcy9SZXNpemVzIG11c3QgYmUgRW5hYmxlZCBieSB5b3VyIHdpbmRvdyBtYW5hZ2VyCi0gICBmb3IgLXdpcmVmcmFtZSB0byBkbyBhbnkgZ29vZC4KLQotICAgVGhlIG1vZGUgaXMgY3VycmVudGx5IG9uIGJ5IGRlZmF1bHQgYmVjYXVzZSBtb3N0IHBlb3BsZSBhcmUgYWZmbGljdGVkCi0gICB3aXRoIHRoZSBwcm9ibGVtLiBJdCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgLW5vd2lyZWZyYW1lIG9wdGlvbiAoYWthCi0gICAtbm93Zi4pIFdoeSBtaWdodCBvbmUgd2FudCB0byB0dXJuIG9mZiB0aGUgd2lyZWZyYW1pbmc/IFNpbmNlIHgxMXZuYwotICAgaXMgbWVyZWx5IGd1ZXNzaW5nIHdoZW4gd2luZG93cyBhcmUgYmVpbmcgbW92ZWQvcmVzaXplZCwgaXQgbWF5IGd1ZXNzCi0gICBwb29ybHkgZm9yIHlvdXIgd2luZG93LW1hbmFnZXIgb3IgZGVza3RvcCwgb3IgZXZlbiBmb3IgdGhlIHdheSB5b3UKLSAgIG1vdmUgdGhlIHBvaW50ZXIuIElmIHlvdXIgd2luZG93LW1hbmFnZXIgb3IgZGVza3RvcCBhbHJlYWR5IGRvZXMgaXRzCi0gICBvd24gd2lyZWZyYW1pbmcgdGhlbiB0aGlzIG1vZGUgaXMgYSB3YXN0ZSBvZiB0aW1lIGFuZCBjb3VsZCBkbyB0aGUKLSAgIHdyb25nIHRoaW5nIG9jY2FzaW9uYWxseS4gVGhlcmUgbWF5IGJlIG90aGVyIHJlYXNvbnMgdGhlIG5ldyBtb2RlCi0gICBmZWVscyB1bm5hdHVyYWwuIElmIHlvdSBoYXZlIHZlcnkgZXhwZW5zaXZlIHZpZGVvIGhhcmR3YXJlIChTR0ksIHdlbGwKLSAgIG5vdyBldmVuIHByb3ByaWV0YXJ5IFhvcmcgZHJpdmVycyBhcmUgZmFzdCBhdCByZWFkaW5nKSBvciBhcmUgdXNpbmcgYW4KLSAgIGluLVJBTSB2aWRlbyBmcmFtZWJ1ZmZlciAoU3VuUmF5LCBTaGFkb3dGQiwgWHZmYiksIHRoZSByZWFkIHJhdGUgZnJvbQotICAgdGhhdCBmcmFtZWJ1ZmZlciBtYXkgYmUgdmVyeSBmYXN0ICgxMDAncyBvZiBNQi9zZWMpIGFuZCBzbyB5b3UgZG9uJ3QKLSAgIHJlYWxseSBzZWUgbXVjaCBsdXJjaGluZyAoYXQgbGVhc3Qgb3ZlciBhIGZhc3QgTEFOKTogb3BhcXVlIG1vdmVzIGxvb2sKLSAgIHNtb290aCBpbiB4MTF2bmMuIE5vdGU6IFNoYWRvd0ZCIGlzIG9mdGVuIHR1cm5lZCBvbiB3aGVuIHlvdSBhcmUgdXNpbmcKLSAgIHRoZSB2ZXNhZmIgb3IgZmJkZXYgWEZyZWU4NiB2aWRlbyBkcml2ZXIgaW5zdGVhZCBvZiBhIG5hdGl2ZSBvbmUgc28KLSAgIHlvdSBtaWdodCBiZSB1c2luZyBpdCBhbHJlYWR5IGFuZCBub3Qga25vdy4KLQotICAgVGhlIGhldXJpc3RpY3MgdXNlZCB0byBndWVzcyB3aW5kb3cgbW90aW9uIG9yIHJlc2l6aW5nIGFyZSBzaW1wbGUsIGJ1dAotICAgYXJlIG5vdCBmb29sIHByb29mOiB4MTF2bmMgaXMgc29tZXRpbWVzIHRyaWNrZWQgYW5kIHNvIHlvdSdsbAotICAgb2NjYXNpb25hbGx5IHNlZSB0aGUgbHVyY2hpbmcgb3BhcXVlIG1vdmUgYW5kIHJhcmVseSBzb21ldGhpbmcgZXZlbgotICAgd29yc2UuCi0KLSAgIEZpcnN0IGl0IGFzc3VtZXMgdGhhdCB0aGUgbW92ZS9yZXNpemUgd2lsbCBvY2N1ciB3aXRoIGEgbW91c2UgYnV0dG9uCi0gICBwcmVzc2VkLCBoZWxkIGRvd24gYW5kIGRyYWdnZWQgKG9mIGNvdXJzZSB0aGlzIGlzIG9ubHkgbW9zdGx5IHRydWUuKQotICAgTmV4dCBpdCB3aWxsIG9ubHkgY29uc2lkZXIgYSB3aW5kb3cgZm9yIHdpcmVmcmFtaW5nIGlmIHRoZSBtb3VzZQotICAgcG9pbnRlciBpcyBpbml0aWFsbHkgImNsb3NlIGVub3VnaCIgdG8gdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgZnJhbWUsCi0gICBlLmcuIHlvdSBoYXZlIGdyYWJiZWQgdGhlIHRpdGxlIGJhciBvciBhIHJlc2l6ZXIgZWRnZSAodGhpcwotICAgcmVxdWlyZW1lbnQgY2FuIGJlIGRpc2FibGVkIGFuZCBpdCBhbHNvIG5vdCBhcHBsaWVkIGlmIGEgbW9kaWZpZXIga2V5LAotICAgZS5nLiBBbHQsIGlzIHByZXNzZWQuKSBJZiB0aGVzZSBhcmUgdHJ1ZSwgaXQgd2lsbCB3YWl0IGFuIGFtb3VudCBvZgotICAgdGltZSB0byBzZWUgaWYgdGhlIHdpbmRvdyBzdGFydHMgbW92aW5nIG9yIHJlc2l6aW5nLiBJZiBpdCBkb2VzLCBpdAotICAgc3RhcnRzIGRyYXdpbmcgdGhlIHdpcmVmcmFtZSAib3V0bGluZSIgb2Ygd2hlcmUgdGhlIHdpbmRvdyB3b3VsZCBiZS4KLSAgIFdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCwgb3IgYSB0aW1lb3V0IG9jY3VycywgaXQgZ29lcyBiYWNrCi0gICB0byB0aGUgc3RhbmRhcmQgbW9kZSB0byBhbGxvdyB0aGUgYWN0dWFsIGZyYW1lYnVmZmVyIGNoYW5nZXMgdG8KLSAgIHByb3BhZ2F0ZSB0byB0aGUgdmlld2Vycy4KLQotICAgVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgdHdlYWtlZDoKLSAgICAgKiBDb2xvci9TaGFkZSBvZiB0aGUgd2lyZWZyYW1lLgotICAgICAqIExpbmV3aWR0aCBvZiB0aGUgb3V0bGluZSBmcmFtZS4KLSAgICAgKiBDdXRvZmYgc2l6ZSBvZiB3aW5kb3dzIHRvIG5vdCBhcHBseSB3aXJlZnJhbWluZyB0by4KLSAgICAgKiBDdXRvZmZzIGZvciBjbG9zZW5lc3MgdG8gVG9wLCBCb3R0b20sIExlZnQsIGFuZCBSaWdodCBlZGdlcyBvZgotICAgICAgIHdpbmRvdy4KLSAgICAgKiBNb2RpZmllciBrZXlzIHRvIGVuYWJsZSBpbnRlcmlvciB3aW5kb3cgZ3JhYmJpbmcuCi0gICAgICogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGRyYWdnaW5nIHBvaW50ZXIgZXZlbnRzLgotICAgICAqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgd2luZG93IHRvIHN0YXJ0IG1vdmluZy9yZXNpemluZy4KLSAgICAgKiBNYXhpbXVtIHRpbWUgdG8gc2hvdyBhIHdpcmVmcmFtZSBhbmltYXRpb24uCi0gICAgICogTWluaW11bSB0aW1lIGJldHdlZW4gc2VuZGluZyB3aXJlZnJhbWUgb3V0bGluZXMuCi0KLSAgIFNlZSB0aGUgIi13aXJlZnJhbWUgdHdlYWtzIiBvcHRpb24gZm9yIG1vcmUgZGV0YWlscy4gT24gYSBzbG93IGxpbmssCi0gICBlLmcuIGRpYWx1cCBtb2RlbSwgdGhlIHBhcmFtZXRlcnMgbWF5IGJlIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgZm9yCi0gICBiZXR0ZXIgcmVzcG9uc2UuCi0KLQotICAgQ29weVJlY3QgZW5jb2Rpbmc6ICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgdGhlcmUgaXMgdGhlCi0gICAiLXdpcmVjb3B5cmVjdCBtb2RlIiBvcHRpb24uIEl0IGlzIGFsc28gb24gYnkgZGVmYXVsdC4gVGhpcyBpbnN0cnVjdHMKLSAgIHgxMXZuYyB0byBub3Qgb25seSBzaG93IHRoZSB3aXJlZnJhbWUgYW5pbWF0aW9uLCBidXQgdG8gYWxzbyBpbnN0cnVjdAotICAgYWxsIGNvbm5lY3RlZCBWTkMgdmlld2VycyB0byBsb2NhbGx5IHRyYW5zbGF0ZSB0aGUgd2luZG93IGltYWdlIGRhdGEKLSAgIGZyb20gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHRvIHRoZSBuZXcgcG9zaXRpb24gb24gdGhlIHNjcmVlbiB3aGVuIHRoZQotICAgYW5pbWF0aW9uIGlzIGRvbmUuIFRoaXMgc3BlZWR1cCBpcyB0aGUgVk5DIENvcHlSZWN0IGVuY29kaW5nOiB0aGUKLSAgIGZyYW1lYnVmZmVyIHVwZGF0ZSBkb2Vzbid0IG5lZWQgdG8gc2VuZCB0aGUgYWN0dWFsIG5ldyBpbWFnZSBkYXRhLgotICAgVGhpcyBpcyBuaWNlIGluIGdlbmVyYWwsIGFuZCB2ZXJ5IGNvbnZlbmllbnQgb3ZlciBhIHNsb3cgbGluaywgYnV0Ci0gICBzaW5jZSBpdCBpcyBiYXNlZCBvbiBoZXVyaXN0aWNzIHlvdSBtYXkgbmVlZCB0byBkaXNhYmxlIGl0IHdpdGggdGhlCi0gICAtbm93aXJlY29weXJlY3Qgb3B0aW9uIChha2EgLW5vd2NyKSBpZiBpdCB3b3JrcyBpbmNvcnJlY3RseSBvcgotICAgdW5uYXR1cmFsbHkgZm9yIHlvdS4KLQotICAgVGhlIC13aXJlY29weXJlY3QgbW9kZXMgYXJlOiAibmV2ZXIiIChzYW1lIGFzIC1ub3dpcmVjb3B5cmVjdCk7ICJ0b3AiLAotICAgb25seSBhcHBseSB0aGUgQ29weVJlY3QgaWYgdGhlIHdpbmRvdyBpcyBhcHBlYXJzIHRvIGJlIG9uIHRoZSB0b3Agb2YKLSAgIHRoZSB3aW5kb3cgc3RhY2sgYW5kIGlzIG5vdCBvYnN0cnVjdGVkIGJ5IG90aGVyIHdpbmRvd3M7IGFuZCAiYWx3YXlzIgotICAgdG8gYWx3YXlzIHRyeSB0byBhcHBseSB0aGUgQ29weVJlY3QgKG9ic3RydWN0ZWQgcmVnaW9ucyBhcmUgdXN1YWxseQotICAgY2xpcHBlZCBvZmYgYW5kIG5vdCB0cmFuc2xhdGVkLikKLQotICAgTm90ZSB0aGF0IHNvbWUgZGVza3RvcHMgKEtERSBhbmQgeGZjZSkgYXBwZWFyIHRvIG1lc3Mgd2l0aCB0aGUgd2luZG93Ci0gICBzdGFja2luZyBpbiB3YXlzIHRoYXQgYXJlIG5vdCB5ZXQgY2xlYXIuIEluIHRoZXNlIGNhc2VzIHgxMXZuYyB3b3JrcwotICAgYXJvdW5kIHRoZSBwcm9ibGVtIGJ5IGFwcGx5aW5nIHRoZSBDb3B5UmVjdCBldmVuIGlmIG9ic2N1cmluZyB3aW5kb3dzJwotICAgZGF0YSBpcyB0cmFuc2xhdGVkISBVc2UgLW5vd2lyZWNvcHlyZWN0IGlmIHRoaXMgeWllbGRzIHVuZGVzaXJhYmxlCi0gICBlZmZlY3RzIGZvciB5b3VyIGRlc2t0b3AuCi0KLSAgIEFsc28sIHRoZSBDb3B5UmVjdCBlbmNvZGluZyBtYXkgZ2l2ZSBpbmNvcnJlY3QgcmVzdWx0cyB1bmRlciAtc2NhbGUKLSAgIChkZXBlbmRpbmcgb24gdGhlIHNjYWxlIGZhY3RvciB0aGUgQ29weVJlY3Qgb3BlcmF0aW9uIGlzIG9mdGVuIG9ubHkKLSAgIGFwcHJveGltYXRlOiB0aGUgY29ycmVjdGx5IHNjYWxlZCBmcmFtZWJ1ZmZlciB3aWxsIGJlIHNsaWdodGx5Ci0gICBkaWZmZXJlbnQgZnJvbSB0aGUgdHJhbnNsYXRlZCBvbmUuKSB4MTF2bmMgd2lsbCB0cnkgdG8gcHVzaCBhCi0gICAiY2xlYW51cCIgdXBkYXRlIGFmdGVyIHRoZSBDb3B5UmVjdCBpZiAtc2NhbGUgaXMgaW4gZWZmZWN0LiBVc2UKLSAgIC1ub3dpcmVjb3B5cmVjdCBpZiB0aGlzIG9yIG90aGVyIHBhaW50aW5nIGVycm9ycyBhcmUgdW5hY2NlcHRhYmxlLgotCi0KLSAgIFEtNzg6IENhbiB4MTF2bmMgdHJ5IHRvIGFwcGx5IGhldXJpc3RpY3MgdG8gZGV0ZWN0IHdoZW4gYSB3aW5kb3cgaXMKLSAgIHNjcm9sbGluZyBpdHMgY29udGVudHMgYW5kIHVzZSB0aGUgQ29weVJlY3QgZW5jb2RpbmcgZm9yIGEgc3BlZWR1cD8KLQotICAgQW5vdGhlciBuaWNlIGlkZWEgZm9yIGEgaGFjayEgQXMgb2YgTWF5LzIwMDUgeDExdm5jIHdpbGwgYnkgZGVmYXVsdAotICAgYXBwbHkgaGV1cmlzdGljcyB0byB0cnkgdG8gZGV0ZWN0IGlmIHRoZSB3aW5kb3cgdGhhdCBoYXMgdGhlIGlucHV0Ci0gICBmb2N1cyBpcyBzY3JvbGxpbmcgaXRzIGNvbnRlbnRzIChidXQgb25seSB3aGVuIHgxMXZuYyBpcyBmZWVkaW5nIHVzZXIKLSAgIGlucHV0LCBrZXlzdHJva2Ugb3IgcG9pbnRlciwgdG8gdGhlIFggc2VydmVyLikgU28sIHdoZW4gZGV0ZWN0ZWQsCi0gICBzY3JvbGxzIGluZHVjZWQgYnkgZHJhZ2dpbmcgb24gYSBzY3JvbGxiYXIgb3IgYnkgdHlwaW5nIChlLmcuIFVwIG9yCi0gICBEb3duIGFycm93cywgaGl0dGluZyBSZXR1cm4gaW4gYSB0ZXJtaW5hbCB3aW5kb3csIGV0YyksIHdpbGwgc2hvdyB1cAotICAgbXVjaCBtb3JlIHF1aWNrbHkgdGhhbiB2aWEgdGhlIHN0YW5kYXJkIHgxMXZuYyBzY3JlZW4gcG9sbGluZyB1cGRhdGUKLSAgIG1lY2hhbmlzbS4KLQotICAgVGhlcmUgd2lsbCBiZSBhIHNwZWVkdXAgZm9yIGJvdGggc2xvdyBhbmQgZmFzdCBsaW5rcyB0byB2aWV3ZXJzLiBGb3IKLSAgIHNsb3cgbGlua3MgdGhlIHNwZWVkdXAgaXMgbW9zdGx5IGR1ZSB0byB0aGUgQ29weVJlY3QgZW5jb2Rpbmcgbm90Ci0gICByZXF1aXJpbmcgdGhlIGltYWdlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgb3ZlciB0aGUgbmV0d29yay4gRm9yIGZhc3QKLSAgIGxpbmtzIHRoZSBzcGVlZHVwIGlzIHByaW1hcmlseSBkdWUgdG8geDExdm5jIG5vdCBoYXZpbmcgdG8gcmVhZCB0aGUKLSAgIHNjcm9sbGVkIGZyYW1lYnVmZmVyIGRhdGEgZnJvbSB0aGUgWCBzZXJ2ZXIgKHJlY2FsbCB0aGF0IHJlYWRpbmcgZnJvbQotICAgdGhlIGhhcmR3YXJlIGZyYW1lYnVmZmVyIGlzIHNsb3cuKQotCi0gICBUbyBkbyB0aGlzIHgxMXZuYyB1c2VzIHRoZSBSRUNPUkQgWCBleHRlbnNpb24gdG8gc25vb3AgdGhlIFgxMQotICAgcHJvdG9jb2wgYmV0d2VlbiB0aGUgWCBjbGllbnQgd2l0aCB0aGUgZm9jdXMgd2luZG93IGFuZCB0aGUgWCBzZXJ2ZXIuCi0gICBUaGlzIGV4dGVuc2lvbiBpcyB1c3VhbGx5IHByZXNlbnQgb24gbW9zdCBYIHNlcnZlcnMgKGJ1dCBTdVNFIGRpc2FibGVzCi0gICBpdCBmb3Igc29tZSByZWFzb24uKSBPbiBYRnJlZTg2L1hvcmcgaXQgY2FuIGJlIGVuYWJsZWQgdmlhIExvYWQKLSAgICJyZWNvcmQiIGluIHRoZSBNb2R1bGUgc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZpbGUgaWYgaXQgaXNuJ3QgYWxyZWFkeToKLVNlY3Rpb24gIk1vZHVsZSIKLSAgICAgICAgLi4uCi0gICAgICAgIExvYWQgICJyZWNvcmQiCi0gICAgICAgIC4uLgotRW5kU2VjdGlvbgotCi0gICBDdXJyZW50bHkgdGhlIFJFQ09SRCBleHRlbnNpb24gaXMgdXNlZCBhcyBsaXR0bGUgYXMgcG9zc2libGUgc28gYXMgdG8KLSAgIG5vdCBzbG93IGRvd24gcmVndWxhciB1c2UuIE9ubHkgc2ltcGxlIGhldXJpc3RpY3MgYXJlIGFwcGxpZWQgdG8KLSAgIGRldGVjdCBYQ29weUFyZWEgYW5kIFhDb25maWd1cmVXaW5kb3cgY2FsbHMgZnJvbSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGVzZSBjYXRjaCBhIGxvdCBvZiBzY3JvbGxzLCBlLmcuIGluIG1vemlsbGEvZmlyZWZveCBhbmQgaW4gdGVybWluYWwKLSAgIHdpbmRvd3MgbGlrZSBnbm9tZS10ZXJtaW5hbCBhbmQgeHRlcm0uIFVuZm9ydHVuYXRlbHkgdGhlIHRvb2xraXRzIEtERQotICAgYXBwbGljYXRpb25zIHVzZSBtYWtlIHNjcm9sbCBkZXRlY3Rpb24gbGVzcyBlZmZlY3RpdmUgKG9ubHkgcmFyZWx5IGFyZQotICAgdGhleSBkZXRlY3RlZDogaS5lLiBLb25xdWVyb3IgYW5kIEtvbnNvbGUgZG9uJ3Qgd29yay4pIEFuIGludGVyZXN0aW5nCi0gICBwcm9qZWN0LCB0aGF0IG1heSBiZSB0aGUgZGlyZWN0aW9uIHgxMXZuYyB0YWtlcywgaXMgdG8gcmVjb3JkIGFsbCBvZgotICAgdGhlIFgxMSBwcm90b2NvbCBmcm9tIGFsbCBjbGllbnRzIGFuZCB0cnkgdG8gInRlZSIgdGhlIHN0cmVhbSBpbnRvIGEKLSAgIG1vZGlmaWVkIFh2ZmIgd2F0Y2hpbmcgZm9yIENvcHlSZWN0IGFuZCBvdGhlciBWTkMgc3BlZWR1cHMuIEEKLSAgIHBvdGVudGlhbCBpc3N1ZSBpcyB0aGUgUkVDT1JEIHN0cmVhbSBpcyBkZWxheWVkIGZyb20gYWN0dWFsIHZpZXcgb24KLSAgIHRoZSBYIHNlcnZlciBkaXNwbGF5OiBpZiBvbmUgZmFsbHMgdG9vIGZhciBiZWhpbmQgaXQgY291bGQgYmVjb21lIGEKLSAgIG1lc3MuLi4KLQotICAgVGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgLXNjcm9sbGNvcHlyZWN0IG9wdGlvbiBpcyB1c2VmdWwgaW4gdGhhdAotICAgaXQgZGV0ZWN0cyBtYW55IHNjcm9sbHMgYW5kIHRodXMgZ2l2ZXMgYSBtdWNoIG5pY2VyIHdvcmtpbmcKLSAgIGVudmlyb25tZW50IChlc3BlY2lhbGx5IHdoZW4gY29tYmluZWQgd2l0aCB0aGUgLXdpcmVmcmFtZQotICAgLXdpcmVjb3B5cmVjdCBvcHRpb25zLCB3aGljaCBhcmUgYWxzbyBvbiBieSBkZWZhdWx0OyBhbmQgaWYgeW91IGFyZQotICAgd2lsbGluZyB0byBlbmFibGUgdGhlIFNoYWRvd0ZCIHRoaW5ncyBhcmUgdmVyeSBmYXN0LikgVGhlIGZhY3QgdGhhdAotICAgdGhlcmUgYXJlbid0IGxvbmcgZGVsYXlzIG9yIGx1cmNoZXMgZHVyaW5nIHNjcm9sbGluZyBpcyB0aGUgcHJpbWFyeQotICAgaW1wcm92ZW1lbnQuCi0KLSAgIEJ1dCB0aGVyZSBhcmUgc29tZSBkcmF3YmFja3M6Ci0gICAgICogTm90IGFsbCBzY3JvbGxzIGFyZSBkZXRlY3RlZC4gU29tZSBhcHBzIHNjcm9sbCB3aW5kb3dzIGluIHdheXMKLSAgICAgICB0aGF0IGNhbm5vdCBjdXJyZW50bHkgYmUgZGV0ZWN0ZWQsIGFuZCBvdGhlciB0aW1lcyB4MTF2bmMgIm1pc3NlcyIKLSAgICAgICB0aGUgc2Nyb2xsIGR1ZSB0byB0aW1lb3V0cywgZXRjLiBTb21ldGltZXMgaXQgaXMgbW9yZSBkaXN0cmFjdGluZwotICAgICAgIHRoYXQgYSBzcGVlZHVwIG9jY2FzaW9uYWxseSBkb2Vzbid0IHdvcmsgYXMgb3Bwb3NlZCB0byBiZWluZwotICAgICAgIGNvbnNpc3RlbnRseSBzbG93IQotICAgICAqIEZvciByYXBpZCBzY3JvbGxpbmcgKGkuZS4gc2VxdWVuY2Ugb2YgbWFueSBzY3JvbGxzIG92ZXIgYSBzaG9ydAotICAgICAgIHBlcmlvZCkgdGhlcmUgY2FuIGJlIHBhaW50aW5nIGVycm9ycyAodGVhcmluZywgYnVuY2hpbmcgdXAsIGV0Yy4pCi0gICAgICAgZHVyaW5nIHRoZSBzY3JvbGwuIFRoZXNlIHdpbGwgcmVwYWlyIHRoZW1zZWx2ZXMgYWZ0ZXIgdGhlIHNjcm9sbAotICAgICAgIGlzIG92ZXIsIGJ1dCB3aGVuIHRoZXkgYXJlIHNldmVyZSBpdCBjYW4gYmUgZGlzdHJhY3RpbmcuIFRyeSB0bwotICAgICAgIHRoaW5rIG9mIHRoZSBhcHByb3hpbWF0ZSB3aW5kb3cgY29udGVudHMgYXMgYSBxdWlja2VyIGFuZCBtb3JlCi0gICAgICAgdXNlZnVsICJhbmltYXRpb24iIGNvbXBhcmVkIHRvIHRoZSBzbG93ZXIgcG9sbGluZyBzY2hlbWUuLi4KLSAgICAgKiBTY3JvbGxpbmcgaW5zaWRlIHNoZWxscyBpbiB0ZXJtaW5hbCB3aW5kb3dzIChnbm9tZS10ZXJtaW5hbCwKLSAgICAgICB4dGVybSksIGNhbiBsZWFkIHRvIG9kZCBwYWludGluZyBlcnJvcnMuIFRoaXMgaXMgYmVjYXVzZSB4MTF2bmMKLSAgICAgICBkaWQgbm90IGhhdmUgdGltZSB0byBkZXRlY3QgYSBzY3JlZW4gY2hhbmdlIGp1c3QgYmVmb3JlIHRoZSBzY3JvbGwKLSAgICAgICAobW9zdCBjb21tb24gaXMgdGhlIHRlcm1pbmFsIHVuZHJhd3MgdGhlIGJsb2NrIGN1cnNvciBiZWZvcmUKLSAgICAgICBzY3JvbGxpbmcgdGhlIHRleHQgdXA6IGluIHRoZSB2aWV3ZXIgeW91IHRlbXBvcmFyaWx5IHNlZSBtdWx0aXBsZQotICAgICAgIGJsb2NrIGN1cnNvcnMuKSBBbm90aGVyIGlzc3VlIGlzIHdpdGggdGhpbmdzIGxpa2UgbW9yZSgxKTogc2Nyb2xsCi0gICAgICAgZGV0ZWN0aW9uIGZvciA1LTYgbGluZXMgaGFwcGVucyBuaWNlbHksIGJ1dCB0aGVuIGl0IGNhbid0IGtlZXAgdXAKLSAgICAgICBhbmQgc28gdGhlcmUgaXMgYSBsb25nIHBhdXNlIGZvciB0aGUgc3RhbmRhcmQgcG9sbGluZyBtZXRob2QgdG8KLSAgICAgICBkZWxpdmVyIHRoZSByZW1haW5pbmcgdXBkYXRlcy4KLSAgICAgKiBNb3JlIHJhcmVseSBzb21ldGltZXMgcGFpbnRpbmcgZXJyb3JzIGFyZSBub3QgcmVwYWlyZWQgYWZ0ZXIgdGhlCi0gICAgICAgc2Nyb2xsIGlzIG92ZXIuIFRoaXMgbWF5IGJlIGEgYnVnIGluIHgxMXZuYyBvciBsaWJ2bmNzZXJ2ZXIsIG9yIGl0Ci0gICAgICAgbWF5IGJlIGFuIGluZXNjYXBhYmxlIGZhY3Qgb2YgdGhlIENvcHlSZWN0IGVuY29kaW5nIGFuZCB0aGUgZGVsYXkKLSAgICAgICBiZXR3ZWVuIFJFQ09SRCBjYWxsYmFja3MgYW5kIHdoYXQgaXMgYWN0dWFsbHkgb24gdGhlIFggZGlzcGxheS4KLSAgICAgICBPbmUgY2FuIHRhcCB0aGUgQWx0X0wga2V5IChMZWZ0ICJBbHQiIGtleSkgMyB0aW1lcyBpbiBhIHJvdyB0bwotICAgICAgIHNpZ25hbCB4MTF2bmMgdG8gcmVmcmVzaCB0aGUgc2NyZWVuIHRvIGFsbCB2aWV3ZXJzLiBZb3VyCi0gICAgICAgVk5DLXZpZXdlciBtYXkgaGF2ZSBpdHMgb3duIHNjcmVlbiByZWZyZXNoIGhvdC1rZXkgb3IgYnV0dG9uLiBTZWUKLSAgICAgICBhbHNvOiAtZml4c2NyZWVuCi0gICAgICogU29tZSBhcHBsaWNhdGlvbnMsIG5vdGFibHkgT3Blbk9mZmljZSwgZG8gWENvcHlBcmVhIHNjcm9sbHMgaW4KLSAgICAgICB3ZWlyZCB3YXlzIHRoYXQgYXNzdW1lIGFuY2VzdG9yIHdpbmRvdyBjbGlwcGluZyBpcyB0YWtpbmcgcGxhY2UuCi0gICAgICAgU2VlIHRoZSAtc2NyX3NraXAgb3B0aW9uIGZvciB3YXlzIHRvIHR3ZWFrIHRoaXMgb24gYQotICAgICAgIHBlci1hcHBsaWNhdGlvbiBiYXNpcy4KLSAgICAgKiBTZWxlY3RpbmcgdGV4dCB3aGlsZSBkcmFnZ2luZyB0aGUgbW91c2UgbWF5IGJlIHNsb3dlciwgZXNwZWNpYWxseQotICAgICAgIGlmIHRoZSBCdXR0b24tZG93biBldmVudCBoYXBwZW5zIG5lYXIgdGhlIHdpbmRvdydzIGVkZ2UuIFRoaXMgaXMKLSAgICAgICBiZWNhdXNlIHRoZSBzY3JvbGxjb3B5cmVjdCBzY2hlbWUgaXMgd2F0Y2hpbmcgZm9yIHNjcm9sbHMgdmlhCi0gICAgICAgUkVDT1JEIGFuZCBoYXMgdG8gd2FpdCBmb3IgYSB0aW1lb3V0IHRvIG9jY3VyIGJlZm9yZSBpdCBkb2VzIHRoZQotICAgICAgIHVwZGF0ZS4KLSAgICAgKiBGb3IgcmVhc29ucyBub3QgeWV0IHVuZGVyc3Rvb2QgdGhlIFJFQ09SRCBleHRlbnNpb24gY2FuIHN0b3AKLSAgICAgICByZXNwb25kaW5nIChhbmQgaGVuY2Ugc2Nyb2xscyBhcmUgbWlzc2VkLikgQXMgYSB3b3JrYXJvdW5kIHgxMXZuYwotICAgICAgIGF0dGVtcHRzIHRvIHJlc2V0IHRoZSBSRUNPUkQgY29ubmVjdGlvbiBldmVyeSA2MCBzZWNvbmRzIG9yIHNvLgotICAgICAgIEFub3RoZXIgd29ya2Fyb3VuZCBpcyB0byB0eXBlIDQgU3VwZXJfTCAoTGVmdCBTdXBlci9XaW5kb3dzLUZsYWcKLSAgICAgICBrZXkpIGluIGEgcm93IHRvIHJlc2V0IFJFQ09SRC4gV29yayBpcyBpbiBwcm9ncmVzcyB0byB0cnkgdG8gZml4Ci0gICAgICAgdGhpcyBidWcuCi0gICAgICogU29tZXRpbWVzIHlvdSBuZWVkIHRvICJyZXRyYWluIiB4MTF2bmMgZm9yIGEgY2VydGFpbiB3aW5kb3cKLSAgICAgICBiZWNhdXNlIGl0IGZhaWxzIHRvIGRldGVjdCBzY3JvbGxzIGluIGl0LiBTb21ldGltZXMgY2xpY2tpbmcKLSAgICAgICBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyBvciBzZWxlY3Rpbmcgc29tZSB0ZXh0IGluIGl0IHRvCi0gICAgICAgZm9yY2UgdGhlIGZvY3VzIGhlbHBzLgotICAgICAqIFdoZW4gdXNpbmcgdGhlIC1zY2FsZSBvcHRpb24gdGhlcmUgd2lsbCBiZSBhIHF1aWNrIENvcHlSZWN0Ci0gICAgICAgc2Nyb2xsLCBidXQgaXQgbmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkgYSBzbG93ZXIgImNsZWFudXAiIHVwZGF0ZS4KLSAgICAgICBUaGlzIGlzIGJlY2F1c2UgZm9yIGEgZml4ZWQgZmluaXRlIHNjcmVlbiByZXNvbHV0aW9uIChlLmcuIDc1IGRwaSkKLSAgICAgICBzY2FsaW5nIGFuZCBjb3B5cmVjdC1pbmcgYXJlIG5vdCBleGFjdGx5IGluZGVwZW5kZW50LiBTY2FsaW5nCi0gICAgICAgaW52b2x2ZXMgYSBibGVuZGluZyBvZiBuZWFyYnkgcGl4ZWxzIGFuZCBpZiB5b3UgdHJhbnNsYXRlIGEgcGl4ZWwKLSAgICAgICB0aGUgbmVpZ2hib3IgcGl4ZWwgd2VpZ2h0aW5nIG1heSBiZSBkaWZmZXJlbnQuIFNvIHlvdSBoYXZlIHRvIHdhaXQKLSAgICAgICBhIGJpdCBmb3IgdGhlIGNsZWFudXAgdXBkYXRlIHRvIGZpbmlzaC4gT24gc2xvdyBsaW5rcyB4MTF2bmMgbWF5Ci0gICAgICAgYXV0b21hdGljYWxseSBkZWNpZGUgdG8gbm90IGRldGVjdCBzY3JvbGxzIHdoZW4gLXNjYWxlIGlzIGluCi0gICAgICAgZWZmZWN0LiBJbiBnZW5lcmFsIGl0IHdpbGwgYWxzbyB0cnkgdG8gZGVmZXIgdGhlIGNsZWFudXAgdXBkYXRlIGlmCi0gICAgICAgcG9zc2libGUuCi0KLSAgIElmIHlvdSBmaW5kIHRoZSAtc2Nyb2xsY29weXJlY3QgYmVoYXZpb3IgdG9vIGFwcHJveGltYXRlIG9yCi0gICBkaXN0cmFjdGluZyB5b3UgY2FuIGdvIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHBvbGxpbmctb25seSB1cGRhdGUgbWV0aG9kCi0gICB3aXRoIHRoZSAtbm9zY3JvbGxjb3B5cmVjdCAob3IgLW5vc2NyIGZvciBzaG9ydC4pIElmIHlvdSBmaW5kIHNvbWUKLSAgIGV4dHJlbWVseSBiYWQgYW5kIHJlcGVhdGFibGUgYmVoYXZpb3IgZm9yIC1zY3JvbGxjb3B5cmVjdCBwbGVhc2UKLSAgIHJlcG9ydCBhIGJ1Zy4KLQotICAgQWx0ZXJuYXRpdmVseSwgYXMgd2l0aCAtd2lyZWZyYW1lLCB0aGVyZSBhcmUgbWFueSB0dW5pbmcgcGFyYW1ldGVycyB0bwotICAgdHJ5IHRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbi4gWW91IGNhbiBhbHNvIGFjY2VzcyB0aGVzZSBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgdGhlIGd1aSB1bmRlciAiVHVuaW5nIi4gVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgdHdlYWtlZDoKLSAgICAgKiBUaGUgbWluaW11bSBwaXhlbCBhcmVhIG9mIGEgcmVjdGFuZ2xlIHRvIGJlIHdhdGNoZWQgZm9yIHNjcm9sbHMuCi0gICAgICogQSBsaXN0IGlmIGFwcGxpY2F0aW9uIG5hbWVzIHRvIHNraXAgc2Nyb2xsIGRldGVjdGlvbi4KLSAgICAgKiBXaGljaCBrZXlzdHJva2VzIHNob3VsZCB0cmlnZ2VyIHNjcm9sbCBkZXRlY3Rpb24uCi0gICAgICogV2hpY2ggYXBwbGljYXRpb25zIHNob3VsZCBoYXZlIGEgInRlcm1pbmFsIiB0d2VhayBhcHBsaWVkIHRvIHRoZW0uCi0gICAgICogV2hlbiByZXBlYXRpbmcga2V5cyAoZS5nLiBVcCBhcnJvdykgc2hvdWxkIGJlIGRpc2NhcmRlZCB0bwotICAgICAgIHByZXNlcnZlIGEgc2Nyb2xsLgotICAgICAqIEN1dG9mZnMgZm9yIGNsb3NlbmVzcyB0byBUb3AsIEJvdHRvbSwgTGVmdCwgYW5kIFJpZ2h0IGVkZ2VzIG9mCi0gICAgICAgd2luZG93IGZvciBtb3VzZSBpbmR1Y2VkIHNjcm9sbHMuCi0gICAgICogU2V0IHRpbWVvdXQgcGFyYW1ldGVycyBmb3Iga2V5c3Ryb2tlIGluZHVjZWQgc2Nyb2xscy4KLSAgICAgKiBTZXQgdGltZW91dCBwYXJhbWV0ZXJzIGZvciBtb3VzZSBwb2ludGVyIGluZHVjZWQgc2Nyb2xscy4KLSAgICAgKiBIYXZlIHRoZSBmdWxsIHNjcmVlbiBiZSBwZXJpb2RpY2FsbHkgcmVmcmVzaGVkIHRvIGZpeCBwYWludGluZwotICAgICAgIGVycm9ycy4KLQotCi0gICBRLTc5OiBDYW4geDExdm5jIGRvIGNsaWVudC1zaWRlIGNhY2hpbmcgb2YgcGl4ZWwgZGF0YT8gSS5lLiBzbyB3aGVuCi0gICB0aGF0IHBpeGVsIGRhdGEgaXMgbmVlZGVkIGFnYWluIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgcmV0cmFuc21pdHRlZAotICAgb3ZlciB0aGUgbmV0d29yay4KLQotICAgQXMgb2YgRGVjLzIwMDYgaW4gdGhlIDAuOSBkZXZlbG9wbWVudCB0YXJiYWxsIHRoZXJlIGlzIGFuIGV4cGVyaW1lbnRhbAotICAgY2xpZW50LXNpZGUgY2FjaGluZyBpbXBsZW1lbnRhdGlvbiBlbmFibGVkIGJ5IHRoZSAiLW5jYWNoZSBuIiBvcHRpb24uCi0gICBJbiBmYWN0LCBkdXJpbmcgdGhlIHRlc3QgcGVyaW9kIGl0IHdhcyBvbiBieSBkZWZhdWx0IHdpdGggbiBzZXQgdG8gMTAuCi0gICBUbyBkaXNhYmxlIGl0IHVzZSAiLW5vbmNhY2hlIi4KLQotICAgSXQgaXMgYSBzaW1wbGUgc2NoZW1lIHdoZXJlIGEgKHZlcnkgbGFyZ2UpIGxvd2VyIHBvcnRpb24gb2YgdGhlCi0gICBmcmFtZWJ1ZmZlciAoaS5lLiBzdGFydGluZyBqdXN0IGJlbG93IHRoZSB1c2VyJ3MgYWN0dWFsIGRlc2t0b3AKLSAgIGRpc3BsYXkpIGlzIHVzZWQgZm9yIHN0b3JpbmcgcGl4ZWwgZGF0YS4gQ29weVJlY3Q7IGEgZmFzdCwgZXNzZW50aWFsbHkKLSAgIGxvY2FsIHZpZXdlci1zaWRlIFZOQyBlbmNvZGluZzsgaXMgdXNlZCB0byBzd2FwIHRoZSBwaXhlbCBkYXRhIGluIGFuZAotICAgb3V0IG9mIHRoZSBhY3R1YWwgZGlzcGxheSBhcmVhLiBJdCBnaXZlcyBhbiBleGNlbGxlbnQgc3BlZWR1cCBmb3IKLSAgIGljb25pZnlpbmcvZGVpY29uaWZ5aW5nIGFuZCBtb3Zpbmcgd2luZG93cyBhbmQgcmUtcG9zdGluZyBvZiBtZW51cwotICAgKG9mdGVuIGl0IGRvZXNuJ3QgZmVlbCBsaWtlIFZOQyBhdCBhbGw6IHRoZXJlIGlzIG5vIGRlbGF5IHdhaXRpbmcgZm9yCi0gICB0aGUgcGl4ZWwgZGF0YSB0byBmaWxsIGluLikKLQotICAgVGhpcyBzY2hlbWUgaXMgbmljZSBiZWNhdXNlIGl0IGRvZXMgYWxsIG9mIHRoaXMgd2l0aGluIHRoZSBleGlzdGluZwotICAgVk5DIHByb3RvY29sLCBhbmQgc28gaXQgd29ya3Mgd2l0aCBhbGwgVk5DIHZpZXdlcnMuCi0KLSAgIEEgY2hhbGxlbmdlIHRvIGRvaW5nIG1vcmUgc29waGlzdGljYXRlZCAoZS5nLiBjb21wcmVzc2VkIGFuZC9vcgotICAgc2hhcmVkKSBjbGllbnQtc2lkZSBjYWNoaW5nIGlzIHRoYXQgb25lIG5lZWRzIHRvIGV4dGVuZCB0aGUgVk5DCi0gICBwcm90b2NvbCwgbW9kaWZ5IGEgdmlld2VyIGFuZCB0aGVuIGFsc28gY29udmluY2UgdXNlcnMgdG8gYWRvcHQgeW91cgotICAgbW9kaWZpZWQgVk5DIFZpZXdlciAob3IgZ2V0IHRoZSBuZXcgZmVhdHVyZXMgdG8gYmUgZm9sZGVkIGludG8gdGhlCi0gICBtYWluIFZOQyB2aWV3ZXJzLCBwYXRjaGVzIGFjY2VwdGVkLCBldGMuLi4gbGlrZWx5IHRha2VzIG1hbnkgeWVhcnMKLSAgIGJlZm9yZSB0aGV5IG1pZ2h0IGJlIGRlcGxveWVkIGluIHRoZSBmaWVsZC4pIFNvIGl0IGlzIGNvbnZlbmllbnQgdGhhdAotICAgdGhlICItbmNhY2hlIG4iIHdvcmtzIHdpdGggYW55IHVuYWx0ZXJlZCBWTkMgdmlld2VyLgotCi0gICBBIGRyYXdiYWNrIG9mIHRoZSAiLW5jYWNoZSBuIiBtZXRob2QgaXMgdGhhdCBpbiB0aGUgVk5DIFZpZXdlciB5b3UgY2FuCi0gICBzY3JvbGwgZG93biBhbmQgYWN0dWFsbHkgc2VlIHRoZSBjYWNoZWQgcGl4ZWwgZGF0YS4gU28gaXQgbG9va3MgbGlrZQotICAgdGhlcmUgaXMgYSBidWc6IHlvdSBjYW4gc2Nyb2xsIGRvd24gaW4geW91ciB2aWV3ZXIgYW5kIHNlZSBhIHN0cmFuZ2UKLSAgICJoaXN0b3J5IiBvZiB3aW5kb3dzIG9uIHlvdXIgZGVza3RvcC4gVGhpcyBpcyB3b3JraW5nIGFzIGludGVuZGVkLiBPbmUKLSAgIHdpbGwgbmVlZCB0byB0cnkgdG8gYWRqdXN0IHRoZSBzaXplIG9mIGhpcyBWTkMgVmlld2VyIHdpbmRvdyBzbyB0aGUKLSAgIGNhY2hlIGFyZWEgY2Fubm90IGJlIHNlZW4uIFNTVk5DIChzZWUgYmVsb3cpIGNhbiBkbyB0aGlzCi0gICBhdXRvbWF0aWNhbGx5LgotCi0gICBBdCBzb21lIHBvaW50IExpYlZOQ1NlcnZlciBtYXkgaW1wbGVtZW50IGEgInJmYkZCQ3JvcCIgcHNldWRvZW5jb2RpbmcKLSAgIHRoYXQgdmlld2VycyBjYW4gdXNlIHRvIGxlYXJuIHdoaWNoIHBvcnRpb24gb2YgdGhlIGZyYW1lYnVmZmVyIHRvCi0gICBhY3R1YWxseSBzaG93IHRvIHRoZSB1c2VycyAod2l0aCB0aGUgaGlkZGVuIHBhcnQgdXNlZCBmb3IgY2FjaGluZywgb3IKLSAgIHBlcmhhcHMgc29tZXRoaW5nIGVsc2UsIG1heWJlIGRvdWJsZSBidWZmZXJpbmcgb3Igb3RoZXIgb2Zmc2NyZWVuCi0gICByZW5kZXJpbmcuLi4pCi0KLSAgIFRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBVbml4IHZpZXdlciBoYXMgYSBuaWNlIC15Y3JvcAotICAgb3B0aW9uIHRvIGhlbHAgaGlkZSB0aGUgcGl4ZWwgY2FjaGUgYXJlYSBmcm9tIHZpZXcuIEl0IHdpbGwgdHVybiBvbgotICAgYXV0b21hdGljYWxseSBpZiB0aGUgZnJhbWVidWZmZXIgYXBwZWFycyB0byBiZSB2ZXJ5IHRhbGwgKGhlaWdodCBtb3JlCi0gICB0aGFuIHR3aWNlIHRoZSB3aWR0aCksIG9yIHlvdSBjYW4gc3VwcGx5IHRoZSBhY3R1YWwgdmFsdWUgZm9yIHRoZQotICAgaGVpZ2h0LiBJZiB0aGUgc2NyZWVuIGlzIHJlc2l6ZWQgYnkgc2NhbGluZywgZXRjLCB0aGUgeWNyb3AgdmFsdWUgaXMKLSAgIHNjYWxlZCBhcyB3ZWxsLiBJbiBmdWxsc2NyZWVuIG1vZGUgeW91IGNhbm5vdCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mCi0gICB0aGUgYWN0dWFsIHNjcmVlbiwgYW5kIGluIG5vbi1mdWxsc2NyZWVuIG1vZGUgdGhlIHdpbmRvdyBtYW5hZ2VyIGZyYW1lCi0gICBpcyBhZGp1c3RlZCB0byBmaXQgdGhlIGFjdHVhbCBkaXNwbGF5IChzbyB5b3UgZG9uJ3Qgc2VlIHRoZSBwaXhlbAotICAgY2FjaGUgcmVnaW9uKSBhbmQgdGhlIHNjcm9sbGJhcnMgYXJlIHZlcnkgdGhpbiB0byBhdm9pZCBkaXN0cmFjdGlvbgotICAgYW5kIHRyb3VibGUgZml0dGluZyBpbnNpZGUgeW91ciBkaXNwbGF5LiBVc2UgdGhlICItc2J3aWR0aCBuIiB2aWV3ZXIKLSAgIG9wdGlvbiB0byBtYWtlIHRoZSBzY3JvbGxiYXJzIHRoaWNrZXIgaWYgeW91IGxpa2UuCi0KLSAgIEFub3RoZXIgZHJhd2JhY2sgb2YgdGhlIHNjaGVtZSBpcyB0aGF0IGl0IGlzIFZFUlkgbWVtb3J5IGludGVuc2l2ZSwKLSAgIHRoZSBuIGluICItbmNhY2hlIG4iIGlzIHRoZSBmYWN0b3Igb2YgaW5jcmVhc2Ugb3ZlciB0aGUgYmFzZQotICAgZnJhbWVidWZmZXIgc2l6ZSB0byB1c2UgZm9yIGNhY2hpbmcuIEl0IGlzIGFuIGV2ZW4gaW50ZWdlciBhbmQgc2hvdWxkCi0gICBiZSBmYWlybHkgbGFyZ2UsIDYtMTIsIHRvIGFjaGlldmUgZ29vZCByZXNwb25zZS4gVGhpcyB1c3VhbGx5IHJlcXVpcmVzCi0gICBhYm91dCA1MC0xMDBNQiBvZiBhZGRpdGlvbmFsIFJBTSBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlcy4KLSAgIEZvciBleGFtcGxlIHdpdGggbj02IGEgMTI4MHgxMDI0IGRpc3BsYXkgd2lsbCB1c2UgYSBmcmFtZWJ1ZmZlciB0aGF0Ci0gICBpcyAxMjgweDcxNjg6IGV2ZXJ5dGhpbmcgYmVsb3cgcm93IDEwMjQgaXMgdGhlIHBpeGVsIGJ1ZmZlciBjYWNoZS4gSWYKLSAgIHlvdSBhcmUgcnVubmluZyBvbiBsb3cgbWVtb3J5IG1hY2hpbmVzIG9yIG1lbW9yeSBpcyB0aWdodCBiZWNhdXNlIG9mCi0gICBvdGhlciBydW5uaW5nIGFwcGxpY2F0aW9ucyB5b3Ugc2hvdWxkIG5vdCB1c2UgLW5jYWNoZS4KLQotICAgVGhlIHJlYXNvbiBmb3Igc28gbXVjaCBtZW1vcnkgaXMgYmVjYXVzZSB0aGUgcGl4ZWwgZGF0YSBpcyBub3QKLSAgIGNvbXByZXNzZWQgYW5kIHNvIHRoZSB3aG9sZSB3aW5kb3cgdG8gYmUgc2F2ZWQgbXVzdCBiZSBzdG9yZWQKLSAgICJvZmZzY3JlZW4iLiBFLmcuIGZvciBhIGxhcmdlIHdlYiBicm93c2VyIHdpbmRvdyB0aGlzIGNhbiBiZSBuZWFybHkgMQotICAgbWlsbGlvbiBwaXhlbHMsIGFuZCB0aGF0IGlzIG9ubHkgZm9yIGEgc2luZ2xlIHdpbmRvdyEgT25lIHR5cGljYWxseQotICAgd2FudHMgdG8gY3ljbGUgYmV0d2VlbiA1LTEwIGxhcmdlIGFjdGl2ZSB3aW5kb3dzLiBBbHNvIGJlY2F1c2UgYm90aAotICAgYmFja2luZy1zdG9yZSAodGhlIHdpbmRvdydzIGFjdHVhbCBjb250ZW50cykgYW5kIHNhdmUtdW5kZXJzICh0aGUKLSAgIHBpeGVscyBjb3ZlcmVkIHVwIGJ5IHRoZSB3aW5kb3cpIGFyZSBjYWNoZWQgb2Zmc2NyZWVuIHRoYXQgaW50cm9kdWNlcwotICAgYW4gYWRkaXRpb25hbCBmYWN0b3Igb2YgMiBpbiBtZW1vcnkgdXNlLgotCi0gICBIb3dldmVyLCBldmVuIGluIHRoZSBzbWFsbGVzdCB1c2FnZSBtb2RlIHdpdGggbiBlcXVhbCAyIGFuZAotICAgLW5jYWNoZV9ub19yb290cGl4bWFwIHNldCAodGhpcyByZXF1aXJlcyBvbmx5IDJYIGFkZGl0aW9uYWwKLSAgIGZyYW1lYnVmZmVyIG1lbW9yeSkgdGhlcmUgaXMgc3RpbGwgYSBub3RpY2FibGUgaW1wcm92ZW1lbnQgZm9yIG1hbnkKLSAgIGFjdGl2aXRpZXMsIGFsdGhvdWdoIGl0IGlzIG5vdCBhcyBkcmFtYXRpYyBhcyB3aXRoLCBzYXkgbiBlcXVhbCAxMiBhbmQKLSAgIHJvb3RwaXhtYXAgKGRlc2t0b3AgYmFja2dyb3VuZCkgY2FjaGluZyBlbmFibGVkLgotCi0gICBUaGUgbGFyZ2UgbWVtb3J5IGNvbnN1bXB0aW9uIG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNhbiBiZQotICAgdGhvdWdodCBvZiBhcyBhIHRyYWRlb2ZmIHRvIHByb3ZpZGluZyBjYWNoaW5nIGFuZCBiZWluZyBjb21wYXRpYmxlCi0gICB3aXRoIGFsbCBWTkMgdmlld2VycyBhbmQgYWxzbyBlYXNlIG9mIGltcGxlbWVudGluZy4gSG9wZWZ1bGx5IGl0IGNhbgotICAgYmUgdHVuZWQgdG8gdXNlIGxlc3MsIG9yIHRoZSBWTkMgY29tbXVuaXR5IHdpbGwgZXh0ZW5kIHRoZSBwcm90b2NvbCB0bwotICAgYWxsb3cgY2FjaGluZyBhbmQgcmVwbGF5aW5nIG9mIGNvbXByZXNzZWQgYmxvYnMgb2YgZGF0YS4KLQotICAgQW5vdGhlciBvcHRpb24gdG8gZXhwZXJpbWVudCB3aXRoIGlzICItbmNhY2hlX2NyIi4gQnkgc3BlY2lmeWluZyBpdCwKLSAgIHgxMXZuYyB3aWxsIHRyeSB0byBkbyBzbW9vdGggb3BhcXVlIHdpbmRvdyBtb3ZlcyBpbnN0ZWFkIG9mIGl0cwotICAgd2lyZWZyYW1lLiBUaGlzIGNhbiBnaXZlIGEgdmVyeSBuaWNlIGVmZmVjdCAobm90ZTogb24gVW5peCB0aGUgcmVhbHZuYwotICAgdmlld2VyIHNlZW1zIHRvIGJlIHNtb290aGVyIHRoYW4gdGhlIHRpZ2h0dm5jIHZpZXdlciksIGJ1dCBjYW4gbGVhZCB0bwotICAgc29tZSBwYWludGluZyBwcm9ibGVtcywgYW5kIGNhbiBiZSBqZXJreSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuCi0KLSAgIFN1cnByaXNpbmdseSwgZm9yIHZlcnkgc2xvdyBjb25uZWN0aW9ucywgZS5nLiBtb2RlbSwgdGhlIC1uY2FjaGVfY3IKLSAgIG9wdGlvbiBjYW4gYWN0dWFsbHkgaW1wcm92ZSB3aW5kb3cgZHJhZ3MuIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBubwotICAgcGl4ZWwgZGF0YSAob25seSBDb3B5UmVjdCBpbnN0cnVjdGlvbnMpIGFyZSBzZW50IHdoZW4gZHJhZ2dpbmcgYQotICAgd2luZG93LiBOb3JtYWxseSwgdGhlIHdpcmVmcmFtZSBtdXN0IGJlIHNlbnQgYW5kIHRoaXMgaW52b2x2ZXMKLSAgIGNvbXByZXNzaW5nIGFuZCBzZW5kaW5nIHRoZSBsaW5lcyB0aGF0IGdpdmUgcmlzZSB0byB0aGUgbW92aW5nIGJveAotICAgZWZmZWN0IChub3RlIHRoYXQgcmVhbCBmcmFtZWJ1ZmZlciBkYXRhIGlzIHNlbnQgdG8gImVyYXNlIiB0aGUgd2hpdGUKLSAgIGxpbmVzIG9mIHRoZSBib3guKQotCi0gICBJZiB5b3UgZXhwZXJpZW5jZSBwYWludGluZyBlcnJvcnMgeW91IGNhbiBjYW4gdGFwIHRoZSBBbHRfTCBrZXkgKExlZnQKLSAgICJBbHQiIGtleSkgMyB0aW1lcyBpbiBhIHJvdyB0byBzaWduYWwgeDExdm5jIHRvIHJlZnJlc2ggdGhlIHNjcmVlbiB0bwotICAgYWxsIHZpZXdlcnMuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGljb25pZnkgYW5kIHRoZW4gZGVpY29uaWZ5IGFueQotICAgZGFtYWdlZCB3aW5kb3dzIHRvIGNvcnJlY3QgdGhlaXIgY2FjaGUgZGF0YSBhcyB3ZWxsLiBOb3RlIHRoYXQgaWYgeW91Ci0gICBjaGFuZ2UgY29sb3Igdmlld2VyIGRlcHRoIChlLmcuIDhicHAgdG8gZnVsbCBjb2xvcikgZHluYW1pY2FsbHkgdGhhdAotICAgd2lsbCB1c3VhbGx5IGxlYWQgdG8gdGhlIGVudGlyZSBleHRlbmRlZCBmcmFtZWJ1ZmZlciBiZWluZyByZXNlbnQKLSAgIHdoaWNoIGNhbiB0YWtlIGEgbG9uZyB0aW1lIG92ZXIgdmVyeSBzbG93IGxpbmtzOiBpdCBtYXkgYmUgYmV0dGVyIHRvCi0gICByZWNvbm5lY3QgYW5kIHJlc2V0IHRoZSBmb3JtYXQgcmlnaHQgYWZ0ZXIgZG9pbmcgc28uIHgxMXZuYyB3aWxsIHRyeQotICAgdG8gZGV0ZWN0IHRoZSBmb3JtYXQgY2hhbmdlIGFuZCBjbGVhciAobWFrZSBjb21wbGV0ZWx5IGJsYWNrKSB0aGUKLSAgIGNhY2hlIHJlZ2lvbi4KLQotICAgR290Y2hhIGZvciBvbGRlciBVbml4IFZOQyBWaWV3ZXJzOiBUaGUgb2xkZXIgVW5peCBWTkMgdmlld2VycyAoZS5nLgotICAgY3VycmVudCBUaWdodFZOQyBVbml4IFZpZXdlcikgcmVxdWlyZSBYIHNlcnZlciBiYWNraW5nc3RvcmUgdG8ga2VlcAotICAgb2ZmLXZpZXdlciBzY3JlZW4gZGF0YSBsb2NhbC4gSWYgdGhlIHZpZXdlci1zaWRlIFggc2VydmVyIGhhcwotICAgYmFja2luZ3N0b3JlIGRpc2FibGVkIChzYWRseSwgY3VycmVudGx5IHRoZSBkZWZhdWx0IG9uIExpbnV4LCBldGMpLAotICAgdGhlbiB0byBnZXQgdGhlIG9mZnNjcmVlbiBwaXhlbHMgdGhlIHZpZXdlciBoYXMgdG8gYXNrIGZvciBhIHJlZnJlc2gKLSAgIG92ZXIgdGhlIG5ldHdvcmssIHRoZXJlYnkgZGVmZWF0aW5nIHRoZSBjYWNoaW5nLiBVc2Ugc29tZXRoaW5nIGxpa2UKLSAgIHRoaXMgaW4geW91ciB2aWV3ZXItc2lkZSAvZXRjL1gxMS94b3JnLmNvbmYgZmlsZSAob3Igb3RoZXJ3aXNlIGdldAotICAgeW91ciB2aWV3ZXItc2lkZSBzeXN0ZW0gdG8gZG8gaXQpCi1TZWN0aW9uICJEZXZpY2UiCi0gICAgICAgIC4uLgotICAgICAgICBPcHRpb24gICJiYWNraW5nc3RvcmUiCi0gICAgICAgIC4uLgotRW5kU2VjdGlvbgotCi0gICBObyBwcm9ibGVtcyBsaWtlIHRoaXMgaGF2ZSBiZWVuIG9ic2VydmVkIHdpdGggV2luZG93cyBWTkMgVmlld2VyczoKLSAgIHRoZXkgYWxsIHNlZW0gdG8ga2VlcCB0aGVpciBlbnRpcmUgZnJhbWVidWZmZXIgaW4gbG9jYWwgbWVtb3J5LgotCi0gICBHb3RjaGEgZm9yIEtERSBrcmRjIFZOQyBWaWV3ZXI6IE9uZSB1c2VyIGZvdW5kIHRoYXQgS0RFJ3Mga3JkYyB2aWV3ZXIKLSAgIGhhcyBzb21lIHNvcnQgb2YgaGFyZHdpcmVkIGxpbWl0IG9uIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlCi0gICBmcmFtZWJ1ZmZlciAoNjRNQj8pLiBJdCBmYWlscyBxdWlja2x5IHNheWluZyAiVGhlIGNvbm5lY3Rpb24gdG8gdGhlCi0gICBob3N0IGhhcyBiZWVuIGludGVycnVwdGVkLiIgVGhlIHdvcmthcm91bmQgZm9yIGhpcyAxMjgweDEwMjQKLSAgIHgxMXZuYy1zaWRlIGRpc3BsYXkgd2FzIHRvIHJ1biB3aXRoICItbmNhY2hlIDEwIiwgaS5lLiBhIHNtYWxsZXIgdmFsdWUKLSAgIHRvIGJlIHVuZGVyIHRoZSBrcmRjIHRocmVzaG9sZC4KLQotICAgQWx0aG91Z2ggdGhpcyBzY2hlbWUgaXMgbm90IGFzIHF1aWNrIChub3IgYXMgY29tcHJlc3NlZCkgYXMKLSAgIG54L25vbWFjaGluZSwgc2F5LCBpdCBkb2VzIHByb3ZpZGUgYSBnb29kIHN0ZXAgaW4gdGhlIGRpcmVjdGlvbiBvZgotICAgaW1wcm92aW5nIFZOQyBwZXJmb3JtYW5jZSBieSBjbGllbnQgc2lkZSBjYWNoaW5nLgotCi0KLSAgIFEtODA6IERvZXMgeDExdm5jIHN1cHBvcnQgVHVyYm9WTkM/Ci0KLSAgIEFzIG9mIEZlYi8yMDA5IChkZXZlbG9wbWVudCB0YXJiYWxsKSB0aGVyZSBpcyBhbiBleHBlcmltZW50YWwga2x1ZGdlCi0gICB0byBsZXQgeW91IGJ1aWxkIHgxMXZuYyB1c2luZyBUdXJib1ZOQydzIG1vZGlmaWVkIFRpZ2h0Vk5DIGVuY29kaW5nLgotICAgVHVyYm9WTkMgaXMgcGFydCBvZiB0aGUgVmlydHVhbEdMIHByb2plY3QuIEl0IGRvZXMgdHdvIG1haW4gdGhpbmdzIHRvCi0gICBzcGVlZCB1cCB0aGUgVGlnaHRWTkMgZW5jb2Rpbmc6Ci0gICAgICogSXQgZWxpbWluYXRlcyBib3R0bGVuZWNrcywgb3ZlcmhlYWRzLCB3YWl0LXRpbWVzIGluIHRoZSBUaWdodFZOQwotICAgICAgIGVuY29kaW5nIGltcGxlbWVudGF0aW9uIGFuZCBpbnN0ZWFkIG9ubHkgd29ycmllcyBhYm91dCBzZW5kaW5nCi0gICAgICAgdmVyeSB3ZWxsIChhbmQgcXVpY2tseSkgY29tcHJlc3NlZCBKUEVHIGRhdGEuCi0gICAgICogQSBmYXN0IHByb3ByaWV0YXJ5IEpQRUcgaW1wbGVtZW50aW9uIGlzIHVzZWQgKEludGVsIElQUCBvbiB4ODYpCi0gICAgICAgaW5zdGVhZCBvZiB0aGUgdXN1YWwgbGlianBlZyBpbXBsZW1lbnRhdGlvbi4gVHVyYm9KUEVHIGlzIGFuCi0gICAgICAgaW50ZXJmYWNlIGxpYnJhcnksIGxpYnR1cmJvanBlZywgcHJvdmlkZWQgYnkgdGhlIHByb2plY3QgdGhhdAotICAgICAgIGFjaGlldmVzIHRoaXMuCi0KLSAgIFR1cmJvVk5DIHdvcmtzIHZlcnkgd2VsbCBvdmVyIExBTiBhbmQgZXZpZGVudGx5IGZhc3QgQnJvYWRiYW5kIHRvby4KLSAgIFdoZW4gdXNpbmcgaXQgd2l0aCB4MTF2bmMgaW4gc3VjaCBhIHNpdHVhdGlvbiB5b3UgbWF5IHdhbnQgdG8gZGlhbAotICAgZG93biB0aGUgZGVsYXlzLCBlLmcuICItd2FpdCA1IiBhbmQgIi1kZWZlciA1IiAob3IgZXZlbiBhIHNtYWxsZXIKLSAgIHNldHRpbmcpIHRvIHBvbGwgYW5kIHB1bXAgdGhpbmdzIG91dCBtb3JlIHF1aWNrbHkuCi0KLSAgIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluICJ4MTF2bmMvbWlzYy90dXJib3ZuYy9SRUFETUUiIGZvciBob3cgdG8gYnVpbGQKLSAgIHgxMXZuYyB3aXRoIFR1cmJvVk5DIHN1cHBvcnQuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBkb3dubG9hZCB0aGUKLSAgIFR1cmJvSlBFRyBzb2Z0d2FyZS4KLQotICAgSW4gYnJpZWYsIHRoZSBzdGVwcyBsb29rIGxpa2UgdGhpczoKLSAgY2QgeDExdm5jLXgueS56L3gxMXZuYy9taXNjL3R1cmJvdm5jCi0gIC4vYXBwbHlfdHVyYm92bmMKLSAgY2QgLi4vLi4vLi4KLSAgZW52IExERkxBR1M9Jy1ML0RJUiAtWGxpbmtlciAtLXJwYXRoPS9ESVInIC4vY29uZmlndXJlCi0gIG1ha2UgQU1fTERGTEFHUz0nLWx0dXJib2pwZWcnCi0KLSAgIHdoZXJlIHlvdSByZXBsYWNlICIvRElSIiB3aXRoIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBsaWJ0dXJib2pwZWcuc28KLSAgIHlvdSBkb3dubG9hZGVkIHNlcGFyYXRlbHkuIElmIGl0IHdvcmtzIG91dCB3ZWxsIGVub3VnaCBUdXJib1ZOQwotICAgc3VwcG9ydCB3aWxsIGJlIGludGVncmF0ZWQgaW50byB4MTF2bmMgYW5kIG1vcmUgb2YgaXRzIHR1bmluZyBmZWF0dXJlcwotICAgd2lsbCBiZSBpbXBsZW1lbnRlZC4gU3VwcG9ydCBmb3IgVHVyYm9WTkMgaW4gU1NWTkMgdmlld2VyIGhhcyBiZWVuCi0gICBhZGRlZCBhcyBhbiBleHBlcmltZW50IGFzIHdlbGwuIElmIHlvdSB0cnkgZWl0aGVyIG9uZSwgbGV0IHVzIGtub3cgaG93Ci0gICBpdCB3ZW50LgotCi0gICBUaGVyZSBhbHNvIG1heSBiZSBzb21lIExpbnV4Lmk2ODYgYW5kIERhcndpbi5pMzg2IHgxMXZuYyBiaW5hcmllcyB3aXRoCi0gICBUdXJib1ZOQyBzdXBwb3J0IGluIHRoZSBtaXNjLiBiaW5zIGRpcmVjdG9yeS4gRm9yIG90aGVyIHBsYXRmb3JtcyB5b3UKLSAgIHdpbGwgbmVlZCB0byBjb21waWxlIHlvdXJzZWxmLgotCi0gICBPbiByZWxhdGl2ZWx5IGNoZWFwIGFuZCBvbGQgaGFyZHdhcmUgKEFsdGhvbjY0IFgyIDUwMDArIC8gR2VGb3JjZQotICAgNjIwMCkgeDExdm5jIGFuZCBTU1ZOQywgYm90aCBUdXJib1ZOQyBlbmFibGVkLCB3ZXJlIGFibGUgdG8gc3VzdGFpbgotICAgMTMuNSBmcmFtZXMvc2VjIChmcHMpIGFuZCAxNSBNZWdhcGl4ZWxzL3NlYyB1c2luZyB0aGUgVmlydHVhbEdMCi0gICBzdXBwbGllZCBPcGVuR0wgYmVuY2htYXJrIHByb2dyYW0gZ2x4c3BoZXJlcy4gVmlydHVhbEdMIG9uIGhpZ2hlci1lbmQKLSAgIGhhcmR3YXJlIGNhbiBzdXN0YWluIDIwLTMwIGZwcyB3aXRoIHRoZSBnbHhzcGhlcmVzIGJlbmNobWFyay4KLQotICAgUG90ZW50aWFsIFNsb3dkb3duOiBBcyB3ZSBkZXNjcmliZSBlbHNld2hlcmUsIHVubGVzcyB5b3UgdXNlIHgxMXZuYwotICAgd2l0aCBhbiBYIHNlcnZlciB1c2luZywgc2F5LCBOVmlkaWEgcHJvcHJpZXRhcnkgZHJpdmVycyAob3IgYSB2aXJ0dWFsCi0gICBYIHNlcnZlciBsaWtlIFh2ZmIgb3IgWGR1bW15LCBvciBpbiBTaGFkb3dGQiBtb2RlKSwgdGhlbiB0aGUgcmVhZCByYXRlCi0gICBmcm9tIHRoZSBncmFwaGljcyBjYXJkIGNhbiBiZSByYXRoZXIgc2xvdyAoZS5nLiAxMCBNQi9zZWMpIGFuZCBiZWNvbWVzCi0gICB0aGUgYm90dGxlbmVjayB3aGVuIHVzaW5nIHgxMXZuYyBvdmVyIGZhc3QgbmV0d29ya3MuIE5vdGUgdGhhdCBhbGwgb2YKLSAgIFhvcmcncyBkcml2ZXJzIGN1cnJlbnRseSAoMjAwOSkgaGF2ZSBzbG93IHJlYWQgcmF0ZXMgKG9ubHkgcHJvcHJpZXRhcnkKLSAgIGRyaXZlcnMgYXBwZWFyIHRvIGhhdmUgb3B0aW1pemVkIHJlYWRzLikKLQotICAgU28gdW5kZXIgdGhlc2UgKG1vcmUgb3IgbGVzcyB0eXBpY2FsKSBjb25kaXRpb25zLCB0aGUgc3BlZWQKLSAgIGltcHJvdmVtZW50IHByb3ZpZGVkIGJ5IFR1cmJvVk5DIG1heSBvbmx5IGJlIG1hcmdpbmFsLiBMb29rIGZvciB0aGlzCi0gICBvdXRwdXQgdG8gc2VlIHlvdXIgcmVhZCByYXRlOgotICAyOC8wMi8yMDA5IDExOjExOjA3IEF1dG9wcm9iaW5nIFRDUCBwb3J0Ci0gIDI4LzAyLzIwMDkgMTE6MTE6MDcgQXV0b3Byb2Jpbmcgc2VsZWN0ZWQgcG9ydCA1OTAwCi0gIDI4LzAyLzIwMDkgMTE6MTE6MDggZmIgcmVhZCByYXRlOiAxMCBNQi9zZWMKLSAgMjgvMDIvMjAwOSAxMToxMTowOCBzY3JlZW4gc2V0dXAgZmluaXNoZWQuCi0KLSAgIEEgcmF0ZSBvZiAxMCBNQi9zZWMgbWVhbnMgYSAxMjgweDEwMjR4MjQgc2NyZWVuIHRha2VzIDAuNSBzZWNvbmRzIHRvCi0gICByZWFkIGluLiBUdXJib1ZOQyBjb21wcmVzc2VzIHRoYXQgdG8gSlBFRyBpbiBhIG11Y2ggc2hvcnRlciB0aW1lLiBPbgotICAgdGhlIG90aGVyIGhhbmQsIGFuIE5WaWRpYSBkcml2ZXIgbWF5IGhhdmUgYSByZWFkIHJhdGUgb2YgMjUwIE1CL3NlYwotICAgYW5kIHNvIG9ubHkgdGFrZXMgMC4wMiBzZWNvbmRzIHRvIHJlYWQgdGhlIGVudGlyZSBzY3JlZW4gaW4uCi0KLQotCi0gICBbTW91c2UgQ3Vyc29yIFNoYXBlc10KLQotICAgUS04MTogV2h5IGlzbid0IHRoZSBtb3VzZSBjdXJzb3Igc2hhcGUgKHRoZSBsaXR0bGUgaWNvbiBzaGFwZSB3aGVyZQotICAgdGhlIG1vdXNlIHBvaW50ZXIgaXMpIGNvcnJlY3QgYXMgSSBtb3ZlIGZyb20gd2luZG93IHRvIHdpbmRvdz8KLQotICAgT24gWCBzZXJ2ZXJzIHN1cHBvcnRpbmcgWEZJWEVTIG9yIFNvbGFyaXMvSVJJWCBPdmVybGF5IGV4dGVuc2lvbnMgaXQKLSAgIGlzIHBvc3NpYmxlIGZvciB4MTF2bmMgdG8gZG8gdGhpcyBjb3JyZWN0bHkuIFNlZSBhIGZldyBwYXJhZ3JhcGhzIGRvd24KLSAgIGZvciB0aGUgYW5zd2VyLgotCi0gICBIaXN0b3JpY2FsbHksIHRoZSBYMTEgbW91c2UgY3Vyc29yIHNoYXBlIChpLmUuIGxpdHRsZSBwaWN0dXJlOiBhbgotICAgYXJyb3csIFgsIEktYmVhbSwgcmVzaXplciwgZXRjKSBpcyBvbmUgb2YgdGhlIGZldyBXUklURS1vbmx5IG9iamVjdHMKLSAgIGluIFgxMS4gVGhhdCBpcywgYW4gYXBwbGljYXRpb24gY2FuIHRlbGwgdGhlIFggc2VydmVyIHdoYXQgdGhlIGN1cnNvcgotICAgc2hhcGUgc2hvdWxkIGJlIHdoZW4gdGhlIHBvaW50ZXIgaXMgaW4gYSBnaXZlbiB3aW5kb3csIGJ1dCBhIHByb2dyYW0KLSAgIChsaWtlIHgxMXZuYykgdW5mb3J0dW5hdGVseSBjYW5ub3QgcmVhZCB0aGlzIGluZm9ybWF0aW9uLiBJIGJlbGlldmUKLSAgIHRoaXMgaXMgYmVjYXVzZSB0aGUgY3Vyc29yIHNoYXBlIGlzIG9mdGVuIGRvd25sb2FkZWQgdG8gdGhlIGdyYXBoaWNzCi0gICBoYXJkd2FyZSAodmlkZW8gY2FyZCksIGJ1dCBJIGNvdWxkIGJlIG1pc3Rha2VuLgotCi0gICBBIHNpbXBsZSBrbHVkZ2UgaXMgcHJvdmlkZWQgYnkgdGhlICItY3Vyc29yIFgiIG9wdGlvbiB0aGF0IGNoYW5nZXMgdGhlCi0gICBjdXJzb3Igd2hlbiB0aGUgbW91c2UgaXMgb24gdGhlIHJvb3QgYmFja2dyb3VuZCAob3IgYW55IHdpbmRvdyBoYXMgdGhlCi0gICBzYW1lIGN1cnNvciBhcyB0aGUgcm9vdCBiYWNrZ3JvdW5kLikgTm90ZSB0aGF0IGRlc2t0b3BzIGxpa2UgR05PTUUgb3IKLSAgIEtERSBvZnRlbiBjb3ZlciB1cCB0aGUgcm9vdCBiYWNrZ3JvdW5kLCBzbyB0aGlzIHdvbid0IHdvcmsgZm9yIHRob3NlCi0gICBjYXNlcy4gQWxzbyBzZWUgdGhlICItY3Vyc29yIHNvbWUiIG9wdGlvbiBmb3IgYWRkaXRpb25hbCBrbHVkZ2VzLgotCi0gICBOb3RlIHRoYXQgYXMgb2YgQXVnLzIwMDQgb24gU29sYXJpcyB1c2luZyB0aGUgU1VOX09WTCBvdmVybGF5Ci0gICBleHRlbnNpb24gYW5kIElSSVgsIHgxMXZuYyBjYW4gc2hvdyB0aGUgY29ycmVjdCBtb3VzZSBjdXJzb3Igd2hlbiB0aGUKLSAgIC1vdmVybGF5IG9wdGlvbiBpcyBzdXBwbGllZC4gU2VlIHRoaXMgRkFRIGZvciBtb3JlIGluZm8uCi0KLSAgIEFsc28gYXMgb2YgRGVjLzIwMDQgWEZJWEVTIFggZXh0ZW5zaW9uIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKLSAgIGV4YWN0IGV4dHJhY3Rpb24gb2YgdGhlIG1vdXNlIGN1cnNvciBzaGFwZS4gWEZJWEVTIGZpeGVzIHRoZSBwcm9ibGVtCi0gICBvZiB0aGUgY3Vyc29yLXNoYXBlIGJlaW5nIHdyaXRlLW9ubHk6IHgxMXZuYyBjYW4gbm93IHF1ZXJ5IHRoZSBYCi0gICBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50IHNoYXBlIGFuZCBzZW5kIGl0IGJhY2sgdG8gdGhlIGNvbm5lY3RlZAotICAgdmlld2Vycy4gWEZJWEVTIGlzIGF2YWlsYWJsZSBvbiByZWNlbnQgTGludXggWG9yZyBiYXNlZCBkaXN0cm9zIGFuZAotICAgU29sYXJpcyAxMC4KLQotICAgVGhlIG9ubHkgWEZJWEVTIGlzc3VlIGlzIHRoZSBoYW5kbGluZyBvZiBhbHBoYSBjaGFubmVsIHRyYW5zcGFyZW5jeSBpbgotICAgY3Vyc29ycy4gSWYgYSBjdXJzb3IgaGFzIGFueSB0cmFuc2x1Y2VuY3kgdGhlbiBpbiBnZW5lcmFsIGl0IG11c3QgYmUKLSAgIGFwcHJveGltYXRlZCB0byBvcGFxdWUgUkdCIHZhbHVlcyBmb3IgdXNlIGluIFZOQy4gVGhlcmUgYXJlIHNvbWUKLSAgIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGN1cnNvciB0cmFuc3BhcmVuY3kgY2FuIGFsc28gaGFuZGxlZCBleGFjdGx5OgotICAgd2hlbiB0aGUgVk5DIFZpZXdlciByZXF1aXJlcyB0aGUgY3Vyc29yIHNoYXBlIGJlIGRyYXduIGludG8gdGhlIFZOQwotICAgZnJhbWVidWZmZXIgb3IgaWYgeW91IGFwcGx5IGEgcGF0Y2ggdG8geW91ciBWTkMgVmlld2VyIHRvIGV4dHJhY3QKLSAgIGhpZGRlbiBhbHBoYSBjaGFubmVsIGRhdGEgdW5kZXIgMzJicHAuIERldGFpbHMgY2FuIGJlIGZvdW5kIGhlcmUuCi0KLQotICAgUS04MjogV2hlbiB1c2luZyBYRklYRVMgY3Vyc29yc2hhcGUgbW9kZSwgc29tZSBvZiB0aGUgY3Vyc29ycyBsb29rCi0gICByZWFsbHkgYmFkIHdpdGggZXh0cmEgYmxhY2sgYm9yZGVycyBhcm91bmQgdGhlIGN1cnNvciBhbmQgb3RoZXIgY3J1ZnQuCi0gICBIb3cgY2FuIEkgaW1wcm92ZSB0aGVpciBhcHBlYXJhbmNlPwotCi0gICBUaGlzIGhhcHBlbnMgZm9yIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIik7IHJlZ3VsYXIKLSAgIFggY3Vyc29ycyAoYml0bWFwcykgc2hvdWxkIGJlIGNvcnJlY3QuIFVuZm9ydHVuYXRlbHkgeDExdm5jIDAuNyB3YXMKLSAgIHJlbGVhc2VkIHdpdGggYSB2ZXJ5IHBvb3IgYWxnb3JpdGhtIGZvciBhcHByb3hpbWF0aW5nIHRoZQotICAgdHJhbnNwYXJlbmN5LCB3aGljaCBsZWQgdG8gdGhlIHVnbHkgYmxhY2sgYm9yZGVycy4KLQotICAgVGhlIHByb2JsZW0gaXMgYXMgZm9sbG93czogWEZJWEVTIGFsbG93cyB4MTF2bmMgdG8gcmV0cmlldmUgdGhlCi0gICBjdXJyZW50IFggc2VydmVyIGN1cnNvciBzaGFwZSwgaW5jbHVkaW5nIHRoZSBhbHBoYSBjaGFubmVsIGZvcgotICAgdHJhbnNwYXJlbmN5LiBGb3IgdHJhZGl0aW9uYWwgYml0bWFwIGN1cnNvcnMgdGhlIGFscGhhIHZhbHVlIHdpbGwgYmUgMAotICAgZm9yIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIGFuZCAyNTUgZm9yIGNvbXBsZXRlbHkgb3BhcXVlCi0gICBwaXhlbHM7IHdoZXJlYXMgZm9yIG1vZGVybiwgZXllLWNhbmR5IGN1cnNvcnMgYW4gYWxwaGEgdmFsdWUgYmV0d2VlbiAwCi0gICBhbmQgMjU1IG1lYW5zIHRvIGJsZW5kIGluIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGF0IGRlZ3JlZSB3aXRoCi0gICB0aGUgY3Vyc29yIGNvbG9ycy4gVGhlIHBpeGVsIGNvbG9yIGJsZW5kaW5nIGZvcm11bGEgaXMgc29tZXRoaW5nIGxpa2UKLSAgIHRoaXM6IFJlZCA9IFJlZF9jdXJzb3IgKiBhICsgUmVkX2JhY2tncm91bmQgKiAoMSAtIGEpLCAod2hlcmUgaGVyZSAwCi0gICA9PCBhID08IDEpLCB3aXRoIHNpbWlsYXIgZm9yIEdyZWVuIGFuZCBCbHVlLiBUaGUgVk5DIHByb3RvY29sIGRvZXMgbm90Ci0gICBjdXJyZW50bHkgc3VwcG9ydCBhbiBhbHBoYSBjaGFubmVsIGluIGN1cnNvcnM6IGl0IG9ubHkgc3VwcG9ydHMKLSAgIHJlZ3VsYXIgWCBiaXRtYXAgY3Vyc29ycyBhbmQgUmljaCBDdXJzb3JzIHRoYXQgaGF2ZSBSR0IgKFJlZCwgR3JlZW4sCi0gICBCbHVlKSBjb2xvciBkYXRhLCBidXQgbm8gIkEiID0gYWxwaGEgZGF0YS4gU28gaW4gZ2VuZXJhbCB4MTF2bmMgaGFzIHRvCi0gICBhcHByb3hpbWF0ZSBhIGN1cnNvciB3aXRoIHRyYW5zcGFyZW5jeSB0byBjcmVhdGUgYSBSaWNoIEN1cnNvci4gVGhpcwotICAgaXMgZWFzaWVyIHNhaWQgdGhhbiBkb25lOiBzb21lIGN1cnNvciB0aGVtZXMgaGF2ZSBjdXJzb3JzIHdpdGgKLSAgIGNvbXBsaWNhdGVkIGRyb3Agc2hhZG93cyBhbmQgb3RoZXIgZm9ybXMgb2YgdHJhbnNsdWNlbmN5LgotCi0gICBBbnl3YXksIGZvciB0aGUgeDExdm5jIDAuNy4xIHJlbGVhc2UgdGhlIGFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGluZwotICAgdHJhbnNwYXJlbmN5IGlzIG11Y2ggaW1wcm92ZWQgYW5kIGhvcGVmdWxseSBnaXZlcyBkZWNlbnQgY3Vyc29yIHNoYXBlcwotICAgZm9yIG1vc3QgY3Vyc29yIHRoZW1lcyBhbmQgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQuCi0KLSAgIEluIGNhc2UgaXQgc3RpbGwgbG9va3MgYmFkIGZvciB5b3VyIGN1cnNvciB0aGVtZSwgdGhlcmUgYXJlIChvZgotICAgY291cnNlISkgc29tZSB0dW5hYmxlIHBhcmFtZXRlcnMuIFRoZSAiLWFscGhhY3V0IG4iIG9wdGlvbiBsZXRzIHlvdQotICAgc2V0IHRoZSB0aHJlc2hvbGQgIm4iIChiZXR3ZWVuIDAgYW5kIDI1NSk6IGN1cnNvciBwaXhlbHMgd2l0aCBhbHBoYQotICAgdmFsdWVzIGJlbG93IG4gd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgd2hpbGUgdmFsdWVzCi0gICBlcXVhbCB0byBvciBhYm92ZSBuIHdpbGwgYmUgY29tcGxldGVseSBvcGFxdWUuIFRoZSBkZWZhdWx0IGlzIDI0MC4gVGhlCi0gICAiLWFscGhhZnJhYyBmIiBvcHRpb24gdHJpZXMgdG8gY29ycmVjdCBpbmRpdmlkdWFsIGN1cnNvcnMgdGhhdCBkaWQgbm90Ci0gICBmYXJlIHdlbGwgd2l0aCB0aGUgZGVmYXVsdCAtYWxwaGFjdXQgdmFsdWU6IGlmIGEgY3Vyc29yIGhhcyBsZXNzIHRoYW4KLSAgIGZyYWN0aW9uIGYgKGJldHdlZW4gMC4wIGFuZCAxLjApIG9mIGl0cyBwaXhlbHMgc2VsZWN0ZWQgYnkgdGhlIGRlZmF1bHQKLSAgIC1hbHBoYWN1dCwgdGhlIHRocmVzaG9sZCBpcyBsb3dlcmVkIHVudGlsIGYgb2YgaXRzIHBpeGVscyBhcmUKLSAgIHNlbGVjdGVkLiBUaGUgZGVmYXVsdCBmcmFjdGlvbiBpcyAwLjMzLgotCi0gICBGaW5hbGx5LCB0aGVyZSBpcyBhbiBvcHRpb24gLWFscGhhcmVtb3ZlIHRoYXQgaXMgdXNlZnVsIGZvciB0aGVtZXMKLSAgIHdoZXJlIG1hbnkgY3Vyc29ycyBhcmUgbGlnaHQgY29sb3JlZCAoZS5nLiAid2hpdGVnbGFzcyIuKSBYRklYRVMKLSAgIHJldHVybnMgdGhlIGN1cnNvciBkYXRhIHdpdGggdGhlIFJHQiB2YWx1ZXMgcHJlLW11bHRpcGxpZWQgYnkgdGhlCi0gICBhbHBoYSB2YWx1ZS4gSWYgdGhlIHdoaXRlIGN1cnNvcnMgbG9vayB0b28gZ3JleSwgc3BlY2lmeSAtYWxwaGFyZW1vdmUKLSAgIHRvIGJyaWdodGVuIHRoZW0gYnkgaGF2aW5nIHgxMXZuYyBkaXZpZGUgb3V0IHRoZSBhbHBoYSB2YWx1ZS4KLQotICAgT25lIHVzZXIgcGxheWVkIHdpdGggdGhlc2UgcGFyYW1ldGVycyBhbmQgcmVwb3J0ZWQgYmFjazoKLSBPZiB0aGUgY3Vyc29yIHRoZW1lcyBwcmVzZW50IG9uIG15IHN5c3RlbToKLQotICAgZ2VudG9vIGFuZCBnZW50b28tYmx1ZTogICBhbHBoYWN1dDoxOTIgLSBub2FscGhhcmVtb3ZlCi0KLSAgIGdlbnRvby1zaWx2ZXI6ICAgICAgICAgICAgYWxwaGFjdXQ6MTI3IGFuZCBhbHBoYXJlbW92ZQotCi0gICB3aGl0ZWdsYXNzIGFuZCByZWRnbGFzcyAocHJlc3VtYWJseSBhbHNvIGhhbmRoZWxkcywgd2hpY2ggaXMgYmFzZWQKLSAgIGhlYXZpbHkgb24gcmVkZ2xhc3MpIGxvb2sgZmluZSB3aXRoIHRoZSBhcHBhcmVudCBkZWZhdWx0IG9mIGFscGhhY3V0OjI1NS4KLQotCi0gICBRLTgzOiBJbiBYRklYRVMgbW9kZSwgYXJlIHRoZXJlIGFueSBoYWNrcyB0byBoYW5kbGUgY3Vyc29yCi0gICB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIikgZXhhY3RseT8KLQotICAgQXMgb2YgSmFuLzIwMDUgbGlidm5jc2VydmVyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFsbG93IGFuIGFscGhhCi0gICBjaGFubmVsIChpLmUuIFJHQkEgZGF0YSkgZm9yIFJpY2ggQ3Vyc29ycy4gU28geDExdm5jIGNhbiBub3cgc2VuZCB0aGUKLSAgIGFscGhhIGNoYW5uZWwgZGF0YSB0byBsaWJ2bmNzZXJ2ZXIuIEhvd2V2ZXIsIHRoaXMgZGF0YSB3aWxsIG9ubHkgYmUKLSAgIHVzZWQgZm9yIFZOQyBjbGllbnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIEN1cnNvclNoYXBlVXBkYXRlcyBWTkMKLSAgIGV4dGVuc2lvbiAob3IgaGF2ZSBkaXNhYmxlZCBpdC4pIEl0IGNhbiBiZSBkaXNhYmxlZCBmb3IgYWxsIGNsaWVudHMKLSAgIHdpdGggdGhlIC1ub2N1cnNvcnNoYXBlIHgxMXZuYyBvcHRpb24uIEluIHRoaXMgY2FzZSB0aGUgY3Vyc29yIGlzCi0gICBkcmF3biwgY29ycmVjdGx5IGJsZW5kZWQgd2l0aCB0aGUgYmFja2dyb3VuZCwgaW50byB0aGUgVk5DIGZyYW1lYnVmZmVyCi0gICBiZWZvcmUgYmVpbmcgc2VudCBvdXQgdG8gdGhlIGNsaWVudC4gU28gdGhlIGFscGhhIGJsZW5kaW5nIGlzIGRvbmUgb24KLSAgIHRoZSB4MTF2bmMgc2lkZS4gVXNlIHRoZSAtbm9hbHBoYWJsZW5kIG9wdGlvbiB0byBkaXNhYmxlIHRoaXMgYmVoYXZpb3IKLSAgIChhbHdheXMgYXBwcm94aW1hdGUgdHJhbnNwYXJlbnQgY3Vyc29ycyB3aXRoIG9wYXF1ZSBSR0IgdmFsdWVzLikKLQotICAgVGhlIEN1cnNvclNoYXBlVXBkYXRlcyBWTkMgZXh0ZW5zaW9uIGNvbXBsaWNhdGVzIG1hdHRlcnMgYmVjYXVzZSB0aGUKLSAgIGN1cnNvciBzaGFwZSBpcyBzZW50IHRvIHRoZSBWTkMgdmlld2VycyBzdXBwb3J0aW5nIGl0LCBhbmQgdGhlIHZpZXdlcnMKLSAgIGRyYXcgdGhlIGN1cnNvciBsb2NhbGx5LiBUaGlzIGltcHJvdmVzIHJlc3BvbnNlIG92ZXIgc2xvdyBsaW5rcy4gQWxwaGEKLSAgIGNoYW5uZWwgZGF0YSBmb3IgdGhlc2UgbG9jYWxseSBkcmF3biBjdXJzb3JzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCi0gICBWTkMgcHJvdG9jb2wuCi0KLSAgIEhvd2V2ZXIsIGluIHRoZSBsaWJ2bmNzZXJ2ZXIgQ1ZTIHRoZXJlIGlzIGEgcGF0Y2ggdG8gdGhlIFRpZ2h0Vk5DCi0gICB2aWV3ZXIgdG8gbWFrZSB0aGlzIHdvcmsgZm9yIEN1cnNvclNoYXBlVXBkYXRlcyB1bmRlciBzb21lCi0gICBjaXJjdW1zdGFuY2VzLiBUaGlzIGhhY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk5DIHByb3RvY29sLiBJdCByZXF1aXJlcwotICAgdGhlIHNjcmVlbnMgb24gYm90aCBzaWRlcyB0byBiZSBkZXB0aCAyNCBhdCAzMmJwcCAoaXQgdXNlcyB0aGUgZXh0cmEgOAotICAgYml0cyB0byBzZWNyZXRseSBoaWRlIHRoZSBjdXJzb3IgYWxwaGEgY2hhbm5lbCBkYXRhLikgTm90IG9ubHkgZG9lcyBpdAotICAgcmVxdWlyZSBkZXB0aCAyNCBhdCAzMmJwcCwgYnV0IGl0IGFsc28gY3VycmVudGx5IHJlcXVpcmVzIHRoZSBjbGllbnQKLSAgIGFuZCBzZXJ2ZXIgdG8gYmUgb2YgdGhlIHNhbWUgZW5kaWFubmVzcyAob3RoZXJ3aXNlIHRoZSBoaWRkZW4gYWxwaGEKLSAgIGRhdGEgZ2V0cyByZXNldCB0byB6ZXJvIGJ5IGEgbGlidm5jc2VydmVyIHRyYW5zbGF0aW9uIGZ1bmN0aW9uOyB3ZSBjYW4KLSAgIGZpeCB0aGlzIGF0IHNvbWUgcG9pbnQgaWYgdGhlcmUgaXMgaW50ZXJlc3QuKSBUaGUgcGF0Y2ggaXMgZm9yIHRoZQotICAgVGlnaHRWTkMgMS4zZGV2NSBVbml4IHZuY3ZpZXdlciBhbmQgaXQgZW5hYmxlcyB0aGUgVGlnaHRWTkMgdmlld2VyIHRvCi0gICBkbyB0aGUgY3Vyc29yIGFscGhhIGJsZW5kaW5nIGxvY2FsbHkuIFRoZSBwYXRjaCBjb2RlIHNob3VsZCBnaXZlIGFuCi0gICBleGFtcGxlIG9uIGhvdyB0byBjaGFuZ2UgdGhlIFdpbmRvd3MgVGlnaHRWTkMgdmlld2VyIHRvIGFjaGlldmUgdGhlCi0gICBzYW1lIHRoaW5nIChzZW5kIG1lIHRoZSBwYXRjaCBpZiB5b3UgZ2V0IHRoYXQgd29ya2luZy4pCi0KLSAgIFRoaXMgcGF0Y2ggaXMgYXBwbGllZCB0byB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZQotICAgd2UgcHJvdmlkZS4KLQotICAgW01vdXNlIFBvaW50ZXJdCi0KLSAgIFEtODQ6IFdoeSBkb2VzIHRoZSBtb3VzZSBhcnJvdyBqdXN0IHN0YXkgaW4gb25lIGNvcm5lciBpbiBteQotICAgdm5jdmlld2VyLCB3aGVyZWFzIG15IGN1cnNvciAodGhhdCBkb2VzIG1vdmUpIGlzIGp1c3QgYSBkb3Q/Ci0KLSAgIFRoaXMgZGVmYXVsdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgYSB0aWdodHZuYyBleHRlbnNpb24KLSAgIChDdXJzb3JTaGFwZVVwZGF0ZXMpIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgYSBjdXJzb3IgaW1hZ2Ugc2hhcGUgZm9yCi0gICB0aGUgbG9jYWwgVk5DIHZpZXdlci4gWW91IG1heSBkaXNhYmxlIGl0IHdpdGggdGhlIC1ub2N1cnNvciBvcHRpb24gdG8KLSAgIHgxMXZuYyBpZiB5b3VyIHZpZXdlciBkb2VzIG5vdCBoYXZlIHRoaXMgZXh0ZW5zaW9uLgotCi0gICBOb3RlOiBhcyBvZiBBdWcvMjAwNCB0aGlzIHNob3VsZCBiZSBmaXhlZDogdGhlIGRlZmF1bHQgZm9yCi0gICBub24tdGlnaHR2bmMgdmlld2VycyAob3Igb25lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IEN1cnNvclNoYXBlVXBkYXRlcykKLSAgIHdpbGwgYmUgdG8gZHJhdyB0aGUgbW92aW5nIGN1cnNvciBpbnRvIHRoZSB4MTF2bmMgZnJhbWVidWZmZXIuIFRoaXMKLSAgIGNhbiBhbHNvIGJlIGRpc2FibGVkIHZpYSAtbm9jdXJzb3IuCi0KLQotICAgUS04NTogQ2FuIEkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIFRpZ2h0Vk5DIGV4dGVuc2lvbiB0byB0aGUgVk5DCi0gICBwcm90b2NvbCB3aGVyZSBDdXJzb3IgUG9zaXRpb25zIFVwZGF0ZXMgYXJlIHNlbnQgYmFjayB0byBhbGwgY29ubmVjdGVkCi0gICBjbGllbnRzIChpLmUuIHBhc3NpdmUgdmlld2VycyBjYW4gc2VlIHRoZSBtb3VzZSBjdXJzb3IgYmVpbmcgbW92ZWQKLSAgIGFyb3VuZCBieSBhbm90aGVyIHZpZXdlcik/Ci0KLSAgIFVzZSB0aGUgLWN1cnNvcnBvcyBvcHRpb24gd2hlbiBzdGFydGluZyB4MTF2bmMuIEEgVk5DIHZpZXdlciBtdXN0Ci0gICBzdXBwb3J0IHRoZSBDdXJzb3IgUG9zaXRpb25zIFVwZGF0ZXMgZm9yIHRoZSB1c2VyIHRvIHNlZSB0aGUgbW91c2UKLSAgIG1vdGlvbnMgKHRoZSBUaWdodFZOQyB2aWV3ZXJzIHN1cHBvcnQgdGhpcy4pIEFzIG9mIEF1Zy8yMDA0IC1jdXJzb3Jwb3MKLSAgIGlzIHRoZSBkZWZhdWx0LiBTZWUgYWxzbyAtbm9jdXJzb3Jwb3MgYW5kIC1ub2N1cnNvcnNoYXBlLgotCi0KLSAgIFEtODY6IElzIGl0IHBvc3NpYmxlIHRvIHN3YXAgdGhlIG1vdXNlIGJ1dHRvbnMgKGUuZy4gbGVmdC1oYW5kZWQKLSAgIG9wZXJhdGlvbiksIG9yIGFyYml0cmFyaWx5IHJlbWFwIHRoZW0/IEhvdyBhYm91dCBtYXBwaW5nIGJ1dHRvbiBjbGlja3MKLSAgIHRvIGtleXN0cm9rZXMsIGUuZy4gdG8gcGFydGlhbGx5IGVtdWxhdGUgTW91c2Ugd2hlZWwgc2Nyb2xsaW5nPwotCi0gICBZb3UgY2FuIHJlbWFwIHRoZSBtb3VzZSBidXR0b25zIHZpYSBzb21ldGhpbmcgbGlrZTogLWJ1dHRvbm1hcCAxMy0zMQotICAgKG9yIHBlcmhhcHMgMTItMjEuKSBBbHNvLCBub3RlIHRoYXQgeG1vZG1hcCgxKSBsZXRzIHlvdSBkaXJlY3RseQotICAgYWRqdXN0IHRoZSBYIHNlcnZlcidzIGJ1dHRvbiBtYXBwaW5ncywgYnV0IGluIHNvbWUgY2lyY3Vtc3RhbmNlcyBpdAotICAgbWlnaHQgYmUgbW9yZSBkZXNpcmFibGUgdG8gaGF2ZSB4MTF2bmMgZG8gaXQuCi0KLSAgIE9uZSB1c2VyIGhhZCBhbiBYIHNlcnZlciB3aXRoIG9ubHkgb25lIG1vdXNlIGJ1dHRvbighKSBhbmQgd2FzIGFibGUgdG8KLSAgIG1hcCBhbGwgb2YgdGhlIFZOQyBjbGllbnQgbW91c2UgYnV0dG9ucyB0byBpdCB2aWE6IC1idXR0b25tYXAgMTIzLTExMS4KLQotICAgTm90ZSB0aGF0IHRoZSAtZGVidWdfcG9pbnRlciBvcHRpb24gcHJpbnRzIG91dCBtdWNoIGluZm8gZm9yIGV2ZXJ5Ci0gICBtb3VzZS9wb2ludGVyIGV2ZW50IGFuZCBpcyBoYW5keSBpbiBzb2x2aW5nIHByb2JsZW1zLgotCi0gICBUbyBtYXAgbW91c2UgYnV0dG9uIGNsaWNrcyB0byBrZXlzdHJva2VzIHlvdSBjYW4gdXNlIHRoZSBhbHRlcm5hdGUKLSAgIGZvcm1hdCB3aGVyZSB0aGUga2V5c3Ryb2tlcyBhcmUgZW5jbG9zZWQgYmV0d2VlbiBjb2xvbnMgbGlrZSB0aGlzCi0gICA6PEtleVN5bT46IGluIHBsYWNlIG9mIHRoZSBtb3VzZSBidXR0b24gZGlnaXQuIEZvciBhIHNlcXVlbmNlIG9mCi0gICBrZXlzeW1zIHNlcGFyYXRlIHRoZW0gd2l0aCAiKyIgc2lnbnMuIExvb2sgaW4gdGhlIGluY2x1ZGUgZmlsZQotICAgPFgxMS9rZXlzeW1kZWYuaD4sIG9yIHVzZSB4ZXYoMSksIG9yIC1kZWJ1Z19rZXlib2FyZCB0byBmaW5kIHRoZQotICAga2V5c3ltIG5hbWVzLiBCdXR0b24gY2xpY2tzIGNhbiBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZSBzZXF1ZW5jZSB2aWEKLSAgIHRoZSBmYWtlIGtleXN5bXMgQnV0dG9uMSwgZXRjLgotCi0gICBBcyBhbiBleGFtcGxlLCBzdXBwb3NlIHRoZSBWTkMgdmlld2VyIG1hY2hpbmUgaGFzIGEgbW91c2Ugd2hlZWwgKHRoZXNlCi0gICBnZW5lcmF0ZSBidXR0b24gNCBhbmQgNSBldmVudHMpLCBidXQgdGhlIG1hY2hpbmUgdGhhdCB4MTF2bmMgaXMgcnVuIG9uCi0gICBvbmx5IGhhcyB0aGUgMyByZWd1bGFyIGJ1dHRvbnMuIEluIG5vcm1hbCBvcGVyYXRpb24geDExdm5jIHdpbGwKLSAgIGRpc2NhcmQgdGhlIGJ1dHRvbiA0IGFuZCA1IGV2ZW50cy4gSG93ZXZlciwgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcKLSAgIGJ1dHRvbiBtYXBzIGNvdWxkIHBvc3NpYmx5IGJlIG9mIHVzZSBlbXVsYXRpbmcgdGhlIG1vdXNlIHdoZWVsIGV2ZW50cwotICAgaW4gdGhpcyBjYXNlOgotICAtYnV0dG9ubWFwIDEyMzQ1LTEyMzpQcmlvcjo6TmV4dDoKLSAgLWJ1dHRvbm1hcCAxMjM0NS0xMjM6VXArVXArVXA6OkRvd24rRG93bitEb3duOgotCi0gICBFeGFjdGx5IHdoYXQga2V5c3Ryb2tlICJzY3JvbGxpbmciIGV2ZW50cyB0aGV5IHNob3VsZCBiZSBib3VuZCB0bwotICAgZGVwZW5kcyBvbiBvbmUncyB0YXN0ZS4gSWYgdGhpcyBtZXRob2QgaXMgdG9vIGFwcHJveGltYXRlLCBvbmUgY291bGQKLSAgIGNvbnNpZGVyIG5vdCB1c2luZyAtYnV0dG9ubWFwIGJ1dCByYXRoZXIgY29uZmlndXJpbmcgdGhlIFggc2VydmVyIHRvCi0gICB0aGluayBpdCBoYXMgYSBtb3VzZSB3aXRoIDUgYnV0dG9ucyBldmVuIHRob3VnaCB0aGUgcGh5c2ljYWwgbW91c2UKLSAgIGRvZXMgbm90LiAoZS5nLiAnT3B0aW9uICJaQXhpc01hcHBpbmciICI0IDUiJy4pCi0KLSAgIE5vdGUgdGhhdCB3aGVuIGEga2V5c3ltLW1hcHBlZCBtb3VzZSBidXR0b24gaXMgY2xpY2tlZCBkb3duIHRoaXMKLSAgIGltbWVkaWF0ZWx5IGdlbmVyYXRlcyB0aGUga2V5LXByZXNzIGFuZCBrZXktcmVsZWFzZSBldmVudHMgKGZvciBlYWNoCi0gICBrZXlzeW0gaW4gdHVybiBpZiB0aGUgbWFwcGluZyBoYXMgYSBzZXF1ZW5jZSBvZiBrZXlzeW1zLikgV2hlbiB0aGUKLSAgIG1vdXNlIGJ1dHRvbiBnb2VzIGJhY2sgdXAgbm90aGluZyBpcyBnZW5lcmF0ZWQuCi0KLSAgIElmIHlvdSBpbmNsdWRlIG1vZGlmaWVyIGtleXMgbGlrZSBTaGlmdF9MIGluc3RlYWQgb2Yga2V5LXByZXNzCi0gICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBrZXktcmVsZWFzZSB0aGUgc3RhdGUgb2YgdGhlIG1vZGlmaWVyIGtleSBpcwotICAgdG9nZ2xlZCAoaG93ZXZlciB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgbW9kaWZpZXIga2V5IGlzIGlnbm9yZWQuKSBTbwotICAgdG8gbWFwIHRoZSByaWdodCBidXR0b24gdG8gdHlwZSBteSBuYW1lICdLYXJsIFJ1bmdlJyBJIGNvdWxkIHVzZSB0aGlzOgotICAtYnV0dG9ubWFwIDMtOlNoaWZ0X0wraytTaGlmdF9MK2ErcitsK3NwYWNlK1NoaWZ0X0wrcitTaGlmdF9MK3UrbitnK2U6Ci0KLSAgICh5ZXMsIHRoaXMgaXMgZ2V0dGluZyBhIGxpdHRsZSBzaWxseS4pCi0KLSAgIEJUVywgQ29taW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgbWFjaGluZSB5b3UgYXJlIHNpdHRpbmcgYXQKLSAgIGRvZXMgbm90IGhhdmUgYSBtb3VzZSB3aGVlbCwgYnV0IHRoZSByZW1vdGUgbWFjaGluZSBkb2VzIChvciBhdCBsZWFzdAotICAgaGFzIDUgYnV0dG9ucyBjb25maWd1cmVkKSwgdGhpcyBrZXkgcmVtYXBwaW5nIGNhbiBiZSB1c2VmdWw6Ci0gIC1yZW1hcCBTdXBlcl9SLUJ1dHRvbjQsTWVudS1CdXR0b241Ci0KLSAgIHlvdSBqdXN0IHRhcCB0aG9zZSB0d28ga2V5cyB0byBnZXQgdGhlIG1vdXNlIHdoZWVsIHNjcm9sbHMgKHRoaXMgaXMKLSAgIG1vcmUgdXNlZnVsIHRoYW4gdGhlIFVwIGFuZCBEb3duIGFycm93IGtleXMgYmVjYXVzZSBhIG1vdXNlIHdoZWVsCi0gICAiY2xpY2siIHVzdWFsbHkgZ2l2ZXMgYSBtdWx0aS1saW5lIHNjcm9sbC4pCi0gICBbS2V5Ym9hcmQgSXNzdWVzXQotCi0gICBRLTg3OiBIb3cgY2FuIEkgZ2V0IG15IEFsdEdyIGFuZCBTaGlmdCBtb2RpZmllcnMgdG8gd29yayBiZXR3ZWVuCi0gICBrZXlib2FyZHMgZm9yIGRpZmZlcmVudCBsYW5ndWFnZXM/Ci0KLSAgIFRoZSBvcHRpb24gLW1vZHR3ZWFrIHNob3VsZCBoZWxwIGhlcmUuIEl0IGlzIGEgbW9kZSB0aGF0IG1vbml0b3JzIHRoZQotICAgc3RhdGUgb2YgdGhlIFNoaWZ0IGFuZCBBbHRHciBNb2RpZmllcnMgYW5kIHRyaWVzIHRvIGRlZHVjZSB0aGUgY29ycmVjdAotICAga2V5Y29kZSB0byBzZW5kLCBwb3NzaWJseSBieSBzZW5kaW5nIGZha2UgbW9kaWZpZXIga2V5IHByZXNzZXMgYW5kCi0gICByZWxlYXNlcyBpbiBhZGRpdGlvbiB0byB0aGUgYWN0dWFsIGtleXN0cm9rZS4KLQotICAgVXBkYXRlOiAgQXMgb2YgSnVsLzIwMDQgLW1vZHR3ZWFrIGlzIG5vdyB0aGUgZGVmYXVsdCAodXNlIC1ub21vZHR3ZWFrCi0gICB0byBnZXQgdGhlIG9sZCBiZWhhdmlvci4pIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSBpdCB3YXMgbm90aWNlZCBvbgotICAgbmV3ZXIgWEZyZWU4NiBzZXR1cHMgZXZlbiBvbiBibGFuZCAidXMiIGtleWJvYXJkcyBsaWtlICJwYzEwNCB1cyIKLSAgIFhGcmVlODYgaW5jbHVkZWQgYSAiZ2hvc3QiIGtleSB3aXRoIGJvdGggIjwiIGFuZCAiPiIgaXQuIFRoaXMga2V5IGRvZXMKLSAgIG5vdCBleGlzdCBvbiB0aGUga2V5Ym9hcmQgKHNlZSB0aGlzIEZBUSBmb3IgbW9yZSBpbmZvLikgV2l0aG91dAotICAgLW1vZHR3ZWFrIHRoZXJlIHdhcyB0aGVuIGFuIGFtYmlndWl0eSBpbiB0aGUgcmV2ZXJzZSBtYXAga2V5c3ltID0+Ci0gICBrZXljb2RlLCBtYWtpbmcgaXQgc28gdGhlICI8IiBzeW1ib2wgY291bGQgbm90IGJlIHR5cGVkLgotCi0gICBBbHNvIHNlZSB0aGUgRkFRIGFib3V0IHRoZSAteGtiIG9wdGlvbiBmb3IgYSBtb3JlIHBvd2VyZnVsIG1ldGhvZCBvZgotICAgbW9kaWZpZXIgdHdlYWtpbmcgZm9yIHVzZSBvbiBYIHNlcnZlcnMgd2l0aCB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbi4KLQotICAgV2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBrZXlib2FyZCBtYXBwaW5nIHByb2JsZW1zLCBub3RlIHRoYXQgdGhlCi0gICAtZGVidWdfa2V5Ym9hcmQgb3B0aW9uIHByaW50cyBvdXQgbXVjaCBpbmZvIGZvciBldmVyeSBrZXlzdHJva2UgYW5kIHNvCi0gICBjYW4gYmUgdXNlZnVsIGRlYnVnZ2luZyB0aGluZ3MuCi0KLSAgIE5vdGUgdGhhdCBvbmUgdXNlciBoYWQgYSBzdHJhbmdlIHNldHVwIGFuZCBub25lIG9mIHRoZSBhYm92ZSBoZWxwZWQuCi0gICBIaXMgc29sdXRpb24gd2FzIHRvIGRpc2FibGUgYWxsIG9mIHRoZSBhYm92ZSBhbmQgdXNlIC1ub21vZHR3ZWFrLiBUaGlzCi0gICBpcyB0aGUgc2ltcGxlc3QgZm9ybSBvZiBrZXlzdHJva2UgaW5zZXJ0aW9uIGFuZCBpdCBhY3R1YWxseSBzb2x2ZWQgdGhlCi0gICBwcm9ibGVtLiBUcnkgaXQgaWYgdGhlIG90aGVyIG9wdGlvbnMgZG9uJ3QgaGVscC4KLQotCi0gICBRLTg4OiBXaGVuIEkgdHJ5IHRvIHR5cGUgYSAiPCIgKGkuZS4gbGVzcyB0aGFuKSBpbnN0ZWFkIEkgZ2V0ICI+IgotICAgKGkuZS4gZ3JlYXRlciB0aGFuKSEgU3RyYW5nZWx5LCB0eXBpbmcgIj4iIHdvcmtzIE9LISEKLQotICAgRG9lcyB5b3VyIGtleWJvYXJkIGhhdmUgYSBzaW5nbGUga2V5IHdpdGggYm90aCAiPCIgYW5kICI+IiBvbiBpdD8gRXZlbgotICAgaWYgaXQgZG9lc24ndCwgeW91ciBYIHNlcnZlciBtYXkgdGhpbmsgeW91ciBrZXlib2FyZCBoYXMgc3VjaCBhIGtleQotICAgKGUuZy4gcGMxMDUgaW4gdGhlIFhGODZDb25maWcgZmlsZSB3aGVuIGl0IHNob3VsZCBiZSBzb21ldGhpbmcgZWxzZSwKLSAgIHNheSBwYzEwNC4pCi0KLSAgIFNob3J0IEN1dDogVHJ5IHRoZSAteGtiIG9yIC1zbG9wcHlfa2V5cyBvcHRpb25zIGFuZCBzZWUgaWYgdGhhdCBoZWxwcwotICAgdGhlIHNpdHVhdGlvbi4gVGhlIGRpc2N1c3Npb24gYmVsb3cgaXMgYSBiaXQgb3V0ZGF0ZWQgKGUuZy4gLW1vZHR3ZWFrCi0gICBpcyBub3cgdGhlIGRlZmF1bHQpIGJ1dCBpdCBpcyB1c2VmdWwgcmVmZXJlbmNlIGZvciB2YXJpb3VzIHRyaWNrcyBhbmQKLSAgIHNvIGlzIGtlcHQuCi0KLQotICAgVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IG9uIHRoZSBYc2VydmVyIHdoZXJlIHgxMXZuYyBpcyBydW4gdGhlcmUgYXJlCi0gICB0d28ga2V5Y29kZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSAiPCIga2V5c3ltLiBSdW4gc29tZXRoaW5nIGxpa2UKLSAgIHRoaXMgdG8gc2VlOgotCi0gIHhtb2RtYXAgLXBrIHwgZWdyZXAgLWkgJ0tleUNvZGV8bGVzc3xncmVhdGVyJwotICBUaGVyZSBhcmUgNCBLZXlTeW1zIHBlciBLZXlDb2RlOyBLZXlDb2RlcyByYW5nZSBmcm9tIDggdG8gMjU1LgotICAgICAgS2V5Q29kZSAgICAgS2V5c3ltIChLZXlzeW0pIC4uLgotICAgICAgIDU5ICAgICAgICAgMHgwMDJjIChjb21tYSkgIDB4MDAzYyAobGVzcykKLSAgICAgICA2MCAgICAgICAgIDB4MDAyZSAocGVyaW9kKSAweDAwM2UgKGdyZWF0ZXIpCi0gICAgICAgOTQgICAgICAgICAweDAwM2MgKGxlc3MpICAgMHgwMDNlIChncmVhdGVyKQotCi0gICBUaGF0IGtleWNvZGUgOTQgaXMgdGhlIHNwZWNpYWwga2V5IHdpdGggYm90aCAiPCIgYW5kICI+Ii4gV2hlbiB4MTF2bmMKLSAgIHJlY2VpdmVzIHRoZSAiPCIga2V5c3ltIG92ZXIgdGhlIHdpcmUgZnJvbSB0aGUgcmVtb3RlIFZOQyBjbGllbnQsIGl0Ci0gICB1bmZvcnR1bmF0ZWx5IG1hcHMgaXQgdG8ga2V5Y29kZSA5NCBpbnN0ZWFkIG9mIDU5LCBhbmQgc2VuZHMgOTQgdG8gdGhlCi0gICBYIHNlcnZlci4gU2luY2UgU2hpZnQgaXMgZG93biAoaS5lLiB5b3UgYXJlIFNoaWZ0aW5nIHRoZSBjb21tYSBrZXkpLAotICAgdGhlIFggc2VydmVyIGludGVycHJldHMgdGhpcyBhcyBTaGlmdGVkLTk0LCB3aGljaCBpcyAiPiIuCi0KLSAgIEEgd29ya2Fyb3VuZCBpbiB0aGUgWCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpcyB0byAiZGVhZGVuIiB0aGF0IHNwZWNpYWwKLSAgIGtleToKLQotICB4bW9kbWFwIC1lICJrZXljb2RlIDk0ID0gIgotCi0gICBIb3dldmVyLCBvbmUgdXNlciBzYWlkIGhlIGhhZCB0byBkbyB0aGlzOgotCi0gIHhtb2RtYXAgLWUgImtleWNvZGUgOTQgPSAweDAwMmMgMHgwMDNjIgotCi0gICAoSWYgdGhlIG51bWVyaWNhbCB2YWx1ZXMgYXJlIGRpZmZlcmVudCBmb3IgeW91ciBzZXR1cCwgc3Vic3RpdHV0ZSB0aGUKLSAgIG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIHlvdXIgZGlzcGxheS4gVGhlIGFib3ZlIHhtb2RtYXAgc2NoZW1lIGNhbgotICAgb2Z0ZW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCBvdGhlciBhbWJpZ3VvdXMga2V5c3ltIHRvIGtleWNvZGUKLSAgIG1hcHBpbmdzLikKLQotICAgQWx0ZXJuYXRpdmVseSwgaGVyZSBhcmUgc29tZSB4MTF2bmMgb3B0aW9ucyB0byB0cnkgdG8gd29yayBhcm91bmQgdGhlCi0gICBwcm9ibGVtOgotICAgLW1vZHR3ZWFrCi0KLSAgIGFuZAotICAgLXJlbWFwIGxlc3MtY29tbWEKLQotICAgVGhlc2UgYXJlIGNvbnZlbmllbnQgaW4gdGhhdCB0aGV5IGRvIG5vdCBtb2RpZnkgdGhlIGFjdHVhbCBYIHNlcnZlcgotICAgc2V0dGluZ3MuIFRoZSBmb3JtZXIgKC1tb2R0d2VhaykgaXMgYSBtb2RlIHRoYXQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mCi0gICB0aGUgU2hpZnQgYW5kIEFsdEdyIG1vZGlmaWVycyBhbmQgdHJpZXMgdG8gZGVkdWNlIHRoZSBjb3JyZWN0IGtleWNvZGUKLSAgIHNlcXVlbmNlIHRvIHNlbmQuIFNpbmNlIEp1bC8yMDA0IC1tb2R0d2VhayBpcyBub3cgdGhlIGRlZmF1bHQuIFRoZQotICAgbGF0dGVyICgtcmVtYXAgbGVzcy1jb21tYSkgaXMgYW4gaW1tZWRpYXRlIHJlbWFwcGluZyBvZiB0aGUga2V5c3ltCi0gICBsZXNzIHRvIHRoZSBrZXlzeW0gY29tbWEgd2hlbiBpdCBjb21lcyBpbiBmcm9tIGEgY2xpZW50IChzbyB3aGVuIFNoaWZ0Ci0gICBpcyBkb3duIHRoZSBjb21tYSBwcmVzcyB3aWxsIHlpZWxkICI8Ii4pCi0KLSAgIFNlZSBhbHNvIHRoZSBGQVEgYWJvdXQgdGhlIC14a2Igb3B0aW9uIGFzIGEgcG9zc2libGUgd29ya2Fyb3VuZCB1c2luZwotICAgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgLWRlYnVnX2tleWJvYXJkIG9wdGlvbiBwcmludHMgb3V0IG11Y2ggaW5mbyBmb3IgZXZlcnkKLSAgIGtleXN0cm9rZSB0byBhaWQgZGVidWdnaW5nIGtleWJvYXJkIHByb2JsZW1zLgotCi0KLSAgIFEtODk6IEV4dHJhIENoYXJhY3RlciBJbnNlcnRlZCwgRS5nLjogV2hlbiBJIHRyeSB0byB0eXBlIGEgIjwiIChpLmUuCi0gICBsZXNzIHRoYW4pIGluc3RlYWQgSSBnZXQgIjwsIiAoaS5lLiBhbiBleHRyYSBjb21tYS4pCi0KLSAgIFRoaXMgaXMgbGlrZWx5IGJlY2F1c2UgeW91IHByZXNzICJTaGlmdCIgdGhlbiAiPCIgYnV0IHRoZW4gcmVsZWFzZWQKLSAgIHRoZSBTaGlmdCBrZXkgYmVmb3JlIHJlbGVhc2luZyB0aGUgIjwiLiBCZWNhdXNlIG9mIGEga2V5bWFwcGluZwotICAgYW1iaWd1aXR5IHRoZSBsYXN0IGV2ZW50ICI8IHVwIiBpcyBpbnRlcnByZXRlZCBhcyAiLCIgYmVjYXVzZSB0aGF0IGtleQotICAgdW5zaGlmdGVkIGlzIHRoZSBjb21tYS4KLQotICAgVGhpcyBleHRyYSBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdpbGwgaGFwcGVuIGZvciBvdGhlciBjb21iaW5hdGlvbnMgb2YKLSAgIGNoYXJhY3RlcnM6IGluIGdlbmVyYWwgaXQgY2FuIGhhcHBlbiB3aGVuZXZlciB0aGUgU2hpZnQga2V5IGlzCi0gICByZWxlYXNlZCBlYXJseS4KLQotICAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiAteGtiIG1vZGUsIGJlY2F1c2UgaXQgd29ya3MgaGFyZCB0byByZXNvbHZlCi0gICB0aGUgYW1iaWd1aXRpZXMuIElmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgLXhrYiwgdHJ5IHRoZSBvcHRpb24KLSAgIC1zbG9wcHlfa2V5cyB0byBhdHRlbXB0IGEgc2ltaWxhciB0eXBlIG9mIGFsZ29yaXRobS4KLQotICAgT25lIHVzZXIgaGFkIHRoaXMgcHJvYmxlbSBmb3IgSXRhbGlhbiBhbmQgR2VybWFuIGtleWJvYXJkcyB3aXRoIHRoZQotICAga2V5IGNvbnRhaW5pbmcgIjoiIGFuZCAiLiIgV2hlbiBoZSB0eXBlZCAiOiIgaGUgd291bGQgZ2V0IGFuIGV4dHJhICIuIgotICAgaW5zZXJ0ZWQgYWZ0ZXIgdGhlICI6Ii4gVGhlIHNvbHV0aW9uIHdhcyAtc2xvcHB5X2tleXMuCi0KLQotICAgUS05MDogSSdtIHVzaW5nIGFuICJpbnRlcm5hdGlvbmFsIiBrZXlib2FyZCAoZS5nLiBHZXJtYW4gImRlIiwgb3IKLSAgIERhbmlzaCAiZGsiKSBhbmQgdGhlIC1tb2R0d2VhayBtb2RlIHdvcmtzIHdlbGwgaWYgdGhlIFZOQyB2aWV3ZXIgaXMKLSAgIHJ1biBvbiBhIFVuaXgvTGludXggbWFjaGluZSB3aXRoIGEgc2ltaWxhciBrZXlib2FyZC4gICBCdXQgaWYgSSBydW4KLSAgIHRoZSBWTkMgdmlld2VyIG9uIFVuaXgvTGludXggd2l0aCBhIGRpZmZlcmVudCBrZXlib2FyZCAoZS5nLiAidXMiKSBvcgotICAgV2luZG93cyB3aXRoIGFueSBrZXlib2FyZCwgSSBjYW4ndCB0eXBlIHNvbWUga2V5cyBsaWtlOiAgICJAIiwgIiQiLAotICAgIjwiLCAiPiIsIGV0Yy4gSG93IGNhbiBJIGZpeCB0aGlzPwotCi0gICBUaGUgcHJvYmxlbSB3aXRoIFdpbmRvd3MgaXMgaXQgZG9lcyBub3Qgc2VlbSB0byBoYW5kbGUgQWx0R3Igd2VsbC4gSXQKLSAgIHNlZW1zIHRvIGZha2UgaXQgdXAgYnkgc2VuZGluZyBDb250cm9sX0wrQWx0X1IgdG8gYXBwbGljYXRpb25zLiBUaGUKLSAgIFdpbmRvd3MgVk5DIHZpZXdlciBzZW5kcyB0aG9zZSB0d28gZG93biBrZXlzdHJva2VzIG91dCBvbiB0aGUgd2lyZSB0bwotICAgdGhlIFZOQyBzZXJ2ZXIsIGJ1dCB3aGVuIHRoZSB1c2VyIHR5cGVzIHRoZSBuZXh0IGtleSB0byBnZXQsIGUuZy4sICJAIgotICAgdGhlIFdpbmRvd3MgVk5DIHZpZXdlciBzZW5kcyBldmVudHMgYnJpbmdpbmcgdGhlIHVwIHRoZQotICAgQ29udHJvbF9MK0FsdF9SIGtleXMsIGFuZCB0aGVuIHNlbmRzIHRoZSAiQCIga2V5c3ltIGJ5IGl0c2VsZi4KLQotICAgVGhlIFVuaXgvTGludXggVk5DIHZpZXdlciBvbiBhICJ1cyIga2V5Ym9hcmQgZG9lcyBhIHNpbWlsYXIgdGhpbmcKLSAgIHNpbmNlICJAIiBpcyB0aGUgU2hpZnQgb2YgdGhlICIyIiBrZXkuIFRoZSBrZXlzeW1zIFNoaWZ0IGFuZCAiQCIgYXJlCi0gICBzZW50IHRvIHRoZSBWTkMgc2VydmVyLgotCi0gICBJbiBib3RoIGNhc2VzIG5vIEFsdEdyIGlzIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIsIGJ1dCB3ZSBrbm93IEFsdEdyIGlzCi0gICBuZWVkZWQgb24gdGhlIHBoeXNpY2FsIGludGVybmF0aW9uYWwga2V5Ym9hcmQgdG8gdHlwZSBhICJAIi4KLQotICAgVGhpcyBhbGwgd29ya2VkIGZpbmUgd2l0aCB4MTF2bmMgcnVubmluZyB3aXRoIHRoZSAtbW9kdHdlYWsgb3B0aW9uIChpdAotICAgZmlndXJlcyBvdXQgaG93IHRvIGFkanVzdCB0aGUgTW9kaWZpZXIga2V5cyAoU2hpZnQgb3IgQWx0R3IpIHRvIGdldAotICAgdGhlICJAIi4pIEhvd2V2ZXIgaXQgZmFpbHMgdW5kZXIgcmVjZW50IHZlcnNpb25zIG9mIFhGcmVlODYgKGFuZCB0aGUKLSAgIFgub3JnIGZvcmsuKSBUaGVzZSBydW4gdGhlIFhLRVlCT0FSRCBleHRlbnNpb24gYnkgZGVmYXVsdCBhbmQgbWFrZQotICAgaGVhdnkgdXNlIG9mIGl0IHRvIGhhbmRsZSBpbnRlcm5hdGlvbmFsIGtleWJvYXJkcy4KLQotICAgVG8gbWFrZSBhIGxvbmcgc3Rvcnkgc2hvcnQsIG9uIHRoZXNlIG5ld2VyIFhGcmVlODYgc2V0dXBzIHRoZQotICAgdHJhZGl0aW9uYWwgWCBrZXltYXAgbG9va3VwIHgxMXZuYyB1c2VzIGlzIG5vIGxvbmdlciBhY2N1cmF0ZS4geDExdm5jCi0gICBjYW4ndCBmaW5kIHRoZSBrZXlzeW0gIkAiIGFueXdoZXJlIGluIHRoZSBrZXltYXBwaW5nISAoZXZlbiB0aG91Z2ggaXQKLSAgIGlzIGluIHRoZSBYS0VZQk9BUkQgZXh0ZW5kZWQga2V5bWFwcGluZy4pCi0KLSAgIEhvdyB0byBTb2x2ZTogQXMgb2YgSnVsLzIwMDQgeDExdm5jIGhhcyB0d28gY2hhbmdlczoKLSAgICAgKiAtbW9kdHdlYWsgKHR3ZWFrIE1vZGlmaWVyIGtleXMpIGlzIG5vdyB0aGUgZGVmYXVsdCAodXNlCi0gICAgICAgLW5vbW9kdHdlYWsgdG8gZ28gYmFjayB0byB0aGUgb2xkIHdheSkKLSAgICAgKiB0aGVyZSBpcyBhIG5ldyBvcHRpb24gLXhrYiB0byB1c2UgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24gQVBJIHRvCi0gICAgICAgZG8gdGhlIE1vZGlmaWVyIGtleSB0d2Vha2luZy4KLQotICAgVGhlIC14a2Igb3B0aW9uIHNlZW1zIHRvIGZpeCBhbGwgb2YgdGhlIG1pc3Npbmcga2V5czogIkAiLCAiPCIsICI+IiwKLSAgIGV0Yy46IGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHRyeSBpdCBpZiB5b3UgaGF2ZSB0aGlzIHNvcnQgb2YKLSAgIHByb2JsZW0uIExldCB1cyBrbm93IGlmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIHByb2JsZW1zIChzZWUgdGhlIG5leHQKLSAgIHBhcmFncmFwaCBmb3Igc29tZSBrbm93biBwcm9ibGVtcy4pIElmIHlvdSBzcGVjaWZ5IHRoZSAtZGVidWdfa2V5Ym9hcmQKLSAgIChha2EgLWRrKSBvcHRpb24gdHdpY2UgeW91IHdpbGwgZ2V0IGEgaHVnZSBhbW91bnQgb2Yga2V5c3Ryb2tlCi0gICBkZWJ1Z2dpbmcgb3V0cHV0IChzZW5kIGl0IGFsb25nIHdpdGggYW55IHByb2JsZW1zIHlvdSByZXBvcnQuKQotCi0gICBVcGRhdGU6IGFzIG9mIEp1bi8yMDA1IHgxMXZuYyB3aWxsIHRyeSB0byBhdXRvbWF0aWNhbGx5IGVuYWJsZSAteGtiIGlmCi0gICBpdCBhcHBlYXJzIHRoYXQgd291bGQgYmUgYmVuZWZpY2lhbCAoZS5nLiBpZiBpdCBzZWVzIGFueSBvZiAiQCIsICI8IiwKLSAgICI+IiwgIlsiIGFuZCBzaW1pbGFyIGtleXMgYXJlIG1hcHBlZCBpbiBhIHdheSB0aGF0IG5lZWRzIHRoZSAteGtiIHRvCi0gICBhY2Nlc3MgdGhlbS4pIFRvIGRpc2FibGUgdGhpcyBhdXRvbWF0aWMgY2hlY2sgdXNlIC1ub3hrYi4KLQotICAgS25vd24gcHJvYmxlbXM6Ci0gICAgICogT25lIHVzZXIgaGFkIHRvIGRpc2FibGUgYSAiZ2hvc3QiIE1vZGVfc3dpdGNoIGtleSB0aGF0IHdhcyBjYXVzaW5nCi0gICAgICAgcHJvYmxlbXMgdW5kZXIgLXhrYi4gSGlzIHBoeXNpY2FsIEFsdEdyIGtleSB3YXMgYm91bmQgdG8KLSAgICAgICBJU09fTGV2ZWwzX1NoaWZ0ICh3aGljaCBzZWVtcyB0byBiZSB0aGUgWEtFWUJPQVJEIHdheSBvZiBkb2luZwotICAgICAgIHRoaW5ncyksIHdoaWxlIHRoZXJlIHdhcyBhIGdob3N0IGtleSBNb2RlX3N3aXRjaCAod2hpY2ggc2VlbXMgdG8KLSAgICAgICBiZSBvYnNvbGV0ZSkgaW4gdGhlIG1hcHBpbmcgYXMgd2VsbC4gQm90aCBvZiB0aGVzZSBrZXlzeW1zIHdlcmUKLSAgICAgICBib3VuZCB0byBNb2Q1IGFuZCB4MTF2bmMgd2FzIHVuZm9ydHVuYXRlbHkgY2hvb3NpbmcgTW9kZV9zd2l0Y2guCi0gICAgICAgRnJvbSB0aGUgeDExdm5jIC14a2IgLWRrIC1kayBvdXRwdXQgaXQgd2FzIG5vdGVkIHRoYXQgTW9kZV9zd2l0Y2gKLSAgICAgICB3YXMgYXR0YWNoZWQgdG8ga2V5Y29kZSA5MyAobm8gcGh5c2ljYWwga2V5IGdlbmVyYXRlcyB0aGlzCi0gICAgICAga2V5Y29kZSkgd2hpbGUgSVNPX0xldmVsM19TaGlmdCB3YXMgYXR0YWNoZWQgdG8ga2V5Y29kZSAxMTMuIFRoZQotICAgICAgIGtleWNvZGUgc2tpcHBpbmcgb3B0aW9uIHdhcyB1c2VkIHRvIGRpc2FibGUgdGhlIGdob3N0IGtleToKLSAgICAgICAtc2tpcF9rZXljb2RlcyA5MwotICAgICAqIEluIGltcGxlbWVudGluZyAteGtiIHdlIG5vdGljZWQgdGhhdCBzb21lIGNoYXJhY3RlcnMgd2VyZSBzdGlsbAotICAgICAgIG5vdCBnZXR0aW5nIHRocm91Z2gsIGUuZy4gIn4iIGFuZCAiXiIuIFRoaXMgaXMgbm90IHJlYWxseSBhbgotICAgICAgIFhLRVlCT0FSRCBwcm9ibGVtLiBXaGF0IHdhcyBoYXBwZW5pbmcgd2FzIHRoZSBWTkMgdmlld2VyIHdhcwotICAgICAgIHNlbmRpbmcgdGhlIGtleXN5bXMgYXNjaWl0aWxkZSBhbmQgYXNjaWljaXJjdW0gdG8geDExdm5jLCBidXQgb24KLSAgICAgICB0aGUgWCBzZXJ2ZXIgd2l0aCB0aGUgaW50ZXJuYXRpb25hbCBrZXlib2FyZCB0aG9zZSBrZXlzeW1zIHdlcmUKLSAgICAgICBub3QgbWFwcGVkIHRvIGFueSBrZXlzLiBTbyB4MTF2bmMgaGFkIHRvIHNraXAgdGhlbSAoTm90ZTogYXMgb2YKLSAgICAgICBNYXkvMjAwNSB0aGV5IGFyZSBhZGRlZCBieSBkZWZhdWx0IHNlZSAtYWRkX2tleXN5bXMgYmVsb3cuKQotICAgICAgIFRoZSB3YXkgdGhlc2UgY2hhcmFjdGVycyBhcmUgdHlwaWNhbGx5IGVudGVyZWQgb24gaW50ZXJuYXRpb25hbAotICAgICAgIGtleWJvYXJkcyBpcyBieSAiZGVhZCIgKGFrYSAibXV0ZSIpIGtleXMuIEUuZy4gdG8gZW50ZXIgIn4iIGF0IHRoZQotICAgICAgIHBoeXNpY2FsIGRpc3BsYXkgdGhlIGtleXN5bSBkZWFkX3RpbGRlIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkCi0gICAgICAgKHRoaXMgdXN1YWxseSBpbnZvbHZlcyBob2xkaW5nIEFsdEdyIGRvd24gd2hpbGUgYW5vdGhlciBrZXkgaXMKLSAgICAgICBwcmVzc2VkKSBhbmQgdGhlbiBzcGFjZSBpcyBwcmVzc2VkLiAodGhpcyBjYW4gYWxzbyBiZSB1c2VkIGdldAotICAgICAgIGNoYXJhY3RlcnMgd2l0aCB0aGUgIn4iIHN5bWJvbCBvbiB0b3AsIGUuZy4gIuMiIGJ5IHR5cGluZyAiYSIKLSAgICAgICBpbnN0ZWFkIG9mIHNwYWNlLikKLSAgICAgICBXaGF0IHRvIGRvPyBJbiBnZW5lcmFsIHRoZSBWTkMgcHJvdG9jb2wgaGFzIG5vdCByZWFsbHkgc29sdmVkIHRoaXMKLSAgICAgICBwcm9ibGVtOiB3aGF0IHNob3VsZCBiZSBkb25lIGlmIHRoZSBWTkMgdmlld2VyIHNlbmRzIGEga2V5c3ltIG5vdAotICAgICAgIHJlY29nbml6ZWQgYnkgdGhlIFZOQyBzZXJ2ZXIgc2lkZT8gV29ya2Fyb3VuZHMgY2FuIHBvc3NpYmx5IGJlCi0gICAgICAgY3JlYXRlZCB1c2luZyB0aGUgLXJlbWFwIHgxMXZuYyBvcHRpb246Ci0gIC1yZW1hcCBhc2NpaXRpbGRlLWRlYWRfdGlsZGUsYXNjaWljaXJjdW0tZGVhZF9jaXJjdW1mbGV4Ci0gICAgICAgZXRjLiBVc2UgLXJlbWFwIGZpbGVuYW1lIGlmIHRoZSBsaXN0IGlzIGxvbmcuIFBsZWFzZSBzZW5kIHVzIHlvdXIKLSAgICAgICB3b3JrYXJvdW5kcyBmb3IgdGhpcyBwcm9ibGVtIG9uIHlvdXIga2V5Ym9hcmQuIFBlcmhhcHMgd2UgY2FuIGhhdmUKLSAgICAgICB4MTF2bmMgYWRqdXN0IGF1dG9tYXRpY2FsbHkgYXQgc29tZSBwb2ludC4gQWxzbyBzZWUgdGhlCi0gICAgICAgLWFkZF9rZXlzeW1zIG9wdGlvbiBpbiB0aGUgbmV4dCBwYXJhZ3JhcGguCi0gICAgICAgVXBkYXRlOiBmb3IgY29udmVuaWVuY2UgIi1yZW1hcCBERUFEIiBkb2VzIG1hbnkgb2YgdGhlc2UgbWFwcGluZ3MKLSAgICAgICBhdCBvbmNlLgotICAgICAqIFRvIGNvbXBsZW1lbnQgdGhlIGFib3ZlIHdvcmthcm91bmQgdXNpbmcgdGhlIC1yZW1hcCwgYW4gb3B0aW9uCi0gICAgICAgLWFkZF9rZXlzeW1zIHdhcyBhZGRlZC4gVGhpcyBvcHRpb24gaW5zdHJ1Y3RzIHgxMXZuYyB0byBiaW5kIGFueQotICAgICAgIHVua25vd24gS2V5c3ltcyBjb21pbmcgaW4gZnJvbSBWTkMgdmlld2VycyB0byB1bnVzZWQgS2V5Y29kZXMgaW4KLSAgICAgICB0aGUgWCBzZXJ2ZXIuIFRoaXMgbW9kaWZpZXMgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgWCBzZXJ2ZXIuIFdoZW4KLSAgICAgICB4MTF2bmMgZXhpdHMgaXQgcmVtb3ZlcyB0aGUgZXh0cmEga2V5bWFwcGluZ3MgaXQgY3JlYXRlZC4gTm90ZQotICAgICAgIHRoYXQgdGhlIC1yZW1hcCBtYXBwaW5ncyBhcmUgYXBwbGllZCBmaXJzdCwgcmlnaHQgd2hlbiB0aGUgS2V5c3ltCi0gICAgICAgaXMgcmVjZWl2ZWQgZnJvbSBhIFZOQyB2aWV3ZXIsIGFuZCBvbmx5IGFmdGVyIHRoYXQgd291bGQKLSAgICAgICAtYWRkX2tleXN5bXMsIG9yIGFueXRoaW5nIGVsc2UsIGNvbWUgaW50byBwbGF5LgotICAgICAgIFVwZGF0ZTogLWFkZF9rZXlzeW1zIGlzIG5vdyBvbiBieSBkZWZhdWx0LiBVc2UgLW5vYWRkX2tleXN5bXMgdG8KLSAgICAgICBkaXNhYmxlLgotCi0KLSAgIFEtOTE6IFdoZW4gdHlwaW5nIEkgc29tZXRpbWVzIGdldCBkb3VibGUsIHRyaXBsZSwgb3IgbW9yZSBvZiBteQotICAga2V5c3Ryb2tlcyByZXBlYXRlZC4gSSdtIHN1cmUgSSBvbmx5IHR5cGVkIHRoZW0gb25jZSwgd2hhdCBjYW4gSSBkbz8KLQotICAgVGhpcyBtYXkgYmUgZHVlIHRvIGFuIGludGVycGxheSBiZXR3ZWVuIHlvdXIgWCBzZXJ2ZXIncyBrZXkgYXV0b3JlcGVhdAotICAgZGVsYXkgYW5kIHRoZSBleHRyYSB0aW1lIGRlbGF5cyBjYXVzZWQgYnkgeDExdm5jIHByb2Nlc3NpbmcuCi0KLSAgIFNob3J0IGFuc3dlcjogZGlzYWJsZSBrZXkgYXV0b3JlcGVhdGluZyBieSBydW5uaW5nIHRoZSBjb21tYW5kICJ4c2V0IHIKLSAgIG9mZiIgb24gdGhlIFhzZXJ2ZXIgd2hlcmUgeDExdm5jIGlzIHJ1biAocmVzdG9yZSB2aWEgInhzZXQgciBvbiIpIG9yCi0gICB1c2UgdGhlIG5ldyAoSnVsLzIwMDQpIC1ub3JlcGVhdCB4MTF2bmMgb3B0aW9uLiBZb3Ugd2lsbCBzdGlsbCBoYXZlCi0gICBhdXRvcmVwZWF0aW5nIGJlY2F1c2UgdGhhdCBpcyB0YWtlbiBjYXJlIG9mIG9uIHlvdXIgVk5DIHZpZXdlciBzaWRlLgotCi0gICBVcGRhdGU6IGFzIG9mIERlYy8yMDA0IC1ub3JlcGVhdCBpcyBub3cgdGhlIGRlZmF1bHQuIFVzZSAtcmVwZWF0IHRvCi0gICBkaXNhYmxlIGl0LgotCi0gICBEZXRhaWxzOgotICAgc3VwcG9zZSB5b3UgcHJlc3MgYSBrZXkgRE9XTiBhbmQgaXQgZ2VuZXJhdGVzIGNoYW5nZXMgaW4gbGFyZ2UgcmVnaW9ucwotICAgb2YgdGhlIHNjcmVlbi4gVGhlIENQVSBhbmQgSS9PIHdvcmsgeDExdm5jIGRvZXMgZm9yIHRoZSBsYXJnZSBzY3JlZW4KLSAgIGNoYW5nZSBjb3VsZCBiZSBsb25nZXIgdGhhbiB5b3VyIFggc2VydmVyJ3Mga2V5IGF1dG9yZXBlYXQgZGVsYXkuCi0gICB4MTF2bmMgbWF5IG5vdCBnZXQgdG8gcHJvY2Vzc2luZyB0aGUga2V5IFVQIGV2ZW50IHVudGlsIGFmdGVyIHRoZQotICAgc2NyZWVuIHdvcmsgaXMgY29tcGxldGVkLiBUaGUgWCBzZXJ2ZXIgYmVsaWV2ZXMgdGhlIGtleSBoYXMgYmVlbiBoZWxkCi0gICBkb3duIGFsbCB0aGlzIHRpbWUsIGFuZCBhcHBsaWVzIGl0cyBhdXRvcmVwZWF0IHJ1bGVzLgotCi0gICBFdmVuIHdpdGhvdXQgaW5kdWNpbmcgY2hhbmdlcyBpbiBsYXJnZSByZWdpb25zIG9mIHRoZSBzY3JlZW4sIHRoaXMKLSAgIHByb2JsZW0gY291bGQgYXJpc2Ugd2hlbiBhY2Nlc3NpbmcgeDExdm5jIHZpYSBhIGRpYWx1cCBtb2RlbSBvcgotICAgb3RoZXJ3aXNlIGhpZ2ggbGF0ZW5jeSBsaW5rIChlLmcuID4gMjUwIG1zIGxhdGVuY3kuKQotCi0gICBMb29rIGF0IHRoZSBvdXRwdXQgb2YgInhzZXQgcSIgZm9yIHRoZSAiYXV0byByZXBlYXQgZGVsYXkiIHNldHRpbmcuIElzCi0gICBpdCBsb3cgKGUuZy4gPCAzMDAgbXMpPyBJZiB5b3UgdHVybiBvZmYgYXV0b3JlcGVhdCBjb21wbGV0ZWx5OiAieHNldCByCi0gICBvZmYiLCBkb2VzIHRoZSBwcm9ibGVtIGdvIGF3YXk/Ci0KLSAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIG1hbnVhbGx5IGFwcGx5ICJ4c2V0IHIgb2ZmIiBhbmQgInhzZXQgciBvbiIgYXMKLSAgIG5lZWRlZCwgb3IgdG8gdXNlIHRoZSAtbm9yZXBlYXQgKHdoaWNoIGhhcyBzaW5jZSBEZWMvMjAwNCBiZWVuIG1hZGUKLSAgIHRoZSBkZWZhdWx0LikgTm90ZSB0aGF0IHdpdGggWCBzZXJ2ZXIgYXV0b3JlcGVhdCB0dXJuZWQgb2ZmIHRoZSBWTkMKLSAgIHZpZXdlciBzaWRlIG9mIHRoZSBjb25uZWN0aW9uIHdpbGwgKG5lYXJseSBhbHdheXMpIGRvIGl0cyBvd24KLSAgIGF1dG9yZXBlYXRpbmcgc28gdGhlcmUgaXMgbm8gYmlnIGxvc3MgaGVyZSwgdW5sZXNzIHNvbWVvbmUgaXMgYWxzbwotICAgd29ya2luZyBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgbWlzc2VzIGhpcyBhdXRvcmVwZWF0aW5nLgotCi0KLSAgIFEtOTI6IFRoZSB4MTF2bmMgLW5vcmVwZWF0IG1vZGUgaXMgaW4gZWZmZWN0LCBidXQgSSBzdGlsbCBnZXQgcmVwZWF0ZWQKLSAgIGtleXN0cm9rZXMhIQotCi0gICBBcmUgeW91IHVzaW5nIHgxMXZuYyB0byBsb2cgaW4gdG8gYW4gWCBzZXNzaW9uIHZpYSBkaXNwbGF5IG1hbmFnZXI/Ci0gICAoYXMgZGVzY3JpYmVkIGluIHRoaXMgRkFRKSBJZiBzbywgeDExdm5jIGlzIHN0YXJ0aW5nIGJlZm9yZSB5b3VyCi0gICBzZXNzaW9uIGFuZCBpdCBkaXNhYmxlcyBhdXRvcmVwZWF0IHdoZW4geW91IGNvbm5lY3QsIGJ1dCB0aGVuIGFmdGVyCi0gICB5b3UgbG9nIGluIHlvdXIgc2Vzc2lvbiBzdGFydHVwIChHTk9NRSwgS0RFLCAuLi4pIGNvdWxkIGJlIHJlc2V0dGluZwotICAgdGhlIGF1dG9yZXBlYXQgdG8gYmUgb24uIE9yIGl0IGNvdWxkIGJlIHNvbWV0aGluZyBpbnNpZGUgeW91ciBkZXNrdG9wCi0gICB0cnlpbmcgdG8gYmUgaGVscGZ1bCB0aGF0IGRlY2lkZXMgdG8gdHVybiBpdCBiYWNrIG9uLgotCi0gICB4MTF2bmMgaW4gLW5vcmVwZWF0IG1vZGUgd2lsbCBieSBkZWZhdWx0IHJlc2V0IGF1dG9yZXBlYXQgdG8gb2ZmIDIKLSAgIHRpbWVzICh0byBoZWxwIGdldCB0aHJ1IHRoZSBzZXNzaW9uIHN0YXJ0dXAgcHJvYmxlbSksIGJ1dCBpdCB3aWxsIG5vdAotICAgY29udGludWUgdG8gYmF0dGxlIHdpdGggdGhpbmdzIHR1cm5pbmcgYXV0b3JlcGVhdCBiYWNrIG9uLiBJdCB3aWxsCi0gICBhbHNvIHR1cm4gYXV0b3JlcGVhdCBvZmYgd2hlbmV2ZXIgaXQgZ29lcyBmcm9tIGEgc3RhdGUgb2YgemVybyBjbGllbnRzCi0gICB0byBvbmUgY2xpZW50LiBZb3UgY2FuIGFkanVzdCB0aGUgbnVtYmVyIG9mIHJlc2V0cyB2aWEgIi1ub3JlcGVhdCBOIiwKLSAgIG9yIHVzZSAiLW5vcmVwZWF0IC0xIiB0byBoYXZlIGl0IGtlZXAgcmVzZXR0aW5nIGl0IHdoZW5ldmVyIGF1dG9yZXBlYXQKLSAgIGdldHMgdHVybmVkIGJhY2sgb24gd2hlbiBjbGllbnRzIGFyZSBjb25uZWN0ZWQuCi0KLSAgIEluIGdlbmVyYWwgeW91IGNhbiBtYW51YWxseSB0dXJuIGF1dG9yZXBlYXRpbmcgb2ZmIGJ5IHR5cGluZyAieHNldCByCi0gICBvZmYiLCBvciBhIHVzaW5nIGRlc2t0b3AgdXRpbGl0eS9tZW51LCBvciAieDExdm5jIC1SIG5vcmVwZWF0Ii4gSWYKLSAgIHNvbWV0aGluZyBpbiB5b3VyIGRlc2t0b3AgaXMgYXV0b21hdGljYWxseSB0dXJuaW5nIGl0IGJhY2sgb24geW91Ci0gICBzaG91bGQgZmlndXJlIG91dCBob3cgdG8gZGlzYWJsZSB0aGF0IHNvbWVob3cuCi0KLQotICAgUS05MzogQWZ0ZXIgdXNpbmcgeDExdm5jIGZvciBhIHdoaWxlLCBJIGZpbmQgdGhhdCBJIGNhbm5vdCB0eXBlIHNvbWUKLSAgIChvciBhbnkpIGNoYXJhY3RlcnMgb3IgbXkgbW91c2UgY2xpY2tzIGFuZCBkcmFncyBubyBsb25nZXIgaGF2ZSBhbnkKLSAgIGVmZmVjdCwgb3IgdGhleSBsZWFkIHRvIHN0cmFuZ2UgZWZmZWN0cy4gV2hhdCBoYXBwZW5lZD8KLQotICAgUHJvYmFibHkgYSBtb2RpZmllciBrZXksIGUuZy4gQ29udHJvbCBvciBBbHQgaXMgInN0dWNrIiBpbiBhIHByZXNzZWQKLSAgIGRvd24gc3RhdGUuCi0KLSAgIFRoaXMgaGFwcGVucyBmb3IgVk5DIGluIGdlbmVyYWwgYnkgdGhlIGZvbGxvd2luZyBtZWNoYW5pc20uIFN1cHBvc2Ugb24KLSAgIHRoZSBWaWV3ZXIgc2lkZSBkZXNrdG9wIHRoZXJlIGlzIHNvbWUgaG90LWtleSB0byBzd2l0Y2gKLSAgIGRlc2t0b3BzL3Jvb21zL3NwYWNlcywgZXRjLiBFLmcuIHN1cHBvc2UgQWx0K0xlZnRBcnJvdyBtb3ZlcyB0byB0aGUKLSAgIGxlZnQgZGVza3RvcC9yb29tL3NwYWNlLiBPciBzdXBwb3NlIGFuIEFsdCtob3RrZXkgY29tYmluYXRpb24KLSAgIGljb25pZmllcyBhIHdpbmRvdy4gVGhpcyBjYW4gbGVhdmUgdGhlIEFsdCBrZXkgcHJlc3NlZCBkb3duIG9uIHRoZQotICAgcmVtb3RlIHNpZGUuCi0KLSAgIENvbnNpZGVyIHRoZSBzZXF1ZW5jZSB0aGF0IGhhcHBlbnMuIFRoZSBBbHRfTCBrZXkgYW5kIHRoZW4gdGhlCi0gICBMZWZ0QXJyb3cga2V5IGdvIGRvd24uIFNpbmNlIHlvdSBhcmUgaW5zaWRlIHRoZSB2aWV3ZXIgdGhlIEFsdF9MIGtleQotICAgcHJlc3MgaXMgc2VudCB0byB0aGUgb3RoZXIgc2lkZSAoeDExdm5jKSBhbmQgc28gaXQgaXMgcHJlc3NlZCBkb3duIGluCi0gICB0aGUgcmVtb3RlIGRlc2t0b3AgYXMgd2VsbC4gKGJ5ICJBbHRfTCIgd2UgbWVhbiB0aGUgQWx0IGtleSBvbiB0aGUKLSAgIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBrZXlib2FyZC4pIFlvdXIgbG9jYWwgZGVza3RvcCAod2hlcmUgdGhlIFZOQwotICAgVmlld2VyIGlzIHJ1bm5pbmcpIHRoZW4gd2FycHMgdG8gdGhlIG5ldyBkZXNrdG9wL3Jvb20vc3BhY2U6IExlYXZpbmcKLSAgIHRoZSBBbHRfTCBrZXkgc3RpbGwgcHJlc3NlZCBkb3duIGluIHRoZSByZW1vdGUgZGVza3RvcC4KLQotICAgSWYgc29tZW9uZSBpcyBzaXR0aW5nIGF0IHRoZSBkZXNrdG9wLCBvciB3aGVuIHlvdSByZXR1cm4gaW4gdGhlIHZpZXdlcgotICAgaXQgbWF5IGJlIHZlcnkgY29uZnVzaW5nIGJlY2F1c2UgdGhlIEFsdF9MIGlzIHN0aWxsIHByZXNzZWQgZG93biBidXQKLSAgIHlvdSAob3IgdGhlIHBlcnNvbiBzaXR0aW5nIGF0IHRoZSBkZXNrdG9wKSBkbyBub3QgcmVhbGl6ZSB0aGlzLgotICAgRGVwZW5kaW5nIG9uIHdoaWNoIHJlbW90ZSBkZXNrdG9wICh4MTF2bmMgc2lkZSkgaXMgdXNlZCwgaXQgY2FuIGFjdAotICAgdmVyeSBzdHJhbmdlbHkuCi0KLSAgIEEgcXVpY2sgd29ya2Fyb3VuZCB3aGVuIHlvdSBub3RpY2UgdGhpcyBpcyB0byBwcmVzcyBhbmQgcmVsZWFzZSBhbGwgb2YKLSAgIHRoZSBBbHQsIFNoaWZ0LCBDb250cm9sLCBXaW5kb3dzLUZsYWcsIG1vZGlmaWVyIGtleXMgdG8gZnJlZSB0aGUKLSAgIHByZXNzZWQgb25lLiBZb3UgbmVlZCB0byBkbyB0aGlzIGZvciBib3RoIHRoZSBsZWZ0IGFuZCByaWdodCBTaGlmdCwKLSAgIEFsdCwgQ29udHJvbCwgZXRjLiBrZXlzIHRvIGJlIHN1cmUuCi0KLSAgIE5vdGUgdGhhdCBtYW55IFZOQyBWaWV3ZXJzIHRyeSB0byBndWFyZCBhZ2FpbnN0IHRoaXMgd2hlbiB0aGV5IGFyZQotICAgbm90aWZpZWQgYnkgdGhlIHdpbmRvdyBzeXN0ZW0gdGhhdCB0aGUgdmlld2VyIGFwcCBoYXMgImxvc3QgZm9jdXMiLgotICAgV2hlbiBpdCByZWNlaXZlcyB0aGUgImxvc3QgZm9jdXMiIGV2ZW50LCB0aGUgdmlld2VyIHNlbmRzIFZOQwotICAgS2V5LVJlbGVhc2UgZXZlbnRzIGZvciBhbGwgbW9kaWZpZXIga2V5cyB0aGF0IGFyZSBjdXJyZW50bHkgcHJlc3NlZAotICAgZG93bi4gVGhpcyBkb2VzIG5vdCBhbHdheXMgd29yaywgaG93ZXZlciwgc2luY2UgaXQgZGVwZW5kcyBvbiBob3cgdGhlCi0gICBkZXNrdG9wIG1hbmFnZXMgdGhlc2UgIndhcnBzIi4gSWYgdGhlIHZpZXdlciBpcyBub3Qgbm90aWZpZWQgaXQgY2Fubm90Ci0gICBrbm93IGl0IG5lZWRzIHRvIHJlbGVhc2UgdGhlIG1vZGlmaWVycy4KLQotICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgLWNsZWFyX21vZHMgb3B0aW9uIHRvIHRyeSB0byBjbGVhciBhbGwgb2YgdGhlCi0gICBtb2RpZmllciBrZXlzIGF0IHgxMXZuYyBzdGFydHVwLiBZb3Ugd2lsbCBzdGlsbCBoYXZlIHRvIGJlIGNhcmVmdWwKLSAgIHRoYXQgeW91IGRvIG5vdCBsZWF2ZSB0aGUgbW9kaWZpZXIga2V5IHByZXNzZWQgZG93biBkdXJpbmcgeW91cgotICAgc2Vzc2lvbi4gSXQgaXMgZGlmZmljdWx0IHRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGZyb20gb2NjdXJyaW5nIChzaG9ydAotICAgb2YgdXNpbmcgLXJlbWFwIHRvIHByZXZlbnQgc2VuZGluZyBhbGwgb2YgdGhlIHByb2JsZW0gbW9kaWZpZXIga2V5cywKLSAgIHdoaWNoIHdvdWxkIG1ha2UgdGhlIGRlc3Rrb3AgcHJldHR5IHVudXNhYmxlLikKLQotICAgRHVyaW5nIGEgc2Vzc2lvbiB0aGVzZSB4MTF2bmMgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMgY2FuIGFsc28gaGVscDoKLSAgIHgxMXZuYyAtUiBjbGVhcl9tb2RzCi0gICB4MTF2bmMgLVIgY2xlYXJfa2V5cwotICAgeDExdm5jIC1SIGNsZWFyX2xvY2tzCi0gICB4MTF2bmMgLVIgY2xlYXJfYWxsCi0KLSAgIEEgc2ltaWxhciBwcm9ibGVtIGNhbiBvY2N1ciBpZiB5b3UgYWNjaWRlbnRhbGx5IHByZXNzIHRoZSBDYXBzX0xvY2sgb3IKLSAgIE51bV9Mb2NrIGRvd24uIFdoZW4gdGhlc2UgYXJlIGxvY2tlZCBvbiB0aGUgcmVtb3RlIHNpZGUgaXQgY2FuCi0gICBzb21ldGltZXMgbGVhZCB0byBzdHJhbmdlIGRlc2t0b3AgYmVoYXZpb3IgKGUuZy4gY2Fubm90IGRyYWcgb3IgY2xpY2sKLSAgIG9uIHdpbmRvd3MuKSBBcyBhYm92ZSB5b3UgbWF5IG5vdCBub3RpY2UgdGhpcyBiZWNhdXNlIHRoZSBsb2NrIGlzbid0Ci0gICBkb3duIG9uIHRoZSBsb2NhbCAoVmlld2VyKSBzaWRlLiBTZWUgdGhpcyBGQVEgb24gbG9jayBrZXlzIHByb2JsZW0uCi0gICBUaGVzZSBvcHRpb25zIG1heSBoZWxwIGF2b2lkIHRoZSBwcm9ibGVtOiAtc2tpcF9sb2Nra2V5cyBhbmQKLSAgIC1jYXBzbG9jay4gU2VlIGFsc28gLWNsZWFyX2FsbC4KLQotCi0gICBRLTk0OiBUaGUgbWFjaGluZSB3aGVyZSBJIHJ1biB4MTF2bmMgaGFzIGFuIEFsdEdyIGtleSwgYnV0IHRoZSBsb2NhbAotICAgbWFjaGluZSB3aGVyZSBJIHJ1biB0aGUgVk5DIHZpZXdlciBkb2VzIG5vdC4gSXMgdGhlcmUgYSB3YXkgSSBjYW4gbWFwCi0gICBhIGxvY2FsIHVudXNlZCBrZXkgdG8gc2VuZCBhbiBBbHRHcj8gSG93IGFib3V0IGEgQ29tcG9zZSBrZXkgYXMgd2VsbD8KLQotICAgU29tZXRoaW5nIGxpa2UgIi1yZW1hcCBTdXBlcl9SLU1vZGVfc3dpdGNoIiB4MTF2bmMgb3B0aW9uIG1heSB3b3JrLgotICAgTm90ZSB0aGF0IFN1cGVyX1IgaXMgdGhlICJSaWdodCBXaW5kb3plKHRtKSBGbGFnZ2llIiBrZXk7IHlvdSBtYXkgd2FudAotICAgdG8gY2hvb3NlIGFub3RoZXIuIFRoZSAtZGVidWdfa2V5Ym9hcmQgb3B0aW9uIGNvbWVzIGluIGhhbmR5IGluCi0gICBmaW5kaW5nIGtleXN5bSBuYW1lcyAoc28gZG9lcyB4ZXYoMSkuKQotCi0gICBGb3IgQ29tcG9zZSBob3cgYWJvdXQgIi1yZW1hcCBNZW51LU11bHRpX2tleSIgKG5vdGUgdGhhdCBNdWx0aV9rZXkgaXMKLSAgIHRoZSBvZmZpY2lhbCBuYW1lIGZvciBDb21wb3NlLikgVG8gZG8gYm90aCBhdCB0aGUgc2FtZSB0aW1lOiAiLXJlbWFwCi0gICBTdXBlcl9SLU1vZGVfc3dpdGNoLE1lbnUtTXVsdGlfa2V5IiBvciB1c2UgIi1yZW1hcCBmaWxlbmFtZSIgdG8KLSAgIHNwZWNpZnkgcmVtYXBwaW5ncyBmcm9tIGEgZmlsZS4KLQotCi0gICBRLTk1OiBJIGhhdmUgYSBTdW4gbWFjaGluZSBJIHJ1biB4MTF2bmMgb24uIEl0cyBTdW4ga2V5Ym9hcmQgaGFzIGp1c3QKLSAgIG9uZSBBbHQga2V5IGxhYmVsbGVkICJBbHQiIGFuZCB0d28gTWV0YSBrZXlzIGxhYmVsbGVkIHdpdGggbGl0dGxlCi0gICBkaWFtb25kcy4gVGhlIG1hY2hpbmUgd2hlcmUgSSBydW4gdGhlIFZOQyB2aWV3ZXIgb25seSBoYXMgQWx0IGtleXMuCi0gICBIb3cgY2FuIEkgc2VuZCBhIE1ldGEga2V5cHJlc3M/IChlLmcuIGVtYWNzIG5lZWRzIHRoaXMpCi0KLSAgIEhlcmUgYXJlIGEgY291cGxlIGlkZWFzLiBUaGUgZmlyc3Qgb25lIGlzIHRvIHNpbXBseSB1c2UgeG1vZG1hcCgxKSB0bwotICAgYWRqdXN0IHRoZSBTdW4gWCBzZXJ2ZXIuIFBlcmhhcHMgeG1vZG1hcCAtZSAia2V5c3ltIEFsdF9MID0gTWV0YV9MCi0gICBBbHRfTCIgd2lsbCBkbyB0aGUgdHJpY2suICh0aGVyZSBhcmUgb3RoZXIgd2F5cyB0byBkbyBpdCwgb25lIHVzZXIKLSAgIHVzZWQ6IHhtb2RtYXAgLWUgImtleWNvZGUgMjYgPSBNZXRhX0wiIGZvciBoaXMgc2V0dXAuKQotCi0gICBTaW5jZSB4bW9kbWFwKDEpIG1vZGlmaWVzIHRoZSBYIHNlcnZlciBtYXBwaW5ncyB5b3UgbWF5IG5vdCB3YW50IHRvIGRvCi0gICB0aGlzIChiZWNhdXNlIGl0IGFmZmVjdHMgbG9jYWwgd29yayBvbiB0aGF0IG1hY2hpbmUuKSBTb21ldGhpbmcgbGlrZQotICAgdGhlIC1yZW1hcCBBbHRfTC1NZXRhX0wgdG8geDExdm5jIG1heSBiZSBzdWZmaWNpZW50IGZvciBvbmVzIG5lZWRzLAotICAgYW5kIGRvZXMgbm90IG1vZGlmeSB0aGUgWCBzZXJ2ZXIgZW52aXJvbm1lbnQuIE5vdGUgdGhhdCB5b3UgY2Fubm90Ci0gICBzZW5kIEFsdF9MIGluIHRoaXMgY2FzZSwgbWF5YmUgLXJlbWFwIFN1cGVyX0wtTWV0YV9MIHdvdWxkIGJlIGEgYmV0dGVyCi0gICBjaG9pY2UgaWYgdGhlIFN1cGVyX0wga2V5IGlzIHR5cGljYWxseSB1bnVzZWQgaW4gVW5peC4KLQotCi0gICBRLTk2OiBSdW5uaW5nIHgxMXZuYyBvbiBIUC1VWCBJIGNhbm5vdCB0eXBlICIjIiBJIGp1c3QgZ2V0IGEgIjMiCi0gICBpbnN0ZWFkLgotCi0gICBPbmUgdXNlciByZXBvcnRzIHRoaXMgcHJvYmxlbSBvbiBIUC1VWCBSZWxfQi4xMS4yMy4gVGhlIHByb2JsZW0gd2FzCi0gICB0cmFjZWQgdG8gYSBzdHJhbmdlIGtleWJvYXJkIG1hcHBpbmcgZm9yIHRoZSBtYWNoaW5lIChlLmcuIHhtb2RtYXAgLXBrCi0gICBvdXRwdXQpIHRoYXQgbG9va2VkIGxpa2U6Ci0gIC4uLgotICAwMzkgIDIgICAgICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgICAgYXQgICAgICAgICAgICAgICBhdAotICAuLi4KLSAgMDQ3ICAzICAgICAgICAgICAgICAgICAgbnVtYmVyc2lnbiAgICAgICAgIG51bWJlcnNpZ24gICAgICAgbnVtYmVyc2lnbgotCi0gICBhbmQgc2ltaWxhciB0cmlwbGUgbWFwcGluZ3MgKHdpdGggdHdvIGluIHRoZSBBbHRHci9Nb2RlX3N3aXRjaCBncm91cCkKLSAgIG9mIGEga2V5c3VtIHRvIGEgc2luZ2xlIGtleWNvZGUuCi0KLSAgIFVzZSB0aGUgLW5vbW9kdHdlYWsgb3B0aW9uIGFzIGEgd29ya2Fyb3VuZC4gWW91IGNhbiBhbHNvIHVzZSB4bW9kbWFwCi0gICB0byBjb3JyZWN0IHRoZXNlIG1hcHBpbmdzIGluIHRoZSBzZXJ2ZXIsIGUuZy46Ci0gIHhtb2RtYXAgLWUgImtleWNvZGUgNDcgPSAzIG51bWJlcnNpZ24iCi0KLSAgIEFsc28sIGFzIG9mIEZlYi8yMDA3LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE1PRFRXRUFLX0xPV0VTVD0xCi0gICAoZWl0aGVyIGluIHlvdXIgc2hlbGwgb3IgdmlhICItZW52IE1PRFRXRUFLX0xPV0VTVD0xIiBvcHRpb24pIHRvCi0gICBoYW5kbGUgdGhlc2UgbWFwcGluZ3MgYmV0dGVyLgotCi0KLSAgIFEtOTc6IENhbiBJIG1hcCBhIGtleXN0cm9rZSB0byBhIG1vdXNlIGJ1dHRvbiBjbGljayBvbiB0aGUgcmVtb3RlCi0gICBtYWNoaW5lPwotCi0gICBUaGlzIGNhbiBiZSBkb25lIGRpcmVjdGx5IGluIHNvbWUgWCBzZXJ2ZXJzIHVzaW5nIEFjY2Vzc1ggYW5kCi0gICBQb2ludGVyX0VuYWJsZUtleXMsIGJ1dCBpcyBhIGJpdCBhd2t3YXJkLiBJdCBtYXkgYmUgbW9yZSBjb252ZW5pZW50IHRvCi0gICBoYXZlIHgxMXZuYyBkbyB0aGUgcmVtYXBwaW5nLiBUaGlzIGNhbiBiZSBkb25lIHZpYSB0aGUgLXJlbWFwIG9wdGlvbgotICAgdXNpbmcgdGhlIGZha2UgImtleXN5bXMiIEJ1dHRvbjEsIEJ1dHRvbjIsIGV0Yy4gYXMgdGhlICJ0byIga2V5cyAoaS5lLgotICAgdGhlIG9uZXMgYWZ0ZXIgdGhlICItIikKLQotICAgQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgYSBsYXB0b3Agd2hlcmUgdGhlIFZOQyB2aWV3ZXIgaXMgcnVuIHRoYXQgaGFzCi0gICBhIHRvdWNocGFkIHdpdGggb25seSB0d28gYnV0dG9ucy4gSXQgaXMgZGlmZmljdWx0IHRvIGRvIGEgbWlkZGxlCi0gICBidXR0b24gInBhc3RlIiBiZWNhdXNlICh1c2luZyBYRnJlZTg2L1hvcmcgRW11bGF0ZTNCdXR0b25zKSB5b3UgaGF2ZQotICAgdG8gY2xpY2sgYm90aCBidXR0b25zIG9uIHRoZSB0b3VjaCBwYWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcwotICAgcmVtYXBwaW5nOgotICAtcmVtYXAgU3VwZXJfUi1CdXR0b24yCi0KLSAgIG1hcHMgdGhlIFN1cGVyX1IgImZsYWciIGtleSBwcmVzcyB0byB0aGUgQnV0dG9uMiBjbGljaywgdGhlcmVieSBtYWtpbmcKLSAgIFggcGFzdGluZyBhIGJpdCBlYXNpZXIuCi0KLSAgIE5vdGUgdGhhdCBvbmNlIHRoZSBrZXkgZ29lcyBkb3duLCB0aGUgYnV0dG9uIGRvd24gYW5kIGJ1dHRvbiB1cCBldmVudHMKLSAgIGFyZSBnZW5lcmF0ZWQgaW1tZWRpYXRlbHkgb24gdGhlIHgxMXZuYyBzaWRlLiBXaGVuIHRoZSBrZXkgaXMgcmVsZWFzZWQKLSAgIChpLmUuIGdvZXMgdXApIG5vIGV2ZW50cyBhcmUgZ2VuZXJhdGVkLgotCi0gICBRLTk4OiBIb3cgY2FuIEkgZ2V0IENhcHNfTG9jayB0byB3b3JrIGJldHdlZW4gbXkgVk5DIHZpZXdlciBhbmQKLSAgIHgxMXZuYz8KLQotICAgVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0byBnZXQgdGhlIENhcHNfTG9jawotICAgc3RhdGUgb3V0IG9mIHN5bmMgYmV0d2VlbiB5b3VyIHZpZXdlci1zaWRlIG1hY2hpbmUgYW5kIHRoZSB4MTF2bmMtc2lkZQotICAgWCBzZXJ2ZXIuIEZvciBiZXN0IHJlc3VsdHMsIHdlIHJlY29tbWVuZCBub3QgZXZlciBsZXR0aW5nIHRoZQotICAgQ2Fwc19Mb2NrIGtleXByZXNzZXMgYmUgcHJvY2Vzc2VkIGJ5IHgxMXZuYy4gVGhhdCB3YXkgd2hlbiB5b3UgcHJlc3MKLSAgIENhcHNfTG9jayBpbiB0aGUgdmlld2VyIHlvdXIgbG9jYWwgbWFjaGluZSBnb2VzIGludG8gdGhlIENhcHNfTG9jayBvbgotICAgc3RhdGUgYW5kIHNlbmRzIGtleXN5bSAiQSIgc2F5IHdoZW4geW91IHByZXNzICJhIi4geDExdm5jIHdpbGwgdGhlbgotICAgZmFrZSB0aGluZ3MgdXAgc28gdGhhdCBTaGlmdCBpcyBoZWxkIGRvd24gdG8gZ2VuZXJhdGUgIkEiLiBUaGUKLSAgIC1za2lwX2xvY2trZXlzIG9wdGlvbiBzaG91bGQgaGVscCB0byBhY2NvbXBsaXNoIHRoaXMuIEZvciBmaW5lciBncmFpbgotICAgY29udHJvbCB1c2Ugc29tZXRoaW5nIGxpa2U6ICItcmVtYXAgQ2Fwc19Mb2NrLU5vbmUiLgotCi0gICBBbHNvIHRyeSB0aGUgLW5vbW9kdHdlYWsgYW5kIC1jYXBzbG9jayBvcHRpb25zLgotCi0gICBBbm90aGVyIHVzZWZ1bCBvcHRpb24gdGhhdCB0dXJucyBvZmYgYW55IExvY2sga2V5cyBvbiB0aGUgcmVtb3RlIHNpZGUKLSAgIGF0IHN0YXJ0dXAgYW5kIGVuZCBpcyB0aGUgLWNsZWFyX2FsbCBvcHRpb24uIER1cmluZyBhIHNlc3Npb24geW91IGNhbgotICAgcnVuIHRoZXNlIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIHRvIG1vZGlmeSB0aGUgTG9jayBrZXlzOgotICAgeDExdm5jIC1SIGNsZWFyX2xvY2tzCi0gICB4MTF2bmMgLVIgY2xlYXJfYWxsCi0KLSAgIHRoZSBmb3JtZXIgd2lsbCB0cnkgdG8gdW5zZXQgYW55IExvY2sga2V5cywgdGhlIGxhdHRlciB3aWxsIGRvIHNhbWUKLSAgIGFuZCBhbHNvIHRyeSB0byBtYWtlIGl0IHNvIG5vIGtleSBpcyBwcmVzc2VkIGRvd24gKGUuZy4gInN0dWNrIiBBbHRfTCwKLSAgIGV0Yy4pCi0gICBbU2NyZWVuIFJlbGF0ZWQgSXNzdWVzIGFuZCBGZWF0dXJlc10KLQotICAgUS05OTogVGhlIHJlbW90ZSBkaXNwbGF5IGlzIGxhcmdlciAoaW4gbnVtYmVyIG9mIHBpeGVscykgdGhhbiB0aGUKLSAgIGxvY2FsIGRpc3BsYXkgSSBhbSBydW5uaW5nIHRoZSB2bmN2aWV3ZXIgb24uIEkgZG9uJ3QgbGlrZSB0aGUKLSAgIHZuY3ZpZXdlciBzY3JvbGxiYXJzLCB3aGF0IEkgY2FuIGRvPwotCi0gICB2bmN2aWV3ZXIgaGFzIGEgb3B0aW9uICh1c3VhbGx5IGFjY2Vzc2libGUgdmlhIEY4IGtleSBvciAtZnVsbHNjcmVlbgotICAgb3B0aW9uKSBmb3Igdm5jdmlld2VyIHRvIHJ1biBpbiBmdWxsIHNjcmVlbiwgd2hlcmUgaXQgd2lsbAotICAgYXV0b21hdGljYWxseSBzY3JvbGwgd2hlbiB0aGUgbW91c2UgaXMgbmVhciB0aGUgZWRnZSBvZiB0aGUgY3VycmVudAotICAgdmlldy4gRm9yIHF1aWNrIHNjcm9sbGluZywgYWxzbyBtYWtlIHN1cmUgQmFja2luZyBTdG9yZSBpcyBlbmFibGVkIG9uCi0gICB0aGUgbWFjaGluZSB2bmN2aWV3ZXIgaXMgcnVuIG9uLiAoWEZyZWU4Ni9Yb3JnIGRpc2FibGVzIGl0IGJ5IGRlZmF1bHQKLSAgIGZvciBzb21lIHJlYXNvbiwgYWRkIE9wdGlvbiAiYmFja2luZ3N0b3JlIiB0byBYRjg2Q29uZmlnIG9uIHRoZQotICAgdm5jdmlld2VyIHNpZGUuKQotCi0gICBCVFcsIGNvbnRhY3QgbWUgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB2bmN2aWV3ZXIgaW4KLSAgIGZ1bGxzY3JlZW4gbW9kZSB3aXRoIHlvdXIgd2luZG93IG1hbmFnZXIgKGkuZS4gbm8ga2V5Ym9hcmQgcmVzcG9uc2UuKQotICAgSSBoYXZlIGEgd29ya2Fyb3VuZCBmb3Igdm5jdmlld2VyIHVzaW5nIFhHcmFiU2VydmVyKCkuCi0KLSAgIFRoZXJlIG1heSBhbHNvIGJlIHNjYWxpbmcgdmlld2VycyBvdXQgdGhlcmUgKGUuZy4gVGlnaHRWTkMgb3IgVWx0cmFWTkMKLSAgIG9uIFdpbmRvd3MpIHRoYXQgYXV0b21hdGljYWxseSBzaHJpbmsgb3IgZXhwYW5kIHRoZSByZW1vdGUgZnJhbWVidWZmZXIKLSAgIHRvIGZpdCB0aGUgbG9jYWwgZGlzcGxheS4gRXNwZWNpYWxseSBmb3IgaGFuZC1oZWxkIGRldmljZXMuIFNlZSBhbHNvCi0gICB0aGUgbmV4dCBGQVEgb24geDExdm5jIHNjYWxpbmcuCi0KLQotICAgUS0xMDA6IERvZXMgeDExdm5jIHN1cHBvcnQgc2VydmVyLXNpZGUgZnJhbWVidWZmZXIgc2NhbGluZz8gKEUuZy4gdG8KLSAgIG1ha2UgdGhlIGRlc2t0b3Agc21hbGxlci4pCi0KLSAgIEFzIG9mIEp1bi8yMDA0IHgxMXZuYyBwcm92aWRlcyBiYXNpYyBzZXJ2ZXItc2lkZSBzY2FsaW5nLiBJdCBpcyBhCi0gICBnbG9iYWwgc2NhbGluZyBvZiB0aGUgZGVza3RvcCwgbm90IGEgcGVyLWNsaWVudCBzZXR0aW5nLiBUbyBlbmFibGUgaXQKLSAgIHVzZSB0aGUgIi1zY2FsZSBmcmFjdGlvbiIgb3B0aW9uLiAiZnJhY3Rpb24iIGNhbiBlaXRoZXIgYmUgYSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyIChlLmcuIC1zY2FsZSAwLjc1KSBvciB0aGUgYWx0ZXJuYXRpdmUgbS9uIGZyYWN0aW9uCi0gICBub3RhdGlvbiAoZS5nLiAtc2NhbGUgMy80LikgTm90ZSB0aGF0IGlmIGZyYWN0aW9uIGlzIGdyZWF0ZXIgdGhhbiBvbmUKLSAgIHRoZSBkaXNwbGF5IGlzIG1hZ25pZmllZC4KLQotICAgRXh0cmEgcmVzb3VyY2VzIChDUFUsIG1lbW9yeSBJL08sIGFuZCBtZW1vcnkpIGFyZSByZXF1aXJlZCB0byBkbyB0aGUKLSAgIHNjYWxpbmcuIElmIHRoZSBtYWNoaW5lIGlzIHNsb3cgd2hlcmUgeDExdm5jIGlzIHJ1biB3aXRoIHNjYWxpbmcKLSAgIGVuYWJsZWQsIHRoZSBpbnRlcmFjdGl2ZSByZXNwb25zZSBjYW4gYmUgdW5hY2NlcHRhYmxlLiBPVE9ILCBpZiBydW4KLSAgIHdpdGggc2NhbGluZyBvbiBhIGZhc3QgbWFjaGluZSB0aGUgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gaXMgdXN1YWxseQotICAgbm90IGEgYmlnIGlzc3VlIG9yIGV2ZW4gbm90aWNlYWJsZS4KLQotICAgSXQgbWF5IGhlbHAgdG8gY29tcGlsZSB4MTF2bmMgd2l0aCBjb21waWxlciBvcHRpb24gLU8zIG9yIC1PNCB0byBzcGVlZAotICAgdXAgdGhlIHNjYWxpbmcgY29kZS4gU2V0IHRoZSBDRkxBR1MgZW52LiB2YXIuIGJlZm9yZSBydW5uaW5nCi0gICBjb25maWd1cmUuCi0KLSAgIEFsc28sIGlmIHlvdSBqdXN0IHdhbnQgYSBxdWljaywgcm91Z2ggInRodW1ibmFpbCIgb2YgdGhlIGRpc3BsYXkgeW91Ci0gICBjYW4gYXBwZW5kICI6bmIiIHRvIHRoZSBmcmFjdGlvbiB0byB0dXJuIG9uICJubyBibGVuZGluZyIgbW9kZS4gRS5nLjoKLSAgICItc2NhbGUgMS8zOm5iIiBGb250cyB3aWxsIGJlIGRpZmZpY3VsdCB0byByZWFkLCBidXQgdGhlIGxhcmdlcgotICAgZmVhdHVyZXMgd2lsbCBiZSByZWNvZ25pemFibGUuIEJUVywgIm5vIGJsZW5kaW5nIiBtb2RlIGlzIGZvcmNlZCBvbgotICAgd2hlbiBzY2FsaW5nIDhicHAgUHNldWRvQ29sb3IgZGlzcGxheXMgKGJlY2F1c2UgYmxlbmRpbmcgYW4gaW5kZXhlZAotICAgY29sb3JtYXAgaXMgYSBiYWQgaWRlYSBhbmQgbGVhZHMgdG8gcmFuZG9tIGNvbG9ycywgdXNlIDpmYiB0byBmb3JjZSBpdAotICAgb24uKQotCi0gICBPbmUgY2FuIGFsc28gdXNlIHRoZSAiOm5iIiB3aXRoIGFuIGludGVnZXIgc2NhbGUgZmFjdG9yIChzYXkgIi1zY2FsZQotICAgMjpuYiIpIHRvIHVzZSB4MTF2bmMgYXMgYSBzY3JlZW4gbWFnbmlmaWVyIGZvciB2aXNpb24gaW1wYWlyZWQKLSAgIGFwcGxpY2F0aW9ucy4gU2luY2Ugd2l0aCBpbnRlZ2VyIHNjYWxlIGZhY3RvcnMgdGhlIGZyYW1lYnVmZmVycyBiZWNvbWUKLSAgIGh1Z2UgYW5kIHNjYWxpbmcgb3BlcmF0aW9ucyB0aW1lIGNvbnN1bWluZywgYmUgc3VyZSB0byB1c2UgIjpuYiIgZm9yCi0gICB0aGUgZmFzdGVzdCByZXNwb25zZS4KLQotICAgSW4gZ2VuZXJhbCBmb3IgYSBzY2FsZWQgZGlzcGxheSBpZiB5b3UgYXJlIHVzaW5nIGEgVGlnaHRWTkMgdmlld2VyIHlvdQotICAgbWF5IHdhbnQgdG8gdHVybiBvZmYganBlZyBlbmNvZGluZyAoZS5nLiB2bmN2aWV3ZXIgLW5vanBlZyBob3N0OjAuKQotICAgVGhlcmUgYXBwZWFycyB0byBiZSBhIG5vaXNlIGVuaGFuY2VtZW50IGVmZmVjdCwgZXNwZWNpYWxseSBmb3IgcmVnaW9ucwotICAgY29udGFpbmluZyBmb250L3RleHQ6IHRoZSBzY2FsaW5nIGNhbiBpbnRyb2R1Y2Ugc29tZSBwaXhlbCBhcnRpZmFjdHMKLSAgIHRoYXQgZXZpZGVudGx5IGNhdXNlcyB0aGUgdGlnaHQgZW5jb2RpbmcgYWxnb3JpdGhtIHRvIGluY29ycmVjdGx5Ci0gICBkZXRlY3QgdGhlIHJlZ2lvbnMgYXMgaW1hZ2UgZGF0YSBhbmQgdGhlcmVieSBpbnRyb2R1Y2UgYWRkaXRpb25hbAotICAgcGl4ZWwgYXJ0aWZhY3RzIGR1ZSB0byB0aGUgbG9zc2luZXNzIG9mIHRoZSBqcGVnIGNvbXByZXNzaW9uCi0gICBhbGdvcml0aG0uIEV4cGVyaW1lbnQgdG8gc2VlIGlmIC1ub2pwZWcgdm5jdmlld2VyIG9wdGlvbiBpbXByb3ZlcyB0aGUKLSAgIHJlYWRhYmlsaXR5IG9mIHRleHQgd2hlbiB1c2luZyAtc2NhbGUgdG8gc2hyaW5rIHRoZSBkaXNwbGF5IHNpemUuIEFsc28KLSAgIG5vdGUgdGhhdCBzY2FsaW5nIG1heSBhY3R1YWxseSBzbG93IGRvd24gdGhlIHRyYW5zZmVyIG9mIHRleHQgcmVnaW9ucwotICAgYmVjYXVzZSBhZnRlciBiZWluZyBzY2FsZWQgdGhleSBkbyBub3QgY29tcHJlc3MgYXMgd2VsbC4gKHRoaXMgY2FuCi0gICBvZnRlbiBiZSBhIHNpZ25pZmljYW50IHNsb3dkb3duLCBlLmcuIDEwWC4pCi0KLSAgIEFub3RoZXIgaXNzdWUgaXMgdGhhdCBpdCBhcHBlYXJzIFZOQyB2aWV3ZXJzIHJlcXVpcmUgdGhlIHNjcmVlbiB3aWR0aAotICAgdG8gYmUgYSBtdWx0aXBsZSBvZiA0LiBXaGVuIHNjYWxpbmcgeDExdm5jIHdpbGwgcm91bmQgdGhlIHdpZHRoIHRvIHRoZQotICAgbmVhcmVzdCBtdWx0aXBsZSBvZiA0LiBUbyBkaXNhYmxlIHRoaXMgdXNlIHRoZSAiOm40IiBzdWIgb3B0aW9uIChsaWtlCi0gICAiOm5iIiBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoOyB0byBzcGVjaWZ5IGJvdGggdXNlIGEgY29tbWE6Ci0gICAiOm5iLG40IiwgZXRjLikKLQotICAgSWYgb25lIGRlc2lyZXMgcGVyLWNsaWVudCBzY2FsaW5nIGZvciBzb21ldGhpbmcgbGlrZSAxOjEgZnJvbSBhCi0gICB3b3Jrc3RhdGlvbiBhbmQgMToyIGZyb20gYSBzbWFsbGVyIGRldmljZSAoZS5nLiBoYW5kaGVsZCksIGN1cnJlbnRseQotICAgdGhlIG9ubHkgb3B0aW9uIGlzIHRvIHJ1biB0d28gKG9yIG1vcmUpIHgxMXZuYyBwcm9jZXNzZXMgd2l0aAotICAgZGlmZmVyZW50IHNjYWxpbmdzIGxpc3RlbmluZyBvbiBzZXBhcmF0ZSBwb3J0cyAoLXJmYnBvcnQgb3B0aW9uLCBldGMuKQotCi0gICBVcGRhdGU6IEFzIG9mIE1heS8yMDA2IHgxMXZuYyBhbHNvIHN1cHBvcnRzIHRoZSBVbHRyYVZOQyBzZXJ2ZXItc2lkZQotICAgc2NhbGluZy4gVGhpcyBpcyBhIHBlci1jbGllbnQgc2NhbGluZyBieSBmYWN0b3JzIDEvMiwgMS8zLCAuLi4gYW5kIHNvCi0gICBtYXkgYmUgdXNlZnVsIGZvciBQREEncyAoIi1zY2FsZSAxLzIiLCBldGMuIHdpbGwgZ2l2ZSBzaW1pbGFyIHJlc3VsdHMKLSAgIGV4Y2VwdCB0aGF0IGl0IGFwcGxpZXMgdG8gYWxsIGNsaWVudHMuKSBZb3UgbWF5IG5lZWQgdG8gc3VwcGx5Ci0gICAiLXJmYnZlcnNpb24gMy42IiBmb3IgdGhpcyB0byBiZSByZWNvZ25pemVkIGJ5IFVsdHJhVk5DIHZpZXdlcnMuCi0KLSAgIEJUVywgd2hlbmV2ZXIgeW91IHJ1biB0d28gb3IgbW9yZSB4MTF2bmMncyBvbiB0aGUgc2FtZSBYIGRpc3BsYXkgYW5kCi0gICB1c2UgdGhlIEdVSSwgdGhlbiB0byBhdm9pZCBhbGwgb2YgdGhlIHgxMXZuYydzIHNpbXVsdGFuZW91c2x5Ci0gICBhbnN3ZXJpbmcgdGhlIGd1aSB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZSAiLWNvbm5lY3QgZmlsZTEKLSAgIC1ndWkgLi4uIiB3aXRoIGRpZmZlcmVudCBjb25uZWN0IGZpbGVzIGZvciBlYWNoIHgxMXZuYyB5b3Ugd2FudCB0bwotICAgY29udHJvbCB2aWEgdGhlIGd1aSAob3IgcmVtb3RlLWNvbnRyb2wuKSBUaGUgIi1jb25uZWN0IGZpbGUxIiB1c2FnZQotICAgZ2l2ZXMgc2VwYXJhdGUgY29tbXVuaWNhdGlvbiBjaGFubmVscyBiZXR3ZWVuIGEgeDExdm5jIHByb2Nlc3MgYW5kIHRoZQotICAgZ3VpIHByb2Nlc3MuIE90aGVyd2lzZSB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBYIHByb3BlcnR5IGNoYW5uZWxzOgotICAgVk5DX0NPTk5FQ1QgYW5kIFgxMVZOQ19SRU1PVEUuCi0KLSAgIFVwZGF0ZTogQXMgb2YgTWFyLzIwMDUgeDExdm5jIG5vdyBzY2FsZXMgdGhlIG1vdXNlIGN1cnNvciB3aXRoIHRoZQotICAgc2FtZSBzY2FsZSBmYWN0b3IgYXMgdGhlIHNjcmVlbi4gSWYgeW91IGRvbid0IHdhbnQgdGhhdCwgdXNlIHRoZQotICAgIi1zY2FsZV9jdXJzb3IgZnJhYyIgb3B0aW9uIHRvIHNldCB0aGUgY3Vyc29yIHNjYWxpbmcgdG8gYSBkaWZmZXJlbnQKLSAgIGZhY3RvciAoZS5nLiB1c2UgIi1zY2FsZV9jdXJzb3IgMSIgdG8ga2VlcCB0aGUgY3Vyc29yIGF0IGl0cyBuYXR1cmFsCi0gICB1bnNjYWxlZCBzaXplLikKLQotCi0gICBRLTEwMTogRG9lcyB4MTF2bmMgd29yayB3aXRoIFhpbmVyYW1hPyAoaS5lLiBtdWx0aXBsZSBtb25pdG9ycyBqb2luZWQKLSAgIHRvZ2V0aGVyIHRvIGZvcm0gb25lIGJpZywgc2luZ2xlIHNjcmVlbi4pCi0KLSAgIFllcywgaXQgc2hvdWxkIGdlbmVyYWxseSB3b3JrIGJlY2F1c2UgaXQgc2ltcGx5IHBvbGxzIHRoZSBiaWcKLSAgIGVmZmVjdGl2ZSBzY3JlZW4uCi0KLSAgIElmIHRoZSB2aWV3aW5nLWVuZCBtb25pdG9yIGlzIG5vdCBhcyBiaWcgYXMgdGhlIHJlbW90ZSBYaW5lcmFtYQotICAgZGlzcGxheSwgdGhlbiB0aGUgdm5jdmlld2VyIHNjcm9sbGJhcnMsIGV0Yywgd2lsbCBoYXZlIHRvIGJlIHVzZWQgdG8KLSAgIHBhbiBhY3Jvc3MgdGhlIGxhcmdlIGFyZWEuIEhvd2V2ZXIgb25lIHVzZXIgc3RhcnRlZCB0d28geDExdm5jJ3MsIG9uZQotICAgd2l0aCAiLWNsaXAgMTI4MHgxMDI0KzArMCIgYW5kIHRoZSBvdGhlciB3aXRoICItY2xpcCAxMjgweDEwMjQrMTI4MCswIgotICAgdG8gc3BsaXQgdGhlIGJpZyBzY3JlZW4gaW50byB0d28gYW5kIHVzZWQgdHdvIFZOQyB2aWV3ZXJzIHRvIGFjY2VzcwotICAgdGhlbS4KLQotICAgQXMgb2YgSnVuLzIwMDg6IFVzZSAiLWNsaXAgeGluZXJhbWEwIiB0byBjbGlwIHRvIHRoZSBmaXJzdCB4aW5lcmFtYQotICAgc3ViLXNjcmVlbiAoaWYgeGluZXJhbWEgaXMgYWN0aXZlLikgeGluZXJhbWExIGZvciB0aGUgMm5kIHN1Yi1zY3JlZW4sCi0gICBldGMuIFRoaXMgd2F5IHlvdSBkb24ndCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIFd4SCtYK1kgb2YgdGhlIGRlc2lyZWQKLSAgIHhpbmVyYW1hIHN1Yi1zY3JlZW4uIHNjcmVlbnMgYXJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20KLSAgIHRoZSAoMCwwKSBvcmlnaW4gKEkuZS4gbm90IHRoZSBYc2VydmVyJ3Mgb3JkZXIuKQotCi0gICBUaGVyZSBhcmUgYSBjb3VwbGUgcG90ZW50aWFsIGlzc3VlcyB3aXRoIFhpbmVyYW1hIGhvd2V2ZXIuIElmIHRoZQotICAgc2NyZWVuIGlzIG5vdCByZWN0YW5ndWxhciAoZS5nLiAxMjgweDEwMjQgYW5kIDEwMjR4NzY4IG1vbml0b3JzIGpvaW5lZAotICAgdG9nZXRoZXIpLCB0aGVuIHRoZXJlIHdpbGwgYmUgIm5vbi1leGlzdGVudCIgYXJlYXMgb24gdGhlIHNjcmVlbi4gVGhlCi0gICBYIHNlcnZlciB3aWxsIHJldHVybiAiZ2FyYmFnZSIgaW1hZ2UgZGF0YSBmb3IgdGhlc2UgYXJlYXMgYW5kIHNvIHRoZXkKLSAgIG1heSBiZSBkaXN0cmFjdGluZyB0byB0aGUgdmlld2VyLiBUaGUgLWJsYWNrb3V0IHgxMXZuYyBvcHRpb24gYWxsb3dzCi0gICB5b3UgdG8gYmxhY2tlbi1vdXQgcmVjdGFuZ2xlcyBieSBtYW51YWxseSBzcGVjaWZ5aW5nIHRoZWlyIFd4SCtYK1kKLSAgIGdlb21ldHJpZXMuIElmIHlvdXIgc3lzdGVtIGhhcyB0aGUgbGliWGluZXJhbWEgbGlicmFyeSwgdGhlIC14aW5lcmFtYQotICAgeDExdm5jIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBoYXZlIGl0IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZQotICAgcmVjdGFuZ2xlcyB0byBiZSBibGFja2VuZWQgb3V0LiAoTm90ZSBvbiA4YnBwIFBzZXVkb0NvbG9yIGRpc3BsYXlzIHRoZQotICAgZmlsbCBjb2xvciBtYXkgbm90IGJlIGJsYWNrLikgVXBkYXRlOiAteGluZXJhbWEgaXMgbm93IG9uIGJ5IGRlZmF1bHQuCi0KLSAgIFNvbWUgdXNlcnMgaGF2ZSByZXBvcnRlZCB0aGF0IHRoZSBtb3VzZSBkb2VzIG5vdCBiZWhhdmUgcHJvcGVybHkgZm9yCi0gICB0aGVpciBYaW5lcmFtYSBkaXNwbGF5OiBpLmUuIHRoZSBtb3VzZSBjYW5ub3QgYmUgbW92ZWQgdG8gYWxsIHJlZ2lvbnMKLSAgIG9mIHRoZSBsYXJnZSBkaXNwbGF5LiBJZiB0aGlzIGhhcHBlbnMgdHJ5IHVzaW5nIHRoZSAteHdhcnBwb2ludGVyCi0gICBvcHRpb24uIFRoaXMgaW5zdHJ1Y3RzIHgxMXZuYyB0byBmYWtlIG1vdXNlIHBvaW50ZXIgbW90aW9ucyB1c2luZyB0aGUKLSAgIFhXYXJwUG9pbnRlciBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBYVGVzdEZha2VNb3Rpb25FdmVudCBYVEVTVAotICAgZnVuY3Rpb24uIChUaGlzIG1heSBiZSBkdWUgdG8gYSBidWcgaW4gdGhlIFggc2VydmVyIGZvciBYVEVTVCB3aGVuCi0gICBYaW5lcmFtYSBpcyBlbmFibGVkLikgVXBkYXRlOiBBcyBvZiBEZWMvMjAwNiAteHdhcnBwb2ludGVyIHdpbGwgYmUKLSAgIGFwcGxpZWQgYXV0b21hdGljYWxseSBpZiBYaW5lcmFtYSBpcyBkZXRlY3RlZC4gVG8gZGlzYWJsZSB1c2U6Ci0gICAtbm94d2FycHBvaW50ZXIKLQotCi0gICBRLTEwMjogQ2FuIEkgdXNlIHgxMXZuYyBvbiBhIG11bHRpLWhlYWRlZCBkaXNwbGF5IHRoYXQgaXMgbm90IFhpbmVyYW1hCi0gICAoaS5lLiBzZXBhcmF0ZSBzY3JlZW5zIDowLjAsIDowLjEsIC4uLiBmb3IgZWFjaCBtb25pdG9yKT8KLQotICAgWW91IGNhbiwgYnV0IGl0IGlzIGEgbGl0dGxlIGJpdCBhd2t3YXJkOiB5b3UgbXVzdCBzdGFydCBzZXBhcmF0ZQotICAgeDExdm5jIHByb2Nlc3NlcyBmb3IgZWFjaCBzY3JlZW4sIGFuZCBvbiB0aGUgdmlld2luZyBlbmQgc3RhcnQgdXAKLSAgIHNlcGFyYXRlIFZOQyB2aWV3ZXIgcHJvY2Vzc2VzIGNvbm5lY3RpbmcgdG8gdGhlbS4gZS5nLiBvbiB0aGUgcmVtb3RlCi0gICBlbmQ6Ci0gIHgxMXZuYyAtZGlzcGxheSA6MC4wIC1iZyAtcSAtcmZicG9ydCA1OTAwCi0gIHgxMXZuYyAtZGlzcGxheSA6MC4xIC1iZyAtcSAtcmZicG9ydCA1OTAxCi0KLSAgICh0aGlzIGNvdWxkIGJlIGF1dG9tYXRlZCBpbiB0aGUgZGlzcGxheSBtYW5hZ2VyIFhzZXR1cCBmb3IgZXhhbXBsZSkKLSAgIGFuZCB0aGVuIG9uIHRoZSBsb2NhbCBtYWNoaW5lIHdoZXJlIHlvdSBhcmUgc2l0dGluZzoKLSAgdm5jdmlld2VyIHNvbWVob3N0OjAgJgotICB2bmN2aWV3ZXIgc29tZWhvc3Q6MSAmCi0KLSAgIE5vdGU6IGlmIHlvdSBhcmUgcnVubmluZyBvbiBTb2xhcmlzIDggb3IgZWFybGllciB5b3UgY2FuIGVhc2lseSBoaXQgdXAKLSAgIGFnYWluc3QgdGhlIG1heGltdW0gb2YgNiBzaG0gc2VnbWVudHMgcGVyIHByb2Nlc3MgKGZvciBYc3VuIGluIHRoaXMKLSAgIGNhc2UpIGZyb20gcnVubmluZyBtdWx0aXBsZSB4MTF2bmMgcHJvY2Vzc2VzLiBZb3Ugc2hvdWxkIG1vZGlmeQotICAgL2V0Yy9zeXN0ZW0gYXMgbWVudGlvbmVkIGluIGFub3RoZXIgRkFRIHRvIGluY3JlYXNlIHRoZSBsaW1pdC4gSXQgaXMKLSAgIHByb2JhYmx5IGFsc28gYSBnb29kIGlkZWEgdG8gcnVuIHdpdGggdGhlIC1vbmV0aWxlIG9wdGlvbiBpbiB0aGlzIGNhc2UKLSAgICh0byBsaW1pdCBlYWNoIHgxMXZuYyB0byAzIHNobSBzZWdtZW50cyksIG9yIGV2ZW4gLW5vc2htIHRvIHVzZSBubyBzaG0KLSAgIHNlZ21lbnRzLgotCi0KLSAgIFEtMTAzOiBDYW4geDExdm5jIHNob3cgb25seSBhIHBvcnRpb24gb2YgdGhlIGRpc3BsYXk/IChFLmcuIGZvciBhCi0gICBzcGVjaWFsIHB1cnBvc2UgYXBwbGljYXRpb24gb3IgYSB2ZXJ5IGxhcmdlIHNjcmVlbi4pCi0KLSAgIEFzIG9mIE1hci8yMDA1IHgxMXZuYyBoYXMgdGhlICItY2xpcCBXeEgrWCtZIiBvcHRpb24gdG8gc2VsZWN0IGEKLSAgIHJlY3RhbmdsZSBvZiB3aWR0aCBXLCBoZWlnaHQgSCBhbmQgb2Zmc2V0IChYLCBZKS4gVGh1cyB0aGUgVk5DIHNjcmVlbgotICAgd2lsbCBiZSB0aGUgY2xpcHBlZCBzdWItcmVnaW9uIG9mIHRoZSBkaXNwbGF5IGFuZCBiZSBvbmx5IFd4SCBpbiBzaXplLgotICAgT25lIHVzZXIgdXNlZCAtY2xpcCB0byBzcGxpdCB1cCBhIGxhcmdlIFhpbmVyYW1hIHNjcmVlbiBpbnRvIHR3byBtb3JlCi0gICBtYW5hZ2FibGUgc21hbGxlciBzY3JlZW5zLgotCi0gICBUaGlzIGFsc28gd29ya3MgdG8gdmlldyBhIHN1Yi1yZWdpb24gb2YgYSBzaW5nbGUgYXBwbGljYXRpb24gd2luZG93IGlmCi0gICB0aGUgLWlkIG9yIC1zaWQgb3B0aW9ucyBhcmUgdXNlZC4gVGhlIG9mZnNldCBpcyBtZWFzdXJlZCBmcm9tIHRoZQotICAgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNlbGVjdGVkIHdpbmRvdy4KLQotCi0gICBRLTEwNDogRG9lcyB4MTF2bmMgc3VwcG9ydCB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlIGFuZAotICAgUmVmbGVjdGlvbikgZXh0ZW5zaW9uPyBXaGVuZXZlciBJIHJvdGF0ZSBvciByZXNpemUgdGhlIHNjcmVlbiB4MTF2bmMKLSAgIGp1c3Qgc2VlbXMgdG8gY3Jhc2guCi0KLSAgIEFzIG9mIERlYy8yMDA0IHgxMXZuYyBzdXBwb3J0cyBYUkFORFIuIFlvdSBlbmFibGUgaXQgd2l0aCB0aGUgLXhyYW5kcgotICAgb3B0aW9uIHRvIG1ha2UgeDExdm5jIG1vbml0b3IgWFJBTkRSIGV2ZW50cyBhbmQgYWxzbyB0cmFwIFggc2VydmVyCi0gICBlcnJvcnMgaWYgdGhlIHNjcmVlbiBjaGFuZ2Ugb2NjdXJyZWQgaW4gdGhlIG1pZGRsZSBvZiBhbiBYIGNhbGwgbGlrZQotICAgWEdldEltYWdlLiBPbmNlIGl0IHRyYXBzIHRoZSBzY3JlZW4gY2hhbmdlIGl0IHdpbGwgY3JlYXRlIGEgbmV3Ci0gICBmcmFtZWJ1ZmZlciB1c2luZyB0aGUgbmV3IHNjcmVlbi4KLQotICAgSWYgdGhlIGNvbm5lY3RlZCB2bmMgdmlld2VycyBzdXBwb3J0IHRoZSBOZXdGQlNpemUgVk5DIGV4dGVuc2lvbgotICAgKFdpbmRvd3MgVGlnaHRWTkMgdmlld2VyIGFuZCBSZWFsVk5DIDQuMCB3aW5kb3dzIGFuZCBVbml4IHZpZXdlcnMgZG8pCi0gICB0aGVuIHRoZSB2aWV3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2l6ZS4gT3RoZXJ3aXNlLCB0aGUgbmV3Ci0gICBmcmFtZWJ1ZmZlciBpcyBmaXQgYXMgYmVzdCBhcyBwb3NzaWJsZSBpbnRvIHRoZSBvcmlnaW5hbCB2aWV3ZXIgc2l6ZQotICAgKHBvcnRpb25zIG9mIHRoZSBzY3JlZW4gbWF5IGJlIGNsaXBwZWQsIHVudXNlZCwgZXRjLikgRm9yIHRoZXNlCi0gICB2aWV3ZXJzIHlvdSBjYW4gdHJ5IHRoZSAtcGFkZ2VvbSBvcHRpb24gdG8gbWFrZSB0aGUgcmVnaW9uIGJpZyBlbm91Z2gKLSAgIHRvIGhvbGQgYWxsIHJlc2l6ZXMgYW5kIHJvdGF0aW9ucy4gV2UgaGF2ZSBmaXhlZCB0aGlzIHByb2JsZW0gZm9yIHRoZQotICAgVGlnaHRWTkMgVmlld2VyIG9uIFVuaXg6IFNTVk5DCi0KLSAgIElmIHlvdSBzcGVjaWZ5ICIteHJhbmRyIG5ld2Zic2l6ZSIgdGhlbiB2bmMgdmlld2VycyB0aGF0IGRvIG5vdAotICAgc3VwcG9ydCBOZXdGQlNpemUgd2lsbCBiZSBkaXNjb25uZWN0ZWQgYmVmb3JlIHRoZSByZXNpemUuIElmIHlvdQotICAgc3BlY2lmeSAiLXhyYW5kciBleGl0IiB0aGVuIGFsbCB3aWxsIGJlIGRpc2Nvbm5lY3RlZCBhbmQgeDExdm5jIHdpbGwKLSAgIHRlcm1pbmF0ZS4KLQotCi0gICBRLTEwNTogSW5kZXBlbmRlbnQgb2YgYW55IFhSQU5EUiwgY2FuIEkgaGF2ZSB4MTF2bmMgcm90YXRlIGFuZC9vcgotICAgcmVmbGVjdCB0aGUgc2NyZWVuIHRoYXQgdGhlIFZOQyB2aWV3ZXJzIHNlZT8gKGUuZy4gZm9yIGEgaGFuZGhlbGQKLSAgIHdob3NlIHNjcmVlbiBpcyByb3RhdGVkIDkwIGRlZ3JlZXMuKQotCi0gICBBcyBvZiBKdWwvMjAwNiB0aGVyZSBpcyB0aGUgLXJvdGF0ZSBvcHRpb24gYWxsb3cgdGhpcy4gRS5nJ3M6ICItcm90YXRlCi0gICArOTAiLCAiLXJvdGF0ZSAtOTAiLCAiLXJvdGF0ZSB4IiwgZXRjLgotCi0KLSAgIFEtMTA2OiBXaHkgaXMgdGhlIHZpZXcgaW4gbXkgVk5DIHZpZXdlciBjb21wbGV0ZWx5IGJsYWNrPyBPciB3aHkgaXMKLSAgIGV2ZXJ5dGhpbmcgZmxhc2hpbmcgYXJvdW5kIHJhbmRvbWx5PwotCi0gICBTZWUgdGhlIG5leHQgRkFRIGZvciBhIHBvc3NpYmxlIGV4cGxhbmF0aW9uLgotCi0KLSAgIFEtMTA3OiBJIHVzZSBMaW51eCBWaXJ0dWFsIFRlcm1pbmFscyAoVlQncykgdG8gaW1wbGVtZW50ICdGYXN0IFVzZXIKLSAgIFN3aXRjaGluZycgYmV0d2VlbiB1c2Vycycgc2Vzc2lvbnMgKGUuZy4gQmV0dHkgaXMgb24gQ3RybC1BbHQtRjcsCi0gICBCb2JieSBpcyBvbiBDdHJsLUFsdC1GOCwgYW5kIFNpZCBpcyBvbiBDdHJsLUFsdC1GMTogdGhleSB1c2UgdGhvc2UKLSAgIGtleXN0cm9rZXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlaXIgc2Vzc2lvbnMuKSAgIEhvdyBjb21lIHRoZSB2aWV3IGluIGEKLSAgIFZOQyB2aWV3ZXIgY29ubmVjdGluZyB0byB4MTF2bmMgaXMgZWl0aGVyIGNvbXBsZXRlbHkgYmxhY2sgb3IKLSAgIG90aGVyd2lzZSBhbGwgbWVzc2VkIHVwIHVubGVzcyB0aGUgWCBzZXNzaW9uIHgxMXZuYyBpcyBhdHRhY2hlZCB0byBpcwotICAgaW4gdGhlIGFjdGl2ZSBWVD8KLQotICAgVGhpcyBzZWVtcyB0byBoYXZlIHRvIGRvIHdpdGggaG93IGFwcGxpY2F0aW9ucyAodGhlIFggc2VydmVyIHByb2Nlc3NlcwotICAgaW4gdGhpcyBjYXNlKSBtdXN0ICJwbGF5IG5pY2VseSIgaWYgdGhleSBhcmUgbm90IG9uIHRoZSBhY3RpdmUgVlQKLSAgIChzb21ldGltZXMgY2FsbGVkIFZDIGZvciB2aXJ0dWFsIGNvbnNvbGUuKSBUaGF0IGlzLCB0aGV5IHNob3VsZCBub3QKLSAgIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQgb3IgbW91c2Ugb3IgbWFuYWdlIHRoZSB2aWRlbyBkaXNwbGF5IHVubGVzcwotICAgdGhleSBoYXZlIHRoZSBhY3RpdmUgVlQuIEdpdmVuIHRoYXQgaXQgYXBwZWFycyB0aGUgWEdldEltYWdlKCkgY2FsbAotICAgbXVzdCB1bHRpbWF0ZWx5IHJldHJpZXZlIHRoZSBmcmFtZWJ1ZmZlciBkYXRhIGZyb20gdGhlIHZpZGVvIGhhcmR3YXJlCi0gICBpdHNlbGYsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgeDExdm5jJ3MgcG9sbGluZyB3b3VsZG4ndCB3b3JrIHVubGVzcyB0aGUKLSAgIFggc2Vzc2lvbiBoYWQgYWN0aXZlIGNvbnRyb2wgb2YgdGhlIFZULgotCi0gICBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGFuIGVhc3kgd2F5IHRvIHdvcmsgYXJvdW5kIHRoaXMuIEV2ZW4geHdkKDEpCi0gICBkb2Vzbid0IHdvcmsgaW4gdGhpcyBjYXNlICh0cnkgaXQuKSBTb21ldGhpbmcgd291bGQgbmVlZCB0byBiZSBkb25lIGF0Ci0gICBhIGxvd2VyIGxldmVsLCBzYXkgaW4gdGhlIFhGcmVlODYvWG9yZyBYIHNlcnZlci4gQWxzbywgdXNpbmcgdGhlCi0gICBTaGFkb3cgRnJhbWVidWZmZXIgKGEgY29weSBvZiB0aGUgdmlkZW8gZnJhbWVidWZmZXIgaXMga2VwdCBpbiBtYWluCi0gICBtZW1vcnkpIGRvZXMgbm90IGFwcGVhciB0byBmaXggdGhlIHByb2JsZW0uCi0KLSAgIElmIG5vIG9uZSBpcyBzaXR0aW5nIGF0IHRoZSB3b3Jrc3RhdGlvbiBhbmQgeW91IGp1c3Qgd2FudCB0byByZW1vdGVseQotICAgc3dpdGNoIHRoZSBWVCBvdmVyIHRvIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWCBzZXNzaW9uIChzbwotICAgeDExdm5jIGNhbiBwb2xsIGl0IGNvcnJlY3RseSksIG9uZSBjYW4gdXNlIHRoZSBjaHZ0KDEpIGNvbW1hbmQsIGUuZy4KLSAgICJjaHZ0IDciIGZvciBWVCAjNy4KLQotCi0gICBRLTEwODogSSBhbSB1c2luZyB4MTF2bmMgd2hlcmUgbXkgbG9jYWwgbWFjaGluZSBoYXMgInBvcHVwL2hpZGRlbgotICAgdGFza2JhcnMiIGFuZCB0aGUgcmVtb3RlIGRpc3BsYXkgd2hlcmUgeDExdm5jIHJ1bnMgYWxzbyBoYXMKLSAgICJwb3B1cC9oaWRkZW4gdGFza2JhcnMiIGFuZCB0aGV5IGludGVyZmVyZSBhbmQgZmlnaHQgd2l0aCBlYWNoIG90aGVyLgotICAgV2hhdCBjYW4gSSBkbz8KLQotICAgV2hlbiB5b3UgbW92ZSB0aGUgbW91c2UgdG8gdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB3aGVyZSB0aGUgcG9wdXBzCi0gICBoYXBwZW4sIHRoZSB0YXNrYmFycyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIGluIHN0cmFuZ2Ugd2F5cy4gVGhpcwotICAgc29tZXRpbWVzIGhhcHBlbnMgd2hlcmUgdGhlIGxvY2FsIG1hY2hpbmUgaXMgR05PTUUgb3IgTWFjIE9TIFggYW5kIHRoZQotICAgcmVtb3RlIG1hY2hpbmUgaXMgR05PTUUuIElzIHRoZXJlIGEgd2F5IHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgb25lIG9yCi0gICBib3RoIG9mIHRoZXNlIG1hZ2ljIGRlc2t0b3AgdGFza2JhcnM/Ci0KLSAgIE9uZSB4MTF2bmMgdXNlciBzdWdnZXN0czogaXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCB0byByaWdodCBtb3VzZQotICAgY2xpY2sgb24gdGhlIHRhc2sgYmFyIHBhbmVsLCBhbmQgdW5jaGVjayAiZW5hYmxlIGF1dG8taGlkZSIgZnJvbSB0aGUKLSAgIHBhbmVsIHByb3BlcnRpZXMgZGlhbG9nIGJveC4gVGhpcyB3aWxsIG1ha2UgdGhlIHBhbmVsIGFsd2F5cyB2aXNpYmxlLgotCi0gICBRLTEwOTogSGVscCEgeDExdm5jIGFuZCBteSBLREUgc2NyZWVuc2F2ZXIga2VlcCBzd2l0Y2hpbmcgZWFjaCBvdGhlcgotICAgb24gYW5kIG9mZiBldmVyeSBmZXcgc2Vjb25kcy4KLQotICAgVGhpcyBpcyBhIG5ldyAoSnVsLzIwMDYpIHByb2JsZW0gc2Vlbiwgc2F5LCBvbiB0aGUgdmVyc2lvbiBvZiBLREUgdGhhdAotICAgaXMgc2hpcHBlZCB3aXRoIFN1U0UgMTAuMS4gSXQgaXMgbm90IHlldCBjbGVhciB3aGF0IGlzIGNhdXNpbmcgdGhpcy4uLgotICAgSWYgeW91IG1vdmUgdGhlIG1vdXNlIHRocm91Z2ggeDExdm5jIHRoZSBzY3JlZW5zYXZlciBzaHV0cyBvZmYgbGlrZSBpdAotICAgc2hvdWxkIGJ1dCB0aGVuIGEgc2Vjb25kIG9yIHR3byBhZnRlciB5b3Ugc3RvcCBtb3ZpbmcgdGhlIG1vdXNlIHRoZQotICAgc2NyZWVuc2F2ZXIgc25hcHMgYmFjayBvbi4KLQotICAgVGhpcyBtYXkgYmUgYSBidWcgaW4ga2Rlc2t0b3BfbG9jay4gRm9yIG5vdyB0aGUgb25seSB3b3JrYXJvdW5kIGlzIHRvCi0gICBkaXNhYmxlIHRoZSBzY3JlZW5zYXZlci4gWW91IGNhbiB0cnkgdXNpbmcgYW5vdGhlciBvbmUgc3VjaCBhcwotICAgc3RyYWlnaHQgeHNjcmVlbnNhdmVyIChzZWUgdGhlIGluc3RydWN0aW9ucyBoZXJlIGZvciBob3cgdG8gZGlzYWJsZQotICAga2Rlc2t0b3BfbG9jay4pIElmIHlvdSBoYXZlIG1vcmUgaW5mbyBvbiB0aGlzIG9yIHNlZSBpdCBvdXRzaWRlIG9mIEtERQotICAgcGxlYXNlIGxldCB1cyBrbm93LgotCi0gICBVcGRhdGU6IEl0IGFwcGVhcnMgdGhpcyBpcyBkdWUgdG8ga2Rlc2t0b3BfbG9jayBlbmFibGluZyB0aGUgc2NyZWVuCi0gICBzYXZlciB3aGVuIHRoZSBNb25pdG9yIGlzIGluIERQTVMgbG93LXBvd2VyIHN0YXRlIChlLmcuIHN0YW5kYnksCi0gICBzdXNwZW5kLCBvciBvZmYuKSBJbiBOb3YvMjAwNiB0aGUgeDExdm5jIC1ub2RwbXMgb3B0aW9uIHdhcyBhZGRlZCBhcyBhCi0gICB3b3JrYXJvdW5kLiBOb3JtYWxseSBpdCBpcyBhIGdvb2QgdGhpbmcgdGhhdCB0aGUgbW9uaXRvciBwb3dlcnMgZG93bgotICAgKHNpbmNlIHgxMXZuYyBjYW4gc3RpbGwgcG9sbCB0aGUgZnJhbWVidWZmZXIgaW4gdGhpcyBzdGF0ZSksIGJ1dCBpZgotICAgeW91IGV4cGVyaWVuY2UgdGhlIGtkZXNrdG9wX2xvY2sgcHJvYmxlbSB5b3UgY2FuIHNwZWNpZnkgdGhlICItbm9kcG1zIgotICAgb3B0aW9uIHRvIGtlZXAgdGhlIE1vbml0b3Igb3V0IG9mIGxvdyBwb3dlciBzdGF0ZSB3aGlsZSBWTkMgY2xpZW50cwotICAgYXJlIGNvbm5lY3RlZC4gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgdHlwaW5nICJ4c2V0IGRwbXMgZm9yY2UKLSAgIG9uIiBwZXJpb2RpY2FsbHkuIChpZiB5b3UgZG9uJ3Qgd2FudCB0byBkbyB0aGVzZSB0aGluZ3MganVzdCBkaXNhYmxlCi0gICB0aGUgc2NyZWVuc2F2ZXIuKSBGZWVsIGZyZWUgdG8gZmlsZSBhIGJ1ZyBhZ2FpbnN0IGtkZXNrdG9wX2xvY2sgd2l0aAotICAgS0RFLgotCi0gICBRLTExMDogSSBhbSBydW5uaW5nIHRoZSBjb21waXogM0Qgd2luZG93IG1hbmFnZXIgKG9yIGJlcnlsLCBNeXRoVHYsCi0gICBHb29nbGUgRWFydGgsIG9yIHNvbWUgb3RoZXIgT3BlbkdMIGFwcCkgYW5kIEkgZG8gbm90IGdldCBzY3JlZW4KLSAgIHVwZGF0ZXMgaW4geDExdm5jLgotCi0gICBUaGlzIGFwcGVhcnMgdG8gYmUgYmVjYXVzZSB0aGUgM0QgT3BlbkdML0dMWCBoYXJkd2FyZSBzY3JlZW4gdXBkYXRlcwotICAgZG8gbm90IGdldCByZXBvcnRlZCB2aWEgdGhlIFhEQU1BR0UgbWVjaGFuaXNtLiBTbyB0aGlzIGlzIGEgYnVnIGluCi0gICBjb21waXovYmVyeWwgb3IgWERBTUFHRS9Yb3JnIG9yIHRoZSAocG9zc2libHkgM3JkIHBhcnR5KSB2aWRlbyBjYXJkCi0gICBkcml2ZXIuCi0KLSAgIEFzIGEgd29ya2Fyb3VuZCBhcHBseSB0aGUgLW5veGRhbWFnZSBvcHRpb24uIEFzIG9mIEZlYi8yMDA3IHgxMXZuYwotICAgd2lsbCB0cnkgdG8gYXV0b2RldGVjdCB0aGUgcHJvYmxlbSBhbmQgZGlzYWJsZSBYREFNQUdFIGlmIGlzIGFwcGVhcnMKLSAgIHRvIGJlIG1pc3NpbmcgYSBsb3Qgb2YgdXBkYXRlcy4gQnV0IGlmIHlvdSBrbm93IHlvdSBhcmUgdXNpbmcgY29tcGl6Ci0gICB5b3UgbWlnaHQgYXMgd2VsbCBhbHdheXMgc3VwcGx5IC1ub3hkYW1hZ2UuIFRoYW5rcyB0byB0aGlzIHVzZXIgd2hvCi0gICByZXBvcnRlZCB0aGUgcHJvYmxlbSBhbmQgZGlzY292ZXJlZCB0aGUgd29ya2Fyb3VuZC4KLQotICAgQSBkZXZlbG9wZXIgZm9yIE1pbmlNeXRoIHJlcG9ydHMgdGhhdCB0aGUgJ2FscGhhcHVsc2UnIHRhZyBvZiB0aGUKLSAgIHRoZW1lIEcuQS5OLlQuIGNhbiBhbHNvIGNhdXNlIHByb2JsZW1zLCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbgotICAgdXNpbmcgVk5DLgotCi0gICBQbGVhc2UgcmVwb3J0IGEgYnVnIG9yIGNvbXBsYWludCB0byBCZXJ5bC9Db21waXogYW5kL29yIFhvcmcgYWJvdXQKLSAgIHRoaXM6IHJ1bm5pbmcgeDExdm5jIHdpdGggLW5veGRhbWFnZSBkaXNhYmxlcyBhIG5pY2UgaW1wcm92ZW1lbnQgaW4KLSAgIHJlc3BvbnNpdmVuZXNzIChlc3BlY2lhbGx5IGZvciB0eXBpbmcpIGFuZCBhbHNvIGxlYWRzIHRvIHVubmVjZXNzYXJ5Ci0gICBDUFUgYW5kIG1lbW9yeSBJL08gbG9hZCBkdWUgdG8gdGhlIGV4dHJhIHBvbGxpbmcuCi0KLSAgIFVwZGF0ZTogYXMgb2YgTWF5LzIwMTAgTlZJRElBIG1heSBoYXZlIGZpeGVkIHRoaXMgcHJvYmxlbSBpbiB0aGVpcgotICAgcHJvcHJpZXRhcnkgZHJpdmVycy4gU2VlIHRoZSBOVklESUEgUmVsZWFzZSBOb3Rlcy4gKGxvb2sgZm9yCi0gICAneDExdm5jJy4pCi0KLSAgIFEtMTExOiBDYW4gSSB1c2UgeDExdm5jIHRvIHZpZXcgbXkgVk1XYXJlIHNlc3Npb24gcmVtb3RlbHk/Ci0KLSAgIFllcywgc2luY2UgVk1XYXJlIHVzdWFsbHkgcnVucyBhcyBhbiBYIGFwcGxpY2F0aW9uIHlvdSBjYW4gdmlldyBpdCB2aWEKLSAgIHgxMXZuYyBpbiB0aGUgbm9ybWFsIHdheS4KLQotICAgTm90ZSB0aGF0IFZNV2FyZSBoYXMgc2V2ZXJhbCB2aWV3aW5nIG1vZGVzOgotICAgICAqIE5vcm1hbCBYIGFwcGxpY2F0aW9uIHdpbmRvdyAgKHdpdGggd2luZG93IG1hbmFnZXIgZnJhbWUpCi0gICAgICogUXVpY2stU3dpdGNoIG1vZGUgICh3aXRoIG5vIHdpbmRvdyBtYW5hZ2VyIGZyYW1lKQotICAgICAqIEZ1bGxzY3JlZW4gbW9kZQotCi0gICBUaGUgd2F5IFZNV2FyZSBkb2VzIEZ1bGxzY3JlZW4gbW9kZSBvbiBMaW51eCBpcyB0byBkaXNwbGF5IHRoZSBHdWVzdAotICAgZGVza3RvcCBpbiBhIHNlcGFyYXRlIFZpcnR1YWwgVGVybWluYWwgKGUuZy4gVlQgOCkgKHNlZSB0aGlzIEZBUSBvbgotICAgVlQncyBmb3IgYmFja2dyb3VuZC4pIFVuZm9ydHVuYXRlbHksIHRoaXMgRnVsbHNjcmVlbiBWVCBpcyBub3QgYW4gWAotICAgc2VydmVyLiBTbyB4MTF2bmMgY2Fubm90IGFjY2VzcyBpdCAoaG93ZXZlciwgc2VlIHRoaXMgZGlzY3Vzc2lvbiBvZgotICAgLXJhd2ZiIGZvciBhIHBvc3NpYmxlIHdvcmthcm91bmQuKSB4MTF2bmMgd29ya3MgZmluZSB3aXRoICJOb3JtYWwgWAotICAgYXBwbGljYXRpb24gd2luZG93IiBhbmQgIlF1aWNrLVN3aXRjaCBtb2RlIiBiZWNhdXNlIHRoZXNlIHVzZSBYLgotCi0gICBVcGRhdGU6IEl0IGFwcGVhcnMgdGhlIGluIFZNV2FyZSA1LnggdGhlIEZ1bGxzY3JlZW4gbW9kZSBpcyBYLCBzbwotICAgeDExdm5jIGFjY2VzcyBkb2VzIHdvcmsuCi0KLSAgIE9uZSB1c2VyIHJlcG9ydHMgaGUgbGVmdCBoaXMgbWFjaGluZSB3aXRoIFZNV2FyZSBpbiB0aGUgRnVsbHNjcmVlbgotICAgbW9kZSwgYW5kIGV2ZW4gdGhvdWdoIGhpcyBYIHNlc3Npb24gd2Fzbid0IGluIHRoZSBhY3RpdmUgVlQsIGhlIGNvdWxkCi0gICBzdGlsbCBjb25uZWN0IHgxMXZuYyB0byB0aGUgWCBzZXNzaW9uIGFuZCBwYXNzIHRoZSBrZXlzdHJva2VzIEN0cmwtQWx0Ci0gICAodHlwaW5nICJibGluZCIpIHRvIHRoZSBWTVdhcmUgWCBhcHAuIFRoaXMgaW5kdWNlZCBWTVdhcmUgdG8gc3dpdGNoCi0gICBvdXQgb2YgRnVsbHNjcmVlbiBpbnRvIE5vcm1hbCBYIG1vZGUgYW5kIGhlIGNvdWxkIGNvbnRpbnVlIHdvcmtpbmcgaW4KLSAgIHRoZSBHdWVzdCBkZXNrdG9wIHJlbW90ZWx5LgotCi0KLSAgIEFzaWRlOiBTb21ldGltZXMgaXQgaXMgY29udmVuaWVudCAoZm9yIHBlcmZvcm1hbmNlLCBldGMuKSB0byBzdGFydAotICAgVk1XYXJlIGluIGl0cyBvd24gWCBzZXNzaW9uIHVzaW5nIHN0YXJ0eCgxKS4gVGhpcyBjYW4gYmUgdXNlZCB0byBoYXZlCi0gICBhIG1pbmltYWwgd2luZG93IG1hbmdlciAoZS5nLiB0d20gb3IgZXZlbiBubyB3aW5kb3cgbWFuYWdlciksIHRvCi0gICBpbXByb3ZlIHJlc3BvbnNlLiBPbmUgY2FuIGFsc28gY3V0IHRoZSBkaXNwbGF5IGRlcHRoIChlLmcuIHRvIDE2YnBwKQotICAgaW4gdGhpcyAybmQgWCBzZXNzaW9uIHRvIGltcHJvdmUgdmlkZW8gcGVyZm9ybWFuY2UuIFRoaXMgMm5kIFggc2Vzc2lvbgotICAgZW11bGF0ZXMgRnVsbHNjcmVlbiBtb2RlIHRvIHNvbWUgZGVncmVlIGFuZCBjYW4gYmUgdmlld2VkIHZpYSB4MTF2bmMKLSAgIGFzIGxvbmcgYXMgdGhlIFZNV2FyZSBYIHNlc3Npb24gaXMgaW4gdGhlIGFjdGl2ZSBWVC4KLQotICAgQWxzbyBub3RlIHRoYXQgd2l0aCBhIGxpdHRsZSBiaXQgb2YgcGxheWluZyB3aXRoICJ4d2luaW5mbyAtYWxsCi0gICAtY2hpbGRyZW4iIG91dHB1dCBvbmUgY2FuIGV4dHJhY3QgdGhlIChub24tdG9wbGV2ZWwpIHdpbmRvdy1pZCBvZiB0aGUKLSAgIG9mIHRoZSBHdWVzdCBkZXNrdG9wIG9ubHkgd2hlbiBWTVdhcmUgaXMgcnVubmluZyBhcyBhIG5vcm1hbCBYCi0gICBhcHBsaWNhdGlvbi4gVGhlbiBvbmUgY2FuIGV4cG9ydCBqdXN0IHRoZSBndWVzdCBkZXNrdG9wIChpLmUuIHdpdGhvdXQKLSAgIHRoZSBWTVdhcmUgbWVudSBidXR0b25zKSBieSB1c2Ugb2YgdGhlIC1pZCB3aW5kb3dpZCBvcHRpb24uIFRoZQotICAgY2F2ZWF0cyBhcmUgdGhlIFggc2Vzc2lvbiBWTVdhcmUgaXMgaW4gbXVzdCBiZSBpbiB0aGUgYWN0aXZlIFZUIGFuZAotICAgdGhlIHdpbmRvdyBtdXN0IGJlIGZ1bGx5IHZpc2libGUsIHNvIHRoaXMgbW9kZSBpcyBub3QgdGVycmlibHkKLSAgIGNvbnZlbmllbnQsIGJ1dCBjb3VsZCBiZSB1c2VmdWwgaW4gc29tZSBjaXJjdW1zdGFuY2VzIChlLmcuIHJ1bm5pbmcKLSAgIFZNV2FyZSBvbiBhIHZlcnkgcG93ZXJmdWwgc2VydmVyIG1hY2hpbmUgaW4gYSBzZXJ2ZXIgcm9vbSB0aGF0IGhhcHBlbnMKLSAgIHRvIGhhdmUgYSB2aWRlbyBjYXJkLCAoYnV0IG5lZWQgbm90IGhhdmUgYSBtb25pdG9yLCBLZXlib2FyZCBvcgotICAgbW91c2UpLikKLQotCi0KLSAgIFtFeHBvcnRpbmcgbm9uLVgxMSBkZXZpY2VzIHZpYSBWTkNdCi0KLSAgIFEtMTEyOiBDYW4gbm9uLVggZGV2aWNlcyAoZS5nLiBhIHJhdyBmcmFtZWJ1ZmZlcikgYmUgdmlld2VkIChhbmQgZXZlbgotICAgY29udHJvbGxlZCkgdmlhIFZOQyB3aXRoIHgxMXZuYz8KLQotICAgQXMgb2YgQXByLzIwMDUgdGhlcmUgaXMgc3VwcG9ydCBmb3IgdGhpcy4gVHdvIG9wdGlvbnMgd2VyZSBhZGRlZDoKLSAgICItcmF3ZmIgc3RyaW5nIiAodG8gaW5kaWNhdGUgdGhlIHJhdyBmcmFtZSBidWZmZXIgZGV2aWNlLCBmaWxlLCBldGMuCi0gICBhbmQgaXRzIHBhcmFtZXRlcnMpIGFuZCAiLXBpcGVpbnB1dCBjb21tYW5kIiAodG8gcHJvdmlkZSBhbiBleHRlcm5hbAotICAgcHJvZ3JhbSB0aGF0IHdpbGwgaW5qZWN0IG9yIG90aGVyd2lzZSBwcm9jZXNzIG1vdXNlIGFuZCBrZXlzdHJva2UKLSAgIGlucHV0LikgU29tZSB1c2VmdWwgLXBpcGVpbnB1dCBzY2hlbWVzLCBWSUQsIENPTlNPTEUsIGFuZCBVSU5QVVQsIGhhdmUKLSAgIHNpbmNlIGJlZW4gYnVpbHQgaW50byB4MTF2bmMgZm9yIGNvbnZlbmllbmNlLgotCi0gICBUaGlzIG5vbi1YIG1vZGUgZm9yIHgxMXZuYyBpcyBzb21ld2hhdCBleHBlcmltZW50YWwgYmVjYXVzZSBpdCBpcyBzbwotICAgcmVtb3ZlZCBpbiBzY29wZSBmcm9tIHRoZSBpbnRlbmRlZCB1c2FnZSBvZiB0aGUgdG9vbC4gSW5jb21wbGV0ZQotICAgYXR0ZW1wdCBpcyBtYWRlIHRvIG1ha2UgYWxsIG9mIHRoZSBvdGhlciBvcHRpb25zIGNvbnNpc3RlbnQgd2l0aCBub24tWAotICAgZnJhbWVidWZmZXIgcG9sbGluZy4gU28gYWxsIG9mIHRoZSBYLXJlbGF0ZWQgb3B0aW9ucyAoZS5nLgotICAgLWFkZF9rZXlzeW1zLCAteGtiKSBhcmUganVzdCBpZ25vcmVkIG9yIG1heSBjYXVzZSBhbiBlcnJvciBpZiB1c2VkLiBCZQotICAgY2FyZWZ1bCBhcHBseWluZyBzdWNoIGFuIG9wdGlvbiB2aWEgcmVtb3RlIGNvbnRyb2wuCi0KLSAgIFRoZSBmb3JtYXQgZm9yIHRoZSAtcmF3ZmIgc3RyaW5nIGlzOgotICAgIC1yYXdmYiA8dHlwZT46PG9iamVjdD5APFc+eDxIPng8YnBwPlstPEJQTD5dWzo8Uj4vPEc+LzxCPl1bKzxvZmZzZXQ+XQotCi0gICBUaGVyZSBhcmUgYWxzbyBzb21lIHVzZWZ1bCBhbGlhc2VzIChlLmcuICJjb25zb2xlIi4pIFNvbWUgZXhhbXBsZXM6Ci0gICAgLXJhd2ZiIHNobToyMTAzMzc5MzNAODAweDYwMHgzMjpmZi9mZjAwL2ZmMDAwMAotCi0gICAgLXJhd2ZiIG1hcDovZGV2L2ZiMEAxMDI0eDc2OHgxNgotCi0gICAgLXJhd2ZiIG1hcDovdG1wL1h2ZmJfc2NyZWVuMEA2NDB4NDgweDgrMzIzMgotCi0gICAgLXJhd2ZiIGZpbGU6L3RtcC9teS5wbm1AMjUweDIwMHgyNCszNwotCi0gICAgLXJhd2ZiIGZpbGU6L2Rldi91cmFuZG9tQDEyOHgxMjh4OAotCi0gICAgLXJhd2ZiIHNuYXA6L2Rldi92aWRlbzBAMzIweDI0MHgyNCAtMjR0bzMyCi0KLSAgICAtcmF3ZmIgY29uc29sZQotCi0gICAgLXJhd2ZiIHZ0MgotCi0gICAgLXJhd2ZiIHZpZGVvCi0KLSAgICAtcmF3ZmIgc2V0dXA6bXljbWQuc2gKLQotICAgU28gdGhlIHR5cGUgY2FuIGJlICJzaG0iIGZvciBzaGFyZWQgbWVtb3J5IG9iamVjdHMsIGFuZCAibWFwIiBvcgotICAgImZpbGUiIGZvciBmaWxlIG9iamVjdHMuICJtYXAiIHVzZXMgbW1hcCgyKSB0byBtYXAgdGhlIGZpbGUgaW50bwotICAgbWVtb3J5IGFuZCBpcyBwcmVmZXJyZWQgb3ZlciAiZmlsZSIgKHRoYXQgdXNlcyB0aGUgc2xvd2VyIGxzZWVrKDIpCi0gICBhY2Nlc3MgbWV0aG9kLikgT25seSB1c2UgZmlsZSBpZiBtYXAgaXNuJ3Qgd29ya2luZy4gQlRXLCAibW1hcCIgaXMgYW4KLSAgIGFsaWFzIGZvciAibWFwIiBhbmQgaWYgeW91IGRvIG5vdCBzdXBwbHkgYSB0eXBlIGFuZCB0aGUgZmlsZSBleGlzdHMsCi0gICBtYXAgaXMgYXNzdW1lZCAoc2VlIHRoZSAtaGVscCBvdXRwdXQgYW5kIGJlbG93IGZvciBzb21lIGV4Y2VwdGlvbnMgdG8KLSAgIHRoaXMuKSBUaGUgInNuYXA6IiBzZXR0aW5nIGFwcGxpZXMgdGhlIC1zbmFwZmIgb3B0aW9uIHdpdGggImZpbGU6IgotICAgdHlwZSByZWFkaW5nICh0aGlzIGlzIHVzZWZ1bCBmb3IgZXhwb3J0aW5nIHdlYmNhbXMgb3IgVFYgdHVuZXIgdmlkZW87Ci0gICBzZWUgdGhlIG5leHQgRkFRIGZvciBtb3JlIGluZm8uKQotCi0gICBBbHNvLCBpZiB0aGUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtICJzZXR1cDpjbWQiIHRoZW4gY21kIGlzIHJ1biBhbmQgdGhlCi0gICBmaXJzdCBsaW5lIG9mIGl0cyBvdXRwdXQgcmV0cmlldmVkIGFuZCB1c2VkIGFzIHRoZSByYXdmYiBzdHJpbmcuIFRoaXMKLSAgIGFsbG93cyBpbml0aWFsaXppbmcgdGhlIGRldmljZSwgZGV0ZXJtaW5pbmcgV3hIeEIsIGV0Yy4KLQotICAgVGhlIG9iamVjdCB3aWxsIGJlIHRoZSBudW1lcmljYWwgc2hhcmVkIG1lbW9yeSBpZCBmb3IgdGhlIGNhc2Ugb2Ygc2htLgotICAgVGhlIGlkZWEgaGVyZSBpcyBzb21lIG90aGVyIHByb2dyYW0gaGFzIGNyZWF0ZWQgdGhpcyBzaGFyZWQgbWVtb3J5Ci0gICBzZWdtZW50IGFuZCBwZXJpb2RpY2FsbHkgdXBkYXRlcyBpdCB3aXRoIG5ldyBmcmFtZWJ1ZmZlciBkYXRhLiB4MTF2bmMKLSAgIHBvbGxzIHRoZSBhcmVhIGZvciBjaGFuZ2VzLiBTZWUgc2htYXQoMikgYW5kIGlwY3MoOCkgZm9yIG1vcmUgaW5mby4KLSAgIFRoZSBpcGNzIGNvbW1hbmQgd2lsbCBsaXN0IGN1cnJlbnQgc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBvbiB0aGUKLSAgIHN5c3RlbS4gU29tZXRpbWVzIHlvdSBjYW4gc25vb3Agb24gYSBwcm9ncmFtJ3MgZnJhbWVidWZmZXIgaXQgZGlkIG5vdAotICAgZXhwZWN0IHlvdSB3b3VsZCBiZSBwb2xsaW5nIQotCi0gICBUaGUgb2JqZWN0IHdpbGwgYmUgdGhlIHBhdGggdG8gdGhlIHJlZ3VsYXIgb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZQotICAgZm9yIHRoZSBjYXNlcyBvZiBtYXAgYW5kIGZpbGUuIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBpbiB0aGUgY2FzZSBvZiBhCi0gICByZWd1bGFyIGZpbGUgc29tZSBvdGhlciBwcm9ncmFtIGlzIHdyaXRpbmcvdXBkYXRpbmcgZnJhbWVidWZmZXIgaW1hZ2UKLSAgIGRhdGEgdG8gaXQuIEluIHRoZSBjYXNlIG9mIGEgY2hhcmFjdGVyIHNwZWNpYWwgKGUuZy4gL2Rldi9mYjApIGl0IGlzCi0gICB0aGUga2VybmVsIHRoYXQgaXMgInVwZGF0aW5nIiB0aGUgZnJhbWVidWZmZXIgZGF0YS4KLQotICAgSW4gbW9zdCBjYXNlcyB4MTF2bmMgbmVlZHMgdG8gYmUgdG9sZCB0aGUgd2lkdGgsIGhlaWdodCwgYW5kIG51bWJlciBvZgotICAgYml0cyBwZXIgcGl4ZWwgKGJwcCkgb2YgdGhlIGZyYW1lYnVmZmVyLiBUaGlzIGlzIHRoZSBAV3hIeEIgZmllbGQuIEZvcgotICAgdGhlIGNhc2Ugb2YgdGhlIExpbnV4IGZyYW1lYnVmZmVyIGRldmljZSwgL2Rldi9mYjAsIHRoZSBmYnNldCg4KSBtYXkKLSAgIGJlIG9mIHVzZSAoYnV0IG1heSBub3QgYWx3YXlzIGJlIGFjY3VyYXRlIGZvciB3aGF0IGlzIGN1cnJlbnRseQotICAgdmlld2FibGUuKSBJbiBnZW5lcmFsIHNvbWUgZ3Vlc3NpbmcgbWF5IGJlIHJlcXVpcmVkLCBlc3BlY2lhbGx5IGZvcgotICAgdGhlIGJwcC4gVXBkYXRlOiBpbiAiLXJhd2ZiIGNvbnNvbGUiIG1vZGUgeDExdm5jIHdpbGwgdXNlIHRoZSBsaW51eGZiCi0gICBBUEkgdG8gdHJ5IHRvIGd1ZXNzIChpdCBpcyBzdGlsbCBub3QgYWx3YXlzIGFjY3VyYXRlLikgQWxzbyB0cnkKLSAgICItcmF3ZmIgdnROIiAob24geDExdm5jIDAuOS43IGFuZCBsYXRlcikgZm9yIHRoZSBOLXRoIExpbnV4IHRleHQKLSAgIGNvbnNvbGUgKGFrYSB2aXJ0dWFsIHRlcm1pbmFsLikgSWYgdGhlIG51bWJlciBvZiBCeXRlcyBQZXIgTGluZSBpcyBub3QKLSAgIFd4SHhCLzggKGkuZS4gdGhlIGZyYW1lYnVmZmVyIGxpbmVzIGFyZSBwYWRkZWQpIHlvdSBjYW4gc3BlY2lmeSB0aGlzCi0gICBpbmZvcm1hdGlvbiBhZnRlciBXeEh4QiB2aWEgIi1CUEwiLCBlLmcuIEA4MDB4NjAweDE2LTIwNDgKLQotICAgQmFzZWQgb24gdGhlIGJwcCB4MTF2bmMgd2lsbCB0cnkgdG8gZ3Vlc3MgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlCi0gICBtYXNrcyAodGhlc2UgaW5kaWNhdGUgd2hpY2ggYml0cyBjb3JyZXNwb25kIHRvIGVhY2ggY29sb3IuKSBJdCBpZiBnZXRzCi0gICBpdCB3cm9uZyB5b3UgY2FuIHNwZWNpZnkgdGhlbSBtYW51YWxseSB2aWEgdGhlIG9wdGlvbmFsICI6Ui9HL0IiCi0gICBmaWVsZC4gRS5nLiAiOjB4ZmYwMDAwLzB4MDBmZjAwLzB4MDAwMGZmIiAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IKLSAgIDMyYnBwLikKLQotICAgRmluYWxseSwgdGhlIGZyYW1lYnVmZmVyIG1heSBub3QgYmVnaW4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVtb3J5Ci0gICBvYmplY3QsIHNvIHVzZSB0aGUgb3B0aW9uYWwgIitvZmZzZXQiIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGVyZSB0aGUKLSAgIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9uIHN0YXJ0cy4gU28gYXMgYW4gZXhhbXBsZSwgdGhlIFh2ZmIgdmlydHVhbAotICAgZnJhbWVidWZmZXIgaGFzIG9wdGlvbnMgLXNobWVtIGFuZCAtZmJkaXIgZm9yIGV4cG9ydGluZyBpdHMgdmlydHVhbAotICAgc2NyZWVuIHRvIGVpdGhlciBzaG0gb3IgYSBtYXBwZWQgZmlsZS4gVGhlIGZvcm1hdCBvZiB0aGVzZSBpcyBYV0QgYW5kCi0gICBzbyB0aGUgaW5pdGlhbCBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQuIEJUVywgc2luY2UgWFdEIGlzIG5vdAotICAgc3RyaWN0bHkgUkdCIHRoZSB2aWV3IHdpbGwgb25seSBiZSBhcHByb3hpbWF0ZSwgYnV0IHVzYWJsZS4gT2YgY291cnNlCi0gICBmb3IgdGhlIGNhc2Ugb2YgWHZmYiB4MTF2bmMgY2FuIHBvbGwgaXQgbXVjaCBiZXR0ZXIgdmlhIHRoZSBYIEFQSSwgYnV0Ci0gICB5b3UgZ2V0IHRoZSBpZGVhLgotCi0gICBCeSBkZWZhdWx0IGluIC1yYXdmYiBtb2RlIHgxMXZuYyB3aWxsIGFjdHVhbGx5IGNsb3NlIGFueSBYIGRpc3BsYXkgaXQKLSAgIGhhcHBlbmVkIHRvIG9wZW4uIFRoaXMgaXMgYmFzaWNhbGx5IHRvIHNoYWtlIG91dCBidWdzIChlLmcgaXQgd2lsbAotICAgY3Jhc2ggcmF0aGVyIHRoYW4gbXlzdGVyaW91c2x5IGludGVyYWN0aW5nIHdpdGggdGhlIFggZGlzcGxheS4pIElmIHlvdQotICAgd2FudCB4MTF2bmMgdG8ga2VlcCB0aGUgWCBkaXNwbGF5IG9wZW4gd2hpbGUgcG9sbGluZyB0aGUgcmF3Ci0gICBmcmFtZWJ1ZmZlciBwcmVmaXggYSAiKyIgc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgKGUuZy4KLSAgICtmaWxlOi9kZXYvdXJhbmRvbUA2NHg2NHg4KSBUaGlzIGNvdWxkIGJlIGNvbnZlbmllbnQgZm9yIGtlZXBpbmcgdGhlCi0gICByZW1vdGUgY29udHJvbCBjaGFubmVsIGFjdGl2ZSAoaXQgdXNlcyBYIHByb3BlcnRpZXMuKSBUaGUgIi1jb25uZWN0Ci0gICAvcGF0aC90by9maWxlIiBtZWNoYW5pc20gY291bGQgYWxzbyBiZSB1c2VkIGZvciByZW1vdGUgY29udHJvbCB0bwotICAgYXZvaWQgdGhlIFggcHJvcGVydHkgY2hhbm5lbC4gUmFyZSB1c2FnZSwgYnV0IGlmIHlvdSBhbHNvIHN1cHBseQotICAgLW5vdmlld29ubHkgaW4gdGhpcyAiKyIgbW9kZSB0aGVuIHRoZSBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQgYXJlCi0gICBzdGlsbCBzZW50IHRvIHRoZSBYIGRpc3BsYXksIHByZXN1bWFibHkgZm9yIGRvaW5nIHNvbWV0aGluZyBhbXVzaW5nCi0gICB3aXRoIC9kZXYvZmIuLi4KLQotICAgSW50ZXJlc3RpbmcgRGV2aWNlczouIEhlcmUgYXJlIHNvbWUgYWxpYXNlcyBmb3IgaW50ZXJlc3RpbmcgZGV2aWNlCi0gICBmaWxlcyB0aGF0IGNhbiBiZSBwb2xsZWQgdmlhIC1yYXdmYjoKLSAgIC1yYXdmYiBjb25zb2xlICAgICAgICAgICAgICAgL2Rldi9mYjAgICAgICAgIExpbnV4IENvbnNvbGUKLSAgIC1yYXdmYiB2dDIgICAgICAgICAgICAgICAgICAgL2Rldi92Y3NhMiAgICAgIExpbnV4IENvbnNvbGUgKGUuZy4gdmlydHVhbCB0ZXIKLW1pbmFsICMyKQotICAgLXJhd2ZiIHZpZGVvICAgICAgICAgICAgICAgICAvZGV2L3ZpZGVvMCAgICAgVmlkZW80TGludXggQ2FwdHVyZSBkZXZpY2UKLSAgIC1yYXdmYiByYW5kICAgICAgICAgICAgICAgICAgL2Rldi91cmFuZG9tICAgIFJhbmRvbSBCeXRlcwotICAgLXJhd2ZiIG51bGwgICAgICAgICAgICAgICAgICAvZGV2L3plcm8gICAgICAgWmVybyBCeXRlcyAoYmxhY2sgc2NyZWVuKQotCi0gICBUaGUgTGludXggY29uc29sZSwgL2Rldi9mYjAsIGV0YyBuZWVkcyB0byBoYXZlIGl0cyBkcml2ZXIgZW5hYmxlZCBpbgotICAgdGhlIGtlcm5lbC4gU29tZSBvZiB0aGUgZHJpdmVycyBhcmUgdmlkZW8gY2FyZCBzcGVjaWZpYyBhbmQKLSAgIGFjY2VsZXJhdGVkLiBUaGUgY29uc29sZSBpcyBlaXRoZXIgdGhlIFRleHQgY29uc29sZXMgKHVzdWFsbHkKLSAgIHR0eTEtdHR5NiksIG9yIFggZ3JhcGhpY2FsIGRpc3BsYXkgKHVzdWFsbHkgc3RhcnRpbmcgYXQgdHR5Ny4pIEluCi0gICBhZGRpdGlvbiB0byB0aGUgdGV4dCBjb25zb2xlIG90aGVyIGdyYXBoaWNhbCBvbmVzIG1heSBiZSB2aWV3ZWQgYW5kCi0gICBpbnRlcmFjdGVkIHdpdGggYXMgd2VsbCwgZS5nLiBEaXJlY3RGQiBvciBTVkdBbGliIGFwcHMsIFZNV2FyZSBub24tWAotICAgZnVsbHNjcmVlbiwgb3IgUXQtZW1iZWRkZWQgYXBwcyAoUERBcy9IYW5kaGVsZHMuKSBCeSBkZWZhdWx0IHRoZQotICAgcGlwZWlucHV0IG1lY2hhbmlzbXMgVUlOUFVUIGFuZCBDT05TT0xFIChrZXlzdHJva2VzIG9ubHkpIGFyZQotICAgYXV0b21hdGljYWxseSBhdHRlbXB0ZWQgaW4gdGhpcyBtb2RlIHVuZGVyICItcmF3ZmIgY29uc29sZSIuCi0KLSAgIFRoZSBWaWRlbzRMaW51eCBDYXB0dXJlIGRldmljZSwgL2Rldi92aWRlbzAsIGV0YyBpcyBlaXRoZXIgYSBXZWJjYW0gb3IKLSAgIGEgVFYgY2FwdHVyZSBkZXZpY2UgYW5kIG5lZWRzIHRvIGhhdmUgaXRzIGRyaXZlciBlbmFibGVkIGluIHRoZQotICAga2VybmVsLiBTZWUgdGhpcyBGQVEgZm9yIGRldGFpbHMuIElmIHNwZWNpZmllZCB2aWEgIi1yYXdmYiBWaWRlbyIgdGhlbgotICAgdGhlIHBpcGVpbnB1dCBtZXRob2QgIlZJRCIgaXMgYXBwbGllZCAoaXQgbGV0cyB5b3UgY2hhbmdlIHZpZGVvCi0gICBwYXJhbWV0ZXJzIGR5bmFtaWNhbGx5IHZpYSBrZXlzdHJva2VzLikKLQotICAgVGhlIGxhc3QgdHdvLCAvZGV2L3VyYW5kb20gYW5kIC9kZXYvemVybyBhcmUganVzdCBmb3IgZnVuLCBidXQgYXJlCi0gICBhbHNvIHVzZWZ1bCBpbiB0ZXN0aW5nLgotCi0KLSAgIEFsbCBvZiB0aGUgYWJvdmUgLXJhd2ZiIG9wdGlvbnMgYXJlIGp1c3QgZm9yIHZpZXdpbmcgdGhlIHJhdwotICAgZnJhbWVidWZmZXIgKGFsdGhvdWdoIHNvbWUgb2YgdGhlIGFsaWFzZXMgZG8gaW1wbHkga2V5c3Ryb2tlIGFuZCBtb3VzZQotICAgcGlwZWlucHV0IG1ldGhvZHMuKSBUaGF0IG1heSBiZSBlbm91Z2ggZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zIG9mCi0gICB0aGlzIGZlYXR1cmUgKGUuZy4gc3VwcG9zZSBhIHZpZGVvIGNhbWVyYSBtYXBwZWQgaXRzIGZyYW1lYnVmZmVyIGludG8KLSAgIG1lbW9yeSBhbmQgeW91IGp1c3Qgd2FudGVkIHRvIGxvb2sgYXQgaXQgdmlhIFZOQy4pCi0gICBUbyBoYW5kbGUgdGhlIHBvaW50ZXIgYW5kIGtleWJvYXJkIGlucHV0IGZyb20gdGhlIHZpZXdlciB1c2VycyB0aGUKLSAgICItcGlwZWlucHV0IGNtZCIgb3B0aW9uIHdhcyBhZGRlZCB0byBpbmRpY2F0ZSBhIGhlbHBlciBwcm9ncmFtIHRvCi0gICBwcm9jZXNzIHRoZSB1c2VyIGlucHV0LiBUaGUgaW5wdXQgaXMgc3RyZWFtZWQgdG8gaXQgYW5kIGxvb2tzCi0gICBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgUG9pbnRlciAxIDIwNSAyNTcgMCBOb25lCi0gICBQb2ludGVyIDEgMTk4IDI1MyAwIE5vbmUKLSAgIFBvaW50ZXIgMSAxOTggMjUzIDEgQnV0dG9uUHJlc3MtMQotICAgUG9pbnRlciAxIDE5OCAyNTMgMCBCdXR0b25SZWxlYXNlLTEKLSAgIFBvaW50ZXIgMSAxOTggMjUyIDAgTm9uZQotICAgS2V5c3ltIDEgMSAxMTkgdyBLZXlQcmVzcwotICAgS2V5c3ltIDEgMCAxMTkgdyBLZXlSZWxlYXNlCi0gICBLZXlzeW0gMSAxIDY1Mjg4IEJhY2tTcGFjZSBLZXlQcmVzcwotICAgS2V5c3ltIDEgMCA2NTI4OCBCYWNrU3BhY2UgS2V5UmVsZWFzZQotICAgS2V5c3ltIDEgMSAxMTIgcCBLZXlQcmVzcwotICAgS2V5c3ltIDEgMCAxMTIgcCBLZXlSZWxlYXNlCi0KLSAgIFJ1biAiLXBpcGVpbnB1dCB0ZWU6L2Jpbi9jYXQiIHRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuIE5vdGUKLSAgIHRoYXQgdGhlIC1waXBlaW5wdXQgb3B0aW9uIGlzIGluZGVwZW5kZW50IG9mIC1yYXdmYiBtb2RlIGFuZCBzbyBtYXkKLSAgIGhhdmUgc29tZSBvdGhlciBpbnRlcmVzdGluZyB1c2VzLiBUaGUgInRlZToiIHByZWZpeCBtZWFucyB4MTF2bmMgd2lsbAotICAgYm90aCBwcm9jZXNzIHRoZSB1c2VyIGlucHV0IGFuZCBwaXBlIGl0IHRvIHRoZSBjb21tYW5kLiBUaGUgZGVmYXVsdCBpcwotICAgdG8ganVzdCBwaXBlIGl0IHRvIHRoZSAtcGlwZWlucHV0IGNvbW1hbmQuCi0KLSAgIE5vdGUgdGhlIC1waXBlaW5wdXQgaGVscGVyIHByb2dyYW0gY291bGQgYWN0dWFsbHkgY29udHJvbCB0aGUgcmF3Ci0gICBmcmFtZWJ1ZmZlci4gSW4gdGhlIGxpYnZuY3NlcnZlciBDVlMgYSBzaW1wbGUgZXhhbXBsZSBwcm9ncmFtCi0gICB4MTF2bmMvbWlzYy9zbGlkZS5wbCBpcyBwcm92aWRlZCB0aGF0IGRlbW9uc3RyYXRlcyBhIHNpbXBsZSBqcGVnCi0gICAic2xpZGVzaG93IiBhcHBsaWNhdGlvbi4gQWxzbyB0aGUgYnVpbHRpbiAiLXBpcGVpbnB1dCBWSUQiIG1vZGUgZG9lcwotICAgdGhpcyBmb3Igd2ViY2FtcyBhbmQgVFYgY2FwdHVyZSBkZXZpY2VzICgvZGV2L3ZpZGVvMC4pCi0KLSAgIFRoZSAtcGlwZWlucHV0IHByb2dyYW0gaXMgcnVuIHdpdGggdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoKLSAgIFgxMVZOQ19QSUQsIFgxMVZOQ19QUk9HLCBYMTFWTkNfQ01ETElORSwgWDExVk5DX1JBV0ZCX1NUUiB0byBhaWQgaXRzCi0gICBrbm93aW5nIHdoYXQgaXMgdXAuCi0KLSAgIEFub3RoZXIgZXhhbXBsZSBwcm92aWRlZCBpbiBsaWJ2bmNzZXJ2ZXIgQ1ZTIGlzIGEgc2NyaXB0IHRvIGluamVjdAotICAga2V5c3Ryb2tlcyBpbnRvIHRoZSBMaW51eCBjb25zb2xlIChlLmcuIHRoZSB2aXJ0dWFsIGNvbnNvbGVzOgotICAgL2Rldi90dHkxLCAvZGV2L3R0eTIsIGV0YykgaW4geDExdm5jL21pc2MvdmNpbmplY3QucGwuIEl0IGlzIGJhc2VkIG9uCi0gICB0aGUgdm5jdGVybS9MaW51eFZOQy5jIHByb2dyYW0gYWxzbyBpbiB0aGUgbGlidm5jc2VydmVyIENWUy4gU28gdG8KLSAgIHZpZXcgYW5kIGludGVyYWN0IHdpdGggVlQgIzIgKGFzc3VtaW5nIGl0IGlzIHRoZSBhY3RpdmUgVlQpIG9uZSBjYW4KLSAgIHJ1biBzb21ldGhpbmcgbGlrZToKLSAgeDExdm5jIC1yYXdmYiBtYXA6L2Rldi9mYjBAMTAyNHg3Njh4MTYgLXBpcGVpbnB1dCAnLi92Y2luamVjdC5wbCAyJwotCi0gICBUaGlzIGFzc3VtZXMgeW91ciBMaW51eCBmcmFtZWJ1ZmZlciBkZXZpY2UgKC9kZXYvZmIwKSBpcyBwcm9wZXJseQotICAgY29uZmlndXJlZC4gU2VlIGZic2V0KDgpIGFuZCBvdGhlciBkb2N1bWVudGF0aW9uLiBUcnkKLSAgICJmaWxlOi9kZXYvZmIwQFd4SHhCIiBhcyBhIGxhc3QgcmVzb3J0LiBTdGFydGluZyB3aXRoIHgxMXZuYyAwLjguMSwKLSAgIHRoZSBhYm92ZSBWVCBpbmplY3Rpb24gaXMgYnVpbHQgaW4sIGFzIHdlbGwgYXMgV3hIeEIgZGV0ZXJtaW5hdGlvbi4KLSAgIEp1c3QgdXNlIHNvbWV0aGluZyBsaWtlOgotICB4MTF2bmMgLXJhd2ZiIGNvbnNvbGUKLQotICAgdGhpcyB3aWxsIHRyeSB0byBndWVzcyB0aGUgYWN0aXZlIHZpcnR1YWwgY29uc29sZSAodmlhIC9kZXYvdHR5MCkgYW5kCi0gICBhbHNvIHRoZSAvZGV2L2ZiMCBXeEh4QiBhbmQgcmdiIG1hc2tzIGF1dG9tYXRpY2FsbHkuIFVzZSwgZS5nLiwKLSAgICItcmF3ZmIgY29uc29sZTMiIHRvIGZvcmNlIHRoZSBWVCBudW1iZXIuIFRoaXMgaW5wdXQgbWV0aG9kIGNhbiBiZQotICAgdXNlZCBnZW5lcmFsbHkgdmlhICItcGlwZWlucHV0IENPTlNPTEUiLiBBbHNvIHN0YXJ0aW5nIHdpdGggeDExdm5jCi0gICAwLjguMiB0aGUgIi1waXBlaW5wdXQgVUlOUFVUIiBtb2RlIGlzIHRyaWVkIGZpcnN0IChpdCBkb2VzIGJvdGgKLSAgIGtleWJvYXJkIGFuZCBtb3VzZSBpbnB1dCkgYW5kIHRoZW4gZmFsbHMgYmFjayB0byBDT05TT0xFIG1vZGUgaWYgaXQgaXMKLSAgIG5vdCBhdmFpbGFibGUuIEhlcmUgaXMgdGhlIC1oZWxwIG91dHB1dCBmb3IgdGhpcyBtb2RlOgotCi0gICAgIElmIHRoZSByYXdmYiBzdHJpbmcgYmVnaW5zIHdpdGggImNvbnNvbGUiIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UKLSAgICAgL2Rldi9mYjAgaXMgb3BlbmVkICh0aGlzIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgbW9kdWxlcyB0bwotICAgICBiZSBpbnN0YWxsZWQpIGFuZCBzbyBpcyAvZGV2L3R0eTAuIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBpbmplY3QKLSAgICAga2V5c3Ryb2tlcyAobm90IGFsbCBhcmUgc3VwcG9ydGVkLCBidXQgdGhlIGJhc2ljIG9uZXMgYXJlLikgWW91Ci0gICAgIHdpbGwgbmVlZCB0byBiZSByb290IHRvIGluamVjdCBrZXlzdHJva2VzLiAvZGV2L3R0eTAgcmVmZXJzIHRvIHRoZQotICAgICBhY3RpdmUgVlQsIHRvIGluZGljYXRlIG9uZSBleHBsaWNpdGx5LCB1c2UgImNvbnNvbGUyIiwgZXRjLiB1c2luZwotICAgICB0aGUgVlQgbnVtYmVyLgotCi0gICAgIElmIHRoZSBMaW51eCB2ZXJzaW9uIHNlZW1zIHRvIGJlIDIuNiBvciBsYXRlciBhbmQgdGhlICJ1aW5wdXQiCi0gICAgIG1vZHVsZSBhcHBlYXJzIHRvIGJlIHByZXNlbnQsIHRoZW4gdGhlIHVpbnB1dCBtZXRob2Qgd2lsbCBiZSB1c2VkCi0gICAgIGluc3RlYWQgb2YgL2Rldi90dHlOLiB1aW5wdXQgYWxsb3dzIGluc2VydGlvbiBvZiBCT1RIIGtleXN0cm9rZXMKLSAgICAgYW5kIG1vdXNlIGlucHV0IGFuZCBzbyBpdCBwcmVmZXJyZWQgd2hlbiBhY2Nlc3NpbmcgZ3JhcGhpY2FsIChlLmcuCi0gICAgIFF0LWVtYmVkZGVkKSBsaW51eCBjb25zb2xlIGFwcHMuIFNlZSAtcGlwZWlucHV0IFVJTlBVVCBiZWxvdyBmb3IKLSAgICAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIG1vZGUgKHlvdSBtYXkgd2FudCB0byBhbHNvIHVzZSB0aGUKLSAgICAgLW5vZHJhZ2dpbmcgYW5kIC1jdXJzb3Igbm9uZSBvcHRpb25zLikgVXNlICJjb25zb2xlMCIsIGV0YyBvcgotICAgICAtcGlwZWlucHV0IENPTlNPTEUgdG8gZm9yY2UgdGhlIC9kZXYvdHR5TiBtZXRob2QuCi0KLSAgICAgTm90ZSB5b3UgY2FuIGNoYW5nZSBWVCByZW1vdGVseSB1c2luZyB0aGUgY2h2dCgxKSBjb21tYW5kLgotICAgICBTb21ldGltZXMgc3dpdGNoaW5nIG91dCBhbmQgYmFjayBjb3JyZWN0cyB0aGUgZnJhbWVidWZmZXIgc3RhdGUuCi0KLSAgICAgVG8gc2tpcCBpbnB1dCBpbmplY3RpbmcgZW50aXJlbHkgdXNlICJjb25zb2xleCIuCi0KLSAgICAgVGhlIHN0cmluZyAiL2Rldi9mYjAiICgxLCBldGMpIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgImNvbnNvbGUiLgotICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZnJhbWVidWZmZXIgZGV2aWNlLCBlLmcuCi0gICAgIC9kZXYvZmIxLiBBcyBhIHNob3J0Y3V0IHRoZSAiL2Rldi8iIGNhbiBiZSBkcm9wcGVkLiBJZiB0aGUgbmFtZSBpcwotICAgICBzb21ldGhpbmcgbm9uc3RhbmRhcmQsIHVzZSAiY29uc29sZTovZGV2L2Zvb2ZiIgotCi0gICAgIElmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gZ3Vlc3MgdGhlIGZyYW1lYnVmZmVyJ3MgV3hIeEIgYW5kCi0gICAgIG1hc2tzIGF1dG9tYXRpY2FsbHkgKHNvbWV0aW1lcyB0aGUga2VybmVsIGdpdmVzIGluYWNjdXJhdGUKLSAgICAgaW5mb3JtYXRpb24pLCBzcGVjaWZ5IHRoZW0gd2l0aCBhIEBXeEh4QiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLSAgIFRoZSBhYm92ZSBpcyBqdXN0IGFuIGV4YW1wbGUgb2Ygd2hhdCBjYW4gYmUgZG9uZS4gTm90ZSB0aGF0IGlmIHlvdQotICAgcmVhbGx5IHdhbnQgdG8gdmlldyBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgTGludXggVGV4dCBjb25zb2xlIGl0IGlzCi0gICBiZXR0ZXIgdG8gdXNlIHRoZSBtb3JlIGFjY3VyYXRlIGFuZCBmYXN0ZXIgTGludXhWTkMgcHJvZ3JhbS4gVGhlCi0gICBhZHZhbnRhZ2UgeDExdm5jIC1yYXdmYiBtaWdodCBoYXZlIGlzIHRoYXQgaXQgY2FuIGFsbG93IGludGVyYWN0aW9uCi0gICB3aXRoIGEgbm9uLXRleHQgYXBwbGljYXRpb24sIGUuZy4gb25lIGJhc2VkIG9uIFNWR0FsaWIgb3IgUXQtZW1iZWRkZWQKLSAgIEFsc28sIGZvciBleGFtcGxlIHRoZSBWTVdhcmUgRnVsbHNjcmVlbiBtb2RlIGlzIGFjdHVhbGx5IHZpZXdhYmxlCi0gICB1bmRlciAtcmF3ZmIgYW5kIGNhbiBiZSBpbnRlcmFjdGVkIHdpdGggaWYgdWlucHV0IGlzIGVuYWJsZWQuCi0KLSAgIElmIHRoZSBMaW51eCB1aW5wdXQgZHJpdmVyIGlzIGF2YWlsYWJsZSB0aGVuIGZ1bGwga2V5c3Ryb2tlIGFuZCBtb3VzZQotICAgaW5wdXQgaW50byB0aGUgTGludXggY29uc29sZSBjYW4gYmUgcGVyZm9ybWVkLiBZb3UgbWF5IGJlIGFibGUgdG8KLSAgIGVuYWJsZSB1aW5wdXQgdmlhIGNvbW1hbmRzIGxpa2UgdGhlc2U6Ci0gIG1vZHByb2JlIHVpbnB1dAotICBta25vZCAvZGV2L2lucHV0L3VpbnB1dCBjIDEwIDIyMwotCi0gICBUaGUgLXJhd2ZiIGFuZCAtcGlwZWlucHV0IGZlYXR1cmVzIGFyZSBpbnRlbmRlZCB0byBoZWxwIG9uZSBjcmVhdGl2ZWx5Ci0gICAiZ2V0IG91dCBvZiBhIGphbSIgKHNheSBvbiBhIGxlZ2FjeSBvciBlbWJlZGRlZCBkZXZpY2UpIHdoZXJlIFggaXMKLSAgIGFic2VudCBvciBkb2Vzbid0IHdvcmsgcHJvcGVybHkuIEZlZWRiYWNrIGFuZCBidWcgcmVwb3J0cyBhcmUgd2VsY29tZS4KLSAgIEZvciBtb3JlIGNvbnRyb2wgYW5kIGxlc3Mgb3ZlcmhlYWQgdXNlIGxpYnZuY3NlcnZlciBpbiB5b3VyIG93biBDCi0gICBwcm9ncmFtIHRoYXQgcGFzc2VzIHRoZSBmcmFtZWJ1ZmZlciB0byBsaWJ2bmNzZXJ2ZXIuCi0KLQotICAgUS0xMTM6IENhbiBJIGV4cG9ydCB0aGUgTGludXggQ29uc29sZSAoVmlydHVhbCBUZXJtaW5hbHMpIHZpYSBWTkMKLSAgIHVzaW5nIHgxMXZuYz8KLQotICAgWWVzLCB5b3UgbWF5IG5lZWQgdG8gYmUgcm9vdCB0byBhY2Nlc3MgdGhlIGRldmljZXMgdGhhdCBtYWtlIHVwIHRoZQotICAgbGludXggY29uc29sZS4KLQotICAgVG8gYWNjZXNzIHRoZSBhY3RpdmUgTGludXggY29uc29sZSB2aWEgdGhlIGNvbXB1dGVyJ3MgZnJhbWVidWZmZXIgdHJ5Ci0gICBzb21ldGhpbmcgbGlrZToKLSAgeDExdm5jIC1yYXdmYiBjb25zb2xlCi0gIHgxMXZuYyAtcmF3ZmIgY29uc29sZTIKLQotICAgVGhlc2Ugd2lsbCB0cnkgdG8gYWNjZXNzIHRoZSBmcmFtZWJ1ZmZlciB0aHJvdWdoIC9kZXYvZmIgKG9yIC9kZXYvZmIwLAotICAgZXRjLikgYW5kIGlmIGl0IHN1Y2NlZWRzIGl0IHdpbGwgc2hvdyBhbnkgdGV4dCBvciBncmFwaGljcyB0aGF0IGlzCi0gICBjdXJyZW50bHkgZGlzcGxheWVkLiBLZXlzdHJva2VzIHdpbGwgYmUgaW5qZWN0ZWQgdmlhIHRoZSBkZXZpY2UKLSAgIC9kZXYvdHR5MCAodG8gZm9yY2UgYW4gZXhwbGljaXQgdmlydHVhbCB0ZXJtaW5hbCBhcHBlbmQgYSBudW1iZXIsIGUuZy4KLSAgICJjb25zb2xlMiIgdG8gc2VsZWN0IC9kZXYvdHR5Mi4pCi0KLSAgIElmIHlvdXIgTGludXggc3lzdGVtIGRvZXMgbm90IGhhdmUgYSBmcmFtZWJ1ZmZlciBkZXZpY2UgKC9kZXYvZmIpIHlvdQotICAgY2FuIGdldCBvbmUgYnkgYWRkaW5nLCBlLmcuLCB2Z2E9MHgzMUIgYm9vdCBwYXJhbWV0ZXIuIFRoaXMgZW5hYmxlcwotICAgdGhlIFZHQSBmcmFtZWJ1ZmZlciBkZXZpY2UgYXQgMTI4MHgxMDI0eDI0LiAweDMxNyBnaXZlcyAxMDI0eDc2OHgxNiwKLSAgIGV0Yy4gWW91IGNhbiBhbHNvIGVuYWJsZSBhIExpbnV4IGZyYW1lYnVmZmVyIGRldmljZSBieSBtb2Rwcm9iaW5nIGEKLSAgIGZyYW1lYnVmZmVyIGRyaXZlciBzcGVjaWZpYyB0byB5b3VyIHZpZGVvIGNhcmQuCi0KLSAgIE5vdGUgdGhhdCB0aGlzICItcmF3ZmIgY29uc29sZSIgbW9kZSBzaG93cyB0aGUgY29udGVudHMgb2YgdGhlCi0gICBoYXJkd2FyZSBmcmFtZWJ1ZmZlciwgYW5kIHNvIHdpbGwgc2hvdyB3aGF0ZXZlciBpcyBvbiB0aGUgc2NyZWVuLiBJdAotICAgaGFzIG5vIGNvbmNlcHQgb2YgVmlydHVhbCBUZXJtaW5hbHMgV1JUIHdoYXQgdGhlcmUgaXMgdG8gdmlldywgaXQKLSAgIGFsd2F5cyBzaG93cyB0aGUgYWN0aXZlIHZpcnR1YWwgdGVybWluYWwuCi0KLSAgIEFub3RoZXIgbW9kZSBpcyBzcGVjaWZpYyB0byB0aGUgTGludXggdGV4dCBWaXJ0dWFsIFRlcm1pbmFscywgaXQgc2hvd3MKLSAgIHRoZWlyIHRleHQgYW5kIGNvbG9ycyAoYnV0IG5vIGdyYXBoaWNzKSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMKLSAgIHRoZSBhY3RpdmUgVlQgb3Igbm90LiBJdCBpcyBhdmFpbGFibGUgb24geDExdm5jIDAuOS43IGFuZCBsYXRlci4KLSAgIEVuYWJsZSB0aGlzIG1vZGUgbGlrZSB0aGlzOgotICB4MTF2bmMgLXJhd2ZiIHZ0Ci0gIHgxMXZuYyAtcmF3ZmIgdnQyCi0KLSAgIFRoZSBmb3JtZXIgd2lsbCBzZWxlY3QgdGhlIGFjdGl2ZSBvbmUsIHRoZSBsYXR0ZXIgdGhlIDJuZCBWVC4geDExdm5jCi0gICBpbXBsZW1lbnRzIHRoaXMgbW9kZSBieSBvcGVuaW5nIHRoZSBjdXJyZW50IGNvbnNvbGUgdGV4dCBmaWxlCi0gICAiL2Rldi92Y3NhMiIgaW5zdGVhZCBvZiAiL2Rldi9mYiIuIEluIHRoaXMgd2F5IGl0IHByb3ZpZGVzIHRoZSBiYXNpYwotICAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTGliVk5DU2VydmVyIExpbnV4Vk5DIHByb2dyYW0uCi0KLSAgIFRoZSB2dCBtb2RlIGNhbiBiZSBhIHVzZWZ1bCB3YXkgdG8gdHJ5IHRvIGdldCBhIG1hY2hpbmUncyBYIHNlcnZlcgotICAgd29ya2luZyByZW1vdGVseSwgZS5nLiB5b3UgZWRpdCAvZXRjL1gxMS94b3JnLmNvbmYgYW5kIHRoZW4gdHlwZQotICAgc3RhcnR4IChvciBzaW1pbGFyLCBlLmcuIGdkbSkgaW4gdGhlIHZpcnR1YWwgdGVybWluYWwuIEEgMm5kIHgxMXZuYwotICAgY291bGQgYmUgdXNlZCB0byBzZWUgaWYgdGhlIFggc2VydmVyIGlzIG5vdyB3b3JraW5nIGNvcnJlY3RseS4KLQotICAgUS0xMTQ6IENhbiBJIGV4cG9ydCB2aWEgVk5DIGEgV2ViY2FtIG9yIFRWIHR1bmVyIGZyYW1lYnVmZmVyIHVzaW5nCi0gICB4MTF2bmM/Ci0KLSAgIFllcywgdGhpcyBpcyBwb3NzaWJsZSB0byBzb21lIGRlZ3JlZSB3aXRoIHRoZSAtcmF3ZmIgb3B0aW9uLiBUaGVyZSBpcwotICAgbm8gWDExIGludm9sdmVkOiBzbmFwc2hvdHMgZnJvbSB0aGUgdmlkZW8gY2FwdHVyZSBkZXZpY2UgYXJlIHVzZWQgZm9yCi0gICB0aGUgc2NyZWVuIGltYWdlIGRhdGEuIFNlZSB0aGUgcHJldmlvdXMgRkFRIG9uIC1yYXdmYiBmb3IgYmFja2dyb3VuZC4KLSAgIEZvciBiZXN0IHJlc3VsdHMsIHVzZSB4MTF2bmMgdmVyc2lvbiAwLjguMSBvciBsYXRlci4KLQotICAgUm91Z2hseSwgb25lIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gIHgxMXZuYyAtcmF3ZmIgc25hcDovZGV2L3ZpZGVvQDMyMHgyNDB4MzIKLQotICAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzeXN0ZW0gYWxsb3dzIHNpbXBsZSByZWFkKDIpIGFjY2VzcyB0byB0aGUKLSAgIHZpZGVvIGRldmljZS4gVGhpcyBpcyB0cnVlIGZvciB2aWRlbzRMaW51eCBvbiBMaW51eCBrZXJuZWwgMi42IGFuZAotICAgbGF0ZXIgKGl0IHdvbid0IHdvcmsgZm9yIDIuNCwgeW91J2xsIG5lZWQgYSBzZXBhcmF0ZSBwcm9ncmFtIHRvCi0gICBzbmFwc2hvdCB0byBhIGZpbGUgdGhhdCB5b3UgcG9pbnQgLXJhd2ZiIHRvOyBhc2sgbWUgaWYgaXQgaXMgbm90IGNsZWFyCi0gICB3aGF0IHRvIGRvLikKLQotICAgVGhlICJzbmFwOiIgZW5mb3JjZXMgLXNuYXBmYiBtb2RlIHdoaWNoIGFwcGVhcnMgdG8gYmUgbmVjZXNzYXJ5LiBUaGUKLSAgIHJlYWQgcG9pbnRlciBmb3IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzIGNhbm5vdCBiZSByZXBvc2l0aW9uZWQgKHdoaWNoCi0gICB3b3VsZCBiZSBuZWVkZWQgZm9yIHNjYW5saW5lIHBvbGxpbmcpLCBidXQgeW91IGNhbiByZWFkIGEgZnVsbCBmcmFtZQotICAgb2YgZGF0YSBmcm9tIHRoZSBkZXZpY2UuCi0KLSAgIE9uIExpbnV4LCBpZiB0aGUgVmlkZW80TGludXggQVBJIGlzIHByZXNlbnQgb3IgdGhlIHY0bC1pbmZvKDEpIHByb2dyYW0KLSAgIChyZWxhdGVkIHRvIHhhd3R2KSBleGlzdHMgaW4gaW4gUEFUSCwgdGhlbiB4MTF2bmMgY2FuIGJlIGluc3RydWN0ZWQgdG8KLSAgIHRyeSBpdCB0byBkZXRlcm1pbmUgdGhlIC1yYXdmYiBXeEh4QiBwYXJhbWV0ZXJzIGZvciB5b3UgYXV0b21hdGljYWxseS4KLSAgIEluIHRoaXMgY2FzZSBvbmUgd291bGQganVzdCB0eXBlOgotICB4MTF2bmMgLXJhd2ZiIHZpZGVvCi0KLSAgIG9yICItcmF3ZmIgdmlkZW8xIiBmb3IgdGhlIDJuZCB2aWRlbyBkZXZpY2UsIGV0Yy4KLQotICAgeDExdm5jIGhhcyBhbHNvIGJlZW4gZXh0ZW5kZWQgdG8gdXNlIHRoZSBWaWRlbzRMaW51eCBBUEkgb3ZlciB2NGwtaW5mbwotICAgaWYgaXQgaXMgYXZhaWxhYmxlIGF0IGJ1aWxkIHRpbWUuIFRoaXMgZW5hYmxlcyBzZXR0aW5nIHBhcmFtZXRlcnMKLSAgIChlLmcuIHNpemUgYW5kIGJyaWdodG5lc3MpIHZpYSB4MTF2bmMuIFNlZSB0aGUgZGVzY3JpcHRpb24gYmVsb3cuCi0gICBXaXRob3V0IFZpZGVvNExpbnV4IHlvdSB3aWxsIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2V0dGluZ3Mgb2YgdGhlCi0gICB2aWRlbyBkZXZpY2UgdXNpbmcgc29tZXRoaW5nIGxpa2UgeGF3dHYgb3Igc3BjYXZpZXcgKGFuZCB0aGVuIGhvcGUgdGhlCi0gICBzZXR0aW5ncyBwZXJzaXN0IHVudGlsIHgxMXZuYyByZW9wZW5zIHRoZSBkZXZpY2UuKQotCi0gICBNYW55IHZpZGVvNGxpbnV4IGRyaXZlcnMgdGVuZCB0byBzZXQgdGhlIGZyYW1lYnVmZmVyIHRvIGJlIDI0YnBwIChhcwotICAgb3Bwb3NlZCB0byAzMmJwcC4pIFNpbmNlIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggVk5DIHZpZXdlcnMsCi0gICBldGMsIHRoZSAtMjR0bzMyIG9wdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW1wb3NlZCB3aGVuIGluIDI0YnBwLgotCi0gICBOb3RlIHRoYXQgYnkgaXRzIHZlcnkgbmF0dXJlLCB2aWRlbyBjYXB0dXJlIGludm9sdmVzIHJhcGlkIGNoYW5nZSBpbgotICAgdGhlIGZyYW1lYnVmZmVyLiBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBmb3IgY2FtZXJhcyB3aGVyZSBzbGlnaHQKLSAgIHdhdmVyaW5nIGluIGJyaWdodG5lc3MgaXMgYWx3YXlzIGhhcHBlbmluZy4gVGhpcyBjYW4gbGVhZCB0byBtdWNoCi0gICBuZXR3b3JrIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBmb3IgdGhlIFZOQyB0cmFmZmljIGFuZCBhbHNvIGxvY2FsIENQVQotICAgYW5kIEkvTyByZXNvdXJjZSB1c2FnZS4gWW91IG1heSB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCAiZGlhbGluZyBkb3duIgotICAgdGhlIGZyYW1lcmF0ZSB2aWEgdGhlIC13YWl0LCAtc2xvd19mYiwgb3IgLWRlZmVyIG9wdGlvbnMuIERlY3JlYXNpbmcKLSAgIHRoZSB3aW5kb3cgc2l6ZSBhbmQgYnBwIGFsc28gaGVscHMuCi0KLQotICAgU2V0dGluZyBDYW1lcmEvVHVuZXIgcGFyYW1ldGVycyB2aWEgeDExdm5jOgotCi0gICBUaGVyZSBpcyBhbHNvIHNvbWUgc3VwcG9ydCBmb3Igc2V0dGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBjYXB0dXJlCi0gICBkZXZpY2UuIFRoaXMgaXMgZG9uZSB2aWEgIi1yYXdmYiB2aWRlbzo8c2V0dGluZ3M+Ii4gVGhpcyBjb3VsZCBiZQotICAgdXNlZnVsIGZvciB1bmF0dGVuZGVkIHN0YXJ0dXAgYXQgYm9vdHRpbWUsIGV0Yy4gSGVyZSBpcyB0aGUgLWhlbHAKLSAgIGRlc2NyaXB0aW9uOgotCi0gICAgIEEgbW9yZSBzb3BoaXN0aWNhdGVkIHZpZGVvIGRldmljZSBzY2hlbWUgYWxsb3dzIGluaXRpYWxpemluZyB0aGUKLSAgICAgZGV2aWNlJ3Mgc2V0dGluZ3MgdXNpbmc6Ci0KLSAgICAgICAgICAgLXJhd2ZiIHZpZGVvOjxzZXR0aW5ncz4KLQotICAgICBUaGUgcHJlZml4IGNvdWxkIGFsc28gYmUsIGFzIGFib3ZlLCBlLmcuICJ2aWRlbzE6IiB0byBzcGVjaWZ5IHRoZQotICAgICBkZXZpY2UgZmlsZS4gVGhlIHY0bCBBUEkgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoaXMgdG8gd29yay4KLSAgICAgT3RoZXJ3aXNlLCB5b3Ugd2lsbCBuZWVkIHRvIHRyeSB0byBpbml0aWFsaXplIHRoZSBkZXZpY2Ugd2l0aCBhbgotICAgICBleHRlcm5hbCBwcm9ncmFtLCBlLmcuIHhhd3R2LCBzcGNhdmlldywgYW5kIGhvcGUgdGhleSBwZXJzaXN0IHdoZW4KLSAgICAgeDExdm5jIHJlLW9wZW5zIHRoZSBkZXZpY2UuCi0KLSAgICAgPHNldHRpbmdzPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycy4gVGhlCi0gICAgIGRldmljZSdzIGJyaWdodG5lc3MsIGNvbG9yLCBjb250cmFzdCwgYW5kIGh1ZSBjYW4gYmUgc2V0IHRvCi0gICAgIHBlcmNlbnRhZ2VzLCBlLmcuIGJyPTgwLGNvPTUwLGNuPTQ0LGh1PTYwLgotCi0gICAgIFRoZSBkZXZpY2UgZmlsZW5hbWUgY2FuIGJlIHNldCB0b28gaWYgbmVlZGVkIChpZiBpdCBkb2VzIG5vdCBzdGFydAotICAgICB3aXRoICJ2aWRlbyIpLCBlLmcuIGZuPS9kZXYvcWNhbS4KLQotICAgICBUaGUgd2lkdGgsIGhlaWdodCBhbmQgYnBwIG9mIHRoZSBmcmFtZWJ1ZmZlciBjYW4gYmUgc2V0IHZpYSwgZS5nLiwKLSAgICAgdz0xNjAsaD0xMjAsYnBwPTE2LgotCi0gICAgIFJlbGF0ZWQgdG8gdGhlIGJwcCBhYm92ZSwgdGhlIHBpeGVsIGZvcm1hdCBjYW4gYmUgc2V0IHZpYSB0aGUKLSAgICAgZm10PVhYWCwgd2hlcmUgWFhYIGNhbiBiZSBvbmUgb2Y6IEdSRVksIEhJMjQwLCBSR0I1NTUsIFJHQjU2NSwKLSAgICAgUkdCMjQsIGFuZCBSR0IzMiAod2l0aCBicHAgOCwgOCwgMTYsIDE2LCAyNCwgYW5kIDMyIHJlc3BlY3RpdmVseS4pCi0gICAgIFNlZSBodHRwOi8vd3d3LmxpbnV4dHYub3JnIGZvciBtb3JlIGluZm8gKFY0TCBhcGkuKQotCi0gICAgIEZvciBUVi9yZiB0dW5lciBjYXJkcyBvbmUgY2FuIHNldCB0aGUgdHVuaW5nIG1vZGUgdmlhIHR1bj1YWFggd2hlcmUKLSAgICAgWFhYIGNhbiBiZSBvbmUgb2YgUEFMLCBOVFNDLCBTRUNBTSwgb3IgQVVUTy4KLQotICAgICBPbmUgY2FuIHN3aXRjaCB0aGUgaW5wdXQgY2hhbm5lbCBieSB0aGUgaW5wPVhYWCBzZXR0aW5nLCB3aGVyZSBYWFgKLSAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGNoYW5uZWwgKFRlbGV2aXNpb24sIENvbXBvc2l0ZTEsIFMtVmlkZW8sCi0gICAgIGV0Yy4pIFVzZSB0aGUgbmFtZSB0aGF0IGlzIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRoYXQKLSAgICAgaXMgcHJpbnRlZCBhdCBzdGFydHVwLgotCi0gICAgIEZvciBpbnB1dCBjaGFubmVscyB3aXRoIHR1bmVycyAoZS5nLiBUZWxldmlzaW9uKSBvbmUgY2FuIGNoYW5nZQotICAgICB3aGljaCBzdGF0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBzdGE9WFhYIHNldHRpbmcuIFhYWCBpcyB0aGUKLSAgICAgc3RhdGlvbiBudW1iZXIuIEN1cnJlbnRseSBvbmx5IHRoZSBudHNjLWNhYmxlLXVzIChVUyBjYWJsZSkKLSAgICAgY2hhbm5lbHMgYXJlIGJ1aWx0IGludG8geDExdm5jLiBTZWUgdGhlIC1mcmVxdGFiIG9wdGlvbiBiZWxvdyB0bwotICAgICBzdXBwbHkgb25lIGZyb20geGF3dHYuIElmIFhYWCBpcyBncmVhdGVyIHRoYW4gNTAwLCB0aGVuIGl0IGlzCi0gICAgIGludGVycHJldGVkIGFzIGEgcmF3IGZyZXF1ZW5jeSBpbiBLSHouCi0KLSAgICAgRXhhbXBsZToKLQotICAgICAtcmF3ZmIgdmlkZW86YnI9ODAsdz0zMjAsaD0yNDAsZm10PVJHQjMyLHR1bj1OVFNDLHN0YT00NwotCi0gICAgIG9uZSBtaWdodCBuZWVkIHRvIGFkZCBpbnA9VGVsZXZpc2lvbiB0b28gZm9yIHRoZSBpbnB1dCBjaGFubmVsIHRvCi0gICAgIGJlIFRWIGlmIHRoZSBjYXJkIGRvZXNuJ3QgY29tZSB1cCBieSBkZWZhdWx0IGluIHRoYXQgb25lLgotCi0gICAgIE5vdGUgdGhhdCBub3QgYWxsIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyB3aWxsIHN1cHBvcnQgYWxsIG9mIHRoZQotICAgICBhYm92ZSBzZXR0aW5ncy4KLQotICAgICBTZWUgdGhlIC1waXBlaW5wdXQgVklEIG9wdGlvbiBiZWxvdyBmb3IgYSB3YXkgdG8gY29udHJvbCB0aGUKLSAgICAgc2V0dGluZ3MgdGhyb3VnaCB0aGUgVk5DIFZpZXdlciB2aWEga2V5c3Ryb2tlcy4KLQotICAgICBBcyBhYm92ZSwgaWYgeW91IHNwZWNpZnkgYSAiQFd4SHhCLi4uIiBhZnRlciB0aGUgPHNldHRpbmdzPiBzdHJpbmcKLSAgICAgdGhleSBhcmUgdXNlZCB2ZXJiYXRpbTogdGhlIGRldmljZSBpcyBub3QgcXVlcmllZCBmb3IgdGhlIGN1cnJlbnQKLSAgICAgdmFsdWVzLiBPdGhlcndpc2UgdGhlIGRldmljZSB3aWxsIGJlIHF1ZXJpZWQuCi0KLSAgIEFsc28sIGlmIHlvdSBzdXBwbHkgdGhlICItcGlwZWlucHV0IFZJRCIgKG9yIHVzZSAiLXJhd2ZiIFZpZGVvIikKLSAgIG9wdGlvbiB5b3UgY2FuIGNvbnRyb2wgdGhlIHNldHRpbmdzIHRvIHNvbWUgZGVncmVlIHZpYSBrZXlzdHJva2UKLSAgIG1hcHBpbmdzLCBlLmcuIEIgdG8gaW5jcmVhc2UgdGhlIGJyaWdodG5lc3Mgb3IgVXAgYXJyb3cgdG8gY2hhbmdlIHRoZQotICAgVFYgc3RhdGlvbjoKLQotICAgICBGb3IgIi1waXBlaW5wdXQgVklEIiBhbmQgeW91IGFyZSB1c2luZyB0aGUgLXJhd2ZiIGZvciBhIHZpZGVvCi0gICAgIGNhcHR1cmUgZGV2aWNlLCB0aGVuIGFuIGludGVybmFsIGxpc3Qgb2Yga2V5Ym9hcmQgbWFwcGluZ3MgaXMgdXNlZAotICAgICB0byBzZXQgcGFyYW1ldGVycyBvZiB0aGUgdmlkZW8uIFRoZSBtYXBwaW5ncyBhcmU6Ci0KLSAgICAgICAgICJCIiBhbmQgImIiIGFkanVzdCB0aGUgYnJpZ2h0bmVzcyB1cCBhbmQgZG93bi4KLSAgICAgICAgICJIIiBhbmQgImgiIGFkanVzdCB0aGUgaHVlLgotICAgICAgICAgIkMiIGFuZCAiYyIgYWRqdXN0IHRoZSBjb2xvdXIuCi0gICAgICAgICAiTiIgYW5kICJuIiBhZGp1c3QgdGhlIGNvbnRyYXN0LgotICAgICAgICAgIlMiIGFuZCAicyIgYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIHNjcmVlbi4KLSAgICAgICAgICJJIiBhbmQgImkiIGN5Y2xlIHRocm91Z2ggaW5wdXQgY2hhbm5lbHMuCi0gICAgICAgICBVcCBhbmQgRG93biBhcnJvd3MgYWRqdXN0IHRoZSBzdGF0aW9uIChpZiBhIHR1bmVyKQotICAgICAgICAgRjEsIEYyLCAuLi4sIEY2IHdpbGwgc3dpdGNoIHRoZSB2aWRlbyBjYXB0dXJlIHBpeGVsCi0gICAgICAgICBmb3JtYXQgdG8gSEkyNDAsIFJHQjU2NSwgUkdCMjQsIFJHQjMyLCBSR0I1NTUsIGFuZAotICAgICAgICAgR1JFWSByZXNwZWN0aXZlbHkuIFNlZSAtcmF3ZmIgdmlkZW8gZm9yIGRldGFpbHMuCi0KLSAgIFNlZSBhbHNvIHRoZSAtZnJlcXRhYiBvcHRpb24gdG8gc3VwcGx5IHlvdXIgb3duIHhhd3R2IGNoYW5uZWwgdG8KLSAgIGZyZXF1ZW5jeSBtYXBwaW5ncyBmb3IgeW91ciBjb3VudHJ5IChvbmx5IG50c2MtY2FibGUtdXMgaXMgYnVpbHQgaW50bwotICAgeDExdm5jLikKLQotCi0gICBRLTExNTogQ2FuIEkgY29ubmVjdCB2aWEgVk5DIHRvIGEgUXQtZW1iZWRkZWQvUXQtZW5oYW5jZWQvUXRvcGlhCi0gICBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIG15IGhhbmRoZWxkLCBjZWxsIHBob25lLCBvciBQQyB1c2luZyB0aGUgTGludXgKLSAgIGNvbnNvbGUgZnJhbWVidWZmZXIgKGkuZS4gbm90IFgxMSk/Ci0KLSAgIFllcywgdGhlIGJhc2ljIG1ldGhvZCBmb3IgdGhpcyBpcyB0aGUgLXJhd2ZiIHNjaGVtZSB3aGVyZSB0aGUgTGludXgKLSAgIGNvbnNvbGUgZnJhbWVidWZmZXIgKHVzdWFsbHkgL2Rldi9mYjApIGlzIHBvbGxlZCBhbmQgdGhlIHVpbnB1dCBkcml2ZXIKLSAgIGlzIHVzZWQgdG8gaW5qZWN0IGtleXN0cm9rZXMgYW5kIG1vdXNlIGlucHV0LiBPZnRlbiB5b3Ugd2lsbCBqdXN0IGhhdmUKLSAgIHRvIHR5cGU6Ci0gIHgxMXZuYyAtcmF3ZmIgY29uc29sZQotCi0gICAoeW91IG1heSBuZWVkIHRvIGVuYWJsZSB0aGUgdWlucHV0IGRyaXZlciBvbiB0aGUgc3lzdGVtIHZpYSAibW9kcHJvYmUKLSAgIHVpbnB1dDsgbWtub2QgL2Rldi9pbnB1dC91aW5wdXQgYyAxMCAyMjMiKSBJZiB0aGlzIGRvZXMgbm90IGZpbmQgdGhlCi0gICBjb3JyZWN0IGZyYW1lIGJ1ZmZlciBwcm9wZXJ0aWVzIGZpZ3VyZSB0aGVtIG91dCBvciBndWVzcyB0aGVtIGFuZCB1c2UKLSAgIHNvbWV0aGluZyBsaWtlOgotICB4MTF2bmMgLXJhd2ZiIC9kZXYvZmIwQDY0MHg0ODB4MTYKLQotICAgQWxzbywgdG8gZm9yY2UgdXNhZ2Ugb2YgdGhlIHVpbnB1dCBpbmplY3Rpb24gbWV0aG9kIHVzZSAiLXBpcGVpbnB1dAotICAgVUlOUFVUIi4gU2VlIHRoZSAtcGlwZWlucHV0IGRlc2NyaXB0aW9uIGZvciB0dW5hYmxlIHBhcmFtZXRlcnMsIGV0Yy4KLQotICAgT25lIHByb2JsZW0gd2l0aCB0aGUgeDExdm5jIHVpbnB1dCBzY2hlbWUgaXMgdGhhdCBpdCBjYW5ub3QgZ3Vlc3MgdGhlCi0gICBtb3VzZSBtb3Rpb24gImFjY2VsZXJhdGlvbiIgdXNlZCBieSB0aGUgd2luZG93aW5nIGFwcGxpY2F0aW9uIChlLmcuCi0gICBRV1Mgb3IgWDExLikgRm9yIFgxMSBhbmQgUXQtZW1iZWRkZWQgdGhlIGFjY2VsZXJhdGlvbiBpcyB1c3VhbGx5IDIKLSAgIChpLmUuIGEgZHggb2YgMSBmcm9tIHRoZSBtb3VzZSB5aWVsZHMgYSAyIHBpeGVsIGRpc3BsYWNlbWVudCBvZiB0aGUKLSAgIG1vdXNlIGN1cnNvci4pIFRoZSBkZWZhdWx0IHgxMXZuYyB1c2VzIGlzIDIsIHNpbmNlIHRoYXQgaXMgb2Z0ZW4gdXNlZC4KLSAgIEhvd2V2ZXIgZm9yIG9uZSBRdC1lbWJlZGRlZCBzeXN0ZW0gd2UgbmVlZGVkIHRvIGRvOgotICB4MTF2bmMgLXJhd2ZiIGNvbnNvbGUgIC1waXBlaW5wdXQgVUlOUFVUOmFjY2VsPTQuMAotCi0gICB0byBnZXQgcmVhc29uYWJsZSBwb3NpdGlvbmluZyBvZiB0aGUgbW91c2UuCi0KLSAgIEV2ZW4gd2l0aCB0aGUgY29ycmVjdCBhY2NlbGVyYXRpb24gc2V0dGluZyB0aGVyZSBpcyBzdGlsbCBzb21lIGRyaWZ0Ci0gICAocHJvYmFibHkgYmVjYXVzZSBvZiB0aGUgbW91c2UgdGhyZXNob2xkIHdoZXJlIHRoZSBhY2NlbGVyYXRpb24ga2lja3MKLSAgIGluKSBhbmQgc28geDExdm5jIG5lZWRzIHRvIHJlcG9zaXRpb24gdGhlIGN1cnNvciBmcm9tIDAsMCBhYm91dCA1Ci0gICB0aW1lcyBhIHNlY29uZC4gU2VlIHRoZSAtcGlwZWlucHV0IFVJTlBVVCBvcHRpb24gZm9yIHR1bmluZyBwYXJhbWV0ZXJzCi0gICB0aGF0IGNhbiBiZSBzZXQgKHRoZXJlIGFyZSBzb21lIGV4cGVyaW1lbnRhbCB0aHJlc2g9TiB0dW5pbmcKLSAgIHBhcmFtZXRlcnMgYXMgd2VsbCkKLQotICAgQ3VycmVudGx5LCBvbmUgY2FuIGV4cGVjdCBtb3VzZSBpbnB1dCB0byBiZSBhIGxpdHRsZSBmbGFrZXkuIEFsbCBpbgotICAgYWxsLCB0aGUgTGludXggZnJhbWVidWZmZXIgaW5wdXQgbWVjaGFuaXNtIGZvciBRdC1lbWJlZGRlZCBmcmFtZWJ1ZmZlcgotICAgYXBwcyBpcyBub3QgcGVyZmVjdCwgYnV0IGl0IGlzIHVzYWJsZS4KLQotICAgSWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgc21hbGxlciB4MTF2bmMgYmluYXJ5IGZvciBhIGhhbmRoZWxkCi0gICBlbnZpcm9ubWVudCBiZSBzdXJlIHRvIHJ1biBzdHJpcCgxKSBvbiBpdCBhbmQgYWxzbyBjb25zaWRlcgotICAgY29uZmlndXJpbmcgd2l0aCwgZS5nLiAiZW52IENQUEZMQUdTPSctRFNNQUxMX0ZPT1RQUklOVD0xJyAuL2NvbmZpZ3VyZQotICAgLi4uIiB0byByZW1vdmUgcmFyZWx5IHVzZWQgZmVhdHVyZXMgYW5kIGxhcmdlIHRleHRzICh1c2UgMiBvciAzCi0gICBpbnN0ZWFkIG9mIDEgdG8gcmVtb3ZlIG1vcmUuKSBDdXJyZW50bHkgKEp1bC8yMDA2KSB0aGlzIGNhbiBsb3dlciB0aGUKLSAgIHNpemUgb2YgdGhlIHgxMXZuYyBmcm9tIDEuMU1CIHRvIDAuNi0wLjdNQi4KLQotICAgVGhlIHgxMXZuYyB1aW5wdXQgbWV0aG9kIGFwcGxpZXMgdG8gbmVhcmx5IGFueXRoaW5nIG9uIHRoZSBMaW51eAotICAgZnJhbWVidWZmZXIgY29uc29sZSwgbm90IGp1c3QgUXQtZW1iZWRkZWQvUXRvcGlhLiBEaXJlY3RGQiwgU0RMIHVzaW5nCi0gICBmYmNvbiBkcml2ZXIsIFNWR0FsaWIgYXBwbGljYXRpb25zIGNhbiBhbHNvIGJlIHZpZXdlZCBhbmQgaW50ZXJhY3RlZAotICAgd2l0aC4gRXZlbiBhIExpbnV4IFggc2Vzc2lvbiBjYW4gYmUgdmlld2VkIGFuZCBpbnRlcmFjdGVkIHdpdGggd2l0aG91dAotICAgdXNpbmcgWDExIChhbmQgeDExdm5jIGRvZXMgbm90IGhhdmUgdG8gdGVybWluYXRlIHdoZW4gdGhlIFggc2VydmVyCi0gICByZXN0YXJ0cyEpIFRoZSBMaW51eCBUZXh0IGNvbnNvbGVzIChGMS1GNikgYWxzbyB3b3JrLgotCi0gICBOb3RlIHRoYXQgUXQtZW1iZWRkZWQgc3VwcGxpZXMgaXRzIG93biBWTkMgZ3JhcGhpY3MgZHJpdmVyLCBidXQgaXQKLSAgIGNhbm5vdCBkbyBib3RoIHRoZSBMaW51eCBjb25zb2xlIGZyYW1lYnVmZmVyIGFuZCBWTkMgYXQgdGhlIHNhbWUgdGltZSwKLSAgIHdoaWNoIGlzIG9mdGVuIHdoYXQgaXMgZGVzaXJlZCBmcm9tIFZOQy4KLQotICAgVXBkYXRlOiBXZSBhcmUgZmluZGluZyBzb21lIHNldHVwcyBsaWtlIFF0b3BpYSBvbiB0aGUgSVBBUSBkbyBub3QKLSAgIGFsbG93IG1vdXNlIGlucHV0IHZpYSB1aW5wdXQuIFBsZWFzZSBoZWxwIHVzIGRlYnVnIHRoaXMgcHJvYmxlbSBieQotICAgdHJ5aW5nIHgxMXZuYyBvbiB5b3VyIGRldmljZSBhbmQgbGV0dGluZyB1cyBrbm93IHdoYXQgZG9lcyBhbmQgZG9lcwotICAgbm90IHdvcmsuIFNlZSB0aGUgbmV4dCBGQVEgZm9yIGEgcG9zc2libGUgd29ya2Fyb3VuZCBmb3IgdG91Y2hzY3JlZW5zLgotCi0KLSAgIFEtMTE2OiBIb3cgZG8gSSBpbmplY3QgdG91Y2ggc2NyZWVuIGlucHV0IGludG8gYW4KLSAgIFF0LWVtYmVkZGVkL1F0LWVuaGFuY2VkL1F0b3BpYSBjZWxsIHBob25lIHN1Y2ggYXMgb3Blbm1va28vcXRtb2tvIE5lbwotICAgRnJlZXJ1bm5lcj8KLQotICAgVGhlIHF0bW9rbyBwcm9qZWN0IGRvZXMgbm90IHVzZSBYMTEgZm9yIHRoZSBncmFwaGljYWwgZGlzcGxheS4KLSAgIFVuZm9ydHVuYXRlbHkgdGhlIExpbnV4IHVpbnB1dCBtZXRob2QgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBGQVEKLSAgIGRvZXMgbm90IHdvcmsgYmVjYXVzZSBRdCBpcyB1c2luZyBUU0xJQiAodG91Y2ggc2NyZWVuIGxpYnJhcnkpIHRvCi0gICBwcm9jZXNzIHRoZSBpbnB1dCBhbmQgaXQgb25seSByZWFkcyBmcm9tIG9uZSBkZXZpY2UgKG9mdGVuCi0gICAvZGV2L2lucHV0L2V2ZW50MSkgYW5kIG5vdCBmcm9tIHRoZSBuZXcgVUlOUFVUIGRldmljZSB0aGF0IHgxMXZuYwotICAgY3JlYXRlcyAodW5kZXIgLXBpcGVpbnB1dCBVSU5QVVQpCi0KLSAgIFNvIHNvbWV0aGluZyBlbHNlIG5lZWRzIHRvIGJlIGRvbmUuIEl0IHdhcyBkaXNjb3ZlcmVkIHRoYXQgYnkgc2ltcGx5Ci0gICB3cml0aW5nIHRoZSB0b3VjaHNjcmVlbiBldmVudHMgZGlyZWN0bHkgdG8gL2Rldi9pbnB1dC9ldmVudDEgdGhlbgotICAgaW5wdXQgY2FuIGJlIGluamVjdGVkIGludG8gdGhlIHN5c3RlbS4gVGhlcmUgaXMgbm8geDExdm5jIGJ1aWx0aW4gbW9kZQotICAgZm9yIHRoaXMgeWV0ICh1bnRpbCB3ZSB1bmRlcnN0YW5kIGl0IGJldHRlciksIGJ1dCB0aGVyZSBpcyBhIHdvcmtpbmcKLSAgIHNjcmlwdCBwcm92aWRlZCBpbiB4MTF2bmMvbWlzYy9xdF90c2xpYl9pbmplY3QucGwuIFNvIG9uZSBjb3VsZCB1c2UgaXQKLSAgIHRoaXMgd2F5IGZvciBleGFtcGxlOgotICB4MTF2bmMgLi4uIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgcGF0aC90by9xdF90c2xpYl9pbmplY3QucGwgLWVudiBJTkpFQ1RfTwotUFRJT05TPWNsaWNrb25seSxjYWw9L2V0Yy9wb2ludGVyY2FsCi0KLSAgIFJlYWQgdGhlIHNjcmlwdCBmb3IgaG93IHRvIGVuYWJsZSBvdGhlciBvcHRpb25zIGFuZCB3aGF0IHRoZSBhYm92ZQotICAgb3B0aW9ucyBtZWFuIChlLmcuIC9ldGMvcG9pbnRlcmNhbCBjb250YWlucyBUU0xJQidzIGNhbGlicmF0aW9uCi0gICBwYXJhbWV0ZXJzIGFuZCBhcmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgYWNjdXJhdGUgcG9pbnRpbmcuKQotCi0gICBUaGUgeDExdm5jL21pc2MvcXRfdHNsaWJfaW5qZWN0LnBsIHNjcmlwdCBjYW4gcG90ZW50aWFsbHkgYmUgbW9kaWZpZWQKLSAgIHRvIGhhbmRsZSBvdGhlciBkZXZpY2VzIHdoZXJlIHRoZSB1aW5wdXQgbWV0aG9kIGZhaWxzLiBJdCBjb3VsZCBhbHNvCi0gICBiZSBtb2RpZmllZCB0byBjcmVhdGUgJ2hvdCBrZXlzJywgZXRjLgotCi0gICBQbGVhc2UgbGV0IHVzIGtub3cgaG93IHRoaW5ncyBnbyBpZiB5b3UgdHJ5IHRoaXMgb3V0OyB0aGVyZSBpcyBtdWNoIHRvCi0gICBsZWFybiBhYm91dCBzeW50aGV0aWMgaW5wdXQgaW5qZWN0aW9uIGluIGhhbmRoZWxkcyBhbmQgY2VsbCBwaG9uZXMuIEFzCi0gICB3ZSBsZWFybiBtb3JlIHdlIGNhbiBkZXZlbG9wIGEgYnVpbHRpbiB4MTF2bmMgbW9kZSBmb3IgdGhpcyBzb3J0IG9mCi0gICBpbmplY3Rpb24uCi0KLSAgIFVwZGF0ZSBEZWMvMjAxMDogVGhlcmUgaXMgZXhwZXJpbWVudGFsIGJ1aWx0LWluIFVJTlBVVCBzdXBwb3J0IGluIHRoZQotICAgeDExdm5jIGRldmVsb3BtZW50IHRhcmJhbGwgZm9yIHF0bW9rbyB3aXRoIHRvdWNocGFkIG1hbmFnZWQgYnkgdHNsaWIuCi0gICBTZWUgLXBpcGVpbnB1dCBVSU5QVVQgZm9yIG1vcmUgaW5mby4gSGVyZSBpcyBhbiBleGFtcGxlOgotICAgeDExdm5jIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgVUlOUFVUOnRvdWNoLHRzbGliX2NhbD0vZXRjL3BvaW50ZXJjYWwsZGlyZQotY3RfYWJzPS9kZXYvaW5wdXQvZXZlbnQxLG5vdWlucHV0LGRyYWdza2lwPTMKLQotCi0gICBRLTExNzogTm93IHRoYXQgbm9uLVgxMSBkZXZpY2VzIGNhbiBiZSBleHBvcnRlZCB2aWEgVk5DIHVzaW5nIHgxMXZuYywKLSAgIGNhbiBJIGJ1aWxkIGl0IHdpdGggbm8gZGVwZW5kZW5jaWVzIG9uIFgxMSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcz8KLQotICAgWWVzLCBhcyBvZiBKdWwvMjAwNiB4MTF2bmMgZW5hYmxlcyBidWlsZGluZyBmb3IgLXJhd2ZiIG9ubHkgc3VwcG9ydC4KLSAgIEp1c3QgZG8gc29tZXRoaW5nIGxpa2Ugd2hlbiBidWlsZGluZzoKLSAgLi9jb25maWd1cmUgLS13aXRob3V0LXggICAgKHBsdXMgYW55IG90aGVyIGZsYWdzKQotICBtYWtlCi0KLSAgIFlvdSBjYW4gdGhlbiB0ZXN0IHZpYSAibGRkIHgxMXZuYyIgdGhhdCB0aGUgYmluYXJ5IGRvZXMgbm90IGRlcGVuZCBvbgotICAgbGliWDExLnNvLCBldGMuIFNlZSB0aGUgcHJldmlvdXMgRkFRJ3MgZm9yIG5vbi1YMTEgZnJhbWVidWZmZXIgdXNhZ2UuCi0gICBJZiB5b3UgdXNlIHRoaXMgZm9yIGFuIGludGVyZXN0aW5nIG5vbi1YMTEgYXBwbGljYXRpb24gcGxlYXNlIGxldCB1cwotICAga25vdyB3aGF0IHlvdSBkaWQuCi0KLQotICAgUS0xMTg6IEhvdyBkbyBJIGNyb3NzIGNvbXBpbGUgeDExdm5jIGZvciBhIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgdGhhbgotICAgbXkgTGludXggaTM4NiBvciBhbWQ2NCBQQz8KLQotICAgWW91IHdpbGwgbmVlZCBhIGNyb3NzLWNvbXBpbGluZyB0b29sY2hhaW4uIFBlcmhhcHMgeW91ciBkaXN0cm8KLSAgIHByb3ZpZGVzIHRoZXNlIG9yIHlvdSBjYW4gZmluZCBhIEhPV1RPIGZvciB5b3VyIGRpc3Ryby4gV2UgZm91bmQgYQotICAgbmljZSBvbmUgYXQgcXRtb2tvLm9yZyBmb3IgYnVpbGRpbmcgYXJtZWwgYmluYXJpZXMgb24gRGViaWFuIExpbnV4Ci0gICBpMzg2IG1hY2hpbmVzLiBJdCBpbmNsdWRlcyBtb3N0IG9mIHRoZSBsaWJyYXJpZXMgdGhhdCB4MTF2bmMgbmVlZHMuIFdlCi0gICB1c2UgdGhhdCBleGFtcGxlIGhlcmUuCi0KLSAgIFdlIHJhbiB0aGlzIHNjcmlwdCB0byBzZXQgUEFUSCwgY29uZmlndXJlLCBhbmQgYnVpbGQ6Ci0jIS9iaW4vc2gKLQotIyB0b29sY2hhaW4gZnJvbTogcXRtb2tvLWRlYmlhbi10b29sY2hhaW4tYXJtdjR0LWVhYmkudGFyLmd6Ci0KLWV4cG9ydCBQQVRIPS9vcHQvdG9vbGNoYWlucy9hcm05MjB0LWVhYmkvYmluOiRQQVRICi0KLWVudiBDQz1hcm0tbGludXgtZ2NjIC4vY29uZmlndXJlIC0taG9zdD1hcm0tbGludXggLS13aXRob3V0LWF2YWhpCi0KLW1ha2UKLQotYXJtLWxpbnV4LXN0cmlwIC4veDExdm5jL3gxMXZuYwotbHMgLWwgLi94MTF2bmMveDExdm5jCi0KLSAgIE5vdGUgd2UgaGFkIHRvIGluY2x1ZGUgLS13aXRob3V0LWF2YWhpIGR1ZSB0byBsYWNrIG9mCi0gICBsaWJhdmFoaS1jbGllbnQuc28uMyBzdXBwbGllZCBieSB0aGUgdG9vbGNoYWluIHdlIHVzZWQuIE9uZSB3b3VsZCBuZWVkCi0gICB0byBhZGQgaXQgaWYgaXQgd2FzIGRlc2lyZWQgb24gdGhlIHRhcmdldCBtYWNoaW5lLiBXZSBhbHNvIHN0cmlwcGVkCi0gICB0aGUgYmluYXJ5IHRvIG1ha2UgaXQgc21hbGxlci4KLQotICAgRm9yIGFuIGVtYmVkZGVkIHN5c3RlbSBvbmUgbWF5IGFsc28gd2FudCB0byBhZGQgLS13aXRob3V0LXggaWYgdGhlCi0gICBlbWJlZGRlZCBzeXN0ZW0gZG9lcyBub3QgdXNlIFgxMSBhbmQgdGhlIC1yYXdmYiBtZWNoYW5pc20gbXVzdCBiZQotICAgdXNlZC4KLQotCi0gICBRLTExOTogRG9lcyB4MTF2bmMgc3VwcG9ydCBNYWMgT1MgWCBBcXVhL1F1YXJ0eiBkaXNwbGF5cyBuYXRpdmVseQotICAgKGkuZS4gbm8gWDExIGludm9sdmVkKT8KLQotICAgWWVzLCBzaW5jZSBOb3YvMjAwNiBpbiB0aGUgZGV2ZWxvcG1lbnQgdHJlZSAoeDExdm5jLTAuOC40IHRhcmJhbGwpCi0gICB0aGVyZSBpcyBzdXBwb3J0IGZvciBuYXRpdmUgTWFjIE9TIFggQXF1YS9RdWFydHogZGlzcGxheXMgdXNpbmcgdGhlCi0gICAtcmF3ZmIgbWVjaGFuaXNtIGRlc2NyaWJlZCBhYm92ZS4gVGhlIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCBpcwotICAgYWNoaWV2ZWQgdmlhIE1hYyBPUyBYIEFQSSdzLgotCi0gICBTbyB5b3UgY2FuIHVzZSB4MTF2bmMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gT1NYdm5jIChha2EgVmluZSBTZXJ2ZXIpLAotICAgb3IgQXBwbGUgUmVtb3RlIERlc2t0b3AgKEFSRCkuIFBlcmhhcHMgdGhlcmUgaXMgc29tZSB4MTF2bmMgZmVhdHVyZQotICAgeW91J2QgbGlrZSB0byB1c2Ugb24gTWFjIE9TIFgsIGV0Yy4gRm9yIGEgbnVtYmVyIG9mIGFjdGl2aXRpZXMgKGUuZy4KLSAgIHdpbmRvdyBkcmFncykgaXQgc2VlbXMgdG8gYmUgZmFzdGVyIHRoYW4gT1NYdm5jLgotCi0gICBOb3RlczoKLQotICAgWDExOiAgeDExdm5jIHdpbGwgYWxzbyB3b3JrIChhcyBpdCBoYXMgZm9yIHllYXJzKSB3aXRoIGEgWDExIHNlcnZlcgotICAgKFhEYXJ3aW4pIHJ1bm5pbmcgb24gTWFjIE9TIFggKHBlb3BsZSBvZnRlbiBpbnN0YWxsIHRoaXMgc29mdHdhcmUgdG8KLSAgIGRpc3BsYXkgcmVtb3RlIFgxMSBhcHBzIG9uIHRoZWlyIE1hYyBPUyBYIHN5c3RlbSwgb3IgdXNlIHNvbWUgb2xkCi0gICBmYXZvcml0ZXMgbG9jYWxseSBzdWNoIGFzIHh0ZXJtLikgSG93ZXZlciBpbiB0aGlzIGNhc2UgeDExdm5jIHdpbGwKLSAgIG9ubHkgd29yayByZWFzb25hYmx5IGluIHNpbmdsZSB3aW5kb3cgLWlkIHdpbmRvd2lkIG1vZGUgKGFuZCB0aGUKLSAgIHdpbmRvdyBtYXkgbmVlZCB0byBoYXZlIG1vdXNlIGZvY3VzLikKLQotICAgSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBESVNQTEFZIGVudi4gdmFyaWFibGUgc2V0LCB4MTF2bmMgd2lsbCBhc3N1bWUKLSAgIG5hdGl2ZSBBcXVhL1F1YXJ0eiBvbiBNYWMgT1MgWCwgaG93ZXZlciBpZiBESVNQTEFZIGlzIHNldCBpdCB3aWxsCi0gICBhc3N1bWUgYW4gWDExIGNvbm5lY3Rpb24uIFVzZSAiLXJhd2ZiIGNvbnNvbGUiIHRvIGZvcmNlIHRoZSBuYXRpdmUKLSAgIGRpc3BsYXkgKG9yIHVuc2V0IERJU1BMQVkuKQotCi0gICBVcGRhdGU6IExlb3BhcmQgc2V0cyBESVNQTEFZIGJ5IGRlZmF1bHQgaW4gYWxsIHNlc3Npb25zLiBTaW5jZSBpdAotICAgc3RhcnRzIHdpdGggdGhlIHN0cmluZyAiL3RtcC8iIHgxMXZuYyB3aWxsIHVzZSB0aGF0IHRvIGtub3cgaWYgaXQKLSAgIHNob3VsZCBpZ25vcmUgaXQuIFVzZSAiLWRpc3BsYXkgOjAuMCIgdG8gZm9yY2UgaXQuCi0KLSAgIEJ1aWxkaW5nOiAgSWYgeW91IGRvbid0IGhhdmUgdGhlIFgxMSBidWlsZCBhbmQgcnVudGltZSBwYWNrYWdlcwotICAgaW5zdGFsbGVkIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgaXQgbGlrZSB0aGlzOgotICAgKGNkIHRvIHRoZSBlLmcuIHgxMXZuYy0wLjksIHNvdXJjZSBkaXJlY3RvcnkpCi0gICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQteAotICAgbWFrZQotCi0gICBXaW4yVk5DL3gydm5jOiAgT25lIGhhbmR5IHVzZSBpcyB0byB1c2UgdGhlIC1ub2ZiIG1vZGUgdG8gcmVkaXJlY3QKLSAgIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCB0byBhIG5lYXJieSBNYWMgKGkuZS4gb25lIHRvIHRoZSBzaWRlIG9mIHlvdXIKLSAgIGRlc2spIHZpYSB4MnZuYyBvciBXaW4yVk5DLiBTZWUgdGhpcyBGQVEgZm9yIG1vcmUgaW5mby4KLQotICAgT3B0aW9uczogIEhlcmUgYXJlIHRoZSBNYWMgT1MgWCBzcGVjaWZpYyB4MTF2bmMgb3B0aW9uczoKLSAgIC1tYWNub2RpbSAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBkaXNhYmxlIGRpbW1pbmcuCi0gICAtbWFjbm9zbGVlcCAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hYyBPUyBYIHNlcnZlciwgZGlzYWJsZSBkaXNwbGF5IHNsZWVwCi0uCi0gICAtbWFjbm9zYXZlciAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hYyBPUyBYIHNlcnZlciwgZGlzYWJsZSBzY3JlZW5zYXZlci4KLSAgIC1tYWNub3dhaXQgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBkbyBub3Qgd2FpdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdG8gc3dpdGNoIGJhY2sgdG8gaGlzIGRpc3BsYXkuCi0gICAtbWFjd2hlZWwgbiAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hYyBPUyBYIHNlcnZlciwgc2V0IHRoZSBtb3VzZSB3aGVlbAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCB0byBuIChkZWZhdWx0IDUuKQotICAgLW1hY25vc3dhcCAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIGRvIG5vdCBzd2FwIG1vdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgMiBhbmQgMy4KLSAgIC1tYWNub3Jlc2l6ZSAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBkbyBub3QgcmVzaXplIG9yIHJlc2UKLXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYW1lYnVmZmVyIGV2ZW4gaWYgaXQgaXMgZGV0ZWN0ZWQgdGhhdCB0aGUgc2NyZWUKLW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvciBkZXB0aCBoYXMgY2hhbmdlZC4KLSAgIC1tYWNpY29uYW5pbSBuICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBzZXQgbiB0byB0aGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1pbGxpc2Vjb25kcyB0aGF0IHRoZSB3aW5kb3cgaWNvbmlmeS9kZWljb25pZnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRha2VzLiAgSW4gLW5jYWNoZSBtb2RlIHRoaXMgdmFsdWUgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHNraXAgdGhlIGFuaW1hdGlvbiBpZiBwb3NzaWJsZS4gKGRlZmF1bHQgNDAwKQotICAgLW1hY21lbnUgICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIGluIC1uY2FjaGUgY2xpZW50LXNpZAotZQotICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoaW5nIG1vZGUsIHRyeSB0byBjYWNoZSBwdWxsIGRvd24gbWVudXMgKG5vdCBwZXJmZQotY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGV5IGhhdmUgYW5pbWF0ZWQgZmFkZXMsIGV0Yy4pCi0KLSAgIFBhc3RlQm9hcmQvQ2xpcGJvYXJkOiAgIFRoZXJlIGlzIGEgYnVnIHRoYXQgdGhlIENsaXBib2FyZCAoY2FsbGVkCi0gICBQYXN0ZUJvYXJkIG9uIE1hYyBpdCBhcHBlYXJzKSBleGNoYW5nZSB3aWxsIG5vdCB0YWtlIHBsYWNlIHVubGVzcwotICAgeDExdm5jIHdhcyBzdGFydGVkIGZyb20gaW5zaWRlIHRoZSBBcXVhIGRpc3BsYXkgKGUuZy4gc3RhcnRlZCBpbnNpZGUgYQotICAgVGVybWluYWwgYXBwIHdpbmRvdy4pIE90aGVyd2lzZSBpdCBjYW5ub3QgY29ubmVjdCB0byB0aGUgUGFzdGVCb2FyZAotICAgc2VydmVyLiBTbyBDbGlwYm9hcmQgZXhjaGFuZ2Ugd29uJ3Qgd29yayBmb3Igb3VyIHN0YW5kYXJkICJzc2ggaW4iCi0gICBzdGFydHVwIHNjaGVtZS4KLQotICAgSG9wZWZ1bGx5IHRoaXMgZGVmaWNpZW5jeSBjYW4gYmUgcmVtb3ZlZCwgYnV0IHVudGlsIHRoZW4gZm9yIENsaXBib2FyZAotICAgZXhjaGFuZ2UgdG8gd29yayB5b3Ugd2lsbCBuZWVkIHRvIHN0YXJ0IHgxMXZuYyBpbnNpZGUgdGhlIGRlc2t0b3AKLSAgIHNlc3Npb24gKGkuZS4gZWl0aGVyIHN0YXJ0IGl0IHJ1bm5pbmcgYmVmb3JlIHlvdSBsZWF2ZSwgb3Igc3RhcnQgdXAgYQotICAgMm5kIHgxMXZuYyBpbnNpZGUgZnJvbSBhIDFzdCBvbmUgc3RhcnRlZCBvdXRzaWRlLCBvciB1c2UgdGhlIGFwcGxlCi0gICBzY3JpcHQgYmVsb3cpCi0KLSAgIEhlcmUgYWxzbyBpcyBhIG9zYXNjcmlwdCB0cmljayB0aGF0IHNlZW1zIHRvIHdvcmsgKGl0IG9wZW5zIHRoZQotICAgVGVybWluYWwgYXBwIGFuZCBpbnN0cnVjdHMgaXQgdG8gc3RhcnQgeDExdm5jKToKLQotIyEvYmluL3NoCi0jCi0jIHN0YXJ0X3gxMXZuYzogc3RhcnQgeDExdm5jIGluIGEgVGVybWluYWwgd2luZG93Ci0jICh0aGlzIHdpbGwgYWxsb3cgQ2xpcGJvYXJkL1Bhc3RlYm9hcmQgZXhjaGFuZ2UgdG8gd29yaykKLQotdG1wPS90bXAvc3RhcnRfeDExdm5jLiQkCi0KLWNhdCA+ICR0bXAgPDxFTkQKLQotdGVsbCBhcHBsaWNhdGlvbiAiVGVybWluYWwiCi0gICAgICAgIGFjdGl2YXRlCi0gICAgICAgIGRvIHNjcmlwdCB3aXRoIGNvbW1hbmQgIiRIT01FL3gxMXZuYyAtcmZiYXV0aCAudm5jL3Bhc3N3ZCAtc3NsIFNBVkUiCi1lbmQgdGVsbAotCi1FTkQKLQotb3Nhc2NyaXB0ICR0bXAKLXJtIC1mICR0bXAKLQotICAgd2hlcmUgeW91IHNob3VsZCBjdXN0b21pemUgdGhlIHgxMXZuYyBjb21tYW5kIGxpbmUgdG8geW91ciBuZWVkcyBhbmQKLSAgIHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeS4gU2F2ZSBpdCBpbiBhIGZpbGUgZS5nLiAic3RhcnRfeDExdm5jIiBhbmQKLSAgIHRoZW4gYWZ0ZXIgeW91IFNTSCBpbiBqdXN0IHR5cGUgIi4vc3RhcnRfeDExdm5jIiAob3IgaGF2ZSBzc2ggcnVuIHRoZQotICAgY29tbWFuZCBmb3IgeW91LikgVGhlbiBvbmNlIHlvdSBhcmUgY29ubmVjdGVkIHZpYSBWTkMsIGljb25pZnkgdGhlCi0gICBUZXJtaW5hbCB3aW5kb3dzICh5b3UgY2FuJ3QgZGVsZXRlIHRoZW0gc2luY2UgdGhhdCB3aWxsIGtpbGwgeDExdm5jLikKLQotICAgVXBkYXRlIEF1Zy8yMDEwOiBBIHVzZXIgcmVwb3J0cyB0aGUgZm9sbG93aW5nIHVzZWZ1bCBpbmZvcm1hdGlvbjoKLVRoaXMgaXMgbm90IGEgcHJvYmxlbSBvbiBNYWMgT1MgWCAxMC42LnggKFNub3cgTGVvcGFyZCkgd2hlbiBjb25uZWN0aW5nCi12aWEgc3NoIHRvIHN0YXJ0IHgxMXZuYy4gIEFuZCwgb24gTWFjIE9TIFggMTAuNS54IChMZW9wYXJkKSwgdGhlIHByb2JsZW0KLWNhbiBiZSBwZXJtYW5lbnRseSBlbGltaW5hdGVkIGJ5IGRvaW5nIHRoaXM6Ci0KLQotc3VkbyAvdXNyL2xpYmV4ZWMvUGxpc3RCdWRkeSAtYyAnZGVsZXRlIDpMaW1pdExvYWRUb1Nlc3Npb25UeXBlJyBcCi0gICAtYyAnYWRkIDpMaW1pdExvYWRUb1Nlc3Npb25UeXBlIHN0cmluZyBCYWNrZ3JvdW5kJyBcCi0gICAvU3lzdGVtL0xpYnJhcnkvTGF1bmNoQWdlbnRzL2NvbS5hcHBsZS5wYm9hcmQucGxpc3QKLSMgaWdub3JlIGFueSAnRGVsZXRlOiBFbnRyeSwgIjpMaW1pdExvYWRUb1Nlc3Npb25UeXBlIiwgRG9lcyBOb3QgRXhpc3QnIG1lc3NhZ2UKLQotYW5kIHRoZW4gcmVzdGFydGluZyAoeWVzLCB5b3UgbXVzdCByZXN0YXJ0IG5vdCBqdXN0IGxvZyBvZmYpLiAgQnV0Ci1PTkxZIGRvIHRoYXQgZm9yIE1hYyBPUyBYIDEwLjUueCBhbmQgTk9UIGZvciAxMC42LnggKHdoaWNoIGRvZXNuJ3QKLW5lZWQgaXQgYW55d2F5KS4KLQotICAgV2UgcmVjZW50bHkgZ290IGFjY2VzcyB0byBhIE1hY09TWCAxMC42LjQgKFNub3cgTGVvcGFyZCkgbWFjYm9vayBhbmQKLSAgIGhhdmUgY29uZmlybWVkIHRoYXQgdGhlIGFib3ZlIGlzIGNvcnJlY3QuCi0KLQotICAgUS0xMjA6IENhbiB4MTF2bmMgYmUgdXNlZCBhcyBhIFZOQyByZWZsZWN0b3IvcmVwZWF0ZXIgdG8gaW1wcm92ZQotICAgcGVyZm9ybWFuY2UgZm9yIHRoZSBjYXNlIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBWTkMgdmlld2VycwotICAgKGUuZy4gY2xhc3Nyb29tIGJyb2FkY2FzdGluZyBvciBhIGxhcmdlIGRlbW8pPwotCi0gICBZZXMsIGFzIG9mIEZlYi8yMDA3IHRoZXJlIGlzIHRoZSAiLXJlZmxlY3QgaG9zdDpOIiBvcHRpb24gdG8gY29ubmVjdAotICAgdG8gdGhlIFZOQyBzZXJ2ZXIgImhvc3Q6TiIgKGVpdGhlciBhbm90aGVyIHgxMXZuYyBvciBhbnkgb3RoZXIgVk5DCi0gICBzZXJ2ZXIpIGFuZCByZS1leHBvcnQgaXQuIFZOQyB2aWV3ZXJzIHRoZW4gY29ubmVjdCB0byB0aGUgeDExdm5jKHMpCi0gICBydW5uaW5nIC1yZWZsZWN0LgotCi0gICBUaGUgLXJlZmxlY3Qgb3B0aW9uIGlzIHRoZSBzYW1lIGFzOiAiLXJhd2ZiIHZuYzpob3N0Ok4iLiBTZWUgdGhlCi0gICAtcmF3ZmIgZGVzY3JpcHRpb24gdW5kZXIgIlZOQyBIT1NUIiBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3UgY2FuIHJlcGxhY2UgImhvc3Q6TiIgd2l0aCAibGlzdGVuIiBvciAibGlzdGVuOnBvcnQiIGZvciByZXZlcnNlCi0gICBjb25uZWN0aW9ucy4KLQotICAgT25lIGNhbiBzZXQgdXAgYSBudW1iZXIgb2Ygc3VjaCByZWZsZWN0b3JzL3JlcGVhdGVycyB0byBzcHJlYWQgdGhlCi0gICByZXNvdXJjZSB1c2FnZSBhcm91bmQsIGUuZy46Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18LS0tLSBSIC0tLS0tfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18LS0tLSBSIC0tLS0tfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD09PT09PSBTCi0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwtLS0tIFIgLS0tLS18Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAotICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfCAgICAgICAgICAgIHwKLSAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwtLS0tIFIgLS0tLS18Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18Ci0gICAgICAgQyAtLS0tLS0tPC0tLS0tLS18Ci0KLSAgIFdoZXJlICJTIiBpcyB0aGUgb3JpZ2luYWwgVk5DIFNlcnZlciwgIkMiIGRlbm90ZSBWTkMgdmlld2VyIGNsaWVudHMsCi0gICBhbmQgIlIiIGRlbm90ZXMgYW4geDExdm5jIHJ1bm5pbmcgLXJlZmxlY3QgdG8gIlMiLgotCi0gICBJZGVhbGx5LCBhIGNsaWVudCAiQyIgd2lsbCBiZSBmYWlybHkgY2xvc2UgbmV0d29yay13aXNlIHRvIGl0cyAiUiIuIEl0Ci0gICBpcyBmaW5lIHRvIHJ1biB0aGUgIlIiIG9uIHRoZSBzYW1lIG1hY2hpbmUgYXMgb25lIG9mIGl0cyAiQydzIi4gQSBuaWNlCi0gICBzZXR1cCBmb3IgYSBsYXJnZSwgKGUuZy4gNjQtMTI4KSB2aWV3ZXIgY2xhc3Nyb29tIGJyb2FkY2FzdCBjYXNlIHdvdWxkCi0gICBiZSB0byBydW4gUidzIG9uIGFyZWFzIGlzb2xhdGVkIGJ5IG5ldHdvcmsgc3dpdGNoZXMsIGUuZy4gb25lIFIgcGVyCi0gICBzd2l0Y2guCi0KLSAgIEluIGFuIGV4dHJlbWUgY2FzZSAoZS5nLiAxMDAwIHZpZXdlcnMpIG9uZSBtaWdodCBhY3R1YWxseSBuZWVkIGEgMm5kCi0gICBsYXllciBvZiBSJ3MgaW4gdGhlIHRyZWUuIElmIHlvdSB0cnkgc29tZXRoaW5nIGxpa2UgdGhhdCBsZXQgdXMga25vdyEKLQotICAgVGhlcmUgYXJlIG1hbnkgcmVzb3VyY2Ugc2F2aW5ncyBpbiBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGUgYWJvdmUuIFRoZQotICAgZmlyc3Qgb2J2aW91cyBvbmUgaXMgbmV0d29yayBiYW5kd2lkdGggc2F2aW5ncy4gQW5vdGhlciBpcyBsZXNzIENQVQotICAgbG9hZCBvbiAiUyIgc2luY2UgaXQgaGFuZGxlcyBtYW55IGZld2VyIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucy4KLSAgIEFsc28sIGlmIHRoZXJlIGFyZSBhIGZldyBjbGllbnRzIEMgb24gdmVyeSBzbG93IGxpbmtzLCB0aGVpciBwcmVzZW5jZQotICAgZG9lcyBub3Qgc2xvdyBkb3duIGV2ZXJ5IG90aGVyIGNsaWVudCwganVzdCB0aGUgY2xpZW50cyBvbiB0aGVpciAiUiIuCi0gICBPbmUgd2F5IGEgc2xvdyBjbGllbnQgYWZmZWN0cyB0aGluZ3MgaXMgaWYgdGhlcmUgYXJlIHNvbWUgbGFyZ2UKLSAgIGZyYW1lYnVmZmVyIHdyaXRlcyAoZS5nLiBqcGVnIGltYWdlIHJlZ2lvbikgdGhlbiB0aGUgcmVwZWF0ZXIgbWF5Ci0gICBibG9jayB3YWl0aW5nIGZvciB0aGF0IGxhcmdlIHdyaXRlIHRvIGZpbmlzaCBiZWZvcmUgZ29pbmcgb250byB0aGUKLSAgIG5leHQgY2xpZW50IChob3dldmVyLCBpZiB0aGUgd3JpdGUgaXMgc21hbGwgZW5vdWdoLCB0aGUga2VybmVsIHdpbGwKLSAgIGJ1ZmZlciBpdCBhbmQgdGhlIHNlcnZlciBjYW4gZ28gb24gdG8gc2VydmljZSB0aGUgbmV4dCBjbGllbnQuKQotCi0gICBUaGUgeDExdm5jIC1yZWZsZWN0IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGxpYnZuY2NsaWVudCBsaWJyYXJ5IGluCi0gICB0aGUgTGliVk5DU2VydmVyIHByb2plY3QgdG8gaGFuZGxlIHRoZSBjb25uZWN0aW9uIHRvICJTIi4gSXQgaXMgbm90Ci0gICBjdXJyZW50bHkgdmVyeSBlZmZpY2llbnQgc2luY2UgaXQgc2ltcGx5IGRvZXMgaXRzIG5vcm1hbCBmcmFtZWJ1ZmZlcgotICAgcG9sbGluZyBzY2hlbWUgb24gdGhlIGxpYnZuY2NsaWVudCBmcmFtZWJ1ZmZlciAod2hpY2ggaXQgdGhlbgotICAgcmUtZXhwb3J0cyB2aWEgVk5DIHRvIGl0cyBjbGllbnRzIEMuKSBIb3dldmVyLCBDb3B5UmVjdCBhbmQKLSAgIEN1cnNvclNoYXBlIGVuY29kaW5ncyBhcmUgcHJlc2VydmVkIGluIHRoZSByZWZsZWN0aW9uIGFuZCB0aGF0IGhlbHBzLgotICAgRHJhZ2dpbmcgd2luZG93cyB3aXRoIHRoZSBtb3VzZSBjYW4gYmUgYSBwcm9ibGVtIChlc3BlY2lhbGx5IGlmIFMgaXMKLSAgIG5vdCBkb2luZyB3aXJlZnJhbWluZyBzb21laG93LCBjb25zaWRlciAtbm9kcmFnZ2luZyBpZiB0aGUgcHJvYmxlbSBpcwotICAgc2V2ZXJlKSBGb3IgYSByZWFsbHkgZmFzdCByZWZsZWN0b3IvcmVwZWF0ZXIgaXQgd291bGQgaGF2ZSB0byBiZQotICAgaW1wbGVtZW50ZWQgZnJvbSBzY3JhdGNoIHdpdGggcGVyZm9ybWFuY2UgaW4gbWluZC4gU2VlIHRoZXNlIG90aGVyCi0gICBwcm9qZWN0czoKLSAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3ZuYy1yZWZsZWN0b3IvLAotICAgIGh0dHA6Ly93d3cudGlnaHR2bmMuY29tL3Byb2plY3Rvci8gICAgICAgICAgICAgICAgKGNsb3NlZCBzb3VyY2U/KSwKLQotCi0gICBBdXRvbWF0aW9uIHZpYSBSZXZlcnNlIENvbm5lY3Rpb25zOiAgIEluc3RlYWQgb2YgaGF2aW5nIHRoZSBSJ3MKLSAgIGNvbm5lY3QgZGlyZWN0bHkgdG8gUyBhbmQgdGhlbiB0aGUgQydzIGNvbm5lY3QgZGlyZWN0bHkgdG8gdGhlIFIgdGhleQotICAgc2hvdWxkIHVzZSwgc29tZSBjb252ZW5pZW5jZSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgcmV2ZXJzZQotICAgY29ubmVjdGlvbnMgKHRoZSB4MTF2bmMgIiItY29ubmVjdCBob3N0MSxob3N0MiwuLi4iIG9wdGlvbi4pIFN1cHBvc2UKLSAgIGFsbCB0aGUgY2xpZW50cyAiQyIgYXJlIHN0YXJ0ZWQgdXAgaW4gTGlzdGVuIG1vZGU6Ci0gICAgY2xpZW50MT4gIHZuY3ZpZXdlciAtbGlzdGVuCi0gICAgY2xpZW50Mj4gIHZuY3ZpZXdlciAtbGlzdGVuCi0gICAgY2xpZW50Mz4gIHZuY3ZpZXdlciAtbGlzdGVuCi0gICAgLi4uCi0gICAgY2xpZW50NjQ+IHZuY3ZpZXdlciAtbGlzdGVuCi0KLSAgIChlLmcuIGNsaWVudDE+IGlzIHRoZSBjbWRsaW5lIHByb21wdCBvbiBtYWNoaW5lIGNsaWVudDEgLi4uIGV0YykgYW5kCi0gICBhbGwgdGhlIHJlcGVhdGVycyBSIGFyZSBzdGFydGVkIGxpa2UgdGhpczoKLSAgICByZXBlYXRlcjE+IHgxMXZuYyAtcmVmbGVjdCBsaXN0ZW4gLWNvbm5lY3QgY2xpZW50MSxjbGllbnQyLC4uLmNsaWVudDgKLSAgICByZXBlYXRlcjI+IHgxMXZuYyAtcmVmbGVjdCBsaXN0ZW4gLWNvbm5lY3QgY2xpZW50OSxjbGllbnQxMCwuLi5jbGllbnQxNgotICAgIC4uLgotICAgIHJlcGVhdGVyOD4geDExdm5jIC1yZWZsZWN0IGxpc3RlbiAtY29ubmVjdCBjbGllbnQ1NyxjbGllbnQ1OCwuLi5jbGllbnQ2NAotCi0gICBhbmQgZmluYWxseSB0aGUgbWFpbiBzZXJ2ZXIgaXMgc3RhcnRlZCB0byBraWNrIHRoZSB3aG9sZSB0aGluZyBpbnRvCi0gICBtb3Rpb246Ci0gICAgdm5jc2VydmVyPiB4MTF2bmMgLWRpc3BsYXkgOjAgLWNvbm5lY3QgcmVwZWF0ZXIxLHJlcGVhdGVyMiwuLi5yZXBlYXRlcjgKLQotICAgKG9yIGluc3RydWN0IGEgbm9uLXgxMXZuYyBWTkMgc2VydmVyIHRvIHJldmVyc2UgY29ubmVjdCB0byB0aGUKLSAgIHJlcGVhdGVycy4pIEZvciBhIGNsYXNzcm9vbSBicm9hZGNhc3Rpbmcgc2V0dXAgb25lIG1pZ2h0IGhhdmUgdGhlCi0gICBmaXJzdCB0d28gc2V0cyBvZiBjb21tYW5kcyBzdGFydCBhdXRvbWF0aWNhbGx5IGF0IGJvb3R1cCBvciB3aGVuCi0gICBzb21lb25lIGxvZ3MgaW4sIGFuZCB0aGVuIHN0YXJ0IGV2ZXJ5dGhpbmcgdXAgd2l0aCB0aGUgUyBzZXJ2ZXIuIE9uZQotICAgbWF5IGV2ZW4gYmUgYWJsZSB0byBzY3JpcHQgdGhlIGZvcndhcmQgY29ubmVjdGlvbiBib290c3RyYXAgY2FzZSwgbGV0Ci0gICB1cyBrbm93IHdoYXQgeW91IGRpZC4gQSByZWFsbHkgbmljZSB0aGluZyB3b3VsZCBiZSBzb21lIHNvcnQgb2YKLSAgIGF1dG8tZGlzY292ZXJ5IG9mIHlvdXIgcmVwZWF0ZXIsIGV0Yy4uLgotCi0gICBRLTEyMTogQ2FuIHgxMXZuYyBiZSB1c2VkIGR1cmluZyBhIExpbnV4LCBTb2xhcmlzLCBldGMuIHN5c3RlbQotICAgSW5zdGFsbGF0aW9uIHNvIHRoZSBJbnN0YWxsYXRpb24gY2FuIGJlIGRvbmUgcmVtb3RlbHk/Ci0KLSAgIFRoaXMgY2FuIGJlIGRvbmUsIGJ1dCBpdCBkb2Vzbid0IGFsd2F5cyB3b3JrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBob3cKLSAgIHRoZSBPUyBkb2VzIGl0cyBpbnN0YWxsLiBXZSBoYXZlIHRvICJzbmVhayBpbiIgc29tZWhvdy4gTm90ZSB0aGF0IHNvbWUKLSAgIE9TJ3MgaGF2ZSBhIHJlbW90ZSBpbnN0YWxsIChzc2ggZXRjLikgYnVpbHQgaW4gYW5kIHNvIHlvdSBtaWdodCB3YW50Ci0gICB0byB1c2UgdGhhdCBpbnN0ZWFkLgotCi0gICBVc3VhbGx5IHRoZSBPUyBpbnN0YWxsIHdpbGwgaGF2ZSB0byBiZSBhIG5ldHdvcmstaW5zdGFsbCBpbiBvcmRlciB0bwotICAgaGF2ZSBuZXR3b3JraW5nIHVwIGR1cmluZyB0aGUgaW5zdGFsbC4gT3RoZXJ3aXNlLCB5b3UgbWF5IGhhdmUgYQotICAgKHNsaW0pIGNoYW5jZSB0byBjb25maWd1cmUgdGhlIG5ldHdvcmtpbmcgbWFudWFsbHkgKGlmY29uZmlnKDgpIGFuZAotICAgcm91dGUoOCkuKQotCi0gICBUbyBhdm9pZCBsaWJyYXJ5IGRlcGVuZGVuY2llcyBwcm9ibGVtcyBpbiB0aGUgdHlwaWNhbCBtaW5pbWFsIChlLmcuCi0gICBidXN5Ym94KSBpbnN0YWxsYXRpb24gT1MgaXQgaXMgYSBnb29kIGlkZWEgdG8gYnVpbGQgYSBzdGF0aWNhbGx5Ci0gICBsaW5rZWQgeDExdm5jIGJpbmFyeS4gQSB3YXkgdGhhdCBvZnRlbiB3b3JrcyBpcyB0byBkbyBhIG5vcm1hbCBidWlsZAotICAgYW5kIHRoZW4gcGFzdGUgdGhlIGZpbmFsIHgxMXZuYyBsaW5rIGxpbmUgaW50byBhIHNoZWxsIHNjcmlwdC4gVGhlbgotICAgY2hhbmdlIHRoZSAiZ2NjIiB0byAiZ2NjIC1zdGF0aWMiIGFuZCBydW4gdGhlIHNoZWxsIHNjcmlwdC4gWW91IG1heQotICAgbmVlZCB0byBkaXNhYmxlIGZlYXR1cmVzIChlLmcuICItLXdpdGhvdXQteGZpeGVzIikgaWYgdGhlcmUgaXMgbm90IGEKLSAgIHN0YXRpYyBsaWJyYXJ5IGZvciB0aGUgZmVhdHVyZSBhdmFpbGFibGUuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGFkZAotICAgZXh0cmEgbGluayBvcHRpb25zIChlLmcuICItbFhyZW5kZXIiKSB0byBjb21wbGV0ZSBsaWJyYXJ5IGRlcGVuZGVuY2llcwotICAgbWFudWFsbHkuCi0KLSAgIExldCdzIGNhbGwgdGhlIGJpbmFyeSB4MTF2bmMuc3RhdGljLiBQbGFjZSBpdCBvbiBhIHdlYnNlcnZlcgotICAgc29tZXdoZXJlLiBJdCBtYXkgYmUgcG9zc2libGUgdG8gcmV0cmlldmUgaXQgdmlhIHNjcCgxKSB0b28uCi0KLSAgIER1cmluZyB0aGUgaW5zdGFsbCB5b3UgbmVlZCB0byBnZXQgYSBzaGVsbCB0byByZXRyZWl2ZSB4MTF2bmMuc3RhdGljCi0gICBhbmQgcnVuIGl0LgotCi0gICBJZiB0aGUgU29sYXJpcyBpbnN0YWxsIGlzIGFuIG9sZGVyIFgtYmFzZWQgb25lLCB0aGVyZSB3aWxsIGJlIGEgbWVudQotICAgZm9yIHlvdSB0byBnZXQgYSB0ZXJtaW5hbCB3aW5kb3cuIEZyb20gdGhhdCB3aW5kb3cgeW91IG1pZ2h0IGJlIGFibGUKLSAgIHRvIHJldHJpZXZlIHgxMXZuYy5zdGF0aWMgdmlhIHdnZXQsIHNjcCwgb3IgZnRwLiBSZW1lbWJlciB0byBkbyAiY2htb2QKLSAgIDc1NSAuL3gxMXZuYy5zdGF0aWMiIGFuZCB0aGVuIGZpbmQgdGhlIC1hdXRoIGZpbGUgYXMgaW4gdGhpcyBGQVEuCi0KLSAgIElmIGl0IGlzIGEgTGludXggaW5zdGFsbCB0aGF0IHVzZXMgYW4gWCBzZXJ2ZXIgKGUuZy4gU3VTRSBhbmQgcHJvYmFibHkKLSAgIEZlZG9yYSksIHRoZW4geW91IGNhbiBvZnRlbiBnZXQgYSBzaGVsbCBieSBwcmVzc2luZyBDdHJsLUFsdC1GMiBvcgotICAgc2ltaWxhci4gVGhlbiBnZXQgdGhlIHgxMXZuYyBiaW5hcnkgdmlhIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICBjZCAvdG1wCi0gICB3Z2V0IGh0dHA6Ly8xOTIuMTY4LjAuMjIveDExdm5jLnN0YXRpYwotICAgY2htb2QgNzU1IC4veDExdm5jLnN0YXRpYwotCi0gICBGaW5kIHRoZSBuYW1lIG9mIHRoZSBhdXRoIGZpbGUgYXMgaW4gdGhpcyBGQVEuIChtYXliZSBydW4gInBzIHd3YXV4IHwKLSAgIGdyZXAgYXV0aCIuKSBUaGVuIHJ1biBpdCBsaWtlIHRoaXM6Ci0gICAuL3gxMXZuYy5zdGF0aWMgLWZvcmV2ZXIgLW5vcHcgLWRpc3BsYXkgOjAgLWF1dGggL3RtcC93aGVyZXZlci90aGUvYXV0aGZpbGUKLQotICAgdGhlbiBwcmVzcyBBbHQtRjcgdG8gZ28gYmFjayB0byB0aGUgWCBpbnN0YWxsLiBZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlCi0gICB0byBjb25uZWN0IHZpYSBhIHZuYyB2aWV3ZXIgYW5kIGNvbnRpbnVlIHRoZSBpbnN0YWxsLiBXYXRjaCBvdXQgZm9yCi0gICB0aGUgZGlzcGxheSBiZWluZyA6MSwgZXRjLgotCi0gICBJZiB0aGVyZSBpcyBhIGZpcmV3YWxsIGJsb2NraW5nIGluY29taW5nIGNvbm5lY3Rpb25zIGR1cmluZyB0aGUKLSAgIGluc3RhbGwsIHVzZSB0aGUgIi1jb25uZWN0IGhvc3RuYW1lIiBvcHRpb24gb3B0aW9uIGZvciBhIHJldmVyc2UKLSAgIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3RuYW1lIHJ1bm5pbmcgdGhlIFZOQyB2aWV3ZXIgaW4gbGlzdGVuIG1vZGUuCi0KLSAgIERlYmlhbiBiYXNlZCBpbnN0YWxscyBhcmUgZWl0aGVyIGNvbnNvbGUtdGV4dCBvciBjb25zb2xlLWZyYW1lYnVmZmVyCi0gICBiYXNlZC4gVGhlc2UgYXJlIGluc3RhbGwgKG9yIGV4cGVydCkgYW5kIGluc3RhbGxndWkgKG9yIGV4cGVydGd1aSkKLSAgIGJvb3QgbGluZXMsIHJlc3BlY3RpdmVseS4gRm9yIHRoZSBjb25zb2xlLXRleHQgYmFzZWQgaW5zdGFsbHMgeW91Ci0gICBwcm9iYWJseSBuZWVkIHRvIGFkZCBhIGJvb3QgY21kIGxpbmUgb3B0aW9uIGxpa2UgdmdhPTB4MzE0ICh3aGljaCBpcwotICAgODAweDYwMHgxNikgdG8gZ2V0IHRoZSBjb25zb2xlLXRleHQgdG8gdXNlIHRoZSBsaW51eCBmcmFtZWJ1ZmZlcgotICAgZGV2aWNlIHByb3Blcmx5LgotCi0gICBGb3IgYSBEZWJpYW4gY29uc29sZS10ZXh0IGJhc2VkIGluc3RhbGwgYWZ0ZXIgdGhlIG5ldHdvcmsgaXMKLSAgIGNvbmZpZ3VyZWQgcHJlc3MgQ3RybC1BbHQtRjIgdG8gZ2V0IGEgc2hlbGwuIFJldHJpZXZlIHRoZSBiaW5hcnkgdmlhCi0gICB3Z2V0IGFzIGFib3ZlIGFuZCBjaG1vZCA3NTUgaXQuIFRoZW4gcnVuIGl0IHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICBzbGVlcCAxMDsgLi94MTF2bmMuc3RhdGljIC1mb3JldmVyIC1ub3B3IC1yYXdmYiBjb25zb2xlCi0KLSAgIHRoZW4gYmVmb3JlIHRoZSBzbGVlcCBpcyBvdmVyIHByZXNzIEFsdC1GMSB0byBnZXQgYmFjayB0byB0aGUgaW5zdGFsbAotICAgdmlydHVhbCBjb25zb2xlLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY29ubmVjdCB2aWEgYSBWTkMgdmlld2VyIGFuZAotICAgY29udGludWUgd2l0aCB0aGUgaW5zdGFsbC4KLQotICAgRm9yIGEgcmVjZW50ICgyMDA5KSBEZWJpYW4gaW5zdGFsbCB3ZSBib290ZWQgd2l0aCAiZXhwZXJ0IHZnYT0weDMwMSIKLSAgIGFuZCAiZXhwZXJ0IHZnYT0weDMxMSIgdG8gZ2V0IGNvbnNvbGUgdGV4dCBiYXNlZCBpbnN0YWxscyBhdCA2NDB4NDgweDgKLSAgIGFuZCA2NDB4NDgweDE2LCByZXNwZWN0aXZlbHkgKHJlcGxhY2UgImV4cGVydCIgd2l0aCAiaW5zdGFsbCIgaWYgeW91Ci0gICBsaWtlLikgT3RoZXJ3aXNlIGl0IHdhcyBnaXZpbmcgYSAxNiBjb2xvciA2NDB4NDgweDQgKDQgYml0IHBlciBwaXhlbCkKLSAgIGRpc3BsYXkgd2hpY2ggeDExdm5jIGNvdWxkIG5vdCBoYW5kbGUuCi0KLSAgIEZvciBEZWJpYW4gY29uc29sZS1mcmFtZWJ1ZmZlciBHVUkgYmFzZWQgaW5zdGFsbHMgKGluc3RhbGxndWkgb3IKLSAgIGV4cGVydGd1aSkgd2UgaGF2ZSBub3QgYmUgYWJsZSB0byBlbnRlciBrZXlzdHJva2VzIG9yIG1vdXNlIG1vdGlvbnMuCi0gICBUaGlzIG1heSBiZSByZXNvbHZlZCBpZiB0aGUgaW5zdGFsbCBoYWQgdGhlIExpbnV4IGtlcm5lbCBtb2R1bGUKLSAgIHVpbnB1dCwgYnV0IGl0IGRvZXNuJ3Q7IG9uZSBjYW4gd2dldCB1aW5wdXQua28gYW5kIHRoZW4gcnVuIGluc21vZCBvbgotICAgaXQsIGJ1dCB0aGUgbW9kdWxlIG11c3QgbWF0Y2ggdGhlIGluc3RhbGxhdGlvbiBrZXJuZWwuIFNvLCBmYWlsaW5nCi0gICB0aGF0LCB5b3UgY2FuIG9ubHkgZG8gdGhlIEdVSSB2aWV3LW9ubHksIHdoaWNoIGNhbiBiZSBoYW5keSB0byB3YXRjaCBhCi0gICBsb25nIG5ldHdvcmsgaW5zdGFsbCBmcm9tIHlvdXIgZGVzayBpbnN0ZWFkIG9mIGluIGZyb250IG9mIHRoZSBtYWNoaW5lCi0gICBiZWluZyBpbnN0YWxsZWQuIEZvciB0aGVzZSwgYWZ0ZXIgdGhlIG5ldHdvcmsgaXMgY29uZmlndXJlZCBwcmVzcwotICAgQ3RybC1BbHQtRjIgdG8gZ2V0IGEgc2hlbGwuIFJldHJpZXZlIHRoZSBiaW5hcnkgdmlhIHdnZXQgYXMgYWJvdmUgYW5kCi0gICBjaG1vZCA3NTUgaXQuIFRoZW4gcnVuIGl0IHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICBzbGVlcCAxMDsgLi94MTF2bmMuc3RhdGljIC1mb3JldmVyIC1ub3B3IC1yYXdmYiBjb25zb2xlCi0KLSAgIHRoZW4gYmVmb3JlIHRoZSBzbGVlcCBpcyBvdmVyIHByZXNzIEFsdC1GNSB0byBnZXQgYmFjayB0byB0aGUgR1VJCi0gICBpbnN0YWxsIGNvbnNvbGUuIFlvdSBzaG91bGQgYmUgYWJsZSB0byBjb25uZWN0IHZpYSBhIFZOQyB2aWV3ZXIgYW5kCi0gICB3YXRjaCB0aGUgaW5zdGFsbC4KLSAgIFtNaXNjOiBDbGlwYm9hcmQsIEZpbGUgVHJhbnNmZXIvU2hhcmluZywgUHJpbnRpbmcsIFNvdW5kLCBCZWVwcywKLSAgIFRoYW5rcywgZXRjLl0KLQotICAgUS0xMjI6IERvZXMgdGhlIENsaXBib2FyZC9TZWxlY3Rpb24gZ2V0IHRyYW5zZmVycmVkIGJldHdlZW4gdGhlCi0gICB2bmN2aWV3ZXIgYW5kIHRoZSBYIGRpc3BsYXk/Ci0KLSAgIEFzIG9mIEphbi8yMDA0IHgxMXZuYyBzdXBwb3J0cyB0aGUgIkN1dFRleHQiIHBhcnQgb2YgdGhlIFJGQiAoYWthIFZOQykKLSAgIHByb3RvY29sLiBXaGVuIHRleHQgaXMgc2VsZWN0ZWQvY29waWVkIGluIHRoZSBYIHNlc3Npb24gdGhhdCB4MTF2bmMgaXMKLSAgIHBvbGxpbmcgaXQgd2lsbCBiZSBzZW50IHRvIGNvbm5lY3RlZCBWTkMgdmlld2Vycy4gQW5kIHdoZW4gQ3V0VGV4dCBpcwotICAgcmVjZWl2ZWQgZnJvbSBhIFZOQyB2aWV3ZXIgdGhlbiB4MTF2bmMgd2lsbCBzZXQgdGhlIFgxMSBzZWxlY3Rpb25zCi0gICBQUklNQVJZLCBDTElQQk9BUkQsIGFuZCBDVVRCVUZGRVIwIHRvIGl0LiB4MTF2bmMgaXMgYWJsZSB0byBob2xkIHRoZQotICAgUFJJTUFSWSBhbmQgQ0xJUEJPQVJEIHNlbGVjdGlvbnMgKFh2bmMgZG9lcyBub3Qgc2VlbSB0byBkbyB0aGlzLikKLQotICAgVGhlIFgxMSBzZWxlY3Rpb25zIGNhbiBiZSBjb25mdXNpbmcsIGVzcGVjaWFsbHkgdG8gdGhvc2UgY29taW5nIGZyb20KLSAgIFdpbmRvd3Mgb3IgTWFjT1NYIHdoZXJlIHRoZXJlIGlzIGp1c3QgYSBzaW5nbGUgJ0NsaXBib2FyZCcuIFRoZSBYMTEKLSAgIENMSVBCT0FSRCBzZWxlY3Rpb24gaXMgYSBsb3QgbGlrZSB0aGF0IG9mIFdpbmRvd3MgYW5kIE1hY09TWCwgZS5nLgotICAgaGlnaGxpZ2h0ZWQgdGV4dCBpcyBzZW50IHRvIHRoZSBjbGlwYm9hcmQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMKLSAgICJFZGl0IC0+IENvcHkiIG9yIHByZXNzZXMgIkNvbnRyb2wrQyIgKGFuZCBwYXN0aW5nIGl0IHZpYSAiRWRpdCAtPgotICAgUGFzdGUiIG9yICJDb250cm9sK1YiLikgVGhlIFgxMSBQUklNQVJZIHNlbGVjdGlvbiBoYXMgYmVlbiBkZXNjcmliZWQKLSAgIGFzICdmb3IgcG93ZXIgdXNlcnMnIG9yICdhbiBFYXN0ZXIgRWdnJy4gQXMgc29vbiBhcyB0ZXh0IGlzCi0gICBoaWdobGlnaHRlZCBpdCBpcyBzZXQgdG8gdGhlIFBSSU1BUlkgc2VsZWN0aW9uIGFuZCBzbyBpdCBpcwotICAgaW1tZWRpYXRlbHkgcmVhZHkgZm9yIHBhc3RpbmcsIHVzdWFsbHkgdmlhIHRoZSBNaWRkbGUgTW91c2UgQnV0dG9uIG9yCi0gICAiU2hpZnQrSW5zZXJ0Ii4gU2VlIHRoaXMgand6IGxpbmsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIHgxMXZuYydzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gd2F0Y2ggYm90aCBDTElQQk9BUkQgYW5kIFBSSU1BUlkgYW5kCi0gICB3aGVuZXZlciBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBpdCBzZW5kcyB0aGUgbmV3IHRleHQgdG8gY29ubmVjdGVkCi0gICB2aWV3ZXJzLiBOb3RlIHRoYXQgc2luY2UgdGhlIFJGQiBwcm90b2NvbCBvbmx5IGhhcyBhIHNpbmdsZSAiQ3V0VGV4dCIKLSAgIHRoZW4gYm90aCBzZWxlY3Rpb25zIGFyZSAibWVyZ2VkIiB0byBzb21lIGRlZ3JlZSAoYW5kIHRoaXMgY2FuIGxlYWQgdG8KLSAgIGNvbmZ1c2luZyByZXN1bHRzLikgT25lIHVzZXIgd2FzIGNvbmZ1c2VkIHdoeSB4MTF2bmMgd2FzICJmb3JnZXR0aW5nIgotICAgaGlzIENMSVBCT0FSRCBzZWxlY3Rpb24gYW5kIHRoZSByZWFzb24gd2FzIGhlIGFsc28gY2hhbmdlZCBQUklNQVJZCi0gICBzb21lIHRpbWUgYWZ0ZXIgaGUgY29waWVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4gVXN1YWxseSBhbiBhcHAgd2lsbAotICAgc2V0IFBSSU1BUlkgYXMgc29vbiBhcyBhbnkgdGV4dCBpcyBoaWdobGlnaHRlZCBzbyBpdCBlYXN5IHRvIHNlZSBob3cKLSAgIENMSVBCT0FSRCB3YXMgZm9yZ290dGVuLiBVc2UgdGhlIC1ub3ByaW1hcnkgZGVzY3JpYmVkIGJlbG93IGFzIGEKLSAgIHdvcmthcm91bmQuIFNpbWlsYXJseSwgYnkgZGVmYXVsdCB3aGVuIHgxMXZuYyByZWNlaXZlcyBDdXRUZXh0IGl0IHNldHMKLSAgIGJvdGggQ0xJUEJPQVJEIGFuZCBQUklNQVJZIHRvIGl0ICh0aGlzIGlzIHByb2JhYmx5IGxlc3MgY29uZnVzaW5nLCBidXQKLSAgIGNvdWxkIHBvc3NpYmx5IGxlYWQgdG8gc29tZSBmYWlsdXJlIG1vZGVzIGFzIHdlbGwuKQotCi0gICBZb3UgbWF5IG5vdCBsaWtlIHRoZXNlIGRlZmF1bHRzLiBIZXJlIGFyZSB3YXlzIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3I6Ci0gICAgICogSWYgeW91IGRvbid0IHdhbnQgdGhlIENsaXBib2FyZC9TZWxlY3Rpb24gZXhjaGFuZ2VkIGF0IGFsbCB1c2UgdGhlCi0gICAgICAgLW5vc2VsIG9wdGlvbi4KLSAgICAgKiBJZiB5b3Ugd2FudCBjaGFuZ2VzIGluIFBSSU1BUlkgdG8gYmUgaWdub3JlZCB1c2UgdGhlIC1ub3ByaW1hcnkKLSAgICAgICBvcHRpb24uCi0gICAgICogSWYgeW91IHdhbnQgY2hhbmdlcyBpbiBDTElQQk9BUkQgdG8gYmUgaWdub3JlZCB1c2UgdGhlCi0gICAgICAgLW5vY2xpcGJvYXJkIG9wdGlvbi4KLSAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB4MTF2bmMgdG8gc2V0IFBSSU1BUlkgdG8gdGhlICJDdXRUZXh0IiByZWNlaXZlZAotICAgICAgIGZyb20gdmlld2VycyB1c2UgdGhlIC1ub3NldHByaW1hcnkgb3B0aW9uLgotICAgICAqIElmIHlvdSBkb24ndCB3YW50IHgxMXZuYyB0byBzZXQgQ0xJUEJPQVJEIHRvIHRoZSAiQ3V0VGV4dCIKLSAgICAgICByZWNlaXZlZCBmcm9tIHZpZXdlcnMgdXNlIHRoZSAtbm9zZXRjbGlwYm9hcmQgb3B0aW9uLgotCi0gICBZb3UgY2FuIGFsc28gZmluZS10dW5lIGl0IGEgYml0IHdpdGggdGhlIC1zZWxkaXIgZGlyIG9wdGlvbiBhbmQgYWxzbwotICAgLWlucHV0LgotCi0gICBZb3UgbWF5IG5lZWQgdG8gd2F0Y2ggb3V0IGZvciBkZXNrdG9wIHV0aWxpdGllcyBzdWNoIGFzIEtERSdzCi0gICAiS2xpcHBlciIgdGhhdCBkbyBvZGQgdGhpbmdzIHdpdGggdGhlIHNlbGVjdGlvbiwgY2xpcGJvYXJkLCBhbmQKLSAgIGN1dGJ1ZmZlcnMuCi0KLQotICAgUS0xMjM6IENhbiBJIHVzZSB4MTF2bmMgdG8gcmVjb3JkIGEgU2hvY2sgV2F2ZSBGbGFzaCAob3Igb3RoZXIgZm9ybWF0KQotICAgdmlkZW8gb2YgbXkgZGVza3RvcCwgZS5nLiB0byByZWNvcmQgYSB0dXRvcmlhbCBvciBkZW1vPwotCi0gICBZZXMsIGl0IGlzIHBvc3NpYmxlIHdpdGggYSBudW1iZXIgb2YgdG9vbHMgdGhhdCByZWNvcmQgVk5DIGFuZAotICAgdHJhbnNmb3JtIGl0IHRvIHN3ZiBmb3JtYXQgb3Igb3RoZXJzLiBPbmUgc3VjaCBwb3B1bGFyIHRvb2wgaXMKLSAgIHB5dm5jMnN3Zi4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHR1dG9yaWFscyAoYnJva2VuIGxpbms/KSBvbiBob3cgdG8gZG8KLSAgIHRoaXMuIEFub3RoZXIgb3B0aW9uIGlzIHRvIHVzZSB0aGUgdm5jMm1wZyB0aGF0IGNvbWVzIGluIHRoZQotICAgTGliVk5DU2VydmVyIHBhY2thZ2UuCi0gICBBbiBpbXBvcnRhbnQgdGhpbmcgdG8gcmVtZW1iZXIgd2hlbiBkb2luZyB0aGlzIGlzIHRoYXQgdHVuaW5nCi0gICBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhcHBsaWVkIHRvIHgxMXZuYyB0byBzcGVlZCB1cCBpdHMgcG9sbGluZyBmb3IKLSAgIHRoaXMgc29ydCBvZiBhcHBsaWNhdGlvbiwgZS5nLiAiLXdhaXQgMTAgLWRlZmVyIDEwIi4KLQotICAgUS0xMjQ6IENhbiBJIHRyYW5zZmVyIGZpbGVzIGJhY2sgYW5kIGZvcnRoIHdpdGggeDExdm5jPwotCi0gICBBcyBvZiBPY3QvMjAwNSBhbmQgTWF5LzIwMDYgeDExdm5jIGVuYWJsZXMsIHJlc3BlY3RpdmVseSwgdGhlIFRpZ2h0Vk5DCi0gICBhbmQgVWx0cmFWTkMgZmlsZSB0cmFuc2ZlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZXJlIGFkZGVkIHRvCi0gICBsaWJ2bmNzZXJ2ZXIuIFRoaXMgY3VycmVudGx5IHdvcmtzIHdpdGggVGlnaHRWTkMgYW5kIFVsdHJhVk5DIHZpZXdlcnMKLSAgIChhbmQgV2luZG93cyB2aWV3ZXJzIG9ubHkgc3VwcG9ydCBmaWxldHJhbnNmZXIgaXQgYXBwZWFycy4uLiBidXQgdGhleQotICAgZG8gd29yayB0byBzb21lIGRlZ3JlZSB1bmRlciBXaW5lIG9uIExpbnV4LikKLQotICAgVGhlIFNTVk5DIFVuaXggVk5DIHZpZXdlciBzdXBwb3J0cyBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyIGJ5IHVzZSBvZiBhCi0gICBKYXZhIGhlbHBlciBwcm9ncmFtLgotCi0gICBUaWdodFZOQyBmaWxlIHRyYW5zZmVyIGlzIG9mZiBieSBkZWZhdWx0LCBpZiB5b3Ugd2FudCB0byBlbmFibGUgaXQgdXNlCi0gICB0aGUgLXRpZ2h0ZmlsZXhmZXIgb3B0aW9uLgotCi0gICBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyIGlzIG9mZiBieSBkZWZhdWx0LCB0byBlbmFibGUgaXQgdXNlIHNvbWV0aGluZwotICAgbGlrZSAiLXJmYnZlcnNpb24gMy42IC1wZXJtaXRmaWxldHJhbnNmZXIiCi0gICBvcHRpb25zIChVbHRyYVZOQyBpbmNvcnJlY3RseSB1c2VzIHRoZSBSRkIgcHJvdG9jb2wgdmVyc2lvbiB0bwotICAgZGV0ZXJtaW5lIGlmIGl0cyBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLCBzbyB4MTF2bmMgaGFzIHRvIHByZXRlbmQgdG8KLSAgIGJlIHZlcnNpb24gMy42LikgQXMgb2YgU2VwLzIwMDYgIi11bHRyYWZpbGV4ZmVyIiBpcyBhbiBhbGlhcyBmb3IgdGhlc2UKLSAgIHR3byBvcHRpb25zLiBOb3RlIHRoYXQgcnVubmluZyBhcyBSRkIgdmVyc2lvbiAzLjYgbWF5IGNvbmZ1c2Ugb3RoZXIKLSAgIFZOQyBWaWV3ZXJzLgotCi0gICBTYWRseSB5b3UgY2Fubm90IGRvIGJvdGggLXRpZ2h0ZmlsZXhmZXIgYW5kIC11bHRyYWZpbGV4ZmVyIGF0IHRoZSBzYW1lCi0gICB0aW1lIGJlY2F1c2UgdGhlIGxhdHRlciByZXF1aXJlcyBzZXR0aW5nIHRoZSB2ZXJzaW9uIHRvIDMuNiBhbmQKLSAgIHRpZ2h0dm5jIHdpbGwgbm90IGRvIGZpbGV0cmFuc2ZlciB3aGVuIGl0IHNlZXMgdGhhdCB2ZXJzaW9uIG51bWJlci4KLQotICAgQWxzbywgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBMaWJWTkNTZXJ2ZXIgVGlnaHRWTkMgZmlsZSB0cmFuc2ZlciBpcwotICAgaW1wbGVtZW50ZWQsIHlvdSBjYW5ub3QgZG8gVGlnaHR2bmMgZmlsZSB0cmFuc2ZlciBpbiAtdW5peHB3IG1vZGUuCi0gICBIb3dldmVyLCBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyIGRvZXMgd29yayBpbiAtdW5peHB3IChidXQgaWYgYSBjbGllbnQKLSAgIHRyaWVzIGl0IGRvIGEgZmlsZXRyYW5zZmVyIGR1cmluZyB0aGUgbG9naW4gcHJvY2VzcyBpdCB3aWxsIGJlCi0gICBkaXNjb25uZWN0ZWQuKQotCi0gICBJTVBPUlRBTlQ6IHBsZWFzZSB1bmRlcnN0YW5kIGlmIC11bHRyYWZpbGV4ZmVyIG9yIC10aWdodGZpbGV4ZmVyIGlzCi0gICBzcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkIG9yIGRpc3BsYXkKLSAgIG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvIG5vdCBoYXZlIGl0IHN3aXRjaCB1c2VycyB2aWEKLSAgIHRoZSAtdXNlcnMgb3B0aW9uLCB0aGVuIFZOQyBWaWV3ZXJzIHRoYXQgY29ubmVjdCBhcmUgYWJsZSB0byBkbwotICAgZmlsZXRyYW5zZmVyIHJlYWRzIGFuZCB3cml0ZXMgYXMgKnJvb3QqLgotCi0gICBUaGUgVWx0cmFWTkMgYW5kIFRpZ2h0Vk5DIHNldHRpbmdzIGNhbiBiZSB0b2dnbGVkIG9uIGFuZCBvZmYgaW5zaWRlCi0gICB0aGUgZ3VpIG9yIGJ5IC1SIHJlbW90ZSBjb250cm9sLiBIb3dldmVyIGZvciBUaWdodFZOQyB0aGUgY2hhbmdlZAotICAgc2V0dGluZyBvbmx5IGFwcGxpZXMgZm9yIE5FVyBjbGllbnRzLCBjdXJyZW50IGNsaWVudHMgcmV0YWluIHRoZWlyCi0gICBUaWdodFZOQyBmaWxlIHRyYW5zZmVyIGFiaWxpdHkuIEZvciBVbHRyYVZOQyBpdCB3b3JrcyBiZXR0ZXIsIGhvd2V2ZXIKLSAgIGlmIGFuIFVsdHJhVk5DIGNsaWVudCBoYXMgaW5pdGlhdGVkIGEgZmlsZSB0cmFuc2ZlciBkaWFsb2cgaXQgd2lsbAotICAgcmVtYWluIGluIGVmZmVjdCB1bnRpbCB0aGUgZGlhbG9nIGlzIGNsb3NlZC4gSWYgeW91IHdhbnQgdG8gc3dpdGNoCi0gICBiZXR3ZWVuIFVsdHJhVk5DIGFuZCBUaWdodFZOQyBmaWxlIHRyYW5zZmVyIGluIHRoZSBndWkgb3IgYnkgcmVtb3RlCi0gICBjb250cm9sIHlvdSB3aWxsIHByb2JhYmx5IGJlIGZvaWxlZCBieSB0aGUgIi1yZmJ2ZXJzaW9uIDMuNiIgaXNzdWUuCi0KLQotICAgUS0xMjU6IFdoaWNoIFVsdHJhVk5DIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZD8KLQotICAgU29tZSBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQuIFRvIGdldCBVbHRyYVZOQyBWaWV3ZXJzIHRvIGF0dGVtcHQgdG8gdXNlCi0gICB0aGVzZSBleHRlbnNpb25zIHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IHRoaXMgb3B0aW9uIHRvIHgxMXZuYzoKLSAgIC1yZmJ2ZXJzaW9uIDMuNgotCi0gICBPciB1c2UgLXVsdHJhZmlsZXhmZXIgd2hpY2ggaXMgYW4gYWxpYXMgZm9yIHRoZSBhYm92ZSBvcHRpb24gYW5kCi0gICAiLXBlcm1pdGZpbGV0cmFuc2ZlciIuIFVsdHJhVk5DIGV2aWRlbnRseSB0cmVhdHMgYW55IG90aGVyIFJGQiB2ZXJzaW9uCi0gICBudW1iZXIgYXMgbm9uLVVsdHJhVk5DLgotCi0gICBIZXJlIGFyZSBhIGxpc3Qgb2YgdGhlIFVsdHJhVk5DIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHgxMXZuYzoKLSAgICAgKiBTZXJ2ZXJJbnB1dDogIlRvZ2dsZSBSZW1vdGUgSW5wdXQgYW5kIFJlbW90ZSBCbGFuayBNb25pdG9yIgotICAgICAqIEZpbGVUcmFuc2ZlcjogIk9wZW4gRmlsZSBUcmFuc2Zlci4uLiIKLSAgICAgKiBTaW5nbGVXaW5kb3c6ICJTZWxlY3QgU2luZ2xlIFdpbmRvdy4uLiIKLSAgICAgKiBUZXh0Q2hhdDogIk9wZW4gQ2hhdC4uLiIKLSAgICAgKiAxL24gU2VydmVyIFNjYWxpbmcKLQotICAgVGhlIFNTVk5DIFVuaXggVk5DIHZpZXdlciBzdXBwb3J0cyB0aGVzZSBVbHRyYVZOQyBleHRlbnNpb25zLgotCi0gICBUbyBkaXNhYmxlIFNpbmdsZVdpbmRvdyBhbmQgU2VydmVySW5wdXQgdXNlIC1ub3VsdHJhZXh0ICh0aGUgb3RoZXJzCi0gICBhcmUgbWFuYWdlZCBieSBMaWJWTkNTZXJ2ZXIuKSBTZWUgdGhpcyBvcHRpb24gdG9vOiAtbm9zZXJ2ZXJkcG1zLgotCi0gICBBbHNvLCB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIgcHJveHkgaXMgc3VwcG9ydGVkIGZvciB1c2Ugd2l0aCByZXZlcnNlCi0gICBjb25uZWN0aW9uczogIi1jb25uZWN0IHJlcGVhdGVyOi8vaG9zdDpwb3J0K0lEOk5OTk4iLiBVc2UgaXQgZm9yIGJvdGgKLSAgIHBsYWludGV4dCBhbmQgU1NMIGNvbm5lY3Rpb25zLiBUaGlzIG1vZGUgY2FuIHNlbmQgYW55IHN0cmluZyBiZWZvcmUKLSAgIHN3aXRjaGluZyB0byB0aGUgVk5DIHByb3RvY29sLCBhbmQgc28gY291bGQgYmUgdXNlZCB3aXRoIG90aGVyCi0gICBwcm94eS9nYXRld2F5IHRvb2xzLiBBbHNvLCBhIHBlcmwgcmVwZWF0ZXIgaW1wbGVtZW50aW9uIGlzIGhlcmU6Ci0gICB1bHRyYXZuY19yZXBlYXRlci5wbAotCi0KLSAgIFEtMTI2OiBDYW4geDExdm5jIGVtdWxhdGUgVWx0cmFWTkMncyBTaW5nbGUgQ2xpY2sgaGVscGRlc2sgbW9kZSBmb3IKLSAgIFVuaXg/IEkuZS4gc29tZXRoaW5nIHZlcnkgc2ltcGxlIGZvciBhIG5haXZlIHVzZXIgdG8gaW5pdGlhdGUgYQotICAgcmV2ZXJzZSB2bmMgY29ubmVjdGlvbiBmcm9tIHRoZWlyIFVuaXggZGVza3RvcCB0byBhIGhlbHBkZXNrCi0gICBvcGVyYXRvcidzIFZOQyBWaWV3ZXIuCi0KLSAgIFllcywgVWx0cmFWTkMncyBTaW5nbGUgQ2xpY2sgKFNDKSBtb2RlIGNhbiBiZSBlbXVsYXRlZCBmYWlybHkgd2VsbCBvbgotICAgVW5peC4KLQotICAgV2UgdXNlIHRoZSB0ZXJtICJoZWxwZGVzayIgYmVsb3csIGJ1dCBpdCBjb3VsZCBiZSBhbnkgc29ydCBvZiByZW1vdGUKLSAgIGFzc2lzdGFuY2UgeW91IHdhbnQgdG8gc2V0IHVwLCBlLmcuIHNvbWV0aGluZyBmb3IgVW5peC11c2luZyBmcmllbmRzCi0gICBvciBmYW1pbHkgdG8gdXNlLiBUaGlzIGluY2x1ZGVzIE1hYyBPUyBYLgotCi0gICBBc3N1bWUgeW91IGNyZWF0ZSBhIGhlbHBkZXNrIGRpcmVjdG9yeSAiaGQiIG9uIHlvdXIgd2Vic2l0ZToKLSAgIGh0dHA6Ly93d3cubXlzaXRlLmNvbS9oZCAoYW55IHdlYnNpdGUgdGhhdCB5b3UgY2FuIHVwbG9hZCBmaWxlcyB0bwotICAgc2hvdWxkIHdvcmssIGFsdGhvdWdoIHJlbWVtYmVyIHRoZSB1c2VyIHdpbGwgYmUgcnVubmluZyB0aGUgcHJvZ3JhbXMKLSAgIHlvdSBwbGFjZSB0aGVyZS4pCi0KLSAgIEluIHRoYXQgImhkIiBzdWJkaXJlY3RvcnkgY29weSBhbiB4MTF2bmMgYmluYXJ5IHRvIGJlIHJ1biBvbiB0aGUgVW5peAotICAgdXNlcidzIG1hY2hpbmUgKGUuZy4gTGludXgsIGV0YykgYW5kIGFsc28gY3JlYXRlIGEgZmlsZSBuYW1lZCAidm5jIgotICAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nOgotIyEvYmluL3NoCi0KLXdlYmhvc3Q9Imh0dHA6Ly93d3cubXlzaXRlLmNvbS9oZCIgICMgWW91ciBoZWxwZGVzayBkaXIgVVJMLgotCi12bmNob3N0PSJpcC5zb21lcGxhY2UubmV0IiAgICAgICAgICAjIFlvdXIgaG9zdCBydW5uaW5nICd2bmN2aWV3ZXIgLWxpc3RlbicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSXQgY291bGQgYWxzbyBiZSB5b3VyIElQIG51bWJlci4gSWYgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSByb3V0ZXIvZmlyZXdhbGwsIHlvdSB3aWxsIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGl0IHRvIHJlZGlyZWN0IHBvcnQgNTUwMCB0byB5b3UKLXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya3N0YXRpb24gcnVubmluZyAndm5jdmlld2VyIC1saXN0ZW4nCi0KLWRpcj0vdG1wL3ZuY19oZWxwZGVzay4kJCAgICAgICAgICAgICMgTWFrZSBhIHRlbXBvcmFyeSB3b3JraW5nIGRpci4KLW1rZGlyICRkaXIgfHwgZXhpdCAxCi1jZCAkZGlyIHx8IGV4aXQgMQotCi10cmFwICJjZCAvdG1wOyBybSAtcmYgJGRpciIgMCAyIDE1ICAjIENsZWFucyB1cCBvbiBleGl0LgotCi13Z2V0ICR3ZWJob3N0L3gxMXZuYyAgICAgICAgICAgICAgICAjIEZldGNoIHgxMXZuYyBiaW5hcnkuICBJZiBtdWx0aS0KLWNobW9kIDc1NSAuL3gxMXZuYyAgICAgICAgICAgICAgICAgICMgcGxhdGZvcm0sIHVzZSAkd2ViaG9zdC9gdW5hbWVgL3gxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciBzaW1pbGFyLgotCi0uL3gxMXZuYyAtY29ubmVjdF9vcl9leGl0ICR2bmNob3N0IC1yZmJwb3J0IDAgLW5vcHcKLQotICAgd2l0aCB0aGUgaG9zdG5hbWVzIC8gSVAgYWRkcmVzc2VzIGN1c3RvbWl6ZWQgdG8geW91ciBjYXNlLgotCi0gICBPbiB0aGUgaGVscGRlc2sgVk5DIHZpZXdlciBtYWNoaW5lIChpcC5zb21lcGxhY2UubmV0IGluIHRoaXMgZXhhbXBsZSkKLSAgIHlvdSBoYXZlIHRoZSBoZWxwZGVzayBvcGVyYXRvciBydW5uaW5nIFZOQyB2aWV3ZXIgaW4gbGlzdGVuIG1vZGU6Ci0gICB2bmN2aWV3ZXIgLWxpc3RlbgotCi0gICBvciBpZiBvbiBXaW5kb3dzLCBldGMuIHNvbWVob3cgaGF2ZSB0aGUgVk5DIHZpZXdlciBiZSBpbiAibGlzdGVuIgotICAgbW9kZS4KLQotICAgVGhlbiwgd2hlbiB0aGUgbmFpdmUgdXNlciBuZWVkcyBhc3Npc3RhbmNlIHlvdSBpbnN0cnVjdCBoaW0gdG8gb3BlbiB1cAotICAgYSB0ZXJtaW5hbCB3aW5kb3cgb24gaGlzIFVuaXggZGVza3RvcCBhbmQgcGFzdGUgdGhlIGZvbGxvd2luZyBpbnRvIHRoZQotICAgc2hlbGw6Ci0gICB3Z2V0IC1xTyAtIGh0dHA6Ly93d3cubXlzaXRlLmNvbS9oZC92bmMgfCBzaCAtCi0KLSAgIGFuZCB0aGVuIHByZXNzIEVudGVyLiBZb3UgY291bGQgaGF2ZSB0aGlzIGluc3RydWN0aW9uIG9uIGEgd2ViIHBhZ2Ugb3IKLSAgIGluIGFuIGVtYWlsIHlvdSBzZW5kIGhpbSwgZXRjLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIHdnZXQgaXMKLSAgIGluc3RhbGxlZCBvbiB0aGUgdXNlcidzIFVuaXggbWFjaGluZSAoaGUgbWlnaHQgb25seSBoYXZlIGN1cmwgb3IgbHlueCwKLSAgIHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKLQotCi0gICBTbyBJIGd1ZXNzIHRoaXMgaXMgYWJvdXQgMy00IGNsaWNrcyAoc3RhcnQgYSB0ZXJtaW5hbCBhbmQgcGFzdGUpIGFuZAotICAgcHJlc3NpbmcgIkVudGVyIiBpbnN0ZWFkIG9mICJzaW5nbGUgY2xpY2siLi4uCi0KLSAgIFNlZSB0aGlzIHBhZ2UgZm9yIHNvbWUgdmFyaWF0aW9ucyBvbiB0aGlzIG1ldGhvZCwgZS5nLiBob3cgdG8gYWRkIGEKLSAgIHBhc3N3b3JkLCBTU0wgQ2VydGlmaWNhdGVzLCBldGMuCi0KLQotICAgSWYgeW91IGRvbid0IGhhdmUgYSB3ZWJzaXRlICh0aGVyZSBhcmUgbWFueSBmcmVlIG9uZXMpIG9yIGRvbid0IHdhbnQKLSAgIHRvIHVzZSBvbmUgeW91IHdpbGwgaGF2ZSB0byBlbWFpbCBoaW0gYWxsIG9mIHRoZSBpbmdyZWRpZW50cyAoeDExdm5jCi0gICBiaW5hcnkgYW5kIGEgbGF1bmNoZXIgc2NyaXB0KSBhbmQgdGVsbCBoaW0gaG93IHRvIHJ1biBpdC4gVGhpcyBjb3VsZAotICAgYmUgZWFzeSBvciBjaGFsbGVuZ2luZyBkZXBlbmRpbmcgb24gdGhlIHNraWxsIG9mIHRoZSBuYWl2ZSB1bml4Ci0gICB1c2VyLi4uCi0KLSAgIEEgYml0IG9mIG9ic2N1cml0eSBzZWN1cml0eSBjb3VsZCBiZSBwdXQgaW4gd2l0aCBhIC1wYXNzd2QsIC1yZmJhdXRoCi0gICBvcHRpb25zLCBldGMuIChub3RlIHRoYXQgeDExdm5jIHdpbGwgcmVxdWlyZSBhIHBhc3N3b3JkIGV2ZW4gZm9yCi0gICByZXZlcnNlIGNvbm5lY3Rpb25zLikgTW9yZSBpbmZvIGhlcmUuCi0KLQotICAgRmlyZXdhbGxzOiBJZiB0aGUgaGVscGRlc2sgKHlvdSkgd2l0aCB0aGUgdm5jdmlld2VyIGlzIGJlaGluZCBhCi0gICBOQVQvRmlyZXdhbGwvUm91dGVyIHRoZSByb3V0ZXIgd2lsbCBoYXZlIHRvIGJlIGNvbmZpZ3VyZWQgdG8gcmVkaXJlY3QKLSAgIGEgcG9ydCAoaS5lLiA1NTAwIG9yIG1heWJlIGRpZmZlcmVudCBvbmUgaWYgeW91IGxpa2UpIHRvIHRoZSB2bmN2aWV3ZXIKLSAgIG1hY2hpbmUuIElmIHRoZSB2bmN2aWV3ZXIgbWFjaGluZSBhbHNvIGhhcyBpdHMgb3duIGhvc3QtbGV2ZWwKLSAgIGZpcmV3YWxsLCB5b3Ugd2lsbCBoYXZlIHRvIG9wZW4gdXAgdGhlIHBvcnQgdGhlcmUgYXMgd2VsbC4KLQotICAgTkFULTItTkFUOiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGdvICJOQVQtMi1OQVQiLCBpLmUuIGJvdGggVXNlcgotICAgYW5kIEhlbHBkZXNrIHdvcmtzdGF0aW9ucyBiZWhpbmQgTkFUJ2luZyBGaXJld2FsbC9Sb3V0ZXJzIHdpdGhvdXQKLSAgIGNvbmZpZ3VyaW5nIGEgcm91dGVyIHRvIGRvIGEgcG9ydCByZWRpcmVjdGlvbiAoaS5lLiBvbiB5b3VyIHNpZGUsIHRoZQotICAgSGVscERlc2suKSBUbyBhdm9pZCBtb2RpZnlpbmcgZWl0aGVyIGZpcmV3YWxsL3JvdXRlciwgb25lIHdvdWxkIG5lZWQKLSAgIHNvbWUgcHVibGljIChJUCBhZGRyZXNzIHJlYWNoYWJsZSBvbiB0aGUgaW50ZXJuZXQpIHJlZGlyZWN0aW9uL3Byb3h5Ci0gICBzZXJ2aWNlLiBQZXJoYXBzIHN1Y2ggYSB0aGluZyBleGlzdHMuIGh0dHA6Ly9zYy51dm5jLmNvbSBwcm92aWRlcyB0aGlzCi0gICBzZXJ2aWNlIGZvciB0aGVpciBVbHRyYVZOQyBTaW5nbGUgQ2xpY2sgdXNlcnMuCi0KLSAgIFVwZGF0ZTogSXQgbWF5IGJlIHBvc3NpYmxlIHRvIGRvICJOQVQtMi1OQVQiIHdpdGggYSBVRFAgdHVubmVsIHN1Y2ggYXMKLSAgIGh0dHA6Ly9zYW15LnBsL3B3bmF0Ly4gQWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdGhhdCBib3RoIE5BVCBmaXJld2FsbHMKLSAgIGFsbG93IGluIFVEUCBwYWNrZXRzIGZyb20gYW4gSVAgYWRkcmVzcyB0byB3aGljaCBhIFVEUCBwYWNrZXQgaGFzCi0gICByZWNlbnRseSBiZWVuIHNlbnQgdG8uIElmIHlvdSB0cnkgaXQgb3V0IGxldCB1cyBrbm93IGhvdyBpdCB3ZW50LgotCi0KLSAgIFZlcnkgTmFpdmUgVXNlcnM6Ci0KLSAgIElmIGl0IGlzIGJleW9uZCB0aGUgdXNlciBob3cgdG8gb3BlbiBhIHRlcm1pbmFsIHdpbmRvdyBhbmQgcGFzdGUgaW4gYQotICAgY29tbWFuZCAoeW91IGhhdmUgbXkgY29uZG9sZW5jZXMuLi4pIHlvdSB3b3VsZCBoYXZlIHRvIHNvbWVob3cgc2V0dXAKLSAgIGhpcyBXZWIgYnJvd3NlciB0byBkb3dubG9hZCB0aGUgInZuYyIgZmlsZSAob3IgYSBzY3JpcHQgY29udGFpbmluZyB0aGUKLSAgIGFib3ZlIHdnZXQgbGluZSkgYW5kIHByb21wdCB0aGUgdXNlciBpZiBoZSB3YW50cyB0byBydW4gaXQuIFRoaXMgbWF5Ci0gICBiZSB0cmlja3kgdG8gc2V0IHVwICh3aGljaCBpcyBwcm9iYWJseSBhIGdvb2QgdGhpbmcgdG8gbm90IGhhdmUgdGhlCi0gICB3ZWIgYnJvd3NlciByZWFkaWx5IHJ1biBhcmJpdHJhcnkgcHJvZ3JhbXMgZG93bmxvYWRlZCBmcm9tIHRoZQotICAgaW50ZXJuZXQuLi4pCi0KLSAgIE9uZSBjb21tYW5kLWxpbmUgZnJlZSB3YXksIHRlc3RlZCB3aXRoIEtERSwgaXMgdG8gbmFtZSB0aGUgZmlsZSB2bmMuc2gKLSAgIGFuZCB0aGVuIGluc3RydWN0IHRoZSB1c2VyIHRvIHJpZ2h0LWNsaWNrIG9uIHRoZSBsaW5rIGFuZCBkbyAiU2F2ZQotICAgTGluayBBcyIgdG8gaGlzIERlc2t0b3AuIEl0IHdpbGwgYXBwZWFyIGFzIGFuIGljb24sIHByb2JhYmx5IG9uZSB0aGF0Ci0gICBsb29rcyBsaWtlIGEgdGVybWluYWwgb3IgYSBjb21tYW5kIGxpbmUgcHJvbXB0LiBIZSBuZXh0IHNob3VsZAotICAgcmlnaHQtY2xpY2sgb24gdGhlIGljb24gYW5kIHNlbGVjdCAiUHJvcGVydGllcyIgYW5kIGdvIHRvIHRoZQotICAgIlBlcm1pc3Npb25zIiB0YWIuIFRoZW4gaW4gdGhhdCBkaWFsb2cgc2VsZWN0IHRoZSBjaGVja2JveCAiSXMKLSAgIGV4ZWN1dGFibGUiLiBIZSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvIGNsaWNrIG9uIHRoZSBpY29uIHRvIGxhdW5jaCBpdC4KLSAgIEFub3RoZXIgb3B0aW9uIGlzIHRvIHJpZ2h0LWNsaWNrIG9uIHRoZSBpY29uIGFuZCBzZWxlY3QgIk9wZW4gV2l0aCAtPgotICAgT3RoZXIgLi4uIiBhbmQgZm9yIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0eXBlIGluICIvYmluL3NoIi4KLSAgIFVuZm9ydHVuYXRlbHkgaW4gYm90aCBjYXNlcyB0aGUgY29tbWFuZCBvdXRwdXQgaXMgbG9zdCBhbmQgc28gZXJyb3JzCi0gICBjYW5ub3QgYmUgZGVidWdnZWQgYXMgZWFzaWx5LiBBIHNpbWlsYXIgdGhpbmcgYXBwZWFycyB0byB3b3JrIGluIEdOT01FCi0gICBpZiB1bmRlciAiUHJvcGVydGllcyAtPiBQZXJtaXNzaW9ucyIgdGhleSBjbGljayBvbiAiRXhlY3V0ZSIgY2hlY2tib3gKLSAgIGZvciAiT3duZXIiLiBUaGVuIHdoZW4gdGhleSBjbGljayBvbiB0aGUgaWNvbiwgdGhleSB3aWxsIGdldCBhIGRpYWxvZwotICAgd2hlcmUgdGhleSBjYW4gc2VsZWN0ICJSdW4gaW4gVGVybWluYWwiLiBJbiBnZW5lcmFsIGZvciBzdWNoIGNhc2VzLCBpZgotICAgaXQgaXMgZmVhc2libGUsIGl0IG1pZ2h0IGJlIGVhc2llciB0byBzc2ggdG8gaGlzIG1hY2hpbmUgYW5kIHNldAotICAgdGhpbmdzIHVwIHlvdXJzZWxmLi4uCi0KLQotICAgU1NMIEVuY3J5cHRlZCBIZWxwZGVzayBDb25uZWN0aW9uczoKLQotICAgQXMgb2YgQXByLzIwMDcgeDExdm5jIHN1cHBvcnRzIHJldmVyc2UgY29ubmVjdGlvbnMgaW4gU1NMIGFuZCBzbyB3ZQotICAgY2FuIGRvIHRoaXMuIE9uIHRoZSBIZWxwZGVzayBzaWRlIChWaWV3ZXIpIHlvdSB3aWxsIG5lZWQgU1RVTk5FTCBvcgotICAgYmV0dGVyIHVzZSB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZSB3ZSBwcm92aWRlCi0gICB0aGF0IGF1dG9tYXRlcyBhbGwgb2YgdGhlIFNTTCBmb3IgeW91LgotCi0gICBUbyBkbyB0aGlzIGNyZWF0ZSBhIGZpbGUgbmFtZWQgInZuY3MiIGluIHRoZSB3ZWJzaXRlICJoZCIgZGlyZWN0b3J5Ci0gICBjb250YWluaW5nIHRoZSBmb2xsb3dpbmc6Ci0jIS9iaW4vc2gKLQotd2ViaG9zdD0iaHR0cDovL3d3dy5teXNpdGUuY29tL2hkIiAgIyBZb3VyIGhlbHBkZXNrIGRpciBVUkwuCi0KLXZuY2hvc3Q9ImlwLnNvbWVwbGFjZS5uZXQiICAgICAgICAgICMgWW91ciBob3N0IHJ1bm5pbmcgJ3ZuY3ZpZXdlciAtbGlzdGVuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJdCBjb3VsZCBhbHNvIGJlIHlvdXIgSVAgbnVtYmVyLiBJZiBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHJvdXRlci9maXJld2FsbCwgeW91IHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb25maWd1cmUgaXQgdG8gcmVkaXJlY3QgcG9ydCA1NTAwIHRvIHlvdQotcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3Jrc3RhdGlvbiBydW5uaW5nICd2bmN2aWV3ZXIgLWxpc3RlbicKLQotZGlyPS90bXAvdm5jX2hlbHBkZXNrLiQkICAgICAgICAgICAgIyBNYWtlIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyLgotbWtkaXIgJGRpciB8fCBleGl0IDEKLWNkICRkaXIgfHwgZXhpdCAxCi0KLXRyYXAgImNkIC90bXA7IHJtIC1yZiAkZGlyIiAwIDIgMTUgICMgQ2xlYW5zIHVwIG9uIGV4aXQuCi0KLXdnZXQgJHdlYmhvc3QveDExdm5jICAgICAgICAgICAgICAgICMgRmV0Y2ggeDExdm5jIGJpbmFyeS4gIElmIG11bHRpLQotY2htb2QgNzU1IC4veDExdm5jICAgICAgICAgICAgICAgICAgIyBwbGF0Zm9ybSwgdXNlICR3ZWJob3N0L2B1bmFtZWAveDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yIHNpbWlsYXIuCi0KLS4veDExdm5jIC1jb25uZWN0X29yX2V4aXQgJHZuY2hvc3QgLXJmYnBvcnQgMCAtbm9wdyAtc3NsICAgICMgTm90ZSAtc3NsIG9wdGlvbi4KLQotICAgd2l0aCB0aGUgaG9zdG5hbWVzIG9yIElQIGFkZHJlc3NlcyBjdXN0b21pemVkIHRvIHlvdXIgY2FzZS4KLQotICAgVGhlIG9ubHkgY2hhbmdlIGZyb20gdGhlICJ2bmMiIGFib3ZlIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgLXNzbAotICAgb3B0aW9uIHRvIHgxMXZuYy4gVGhpcyB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBTU0wgY2VydDogb3BlbnNzbCgxKQotICAgd2lsbCBuZWVkIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgdXNlcidzIGVuZC4gQSBmaXhlZCBTU0wgY2VydCBmaWxlCi0gICBjb3VsZCBiZSB1c2VkIHRvIGF2b2lkIHRoaXMgKGFuZCBwcm92aWRlIHNvbWUgYXV0aGVudGljYXRpb247IG1vcmUKLSAgIGluZm8gaGVyZS4pCi0KLSAgIFRoZSBuYWl2ZSB1c2VyIHdpbGwgYmUgZG9pbmcgdGhpczoKLSAgIHdnZXQgLXFPIC0gaHR0cDovL3d3dy5teXNpdGUuY29tL2hkL3ZuY3MgfCBzaCAtCi0KLSAgIChvciBwZXJoYXBzIGV2ZW4gdXNlIGh0dHBzOi8vIGlmIGF2YWlsYWJsZS4pCi0KLSAgIEJ1dCBiZWZvcmUgdGhhdCwgdGhlIGhlbHBkZXNrIG9wZXJhdG9yIG5lZWRzIHRvIGhhdmUgInZuY3ZpZXdlcgotICAgLWxpc3RlbiIgcnVubmluZyBhcyBiZWZvcmUsIGhvd2V2ZXIgaGUgbmVlZHMgYW4gU1NMIHR1bm5lbCBhdCBoaXMgZW5kLgotICAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdXNlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpLgotICAgU3RhcnQgaXQsIGFuZCBzZWxlY3QgT3B0aW9ucyAtPiAnUmV2ZXJzZSBWTkMgQ29ubmVjdGlvbiAoLWxpc3RlbiknLgotICAgVGhlbiBVTi1zZWxlY3QgJ1ZlcmlmeSBBbGwgQ2VydHMnICh0aGlzIGNhbiBiZSBlbmFibGVkIGxhdGVyIGlmIHlvdQotICAgd2FudDsgeW91J2xsIG5lZWQgdGhlIHgxMXZuYyBTU0wgY2VydGlmaWNhdGUpLCBhbmQgY2xpY2sgJ0xpc3RlbicuCi0KLSAgIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBTU1ZOQyBmb3IgdGhlIHZpZXdlciwgYnV0IHJhdGhlciBzZXQgdXAKLSAgIFNUVU5ORUwgbWFudWFsbHkgaW5zdGVhZCwgbWFrZSBhIGZpbGUgInN0dW5uZWwuY2ZnIiBjb250YWluaW5nOgotZm9yZWdyb3VuZCA9IHllcwotcGlkID0KLQotW3ZuY10KLWFjY2VwdCA9IDU1MDAKLWNvbm5lY3QgPSBsb2NhbGhvc3Q6NTUwMQotCi0gICBhbmQgcnVuOgotICBzdHVubmVsIC4vc3R1bm5lbC5jZmcKLQotICAgYW5kIHRoZW4gc3RhcnQgdGhlICJ2bmN2aWV3ZXIgLWxpc3RlbiAxIiAoaS5lLiAxIHRvIGNvcnJlc3BvbmQgdG8gdGhlCi0gICA1NTAxIHBvcnQuKSBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBzdHVubmVsIGluc3RhbGwgY3JlYXRlZCBhCi0gICBTZXJ2ZXIgU1NMIGNlcnQra2V5LCB1c3VhbGx5IC9ldGMvc3R1bm5lbC9zdHVubmVsLnBlbSAobm90IGFsbCBkaXN0cm9zCi0gICB3aWxsIGRvIHRoaXMuKSBBbHNvLCB0aGF0IGZpbGUgaXMgYnkgZGVmYXVsdCBvbmx5IHJlYWRhYmxlIGJ5IHJvb3QsIHNvCi0gICBzdHVubmVsIG5lZWRzIHRvIGJlIHJ1biBhcyByb290LiBJZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEga2V5Ci0gICBpbnN0YWxsZWQgb3IgeW91IGRvIG5vdCB3YW50IHRvIHJ1biBzdHVubmVsIGFzIHJvb3QgKG9yIGNoYW5nZSB0aGUKLSAgIHBlcm1pc3Npb25zIG9uIHRoZSBmaWxlKSwgeW91IGNhbiB1c2UgeDExdm5jIHRvIGNyZWF0ZSBvbmUgZm9yIHlvdSBmb3IKLSAgIGV4YW1wbGU6Ci0gIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjpteXN0dW5uZWwKLQotICAgYW5zd2VyIHRoZSBwcm9tcHRzIHdpdGggd2hhdGV2ZXIgeW91IHdhbnQ7IHlvdSBjYW4gdGFrZSB0aGUgZGVmYXVsdAotICAgZm9yIGFsbCBvZiB0aGVtIGlmIHlvdSBsaWtlLiBUaGUgb3BlbnNzbCgxKSBwYWNrYWdlIG11c3QgYmUgaW5zdGFsbGVkLgotICAgU2VlIHRoaXMgbGluayBhbmQgdGhpcyBvbmUgdG9vIGZvciBtb3JlIGluZm8gb24gU1NMIGNlcnRzLiBUaGlzCi0gICBjcmVhdGVzICRIT01FLy52bmMvY2VydHMvc2VydmVyLXNlbGY6bXlzdHVubmVsLnBlbSwgdGhlbiB5b3Ugd291bGQKLSAgIGNoYW5nZSB0aGUgInN0dW5uZWwuY2ZnIiB0byBsb29rIHNvbWV0aGluZyBsaWtlOgotZm9yZWdyb3VuZCA9IHllcwotcGlkID0KLWNlcnQgPSAvaG9tZS9teXVzZXJuYW1lLy52bmMvY2VydHMvc2VydmVyLXNlbGY6bXlzdHVubmVsLnBlbQotCi1bdm5jXQotYWNjZXB0ID0gNTUwMAotY29ubmVjdCA9IGxvY2FsaG9zdDo1NTAxCi0KLSAgIEluIGFueSBldmVudCwgd2l0aCBzdHVubmVsIGhhdmluZyBiZWVuIHNldHVwLCB0aGUgbmFpdmUgdXNlciBpcwotICAgaW5zdHJ1Y3RlZCB0byBwYXN0ZSBpbiBhbmQgcnVuOgotICAgd2dldCAtcU8gLSBodHRwOi8vd3d3Lm15c2l0ZS5jb20vaGQvdm5jcyB8IHNoIC0KLQotICAgdG8gcGljayB1cCB0aGUgdm5jcyBzY3JpcHQgdGhpcyB0aW1lLgotCi0gICBPZiBjb3Vyc2UgaWYgYSBtYW4taW4tdGhlLW1pZGRsZSBjYW4gYWx0ZXIgd2hhdCB0aGUgdXNlciBkb3dubG9hZHMKLSAgIHRoZW4gYWxsIGJldHMgYXJlIG9mZiEuCi0KLSAgIE1vcmUgU1NMIHZhcmlhdGlvbnMgYW5kIGluZm8gYWJvdXQgY2VydGlmaWNhdGVzIGNhbiBiZSBmb3VuZCBoZXJlLgotCi0KLSAgIE9wZW5TU0wgbGlic3NsLnNvLjAuOS43IHByb2JsZW1zOgotCi0gICBJZiB5b3UgYnVpbGQgeW91ciBvd24gc3R1bm5lbCBvciB4MTF2bmMgZm9yIGRlcGxveW1lbnQsIHlvdSBtYXkgd2FudAotICAgdG8gc3RhdGljYWxseSBsaW5rIGxpYnNzbC5hIGFuZCBsaWJjcnlwdG8uYSBpbnRvIGl0IGJlY2F1c2UgTGludXgKLSAgIGRpc3Ryb3MgYXJlIGN1cnJlbnRseSBhIGJpdCBvZiBhIG1lc3MgcmVnYXJkaW5nIHdoaWNoIHZlcnNpb24gb2YKLSAgIGxpYnNzbCBpcyBpbnN0YWxsZWQuCi0KLSAgIFlvdSB3aWxsIGZpbmQgdGhlIGRldGFpbHMgaGVyZS4KLQotCi0gICBRLTEyNzogQ2FuIEkgKHRlbXBvcmFyaWx5KSBtb3VudCBteSBsb2NhbCAodmlld2VyLXNpZGUpIFdpbmRvd3MvU2FtYmEKLSAgIEZpbGUgc2hhcmUgb24gdGhlIG1hY2hpbmUgd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmc/Ci0KLSAgIFlvdSB3aWxsIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIG5ldHdvcmsgcmVkaXJlY3Rpb24gZm9yIHRoaXMuCi0gICBGaWxlc3lzdGVtIG1vdW50aW5nIGlzIG5vdCBwYXJ0IG9mIHRoZSBWTkMgcHJvdG9jb2wuCi0KLSAgIFdlIHNob3cgYSBzaW1wbGUgU2FtYmEgZXhhbXBsZSBoZXJlLgotCi0gICBGaXJzdCB5b3Ugd2lsbCBuZWVkIGEgdHVubmVsIHRvIHJlZGlyZWN0IHRoZSBTTUIgcmVxdWVzdHMgZnJvbSB0aGUKLSAgIHJlbW90ZSBtYWNoaW5lIHRvIHRoZSBvbmUgeW91IHNpdHRpbmcgYXQuIFdlIHVzZSBhbiBzc2ggdHVubmVsOgotICBzaXR0aW5nLWhlcmU+IHNzaCAtQyAtUiAxMTM5OmxvY2FsaG9zdDoxMzkgZmFyLWF3YXkuZWFzdAotCi0gICBPciBvbmUgY291bGQgY29tYmluZSB0aGlzIHdpdGggdGhlIFZOQyB0dW5uZWwgYXQgdGhlIHNhbWUgdGltZSwgZS5nLjoKLSAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgMTEzOTpsb2NhbGhvc3Q6MTM5IC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWF3YXkKLS5lYXN0ICd4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKLQotICAgUG9ydCAxMzkgaXMgdGhlIFdpbmRvd3MgU2VydmljZSBwb3J0LiBGb3IgV2luZG93cyBzeXN0ZW1zIGluc3RlYWQgb2YKLSAgIFNhbWJhLCB5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBhY3R1YWwgSVAgYWRkcmVzcyBvZiB0aGUgV2luZG93IG1hY2hpbmUKLSAgIGluc3RlYWQgb2YgImxvY2FsaG9zdCIgaW4gdGhlIC1SIG9wdGlvbiAoc2luY2UgdGhlIFdpbmRvd3Mgc2VydmljZQotICAgZG9lcyBub3QgbGlzdGVuIG9uIGxvY2FsaG9zdCBieSBkZWZhdWx0LikKLQotICAgTm90ZSB0aGF0IHdlIHVzZSAxMTM5IGluc3RlYWQgb2YgMTM5IG9uIHRoZSByZW1vdGUgc2lkZSBiZWNhdXNlIDEzOQotICAgd291bGQgcmVxdWlyZSByb290IHBlcm1pc3Npb24gdG8gbGlzdGVuIG9uIChhbmQgeW91IG1heSBoYXZlIGEgc2FtYmEKLSAgIHNlcnZlciBydW5uaW5nIG9uIGl0IGFscmVhZHkuKQotCi0gICBUaGUgc3NoIC1DIGlzIHRvIGVuYWJsZSBjb21wcmVzc2lvbiwgd2hpY2ggbWlnaHQgc3BlZWQgdXAgdGhlIGRhdGEKLSAgIHRyYW5zZmVycy4KLQotICAgRGVwZW5kaW5nIG9uIHRoZSByZW1vdGUgc3lzdGVtIHNpZGUgY29uZmlndXJhdGlvbiwgaXQgbWF5IG9yIG1heSBub3QKLSAgIGJlIHBvc3NpYmxlIHRvIG1vdW50IHRoZSBTTUIgc2hhcmUgYXMgYSBub24tcm9vdCB1c2VyLiBUcnkgaXQgZmlyc3QgYXMKLSAgIGEgbm9uLXJvb3QgdXNlciBhbmQgaWYgdGhhdCBmYWlscyB5b3Ugd2lsbCBoYXZlIHRvIGJlY29tZSByb290LgotCi0gICBXZSB3aWxsIGFzc3VtZSB0aGUgdXNlciBuYW1lIGlzICJmcmVkIiBhbmQgd2Ugd2lsbCB0cnkgdG8gbW91bnQgdGhlCi0gICB2aWV3ZXItc2lkZSBXaW5kb3dzIFNNQiBzaGFyZSAiLy9oYXlzdGFjay9wdWIiIGluCi0gICAvaG9tZS9mcmVkL3NtYi1oYXlzdGFjay1wdWIuCi0gIGZhci1hd2F5PiBta2RpciAtcCAvaG9tZS9mcmVkL3NtYi1oYXlzdGFjay1wdWIKLSAgZmFyLWF3YXk+IHNtYm1vdW50IC8vaGF5c3RhY2svcHViIC9ob21lL2ZyZWQvc21iLWhheXN0YWNrLXB1YiAtbyB1c2VybmFtZT1mcmUKLWQsaXA9MTI3LjAuMC4xLHBvcnQ9MTEzOQotCi0gICAoVGhlIDJuZCBjb21tYW5kIG1heSBuZWVkIHRvIGJlIHJ1biBhcyByb290LikgVGhlbiBydW4gImRmIiBvciAibHMgLWwKLSAgIC9ob21lL2ZyZWQvc21iLWhheXN0YWNrLXB1YiIgdG8gc2VlIGlmIGl0IGlzIG1vdW50ZWQgcHJvcGVybHkuIENvbnN1bHQKLSAgIHRoZSBzbWJtb3VudCg4KSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uIChpdCBtYXkgcmVxdWlyZSBzb21lCi0gICBmaWRkbGluZyB0byBnZXQgd3JpdGUgcGVybWlzc2lvbnMgY29ycmVjdCwgZXRjLikgVG8gdW5tb3VudDoKLSAgZmFyLWF3YXk+IHNtYnVtb3VudCAvaG9tZS9mcmVkL3NtYi1oYXlzdGFjay1wdWIKLQotICAgQXQgc29tZSBwb2ludCB3ZSBob3BlIHRvIGZvbGQgc29tZSBhdXRvbWF0aW9uIGZvciBTTUIgc3NoIHJlZGlyIHNldHVwCi0gICBpbnRvIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBwYWNrYWdlIHdlIHByb3ZpZGUgKGFzIG9mCi0gICBTZXAgMjAwNiBpdCBpcyB0aGVyZSBmb3IgdGVzdGluZy4pCi0KLQotICAgUS0xMjg6IENhbiBJIHJlZGlyZWN0IENVUFMgcHJpbnQgam9icyBmcm9tIHRoZSByZW1vdGUgZGVza3RvcCB3aGVyZQotICAgeDExdm5jIGlzIHJ1bm5pbmcgdG8gYSBwcmludGVyIG9uIG15IGxvY2FsICh2aWV3ZXItc2lkZSkgbWFjaGluZT8KLQotICAgWW91IHdpbGwgaGF2ZSB0byB1c2UgYW4gZXh0ZXJuYWwgbmV0d29yayByZWRpcmVjdGlvbiBmb3IgdGhpcy4KLSAgIFByaW50aW5nIGlzIG5vdCBwYXJ0IG9mIHRoZSBWTkMgcHJvdG9jb2wuCi0KLSAgIFdlIHNob3cgYSBzaW1wbGUgVW5peCB0byBVbml4IENVUFMgZXhhbXBsZSBoZXJlLiBOb24tQ1VQUyBwb3J0Ci0gICByZWRpcmVjdGlvbnMgKGUuZy4gTFBEKSBzaG91bGQgYWxzbyBiZSBwb3NzaWJsZSwgYnV0IG1heSBiZSBhIGJpdCBtb3JlCi0gICB0cmlja3kuIElmIHlvdSBhcmUgdmlld2luZyBvbiBXaW5kb3dzIFNNQiBhbmQgZG9uJ3QgaGF2ZSBhIGxvY2FsIGN1cHMKLSAgIHNlcnZlciBpdCBtYXkgYmUgdHJpY2tpZXIgc3RpbGwgKHNlZSBiZWxvdy4pCi0KLSAgIEZpcnN0IHlvdSB3aWxsIG5lZWQgYSB0dW5uZWwgdG8gcmVkaXJlY3QgdGhlIHByaW50IHJlcXVlc3RzIGZyb20gdGhlCi0gICByZW1vdGUgbWFjaGluZSB0byB0aGUgb25lIHlvdSBzaXR0aW5nIGF0LiBXZSB1c2UgYW4gc3NoIHR1bm5lbDoKLSAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgNjYzMTpsb2NhbGhvc3Q6NjMxIGZhci1hd2F5LmVhc3QKLQotICAgT3Igb25lIGNvdWxkIGNvbWJpbmUgdGhpcyB3aXRoIHRoZSBWTkMgdHVubmVsIGF0IHRoZSBzYW1lIHRpbWUsIGUuZy46Ci0gIHNpdHRpbmctaGVyZT4gc3NoIC1DIC1SIDY2MzE6bG9jYWxob3N0OjYzMSAtdCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwIGZhci1hd2F5Ci0uZWFzdCAneDExdm5jIC1sb2NhbGhvc3QgLWRpc3BsYXkgOjAnCi0KLSAgIFBvcnQgNjMxIGlzIHRoZSBkZWZhdWx0IENVUFMgcG9ydC4gVGhlIGFib3ZlIGFzc3VtZXMgeW91IGhhdmUgYSBDdXBzCi0gICBzZXJ2ZXIgcnVubmluZyBvbiB5b3VyIHZpZXdlciBtYWNoaW5lIChsb2NhbGhvc3Q6NjMxKSwgaWYgbm90LCB1c2UKLSAgIHNvbWV0aGluZyBsaWtlIG15LWN1cHMtc3J2OjYzMSAodGhlIHZpZXdlci1zaWRlIEN1cHMgc2VydmVyKSBpbiB0aGUgLVIKLSAgIGluc3RlYWQuCi0KLSAgIE5vdGUgdGhhdCB3ZSB1c2UgNjYzMSBpbnN0ZWFkIG9mIDYzMSBvbiB0aGUgcmVtb3RlIHNpZGUgYmVjYXVzZSA2MzEKLSAgIHdvdWxkIHJlcXVpcmUgcm9vdCBwZXJtaXNzaW9uIHRvIGxpc3RlbiBvbiAoYW5kIHlvdSBsaWtlbHkgaGF2ZSBhIGN1cHMKLSAgIHNlcnZlciBydW5uaW5nIG9uIGl0IGFscmVhZHkuKQotCi0gICBOb3cgdGhlIHRyaWNreSBwYXJ0OiB0byBnZXQgYXBwbGljYXRpb25zIHRvIG5vdGljZSB5b3VyIGN1cHMKLSAgIHNlcnZlci9wcmludGVyIG9uIGxvY2FsaG9zdDo2NjMxLgotCi0gICBJZiB5b3UgaGF2ZSBhZG1pbmlzdHJhdGl2ZSBwcml2aWxlZ2UgKGkuZS4gcm9vdCBwYXNzd29yZCkgb24gdGhlCi0gICB4MTF2bmMgc2lkZSB3aGVyZSB0aGUgZGVza3RvcCBpcyBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWFzeSB0byBhZGQgdGhlCi0gICBwcmludGVyIHRocm91Z2ggc29tZSBjb25maWd1cmF0aW9uIHV0aWxpdHkgKGUuZy4gaW4gS0RFOiBVdGlsaXRpZXMgLT4KLSAgIFByaW50aW5nIC0+IFByaW50aW5nIE1hbmFnZXIsIGFuZCB0aGVuIHN1cHBseSBhZG1pbiBwYXNzd29yZCwgYW5kIHRoZW4KLSAgIEFkZCBQcmludGVyL0NsYXNzLCBhbmQgdGhlbiBmaWxsIGluIHRoZSBpbnF1aXNpdGl2ZSB3aXphcmQuIE1vc3QKLSAgIGltcG9ydGFudCBpcyB0aGUgIlJlbW90ZSBJUFAgc2VydmVyIiBwYW5lbCB3aGVyZSB5b3UgcHV0IGluIGxvY2FsaG9zdAotICAgZm9yIEhvc3QgYW5kIDY2MzEgZm9yIFBvcnQuKSBUaGUgbWFpbiBzZXR0aW5nIHlvdSB3YW50IHRvIGNvbnZleSBpcwotICAgdGhlIGhvc3QgaXMgbG9jYWxob3N0IGFuZCB0aGUgcG9ydCBpcyBub24tc3RhbmRhcmQgKGUuZy4gNjYzMS4pIFNvbWUKLSAgIGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIHdpbGwgdGFrZSBhbiBJbnRlcm5ldCBQcmludGluZyBQcm90b2NvbCAoSVBQKQotICAgVVJJLCBlLmcuIGh0dHA6Ly9sb2NhbGhvc3Q6NjYzMS9wcmludGVycy8sCi0gICBpcHA6Ly9sb2NhbGhvc3Q6NjYzMS9wcmludGVycy9wcmludGVyLW5hbWUsCi0gICBpcHA6Ly9sb2NhbGhvc3Q6NjYzMS9pcHAvcHJpbnRlci1uYW1lLCBldGMuIENoZWNrIHlvdXIgQ1VQUwotICAgZG9jdW1lbnRhdGlvbiBhbmQgYWRtaW4gaW50ZXJmYWNlcyB0byBmaW5kIHdoYXQgdGhlIHN5bnRheCBpcyBhbmQgd2hhdAotICAgdGhlICJwcmludGVyIG5hbWUiIGlzLgotCi0gICBJZiB5b3UgZG8gbm90IGhhdmUgcm9vdCBvciBwcmludCBhZG1pbiBwcml2aWxlZ2VzLCBidXQgYXJlIHJ1bm5pbmcgYQotICAgcmVjZW50ICh2ZXJzaW9uIDEuMiBvciBncmVhdGVyKSBvZiB0aGUgQ3VwcyBjbGllbnQgc29mdHdhcmUsIHRoZW4gYW4KLSAgIGVhc3kgd2F5IHRvIHRlbXBvcmFyaWx5IHN3aXRjaCBDdXBzIHNlcnZlcnMgaXMgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkKLSAgIGFuZCBmaWxlOiAkSE9NRS8uY3Vwcy9jbGllbnQuY29uZiBvbiB0aGUgcmVtb3RlIHNpZGUgd2l0aCBhIGxpbmUgbGlrZToKLSAgU2VydmVyTmFtZSBsb2NhbGhvc3Q6NjYzMQotCi0gICBXaGVuIG5vdCB1c2luZyB4MTF2bmMgZm9yIHJlbW90ZSBhY2Nlc3MgeW91IGNhbiBjb21tZW50IHRoZSBhYm92ZSBsaW5lCi0gICBvdXQgd2l0aCBhICcjJyAob3IgcmVuYW1lIHRoZSBjbGllbnQuY29uZiBmaWxlKSwgdG8gaGF2ZSBub3JtYWwgY3VwcwotICAgb3BlcmF0aW9uLgotCi0gICBVbmZvcnR1bmF0ZWx5LCBydW5uaW5nIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgdG8gbm90aWNlCi0gICB0aGUgbmV3IHByaW50ZXJzIChsaWJjdXBzIGRvZXMgbm90IHRyYWNrIGNoYW5nZXMgaW4gY2xpZW50LmNvbmYuKQotICAgRGVwZW5kaW5nIG9uIGNpcmN1bXN0YW5jZXMsIGEgcnVubmluZyBhcHBsaWNhdGlvbiBtYXkgYWN0dWFsbHkgbm90aWNlCi0gICB0aGUgbmV3IHByaW50ZXJzIHdpdGhvdXQgcmVzdGFydGluZyAoZS5nLiBubyBwcmludCBkaWFsb2cgaGFzIHRha2VuCi0gICBwbGFjZSB5ZXQsIG9yIHRoZXJlIGFyZSBubyBDVVBTIHByaW50ZXJzIGNvbmZpZ3VyZWQgb24gdGhlIHJlbW90ZQotICAgc2lkZS4pCi0KLSAgIEN1cHMgY2xpZW50IHNvZnR3YXJlIHRoYXQgaXMgb2xkZXIgKDEuMSkgZG9lcyBub3Qgc3VwcG9ydCBhcHBlbmRpbmcKLSAgIHRoZSBwb3J0IG51bWJlciwgYW5kIGZvciBuZXdlciBvbmVzIHRoZXJlIGlzIGEgYnVnIHByZXZlbnRpbmcgaXQgZnJvbQotICAgYWx3YXlzIHdvcmtpbmcgKGZpeGVkIGluIDEuMi4zLikgS2x1ZGdlcyBsaWtlIHRoZXNlIGF0IHRoZSBjb21tYW5kCi0gICBsaW5lIHdpbGwgd29yazoKLSAgZmFyLWF3YXk+IGVudiBDVVBTX1NFUlZFUj1sb2NhbGhvc3QgSVBQX1BPUlQ9NjYzMSBscHN0YXQgLXAgLWQKLSAgZmFyLWF3YXk+IGVudiBDVVBTX1NFUlZFUj1sb2NhbGhvc3QgSVBQX1BPUlQ9NjYzMSBscHIgLVAgbXlwcmludGVyIGZpbGUucHMKLSAgZmFyLWF3YXk+IGVudiBDVVBTX1NFUlZFUj1sb2NhbGhvc3QgSVBQX1BPUlQ9NjYzMSBmaXJlZm94Ci0KLSAgIGJ1dCBhcmUgc29tZXdoYXQgYXdrd2FyZCBzaW5jZSB5b3UgaGF2ZSB0byByZXRyb2FjdGl2ZWx5IHNldCB0aGUgZW52LgotICAgdmFyIElQUF9QT1JULiBJdHMgdmFsdWUgY2Fubm90IGJlIGJyb2FkY2FzdCB0byBhbHJlYWR5IHJ1bm5pbmcgYXBwcwotICAgKGxpa2UgdGhlICRIT01FLy5jdXBzL2NsaWVudC5jb25mIHRyaWNrIHNvbWV0aW1lcyBkb2VzLikgQSBjb21tb24KLSAgIHdvcmthcm91bmQgZm9yIGFuIGFscmVhZHkgcnVubmluZyBhcHAgaXMgdG8gc29tZWhvdyBnZXQgaXQgdG8gIlByaW50Ci0gICBUbyBGaWxlIiwgZS5nLiBmaWxlLnBzIGFuZCB0aGVuIHVzZSBzb21ldGhpbmcgbGlrZSB0aGUgbHByIGV4YW1wbGUKLSAgIGFib3ZlLiBBbHNvLCB0aGUgb3B0aW9uICItaCBob3N0OnBvcnQiIHdvcmtzIHdpdGggQ1VQUyBscCgxKSBhbmQKLSAgIGxwcigxKS4KLQotICAgWW91IGNhbiBhbHNvIHByaW50IHRvIFdpbmRvd3Mgc2hhcmVzIHByaW50ZXJzIGluIHByaW5jaXBsZS4gWW91IG1heSBkbwotICAgdGhpcyB3aXRoIHRoZSBzbWJzcG9vbCg4KSBjb21tYW5kLCBvciBjb25maWd1cmUgdGhlIHJlbW90ZSBDVVBTIHZpYQotICAgbHBhZG1pbig4KSwgZXRjLCB0byB1c2UgYSBwcmludGVyIFVSSSBzb21ldGhpbmcgbGlrZQotICAgc21iOi8vbWFjaGluZTpwb3J0L3ByaW50ZXIgKHRoaXMgbWF5IGhhdmUgc29tZSBuYW1lIHJlc29sdXRpb24KLSAgIHByb2JsZW1zIFdSVCBsb2NhbGhvc3QuKSBBbHNvLCBhcyB3aXRoIFNNQiBtb3VudGluZywgdGhlIHBvcnQgcmVkaXIKLSAgICgtUikgdG8gdGhlIFdpbmRvd3MgbWFjaGluZSBtdXN0IHVzZSB0aGUgYWN0dWFsIElQIGFkZHJlc3MgaW5zdGVhZCBvZgotICAgImxvY2FsaG9zdCIuCi0KLSAgIEF0IHNvbWUgcG9pbnQgd2UgaG9wZSB0byBmb2xkIHNvbWUgYXV0b21hdGlvbiBmb3IgQ1VQUyBzc2ggcmVkaXIgc2V0dXAKLSAgIGludG8gdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIHBhY2thZ2Ugd2UgcHJvdmlkZSAoYXMgb2YKLSAgIFNlcCAyMDA2IGl0IGlzIHRoZXJlIGZvciB0ZXN0aW5nLikKLQotCi0gICBRLTEyOTogSG93IGNhbiBJIGhlYXIgdGhlIHNvdW5kIChhdWRpbykgZnJvbSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9ucwotICAgb24gdGhlIGRlc2t0b3AgSSBhbSB2aWV3aW5nIHZpYSB4MTF2bmM/Ci0KLSAgIFlvdSB3aWxsIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIG5ldHdvcmsgYXVkaW8gbWVjaGFuaXNtIGZvciB0aGlzLgotICAgQXVkaW8gaXMgbm90IHBhcnQgb2YgdGhlIFZOQyBwcm90b2NvbC4KLQotICAgV2Ugc2hvdyBhIHNpbXBsZSBVbml4IHRvIFVuaXggZXNkIGV4YW1wbGUgaGVyZSAoYXJ0c2Qgc2hvdWxkIGJlCi0gICBwb3NzaWJsZSB0b28sIHdlIGhhdmUgYWxzbyB2ZXJpZmllZCB0aGUgZXNkIFdpbmRvd3MgcG9ydCB3b3JrcyBmb3IgdGhlCi0gICBtZXRob2QgZGVzY3JpYmVkIGJlbG93LikKLQotICAgRmlyc3QgeW91IHdpbGwgbmVlZCBhIHR1bm5lbCB0byByZWRpcmVjdCB0aGUgYXVkaW8gZnJvbSB0aGUgcmVtb3RlCi0gICBtYWNoaW5lIHRvIHRoZSBvbmUgeW91IHNpdHRpbmcgYXQuIFdlIHVzZSBhbiBzc2ggdHVubmVsOgotICBzaXR0aW5nLWhlcmU+IHNzaCAtQyAtUiAxNjAwMTpsb2NhbGhvc3Q6MTYwMDEgZmFyLWF3YXkuZWFzdAotCi0gICBPciBvbmUgY291bGQgY29tYmluZSB0aGlzIHdpdGggdGhlIFZOQyB0dW5uZWwgYXQgdGhlIHNhbWUgdGltZSwgZS5nLjoKLSAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgMTYwMDE6bG9jYWxob3N0OjE2MDAxIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWEKLXdheS5lYXN0ICd4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKLQotICAgUG9ydCAxNjAwMSBpcyB0aGUgZGVmYXVsdCBFU0QgdXNlcy4gU28gd2hlbiBhbiBhcHBsaWNhdGlvbiBvbiB0aGUKLSAgIHJlbW90ZSBkZXNrdG9wIG1ha2VzIGEgc291bmQgaXQgd2lsbCBjb25uZWN0IHRvIHRoaXMgdHVubmVsIGFuZCBiZQotICAgcmVkaXJlY3RlZCB0byBwb3J0IDE2MDAxIG9uIHRoZSBsb2NhbCBtYWNoaW5lIChzaXR0aW5nLWhlcmUgaW4gdGhpcwotICAgZXhhbXBsZS4pIFRoZSAtQyBvcHRpb24gaXMgYW4gYXR0ZW1wdCB0byBjb21wcmVzcyB0aGUgYXVkaW8gYSBsaXR0bGUKLSAgIGJpdC4KLQotICAgU28gd2UgbmV4dCBuZWVkIGEgbG9jYWwgKHNpdHRpbmctaGVyZSkgZXNkIGRhZW1vbiBydW5uaW5nIHRoYXQgd2lsbAotICAgcmVjZWl2ZSB0aG9zZSByZXF1ZXN0cyBhbmQgcGxheSB0aGVtIG9uIHRoZSBsb2NhbCBzb3VuZCBkZXZpY2U6Ci0gIHNpdHRpbmctaGVyZT4gZXNkIC1wcm9taXNjdW91cyAtcG9ydCAxNjAwMSAtdGNwIC1iaW5kIDEyNy4wLjAuMQotCi0gICBTZWUgdGhlIGVzZCgxKSBtYW4gcGFnZSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbnMgKHRoZSBhYm92ZSBhcmUKLSAgIG5vdCB2ZXJ5IHNlY3VyZS4pIChUaGlzIG1ldGhvZCBhbHNvIHdvcmtzIHdpdGggdGhlIEVzb3VuRCB3aW5kb3dzIHBvcnQKLSAgIGVzZC5leGUpCi0KLSAgIFRvIHRlc3QgdGhpcyBzb3VuZCB0dW5uZWwsIHdlIHVzZSB0aGUgZXNkcGxheSBwcm9ncmFtIHRvIHBsYXkgYSBzaW1wbGUKLSAgIC53YXYgZmlsZToKLSAgZmFyLWF3YXk+IGVzZHBsYXkgLXMgbG9jYWxob3N0OjE2MDAxIGltX3NvX2hhcHB5LndhdgotCi0gICBJZiB5b3UgaGVhciB0aGUgc291bmQgKENhcHRhaW4gS2lyayBpbiB0aGlzIGV4YW1wbGUpLCB0aGF0IG1lYW5zIHlvdQotICAgYXJlIGluIGdyZWF0IHNoYXBlLgotCi0gICBUbyBydW4gaW5kaXZpZHVhbCBhdWRpbyBhcHBsaWNhdGlvbnMgeW91IGNhbiB1c2UgdGhlIGVzZGRzcCgxKQotICAgY29tbWFuZDoKLSAgZmFyLWF3YXk+IGVzZGRzcCAtcyBsb2NhbGhvc3Q6MTYwMDEgeG1tcwotCi0gICBUaGVuIHlvdSBjb3VsZCB0cnkgcGxheWluZyBzb21lIHNvdW5kcyBpbnNpZGUgeG1tcy4gWW91IGNvdWxkIGFsc28gc2V0Ci0gICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRVNQRUFLRVI9bG9jYWxob3N0OjE2MDAxIHRvIG5vdCBuZWVkIHRvCi0gICBzdXBwbHkgdGhlIC1zIG9wdGlvbiBhbGwgdGhlIHRpbWUuIChmb3IgcmVhc29ucyBub3QgY2xlYXIsIHNvbWV0aW1lcwotICAgZXNkZHNwIGNhbiBmaWd1cmUgaXQgb3V0IG9uIGl0cyBvd24uKSBBbGwgdGhlIHNjcmlwdCBlc2Rkc3AgZG9lcyBpcyB0bwotICAgc2V0IEVTUEVBS0VSIGFuZCBMRF9QUkVMT0FEIGZvciB5b3Ugc28gdGhhdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBvcGVucwotICAgdGhlIHNvdW5kIGRldmljZSAodXN1YWxseSAvZGV2L2RzcCkgaXRzIGludGVyYWN0aW9ucyB3aXRoIHRoZSBkZXZpY2UKLSAgIHdpbGwgYmUgaW50ZXJjZXB0ZWQgYW5kIHNlbnQgdG8gdGhlIGVzZCBkYWVtb24gcnVubmluZyBvbiBzaXR0aW5nLWhlcmUKLSAgICh0aGF0IGluIHR1cm4gd3JpdGVzIHRoZW0gdG8gdGhlIHJlYWwsIGxvY2FsIC9kZXYvZHNwLikKLQotICAgUmVkaXJlY3RpbmcgQWxsIHNvdW5kOgotCi0gICBJdCBkb2VzIG5vdCBzZWVtIHRvIGJlIHBvc3NpYmxlIHRvIHN3aXRjaCBhbGwgb2YgdGhlIHNvdW5kIG9mIHRoZQotICAgcmVtb3RlIG1hY2hpbmUgZnJvbSBpdHMgc291bmQgZGV2aWNlIHRvIHRoZSBhYm92ZSBlc2Qrc3NoIHR1bm5lbAotICAgd2l0aG91dCBzb21lIHByZXBhcmF0aW9uLiBCdXQgaXQgY2FuIGJlIGRvbmUgcmVhc29uYWJseSB3ZWxsIGlmIHlvdQotICAgcHJlcGFyZSAoaS5lLiByZXN0YXJ0KSB0aGUgZGVza3RvcCB3aXRoIHRoaXMgaW4gbWluZC4KLQotICAgSGVyZSBpcyBvbmUgd2F5IHRvIHJlZGlyZWN0IGFsbCBzb3VuZC4gVGhlIGlkZWEgaXMgd2UgcnVuIHRoZSBlbnRpcmUKLSAgIGRlc2t0b3Agd2l0aCBzb3VuZCBkaXJlY3RlZCB0byBsb2NhbGhvc3Q6MTYwMDEuIFdoZW4gd2UgYXJlIHNpdHRpbmcgYXQKLSAgIGZhci1hd2F5LmVhc3Qgd2UgcnVuICJlc2QgLXByb21pc2N1b3VzIC1wb3J0IDE2MDAxIC10Y3AgLWJpbmQKLSAgIDEyNy4wLjAuMSIgb24gZmFyLWF3YXkuZWFzdCAodG8gYmUgYWJsZSB0byBoZWFyIHRoZSBzb3VuZC4pIEhvd2V2ZXIsCi0gICB3aGVuIHdlIGFyZSBzaXR0aW5nIGF0IHNpdHRpbmctaGVyZS53ZXN0IHdlIGtpbGwgdGhhdCBlc2QgcHJvY2VzcyBhbmQKLSAgIHJ1biB0aGF0IHNhbWUgZXNkIGNvbW1hbmQgb24gc2l0dGluZy1oZXJlLndlc3QgYW5kIHN0YXJ0IHVwIHRoZSBhYm92ZQotICAgc3NoIHR1bm5lbC4gVGhpcyBpcyBhIGxpdHRsZSBhd2t3YXJkLCBidXQgd2l0aCBzb21lIHNjcmlwdHMgb25lIHdvdWxkCi0gICBwcm9iYWJseSBraWxsIGFuZCByZXN0YXJ0IHRoZSBlc2QgcHJvY2Vzc2VzIGF1dG9tYXRpY2FsbHkgd2hlbiB4MTF2bmMKLSAgIGlzIHVzZWQuCi0KLSAgIFNvIG5leHQgd2UgaGF2ZSB0byBydW4gdGhlIHdob2xlIGRlc2t0b3AgcG9pbnRpbmcgdG93YXJkIG91ciBlc2QuIEhlcmUKLSAgIGlzIGEgc2ltcGxlIHdheSB0byB0ZXN0LiBMb2cgaW4gdG8gdGhlIG1hY2hpbmUgdmlhIHRoZSAiRmFpbFNhZmUiCi0gICBkZXNrdG9wLiBUaGVuIGluIHRoZSBsb25lIHRlcm1pbmFsIHR5cGUgc29tZXRoaW5nIGxpa2U6Ci0gIGVzZGRzcCAtcyBsb2NhbGhvc3Q6MTYwMDEgZ25vbWUtc2Vzc2lvbgotb3I6Ci0gIGVzZGRzcCAtcyBsb2NhbGhvc3Q6MTYwMDEgc3RhcnRrZGUKLQotICAgd2hlcmUgdGhlIGxhc3QgcGFydCBpcyB3aGF0ZXZlciBjb21tYW5kIHN0YXJ0cyB5b3VyIGRlc2t0b3AgKGV2ZW4KLSAgIGZ2d20yLikgVGhpcyBjYXVzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBFU1BFQUtFUiBhbmQgTERfUFJFTE9BRAotICAgdG8gYmUgc2V0IGFwcHJvcHJpYXRlbHkgYW5kIGV2ZXJ5IGFwcGxpY2F0aW9uIChwcm9jZXNzZXMgd2l0aCB0aGUKLSAgIGRlc2t0b3AgYXMgYW4gYW5jZXN0b3IpIHdpbGwgdXNlIHRoZW0uIElmIHRoaXMgc2NoZW1lIHdvcmtzIHdlbGwgeW91Ci0gICBjYW4gbWFrZSBpdCBsZXNzIGtsdW5reSBieSBhZGRpbmcgdGhlIGNvbW1hbmQgdG8geW91ciB+Ly54c2Vzc2lvbiwKLSAgIGV0Yy4gZmlsZSB0aGF0IHN0YXJ0cyB5b3VyIGRlZmF1bHQgZGVza3RvcC4gT3IgeW91IG1heSBiZSBhYmxlIHRvCi0gICBjb25maWd1cmUgeW91ciBkZXNrdG9wIHRvIHVzZSBsb2NhbGhvc3Q6MTYwMDEsIG9yIHdoYXRldmVyIGlzIG5lZWRlZCwKLSAgIHZpYSBhIGd1aSBjb25maWd1cmF0aW9uIHBhbmVsLiBTb21lIE5vdGVzOgotICAgICAqIE5vdCBhbGwgYXVkaW8gYXBwbGljYXRpb25zIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIGVzZCBhbmQgYXJ0c2QKLSAgICAgICBtZWNoYW5pc21zLCBidXQgbWFueSBhcmUuCi0gICAgICogVGhlIGF1ZGlvIGlzIG5vdCBjb21wcmVzc2VkIHNvIHlvdSBwcm9iYWJseSBuZWVkIGEgYnJvYWRiYW5kIG9yCi0gICAgICAgZmFzdGVyIGNvbm5lY3Rpb24uIExpc3RlbmluZyB0byBtdXNpYyBtYXkgbm90IGJlIHZlcnkgcGxlYXNhbnQuLi4KLSAgICAgICAoQWx0aG91Z2ggd2UgZm91bmQgc3RyZWFtaW5nIG11c2ljIGZyb20gYWNyb3NzIHRoZSBVUyBvdmVyIGNhYmxlCi0gICAgICAgbW9kZW0gd29ya2VkIE9LLCBidXQgdG9vayAyMDAgS0Ivc2VjLCB0byB1c2UgbGVzcyBiYW5kd2lkdGgKLSAgICAgICBjb25zaWRlciBzb21ldGhpbmcgbGlrZSAic3NoIGZhci1hd2F5LmVhc3QgJ2NhdCBmYXZvcml0ZS5tcDMnIHwKLSAgICAgICBtcGcxMjMgLWIgNDAwMCAtIikKLSAgICAgKiBMaW51eCBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgdGhlIGNvbmNlcHQgb2YgTERfUFJFTE9BRF82NCBzbyBpZiB5b3UKLSAgICAgICBydW4gb24gYSBtaXhlZCA2NC0gYW5kIDMyLWJpdCBBQkkgc3lzdGVtIChlLmcuIEFNRCB4ODZfNjQpIHNvbWUgb2YKLSAgICAgICB0aGUgYXBwbGljYXRpb25zIHdpbGwgZmFpbCB0byBydW4gYmVjYXVzZSBMRF9QUkVMT0FEIHdpbGwgcG9pbnQgdG8KLSAgICAgICBsaWJyYXJpZXMgb2YgdGhlIHdyb25nIHdvcmRzaXplLgotICAgICAqIEF0IHNvbWUgcG9pbnQgd2UgaG9wZSB0byBmb2xkIHNvbWUgYXV0b21hdGlvbiBmb3IgZXNkIG9yIGFydHNkIHNzaAotICAgICAgIHJlZGlyIHNldHVwIGludG8gdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIHBhY2thZ2Ugd2UKLSAgICAgICBwcm92aWRlIChhcyBvZiBTZXAvMjAwNiBpdCBpcyB0aGVyZSBmb3IgdGVzdGluZy4pCi0KLQotICAgUS0xMzA6IFdoeSBkb24ndCBJIGhlYXIgdGhlICJCZWVwcyIgaW4gbXkgWCBzZXNzaW9uIChlLmcuIHdoZW4gdHlwaW5nCi0gICB0cHV0IGJlbCBpbiBhbiB4dGVybSk/Ci0KLSAgIEFzIG9mIERlYy8yMDAzICJCZWVwIiBYQmVsbCBldmVudHMgYXJlIHRyYWNrZWQgYnkgZGVmYXVsdC4gVGhlIFgKLSAgIHNlcnZlciBtdXN0IHN1cHBvcnQgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24gKHRoaXMgaXMgbm90IG9uIGJ5IGRlZmF1bHQKLSAgIGluIFNvbGFyaXMsIHNlZSBYc2VydmVyKDEpIGZvciBob3cgdG8gdHVybiBpdCBvbiB2aWEgK2tiKSwgYW5kIHNvIHlvdQotICAgd29uJ3QgaGVhciB0aGVtIGlmIHRoZSBleHRlbnNpb24gaXMgbm90IHByZXNlbnQuCi0KLSAgIElmIHlvdSBkb24ndCB3YW50IHRvIGhlYXIgdGhlIGJlZXBzIHVzZSB0aGUgLW5vYmVsbCBvcHRpb24uIElmIHlvdQotICAgd2FudCB0byBoZWFyIHRoZSBhdWRpbyBmcm9tIHRoZSByZW1vdGUgYXBwbGljYXRpb25zLCBjb25zaWRlciB0cnlpbmcgYQotICAgcmVkaXJlY3RvciBzdWNoIGFzIGVzZC4KLQotCi0gICBRLTEzMTogRG9lcyB4MTF2bmMgd29yayB3aXRoIElQdjY/Ci0KLSAgIFVwZGF0ZTogYXMgb2YgQXByLzIwMTAgaW4gdGhlIDAuOS4xMCB4MTF2bmMgZGV2ZWxvcG1lbnQgdGFyYmFsbCwgdGhlcmUKLSAgIGlzIG5vdyBidWlsdC1pbiBzdXBwb3J0IGZvciBJUHY2ICgxMjggYml0IGludGVybmV0IGFkZHJlc3Nlcy4pIFNlZSB0aGUKLSAgIC02IGFuZCAtY29ubmVjdCBvcHRpb25zIGZvciBkZXRhaWxzLgotCi0gICBUaGUgcmVtYWluZGVyIG9mIHRoaXMgRkFRIGVudHJ5IHNob3dzIGhvdyB0byBkbyB3aXRoIHRoaXMgd2l0aCBwcmUKLSAgIDAuOS4xMCB4MTF2bmMgdXNpbmcgSVB2NiBoZWxwZXIgdG9vbHMuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFVzaW5nIGFuIGV4dGVybmFsIElQdjYgaGVscGVyOgotICAgQSB3YXkgdG8gZG8gdGhpcyBpcyB2aWEgYSBzZXBhcmF0ZSBoZWxwZXIgcHJvZ3JhbSBzdWNoIGFzIGluZXRkIChvcgotICAgZm9yIGVuY3J5cHRlZCBjb25uZWN0aW9uczogc3NoIG9yIHN0dW5uZWwuKSBGb3IgZXhhbXBsZSwgeW91IGNvbmZpZ3VyZQotICAgeDExdm5jIHRvIGJlIHJ1biBmcm9tIGluZXRkIG9yIHhpbmV0ZCBhbmQgaW5zdHJ1Y3QgaXQgdG8gbGlzdGVuIG9uIGFuCi0gICBJUHY2IGFkZHJlc3MuIEZvciB4aW5ldGQgdGhlIHNldHRpbmcgImZsYWdzID0gSVB2NiIgd2lsbCBiZSBuZWVkZWQuCi0gICBGb3IgaW5ldGQuY29uZiwgYW4gZXhhbXBsZSBpczoKLSAgNTkwMCBzdHJlYW0gdGNwNiBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfd3JhcHBlci5zaAotCi0gICBXZSBhbHNvIHByb3ZpZGUgYSB0cmFuc2l0aW9uYWwgdG9vbCBpbiAieDExdm5jL21pc2MvaW5ldDZ0bzQiIHRoYXQKLSAgIGFjdHMgYXMgYSByZWxheSBmb3IgYW55IElQdjQgYXBwbGljYXRpb24gdG8gYWxsb3cgY29ubmVjdGlvbnMgb3ZlcgotICAgSVB2Ni4gRm9yIGV4YW1wbGU6Ci0gIGluZXQ2dG80IDU5MDAgbG9jYWxob3N0OjU5MDAKLQotICAgd2hlcmUgeDExdm5jIGlzIGxpc3RlbmluZyBvbiBJUHY0IHBvcnQgNTkwMC4KLQotICAgQWxzbyBub3RlIHRoYXQgbm90IGFsbCBWTkMgVmlld2VycyBhcmUgSVB2NiBlbmFibGVkLCBzbyBhIHJlZGlyZWN0b3IKLSAgIG1heSBhbHNvIGJlIG5lZWRlZCBmb3IgdGhlbS4gVGhlIHRvb2wgImluZXQ2dG80IC1yIC4uLiIgY2FuIGRvIHRoaXMgYXMKLSAgIHdlbGwuIFNTVk5DIChzZWUgYmVsb3cpIHN1cHBvcnRzIElQdjYgd2l0aG91dCBuZWVkIGZvciB0aGUgaGVscGVyLgotCi0gICMgLi9pbmV0NnRvNCAtaGVscAotCi0gIGluZXQ2dG80OiAgQWN0IGFzIGFuIGlwdjYtdG8taXB2NCByZWxheSBmb3IgdGNwIGFwcGxpY2F0aW9ucyB0aGF0Ci0gICAgICAgICAgICAgZG8gbm90IHN1cHBvcnQgaXB2Ni4KLQotICBVc2FnZTogICAgIGluZXQ2dG80Ci0gICAgICAgICAgICAgaW5ldDZ0bzQgLXIKLQotICBFeGFtcGxlczogIGluZXQ2dG80IDU5MDAgbG9jYWxob3N0OjU5MDAKLSAgICAgICAgICAgICBpbmV0NnRvNCA4MDgwIHdlYjE6ODAKLSAgICAgICAgICAgICBpbmV0NnRvNCAtciA1OTAwIGZlODA6OjIxNzpmMmZmOmZlZTY6NmY1YSVldGgwOjU5MDAKLQotICBUaGUgLXIgb3B0aW9uIHJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgdHJhbnNsYXRpb24gKGUuZy4gZm9yIGlwdjQKLSAgY2xpZW50cyB0aGF0IG5lZWQgdG8gY29ubmVjdCB0byBpcHY2IHNlcnZlcnMuKSAgUmV2ZXJzaW5nIGlzIHRoZSBkZWZhdWx0Ci0gIGlmIHRoaXMgc2NyaXB0IGlzIG5hbWVkICdpbmV0NHRvNicgKGUuZy4gYnkgYSBzeW1saW5rLikKLQotICBVc2UgQ3RybC1DIHRvIHN0b3AgdGhpcyBwcm9ncmFtLgotCi0gIFlvdSBjYW4gYWxzbyBzZXQgZW52LiB2YXJzIElORVQ2VE80X0xPT1A9MSBvciBJTkVUNlRPNF9MT09QPUJHCi0gIHRvIGhhdmUgYW4gb3V0ZXIgbG9vcCByZXN0YXJ0aW5nIHRoaXMgcHJvZ3JhbSAoQkcgbWVhbnMgZG8gdGhhdAotICBpbiB0aGUgYmFja2dyb3VuZCksIGFuZCBJTkVUNlRPNF9MT0dGSUxFIGZvciBhIGxvZyBmaWxlLgotICBBbHNvIHNldCBJTkVUNlRPNF9WRVJCT1NFIHRvIHZlcmJvc2l0eSBsZXZlbCBhbmQgSU5FVDZUTzRfV0FJVFRJTUUKLSAgYW5kIElORVQ2VE80X1BJREZJTEUgKHNlZSBiZWxvdy4pCi0KLSAgIFRoZSAiSU5FVDZUTzRfTE9PUD1CRyIgYW5kICJJTkVUNlRPNF9MT0dGSUxFPS4uLiIgZW52LiB2YXJpYWJsZXMgbWFrZQotICAgdGhlIHRvb2wgcnVuIHJlbGlhYmx5IGFzIGEgZGFlbW9uIGZvciB2ZXJ5IGxvbmcgcGVyaW9kcy4gUmVhZCB0aGUgdG9wCi0gICBwYXJ0IG9mIHRoZSBzY3JpcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEVuY3J5cHRlZCBUdW5uZWxzIHdpdGggSVB2NiBTdXBwb3J0OgotICAgRm9yIFNTSCB0dW5uZWxsZWQgZW5jcnlwdGVkIFZOQyBjb25uZWN0aW9ucywgb25lIGNhbiBvZiBjb3Vyc2UgdXNlIHRoZQotICAgSVB2NiBzdXBwb3J0IGluIHNzaCgxKS4KLQotICAgRm9yIFNTTCBlbmNyeXB0ZWQgVk5DIGNvbm5lY3Rpb25zLCBvbmUgcG9zc2liaWxpdHkgaXMgdG8gdXNlIHRoZSBJUHY2Ci0gICBzdXBwb3J0IGluIHN0dW5uZWwoMSkuIFRoaXMgaW5jbHVkZXMgdGhlIGJ1aWx0LWluIHN1cHBvcnQgdmlhIHRoZQotICAgLXN0dW5uZWwgb3B0aW9uLiBGb3IgZXhhbXBsZToKLSAgeDExdm5jIC1zdHVubmVsIFNBVkUgLWVudiBTVFVOTkVMX0xJU1RFTj06OiAtZW52IFNUVU5ORUxfREVCVUc9MSAuLi4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgU1NIIElQdjYgVHJpY2tzOgotICAgSXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IHNzaCgxKSBjYW4gZG8gYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nCi0gICBhcyBpbmV0NnRvNCBhYm92ZSBieToKLSAgc3NoIC1nIC1MIDU5MDA6bG9jYWxob3N0OjU5MDEgbG9jYWxob3N0ICJwcmludGYgJ1ByZXNzIEVudGVyIHRvIEV4aXQ6ICc7IHJlYWQKLSB4IgotCi0gICAod2hlcmUgd2UgaGF2ZSB4MTF2bmMgcnVubmluZyB2aWEgIi1yZmJwb3J0IDU5MDEiIGluIHRoaXMgY2FzZS4pCi0KLSAgIE5vdGUgdGhhdCBvbmUgY2FuIGFsc28gbWFrZSBhIGhvbWUtYnJldyBTT0NLUzUgaXB2NC10by1pcHY2IGdhdGV3YXkKLSAgIHByb3h5IHVzaW5nIHNzaCBsaWtlIHRoaXM6Ci0gIHNzaCAtRCAnKjoxMDgwJyBsb2NhbGhvc3QgInByaW50ZiAnUHJlc3MgRW50ZXIgdG8gRXhpdDogJzsgcmVhZCB4IgotCi0gICB0aGVuIHNwZWNpZnkgYSBwcm94eSBsaWtlIHNvY2tzOi8vaG9zdG5hbWU6MTA4MCB3aGVyZSBob3N0bmFtZSBpcyB0aGUKLSAgIG1hY2hpbmUgcnVubmluZyB0aGUgYWJvdmUgc3NoIGNvbW1hbmQgKGFkZCAtdiB0byBzc2ggZm9yIGNvbm5lY3Rpb24KLSAgIGxvZ2dpbmcgaW5mby4pCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIElQdjYgU1NWTkMgVmlld2VyOgotICAgT3VyIFNTVk5DIFZOQyBWaWV3ZXIgaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3Igc3NoKDEpIGFuZCBzdHVubmVsKDEpLAotICAgYW5kIHNvIGl0IGFscmVhZHkgaGFzIGdvb2QgSVB2NiBzdXBwb3J0IGJlY2F1c2UgdGhlc2UgdHdvIGNvbW1hbmRzIGRvLgotICAgT24gVW5peCwgTWFjT1NYLCBhbmQgV2luZG93cyBuZWFybHkgYWxsIG9mIHRoZSB0aGUgcmVtYWluaW5nIHBhcnRzIG9mCi0gICBTU1ZOQyAoZS5nLiB0aGUgYnVpbHQtaW4gcHJveHlpbmcgYW5kIHVuLWVuY3J5cHRlZCBjb25uZWN0aW9ucykgaGF2ZQotICAgYmVlbiBtb2RpZmllZCB0byBzdXBwb3J0IElQdjYgaW4gU1NWTkMgMS4wLjI2LgotCi0KLQotCi0KLQotICAgIENvbnRyaWJ1dGlvbnM6Ci0KLSAgIFEtMTMyOiBUaGFua3MgZm9yIHlvdXIgcHJvZ3JhbSBvciBmb3IgeW91ciBoZWxwISBDYW4gSSBtYWtlIGEKLSAgIGRvbmF0aW9uPwotCi0gICBQbGVhc2UgZG8gKGFueSBhbW91bnQgaXMgYXBwcmVjaWF0ZWQ7IHZlcnkgZmV3IGhhdmUgZG9uYXRlZCkgYW5kIHRoYW5rCi0gICB5b3UgZm9yIHlvdXIgc3VwcG9ydCEgQ2xpY2sgb24gdGhlIFBheVBhbCBidXR0b24gYmVsb3cgZm9yIG1vcmUgaW5mby4KLQotICAgW3gtY2xpY2stYnV0MDQuZ2lmXS1TdWJtaXQKLQkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2NoYWluaW5nc3NoLmh0bWw6Ci0KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBDaGFpbmluZyBzc2gnczogTm90ZSB0aGF0IGZvciB1c2Ugb2YgYSBzc2ggZ2F0ZXdheSBhbmQgLUwgcmVkaXJlY3Rpb24KLSAgIHRvIGFuIGludGVybmFsIGhvc3QgKGUuZy4gIi1MIDU5MDA6b3RoZXJob3N0OjU5MDAiKSB0aGUgVk5DIHRyYWZmaWMKLSAgIGluc2lkZSB0aGUgZmlyZXdhbGwgaXMgbm90IGVuY3J5cHRlZCBhbmQgeW91IGhhdmUgdG8gbWFudWFsbHkgbG9nIGludG8KLSAgIG90aGVyaG9zdCB0byBzdGFydCB4MTF2bmMuIEt5bGUgQW1vbiBzaG93cyBhIG1ldGhvZCB3aGVyZSB5b3UgY2hhaW4KLSAgIHR3byBzc2gncyB0b2dldGhlciB0aGF0IGVuY3J5cHRzIGFsbCBuZXR3b3JrIHRyYWZmaWMgYW5kIGFsc28KLSAgIGF1dG9tYXRpY2FsbHkgc3RhcnRzIHVwIHgxMXZuYyBvbiB0aGUgaW50ZXJuYWwgd29ya3N0YXRpb246Ci0jIS9iaW4vc2gKLSMKLWdhdGV3YXk9ImV4YW1wbGUuY29tIiAgICMgb3IgInVzZXJAZXhhbXBsZS5jb20iCi1ob3N0PSJsYWJ5cmludGgiICAgICAgICAjIG9yICJ1c2VyQGhvc3RuYW1lIgotdXNlcj0ia3lsZSIKLQotIyBOZWVkIHRvIHNsZWVwIGxvbmcgZW5vdWdoIGZvciBhbGwgb2YgdGhlIHBhc3N3b3JkcyBhbmQgeDExdm5jIHRvIHN0YXJ0IHVwLgotIyBUaGUgPC9kZXYvbnVsbCBiZWxvdyBtYWtlcyB0aGUgdm5jdmlld2VyIHByb21wdCBmb3IgcGFzc3dkIHZpYSBwb3B1cCB3aW5kb3cuCi0jCi0oc2xlZXAgMTA7IHZuY3ZpZXdlciAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodCB6cmxlIHpsaWIgaGV4dGlsZSIgXAotICAgIGxvY2FsaG9zdDowIDwvZGV2L251bGwgPi9kZXYvbnVsbCkgJgotCi0jIENoYWluIHRoZSB2bmMgY29ubmVjdGlvbiB0aHJ1IDIgc3NoJ3MsIGFuZCBjb25uZWN0IHgxMXZuYyB0byB1c2VyJ3MgZGlzcGxheToKLSMKLWV4ZWMgL3Vzci9iaW4vc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgJGdhdGV3YXkgXAotICAgICAvdXNyL2Jpbi9zc2ggLXQgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMCAkaG9zdCBcCi0gICAgIHN1ZG8gL3Vzci9iaW4veDExdm5jIC1sb2NhbGhvc3QgLWF1dGggL2hvbWUvJHVzZXIvLlhhdXRob3JpdHkgXAotICAgICAgICAgLXJmYmF1dGggLnZuYy9wYXNzd2QgLWRpc3BsYXkgOjAKLQotICAgQWxzbyBub3RlIHRoZSB1c2Ugb2Ygc3VkbygxKSB0byBzd2l0Y2ggdG8gcm9vdCBzbyB0aGF0IHRoZSBkaWZmZXJlbnQKLSAgIHVzZXIncyAuWGF1dGhvcml0eSBmaWxlIGNhbiBiZSBhY2Nlc3NlZC4gU2VlIHRoZSB2aXN1ZG8oOCkgbWFucGFnZSBmb3IKLSAgIGRldGFpbHMgb24gaG93IHRvIHNldCB0aGlzIHVwIChyZW1vdmUgdGhlIHN1ZG8gaWYgeW91IGRvIG5vdCB3YW50IHRvCi0gICBkbyB0aGlzKS4gT25lIGNhbiBhbHNvIGNoYWluIHRvZ2V0aGVyIHNzaCdzIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zCi0gICB3aXRoIHZuY3ZpZXdlcnMgdXNpbmcgdGhlIC1saXN0ZW4gb3B0aW9uLiBGb3IgdGhpcyBjYXNlIC1SIHdvdWxkCi0gICByZXBsYWNlIHRoZSAtTCAoYW5kIDU1MDAgdGhlIDU5MDAsIHNlZSB0aGUgIzIgZXhhbXBsZSBzY3JpcHQgYWJvdmUpLgotICAgSWYgdGhlIGdhdGV3YXkgbWFjaGluZSdzIHNzaGQgaXMgY29uZmlndXJlZCB3aXRoIEdhdGV3YXlQb3J0cz1ubyAodGhlCi0gICBkZWZhdWx0KSB0aGVuIHRoZSBkb3VibGUgY2hhaW5pbmcgb2YgInNzaCAtUiAuLi4iIHdpbGwgYmUgcmVxdWlyZWQgZm9yCi0gICByZXZlcnNlIGNvbm5lY3Rpb25zIHRvIHdvcmsuCi0JCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9taXNjYnVpbGQuaHRtbDoKLQotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIE1pc2MuIEJ1aWxkIHByb2JsZW1zOiAgIFdlIGNvbGxlY3QgaGVyZSByYXJlIGJ1aWxkIHByb2JsZW1zIHNvbWUgdXNlcnMKLSAgIGhhdmUgcmVwb3J0ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHdvcmthcm91bmRzLiBTZWUgYWxzbyB0aGUgRkFRJ3Mgb24KLSAgIGJ1aWxkaW5nLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBFTlYgcGFyYW1ldGVyOiBPbmUgdXNlciBoYWQgYSBwcm9ibGVtIHdoZXJlIHRoZSBidWlsZCBzY3JpcHQgYmVsb3cgd2FzCi0gICBmYWlsaW5nIGJlY2F1c2UgaGlzIHdvcmsgZW52aXJvbm1lbnQgaGFkIHRoZSBFTlYgdmFyaWFibGUgc2V0IHRvIGEKLSAgIHNjcmlwdCB0aGF0IHdhcyByZXNldHRpbmcgaGlzIFBBVEggc28gdGhhdCBnY2MgY291bGQgbm8gbG9uZ2VyIGJlCi0gICBmb3VuZC4gTWFrZSBzdXJlIHlvdSBkbyBub3QgaGF2ZSBhbnkgRU5WIG9yIEJBU0hfRU5WIGluIHlvdXIKLSAgIGVudmlyb25tZW50IGRvaW5nIHRoaW5ncyBsaWtlIHRoYXQuIFR5cGluZyAidW5zZXQgRU5WIiwgZXRjLiBiZWZvcmUKLSAgIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBzaG91bGQgY2xlYXIgaXQuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEJhc2ggeHBnOiBPbmUgdXNlciBoYWQgaGlzIGJhc2ggc2hlbGwgY29tcGlsZWQgd2l0aAotICAgLS1lbmFibGUteHBnLWVjaG8tZGVmYXVsdCB0aGF0IGNhdXNlcyBzb21lIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aAotICAgdGhpbmdzIGxpa2UgZWNobyAiXFwxIC4uLiIgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZXhlY3V0ZXMuIEluCi0gICBwYXJ0aWN1bGFyIGluc3RlYWQgb2YgZ2V0dGluZyAiXDEiIHRoZSBub24tcHJpbnRhYmxlIGNoYXJhY3RlciAiXkEiIGlzCi0gICBwcm9kdWNlZCwgYW5kIGNhdXNlcyBmYWlsdXJlcyBhdCBjb21waWxlIHRpbWUgbGlrZToKLSAgLi4vcmZiL3JmYmNvbmZpZy5oOjk6MjI6IHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2lmbmRlZiBkaXJlY3RpdmUKLQotICAgVGhlIHdvcmthcm91bmQgaXMgdG8gY29uZmlndXJlIGxpa2UgdGhpczoKLSAgZW52IENPTkZJR19TSEVMTD0vYmluL3NoIC9iaW4vc2ggLi9jb25maWd1cmUKLQotICAgaS5lLiBhdm9pZCB1c2luZyB0aGUgYmFzaCB3aXRoIHRoZSBtaXNiZWhhdmlvci4gQSBidWcgaGFzIGJlZW4gZmlsZWQKLSAgIGFnYWluc3QgYXV0b2NvbmYgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBBSVg6IG9uZSB1c2VyIGhhZCB0byBhZGQgdGhlICJYMTEuYWR0IiBwYWNrYWdlIHRvIEFJWCB0byBnZXQgYnVpbGQKLSAgIGhlYWRlciBmaWxlcyBsaWtlIFhTaG0uaCwgZXRjLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBVYnVudHUgRmVpc3R5IEZhd24gNy4wNDogSW4gTWF5LzIwMDcgb25lIHVzZXIgc2FpZCBoZSBuZWVkZWQgdG8gYWRkCi0gICB0aGVzZSBwYWNrYWdlcyB0byBjb21waWxlIHgxMXZuYyBvbiB0aGF0IExpbnV4IGRpc3RybyBhbmQgdmVyc2lvbjoKLSAgYXB0LWdldCBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCBtYWtlIGJpbjg2IGxpYmpwZWc2Mi1kZXYgbGlic3NsLWRldiBsaWJ4dHN0LWQKLWV2Ci0KLSAgIE5vdGUgdGhhdCBVYnVudHUgaXMgYmFzZWQgb24gRGViaWFuLCBzbyBwZXJoYXBzIHRoaXMgaXMgdGhlIGxpc3QKLSAgIG5lZWRlZCBvbiBEZWJpYW4gKHRlc3Rpbmc/KSBhcyB3ZWxsLiBUbyBidWlsZCBpbiBBdmFoaSAobUROUyBzZXJ2aWNlCi0gICBhZHZlcnRpc2luZykgc3VwcG9ydCBpdCB3b3VsZCBhcHBlYXIgdGhhdCBsaWJhdmFoaS1jbGllbnQtZGV2IGlzCi0gICBuZWVkZWQgYXMgd2VsbC4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgRXhjZWVkaW5nbHkgc2xvdyBjb21waWxhdGlvbjogeDExdm5jIGhhcyBhIGNvdXBsZSBvZiBmaWxlcyB3aGljaAotICAgY29udGFpbiB2ZXJ5IGxhcmdlICJjYXNlIHN0YXRlbWVudHMiIChvdmVyIDEwMCBjYXNlcykgdGhhdCBvbiBzb21lCi0gICBwbGF0Zm9ybXMgY2FuIHRha2UgYSB2ZXJ5IGxvbmcgdGltZSB0byBjb21waWxlIChpbiBleHRyZW1lIGNhc2VzIG92ZXIKLSAgIGFuIGhvdXIpLiBIb3dldmVyIG9uIDMyYml0IExpbnV4IHdpdGggaW50ZWwvYW1kIHByb2Nlc3NvciBhbmQgZ2NjCi0gICB0aGVzZSBmaWxlcyB1c3VhbGx5IHRha2UgbGVzcyB0aGFuIDEwIHNlY29uZHMgdG8gY29tcGlsZS4gRm9yIDY0Yml0Ci0gICBzeXN0ZW1zIHVzaW5nIGdjYyB0aGUgcHJvYmxlbSBhcHBlYXJzIHRvIGJlIG11Y2ggd29yc2UuCi0KLSAgIFRoZSB0d28gZmlsZXMgd2l0aCB0aGUgbGFyZ2UgbnVtYmVyIG9mIGNhc2VzLCByZW1vdGUuYyBhbmQgeDExdm5jLmMsCi0gICBoYXZlIG5vIHJlYWwgbmVlZCB0byBiZSBvcHRpbWl6ZWQgKHRoZSBjb2RlIGlzIHVzZWQgb25seSB2ZXJ5Ci0gICBpbmZyZXF1ZW50bHkpLiBTbyBpdCBpcyBmaW5lIHRvIHN1cHBseSAiLU8wIiAoZGlzYWJsZXMgb3B0aW1pemF0aW9uKQotICAgdG8gQ0ZMQUdTIHdoZW4gY29tcGlsaW5nIHRoZW0uIEhvd2V2ZXIsIGl0IGlzIHRyaWNreSB3aXRoCi0gICBhdXRvY29uZi9hdXRvbWFrZSB0byBkbyB0aGlzIChlc3BlY2lhbGx5IHNpbmNlIGJvdGggdGhlIGNvbXBpbGVyIGFuZAotICAgbWFrZSB2ZXJzaW9ucyBoYXZlIGEgYmlnIGVmZmVjdCkuCi0KLSAgIFNvIGlmIHRoZSBjb21waWxlIHRpbWVzIGFyZSBnZXR0aW5nIHRvbyBsb25nIGZvciB5b3UgZm9yIHRoZXNlIHR3bwotICAgZmlsZXMgeW91IHdpbGwgbmVlZCB0byBtYW51YWxseSBjaGFuZ2Ugc29tZSB0aGluZ3MuIEZpcnN0LCBydW4KLSAgIGNvbmZpZ3VyZSBhbmQgd2hlbiBpdCBoYXMgZmluaXNoZWQsIGVkaXQgdGhlIGdlbmVyYXRlZCBmaWxlCi0gICB4MTF2bmMvTWFrZWZpbGUgYW5kIHB1dCB0aGVzZSBsaW5lcyBhdCB0aGUgdmVyeSB0b3A6Ci14MTF2bmMteDExdm5jLm8gOiAgQ0ZMQUdTICs9IC1PMAoteDExdm5jLXJlbW90ZS5vIDogIENGTEFHUyArPSAtTzAKLQotICAgVGhvc2UgbGluZXMgYXNzdW1lIGdudSBtYWtlIChnbWFrZSkgaXMgYmVpbmcgdXNlZC4gSWYgeW91IGFyZSB1c2luZwotICAgYW5vdGhlciBtYWtlLCBzYXkgU29sYXJpcyBtYWtlLCBpbnNlcnQgdGhlc2UgaW5zdGVhZDoKLXgxMXZuYy14MTF2bmMubyA6PSBDRkxBR1MgKz0gLU8wCi14MTF2bmMtcmVtb3RlLm8gOj0gQ0ZMQUdTICs9IC1PMAotCi0gICBZb3UgY291bGQgd3JpdGUgYSBidWlsZCBzaGVsbCBzY3JpcHQgdGhhdCBtb2RpZmllZCB0aGUgTWFrZWZpbGUgdGhpcwotICAgd2F5IGJlZm9yZSBydW5uaW5nIG1ha2UuCi0KLSAgIFRoZSAiLU8wIiAobm90ZSBpdCBpcyAiY2FwaXRhbCBPaCIgZm9sbG93ZWQgYnkgInplcm8iKSBhc3N1bWVzIHRoZSBnY2MKLSAgIGNvbXBpbGVyLiBJZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IGNvbXBpbGVyIHlvdSB3aWxsIG5lZWQgdG8gZmluZAotICAgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gZGlzYWJsZSBvcHRpbWl6YXRpb24sIG9yIG90aGVyd2lzZSBoYXZlIHRoZQotICAgbGluZXMgc2V0IENGTEFHUyB0byB0aGUgZW1wdHkgc3RyaW5nLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBCcm9rZW4gVGhyZWFkIExvY2FsIFN0b3JhZ2Ugb24gU3VTRSA5LjI6IFN0YXJ0aW5nIHdpdGggeDExdm5jIDAuOS44Ci0gICB0aGUgYnVuZGxlZCBsaWJ2bmNzZXJ2ZXIgdXNlcyB0aGUgX190aHJlYWQga2V5d29yZCB0byBtYWtlIHNvbWUgb2YgdGhlCi0gICBlbmNvZGluZ3MgKGkuZS4gdGlnaHQpIHRocmVhZCBzYWZlIChtdWx0aXBsZSBWTkMgY2xpZW50cyBjYW4gYmUgdXNpbmcKLSAgIHRpZ2h0IGF0IHRoZSBzYW1lIHRpbWUgaW4geDExdm5jIC10aHJlYWRzIG1vZGUuKSBFdmlkZW50bHkgb24gdGhlIG9sZAotICAgU3VTRSA5LjIgc3lzdGVtIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZQotICAgcHJvcGVybHkuIEhlcmUgaXMgYW4gZXhhbXBsZSBidWlsZCBmYWlsdXJlOgotdGlnaHQuYzoxMTI2OiBlcnJvcjogdW5yZWNvZ25pemFibGUgaW5zbjoKLShpbnNuOkhJIDExIDEwIDEzIDAgKG5pbCkgKHNldCAocmVnL2Y6U0kgNTkpCi0gICAgICAgIChjb25zdDpTSSAocGx1czpTSSAoc3ltYm9sX3JlZjpTSSAoIiVscGFsZXR0ZSIpKQotICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMjA0OCBbMHg4MDBdKSkpKSAtMSAobmlsKQotICAgIChleHByX2xpc3Q6UkVHX0VRVUFMIChjb25zdDpTSSAocGx1czpTSSAoc3ltYm9sX3JlZjpTSSAoIiVscGFsZXR0ZSIpKQotICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMjA0OCBbMHg4MDBdKSkpCi0gICAgICAgIChuaWwpKSkKLXRpZ2h0LmM6MTEyNjogaW50ZXJuYWwgY29tcGlsZXIgZXJyb3I6IGluIGV4dHJhY3RfaW5zbiwgYXQgcmVjb2cuYzoyMTc1Ci1QbGVhc2Ugc3VibWl0IGEgZnVsbCBidWcgcmVwb3J0LAotd2l0aCBwcmVwcm9jZXNzZWQgc291cmNlIGlmIGFwcHJvcHJpYXRlLgotU2VlIFVSTDpodHRwOi8vd3d3LnN1c2UuZGUvZmVlZGJhY2sgZm9yIGluc3RydWN0aW9ucy4KLQotICAgVGhlIHdvcmthcm91bmQgaXMgdG8gZGlzYWJsZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSBhdCBjb25maWd1cmUgdGltZQotICAgbGlrZSB0aGlzOgotZW52IENQUEZMQUdTPSItRFRMUz0nJyIgLi9jb25maWd1cmUKLQotICAgYW5kIHRoZW4gYnVpbGQgaXQuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0JCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zdW5yYXkuaHRtbDoKLQotCi0gICAgU3VuIFJheSBOb3RlczoKLQotICAgWW91IGNhbiBydW4geDExdm5jIG9uIHlvdXIgKGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQpIFN1blJheSBzZXNzaW9uCi0gICAoUGxlYXNlIHJlbWVtYmVyIHRvIHVzZSBzZXR0aW5ncyBsaWtlIC13YWl0IDIwMCwgLXNiIDE1LCBhbmQgbm90Ci0gICBydW5uaW5nIGEgc2NyZWVuc2F2ZXIgYW5pbWF0aW9uIChibGFuayBpbnN0ZWFkKSB0byBhdm9pZCBiZWluZyBhCi0gICByZXNvdXJjZSBob2chIHgxMXZuYyBkb2VzIGluZHVjZSBhIGxvdCBvZiBtZW1vcnkgSS9PIGZyb20gcG9sbGluZyB0aGUKLSAgIFggc2VydmVyLiBJdCBhbHNvIGhlbHBzIHRvIGhhdmUgYSBzb2xpZCBiYWNrZ3JvdW5kIGNvbG9yLCBlLmcuCi0gICAtc29saWQpLgotCi0gICBOZXdzOiBTdW4gUmF5IFJlbW90ZSBDb250cm9sIFRvb2xraXQ6IFNlZSB0aGUgbmljZSBzZXQgb2YgdG9vbHMgaW4gdGhlCi0gICBTdW4gUmF5IFJlbW90ZSBDb250cm9sIFRvb2xraXQgdGhhdCBsYXVuY2ggeDExdm5jIGF1dG9tYXRpY2FsbHkgZm9yCi0gICB5b3UgZm9yIGNlcnRhaW4gdXNhZ2UgbW9kZXMuCi0KLSAgIFlvdSBoYXZlIHRvIGtub3cgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgeW91ciBTdW5SYXkgc2Vzc2lvbiBYIHNlcnZlcgotICAgaXMgcnVubmluZyBvbiAoc28geW91IGNhbiBzc2ggaW50byBpdCBhbmQgc3RhcnQgeDExdm5jKS4gWW91IGFsc28gbmVlZAotICAgdG8ga25vdyB0aGUgWDExIERJU1BMQVkgbnVtYmVyIGZvciB0aGUgc2Vzc2lvbjogb24gYSBTdW5SYXkgaXQgY291bGQKLSAgIGJlIGEgbGFyZ2UgbnVtYmVyLCBlLmcuIDoxMzcsIHNpbmNlIHRoZXJlIGFyZSBtYW55IHBlb3BsZSB3aXRoIFgKLSAgIHNlc3Npb25zIChYc3VuIHByb2Nlc3Nlcykgb24gdGhlIHNhbWUgbWFjaGluZS4gSWYgeW91IGRvbid0IGtub3cgaXQsCi0gICB5b3UgY2FuIGdldCBpdCBieSBydW5uaW5nIHdobygxKSBpbiBhIHNoZWxsIG9uIHRoZSBTdW5SYXkgc2VydmVyIGFuZAotICAgbG9va2luZyBmb3IgdGhlIGR0bG9jYWwgZW50cnkgd2l0aCB5b3VyIHVzZXJuYW1lIChhbmQgaWYgeW91IGRvbid0Ci0gICBldmVuIGtub3cgd2hpY2ggc2VydmVyIG1hY2hpbmUgaGFzIHlvdXIgc2Vzc2lvbiwgeW91IGNvdWxkIGxvZ2luIHRvCi0gICBhbGwgcG9zc2libGUgb25lcyBsb29raW5nIGF0IHRoZSB3aG8gb3V0cHV0IGZvciB5b3VyIHVzZXJuYW1lLi4uKS4KLQotICAgSSBwdXQgc29tZSBjb2RlIGluIG15IH4vLmR0cHJvZmlsZSBzY3JpcHQgdGhhdCBzdG9yZXMgJERJU1BMQVkKLSAgIChpbmNsdWRpbmcgdGhlIGhvc3RuYW1lKSBpbiBhIH4vLnN1bnJheV9jdXJyZW50IGZpbGUgYXQgc2Vzc2lvbgotICAgc3RhcnR1cCAoYW5kIGRlbGV0ZXMgaXQgd2hlbiB0aGUgWCBzZXNzaW9uIGVuZHMpIHRvIG1ha2UgaXQgZWFzeSB0bwotICAgZ2V0IGF0IHRoZSBob3N0bmFtZSBhbmQgWDExIGRpc3BsYXkgbnVtYmVyIGluZm8gZm9yIG15IGN1cnJlbnQgWAotICAgc2Vzc2lvbnMgd2hlbiBJIHNzaCBpbiBhbmQgYW0gYWJvdXQgdG8gc3RhcnQgeDExdm5jLgotCi0gICBTdW5SYXkgR290Y2hhICMxOiAgIE5vdGUgdGhhdCBldmVuIHRob3VnaCB5b3VyIFN1blJheSBYMTEgRElTUExBWSBpcwotICAgc29tZXRoaW5nIGxpa2UgOjEzNywgeDExdm5jIHN0aWxsIHRyaWVzIGZvciBwb3J0IDU5MDAgYXMgaXRzIGxpc3RlbmluZwotICAgcG9ydCBpZiBpdCBjYW4gZ2V0IGl0LCBpbiB3aGljaCBjYXNlIHRoZSBWTkMgZGlzcGxheSAoaS5lLiB0aGUKLSAgIGluZm9ybWF0aW9uIHlvdSBzdXBwbHkgdG8gdGhlIFZOQyB2aWV3ZXIpIGlzIHNvbWV0aGluZyBsaWtlCi0gICBzdW5yYXktc2VydmVyOjAgICAobm90ZSB0aGUgOjAgY29ycmVzcG9uZGluZyB0byBwb3J0IDU5MDAsIGl0IGlzIG5vdAotICAgOjEzNykuIElmIGl0IGNhbm5vdCBnZXQgNTkwMCwgaXQgdHJpZXMgZm9yIDU5MDEsIGFuZCBzbyBvbi4gWW91IGNhbgotICAgYWxzbyB0cnkgdG8gZm9yY2UgdGhlIHBvcnQgKGFuZCB0aGVyZWJ5IHRoZSBWTkMgZGlzcGxheSkgdXNpbmcgdGhlCi0gICAtcmZicG9ydCBOTk5OIG9wdGlvbi4KLQotICAgRXNwZWNpYWxseSBvbiBhIGJ1c3kgU3VuIFJheSBzZXJ2ZXIgaXQgaXMgb2Z0ZW4gZGlmZmljdWx0IHRvIGZpbmQgZnJlZQotICAgcG9ydHMgZm9yIGJvdGggVk5DIGFuZCB0aGUgSFRUUCBKYXZhIGFwcGxldCBzZXJ2ZXIgdG8gbGlzdGVuIG9uLiBUaGlzCi0gICBzY3JpcHQsIHZuY19maW5kcG9ydHMgbWF5IGJlIG9mIHVzZSBmb3IgZG9pbmcgdGhpcyBhdXRvbWF0aWNhbGx5LiBJdAotICAgc3VnZ2VzdHMgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb25zIGJhc2VkIG9uIG5ldHN0YXQgb3V0cHV0IHRoYXQKLSAgIGxpc3RzIHRoZSBvY2N1cGllZCBwb3J0cy4gSXQgaXMgZXZlbiBtb3JlIGRpZmZpY3VsdCB0byBzdGFydAotICAgdm5jc2VydmVyL1h2bmMgb24gYSBidXN5IFN1biBSYXkgYmVjYXVzZSB0aGVuIDMgcG9ydHMgKEhUVFAsIFZOQywgYW5kCi0gICBYMTEpLCBhbGwgc2VwYXJhdGVkIGJ5IDEwMCBhcmUgbmVlZGVkISBUaGlzIHNjcmlwdCwgZmluZHZuY3BvcnRzIG1heQotICAgYmUgaGVscGZ1bCBhcyB3ZWxsLiBCb3RoIHNjcmlwdHMgc3RhcnQgYXQgVk5DIGRpc3BsYXkgOjEwIGFuZCB3b3JrCi0gICB0aGVpciB3YXkgdXAuCi0KLSAgIFN1blJheSBHb3RjaGEgIzI6ICAgSWYgeW91IGdldCBhbiBlcnJvciBsaWtlOgotICAgICAgICBzaG1nZXQodGlsZSkgZmFpbGVkLgotICAgICAgICBzaG1nZXQ6IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlCi0KLSAgIHdoZW4gc3RhcnRpbmcgdXAgeDExdm5jIHRoYXQgbW9zdCBsaWtlbHkgbWVhbnMgYWxsIHRoZSBzaGFyZWQgbWVtb3J5Ci0gICAoc2htKSBzbG90cyBhcmUgZmlsbGVkIHVwIG9uIHlvdXIgbWFjaGluZS4gVGhlIFNvbGFyaXMgZGVmYXVsdCBpcyBvbmx5Ci0gICAxMDAsIGFuZCB0aGF0IGNhbiBnZXQgZmlsbGVkIHVwIGluIGEgd2VlayBvciBzbyBvbiBhIFN1blJheSBzZXJ2ZXIKLSAgIHdpdGggbG90cyBvZiB1c2Vycy4gSWYgdGhlIHNobSBzbG90IGlzIG9ycGhhbmVkIChlLmcuIGNyZWF0b3IgcHJvY2VzcwotICAgZGllcykgdGhlIHNsb3QgaXMgbm90IHJlY2xhaW1lZC4gWW91IGNhbiB2aWV3IHRoZSBzaG0gc2xvdHMgd2l0aCB0aGUKLSAgICJpcGNzIC1tQSIgY29tbWFuZC4gSWYgdGhlcmUgYXJlIGFib3V0IDEwMCB0aGVuIHlvdSd2ZSBwcm9iYWJseSBoaXQKLSAgIHRoaXMgcHJvYmxlbS4gVGhleSBjYW4gYmUgY2xlYW5lZCBvdXQgKGJ5IHRoZSBvd25lciBvciBieSByb290KSB1c2luZwotICAgdGhlIGlwY3JtIGNvbW1hbmQuIEkgd3JvdGUgYSBzY3JpcHQgc2htX2NsZWFyIHRoYXQgZmluZHMgdGhlIG9ycGhhbnMKLSAgIGFuZCBsaXN0cyBvciByZW1vdmVzIHRoZW0uIExvbmdlciB0ZXJtLCBoYXZlIHlvdXIgU3VuUmF5IHN5c2FkbWluIGFkZAotICAgc29tZXRoaW5nIGxpa2UgdGhpcyB0byAvZXRjL3N5c3RlbToKLSAgICAgICAgc2V0IHNobXN5czpzaG1pbmZvX3NobW1heCA9IDB4MjAwMDAwMAotICAgICAgICBzZXQgc2htc3lzOnNobWluZm9fc2htbW5pID0gMHgxMDAwCi0KLSAgIFN1blJheSBHb3RjaGEgIzM6ICAgU29tZSBTdW5SYXkgaW5zdGFsbGF0aW9ucyBoYXZlIGltcGxlbWVudGVkCi0gICBzdXNwZW5kaW5nIGNlcnRhaW4gYXBwbGljYXRpb25zIHdoZW4gYSBTdW5SYXkgc2Vzc2lvbiBpcyBpbiBhCi0gICBkaXNjb25uZWN0ZWQgc3RhdGUgKGUuZy4gSmF2YSBCYWRnZSBwdWxsZWQgb3V0LCB1dGRldGFjaCwgZXRjKS4gVGhpcwotICAgaXMgYSBnb29kIHRoaW5nIGJlY2F1c2UgaXQgbGltaXRzIGhvZ2d5IG9yIHJ1bmF3YXkgYXBwcyBmcm9tIHdhc3RpbmcKLSAgIHRoZSBzaGFyZWQgQ1BVIHJlc291cmNlLiBUaGluayBob3cgbXVjaCBDUFUgYW5kIG1lbW9yeSBJL08gaXMgd2FzdGVkCi0gICBieSBhIGJ1bmNoIG9mIEZpcmVmb3ggd2luZG93cyBydW5uaW5nIHdvcnRobGVzcyBGbGFzaCBhbmltYXRpb25zIHdoaWxlCi0gICB5b3VyIHNlc3Npb24gaXMgZGlzY29ubmVjdGVkIQotCi0gICBTbyBzb21lIHNpdGVzIGhhdmUgaW1wbGVtZW50ZWQgc2NyaXB0cyB0byBzdXNwZW5kIChlLmcuIGtpbGwgLVNUT1ApCi0gICBjZXJ0YWluIGFwcHMgd2hlbiB5b3VyIGJhZGdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgU3VuUmF5IHRlcm1pbmFsLiBXaGVuCi0gICB5b3UgcmVhdHRhY2gsIGl0IGtpbGwgLUNPTlQgdGhlbS4gVGhpcyBjYXVzZXMgcHJvYmxlbXMgZm9yIHZpZXdpbmcgdGhlCi0gICBkZXRhY2hlZCBTdW5SYXkgc2Vzc2lvbiB2aWEgeDExdm5jOiB0aG9zZSBzdXNwZW5kZWQgYXBwcyB3aWxsIG5vdAotICAgcmVzcG9uZCAodGhlaXIgd2luZG93cyB3aWxsIGJlIGJsYW5rIG9yIG90aGVyd2lzZSBpbmFjdGl2ZSkuCi0KLSAgIFdoYXQgdG8gZG8/IFdlbGwsIHNpbmNlIHlvdSBhcmUgZ29pbmcgdG8gYmUgdXNpbmcgdGhlIGFwcGxpY2F0aW9uIHlvdQotICAgbWlnaHQgYXMgd2VsbCB1bmZyZWV6ZSBpdCByYXRoZXIgdGhhbiBzdGFydGluZyB1cCBhIDJuZCBpbnN0YW5jZS4gSGVyZQotICAgaXMgb25lIHdheSB0byBkbyBpdCB1c2luZyB0aGUga2lsbCAtQ09OVCBtZWNoYW5pc206Ci0gICBraWxsIC1DT05UIGBwcyAtZWFsZiB8IGdyZXAgJyBUICcgfCBncmVwICRMT0dOQU1FIHwgYXdrICd7cHJpbnQgJDR9J2AKLQotICAgSWYgeW91IHdhbnQgdG8gYmUgYSBnb29kIGNpdGl6ZW4gYW5kIHJlLWZyZWV6ZSB0aGVtIGJlZm9yZSB5b3UgZXhpdAotICAgeDExdm5jIHRoaXMgc2NyaXB0IGNvdWxkIGJlIG9mIHVzZToKLSMhL2Jpbi9zaAotIwotIyBraWxsIC1TVE9QLy1DT05UIHNjcmlwdCBmb3IgeDExdm5jIChvciBvdGhlcikgU3VuUmF5IHVzYWdlICgiZnJlZXplcyIKLSMgY2VydGFpbiBhcHBzIGZyb20gaG9nZ2luZyByZXNvdXJjZXMgd2hlbiBkaXNjb25uZWN0ZWQpLgotIwotIyBQdXQgaGVyZSBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBhcHBzIHRoYXQgYXJlIGZyb3plbjoKLSMKLWFwcG1hdGNoPSJqYXZhX3ZtfGpyZXxuZXRzY2FwZS1iaW58ZmlyZWZveC1iaW58cmVhbHBsYXl8YWNyb3JlYWR8bW96aWxsYS1iaW4iCi0KLWlmIFsgIlgkMSIgPSAiWGZyZWV6ZSIgXTsgdGhlbgotICAgICAgICBwa2lsbCAtU1RPUCAtVSAkTE9HTkFNRSAiJGFwcG1hdGNoIgotZWxpZiBbICJYJDEiID0gIlh0aGF3IiBdOyB0aGVuCi0gICAgICAgIHBraWxsIC1DT05UIC1VICRMT0dOQU1FICIkYXBwbWF0Y2giCi0KLWVsaWYgWyAiJFJGQl9NT0RFIiA9ICJhZnRlcmFjY2VwdCIgLWEgIiRSRkJfU1RBVEUiID0gIk5PUk1BTCIgXTsgdGhlbgotICAgICAgICAjIGEgdmFsaWQgeDExdm5jIGxvZ2luLgotICAgICAgICBpZiBbICIkUkZCX0NMSUVOVF9DT1VOVCIgPSAiMSIgXTsgdGhlbgotICAgICAgICAgICAgICAgICMgb25seSBvbmUgY2xpZW50IHByZXNlbnQuCi0gICAgICAgICAgICAgICAgcGtpbGwgLUNPTlQgLVUgJExPR05BTUUgIiRhcHBtYXRjaCIKLSAgICAgICAgZmkKLWVsaWYgWyAiJFJGQl9NT0RFIiA9ICJnb25lIiAtYSAiJFJGQl9TVEFURSIgPSAiTk9STUFMIiBdOyB0aGVuCi0gICAgICAgICMgYSB2YWxpZCB4MTF2bmMgbG9naW4uCi0gICAgICAgIGlmIFsgIiRSRkJfQ0xJRU5UX0NPVU5UIiA9ICIwIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgIyBsYXN0IGNsaWVudCBwcmVzZW50IGhhcyBqdXN0IGxlZnQuCi0gICAgICAgICAgICAgICAgcGtpbGwgLVNUT1AgLVUgJExPR05BTUUgIiRhcHBtYXRjaCIKLSAgICAgICAgZmkKLWZpCi1leGl0IDAKLQotICAgSWYgeW91IGNhbGxlZCB0aGUgc2NyaXB0ICJnb29kY2l0aXplbiIgeW91IGNvdWxkIHR5cGUgImdvb2RjaXRpemVuCi0gICB0aGF3IiB0byB1bmZyZWV6ZSB0aGVtLCBhbmQgdGhlbiAiZ29vZGNpdGl6ZW4gZnJlZXplIiB0byByZWZyZWV6ZQotICAgdGhlbS4gT25lIGNvdWxkIGFsc28gdXNlIHRoZXNlIHgxMXZuYyBvcHRpb25zICItYWZ0ZXJhY2NlcHQKLSAgIGdvb2RjaXRpemVuIC1nb25lIGdvb2RjaXRpemVuIiB0byBkbyBpdCBhdXRvbWF0aWNhbGx5LgotCi0gICBTdW5SYXkgR290Y2hhICM0OiAgIFJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgU3VuIFJheSBTZXJ2ZXIgU29mdHdhcmUKLSAgIFNSU1MgKHNlZW1zIHRvIGJlIHZlcnNpb24gMy4wIG9yIDMuMSkgaGF2ZSBhICJtaXNmZWF0dXJlIiB0aGF0IHdoZW4KLSAgIHRoZSBzZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCAoaS5lLiBiYWRnZS9zbWFydGNhcmQgb3V0KSB0aGUgc2NyZWVuCi0gICBsb2NrZXIgKHhzY3JlZW5zYXZlcikgd2lsbCBmcmVlemUgdGhlIFggc2VydmVyIGp1c3Qgd2hlbiB0aGUgIkVudGVyCi0gICBQYXNzd29yZCIgZGlhbG9nIGJveCBhcHBlYXJzLiBTbyB5b3UgY2Fubm90IHVubG9jayB0aGUgc2NyZWVuIHJlbW90ZWx5Ci0gICB2aWEgeDExdm5jIQotCi0gICBVcGRhdGU6IHBsZWFzZSBzZWUgQm9iIERvb2xpdHRsZSdzIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0aGlzCi0gICBpc3N1ZSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgc2VjdGlvbi4KLQotICAgSGVyZSAiZnJlZXplIiBtZWFucyAic3RvcCBvdGhlciBYIGNsaWVudHMgZnJvbSBpbnNlcnRpbmcga2V5Ym9hcmQgYW5kCi0gICBtb3VzZSBpbnB1dCBhbmQgZnJvbSB2aWV3aW5nIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBzY3JlZW4iLiBPcgotICAgc29tZXRoaW5nIGxpa2UgdGhhdDsgdGhlIHVwc2hvdCBpcyB4MTF2bmMgY2FuJ3QgZG8gaXRzIG5vcm1hbCB0aGluZy4KLQotICAgVGhlcmUgYXJlIHNldmVyYWwgd29ya2Fyb3VuZHMgZm9yIHRoaXMuCi0KLSAgIDEpIFRoZSBlYXNpZXN0IG9uZSBieSBmYXIgaXMgdG8gcHV0IHRoZXNlIGxpbmVzIGluIHlvdXIKLSAgICRIT01FLy5kdHByb2ZpbGUgZmlsZToKLVNVTl9TVU5SQVlfVVRYTE9DS19QUkVGPSIvdXNyL29wZW53aW4vYmluL3hsb2NrIC1tb2RlIGJsYW5rIgotZXhwb3J0IFNVTl9TVU5SQVlfVVRYTE9DS19QUkVGCi0KLSAgIE9uZSBtaWdodCBhcmd1ZSB0aGF0IHhsb2NrIGlzbid0IHBhcnRpY3VsYXJseSAicHJldHR5Ii4gKEp1c3QgSU1ITywKLSAgIGJ1dCBpZiBzb21ldGhpbmcgbGlrZSB0aGlzIG5vdCBiZWluZyBwcmV0dHkgYWN0dWFsbHkgZ2V0cyBpbiB0aGUgd2F5Ci0gICBvZiB5b3VyIHdvcmsgSSB0aGluayBzb21lIGludHJvc3BlY3Rpb24gbWF5IGJlIGluIG9yZGVyLiA6LSkKLQotICAgMikgVGhlIHByb2JsZW0gaGFzIGJlZW4gdHJhY2VkIHRvIHRoZSBwYW1fc3VucmF5LnNvIFBBTSBtb2R1bGUuCi0gICBFdmlkZW50bHkgeHNjcmVlbnNhdmVyIGludm9rZXMgdGhpcyBwYW0gbW9kdWxlIGFuZCBpdCBjb21tdW5pY2F0ZXMKLSAgIHdpdGggdXRzZXNzaW9uZCB3aG8gaW4gdHVybiBpbnN0cnVjdHMgdGhlIFhzdW4gc2VydmVyIHRvIG5vdCBwcm9jZXNzCi0gICBhbnkgc3ludGhldGljIG1vdXNlL2tleWJvYXJkIGlucHV0IG9yIHRvIHVwZGF0ZSB0aGUgc2NyZWVuCi0gICBmcmFtZWJ1ZmZlci4gSXQgaXMgbm90IGNsZWFyIGlmIHRoaXMgaXMgYnkgZGVzaWduIChzZWN1cml0eT8pIG9yCi0gICBzb21ldGhpbmcgZWxzZS4KLQotICAgSW4gYW55IGV2ZW50LCB0aGUgcHJvYmxlbSBjYW4gYmUgYXZvaWRlZCwgc29tZXdoYXQgZHJhc3RpY2FsbHksIGJ5Ci0gICBjb21tZW50aW5nIG91dCB0aGUgY29ycmVzcG9uZGluZyBsaW5lIGluIC9ldGMvcGFtLmNvbmY6Ci0jeHNjcmVlbnNhdmVyIGF1dGggc3VmZmljaWVudCAvb3B0L1NVTld1dC9saWIvcGFtX3N1bnJheS5zbyBzeW5jb25kaXNwbGF5Ci0KLSAgIExlYXZlIHRoZSBvdGhlciB4c2NyZWVuc2F2ZXIgcGFtIGF1dGhlbnRpY2F0aW9uIGxpbmVzIHVuY2hhbmdlZC4gVGhlCi0gICBkdHNlc3Npb24tU3VuUmF5IGxpbmUgbWF5IGFsc28gbmVlZCB0byBiZSBjb21tZW50ZWQgb3V0IHRvIGF2b2lkIHRoZQotICAgcHJvYmxlbSBmb3IgQ0RFIHNlc3Npb25zLiBOLkIuIGl0IGlzIHBvc3NpYmxlIHRoZSBhcHBsaWNhdGlvbiBvZiBhCi0gICBTU1JTIHBhdGNoLCBldGMsIG1heSByZS1lbmFibGUgdGhhdCAvZXRjL3BhbS5jb25mIGxpbmUuIEl0IG1heSBiZQotICAgZGlmZmljdWx0IHRvIGNvbnZpbmNlIGEgc3lzYWRtaW4gdG8gbWFrZSB0aGlzIGNoYW5nZS4KLQotICAgMykgQSBtb3JlIGZvcmNlZnVsIHdheSBpcyB0byBraWxsIHRoZSB4c2NyZWVuc2F2ZXIgcHJvY2VzcyBmcm9tIGEKLSAgIHNoZWxsIHByb21wdCB3aGVuZXZlciB5b3UgY29ubmVjdCB2aWEgeDExdm5jIGFuZCB0aGUgc2NyZWVuIGlzIGluIGEKLSAgIGxvY2tlZCBzdGF0ZToKLXBraWxsIC1VICRMT0dOQU1FICdeeHNjcmVlbnNhdmVyJCcKLQotICAgQW5kIHRoZW4gYWZ0ZXIgeW91IGFyZSBpbiBiZSBzdXJlIHRvIHJlc3RhcnQgaXQgYnkgdHlwaW5nIHNvbWV0aGluZwotICAgbGlrZToKLXhzY3JlZW5zYXZlciAmCi0KLSAgIFlvdSBtYXkgd2FudCB0byBhdm9pZCByZXN0YXJ0aW5nIGl0IHVudGlsIHlvdSBhcmUgYWJvdXQgdG8gZGlzY29ubmVjdAotICAgeW91ciBWTkMgdmlld2VyIChzaW5jZSBpZiBpdCBsb2NrcyB0aGUgc2NyZWVuIHdoaWxlIHlvdSBhcmUgd29ya2luZwotICAgeW91J2xsIGJlIHN0dWNrIGFnYWluKS4KLQotICAgMycpIFRoZSBhYm92ZSBpZGVhIGNhbiBiZSBkb25lIGEgYml0IG1vcmUgY2xlYW5seSBieSBoYXZpbmcgeDExdm5jIGRvCi0gICBpdC4gU3VwcG9zZSB3ZSBjYWxsZWQgdGhlIGZvbGxvd2luZyBzY3JpcHQgeHNzX2tpbGxlcjoKLSMhL2Jpbi9zaAotIwotIyB4c3Nfa2lsbGVyOiBraWxsIHhzY3JlZW5zYXZlciBhZnRlciBhIHZhbGlkIHgxMXZuYyBjbGllbnQgbG9ncyBpbi4KLSMgICAgICAgICAgICAgUmVzdGFydCB4c2NyZWVuc2F2ZXIgYW5kIGxvY2sgaXQgd2hlbiB0aGUgbGFzdCBjbGllbnQKLSMgICAgICAgICAgICAgZGlzY29ubmVjdHMuCi0KLVBBVEg9L3Vzci9vcGVud2luL2JpbjovdXNyL2JpbjokUEFUSAotZXhwb3J0IFBBVEgKLQotaWYgWyAiJFJGQl9NT0RFIiA9ICJhZnRlcmFjY2VwdCIgLWEgIiRSRkJfU1RBVEUiID0gIk5PUk1BTCIgXTsgdGhlbgotICAgICAgICAjIGEgdmFsaWQgeDExdm5jIGxvZ2luLgotICAgICAgICBpZiBbICIkUkZCX0NMSUVOVF9DT1VOVCIgPSAiMSIgXTsgdGhlbgotICAgICAgICAgICAgICAgICMgb25seSBvbmUgY2xpZW50IHByZXNlbnQuCi0gICAgICAgICAgICAgICAgcGtpbGwgLVUgJExPR05BTUUgJ154c2NyZWVuc2F2ZXIkJwotICAgICAgICAgICAgICAgIHBraWxsIC1LSUxMIC1VICRMT0dOQU1FIC1mIHhzY3JlZW5zYXZlci9oYWNrcwotICAgICAgICBmaQotZWxpZiBbICIkUkZCX01PREUiID0gImdvbmUiIC1hICIkUkZCX1NUQVRFIiA9ICJOT1JNQUwiIF07IHRoZW4KLSAgICAgICAgIyBhIHZhbGlkIHgxMXZuYyBsb2dpbi4KLSAgICAgICAgaWYgWyAiJFJGQl9DTElFTlRfQ09VTlQiID0gIjAiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAjIGxhc3QgY2xpZW50IHByZXNlbnQgaGFzIGp1c3QgbGVmdC4KLSAgICAgICAgICAgICAgICB4c2NyZWVuc2F2ZXIgLW5vc3BsYXNoICYKLSAgICAgICAgICAgICAgICBzbGVlcCAxCi0gICAgICAgICAgICAgICAgeHNjcmVlbnNhdmVyLWNvbW1hbmQgLWxvY2sgJgotICAgICAgICBmaQotZmkKLQotICAgVGhlbiB3ZSB3b3VsZCBydW4geDExdm5jIHdpdGggdGhlc2Ugb3B0aW9uczogIi1hZnRlcmFjY2VwdCB4c3Nfa2lsbGVyCi0gICAtZ29uZSB4c3Nfa2lsbGVyIi4gVGhlIC1hZnRlcmFjY2VwdCBvcHRpb24gKGludHJvZHVjZWQgaW4gdmVyc2lvbiAwLjgpCi0gICBpcyB1c2VkIHRvIHJ1biBhIGNvbW1hbmQgYWZ0ZXIgYSB2bmN2aWV3ZXIgaGFzIHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4KLSAgIChub3RlIHRoYXQgdGhpcyBpcyBhIFZOQyBsb2dpbiwgbm90IGEgVW5peCBsb2dpbiwgc28geW91IG1heSBub3Qgd2FudAotICAgdG8gZG8gdGhpcyBpZiB5b3UgYXJlIHJlYWxseSBwYXJhbm9pZC4uLikKLQotICAgTm90ZSBpZiB5b3UgdXNlIHRoZSBhYm92ZSBzY3JpcHQgYW5kIGFsc28gcGxhbiB0byBDdHJsLUMgKFNJR0lOVCkKLSAgIHgxMXZuYyB5b3UgaGF2ZSB0byBydW4gdGhlIHhzY3JlZW5zYXZlciBpbiBhIG5ldyBwcm9jZXNzIGdyb3VwIHRvCi0gICBhdm9pZCBraWxsaW5nIGl0IGFzIHdlbGwuIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB2aWEgdGhpcyBrbHVkZ2U6Ci1wZXJsIC1lICdzZXRwZ3JwKDAsMCk7IGV4ZWMgInhzY3JlZW5zYXZlciAtbm9zcGxhc2ggJiInCi0KLSAgIGluIHRoZSBhYm92ZSBzY3JpcHQuCi0KLSAgIDQpIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gcGFtX3N1bnJheS5zbyBpbiB0aGF0IGl0IGRvZXNuJ3Qgc2VlbQotICAgdG8gaG9ub3IgdGhlIGNvbnZlbnRpb24gdGhhdCwgc2F5LCBESVNQTEFZPXVuaXg6MyBtZWFucyB0byB1c2UgVW5peAotICAgc29ja2V0cyB0byBjb25uZWN0IHRvIGRpc3BsYXkgMyBvbiB0aGUgbG9jYWwgbWFjaGluZSAodGhpcyBpcyBhIGJpdAotICAgZmFzdGVyIHRoYW4gVENQIHNvY2tldHMpLiBSYXRoZXIsIGl0IHRoaW5rcyB0aGUgZGlzcGxheSBpcyBhIG5vbi1sb2NhbAotICAgb25lIHRvIGEgbWFjaGluZSBuYW1lZCAidW5peCIgKHRoYXQgdXN1YWxseSBkb2VzIG5vdCByZXNvbHZlIHRvIGFuIElQCi0gICBhZGRyZXNzKS4KLQotICAgQW11c2luZ2x5LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGJ5cGFzcyB0aGUgcGFtX3N1bnJheS5zbyBibG9ja2luZyBvZgotICAgWHN1biB0aGF0IHByZXZlbnRzIG9uZSBmcm9tIHVubG9ja2luZyB0aGUgc2NyZWVuIHJlbW90ZWx5IHZpYSB4MTF2bmMuCi0gICBPbmUgY291bGQgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gJEhPTUUvLmR0cHJvZmlsZSB0byBraWxsIGFueQotICAgZXhpc3RpbmcgeHNjcmVlbnNhdmVycyBhbmQgdGhlbiBzdGFydCB1cCBhIGZyZXNoIHhzY3JlZW5zYXZlciB1c2luZwotICAgRElTUExBWT11bml4Ok4KLSMgc3RvcC9raWxsIGFueSBydW5uaW5nIHhzY3JlZW5zYXZlcnMgKHByb2JhYmx5IG5vdCBydW5uaW5nIHlldCwgYnV0IHRvIGJlIHN1cmUKLSkKLXhzY3JlZW5zYXZlci1jb21tYW5kIC1leGl0Ci1wa2lsbCAtVSAkTE9HTkFNRSAnXnhzY3JlZW5zYXZlciQnCi1lbnYgRElTUExBWT1gZWNobyAkRElTUExBWSB8IHNlZCAtZSAncy9eLio6L3VuaXg6LydgIHhzY3JlZW5zYXZlciAmCi0KLQotICAgSW1wb3J0YW50OiBOb3RlIHRoYXQgYWxsIG9mIHRoZSBhYm92ZSB3b3JrYXJvdW5kcyBzaWRlLXN0ZXAgdGhlCi0gICBwYW1fc3VucmF5LnNvIFBBTSBtb2R1bGUgaW4gb25lIHdheSBvciBhbm90aGVyLiBZb3UnbGwgbmVlZCB0byBzZWUgaWYKLSAgIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgc2l0ZSdzIFN1blJheSAvIHNtYXJ0Y2FyZCB1c2FnZS4gQWxzbywKLSAgIHRoZXNlIGhhY2tzIG1heSBicmVhayBvdGhlciB0aGluZ3MgYW5kIHNvIHlvdSBtYXkgd2FudCB0byB0ZXN0IHZhcmlvdXMKLSAgIHNjZW5hcmlvcyBjYXJlZnVsbHkuIEUuZy4gY2hlY2sgY29ybmVyIGNhc2VzIGxpa2UgWERNQ1AvZHRyZW1vdGUsCi0gICBOU0NNLCBldGMuCi0KLQotICAgVXBkYXRlIE1heSAyMDA4OiBIZXJlIGlzIGEgdXNlZnVsIGRlc2NyaXB0aW9uIG9mIHRoaXMgaXNzdWUgZnJvbSBCb2IKLSAgIERvb2xpdHRsZSB3aG8gaXMgYSBkZXZlbG9wZXIgZm9yIFN1biBSYXkgYXQgU3VuLiBJIGRvbid0IGhhdmUgdGhlIHRpbWUKLSAgIHRvIGRpZ2VzdCBhbmQgZGlzdGlsbCBpdCBhbmQgdGhlbiBhZGp1c3QgdGhlIGFib3ZlIG1ldGhvZHMgdG8gcHJvdmlkZQotICAgYSBjbGVhcmVyIGRlc2NyaXB0aW9uLCBzbyBJIGp1c3QgaW5jbHVkZSBiZWxvdyB0aGUgZGVzY3JpcHRpb24gaGUgc2VudAotICAgbWUgd2l0aCB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgaGVscCBzb21lIHVzZXJzOgotCi0gICAgIEluIFNSU1MgNC4wIGFuZCBlYXJsaWVyLCB0aGUgcHVycG9zZSBvZiBwYW1fc3VucmF5LnNvIGluIHRoZSAiYXV0aCIKLSAgICAgUEFNIHN0YWNrIG9mIHNjcmVlbnNhdmVycyBpcyB0byBlbmFibGUgTlNDTSAoYW5kLCBhbHRob3VnaCB0aGlzIGlzCi0gICAgIG11Y2ggbGVzcyBjb21tb25seSB1c2VkLCAiU0MiLCB3aGljaCBpcyBjb25maWd1cmVkIHdoZW4gM3JkLXBhcnR5Ci0gICAgIHNvZnR3YXJlIGlzIGluc3RhbGxlZCB0byBhbGxvdyBzbWFydGNhcmRzIHRvIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUKLSAgICAgYXV0aGVudGljYXRpb24gcHJvY2VzcykgdG8gd29yay4gSXQgc2hvdWxkIGhhdmUgbm8gZWZmZWN0IHdpdGgKLSAgICAgc21hcnRjYXJkcy4gQ3VycmVudGx5LCBob3dldmVyLCBpdCBkb2VzIGJsb2NrIHRoZSBQQU0gc3RhY2sgZm9yIGFsbAotICAgICBzZXNzaW9ucywgd2hpY2ggY2F1c2VzIHhzY3JlZW5zYXZlciwgd2hlbiBpdCBsb2NrcyBhIGRpc2Nvbm5lY3RlZAotICAgICBzZXNzaW9uLCB0byBub3QgcHJvY2VzcyBhbnkgbW91c2Ugb3Iga2V5Ym9hcmQgZXZlbnRzIGFzIHlvdQotICAgICBkZXNjcmliZSAodW5sZXNzIHhzY3JlZW5zYXZlciBkb2VzIGFuIFggc2VydmVyIGdyYWIsIGhvd2V2ZXIsIG90aGVyCi0gICAgIGFwcGxpY2F0aW9ucyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBkcmF3IGluIHRoZSBzZXNzaW9uIGFsdGhvdWdoCi0gICAgIHhzY3JlZW5zYXZlciBtYXkgYmUgcGxheWluZyB0cmlja3MgbGlrZSBwdXR0aW5nIGEgYmxhY2sgd2luZG93IG9uCi0gICAgIHRvcCBvZiBldmVyeXRoaW5nKS4gSW4gYm90aCBvZiB0aGUgTlNDTSBhbmQgU0MgbW9kZWxzLAotICAgICBhdXRoZW50aWNhdGlvbiBvY2N1cnMgaW4gYSBzZXBhcmF0ZSBzZXNzaW9uIGJlZm9yZSBTUlNTIHdpbGwKLSAgICAgcmVjb25uZWN0IHRvIHRoZSB1c2VyIHNlc3Npb24sIGluIHdoaWNoIGNhc2UgcGFtX3N1bnJheS5zbyBjYXVzZXMKLSAgICAgeHNjcmVlbnNhdmVyIHRvIGp1c3QgdW5sb2NrIHRoZSBzY3JlZW4gd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIKLSAgICAgdG8gZW50ZXIgdGhlaXIgcGFzc3dvcmQgYWdhaW4uIFRvIGRvIHRoaXMsIHBhbV9zdW5yYXkuc28gaGFzIHRvCi0gICAgIGJsb2NrIHVudGlsIHRoZSBzZXNzaW9uIGJlY29tZXMgcmVjb25uZWN0ZWQsIHNvIGl0IGNhbiBxdWVyeSBTUlNTCi0gICAgIGF0IHRoYXQgdGltZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgdXNlciBoYXMgYWxyZWFkeQotICAgICBhdXRoZW50aWNhdGVkIG9yIG5vdC4gSW4gU1JTUyA0LjAgYW5kIGVhcmxpZXIgcmVsZWFzZXMsCi0gICAgIHBhbV9zdW5yYXkuc28gY291bGQgaGF2ZSBiZWVuIG9wdGltaXplZCB0byBub3QgYmxvY2sgc21hcnRjYXJkCi0gICAgIHNlc3Npb25zLCBhbHRob3VnaCBzaW5jZSB0aGUgc2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQgdGhpcyB0eXBpY2FsbHkKLSAgICAgaXNuJ3QgaW1wb3J0YW50IChleGNlcHQgaW4gdGhlIHgxMXZuYyBjYXNlLCBhcyB5b3UndmUgb2JzZXJ2ZWQpLgotCi0gICAgIEluIFNSU1MgNC4xLCBob3dldmVyLCBmb3IgaW5jcmVhc2VkIHNlY3VyaXR5IHRoZSBvdXQtb2Ytc2Vzc2lvbgotICAgICBhdXRoZW50aWNhdGlvbiBtb2RlbCBoYXMgYmVlbiBleHRlbmRlZCB0byAqYWxsKiBzZXNzaW9uIHR5cGVzLCBzbwotICAgICBwYW1fc3VucmF5LnNvIHdpbGwgYmUgcmVxdWlyZWQgaW4gYWxsIGNhc2VzIHVubGVzcyB1c2VycyBhcmUKLSAgICAgd2lsbGluZyB0byBhdXRoZW50aWNhdGUgdHdpY2UgdXBvbiBob3RkZXNraW5nIChlLmcuIHdoZW4gdGhlaXIgY2FyZAotICAgICBpcyBpbnNlcnRlZCkuIEluIGZ1dHVyZSwgd2UgbWF5IGRvIGF3YXkgd2l0aCBwYW1fc3VucmF5LnNvLCBhbmQgaW4KLSAgICAgZmFjdCB3aXRoIGFueSB0cmFkaXRpb25hbCBzY3JlZW4gbG9ja2VyIGluIHRoZSB1c2VyIHNlc3Npb24sIHNpbmNlCi0gICAgIFNSU1MgaXRzZWxmIHdpbGwgYmUgcHJvdmlkaW5nIGJldHRlciBzZWN1cml0eSB0aGFuIGEgc2NyZWVuIGxvY2tlcgotICAgICBydW5uaW5nIGVudGlyZWx5IHdpdGhpbiB0aGUgdXNlcidzIFggc2Vzc2lvbiBpcyBjYXBhYmxlIG9mCi0gICAgIHByb3ZpZGluZy4KLQotICAgICBZb3VyIHRyaWNrIG9mIHNldHRpbmcgRElTUExBWSB0byB1bml4OkRQWSB3aWxsIGVmZmVjdGl2ZWx5IGRpc2FibGUKLSAgICAgcGFtX3N1bnJheS5zbyAoSSdtIG5vdCBzdXJlIEknZCBjYWxsIHRoYXQgYSBidWcgLSB5b3UncmUgZ29pbmcgb3V0Ci0gICAgIG9mIHlvdXIgd2F5IHRvIGRvIHNvbWV0aGluZyB0aGF0IHdvdWxkbid0IG9jY3VyIGluIHRoZSBub3JtYWwKLSAgICAgY291cnNlIG9mIGV2ZW50cywgYW5kIHJlYWxseSBwcm92aWRlcyBubyB1c2VmdWwgdmFsdWUgb3RoZXIgdGhhbiB0bwotICAgICB0aWNrbGUgdGhpcyBiZWhhdmlvciBpbiBwYW1fc3VucmF5LnNvKS4gVGhpcyB3aWxsIG1lYW4gdGhhdCwgaW4KLSAgICAgU1JTUyA0LjAgYW5kIGVhcmxpZXIgcmVsZWFzZXMsIHVzZXJzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHRoZWlyCi0gICAgIHBhc3N3b3JkcyB0d2ljZSB3aGVuIHJlY29ubmVjdGluZyB0byB0aGVpciBzZXNzaW9ucyBmb3IgTlNDTSBhbmQgU0MKLSAgICAgc2Vzc2lvbiB0eXBlcy4gSW4gNC4xLCBkaXNhYmxpbmcgcGFtX3N1bnJheS5zbyBpbiB0aGlzIHdheSB3aWxsCi0gICAgIGNhdXNlIHRoaXMgZG91YmxlLWF1dGhlbnRpY2F0aW9uIHRvIG9jY3VyIGZvciAqYWxsKiBzZXNzaW9ucywKLSAgICAgaW5jbHVkaW5nIHNpbXBsZSBzbWFydGNhcmQgc2Vzc2lvbnMuIFVzZXJzIG1heSBiZSB3aWxsaW5nIHRvIHBheQotICAgICB0aGF0IHByaWNlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHgxMXZuYyBpbiBkaXNjb25uZWN0ZWQKLSAgICAgc2Vzc2lvbnMuIEkgbGlrZSB0aGlzIGhhY2ssIHBlcnNvbmFsbHkuIEl0J3MgYSBsaXR0bGUgbGVzcwotICAgICBjb252ZW5pZW50IHRoYW4gc29tZSBvZiB0aGUgb3RoZXIgYXBwcm9hY2hlcyB5b3UgZGVzY3JpYmUsIGJ1dCBpdCdzCi0gICAgIGxpZ2h0ZXItd2VpZ2h0IGFuZCBtb3JlIHNlY3VyZSB0aGFuIG1vc3Qgb2YgdGhlIG90aGVyIGFwcHJvYWNoZXMsCi0gICAgIGFuZCBwcm92aWRlcyB0aGUgdmFsdWUgb2YgYmVpbmcgYWJsZSB0byB1c2UgeDExdm5jIGluIGxvY2tlZAotICAgICBzZXNzaW9ucy4KLQotICAgICBIZXJlIGFyZSBzb21lIG90aGVyIG1pbm9yIG5vdGVzOiAtIEkgd291bGRuJ3QgcmVjb21tZW5kIHN0b3JpbmcKLSAgICAgeW91ciBkaXNwbGF5IGluIHlvdXIgLmR0cHJvZmlsZSwgdW5sZXNzIHlvdSdyZSB3aWxsaW5nIHRvIGxpdmUgd2l0aAotICAgICBhIHNpbmdsZSBzZXNzaW9uIGF0IGEgdGltZS4gUGVyc29uYWxseSwgSSBvZnRlbiBmaW5kIG15c2VsZiB1c2luZwotICAgICBzZXZlcmFsIHNlc3Npb25zLCBpbiBzZXZlcmFsIEZvR3MsIGZvciBzaG9ydCBwZXJpb2RzIG9mIHRpbWUgc28KLSAgICAgdGhpcyB3b3VsZCBjZXJ0YWlubHkgYnJlYWsuIElNTyBpdCdzIHByZXR0eSBlYXN5IHRvIHVzZSAkRElTUExBWSB0bwotICAgICBkbyB3aGF0IHlvdSB3YW50IG9uIHRoZSBmbHksIGFzIG5lZWRlZCwgc28gSSBkb24ndCB0aGluayB0aGUgcHJpY2UKLSAgICAgb2YgYnJlYWtpbmcgbXVsdGlwbGUtc2Vzc2lvbiBmdW5jdGlvbmFsaXR5IHdvdWxkIGJlIHdvcnRoIHRoZQotICAgICBjb252ZW5pZW5jZSwgdG8gbWUgYXQgbGVhc3QuIEhlcmUncyBzb21lIGtzaC9iYXNoIHN5bnRheCB0byBleHRyYWN0Ci0gICAgIHRoZSBob3N0bmFtZSBhbmQgZGlzcGxheSBudW1iZXIgb24gdGhlIGZseSB3aGljaCB5b3UgbWF5IGZpbmQKLSAgICAgdXNlZnVsOgotSE9TVE5BTUU9JHtESVNQTEFZJToqfQotRlVMTERQWT0ke0RJU1BMQVkjKjp9Ci1EUFlOVU09JHtGVUxMRFBZJS4qfQotCi0gICAgIEEgZmluYWwgbm90ZSBtYXkgZ2l2ZSB5b3Ugc29tZSBpbnNpZ2h0IGludG8gb3RoZXIgY2xldmVyIGhhY2tzIGluCi0gICAgIHRoaXMgYXJlYTogLSBDaGVjayBvdXQgdXRhY3Rpb24uIEl0J3MgYSB2ZXJ5IGhhbmR5IGxpdHRsZSB1dGlsaXR5Ci0gICAgIHRoYXQgY2FuIGJlIHJ1biBhcyBhIGRhZW1vbiBpbiB0aGUgdXNlciBzZXNzaW9uIHdoaWNoIHdpbGwgaW52b2tlIGEKLSAgICAgc3BlY2lmaWVkIGNvbW1hbmQgdXBvbiBzZXNzaW9uIGNvbm5lY3RzIGFuZC9vciBkaXNjb25uZWN0cy4KLSAgICAgUGVyc29uYWxseSwgSSBzdGFydCBvbmUgdXAgaW4gbXkgLmR0cHJvZmlsZSBhcyBmb2xsb3dzOgotdXRhY3Rpb24gLWMgJEhPTUUvLnNyY29ubmVjdHJjIC1kICRIT01FLy5zcmRpc2Nvbm5lY3RyYyAmCi0KLSAgICAgVGhpcyB0aGVuIGFsbG93cyBtZSB0byBjb25zdHJ1Y3QgYSAuc3Jjb25uZWN0cmMgc2NyaXB0IGNvbnRhaW5pbmcKLSAgICAgdXNlZnVsIGNvbW1hbmRzIEknZCBsaWtlIHRvIGhhdmUgcnVuIGV2ZXJ5IHRpbWUgSSBpbnNlcnQgbXkKLSAgICAgc21hcnRjYXJkLCBhbmQgYSAuc3JkaXNjb25uZWN0cmMgc2NyaXB0IG9mIGNvbW1hbmRzIHRvIGJlIHJ1biBldmVyeQotICAgICB0aW1lIEkgcmVtb3ZlIG15IHNtYXJ0Y2FyZCAob3IsIGNvbm5lY3QvZGlzY29ubmVjdCB0byBteSBzZXNzaW9uCi0gICAgIHZpYSBOU0NNIG9yIFNDKS4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2Ugbm90aWZ5aW5nIGEgY2hhdAotICAgICBjbGllbnQgb2YgYXdheSBzdGF0dXMsIGFzIHdlbGwgYXMgc29tZSBvZiB0aGUgaGFja3MgeW91J3ZlCi0gICAgIGRlc2NyaWJlZCBvbiB5b3VyIHBhZ2Ugc3VjaCBhcyBmcmVlemUvdW5mcmVlemUsIG9yIHBlcmhhcHMgdG8KLSAgICAgdGVybWluYXRlIGFuIHhzY3JlZW5zYXZlciBhbmQgc3RhcnQgdXAgYSBuZXcgb25lIHdpdGggdGhlIHVuaXg6RFBZCi0gICAgICRESVNQTEFZIHNwZWNpZmljYXRpb24gYXMgeW91IGRlc2NyaWJlIChhbHRob3VnaCBpdCBwcm9iYWJseSBtYWtlcwotICAgICBtb3N0IHNlbnNlIHRvIGRvIHRoaXMgYXQgbG9naW4gdGltZSwgYXMgb3Bwb3NlZCB0byBldmVyeSBjb25uZWN0IG9yCi0gICAgIGRpc2Nvbm5lY3QgZXZlbnQpLgotCQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3NsLmh0bWw6Ci0KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBOb3RlcyBvbiB4MTF2bmMgU1NMIENlcnRpZmljYXRlcyBhbmQgS2V5IE1hbmFnZW1lbnQ6Ci0KLSAgIFRoZSBzaW1wbGVzdCBzY2hlbWUgKCJ4MTF2bmMgLXNzbCBUTVAiKSBpcyB3aGVyZSB4MTF2bmMgZ2VuZXJhdGVzIGEKLSAgIHRlbXBvcmFyeSwgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZWFjaCB0aW1lIChhdXRvbWF0aWNhbGx5IHVzaW5nCi0gICBvcGVuc3NsKDEpKSBhbmQgdGhlIFZOQyB2aWV3ZXIgY2xpZW50IGFjY2VwdHMgdGhlIGNlcnRpZmljYXRlIHdpdGhvdXQKLSAgIHF1ZXN0aW9uIChlLmcuIHVzZXIgY2xpY2tzICJZZXMiIGluIGEgZGlhbG9nIGJveC4gUGVyaGFwcyB0aGUgZGlhbG9nCi0gICBhbGxvd3MgdGhlbSB0byB2aWV3IHRoZSBjZXJ0aWZpY2F0ZSB0b28pLiBBbHNvIG5vdGUgc3R1bm5lbCdzIGRlZmF1bHQKLSAgIGlzIHRvIHF1aWV0bHkgYWNjZXB0IGFsbCBjZXJ0aWZpY2F0ZXMuCi0KLSAgIFRoZSBlbmNyeXB0aW9uIHRoaXMgcHJvdmlkZXMgcHJvdGVjdHMgYWdhaW5zdCBhbGwgcGFzc2l2ZSBzbmlmZmluZyBvZgotICAgdGhlIFZOQyB0cmFmZmljIGFuZCBwYXNzd29yZHMgb24gdGhlIG5ldHdvcmsgYW5kIHNvIGl0IGlzIHF1aXRlIGdvb2QsCi0gICBidXQgaXQgZG9lcyBub3QgcHJldmVudCBhIE1hbi1Jbi1UaGUtTWlkZGxlIGFjdGl2ZSBhdHRhY2s6IGUuZy4gYW4KLSAgIGF0dGFja2VyIGludGVyY2VwdHMgdGhlIFZOQyBjbGllbnQgc3RyZWFtIGFuZCBzZW5kcyBpdCBoaXMgb3duIFB1YmxpYwotICAga2V5IGZvciBTU0wgbmVnb3RpYXRpb24gKHByZXRlbmRpbmcgdG8gYmUgdGhlIHNlcnZlcikuIFRoZW4gaXQgbWFrZXMgYQotICAgY29ubmVjdGlvbiB0byBTU0wgeDExdm5jIGl0c2VsZiBhbmQgZm9yd2FyZHMgdGhlIGRhdGEgYmFjayBhbmQgZm9ydGguCi0gICBIZSBjYW4gc2VlIGFsbCB0aGUgdHJhZmZpYyBhbmQgbW9kaWZ5IGl0IGFzIHdlbGwuCi0KLSAgIE1vc3QgcGVvcGxlIGRvbid0IHNlZW0gdG8gd29ycnkgYWJvdXQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcyB0aGVzZQotICAgZGF5czsgdGhleSBhcmUgbW9yZSBjb25jZXJuZWQgYWJvdXQgcGFzc2l2ZSBzbmlmZmluZyBvZiBwYXNzd29yZHMsCi0gICBldGMuIFBlcmhhcHMgc29tZWRheSB0aGF0IHdpbGwgY2hhbmdlIGlmIGF0dGFjayB0b29scyBhcmUgdXNlZCBtb3JlCi0gICB3aWRlbHkgdG8gcGVyZm9ybSB0aGUgYXR0YWNrLiBOT1RFOiBUaGVyZSBhcmUgaGFja2VyIHRvb2xzIGxpa2UKLSAgIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluIHRoYXQgaW1wbGVtZW50IFNTTCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLgotICAgVGhleSBhbGwgcmVseSBvbiB0aGUgY2xpZW50IG5vdCBib3RoZXJpbmcgdG8gY2hlY2sgdGhhdCB0aGUgY2VydCBpcwotICAgdmFsaWQuCi0KLSAgIElmIHlvdSBhcmUgbm90IHdvcnJpZWQgYWJvdXQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcyB5b3UgZG8gbm90IGhhdmUKLSAgIHRvIHJlYWQgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGluIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgIFRvIHByZXZlbnQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcywgY2VydGlmaWNhdGVzIG11c3Qgc29tZWhvdyBiZQotICAgdmVyaWZpZWQuIFRoaXMgcmVxdWlyZXMgdGhlIFZOQyBjbGllbnQgc2lkZSBoYXZlIHNvbWUgcGllY2Ugb2YKLSAgIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBTU0wgeDExdm5jIHNlcnZlci4KLSAgIEFsdGVybmF0aXZlbHksIGFsdGhvdWdoIHJhcmVseSBkb25lLCB4MTF2bmMgY2FuIHZlcmlmeSBWTkMgQ2xpZW50cycKLSAgIGNlcnRpZmljYXRlcywgc2VlIHRoZSAtc3NsdmVyaWZ5IG9wdGlvbiB0aGF0IGlzIGRpc2N1c3NlZCBiZWxvdy4KLQotICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gaGF2ZSB0aGUgY2xpZW50IGF1dGhlbnRpY2F0ZSB0aGUgU1NMCi0gICB4MTF2bmMgc2VydmVyLiBUaGUgcXVpY2tlc3Qgd2F5IHBlcmhhcHMgd291bGQgYmUgdG8gY29weSAoc2FmZWx5KSB0aGUKLSAgIGNlcnRpZmljYXRlIHgxMXZuYyBwcmludHMgb3V0OgotMjYvMDMvMjAwNiAyMToxMjowMCBDcmVhdGluZyBhIHRlbXBvcmFyeSwgc2VsZi1zaWduZWQgUEVNIGNlcnRpZmljYXRlLi4uCi0uLi4KLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJQzRUQ0NBa3FnQXdJQkFnSUpBTW53Q2FPanZFS2FNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR21NUXN3Q1FZRAotVlFRR0V3SkJWVEVPTUF3R0ExVUVCeE1GVEdsdWRYZ3hJVEFmQmdOVkJBc1RHR0Z1WjJWc1lTMHhNVFF6TkRJMQotTlRJd0xqUXhNVEUyT1RFUE1BMEdBMVVFQ2hNR2VERXhkbTVqTVM0d0xBWURWUVFERXlWNE1URjJibU10VTBWTQotKG1vcmUgbGluZXMpIC4uLgotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotCi0gICB0byB0aGUgY2xpZW50IG1hY2hpbmUocykgYW5kIGhhdmUgdGhlIGNsaWVudCdzIFNTTCBtYWNoaW5lcnkgKGUuZy4KLSAgIHN0dW5uZWwsIFdlYiBCcm93c2VyLCBvciBKYXZhIHBsdWdpbikgaW1wb3J0IHRoZSBjZXJ0aWZpY2F0ZS4gVGhhdCB3YXkKLSAgIHdoZW4gdGhlIGNvbm5lY3Rpb24gdG8geDExdm5jIGlzIG1hZGUgdGhlIGNsaWVudCBjYW4gdmVyaWZ5IHRoYXQgaXMgaXQKLSAgIHRoZSBkZXNpcmVkIHNlcnZlciBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgU1NMIGNvbm5lY3Rpb24uCi0KLSAgIFNvLCBmb3IgZXhhbXBsZSBzdXBwb3NlIHRoZSB1c2VyIGlzIHVzaW5nIHRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQwotICAgVmlld2VyIGFuZCBoYXMgaW5jb3Jwb3JhdGVkIHRoZSB4MTF2bmMgY2VydGlmaWNhdGUgaW50byBoaXMgV2ViCi0gICBicm93c2VyIG9uIHRoZSB2aWV3aW5nIHNpZGUuIElmIGhlIGdldHMgYSBkaWFsb2cgdGhhdCB0aGUgY2VydGlmaWNhdGUKLSAgIGlzIG5vdCB2ZXJpZmllZCBoZSBrbm93cyBzb21ldGhpbmcgaXMgd3JvbmcuIEl0IG1heSBiZSBhCi0gICBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2ssIGJ1dCBtb3JlIGxpa2VseSB4MTF2bmMgY2VydGlmaWNhdGUgaGFzCi0gICBjaGFuZ2VkIG9yIGV4cGlyZWQgb3IgaGlzIGJyb3dzZXIgd2FzIHJlaW5zdGFsbGVkIGFuZC9vciBsb3N0IHRoZQotICAgY2VydGlmaWNhdGUsIGV0YywgZXRjLgotCi0gICBBcyBhbm90aGVyIGV4YW1wbGUsIGlmIHRoZSB1c2VyIHdhcyB1c2luZyBzdHVubmVsIHdpdGggaGlzIFZOQyB2aWV3ZXIKLSAgICh0aGlzIGlzIG1lbnRpb25lZCBpbiB0aGlzIEZBUSksIGUuZy4gU1RVTk5FTC5FWEUgb24gV2luZG93cywgdGhlbiBoZQotICAgd291bGQgaGF2ZSB0byBzZXQgdGhlICJDQWZpbGUgPSBwYXRoLXRvLXRoZS1jZXJ0IiBhbmQgInZlcmlmeSA9IDIiCi0gICBvcHRpb25zIGluIHRoZSBzdHVubmVsLmNvbmYgZmlsZSBiZWZvcmUgc3RhcnRpbmcgdXAgdGhlIHR1bm5lbC4gSWYgYQotICAgeDExdm5jIGNlcnRpZmljYXRlIGNhbm5vdCBiZSB2ZXJpZmllZCwgc3R1bm5lbCB3aWxsIGRyb3AgdGhlCi0gICBjb25uZWN0aW9uIChhbmQgcHJpbnQgYSBmYWlsdXJlIG1lc3NhZ2UgaW4gaXRzIGxvZyBmaWxlKS4KLQotICAgQSB0aGlyZCBleGFtcGxlLCB1c2luZyB0aGUgVk5DIHZpZXdlciBvbiBVbml4IHdpdGggc3R1bm5lbCB0aGUgd3JhcHBlcgotICAgc2NyaXB0IGNhbiBiZSB1c2VkIHRoaXMgd2F5OiAic3Nfdm5jdmlld2VyIC12ZXJpZnkgLi94MTF2bmMuY3J0Ci0gICBmYXItYXdheS5lYXN0OjAiIHdoZXJlIC4veDExdm5jLmNydCBpcyB0aGUgY29waWVkIGNlcnRpZmljYXRlIHgxMXZuYwotICAgcHJpbnRlZCBvdXQuCi0KLSAgIEFzIGZvdXJ0aCBleGFtcGxlLCBvdXIgU1NWTkMgZW5oYW5jZWQgdGlnaHR2bmMgdmlld2VyIGNhbiBhbHNvIHVzZQotICAgdGhlc2UgY2VydGlmaWNhdGUgZmlsZXMgZm9yIHNlcnZlciBhdXRoZW50aWNhdGlvbi4gWW91IGNhbiBsb2FkIHRoZW0KLSAgIHZpYSB0aGUgU1NWTkMgJ0NlcnRzLi4uJyBkaWFsb2cgYW5kIHNldCAnU2VydmVyQ2VydCcgdG8gdGhlCi0gICBjZXJ0aWZpY2F0ZSBmaWxlIHlvdSBzYWZlbHkgY29waWVkIHRoZXJlLgotCi0gICBOb3RlIHRoYXQgaW4gcHJpbmNpcGxlIHRoZSBjb3B5aW5nIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byB0aGUgY2xpZW50Ci0gICBtYWNoaW5lKHMpIGl0c2VsZiBjb3VsZCBiZSBhbHRlcmVkIGJ5IGEgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrISBZb3UKLSAgIGNhbid0IHdpbjsgaXQgaXMgdmVyeSBkaWZmaWN1bHQgdG8gYmUgY29tcGxldGVseSBzZWN1cmUuIEl0IGlzCi0gICB1bmxpa2VseSB0aGUgYXR0YWNrZXIgY291bGQgcHJlZGljdCBob3cgeW91IHdlcmUgZ29pbmcgdG8gc2VuZCBpdAotICAgdW5sZXNzIHlvdSBoYWQsIHNheSwgZG9uZSBpdCBtYW55IHRpbWVzIGJlZm9yZSB0aGUgc2FtZSB3YXkuIFNTSCBpcyBhCi0gICB2ZXJ5IGdvb2Qgd2F5IHRvIHNlbmQgaXQgKGJ1dCBvZiBjb3Vyc2UgaXQgdG9vIGRlcGVuZHMgb24gcHVibGljIGtleXMKLSAgIGJlaW5nIHNlbnQgdW5hbHRlcmVkIGJldHdlZW4gdGhlIHR3byBtYWNoaW5lcyEpLgotCi0gICBJZiB5b3UgYXJlIHJlYWxseSBwYXJhbm9pZCwgSSdtIHN1cmUgeW91J2xsIGZpZ3VyZSBvdXQgYSByZWFsbHkgZ29vZAotICAgd2F5IHRvIHRyYW5zcG9ydCB0aGUgY2VydGlmaWNhdGVzLiBTZWUgdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eQotICAgc2NoZW1lIGJlbG93IGZvciBhIHdheSB0byBtYWtlIHRoaXMgZWFzaWVyICh5b3UganVzdCBoYXZlIHRvIGRvIGl0Ci0gICBvbmNlKS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBTYXZpbmcgU1NMIGNlcnRpZmljYXRlcyBhbmQga2V5czoKLQotICAgTm93LCBpdCB3b3VsZCBiZSB2ZXJ5IGluY29udmVuaWVudCB0byBjb3B5IHRoZSBuZXcgdGVtcG9yYXJ5Ci0gICBjZXJ0aWZpY2F0ZSBldmVyeSB0aW1lIHgxMXZuYyBpcyBydW4gaW4gU1NMIG1vZGUuIFNvIGZvciBjb252ZW5pZW5jZQotICAgdGhlcmUgaXMgdGhlICJTQVZFIiBrZXl3b3JkIHRvIGluc3RydWN0IHgxMXZuYyB0byBzYXZlIHRoZSBjZXJ0aWZpY2F0ZQotICAgaXQgY3JlYXRlczoKLSAgeDExdm5jIC1zc2wgU0FWRSAtZGlzcGxheSA6MCAuLi4KLQotICAgVGhpcyBiZWhhdmlvciBpcyBub3cgdGhlIGRlZmF1bHQsIHlvdSBtdXN0IHVzZSAiVE1QIiBmb3IgYSB0ZW1wb3JhcnkKLSAgIG9uZS4gSXQgd2lsbCBzYXZlIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXkgaW4gdGhlc2UgZmlsZXM6Ci0gIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIuY3J0Ci0gIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtCi0KLSAgIFRoZSAiLmNydCIgZmlsZSBjb250YWlucyBvbmx5IHRoZSBjZXJ0aWZpY2F0ZSBhbmQgc2hvdWxkIGJlIHNhZmVseQotICAgY29waWVkIHRvIHRoZSBWTkMgVmlld2VyIG1hY2hpbmUocykgdGhhdCB3aWxsIGJlIGF1dGhlbnRpY2F0aW5nIHRoZQotICAgeDExdm5jIHNlcnZlci4gVGhlICIucGVtIiBmaWxlIGNvbnRhaW5zIGJvdGggdGhlIGNlcnRpZmljYXRlIGFuZCB0aGUKLSAgIHByaXZhdGUga2V5IGFuZCBzaG91bGQgYmUga2VwdCBzZWNyZXQuIChJZiB5b3UgZG9uJ3QgbGlrZSB0aGUgZGVmYXVsdAotICAgbG9jYXRpb24gfi8udm5jL2NlcnRzLCBlLmcuIGl0IGlzIG9uIGFuIE5GUyBzaGFyZSBhbmQgeW91IGFyZSB3b3JyaWVkCi0gICBhYm91dCBsb2NhbCBuZXR3b3JrIHNuaWZmaW5nLCB1c2UgdGhlIC1zc2xkaXIgZGlyIG9wdGlvbiB0byBwb2ludCB0byBhCi0gICBkaWZmZXJlbnQgZGlyZWN0b3J5LikKLQotICAgU28gdGhlIG5leHQgdGltZSB5b3UgcnVuICJ4MTF2bmMgLXNzbCBTQVZFIC4uLiIgaXQgd2lsbCByZWFkIHRoZQotICAgc2VydmVyLnBlbSBmaWxlIGRpcmVjdGx5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgotCi0gICBZb3UgY2FuIG1hbmFnZSBtdWx0aXBsZSBTU0wgeDExdm5jIHNlcnZlciBrZXlzIGluIHRoaXMgc2ltcGxlIHdheSBieQotICAgdXNpbmc6Ci0gIHgxMXZuYyAtc3NsIFNBVkUta2V5MiAtZGlzcGxheSA6MCAuLi4KLQotICAgZXRjLCB3aGVyZSB5b3UgcHV0IHdoYXRldmVyIG5hbWUgeW91IGNob29zZSBmb3IgdGhlIGtleSBhZnRlciAiU0FWRS0iLgotICAgRS5nLiAiLXNzbCBTQVZFLWZyZWQiLgotCi0gICBBbHNvLCBpZiB5b3Ugd2FudCB0byBiZSBwcm9tcHRlZCB0byBwb3NzaWJseSBjaGFuZ2UgdGhlIG1hZGUgdXAgbmFtZXMsCi0gICBldGMuIHRoYXQgeDExdm5jIGNyZWF0ZXMgKGUuZy4gIngxMXZuYy1TRUxGLVNJR05FRC1DRVJULTc3NjIiIGZvciB0aGUKLSAgIENvbW1vbk5hbWUpIGZvciB0aGUgY2VydGlmaWNhdGVzIGRpc3Rpbmd1aXNoZWQgbmFtZSAoRE4pLCB0aGVuIHVzZQotICAgIngxMXZuYyAtc3NsIFNBVkVfUFJPTVBUIC4uLiIsICJ4MTF2bmMgLXNzbCBTQVZFX1BST01QVC1mcmVkIC4uLiIgZXRjLgotICAgd2hlbiB5b3UgY3JlYXRlIHRoZSBrZXkgdGhlIGZpcnN0IHRpbWUuCi0KLSAgIFRpcDogd2hlbiBwcm9tcHRpbmcsIGlmIHlvdSBjaG9vc2UgdGhlIENvbW1vbk5hbWUgZW50cnkgdG8gYmUgdGhlIGZ1bGwKLSAgIGludGVybmV0IGhvc3RuYW1lIG9mIHRoZSBtYWNoaW5lIHRoZSBjbGllbnRzIHdpbGwgYmUgY29ubmVjdGluZyB0bwotICAgdGhlbiB0aGF0IHdpbGwgYXZvaWQgYW4gYW5ub3lpbmcgZGlhbG9nIGJveCBpbiB0aGVpciBXZWIgYnJvd3NlcnMgdGhhdAotICAgd2FybiB0aGF0IHRoZSBDb21tb25OYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlIGhvc3RuYW1lLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFBhc3NwaHJhc2VzIGZvciBzZXJ2ZXIga2V5czoKLQotICAgV2VsbCwgc2luY2Ugbm93IHdpdGggdGhlICJTQVZFIiBrZXl3b3JkIHRoZSBjZXJ0aWZpY2F0ZSBhbmQga2V5IHdpbGwKLSAgIGJlIGxvbmdlciBsaXZlZCwgb25lIGNhbiBuZXh0IHdvcnJ5IGFib3V0IHNvbWVib2R5IHN0ZWFsaW5nIHRoZQotICAgcHJpdmF0ZSBrZXkgYW5kIHByZXRlbmRpbmcgdG8gYmUgdGhlIHgxMXZuYyBzZXJ2ZXIhIEhvdyB0byBndWFyZAotICAgYWdhaW5zdCB0aGlzPwotCi0gICBUaGUgZmlyc3QgaXMgdGhhdCB0aGUgZmlsZSBpcyBjcmVhdGVkIHdpdGggcGVybXMgNjAwIChpLmUuIC1ydy0tLS0tLS0pCi0gICB0byBtYWtlIGl0IGhhcmRlciBmb3IgYW4gdW50cnVzdGVkIHVzZXIgdG8gY29weSB0aGUgZmlsZS4gQSBiZXR0ZXIgd2F5Ci0gICBpcyB0byBhbHNvIGVuY3J5cHQgdGhlIHByaXZhdGUga2V5IHdpdGggYSBwYXNzcGhyYXNlLiBZb3UgYXJlIHByb21wdGVkCi0gICB3aGV0aGVyIHlvdSB3YW50IHRvIGRvIHRoaXMgb3Igbm90IHdoZW4gdGhlIGtleSBpcyBmaXJzdCBjcmVhdGVkIHVuZGVyCi0gICAiLXNzbCBTQVZFIiBtb2RlICgiUHJvdGVjdCBrZXkgd2l0aCBhIHBhc3NwaHJhc2U/IHkvbiIpLiBJdCBpcwotICAgc3VnZ2VzdGVkIHRoYXQgeW91IHVzZSBhIHBhc3NwaHJhc2UuIFRoZSBpbmNvbnZlbmllbmNlIGlzIGV2ZXJ5IHRpbWUKLSAgIHlvdSBydW4gIngxMXZuYyAtc3NsIFNBVkUgLi4uIiB5b3Ugd2lsbCBuZWVkIHRvIHN1cHBseSB0aGUgcGFzc3BocmFzZQotICAgdG8gYWNjZXNzIHRoZSBwcml2YXRlIGtleToKLSAgMDYvMDQvMjAwNiAxMTozOToxMSB1c2luZyBQRU0gL2hvbWUvcnVuZ2UvLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtICAwLjAwMHMKLQotICBBIHBhc3NwaHJhc2UgaXMgbmVlZGVkIHRvIHVubG9jayBhbiBPcGVuU1NMIHByaXZhdGUga2V5IChQRU0gZmlsZSkuCi0gIEVudGVyIHBhc3NwaHJhc2U+Ci0KLSAgIGJlZm9yZSB4MTF2bmMgY2FuIGNvbnRpbnVlLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEJlaW5nIHlvdXIgb3duIENlcnRpZmljYXRlIEF1dGhvcml0eToKLQotICAgQSB2ZXJ5IHNvcGhpc3RpY2F0ZWQgd2F5IHRoYXQgc2NhbGVzIHdlbGwgaWYgdGhlIG51bWJlciBvZiB1c2VycyBpcwotICAgbGFyZ2UgaXMgdG8gdXNlIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgd2hvc2UgcHVibGljIGNlcnRpZmljYXRlCi0gICBpcyBhdmFpbGFibGUgdG8gYWxsIG9mIHRoZSBWTkMgY2xpZW50cyBhbmQgd2hvc2UgcHJpdmF0ZSBrZXkgaGFzIGJlZW4KLSAgIHVzZWQgdG8gZGlnaXRhbGx5IHNpZ24gdGhlIHgxMXZuYyBzZXJ2ZXIgY2VydGlmaWNhdGUocykuCi0KLSAgIFRoZSBpZGVhIGlzIGFzIGZvbGxvd3M6Ci0gICAgICogQSBzcGVjaWFsIENBIGNlcnQgYW5kIGtleSBpcyBnZW5lcmF0ZWQuCi0gICAgICogSXRzIHByaXZhdGUga2V5IGlzIGFsd2F5cyBwcm90ZWN0ZWQgYnkgYSBnb29kIHBhc3NwaHJhc2Ugc2luY2UgaXQKLSAgICAgICBpcyBvbmx5IHVzZWQgZm9yIHNpZ25pbmcuCi0gICAgICogVGhlIENBIGNlcnQgaXMgKHNhZmVseSkgZGlzdHJpYnV0ZWQgdG8gYWxsIG1hY2hpbmVzIHdoZXJlIFZOQwotICAgICAgIGNsaWVudHMgd2lsbCBydW4uCi0gICAgICogT25lIG9yIG1vcmUgeDExdm5jIHNlcnZlciBjZXJ0cyBhbmQga2V5cyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIFRoZSB4MTF2bmMgc2VydmVyIGNlcnQgaXMgc2lnbmVkIHdpdGggdGhlIENBIHByaXZhdGUga2V5LgotICAgICAqIHgxMXZuYyBpcyBydW4gdXNpbmcgdGhlIHNlcnZlciBrZXkuIChlLmcuICItc3NsIFNBVkUiKQotICAgICAqIFZOQyBjbGllbnRzICh2aWV3ZXJzKSBjYW4gbm93IGF1dGhlbnRpY2F0ZSB0aGUgeDExdm5jIHNlcnZlcgotICAgICAgIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBDQSBjZXJ0aWZpY2F0ZS4KLQotICAgVGhlIGFkdmFudGFnZSBpcyB0aGUgQ0EgY2VydCBvbmx5IG5lZWRzIHRvIGJlIGRpc3RyaWJ1dGVkIG9uY2UgdG8gdGhlCi0gICB2YXJpb3VzIG1hY2hpbmVzLCB0aGF0IGNhbiBiZSBkb25lIGV2ZW4gYmVmb3JlIHgxMXZuYyBzZXJ2ZXIgY2VydHMgYXJlCi0gICBnZW5lcmF0ZWQuCi0KLSAgIEFzIGFib3ZlLCBpdCBpcyBpbXBvcnRhbnQgdGhlIENBIHByaXZhdGUga2V5IGFuZCB0aGUgeDExdm5jIHNlcnZlciBrZXkKLSAgIGFyZSBrZXB0IHNlY3JldCwgb3RoZXJ3aXNlIHNvbWVvbmUgY291bGQgc3RlYWwgdGhlbSBhbmQgcHJldGVuZCB0byBiZQotICAgdGhlIENBIG9yIHRoZSB4MTF2bmMgc2VydmVyIGlmIHRoZXkgY29waWVkIHRoZSBrZXkuIEl0IGlzIHJlY29tbWVuZGVkCi0gICB0aGF0IHRoZSB4MTF2bmMgc2VydmVyIGtleXMgYXJlIGFsc28gcHJvdGVjdGVkIHZpYSBhIHBhc3NwaHJhc2UgKHNlZQotICAgdGhlIHByZXZpb3VzIHNlY3Rpb24pLgotCi0gICBPcHRpb25hbGx5LCBWTkMgdmlld2VyIGNlcnRzIGFuZCBrZXlzIGNvdWxkIGFsc28gYmUgZ2VuZXJhdGVkIHRvCi0gICBlbmFibGUgdGhlIHgxMXZuYyBzZXJ2ZXIgdG8gYXV0aGVudGljYXRlIGVhY2ggY2xpZW50LiBUaGlzIGlzIG5vdAotICAgbm9ybWFsbHkgZG9uZSAodXN1YWxseSBhIHNpbXBsZSB2aWV3ZXIgcGFzc3dvcmQgc2NoZW1lIGlzIHVzZWQpLCBidXQKLSAgIHRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBzb21lIHNpdHVhdGlvbnMuIFRoZXNlIG9wdGlvbmFsIHN0ZXBzIGdvIGxpa2UKLSAgIHRoaXM6Ci0gICAgICogT25lIG9yIG1vcmUgVk5DIGNsaWVudCBjZXJ0cyBhbmQga2V5cyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIFRoZXNlIFZOQyBjbGllbnQgY2VydHMgYXJlIHNpZ25lZCB3aXRoIHRoZSBDQSBwcml2YXRlIGtleS4KLSAgICAgKiBUaGUgVk5DIGNsaWVudCBjZXJ0cytrZXlzIGFyZSBzYWZlbHkgZGlzdHJpYnV0ZWQgdG8gdGhlCi0gICAgICAgY29ycmVzcG9uZGluZyBjbGllbnQgbWFjaGluZXMuCi0gICAgICogeDExdm5jIGlzIHRvbGQgdG8gdmVyaWZ5IGNsaWVudHMgYnkgdXNpbmcgdGhlIENBIGNlcnQuIChlLmcuCi0gICAgICAgIi1zc2x2ZXJpZnkgQ0EiKQotICAgICAqIFdoZW4gVk5DIGNsaWVudHMgKHZpZXdlcnMpIGNvbm5lY3QsIHRoZXkgbXVzdCBhdXRoZW50aWNhdGUKLSAgICAgICB0aGVtc2VsdmVzIHRvIHgxMXZuYyBieSB1c2luZyB0aGVpciBjbGllbnQga2V5LgotCi0gICBBZ2FpbiwgaXQgaXMgYSBnb29kIGlkZWEgaWYgdGhlIGNsaWVudCBwcml2YXRlIGtleXMgYXJlIHByb3RlY3RlZCB3aXRoCi0gICBhIHBhc3NwaHJhc2UsIG90aGVyd2lzZSBpZiBzdG9sZW4gdGhleSBjb3VsZCBiZSB1c2VkIHRvIGdhaW4gYWNjZXNzIHRvCi0gICB0aGUgeDExdm5jIHNlcnZlci4gT25jZSBkaXN0cmlidXRlZCB0byB0aGUgY2xpZW50IG1hY2hpbmVzLCB0aGVyZSBpcwotICAgbm8gbmVlZCB0byBrZWVwIHRoZSBjbGllbnQga2V5IG9uIHRoZSBDQSBtYWNoaW5lIHRoYXQgZ2VuZXJhdGVkIGFuZAotICAgc2lnbmVkIGl0LiBZb3UgY2FuIGtlZXAgdGhlIGNsaWVudCBjZXJ0cyBpZiB5b3UgbGlrZSBiZWNhdXNlIHRoZXkgYXJlCi0gICBwdWJsaWMuCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgSG93IHRvIGRvIHRoZSBhYm92ZSBDQSBzdGVwcyB3aXRoIHgxMXZuYzoKLQotICAgU29tZSB1dGlsaXR5IGNvbW1hbmRzIGFyZSBwcm92aWRlZCB0byBlYXNlIHRoZSBjZXJ0K2tleSBjcmVhdGlvbiwKLSAgIHNpZ25pbmcsIGFuZCBtYW5hZ2VtZW50OiAtc3NsR2VuQ0EsIC1zc2xHZW5DZXJ0LCAtc3NsRGVsQ2VydCwKLSAgIC1zc2xFbmNLZXksIC1zc2xDZXJ0SW5mby4gVGhleSBiYXNpY2FsbHkgcnVuIHRoZSBvcGVuc3NsKDEpIGNvbW1hbmQKLSAgIGZvciB5b3UgdG8gbWFuYWdlIHRoZSBjZXJ0cy9rZXlzLiBJdCBpcyByZXF1aXJlZCB0aGF0IG9wZW5zc2woMSkgaXMKLSAgIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBhbmQgYXZhaWxhYmxlIGluIFBBVEguIEFsbCBjb21tYW5kcyBjYW4gYmUKLSAgIHBvaW50ZWQgdG8gYW4gYWx0ZXJuYXRlIHRvcGxldmVsIGNlcnRpZmljYXRlIGRpcmVjdG9yeSB2aWEgdGhlIC1zc2xkaXIKLSAgIG9wdGlvbiBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgfi8udm5jL2NlcnRzLgotCi0gICAxKSBUbyBnZW5lcmF0ZSB5b3VyIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGNlcnQgYW5kIGtleSBydW4gdGhpczoKLSAgeDExdm5jIC1zc2xHZW5DQQotCi0gICBGb2xsb3cgdGhlIHByb21wdHMsIHlvdSBjYW4gbW9kaWZ5IGFueSBpbmZvcm1hdGlvbmFsIHN0cmluZ3MgeW91IGNhcmUKLSAgIHRvLiBZb3Ugd2lsbCBhbHNvIGJlIHJlcXVpcmVkIHRvIGVuY3J5cHQgdGhlIENBIHByaXZhdGUga2V5IHdpdGggYQotICAgcGFzc3BocmFzZS4gVGhpcyBnZW5lcmF0ZXMgdGhlc2UgZmlsZXM6Ci0gIH4vLnZuYy9jZXJ0cy9DQS9jYWNlcnQucGVtICAgICAgICAgICAgICh0aGUgQ0EgcHVibGljIGNlcnRpZmljYXRlKQotICB+Ly52bmMvY2VydHMvQ0EvcHJpdmF0ZS9jYWtleS5wZW0gICAgICAodGhlIGVuY3J5cHRlZCBDQSBwcml2YXRlIGtleSkKLQotICAgSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1c2UgLXNzbGRpciBJdCBtdXN0IHN1cHBsaWVkCi0gICB3aXRoIGFsbCBzdWJzZXF1ZW50IFNTTCB1dGlsaXR5IG9wdGlvbnMgdG8gcG9pbnQgdGhlbSB0byB0aGUgY29ycmVjdAotICAgZGlyZWN0b3J5LgotCi0gICAyKSBUbyBnZW5lcmF0ZSBhIHNpZ25lZCB4MTF2bmMgc2VydmVyIGNlcnQgYW5kIGtleSBydW4gdGhpczoKLSAgeDExdm5jIC1zc2xHZW5DZXJ0IHNlcnZlcgotCi0gICBBcyB3aXRoIHRoZSBDQSBnZW5lcmF0aW9uLCBmb2xsb3cgdGhlIHByb21wdHMgYW5kIHlvdSBjYW4gbW9kaWZ5IGFueQotICAgaW5mb3JtYXRpb25hbCBzdHJpbmdzIHRoYXQgeW91IGNhcmUgdG8uIFRoaXMgd2lsbCBjcmVhdGUgdGhlIGZpbGVzOgotICB+Ly52bmMvY2VydHMvc2VydmVyLmNydCAgICAgICAgICAgICAodGhlIHNlcnZlciBwdWJsaWMgY2VydGlmaWNhdGUpCi0gIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtICAgICAgICAgICAgICh0aGUgc2VydmVyIHByaXZhdGUga2V5ICsgcHVibGljIGNlcnQpCi0KLSAgIEl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIHNlcnZlciBwcml2YXRlIGtleSB3aXRoIGEgcGFzc3BocmFzZQotICAgKHlvdSB3aWxsIGJlIHByb21wdGVkIHdoZXRoZXIgeW91IHdhbnQgdG8pLiBZb3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUKLSAgIGl0IHdoZW5ldmVyIHlvdSBzdGFydCB4MTF2bmMgdXNpbmcgdGhpcyBrZXkuCi0KLSAgIDMpIFN0YXJ0IHVwIHgxMXZuYyB1c2luZyB0aGlzIHNlcnZlciBrZXk6Ci0gIHgxMXZuYyAtc3NsIFNBVkUgLWRpc3BsYXkgOjAgLi4uCi0KLSAgIChTQVZFIGNvcnJlc3BvbmRzIHRvIHNlcnZlci5wZW0sIHNlZSAtc3NsR2VuQ2VydCBzZXJ2ZXIgc29tZW5hbWUgaW5mbwotICAgb24gY3JlYXRpbmcgYWRkaXRpb25hbCBzZXJ2ZXIga2V5cywgc2VydmVyLXNvbWVuYW1lLmNydCAuLi4pCi0KLSAgIDQpIE5leHQsIHNhZmVseSBjb3B5IHRoZSBDQSBjZXJ0aWZpY2F0ZSB0byB0aGUgVk5DIHZpZXdlciAoY2xpZW50KQotICAgbWFjaGluZShzKS4gUGVyaGFwczoKLSAgc2NwIH4vLnZuYy9DQS9jYWNlcnQucGVtIGNsaWVudG1hY2hpbmU6LgotCi0gICA1KSBUaGVuIHRoZSB0cmlja3kgcGFydCwgbWFrZSBpdCBzbyB0aGUgU1NMIFZOQyBWaWV3ZXIgdXNlcyB0aGlzCi0gICBjZXJ0aWZpY2F0ZSEgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdGhpcyBtaWdodCBiZSBkb25lLCBpdCBkZXBlbmRzCi0gICBvbiB3aGF0IHlvdXIgY2xpZW50IGFuZC9vciBTU0wgdHVubmVsIGlzLiBTb21lIGV4YW1wbGVzOgotCi0gICBGb3IgdGhlIFNTTCBKYXZhIFZOQyB2aWV3ZXIgc3VwcGxpZWQgd2l0aCB4MTF2bmMgaW4KLSAgIGNsYXNzZXMvc3NsL1ZuY1ZpZXdlci5qYXIgb3IgY2xhc3Nlcy9zc2wvU2lnbmVkVm5jVmlld2VyLmphcjoKLSAgICAgKiBJbXBvcnQgdGhlIGNhY2VydC5wZW0gY2VydCBpbnRvIHlvdXIgV2ViIEJyb3dzZXIgKGUuZy4gRWRpdCAtPgotICAgICAgIFByZWZlcmVuY2VzIC0+IFByaXZhY3kgJiBTZWN1cml0eSAtPiBNYW5hZ2UgQ2VydGlmaWNhdGVzIC0+Ci0gICAgICAgV2ViU2l0ZXMgLT4gSW1wb3J0KQotICAgICAqIE9yIEltcG9ydCB0aGUgY2FjZXJ0LnBlbSBjZXJ0IGludG8geW91ciBKYXZhIFBsdWdpbiAoZS5nLiBydW4KLSAgICAgICBDb250cm9sUGFuZWwsIHRoZW4gU2VjdXJpdHkgLT4gQ2VydGlmaWNhdGVzIC0+IFNlY3VyZSBTaXRlIC0+Ci0gICAgICAgSW1wb3J0KQotCi0gICBXaGVuIGltcG9ydGluZywgb25lIHdvdWxkIGdpdmUgdGhlIGJyb3dzZXIvamF2YS1wbHVnaW4gdGhlIHBhdGggdG8gdGhlCi0gICBjb3BpZWQgY2FjZXJ0LnBlbSBmaWxlIGluIHNvbWUgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIFdlYiBicm93c2VyIG9yCi0gICBKYXZhIHBsdWdpbiBpcyB1c2VkIGZvciB0aGUgc2VydmVyIGF1dGhlbnRpY2F0aW9uLiBJZiB0aGUgdXNlciBnZXRzIGEKLSAgICJTaXRlIG5vdCB2ZXJpZmllZCIgbWVzc2FnZSB3aGlsZSBjb25uZWN0aW5nIGhlIHNob3VsZCBpbnZlc3RpZ2F0ZQotICAgZnVydGhlci4KLQotICAgRm9yIHRoZSB1c2Ugb2Ygc3R1bm5lbCAoZS5nLiBvbiBXaW5kb3dzKSBvbmUgd291bGQgYWRkIHRoaXMgdG8gdGhlCi0gICBzdHVubmVsLmNvbmY6Ci0gICMgc3R1bm5lbC5jb25mOgotICBjbGllbnQgPSB5ZXMKLSAgb3B0aW9ucyA9IEFMTAotICBDQWZpbGUgPSAvcGF0aC90by9jYWNlcnQucGVtICAgICAgICAgICMgb3IgbWF5YmUgQzpccGF0aFx0b1xjYWNlcnQucGVtCi0gIFtteXZuY3NzbF0KLSAgYWNjZXB0ID0gNTkwMQotICBjb25uZWN0ID0gZmFyLWF3YXkuZWFzdDo1OTAwCi0KLSAgICh0aGVuIHBvaW50IHRoZSBWTkMgdmlld2VyIHRvIGxvY2FsaG9zdDoxKS4KLQotICAgSGVyZSBpcyBhbiBleGFtcGxlIGZvciB0aGUgVW5peCBzdHVubmVsIHdyYXBwZXIgc2NyaXB0IHNzX3ZuY3ZpZXdlciBpbgotICAgb3VyIFNTVk5DIHBhY2thZ2U6Ci0gIHNzX3ZuY3ZpZXdlciAtdmVyaWZ5IC4vY2FjZXJ0LnBlbSBmYXItYXdheS5lYXN0OjAKLQotICAgT3VyIFNTVk5DIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciBHVUkgY2FuIGFsc28gdXNlIHRoZSBjZXJ0aWZpY2F0ZQotICAgZmlsZSBmb3Igc2VydmVyIGF1dGhlbnRpY2F0aW9uLiBZb3UgY2FuIGxvYWQgaXQgdmlhIHRoZSBTU1ZOQwotICAgJ0NlcnRzLi4uJyBkaWFsb2cgYW5kIHNldCAnU2VydmVyQ2VydCcgdG8gdGhlIGNhY2VydC5wZW0gZmlsZSB5b3UKLSAgIHNhZmVseSBjb3BpZWQgdGhlcmUuCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgVHJpY2tzIGZvciBzZXJ2ZXIga2V5czoKLQotICAgVG8gY3JlYXRlIGFkZGl0aW9uYWwgeDExdm5jIHNlcnZlciBrZXlzIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgbXlvdGhlcmtleQotCi0gICBhbmQgdXNlIGl0IHRoaXMgd2F5OgotICB4MTF2bmMgLXNzbCBTQVZFLW15b3RoZXJrZXkgLi4uCi0KLSAgIFRoZSBmaWxlcyB3aWxsIGJlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItbXlvdGhlcmtleS57Y3J0LHBlbX0KLQotICAgWW91IGNhbiBhbHNvIGNyZWF0ZSBhIHNlbGYtc2lnbmVkIHNlcnZlciBrZXk6Ci0gIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjp0aGlyZF9rZXkKLQotICAgYW5kIHVzZSBpdCB0aGlzIHdheToKLSAgeDExdm5jIC1zc2wgU0FWRS1zZWxmOnRoaXJkX2tleSAuLi4KLQotICAgVGhpcyBrZXkgaXMgbm90IHNpZ25lZCBieSB5b3VyIENBLiBUaGlzIGNhbiBiZSBoYW5keSB0byBoYXZlIGEga2V5IHNldAotICAgc2VwYXJhdGUgZnJvbSB5b3VyIENBIHdoZW4geW91IGRvIG5vdCB3YW50IHRvIGNyZWF0ZSBhIDJuZCBDQQotICAgY2VydCtrZXkuCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgVXNpbmcgZXh0ZXJuYWwgQ0EnczoKLQotICAgWW91IGRvbid0IGhhdmUgdG8gdXNlIHlvdXIgb3duIENBIGNlcnQra2V5LCB5b3UgY2FuIHVzZSBhIHRoaXJkCi0gICBwYXJ0eSdzIGluc3RlYWQuIFBlcmhhcHMgeW91IGhhdmUgYSBjb21wYW55LXdpZGUgQ0Egb3IgeW91IGNhbiBldmVuCi0gICBoYXZlIHlvdXIgeDExdm5jIGNlcnRpZmljYXRlIHNpZ25lZCBieSBhIHByb2Zlc3Npb25hbCBDQSAoZS5nLgotICAgd3d3LnRoYXd0ZS5jb20gb3Igd3d3LnZlcmlzaWduLmNvbSBvciBwZXJoYXBzIHRoZSBmcmVlIGNlcnRpZmljYXRlCi0gICBzZXJ2aWNlIHd3dy5zdGFydGNvbS5vcmcgb3Igd3d3LmNhY2VydC5vcmcpLgotCi0gICBUaGUgYWR2YW50YWdlIHRvIGRvaW5nIHRoaXMgaXMgdGhhdCB0aGUgVk5DIGNsaWVudCBtYWNoaW5lcyB3aWxsCi0gICBhbHJlYWR5IGhhdmUgdGhlIENBIGNlcnRpZmljYXRlcyBpbnN0YWxsZWQgYW5kIHlvdSBkb24ndCBoYXZlIHRvCi0gICBpbnN0YWxsIGl0IG9uIGVhY2ggbWFjaGluZS4KLQotICAgVG8gZ2VuZXJhdGUgYW4geDExdm5jIHNlcnZlciBjZXJ0K2tleSB0aGlzIHdheSB5b3Ugc2hvdWxkIGdlbmVyYXRlIGEKLSAgICJyZXF1ZXN0IiBmb3IgYSBjZXJ0aWNhdGUgc2lnbmluZyBzb21ldGhpbmcgbGlrZSB0aGlzICh3ZSB1c2UgdGhlIG5hbWUKLSAgICJleHRlcm5hbCIgaW4gdGhpcyBleGFtcGxlLCBpdCBjb3VsZCBiZSBhbnl0aGluZyB5b3Ugd2FudCk6Ci0gIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgcmVxOmV4dGVybmFsCi0KLSAgIFRoaXMgd2lsbCBjcmVhdGUgdGhlIHJlcXVlc3QgZmlsZToKLSAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwucmVxCi0KLSAgIFdoaWNoIHlvdSBzaG91bGQgc2VuZCB0byB0aGUgZXh0ZXJuYWwgQ0EuIFdoZW4geW91IGdldCB0aGUgc2lnbmVkCi0gICBjZXJ0aWZpY2F0ZSBiYWNrIGZyb20gdGhlbSwgc2F2ZSBpdCBpbiB0aGUgZmlsZToKLSAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0Ci0KLSAgIGFuZCBjcmVhdGUgdGhlIC5wZW0gdGhpcyB3YXk6Ci0gIG12ICB+Ly52bmMvY2VydHMvc2VydmVyLXJlcTpleHRlcm5hbC5rZXkgICAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuCi1wZW0KLSAgY2htb2QgNjAwIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItcmVxOmV4dGVybmFsLnBlbQotICBjYXQgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0ID4+IH4vLnZuYy9jZXJ0cy9zZXJ2ZXItcmVxOmV4dGVybmFsLgotcGVtCi0KLSAgIFlvdSBhbHNvIHJlbmFtZSB0aGUgdHdvIGZpbGVzICguY3J0IGFuZCAucGVtKSB0byBoYXZlIGEgc2hvcnRlcgotICAgYmFzZW5hbWUgaWYgeW91IGxpa2UuIEUuZy46Ci0gIG12ICB+Ly52bmMvY2VydHMvc2VydmVyLXJlcTpleHRlcm5hbC5wZW0gIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItZXh0LnBlbQotICBtdiAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0ICB+Ly52bmMvY2VydHMvc2VydmVyLWV4dC5jcnQKLQotICAgYW5kIHRoZSB1c2UgdmlhICJ4MTF2bmMgLXNzbCBTQVZFLWV4dCAuLi4iLCBldGMuCi0KLSAgIE9uIHRoZSB2aWV3ZXIgc2lkZSBtYWtlIHN1cmUgdGhlIGV4dGVybmFsIENBJ3MgY2VydGlmaWNhdGUgaXMKLSAgIGluc3RhbGxlZCBhbiBhdmFpbGFibGUgZm9yIHRoZSBWTkMgdmlld2VyIHNvZnR3YXJlIHlvdSBwbGFuIHRvIHVzZS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBVc2luZyBDbGllbnQgS2V5cyBmb3IgQXV0aGVudGljYXRpb246Ci0KLSAgIFlvdSBjYW4gb3B0aW9uYWxseSBjcmVhdGUgY2VydHMra2V5cyBmb3IgeW91ciBWTkMgY2xpZW50IG1hY2hpbmVzIGFzCi0gICB3ZWxsLiBBZnRlciBkaXN0cmlidXRpbmcgdGhlbSB0byB0aGUgY2xpZW50IG1hY2hpbmVzIHlvdSBjYW4gaGF2ZQotICAgeDExdm5jIHZlcmlmeSB0aGUgY2xpZW50cyB1c2luZyBTU0wuIEhlcmUgaXMgaG93IHRvIGRvIHRoaXM6Ci0KLSAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCBkaWxiZXJ0Ci0gIHgxMXZuYyAtc3NsR2VuQ2VydCBjbGllbnQgd2FsbHkKLSAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCBhbGljZQotICAuLi4KLQotICAgQXMgdXN1YWwsIGZvbGxvdyB0aGUgcHJvbXB0cyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgYW55IG9mIHRoZSBpbmZvCi0gICBmaWVsZCB2YWx1ZXMuIEFzIGFsd2F5cywgaXQgaXMgYSBnb29kIGlkZWEgKGFsdGhvdWdoIGluY29udmVuaWVudCkgdG8KLSAgIHByb3RlY3QgdGhlIHByaXZhdGUga2V5cyB3aXRoIGEgcGFzc3BocmFzZS4gVGhlc2UgZmlsZXMgYXJlIGNyZWF0ZWQ6Ci0gIH4vLnZuYy9jZXJ0cy9jbGllbnRzL2RpbGJlcnQuY3J0Ci0gIH4vLnZuYy9jZXJ0cy9jbGllbnRzL2RpbGJlcnQucGVtCi0gIC4uLgotCi0gICBOb3RlIHRoYXQgdGhlc2UgYXJlIGtlcHQgaW4gYSBjbGllbnRzIHN1YmRpcmVjdG9yeS4KLQotICAgTmV4dCwgc2FmZWx5IGNvcHkgdGhlIC5wZW0gZmlsZXMgdG8gZWFjaCBjb3JyZXNwb25kaW5nIGNsaWVudCBtYWNoaW5lCi0gICBhbmQgaW5jb3Jwb3JhdGUgdGhlbSBpbnRvIHRoZSBWTkMgdmlld2VyIC8gU1NMIHNvZnR3YXJlIChzZWUgdGhlIGlkZWFzCi0gICBtZW50aW9uZWQgYWJvdmUgZm9yIHRoZSBDQSBhbmQgc2VydmVyIGtleXMpLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCi0gICB0aGVzZSBjZXJ0aWZpY2F0ZXMgbWlnaHQgYmUgcmVmZXJyZWQgdG8gYXMgIk15IENlcnRpZmljYXRlcyIgb3IKLSAgICJDbGllbnQgQ2VydGlmaWNhdGVzIi4gVGhleSBhcmUgdXNlZCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uICh3aGljaAotICAgaXMgcmVsYXRpdmVseSByYXJlIGZvciBTU0wpLgotCi0gICBBZnRlciBjb3B5aW5nIHRoZW0geW91IGNhbiBkZWxldGUgdGhlIGNsaWVudHMvKi5wZW0gZmlsZXMgZm9yIGV4dHJhCi0gICBzYWZldHkgYmVjYXVzZSB0aGUgcHJpdmF0ZSBrZXlzIGFyZSBub3QgbmVlZGVkIGJ5IHRoZSB4MTF2bmMgc2VydmVyLgotICAgWW91IGRvbid0IHJlYWxseSBuZWVkIHRoZSBjbGllbnRzLyouY3J0IGZpbGVzIGVpdGhlciAoYmVjYXVzZSB0aGV5Ci0gICBoYXZlIGJlZW4gc2lnbmVkIGJ5IHRoZSBDQSkuIEJ1dCB0aGV5IGNvdWxkIGNvbWUgaW4gaGFuZHkgZm9yIHRyYWNraW5nCi0gICBvciB0cm91Ymxlc2hvb3RpbmcsIGV0Yy4KLQotICAgTm93IHN0YXJ0IHVwIHgxMXZuYyBhbmQgaW5zdHJ1Y3QgaXQgdG8gdmVyaWZ5IGNvbm5lY3RpbmcgY2xpZW50cyB2aWEKLSAgIFNTTCBhbmQgdGhlIENBIGNlcnQ6Ci0gIHgxMXZuYyAtc3NsIFNBVkUgLXNzbHZlcmlmeSBDQQotCi0gICBUaGUgIkNBIiBzcGVjaWFsIHRva2VuIGluc3RydWN0cyB4MTF2bmMgdG8gdXNlIGl0cyBDQSBzaWduZWQgY2VydHMgZm9yCi0gICB2ZXJpZmljYXRpb24uCi0KLSAgIEZvciBhcmJpdHJhcnkgc2VsZi1zaWduZWQgY2xpZW50IGNlcnRpZmljYXRlcyAobm8gQ0EpIGl0IG1pZ2h0IGJlCi0gICBzb21ldGhpbmcgbGlrZSB0aGlzOgotICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgcGF0aC90by9jbGllbnQuY3J0Ci0gIHgxMXZuYyAtc3NsIFNBVkUgLXNzbHZlcmlmeSBwYXRoL3RvL2NsaWVudC1oYXNoLWRpcgotICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgcGF0aC90by9jZXJ0cy50eHQKLQotICAgV2hlcmUgY2xpZW50LmNydCB3b3VsZCBiZSBhbiBpbmRpdmlkdWFsIGNsaWVudCBjZXJ0aWZpY2F0ZTsKLSAgIGNsaWVudC1oYXNoLWRpciBhIGRpcmVjdG9yeSBvZiBmaWxlIG5hbWVzIGJhc2VkIG9uIG1kNSBoYXNoZXMgb2YgdGhlCi0gICBjZXJ0cyAoc2VlIC1zc2x2ZXJpZnkpOyBhbmQgY2VydHMudHh0IHNpZ25pZmllcyBhIHNpbmdsZSBmaWxlIGZ1bGwgb2YKLSAgIGNsaWVudCBjZXJ0aWZpY2F0ZXMuCi0KLSAgIEZpbmFsbHksIGNvbm5lY3Qgd2l0aCB5b3VyIFZOQyB2aWV3ZXIgdXNpbmcgdGhlIGtleS4gSGVyZSBpcyBhbgotICAgZXhhbXBsZSBmb3IgdGhlIFVuaXggc3R1bm5lbCB3cmFwcGVyIHNjcmlwdCBzc192bmN2aWV3ZXI6IHVzaW5nIGNsaWVudAotICAgYXV0aGVudGljYXRpb24gKGFuZCB0aGUgc3RhbmRhcmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIENBCi0gICBjZXJ0KToKLSAgc3Nfdm5jdmlld2VyIC1teWNlcnQgLi9kaWxiZXJ0LnBlbSAtdmVyaWZ5IC4vY2FjZXJ0LnBlbSBmYXItYXdheS5lYXN0OjAKLQotICAgT3VyIFNTVk5DIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciBjYW4gYWxzbyB1c2UgdGhlc2Ugb3BlbnNzbCAucGVtCi0gICBmaWxlcyAoeW91IGNhbiBsb2FkIHRoZW0gdmlhIENlcnRzLi4uIC0+IE15Q2VydCBkaWFsb2cpLgotCi0gICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSAtc3NsdmVyaWZ5IG9uIGEgcGVyLWNsaWVudCBrZXkgYmFzaXMsIGFuZAotICAgYWxzbyB1c2luZyBzZWxmLXNpZ25lZCBjbGllbnQga2V5cyAoeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudAotICAgc2VsZjpkaWxiZXJ0KQotCi0gICBOb3cgYSB0cmlja3kgcGFydCBpcyB0byBnZXQgV2ViIGJyb3dzZXJzIG9yIEphdmEgUnVudGltZSB0byBpbXBvcnQgYW5kCi0gICB1c2UgdGhlIG9wZW5zc2wgLnBlbSBjZXJ0K2tleSBmaWxlcy4gU2VlIHRoZSBuZXh0IHBhcmFncmFwaCBvbiBob3cgdG8KLSAgIGNvbnZlcnQgdGhlbSB0byBwa2NzMTIgZm9ybWF0LiBJZiB5b3UgZmluZCBhIHJvYnVzdCB3YXkgdG8gaW1wb3J0IHRoZW0KLSAgIGFuZCBhbmQgZ2V0IHRoZW0gdG8gdXNlIHRoZSBjZXJ0IHBsZWFzZSBsZXQgdXMga25vdyEKLQotICAgSGVyZSBpcyBob3cgdG8gY29udmVydCBvdXIgb3BlbnNzbCBjcnQvcGVtIGZpbGVzIHRvIHBrY3MxMiBmb3JtYXQKLSAgIChjb250YWlucyBib3RoIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgYW5kIGtleSkgdGhhdCBjYW4gYmUgcmVhZCBieSBXZWIKLSAgIGJyb3dzZXJzIGFuZCBKYXZhIGZvciB1c2UgaW4gY2xpZW50IGF1dGhlbnRpY2F0aW9uOgotICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1pbiBteWNlcnQuY3J0IC1pbmtleSBteWNlcnQucGVtIC1vdXQgbXljZXJ0LnAxMgotCi0gICBpdCB3aWxsIGFzayBmb3IgYSBwYXNzcGhyYXNlIHRvIHByb3RlY3QgbXljZXJ0LnAxMi4gU29tZSBzb2Z0d2FyZQotICAgKGUuZy4gSmF2YSBDb250cm9sUGFuZWwpIG1heSByZXF1aXJlIGEgbm9uLWVtcHR5IHBhc3NwaHJhc2UuIEFjdHVhbGx5LAotICAgc2luY2Ugb3VyIC5wZW0gY29udGFpbnMgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5LCB5b3UKLSAgIGNvdWxkIGp1c3Qgc3VwcGx5IGl0IGZvciB0aGUgLWluIGFuZCByZW1vdmUgdGhlIC1pbmtleSBvcHRpb24uIEl0Ci0gICBhcHBlYXJzIHRoYXQgZm9yIGNlcnRpZmljYXRlcyBvbmx5IGltcG9ydGluZywgb3VyIC5jcnQgZmlsZSBpcwotICAgc3VmZmljaWVudCBhbmQgY2FuIGJlIHJlYWQgYnkgTW96aWxsYS9GaXJlZm94IGFuZCBKYXZhLi4uCi0KLSAgIElmIHlvdSBoYXZlIHRyb3VibGUgZ2V0dGluZyB5b3VyIEphdmEgUnVudGltZSB0byBpbXBvcnQgYW5kIHVzZSB0aGUKLSAgIGNlcnQra2V5LCB0aGVyZSBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBTU0wtZW5hYmxlZCBKYXZhIGFwcGxldC4gT24KLSAgIHRoZSBXZWIgYnJvd3NlciBVUkwgdGhhdCByZXRyaWV2ZXMgdGhlIFZOQyBhcHBsZXQsIHNpbXBseSBhZGQgYQotICAgIi8/b25lVGltZUtleT0uLi4iIGFwcGxldCBwYXJhbWV0ZXIgKHNlZSBzc2wtcG9ydGFsIGZvciBtb3JlIGRldGFpbHMKLSAgIG9uIGFwcGxldCBwYXJhbWV0ZXJzOyB5b3UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgZnVsbCBwb3J0YWwgc2V0dXAKLSAgIHRob3VnaCkuIFRoZSB2YWx1ZSBvZiB0aGUgb25lVGltZUtleSB3aWxsIGJlIHRoZSB2ZXJ5IGxvbmcgc3RyaW5nIHRoYXQKLSAgIGlzIG91dHB1dCBvZiB0aGUgb25ldGltZWtleSBwcm9ncmFtIGZvdW5kIGluIHRoZSBjbGFzc2VzL3NzbCB4MTF2bmMKLSAgIGRpcmVjdG9yeS4gT3IgeW91IGNhbiBzZXQgb25lVGltZUtleT1QUk9NUFQgaW4gd2hpY2ggY2FzZSB0aGUgYXBwbGV0Ci0gICB3aWxsIGFzayB5b3UgdG8gcGFzdGUgaW4gdGhlIGxvbmcgc3RyaW5nLiBUaGVzZSBzY2hlbWUgaXMgcHJldHR5IHVnbHksCi0gICBidXQgaXQgd29ya3MuIEEgbmljZSBhcHBsaWNhdGlvbiBvZiBpdCBpcyB0byBtYWtlIG9uZSB0aW1lIGtleXMgZm9yCi0gICB1c2VycyB0aGF0IGhhdmUgYWxyZWFkeSBsb2dnZWQgaW50byBhIHNlY3VyZSBIVFRQUyBzaXRlIHZpYSBwYXNzd29yZC4KLSAgIEEgY2dpIHByb2dyYW0gdGhlbiBtYWtlcyBhIG9uZSB0aW1lIGtleSBmb3IgdGhlIGxvZ2dlZCBpbiB1c2VyIHRvIHVzZToKLSAgIGl0IGlzIHBhc3NlZCBiYWNrIG92ZXIgSFRUUFMgYXMgdGhlIGFwcGxldCBwYXJhbWV0ZXIgaW4gdGhlIFVSTCBhbmQgc28KLSAgIGNhbm5vdCBiZSBzbmlmZmVkLiB4MTF2bmMgaXMgcnVuIHRvIHVzZSB0aGF0IGtleSB2aWEgLXNzbHZlcmlmeS4KLQotICAgVXBkYXRlOiBhcyBvZiBBcHIgMjAwNyBpbiB0aGUgMC45LjEgeDExdm5jIHRhcmJhbGwgdGhlcmUgaXMgYSBuZXcKLSAgIG9wdGlvbiBzZXR0aW5nICItdXNlcnMgc3NscGVlcj0iIHRoYXQgd2lsbCBkbyBhIHN3aXRjaCB1c2VyIG11Y2ggbGlrZQotICAgLXVuaXhwdyBkb2VzLCBidXQgdGhpcyB0aW1lIHVzaW5nIHRoZSBlbWFpbEFkZHJlc3MgZmllbGQgb2YgdGhlCi0gICBDZXJ0aWZpY2F0ZSBzdWJqZWN0IG9mIHRoZSB2ZXJpZmllZCBDbGllbnQuIFRoaXMgbW9kZSByZXF1aXJlcwotICAgLXNzbHZlcmlmeSB0dXJuZWQgb24gdG8gdmVyaWZ5IHRoZSBjbGllbnRzIHZpYSBTU0wuIFRoaXMgbW9kZSBjYW4gYmUKLSAgIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHVzaW5nIC1jcmVhdGUgb3IgLXN2YyB3aGVyZSBhIG5ldyBYIHNlcnZlciBuZWVkcwotICAgdG8gYmUgc3RhcnRlZCB1cCBhcyB0aGUgYXV0aGVudGljYXRlZCB1c2VyIChidXQgdW5saWtlIGluIC11bml4cHcKLSAgIG1vZGUsIHRoZSB1bml4IHVzZXJuYW1lIGlzIG5vdCBvYnZpb3VzbHkga25vd24pLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFJldm9raW5nIENlcnRpZmljYXRlczoKLQotICAgQSBsYXJnZSwgc2NhbGVkLXVwIGluc3RhbGxhdGlvbiBtYXkgYmVuZWZpdCBmcm9tIGJlaW5nIGFibGUgdG8gcmV2b2tlCi0gICBjZXJ0aWZpY2F0ZXMgKGUuZy4gc3VwcG9zZSBhIHVzZXIncyBsYXB0b3Agd2l0aCBhIHZuYyBjbGllbnQgb3Igc2VydmVyCi0gICBrZXkgaXMgY29tcHJvbWlzZWQuKSBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB3aXRoIHgxMXZuYzogLXNzbENSTC4gU2VlCi0gICB0aGUgaW5mbyBhdCB0aGF0IGxpbmsgZm9yIGEgZ3VpZGUgb24gd2hhdCBvcGVuc3NsKDEpIGNvbW1hbmRzIHlvdSB3aWxsCi0gICBuZWVkIHRvIHJ1biB0byByZXZva2UgYSBjZXJ0aWZpY2F0ZS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBBZGRpdGlvbmFsIHV0bGl0aWVzOgotCi0gICBZb3UgY2FuIGdldCBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIGtleXMgdmlhIC1zc2xDZXJ0SW5mby4gVGhlc2UgbGlzdHMKLSAgIGFsbCB5b3VyIGtleXM6Ci0gIHgxMXZuYyAtc3NsQ2VydEluZm8gbGlzdAotICB4MTF2bmMgLXNzbENlcnRJbmZvIGxsCi0KLSAgICh0aGUgbGF0dGVyIGlzIGxvbmcgZm9ybWF0KS4KLQotICAgVGhlc2UgcHJpbnQgbG9uZyBvdXRwdXQsIGluY2x1ZGluZyB0aGUgcHVibGljIGNlcnRpZmljYXRlLCBmb3IKLSAgIGluZGl2aWR1YWwga2V5czoKLSAgeDExdm5jIC1zc2xDZXJ0SW5mbyBzZXJ2ZXIKLSAgeDExdm5jIC1zc2xDZXJ0SW5mbyBkaWxiZXJ0Ci0gIHgxMXZuYyAtc3NsQ2VydEluZm8gYWxsICAgICAgICAgICAgIChldmVyeSBrZXksIHZlcnkgbG9uZykKLQotICAgSWYgeW91IHdhbnQgdG8gYWRkIGEgcHJvdGVjdGluZyBwYXNzcGhyYXNlIHRvIGEga2V5IG9yaWdpbmFsbHkgY3JlYXRlZAotICAgd2l0aG91dCBvbmU6Ci0gIHgxMXZuYyAtc3NsRW5jS2V5IFNBVkUKLSAgeDExdm5jIC1zc2xFbmNLZXkgU0FWRS1mcmVkCi0KLSAgIFRvIGRlbGV0ZSBhIGNlcnQra2V5OgotICB4MTF2bmMgLXNzbERlbENlcnQgU0FWRQotICB4MTF2bmMgLXNzbERlbENlcnQgU0FWRS1mcmVkCi0gIHgxMXZuYyAtc3NsRGVsQ2VydCB3YWxseQotCi0gICAoYnV0IHJtKDEpIHdpbGwgYmUganVzdCBhcyBlZmZlY3RpdmUpLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIENoYWluZWQgQ2VydGlmaWNhdGVzOgotCi0gICBUaGVyZSBpcyBpbmNyZWFzaW5nIGludGVyZXN0IGluIHVzaW5nIGNoYWluZWQgQ0EncyBpbnN0ZWFkIG9mIGEgc2luZ2xlCi0gICBDQS4gVGhlIG1lcml0cyBvZiB1c2luZyBjaGFpbmVkIENBJ3MgYXJlIG5vdCBkZXNjcmliZWQgaGVyZSBiZXNpZGVzIHRvCi0gICBzYXkgaXRzIHVzZSBtYXkgbWFrZSBzb21lIHRoaW5ncyBlYXNpZXIgd2hlbiBhIGNlcnRpZmljYXRlIG5lZWRzIHRvIGJlCi0gICByZXZva2VkLgotCi0gICB4MTF2bmMgc3VwcG9ydHMgY2hhaW5lZCBDQSBjZXJ0aWZpY2F0ZXMuIFdlIGRlc2NyaWJlIGEgYmFzaWMgdXNlIGNhc2UKLSAgIGhlcmUuCi0KLSAgIEJhY2tncm91bmQ6IE9mIGNvdXJzZSB0aGUgbW9zdCBzdHJhaWdodCBmb3J3YXJkIHdheSB0byB1c2UgU1NMIHdpdGgKLSAgIHgxMXZuYyBpcyB0byB1c2Ugbm8gQ0EgYXQgYWxsIChzZWUgYWJvdmUpOiBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlCi0gICBhbmQga2V5IGlzIHVzZWQgYW5kIGl0cyBjZXJ0aWZpY2F0ZSBuZWVkcyB0byBiZSBzYWZlbHkgY29waWVkIHRvIHRoZQotICAgY2xpZW50IHNpZGUuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBTU0ggc3R5bGUgb2YgbWFuYWdpbmcKLSAgIGtleXMuIE5leHQgbGV2ZWwgdXAsIG9uZSBjYW4gdXNlIGEgc2luZ2xlIENBIHRvIHNpZ24gc2VydmVyIGtleXM6IHRoZW4KLSAgIG9ubHkgdGhlIENBJ3MgY2VydGlmaWNhdGUgbmVlZHMgdG8gYmUgc2FmZWx5IGNvcGllZCB0byB0aGUgY2xpZW50Ci0gICBzaWRlLCB0aGlzIGNhbiBoYXBwZW4gZXZlbiBiZWZvcmUgYW55IHNlcnZlciBjZXJ0cyBhcmUgY3JlYXRlZCAoYWdhaW4sCi0gICBzZWUgYWxsIG9mIHRoZSBkaXNjdXNzaW9uIGFib3ZlLikKLQotICAgV2l0aCBhIGNlcnRpZmljYXRlIGNoYWluIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBDQSdzIGludm9sdmVkLiBQZXJoYXBzCi0gICBpdCBsb29rcyBsaWtlIHRoaXM6Ci0gIHJvb3RfQ0EgLS0tPiBpbnRlcm1lZGlhdGVfQ0EgLS0tPiBzZXJ2ZXJfY2VydAotCi0gICBXaGVyZSB0aGUgYXJyb3cgYmFzaWNhbGx5IG1lYW5zICJzaWducyIuCi0KLSAgIEluIHRoaXMgdXNhZ2UgbW9kZSB0aGUgY2xpZW50ICh2aWV3ZXItc2lkZSkgd2lsbCBoYXZlIHJvb3RfQ0EncwotICAgY2VydGlmaWNhdGUgYXZhaWxhYmxlIGZvciB2ZXJpZnlpbmcgKGFuZCBub3RoaW5nIGVsc2UuKSBJZiB0aGUgdmlld2VyCi0gICBvbmx5IHJlY2VpdmVkIHNlcnZlcl9jZXJ0J3MgY2VydGlmaWNhdGUsIGl0IHdvdWxkIG5vdCBoYXZlIGVub3VnaCBpbmZvCi0gICB0byB2ZXJpZnkgdGhlIHNlcnZlci4gVGhlIGNsaWVudCBuZWVkcyB0byBoYXZlIGludGVybWVkaWF0ZV9DQSdzIGNlcnQKLSAgIGFzIHdlbGwuIFRoZSB3YXkgdG8gZG8gdGhpcyB3aXRoIHgxMXZuYyAoaS5lLiBhbiBPcGVuU1NMIHVzaW5nIGFwcCkgaXMKLSAgIHRvIGNvbmNhdGVuYXRlIHRoZSBzZXJ2ZXJfY2VydCdzIHBlbSBhbmQgdGhlIGludGVybWVkaWF0ZV9DQSdzCi0gICBjZXJ0aWZpY2F0ZSB0b2dldGhlci4KLQotICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlIGZpbGUgaW50ZXJtZWRpYXRlX0NBLmNydCBoYWQKLSAgIGludGVybWVkaWF0ZV9DQSdzIGNlcnRpZmljYXRlLiBBbmQgc3VwcG9zZSB0aGUgZmlsZSBzZXJ2ZXJfY2VydC5wZW0KLSAgIGhhZCB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5IHBhaXIgYXMgZGVzY3JpYmVkIGFib3ZlCi0gICBvbiB0aGlzIHBhZ2UuIFdlIG5lZWQgdG8gZG8gdGhpczoKLSAgY2F0IGludGVybWVkaWF0ZV9DQS5jcnQgPj4gc2VydmVyX2NlcnQucGVtCi0KLSAgIChOb3RlOiB0aGUgb3JkZXIgb2YgdGhlIGl0ZW1zIGluc2lkZSB0aGUgZmlsZSBtYXR0ZXJzOyBpbnRlcm1lZGlhdGVfQ0EKLSAgIG11c3QgYmUgYWZ0ZXIgdGhlIHNlcnZlciBrZXkgYW5kIGNlcnQpIGFuZCB0aGVuIHdlIHJ1biB4MTF2bmMgbGlrZQotICAgdGhpczoKLSAgeDExdm5jIC1zc2wgLi9zZXJ2ZXJfY2VydC5wZW0gLi4uCi0KLSAgIFRoZW4sIG9uIHRoZSBWTkMgdmlld2VyIGNsaWVudCBzaWRlLCB0aGUgdmlld2VyIGF1dGhlbnRpY2F0ZXMgdGhlCi0gICB4MTF2bmMgc2VydmVyIGJ5IHVzaW5nIHJvb3RfQ0EncyBjZXJ0aWZpY2F0ZS4gU3VwcG9zZSB0aGF0IGlzIGluIGEKLSAgIGZpbGUgbmFtZWQgcm9vdF9DQS5jcnQsIHRoZW4gdXNpbmcgdGhlIFNTVk5DIHdyYXBwZXIgc2NyaXB0Ci0gICBzc192bmN2aWV3ZXIgKHdoaWNoIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIFNTVk5DIHBhY2thZ2UpIGFzIG91cgotICAgZXhhbXBsZSwgd2UgaGF2ZToKLSAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9yb290X0NBLmNydCBob3N0bmFtZTowCi0KLSAgICh3aGVyZSAiaG9zdG5hbWUiIGlzIHRoZSBtYWNoaW5lIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nLikgT25lIGNvdWxkCi0gICBhbHNvIHVzZSB0aGUgU1NWTkMgR1VJIHNldHRpbmcgQ2VydHMgLT4gU2VydmVyQ2VydCB0byB0aGUgcm9vdF9DQS5jcnQKLSAgIGZpbGUuIEFueSBvdGhlciBTU0wgZW5hYmxlZCBWTkMgdmlld2VyIHdvdWxkIHVzZSByb290X0NBLmNydCBpbiBhCi0gICBzaW1pbGFyIHdheS4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgQ3JlYXRpbmcgQ2hhaW5lZCBDZXJ0aWZpY2F0ZXM6Ci0KLSAgIEhlcmUgaXMgYSBmdW4gZXhhbXBsZSB1c2luZyBWZXJpU2lnbidzICJUcmlhbCBDZXJ0aWZpY2F0ZSIgcHJvZ3JhbS4KLSAgIE5vdGUgdGhhdCBWZXJpU2lnbiBoYXMgYSBSb290IENBIGFuZCBhbHNvIGFuIEludGVybWVkaWF0ZSBDQSBhbmQgdXNlcwotICAgdGhlIGxhdHRlciB0byBzaWduIGN1c3RvbWVycyBjZXJ0aWZpY2F0ZXMuIFNvIHRoaXMgcHJvdmlkZXMgYW4gZWFzeQotICAgd2F5IHRvIHRlc3Qgb3V0IHRoZSBjaGFpbmVkIGNlcnRpZmljYXRlcyBtZWNoYW5pc20gd2l0aCB4MTF2bmMuCi0KLSAgIEZpcnN0IHdlIGNyZWF0ZWQgYSB0ZXN0IHgxMXZuYyBzZXJ2ZXIga2V5OgotICBvcGVuc3NsIGdlbnJzYSAtb3V0IFYxLmtleSAxMDI0Ci0KLSAgIHRoZW4gd2UgY3JlYXRlZCBhIGNlcnRpZmljYXRlIHNpZ25pbmcgcmVxdWVzdCAoQ1NSKSBmb3IgaXQ6Ci0gIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBWMS5rZXkgLW91dCBWMS5jc3IKLQotICAgKHdlIGZvbGxvd2VkIHRoZSBwcm9tcHRzIGFuZCBzdXBwbGllZCBpbmZvcm1hdGlvbiBmb3IgdGhlIHZhcmlvdXMKLSAgIGZpZWxkcy4pCi0KLSAgIFRoZW4gd2Ugd2VudCB0byBWZXJpU2lnbidzIHBhZ2UgaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3NsL2luZGV4Lmh0bWwKLSAgIGFuZCBjbGlja2VkIG9uICJGUkVFIFRSSUFMIiAodGhlIGNlcnRpZmljYXRlIGlzIGdvb2QgZm9yIDE0IGRheXMuKSBXZQotICAgZmlsbGVkIGluIHRoZSBmb3JtcyBhbmQgZ290IHRvIHRoZSBwb2ludCB3aGVyZSBpdCBhc2tlZCBmb3IgdGhlIENTUgotICAgYW5kIHNvIHdlIHBhc3RlZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIGFib3ZlIFYxLmNzciBmaWxlLiBUaGVuLCBhZnRlcgotICAgYSBmZXcgbW9yZSBzdGVwcywgVmVyaVNpZ24gc2lnbmVkIGFuZCBlbWFpbGVkIHVzIG91ciBjZXJ0aWZpY2F0ZS4KLQotICAgVGhlIFZlcmlTaWduIFRyaWFsIGNlcnRpZmljYXRlcyB3ZXJlIGZvdW5kIGhlcmU6Ci0gIGh0dHA6Ly93d3cudmVyaXNpZ24uY29tL3N1cHBvcnQvdmVyaXNpZ24taW50ZXJtZWRpYXRlLWNhL1RyaWFsX1NlY3VyZV9TZXJ2ZXJfCi1Sb290L2luZGV4Lmh0bWwKLSAgaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3VwcG9ydC92ZXJpc2lnbi1pbnRlcm1lZGlhdGUtY2EvdHJpYWwtc2VjdXJlLXNlcnZlci0KLWludGVybWVkaWF0ZS9pbmRleC5odG1sCi0KLSAgIFRoZSBmb3JtZXIgd2FzIHBhc3RlZCBpbnRvIGEgZmlsZSBWLVJvb3QuY3J0IGFuZCB0aGUgbGF0dGVyIHdhcyBwYXN0ZWQKLSAgIGludG8gVi1JbnRlcm1lZGlhdGUuY3J0Ci0KLSAgIFdlIHBhc3RlZCBvdXIgVHJpYWwgY2VydGlmaWNhdGUgdGhhdCBWZXJpU2lnbiBzaWduZWQgYW5kIGVtYWlsZWQgdG8gdXMKLSAgIGludG8gYSBmaWxlIG5hbWVkIFYxLmNydCBhbmQgdGhlbiB3ZSB0eXBlZDoKLSAgY2F0IFYxLmtleSBWMS5jcnQgPiBWMS5wZW0KLSAgY2F0IFYxLnBlbSBWLUludGVybWVkaWF0ZS5jcnQgPiBWMS1jb21iaW5lZC5wZW0KLSAgY2htb2QgNjAwIFYxLnBlbSBWMS1jb21iaW5lZC5wZW0KLQotICAgU28gbm93IHRoZSBmaWxlIFYxLWNvbWJpbmVkLnBlbSBoYXMgb3VyIHByaXZhdGUga2V5IGFuZCAoVmVyaVNpZ24KLSAgIHNpZ25lZCkgY2VydGlmaWNhdGUgYW5kIFZlcmlTaWduJ3MgVHJpYWwgSW50ZXJtZWRpYXRlIGNlcnRpZmljYXRlLgotCi0gICBOZXh0LCB3ZSBzdGFydCB4MTF2bmM6Ci0gIHgxMXZuYyAtc3NsIC4vVjEtY29tYmluZWQucGVtIC4uLgotCi0gICBhbmQgZmluYWxseSwgb24gdGhlIHZpZXdlciBzaWRlIChTU1ZOQyB3cmFwcGVyIHNjcmlwdCBleGFtcGxlKToKLSAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9WLVJvb3QuY3J0IGhvc3RuYW1lOjAKLQotICAgT25lIHdpbGwgZmluZCB0aGF0IG9ubHkgdGhhdCBjb21iaW5hdGlvbiBvZiBjZXJ0cyBhbmQga2V5cyB3aWxsIHdvcmssCi0gICBpLmUuIGFsbG93IHRoZSBTU0wgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZC4gRXZlcnkgb3RoZXIKLSAgIGNvbWJpbmF0aW9uIHdlIHRyaWVkIGZhaWxlZCAobm90ZSB0aGF0IHNzX3ZuY3ZpZXdlciB1c2VzIHRoZSBleHRlcm5hbAotICAgc3R1bm5lbCBjb21tYW5kIHRvIGhhbmRsZSB0aGUgU1NMIHNvIHdlIGFyZSByZWFsbHkgdGVzdGluZyBzdHVubmVsJ3MKLSAgIFNTTCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgdmlld2VyIHNpZGUpOyBhbmQgc28gdGhlIHN5c3RlbSB3b3JrcyBhcwotICAgZXhwZWN0ZWQuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFZOQyBDbGllbnQgQXV0aGVudGljYXRpb24gdXNpbmcgQ2VydGlmaWNhdGUgQ2hhaW5zOgotCi0gICBOb3csIGdvaW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kIHdpdGggdGhlIGNsaWVudCBhdXRoZW50aWNhdGluZyBoaW1zZWxmCi0gICB2aWEgdGhpcyBjaGFpbiBvZiBTU0wgY2VydGlmaWNhdGVzLCB4MTF2bmMgaXMgcnVuIHRoaXMgd2F5OgotICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgLi9WLVJvb3QuY3J0IC4uLgotCi0gICAobm90ZSBzaW5jZSB0aGUgc2VydmVyIG11c3QgYWx3YXlzIHN1cHBseSBhIGNlcnQsIHdlIHVzZSBpdHMgbm9ybWFsCi0gICBzZWxmLXNpZ25lZCwgZXRjLiwgb25lIHZpYSAiLXNzbCBTQVZFIiBhbmQgdXNlIHRoZSBWZXJpU2lnbiByb290IGNlcnQKLSAgIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24gdmlhIC1zc2x2ZXJpZnkuIFRoZSB2aWV3ZXIgbXVzdCBub3cgc3VwcGx5Ci0gICB0aGUgY29tYmluZWQgY2VydGlmaWNhdGVzLCBlLmcuOgotICBzc192bmN2aWV3ZXIgLW15Y2VydCAuL1YxLWNvbWJpbmVkLnBlbSBob3N0bmFtZTowCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFVzaW5nIE9wZW5TU0wgYW5kIHgxMXZuYyB0byBjcmVhdGUgQ2VydGlmaWNhdGUgQ2hhaW5zOgotCi0gICBBbHRob3VnaCB0aGUgeDExdm5jIENBIG1lY2hhbmlzbSAoLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydDsgc2VlCi0gICBhYm92ZSkgd2FzIGRlc2lnbmVkIHRvIG9ubHkgaGFuZGxlIGEgc2luZ2xlIHJvb3QgQ0EgKHRvIHNpZ24gc2VydmVyCi0gICBhbmQvb3IgY2xpZW50IGNlcnRzKSBpdCBjYW4gYmUgY29lcmNlZCBpbnRvIGNyZWF0aW5nIGEgY2VydGlmaWNhdGUKLSAgIGNoYWluIGJ5IHdheSBvZiBhbiBleHRyYSBvcGVuc3NsKDEpIGNvbW1hbmQuCi0KLSAgIFdlIHdpbGwgZmlyc3QgY3JlYXRlIHR3byBDQSdzIHZpYSAtc3NsR2VuQ0E7IHRoZW4gdXNlIG9uZSBvZiB0aGVzZSBDQQotICAgdG8gc2lnbiB0aGUgb3RoZXI7IGNyZWF0ZSBhIG5ldyAobm9uLUNBKSBzZXJ2ZXIgY2VydDsgYW5kIGFwcGVuZCB0aGUKLSAgIGludGVybWVkaWF0ZSBDQSdzIGNlcnQgdG8gdGhlIHNlcnZlciBjZXJ0IHRvIGhhdmUgZXZlcnl0aGluZyBuZWVkZWQgaW4KLSAgIHRoZSBvbmUgZmlsZS4KLQotICAgSGVyZSBhcmUgdGhlIGNvbW1hbmRzIHdlIHJhbiB0byBkbyB3aGF0IHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgKLSAgIG91dGxpbmVzLgotCi0gICBGaXJzdCB3ZSBjcmVhdGUgdGhlIHR3byBDQSdzLCBjYWxsZWQgQ0Ffcm9vdCBhbmQgQ0FfSW50ZXJtZWRpYXRlIGhlcmUsCi0gICBpbiBzZXBhcmF0ZSBkaXJlY3RvcmllcyB2aWEgeDExdm5jOgotICB4MTF2bmMgLXNzbGRpciB+L0NBX1Jvb3QgLXNzbEdlbkNBCi0gICAgIChmb2xsb3cgdGhlIHByb21wdHMsIHdlIGluY2x1ZGVkICJDQV9Sb290IiwgZS5nLiBDb21tb24gTmFtZSwgdG8gYWlkIGlkZW50Ci1pZnlpbmcgaXQpCi0KLSAgeDExdm5jIC1zc2xkaXIgfi9DQV9JbnRlcm1lZGlhdGUgLXNzbEdlbkNBCi0gICAgIChmb2xsb3cgdGhlIHByb21wdHMsIHdlIGluY2x1ZGVkICJDQV9JbnRlcm1lZGlhdGUiLCBlLmcuIENvbW1vbiBOYW1lLCB0byBhCi1pZCBpZGVudGlmeWluZyBpdCkKLQotICAgTmV4dCBiYWNrdXAgQ0FfSW50ZXJtZWRpYXRlJ3MgY2VydCBhbmQgdGhlbiBzaWduIGl0IHdpdGggQ0FfUm9vdDoKLSAgbXYgfi9DQV9JbnRlcm1lZGlhdGUvQ0EvY2FjZXJ0LnBlbSB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYWNlcnQucGVtLk9SSUcKLSAgY2Qgfi9DQV9Sb290Ci0gIG9wZW5zc2wgY2EgLWNvbmZpZyAuL0NBL3NzbC5jbmYgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLWV4dGVuc2lvbnMgdjNfY2EgLW5vCi10ZXh0IC1zc19jZXJ0IH4vQ0FfSW50ZXJtZWRpYXRlL0NBL2NhY2VydC5wZW0uT1JJRyAtb3V0IH4vQ0FfSW50ZXJtZWRpYXRlL0NBL2NhCi1jZXJ0LnBlbQotCi0gICBOb3RlIHRoYXQgaXQgaXMgcmVxdWlyZWQgdG8gY2QgdG8gdGhlIH4vQ0FfUm9vdCBkaXJlY3RvcnkgYW5kIHJ1biB0aGUKLSAgIG9wZW5zc2wgY29tbWFuZCBmcm9tIHRoZXJlLgotCi0gICBZb3UgY2FuIHByaW50IG91dCBpbmZvIGFib3V0IHRoZSBjZXJ0IHlvdSBqdXN0IG1vZGlmaWVkIGJ5OgotICBvcGVuc3NsIHg1MDkgLW5vb3V0IC10ZXh0IC1pbiB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYWNlcnQucGVtCi0KLSAgIE5vdyB3ZSBjcmVhdGUgYW4geDExdm5jIHNlcnZlciBjZXJ0IG5hbWVkICJ0ZXN0X2NoYWluIiB0aGF0IGlzIHNpZ25lZAotICAgYnkgQ0FfSW50ZXJtZWRpYXRlOgotICB4MTF2bmMgLXNzbGRpciB+L0NBX0ludGVybWVkaWF0ZSAtc3NsR2VuQ2VydCBzZXJ2ZXIgdGVzdF9jaGFpbgotICAgICAoZm9sbG93IHRoZSBwcm9tcHRzKQotCi0gICBZb3UgY2FuIHByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNlcnZlciBjZXJ0IGp1c3QgY3JlYXRlZCB2aWEKLSAgIHRoaXMgY29tbWFuZDoKLSAgeDExdm5jIC1zc2xkaXIgfi9DQV9JbnRlcm1lZGlhdGUgLXNzbENlcnRJbmZvIFNBVkUtdGVzdF9jaGFpbgotCi0gICBUaGlzIHdpbGwgdGVsbCB5b3UgdGhlIGZ1bGwgcGF0aCB0byB0aGUgc2VydmVyIGNlcnRpZmljYXRlLCB3aGljaCBpcwotICAgbmVlZGVkIGJlY2F1c2Ugd2UgbmVlZCB0byBtYW51YWxseSBhcHBlbmQgdGhlIENBX0ludGVybWVkaWF0ZSBjZXJ0IGZvcgotICAgdGhlIGNoYWluIHRvIHdvcms6Ci0gIGNhdCB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYWNlcnQucGVtID4+IH4vQ0FfSW50ZXJtZWRpYXRlL3NlcnZlci10ZXN0X2NoYWluLnBlCi1tCi0KLSAgIE5vdyB3ZSBhcmUgZmluYWxseSByZWFkeSB0byB1c2UgaXQuIFdlIGNhbiBydW4geDExdm5jIHVzaW5nIHRoaXMKLSAgIHNlcnZlciBjZXJ0K2tleSBieSBlaXRoZXIgdGhpcyBjb21tYW5kOgotICB4MTF2bmMgLXNzbGRpciB+L0NBX0ludGVybWVkaWF0ZSAtc3NsIFNBVkUtdGVzdF9jaGFpbiAuLi4KLQotICAgb3IgdGhpcyBjb21tYW5kOgotICB4MTF2bmMgLXNzbCB+L0NBX0ludGVybWVkaWF0ZS9zZXJ2ZXItdGVzdF9jaGFpbi5wZW0gLi4uCi0KLSAgIHNpbmNlIHRoZXkgYXJlIGVxdWl2YWxlbnQgKGJvdGggbG9hZCB0aGUgc2FtZSBwZW0gZmlsZS4pCi0KLSAgIEZpbmFsbHkgd2UgY29ubmVjdCB2aWEgVk5DIHZpZXdlciB0aGF0IHVzZXMgQ0FfUm9vdCB0byB2ZXJpZnkgdGhlCi0gICBzZXJ2ZXIuIEFzIGJlZm9yZSB3ZSB1c2Ugc3Nfdm5jdmlld2VyOgotICBzc192bmN2aWV3ZXIgLXZlcmlmeSB+L0NBX1Jvb3QvQ0EvY2FjZXJ0LnBlbSBob3N0bmFtZTowCi0KLSAgIENsaWVudCBDZXJ0aWZpY2F0ZXMgKHNlZSBhYm92ZSkgd29yayBpbiBhIHNpbWlsYXIgbWFubmVyLgotCi0gICBTbyBhbHRob3VnaCBpdCBpcyBhIGxpdHRsZSBhd2t3YXJkIHdpdGggdGhlIGV4dHJhIHN0ZXBzIChlLmcuCi0gICBhcHBlbmRpbmcgdGhlIENBX0ludGVybWVkaWF0ZSBjZXJ0KSBpdCBpcyBwb3NzaWJsZS4gSWYgeW91IHdhbnQgdG8gZG8KLSAgIHRoaXMgZW50aXJlbHkgd2l0aCBvcGVuc3NsKDEpIHlvdSB3aWxsIGhhdmUgdG8gbGVhcm4gdGhlIG9wZW5zc2wKLSAgIGNvbW1hbmRzIGNvcnJlc3BvbmRpbmcgdG8gLWdlbkNBIGFuZCAtZ2VuQ2VydC4gWW91IG1heSBiZSBhYmxlIHRvIGZpbmQKLSAgIGd1aWRlcyBvbiB0aGUgSW50ZXJuZXQgdG8gZG8gdGhpcy4gU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjEwLCB5b3UKLSAgIGNhbiBoYXZlIGl0IHByaW50IG91dCB0aGUgd3JhcHBlciBzY3JpcHRzIGl0IHVzZXMgdmlhOiAtc3NsU2NyaXB0cwotICAgKHlvdSB3aWxsIHN0aWxsIG5lZWQgdG8gZmlsbCBpbiBhIGZldyBwaWVjZXMgb2YgaW5mb3JtYXRpb247IGFzayBpZiBpdAotICAgaXMgbm90IGNsZWFyIGZyb20gdGhlIHNvdXJjZSBjb2RlLikKLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBNb3JlIGluZm86Ci0KLSAgIFNlZSBhbHNvIHRoaXMgYXJ0aWNsZSBmb3Igc29tZSBzb21lIGdlbmVyYWwgaW5mbyBhbmQgZXhhbXBsZXMgdXNpbmcKLSAgIHN0dW5uZWwgYW5kIG9wZW5zc2wgb24gV2luZG93cyB3aXRoIFZOQy4gQWxzbwotICAgaHR0cDovL3d3dy5zdHVubmVsLm9yZy9mYXEvY2VydHMuaHRtbCBpcyBhIHZlcnkgZ29vZCBzb3VyY2Ugb2YKLSAgIGluZm9ybWF0aW9uIG9uIFNTTCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudC4KLQkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3NzbC1wb3J0YWwuaHRtbDoKLQotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFVzaW5nIEFwYWNoZSBhcyBhbiBTU0wgR2F0ZXdheSB0byBtdWx0aXBsZSB4MTF2bmMgc2VydmVycyBpbnNpZGUgYQotICAgZmlyZXdhbGw6Ci0KLSAgIEJhY2tncm91bmQ6Ci0KLSAgIFRoZSB0eXBpY2FsIHdheSB0byBhbGxvdyBhY2Nlc3MgdG8geDExdm5jIChvciBhbnkgb3RoZXIgVk5DIHNlcnZlcikKLSAgIHJ1bm5pbmcgb24gbXVsdGlwbGUgd29ya3N0YXRpb25zIGluc2lkZSBhIGZpcmV3YWxsIGlzIHZpYSBTU0guIFRoZQotICAgdXNlciBzb21ld2hlcmUgb3V0IG9uIHRoZSBJbnRlcm5ldCBsb2dzIGluIHRvIHRoZSBTU0ggZ2F0ZXdheSBtYWNoaW5lCi0gICBhbmQgdXNlcyBwb3J0IGZvcndhcmRpbmcgKGUuZy4gc3NoIC10IC1MIDU5MDA6bXl3b3Jrc3RhdGlvbjo1OTAwCi0gICB1c2VyQGdhdGV3YXkpIHRvIHNldCB1cCB0aGUgZW5jcnlwdGVkIGNoYW5uZWwgdGhhdCBWTkMgaXMgdGhlbgotICAgdHVubmVsZWQgdGhyb3VnaC4gTmV4dCBoZSBzdGFydHMgdXAgdGhlIFZOQyB2aWV3ZXIgb24gdGhlIG1hY2hpbmUKLSAgIHdoZXJlIGhlIGlzIHNpdHRpbmcgZGlyZWN0ZWQgdG8gdGhlIGxvY2FsIHR1bm5lbCBwb3J0IChlLmcuCi0gICBsb2NhbGhvc3Q6MCkuCi0KLSAgIFRoZSBTU0ggc2NoZW1lIGlzIG5pY2UgYmVjYXVzZSBpdCBpcyBhIHdpZGVseSB1c2VkIGFuZCB3ZWxsIHRlc3RlZAotICAgbG9naW4gdGVjaG5pcXVlIGZvciB1c2VycyBjb25uZWN0aW5nIHRvIG1hY2hpbmVzIGluc2lkZSB0aGVpciBjb21wYW55Ci0gICBvciBob21lIGZpcmV3YWxsLiBGb3IgVk5DIGFjY2VzcyBpdCBpcyBhIGJpdCBhd2t3YXJkLCBob3dldmVyLCBiZWNhdXNlCi0gICBTU0ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBWaWV3ZXIgbWFjaGluZSBhbmQgdGhlIHVzZXIgdXN1YWxseQotICAgaGFzIHRvIHJpZyB1cCBoaXMgb3duIHBvcnQgcmVkaXJlY3Rpb24gcGx1bWJpbmcgKGhvd2V2ZXIsIHNlZSBvdXIKLSAgIG90aGVyIHRvb2wpLgotCi0gICBBbHNvLCBzb21lIHVzZXJzIGhhdmUgcmVzdHJpY3RpdmUgd29yayBlbnZpcm9ubWVudHMgd2hlcmUgU1NIIGFuZAotICAgc2ltaWxhciBhcHBsaWNhdGlvbnMgYXJlIHByb2hpYml0ZWQgKGkuZS4gb25seSBvdXRnb2luZyBjb25uZWN0aW9ucyB0bwotICAgc3RhbmRhcmQgV1dXIHBvcnRzIGZyb20gYSBicm93c2VyIGFyZSBhbGxvd2VkLCBwZXJoYXBzIG1lZGlhdGVkIGJ5IGEKLSAgIHByb3h5IHNlcnZlcikuIFRoZXNlIHVzZXJzIGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgdGhlIG1ldGhvZCBkZXNjcmliZWQKLSAgIGhlcmUgZm9yIHJlbW90ZSBhY2Nlc3MuCi0KLSAgIFdpdGggdGhlIFNTTCBzdXBwb3J0IGluIHgxMXZuYyBhbmQgdGhlIFNTTCBlbmFibGVkIEphdmEgVk5DIHZpZXdlcgotICAgYXBwbGV0LCBhIGNvbnZlbmllbnQgYW5kIHNlY3VyZSBhbHRlcm5hdGl2ZSBleGlzdHMgdGhhdCB1c2VzIHRoZQotICAgQXBhY2hlIHdlYnNlcnZlciBhcyBhIGdhdGV3YXkuIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGNvbXBhbnkgb3IgaG9tZQotICAgaW50ZXJuZXQgY29ubmVjdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcgYXBhY2hlIGFzIGEgd2ViIHNlcnZlciAoZWl0aGVyCi0gICBTU0wgb3Igbm9uLVNTTCkgYW5kIHdlIGFkZCB0byBpdCB0aGUgYWJpbGl0eSB0byBhY3QgYXMgYSBnYXRld2F5IGZvcgotICAgU1NMIFZOQyBjb25uZWN0aW9ucy4gVGhlIG9ubHkgdGhpbmcgbmVlZGVkIG9uIHRoZSBWaWV3ZXIgc2lkZSBpcyBhCi0gICBKYXZhIGVuYWJsZWQgV2ViIEJyb3dzZXI6IHRoZSB1c2VyIHNpbXBseSBlbnRlcnMgYSBVUkwgdGhhdCBzdGFydHMgdGhlCi0gICBlbnRpcmUgVk5DIGNvbm5lY3Rpb24gcHJvY2Vzcy4gTm8gVk5DIG9yIFNTSCBzcGVjaWZpYyBzb2Z0d2FyZSBuZWVkcwotICAgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSB2aWV3ZXIgc2lkZSBtYWNoaW5lLgotCi0gICBUaGUgc3R1bm5lbCBWTkMgdmlld2VyIHN0dW5uZWwgd3JhcHBlciBzY3JpcHQgcHJvdmlkZWQgKHNzX3ZuY3ZpZXdlcikKLSAgIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBtZXRob2QgZGVzY3JpYmVkIGhlcmUgd2l0aCBpdHMgLXByb3h5Ci0gICBvcHRpb24uCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgU2ltcGxlciBTb2x1dGlvbnM6IFRoaXMgYXBhY2hlIFNTTCBWTkMgcG9ydGFsIHNvbHV0aW9uIG1heSBiZSB0b28gbXVjaAotICAgZm9yIHlvdS4gSXQgaXMgbWFpbmx5IGludGVuZGVkIGZvciBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0aW5nIHRvCi0gICBNVUxUSVBMRSB3b3Jrc3RhdGlvbnMgaW5zaWRlIHRoZSBmaXJld2FsbC4gSWYgeW91IG9ubHkgaGF2ZSBvbmUgb3IgdHdvCi0gICBpbnNpZGUgbWFjaGluZXMgdGhhdCB5b3Ugd2FudCB0byBhY2Nlc3MsIHRoZSBtZXRob2QgZGVzY3JpYmVkIGhlcmUgaXMKLSAgIG92ZXJseSBjb21wbGljYXRlZCEgU2VlIGJlbG93IGZvciBzb21lIHNpbXBsZXIgKGFuZCBzdGlsbCBub24tU1NIKQotICAgZW5jcnlwdGVkIHNldHVwcy4KLQotICAgQWxzbyBzZWUgdGhlIHJlY2VudCAoTWFyLzIwMTApIGRlc2t0b3AuY2dpIHgxMXZuYyBkZXNrdG9wIHdlYiBsb2dpbgotICAgQ0dJIHNjcmlwdCB0aGF0IGFjaGlldmVzIG11Y2ggb2Ygd2hhdCB0aGUgbWV0aG9kIGRlc2NyaWJlcyBoZXJlCi0gICAoZXNwZWNpYWxseSBpZiBpdHMgJ3BvcnQgcmVkaXJlY3Rpb24nIGZlYXR1cmUgaXMgZW5hYmxlZC4pCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLQotCi0gICBUaGVyZSBhcmUgbnVtZXJvdXMgd2F5cyB0byBhY2hpZXZlIHRoaXMgd2l0aCBBcGFjaGUuIFdlIHByZXNlbnQgb25lIG9mCi0gICB0aGUgc2ltcGxlc3Qgb25lcyBoZXJlLgotCi0gICBJbXBvcnRhbnQ6IHRoZXNlIHNvcnRzIG9mIHNjaGVtZXMgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbQotICAgYW55d2hlcmUgb24gdGhlIEludGVybmV0IHRvIGZpeGVkIHBvcnRzIG9uIG1hY2hpbmVzIGluc2lkZSB0aGUKLSAgIGZpcmV3YWxsLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gaW1wbGVtZW50IGFuZCB0ZXN0IHRob3JvdWdobHkuIElmIG9uZQotICAgaXMgcGFyYW5vaWQgb25lIGNhbiAoYW5kIHNob3VsZCkgYWRkIGV4dHJhIGxheWVycyBvZiBwcm90ZWN0aW9uLiAoZS5nLgotICAgZXh0cmEgcGFzc3dvcmRzLCBwYWNrZXQgZmlsdGVyaW5nLCBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLCBldGMpLgotCi0gICBBbHNvLCBpdCBpcyBlYXN5IHRvIG1pc3MgdGhlIHBvaW50IHRoYXQgdW5sZXNzIHByZWNhdXRpb25zIGFyZSB0YWtlbgotICAgdG8gdmVyaWZ5IFNTTCBDZXJ0aWZpY2F0ZXMsIHRoZW4gdGhlIFZOQyBWaWV3ZXIgaXMgdnVsbmVyYWJsZSB0bwotICAgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcyAoYnV0IG5vdCB0byB0aGUgbW9yZSBjb21tb24gcGFzc2l2ZSBzbmlmZmluZwotICAgYXR0YWNrcykuIE5vdGUgdGhhdCB0aGVyZSBhcmUgaGFja2VyIHRvb2xzIGxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kCi0gICBjYWluIHRoYXQgaW1wbGVtZW50IFNTTCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiBUaGV5IHJlbHkgb24gdGhlCi0gICBjbGllbnQgbm90IGJvdGhlcmluZyB0byBjaGVjayB0aGUgY2VydC4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgVGhlIEhvbHkgR3JhaWw6IGEgc2luZ2xlIGh0dHBzIHBvcnQgKDQ0MykKLQotICAgQmVmb3JlIHdlIGRpc2N1c3MgdGhlIHNlbGYtY29udGFpbmVkIGFwYWNoZSBleGFtcGxlcyBoZXJlLCB3ZSB3YW50IHRvCi0gICBtZW50aW9uIHRoYXQgbWFueSB4MTF2bmMgdXNlcnMgd2hvIHJlYWQgdGhpcyBwYWdlIGFuZCBpbXBsZW1lbnQgdGhlCi0gICBhcGFjaGUgU1NMIFZOQyBwb3J0YWwgYXNrIGZvciBzb21ldGhpbmcgdGhhdCAoc28gZmFyKSBzZWVtcyBkaWZmaWN1bHQKLSAgIG9yIGltcG9zc2libGUgdG8gZG8gZW50aXJlbHkgaW5zaWRlIGFwYWNoZToKLSAgICAgKiBBIHNpbmdsZSBwb3J0LCA0NDMgKHRoZSBkZWZhdWx0IGh0dHBzOi8vIHBvcnQpLCBpcyBvcGVuIHRvIHRoZQotICAgICAgIEludGVybmV0Ci0gICAgICogSXQgaXMgSFRUUFMvU1NMIGVuY3J5cHRlZAotICAgICAqIEl0IGhhbmRsZXMgYm90aCBWTkMgdHJhZmZpYyBhbmQgSmF2YSBWTkMgQXBwbGV0IGRvd25sb2Fkcy4KLSAgICAgKiBBbmQgdGhlIHNlcnZlciBjYW4gYWxzbyBzZXJ2ZSBub3JtYWwgSFRUUFMgd2VicGFnZXMsIENHSSwgZXRjLgotCi0gICBJdCBpcyB0aGUgbGFzdCBpdGVtIHRoYXQgbWFrZXMgaXQgdHJpY2t5IChvdGhlcndpc2UgdGhlIG1ldGhvZAotICAgZGVzY3JpYmVkIG9uIHRoaXMgcGFnZSB3aWxsIHdvcmspLiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gc3VjaCBhCi0gICBzb2x1dGlvbiBhbmQgYXJlIHdpbGxpbmcgdG8gcnVuIGEgc2VwYXJhdGUgaGVscGVyIHByb2dyYW0KLSAgIChjb25uZWN0X3N3aXRjaCkgbG9vayBoZXJlLiBBbHNvLCBzZWUgdGhpcyBhcGFjaGUgcGF0Y2guCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEV4YW1wbGU6Ci0KLSAgIFRoZSBzY2hlbWUgZGVzY3JpYmVkIGhlcmUgc2V0cyB1cCBhcGFjaGUgb24gdGhlIGZpcmV3YWxsL2dhdGV3YXkgYXMgYQotICAgcmVndWxhciBXZWIgcHJveHkgaW50byB0aGUgaW50cmFuZXQgYW5kIGFsbG93cyBjb25uZWN0aW9ucyB0byBhIHNpbmdsZQotICAgZml4ZWQgcG9ydCBvbiBhIGxpbWl0ZWQgc2V0IG9mIG1hY2hpbmVzLgotCi0gICBUaGUgY29uZmlndXJhdGlvbiBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGRvZXMgbm90IHVzZSB0aGUgbW9kX3NzbAotICAgYXBhY2hlIG1vZHVsZSAodGhlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uCi0gICAiRG93bmxvYWRpbmcgdGhlIEphdmEgYXBwbGV0IHRvIHRoZSBicm93c2VyIHZpYSBIVFRQUyIgZG9lcyB0YWtlCi0gICBhZHZhbnRhZ2Ugb2YgbW9kX3NzbCkKLQotICAgSW4gdGhpcyBleGFtcGxlIHN1cHBvc2UgdGhlIGdhdGV3YXkgbWFjaGluZSBydW5uaW5nIGFwYWNoZSBpcyBuYW1lZAotICAgInd3dy5nYXRld2F5LmVhc3QiIChlLmcuIGl0IG1heSBhbHNvIHByb3ZpZGUgbm9ybWFsIHdlYiBzZXJ2aWNlKS4gV2UKLSAgIGFsc28gY2hvb3NlIHRoZSBJbnRlcm5ldC1mYWNpbmcgcG9ydCBmb3IgdGhpcyBWTkMgc2VydmljZSB0byBiZSBwb3J0Ci0gICA1NjMuIE9uZSBjb3VsZCBjaG9vc2UgYW55IHBvcnQsIGluY2x1ZGluZyB0aGUgZGVmYXVsdCBIVFRQIHBvcnQgODAuCi0KLSAgIERldGFpbDogV2UgY2hvb3NlIDU2MyBiZWNhdXNlIGl0IGlzIHRoZSByYXJlbHkgdXNlZCBTTkVXUyBwb3J0IHRoYXQgaXMKLSAgIG9mdGVuIGFsbG93ZWQgYnkgV2ViIHByb3hpZXMgZm9yIHRoZSBDT05ORUNUIG1ldGhvZC4gVGhlIGlkZWEgaXMgdGhlCi0gICB1c2VyIG1heSBiZSBjb21pbmcgb3V0IG9mIGFub3RoZXIgZmlyZXdhbGwgdXNpbmcgYSBwcm94eSAobm90IHRoZSBvbmUKLSAgIHdlIGRlc2NyaWJlIGhlcmUsIHRoYXQgaXMsIHRoZSBjYXNlIHdoZW4gdHdvIHByb3hpZXMgYXJlIGludm9sdmVkLAotICAgZS5nLiBvbmUgYXQgd29yayBhbmQgYW5vdGhlciBBcGFjaGUgKGRlc2NyaWJlZCBoZXJlKSBhdCBob21lCi0gICByZWRpcmVjdGluZyBpbnRvIG91ciBmaXJld2FsbDsgdGhlICJkb3VibGUgcHJveHkiIG9yICJkb3VibGUgZmlyZXdhbGwiCi0gICBwcm9ibGVtKS4gVXNpbmcgcG9ydCA1NjMgc2ltcGxpZmllcyB0aGluZ3MgYmVjYXVzZSBDT05ORUNUJ3MgdG8gaXQgYXJlCi0gICB1c3VhbGx5IGFsbG93ZWQgYnkgZGVmYXVsdC4KLQotICAgV2UgYWxzbyBhc3N1bWUgYWxsIG9mIHRoZSB4MTF2bmMgc2VydmVycyBvbiB0aGUgaW50ZXJuYWwgbWFjaGluZXMgYXJlCi0gICBhbGwgbGlzdGVuaW5nIG9uIHBvcnQgNTkxNSAoIi1yZmJwb3J0IDU5MTUiKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0Ci0gICA1OTAwLiBUaGlzIGlzIHRvIGxpbWl0IGFueSB1bmludGVuZGVkIHByb3h5IHJlZGlyZWN0aW9ucyB0byBhIGxlc3NlcgotICAgdXNlZCBwb3J0LCBhbmQgYWxzbyB0byBzdGF5IG91dCBvZiB0aGUgd2F5IG9mIG5vcm1hbCBWTkMgc2VydmVycyBvbgotICAgdGhlIHNhbWUgbWFjaGluZXMuIE9uZSBjb3VsZCBvYnZpb3VzbHkgaW1wbGVtZW50IGEgc2NoZW1lIHRoYXQgaGFuZGxlcwotICAgZGlmZmVyZW50IHBvcnRzLCBidXQgd2UganVzdCBkaXNjdXNzIHRoaXMgc2ltcGxlIHNldHVwIGhlcmUuCi0KLSAgIFNvIHdlIGJhc2ljYWxseSBhc3N1bWUgeDExdm5jIGhhcyBiZWVuIHN0YXJ0ZWQgdGhpcyB3YXkgb24gYWxsIG9mIHRoZQotICAgd29ya3N0YXRpb25zIHRvIGJlIGdyYW50ZWQgVk5DIGFjY2VzczoKLSAgeDExdm5jIC1zc2wgU0FWRSAtaHR0cCAtZGlzcGxheSA6MCAtZm9yZXZlciAtcmZiYXV0aCB+Ly52bmMvcGFzc3dkIC1yZmJwb3J0IDUKLTkxNQotCi0gICBpLmUuIHdlIGZvcmNlIFNTTCBWTkMgY29ubmVjdGlvbnMsIHBvcnQgNTkxNSwgc2VydmUgdGhlIEphdmEgVk5DCi0gICB2aWV3ZXIgYXBwbGV0LCBhbmQgcmVxdWlyZSBhIFZOQyBwYXNzd29yZCAoYW5vdGhlciBvcHRpb24gd291bGQgYmUKLSAgIC11bml4cHcpLiBUaGUgYWJvdmUgY29tbWFuZCBjb3VsZCBhbHNvIGJlIHJ1biBvdXQgb2YgaW5ldGQoOCkuIEl0IGNhbgotICAgYWxzbyBiZSB1c2VkIHRvIGF1dG9kZXRlY3QgdGhlIHVzZXIncyBkaXNwbGF5IGFuZCBYYXV0aG9yaXR5IGRhdGEuCi0KLQotICAgVGhlc2Ugc2VjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBodHRwZC5jb25mIGFwYWNoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgIG9uIHd3dy5nYXRld2F5LmVhc3Q6Ci0KLSMgSW4gdGhlIGdsb2JhbCBzZWN0aW9uIHlvdSBuZWVkIHRvIGVuYWJsZSB0aGVzZSBtb2R1bGVzLgotIyBOb3RlIHRoYXQgdGhlIE9SREVSIE1BVFRFUlMhIG1vZF9yZXdyaXRlIG11c3QgYmUgYmVmb3JlIG1vZF9wcm94eQotIyAoc28gdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIGFsbG93ZWQgaG9zdCBsaXN0IHZpYSByZXdyaXRlKQotIwotTG9hZE1vZHVsZSByZXdyaXRlX21vZHVsZSBtb2R1bGVzL21vZF9yZXdyaXRlLnNvCi1Mb2FkTW9kdWxlIHByb3h5X21vZHVsZSBtb2R1bGVzL21vZF9wcm94eS5zbwotTG9hZE1vZHVsZSBwcm94eV9jb25uZWN0X21vZHVsZSBtb2R1bGVzL21vZF9wcm94eV9jb25uZWN0LnNvCi1Mb2FkTW9kdWxlIHByb3h5X2Z0cF9tb2R1bGUgbW9kdWxlcy9tb2RfcHJveHlfZnRwLnNvCi1Mb2FkTW9kdWxlIHByb3h5X2h0dHBfbW9kdWxlIG1vZHVsZXMvbW9kX3Byb3h5X2h0dHAuc28KLTxJZkRlZmluZSBTU0w+Ci1Mb2FkTW9kdWxlIHNzbF9tb2R1bGUgbW9kdWxlcy9tb2Rfc3NsLnNvCi08L0lmRGVmaW5lPgotCi0KLSMgTmVhciB0aGUgYm90dG9tIG9mIGh0dHBkLmNvbmYgeW91IHB1dCB0aGUgcG9ydCA1NjMgdmlydHVhbCBob3N0OgotCi1MaXN0ZW4gNTYzCi0KLTxWaXJ0dWFsSG9zdCAqOjU2Mz4KLQotICAgIyBBbGxvdyBwcm94eSBDT05ORUNUIHJlcXVlc3RzICpvbmx5KiB0byBwb3J0IDU5MTUuCi0gICAjIElmIHRoZSBtYWNoaW5lcyB1c2UgZGlmZmVyZW50IHBvcnRzLCBlLmcuIDU5MTYgbGlzdCB0aGVtIGhlcmUgYXMgd2VsbDoKLSAgICMKLSAgIFByb3h5UmVxdWVzdHMgT24KLSAgIEFsbG93Q09OTkVDVCA1OTE1Ci0KLSAgIFJld3JpdGVFbmdpbmUgT24KLQotICAgIyBDb252ZW5pZW5jZSBydWxlcyB0byBleHBhbmQgYXBwbGV0IHBhcmFtZXRlcnMuICBUaGVzZSBkbyBub3QgaGF2ZSBhIHRyYWlsaQotbmcgIi8iCi0gICAjCi0gICAjIC92bmMgICBmb3IgaHR0cCBqYXIgZmlsZSBkb3dubG9hZGluZzoKLSAgICMKLSAgIFJld3JpdGVSdWxlIC92bmMvKFteL10rKSQgICAgICAgICAgICAgICAvdm5jLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSBbUixORSxMXQotICAgUmV3cml0ZVJ1bGUgL3ZuYy90cnVzdC8oW14vXSspJCAgICAgICAgIC92bmMvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JDErNTkxNSZQTwotUlQ9NTYzJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxJnRydXN0QWxsVm5jQ2VydHM9eWVzIFtSLE5FLExdCi0gICBSZXdyaXRlUnVsZSAvdm5jL3Byb3h5LyhbXi9dKykkICAgICAgICAgL3ZuYy8kMS9wcm94eS52bmM/Q09OTkVDVD0kMSs1OTE1JlBPCi1SVD01NjMmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEmZm9yY2VQcm94eT15ZXMgW1IsTkUsTF0KLSAgIFJld3JpdGVSdWxlIC92bmMvdHJ1c3QvcHJveHkvKFteL10rKSQgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyZ0cnVzdEFsbFZuY0NlcnRzPXllcyBbUixORSxMXQotCi0gICAjIFJlYWQgaW4gdGhlIGFsbG93ZWQgaG9zdCB0byB2bmMgZGlzcGxheSBtYXBwaW5nIGZpbGUuICBJdCBsb29rcyBsaWtlOgotICAgIwotICAgIyAgIGhvc3QxICAgICAxNQotICAgIyAgIGhvc3QyICAgICAxNQotICAgIyAgIC4uLgotICAgIwotICAgIyB0aGUgZGlzcGxheSAiMTUiIG1lYW5zIDU4MTUgZm9yIGh0dHAgYXBwbGV0IGRvd25sb2FkLCA1OTE1IGZvciBTU0wgdm5jLgotICAgIwotICAgUmV3cml0ZU1hcCB2bmNob3N0cyB0eHQ6L2Rpc3QvYXBhY2hlL2NvbmYvdm5jLmhvc3RzCi0KLSAgICMgUHJveHk6IGNoZWNrIGZvciB0aGUgQ09OTkVDVCBob3N0bmFtZSBhbmQgcG9ydCBiZWluZyBpbiB0aGUgdm5jLmhvc3RzIGxpc3QKLS4KLSAgICMKLSAgIFJld3JpdGVDb25kICV7VEhFX1JFUVVFU1R9IF5DT05ORUNUIFtOQ10KLSAgIFJld3JpdGVDb25kICV7UkVRVUVTVF9VUkl9IF4oLiopOiguKikkCi0gICBSZXdyaXRlQ29uZCAke3ZuY2hvc3RzOiUxfE5PVEZPVU5EfSBOT1RGT1VORAotICAgUmV3cml0ZVJ1bGUgXi4qJCAvVk5DRkFJTCBbRixMXQotCi0gICBSZXdyaXRlQ29uZCAle1RIRV9SRVFVRVNUfSBeQ09OTkVDVCBbTkNdCi0gICBSZXdyaXRlQ29uZCAle1JFUVVFU1RfVVJJfSBeKC4qKTooLiopJAotICAgUmV3cml0ZUNvbmQgNTkke3ZuY2hvc3RzOiUxfT0lMiAhXiguKik9KFwxKSQKLSAgIFJld3JpdGVSdWxlIF4uKiQgL1ZOQ0ZBSUwgW0YsTF0KLQotCi0gICAjIFJlbWFwIC92bmMgdG8gdGhlIHByb3h5IGh0dHAgZG93bmxvYWQgKGUuZy4gaHR0cDovL2hvc3Q6NTgxNSkKLSAgICMKLSAgICMgRmlyc3QsIGZhaWwgaWYgaXQgc3RhcnRzIHdpdGggdGhlIHN0cmluZyAvdm5jMDoKLSAgICMKLSAgIFJld3JpdGVSdWxlIF4vdm5jMC4qICAgICAgICAgICAgL1ZOQ0ZBSUwgW0YsTF0KLSAgICMKLSAgICMgTmV4dCwgbWFwIHRoZSBwcmVmaXggdG8gL3ZuYzAvaG9zdDpwcm90b2NvbDpwb3J0Ci0gICAjCi0gICBSZXdyaXRlUnVsZSBeL3ZuYy8oW14vXSspLyguKikgIC92bmMwLyQxOmh0dHA6NTgke3ZuY2hvc3RzOiQxfE5PVEZPVU5EfS8kMgotW05FXQotICAgIwotICAgIyBEcm9wIGFueSBub3QgZm91bmQ6Ci0gICAjCi0gICBSZXdyaXRlUnVsZSBeL3ZuYzAuKk5PVEZPVU5ELiogIC9WTkNGQUlMIFtGLExdCi0KLSAgICMgQ29uc3RydWN0IHRoZSBwcm94eSBVUkwgYW5kIHJldHJpZXZlIGl0OgotICAgIwotICAgUmV3cml0ZVJ1bGUgXi92bmMwLyhbXi9dKyk6KFteL10rKTooW14vXSspLyguKikgJDI6Ly8kMTokMy8kNCBbUCxORSxMXQotCi08L1ZpcnR1YWxIb3N0PgotCi0gICBUaGVuIHJlc3RhcnQgYXBhY2hlIChwZXJoYXBzOiAiYXBhY2hlY3RsIHN0b3A7IGFwYWNoZWN0bCBzdGFydCIpLgotCi0gICBOb3RlIHRoYXQgdGhlIGxpc3Rpbmcgb2YgYWxsb3dlZCBpbnRlcm5hbCB3b3Jrc3RhdGlvbnMgaXMgZG9uZSBpbiBhbgotICAgZXh0ZXJuYWwgZmlsZSAoL2Rpc3QvYXBhY2hlL2NvbmYvdm5jLmhvc3RzIGluIHRoZSBleGFtcGxlIGFib3ZlKSwgdGhlCi0gICBmb3JtYXQgaXMgbGlrZSB0aGlzOgotIyBhbGxvd2VkIHZuYyBob3N0cyBmaWxlOgotaG9zdG5hbWUxICAxNQotaG9zdG5hbWUyICAxNQotLi4uCi0KLSAgIFlvdSBsaXN0IHRoZSBob3N0bmFtZSBhbmQgdGhlIFZOQyBkaXNwbGF5IChhbHdheXMgMTUgaW4gb3VyIGV4YW1wbGUpLgotICAgT25seSB0byB0aGVzZSBob3N0cyB3aWxsIHRoZSBleHRlcm5hbCBWTkMgdmlld2VycyBiZSBhYmxlIHRvIGNvbm5lY3QKLSAgIHRvICh2aWEgdGhlIEhUVFAgQ09OTkVDVCBtZXRob2QpLgotCi0gICBUaGUgYWJvdmUgc2V0dXAgcmVxdWlyZXMgbW9kX3Jld3JpdGUgYW5kIG1vZF9wcm94eSBiZSBlbmFibGVkIGluIHRoZQotICAgYXBhY2hlIHdlYiBzZXJ2ZXIuIEluIHRoaXMgZXhhbXBsZSB0aGV5IGFyZSBsb2FkZWQgYXMgbW9kdWxlcyAoYW5kCi0gICBub3RlIHRoYXQgbW9kX3Jld3JpdGUgbXVzdCBiZSBsaXN0ZWQgYmVmb3JlIG1vZF9wcm94eSk7Ci0KLSAgIFRoZSB1c2VyIGF0IHRoZSBKYXZhIGVuYWJsZWQgV2ViIGJyb3dzZXIgd291bGQgc2ltcGx5IGVudGVyIHRoaXMgVVJMCi0gICBpbnRvIHRoZSBicm93c2VyOgotICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Q6NTYzL3ZuYy9ob3N0MgotCi0gICB0byBjb25uZWN0IHRvIGludGVybmFsIHdvcmtzdGF0aW9uIGhvc3QyLCBldGMuCi0KLSAgIEltcG9ydGFudDogZG8gbm90IHB1dCBhIHRyYWlsaW5nICIvIiBvbiB0aGUgVVJMLCBzaW5jZSB0aGF0IHdpbGwKLSAgIGRlZmVhdCB0aGUgUmV3cml0ZVJ1bGVzIHRoYXQgbG9vayBmb3IgdGhlIGhvc3RuYW1lIGF0IHRoZSB2ZXJ5IGVuZC4KLQotICAgVGhlcmUgd2lsbCBiZSBhIG51bWJlciBvZiBTU0wgY2VydGlmaWNhdGUsIGV0YywgZGlhbG9ncyBoZSB3aWxsIGhhdmUKLSAgIHRvIHJlc3BvbmQgdG8gaW4gYWRkaXRpb24gdG8gYW55IHBhc3N3b3JkcyBoZSBpcyByZXF1aXJlZCB0byBwcm92aWRlCi0gICAodGhpcyBkZXBlbmRzIG9uIGhvdyB5b3Ugc2V0IHVwIHVzZXIgYXV0aGVudGljYXRpb24gZm9yIHgxMXZuYykuCi0KLSAgIElmIGEgc2Vjb25kIFdlYiBwcm94eSBpcyBpbnZvbHZlZCAoaS5lLiB0aGUgdXNlcidzIGJyb3dzZXIgaXMgaW5zaWRlCi0gICBhbm90aGVyIGZpcmV3YWxsIGFuZCBwb2xpY3kgcmVxdWlyZXMgdXNpbmcgYSBXZWIgcHJveHkgc2VydmVyKSB0aGVuCi0gICB1c2UgdGhpcyBVUkw6Ci0gICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdDo1NjMvdm5jL3Byb3h5L2hvc3QyCi0KLSAgIFRoaXMgd2lsbCBpbnZvbHZlIGRvd25sb2FkaW5nIGEgc2lnbmVkIGphdmEgdmlld2VyIGFwcGxldCBqYXIgZmlsZQotICAgdGhhdCBpcyBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlIGludGVybmFsIHByb3h5IGZvciB0aGUgVk5DCi0gICBjb25uZWN0aW9uLiBTZWUgdGhpcyBGQVEgZm9yIG1vcmUgaW5mbyBvbiBob3cgdGhpcyB3b3Jrcy4gTm90ZToKLSAgIHNvbWV0aW1lcyB3aXRoIHRoZSBQcm94eSBjYXNlIGlmIHlvdSBzZWUgJ0JhZCBHYXRld2F5JyBlcnJvciB5b3Ugd2lsbAotICAgaGF2ZSB0byB3YWl0IDEwIG9yIHNvIHNlY29uZHMgYW5kIHRoZW4gaGl0IHJlbG9hZC4gVGhpcyBzZWVtcyB0byBiZQotICAgZHVlIHRvIGhhdmluZyB0byB3YWl0IGZvciBhIENvbm5lY3Rpb24gS2VlcGFsaXZlIHRvIHRlcm1pbmF0ZS4uLgotCi0gICBGb3IgY29tcGxldGVuZXNzLCB0aGUgInRydXN0IiBjYXNlcyB0aGF0IHNraXAgYSBWTkMgY2VydGlmaWNhdGUgZGlhbG9nCi0gICAoZGlzY3Vzc2VkIGJlbG93KSB3b3VsZCBiZSBlbnRlcmVkIGFzOgotICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Q6NTYzL3ZuYy90cnVzdC9ob3N0MgotICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Q6NTYzL3ZuYy90cnVzdC9wcm94eS9ob3N0MgotCi0gICBZb3UgY2FuIG9mIGNvdXJzZSBjaG9vc2Ugc2hvcnRlciBvciBtb3JlIGVhc3kgdG8gcmVtZW1iZXIgVVJMIGZvcm1hdHMuCi0gICBKdXN0IGNoYW5nZSB0aGUgQ29udmVuaWVuY2UgUmV3cml0ZVJ1bGVzIGluIGh0dHBkLmNvbmYuCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgUG9ydCBWYXJpYXRpb25zOgotCi0gICBOb3RlIHRoYXQgeW91IGNhbiBydW4gdGhpcyBvbiB0aGUgZGVmYXVsdCBIVFRQIHBvcnQgODAgaW5zdGVhZCBvZiBwb3J0Ci0gICA1NjMuIElmIHlvdSBkbyBub3QgZXhwZWN0IHRvIGhhdmUgYSBicm93c2VyIGNvbm5lY3RpbmcgZnJvbSBpbnNpZGUgYQotICAgcHJveHlpbmcgZmlyZXdhbGwgKHdoZXJlIHNvbWV0aW1lcyBvbmx5IGNvbm5lY3Rpb25zIHRvIHBvcnRzIDQ0MyBhbmQKLSAgIDU2MyBhcmUgYWxsb3dlZCkgdGhpcyBzaG91bGQgYmUgZmluZS4gVXNlICI4MCIgaW5zdGVhZCBvZiAiNTYzIiBpbiB0aGUKLSAgIGh0dHBkLmNvbmYgY29uZmlnIGZpbGUgKHlvdSBtYXkgbmVlZCB0byBtZXJnZSBpdCB3aXRoIG90aGVyIGRlZmF1bHQKLSAgIHBvcnQgODAgdGhpbmdzIHlvdSBoYXZlIHRoZXJlKS4KLQotICAgVGhlbiB0aGUgVVJMJ3Mgd2lsbCBiZSBhIGJpdCBzaW1wbGVyOgotICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Qvdm5jL2hvc3QyCi0gICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdC92bmMvdHJ1c3QvaG9zdDIKLQotICAgZXRjLgotCi0gICBCZXNpZGVzIDgwIG9uZSBjb3VsZCB1c2UgYW55IG90aGVyIHJhbmRvbSBwb3J0IG51bWJlciAoc2luY2UgdGhlcmUgYXJlCi0gICBzbyBtYW55IHBvcnQgc2NhbnMgb24gODAsIGEgbGl0dGxlIG9ic2N1cml0eSBtaWdodCBiZSB1c2VmdWwpLgotCi0gICBPbmUgb3B0aW9uIGlzIHRvIHVzZSBwb3J0ICI0NDMiICh0aGUgZGVmYXVsdCBodHRwczovLyBwb3J0KSBpbnN0ZWFkIG9mCi0gICAiNTYzIi4gSW4gdGhpcyBjYXNlIEFwYWNoZSBpcyBub3QgY29uZmlndXJlZCBmb3IgbW9kX3NzbDsgd2UganVzdAotICAgaGFwcGVuIHRvIHVzZSBwb3J0ICI0NDMiIGluIHRoZSB3YXkgYW55IHJhbmRvbSBwb3J0IHdvdWxkIGJlIHVzZWQuCi0gICBUaGlzIGNvdWxkIGJlIGhhbmR5IGlmIHRoZSBWaWV3ZXIgc2lkZSBlbnZpcm9ubWVudCBpcyByZXN0cmljdGl2ZSBpbgotICAgdGhhdCBpdCBvbmx5IGFsbG93cyBvdXRnb2luZyBjb25uZWN0aW9ucyB0byBwb3J0cyA4MCBhbmQgNDQzIChhbmQsCi0gICBzYXksIHlvdSBkaWRuJ3Qgd2FudCB0byB1c2UgcG9ydCA4MCwgb3IgeW91IHdhbnRlZCB0byB1c2UgODAgZm9yCi0gICBzb21ldGhpbmcgZWxzZSkuIEFub3RoZXIgcmVhc29uIGZvciB1c2luZyA0NDMgd291bGQgYmUgc29tZSB3ZWIgcHJveHkKLSAgIGVudmlyb25tZW50cyBvbmx5IGFsbG93IHRoZSBDT05ORUNUIG1ldGhvZCB0byBnbyB0byBwb3J0IDQ0MyAoYW5kIG5vdAotICAgZXZlbiB0aGUgY2FzZSA1NjMgd2UgdXNlIGFib3ZlKS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBEZXRhaWxzOgotCi0gICBMZXQncyBnbyB0aHJvdWdoIHRoZSBodHRwZC5jb25mIGFkZGl0aW9ucyBpbiBkZXRhaWwgZnJvbSB0aGUgdG9wLgotCi0gICBUaGUgTG9hZE1vZHVsZXMgZGlyZWN0aXZlcyBsb2FkIHRoZSBuZWNlc3NhcnkgYXBhY2hlIG1vZHVsZXMuIE5vdGUKLSAgIHRoYXQgbW9kX3Jld3JpdGUgbXVzdCBiZSBsaXN0ZWQgZmlyc3QuIElmIHlvdSBhcmUgY29tcGlsaW5nIGZyb20KLSAgIHNjcmF0Y2ggc29tZXRoaW5nIGxpa2UgdGhpcyB3b3JrZWQgZm9yIHVzOgotICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1wcm94eT1zaGFyZWQgLS1lbmFibGUtcHJveHktY29ubmVjdD1zaGFyZWQgLS1lbmFibGUtc3NsPQotc2hhcmVkIC0tZW5hYmxlLXJld3JpdGU9c2hhcmVkIC0tcHJlZml4PS9kaXN0L2FwYWNoZQotCi0gICBUaGVuIHRoZSBWaXJ0dWFsSG9zdCAqOjU2MyB2aXJ0dWFsIGhvc3Qgc2VjdGlvbiBzdGFydHMuCi0KLSAgIFRoZSAiUHJveHlSZXF1ZXN0cyBPbiIgYW5kICJBbGxvd0NPTk5FQ1QgNTkxNSIgZW5hYmxlIHRoZSB3ZWIgc2VydmVyCi0gICB0byBmb3J3YXJkIHByb3h5IHJlcXVlc3RzIHRvIHBvcnQgNTkxNSAoYW5kIG9ubHkgdGhpcyBwb3J0KSBJTlNJREUgdGhlCi0gICBmaXJld2FsbC4gVGhpbmsgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIHRob3JvdWdobHkgYW5kIHRlc3QgaXQKLSAgIGNhcmVmdWxseS4KLQotICAgVGhlIFJld3JpdGVSdWxlJ3MgYXJlIGZvciBjb252ZW5pZW5jZSBvbmx5IHNvIHRoYXQgdGhlIFVSTCBlbnRlcmVkCi0gICBpbnRvIHRoZSBXZWIgYnJvd3NlciBkb2VzIG5vdCBuZWVkIHRoZSB2YXJpb3VzIGV4dHJhIHBhcmFtZXRlcnMsIGUuZy46Ci0gICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdDo1NjMvdm5jL2hvc3QyL2luZGV4LnZuYz9DT05ORUNUPWhvc3QyKzU5MTUmUE9SVD01NjMsCi1ibGFoLGJsYWguLi4KLQotICAgKG9yIG90aGVyd2lzZSBtYWtlIGRpcmVjdCBlZGl0cyB0byBpbmRleC52bmMgdG8gc2V0IHRoZXNlIHBhcmFtZXRlcnMpLgotICAgVGhlIGZvcmNlUHJveHk9eWVzIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGFwcGxldCB0byBmb3JjZSB0aGUgdXNlCi0gICBvZiBhIG91dGdvaW5nIHByb3h5IHNvY2tldCBjb25uZWN0aW9uLiBVc2UgaXQgb25seSBpZiB0aGUgV2ViIGJyb3dzZXIKLSAgIGlzIGluc2lkZSBhIHNlcGFyYXRlIFdlYiBwcm94eWluZyBlbnZpcm9ubWVudCAoaS5lLiBsYXJnZSBjb3Jwb3JhdGlvbikKLQotICAgVGhlIHJld3JpdGVzIHdpdGggcGFyYW1ldGVyIHVybFByZWZpeCBhcmUgZGVzY3JpYmVkIHVuZGVyIFRyaWNrcyBmb3IKLSAgIEJldHRlciBSZXNwb25zZS4gVGhlICJ0cnVzdCIgb25lcyAoYWxzbyBkZXNjcmliZWQgdW5kZXIgVHJpY2tzKSB3aXRoCi0gICB0cnVzdEFsbFZuY0NlcnRzIHRlbGwgdGhlIEphdmEgVk5DIGFwcGxldCB0byBza2lwIGEgZGlhbG9nIGFza2luZwotICAgYWJvdXQgdGhlIFZOQyBDZXJ0aWZpY2F0ZS4gVGhleSBhcmUgYSBiaXQgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmxlCi0gICB0aGFuIHRoZSBvcmlnaW5hbCBtZXRob2QuIEluIHRoZSBiZXN0IHNpdHVhdGlvbiB0aGV5IGxlYWQgdG8gYmVpbmcKLSAgIGxvZ2dlZCBpbiAyMCBzZWNvbmRzIG9yIGxlc3MgKHdpdGhvdXQgdGhlbSB0aGUgdGltZSB0byBsb2dpbiBjYW4gYmUKLSAgIG11Y2ggbG9uZ2VyIHNpbmNlIGEgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG11c3QgdGltZW91dCkuCi0KLSAgIEFsbCBvZiB0aGUgeDExdm5jIEphdmEgVmlld2VyIGFwcGxldCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlCi0gICBmaWxlIGNsYXNzZXMvc3NsL1JFQURNRQotCi0gICBUaGUgZXh0ZXJuYWwgZmlsZSAvZGlzdC9hcGFjaGUvY29uZi92bmMuaG9zdHMgY29udGFpbmluZyB0aGUgYWxsb3dlZAotICAgVk5DIHNlcnZlciBob3N0bmFtZXMgaXMgcmVhZCBpbi4gSXRzIDJuZCBjb2x1bW4gY29udGFpbnMgdGhlIFZOQwotICAgZGlzcGxheSBvZiB0aGUgaG9zdCAoYWx3YXlzIDE1IGluIG91ciBleGFtcGxlOyBpZiB5b3UgbWFrZSBpdCB2YXJ5IHlvdQotICAgd2lsbCBuZWVkIHRvIGFkanVzdCBzb21lIGxpbmVzIGluIHRoZSBodHRwZC5jb25mIGFjY29yZGluZ2x5LCBlLmcuCi0gICBBbGxvd0NPTk5FQ1QpLiBUaGlzIGxpc3QgaXMgdXNlZCB0byBjb25zdHJhaW4gYm90aCB0aGUgSmFyIGZpbGUKLSAgIGRvd25sb2FkIFVSTCBhbmQgdGhlIHByb3h5IENPTk5FQ1QgdGhlIFZOQyB2aWV3ZXIgbWFrZXMgdG8gb25seSB0aGUKLSAgIGludGVuZGVkIFZOQyBzZXJ2ZXJzLgotCi0gICBMaW1pdGluZyB0aGUgcHJveHkgQ09OTkVDVCBpcyBkb25lIHdpdGggdGhlIHR3byBzZXRzIG9mIFJld3JpdGVDb25kCi0gICBjb25kaXRpb25zLgotCi0gICBMaW1pdGluZyB0aGUgSmFyIGZpbGUgZG93bmxvYWQgVVJMIGlzIGRvbmUgaW4gdGhlIHJlbWFpbmluZyA0Ci0gICBSZXdyaXRlUnVsZSdzLgotCi0gICBOb3RlIHRoYXQgdGhlc2UgaW5kZXgudm5jIGFuZCBWbmNWaWV3ZXIuamFyIGRvd25sb2FkcyB0byB0aGUgYnJvd3NlcgotICAgYXJlIG5vdCBlbmNyeXB0ZWQgdmlhIFNTTCwgYW5kIHNvIGluIHByaW5jaXBsZSBjb3VsZCBiZSB0YW1wZXJlZCB3aXRoCi0gICBieSBhIHJlYWxseSBiYWQgZ3V5LiBUaGUgc3Vic2VxdWVudCBWTkMgY29ubmVjdGlvbiwgaG93ZXZlciwgaXMKLSAgIGVuY3J5cHRlZCB0aHJvdWdoIGEgc2luZ2xlIFNTTCBjb25uZWN0aW9uIChpdCBtYWtlcyBhIENPTk5FQ1Qgc3RyYWlnaHQKLSAgIHRvIHgxMXZuYykuIFNlZSBiZWxvdyBmb3IgaG93IHRvIGhhdmUgdGhlc2UgaW5pdGlhbCBkb3dubG9hZHMKLSAgIGVuY3J5cHRlZCBhcyB3ZWxsIChpZiB0aGUgYXBhY2hlIHdlYiBzZXJ2ZXIgaGFzIFNTTC9tb2Rfc3NsLCBpLmUuCi0gICBodHRwcywgZW5hYmxlZCBhbmQgY29uZmlndXJlZCkuCi0KLSAgIFVuZm9ydHVuYXRlbHkgdGhlIEphdmEgVk5DIHZpZXdlciBhcHBsZXQgY3VycmVudGx5IGlzIG5vdCBhYmxlIHRvIHNhdmUKLSAgIGl0cyBvd24gbGlzdCBvZiBDZXJ0aWZpY2F0ZXMgKGUuZy4gdGhlIHVzZXIgc2F5cyB0cnVzdCB0aGlzIFZOQwotICAgY2VydGlmaWNhdGUgJ2Fsd2F5cycpLiBUaGlzIGlzIGJlY2F1c2UgYW4gYXBwbGV0IGl0IGNhbm5vdCBvcGVuIGxvY2FsCi0gICBmaWxlcywgZXRjLiBTYWRseSwgdGhlIGFwcGxldCBjYW5ub3QgZXZlbiByZW1lbWJlciBjZXJ0aWZpY2F0ZXMgaW4gdGhlCi0gICBzYW1lIGJyb3dzZXIgc2Vzc2lvbiBiZWNhdXNlIGl0IGlzIGNvbXBsZXRlbHkgcmVpbml0aWFsaXplZCBmb3IgZWFjaAotICAgY29ubmVjdGlvbiAoc2VlIGJlbG93KS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBUb28gTXVjaD8KLQotICAgSWYgdGhlc2UgYXBhY2hlIHJ1bGVzIGFyZSBhIGxpdHRsZSB0b28gbXVjaCBmb3IgeW91LCB0aGVyZSBpcyBhIGxpdHRsZQotICAgYml0IHNpbXBsZXIgc2NoZW1lIHdoZXJlIHlvdSBoYXZlIHRvIGxpc3QgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbAotICAgbWFjaGluZXMgaW4gdGhlIGh0dHBkLmNvbmYgYW5kIHNzbC5jb25mIGZpbGVzLiBJdCBtYXkgYmUgYSBsaXR0bGUgbW9yZQotICAgdHlwaW5nIHRvIG1haW50YWluLCBidXQgcGVyaGFwcyBiZWluZyBtb3JlIHN0cmFpZ2h0IGZvcndhcmQgKGxlc3MKLSAgIFJld3JpdGVSdWxlJ3MpIGlzIGRlc2lyYWJsZS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBQcm9ibGVtcz8KLQotICAgVG8gc2VlIGV4YW1wbGUgeDExdm5jIG91dHB1dCBmb3IgYSBzdWNjZXNzZnVsIGh0dHBzOi8vaG9zdDo1OTAwLwotICAgY29ubmVjdGlvbiB3aXRoIHRoZSBKYXZhIEFwcGxldCBzZWUgVGhpcyBQYWdlLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFNvbWUgSWRlYXMgZm9yIGFkZGluZyBleHRyYSBhdXRoZW50aWNhdGlvbiwgZXRjLiBmb3IgdGhlIHBhcmFub2lkOgotICAgICAqIFZOQyBwYXNzd29yZHM6IC1yZmJhdXRoLCAtcGFzc3dkZmlsZSwgb3IgLXVzZXB3LiBFdmVuIGFkZGluZyBhCi0gICAgICAgc2ltcGxlIGNvbXBhbnktd2lkZSBWTkMgcGFzc3dvcmQgaGVscHMgYmxvY2sgdW53YW50ZWQgYWNjZXNzLgotICAgICAqIFVuaXggcGFzc3dvcmRzOiAtdW5peHB3Ci0gICAgICogU1NMIENsaWVudCBjZXJ0aWZpY2F0ZXM6IC1zc2x2ZXJpZnkKLSAgICAgKiBBcGFjaGUgQXV0aFVzZXJGaWxlIGRpcmVjdGl2ZTogLmh0YWNjZXNzLCBldGMuCi0gICAgICogRmlsdGVyIGNvbm5lY3Rpb25zIGJhc2VkIG9uIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuCi0gICAgICogVXNlIFBvcnQta25vY2tpbmcgb24geW91ciBmaXJld2FsbCBhcyBkZXNjcmliZWQgaW46IEVuaGFuY2VkCi0gICAgICAgVGlnaHRWTkMgVmlld2VyIChzc3ZuYykuCi0gICAgICogQWRkIHByb3h5IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIChyZXF1aXJlcyBWaWV3ZXIgY2hhbmdlcz8pCi0gICAgICogUnVuIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgQXBhY2hlIHRoYXQgcHJvdmlkZXMgdGhpcyBWTkMgc2VydmljZQotICAgICAgIHNvIGl0IGNhbiBiZSBicm91Z2h0IHVwIGFuZCBkb3duIGluZGVwZW5kZW50bHkgb2YgdGhlIG5vcm1hbCB3ZWIKLSAgICAgICBzZXJ2ZXIuCi0gICAgICogSG93IHNlY3VyZSBpcyB0aGUgQ2xpZW50IHNpZGU/IFB1YmxpYyBtYWNoaW5lcyBpbiBpbnRlcm5ldCBjYWZlcywKLSAgICAgICBldGMsIGFyZSBvZnRlbiBoYWNrZWQsIHdpdGggYmFja2Rvb3JzIGFuZCBWTkMgc2VydmVycyBvZiB0aGVpcgotICAgICAgIG93bi4gUHJlZmVyIHVzaW5nIHlvdXIgb3duIGZpcmV3YWxsZWQgbGFwdG9wIHRvIGEgcHVibGljIG1hY2hpbmUuCi0KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBVc2luZyBub24tSmF2YSB2aWV3ZXJzIHdpdGggdGhpcyBzY2hlbWU6Ci0KLSAgIFRoZSBzc192bmN2aWV3ZXIgc3R1bm5lbCB3cmFwcGVyIHNjcmlwdCBmb3IgVk5DIHZpZXdlcnMgaGFzIHRoZSAtcHJveHkKLSAgIG9wdGlvbiB0aGF0IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZC4KLSAgIHNzX3ZuY3ZpZXdlciAtcHJveHkgd3d3LmdhdGV3YXkuZWFzdDo1NjMgICBob3N0MToxNQotCi0gICBGb3IgdGhlIGNhc2Ugb2YgdGhlICJkb3VibGUgcHJveHkiIHNpdHVhdGlvbiAoc2VlIGJlbG93KSBzdXBwbHkgYm90aAotICAgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi0gICBzc192bmN2aWV3ZXIgLXByb3h5IHByb3h5MS5mb29iYXIuY29tOjgwODAsd3d3LmdhdGV3YXkuZWFzdDo1NjMgICBob3N0MToxNQotCi0gICBGb3IgdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoc3N2bmMpIEdVSSAoaXQgdXNlcyBzc192bmN2aWV3ZXIgb24KLSAgIFVuaXgpIHB1dCAnaG9zdDE6MTUnIGludG8gdGhlICdWTkMgU2VydmVyJyBlbnRyeSBib3gsIGFuZCBoZXJlIGFyZQotICAgcG9zc2libGUgUHJveHkvR2F0ZXdheSBlbnRyaWVzCi0gICBQcm94eS9HYXRld2F5OiAgIHd3dy5nYXRld2F5LmVhc3Q6NTYzCi0gICBQcm94eS9HYXRld2F5OiAgIHByb3h5MS5mb29iYXIuY29tOjgwODAsd3d3LmdhdGV3YXkuZWFzdDo1NjMKLQotICAgdGhlbiBjbGljayBvbiB0aGUgJ0Nvbm5lY3QnIGJ1dHRvbi4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBEb3dubG9hZGluZyB0aGUgSmF2YSBhcHBsZXQgdG8gdGhlIGJyb3dzZXIgdmlhIEhUVFBTOgotCi0gICBUbyBoYXZlIHRoZSBKYXZhIGFwcGxldCBkb3dubG9hZGVkIHRvIHRoZSB1c2VyJ3MgV2ViIEJyb3dzZXIgdmlhIGFuCi0gICBlbmNyeXB0ZWQgKGFuZCBldmlkZW50bHkgc2FmZXIpIFNTTCBjb25uZWN0aW9uIHRoZSBBcGFjaGUgd2Vic2VydmVyCi0gICBzaG91bGQgYmUgY29uZmlndXJlZCBmb3IgU1NMIHZpYSBtb2Rfc3NsLgotCi0gICBJdCBpcyBhY3R1YWxseSBwb3NzaWJsZSB0byB1c2UgdGhlIHgxMXZuYyBLZXkgTWFuYWdlbWVudCB1dGlsaXR5Ci0gICAiLXNzbEdlbkNlcnQiIHRvIGdlbmVyYXRlIHlvdXIgQXBhY2hlL1NTTCAuY3J0IGFuZCAua2V5IGZpbGVzLiAoSW4KLSAgIGJyaWVmLCBydW4gc29tZXRoaW5nIGxpa2UgIngxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjphcGFjaGUiIHRoZW4KLSAgIGNvcHkgdGhlIHJlc3VsdGluZyBzZWxmOmFwYWNoZS5jcnQgZmlsZSB0byBjb25mL3NzbC5jcnQvc2VydmVyLmNydCBhbmQKLSAgIGV4dHJhY3QgdGhlIHByaXZhdGUga2V5IHBhcnQgZnJvbSBzZWxmOmFwYWNoZS5wZW0gYW5kIHBhc3RlIGl0IGludG8KLSAgIGNvbmYvc3NsLmtleS9zZXJ2ZXIua2V5KS4gU2V0dGluZyB0aGUgZW52IHZhciBSRVFfQVJHUz0nLWRheXMgMTA5NScKLSAgIGJlZm9yZSBydW5uaW5nIHgxMXZuYyB3aWxsIGJ1bXAgdXAgdGhlIGV4cGlyYXRpb24gZGF0ZSAoMyB5ZWFycyBpbgotICAgdGhpcyBjYXNlKS4KLQotICAgT3IgeW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBBcGFjaGUgbW9kX3NzbAotICAgZG9jdW1lbnRhdGlvbiB0byBjcmVhdGUgeW91ciBrZXlzLiBUaGVuIHJlc3RhcnQgQXBhY2hlLCB1c3VhbGx5Ci0gICBzb21ldGhpbmcgbGlrZSAiYXBhY2hlY3RsIHN0b3AiIGZvbGxvd2VkIGJ5ICJhcGFjaGVjdGwgc3RhcnRzc2wiCi0KLSAgIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBzZWN0aW9ucyBpbiBodHRwZC5jb25mIG9uZSBzaG91bGQgYWRkIHRoZQotICAgZm9sbG93aW5nIHRvIHNzbC5jb25mOgotICAgU1NMUHJveHlFbmdpbmUgIE9uCi0KLSAgIFJld3JpdGVFbmdpbmUgT24KLQotICAgIyBDb252ZW5pZW5jZSBydWxlcyB0byBleHBhbmQgYXBwbGV0IHBhcmFtZXRlcnMuICBUaGVzZSBkbyBub3QgaGF2ZSBhIHRyYWlsaQotbmcgIi8iCi0gICAjCi0gICAjIC92bmMgICBodHRwIGphciBmaWxlIGRvd25sb2FkaW5nOgotICAgIwotICAgUmV3cml0ZVJ1bGUgL3ZuYy8oW14vXSspJCAgICAgICAgICAgICAgICAgICAgICAgIC92bmMvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JAotMSs1OTE1JlBPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEgW1IsTkUsTF0KLSAgIFJld3JpdGVSdWxlIC92bmMvcHJveHkvKFteL10rKSQgICAgICAgICAgICAgICAgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQKLTErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxJmZvcmNlUHJveHk9eWVzIFtSLE4KLUUsTF0KLSAgICMKLSAgICMgKHdlIHNraXBwZWQgdGhlICJ0cnVzdCIgb25lcyBhYm92ZSwgcHV0IHRoZW0gaW4gaWYgeW91IGxpa2UpCi0gICAjCi0gICAjIC92bmNzICBodHRwcyBqYXIgZmlsZSBkb3dubG9hZGluZzoKLSAgICMKLSAgIFJld3JpdGVSdWxlIC92bmNzLyhbXi9dKykkICAgICAgICAgICAgICAgICAgICAgIC92bmNzLyQxL2luZGV4LnZuYz9DT05ORUNUPSQKLTErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSBbUixORSxMXQotICAgUmV3cml0ZVJ1bGUgL3ZuY3MvcHJveHkvKFteL10rKSQgICAgICAgICAgICAgICAgL3ZuY3MvJDEvcHJveHkudm5jP0NPTk5FQ1Q9JAotMSs1OTE1JlBPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJmZvcmNlUHJveHk9eWVzIFtSLAotTkUsbF0KLSAgIFJld3JpdGVSdWxlIC92bmNzL3RydXN0LyhbXi9dKykkICAgICAgICAgICAgICAgIC92bmNzLyQxL2luZGV4LnZuYz9DT05ORUNUPSQKLTErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSZ0cnVzdEFsbFZuY0NlcnRzPXkKLWVzIFtSLE5FLExdCi0gICBSZXdyaXRlUnVsZSAvdm5jcy90cnVzdC9wcm94eS8oW14vXSspJCAgICAgICAgICAvdm5jcy8kMS9wcm94eS52bmM/Q09OTkVDVD0kCi0xKzU5MTUmUE9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmZm9yY2VQcm94eT15ZXMmdHJ1Ci1zdEFsbFZuY0NlcnRzPXllcyBbUixORSxMXQotCi0gICAjIENvbnZlbmllbmNlIHJ1bGVzIHVzZWQgZm9yIHRoZSBjb25uZWN0X3N3aXRjaCBoZWxwZXIgKHJlcXVpcmVzIExpc3RlbiAxMjcuCi0wLjAuMTo0NDMgYWJvdmUpOgotICAgIwotICAgUmV3cml0ZVJ1bGUgL3ZuYzQ0My8oW14vXSspJCAgICAgICAgICAgICAgICAgICAgL3ZuY3MvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JAotMSs1OTE1JlBPUlQ9NDQzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxIFtSLE5FLExdCi0gICBSZXdyaXRlUnVsZSAvdm5jNDQzL3Byb3h5LyhbXi9dKykkICAgICAgICAgICAgICAvdm5jcy8kMS9wcm94eS52bmM/Q09OTkVDVD0kCi0xKzU5MTUmUE9SVD00NDMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmZm9yY2VQcm94eT15ZXMgW1IsCi1ORSxMXQotICAgUmV3cml0ZVJ1bGUgL3ZuYzQ0My90cnVzdC8oW14vXSspJCAgICAgICAgICAgICAgL3ZuY3MvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JAotMSs1OTE1JlBPUlQ9NDQzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJnRydXN0QWxsVm5jQ2VydHM9eQotZXMgW1IsTkUsTF0KLSAgIFJld3JpdGVSdWxlIC92bmM0NDMvdHJ1c3QvcHJveHkvKFteL10rKSQgICAgICAgIC92bmNzLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQKLTErNTkxNSZQT1JUPTQ0MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSZmb3JjZVByb3h5PXllcyZ0cnUKLXN0QWxsVm5jQ2VydHM9eWVzIFtSLE5FLExdCi0KLSAgICMgUmVhZCBpbiB0aGUgYWxsb3dlZCBob3N0IHRvIHZuYyBkaXNwbGF5IG1hcHBpbmcgZmlsZS4gIEl0IGxvb2tzIGxpa2U6Ci0gICAjCi0gICAjICAgaG9zdDEgICAgIDE1Ci0gICAjICAgaG9zdDIgICAgIDE1Ci0gICAjICAgLi4uCi0gICAjCi0gICAjIHRoZSBkaXNwbGF5ICIxNSIgbWVhbnMgNTkxNSBmb3IgU1NMIFZOQyBhbmQgNTgxNSBmb3IgaHR0cCBhcHBsZXQgZG93bmxvYWQuCi0gICAjCi0gICBSZXdyaXRlTWFwIHZuY2hvc3RzIHR4dDovZGlzdC9hcGFjaGUvY29uZi92bmMuaG9zdHMKLQotCi0gICAjIFJlbWFwIC92bmMgYW5kIC92bmNzIHRvIHRoZSBwcm94eSBodHRwIGRvd25sb2FkIChlLmcuIGh0dHBzOi8vaG9zdDo1OTE1KQotICAgIwotICAgIyBGaXJzdCwgZmFpbCBpZiBpdCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nIC92bmMwOgotICAgIwotICAgUmV3cml0ZVJ1bGUgXi92bmMwLiogICAgICAgICAgICAvVk5DRkFJTCBbRixMXQotICAgIwotICAgIyBOZXh0LCBtYXAgdGhlIHByZWZpeCB0byAvdm5jMDpob3N0OnByb3RvY29sOnBvcnQKLSAgICMKLSAgIFJld3JpdGVSdWxlIF4vdm5jLyhbXi9dKykvKC4qKSAgL3ZuYzAvJDE6aHR0cDo1OCR7dm5jaG9zdHM6JDF8Tk9URk9VTkR9LyQyCi1bTkVdCi0gICBSZXdyaXRlUnVsZSBeL3ZuY3MvKFteL10rKS8oLiopIC92bmMwLyQxOmh0dHBzOjU5JHt2bmNob3N0czokMXxOT1RGT1VORH0vJDIKLVtORV0KLSAgICMKLSAgICMgRHJvcCBhbnkgbm90IGZvdW5kOgotICAgIwotICAgUmV3cml0ZVJ1bGUgXi92bmMwLipOT1RGT1VORC4qICAvVk5DRkFJTCBbRixMXQotCi0gICAjIENvbnN0cnVjdCB0aGUgcHJveHkgVVJMIGFuZCByZXRyaWV2ZSBpdDoKLSAgICMKLSAgIFJld3JpdGVSdWxlIF4vdm5jMC8oW14vXSspOihbXi9dKyk6KFteL10rKS8oLiopICQyOi8vJDE6JDMvJDQgW1AsTkUsTF0KLQotICAgVGhpcyBpcyBhbGwgaW4gdGhlICI8VmlydHVhbEhvc3QgX2RlZmF1bHRfOjQ0Mz4iIHNlY3Rpb24gb2Ygc3NsLmNvbmYuCi0KLSAgIFRoZSB1c2VyIGNvdWxkIHRoZW4gcG9pbnQgdGhlIFdlYiBCcm93c2VyIHRvOgotICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9ob3N0MgotCi0gICBvcgotICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9wcm94eS9ob3N0MgotCi0gICBmb3IgdGhlICJkb3VibGUgcHJveHkiIGNhc2UuIChJbXBvcnRhbnQ6IGRvIG5vdCBwdXQgYSB0cmFpbGluZyAiLyIgb24KLSAgIHRoZSBVUkwsIHNpbmNlIHRoYXQgd2lsbCBkZWZlYXQgdGhlIFJld3JpdGVSdWxlcy4pCi0KLSAgIEFzIHdpdGggdGhlIGh0dHBkLmNvbmYgY2FzZSwgdGhlIGV4dGVybmFsIGZpbGUKLSAgICgvZGlzdC9hcGFjaGUvY29uZi92bmMuaG9zdHMgaW4gdGhlIGFib3ZlIGV4YW1wbGUpIGNvbnRhaW5zIHRoZQotICAgaG9zdG5hbWVzIG9mIHRoZSBhbGxvd2VkIFZOQyBzZXJ2ZXJzLgotCi0gICBOb3RlIHRoYXQgaW5zaWRlIHRoZSBmaXJld2FsbCB0aGUgSmF2YSBhcHBsZXQgZG93bmxvYWQgdHJhZmZpYyBpcyBub3QKLSAgIGVuY3J5cHRlZCAob25seSBvdmVyIHRoZSBJbnRlcm5ldCBpcyBTU0wgdXNlZCkgZm9yIHRoZXNlIGNhc2VzOgotICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9ob3N0MgotICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9wcm94eS9ob3N0MgotCi0gICBIb3dldmVyIGZvciB0aGUgc3BlY2lhbCAidm5jcyIgcnVsZXMgYWJvdmU6Ci0gICBodHRwczovL3d3dy5nYXRld2F5LmVhc3Qvdm5jcy9ob3N0MgotCi0gICB0aGUgSmF2YSBhcHBsZXQgZG93bmxvYWQgaXMgZW5jcnlwdGVkIHZpYSBTU0wgZm9yIGJvdGggbGVncy4gTm90ZSB0aGF0Ci0gICB0aGUgdHdvIGxlZ3MgYXJlIHR3byBzZXBhcmF0ZSBTU0wgc2Vzc2lvbnMuIFNvIHRoZSBkYXRhIGlzIGRlY3J5cHRlZAotICAgaW5zaWRlIGFuIGFwYWNoZSBwcm9jZXNzIGFuZCByZWVuY3J5cHRlZCBieSB0aGUgYXBhY2hlIHByb2Nlc3MgZm9yIHRoZQotICAgMm5kIFNTTCBzZXNzaW9uIGluc2lkZSB0aGUgc2FtZSBhcGFjaGUgcHJvY2VzcyAoYSB2ZXJ5IHNtYWxsIGdhcCBvbmUKLSAgIG1pZ2h0IG92ZXJsb29rKS4KLQotICAgVGhlICJ2bmNzL3RydXN0IiBvbmVzIGFyZSBsaWtlIHRoZSAidHJ1c3QiIG9uZXMgZGVzY3JpYmVkIGVhcmxpZXIKLSAgIGh0dHBzOi8vd3d3LmdhdGV3YXkuZWFzdC92bmNzL3RydXN0L21hY2gyCi0KLSAgIGFuZCBzaW1pbGFybHkgZm9yIHRoZSBodHRwc1BvcnQgb25lcy4gU2VlIFRyaWNrcyBmb3IgQmV0dGVyIFJlc3BvbnNlLgotCi0gICBJbiBhbGwgb2YgdGhlIGFib3ZlIGNhc2VzIHRoZSBWTkMgdHJhZmZpYyBmcm9tIFZpZXdlciB0byB4MTF2bmMgaXMKLSAgIGVuY3J5cHRlZCBlbmQtdG8tZW5kIGluIGEgc2luZ2xlIFNTTCBzZXNzaW9uLCBldmVuIGZvciB0aGUgImRvdWJsZQotICAgcHJveHkiIGNhc2UgYmVjYXVzZSB0aGUgQ09OTkVDVCBtZXRob2QgaXMgdXNlZCAodGhlcmUgYXJlIGFjdHVhbGx5IHR3bwotICAgQ09OTkVDVCdzIGZvciB0aGUgImRvdWJsZSBwcm94eSIgY2FzZSkuIFRoaXMgcGFydCAodGhlIFZOQyB0cmFmZmljKSBpcwotICAgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgdG8gaGF2ZSBlbmNyeXB0ZWQuCi0KLSAgIE5vdGUgdGhhdCB0aGUgQ2VydGlmaWNhdGUgZGlhbG9ncyB0aGUgdXNlciBoYXMgaW4gaGlzIHdlYiBicm93c2VyIHdpbGwKLSAgIGJlIGZvciB0aGUgQXBhY2hlIENlcnRpZmljYXRlLCB3aGlsZSBmb3IgdGhlIEphdmEgYXBwbGV0IGl0IHdpbGwgYmUKLSAgIHRoZSB4MTF2bmMgY2VydGlmaWNhdGUuCi0KLSAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gaGF2ZSBBcGFjaGUgc2VydmUgdXAgdGhlIEphciBmaWxlIFZuY1ZpZXdlci5qYXIKLSAgIGFuZC9vciBpbmRleC52bmMvcHJveHkudm5jIGluc3RlYWQgb2YgZWFjaCB4MTF2bmMgaWYgeW91IHdhbnQgdG8uCi0KLSAgIFRoZSBydWxlcyBpbiBzc2wuY29uZiBhcmUgc2ltaWxhciB0byB0aGUgb25lcyBpbiBodHRwZC5jb25mIGFuZCBzbyBhcmUKLSAgIG5vdCBkaXNjdXNzZWQgaW4gZGV0YWlsLiBUaGUgb25seSByZWFsbHkgbmV3IHRoaW5nIGlzIHRoZSAvdm5jcwotICAgaGFuZGxpbmcgdG8gZG93bmxvYWQgdGhlIGFwcGxldCBqYXIgdmlhIEhUVFBTIG9uIHBvcnQgNTkxNS4KLQotICAgVGhlIHNwZWNpYWwgZW50cmllcyAiL3ZuYzQ0MyIgYXJlIG9ubHkgdXNlZCBmb3IgdGhlIHNwZWNpYWwgaGVscGVyCi0gICBwcm9ncmFtIChjb25uZWN0X3N3aXRjaCkgZm9yIHRoZSBodHRwcyBwb3J0IDQ0MyBvbmx5IG1vZGUgZGlzY3Vzc2VkCi0gICBoZXJlLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIElORVREIGF1dG9tYXRpb246Ci0KLSAgIFRoZSAic2luZ2xlLXBvcnQiIChpLmUuIDU5MTUpIEhUVFBTIGFwcGxldCBkb3dubG9hZCBhbmQgVk5DIGNvbm5lY3Rpb24KLSAgIGFzcGVjdCBzaG93biBoZXJlIGlzIGNvbnZlbmllbnQgYW5kIGFsc28gZW5hYmxlcyBoYXZpbmcgeDExdm5jIHJ1biBvdXQKLSAgIG9mIGluZXRkLiBUaGF0IHdheSB4MTF2bmMgaXMgcnVuIG9uIGRlbWFuZCBpbnN0ZWFkIG9mIGJlaW5nIHJ1biBhbGwKLSAgIHRoZSB0aW1lICh0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRvIHJlbWVtYmVyIHRvIHN0YXJ0IGl0KS4gVGhlIGZpcnN0Ci0gICBjb25uZWN0aW9ucyB0byBpbmV0ZCBkb3dubG9hZCBpbmRleC52bmMgYW5kIHRoZSBKYXIgZmlsZSAodmlhIGh0dHBzKQotICAgYW5kIHRoZSB0aGUgbGFzdCBjb25uZWN0aW9uIHRvIGluZXRkIGVzdGFibGlzaGVzIHRoZSBTU0wgVk5DCi0gICBjb25uZWN0aW9uLiBTaW5jZSB4MTF2bmMgaXMgcmVzdGFydGVkIGZvciBlYWNoIGNvbm5lY3Rpb24sIHRoaXMgd2lsbAotICAgYmUgYSBiaXQgc2xvd2VyIHRoYW4gdGhlIG5vcm1hbCBwcm9jZXNzLgotCi0gICBGb3IgZXhhbXBsZSwgdGhlIC9ldGMvaW5ldGQuY29uZiBsaW5lIGNvdWxkIGJlOgotICA1OTE1IHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgL3Vzci9sb2NhbC9iaW4veDExdm5jX3NzbC5zaAotCi0gICB3aGVyZSB0aGUgc2NyaXB0IHgxMXZuY19zc2wuc2ggbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKLSMhL2Jpbi9zaAotCi0vdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIC1vYSAvdmFyL2xvZy94MTF2bmMtMTUubG9nIFwKLSAgICAgICAgLXNzbCBTQVZFIC1odHRwIC11bml4cHcgLWxvY2FsaG9zdCBcCi0gICAgICAgIC1kaXNwbGF5IDowIC1hdXRoIC9ob21lL1RIRV9VU0VSLy5YYXV0aG9yaXR5Ci0KLSAgIHdoZXJlLCBhcyB1c3VhbCwgdGhlIGluZXRkIGxhdW5jaGluZyBuZWVkcyB0byBrbm93IHdoaWNoIHVzZXIgaXMKLSAgIHR5cGljYWxseSB1c2luZyB0aGUgZGlzcGxheSBvbiB0aGF0IG1hY2hpbmUuIE9uZSBjb3VsZCBpbWFnaW5lIGdpdmluZwotICAgZGlmZmVyZW50IHVzZXJzIGRpZmZlcmVudCBwb3J0cywgNTkxNSwgNTkxNiwgZXRjLiB0byBkaXN0aW5ndWlzaCAodGhlbgotICAgdGhlIHNjcmlwdCB3b3VsZCBuZWVkIHRvIGJlIHBhc3NlZCB0aGUgdXNlcm5hbWUpLiBtb2RfcmV3cml0ZSBjb3VsZCBiZQotICAgdXNlZCB0byBhdXRvbWF0aWNhbGx5IG1hcCB1c2VybmFtZSBpbiB0aGUgVVJMIHRvIGhpcyBwb3J0IG51bWJlci4KLQotICAgQSBiZXR0ZXIgd2F5IGlzIHRvIHVzZSB0aGUgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRESVNQTEFZIiBmZWF0dXJlIHRvCi0gICBhdXRvZGV0ZWN0IHRoZSB1c2VyIGFuZCBYYXV0aG9yaXR5IGRhdGE6Ci0jIS9iaW4vc2gKLQotL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCAtb2EgL3Zhci9sb2cveDExdm5jLTE1LmxvZyBcCi0gICAgICAgIC1zc2wgU0FWRSAtaHR0cCAtdW5peHB3IC1sb2NhbGhvc3QgLXVzZXJzIHVuaXhwdz0gXAotICAgICAgICAtZmluZAotCi0gICAod2UgaGF2ZSB1c2VkIHRoZSBhbGlhcyAtZmluZCBmb3IgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRESVNQTEFZIi4pCi0gICBUaGlzIHdheSB0aGUgdXNlciBtdXN0IHN1cHBseSBoaXMgVW5peCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYW5kIHRoZW4KLSAgIGhpcyBkaXNwbGF5IGFuZCBYYXV0aG9yaXR5IGRhdGEgb24gdGhhdCBtYWNoaW5lIHdpbGwgYmUgbG9jYXRlZCBhbmQKLSAgIHJldHVybmVkIHRvIHgxMXZuYyB0byBhbGxvdyBpdCB0byBhdHRhY2guIElmIGhlIGRvZXNuJ3QgaGF2ZSBhIGRpc3BsYXkKLSAgIHJ1bm5pbmcgb24gdGhhdCBtYWNoaW5lIG9yIGhlIGZhaWxzIHRvIGxvZyBpbiBjb3JyZWN0bHksIHRoZQotICAgY29ubmVjdGlvbiB3aWxsIGJlIGRyb3BwZWQuCi0KLSAgIFRoZSB2YXJpYW50ICItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSIgKGFsaWFzZWQgYnkKLSAgICItY3JlYXRlIikgd2lsbCBhY3R1YWxseSBjcmVhdGUgYSAodmlydHVhbCBvciByZWFsKSBYIHNlcnZlciBzZXNzaW9uCi0gICBmb3IgdGhlIHVzZXIgaWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gU2VlIGhlcmUgZm9yIGRldGFpbHMuCi0KLSAgIFRvIGVuYWJsZSBpbmV0ZCBvcGVyYXRpb24gZm9yIHRoZSBub24tSFRUUFMgSmF2YSB2aWV3ZXIgZG93bmxvYWQgKHBvcnQKLSAgIDU4MTUgaW4gdGhlIGFib3ZlIGh0dHBkLmNvbmYgZXhhbXBsZSkgeW91IHdpbGwgbmVlZCB0byBydW4geDExdm5jIGluCi0gICBIVFRQT05DRSBtb2RlIG9uIHBvcnQgNTgxNTogRm9yIGV4YW1wbGUsIHRoZSAvZXRjL2luZXRkLmNvbmYgbGluZQotICAgY291bGQgYmU6Ci0gIDU4MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgXAotICAgICAgIC1pbmV0ZCAtcHJvZyAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLW9hIC92YXIvbG9nL3gxMXZuYy0xNS5sb2cgXAotICAgICAgIC1odHRwX3NzbCAtZGlzcGxheSBXQUlUOmNtZD1IVFRQT05DRQotCi0gICB3aGVyZSB0aGUgbG9uZyBpbmV0ZC5jb25mIGxpbmUgaGFzIGJlZW4gc3BsaXQuIE5vdGUgaG93IHRoZSAtaHR0cF9zc2wKLSAgIHRyaWVzIHRvIGF1dG9tYXRpY2FsbHkgZmluZCB0aGUgLi4uL2NsYXNzZXMvc3NsIHN1YmRpcmVjdG9yeS4gVGhpcwotICAgcmVxdWlyZXMgdGhlIC1wcm9nIG9wdGlvbiBhdmFpbGFibGUgaW4geDExdm5jIDAuOC40IChhIHNoZWxsIHNjcmlwdAotICAgd3JhcHBlciwgZS5nLiAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfaHR0cC5zaCBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZAotICAgdGhpcykuCi0KLSAgIEFsc28gbm90ZSB0aGUgdXNlIG9mICItc3NsIFNBVkUiIGFib3ZlLiBUaGlzIHdheSBhIHNhdmVkIHNlcnZlci5wZW0gaXMKLSAgIHVzZWQgZm9yIGVhY2ggaW5ldGQgaW52b2NhdGlvbiAocmF0aGVyIGdlbmVyYXRpbmcgYSBuZXcgb25lIGVhY2ggdGltZQotICAgYXMgaGFwcGVucyBmb3IgIi1zc2wgVE1QIikuIE5vdGUgdGhhdCBpdCBjYW5ub3QgaGF2ZSBhIHByb3RlY3RpbmcKLSAgIHBhc3NwaHJhc2UgYmVjYXVzZSBpbmV0ZCB3aWxsIG5vdCBiZSBhYmxlIHRvIHN1cHBseSBpdC4KLQotICAgQW5vdGhlciBvcHRpb24gaXM6Ci0gIDU4MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgXAotICAgICAgIC1pbmV0ZCAtaHR0cGRpciAvdXNyL2xvY2FsL3NoYXJlL3gxMXZuYy9jbGFzc2VzL3NzbCBcCi0gICAgICAgLW9hIC92YXIvbG9nL3gxMXZuYy0xNS5sb2cgLWRpc3BsYXkgV0FJVDpjbWQ9SFRUUE9OQ0UKLQotICAgKHRoaXMgYWxzbyByZXF1aXJlcyBhIGZlYXR1cmUgZm91bmQgaW4geDExdm5jIDAuOC40KS4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgT3RoZXIgSWRlYXM6Ci0KLSAgIC0gVGhlIGFib3ZlIHNjaGVtZXMgd29yaywgYnV0IHRoZXkgYXJlIGEgYml0IGNvbXBsaWNhdGVkIHdpdGggYWxsIG9mCi0gICB0aGUgcmlnZ2luZy4gVGhlcmUgc2hvdWxkIGJlIG1vcmUgZWxlZ2FudCB3YXlzIHRvIGNvbmZpZ3VyZSBBcGFjaGUgdG8KLSAgIGRvIHRoZXNlLCBidXQgd2UgaGF2ZSBub3QgZm91bmQgdGhlbSAocGxlYXNlIGxldCB1cyBrbm93IGlmIHlvdQotICAgZGlzY292ZXIgc29tZXRoaW5nIG5pY2UpLiBIb3dldmVyLCBvbmNlIHRoaXMgc2NoZW1lIGhhcyBiZWVuIHNldCB1cAotICAgYW5kIGlzIHdvcmtpbmcgaXQgaXMgZWFzeSB0byBtYWludGFpbiBhbmQgYWRkL2RlbGV0ZSB3b3Jrc3RhdGlvbnMsCi0gICBldGMuCi0KLSAgIC0gSW4gZ2VuZXJhbCBBcGFjaGUgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgbWFrZXMgdGhpbmdzIGNvbnZlbmllbnQuCi0gICBUaGUgZmlyZXdhbGwgaXRzZWxmIGNvdWxkIGRvIHRoZSBwb3J0IHJlZGlyZWN0aW9uIHZpYSBpdHMgZmlyZXdhbGwKLSAgIHJ1bGVzLiBFdmlkZW50bHkgZGlmZmVyZW50IEludGVybmV0LWZhY2luZyBwb3J0cyB3b3VsZCBiZSByZXF1aXJlZCBmb3IKLSAgIGVhY2ggd29ya3N0YXRpb24uIFRoaXMgY291bGQgYmUgc2V0IHVwIHVzaW5nIGlwdGFibGVzIHJ1bGVzIGZvcgotICAgZXhhbXBsZS4gSWYgdGhlcmUgd2VyZSBqdXN0IG9uZSBvciB0d28gbWFjaGluZXMgdGhpcyB3b3VsZCBiZSB0aGUKLSAgIGVhc2llc3QgbWV0aG9kLiBGb3IgZXhhbXBsZToKLSAgaXB0YWJsZXMgLXQgbmF0IC1BIFBSRVJPVVRJTkcgLXAgdGNwIC1kIDI0LjM1LjQ2LjU3IC0tZHBvcnQgNTkwMSAtaiBETkFUIC0tdG8KLS1kZXN0aW5hdGlvbiAxOTIuMTY4LjEuMjo1OTE1Ci0gIGlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIC1wIHRjcCAtZCAyNC4zNS40Ni41NyAtLWRwb3J0IDU5MDIgLWogRE5BVCAtLXRvCi0tZGVzdGluYXRpb24gMTkyLjE2OC4xLjM6NTkxNQotCi0gICBXaGVyZSAyNC4zNS40Ni41NyBpcyB0aGUgaW50ZXJuZXQgSVAgYWRkcmVzcyBvZiB0aGUgZ2F0ZXdheS4gSW4gdGhpcwotICAgZXhhbXBsZSAyNC4zNS40Ni41Nzo1OTAxIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIGludGVybmFsIG1hY2hpbmUKLSAgIDE5Mi4xNjguMS4yOjU5MTUgYW5kIDI0LjM1LjQ2LjU3OjU5MDIgaXMgcmVkaXJlY3RlZCB0byBhbm90aGVyCi0gICBpbnRlcm5hbCBtYWNoaW5lIDE5Mi4xNjguMS4zOjU5MTUsIGJvdGggcnVubmluZyB4MTF2bmMgLXNzbCAuLi4gaW4gU1NMCi0gICBtb2RlLiBGb3IgdGhpcyBleGFtcGxlLCB0aGUgdXNlciB3b3VsZCBwb2ludCB0aGUgd2ViIGJyb3dzZXIgdG8sIGUuZy46Ci0gIGh0dHBzOi8vMjQuMzUuNDYuNTc6NTkwMS8/UE9SVD01OTAxCi0KLSAgIG9yIHVzaW5nIHRoZSBzdHVubmVsIHdyYXBwZXIgc2NyaXB0OgotICBzc192bmN2aWV3ZXIgMjQuMzUuNDYuNTc6MQotCi0gICBPbmUgY2FuIGFjaGlldmUgc2ltaWxhciB0aGluZ3Mgd2l0aCBkZWRpY2F0ZWQgZmlyZXdhbGwvcm91dGVycyAoZS5nLgotICAgTGlua3N5cykgdXNpbmcgdGhlIGRldmljZSdzIHdlYiBvciBvdGhlciBpbnRlcmZhY2UgdG8gY29uZmlndXJlIHRoZQotICAgZmlyZXdhbGwuCi0KLSAgIElmIHRoZSB1c2VyIG1heSBiZSBjb21pbmcgb3V0IG9mIGEgZmlyZXdhbGwgdXNpbmcgYSBwcm94eSBpdCBtYXkgYmUKLSAgIGJldHRlciB0byByZWRpcmVjdCBwb3J0cyA0NDMgYW5kIDU2MyAoaW5zdGVhZCBvZiA1OTAxIGFuZCA1OTAyKSB0byB0aGUKLSAgIGludGVybmFsIG1hY2hpbmVzIHNvIHRoYXQgdGhlIHVzZXIncyBwcm94eSB3aWxsIGFsbG93IENPTk5FQ1RpbmcgdG8KLSAgIHRoZW0uCi0KLSAgIC0gVGhlIHJlZGlyZWN0aW9uIGNvdWxkIGFsc28gYmUgZG9uZSBhdCB0aGUgYXBwbGljYXRpb24gbGV2ZWwgdXNpbmcgYQotICAgVENQIHJlZGlyZWN0IHByb2dyYW0gKGUuZy4gaXBfcmVsYXkgb3IgZmFuY2llciBvbmVzKS4gRXZpZGVudGx5IG1vcmUKLSAgIGNhcmVmdWwgaW50ZXJuYWwgaG9zdG5hbWUgY2hlY2tpbmcsIGV0Yy4sIGNvdWxkIGJlIHBlcmZvcm1lZCBieSB0aGUKLSAgIHNwZWNpYWwgcHVycG9zZSBhcHBsaWNhdGlvbiB0byBhZGQgc2VjdXJpdHkuIFNlZSBjb25uZWN0X3N3aXRjaCB3aGljaAotICAgaXMgc29tZXdoYXQgcmVsYXRlZC4KLQotICAgLSBPbmUgbWlnaHQgaW1hZ2luZSB0aGUgUHJveHlQYXNzIGNvdWxkIGJlIGRvbmUgZm9yIHRoZSBWTkMgdHJhZmZpYyBhcwotICAgd2VsbCAoZm9yIHRoZSBzc2wuY29uZiBjYXNlKSB0byBhdm9pZCB0aGUgQ09OTkVDVCBwcm94eWluZyBjb21wbGV0ZWx5Ci0gICAod2hpY2ggd291bGQgYmUgbmljZSB0byBhdm9pZCkuIFVuZm9ydHVuYXRlbHkgd2Ugd2VyZSBub3QgYWJsZSB0byBnZXQKLSAgIHRoaXMgdG8gd29yay4gU2luY2UgSFRUUCBpcyBhIHJlcXVlc3QtcmVzcG9uc2UgcHJvdG9jb2wgKGFzIG9wcG9zZWQgdG8KLSAgIGEgZnVsbCBiaWRpcmVjdGlvbmFsIGxpbmsgcmVxdWlyZWQgYnkgVk5DIHRoYXQgQ09OTkVDVCBwcm92aWRlcykgdGhpcwotICAgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGRvLiBJdCBtYXkgYmUgcG9zc2libGUsIGJ1dCB3ZSBoYXZlbid0IGZvdW5kIG91dAotICAgaG93IHlldC4KLQotICAgQWxsIG9mIHRoZSB4MTF2bmMgSmF2YSBWaWV3ZXIgYXBwbGV0IHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKLSAgIGZpbGUgY2xhc3Nlcy9zc2wvUkVBRE1FCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgVHJpY2tzIGZvciBCZXR0ZXIgUmVzcG9uc2UgYW5kIHJlbGlhYmlsaXR5OgotCi0gICBUaGUgIm9yaWdpbmFsIHNjaGVtZSIgdXNpbmcgaHR0cGQuY29uZiBhbmQgc3NsLmNvbmYgcmV3cml0ZXMgd2l0aG91dAotICAgdXJsUHJlZml4IGFuZCB0cnVzdEFsbFZuY0NlcnRzIGFib3ZlIHNob3VsZCB3b3JrIE9LLCBidXQgbWF5IGxlYWQgdG8KLSAgIHNsb3cgYW5kL29yIHVucmVsaWFibGUgbG9hZGluZyBvZiB0aGUgYXBwbGV0IGFuZCBmaW5hbCBjb25uZWN0aW9uIHRvCi0gICB4MTF2bmMuIFRoZSBmb2xsb3dpbmcgYXJlIHdoYXQgSSBkbyBub3cgdG8gZ2V0IGJldHRlciByZXNwb25zZSBhbmQKLSAgIHJlbGlhYmlsaXR5LiBZTU1WLgotCi0gICBUaGUgcHJvYmxlbSB3aXRoIHRoZSAib3JpZ2luYWwgc2NoZW1lIiBpcyB0aGF0IHRoZXJlIGlzIGEgcG9pbnQgd2hlcmUKLSAgIHRoZSBWTkMgVmlld2VyIGFwcGxldCBjYW4gdHJ5IHVwIHRvIDMgdGltZXMgdG8gcmV0cmlldmUgdGhlIHgxMXZuYwotICAgY2VydGlmaWNhdGUsIHNpbmNlIGl0IG5lZWRzIHRvIGdldCBpdCB0byBzaG93IGl0IHRvIHlvdSBhbmQgYXNrIHlvdSBpZgotICAgeW91IGFjY2VwdCBpdC4gVGhpcyBjYW4gYWRkIGFib3V0IDQ1IHNlY29uZHMgdG8gdGhlIHdob2xlIHByb2Nlc3MKLSAgICh3aGljaCB0YWtlcyAxIHRvIDEuNSBtaW51dGVzIHdpdGggYWxsIHRoZSBkaWFsb2dzKSBzaW5jZSBhIGNvdXBsZSBvZgotICAgdGhvc2UgY29ubmVjdGlvbnMgbXVzdCB0aW1lIG91dC4gVGhlICJ0cnVzdCIgaXRlbXMgaW4gdGhlIGNvbmZpZyBhZGQgYQotICAgcGFyYW1ldGVyIHRydXN0QWxsVm5jQ2VydHM9eWVzIHNpbWlsYXIgdG8gdGhlIGZvcmNlUHJveHk9eWVzCi0gICBwYXJhbWV0ZXIuIFRoaXMgY2FuIGN1dCB0aGUgdG90YWwgdGltZSB0byB0aGUgVk5DIHBhc3N3b3JkIHByb21wdCBkb3duCi0gICB0byAxNSBzZWNvbmRzIHdoaWNoIGlzIHByZXR0eSBnb29kLiAoTm90ZSBieSBpZ25vcmluZyB0aGUgY2VydGlmaWNhdGUKLSAgIHRoaXMgZG9lcyBub3QgcHJvdGVjdCBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3Mgd2hpY2ggYXJlCi0gICByYXJlLCBidXQgbWF5YmUgdGhlIHdvbid0IGJlIHNvIHJhcmUgaW4gdGhlIGZ1dHVyZS4uLiBzZWUKLSAgIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluKQotCi0gICBGaXJzdCBtYWtlIHN1cmUgdGhlIHgxMXZuYyBTU0wgY2VydGlmaWNhdGUra2V5IGlzIHRoZSBzYW1lIGFzCi0gICBBcGFjaGUncy4gKG90aGVyd2lzZSB5b3UgbWF5IGdldCBvbmUgZXh0cmEgZGlhbG9nIGFuZC9vciBvbmUgZXh0cmEKLSAgIGNvbm5lY3Rpb24gdGhhdCBoYXMgdG8gdGltZSBvdXQpLgotCi0gICBUaGUgZm9sbG93aW5nIFJld3JpdGVSdWxlJ3MgYXJlIHRoZSBzYW1lIG5vdyBhZHZvY2F0ZWQgaW4gdGhlCi0gICBpbnN0cnVjdGlvbnMgYWJvdmUuCi0KLSAgIFRoZSBodHRwc1BvcnQgYW5kIHVybFByZWZpeD0gcGFyYW1ldGVycyBnaXZlIGhpbnRzIHRvIHRoZSBhcHBsZXQgdG8KLSAgIGltcHJvdmUgY29ubmVjdGluZzogVGhpcyBpcyB3aGF0IGdvZXMgaW4gaHR0cGQuY29uZjoKLSAgIFJld3JpdGVFbmdpbmUgT24KLSAgIFJld3JpdGVSdWxlIC92bmMvKFteL10rKSQgICAgICAgICAgICAgICAvdm5jLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSBbUixORV0KLSAgIFJld3JpdGVSdWxlIC92bmMvdHJ1c3QvKFteL10rKSQgICAgICAgICAvdm5jLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZ0cnVzdEFsbFZuY0NlcnRzPXllcyBbUixORV0KLSAgIFJld3JpdGVSdWxlIC92bmMvcHJveHkvKFteL10rKSQgICAgICAgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyBbUixORV0KLSAgIFJld3JpdGVSdWxlIC92bmMvdHJ1c3QvcHJveHkvKFteL10rKSQgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KLVJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyZ0cnVzdEFsbFZuY0NlcnRzPXllcyBbUixORV0KLQotICAgVGhlIGh0dHBzUG9ydCBhbmQgdXJsUHJlZml4IHByb3ZpZGUgdXNlZnVsIGhpbnRzIHRvIHRoZSBWTkMgVmlld2VyCi0gICBhcHBsZXQgd2hlbiBpdCBjb25uZWN0cyB0byB4MTF2bmMgdG8gZ2xlYW4gaW5mb3JtYXRpb24gYWJvdXQgUHJveGllcywKLSAgIGNlcnRpZmljYXRlcywgZXRjLgotCi0gICBUaGlzIGlzIHdoYXQgZ29lcyBpbnRvIHNzbC5jb25mOgotICAgUmV3cml0ZUVuZ2luZSBPbgotICAgUmV3cml0ZVJ1bGUgL3ZuYy8oW14vXSspJCAgICAgICAgICAgICAgICAvdm5jLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUAotT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxIFtSLE5FXQotICAgUmV3cml0ZVJ1bGUgL3ZuYy9wcm94eS8oW14vXSspJCAgICAgICAgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUAotT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxJmZvcmNlUHJveHk9eWVzIFtSLE5FXQotICAgUmV3cml0ZVJ1bGUgL3ZuY3MvKFteL10rKSQgICAgICAgICAgICAgIC92bmNzLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUAotT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSBbUixORV0KLSAgIFJld3JpdGVSdWxlIC92bmNzL3Byb3h5LyhbXi9dKykkICAgICAgICAvdm5jcy8kMS9wcm94eS52bmM/Q09OTkVDVD0kMSs1OTE1JlAKLU9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmZm9yY2VQcm94eT15ZXMgW1IsTkVdCi0gICBSZXdyaXRlUnVsZSAvdm5jcy90cnVzdC8oW14vXSspJCAgICAgICAgL3ZuY3MvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JDErNTkxNSZQCi1PUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJnRydXN0QWxsVm5jQ2VydHM9eWVzIFtSLE5FCi1dCi0gICBSZXdyaXRlUnVsZSAvdm5jcy90cnVzdC9wcm94eS8oW14vXSspJCAgL3ZuY3MvJDEvcHJveHkudm5jP0NPTk5FQ1Q9JDErNTkxNSZQCi1PUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJmZvcmNlUHJveHk9eWVzJnRydXN0QWxsVm5jCi1DZXJ0cz15ZXMgW1IsTkVdCi0KLSAgIFRoZSByZXN0IGlzIHRoZSBzYW1lLgotCi0gICBUaGUgaHR0cHNQb3J0IGFuZCB1cmxQcmVmaXggYW5kIEdFVCBwcm92aWRlIHVzZWZ1bCBoaW50cyB0byB0aGUgVk5DCi0gICBWaWV3ZXIgYXBwbGV0IHdoZW4gaXQgY29ubmVjdHMgdG8geDExdm5jIHRvIGdsZWFuIGluZm9ybWF0aW9uIGFib3V0Ci0gICBQcm94aWVzLCBjZXJ0aWZpY2F0ZXMsIGV0YywgYW5kIGFsc28gZm9yIHRoZSB1bHRpbWF0ZSBWTkMgY29ubmVjdGlvbgotICAgKEdFVCBzcGVlZHMgdGhpcyB1cCBieSBzZW5kaW5nIGEgc3BlY2lhbCBIVFRQIEdFVCB0byBjYXVzZSB4MTF2bmMgdG8KLSAgIGltbWVkaWF0ZWx5IHN3aXRjaCB0byB0aGUgVk5DIHByb3RvY29sKS4KLQotICAgVG8gdHVybiB0aGVzZSBpbnRvIFVSTHMsIGFzIHdhcyBkb25lIGFib3ZlLCB0YWtlIHRoZSBzdHJpbmcgaW4gdGhlCi0gICBSZXdyaXRlUnVsZSwgZS5nLiAvdm5jcyBhbmQgdHVybiBpdCBpbnRvCi0gICBodHRwczovL2dhdGV3YXkvdm5jcy9tYWNoaW5lbmFtZSBTaW1pbGFybHkgZm9yIG5vbi1odHRwczoKLSAgIGh0dHA6Ly9nYXRld2F5OjU2My92bmMvbWFjaGluZW5hbWUKLQotICAgSWYgeW91IHVzZSB0aGUgJ3RydXN0JyBvbmVzLCB5b3UgYXJlIHBlcmZvcm1pbmcgTk8gY2hlY2tzLCB2aXN1YWwgb3IKLSAgIG90aGVyd2lzZSwgb24gdGhlIFZOQyBTU0wgY2VydGlmaWNhdGUuIEl0IGlzIHRydXN0ZWQgd2l0aG91dCBxdWVzdGlvbi4KLSAgIFRoaXMgc3BlZWRzIHRoaW5ncyB1cCBiZWNhdXNlIGl0IGF2b2lkcyBhIGRpYWxvZyBhYm91dCBjZXJ0aWZpY2F0ZXMsCi0gICBidXQgb2YgY291cnNlIGhhcyBzb21lIHJpc2sgV1JUIE1hbiBpbiB0aGUgTWlkZGxlIGF0dGFja3MuIEkgZG9uJ3QKLSAgIHJlY29tbWVuZCB0aGVtLiBJdCBpcyBiZXR0ZXIgdG8gdXNlIC92bmMgb3IgL3ZuY3MgYW5kIHRoZSBmaXJzdCB0aW1lCi0gICB5b3UgY29ubmVjdCBjYXJlZnVsbHkgY2hlY2sgdGhlIENlcnRpZmljYXRlIGFuZCB0aGVuIHRlbGwgeW91ciBCcm93c2VyCi0gICBhbmQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdG8gdHJ1c3QgdGhlIGNlcnRpZmljYXRlICdBbHdheXMnLiBUaGVuIGlmCi0gICB5b3UgbGF0ZXIgZ2V0IGFuIHVuZXhwZWN0ZWQgZGlhbG9nLCB5b3Uga25vdyBzb21ldGhpbmcgaXMgd3JvbmcuCi0gICBOZWFybHkgYWx3YXlzIGl0IGlzIGp1c3QgYSBjaGFuZ2VkIG9yIGV4cGlyZWQgY2VydGlmaWNhdGUsIGJ1dCBiZXR0ZXIKLSAgIHNhZmUgdGhhbiBzb3JyeS4uLgotCQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyLmh0bWw6Ci0KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1FbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgICAoU1NWTkM6ICAgU1NML1NTSCBWTkMgdmlld2VyKQotCi0gICAoVG8gRG93bmxvYWRzKSAgKFRvIFF1aWNrIFN0YXJ0KQotCi0gICBbc3N2bmMuZ2lmXSBbc3N2bmNfd2luZG93cy5naWZdIFtzc3ZuY19tYWNvc3guZ2lmXSAuIC4KLQotCi0gICBUaGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyLCBTU1ZOQywgYWRkcyBlbmNyeXB0aW9uIHNlY3VyaXR5IHRvIFZOQwotICAgY29ubmVjdGlvbnMuCi0KLSAgIFRoZSBwYWNrYWdlIHByb3ZpZGVzIGEgR1VJIGZvciBXaW5kb3dzLCBNYWMgT1MgWCwgYW5kIFVuaXggdGhhdAotICAgYXV0b21hdGljYWxseSBzdGFydHMgdXAgYW4gU1RVTk5FTCBTU0wgdHVubmVsIGZvciBTU0wgb3Igc3NoL3BsaW5rIGZvcgotICAgU1NIIGNvbm5lY3Rpb25zIHRvIGFueSBWTkMgc2VydmVyLCBzdWNoIGFzIHgxMXZuYywgYW5kIHRoZW4gbGF1bmNoZXMKLSAgIHRoZSBWTkMgVmlld2VyIHRvIHVzZSB0aGUgZW5jcnlwdGVkIHR1bm5lbC4KLQotICAgVGhlIHgxMXZuYyBzZXJ2ZXIgaGFzIGJ1aWx0LWluIFNTTCBzdXBwb3J0LCBob3dldmVyIFNTVk5DIGNhbiBtYWtlIFNTTAotICAgZW5jcnlwdGVkIFZOQyBjb25uZWN0aW9ucyB0byBhbnkgVk5DIFNlcnZlciBpZiB0aGV5IGFyZSBydW5uaW5nIGFuIFNTTAotICAgdHVubmVsLCBzdWNoIGFzIFNUVU5ORUwgb3Igc29jYXQsIGF0IHRoZWlyIGVuZC4gU1NWTkMncyBTU0ggdHVubmVsCi0gICB3aWxsIHdvcmsgdG8gYW55IFZOQyBTZXJ2ZXIgaG9zdCBydW5uaW5nIHNzaGQgdGhhdCB5b3UgY2FuIGxvZyBpbnRvLgotCi0gICBUaGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIHBhY2thZ2Ugc3RhcnRlZCBhcyBhIHByb2plY3QgdG8gYWRkIHNvbWUKLSAgIHBhdGNoZXMgdG8gdGhlIGxvbmcgbmVnbGVjdGVkIFVuaXggVGlnaHRWTkMgVmlld2VyLiBIb3dldmVyLCBub3cgdGhlCi0gICBmcm9udC1lbmQgR1VJLCBlbmNyeXB0aW9uLCBhbmQgd3JhcHBlciBzY3JpcHRzIGZlYXR1cmVzIHBvc3NpYmx5Ci0gICBvdXR3ZWlnaCB0aGUgVW5peCBUaWdodFZOQyBWaWV3ZXIgaW1wcm92ZW1lbnRzIChzZWUgdGhlIGxpc3RzIGJlbG93IHRvCi0gICBjb21wYXJlKS4KLQotICAgVGhlIFNTVk5DIFVuaXggdm5jdmlld2VyIGNhbiBhbHNvIGJlIHJ1biB3aXRob3V0IHRoZSBTU1ZOQyBlbmNyeXB0aW9uCi0gICBHVUkgYXMgYW4gZW5oYW5jZWQgcmVwbGFjZW1lbnQgZm9yIHRoZSB4dm5jdmlld2VyLCB4dGlnaHR2bmN2aWV3ZXIsCi0gICBldGMuLCB2aWV3ZXJzLgotCi0gICBJbiBhZGRpdGlvbiB0byBub3JtYWwgU1NMLCBTU1ZOQyBhbHNvIHN1cHBvcnRzIHRoZSBWZU5DcnlwdCBTU0wvVExTCi0gICBhbmQgVmluby9BTk9OVExTIGVuY3J5cHRpb24gZXh0ZW5zaW9ucyB0byBWTkMgb24gVW5peCwgTWFjIE9TIFgsIGFuZAotICAgV2luZG93cy4gVmlhIHRoZSBwcm92aWRlZCBTU1ZOQyBWZU5DcnlwdCBicmlkZ2UsIFZlTkNyeXB0IGFuZCBBTk9OVExTCi0gICBlbmNyeXB0aW9uIGFsc28gd29ya3Mgd2l0aCBhbnkgdGhpcmQgcGFydHkgVk5DIFZpZXdlciAoZS5nLiBSZWFsVk5DLAotICAgVGlnaHRWTkMsIFVsdHJhVk5DLCBldGMuLi4pIHlvdSBzZWxlY3QgdmlhICdDaGFuZ2UgVk5DIFZpZXdlcicuCi0KLSAgIFRoZSBzaG9ydCBuYW1lIGZvciB0aGlzIHByb2plY3QgaXMgInNzdm5jIiBmb3IgU1NML1NTSCBWTkMgVmlld2VyLgotICAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byBzdGFydCBpdC4KLQotICAgVGhlcmUgaXMgYSBzaW1wbGlmaWVkIFNTSC1Pbmx5IG1vZGUgKHNzaHZuYykuIEFuZCBhbiBldmVuIG1vcmUKLSAgIHNpbXBsaWZpZWQgVGVybWluYWwtU2VydmljZXMgbW9kZSAodHN2bmMpIGZvciB1c2Ugd2l0aCB4MTF2bmMgb24gdGhlCi0gICByZW1vdGUgc2lkZS4KLQotICAgVGhlIHRvb2wgaGFzIG1hbnkgYWRkaXRpb25hbCBmZWF0dXJlczsgc2VlIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cuCi0KLSAgIEl0IGlzIGEgc2VsZi1jb250YWluZWQgYnVuZGxlLCB5b3UgY291bGQgY2FycnkgaXQgYXJvdW5kIG9uLCBzYXksIGEKLSAgIFVTQiBtZW1vcnkgc3RpY2sgLyBmbGFzaCBkcml2ZSBmb3Igc2VjdXJlIFZOQyB2aWV3aW5nIGZyb20gYWxtb3N0IGFueQotICAgbWFjaGluZSwgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzIChhbmQgaWYgeW91IGNyZWF0ZSBhIGRpcmVjdG9yeQotICAgbmFtZWQgIkhvbWUiIGluIHRoZSB0b3BsZXZlbCBzc3ZuYyBkaXJlY3Rvcnkgb24gdGhlIGRyaXZlIHlvdXIgVk5DCi0gICBwcm9maWxlcyBhbmQgY2VydHMgd2lsbCBiZSBrZXB0IHRoZXJlIGFzIHdlbGwpLiBGb3IgVW5peCwgdGhlcmUgaXMKLSAgIGFsc28gYSBjb252ZW50aW9uYWwgc291cmNlIHRhcmJhbGwgdG8gYnVpbGQgYW5kIGluc3RhbGwgaW4gdGhlIG5vcm1hbAotICAgd2F5IGFuZCBub3QgdXNlIGEgcHJlLWJ1aWx0IGJ1bmRsZS4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgQW5ub3VuY2VtZW50czoKLQotICAgSW1wb3J0YW50OiBJZiB5b3UgY3JlYXRlZCBhbnkgU1NMIGNlcnRpZmljYXRlcyB3aXRoIFNTVk5DIChvciBhbnl0aGluZwotICAgZWxzZSkgb24gYSBEZWJpYW4gb3IgVWJ1bnR1IHN5c3RlbSBmcm9tIFNlcHQuIDIwMDYgdGhyb3VnaCBNYXkgMjAwOCwKLSAgIHRoZW4gdGhvc2Uga2V5cyBhcmUgbGlrZWx5IGV4dHJlbWVseSB3ZWFrIGFuZCBjYW4gYmUgZWFzaWx5IGNyYWNrZWQuCi0gICBUaGUgY2VydGlmaWNhdGUgZmlsZXMgc2hvdWxkIGJlIGRlbGV0ZWQgYW5kIHJlY3JlYXRlZCBvbiBhIG5vbi1EZWJpYW4KLSAgIHN5c3RlbSBvciBhbiB1cGRhdGVkIG9uZS4gU2VlCi0gICBodHRwOi8vd3d3LmRlYmlhbi5vcmcvc2VjdXJpdHkvMjAwOC9kc2EtMTU3MSBmb3IgZGV0YWlscy4gVGhlIHNhbWUKLSAgIGFwcGxpZXMgdG8gU1NIIGtleXMuCi0KLSAgIFBsZWFzZSByZWFkIHRoaXMgaW5mb3JtYXRpb24gb24gdXNpbmcgU1NWTkMgb24gd29ya3N0YXRpb25zIHdpdGgKLSAgIFVudHJ1c3RlZCBMb2NhbCBVc2Vycy4KLQotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICAgRmVhdHVyZSBMaXN0OgotCi0gICBXcmFwcGVyIHNjcmlwdHMgYW5kIGEgdGNsL3RrIEdVSSB3ZXJlIHdyaXR0ZW4gdG8gY3JlYXRlIHRoZXNlIGZlYXR1cmVzCi0gICBmb3IgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzOgotICAgICAqIFNTTCBzdXBwb3J0IGZvciBjb25uZWN0aW9ucyB1c2luZyB0aGUgYnVuZGxlZCBzdHVubmVsIHByb2dyYW0uCi0gICAgICogQXV0b21hdGljIFNTSCBjb25uZWN0aW9ucyBmcm9tIHRoZSBHVUkgKHN5c3RlbSBzc2ggaXMgdXNlZCBvbiBVbml4Ci0gICAgICAgYW5kIE1hY09TIFg7IGJ1bmRsZWQgcGxpbmsgaXMgdXNlZCBvbiBXaW5kb3dzKQotICAgICAqIEFiaWxpdHkgdG8gU2F2ZSBhbmQgTG9hZCBWTkMgcHJvZmlsZXMgZm9yIGRpZmZlcmVudCBob3N0cy4KLSAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHlvdXIgb3duIFZOQyBWaWV3ZXIsIGUuZy4gVWx0cmFWTkMgb3IgUmVhbFZOQywKLSAgICAgICB3aXRoIHRoZSBTU1ZOQyBlbmNyeXB0aW9uIEdVSSBmcm9udC1lbmQgaWYgeW91IHByZWZlci4KLSAgICAgKiBDcmVhdGUgb3IgSW1wb3J0IFNTTCBDZXJ0aWZpY2F0ZXMgYW5kIFByaXZhdGUgS2V5cy4KLSAgICAgKiBSZXZlcnNlICh2aWV3ZXIgbGlzdGVuaW5nKSBWTkMgY29ubmVjdGlvbnMgdmlhIFNTTCBhbmQgU1NILgotICAgICAqIFZlTkNyeXB0IFNTTC9UTFMgVk5DIGVuY3J5cHRpb24gc3VwcG9ydCAodXNlZCBieSBWZU5DcnlwdCwgUUVNVSwKLSAgICAgICBnZ2ksIGxpYnZpcnQvdmlydC1tYW5hZ2VyL3hlbiwgdmluYWdyZS9ndm5jdmlld2VyL2d0ay12bmMpCi0gICAgICogQU5PTlRMUyBTU0wvVExTIFZOQyBlbmNyeXB0aW9uIHN1cHBvcnQgKHVzZWQgYnkgVmlubykKLSAgICAgKiBWZU5DcnlwdCBhbmQgQU5PTlRMUyBhcmUgYWxzbyBlbmFibGVkIGZvciBhbnkgM3JkIHBhcnR5IFZOQyBWaWV3ZXIKLSAgICAgICAoZS5nLiBSZWFsVk5DLCBUaWdodFZOQywgVWx0cmFWTkMgLi4uKSBvbiBVbml4LCBNYWNPU1gsIGFuZAotICAgICAgIFdpbmRvd3MgdmlhIHRoZSBwcm92aWRlZCBTU1ZOQyBWZU5DcnlwdCBWaWV3ZXIgQnJpZGdlIHRvb2wgKHVzZQotICAgICAgICdDaGFuZ2UgVk5DIFZpZXdlcicgdG8gc2VsZWN0IHRoZSBvbmUgeW91IHdhbnQuKQotICAgICAqIFN1cHBvcnQgZm9yIFdlYiBQcm94aWVzLCBTT0NLUyBQcm94aWVzLCBhbmQgdGhlIFVsdHJhVk5DIHJlcGVhdGVyCi0gICAgICAgcHJveHkgKGUuZy4gcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6MTIzNCkuIE11bHRpcGxlIHByb3hpZXMgbWF5IGJlCi0gICAgICAgY2hhaW5lZCB0b2dldGhlciAoMyBtYXgpLgotICAgICAqIFN1cHBvcnQgZm9yIFNTSCBHYXRld2F5IGNvbm5lY3Rpb25zIGFuZCBub24tc3RhbmRhcmQgU1NIIHBvcnRzLgotICAgICAqIEF1dG9tYXRpYyBTZXJ2aWNlIHR1bm5lbGxpbmcgdmlhIFNTSCBmb3IgQ1VQUyBhbmQgU01CIFByaW50aW5nLAotICAgICAgIEVTRC9BUlRTRCBBdWRpbywgYW5kIFNNQiAoV2luZG93cy9TYW1iYSkgZmlsZXN5c3RlbSBtb3VudGluZy4KLSAgICAgKiBTZXRzIHVwIGFueSBhZGRpdGlvbmFsIFNTSCBwb3J0IHJlZGlyZWN0aW9ucyB0aGF0IHlvdSB3YW50LgotICAgICAqIFplcm9jb25mIChha2EgQm9uam91cikgaXMgdXNlZCBvbiBVbml4IGFuZCBNYWMgT1MgWCB0byBmaW5kIFZOQwotICAgICAgIHNlcnZlcnMgb24geW91ciBsb2NhbCBuZXR3b3JrIGlmIHRoZSBhdmFoaS1icm93c2Ugb3IgZG5zLXNkCi0gICAgICAgcHJvZ3JhbSBpcyBhdmFpbGFibGUgYW5kIGluIHlvdXIgUEFUSC4KLSAgICAgKiBQb3J0IEtub2NraW5nIGZvciAiY2xvc2VkIHBvcnQiIFNTSC9TU0wgY29ubmVjdGlvbnMuIEluIGFkZGl0aW9uCi0gICAgICAgdG8gYSBzaW1wbGUgZml4ZWQgcG9ydCBzZXF1ZW5jZSBhbmQgb25lLXRpbWUtcGFkIGltcGxlbWVudGF0aW9uLCBhCi0gICAgICAgaG9vayBpcyBhbHNvIHByb3ZpZGVkIHRvIHJ1biBhbnkgcG9ydCBrbm9ja2luZyBjbGllbnQgYmVmb3JlCi0gICAgICAgY29ubmVjdGluZy4KLSAgICAgKiBTdXBwb3J0IGZvciBuYXRpdmUgTWFjT1MgWCB1c2FnZSB3aXRoIGJ1bmRsZWQgQ2hpY2tlbiBvZiB0aGUgVk5DCi0gICAgICAgdmlld2VyICh0aGUgVW5peCBYMTEgdmlld2VyIGlzIGFsc28gcHJvdmlkZWQgZm9yIE1hY09TIFgsIGFuZCBpcwotICAgICAgIGJldHRlciBJTUhPLiBJdCBpcyBub3cgdGhlIGRlZmF1bHQgb24gTWFjT1MgWC4pCi0gICAgICogRHluYW1pYyBWTkMgU2VydmVyIFBvcnQgZGV0ZXJtaW5hdGlvbiBhbmQgcmVkaXJlY3Rpb24gKHVzaW5nIHNzaCdzCi0gICAgICAgYnVpbHRpbiBTT0NLUyBwcm94eSwgc3NoIC1EKSBmb3Igc2VydmVycyBsaWtlIHgxMXZuYyB0aGF0IHByaW50Ci0gICAgICAgb3V0IFBPUlQ9IGF0IHN0YXJ0dXAuCi0gICAgICogVW5peCBVc2VybmFtZSBhbmQgUGFzc3dvcmQgZW50cnkgZm9yIHVzZSB3aXRoICJ4MTF2bmMgLXVuaXhwdyIKLSAgICAgICB0eXBlIGxvZ2luIGRpYWxvZ3MuCi0gICAgICogU2ltcGxpZmllZCBtb2RlIGxhdW5jaGVkIGJ5IGNvbW1hbmQgInNzaHZuYyIgdGhhdCBpcyBTU0ggT25seS4KLSAgICAgKiBTaW1wbGlmaWVkIG1vZGUgbGF1bmNoZWQgYnkgY29tbWFuZCAidHN2bmMiIHRoYXQgcHJvdmlkZXMgYSBWTkMKLSAgICAgICAiVGVybWluYWwgU2VydmljZXMiIG1vZGUgKHVzZXMgeDExdm5jIG9uIHRoZSByZW1vdGUgc2lkZSkuCi0gICAgICogSVB2NiBzdXBwb3J0IGZvciBhbGwgY29ubmVjdGlvbiBtb2RlcyBvbiBVbml4LCBNYWNPU1gsIGFuZAotICAgICAgIFdpbmRvd3MuCi0KLSAgIFBhdGNoZXMgdG8gVGlnaHRWTkMgMS4zLjkgdm5jX3VuaXhzcmMgdHJlZSB3ZXJlIGNyZWF0ZWQgZm9yIFVuaXgKLSAgIFRpZ2h0Vk5DIFZpZXdlciBpbXByb3ZlbWVudHMgKHRoZXNlIG9ubHkgYXBwbHkgdG8gdGhlIFVuaXggVk5DIHZpZXdlciwKLSAgIGluY2x1ZGluZyBNYWNPU1ggWFF1YXJ0eik6Ci0gICAgICogcmZiTmV3RkJTaXplIFZOQyBzdXBwb3J0IChkeW5hbWljIHNjcmVlbiByZXNpemluZykKLSAgICAgKiBDbGllbnQtc2lkZSBTY2FsaW5nIG9mIHRoZSBEZXNrdG9wIGluIHRoZSB2aWV3ZXIuCi0gICAgICogWlJMRSBWTkMgZW5jb2Rpbmcgc3VwcG9ydCAoUmVhbFZOQydzIGVuY29kaW5nKQotICAgICAqIFN1cHBvcnQgZm9yIHRoZSBaWVdSTEUgZW5jb2RpbmcsIGEgd2F2ZWxldCBiYXNlZCBleHRlbnNpb24gdG8gWlJMRQotICAgICAgIHRvIGltcHJvdmUgY29tcHJlc3Npb24gb2YgbW90aW9uIHZpZGVvIGFuZCBwaG90byByZWdpb25zLgotICAgICAqIFR1cmJvVk5DIHN1cHBvcnQgKFZpcnR1YWxHTCdzIG1vZGlmaWVkIFRpZ2h0Vk5DIGVuY29kaW5nOyByZXF1aXJlcwotICAgICAgIFR1cmJvSlBFRyBsaWJyYXJ5KQotICAgICAqIFBpcGVsaW5lZCBVcGRhdGVzIG9mIHRoZSBmcmFtZWJ1ZmZlciBhcyBpbiBUdXJib1ZOQyAoYXNrcyBmb3IgdGhlCi0gICAgICAgbmV4dCB1cGRhdGUgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBoYXMgZmluaXNoZWQgZG93bmxvYWRpbmc7IHRoaXMKLSAgICAgICBnaXZlcyBzb21lIHNwZWVkdXAgb24gaGlnaCBsYXRlbmN5IGNvbm5lY3Rpb25zLikKLSAgICAgKiBDdXJzb3IgYWxwaGFibGVuZGluZyB3aXRoIHgxMXZuYyBhdCAzMmJwcCAoLWFscGhhIG9wdGlvbikKLSAgICAgKiBPcHRpb24gIi11bml4cHcgLi4uIiBmb3IgdXNlIHdpdGggIngxMXZuYyAtdW5peHB3IiB0eXBlIGxvZ2luCi0gICAgICAgZGlhbG9ncy4KLSAgICAgKiBTdXBwb3J0IGZvciBVbHRyYVZOQyBleHRlbnNpb25zOiAxL24gU2VydmVyIHNpZGUgc2NhbGluZywgVGV4dAotICAgICAgIENoYXQsIFNpbmdsZSBXaW5kb3csIERpc2FibGUgU2VydmVyLXNpZGUgSW5wdXQuIEJvdGggVWx0cmFWTkMgYW5kCi0gICAgICAgeDExdm5jIHNlcnZlcnMgc3VwcG9ydCB0aGVzZSBleHRlbnNpb25zLgotICAgICAqIFVsdHJhVk5DIEZpbGUgVHJhbnNmZXIgdmlhIGFuIGF1eGlsaWFyeSBKYXZhIGhlbHBlciBwcm9ncmFtIChqYXZhCi0gICAgICAgbXVzdCBiZSBpbiAkUEFUSCkuIE5vdGUgdGhhdCB0aGUgeDExdm5jIHNlcnZlciBhbHNvIHN1cHBvcnRzCi0gICAgICAgVWx0cmFWTkMgZmlsZSB0cmFuc2Zlci4KLSAgICAgKiBDb25uZWN0aW9uIHN1cHBvcnQgZm9yIHRoZSBVbHRyYVZOQyByZXBlYXRlciBwcm94eSAoLXJlcGVhdGVyCi0gICAgICAgb3B0aW9uKS4KLSAgICAgKiBTdXBwb3J0IGZvciBVbHRyYVZOQyBTaW5nbGUgQ2xpY2sgb3BlcmF0aW9uLiAoYm90aCB1bmVuY3J5cHRlZDogU0MKLSAgICAgICBJLCBhbmQgU1NMIGVuY3J5cHRlZDogU0MgSUlJKQotICAgICAqIFN1cHBvcnQgZm9yIFVsdHJhVk5DIERTTSBFbmNyeXB0aW9uIFBsdWdpbiBzeW1tZXRyaWMgZW5jcnlwdGlvbgotICAgICAgIG1vZGUuIChBUkM0LCBBRVNWMiwgTVNSQzQsIGFuZCBTZWN1cmVWTkMpCi0gICAgICogU3VwcG9ydCBmb3IgVWx0cmFWTkMgTVMtTG9nb24gYXV0aGVudGljYXRpb24gKE5PVEU6IHRoZSBVbHRyYVZOQwotICAgICAgIE1TLUxvZ29uIGtleSBleGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHdlYWs7IGFuIGVhdmVzZHJvcHBlcgotICAgICAgIG9uIHRoZSBuZXR3b3JrIGNhbiByZWNvdmVyIHlvdXIgV2luZG93cyBwYXNzd29yZCBlYXNpbHkgaW4gYSBmZXcKLSAgICAgICBzZWNvbmRzOyB5b3UgbmVlZCB0byB1c2UgYW4gYWRkaXRpb25hbCBlbmNyeXB0ZWQgdHVubmVsIHdpdGgKLSAgICAgICBNUy1Mb2dvbi4pCi0gICAgICogU3VwcG9ydCBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gKGluY2x1ZGluZyBibG93ZmlzaCBhbmQgM2RlcwotICAgICAgIGNpcGhlcnMpIHRvIE5vbi1VbHRyYVZOQyBTZXJ2ZXJzLiBBbnkgc2VydmVyIHVzaW5nIHRoZSBzYW1lCi0gICAgICAgZW5jcnlwdGlvbiBtZXRob2Qgd2lsbCB3b3JrLCBlLmcuOiAgeDExdm5jIC1lbmMgYmxvd2Zpc2g6Li9teS5rZXkKLSAgICAgKiBJbnN0ZWFkIG9mIGhvc3RuYW1lOmRpc3BsYXkgb25lIGNhbiBhbHNvIHN1cHBseSAiZXhlYz1jb21tYW5kCi0gICAgICAgYXJncy4uLiIgdG8gY29ubmVjdCB0aGUgdmlld2VyIHRvIHRoZSBzdGRpbyBvZiBhbiBleHRlcm5hbCBjb21tYW5kCi0gICAgICAgKGUuZy4gc3R1bm5lbCBvciBzb2NhdCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBUQ1AvSVAgc29ja2V0LiBVbml4Ci0gICAgICAgZG9tYWluIHNvY2tldHMsIGUuZy4gL3BhdGgvdG8vdW5peC9zb2NrZXQsIGFuZCBhIHByZXZpb3VzbHkgb3BlbmVkCi0gICAgICAgZmlsZSBkZXNjcmlwdG9yIGZkPTAsIHdvcmsgdG9vLgotICAgICAqIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMgZm9yIFNUVU5ORUwgYW5kIFNTSDogYXZvaWQgaGF2aW5nIGZvciBsb25nCi0gICAgICAgcGVyaW9kcyBvZiB0aW1lIGEgbGlzdGVuaW5nIHBvcnQgb24gdGhlIHRoZSBsb2NhbCAoVk5DIHZpZXdlcikKLSAgICAgICBzaWRlIHRoYXQgcmVkaXJlY3RzIHRvIHRoZSByZW1vdGUgc2lkZS4KLSAgICAgKiBSZXZlcnNlICh2aWV3ZXIgbGlzdGVuaW5nKSBWTkMgY29ubmVjdGlvbnMgY2FuIHNob3cgYSBQb3B1cCBkaWFsb2cKLSAgICAgICBhc2tpbmcgd2hldGhlciB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gb3Igbm90ICgtYWNjZXB0cG9wdXAuKSBUaGUKLSAgICAgICBleHRyYSBpbmZvIHByb3ZpZGVkIGJ5IFVsdHJhVk5DIFNpbmdsZSBDbGljayByZXZlcnNlIGNvbm5lY3Rpb25zCi0gICAgICAgaXMgYWxzbyBzdXBwb3J0ZWQgKC1hY2NlcHRwb3B1cHNjKQotICAgICAqIEV4dHJlbWVseSBsb3cgY29sb3IgbW9kZXM6IDY0IGFuZCA4IGNvbG9ycyBpbiA4YnBwCi0gICAgICAgKC11c2U2NC8tYmdyMjIyLCAtdXNlOC8tYmdyMTExKQotICAgICAqIE1lZGl1bSBjb2xvciBtb2RlOiAxNmJwcCBtb2RlIG9uIGEgMzJicHAgVmlld2VyIGRpc3BsYXkKLSAgICAgICAoLTE2YnBwLy1iZ3I1NjUpCi0gICAgICogRm9yIHVzZSB3aXRoIHgxMXZuYydzIGNsaWVudC1zaWRlIGNhY2hpbmcgLW5jYWNoZSBtZXRob2QgdXNlIHRoZQotICAgICAgIGNyb3BwaW5nIG9wdGlvbiAteWNyb3Agbi4gVGhpcyB3aWxsICJoaWRlIiB0aGUgbGFyZ2UgcGl4ZWwgYnVmZmVyCi0gICAgICAgY2FjaGUgYmVsb3cgdGhlIGFjdHVhbCBkaXNwbGF5LiBTZXQgdG8gdGhlIGFjdHVhbCBoZWlnaHQgb3IgdXNlIC0xCi0gICAgICAgZm9yIGF1dG9kZXRlY3Rpb24gKGFsc28sIHRhbGwgc2NyZWVucywgSCA+IDIqVywgYXJlIGF1dG9kZXRlY3RlZAotICAgICAgIGJ5IGRlZmF1bHQpLgotICAgICAqIEVzY2FwZSBLZXlzOiBzcGVjaWZ5IGEgc2V0IG9mIG1vZGlmaWVyIGtleXMgc28gdGhhdCB3aGVuIHRoZXkgYXJlCi0gICAgICAgYWxsIHByZXNzZWQgZG93biB5b3UgY2FuIGludm9rZSBQb3B1cCBtZW51IGFjdGlvbnMgdmlhIGtleXN0cm9rZXMuCi0gICAgICAgSS5lLiwgYSBzZXQgb2YgJ0hvdCBLZXlzJy4gT25lIGNhbiBhbHNvIHBhbiAobW92ZSkgdGhlIGRlc2t0b3AKLSAgICAgICBpbnNpZGUgdGhlIHZpZXdwb3J0IHZpYSBBcnJvdyBrZXlzIG9yIGEgbW91c2UgZHJhZy4KLSAgICAgKiBTY3JvbGxiYXIgd2lkdGggc2V0dGluZzogLXNid2lkdGggbiwgdGhlIGRlZmF1bHQgaXMgdmVyeSB0aGluLCAyCi0gICAgICAgcGl4ZWxzLCBmb3IgbGVzcyBkaXN0cmFjdGluZyAteWNyb3AgdXNhZ2UuCi0gICAgICogU2VsZWN0aW9uIHRleHQgc2VuZGluZyBhbmQgcmVjZWl2aW5nIGNhbiBiZSBmaW5lLXR1bmVkIHdpdGggdGhlCi0gICAgICAgLXNlbmRjbGlwYm9hcmQsIC1zZW5kYWx3YXlzLCBhbmQgLXJlY3Z0ZXh0IG9wdGlvbnMuCi0gICAgICogVGlnaHRWTkMgY29tcHJlc3Npb24gYW5kIHF1YWxpdHkgbGV2ZWxzIGFyZSBhdXRvbWF0aWNhbGx5IHNldAotICAgICAgIGJhc2VkIG9uIG9ic2VydmVkIG5ldHdvcmsgbGF0ZW5jeSAobi5iLiBub3QgYmFuZHdpZHRoLikKLSAgICAgKiBJbXByb3ZlbWVudHMgdG8gdGhlIFBvcHVwIG1lbnUsIGFsbCBvZiB0aGVzZSBjYW4gbm93IGJlIGNoYW5nZWQKLSAgICAgICBkeW5hbWljYWxseSB2aWEgdGhlIG1lbnU6IFZpZXdPbmx5LCBUb2dnbGUgQmVsbCwgQ3Vyc29yU2hhcGUKLSAgICAgICB1cGRhdGVzLCBYMTEgQ3Vyc29yLCBDdXJzb3IgQWxwaGFibGVuZGluZywgVG9nZ2xlIFRpZ2h0L1pSTEUsCi0gICAgICAgVG9nZ2xlIEpQRUcsIEZ1bGxDb2xvci8xNmJwcC84YnBwICgyNTYvNjQvOCBjb2xvcnMpLCBHcmV5c2NhbGUgZm9yCi0gICAgICAgbG93IGNvbG9yIG1vZGVzLCBTY2FsaW5nIHRoZSBWaWV3ZXIgcmVzb2x1dGlvbiwgRXNjYXBlIEtleXMsCi0gICAgICAgUGlwZWxpbmUgVXBkYXRlcywgYW5kIG90aGVycywgaW5jbHVkaW5nIFVsdHJhVk5DIGV4dGVuc2lvbnMuCi0gICAgICogTWFpbnRhaW5zIGl0cyBvd24gQmFja2luZ1N0b3JlIGlmIHRoZSBYIHNlcnZlciBkb2VzIG5vdC4KLSAgICAgKiBUaGUgZGVmYXVsdCBmb3IgbG9jYWxob3N0OjAgY29ubmVjdGlvbnMgaXMgbm90IHJhdyBlbmNvZGluZyBzaW5jZQotICAgICAgIHNhbWUtbWFjaGluZSBjb25uZWN0aW9ucyBhcmUgcHJldHR5IHJhcmUuIERlZmF1bHQgYXNzdW1lcyB5b3UgYXJlCi0gICAgICAgdXNpbmcgYSBTU0wgb3IgU1NIIHR1bm5lbC4gVXNlIC1yYXdsb2NhbCB0byByZXZlcnQuCi0gICAgICogWEdyYWJTZXJ2ZXIgc3VwcG9ydCBmb3IgZnVsbHNjcmVlbiBtb2RlLCBmb3Igb2xkIHdpbmRvdyBtYW5hZ2VycwotICAgICAgICgtZ3JhYi8tZ3JhYmFsbCBvcHRpb24pLgotICAgICAqIEZpeCBmb3IgUG9wdXAgbWVudSBwb3NpdGlvbmluZyBmb3Igb2xkIHdpbmRvdyBtYW5hZ2VycyAoLXBvcHVwZml4Ci0gICAgICAgb3B0aW9uKS4KLSAgICAgKiBUaGUgVk5DIFZpZXdlciBzc3ZuY3ZpZXdlciBzdXBwb3J0cyBJUHY2IG5hdGl2ZWx5IChubyBoZWxwZXJzCi0gICAgICAgbmVlZGVkLikKLQotICAgVGhlIGxpc3Qgb2YgM3JkIHBhcnR5IHNvZnR3YXJlIGJ1bmRsZWQgaW4gdGhlIGFyY2hpdmUgZmlsZXM6Ci0gICAgICogVGlnaHRWTkMgVmlld2VyICAod2luZG93cywgdW5peCwgbWFjb3N4KQotICAgICAqIENoaWNrZW4gb2YgdGhlIFZOQyBWaWV3ZXIgIChtYWNvc3gpCi0gICAgICogU3R1bm5lbCAgKHdpbmRvd3MsIHVuaXgsIG1hY29zeCkKLSAgICAgKiBQdXR0eS9QbGluay9QYWdlYW50ICAod2luZG93cykKLSAgICAgKiBPcGVuU1NMICAod2luZG93cykKLSAgICAgKiBlc291bmQgICh3aW5kb3dzKQotCi0gICBUaGVzZSBhcmUgYWxsIHNlbGYtY29udGFpbmVkIGluIHRoZSBidW5kbGUgZGlyZWN0b3J5OiB0aGV5IHdpbGwgbm90IGJlCi0gICBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uIEp1c3QgdW4temlwIG9yIHVuLXRhciB0aGUgZmlsZSB5b3UKLSAgIGRvd25sb2FkZWQgYW5kIHJ1biB0aGUgZnJvbnRlbmQgc3N2bmMgc3RyYWlnaHQgZnJvbSBpdHMgZGlyZWN0b3J5LgotICAgQWx0ZXJuYXRpdmVseSwgb24gVW5peCB5b3UgY2FuIHVzZSB0aGUgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEhlcmUgaXMgdGhlIFF1aWNrIFN0YXJ0IGluZm8gZnJvbSB0aGUgUkVBRE1FIGZvciBob3cgdG8gc2V0dXAgYW5kIHVzZQotICAgU1NWTkM6Ci1RdWljayBTdGFydDoKLS0tLS0tLS0tLS0tCi0KLVVuaXggYW5kIE1hYyBPUyBYOgotCi0gICAgSW5zaWRlIGEgVGVybWluYWwgZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZy4KLQotICAgIFVucGFjayB0aGUgYXJjaGl2ZToKLQotICAgICAgICAlIGd6aXAgLWRjIHNzdm5jLTEuMC4yOS50YXIuZ3ogfCB0YXIgeHZmIC0KLQotICAgIFJ1biB0aGUgR1VJOgotCi0gICAgICAgICUgLi9zc3ZuYy9Vbml4L3Nzdm5jICAgICAgICAgICAgICAgKGZvciBVbml4KQotCi0gICAgICAgICUgLi9zc3ZuYy9NYWNPU1gvc3N2bmMgICAgICAgICAgICAgKGZvciBNYWMgT1MgWCkKLQotICAgIFRoZSBzbWFsbGVyIGZpbGUgInNzdm5jX25vX3dpbmRvd3MtMS4wLjI5LnRhci5neiIKLSAgICBjb3VsZCBoYXZlIGJlZW4gdXNlZCBhcyB3ZWxsLgotCi0gICAgT24gTWFjT1NYIHlvdSBjb3VsZCBhbHNvIGNsaWNrIG9uIHRoZSBTU1ZOQyBhcHAgaWNvbiBpbiB0aGUgRmluZGVyLgotCi0gICAgT24gTWFjT1NYIGlmIHlvdSBkb24ndCBsaWtlIHRoZSBDaGlja2VuIG9mIHRoZSBWTkMgKGUuZy4gbm8gbG9jYWwKLSAgICBjdXJzb3JzLCBubyBzY3JlZW4gc2l6ZSByZXNjYWxpbmcsIGFuZCBubyBwYXNzd29yZCBwcm9tcHRpbmcpLCBhbmQgeW91Ci0gICAgaGF2ZSB0aGUgWERhcndpbiBYIHNlcnZlciBpbnN0YWxsZWQsIHlvdSBjYW4gc2V0IERJU1BMQVkgYmVmb3JlIHN0YXJ0aW5nCi0gICAgc3N2bmMgKG9yIHR5cGUgRElTUExBWT0uLi4gaW4gSG9zdDpEaXNwIGFuZCBoaXQgUmV0dXJuKS4gIFRoZW4gb3VyCi0gICAgZW5oYW5jZWQgVGlnaHRWTkMgdmlld2VyIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIENPVFZOQy4KLSAgICBVcGRhdGU6IHRoZXJlIGlzIG5vdyBhICdVc2UgWDExIHZuY3ZpZXdlciBvbiBNYWNPU1gnIHVuZGVyIE9wdGlvbnMgLi4uCi0KLQotICAgIElmIHlvdSB3YW50IGEgU1NILW9ubHkgdG9vbCAod2l0aG91dCB0aGUgZGlzdHJhY3Rpb25zIG9mIFNTTCkgcnVuCi0gICAgdGhlIGNvbW1hbmQ6Ci0KLSAgICAgICAgICAgICAgICBzc2h2bmMKLQotICAgIGluc3RlYWQgb2YgInNzdm5jIi4gIE9yIGNsaWNrICJTU0gtT25seSBNb2RlIiB1bmRlciBPcHRpb25zLgotICAgIENvbnRyb2wtaCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gbW9kZXMuCi0KLQotICAgIElmIHlvdSB3YW50IGEgc2ltcGxlIFZOQyBUZXJtaW5hbCBTZXJ2aWNlcyBvbmx5IG1vZGUgKHJlcXVpcmVzIHgxMXZuYwotICAgIG9uIHRoZSByZW1vdGUgc2VydmVyKSBydW4gdGhlIGNvbW1hbmQ6Ci0KLSAgICAgICAgICAgICAgICB0c3ZuYwotCi0gICAgaW5zdGVhZCBvZiAic3N2bmMiLiAgT3IgY2xpY2sgIlRlcm1pbmFsIFNlcnZpY2VzIiB1bmRlciBPcHRpb25zLgotICAgIENvbnRyb2wtdCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gbW9kZXMuCi0KLSAgICAidHN2bmMgcHJvZmlsZS1uYW1lIiBhbmQgInRzdm5jIHVzZXJAaG9zdG5hbWUiIHdvcmsgdG9vLgotCi0KLVVuaXgvTWFjT1NYIEluc3RhbGw6Ci0KLSAgICBUaGVyZSBpcyBubyBzdGFuZGFyZCBpbnN0YWxsIGZvciB0aGUgYnVuZGxlcywgYnV0IHlvdSBjYW4gbWFrZQotICAgIHN5bWxpbmtzIGxpa2Ugc286Ci0KLSAgICAgICAgY2QgL2EvZGlyZWN0b3J5L2luL1BBVEgKLSAgICAgICAgbG4gLXMgL3BhdGgvdG8vc3N2bmMvYmluL3tzLHR9KiAuCi0KLSAgICBPciBwdXQgL3BhdGgvdG8vc3N2bmMvYmluLCAvcGF0aC90by9zc3ZuYy9Vbml4LCBvciAvcGF0aC90by9zc3ZuYy9NYWNPU1gKLSAgICBpbiB5b3VyIFBBVEguCi0KLSAgICBGb3IgdGhlIGNvbnZlbnRpb25hbCBzb3VyY2UgdGFyYmFsbCBpdCB3aWxsIGNvbXBpbGUgYW5kIGluc3RhbGwsIGUuZy46Ci0KLSAgICAgICBnemlwIC1kYyBzc3ZuYy0xLjAuMjkuc3JjLnRhci5neiB8IHRhciB4dmYgLQotICAgICAgIGNkIHNzdm5jLTEuMC4yOQotICAgICAgIG1ha2UgY29uZmlnCi0gICAgICAgbWFrZSBhbGwKLSAgICAgICBtYWtlIFBSRUZJWD0vbXkvaW5zdGFsbC9kaXIgaW5zdGFsbAotCi0gICAgdGhlbiBoYXZlIC9teS9pbnN0YWxsL2Rpci9iaW4gaW4geW91ciBQQVRILgotCi0KLQotV2luZG93czoKLQotICAgIFVuemlwLCB1c2luZyBXaW5aaXAgb3IgYSBzaW1pbGFyIHV0aWxpdHksIHRoZSB6aXAgZmlsZToKLQotICAgICAgICBzc3ZuYy0xLjAuMjkuemlwCi0KLSAgICBSdW4gdGhlIEdVSSwgZS5nLjoKLQotICAgICAgICBTdGFydCAtPiBSdW4gLT4gQnJvd3NlCi0KLSAgICBhbmQgdGhlbiBuYXZpZ2F0ZSB0bwotCi0gICAgICAgIC4uLi9zc3ZuYy9XaW5kb3dzL3Nzdm5jLmV4ZQotCi0gICAgc2VsZWN0IE9wZW4sIGFuZCB0aGVuIE9LIHRvIGxhdW5jaCBpdC4KLQotICAgIFRoZSBzbWFsbGVyIGZpbGUgInNzdm5jX3dpbmRvd3Nfb25seS0xLjAuMjkuemlwIgotICAgIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGFzIHdlbGwuCi0KLSAgICBZb3UgY2FuIG1ha2UgYSBXaW5kb3dzIHNob3J0Y3V0IHRvIHRoaXMgcHJvZ3JhbSBpZiB5b3Ugd2FudCB0by4KLQotICAgIFNlZSB0aGUgV2luZG93cy9SRUFETUUudHh0IGZvciBtb3JlIGluZm8uCi0KLQotICAgIElmIHlvdSB3YW50IGEgU1NILW9ubHkgdG9vbCAod2l0aG91dCB0aGUgZGlzdHJhY3Rpb25zIG9mIFNTTCkgcnVuCi0gICAgdGhlIGNvbW1hbmQ6Ci0KLSAgICAgICAgICAgICAgICBzc2h2bmMuYmF0Ci0KLSAgICBPciBjbGljayAiU1NILU9ubHkgTW9kZSIgdW5kZXIgT3B0aW9ucy4KLQotCi0gICAgSWYgeW91IHdhbnQgYSBzaW1wbGUgVk5DIFRlcm1pbmFsIFNlcnZpY2VzIG9ubHkgbW9kZSAocmVxdWlyZXMgeDExdm5jCi0gICAgb24gdGhlIHJlbW90ZSBzZXJ2ZXIpIHJ1biB0aGUgY29tbWFuZDoKLQotICAgICAgICAgICAgICAgIHRzdm5jLmJhdAotCi0gICAgT3IgY2xpY2sgIlRlcm1pbmFsIFNlcnZpY2VzIiB1bmRlciBPcHRpb25zLiAgQ29udHJvbC10IHdpbGwgdG9nZ2xlCi0gICAgYmV0d2VlbiB0aGUgdHdvIG1vZGVzLiAgInRzdm5jIHByb2ZpbGUtbmFtZSIgYW5kICJ0c3ZuYyB1c2VyQGhvc3RuYW1lIgotICAgIHdvcmsgdG9vLgotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFlvdSBjYW4gcmVhZCBhbGwgb2YgdGhlIFNTVk5DIEdVSSdzIE9ubGluZSBIZWxwIFRleHQgaGVyZS4KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgVGhlIGJ1bmRsZSB1bnBhY2tzIGEgZGlyZWN0b3J5L2ZvbGRlciBuYW1lZDogc3N2bmMuIEl0IGNvbnRhaW5zIHRoZXNlCi0gICBwcm9ncmFtcyB0byBsYXVuY2ggdGhlIEdVSToKLSAgICAgICAgV2luZG93cy9zc3ZuYy5leGUgICAgICAgIGZvciBXaW5kb3dzCi0gICAgICAgIE1hY09TWC9zc3ZuYyAgICAgICAgICAgICBmb3IgTWFjIE9TIFgKLSAgICAgICAgVW5peC9zc3ZuYyAgICAgICAgICAgICAgIGZvciBVbml4Ci0KLSAgICh0aGUgTWFjIE9TIFggYW5kIFVuaXggbGF1bmNoZXJzIGFyZSBzaW1wbHkgbGlua3MgdG8gdGhlIGJpbgotICAgZGlyZWN0b3J5KS4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIFRoZSBTU0gtT25seSBtb2RlIGxhdW5jaGVyIHByb2dyYW0gaGFzIG5hbWUgc3Nodm5jLiBUaGUgVGVybWluYWwKLSAgIFNlcnZpY2VzIG1vZGUgbGF1bmNoZXIgcHJvZ3JhbSAoYXNzdW1lcyB4MTF2bmMgMC44LjQgb3IgbGF0ZXIgYW5kIFh2ZmIKLSAgIGluc3RhbGxlZCBvbiB0aGUgc2VydmVyIG1hY2hpbmUpIGhhcyBuYW1lIHRzdm5jLgotCi0gICBUaGUgVmlld2VyIFNTTCBzdXBwb3J0IGlzIGRvbmUgdmlhIGEgd3JhcHBlciBzY3JpcHQgKGJpbi9zc3ZuY19jbWQKLSAgIHRoYXQgY2FsbHMgYmluL3V0aWwvc3Nfdm5jdmlld2VyKSB0aGF0IHN0YXJ0cyB1cCB0aGUgU1RVTk5FTCB0dW5uZWwKLSAgIGZpcnN0IGFuZCB0aGVuIHN0YXJ0cyB0aGUgVGlnaHRWTkMgdmlld2VyIHBvaW50ZWQgYXQgdGhhdCB0dW5uZWwuIFRoZQotICAgYmluL3Nzdm5jIHByb2dyYW0gaXMgYSBHVUkgZnJvbnQtZW5kIHRvIHRoYXQgc2NyaXB0LiBTZWUgdGhpcyBGQVEgZm9yCi0gICBtb3JlIGRldGFpbHMgb24gU1NMIHR1bm5lbGxpbmcuIEluIFNTSCBjb25uZWN0aW9uIG1vZGUsIHRoZSB3cmFwcGVycwotICAgc3RhcnQgdXAgU1NIIGFwcHJvcHJpYXRlbHkuCi0KLQotICAgTWVtb3J5IFN0aWNrIFVzYWdlOiBJZiB5b3UgY3JlYXRlIGEgZGlyZWN0b3J5IG5hbWVkICJIb21lIiBpbiB0aGF0Ci0gICB0b3BsZXZlbCBzc3ZuYyBkaXJlY3RvcnkgdGhlbiB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IKLSAgIHN0b3JpbmcgVk5DIHByb2ZpbGVzIGFuZCBjZXJ0aWZpY2F0ZXMuIEFsc28sIGZvciBjb252ZW5pZW5jZSwgaWYgeW91Ci0gICBmaXJzdCBydW4gdGhlIGNvbW1hbmQgd2l0aCAiLiIgYXMgYW4gYXJndW1lbnQgKGUuZy4gInNzdm5jIC4iKSBpdCB3aWxsCi0gICBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgIkhvbWUiIGRpcmVjdG9yeSBmb3IgeW91LiBUaGlzIGlzIGhhbmR5IGlmCi0gICB5b3Ugd2FudCB0byBwbGFjZSBTU1ZOQyBvbiBhIFVTQiBmbGFzaCBkcml2ZSB0aGF0IHlvdSBjYXJyeSBhcm91bmQgZm9yCi0gICBtb2JpbGUgdXNlIGFuZCB5b3Ugd2FudCB0aGUgcHJvZmlsZXMgeW91IGNyZWF0ZSB0byBzdGF5IHdpdGggdGhlIGRyaXZlCi0gICAob3RoZXJ3aXNlIHlvdSdkIGhhdmUgdG8gYnJvd3NlIHRvIHRoZSBkcml2ZSBkaXJlY3RvcnkgZWFjaCB0aW1lIHlvdQotICAgbG9hZCBvciBzYXZlKS4KLQotICAgT25lIHVzZXIgb24gV2luZG93cyBjcmVhdGVkIGEgQkFUIGZpbGUgdG8gbGF1bmNoIFNTVk5DIGFuZCBuZWVkZWQgdG8KLSAgIGRvIHRoaXMgdG8gZ2V0IHRoZSBIb21lIGRpcmVjdG9yeSBjb3JyZWN0OgotY2QgXHNzdm5jXFdpbmRvd3MKLXN0YXJ0IFxzc3ZuY1xXaW5kb3dzXHNzdm5jLmV4ZQotCi0gICAoYW4gb3B0aW9uYWwgcHJvZmlsZSBuYW1lIGNhbiBiZSBzdXBwbGllZCB0byB0aGUgc3N2bmMuZXhlIGxpbmUpCi0KLSAgIFdBUk5JTkc6IGlmIHlvdSB1c2Ugc3N2bmMgZnJvbSBhbiAiSW50ZXJuZXQgQ2FmZSIsIGkuZS4gc29tZSB1bnRydXN0ZWQKLSAgIGNvbXB1dGVyLCBwbGVhc2UgYmUgYXdhcmUgdGhhdCBzb21lb25lIG1heSBoYXZlIHNldCB1cCB0aGF0IG1hY2hpbmUgdG8KLSAgIGJlIGNhcHR1cmluZyB5b3VyIGtleXN0cm9rZXMsIGV0Yy4KLQotCi0gICBTU0gtT25seSB2ZXJzaW9uOiBUaGUgY29tbWFuZCAic3Nodm5jIiBjYW4gYmUgcnVuIGluc3RlYWQgb2YgInNzdm5jIgotICAgdG8gZ2V0IGFuIFNTSC1vbmx5IHZlcnNpb24gb2YgdGhlIHRvb2w6Ci0KLSAgIFtzc2h2bmMuZ2lmXQotCi0gICBUaGVzZSBhbHNvIHdvcms6ICJzc2h2bmMgbXlwcm9maWxlIiBhbmQgInNzaHZuYyB1c2VyQGhvc3RuYW1lIi4gVG8KLSAgIHN3aXRjaCBmcm9tIHRoZSByZWd1bGFyIFNTVk5DIG1vZGUsIGNsaWNrICJTU0gtT25seSBNb2RlIiB1bmRlcgotICAgT3B0aW9ucy4gVGhpcyBtb2RlIGlzIGxlc3MgZGlzdHJhY3RpbmcgaWYgeW91IG5ldmVyIHBsYW4gdG8gdXNlIFNTTCwKLSAgIG1hbmFnZSBjZXJ0aWZpY2F0ZXMsIGV0Yy4KLQotCi0gICBUZXJtaW5hbCBTZXJ2aWNlcyBPbmx5OiBUaGUgY29tbWFuZCAidHN2bmMiIGNhbiBiZSBydW4gaW5zdGVhZCBvZgotICAgInNzdm5jIiB0byBnZXQgYSAiVGVybWluYWwgU2VydmljZXMiIG9ubHkgdmVyc2lvbiBvZiB0aGUgdG9vbDoKLQotICAgW3Rzdm5jLmdpZl0KLQotICAgVGhlc2UgYWxzbyB3b3JrOiAidHN2bmMgbXlwcm9maWxlIiBhbmQgInRzdm5jIHVzZXJAaG9zdG5hbWUiLiBUbwotICAgc3dpdGNoIGZyb20gdGhlIHJlZ3VsYXIgU1NWTkMgbW9kZSwgY2xpY2sgIlRlcm1pbmFsIFNlcnZpY2VzIiB1bmRlcgotICAgT3B0aW9ucy4KLQotICAgVGhpcyBtb2RlIHJlcXVpcmVzIHgxMXZuYyAoMC45LjMgb3IgbGF0ZXIpIGluc3RhbGxlZCBvbiB0aGUgcmVtb3RlCi0gICBtYWNoaW5lIHRvIGZpbmQsIGNyZWF0ZSwgYW5kIG1hbmFnZSB0aGUgdXNlciBzZXNzaW9ucy4gU1NIIGlzIHVzZWQgdG8KLSAgIGNyZWF0ZSB0aGUgZW5jcnlwdGVkIGFuZCBhdXRoZW50aWNhdGVkIHR1bm5lbC4gVGhlIFh2ZmIgKHZpcnR1YWwKLSAgIGZyYW1lYnVmZmVyIFggc2VydmVyKSBwcm9ncmFtIG11c3QgYWxzbyBiZSBpbnN0YWxsZWQgb24gdGhlIHJlbW90ZQotICAgc3lzdGVtLiBIb3dldmVyIHRzdm5jIHdpbGwgYWxzbyBjb25uZWN0IHRvIGEgcmVhbCBYIHNlc3Npb24gKGkuZS4gb24KLSAgIHRoZSBwaHlzaWNhbCBoYXJkd2FyZSkgaWYgeW91IGFyZSBhbHJlYWR5IGxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb247Ci0gICB0aGlzIGlzIGEgdXNlZnVsIGFjY2VzcyBtb2RlIGFuZCBkb2VzIG5vdCByZXF1aXJlIFh2ZmIgb24gdGhlIHJlbW90ZQotICAgc3lzdGVtLgotCi0gICBUaGlzIG1vZGUgc2hvdWxkIGJlIHZlcnkgZWFzeSBmb3IgYmVnaW5uZXIgdXNlcnMgdG8gdW5kZXJzdGFuZCBhbmQKLSAgIHVzZS4gT24gdGhlIHJlbW90ZSBlbmQgeW91IG9ubHkgbmVlZCB0byBoYXZlIHgxMXZuYyBhbmQgWHZmYiBhdmFpbGFibGUKLSAgIGluICRQQVRILCBhbmQgb24gdGhlIGxvY2FsIGVuZCB5b3UganVzdCBydW4gc29tZXRoaW5nIGxpa2U6Ci0gICB0c3ZuYyBteW5hbWVAbXlob3N0LmNvbQotCi0gICAob3Igc3RhcnQgdXAgdGhlIHRzdm5jIEdVSSBmaXJzdCBhbmQgdGhlbiBlbnRlciBteW5hbWVAbXlob3N0LmNvbSBhbmQKLSAgIHByZXNzICJDb25uZWN0IikuCi0KLSAgIE5vcm1hbGx5IHRoZSBUZXJtaW5hbCBTZXJ2aWNlcyBzZXNzaW9ucyBjcmVhdGVkIGFyZSB2aXJ0dWFsIChSQU0tb25seSkKLSAgIG9uZXMgKGUuZy4gWHZmYiwgWGR1bW15LCBvciBYdm5jKSwgaG93ZXZlciBhIG5pY2UgZmVhdHVyZSBpcyBpZiB5b3UKLSAgIGhhdmUgYSByZWd1bGFyIFggc2Vzc2lvbiAoaS5lIGRpc3BsYXlpbmcgb24gdGhlIHBoeXNpY2FsIGhhcmR3YXJlKSBvbgotICAgdGhlIHJlbW90ZSBtYWNoaW5lIHRoYXQgeW91IGFyZSBBTFJFQURZIGxvZ2dlZCBpbnRvLCB0aGVuIHRoZSB4MTF2bmMKLSAgIHJ1biBmcm9tIHRzdm5jIHdpbGwgZmluZCBpdCBmb3IgeW91IGFzIHdlbGwuCi0KLSAgIEFsc28sIHRoZXJlIGlzIHNldHRpbmcgIlggTG9naW4iIHVuZGVyIEFkdmFuY2VkIE9wdGlvbnMgdGhhdCBhbGxvd3MKLSAgIHlvdSB0byBhdHRhY2ggdG8gYSByZWFsIFggc2VydmVyIHdpdGggbm8gb25lIGxvZ2dlZCBpbiB5ZXQgKGkuZS4KLSAgIFhETS9HRE0vS0RNIExvZ2luIEdyZWV0ZXIgc2NyZWVuKSBhcyBsb25nIGFzIHlvdSBoYXZlIHN1ZG8oMSkKLSAgIHBlcm1pc3Npb24gb24gdGhlIHJlbW90ZSBtYWNoaW5lLgotCi0gICBOaWNlIGZlYXR1cmVzIHRvIHNvb24gdG8gYmUgYWRkZWQgdG8gdGhlIHRzdm5jIG1vZGUgYXJlIGVhc3kgQ1VQUwotICAgcHJpbnRpbmcgKHdvcmtpbmcgZmFpcmx5IHdlbGwpIGFuZCBTb3VuZCByZWRpcmVjdGlvbiAobmVlZHMgbXVjaCB3b3JrKQotICAgb2YgdGhlIFRlcm1pbmFsIFNlcnZpY2VzIERlc2t0b3Agc2Vzc2lvbi4gSXQgaXMgZWFzaWVyIGluIHRzdm5jIG1vZGUKLSAgIGJlY2F1c2UgdGhlIGVudGlyZSBkZXNrdG9wIHNlc3Npb24gY2FuIGJlIHN0YXJ0ZWQgd2l0aCB0aGUgY29ycmVjdAotICAgZW52aXJvbm1lbnQuIHNzdm5jIHRyaWVzIHRvIGhhbmRsZSB0aGUgZ2VuZXJhbCBjYXNlIG9mIGFuIGFscmVhZHkKLSAgIHN0YXJ0ZWQgZGVza3RvcCBhbmQgdGhhdCBpcyBtb3JlIGRpZmZpY3VsdC4KLQotCi0gICBQcm94aWVzOiBXZWIgcHJveGllcywgU09DS1MgcHJveGllcywgYW5kIHRoZSBVbHRyYVZOQyByZXBlYXRlciBwcm94eQotICAgYXJlIHN1cHBvcnRlZCB0byBhbGxvdyB0aGUgU1NWTkMgY29ubmVjdGlvbiB0byBnbyB0aHJvdWdoIHRoZSBwcm94eSB0bwotICAgdGhlIG90aGVyd2lzZSB1bnJlYWNoYWJsZSBWTkMgU2VydmVyLiBTU0ggZ2F0ZXdheSBtYWNoaW5lcyBjYW4gYmUgdXNlZAotICAgaW4gdGhlIHNhbWUgd2F5LiBSZWFkIG1vcmUgYWJvdXQgU1NWTkMgcHJveHkgc3VwcG9ydCBoZXJlLgotCi0KLSAgIER5bmFtaWMgVk5DIFNlcnZlciBQb3J0IGRldGVybWluYXRpb246IElmIHlvdSBhcmUgcnVubmluZyBTU1ZOQyBvbgotICAgVW5peCBhbmQgYXJlIHVzaW5nIFNTSCB0byBzdGFydCB0aGUgcmVtb3RlIFZOQyBzZXJ2ZXIgYW5kIHRoZSBWTkMKLSAgIHNlcnZlciBwcmludHMgb3V0IHRoZSBsaW5lICJQT1JUPU5OTk4iIHRvIGluZGljYXRlIHdoaWNoIGR5bmFtaWMgcG9ydAotICAgaXQgaXMgdXNpbmcgKHgxMXZuYyBkb2VzIHRoaXMpLCB0aGVuIGlmIHlvdSBwcmVmaXggdGhlIFNTSCBjb21tYW5kCi0gICB3aXRoICJQT1JUPSIgU1NWTkMgd2lsbCB3YXRjaCBmb3IgdGhlIFBPUlQ9Tk5OTiBsaW5lIGFuZCB1c2VzIHNzaCdzCi0gICBidWlsdCBpbiBTT0NLUyBwcm94eSAoc3NoIC1EIC4uLikgdG8gY29ubmVjdCB0byB0aGUgZHluYW1pYyBWTkMgc2VydmVyCi0gICBwb3J0IHRocm91Z2ggdGhlIFNTSCB0dW5uZWwuIEZvciBleGFtcGxlOgotICAgICAgICBWTkMgSG9zdDpEaXNwbGF5ICAgICB1c2VyQHNvbWVob3N0LmNvbQotICAgICAgICBSZW1vdGUgU1NIIENvbW1hbmQ6ICBQT1JUPSB4MTF2bmMgLWZpbmQKLQotICAgb3IgIlBPUlQ9IHgxMXZuYyAtZGlzcGxheSA6MCAtbG9jYWxob3N0IiwgZXRjLiBPciB1c2UgIlA9IHgxMXZuYyAuLi4iCi0KLSAgIFRoZXJlIGlzIGFsc28gY29kZSB0byBkZXRlY3QgdGhlIGRpc3BsYXkgb2YgdGhlIHJlZ3VsYXIgVW5peAotICAgdm5jc2VydmVyKDEpLiBJdCBleHRyYWN0cyB0aGUgZGlzcGxheSAoYW5kIGhlbmNlIHBvcnQpIGZyb20gdGhlIGxpbmVzCi0gICAiTmV3ICdYJyBkZXNrdG9wIGlzIGhvc3RuYW1lOjQiIGFuZCBhbHNvICJWTkMgc2VydmVyIGlzIGFscmVhZHkKLSAgIHJ1bm5pbmcgYXMgOjQiLiBTbyB5b3UgY2FuIHVzZSBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgUE9SVD0gdm5jc2VydmVyOyBzbGVlcCAxNQotb3I6ICAgICBQT1JUPSB2bmNzZXJ2ZXIgOjQ7IHNsZWVwIDE1Ci0KLSAgIHRoZSBsYXR0ZXIgaXMgcHJlZmVycmVkIGJlY2F1c2Ugd2hlbiB5b3UgcmVjb25uZWN0IHdpdGggaXQgd2lsbCBmaW5kCi0gICB0aGUgYWxyZWFkeSBydW5uaW5nIG9uZS4gVGhlIGZvcm1lciBvbmUgd2lsbCBrZWVwIGNyZWF0aW5nIG5ldyBYCi0gICBzZXNzaW9ucyBpZiBjYWxsZWQgcmVwZWF0ZWRseS4KLQotICAgSWYgeW91IHVzZSBQT1JUPSBvbiBXaW5kb3dzLCBhIGxhcmdlIHJhbmRvbSBwb3J0IGlzIHNlbGVjdGVkIGluc3RlYWQKLSAgIGFuZCB0aGUgLXJmYnBvcnQgb3B0aW9uIGlzIHBhc3NlZCB0byB4MTF2bmMgKGl0IGRvZXMgbm90IHdvcmsgd2l0aAotICAgdm5jc2VydmVyKS4KLQotCi0KLSAgIFBhdGNoZXMgZm9yIFVuaXggVGlnaHR2bmMgdmlld2VyOgotCi0gICBUaGUgcmZiTmV3RkJTaXplIHN1cHBvcnQgYWxsb3dzIHRoZSBlbmhhbmNlZCBUaWdodFZOQyBVbml4IHZpZXdlciB0bwotICAgcmVzaXplIHdoZW4gdGhlIHNlcnZlciBkb2VzIChlLmcuICJ4MTF2bmMgLVIgc2NhbGU9My80IiByZW1vdGUgY29udHJvbAotICAgY29tbWFuZCkuCi0KLSAgIFRoZSBjdXJzb3IgYWxwaGFibGVuZGluZyBpcyBkZXNjcmliZWQgaGVyZS4KLQotICAgVGhlIFJlYWxWTkMgWlJMRSBlbmNvZGluZyBpcyBzdXBwb3J0ZWQsIGluIGFkZGl0aW9uIHRvIHNvbWUgbG93IGNvbG9ycwotICAgbW9kZXMgKDE2YnBwIGFuZCA4YnBwIGF0IDI1NiwgNjQsIGFuZCBldmVuIDggY29sb3JzLCBmb3IgdXNlIG9uIHZlcnkKLSAgIHNsb3cgY29ubmVjdGlvbnMpLiBHcmV5c2NhbGVzIGFyZSBhbHNvIGVuYWJsZWQgZm9yIHRoZSBsb3cgY29sb3IKLSAgIG1vZGVzLgotCi0gICBUaGUgUG9wdXAgbWVudSAoRjgpIGlzIGVuaGFuY2VkIHdpdGggdGhlIGFiaWxpdHkgdG8gY2hhbmdlIG1hbnkgdGhpbmdzCi0gICBvbiB0aGUgZmx5LiBGOSBpcyBhZGRlZCBhcyBhIHNob3J0Y3V0IHRvIHRvZ2dsZSBGdWxsU2NyZWVuIG1vZGUuCi0KLSAgIENsaWVudCBTaWRlIENhY2hpbmc6IFRoZSB4MTF2bmMgY2xpZW50LXNpZGUgY2FjaGluZyBpcyBoYW5kbGVkIG5pY2VseQotICAgYnkgdGhpcyB2aWV3ZXIuIFRoZSB2ZXJ5IGxhcmdlIHBpeGVsIGNhY2hlIGJlbG93IHRoZSBhY3R1YWwgZGlzcGxheSBpbgotICAgdGhpcyBjYWNoaW5nIG1ldGhvZCBpcyBkaXN0cmFjdGluZy4gT3VyIFVuaXggVk5DIHZpZXdlciB3aWxsCi0gICBhdXRvbWF0aWNhbGx5IHRyeSB0byBhdXRvZGV0ZWN0IHRoZSBhY3R1YWwgZGlzcGxheSBoZWlnaHQgaWYgdGhlCi0gICBmcmFtZWJ1ZmZlciBpcyB2ZXJ5IHRhbGwgKG1vcmUgdGhhbiB0d2ljZSBhcyBoaWdoIGFzIGl0IGlzIHdpZGUpLiBPbmUKLSAgIGNhbiBhbHNvIHNldCB0aGUgaGVpZ2h0IHRvIHRoZSBrbm93biB2YWx1ZSB2aWEgLXljcm9wIG4sIG9yIHVzZSAteWNyb3AKLSAgIC0xIHRvIGZvcmNlIGF1dG9kZWN0aW9uLiBJbiBmdWxsc2NyZWVuIG1vZGUgb25lIGlzIG5vdCBwb3NzaWJsZSB0bwotICAgc2Nyb2xsIGRvd24gdG8gdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4gSW4gbm9uLWZ1bGxzY3JlZW4gbW9kZSB0aGUKLSAgIHdpbmRvdyBtYW5hZ2VyIGZyYW1lIGlzICJzaHJpbmstd3JhcHBlZCIgYXJvdW5kIHRoZSBhY3R1YWwgc2NyZWVuCi0gICBkaXNwbGF5LiBZb3UgY2FuIHN0aWxsIHNjcm9sbCBkb3duIHRvIHRoZSBwaXhlbCBjYWNoZSByZWdpb24uIFRoZQotICAgc2Nyb2xsYmFycyBhcmUgc2V0IHRvIGJlIHZlcnkgdGhpbiAoMiBwaXhlbHMpIHRvIGJlIGxlc3MgZGlzdHJhY3RpbmcuCi0gICBVc2UgdGhlIC1zYndpZHRoIG4gdG8gbWFrZSB0aGVtIHdpZGVyLgotCi0gICBQcm9iYWJseSBub2JvZHkgaXMgaW50ZXJlc3RlZCBpbiB0aGUgZ3JhYnNlcnZlciBwYXRjaCBmb3Igb2xkIHdpbmRvdwotICAgbWFuYWdlcnMgd2hlbiB0aGUgdmlld2VyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZS4uLiBUaGlzIGFuZCBzb21lIG90aGVyCi0gICB1bmZpeGVkIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkIGluIG91ciBwYXRjaGVzIChmdWxsc2NyZWVuIHRvZ2dsZSB3b3JrcwotICAgd2l0aCBLREUsIC14MTFjdXJzb3IgaGFzIGJlZW4gZml4ZWQsIGFuZCB0aGUgZG90IGN1cnNvciBoYXMgYmVlbiBtYWRlCi0gICBzbWFsbGVyKS4KLQotICAgRnJvbSB0aGUgLWhlbHAgb3V0cHV0OgotU1NWTkMgVmlld2VyIChiYXNlZCBvbiBUaWdodFZOQyB2aWV3ZXIgdmVyc2lvbiAxLjMuOSkKLQotVXNhZ2U6IHZuY3ZpZXdlciBbPE9QVElPTlM+XSBbPEhPU1Q+XVs6PERJU1BMQVkjPl0KLSAgICAgICB2bmN2aWV3ZXIgWzxPUFRJT05TPl0gWzxIT1NUPl1bOjo8UE9SVCM+XQotICAgICAgIHZuY3ZpZXdlciBbPE9QVElPTlM+XSBleGVjPVtDTUQgQVJHUy4uLl0KLSAgICAgICB2bmN2aWV3ZXIgWzxPUFRJT05TPl0gZmQ9bgotICAgICAgIHZuY3ZpZXdlciBbPE9QVElPTlM+XSAvcGF0aC90by91bml4L3NvY2tldAotICAgICAgIHZuY3ZpZXdlciBbPE9QVElPTlM+XSAtbGlzdGVuIFs8RElTUExBWSM+XQotICAgICAgIHZuY3ZpZXdlciAtaGVscAotCi08T1BUSU9OUz4gYXJlIHN0YW5kYXJkIFh0IG9wdGlvbnMsIG9yOgotICAgICAgICAtdmlhIDxHQVRFV0FZPgotICAgICAgICAtc2hhcmVkIChzZXQgYnkgZGVmYXVsdCkKLSAgICAgICAgLW5vc2hhcmVkCi0gICAgICAgIC12aWV3b25seQotICAgICAgICAtZnVsbHNjcmVlbgotICAgICAgICAtbm9yYWlzZW9uYmVlcAotICAgICAgICAtcGFzc3dkIDxQQVNTV0QtRklMRU5BTUU+IChzdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb24pCi0gICAgICAgIC11c2VyIDxVU0VSTkFNRT4gKFVuaXggbG9naW4gYXV0aGVudGljYXRpb24pCi0gICAgICAgIC1lbmNvZGluZ3MgPEVOQ09ESU5HLUxJU1Q+IChlLmcuICJ0aWdodCxjb3B5cmVjdCIpCi0gICAgICAgIC1iZ3IyMzMKLSAgICAgICAgLW93bmNtYXAKLSAgICAgICAgLXRydWVjb2xvdXIKLSAgICAgICAgLWRlcHRoIDxERVBUSD4KLSAgICAgICAgLWNvbXByZXNzbGV2ZWwgPENPTVBSRVNTLVZBTFVFPiAoMC4uOTogMC1mYXN0LCA5LWJlc3QpCi0gICAgICAgIC1xdWFsaXR5IDxKUEVHLVFVQUxJVFktVkFMVUU+ICgwLi45OiAwLWxvdywgOS1oaWdoKQotICAgICAgICAtbm9qcGVnCi0gICAgICAgIC1ub2N1cnNvcnNoYXBlCi0gICAgICAgIC14MTFjdXJzb3IKLSAgICAgICAgLWF1dG9wYXNzCi0KLU9wdGlvbiBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGUuZy4gLWJnciBpbnN0ZWFkIG9mIC1iZ3IyMzMuCi1TZWUgdGhlIG1hbnVhbCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KLUVuaGFuY2VkIFRpZ2h0Vk5DIHZpZXdlciAoU1NWTkMpIG9wdGlvbnM6Ci0KLSAgIFVSTCBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3Nzdm5jLmh0bWwKLQotICAgTm90ZTogWlJMRSBhbmQgWllXUkxFIGVuY29kaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KLQotICAgTm90ZTogRjkgaXMgc2hvcnRjdXQgdG8gVG9nZ2xlIEZ1bGxTY3JlZW4gbW9kZS4KLQotICAgTm90ZTogSW4gLWxpc3RlbiBtb2RlIHNldCB0aGUgZW52IHZhci4gU1NWTkNfTVVMVElQTEVfTElTVEVOPTEKLSAgICAgICAgIHRvIGFsbG93IG1vcmUgdGhhbiBvbmUgaW5jb21pbmcgVk5DIHNlcnZlciBhdCBhIHRpbWUuCi0gICAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIC1tdWx0aWxpc3RlbiBkZXNjcmliZWQgYmVsb3cuICBTZXQKLSAgICAgICAgIFNTVk5DX01VTFRJUExFX0xJU1RFTj1NQVg6biB0byBhbGxvdyBubyBtb3JlIHRoYW4gIm4iCi0gICAgICAgICBzaW11bHRhbmVvdXMgcmV2ZXJzZSBjb25uZWN0aW9ucy4KLQotICAgTm90ZTogSWYgdGhlIGhvc3Q6cG9ydCBpcyBzcGVjaWZpZWQgYXMgImV4ZWM9Y29tbWFuZCBhcmdzLi4uIgotICAgICAgICAgdGhlbiBpbnN0ZWFkIG9mIG1ha2luZyBhIFRDUC9JUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUKLSAgICAgICAgIHJlbW90ZSBWTkMgc2VydmVyLCAiY29tbWFuZCBhcmdzLi4uIiBpcyBleGVjdXRlZCBhbmQgdGhlCi0gICAgICAgICB2aWV3ZXIgaXMgYXR0YWNoZWQgdG8gaXRzIHN0ZGlvLiAgVGhpcyBlbmFibGVzIHR1bm5lbGxpbmcKLSAgICAgICAgIGVzdGFibGlzaGVkIHZpYSBhbiBleHRlcm5hbCBjb21tYW5kLCBlLmcuIGFuIHN0dW5uZWwoOCkKLSAgICAgICAgIHRoYXQgZG9lcyBub3QgaW52b2x2ZSBhIGxpc3RlbmluZyBzb2NrZXQuICBUaGlzIG1vZGUgZG9lcwotICAgICAgICAgbm90IHdvcmsgZm9yIC1saXN0ZW4gcmV2ZXJzZSBjb25uZWN0aW9ucy4KLQotICAgICAgICAgSWYgdGhlIGhvc3Q6cG9ydCBpcyBzcGVjaWZpZWQgYXMgImZkPW4iIHRoZW4gaXQgaXMgYXNzdW1lZAotICAgICAgICAgbiBpcyBhbiBhbHJlYWR5IG9wZW5lZCBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHNvY2tldC4gKGkuZQotICAgICAgICAgdGhlIHBhcmVudCBkaWQgZm9yaytleGVjKQotCi0gICAgICAgICBJZiB0aGUgaG9zdDpwb3J0IGNvbnRhaW5zIGEgJy8nIGl0IGlzIGludGVycHJldGVkIGFzIGEKLSAgICAgICAgIHVuaXgtZG9tYWluIHNvY2tldCAoQUZfTE9DQUwgaW5zZWFkIG9mIEFGX0lORVQpCi0KLSAgICAgICAgLW11bHRpbGlzdGVuICBBcyBpbiAtbGlzdGVuIChyZXZlcnNlIGNvbm5lY3Rpb24gbGlzdGVuaW5nKSBleGNlcHQKLSAgICAgICAgICAgICAgICAgICAgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIHRvIGJlIGNvbm5lY3RlZAotICAgICAgICAgICAgICAgICAgICBhdCBhIHRpbWUuICBUaGUgZGVmYXVsdCBmb3IgLWxpc3RlbiBvZiBvbmx5IG9uZSBhdCBhCi0gICAgICAgICAgICAgICAgICAgIHRpbWUgdHJpZXMgdG8gcGxheSBpdCBzYWZlIGJ5IG5vdCBhbGxvd2luZyBhbnlvbmUgb24KLSAgICAgICAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgdG8gcHV0IChtYW55KSBkZXNrdG9wcyBvbiB5b3VyIHNjcmVlbiBvdmVyCi0gICAgICAgICAgICAgICAgICAgIGEgbG9uZyB3aW5kb3cgb2YgdGltZS4gVXNlIC1tdWx0aWxpc3RlbiBmb3Igbm8gbGltaXQuCi0KLSAgICAgICAgLWFjY2VwdHBvcHVwICBJbiAtbGlzdGVuIChyZXZlcnNlIGNvbm5lY3Rpb24gbGlzdGVuaW5nKSBtb2RlIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgYSByZXZlcnNlIFZOQyBjb25uZWN0aW9uIGNvbWVzIGluIHNob3cgYSBwb3B1cCBhc2tpbmcKLSAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBBY2NlcHQgb3IgUmVqZWN0IHRoZSBjb25uZWN0aW9uLiAgVGhlIElQCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3RpbmcgaG9zdCBpcyBzaG93bi4gIFNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZyB0aGUgZW52LiB2YXIuIFNTVk5DX0FDQ0VQVF9QT1BVUD0xLgotCi0gICAgICAgIC1hY2NlcHRwb3B1cHNjICBBcyBpbiAtYWNjZXB0cG9wdXAgZXhjZXB0IGFzc3VtZSBVbHRyYVZOQyBTaW5nbGUKLSAgICAgICAgICAgICAgICAgICAgQ2xpY2sgKFNDKSBzZXJ2ZXIuICBSZXRyaWV2ZSBVc2VyIGFuZCBDb21wdXRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgaW5mbyBmcm9tIFVsdHJhVk5DIFNlcnZlciBhbmQgZGlzcGxheSBpbiB0aGUgUG9wdXAuCi0KLSAgICAgICAgLXVzZTY0ICAgICAgSW4gLWJncjIzMyBtb2RlLCB1c2UgNjQgY29sb3JzIGluc3RlYWQgb2YgMjU2LgotICAgICAgICAtYmdyMjIyICAgICBTYW1lIGFzIC11c2U2NC4KLQotICAgICAgICAtdXNlOCAgICAgICBJbiAtYmdyMjMzIG1vZGUsIHVzZSA4IGNvbG9ycyBpbnN0ZWFkIG9mIDI1Ni4KLSAgICAgICAgLWJncjExMSAgICAgU2FtZSBhcyAtdXNlOC4KLQotICAgICAgICAtMTZicHAgICAgICBJZiB0aGUgdm5jIHZpZXdlciBYIGRpc3BsYXkgaXMgZGVwdGggMjQgYXQgMzJicHAKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBhIDE2YnBwIGZvcm1hdCBmcm9tIHRoZSBWTkMgc2VydmVyIHRvIGN1dAotICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIHRyYWZmaWMgYnkgdXAgdG8gMlgsIHRoZW4gdHJhbmxhdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byAzMmJwcCBsb2NhbGx5LgotICAgICAgICAtYmdyNTY1ICAgICBTYW1lIGFzIC0xNmJwcC4KLQotICAgICAgICAtZ3JleSAgICAgICBVc2UgYSBncmV5IHNjYWxlIGZvciB0aGUgMTYtIGFuZCA4LWJwcCBtb2Rlcy4KLQotICAgICAgICAtYWxwaGEgICAgICBVc2UgYWxwaGFibGVuZGluZyB0cmFuc3BhcmVuY3kgZm9yIGxvY2FsIGN1cnNvcnMKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXM6IHgxMXZuYyBzZXJ2ZXIsIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSAzMmJwcCBhbmQgc2FtZSBlbmRpYW5uZXNzLgotCi0gICAgICAgIC1zY2FsZSBzdHIgIFNjYWxlIHRoZSBkZXNrdG9wIGxvY2FsbHkuICBUaGUgc3RyaW5nICJzdHIiIGNhbgotICAgICAgICAgICAgICAgICAgICBhIGZsb2F0aW5nIHBvaW50IHJhdGlvLCBlLmcuICIwLjkiLCBvciBhIGZyYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBlLmcuICIzLzQiLCBvciBXeEgsIGUuZy4gMTI4MHgxMDI0LiAgVXNlICJmaXQiCi0gICAgICAgICAgICAgICAgICAgIHRvIGZpdCBpbiB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZS4gIFVzZSAiYXV0byIgdG8KLSAgICAgICAgICAgICAgICAgICAgZml0IGluIHRoZSB3aW5kb3cgc2l6ZS4gICJzdHIiIGNhbiBhbHNvIGJlIHNldCBieQotICAgICAgICAgICAgICAgICAgICB0aGUgZW52LiB2YXIuIFNTVk5DX1NDQUxFLgotCi0gICAgICAgICAgICAgICAgICAgIElmIHlvdSBvYnNlcnZlIG1vdXNlIHRyYWlsIHBhaW50aW5nIGVycm9ycywgZW5hYmxlCi0gICAgICAgICAgICAgICAgICAgIFgxMSBDdXJzb3IgbW9kZSAoZWl0aGVyIHZpYSBQb3B1cCBvciAteDExY3Vyc29yLikKLQotICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgc2NhbGluZyBpcyBkb25lIGluIHNvZnR3YXJlIGFuZCBzbyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgc2xvdyBhbmQgcmVxdWlyZXMgbW9yZSBtZW1vcnkuICBTb21lIHNwZWVkdXAgVGlwczoKLQotICAgICAgICAgICAgICAgICAgICAgICAgWlJMRSBpcyBmYXN0ZXIgdGhhbiBUaWdodCBpbiB0aGlzIG1vZGUuICBXaGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nIGlzIGZpcnN0IGRldGVjdGVkLCB0aGUgZW5jb2Rpbmcgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byBaUkxFLiAgVXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgUG9wdXAgbWVudSBpZiB5b3Ugd2FudCB0byBnbyBiYWNrIHRvIFRpZ2h0LgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IFNTVk5DX1BSRVNFUlZFX0VOQ09ESU5HPTEgdG8gZGlzYWJsZSB0aGlzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSBzb2xpZCBiYWNrZ3JvdW5kIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIG1hbnVhbGx5IG9yIHZpYSB4MTF2bmMgLXNvbGlkIC4uLikKLQotICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbW90ZSBzZXJ2ZXIgaXMgeDExdm5jLCB0cnkgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaWRlIGNhY2hpbmc6IHgxMXZuYyAtbmNhY2hlIDEwIC4uLgotCi0gICAgICAgIC15Y3JvcCBuICAgIE9ubHkgc2hvdyB0aGUgdG9wIG4gcm93cyBvZiB0aGUgZnJhbWVidWZmZXIuICBGb3IKLSAgICAgICAgICAgICAgICAgICAgdXNlIHdpdGggeDExdm5jIC1uY2FjaGUgY2xpZW50IGNhY2hpbmcgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRvIGhlbHAgImhpZGUiIHRoZSBwaXhlbCBjYWNoZSByZWdpb24uCi0gICAgICAgICAgICAgICAgICAgIFVzZSBhIG5lZ2F0aXZlIHZhbHVlIChlLmcuIC0xKSBmb3IgYXV0b2RldGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgQXV0b2RldGVjdGlvbiB3aWxsIGFsd2F5cyB0YWtlIHBsYWNlIGlmIHRoZSByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgZmIgaGVpZ2h0IGlzIG1vcmUgdGhhbiAyIHRpbWVzIHRoZSB3aWR0aC4KLQotICAgICAgICAtc2J3aWR0aCBuICBTY3JvbGxiYXIgd2lkdGggZm9yIHgxMXZuYyAtbmNhY2hlIG1vZGUgKC15Y3JvcCksCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdmVyeSBuYXJyb3c6IDIgcGl4ZWxzLCBpdCBpcyBuYXJyb3cgdG8KLSAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGlzdHJhY3Rpb24gaW4gLXljcm9wIG1vZGUuCi0KLSAgICAgICAgLW5vYmVsbCAgICAgRGlzYWJsZSBiZWxsLgotCi0gICAgICAgIC1yYXdsb2NhbCAgIFByZWZlciByYXcgZW5jb2RpbmcgZm9yIGxvY2FsaG9zdCwgZGVmYXVsdCBpcwotICAgICAgICAgICAgICAgICAgICBubywgaS5lLiBhc3N1bWVzIHlvdSBoYXZlIGEgU1NIIHR1bm5lbCBpbnN0ZWFkLgotCi0gICAgICAgIC1ub3R0eSAgICAgIFRyeSB0byBhdm9pZCB1c2luZyB0aGUgdGVybWluYWwgZm9yIGludGVyYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlczogdXNlIHdpbmRvd3MgZm9yIG1lc3NhZ2VzIGFuZCBwcm9tcHRpbmcKLSAgICAgICAgICAgICAgICAgICAgaW5zdGVhZC4gIE1lc3NhZ2VzIHdpbGwgYWxzbyBiZSBwcmludGVkIHRvIHRlcm1pbmFsLgotCi0gICAgICAgIC1zZW5kY2xpcGJvYXJkICBTZW5kIHRoZSBYIENMSVBCT0FSRCBzZWxlY3Rpb24gKGkuZS4gQ3RybCtDLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3RybCtWKSBpbnN0ZWFkIG9mIHRoZSBYIFBSSU1BUlkgc2VsZWN0aW9uIChtb3VzZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGFuZCBtaWRkbGUgYnV0dG9uIHBhc3RlLikKLQotICAgICAgICAtc2VuZGFsd2F5cyAgICAgV2hlbmV2ZXIgdGhlIG1vdXNlIGVudGVycyB0aGUgVk5DIHZpZXdlciBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCBoYXMgbm90IGNoYW5nZWQuICBUaGlzIGlzIGxpa2UgdGhlIFh0IHJlc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpCi0KLSAgICAgICAgLXJlY3Z0ZXh0IHN0ciAgIFdoZW4gY3V0IHRleHQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVk5DIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdm5jdmlld2VyIHdpbGwgc2V0IGJvdGggdGhlIFggUFJJTUFSWSBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBYIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0LCBzcGVjaWZ5ICdzdHInIGFzICdwcmltYXJ5JywgJ2NsaXBib2FyZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICBvciAnYm90aCcgKHRoZSBkZWZhdWx0LikKLQotICAgICAgICAtZ3JhYmFsbCAgICBHcmFiIHRoZSBlbnRpcmUgWCBzZXJ2ZXIgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIG5lZWRlZCBieSBzb21lIG9sZCB3aW5kb3cgbWFuYWdlcnMgbGlrZSBmdndtMi4KLQotICAgICAgICAtcG9wdXBmaXggICBXYXJwIHRoZSBwb3B1cCBiYWNrIHRvIHRoZSBwb2ludGVyIHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCi0gICAgICAgIC1zZW5kY2xpcGJvYXJkICBTZW5kIHRoZSBYIENMSVBCT0FSRCBzZWxlY3Rpb24gKGkuZS4gQ3RybCtDLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3RybCtWKSBpbnN0ZWFkIG9mIHRoZSBYIFBSSU1BUlkgc2VsZWN0aW9uIChtb3VzZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGFuZCBtaWRkbGUgYnV0dG9uIHBhc3RlLikKLQotICAgICAgICAtc2VuZGFsd2F5cyAgICAgV2hlbmV2ZXIgdGhlIG1vdXNlIGVudGVycyB0aGUgVk5DIHZpZXdlciBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCBoYXMgbm90IGNoYW5nZWQuICBUaGlzIGlzIGxpa2UgdGhlIFh0IHJlc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpCi0KLSAgICAgICAgLXJlY3Z0ZXh0IHN0ciAgIFdoZW4gY3V0IHRleHQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVk5DIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdm5jdmlld2VyIHdpbGwgc2V0IGJvdGggdGhlIFggUFJJTUFSWSBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBYIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0LCBzcGVjaWZ5ICdzdHInIGFzICdwcmltYXJ5JywgJ2NsaXBib2FyZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICBvciAnYm90aCcgKHRoZSBkZWZhdWx0LikKLQotICAgICAgICAtZ3JhYmFsbCAgICBHcmFiIHRoZSBlbnRpcmUgWCBzZXJ2ZXIgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIG5lZWRlZCBieSBzb21lIG9sZCB3aW5kb3cgbWFuYWdlcnMgbGlrZSBmdndtMi4KLQotICAgICAgICAtcG9wdXBmaXggICBXYXJwIHRoZSBwb3B1cCBiYWNrIHRvIHRoZSBwb2ludGVyIHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCi0KLSAgICAgICAgLWdyYWJrYmQgICAgR3JhYiB0aGUgWCBrZXlib2FyZCB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJ5IHNvbWUgd2luZG93IG1hbmFnZXJzLiBTYW1lIGFzIC1ncmFia2V5Ym9hcmQuCi0gICAgICAgICAgICAgICAgICAgIC1ncmFia2JkIGlzIHRoZSBkZWZhdWx0LCB1c2UgLW5vZ3JhYmtiZCB0byBkaXNhYmxlLgotCi0gICAgICAgIC1icywgLW5vYnMgIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBYIHNlcnZlciBCYWNraW5nc3RvcmUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBtYWluIHZpZXdlciB3aW5kb3cuICBUaGUgZGVmYXVsdCBpcyB0byBub3QsIG1haW5seQotICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG1vc3QgTGludXgsIGV0Yywgc3lzdGVtcyBYIHNlcnZlcnMgZGlzYWJsZQotICAgICAgICAgICAgICAgICAgICAqYWxsKiBCYWNraW5nc3RvcmUgYnkgZGVmYXVsdC4gIFRvIHJlLWVuYWJsZSBpdCBwdXQKLQotICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uICJCYWNraW5nc3RvcmUiCi0KLSAgICAgICAgICAgICAgICAgICAgaW4gdGhlIERldmljZSBzZWN0aW9uIG9mIC9ldGMvWDExL3hvcmcuY29uZi4KLSAgICAgICAgICAgICAgICAgICAgSW4gLWJzIG1vZGUgd2l0aCBubyBYIHNlcnZlciBiYWNraW5nc3RvcmUsIHdoZW5ldmVyIGFuCi0gICAgICAgICAgICAgICAgICAgIGFyZWEgb2YgdGhlIHNjcmVlbiBpcyByZS1leHBvc2VkIGl0IG11c3QgZ28gb3V0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICBWTkMgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBwaXhlbHMuIFRoaXMgaXMgdG9vIHNsb3cuCi0KLSAgICAgICAgICAgICAgICAgICAgSW4gLW5vYnMgbW9kZSwgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSB0aGUgdmlld2VyIHRvCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgaXRzIG93biBiYWNraW5nIG9mIHRoZSBtYWluIHZpZXdlciB3aW5kb3cuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgbWFrZXMgc29tZSBhY3Rpdml0aWVzIGZhc3RlciAoY2hhbmdlcyBpbiBsYXJnZQotICAgICAgICAgICAgICAgICAgICByZWdpb25zKSBidXQgY2FuIGFwcGVhciB0byAiZmxhc2giIHRvbyBtdWNoLgotCi0gICAgICAgIC1ub3NobSAgICAgIERpc2FibGUgdXNlIG9mIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAobm90IHJlY29tbWVuZGVkCi0pCi0KLSAgICAgICAgLXRlcm1jaGF0ICAgRG8gdGhlIFVsdHJhVk5DIGNoYXQgaW4gdGhlIHRlcm1pbmFsIHZuY3ZpZXdlciBpcyBpbgotICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluIGFuIGluZGVwZW5kZW50IHdpbmRvdy4KLQotICAgICAgICAtdW5peHB3IHN0ciBVc2VmdWwgZm9yIGxvZ2dpbmcgaW50byB4MTF2bmMgaW4gLXVuaXhwdyBtb2RlLiAic3RyIiBpcyBhCi0gICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGF0IGFsbG93cyBtYW55IHdheXMgdG8gZW50ZXIgdGhlIFVuaXggVXNlcm5hbWUKLSAgICAgICAgICAgICAgICAgICAgYW5kIFVuaXggUGFzc3dvcmQuICBUaGVzZSBjaGFyYWN0ZXJzOiB1c2VybmFtZSwgbmV3bGluZSwKLSAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsIG5ld2xpbmUgYXJlIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIgYWZ0ZXIgYW55IFZOQwotICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBoYXMgdGFrZW4gcGxhY2UuICBVbmRlciB4MTF2bmMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIC11bml4cHcgbG9naW4uICBPdGhlciBWTkMgc2VydmVycyBjb3VsZCBkbwotICAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgc2ltaWxhci4KLQotICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gaW5kaWNhdGUgInN0ciIgdmlhIHRoZSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBTU1ZOQ19VTklYUFcuCi0KLSAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBFc2NhcGUga2V5IGlzIGFjdHVhbGx5IHNlbnQgZmlyc3QgdG8gdGVsbAotICAgICAgICAgICAgICAgICAgICB4MTF2bmMgdG8gbm90IGVjaG8gdGhlIFVuaXggVXNlcm5hbWUgYmFjayB0byB0aGUgVk5DCi0gICAgICAgICAgICAgICAgICAgIHZpZXdlci4gU2V0IFNTVk5DX1VOSVhQV19OT0VTQz0xIHRvIG92ZXJyaWRlIHRoaXMuCi0KLSAgICAgICAgICAgICAgICAgICAgSWYgc3RyIGlzICIuIiwgdGhlbiB5b3UgYXJlIHByb21wdGVkIGF0IHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIG5vcm1hbCB3YXkuICBJZiBzdHIgaXMKLSAgICAgICAgICAgICAgICAgICAgIi0iIHRoZSBzdGRpbiBpcyByZWFkIHZpYSBnZXRwYXNzKDMpIGZvciB1c2VybmFtZUBwYXNzd29yZC4KLSAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIGlmIHN0ciBpcyBhIGZpbGUsIGl0IGlzIG9wZW5lZCBhbmQgdGhlIGZpcnN0IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgcmVhZCBpcyB0YWtlbiBhcyB0aGUgVW5peCB1c2VybmFtZSBhbmQgdGhlIDJuZCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQuIElmIHN0ciBwcmVmaXhlZCBieSAicm06IiB0aGUgZmlsZSBpcyByZW1vdmVkCi0gICAgICAgICAgICAgICAgICAgIGFmdGVyIHJlYWRpbmcuIE90aGVyd2lzZSwgaWYgc3RyIGhhcyBhICJAIiBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGl0IGlzIHRha2VuIGFzIHVzZXJuYW1lQHBhc3N3b3JkLiBPdGhlcndpc2UsIHRoZSBwcm9ncmFtCi0gICAgICAgICAgICAgICAgICAgIGV4aXRzIHdpdGggYW4gZXJyb3IuIEdvdCBhbGwgdGhhdD8KLQotICAgICAtcmVwZWF0ZXIgc3RyICBUaGlzIGlzIGZvciB1c2Ugd2l0aCBVbHRyYVZOQyByZXBlYXRlciBwcm94eSBkZXNjcmliZWQKLSAgICAgICAgICAgICAgICAgICAgaGVyZTogaHR0cDovL3d3dy51dm5jLmNvbS9hZGRvbnMvcmVwZWF0ZXIuaHRtbC4gIFRoZSAic3RyIgotICAgICAgICAgICAgICAgICAgICBpcyB0aGUgSUQgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHJlcGVhdGVyLiAgRS5nLiBJRDoxMjM0Ci0gICAgICAgICAgICAgICAgICAgIEl0IGNhbiBhbHNvIGJlIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBvciBkaXNwbGF5IG9mIHRoZSBWTkMKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLCBlLmcuIDEyLjM0LjU2Ljc4OjAgb3Igc25vb3B5LmNvbToxLiAgTm90ZSB0aGF0IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgdXNpbmcgLXJlcGVhdGVyLCB0aGUgaG9zdDpkcHkgb24gdGhlIGNtZGxpbmUgaXMgdGhlIHJlcGVhdGUKLXIKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLCBOT1QgdGhlIFZOQyBzZXJ2ZXIuICBUaGUgcmVwZWF0ZXIgd2lsbCBjb25uZWN0IHlvdS4KLQotICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiB2bmN2aWV3ZXIgLi4uIC1yZXBlYXRlciBJRDozMzMzIHJlcGVhdC5ob3N0OjU5MDAKLSAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogdm5jdmlld2VyIC4uLiAtcmVwZWF0ZXIgdmhvc3Q6MCByZXBlYXQuaG9zdDo1OTAwCi0KLSAgICAgICAgICAgICAgICAgICAgVXNlLCBlLmcuLCAnLXJlcGVhdGVyIFNDSUlJPUlEOjMyMTAnIGlmIHRoZSByZXBlYXRlciBpcyBhCi0gICAgICAgICAgICAgICAgICAgIFNpbmdsZSBDbGljayBJSUkgKFNTTCkgcmVwZWF0ZXIgKHJlcGVhdGVyX1NTTC5leGUpIGFuZCB5b3UKLSAgICAgICAgICAgICAgICAgICAgYXJlIHBhc3NpbmcgdGhlIFNTTCBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHRocm91Z2ggc3R1bm5lbCwKLSAgICAgICAgICAgICAgICAgICAgc29jYXQsIGV0Yy4gVGhpcyB3YXkgdGhlIG1hZ2ljIFVsdHJhVk5DIHN0cmluZyAndGVzdEInCi0gICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byB3b3JrIHdpdGggdGhlIHJlcGVhdGVyIGlzIHNlbnQgdG8gaXQuCi0KLSAgICAgLXJmYnZlcnNpb24gc3RyIFNldCB0aGUgYWR2ZXJ0aXNlZCBSRkIgdmVyc2lvbi4gIEUuZy46IC1yZmJ2ZXJzaW9uIDMuNgotICAgICAgICAgICAgICAgICAgICBGb3Igc29tZSBzZXJ2ZXJzLCBlLmcuIFVsdHJhVk5DIHRoaXMgbmVlZHMgdG8gYmUgZG9uZS4KLQotICAgICAtdWx0cmFkc20gICAgICBVbHRyYVZOQyBoYXMgc3ltbWV0cmljIHByaXZhdGUga2V5IGVuY3J5cHRpb24gRFNNIHBsdWdpbnM6Ci0gICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudXZuYy5jb20vZmVhdHVyZXMvZW5jcnlwdGlvbi5odG1sLiBJdCBpcyBhc3N1bWVkCi0gICAgICAgICAgICAgICAgICAgIHlvdSBhcmUgdXNpbmcgYSB1bml4IHByb2dyYW0gKGUuZy4gb3VyIHVsdHJhdm5jX2RzbV9oZWxwZXIpCi0gICAgICAgICAgICAgICAgICAgIHRvIGVuY3J5cHQgYW5kIGRlY3J5cHQgdGhlIFVsdHJhVk5DIERTTSBzdHJlYW0uIElOIEFERElUSU9OCi0gICAgICAgICAgICAgICAgICAgIFRPIFRIQVQgc3VwcGx5IC11bHRyYWRzbSB0byB0ZWxsIFRISVMgdmlld2VyIHRvIG1vZGlmeSB0aGUKLSAgICAgICAgICAgICAgICAgICAgUkZCIGRhdGEgc2VudCBzbyBhcyB0byB3b3JrIHdpdGggdGhlIFVsdHJhVk5DIFNlcnZlci4gRm9yCi0gICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhc29uLCBlYWNoIFJGQiBtc2cgdHlwZSBtdXN0IGJlIHNlbnQgdHdpY2UgdW5kZXIgRFNNCi0uCi0KLSAgICAgLW1zbG9nb24gdXNlciAgVXNlIFdpbmRvd3MgTVMgTG9nb24gdG8gYW4gVWx0cmFWTkMgc2VydmVyLiAgU3VwcGx5IHRoZQotICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSBvciAiMSIgdG8gYmUgcHJvbXB0ZWQuICBUaGUgZGVmYXVsdCBpcyB0bwotICAgICAgICAgICAgICAgICAgICBhdXRvZGV0ZWN0IHRoZSBVbHRyYVZOQyBNUyBMb2dvbiBzZXJ2ZXIgYW5kIHByb21wdCBmb3IKLSAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KLQotICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQgTk9URTogVGhlIFVsdHJhVk5DIE1TLUxvZ29uIERpZmZpZS1IZWxsbWFuCi0gICAgICAgICAgICAgICAgICAgIGV4Y2hhbmdlIGlzIHZlcnkgd2VhayBhbmQgY2FuIGJlIGJydXRlIGZvcmNlZCB0byByZWNvdmVyCi0gICAgICAgICAgICAgICAgICAgIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluIGEgZmV3IHNlY29uZHMgb2YgQ1BVIHRpbWUuCi0gICAgICAgICAgICAgICAgICAgIFRvIGJlIHNhZmUsIGJlIHN1cmUgdG8gdXNlIGFuIGFkZGl0aW9uYWwgZW5jcnlwdGVkIHR1bm5lbAotICAgICAgICAgICAgICAgICAgICAoZS5nLiBTU0wgb3IgU1NIKSBmb3IgdGhlIGVudGlyZSBWTkMgc2Vzc2lvbi4KLQotICAgICAtY2hhdG9ubHkgICAgICBUcnkgdG8gYmUgYSBjbGllbnQgdGhhdCBvbmx5IGRvZXMgVWx0cmFWTkMgdGV4dCBjaGF0LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgIG1vZGUgaXMgdXNlZCBieSB4MTF2bmMgdG8gcHJlc2VudCBhIGNoYXQgd2luZG93IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBYMTEgY29uc29sZSAoaS5lLiBjaGF0IHdpdGggdGhlIHBlcnNvbiBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkuCi0KLSAgICAgLWVudiBWQVI9VkFMVUUgVG8gc2F2ZSB3cml0aW5nIGEgc2hlbGwgc2NyaXB0IHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSwKLSAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBhcyBtYW55IGFzIHlvdSBuZWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IKLSAgICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgLWVudiBTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOjUgLWVudiBFRElUT1I9dmkKLQotICAgICAtbm9pcHY2ICAgICAgICBEaXNhYmxlIGFsbCBJUHY2IHNvY2tldHMuICBTYW1lIGFzIFZOQ1ZJRVdFUl9OT19JUFY2PTEuCi0KLSAgICAgLW5vaXB2NCAgICAgICAgRGlzYWJsZSBhbGwgSVB2NCBzb2NrZXRzLiAgU2FtZSBhcyBWTkNWSUVXRVJfTk9fSVBWND0xLgotCi0gICAgIC1wcmludHJlcyAgICAgIFByaW50IG91dCB0aGUgU3N2bmMgWCByZXNvdXJjZXMgKGFwcGRlZmF1bHRzKSBhbmQgdGhlbiBleGl0Ci0gICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2F2ZSB0aGVtIHRvIGEgZmlsZSBhbmQgY3VzdG9taXplIHRoZW0gKGUuZy4gdGhlCi0gICAgICAgICAgICAgICAgICAgIGtleWJpbmRpbmdzIGFuZCBQb3B1cCBtZW51KSAgVGhlbiBwb2ludCB0byB0aGUgZmlsZSB2aWEKLSAgICAgICAgICAgICAgICAgICAgWEVOVklST05NRU5UIG9yIFhBUFBMUkVTRElSLgotCi0gICAgIC1waXBlbGluZSAgICAgIExpa2UgVHVyYm9WTkMsIHJlcXVlc3QgdGhlIG5leHQgZnJhbWVidWZmZXIgdXBkYXRlIGFzIHNvb24KLSAgICAgICAgICAgICAgICAgICAgYXMgcG9zc2libGUgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgdXBkYXRlIGNvbWluZyBpbi4gIEhlbHBzICdwaXBlbGluZScgdGhlIHVwZGF0ZXMKLS4KLSAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBjdXJyZW50bHkgdGhlIGRlZmF1bHQsIHVzZSAtbm9waXBlbGluZSB0byBkaXNhYmxlLgotCi0gICAgIC1hcHBzaGFyZSAgICAgIEVuYWJsZSBmZWF0dXJlcyBmb3IgdXNlIHdpdGggeDExdm5jJ3MgLWFwcHNoYXJlIG1vZGUgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBzaGFyaW5nIHRoZSBmdWxsIGRlc2t0b3Agb25seSB0aGUgYXBwbGljYXRpb24ncwotICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIGFyZSBzaGFyZWQuICBWaWV3ZXIgbXVsdGlsaXN0ZW4gbW9kZSBpcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB0aGUgbXVsdGlwbGUgd2luZG93czogLW11bHRpbGlzdGVuIGlzIGltcGxpZWQuCi0gICAgICAgICAgICAgICAgICAgIFNlZSAneDExdm5jIC1hcHBzaGFyZSAtaGVscCcgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcyBlbmFibGVkIGluIHRoZSB2aWV3ZXIgdW5kZXIgLWFwcHNoYXJlIGFyZToKLSAgICAgICAgICAgICAgICAgICAgTWluaW11bSBleHRyYSB0ZXh0IGluIHRoZSB0aXRsZSwgYXV0byAteWNyb3AgaXMgZGlzYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtcmVtb3RlX3ByZWZpeCBYMTFWTkNfQVBQU0hBUkVfQ01EOiBtZXNzYWdlIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgIHgxMXZuYyBpbml0aWFsIHdpbmRvdyBwb3NpdGlvbiBoaW50cy4gIFNlZSBhbHNvIEVzY2FwZSBLZXlzCi0gICAgICAgICAgICAgICAgICAgIGJlbG93IGZvciBhZGRpdGlvbmFsIGtleSBhbmQgbW91c2UgYmluZGluZ3MuCi0KLSAgICAgLWVzY2FwZSBzdHIgICAgVGhpcyBzZXRzIHRoZSAnRXNjYXBlIEtleXMnIG1vZGlmaWVyIHNlcXVlbmNlIGFuZCBlbmFibGVzCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZSBrZXlzIG1vZGUuICBXaGVuIHRoZSBtb2RpZmllciBrZXlzIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBpcyBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpcyBpbnRlcnByZXRlZCBsb2NhbGx5Ci0gICAgICAgICAgICAgICAgICAgIHRvIHBlcmZvcm0gYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZSBWTkMgc2VydmVyLgotCi0gICAgICAgICAgICAgICAgICAgIFVzZSAnLWVzY2FwZSBkZWZhdWx0JyBmb3IgdGhlIGRlZmF1bHQgbW9kaWZpZXIgc2VxdWVuY2UuCi0gICAgICAgICAgICAgICAgICAgIChVbml4OiBBbHRfTCxTdXBlcl9MIGFuZCBNYWNPU1g6IENvbnRyb2xfTCxNZXRhX0wpCi0KLSAgICBIZXJlIGFyZSB0aGUgJ0VzY2FwZSBLZXlzOiBIZWxwK1NldCcgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFBvcHVwIE1lbnU6Ci0KLSAgICBFc2NhcGUgS2V5czogIEVudGVyIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kaWZpZXIga2V5cyB0byBiZSB0aGUKLSAgICAnZXNjYXBlIHNlcXVlbmNlJy4gIFdoZW4gdGhlc2Uga2V5cyBhcmUgaGVsZCBkb3duLCB0aGUgbmV4dCBrZXlzdHJva2UgaXMKLSAgICBpbnRlcnByZXRlZCBsb2NhbGx5IHRvIGludm9rZSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0bwotICAgIHRoZSByZW1vdGUgVk5DIHNlcnZlci4gIEluIG90aGVyIHdvcmRzLCBhIHNldCBvZiAnSG90IEtleXMnLgotCi0gICAgVG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcywgY2xpY2sgb24gJ0VzY2FwZSBLZXlzOiBUb2dnbGUnIGluIHRoZSBQb3B1cC4KLQotICAgIEhlcmUgaXMgdGhlIGxpc3Qgb2YgaG90LWtleSBtYXBwaW5ncyB0byBzcGVjaWFsIGFjdGlvbnM6Ci0KLSAgICAgICByOiByZWZyZXNoIGRlc2t0b3AgIGI6IHRvZ2dsZSBiZWxsICAgYzogdG9nZ2xlIGZ1bGwtY29sb3IKLSAgICAgICBmOiBmaWxlIHRyYW5zZmVyICAgIHg6IHgxMWN1cnNvciAgICAgejogdG9nZ2xlIFRpZ2h0L1pSTEUKLSAgICAgICBsOiBmdWxsIHNjcmVlbiAgICAgIGc6IGdyYWJhbGwgICAgICAgZTogZXNjYXBlIGtleXMgZGlhbG9nCi0gICAgICAgczogc2NhbGUgZGlhbG9nICAgICArOiBzY2FsZSB1cCAoPSkgIC06IHNjYWxlIGRvd24gKF8pCi0gICAgICAgdDogdGV4dCBjaGF0ICAgICAgICAgICAgICAgICAgICAgICAgIGE6IGFscGhhYmxlbmQgY3Vyc29yCi0gICAgICAgVjogdG9nZ2xlIHZpZXdvbmx5ICBROiBxdWl0IHZpZXdlciAgIDEgMiAzIDQgNSA2OiBVbHRyYVZOQyBzY2FsZSAxL24KLQotICAgICAgIEFycm93IGtleXM6ICAgICAgICAgcGFuIHRoZSB2aWV3cG9ydCBhYm91dCAxMCUgZm9yIGVhY2gga2V5cHJlc3MuCi0gICAgICAgUGFnZVVwIC8gUGFnZURvd246ICBwYW4gdGhlIHZpZXdwb3J0IGJ5IGEgc2NyZWVuZnVsIHZlcnRpY2FsbHkuCi0gICAgICAgSG9tZSAgIC8gRW5kOiAgICAgICBwYW4gdGhlIHZpZXdwb3J0IGJ5IGEgc2NyZWVuZnVsIGhvcml6b250YWxseS4KLSAgICAgICBLZXlQYWQgQXJyb3cga2V5czogIHBhbiB0aGUgdmlld3BvcnQgYnkgMSBwaXhlbCBmb3IgZWFjaCBrZXlwcmVzcy4KLSAgICAgICBEcmFnZ2luZyB0aGUgTW91c2Ugd2l0aCBCdXR0b24xIHByZXNzZWQgYWxzbyBwYW5zIHRoZSB2aWV3cG9ydC4KLSAgICAgICBDbGlja2luZyBNb3VzZSBCdXR0b24zIGJyaW5ncyB1cCB0aGUgUG9wdXAgTWVudS4KLQotICAgIFRoZSBhYm92ZSBtYXBwaW5ncyBhcmUgKmFsd2F5cyogYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0IHRoZQotICAgIEVzY2FwZSBLZXlzIHZhbHVlIHRvICduZXZlcicuCi0KLSAgICBJZiB0aGUgRXNjYXBlIEtleXMgdmFsdWUgYmVsb3cgaXMgc2V0IHRvICdkZWZhdWx0JyB0aGVuIGEgZGVmYXVsdCBsaXN0IG9mCi0gICAgb2YgbW9kaWZpZXIga2V5cyBpcyB1c2VkLiAgRm9yIFVuaXggaXQgaXM6IEFsdF9MLFN1cGVyX0wgYW5kIGZvciBNYWNPU1ggaXQKLSAgICBpcyBDb250cm9sX0wsTWV0YV9MLiAgTm90ZTogdGhlIFN1cGVyX0wga2V5IHVzdWFsbHkgaGFzIGEgV2luZG93cyhUTSkgRmxhZwotICAgIG9uIGl0LiAgQWxzbyBub3RlIHRoZSBfTCBhbmQgX1IgbWVhbiB0aGUga2V5IGlzIG9uIHRoZSBMRUZUIG9yIFJJR0hUIHNpZGUKLSAgICBvZiB0aGUga2V5Ym9hcmQuCi0KLSAgICBPbiBVbml4ICAgdGhlIGRlZmF1bHQgaXMgQWx0IGFuZCBXaW5kb3dzIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgotICAgIE9uIE1hY09TWCB0aGUgZGVmYXVsdCBpcyBDb250cm9sIGFuZCBDb21tYW5kIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgotCi0gICAgRXhhbXBsZTogUHJlc3MgYW5kIGhvbGQgdGhlIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIHRoZSBMRUZUIHNpZGUgb2YgdGhlCi0gICAga2V5Ym9hcmQgYW5kIHRoZW4gcHJlc3MgJ2MnIHRvIHRvZ2dsZSB0aGUgZnVsbC1jb2xvciBzdGF0ZS4gIE9yIHByZXNzICd0JwotICAgIHRvIHRvZ2dsZSB0aGUgdWx0cmF2bmMgVGV4dCBDaGF0IHdpbmRvdywgZXRjLgotCi0gICAgVG8gdXNlIHNvbWV0aGluZyBiZXNpZGVzIHRoZSBkZWZhdWx0LCBzdXBwbHkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCAob3IgYQotICAgIHNpbmdsZSBvbmUpIGZyb206IFNoaWZ0X0wgU2hpZnRfUiBDb250cm9sX0wgQ29udHJvbF9SIEFsdF9MIEFsdF9SIE1ldGFfTAotICAgIE1ldGFfUiBTdXBlcl9MIFN1cGVyX1IgSHlwZXJfTCBIeXBlcl9SIG9yIE1vZGVfc3dpdGNoLgotCi0KLSAgIE5ldyBQb3B1cCBhY3Rpb25zOgotCi0gICAgICAgIFZpZXdPbmx5OiAgICAgICAgICAgICAgICB+IC12aWV3b25seQotICAgICAgICBEaXNhYmxlIEJlbGw6ICAgICAgICAgICAgfiAtbm9iZWxsCi0gICAgICAgIEN1cnNvciBTaGFwZTogICAgICAgICAgICB+IC1ub2N1cnNvcnNoYXBlCi0gICAgICAgIFgxMSBDdXJzb3I6ICAgICAgICAgICAgICB+IC14MTFjdXJzb3IKLSAgICAgICAgQ3Vyc29yIEFscGhhYmxlbmQ6ICAgICAgIH4gLWFscGhhCi0gICAgICAgIFRvZ2dsZSBUaWdodC9IZXh0aWxlOiAgICB+IC1lbmNvZGluZ3MgaGV4dGlsZS4uLgotICAgICAgICBUb2dnbGUgVGlnaHQvWlJMRTogICAgICAgfiAtZW5jb2RpbmdzIHpybGUuLi4KLSAgICAgICAgVG9nZ2xlIFpSTEUvWllXUkxFOiAgICAgIH4gLWVuY29kaW5ncyB6eXdybGUuLi4KLSAgICAgICAgUXVhbGl0eSBMZXZlbCAgICAgICAgICAgIH4gLXF1YWxpdHkgKGJvdGggVGlnaHQgYW5kIFpZV1JMRSkKLSAgICAgICAgQ29tcHJlc3MgTGV2ZWwgICAgICAgICAgIH4gLWNvbXByZXNzbGV2ZWwKLSAgICAgICAgRGlzYWJsZSBKUEVHOiAgICAgICAgICAgIH4gLW5vanBlZyAgKFRpZ2h0KQotICAgICAgICBQaXBlbGluZSBVcGRhdGVzICAgICAgICAgfiAtcGlwZWxpbmUKLQotICAgICAgICBGdWxsIENvbG9yICAgICAgICAgICAgICAgICBhcyBtYW55IGNvbG9ycyBhcyBsb2NhbCBzY3JlZW4gYWxsb3dzLgotICAgICAgICBHcmV5IHNjYWxlICgxNiAmIDgtYnBwKSAgfiAtZ3JleSwgZm9yIGxvdyBjb2xvcnMgMTYvOGJwcCBtb2RlcyBvbmx5LgotICAgICAgICAxNiBiaXQgY29sb3IgKEJHUjU2NSkgICAgfiAtMTZicHAgLyAtYmdyNTY1Ci0gICAgICAgIDggIGJpdCBjb2xvciAoQkdSMjMzKSAgICB+IC1iZ3IyMzMKLSAgICAgICAgMjU2IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjIzMyBkZWZhdWx0ICMgb2YgY29sb3JzLgotICAgICAgICAgNjQgY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMjIyIC8gLXVzZTY0Ci0gICAgICAgICAgOCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IxMTEgLyAtdXNlOAotICAgICAgICBTY2FsZSBWaWV3ZXIgICAgICAgICAgICAgfiAtc2NhbGUKLSAgICAgICAgRXNjYXBlIEtleXM6IFRvZ2dsZSAgICAgIH4gLWVzY2FwZQotICAgICAgICBFc2NhcGUgS2V5czogSGVscCtTZXQgICAgfiAtZXNjYXBlCi0gICAgICAgIFNldCBZIENyb3AgKHktbWF4KSAgICAgICB+IC15Y3JvcAotICAgICAgICBTZXQgU2Nyb2xsYmFyIFdpZHRoICAgICAgfiAtc2J3aWR0aAotICAgICAgICBYR3JhYlNlcnZlciAgICAgICAgICAgICAgfiAtZ3JhYmFsbAotCi0gICAgICAgIFVsdHJhVk5DIEV4dGVuc2lvbnM6Ci0KLSAgICAgICAgICBTZXQgMS9uIFNlcnZlciBTY2FsZSAgICAgVWx0cmF2bmMgZXh0LiBTY2FsZSBkZXNrdG9wIGJ5IDEvbi4KLSAgICAgICAgICBUZXh0IENoYXQgICAgICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBEbyBUZXh0IENoYXQuCi0gICAgICAgICAgRmlsZSBUcmFuc2ZlciAgICAgICAgICAgIFVsdHJhdm5jIGV4dC4gRmlsZSB4ZmVyIHZpYSBKYXZhIGhlbHBlci4KLSAgICAgICAgICBTaW5nbGUgV2luZG93ICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBHcmFiIGFuZCB2aWV3IGEgc2luZ2xlIHdpbmRvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdCB0aGVuIGNsaWNrIG9uIHRoZSB3aW5kb3cgeW91IHdhbnQpLgotICAgICAgICAgIERpc2FibGUgUmVtb3RlIElucHV0ICAgICBVbHRyYXZuYyBleHQuIFRyeSB0byBwcmV2ZW50IGlucHV0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3aW5nIG9mIG1vbml0b3IgYXQgcGh5c2ljYWwgZGlzcGxheS4KLQotICAgICAgICBOb3RlOiB0aGUgVWx0cmF2bmMgZXh0ZW5zaW9ucyBvbmx5IGFwcGx5IHRvIHNlcnZlcnMgdGhhdCBzdXBwb3J0Ci0gICAgICAgICAgICAgIHRoZW0uICB4MTF2bmMvbGlidm5jc2VydmVyIHN1cHBvcnRzIHNvbWUgb2YgdGhlbS4KLQotICAgICAgICBTZW5kIENsaXBib2FyZCBub3QgUHJpbWFyeSAgfiAtc2VuZGNsaXBib2FyZAotICAgICAgICBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lICAgfiAtc2VuZGFsd2F5cwotCi0gICBOZWFybHkgYWxsIG9mIHRoZXNlIGNhbiBiZSBjaGFuZ2VkIGR5bmFtaWNhbGx5IGluIHRoZSBQb3B1cCBtZW51Ci0gICAocHJlc3MgRjggZm9yIGl0KToKLQotICAgW3ZpZXdlcl9tZW51LmdpZl0gW3VuaXh2aWV3ZXIuanBnXQotCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIFdpbmRvd3M6Ci0KLSAgIEZvciBXaW5kb3dzLCBTU0wgVmlld2VyIHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgYSBHVUkgV2luZG93cy9zc3ZuYy5leGUKLSAgIHRoYXQgcHJvbXB0cyBmb3IgdGhlIFZOQyBkaXNwbGF5IGFuZCB0aGVuIHN0YXJ0cyB1cCBTVFVOTkVMIGZvbGxvd2VkCi0gICBieSB0aGUgU3RvY2sgVGlnaHRWTkMgV2luZG93cyBWaWV3ZXIuIEJvdGggYXJlIGJ1bmRsZWQgaW4gdGhlIHBhY2thZ2UKLSAgIGZvciB5b3VyIGNvbnZlbmllbmNlLiBUaGUgR1VJIGhhcyBvdGhlciB1c2VmdWwgZmVhdHVyZXMuIFdoZW4gdGhlCi0gICBjb25uZWN0aW9uIGlzIGZpbmlzaGVkLCB5b3Ugd2lsbCBiZSBhc2tlZCBpZiB5b3Ugd2FudCB0byB0ZXJtaW5hdGUgdGhlCi0gICBTVFVOTkVMIHByb2dyYW0uIEZvciBTU0ggY29ubmVjdGlvbnMgZnJvbSBXaW5kb3dzIHRoZSBHVUkgd2lsbCB1c2UKLSAgIFBMSU5LIGluc3RlYWQgb2YgU1RVTk5FTC4KLQotICAgVW5peCBhbmQgTWFjIE9TIFg6Ci0KLSAgIFJ1biB0aGUgR1VJIChzc3ZuYywgc2VlIGFib3ZlKSBhbmQgbGV0IG1lIGtub3cgaG93IGl0IGdvZXMuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLSAgIEhvcGVmdWxseSB0aGlzIHRvb2wgd2lsbCBtYWtlIGl0IGNvbnZlbmllbnQgZm9yIHBlb3BsZSB0byBoZWxwIHRlc3QKLSAgIGFuZCB1c2UgdGhlIGJ1aWx0LWluIFNTTCBzdXBwb3J0IGluIHgxMXZuYy4gRXh0cmEgdGVzdGluZyBvZiB0aGlzCi0gICBmZWF0dXJlIGlzIG11Y2ggYXBwcmVjaWF0ZWQhISBUaGFua3MuCi0KLSAgIFBsZWFzZSBIZWxwIFRlc3QgdGhlIG5ld2x5IGFkZGVkIGZlYXR1cmVzOgotICAgICAqIEF1dG9tYXRpYyBTZXJ2aWNlIHR1bm5lbGxpbmcgdmlhIFNTSCBmb3IgQ1VQUyBhbmQgU01CIFByaW50aW5nCi0gICAgICogRVNEL0FSVFNEIEF1ZGlvCi0gICAgICogU01CIChXaW5kb3dzL1NhbWJhKSBmaWxlc3lzdGVtIG1vdW50aW5nCi0KLSAgIFRoZXNlIGFsbG93IHlvdSB0byBwcmludCBmcm9tIHRoZSByZW1vdGUgKFZOQyBTZXJ2ZXIpIG1hY2hpbmUgdG8gbG9jYWwKLSAgIHByaW50ZXJzLCBsaXN0ZW4gdG8gc291bmRzICh3aXRoIHNvbWUgbGltaXRhdGlvbnMpIGZyb20gdGhlIHJlbW90ZSBWTkMKLSAgIFNlcnZlciBtYWNoaW5lLCBhbmQgdG8gbW91bnQgeW91ciBsb2NhbCBXaW5kb3dzIG9yIFNhbWJhIHNoYXJlcyBvbiB0aGUKLSAgIHJlbW90ZSBWTkMgU2VydmVyIG1hY2hpbmUuIEJhc2ljYWxseSB0aGVzZSBuZXcgZmVhdHVyZXMgdHJ5IHRvCi0gICBhdXRvbWF0ZSB0aGUgdHJpY2tzIGRlc2NyaWJlZCBoZXJlOgotICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNtYi1zaGFyZXMKLSAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1jdXBzCi0gICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc291bmQKLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotICAgRG93bmxvYWRpbmc6IERvd25sb2FkcyBmb3IgdGhpcyBwcm9qZWN0IGFyZSBob3N0ZWQgYXQgU291cmNlZm9yZ2UubmV0LgotCi0gICBDaG9vc2UgdGhlIGFyY2hpdmUgZmlsZSBidW5kbGUgdGhhdCBiZXN0IHN1aXRzIHlvdSAoZS5nLiBubyBzb3VyY2UKLSAgIGNvZGUsIHdpbmRvd3Mgb25seSwgdW5peCBvbmx5LCB6aXAsIHRhciBldGMpLgotCi0gICBBIHF1aWNrIGd1aWRlOgotCi0gICAgICBPbiBzb21lIGZsYXZvciBvZiBVbml4LCBlLmcuIExpbnV4IG9yIFNvbGFyaXM/IFVzZQotICAgInNzdm5jX3VuaXhfb25seSIgKG9yICJzc3ZuY19ub193aW5kb3dzIiB0byByZWNvbXBpbGUpLgotICAgICAgT24gTWFjIE9TIFg/IFVzZSAic3N2bmNfbm9fd2luZG93cyIuCi0gICAgICBPbiBXaW5kb3dzPyBVc2UgInNzdm5jX3dpbmRvd3Nfb25seSIuCi0gIHNzdm5jX3dpbmRvd3Nfb25seS0xLjAuMjguemlwICAgICAgV2luZG93cyBCaW5hcmllcyBPbmx5LiAgTm8gc291cmNlIGluY2x1ZGVkCi0gKDYuMk1CKQotICBzc3ZuY19ub193aW5kb3dzLTEuMC4yOC50YXIuZ3ogICAgIFVuaXggYW5kIE1hYyBPUyBYIE9ubHkuIE5vIFdpbmRvd3MgYmluYXJpZQotcy4gIFNvdXJjZSBpbmNsdWRlZC4gKDEwLjFNQikKLSAgc3N2bmNfdW5peF9vbmx5LTEuMC4yOC50YXIuZ3ogICAgICBVbml4IEJpbmFyaWVzIE9ubHkuICAgICBObyBzb3VyY2UgaW5jbHVkZWQKLS4gKDcuMk1CKQotICBzc3ZuY191bml4X21pbmltYWwtMS4wLjI4LnRhci5neiAgIFVuaXggTWluaW1hbC4gIFlvdSBtdXN0IHN1cHBseSB5b3VyIG93biB2bgotY3ZpZXdlciBhbmQgc3R1bm5lbC4gKDAuMk1CKQotCi0gIHNzdm5jLTEuMC4yOC50YXIuZ3ogICAgICAgICAgICAgICAgQWxsIFVuaXgsIE1hYyBPUyBYLCBhbmQgV2luZG93cyBiaW5hcmllcyBhCi1uZCBzb3VyY2UgVEdaLiAoMTYuMU1CKQotICBzc3ZuYy0xLjAuMjguemlwICAgICAgICAgICAgICAgICAgIEFsbCBVbml4LCBNYWMgT1MgWCwgYW5kIFdpbmRvd3MgYmluYXJpZXMgYQotbmQgc291cmNlIFpJUC4gKDE2LjRNQikKLSAgc3N2bmNfYWxsLTEuMC4yOC56aXAgICAgICAgICAgICAgICBBbGwgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzIGJpbmFyaWVzIGEKLW5kIHNvdXJjZSBBTkQgZnVsbCBhcmNoaXZlcyBpbiB0aGUgemlwIGRpci4gKDE5LjJNQikKLQotCi0gICBIZXJlIGlzIGEgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsOgotICBzc3ZuYy0xLjAuMjguc3JjLnRhci5neiAgICAgICAgICAgIENvbnZlbnRpb25hbCBTb3VyY2UgZm9yIFNTVk5DIEdVSSBhbmQgVW5peAotIFZOQ3ZpZXdlciAgKDAuNU1CKQotCi0gICBpdCB3aWxsIGJlIG9mIHVzZSB0byB0aG9zZSB3aG8gZG8gbm90IHdhbnQgdGhlIFNTVk5DCi0gICAib25lLXNpemUtZml0cy1hbGwiIGJ1bmRsZXMuIEZvciBleGFtcGxlLCBwYWNrYWdlL2Rpc3RybyBtYWludGFpbmVycwotICAgd2lsbCBmaW5kIHRoaXMgbW9yZSBmYW1pbGlhciBhbmQgdXNlZnVsIHRvIHRoZW0gKGkuZS4gdGhleSBydW46ICJtYWtlCi0gICBjb25maWc7IG1ha2UgYWxsOyBtYWtlIGluc3RhbGwiKS4gTm90ZSB0aGF0IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCi0gICBzdHVubmVsIHNvdXJjZSwgYW5kIHNvIGhhcyBhIGRlcGVuZGVuY3kgdGhhdCB0aGUgc3lzdGVtIHN0dW5uZWwgaXMKLSAgIGluc3RhbGxlZC4KLQotICAgUmVhZCB0aGUgUkVBRE1FLnNyYyBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZQotICAgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsLgotCi0KLSAgIE5vdGU6IGV2ZW4gd2l0aCB0aGUgVW5peCBidW5kbGVzLCBlLmcuICJzc3ZuY19ub193aW5kb3dzIiBvcgotICAgInNzdm5jX2FsbCIsIHlvdSBtYXkgbmVlZCB0byBydW4gdGhlICIuL2J1aWxkLnVuaXgiIHNjcmlwdCBpbiB0aGUgdG9wCi0gICBkaXJlY3RvcnkgdG8gcmVjb21waWxlIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCi0KLSAgIEhlcmUgYXJlIHRoZSBjb3JyZXNwb25kaW5nIDEuMC4yOSBkZXZlbG9wbWVudCBidW5kbGVzIChQbGVhc2UgaGVscAotICAgdGVzdCB0aGVtKToKLQotICBzc3ZuY193aW5kb3dzX29ubHktMS4wLjI5LnppcAotICBzc3ZuY19ub193aW5kb3dzLTEuMC4yOS50YXIuZ3oKLSAgc3N2bmNfdW5peF9vbmx5LTEuMC4yOS50YXIuZ3oKLSAgc3N2bmNfdW5peF9taW5pbWFsLTEuMC4yOS50YXIuZ3oKLQotICBzc3ZuYy0xLjAuMjkudGFyLmd6Ci0gIHNzdm5jLTEuMC4yOS56aXAKLSAgc3N2bmNfYWxsLTEuMC4yOS56aXAKLQotICBzc3ZuYy0xLjAuMjkuc3JjLnRhci5neiAgICAgICAgICAgIENvbnZlbnRpb25hbCBTb3VyY2UgZm9yIFNTVk5DIEdVSSBhbmQgVW5peAotIFZOQ3ZpZXdlciAgKDAuNU1CKQotCi0KLSAgIEZvciBhbnkgVW5peCBzeXN0ZW0sIGEgc2VsZi1leHRyYWN0aW5nIGFuZCBydW5uaW5nIGZpbGUgZm9yIHRoZQotICAgInNzdm5jX3VuaXhfbWluaW1hbCIgcGFja2FnZSBpcyBoZXJlOiBzc3ZuYy4gU2F2ZSBpdCBhcyBmaWxlbmFtZQotICAgInNzdm5jIiwgdHlwZSAiY2htb2QgNzU1IC4vc3N2bmMiLCBhbmQgdGhlbiBsYXVuY2ggdGhlIEdVSSB2aWEgdHlwaW5nCi0gICAiLi9zc3ZuYyIuIE5vdGUgdGhhdCB0aGlzICJzc3ZuY191bml4X21pbmltYWwiIG1vZGUgcmVxdWlyZXMgeW91Ci0gICBpbnN0YWxsIHRoZSAic3R1bm5lbCIgYW5kICJ2bmN2aWV3ZXIiIHByb2dyYW1zIGV4dGVybmFsbHkgKGZvcgotICAgZXhhbXBsZSwgaW5zdGFsbCB5b3VyIGRpc3Ryb3MnIHZlcnNpb25zLCBlLmcuIG9uIGRlYmlhbjogImFwdC1nZXQKLSAgIGluc3RhbGwgc3R1bm5lbDQgeHRpZ2h0dm5jdmlld2VyIi4pIEl0IHdpbGwgd29yaywgYnV0IG1hbnkgb2YgdGhlCi0gICBTU1ZOQyBmZWF0dXJlcyB3aWxsIGJlIG1pc3NpbmcuCi0KLSAgIFByZXZpb3VzIHJlbGVhc2VzOgotICAgICAgUmVsZWFzZSAxLjAuMTggYXQgU291cmNlZm9yZ2UubmV0Ci0gICAgICBSZWxlYXNlIDEuMC4xOSBhdCBTb3VyY2Vmb3JnZS5uZXQKLSAgICAgIFJlbGVhc2UgMS4wLjIwIGF0IFNvdXJjZWZvcmdlLm5ldAotICAgICAgUmVsZWFzZSAxLjAuMjEgYXQgU291cmNlZm9yZ2UubmV0Ci0gICAgICBSZWxlYXNlIDEuMC4yMiBhdCBTb3VyY2Vmb3JnZS5uZXQKLSAgICAgIFJlbGVhc2UgMS4wLjIzIGF0IFNvdXJjZWZvcmdlLm5ldAotICAgICAgUmVsZWFzZSAxLjAuMjQgYXQgU291cmNlZm9yZ2UubmV0Ci0gICAgICBSZWxlYXNlIDEuMC4yNSBhdCBTb3VyY2Vmb3JnZS5uZXQKLSAgICAgIFJlbGVhc2UgMS4wLjI2IGF0IFNvdXJjZWZvcmdlLm5ldAotICAgICAgUmVsZWFzZSAxLjAuMjcgYXQgU291cmNlZm9yZ2UubmV0Ci0gICAgICBSZWxlYXNlIDEuMC4yOCBhdCBTb3VyY2Vmb3JnZS5uZXQKLQotCi0gICBQbGVhc2UgaGVscCB0ZXN0IHRoZSBVbHRyYVZOQyBGaWxlIFRyYW5zZmVyIHN1cHBvcnQgaW4gdGhlIG5hdGl2ZSBVbml4Ci0gICBWTkMgdmlld2VyISBMZXQgdXMga25vdyBob3cgaXQgd2VudC4KLQotICAgQ3VycmVudCBVbml4IGJpbmFyaWVzIGluIHRoZSBhcmNoaXZlczoKLSAgICBMaW51eC5pNjg2Ci0gICAgTGludXgueDg2XzY0Ci0gICAgTGludXgucHBjNjQgICAgWCAocmVtb3ZlZCkKLSAgICBMaW51eC5hbHBoYSAgICBYIChyZW1vdmVkKQotICAgIFN1bk9TLnN1bjR1Ci0gICAgU3VuT1Muc3VuNG0KLSAgICBTdW5PUy5pODZwYwotICAgIERhcndpbi5Qb3dlci5NYWNpbnRvc2gKLSAgICBEYXJ3aW4uaTM4NgotICAgIEhQLVVYLjkwMDAgICAgIFggKHJlbW92ZWQpCi0gICAgRnJlZUJTRC5pMzg2ICAgWCAocmVtb3ZlZCkKLSAgICBOZXRCU0QuaTM4NiAgICBYIChyZW1vdmVkKQotICAgIE9wZW5CU0QuaTM4NiAgIFggKHJlbW92ZWQpCi0KLSAgIChzb21lIG9mIHRoZXNlIGFyZSBvdXQgb2YgZGF0ZSwgbWFya2VkIHdpdGggJ1gnIGFib3ZlLCBiZWNhdXNlIEkgbm8KLSAgIGxvbmdlciBoYXZlIGFjY2VzcyB0byBtYWNoaW5lcyBydW5uaW5nIHRob3NlIE9TJ3MuIFVzZSB0aGUKLSAgICJidWlsZC51bml4IiBzY3JpcHQgdG8gcmVjb21waWxlIG9uIHlvdXIgc3lzdGVtKS4KLQotICAgTm90ZTogc29tZSBvZiB0aGUgYWJvdmUgYmluYXJpZXMgZGVwZW5kIG9uIGxpYnNzbC5zby4wLjkuNywgd2hlcmVhcwotICAgc29tZSByZWNlbnQgZGlzdHJvcyBvbmx5IHByb3ZpZGUgbGlic3NsLnNvLjAuOS44IGJ5IGRlZmF1bHQgKGZvcgotICAgY29tcGF0aWJpbGl0eSByZWFzb25zIHRoZXkgc2hvdWxkIGluc3RhbGwgYm90aCBieSBkZWZhdWx0IGJ1dCBub3QgYWxsCi0gICBkbykuIFNvIHlvdSBtYXkgbmVlZCB0byBpbnN0cnVjdCB5b3VyIGRpc3RybyB0byBpbnN0YWxsIHRoZSAwLjkuNwotICAgbGlicmFyeSAoaXQgaXMgZmluZSB0byBoYXZlIGJvdGggcnVudGltZXMgaW5zdGFsbGVkIHNpbXVsdGFuZW91c2x5Ci0gICBzaW5jZSB0aGUgbGlicmFyaWVzIGhhdmUgZGlmZmVyZW50IG5hbWVzKS4gVXBkYXRlOiBJIG5vdyB0cnkgdG8KLSAgIHN0YXRpY2FsbHkgbGluayBsaWJzc2wuYSBmb3IgYWxsIG9mIHRoZSBiaW5hcmllcyBpbiB0aGUgYXJjaGl2ZS4KLQotICAgWW91IGNhbiBhbHNvIHJ1biB0aGUgaW5jbHVkZWQgYnVpbGQudW5peCBzY3JpcHQgdG8gdHJ5IHRvCi0gICBhdXRvbWF0aWNhbGx5IGJ1aWxkIHRoZSBiaW5hcmllcyBpZiB5b3VyIE9TIGlzIG5vdCBpbiB0aGUgYWJvdmUgbGlzdAotICAgb3IgdGhlIGluY2x1ZGVkIGJpbmFyeSBkb2VzIG5vdCBydW4gcHJvcGVybHkgb24geW91ciBzeXN0ZW0uIExldCBtZQotICAga25vdyBob3cgdGhhdCBnb2VzLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBJTVBPUlRBTlQ6IHRoZXJlIG1heSBiZSByZXN0cmljdGlvbnMgZm9yIHlvdSB0byBkb3dubG9hZCwgdXNlLCBvcgotICAgcmVkaXN0cmlidXRlIHRoZSBhYm92ZSBiZWNhdXNlIG9mIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgdGhleSBjb250YWluCi0gICBvciBmb3Igb3RoZXIgcmVhc29ucy4gUGxlYXNlIGNoZWNrIG91dCB5b3VyIHNpdHVhdGlvbiBhbmQgaW5mb3JtYXRpb24KLSAgIGF0IHRoZSBmb2xsb3dpbmcgYW5kIHJlbGF0ZWQgc2l0ZXM6Ci0gICAgICAgIGh0dHA6Ly9zdHVubmVsLm1pcnQubmV0Ci0gICAgICAgIGh0dHA6Ly93d3cuc3R1bm5lbC5vcmcKLSAgICAgICAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZwotICAgICAgICBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL3B1dHR5LwotICAgICAgICBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQotICAgICAgICBodHRwOi8vd3d3LnJlYWx2bmMuY29tCi0gICAgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY290dm5jLwotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBSRUFETUU6IEhlcmUgaXMgdGhlIHRvcGxldmVsIFJFQURNRSBmcm9tIHRoZSBidW5kbGUuCi0JCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sOgotCi0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQoteDExdm5jOiBhIFZOQyBzZXJ2ZXIgZm9yIHJlYWwgWCBkaXNwbGF5cwotCi0gICBIZXJlIGFyZSBhbGwgb2YgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb25zOgotJSB4MTF2bmMgLW9wdHMgICAgICAoc2VlIGJlbG93IGZvciAtaGVscCBsb25nIGRlc2NyaXB0aW9ucykKLQoteDExdm5jOiBhbGxvdyBWTkMgY29ubmVjdGlvbnMgdG8gcmVhbCBYMTEgZGlzcGxheXMuIDAuOS4xMyBsYXN0bW9kOiAyMDEwLTEyLTI3Ci0KLXgxMXZuYyBvcHRpb25zOgotICAtZGlzcGxheSBkaXNwICAgICAgICAgICAgLWF1dGggZmlsZSAgICAgICAgICAgICAgIC1OICAgICAgICAgICAgICAgICAgICAgCi0gIC1hdXRvcG9ydCBuICAgICAgICAgICAgICAtcmZicG9ydCBzdHIgICAgICAgICAgICAgLTYgICAgICAgICAgICAgICAgICAgICAKLSAgLW5vNiAgICAgICAgICAgICAgICAgICAgIC1ub2lwdjYgICAgICAgICAgICAgICAgICAtbm9pcHY0ICAgICAgICAgICAgICAgIAotICAtcmVvcGVuICAgICAgICAgICAgICAgICAgLXJlZmxlY3QgaG9zdDpOICAgICAgICAgIC1pZCB3aW5kb3dpZCAgICAgICAgICAgCi0gIC1zaWQgd2luZG93aWQgICAgICAgICAgICAtYXBwc2hhcmUgICAgICAgICAgICAgICAgLWNsaXAgV3hIK1grWSAgICAgICAgICAKLSAgLWZsYXNoY21hcCAgICAgICAgICAgICAgIC1zaGlmdGNtYXAgbiAgICAgICAgICAgICAtbm90cnVlY29sb3IgICAgICAgICAgIAotICAtYWR2ZXJ0aXNlX3RydWVjb2xvciAgICAgLXZpc3VhbCBuICAgICAgICAgICAgICAgIC1vdmVybGF5ICAgICAgICAgICAgICAgCi0gIC1vdmVybGF5X25vY3Vyc29yICAgICAgICAtOHRvMjQgW29wdHNdICAgICAgICAgICAgLTI0dG8zMiAgICAgICAgICAgICAgICAKLSAgLXNjYWxlIGZyYWN0aW9uICAgICAgICAgIC1nZW9tZXRyeSBXeEggICAgICAgICAgICAtc2NhbGVfY3Vyc29yIGZyYWMgICAgIAotICAtdmlld29ubHkgICAgICAgICAgICAgICAgLXNoYXJlZCAgICAgICAgICAgICAgICAgIC1vbmNlICAgICAgICAgICAgICAgICAgCi0gIC1mb3JldmVyICAgICAgICAgICAgICAgICAtbG9vcCAgICAgICAgICAgICAgICAgICAgLXRpbWVvdXQgbiAgICAgICAgICAgICAKLSAgLXNsZWVwaW4gbiAgICAgICAgICAgICAgIC1pbmV0ZCAgICAgICAgICAgICAgICAgICAtdGlnaHRmaWxleGZlciAgICAgICAgIAotICAtdWx0cmFmaWxleGZlciAgICAgICAgICAgLWh0dHAgICAgICAgICAgICAgICAgICAgIC1odHRwX3NzbCAgICAgICAgICAgICAgCi0gIC1hdmFoaSAgICAgICAgICAgICAgICAgICAtbWRucyAgICAgICAgICAgICAgICAgICAgLXplcm9jb25mICAgICAgICAgICAgICAKLSAgLWNvbm5lY3Qgc3RyaW5nICAgICAgICAgIC1jb25uZWN0X29yX2V4aXQgc3RyICAgICAtcHJveHkgc3RyaW5nICAgICAgICAgIAotICAtdm5jY29ubmVjdCAgICAgICAgICAgICAgLW5vdm5jY29ubmVjdCAgICAgICAgICAgIC1hbGxvdyBob3N0MVssaG9zdDIuLl0gCi0gIC1sb2NhbGhvc3QgICAgICAgICAgICAgICAtdW5peHNvY2sgc3RyICAgICAgICAgICAgLWxpc3RlbjYgc3RyICAgICAgICAgICAKLSAgLW5vbG9va3VwICAgICAgICAgICAgICAgIC1pbnB1dCBzdHJpbmcgICAgICAgICAgICAtZ3JhYmtiZCAgICAgICAgICAgICAgIAotICAtZ3JhYnB0ciAgICAgICAgICAgICAgICAgLXVuZ3JhYmJvdGggICAgICAgICAgICAgIC1ncmFiYWx3YXlzICAgICAgICAgICAgCi0gIC12aWV3cGFzc3dkIHN0cmluZyAgICAgICAtcGFzc3dkZmlsZSBmaWxlbmFtZSAgICAgLXNob3dyZmJhdXRoIGZpbGVuYW1lICAKLSAgLXVuaXhwdyBbbGlzdF0gICAgICAgICAgIC11bml4cHdfbmlzIFtsaXN0XSAgICAgICAtdW5peHB3X2NtZCBjbWQgICAgICAgIAotICAtZmluZCAgICAgICAgICAgICAgICAgICAgLWZpbmRkcHkgICAgICAgICAgICAgICAgIC1saXN0ZHB5ICAgICAgICAgICAgICAgCi0gIC1maW5kYXV0aCBbZGlzcF0gICAgICAgICAtY3JlYXRlICAgICAgICAgICAgICAgICAgLXhkdW1teSAgICAgICAgICAgICAgICAKLSAgLXh2bmMgICAgICAgICAgICAgICAgICAgIC14dm5jX3JlZGlyZWN0ICAgICAgICAgICAteGR1bW15X3h2ZmIgICAgICAgICAgIAotICAtY3JlYXRlX3hzcnYgc3RyICAgICAgICAgLXN2YyAgICAgICAgICAgICAgICAgICAgIC1zdmNfeGR1bW15ICAgICAgICAgICAgCi0gIC1zdmNfeHZuYyAgICAgICAgICAgICAgICAtc3ZjX3hkdW1teV94dmZiICAgICAgICAgLXhkbXN2YyAgICAgICAgICAgICAgICAKLSAgLXNzaHhkbXN2YyAgICAgICAgICAgICAgIC11bml4cHdfc3lzdGVtX2dyZWV0ZXIgICAtcmVkaXJlY3QgcG9ydCAgICAgICAgIAotICAtZGlzcGxheSBXQUlUOi4uLiAgICAgICAgLXZlbmNyeXB0IG1vZGUgICAgICAgICAgIC1hbm9udGxzIG1vZGUgICAgICAgICAgCi0gIC1zc2xvbmx5ICAgICAgICAgICAgICAgICAtZGhwYXJhbXMgZmlsZSAgICAgICAgICAgLW5vc3NsICAgICAgICAgICAgICAgICAKLSAgLXNzbCBbcGVtXSAgICAgICAgICAgICAgIC1zc2x0aW1lb3V0IG4gICAgICAgICAgICAtc3Nsbm9mYWlsICAgICAgICAgICAgIAotICAtc3NsZGlyIGRpciAgICAgICAgICAgICAgLXNzbHZlcmlmeSBwYXRoICAgICAgICAgIC1zc2xDUkwgcGF0aCAgICAgICAgICAgCi0gIC1zc2xHZW5DQSBbZGlyXSAgICAgICAgICAtc3NsR2VuQ2VydCB0eXBlIG5hbWUgICAgLXNzbEVuY0tleSBwZW0gICAgICAgICAKLSAgLXNzbENlcnRJbmZvIHBlbSAgICAgICAgIC1zc2xEZWxDZXJ0IHBlbSAgICAgICAgICAtc3NsU2NyaXB0cyAgICAgICAgICAgIAotICAtc3R1bm5lbCBbcGVtXSAgICAgICAgICAgLXN0dW5uZWwzICBbcGVtXSAgICAgICAgIC1lbmMgY2lwaGVyOmtleWZpbGUgICAgCi0gIC1odHRwcyBbcG9ydF0gICAgICAgICAgICAtaHR0cHNyZWRpciBbcG9ydF0gICAgICAgLWh0dHBfb25lcG9ydCAgICAgICAgICAKLSAgLXNzaCB1c2VyQGhvc3Q6ZGlzcCAgICAgIC11c2VwdyAgICAgICAgICAgICAgICAgICAtc3RvcmVwYXNzd2QgcGFzcyBmaWxlIAotICAtbm9wdyAgICAgICAgICAgICAgICAgICAgLWFjY2VwdCBzdHJpbmcgICAgICAgICAgIC1hZnRlcmFjY2VwdCBzdHJpbmcgICAgCi0gIC1nb25lIHN0cmluZyAgICAgICAgICAgICAtdXNlcnMgbGlzdCAgICAgICAgICAgICAgLW5vc2htICAgICAgICAgICAgICAgICAKLSAgLWZsaXBieXRlb3JkZXIgICAgICAgICAgIC1vbmV0aWxlICAgICAgICAgICAgICAgICAtc29saWQgW2NvbG9yXSAgICAgICAgIAotICAtYmxhY2tvdXQgc3RyaW5nICAgICAgICAgLXhpbmVyYW1hICAgICAgICAgICAgICAgIC1ub3hpbmVyYW1hICAgICAgICAgICAgCi0gIC14dHJhcCAgICAgICAgICAgICAgICAgICAteHJhbmRyIFttb2RlXSAgICAgICAgICAgLXJvdGF0ZSBzdHJpbmcgICAgICAgICAKLSAgLXBhZGdlb20gV3hIICAgICAgICAgICAgIC1vIGxvZ2ZpbGUgICAgICAgICAgICAgICAtZmxhZyBmaWxlICAgICAgICAgICAgIAotICAtcm1mbGFnIGZpbGUgICAgICAgICAgICAgLXJjIGZpbGVuYW1lICAgICAgICAgICAgIC1ub3JjICAgICAgICAgICAgICAgICAgCi0gIC1lbnYgVkFSPVZBTFVFICAgICAgICAgICAtcHJvZyAvcGF0aC90by94MTF2bmMgICAgLWgsIC1oZWxwICAgICAgICAgICAgICAKLSAgLT8sIC1vcHRzICAgICAgICAgICAgICAgIC1WLCAtdmVyc2lvbiAgICAgICAgICAgICAtbGljZW5zZSAgICAgICAgICAgICAgIAotICAtZGJnICAgICAgICAgICAgICAgICAgICAgLXEsIC1xdWlldCAgICAgICAgICAgICAgIC12LCAtdmVyYm9zZSAgICAgICAgICAgCi0gIC1iZyAgICAgICAgICAgICAgICAgICAgICAtbW9kdHdlYWsgICAgICAgICAgICAgICAgLW5vbW9kdHdlYWsgICAgICAgICAgICAKLSAgLXhrYiAgICAgICAgICAgICAgICAgICAgIC1ub3hrYiAgICAgICAgICAgICAgICAgICAtY2Fwc2xvY2sgICAgICAgICAgICAgIAotICAtc2tpcF9sb2Nra2V5cyAgICAgICAgICAgLW5vc2tpcF9sb2Nra2V5cyAgICAgICAgIC1za2lwX2tleWNvZGVzIHN0cmluZyAgCi0gIC1zbG9wcHlfa2V5cyAgICAgICAgICAgICAtc2tpcF9kdXBzICAgICAgICAgICAgICAgLW5vc2tpcF9kdXBzICAgICAgICAgICAKLSAgLWFkZF9rZXlzeW1zICAgICAgICAgICAgIC1ub2FkZF9rZXlzeW1zICAgICAgICAgICAtY2xlYXJfbW9kcyAgICAgICAgICAgIAotICAtY2xlYXJfa2V5cyAgICAgICAgICAgICAgLWNsZWFyX2FsbCAgICAgICAgICAgICAgIC1yZW1hcCBzdHJpbmcgICAgICAgICAgCi0gIC1ub3JlcGVhdCAgICAgICAgICAgICAgICAtcmVwZWF0ICAgICAgICAgICAgICAgICAgLW5vZmIgICAgICAgICAgICAgICAgICAKLSAgLW5vYmVsbCAgICAgICAgICAgICAgICAgIC1ub3NlbCAgICAgICAgICAgICAgICAgICAtbm9wcmltYXJ5ICAgICAgICAgICAgIAotICAtbm9zZXRwcmltYXJ5ICAgICAgICAgICAgLW5vY2xpcGJvYXJkICAgICAgICAgICAgIC1ub3NldGNsaXBib2FyZCAgICAgICAgCi0gIC1zZWxkaXIgc3RyaW5nICAgICAgICAgICAtY3Vyc29yIFttb2RlXSAgICAgICAgICAgLW5vY3Vyc29yICAgICAgICAgICAgICAKLSAgLWN1cnNvcl9kcmFnICAgICAgICAgICAgIC1hcnJvdyBuICAgICAgICAgICAgICAgICAtbm94Zml4ZXMgICAgICAgICAgICAgIAotICAtYWxwaGFjdXQgbiAgICAgICAgICAgICAgLWFscGhhZnJhYyBmcmFjdGlvbiAgICAgIC1hbHBoYXJlbW92ZSAgICAgICAgICAgCi0gIC1ub2FscGhhYmxlbmQgICAgICAgICAgICAtbm9jdXJzb3JzaGFwZSAgICAgICAgICAgLWN1cnNvcnBvcyAgICAgICAgICAgICAKLSAgLW5vY3Vyc29ycG9zICAgICAgICAgICAgIC14d2FycHBvaW50ZXIgICAgICAgICAgICAtbm94d2FycHBvaW50ZXIgICAgICAgIAotICAtYWx3YXlzX2luamVjdCAgICAgICAgICAgLWJ1dHRvbm1hcCBzdHJpbmcgICAgICAgIC1ub2RyYWdnaW5nICAgICAgICAgICAgCi0gIC1uY2FjaGUgbiAgICAgICAgICAgICAgICAtbmNhY2hlX2NyICAgICAgICAgICAgICAgLW5jYWNoZV9ub19tb3ZlcmFpc2UgICAKLSAgLW5jYWNoZV9ub19kdGNoYW5nZSAgICAgIC1uY2FjaGVfbm9fcm9vdHBpeG1hcCAgICAtbmNhY2hlX2tlZXBfYW5pbXMgICAgIAotICAtbmNhY2hlX29sZF93bSAgICAgICAgICAgLW5jYWNoZV9wYWQgbiAgICAgICAgICAgIC1kZWJ1Z19uY2FjaGUgICAgICAgICAgCi0gIC13aXJlZnJhbWUgW3N0cl0gICAgICAgICAtbm93aXJlZnJhbWUgICAgICAgICAgICAgLW5vd2lyZWZyYW1lbG9jYWwgICAgICAKLSAgLXdpcmVjb3B5cmVjdCBtb2RlICAgICAgIC1ub3dpcmVjb3B5cmVjdCAgICAgICAgICAtZGVidWdfd2lyZWZyYW1lICAgICAgIAotICAtc2Nyb2xsY29weXJlY3QgbW9kZSAgICAgLW5vc2Nyb2xsY29weXJlY3QgICAgICAgIC1zY3JfYXJlYSBuICAgICAgICAgICAgCi0gIC1zY3Jfc2tpcCBsaXN0ICAgICAgICAgICAtc2NyX2luYyBsaXN0ICAgICAgICAgICAgLXNjcl9rZXlzIGxpc3QgICAgICAgICAKLSAgLXNjcl90ZXJtIGxpc3QgICAgICAgICAgIC1zY3Jfa2V5cmVwZWF0IGxvLWhpICAgICAtc2NyX3Bhcm1zIHN0cmluZyAgICAgIAotICAtZml4c2NyZWVuIHN0cmluZyAgICAgICAgLWRlYnVnX3Njcm9sbCAgICAgICAgICAgIC1ub3hyZWNvcmQgICAgICAgICAgICAgCi0gIC1ncmFiX2J1c3RlciAgICAgICAgICAgICAtbm9ncmFiX2J1c3RlciAgICAgICAgICAgLWRlYnVnX2dyYWJzICAgICAgICAgICAKLSAgLWRlYnVnX3NlbCAgICAgICAgICAgICAgIC1wb2ludGVyX21vZGUgbiAgICAgICAgICAtaW5wdXRfc2tpcCBuICAgICAgICAgIAotICAtYWxsaW5wdXQgICAgICAgICAgICAgICAgLWlucHV0X2VhZ2VybHkgICAgICAgICAgIC1zcGVlZHMgcmQsYncsbGF0ICAgICAgCi0gIC13bWR0IHN0cmluZyAgICAgICAgICAgICAtZGVidWdfcG9pbnRlciAgICAgICAgICAgLWRlYnVnX2tleWJvYXJkICAgICAgICAKLSAgLWRlZmVyIHRpbWUgICAgICAgICAgICAgIC13YWl0IHRpbWUgICAgICAgICAgICAgICAtZXh0cmFfZmJ1ciBuICAgICAgICAgIAotICAtd2FpdF91aSBmYWN0b3IgICAgICAgICAgLXNldGRlZmVyIG4gICAgICAgICAgICAgIC1ub3dhaXRfYm9nICAgICAgICAgICAgCi0gIC1zbG93X2ZiIHRpbWUgICAgICAgICAgICAteHJlZnJlc2ggdGltZSAgICAgICAgICAgLW5hcCAgICAgICAgICAgICAgICAgICAKLSAgLW5vbmFwICAgICAgICAgICAgICAgICAgIC1zYiB0aW1lICAgICAgICAgICAgICAgICAtcmVhZHRpbWVvdXQgbiAgICAgICAgIAotICAtcGluZyBuICAgICAgICAgICAgICAgICAgLW5vZmJwbSAgICAgICAgICAgICAgICAgIC1mYnBtICAgICAgICAgICAgICAgICAgCi0gIC1ub2RwbXMgICAgICAgICAgICAgICAgICAtZHBtcyAgICAgICAgICAgICAgICAgICAgLWZvcmNlZHBtcyAgICAgICAgICAgICAKLSAgLWNsaWVudGRwbXMgICAgICAgICAgICAgIC1ub3NlcnZlcmRwbXMgICAgICAgICAgICAtbm91bHRyYWV4dCAgICAgICAgICAgIAotICAtY2hhdHdpbmRvdyAgICAgICAgICAgICAgLW5veGRhbWFnZSAgICAgICAgICAgICAgIC14ZF9hcmVhIEEgICAgICAgICAgICAgCi0gIC14ZF9tZW0gZiAgICAgICAgICAgICAgICAtc2lncGlwZSBzdHJpbmcgICAgICAgICAgLXRocmVhZHMgICAgICAgICAgICAgICAKLSAgLW5vdGhyZWFkcyAgICAgICAgICAgICAgIC1mcyBmICAgICAgICAgICAgICAgICAgICAtZ2FwcyBuICAgICAgICAgICAgICAgIAotICAtZ3JvdyBuICAgICAgICAgICAgICAgICAgLWZ1enogbiAgICAgICAgICAgICAgICAgIC1kZWJ1Z190aWxlcyAgICAgICAgICAgCi0gIC1zbmFwZmIgICAgICAgICAgICAgICAgICAtcmF3ZmIgc3RyaW5nICAgICAgICAgICAgLWZyZXF0YWIgZmlsZSAgICAgICAgICAKLSAgLXBpcGVpbnB1dCBjbWQgICAgICAgICAgIC1tYWNub2RpbSAgICAgICAgICAgICAgICAtbWFjbm9zbGVlcCAgICAgICAgICAgIAotICAtbWFjbm9zYXZlciAgICAgICAgICAgICAgLW1hY25vd2FpdCAgICAgICAgICAgICAgIC1tYWN3aGVlbCBuICAgICAgICAgICAgCi0gIC1tYWNub3N3YXAgICAgICAgICAgICAgICAtbWFjbm9yZXNpemUgICAgICAgICAgICAgLW1hY2ljb25hbmltIG4gICAgICAgICAKLSAgLW1hY21lbnUgICAgICAgICAgICAgICAgIC1tYWN1c2tiZCAgICAgICAgICAgICAgICAtbWFjbm9vcGVuZ2wgICAgICAgICAgIAotICAtbWFjbm9yYXdmYiAgICAgICAgICAgICAgLWd1aSBbZ3VpLW9wdHNdICAgICAgICAgIC1yZW1vdGUgY29tbWFuZCAgICAgICAgCi0gIC1xdWVyeSB2YXJpYWJsZSAgICAgICAgICAtUUQgdmFyaWFibGUgICAgICAgICAgICAgLXN5bmMgICAgICAgICAgICAgICAgICAKLSAgLXF1ZXJ5X3JldHJpZXMgc3RyICAgICAgIC1yZW1vdGVfcHJlZml4IHN0ciAgICAgICAtbm9yZW1vdGUgICAgICAgICAgICAgIAotICAteWVzcmVtb3RlICAgICAgICAgICAgICAgLXVuc2FmZSAgICAgICAgICAgICAgICAgIC1zYWZlciAgICAgICAgICAgICAgICAgCi0gIC1wcml2cmVtb3RlICAgICAgICAgICAgICAtbm9jbWRzICAgICAgICAgICAgICAgICAgLWFsbG93ZWRjbWRzIGxpc3QgICAgICAKLSAgLWRlbnlfYWxsICAgICAgICAgICAgICAKLQotTGliVk5DU2VydmVyIG9wdGlvbnM6Ci0tcmZicG9ydCBwb3J0ICAgICAgICAgIFRDUCBwb3J0IGZvciBSRkIgcHJvdG9jb2wKLS1yZmJ3YWl0IHRpbWUgICAgICAgICAgbWF4IHRpbWUgaW4gbXMgdG8gd2FpdCBmb3IgUkZCIGNsaWVudAotLXJmYmF1dGggcGFzc3dkLWZpbGUgICB1c2UgYXV0aGVudGljYXRpb24gb24gUkZCIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICh1c2UgJ3N0b3JlcGFzc3dkJyB0byBjcmVhdGUgYSBwYXNzd29yZCBmaWxlKQotLXJmYnZlcnNpb24gMy54ICAgICAgICBTZXQgdGhlIHZlcnNpb24gb2YgdGhlIFJGQiB3ZSBjaG9vc2UgdG8gYWR2ZXJ0aXNlCi0tcGVybWl0ZmlsZXRyYW5zZmVyICAgIHBlcm1pdCBmaWxlIHRyYW5zZmVyIHN1cHBvcnQKLS1wYXNzd2QgcGxhaW4tcGFzc3dvcmQgdXNlIGF1dGhlbnRpY2F0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAodXNlIHBsYWluLXBhc3N3b3JkIGFzIHBhc3N3b3JkLCBVU0UgQVQgWU9VUiBSSVNLKQotLWRlZmVydXBkYXRlIHRpbWUgICAgICB0aW1lIGluIG1zIHRvIGRlZmVyIHVwZGF0ZXMgKGRlZmF1bHQgNDApCi0tZGVmZXJwdHJ1cGRhdGUgdGltZSAgIHRpbWUgaW4gbXMgdG8gZGVmZXIgcG9pbnRlciB1cGRhdGVzIChkZWZhdWx0IG5vbmUpCi0tZGVza3RvcCBuYW1lICAgICAgICAgIFZOQyBkZXNrdG9wIG5hbWUgKGRlZmF1bHQgIkxpYlZOQ1NlcnZlciIpCi0tYWx3YXlzc2hhcmVkICAgICAgICAgIGFsd2F5cyB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLS1uZXZlcnNoYXJlZCAgICAgICAgICAgbmV2ZXIgdHJlYXQgbmV3IGNsaWVudHMgYXMgc2hhcmVkCi0tZG9udGRpc2Nvbm5lY3QgICAgICAgIGRvbid0IGRpc2Nvbm5lY3QgZXhpc3RpbmcgY2xpZW50cyB3aGVuIGEgbmV3IG5vbi1zaGFyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBjb21lcyBpbiAocmVmdXNlIG5ldyBjb25uZWN0aW9uIGluc3RlYWQpCi0taHR0cGRpciBkaXItcGF0aCAgICAgIGVuYWJsZSBodHRwIHNlcnZlciB1c2luZyBkaXItcGF0aCBob21lCi0taHR0cHBvcnQgcG9ydG51bSAgICAgIHVzZSBwb3J0bnVtIGZvciBodHRwIGNvbm5lY3Rpb24KLS1lbmFibGVodHRwcHJveHkgICAgICAgZW5hYmxlIGh0dHAgcHJveHkgc3VwcG9ydAotLXByb2dyZXNzaXZlIGhlaWdodCAgICBlbmFibGUgcHJvZ3Jlc3NpdmUgdXBkYXRpbmcgZm9yIHNsb3cgbGlua3MKLS1saXN0ZW4gaXBhZGRyICAgICAgICAgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbmx5IG9uIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkciBpcGFkZHIuICctbGlzdGVuIGxvY2FsaG9zdCcgYW5kIGhvc3RuYW1lIHdvcmsgdG9vLgotCi1saWJ2bmNzZXJ2ZXItdGlnaHQtZXh0ZW5zaW9uIG9wdGlvbnM6Ci0tZGlzYWJsZWZpbGV0cmFuc2ZlciAgIGRpc2FibGUgZmlsZSB0cmFuc2ZlcgotLWZ0cHJvb3Qgc3RyaW5nICAgICAgICBzZXQgZnRwIHJvb3QKLQotCi0KLQotJSB4MTF2bmMgLWhlbHAKLQoteDExdm5jOiBhbGxvdyBWTkMgY29ubmVjdGlvbnMgdG8gcmVhbCBYMTEgZGlzcGxheXMuIDAuOS4xMyBsYXN0bW9kOiAyMDEwLTEyLTI3Ci0KLSh0eXBlICJ4MTF2bmMgLW9wdHMiIHRvIGp1c3QgbGlzdCB0aGUgb3B0aW9ucy4pCi0KLVR5cGljYWwgdXNhZ2UgaXM6Ci0KLSAgIFJ1biB0aGlzIGNvbW1hbmQgaW4gYSBzaGVsbCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgImZhci1ob3N0IgotICAgd2l0aCBYIHNlc3Npb24geW91IHdpc2ggdG8gdmlldzoKLQotICAgICAgIHgxMXZuYyAtZGlzcGxheSA6MAotCi0gICBUaGVuIHJ1biB0aGlzIGluIGFub3RoZXIgd2luZG93IG9uIHRoZSBtYWNoaW5lIHlvdSBhcmUgc2l0dGluZyBhdDoKLQotICAgICAgIHZuY3ZpZXdlciBmYXItaG9zdDowCi0KLU9uY2UgeDExdm5jIGVzdGFibGlzaGVzIGNvbm5lY3Rpb25zIHdpdGggdGhlIFgxMSBzZXJ2ZXIgYW5kIHN0YXJ0cyBsaXN0ZW5pbmcKLWFzIGEgVk5DIHNlcnZlciBpdCB3aWxsIHByaW50IG91dCBhIHN0cmluZzogUE9SVD1YWFhYIHdoZXJlIFhYWFggaXMgdHlwaWNhbGx5Ci01OTAwICh0aGUgZGVmYXVsdCBWTkMgc2VydmVyIHBvcnQpLiAgT25lIHdvdWxkIG5leHQgcnVuIHNvbWV0aGluZyBsaWtlCi10aGlzIG9uIHRoZSBsb2NhbCBtYWNoaW5lOiAidm5jdmlld2VyIGhvc3RuYW1lOk4iIHdoZXJlICJob3N0bmFtZSIgaXMKLXRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgeDExdm5jIGFuZCBOIGlzIFhYWFggLSA1OTAwLCBpLmUuIHVzdWFsbHkKLSJ2bmN2aWV3ZXIgaG9zdG5hbWU6MCIuCi0KLUJ5IGRlZmF1bHQgeDExdm5jIHdpbGwgbm90IGFsbG93IHRoZSBzY3JlZW4gdG8gYmUgc2hhcmVkIGFuZCBpdCB3aWxsIGV4aXQKLWFzIHNvb24gYXMgdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gIFNlZSAtc2hhcmVkIGFuZCAtZm9yZXZlciBiZWxvdyB0byBvdmVycmlkZQotdGhlc2UgcHJvdGVjdGlvbnMuICBTZWUgdGhlIEZBUSBmb3IgZGV0YWlscyBob3cgdG8gdHVubmVsIHRoZSBWTkMgY29ubmVjdGlvbgotdGhyb3VnaCBhbiBlbmNyeXB0ZWQgY2hhbm5lbCBzdWNoIGFzIHNzaCgxKS4gIEluIGJyaWVmOgotCi0gICAgICAgc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWhvc3QgJ3gxMXZuYyAtbG9jYWxob3N0IC1kaXNwbGF5IDowJwotCi0gICAgICAgdm5jdmlld2VyIC1lbmNvZGluZ3MgJ2NvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZScgbG9jYWxob3N0OjAKLQotQWxzbywgdXNlIG9mIGEgVk5DIHBhc3N3b3JkICgtcmZiYXV0aCBvciAtcGFzc3dkZmlsZSkgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCi0KLUZvciBhZGRpdGlvbmFsIGluZm8gc2VlOiBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotICAgICAgICAgICAgICAgICAgICBhbmQgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwKLQotCi1Db25maWcgZmlsZSBzdXBwb3J0OiBpZiB0aGUgZmlsZSAkSE9NRS8ueDExdm5jcmMgZXhpc3RzIHRoZW4gZWFjaCBsaW5lIGluCi1pdCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBvcHRpb24uICBEaXNhYmxlIHdpdGggLW5vcmMuICBGb3IKLWVhY2ggb3B0aW9uIG5hbWUsIHRoZSBsZWFkaW5nIGNoYXJhY3RlciAiLSIgaXMgbm90IHJlcXVpcmVkLiAgRS5nLiBhIGxpbmUKLXRoYXQgaXMgZWl0aGVyICJmb3JldmVyIiBvciAiLWZvcmV2ZXIiIG1heSBiZSB1c2VkIGFuZCBhcmUgZXF1aXZhbGVudC4KLUxpa2V3aXNlICJ3YWl0IDEwMCIgb3IgIi13YWl0IDEwMCIgYXJlIGFjY2VwdGFibGUgYW5kIGVxdWl2YWxlbnQgbGluZXMuCi1UaGUgIiMiIGNoYXJhY3RlciBjb21tZW50cyBvdXQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBpbiB0aGUgdXN1YWwgd2F5Ci0oYmFja3NsYXNoIGl0IGZvciBhIGxpdGVyYWwpLiAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyB0cmltbWVkIG9mZi4KLUxpbmVzIG1heSBiZSBjb250aW51ZWQgd2l0aCBhICJcIiBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYSBsaW5lIChpdAotYmVjb21lcyBhIHNwYWNlIGNoYXJhY3RlcikuCi0KLU9wdGlvbnM6Ci0KLS1kaXNwbGF5IGRpc3AgICAgICAgICAgWDExIHNlcnZlciBkaXNwbGF5IHRvIGNvbm5lY3QgdG8sIHVzdWFsbHkgOjAuICBUaGUgWAotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgcHJvY2VzcyBtdXN0IGJlIHJ1bm5pbmcgb24gc2FtZSBtYWNoaW5lIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IE1JVC1TSE0uICBFcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIERJU1BMQVkKLSAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gImRpc3AiLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgZGVzY3JpcHRpb24gYmVsb3cgb2YgdGhlICItZGlzcGxheSBXQUlUOi4uLiIKLSAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucywgd2hlcmUgYWxpYXMgIi1maW5kIiB3aWxsIGZpbmQgdGhlIHVzZXIncwotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IGF1dG9tYXRpY2FsbHksIGFuZCAiLWNyZWF0ZSIgd2lsbCBjcmVhdGUgYQotICAgICAgICAgICAgICAgICAgICAgICBYdmZiIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpcyBmb3VuZC4KLQotLWF1dGggZmlsZSAgICAgICAgICAgICBTZXQgdGhlIFggYXV0aG9yaXR5IGZpbGUgdG8gYmUgImZpbGUiLCBlcXVpdmFsZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgdGhlIFhBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gImZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBzdGFydHVwLiAgU2FtZSBhcyAteGF1dGggZmlsZS4gIFNlZSBYc2VjdXJpdHkoNyksCi0gICAgICAgICAgICAgICAgICAgICAgIHhhdXRoKDEpIG1hbiBwYWdlcyBmb3IgbW9yZSBpbmZvLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSAnLWF1dGggZ3Vlc3MnIHRvIGhhdmUgeDExdm5jIHVzZSBpdHMgLWZpbmRhdXRoCi0gICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbSAoZGVzY3JpYmVkIGJlbG93KSB0byB0cnkgdG8gZ3Vlc3MgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFhBVVRIT1JJVFkgZmlsZW5hbWUgYW5kIHVzZSBpdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBYRE0vR0RNL0tETTogaWYgeW91IGFyZSBydW5uaW5nIHgxMXZuYyBhcyByb290IGFuZCB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmQgdGhlIFhBVVRIT1JJVFkgYmVmb3JlIGFueW9uZSBoYXMgbG9nZ2VkIGludG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgWCBzZXNzaW9uIHlldCwgdXNlOiB4MTF2bmMgLWVudiBGRF9YRE09MSAtYXV0aCBndWVzcyAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMgd2lsbCBhbHNvIGZpbmQgdGhlIFhBVVRIT1JJVFkgaWYgYSB1c2VyIGlzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbi4pICBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRkRfWERNPTEgd2lsbCBiZSB0cmllZCBpZiB0aGUgaW5pdGlhbCAtYXV0aCBndWVzcyBmYWlscy4KLQotLU4gICAgICAgICAgICAgICAgICAgICBJZiB0aGUgWCBkaXNwbGF5IGlzIDpOLCB0cnkgdG8gc2V0IHRoZSBWTkMgZGlzcGxheSB0bwotICAgICAgICAgICAgICAgICAgICAgICBhbHNvIGJlIDpOIFRoaXMganVzdCBzZXRzIHRoZSAtcmZicG9ydCBvcHRpb24gdG8gNTkwMCtOCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm9ncmFtIHdpbGwgZXhpdCBpbW1lZGlhdGVseSBpZiB0aGF0IHBvcnQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gVGhlIC1OIG9wdGlvbiBvbmx5IHdvcmtzIHdpdGggbm9ybWFsIC1kaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCBlLmcuIDowIG9yIDo4LCAtTiBpcyBpZ25vcmVkIGluIHRoZSAtZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICBXQUlUOi4uLiwgLWNyZWF0ZSwgLWZpbmQsIC1zdmMsIC1yZWRpcmVjdCwgZXRjIG1vZGVzLgotCi0tYXV0b3BvcnQgbiAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgcHJvYmUgZm9yIGEgZnJlZSBWTkMgcG9ydCBzdGFydGluZyBhdCBuLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBzdGFydCBwcm9iaW5nIGF0IDU5MDAuICBVc2UgdGhpcyB0bwotICAgICAgICAgICAgICAgICAgICAgICBzdGF5IGF3YXkgZnJvbSBvdGhlciBWTkMgc2VydmVycyBuZWFyIDU5MDAuCi0KLS1yZmJwb3J0IHN0ciAgICAgICAgICAgVGhlIFZOQyBwb3J0IHRvIGxpc3RlbiBvbiAoYSBMaWJWTkNTZXJ2ZXIgb3B0aW9uKSwgZS5nLgotICAgICAgICAgICAgICAgICAgICAgICA1OTAwLCA1OTAxLCBldGMuICBJZiBzcGVjaWZpZWQgYXMgIi1yZmJwb3J0IFBST01QVCIKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgeDExdm5jIC1ndWkgaXMgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgdGhlIHBvcnQgbnVtYmVyLgotCi0tNiAgICAgICAgICAgICAgICAgICAgIElQdjYgbGlzdGVuaW5nIHN1cHBvcnQuICBJbiBhZGRpdGlvbiB0byBJUHY0LCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBhZGRyZXNzIGlzIGxpc3RlbmVkIG9uIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNhbWUgcG9ydCBudW1iZXIgYXMgSVB2NCBpcyB1c2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5PVEU6ICBUaGlzIHgxMXZuYyBiaW5hcnkgd2FzIGNvbXBpbGVkIHRvIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICItNiIgSVB2NiBsaXN0ZW5pbmcgbW9kZSBFTkFCTEVEIGJ5IGRlZmF1bHQgKENQUEZMQUdTCi0gICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX0xJU1RFTjY9MSkuICBTbyB0byBkaXNhYmxlIElQdjYgbGlzdGVuaW5nIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IE1VU1Qgc3VwcGx5IHRoZSAiLW5vNiIgb3B0aW9uIChzZWUgYmVsb3cuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSAiLTYiIG1vZGUgd29ya3MgZm9yIGJvdGggbm9ybWFsIGNvbm5lY3Rpb25zIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAtc3NsIGVuY3J5cHRlZCBvbmVzLiAgTmVhcmx5IGV2ZXJ5dGhpbmcgaXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgSVB2NiBjYXNlLCBidXQgdGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgIFNlZSAtc3R1bm5lbCBmb3IgaXRzIElQdjYgc3VwcG9ydC4KLQotICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHksIGZvciBhYnNvbHV0ZWx5IGV2ZXJ5dGhpbmcgdG8gd29yayBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hY2hpbmUgbWF5IG5lZWQgdG8gaGF2ZSBzb21lIElQdjQgc3VwcG9ydCwgYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGxlYXN0IGZvciB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlLiAgSG93ZXZlciwgZm9yIG5lYXJseQotICAgICAgICAgICAgICAgICAgICAgICBhbGwgdXNhZ2UgbW9kZXMgbm8gSVB2NCBzdXBwb3J0IGlzIHJlcXVpcmVkLiBTZWUgLW5vcGl2NAotLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBoYXZlIHRyb3VibGUgY29tcGlsaW5nIG9yIHJ1bm5pbmcgaW4gSVB2NiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBzZXQgLURYMTFWTkNfSVBWNj0wIGluIENQUEZMQUdTIHdoZW4gY29uZmlndXJpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBJUHY2IHN1cHBvcnQuCi0KLS1ubzYgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBJUHY2IGxpc3RlbmluZyBzdXBwb3J0IChvbmx5IHVzZWZ1bCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIi02IiBtb2RlIGlzIGNvbXBpbGVkIGluIHRvIGJlIHRoZSBkZWZhdWx0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19MSVNURU42IGRlc2NyaXB0aW9uIGFib3ZlIHVuZGVyICItNiIuKQotCi0tbm9pcHY2ICAgICAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gdXNlIElQdjYgZm9yIGFueSBsaXN0ZW5pbmcgb3IgY29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzLiAgVGhpcyBpbmNsdWRlcyBib3RoIHRoZSBsaXN0ZW5pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICBwb3J0KHMpIGFuZCBvdXRnb2luZyBjb25uZWN0aW9ucyBmcm9tIC1jb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdF9vcl9leGl0LCBvciAtcHJveHkuICBVc2UgdGhpcyBpZiB5b3UgYXJlIGhhdmluZwotICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcyBkdWUgdG8gSVB2Ni4KLQotLW5vaXB2NCAgICAgICAgICAgICAgICBEbyBub3QgdHJ5IHRvIHVzZSBJUHY0IGZvciBhbnkgbGlzdGVuaW5nIG9yIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0cy4gIFRoaXMgaXMgbWFpbmx5IGZvciBleHBsb3JpbmcgdGhlIGJlaGF2aW9yIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBvbiBhbiBJUHY2LW9ubHkgc3lzdGVtLCBidXQgbWF5IGhhdmUgb3RoZXIgdXNlcy4KLQotLXJlb3BlbiAgICAgICAgICAgICAgICBJZiB0aGUgWCBzZXJ2ZXIgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHRyeSB0bwotICAgICAgICAgICAgICAgICAgICAgICByZW9wZW4gdGhlIFggZGlzcGxheSAodXAgdG8gb25lIHRpbWUuKSAgVGhpcyBpcyBvZiB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpc3BsYXkgbWFuYWdlcnMgbGlrZSBHRE0gKEtpbGxJbml0Q2xpZW50cyBvcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQga2lsbCB4MTF2bmMganVzdCBhZnRlciB0aGUgdXNlciBsb2dzIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFggc2Vzc2lvbi4gIE5vdGU6IHRoZSByZW9wZW5lZCBzdGF0ZSBtYXkgYmUgdW5zdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgIFNldCBYMTFWTkNfUkVPUEVOX0RJU1BMQVk9biB0byByZW9wZW4gbiB0aW1lcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0IFgxMVZOQ19SRU9QRU5fU0xFRVBfTUFYIHRvIHRoZSBudW1iZXIgb2Ygc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAxMCwgdG8ga2VlcCB0cnlpbmcgdG8gcmVvcGVuIHRoZSBkaXNwbGF5IChvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgIHBlciBzZWNvbmQuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZTogYXMgb2YgMC45LjksIHgxMXZuYyB0cmllcyB0byBhdXRvbWF0aWNhbGx5IGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGtpbGxlZCBieSB0aGUgZGlzcGxheSBtYW5hZ2VyIGJ5IGRlbGF5aW5nIGNyZWF0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Mgb3IgdXNpbmcgWEZJWEVTLiAgU28geW91IHNob3VsZG4ndCBuZWVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICBLaWxsSW5pdENsaWVudHM9ZmFsc2UgYXMgbG9uZyBhcyB5b3UgbG9nIGluIHF1aWNrbHkKLSAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoICh3aXRoaW4gNDUgc2Vjb25kcyBvZiBjb25uZWN0aW5nLikgIFlvdSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB0aGlzIGJ5IHNldHRpbmcgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgaXQgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGRlbGF5LgotCi0tcmVmbGVjdCBob3N0Ok4gICAgICAgIEluc3RlYWQgb2YgY29ubmVjdGluZyB0byBhbmQgcG9sbGluZyBhbiBYIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBWTkMgc2VydmVyIGhvc3Q6TiBhbmQgYmUgYQotICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0b3IvcmVwZWF0ZXIgZm9yIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIHRyeWluZwotICAgICAgICAgICAgICAgICAgICAgICB0byBtYW5hZ2UgdGhlIGNhc2Ugb2YgbWFueSBzaW11bHRhbmVvdXMgVk5DIHZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gY2xhc3Nyb29tIGJyb2FkY2FzdGluZykgd2hlcmUsIGUuZy4geW91IHB1dAotICAgICAgICAgICAgICAgICAgICAgICBhIHJlcGVhdGVyIG9uIGVhY2ggbmV0d29yayBzd2l0Y2gsIGV0YywgdG8gaW1wcm92ZQotICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBieSBkaXN0cmlidXRpbmcgdGhlIGxvYWQgYW5kIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhZmZpYy4gIEltcGxpZXMgLXNoYXJlZCAodXNlIC1ub3NoYXJlZCBhcyBhIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiB0byBkaXNhYmxlKS4gU2VlIHRoZSBkaXNjdXNzaW9uIGJlbG93IHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2bmM6aG9zdDpOIGZvciBtb3JlIGRldGFpbHMuCi0KLS1pZCB3aW5kb3dpZCAgICAgICAgICAgU2hvdyB0aGUgWCB3aW5kb3cgY29ycmVzcG9uZGluZyB0byAid2luZG93aWQiIG5vdAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGRpc3BsYXkuICBOZXcgd2luZG93cyBsaWtlIHBvcHVwIG1lbnVzLAotICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnQgdG9wbGV2ZWxzLCBldGMsIG1heSBub3QgYmUgc2VlbiBvciBtYXkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBlZC4gIERpc2FibGluZyBTYXZlVW5kZXJzIG9yIEJhY2tpbmdTdG9yZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgWCBzZXJ2ZXIgbWF5IGhlbHAgc2hvdyB0aGVtLiAgeDExdm5jIG1heSBjcmFzaCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IGlzIGluaXRpYWxseSBwYXJ0aWFsbHkgb2JzY3VyZWQsIGNoYW5nZXMgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgaWNvbmlmaWVkLCBldGMuICBTb21lIHN0ZXBzIGFyZSB0YWtlbiB0byBhdm9pZCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgLXhyYW5kciBtZWNoYW5pc20gaXMgdXNlZCB0byB0cmFjayByZXNpemVzLiAgVXNlCi0gICAgICAgICAgICAgICAgICAgICAgIHh3aW5pbmZvKDEpIHRvIGdldCB0aGUgd2luZG93IGlkLCBvciB1c2UgIi1pZCBwaWNrIgotICAgICAgICAgICAgICAgICAgICAgICB0byBoYXZlIHgxMXZuYyBydW4geHdpbmluZm8oMSkgZm9yIHlvdSBhbmQgZXh0cmFjdAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgaWQuICBUaGUgLWlkIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGV4cG9ydGluZyB2ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSBhcHBsaWNhdGlvbnMgKGUuZy4gdGhlIGN1cnJlbnQgdmlldyBvbiBhIHdlYmNhbSkuCi0tc2lkIHdpbmRvd2lkICAgICAgICAgIEFzIC1pZCwgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIHdpbmRvdyBkaXJlY3RseSBpdAotICAgICAgICAgICAgICAgICAgICAgICBzaGlmdHMgYSByb290IHZpZXcgdG8gaXQ6IHRoaXMgc2hvd3MgU2F2ZVVuZGVycyBtZW51cywKLSAgICAgICAgICAgICAgICAgICAgICAgZXRjLCBhbHRob3VnaCB0aGV5IHdpbGwgYmUgY2xpcHBlZCBpZiB0aGV5IGV4dGVuZCBiZXlvbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdy4KLQotLWFwcHNoYXJlICAgICAgICAgICAgICBTaW1wbGUgYXBwbGljYXRpb24gc2hhcmluZyBiYXNlZCBvbiB0aGUgLWlkLy1zaWQKLSAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtLiAgRXZlcnkgbmV3IHRvcGxldmVsIHdpbmRvdyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjcmVhdGVzIGluZHVjZXMgYSBuZXcgdmlld2VyIHdpbmRvdyB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgYSByZXZlcnNlIGNvbm5lY3Rpb24uICBUaGUgLWlkLy1zaWQgYW5kIC1jb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYXJlIHJlcXVpcmVkLiAgUnVuICd4MTF2bmMgLWFwcHNoYXJlIC1oZWxwJwotICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvLgotCi0tY2xpcCBXeEgrWCtZICAgICAgICAgIE9ubHkgc2hvdyB0aGUgc3ViLXJlZ2lvbiBvZiB0aGUgZnVsbCBkaXNwbGF5IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHJlY3RhbmdsZSBnZW9tZXRyeSB3aXRoIHNpemUgV3hIIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgK1grWS4gIFRoZSBWTkMgZGlzcGxheSBoYXMgc2l6ZSBXeEggKGkuZS4gc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBmdWxsIGRpc3BsYXkpLiAgVGhpcyBhbHNvIHdvcmtzIGZvciAtaWQvLXNpZAotICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHdoZXJlIHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIHVwcGVyIGxlZnQKLSAgICAgICAgICAgICAgICAgICAgICAgY29ybmVyIG9mIHRoZSBzZWxlY3RlZCB3aW5kb3cuICBBbiBleGFtcGxlIHVzZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiB3b3VsZCBiZSB0byBzcGxpdCBhIGxhcmdlIChlLmcuIFhpbmVyYW1hKSBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIGludG8gdHdvIHBhcnRzIHRvIGJlIGFjY2Vzc2VkIHZpYSBzZXBhcmF0ZSB2aWV3ZXJzIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgYSBzZXBhcmF0ZSB4MTF2bmMgb24gZWFjaCBwYXJ0LgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSAnLWNsaXAgeGluZXJhbWEwJyB0byBjbGlwIHRvIHRoZSBmaXJzdCB4aW5lcmFtYQotICAgICAgICAgICAgICAgICAgICAgICBzdWItc2NyZWVuIChpZiB4aW5lcmFtYSBpcyBhY3RpdmUpLiAgeGluZXJhbWExIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgMm5kIHN1Yi1zY3JlZW4sIGV0Yy4gIFRoaXMgd2F5IHlvdSBkb24ndCBuZWVkIHRvIGZpZ3VyZQotICAgICAgICAgICAgICAgICAgICAgICBvdXQgdGhlIFd4SCtYK1kgb2YgdGhlIGRlc2lyZWQgeGluZXJhbWEgc3ViLXNjcmVlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucyBhcmUgc29ydGVkIGluIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgKDAsMCkgb3JpZ2luIChJLmUuIG5vdCB0aGUgWHNlcnZlcidzIG9yZGVyKS4KLQotLWZsYXNoY21hcCAgICAgICAgICAgICBJbiA4YnBwIGluZGV4ZWQgY29sb3IsIGxldCB0aGUgaW5zdGFsbGVkIGNvbG9ybWFwIGZsYXNoCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBwb2ludGVyIG1vdmVzIGZyb20gd2luZG93IHRvIHdpbmRvdyAoc2xvdykuCi0gICAgICAgICAgICAgICAgICAgICAgIEFsc28gdHJ5IHRoZSAtOHRvMjQgb3B0aW9uIHRvIGF2b2lkIGZsYXNoIGFsdG9nZXRoZXIuCi0tc2hpZnRjbWFwIG4gICAgICAgICAgIFJhcmUgcHJvYmxlbSwgYnV0IHNvbWUgOGJwcCBkaXNwbGF5cyB1c2UgbGVzcyB0aGFuIDI1NgotICAgICAgICAgICAgICAgICAgICAgICBjb2xvcmNlbGxzIChlLmcuIDE2LWNvbG9yIGdyYXlzY2FsZSwgcGVyaGFwcyB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgYml0cyBhcmUgdXNlZCBmb3IgZG91YmxlIGJ1ZmZlcmluZykgKmFuZCogYWxzbyBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IHRoZSBwaXhlbHMgdmFsdWVzIGF3YXkgZnJvbSAwLCAuLiwgbmNlbGxzLiAgIm4iCi0gICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgc2hpZnQgdG8gYmUgYXBwbGllZCB0byB0aGUgcGl4ZWwgdmFsdWVzLgotICAgICAgICAgICAgICAgICAgICAgICBUbyBzZWUgdGhlIHBpeGVsIHZhbHVlcyBzZXQgREVCVUdfQ01BUD0xIHRvIHByaW50IG91dAotICAgICAgICAgICAgICAgICAgICAgICBhIGNvbG9ybWFwIGhpc3RvZ3JhbS4gIEV4YW1wbGU6IC1zaGlmdGNtYXAgMjQwCi0tbm90cnVlY29sb3IgICAgICAgICAgIEZvciA4YnBwIGRpc3BsYXlzLCBmb3JjZSBpbmRleGVkIGNvbG9yIChpLmUuIGEgY29sb3JtYXApCi0gICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgaXQgbG9va3MgbGlrZSA4YnBwIFRydWVDb2xvciAocmFyZSBwcm9ibGVtKS4KLS1hZHZlcnRpc2VfdHJ1ZWNvbG9yICAgSWYgdGhlIFgxMSBkaXNwbGF5IGlzIGluZGV4ZWQgY29sb3IsIGxpZSB0byBjbGllbnRzCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhleSBmaXJzdCBjb25uZWN0IGJ5IHRlbGxpbmcgdGhlbSBpdCBpcyB0cnVlY29sb3IuCi0gICAgICAgICAgICAgICAgICAgICAgIFRvIHdvcmthcm91bmQgUmVhbFZOQzogaW5QRiBoYXMgY29sb3VyTWFwIGJ1dCBub3QgOGJwcAotICAgICAgICAgICAgICAgICAgICAgICBVc2UgJy1hZHZlcnRpc2VfdHJ1ZWNvbG9yIHJlc2V0JyB0byByZXNldCBjbGllbnQgZmIgdG9vLgotCi0tdmlzdWFsIG4gICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHByb2JhYmx5IGRvZXMgbm90IGRvIHdoYXQgeW91IHRoaW5rLgotICAgICAgICAgICAgICAgICAgICAgICBJdCBzaW1wbHkgKmZvcmNlcyogdGhlIHZpc3VhbCB1c2VkIGZvciB0aGUgZnJhbWVidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWF5IGJlIGEgYmFkIHRoaW5nLi4uIChlLmcuIG1lc3NlcyB1cCBjb2xvcnMgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgYSBjcmFzaCkuIEl0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBhbmQgZm9yIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgd29ya2Fyb3VuZHMuICBuIG1heSBiZSBhIGRlY2ltYWwgbnVtYmVyLCBvciAweCBoZXguCi0gICAgICAgICAgICAgICAgICAgICAgIFJ1biB4ZHB5aW5mbygxKSBmb3IgdGhlIHZhbHVlcy4gIE9uZSBtYXkgYWxzbyB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIlRydWVDb2xvciIsIGV0Yy4gc2VlIDxYMTEvWC5oPiBmb3IgYSBsaXN0LiAgSWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbmRzIGluICI6bSIgdGhlbiBmb3IgYmV0dGVyIG9yIGZvciB3b3JzZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmlzdWFsIGRlcHRoIGlzIGZvcmNlZCB0byBiZSBtLiAgWW91IG1heSB3YW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSAtbm9zaG0gd2hlbiB1c2luZyB0aGlzIG9wdGlvbiAoc28gWEdldEltYWdlIG1heQotICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZSB0aGUgcGl4ZWwgZGF0YSkuCi0KLS1vdmVybGF5ICAgICAgICAgICAgICAgSGFuZGxlIG11bHRpcGxlIGRlcHRoIHZpc3VhbHMgb24gb25lIHNjcmVlbiwgZS5nLiA4KzI0Ci0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAyNCs4IG92ZXJsYXkgdmlzdWFscyAodGhlIDMyIGJpdHMgcGVyIHBpeGVsIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWQgd2l0aCA4IGZvciBQc2V1ZG9Db2xvciBhbmQgMjQgZm9yIFRydWVDb2xvcikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IC1vdmVybGF5IG9ubHkgd29ya3Mgb24gU29sYXJpcyB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgWFJlYWRTY3JlZW4oM1gxMSkgYW5kIElSSVggdXNpbmcgWFJlYWREaXNwbGF5KDMpLgotICAgICAgICAgICAgICAgICAgICAgICBPbiBTb2xhcmlzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGltYWdlICJibGVlZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kIHRyYW5zaWVudCBwb3B1cCBtZW51cyAoYnV0IG5vdCBmb3IgdGhlIG1lbnUKLSAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmKTogYSB3b3JrYXJvdW5kIGlzIHRvIGRpc2FibGUgU2F2ZVVuZGVycwotICAgICAgICAgICAgICAgICAgICAgICBieSBwYXNzaW5nIHRoZSAiLXN1IiBhcmd1bWVudCB0byBYc3VuIChpbgotICAgICAgICAgICAgICAgICAgICAgICAvZXRjL2R0L2NvbmZpZy9Yc2VydmVycykuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1vdmVybGF5IGFzIGEgd29ya2Fyb3VuZCBmb3Igc2l0dWF0aW9ucyBsaWtlIHRoZXNlOgotICAgICAgICAgICAgICAgICAgICAgICBTb21lIGxlZ2FjeSBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgZGVmYXVsdCB2aXN1YWwgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYmUgOGJwcCAoOCsyNCksIG9yIHRoZXkgd2lsbCB1c2UgOGJwcCBQc2V1ZG9Db2xvciBldmVuCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGRlZmF1bHQgdmlzdWFsIGlzIGRlcHRoIDI0IFRydWVDb2xvciAoMjQrOCkuCi0gICAgICAgICAgICAgICAgICAgICAgIEluIHRoZXNlIGNhc2VzIGNvbG9ycyBpbiBzb21lIHdpbmRvd3Mgd2lsbCBiZSBpbmNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgaW4geDExdm5jIHVubGVzcyAtb3ZlcmxheSBpcyB1c2VkLiAgQW5vdGhlciB1c2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgLW92ZXJsYXkgaXMgdG8gZW5hYmxlIHNob3dpbmcgdGhlIGV4YWN0IG1vdXNlIGN1cnNvcgotICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSAoZGV0YWlscyBiZWxvdykuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVW5kZXIgLW92ZXJsYXksIHBlcmZvcm1hbmNlIHdpbGwgYmUgc29tZXdoYXQgc2xvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byB0aGUgZXh0cmEgaW1hZ2UgdHJhbnNmb3JtYXRpb25zIHJlcXVpcmVkLgotICAgICAgICAgICAgICAgICAgICAgICBGb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSBkbyBub3QgdXNlIC1vdmVybGF5LCBidXQgcmF0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgWCBzZXJ2ZXIgc28gdGhhdCB0aGUgZGVmYXVsdCB2aXN1YWwgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggMjQgVHJ1ZUNvbG9yIGFuZCB0cnkgdG8gaGF2ZSBhbGwgYXBwcyB1c2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWwgKGUuZy4gc29tZSBhcHBzIGhhdmUgLXVzZTI0IG9yIC12aXN1YWwgb3B0aW9ucykuCi0tb3ZlcmxheV9ub2N1cnNvciAgICAgIFNldHMgLW92ZXJsYXksIGJ1dCBkb2VzIG5vdCB0cnkgdG8gZHJhdyB0aGUgZXhhY3QgbW91c2UKLSAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIHNoYXBlIHVzaW5nIHRoZSBvdmVybGF5IG1lY2hhbmlzbS4KLQotLTh0bzI0IFtvcHRzXSAgICAgICAgICBUcnkgdGhpcyBvcHRpb24gaWYgLW92ZXJsYXkgaXMgbm90IHN1cHBvcnRlZCBvbiB5b3VyCi0gICAgICAgICAgICAgICAgICAgICAgIE9TLCBhbmQgeW91IGhhdmUgYSBsZWdhY3kgOGJwcCBhcHAgdGhhdCB5b3Ugd2FudCB0bwotICAgICAgICAgICAgICAgICAgICAgICB2aWV3IG9uIGEgbXVsdGktZGVwdGggZGlzcGxheSB3aXRoIGRlZmF1bHQgZGVwdGggMjQKLSAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBpcyAzMiBicHApIE9SIGhhdmUgYSBkZWZhdWx0IGRlcHRoIDggZGlzcGxheSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIDI0IG92ZXJsYXkgd2luZG93cyBmb3Igc29tZSBhcHBzLiAgVGhpcyBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgbWF5IG5vdCB3b3JrIG9uIGFsbCBYIHNlcnZlcnMgYW5kIGhhcmR3YXJlICh0ZXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgb24gWEZyZWU4Ni9Yb3JnIG1nYSBkcml2ZXIgYW5kIFhzdW4pLiAgVGhlICJvcHRzIgotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgbm90IHJlcXVpcmVkIGFuZCBpcyBkZXNjcmliZWQgYmVsb3cuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGVuYWJsZXMgYSBoYWNrIHdoZXJlIHgxMXZuYyBtb25pdG9ycyB3aW5kb3dzCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiAzIGxldmVscyBmcm9tIHRoZSByb290IHdpbmRvdy4gIElmIGl0IGZpbmRzCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSB0aGF0IGFyZSA4YnBwIGl0IGV4dHJhY3RzIHRoZSBpbmRleGVkIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIHZhbHVlcyB1c2luZyBYR2V0SW1hZ2UoKSBhbmQgdGhlbiBhcHBsaWVzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIGNvbG9ybWFwKHMpIHRvIGNyZWF0ZSBUcnVlQ29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgUkdCIHZhbHVlcyB0aGF0IGl0IGluIHR1cm4gaW5zZXJ0cyBpbnRvIGJpdHMgMS0yNCBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVidWZmZXIuICBUaGlzIGNyZWF0ZXMgYSBkZXB0aCAyNCAidmlldyIKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGRpc3BsYXkgdGhhdCBpcyB0aGVuIGV4cG9ydGVkIHZpYSBWTkMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgZm9yIGRlZmF1bHQgZGVwdGggOCBkaXNwbGF5cywgdGhlIGRlcHRoCi0gICAgICAgICAgICAgICAgICAgICAgIDI0IHJlZ2lvbnMgYXJlIHJlYWQgYnkgWEdldEltYWdlKCkgYW5kIGV2ZXJ5dGhpbmcgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgYW5kIGluc2VydGVkIGludG8gYSBkZXB0aCAyNCBUcnVlQ29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZW4gaWYgdGhlcmUgYXJlICpubyogZGVwdGggMjQgdmlzdWFscyBvcgotICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIChpLmUuIHB1cmUgOGJwcCksIHRoaXMgbW9kZSBpcyBwb3RlbnRpYWxseQotICAgICAgICAgICAgICAgICAgICAgICBhbiBpbXByb3ZlbWVudCBvdmVyIC1mbGFzaGNtYXAgYmVjYXVzZSBpdCBhdm9pZHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGZsYXNoaW5nIGFuZCBzaG93cyBlYWNoIHdpbmRvdyBpbiB0aGUgY29ycmVjdCBjb2xvci4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCB3b3JrcyBPSywgYnV0IG1heSBzdGlsbCBoYXZlIGJ1Z3MgYW5kIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvZXMgaG9nIHJlc291cmNlcy4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSA4YnBwIHdpbmRvd3MKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW50IGNvbG9ybWFwcywgb25lIG1heSBoYXZlIHRvIGljb25pZnkgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCBvbmUgZm9yIHRoZSBjb2xvcnMgdG8gYmUgY29ycmVjdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBtYXkgYmUgcGFpbnRpbmcgZXJyb3JzIGZvciBjbGlwcGluZyBhbmQgc3dpdGNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gd2luZG93cyBvZiBkZXB0aHMgOCBhbmQgMjQuICBIZXVyaXN0aWNzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIHRvIHRyeSB0byBtaW5pbWl6ZSB0aGUgcGFpbnRpbmcgZXJyb3JzLiAgT25lIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHByZXNzIDMgQWx0X0wncyBpbiBhIHJvdyB0byByZWZyZXNoIHRoZSBzY3JlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGVycm9yIGRvZXMgbm90IHJlcGFpciBpdHNlbGYuICBBbHNvIHRoZSBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgLWZpeHNjcmVlbiA4PTMuMCBvciAtZml4c2NyZWVuIFY9My4wIG1heSBiZSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSByZWZyZXNoIHRoZSBzY3JlZW4gYXQgdGhlIGNvc3Qgb2YgYmFuZHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgIChldmVyeSAzIHNlYyBmb3IgdGhpcyBleGFtcGxlKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgW29wdHNdIHN0cmluZyBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBzZXR0aW5ncyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgZm9yIHNvbWUgWCBzZXJ2ZXJzIHdpdGggZGVmYXVsdCBkZXB0aCAyNCBhCi0gICAgICAgICAgICAgICAgICAgICAgIHNwZWVkdXAgbWF5IGJlIGFjaGlldmVkIHZpYSB0aGUgb3B0aW9uICJub2dldGltYWdlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbmFibGVzIGEgc2NoZW1lIHdlcmUgWEdldEltYWdlKCkgaXMgbm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcmV0cmlldmUgdGhlIDhicHAgZGF0YS4gIEluc3RlYWQsIGl0IGFzc3VtZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgOGJwcCBkYXRhIGlzIGluIGJpdHMgMjUtMzIgb2YgdGhlIDMyYml0IFggcGl4ZWxzLgotICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IHRoZSBYIHNlcnZlciBzaG91bGQgcHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhIHRoZXJlIGZvciBvdXIgcG9sbCByZXF1ZXN0cywgYnV0IHNvbWUgZG8gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZSBleHRyYSBzdGVwcyB0byByZXRyaWV2ZSBpdCBjYW4gYmUgc2tpcHBlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgVGVzdGVkIHdpdGggbWdhIGRyaXZlciB3aXRoIFhGcmVlODYvWG9yZy4gIEZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBkZXB0aCA4IGNhc2UgdGhpcyBvcHRpb24gaXMgaWdub3JlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBhZGp1c3QgaG93IG9mdGVuIFhHZXRJbWFnZSgpIGlzIHVzZWQgdG8gcG9sbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbm9uLWRlZmF1bHQgdmlzdWFsIHJlZ2lvbnMgZm9yIGNoYW5nZXMsIHVzZSB0aGUgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICJwb2xsPXQiIHdoZXJlICJ0IiBpcyBhIGZsb2F0aW5nIHBvaW50IHRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAwLjA1KQotCi0gICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIG9wdGlvbiAibGV2ZWwyIiB3aWxsIGxpbWl0IHRoZSBzZWFyY2gKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vbi1kZWZhdWx0IHZpc3VhbCB3aW5kb3dzIHRvIHR3byBsZXZlbHMgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcm9vdCB3aW5kb3cuICBEbyB0aGlzIG9uIHNsb3cgbWFjaGluZXMgd2hlcmUgeW91IGtub3cKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyBtYW5hZ2VyIG9ubHkgaW1wb3NlcyBvbmUgZXh0cmEgd2luZG93IGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcCB3aW5kb3cgYW5kIHRoZSByb290IHdpbmRvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbHNvIGZvciB2ZXJ5IHNsb3cgbWFjaGluZXMgdXNlICJjYWNoZXdpbj10IgotICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0IGlzIGEgZmxvYXRpbmcgcG9pbnQgYW1vdW50IG9mIHRpbWUgdG8gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgWEdldFdpbmRvd0F0dHJpYnV0ZXMgcmVzdWx0cy4gIEUuZy4gY2FjaGV3aW49NS4wLgotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1heSBsZWFkIHRvIHRoZSB3aW5kb3dzIGJlaW5nIHVubm90aWNlZCBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQgb2YgdGltZSB3aGVuIGRlaWNvbmlmeWluZywgcGFpbnRpbmcgZXJyb3JzLCBldGMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGVzdGluZyBvbiBhIHZlcnkgb2xkIFNTMjAgdGhlc2Ugb3B0aW9ucyBnYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYWJsZSByZXNwb25zZTogLTh0bzI0IHBvbGw9MC4yLGNhY2hld2luPTUuMC4gRm9yCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFjaGluZSAtb3ZlcmxheSBpcyBzdXBwb3J0ZWQgYW5kIGdpdmVzIGJldHRlcgotICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcgZm9yIHRoaXMgbW9kZSBjYW4gYmUgZW5hYmxlZCBieSBzZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICJkYmc9MSIsICJkYmc9MiIsIG9yICJkYmc9MyIuCi0KLS0yNHRvMzIgICAgICAgICAgICAgICAgVmVyeSByYXJlIHByb2JsZW06IGlmIHRoZSBmcmFtZWJ1ZmZlciAoWCBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIG9yIC1yYXdmYikgaXMgMjRicHAgaW5zdGVhZCBvZiB0aGUgdXN1YWwgMzJicHAsIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHkgdHJhbnNmb3JtIHRoZSBwaXhlbHMgdG8gMzJicHAuICBUaGlzIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgc2xvd2VyLCBidXQgY2FuIGJlIHVzZWQgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIHZpZXdlcnMgY2Fubm90IGhhbmRsZSAyNGJwcCAoZS5nLiAibWFpbjogc2V0UEY6Ci0gICAgICAgICAgICAgICAgICAgICAgIG5vdCA4LCAxNiBvciAzMiBicHA/IikuICBTZWUgdGhlIEZBUSBmb3IgbW9yZSBpbmZvLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC1yYXdmYiBtb2RlLCB0aGUgcGl4ZWxzIGFyZSBkaXJlY3RseQotICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCBieSBpbnNlcnRpbmcgYSAwIGJ5dGUgdG8gcGFkIHRoZW0gb3V0IHRvIDMyYnBwLgotICAgICAgICAgICAgICAgICAgICAgICBGb3IgWCBkaXNwbGF5cywgYSBrbHVkZ2UgaXMgZG9uZSB0aGF0IGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIi1ub3NobSAtdmlzdWFsIFRydWVDb2xvcjozMiIuICAoSWYgYmV0dGVyIHBlcmZvcm1hbmNlCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIG5lZWRlZCBmb3IgdGhlIGxhdHRlciwgZmVlbCBmcmVlIHRvIGFzaykuCi0KLS1zY2FsZSBmcmFjdGlvbiAgICAgICAgU2NhbGUgdGhlIGZyYW1lYnVmZmVyIGJ5IGZhY3RvciAiZnJhY3Rpb24iLiAgVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiAxIHNocmluayB0aGUgZmIsIGxhcmdlciBvbmVzIGV4cGFuZCBpdC4gTm90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlIG1heSBub3QgYmUgc2hhcnAgYW5kIHJlc3BvbnNlIG1heSBiZSBzbG93ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIElmICJmcmFjdGlvbiIgY29udGFpbnMgYSBkZWNpbWFsIHBvaW50ICIuIiBpdAotICAgICAgICAgICAgICAgICAgICAgICBpcyB0YWtlbiBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgYWx0ZXJuYXRpdmVseQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgbm90YXRpb24gIm0vbiIgbWF5IGJlIHVzZWQgdG8gZGVub3RlIGZyYWN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICBleGFjdGx5LCBlLmcuIC1zY2FsZSAyLzMKLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBzY2FsZSBhc3ltbWV0cmljYWxseSBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwKLSAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9ucywgc3BlY2lmeSBhIFd4SCBnZW9tZXRyeSB0byBzdHJldGNoIHRvOgotICAgICAgICAgICAgICAgICAgICAgICBlLmcuICctc2NhbGUgMTAyNHg3NjgnLCBvciBhbHNvICctc2NhbGUgMC45eDAuNzUnCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2NhbGluZyBPcHRpb25zOiBjYW4gYmUgYWRkZWQgYWZ0ZXIgImZyYWN0aW9uIiB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgIjoiLCB0byBzdXBwbHkgbXVsdGlwbGUgIjoiIG9wdGlvbnMgdXNlIGNvbW1hcy4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGp1c3Qgd2FudCBhIHF1aWNrLCByb3VnaCBzY2FsaW5nIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmcsIGFwcGVuZCAiOm5iIiB0byAiZnJhY3Rpb24iIChlLmcuIC1zY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAxLzM6bmIpLiAgTm8gYmxlbmRpbmcgaXMgdGhlIGRlZmF1bHQgZm9yIDhicHAgaW5kZXhlZAotICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwgdG8gZm9yY2UgYmxlbmRpbmcgZm9yIHRoaXMgY2FzZSB1c2UgIjpmYiIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSAtc2Nyb2xsY29weXJlY3QgYW5kIC13aXJlY29weXJlY3QgdW5kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgLXNjYWxlIHVzZSAiOm5vY3IiLiAgSWYgeW91IG5lZWQgdG8gdG8gZW5hYmxlIHRoZW0gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICI6Y3IiIG9yIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGEgc2xvdyBsaW5rIGlzIGRldGVjdGVkLCAiOm5vY3IiIG1heSBiZSBhcHBsaWVkCi0gICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuICBEZWZhdWx0OiA6Y3IKLQotICAgICAgICAgICAgICAgICAgICAgICBNb3JlIGVzb3RlcmljIG9wdGlvbnM6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdm5jdmlld2VycwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2NhbGVkIHdpZHRoIGlzIGFkanVzdGVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGlzIHVzZSAiOm40Ii4gICI6aW4iIHVzZSBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZSBldmVuIHdoZW4gc2hyaW5raW5nLCAiOnBhZCIgcGFkIHNjYWxlZCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgaGVpZ2h0IHRvIGJlIG11bHRpcGxlcyBvZiBzY2FsaW5nIGRlbm9taW5hdG9yCi0gICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMgZm9yIDIvMykuCi0KLS1nZW9tZXRyeSBXeEggICAgICAgICAgU2FtZSBhcyAtc2NhbGUgV3hICi0KLS1zY2FsZV9jdXJzb3IgZnJhYyAgICAgQnkgZGVmYXVsdCBpZiAtc2NhbGUgaXMgc3VwcGxpZWQgdGhlIGN1cnNvciBzaGFwZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgYnkgdGhlIHNhbWUgZmFjdG9yLiAgRGVwZW5kaW5nIG9uIHlvdXIgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdSBtYXkgd2FudCB0byBzY2FsZSB0aGUgY3Vyc29yIGluZGVwZW5kZW50bHkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbiBvciBub3QgYXQgYWxsLiAgSWYgeW91IHNwZWNpZnkgLXNjYWxlX2N1cnNvcgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3Vyc29yIHdpbGwgYmUgc2NhbGVkIGJ5IHRoYXQgZmFjdG9yLiAgV2hlbiB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICAtc2NhbGUgbW9kZSB0byBrZWVwIHRoZSBjdXJzb3IgYXQgaXRzICJuYXR1cmFsIiBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSAiLXNjYWxlX2N1cnNvciAxIi4gIE1vc3Qgb2YgdGhlICI6IiBzY2FsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYXBwbHkgaGVyZSBhcyB3ZWxsLgotCi0tdmlld29ubHkgICAgICAgICAgICAgIEFsbCBWTkMgY2xpZW50cyBjYW4gb25seSB3YXRjaCAoZGVmYXVsdCBvZmYpLgotLXNoYXJlZCAgICAgICAgICAgICAgICBWTkMgZGlzcGxheSBpcyBzaGFyZWQsIGkuZS4gbW9yZSB0aGFuIG9uZSB2aWV3ZXIgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgYXQgdGhlIHNhbWUgdGltZSAoZGVmYXVsdCBvZmYpLgotLW9uY2UgICAgICAgICAgICAgICAgICBFeGl0IGFmdGVyIHRoZSBmaXJzdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0cywgb3Bwb3NpdGUgb2YgLWZvcmV2ZXIuIFRoaXMgaXMgdGhlIERlZmF1bHQuCi0tZm9yZXZlciAgICAgICAgICAgICAgIEtlZXAgbGlzdGVuaW5nIGZvciBtb3JlIGNvbm5lY3Rpb25zIHJhdGhlciB0aGFuIGV4aXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgc29vbiBhcyB0aGUgZmlyc3QgY2xpZW50KHMpIGRpc2Nvbm5lY3QuIFNhbWUgYXMgLW1hbnkKLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBnZXQgdGhlIHN0YW5kYXJkIG5vbi1zaGFyZWQgVk5DIGJlaGF2aW9yIHdoZXJlIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgYSBuZXcgVk5DIGNsaWVudCBjb25uZWN0cyB0aGUgZXhpc3RpbmcgVk5DIGNsaWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkIHVzZTogIC1uZXZlcnNoYXJlZCAtZm9yZXZlciAgIFRoaXMgbWV0aG9kIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBodW5nIFRDUCBjb25uZWN0aW9ucyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBnbyBhd2F5LgotCi0tbG9vcCAgICAgICAgICAgICAgICAgIENyZWF0ZSBhbiBvdXRlciBsb29wIHJlc3RhcnRpbmcgdGhlIHgxMXZuYyBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW5ldmVyIGl0IHRlcm1pbmF0ZXMuICAtYmcgYW5kIC1pbmV0ZCBhcmUgaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIG1vZGUgKGhvd2V2ZXIgc2VlIC1sb29wYmcgYmVsb3cpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZWZ1bCBmb3IgY29udGludWluZyBldmVuIGlmIHRoZSBYIHNlcnZlciB0ZXJtaW5hdGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXN0YXJ0cyAoYXQgdGhhdCBtb21lbnQgdGhlIHByb2Nlc3Mgd2lsbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gdG8gcmVjb25uZWN0IHRvIHRoZSBuZXcgWCBzZXJ2ZXIgb2YgY291cnNlKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UsIGUuZy4sIC1sb29wMTAwIHRvIHNsZWVwIDEwMCBtaWxsaXNlY3MgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0cywgZXRjLiAgRGVmYXVsdCBpcyAyMDAwbXMgKGkuZS4gMiBzZWNzKSBVc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gLWxvb3AzMDAsNSB0byBzbGVlcCAzMDAgbXMgYW5kIG9ubHkgbG9vcCA1IHRpbWVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIC1sb29wYmcgKHBsdXMgYW55IG51bWJlcnMpIGlzIHNwZWNpZmllZCBpbnN0ZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgIi1iZyIgb3B0aW9uIGlzIGltcGxpZWQgYW5kIHRoZSBtb2RlIGFwcHJveGltYXRlcwotICAgICAgICAgICAgICAgICAgICAgICBpbmV0ZCg4KSB1c2FnZSB0byBzb21lIGRlZ3JlZS4gIEluIHRoaXMgY2FzZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIGl0IGdvZXMgaW50byB0aGUgYmFja2dyb3VuZCBhbnkgbGlzdGVuaW5nIHNvY2tldHMKLSAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gcG9ydHMgNTkwMCwgNTgwMCkgYXJlIGNsb3NlZCwgc28gdGhlIG5leHQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsb29wIGNhbiB1c2UgdGhlbS4gIFRoaXMgbW9kZSB3aWxsIG9ubHkgYmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIGlmIGEgVk5DIGNsaWVudCAodGhlIG9ubHkgY2xpZW50IGZvciB0aGF0IHByb2Nlc3MpCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgcHJvY2VzcyBnb2VzIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQsIGZvciBleGFtcGxlLCB1c2FnZSBvZiAtZGlzcGxheSBXQUlUOi4uLAotICAgICAgICAgICAgICAgICAgICAgICAtc3ZjLCBhbmQgLWNvbm5lY3QgY2FuIG1ha2UgdXNlIG9mIHRoaXMgInBvb3IgbWFuJ3MiCi0gICAgICAgICAgICAgICAgICAgICAgIGluZXRkIG1vZGUuICBUaGUgZGVmYXVsdCB3YWl0IHRpbWUgaXMgNTAwbXMgaW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiAgVGhpcyB1c2FnZSBjb3VsZCB1c2UgdXNlZnVsOiAgLXN2YyAtYmcgLWxvb3BiZwotCi0tdGltZW91dCBuICAgICAgICAgICAgIEV4aXQgdW5sZXNzIGEgY2xpZW50IGNvbm5lY3RzIHdpdGhpbiB0aGUgZmlyc3QgbiBzZWNvbmRzCi0gICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHN0YXJ0dXAuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaGF2ZSBiZWVuIG5vIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYWZ0ZXIgbgotICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIHgxMXZuYyBleGl0cyBpbW1lZGlhdGVseS4gIElmIGEgY2xpZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBjb25uZWN0IGJ1dCBoYXMgbm90IHByb2dyZXNzZWQgdG8gdGhlIG5vcm1hbAotICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpbmcgc3RhdGUsIHgxMXZuYyBnaXZlcyBpdCBhIGZldyBtb3JlIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZmluaXNoIGFuZCBleGl0cyBpZiBpdCBkb2VzIG5vdCBtYWtlIGl0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgc3RhdGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJldmVyc2UgY29ubmVjdGlvbnMgdmlhIC1jb25uZWN0IG9yIC1jb25uZWN0X29yX2V4aXQKLSAgICAgICAgICAgICAgICAgICAgICAgYSB0aW1lb3V0IG9mIG4gc2Vjb25kcyB3aWxsIGJlIHNldCBmb3IgYWxsIHJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdHMuICBJZiB0aGUgY29ubmVjdCB0aW1lb3V0IGFsYXJtIGdvZXMgb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2lsbCBleGl0IGltbWVkaWF0ZWx5LgotCi0tc2xlZXBpbiBuICAgICAgICAgICAgIEF0IHN0YXJ0dXAgc2xlZXAgbiBzZWNvbmRzIGJlZm9yZSBwcm9jZWVkaW5nIChlLmcuIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHJlZGlycyBhbmQgbGlzdGVuaW5nIGNsaWVudHMgdG8gc3RhcnQgdXApCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgYSByYW5nZSBpcyBnaXZlbjogJy1zbGVlcGluIG1pbi1tYXgnLCBhIHJhbmRvbSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIG1pbiBhbmQgbWF4IGlzIHNsZXB0LiBFLmcuICctc2xlZXBpbiAwLTIwJyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgJy1zbGVlcGluIDEwLTMwJy4gIEZsb2F0cyBhcmUgYWxsb3dlZCB0b28uCi0KLS1pbmV0ZCAgICAgICAgICAgICAgICAgTGF1bmNoZWQgYnkgaW5ldGQoOCk6IHN0ZGlvIGluc3RlYWQgb2YgbGlzdGVuaW5nIHNvY2tldC4KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgeW91IGFyZSBub3QgcmVkaXJlY3Rpbmcgc3RkZXJyIHRvIGEgbG9nIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgKHZpYSBzaGVsbCAyPiBvciAtbyBvcHRpb24pIHlvdSBNVVNUIGFsc28gc3BlY2lmeSB0aGUgLXEKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLCBvdGhlcndpc2UgdGhlIHN0ZGVyciBnb2VzIHRvIHRoZSB2aWV3ZXIgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjYXVzZSBpdCB0byBhYm9ydC4gIFNwZWNpZnlpbmcgYm90aCAtaW5ldGQgYW5kIC1xCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBubyAtbyB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHN0ZGVyci4KLQotLXRpZ2h0ZmlsZXhmZXIgICAgICAgICBFbmFibGUgdGhlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgZXh0ZW5zaW9uLiBOb3RlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aGVuIHRoZSAtdmlld29ubHkgb3B0aW9uIGlzIHN1cHBsaWVkIGFsbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycyBhcmUgZGlzYWJsZWQuICBBbHNvIGNsaWVudHMgdGhhdCBsb2cgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgY2Fubm90IHRyYW5zZmVyIGZpbGVzLiAgSG93ZXZlciwgaWYgdGhlIHJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIG1lY2hhbmlzbSBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZ2xvYmFsIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHBlci1jbGllbnQgdmlld29ubHkgc3RhdGUgdGhlIGZpbGV0cmFuc2ZlciBwZXJtaXNzaW9ucwotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIE5PVCBjaGFuZ2UuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JUQU5UOiBwbGVhc2UgdW5kZXJzdGFuZCBpZiAtdGlnaHRmaWxleGZlciBpcwotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGRpc3BsYXkgbWFuYWdlciAoZ2RtLCBrZG0sIC4uLikgYWNjZXNzIGFuZCB5b3UgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmUgaXQgc3dpdGNoIHVzZXJzIHZpYSB0aGUgLXVzZXJzIG9wdGlvbiwgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICBWTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8gZmlsZXRyYW5zZmVyCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWRzIGFuZCB3cml0ZXMgYXMgKnJvb3QqLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEFsc28sIHRpZ2h0ZmlsZXhmZXIgaXMgZGlzYWJsZWQgaW4gLXVuaXhwdyBtb2RlLgotCi0tdWx0cmFmaWxleGZlciAgICAgICAgIE5vdGU6IHRvIGVuYWJsZSBVbHRyYVZOQyBmaWxldHJhbnNmZXIgYW5kIHRvIGdldCBpdCB0bwotICAgICAgICAgICAgICAgICAgICAgICB3b3JrIHlvdSBwcm9iYWJseSBuZWVkIHRvIHN1cHBseSB0aGVzZSBMaWJWTkNTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogIi1yZmJ2ZXJzaW9uIDMuNiAtcGVybWl0ZmlsZXRyYW5zZmVyIgotICAgICAgICAgICAgICAgICAgICAgICAiLXVsdHJhZmlsZXhmZXIiIGlzIGFuIGFsaWFzIGZvciB0aGlzIGNvbWJpbmF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDogcGxlYXNlIHVuZGVyc3RhbmQgaWYgLXVsdHJhZmlsZXhmZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFuZCB5b3UgcnVuIHgxMXZuYyBhcyByb290IGZvciwgc2F5LCBpbmV0ZAotICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNwbGF5IG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIGl0IHN3aXRjaCB1c2VycyB2aWEgdGhlIC11c2VycyBvcHRpb24sIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIFZpZXdlcnMgdGhhdCBjb25uZWN0IGFyZSBhYmxlIHRvIGRvIGZpbGV0cmFuc2ZlcgotICAgICAgICAgICAgICAgICAgICAgICByZWFkcyBhbmQgd3JpdGVzIGFzICpyb290Ki4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgc2FkbHkgeW91IGNhbm5vdCBkbyBib3RoIC10aWdodGZpbGV4ZmVyIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAtdWx0cmFmaWxleGZlciBhdCB0aGUgc2FtZSB0aW1lIGJlY2F1c2UgdGhlIGxhdHRlcgotICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcyBzZXR0aW5nIHRoZSB2ZXJzaW9uIHRvIDMuNiBhbmQgdGlnaHR2bmMgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBub3QgZG8gZmlsZXRyYW5zZmVyIHdoZW4gaXQgc2VlcyB0aGF0IHZlcnNpb24gbnVtYmVyLgotCi0taHR0cCAgICAgICAgICAgICAgICAgIEluc3RlYWQgb2YgdXNpbmcgLWh0dHBkaXIgKHNlZSBiZWxvdykgdG8gc3BlY2lmeQotICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgSmF2YSB2bmN2aWV3ZXIgYXBwbGV0IGlzLCBoYXZlIHgxMXZuYyB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gKmd1ZXNzKiB3aGVyZSB0aGUgZGlyZWN0b3J5IGlzIGJ5IGxvb2tpbmcgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHByb2dyYW0gbG9jYXRpb24gYW5kIGluIHN0YW5kYXJkIGxvY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAoL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3NlcywgZXRjKS4gIFVuZGVyIC1zc2wgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgLXN0dW5uZWwgdGhlIHNzbCBjbGFzc2VzIHN1YmRpcmVjdG9yeSBpcyBzb3VnaHQuCi0taHR0cF9zc2wgICAgICAgICAgICAgIEFzIC1odHRwLCBidXQgZm9yY2UgbG9va3VwIGZvciBzc2wgY2xhc3NlcyBzdWJkaXIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGZvciBIVFRQUywgc2luZ2xlLXBvcnQgSmF2YSBhcHBsZXQgZGVsaXZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBzZXQgWDExVk5DX0hUVFBTX0RPV05MT0FEX1dBSVRfVElNRSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBhcHBsZXQgZG93bmxvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZmluaXNoLiAgVGhlIGRlZmF1bHQgaXMgMTUuCi0KLS1hdmFoaSAgICAgICAgICAgICAgICAgVXNlIHRoZSBBdmFoaS9tRE5TIFplcm9Db25mIHByb3RvY29sIHRvIGFkdmVydGlzZQotICAgICAgICAgICAgICAgICAgICAgICB0aGlzIFZOQyBzZXJ2ZXIgdG8gdGhlIGxvY2FsIG5ldHdvcmsuIChSZWxhdGVkIHRlcm1zOgotICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXp2b3VzLCBCb25qb3VyKS4gIERlcGVuZGluZyBvbiB5b3VyIHNldHVwLCB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgbWF5IG5lZWQgdG8gc3RhcnQgYXZhaGktZGFlbW9uIGFuZCBvcGVuIHVkcCBwb3J0IDUzNTMKLSAgICAgICAgICAgICAgICAgICAgICAgaW4geW91ciBmaXJld2FsbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCBYMTFWTkNfQVZBSElfTkFNRSwgWDExVk5DX0FWQUhJX0hPU1QsCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZC9vciBYMTFWTkNfQVZBSElfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLiAgRm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX0FWQUhJX05BTUU9d2FsbHkKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYXZhaGkgQVBJIGNhbm5vdCBiZSBmb3VuZCBhdCBidWlsZCB0aW1lLCBhIGhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGxpa2UgYXZhaGktcHVibGlzaCgxKSBvciBkbnMtc2QoMSkgd2lsbCBiZSB0cmllZAotCi0tbWRucyAgICAgICAgICAgICAgICAgIFNhbWUgYXMgLWF2YWhpLgotLXplcm9jb25mICAgICAgICAgICAgICBTYW1lIGFzIC1hdmFoaS4KLQotLWNvbm5lY3Qgc3RyaW5nICAgICAgICBGb3IgdXNlIHdpdGggInZuY3ZpZXdlciAtbGlzdGVuIiByZXZlcnNlIGNvbm5lY3Rpb25zLgotICAgICAgICAgICAgICAgICAgICAgICBJZiAic3RyaW5nIiBoYXMgdGhlIGZvcm0gImhvc3QiIG9yICJob3N0OnBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUgb25jZSBhdCBzdGFydHVwLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSBjb21tYXMgZm9yIGEgbGlzdCBvZiBob3N0J3MgYW5kIGhvc3Q6cG9ydCdzLgotICAgICAgICAgICAgICAgICAgICAgICBFLmcuIC1jb25uZWN0IGhvc3QxLGhvc3QyIG9yIGhvc3QxOjAsaG9zdDI6NTY3OC4KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRvIHJldmVyc2UgY29ubmVjdCB0byBtdWx0aXBsZSBob3N0cyBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2FtZSB0aW1lIHlvdSB3aWxsIGxpa2VseSBuZWVkIHRvIGFsc28gc3VwcGx5OiAtc2hhcmVkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHVubGlrZSBtb3N0IHZuYyBzZXJ2ZXJzLCB4MTF2bmMgd2lsbCByZXF1aXJlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgZm9yIHJldmVyc2UgYXMgd2VsbCBhcyBmb3IgZm9yd2FyZCBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgKHByb3ZpZGVkIHBhc3N3b3JkIGF1dGggaGFzIGJlZW4gZW5hYmxlZCwgLXJmYmF1dGgsIGV0YykKLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCB3YW50IHRvIHJlcXVpcmUgYSBwYXNzd29yZCBmb3IgcmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBzZXQgWDExVk5DX1JFVkVSU0VfQ09OTkVDVElPTl9OT19BVVRIPTEgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgeW91ciBlbnZpcm9ubWVudCBiZWZvcmUgc3RhcnRpbmcgeDExdm5jLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmICJzdHJpbmciIGNvbnRhaW5zICIvIiBpdCBpcyBpbnN0ZWFkIGludGVycHJldGVkCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIGEgZmlsZSB0byBwZXJpb2RpY2FsbHkgY2hlY2sgZm9yIG5ldyBob3N0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGxpbmUgaXMgcmVhZCBhbmQgdGhlbiB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIEJlIGNhcmVmdWwgYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZmlsZSBpZiB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcnVubmluZyBhcyByb290IChlLmcuIHZpYSBnZG0oMSksIGV0YykuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlciBtb2RlOiBTb21lIHNlcnZpY2VzIHByb3ZpZGUgYW4gaW50ZXJtZWRpYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICJ2bmMgcmVwZWF0ZXIiOiBodHRwOi8vd3d3LnV2bmMuY29tL2FkZG9ucy9yZXBlYXRlci5odG1sCi0gICAgICAgICAgICAgICAgICAgICAgIChhbmQgYWxzbyBodHRwOi8va290aS5tYm5ldC5maS9qdGtvLyBmb3IgbGludXggcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhY3RzIGFzIGEgcHJveHkvZ2F0ZXdheS4gIE1vZGVzIGxpa2UgdGhlc2UgcmVxdWlyZQotICAgICAgICAgICAgICAgICAgICAgICBhbiBpbml0aWFsIHN0cmluZyB0byBiZSBzZW50IGZvciB0aGUgcmV2ZXJzZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgVk5DIHByb3RvY29sIGlzIHN0YXJ0ZWQuICBIZXJlIGFyZSB0aGUgd2F5cwotICAgICAgICAgICAgICAgICAgICAgICB0byBkbyB0aGlzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcHJlPXNvbWVfc3RyaW5nK2hvc3Q6cG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHByZTEyOD1zb21lX3N0cmluZytob3N0OnBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCByZXBlYXRlcj1JRDoxMjM0K2hvc3Q6cG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHJlcGVhdGVyPTIzLjQ1LjY3Ljg5Ojo1NTAxK2hvc3Q6cG9ydAotCi0gICAgICAgICAgICAgICAgICAgICAgIFNTVk5DIG5vdGF0aW9uIGlzIGFsc28gc3VwcG9ydGVkOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6MTIzNAotCi0gICAgICAgICAgICAgICAgICAgICAgIEFzIHdpdGggbm9ybWFsIC1jb25uZWN0IHVzYWdlLCBpZiB0aGUgcmVwZWF0ZXIgcG9ydCBpcwotICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcGxpZWQgNTUwMCBpcyBhc3N1bWVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNpYyBpZGVhIGlzIGJldHdlZW4gdGhlIHNwZWNpYWwgdGFnLCBlLmcuICJwcmU9IgotICAgICAgICAgICAgICAgICAgICAgICBhbmQgIisiIGlzIHRoZSBwcmUtc3RyaW5nIHRvIGJlIHNlbnQuICBOb3RlIHRoYXQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlIGhvc3Q6cG9ydCBpcyB0aGUgcmVwZWF0ZXIgc2VydmVyLCBOT1QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHZuYyB2aWV3ZXIuICBTb21laG93IHRoZSBwcmUtc3RyaW5nIHRlbGxzIHRoZSByZXBlYXRlcgotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgaG93IHRvIGZpbmQgdGhlIHZuYyB2aWV3ZXIgYW5kIGNvbm5lY3QgeW91IHRvIGl0LgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIHByZT1zb21lX3N0cmluZytob3N0OnBvcnQsICJzb21lX3N0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgc2ltcGx5IHNlbnQuIEluIHRoZSBjYXNlIHByZU5OTj1zb21lX3N0cmluZytob3N0OnBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgInNvbWVfc3RyaW5nIiBpcyBzZW50IGluIGEgbnVsbCBwYWRkZWQgYnVmZmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBOTk4uICByZXBlYXRlcj0gaXMgdGhlIHNhbWUgYXMgcHJlMjUwPSwgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdWx0cmF2bmMgcmVwZWF0ZXIgYnVmZmVyIHNpemUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5ncyBsaWtlICJcbiIgYW5kICJcciIsIGV0Yy4gYXJlIGV4cGFuZGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgYW5kIGNhcnJpYWdlIHJldHVybi4gICJcYyIgaXMgZXhwYW5kZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIiwiIHNpbmNlIHRoZSBjb25uZWN0IHN0cmluZyBpcyBjb21tYSBzZXBhcmF0ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIGFsc28gdGhlIC1wcm94eSBvcHRpb24gYmVsb3cgZm9yIGFkZGl0aW9uYWwgd2F5cwotICAgICAgICAgICAgICAgICAgICAgICB0byBwbHVtYiByZXZlcnNlIGNvbm5lY3Rpb25zLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2UgU1NMOiB1c2luZyAtY29ubmVjdCBpbiAtc3NsIG1vZGUgbWFrZXMgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdCBhcyBhbiBTU0wgY2xpZW50IChpbml0aWF0ZXMgU1NMIGNvbm5lY3Rpb24pIHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGFuIFNTTCBzZXJ2ZXIuICBUaGUgaWRlYSBpcyB4MTF2bmMgbWlnaHQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBzdHVubmVsIG9uIHRoZSB2aWV3ZXIgc2lkZSB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIgaW4gbGlzdGVuaW5nIG1vZGUuICBJZiB5b3UgZG8gbm90IHdhbnQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwgdXNlIC1lbnYgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEuCi0gICAgICAgICAgICAgICAgICAgICAgIFdpdGggdGhpcyB0aGUgdmlld2VyIHNpZGUgY2FuIGFjdCBhcyB0aGUgU1NMIGNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICBhcyBpdCBub3JtYWxseSBkb2VzIGZvciBmb3J3YXJkIGNvbm5lY3Rpb25zLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2UgU1NMIFJlcGVhdGVyIG1vZGU6ICBUaGlzIHdpbGwgd29yaywgYnV0IG5vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpZiB0aGUgVk5DIENsaWVudCBkb2VzIGFueSBzb3J0IG9mIGEgJ0ZldGNoIENlcnQnCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBiZWZvcmUgY29ubmVjdGluZywgdGhlbiB0aGUgUmVwZWF0ZXIgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBsaWtlbHkgZHJvcCB0aGUgY29ubmVjdGlvbiBhbmQgYm90aCBzaWRlcyB3aWxsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVzdGFydC4gIENvbnNpZGVyIHRoZSB1c2Ugb2YgLWNvbm5lY3Rfb3JfZXhpdAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWxvb3AzMDAsMiB0byBoYXZlIHgxMXZuYyByZWNvbm5lY3Qgb25jZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZldGNoLiAgWW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBseSAtc3Nsb25seSB0byBhdm9pZCB4MTF2bmMgdGhpbmtpbmcgdGhlIGRlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIGluIHJlc3BvbnNlIG1lYW5zIHRoZSBjb25uZWN0aW9uIGlzIFZlTkNyeXB0LiAgVGhlIGVudgotICAgICAgICAgICAgICAgICAgICAgICB2YXIgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEgZGlzY3Vzc2VkIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgIG1heSBhbHNvIGJlIHVzZWZ1bCAoaS5lLiB0aGUgdmlld2VyIGNhbiBkbyBhIGZvcndhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhcyBpdCBub3JtYWxseSBkb2VzLikKLQotICAgICAgICAgICAgICAgICAgICAgICBJUHY2OiBhcyBvZiB4MTF2bmMgMC45LjEwIHRoZSAtY29ubmVjdCBvcHRpb24gc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gSVB2NiBob3N0cyBwcm9wZXJseS4gIElmIHRoZXJlIGFyZSBwcm9ibGVtcwotICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGRpc2FibGUgSVB2NiBieSBzZXR0aW5nIC1EWDExVk5DX0lQVjY9MAotICAgICAgICAgICAgICAgICAgICAgICBpbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nLiAgSWYgdGhlcmUgcHJvYmxlbXMKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBJUHY2IGhvc3RzIGNvbnNpZGVyIGEgcmVsYXkgbGlrZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW5ldDZ0bzQgc2NyaXB0IG9yIHRoZSAtcHJveHkgb3B0aW9uLgotCi0tY29ubmVjdF9vcl9leGl0IHN0ciAgIEFzIHdpdGggLWNvbm5lY3QsIGV4Y2VwdCBpZiBub25lIG9mIHRoZSByZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHN1Y2NlZWQsIHRoZW4geDExdm5jIHNodXRzIGRvd24gaW1tZWRpYXRlbHkKLQotICAgICAgICAgICAgICAgICAgICAgICBBbiBlYXNpZXIgdG8gdHlwZSBhbGlhcyBmb3IgdGhpcyBvcHRpb24gaXMgJy1jb2UnCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQnkgdGhlIHdheSwgaWYgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBsaXN0ZW4gb24KLSAgICAgICAgICAgICAgICAgICAgICAgQU5ZIGludGVyZmFjZSB1c2UgLXJmYnBvcnQgMCAgd2hpY2ggaXMgaGFuZHkgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdF9vcl9leGl0IG1vZGUuCi0KLS1wcm94eSBzdHJpbmcgICAgICAgICAgVXNlIHByb3h5IGluIHN0cmluZyAoZS5nLiBob3N0OnBvcnQpIGFzIGEgcHJveHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIG1ha2luZyByZXZlcnNlIGNvbm5lY3Rpb25zICgtY29ubmVjdCBvciAtY29ubmVjdF9vcl9leGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFdlYiBwcm94aWVzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBub3RlIGJ5IGRlZmF1bHQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGVtIG9ubHkgc3VwcG9ydCBkZXN0aW5hdGlvbiBjb25uZWN0aW9ucyB0byBwb3J0cyA0NDMKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgNTYzLCBzbyB0aGlzIG1pZ2h0IG5vdCBiZSB2ZXJ5IHVzZWZ1bCAodGhlIHZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBuZWVkIHRvIGxpc3RlbiBvbiB0aGF0IHBvcnQgb3IgdGhlIHJvdXRlciB3b3VsZAotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGRvIGEgcG9ydCByZWRpcmVjdGlvbikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQSB3ZWIgcHJveHkgbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgImhvc3Q6cG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgImh0dHA6Ly9ob3N0OnBvcnQiICh0aGUgcG9ydCBpcyByZXF1aXJlZCBldmVuIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHRoZSBjb21tb24gY2hvaWNlcyA4MCBvciA4MDgwKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFNPQ0tTNCwgU09DS1M0YSwgYW5kIFNPQ0tTNSBhcmUgYWxzbyBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIFNPQ0tTIHByb3hpZXMgbm9ybWFsbHkgZG8gbm90IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwb3J0IG51bWJlci4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSBmb3JtYXQgbGlrZSB0aGlzOiBzb2NrczovL2hvc3Q6cG9ydCBvcgotICAgICAgICAgICAgICAgICAgICAgICBzb2NrczU6Ly9ob3N0OnBvcnQuICBOb3RlIHRoYXQgc3NoIC1EIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgU09DS1M0YSwgc28gdXNlIHNvY2tzNTovLy4gIEZvciBzb2NrczovLyBTT0NLUzQgaXMgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICBvbiBhIG51bWVyaWNhbCBJUCBhbmQgImxvY2FsaG9zdCIsIG90aGVyd2lzZSBTT0NLUzRhCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgKGFuZCBzbyB0aGUgcHJveHkgdHJpZXMgdG8gZG8gdGhlIEROUyBsb29rdXApLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEFuIGV4cGVyaW1lbnRhbCBtb2RlIGlzICItcHJveHkgaHR0cDovL2hvc3Q6cG9ydC8uLi4iCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhlICIvIiBhZnRlciB0aGUgcG9ydCB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICBhIG5vcm1hbCB3ZWIgcHJveHkuICBUaGUgcG9ydCBtdXN0IGJlIHN1cHBsaWVkIGV2ZW4gaWYKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdGhlIGRlZmF1bHQgODAuICBGb3IgdGhpcyBtb2RlIGEgR0VUIGlzIGRvbmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN1cHBsaWVkIFVSTCB3aXRoIHRoZSBzdHJpbmcgaG9zdD1IJnBvcnQ9UCBhcHBlbmRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgSCBhbmQgUCB3aWxsIGJlIHRoZSAtY29ubmVjdCByZXZlcnNlIGNvbm5lY3QgaG9zdAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgcG9ydC4gIFVzZSB0aGUgc3RyaW5nICJfX0VORF9fIiB0byBkaXNhYmxlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRpbmcuICBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRoYXQgbWF5YmUgc29tZSBjZ2kKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0IHByb3ZpZGVzIHRoZSBhY3R1YWwgdmlld2VyIGhvb2t1cCBhbmQgdHVubmVsbGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGFjdHVhbGx5IGFjaGlldmUgdGhpcyB3aXRoaW4gY2dpLCBwaHAsIGV0Yy4gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGNsZWFyLi4uICBBIGN1c3RvbSB3ZWIgc2VydmVyIG9yIGFwYWNoZSBtb2R1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgd291bGQgYmUgc3RyYWlnaHQtZm9yd2FyZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIGV4cGVyaW1lbnRhbCBtb2RlIGlzICItcHJveHkgc3NoOi8vdXNlckBob3N0IgotICAgICAgICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIGEgU1NIIHR1bm5lbCBpcyB1c2VkIGZvciB0aGUgcHJveHlpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICJ1c2VyQCIgaXMgbm90IG5lZWRlZCB1bmxlc3MgeW91ciB1bml4IHVzZXJuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBvbiAiaG9zdCIuICBGb3IgYSBub24tc3RhbmRhcmQgU1NIIHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIHNzaDovL3VzZXJAaG9zdDpwb3J0LiAgSWYgcHJveGllcyBhcmUgY2hhaW5lZCAoc2VlCi0gICAgICAgICAgICAgICAgICAgICAgIG5leHQgcGFyYWdyYXBoKSB0aGVuIHRoZSBzc2ggb25lIG11c3QgYmUgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgc3NoLWFnZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gdGhlIHNzaCBwYXNzd29yZCBuZWVkcwotICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBlbnRlcmVkIGluIHRoZSB0ZXJtaW5hbCB3aGVyZSB4MTF2bmMgaXMgcnVubmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCBsb2NhbGhvc3Q6MCAtcHJveHkgc3NoOi8vbWVAZnJpZW5kcy1wYzoyMjIyCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCBzbm9vcHk6MCAtcHJveHkgc3NoOi8vc3NoLmNvbXBhbnkuY29tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgcHJveGllcyBtYXkgYmUgY2hhaW5lZCB0b2dldGhlciBpbiBjYXNlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byByaWNvY2hldCBvZmYgb2YgYSBudW1iZXIgb2YgaG9zdHMgdG8gZmluYWxseQotICAgICAgICAgICAgICAgICAgICAgICByZWFjaCB0aGUgVk5DIHZpZXdlci4gIFVwIHRvIDMgbWF5IGJlIGNoYWluZWQsIHNlcGFyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZW0gYnkgY29tbWFzIGluIHRoZSBvcmRlciB0aGV5IGFyZSB0byBiZSBjb25uZWN0ZWQgdG8uCi0gICAgICAgICAgICAgICAgICAgICAgIEUuZy46ICBodHRwOi8vaG9zdDE6cG9ydDEsc29ja3M1Oi8vaG9zdDI6cG9ydDIgb3IgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgbGlrZTogIGZpcnN0LHNlY29uZCx0aGlyZAotCi0gICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgdGhlIC1wcm94eSBvcHRpb24gc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gSVB2NiBob3N0cyBwcm9wZXJseS4gIElmIHRoZXJlIGFyZSBwcm9ibGVtcwotICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGRpc2FibGUgSVB2NiBieSBzZXR0aW5nIC1EWDExVk5DX0lQVjY9MAotICAgICAgICAgICAgICAgICAgICAgICBpbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nLiAgSWYgdGhlcmUgcHJvYmxlbXMKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBJUHY2IGhvc3RzIGNvbnNpZGVyIGEgcmVsYXkgbGlrZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW5ldDZ0bzQgc2NyaXB0LgotCi0tdm5jY29ubmVjdCAgICAgICAgICAgIE1vbml0b3IgdGhlIFZOQ19DT05ORUNUIFggcHJvcGVydHkgc2V0IGJ5IHRoZSBzdGFuZGFyZAotLW5vdm5jY29ubmVjdCAgICAgICAgICBWTkMgcHJvZ3JhbSB2bmNjb25uZWN0KDEpLiAgV2hlbiB0aGUgcHJvcGVydHkgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvICJob3N0IiBvciAiaG9zdDpwb3J0IiBlc3RhYmxpc2ggYSByZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICBVc2luZyB4cHJvcCgxKSBpbnN0ZWFkIG9mIHZuY2Nvbm5lY3QgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgIHdvcmsgKHNlZSB0aGUgRkFRKS4gIFRoZSAtcmVtb3RlIGNvbnRyb2wgbWVjaGFuaXNtIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFTU9URSBjaGFubmVsLCBhbmQgdGhpcyBvcHRpb24gZGlzYWJsZXMvZW5hYmxlcwotICAgICAgICAgICAgICAgICAgICAgICBpdCBhcyB3ZWxsLiAgRGVmYXVsdDogLXZuY2Nvbm5lY3QKLQotICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGVzZSBYMTEgcHJvcGVydGllcyAoZS5nLiB0bwotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgZm9yIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYydzIG9uIHRoZSBzYW1lIGRpc3BsYXkpIHNldCB0aGUgVk5DX0NPTk5FQ1Qgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFTU9URSBlbnYuIHZhcnMuIHRvIHRoZSBzdHJpbmcgeW91IHdhbnQsIGZvcgotICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiAtZW52IFgxMVZOQ19SRU1PVEU9WDExVk5DX1JFTU9URV8xMjM0NQotICAgICAgICAgICAgICAgICAgICAgICBCb3RoIHNpZGVzIG9mIHRoZSBjaGFubmVsIG11c3QgdXNlIHRoZSBzYW1lIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2FtZSBjYW4gYmUgZG9uZSBmb3IgdGhlIGludGVybmFsIFgxMVZOQ19USUNLRVIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgKGhlYXJ0YmVhdCBhbmQgdGltZXN0YW1wKSBpZiBkZXNpcmVkLgotCi0tYWxsb3cgaG9zdDFbLGhvc3QyLi5dIE9ubHkgYWxsb3cgY2xpZW50IGNvbm5lY3Rpb25zIGZyb20gaG9zdHMgbWF0Y2hpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGhvc3RuYW1lcyBvciBJUCBhZGRyZXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIENhbiBhbHNvIGJlIGEgbnVtZXJpY2FsIElQIHByZWZpeCwgZS5nLiAiMTkyLjE2OC4xMDAuIgotICAgICAgICAgICAgICAgICAgICAgICB0byBtYXRjaCBhIHNpbXBsZSBzdWJuZXQsIGZvciBtb3JlIGNvbnRyb2wgYnVpbGQKLSAgICAgICAgICAgICAgICAgICAgICAgTGliVk5DU2VydmVyIHdpdGggbGlid3JhcCBzdXBwb3J0IChTZWUgdGhlIEZBUSkuICBJZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBjb250YWlucyBhICIvIiBpdCBpbnN0ZWFkIGlzIGEgaW50ZXJwcmV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBmaWxlIGNvbnRhaW5pbmcgYWRkcmVzc2VzIG9yIHByZWZpeGVzIHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcmUtcmVhZCBlYWNoIHRpbWUgYSBuZXcgY2xpZW50IGNvbm5lY3RzLiAgTGluZXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRlZCBvdXQgd2l0aCB0aGUgIiMiIGNoYXJhY3RlciBpbiB0aGUgdXN1YWwgd2F5LgotCi0gICAgICAgICAgICAgICAgICAgICAgIC1hbGxvdyBhcHBsaWVzIGluIC1zc2wgbW9kZSwgYnV0IG5vdCBpbiAtc3R1bm5lbCBtb2RlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgYSBob3N0IGNhbiBiZSBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gSVB2NiBudW1lcmljYWwgZm9ybWF0LCBlLmcuIDIwMDE6NDg2MDpiMDA5Ojo5My4KLQotLWxvY2FsaG9zdCAgICAgICAgICAgICBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgIi1hbGxvdyAxMjcuMC4wLjEiLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGlmIHlvdSB3YW50IHRvIHJlc3RyaWN0IHdoaWNoIG5ldHdvcmsgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBsaXN0ZW5zIG9uLCBzZWUgdGhlIC1saXN0ZW4gb3B0aW9uIGJlbG93LgotICAgICAgICAgICAgICAgICAgICAgICBFLmcuICItbGlzdGVuIGxvY2FsaG9zdCIgb3IgIi1saXN0ZW4gMTkyLjE2OC4zLjIxIi4KLSAgICAgICAgICAgICAgICAgICAgICAgQXMgYSBzcGVjaWFsIGNhc2UsIHRoZSBvcHRpb24gIi1sb2NhbGhvc3QiIGltcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIi1saXN0ZW4gbG9jYWxob3N0Ii4KLQotICAgICAgICAgICAgICAgICAgICAgICBBIHJhcmUgY2FzZSwgYnV0IGZvciBub24tbG9jYWxob3N0IC1saXN0ZW4gdXNhZ2UsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdSB1c2UgdGhlIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSAoLVIpIHRvIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgLWxpc3RlbiBpbnRlcmZhY2UgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGFkanVzdAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgLWFsbG93IGxpc3QgKGFuZCB2aWNlIHZlcnNhKSB0byBhdm9pZCBzaXR1YXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG5vIGNvbm5lY3Rpb25zIChvciB0b28gbWFueSkgYXJlIGFsbG93ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBsaXN0ZW4gb24gQU5ZIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAgICAoZXZpZGVudGx5IHlvdSBhcmUgdXNpbmcgLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgcGxhbiB0byB1c2UgcmVtb3RlIGNvbnRyb2w6IC1SIGNvbm5lY3Q6aG9zdCksIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAtcmZicG9ydCAwCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSVB2NjogaWYgSVB2NiBpcyBzdXBwb3J0ZWQsIHRoaXMgb3B0aW9uIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyB0aGUgSVB2NiBsb29wYmFjayBhZGRyZXNzICc6OjEnIGFzIHdlbGwuCi0KLS11bml4c29jayBzdHIgICAgICAgICAgTGlzdGVuIG9uIHRoZSB1bml4IHNvY2tldCAoQUZfVU5JWCkgJ3N0cicKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbm5lY3Rpb25zLiAgVGhpcyBtb2RlIGlzIGZvciBlaXRoZXIgbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgb3IgYSB0dW5uZWwgZW5kcG9pbnQgd2hlcmUgb25lIHdhbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHBlcm1pc3Npb24gb2YgdGhlIHVuaXggc29ja2V0IGZpbGUgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgICAgIHdoYXQgY2FuIGNvbm5lY3QgdG8gaXQuICAoVGhpcyBjdXJyZW50bHkgcmVxdWlyZXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgZWRpdCB0byBsaWJ2bnNlcnZlci9yZmJzZXJ2ZXIuYzogY29tbWVudCBvdXQgbGluZXMgMzEwCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAzMTEsICdjbG9zZShzb2NrKScgYW5kICdyZXR1cm4gTlVMTCcgaW4gcmZic2VydmVyLmMKLSAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIHNldHNvY2tvcHQoKSBjYWxsLikgTm90ZSB0aGF0IHRvIGRpc2FibGUgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHRjcCBsaXN0ZW5pbmcgcG9ydHMgc3BlY2lmeSAnLXJmYnBvcnQgMCcgYW5kIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgd2l0aCB0aGlzIG1vZGUuICBFeGFtcGxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWtkaXIgfi9zOyBjaG1vZCA3MDAgfi9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC11bml4c29jayB+L3MvbXlzb2NrIC1yZmJwb3J0IDAgLi4uCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBTU1ZOQyB1bml4IHZuY3ZpZXdlciBjYW4gY29ubmVjdCB0byB1bml4IHNvY2tldHMuCi0KLS1saXN0ZW42IHN0ciAgICAgICAgICAgV2hlbiBpbiBJUHY2IGxpc3RlbiBtb2RlICItNiIsIGxpc3RlbiBvbmx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGFkZHJlc3MgInN0ciIuICBJdCBhbHNvIHdvcmtzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5rIHNjb3BlIGFkZHJlc3NlcyAoZmU4MDo6MjE5OmRiZmY6ZmVlNTozZjkyJWV0aDApCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBJUHY2IGhvc3RuYW1lIHN0cmluZ3MgKGUuZy4gaXB2Ni5nb29nbGUuY29tLikKLSAgICAgICAgICAgICAgICAgICAgICAgVXNlIExpYlZOQ1NlcnZlciAtbGlzdGVuIG9wdGlvbiBmb3IgdGhlIElQdjQgaW50ZXJmYWNlLgotCi0tbm9sb29rdXAgICAgICAgICAgICAgIERvIG5vdCB1c2UgZ2V0aG9zdGJ5bmFtZSgpIG9yIGdldGhvc3RieWFkZHIoKSB0byBsb29rIHVwCi0gICAgICAgICAgICAgICAgICAgICAgIGhvc3QgbmFtZXMgb3IgSVAgbnVtYmVycy4gIFVzZSB0aGlzIGlmIG5hbWUgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgICAgICBpcyBpbmNvcnJlY3RseSBzZXQgdXAgYW5kIGxlYWRzIHRvIGxvbmcgcGF1c2VzIGFzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwcyB0aW1lIG91dCwgZXRjLgotCi0taW5wdXQgc3RyaW5nICAgICAgICAgIEZpbmUgdHVuaW5nIG9mIGFsbG93ZWQgdXNlciBpbnB1dC4gIElmICJzdHJpbmciIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnRhaW4gYSBjb21tYSAiLCIgdGhlIHR1bmluZyBhcHBsaWVzIG9ubHkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIGNsaWVudHMuICBPdGhlcndpc2UgdGhlIHBhcnQgYmVmb3JlICIsIiBpcwotICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm9ybWFsIGNsaWVudHMgYW5kIHRoZSBwYXJ0IGFmdGVyIGZvciB2aWV3LW9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy4gICJLIiBpcyBmb3IgS2V5c3Ryb2tlIGlucHV0LCAiTSIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIE1vdXNlLW1vdGlvbiBpbnB1dCwgIkIiIGZvciBCdXR0b24tY2xpY2sgaW5wdXQsICJDIgotICAgICAgICAgICAgICAgICAgICAgICBpcyBmb3IgQ2xpcGJvYXJkIGlucHV0LCBhbmQgIkYiIGlzIGZvciBGaWxlIHRyYW5zZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICh1bHRyYXZuYyBvbmx5KS4gIFRoZWlyIHByZXNlbmNlIGluIHRoZSBzdHJpbmcgZW5hYmxlcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHR5cGUgb2YgaW5wdXQuICBFLmcuICItaW5wdXQgTSIgbWVhbnMgbm9ybWFsCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXJzIGNhbiBvbmx5IG1vdmUgdGhlIG1vdXNlIGFuZCAgIi1pbnB1dCBLTUJDRixNIgotICAgICAgICAgICAgICAgICAgICAgICBsZXRzIG5vcm1hbCB1c2VycyBkbyBhbnl0aGluZyBhbmQgZW5hYmxlcyB2aWV3LW9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcnMgdG8gbW92ZSB0aGUgbW91c2UuICBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgYSBnbG9iYWwgLXZpZXdvbmx5IGlzIGluIGVmZmVjdCAoYWxsIGlucHV0IGlzIGRpc2NhcmRlZAotICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IGNhc2UpLgotCi0tZ3JhYmtiZCAgICAgICAgICAgICAgIFdoZW4gVk5DIHZpZXdlcnMgYXJlIGNvbm5lY3RlZCwgYXR0ZW1wdCB0byB0aGUgZ3JhYgotICAgICAgICAgICAgICAgICAgICAgICB0aGUga2V5Ym9hcmQgc28gYSAobm9uLW1hbGljaW91cykgdXNlciBzaXR0aW5nIGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBkaXNwbGF5IGlzIG5vdCBhYmxlIHRvIGVudGVyIGtleXN0cm9rZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgWEdyYWJLZXlib2FyZCgzWDExKSBhbmQgc28gaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlY3VyZSBhbmQgZG9lcyBub3QgcnVsZSBvdXQgdGhlIHBlcnNvbiBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgZGlzcGxheSBpbmplY3Rpbmcga2V5c3Ryb2tlcyBieSBmbG9vZGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIHdpdGggdGhlbSwgZ3JhYmJpbmcgdGhlIGtleWJvYXJkIGhpbXNlbGYsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgU29tZSBkZWdyZWUgb2YgY29vcGVyYXRpb24gZnJvbSB0aGUgcGVyc29uIGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IGlzIGFzc3VtZWQuICBUaGlzIGlzIGludGVuZGVkIGZvciByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscC1kZXNrIG9yIGVkdWNhdGlvbmFsIHVzYWdlIG1vZGVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IG9uIHNvbWUgcmVjZW50ICgxMi8yMDEwKSBYIHNlcnZlcnMgYW5kL29yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2t0b3BzLCAtZ3JhYmtiZCBubyBsb25nZXIgd29ya3M6IGl0IHByZXZlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlciBmcm9tIHJlc2l6aW5nIHdpbmRvd3MgYW5kIHNpbWlsYXIgdGhpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICBUcnkgLXVuZ3JhYmJvdGggYmVsb3cgKG1pZ2h0IG5vdCB3b3JrLikKLQotLWdyYWJwdHIgICAgICAgICAgICAgICBBcyAtZ3JhYmtiZCwgYnV0IGZvciB0aGUgbW91c2UgcG9pbnRlciB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICBYR3JhYlBvaW50ZXIoM1gxMSkuICBVbmZvcnR1bmF0ZWx5IGR1ZSB0byB0aGUgd2F5IHRoZSBYCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB3b3JrcywgdGhlIG1vdXNlIGNhbiBzdGlsbCBiZSBtb3ZlZCBhcm91bmQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXksIGJ1dCBoZSB3aWxsIG5vdCBiZSBhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSB3aW5kb3cgZm9jdXMgd2l0aCBpdC4gIEFsc28gc29tZSB3aW5kb3cgbWFuYWdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYWxsIFhHcmFiU2VydmVyKDNYMTEpIGZvciByZXNpemVzLCBldGMsIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0IG9uIHRoZSBsb2NhbCB1c2VyJ3MgaW5wdXQuICBBZ2Fpbiwgc29tZSBkZWdyZWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpb24gZnJvbSB0aGUgcGVyc29uIGF0IHRoZSBkaXNwbGF5IGlzIGFzc3VtZWQuCi0KLS11bmdyYWJib3RoICAgICAgICAgICAgV2hlbmV2ZXIgdGhlcmUgaXMgYW55IGlucHV0IChlaXRoZXIga2V5Ym9hcmQgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciksIHVuZ3JhYiAqYm90aCogdGhlIGtleWJvYXJkIGFuZCB0aGUgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBpbmplY3RpbmcgdGhlIHN5bnRoZXRpYyBpbnB1dC4gIFRoaXMgaXMgdG8gYWxsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IG1hbmFnZXJzLCBldGMuIGEgY2hhbmNlIHRvIGdyYWIuCi0KLS1ncmFiYWx3YXlzICAgICAgICAgICAgQXBwbHkgYm90aCAtZ3JhYmtiZCBhbmQgLWdyYWJwdHIgZXZlbiB3aGVuIG5vIFZOQwotICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXJzIGFyZSBjb25uZWN0ZWQuICBJZiB5b3Ugb25seSB3YW50IG9uZSBvZiB0aGVtLAotICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIC1SIHJlbW90ZSBjb250cm9sIHRvIHR1cm4gdGhlIG90aGVyIGJhY2sgb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gLVIgbm9ncmFicHRyLgotCi0tdmlld3Bhc3N3ZCBzdHJpbmcgICAgIFN1cHBseSBhIDJuZCBwYXNzd29yZCBmb3Igdmlldy1vbmx5IGxvZ2lucy4gIFRoZSAtcGFzc3dkCi0gICAgICAgICAgICAgICAgICAgICAgIChmdWxsLWFjY2VzcykgcGFzc3dvcmQgbXVzdCBhbHNvIGJlIHN1cHBsaWVkLgotCi0tcGFzc3dkZmlsZSBmaWxlbmFtZSAgIFNwZWNpZnkgdGhlIExpYlZOQ1NlcnZlciBwYXNzd29yZCB2aWEgdGhlIGZpcnN0IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUgImZpbGVuYW1lIiAoaW5zdGVhZCBvZiB2aWEgLXBhc3N3ZCBvbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIG90aGVycyBtaWdodCBzZWUgaXQgdmlhIHBzKDEpKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIGRlc2NyaXB0aW9ucyBiZWxvdyBmb3IgaG93IHRvIHN1cHBseSBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZHMsIHZpZXctb25seSBwYXNzd29yZHMsIHRvIHNwZWNpZnkgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbXMgZm9yIHRoZSBhdXRoZW50aWNhdGlvbiwgYW5kIG90aGVyIGZlYXR1cmVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJybToiIGl0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBhZnRlciBiZWluZyByZWFkLiAgUGVyaGFwcyB0aGlzIGlzIHVzZWZ1bCBpbgotICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGluZyB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGZpbGUuICBJbiBnZW5lcmFsLCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgZmlsZSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIGJ5IHVudHJ1c3RlZCB1c2VycwotICAgICAgICAgICAgICAgICAgICAgICAoQlRXOiBuZWl0aGVyIHNob3VsZCB0aGUgVk5DIC1yZmJhdXRoIGZpbGU6IGl0IGlzIE5PVAotICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQsIG9ubHkgb2JzY3VyZWQgd2l0aCBhIGZpeGVkIGtleSkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpbGVuYW1lIGlzIHByZWZpeGVkIHdpdGggInJlYWQ6IiBpdCB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSBiZSBjaGVja2VkIGZvciBjaGFuZ2VzIGFuZCByZXJlYWQuICBJdCBpcwotICAgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlIHJlcmVhZCBqdXN0IHdoZW4gYSBuZXcgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGxhdGVzdCBwYXNzd29yZHMgd2lsbCBiZSB1c2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmICJmaWxlbmFtZSIgaXMgcHJlZml4ZWQgd2l0aCAiY21kOiIgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFmdGVyIHRoZSAiOiIgaXMgcnVuIGFzIGFuIGV4dGVybmFsIGNvbW1hbmQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBpZiBpdAotICAgICAgICAgICAgICAgICAgICAgICB3ZXJlIHJlYWQgZnJvbSBhIHBhc3N3b3JkIGZpbGUgKHNlZSBiZWxvdykuICBJZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBkb2VzIG5vdCBleGl0IHdpdGggMCwgdGhlbiB4MTF2bmMgdGVybWluYXRlcwotICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGVseS4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIDEwMDAgcGFzc3dvcmRzIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgd2F5IHNldCBYMTFWTkNfTUFYX1BBU1NXRFMgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYy4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IGFzIGluIC1hY2NlcHQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGR1ZSB0byB0aGUgVk5DIHByb3RvY29sIG9ubHkgdGhlIGZpcnN0IDgKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBhIHBhc3N3b3JkIGFyZSB1c2VkIChERVMga2V5KS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiAiZmlsZW5hbWUiIGlzIHByZWZpeGVkIHdpdGggImN1c3RvbToiIHRoZW4gYQotICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gcGFzc3dvcmQgY2hlY2tlciBpcyBzdXBwbGllZCBhcyBhbiBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZvbGxvd2luZyB0aGUgIjoiLiBUaGUgY29tbWFuZCB3aWxsIGJlIHJ1bgotICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgY2xpZW50IGF1dGhlbnRpY2F0ZXMuICBJZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIDAgdGhlIGNsaWVudCBpcyBhY2NlcHRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlamVjdGVkLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gLWFjY2VwdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGN1c3RvbSBjb21tYW5kIHdpbGwgYmUgYQotICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsIGRpZ2l0ICJsZW4iIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4gImxlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBjaGFsbGVuZ2Ugc2l6ZSBhbmQgaXMgdXN1YWxseSAxNiAodGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFZOQyBzcGVjKS4gIFRoZW4gZm9sbG93cyBsZW4gYnl0ZXMgd2hpY2ggaXMgdGhlIHJhbmRvbQotICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2Ugc3RyaW5nIHRoYXQgd2FzIHNlbnQgdG8gdGhlIGNsaWVudC4gVGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGZvbGxvd2VkIGJ5IGxlbiBtb3JlIGJ5dGVzIGhvbGRpbmcgdGhlIGNsaWVudCdzCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIChpLmUuIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIGVuY3J5cHRlZCB2aWEgREVTCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHVzZXIgcGFzc3dvcmQgaW4gdGhlIHN0YW5kYXJkIHNpdHVhdGlvbikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjdXN0b206IiBzY2hlbWUgY2FuIGJlIHVzZWZ1bCB0byBpbXBsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBwYXNzd29yZHMgb3IgdG8gaW1wbGVtZW50IG1ldGhvZHMgd2hlcmUgbG9uZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkcyBhbmQvb3IgZGlmZmVyZW50IGVuY3J5cHRpb24gYWxnb3JpdGhtcwotICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZC4gIFRoZSBsYXR0ZXIgd2lsbCByZXF1aXJlIGN1c3RvbWl6aW5nIHRoZSBWTkMKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IGFzIHdlbGwuICBPbmUgY291bGQgY3JlYXRlIGFuIE1ENVNVTSBiYXNlZCBzY2hlbWUKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmb3JtYXQgZm9yIC1wYXNzd2RmaWxlOgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIG11bHRpcGxlIG5vbi1ibGFuayBsaW5lcyBleGlzdCBpbiB0aGUgZmlsZSB0aGV5IGFyZQotICAgICAgICAgICAgICAgICAgICAgICBhbGwgdGFrZW4gYXMgdmFsaWQgcGFzc3dvcmRzLiAgQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkIGxpbmVzIG1heSBiZSAiY29tbWVudGVkIG91dCIgKGlnbm9yZWQpIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXkgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICIjIiBvciB0aGUgbGluZSBjb250YWlucwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyaW5nICJfX1NLSVBfXyIuICBMaW5lcyBtYXkgYmUgYW5ub3RhdGVkIGJ5IHVzZQotICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgIl9fQ09NTV9fIiBzdHJpbmc6IGZyb20gaXQgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZSBpcyBpZ25vcmVkLiAgQW4gZW1wdHkgcGFzc3dvcmQgbWF5IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICAgICB2aWEgdGhlICJfX0VNUFRZX18iIHN0cmluZyBvbiBhIGxpbmUgYnkgaXRzZWxmIChub3RlCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdXIgdmlld2VyIG1pZ2h0IG5vdCBhY2NlcHQgZW1wdHkgcGFzc3dvcmRzKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3RyaW5nICJfX0JFR0lOX1ZJRVdPTkxZX18iIGFwcGVhcnMgb24gYQotICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGJ5IGl0c2VsZiwgdGhlIHJlbWFpbmluZyBwYXNzd29yZHMgYXJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdvbmx5IGFjY2Vzcy4gIEZvciBjb21wYXRpYmlsaXR5LCBhcyBhIHNwZWNpYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZSBjb250YWlucyBvbmx5IHR3byBwYXNzd29yZCBsaW5lcyB0aGUgMm5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9uZSBpcyBhdXRvbWF0aWNhbGx5IHRha2VuIGFzIHRoZSB2aWV3b25seSBwYXNzd29yZC4KLSAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIHRoZSAiX19CRUdJTl9WSUVXT05MWV9fIiB0b2tlbiBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gaGF2ZSB2aWV3b25seSBwYXNzd29yZHMuICAodGlwOiBtYWtlIHRoZSAzcmQKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxhc3QgbGluZSBiZSAiX19CRUdJTl9WSUVXT05MWV9fIiB0byBoYXZlIDIKLSAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1hY2Nlc3MgcGFzc3dvcmRzKQotCi0tc2hvd3JmYmF1dGggZmlsZW5hbWUgIFByaW50IHRvIHRoZSBzY3JlZW4gdGhlIG9ic2N1cmVkIFZOQyBwYXNzd29yZCBrZXB0IGluCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByZmJhdXRoIGZpbGUgImZpbGVuYW1lIiBhbmQgdGhlbiBleGl0LgotCi0tdW5peHB3IFtsaXN0XSAgICAgICAgIFVzZSBVbml4IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHVzZSB0aGUgc3UoMSkgcHJvZ3JhbSB0byB2ZXJpZnkgdGhlIHVzZXIncwotICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZC4gIFtsaXN0XSBpcyBhbiBvcHRpb25hbCBjb21tYSBzZXBhcmF0ZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGxvd2VkIFVuaXggdXNlcm5hbWVzLiAgSWYgdGhlIFtsaXN0XSBzdHJpbmcgYmVnaW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGNoYXJhY3RlciAiISIgdGhlbiB0aGUgZW50aXJlIGxpc3QgaXMgdGFrZW4KLSAgICAgICAgICAgICAgICAgICAgICAgYXMgYW4gZXhjbHVkZSBsaXN0LiAgU2VlIGJlbG93IGZvciBwZXItdXNlciBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGFwcGxpZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQSBmYW1pbGlhciAibG9naW46IiBhbmQgIlBhc3N3b3JkOiIgZGlhbG9nIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRlZCB0byB0aGUgdXNlciBvbiBhIGJsYWNrIHNjcmVlbiBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHZuY3ZpZXdlci4gIFRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgaWYgdGhlIHVzZXIgZmFpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcGx5IHRoZSBjb3JyZWN0IHBhc3N3b3JkIGluIDMgdHJpZXMgb3IgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc2VuZCBvbmUgYmVmb3JlIGEgNDUgc2Vjb25kIHRpbWVvdXQuICBFeGlzdGluZyBjbGllbnRzCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZSB2aWV3LW9ubHkgZHVyaW5nIHRoaXMgcGVyaW9kLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcmVjZWl2ZWQgaXMgIkVzY2FwZSIgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdW5peCB1c2VybmFtZSB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQgYWZ0ZXIgImxvZ2luOiIKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgaXQgaXMgdHlwZWQuICBUaGlzIGNvdWxkIGJlIG9mIHVzZSBmb3IgVk5DIHZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhdXRvbWF0aWNhbGx5IHR5cGUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgZGV0YWlsZWQgYmVoYXZpb3Igb2Ygc3UoMSkgY2FuIHZhcnkgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICBPUyB0byBPUyBhbmQgZm9yIGxvY2FsIGNvbmZpZ3VyYXRpb25zLCB0ZXN0IHRoZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBkZXBsb3ltZW50IHRvIG1ha2Ugc3VyZSBpdCBpcyB3b3JraW5nIHByb3Blcmx5LgotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2lsbCBhdHRlbXB0IHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgcmVqZWN0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgbG9naW4gaWYgYW55dGhpbmcgYWJub3JtYWwgb2NjdXJzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYXNlIHRvIG5vdGU6IEZyZWVCU0QgYW5kIHRoZSBvdGhlciBCU0QncyBieQotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGl0IGlzIGltcG9zc2libGUgZm9yIHRoZSB1c2VyIHJ1bm5pbmcgeDExdm5jIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlIGhpcyAqb3duKiBwYXNzd29yZCB2aWEgc3UoMSkgKGNvbW1lbnRpbmcgb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYW1fc2VsZi5zbyBlbnRyeSBpbiAvZXRjL3BhbS5kL3N1IGVsaW1pbmF0ZXMgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcikuICBTbyB0aGUgeDExdm5jIGxvZ2luIHdpbGwgYWx3YXlzICpGQUlMKiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlIChldmVuIHdoZW4gdGhlIGNvcnJlY3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEEgcG9zc2libGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBvbiAqQlNEIHdvdWxkIGJlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHgxMXZuYyBhcyByb290IHdpdGggdGhlICItdXNlcnMgK25vYm9keSIgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGltbWVkaWF0ZWx5IHN3aXRjaCB0byB1c2VyIG5vYm9keSB3aGVyZSB0aGUgc3UnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcHJvY2VlZCBub3JtYWxseS4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIHNvdXJjZSBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIFBBTSBtb2R1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcHJvbXB0IGZvciBleHRyYSBpbmZvLCBlLmcuIHBhc3N3b3JkIGFnaW5nIG1vZHVsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGxvZ2lucyB3aWxsIGZhaWwgYXMgd2VsbCBldmVuIHdoZW4gdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgaXMgc3VwcGxpZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgKipJTVBPUlRBTlQqKjogdG8gcHJldmVudCB0aGUgVW5peCBwYXNzd29yZCBiZWluZyBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGluICpjbGVhciB0ZXh0KiBvdmVyIHRoZSBuZXR3b3JrLCBvbmUgb2YgdHdvIHNjaGVtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlbmZvcmNlZDogMSkgdGhlIC1zc2wgYnVpbHRpbiBTU0wgbW9kZSwgb3IgMikKLSAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSBib3RoIC1sb2NhbGhvc3QgYW5kIC1zdHVubmVsIGJlIGVuYWJsZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIDEpIGVuc3VyZXMgdGhlIHRyYWZmaWMgaXMgZW5jcnlwdGVkIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgdmlld2VyIGFuZCBzZXJ2ZXIuICBBIFBFTSBmaWxlIHdpbGwgYmUgcmVxdWlyZWQsIHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc2lvbiB1bmRlciAtc3NsIGJlbG93ICh1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgYSB0ZW1wb3Jhcnkgb25lIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIDIpIHJlcXVpcmVzIHRoZSB2aWV3ZXIgY29ubmVjdGlvbiB0byBhcHBlYXIKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gY29tZSBmcm9tIHRoZSBzYW1lIG1hY2hpbmUgeDExdm5jIGlzIHJ1bm5pbmcgb24KLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZnJvbSBhIHNzaCAtTCBwb3J0IHJlZGlyZWN0aW9uKS4gIEFuZCB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCBTU0wgbW9kZSBiZSB1c2VkIGZvciBlbmNyeXB0aW9uIG92ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsuIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIC1zdHVubmVsIGJlbG93KS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBhcyBhIGNvbnZlbmllbmNlLCBpZiB5b3Ugc3NoKDEpIGluIGFuZCBzdGFydAotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaXQgd2lsbCBjaGVjayBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgU1NIX0NPTk5FQ1RJT04gaXMgc2V0IGFuZCBhcHBlYXJzIHJlYXNvbmFibGUuICBJZiBpdAotICAgICAgICAgICAgICAgICAgICAgICBkb2VzLCB0aGVuIHRoZSAtc3NsIG9yIC1zdHVubmVsIHJlcXVpcmVtZW50IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCBzaW5jZSBpdCBpcyBhc3N1bWVkIHlvdSBhcmUgdXNpbmcgc3NoIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIHR1bm5lbGxpbmcuICAtbG9jYWxob3N0IGlzIHN0aWxsIGVuZm9yY2VkLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgLXNzbCBvciAtc3R1bm5lbCB0byBmb3JjZSBTU0wgdXNhZ2UgZXZlbiBpZgotICAgICAgICAgICAgICAgICAgICAgICBTU0hfQ09OTkVDVElPTiBpcyBzZXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gb3ZlcnJpZGUgdGhlIGFib3ZlIHJlc3RyaWN0aW9ucyB5b3UgY2FuIHNldAotICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYzoKLQotICAgICAgICAgICAgICAgICAgICAgICBTZXQgVU5JWFBXX0RJU0FCTEVfU1NMPTEgdG8gZGlzYWJsZSByZXF1aXJpbmcgZWl0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgIC1zc2wgb3IgLXN0dW5uZWwgKGFzIHVuZGVyIFNTSF9DT05ORUNUSU9OLikgIEV2aWRlbnRseQotICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2lsbCBiZSB1c2luZyBhIGRpZmZlcmVudCBtZXRob2QgdG8gZW5jcnlwdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBiZXR3ZWVuIHRoZSB2bmN2aWV3ZXIgYW5kIHgxMXZuYzogcGVyaGFwcyBzc2goMSkKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gSVBTRUMgVlBOLiAtbG9jYWxob3N0IGlzIHN0aWxsIGVuZm9yY2VkIChob3dldmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlIG5leHQgcGFyYWdyYXBoLikKLQotICAgICAgICAgICAgICAgICAgICAgICBTZXQgVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUPTEgdG8gZGlzYWJsZSB0aGUgLWxvY2FsaG9zdAotICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudCBpbiAtdW5peHB3IG1vZGVzLiAgT25lIHNob3VsZCBuZXZlciBkbyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGFsbG93IHRoZSBVbml4IHBhc3N3b3JkcyB0byBiZSBzbmlmZmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLikgIFRoaXMgYWxzbyBkaXNhYmxlcyB0aGUgbG9jYWxob3N0IHJlcXVpcmVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zIChzZWUgYmVsb3cuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB1c2Ugb2YgLWxvY2FsaG9zdCB3aXRoIHNzaCgxKSAoYW5kIG5vIC11bml4cHcpCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHJvdWdobHkgdGhlIHNhbWUgYXMgcmVxdWlyaW5nIGEgVW5peCB1c2VyIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgICAgIChzaW5jZSBhIFVuaXggcGFzc3dvcmQgb3IgdGhlIHVzZXIncyBwdWJsaWMga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgYnkgc3NoZCBvbiB0aGUgbWFjaGluZSB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgcnVucyBhbmQgb25seSBsb2NhbCBjb25uZWN0aW9ucyBmcm9tIHRoYXQgbWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgICBhcmUgYWNjZXB0ZWQpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFJlZ2FyZGluZyByZXZlcnNlIGNvbm5lY3Rpb25zIChlLmcuIC1SIGNvbm5lY3Q6aG9zdAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWNvbm5lY3QgaG9zdCksIHdoZW4gdGhlIC1sb2NhbGhvc3QgY29uc3RyYWludCBpcwotICAgICAgICAgICAgICAgICAgICAgICBpbiBlZmZlY3QgdGhlbiByZXZlcnNlIGNvbm5lY3Rpb25zIGNhbiBvbmx5IGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBtYWNoaW5lIHgxMXZuYyBpcyBydW5uaW5nIG9uCi0gICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHBvcnQgNTUwMCkuICBQbGVhc2UgdXNlIGEgc3NoIG9yIHN0dW5uZWwgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGlvbiB0byB0aGUgdmlld2VyIG1hY2hpbmUgdG8gdHVubmVsIHRoZSByZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gb3ZlciBhbiBlbmNyeXB0ZWQgY2hhbm5lbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBJbiAtaW5ldGQgbW9kZSB0aGUgTWV0aG9kIDEpIHdpbGwgYmUgZW5mb3JjZWQgKG5vdAotICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgMikuICBXaXRoIC1zc2wgaW4gZWZmZWN0IHJldmVyc2UgY29ubmVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIGRpc2FibGVkLiAgSWYgeW91IG92ZXJyaWRlIHRoaXMgdmlhIGVudi4gdmFyLCBiZQotICAgICAgICAgICAgICAgICAgICAgICBzdXJlIHRvIGFsc28gdXNlIGVuY3J5cHRpb24gZnJvbSB0aGUgdmlld2VyIHRvIGluZXRkLgotICAgICAgICAgICAgICAgICAgICAgICBUaXA6IHlvdSBjYW4gYWxzbyBoYXZlIHlvdXIgb3duIHN0dW5uZWwgc3Bhd24geDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIGluIC1pbmV0ZCBtb2RlICh0aGVyZWJ5IGJ5cGFzc2luZyBpbmV0ZCkuICBTZWUgdGhlIEZBUQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlscy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciBuYW1lcyBpbiB0aGUgY29tbWEgc2VwYXJhdGVkIFtsaXN0XSBtYXkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICBwZXItdXNlciBvcHRpb25zIGFmdGVyIGEgIjoiLCBlLmcuICJmcmVkOm9wdHMiCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZXJlICJvcHRzIiBpcyBhICIrIiBzZXBhcmF0ZWQgbGlzdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAidmlld29ubHkiLCAiZnVsbGFjY2VzcyIsICJpbnB1dD1YWFhYIiwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgImRlbnkiLCBlLmcuICJrYXJsLHdhbGx5OnZpZXdvbmx5LGJvc3M6aW5wdXQ9TSIuCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciAiaW5wdXQ9IiBpdCBpcyB0aGUgSyxNLEIsQyBkZXNjcmliZWQgdW5kZXIgLWlucHV0LgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGFuIGl0ZW0gaW4gdGhlIGxpc3QgaXMgIioiIHRoYXQgbWVhbnMgdGhvc2UKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBhcHBseSB0byBhbGwgdXNlcnMuICBJdCBBTFNPIGltcGxpZXMgYWxsIHVzZXJzCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZSBhbGxvd2VkIHRvIGxvZyBpbiBhZnRlciBzdXBwbHlpbmcgYSB2YWxpZCBwYXNzd29yZC4KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlICJkZW55IiB0byBleHBsaWNpdGx5IGRlbnkgc29tZSB1c2VycyBpZiB5b3UgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICIqIiB0byBzZXQgYSBnbG9iYWwgb3B0aW9uLiAgSWYgW2xpc3RdIGJlZ2lucyB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAiISIgY2hhcmFjdGVyIHRoZW4gIioiIGlzIGlnbm9yZWQgZm9yIGNoZWNraW5nIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGlzIGFsbG93ZWQsIGJ1dCB0aGUgb3B0aW9uIHZhbHVlcyBhc3NvY2lhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggaXQgZG8gYXBwbHkgYXMgbm9ybWFsLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgdXRpbGl0aWVzIGZvciBjaGVja2luZyBwYXNzd29yZHMKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgW2xpc3RdIHN0YXJ0cyB3aXRoIHRoZSAiJSIgY2hhcmFjdGVyLiAgU2VlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBxdWlja19wdygpIGZ1bmN0aW9uIGZvciBtb3JlIGRldGFpbHMuICBEZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIiUtIiBvciAiJXN0ZGluIiBtZWFucyByZWFkIG9uZSBsaW5lIGZyb20gc3RkaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICIlZW52IiBtZWFucyBpdCBpcyBpbiAkVU5JWFBXIGVudiB2YXIuICBBIGxlYWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIiUvIiBvciAiJS4iIG1lYW5zIHJlYWQgdGhlIGZpcnN0IGxpbmUgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgdGhhdCBmb2xsb3dzIGFmdGVyIHRoZSAlIGNoYXJhY3Rlci4gJSBieQotICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYgbWVhbnMgcHJvbXB0IGZvciB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgotICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2U6ICV1c2VyOnBhc3MgICBFLmcuIC11bml4cHcgJWZyZWQ6c3dvcmRmaXNoCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgY2FzZXMgdXNlcjpwYXNzIGlzIHJlYWQgZnJvbSB0aGUgaW5kaWNhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS4gIElmIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0ICdZIHVzZXInIGlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBwcm9ncmFtIGV4aXQgY29kZSBpcyAwLiAgSWYgdGhlIHBhc3N3b3JkIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdCBpdCBwcmludHMgJ04gdXNlcicgYW5kIHRoZSBleGl0IGNvZGUgaXMgMS4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgc29tZSBvdGhlciBlcnJvciB0aGUgZXhpdCBjb2RlIGlzIDIuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHgxMXZuYyB0byBiZSBhIGdlbmVyYWwgdW5peCB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIGNoZWNraW5nIHRvb2w7IGl0IGNvdWxkIGJlIHVzZWQgZnJvbSBzY3JpcHRzCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIG90aGVyIHByb2dyYW1zLiAgVGhlc2UgJSBwYXNzd29yZCBjaGVja3MgYWxzbyBhcHBseQotICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgLXVuaXhwd19uaXMgYW5kIC11bml4cHdfY21kIG9wdGlvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSAlIHBhc3N3b3JkIGNoZWNrLCBpZiB0aGUgZW52LiB2YXIuIFVOSVhQV19DTUQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIGEgY29tbWFuZCB0aGVuIGl0IGlzIHJ1biBhcyB0aGUgdXNlciAoYXNzdW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QuKSAgVGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICBub3QgcHJpbnRlZCwgdGhlIHByb2dyYW0gb3Igc2NyaXB0IG11c3QgbWFuYWdlIHRoYXQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgc29tZSBvdGhlciBtZWFucy4gIFRoZSBleGl0IGNvZGUgb2YgeDExdm5jIHdpbGwgZGVwZW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQgdGhhdCBpcyBydW4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1ub3VuaXhwdyB0byBkaXNhYmxlIHVuaXhwdyBtb2RlIGlmIGl0IHdhcyBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgIGVhcmxpZXIgaW4gdGhlIGNtZCBsaW5lIChlLmcuIC1zdmMgbW9kZSkKLQotLXVuaXhwd19uaXMgW2xpc3RdICAgICBBcyAtdW5peHB3IGFib3ZlLCBob3dldmVyIGRvIG5vdCB1c2Ugc3UoMSkgYnV0IHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIHRyYWRpdGlvbmFsIGdldHB3bmFtKDMpICsgY3J5cHQoMykgbWV0aG9kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeSBwYXNzd29yZHMuIEFsbCBvZiB0aGUgYWJvdmUgLXVuaXhwdyBvcHRpb25zIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyBhcHBseS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgcmVxdWlyZXMgdGhhdCB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcyBiZQotICAgICAgICAgICAgICAgICAgICAgICByZWFkYWJsZS4gIEVuY3J5cHRlZCBwYXNzd29yZHMgc3RvcmVkIGluIC9ldGMvc2hhZG93Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5hY2Nlc3NpYmxlIHVubGVzcyB4MTF2bmMgaXMgcnVuIGFzIHJvb3QuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgIk5JUyIgbW9kZSBzaW1wbHkgYmVjYXVzZSBpbiBtb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgIE5JUyBzZXR1cHMgdXNlciBlbmNyeXB0ZWQgcGFzc3dvcmRzIGFyZSBhY2Nlc3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgIChlLmcuICJ5cGNhdCBwYXNzd2QiKSBieSBhbiBvcmRpbmFyeSB1c2VyIGFuZCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgY2FuIGF1dGhlbnRpY2F0ZSBBTlkgdXNlci4KLQotICAgICAgICAgICAgICAgICAgICAgICBOSVMgaXMgbm90IHJlcXVpcmVkIGZvciB0aGlzIG1vZGUgdG8gd29yayAob25seSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIGdldHB3bmFtKDMpIHJldHVybiB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkIGlzIHJlcXVpcmVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGlzIHVubGlrZWx5IGl0IHdpbGwgd29yayAoYXMgYW4gb3JkaW5hcnkgdXNlcikKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3QgbW9kZXJuIGVudmlyb25tZW50cyB1bmxlc3MgTklTIGlzIGF2YWlsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geDExdm5jIGlzIHJ1biBhcyByb290IGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgYWJsZSB0byB0byBhY2Nlc3MgL2V0Yy9zaGFkb3cgZXZlbiBpZiBOSVMgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAobm90ZSBydW5uaW5nIGFzIHJvb3QgaXMgb2Z0ZW4gZG9uZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgeDExdm5jIGZyb20gaW5ldGQgYW5kIHhkbS9nZG0va2RtKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBMb29rZWQgYXQgYW5vdGhlciB3YXksIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1KDEpIG1ldGhvZCBwcm92aWRlZCBieSAtdW5peHB3IChpLmUuIHN1X3ZlcmlmeSgpKSwgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBydW4geDExdm5jIGFzIHJvb3QgYW5kIHVzZSAtdW5peHB3X25pcy4gIEFueSB1c2VycwotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBhc3N3b3JkcyBpbiAvZXRjL3NoYWRvdyBjYW4gdGhlbiBiZSBhdXRoZW50aWNhdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIC11bml4cHdfbmlzIG1vZGUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgaXMgeDExdm5jJ3MKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlciBwYXNzd29yZCB2ZXJpZnlpbmcgZnVuY3Rpb24gYmFzZWQgb24gc3UgY2FsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBmdW5jdGlvbiBzdV92ZXJpZnkoKSB0aGF0IHJ1bnMgL2Jpbi9zdQotICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHBzZXVkb3Rlcm1pbmFsIHRvIHZlcmlmeSBwYXNzd29yZHMuKSAgSG93ZXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgLXVuaXhwd19uaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAtZmluZAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWNyZWF0ZSAtZGlzcGxheSBXQUlUOi4uLiBtb2RlcyB0aGVuLCBpZiB4MTF2bmMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhcyByb290LCAvYmluL3N1IG1heSBiZSBjYWxsZWQgZXh0ZXJuYWxseSB0bwotICAgICAgICAgICAgICAgICAgICAgICBydW4gdGhlIGZpbmQgb3IgY3JlYXRlIGNvbW1hbmRzLgotCi0tdW5peHB3X2NtZCBjbWQgICAgICAgIEFzIC11bml4cHcgYWJvdmUsIGhvd2V2ZXIgZG8gbm90IHVzZSBzdSgxKSBidXQgcmF0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHJ1biB0aGUgZXh0ZXJuYWxseSBzdXBwbGllZCBjb21tYW5kICJjbWQiLiAgVGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbmUgb2YgaXRzIHN0ZGluIHdpbGwgYmUgdGhlIHVzZXJuYW1lIGFuZCB0aGUgc2Vjb25kCi0gICAgICAgICAgICAgICAgICAgICAgIGxpbmUgdGhlIHJlY2VpdmVkIHBhc3N3b3JkLiAgSWYgdGhlIGNvbW1hbmQgZXhpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzdGF0dXMgMCAoc3VjY2VzcykgdGhlIFZOQyB1c2VyIHdpbGwgYmUgYWNjZXB0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgcmVqZWN0ZWQgZm9yIGFueSBvdGhlciByZXR1cm4gc3RhdHVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWMgcGFzc3dvcmRzIGFuZCBub24tdW5peCBwYXNzd29yZHMsIGUuZy4gTERBUCwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGltcGxlbWVudGVkIHRoaXMgd2F5IGJ5IHByb3ZpZGluZyB5b3VyIG93biBjdXN0b20KLSAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIHJlbW90ZSB2aWV3ZXIgaXMgZ2l2ZW4gMwotICAgICAgICAgICAgICAgICAgICAgICB0cmllcyB0byBlbnRlciB0aGUgY29ycmVjdCBwYXNzd29yZCwgYW5kIHNvIHRoZSBwcm9ncmFtCi0gICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjYWxsZWQgaW4gYSByb3cgdGhhdCBtYW55IChvciBtb3JlKSB0aW1lcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBhIGxpc3Qgb2YgYWxsb3dlZCB1c2VycyBpcyBuZWVkZWQgdG8gbGltaXQgd2hvIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBsb2cgaW4sIHVzZSAtdW5peHB3IFtsaXN0XSBpbiBhZGRpdGlvbiB0byB0aGlzIG9wdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBJbiBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbW9kZXMgdGhlICJjbWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYWxzbyBiZSBydW4gd2l0aCB0aGUgUkZCX1VOSVhQV19DTURfUlVOIGVudi4gdmFyLgotICAgICAgICAgICAgICAgICAgICAgICBub24tZW1wdHkgYW5kIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpbmQvY3JlYXRlIGNvbW1hbmQuICBUaGUgZmlyc3QgdHdvIGxpbmVzIG9mIGlucHV0IGFyZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3ZCBhcyBpbiB0aGUgbm9ybWFsIGNhc2UgZGVzY3JpYmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLiAgVG8gc3VwcG9ydCBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICJjbWQiIHNob3VsZCBydW4gdGhlIHJlcXVlc3RlZCBjb21tYW5kIGFzIHRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgIChhbmQgbW9zdCBsaWtlbHkgcmVmdXNpbmcgdG8gcnVuIGl0IGlmIHRoZSBwYXNzd29yZCBpcwotICAgICAgICAgICAgICAgICAgICAgICBub3QgY29ycmVjdC4pICBIZXJlIGlzIGFuIGV4YW1wbGUgc2NyaXB0IChub3RlIGl0IGhhcwotICAgICAgICAgICAgICAgICAgICAgICBhIGhhcmR3aXJlZCBib2d1cyBwYXNzd29yZCAiYWJjIiEpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAjIS9iaW4vc2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAjIEV4YW1wbGUgeDExdm5jIC11bml4cHdfY21kIHNjcmlwdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlYWQgdGhlIGZpcnN0IHR3byBsaW5lcyBvZiBzdGRpbiAodXNlciBhbmQgcGFzc3dkKQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgcGFzcwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MAotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgJGRlYnVnID0gMSBdOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gInVzZXI6ICR1c2VyIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gInBhc3M6ICRwYXNzIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiB8IGVncmVwIC1pICdyZmJ8dm5jJyAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHBhc3N3b3JkIGlzIHZhbGlkLgotICAgICAgICAgICAgICAgICAgICAgICAgICMgKEEgcmVhbCBleGFtcGxlIHdvdWxkIHVzZSBsZGFwIGxvb2t1cCwgZXRjISkKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICJYJHBhc3MiICE9ICJYYWJjIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMSAgIyBpbmNvcnJlY3QgcGFzc3dvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAiWCRSRkJfVU5JWFBXX0NNRF9SVU4iID0gIlgiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAwICAjIGNvcnJlY3QgcGFzc3dvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUnVuIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCAoZmluZGRpc3BsYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgJGRlYnVnID0gMSBdOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAicnVuOiAkUkZCX1VOSVhQV19DTURfUlVOIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMgL2Jpbi9zdSAtICIkdXNlciIgLWMgIiRSRkJfVU5JWFBXX0NNRF9SVU4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICAgICAgICBJbiAtdW5peHB3X2NtZCBtb2RlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIGlzIHgxMXZuYydzCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcGFzc3dvcmQgdmVyaWZ5aW5nIGZ1bmN0aW9uIGJhc2VkIG9uIHN1IGNhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgZnVuY3Rpb24gc3VfdmVyaWZ5KCkgdGhhdCBydW5zIC9iaW4vc3UgaW4gYQotICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG90ZXJtaW5hbCB0byB2ZXJpZnkgcGFzc3dvcmRzLikgIEl0IGlzIHVwIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCB1bml4cHdfY21kIHRvIGRvIHVzZXIgc3dpdGNoaW5nIGlmIGRlc2lyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyB0aGUgcGVybWlzc2lvbnMgdG8gZG8gc28uCi0KLS1maW5kICAgICAgICAgICAgICAgICAgRmluZCB0aGUgdXNlcidzIGRpc3BsYXkgdXNpbmcgRklORERJU1BMQVkuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gYWxpYXMgZm9yICItZGlzcGxheSBXQUlUOmNtZD1GSU5ERElTUExBWSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIG92ZXJyaWRlIHRoZSAtZmluZCBzZXR0aW5nLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIGFuZCB0aGUgbmV4dCBmZXcgb3B0aW9ucyBzZWUgLWRpc3BsYXkgV0FJVDouLi4KLSAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgZm9yIGFsbCBvZiB0aGUgZGV0YWlscy4KLQotLWZpbmRkcHkgICAgICAgICAgICAgICBSdW4gdGhlIEZJTkRESVNQTEFZIHByb2dyYW0sIHByaW50IG91dCB0aGUgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSAoaWYgYW55KSBhbmQgZXhpdC4gIE91dHB1dCBpcyBsaWtlOiBESVNQTEFZPTowLjAKLSAgICAgICAgICAgICAgICAgICAgICAgRElTUExBWT06MC4wLFhQSUQ9MTIzNDUgb3IgRElTUExBWT06MC4wLFZUPTcuICBYUElEIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBmb3VuZCBYIHNlcnZlci4gIFZUIGlzIHRoZSBMaW51eAotICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHRlcm1pbmFsIG9mIHRoZSBYIHNlcnZlci4KLS1saXN0ZHB5ICAgICAgICAgICAgICAgSGF2ZSB0aGUgRklORERJU1BMQVkgcHJvZ3JhbSBsaXN0IGFsbCBvZiB5b3VyIGRpc3BsYXlzCi0gICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGFsbCB0aGUgWCBkaXNwbGF5cyBvbiB0aGUgbG9jYWwgbWFjaGluZSB0aGF0IHlvdQotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFjY2VzcyByaWdodHMgdG8pLiAgeDExdm5jIHRoZW4gZXhpdHMuCi0KLS1maW5kYXV0aCBbZGlzcF0gICAgICAgQXBwbHkgdGhlIC1maW5kLy1maW5kZHB5IGhldXJpc3RpY3MgdG8gdHJ5IHRvIGd1ZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBYQVVUSE9SSVRZIGZpbGUgZm9yIERJU1BMQVkgJ2Rpc3AnLiAgSWYgJ2Rpc3AnCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwbGllZCwgdGhlbiB0aGUgdmFsdWUgaW4gdGhlIC1kaXNwbGF5IG9uCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbWRsaW5lIGlzIHVzZWQ7IGZhaWxpbmcgdGhhdCAkRElTUExBWSBpcyB1c2VkOwotICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmFpbGluZyB0aGF0ICI6MCIgaXMgdXNlZC4gIHgxMXZuYyB0aGVuIGV4aXRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIG5vdGhpbmcgaXMgcHJpbnRlZCBvdXQsIHRoYXQgbWVhbnMgbm8gWEFVVEhPUklUWSB3YXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgZm9yICdkaXNwJzsgaS5lLiBmYWlsdXJlLiAgSWYgIlhBVVRIT1JJVFk9IgotICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmludGVkIG91dCwgdGhhdCBtZWFucyB1c2UgdGhlIGRlZmF1bHQgKGkuZS4gZG8KLSAgICAgICAgICAgICAgICAgICAgICAgbm90IHNldCBYQVVUSE9SSVRZKS4gIElmICJYQVVUSE9SSVRZPS9wYXRoL3RvL2ZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHByaW50ZWQgb3V0LCB0aGVuIHVzZSB0aGF0IGZpbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWERNL0dETS9LRE06IGlmIHlvdSBhcmUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCBhbmQgd2FudAotICAgICAgICAgICAgICAgICAgICAgICB0byBmaW5kIHRoZSBYQVVUSE9SSVRZIGJlZm9yZSBhbnlvbmUgaGFzIGxvZ2dlZCBpbnRvIGFuCi0gICAgICAgICAgICAgICAgICAgICAgIFggc2Vzc2lvbiB5ZXQsIHVzZTogeDExdm5jIC1lbnYgRkRfWERNPTEgLWZpbmRhdXRoIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWQgaW50byB0aGUgWCBzZXNzaW9uLikgIFdoZW4gcnVubmluZyBhcyByb290LAotICAgICAgICAgICAgICAgICAgICAgICBGRF9YRE09MSB3aWxsIGJlIHRyaWVkIGlmIHRoZSBpbml0aWFsIC1maW5kYXV0aCBmYWlscy4KLQotLWNyZWF0ZSAgICAgICAgICAgICAgICBGaXJzdCB0cnkgdG8gZmluZCB0aGUgdXNlcidzIGRpc3BsYXkgdXNpbmcgRklORERJU1BMQVksCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoYXQgZG9lc24ndCBzdWNjZWVkIGNyZWF0ZSBhbiBYIHNlc3Npb24gdmlhIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBGSU5EQ1JFQVRFRElTUExBWSBtZXRob2QuICBUaGlzIGlzIGFuIGFsaWFzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAiLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYiIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIG92ZXJyaWRlIHRoZSAtY3JlYXRlIHNldHRpbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU1NIIE5PVEU6IGZvciBib3RoIC1maW5kIGFuZCAtY3JlYXRlIHlvdSBjYW4gKHNob3VsZCEpCi0gICAgICAgICAgICAgICAgICAgICAgIGFkZCB0aGUgIi1sb2NhbGhvc3QiIG9wdGlvbiB0byBmb3JjZSBTU0ggdHVubmVsIGFjY2Vzcy4KLQotLXhkdW1teSAgICAgICAgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWGR1bW15IGluc3RlYWQgb2YgWHZmYi4KLS14dm5jICAgICAgICAgICAgICAgICAgQXMgaW4gLWNyZWF0ZSwgZXhjZXB0IFh2bmMgaW5zdGVhZCBvZiBYdmZiLgotLXh2bmNfcmVkaXJlY3QgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWHZuYy5yZWRpcmVjdCBpbnN0ZWFkIG9mIFh2ZmIuCi0teGR1bW15X3h2ZmIgICAgICAgICAgIFNldHMgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15LFh2ZmIKLQotLWNyZWF0ZV94c3J2IHN0ciAgICAgICBTZXRzIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLTxzdHI+ICBDYW4gYmUgb24gY21kbGluZQotICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBhbnl0aGluZyB0aGF0IHNldHMgV0FJVDouLiBhbmQgb3RoZXIgdGhpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgIChlLmcuIC1zdmMsIC14ZG1zdmMpIHRvIGFkanVzdCB0aGUgWCBzZXJ2ZXIgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogLXN2YyAuLi4gLWNyZWF0ZV94c3J2IFhkdW1teSxYCi0KLS1zdmMgICAgICAgICAgICAgICAgICAgVGVybWluYWwgc2VydmljZXMgbW9kZSBiYXNlZCBvbiBTU0wgYWNjZXNzLiAgQWxpYXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIgLXVuaXhwdyAtdXNlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgdW5peHB3PSAtc3NsIFNBVkUgICBBbHNvICItc2VydmljZSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSwgLXVuaXhwdywgLXVzZXJzLCBvciAtc3NsIG9jY3VycwotICAgICAgICAgICAgICAgICAgICAgICBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC1zdmMKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy4KLQotLXN2Y194ZHVtbXkgICAgICAgICAgICBBcyAtc3ZjIGV4Y2VwdCBYZHVtbXkgaW5zdGVhZCBvZiBYdmZiLgotLXN2Y194dm5jICAgICAgICAgICAgICBBcyAtc3ZjIGV4Y2VwdCBYdm5jIGluc3RlYWQgb2YgWHZmYi4KLS1zdmNfeGR1bW15X3h2ZmIgICAgICAgQXMgLXN2YyB3aXRoIFhkdW1teSxYdmZiLgotCi0teGRtc3ZjICAgICAgICAgICAgICAgIERpc3BsYXkgbWFuYWdlciBUZXJtaW5hbCBzZXJ2aWNlcyBtb2RlIGJhc2VkIG9uIFNTTC4KLSAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMgZm9yIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AKLSAgICAgICAgICAgICAgICAgICAgICAgLXVuaXhwdyAtdXNlcnMgdW5peHB3PSAtc3NsIFNBVkUgIEFsc28gIi14ZG1fc2VydmljZSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSwgLXVuaXhwdywgLXVzZXJzLCBvciAtc3NsIG9jY3VycwotICAgICAgICAgICAgICAgICAgICAgICBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC14ZG1zdmMKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBjcmVhdGUgYSBzZXNzaW9uIGEgdXNlciB3aWxsIGhhdmUgdG8gZmlyc3QgbG9nIGluCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSAtdW5peHB3IGRpYWxvZyBhbmQgdGhlbiBsb2cgaW4gYWdhaW4gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFhETS9HRE0vS0RNIHByb21wdC4gIFN1YnNlcXVlbnQgcmUtY29ubmVjdGlvbnMgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHJlcXVpcmUgdGhlIC11bml4cHcgcGFzc3dvcmQuICBTZWUgdGhlIGRpc2N1c3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgLWRpc3BsYXkgV0FJVDouLi4gZm9yIG1vcmUgZGV0YWlscyBhYm91dCBYRE0sCi0gICAgICAgICAgICAgICAgICAgICAgIGV0YyBjb25maWd1cmF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFJlbWVtYmVyIHRvIGVuYWJsZSBYRE1DUCBpbiB0aGUgeGRtLWNvbmZpZywgZ2RtLmNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGtkbXJjIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZSAtZGlzcGxheSBXQUlUOiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLgotCi0tc3NoeGRtc3ZjICAgICAgICAgICAgIERpc3BsYXkgbWFuYWdlciBUZXJtaW5hbCBzZXJ2aWNlcyBtb2RlIGJhc2VkIG9uIFNTSC4KLSAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMgZm9yIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AKLSAgICAgICAgICAgICAgICAgICAgICAgLWxvY2FsaG9zdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWxvY2FsaG9zdCBvcHRpb24gY29uc3RyYWlucyBjb25uZWN0aW9ucyB0byBjb21lCi0gICAgICAgICAgICAgICAgICAgICAgIGluIHZpYSBhIFNTSCB0dW5uZWwgKHdoaWNoIHdpbGwgcmVxdWlyZSBhIGxvZ2luKS4KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gY3JlYXRlIGEgc2Vzc2lvbiBhIHVzZXIgd2lsbCBhbHNvIGhhdmUgdG8gbG9nIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIFhETSBHRE0gS0RNIHByb21wdC4gU3Vic2VxdWVudCByZS1jb25uZWN0aW9ucyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIG9ubHkgb25seSByZXF1aXJlIHRoZSBTU0ggbG9naW4uICBTZWUgdGhlIGRpc2N1c3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgLWRpc3BsYXkgV0FJVDouLi4gZm9yIG1vcmUgZGV0YWlscyBhYm91dCBYRE0sCi0gICAgICAgICAgICAgICAgICAgICAgIGV0YyBjb25maWd1cmF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFJlbWVtYmVyIHRvIGVuYWJsZSBYRE1DUCBpbiB0aGUgeGRtLWNvbmZpZywgZ2RtLmNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGtkbXJjIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZSAtZGlzcGxheSBXQUlUOiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLgotCi0tdW5peHB3X3N5c3RlbV9ncmVldGVyIFByZXNlbnQgYSAiUHJlc3MgJ0VzY2FwZScgZm9yIFN5c3RlbSBHcmVldGVyIiBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNvbm5lY3RpbmcgVk5DIGNsaWVudCBpbiBjb21iaW5lZCAtdW5peHB3Ci0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB4ZG1jcCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyAoZS5nLiAteGRtc3ZjKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxseSBpbiBhIC11bml4cHcgbW9kZSB0aGUgVk5DIGNsaWVudCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSBhIHZhbGlkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBnYWluIGFjY2Vzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBpcyBzdXBwbGllZCBBTkQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZJTkRDUkVBVEVESVNQTEFZIGNvbW1hbmQgbWF0Y2hlcyAneGRtY3AnLCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIHRvIHByZXNzIEVzY2FwZSBhbmQgdGhlbiBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICBYRE0vR0RNL0tETSBsb2dpbi9ncmVldGVyIHBhbmVsIGluc3RlYWQuIFRoZXkgd2lsbCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBkaXJlY3RseSB0byB0aGUgZ3JlZXRlci4KLQotICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGluIHhkbWNwIEZJTkRDUkVBVEVESVNQTEFZIG1vZGUgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBzdXBwbHkgaGlzIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBUV0lDRS4gIEZpcnN0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHVuaXhwdyBsb2dpbiBkaWFsb2csIGFuZCBzZWNvbmQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgWERNL0dETS9LRE0gZ3JlZXRlci4gIE5vdGUgdGhhdCBpZiB0aGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICByZS1jb25uZWN0cyBhbmQgc3VwcGxpZXMgaGlzIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdW5peHB3IGRpYWxvZyB0aGUgeGRtY3AgZ3JlZXRlciBpcyBza2lwcGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBoZSBpcyBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gaGlzIGV4aXN0aW5nIFggc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgU28gdGhlIC11bml4cHdfc3lzdGVtX2dyZWV0ZXIgb3B0aW9uIGF2b2lkcyB0aGUgZXh0cmEKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgYXQgWCBzZXNzaW9uIGNyZWF0aW9uIHRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogIHgxMXZuYyAteGRtc3ZjIC11bml4cHdfc3lzdGVtX2dyZWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIC11bml4cHcgYW5kIC1kaXNwbGF5IFdBSVQ6Li4uIGZvciBtb3JlIGluZm8uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgb3B0aW9ucyBhZnRlciBhIGNvbG9uIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIChlLmcuIHVzZXI6c29saWQpIGRlc2NyaWJlZCB1bmRlciAtZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICBXQUlUOiBhcmUgYWxzbyBhcHBsaWVkIGluIHRoaXMgbW9kZSBpZiB0aGV5IGFyZSB0eXBlZAotICAgICAgICAgICAgICAgICAgICAgICBpbiBiZWZvcmUgdGhlIHVzZXIgaGl0cyBFc2NhcGUuICBUaGUgdXNlcm5hbWUgaXMgaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIGNvbG9uIG9wdGlvbnMgYXJlIG5vdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBtZXNzYWdlIGlzIDIgbGluZXMgaW4gYSBzbWFsbCBmb250LCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudi4gdmFyLiBYMTFWTkNfU1lTVEVNX0dSRUVURVIxPXRydWUgZm9yIGEgMSBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaW4gYSBsYXJnZXIgZm9udC4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgdXNlciBwcmVzc2VkIEVzY2FwZSB0aGUgRklORENSRUFURURJU1BMQVkgY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJ1biB3aXRoIHRoZSBlbnYuIHZhci4gWDExVk5DX1hETV9PTkxZPTEuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgUmVtZW1iZXIgdG8gZW5hYmxlIFhETUNQIGluIHRoZSB4ZG0tY29uZmlnLCBnZG0uY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgb3Iga2RtcmMgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIC1kaXNwbGF5IFdBSVQ6IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm8uCi0KLS1yZWRpcmVjdCBwb3J0ICAgICAgICAgQXMgaW4gRklORENSRUFURURJU1BMQVktWHZuYy5yZWRpcmVjdCBtb2RlIGV4Y2VwdAotICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCBpbW1lZGlhdGVseSAoaS5lLiB3aXRob3V0IFggc2Vzc2lvbiBmaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGNyZWF0aW9uKSB0byBhIFZOQyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQuIFlvdQotICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBzdXBwbHkgaG9zdDpwb3J0IHRvIHJlZGlyZWN0IHRvIGEgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgMCA8PSBwb3J0IDwgMjAwIGl0IGlzIHRha2VuIGFzIGEgVk5DIGRpc3BsYXkgKDU5MDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgdG8gZ2V0IHRoZSBhY3R1YWwgcG9ydCksIGlmIHBvcnQgPCAwIHRoZW4gLXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBQcm9iYWJseSB0aGUgb25seSByZWFzb24gdG8gdXNlIHRoZSAtcmVkaXJlY3Qgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGluIGNvbmp1bmN0aW9uIHdpdGggU1NMIHN1cHBvcnQsIGUuZy4gLXNzbCBTQVZFLgotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGFkZCBTU0wgZW5jcnlwdGlvbiB0byBhIFZOQwotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IFNTTCAoZS5nLiBYdm5jIG9yIHZuYy5zbykKLSAgICAgICAgICAgICAgICAgICAgICAgSW4gZmFjdCwgdGhlIHByb3RvY29sIGRvZXMgbm90IGV2ZW4gbmVlZCB0byBiZSBWTkMsCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbyAiLXJmYnBvcnQgcG9ydDEgLXNzbCBTQVZFIC1yZWRpcmVjdCBob3N0OnBvcnQyIgotICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWN0IGFzIGEgcmVwbGFjZW1lbnQgZm9yIHN0dW5uZWwoMSkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIG9ubHkgYWxsb3dzIG9uZSByZWRpcmVjdGVkIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSAtZm9yZXZlciBvcHRpb24gZG9lcyBub3QgYXBwbHkuICBVc2UgLWluZXRkIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIC1sb29wIGZvciBwZXJzaXN0ZW50IHNlcnZpY2UuCi0KLS1kaXNwbGF5X1dBSVQgOi4uLiAgICAgIEEgc3BlY2lhbCB1c2FnZSBtb2RlIGZvciB0aGUgbm9ybWFsIC1kaXNwbGF5IG9wdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHdpdGggLXVuaXhwdywgYnV0IGNhbiBiZSB1c2VkIGluZGVwZW5kZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgaXQuICBJZiB0aGUgZGlzcGxheSBzdHJpbmcgYmVnaW5zIHdpdGggV0FJVDogdGhlbgotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2FpdHMgdW50aWwgYSBWTkMgY2xpZW50IGNvbm5lY3RzIGJlZm9yZSBvcGVuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBYIGRpc3BsYXkgKG9yIC1yYXdmYiBkZXZpY2UpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgdXNlZnVsIGZvciBkZWxheWluZyBvcGVuaW5nIHRoZSBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciBjZXJ0YWluIHVzYWdlIG1vZGVzIChzYXkgaWYgeDExdm5jIGlzIHN0YXJ0ZWQgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vdCB0aW1lIGFuZCBubyBYIHNlcnZlciBpcyBydW5uaW5nIG9yIHVzZXJzIGxvZ2dlZAotICAgICAgICAgICAgICAgICAgICAgICBpbiB5ZXQpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdHJpbmcgaXMsIGUuZy4gV0FJVDowLjAgb3IgV0FJVDoxLCBpLmUuICJXQUlUIgotICAgICAgICAgICAgICAgICAgICAgICBpbiBmcm9udCBvZiBhIG5vcm1hbCBYIGRpc3BsYXksIHRoZW4gdGhhdCBpbmRpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyB1c2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYW4gYWxzbyBpbnNlcnQgYSBnZW9tZXRyeSBiZXR3ZWVuIGNvbG9ucywgZS5nLgotICAgICAgICAgICAgICAgICAgICAgICBXQUlUOjEyODB4MTAyNDouLi4gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBkaXNwbGF5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50IGZpcnN0IGF0dGFjaGVzIHRvIHNpbmNlIHNvbWUgVk5DIHZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYXV0b21hdGljYWxseSBhZGp1c3QgdG8gYSBuZXcgZnJhbWVidWZmZXIgc2l6ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBBIG1vcmUgaW50ZXJlc3RpbmcgY2FzZSBpcyBsaWtlIHRoaXM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUlUOmNtZD0vdXNyL2xvY2FsL2Jpbi9maW5kX2Rpc3BsYXkKLQotICAgICAgICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHRoZSBjb21tYW5kIGFmdGVyICJjbWQ9IiBpcyBydW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHkgd29yayBvdXQgdGhlIERJU1BMQVkgYW5kIG9wdGlvbmFsbHkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFhBVVRIT1JJVFkgZGF0YS4gIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tYW5kIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBmb3JtIERJU1BMQVk9PHhkaXNwbGF5Pi4gIE9uIExpbnV4Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSB2aXJ0dWFsIHRlcm1pbmFsIGlzIGtub3duIGFwcGVuZCAiLFZUPW4iIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RyaW5nIGFuZCB0aGUgY2h2dCgxKSBwcm9ncmFtIHdpbGwgYWxzbyBiZSBydW4uCi0gICAgICAgICAgICAgICAgICAgICAgIEFueSByZW1haW5pbmcgb3V0cHV0IGlzIHRha2VuIGFzIFhBVVRIT1JJVFkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIGVpdGhlciBvZiB0aGUgZm9ybSBYQVVUSE9SSVRZPTxmaWxlPiBvciByYXcKLSAgICAgICAgICAgICAgICAgICAgICAgeGF1dGhvcml0eSBkYXRhIGZvciB0aGUgZGlzcGxheS4gRm9yIGV4YW1wbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YXV0aCBleHRyYWN0IC0gJERJU1BMQVkiCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHlvdSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IHlvdXIgb3duIFdBSVQ6Y21kPS4uLiBwcm9ncmFtIG9yIHNjcmlwdCwgQlVUCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSB0d28gdmVyeSB1c2VmdWwgKkJVSUxULUlOKiBvbmVzOiBGSU5ERElTUExBWQotICAgICAgICAgICAgICAgICAgICAgICAoYWxpYXMgLWZpbmQgYWJvdmUpIGFuZCBGSU5EQ1JFQVRFRElTUExBWSAoYWxpYXMgLWNyZWF0ZQotICAgICAgICAgICAgICAgICAgICAgICBhYm92ZS4pICBNb3N0IHBlb3BsZSB1c2UgdGhlc2UgaW5zdGVhZCBvZiBjcmVhdGluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGVpciBvd24gc2NyaXB0LiAgUmVhZCB0aGUgZm9sbG93aW5nIChlc3BlY2lhbGx5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBCVUlMVC1JTiBtb2RlcyBzZWN0aW9ucykgdG8gc2VlIGhvdyB0byBjb25maWd1cmUgdGhlc2UKLSAgICAgICAgICAgICAgICAgICAgICAgdHdvIHVzZWZ1bCBidWlsdGluIC1kaXNwbGF5IFdBSVQ6IG1vZGVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC11bml4cHcgKGFuZCAtdW5peHB3X25pcyBvbmx5IGlmIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICBpcyBydW5uaW5nIGFzIHJvb3QpLCB0aGVuIHRoZSBjbWQ9IGNvbW1hbmQgaXMgcnVuCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2VyIHdobyBqdXN0IGF1dGhlbnRpY2F0ZWQgdmlhIHRoZSBsb2dpbiBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgcHJvbXB0LgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC11bml4cHdfY21kLCB0aGUgY29tbWFuZHMgd2lsbCBhbHNvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHJ1biBhcyB0aGUgbG9nZ2VkLWluIHVzZXIsIGFzIGxvbmcgYXMgdGhlIHVzZXItc3VwcGxpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyIHByb2dyYW0gc3VwcG9ydHMgUkZCX1VOSVhQV19DTURfUlVOIChzZWUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIC11bml4cHdfY21kIG9wdGlvbi4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQWxzbyBpbiB0aGUgY2FzZSBvZiAtdW5peHB3LCB0aGUgdXNlciBsb2dnaW5nIGluIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSBhIGNvbG9uIGF0IHRoZSBlbmQgb2YgaGVyIHVzZXJuYW1lIGFuZCBzdXBwbHkKLSAgICAgICAgICAgICAgICAgICAgICAgYSBmZXcgb3B0aW9uczogc2NhbGU9LCBzY2FsZV9jdXJzb3I9IChvciBzYz0pLCBzb2xpZAotICAgICAgICAgICAgICAgICAgICAgICAob3Igc28pLCBpZD0sIGNsZWFyX21vZHMgKG9yIGNtKSwgY2xlYXJfa2V5cyAob3IKLSAgICAgICAgICAgICAgICAgICAgICAgY2spLCBjbGVhcl9hbGwgKG9yIGNhKSwgcmVwZWF0LCBzcGVlZHM9IChvciBzcD0pLAotICAgICAgICAgICAgICAgICAgICAgICByZWFkdGltZW91dD0gKG9yIHJkPSksIHZpZXdvbmx5IChvciB2byksIG5vZGlzcGxheT0KLSAgICAgICAgICAgICAgICAgICAgICAgKG9yIG5kPSksIHJvdGF0ZT0gKG9yIHJvPSksIG9yIG5vbmNhY2hlIChvciBuYyksCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbCBzZXBhcmF0ZWQgYnkgY29tbWFzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoZSB1c2VyIGxvZ3MgaW4gc3VjY2Vzc2Z1bGx5LCB0aGVzZSBvcHRpb25zIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0byB0aGUgVk5DIHNjcmVlbi4gIEZvciBleGFtcGxlLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luOiBmcmVkOnNjYWxlPTMvNCxzYz0xLHJlcGVhdAotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzd29yZDogLi4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW46IHJ1bmdlOnNwPW1vZGVtLHJkPTEyMCxzb2xpZAotCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBjb252ZW5pZW5jZSBtL24gaW1wbGllcyBzY2FsZT0gZS5nLiBmcmVkOjMvNCAgSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIHR5cGUgYW5kIGVudGVyIHlvdXIgcGFzc3dvcmQgaW5jb3JyZWN0bHksIHRvIHJldHJpZXZlCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdXIgbG9uZyAibG9naW46IiBsaW5lIHByZXNzIHRoZSBVcCBhcnJvdyBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgIChiZWZvcmUgdHlwaW5nIGFueXRoaW5nIGVsc2UpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE1vc3Qgb2YgdGhlc2UgY29sb24gb3B0aW9ucyBvbmx5IGFwcGx5IHRvIHRoZSBidWlsdGluCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcywgYnV0IG5vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGV4dHJlbmFsIGNvbW1hbmQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IGFzIHdlbGwgYW5kIHNvIGNvdWxkIGJlIHVzZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGxvZ2luIHBhbmVsLCBwcmVzcyBGMSB0byBnZXQgYSBsaXN0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgb3B0aW9ucyB0aGF0IHlvdSBjYW4gYWRkIGFmdGVyIHRoZSB1c2VybmFtZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIG9wdGlvbiBpcyAiZ2VvbT1XeEgiIG9yICJnZW9tPVd4SHhEIiAob3IKLSAgICAgICAgICAgICAgICAgICAgICAgZ2U9KS4gVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3QgaW4gRklORENSRUFURURJU1BMQVkKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVuIGEgdmlydHVhbCBYIHNlcnZlciBzdWNoIGFzIFh2ZmIgaXMgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY3JlYXRlZC4gIEl0IHNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5ldyBkaXNwbGF5LCBhbmQgb3B0aW9uYWxseSB0aGUgY29sb3IgZGVwdGggYXMKLSAgICAgICAgICAgICAgICAgICAgICAgd2VsbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gc3VwcGx5ICJnbm9tZSIsICJrZGUiLCAidHdtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImZ2d20iLCAibXdtIiwgImR0d20iLCAid21ha2VyIiwgInhmY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAibHhkZSIsICJlbmxpZ2h0ZW5tZW50IiwgIlhzZXNzaW9uIiwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgImZhaWxzYWZlIiAoc2FtZSBhcyAieHRlcm0iKSB0byBoYXZlIHRoZSBjcmVhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdXNlIHRoYXQgbW9kZSBmb3IgdGhlIHVzZXIgc2Vzc2lvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5ICJ0YWc9Li4uIiB0byBzZXQgdGhlIHVuaXF1ZSBGRF9UQUcgZGVza3RvcAotICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIHRhZyBkZXNjcmliZWQgYmVsb3cuICBOb3RlOiB0aGlzIG9wdGlvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIGlnbm9yZWQgaWYgdGhlIEZEX1RBRyBlbnYuIHZhci4gaXMgYWxyZWFkeSBzZXQgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHZpZXdlci1zaWRlIHN1cHBsaWVkIHZhbHVlIGlzIG5vdCBjb21wbGV0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBvciAnXycgb3IgJy0nIGNoYXJhY3RlcnMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlciBwcmVmZXJlbmNlcyBmaWxlOiBJbnN0ZWFkIG9mIGhhdmluZyB0aGUgdXNlciB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgIGluIGdlb209V3hILC4uLiBldGMuIGV2ZXJ5IHRpbWUgaGUgbG9ncyBpbiB0byBmaW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGNyZWF0ZSBoaXMgWCBzZXNzaW9uLCBpZiB5b3Ugc2V0IEZEX1VTRVJQUkVGUyB0bwotICAgICAgICAgICAgICAgICAgICAgICBhIHN0cmluZyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlICIvIiBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBpcyBwcmVwZW5kZWQgdG8gdGhhdAotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYW5kIGlmIHRoZSBmaWxlIGV4aXN0cyBpdHMgZmlyc3QgbGluZSBpcyByZWFkCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBhcHBlbmRlZCB0byBhbnkgb3B0aW9ucyBoZSBzdXBwbGllZCBhdCB0aGUgbG9naW46Ci0gICAgICAgICAgICAgICAgICAgICAgIHByb21wdC4gIEZvciBleGFtcGxlIC1lbnYgRkRfVVNFUlBSRUZTPS54MTF2bmNfY3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBwdXQgImdlb209MTYwMHgxMjAwIiBpbiBoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgfi8ueDExdm5jX2NyZWF0ZSBmaWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRvIGRpc2FibGUgdGhlIG9wdGlvbiBzZXR0aW5nIHNldCB0aGUgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgWDExVk5DX05PX1VOSVhQV19PUFRTPTEgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYy4KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gc2V0IGFueSBvdGhlciBvcHRpb25zLCB0aGUgdXNlciBjYW4gdXNlIHRoZSBndWkKLSAgICAgICAgICAgICAgICAgICAgICAgKHgxMXZuYyAtZ3VpIGNvbm5lY3QpIG9yIHRoZSByZW1vdGUgY29udHJvbCBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgKHgxMXZuYyAtUiBvcHQ6dmFsKSBkdXJpbmcgaGlzIFZOQyBzZXNzaW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNvIHdlIHNlZSB0aGUgY29tYmluYXRpb24gb2YgLWRpc3BsYXkgV0FJVDpjbWQ9Li4uIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAtdW5peHB3IGFsbG93cyBhdXRvbWF0aWMgcGFpcmluZyBvZiBhbiB1bml4Ci0gICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgVk5DIHVzZXIgd2l0aCBoaXMgZGVza3RvcC4gIFRoaXMgY291bGQKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgdmVyeSB1c2VmdWwgb24gU3VuUmF5cyBhbmQgYWxzbyBhbnkgc3lzdGVtIHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIHVzZXJzIHNoYXJlIGEgZ2l2ZW4gbWFjaGluZS4gIFRoZSB1c2VyIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IG5lZWQgdG8gcmVtZW1iZXIgc3BlY2lhbCBwb3J0cyBvciBwYXNzd29yZHMgc2V0IHVwCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBoaXMgZGVza3RvcCBhbmQgVk5DLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEEgbmljZSB3YXkgdG8gdXNlIFdBSVQ6Y21kPS4uLiBpcyBvdXQgb2YgaW5ldGQoOCkKLSAgICAgICAgICAgICAgICAgICAgICAgKGl0IGF1dG9tYXRpY2FsbHkgZm9ya3MgYSBuZXcgeDExdm5jIGZvciBlYWNoIHVzZXIpLgotICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGhhdmUgdGhlIHgxMXZuYyBpbmV0ZCBzcGF3bmVkIHByb2Nlc3MgcnVuIGFzLAotICAgICAgICAgICAgICAgICAgICAgICBzYXksIHJvb3Qgb3Igbm9ib2R5LiAgV2hlbiBydW4gYXMgcm9vdCAoZm9yIGVpdGhlciBpbmV0ZAotICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNwbGF5IG1hbmFnZXIpLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZSBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIi11c2VycyB1bml4cHc9IiB0byBoYXZlIHRoZSB4MTF2bmMgcHJvY2VzcyBzd2l0Y2ggdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgYXMgd2VsbC4gIE5vdGU6IHRoZXJlIHdpbGwgYmUgYSAybmQgU1NMIGhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRoYXQgd2lsbCBub3Qgc3dpdGNoLCBidXQgaXQgaXMgb25seSBlbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGVjb2RpbmcgdGhlIGVuY3J5cHRlZCBzdHJlYW0gYXQgdGhhdCBwb2ludC4KLQotICAgICAgICAgICAgICAgICAgICAgICBCVUlMVC1JTiBtb2RlczoKLQotICAgICAgICAgICAgICAgICAgICAgICAtLSBBdXRvbWF0aWMgRmluZGluZyBvZiBVc2VyIFggU2Vzc2lvbnMgLS0KLQotICAgICAgICAgICAgICAgICAgICAgICBBcyBhIHNwZWNpYWwgY2FzZSwgV0FJVDpjbWQ9RklORERJU1BMQVkgd2lsbCBydW4gYQotICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgdGhhdCB3b3JrcyBvbiBtb3N0IFVuaXhlcyB0byBkZXRlcm1pbmUgYSB1c2VyJ3MKLSAgICAgICAgICAgICAgICAgICAgICAgRElTUExBWSB2YXJpYWJsZSBhbmQgeGF1dGhvcml0eSBkYXRhIChzZWUgd2hvKDEpKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGUgb3B0aW9uICItZmluZCIgaXMgYW4gYWxpYXMgZm9yIHRoaXMgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBoYXZlIHRoaXMgZGVmYXVsdCBzY3JpcHQgcHJpbnRlZCB0byBzdGRvdXQgKGUuZy4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb24pIHJ1biB3aXRoIFdBSVQ6Y21kPUZJTkRESVNQTEFZLXByaW50IFRvCi0gICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdGhlIHNjcmlwdCBydW4gdG8gcHJpbnQgd2hhdCBkaXNwbGF5IGl0IHdvdWxkIGZpbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlICItZmluZGRweSIgb3IgV0FJVDpjbWQ9RklORERJU1BMQVktcnVuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0YW5kYXJkIHNjcmlwdCBydW5zIHhkcHlpbmZvKDEpIHJ1biBvbiBwb3RlbnRpYWwKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheXMuICBJZiB5b3VyIFggc2VydmVyKHMpIGhhdmUgYSBsb2dpbiBncmVldGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZXhjbHVzaXZlbHkgZ3JhYnMgdGhlIFhzZXJ2ZXIsIHRoZW4geGRweWluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIGZvcmV2ZXIgYW5kIHRoaXMgbW9kZSB3aWxsIG5vdCB3b3JrLiAgU2VlCi0gICAgICAgICAgICAgICAgICAgICAgIHd3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtZGlzcGxheS1tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBob3cgdG8gZGlzYWJsZSB0aGlzIGZvciBkdGdyZWV0IG9uIFNvbGFyaXMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZvciBvdGhlciBncmVldGVycy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJbiAtZmluZC9jbWQ9RklORERJU1BMQVkgbW9kZSwgaWYgeW91IHNldCBGRF9YRE09MSwKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAneDExdm5jIC1lbnYgRkRfWERNPTEgLWZpbmQgLi4uJyBhbmQgeDExdm5jIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgYXMgcm9vdCAoZS5nLiBpbmV0ZCkgdGhlbiBpdCB3aWxsIHRyeSB0byBmaW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBYQVVUSE9SSVRZIGZpbGUgb2YgYSBydW5uaW5nIFhETS9HRE0vS0RNIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgICAgIGdyZWV0ZXIgKGkuZS4gbm8gdXNlciBoYXMgbG9nZ2VkIGludG8gYW4gWCBzZXNzaW9uIHlldC4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQXMgYW5vdGhlciBzcGVjaWFsIGNhc2UsIFdBSVQ6Y21kPUhUVFBPTkNFIHdpbGwgYWxsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHRvIHNlcnZpY2Ugb25lIGh0dHAgcmVxdWVzdCBhbmQgdGhlbiBleGl0LgotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzdWFsbHkgZG9uZSBpbiAtaW5ldGQgbW9kZSB0byBydW4gb24sIHNheSwKLSAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA1ODAwIGFuZCBhbGxvdyB0aGUgSmF2YSB2bmN2aWV3ZXIgdG8gYmUgZG93bmxvYWRlZAotICAgICAgICAgICAgICAgICAgICAgICBieSBjbGllbnQgd2ViIGJyb3dzZXJzLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDU4MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvLi4uL3gxMXZuYwotXAotICAgICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgLXEgLWh0dHBfc3NsIC1wcm9nIC8uLi4veDExdm5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLWRpc3BsYXkgV0FJVDpjbWQ9SFRUUE9OQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICBXaGVyZSAvLi4uL3gxMXZuYyBpcyB0aGUgZnVsbCBwYXRoIHRvIHgxMXZuYy4KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCBpbiB0aGUgQXBhY2hlIFNTTC1wb3J0YWwgZXhhbXBsZSAoc2VlIEZBUSkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBtb2RlIHlvdSBjYW4gc2V0IFgxMVZOQ19TS0lQX0RJU1BMQVkgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkaXNwbGF5cyAoZS5nLiAiOjAsOjEiKSB0bwotICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaW4gdGhlIGZpbmRpbmcgcHJvY2Vzcy4gIFRoZSAiOiIgaXMgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICAgICAgICAgIFJhbmdlcyBuLW0gZS5nLiAwLTIwIGNhbiBhbHNvIGJlIHN1cHBsaWVkLiBUaGlzIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBzZXQgYnkgdGhlIGNvbm5lY3RpbmcgdXNlciB2aWEgIm5kPSIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgIisiIGluc3RlYWQgb2YgIiwiICBJZiAibmQ9YWxsIiBvciB5b3Ugc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19TS0lQX0RJU1BMQVk9YWxsIHRoZW4gYWxsIGRpc3BsYXkgZmluZGluZyBmYWlscwotICAgICAgICAgICAgICAgICAgICAgICBhcyBpZiB5b3Ugc2V0IFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFM9MSAoYmVsb3cuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIE9uIHNvbWUgc3lzdGVtcyBsc29mKDEpIGNhbiBiZSB2ZXJ5IHNsb3cuICBTZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFyLiBGSU5EX0RJU1BMQVlfTk9fTFNPRj0xIHRvIHNraXAgdXNpbmcgbHNvZiB0bwotICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZmluZCB0aGUgTGludXggVlQgdGhlIFggc2VydmVyIGlzIHJ1bm5pbmcgb24uCi0gICAgICAgICAgICAgICAgICAgICAgIHNldCBGSU5EX0RJU1BMQVlfTk9fVlRfRklORD0xIHRvIGF2b2lkIGxvb2tpbmcgYXQgYWxsLgotCi0gICAgICAgICAgICAgICAgICAgICAgIC0tIEF1dG9tYXRpYyBDcmVhdGlvbiBvZiBVc2VyIFggU2Vzc2lvbnMgLS0KLQotICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlcmVzdGluZyBvcHRpb24gaXMgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpcyBsaWtlIEZJTkRESVNQTEFZIGluIHRoYXQgaXMgdXNlcyB0aGUgc2FtZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZmluZCBhbiBleGlzdGluZyBkaXNwbGF5LiAgSG93ZXZlciwgaWYgaXQgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZCBvbmUgaXQgd2lsbCB0cnkgdG8gKnN0YXJ0KiB1cCBhbiBYIHNlcnZlciBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIG9ubHkgdGltZSB4MTF2bmMgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgc3RhcnQgdXAgYW4gWCBzZXJ2ZXIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVGhlIG9wdGlvbiAiLWNyZWF0ZSIgaXMgYW4gYWxpYXMgZm9yIHRoaXMgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIHN0YXJ0IGxvb2tpbmcgZm9yIGFuIG9wZW4gZGlzcGxheSBudW1iZXIgYXQgOjIwCi0gICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRlIHZpYSBYMTFWTkNfQ1JFQVRFX1NUQVJUSU5HX0RJU1BMQVlfTlVNQkVSPW4KLSAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCA4MCBYIGRpc3BsYXlzIGFyZSBhbGxvd2VkIChpLmUuIGdvaW5nIHRvIDo5OSkKLSAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGUgdmlhIFgxMVZOQ19DUkVBVEVfTUFYX0RJU1BMQVlTPW4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgaXRzIGhldXJpc3RpY3MsIHRoZSBjcmVhdGUgZGlzcGxheSBzY3JpcHQgc2V0cwotICAgICAgICAgICAgICAgICAgICAgICBMQ19BTEw9QyBzbyB0aGF0IGNvbW1hbmQgb3V0cHV0IGlzIHVuaWZvcm0uICBCeSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgdHJ5IHRvIHJlc3RvcmUgTENfQUxMIHJpZ2h0IGJlZm9yZSBzdGFydGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlciBzZXNzaW9uLiAgSG93ZXZlciwgaWYgeW91IGRvbid0IG1pbmQgaXQga2VlcGluZwotICAgICAgICAgICAgICAgICAgICAgICBMQ19BTEw9QyBzZXQgdGhlIGVudi4gdmFyLjogWDExVk5DX0NSRUFURV9MQ19BTExfQ19PSz0xCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBGSU5EQ1JFQVRFRElTUExBWSB3aWxsIHRyeSBYdmZiIGFuZCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIFhkdW1teToKLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgWGR1bW15IHdyYXBwZXIgaXMgcGFydCBvZiB0aGUgeDExdm5jIHNvdXJjZSBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICh4MTF2bmMvbWlzYy9YZHVtbXkpICBJdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIFBBVEgKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGhhdmUgcnVuICJYZHVtbXkgLWluc3RhbGwiIG9uY2UgdG8gY3JlYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgbGlicmFyeS4gIFhkdW1teSBvbmx5IHdvcmtzIG9uIExpbnV4LiAgQXMgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgMTIvMjAwOSBpdCBubyBsb25nZXIgbmVlZHMgdG8gYmUgcnVuIGFzIHJvb3QsIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB0byBub3QgcnVuIGFzIHJvb3QuICBJbiBzb21lIGNpcmN1bXN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgbWF5IHJlcXVpcmUgcnVubmluZyBpdCBhcyByb290LCBpbiB0aGVzZQotICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBzcGVjaWZ5IEZEX1hEVU1NWV9SVU5fQVNfUk9PVD0xLCB0aGlzIGlzIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIHN1cHBseWluZyAtcm9vdCB0byB0aGUgWGR1bW15IGNtZGxpbmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWHZmYiBpcyBhdmFpbGFibGUgb24gbW9zdCBwbGF0Zm9ybXMgYW5kIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUgcm9vdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbiBhZHZhbnRhZ2Ugb2YgWGR1bW15IG92ZXIgWHZmYiBpcyB0aGF0IFhkdW1teSBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICBSQU5EUiBkeW5hbWljIHNjcmVlbiByZXNpemluZy4KLQotICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHgxMXZuYyBleGl0cyAoaS5lLiB1c2VyIGRpc2Nvbm5lY3RzKSB0aGUgWAotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbiBzdGF5cyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgRklORERJU1BMQVkgd2lsbCBmaW5kIGl0IGRpcmVjdGx5IG5leHQgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbXVzdCBleGl0IHRoZSBYIHNlc3Npb24gaW4gdGhlIHVzdWFsIHdheSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gdGVybWluYXRlIChvciBraWxsIHRoZSBYIHNlcnZlciBwcm9jZXNzIGlmIGFsbAotICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGZhaWxzKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyB0cm91Ymxlc2hvb3QgdGhlIEZJTkRDUkVBVEVESVNQTEFZIG1lY2hhbmlzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSBmb2xsb3dpbmcgZW52LiB2YXIuIHRvIGFuIG91dHB1dCBsb2cgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nIC1lbnYgQ1JFQVRFX0RJU1BMQVlfT1VUUFVUPS90bXAvbXlkZWJ1Zy50eHQKLQotICAgICAgICAgICAgICAgICAgICAgICBTbyB0aGlzIGlzIGEgc29tZXdoYXQgb2RkIG1vZGUgZm9yIHgxMXZuYyBpbiB0aGF0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RhcnQgdXAgYW5kIHBvbGwgdmlydHVhbCBYIHNlcnZlcnMhICBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGZyb20sIHNheSwgaW5ldGQoOCkgdG8gcHJvdmlkZSBhIG1lYW5zIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRlbHkgZ2V0dGluZyBhIGRlc2t0b3AgKGVpdGhlciByZWFsIG9yIHZpcnR1YWwpCi0gICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtYWNoaW5lLiAgRS5nLiBhIGRlc2t0b3Agc2VydmljZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgIDU5MDAgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvLi4uL3gxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgLXEgLWh0dHAgLXNzbCBTQVZFIC11bml4cHcgLXVzZXJzIHVuaXhwdz1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1wYXNzd2Qgc2VjcmV0IC1wcm9nIC8uLi4veDExdm5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVkKLQotICAgICAgICAgICAgICAgICAgICAgICBXaGVyZSAvLi4uL3gxMXZuYyBpcyB0aGUgZnVsbCBwYXRoIHRvIHgxMXZuYy4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIC1zdmMvLXNlcnZpY2Ugb3B0aW9uIGFsaWFzIGFib3ZlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGZvciBzb21lIHJlYXNvbiB5b3UgZG8gbm90IHdhbnQgeDExdm5jIHRvIGV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZGlzcGxheSBzZXQgdGhlIGVudi4gdmFyCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFM9MSAoYWxzbyAtZW52IC4uLikKLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIFgxMVZOQ19TS0lQX0RJU1BMQVk9YWxsIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBseWluZyAibmQ9YWxsIiBhZnRlciAidXNlcm5hbWU6IgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1wcmludCB0byBwcmludCBvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCB0aGF0IGlzIHVzZWQgZm9yIHRoaXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzcGVjaWZ5IHRoZSBwcmVmZXJyZWQgWCBzZXJ2ZXIgb3JkZXIgdmlhIGUuZy4sCi0gICAgICAgICAgICAgICAgICAgICAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVhkdW1teSxYdmZiLFggIGFuZC9vciBsZWF2ZQotICAgICAgICAgICAgICAgICAgICAgICBvdXQgb25lcyB5b3UgZG8gbm90IHdhbnQuICBUaGUgdGhlIGNhc2UgIlgiIG1lYW5zIHRyeQotICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCB1cCBhIHJlYWwsIGhhcmR3YXJlIFggc2VydmVyIHVzaW5nIHhpbml0KDEpCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIHN0YXJ0eCgxKS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gWCBzZXJ2ZXIgcnVubmluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgWCBjYXNlIG1heSBvbmx5IHdvcmsgb24gTGludXggKHNlZSBzdGFydHgoMSkpLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJYdm5jIiB3aWxsIHN0YXJ0IHVwIGEgVk5DIFggc2VydmVyIChyZWFsLQotICAgICAgICAgICAgICAgICAgICAgICBvciB0aWdodC12bmMsIGUuZy4gdXNlIGlmIFh2ZmIgaXMgbm90IGF2YWlsYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICJYc3J2IiB3aWxsIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgcHJvZ3JhbSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgIkZEX1hTUlYiIGlmIGl0IGlzIG5vbi1lbXB0eS4gWW91IGNhbiBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmUgYSB3cmFwcGVyIHNjcmlwdCBpZiB5b3UgbGlrZSAoaXQgbXVzdCBoYW5kbGUgOk4sCi0gICAgICAgICAgICAgICAgICAgICAgIC1nZW9tZXRyeSwgYW5kIC1kZXB0aCBhbmQgb3RoZXIgWCBzZXJ2ZXIgb3B0aW9ucykuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEZEX0dFT00gKG9yCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19DUkVBVEVfR0VPTSkgdG8gV3hIIG9yIFd4SHhEIHRvIHNldCB0aGUgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGhlaWdodCBhbmQgb3B0aW9uYWxseSB0aGUgY29sb3IgZGVwdGggb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgZGlzcGxheS4gIFlvdSBjYW4gYWxzbyBzZXQgRkRfU0VTUyB0byBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiAoc2hvcnQgbmFtZSBvZiB0aGUgd2luZG93bWFuYWdlcjoga2RlLCBnbm9tZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHdtLCBmYWlsc2FmZSwgZXRjLikuIEZEX09QVFMgY29udGFpbnMgZXh0cmEgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBYIHNlcnZlci4gWW91IGNhbiBhbHNvIHNldCBGRF9QUk9HIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIHRoZSBmdWxsIHBhdGggdG8gdGhlIHNlc3Npb24vd2luZG93bWFuYWdlciBwcm9ncmFtLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE1vcmUgRkQgdHJpY2tzOiAgRkRfQ1VQUz1wb3J0IG9yIEZEX0NVUFM9aG9zdDpwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc2V0IHRoZSBjdXBzIHByaW50aW5nIGVudmlyb25tZW50LiAgU2ltaWxhcmx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBGRF9FU0Q9cG9ydCBvciBGRF9FU0Q9aG9zdDpwb3J0IGZvciBlc2Rkc3Agc291bmQKLSAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb24uICBTZXQgRkRfRVhUUkEgdG8gYSBjb21tYW5kIHRvIGJlIHJ1biBhCi0gICAgICAgICAgICAgICAgICAgICAgIGZldyBzZWNvbmRzIGFmdGVyIHRoZSBYIHNlcnZlciBzdGFydHMgdXAuICBTZXQgRkRfVEFHCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZXNzaW9uLCBpdCBpcyBzZXQgYXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgWCBwcm9wZXJ0eSwgdGhhdCBtYWtlcyBGSU5ERElTUExBWSBvbmx5IGZpbmQgc2Vzc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGF0IHRhZyB2YWx1ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZXQgRkRfWERNQ1BfSUYgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgbWFuYWdlciBpcyBydW5uaW5nIG9uOyBkZWZhdWx0IGlzICdsb2NhbGhvc3QnCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB5b3UgbWF5IG5lZWQgdG8gc2V0IGl0IHRvICc6OjEnIG9uIHNvbWUgSVB2NiBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbXMgb3IgbWlzY29uZmlndXJlZCBkaXNwbGF5IG1hbmFnZXJzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRoZSBGSU5EQ1JFQVRFRElTUExBWSBzZXNzaW9uIHRvIGNvbnRhY3QgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgWERNQ1AgbG9naW4gbWFuYWdlciAoeGRtL2dkbS9rZG0pIG9uIHRoZSBzYW1lIG1hY2hpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdXNlICJYdmZiLnhkbWNwIiBpbnN0ZWFkIG9mICJYdmZiIiwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc3VwcGx5IGhpcyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgb25lIG1vcmUgdGltZSAoYnV0IGhlIGdldHMgdG8gc2VsZWN0IGhpcyBkZXNrdG9wIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBjYW4gYmUgdXNlZnVsKS4gIEZvciB0aGlzIHRvIHdvcmssIHlvdSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gZW5hYmxlIGxvY2FsaG9zdCBYRE1DUCAodWRwIHBvcnQgMTc3KSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgbWFuYWdlci4gIFRoaXMgc2VlbXMgdG8gYmU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZG0gaW4gZ2RtLmNvbmY6ICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbeGRtY3BdCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2RtIGluIGtkbXJjOiAgICAgIEVuYWJsZT10cnVlIGluIHNlY3Rpb24gW1hkbWNwXQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHhkbSBpbiB4ZG0tY29uZmlnOiBEaXNwbGF5TWFuYWdlci5yZXF1ZXN0UG9ydDogMTc3Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBzaG9ydGhhbmQgb3B0aW9ucyBhYm92ZSAiLXN2YyIsICIteGRtc3ZjIgotICAgICAgICAgICAgICAgICAgICAgICBhbmQgIi1zc2h4ZG1zdmMiIHRoYXQgc3BlY2lmeSB0aGUgYWJvdmUgb3B0aW9ucyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgc29tZSB1c2VmdWwgY2FzZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHNldCB0aGUgZW52LiB2YXIgV0FJVEJHPTEgeDExdm5jIHdpbGwgZ28gaW50bwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBvbmNlIGxpc3RlbmluZyBpbiB3YWl0IG1vZGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBzcGVjaWFsIG1vZGUgaXMgRklORENSRUFURURJU1BMQVktWHZuYy5yZWRpcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgKG9yIEZJTkRESVNQTEFZLVh2bmMucmVkaXJlY3QpLiAgSW4gdGhpcyBjYXNlIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdXAgWHZuYyBhcyBhYm92ZSBpZiBuZWVkZWQsIGJ1dCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcgaXQgaW4gaXRzIG5vcm1hbCB3YXksIGl0IHNpbXBseSBkb2VzIGEgc29ja2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uIG9mIHRoZSBjb25uZWN0ZWQgVk5DIHZpZXdlciB0byB0aGUgWHZuYy4KLQotICAgICAgICAgICAgICAgICAgICAgICBTbyBpbiBYdm5jLnJlZGlyZWN0IHgxMXZuYyBkb2VzIG5vIFZOQyBidXQgbWVyZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycyB0aGUgZGF0YSBiYWNrIGFuZCBmb3J0aC4gIFRoaXMgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIGZhc3RlciB0aGVuIHgxMXZuYydzIHBvbGxpbmcgbWV0aG9kLCBidXQgbm90IGFzIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgY29ubmVjdGluZyBkaXJlY3RseSB0byB0aGUgWHZuYyB3aXRoIHRoZSBWTkMgVmlld2VyLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgaWRlYSBoZXJlIGlzIHRvIHRha2UgYWR2YW50YWdlIG9mIHgxMXZuYydzIGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZGluZy9jcmVhdGluZyBzY2hlbWUsIFNTTCwgYW5kIHBlcmhhcHMgYSBmZXcgb3RoZXJzLgotICAgICAgICAgICAgICAgICAgICAgICBNb3N0IG9mIHgxMXZuYydzIG9wdGlvbnMgZG8gbm90IGFwcGx5IGluIHRoaXMgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBYdm5jLnJlZGlyZWN0IHNob3VsZCBhbHNvIHdvcmsgZm9yIHRoZSB2bmMuc28gWCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGZvciB0aGUgaC93IGRpc3BsYXkgaG93ZXZlciBpdCB3aWxsIHdvcmsgb25seQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmluZGluZyB0aGUgZGlzcGxheSBhbmQgdGhlIHVzZXIgbXVzdCBhbHJlYWR5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZCBpbnRvIHRoZSBYIGNvbnNvbGUuCi0KLS12ZW5jcnlwdCBtb2RlICAgICAgICAgVGhlIFZlTkNyeXB0IGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93cwotICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgU1NML1RMUyBjb25uZWN0aW9ucy4gIElmIHRoZSAtc3NsIG1vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCwgdGhlbiBWZU5DcnlwdCBpcyBlbmFibGVkIGFzIHdlbGwgQlkgREVGQVVMVAotICAgICAgICAgICAgICAgICAgICAgICAodGhleSBib3RoIHVzZSBhIFNTTC9UTFMgdHVubmVsLCBvbmx5IHRoZSBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UgaXMgYSBsaXR0bGUgZGlmZmVyZW50LikKLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBjb250cm9sIHdoZW4gYW5kIGhvdyBWZU5DcnlwdCBpcyB1c2VkLCBzcGVjaWZ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHN0cmluZy4gIElmIG1vZGUgaXMgIm5ldmVyIiwgdGhlbiBWZU5DcnlwdCBpcwotICAgICAgICAgICAgICAgICAgICAgICBub3QgdXNlZC4gIElmIG1vZGUgaXMgInN1cHBvcnQiICh0aGUgZGVmYXVsdCkgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICBWZU5DcnlwdCBpcyBzdXBwb3J0ZWQuICBJZiBtb2RlIGlzICJvbmx5IiwgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2ltaWxhciBhbmQgb2xkZXIgQU5PTlRMUyBwcm90b2NvbCBpcyBub3Qgc2ltdWx0YW5lb3VzbHkKLSAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLiAgeDExdm5jJ3Mgbm9ybWFsIFNTTCBtb2RlICh2bmNzOi8vKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCB1bmRlciAtc3NsIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gImZvcmNlIi4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggIm5vZGg6IiwgdGhlbiBEaWZmaWUgSGVsbG1hbgotICAgICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXMga2V5IGV4Y2hhbmdlIGlzIGRpc2FibGVkLiAgSWYgbW9kZSBpcyBwcmVmaXhlZAotICAgICAgICAgICAgICAgICAgICAgICB3aXRoICJub3g1MDk6IiwgdGhlbiBYNTA5IGtleSBleGNoYW5nZSBpcyBkaXNhYmxlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBkaXNhYmxlIGFsbCBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIChzdXNjZXB0aWJsZSB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2spIHlvdSB3aWxsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcGx5ICItdmVuY3J5cHQgbm9kaDpzdXBwb3J0IC1hbm9udGxzIG5ldmVyIgotICAgICAgICAgICAgICAgICAgICAgICBvciAiLXZlbmNyeXB0IG5vZGg6b25seSIKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggIm5ld2RoOiIsIHRoZW4gbmV3IERpZmZpZQotICAgICAgICAgICAgICAgICAgICAgICBIZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZzogMS02MCBzZWNzOyBzZWUgLWRocGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgIGJlbG93IGZvciBhIGZhc3RlciB3YXkpIHJhdGhlciB0aGFuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHkKLSAgICAgICAgICAgICAgICAgICAgICAga25vd24gdmFsdWVzIGlzIG5vdCBrbm93biB0byBiZSBhIHNlY3VyaXR5IHByb2JsZW0uCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBhcHBsaWVzIHRvIEFOT05UTFMgYXMgd2VsbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBMb25nIGV4YW1wbGU6IC12ZW5jcnlwdCBuZXdkaDpub3g1MDk6c3VwcG9ydAotCi0gICAgICAgICAgICAgICAgICAgICAgIEFsc28sIGlmIG1vZGUgaXMgcHJlZml4ZWQgd2l0aCAicGxhaW46IiwgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICBpZiAtdW5peHB3IG1vZGUgaXMgYWN0aXZlIHRoZSBWZU5DcnlwdCAiKlBsYWluIgotICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZStwYXNzd2QgbWV0aG9kIGlzIGVuYWJsZWQgZm9yIFVuaXggbG9naW5zLgotICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgaW4gLXVuaXhwdyBtb2RlIHRoZSBub3JtYWwgbG9naW4gcGFuZWwgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91ICpNVVNUKiBzdXBwbHkgdGhlIC1zc2wgb3B0aW9uIGZvciBWZU5DcnlwdCB0bwotICAgICAgICAgICAgICAgICAgICAgICBiZSBhY3RpdmUuICBUaGUgLXZlbmNyeXB0IG9wdGlvbiBvbmx5IGZpbmUtdHVuZXMgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KLQotLWFub250bHMgbW9kZSAgICAgICAgICBUaGUgQU5PTlRMUyBleHRlbnNpb24gdG8gdGhlIFZOQyBwcm90b2NvbCBhbGxvd3MKLSAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIFNTTC9UTFMgY29ubmVjdGlvbnMuICBJZiB0aGUgLXNzbCBtb2RlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIHRoZW4gQU5PTlRMUyBpcyBlbmFibGVkIGFzIHdlbGwgQlkgREVGQVVMVAotICAgICAgICAgICAgICAgICAgICAgICAodGhleSBib3RoIHVzZSBhIFNTTC9UTFMgdHVubmVsLCBvbmx5IHRoZSBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UgaXMgYSBsaXR0bGUgZGlmZmVyZW50LikKLQotICAgICAgICAgICAgICAgICAgICAgICBBTk9OVExTIGlzIGFuIG9sZGVyIFNTTC9UTFMgbW9kZSBpbnRyb2R1Y2VkIGJ5IHZpbm8uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVmZXJyZWQgdG8gYXMgJ1RMUycgZm9yIGl0cyByZWdpc3RlcmVkIFZOQwotICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eS10eXBlIG5hbWUsIGJ1dCB3ZSB1c2UgdGhlIG1vcmUgZGVzY3JpcHRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgJ0FOT05UTFMnIGhlcmUgYmVjYXVzZSBpdCBwcm92aWRlcyBvbmx5IEFub255bW91cwotICAgICAgICAgICAgICAgICAgICAgICBEaWZmaWUtSGVsbG1hbiBlbmNyeXB0ZWQgY29ubmVjdGlvbnMsIGFuZCBoZW5jZSBubwotICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJpbGl0eSBmb3IgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gY29udHJvbCB3aGVuIGFuZCBob3cgQU5PTlRMUyBpcyB1c2VkLCBzcGVjaWZ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHN0cmluZy4gIElmIG1vZGUgaXMgIm5ldmVyIiwgdGhlbiBBTk9OVExTIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiAgSWYgbW9kZSBpcyAic3VwcG9ydCIgKHRoZSBkZWZhdWx0KSB0aGVuIEFOT05UTFMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLiAgSWYgbW9kZSBpcyAib25seSIsIHRoZW4gdGhlIHNpbWlsYXIKLSAgICAgICAgICAgICAgICAgICAgICAgVmVOQ3J5cHQgcHJvdG9jb2wgaXMgbm90IHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jJ3Mgbm9ybWFsIFNTTCBtb2RlICh2bmNzOi8vKSB3aWxsIGJlIHN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAgICB1bmRlciAtc3NsIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gImZvcmNlIi4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggIm5ld2RoOiIsIHRoZW4gbmV3IERpZmZpZQotICAgICAgICAgICAgICAgICAgICAgICBIZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZzogMS02MCBzZWNzOyBzZWUgLWRocGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgIGJlbG93IGZvciBhIGZhc3RlciB3YXkpIHJhdGhlciB0aGFuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHkKLSAgICAgICAgICAgICAgICAgICAgICAga25vd24gdmFsdWVzIGlzIG5vdCBrbm93biB0byBiZSBhIHNlY3VyaXR5IHByb2JsZW0uCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBhcHBsaWVzIHRvIFZlTkNyeXB0IGFzIHdlbGwuICBTZWUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mICJwbGFpbjoiIHVuZGVyIC12ZW5jcnlwdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBMb25nIGV4YW1wbGU6IC1hbm9udGxzIG5ld2RoOnBsYWluOnN1cHBvcnQKLQotICAgICAgICAgICAgICAgICAgICAgICBZb3UgKk1VU1QqIHN1cHBseSB0aGUgLXNzbCBvcHRpb24gZm9yIEFOT05UTFMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYmUgYWN0aXZlLiAgVGhlIC1hbm9udGxzIG9wdGlvbiBvbmx5IGZpbmUtdHVuZXMgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KLQotLXNzbG9ubHkgICAgICAgICAgICAgICBTYW1lIGFzOiAiLXZlbmNyeXB0IG5ldmVyIC1hbm9udGxzIG5ldmVyIiAgaS5lLiBpdAotICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlcyB0aGUgVmVOQ3J5cHQgYW5kIEFOT05UTFMgZW5jcnlwdGlvbiBtZXRob2RzCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBvbmx5IGFsbG93cyBzdGFuZGFyZCBTU0wgdHVubmVsaW5nLiAgWW91IG11c3QgYWxzbwotICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgdGhlIC1zc2wgLi4uIG9wdGlvbiAoc2VlIGJlbG93LikKLQotCi0tZGhwYXJhbXMgZmlsZSAgICAgICAgIEZvciBzb21lIG9wZXJhdGlvbnMgYSBzZXQgb2YgRGlmZmllIEhlbGxtYW4gcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAocHJpbWUgYW5kIGdlbmVyYXRvcikgaXMgbmVlZGVkLiAgSWYgc28sIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiAiZmlsZSIuIEluIHBhcnRpY3VsYXIsIHRoZSBWZU5DcnlwdCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgQU5PTlRMUyBhbm9ueW1vdXMgREggbW9kZSBuZWVkIHRoZW0uICBCeSBkZWZhdWx0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgc2V0IGlzIHVzZWQuIElmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGF0IHlvdQotICAgICAgICAgICAgICAgICAgICAgICBjYW4gc3BlY2lmeSAibmV3ZGg6IiB0byB0aGUgLXZlbmNyeXB0IGFuZCAtYW5vbnRscwotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHRvIGdlbmVyYXRlIGEgbmV3IHNldCBlYWNoIHNlc3Npb24uICBJZiB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIGlzIHRvbyBzbG93IGZvciB5b3UsIHVzZSAtZGhwYXJhbXMgZmlsZSB0byBhIHNldCB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBtYW51YWxseSB2aWEgIm9wZW5zc2wgZGhwYXJhbSAtb3V0IGZpbGUgMTAyNCIKLQotLW5vc3NsICAgICAgICAgICAgICAgICBEaXNhYmxlIHRoZSAtc3NsIG9wdGlvbiAoc2VlIGJlbG93KS4gU2luY2UgLXNzbCBpcyBvZmYKLSAgICAgICAgICAgICAgICAgICAgICAgYnkgZGVmYXVsdCAtbm9zc2wgd291bGQgb25seSBiZSB1c2VkIG9uIHRoZSBjb21tYW5kbGluZQotICAgICAgICAgICAgICAgICAgICAgICB0byB1bnNldCBhbnkgKmVhcmxpZXIqIC1zc2wgb3B0aW9uIChvciAtc3ZjLi4uKQotCi0tc3NsIFtwZW1dICAgICAgICAgICAgIFVzZSB0aGUgb3BlbnNzbCBsaWJyYXJ5ICh3d3cub3BlbnNzbC5vcmcpIHRvIHByb3ZpZGUgYQotICAgICAgICAgICAgICAgICAgICAgICBidWlsdC1pbiBlbmNyeXB0ZWQgU1NML1RMUyB0dW5uZWwgYmV0d2VlbiBWTkMgdmlld2VycwotICAgICAgICAgICAgICAgICAgICAgICBhbmQgeDExdm5jLiAgVGhpcyByZXF1aXJlcyBsaWJzc2wgc3VwcG9ydCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZCBpbnRvIHgxMXZuYyBhdCBidWlsZCB0aW1lLiAgSWYgeDExdm5jIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICBidWlsdCB3aXRoIGxpYnNzbCBzdXBwb3J0IGl0IHdpbGwgZXhpdCBpbW1lZGlhdGVseSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIC1zc2wgaXMgcHJlc2NyaWJlZC4gIFNlZSB0aGUgLXN0dW5uZWwgb3B0aW9uIGJlbG93IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBhbiBhbHRlcm5hdGl2ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk5DIFZpZXdlci1zaWRlIG5lZWRzIHRvIHN1cHBvcnQgU1NML1RMUyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhpcyBVUkwgYW5kIGFsc28gdGhlIGRpc2N1c3Npb24gYmVsb3cgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZWFzIG9uIGhvdyB0byBlbmFibGUgU1NMIHN1cHBvcnQgZm9yIHRoZSB2aWV3ZXI6Ci0gICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC10dW4KLSAgICAgICAgICAgICAgICAgICAgICAgbmVsLXZpZXdlcnMgLiAgeDExdm5jIHByb3ZpZGVzIGFuIFNTTCBlbmFibGVkIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgdmlld2VyIGFwcGxldCBpbiB0aGUgY2xhc3Nlcy9zc2wgZGlyZWN0b3J5ICgtaHR0cCBvcgotICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciBvcHRpb25zLikgIFRoZSBTU1ZOQyB2aWV3ZXIgcGFja2FnZSBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICBTU0wgdHVubmVscyB0b28uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIFZOQyBWaWV3ZXIgc3VwcG9ydHMgVmVOQ3J5cHQgb3IgQU5PTlRMUyAodmlubydzCi0gICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24gbW9kZSkgdGhleSBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIC1zc2wKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAoc2VlIHRoZSAtdmVuY3J5cHQgYW5kIC1hbm9udGxzIG9wdGlvbnMgZm9yIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5mbzsgdXNlIC1zc2xvbmx5IHRvIGRpc2FibGUgYm90aCBvZiB0aGVtLikKLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgIi1zc2wgL3BhdGgvdG8vbXljZXJ0LnBlbSIgdG8gc3BlY2lmeSBhbiBTU0wKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgZmlsZSBpbiBQRU0gZm9ybWF0IHRvIHVzZSB0byBpZGVudGlmeSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBhIGtleSBmb3IgdGhpcyBzZXJ2ZXIuICBTZWUgb3BlbnNzbCgxKSBmb3IgbW9yZQotICAgICAgICAgICAgICAgICAgICAgICBpbmZvIGFib3V0IFBFTXMgYW5kIHRoZSAtc3NsR2VuQ2VydCBhbmQgIi1zc2wgU0FWRSIKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBiZWxvdyBmb3IgaG93IHRvIGNyZWF0ZSB0aGVtLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb25uZWN0aW5nIFZOQyB2aWV3ZXIgU1NMIHR1bm5lbCBjYW4gKGF0IGl0cyBvcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGlzIHNlcnZlciBpZiBpdCBoYXMgdGhlIHB1YmxpYyBrZXkgcGFydAotICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2VydGlmaWNhdGUgKG9yIGEgY29tbW9uIGNlcnRpZmljYXRlIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0EsIGlzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHdheSB0byB2ZXJpZnkgdGhpcyBzZXJ2ZXIncwotICAgICAgICAgICAgICAgICAgICAgICBjZXJ0LCBzZWUgLXNzbEdlbkNBIGJlbG93KS4gIFRoaXMgYXV0aGVudGljYXRpb24gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgZG9uZSB0byBwcmV2ZW50IE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuICBPdGhlcndpc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBWTkMgdmlld2VyIHNpbXBseSBhY2NlcHRzIHRoaXMgc2VydmVyJ3Mga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgIFdJVEhPVVQgdmVyaWZpY2F0aW9uLCB0aGUgdHJhZmZpYyBpcyBwcm90ZWN0ZWQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICBwYXNzaXZlIHNuaWZmaW5nIG9uIHRoZSBuZXR3b3JrLCBidXQgKk5PVCogZnJvbQotICAgICAgICAgICAgICAgICAgICAgICBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiBUaGVyZSBhcmUgaGFja2VyIHRvb2xzCi0gICAgICAgICAgICAgICAgICAgICAgIGxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4gdGhhdCBpbXBsZW1lbnQgU1NMCi0gICAgICAgICAgICAgICAgICAgICAgIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgZW1wdHkgb3IgdGhlIHN0cmluZyAiU0FWRSIgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNzbCgxKSBjb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIHRvIGdlbmVyYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSB0aGUgZmlyc3QgdGltZS4gIEEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIChzZWUgLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydCBmb3IgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5LikgIEl0IHdpbGwgYmUgc2F2ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGUgfi8udm5jL2NlcnRzL3NlcnZlci5wZW0uICBPbiBzdWJzZXF1ZW50IGNhbGxzIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHVzZWQgZGlyZWN0bHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlICJTQVZFX05PUFJPTVBUIiB0byBhdm9pZCBiZWluZyBwcm9tcHRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0IHRoZSBnZW5lcmF0ZWQga2V5IHdpdGggYSBwYXNzcGhyYXNlLiAgSG93ZXZlciBpbgotICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgYW5kIC1iZyBtb2RlcyB0aGVyZSB3aWxsIGJlIG5vIHByb21wdGluZyBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICBwYXNzcGhyYXNlIGluIGVpdGhlciBjYXNlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzICJTQVZFX1BST01QVCIgdGhlIHNlcnZlci5wZW0gY2VydGlmaWNhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHlvdXIgYW5zd2VycyB0byBpdHMgcHJvbXB0cyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgYWxsIGluZm8gc3VjaCBhcyBPcmdhbml6YXRpb25hbE5hbWUsIENvbW1vbk5hbWUsIGV0Yy4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgIlNBVkUtPHN0cmluZz4iIGFuZCAiU0FWRV9QUk9NUFQtPHN0cmluZz4iCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHJlZmVyIHRvIHRoZSBmaWxlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItPHN0cmluZz4ucGVtCi0gICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgKGl0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QpLiAgRS5nLiAiU0FWRS1jaGFybGllIiB3aWxsIHN0b3JlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItY2hhcmxpZS5wZW0KLQotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczogeDExdm5jIC1zc2wgU0FWRSAtZGlzcGxheSA6MCAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIFNBVkUtc29tZW90aGVyIC1kaXNwbGF5IDowIC4uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzICJUTVAiIGFuZCB0aGUgb3BlbnNzbCgxKSB1dGlsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZXhpc3RzIGluIFBBVEgsIHRoZW4gYSB0ZW1wb3JhcnksIHNlbGYtc2lnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHNlc3Npb24uICBJZgotICAgICAgICAgICAgICAgICAgICAgICBvcGVuc3NsKDEpIGNhbm5vdCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgdGVtcG9yYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHgxMXZuYyBleGl0cyBpbW1lZGlhdGVseS4gIFRoZSB0ZW1wb3JhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydCB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHgxMXZuYyBleGl0cy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBzdWNjZXNzZnVsIGluIHVzaW5nIG9wZW5zc2woMSkgdG8gZ2VuZXJhdGUgYQotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgY2VydGlmaWNhdGUgaW4gIlNBVkUiIG9yICJUTVAiIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGVzLCB0aGUgcHVibGljIHBhcnQgb2YgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gc3RkZXJyCi0gICAgICAgICAgICAgICAgICAgICAgIChlLmcuIG9uZSBjb3VsZCBjb3B5IGl0IHRvIHRoZSBjbGllbnQtc2lkZSB0byBwcm92aWRlCi0gICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBzZXJ2ZXIgdG8gVk5DIHZpZXdlcnMuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEluICJUTVAiIG1vZGUsIHVubGVzcyB5b3Ugc2FmZWx5IGNvcHkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBwYXJ0IG9mIHRoZSB0ZW1wb3JhcnkgQ2VydCB0byB0aGUgdmlld2VyIGZvcgotICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUgKmV2ZXJ5IHRpbWUqICh1bmxpa2VseS4uLiksIHRoZW4gb25seQotICAgICAgICAgICAgICAgICAgICAgICBwYXNzaXZlIHNuaWZmaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZCBhbmQgeW91IGFyZQotICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBvcGVuIHRvIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuICBUaGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHdoeSB0aGUgZGVmYXVsdCAiU0FWRSIgbW9kZSBpcyBwcmVmZXJyZWQgKGFuZCBtb3JlCi0gICAgICAgICAgICAgICAgICAgICAgIHNvcGhpc3RpY2F0ZWQgQ0EgbW9kZSB0b28pLiAgT25seSB3aXRoIHNhdmVkIGtleXMgQU5ECi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBWTkMgdmlld2VyIGF1dGhlbnRpY2F0aW5nIHRoZW0gKHZpYSB0aGUgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlKSwgYXJlIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MgcHJldmVudGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzICJBTk9OIiB0aGVuIHRoZSBEaWZmaWUtSGVsbG1hbiBhbm9ueW1vdXMKLSAgICAgICAgICAgICAgICAgICAgICAga2V5IGV4Y2hhbmdlIG1ldGhvZCBpcyB1c2VkLiAgSW4gdGhpcyBtb2RlIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZSAqbm8qIFNTTCBjZXJ0aWZpY2F0ZXMgYW5kIHNvIGl0IGlzIG5vdCBwb3NzaWJsZQotICAgICAgICAgICAgICAgICAgICAgICB0byBhdXRoZW50aWNhdGUgZWl0aGVyIHRoZSBWTkMgc2VydmVyIG9yIFZOQyBjbGllbnQuCi0gICAgICAgICAgICAgICAgICAgICAgIFRodXMgb25seSBwYXNzaXZlIG5ldHdvcmsgc25pZmZpbmcgYXR0YWNrcyBhcmUgYXZvaWRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlICJBTk9OIiBtZXRob2QgaXMgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNrcy4gICJBTk9OIiBpcyBub3QgcmVjb21tZW5kZWQ7IGluc3RlYWQgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIGEgU1NMIFBFTSB5b3UgY3JlYXRlZCBvciB0aGUgZGVmYXVsdCAiU0FWRSIgbWV0aG9kLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNlZSAtc3NsZGlyIGJlbG93IHRvIHVzZSBhIGRpcmVjdG9yeSBiZXNpZGVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IH4vLnZuYy9jZXJ0cwotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdXIgeDExdm5jIGJpbmFyeSB3YXMgbm90IGNvbXBpbGVkIHdpdGggT3BlblNTTAotICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHN1cHBvcnQsIHVzZSBvZiB0aGUgLXNzbCBvcHRpb24gd2lsbCBpbmR1Y2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIGZhaWx1cmUgYW5kIGV4aXQuICBGb3Igc3VjaCBiaW5hcmllcywgY29uc2lkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIC1zdHVubmVsIG9wdGlvbiBmb3IgU1NMIGVuY3J5cHRlZCBjb25uZWN0aW9ucy4KLQotICAgICAgICAgICAgICAgICAgICAgICBNaXNjIEluZm86IEluIHRlbXBvcmFyeSBjZXJ0IGNyZWF0aW9uIG1vZGUgIlRNUCIsIHNldAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW52LiB2YXIuIFgxMVZOQ19TSE9XX1RNUF9QRU09MSB0byBoYXZlIHgxMXZuYyBwcmludAotICAgICAgICAgICAgICAgICAgICAgICBvdXQgdGhlIGVudGlyZSBjZXJ0aWZpY2F0ZSwgaW5jbHVkaW5nIHRoZSBQUklWQVRFIEtFWQotICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LCB0byBzdGRlcnIuICBUaGVyZSBhcmUgYmV0dGVyIHdheXMgdG8gZ2V0L3NhdmUgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBpbmZvLiAgU2VlICJTQVZFIiBhYm92ZSBhbmQgIi1zc2xHZW5DZXJ0IiBiZWxvdy4KLQotLXNzbHRpbWVvdXQgbiAgICAgICAgICBTZXQgU1NMIHJlYWQgdGltZW91dCB0byBuIHNlY29uZHMuICBJbiBzb21lIHNpdHVhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gYW4gaWNvbmlmaWVkIHZpZXdlciBpbiBXaW5kb3dzKSB0aGUgdmlld2VyIHN0b3BzCi0gICAgICAgICAgICAgICAgICAgICAgIHRhbGtpbmcgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYWZ0ZXIgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAoMjVzIGZvciBhYm91dCB0aGUgZmlyc3QgbWludXRlLCA0MzIwMHMgbGF0ZXIpLgotICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gemVybyB0byBwb2xsIGZvcmV2ZXIuICBTZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIGJ1aWx0aW4gc2V0dGluZy4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIE5PVCBhcHBseSB0byB0aGUgKmluaXRpYWwqIHNzbAotICAgICAgICAgICAgICAgICAgICAgICBpbml0IGNvbm5lY3Rpb24uICBUaGUgZGVmYXVsdCB0aW1lb3V0IGZvciB0aGF0IGlzIDIwc2VjLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgLWVudiBTU0xfSU5JVF9USU1FT1VUPW4gdG8gbW9kaWZ5IGl0LgotCi0tc3Nsbm9mYWlsICAgICAgICAgICAgIEV4aXQgYXQgdGhlIGZpcnN0IFNTTCBjb25uZWN0aW9uIGZhaWx1cmUuIFVzZWZ1bCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZyBTU0wgY29ubmVjdGlvbnMgKGUuZy4geDExdm5jIGlzIHN0YXJ0ZWQgdmlhCi0gICAgICAgICAgICAgICAgICAgICAgIHNzaCkgYW5kIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgd2FpdGluZyBhcm91bmQgZm9yIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIHR5aW5nIHVwIHBvcnRzLCBldGMuCi0KLS1zc2xkaXIgZGlyICAgICAgICAgICAgVXNlICJkaXIiIGFzIGFuIGFsdGVybmF0ZSBzc2wgY2VydGlmaWNhdGUgYW5kIGtleQotICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IHRvcGxldmVsIGRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIH4vLnZuYy9jZXJ0cwotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGlyZWN0b3J5IGlzIHVzZWQgdG8gc3RvcmUgc2VydmVyIGFuZCBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYW5kIGFsc28gb3RoZXIgbWF0ZXJpYWxzLiAgRS5nLiBpbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2ltcGxlc3QgY2FzZSwgIi1zc2wgU0FWRSIgd2lsbCBzdG9yZSB0aGUgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciBjZXJ0IGluIGRpci9zZXJ2ZXIucGVtCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlIG9mIGFsdGVybmF0ZSBkaXJlY3RvcmllcyB2aWEgLXNzbGRpciBhbGxvd3MgeW91IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSBtdWx0aXBsZSBWTkMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkga2V5cy4KLSAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciB1c2UgaXMgaWYgfi8udm5jL2NlcnQgaXMgb24gYW4gTkZTIHNoYXJlIHlvdQotICAgICAgICAgICAgICAgICAgICAgICBtaWdodCB3YW50IHlvdXIgY2VydGlmaWNhdGVzIGFuZCBrZXlzIHRvIGJlIG9uIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbSB0byBwcmV2ZW50IG5ldHdvcmsgc25vb3BpbmcgKGZvciBleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIC1zc2xkaXIgL3Zhci9saWIveDExdm5jLWNlcnRzKS4KLQotICAgICAgICAgICAgICAgICAgICAgICAtc3NsZGlyIGFmZmVjdHMgbmVhcmx5IGFsbCBvZiB0aGUgb3RoZXIgLXNzbCogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAtc3NsIFNBVkUsIC1zc2xHZW5DZXJ0LCBldGMuLgotCi0tc3NsdmVyaWZ5IHBhdGggICAgICAgIEZvciBlaXRoZXIgb2YgdGhlIC1zc2wgb3IgLXN0dW5uZWwgbW9kZXMsIHVzZSAicGF0aCIKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBjZXJ0aWZpY2F0ZXMgdG8gYXV0aGVudGljYXRlIGluY29taW5nIFZOQwotICAgICAgICAgICAgICAgICAgICAgICAqQ2xpZW50KiBjb25uZWN0aW9ucyAobm9ybWFsbHkgb25seSB0aGUgc2VydmVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgaW4gU1NMLikgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVwbGFjZSBzdGFuZGFyZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBvZiBjbGllbnRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmICJwYXRoIiBpcyBhIGRpcmVjdG9yeSBpdCBjb250YWlucyB0aGUgY2xpZW50IChvciBDQSkKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzIGluIHNlcGFyYXRlIGZpbGVzLiAgSWYgcGF0aCBpcyBhIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcy4gU2VlIHNwZWNpYWwgdG9rZW5zCi0gICAgICAgICAgICAgICAgICAgICAgIGJlbG93LiAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgIkNBcGF0aCA9IGRpciIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICJDQWZpbGUgPSBmaWxlIiBzdHVubmVsIG9wdGlvbnMuICBTZWUgdGhlIHN0dW5uZWwoOCkKLSAgICAgICAgICAgICAgICAgICAgICAgbWFucGFnZSBmb3IgZGV0YWlscy4KLQotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgfi9teS5jcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgfi9teV9wZW1fZGlyLwotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpZiBwYXRoIGlzIGEgZGlyZWN0b3J5LCBpdCBtdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlcnRzIGluIHNlcGFyYXRlIGZpbGVzIG5hbWVkIGxpa2UgPEhBU0g+LjAsIHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiA8SEFTSD4gaXMgZm91bmQgYnkgcnVubmluZyB0aGUgY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAib3BlbnNzbCB4NTA5IC1oYXNoIC1ub291dCAtaW4gZmlsZS5jcnQiLiBFdmlkZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgb25lIHVzZXMgPEhBU0g+LjEgaWYgdGhlcmUgaXMgYSBjb2xsaXNpb24uLi4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGhlIGtleS1tYW5hZ2VtZW50IHV0aWxpdHkgIi1zc2xDZXJ0SW5mbyBIQVNIT04iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAiLXNzbENlcnRJbmZvIEhBU0hPRkYiIHdpbGwgY3JlYXRlL2RlbGV0ZSB0aGVzZQotICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5ICh2aWEgc3ltbGluaykgaW4gdGhlIEhBU0gKLSAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlycyBpdCBtYW5hZ2VzLiAgVGhlbiB5b3UgY2FuIHBvaW50IC1zc2x2ZXJpZnkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIEhBU0ggc3ViZGlyLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWwgdG9rZW5zOiBpbiAtc3NsIG1vZGUsIGlmICJwYXRoIiBpcyBub3QgYSBmaWxlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIGEgZGlyZWN0b3J5LCBpdCBpcyB0YWtlbiBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRva2VucyB0aGF0IGFyZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGEgdG9rZW4gaXMgIkNBIiB0aGF0IG1lYW5zIGxvYWQgdGhlIENBL2NhY2VydC5wZW0KLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBmcm9tIHRoZSBzc2wgZGlyZWN0b3J5LiAgSWYgYSB0b2tlbiBpcyAiY2xpZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhbGwgdGhlIGZpbGVzIGNsaWVudHMvKi5jcnQgaW4gdGhlIHNzbCBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIGxvYWRlZC4gIE90aGVyd2lzZSB0aGUgZmlsZSBjbGllbnRzL3Rva2VuLmNydAotICAgICAgICAgICAgICAgICAgICAgICBpcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkLiAgQXMgYSBrbHVkZ2UsIHVzZSBhIHRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgIGxpa2UgLi4vc2VydmVyLWZvbyB0byBsb2FkIGEgc2VydmVyIGNlcnQgaWYgeW91IGZpbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBuZWNlc3NhcnkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1zc2xkaXIgdG8gdXNlIGEgZGlyZWN0b3J5IGRpZmZlcmVudCBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB+Ly52bmMvY2VydHMgZGVmYXVsdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgdGhlICJDQSIgY2VydCBpcyBsb2FkZWQgeW91IGRvIG5vdCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGxvYWQgYW55IG9mIHRoZSBjZXJ0cyB0aGF0IGhhdmUgYmVlbiBzaWduZWQgYnkgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gbG9hZCBhbnkgYWRkaXRpb25hbCBzZWxmLXNpZ25lZCBjZXJ0cwotICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2wgLXNzbHZlcmlmeSBDQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2wgLXNzbHZlcmlmeSBzZWxmOmZyZWQsc2VsZjpqaW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgQ0EsY2xpZW50cwotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzdWFsbHkgIi1zc2x2ZXJpZnkgQ0EiIGlzIHRoZSBtb3N0IGVmZmVjdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSAtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0IG9wdGlvbnMgYmVsb3cgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGhvdyB0byBzZXQgdXAgYW5kIG1hbmFnZSB0aGUgQ0EgZnJhbWV3b3JrLgotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiB0aGUgZm9sbG93aW5nIHV0aWxpdGllcywgLXNzbEdlbkNBLCAtc3NsR2VuQ2VydCwKLSAgICAgICAgICAgICAgICAgICAgICAgLXNzbEVuY0tleSwgLXNzbENlcnRJbmZvLCBhbmQgLXNzbENSTCBhcmUgcHJvdmlkZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbmVzcywgYnV0IGZvciBjYXN1YWwgdXNhZ2UgdGhleSBhcmUgb3ZlcmtpbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhleSBwcm92aWRlIFZOQyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBrZXkgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlcnZlciAvIGNsaWVudCBrZXkgZ2VuZXJhdGlvbiBhbmQgc2lnbmluZy4gIFNvIHRoZXkKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBhIGJhc2ljIFB1YmxpYyBLZXkgbWFuYWdlbWVudCBmcmFtZXdvcmsgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIFZOQy1pbmcgd2l0aCB4MTF2bmMuIChub3RlIHRoYXQgdGhleSByZXF1aXJlIG9wZW5zc2woMSkKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIHNpbXBsZXN0IHVzYWdlIG1vZGUsICItc3NsIFRNUCIgKHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBpdHMgb3duLCBzZWxmLXNpZ25lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5IGtleSBhbmQgdGhlIFZOQyB2aWV3ZXJzIGFsd2F5cyBhY2NlcHQgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gYWNjZXB0aW5nIHZpYSBhIGRpYWxvZyBib3gpIGlzIHByb2JhYmx5IHNhZmUgZW5vdWdoCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3N0IHNjZW5hcmlvcy4gIENBIG1hbmFnZW1lbnQgaXMgbm90IG5lZWRlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBwcm90ZWN0IGFnYWluc3QgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcyB0aGUgIlRNUCIKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBjYW4gYmUgaW1wcm92ZWQgYnkgdXNpbmcgIi1zc2wgU0FWRSIgKHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIi1zc2wiLCBpLmUuIHRoZSBkZWZhdWx0KSB0byBoYXZlIHgxMXZuYyBjcmVhdGUgYQotICAgICAgICAgICAgICAgICAgICAgICBsb25nZXIgdGVybSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSwgYW5kIHRoZW4gKHNhZmVseSkKLSAgICAgICAgICAgICAgICAgICAgICAgY29weSB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5IGNlcnQgdG8gdGhlIGRlc2lyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IG1hY2hpbmVzIChjYXJlIG11c3QgYmUgdGFrZW4gdGhlIHByaXZhdGUga2V5IHBhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHN0b2xlbjsgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgcGFzc3BocmFzZSkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU28ga2VlcCBpbiBtaW5kIG5vIENBIGtleSBjcmVhdGlvbiBvciBtYW5hZ2VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICgtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0KSBpcyBuZWVkZWQgZm9yIGVpdGhlciBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGNvbW1vbiB1c2FnZSBtb2Rlcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBPbmUgbWlnaHQgd2FudCB0byB1c2UgLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydAotICAgICAgICAgICAgICAgICAgICAgICBpZiB5b3UgaGFkIGEgbGFyZ2UgbnVtYmVyIG9mIFZOQyBjbGllbnQgYW5kIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc3RhdGlvbnMuICBUaGF0IHdheSB0aGUgYWRtaW5pc3RyYXRvciBjb3VsZCBnZW5lcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSBDQSBrZXkgd2l0aCAtc3NsR2VuQ0EgYW5kIGRpc3RyaWJ1dGUgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHBhcnQgdG8gYWxsIG9mIHRoZSB3b3Jrc3RhdGlvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTmV4dCwgaGUgY291bGQgY3JlYXRlIHNpZ25lZCBWTkMgc2VydmVyIGtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgKC1zc2xHZW5DZXJ0IHNlcnZlciAuLi4pIGZvciBlYWNoIHdvcmtzdGF0aW9uIG9yIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGVuIHgxMXZuYyB3b3VsZCB1c2UgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0bwotICAgICAgICAgICAgICAgICAgICAgICBhbnkgVk5DIGNsaWVudCB0aGF0IGhhcyB0aGUgQ0EgY2VydC4KLQotICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbGx5LCB0aGUgYWRtaW4gY291bGQgYWxzbyBtYWtlIGl0IHNvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50cyB0aGVtc2VsdmVzIGFyZSBhdXRoZW50aWNhdGVkIHRvIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICAoLXNzbEdlbkNlcnQgY2xpZW50IC4uLikgIEZvciB0aGlzIC1zc2x2ZXJpZnkgd291bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCB0byB0aGUgQ0EgY2VydCAoYW5kL29yIHNlbGYtc2lnbmVkIGNlcnRzKS4KLQotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2lsbCBiZSBhYmxlIHRvIHVzZSBhbGwgb2YgdGhlc2UgY2VydCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAga2V5IGZpbGVzLiAgT24gdGhlIFZOQyBjbGllbnQgc2lkZSwgdGhleSB3aWxsIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYmUgImltcG9ydGVkIiBzb21laG93LiAgV2ViIGJyb3dzZXJzIGhhdmUgIk1hbmFnZQotICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZXMiIGFjdGlvbnMgYXMgZG9lcyB0aGUgSmF2YSBhcHBsZXQgcGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgUGFuZWwuICBzdHVubmVsIGNhbiBhbHNvIHVzZSB0aGVzZSBmaWxlcyAoc2VlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzc192bmN2aWV3ZXIgZXhhbXBsZSBzY3JpcHQgaW4gdGhlIEZBUSBhbmQgU1NWTkMuKQotCi0tc3NsQ1JMIHBhdGggICAgICAgICAgIFNldCB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0cyAoQ1JMKSB0byAicGF0aCIuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBhcHBsaWVzIGZvciBib3RoIC1zc2wgYW5kIC1zdHVubmVsIG1vZGVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHBhdGggaXMgYSBmaWxlLCB0aGUgZmlsZSBjb250YWlucyBvbmUgb3IgbW9yZSBDUkxzCi0gICAgICAgICAgICAgICAgICAgICAgIGluIFBFTSBmb3JtYXQuICBJZiBwYXRoIGlzIGEgZGlyZWN0b3J5LCBpdCBjb250YWlucwotICAgICAgICAgICAgICAgICAgICAgICBoYXNoIG5hbWVkIGZpbGVzIG9mIENSTHMgaW4gdGhlIHVzdWFsIE9wZW5TU0wgbWFubmVyLgotICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIE9wZW5TU0wgYW5kIHN0dW5uZWwoOCkgZG9jdW1lbnRhdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpZiAtc3NsdmVyaWZ5IGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkOiBpdCBjaGVja3MgZm9yIHJldm9jYXRpb24gYWxvbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIGNoYWluIHVzZWQgdG8gdmVyaWZ5IHRoZSBWTkMgY2xpZW50LgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgLXNzbENSTCBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCB3aGVuIC1zc2x2ZXJpZnkgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IHNwZWNpZmllZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgYSBDUkwncyBleHBpcmF0aW9uIGRhdGUgaGFzIHBhc3NlZCwgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTCBjb25uZWN0aW9ucyB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiBpZiB0aGV5IGFyZQotICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkIHRvIHRoZSBzdWJqZWN0IG9mIHRoZSBDUkwgb3Igbm90LgotCi0gICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmFyZWx5IHdpbGwgb25lJ3MgeDExdm5jIC1zc2wgaW5mcmFzdHJ1Y3R1cmUgYmUgc28KLSAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2UgdGhhdCB0aGlzIG9wdGlvbiB3b3VsZCBiZSB1c2VmdWwgKHNpbmNlIG5vcm1hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgLXNzbHZlcmlmeSBmaWxlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBzaG91bGQgYmUgZW5vdWdoLikgIEhvd2V2ZXIsIHdoZW4gdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHdpdGggYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKHNlZSAtc3NsR2VuQ0EpCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGF1dGhlbnRpY2F0ZSBDbGllbnRzIHZpYSBTU0wvVExTLCB0aGUgLXNzbENSTCBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWZ1bCB0byByZXZva2UgdXNlcnMnIGNlcnRzIHdob3NlIHByaXZhdGUgU1NMCi0gICAgICAgICAgICAgICAgICAgICAgIGtleXMgd2VyZSBsb3N0IG9yIHN0b2xlbiAoZS5nLiBsYXB0b3AuKSAgVGhpcyB3YXkgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgQ0EgY2VydCtrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBuZXcgc2lnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCBrZXlzIGdlbmVyYXRlZCBhbmQgZGlzdHJpYnV0ZWQgdG8gYWxsIHVzZXJzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIENSTCBmaWxlIHdpdGggcmV2b2tlZCBjZXJ0aWZpY2F0ZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzICdvcGVuc3NsIGNhIC1yZXZva2UgLi4uJyBhbmQgJ29wZW5zc2wgY2EKLSAgICAgICAgICAgICAgICAgICAgICAgLWdlbmNybCAuLi4nIGFyZSB1c2VmdWwuICAoUnVuIHRoZW0gaW4gfi8udm5jL2NlcnRzKQotCi0tc3NsR2VuQ0EgW2Rpcl0gICAgICAgIEdlbmVyYXRlIHlvdXIgb3duIENlcnRpZmljYXRlIEF1dGhvcml0eSBwcml2YXRlIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUsIGFuZCBvdGhlciBmaWxlcyBpbiBkaXJlY3RvcnkgW2Rpcl0uCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB0aGVuIGV4aXRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIFtkaXJdIGlzIG5vdCBzdXBwbGllZCwgYSAtc3NsZGlyIHNldHRpbmcgaXMgdXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgb3Igb3RoZXJ3aXNlIH4vLnZuYy9jZXJ0cyBpcyB1c2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29tbWFuZCBhbHNvIGNyZWF0ZXMgZGlyZWN0b3JpZXMgd2hlcmUgc2VydmVyIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgY2VydHMgYW5kIGtleXMgd2lsbCBiZSBzdG9yZWQuICBUaGUgb3BlbnNzbCgxKQotICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICBpbiBQQVRILgotCi0gICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoZSBDQSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBjb21tYW5kIGV4aXRzOyB0aGUgVk5DIHNlcnZlciBpcyBub3QgcnVuLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBpbmZvcm1hdGlvbiB0byBwdXQgaW50byB0aGUgQ0EKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUuICBUaGUgaW5mbyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFjY3VyYXRlIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgbG9uZyBhcyBjbGllbnRzIGFjY2VwdCB0aGUgY2VydCBmb3IgVk5DIGNvbm5lY3Rpb25zLgotICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGEgcGFzc3BocmFzZSBvZiBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgICA0IGNoYXJhY3RlcnMgZm9yIHRoZSBDQSBwcml2YXRlIGtleS4KLQotICAgICAgICAgICAgICAgICAgICAgICBPbmNlIHlvdSBoYXZlIGdlbmVyYXRlZCB0aGUgQ0EgeW91IGNhbiBkaXN0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgIGl0cyBjZXJ0aWZpY2F0ZSBwYXJ0LCBbZGlyXS9DQS9jYWNlcnQucGVtLCB0byBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc3RhdGlvbnMgd2hlcmUgVk5DIHZpZXdlcnMgd2lsbCBiZSBydW4uICBPbmUgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvICJpbXBvcnQiIHRoaXMgY2VydGlmaWNhdGUgaW4gdGhlIGFwcGxpY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBXZWIgYnJvd3NlciwgSmF2YSBhcHBsZXQgcGx1Z2luLCBzdHVubmVsLCBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgIE5leHQsIHlvdSBjYW4gY3JlYXRlIGFuZCBzaWduIGtleXMgdXNpbmcgdGhlIENBIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1zc2xHZW5DZXJ0IG9wdGlvbiBiZWxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEdlbkNBICB+L215Q0FkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xkaXIgfi9teUNBZGlyIC1zc2xHZW5DQQotCi0gICAgICAgICAgICAgICAgICAgICAgICh0aGUgbGFzdCB0d28gbGluZXMgYXJlIGVxdWl2YWxlbnQpCi0KLS1zc2xHZW5DZXJ0IHR5cGUgbmFtZSAgR2VuZXJhdGUgYSBWTkMgc2VydmVyIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZQotICAgICAgICAgICAgICAgICAgICAgICBrZXkgcGFpciBzaWduZWQgYnkgdGhlIENBIGNyZWF0ZWQgcHJldmlvdXNseSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIC1zc2xHZW5DQS4gIFRoZSBvcGVuc3NsKDEpIHByb2dyYW0gbXVzdCBiZSBpbnN0YWxsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIGluIFBBVEguCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgdGhlIENlcnRpZmljYXRlIGlzIGdlbmVyYXRlZCB4MTF2bmMgZXhpdHM7IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBWTkMgc2VydmVyIGlzIG5vdCBydW4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2Yga2V5IHRvIGJlIGdlbmVyYXRlZCBpcyB0aGUgc3RyaW5nICJ0eXBlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgZWl0aGVyICJzZXJ2ZXIiIChpLmUuIGZvciB1c2UgYnkgeDExdm5jKSBvcgotICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IiAoZm9yIGEgVk5DIHZpZXdlcikuICBOb3RlIHRoYXQgdHlwaWNhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgIG9ubHkgInNlcnZlciIgaXMgdXNlZDogdGhlIFZOQyBjbGllbnRzIGF1dGhlbnRpY2F0ZQotICAgICAgICAgICAgICAgICAgICAgICB0aGVtc2VsdmVzIGJ5IGEgbm9uLXB1YmxpYy1rZXkgbWV0aG9kIChlLmcuIFZOQyBvcgotICAgICAgICAgICAgICAgICAgICAgICB1bml4IHBhc3N3b3JkKS4gICJ0eXBlIiBpcyByZXF1aXJlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbiBhcmJpdHJhcnkgZGVmYXVsdCBuYW1lIHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXkgaXMgc3VwcGxpZWQgYnkgdGhlICJuYW1lIiBzdHJpbmcuICBZb3UgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSBpdCBhdCB0aGUgdmFyaW91cyBwcm9tcHRzIHdoZW4gY3JlYXRpbmcgdGhlIGtleS4KLSAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiIGlzIG9wdGlvbmFsLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIG5hbWUgaXMgbGVmdCBibGFuayBmb3IgY2xpZW50cyBrZXlzIHRoZW4gIm5vYm9keSIKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gIElmIGxlZnQgYmxhbmsgZm9yIHNlcnZlciBrZXlzLCB0aGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5IHNlcnZlciBrZXk6ICJzZXJ2ZXIucGVtIiBpcyBjcmVhdGVkICh0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYXZlZCBvbmUgcmVmZXJlbmNlZCBieSAiLXNzbCBTQVZFIiB3aGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgaXMgc3RhcnRlZCkKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiAibmFtZSIgYmVnaW5zIHdpdGggdGhlIHN0cmluZyAic2VsZjoiIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIGluc3RlYWQgb2Ygb25lCi0gICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBieSB5b3VyIENBIGtleS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiAibmFtZSIgYmVnaW5zIHdpdGggdGhlIHN0cmluZyAicmVxOiIgdGhlbiBvbmx5IGEKLSAgICAgICAgICAgICAgICAgICAgICAga2V5ICgua2V5KSBhbmQgYSBjZXJ0aWZpY2F0ZSBzaWduaW5nICpyZXF1ZXN0KiAoLnJlcSkKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gIFlvdSBjYW4gdGhlbiBzZW5kIHRoZSAucmVxIGZpbGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYW4gZXh0ZXJuYWwgQ0EgKGV2ZW4gYSBwcm9mZXNzaW9uYWwgb25lLCBlLmcuIFRoYXd0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gY29tYmluZSB0aGUgLmtleSBhbmQgdGhlIHJlY2VpdmVkIGNlcnQgaW50bwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgLnBlbSBmaWxlIHdpdGggdGhlIHNhbWUgYmFzZW5hbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gInNlcnZlciIgYW5kICJjbGllbnQiIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHNpbXBseSB0aGUgY2hvaWNlIG9mIG91dHB1dCBmaWxlbmFtZXMgYW5kIHN1Yi1kaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFrZXMgaXQgc28gdGhlIC1zc2wgU0FWRS1uYW1lIG9wdGlvbiBjYW4gZWFzaWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHBpY2sgdXAgdGhlIHgxMXZuYyBQRU0gZmlsZSB0aGlzIG9wdGlvbiBnZW5lcmF0ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIEFuZCBzaW1pbGFybHkgbWFrZXMgaXQgZWFzeSBmb3IgdGhlIC1zc2x2ZXJpZnkgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHBpY2sgdXAgeW91ciBjbGllbnQgY2VydHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBmaWxlbmFtZSBvciBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gb2YgZWl0aGVyIHRoZSAic2VydmVyIiBhbmQgImNsaWVudCIgY2VydHMuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gcmVuYW1lIHRoZSBmaWxlcyBvciBtb3ZlIHRoZW0gdG8gd2hlcmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IGxpa2UuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgUHJlY2VkZSB0aGlzIG9wdGlvbiB3aXRoIC1zc2xkaXIgW2Rpcl0gdG8gdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgfi8udm5jL2NlcnRzIFlvdSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gcnVuIC1zc2xHZW5DQSBvbiB0aGF0IGRpcmVjdG9yeSBmaXJzdCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgZG9pbmcgYW55IC1zc2xHZW5DZXJ0IGtleSBjcmVhdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHlvdSBjYW5ub3QgcmVjcmVhdGUgYSBjZXJ0IHdpdGggZXhhY3RseSB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICBkaXN0aWd1aXNoZWQgbmFtZSAoRE4pIGFzIGFuIGV4aXN0aW5nIG9uZS4gIFRvIGRvIHNvLAotICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgdGhlIFtkaXJdL0NBL2luZGV4LnR4dCBmaWxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGUgbGluZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTaW1pbGFyIHRvIC1zc2xHZW5DQSwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gZmlsbAotICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSByZWNvcmRlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgd2hlbiBpdCBpcyBjcmVhdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRpcDogaWYgeW91IGtub3cgdGhlIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICBwZW9wbGUgd2lsbCBiZSBjb25uZWN0aW5nIHRvLCB5b3UgY2FuIHVzZSB0aGF0IGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBDb21tb25OYW1lICJDTiIgdG8gYXZvaWQgc29tZSBhcHBsaWNhdGlvbnMgKGUuZy4gd2ViCi0gICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJzIGFuZCBqYXZhIHBsdWdpbikgY29tcGxhaW5pbmcgdGhhdCBpdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCB0aGUgaG9zdG5hbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSB0aGUgQ0EgcHJpdmF0ZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSB0byB1bmxvY2sgdGhlIHByaXZhdGUga2V5IGNyZWF0ZWQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAtc3NsR2VuQ0EuICBUaGlzIHByaXZhdGUga2V5IGlzIHVzZWQgdG8gc2lnbiB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNlcnZlciIgY2VydHMgY2FuIGJlIHVzZWQgYnkgeDExdm5jIGRpcmVjdGx5IGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZW0gdmlhIHRoZSAtc3NsIFtwZW1dIG9wdGlvbi4gIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpbGUgd2lsbCBiZSB+Ly52bmMvY2VydHMvc2VydmVyLnBlbS4gIFRoaXMgb25lIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgc2ltcGx5IHR5cGluZyAtc3NsIFNBVkUuICBUaGUgcGVtIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kIHRoZSBwcml2YXRlIGtleS4KLSAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmNydCBmaWxlIGNvbnRhaW5zIHRoZSBjZXJ0IG9ubHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjbGllbnQiIGNlcnQgKyBwcml2YXRlIGtleSBmaWxlIHdpbGwgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb3BpZWQgYW5kIGltcG9ydGVkIGludG8gdGhlIFZOQyB2aWV3ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgc2lkZSBhcHBsaWNhdGlvbnMgKFdlYiBicm93c2VyLCBKYXZhIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3R1bm5lbCwgZXRjLikgIE9uY2UgdGhhdCBpcyBkb25lIHlvdSBjYW4gZGVsZXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IiBwcml2YXRlIGtleSBmaWxlIG9uIHRoaXMgbWFjaGluZSBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBvbmx5IG5lZWRlZCBvbiB0aGUgVk5DIHZpZXdlciBzaWRlLiAgVGhlLAotICAgICAgICAgICAgICAgICAgICAgICBlLmcuIH4vLnZuYy9jZXJ0cy9jbGllbnRzLzxuYW1lPi5wZW0gY29udGFpbnMgYm90aAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VydCBhbmQgcHJpdmF0ZSBrZXkuICBUaGUgPG5hbWU+LmNydCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgb25seS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBrbm93IG9uZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgbmV3IGtleXMgd2l0aCBhIHBhc3NwaHJhc2UuICBPdGhlcndpc2UgaWYgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgdW50cnVzdGVkIHVzZXIgc3RlYWxzIHRoZSBrZXkgZmlsZSBoZSBjb3VsZCB1c2UgaXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgbWFzcXVlcmFkZSBhcyB0aGUgeDExdm5jIHNlcnZlciAob3IgVk5DIHZpZXdlciBjbGllbnQpLgotICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB3aGV0aGVyIHRvIGVuY3J5cHQgdGhlIGtleSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIGEgcGFzc3BocmFzZSBvciBub3QuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkby4KLSAgICAgICAgICAgICAgICAgICAgICAgT25lIGluY29udmVuaWVuY2UgdG8gYSBwYXNzcGhyYXNlIGlzIHRoYXQgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICBiZSB0eXBlZCBpbiBFVkVSWSB0aW1lIHgxMXZuYyBvciB0aGUgY2xpZW50IGFwcCBpcwotICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHVwLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIFNBVkUgLWRpc3BsYXkgOjAgLi4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gb24gdmlld2VyIHVzaW5nIHNzX3ZuY3ZpZXdlciBzdHVubmVsIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgKHNlZSB0aGUgRkFRKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc192bmN2aWV3ZXIgLXZlcmlmeSAuL2NhY2VydC5jcnQgaG9zdG5hbWU6MAotCi0gICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzc3VtZXMgdGhlIGNhY2VydC5jcnQgY2VydCBmcm9tIC1zc2xHZW5DQQotICAgICAgICAgICAgICAgICAgICAgICB3YXMgc2FmZWx5IGNvcGllZCB0byB0aGUgVk5DIHZpZXdlciBtYWNoaW5lIHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHNzX3ZuY3ZpZXdlciBpcyBydW4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSB1c2luZyBhIG5hbWU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyIGNoYXJsaWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCBTQVZFLWNoYXJsaWUgLWRpc3BsYXkgOjAgLi4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSBmb3IgYSBjbGllbnQgY2VydGlmaWNhdGUgKHJhcmVseSB1c2VkKToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsR2VuQ2VydCBjbGllbnQgcm9nZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3Agfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIucGVtIHNvbWVob3N0Oi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybSAgfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIucGVtCi0KLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGlzIHRoZW4gc3RhcnRlZCB3aXRoIHRoZSBvcHRpb24gLXNzbHZlcmlmeQotICAgICAgICAgICAgICAgICAgICAgICB+Ly52bmMvY2VydHMvY2xpZW50cy9yb2dlci5jcnQgKG9yIHNpbXBseSAtc3NsdmVyaWZ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHJvZ2VyKSwgYW5kIG9uIHRoZSB2aWV3ZXIgdXNlciBvbiBzb21laG9zdCBjb3VsZCBkbwotICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzX3ZuY3ZpZXdlciAtbXljZXJ0IC4vcm9nZXIucGVtIGhvc3RuYW1lOjAKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugc2V0IHRoZSBlbnYuIHZhciBSRVFfQVJHUz0nLi4uJyBpdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBvcGVuc3NsIHJlcSgxKS4gIEEgY29tbW9uIHVzZSB3b3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICBSRVFfQVJHUz0nLWRheXMgMTA5NScgdG8gYnVtcCB1cCB0aGUgZXhwaXJhdGlvbiBkYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICgzIHllYXJzIGluIHRoaXMgY2FzZSkuCi0KLS1zc2xFbmNLZXkgcGVtICAgICAgICAgVXRpbGl0eSB0byBlbmNyeXB0IGFuIGV4aXN0aW5nIFBFTSBmaWxlIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICBwYXNzcGhyYXNlIHlvdSBzdXBwbHkgd2hlbiBwcm9tcHRlZC4gIEZvciB0aGF0IGtleSB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuIGJ5IHgxMXZuYykgdGhlIHBhc3NwaHJhc2UgbXVzdCBiZSBzdXBwbGllZAotICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlICJTQVZFIiBub3RhdGlvbiBkZXNjcmliZWQgdW5kZXIgLXNzbCBhcHBsaWVzIGFzCi0gICAgICAgICAgICAgICAgICAgICAgIHdlbGwuIChwcmVjZWRlIHRoaXMgb3B0aW9uIHdpdGggLXNzbGRpciBbZGlyXSB0byByZWZlcgotICAgICAgICAgICAgICAgICAgICAgICBhIGRpcmVjdG9yeSBiZXNpZGVzIHRoZSBkZWZhdWx0IH4vLnZuYy9jZXJ0cykKLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3BlbnNzbCgxKSBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGF2YWlsYWJsZSBpbiBQQVRILiAgQWZ0ZXIgdGhlIEtleSBmaWxlIGlzIGVuY3J5cHRlZAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgeDExdm5jIGNvbW1hbmQgZXhpdHM7IHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xFbmNLZXkgL3BhdGgvdG8vZm9vLnBlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsRW5jS2V5IFNBVkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEVuY0tleSBTQVZFLWNoYXJsaWUKLQotLXNzbENlcnRJbmZvIHBlbSAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGV4aXN0aW5nIFBFTSBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICBJbiBhZGRpdGlvbiB0aGUgcHVibGljIGNlcnRpZmljYXRlIGlzIGFsc28gcHJpbnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIG9wZW5zc2woMSkgcHJvZ3JhbSBtdXN0IGJlIGluIFBBVEguIEJhc2ljYWxseSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCAib3BlbnNzbCB4NTA5IC10ZXh0IiBpcyBydW4gb24gdGhlIHBlbS4KLQotICAgICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgaW5mbyBpcyBwcmludGVkIHRoZSB4MTF2bmMgY29tbWFuZCBleGl0czsKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIFZOQyBzZXJ2ZXIgaXMgbm90IHJ1bi4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgIlNBVkUiIG5vdGF0aW9uIGRlc2NyaWJlZCB1bmRlciAtc3NsIGFwcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2luZyAgIkxJU1QiIHdpbGwgZ2l2ZSBhIGxpc3Qgb2YgYWxsIGNlcnRzIGJlaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgKGluIHRoZSB+Ly52bmMvY2VydHMgZGlyLCB1c2UgLXNzbGRpciB0byByZWZlcgotICAgICAgICAgICAgICAgICAgICAgICB0byBhbm90aGVyIGRpcikuICAiQUxMIiB3aWxsIHByaW50IG91dCB0aGUgaW5mbyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgbWFuYWdlZCBrZXkgKHRoaXMgY2FuIGJlIHZlcnkgbG9uZykuICBHaXZpbmcgYQotICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgb3Igc2VydmVyIGNlcnQgc2hvcnRuYW1lIHdpbGwgYWxzbyB0cnkgYSBsb29rdXAKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gLXNzbENlcnRJbmZvIGNoYXJsaWUpLiAgVXNlICJMSVNUTCIgb3IgIkxMIgotICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBsb25nIChscyAtbCBzdHlsZSkgbGlzdGluZy4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2luZyAiSEFTSE9OIiB3aWxsIGNyZWF0ZSBzdWJkaXJzIFtkaXJdL0hBU0ggYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIFtkaXJdL0hBU0ggd2l0aCBPcGVuU1NMIGhhc2ggZmlsZW5hbWVzIChlLmcuIDBkNWZiYmYxLjApCi0gICAgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzIHBvaW50aW5nIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nICouY3J0IGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgIChbZGlyXSBpcyB+Ly52bmMvY2VydHMgb3Igb25lIGdpdmVuIGJ5IC1zc2xkaXIuKQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdXNlZnVsIHdheSBmb3Igb3RoZXIgT3BlblNTTCBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gc3R1bm5lbCkgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY2VydHMgd2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICBoYXZpbmcgdG8gY29uY2F0ZW5hdGUgdGhlbS4gIHgxMXZuYyB3aWxsIG5vdCB1c2UgdGhlbQotICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgeW91IHNwZWNpZmljYWxseSByZWZlcmVuY2UgdGhlbS4gICJIQVNIT0ZGIgotICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVzIHRoZXNlIEhBU0ggc3ViZGlycy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgTElTVCwgTElTVEwsIExMLCBBTEwsIEhBU0hPTiwgSEFTSE9GRiB3b3JkcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBiZSBsb3dlcmNhc2UsIGUuZy4gImxpc3QiLgotCi0tc3NsRGVsQ2VydCBwZW0gICAgICAgIFByb21wdHMgeW91IHRvIGRlbGV0ZSBhbGwgLmNydCAucGVtIC5rZXkgLnJlcSBmaWxlcwotICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggW3BlbV0uICB4MTF2bmMgdGhlbiBleGl0cy4gIlNBVkUiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBsb29rdXBzIGFzIGluIC1zc2xDZXJ0SW5mbyBhcHBseSBhcyB3ZWxsLgotCi0tc3NsU2NyaXB0cyAgICAgICAgICAgIFByaW50cyBvdXQgYm90aCB0aGUgJ2dlbkNBJyBhbmQgJ2dlbkNlcnQnIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICBvcGVuc3NsIHdyYXBwZXIgc2NyaXB0cyBmb3IgeW91IHRvIGV4YW1pbmUsIG1vZGlmeSwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2NyaXB0cyBhcmUgcHJpbnRlZCB0byBzdGRvdXQgYW5kIHRoZW4gdGhlIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLgotCi0KLS1zdHVubmVsIFtwZW1dICAgICAgICAgVXNlIHRoZSBzdHVubmVsKDgpIChzdHVubmVsLm1pcnQubmV0KSB0byBwcm92aWRlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCBTU0wgdHVubmVsIGJldHdlZW4gdmlld2VycyBhbmQgeDExdm5jLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZXh0ZXJuYWwgdHVubmVsIG1ldGhvZCB3YXMgaW1wbGVtZW50ZWQgcHJpb3IgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWQgLXNzbCBlbmNyeXB0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIEl0IHN0aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHdvcmtzIHdlbGwgYW5kIGF2b2lkcyB0aGUgcmVxdWlyZW1lbnQgb2YgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBPcGVuU1NMIGxpYnJhcmllcy4gIFRoaXMgbW9kZSByZXF1aXJlcyBzdHVubmVsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgdmlhIFBBVEgKLSAgICAgICAgICAgICAgICAgICAgICAgKG4uYi4gc3R1bm5lbCBpcyBvZnRlbiBpbnN0YWxsZWQgaW4gc2JpbiBkaXJlY3RvcmllcykuCi0gICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gNC54IG9mIHN0dW5uZWwgaXMgYXNzdW1lZCAoYnV0IHNlZSAtc3R1bm5lbDMKLSAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFtwZW1dIGlzIG9wdGlvbmFsLCB1c2UgIi1zdHVubmVsIC9wYXRoL3RvL3N0dW5uZWwucGVtIgotICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IGEgUEVNIGNlcnRpZmljYXRlIGZpbGUgdG8gcGFzcyB0byBzdHVubmVsLgotICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIC1zc2wgb3B0aW9uIGZvciBtb3JlIGluZm8gb24gY2VydGlmaWNhdGUgZmlsZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgV2hldGhlciBvciBub3QgeW91ciBzdHVubmVsIGhhcyBpdHMgb3duIGNlcnRpZmljYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgb24geW91ciBzdHVubmVsIGNvbmZpZ3VyYXRpb247IHN0dW5uZWwgb2Z0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVzIG9uZSBhdCBpbnN0YWxsIHRpbWUuICBTZWUgeW91ciBzdHVubmVsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuICBJbiBhbnkgZXZlbnQsIGlmIHlvdSB3YW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGlzIGNlcnRpZmljYXRlIHlvdSBtdXN0IHN1cHBseSB0aGUgZnVsbCBwYXRoIHRvIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIGFzIFtwZW1dLiAgTm90ZTogdGhlIGZpbGUgbWF5IG9ubHkgYmUgcmVhZGFibGUgYnkgcm9vdC4KLQotICAgICAgICAgICAgICAgICAgICAgICBbcGVtXSBtYXkgYWxzbyBiZSB0aGUgc3BlY2lhbCBzdHJpbmdzICJUTVAiLCAiU0FWRSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAiU0FWRS4uLiIgYXMgZGVzY3JpYmVkIGluIHRoZSAtc3NsIG9wdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgbm90IHN1cHBsaWVkLCAiU0FWRSIgaXMgYXNzdW1lZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIFZlTkNyeXB0LCBBTk9OVExTLCBhbmQgIkFOT04iIG1vZGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkIGluIC1zdHVubmVsIG1vZGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgc3R1bm5lbCBpcyBzdGFydGVkIHVwIGFzIGEgY2hpbGQgcHJvY2VzcyBvZiB4MTF2bmMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBTU0wgY29ubmVjdGlvbnMgc3R1bm5lbCByZWNlaXZlcyBhcmUgZGVjcnlwdGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIHgxMXZuYyBvdmVyIGEgbG9jYWwgc29ja2V0LiAgVGhlIHN0cmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBTU0wgVk5DIGRlc2t0b3AgaXMgLi4uIiBhbmQgIlNTTFBPUlQ9Li4uIgotICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cCB0byBpbmRpY2F0ZSB0aGlzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSAtbG9jYWxob3N0IG9wdGlvbiBpcyBlbmZvcmNlZCBieSBkZWZhdWx0IHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZSByb3V0aW5nIGFyb3VuZCB0aGUgU1NMIGNoYW5uZWwuICBVc2UgLWVudgotICAgICAgICAgICAgICAgICAgICAgICBTVFVOTkVMX0RJU0FCTEVfTE9DQUxIT1NUPTEgdG8gZGlzYWJsZSB0aGlzIHNlY3VyaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNldCAtZW52IFNUVU5ORUxfREVCVUc9MSBmb3IgbW9yZSBkZWJ1Z2dpbmcgcHJpbnRvdXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2V0IC1lbnYgU1RVTk5FTF9QUk9HPXh4eCB0byB0aGUgZnVsbCBwYXRoIG9mIHN0dW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSB5b3Ugd2FudCB0byBiZSB1c2VkIChlLmcuIC91c3IvYmluL3N0dW5uZWw0KS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZXQgLWVudiBTVFVOTkVMX0xJU1RFTj14eHggdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGxpc3RlbiBvbiAodGhlIGRlZmF1bHQgaXMgdG8gbGlzdGVuCi0gICAgICAgICAgICAgICAgICAgICAgIG9uIGFsbCBpbnRlcmZhY2VzKSwgZS5nLiBTVFVOTkVMX0xJU1RFTj0xOTIuMTY4LjEuMTAwLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEEgc2ltcGxlIHdheSB0byBhZGQgSVB2NiBzdXBwb3J0IGlzIFNUVU5ORUxfTElTVEVOPTo6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91ciBWTkMgdmlld2VyIHdpbGwgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICB2aWEgU1NMLiAgVW5mb3J0dW5hdGVseSBub3QgdG9vIG1hbnkgZG8gdGhpcy4gIFNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgU1NMIHZpZXdlcnMgdW5kZXIgdGhlIC1zc2wgb3B0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgeDExdm5jIHByb2plY3QncyBTU1ZOQyBpcyBhbiBvcHRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQWxzbywgaW4gdGhlIHgxMXZuYyBkaXN0cmlidXRpb24sIHBhdGNoZWQgVGlnaHRWTkMKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIFVsdHJhVk5DIEphdmEgYXBwbGV0IGphciBmaWxlcyBhcmUgcHJvdmlkZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzZXMvc3NsIGRpcmVjdG9yeSB0aGF0IGRvIFNTTCBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHNlcnZpbmcgdGhlbSB3aXRoIHRoZSAtaHR0cCwgLWh0dHBfc3NsLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciAoc2VlIHRoZSBvcHRpb24gZGVzY3JpcHRpb25zIGZvciBtb3JlIGluZm8uKQotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBmb3IgdGhlIEphdmEgdmlld2VyIGFwcGxldCB1c2FnZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIj9QT1JUPXh4eHgiIGluIHRoZSB2YXJpb3VzIFVSTHMgcHJpbnRlZCBhdCBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgbmVlZCB0byBiZSBzdXBwbGllZCB0byB0aGUgd2ViIGJyb3dzZXIgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJseS4KLQotICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGF1dG9tYXRpYyAic2luZ2xlIHBvcnQiIEhUVFBTIG1vZGUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgLXNzbCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGluIC1zdHVubmVsIG1vZGUuICBIb3dldmVyLAotICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW4gYmUgZW11bGF0ZWQgdmlhOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSB4MTF2bmMgLXN0dW5uZWwgLWh0dHBfc3NsIC1odHRwX29uZXBvcnQgLi4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCwgaXQgaXMgYWxzbyBub3QgdG9vIGRpZmZpY3VsdCB0byBzZXQgdXAKLSAgICAgICAgICAgICAgICAgICAgICAgYW4gc3R1bm5lbCBvciBvdGhlciBTU0wgdHVubmVsIG9uIHRoZSB2aWV3ZXIgc2lkZS4KLSAgICAgICAgICAgICAgICAgICAgICAgQSBzaW1wbGUgZXhhbXBsZSBvbiBVbml4IHVzaW5nIHN0dW5uZWwgMy54IGlzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSBzdHVubmVsIC1jIC1kIGxvY2FsaG9zdDo1OTAxIC1yIHJlbW90ZWhvc3Q6NTkwMAotICAgICAgICAgICAgICAgICAgICAgICAgICUgdm5jdmlld2VyIGxvY2FsaG9zdDoxCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9yIFdpbmRvd3MsIHN0dW5uZWwgaGFzIGJlZW4gcG9ydGVkIHRvIGl0IGFuZCB0aGVyZQotICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJvYmFibHkgb3RoZXIgc3VjaCB0b29scyBhdmFpbGFibGUuICBTZWUgdGhlIEZBUQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgU1NWTkMgZm9yIG1vcmUgZXhhbXBsZXMuCi0KLS1zdHVubmVsMyAgW3BlbV0gICAgICAgVXNlIHZlcnNpb24gMy54IHN0dW5uZWwgY29tbWFuZCBsaW5lIHN5bnRheCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gNC54LiAgVGhlIC1odHRwLy1odHRwZGlyIEphdmEgYXBwbGV0IHNlcnZpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBtb2RlLgotCi0tZW5jIGNpcGhlcjprZXlmaWxlICAgIFVzZSBzeW1tZXRyaWMgZW5jcnlwdGlvbiB3aXRoIGNpcGhlciAiY2lwaGVyIgotICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VjcmV0IGtleSBkYXRhIGluICJrZXlmaWxlIi4gIElmIGtleWZpbGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHc9PHN0cmluZz4gdGhlbiAic3RyaW5nIiBpcyB1c2VkIGFzIHRoZSBrZXkgZGF0YS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgU1NMIHZpYSB0aGUgLXNzbAotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaW5zdGVhZCBvZiB0aGlzIG9wdGlvbiBiZWNhdXNlIFNTTCBpcyB3ZWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2QgYW5kIHRha2VzIGdyZWF0IGNhcmUgdG8gZXN0YWJsaXNoIHVuaXF1ZQotICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGtleXMgYW5kIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIHNvZnR3YXJlLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCB3YW50IHRvIGRlYWwgd2l0aCBTU0wKLSAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgZG8gbm90IHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIFNTSCBidXQgd2FudCBzb21lIGVuY3J5cHRpb24gZm9yIHlvdXIgVk5DIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgIE9yIGlmIHlvdSBtdXN0IGludGVyZmFjZSB3aXRoIGEgc3ltbWV0cmljIGtleSB0dW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB5b3UgZG8gbm90IGhhdmUgY29udHJvbCBvdmVyLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIG1vZGUgd2lsbCBOT1Qgd29yayB3aXRoIHRoZSBVbHRyYVZOQyBEU00KLSAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2lucyBiZWNhdXNlIHRoZXkgYWx0ZXIgdGhlIFJGQiBwcm90b2NvbCBpbiBhZGRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB0byB0dW5uZWxsaW5nIHdpdGggdGhlIHN5bW1ldHJpYyBjaXBoZXIgKGFuIHVuZm9ydHVuYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSBvZiBpbXBsZW1lbnRhdGlvbi4uLikKLQotICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIgY2FuIGJlIG9uZSBvZjogIGFyYzQsIGFlc3YyLCBhZXMtY2ZiLCBibG93ZmlzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgYWVzMjU2LCBvciAzZGVzLiAgU2VlIHRoZSBPcGVuU1NMIGRvY3VtZW50YXRpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mby4gIFRoZSBrZXlzaXplIGlzIDEyOCBiaXRzIChleGNlcHQgZm9yIGFlczI1NikuCi0gICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgb25lIHdheSB0byBtYWtlIGEga2V5ZmlsZSB3aXRoIHRoYXQgbWFueSBiaXRzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgaWY9L2Rldi9yYW5kb20gb2Y9Li9teS5rZXkgYnM9MTYgY291bnQ9MQotCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIG5lZWQgdG8gc2VjdXJlbHkgc2hhcmUgdGhpcyBrZXkgd2l0aCB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgc2lkZSBvZiB0aGUgVk5DIGNvbm5lY3Rpb24gKFNlZSBTU1ZOQyBmb3IgZXhhbXBsZXMpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6ICAtZW5jIGJsb3dmaXNoOi4vbXkua2V5Ci0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6ICAtZW5jIGJsb3dmaXNoOnB3PXN3b3JkZmlzaAotCi0gICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgMTYgYnl0ZXMgb2YgcmFuZG9tIHNhbHQgZm9sbG93ZWQgYnkgMTYgYnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgcmFuZG9tIGluaXRpYWxpemF0aW9uIHZlY3RvciBhcmUgc2VudCBhdCB0aGUgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gIFRoZSBvdGhlciBzaWRlIG11c3QgcmVhZCB0aGVzZQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW5pdGlhbGl6ZSB0aGVpciBjaXBoZXIgd2l0aCB0aGVtLiAgVGhlc2UgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIG1ha2UgdGhlIHNlc3Npb24ga2V5IHVuaXF1ZSAod2l0aG91dCB0aGVtIHRoZSBzZWN1cml0eQotICAgICAgICAgICAgICAgICAgICAgICBpcyBtaW5pbWFsKS4gIFNpbWlsYXJseSwgdGhlIG90aGVyIHNpZGUgbXVzdCBzZW5kIHVzCi0gICAgICAgICAgICAgICAgICAgICAgIGl0cyByYW5kb20gc2FsdCBhbmQgSVYgd2l0aCB0aG9zZSBzYW1lIGxlbmd0aHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNhbHQgYW5kIGtleSBkYXRhIGFyZSBjb21iaW5lZCB0byBjcmVhdGUgYSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGtleSB1c2luZyBhbiBtZDUgaGFzaCBhcyBkZXNjcmliZWQgaW4gRVZQX0J5dGVzVG9LZXkoMykuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGV4YWN0IGNhbGwgaXM6IEVWUF9CeXRlc1RvS2V5KENpcGhlciwgRVZQX21kNSgpLAotICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBrZXlkYXRhLCBsZW4sIDEsIGtleXN0ciwgTlVMTCk7ICB3aGVyZSBzYWx0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5kb20gZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCBrZXlkYXRhIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgc2VjcmV0IGtleSBkYXRhLiAga2V5c3RyIGlzIHRoZSByZXN1bHRpbmcgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICBrZXkuICBUaGUgY2lwaGVyIGlzIHRoZW4gc2VlZGVkIHdpdGgga2V5c3RyIGFuZCB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5kb20gaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFzIGl0cyBmaXJzdCBibG9jay4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBtb2RpZnkgdGhlIGFtb3VudCBvZiByYW5kb20gc2FsdCBhbmQgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVzZSBjaXBoZXJAbixtIHdoZXJlIG4gaXMgdGhlIHNhbHQgbGVuZ3RoIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBtIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgbGVuZ3RoLiAgRS5nLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZW5jIGFlcy1jZmJAOCwxNjouL215LmtleQotCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG5vdCBhIGdvb2QgaWRlYSB0byBzZXQgZWl0aGVyIG9uZSB0byB6ZXJvLAotICAgICAgICAgICAgICAgICAgICAgICBhbHRob3VnaCB5b3UgbWF5IGJlIGZvcmNlZCB0byBpZiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsIGlzIG5vdCB1bmRlciB5b3VyIGNvbnRyb2wuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gc2tpcCB0aGUgc2FsdCBhbmQgRVZQX0J5dGVzVG9LZXkgTUQ1IGVudGlyZWx5IChubwotICAgICAgICAgICAgICAgICAgICAgICBoYXNoaW5nIGlzIGRvbmU6IHRoZSBrZXlkYXRhIGlzIGRpcmVjdGx5IGluc2VydGVkIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNpcGhlcikgc3BlY2lmeSAiLTEiIGZvciB0aGUgc2FsdCwgZS5nLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZW5jIGJsb3dmaXNoQC0xLDE2Oi4vbXkua2V5Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGNhbiBhbHNvIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGJlc2lkZXMgdGhlIGRlZmF1bHQgTUQ1LiAgVXNlIGNpcGhlckBtZCtuLG0gd2hlcmUgIm1kIgotICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgb25lIG9mIHNoYSwgc2hhMSwgbWQ1LCBvciByaXBlLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lbmMgYXJjNEBzaGErOCwxNjouL215LmtleQotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBTU1ZOQyB2bmMgdmlld2VyIHByb2plY3Qgc3VwcGxpZXMgYSBzeW1tZXRyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbiB0b29sIG5hbWVkICJ1bHRyYXZuY19kc21faGVscGVyIiB0aGF0IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIG9uIHRoZSB2aWV3ZXIgc2lkZS4gIEZvciBleGFtcGxlOgotCi0gICAgICAgICAgICAgICAgICAgICAgIHNzdm5jdmlld2VyIGV4ZWM9J3VsdHJhdm5jX2RzbV9oZWxwZXIgYXJjNCBteS5rZXkgMCBoOnAnCi0KLSAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgaDpwIGlzIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBvZiB0aGUgeDExdm5jIHNlcnZlci4KLSAgICAgICAgICAgICAgICAgICAgICAgdWx0cmF2bmNfZHNtX2hlbHBlciBtYXkgYWxzbyBiZSB1c2VkIHN0YW5kYWxvbmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBhIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHR1bm5lbCBmb3IgYW55IHZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICBvciBzZXJ2ZXIgKFZOQyBvciBvdGhlcndpc2UuKSBUaGUgY2lwaGVyICgxc3QgYXJnKQotICAgICAgICAgICAgICAgICAgICAgICBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgc3ludGF4IGFzIHdlIHVzZSBhYm92ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBBbHNvIHNlZSB0aGUgJ05vbi1VbHRyYSBEU00nIFNTVk5DIG9wdGlvbiBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICdVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW4nIGFkdmFuY2VkIG9wdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgYm90aCB3YXlzIG9mIHVzaW5nIHRoZSB2aWV3ZXIsIHlvdSBjYW4gc3BlY2lmeSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2FsdCxpdmVjIHNpemVzIChpbiBHVUkgb3IsIGUuZy4gYXJjNEA4LDE2KS4KLQotLWh0dHBzIFtwb3J0XSAgICAgICAgICBVc2UgYSBzcGVjaWFsLCBzZXBhcmF0ZSBIVFRQUyBwb3J0ICgtc3NsIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCBtb2RlcyBvbmx5KSBmb3IgSFRUUFMgSmF2YSB2aWV3ZXIgYXBwbGV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkaW5nLiBJLmUuIG5vdCA1OTAwIGFuZCBub3QgNTgwMCAodGhlIGRlZmF1bHRzLikKLQotICAgICAgICAgICAgICAgICAgICAgICBCQUNLR1JPVU5EOiBJbiAtc3NsIG1vZGUsIGl0IHR1cm5zIG91dCB5b3UgY2FuIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIFZOQyBwb3J0IChlLmcuIDU5MDApIGZvciBib3RoIFZOQyBhbmQgSFRUUFMKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMuIChIVFRQUyBpcyB1c2VkIHRvIHJldHJpZXZlIGEgU1NMLWF3YXJlCi0gICAgICAgICAgICAgICAgICAgICAgIFZuY1ZpZXdlci5qYXIgYXBwbGV0IHRoYXQgaXMgcHJvdmlkZWQgd2l0aCB4MTF2bmMpLgotICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSBib3RoIHVzZSBTU0wgdGhlIGltcGxlbWVudGF0aW9uIHdhcyBleHRlbmRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3QgaWYgSFRUUCB0cmFmZmljIChpLmUuIEdFVCkgaXMgdGFraW5nIHBsYWNlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXQgYWNjb3JkaW5nbHkuICBUaGUgVVJMIHdvdWxkIGJlLCBlLmcuOgotCi0gICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXltYWNoaW5lLm9yZzo1OTAwLwotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY29udmVuaWVudCBmb3IgZmlyZXdhbGxzLCBldGMsIGJlY2F1c2Ugb25seSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgcG9ydCBuZWVkcyB0byBiZSBhbGxvd2VkIGluLiAgSG93ZXZlciwgdGhpcyBoZXVyaXN0aWMKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkcyBhIGZldyBzZWNvbmRzIGRlbGF5IHRvIGVhY2ggY29ubmVjdGlvbiBhbmQgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHVucmVsaWFibGUgKGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdGFrZXMgbXVjaCB0aW1lIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHBvbmRlciB0aGUgQ2VydGlmaWNhdGUgZGlhbG9ncyBpbiBoaXMgYnJvd3NlciwgSmF2YSBWTSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgVk5DIFZpZXdlciBhcHBsZXQuICBUaGF0J3MgcmlnaHQgMyBzZXBhcmF0ZSAiQXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbm5lY3Q/IiBkaWFsb2dzISkKLQotICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgQkFDS0dST1VORC4KLQotICAgICAgICAgICAgICAgICAgICAgICBVU0FHRTogU28gdXNlIHRoZSAtaHR0cHMgb3B0aW9uIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbW9yZSByZWxpYWJsZSBIVFRQUyBwb3J0IHRoYXQgeDExdm5jIHdpbGwgbGlzdGVuIG9uLiAgSWYKLSAgICAgICAgICAgICAgICAgICAgICAgW3BvcnRdIGlzIG5vdCBwcm92aWRlZCAob3IgaXMgMCksIG9uZSBpcyBhdXRvc2VsZWN0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBVUkwgdG8gdXNlIGlzIHByaW50ZWQgb3V0IGF0IHN0YXJ0dXAuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTTCBKYXZhIGFwcGxldCBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgLWh0dHBkaXIgb3B0aW9uLiAgSWYgbm90IHN1cHBsaWVkLCAtaHR0cHMgd2lsbCB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZ3Vlc3MgdGhlIGRpcmVjdG9yeSBhcyB0aG91Z2ggdGhlIC1odHRwIG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB3YXMgc3VwcGxpZWQuCi0KLS1odHRwc3JlZGlyIFtwb3J0XSAgICAgSW4gLXNzbCBtb2RlIHdpdGggdGhlIEphdmEgYXBwbGV0IHJldHJpZXZlZCB2aWEgSFRUUFMsCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIEhUTUwgZmlsZSBjb250YWluaW5nIGFwcGxldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICgnaW5kZXgudm5jJyBvciAncHJveHkudm5jJykgaXMgc2VudCBkbyBOT1Qgc2V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBhcHBsZXQgUE9SVCBwYXJhbWV0ZXIgdG8gdGhlIGFjdHVhbCBWTkMgcG9ydCBidXQgc2V0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvICJwb3J0IiBpbnN0ZWFkLiAgSWYgInBvcnQiIGlzIG5vdCBzdXBwbGllZCwgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgcG9ydCBudW1iZXIgaXMgZ3Vlc3NlZCBmcm9tIHRoZSBIb3N0OiBIVFRQIGhlYWRlci4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIGluY29taW5nIFRDUCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uIGlzIHBlcmZvcm1lZCBieSBhIHJvdXRlci9nYXRld2F5L2ZpcmV3YWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGZyb20gb25lIHBvcnQgdG8gYW4gaW50ZXJuYWwgbWFjaGluZSB3aGVyZSB4MTF2bmMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGEgZGlmZmVyZW50IHBvcnQuIFRoZSBKYXZhIGFwcGxldCBuZWVkcyB0bwotICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBmaXJld2FsbC9yb3V0ZXIgcG9ydCwgbm90IHRoZSBWTkMgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgaW50ZXJuYWwgd29ya3N0YXRpb24uIEZvciBleGFtcGxlLCBvbmUgY291bGQKLSAgICAgICAgICAgICAgICAgICAgICAgcmVkaXIgZnJvbSBteWdhdGV3YXkuY29tOjQ0MyB0byB3b3Jrc3RhdGlvbjo1OTAwLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc3BhcmVzIHRoZSB1c2VyIGZyb20gaGF2aW5nIHRvIHR5cGUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9teWdhdGV3YXkuY29tLz9QT1JUPTQ0MyBpbnRvIHRoZWlyIHdlYgotICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyLiBOb3RlIHRoYXQgcG9ydCA0NDMgaXMgdGhlIGRlZmF1bHQgaHR0cHMgcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgcG9ydHMgbXVzdCBiZSBleHBsaWNpdGx5IGluZGljYXRlZCwgZm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXlnYXRld2F5LmNvbTo4MDAwLz9QT1JUPTgwMDAuICBUbyBhdm9pZCBoYXZpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZSB0aGUgUE9SVD0gaW4gdGhlIGJyb3dzZXIgVVJMLCBzaW1wbHkgc3VwcGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICItaHR0cHNyZWRpciIgdG8geDExdm5jLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRvZXMgbm90IHdvcmsgaW4gLXN0dW5uZWwgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBNb3JlIHRyaWNrczogc2V0IHRoZSBlbnYgdmFyIFgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZXh0cmEgVVJMIHBhcmFtZXRlcnMgdG8gdXNlLiAgVGhpcyB3YXkgeW91IGRvCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBuZWVkIHRvIHNwZWNpZnkgZXh0cmEgUEFSQU1TIGluIHRoZSBpbmRleC52bmMgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgRS5nLiB4MTF2bmMgLWVudiBYMTFWTkNfRVhUUkFfSFRUUFNfUEFSQU1TPSc/R0VUPTEnIC4uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB0byBleHBvc2UgdGhlIG5vbi1TU0wgSFRUUCBwb3J0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXR3b3JrIChpLmUuIHlvdSBqdXN0IHdhbnQgdGhlIHNpbmdsZSBWTkMvSFRUUFMKLSAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgZS5nLiA1OTAwLCBvcGVuIGZvciBjb25uZWN0aW9ucykgdGhlbiBzcGVjaWZ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gLWVudiBYMTFWTkNfSFRUUF9MSVNURU5fTE9DQUxIT1NUPTEgIFRoaXMgd2F5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBMaWJWTkNTZXJ2ZXIgaHR0cGQgc2VydmVyIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgb25seSBiZSBhdmFpbGFibGUgb24gbG9jYWxob3N0IChub3RlIHRoYXQgaW4gLXNzbCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBIVFRQUyByZXF1ZXN0cyBhcmUgcmVkaXJlY3RlZCBmcm9tIFNTTCB0byB0aGUgbm9uLVNTTAotICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgSFRUUCBzZXJ2ZXIuKQotCi0taHR0cF9vbmVwb3J0ICAgICAgICAgIEZvciBVTi1lbmNyeXB0ZWQgY29ubmVjdGlvbnMgbW9kZSAoaS5lLiBubyAtc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCwgb3IgLWVuYyBvcHRpb25zKSwgYWxsb3cgdGhlIEphdmEgVk5DIFZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICBhcHBsZXQgdG8gYmUgZG93bmxvYWRlZCB0aHJ1IHRoZSBWTkMgcG9ydCB2aWEgSFRUUC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGF0IGlzIHRvIHNheSwgeW91IGNhbiB1c2UgYSBzaW5nbGUgcG9ydCBmb3IgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICBhcHBsZXQgdmlld2VyIGNvbm5lY3Rpb25zIGJ5IHVzaW5nIGEgVVJMIGluIHlvdXIgd2ViCi0gICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgbGlrZSB0aGlzLCBmb3IgZXhhbXBsZToKLQotICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vaG9zdG5hbWU6NTkwMAotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWd1bGFyLCB0d28tcG9ydCBtb2RlLCBVUkwgaHR0cDovL2hvc3RuYW1lOjU4MDAKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjb250aW51ZSB0byB3b3JrIGFzIHdlbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGlzIG1vZGUgd2lsbCBOT1Qgd29yayB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSAtc3NsLCAtc3R1bm5lbCwgb3IgLWVuYyBlbmNyeXB0aW9uIG9wdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpcyBpdCBlcXVpdmFsZW50IHRvICctZW5jIG5vbmUnIChpLmUuIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzZXMgdGhlIHNhbWUgZGV0ZWN0aW9uIG1lY2hhbmlzbSBhcyBmb3IgSFRUUFMsIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG5vIGVuY3J5cHRpb24uKQotCi0gICAgICAgICAgICAgICAgICAgICAgIEhUVFBTIHNpbmdsZS1wb3J0IGlzIG9uIGJ5IGRlZmF1bHQgaW4gLXNzbCBlbmNyeXB0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSAoYW5kIC1lbmMgdG9vKSwgc28geW91IG9ubHkgbmVlZCAtaHR0cF9vbmVwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gZG9pbmcgbm9uLVNTTCBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGNvdWxkIGFsc28gYmUgdXNlZnVsIGZvciBTU0ggdHVubmVscyBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICBpdCBtZWFucyBvbmx5IG9uZSBwb3J0IG5lZWRzIHRvIGJlIHJlZGlyZWN0ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIC1odHRwc3JlZGlyIG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVuIHVzaW5nIGFuIFNTSCB0dW5uZWwgYXMgd2VsbCBhcyBmb3Igcm91dGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHBvcnQgcmVkaXJlY3Rpb25zLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgLWVudiBYMTFWTkNfSFRUUF9MSVNURU5fTE9DQUxIT1NUPTEKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGRlc2NyaWJlZCBhYm92ZSB1bmRlciAtaHR0cHNyZWRpciBhcHBsaWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgTGliVk5DU2VydmVyIGh0dHBkIHNlcnZlciBpbiBhbGwgY2FzZXMgKHNzbCBvciBub3QuKQotCi0tc3NoIHVzZXJAaG9zdDpkaXNwICAgIENyZWF0ZSBhIHJlbW90ZSBsaXN0ZW5pbmcgcG9ydCBvbiBtYWNoaW5lICJob3N0IgotICAgICAgICAgICAgICAgICAgICAgICB2aWEgYSBTU0ggdHVubmVsIHVzaW5nIHRoZSAtUiBycG9ydDpsb2NhbGhvc3Q6bHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLiBscG9ydCB3aWxsIGJlIHRoZSBsb2NhbCB4MTF2bmMgbGlzdGVuaW5nIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNvIGEgY29ubmVjdGlvbiB0byBycG9ydCAoNTkwMCtkaXNwKSBvbiAiaG9zdCIKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZWFjaCB4MTF2bmMuICBFLmcuIGZyZWRAc25vb3B5LmNvbTowCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSB1c2VmdWwgaWYgYSBmaXJld2FsbC9yb3V0ZXIgcHJldmVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgY29ubmVjdGlvbnMgdG8gdGhlIHgxMXZuYyBtYWNoaW5lLCBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNzaCBtYWNoaW5lICJob3N0IiBjYW4gYmUgcmVhY2hlZCBieSB0aGUgVk5DCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci4gInVzZXJAIiBpcyBub3QgbmVlZGVkIHVubGVzcyB0aGUgcmVtb3RlIHVuaXgKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IHRoZSByZW1vdGUgc3NoZCBpcyB1c3VhbGx5IGNvbmZpZ3VyZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuIG9ubHkgb24gbG9jYWxob3N0IGZvciBycG9ydCwgc28gdGhlIHZpZXdlciBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBzc2ggLUwgcmVkaXIgdG8gImhvc3QiIGFzIHdlbGwgKFNlZSBTU1ZOQyB0bwotICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0ZSB0aGlzKS4gIFRoZSBzc2hkIHNldHRpbmcgR2F0ZXdheVBvcnRzIGVuYWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGFsbCBpbnRlcmZhY2VzIGZvciBycG9ydDsgdmlld2VycyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVhY2ggaXQgbW9yZSBlYXNpbHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgImRpc3AiIGlzIHRoZSBWTkMgZGlzcGxheSBmb3IgdGhlIHJlbW90ZSBTU0ggc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAwIGNvcnJlc3BvbmRzIHRvIHBvcnQgNTkwMCwgZXRjLiAgSWYgZGlzcCBpcwotICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMjAwIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBwb3J0LiAgVXNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgdG8gZm9yY2UgYSBsb3cgcG9ydCwgZS5nLiBob3N0Oi04MCB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSBwb3J0IDgwLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHNzaC1hZ2VudCBpcyBub3QgYWN0aXZlLCB0aGVuIHRoZSBzc2ggcGFzc3dvcmQgbmVlZHMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZW50ZXJlZCBpbiB0aGUgdGVybWluYWwgd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCB0aGUgcmVtb3RlIHNzaCB3aWxsIGlzc3VlIGEgJ3NsZWVwIDMwMCcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZm9yIDUgbWlucy4gIFRvIG1vZGlmeQotICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHVzZSB1c2VyQGhvc3Q6ZGlzcCtzZWNzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSByZW1vdGUgU1NIIHNlcnZlciBpcyBvbiBhIG5vbi1zdGFuZGFyZCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIChpLmUuIG5vdCAyMikgdXNlIHVzZXJAaG9zdDpwb3J0OmRpc3Arc2Vjcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHNzaCBwcm9jZXNzIE1BWSBOT1QgYmUga2lsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGV4aXRzLiAgSXQgdHJpZXMgYnkgbG9va2luZyBhdCBwcygxKSBvdXRwdXQuCi0KLS11c2VwdyAgICAgICAgICAgICAgICAgSWYgbm8gb3RoZXIgcGFzc3dvcmQgbWV0aG9kIHdhcyBzdXBwbGllZCBvbiB0aGUgY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmaXJzdCBsb29rIGZvciB+Ly52bmMvcGFzc3dkIGFuZCBpZiBmb3VuZCB1c2UgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAtcmZiYXV0aDsgbmV4dCwgbG9vayBmb3Igfi8udm5jL3Bhc3N3ZGZpbGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSBpdCB3aXRoIC1wYXNzd2RmaWxlOyBvdGhlcndpc2UsIHByb21wdCB0aGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBwYXNzd29yZCB0byBjcmVhdGUgfi8udm5jL3Bhc3N3ZCBhbmQgdXNlIGl0IHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1yZmJhdXRoIG9wdGlvbi4gIElmIG5vbmUgb2YgdGhlc2Ugc3VjY2VlZCB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgZXhpdHMgaW1tZWRpYXRlbHkuCi0KLS1zdG9yZXBhc3N3ZCBwYXNzIGZpbGUgU3RvcmUgcGFzc3dvcmQgInBhc3MiIGFzIHRoZSBWTkMgcGFzc3dvcmQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGUgImZpbGUiLiAgT25jZSB0aGUgcGFzc3dvcmQgaXMgc3RvcmVkIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLiAgVXNlIHRoZSBwYXNzd29yZCB2aWEgIi1yZmJhdXRoIGZpbGUiCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCAieDExdm5jIC1zdG9yZXBhc3N3ZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGlzIHByb21wdGVkIGZvciBhIHBhc3N3b3JkIGFuZCBpdCBpcyBzdG9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZpbGUgfi8udm5jL3Bhc3N3ZC4gIENhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHRoZSBmaWxlIHRvIHN0b3JlIHRoZSBwcm9tcHRlZCBwYXNzd29yZCBpbi4KLQotLW5vcHcgICAgICAgICAgICAgICAgICBEaXNhYmxlIHRoZSBiaWcgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IHVzZSB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzb21lIHNvcnQgb2YgcGFzc3dvcmQuCi0KLS1hY2NlcHQgc3RyaW5nICAgICAgICAgUnVuIGEgY29tbWFuZCAocG9zc2libHkgdG8gcHJvbXB0IHRoZSB1c2VyIGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBYMTEgZGlzcGxheSkgdG8gZGVjaWRlIHdoZXRoZXIgYW4gaW5jb21pbmcgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBhbGxvd2VkIHRvIGNvbm5lY3Qgb3Igbm90LiAgInN0cmluZyIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYW4gZXh0ZXJuYWwgY29tbWFuZCBydW4gdmlhIHN5c3RlbSgzKSBvciBzb21lIHNwZWNpYWwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzZXMgZGVzY3JpYmVkIGJlbG93LiAgQmUgc3VyZSB0byBxdW90ZSAic3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBjb250YWlucyBzcGFjZXMsIHNoZWxsIGNoYXJhY3RlcnMsIGV0Yy4gIElmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb21tYW5kIHJldHVybnMgMCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhlIGNsaWVudCBpcyByZWplY3RlZC4gIFNlZSBiZWxvdyBmb3IgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHRvIGFjY2VwdCBhIGNsaWVudCB2aWV3LW9ubHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeDExdm5jIGlzIHJ1bm5pbmcgYXMgcm9vdCAoc2F5IGZyb20gaW5ldGQoOCkgb3IgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXJzIHhkbSgxKSwgZ2RtKDEpLCBldGMpLCB0aGluayBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHkgaW1wbGljYXRpb25zIGNhcmVmdWxseSBiZWZvcmUgc3VwcGx5aW5nIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIChsaWtld2lzZSBmb3IgdGhlIC1nb25lIG9wdGlvbikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQ6IFRoZSBSRkJfQ0xJRU5UX0lQIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIHRoZSBpbmNvbWluZyBjbGllbnQgSVAgbnVtYmVyIGFuZCB0aGUgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX1BPUlQgKG9yIC0xIGlmIHVuYXZhaWxhYmxlKS4gIFNpbWlsYXJseSwKLSAgICAgICAgICAgICAgICAgICAgICAgUkZCX1NFUlZFUl9JUCBhbmQgUkZCX1NFUlZFUl9QT1JUICh0aGUgeDExdm5jIHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvbm5lY3Rpb24pLCBhcmUgc2V0IHRvIGFsbG93IGlkZW50aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0Y3AgdmlydHVhbCBjaXJjdWl0LiAgVGhlIHgxMXZuYyBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIGlkIHdpbGwgYmUgaW4gUkZCX1gxMVZOQ19QSUQsIGEgY2xpZW50IGlkIG51bWJlciBpbgotICAgICAgICAgICAgICAgICAgICAgICBSRkJfQ0xJRU5UX0lELCBhbmQgdGhlIG51bWJlciBvZiBvdGhlciBjb25uZWN0ZWQgY2xpZW50cwotICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX0NPVU5ULiAgUkZCX01PREUgd2lsbCBiZSAiYWNjZXB0Ii4KLSAgICAgICAgICAgICAgICAgICAgICAgUkZCX1NUQVRFIHdpbGwgYmUgUFJPVE9DT0xfVkVSU0lPTiwgU0VDVVJJVFlfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVVUSEVOVElDQVRJT04sIElOSVRJQUxJU0FUSU9OLCBOT1JNQUwsIG9yIFVOS05PV04KLSAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGluZyB1cCB0byB3aGljaCBzdGF0ZSB0aGUgY2xpZW50IGhhcyBhY2hpZXZlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgUkZCX0xPR0lOX1ZJRVdPTkxZIHdpbGwgYmUgMCwgMSwgb3IgLTEgKHVua25vd24pLgotICAgICAgICAgICAgICAgICAgICAgICBSRkJfVVNFUk5BTUUsIFJGQl9MT0dJTl9USU1FLCBhbmQgUkZCX0NVUlJFTlRfVElNRSBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBiZSBzZXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgInN0cmluZyIgaXMgInBvcHVwIiB0aGVuIGEgYnVpbHRpbiBwb3B1cCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gIFRoZSBwb3B1cCB3aWxsIHRpbWUgb3V0IGFmdGVyIDEyMCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICB1c2UgInBvcHVwOk4iIHRvIG1vZGlmeSB0aGUgdGltZW91dCB0byBOIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgKHVzZSAwIGZvciBubyB0aW1lb3V0KS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY2FzZSBvZiAicG9wdXAiIGFuZCB3aGVuIHRoZSAtdW5peHB3IG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZW4gYSAqc2Vjb25kKiB3aW5kb3cgd2lsbCBiZSBwb3BwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdXAgYWZ0ZXIgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IGxvZ3MgaW4gdmlhIGhpcyBVTklYCi0gICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLiAgVGhpcyB0aW1lIHRoZSB1c2VyIHdpbGwgYmUgaWRlbnRpZmllZCBhcwotICAgICAgICAgICAgICAgICAgICAgICBVTklYOnVzZXJuYW1lQGhvc3RuYW1lLCB0aGUgIlVOSVg6IiBwcmVmaXggaW5kaWNhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHVzZXIgdGhlIHZpZXdlciBsb2dnZWQgYXMgdmlhIC11bml4cHcuICBUaGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgcG9wdXAgaXMgb25seSBmb3Igd2hldGhlciB0byBhbGxvdyBoaW0gdG8gZXZlbiAqdHJ5KgotICAgICAgICAgICAgICAgICAgICAgICB0byBsb2dpbiB2aWEgdW5peCBwYXNzd29yZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiAic3RyaW5nIiBpcyAieG1lc3NhZ2UiIHRoZW4gYW4geG1lc3NhZ2UoMSkKLSAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBpcyB1c2VkIGZvciB0aGUgY29tbWFuZC4gIHhtZXNzYWdlIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGZvciB0aGlzIHRvIHdvcmsuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQm90aCAicG9wdXAiIGFuZCAieG1lc3NhZ2UiIHdpbGwgcHJlc2VudCBhbiBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFjY2VwdGluZyB0aGUgY2xpZW50ICJWaWV3LU9ubHkiICh0aGUgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IHdhdGNoKS4gIFRoaXMgb3B0aW9uIHdpbGwgbm90IGJlIHByZXNlbnRlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAtdmlld29ubHkgaGFzIGJlZW4gc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSBlbnRpcmUKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyB2aWV3IG9ubHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBpcyBwcmVmaXhlZCB3aXRoIHNvbWV0aGluZwotICAgICAgICAgICAgICAgICAgICAgICBsaWtlICJ5ZXM6MCxubzoqLHZpZXc6MyBteWNvbW1hbmQgLi4uIiB0aGVuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlcyB0aGUgbnVtZXJpY2FsIGNvbW1hbmQgcmV0dXJuIGNvZGUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aW9uczogYWNjZXB0LCByZWplY3QsIGFuZCBhY2NlcHQtdmlldy1vbmx5LAotICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuICBVc2UgIioiIGluc3RlYWQgb2YgYSBudW1iZXIgdG8gaW5kaWNhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgYWN0aW9uIChpbiBjYXNlIHRoZSBjb21tYW5kIHJldHVybnMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZCB2YWx1ZSkuICBFLmcuICJubzoqIiBpcyBhIGdvb2QgY2hvaWNlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB4MTF2bmMgYmxvY2tzIHdoaWxlIHRoZSBleHRlcm5hbCBjb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIHBvcHVwIGlzIHJ1bm5pbmcgKG90aGVyIGNsaWVudHMgbWF5IHNlZSBubyB1cGRhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGlzIHBlcmlvZCkuICBTbyBhIHBlcnNvbiBzaXR0aW5nIGEgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgaXMgbmVlZGVkIHRvIHJlc3BvbmQgdG8gYW4gcG9wdXAgcHJvbXB0LiAodXNlCi0gICAgICAgICAgICAgICAgICAgICAgIGEgMm5kIHgxMXZuYyBpZiB5b3UgbG9jayB5b3Vyc2VsZiBvdXQpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE1vcmUgLWFjY2VwdCB0cmlja3M6IHVzZSAicG9wdXBtb3VzZSIgdG8gb25seSBhbGxvdwotICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBjbGlja3MgaW4gdGhlIGJ1aWx0aW4gcG9wdXAgdG8gYmUgcmVjb2duaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5IHVzZSAicG9wdXBrZXkiIHRvIG9ubHkgcmVjb2duaXplCi0gICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZSByZXNwb25zZXMuICBUaGVzZSBhcmUgdG8gaGVscCBhdm9pZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhY2NpZGVudGFsbHkgYWNjZXB0aW5nIGEgY2xpZW50IGJ5IHR5cGluZyBvcgotICAgICAgICAgICAgICAgICAgICAgICBjbGlja2luZy4gQWxsIDMgb2YgdGhlIHBvcHVwIGtleXdvcmRzIGNhbiBiZSBmb2xsb3dlZAotICAgICAgICAgICAgICAgICAgICAgICBieSArTitNIHRvIHN1cHBseSBhIHBvc2l0aW9uIGZvciB0aGUgcG9wdXAgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBjZW50ZXIgdGhlIHBvcHVwIHdpbmRvdy4KLS1hZnRlcmFjY2VwdCBzdHJpbmcgICAgQXMgLWFjY2VwdCwgZXhjZXB0IHRvIHJ1biBhIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgICBhIGNsaWVudCBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgYXV0aGVudGljYXRlZC4gUkZCX01PREUKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8gImFmdGVyYWNjZXB0IiBhbmQgdGhlIG90aGVyIFJGQl8qCi0gICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBhcmUgYXMgaW4gLWFjY2VwdC4gIFVubGlrZSAtYWNjZXB0LCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCByZXR1cm4gY29kZSBpcyBub3QgaW50ZXJwcmV0ZWQgYnkgeDExdm5jLgotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAtYWZ0ZXJhY2NlcHQgJ2tpbGxhbGwgeGxvY2sgJicKLS1nb25lIHN0cmluZyAgICAgICAgICAgQXMgLWFjY2VwdCwgZXhjZXB0IHRvIHJ1biBhIHVzZXIgc3VwcGxpZWQgY29tbWFuZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIGEgY2xpZW50IGdvZXMgYXdheSAoZGlzY29ubmVjdHMpLiAgUkZCX01PREUgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gImdvbmUiIGFuZCB0aGUgb3RoZXIgUkZCXyogdmFyaWFibGVzIGFyZSBhcwotICAgICAgICAgICAgICAgICAgICAgICBpbiAtYWNjZXB0LiAgVGhlICJwb3B1cCIgYWN0aW9ucyBhcHBseSBhcyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICAgICBVbmxpa2UgLWFjY2VwdCwgdGhlIGNvbW1hbmQgcmV0dXJuIGNvZGUgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVkIGJ5IHgxMXZuYy4gIEV4YW1wbGU6IC1nb25lICd4bG9jayAmJwotCi0tdXNlcnMgbGlzdCAgICAgICAgICAgIElmIHgxMXZuYyBpcyBzdGFydGVkIGFzIHJvb3QgKHNheSBmcm9tIGluZXRkKDgpIG9yIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBtYW5hZ2VycyB4ZG0oMSksIGdkbSgxKSwgZXRjKSwgdGhlbiBhcyBzb29uCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlIGFmdGVyIGNvbm5lY3Rpb25zIHRvIHRoZSBYIGRpc3BsYXkgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkIHRyeSB0byBzd2l0Y2ggdG8gb25lIG9mIHRoZSB1c2VycyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWEgc2VwYXJhdGVkICJsaXN0Ii4gIElmIHgxMXZuYyBpcyBub3QgcnVubmluZyBhcwotICAgICAgICAgICAgICAgICAgICAgICByb290IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgV2h5IHVzZSB0aGlzIG9wdGlvbj8gIEluIGdlbmVyYWwgaXQgaXMgbm90IG5lZWRlZCBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFggZGlzcGxheSBhbmQgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gaXRzIHByaW1hcnkgZnVuY3Rpb25zLiAgVGhlIG9wdGlvbiB3YXMgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzb21lIG9mIHRoZSAqZXh0ZXJuYWwqIHV0aWxpdHkgY29tbWFuZHMgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIG9jY2FzaW9uYWxseSBydW5zIHdvcmsgcHJvcGVybHkuICBJbiBwYXJ0aWN1bGFyIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICAgIEdOT01FIGFuZCBLREUgdG8gaW1wbGVtZW50IHRoZSAiLXNvbGlkIGNvbG9yIiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbW1hbmRzIChnY29uZnRvb2wtMiBhbmQgZGNvcCkgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJ1biBhcyB0aGUgdXNlciBvd25pbmcgdGhlIGRlc2t0b3Agc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhpcyBvcHRpb24gc3dpdGNoZXMgdXNlcmlkIGl0IGFsc28gYWZmZWN0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcmlkIHVzZWQgdG8gcnVuIHRoZSBwcm9jZXNzZXMgZm9yIHRoZSAtYWNjZXB0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAtZ29uZSBvcHRpb25zLiAgSXQgYWxzbyBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgZm9yIG9wdGlvbnMgc3VjaCBhcyAtY29ubmVjdCwgLWFsbG93LCBhbmQgLXJlbWFwCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHRoZSB1bHRyYSBhbmQgdGlnaHQgZmlsZXRyYW5zZmVyIGZlYXR1cmUgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gIE5vdGUgdGhhdCB0aGUgLWNvbm5lY3QgZmlsZSBpcyBhbHNvIHNvbWV0aW1lcwotICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNvIGJlIGNhcmVmdWwgd2l0aCB0aGlzIG9wdGlvbiBzaW5jZSBpbiBzb21lIHNpdHVhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgaXRzIHVzZSBjYW4gZGVjcmVhc2Ugc2VjdXJpdHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCB0aGUgc3dpdGNoIHRvIGEgdXNlciB3aWxsIG9ubHkgdGFrZSBwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZGlzcGxheSBjYW4gc3RpbGwgYmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZCBhcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgKHRoaXMgaXMgcHJpbWFyaWx5IHRvIHRyeSB0byBndWVzcyB0aGUgYWN0dWFsIG93bmVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzZXNzaW9uKS4gRXhhbXBsZTogIi11c2VycyBmcmVkLHdpbG1hLGJldHR5Ii4KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgbWFsaWNpb3VzIGxvY2FsIHVzZXIgImJhcm5leSIgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tseSB1c2luZyAieGhvc3QgKyIgd2hlbiBsb2dnaW5nIGluIG1heSBwb3NzaWJseQotICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIHgxMXZuYyBwcm9jZXNzIHRvIHN3aXRjaCB0byB1c2VyICJmcmVkIi4KLSAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBoYXBwZW5zIG5leHQ/Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgVW5kZXIgZGlzcGxheSBtYW5hZ2VycyBpdCBtYXkgYmUgYSBsb25nIHRpbWUgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzd2l0Y2ggc3VjY2VlZHMgKGkuZS4gYSB1c2VyIGxvZ3MgaW4pLiAgVG8gaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgICBtYWtlIGl0IHN3aXRjaCBpbW1lZGlhdGVseSByZWdhcmRsZXNzIGlmIHRoZSBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSByZW9wZW5lZCBwcmVmaXggdGhlIHVzZXJuYW1lIHdpdGggdGhlICIrIgotICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIuIEUuZy4gIi11c2VycyArYm9iIiBvciAiLXVzZXJzICtub2JvZHkiLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBsYXR0ZXIgKGkuZS4gc3dpdGNoaW5nIGltbWVkaWF0ZWx5IHRvIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vYm9keSIpIGlzIHRoZSBvbmx5IG9idmlvdXMgdXNlIG9mIHRoZSAtdXNlcnMgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaW5jcmVhc2VzIHNlY3VyaXR5LgotCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG5vdGF0aW9uIHRvIGFzc29jaWF0ZSBhIGdyb3VwIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgYSB1c2VyOiB1c2VyMS5ncm91cDEsdXNlcjIuZ3JvdXAyLC4uLiAgTm90ZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIGluaXRncm91cHMoMikgd2lsbCBzdGlsbCBiZSBjYWxsZWQgZmlyc3QgdG8gdHJ5IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCB0byBBTEwgb2YgYSB1c2VyJ3MgZ3JvdXBzIChwcmltYXJ5IGFuZCBhZGRpdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcykuICBPbmx5IGlmIHRoYXQgZmFpbHMgb3IgaXQgaXMgbm90IGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBzaW5nbGUgZ3JvdXAgc3BlY2lmaWVkIGFzIGFib3ZlIChvciB0aGUgdXNlcidzCi0gICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgZ3JvdXAgaWYgbm90IHNwZWNpZmllZCkgaXMgc3dpdGNoZWQgdG8gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICBzZXRnaWQoMikuICBVc2UgLWVudiBYMTFWTkNfU0lOR0xFX0dST1VQPTEgdG8gcHJldmVudAotICAgICAgICAgICAgICAgICAgICAgICB0cnlpbmcgaW5pdGdyb3VwcygyKSBhbmQgb25seSBzd2l0Y2ggdG8gdGhlIHNpbmdsZQotICAgICAgICAgICAgICAgICAgICAgICBncm91cC4gIFRoaXMgc29ydCBvZiBzZXR0aW5nIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICBtYWtlIHRoZSB1bHRyYSBvciB0aWdodCBmaWxldHJhbnNmZXIgcGVybWlzc2lvbnMgd29yawotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJseS4gVGhpcyBmb3JtYXQgYXBwbGllcyB0byBhbnkgY29tbWEgc2VwYXJhdGVkIGxpcwotdAotICAgICAgICAgICAgICAgICAgICAgICBvZiB1c2VycywgZXZlbiB0aGUgc3BlY2lhbCAiPSIgbW9kZXMgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgICAgICAgICAgICAgICAgICAgIEluIC11bml4cHcgbW9kZSwgaWYgIi11c2VycyB1bml4cHc9IiBpcyBzdXBwbGllZAotICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFmdGVyIGEgdXNlciBhdXRoZW50aWNhdGVzIGhpbXNlbGYgdmlhIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAtdW5peHB3IG1lY2hhbmlzbSwgeDExdm5jIHdpbGwgdHJ5IHRvIHN3aXRjaCB0byB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXMgdGhvdWdoICItdXNlcnMgK3VzZXJuYW1lIiBoYWQgYmVlbiBzdXBwbGllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gbGltaXQgd2hpY2ggdXNlcnMgdGhpcyB3aWxsIGJlIGRvbmUgZm9yLAotICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIHRoZW0gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBhZnRlciAidW5peHB3PSIKLSAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgYWJvdmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5LCBpbiAtc3NsIG1vZGUsIGlmICItdXNlcnMgc3NscGVlcj0iIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIHRoZW4gYWZ0ZXIgYW4gU1NMIGNsaWVudCBhdXRoZW50aWNhdGVzIHdpdGggaGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnQgKHRoZSAtc3NsdmVyaWZ5IG9wdGlvbiBpcyByZXF1aXJlZCBmb3IgdGhpcykgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZXh0cmFjdCBhIFVOSVggdXNlcm5hbWUgZnJvbSB0aGUgImVtYWlsQWRkcmVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgKHVzZXJuYW1lQGhvc3RuYW1lLmNvbSkgb2YgdGhlICJTdWJqZWN0IiBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgeDUwOSBTU0wgY2VydCBhbmQgdGhlbiB0cnkgdG8gc3dpdGNoIHRvIHRoYXQgdXNlciBhcwotICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggIi11c2VycyArdXNlcm5hbWUiIGhhZCBiZWVuIHN1cHBsaWVkLiAgSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gbGltaXQgd2hpY2ggdXNlcnMgdGhpcyB3aWxsIGJlIGRvbmUgZm9yLCBwcm92aWRlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZW0gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBhZnRlciAic3NscGVlcj0iLgotICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19TU0xQRUVSX0NOIHRvIHVzZSB0aGUgQ29tbW9uCi0gICAgICAgICAgICAgICAgICAgICAgIE5hbWUgKG5vcm1hbGx5IGEgaG9zdG5hbWUpIGluc3RlYWQgb2YgdGhlIEVtYWlsIGZpZWxkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IGZvciBzc2xwZWVyPSBtb2RlIHRoZSB4MTF2bmMgYWRtaW5pc3RyYXRvciBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRha2UgY2FyZSB0aGF0IGFueSBjbGllbnQgY2VydHMgaGUgYWRkcyB0byAtc3NsdmVyaWZ5Ci0gICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdGhlIGludGVuZGVkIFVOSVggdXNlcm5hbWUgaW4gdGhlICJlbWFpbEFkZHJlc3MiCi0gICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBjZXJ0LiAgT3RoZXJ3aXNlIGEgdXNlciBtYXkgYmUgYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAgICBsb2cgaW4gYXMgYW5vdGhlci4gIFRoaXMgY29tbWFuZCBjYW4gYmUgb2YgdXNlIGluCi0gICAgICAgICAgICAgICAgICAgICAgIGNoZWNraW5nOiAib3BlbnNzbCB4NTA5IC10ZXh0IC1pbiBmaWxlLmNydCIsIHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIlN1YmplY3Q6IiBsaW5lLiAgQWxzbywgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIFJGQl8qCi0gICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFycy4gKHNlZSAtYWNjZXB0KSBwYXNzZWQgdG8gZXh0ZXJuYWwgY21kPQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcywgUkZCX1NTTF9DTElFTlRfQ0VSVCB3aWxsIGJlIHNldCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50J3MgeDUwOSBjZXJ0aWZpY2F0ZSBzdHJpbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNzbHBlZXI9IG1vZGUgY2FuIGFpZCBmaW5kaW5nIFggc2Vzc2lvbnMgdmlhIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbWVjaGFuaXNtcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBpbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSB1c2VyICpiZWZvcmUqIGNvbm5lY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBYIGRpc3BsYXkgYXJlIG1hZGUgb3IgYW55IGZpbGVzIG9wZW5lZCB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICI9IiBjaGFyYWN0ZXI6ICItdXNlcnMgPWJvYiIuICBUaGF0IHVzZXIgbmVlZHMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgYmUgYWJsZSB0byBvcGVuIHRoZSBYIGRpc3BsYXkgYW5kIGFueSBmaWxlcyBvZiBjb3Vyc2UuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgdXNlciAiZ3Vlc3M9IiBtZWFucyB0byBleGFtaW5lIHRoZSB1dG1weAotICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSAoc2VlIHdobygxKSkgbG9va2luZyBmb3IgYSB1c2VyIGF0dGFjaGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXNwbGF5IG51bWJlciAoZnJvbSBESVNQTEFZIG9yIC1kaXNwbGF5IG9wdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRyeSBoaW0vaGVyLiAgVG8gbGltaXQgdGhlIGxpc3Qgb2YgZ3Vlc3NlcywgdXNlOgotICAgICAgICAgICAgICAgICAgICAgICAiLXVzZXJzIGd1ZXNzPWJvYixiZXR0eSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXZlbiBtb3JlIHNpbmlzdGVyIGlzIHRoZSBzcGVjaWFsIHVzZXIgImx1cms9IgotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1lYW5zIHRvIHRyeSB0byBndWVzcyB0aGUgRElTUExBWSBmcm9tIHRoZSB1dG1weAotICAgICAgICAgICAgICAgICAgICAgICBsb2dpbiBkYXRhYmFzZSBhcyB3ZWxsLiAgU28gaXQgImx1cmtzIiB3YWl0aW5nIGZvcgotICAgICAgICAgICAgICAgICAgICAgICBhbnlvbmUgdG8gbG9nIGludG8gYW4gWCBzZXNzaW9uIGFuZCB0aGVuIGNvbm5lY3RzIHRvIGl0LgotICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgbGlzdCBvZiB1c2VycyBhZnRlciB0aGUgPSB0byBsaW1pdCB3aGljaCB1c2VycwotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRyaWVkLiAgVG8gZW5hYmxlIGEgZGlmZmVyZW50IHNlYXJjaGluZyBtb2RlLCBpZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgdXNlciBpbiB0aGUgbGlzdCBpcyBzb21ldGhpbmcgbGlrZSAiOjAiIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICI6MC0yIiB0aGF0IGluZGljYXRlcyBhIHJhbmdlIG9mIERJU1BMQVkgbnVtYmVycyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdHJpZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdXRtcHggZGF0YWJhc2UpIGZvciBhbGwgdXNlcnMgdGhhdCBhcmUgbG9nZ2VkIGluLiAgQWxzbwotICAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlICItZGlzcGxheSBXQUlUOi4uLiIgZnVuY3Rpb25hbGl0eS4gIEV4YW1wbGVzOgotICAgICAgICAgICAgICAgICAgICAgICAiLXVzZXJzIGx1cms9IiBhbmQgYWxzbyAiLXVzZXJzIGx1cms9OjAtMSxib2IsbWFyeSIKLQotICAgICAgICAgICAgICAgICAgICAgICBCZSBlc3BlY2lhbGx5IGNhcmVmdWwgdXNpbmcgdGhlICJndWVzcz0iIGFuZCAibHVyaz0iCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGVzLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2Ugb24gbWFjaGluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1bnRydXN0d29ydGh5IGxvY2FsIHVzZXJzLgotCi0tbm9zaG0gICAgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIE1JVC1TSE0gZXh0ZW5zaW9uIGZvciB0aGUgcG9sbGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIGRpc3BsYXlzIGNhbiBiZSBwb2xsZWQgdGhpcyB3YXk6IGJlIGNhcmVmdWwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBjYW4gdXNlIGxhcmdlIGFtb3VudHMgb2YgbmV0d29yayBiYW5kd2lkdGguICBUaGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGFsc28gb2YgdXNlIGlmIHRoZSBsb2NhbCBtYWNoaW5lIGhhcyBhIGxpbWl0ZWQgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHNobSBzZWdtZW50cyBhbmQgLW9uZXRpbGUgaXMgbm90IHN1ZmZpY2llbnQuCi0tZmxpcGJ5dGVvcmRlciAgICAgICAgIFNvbWV0aW1lcyBuZWVkZWQgaWYgcmVtb3RlbHkgcG9sbGVkIGhvc3QgaGFzIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICBlbmRpYW5uZXNzLiAgSWdub3JlZCB1bmxlc3MgLW5vc2htIGlzIHNldC4KLS1vbmV0aWxlICAgICAgICAgICAgICAgRG8gbm90IHVzZSB0aGUgbmV3IGNvcHlfdGlsZXMoKSBmcmFtZWJ1ZmZlciBtZWNoYW5pc20sCi0gICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdXNlIDEgc2htIHRpbGUgZm9yIHBvbGxpbmcuICBMaW1pdHMgc2htIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gMy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBkaXNhYmxlIGFueSBhdXRvbWF0aWMgc2htIHJlZHVjdGlvbiBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFyLiBYMTFWTkNfTk9fTElNSVRfU0hNLgotCi0tc29saWQgW2NvbG9yXSAgICAgICAgIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHdoZW4gVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZAotICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gY2hhbmdlIHRoZSBkZXNrdG9wIGJhY2tncm91bmQgdG8gYSBzb2xpZCBjb2xvci4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIFtjb2xvcl0gaXMgb3B0aW9uYWw6IHRoZSBkZWZhdWx0IGNvbG9yIGlzICJjeWFuNCIuCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciBhIGRpZmZlcmVudCBvbmUgc3BlY2lmeSB0aGUgWCBjb2xvciAocmdiLnR4dCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBlLmcuICJkYXJrYmx1ZSIgb3IgbnVtZXJpY2FsICIjUlJHR0JCIikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoaXMgb3B0aW9uIG9ubHkgd29ya3Mgb24gR05PTUUsIEtERSwgQ0RFLAotICAgICAgICAgICAgICAgICAgICAgICBYRkNFLCBhbmQgY2xhc3NpYyBYIChpLmUuIHdpdGggdGhlIGJhY2tncm91bmQgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHJvb3Qgd2luZG93KS4gIFRoZSAiZ2NvbmZ0b29sLTIiLCAiZGNvcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kICJ4ZmNvbmYtcXVlcnkiIGV4dGVybmFsIGNvbW1hbmRzIGFyZSBydW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIEdOT01FLCBLREUsIGFuZCBYRkNFIHJlc3BlY3RpdmVseS4gIFRoaXMgYWxzbyB3b3JrcwotICAgICAgICAgICAgICAgICAgICAgICBvbiBuYXRpdmUgTWFjT1NYLiAgKFRoZXJlIGlzIG5vIGNvbG9yIHNlbGVjdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NYIG9yIFhGQ0UuKSAgT3RoZXIgZGVza3RvcHMgd29uJ3Qgd29yaywgKHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdXMgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgaWYgeW91IGZpbmQgdGhlbSkuCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHgxMXZuYyBpcyBydW5uaW5nIGFzIHJvb3QgKGluZXRkKDgpIG9yIGdkbSgxKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSAtdXNlcnMgb3B0aW9uIG1heSBiZSBuZWVkZWQgZm9yIEdOT01FLCBLREUsIFhGQ0UuCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHgxMXZuYyBndWVzc2VzIHlvdXIgZGVza3RvcCBpbmNvcnJlY3RseSwgeW91IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSBpdCBieSBwcmVmaXhpbmcgY29sb3Igd2l0aCAiZ25vbWU6IiwgImtkZToiLAotICAgICAgICAgICAgICAgICAgICAgICAiY2RlOiIsICJ4ZmNlOiIsIG9yICJyb290OiIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlOiAtc29saWQgbm8gbG9uZ2VyIHdvcmtzIG9uIEtERTQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIHdvcmtzIGluIGEgbGltaXRlZCB3YXkgb24gdGhlIE1hYyBPUyBYIENvbnNvbGUKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvbmUgY29sb3IgKCdrZWxwJykgdXNpbmcgdGhlIHNjcmVlbnNhdmVyIHdyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJhY2tncm91bmQuICBMb29rIGluICJ+L0xpYnJhcnkvU2NyZWVuIFNhdmVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZuY1NvbGlkQ29sb3IucG5nIHRvIGNoYW5nZSB0aGUgY29sb3IuCi0KLS1ibGFja291dCBzdHJpbmcgICAgICAgQmxhY2sgb3V0IHJlY3RhbmdsZXMgb24gdGhlIHNjcmVlbi4gInN0cmluZyIgaXMgYQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBXeEgrWCtZIHR5cGUgZ2VvbWV0cmllcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZWFjaCByZWN0YW5nbGUuICBJZiBvbmUgb2YgdGhlIGl0ZW1zIG9uIHRoZSBsaXN0IGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgIm5vcHRyIiB0aGUgbW91c2UgcG9pbnRlciB3aWxsIG5vdCBiZSBhbGxvd2VkCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGdvIGludG8gYSBibGFja2VkIG91dCByZWdpb24uCi0teGluZXJhbWEgICAgICAgICAgICAgIElmIHlvdXIgc2NyZWVuIGlzIGNvbXBvc2VkIG9mIG11bHRpcGxlIG1vbml0b3JzCi0tbm94aW5lcmFtYSAgICAgICAgICAgIGdsdWVkIHRvZ2V0aGVyIHZpYSBYSU5FUkFNQSwgYW5kIHRoYXQgc2NyZWVuIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIHJlY3RhbmdsZSB0aGlzIG9wdGlvbiB3aWxsIHRyeSB0byBndWVzcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlYXMgdG8gYmxhY2sgb3V0IChpZiB5b3VyIHN5c3RlbSBoYXMgbGliWGluZXJhbWEpLgotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAteGluZXJhbWEKLQotICAgICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsLCB3ZSBoYXZlIG5vdGljZWQgb24gWElORVJBTUEgZGlzcGxheXMgeW91IG1heQotICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIHVzZSB0aGUgIi14d2FycHBvaW50ZXIiIG9wdGlvbiBpZiB0aGUgbW91c2UKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBtaXNiZWhhdmVzIGFuZCBpdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIFVzZQotICAgICAgICAgICAgICAgICAgICAgICAiLW5veHdhcnBwb2ludGVyIiBpZiB5b3UgZG8gbm90IHdhbnQgdGhpcy4KLQotLXh0cmFwICAgICAgICAgICAgICAgICBVc2UgdGhlIERFQy1YVFJBUCBleHRlbnNpb24gZm9yIGtleXN0cm9rZSBhbmQgbW91c2UKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW5zZXJ0aW9uLiAgRm9yIHVzZSBvbiBsZWdhY3kgc3lzdGVtcywgZS5nLiBYMTFSNSwKLSAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhbiBpbmNvbXBsZXRlIG9yIG1pc3NpbmcgWFRFU1QgZXh0ZW5zaW9uLgotICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IERFQy1YVFJBUCB3aWxsIGJlIHVzZWQgaWYgWFRFU1Qgc2VydmVyIGdyYWIKLSAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBpcyBtaXNzaW5nLCB1c2UgLXh0cmFwIHRvIGRvIHRoZSBrZXlzdHJva2UgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIGluc2VydGlvbiB2aWEgREVDLVhUUkFQIGFzIHdlbGwuCi0KLS14cmFuZHIgW21vZGVdICAgICAgICAgSWYgdGhlIGRpc3BsYXkgc3VwcG9ydHMgdGhlIFhSQU5EUiAoWCBSZXNpemUsIFJvdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgUmVmbGVjdGlvbikgZXh0ZW5zaW9uLCBhbmQgeW91IGV4cGVjdCBYUkFORFIgZXZlbnRzCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIG9jY3VyIHRvIHRoZSBkaXNwbGF5IHdoaWxlIHgxMXZuYyBpcyBydW5uaW5nLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgaW5kaWNhdGVzIHgxMXZuYyBzaG91bGQgdHJ5IHRvIHJlc3BvbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgY3Jhc2hpbmcgYnkgYXNzdW1pbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9sZCBzY3JlZW4gc2l6ZSkuICBTZWUgdGhlIHhyYW5kcigxKSBtYW5wYWdlIGFuZCBydW4KLSAgICAgICAgICAgICAgICAgICAgICAgJ3hyYW5kciAtcScgZm9yIG1vcmUgaW5mby4gIFttb2RlXSBpcyBvcHRpb25hbCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdhdGNoaW5nIGZvciBYUkFORFIgZXZlbnRzIGFuZCB0cmFwcGluZyBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2VzIHBvbGxpbmcgb3ZlcmhlYWQsIG9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIFhSQU5EUiBjaGFuZ2VzIGFyZSBleHBlY3RlZC4gIEZvciBleGFtcGxlIG9uIGEgcm90YXRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbiBQREEgb3IgbGFwdG9wLCBvciB1c2luZyBhIFhSQU5EUi1hd2FyZSBEZXNrdG9wCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHlvdSByZXNpemUgb2Z0ZW4uICBJdCBpcyBiZXN0IHRvIGJlIHZpZXdpbmcgd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICAgIHZuY3ZpZXdlciB0aGF0IHN1cHBvcnRzIHRoZSBOZXdGQlNpemUgZW5jb2RpbmcsIHNpbmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIGtub3dzIGhvdyB0byByZWFjdCB0byBzY3JlZW4gc2l6ZSBjaGFuZ2VzLiAgT3RoZXJ3aXNlLAotICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgdHJpZXMgdG8gZG8gc28gc29tZXRoaW5nIHJlYXNvbmFibGUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMgdGhhdCBjYW5ub3QgZG8gdGhpcyAocG9ydGlvbnMgb2YgdGhlIHNjcmVlbgotICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgY2xpcHBlZCwgdW51c2VkLCBldGMpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IG5vdyBpcyB0byBjaGVjayBmb3IgWFJBTkRSIGV2ZW50cywgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCB0cmFwIGV2ZXJ5IFggY2FsbCB0aGF0IG1heSBmYWlsIGR1ZSB0byByZXNpemUuCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGEgcmVzaXplIGV2ZW50IGlzIHJlY2VpdmVkLCB0aGUgZnVsbCAteHJhbmRyIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZC4gIFRvIGRpc2FibGUgZXZlbiBjaGVja2luZyBmb3IgZXZlbnRzIHN1cHBseToKLSAgICAgICAgICAgICAgICAgICAgICAgLW5veHJhbmRyLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBkZWZhdWx0cyB0byAicmVzaXplIiwgd2hpY2ggbWVhbnMgY3JlYXRlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3LCByZXNpemVkLCBmcmFtZWJ1ZmZlciBhbmQgaG9wZSBhbGwgdmlld2VycyBjYW4gY29wZQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjaGFuZ2UuICAibmV3ZmJzaXplIiBtZWFucyBmaXJzdCBkaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbCB2aWV3ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIE5ld0ZCU2l6ZSBWTkMKLSAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGFuZCB0aGVuIHJlc2l6ZSB0aGUgZnJhbWVidWZmZXIuICAiZXhpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgZGlzY29ubmVjdCBhbGwgdmlld2VyIGNsaWVudHMsIGFuZCB0aGVuIHRlcm1pbmF0ZQotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMuCi0KLS1yb3RhdGUgc3RyaW5nICAgICAgICAgUm90YXRlIGFuZC9vciBmbGlwIHRoZSBmcmFtZWJ1ZmZlciB2aWV3IGV4cG9ydGVkIGJ5IFZOQy4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBYUkFORFIgYW5kIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGRvbmUgaW4gc29mdHdhcmUgaW4gbWFpbiBtZW1vcnkgYW5kIHNvIG1heSBiZSBzbG93ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBjb3VsZCBiZSB1c2VmdWwgb24gYSBoYW5kaGVsZCB3aXRoIHBvcnRyYWl0IG9yCi0gICAgICAgICAgICAgICAgICAgICAgIGxhbmRzY2FwZSBtb2RlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzY2FubGluZQotICAgICAgICAgICAgICAgICAgICAgICBvcmRlciBvZiB0aGUgYWN0dWFsIGZyYW1lYnVmZmVyLiAgInN0cmluZyIgY2FuIGJlOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggICAgIGZsaXAgYWxvbmcgeC1heGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgICAgIGZsaXAgYWxvbmcgeS1heGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHkgICAgIGZsaXAgYWxvbmcgeC0gYW5kIHktYXhlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKzkwICAgICByb3RhdGUgOTAgZGVncmVlcyBjbG9ja3dpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC05MCAgICAgcm90YXRlIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKzkweCAgICAgcm90YXRlIDkwIGRlZ3JlZXMgQ1csIHRoZW4gZmxpcCBhbG9uZyB4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICs5MHkgICAgIHJvdGF0ZSA5MCBkZWdyZWVzIENXLCB0aGVuIGZsaXAgYWxvbmcgeQotCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXNlIGdpdmUgYWxsIHBvc3NpYmxlIHJvdGF0aW9ucyBhbmQgcmVmbGVjdGlvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNlczogc2FtZSBhcyB4eTogIHl4LCArMTgwLCAtMTgwLCAxODAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBhcyAtOTA6ICsyNzAsIDI3MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGFzICs5MDogOTAsIChkaXR0byBmb3IgOTB4LCA5MHkpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTGlrZSAtc2NhbGUsIHRoaXMgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZCBhdCB0aGUgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICBlbmQgb2YgYW55IGNoYWluIG9mIGZyYW1lYnVmZmVyIHRyYW5zZm9ybWF0aW9ucyBhbmQgc28KLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG9wdGlvbnMgd2l0aCBnZW9tZXRyaWVzLCBlLmcuIC1ibGFja291dCwgLWNsaXAsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBYIChvciAtcmF3ZmIpIGZyYW1lYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBub3QgdGhlIGZpbmFsIG9uZSBzZW50IHRvIFZOQyB2aWV3ZXJzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB0aGUgY3Vyc29yIHNoYXBlIHRvIGJlIHJvdGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICJzdHJpbmciIHdpdGggIm5jOiIsIGUuZy4gIm5jOis5MCIsCi0gICAgICAgICAgICAgICAgICAgICAgICJuYzp4eSIsIGV0Yy4KLQotLXBhZGdlb20gV3hIICAgICAgICAgICBXaGVuZXZlciBhIG5ldyB2bmN2aWV3ZXIgY29ubmVjdHMsIHRoZSBmcmFtZWJ1ZmZlciBpcwotICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgZmFrZSwgc29saWQgYmxhY2sgb25lIG9mIGdlb21ldHJ5IFd4SC4KLSAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRseSBhZnRlcndhcmRzIHRoZSBmcmFtZWJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByZWFsIG9uZS4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHZuY3ZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkbyBub3Qgc3VwcG9ydCBOZXdGQlNpemUgYW5kIG9uZSB3YW50cyB0byBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cmUgdGhlIGluaXRpYWwgdmlld2VyIGdlb21ldHJ5IHdpbGwgYmUgYmlnIGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICB0byBoYW5kbGUgYWxsIHN1YnNlcXVlbnQgcmVzaXplcyAoZS5nLiB1bmRlciAteHJhbmRyLAotICAgICAgICAgICAgICAgICAgICAgICAtcmVtb3RlIGlkOndpbmRvd2lkLCByZXNjYWxpbmcsIGV0Yy4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gLXVuaXhwdyBtb2RlIHRoaXMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgbG9naW4gc2NyZWVuLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgIm9uY2U6V3hIIiBpdCBpZ25vcmUgcGFkZ2VvbSBhZnRlciB0aGUgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIGlzIHNldCB1cC4KLQotLW8gbG9nZmlsZSAgICAgICAgICAgICBXcml0ZSBzdGRlcnIgbWVzc2FnZXMgdG8gZmlsZSAibG9nZmlsZSIgaW5zdGVhZCBvZiB0bwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVybWluYWwuICBTYW1lIGFzICItbG9nZmlsZSBmaWxlIi4gIFRvIGFwcGVuZAotICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZmlsZSB1c2UgIi1vYSBmaWxlIiBvciAiLWxvZ2FwcGVuZCBmaWxlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgImxvZ2ZpbGUiIGNvbnRhaW5zIHRoZSBzdHJpbmcgIiVWTkNESVNQTEFZIgotICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBleHBhbmRlZCB0byB0aGUgdm5jIGRpc3BsYXkgKHRoZSBuYW1lIG1heSBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGd1ZXNzZWQgYXQuKSAgIiVIT01FIiB3b3JrcyB0b28uCi0KLS1mbGFnIGZpbGUgICAgICAgICAgICAgV3JpdGUgdGhlICJQT1JUPU5OTk4iIChlLmcuIFBPUlQ9NTkwMCkgc3RyaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICJmaWxlIiBpbiBhZGRpdGlvbiB0byBzdGRvdXQuICBUaGlzIG9wdGlvbiBjb3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgYnkgd3JhcHBlciBzY3JpcHQgdG8gZGV0ZWN0IHdoZW4geDExdm5jIGlzIHJlYWR5LgotCi0tcm1mbGFnIGZpbGUgICAgICAgICAgIFJlbW92ZSAiZmlsZSIgYXQgZXhpdCB0byBzaWduYWwgd2hlbiB4MTF2bmMgaXMgZG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpbGUgaXMgY3JlYXRlZCBhdCBzdGFydHVwIGlmIGl0IGRvZXMgbm90IGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Qgb3IgaWYgImZpbGUiIGlzIHByZWZpeGVkIHdpdGggImNyZWF0ZToiLgotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBpcyBjcmVhdGVkLCB0aGUgeDExdm5jIFBJRCBpcyBwbGFjZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUuICBPdGhlcndpc2UgdGhlIGZpbGVzIGNvbnRlbnRzIGlzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgcHJlZml4ICJub2NyZWF0ZToiIHRvIHByZXZlbnQgY3JlYXRpb24uCi0KLS1yYyBmaWxlbmFtZSAgICAgICAgICAgVXNlICJmaWxlbmFtZSIgaW5zdGVhZCBvZiAkSE9NRS8ueDExdm5jcmMgZm9yIHJjIGZpbGUuCi0tbm9yYyAgICAgICAgICAgICAgICAgIERvIG5vdCBwcm9jZXNzIGFueSAueDExdm5jcmMgZmlsZSBmb3Igb3B0aW9ucy4KLQotLWVudiBWQVI9VkFMVUUgICAgICAgICBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdWQVInIHRvIHZhbHVlICdWQUxVRScKLSAgICAgICAgICAgICAgICAgICAgICAgYXQgeDExdm5jIHN0YXJ0dXAuICBUaGlzIGlzIGEgY29udmVuaWVuY2UgdXRpbGl0eSB0bwotICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCBzaGVsbCBzY3JpcHQgd3JhcHBlcnMsIGV0Yy4gdG8gc2V0IHRoZSBlbnYuIHZhci4KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBzcGVjaWZ5IGFzIG1hbnkgb2YgdGhlc2UgYXMgbmVlZGVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGxpbmUuCi0tcHJvZyAvcGF0aC90by94MTF2bmMgIFNldCB0aGUgZnVsbCBwYXRoIHRvIHRoZSB4MTF2bmMgcHJvZ3JhbSBmb3IgY2FzZXMgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGFyZ3ZbMF0gKGUuZy4gdGNwZC9pbmV0ZCkKLQotLWgsIC1oZWxwICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgdGV4dC4KLS0/LCAtb3B0cyAgICAgICAgICAgICAgT25seSBsaXN0IHRoZSB4MTF2bmMgb3B0aW9ucy4KLS1WLCAtdmVyc2lvbiAgICAgICAgICAgUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlLgotLWxpY2Vuc2UgICAgICAgICAgICAgICBQcmludCBvdXQgbGljZW5zZSBpbmZvcm1hdGlvbi4gIFNhbWUgYXMgLWNvcHlpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIC13YXJyYW50eS4KLQotLWRiZyAgICAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIGV4aXRpbmcgYWZ0ZXIgY2xlYW5pbmcgdXAsIHJ1biBhIHNpbXBsZQotICAgICAgICAgICAgICAgICAgICAgICAiZGVidWcgY3Jhc2ggc2hlbGwiIHdoZW4gZmF0YWwgZXJyb3JzIGFyZSB0cmFwcGVkLgotCi0tcSwgLXF1aWV0ICAgICAgICAgICAgIEJlIHF1aWV0IGJ5IHByaW50aW5nIGxlc3MgaW5mb3JtYXRpb25hbCBvdXRwdXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyLiAodXNlIC1ub3F1aWV0IHRvIHVuZG8gYW4gZWFybGllciAtcXVpZXQuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSAtcXVpZXQgb3B0aW9uIGRvZXMgbm90IGVsaW1pbmF0ZSBhbGwgaW5mb3JtYXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGl0IG9ubHkgcmVkdWNlcyBpdC4gIEl0IGlzIGlnbm9yZWQgaW4gbW9zdAotICAgICAgICAgICAgICAgICAgICAgICBhdXhpbGlhcnkgdXNhZ2UgbW9kZXMsIGUuZy4gLXN0b3JlcGFzc3dkLiAgVG8gZWxpbWluYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbCBvdXRwdXQgdXNlOiAyPi9kZXYvbnVsbCAxPiYyLCBldGMuCi0KLS12LCAtdmVyYm9zZSAgICAgICAgICAgUHJpbnQgb3V0IG1vcmUgaW5mb3JtYXRpb24gdG8gc3RkZXJyLgotCi0tYmcgICAgICAgICAgICAgICAgICAgIEdvIGludG8gdGhlIGJhY2tncm91bmQgYWZ0ZXIgc2NyZWVuIHNldHVwLiAgTWVzc2FnZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyIGFyZSBsb3N0IHVubGVzcyAtbyBsb2dmaWxlIGlzIHVzZWQuICBTb21ldGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgbGlrZSB0aGlzIGNvdWxkIGJlIHVzZWZ1bCBpbiBhIHNjcmlwdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9YHNzaCAtdCAkaG9zdCAieDExdm5jIC1kaXNwbGF5IDowIC1iZyIgfCBncmVwIFBPUlQKLWAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9YGVjaG8gIiRwb3J0IiB8IHNlZCAtZSAncy9QT1JUPS8vJ2AKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9YGV4cHIgJHBvcnQgLSA1OTAwYAotICAgICAgICAgICAgICAgICAgICAgICAgdm5jdmlld2VyICRob3N0OiRwb3J0Ci0KLS1tb2R0d2VhayAgICAgICAgICAgICAgT3B0aW9uIC1tb2R0d2VhayBhdXRvbWF0aWNhbGx5IHRyaWVzIHRvIGFkanVzdCB0aGUgQWx0R3IKLS1ub21vZHR3ZWFrICAgICAgICAgICAgYW5kIFNoaWZ0IG1vZGlmaWVycyBmb3IgZGlmZmVyaW5nIGxhbmd1YWdlIGtleWJvYXJkcwotICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGNsaWVudCBhbmQgaG9zdC4gIE90aGVyd2lzZSwgb25seSBhIHNpbmdsZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlc3MvcmVsZWFzZSBvZiBhIEtleWNvZGUgaXMgc2ltdWxhdGVkIChpLmUuIGlnbm9yaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGF0ZSBvZiB0aGUgbW9kaWZpZXJzOiB0aGlzIHVzdWFsbHkgd29ya3MgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCBrZXlib2FyZHMpLiAgQWxzbyB1c2VmdWwgaW4gcmVzb2x2aW5nIGNhc2VzCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGEgS2V5c3ltIGlzIGJvdW5kIHRvIG11bHRpcGxlIGtleXMgKGUuZy4gIjwiICsgIj4iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAiLCIgKyAiPCIga2V5cykuICBEZWZhdWx0OiAtbW9kdHdlYWsKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIHdpdGggd2l0aCBrZXlzIGFuZCAteGtiIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIC1ub3hrYiwgYW5kIHNpbWlsYXIgdGhpbmdzIGRvbid0IGhlbHAsIHRyeSAtbm9tb2R0d2Vhay4KLQotICAgICAgICAgICAgICAgICAgICAgICBPbiBzb21lIEhQLVVYIHN5c3RlbXMgaXQgaXMgYmVlbiBub3RlZCB0aGF0IHRoZXkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICBhbiBvZGQga2V5bWFwcGluZyB3aGVyZSBhIHNpbmdsZSBrZXljb2RlIHdpbGwgaGF2ZSBhCi0gICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSwgZS5nLiAiIyIsIHVwIHRvIHRocmVlIHRpbWVzLiAgWW91IGNhbiBjaGVjawotICAgICAgICAgICAgICAgICAgICAgICB2aWEgInhtb2RtYXAgLXBrIiBvciB0aGUgLWRrIG9wdGlvbi4gIFRoZSBmYWlsdXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHdoZW4geW91IHRyeSB0byB0eXBlICIjIiBpdCB5aWVsZHMgIjMiLiAgSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGlzIHByb2JsZW0gdHJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgIE1PRFRXRUFLX0xPV0VTVD0xIHRvIHNlZSBpZiBpdCBoZWxwcy4KLQotLXhrYiAgICAgICAgICAgICAgICAgICBXaGVuIGluIG1vZHR3ZWFrIG1vZGUsIHVzZSB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiAoaWYKLS1ub3hrYiAgICAgICAgICAgICAgICAgdGhlIFggZGlzcGxheSBzdXBwb3J0cyBpdCkgdG8gZG8gdGhlIG1vZGlmaWVyIHR3ZWFraW5nLgotICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHBvd2VyZnVsIGFuZCBzaG91bGQgYmUgdHJpZWQgaWYgdGhlcmUgYXJlIHN0aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGtleW1hcHBpbmcgcHJvYmxlbXMgd2hlbiB1c2luZyAtbW9kdHdlYWsgYnkgaXRzZWxmLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayB3aGV0aGVyIHNvbWUgY29tbW9uIGtleXN5bXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gISwgQCwgWywgYXJlIG9ubHkgYWNjZXNzaWJsZSB2aWEgLXhrYiBtb2RlIGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGVuIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSBtb2RlLiAgVG8gZGlzYWJsZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpYyBkZXRlY3Rpb24gdXNlIC1ub3hrYi4KLQotICAgICAgICAgICAgICAgICAgICAgICBXaGVuIC14a2IgbW9kZSBpcyBhY3RpdmUgeW91IGNhbiBzZXQgdGhlc2UgZW52LiB2YXJzLgotICAgICAgICAgICAgICAgICAgICAgICBUaGV5IGFwcGx5IG9ubHkgd2hlbiB0aGVyZSBpcyBhbWJpZ3VpdHkgYXMgdG8gd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAga2V5IHRvIGNob29zZSAoaS5lIHRoZSBtYXBwaW5nIGlzIG5vdCBvbmUtdG8tb25lKS4KLSAgICAgICAgICAgICAgICAgICAgICAgTk9LRVlISU5UUz0xOiBmb3IgdXAgYXNjaWkga2V5c3Ryb2tlcyBkbyBub3QgdXNlIHNjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgIGhpbnRzIHNhdmVkIHdoZW4gdGhlIGtleSB3YXMgcHJlc3NlZCBkb3duLiBOT0FOWURPV049MToKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVwIGtleXN0cm9rZXMgZG8gbm90IHJlc29ydCB0byBzZWFyY2hpbmcgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAgICBrZXlzIHRoYXQgYXJlIGN1cnJlbnRseSBwcmVzc2VkIGRvd24uICBLRVlTRE9XTj1OOgotICAgICAgICAgICAgICAgICAgICAgICByZW1lbWJlciB0aGUgbGFzdCBOIGtleXMgcHJlc3MgZG93biBmb3IgdGllLWJyZWFraW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW4gdXAga2V5c3Ryb2tlIGNvbWVzIGluLgotCi0tY2Fwc2xvY2sgICAgICAgICAgICAgIFdoZW4gaW4gLW1vZHR3ZWFrICh0aGUgZGVmYXVsdCkgb3IgLXhrYiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBpZiBhIGtleXN5bSBpbiB0aGUgcmFuZ2UgQS1aIGNvbWVzIGluIGNoZWNrIHRoZSBYCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB0byBzZWUgaWYgdGhlIENhcHNfTG9jayBpcyBzZXQuICBJZiBpdCBpcyBkbwotICAgICAgICAgICAgICAgICAgICAgICBub3QgYXJ0aWZpY2lhbGx5IHByZXNzIFNoaWZ0IHRvIGdlbmVyYXRlIHRoZSBrZXlzeW0uCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBlbmFibGUgdGhlIENhcHNMb2NrIGtleSB0byBiZWhhdmUgY29ycmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgIGluIHNvbWUgY2lyY3Vtc3RhbmNlczogbmFtZWx5ICpib3RoKiB0aGUgVk5DIHZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lIGFuZCB0aGUgeDExdm5jIFggc2VydmVyIGFyZSBpbiB0aGUgQ2Fwc0xvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgb24gc3RhdGUuICBJZiBvbmUgc2lkZSBoYXMgQ2Fwc0xvY2sgb24gYW5kIHRoZSBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICBvZmYgYW5kIHRoZSBrZXlib2FyZCBpcyBub3QgYmVoYXZpbmcgYXMgeW91IHRoaW5rIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCB5b3Ugc2hvdWxkIGNvcnJlY3QgdGhlIENhcHNMb2NrIHN0YXRlcyAoaGludDoKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NpbmcgQ2Fwc0xvY2sgaW5zaWRlIGFuZCBvdXRzaWRlIG9mIHRoZSB2aWV3ZXIgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHAgdG9nZ2xlIHRoZW0gYm90aCB0byB0aGUgY29ycmVjdCBzdGF0ZSkuICBIb3dldmVyLAotICAgICAgICAgICAgICAgICAgICAgICBmb3IgYmVzdCByZXN1bHRzIGRvIG5vdCB1c2UgdGhpcyBvcHRpb24sIGJ1dCByYXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgKm9ubHkqIGVuYWJsZSBDYXBzTG9jayBvbiB0aGUgVk5DIHZpZXdlciBzaWRlIChpLmUuIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHByZXNzaW5nIENhcHNMb2NrIG91dHNpZGUgb2YgdGhlIHZpZXdlciB3aW5kb3csIGFsc28KLSAgICAgICAgICAgICAgICAgICAgICAgLXNraXBfbG9ja2tleXMgYmVsb3cpLiAgQWxzbyB0cnkgLW5vbW9kdHdlYWsgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgd29ya2Fyb3VuZC4KLQotLXNraXBfbG9ja2tleXMgICAgICAgICBIYXZlIHgxMXZuYyBpZ25vcmUgYWxsIENhcHNfTG9jaywgU2hpZnRfTG9jaywgTnVtX0xvY2ssCi0tbm9za2lwX2xvY2trZXlzICAgICAgIFNjcm9sbF9Mb2NrIGtleXN5bXMgcmVjZWl2ZWQgZnJvbSB2aWV3ZXJzLiAgVGhlIGlkZWEgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IHByZXNzIENhcHNfTG9jayBvbiB0aGUgVk5DIFZpZXdlciBzaWRlIGJ1dCB0aGF0IGRvZXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGNoYW5nZSB0aGUgbG9jayBzdGF0ZSBpbiB0aGUgeDExdm5jLXNpZGUgWCBzZXJ2ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIE5ldmVydGhlbGVzcyB5b3VyIGNhcGl0YWxpemVkIGxldHRlcnMgY29tZSBpbiBvdmVyCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aXJlIGFuZCBhcmUgYXBwbGllZCBjb3JyZWN0bHkgdG8gdGhlIHgxMXZuYy1zaWRlCi0gICAgICAgICAgICAgICAgICAgICAgIFggc2VydmVyLiAgTm90ZSB0aGlzIG1vZGUgcHJvYmFibHkgd29uJ3QgZG8gd2hhdCB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgd2FudCBpbiAtbm9tb2R0d2VhayBtb2RlLiAgQWxzbywgYSBrbHVkZ2UgZm9yIEtQX24KLSAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzIGlzIGFsd2F5cyBkb25lIGluIHRoaXMgbW9kZTogdGhleSBhcmUgbWFwcGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgZGlnaXQga2V5c3ltcy4gIFNlZSBhbHNvIC1jYXBzbG9jayBhYm92ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgLW5vc2tpcF9sb2Nra2V5cy4KLQotLXNraXBfa2V5Y29kZXMgc3RyaW5nICBJZ25vcmUgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRlY2ltYWwga2V5Y29kZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhlc2UgYXJlIGtleWNvZGVzIG5vdCBvbiB5b3VyIGtleWJvYXJkIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICB5b3VyIFggc2VydmVyIHRoaW5rcyBleGlzdC4gIEN1cnJlbnRseSBvbmx5IGFwcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gLXhrYiBtb2RlLiAgVXNlIHRoaXMgb3B0aW9uIHRvIGhlbHAgeDExdm5jIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlIHByb2JsZW0gaXQgdHJpZXMgdG8gc29sdmU6IEtleXN5bSAtPiBLZXljb2RlKHMpCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW1iaWd1aXRpZXMgZXhpc3QgKG1vcmUgdGhhbiBvbmUgS2V5Y29kZSBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgS2V5c3ltKS4gIFJ1biAneG1vZG1hcCAtcGsnIHRvIHNlZSB5b3VyIGtleW1hcHBpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6ICItc2tpcF9rZXljb2RlcyA5NCwxMTQiCi0tc2xvcHB5X2tleXMgICAgICAgICAgIEV4cGVyaW1lbnRhbCBvcHRpb24gdGhhdCB0cmllcyB0byBjb3JyZWN0IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgInNsb3BweSIga2V5IGJlaGF2aW9yLiAgRS5nLiBpZiBhdCB0aGUgdmlld2VyIHlvdQotICAgICAgICAgICAgICAgICAgICAgICBwcmVzcyBTaGlmdCtLZXkgYnV0IHRoZW4gcmVsZWFzZSB0aGUgU2hpZnQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgIEtleSB0aGF0IGNvdWxkIGdpdmUgcmlzZSB0byBleHRyYSB1bndhbnRlZCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IG9ubHkgYmV0d2VlbiBrZXlib2FyZHMgb2YgZGlmZmVyZW50IGxhbmd1YWdlcykuCi0gICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBvYnNlcnZlIHByb2JsZW1zIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgc29tZSBrZXlzdHJva2VzLgotLXNraXBfZHVwcyAgICAgICAgICAgICBTb21lIFZOQyB2aWV3ZXJzIHNlbmQgaW1wb3NzaWJsZSByZXBlYXRlZCBrZXkgZXZlbnRzLAotLW5vc2tpcF9kdXBzICAgICAgICAgICBlLmcuIGtleS1kb3duLCBrZXktZG93biwga2V5LXVwLCBrZXktdXAgYWxsIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICBrZXksIG9yIDIwIGRvd25zIGluIGEgcm93IGZvciB0aGUgc2FtZSBtb2RpZmllciBrZXkhCi0gICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgLXNraXBfZHVwcyBtZWFucyB0byBza2lwIHRoZXNlIGR1cGxpY2F0ZXMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGp1c3QgcHJvY2VzcyB0aGUgZmlyc3QgZXZlbnQuIE5vdGU6IHNvbWUgVk5DIHZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIHRoZXkgY2FuIHNlbmQgZG93bidzIHdpdGhvdXQgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdXAncyBhbmQgc28geW91IHNob3VsZCBub3Qgc2V0IHRoaXMgb3B0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICB0aGVzZSB2aWV3ZXJzIChzeW1wdG9tOiBzb21lIGtleXMgZG8gbm90IGF1dG9yZXBlYXQpCi0gICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC1ub3NraXBfZHVwcwotLWFkZF9rZXlzeW1zICAgICAgICAgICBJZiBhIEtleXN5bSBpcyByZWNlaXZlZCBmcm9tIGEgVk5DIHZpZXdlciBhbmQgdGhhdAotLW5vYWRkX2tleXN5bXMgICAgICAgICBLZXlzeW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFggc2VydmVyLCB0aGVuIGFkZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgS2V5c3ltIHRvIHRoZSBYIHNlcnZlcidzIGtleWJvYXJkIG1hcHBpbmcgb24gYW4gdW51c2VkCi0gICAgICAgICAgICAgICAgICAgICAgIGtleS4gIEFkZGVkIEtleXN5bXMgd2lsbCBiZSByZW1vdmVkIHBlcmlvZGljYWxseSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB3aGVuIHgxMXZuYyBleGl0cy4gIERlZmF1bHQ6IC1hZGRfa2V5c3ltcwotLWNsZWFyX21vZHMgICAgICAgICAgICBBdCBzdGFydHVwIGFuZCBleGl0IGNsZWFyIHRoZSBtb2RpZmllciBrZXlzIGJ5IHNlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVsZWFzZSBmb3IgZWFjaCBvbmUuIFRoZSBMb2NrIG1vZGlmaWVycyBhcmUgc2tpcHBlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBjbGVhciB0aGUgc3RhdGUgaWYgdGhlIGRpc3BsYXkgd2FzIGFjY2lkZW50YWxseQotICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHdpdGggYW55IHByZXNzZWQgZG93bi4KLS1jbGVhcl9rZXlzICAgICAgICAgICAgQXMgLWNsZWFyX21vZHMsIGV4Y2VwdCB0cnkgdG8gcmVsZWFzZSBBTlkgcHJlc3NlZCBrZXkuCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhbmQgLWNsZWFyX21vZHMgY2FuIGludGVyZmVyZQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgcGVyc29uIHR5cGluZyBhdCB0aGUgcGh5c2ljYWwga2V5Ym9hcmQuCi0tY2xlYXJfYWxsICAgICAgICAgICAgIEFzIC1jbGVhcl9rZXlzLCBleGNlcHQgdHJ5IHRvIHJlbGVhc2UgYW55IENhcHNMb2NrLAotICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrLCBldGMuIGxvY2tzIGFzIHdlbGwuCi0KLS1yZW1hcCBzdHJpbmcgICAgICAgICAgUmVhZCBLZXlzeW0gcmVtYXBwaW5ncyBmcm9tIGZpbGUgbmFtZWQgInN0cmluZyIuCi0gICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCBpcyBvbmUgcGFpciBvZiBLZXlzeW1zIHBlciBsaW5lIChjYW4gYmUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICBvciBoZXggdmFsdWUpIHNlcGFyYXRlZCBieSBhIHNwYWNlLiAgSWYgbm8gZmlsZSBuYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiBleGlzdHMsIGl0IGlzIGluc3RlYWQgaW50ZXJwcmV0ZWQgYXMgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JtOiBrZXkxLWtleTIsa2V5My1rZXk0LC4uLiAgU2VlIDxYMTEva2V5c3ltZGVmLmg+Ci0gICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBmaWxlIGZvciBhIGxpc3Qgb2YgS2V5c3ltIG5hbWVzLCBvciB1c2UgeGV2KDEpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRvIG1hcCBhIGtleSB0byBhIGJ1dHRvbiBjbGljaywgdXNlIHRoZSBmYWtlIEtleXN5bXMKLSAgICAgICAgICAgICAgICAgICAgICAgIkJ1dHRvbjEiLCAuLi4sIGV0Yy4gRS5nOiAiLXJlbWFwIFN1cGVyX1ItQnV0dG9uMiIKLSAgICAgICAgICAgICAgICAgICAgICAgKHVzZWZ1bCBmb3IgcGFzdGluZyBvbiBhIGxhcHRvcCkKLQotICAgICAgICAgICAgICAgICAgICAgICBJIHVzZSB0aGVzZSBpZiB0aGUgbWFjaGluZSBJIGFtIHZpZXdpbmcgZnJvbSBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGEgc2Nyb2xsd2hlZWwgb3IgSSBkb24ndCBsaWtlIHVzaW5nIHRoZSBvbmUgaXQgaGFzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmVtYXAgU3VwZXJfUi1CdXR0b240LE1lbnUtQnV0dG9uNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlbWFwIEtQX0FkZC1CdXR0b240LEtQX0VudGVyLUJ1dHRvbjUKLQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWVyIHdvdWxkIGJlIHVzZWQgb24gYSBQQywgdGhlIGxhdHRlciBvbiBhCi0gICAgICAgICAgICAgICAgICAgICAgIE1hY0Jvb2suICBUaGlzIHdheSB0aG9zZSBsaXR0bGUgdXNlZCBrZXlzIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGdlbmVyYXRlIGJpZ2dlciBob3BzIHRoYW4gdGhlIFVwIGFuZCBEb3duIGFycm93cwotICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlLiAgT25lIGNhbiBzY3JvbGwgdGhyb3VnaCB0ZXh0IG9yIHdlYiBwYWdlcyBtb3JlCi0gICAgICAgICAgICAgICAgICAgICAgIHF1aWNrbHkgdGhpcyB3YXkgKGVzcGVjaWFsbHkgaWYgeDExdm5jIHNjcm9sbCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgaXMgYWN0aXZlLikKLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgQnV0dG9uNDQsIEJ1dHRvbjEyLCBldGMuIGZvciBtdWx0aXBsZSBjbGlja3MuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSBhIGtleXN5bSAoaS5lLiBtYWtlIGl0IHNvIGl0IHdpbGwgbm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkKSwgcmVtYXAgaXQgdG8gIk5vU3ltYm9sIiBvciAiTm9uZSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRGVhZCBrZXlzOiAiZGVhZCIgKG9yIHNpbGVudCwgbXV0ZSkga2V5cyBhcmUga2V5cyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcm9kdWNlIGEgY2hhcmFjdGVyIGJ1dCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgMm5kCi0gICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZS4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgYWNjZW50aW5nIGNoYXJhY3RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gdG8gcHV0ICJgIiBvbiB0b3Agb2YgImEiIGJ5IHByZXNzaW5nIHRoZSBkZWFkCi0gICAgICAgICAgICAgICAgICAgICAgIGtleSBhbmQgdGhlbiAiYSIuICBOb3RlIHRoYXQgdGhpcyBpbnRlcnByZXRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcGFydCBvZiBjb3JlIFgxMSwgaXQgaXMgdXAgdG8gdGhlIHRvb2xraXQgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdG8gZGVjaWRlIGhvdyB0byByZWFjdCB0byB0aGUgc2VxdWVuY2UuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBYMTEgbmFtZXMgZm9yIHRoZXNlIGtleXN5bXMgYXJlICJkZWFkX2dyYXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImRlYWRfYWN1dGUiLCBldGMuICBIb3dldmVyIHNvbWUgVk5DIHZpZXdlcnMgc2VuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltcyAiZ3JhdmUiLCAiYWN1dGUiIGluc3RlYWQgdGhlcmVieSBkaXNhYmxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjY2VudGluZy4gIFRvIHdvcmsgYXJvdW5kIHRoaXMgLXJlbWFwIGNhbiBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSAiLXJlbWFwIGdyYXZlLWRlYWRfZ3JhdmUsYWN1dGUtZGVhZF9hY3V0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgQXMgYSBjb252ZW5pZW5jZSwgIi1yZW1hcCBERUFEIiBhcHBsaWVzIHRoZXNlIHJlbWFwczoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgICAgIGdyYXZlLWRlYWRfZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICAgICBhY3V0ZS1kZWFkX2FjdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAgICAgYXNjaWljaXJjdW0tZGVhZF9jaXJjdW1mbGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAgICAgYXNjaWl0aWxkZS1kZWFkX3RpbGRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSAgICAgbWFjcm9uLWRlYWRfbWFjcm9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAgICAgYnJldmUtZGVhZF9icmV2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgICAgIGFib3ZlZG90LWRlYWRfYWJvdmVkb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICAgICBkaWFlcmVzaXMtZGVhZF9kaWFlcmVzaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICAgICBkZWdyZWUtZGVhZF9hYm92ZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBICAgICBkb3VibGVhY3V0ZS1kZWFkX2RvdWJsZWFjdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAgICAgY2Fyb24tZGVhZF9jYXJvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgICAgIGNlZGlsbGEtZGVhZF9jZWRpbGxhCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGp1c3Qgd2FudCBhIHN1YnNldCB1c2UgdGhlIGZpcnN0IGxldHRlcgotICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCwgZS5nLiAiLXJlbWFwIERFQUQ9Z2EiIHRvIGdldCB0aGUgZmlyc3QgdHdvLgotICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHJlbWFwcyBtYXkgYWxzbyBiZSBzdXBwbGllZCB2aWEgY29tbWFzLAotICAgICAgICAgICAgICAgICAgICAgICBlLmcuICAiLXJlbWFwIERFQUQ9Z2EsU3VwZXJfUi1CdXR0b24yIi4gIEZpbmFsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICJERUFEPW1pc3NpbmciIG1lYW5zIHRvIGFwcGx5IGFsbCBvZiB0aGUgYWJvdmUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBhcyB0aGUgbGVmdCBoYW5kIG1lbWJlciBpcyBub3QgYWxyZWFkeSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgWDExIGtleW1hcC4KLQotLW5vcmVwZWF0ICAgICAgICAgICAgICBPcHRpb24gLW5vcmVwZWF0IGRpc2FibGVzIFggc2VydmVyIGtleSBhdXRvIHJlcGVhdCB3aGVuCi0tcmVwZWF0ICAgICAgICAgICAgICAgIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQgYW5kIFZOQyBrZXlib2FyZCBpbnB1dCBpcwotICAgICAgICAgICAgICAgICAgICAgICBub3QgaWRsZSBmb3IgbW9yZSB0aGFuIDUgbWludXRlcy4gIFRoaXMgd29ya3MgYXJvdW5kIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0aW5nIGtleXN0cm9rZXMgYnVnICh0cmlnZ2VyZWQgYnkgbG9uZyBwcm9jZXNzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGRlbGF5cyBiZXR3ZWVuIGtleSBkb3duIGFuZCBrZXkgdXAgY2xpZW50IGV2ZW50czoKLSAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIGZyb20gbGFyZ2Ugc2NyZWVuIGNoYW5nZXMgb3IgaGlnaCBsYXRlbmN5KS4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLW5vcmVwZWF0Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgdGhlIGVudi4gdmFyLiBYMTFWTkNfSURMRV9USU1FT1VUIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgaWRsZSBzZWNvbmRzIHlvdSB3YW50ICg1bWluID0gMzAwc2VjcykuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogeW91ciBWTkMgdmlld2VyIHNpZGUgd2lsbCBsaWtlbHkgZG8gYXV0b3JlcGVhdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgc28gdGhpcyBpcyBubyBsb3NzIHVubGVzcyBzb21lb25lIGlzIHNpbXVsdGFuZW91c2x5IGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWFsIFggZGlzcGxheS4KLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgIi1ub3JlcGVhdCBOIiB0byBzZXQgaG93IG1hbnkgdGltZXMgbm9yZXBlYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBiZSByZXNldCBpZiBzb21ldGhpbmcgZWxzZSAoZS5nLiBYIHNlc3Npb24gbWFuYWdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgdW5kb2VzIGl0LiAgVGhlIGRlZmF1bHQgaXMgMi4gIFVzZSBhIG5lZ2F0aXZlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB1bmxpbWl0ZWQgcmVzZXRzLgotCi0tbm9mYiAgICAgICAgICAgICAgICAgIElnbm9yZSB2aWRlbyBmcmFtZWJ1ZmZlcjogb25seSBwcm9jZXNzIGtleWJvYXJkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLiAgSW50ZW5kZWQgZm9yIHVzZSB3aXRoIFdpbjJWTkMgYW5kIHgydm5jCi0gICAgICAgICAgICAgICAgICAgICAgIGR1YWwtbW9uaXRvciBzZXR1cHMuCi0tbm9iZWxsICAgICAgICAgICAgICAgIERvIG5vdCB3YXRjaCBmb3IgWEJlbGwgZXZlbnRzLiAobm8gYmVlcHMgd2lsbCBiZSBoZWFyZCkKLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogWEJlbGwgbW9uaXRvcmluZyByZXF1aXJlcyB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbi4KLS1ub3NlbCAgICAgICAgICAgICAgICAgRG8gbm90IG1hbmFnZSBleGNoYW5nZSBvZiBYIHNlbGVjdGlvbi9jdXRidWZmZXIgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICBWTkMgdmlld2VycyBhbmQgdGhlIFggc2VydmVyIGF0IGFsbC4KLS1ub3ByaW1hcnkgICAgICAgICAgICAgRG8gbm90IHBvbGwgdGhlIFBSSU1BUlkgc2VsZWN0aW9uIGZvciBjaGFuZ2VzIHRvIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgYmFjayB0byBjbGllbnRzLiAgKFBSSU1BUlkgaXMgc3RpbGwgc2V0IG9uIHJlY2VpdmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMsIGhvd2V2ZXIpLgotLW5vc2V0cHJpbWFyeSAgICAgICAgICBEbyBub3Qgc2V0IHRoZSBQUklNQVJZIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyByZWNlaXZlZAotICAgICAgICAgICAgICAgICAgICAgICBmcm9tIFZOQyBjbGllbnRzLgotLW5vY2xpcGJvYXJkICAgICAgICAgICBEbyBub3QgcG9sbCB0aGUgQ0xJUEJPQVJEIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyB0byBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGJhY2sgdG8gY2xpZW50cy4gIChDTElQQk9BUkQgaXMgc3RpbGwgc2V0IG9uIHJlY2VpdmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMsIGhvd2V2ZXIpLgotLW5vc2V0Y2xpcGJvYXJkICAgICAgICBEbyBub3Qgc2V0IHRoZSBDTElQQk9BUkQgc2VsZWN0aW9uIGZvciBjaGFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGZyb20gVk5DIGNsaWVudHMuCi0tc2VsZGlyIHN0cmluZyAgICAgICAgIElmIGRpcmVjdGlvbiBzdHJpbmcgaXMgInNlbmQiLCBvbmx5IHNlbmQgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB0byB2aWV3ZXJzLCBhbmQgaWYgaXQgaXMgInJlY3YiIG9ubHkgcmVjZWl2ZSBpdCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMuICBUbyB3b3JrIGFyb3VuZCBhcHBzIHNldHRpbmcgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB0b28gZnJlcXVlbnRseSBhbmQgbWVzc2luZyB1cCB0aGUgb3RoZXIgZW5kLiAgWW91IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxseSBzdXBwbHkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgImRlYnVnIiB0byB0dXJuIG9uIGRlYnVnZ2luZyBvdXRwdXQuCi0KLS1jdXJzb3IgW21vZGVdICAgICAgICAgU2V0cyBob3cgdGhlIHBvaW50ZXIgY3Vyc29yIHNoYXBlIChsaXR0bGUgaWNvbiBhdCB0aGUKLS1ub2N1cnNvciAgICAgICAgICAgICAgbW91c2UgcG9pbnRlcikgc2hvdWxkIGJlIGhhbmRsZWQuICBUaGUgIm1vZGUiIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICBpcyBvcHRpb25hbCBhbmQgaXMgZGVzY3JpYmVkIGJlbG93LiAgVGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gc2hvdyBzb21lIHNvcnQgb2YgY3Vyc29yIHNoYXBlKHMpLiAgSG93IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgZG9uZSBkZXBlbmRzIG9uIHRoZSBWTkMgdmlld2VyIGFuZCB0aGUgWCBzZXJ2ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZSAtbm9jdXJzb3IgdG8gZGlzYWJsZSBjdXJzb3Igc2hhcGVzIGNvbXBsZXRlbHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU29tZSBWTkMgdmlld2VycyBzdXBwb3J0IHRoZSBUaWdodFZOQyBDdXJzb3JQb3NVcGRhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBDdXJzb3JTaGFwZVVwZGF0ZXMgZXh0ZW5zaW9ucyAoY3V0cyBkb3duIG9uCi0gICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgdHJhZmZpYyBieSBub3QgaGF2aW5nIHRvIHNlbmQgdGhlIGN1cnNvciBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgICBldmVyeSB0aW1lIHRoZSBwb2ludGVyIGlzIG1vdmVkKSwgaW4gd2hpY2ggY2FzZSB0aGVzZQotICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zIGFyZSB1c2VkIChzZWUgLW5vY3Vyc29yc2hhcGUgYW5kIC1ub2N1cnNvcnBvcwotICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0byBkaXNhYmxlKS4gIEZvciBvdGhlciB2aWV3ZXJzIHRoZSBjdXJzb3Igc2hhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgZnJhbWVidWZmZXIgZXZlcnkgdGltZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBpcyBtb3ZlZCBvciBjaGFuZ2VkIGFuZCBnZXRzIHNlbnQgYWxvbmcgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3RoZXIgZnJhbWVidWZmZXIgdXBkYXRlcy4gIEluIHRoaXMgY2FzZSwgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzb21lIGxhZyBiZXR3ZWVuIHRoZSB2bmMgdmlld2VyIHBvaW50ZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByZW1vdGUgY3Vyc29yIHBvc2l0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBYIGRpc3BsYXkgc3VwcG9ydHMgcmV0cmlldmluZyB0aGUgY3Vyc29yIHNoYXBlCi0gICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIFggc2VydmVyLCB0aGVuIHRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHVzZSB0aGF0IG1vZGUuICBPbiBTb2xhcmlzIHRoaXMgY2FuIGJlIGRvbmUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgU1VOX09WTCBleHRlbnNpb24gdXNpbmcgLW92ZXJsYXkgKHNlZSBhbHNvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAtb3ZlcmxheV9ub2N1cnNvciBvcHRpb24pLiAgQSBzaW1pbGFyIG92ZXJsYXkgc2NoZW1lCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgb24gSVJJWC4gIFhvcmcgKGUuZy4gTGludXgpIGFuZCByZWNlbnQgU29sYXJpcwotICAgICAgICAgICAgICAgICAgICAgICBYc3VuIHNlcnZlcnMgc3VwcG9ydCB0aGUgWEZJWEVTIGV4dGVuc2lvbiB0byByZXRyaWV2ZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXhhY3QgY3Vyc29yIHNoYXBlIGZyb20gdGhlIFggc2VydmVyLiAgSWYgWEZJWEVTCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQgaXQgaXMgcHJlZmVycmVkIG92ZXIgT3ZlcmxheSBhbmQgaXMgdXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IChzZWUgLW5veGZpeGVzIGJlbG93KS4gIFRoaXMgY2FuIGJlIGRpc2FibGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggLW5vY3Vyc29yLCBhbmQgYWxzbyBzb21lIHZhbHVlcyBvZiB0aGUgIm1vZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBiZWxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdW5kZXIgWEZJWEVTIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpIHdpbGwgdXN1YWxseSBub3QgYmUgZXhhY3RseSByZXByZXNlbnRlZCBhbmQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgIG1heSBmaW5kIE92ZXJsYXkgcHJlZmVyYWJsZS4gIFNlZSBhbHNvIHRoZSAtYWxwaGFjdXQKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1hbHBoYWZyYWMgb3B0aW9ucyBiZWxvdyBhcyBmdWRnZSBmYWN0b3JzIHRvIHRyeQotICAgICAgICAgICAgICAgICAgICAgICB0byBpbXByb3ZlIHRoZSBzaXR1YXRpb24gZm9yIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgZ2l2ZW4gdGhlbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtb2RlIiBzdHJpbmcgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5aW5nIG9mIGN1cnNvciBzaGFwZXMuICBJdCBjYW4gYmUgdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIi1jdXJzb3IgYXJyb3ciIC0ganVzdCBzaG93IHRoZSBzdGFuZGFyZCBhcnJvdwotICAgICAgICAgICAgICAgICAgICAgICBub3RoaW5nIG1vcmUgb3Igbm90aGluZyBsZXNzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICItY3Vyc29yIG5vbmUiIC0gc2FtZSBhcyAiLW5vY3Vyc29yIgotCi0gICAgICAgICAgICAgICAgICAgICAgICItY3Vyc29yIFgiIC0gd2hlbiB0aGUgY3Vyc29yIGFwcGVhcnMgdG8gYmUgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgd2luZG93LCBkcmF3IHRoZSBmYW1pbGlhciBYIHNoYXBlLiAgU29tZSBkZXNrdG9wcwotICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIEdOT01FIGNvdmVyIHVwIHRoZSByb290IHdpbmRvdyBjb21wbGV0ZWx5LAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgc28gdGhpcyB3aWxsIG5vdCB3b3JrLCB0cnkgIlgxIiwgZXRjLCB0byB0cnkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgdGhlIHRyZWUgZGVwdGguICBPbiBoaWdoIGxhdGVuY3kgbGlua3Mgb3Igc2xvdwotICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lcyB0aGVyZSB3aWxsIGJlIGEgdGltZSBsYWcgYmV0d2VlbiBleHBlY3RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCBjdXJzb3Igc2hhcGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIi1jdXJzb3Igc29tZSIgLSBsaWtlICJYIiBidXQgdXNlIGFkZGl0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgaGV1cmlzdGljcyB0byB0cnkgdG8gZ3Vlc3MgaWYgdGhlIHdpbmRvdyBzaG91bGQgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICBhIHdpbmRvd21hbmFnZXItbGlrZSByZXNpemVyIGN1cnNvciBvciBhIHRleHQgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgSS1iZWFtIGN1cnNvci4gIFRoaXMgaXMgYSBjb21wbGV0ZSBoYWNrLCBidXQgbWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCBpbiBzb21lIHNpdHVhdGlvbnMgYmVjYXVzZSBpdCBwcm92aWRlcyBhIGxpdHRsZQotICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGZlZWRiYWNrIGFib3V0IHRoZSBjdXJzb3Igc2hhcGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIi1jdXJzb3IgbW9zdCIgLSB0cnkgdG8gc2hvdyBhcyBtYW55IGN1cnNvcnMgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuICBPZnRlbiB0aGlzIHdpbGwgb25seSBiZSB0aGUgc2FtZSBhcyAic29tZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoZSBkaXNwbGF5IGhhcyBvdmVybGF5IHZpc3VhbHMgb3IgWEZJWEVTCi0gICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgYXZhaWxhYmxlLiAgT24gU29sYXJpcyBhbmQgSVJJWCBpZiBYRklYRVMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZSwgLW92ZXJsYXkgbW9kZSB3aWxsIGJlIGF0dGVtcHRlZC4KLQotLWN1cnNvcl9kcmFnICAgICAgICAgICBTaG93IGN1cnNvciBzaGFwZSBjaGFuZ2VzIGV2ZW4gd2hlbiB0aGUgbW91c2UgaXMgYmVpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZCB3aXRoIGEgbW91c2UgYnV0dG9uIGRvd24uICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBiZSBhYmxlIHRvIHNlZSBEcmFnLWFuZC1Ecm9wIGN1cnNvciBpY29ucywgZXRjLgotCi0tYXJyb3cgbiAgICAgICAgICAgICAgIENob29zZSBhbiBhbHRlcm5hdGUgImFycm93IiBjdXJzb3IgZnJvbSBhIHNldCBvZgotICAgICAgICAgICAgICAgICAgICAgICBzb21lIGNvbW1vbiBvbmVzLiAgbiBjYW4gYmUgMSB0byA2LiAgRGVmYXVsdCBpczogMQotICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIHdoZW4gaW4gWEZJWEVTIGN1cnNvci1ncmFiYmluZyBtb2RlLgotCi0tbm94Zml4ZXMgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIFhGSVhFUyBleHRlbnNpb24gdG8gZHJhdyB0aGUgZXhhY3QgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIHNoYXBlIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHdvcmsgYXJvdW5kIGEgY3Jhc2ggaW4gWG9yZyAxLjUgYW5kIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHNvbWUgcGVvcGxlIG5lZWRlZCB0byB1c2UgLW5veGZpeGVzLiAgVGhlIFhvcmcgY3Jhc2gKLSAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWQgcmlnaHQgYWZ0ZXIgYSBEaXNwbGF5IE1hbmFnZXIgKGUuZy4gR0RNKSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjkgaXQgdHJpZXMgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCB1c2luZyBYRklYRVMgdW50aWwgaXQgaXMgc3VyZSBhIHdpbmRvdyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHJ1bm5pbmcuICBTZWUgdGhlIC1yZW9wZW4gb3B0aW9uIGZvciBtb3JlIGluZm8gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGhvdyB0byB1c2UgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIgdG8gZGlzYWJsZSBpdC4KLQotLWFscGhhY3V0IG4gICAgICAgICAgICBXaGVuIHVzaW5nIHRoZSBYRklYRVMgZXh0ZW5zaW9uIGZvciB0aGUgY3Vyc29yIHNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5IHdpbGwgbm90IHVzdWFsbHkgYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAgICAgICAgIGV4YWN0bHkgKGJ1dCBvcGFxdWUgb25lcyB3aWxsKS4gIFRoaXMgb3B0aW9uIHNldHMgbiBhcwotICAgICAgICAgICAgICAgICAgICAgICBhIGN1dG9mZiBmb3IgY3Vyc29ycyB0aGF0IGhhdmUgdHJhbnNwYXJlbmN5ICgiYWxwaGEKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCIgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIDAgdG8gMjU1KSBBbnkgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIHdpdGggYWxwaGEgdmFsdWUgbGVzcyB0aGFuIG4gYmVjb21lcyBjb21wbGV0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50LiAgT3RoZXJ3aXNlIHRoZSBwaXhlbCBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAyNDAKLQotLWFscGhhZnJhYyBmcmFjdGlvbiAgICBXaXRoIHRoZSB0aHJlc2hvbGQgaW4gLWFscGhhY3V0IHNvbWUgY3Vyc29ycyB3aWxsIGJlY29tZQotICAgICAgICAgICAgICAgICAgICAgICBhbG1vc3QgY29tcGxldGVseSB0cmFuc3BhcmVudCBiZWNhdXNlIHRoZWlyIGFscGhhIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBhcmUgbm90IGhpZ2ggZW5vdWdoLiAgRm9yIHRob3NlIGN1cnNvcnMgYWRqdXN0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSB0aHJlc2hvbGQgdW50aWwgZnJhY3Rpb24gb2YgdGhlIG5vbi16ZXJvIGFscGhhCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgcGl4ZWxzIGJlY29tZSBvcGFxdWUuICBEZWZhdWx0IDAuMzMKLS1hbHBoYXJlbW92ZSAgICAgICAgICAgQnkgZGVmYXVsdCwgWEZJWEVTIGN1cnNvcnMgcGl4ZWxzIHdpdGggdHJhbnNwYXJlbmN5IGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFscGhhIGZhY3RvciBtdWx0aXBsaWVkIGludG8gdGhlIFJHQiBjb2xvciB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhhdCBjb3JyZXNwb25kaW5nIHRvIGJsZW5kaW5nIHRoZSBjdXJzb3Igd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICAgIGJsYWNrIGJhY2tncm91bmQpLiAgU3BlY2lmeSB0aGlzIG9wdGlvbiB0byByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGZhY3Rvci4gKHVzZWZ1bCBmb3IgbGlnaHQgY29sb3JlZCBzZW1pLXRyYW5zcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnMpLgotLW5vYWxwaGFibGVuZCAgICAgICAgICBJbiBYRklYRVMgbW9kZSBkbyBub3Qgc2VuZCBjdXJzb3IgYWxwaGEgY2hhbm5lbCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIExpYlZOQ1NlcnZlci4gIFRoZSBkZWZhdWx0IGlzIHRvIHNlbmQgaXQuICBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFibGVuZCBlZmZlY3Qgd2lsbCBvbmx5IGJlIHZpc2libGUgaW4gLW5vY3Vyc29yc2hhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciBmb3IgY2xpZW50cyB3aXRoIGN1cnNvcnNoYXBldXBkYXRlcyB0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgICAgb2ZmLiAoSG93ZXZlciB0aGVyZSBpcyBhIGhhY2sgZm9yIDMyYnBwIHdpdGggZGVwdGggMjQsCi0gICAgICAgICAgICAgICAgICAgICAgIGl0IHVzZXMgdGhlIGV4dHJhIDggYml0cyB0byBzdG9yZSBjdXJzb3IgdHJhbnNwYXJlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2Ugd2l0aCBhIGhhY2tlZCB2bmN2aWV3ZXIgdGhhdCBhcHBsaWVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgbG9jYWxseS4gIFNlZSB0aGUgRkFRIGZvciBtb3JlIGluZm8pLgotCi0tbm9jdXJzb3JzaGFwZSAgICAgICAgIERvIG5vdCB1c2UgdGhlIFRpZ2h0Vk5DIEN1cnNvclNoYXBlVXBkYXRlcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBjbGllbnRzIHN1cHBvcnQgaXQuICBTZWUgLWN1cnNvciBhYm92ZS4KLS1jdXJzb3Jwb3MgICAgICAgICAgICAgT3B0aW9uIC1jdXJzb3Jwb3MgZW5hYmxlcyBzZW5kaW5nIHRoZSBYIGN1cnNvciBwb3NpdGlvbgotLW5vY3Vyc29ycG9zICAgICAgICAgICBiYWNrIHRvIGFsbCB2bmMgY2xpZW50cyB0aGF0IHN1cHBvcnQgdGhlIFRpZ2h0Vk5DCi0gICAgICAgICAgICAgICAgICAgICAgIEN1cnNvclBvc1VwZGF0ZXMgZXh0ZW5zaW9uLiAgT3RoZXIgY2xpZW50cyB3aWxsIGJlIGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIHRoZSBwb2ludGVyIG1vdGlvbnMuIERlZmF1bHQ6IC1jdXJzb3Jwb3MKLS14d2FycHBvaW50ZXIgICAgICAgICAgTW92ZSB0aGUgcG9pbnRlciB3aXRoIFhXYXJwUG9pbnRlcigzWCkgaW5zdGVhZCBvZgotLW5veHdhcnBwb2ludGVyICAgICAgICB0aGUgWFRFU1QgZXh0ZW5zaW9uLiAgVXNlIHRoaXMgYXMgYSB3b3JrYXJvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBwb2ludGVyIG1vdGlvbiBiZWhhdmVzIGluY29ycmVjdGx5LCBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG9uIHRvdWNoc2NyZWVucyBvciBvdGhlciBub24tc3RhbmRhcmQgc2V0dXBzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGFsc28gc29tZXRpbWVzIG5lZWRlZCBvbiBYSU5FUkFNQSBkaXNwbGF5cyBhbmQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBieSBkZWZhdWx0IGlmIFhJTkVSQU1BIGlzIGZvdW5kIHRvIGJlIGFjdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gcHJldmVudCB0aGlzLCB1c2UgLW5veHdhcnBwb2ludGVyLgotCi0tYWx3YXlzX2luamVjdCAgICAgICAgIEV2ZW4gaWYgdGhlcmUgaXMgbm8gZGlzcGxhY2VtZW50IChkeCA9IGR5ID0gMCkgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIG1vdXNlIGV2ZW50IGZvcmNlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmRpY2F0ZWQgeCx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFueXdheS4gIFJlY2VudCAoMjAwOSkgZ3VpIHRvb2xraXRzIChnbm9tZSkKLSAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBwcm9ibGVtcyB3aXRoIHgxMXZuYydzIG9yaWdpbmFsIG1vdXNlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbiBtZXRob2QuICBTbyB4MTF2bmMncyBtb3VzZSBpbnB1dCBpbmplY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIG1vZGlmaWVkLiAgVG8gcmVnYWluIHRoZSBPTEQgYmVoYXZpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgb3B0aW9uOiAtYWx3YXlzX2luamVjdC4gIFRoZW4geDExdm5jIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIGZvcmNlIHBvc2l0aW9uaW5nIHRoZSBtb3VzZSB0byB0aGUgeCx5IHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgdGhhdCBwb3NpdGlvbiBoYXMgbm90IGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgIFZOQyBpbnB1dCBldmVudC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgcGxhY2UgdGhpcyBwcm9ibGVtIHdhcyBub3RpY2VkIHdhcyBpbiBnbm9tZQotICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbDogaWYgeW91IHByZXNzZWQgYW5kIHJlbGVhc2VkIG1vdXNlIGJ1dHRvbiAzLCBhCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbnUgd2FzIHBvc3RlZCBhbmQgdGhlbiBpdHMgZmlyc3QgZWxlbWVudCAnTmV3IFRlcm1pbmFsCi0gICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdycgd2FzIGFjdGl2YXRlZC4gIFRoaXMgd2FzIGJlY2F1c2UgeDExdm5jIGluamVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3VzZSBwb3NpdGlvbiB0d2ljZTogb25jZSBvbiBCdXR0b25QcmVzcyBhbmQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgb24gQnV0dG9uUmVsZWFzZS4gIFRoZSB0b29sa2l0IGludGVycHJldGVkIHRoZSAybmQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIG1vdXNlIG1vdGlvbiBldmVuIHRob3VnaCB0aGUgbW91c2UgaGFkbid0IG1vdmVkLgotICAgICAgICAgICAgICAgICAgICAgICBTbyBub3cgYnkgZGVmYXVsdCB4MTF2bmMgdHJpZXMgdG8gYXZvaWQgaW5qZWN0aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAybmQgb25lLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3aXRoIHRoZSBuZXcgZGVmYXVsdCB4MTF2bmMgd2lsbCBiZSBvYmxpdmlvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYXBwbGljYXRpb25zIG1vdmluZyB0aGUgcG9pbnRlciAod2FycGluZykgb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgbW92aW5nIGl0LiAgU28gaXQgbWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGluamVjdCBCdXR0b25SZWxlYXNlIGF0IHRoZSB3cm9uZyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyAob3Igc2ltaWxhciBzY2VuYXJpb3MpIGNhdXNlcyBwcm9ibGVtcyBpbiB5b3VyCi0gICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LCBzcGVjaWZ5IC1hbHdheXNfaW5qZWN0IGZvciB0aGUgb2xkIG1ldGhvZC4KLQotLWJ1dHRvbm1hcCBzdHJpbmcgICAgICBTdHJpbmcgdG8gcmVtYXAgbW91c2UgYnV0dG9ucy4gIEZvcm1hdDogSUpLLUxNTiwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBtYXBzIGJ1dHRvbnMgSSAtPiBMLCBldGMuLCBlLmcuICAtYnV0dG9ubWFwIDEzLTMxCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uIHByZXNzZXMgY2FuIGFsc28gYmUgbWFwcGVkIHRvIGtleXN0cm9rZXM6IHJlcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgYSBidXR0b24gZGlnaXQgb24gdGhlIHJpZ2h0IG9mIHRoZSBkYXNoIHdpdGggOjxzeW0+OgotICAgICAgICAgICAgICAgICAgICAgICBvciA6PHN5bTE+KzxzeW0yPjogZXRjLiBmb3IgbXVsdGlwbGUga2V5cy4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSB2aWV3aW5nIG1hY2hpbmUgaGFzIGEgbW91c2Utd2hlZWwgKGJ1dHRvbnMgNCA1KQotICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIHgxMXZuYyBzaWRlIGRvZXMgbm90LCB0aGVzZSB3aWxsIGRvIHNjcm9sbHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYnV0dG9ubWFwIDEyMzQ1LTEyMzpQcmlvcjo6TmV4dDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1idXR0b25tYXAgMTIzNDUtMTIzOlVwK1VwK1VwOjpEb3duK0Rvd24rRG93bjoKLQotICAgICAgICAgICAgICAgICAgICAgICBTZWUgPFgxMS9rZXlzeW1kZWYuaD4gaGVhZGVyIGZpbGUgZm9yIGEgbGlzdCBvZiBLZXlzeW1zLAotICAgICAgICAgICAgICAgICAgICAgICBvciB1c2UgdGhlIHhldigxKSBwcm9ncmFtLiAgTm90ZTogbWFwcGluZyBvZiBidXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tzIHRvIEtleXN5bXMgbWF5IG5vdCB3b3JrIGlmIC1tb2R0d2VhayBvciAteGtiIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmb3IgdGhlIEtleXN5bS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgaW5jbHVkZSBhIG1vZGlmaWVyIGxpa2UgIlNoaWZ0X0wiIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcidzIHVwL2Rvd24gc3RhdGUgaXMgdG9nZ2xlZCwgZS5nLiB0byBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICJUaGUiIHVzZSA6U2hpZnRfTCt0K1NoaWZ0X0wraCtlOiAodGhlIDFzdCBvbmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgZG93biBhbmQgdGhlIDJuZCBvbmUgaXMgc2hpZnQgdXApLiAobm90ZTogdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgc3RhdGUgb2YgdGhlIG1vZGlmaWVyIGlzIGlnbm9yZWQgYW5kIG5vdCByZXNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgVG8gaW5jbHVkZSBidXR0b24gZXZlbnRzIHVzZSAiQnV0dG9uMSIsIC4uLiBldGMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgLWJ1dHRvbm1hcCBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBNYWNPU1ggY29uc29sZQotICAgICAgICAgICAgICAgICAgICAgICBvciBpbiAtcmF3ZmIgbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBXb3JrYXJvdW5kOiB1c2UgLWJ1dHRvbm1hcCBJSi4uLi1MTS4uLj1uIHRvIGxpbWl0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgbW91c2UgYnV0dG9ucyB0byBuLCBlLmcuIDEyMy0xMjM9My4gIFRoaXMgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50IHgxMXZuYyBmcm9tIGNyYXNoaW5nIGlmIHRoZSBYIHNlcnZlciByZXBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSA1IGJ1dHRvbnMgKDQvNSBzY3JvbGwgd2hlZWwpLCBidXQgdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIG9ubHkgcmVhbGx5IDMuCi0KLS1ub2RyYWdnaW5nICAgICAgICAgICAgRG8gbm90IHVwZGF0ZSB0aGUgZGlzcGxheSBkdXJpbmcgbW91c2UgZHJhZ2dpbmcgZXZlbnRzCi0gICAgICAgICAgICAgICAgICAgICAgIChtb3VzZSBidXR0b24gaGVsZCBkb3duKS4gIEdyZWF0bHkgaW1wcm92ZXMgcmVzcG9uc2Ugb24KLSAgICAgICAgICAgICAgICAgICAgICAgc2xvdyBzZXR1cHMsIGJ1dCB5b3UgbG9zZSBhbGwgdmlzdWFsIGZlZWRiYWNrIGZvciBkcmFncywKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dCBzZWxlY3Rpb24sIGFuZCBzb21lIG1lbnUgdHJhdmVyc2Fscy4gIEl0IG92ZXJyaWRlcwotICAgICAgICAgICAgICAgICAgICAgICBhbnkgLXBvaW50ZXJfbW9kZSBzZXR0aW5nLgotCi0tbmNhY2hlIG4gICAgICAgICAgICAgIENsaWVudC1zaWRlIGNhY2hpbmcgc2NoZW1lLiAgRnJhbWVidWZmZXIgbWVtb3J5ICJuIgotICAgICAgICAgICAgICAgICAgICAgICAoYW4gaW50ZWdlcikgdGltZXMgdGhhdCBvZiB0aGUgZnVsbCBkaXNwbGF5IGlzIGFsbG9jYXRlZAotICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0aGUgYWN0dWFsIGZyYW1lYnVmZmVyIHRvIGNhY2hlIHNjcmVlbiBjb250ZW50cwotICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmFwaWQgcmV0cmlldmFsLiAgU28gYSBXIHggSCBmcmFtYnVmZmVyIGlzIGV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGEgVyB4IChuKzEpKkggb25lLiAgVXNlIDAgdG8gZGlzYWJsZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm4iIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpcyAxMC4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBhbmQgdGhlIG90aGVyIC1uY2FjaGUqIG9wdGlvbnMgYmVsb3cgeW91IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBhYmJyZXZpYXRlICItbmNhY2hlIiB3aXRoICItbmMiLiAgQWxzbywgIi1ub25jIgotICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyAiLW5jYWNoZSAwIgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIG9wdGlvbiwgY3VycmVudGx5IGltcGxlbWVudGVkIGluCi0gICAgICAgICAgICAgICAgICAgICAgIGFuIGF3a3dhcmQgd2F5IGluIHRoYXQgaW4gdGhlIFZOQyBWaWV3ZXIgeW91IGNhbiBzZWUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIGNhY2hlIGNvbnRlbnRzIGlmIHlvdSBzY3JvbGwgZG93biwgZXRjLiAgU28geW91Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSB0byBzZXQgdGhpbmdzIHVwIHNvIHlvdSBjYW4ndCBzZWUgdGhhdCByZWdpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgbWV0aG9kIGlzIHN1Y2Nlc3NmdWwsIHRoZSBjaGFuZ2VzIHJlcXVpcmVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzIHRvIGRvIHRoaXMgbGVzcyBhd2t3YXJkbHkgd2lsbCBiZSBpbnZlc3RpZ2F0ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTVk5DIHZpZXdlciBkb2VzIGEgZ29vZCBqb2IgYXQgYXV0b21hdGljYWxseSBoaWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4gIE9yIHVzZSBTU1ZOQydzIC15Y3JvcCBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZXhwbGljaXRseSBoaWRlIHRoZSByZWdpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgbW9kZSBjb25zdW1lcyBhIGh1Z2UgYW1vdW50IG9mIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm90aCBvbiB0aGUgeDExdm5jIHNlcnZlciBzaWRlIGFuZCBvbiB0aGUgVk5DIFZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICBzaWRlLiAgSWYgbj0yIHRoZW4gdGhlIGFtb3VudCBvZiBSQU0gdXNlZCBpcyByb3VnaGx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyaXBsZWQgZm9yIGJvdGggeDExdm5jIGFuZCB0aGUgVk5DIFZpZXdlci4gIEFzIGEgcnVsZQotICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHVtYiwgbm90ZSB0aGF0IDEyODB4MTAyNCBhdCBkZXB0aCAyNCBpcyBhYm91dCA1TUIKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgcGl4ZWwgZGF0YS4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVhc29uYWJsZSByZXNwb25zZSB3aGVuIGN5Y2xpbmcgdGhyb3VnaCA0IHRvIDYKLSAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2UgKGUuZy4gd2ViIGJyb3dzZXIpIHdpbmRvd3MgYSB2YWx1ZSBuIG9mIDYgdG8gMTIKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQuICh0aGF0J3MgcmlnaHQ6IH4xMFggbW9yZSBtZW1vcnkuLi4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGUgd2F5IHdpbmRvdyBiYWNraW5nc3RvcmUgYW5kIHNhdmV1bmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIGltcGxlbWVudGVkLCBuIG11c3QgYmUgZXZlbi4gIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYnkgMSBpZiBpdCBpcyBub3QuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGFsc28gd29ya3MgZm9yIG5hdGl2ZSBNYWNPUyBYLCBidXQgbWF5IG5vdAotICAgICAgICAgICAgICAgICAgICAgICBiZSBhcyBlZmZlY3RpdmUgYXMgdGhlIFggdmVyc2lvbi4gIFRoaXMgaXMgZHVlIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRoaW5ncywgb25lIGlzIHRoZSBkcm9wLXNoYWRvdyBjb21wb3NpdGluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGxlYXZlcyBleHRyYSBhcmVhcyB0aGF0IG5lZWQgdG8gYmUgcmVwYWlyZWQgKHNlZQotICAgICAgICAgICAgICAgICAgICAgICAtbmNhY2hlX3BhZCkuICBBbm90aGVyIGlzIHRoZSB3aW5kb3cgaWNvbmlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zIG5lZWQgdG8gYmUgYXZvaWRlZCAoc2VlIC1tYWNpY29udGltZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IGFwcGVhcnMgdGhlIHRoYXQgdGhlICdTY2FsZScgYW5pbWF0aW9uIG1vZGUgZ2l2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyIHJlc3VsdHMgdGhhbiB0aGUgJ0dlbmllJyBvbmUuICBBbHNvLCB3aW5kb3cgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIG5vdCBhcyBhY2N1cmF0ZSBhcyB0aGUgWCB2ZXJzaW9uLgotCi0tbmNhY2hlX2NyICAgICAgICAgICAgIEluIC1uY2FjaGUgbW9kZSwgdHJ5IHRvIGRvIGNvcHlyZWN0IG9wYXF1ZSB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgbW92ZXMvZHJhZ3MgaW5zdGVhZCBvZiB3aXJlZnJhbWVzICh0aGlzIGNhbiBpbmR1Y2UKLSAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgZXJyb3JzKS4gIFRoZSB3aXJlZnJhbWUgd2lsbCBzdGlsbCBiZSB1c2VkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgbW92aW5nIGEgd2luZG93IHdob3NlIHNhdmUtdW5kZXJzIGhhcyBub3QgeWV0IGJlZW4gc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIG9yIGhhcyBiZWVuIGludmFsaWRhdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNvbWUgVk5DIFZpZXdlcnMgcHJvdmlkZSBiZXR0ZXIgcmVzcG9uc2UgdGhhbiBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGlzIG9wdGlvbi4gIE9uIFVuaXgsIHJlYWx2bmMgdmlld2VyIGdpdmVzCi0gICAgICAgICAgICAgICAgICAgICAgIHNtb290aGVyIGRyYWdzIHRoYW4gdGlnaHR2bmMgdmlld2VyLiAgUmVzcG9uc2UgbWF5IGFsc28KLSAgICAgICAgICAgICAgICAgICAgICAgYmUgY2hvcHB5IGlmIHRoZSBzZXJ2ZXIgc2lkZSBtYWNoaW5lIGlzIHRvbyBzbG93LgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aW1lcyBvbiB2ZXJ5IHNsb3cgbW9kZW0gY29ubmVjdGlvbnMsIHRoaXMgYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZXMgYW4gaW1wcm92ZW1lbnQgYmVjYXVzZSBubyBwaXhlbCBkYXRhIGF0IGFsbAotICAgICAgICAgICAgICAgICAgICAgICAobm90IGV2ZW4gdGhlIGJveCBhbmltYXRpb24pIGlzIHNlbnQgZHVyaW5nIHRoZSBkcmFnLgotCi0tbmNhY2hlX25vX21vdmVyYWlzZSAgIEluIC1uY2FjaGUgbW9kZSwgZG8gbm90IGFzc3VtZSB0aGF0IG1vdmluZyBhIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGNhdXNlIHRoZSB3aW5kb3cgbWFuYWdlciB0byByYWlzZSBpdCB0byB0aGUgdG9wCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdGFjay4gIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBpdCBkb2VzLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgc28gYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkgd2lyZWZyYW1lLCBldGMsIHdpbmRvdyBtb3ZlcwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2luZG93IHdpbGwgYmUgcHVzaGVkIHRvIHRvcCBpbiB0aGUgVk5DIHZpZXdlci4KLQotLW5jYWNoZV9ub19kdGNoYW5nZSAgICBJbiAtbmNhY2hlIG1vZGUsIGRvIG5vdCB0cnkgdG8gZ3Vlc3Mgd2hlbiB0aGUgZGVza3RvcAotICAgICAgICAgICAgICAgICAgICAgICAodmlld3BvcnQpIGNoYW5nZXMgdG8gYW5vdGhlciBvbmUgKGkuZS4gYW5vdGhlcgotICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJlYSkuICBUaGUgZGVmYXVsdCBpcyB0byB0cnkgdG8gZ3Vlc3MgYW5kIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgdHJ5IHRvIG1ha2UgdGhlIHRyYW5zaXN0aW9uIG1vcmUgc21vb3RobHkuCi0KLS1uY2FjaGVfbm9fcm9vdHBpeG1hcCAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgdHJ5IHRvIHNuYXBzaG90IHRoZSBkZXNrdG9wCi0gICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgdG8gdXNlIGluIGd1ZXNzaW5nIG9yIHJlY29uc3RydWN0aW5nIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICBzYXZlLXVuZGVycy4KLQotLW5jYWNoZV9rZWVwX2FuaW1zICAgICBJbiAtbmNhY2hlIG1vZGUsIGRvIG5vdCB0cnkgdG8gZGlzYWJsZSB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciBhbmltYXRpb25zIGFuZCBvdGhlciBlZmZlY3RzICh0aGF0IHVzdWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgZGVncmFkZSBuY2FjaGUgcGVyZm9ybWFuY2Ugb3IgY2F1c2UgcGFpbnRpbmcgZXJyb3JzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gdHJ5IHRvIGRpc2FibGUgdGhlbSBvbiBLREUgKGJ1dCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgR05PTUUpIHdoZW4gVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3Igb3RoZXIgd2luZG93IG1hbmFnZXJzIG9yIGRlc2t0b3BzIHRoYXQgcHJvdmlkZQotICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zLCBlZmZlY3RzLCBjb21wb3NpdGluZywgdHJhbnNsdWNlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICBldGMuIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhlIC1uY2FjaGUgbWV0aG9kIHlvdSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gZGlzYWJsZSB0aGVtIG1hbnVhbGx5LgotCi0tbmNhY2hlX29sZF93bSAgICAgICAgIEluIC1uY2FjaGUgbW9kZSwgZW5hYmxlIHNvbWUgaGV1cmlzdGljcyBmb3Igb2xkIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBtYW5hZ2VycyBzdWNoIGFzIGZ2d20gYW5kIHR3bS4KLQotLW5jYWNoZV9wYWQgbiAgICAgICAgICBJbiAtbmNhY2hlIG1vZGUsIHBhZCBlYWNoIHdpbmRvdyB3aXRoIG4gcGl4ZWxzIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY2FjaGluZyByZWN0YW5nbGVzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB0cnkgdG8gaW1wcm92ZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2l0dWF0aW9uIHdpdGggZHJvcHNoYWRvd3Mgb3Igb3RoZXIgY29tcG9zaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gTWFjT1MgWCB3aW5kb3cgbWFuYWdlciksIGFsdGhvdWdoIGl0IGNvdWxkIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICAgdGhpbmdzIHdvcnNlLiAgVGhlIGRlZmF1bHQgaXMgMCBvbiBVbml4IGFuZCAyNCBvbgotICAgICAgICAgICAgICAgICAgICAgICBNYWNPUyBYLgotLWRlYnVnX25jYWNoZSAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBhbmQgcHJvZmlsaW5nIG91dHB1dCB1bmRlciAtbmNhY2hlLgotCi0td2lyZWZyYW1lIFtzdHJdICAgICAgIFRyeSB0byBkZXRlY3Qgd2luZG93IG1vdmVzIG9yIHJlc2l6ZXMgd2hlbiBhIG1vdXNlCi0tbm93aXJlZnJhbWUgICAgICAgICAgIGJ1dHRvbiBpcyBoZWxkIGRvd24gYW5kIHNob3cgYSB3aXJlZnJhbWUgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbCBvcGFxdWUgd2luZG93LiAgVGhpcyBpcyBiYXNlZCBjb21wbGV0ZWx5IG9uCi0gICAgICAgICAgICAgICAgICAgICAgIGhldXJpc3RpY3MgYW5kIG1heSBub3QgYWx3YXlzIHdvcms6IGl0IGRlcGVuZHMgb24geW91cgotICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlciBhbmQgZXZlbiBob3cgeW91IG1vdmUgdGhpbmdzIGFyb3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1wb2ludGVyX21vZGUgYmVsb3cgZm9yIGRpc2N1c3Npb24gb2YgdGhlICJib2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGRvd24iIHByb2JsZW0gdGhpcyB0cmllcyB0byBhdm9pZC4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLXdpcmVmcmFtZQotCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3J0ZXIgYWxpYXNlczogIC13ZiBbc3RyXSAgYW5kIC1ub3dmCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlICJzdHIiIGlzIG9wdGlvbmFsIGFuZCwgb2YgY291cnNlLCBpcwotICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWQgd2l0aCBtYW55IHR1bmFibGUgcGFyYW1ldGVycyBmb3IgdGhpcyBzY2hlbWU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0OiBzaGFkZSxsaW5ld2lkdGgscGVyY2VudCxUK0IrTCtSLG1vZCx0MSt0Mit0Myt0NAotICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAweGZmLDIsMCwzMis4KzgrOCxhbGwsMC4xNSswLjMwKzUuMCswLjEyNQotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBsZWF2ZSBub3RoaW5nIGJldHdlZW4gY29tbWFzOiAiLCwiIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIHVzZWQuICBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBlbm91Z2ggY29tbWFzLAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhaWxpbmcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJzaGFkZSIgaW5kaWNhdGUgdGhlICJjb2xvciIgZm9yIHRoZSB3aXJlZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVzdWFsbHkgYSBncmV5c2NhbGU6IDAtMjU1LCBob3dldmVyIGZvciAxNiBhbmQgMzJicHAgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBzcGVjaWZ5IGFuIHJnYi50eHQgWCBjb2xvciAoZS5nLiAiZG9kZ2VyYmx1ZSIpIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgPiAyNTUgaXMgdHJlYXRlZCBhcyBSR0IgKGUuZy4gcmVkIGlzIDB4ZmYwMDAwKS4KLSAgICAgICAgICAgICAgICAgICAgICAgImxpbmV3aWR0aCIgc2V0cyB0aGUgd2lkdGggb2YgdGhlIHdpcmVmcmFtZSBpbiBwaXhlbHMuCi0gICAgICAgICAgICAgICAgICAgICAgICJwZXJjZW50IiBpbmRpY2F0ZXMgdG8gbm90IGFwcGx5IHRoZSB3aXJlZnJhbWUgc2NoZW1lCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHdpbmRvd3Mgd2l0aCBhcmVhIGxlc3MgdGhhbiB0aGlzIHBlcmNlbnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgc2NyZWVuLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJUK0IrTCtSIiBpbmRpY2F0ZXMgZm91ciBpbnRlZ2VycyBmb3IgaG93IGNsb3NlIGluCi0gICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0aGUgcG9pbnRlciBoYXMgdG8gYmUgZnJvbSB0aGUgVG9wLCBCb3R0b20sIExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIFJpZ2h0IGVkZ2VzIG9mIHRoZSB3aW5kb3cgdG8gY29uc2lkZXIgd2lyZWZyYW1pbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBzcGVlZHVwIHRvIHF1aWNrbHkgZXhjbHVkZSBhIHdpbmRvdyBmcm9tIGJlaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZWQ6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkgdGhlIHNwZWVkdXAKLSAgICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGluZyBhbmQgc2VsZWN0aW5nIHRleHQgd2lsbCBsaWtlbHkgYmUgc2xvd2VyKS4KLQotICAgICAgICAgICAgICAgICAgICAgICAibW9kIiBzcGVjaWZpZXMgaWYgYSBidXR0b24gZG93biBldmVudCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJpb3Igb2YgdGhlIHdpbmRvdyB3aXRoIGEgbW9kaWZpZXIga2V5IChBbHQsIFNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBldGMuKSBkb3duIHNob3VsZCBpbmRpY2F0ZSBhIHdpcmVmcmFtZSBvcHBvcnR1bml0eS4KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlICIwIiBvciAibm9uZSIgdG8gc2tpcCBpdCwgIjEiIG9yICJhbGwiCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGFwcGx5IGl0IHRvIGFueSBtb2RpZmllciwgb3IgIlNoaWZ0IiwgIkFsdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb250cm9sIiwgIk1ldGEiLCAiU3VwZXIiLCBvciAiSHlwZXIiIHRvIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkgZm9yIHRoYXQgdHlwZSBvZiBtb2RpZmllciBrZXkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgInQxK3QyK3QzK3Q0IiBzcGVjaWZ5IGZvdXIgZmxvYXRpbmcgcG9pbnQgdGltZXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHBvaW50ZXIgdG8gbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdDIgaXMgaG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHdpbmRvdyB0byBzdGFydCBtb3ZpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgYmVpbmcgcmVzaXplZCAoZm9yIHNvbWUgd2luZG93IG1hbmFnZXJzIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciBsb25nKSwgdDMgaXMgaG93IGxvbmcgdG8ga2VlcCBhIHdpcmVmcmFtZSBtb3ZpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHJlcGFpbnRpbmcgdGhlIHdpbmRvdy4gdDQgaXMgdGhlIG1pbmltdW0gdGltZQotICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHNlbmRpbmcgd2lyZWZyYW1lICJhbmltYXRpb25zIi4gIElmIGEgc2xvdwotICAgICAgICAgICAgICAgICAgICAgICBsaW5rIGlzIGRldGVjdGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB0byBzb21ldGhpbmcgYmV0dGVyIGZvciBhIHNsb3cgbGluay4KLQotLW5vd2lyZWZyYW1lbG9jYWwgICAgICBCeSBkZWZhdWx0LCBtb3VzZSBtb3Rpb24gYW5kIGJ1dHRvbiBwcmVzc2VzIG9mIGEKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlciBzaXR0aW5nIGF0IHRoZSBMT0NBTCBkaXNwbGF5IGFyZSBtb25pdG9yZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtaW5nIG9wcG9ydHVuaXRpZXMgKHNvIHRoYXQgdGhlIGNoYW5nZXMgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICBzZW50IGVmZmljaWVudGx5IHRvIHRoZSBWTkMgY2xpZW50cykuICBVc2UgdGhpcyBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLgotCi0td2lyZWNvcHlyZWN0IG1vZGUgICAgIFNpbmNlIHRoZSAtd2lyZWZyYW1lIG1lY2hhbmlzbSBldmlkZW50bHkgdHJhY2tzIG1vdmluZwotLW5vd2lyZWNvcHlyZWN0ICAgICAgICB3aW5kb3dzIGFjY3VyYXRlbHksIGEgc3BlZWR1cCBjYW4gYmUgb2J0YWluZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgdGVsbGluZyB0aGUgVk5DIHZpZXdlcnMgdG8gbG9jYWxseSBjb3B5IHRoZSB0cmFuc2xhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyByZWdpb24uICBUaGlzIGlzIHRoZSBWTkMgQ29weVJlY3QgZW5jb2Rpbmc6Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZWJ1ZmZlciB1cGRhdGUgZG9lc24ndCBuZWVkIHRvIHNlbmQgdGhlIGFjdHVhbAotICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW1hZ2UgZGF0YS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTaG9ydGVyIGFsaWFzZXM6ICAtd2NyIFttb2RlXSAgYW5kIC1ub3djcgotCi0gICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyAtbm93aXJlY29weXJlY3QpCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIG5ldmVyIHRyeSB0aGUgY29weXJlY3QsICJ0b3AiIG1lYW5zIG9ubHkgZG8gaXQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyB3YXMgbm90IGNvdmVyZWQgYnkgYW55IG90aGVyIHdpbmRvd3MsIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAiYWx3YXlzIiBtZWFucyB0byB0cmFuc2xhdGUgdGhlIG9yZ2luYWxseSB1bm9ic2N1cmVkCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiAodGhpcyBtYXkgbG9vayBvZGQgYXMgdGhlIHJlbWFpbmluZyBwaWVjZXMgY29tZQotICAgICAgICAgICAgICAgICAgICAgICBpbiwgYnV0IGhlbHBzIG9uIGEgc2xvdyBsaW5rKS4gIERlZmF1bHQ6ICJhbHdheXMiCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlcmUgY2FuIGJlIHBhaW50aW5nIGVycm9ycyBvciBzbG93IHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdXNpbmcgLXNjYWxlIHNvIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIENvcHlSZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSAiLXdpcmVjb3B5cmVjdCBuZXZlciIgb24gdGhlIGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZSBvciBieSByZW1vdGUtY29udHJvbC4gIE9yIHlvdSBjYW4gYWxzbyB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICItc2NhbGUgeHh4Om5vY3IiIHNjYWxlIG9wdGlvbi4KLQotLWRlYnVnX3dpcmVmcmFtZSAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBpbmZvIHByaW50b3V0IGZvciB0aGUgd2lyZWZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgIGhldXJpc3RpY3MuICAiLWR3ZiIgaXMgYW4gYWxpYXMuICBTcGVjaWZ5IG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIGZvciBtb3JlIG91dHB1dC4KLQotLXNjcm9sbGNvcHlyZWN0IG1vZGUgICBMaWtlIC13aXJlY29weXJlY3QsIGJ1dCB1c2UgaGV1cmlzdGljcyB0byB0cnkgdG8gZ3Vlc3MKLS1ub3Njcm9sbGNvcHlyZWN0ICAgICAgaWYgYSB3aW5kb3cgaGFzIHNjcm9sbGVkIGl0cyBjb250ZW50cyAoZWl0aGVyIHZlcnRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgaG9yaXpvbnRhbGx5KS4gIFRoaXMgcmVxdWlyZXMgdGhlIFJFQ09SRCBYIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICB0byAic25vb3AiIG9uIFggYXBwbGljYXRpb25zIChjdXJyZW50bHkgZm9yIGNlcnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgWENvcHlBcmVhIGFuZCBYQ29uZmlndXJlV2luZG93IFggcHJvdG9jb2wgcmVxdWVzdHMpLgotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczogSGl0dGluZyA8UmV0dXJuPiBpbiBhIHRlcm1pbmFsIHdpbmRvdyB3aGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Igd2FzIGF0IHRoZSBib3R0b20sIHRoZSB0ZXh0IHNjcm9sbHMgdXAgb25lIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgIEhpdHRpbmcgPERvd24+IGFycm93IGluIGEgd2ViIGJyb3dzZXIgd2luZG93LCB0aGUgd2ViCi0gICAgICAgICAgICAgICAgICAgICAgIHBhZ2Ugc2Nyb2xscyB1cCBhIHNtYWxsIGFtb3VudC4gIE9yIHNjcm9sbGluZyB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyIG9yIG1vdXNlIHdoZWVsLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3J0ZXIgYWxpYXNlczogIC1zY3IgW21vZGVdICBhbmQgLW5vc2NyCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzY2hlbWUgd2lsbCBub3QgYWx3YXlzIGRldGVjdCBzY3JvbGxzLCBidXQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICBpdCBkb2VzIHRoZXJlIGlzIGEgbmljZSBzcGVlZHVwIGZyb20gdXNpbmcgdGhlIFZOQwotICAgICAgICAgICAgICAgICAgICAgICBDb3B5UmVjdCBlbmNvZGluZyAoc2VlIC13aXJlY29weXJlY3QpLiAgVGhlIHNwZWVkdXAKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgYm90aCBpbiByZWR1Y2VkIG5ldHdvcmsgdHJhZmZpYyBhbmQgcmVkdWNlZCBYCi0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIHBvbGxpbmcvY29weWluZy4gIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kdWNlIHVuZGVzaXJlZCB0cmFuc2llbnRzIChlLmcuIGEgdGVybWluYWwgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNjcm9sbGVkIHVwIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSkgb3Igb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgZXJyb3JzICh3aW5kb3cgdGVhcmluZywgYnVuY2hpbmctdXAsIGV0YykuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IHJlcGFpcmVkIGluIGEgc2hvcnQgcGVyaW9kCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRpbWUuICBJZiB0aGlzIGlzIHVuYWNjZXB0YWJsZSBkaXNhYmxlIHRoZSBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggLW5vc2Nyb2xsY29weXJlY3QuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2NyZWVuIGNsZWFyaW5nIGtsdWRnZXM6ICBmb3IgdGVzdGluZyBhdCBsZWFzdCwgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIHNvbWUgIm1hZ2ljIGtleSBzZXF1ZW5jZXMiIChtdXN0IGJlIGRvbmUgaW4gbGVzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGFuIDEgc2Vjb25kKSB0byBhaWQgcmVwYWlyaW5nIHBhaW50aW5nIGVycm9ycyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBzZWVuIHdoZW4gdXNpbmcgdGhpcyBtb2RlOgotCi0gICAgICAgICAgICAgICAgICAgICAgIDMgQWx0X0wncyAgIGluIGEgcm93OiByZXNlbmQgd2hvbGUgc2NyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICA0IEFsdF9MJ3MgICBpbiBhIHJvdzogcmVyZWFkIGFuZCByZXNlbmQgd2hvbGUgc2NyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAzIFN1cGVyX0wncyBpbiBhIHJvdzogbWFyayB3aG9sZSBzY3JlZW4gZm9yIHBvbGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIDQgU3VwZXJfTCdzIGluIGEgcm93OiByZXNldCBSRUNPUkQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgNSBTdXBlcl9MJ3MgaW4gYSByb3c6IHRyeSB0byBwdXNoIGEgYmxhY2sgc2NyZWVuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogQWx0X0wgaXMgdGhlIExlZnQgIkFsdCIga2V5IChhIHNpbmdsZSBrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgIFN1cGVyX0wgaXMgdGhlIExlZnQgIlN1cGVyIiBrZXkgKFdpbmRvd3MgZmxhZykuCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgYXJlIG1vZGlmaWVyIGtleXMsIGFuZCBzbyBzaG91bGQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGNoYXJhY3RlcnMgd2hlbiBwcmVzc2VkIGJ5IHRoZW1zZWx2ZXMuICBBbHNvLAotICAgICAgICAgICAgICAgICAgICAgICB5b3VyIFZOQyB2aWV3ZXIgbWF5IGhhdmUgaXRzIG93biByZWZyZXNoIGhvdC1rZXkKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgYnV0dG9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyAtbm9zY3JvbGxjb3B5cmVjdCkKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gbmV2ZXIgdHJ5IHRoZSBjb3B5cmVjdCwgImtleXMiIG1lYW5zIHRvIHRyeSBpdAotICAgICAgICAgICAgICAgICAgICAgICBpbiByZXNwb25zZSB0byBrZXlzdHJva2VzIG9ubHksICJtb3VzZSIgbWVhbnMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgdHJ5IGl0IGluIHJlc3BvbnNlIHRvIG1vdXNlIGV2ZW50cyBvbmx5LCAiYWx3YXlzIgotICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB0byBkbyBib3RoLiBEZWZhdWx0OiAiYWx3YXlzIgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZXJlIGNhbiBiZSBwYWludGluZyBlcnJvcnMgb3Igc2xvdyByZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIC1zY2FsZSBzbyB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBDb3B5UmVjdAotICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UgIi1zY3JvbGxjb3B5cmVjdCBuZXZlciIgb24gdGhlIGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZSBvciBieSByZW1vdGUtY29udHJvbC4gIE9yIHlvdSBjYW4gYWxzbyB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICItc2NhbGUgeHh4Om5vY3IiIHNjYWxlIG9wdGlvbi4KLQotLXNjcl9hcmVhIG4gICAgICAgICAgICBTZXQgdGhlIG1pbmltdW0gYXJlYSBpbiBwaXhlbHMgZm9yIGEgcmVjdGFuZ2xlCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSAtc2Nyb2xsY29weXJlY3QgZGV0ZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS4gIFRoaXMgaXMgdG8gYXZvaWQgd2FzdGluZyB0aGUgZWZmb3J0IG9uIHNtYWxsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMgdGhhdCB3b3VsZCBiZSBxdWlja2x5IHVwZGF0ZWQgdGhlIG5vcm1hbCB3YXkuCi0gICAgICAgICAgICAgICAgICAgICAgIEUuZy4gc3VwcG9zZSBhbiBhcHAgdXBkYXRlZCB0aGUgcG9zaXRpb24gb2YgaXRzIHNraW5ueQotICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXIgZmlyc3QgYW5kIHRoZW4gc2hpZnRlZCB0aGUgbGFyZ2UgcGFuZWwKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgY29udHJvbGxlZC4gIFdlIHdhbnQgdG8gYmUgc3VyZSB0byBza2lwIHRoZSBzbWFsbAotICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXIgYW5kIGdldCB0aGUgbGFyZ2UgcGFuZWwuIERlZmF1bHQ6IDYwMDAwCi0KLS1zY3Jfc2tpcCBsaXN0ICAgICAgICAgU2tpcCBzY3JvbGwgZGV0ZWN0aW9uIGZvciBhcHBsaWNhdGlvbnMgbWF0Y2hpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN0cmluZ3MgaW4gImxpc3QiLgotICAgICAgICAgICAgICAgICAgICAgICBTb21lIGFwcGxpY2F0aW9ucyBpbXBsZW1lbnQgdGhlaXIgc2Nyb2xsaW5nIGluCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cmFuZ2Ugd2F5cyB3aGVyZSB0aGUgWENvcHlBcmVhLCBldGMsIGFsc28gYXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgICB0byBpbnZpc2libGUgcG9ydGlvbnMgb2YgdGhlIHdpbmRvdzogaWYgd2UgQ29weVJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgdGhvc2UgYXJlYXMgaXQgbG9va3MgYXdmdWwgZHVyaW5nIHRoZSBzY3JvbGwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIG1heSBiZSBwYWludGluZyBlcnJvcnMgbGVmdCBhZnRlciB0aGUgc2Nyb2xsLgotICAgICAgICAgICAgICAgICAgICAgICBTb2ZmaWNlLmJpbiBpcyB0aGUgd29yc3Qga25vd24gb2ZmZW5kZXIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlICIjIyIgdG8gZGVub3RlIHRoZSBzdGFydCBvZiB0aGUgYXBwbGljYXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gIiMjWFRlcm0iKSBhbmQgIisrIiB0byBkZW5vdGUgdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSBuYW1lIChlLmcuICIrK3h0ZXJtIikuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgeW91ciBsaXN0IGlzIG1hdGNoZWQgYWdhaW5zdCBpcyBvZiB0aGUgZm9ybQotICAgICAgICAgICAgICAgICAgICAgICAiXl5XTV9OQU1FIyNDbGFzcysrSW5zdGFuY2U8c2FtZS1mb3ItYW55LXN1YndpbmRvd3M+IgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgInhsc2NsaWVudHMgLWxhIiBjb21tYW5kIHdpbGwgcHJvdmlkZSB0aGlzIGluZm8uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgYSBwYXR0ZXJuIGlzIHByZWZpeGVkIHdpdGggIktFWToiIGl0IG9ubHkgYXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgICB0byBLZXlzdHJva2UgZ2VuZXJhdGVkIHNjcm9sbHMgKGUuZy4gVXAgYXJyb3cpLiAgSWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlZml4ZWQgd2l0aCAiTU9VU0U6IiBpdCBvbmx5IGFwcGxpZXMgdG8gTW91c2UKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kdWNlZCBzY3JvbGxzIChlLmcuIGRyYWdnaW5nIG9uIGEgc2Nyb2xsYmFyKS4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogIyNTb2ZmaWNlLmJpbiwjI1N0YXJPZmZpY2UsIyNPcGVuT2ZmaWNlCi0KLS1zY3JfaW5jIGxpc3QgICAgICAgICAgT3Bwb3NpdGUgb2YgLXNjcl9za2lwOiB0aGlzIGxpc3QgaXMgY29uc3VsdGVkIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBpZiB0aGVyZSBpcyBhIG1hdGNoIHRoZSB3aW5kb3cgd2lsbCBiZSBtb25pdG9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdmlhIFJFQ09SRCBmb3Igc2Nyb2xscyBpcnJlc3BlY3RpdmUgb2YgLXNjcl9za2lwLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgLXNjcl9za2lwICcqJyB0byBza2lwIGFueXRoaW5nIHRoYXQgZG9lcyBub3QgbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgeW91ciAtc2NyX2luYy4gIFVzZSAtc2NyX2luYyAnKicgdG8gaW5jbHVkZSBldmVyeXRoaW5nLgotCi0tc2NyX2tleXMgbGlzdCAgICAgICAgIEZvciBrZXlzdHJva2Ugc2Nyb2xsIGRldGVjdGlvbiwgb25seSBhcHBseSB0aGUgUkVDT1JECi0gICAgICAgICAgICAgICAgICAgICAgIGhldXJpc3RpY3MgdG8gdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleXN5bXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgImxpc3QiLiAgWW91IG1heSBmaW5kIHRoZSBSRUNPUkQgb3ZlcmhlYWQgZm9yIGV2ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZiB5b3VyIGtleXN0cm9rZXMgZGlzcnVwdHMgdHlwaW5nIHRvbyBtdWNoLCBidXQgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHdhbnQgdG8gdHVybiBpdCBvZmYgY29tcGxldGVseSB3aXRoICItc2NyIG1vdXNlIgotICAgICAgICAgICAgICAgICAgICAgICBhbmQgLXNjcl9wYXJtcyBkb2VzIG5vdCB3b3JrIG9yIGlzIHRvbyBjb25mdXNpbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxpc3RlZCBrZXlzeW1zIGNhbiBiZSBudW1lcmljIG9yIHRoZSBrZXlzeW0KLSAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMgaW4gdGhlIDxYMTEva2V5c3ltZGVmLmg+IGhlYWRlciBmaWxlIG9yIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHhldigxKSBwcm9ncmFtLiAgRXhhbXBsZTogIi1zY3Jfa2V5cyBVcCxEb3duLFJldHVybiIuCi0gICAgICAgICAgICAgICAgICAgICAgIE9uZSBwcm9iYWJseSB3YW50cyB0byBoYXZlIGFwcGxpY2F0aW9uIHNwZWNpZmljIGxpc3RzCi0gICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGZvciB0ZXJtaW5hbHMsIGV0YykgYnV0IHRoYXQgaXMgdG9vIGlja3kgdG8gdGhpbmsKLSAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgZm9yIG5vdy4uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmICJsaXN0IiBiZWdpbnMgd2l0aCB0aGUgIi0iIGNoYXJhY3RlciB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICBpcyB0YWtlbiBhcyBhbiBleGNsdWRlIGxpc3Q6IGFsbCBrZXlzeW1zIGV4Y2VwdCB0aG9zZQotICAgICAgICAgICAgICAgICAgICAgICBsaXN0IHdpbGwgYmUgY29uc2lkZXJlZC4gIFRoZSBzcGVjaWFsIHN0cmluZyAiYnVpbHRpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kcyB0byBhbiBpbnRlcm5hbCBsaXN0IG9mIGtleXN5bXMgdGhhdCBhcmUgbGlrZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvIGNhdXNlIHNjcm9sbHMuICBCVFcsIGJ5IGRlZmF1bHQgbW9kaWZpZXIga2V5cywKLSAgICAgICAgICAgICAgICAgICAgICAgU2hpZnRfTCwgQ29udHJvbF9SLCBldGMsIGFyZSBza2lwcGVkIHNpbmNlIHRoZXkgYWxtb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGluZHVjZSBzY3JvbGxpbmcgYnkgdGhlbXNlbHZlcy4KLQotLXNjcl90ZXJtIGxpc3QgICAgICAgICBZZXQgYW5vdGhlciBjb3NtZXRpYyBrbHVkZ2UuICBBcHBseSBzaGVsbC90ZXJtaW5hbAotICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIGFwcGxpY2F0aW9ucyBtYXRjaGluZyBjb21tYSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgbGlzdCAoc2FtZSBhcyBmb3IgLXNjcl9za2lwLy1zY3JfaW5jKS4gIEZvciBleGFtcGxlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgIGFubm95aW5nIHRyYW5zaWVudCB1bmRlciBzY3JvbGwgZGV0ZWN0aW9uIGlzIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICAgICBoaXQgRW50ZXIgaW4gYSB0ZXJtaW5hbCBzaGVsbCB3aXRoIGZ1bGwgdGV4dCB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb2xpZCB0ZXh0IGN1cnNvciBibG9jayB3aWxsIGJlIHNjcm9sbGVkIHVwLgotICAgICAgICAgICAgICAgICAgICAgICBTbyBmb3IgYSBzaG9ydCB0aW1lIHRoZXJlIGFyZSB0d28gKG9yIG1vcmUpIGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnMgb24gdGhlIHNjcmVlbi4gIFRoZXJlIGFyZSBzaW1pbGFyIHNjZW5hcmlvcywKLSAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gYW4gb3V0cHV0IGxpbmUgaXMgZHVwbGljYXRlZCkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgdHJhbnNpZW50cyBhcmUgaW5kdWNlZCBieSB0aGUgYXBwcm94aW1hdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGwgZGV0ZWN0aW9uIChlLmcuIGl0IGRldGVjdHMgdGhlIHNjcm9sbCwgYnV0IG5vdAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmFjdCB0aGF0IHRoZSBibG9jayBjdXJzb3Igd2FzIGNsZWFyZWQganVzdCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjcm9sbCkuICBJbiBuZWFybHkgYWxsIGNhc2VzIHRoZXNlIHRyYW5zaWVudCBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIHJlcGFpcmVkIHdoZW4gdGhlIHRydWUgWCBmcmFtZWJ1ZmZlciBpcyBjb25zdWx0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIG5vcm1hbCBwb2xsaW5nLiAgQnV0IHRoZXkgYXJlIGRpc3RyYWN0aW5nLCBzbwotICAgICAgICAgICAgICAgICAgICAgICB3aGF0IHRoaXMgb3B0aW9uIHByb3ZpZGVzIGlzIGV4dHJhICJwYWRkaW5nIiBuZWFyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gb2YgdGhlIHRlcm1pbmFsIHdpbmRvdzogYSBmZXcgZXh0cmEgbGluZXMgbmVhcgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYm90dG9tIHdpbGwgbm90IGJlIHNjcm9sbGVkLCBidXQgcmF0aGVyIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYWN0dWFsIFggZnJhbWVidWZmZXIuICBUaGlzIHVzdWFsbHkgcmVkdWNlcwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYW5ub3lpbmcgYXJ0aWZhY3RzLiAgVXNlICJub25lIiB0byBkaXNhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAidGVybSIKLQotLXNjcl9rZXlyZXBlYXQgbG8taGkgICBJZiBhIGtleSBpcyBoZWxkIGRvd24gKG9yIG90aGVyd2lzZSByZXBlYXRzIHJhcGlkbHkpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGluZHVjZXMgYSByYXBpZCBzZXF1ZW5jZSBvZiBzY3JvbGxzIChlLmcuIGhvbGRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgZG93biBhbiBBcnJvdyBrZXkpIHRoZSAic2Nyb2xsY29weXJlY3QiIGRldGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3ZlcmhlYWQgbWF5IG5vdCBiZSBhYmxlIHRvIGtlZXAgdXAuICBBIHRpbWUgcGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBzY3JvbGwgZXN0aW1hdGUgaXMgcGVyZm9ybWVkIGFuZCBpZiB0aGF0IGVzdGltYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RzIGEgc3VzdGFpbmFibGUgc2Nyb2xscmF0ZSBvZiBrZXlzIHBlciBzZWNvbmQKLSAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiAibG8iIGFuZCAiaGkiIHRoZW4gcmVwZWF0ZWQga2V5cyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIERJU0NBUkRFRCB0byBtYWludGFpbiB0aGUgc2Nyb2xscmF0ZS4gRm9yIGV4YW1wbGUgeW91cgotICAgICAgICAgICAgICAgICAgICAgICBrZXkgYXV0b3JlcGVhdCBtYXkgYmUgMjUga2V5cy9zZWMsIGJ1dCBmb3IgYSBsYXJnZQotICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgb3Igc2xvdyBsaW5rIG9ubHkgOCBzY3JvbGxzIHBlciBzZWNvbmQgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1c3RhaW5lZCwgdGhlbiByb3VnaGx5IDIgb3V0IG9mIGV2ZXJ5IDMgcmVwZWF0ZWQga2V5cwotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBkdXJpbmcgdGhpcyBwZXJpb2QuIERlZmF1bHQ6ICI0LTIwIgotCi0tc2NyX3Bhcm1zIHN0cmluZyAgICAgIFNldCB2YXJpb3VzIHBhcmFtZXRlcnMgZm9yIHRoZSBzY3JvbGxjb3B5cmVjdCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIHNpbWlsYXIgdG8gdGhhdCBmb3IgLXdpcmVmcmFtZSBhbmQgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggbG90cyBvZiBwYXJhbWV0ZXJzOgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdDogVCtCK0wrUix0MSt0Mit0MyxzMStzMitzMytzNCtzNQotICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAwKzY0KzMyKzMyLDAuMDIrMC4xMCswLjksMC4wMyswLjA2KzAuNSswLjErNS4wCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGxlYXZlIG5vdGhpbmcgYmV0d2VlbiBjb21tYXM6ICIsLCIgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgdXNlZC4gIElmIHlvdSBkb24ndCBzcGVjaWZ5IGVub3VnaCBjb21tYXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFpbGluZyBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIlQrQitMK1IiIGluZGljYXRlcyBmb3VyIGludGVnZXJzIGZvciBob3cgY2xvc2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRoZSBwb2ludGVyIGhhcyB0byBiZSBmcm9tIHRoZSBUb3AsIEJvdHRvbSwgTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgUmlnaHQgZWRnZXMgb2YgdGhlIHdpbmRvdyB0byBjb25zaWRlciBzY3JvbGxjb3B5cmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgLXdpcmVmcmFtZSBvdmVybGFwcyBpdCB0YWtlcyBwcmVjZWRlbmNlLiAgVGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAgIHNwZWVkdXAgdG8gcXVpY2tseSBleGNsdWRlIGEgd2luZG93IGZyb20gYmVpbmcgd2F0Y2hlZAotICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2Nyb2xsY29weXJlY3Q6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWVkdXAgKHRoaW5ncyBsaWtlIHNlbGVjdGluZyB0ZXh0IHdpbGwgbGlrZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgIGJlIHNsb3dlcikuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgInQxK3QyK3QzIiBzcGVjaWZ5IHRocmVlIGZsb2F0aW5nIHBvaW50IHRpbWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgdGhhdCBhcHBseSB0byBzY3JvbGxjb3B5cmVjdCBkZXRlY3Rpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAqS2V5c3Ryb2tlKiBpbnB1dDogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciBhIGtleQotICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmVzc2VkIGZvciB0aGUgZmlyc3Qgc2Nyb2xsLCB0MiBpcyBob3cgbG9uZyB0byBrZWVwCi0gICAgICAgICAgICAgICAgICAgICAgIGxvb2tpbmcgYWZ0ZXIgYSBLZXlzdHJva2Ugc2Nyb2xsIGZvciBtb3JlIHNjcm9sbHMuCi0gICAgICAgICAgICAgICAgICAgICAgIHQzIGlzIGhvdyBmcmVxdWVudGx5IHRvIHRyeSB0byB1cGRhdGUgc3Vycm91bmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFycyBvdXRzaWRlIG9mIHRoZSBzY3JvbGxpbmcgYXJlYSAoMC4wIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgInMxK3MyK3MzK3M0K3M1IiBzcGVjaWZ5IGZpdmUgZmxvYXRpbmcgcG9pbnQgdGltZXMKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gc2Vjb25kcyB0aGF0IGFwcGx5IHRvIHNjcm9sbGNvcHlyZWN0IGRldGVjdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICpNb3VzZSogaW5wdXQ6IHMxIGlzIGhvdyBsb25nIHRvIHdhaXQgYWZ0ZXIgYSBtb3VzZQotICAgICAgICAgICAgICAgICAgICAgICBidXR0b24gaXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHNjcm9sbCwgczIgaXMgaG93IGxvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8ga2VlcCB3YWl0aW5nIGZvciBhZGRpdGlvbmFsIHNjcm9sbHMgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgIE1vdXNlIHNjcm9sbCB3YXMgZGV0ZWN0ZWQuICBzMyBpcyBob3cgZnJlcXVlbnRseSB0bwotICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gdXBkYXRlIHN1cnJvdW5kaW5nIHNjcm9sbGJhcnMgb3V0c2lkZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nIGFyZWEgKDAuMCB0byBkaXNhYmxlKS4gIHM0IGlzIGhvdyBsb25nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBwb2ludGVyIG1vdGlvbiAodG8gdHJ5IHRvIGdldCBmZXdlciwgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIHNjcm9sbHMpLiBzNSBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHNwZW5kIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRpbmcgdGhlIHNjcm9sbCB3aW5kb3cgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVzdAotICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuLgotCi0tZml4c2NyZWVuIHN0cmluZyAgICAgIFBlcmlvZGljYWxseSAicmVwYWlyIiB0aGUgc2NyZWVuIGJhc2VkIG9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgIGluICJzdHJpbmciLiAgSG9wZWZ1bGx5IHlvdSB3b24ndCBuZWVkIHRoaXMgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlbiB0aGUgLXNjcm9sbGNvcHlyZWN0IG9yCi0gICAgICAgICAgICAgICAgICAgICAgIC13aXJlY29weXJlY3QgZmVhdHVyZXMgbGVhdmUgdG9vIG1hbnkgcGFpbnRpbmcgZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgY2FuIGJlIHVzZWQgZm9yIGFueSBzY2VuYXJpby4gIFRoaXMgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSBwZXJmb3JtcyBjb3N0bHkgb3BlcmF0aW9ucyBhbmQgc28KLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgcmVzcG9uc2UgbWF5IGJlIHJlZHVjZWQgd2hlbiBpdCBpcyBvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgMyBBbHRfTCdzICh0aGUgTGVmdCAiQWx0IiBrZXkpIHRhcHMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgYSByb3cgKGFzIGRlc2NyaWJlZCB1bmRlciAtc2Nyb2xsY29weXJlY3QpIGluc3RlYWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsbHkgcmVxdWVzdCBhIHNjcmVlbiByZXBhaW50IHdoZW4gaXQgaXMgbmVlZGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZzogIlY9dCIsICJDPXQiLCAiWD10IiwgYW5kICI4PXQiLgotICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGVzZSAidCIgc3RhbmRzIGZvciBhIHRpbWUgaW4gc2Vjb25kcyAoaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYSBmbG9hdGluZyBwb2ludCBldmVuIHRob3VnaCBvbmUgc2hvdWxkIHVzdWFsbHkgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA+IDIgdG8gYXZvaWQgd2FzdGluZyByZXNvdXJjZXMpLiAgViBzZXRzIGhvdwotICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVudGx5IHRoZSBlbnRpcmUgc2NyZWVuIHNob3VsZCBiZSBzZW50IHRvIHZpZXdlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgKGl0IGlzIGxpa2UgdGhlIDMgQWx0X0wncykuICBDIHNldHMgaG93IGxvbmcgdG8gd2FpdAotICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBhIENvcHlSZWN0IHRvIHJlcGFpbnQgdGhlIGZ1bGwgc2NyZWVuLiAgWCBzZXRzCi0gICAgICAgICAgICAgICAgICAgICAgIGhvdyBmcmVxdWVudGx5IHRvIHJlcmVhZCB0aGUgZnVsbCBYMTEgZnJhbWVidWZmZXIgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgWCBzZXJ2ZXIgYW5kIHB1c2ggaXQgb3V0IHRvIGNvbm5lY3RlZCB2aWV3ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICBVc2Ugb2YgWCBzaG91bGQgYmUgcmFyZSwgcGxlYXNlIHJlcG9ydCBhIGJ1ZyBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgZmluZCB5b3UgbmVlZCBpdC4gOD0gYXBwbGllcyBvbmx5IGZvciAtOHRvMjQgbW9kZTogaXQKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0cyBob3cgb2Z0ZW4gdGhlIG5vbi1kZWZhdWx0IHZpc3VhbCByZWdpb25zIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gKGUuZy4gOGJwcCB3aW5kb3dzKSBhcmUgcmVmcmVzaGVkLiAgRXhhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgIC1maXhzY3JlZW4gVj0xMCAtZml4c2NyZWVuIEM9MTAKLQotLWRlYnVnX3Njcm9sbCAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBpbmZvIHByaW50b3V0IGZvciB0aGUgc2Nyb2xsCi0gICAgICAgICAgICAgICAgICAgICAgIGhldXJpc3RpY3MuICAiLWRzIiBpcyBhbiBhbGlhcy4gIFNwZWNpZnkgaXQgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgZm9yIG1vcmUgb3V0cHV0LgotCi0tbm94cmVjb3JkICAgICAgICAgICAgIERpc2FibGUgYW55IHVzZSBvZiB0aGUgUkVDT1JEIGV4dGVuc2lvbi4gIFRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IHVzZWQgYnkgdGhlIC1zY3JvbGxjb3B5cmVjdCBzY2hlbWUgYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgWCBzZXJ2ZXIgZ3JhYnMuCi0KLS1ncmFiX2J1c3RlciAgICAgICAgICAgU29tZSBvZiB0aGUgdXNlIG9mIHRoZSBSRUNPUkQgZXh0ZW5zaW9uIGNhbiBsZWF2ZSBhCi0tbm9ncmFiX2J1c3RlciAgICAgICAgIHRpbnkgd2luZG93IGZvciBYR3JhYlNlcnZlciBkZWFkbG9jay4gIFRoaXMgaXMgb25seSBpZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2hvbGUtc2VydmVyIGdyYWJiaW5nIGFwcGxpY2F0aW9uIGV4cGVjdHMgbW91c2Ugb3IKLSAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQgaW5wdXQgYmVmb3JlIHJlbGVhc2luZyB0aGUgZ3JhYi4gIEl0IGlzIHVzdWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgYSB3aW5kb3cgbWFuYWdlciB0aGF0IGRvZXMgdGhpcy4gIHgxMXZuYyB0YWtlcyBjYXJlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIHRoZSBwcm9ibGVtLCBidXQgaWYgY2F1Z2h0IHgxMXZuYyB3aWxsIGZyZWV6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgV2l0aG91dCAtZ3JhYl9idXN0ZXIsIHRoZSBvbmx5IHNvbHV0aW9uIGlzIHRvIGdvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBkaXNwbGF5IGFuZCBnaXZlIGl0IHNvbWUgaW5wdXQgdG8gc2F0aXNmeSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JhYmJpbmcgYXBwLiAgT3IgbWFudWFsbHkga2lsbCBhbmQgcmVzdGFydCB0aGUgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgaWYgdGhhdCBpcyBmZWFzaWJsZS4gIFdpdGggLWdyYWJfYnVzdGVyLCB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBmb3JrIGEgaGVscGVyIHRocmVhZCBhbmQgaWYgeDExdm5jIGFwcGVhcnMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgc3R1Y2sgaW4gYSBncmFiIGFmdGVyIGEgcGVyaW9kIG9mIHRpbWUgKDIwLTMwIHNlYykgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIGluamVjdCBzb21lIHVzZXIgaW5wdXQ6IGJ1dHRvbiBjbGlja3MsIEVzY2FwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbW91c2UgbW90aW9uLCBldGMgdG8gdHJ5IHRvIGJyZWFrIHRoZSBncmFiLiAgSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaWVuY2UgYSBsb3Qgb2YgZ3JhYiBkZWFkbG9jaywgcGxlYXNlIHJlcG9ydCBhIGJ1Zy4KLQotLWRlYnVnX2dyYWJzICAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBpbmZvIHByaW50b3V0IHdpdGggcmVzcGVjdCB0bwotICAgICAgICAgICAgICAgICAgICAgICBYR3JhYlNlcnZlcigpIGRlYWRsb2NrIGZvciAtc2Nyb2xsY29weXJlY3QgbW9kZS4KLQotLWRlYnVnX3NlbCAgICAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBpbmZvIHByaW50b3V0IHdpdGggcmVzcGVjdCB0bwotICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZLCBDTElQQk9BUkQsIGFuZCBDVVRCVUZGRVIwIHNlbGVjdGlvbnMuCi0KLS1wb2ludGVyX21vZGUgbiAgICAgICAgVmFyaW91cyBwb2ludGVyIG1vdGlvbiB1cGRhdGUgc2NoZW1lcy4gIi1wbSIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYW4gYWxpYXMuICBUaGUgcHJvYmxlbSBpcyBwb2ludGVyIG1vdGlvbiBjYW4gY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgcmFwaWQgY2hhbmdlcyBvbiB0aGUgc2NyZWVuOiBjb25zaWRlciB0aGUgcmFwaWQKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB3aGVuIHlvdSBkcmFnIGEgbGFyZ2Ugd2luZG93IGFyb3VuZCBvcGFxdWVseS4KLSAgICAgICAgICAgICAgICAgICAgICAgTmVpdGhlciB4MTF2bmMncyBzY3JlZW4gcG9sbGluZyBhbmQgdm5jIGNvbXByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmVzIG5vciB0aGUgYmFuZHdpZHRoIHRvIHRoZSB2bmN2aWV3ZXJzIGNhbiBrZWVwCi0gICAgICAgICAgICAgICAgICAgICAgIHVwIHRoZXNlIHJhcGlkIHNjcmVlbiBjaGFuZ2VzOiBldmVyeXRoaW5nIHdpbGwgYm9nIGRvd24KLSAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBkcmFnZ2luZyBvciBzY3JvbGxpbmcuICBTbyBhIHNjaGVtZSBoYXMgdG8gYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICB0byAiZWF0IiBtdWNoIG9mIHRoYXQgcG9pbnRlciBpbnB1dCBiZWZvcmUgcmUtcG9sbGluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2NyZWVuIGFuZCBzZW5kaW5nIG91dCBmcmFtZWJ1ZmZlciB1cGRhdGVzLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBudW1iZXIgIm4iIGNhbiBiZSAwIHRvIDQgYW5kIHNlbGVjdHMgb25lIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzY2hlbWVzIGRlc3JpYmVkIGJlbG93LgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgLXdpcmVmcmFtZSBhbmQgLXNjcm9sbGNvcHlyZWN0IG1vZGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZW1lbnQgLXBvaW50ZXJfbW9kZSBieSBkZXRlY3RpbmcgKGFuZCBpbXByb3ZpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gcGVyaW9kcyBvZiAicmFwaWQgc2NyZWVuIGNoYW5nZSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgbj0wOiBkb2VzIHRoZSBzYW1lIGFzIC1ub2RyYWdnaW5nLiAoYWxsIHNjcmVlbiBwb2xsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIHN1c3BlbmRlZCBpZiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkLikKLQotICAgICAgICAgICAgICAgICAgICAgICBuPTE6IHdhcyB0aGUgb3JpZ2luYWwgc2NoZW1lIHVzZWQgdG8gYWJvdXQgSmFuIDIwMDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIGl0IGJhc2ljYWxseSBqdXN0IHNraXBzIC1pbnB1dF9za2lwIGtleWJvYXJkIG9yIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIGJlZm9yZSByZXBvbGxpbmcgdGhlIHNjcmVlbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBuPTIgaXMgYW4gaW1wcm92ZWQgc2NoZW1lOiBieSB3YXRjaGluZyB0aGUgY3VycmVudCByYXRlCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIGlucHV0IGV2ZW50cyBpdCB0cmllcyB0byBkZXRlY3QgaWYgaXQgc2hvdWxkIHRyeSB0bwotICAgICAgICAgICAgICAgICAgICAgICAiZWF0IiBhZGRpdGlvbmFsIHBvaW50ZXIgZXZlbnRzIGJlZm9yZSBjb250aW51aW5nLgotCi0gICAgICAgICAgICAgICAgICAgICAgIG49MyBpcyBiYXNpY2FsbHkgYSBkeW5hbWljIC1ub2RyYWdnaW5nIG1vZGU6IGl0IGRldGVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgbW91c2UgbW90aW9uIGhhcyBwYXVzZWQgYW5kIHRoZW4gcmVmcmVzaGVzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXNwbGF5LgotCi0gICAgICAgICAgICAgICAgICAgICAgIG49NCBhdHRlbXB0cyB0byBtZWFzdXJlcyBuZXR3b3JrIHJhdGVzIGFuZCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmlkZW8gY2FyZCByZWFkIHJhdGUsIGFuZCBob3cgbWFueSB0aWxlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCBvbiB0aGUgc2NyZWVuLiAgRnJvbSB0aGlzLCBpdCBhZ2dyZXNzaXZlbHkgdHJpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcHVzaCBzY3JlZW4gImZyYW1lcyIgd2hlbiBpdCBkZWNpZGVzIGl0IGhhcyBlbm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIHRvIGRvIHNvLiAgTk9UIEZJTklTSEVELgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IG4gaXMgMi4gTm90ZSB0aGF0IG1vZGVzIDIsIDMsIDQgd2lsbCBza2lwCi0gICAgICAgICAgICAgICAgICAgICAgIC1pbnB1dF9za2lwIGtleWJvYXJkIGV2ZW50cyAoYnV0IGl0IHdpbGwgbm90IGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZXZlbnRzKS4gIEFsc28gbm90ZSB0aGF0IHRoZXNlIG1vZGVzIGFyZSBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGluIC10aHJlYWRzIG1vZGUgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICBldmVudCBoYW5kbGluZyBtZWNoYW5pc20uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gdHJ5IG91dCB0aGUgZGlmZmVyZW50IHBvaW50ZXIgbW9kZXMgdG8gc2VlIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgIG9uZSBnaXZlcyB0aGUgYmVzdCByZXNwb25zZSBmb3IgeW91ciB1c2FnZSwgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgY29udmVuaWVudCB0byB1c2UgdGhlIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9uLCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZSAieDExdm5jIC1SIHBtOjQiIG9yIHRoZSB0Y2wvdGsgZ3VpIChUdW5pbmcgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tb2RlIC0+IG4pLgotCi0taW5wdXRfc2tpcCBuICAgICAgICAgIEZvciB0aGUgcG9pbnRlciBoYW5kbGluZyB3aGVuIG5vbi10aHJlYWRlZDogdHJ5IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWQgbiB1c2VyIGlucHV0IGV2ZW50cyBiZWZvcmUgc2Nhbm5pbmcgZGlzcGxheS4gbiA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdG8gYWN0IGFzIHRob3VnaCB0aGVyZSBpcyBhbHdheXMgdXNlciBpbnB1dC4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogMTAKLQotLWFsbGlucHV0ICAgICAgICAgICAgICBIYXZlIHgxMXZuYyByZWFkIGFuZCBwcm9jZXNzIGFsbCBhdmFpbGFibGUgY2xpZW50IGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBwcm9jZWVkaW5nLgotCi0taW5wdXRfZWFnZXJseSAgICAgICAgIFNpbWlsYXIgdG8gLWFsbGlucHV0IGJ1dCB1c2UgdGhlIGhhbmRsZUV2ZW50c0VhZ2VybHkKLSAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtIGJ1aWx0IGludG8gTGliVk5DU2VydmVyLgotCi0tc3BlZWRzIHJkLGJ3LGxhdCAgICAgIHgxMXZuYyB0cmllcyB0byBlc3RpbWF0ZSBzb21lIHNwZWVkIHBhcmFtZXRlcnMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZCB0byBvcHRpbWl6ZSBzY2hlZHVsaW5nIChlLmcuIC1wb2ludGVyX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgNCwgLXdpcmVmcmFtZSwgLXNjcm9sbGNvcHlyZWN0KSBhbmQgb3RoZXIgdGhpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIC1zcGVlZHMgb3B0aW9uIHRvIHNldCB0aGVzZSBtYW51YWxseS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRyaXBsZSAicmQsYncsbGF0IiBjb3JyZXNwb25kcyB0byB2aWRlbyBoL3cKLSAgICAgICAgICAgICAgICAgICAgICAgcmVhZCByYXRlIGluIE1CL3NlYywgbmV0d29yayBiYW5kd2lkdGggdG8gY2xpZW50cyBpbgotICAgICAgICAgICAgICAgICAgICAgICBLQi9zZWMsIGFuZCBuZXR3b3JrIGxhdGVuY3kgdG8gY2xpZW50cyBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gIElmIGEgdmFsdWUgaXMgbGVmdCBibGFuaywgZS5nLiAiLXNwZWVkcwotICAgICAgICAgICAgICAgICAgICAgICAsMTAwLDE1IiwgdGhlbiB0aGUgaW50ZXJuYWwgc2NoZW1lIGlzIHVzZWQgdG8gZXN0aW1hdGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVtcHR5IHZhbHVlKHMpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGljYWwgUEMgdmlkZW8gY2FyZHMgaGF2ZSByZWFkIHJhdGVzIG9mIDUtMTAgTUIvc2VjLgotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZnJhbWVidWZmZXIgaXMgaW4gbWFpbiBtZW1vcnkgaW5zdGVhZCBvZiB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICBoL3cgKGUuZy4gU3VuUmF5LCBzaGFkb3dmYiwgZHVtbXkgZHJpdmVyLCBYdmZiKSwgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWQgcmF0ZSBtYXkgYmUgbXVjaCBmYXN0ZXIuICAieDExcGVyZiAtZ2V0aW1hZ2U1MDAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGdldCBhIGxvd2VyIGJvdW5kIChyZW1lbWJlciB0byBmYWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJ5dGVzIHBlciBwaXhlbCkuICBJdCBpcyB1cCB0byB5b3UgdG8gZXN0aW1hdGUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgYmFuZHdpdGggYW5kIGxhdGVuY3kgdG8gY2xpZW50cy4gIEZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSB0aGUgcGluZygxKSBjb21tYW5kIGNhbiBiZSB1c2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciBjb252ZW5pZW5jZSB0aGVyZSBhcmUgc29tZSBhbGlhc2VzIHByb3ZpZGVkLAotICAgICAgICAgICAgICAgICAgICAgICBlLmcuICItc3BlZWRzIG1vZGVtIi4gIFRoZSBhbGlhc2VzIGFyZTogIm1vZGVtIiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgNiw0LDIwMDsgImRzbCIgZm9yIDYsMTAwLDUwOyBhbmQgImxhbiIgZm9yIDYsNTAwMCwxCi0KLS13bWR0IHN0cmluZyAgICAgICAgICAgRm9yIHNvbWUgZmVhdHVyZXMsIGUuZy4gLXdpcmVmcmFtZSBhbmQgLXNjcm9sbGNvcHlyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaGFzIHRvIHdvcmsgYXJvdW5kIGlzc3VlcyBmb3IgY2VydGFpbiB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcnMgb3IgZGVza3RvcHMgKGN1cnJlbnRseSBrZGUgYW5kIHhmY2UpLgotICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGl0IHRyaWVzIHRvIGd1ZXNzIHdoaWNoIG9uZSwgYnV0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBndWVzcyBpbmNvcnJlY3RseS4gIFVzZSB0aGlzIG9wdGlvbiB0byBpbmRpY2F0ZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICB3bS9kdC4gICJzdHJpbmciIGNhbiBiZSAiZ25vbWUiLCAia2RlIiwgImNkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJ4ZmNlIiwgb3IgInJvb3QiIChjbGFzc2ljIFggd20pLiAgQW55dGhpbmcgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICBpcyBpbnRlcnByZXRlZCBhcyAicm9vdCIuCi0KLS1kZWJ1Z19wb2ludGVyICAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgZXZlcnkgcG9pbnRlciBldmVudC4KLS1kZWJ1Z19rZXlib2FyZCAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgZXZlcnkga2V5Ym9hcmQgZXZlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgIFNhbWUgYXMgLWRwIGFuZCAtZGssIHJlc3BlY3RpdmVseS4gIFVzZSBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyBmb3IgbW9yZSBvdXRwdXQuCi0KLS1kZWZlciB0aW1lICAgICAgICAgICAgVGltZSBpbiBtcyB0byBkZWxheSBzZW5kaW5nIHVwZGF0ZXMgdG8gY29ubmVjdGVkIGNsaWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgKGRlZmVyVXBkYXRlVGltZSkgIERlZmF1bHQ6IDIwCi0KLS13YWl0IHRpbWUgICAgICAgICAgICAgVGltZSBpbiBtcyB0byBwYXVzZSBiZXR3ZWVuIHNjcmVlbiBwb2xscy4gIFVzZWQgdG8gY3V0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvd24gb24gbG9hZC4gIERlZmF1bHQ6IDIwCi0KLS1leHRyYV9mYnVyIG4gICAgICAgICAgUGVyZm9ybSBleHRyYSBGcmFtZUJ1ZmZlclVwZGF0ZVJlcXVlc3RzIGNoZWNrcyB0bwotICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gYmUgaW4gYmV0dGVyIHN5bmMgd2l0aCB0aGUgY2xpZW50J3MgcmVxdWVzdHMuCi0gICAgICAgICAgICAgICAgICAgICAgIFdoYXQgdGhpcyBkb2VzIGlzIHBlcmZvcm0gZXh0cmEgcG9sbHMgb2YgdGhlIGNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQgYXQgY3JpdGljYWwgdGltZXMgKGJlZm9yZSAnLWRlZmVyJyBhbmQgJy13YWl0JwotICAgICAgICAgICAgICAgICAgICAgICBjYWxscy4pICBUaGUgZGVmYXVsdCBpcyBuPTEuICBTZXQgdG8gYSBsYXJnZXIgbnVtYmVyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBtb3JlIGNoZWNrcyBvciBzZXQgdG8gbj0wIHRvIGRpc2FibGUuICBBIGRvd25zaWRlCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZXNlIGV4dHJhIGNhbGxzIGlzIHRoYXQgbW9yZSBtb3VzZSBpbnB1dCBtYXkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIHRoYW4gZGVzaXJlZC4KLQotLXdhaXRfdWkgZmFjdG9yICAgICAgICBGYWN0b3IgYnkgd2hpY2ggdG8gY3V0IHRoZSAtd2FpdCB0aW1lIGlmIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlY2VudCB1c2VyIGlucHV0IChwb2ludGVyIG9yIGtleWJvYXJkKS4KLSAgICAgICAgICAgICAgICAgICAgICAgSW1wcm92ZXMgcmVzcG9uc2UsIGJ1dCBpbmNyZWFzZXMgdGhlIGxvYWQgd2hlbmV2ZXIgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGFyZSBtb3ZpbmcgdGhlIG1vdXNlIG9yIHR5cGluZy4gIERlZmF1bHQ6IDIuMDAKLS1zZXRkZWZlciBuICAgICAgICAgICAgV2hlbiB0aGUgLXdhaXRfdWkgbWVjaGFuaXNtIGN1dHMgZG93biB0aGUgd2FpdCB0aW1lIG1zLAotICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIGRlZmVyIHRpbWUgdG8gdGhlIHNhbWUgbXMgdmFsdWUuIG49MSB0byBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIDAgdG8gZGlzYWJsZSwgYW5kIC0xIHRvIHNldCBkZWZlciB0byAwIChubyBkZWxheSkuCi0gICAgICAgICAgICAgICAgICAgICAgIFNpbWlsYXJseSwgMiBhbmQgLTIgaW5kaWNhdGUgJ3VyZ2VudF91cGRhdGUnIG1vZGUgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gcHVzaCB0aGUgdXBkYXRlcyBldmVuIHNvb25lci4gIERlZmF1bHQ6IDEKLS1ub3dhaXRfYm9nICAgICAgICAgICAgRG8gbm90IGRldGVjdCBpZiB0aGUgc2NyZWVuIHBvbGxpbmcgaXMgImJvZ2dpbmcgZG93biIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNsZWVwIG1vcmUuICBTb21lIGFjdGl2aXRpZXMgd2l0aCBubyB1c2VyIGlucHV0IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBzbG93IHRoaW5ncyBkb3duIGEgbG90OiBjb25zaWRlciBhIGxhcmdlIHRlcm1pbmFsIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbG9uZyBidWlsZCBydW5uaW5nIGluIGl0IGNvbnRpbnVvdXNseSBzdHJlYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dCBvdXRwdXQuICBCeSBkZWZhdWx0IHgxMXZuYyB3aWxsIHRyeSB0byBkZXRlY3QgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAoMyBzY3JlZW4gcG9sbHMgaW4gYSByb3cgZWFjaCBsb25nZXIgdGhhbiAwLjI1IHNlYyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIG5vIHVzZXIgaW5wdXQpLCBhbmQgc2xlZXAgdXAgdG8gMS41IHNlY3MgdG8gbGV0IHRoaW5ncwotICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2ggdXAiLiAgVXNlIHRoaXMgb3B0aW9uIHRvIGRpc2FibGUgdGhhdCBkZXRlY3Rpb24uCi0tc2xvd19mYiB0aW1lICAgICAgICAgIEZsb2F0aW5nIHBvaW50IHRpbWUgaW4gc2Vjb25kcyB0byBkZWxheSBhbGwgc2NyZWVuCi0gICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcuICBGb3Igc3BlY2lhbCBwdXJwb3NlIHVzYWdlIHdoZXJlIGEgbG93IGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgIHJhdGUgaXMgYWNjZXB0YWJsZSBhbmQgZGVzaXJhYmxlLCBidXQgeW91IHdhbnQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZXIgaW5wdXQgcHJvY2Vzc2VkIGF0IHRoZSBub3JtYWwgcmF0ZSBzbyB5b3UgY2Fubm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHVzZSAtd2FpdC4KLS14cmVmcmVzaCB0aW1lICAgICAgICAgRmxvYXRpbmcgcG9pbnQgdGltZSBpbiBzZWNvbmRzIHRvIGluZGljYXRlIGhvdyBvZnRlbiB0bwotICAgICAgICAgICAgICAgICAgICAgICBkbyB0aGUgZXF1aXZhbGVudCBvZiB4cmVmcmVzaCgxKSB0byBmb3JjZSBhbGwgd2luZG93cwotICAgICAgICAgICAgICAgICAgICAgICAoaW4gdGhlIHZpZXdhYmxlIGFyZWEgaWYgLWlkLCAtc2lkLCBvciAtY2xpcCBpcyB1c2VkKQotICAgICAgICAgICAgICAgICAgICAgICB0byByZXBhaW50IHRoZW1zZWx2ZXMuICBVc2UgdGhpcyBvbmx5IGlmIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICBtaXNiZWhhdmUgYnkgbm90IHJlcGFpbnRpbmcgdGhlbXNlbHZlcyBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIGFsc28gLW5veGRhbWFnZS4KLS1uYXAgICAgICAgICAgICAgICAgICAgTW9uaXRvciBhY3Rpdml0eSBhbmQgaWYgaXQgaXMgbG93IHRha2UgbG9uZ2VyIG5hcHMKLS1ub25hcCAgICAgICAgICAgICAgICAgYmV0d2VlbiBzY3JlZW4gcG9sbHMgdG8gcmVhbGx5IGN1dCBkb3duIGxvYWQgd2hlbiBpZGxlLgotICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiB0YWtlIG5hcHMKLS1zYiB0aW1lICAgICAgICAgICAgICAgVGltZSBpbiBzZWNvbmRzIGFmdGVyIE5PIGFjdGl2aXR5IChlLmcuIHNjcmVlbiBibGFuaykKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVhbGx5IHRocm90dGxlIGRvd24gdGhlIHNjcmVlbiBwb2xscyAoaS5lLiBzbGVlcAotICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWJvdXQgMS41IHNlY3MpLiBVc2UgMCB0byBkaXNhYmxlLiAgRGVmYXVsdDogNjAKLSAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBlbnYuIHZhci4gWDExVk5DX1NCX0ZBQ1RPUiB0byBzY2FsZSBpdC4KLQotLXJlYWR0aW1lb3V0IG4gICAgICAgICBTZXQgTGliVk5DU2VydmVyIHJmYk1heENsaWVudFdhaXQgdG8gbiBzZWNvbmRzLiBPbgotICAgICAgICAgICAgICAgICAgICAgICBzbG93IGxpbmtzIHRoYXQgdGFrZSBhIGxvbmcgdGltZSB0byBwYWludCB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIExpYlZOQ1NlcnZlciBtYXkgaGl0IHRoZSB0aW1lb3V0IGFuZCBkcm9wIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLiAgRGVmYXVsdDogMjAgc2Vjb25kcy4KLS1waW5nIG4gICAgICAgICAgICAgICAgU2VuZCBhIDF4MSBmcmFtZWJ1ZmZlciB1cGRhdGUgdG8gYWxsIGNsaWVudHMgZXZlcnkgbgotICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIChlLmcuIHRvIHRyeSB0byBrZWVwIGEgbmV0d29yayBjb25uZWN0aW9uIGFsaXZlKQotCi0tbm9mYnBtICAgICAgICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgdGhlIEZCUE0gKEZyYW1lIEJ1ZmZlciBQb3dlcgotLWZicG0gICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50KSBleHRlbnNpb24gKGkuZS4gc29tZSBTdW4gc3lzdGVtcyksIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudCB0aGUgdmlkZW8gaC93IGZyb20gZ29pbmcgaW50byBhIHJlZHVjZWQgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZCUE0gY2FwYWJsZSB2aWRlbyBoL3cgc2F2ZSBlbmVyZ3kgd2hlbiB0aGUgd29ya3N0YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgaXMgaWRsZSBieSBnb2luZyBpbnRvIGxvdyBwb3dlciBzdGF0ZXMgKHNpbWlsYXIgdG8gRFBNUwotICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9uaXRvcnMpLiAgVGhpcyBpbnRlcmZlcmVzIHdpdGggeDExdm5jJ3MgcG9sbGluZwotICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZnJhbWVidWZmZXIgZGF0YS4KLQotICAgICAgICAgICAgICAgICAgICAgICAiLW5vZmJwbSIgbWVhbnMgcHJldmVudCBGQlBNIGxvdyBwb3dlciBzdGF0ZXMgd2hlbmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZCwgd2hpbGUgIi1mYnBtIiBtZWFucyB0byBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciB0aGUgRkJQTSBzdGF0ZSBhdCBhbGwuICBTZWUgdGhlIHhzZXQoMSkgbWFucGFnZQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlscy4gIC1ub2ZicG0gaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHJ1bm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgInhzZXQgZmJwbSBmb3JjZSBvbiIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogLWZicG0KLQotLW5vZHBtcyAgICAgICAgICAgICAgICBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZSBEUE1TIChEaXNwbGF5IFBvd2VyIE1hbmFnZW1lbgotdAotLWRwbXMgICAgICAgICAgICAgICAgICBTaWduYWxpbmcpIGV4dGVuc2lvbiwgdGhlbiBwcmV2ZW50IHRoZSBtb25pdG9yIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgZ29pbmcgaW50byBhIHJlZHVjZWQgcG93ZXIgc3RhdGUgd2hlbiBWTkMgY2xpZW50cwotICAgICAgICAgICAgICAgICAgICAgICBhcmUgY29ubmVjdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIERQTVMgcmVkdWNlZCBwb3dlciBtb25pdG9yIHN0YXRlcyBhcmUgYSBnb29kIHRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB5b3Ugbm9ybWFsbHkgd2FudCB0aGUgcG93ZXIgZG93biB0byB0YWtlIHBsYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IHgxMXZuYyBoYXMgbm8gcHJvYmxlbSBleHBvcnRpbmcgdGhlIGRpc3BsYXkgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSkuICBZb3UgcHJvYmFibHkgb25seSB3YW50IHRvIHVzZSAiLW5vZHBtcyIKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCBTY3JlZW4gU2F2ZXJzIGtpY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgb24gaW4gRFBNUyBsb3cgcG93ZXIgc3RhdGVzLiAgVGhlcmUgaXMga25vd24gcHJvYmxlbQotICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGtkZXNrdG9wX2xvY2sgb24gS0RFIHdoZXJlIHRoZSBzY3JlZW4gc2F2ZXIga2VlcHMKLSAgICAgICAgICAgICAgICAgICAgICAga2lja2luZyBpbiBldmVyeSB0aW1lIHVzZXIgaW5wdXQgc3RvcHMgZm9yIGEgc2Vjb25kCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIHR3by4gIFNwZWNpZnlpbmcgIi1ub2RwbXMiIHdvcmtzIGFyb3VuZCBpdC4KLQotICAgICAgICAgICAgICAgICAgICAgICAiLW5vZHBtcyIgbWVhbnMgcHJldmVudCBEUE1TIGxvdyBwb3dlciBzdGF0ZXMgd2hlbmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZCwgd2hpbGUgIi1kcG1zIiBtZWFucyB0byBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciB0aGUgRFBNUyBzdGF0ZSBhdCBhbGwuICBTZWUgdGhlIHhzZXQoMSkgbWFucGFnZQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlscy4gIC1ub2RwbXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHJ1bm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgInhzZXQgZHBtcyBmb3JjZSBvbiIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogLWRwbXMKLQotLWZvcmNlZHBtcyAgICAgICAgICAgICBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZSBEUE1TIChEaXNwbGF5IFBvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZW1lbnQgU2lnbmFsaW5nKSBleHRlbnNpb24sIHRoZW4gdHJ5IHRvIGtlZXAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgaW4gYSBwb3dlcmVkIG9mZiBzdGF0ZS4gIFRoaXMgaXMgdG8gcHJldmVudAotICAgICAgICAgICAgICAgICAgICAgICBub3NleSBwZW9wbGUgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgZnJvbSB2aWV3aW5nIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgb24gdGhlIHNjcmVlbi4gIEJlIHN1cmUgdG8gbG9jayB0aGUgc2NyZWVuIGJlZm9yZQotICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW5nLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGZhciBmcm9tIGJ1bGxldCBwcm9vZiwgZS5nLiBzdXBwb3NlCi0gICAgICAgICAgICAgICAgICAgICAgIHNvbWVvbmUgYXR0YWNoZXMgYSBub24tRFBNUyBtb25pdG9yLCBvciBsb2FkcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZSBzbyB0aGF0IHRoZXJlIGlzIGEgZ2FwIG9mIHRpbWUgYmVmb3JlIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgcG93ZXJlZCBvZmYgc3RhdGU/ICBPbiBtYW55IG1hY2hpbmVzIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIGhlIGZsb29kcyBpdCB3aXRoIGtleWJvYXJkIGFuZCBtb3VzZSBpbnB1dCBoZSBjYW4gc2VlCi0gICAgICAgICAgICAgICAgICAgICAgIGZsYXNoZXMgb2Ygd2hhdCBpcyBvbiB0aGUgc2NyZWVuIGJlZm9yZSB0aGUgRFBNUyBvZmYKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgaXMgcmVlc3RhYmxpc2hlZC4gIEZvciB0aGlzIHRvIHdvcmsgc2VjdXJlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgd291bGQgbmVlZCB0byBiZSBzdXBwb3J0IGluIHRoZSBYIHNlcnZlciB0byBkbwotICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGV4YWN0bHkgcmF0aGVyIHRoYW4gYXBwcm94aW1hdGVseSB3aXRoIERQTVMuCi0KLS1jbGllbnRkcG1zICAgICAgICAgICAgQXMgLWZvcmNlZHBtcyBidXQgb25seSB3aGVuIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQuCi0KLS1ub3NlcnZlcmRwbXMgICAgICAgICAgVGhlIFVsdHJhVk5DIFNlcnZlcklucHV0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSBWTkMgdmlld2VyIHRvIGNsaWNrIGEgYnV0dG9uIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSB0aGUgc2VydmVyICh4MTF2bmMpIHRvIHRyeSB0byBkaXNhYmxlIGtleWJvYXJkCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBtb3VzZSBpbnB1dCBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgcHV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIGluIGRwbXMgcG93ZXJlZCBvZmYgc3RhdGUuICBVc2UgdGhpcyBvcHRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBwb3dlcmluZyBvZmYgdGhlIG1vbml0b3IuCi0KLS1ub3VsdHJhZXh0ICAgICAgICAgICAgRGlzYWJsZSB0aGUgZm9sbG93aW5nIFVsdHJhVk5DIGV4dGVuc2lvbnM6IFNpbmdsZVdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICBhbmQgU2VydmVySW5wdXQuICBUaGUgb3RoZXJzIG1hbmFnZWQgYnkgTGliVk5DU2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Y2hhdCwgMS9uIHNjYWxpbmcsIHJmYkVuY29kaW5nVWx0cmEpIGFyZSBub3QuCi0KLS1jaGF0d2luZG93ICAgICAgICAgICAgUGxhY2UgYSBsb2NhbCBVbHRyYVZOQyBjaGF0IHdpbmRvdyBvbiB0aGUgWDExIGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB4MTF2bmMgaXMgcG9sbGluZy4gIFRoYXQgd2F5IHRoZSBwZXJzb24gb24gdGhlIFZOQwotICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXItc2lkZSBjYW4gY2hhdCB3aXRoIHRoZSBwZXJzb24gYXQgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMSBjb25zb2xlLiAoZS5nLiBoZWxwZGVzayB3L28gdGVsZXBob25lKQotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIHRvIHdvcmsgdGhlIFNTVk5DIHBhY2thZ2UgKHZlcnNpb24gMS4wLjIxIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIGxhdGVyKSBNVVNUIEJFIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHdoZXJlIHgxMXZuYyBydW5zCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgJ3Nzdm5jJyBjb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIGluICRQQVRILgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3N2bmN2aWV3ZXIgaXMgdXNlZCBhcyBhIGNoYXQgd2luZG93IGhlbHBlci4KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3N2bmMuaHRtbAotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGltcGxpZXMgJy1yZmJ2ZXJzaW9uIDMuNicgc28gYXMgdG8gdHJpY2sKLSAgICAgICAgICAgICAgICAgICAgICAgVWx0cmFWTkMgdmlld2Vycywgb3RoZXJ3aXNlIHRoZXkgYXNzdW1lIGNoYXQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gIFRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcmZidmVyc2lvbiwgcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgYWZ0ZXIgdGhlIC1jaGF0d2luZG93IG9wdGlvbiBvbiB0aGUgY21kbGluZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyB0aGUgcmVtb3RlIGNvbnRyb2wgJ2NoYXRvbicgYW5kICdjaGF0b2ZmJwotICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLiAgVGhlc2UgY2FuIGFsc28gYmUgc2V0IGZyb20gdGhlIHRreDExdm5jIEdVSS4KLQotLW5veGRhbWFnZSAgICAgICAgICAgICBEbyBub3QgdXNlIHRoZSBYIERBTUFHRSBleHRlbnNpb24gdG8gZGV0ZWN0IGZyYW1lYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgZXZlbiBpZiBpdCBpcyBhdmFpbGFibGUuICBVc2UgLXhkYW1hZ2UgaWYgeW91cgotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIGhhdmUgaXQgb2ZmLgotCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYydzIHVzZSBvZiB0aGUgREFNQUdFIGV4dGVuc2lvbjogMSkgc2lnbmlmaWNhbnRseQotICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VzIHRoZSBsb2FkIHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgY2hhbmdpbmcgbXVjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIDIpIGRldGVjdHMgY2hhbmdlZCBhcmVhcyAoc21hbGwgb25lcyBieSBkZWZhdWx0KQotICAgICAgICAgICAgICAgICAgICAgICBtb3JlIHF1aWNrbHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlcG9ydHMgbGFyZ2UgYXJlYXMgKGUuZy4gYSB3aG9sZSB0ZXJtaW5hbAotICAgICAgICAgICAgICAgICAgICAgICBvciBicm93c2VyIHdpbmRvdykgYXMgZGFtYWdlZCBldmVuIHRob3VnaCB0aGUgYWN0dWFsCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggc21hbGxlciAoc29tZXRpbWVzIGp1c3QgYSBmZXcKLSAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzKS4gIFNvIGhldXJpc3RpY3Mgd2VyZSBpbnRyb2R1Y2VkIHRvIHNraXAgbGFyZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlYXMgYW5kIHVzZSB0aGUgZGFtYWdlIHJlY3RhbmdsZXMgb25seSBhcyAiaGludHMiCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdHJhZGl0aW9uYWwgc2NhbmxpbmUgcG9sbGluZy4gIFRoZSBmb2xsb3dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdHVuaW5nIHBhcmFtZXRlcnMgYXJlIGludHJvZHVjZWQgdG8gYWRqdXN0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6Ci0KLS14ZF9hcmVhIEEgICAgICAgICAgICAgU2V0IHRoZSBsYXJnZXN0IERBTUFHRSByZWN0YW5nbGUgYXJlYSAiQSIgKGluCi0gICAgICAgICAgICAgICAgICAgICAgIHBpeGVsczogd2lkdGggKiBoZWlnaHQpIHRvIHRydXN0IGFzIHRydWx5IGRhbWFnZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWN0YW5nbGUgd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgZnJhbWVidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgKHNsb3cpIG5vIG1hdHRlciB3aGF0LiAgU2V0IHRvIHplcm8gdG8gdHJ1c3QgKmFsbCoKLSAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlcy4gRGVmYXVsdDogMjAwMDAKLS14ZF9tZW0gZiAgICAgICAgICAgICAgU2V0IGhvdyBsb25nIERBTUFHRSByZWN0YW5nbGVzIHNob3VsZCBiZSAicmVtZW1iZXJlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICJmIiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgaXMgaW4gdW5pdHMgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lIHJlcGVhdCBjeWNsZSB0aW1lICgzMiBpdGVyYXRpb25zKS4gIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICgxLjApIHNob3VsZCBnaXZlIG5vIHBhaW50aW5nIHByb2JsZW1zLiBJbmNyZWFzZSBpdCBpZgotICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBhcmUgcHJvYmxlbXMgb3IgZGVjcmVhc2UgaXQgdG8gbGl2ZSBvbiB0aGUgZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAocGVyaGFwcyB1c2VmdWwgb24gYSBzbG93IG1hY2hpbmUpLgotCi0tc2lncGlwZSBzdHJpbmcgICAgICAgIEJyb2tlbiBwaXBlIChTSUdQSVBFKSBoYW5kbGluZy4gICJzdHJpbmciIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlIiBvciAiZXhpdCIuICBGb3IgImlnbm9yZSIgTGliVk5DU2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgaGFuZGxlIHRoZSBhYnJ1cHQgbG9zcyBvZiBhIGNsaWVudCBhbmQgY29udGludWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciAiZXhpdCIgeDExdm5jIHdpbGwgY2xlYW51cCBhbmQgZXhpdCBhdCB0aGUgMXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiBjb25uZWN0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG5vdCByZWFsbHkgbmVlZGVkIHNpbmNlIExpYlZOQ1NlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICBpcyBkb2luZyB0aGUgY29ycmVjdCB0aGluZyBub3cgZm9yIHF1aXRlIHNvbWUgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgZm9yIGNvbnZlbmllbmNlIHlvdSBjYW4gdXNlIGl0IHRvIGlnbm9yZSBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxzLCBlLmcuICItc2lncGlwZSBpZ25vcmU6SFVQLElOVCxURVJNIiBpbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgYmUgdXNlZnVsIGZvciBzb21lIHNvcnQgb2YgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBwdXQgImV4aXQ6Li4iIGluIHRoZSBsaXN0IHRvIGhhdmUgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAgb24gdGhlIGxpc3RlZCBzaWduYWxzLiAiLXNpZyIgaXMgYW4gYWxpYXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgb3B0aW9uIGlmIHlvdSBkb24ndCBsaWtlIHRoZSAncGlwZScuIEV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgIC1zaWcgaWdub3JlOklOVCxURVJNLGV4aXQ6VVNSMQotCi0tdGhyZWFkcyAgICAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdGhyZWFkZWQgTGliVk5DU2VydmVyCi0tbm90aHJlYWRzICAgICAgICAgICAgIGFsZ29yaXRobSBbcmZiUnVuRXZlbnRMb29wXSBpZiBsaWJwdGhyZWFkIGlzIGF2YWlsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBtb2RlIG5ldyB0aHJlYWRzIChvbmUgZm9yIGlucHV0IGFuZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIG91dHB1dCkgYXJlIGNyZWF0ZWQgdG8gaGFuZGxlIGVhY2ggbmV3IGNsaWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLW5vdGhyZWFkcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQgc3RhYmlsaXR5IGlzIG11Y2ggaW1wcm92ZWQgaW4gdmVyc2lvbiAwLjkuOC4KLQotICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGllbnRzIGluIHRocmVhZGVkIG1vZGUgc2hvdWxkIGJlIHN0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFpSTEUgZW5jb2Rpbmcgb24gYWxsIHBsYXRmb3Jtcy4gIFRoZSBUaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgWmxpYiBlbmNvZGluZ3MgYXJlIGN1cnJlbnRseSBvbmx5IHN0YWJsZSBvbiBMaW51eCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgY2xpZW50cy4gIENvbXBpbGUgd2l0aCAtRFRMUz1fX3RocmVhZCBpZiB5b3VyCi0gICAgICAgICAgICAgICAgICAgICAgIE9TIGFuZCBjb21waWxlciBhbmQgbGlua2VyIHN1cHBvcnQgaXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlc2l6ZXMgKHJhbmRyLCBldGMuKSBzZXQgdGhpcyBlbnYuIHZhci4gdG8gdGhlIG51bWIKLWVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcDogWDExVk5DX1RIUkVBRFNfTkVXX0ZCX1NMRUVQCi0gICAgICAgICAgICAgICAgICAgICAgIGF0IHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkb19uZXdfZmIoKSBhY3Rpb24uICBUaGlzIGlzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGxldCB2YXJpb3VzIGFjdGl2aXRpZXMgc2V0dGxlLiAgRGVmYXVsdCBpcyBhYm91dCA1MDBtcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGllbnRzIGluIHRocmVhZGVkIG1vZGUgY291bGQgeWllbGQgYmV0dGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGZvciAnY2xhc3Mtcm9vbScgYnJvYWRjYXN0aW5nIHVzYWdlOyBhbHNvIGluCi0gICAgICAgICAgICAgICAgICAgICAgIC1hcHBzaGFyZSBicm9hZGNhc3QgbW9kZS4gIFNlZSBhbHNvIHRoZSAtcmVmbGVjdCBvcHRpb24uCi0KLS1mcyBmICAgICAgICAgICAgICAgICAgSWYgdGhlIGZyYWN0aW9uIG9mIGNoYW5nZWQgdGlsZXMgaW4gYSBwb2xsIGlzIGdyZWF0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBmLCB0aGUgd2hvbGUgc2NyZWVuIGlzIHVwZGF0ZWQuICBEZWZhdWx0OiAwLjc1Ci0tZ2FwcyBuICAgICAgICAgICAgICAgIEhldXJpc3RpYyB0byBmaWxsIGluIGdhcHMgaW4gcm93cyBvciBjb2xzIG9mIG4gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aWxlcy4gIFVzZWQgdG8gaW1wcm92ZSB0ZXh0IHBhZ2luZy4gIERlZmF1bHQ6IDQKLS1ncm93IG4gICAgICAgICAgICAgICAgSGV1cmlzdGljIHRvIGdyb3cgaXNsYW5kcyBvZiBjaGFuZ2VkIHRpbGVzIG4gb3Igd2lkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgYnkgY2hlY2tpbmcgdGhlIHRpbGUgbmVhciB0aGUgYm91bmRhcnkuICBEZWZhdWx0OiAzCi0tZnV6eiBuICAgICAgICAgICAgICAgIFRvbGVyYW5jZSBpbiBwaXhlbHMgdG8gbWFyayBhIHRpbGVzIGVkZ2VzIGFzIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDIKLS1kZWJ1Z190aWxlcyAgICAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgdGlsZXMsIGZiIHVwZGF0ZXMsIGV0Yy4KLQotLXNuYXBmYiAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIHBvbGxpbmcgdGhlIFggZGlzcGxheSBmcmFtZWJ1ZmZlciAoZmIpCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBjaGFuZ2VzLCBwZXJpb2RpY2FsbHkgY29weSBhbGwgb2YgWCBkaXNwbGF5IGZiCi0gICAgICAgICAgICAgICAgICAgICAgIGludG8gbWFpbiBtZW1vcnkgYW5kIGV4YW1pbmUgdGhhdCBjb3B5IGZvciBjaGFuZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBzZXR0aW5nIGFsc28gYXBwbGllcyBmb3Igbm9uLVggLXJhd2ZiIG1vZGVzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIHRoaXMgd2lsbCBpbXByb3ZlIGludGVyYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLCBvciBhdCBsZWFzdCBtYWtlIHRoaW5ncyBsb29rIHNtb290aGVyLCBidXQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJzIChtb3N0ISkgaXQgd2lsbCBtYWtlIHRoZSByZXNwb25zZSB3b3JzZS4gIElmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoL3cgZmIgaXMgc3VjaCB0aGF0IHJlYWRpbmcgc21hbGwgdGlsZXMgaXMgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICBzbG93IHRoaXMgbW9kZSBjb3VsZCBoZWxwLiAgVG8ga2VlcCB0aGUgImZyYW1lcmF0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdXAgdGhlIHNjcmVlbiBzaXplIHggYnBwIGNhbm5vdCBiZSB0b28gbGFyZ2UuICBOb3RlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2RlIGlzIHZlcnkgd2FzdGVmdWwgb2YgbWVtb3J5IEkvTyByZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgKGl0IG1ha2VzIGZ1bGwgc2NyZWVuIGNvcGllcyBldmVuIGlmIG5vdGhpbmcgY2hhbmdlcykuCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IG1heSBiZSBvZiB1c2UgaW4gdmlkZW8gY2FwdHVyZS1saWtlIGFwcGxpY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgd2ViY2Ftcywgb3Igd2hlcmUgd2luZG93IHRlYXJpbmcgaXMgYSBwcm9ibGVtLgotCi0tcmF3ZmIgc3RyaW5nICAgICAgICAgIEluc3RlYWQgb2YgcG9sbGluZyBYLCBwb2xsIHRoZSBtZW1vcnkgb2JqZWN0IHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICAgICBpbiAic3RyaW5nIi4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgZmlsZSBwb2xsaW5nLCB0byBtZW1vcnkgbWFwIG1tYXAoMikgYSBmaWxlIHVzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIm1hcDovcGF0aC90by9hL2ZpbGVAV3hIeEIiLCB3aXRoIGZyYW1lYnVmZmVyIFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICBIZWlnaHQsIGFuZCBCaXRzIHBlciBwaXhlbC4gICJtbWFwOi4uLiIgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNhbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgdHJvdWJsZSB3aXRoIG1tYXAsIHVzZSAiZmlsZTovLi4uIgotICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2xvd2VyIGxzZWVrKDIpIGJhc2VkIHJlYWRpbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVXNlICJzbmFwOi4uLiIgdG8gaW1wbHkgLXNuYXBmYiBtb2RlIGFuZCB0aGUgImZpbGU6IgotICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgKHRoaXMgaXMgZm9yIHVuc2Vla2FibGUgZGV2aWNlcyB0aGF0IG9ubHkgcHJvdmlkZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmIgYWxsIGF0IG9uY2UsIGUuZy4gYSB2aWRlbyBjYW1lcmEgcHJvdmlkZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHdob2xlIGZyYW1lKS4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3Igc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBzdHJpbmcgaXMgb2YgdGhlIGZvcm06Ci0gICAgICAgICAgICAgICAgICAgICAgICJzaG06TkBXeEh4QiIgd2hpY2ggc3BlY2lmaWVzIGEgc2htaWQgTiBhbmQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICBXeEh4QiBhcyBhYm92ZS4gIFNlZSBzaG1hdCgxKSBhbmQgaXBjcygxKQotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgdHlwZSAibWFwIiBpcyBhc3N1bWVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cyAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaHMgZm9yIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyB0byB0aGlzLikKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcgaXMgInNldHVwOmNtZCIsIHRoZW4gdGhlIGNvbW1hbmQgImNtZCIKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcnVuIGFuZCB0aGUgZmlyc3QgbGluZSBmcm9tIGl0IGlzIHJlYWQgYW5kIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYXMgInN0cmluZyIuICBUaGlzIGFsbG93cyBpbml0aWFsaXppbmcgdGhlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pbmcgV3hIeEIsIGV0Yy4gVGhlc2UgYXJlIG9mdGVuIGRvbmUgYXMgcm9vdAotICAgICAgICAgICAgICAgICAgICAgICBzbyB0YWtlIGNhcmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCAidmlkZW8iLCBzZWUgdGhlIFZJREVPNExJTlVYCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cgd2hlcmUgdGhlIGRldmljZSBtYXkgYmUgcXVlcmllZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBwb3NzaWJseSBzZXQpIHRoZSBmcmFtZWJ1ZmZlciBwYXJhbWV0ZXJzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggImNvbnNvbGUiLCAiL2Rldi9mYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJmYiIsIG9yICJ2dCIsIHNlZSB0aGUgTElOVVggQ09OU09MRSBkaXNjdXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgb3BlbmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBrZXlzdHJva2VzIChhbmQgcG9zc2libHkgbW91c2UgZXZlbnRzKSBhcmUgaW5zZXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgY29uc29sZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoICJ2bmMiLCBzZWUgdGhlIFZOQyBIT1NUCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Npb24gYmVsb3cgd2hlcmUgdGhlIGZyYW1lYnVmZmVyIGlzIHRha2VuIGFzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgYW5vdGhlciByZW1vdGUgVk5DIHNlcnZlci4KLQotICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBzdWZmaXhlcyBhcmUgIjpSL0cvQiIgYW5kICIrTyIgdG8gc3BlY2lmeQotICAgICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBtYXNrcyAoaW4gaGV4KSBhbmQgYW4gb2Zmc2V0IGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvYmplY3QuICBJZiB0aGUgbWFza3MgYXJlIG5vdCBwcm92aWRlZCB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3NlcyB0aGVtIGJhc2VkIG9uIHRoZSBicHAgKGlmIHRoZSBjb2xvcnMgbG9vayB3cm9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IG5lZWQgdG8gcHJvdmlkZSB0aGUgbWFza3MuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgb3B0aW9uYWwgc3VmZml4IGlzIHRoZSBCeXRlcyBQZXIgTGluZSB3aGljaCBpbgotICAgICAgICAgICAgICAgICAgICAgICBzb21lIGNhc2VzIGlzIG5vdCBXeEIvOC4gIFNwZWNpZnkgaXQgYXMgV3hIeEItQlBMCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4gODAweDYwMHgxNi0yMDQ4LiAgVGhpcyBjb3VsZCBiZSBhIG5vcm1hbCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAxMDI0IGF0IDE2YnBwIGZiLCBidXQgb25seSB3aWR0aCA4MDAgc2hvd3MgdXAuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU28gdGhlIGZ1bGwgZm9ybWF0IGlzOiBtb2RlOmZpbGVAV3hIeEI6Ui9HL0IrTy1CUEwKLQotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBzaG06MjEwMzM3OTMzQDgwMHg2MDB4MzI6ZmYvZmYwMC9mZjAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBtYXA6L2Rldi9mYjBAMTAyNHg3Njh4MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBtYXA6L3RtcC9YdmZiX3NjcmVlbjBANjQweDQ4MHg4KzMyMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBmaWxlOi90bXAvbXkucG5tQDI1MHgyMDB4MjQrMzcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBmaWxlOi9kZXYvdXJhbmRvbUAxMjh4MTI4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBzbmFwOi9kZXYvdmlkZW8wQDMyMHgyNDB4MjQgLTI0dG8zMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZpZGVvMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZpZGVvIC1waXBlaW5wdXQgVklECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZ0MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZuYzpzb21laG9zdDowCi0KLSAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBpcGNzKDEpIGFuZCBmYnNldCgxKSBmb3IgdGhlIGZpcnN0IHR3byBleGFtcGxlcykKLQotICAgICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsIGFsbCB1c2VyIGlucHV0IGlzIGRpc2NhcmRlZCBieSBkZWZhdWx0IChzZWUKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1waXBlaW5wdXQgb3B0aW9uIGZvciBob3cgdG8gdXNlIGEgaGVscGVyIHByb2dyYW0KLSAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5zZXJ0KS4gIE1vc3Qgb2YgdGhlIFgxMSAoc2NyZWVuLCBrZXlib2FyZCwgbW91c2UpCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgZG8gbm90IG1ha2Ugc2Vuc2UgYW5kIG1hbnkgd2lsbCBjYXVzZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGUgdG8gY3Jhc2gsIHNvIHBsZWFzZSB0aGluayB0d2ljZSBiZWZvcmUgc2V0dGluZyBvcgotICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2luZyB0aGVtIGluIGEgcnVubmluZyB4MTF2bmMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IERPIE5PVCB3YW50IHgxMXZuYyB0byBjbG9zZSB0aGUgWCBESVNQTEFZIGluCi0gICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiIG1vZGUsIHByZXBlbmQgYSAiKyIgZS5nLiArZmlsZTovZGV2L2ZiMC4uLgotICAgICAgICAgICAgICAgICAgICAgICBLZWVwaW5nIHRoZSBkaXNwbGF5IG9wZW4gZW5hYmxlcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtY29udHJvbCBjaGFubmVsLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwuCi0gICAgICAgICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIGlmIHlvdSBzcGVjaWZ5IC1ub3ZpZXdvbmx5LCB0aGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQgYXJlIFNUSUxMIHNlbnQgdG8gdGhlIFgKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwgdGhpcyB1c2FnZSBzaG91bGQgYmUgdmVyeSByYXJlLCBpLmUuIGRvaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyBzdHJhbmdlIHdpdGggL2Rldi9mYjAuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRldmljZSBpcyBub3QgInNlZWthYmxlIiAoZS5nLiB3ZWJjYW0pIHRyeQotICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nIGl0IGFsbCBhdCBvbmNlIGluIGZ1bGwgc25hcHMgdmlhIHRoZSAic25hcDoiCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKG5vdGU6IHRoaXMgaXMgYSByZXNvdXJjZSBob2cpLiAgSWYgeW91IGFyZSB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBvciBtYXA6IEFORCB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlIHJlb3BlbmVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAqZXZlcnkqIHNuYXBmYiBzbmFwc2hvdCwgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZToKLSAgICAgICAgICAgICAgICAgICAgICAgU05BUEZCX1JBV0ZCX1JFU0VUPTEgYXMgd2VsbC4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB4MTF2bmMgdG8gZHluYW1pY2FsbHkgdHJhbnNmb3JtIGEgMjRicHAKLSAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmIgdG8gMzJicHAgKG5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2xvd2VyKSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB0aGUgLTI0dG8zMiBvcHRpb24uICBUaGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNheSwgYSB2aWRlbyBjYW1lcmEgdGhhdCBkZWxpdmVycyB0aGUgcGl4ZWwgZGF0YSBhcwotICAgICAgICAgICAgICAgICAgICAgICAyNGJwcCBwYWNrZWQgUkdCLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCB1bmRlciAidmlkZW8iCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGUgaWYgdGhlIGJwcCBpcyAyNC4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxseSB0aGUgYml0cyBwZXIgcGl4ZWwsIEIsIGlzIDgsIDE2LCBvciAzMiAob3IKLSAgICAgICAgICAgICAgICAgICAgICAgcmFyZWx5IDI0KSwgaG93ZXZlciB0aGVyZSBpcyBhbHNvIHNvbWUgc3VwcG9ydCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgQiA8IDggKGUuZy4gb2xkIGdyYXBoaWNzIGRpc3BsYXlzIDQgYnBwIG9yIDEgYnBwKS4KLSAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHlvdSBjZXJ0YWlubHkgbXVzdCBzdXBwbHkgdGhlIG1hc2tzIGFzCi0gICAgICAgICAgICAgICAgICAgICAgIHdlbGw6IFd4SHhCOlIvRy9CLiAgVGhlIHBpeGVscyB3aWxsIGJlIHBhZGRlZCBvdXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgOCBicHAgdXNpbmcgZGVwdGggOCB0cnVlY29sb3IuICBUaGUgc2NoZW1lIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCB3b3JrIHdpdGggc25hcCBmYiAoYXNrIGlmIGludGVyZXN0ZWQuKSBCPTEKLSAgICAgICAgICAgICAgICAgICAgICAgbW9ub2Nocm9tZSBleGFtcGxlOiBmaWxlOi9kZXYvdXJhbmRvbUAxMjh4MTI4eDE6MS8xLzEKLSAgICAgICAgICAgICAgICAgICAgICAgU29tZSBvdGhlciBsaWtlIHRoaXMgYXJlIDEyOHgxMjh4MjozLzMvMyAxMjh4MTI4eDQ6Ny83LzcKLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgQiA8IDggZnJhbWVidWZmZXJzIHlvdSBjYW4gYWxzbyBzZXQgdGhlIGVudi4gdmFyCi0gICAgICAgICAgICAgICAgICAgICAgIFJBV0ZCX0NHQT0xIHRvIHRyeSBhIENHQSBtYXBwaW5nIGZvciBCPTQgKGUuZy4gbGludXgKLSAgICAgICAgICAgICAgICAgICAgICAgdmdhMTZmYiBkcml2ZXIuKSAgTm90ZSB3aXRoIGxvdyBicHAgYW5kL29yIHJlc29sdXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgVkdBIGFuZCBWR0ExNiBtb2RlcyBvbiB0aGUgTGludXggY29uc29sZSBvbmUncyBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvIGV4cG9ydCB0aGVtIHZpYSB4MTF2bmMgY2FuIG9mdGVuIGJlIHRod2FydGVkIGR1ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsIGNvbG9yIHBhbGV0dGVzLCBwaXhlbCBwYWNraW5ncywgYW5kIGV2ZW4gdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgYnVmZmVyaW5nLiAgT1RPSCwgb2Z0ZW4gZXhwZXJpbWVudGluZyB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBSR0IgbWFza3MgY2FuIHlpZWxkIHNvbWV0aGluZyByZWNvZ25pemFibGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVklERU80TElOVVg6IG9uIExpbnV4IHNvbWUgYXR0ZW1wdCBpcyBtYWRlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBkZXZpY2VzICh3ZWJjYW1zIG9yIFRWIHR1bmVycykgYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlkZWEgaXMgdGhlIFd4SHhCIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBpdHNlbGYuICBTbyBpZiB5b3UgZG8gbm90IHN1cHBseSAiQFd4SHhCLi4uCi0gICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgeDExdm5jIHdpbGwgdHJ5IHRvIGRldGVybWluZSB0aGVtLiAgSXQgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgdHJpZXMgdGhlIHY0bCBBUEkgaWYgdGhhdCBzdXBwb3J0IGhhcyBiZWVuIGNvbXBpbGVkIGluLgotICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgaXQgd2lsbCBydW4gdGhlIHY0bC1pbmZvKDEpIGV4dGVybmFsIHByb2dyYW0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYXZhaWxhYmxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaW1wbGVzdCBleGFtcGxlcyBhcmUgIi1yYXdmYiB2aWRlbyIgYW5kICItcmF3ZmIKLSAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8xIiB3aGljaCBpbXBseSB0aGUgZGV2aWNlIGZpbGUgL2Rldi92aWRlbyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgL2Rldi92aWRlbzEsIHJlc3BlY3RpdmVseS4gIFlvdSBjYW4gYWxzbyBzdXBwbHkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIC9kZXYgaWYgeW91IGxpa2UsIGUuZy4gIi1yYXdmYiAvZGV2L3ZpZGVvMCIKLQotICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdmlkZW8gY2FwdHVyZSBkZXZpY2UgZnJhbWVidWZmZXIgdXN1YWxseQotICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIGNvbnRpbnVvdXNseSAoZS5nLiBicmlnaHRuZXNzIGZsdWN0dWF0aW9ucyksCi0gICAgICAgICAgICAgICAgICAgICAgIHlvdSBtYXkgd2FudCB0byB1c2UgdGhlIC13YWl0LCAtc2xvd19mYiwgb3IgLWRlZmVyCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgdG8gbG93ZXIgdGhlICJmcmFtZXJhdGUiIHRvIGN1dCBkb3duIG9uCi0gICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgVk5DIHRyYWZmaWMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQSBtb3JlIHNvcGhpc3RpY2F0ZWQgdmlkZW8gZGV2aWNlIHNjaGVtZSBhbGxvd3MKLSAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UncyBzZXR0aW5ncyB1c2luZzoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZpZGVvOjxzZXR0aW5ncz4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgcHJlZml4IGNvdWxkIGFsc28gYmUsIGFzIGFib3ZlLCBlLmcuICJ2aWRlbzE6IiB0bwotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSBkZXZpY2UgZmlsZS4gIFRoZSB2NGwgQVBJIG11c3QgYmUgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHRvIHdvcmsuICBPdGhlcndpc2UsIHlvdSB3aWxsIG5lZWQgdG8gdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUgdGhlIGRldmljZSB3aXRoIGFuIGV4dGVybmFsIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIGUuZy4geGF3dHYsIHNwY2F2aWV3LCBhbmQgaG9wZSB0aGV5IHBlcnNpc3Qgd2hlbiB4MTF2bmMKLSAgICAgICAgICAgICAgICAgICAgICAgcmUtb3BlbnMgdGhlIGRldmljZS4KLQotICAgICAgICAgICAgICAgICAgICAgICA8c2V0dGluZ3M+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5PXZhbHVlIHBhaXJzLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGV2aWNlJ3MgYnJpZ2h0bmVzcywgY29sb3IsIGNvbnRyYXN0LCBhbmQgaHVlIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gcGVyY2VudGFnZXMsIGUuZy4gYnI9ODAsY289NTAsY249NDQsaHU9NjAuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRldmljZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHRvbyBpZiBuZWVkZWQgKGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN0YXJ0IHdpdGggInZpZGVvIiksIGUuZy4gZm49L2Rldi9xY2FtLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBicHAgb2YgdGhlIGZyYW1lYnVmZmVyIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmlhLCBlLmcuLCB3PTE2MCxoPTEyMCxicHA9MTYuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRlZCB0byB0aGUgYnBwIGFib3ZlLCB0aGUgcGl4ZWwgZm9ybWF0IGNhbiBiZSBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgdmlhIHRoZSBmbXQ9WFhYLCB3aGVyZSBYWFggY2FuIGJlIG9uZSBvZjogR1JFWSwgSEkyNDAsCi0gICAgICAgICAgICAgICAgICAgICAgIFJHQjU1NSwgUkdCNTY1LCBSR0IyNCwgYW5kIFJHQjMyICh3aXRoIGJwcCA4LCA4LCAxNiwgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgIDI0LCBhbmQgMzIgcmVzcGVjdGl2ZWx5KS4gIFNlZSBodHRwOi8vd3d3LmxpbnV4dHYub3JnCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gKFY0TCBhcGkpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciBUVi9yZiB0dW5lciBjYXJkcyBvbmUgY2FuIHNldCB0aGUgdHVuaW5nIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgdmlhIHR1bj1YWFggd2hlcmUgWFhYIGNhbiBiZSBvbmUgb2YgUEFMLCBOVFNDLCBTRUNBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3IgQVVUTy4KLQotICAgICAgICAgICAgICAgICAgICAgICBPbmUgY2FuIHN3aXRjaCB0aGUgaW5wdXQgY2hhbm5lbCBieSB0aGUgaW5wPVhYWCBzZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBYWFggaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGNoYW5uZWwgKFRlbGV2aXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZTEsIFMtVmlkZW8sIGV0YykuICBVc2UgdGhlIG5hbWUgdGhhdCBpcyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB0aGF0IGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgaW5wdXQgY2hhbm5lbHMgd2l0aCB0dW5lcnMgKGUuZy4gVGVsZXZpc2lvbikgb25lCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbiBjaGFuZ2Ugd2hpY2ggc3RhdGlvbiBpcyBzZWxlY3RlZCBieSB0aGUgc3RhPVhYWAotICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLiAgWFhYIGlzIHRoZSBzdGF0aW9uIG51bWJlci4gIEN1cnJlbnRseSBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBudHNjLWNhYmxlLXVzIChVUyBjYWJsZSkgY2hhbm5lbHMgYXJlIGJ1aWx0IGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jLiAgU2VlIHRoZSAtZnJlcXRhYiBvcHRpb24gYmVsb3cgdG8gc3VwcGx5IG9uZQotICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHhhd3R2LiBJZiBYWFggaXMgZ3JlYXRlciB0aGFuIDUwMCwgdGhlbiBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlZCBhcyBhIHJhdyBmcmVxdWVuY3kgaW4gS0h6LgotCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZpZGVvOmJyPTgwLHc9MzIwLGg9MjQwLGZtdD1SR0IzMix0dW49TlRTQyxzdGE9NDcKLQotICAgICAgICAgICAgICAgICAgICAgICBvbmUgbWlnaHQgbmVlZCB0byBhZGQgaW5wPVRlbGV2aXNpb24gdG9vIGZvciB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCB0byBiZSBUViBpZiB0aGUgY2FyZCBkb2Vzbid0IGNvbWUgdXAgYnkgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IG9uZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgbm90IGFsbCB2aWRlbyBjYXB0dXJlIGRldmljZXMgd2lsbCBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbCBvZiB0aGUgYWJvdmUgc2V0dGluZ3MuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSAtcGlwZWlucHV0IFZJRCBvcHRpb24gYmVsb3cgZm9yIGEgd2F5IHRvIGNvbnRyb2wKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNldHRpbmdzIHRocm91Z2ggdGhlIFZOQyBWaWV3ZXIgdmlhIGtleXN0cm9rZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIEFzIGEgc2hvcnRjdXQsIGlmIHRoZSBzdHJpbmcgYmVnaW5zICJWaWRlby4uIiBpbnN0ZWFkCi0gICAgICAgICAgICAgICAgICAgICAgIG9mICJ2aWRlby4uIiB0aGVuIC1waXBlaW5wdXQgVklEIGlzIGltcGxpZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQXMgYWJvdmUsIGlmIHlvdSBzcGVjaWZ5IGEgIkBXeEh4Qi4uLiIgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIDxzZXR0aW5ncz4gc3RyaW5nIHRoZXkgYXJlIHVzZWQgdmVyYmF0aW06IHRoZSBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHF1ZXJpZWQgZm9yIHRoZSBjdXJyZW50IHZhbHVlcy4gIE90aGVyd2lzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdpbGwgYmUgcXVlcmllZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBMSU5VWCBDT05TT0xFOiAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSB3YXlzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXcgYW5kIHBvc3NpYmx5IGludGVyYWN0IHdpdGggdGhlIExpbnV4IHRleHQvZ3JhcGhpY3MKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSAoaS5lLiBub3QgWDExIFhGcmVlODYvWG9yZykKLQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJZiB0aGUgTGliVk5DU2VydmVyIExpbnV4Vk5DIHByb2dyYW0gaXMgb24geW91cgotICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0geW91IG1heSB3YW50IHRvIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZwotICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgYmVjYXVzZSBpdCB3aWxsIGJlIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIExpbnV4IHRleHQgY29uc29sZSBhbmQgaW5jbHVkZXMgbW91c2Ugc3VwcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMsIGhvd2V2ZXIsIHRoZSBiYXNpYyBMaW51eFZOQyBmdW5jdGlvbmFsaXR5IGluCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBpZiB5b3UgcmVwbGFjZSAiY29uc29sZSIgd2l0aCAidnQiIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyBiZWxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmF3ZmIgc3RyaW5nIGJlZ2lucyB3aXRoICJjb25zb2xlIiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgZGV2aWNlIC9kZXYvZmIwIGlzIG9wZW5lZCBhbmQgL2Rldi90dHkwIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCB0b28uICBUaGUgbGF0dGVyIGlzIHVzZWQgdG8gaW5qZWN0IGtleXN0cm9rZXMKLSAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBhbGwgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZSBiYXNpYyBvbmVzIGFyZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gYmUgcm9vdCB0byBpbmplY3Qga2V5c3Ryb2tlcywgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBuZWNlc3NhcmlseSB0byBvcGVuIC9kZXYvZmIwLiAgL2Rldi90dHkwIHJlZmVycyB0bwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZlIFZULCB0byBpbmRpY2F0ZSBvbmUgZXhwbGljaXRseSwgdXNlLCBlLmcuLAotICAgICAgICAgICAgICAgICAgICAgICAiY29uc29sZTIiIGZvciAvZGV2L3R0eTIsIGV0Yy4gYnkgaW5kaWNhdGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgVlQgbnVtYmVyLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgTGludXggZnJhbWVidWZmZXIgZGV2aWNlLCAvZGV2L2ZiMCwgKGZiMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXRjKSB0byBiZSBlbmFibGVkIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgZHJpdmVycyBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGJlIGxvYWRlZC4gIEUuZy4gdmVzYWZiIG9yIHZnYTE2ZmIgYW5kIGFsc28gYnkgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgYm9vdCBwYXJhbWV0ZXIgdmdhPTB4MzAxIChvciAweDMxNCwgMHgzMTcsIGV0Yy4pCi0gICAgICAgICAgICAgICAgICAgICAgIChUaGUgdmdhPS4uLiBtZXRob2QgaXMgdGhlIHByZWZlcnJlZCB3YXk7IHNldCB5b3VyCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmVzIHVwIHRoYXQgd2F5LikgIE90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgJ05vIHN1Y2ggZGV2aWNlJyBlcnJvci4gIFlvdSBjYW4gYWxzbyBsb2FkIGEgTGludXgKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgZHJpdmVyIHNwZWNpZmljIHRvIHlvdXIgbWFrZSBvZiB2aWRlbyBjYXJkCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGZ1bmN0aW9uYWxpdHkuICBPbmNlIHRoZSBtYWNoaW5lIGlzIGJvb3RlZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9mdGVuICdtb2Rwcm9iZScgdGhlIGZiIGRyaXZlciBhcyByb290IHRvIG9idGFpbgotICAgICAgICAgICAgICAgICAgICAgICBhIGZyYW1lYnVmZmVyIGRldmljZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgY2Fubm90IGdldCAvZGV2L2ZiMCB3b3JraW5nIG9uIExpbnV4LCB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIExpbnV4Vk5DIGVtdWxhdGlvbiBtb2RlIGJ5ICItcmF3ZmIgdnROIgotICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBOID0gMSwgLi4uIDYgaXMgdGhlIExpbnV4IFZpcnR1YWwgVGVybWluYWwgKGFrYQotICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGNvbnNvbGUpIHlvdSB3aXNoIHRvIHZpZXcsIGUuZy4gIi1yYXdmYiB2dDIiLgotICAgICAgICAgICAgICAgICAgICAgICBVbmxpa2UgL2Rldi9mYiBtb2RlLCBpdCBuZWVkIG5vdCBiZSB0aGUgYWN0aXZlIFZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgVGVybWluYWwuICBOb3RlIHRoYXQgdGhpcyBtb2RlIGNhbiBvbmx5IHNob3cgdGV4dCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGdyYXBoaWNzLiAgeDExdm5jIHBvbGxzIHRoZSB0ZXh0IGluIC9kZXYvdmNzYU4KLQotICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyLiBSQVdGQl9WQ1NBX0JXPTEgdG8gZGlzYWJsZSBjb2xvcnMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlICJ2dE4iIG1vZGUgKGkuZS4gYmxhY2sgYW5kIHdoaXRlIG9ubHkuKSAgSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmVmZXIgdGhlIGRlZmF1bHQgMTZicHAgc2V0IFJBV0ZCX1ZDU0FfQlBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIDggb3IgMzIuICBJZiB5b3UgbmVlZCB0byB0d2VhayB0aGUgcmF3ZmIgcGFyYW1ldGVycyBieQotICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgJ2NvbnNvbGVfZ3Vlc3MnIHN0cmluZyBwcmludGVkIGF0IHN0YXJ0dXAsCi0gICAgICAgICAgICAgICAgICAgICAgIGJlIHN1cmUgdG8gaW5kaWNhdGUgdGhlIHNuYXA6IG1ldGhvZC4KLQotICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXQ6IElmIHRoZSBMaW51eCB2ZXJzaW9uIGFwcGVhcnMgdG8gYmUgMi42Ci0gICAgICAgICAgICAgICAgICAgICAgIG9yIGxhdGVyIGFuZCB0aGUgInVpbnB1dCIgbW9kdWxlIGFwcGVhcnMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCAobW9kcHJvYmUgdWlucHV0KSwgdGhlbiB0aGUgdWlucHV0IG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAvZGV2L3R0eU4uICB1aW5wdXQgYWxsb3dzCi0gICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbiBvZiBCT1RIIGtleXN0cm9rZXMgYW5kIG1vdXNlIGlucHV0IGFuZCBzbyBpdAotICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQgd2hlbiBhY2Nlc3NpbmcgZ3JhcGhpY2FsIChlLmcuIFFULWVtYmVkZGVkKQotICAgICAgICAgICAgICAgICAgICAgICBsaW51eCBjb25zb2xlIGFwcHMuICBJdCBhbHNvIHByb3ZpZGVzIG1vcmUgYWNjdXJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlIGluc2VydGlvbi4gIFNlZSAtcGlwZWlucHV0IFVJTlBVVCBiZWxvdyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIG1vZGU7IHlvdSB3aWxsIGhhdmUgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIC1waXBlaW5wdXQgaWYgeW91IHdhbnQgdG8gdHdlYWsgYW55IFVJTlBVVCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGFsc28gd2FudCB0byBhbHNvIHVzZSB0aGUgLW5vZHJhZ2dpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIC1jdXJzb3Igbm9uZSBvcHRpb25zLiAgVXNlICJjb25zb2xlMCIsIGV0YyAgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBDT05TT0xFIHRvIGZvcmNlIHRoZSAvZGV2L3R0eU4gbWV0aG9kLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgeW91IGNhbiBjaGFuZ2UgdGhlIExpbnV4IFZUIHJlbW90ZWx5IHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjaHZ0KDEpIGNvbW1hbmQgdG8gbWFrZSB0aGUgb25lIHlvdSB3YW50IGJlIHRoZSBhY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgb25lIChlLmcuICdjaHZ0IDMnKS4gIFNvbWV0aW1lcyBzd2l0Y2hpbmcgb3V0IGFuZCBiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RzIHRoZSBmcmFtZWJ1ZmZlcidzIGdyYXBoaWNzIHN0YXRlLiAgRm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAiLXJhd2ZiIHZ0TiIgbW9kZSB0aGVyZSBpcyBubyBuZWVkIHRvIHN3aXRjaCB0aGUgVlQncy4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBza2lwIGlucHV0IGluamVjdGluZyBlbnRpcmVseSB1c2UgImNvbnNvbGV4IgotICAgICAgICAgICAgICAgICAgICAgICBvciAidnR4Ii4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nICIvZGV2L2ZiMCIgKDEsIGV0Yy4pIGNhbiBiZSB1c2VkIGluc3RlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgImNvbnNvbGUiLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGRldmljZSwgZS5nLiAvZGV2L2ZiMS4gIEFzIGEgc2hvcnRjdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICIvZGV2LyIgY2FuIGJlIGRyb3BwZWQuICBJZiB0aGUgbmFtZSBpcyBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhbmRhcmQsIHVzZSAiY29uc29sZTovZGV2L2Zvb2ZiIgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gZ3Vlc3MgdGhlIGZyYW1lYnVmZmVyJ3MKLSAgICAgICAgICAgICAgICAgICAgICAgV3hIeEIgYW5kIG1hc2tzIGF1dG9tYXRpY2FsbHkgKHNvbWV0aW1lcyB0aGUga2VybmVsCi0gICAgICAgICAgICAgICAgICAgICAgIGdpdmVzIGluY29ycmVjdCBpbmZvcm1hdGlvbiksIHNwZWNpZnkgdGhlbSB3aXRoIGEgQFd4SHhCCi0gICAgICAgICAgICAgICAgICAgICAgIChhbmQgb3B0aW9uYWwgOlIvRy9CIG1hc2tzKSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIC9kZXYvZmIwICAgICAgICAgICAoc2FtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xlMyAgICAgICAgICAgKGZvcmNlIC9kZXYvdHR5MykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xleCAgICAgICAgICAgKG5vIGtleXN0cm9rZXMgb3IgbW91c2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZTovZGV2L25vbnN0ZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIGNvbnNvbGUgLXBpcGVpbnB1dCBVSU5QVVQ6YWNjZWw9NC4wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdnQzICAgICAgICAgICAgICAgICgvZGV2L3R0eTMgdy9vIC9kZXYvZmIwKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFZOQyBIT1NUOiBpZiB0aGUgLXJhd2ZiIHN0cmluZyBpcyBvZiB0aGUgZm9ybQotICAgICAgICAgICAgICAgICAgICAgICAidm5jOmhvc3Q6TiIgdGhlbiB0aGUgVk5DIGRpc3BsYXkgIk4iIG9uIHRoZSByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIHNlcnZlciAiaG9zdCIgaXMgY29ubmVjdGVkIHRvIChpLmUuIHgxMXZuYyBhY3RzIGFzCi0gICAgICAgICAgICAgICAgICAgICAgIGEgVk5DIGNsaWVudCBpdHNlbGYpIGFuZCB0aGF0IGZyYW1lYnVmZmVyIGlzIGV4cG9ydGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBpcyByZWFsbHkgb25seSBvZiB1c2UgaWYgeW91IGFyZSB0cnlpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiB0aGUgY2FzZSBvZiBtYW55IChlLmcuID4KLSAgICAgICAgICAgICAgICAgICAgICAgMTApIHNpbXVsdGFuZW91cyBWTkMgdmlld2VycywgYW5kIHlvdSB0cnkgYSBkaXZpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnF1ZXIgc2NoZW1lIHRvIHJlZHVjZSBiYW5kd2lkdGggYW5kIGltcHJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZW5lc3MuICAoSG93ZXZlciwgYW5vdGhlciB1c2VyIGZvdW5kIHRoaXMgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgdG8gZXhwb3J0IGEgZGVtbyBkaXNwbGF5IHRocm91Z2ggYSBzbG93IGxpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZW4gbXVsdGlwbGUgZGVtbyB2aWV3ZXJzIGNvbm5lY3RlZCB0byB0aGUgcmVmbGVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgb24gdGhlIGZhc3Qgc2lkZSBvZiB0aGUgbGluaywgYW5kIHNvIGF2b2lkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgYWxsIG9mIHRoZSBkZW1vIHZpZXdlcnMgZ29pbmcgdGhyb3VnaCB0aGUgc2xvdyBsaW5rLikKLQotICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgd2lsbCBiZSA2NCBzaW11bHRhbmVvdXMgVk5DCi0gICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMgdGhpcyBjYW4gbGVhZCB0byBhIGxvdCBvZiByZWR1bmRhbnQgVk5DIHRyYWZmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYW5kIGZyb20gdGhlIHNlcnZlciBob3N0Ok4sIGV4dHJhIENQVSB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsbCB2aWV3ZXJzIHJlc3BvbnNlIGNhbiBiZSByZWR1Y2VkIGJ5IGhhdmluZwotICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvciB3cml0ZXMgdG8gdGhlIHNsb3dlc3QgY2xpZW50IHRvIGZpbmlzaC4KLSAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgeW91IHNldCB1cCA4IHJlZmxlY3RvcnMvcmVwZWF0ZXJzIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcHRpb24gLXJhd2ZiIHZuYzpob3N0Ok4sIHRoZW4gdGhlcmUgYXJlIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgOCBjb25uZWN0aW9ucyB0byBob3N0Ok4uICBFYWNoIHJlcGVhdGVyIHRoZW4gaGFuZGxlcwotICAgICAgICAgICAgICAgICAgICAgICA4IHZuYyB2aWV3ZXIgY29ubmVjdGlvbnMgdGhlcmVieSBzcHJlYWRpbmcgdGhlIGxvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kLiAgSW4gY2xhc3Nyb29tIGJyb2FkY2FzdCB1c2FnZSwgdHJ5IHRvIHB1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZXJzIG9uIGRpZmZlcmVudCBzd2l0Y2hlcy4gIFRoaXMgbW9kZSBpcyB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICBhcyAtcmVmbGVjdCBob3N0Ok4uICBSZXBsYWNlICJob3N0Ok4iIGJ5ICJsaXN0ZW4iCi0gICAgICAgICAgICAgICAgICAgICAgIG9yICJsaXN0ZW46cG9ydCIgZm9yIGEgcmV2ZXJzZSBjb25uZWN0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgcGVyZm9ybWFuY2Ugd2lsbCBub3QgYmUgYXMgZ29vZCBhcyBhIHNpbmdsZQotICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3QgY29ubmVjdGlvbiBiZWNhdXNlLCBhbW9uZyBvdGhlciB0aGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgbGV2ZWwgb2YgZnJhbWVidWZmZXIgcG9sbGluZwotICAgICAgICAgICAgICAgICAgICAgICBhbmQgcG9pbnRlciBtb3Rpb24gY2FuIHN0aWxsIGluZHVjZSBtYW55IGNoYW5nZXMgcGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCB0aGF0IG11c3QgYmUgcHJvcGFnYXRlZC4gIFRpcDogaWYgdGhlIHJlbW90ZSBWTkMKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgeDExdm5jIGRvaW5nIHdpcmVmcmFtaW5nLCBvciBhbiBYIGRpc3BsYXkgdGhhdCBkb2VzCi0gICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtaW5nIHRoYXQgZ2l2ZXMgbXVjaCBiZXR0ZXIgcmVzcG9uc2UgdGhhbiBvcGFxdWUKLSAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IGRyYWdnaW5nLiAgQ29uc2lkZXIgdGhlIC1ub2RyYWdnaW5nIG9wdGlvbiBpZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvYmxlbSBpcyBzZXZlcmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVudi4gdmFyLiBYMTFWTkNfUkVGTEVDVF9QQVNTV09SRCBjYW4gYmUgc2V0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXNzd29yZCBuZWVkZWQgdG8gbG9nIGludG8gdGhlIHZuYyBob3N0IHNlcnZlciwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gImZpbGU6cGF0aF90b19maWxlIiB0byBpbmRpY2F0ZSBhIGZpbGUgY29udGFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc3dvcmQgYXMgaXRzIGZpcnN0IGxpbmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gc2V0IHRoZSBwaXhlbCBmb3JtYXQgdGhhdCB4MTF2bmMgcmVxdWVzdHMgYXMgYSBWTkMKLSAgICAgICAgICAgICAgICAgICAgICAgQ0xJRU5UIHNldCB0aGUgZW52LiB2YXJzOiBYMTFWTkNfUkVGTEVDVF9iaXRzUGVyU2FtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19SRUZMRUNUX3NhbXBsZXNQZXJQaXhlbCwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19SRUZMRUNUX2J5dGVzUGVyUGl4ZWw7IHRoZSBkZWZhdWx0cyBhcmUgOCwgMywgNC4KLSAgICAgICAgICAgICAgICAgICAgICAgMiwgMywgMSB3b3VsZCBnaXZlIGEgbG93IGNvbG9yIG1vZGUuICBTZWUgdGhlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgIHJmYkdldENsaWVudCgpIGluIGxpYnZuY2NsaWVudCBmb3IgbW9yZSBpbmZvLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTkMgSE9TVCBtb2RlIGltcGxpZXMgLXNoYXJlZC4gIFVzZSAtbm9zaGFyZWQgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgYSBzdWJzZXF1ZW50IGNtZGxpbmUgb3B0aW9uIHRvIGRpc2FibGUgc2hhcmluZy4KLQotLWZyZXF0YWIgZmlsZSAgICAgICAgICBGb3IgdXNlIHdpdGggIi1yYXdmYiB2aWRlbyIgZm9yIFRWIHR1bmVyIGRldmljZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBzdGF0aW9uIGZyZXF1ZW5jaWVzLiAgSW5zdGVhZCBvZiB1c2luZyB0aGUgYnVpbHQKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gbnRzYy1jYWJsZS11cyBtYXBwaW5nIG9mIHN0YXRpb24gbnVtYmVyIHRvIGZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSBkYXRhIGluIGZpbGUuICBGb3Igc3RhdGlvbnMgdGhhdCBhcmUgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMsIGUuZy4gU0UyMCwgdGhleSBhcmUgcGxhY2VkIGFib3ZlIHRoZSBoaWdoZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkIHN0YXRpb24gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGZvdW5kLiAgRXhhbXBsZToKLSAgICAgICAgICAgICAgICAgICAgICAgIi1mcmVxdGFiIC91c3IvWDExUjYvc2hhcmUveGF3dHYvZXVyb3BlLXdlc3QubGlzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBtYWtlIHlvdXIgb3duIGZyZXF0YWIgYnkgY29weWluZyB0aGUgeGF3dHYKLSAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LgotCi0tcGlwZWlucHV0IGNtZCAgICAgICAgIFRoaXMgb3B0aW9uIGxldHMgeW91IHN1cHBseSBhbiBleHRlcm5hbCBjb21tYW5kIGluCi0gICAgICAgICAgICAgICAgICAgICAgICJjbWQiIHRoYXQgeDExdm5jIHdpbGwgcGlwZSBhbGwgb2YgdGhlIHVzZXIgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHRvIGluIGEgc2ltcGxlIGZvcm1hdC4gIEluIC1waXBlaW5wdXQgbW9kZSBieQotICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHgxMXZuYyB3aWxsIG5vdCBwcm9jZXNzIGFueSBvZiB0aGUgdXNlciBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuICBJZiB5b3UgcHJlZml4ICJjbWQiIHdpdGggInRlZToiIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgYm90aCBzZW5kIHRoZW0gdG8gdGhlIHBpcGUgY29tbWFuZCBhbmQgcHJvY2VzcyB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0IHJ1biAiLXBpcGVpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICB0ZWU6L2Jpbi9jYXQiLiAgQW5vdGhlciBwcmVmaXggaXMgInJlb3BlbiIgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdG8gcmVvcGVuIHBpcGUgaWYgaXQgZXhpdHMuICBTZXBhcmF0ZSBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcyB3aXRoIGNvbW1hcy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJbiBjb21iaW5hdGlvbiB3aXRoIC1yYXdmYiBvbmUgbWlnaHQgYmUgYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAgICBkbyBhbXVzaW5nIHRoaW5ncyAoZS5nLiBjb250cm9sIG5vbi1YIGRldmljZXMpLgotICAgICAgICAgICAgICAgICAgICAgICBUbyBmYWNpbGl0YXRlIHRoaXMsIGlmIC1yYXdmYiBpcyBpbiBlZmZlY3QgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGluIFgxMVZOQ19SQVdGQl9TVFIgZm9yIHRoZSBwaXBlIGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGlmIGl0IHdhbnRzLiBEbyAnZW52IHwgZ3JlcCBYMTFWTkMnIGZvciBtb3JlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0LWluIHBpcGVpbnB1dCBtb2RlcyAobm8gZXh0ZXJuYWwgcHJvZ3JhbSByZXF1aXJlZCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgY21kIGlzICJWSUQiIGFuZCB5b3UgYXJlIHVzaW5nIHRoZSAtcmF3ZmIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gY2FwdHVyZSBkZXZpY2UsIHRoZW4gYW4gaW50ZXJuYWwgbGlzdCBvZiBrZXlib2FyZAotICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyBpcyB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIG9mIHRoZSB2aWRlby4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1hcHBpbmdzIGFyZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICJCIiBhbmQgImIiIGFkanVzdCB0aGUgYnJpZ2h0bmVzcyB1cCBhbmQgZG93bi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAiSCIgYW5kICJoIiBhZGp1c3QgdGhlIGh1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAiQyIgYW5kICJjIiBhZGp1c3QgdGhlIGNvbG91ci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAiTiIgYW5kICJuIiBhZGp1c3QgdGhlIGNvbnRyYXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICJTIiBhbmQgInMiIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY2FwdHVyZSBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkkiIGFuZCAiaSIgY3ljbGUgdGhyb3VnaCBpbnB1dCBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBVcCBhbmQgRG93biBhcnJvd3MgYWRqdXN0IHRoZSBzdGF0aW9uIChpZiBhIHR1bmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgIEYxLCBGMiwgLi4uLCBGNiB3aWxsIHN3aXRjaCB0aGUgdmlkZW8gY2FwdHVyZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCB0byBISTI0MCwgUkdCNTY1LCBSR0IyNCwgUkdCMzIsIFJHQjU1NSwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgR1JFWSByZXNwZWN0aXZlbHkuICBTZWUgLXJhd2ZiIHZpZGVvIGZvciBkZXRhaWxzLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGNtZCBpcyAiQ09OU09MRSIgb3IgIkNPTlNPTEVuIiB3aGVyZSBuCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGEgTGludXggY29uc29sZSBudW1iZXIsIHRoZW4gdGhlIGxpbnV4IGNvbnNvbGUKLSAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlIGluc2VydGlvbiB0byAvZGV2L3R0eU4gKHNlZSAtcmF3ZmIgY29uc29sZSkKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcGVyZm9ybWVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGNtZCBiZWdpbnMgd2l0aCAiVUlOUFVUIiB0aGVuIHRoZSBMaW51eCB1aW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGlzIHVzZWQgdG8gaW5zZXJ0IGJvdGgga2V5c3Ryb2tlIGFuZCBtb3VzZSBldmVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIExpbnV4IGNvbnNvbGUgKHNlZSAtcmF3ZmIgYWJvdmUpLiAgVGhpcyB1c3VhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSAvZGV2L2lucHV0L3VpbnB1dCBkZXZpY2UgZmlsZSAoeW91IG1heSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSBpdCB3aXRoICJta25vZCAvZGV2L2lucHV0L3VpbnB1dCBjIDEwIDIyMyIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluc2VydCB0aGUgbW9kdWxlIHdpdGggIm1vZHByb2JlIHVpbnB1dCIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVJTlBVVCBtb2RlIGN1cnJlbnRseSBvbmx5IGRvZXMgVVMga2V5Ym9hcmRzIChhCi0gICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29kZSBvcHRpb24gbWF5IGJlIGFkZGVkKSwgYW5kIG5vdCBhbGwga2V5c3ltcwotICAgICAgICAgICAgICAgICAgICAgICBhcmUgc3VwcG9ydGVkLiAgQnV0IGl0IGlzIHByb2JhYmx5IG1vcmUgYWNjdXJhdGUgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgIkNPTlNPTEUiIG1ldGhvZC4KLQotICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IHdhbnQgdG8gdXNlIHRoZSBvcHRpb25zIC1jdXJzb3Igbm9uZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgLW5vZHJhZ2dpbmcgaW4gdGhpcyBtb2RlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgdHVuaW5nIG9wdGlvbnMgbWF5IGJlIHN1cHBsaWVkIHZpYToKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOUFVUOm9wdDEsb3B0MiwuLi4gKGEgY29tbWEgc2VwYXJhdGVkIGxpc3QpLiBJZiBhbgotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gYmVnaW5zIHdpdGggIi8iIGl0IGlzIHRha2VuIGFzIHRoZSB1aW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGZpbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgV2hpY2ggdWlucHV0IGlzIGluamVjdGVkIGNhbiBiZSBjb250cm9sbGVkIGJ5IGFuIG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFkZSBvZiB0aGUgY2hhcmFjdGVycyAiSyIsICJNIiwgYW5kICJCIgotICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSAtaW5wdXQgb3B0aW9uKSwgZS5nLiAiS00iIGFsbG93cyBrZXlzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIG1vdGlvbiBidXQgbm90IGJ1dHRvbiBjbGlja3MuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQSBVSU5QVVQgb3B0aW9uIG9mIHRoZSBmb3JtOiBhY2NlbD1mLCBvciBhY2NlbD1meCtmeQotICAgICAgICAgICAgICAgICAgICAgICBzZXRzIHRoZSBtb3VzZSBtb3Rpb24gImFjY2VsZXJhdGlvbiIuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gY29ycmVjdCByYXcgbW91c2UgcmVsYXRpdmUgbW90aW9uIGludG8gaG93IG11Y2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGN1cnNvciBtb3ZlcyAoeDExdm5jIGhhcyBubyBjb250cm9sIG92ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGtub3dsZWRnZSBvZiBob3cgdGhlIHdpbmRvd2luZyBhcHBsaWNhdGlvbiBpbnRlcnByZXRzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSByYXcgbW91c2UgbW90aW9ucykuICBUeXBpY2FsbHkgdGhlIGFjY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gWCBkaXNwbGF5IGlzIDIgKHNlZSB4c2V0ICJtIiBvcHRpb24pLiAgImYiCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlLmcuIDMuMC4gIFVzZSAiZngrZnkiCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBuZWVkIHRvIHN1cHBseSBkaWZmZXJlbnQgY29ycmVjdGlvbnMgZm9yIHggYW5kIHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgYWNjZWxlcmF0aW9uIGlzIDIuMCBzaW5jZSBpdCBzZWVtcwotICAgICAgICAgICAgICAgICAgICAgICBib3RoIFggYW5kIHF0LWVtYmVkZGVkIG9mdGVuIChidXQgbm90IGFsd2F5cykgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXZlbiB3aXRoIGEgY29ycmVjdCBhY2NlbCBzZXR0aW5nIHRoZSBtb3VzZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGdldCBvdXQgb2Ygc3luYyAocHJvYmFibHkgZHVlIHRvIGEgbW91c2UKLSAgICAgICAgICAgICAgICAgICAgICAgInRocmVzaG9sZCIgc2V0dGluZyB3aGVyZSB0aGUgYWNjZWxlcmF0aW9uIGRvZSBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgYXBwbHksIHNldCB4c2V0KDEpKS4gIFRoZSBvcHRpb24gcmVzZXQ9TiBzZXRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgbXMgKGRlZmF1bHQgMTUwKSBhZnRlciB3aGljaCB0aGUgY3Vyc29yIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZCB0byBiZSByZXNldCAoYnkgZm9yY2luZyB0aGUgbW91c2UgdG8gKDAsCi0gICAgICAgICAgICAgICAgICAgICAgIDApIHZpYSBzbWFsbCBpbmNyZW1lbnRzIGFuZCB0aGVuIGJhY2sgb3V0IHRvICh4LCB5KQotICAgICAgICAgICAgICAgICAgICAgICBpbiAxIGp1bXApLCBUaGlzIGNvcnJlY3Rpb24gc2VlbXMgdG8gYmUgbmVlZGVkIGJ1dCBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgamVya2luZXNzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2l0aCBtZW51cywgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICBVc2UgcmVzZXQ9MCB0byBkaXNhYmxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19VSU5QVVRfVEhSRVNIT0xEUyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlc2g9biBtb2RlIHdpbGwgYmUgZW5hYmxlZC4gIEl0IGlzIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICBub3Qgd29ya2luZyB3ZWxsLiAgSWYgfGR4fCA8PSB0aHJlc2ggYW5kIHxkeXwgPCB0aHJlc2gKLSAgICAgICAgICAgICAgICAgICAgICAgbm8gYWNjZWxlcmF0aW9uIGlzIGFwcGxpZWQuICBVc2UgInRocmVzaD0rbiIgfGR4fCArCi0gICAgICAgICAgICAgICAgICAgICAgIHxkeXwgPCB0aHJlc2ggdG8gYmUgdXNlZCBpbnN0ZWFkIChYMTE/KQotCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtcGlwZWlucHV0IFVJTlBVVDphY2NlbD00LjAgLWN1cnNvciBub25lCi0KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHVpbnB1dCBkZXZpY2UgaGFzIGFuIGFic29sdXRlIHBvaW50ZXIgKGFzIG9wcG9zZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBub3JtYWwgbW91c2UgdGhhdCBpcyBhIHJlbGF0aXZlIHBvaW50ZXIpIHlvdSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgb3B0aW9uICJhYnMiLiAgTm90ZSB0aGF0IGEgdG91Y2hwYWQKLSAgICAgICAgICAgICAgICAgICAgICAgb24gYSBsYXB0b3AgaXMgYW4gYWJzb2x1dGUgZGV2aWNlIHRvIHNvbWUgZGVncmVlLgotICAgICAgICAgICAgICAgICAgICAgICBUaGlzICh1c3VhbGx5KSBhdm9pZHMgYWxsIHRoZSBwcm9ibGVtcyB3aXRoIG1vdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbi4gIElmIHgxMXZuYyBoYXMgdHJvdWJsZSBkZWR1Y2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiB0aGUgZGV2aWNlLCB1c2UgImFicz1XeEgiLiAgRnVydGhlcm1vcmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBkZXZpY2UgaXMgYSB0b3VjaHNjcmVlbiAoYXNzdW1lZCB0byBoYXZlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlIHBvaW50ZXIpIHVzZSAidG91Y2giIG9yICJ0b3VjaD1XeEgiLgotICAgICAgICAgICAgICAgICAgICAgICBGb3IgdG91Y2hzY3JlZW5zLCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGEgcHJlc3N1cmUgaW5jcmVhc2UgaXMgaW5qZWN0ZWQsIGFuZCB3aGVuIHRoZSBidXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVsZWFzZWQgYSBwcmVzc3VyZSBvZiB6ZXJvIGlzIGluamVjdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHRvdWNoIGhhcyBiZWVuIHNldCwgdXNlICJ0b3VjaF9hbHdheXM9MSIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgd2hlbmV2ZXIgdGhlIG1vdXNlIG1vdmVzIHdpdGggbm8gYnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgIHByZXNzZWQsIGEgdG91Y2ggZXZlbnQgb2YgemVybyBwcmVzc3VyZSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgc2VudCBhbnl3YXkuICBBbHNvIHVzZSAiYnRuX3RvdWNoPTEiIHRvIGluZGljYXRlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgQlROX1RPVUNIIGtleXN0cm9rZSBwcmVzcyBvciByZWxlYXNlIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBwcmVzc3VyZSBjaGFuZ2UuICBTZXQgImRyYWdza2lwPW4iIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIHNraXAgbiBkcmFnZ2VkIG1vdXNlIHRvdWNoZXMgKHdpdGggcHJlc3N1cmUgYXBwbGllZCkKLSAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGluamVjdGluZyBvbmUuICBUbyBpbmRpY2F0ZSB0aGUgcHJlc3N1cmUgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2VudCB3aGVuIHRoZXJlIGlzIGEgYnV0dG9uIGNsaWNrIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgIHRvdWNoc2NyZWVuIGRldmljZSwgc3BlY2lmeSBwcmVzc3VyZT1uLCBlLmcuIG49NS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgbj0xLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIGEgdG91Y2ggc2NyZWVuIGlzIGJlaW5nIHVzZWQgKCJ0b3VjaCIgYWJvdmUpCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdCBpcyBoYXZpbmcgaXRzIGlucHV0IHByb2Nlc3NlZCBieSB0c2xpYiwgeW91IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSB0c2xpYiBjYWxpYnJhdGlvbiBmaWxlIHZpYSB0c2xpYl9jYWw9PGZpbGU+LgotICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdHNsaWJfY2FsPS9ldGMvcG9pbnRlcmNhbC4gIFRvIGdldCBhY2N1cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICBvciBldmVuIHVzYWJsZSBwb3NpdGlvbmluZyB0aGlzIGlzIHJlcXVpcmVkIHdoZW4gdHNsaWIKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdXNlLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBMaW51eCB1aW5wdXQgbWVjaGFuaXNtIGNhbiBiZSBieXBhc3NlZCBhbmQgb25lIGNhbgotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBpbnB1dCBldmVudHMgRElSRUNUTFkgdG8gdGhlIGRldmljZXMgaW5zdGVhZC4KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gZG8gdGhpcywgc3BlY2lmeSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgaW5wdXQgY2xhc3NlczogZGlyZWN0X3JlbD08ZGV2aWNlPgotICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfYWJzPTxkZXZpY2U+IGRpcmVjdF9idG49PGRldmljZT4gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2tleT08ZGV2aWNlPi4gIFRoZSA8ZGV2aWNlPiBmaWxlIGlzIHVzdWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIGxpa2UgL2Rldi9pbnB1dC9ldmVudDEgYnV0IHlvdSBjYW4gc3BlY2lmeQotICAgICAgICAgICAgICAgICAgICAgICBhbnkgZGV2aWNlIGZpbGUgb3IgcGlwZS4gIFlvdSBtdXN0IHNwZWNpZnkgZWFjaCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFib3ZlIGNsYXNzZXMgZXZlbiBpZiB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGV2aWNlIGZpbGUgKHJlbC9hYnMgYW5kIGJ0biBhcmUgb2Z0ZW4gdGhlIHNhbWUuKQotICAgICAgICAgICAgICAgICAgICAgICBMb29rIGF0IHRoZSBmaWxlIC9wcm9jL2J1cy9pbnB1dC9kZXZpY2VzIHRvIGdldCBhbiBpZGVhCi0gICAgICAgICAgICAgICAgICAgICAgIHdoYXQgaXMgYXZhaWxhYmxlIGFuZCB0aGUgZGV2aWNlIGZpbGVuYW1lcy4gIE5vdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgIFRoZSAvZGV2L2lucHV0L21vdXNlKiBkZXZpY2VzIGRvIG5vdCBzZWVtIHRvIHdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgY29ycmVzcG9uZGluZyAvZGV2L2lucHV0L2V2ZW50KiBmaWxlIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgICAgICAgIEFueSBpbnB1dCBjbGFzcyBub3QgZGlyZWN0bHkgc3BlY2lmaWVkIGFzIGFib3ZlIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCB2aWEgdGhlIHVpbnB1dCBtZWNoYW5pc20uICBUbyBkaXNhYmxlIGNyZWF0aW5nIGEKLSAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0IGRldmljZSAoYW5kIHRoZXJlYnkgZGlzY2FyZGluZyB1bmhhbmRsZWQgaW5wdXQpLAotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5ICJub3VpbnB1dCIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAtcGlwZWlucHV0IFVJTlBVVDpkaXJlY3RfYWJzPS9kZXYvaW5wdXQvZXZlbnQxCi0KLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3YXMgdXNlZCBvbiBhIHF0bW9rbyBOZW8gZnJlZXJ1bm5lciAoYXJtZWwpOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBVSU5QVVQ6dG91Y2gsdHNsaWJfY2FsPS9ldGMvcG9pbnRlcmNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MSxub3VpbnB1dCxkcmFnc2tpcD00Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlIHRoZSBsb25nIGxpbmUgaGFzIGJlZW4gc3BsaXQgaW50byB0d28uKQotCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2V0IHRoZSBlbnYuIHZhciBYMTFWTkNfVUlOUFVUX0RFQlVHPTEgb3IgaGlnaGVyCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGdldCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciBVSU5QVVQgbW9kZS4KLQotLW1hY25vZGltICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkaXNhYmxlIGRpbW1pbmcuCi0tbWFjbm9zbGVlcCAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgZGlzcGxheSBzbGVlcC4KLS1tYWNub3NhdmVyICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZGlzYWJsZSBzY3JlZW5zYXZlci4KLS1tYWNub3dhaXQgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHdhaXQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRvIHN3aXRjaCBiYWNrIHRvIGhpcyBkaXNwbGF5LgotLW1hY3doZWVsIG4gICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBzZXQgdGhlIG1vdXNlIHdoZWVsCi0gICAgICAgICAgICAgICAgICAgICAgIHNwZWVkIHRvIG4gKGRlZmF1bHQgNSkuCi0tbWFjbm9zd2FwICAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCBzd2FwIG1vdXNlCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgMiBhbmQgMy4KLS1tYWNub3Jlc2l6ZSAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHJlc2l6ZSBvciByZXNldAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVidWZmZXIgZXZlbiBpZiBpdCBpcyBkZXRlY3RlZCB0aGF0IHRoZSBzY3JlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvciBkZXB0aCBoYXMgY2hhbmdlZC4KLS1tYWNpY29uYW5pbSBuICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgc2V0IG4gdG8gdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgd2luZG93IGljb25pZnkvZGVpY29uaWZ5Ci0gICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbiB0YWtlcy4gIEluIC1uY2FjaGUgbW9kZSB0aGlzIHZhbHVlIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBza2lwIHRoZSBhbmltYXRpb24gaWYgcG9zc2libGUuIChkZWZhdWx0IDQwMCkKLS1tYWNtZW51ICAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgaW4gLW5jYWNoZSBjbGllbnQtc2lkZQotICAgICAgICAgICAgICAgICAgICAgICBjYWNoaW5nIG1vZGUsIHRyeSB0byBjYWNoZSBwdWxsIGRvd24gbWVudXMgKG5vdCBwZXJmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhleSBoYXZlIGFuaW1hdGVkIGZhZGVzLCBldGMuKQotLW1hY3Vza2JkICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCB1c2UgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZSBpbnNlcnRpb24gY29kZSBiYXNlZCBvbiBhIFVTIGtleWJvYXJkLgotLW1hY25vb3BlbmdsICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkbyBub3QgdXNlIE9wZW5HTCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIGNhcHR1cmUsIGJ1dCByYXRoZXIgdXNlIHRoZSBvcmlnaW5hbCwgZGVwcmVjYXRlZAotICAgICAgICAgICAgICAgICAgICAgICByYXcgbWVtb3J5IGFjY2VzcyBtZXRob2Q6IGFkZHIgPSBDR0Rpc3BsYXlCYXNlQWRkcmVzcygpLgotLW1hY25vcmF3ZmIgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkaXNhYmxlIHRoZSByYXcgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2NyZWVuIGNhcHR1cmUgbWV0aG9kLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE1BQ09TWCBOT1RFOiBUaGVyZSBhcmUgc29tZSBkZXByZWNhdGVkIE1hY09TWCBpbnRlcmZhY2VzCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGluamVjdCBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGFuZCB0aGUgcmF3IG1lbW9yeQotICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYXMgd2VsbCAoaG93ZXZlciwgT3BlbkdMCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcHJlZmVycmVkIGlmIGF2YWlsYWJsZSBiZWNhdXNlIGl0IGlzIGZhc3Rlci4pCi0gICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYW4gZm9yY2Ugbm90IHVzaW5nIGFueSBkZXByZWNhdGVkIGludGVyZmFjZXMgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSB0aW1lIGJ5IHNldHRpbmcgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQ9MQotICAgICAgICAgICAgICAgICAgICAgICBpbiBDUFBGTEFHUy4gIE9yIHRvIHR1cm4gdGhlbSBvZmYgb25lIGJ5IG9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MSwKLSAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUz0xIG9yCi0gICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0ZSQU1FQlVGRkVSPTEKLSAgICAgICAgICAgICAgICAgICAgICAgQXQgcnVuIHRpbWUsIGZvciB0ZXN0aW5nIGFuZCB3b3JrYXJvdW5kcywgb25lIGNhbgotICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlIHRoZW0gYnkgdXNpbmc6Ci0gICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEPTEKLSAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MQotICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTPTEgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfRlJBTUVCVUZGRVI9MQotICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIGRvaW5nIGVpdGhlciBvZiB0aGVzZSBmb3IgdGhlIG1vdXNlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBldmVyeXRoaW5nIHdvcmtzIGN1cnJlbnRseSwgZS5nLiBkb3VibGUgY2xpY2tzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWluZy4gIEFsc28sIHNjcmVlbiByZXNvbHV0aW9uIGFuZCBwaXhlbCBkZXB0aAotICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdW5sZXNzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkIGZyYW1lYnVmZmVyIGludGVyZmFjZXMgYXJlIGFsbG93ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgaWYgeW91IGFyZSBjb21waWxpbmcgb24gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgb2xkZXIgbWFjaGluZSB0aGF0IGRvZXMgbm90IGhhdmUgc29tZSBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV3ZXIgaW50ZXJmYWNlcywgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkKLSAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVTQ1JPTExXSEVFTEVWRU5UCi0gICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX01BQ09TWF9OT19DR0VWRU5UQ1JFQVRFTU9VU0VFVkVOVCBvcgotICAgICAgICAgICAgICAgICAgICAgICAtRFgxMVZOQ19NQUNPU1hfTk9fQ0dFVkVOVENSRUFURUtFWUJPQVJERVZFTlQuICBVc2UKLSAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX1VTRV9HRVRNQUlOREVWSUNFIHRvIHJlZ2FpbiB0aGUgdmVyeQotICAgICAgICAgICAgICAgICAgICAgICBvbGQgUXVpY2tEcmF3IEdldE1haW5EZXZpY2UoKSBpbnRlcmZhY2UgKHJhcmUuLi4pCi0KLS1ndWkgW2d1aS1vcHRzXSAgICAgICAgU3RhcnQgdXAgYSBzaW1wbGUgdGNsL3RrIGd1aSBiYXNlZCBvbiB0aGUgcmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgb3B0aW9ucyAtcmVtb3RlLy1xdWVyeSBkZXNjcmliZWQgYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzIHRoZSAid2lzaCIgcHJvZ3JhbSB0byBiZSBpbnN0YWxsZWQgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUuICAiZ3VpLW9wdHMiIGlzIG5vdCByZXF1aXJlZDogdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gc3RhcnQgdXAgYm90aCB0aGUgZnVsbCBndWkgYW5kIHgxMXZuYyB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBndWkgc2hvd2luZyB1cCBvbiB0aGUgWCBkaXNwbGF5IGluIHRoZSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBESVNQTEFZLgotCi0gICAgICAgICAgICAgICAgICAgICAgICJndWktb3B0cyIgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMuCi0gICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBhcmUgdGhlc2UgdHlwZXMgb2YgaXRlbXM6IDEpIGEgZ3VpCi0gICAgICAgICAgICAgICAgICAgICAgIG1vZGUsIGEgMikgZ3VpICJzaW1wbGljaXR5IiwgMykgdGhlIFggZGlzcGxheSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZ3VpIHNob3VsZCBkaXNwbGF5IG9uLCA0KSBhICJ0cmF5IiBvciAiaWNvbiIgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kIDUpIGEgZ3VpIGdlb21ldHJ5LgotCi0gICAgICAgICAgICAgICAgICAgICAgIDEpIFRoZSBndWkgbW9kZSBjYW4gYmUgInN0YXJ0IiwgImNvbm4iLCBvciAid2FpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0IiBpcyB0aGUgZGVmYXVsdCBtb2RlIGFib3ZlIGFuZCBpcyBub3QgcmVxdWlyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICJjb25uIiBtZWFucyBkbyBub3QgYXV0b21hdGljYWxseSBzdGFydCB1cCB4MTF2bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbnN0ZWFkIGp1c3QgdHJ5IHRvIGNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuICAid2FpdCIgbWVhbnMganVzdCBzdGFydCB0aGUgZ3VpIGFuZCBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UgKHlvdSB3aWxsIGxhdGVyIGluc3RydWN0IHRoZSBndWkgdG8gc3RhcnQgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIGNvbm5lY3QgdG8gYW4gZXhpc3Rpbmcgb25lLikKLQotICAgICAgICAgICAgICAgICAgICAgICAyKSBUaGUgZ3VpIHNpbXBsaWNpdHkgaXMgb2ZmIGJ5IGRlZmF1bHQgKGEgcG93ZXItdXNlcgotICAgICAgICAgICAgICAgICAgICAgICBndWkgd2l0aCBhbGwgb3B0aW9ucyBpcyBwcmVzZW50ZWQpIFRvIHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIGxlc3MgZGF1bnRpbmcgc3VwcGx5IHRoZSBzdHJpbmcgInNpbXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgKCJleiIgaXMgYW4gYWxpYXMgZm9yIHRoaXMpLiAgT25jZSB0aGUgZ3VpIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgeW91IGNhbiB0b2dnbGUgYmV0d2VlbiB0aGUgdHdvIHdpdGggIk1pc2MgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX2d1aSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgMykgTm90ZSB0aGUgcG9zc2libGUgY29uZnVzaW9uIHJlZ2FyZGluZyB0aGUgcG90ZW50aWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgdHdvIGRpZmZlcmVudCBYIGRpc3BsYXlzOiB4MTF2bmMgcG9sbHMgb25lLCBidXQgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgIG1heSB3YW50IHRoZSBndWkgdG8gYXBwZWFyIG9uIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IHNzaCBpbiBhbmQgeDExdm5jIGlzIG5vdCBydW5uaW5nIHlldCB5b3UgbWF5IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGd1aSB0byBjb21lIGJhY2sgdG8geW91IHZpYSB5b3VyIHNzaCByZWRpcmVjdGVkIFgKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSAoZS5nLiBsb2NhbGhvc3Q6MTApLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGd1aSBYIGRpc3BsYXkgaW4gImd1aS1vcHRzIgotICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCAtZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gYXJlIHRyaWVkIChpbiB0aGF0IG9yZGVyKS4gIFJlZ2FyZGluZyB0aGUgeDExdm5jCi0gICAgICAgICAgICAgICAgICAgICAgIFggZGlzcGxheSB0aGUgZ3VpIHdpbGwgdHJ5IHRvIGNvbW11bmljYXRpb24gd2l0aCwgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdHJpZXMgLWRpc3BsYXkgYW5kIHRoZW4gRElTUExBWS4gIEZvciBleGFtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1kaXNwbGF5IDowIC1ndWkgb3RoZXJob3N0OjAiLCB3aWxsIHJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGFuIHgxMXZuYyBwb2xsaW5nIDowIGFuZCBkaXNwbGF5IHRoZSBndWkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJob3N0OjAgVGhlICJ0cmF5L2ljb24iIG1vZGUgYmVsb3cgcmV2ZXJzZXMgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlLCBwcmVmZXJyaW5nIHRvIGRpc3BsYXkgb24gdGhlIHgxMXZuYyBkaXNwbGF5LgotCi0gICAgICAgICAgICAgICAgICAgICAgIDQpIFdoZW4gInRyYXkiIG9yICJpY29uIiBpcyBzcGVjaWZpZWQsIHRoZSBndWkKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudHMgaXRzZWxmIGFzIGEgc21hbGwgaWNvbiB3aXRoIGJlaGF2aW9yIHR5cGljYWwKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgYSAic3lzdGVtIHRyYXkiIG9yICJkb2NrIGFwcGxldCIuICBUaGUgY29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGljb24gaW5kaWNhdGVzIHN0YXR1cyAoY29ubmVjdGVkIGNsaWVudHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbHNvIGEgYmFsbG9vbiBzdGF0dXMuICBDbGlja2luZyBvbiB0aGUgaWNvbgotICAgICAgICAgICAgICAgICAgICAgICBnaXZlcyBhIG1lbnUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzLCBldGMsIGNhbiBiZSBzZXQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdWxsIGd1aSBpcyBhdmFpbGFibGUgdW5kZXIgIkFkdmFuY2VkIi4gIFRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IGZ1bmN0aW9uYWwsIHRoZSBndWkgbW9kZSBzaG91bGQgYmUgInN0YXJ0IgotICAgICAgICAgICAgICAgICAgICAgICAodGhlIGRlZmF1bHQpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0cmF5IG9yIGljb24gbW9kZSB3aWxsIGltcGx5IHRoZSAtZm9yZXZlcgotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgb3B0aW9uIChpZiB0aGUgeDExdm5jIHNlcnZlciBpcyBzdGFydGVkIGFsb25nCi0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGd1aSkgdW5sZXNzIC1jb25uZWN0IG9yIC1jb25uZWN0X29yX2V4aXQgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgIGJlZW4gc3BlY2lmaWVkLiAgU28geDExdm5jIChhbmQgdGhlIHRyYXkvaWNvbiBndWkpCi0gICAgICAgICAgICAgICAgICAgICAgIHdpbGwgd2FpdCBmb3IgbW9yZSBjb25uZWN0aW9ucyBhZnRlciB0aGUgZmlyc3QgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RzLiAgSWYgeW91IHdhbnQgb25seSBvbmUgdmlld2VyIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSB0aGUgLW9uY2Ugb3B0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciAiaWNvbiIgdGhlIGd1aSBqdXN0IGEgc21hbGwgc3RhbmRhbG9uZSB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgIEZvciAidHJheSIgaXQgd2lsbCBhdHRlbXB0IHRvIGVtYmVkIGl0c2VsZiBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbSB0cmF5IiBpZiBwb3NzaWJsZS4gSWYgIj1zZXRwYXNzIiBpcyBhcHBlbmRlZCB0aGUKLW4KLSAgICAgICAgICAgICAgICAgICAgICAgYXQgc3RhcnR1cCB0aGUgWDExIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIFZOQyBzZXNzaW9uIHBhc3N3b3JkLiAgSWYgPTxoZXhudW1iZXI+IGlzIGFwcGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaWNvbiB3aWxsIGF0dGVtcHQgdG8gZW1iZWQgaXRzZWxmIGluIHRoZSB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gYnkgaGV4bnVtYmVyLiAgVXNlID1ub2FkdmFuY2VkIHRvIGRpc2FibGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgZ3VpLiAoVG8gc3VwcGx5IG1vcmUgdGhhbiBvbmUsIHVzZSAiKyIgc2lnbikuCi0gICAgICAgICAgICAgICAgICAgICAgIEUuZy4gLWd1aSB0cmF5PXNldHBhc3MgYW5kIC1ndWkgaWNvbj0weDM2MDAwMjgKLQotICAgICAgICAgICAgICAgICAgICAgICBPdGhlciBtb2RlczogImZ1bGwiLCB0aGUgZGVmYXVsdCBhbmQgbmVlZCBub3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLiAgIi1ndWkgbm9uZSIsIGRvIG5vdCBzaG93IGEgZ3VpLCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gb3ZlcnJpZGUgYSB+Ly54MTF2bmNyYyBzZXR0aW5nLCBldGMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgNSkgV2hlbiAiZ2VvbT0rWCtZIiBpcyBzcGVjaWZpZWQsIHRoYXQgZ2VvbWV0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgcGFzc2VkIHRvIHRoZSBndWkgdG9wbGV2ZWwuICBUaGlzIGlzIHRoZSBpY29uIGluCi0gICAgICAgICAgICAgICAgICAgICAgIGljb24vdHJheSBtb2RlLCBvciB0aGUgZnVsbCBndWkgb3RoZXJ3aXNlLiAgWW91IGNhbgotICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHNwZWNpZnkgd2lkdGggYW5kIGhlaWdodCwgaS5lLiBXeEgrWCtZLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHJlY29tbWVuZGVkLiAgSW4gInRyYXkiIG1vZGUgdGhlIGdlb21ldHJ5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgdW5sZXNzIHRoZSBzeXN0ZW0gdHJheSBtYW5hZ2VyIGRvZXMgbm90IHNlZW0KLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZy4gIE9uZSBjb3VsZCBpbWFnaW5lIHVzaW5nIHNvbWV0aGluZyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICItZ3VpIHRyYXksZ2VvbT0rNDAwMCs0MDAwIiB3aXRoIGEgZGlzcGxheSBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGd1aSBpbnZpc2libGUgdW50aWwgc29tZW9uZSBsb2dzIGluLi4uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgTW9yZSBpY29uIHRyaWNrcywgImljb249bWluaW1hbCIgZ2l2ZXMgYW4gaWNvbiBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIFZOQyBkaXNwbGF5IG51bWJlci4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGZvbnQKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAiaWNvbmZvbnQ9Li4uIi4gIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgdXNlZnVsOgotICAgICAgICAgICAgICAgICAgICAgICAiLWd1aSBpY29uPW1pbmltYWwsaWNvbmZvbnQ9NXg4LGdlb209MjR4MTArMC0wIgotCi0gICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYWwgZXhhbXBsZXMgb2YgdGhlIC1ndWkgb3B0aW9uOiAieDExdm5jIC1ndWkiLAotICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1ndWkgZXoiICJ4MTF2bmMgLWd1aSBsb2NhbGhvc3Q6MTAiLAotICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1ndWkgY29ubixob3N0OjAiLCAieDExdm5jIC1ndWkgdHJheSxleiIKLSAgICAgICAgICAgICAgICAgICAgICAgIngxMXZuYyAtZ3VpIHRyYXk9c2V0cGFzcyIKLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IGludGVuZCB0byBzdGFydCB4MTF2bmMgZnJvbSB0aGUgZ3VpCi0gICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGp1c3QgcmVtb3RlIGNvbnRyb2wgYW4gZXhpc3Rpbmcgb25lKSwgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgZ3VpIHByb2Nlc3MgY2FuIHJ1biBvbiBhIGRpZmZlcmVudCBtYWNoaW5lIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBzZXJ2ZXIgYXMgbG9uZyBhcyBYIHBlcm1pc3Npb25zLCBldGMuIHBlcm1pdAotICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHR3by4KLQotICAgICAgICAgICAgICAgICAgICAgICBGT05UUzogT24gc29tZSBzeXN0ZW1zIHRoZSB0ayBmb250cyBjYW4gYmUgdG9vIHNtYWxsLAotICAgICAgICAgICAgICAgICAgICAgICBqYWdnZWQsIG9yIG90aGVyd2lzZSB1bnJlYWRhYmxlLiAgVGhlcmUgYXJlIDQgZW52IHZhcnMKLSAgICAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBzZXQgdG8gYmUgdGhlIHRrIGZvbnQgeW91IHByZWZlcjoKLQotICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfRk9OVF9CT0xEICAgbWFpbiBmb250IGZvciBtZW51cyBhbmQgYnV0dG9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX0ZPTlRfRklYRUQgIGZvbnQgZm9yIGZpeGVkIHdpZHRoIHRleHQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX0ZPTlRfQk9MRF9TTUFMTCAgdHJheSBpY29uIGZvbnQuCi0gICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GT05UX1JFR19TTUFMTCAgIHRyYXkgaWNvbiBtZW51IGZvbnQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxhc3QgdHdvIG9ubHkgYXBwbHkgZm9yIHRoZSB0cmF5IGljb24gbW9kZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgotCi0gICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX0ZPTlRfQk9MRD0nSGVsdmV0aWNhIC0xNiBib2xkJwotICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19GT05UX0ZJWEVEPSdDb3VyaWVyIC0xNCcKLSAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfRk9OVF9SRUdfU01BTEw9J0hlbHZldGljYSAtMTInCi0KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBwdXQgdGhlIGxpbmVzIGxpa2UgdGhlIGFib3ZlICh3aXRob3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXMpIGluIHlvdXIgfi8ueDExdm5jcmMgZmlsZSB0byBhdm9pZCBoYXZpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGVtIG9uIHRoZSB4MTF2bmMgY29tbWFuZCBsaW5lLgotCi0tcmVtb3RlIGNvbW1hbmQgICAgICAgIFJlbW90ZWx5IGNvbnRyb2wgc29tZSBhc3BlY3RzIG9mIGFuIGFscmVhZHkgcnVubmluZwotICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgc2VydmVyLiAgIi1SIiBhbmQgIi1yIiBhcmUgYWxpYXNlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIi1yZW1vdGUiLiAgQWZ0ZXIgdGhlIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgc2VudCB0byB0aGUgcnVubmluZyBzZXJ2ZXIgdGhlICd4MTF2bmMgLXJlbW90ZSAuLi4nCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBjb21tYW5kIGV4aXRzLiAgWW91IGNhbiBvZnRlbiB1c2UgdGhlIC1xdWVyeQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIChzZWUgYmVsb3cpIHRvIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgeW91ciAtcmVtb3RlIGNvbW1hbmQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29tbXVuaWNhdGlvbiBjaGFubmVsIGlzIHRoYXQgb2YgWAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIChzcGVjaWZpY2FsbHkgWDExVk5DX1JFTU9URSksIGFuZCBzbyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbXVzdCBiZSBydW4gd2l0aCBjb3JyZWN0IHNldHRpbmdzIGZvciBESVNQTEFZCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBwb3NzaWJseSBYQVVUSE9SSVRZIHRvIGNvbm5lY3QgdG8gdGhlIFggc2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZXQgdGhlIHByb3BlcnR5LiAgQWx0ZXJuYXRpdmVseSwgdXNlIHRoZSAtZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWF1dGggb3B0aW9ucyB0byBzZXQgdGhlbSB0byB0aGUgY29ycmVjdCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW5uaW5nIHNlcnZlciBjYW5ub3QgdXNlIHRoZSAtbm92bmNjb25uZWN0IG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoYXQgZGlzYWJsZXMgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbC4KLSAgICAgICAgICAgICAgICAgICAgICAgU2VlIGJlbG93IGZvciBhbHRlcm5hdGUgY2hhbm5lbHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICd4MTF2bmMgLXJlbW90ZSBzdG9wJyAod2hpY2ggaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgJ3gxMXZuYyAtUiBzdG9wJykgd2lsbCBjbG9zZSBkb3duIHRoZSB4MTF2bmMgc2VydmVyLgotICAgICAgICAgICAgICAgICAgICAgICAneDExdm5jIC1SIHNoYXJlZCcgd2lsbCBlbmFibGUgc2hhcmVkIGNvbm5lY3Rpb25zLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgJ3gxMXZuYyAtUiBzY2FsZTozLzQnIHdpbGwgcmVzY2FsZSB0aGUgZGVza3RvcC4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIFgxMSBwcm9wZXJ0eSAoZS5nLiB0bwotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgZm9yIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYydzIG9uIHRoZSBzYW1lIGRpc3BsYXkpIHNldCB0aGUgWDExVk5DX1JFTU9URQotICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgc3RyaW5nIHlvdSB3YW50LCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZTogLWVudiBYMTFWTkNfUkVNT1RFPVgxMVZOQ19SRU1PVEVfMTIzNDUKLSAgICAgICAgICAgICAgICAgICAgICAgQm90aCBzaWRlcyBvZiB0aGUgY2hhbm5lbCBtdXN0IHVzZSB0aGUgc2FtZSB1bmlxdWUgbmFtZS4KLQotICAgICAgICAgICAgICAgICAgICAgICBUbyBydW4gYSBidW5jaCBvZiBjb21tYW5kcyBpbiBhIHNlcXVlbmNlIHVzZSBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgbGlrZTogeDExdm5jIC1SICdzY3JpcHQ6Zmlyc3RjbWQ7c2Vjb25kY21kOy4uLicKLQotICAgICAgICAgICAgICAgICAgICAgICBVc2UgeDExdm5jIC1SIHNjcmlwdDpmaWxlPS9wYXRoL3RvL2ZpbGUgdG8gcmVhZCBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGEgZmlsZSAoY2FuIGJlIG11bHRpLWxpbmUgYW5kIHVzZSB0aGUgY29tbWVudCAnIycKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGluIHRoZSBub3JtYWwgd2F5LiAgVGhlICc7JyBzZXBhcmF0b3IgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSB1c2VkIHRvIHNlcGFyYXRlIGVhY2ggY29tbWFuZC4pCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVG8gbm90IHRyeSB0byBjb250YWN0IGFub3RoZXIgeDExdm5jIHByb2Nlc3MgYW5kIGluc3RlYWQKLSAgICAgICAgICAgICAgICAgICAgICAganVzdCBydW4gdGhlIGNvbW1hbmQgKG9yIHF1ZXJ5KSBkaXJlY3RseSwgcHJlZml4IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHdpdGggdGhlIHN0cmluZyAiRElSRUNUOiIKLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIC1yZW1vdGUvLVIgY29tbWFuZHMgYXJlIHN1cHBvcnRlZDoKLQotICAgICAgICAgICAgICAgICAgICAgICBzdG9wICAgICAgICAgICAgdGVybWluYXRlIHRoZSBzZXJ2ZXIsIHNhbWUgYXMgInF1aXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpdCIgb3IgInNodXRkb3duIi4KLSAgICAgICAgICAgICAgICAgICAgICAgcGluZyAgICAgICAgICAgIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlciByZXNwb25kcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpczogYW5zPXBpbmc6PGRpc3BsYXk+Ci0gICAgICAgICAgICAgICAgICAgICAgIHBpbmc6bXlzdHJpbmcgICBhcyBhYm92ZSwgYnV0IHVzZSB5b3VyIG93biB1bmlxdWUgc3RyaW5nCi0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXM6IGFucz1waW5nOm15c3RyaW5nOjx4ZGlzcGxheT4KLSAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tlbiAgICAgICAgIHRyeSB0byBwdXNoIGEgYmxhY2sgZmIgdXBkYXRlIHRvIGFsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyAoZHVlIHRvIHRpbWluZ3MgYSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIG1pc3MgaXQpLiBTYW1lIGFzICJ6ZXJvIiwgYWxzbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInplcm86eDEseTEseDIseTIiIGZvciBhIHJlY3RhbmdsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCAgICAgICAgIHNlbmQgdGhlIGVudGlyZSBmYiB0byBhbGwgY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgICAgICAgICAgIHJlY3JlYXRlIHRoZSBmYiwgcG9sbGluZyBtZW1vcnksIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgaWQ6d2luZG93aWQgICAgIHNldCAtaWQgd2luZG93IHRvICJ3aW5kb3dpZCIuIGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAicm9vdCIgdG8gZ28gYmFjayB0byByb290IHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICBzaWQ6d2luZG93aWQgICAgc2V0IC1zaWQgd2luZG93IHRvICJ3aW5kb3dpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgaWRfY21kOmNtZCAgICAgIGNtZHM6IHJhaXNlLCBsb3dlciwgbWFwLCB1bm1hcCwgaWNvbmlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmU6ZFhkWSwgcmVzaXplOmRXZEgsIGdlb206V3hIK1grWS4gZFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRZLCBkVywgYW5kIGRIIG11c3QgaGF2ZSBhIGxlYWRpbmcgIisiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAiLSIgZS5nLjogbW92ZTotMzArMTAgcmVzaXplOisyMCszNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbzogd21fZGVsZXRlLCB3bV9uYW1lOnN0cmluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25fbmFtZTpzdHJpbmcuIEFsc28gaWRfY21kOndpbj1OOmNtZAotICAgICAgICAgICAgICAgICAgICAgICB3YWl0bWFwcGVkICAgICAgd2FpdCB1bnRpbCBzdWJ3aW4gaXMgbWFwcGVkLgotICAgICAgICAgICAgICAgICAgICAgICBub3dhaXRtYXBwZWQgICAgZG8gbm90IHdhaXQgdW50aWwgc3Vid2luIGlzIG1hcHBlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgY2xpcDpXeEgrWCtZICAgIHNldCAtY2xpcCBtb2RlIHRvICJXeEgrWCtZIgotICAgICAgICAgICAgICAgICAgICAgICBmbGFzaGNtYXAgICAgICAgZW5hYmxlICAtZmxhc2hjbWFwIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZmxhc2hjbWFwICAgICBkaXNhYmxlIC1mbGFzaGNtYXAgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRjbWFwOm4gICAgIHNldCAtc2hpZnRjbWFwIHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdHJ1ZWNvbG9yICAgICBlbmFibGUgIC1ub3RydWVjb2xvciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICB0cnVlY29sb3IgICAgICAgZGlzYWJsZSAtbm90cnVlY29sb3IgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSAgICAgICAgIGVuYWJsZSAgLW92ZXJsYXkgbW9kZSAoaWYgYXBwbGljYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vb3ZlcmxheSAgICAgICBkaXNhYmxlIC1vdmVybGF5IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfY3Vyc29yICBpbiAtb3ZlcmxheSBtb2RlLCBlbmFibGUgY3Vyc29yIGRyYXdpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfbm9jdXJzb3IgZGlzYWJsZSBjdXJzb3IgZHJhd2luZy4gc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb3ZlcmxheV9jdXJzb3IuCi0gICAgICAgICAgICAgICAgICAgICAgIDh0bzI0ICAgICAgICAgICBlbmFibGUgIC04dG8yNCBtb2RlIChpZiBhcHBsaWNhYmxlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm84dG8yNCAgICAgICAgIGRpc2FibGUgLTh0bzI0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIDh0bzI0X29wdHM6c3RyICBzZXQgdGhlIC04dG8yNCBvcHRzIHRvICJzdHIiLgotICAgICAgICAgICAgICAgICAgICAgICAyNHRvMzIgICAgICAgICAgZW5hYmxlICAtMjR0bzMyIG1vZGUgKGlmIGFwcGxpY2FibGUpLgotICAgICAgICAgICAgICAgICAgICAgICBubzI0dG8zMiAgICAgICAgZGlzYWJsZSAtMjR0bzMyIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbDp2aXMgICAgICBzZXQgLXZpc3VhbCB0byAidmlzIgotICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTpmcmFjICAgICAgc2V0IC1zY2FsZSB0byAiZnJhYyIKLSAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY3Vyc29yOmYgIHNldCAtc2NhbGVfY3Vyc29yIHRvICJmIgotICAgICAgICAgICAgICAgICAgICAgICB2aWV3b25seSAgICAgICAgZW5hYmxlICAtdmlld29ubHkgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm92aWV3b25seSAgICAgIGRpc2FibGUgLXZpZXdvbmx5IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCAgICAgICAgICBlbmFibGUgIC1zaGFyZWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zaGFyZWQgICAgICAgIGRpc2FibGUgLXNoYXJlZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBmb3JldmVyICAgICAgICAgZW5hYmxlICAtZm9yZXZlciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2ZvcmV2ZXIgICAgICAgZGlzYWJsZSAtZm9yZXZlciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0Om4gICAgICAgcmVzZXQgLXRpbWVvdXQgdG8gbiwgaWYgdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgbm8gY2xpZW50cywgZXhpdCB1bmxlc3Mgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0cyBpbiB0aGUgbmV4dCBuIHNlY3MuCi0gICAgICAgICAgICAgICAgICAgICAgIHRpZ2h0ZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgTkVXIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdGlnaHRmaWxleGZlciBkaXNhYmxlIGZpbGV0cmFuc2ZlciBmb3IgTkVXIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgIHVsdHJhZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgbm91bHRyYWZpbGV4ZmVyIGRpc2FibGUgZmlsZXRyYW5zZmVyIGZvciBjbGllbnRzLgotICAgICAgICAgICAgICAgICAgICAgICByZmJ2ZXJzaW9uOm4ubSAgc2V0IC1yZmJ2ZXJzaW9uIGZvciBuZXcgY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgaHR0cCAgICAgICAgICAgIGVuYWJsZSAgaHR0cCBjbGllbnQgY29ubmVjdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vaHR0cCAgICAgICAgICBkaXNhYmxlIGh0dHAgY2xpZW50IGNvbm5lY3Rpb25zLgotICAgICAgICAgICAgICAgICAgICAgICBkZW55ICAgICAgICAgICAgZGVueSBhbnkgbmV3IGNvbm5lY3Rpb25zLCBzYW1lIGFzICJsb2NrIgotICAgICAgICAgICAgICAgICAgICAgICBub2RlbnkgICAgICAgICAgYWxsb3cgbmV3IGNvbm5lY3Rpb25zLCBzYW1lIGFzICJ1bmxvY2siCi0gICAgICAgICAgICAgICAgICAgICAgIGF2YWhpICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYXZhaGkgICAgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG1kbnMgICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbWRucyAgICAgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIHplcm9jb25mICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vemVyb2NvbmYgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Q6aG9zdCAgICBkbyByZXZlcnNlIGNvbm5lY3Rpb24gdG8gaG9zdCwgImhvc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaG9zdDpwb3J0cy4gIFNlZSAtY29ubmVjdC4gIFBhc3N3b3JkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgYXMgd2l0aCBmd2QgY29ubmVjdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgWDExVk5DX1JFVkVSU0VfQ09OTkVDVElPTl9OT19BVVRIPTEKLSAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdDpob3N0IGRpc2Nvbm5lY3QgYW55IGNsaWVudHMgZnJvbSAiaG9zdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgImNsb3NlOmhvc3QiLiAgVXNlIGhvc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiIHRvIGNsb3NlIGFsbCBjdXJyZW50IGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Uga25vdyB0aGUgY2xpZW50IGludGVybmFsIGhleCBJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gMHgzIChyZXR1cm5lZCBieSAiLXF1ZXJ5IGNsaWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgUkZCX0NMSUVOVF9JRCkgeW91IGNhbiB1c2UgdGhhdCB0b28uCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3h5Omhvc3Q6cG9ydCBzZXQgcmV2ZXJzZSBjb25uZWN0aW9uIHByb3h5IChlbXB0eSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbG93b25jZTpob3N0ICBGb3IgdGhlIG5leHQgY29ubmVjdGlvbiBvbmx5LCBhbGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBmcm9tICJob3N0Ii4gSW4gLXNzbCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gY29ubmVjdGlvbnMgYXJlIGFsbG93ZWQgKGkuZS4gRmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnQpIHVubGVzcyBYMTFWTkNfTk9fU1NMX0FMTE9XX1RXSUNFPTEKLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb3c6aG9zdGxpc3QgIHNldCAtYWxsb3cgbGlzdCB0byAoY29tbWEgc2VwYXJhdGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RsaXN0Ii4gU2VlIC1hbGxvdyBhbmQgLWxvY2FsaG9zdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCB1c2Ugd2l0aCAtYWxsb3cgL3BhdGgvdG8vZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICIraG9zdCIgdG8gYWRkIGEgc2luZ2xlIGhvc3QsIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlICItaG9zdCIgdG8gZGVsZXRlIGEgc2luZ2xlIGhvc3QKLSAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxob3N0ICAgICAgIGVuYWJsZSAgLWxvY2FsaG9zdCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbG9jYWxob3N0ICAgICBkaXNhYmxlIC1sb2NhbGhvc3QgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW46c3RyICAgICAgc2V0IC1saXN0ZW4gdG8gc3RyLCBlbXB0eSB0byBkaXNhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICBub2lwdjYgICAgICAgICAgZW5hYmxlICAtbm9pcHY2IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGlwdjYgICAgICAgICAgICBkaXNhYmxlIC1ub2lwdjYgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9pcHY0ICAgICAgICAgIGVuYWJsZSAgLW5vaXB2NCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBpcHY0ICAgICAgICAgICAgZGlzYWJsZSAtbm9pcHY0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICBlbmFibGUgIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vNiAgICAgICAgICAgICBkaXNhYmxlIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cCAgICAgICAgICBkaXNhYmxlIC1ub2xvb2t1cCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2xvb2t1cCAgICAgICAgZW5hYmxlICAtbm9sb29rdXAgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwICAgICAgICAgIGRpc2FibGUgLW5vbG9va3VwIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGlucHV0OnN0ciAgICAgICBzZXQgLWlucHV0IHRvICJzdHIiLCBlbXB0eSB0byBkaXNhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICBncmFia2JkICAgICAgICAgZW5hYmxlICAtZ3JhYmtiZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2dyYWJrYmQgICAgICAgZGlzYWJsZSAtZ3JhYmtiZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBncmFicHRyICAgICAgICAgZW5hYmxlICAtZ3JhYnB0ciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2dyYWJwdHIgICAgICAgZGlzYWJsZSAtZ3JhYnB0ciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBncmFiYWx3YXlzICAgICAgZW5hYmxlICAtZ3JhYmFsd2F5cyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2dyYWJhbHdheXMgICAgZGlzYWJsZSAtZ3JhYmFsd2F5cyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBncmFibG9jYWw6biAgICAgc2V0IC1ncmFibG9jYWwgdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lucHV0OnN0ciBzZXQgdGhlIEssIE0sIEIgLWlucHV0IG9uIGEgcGVyLWNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaXMuICBzZWxlY3Qgd2hpY2ggY2xpZW50IGFzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCwgZS5nLiBjbGllbnRfaW5wdXQ6aG9zdDpNQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2xpZW50X2lucHV0OjB4MjpLCi0gICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdDpjbWQgICAgICBzZXQgLWFjY2VwdCAiY21kIiAoZW1wdHkgdG8gZGlzYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIGFmdGVyYWNjZXB0OmNtZCBzZXQgLWFmdGVyYWNjZXB0IChlbXB0eSB0byBkaXNhYmxlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZ29uZTpjbWQgICAgICAgIHNldCAtZ29uZSAiY21kIiAoZW1wdHkgdG8gZGlzYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vc2htICAgICAgICAgICBlbmFibGUgIC1ub3NobSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzaG0gICAgICAgICAgICAgZGlzYWJsZSAtbm9zaG0gbW9kZSAoaS5lLiB1c2Ugc2htKS4KLSAgICAgICAgICAgICAgICAgICAgICAgZmxpcGJ5dGVvcmRlciAgIGVuYWJsZSAtZmxpcGJ5dGVvcmRlciBtb2RlLCB5b3UgbWF5IG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNldCBub3NobSBmb3IgdGhpcyB0byBkbyBzb21ldGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZmxpcGJ5dGVvcmRlciBkaXNhYmxlIC1mbGlwYnl0ZW9yZGVyIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG9uZXRpbGUgICAgICAgICBlbmFibGUgIC1vbmV0aWxlIG1vZGUuICh5b3UgbWF5IG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBzaG0gZm9yIHRoaXMgdG8gZG8gc29tZXRoaW5nKQotICAgICAgICAgICAgICAgICAgICAgICBub29uZXRpbGUgICAgICAgZGlzYWJsZSAtb25ldGlsZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzb2xpZCAgICAgICAgICAgZW5hYmxlICAtc29saWQgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICBub3NvbGlkICAgICAgICAgZGlzYWJsZSAtc29saWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3I6Y29sb3Igc2V0IC1zb2xpZCBjb2xvciAoYW5kIGFwcGx5IGl0KS4KLSAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tvdXQ6c3RyICAgIHNldCAtYmxhY2tvdXQgInN0ciIgKGVtcHR5IHRvIGRpc2FibGUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1ibGFja291dCBmb3IgdGhlIGZvcm0gb2YgInN0ciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHk6IFd4SCtYK1ksLi4uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICIrV3hIK1grWSIgdG8gYXBwZW5kIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGUgdXNlICItV3hIK1grWSIgdG8gZGVsZXRlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICB4aW5lcmFtYSAgICAgICAgZW5hYmxlICAteGluZXJhbWEgbW9kZS4gKGlmIGFwcGxpY2FibGUpCi0gICAgICAgICAgICAgICAgICAgICAgIG5veGluZXJhbWEgICAgICBkaXNhYmxlIC14aW5lcmFtYSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICB4dHJhcCAgICAgICAgICAgZW5hYmxlICAteHRyYXAgaW5wdXQgbW9kZShpZiBhcHBsaWNhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICBub3h0cmFwICAgICAgICAgZGlzYWJsZSAteHRyYXAgaW5wdXQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgeHJhbmRyICAgICAgICAgIGVuYWJsZSAgLXhyYW5kciBtb2RlLiAoaWYgYXBwbGljYWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgbm94cmFuZHIgICAgICAgIGRpc2FibGUgLXhyYW5kciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICB4cmFuZHJfbW9kZTptb2RlIHNldCB0aGUgLXhyYW5kciBtb2RlIHRvICJtb2RlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlOm1vZGUgICAgIHNldCB0aGUgLXJvdGF0ZSBtb2RlIHRvICJtb2RlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgcGFkZ2VvbTpXeEggICAgIHNldCAtcGFkZ2VvbSB0byBXeEggKGVtcHR5IHRvIGRpc2FibGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBXeEggaXMgImZvcmNlIiBvciAiZG8iIHRoZSBwYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5IGZiIGlzIGltbWVkaWF0ZWx5IGFwcGxpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ICAgICAgICAgICBlbmFibGUgIC1xdWlldCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub3F1aWV0ICAgICAgICAgZGlzYWJsZSAtcXVpZXQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbW9kdHdlYWsgICAgICAgIGVuYWJsZSAgLW1vZHR3ZWFrIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbW9kdHdlYWsgICAgICBlbmFibGUgIC1ub21vZHR3ZWFrIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHhrYiAgICAgICAgICAgICBlbmFibGUgIC14a2IgbW9kdHdlYWsgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm94a2IgICAgICAgICAgIGRpc2FibGUgLXhrYiBtb2R0d2VhayBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBjYXBzbG9jayAgICAgICAgZW5hYmxlICAtY2Fwc2xvY2sgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9jYXBzbG9jayAgICAgIGRpc2FibGUgLWNhcHNsb2NrIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNraXBfbG9ja2tleXMgICBlbmFibGUgIC1za2lwX2xvY2trZXlzIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vc2tpcF9sb2Nra2V5cyBkaXNhYmxlIC1za2lwX2xvY2trZXlzIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNraXBfa2V5Y29kZXM6c3RyIGVuYWJsZSAteGtiIC1za2lwX2tleWNvZGVzICJzdHIiLgotICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlfa2V5cyAgICAgZW5hYmxlICAtc2xvcHB5X2tleXMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zbG9wcHlfa2V5cyAgIGRpc2FibGUgLXNsb3BweV9rZXlzIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNraXBfZHVwcyAgICAgICBlbmFibGUgIC1za2lwX2R1cHMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9za2lwX2R1cHMgICAgIGRpc2FibGUgLXNraXBfZHVwcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBhZGRfa2V5c3ltcyAgICAgZW5hYmxlIC1hZGRfa2V5c3ltcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2FkZF9rZXlzeW1zICAgc3RvcCBhZGRpbmcga2V5c3ltcy4gdGhvc2UgYWRkZWQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgYmUgcmVtb3ZlZCBhdCBleGl0LgotICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9tb2RzICAgICAgZW5hYmxlICAtY2xlYXJfbW9kcyBtb2RlIGFuZCBjbGVhciB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICBub2NsZWFyX21vZHMgICAgZGlzYWJsZSAtY2xlYXJfbW9kcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9rZXlzICAgICAgZW5hYmxlICAtY2xlYXJfa2V5cyBtb2RlIGFuZCBjbGVhciB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICBub2NsZWFyX2tleXMgICAgZGlzYWJsZSAtY2xlYXJfa2V5cyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9sb2NrcyAgICAgZG8gdGhlIGNsZWFyX2xvY2tzIGFjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYWxsICAgICAgIGRvIHRoZSBjbGVhcl9hbGwgYWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICBrZXlzdGF0ZSAgICAgICAgaGF2ZSB4MTF2bmMgcHJpbnQgY3VycmVudCBrZXlzdGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVtYXA6c3RyICAgICAgIHNldCAtcmVtYXAgInN0ciIgKGVtcHR5IHRvIGRpc2FibGUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1yZW1hcCBmb3IgdGhlIGZvcm0gb2YgInN0ciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHk6IGtleTEta2V5MixrZXkzLWtleTQsLi4uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICIra2V5MS1rZXkyIiB0byBhcHBlbmQgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW1hcHBpbmcsIHVzZSAiLWtleTEta2V5MiIgdG8gZGVsZXRlLgotICAgICAgICAgICAgICAgICAgICAgICBub3JlcGVhdCAgICAgICAgZW5hYmxlICAtbm9yZXBlYXQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ICAgICAgICAgIGRpc2FibGUgLW5vcmVwZWF0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZmIgICAgICAgICAgICBlbmFibGUgIC1ub2ZiIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGZiICAgICAgICAgICAgICBkaXNhYmxlIC1ub2ZiIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGJlbGwgICAgICAgICAgICBlbmFibGUgIGJlbGwgKGlmIHN1cHBvcnRlZCkuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYmVsbCAgICAgICAgICBkaXNhYmxlIGJlbGwuCi0gICAgICAgICAgICAgICAgICAgICAgIHNlbmRiZWxsICAgICAgICByaW5nIHRoZSBiZWxsIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zZWwgICAgICAgICAgIGVuYWJsZSAgLW5vc2VsIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNlbCAgICAgICAgICAgICBkaXNhYmxlIC1ub3NlbCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub3ByaW1hcnkgICAgICAgZW5hYmxlICAtbm9wcmltYXJ5IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgICAgICAgICBkaXNhYmxlIC1ub3ByaW1hcnkgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zZXRwcmltYXJ5ICAgIGVuYWJsZSAgLW5vc2V0cHJpbWFyeSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzZXRwcmltYXJ5ICAgICAgZGlzYWJsZSAtbm9zZXRwcmltYXJ5IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vY2xpcGJvYXJkICAgICBlbmFibGUgIC1ub2NsaXBib2FyZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQgICAgICAgZGlzYWJsZSAtbm9jbGlwYm9hcmQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zZXRjbGlwYm9hcmQgIGVuYWJsZSAgLW5vc2V0Y2xpcGJvYXJkIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHNldGNsaXBib2FyZCAgICBkaXNhYmxlIC1ub3NldGNsaXBib2FyZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzZWxkaXI6c3RyICAgICAgc2V0IC1zZWxkaXIgdG8gInN0ciIKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX2N1dGJ1ZmZlciByZXNlbmQgdGhlIG1vc3QgcmVjZW50IENVVEJVRkZFUjAgY29weQotICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfY2xpcGJvYXJkIHJlc2VuZCB0aGUgbW9zdCByZWNlbnQgQ0xJUEJPQVJEIGNvcHkKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX3ByaW1hcnkgICByZXNlbmQgdGhlIG1vc3QgcmVjZW50IFBSSU1BUlkgY29weQotICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6bW9kZSAgICAgZW5hYmxlICAtY3Vyc29yICJtb2RlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jdXJzb3IgICAgIGVuYWJsZSAgc2hvd2luZyBhIGN1cnNvci4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zaG93X2N1cnNvciAgIGRpc2FibGUgc2hvd2luZyBhIGN1cnNvci4gKHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub2N1cnNvciIpCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcl9kcmFnICAgICBlbmFibGUgIGN1cnNvciBjaGFuZ2VzIGR1cmluZyBkcmFnLgotICAgICAgICAgICAgICAgICAgICAgICBub2N1cnNvcl9kcmFnICAgZGlzYWJsZSBjdXJzb3IgY2hhbmdlcyBkdXJpbmcgZHJhZy4KLSAgICAgICAgICAgICAgICAgICAgICAgYXJyb3c6biAgICAgICAgIHNldCAtYXJyb3cgdG8gYWx0ZXJuYXRlIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIHhmaXhlcyAgICAgICAgICBlbmFibGUgIHhmaXhlcyBjdXJzb3Igc2hhcGUgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm94Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGN1cnNvciBzaGFwZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWN1dDpuICAgICAgc2V0IC1hbHBoYWN1dCB0byBuLgotICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWZyYWM6ZiAgICAgc2V0IC1hbHBoYWZyYWMgdG8gZi4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFyZW1vdmUgICAgIGVuYWJsZSAgLWFscGhhcmVtb3ZlIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYWxwaGFyZW1vdmUgICBkaXNhYmxlIC1hbHBoYXJlbW92ZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWJsZW5kICAgICAgZGlzYWJsZSAtbm9hbHBoYWJsZW5kIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYWxwaGFibGVuZCAgICBlbmFibGUgIC1ub2FscGhhYmxlbmQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yc2hhcGUgICAgIGRpc2FibGUgLW5vY3Vyc29yc2hhcGUgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9jdXJzb3JzaGFwZSAgIGVuYWJsZSAgLW5vY3Vyc29yc2hhcGUgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29ycG9zICAgICAgIGRpc2FibGUgLW5vY3Vyc29ycG9zIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vY3Vyc29ycG9zICAgICBlbmFibGUgIC1ub2N1cnNvcnBvcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICB4d2FycCAgICAgICAgICAgZW5hYmxlICAteHdhcnBwb2ludGVyIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5veHdhcnAgICAgICAgICBkaXNhYmxlIC14d2FycHBvaW50ZXIgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzX2luamVjdCAgIGVuYWJsZSAgLWFsd2F5c19pbmplY3QgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9hbHdheXNfaW5qZWN0IGRpc2FibGUgLWFsd2F5c19pbmplY3QgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ubWFwOnN0ciAgIHNldCAtYnV0dG9ubWFwICJzdHIiLCBlbXB0eSB0byBkaXNhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nICAgICAgICBkaXNhYmxlIC1ub2RyYWdnaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZHJhZ2dpbmcgICAgICBlbmFibGUgIC1ub2RyYWdnaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZSAgICAgICAgICByZWVuYWJsZSAtbmNhY2hlIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlICAgICAgICBkaXNhYmxlICAtbmNhY2hlIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9zaXplOm4gICBzZXQgLW5jYWNoZSBzaXplIHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9jciAgICAgICBlbmFibGUgIC1uY2FjaGVfY3IgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfY3IgICAgIGRpc2FibGUgLW5jYWNoZV9jciBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fbW92ZXJhaXNlICAgICBlbmFibGUgIG5vX21vdmVyYWlzZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub25jYWNoZV9ub19tb3ZlcmFpc2UgICBkaXNhYmxlIG5vX21vdmVyYWlzZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fZHRjaGFuZ2UgICAgICBlbmFibGUgIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub25jYWNoZV9ub19kdGNoYW5nZSAgICBkaXNhYmxlIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfb2xkX3dtICAgICAgICAgICBlbmFibGUgIG5jYWNoZV9vbGRfd20gbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfb2xkX3dtICAgICAgICAgZGlzYWJsZSBuY2FjaGVfb2xkX3dtIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9ub19yb290cGl4bWFwICAgIGVuYWJsZSAgbmNhY2hlX25vX3Jvb3RwaXhtYXAuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX25vX3Jvb3RwaXhtYXAgIGRpc2FibGUgbmNhY2hlX25vX3Jvb3RwaXhtYXAuCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9yZXNldF9yb290cGl4bWFwIHJlY2hlY2sgdGhlIHJvb3QgcGl4bWFwLCBuY3JwCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9rZWVwX2FuaW1zICAgICAgIGVuYWJsZSAgbmNhY2hlX2tlZXBfYW5pbXMuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX2tlZXBfYW5pbXMgICAgIGRpc2FibGUgbmNhY2hlX2tlZXBfYW5pbXMuCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9wYWQ6biAgICBzZXQgLW5jYWNoZV9wYWQgdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1lICAgICAgIGVuYWJsZSAgLXdpcmVmcmFtZSBtb2RlLiBzYW1lIGFzICJ3ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgbm93aXJlZnJhbWUgICAgIGRpc2FibGUgLXdpcmVmcmFtZSBtb2RlLiBzYW1lIGFzICJub3dmIgotICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWU6c3RyICAgZW5hYmxlICAtd2lyZWZyYW1lIG1vZGUgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWVfbW9kZTpzdHIgZW5hYmxlICAtd2lyZWZyYW1lIG1vZGUgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWVsb2NhbCAgZW5hYmxlICB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyAid2ZsIgotICAgICAgICAgICAgICAgICAgICAgICBub3dpcmVmcmFtZSAgICAgZGlzYWJsZSB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyAibm93ZmwiCi0gICAgICAgICAgICAgICAgICAgICAgIHdpcmVjb3B5cmVjdDpzdHIgc2V0IC13aXJlY29weXJlY3Qgc3RyaW5nLiBzYW1lIGFzICJ3Y3I6Ci0iCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGNvcHlyZWN0OnN0ciBzZXQgLXNjcm9sbGNvcHlyZWN0IHN0cmluZy4gc2FtZSAic2NyCi0iCi0gICAgICAgICAgICAgICAgICAgICAgIG5vc2Nyb2xsY29weXJlY3QgZGlzYWJsZSAtc2Nyb2xsY29weXJlY3QgbW9kZS4gIm5vc2NyIgotICAgICAgICAgICAgICAgICAgICAgICBzY3JfYXJlYTpuICAgICAgc2V0IC1zY3JfYXJlYSB0byBuCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcl9za2lwOmxpc3QgICBzZXQgLXNjcl9za2lwIHRvICJsaXN0IgotICAgICAgICAgICAgICAgICAgICAgICBzY3JfaW5jOmxpc3QgICAgc2V0IC1zY3JfaW5jIHRvICJsaXN0IgotICAgICAgICAgICAgICAgICAgICAgICBzY3Jfa2V5czpsaXN0ICAgc2V0IC1zY3Jfa2V5cyB0byAibGlzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Rlcm06bGlzdCAgIHNldCAtc2NyX3Rlcm0gdG8gImxpc3QiCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcl9rZXlyZXBlYXQ6c3RyIHNldCAtc2NyX2tleXJlcGVhdCB0byAic3RyIgotICAgICAgICAgICAgICAgICAgICAgICBzY3JfcGFybXM6c3RyICAgc2V0IC1zY3JfcGFybXMgcGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgZml4c2NyZWVuOnN0ciAgIHNldCAtZml4c2NyZWVuIHRvICJzdHIiLgotICAgICAgICAgICAgICAgICAgICAgICBub3hyZWNvcmQgICAgICAgZGlzYWJsZSBhbGwgdXNlIG9mIFJFQ09SRCBleHRlbnNpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIHhyZWNvcmQgICAgICAgICBlbmFibGUgIHVzZSBvZiBSRUNPUkQgZXh0ZW5zaW9uLgotICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yZWNvcmQgICAgcmVzZXQgUkVDT1JEIGV4dGVuc2lvbiAoaWYgYXZhaWwuKQotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX21vZGU6biAgc2V0IC1wb2ludGVyX21vZGUgdG8gbi4gc2FtZSBhcyAicG0iCi0gICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NraXA6biAgICBzZXQgLWlucHV0X3NraXAgdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsaW5wdXQgICAgICAgIGVuYWJsZSAgdXNlIG9mIC1hbGxpbnB1dCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2FsbGlucHV0ICAgICAgZGlzYWJsZSB1c2Ugb2YgLWFsbGlucHV0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2VhZ2VybHkgICBlbmFibGUgIHVzZSBvZiAtaW5wdXRfZWFnZXJseSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2lucHV0X2VhZ2VybHkgZGlzYWJsZSB1c2Ugb2YgLWlucHV0X2VhZ2VybHkgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgc3NsdGltZW91dDpuICAgIHNldCAtc3NsdGltZW91dCB0byBuLgotICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHM6c3RyICAgICAgc2V0IC1zcGVlZHMgdG8gc3RyLgotICAgICAgICAgICAgICAgICAgICAgICB3bWR0OnN0ciAgICAgICAgc2V0IC13bWR0IHRvIHN0ci4KLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfcG9pbnRlciAgIGVuYWJsZSAgLWRlYnVnX3BvaW50ZXIsIHNhbWUgYXMgImRwIgotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3BvaW50ZXIgZGlzYWJsZSAtZGVidWdfcG9pbnRlciwgc2FtZSBhcyAibm9kcCIKLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfa2V5Ym9hcmQgICBlbmFibGUgIC1kZWJ1Z19rZXlib2FyZCwgc2FtZSBhcyAiZGsiCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfa2V5Ym9hcmQgZGlzYWJsZSAtZGVidWdfa2V5Ym9hcmQsIHNhbWUgYXMgIm5vZGsiCi0gICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGU6biAgICAgICBpbmplY3Qga2V5c3Ryb2tlICdrZXljb2RlJyAoeG1vZG1hcCAtcGspCi0gICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGU6bixkb3duICBpbmplY3QgJ2tleWNvZGUnIChkb3duPTAsMSkKLSAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltOnN0ciAgICAgIGluamVjdCBrZXlzdHJva2UgJ2tleXN5bScgKG51bWJlci9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW06c3RyLGRvd24gaW5qZWN0ICdrZXlzeW0nIChkb3duPTAsMSkKLSAgICAgICAgICAgICAgICAgICAgICAgcHRyOngseSxtYXNrICAgIGluamVjdCBwb2ludGVyIGV2ZW50IHgsIHksIGJ1dHRvbi1tYXNrCi0gICAgICAgICAgICAgICAgICAgICAgIGZha2VidXR0b25ldmVudDpidXR0b24sZG93biBkaXJlY3QgWFRlc3RGYWtlQnV0dG9uRXZlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgIHNsZWVwOnQgICAgICAgICBzbGVlcCBmbG9hdGluZyBwb2ludCB0aW1lIHQuCi0gICAgICAgICAgICAgICAgICAgICAgIGdldF94cHJvcDpwICAgICBnZXQgWCBwcm9wZXJ0eSBuYW1lZCAncCcuCi0gICAgICAgICAgICAgICAgICAgICAgIHNldF94cHJvcDpwOnZhbCBzZXQgWCBwcm9wZXJ0eSBuYW1lZCAncCcgdG8gJ3ZhbCcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIC0+IGlkPU5OTjpwIGZvciBoZXgvZGVjIHdpbmRvdyBpZC4KLSAgICAgICAgICAgICAgICAgICAgICAgd2luaW5mbzppZCAgICAgIGdldCBpbmZvIGFib3V0IFggd2luZG93IGlkLiAgdXNlICdyb290JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJvb3Qgd2luZG93LCB1c2UgK2lkIGZvciBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgZ3JhYl9zdGF0ZSAgICAgIGdldCBzdGF0ZSBvZiBwb2ludGVyIGFuZCBrZXlib2FyZCBncmFiLgotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3BvcyAgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciB4LHkgY3Vyc29yIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3ggICAgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciB4IGN1cnNvciBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl95ICAgICAgIHByaW50IFhRdWVyeVBvaW50ZXIgeSBjdXJzb3IgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfc2FtZSAgICBwcmludCBYUXVlcnlQb2ludGVyIHB0ciBvbiBzYW1lIHNjcmVlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9yb290ICAgIHByaW50IFhRdWVyeVBvaW50ZXIgY3VyciBwdHIgcm9vdHdpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tYXNrICAgIHByaW50IFhRdWVyeVBvaW50ZXIgYnV0dG9uIGFuZCBtb2RzIG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgbW91c2VfeCAgICAgICAgIHByaW50IHgxMXZuYydzIGlkZWEgb2YgY3Vyc29yIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICBtb3VzZV95ICAgICAgICAgcHJpbnQgeDExdm5jJ3MgaWRlYSBvZiBjdXJzb3IgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgIG5vb3AgICAgICAgICAgICBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgICAgICAgICBkZWZlcjpuICAgICAgICAgc2V0IC1kZWZlciB0byBuIG1zLHNhbWUgYXMgZGVmZXJ1cGRhdGU6bgotICAgICAgICAgICAgICAgICAgICAgICB3YWl0Om4gICAgICAgICAgc2V0IC13YWl0IHRvIG4gbXMuCi0gICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2ZidXI6biAgICBzZXQgLWV4dHJhX2ZidXIgdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgd2FpdF91aTpmICAgICAgIHNldCAtd2FpdF91aSBmYWN0b3IgdG8gZi4KLSAgICAgICAgICAgICAgICAgICAgICAgc2V0ZGVmZXI6biAgICAgIHNldCAtc2V0ZGVmZXIgdG8gLTIsLTEsMCwxLCBvciAyLgotICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2JvZyAgICAgICAgZGlzYWJsZSAtbm93YWl0X2JvZyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub3dhaXRfYm9nICAgICAgZW5hYmxlICAtbm93YWl0X2JvZyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzbG93X2ZiOmYgICAgICAgc2V0IC1zbG93X2ZiIHRvIGYgc2Vjb25kcy4KLSAgICAgICAgICAgICAgICAgICAgICAgeHJlZnJlc2g6ZiAgICAgIHNldCAteHJlZnJlc2ggdG8gZiBzZWNvbmRzLgotICAgICAgICAgICAgICAgICAgICAgICByZWFkdGltZW91dDpuICAgc2V0IHJlYWQgdGltZW91dCB0byBuIHNlY29uZHMuCi0gICAgICAgICAgICAgICAgICAgICAgIG5hcCAgICAgICAgICAgICBlbmFibGUgIC1uYXAgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9uYXAgICAgICAgICAgIGRpc2FibGUgLW5hcCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzYjpuICAgICAgICAgICAgc2V0IC1zYiB0byBuIHMsIHNhbWUgYXMgc2NyZWVuX2JsYW5rOm4KLSAgICAgICAgICAgICAgICAgICAgICAgZmJwbSAgICAgICAgICAgIGRpc2FibGUgLW5vZmJwbSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBub2ZicG0gICAgICAgICAgZW5hYmxlICAtbm9mYnBtIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGRwbXMgICAgICAgICAgICBkaXNhYmxlIC1ub2RwbXMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9kcG1zICAgICAgICAgIGVuYWJsZSAgLW5vZHBtcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWRwbXMgICAgICAgZW5hYmxlICAtZm9yY2VkcG1zIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZm9yY2VkcG1zICAgICBkaXNhYmxlIC1mb3JjZWRwbXMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ZHBtcyAgICAgIGVuYWJsZSAgLWNsaWVudGRwbXMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9jbGllbnRkcG1zICAgIGRpc2FibGUgLWNsaWVudGRwbXMgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9zZXJ2ZXJkcG1zICAgIGVuYWJsZSAgLW5vc2VydmVyZHBtcyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJkcG1zICAgICAgZGlzYWJsZSAtbm9zZXJ2ZXJkcG1zIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdWx0cmFleHQgICAgICBlbmFibGUgIC1ub3VsdHJhZXh0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIHVsdHJhZXh0ICAgICAgICBkaXNhYmxlIC1ub3VsdHJhZXh0IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXR3aW5kb3cgICAgICBlbmFibGUgIGxvY2FsIGNoYXR3aW5kb3cgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9jaGF0d2luZG93ICAgIGRpc2FibGUgbG9jYWwgY2hhdHdpbmRvdyBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBjaGF0b24gICAgICAgICAgYmVnaW4gY2hhdCB1c2luZyBsb2NhbCB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXRvZmYgICAgICAgICBlbmQgICBjaGF0IHVzaW5nIGxvY2FsIHdpbmRvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgeGRhbWFnZSAgICAgICAgIGVuYWJsZSAgeGRhbWFnZSBwb2xsaW5nIGhpbnRzLgotICAgICAgICAgICAgICAgICAgICAgICBub3hkYW1hZ2UgICAgICAgZGlzYWJsZSB4ZGFtYWdlIHBvbGxpbmcgaGludHMuCi0gICAgICAgICAgICAgICAgICAgICAgIHhkX2FyZWE6QSAgICAgICBzZXQgLXhkX2FyZWEgbWF4IHBpeGVsIGFyZWEgdG8gIkEiCi0gICAgICAgICAgICAgICAgICAgICAgIHhkX21lbTpmICAgICAgICBzZXQgLXhkX21lbSByZW1lbWJyYW5jZSB0byAiZiIKLSAgICAgICAgICAgICAgICAgICAgICAgZnM6ZnJhYyAgICAgICAgIHNldCAtZnMgZnJhY3Rpb24gdG8gImZyYWMiLCBlLmcuIDAuNQotICAgICAgICAgICAgICAgICAgICAgICBnYXBzOm4gICAgICAgICAgc2V0IC1nYXBzIHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIGdyb3c6biAgICAgICAgICBzZXQgLWdyb3cgdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgZnV6ejpuICAgICAgICAgIHNldCAtZnV6eiB0byBuLgotICAgICAgICAgICAgICAgICAgICAgICBzbmFwZmIgICAgICAgICAgZW5hYmxlICAtc25hcGZiIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vc25hcGZiICAgICAgICBkaXNhYmxlIC1zbmFwZmIgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmI6c3RyICAgICAgIHNldCAtcmF3ZmIgbW9kZSB0byAic3RyIi4KLSAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0X2FjY2VsOmYgIHNldCB1aW5wdXRfYWNjZWwgdG8gZi4KLSAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0X3RocmVzaDpuIHNldCB1aW5wdXRfdGhyZXNoIHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF9yZXNldDpuICBzZXQgdWlucHV0X3Jlc2V0IHRvIG4gbXMuCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF9hbHdheXM6biBzZXQgdWlucHV0X2Fsd2F5cyB0byAxLzAuCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzaXZlOm4gICBzZXQgTGliVk5DU2VydmVyIC1wcm9ncmVzc2l2ZSBzbGljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IHBhcmFtZXRlciB0byBuLgotICAgICAgICAgICAgICAgICAgICAgICBkZXNrdG9wOnN0ciAgICAgc2V0IC1kZXNrdG9wIG5hbWUgdG8gc3RyIGZvciBuZXcgY2xpZW50cwotLgotICAgICAgICAgICAgICAgICAgICAgICByZmJwb3J0Om4gICAgICAgc2V0IC1yZmJwb3J0IHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vc2F2ZXIgICAgICBlbmFibGUgIC1tYWNub3NhdmVyIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY3NhdmVyICAgICAgICBkaXNhYmxlIC1tYWNub3NhdmVyIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vd2FpdCAgICAgICBlbmFibGUgIC1tYWNub3dhaXQgIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY3dhaXQgICAgICAgICBkaXNhYmxlIC1tYWNub3dhaXQgIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY3doZWVsOm4gICAgICBzZXQgLW1hY3doZWVsIHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vc3dhcCAgICAgICBlbmFibGUgIC1tYWNub3N3YXAgbW91c2UgYnV0dG9uIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY3N3YXAgICAgICAgICBkaXNhYmxlIC1tYWNub3N3YXAgbW91c2UgYnV0dG9uIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vcmVzaXplICAgICBlbmFibGUgIC1tYWNub3Jlc2l6ZSBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBtYWNyZXNpemUgICAgICAgZGlzYWJsZSAtbWFjbm9yZXNpemUgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbWFjaWNvbmFuaW06biAgIHNldCAtbWFjaWNvbmFuaW0gdG8gbi4KLSAgICAgICAgICAgICAgICAgICAgICAgbWFjbWVudSAgICAgICAgIGVuYWJsZSAgLW1hY21lbnUgIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vbWVudSAgICAgICBkaXNhYmxlIC1tYWNtZW51ICBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBtYWN1c2tiZCAgICAgICAgZW5hYmxlICAtbWFjdXNrYmQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbWFjbm91c2tiZCAgICAgIGRpc2FibGUgLW1hY3Vza2JkIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGh0dHBwb3J0Om4gICAgICBzZXQgLWh0dHBwb3J0IHRvIG4uCi0gICAgICAgICAgICAgICAgICAgICAgIGh0dHBkaXI6ZGlyICAgICBzZXQgLWh0dHBkaXIgdG8gZGlyIChhbmQgZW5hYmxlIGh0dHApLgotICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVodHRwcHJveHkgICBlbmFibGUgIC1lbmFibGVodHRwcHJveHkgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9lbmFibGVodHRwcHJveHkgZGlzYWJsZSAtZW5hYmxlaHR0cHByb3h5IG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c3NoYXJlZCAgICAgZW5hYmxlICAtYWx3YXlzc2hhcmVkIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYWx3YXlzc2hhcmVkICAgZGlzYWJsZSAtYWx3YXlzc2hhcmVkIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heSBpbnRlcmZlcmUgd2l0aCBvdGhlciBvcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICBuZXZlcnNoYXJlZCAgICAgIGVuYWJsZSAgLW5ldmVyc2hhcmVkIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbmV2ZXJzaGFyZWQgICAgZGlzYWJsZSAtbmV2ZXJzaGFyZWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5IGludGVyZmVyZSB3aXRoIG90aGVyIG9wdGlvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgIGRvbnRkaXNjb25uZWN0ICAgZW5hYmxlICAtZG9udGRpc2Nvbm5lY3QgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9kb250ZGlzY29ubmVjdCBkaXNhYmxlIC1kb250ZGlzY29ubmVjdCBtb2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXkgaW50ZXJmZXJlIHdpdGggb3RoZXIgb3B0aW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfeGV2ZW50cyAgIGVuYWJsZSAgZGVidWdnaW5nIFggZXZlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3hldmVudHMgZGlzYWJsZSBkZWJ1Z2dpbmcgWCBldmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3hkYW1hZ2UgICBlbmFibGUgIGRlYnVnZ2luZyBYIERBTUFHRSBtZWNoYW5pc20uCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfeGRhbWFnZSBkaXNhYmxlIGRlYnVnZ2luZyBYIERBTUFHRSBtZWNoYW5pc20uCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3dpcmVmcmFtZSBlbmFibGUgICBkZWJ1Z2dpbmcgd2lyZWZyYW1lIG1lY2hhbmlzbS4KLSAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z193aXJlZnJhbWUgZGlzYWJsZSBkZWJ1Z2dpbmcgd2lyZWZyYW1lIG1lY2hhbmlzbS4KLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc2Nyb2xsICAgIGVuYWJsZSAgZGVidWdnaW5nIHNjcm9sbGNvcHkgbWVjaGFuaXNtLgotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3Njcm9sbCAgZGlzYWJsZSBkZWJ1Z2dpbmcgc2Nyb2xsY29weSBtZWNoYW5pc20uCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3RpbGVzICAgICBlbmFibGUgIC1kZWJ1Z190aWxlcwotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3RpbGVzICAgZGlzYWJsZSAtZGVidWdfdGlsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfZ3JhYnMgICAgIGVuYWJsZSAgLWRlYnVnX2dyYWJzCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfZ3JhYnMgICBkaXNhYmxlIC1kZWJ1Z19ncmFicwotICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zZWwgICAgICAgZW5hYmxlICAtZGVidWdfc2VsCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfc2VsICAgICBkaXNhYmxlIC1kZWJ1Z19zZWwKLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbmNhY2hlICAgIGVuYWJsZSAgLWRlYnVnX25jYWNoZQotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX25jYWNoZSAgZGlzYWJsZSAtZGVidWdfbmNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgIGRiZyAgICAgICAgICAgICBlbmFibGUgIC1kYmcgY3Jhc2ggc2hlbGwKLSAgICAgICAgICAgICAgICAgICAgICAgbm9kYmcgICAgICAgICAgIGRpc2FibGUgLWRiZyBjcmFzaCBzaGVsbAotCi0gICAgICAgICAgICAgICAgICAgICAgIG5vcmVtb3RlICAgICAgICBkaXNhYmxlIHRoZSAtcmVtb3RlIGNvbW1hbmQgcHJvY2Vzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbm5vdCBiZSB0dXJuZWQgYmFjayBvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBiY3hfeGF0dGFjaDpzdHIgIFRoaXMgcmVtb3RlIGNvbnRyb2wgY29tbWFuZCBpcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIHdpdGggdGhlIEJBUkNPIHhhdHRhY2ggcHJvZ3JhbSBvciB0aGUgeDJ4IHByb2dyYW0uCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgcHJvZ3JhbXMgYXJlIGZvciAncG9pbnRlciBhbmQga2V5Ym9hcmQnCi0gICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmcgYmV0d2VlbiBzZXBhcmF0ZSBYIGRpc3BsYXlzLiAgSW4gZ2VuZXJhbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgdHdvIGRpc3BsYXlzIGFyZSB1c3VhbGx5IG5lYXJieSwgZS5nLiBvbiB0aGUgc2FtZSBkZXNrLAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gc2hhcmUgYSBzaW5nbGUgcG9pbnRlciBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQgYmV0d2VlbiB0aGVtLiAgVGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGFuIGVkZ2UgYW5kIHRoZW4gdGhlIG1vdXNlIHBvaW50ZXIgYXBwZWFycyB0byAnanVtcCcKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG90aGVyIGRpc3BsYXkgc2NyZWVuLiAgVGh1cyBpdCBlbXVsYXRlcyB3aGF0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIFggc2VydmVyIHdvdWxkIGRvIGZvciB0d28gc2NyZWVucyAoZS5nLiA6MC4wIGFuZAotICAgICAgICAgICAgICAgICAgICAgICA6MC4xKSBUaGUgaWxsdXNpb24gb2YgYSBzaW5nbGUgWHNlcnZlciB3aXRoIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbnMgaXMgYWNoaWV2ZWQgYnkgZm9yd2FyZGluZyBldmVudHMgdG8gdGhlIDJuZAotICAgICAgICAgICAgICAgICAgICAgICBvbmUgdmlhIHRoZSBYVEVTVCBleHRlbnNpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgV2hhdCB0aGUgeDExdm5jIGJjeF94YXR0YWNoIGNvbW1hbmQgZG9lcyBpcyB0byBwZXJmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgIHNvbWUgcG9pbnRlciBtb3ZlbWVudHMgdG8gdHJ5IHRvIElORFVDRSB4YXR0YWNoL3gyeAotICAgICAgICAgICAgICAgICAgICAgICB0byAnanVtcCcgdG8gdGhlIG90aGVyIGRpc3BsYXkuICBJbiB3aGF0IGZvbGxvd3MgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICdtYXN0ZXInIGRpc3BsYXkgcmVmZXJzIHRvIHRoZSBvbmUgdGhhdCB3aGVuIGl0IGhhcwotICAgICAgICAgICAgICAgICAgICAgICAnZm9jdXMnIGl0IGlzIGJhc2ljYWxseSBkb2luZyBub3RoaW5nIGJlc2lkZXMgd2F0Y2hpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtb3VzZSB0byBnbyBvdmVyIGFuIGVkZ2UuICBUaGUgJ3NsYXZlJwotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHJlZmVycyB0byB0aGUgb25lIHRvIHdoaWNoIHRoZSBtb3VzZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQgaXMgcmVkaXJlY3RlZCB0byBvbmNlIGFuIGVkZ2UgaW4gdGhlIG1hc3RlcgotICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBjcm9zc2VkLiAgTm90ZSB0aGF0IHRoZSB4MTF2bmMgZXhlY3V0aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBiY3hfeGF0dGFjaCBjb21tYW5kIE1VU1QgYmUgdGhlIG9uZSBjb25uZWN0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICptYXN0ZXIqIGRpc3BsYXkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgQWxzbyBub3RlIHRoYXQgd2hlbiBpbnB1dCBpcyBiZWluZyByZWRpcmVjdGVkICh2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgWFRFU1QpIGZyb20gdGhlIG1hc3RlciBkaXNwbGF5IHRvIHRoZSBzbGF2ZSBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIGRpc3BsYXkncyBwb2ludGVyIGFuZCBrZXlib2FyZCBhcmUgKmdyYWJiZWQqCi0gICAgICAgICAgICAgICAgICAgICAgIGJ5IHhhdHRhY2gveDJ4LiAgeDExdm5jIGNhbiB1c2UgdGhpcyBpbmZvIHRvIHZlcmlmeSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIvc2xhdmUgbW9kZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlIGNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlICJpZm5lZWRlZCIgb3B0aW9uIChzZWUgYmVsb3cpCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgaW5pdGlhbCBncmFiIHN0YXRlIGlzIHRoYXQgb2YgdGhlIGRlc2lyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgc3RhdGUsIHRoZW4gbm8gcG9pbnRlciBtb3ZlbWVudHMgYXJlIGluamVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCAiRE9ORSxHUkFCX09LIiBpcyByZXR1cm5lZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAic3RyIiBtdXN0IGNvbnRhaW4gb25lIG9mICJ1cCIsICJkb3duIiwgImxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICBvciAicmlnaHQiIHRvIGluZGljYXRlIHRoZSBkaXJlY3Rpb24gb2YgdGhlICdqdW1wJy4KLSAgICAgICAgICAgICAgICAgICAgICAgInN0ciIgbXVzdCBhbHNvIGNvbnRhaW4gb25lIG9mICJtYXN0ZXJfdG9fc2xhdmUiCi0gICAgICAgICAgICAgICAgICAgICAgIG9yICJzbGF2ZV90b19tYXN0ZXIiIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGluZHVjZWQgYnkgdGhlIGp1bXAuICBVc2UgIk0yUyIgYW5kICJTMk0iCi0gICAgICAgICAgICAgICAgICAgICAgIGFzIHNob3J0ZXIgYWxpYXNlcy4KLQotICAgICAgICAgICAgICAgICAgICAgICAic3RyIiBtYXkgYmUgYSAiKyIgc2VwYXJhdGVkIGxpc3Qgb2YgYWRkaXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICB0dW5pbmcgb3B0aW9ucy4gIFRoZSAic2hpZnQ9biIgb3B0aW9uIGluZGljYXRlcyBhbgotICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgc2hpZnQgcG9zaXRpb24gYXdheSBmcm9tICgwLDApIChkZWZhdWx0IDIwKS4KLSAgICAgICAgICAgICAgICAgICAgICAgImZpbmFsPXgreSIgc3BlY2lmaWVzIHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBlbmQgb2YgdGhlIG5vcm1hbCBtb3ZlIHNlcXVlbmNlOyBkZWZhdWx0IDMwKzMwLgotICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFfbW92ZT14K3kiIG1lYW5zIHRvIGRvIG9uZSBtb3JlIHBvaW50ZXIgbW92ZQotICAgICAgICAgICAgICAgICAgICAgICBhZnRlciAiZmluYWwiIHRvIHgreS4gICJkdD1uIiBzZXRzIHRoZSBzbGVlcCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBvaW50ZXIgbW92ZXMgKGRlZmF1bHQ6IDQwbXMpCi0gICAgICAgICAgICAgICAgICAgICAgICJyZXRyeT1uIiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdyYWIgc3RhdGUgY2hhbmdlIGZhaWxzLiAiaWZuZWVkZWQiIG1lYW5zIHRvIG5vdAotICAgICAgICAgICAgICAgICAgICAgICBhcHBseSB0aGUgcG9pbnRlciBtb3ZlbWVudHMgaWYgdGhlIGluaXRpYWwgZ3JhYiBzdGF0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG9mIHRoZSBkZXNpcmVkIGZpbmFsIHN0YXRlLiAibm9ncmFiY2hlY2siIG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIG5vdCBjaGVjayBpZiB0aGUgZ3JhYiBzdGF0ZSBjaGFuZ2VkIGFzIGV4cGVjdGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGFwcGx5IHRoZSBwb2ludGVyIG1vdmVtZW50cyAoZGVmYXVsdCBpcyB0byBjaGVjawotICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ3JhYiBzdGF0ZXMuKQotCi0gICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3BlY2lmeSAidXAiLCBldGMuLCB0byBiY3hfeGF0dGFjaAotICAgICAgICAgICAgICAgICAgICAgICBub3RoaW5nIHdpbGwgYmUgYXR0ZW1wdGVkIGFuZCB0aGUgY29tbWFuZCByZXR1cm5zCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJpbmcgRkFJTCxOT19ESVJFQ1RJT05fU1BFQ0lGSUVELiAgSWYgeW91IGRvCi0gICAgICAgICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZ5ICJtYXN0ZXJfdG9fc2xhdmUiIG9yICJNMlMiLCBldGMuLCB0bwotICAgICAgICAgICAgICAgICAgICAgICBiY3hfeGF0dGFjaCBub3RoaW5nIHdpbGwgYmUgYXR0ZW1wdGVkIGFuZCB0aGUgY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIHRoZSBzdHJpbmcgRkFJTCxOT19NT0RFX0NIQU5HRV9TUEVDSUZJRUQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgY29udGFpbiAiRE9ORSIuCi0gICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgIkRPTkUsR1JBQl9PSyIgaWYgdGhlIGdyYWIgc3RhdGUgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICBhcyBleHBlY3RlZCAob3IgaWYgImlmbmVlZGVkIiB3YXMgc3VwcGxpZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgd2FzIGFscmVhZHkgdGhlIGRlc2lyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgb25lLikgIElmIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgd2FzIGluY29ycmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBmaW5hbCBncmFiIHN0YXRlIHdhcyBjb3JyZWN0IHRoZW4gaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIkRPTkUsR1JBQl9GQUlMX0lOSVQiLiAgSWYgdGhlIGluaXRpYWwgZ3JhYiBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICB3YXMgY29ycmVjdCwgYnV0IHRoZSBmaW5hbCBncmFiIHN0YXRlIHdhcyBpbmNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBpdCBpcyAiRE9ORSxHUkFCX0ZBSUxfRklOQUwiLiAgSWYgYm90aCBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0IGl0IHdpbGwgYmUgIkRPTkUsR1JBQl9GQUlMIi4gIFVuZGVyIGdyYWIKLSAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSB0aGUgc3RyaW5nIHdpbGwgYmUgZm9sbG93ZWQgYnkgIjpwMSxrMS1wMixrMiIKLSAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgIHAxLGsxIGluZGljYXRlcyB0aGUgaW5pdGlhbCBwb2ludGVyIGFuZCBrZXlib2FyZAotICAgICAgICAgICAgICAgICAgICAgICBncmFiIHN0YXRlcyBhbmQgcDIsazIgdGhlIGZpbmFsIG9uZXMuIElmIEdSQUJfRkFJTCBvcgotICAgICAgICAgICAgICAgICAgICAgICBHUkFCX0ZBSUxfRklOQUwgb2NjdXJzLCB0aGUgYWN0aW9uIHdpbGwgYmUgcmV0cmllZCB1cAotICAgICAgICAgICAgICAgICAgICAgICB0byAzIHRpbWVzOyB0cnlpbmcgdG8gcmVzZXQgdGhlIHN0YXRlIGFuZCBzbGVlcGluZyBhCi0gICAgICAgICAgICAgICAgICAgICAgIGJpdCBiZXR3ZWVuIGVhY2ggdHJ5LiAgU2V0IHJldHJ5PW4gdG8gYWRqdXN0IHRoZSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgcmV0cmllcywgemVybyB0byBkaXNhYmxlIHJldHJpZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtUiBiY3hfeGF0dGFjaDpkb3duK00yUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLVIgYmN4X3hhdHRhY2g6dXArUzJNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtUiBiY3hfeGF0dGFjaDp1cCtTMk0rbm9ncmFiY2hlY2srZHQ9MzAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC1SIGJjeF94YXR0YWNoOmRvd24rTTJTK2V4dHJhX21vdmU9MTAwKzEwMAotCi0gICAgICAgICAgICAgICAgICAgICAgIG9yIHVzZSAtUSBpbnN0ZWFkIG9mIC1SIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgdGV4dC4KLQotICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgdGhlIGJjeF94YXR0YWNoOnN0ciBkZXNjcmlwdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICBUaGUgdm5jY29ubmVjdCgxKSBjb21tYW5kIGZyb20gc3RhbmRhcmQgVk5DCi0gICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMgbWF5IGFsc28gYmUgdXNlZCBpZiBzdHJpbmcgaXMgcHJlZml4ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAiY21kPSIgRS5nLiAndm5jY29ubmVjdCBjbWQ9c3RvcCcuICBVbmRlciBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bXN0YW5jZXMgeHByb3AoMSkgY2FuIHVzZWQgaWYgaXQgc3VwcG9ydHMgLXNldAotICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSBGQVEpLgotCi0gICAgICAgICAgICAgICAgICAgICAgIElmICItY29ubmVjdCAvcGF0aC90by9maWxlIiBoYXMgYmVlbiBzdXBwbGllZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyB4MTF2bmMgc2VydmVyIHRoZW4gdGhhdCBmaWxlIGNhbiBiZSB1c2VkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBjaGFubmVsICh0aGlzIGlzIHRoZSBvbmx5IHdheSB0byByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBvbmUgb2YgbWFueSB4MTF2bmMncyBwb2xsaW5nIHRoZSBzYW1lIFggZGlzcGxheSkKLSAgICAgICAgICAgICAgICAgICAgICAgU2ltcGx5IHJ1bjogJ3gxMXZuYyAtY29ubmVjdCAvcGF0aC90by9maWxlIC1yZW1vdGUgLi4uJwotICAgICAgICAgICAgICAgICAgICAgICBvciB5b3UgY2FuIGRpcmVjdGx5IHdyaXRlIHRvIHRoZSBmaWxlIHZpYSBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgbGlrZTogImVjaG8gY21kPXN0b3AgPiAvcGF0aC90by9maWxlIiwgZXRjLgotCi0tcXVlcnkgdmFyaWFibGUgICAgICAgIExpa2UgLXJlbW90ZSwgZXhjZXB0IGp1c3QgcXVlcnkgdGhlIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSIuICAiLVEiIGlzIGFuIGFsaWFzIGZvciAiLXF1ZXJ5Ii4KLSAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgcXVlcmllcyBjYW4gYmUgZG9uZSBieSBzZXBhcmF0aW5nIHZhcmlhYmxlcwotICAgICAgICAgICAgICAgICAgICAgICBieSBjb21tYXMsIGUuZy4gLXF1ZXJ5IHZhcjEsdmFyMi4gVGhlIHJlc3VsdHMgY29tZQotICAgICAgICAgICAgICAgICAgICAgICBiYWNrIGluIHRoZSBmb3JtIGFucz12YXIxOnZhbHVlMSxhbnM9dmFyMjp2YWx1ZTIsLi4uCi0gICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBJZiBhIHZhcmlhYmxlIGlzIHJlYWQtb25seSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgY29tZXMgYmFjayB3aXRoIHByZWZpeCAiYXJvPSIgaW5zdGVhZCBvZiAiYW5zPSIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgU29tZSAtcmVtb3RlIGNvbW1hbmRzIGFyZSBwdXJlIGFjdGlvbnMgdGhhdCBkbyBub3QgbWFrZQotICAgICAgICAgICAgICAgICAgICAgICBzZW5zZSBhcyB2YXJpYWJsZXMsIGUuZy4gInN0b3AiIG9yICJkaXNjb25uZWN0IiwgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlc2UgY2FzZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzICJOL0EiLiAgVG8gZGlyZWN0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgc3RyYWlnaHQgdG8gdGhlIFgxMVZOQ19SRU1PVEUgcHJvcGVydHkgb3IgY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHVzZSAicXJ5PS4uLiIgaW5zdGVhZCBvZiAiY21kPS4uLiIKLQotICAgICAgICAgICAgICAgICAgICAgICBhbnM9IHN0b3AgcXVpdCBleGl0IHNodXRkb3duIHBpbmcgcmVzZW5kX2N1dGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfY2xpcGJvYXJkIHJlc2VuZF9wcmltYXJ5IGJsYWNrZW4gemVybyByZWZyZXNoCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IGNsb3NlIGRpc2Nvbm5lY3QgaWRfY21kIGlkIHNpZCB3YWl0bWFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgIG5vd2FpdG1hcHBlZCBjbGlwIGZsYXNoY21hcCBub2ZsYXNoY21hcCBzaGlmdGNtYXAKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZWNvbG9yIG5vdHJ1ZWNvbG9yIG92ZXJsYXkgbm9vdmVybGF5IG92ZXJsYXlfY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfeWVzY3Vyc29yIG5vb3ZlcmxheV9ub2N1cnNvciBub292ZXJsYXlfY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgICAgIG5vb3ZlcmxheV95ZXNjdXJzb3Igb3ZlcmxheV9ub2N1cnNvciA4dG8yNCBubzh0bzI0Ci0gICAgICAgICAgICAgICAgICAgICAgIDh0bzI0X29wdHMgMjR0bzMyIG5vMjR0bzMyIHZpc3VhbCBzY2FsZSBzY2FsZV9jdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgbm92aWV3b25seSBzaGFyZWQgbm9zaGFyZWQgZm9yZXZlciBub2ZvcmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgb25jZSB0aW1lb3V0IHRpZ2h0ZmlsZXhmZXIgbm90aWdodGZpbGV4ZmVyIHVsdHJhZmlsZXhmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgbm91bHRyYWZpbGV4ZmVyIHJmYnZlcnNpb24gZGVueSBsb2NrIG5vZGVueSB1bmxvY2sgYXZhaGkKLSAgICAgICAgICAgICAgICAgICAgICAgbWRucyB6ZXJvY29uZiBub2F2YWhpIG5vbWRucyBub3plcm9jb25mIGNvbm5lY3QgcHJveHkKLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dvbmNlIGFsbG93IG5vaXB2NiBpcHY2IG5vaXB2NCBpcHY0IG5vNiA2IGxvY2FsaG9zdAotICAgICAgICAgICAgICAgICAgICAgICBub2xvY2FsaG9zdCBsaXN0ZW4gbG9va3VwIG5vbG9va3VwIGFjY2VwdCBhZnRlcmFjY2VwdAotICAgICAgICAgICAgICAgICAgICAgICBnb25lIHNobSBub3NobSBmbGlwYnl0ZW9yZGVyIG5vZmxpcGJ5dGVvcmRlciBvbmV0aWxlCi0gICAgICAgICAgICAgICAgICAgICAgIG5vb25ldGlsZSBzb2xpZF9jb2xvciBzb2xpZCBub3NvbGlkIGJsYWNrb3V0IHhpbmVyYW1hCi0gICAgICAgICAgICAgICAgICAgICAgIG5veGluZXJhbWEgeHRyYXAgbm94dHJhcCB4cmFuZHIgbm94cmFuZHIgeHJhbmRyX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlIHBhZGdlb20gcXVpZXQgcSBub3F1aWV0IG1vZHR3ZWFrIG5vbW9kdHdlYWsgeGtiCi0gICAgICAgICAgICAgICAgICAgICAgIG5veGtiIGNhcHNsb2NrIG5vY2Fwc2xvY2sgc2tpcF9sb2Nra2V5cyBub3NraXBfbG9ja2tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9rZXljb2RlcyBzbG9wcHlfa2V5cyBub3Nsb3BweV9rZXlzIHNraXBfZHVwcwotICAgICAgICAgICAgICAgICAgICAgICBub3NraXBfZHVwcyBhZGRfa2V5c3ltcyBub2FkZF9rZXlzeW1zIGNsZWFyX21vZHMKLSAgICAgICAgICAgICAgICAgICAgICAgbm9jbGVhcl9tb2RzIGNsZWFyX2tleXMgbm9jbGVhcl9rZXlzIGNsZWFyX2FsbAotICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9sb2NrcyBrZXlzdGF0ZSByZW1hcCByZXBlYXQgbm9yZXBlYXQgZmIgbm9mYiBiZWxsCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYmVsbCBzZW5kYmVsbCBzZWwgbm9zZWwgcHJpbWFyeSBub3ByaW1hcnkgc2V0cHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICBub3NldHByaW1hcnkgY2xpcGJvYXJkIG5vY2xpcGJvYXJkIHNldGNsaXBib2FyZAotICAgICAgICAgICAgICAgICAgICAgICBub3NldGNsaXBib2FyZCBzZWxkaXIgY3Vyc29yc2hhcGUgbm9jdXJzb3JzaGFwZQotICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Jwb3Mgbm9jdXJzb3Jwb3MgY3Vyc29yX2RyYWcgbm9jdXJzb3JfZHJhZyBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jdXJzb3Igbm9zaG93X2N1cnNvciBub2N1cnNvciBhcnJvdyB4Zml4ZXMgbm94Zml4ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgeGRhbWFnZSBub3hkYW1hZ2UgeGRfYXJlYSB4ZF9tZW0gYWxwaGFjdXQgYWxwaGFmcmFjCi0gICAgICAgICAgICAgICAgICAgICAgIGFscGhhcmVtb3ZlIG5vYWxwaGFyZW1vdmUgYWxwaGFibGVuZCBub2FscGhhYmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgeHdhcnBwb2ludGVyIHh3YXJwIG5veHdhcnBwb2ludGVyIG5veHdhcnAgYWx3YXlzX2luamVjdAotICAgICAgICAgICAgICAgICAgICAgICBub2Fsd2F5c19pbmplY3QgYnV0dG9ubWFwIGRyYWdnaW5nIG5vZHJhZ2dpbmcgbmNhY2hlX2NyCi0gICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX2NyIG5jYWNoZV9ub19tb3ZlcmFpc2Ugbm9uY2FjaGVfbm9fbW92ZXJhaXNlCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9ub19kdGNoYW5nZSBub25jYWNoZV9ub19kdGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fcm9vdHBpeG1hcCBub25jYWNoZV9ub19yb290cGl4bWFwCi0gICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9yZXNldF9yb290cGl4bWFwIG5jcnAgbmNhY2hlX2tlZXBfYW5pbXMKLSAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfa2VlcF9hbmltcyBuY2FjaGVfb2xkX3dtIG5vbmNhY2hlX29sZF93bQotICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfcGFkIG5jYWNoZSBub25jYWNoZSBuY2FjaGVfc2l6ZSBkZWJ1Z19uY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19uY2FjaGUgd2lyZWZyYW1lX21vZGUgd2lyZWZyYW1lIHdmIG5vd2lyZWZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgIG5vd2Ygd2lyZWZyYW1lbG9jYWwgd2ZsIG5vd2lyZWZyYW1lbG9jYWwgbm93ZmwKLSAgICAgICAgICAgICAgICAgICAgICAgd2lyZWNvcHlyZWN0IHdjciBub3dpcmVjb3B5cmVjdCBub3djciBzY3JfYXJlYQotICAgICAgICAgICAgICAgICAgICAgICBzY3Jfc2tpcCBzY3JfaW5jIHNjcl9rZXlzIHNjcl90ZXJtIHNjcl9rZXlyZXBlYXQKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Bhcm1zIHNjcm9sbGNvcHlyZWN0IHNjciBub3Njcm9sbGNvcHlyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIG5vc2NyIGZpeHNjcmVlbiBub3hyZWNvcmQgeHJlY29yZCByZXNldF9yZWNvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tb2RlIHBtIGlucHV0X3NraXAgYWxsaW5wdXQgbm9hbGxpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lYWdlcmx5IG5vaW5wdXRfZWFnZXJseSBpbnB1dCBncmFia2JkIG5vZ3JhYmtiZAotICAgICAgICAgICAgICAgICAgICAgICBncmFicHRyIG5vZ3JhYnB0ciBncmFiYWx3YXlzIG5vZ3JhYmFsd2F5cyBncmFibG9jYWwKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lucHV0IHNzbHRpbWVvdXQgc3BlZWRzIHdtZHQgZGVidWdfcG9pbnRlciBkcAotICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3BvaW50ZXIgbm9kcCBkZWJ1Z19rZXlib2FyZCBkayBub2RlYnVnX2tleWJvYXJkCi0gICAgICAgICAgICAgICAgICAgICAgIG5vZGsga2V5Y29kZSBrZXlzeW0gcHRyIGZha2VidXR0b25ldmVudCBzbGVlcCBnZXRfeHByb3AKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0X3hwcm9wIHdpbmluZm8gYmN4X3hhdHRhY2ggZGVmZXJ1cGRhdGUgZGVmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0ZGVmZXIgZXh0cmFfZmJ1ciB3YWl0X3VpIHdhaXRfYm9nIG5vd2FpdF9ib2cKLSAgICAgICAgICAgICAgICAgICAgICAgc2xvd19mYiB4cmVmcmVzaCB3YWl0IHJlYWR0aW1lb3V0IG5hcCBub25hcCBzYgotICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5fYmxhbmsgZmJwbSBub2ZicG0gZHBtcyBub2RwbXMgY2xpZW50ZHBtcwotICAgICAgICAgICAgICAgICAgICAgICBub2NsaWVudGRwbXMgZm9yY2VkcG1zIG5vZm9yY2VkcG1zIG5vc2VydmVyZHBtcwotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJkcG1zIG5vdWx0cmFleHQgdWx0cmFleHQgY2hhdHdpbmRvdyBub2NoYXR3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhdG9uIGNoYXRvZmYgZnMgZ2FwcyBncm93IGZ1enogc25hcGZiIG5vc25hcGZiCi0gICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiIHVpbnB1dF9hY2NlbCB1aW5wdXRfdGhyZXNoIHVpbnB1dF9yZXNldAotICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXRfYWx3YXlzIHByb2dyZXNzaXZlIHJmYnBvcnQgaHR0cCBub2h0dHAgaHR0cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgaHR0cGRpciBlbmFibGVodHRwcHJveHkgbm9lbmFibGVodHRwcHJveHkgYWx3YXlzc2hhcmVkCi0gICAgICAgICAgICAgICAgICAgICAgIG5vYWx3YXlzc2hhcmVkIG5ldmVyc2hhcmVkIG5vYWx3YXlzc2hhcmVkIGRvbnRkaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIG5vZG9udGRpc2Nvbm5lY3QgZGVza3RvcCBkZWJ1Z194ZXZlbnRzIG5vZGVidWdfeGV2ZW50cwotICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z194ZXZlbnRzIGRlYnVnX3hkYW1hZ2Ugbm9kZWJ1Z194ZGFtYWdlCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3hkYW1hZ2UgZGVidWdfd2lyZWZyYW1lIG5vZGVidWdfd2lyZWZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3dpcmVmcmFtZSBkZWJ1Z19zY3JvbGwgbm9kZWJ1Z19zY3JvbGwgZGVidWdfc2Nyb2xsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3RpbGVzIGRidCBub2RlYnVnX3RpbGVzIG5vZGJ0IGRlYnVnX3RpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2dyYWJzIG5vZGVidWdfZ3JhYnMgZGVidWdfc2VsIG5vZGVidWdfc2VsIGRiZwotICAgICAgICAgICAgICAgICAgICAgICBub2RiZyBtYWNub3NhdmVyIG1hY3NhdmVyIG5vbWFjbm9zYXZlciBtYWNub3dhaXQgbWFjd2FpdAotICAgICAgICAgICAgICAgICAgICAgICBub21hY25vd2FpdCBtYWN3aGVlbCBtYWNub3N3YXAgbWFjc3dhcCBub21hY25vc3dhcAotICAgICAgICAgICAgICAgICAgICAgICBtYWNub3Jlc2l6ZSBtYWNyZXNpemUgbm9tYWNub3Jlc2l6ZSBtYWNpY29uYW5pbSBtYWNtZW51Ci0gICAgICAgICAgICAgICAgICAgICAgIG1hY25vbWVudSBub21hY21lbnUgbWFjdXNrYmQgbm9tYWN1c2tiZCBub3JlbW90ZQotCi0gICAgICAgICAgICAgICAgICAgICAgIGFybz0gIG5vb3AgZGlzcGxheSB2bmNkaXNwbGF5IGljb25fbW9kZSBhdXRvcG9ydAotICAgICAgICAgICAgICAgICAgICAgICBsb29wIGxvb3BiZyBkZXNrdG9wbmFtZSBndWVzc19kZXNrdG9wIGd1ZXNzX2RidXMKLSAgICAgICAgICAgICAgICAgICAgICAgaHR0cF91cmwgYXV0aCB4YXV0aCB1c2VycyByb290c2hpZnQgY2xpcHNoaWZ0IHNjYWxlX3N0cgotICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfeCBzY2FsZWRfeSBzY2FsZV9udW1lciBzY2FsZV9kZW5vbSBzY2FsZV9mYWNfeAotICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9mYWNfeSBzY2FsaW5nX2JsZW5kIHNjYWxpbmdfbm9tdWx0NCBzY2FsaW5nX3BhZAotICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nX2ludGVycG9sYXRlIGluZXRkIHByaXZyZW1vdGUgdW5zYWZlIHNhZmVyIG5vY21kcwotICAgICAgICAgICAgICAgICAgICAgICBwYXNzd2RmaWxlIHVuaXhwdyB1bml4cHdfbmlzIHVuaXhwd19saXN0IHNzbCBzc2xfcGVtCi0gICAgICAgICAgICAgICAgICAgICAgIHNzbHZlcmlmeSBzdHVubmVsIHN0dW5uZWxfcGVtIGh0dHBzIGh0dHBzcmVkaXIgdXNlcHcKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdfc2htIGxvZ2ZpbGUgbyBmbGFnIHJtZmxhZyByYyBub3JjIGggaGVscCBWIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgbGFzdG1vZCBiZyBzaWdwaXBlIHRocmVhZHMgcmVhZHJhdGUgbmV0cmF0ZSBuZXRsYXRlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgIHBpcGVpbnB1dCBjbGllbnRzIGNsaWVudF9jb3VudCBwaWQgZXh0X3h0ZXN0IGV4dF94dHJhcAotICAgICAgICAgICAgICAgICAgICAgICBleHRfeHJlY29yZCBleHRfeGtiIGV4dF94c2htIGV4dF94aW5lcmFtYSBleHRfb3ZlcmxheQotICAgICAgICAgICAgICAgICAgICAgICBleHRfeGZpeGVzIGV4dF94ZGFtYWdlIGV4dF94cmFuZHIgcm9vdHdpbiBudW1fYnV0dG9ucwotICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fbWFzayBtb3VzZV94IG1vdXNlX3kgZ3JhYl9zdGF0ZSBwb2ludGVyX3BvcwotICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3ggcG9pbnRlcl95IHBvaW50ZXJfc2FtZSBwb2ludGVyX3Jvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tYXNrIGJwcCBkZXB0aCBpbmRleGVkX2NvbG9yIGRweV94IGRweV95IHdkcHlfeAotICAgICAgICAgICAgICAgICAgICAgICB3ZHB5X3kgb2ZmX3ggb2ZmX3kgY2RweV94IGNkcHlfeSBjb2ZmX3ggY29mZl95IHJmYmF1dGgKLSAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dkIHZpZXdwYXNzd2QKLQotLVFEIHZhcmlhYmxlICAgICAgICAgICBKdXN0IGxpa2UgLXF1ZXJ5IHZhcmlhYmxlLCBidXQgcmV0dXJucyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmb3IgdGhhdCBwYXJhbWV0ZXIgKG5vIHJ1bm5pbmcgeDExdm5jIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zdWx0ZWQpCi0KLS1zeW5jICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCAtcmVtb3RlIGNvbW1hbmRzIGFyZSBydW4gYXN5bmNocm9ub3VzbHksIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgaXMsIHRoZSByZXF1ZXN0IGlzIHBvc3RlZCBhbmQgdGhlIHByb2dyYW0gaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgZXhpdHMuICBVc2UgLXN5bmMgdG8gaGF2ZSB0aGUgcHJvZ3JhbSB3YWl0IGZvciBhbgotICAgICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgeDExdm5jIHNlcnZlciB0aGF0IGNvbW1hbmQgd2FzCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCAoc29tZWhvdykuICBPbiB0aGUgb3RoZXIgaGFuZCAtcXVlcnkgcmVxdWVzdHMKLSAgICAgICAgICAgICAgICAgICAgICAgYXJlIGFsd2F5cyBwcm9jZXNzZWQgc3luY2hyb25vdXNseSBiZWNhdXNlIHRoZXkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvciB0aGUgYW5zd2VyLgotCi0gICAgICAgICAgICAgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGlmIGJvdGggLXJlbW90ZSBhbmQgLXF1ZXJ5IHJlcXVlc3RzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgLXJlbW90ZSBpcyBwcm9jZXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgKHN5bmNocm9ub3VzbHk6IG5vIG5lZWQgZm9yIC1zeW5jKSwgYW5kIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1xdWVyeSByZXF1ZXN0IGlzIHByb2Nlc3NlZCBpbiB0aGUgbm9ybWFsIHdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGEgcmVsaWFibGUgd2F5IHRvIHNlZSBpZiB0aGUgLXJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHdhcyBwcm9jZXNzZWQgYnkgcXVlcnlpbmcgZm9yIGFueSBuZXcgc2V0dGluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgaG93ZXZlciB0aGF0IHRoZXJlIGlzIHRpbWVvdXQgb2YgYSBmZXcgc2Vjb25kcwotICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaCkgc28gaWYgdGhlIHgxMXZuYyB0YWtlcyBsb25nZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGF0IHRvIHByb2Nlc3MgdGhlIHJlcXVlc3RzIHRoZSByZXF1ZXN0ZXIgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICB0aGluayB0aGF0IGEgZmFpbHVyZSBoYXMgdGFrZW4gcGxhY2UuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gd2FpdCAzLjUgc2Vjb25kcy4gIE9yIGlmIGNtZD1zdG9wCi0gICAgICAgICAgICAgICAgICAgICAgIG9ubHkgMS4wIHNlY29uZHMuICBJZiBjbWQgbWF0Y2hlcyAnc2NyaXB0OicgdGhlbiBpdAotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHdhaXQgdXAgdG8gMTAuMCBzZWNvbmRzLiAgU2V0IFgxMVZOQ19TWU5DX1RJTUVPVVQKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHlvdSB3YW50IGl0IHRvIHdhaXQuCi0KLS1xdWVyeV9yZXRyaWVzIHN0ciAgICAgSWYgYSBxdWVyeSBmYWlscyB0byBnZXQgYSByZXNwb25zZSBmcm9tIGFuIHgxMXZuYwotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsIHJldHJ5IHVwIHRvIG4gdGltZXMuICAic3RyIiBpcyBzcGVjaWZpZWQgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgbls6dF1bL21hdGNoXSAgT3B0aW9uYWxseSB0aGUgZGVsYXkgYmV0d2VlbiB0cmllcyBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgYmUgc3BlY2lmaWVkIGJ5ICJ0IiBhIGZsb2F0aW5nIHBvaW50IHRpbWUgKGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgMC41IHNlY29uZHMuKSAgTm90ZTogdGhlIHJlc3BvbnNlIGlzIG5vdCBjaGVja2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSBvciB3aGV0aGVyIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBxdWVyeSBzZW50LgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgcXVlcnkgInBpbmc6bXlzdHJpbmciIG1heSBiZSB1c2VkIHRvIGhlbHAgdW5pcXVlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZnkgdGhlIHF1ZXJ5LiAgT3B0aW9uYWxseSwgYSBtYXRjaGluZyBzdHJpbmcgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgYSAiLyIgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIHRoZSByZXN1bHQgdGV4dC4gIFVwIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIG4gcmV0cmllcyB3aWxsIHRha2UgcGxhY2UgdW50aWwgdGhlIG1hdGNoaW5nIHN0cmluZyBpcwotICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpbiB0aGUgb3V0cHV0IHRleHQuICBJZiB0aGUgbWF0Y2ggc3RyaW5nIGlzIG5ldmVyCi0gICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIGlzIDE7IGlmIHRoZSBtYXRjaCBpcwotICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpdCBleGl0cyB3aXRoIDAuICBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIHN0ZG91dAotICAgICAgICAgICAgICAgICAgICAgICBwcmludGVkIGZvciBlYWNoIHJldHJ5IChpLmUuIG11bHRpcGxlIGxpbmVzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRvIHN0ZG91dC4pCi0gICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IC1xdWVyeV9yZXRyaWVzIDQ6MS41L2dyYWJfc3RhdGUKLQotLXJlbW90ZV9wcmVmaXggc3RyICAgICBFbmFibGUgYSByZW1vdGUtY29udHJvbCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCBWTkMgY2xpZW50cy4gIHN0ciBpcyBhIG5vbi1lbXB0eSBzdHJpbmcuIElmIGEKLSAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudCBzZW5kcyByZmJDdXRUZXh0IGhhdmluZyB0aGUgcHJlZml4ICJzdHIiCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHBhcnQgYWZ0ZXIgaXQgaXMgcHJvY2Vzc2VkIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdmlhICd4MTF2bmMgLXJlbW90ZSAuLi4nLiAgSWYgaXQgYmVnaW5zIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgbmVpdGhlciAnY21kPScgbm9yICdxcnk9JyB0aGVuICdxcnk9JyBpcyBhc3N1bWVkLgotICAgICAgICAgICAgICAgICAgICAgICBBbnkgY29ycmVzcG9uZGluZyBvdXRwdXQgdGV4dCBmb3IgdGhhdCByZW1vdGUgY29udHJvbAotICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIHNlbnQgYmFjayB0byBhbGwgY2xpZW50IGFzIHJmYkN1dFRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXR1cm5lZCBvdXRwdXQgaXMgYWxzbyBwcmVmaXhlZCB3aXRoICJzdHIiLgotICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAtcmVtb3RlX3ByZWZpeCBET19USElTOgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBlbmFibGluZyAtcmVtb3RlX3ByZWZpeCBhbGxvd3MgdGhlIHJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICBWTkMgdmlld2VycyB0byBydW4geDExdm5jIC1yZW1vdGUgY29tbWFuZHMuICBEbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgb3B0aW9uIGlmIHRoZXkgYXJlIG5vdCB0byBiZSB0cnVzdGVkLgotCi0tbm9yZW1vdGUgICAgICAgICAgICAgIERvIG5vdCBwcm9jZXNzIGFueSByZW1vdGUgY29udHJvbCBjb21tYW5kcyBvciBxdWVyaWVzLgotLXllc3JlbW90ZSAgICAgICAgICAgICBEbyBwcm9jZXNzIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIG9yIHF1ZXJpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC15ZXNyZW1vdGUKLQotICAgICAgICAgICAgICAgICAgICAgICBBIG5vdGUgYWJvdXQgc2VjdXJpdHkgd3J0IHJlbW90ZSBjb250cm9sIGNvbW1hbmRzLgotICAgICAgICAgICAgICAgICAgICAgICBJZiBzb21lb25lIGNhbiBjb25uZWN0IHRvIHRoZSBYIGRpc3BsYXkgYW5kIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvcGVydHkgWDExVk5DX1JFTU9URSwgdGhlbiB0aGV5IGNhbiByZW1vdGVseQotICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIHgxMXZuYy4gIE5vcm1hbGx5IGFjY2VzcyB0byB0aGUgWCBkaXNwbGF5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZC4gIE5vdGUgdGhhdCBpZiB0aGV5IGNhbiBtb2RpZnkgWDExVk5DX1JFTU9URQotICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgWCBzZXJ2ZXIsIHRoZXkgaGF2ZSBlbm91Z2ggcGVybWlzc2lvbnMgdG8gYWxzbwotICAgICAgICAgICAgICAgICAgICAgICBydW4gdGhlaXIgb3duIHgxMXZuYyBhbmQgdGh1cyBoYXZlIGNvbXBsZXRlIGNvbnRyb2wKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGRlc2t0b3AuICBJZiB0aGUgICItY29ubmVjdCAvcGF0aC90by9maWxlIgotICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIGlzIGJlaW5nIHVzZWQsIG9idmlvdXNseSBhbnlvbmUgd2hvIGNhbiB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICB0byAvcGF0aC90by9maWxlIGNhbiByZW1vdGVseSBjb250cm9sIHgxMXZuYy4gIFNvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cmUgdG8gcHJvdGVjdCB0aGUgWCBkaXNwbGF5IGFuZCB0aGF0IGZpbGUncyB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy4gIFNlZSAtcHJpdnJlbW90ZSBiZWxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgYXJlIHBhcmFub2lkIGFuZCBkbyBub3QgdGhpbmsgLW5vcmVtb3RlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCwgdG8gZGlzYWJsZSB0aGUgWDExVk5DX1JFTU9URSBwcm9wZXJ0eSBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgdXNlIC1ub3ZuY2Nvbm5lY3QsIG9yIHVzZSB0aGUgLXNhZmVyIG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHNodXRzIG1hbnkgdGhpbmdzIG9mZi4KLQotLXVuc2FmZSAgICAgICAgICAgICAgICBBIGZldyByZW1vdGUgY29tbWFuZHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRseTogaWQ6cGljaywgYWNjZXB0OjxjbWQ+LCBnb25lOjxjbWQ+LCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmI6c2V0dXA6PGNtZD4pIGJlY2F1c2UgdGhleSBhcmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgZXh0ZXJuYWwgcHJvZ3JhbXMuICBJZiB5b3Ugc3BlY2lmeSAtdW5zYWZlLCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXNlIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzIGFyZSBhbGxvd2VkLiAgTm90ZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc3RpbGwgc3BlY2lmeSB0aGVzZSBwYXJhbWV0ZXJzIG9uIHRoZSBjb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIHRoZXkganVzdCBjYW5ub3QgYmUgaW52b2tlZCB2aWEgcmVtb3RlLWNvbnRyb2wuCi0tc2FmZXIgICAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1ub3ZuY2Nvbm5lY3QgLW5vcmVtb3RlIGFuZCBwcm9oaWJpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAtZ3VpIGFuZCB0aGUgLWNvbm5lY3QgZmlsZS4gU2h1dHMgb2ZmIGNvbW11bmNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4KLS1wcml2cmVtb3RlICAgICAgICAgICAgUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MgYW5kIGRpc2FibGUgcmVtb3RlLWNvbnRyb2wKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgaWYgaXQgYXBwZWFycyB0aGF0IHRoZSBYIERJU1BMQVkgYW5kL29yCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RmaWxlIGNhbiBiZSBhY2Nlc3NlZCBieSBvdGhlciB1c2Vycy4gIE9uY2UKLSAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWNvbnRyb2wgaXMgZGlzYWJsZWQgaXQgY2Fubm90IGJlIHR1cm5lZCBiYWNrIG9uLgotLW5vY21kcyAgICAgICAgICAgICAgICBObyBleHRlcm5hbCBjb21tYW5kcyAoZS5nLiBzeXN0ZW0oMyksIHBvcGVuKDMpLCBleGVjKDMpKQotICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJ1biBhdCBhbGwuCi0tYWxsb3dlZGNtZHMgbGlzdCAgICAgICJsaXN0IiBjb250YWlucyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHJ1bi4gIFRoZSBmdWxsIGxpc3Qgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBvcHRpb25zIGlzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHVubmVsLCBzc2wsIHVuaXhwdywgV0FJVCwgemVyb2NvbmYsIGlkLCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZnRlcmFjY2VwdCwgZ29uZSwgcGlwZWlucHV0LCB2NGwtaW5mbywgcmF3ZmItc2V0dXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkdCwgZ3VpLCBzc2gsIHN0b3JlcGFzc3dkLCBwYXNzd2RmaWxlLCBjdXN0b21fcGFzc3dkLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluZGF1dGgsIGNyYXNoLgotCi0gICAgICAgICAgICAgICAgICAgICAgIFNlZSBlYWNoIG9wdGlvbidzIGhlbHAgdG8gbGVhcm4gdGhlIGFzc29jaWF0ZWQgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC4gIE5vdGUgdGhhdCB0aGUgLW5vY21kcyBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZQotICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGlzYWJsZXMgYWxsIGV4dGVybmFsIGNvbW1hbmRzLgotCi0tZGVueV9hbGwgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCAtcmVtb3RlIG5vZGVueTogc3RhcnQgb3V0IGRlbnlpbmcgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGNsaWVudHMgdW50aWwgIi1yZW1vdGUgbm9kZW55IiBpcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVtIGluLgotCi0KLQotVGhlc2Ugb3B0aW9ucyBhcmUgcGFzc2VkIHRvIExpYlZOQ1NlcnZlcjoKLQotLXJmYnBvcnQgcG9ydCAgICAgICAgICBUQ1AgcG9ydCBmb3IgUkZCIHByb3RvY29sCi0tcmZid2FpdCB0aW1lICAgICAgICAgIG1heCB0aW1lIGluIG1zIHRvIHdhaXQgZm9yIFJGQiBjbGllbnQKLS1yZmJhdXRoIHBhc3N3ZC1maWxlICAgdXNlIGF1dGhlbnRpY2F0aW9uIG9uIFJGQiBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgICAodXNlICdzdG9yZXBhc3N3ZCcgdG8gY3JlYXRlIGEgcGFzc3dvcmQgZmlsZSkKLS1yZmJ2ZXJzaW9uIDMueCAgICAgICAgU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBSRkIgd2UgY2hvb3NlIHRvIGFkdmVydGlzZQotLXBlcm1pdGZpbGV0cmFuc2ZlciAgICBwZXJtaXQgZmlsZSB0cmFuc2ZlciBzdXBwb3J0Ci0tcGFzc3dkIHBsYWluLXBhc3N3b3JkIHVzZSBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAodXNlIHBsYWluLXBhc3N3b3JkIGFzIHBhc3N3b3JkLCBVU0UgQVQgWU9VUiBSSVNLKQotLWRlZmVydXBkYXRlIHRpbWUgICAgICB0aW1lIGluIG1zIHRvIGRlZmVyIHVwZGF0ZXMgKGRlZmF1bHQgNDApCi0tZGVmZXJwdHJ1cGRhdGUgdGltZSAgIHRpbWUgaW4gbXMgdG8gZGVmZXIgcG9pbnRlciB1cGRhdGVzIChkZWZhdWx0IG5vbmUpCi0tZGVza3RvcCBuYW1lICAgICAgICAgIFZOQyBkZXNrdG9wIG5hbWUgKGRlZmF1bHQgIkxpYlZOQ1NlcnZlciIpCi0tYWx3YXlzc2hhcmVkICAgICAgICAgIGFsd2F5cyB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLS1uZXZlcnNoYXJlZCAgICAgICAgICAgbmV2ZXIgdHJlYXQgbmV3IGNsaWVudHMgYXMgc2hhcmVkCi0tZG9udGRpc2Nvbm5lY3QgICAgICAgIGRvbid0IGRpc2Nvbm5lY3QgZXhpc3RpbmcgY2xpZW50cyB3aGVuIGEgbmV3IG5vbi1zaGFyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBjb21lcyBpbiAocmVmdXNlIG5ldyBjb25uZWN0aW9uIGluc3RlYWQpCi0taHR0cGRpciBkaXItcGF0aCAgICAgIGVuYWJsZSBodHRwIHNlcnZlciB1c2luZyBkaXItcGF0aCBob21lCi0taHR0cHBvcnQgcG9ydG51bSAgICAgIHVzZSBwb3J0bnVtIGZvciBodHRwIGNvbm5lY3Rpb24KLS1lbmFibGVodHRwcHJveHkgICAgICAgZW5hYmxlIGh0dHAgcHJveHkgc3VwcG9ydAotLXByb2dyZXNzaXZlIGhlaWdodCAgICBlbmFibGUgcHJvZ3Jlc3NpdmUgdXBkYXRpbmcgZm9yIHNsb3cgbGlua3MKLS1saXN0ZW4gaXBhZGRyICAgICAgICAgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbmx5IG9uIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkciBpcGFkZHIuICctbGlzdGVuIGxvY2FsaG9zdCcgYW5kIGhvc3RuYW1lIHdvcmsgdG9vLgotCi1saWJ2bmNzZXJ2ZXItdGlnaHQtZXh0ZW5zaW9uIG9wdGlvbnM6Ci0tZGlzYWJsZWZpbGV0cmFuc2ZlciAgIGRpc2FibGUgZmlsZSB0cmFuc2ZlcgotLWZ0cHJvb3Qgc3RyaW5nICAgICAgICBzZXQgZnRwIHJvb3QKLQotICAgUHJldHR5IHdpbGQgaHVoPyBDb250YWN0IG1lIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMuCi0KLSAgIFBlcnNvbmFsbHksIEkgdXNlOgoteDExdm5jIC1yZmJhdXRoICRIT01FLy52bmMvcGFzc3dkIC1zb2xpZApkaWZmIC0tZ2l0IGEveDExdm5jL1JFTEVBU0UtTk9URVMgYi94MTF2bmMvUkVMRUFTRS1OT1RFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1YzRiOS4uMDAwMDAwMAotLS0gYS94MTF2bmMvUkVMRUFTRS1OT1RFUworKysgL2Rldi9udWxsCkBAIC0xLDE1NTMgKzAsMCBAQAotCi14MTF2bmMgMC45LjEzCTIwMTAtMTItMjAKLQotTmV3IGluIHRoZSAwLjkuMTMgeDExdm5jIHJlbGVhc2U6Ci0KLQlJbXByb3ZlZCBzdXBwb3J0IGZvciBub24tWDExIHRvdWNoc2NyZWVuIGRldmljZXMgKGUuZy4gaGFuZGhlbGQgb3IKLQkJY2VsbCBwaG9uZSkgdmlhIExpbnV4IHVpbnB1dCBpbnB1dCBpbmplY3Rpb24uICBBZGRpdGlvbmFsCi0JCXR1bmluZyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gVFNMSUIgdG91Y2hzY3JlZW4gY2FsaWJyYXRpb24KLQkJaXMgc3VwcG9ydGVkLiBUZXN0ZWQgb24gUXRtb2tvIE5lbyBGcmVlcnVubmVyLgotCi0JCUEgdG9vbCwgbWlzYy91aW5wdXQucGwsIGlzIHByb3ZpZGVkIHRvIGRpYWdub3NlIHVpbnB1dAotCQliZWhhdmlvciBvbiBuZXcgZGV2aWNlcy4KLQotCQlUaGUgZW52LiB2YXJzLiBYMTFWTkNfVUlOUFVUX0JVUyBhbmQgWDExVk5DX1VJTlBVVF9WRVJTSU9OCi0JCWFyZSBhdmFpbGFibGUgaWYgbGVhdmluZyB0aGVtIHVuc2V0IGRvZXMgbm90IHdvcmsuCi0KLQlUaGUgTGludXggdWlucHV0IG5vbi1YMTEgaW5wdXQgaW5qZWN0aW9uIGNhbiBub3cgYmUgYnlwYXNzZWQ6Ci0JCWV2ZW50cyBjYW4gYmUgZGlyZWN0bHkgd3JpdHRlbiB0byB0aGUgL2Rldi9pbnB1dC9ldmVudAotCQlkZXZpY2VzIHNwZWNpZmllZCBieSB0aGUgdXNlciAoZGlyZWN0X2Ficz0uLi4sIGV0Yy4pCi0KLQkJQSAtcGlwZWlucHV0IGlucHV0IGluamVjdGlvbiBoZWxwZXIgc2NyaXB0LAotCQltaXNjL3F0X3RzbGliX2luamVjdC5wbCBpcyBwcm92aWRlZCBhcyBhIHR3ZWFrYWJsZQotCQlub24tYnVpbHRpbiBkaXJlY3QgaW5wdXQgaW5qZWN0aW9uIG1ldGhvZC4KLQotCVRoZSBsaXN0IG9mIG5ldyB1aW5wdXQgcGFyYW1ldGVycyBmb3IgdGhlIGFib3ZlIHR3byBmZWF0dXJlcyBpczoKLQkJcHJlc3N1cmUsIHRzbGliX2NhbCwgdG91Y2hfYWx3YXlzLCBkcmFnc2tpcCwgYnRuX3RvdWNoOwotCQlkaXJlY3RfcmVsLCBkaXJlY3RfYWJzLCBkaXJlY3RfYnRuLCBkaXJlY3Rfa2V5LgotCi0JVGhlIGluY2x1ZGVkIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlcnMgbm93IGhhbmRsZSBNb3VzZQotCQlXaGVlbCBldmVudHMuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCUluIC1yZWZsZWN0IG1vZGUsIHRoZSBsaWJ2bmNjbGllbnQgY29ubmVjdGlvbiBjYW4gbm93IGhhdmUKLQkJdGhlIHBpeGVsIGZvcm1hdCBtb2RpZmllZCB2aWEgdGhlIGVudmlyb25tZW50Ci0JCXZhcmlhYmxlcyBYMTFWTkNfUkVGTEVDVF9iaXRzUGVyU2FtcGxlLAotCQlYMTFWTkNfUkVGTEVDVF9zYW1wbGVzUGVyUGl4ZWwsIGFuZAotCQlYMTFWTkNfUkVGTEVDVF9ieXRlc1BlclBpeGVsCi0KLQlJbiAtY3JlYXRlIG1vZGUgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGFkZGVkCi0JCXRvIGZpbmUgdHVuZSB0aGUgYmVoYXZpb3I6IEZJTkRfRElTUExBWV9OT19MU09GOgotCQlkbyBub3QgdXNlIGxzb2YoMSkgdG8gdHJ5IHRvIGRldGVybWluZSB0aGUgTGludXggVlQsCi0JCUZJTkRfRElTUExBWV9OT19WVF9GSU5EOiBkbyBub3QgdHJ5IHRvIGRldGVybWluZSB0aGUKLQkJTGludXggVlQgYXQgYWxsLCBYMTFWTkNfQ1JFQVRFX0xDX0FMTF9DX09LOiBkbyBub3QgYm90aGVyCi0JCXVuZG9pbmcgdGhlIHNldHRpbmcgTENfQUxMPUMgdGhhdCB0aGUgY3JlYXRlX2Rpc3BsYXkKLQkJc2NyaXB0IHNldHMuICBUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlIC1jcmVhdGUgc2NyaXB0Ci0JCWhhcyBiZWVuIGltcHJvdmVkIGZvciBsYXJnZSBpbnN0YWxsYXRpb25zICgxMDAncyBvZgotCQl1c2VyIHNlc3Npb25zIG9uIG9uZSBtYWNoaW5lLikKLQotCUluIC11bml4cHcgbW9kZSwgb25lIGNhbiBub3cgVGFiIGZyb20gbG9naW46IHRvIFBhc3N3b3JkLgotCi0JQW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIFgxMVZOQ19TQl9GQUNUT1IsIGFsbG93cyBvbmUgdG8gc2NhbGUKLQkJdGhlIC1zYiBzY3JlZW5ibGFuayBzbGVlcCB0aW1lIGZyb20gdGhlIGRlZmF1bHQgMiBzZWNzLgotCi0JSW4gLXJhd2ZiIG1vZGUsIGEgYnVnIGlzIGZpeGVkIGluIHNldHRpbmcgdGhlIG51bWJlciBvZiBiaXRzCi0JCXBlciBwaXhlbC4KLQotCURvY3VtZW50ZWQgdGhhdCAtZ3JhYmtiZCBpcyBubyBsb25nZXIgd29ya2luZyB3aXRoIHNvbWUvbW9zdAotCQl3aW5kb3cgbWFuYWdlcnMgKGl0IGNhbiBwcmV2ZW50IHJlc2l6aW5nIGFuZCBtZW51IHBvc3RpbmcuKQotCi0JVGhlIG1hY29zeCBkZXByZWNhdGVkIGludGVyZmFjZSBHZXRNYWluRGV2aWNlKCkgY2FsbCBpcyByZW1vdmVkLgotCQlDb21waWxlIHdpdGggLURYMTFWTkNfTUFDT1NYX1VTRV9HRVRNQUlOREVWSUNFIGlmIG5lZWRlZAotCQlmb3IgYW4gb2xkIG1hY29zeCB2ZXJzaW9uLi4uCi0KLQlNaXNjZWxsYW5lb3VzIGNvZGUgY2xlYW51cC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC45LjEyCTIwMTAtMDktMTAKLQotTmV3IGluIHRoZSAwLjkuMTIgeDExdm5jIHJlbGVhc2U6Ci0KLQlPbmUgY2FuIG5vdyBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXNwbGF5cwotCQl0aGF0IGNhbiBiZSBjcmVhdGVkIGluIC1jcmVhdGUgbW9kZSB2aWEgdGhlCi0JCWVudi4gdmFyLiBYMTFWTkNfQ1JFQVRFX01BWF9ESVNQTEFZUwotCi0JVGhlIFgxMVZOQ19OT19MSU1JVF9TSE0gZW52LiB2YXIuIGlzIGFkZGVkIHRvIHNraXAgYW55Ci0JCWF1dG9tYXRpYyBzaGFyZWQgbWVtb3J5IHJlZHVjdGlvbi4KLQotCVRoZSBrZG0gZGlzcGxheSBtYW5hZ2VyIGlzIG5vdyBkZXRlY3RlZCB3aGVuIHRyeWluZyBub3QgdG8gZ2V0Ci0JCWtpbGxlZCBieSB0aGUgZGlzcGxheSBtYW5hZ2VyLgotCi0gIG1pc2NlbGxhbmVvdXMgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzOgotCi0JQSBjb21waWxlIGVycm9yIGlzIGZpeGVkIHdoZW4gdXNpbmcgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIKLQkJcG9pbnRpbmcgdG8gTGliVk5DU2VydmVyIDAuOS43LgotCi0JLW5ldmVyc2hhcmVkIC1mb3JldmVyIHVzYWdlIG1vZGUgaXMgZG9jdW1lbnRlZC4KLQotCU9sZCBTdVNFIGJyb2tlbiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBpcyBkb2N1bWVudGVkLgotCi0JeDExdm5jIGV4aXQgY2FzZXMgYXJlIGRvY3VtZW50ZWQuCi0KLQlBIGNvbXBpbGUgYnVnIGZyb20gZm9yY2VkIHVzZSBvZiBYZGVmcy5oIGlzIHdvcmtlZCBhcm91bmQuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC45LjExCTIwMTAtMDgtMDgKLQotTmV3IGluIHRoZSAwLjkuMTEgeDExdm5jIHJlbGVhc2U6Ci0KLQlUaGUgc291cmNlIHRyZWUgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIG1vc3QgcmVjZW50IGxpYnZuY2NsaWVudAotCQkodGhpcyBvbmx5IGFmZmVjdHMgLXJlZmxlY3QgbW9kZS4pICBUaGUgYnVpbGQgaXMgZml4ZWQKLQkJZm9yIGluY29tcGF0aWJpbGl0aWVzIHdoZW4gdXNpbmcgYW4gZXh0ZXJuYWwgTGliVk5DU2VydmVyCi0JCShlLmcuICAuL2NvbmZpZ3VyZSAtLXdpdGgtc3lzdGVtLWxpYnZuY3NlcnZlci4uLikKLQotCVRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyBWaWV3ZXIgTWFrZWZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgc28KLQkJdGhhdCB0aGUgamFyIGZpbGVzIHRoYXQgYXJlIGJ1aWx0IGFyZSBjb21wYXRpYmxlIGJhY2sKLQkJdG8gSmF2YSAxLjQuCi0KLQlJbiAtcmVmbGVjdCBtb2RlIGN1cnNvciBwb3NpdGlvbiB1cGRhdGVzIGFyZSBub3cgaGFuZGxlZAotCQljb3JyZWN0bHkuCi0KLQlJbiAtY3JlYXRlLy11bml4cHcgbW9kZSwgdGhlIGVudi4gdmFyLiBGRF9VU0VSUFJFRlMgbWF5IGJlIHNldAotCQl0byBhIGZpbGVuYW1lIGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgdGhhdCBpbmNsdWRlcwotCQlkZWZhdWx0IHVzZXJuYW1lOm9wdGlvbnMgdmFsdWVzIChzbyB0aGUgb3B0aW9ucyBkbyBub3QKLQkJbmVlZCB0byBiZSB0eXBlZCBldmVyeSB0aW1lIGF0IHRoZSBsb2dpbiBwcm9tcHQuKQotCi0gIG1pc2NlbGxhbmVvdXMgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzOgotCi0JQW4gb3B0aW9uIC1hbHdheXNfaW5qZWN0IGlzIHByb3ZpZGVkOiBFdmVuIGlmIHRoZXJlIGlzIG5vCi0JCWRpc3BsYWNlbWVudCAoZHggPSBkeSA9IDApIGZvciBhIFZOQyBtb3VzZSBldmVudCBmb3JjZQotCQl0aGUgcG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIHgseSBwb3NpdGlvbiBhbnl3YXkuCi0KLQlOZXcgamF2YSB2aWV3ZXIgZGVidWdnaW5nIGFuZCB3b3JrYXJvdW5kIGFwcGxldCBwYXJhbWV0ZXJzOgotCQlkZWJ1Z0tleWJvYXJkIG1hcEY1X3RvX2F0c2lnbiBmb3JiaWRfQ3RybF9BbHQgCi0KLQlZb3UgY2FuIHNldCBYMTFWTkNfQVZBSElfTkFNRSwgWDExVk5DX0FWQUhJX0hPU1QsIGFuZC9vcgotCQlYMTFWTkNfQVZBSElfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlCi0JCWRlZmF1bHQgdmFsdWVzLiBGb3IgZXhhbXBsZTogLWVudiBYMTFWTkNfQVZBSElfTkFNRT13YWxseQotCi0JV2hlbiBvcGVuaW5nIHRoZSBYMTEgZGlzcGxheSBleHRyYSBYQVVUSExPQ0FMSE9TVE5BTUUgc2V0dGluZ3MKLQkJYXJlIGF0dGVtcHRlZC4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjkuMTAJMjAxMC0wNS0wMwotCi1OZXcgaW4gdGhlIDAuOS4xMCB4MTF2bmMgcmVsZWFzZToKLQotCUlQdjYgaXMgbm93IHN1cHBvcnRlZCBmb3IgYWxsIHVzYWdlIG1vZGVzOiBmb3J3YXJkIGFuZCByZXZlcnNlCi0JCWNvbm5lY3Rpb25zLCBTU0wgYW5kIHVuZW5jcnlwdGVkLCBldGMuCi0KLQlUaGUgaW5jbHVkZWQgU1NMIGVuYWJsZWQgSmF2YSBWTkMgdmlld2VyIGFwcGxldCBub3cgc3VwcG9ydHMKLQkJQ2hhaW5lZCBTU0wgQ2VydGlmaWNhdGVzICh4MTF2bmMgLXNzbCBhbHdheXMgaGFzLikKLQkJVGhlIGFwcGxldCBhdXRvZGVjdHMgeDExdm5jIGFuZCBzZXQgR0VUPTEgZm9yIGZhc3RlcgotCQljb25uZWN0aW5nIHZpYSBIVFRQUy4KLQotCUEgZGVtbyBDR0kgc2NyaXB0ICdkZXNrdG9wLmNnaScgc2hvd3MgaG93IHRvIGNyZWF0ZSBhbgotCQlTU0wgZW5jcnlwdGVkLCBtdWx0aS11c2VyIHgxMXZuYyB3ZWIgbG9naW4gZGVza3RvcAotCQlzZXJ2aWNlLiAgVGhlIHVzZXIgbG9ncyBpbnRvIGEgc2VjdXJlIHdlYiBzaXRlIGFuZCBnZXRzCi0JCWhpcy9oZXIgb3duIHZpcnR1YWwgZGVza3RvcCBhbmQgaGlzIGJyb3dzZXIgYWNjZXNzZXMgaXQKLQkJd2l0aCB0aGUgU1NMIEphdmEgVk5DIFZpZXdlciBhcHBsZXQuCi0KLQlBIHNlcnZlckNlcnQgSmF2YSBWaWV3ZXIgYXBwbGV0IHBhcmFtZXRlciBpcyBwcm92aWRlZC4KLQkJVXNlIGFuIGF1dGhlbnRpY2F0ZWQgSFRUUFMgYnJvd3NlciBjb25uZWN0aW9uIHRvIHNldAotCQl0aGlzIHBhcmFtZXRlciAodGhlIHVzZXIgY291bGQgc2V0IGl0IGxvY2FsbHkgdG9vLikKLQkJVGhlIG9uZXRpbWVrZXkgdG9vbCBoYXMgLWNlcnRvbmx5IG9wdGlvbiBmb3IgdGhpcyBzY2hlbWUuCi0KLQlUaGUgWGR1bW15IHNjcmlwdCAodXNlIFhvcmcgJ2R1bW15JyBkcml2ZXIgaW5zdGVhZCBvZiBYdmZiKQotCQlubyBsb25nZXIgcmVxdWlyZXMgYmVpbmcgcnVuIGFzIHJvb3QuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCUluIHRoZSBKYXZhIHZpZXdlciBhcHBsZXQsIGRlYnVnQ2VydHMgYW5kIGRlYnVnS2V5Ym9hcmQgcGFyYW1ldGVycwotCQlhcmUgcHJvdmlkZWQuICBUaGUgZGVidWdnaW5nIG91dHB1dCBvZiB0aGUgYXBwbGV0IGlzIG1vcmUKLQkJcmVhZGFibGUuICBTb21lIGNvcm5lci1jYXNlIGJ1Z3MgKGUuZy4gc29ja2V0IGV4Y2VwdGlvbnMpCi0JCWFyZSBub3cgaGFuZGxlZCBncmFjZWZ1bGx5LiAgUGFyYW1ldGVycyBmb3JiaWRfQ3RybF9BbHQKLQkJYW5kIG1hcEY1X3RvX2F0c2lnbiBhcmUgYWRkZWQuCi0KLQlUaGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgSFRUUFMgYXBwbGV0IGRvd25sb2FkcyB0byBmaW5pc2gKLQkJY2FuIGJlIHNldCBpbiBlbnYuIHZhci4gWDExVk5DX0hUVFBTX0RPV05MT0FEX1dBSVRfVElNRS4KLQotCVRoZSAteGtiIG1vZGUgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KLQkJNCBrZXlzeW1zIHBlciBrZXkuCi0KLQktY29lIGlzIG5vdyBhbiBhbGlhcyBmb3IgLWNvbm5lY3Rfb3JfZXhpdC4KLQotCVRoZSAtaW5wdXRfZWFnZXJseSBvcHRpb24gZW5hYmxlcyB0aGlzIExpYlZOQ1NlcnZlciBmZWF0dXJlCi0JCShpdCBpcyBsaWtlIC1hbGxpbnB1dC4pCi0KLQlUaGUgIiUiIHVuaXggcGFzc3dvcmQgdmVyaWZpY2F0aW9uIHRyaWNrcyBmb3IgdGhlIC11bml4cHcKLQkJb3B0aW9uIGFyZSBub3cgZG9jdW1lbnRlZC4gIFRoZXkgYWxzbyBydW4gYSBjb21tYW5kCi0JCWluIFVOSVhQV19DTUQuCi0KLQlJbiAtY3JlYXRlICgtc3ZjLCBldGMuKSBtb2RlcywgYSB3YXJuaW5nIGlzIHByaW50ZWQgb3V0IGlmIFh2ZmIKLQkJY2Fubm90IGJlIGZvdW5kLiAgWHZmYiAnK2tiJyBvcHRpb24gaXMgY2hlY2tlZCBmb3IuCi0JCVRoZSAtZW52IENSRUFURV9ESVNQTEFZX09VVFBVVD0vdG1wL215ZGVidWcudHh0IGRlYnVnZ2luZwotCQlvcHRpb24gaXMgZG9jdW1lbnRlZC4gIFRyeSB0byBwcmVzZXJ2ZSB1c2VyJ3MgUEFUSAotCQlpZiBwb3NzaWJsZS4KLQotCQlJbiBYRE1DUCBjb25uZWN0aW9uIG1vZGUsIGEgdGVzdCBmb3IgR0RNIGxpc3RlbmluZyBvbmx5Ci0JCW9uIElQdjYgKDo6MSkgaXMgcGVyZm9ybWVkLiAgVGhlIGludGVyZmFjZSBjYW4gYWxzbyBiZQotCQlzcGVjaWZpZWQgdmlhIEZEX1hETUNQX0lGLgotCi0JVGhlIGV4YW1wbGUgc2NyaXB0cyBjb25uZWN0X3N3aXRjaCwgdWx0cmF2bmNfcmVwZWF0ZXIucGwsIGluZXQ2dG80Ci0JCWhhdmUgc2V0dGluZ3MgdG8gbGV0IHRoZW0gcnVuIHJlbGlhYmx5IGZvciBsb25nIHRpbWVzCi0JCWFzIGRhZW1vbnMuICBUaGV5IGFsc28gc3VwcG9ydCBJUHY2LgotCi0JSVB2NiBub3RlczogZm9yIHNvbWUgdmVyeSBlc290ZXJpYyBjYXNlcyAoZS5nLiAtY2hhdHdpbmRvdykKLQkJSVB2NCBsb2NhbGhvc3QgbWF5IGJlIHJlcXVpcmVkIGZvciBsb2NhbCBJUEMuICBBIGRlbW8KLQkJdHJhbnNpdGlvbiB0b29sICdpbmV0NnRvNCcgaXMgYWxzbyBpbmNsdWRlZCAoY2FuIGJlCi0JCXVzZWQgZm9yIG90aGVyIGFwcHMuKSAgeDExdm5jIG9wdGlvbnMgcmVsYXRlZCB0byBJUHY2OgotCQktbGlzdGVuNiwgLTYsIC1ubzYsIC1ub2lwdjQsIC1ub2lwdjYsIGFuZCAtY29ubmVjdCwKLQkJLXByb3h5LgotCi0JVXNlIFNUVU5ORUxfTElTVEVOIGluIC1zdHVubmVsIG1vZGUgdG8gaGF2ZSBpdCBsaXN0ZW4gb24gYQotCQlwYXJ0aWN1bGFyIGludGVyZmFjZS4gIEFsc28gU1RVTk5FTF9QUk9HLgotCi0JTmV3IHJlbW90ZSBjb250cm9sIHF1ZXJ5IG9wdGlvbnM6IHBvaW50ZXJfeCwgcG9pbnRlcl95LAotCQlwb2ludGVyX3NhbWUsIHBvaW50ZXJfcm9vdCwgYW5kIHBvaW50ZXJfbWFzay4gQSBkZW1vCi0JCXNjcmlwdCB1c2luZyB0aGVtIG1pc2MvcGFubmVyLnBsIGlzIHByb3ZpZGVkLgotCi0JUmVtb3RlIGNvbnRyb2wgY2hhbmdlIG9mIC1jbGlwIG9wdGlvbiB3aWxsIG5vdCBjcmVhdGUgbmV3Ci0JCWZyYW1lYnVmZmVyIGlmIHRoZSBzaXplIGhhcyBub3QgY2hhbmdlZCAoZm9yIHBhbm5lci5wbCkKLQotCVRoZSBYMTFWTkNfRElTQUJMRV9TU0xfQ0xJRU5UX01PREUgZW52LiB2YXIuIGNhbiBiZSBzZXQgdG8KLQkJZGlzYWJsZSBTU0wgY2xpZW50IHJvbGUgaW4gcmV2ZXJzZSBjb25uZWN0aW9ucy4gIFRoaXMKLQkJbWVhbnMgdGhlIFZOQyB2aWV3ZXIgc2lkZSBtdXN0IGJlIGluIFNTTCBjbGllbnQgcm9sZS4KLQkJVWx0cmFWTkMgcmVwZWF0ZXIgb3BlcmF0aW9uIGNhbiBiZW5lZml0IGZyb20gdGhpcy4KLQotCQlUaGUgU1NMX0lOSVRfVElNRU9VVCBpcyBpbmNyZWFzZWQgdG8gMSBob3VyIGlmICdyZXBlYXRlcicKLQkJaXMgZGV0ZWN0ZWQgaW4gYSByZXZlcnNlIGNvbm5lY3Qgc3RyaW5nLgotCi0JVGhlIFggcHJvcGVydHkgWDExVk5DX1RSQVBfWFJBTkRSIGNhbiBiZSBzZXQgb24gYSBkZXNrdG9wIHRvCi0JCWZvcmNlIHgxMXZuYyB0byB1c2UgdGhlIC14cmFuZHIgc2NyZWVuIHNpemUgY2hhbmdlCi0JCXRyYXBwaW5nIGNvZGUuCi0KLQlUaGUgLXNzbFNjcmlwdHMgb3B0aW9uIHByaW50cyBvdXQgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50Ci0JCXNjcmlwdHMuCi0KLQlTdWdnZXN0ICctYXV0aCBndWVzcycgYW5kICctZmluZGF1dGgnIGlmIFggY29ubmVjdGlvbiBmYWlscy4KLQotCVRoZSBUaWdodFZOQyBzZXJjdXJpdHkgdHlwZSAoVGlnaHRWTkMgZmVhdHVyZXMgZW5hYmxlcikgbm93Ci0JCXdvcmtzIGZvciBSRkIgdmVyc2lvbiAzLjguCi0KLQlSRUNPUkQgc2Nyb2xsIGRldGVjdGlvbiBpcyBub3cgd29ya2luZyB3aXRoIHRoZSBuZXcgZ3RrL2dkayBzY3JvbGwKLQkJbWVjaGFuaXNtLiAgU2V0IFgxMVZOQ19TQ1JPTExfTVVTVF9FUVVBTCB0byBkaXNhYmxlLgotCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOgotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwIHwgbGVzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjkuOQkyMDA5LTEyLTIxCi0KLQotCi1OZXcgaW4gdGhlIDAuOS45IHgxMXZuYyByZWxlYXNlOgotCi0JQSBuZXcgb3B0aW9uIC1maW5kYXV0aCBydW5zIHRoZSBGSU5ERElTUExBWSBzY3JpcHQgdGhhdCBhcHBsaWVzCi0JCWhldXJpc3RpY3MgdG8gdHJ5IHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBYQVVUSE9SSVRZCi0JCWZpbGUuICBUaGUgdXNlIG9mICctYXV0aCBndWVzcycgd2lsbCB1c2UgdGhlIFhBVVRIT1JJVFkKLQkJdGhhdCAtZmluZGF1dGggcmV2ZWFscy4gIFRoaXMgY2FuIGJlIGhhbmR5IGluIHdpdGgKLQkJdGhlIGxhc3Rlc3QgR0RNIHdoZXJlIHRoZSBhYmlsaXR5IHRvIHN0b3JlIGNvb2tpZXMgaW4KLQkJfi8uWGF1dGhvcml0eSBoYXMgYmVlbiByZW1vdmVkLgotCi0JCUlmIHgxMXZuYyBpcyBydW5uaW5nIGFzIHJvb3QgKGUuZy4gaW5ldGQgb3IgWERNL0dETS9LRE0pCi0JCXRoZSBGRF9YRE09MSBtb2RlIHdpbGwgYmUgdHJpZWQgaWYgdGhlIGFib3ZlIC1maW5kYXV0aAotCQlvciAnLWF1dGggZ3Vlc3MnIGNvbW1hbmQgZmFpbHM7IGl0IHdpbGwgZmluZCB0aGUKLQkJY29ycmVjdCBYQVVUSE9SSVRZIGZvciB0aGUgZ2l2ZW4gZGlzcGxheSAodGhpcyB3b3JrcyBmb3IKLQkJWERNL0dETS9LRE0gaWYgdGhlIGxvZ2luIGdyZWV0ZXIgcGFuZWwgaXMgdXAgb3IgaWYgc29tZW9uZQotCQloYXMgYWxyZWFkeSBsb2dnZWQgaW50byBhbiBYIHNlc3Npb24uKQlZb3UgY2FuIGFsc28KLQkJc2V0IC1lbnYgRkRfWERNPTEgdG8gZm9yY2UgaXQgdG8gYmUgZG9uZSBvbiB0aGUgZmlyc3QgdHJ5LgotCi0JVGhlIC11bml4cHdfc3lzdGVtX2dyZWV0ZXIgb3B0aW9uLCB3aGVuIHVzZWQgaW4gY29tYmluZWQKLQkJdW5peHB3IGFuZCBYRE1DUCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlIChlLmcuIC14ZG1zdmMpLAotCQllbmFibGVzIHRoZSB1c2VyIHRvIHByZXNzIEVzY2FwZSB0byBqdW1wIGRpcmVjdGx5IHRvIHRoZQotCQlYRE0vR0RNL0tETSBsb2dpbiBncmVldGVyIHNjcmVlbi4gIFRoaXMgd2F5IHRoZSB1c2VyCi0JCWF2b2lkcyBlbnRlcmluZyBoaXMgdW5peCBwYXNzd29yZCB0d2ljZSBhdCBYIHNlc3Npb24KLQkJY3JlYXRpb24gdGltZS4JRm9yIHN1YnNlcWVudCBsb2dpbnMgdG8gdGhlIHNhbWUgc2Vzc2lvbiwKLQkJaGUgdXNlcyB0aGUgcmVndWxhciB4MTF2bmMgdW5peHB3ICJsb2dpbjoiIHByb21wdC4gICBBbHNvLAotCQl0aGUgdW5peHB3IGxvZ2luIHBhbmVsIG5vdyBoYXMgYSBzaG9ydCBoZWxwIGRpc3BsYXllZAotCQlpZiB0aGUgdXNlciBwcmVzc2VzICdGMScgdGhhdCBsaXN0cyB0aGUgb3B0aW9ucy4KLQotCVRoZSAtYXBwc2hhcmUgb3B0aW9uIGVuYWJsZXMgc2ltcGxlIGFwcGxpY2F0aW9uIHNoYXJpbmcgYmFzZWQgb24KLQkJdGhlIC1pZC8tc2lkIG1lY2hhbmlzbS4gIEV2ZXJ5IG5ldyB0b3BsZXZlbCB3aW5kb3cgdGhhdAotCQl0aGUgYXBwbGljYXRpb24gY3JlYXRlcyBpbmR1Y2VzIGEgbmV3IHZpZXdlciB3aW5kb3cgdmlhCi0JCWEgcmV2ZXJzZSBjb25uZWN0aW9uLiAgVGhlIC1pZC8tc2lkIGFuZCAtY29ubmVjdCBvcHRpb25zCi0JCWFyZSByZXF1aXJlZC4gIFJ1biAneDExdm5jIC1hcHBzaGFyZSAtaGVscCcgZm9yIG1vcmUgaW5mby4KLQotCUhldXJpc3RpY3MgYXJlIGFwcGxpZWQgdG8gdHJ5IHRvIGRldGVybWluZSBpZiB0aGUgWCBkaXNwbGF5Ci0JCWlzIGN1cnJlbnRseSBpbiBhIERpc3BsYXkgTWFuYWdlciBHcmVldGVyIExvZ2luIHBhbmVsCi0JCShlLmcuIEdETS4pICBJZiBzbywgeDExdm5jJ3MgY3JlYXRpb24gb2YgYW55IHdpbmRvd3MgYW5kCi0JCXVzZSBvZiBYRklYRVMgYXJlIGRlbGF5ZWQuCi0KLQkJVGhpcyBpcyB0byB0cnkgdG8gYXZvaWQgeDExdm5jIGJlaW5nIGtpbGxlZCBhZnRlciB0aGUgdXNlcgotCQlsb2dzIGluIGlmIHRoZSBHRE0gS2lsbEluaXRDbGllbnRzPXRydWUgaXMgaW4gZWZmZWN0LgotCQlTbyBvbmUgbm8gbG9uZ2VyIG5lZWRzIHRvIHNldCBLaWxsSW5pdENsaWVudHM9ZmFsc2UgaW4KLQkJZ2RtLmNvbmYuICBOb3RlIHRoYXQgaW4gcmVjZW50IEdETSB0aGUgS2lsbEluaXRDbGllbnRzCi0JCW9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLgotCi0JCUFsc28gZGVsYXllZCBpcyB0aGUgdXNlIG9mIHRoZSBYRklYRVMgY3Vyc29yIGZldGNoaW5nCi0JCWZ1bmN0aW9uYWxpdHk7IHRoaXMgYXZvaWRzIGFuIFhvcmcgYnVnIHRoYXQgY2F1c2VzIFhvcmcKLQkJdG8gY3Jhc2ggcmlnaHQgYWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbi4KLQotCXgxMXZuYyBub3cgdHJpZXMgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIGluIGtlZXBpbmcgdXAgd2l0aCBWTkMKLQkJY2xpZW50J3MgZnJhbWVidWZmZXIgdXBkYXRlIHJlcXVlc3RzLiAgU29tZSBicm9rZW4gVk5DCi0JCWNsaWVudHMgY29udGludW91c2x5IHNwcmF5IHRoZXNlIHJlcXVlc3RzIGF0IFZOQyBzZXJ2ZXJzCi0JCShyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBoYXZlIHJlY2VpdmVkIGFueSB1cGRhdGVzCi0JCW9yIG5vdC4pICBUaGUgLWV4dHJhX2ZidXIgb3B0aW9uIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lCi0JCXRoZSBzZXR0aW5nLgotCi0JVGhlICItZGlzcGxheSBXQUlUOmNtZD0uLi4iLCAtZmluZCwgLWNyZWF0ZSBtb2RlcyBub3cgd29yawotCQljb3JyZWN0bHkgZm9yIHRoZSB1c2VyLXN1cHBsaWVkIGxvZ2luIHByb2dyYW0gc2NoZW1lCi0JCSItdW5peHB3X2NtZCAuLi4iLCBhcyBsb25nIGFzIHRoZSBsb2dpbiBwcm9ncmFtIHN1cHBvcnRzCi0JCXJ1bm5pbmcgY29tbWFuZHMgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCQkiUkZCX1VOSVhQV19DTURfUlVOIiBhcyB0aGUgbG9nZ2VkLWluIHVzZXIuICBUaGUgbW9kZQotCQkiLXVuaXhwd19uaXMgLi4uIiBoYXMgYWxzbyBiZWVuIG1hZGUgbW9yZSBjb25zaXN0ZW50LgotCQlUaGUgdXNlcm5hbWUgb3B0aW9uICJ0YWc9Li4uIiBjYW4gYmUgdXNlZCB0byBzZXQgRkRfVEFHLgotCi0JVGhlIC1zdHVubmVsIG9wdGlvbiAobGlrZSAtc3NsIGJ1dCB1c2VzIHN0dW5uZWwgYXMgYW4gZXh0ZXJuYWwKLQkJaGVscGVyIHByb2dyYW0pIG5vdyB3b3JrcyB3aXRoIHRoZSAtc3NsICJTQVZFIiBhbmQgIlRNUCIKLQkJc3BlY2lhbCBjZXJ0aWZpY2F0ZSBuYW1lcy4gIFRoZSAtc3NsdmVyaWZ5IGFuZCAtc3NsQ1JMCi0JCW9wdGlvbnMgbm93IHdvcmsgY29ycmVjdGx5IGluIC1zdHVubmVsIG1vZGUuICBTaW5nbGUgcG9ydAotCQlIVFRQUyBjb25uZWN0aW9ucyBhcmUgYWxzbyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZS4KLQotCVRoZSByZW1vdGUgY29udHJvbCBjb21tYW5kIC1SIGNhbiBiZSB1c2VkIHRvIGluc3RydWN0IHgxMXZuYwotCQl0byByZXNlbmQgaXRzIG1vc3QgcmVjZW50IGNvcHkgb2YgdGhlIENsaXBib2FyZCwKLQkJUHJpbWFyeSwgb3IgQ3V0YnVmZmVyIHNlbGVjdGlvbnM6ICJ4MTF2bmMgLVIKLQkJcmVzZW5kX2NsaXBib2FyZCIsICJ4MTF2bmMgLVIgcmVzZW5kX3ByaW1hcnkiLCBhbmQKLQkJIngxMXZuYyAtUiByZXNlbmRfY3V0YnVmZmVyIi4KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVRoZSBmb250cyBpbiB0aGUgR1VJICgtZ3VpKSBjYW4gbm93IGJ5IHNldCB2aWEgZW52aXJvbm1lbnQKLQkJdmFyaWFibGVzLCBlLmcuIC1lbnYgWDExVk5DX0ZPTlRfQk9MRD0nSGVsdmV0aWNhIC0xNiBib2xkJwotCQlhbmQgLWVudiBYMTFWTkNfRk9OVF9GSVhFRD0nQ291cmllciAtMTQnLgotCi0JVGhlIHZhbHVlIG9mIHRoZSAtdGltZW91dCBvcHRpb24gaXMgbm93IGFsc28gdXNlZCBmb3IgdGhlIHRpbWluZwotCQlvdXQgb2YgcmV2ZXJzZSBjb25uZWN0aW9ucy4gIFRoZSAtdGltZW91dCBleGl0IHdpbGwKLQkJb2NjdXIgaWYgbm8gY2xpZW50IGhhcyBtYWRlIGl0IHRvIG5vcm1hbCBvcGVyYXRpbmcgc3RhdGUKLQkJKGluc3RlYWQgb2YgbWVyZWx5IHRyeWluZyB0byBjb25uZWN0LikKLQotCU9uZSBjYW4gYWRkIGV4dHJhIFVSTCBwYXJhbWV0ZXJzIHRvIHRoZSBIVFRQUyAoLXNzbCkgdXJscwotCQl2aWEgWDExVk5DX0VYVFJBX0hUVFBTX1BBUkFNUyB3aXRob3V0IG5lZWRpbmcgdG8gZWRpdAotCQlpbmRleC52bmMuIEUuZy46IC1lbnYgWDExVk5DX0VYVFJBX0hUVFBTX1BBUkFNUz0nP0dFVD0xJwotCi0JT25lIGNhbiBtYWtlIHRoZSBsaWJ2bmNzZXJ2ZXIgSFRUUCAobm9uLVNTTCkgc2VydmVyIGxpc3RlbiBvbgotCQlsb2NhbGhvc3Q6IC1lbnYgWDExVk5DX0hUVFBfTElTVEVOX0xPQ0FMSE9TVD0xICh0aGlzIHdheQotCQlvbmx5IHRoZSBzaW5nbGUtcG9ydCBWTkMrSFRUUFMgaXMgZXhwb3NlZCB0byB0aGUgbmV0d29yay4pCi0KLQlXYXJuaW5ncyBhcmUgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cCBpZiAkRElTUExBWSBhcHBlYXJzIHRvCi0JCXN0YXJ0IHdpdGggImxvY2FsaG9zdDoiIChTU0ggWDExIGZvcndhcmRpbmcpIG9yIAotCQkiaG9zdG5hbWU6IiAocmVtb3RlIFggZGlzcGxheTsgd2lsbCBmYWlsIHcvbyAtbm9zaG0pCi0KLQlUaGUgLXNvbGlkIG9wdGlvbiBub3cgdXNlcyB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGVudi4gdmFyCi0JCWlmIGF2YWlsYWJsZS4gIFRoZSAtc29saWQgb3B0aW9uIG5vdyB3b3JrcyBpbiB4ZmNlLgotCQlJZiBhdmFpbGFibGUsIHRoZSBkYnVzX2xhdW5jaCgxKSB3aWxsIGJlIHVzZWQgaW4KLQkJRklORENSRUFURURJU1BMQVkgZm9yIGdub21lIHNlc3Npb25zLgotCi0JVGhlIGJjeF94YXR0YWNoIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgd2FzIGFkZGVkIHRvIGZhY2lsaXRhdGUKLQkJeGF0dGFjaCBhbmQgeDJ4IGRlc2t0b3AgY3Vyc29yIHN3aXRjaGluZy4gIE90aGVyIG5ldwotCQlyZW1vdGUgY29udHJvbCBjb21tYW5kczogZ3JhYl9zdGF0ZSwgcGluZzpteXN0cmluZywKLQkJZ3JhYmxvY2FsLCByZXNlbmRfY3V0YnVmZmVyLCByZXNlbmRfY2xpcGJvYXJkLAotCQlyZXNlbmRfcHJpbWFyeSwga2V5Y29kZSwga2V5c3ltLCBmYWtlYnV0dG9uZXZlbnQsCi0JCXB0ciwgc2xlZXAsIGdldF94cHJvcCwgc2V0X3hwcm9wLCB3aW5pbmZvLCBwb2ludGVyX3BvcywKLQkJbW91c2VfeHksIG5vb3AsIGd1ZXNzX2RidXMsIERJUkVDVDpxdWVyeS4gIFJlbW90ZSBjb250cm9sCi0JCXNjcmlwdGluZywgLXF1ZXJ5X3JldHJpZXMsIGFuZCAtcmVtb3RlX3ByZWZpeCB3ZXJlCi0JCWFsc28gYWRkZWQuCi0KLQlJbiAtcmF3ZmIgbW9kZSB0aGUgWCBkaXNwbGF5IHdpbGwgbm90IGJlIG9wZW5lZCBhdCBhbGwgdW5sZXNzCi0JCXRoZSAtcmF3ZmIgc3RyaW5nIGlzIHByZWZpeGVkIHdpdGggJysnIG9yIC1kaXNwbGF5Ci0JCXdhcyBzcGVjaWZpZWQgb24gdGhlIGNtZGxpbmUuCi0KLQlGb3IgbXVsdGlwbGUsIHNlcGFyYXRlIHgxMXZuYyBpbnN0YW5jZXMgb24gdGhlIHNhbWUgWCBkaXNwbGF5LAotCQlvbmUgY2FuIHJlbmFtZSB0aGUgWDExVk5DX1JFTU9URSwgWDExVk5DX1RJQ0tFUiwgYW5kCi0JCVZOQ19DT05ORUNUIHByb3BlcnR5IG5hbWVzIHRvIHVuaXF1ZSBvbmVzLgotCi0JVGhlIC1zaG93cmZiYXV0aCBvcHRpb24gcHJpbnRzIG91dCB0aGUgVk5DIHJmYmF1dGggcGFzc3dvcmQuCi0KLQlUaGUgWERBTUFHRSBtZWNoYW5pc20gaXMgbm93IGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgZm9yIGEKLQkJcGVyaW9kIG9mIHRpbWUgaWYgYSBnYW1lIG9yIHNjcmVlbnNhdmVyIGdlbmVyYXRlcyB0b28KLQkJbWFueSBYREFNQUdFIHJlY3RhbmdsZXMgcGVyIHNlY29uZC4gIFRoaXMgYXZvaWRzIHRoZSBYMTEKLQkJZXZlbnQgcXVldWUgZnJvbSBzb2FraW5nIHVwIHRvbyBtdWNoIG1lbW9yeS4KLQotCXgxMXZuYyBkb2VzIG5vdCBzd2l0Y2ggb24gc2VydmVyIGF1dG9yZXBlYXQgaWYgYW55IGtleXMgYXJlCi0JCXByZXNzZWQgZG93biB0byB3b3JrIGFyb3VuZCBhIHJlY2VudCBYb3JnIHNlcnZlciBhbmQvb3IKLQkJZ25vbWUgYnVnIHdoZXJlIHRoZSBrZXkgd2lsbCBuZXZlciBzdG9wIHJlcGVhdGluZy4KLQotCVRoc2UgbGlzdCBvZiBjdXJyZW50IGNsaWVudHMgaXMga2VwdCBtb3JlIHVwLXRvLWRhdGUgaW4gdGhlCi0JCXRreDExdm5jIGd1aS4gIEJ1Z3MgaW4gdGhlIGd1aSBzZXRwYXNzIG1vZGUgaGF2ZSBiZWVuCi0JCWZpeGVkLgotCi0JVGhyZWFkcyBzdGFiaWxpdHkgaXMgZnVydGhlciBpbXByb3ZlZC4gIFNlZSB1bmRlciB0aGUgLXRocmVhZHMKLQkJb3B0aW9uIGhlbHAgaW5mbyBhYm91dCAtZW52IFgxMVZOQ19USFJFQURTX05FV19GQl9TTEVFUD1tcwotCi0JVGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIHdvcmthcm91bmQ6ICItZW52IFgxMVZOQ19XQVRDSF9EWF9EWT0xIgotCQl0aGF0IHRyaWVzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggcG9vcmx5IGNvbnN0cnVjdGVkCi0JCW1lbnUgdGhlbWVzIHRoYXQgcGxhY2UgdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgdGhlIG1vdXNlCi0JCWN1cnNvciBpbnNpZGUgYSBtZW51IGl0ZW0ncyBhY3RpdmUgem9uZS4KLQotCVRoZSBjcnlwdCgzKSBmdW5jdGlvbiBpcyBub3cgZGVjbGFyZWQgaW5zaWRlIHRoZSB4MTF2bmMgY29kZSBvbgotCQlhbGwgcGxhdGZvcm1zIChub3QganVzdCBMaW51eCkuICBUbyBkaXNhYmxlIHRoaXMsIHNldAotCQlDUFBGTEFHUz0nLURET19OT1RfREVDTEFSRV9DUllQVCcgd2hpbGUgY29uZmlndXJpbmcuCi0JCShjcnlwdCBpcyBkZWNsYXJlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGhlYWRlciBmaWxlcy4pCi0KLQlFcnJvciByZWFzb25zIGFyZSBwcmludGVkIGZvciAtc3RvcmVwYXNzd2QgZmFpbHVyZXMuCi0KLQlUd28gc2NyaXB0cyBhcmUgYWRkZWQgdG8geDExdm5jL21pc2M6IGNvbm5lY3Rfc3dpdGNoIGFuZAotCQl1bHRyYXZuY19yZXBlYXRlci5wbAotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjoKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuOS44CTIwMDktMDctMDgKLQotCi1OZXcgaW4gdGhlIDAuOS44IHgxMXZuYyByZWxlYXNlOgotCi0JQmV0dGVyIHJlbGlhYmlsaXR5IGZvciB0aGUgSmF2YSBWaWV3ZXIgYXBwbGV0IHdoZW4gY29ubmVjdGluZwotCQl0aHJvdWdoIGEgV2ViIFByb3h5IHZpYSBIVFRQUy4JQSBwcm94eSBob3N0bmFtZQotCQlhbmQgcG9ydCBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhcHBsZXQgcGFyYW1ldGVycy4KLQkJUHJveHkgQXV0aGVudGljYXRpb24gdmlhIEF1dGgtQmFzaWMgaXMgc3VwcG9ydGVkLgotCQlNb3JlIHgxMXZuYyBwcmludG91dCBpbiAtc3NsIGlzIHByb3ZpZGVkIHRvIGhlbHAKLQkJdHJvdWJsZXNob290IHRoaXMgbW9kZSBhbmQgb3RoZXIgc3NsIGNvbm5lY3Rpb25zLgotCi0JU3RhYmlsaXR5IGltcHJvdmVtZW50cyB0byAtdGhyZWFkcyBtb2RlLiBSdW5uaW5nIHgxMXZuYyB0aGlzCi0JCXdheSBpcyBtb3JlIHJlbGlhYmxlIG5vdy4gVGhyZWFkZWQgb3BlcmF0aW9uIHNvbWV0aW1lcwotCQlnaXZlcyBiZXR0ZXIgaW50ZXJhY3RpdmUgcmVzcG9uc2UgYW5kIGZhc3RlciB1cGRhdGVzLiBUaGUKLQkJdGhyZWFkZWQgbW9kZSBub3cgc3VwcG9ydHMgbXVsdGlwbGUgVk5DIHZpZXdlcnMgdXNpbmcKLQkJdGhlIHNhbWUgVk5DIGVuY29kaW5nIChzb21lIG9ubHkgb24gTGludXggb3IgZW5hYmxlZAotCQlhdCBidWlsZCB0aW1lLikgIFRoZSB0aHJlYWRlZCBtb2RlIGNhbiBhbHNvIHlpZWxkCi0JCWEgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQgaW4gdGhlIG1hbnkgY2xpZW50IGNhc2UKLQkJKGUuZy4gY2xhc3Mtcm9vbSBicm9hZGNhc3QuKSBXZSBoYXZlIHRlc3RlZCB3aXRoIDMwIHRvCi0JCTUwIHNpbXVsdGFuZW91cyBjbGllbnRzLiAgU2VlIGFsc28gLXJlZmxlY3QuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCXgxMXZuYyBhdXRvbWF0aWNhbGx5IHRyaWVzIHRvIHdvcmsgYXJvdW5kIGFuIFhvcmcgc2VydmVyIGJ1ZwotCQlpbnZvbHZpbmcgaW5maW5pdGVseSByZXBlYXRpbmcga2V5cyB3aGVuIHR1cm5pbmcgb2ZmIGtleQotCQlyZXBlYXRpbmcuIFVzZSAtcmVwZWF0IGlmIHRoZSBhdXRvbWF0aWMgd29ya2Fyb3VuZCBmYWlscy4KLQkJQWxzbywgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFgxMVZOQ19JRExFX1RJTUVPVVQKLQkJKHNlY29uZHMpIGlzIHByb3ZpZGVkLgotCi0JSW4gLXJlZmxlY3QgbW9kZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgWDExVk5DX1JFRkxFQ1RfUEFTU1dPUkQKLQkJaXMgcHJvdmlkZWQuCi0KLQlUaGUgLWNsaXAgbW9kZSB3b3JrcyB1bmRlciAtcmF3ZmIuCi0KLQlUaGUgLW5vdW5peHB3IG9wdGlvbiBjYW4gZGlzYWJsZSB1bml4cHcgbW9kZSBpZiBhbiBlYXJsaWVyIG9wdGlvbgotCQllbmFibGVzIGl0IChlLmcuIC1zdmMpLgotCi0JU2Nyb2xsIGRldGVjdGlvbiBpcyBza2lwcGVkIGZvciB3aW5kb3dzIHdpdGggJ09wZW5PZmZpY2UnIGluCi0JCXRoZWlyIG5hbWUuCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246Ci0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAgfCBsZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuOS43CTIwMDktMDMtMzEKLQotCi1OZXcgaW4gdGhlIDAuOS43IHgxMXZuYyByZWxlYXNlOgotCi0JQmFzaWMgc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2l0aCBWaXJ0dWFsR0wncyBUdXJib1ZOQyAoYW4KLQkJZW5oYW5jZWQgVGlnaHRWTkMgZm9yIGZhc3QgTEFOIGhpZ2ggZnJhbWVyYXRlIHVzYWdlKQotCQllbmNvZGluZyBhbmQgVGlnaHRWTkMgbW9kaWZpY2F0aW9ucy4gIE1vcmUgaW5mbzoKLQkJaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtdHVyYm92bmMKLQkJYW5kIHgxMXZuYy9taXNjL3R1cmJvdm5jL1JFQURNRS4KLQotCVRoZSAtbmNhY2hlX2NyIG9wdGlvbiBoYXMgYmVlbiBmaXhlZCBhbmQgc28gaW4gLW5jYWNoZSBtb2RlCi0JCXNtb290aCBvcGFxdWUgd2luZG93IG1vdGlvbnMgYXJlIG5vdyB3b3JrIGNvcnJlY3RseS4gVHJ5Ci0JCWl0IG91dCB0byBzZWUgaG93IHNtb290aCBpdCBpcyBldmVuIG9uIGEgc2xvdyBsaW5rLgotCi0JU3VwcG9ydCBmb3IgTGludXggdGV4dCBjb25zb2xlcyAodmlydHVhbCB0ZXJtaW5hbHMsIGUuZy4gMS02KQotCQlpcyBwcm92aWRlZCB2aWEsIGUuZy4sICd4MTF2bmMgLXJhd2ZiIHZ0MicgKGZvciB2aXJ0dWFsCi0JCXRlcm1pbmFsICMyKS4KLQotCQlUaGlzIGlzIGxpa2UgTGludXhWTkMgKGkuZS4gdGV4dCBvbmx5KSwgaXQgYXZvaWRzIHVzaW5nCi0JCS9kZXYvZmIgYW5kIHVzZXMgL2Rldi92Y3NhTiBpbnN0ZWFkICh0aGUgJy1yYXdmYiBjb25zb2xlJwotCQltb2RlIHVzZXMgL2Rldi9mYi4pICBXaXRoIC9kZXYvdmNzYU4gdGhlIHRleHQgdGVybWluYWwKLQkJaXMgYWNjZXNzaWJsZSBldmVuIGl0IGlmIGlzIG5vdCB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUuCi0KLQlUaGUgLXJhd2ZiIG9wdGlvbiBub3cgc3VwcG9ydHMgZnJhbWVidWZmZXJzIHdpdGggYml0cyBwZXIgcGl4ZWwKLQkJbGVzcyB0aGFuIDggKGUuZy4gNCBvciAxIGJwcC4pCi0KLQlSZXZlcnNlIGNvbm5lY3Rpb25zIG5vdyB3b3JrIGluIEFub255bW91cyBEaWZmaWUgSGVsbG1hbiBTU0wvVExTCi0JCW1vZGUuICBSZXZlcnNlIGNvbm5lY3Rpb25zIGFsc28gd29yayBmb3IgVmVOQ3J5cHQgYW5kCi0JCUFOT05UTFMgbW9kZXMuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVRoZSBpbmNsdWRlZCBTU0wgZW5hYmxlZCBVbHRyYVZOQyBqYXZhIHZpZXdlciBub3cgaGFzIGEKLQkJY29uZmlndXJhYmxlIFtIb21lXSBlbnRyeSBpbiB0aGUgZHJpdmVzIGRyb3AgZG93biBtZW51LgotCi0JSW4gdGhlIC1jcmVhdGUsIC1zdmMsIGV0Yy4gbW9kZXMgb25lIGNhbiBub3cgc3BlY2lmeSBhCi0JCXJhbmdlIG9mIFggZGlzcGxheXMgdG8gaWdub3JlIGluIFgxMVZOQ19TS0lQX0RJU1BMQVkuCi0JCUltcHJvdmVtZW50cyBhbmQgYnVnZml4ZXMgd2VyZSBtYWRlIHRvIHRoZSBmaW5kX2Rpc3BsYXkKLQkJYW5kIGNyZWF0ZV9kaXNwbGF5IHNjcmlwdHMuICBGRF9FWFRSQSBvcHRpb24gaXMgcHJvdmlkZWQuCi0KLQlUaGUgJy1yYXdmYiB2aWRlbycgb3B0aW9uIGZpbmRzIHRoZSB2aWRlbyBkZXZpY2UgZmlsZSBtb3JlCi0JCWNhcmVmdWxseS4KLQotCVRoZSAtcm1mbGFnIG9wdGlvbiBhbGxvd3MgYSBuZXcgd2F5IHRvIGluZGljYXRlIHRvIG90aGVyCi0JCWFwcGxpY2F0aW9ucyB0aGF0IHgxMXZuYyBoYXMgc3RhcnRlZC4KLQotCUFsbCBvZiB0aGUgamF2YSBhcHBsZXQgcGFyYW1ldGVycyBhcmUgbm93IGRvY3VtZW50ZWQgaW4KLQkJdGhlIGNsYXNzZXMvc3NsL1JFQURNRSBmaWxlLgotCi0JVGhlcmUgaXMgbm93IGEgInNlbmRiZWxsIiByZW1vdGUgY29udHJvbCBjb21tYW5kLgotCi0JQSBvbmUtdGltZSAtcGFkZ2VvbSBvbmNlOld4SCBtb2RlIGlzIGFkZGVkLgotCi0JSW1wcm92ZW1lbnRzIHRvIHRoZSBDVVBTIFRlcm1pbmFsIFNlcnZpY2VzIGhlbHBlciBtb2RlLgotCi0JSWYgdGhlIFggZGlzcGxheSBjYW5ub3QgYmUgb3BlbmVkIG5vcm1hbGx5IHRoZW4gdGhlIGVudi4gdmFyLgotCQlYQVVUSExPQ0FMSE9TVE5BTUU9bG9jYWxob3N0IGlzIHRyaWVkLgotCi0JQnVnZml4IGZvciBzZWxlY3Rpb24gdHJhbnNmZXIgdG8gYSBub3cgbm9uLWV4aXN0ZW50IFggd2luZG93Ci0JCShUaHVuZGVyYmlyZCBjYW4gY2F1c2UgdGhpcy4pICBSZWxhdGVkLCB0aGUgZW52LiB2YXJpYWJsZQotCQlMSUJYQ0JfQUxMT1dfU0xPUFBZX0xPQ0sgaXMgbm93IHNldCBieSBkZWZhdWx0LgotCi0JQnVnZml4IGZvciAtOHRvMjQgbW9kZSBkdWUgdG8gbm9uc3RhbmRhcmQgaW5kZXhlZCBjb2xvciBzdXBwb3J0LgotCi0JVGhlIGxpYnZuY3NlcnZlciBhbmQgeDExdm5jIGF1dG9jb25mL2F1dG9tYWtlIHNldHRpbmdzIGhhdmUKLQkJYmVlbiBpbXByb3ZlZC4KLQotCWxpYlhyYW5kciBpbmNsdWRlIGZpbGUgaXMgbm93IGZvdW5kIG9uIFNvbGFyaXMuCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246IAotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwIHwgbGVzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjkuNgkyMDA4LTEyLTEwCi0KLQotTmV3IGluIHRoZSAwLjkuNiB4MTF2bmMgcmVsZWFzZToKLQotCXgxMXZuYydzIFNTTCBlbmNyeXB0aW9uIGlzIGV4dGVuZGVkIHRvIHN1cHBvcnQgdGhlIFZlTkNyeXB0IGFuZAotCQlUTFMgKG9sZGVyOyB2aW5vKSBTU0wvVExTIHNlY3VyaXR5IHR5cGUgZXh0ZW5zaW9ucyB0byBWTkMuCi0KLQlBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlICgtc3NsIEFOT04pIGFuZCBDZXJ0aWZpY2F0ZQotCQlSZXZvY2F0aW9uIExpc3Qgc3VwcG9ydCAoLXNzbENSTCkgaXMgYWRkZWQgdG8gdGhlIFNTTAotCQllbmNyeXB0aW9uIG1vZGUuCi0KLQlUaGUgSmF2YSB2aWV3ZXIgYXBwbGV0IGNhbiBub3cgYmUgc2VydmVkIHVwIHRocm91Z2ggdGhlIFZOQyBwb3J0Ci0JCSg1OTAwKSBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsIEhUVFAgcG9ydCAoNTgwMCkgdmlhCi0JCXRoZSAtaHR0cF9vbmVwb3J0IG9wdGlvbi4gIFByZXZpb3VzbHkgdGhpcyBvbmx5IHdvcmtlZAotCQlmb3IgU1NMIGNvbm5lY3Rpb25zIGFuZCBIVFRQUy4KLQotCVRoZSAiLXJmYnBvcnQgUFJPTVBUIiBtb2RlIHByZXNlbnRzIGEgc2ltcGxlIGd1aSBmb3IgdGhlIHVzZXIKLQkJdG8gc2VsZWN0IGEgcG9ydCBmb3IgdGhlIHgxMXZuYyBzZXJ2aWNlIGFuZCBhIGZldyBvdGhlcgotCQlzZXR0aW5ncy4gIFRoaXMgZW5hYmxlcyBhIG1lbnUgZW50cnkgZm9yIG5haXZlIHVzZXJzCi0JCXRoYXQgaXMgaW5jbHVkZWQgaW4geDExdm5jLmRlc2t0b3AuCi0KLQlJZiB4MTF2bmMgaXMgbm90IGJ1aWx0IHdpdGggdGhlIEF2YWhpIFplcm9jb25mIGxpYnJhcnkgYW4gZXh0ZXJuYWwKLQkJaGVscGVyIHByb2dyYW0gKGF2YWhpLXB1Ymxpc2ggb3IgZG5zLXNkIG9uIE1hYyBPUyBYKQotCQlpcyB1c2VkIGluc3RlYWQuCi0KLSAgbWlzY2VsbGFuZW91cyBuZXcgZmVhdHVyZXMgYW5kIGNoYW5nZXM6Ci0KLQlUaGUgZGVmYXVsdCBtb2RlIGZvciAnLXNzbCcgaXMgbm93IHRoZSAnLXNzbCBTQVZFJyBtb2RlOyBpLmUuCi0JCXRoZSBnZW5lcmF0ZWQgY2VydGlmaWNhdGUgaXMgc2F2ZWQgYW5kIHJldXNlZCBpbgotCQlzdWJzZXF1ZW50IHNlc3Npb25zIHJhdGhlciB0aGFuIGJlaW5nIGRpc2NhcmRlZC4KLQkJVXNlICctc3NsIFRNUCcgcmVjb3ZlciB0aGUgb2xkIHdheS4gIFRoaXMgY2hhbmdlIG1hZGUKLQkJdG8gZm9yIGl0IHRvIGJlIG1vcmUgbGlrZWx5IHRoYXQgdGhlIFZOQyBWaWV3ZXIgY2FuIHNhdmUKLQkJdGhlIGFjY2VwdGVkIGNlcnQgZm9yIGZ1dHVyZSBhdXRoZW50aWNhdGlvbnMuCi0KLQlUaGUgc29saWQgYmFja2dyb3VuZCBjb2xvciBvcHRpb24gd29ya3Mgb24gdGhlIE1hYyBPUyBYIGNvbnNvbGUuCi0KLQlUaGUgLXJlb3BlbiBvcHRpb24gZW5hYmxlcyB4MTF2bmMgdG8gdHJ5IHRvIHJlIGNvbm5lY3QgdG8gdGhlIFgKLQkJZGlzcGxheSBpZiBHRE0gKG9yIG90aGVyIGRpc3BsYXkgbWFuYWdlcikga2lsbHMgaXQganVzdAotCQlhZnRlciB0aGUgdXNlciBsb2dzIGluLgotCi0JVGhlIC1kaHBhcmFtcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8geW91ciBvd24gRGlmZmllCi0JCUhlbGxtYW4gcGFyYW1ldGVycy4KLQotCVRoZSAtc2V0ZGVmZXIgb3B0aW9uIGFsbG93cyB0dW5pbmcgaG93IHF1aWNrbHkgdXBkYXRlcyB3aWxsCi0JCWJlIHNlbnQuICBEZWZhdWx0IHNldHRpbmcgdHVuZWQuCi0KLQlUaGUgb3B0aW9uIC16ZXJvY29uZiBpcyBub3cgYW4gYWxpYXMgZm9yIC1hdmFoaS8tbWRucy4KLQotCUluIHBpcGVpbnB1dCBtb2RlLCB0aGUgcGlwZSBmaWxlaGFuZGxlIGlzIG5vdyBjbG9zZWQgd2hlbgotCQl4MTF2bmMgZXhpdHMuCi0KLQlUaGUgLXNzaG9ubHkgb3B0aW9uIHR1cm5zIG9mZiBWZU5DcnlwdCBhbmQgVExTVk5DICh2aW5vKSBtb2QKLQkJbGVhdmluZyBvbmx5IHRoZSBzdGFuZGFyZCBTU0wgKGkuZS4gdm5jczovLykKLQotCUZvciB0ZXN0aW5nLCB0aGUgb3B0aW9uIC1yYW5kIGluIGFuIGFsaWFzIGZvciAtcmF3ZmIgcmFuZCAtbm9wdwotCi0JTWlub3IgdHdlYWtzIHRvIGltcHJvdmUgQ1VQUyBQcmludCB0dW5uZWxpbmcuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOiAKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC45LjUJMjAwOC0xMC0yNAotCi0KLU5ldyBpbiB0aGUgMC45LjUgeDExdm5jIHJlbGVhc2U6Ci0KLQlTeW1tZXRyaWMga2V5IGVuY3J5cHRpb24gdXNpbmcgdGhlIFJDNCwgQUVTLCBCbG93ZmlzaCwgYW5kIDNERVMKLQkJY2lwaGVycyBpcyBzdXBwb3J0ZWQgdmlhIHRoZSAtZW5jIGNpcGhlcjprZXlmaWxlIG9wdGlvbi4KLQkJVGhlIFNTVk5DIHVuaXggdmlld2VyIDEuMC4yMCBhbmQgbGF0ZXIgc3VwcG9ydHMgdGhlc2UKLQkJZW5jcnlwdGlvbiBtZXRob2RzLgotCi0JU2VydmVyLXNpZGUgc2NhbGluZyBjYW4gbm93IGhhdmUgZGlmZmVyZW50IHNjYWxlIGZhY3RvcnMgYWxvbmcKLQkJdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGF4ZXMuICBFLmcuIC1zY2FsZSAxMjgweDEwMjQKLQkJKHNhbWUgYXMgLWdlb21ldHJ5IDEyODB4MTAyNCkgb3IgLXNjYWxlIDAuOHgwLjc1Ci0KLQlUaGUgLWNoYXR3aW5kb3cgb3B0aW9uIGFsbG93cyBhIGNoYXQgd2luZG93IHRvIGFwcGVhciBvbiB0aGUKLQkJWCBjb25zb2xlIGR1cmluZyBVbHRyYVZOQyBjaGF0cyAocmVxdWlyZXMgdGhlIFNTVk5DCi0JCXZpZXdlciBwYWNrYWdlLikKLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVRoZSBIVFRQIEphdmEgdmlld2VyIGFwcGxldCBqYXIsIGNsYXNzZXMvVm5jVmlld2VyLmphciwgaGFzCi0JCWJlZW4gdXBkYXRlZCB3aXRoIGFuIGltcHJvdmVkIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uCi0JCXRoZSBjb2RlIHVzZWQgYnkgdGhlIGNsYXNzZXMvc3NsIGFwcGxldHMuCi0KLQlBIGRlc2NyaXB0aW9uIGFuZCBpbnN0cnVjdGlvbnMgYXJlIG5vdyBwcmludGVkIG91dCB3aGVuCi0JCVhfU2htQXR0YWNoIGZhaWxzIGlmIG9uZSB0cmllcyB0byBhdHRhY2ggdG8gYSByZW1vdGUKLQkJJERJU1BMQVkgKGkuZS4gJERJU1BMQVkgaXMgb24gYSBkaWZmZXJlbnQgbWFjaGluZSBmcm9tCi0JCXRoZSBtYWNoaW5lIHgxMXZuYyBpcyBydW5uaW5nIG9uOyB0aGlzIG9mdGVuIGhhcHBlbnMKLQkJd2l0aCBTU0ggWCByZWRpcmVjdGlvbiwgWCB0ZXJtaW5hbCBzZXJ2ZXJzLCBldGMpLgotCi0JVGhlIC1hbGxvdyBvcHRpb24gbm93IHdvcmtzIGNvcnJlY3RseSBpbiAtc3NsIG1vZGUuCi0KLQlUaGUgLXJlbWFwIG9wdGlvbiBub3cgd29ya3Mgb24gdGhlIE1hY09TWCBjb25zb2xlLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAgfCBsZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuOS40CTIwMDgtMDktMTcKLQotCi1OZXcgaW4gdGhlIDAuOS40IHgxMXZuYyByZWxlYXNlOgotCi0JUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgKC1jb25uZWN0IGFuZCAgLWNvbm5lY3Rfb3JfZXhpdCBvcHRpb25zKQotCQl3b3JrIGluIHRoZSAtZmluZCBhbmQgLWNyZWF0ZSBYIHNlc3Npb24gRklORENSRUFURURJU1BMQVkKLQkJbW9kZXMuCi0KLQlSZXZlcnNlIFZOQyBjb25uZWN0aW9ucyAoZWl0aGVyIG5vcm1hbCBvciB1c2luZyBTU0wpIGNhbiB1c2UgYQotCQlXZWIgUHJveHksIGEgU09DS1MgcHJveHksIHRoZSBVbHRyYVZOQyByZXBlYXRlciBwcm94eSwKLQkJYW4gU1NIIGNvbm5lY3Rpb24sIG9yIGV2ZW4gYSBDR0kgVVJMIHRvIG1ha2UgdGhlIG91dGdvaW5nCi0JCWNvbm5lY3Rpb24gKC1wcm94eSBvcHRpb24pLiAgRm9yd2FyZCBjb25uZWN0aW9ucyBjYW4KLQkJdXNlIHRoZSAtc3NoIG9wdGlvbiB0byBzZXQgdXAgYSByZWFjaGFibGUgcmVkaXJlY3Rpb24uCi0KLQlTdXBwb3J0IGZvciB0aGUgWllXUkxFIGVuY29kaW5nIGlzIGFkZGVkLCB0aGlzIGlzIHRoZSBSZWFsVk5DIFpSTEUKLQkJZW5jb2RpbmcgZXh0ZW5kZWQgdG8gZG8gbW90aW9uIHZpZGVvIGFuZCBwaG90byByZWdpb25zCi0JCW1vcmUgZWZmaWNpZW50bHkgYnkgd2F5IG9mIGEgV2F2ZWxldCBiYXNlZCB0cmFuc2Zvcm1hdGlvbi4KLQotCVRoZSBzZXNzaW9uIGZpbmRpbmcgYW5kIGNyZWF0aW5nIG1vZGVzICgtZmluZCBhbmQgLWNyZWF0ZSkgaGF2ZQotCQliZWVuIGltcHJvdmVkIHRvIGJlIG1vcmUgcmVsaWFibGUgYW5kIGFsc28gcHJvdmlkZSBhIG5ldwotCQlkZXNrdG9wIHR5cGVzICh4ZmNlKSBhbmQgbmV3IHNlcnZpY2UgcmVkaXJlY3Rpb24gb3B0aW9ucy4KLQotCVN1cHBvcnQgZm9yIGluZGV4ZWQgY29sb3JtYXBzIChQc2V1ZG9Db2xvcikgd2l0aCBkZXB0aHMgb3RoZXIKLQkJdGhhbiA4IGlzIHByb3ZpZGVkIChkZXB0aHMgMSB0byAxNiBub3cgd29yaykuCi0KLQlKYXZhIHZpZXdlciBhcHBsZXQgc291cmNlIGNvZGUgaXMgcHJvdmlkZWQgaW4gdGhlIHgxMXZuYyAwLjkuNAotCQl0YXJiYWxsIHNvIG5vdyBldmVyeXRoaW5nIGNhbiBiZSBidWlsdCBmcm9tIHNvdXJjZS4gIAotCi0gIG1pc2NlbGxhbmVvdXMgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzOgotCi0JVG8gdW5zZXQgQ2Fwc19Mb2NrLCBOdW1fTG9jayBhbmQgcmFpc2UgYWxsIGtleXMgaW4gdGhlIFggc2VydmVyCi0JCXVzZSAtY2xlYXJfYWxsLCBvciBieSByZW1vdGUgY29udHJvbCAneDExdm5jIC1SIGNsZWFyX2FsbCcKLQotCVRoZSAtYXV0b3BvcnQgb3B0aW9uIGdpdmVzIG1vcmUgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgcG9ydAotCQlyYW5nZSB0aGF0IHByb2Jlcy4KLQotCVRoZSAtcGluZyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gaGVscCBrZWVwIGlkbGUgY29ubmVjdGlvbnMgYWxpdmUuCi0KLQlUaGUgLWZpbmRkcHkgYW5kIC1saXN0ZHB5IHV0aWxpdGllcyBoZWxwIHRvIGRlYnVnIGFuZCBjb25maWd1cmUKLQkJdGhlIC1maW5kLCAtY3JlYXRlLCBhbmQgLWRpc3BsYXkgV0FJVDouLi4gbW9kZXMuCi0KLQlTb21lIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2Ygc2NyZWVuIHJlc2l6ZXMgYXJlIGhhbmRsZWQgZXZlbiBpZgotCQl0aGUgLXhyYW5kciBvcHRpb24gaXMgbm90IHN1cHBsaWVkLgotCi0JVGhlIC1hZHZlcnRpc2VfdHJ1ZWNvbG9yIG9wdGlvbiBjYW4gd29ya2Fyb3VuZCBzb21lIFZOQyB2aWV3ZXIKLQkJaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBQc2V1ZG9Db2xvci4KLQotCVRoZSBvcHRpb24gJy1jbGlwIHhpbmVyYW1hMCcgY2FuIGJlIHVzZWQgdG8gY2xpcCB0byB0aGUgZmlyc3QKLQkJWGluZXJhbWEgc3ViLXNjcmVlbiwgZXRjLgotCi0JSWYgYSBmYXN0IGZyYW1lYnVmZmVyIHJlYWQgcmF0ZSBpcyBkZXRlY3RlZCB0aGUgLXdhaXQgYW5kIC1kZWZlcgotCQlwYXJhbWV0ZXJzIGFyZSByZWR1Y2VkIHRvIDEwIGFuZCAxNSBtc2VjLCByZXNwZWN0aXZlbHkuCi0KLQlQYXN0aW5nIG9mIHRoZSBzZWxlY3Rpb24vY2xpcGJvYXJkIGludG8gcmVtb3RlIGFwcGxpY2F0aW9ucwotCQkoZS5nLiBKYXZhKSBpcyBpbXByb3ZlZC4KLQotCVVzYWdlIHdpdGggZHZvcmFrIGtleWJvYXJkcyBpcyBpbXByb3ZlZC4gIFRoZSBvcHRpb24gLW1hY3Vza2JkIGlzCi0JCWF2YWlsYWJsZSBvbiBNYWNPU1ggdG8gdXNlIHRoZSBvcmlnaW5hbCBVUyBrZXlib2FyZCBjb2RlLgotCi0JVmlhIGEgY29tcGlsZXIgb3B0aW9uICgtREVOQUJMRV9HUkFCTE9DQUwpIG9uZSBjYW4gdXNlIHRoZQotCQktZ3JhYmxvY2FsIG4gb3B0aW9uIHRvIGZpbHRlciBWTkMgY2xpZW50IGlucHV0IGlmIHNvbWVvbmUKLQkJYXQgdGhlIGNvbnNvbGUgaGFzIGRvbmUgbW91c2Ugb3Iga2V5Ym9hcmQgaW5wdXQgbiBzZWNzIGFnby4gCi0KLQlUaGUgLXNsZWVwaW4gb3B0aW9uIGNhbiBub3cgc2xlZXAgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbgotCQltaW4gYW5kIG1heCB0aW1lIGRlbGF5cyAoLXNsZWVwaW4gbWluLW1heCkuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOiAKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC45LjMJMjAwNy0xMC0wNAotCi0KLU5ldyBpbiB0aGUgMC45LjMgeDExdm5jIHJlbGVhc2U6Ci0KLQlUaGlzIHJlbGVhc2UgcHJvdmlkZXMgY2xpZW50LXNpZGUgY2FjaGluZyB0byBpbXByb3ZlIGludGVyYWN0aXZlCi0JcmVzcG9uc2UuICBBbG1vc3Qgbm8gVk5DIHZpZXdlcnMgaW1wbGVtZW50IGNhY2hpbmcgd2hpY2ggaXMgd2h5Ci0JVk5DIGlzIHNsb3cgY29tcGFyZWQgdG8gb3RoZXIgcmVtb3RlIGdyYXBoaWNzIHByb3RvY29scy4KLQotCVRoZSB4MTF2bmMgY2FjaGluZyB3aWxsIHdvcmsgd2l0aCBhbnkgVk5DIHZpZXdlciwgYnV0IHRoZXkgd2lsbAotCW5vdCBoaWRlIHRoZSBwaXhtYXAgY2FjaGUgcmVnaW9uIHRoYXQgaXMgYmVsb3cgdGhlIG1haW4gZGVza3RvcAotCShvbmUgbXVzdCBhZGp1c3QgdGhlIHdpbmRvdyBtYW51YWxseSkuICBUaGUgU1NWTkMgVW5peCBWTkMgdmlld2VyLAotCWhvd2V2ZXIsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgaGlkZXMgdGhlIHJlZ2lvbi4KLQotCVRvIGVuYWJsZSBjYWNoaW5nLCBzdXBwbHkgIi1uY2FjaGUgbiIgdG8geDExdm5jLCB3aGVyZSB0aGUKLQludW1iZXIgbiwgZS5nLiAxMCwgaW5kaWNhdGVzIGhvdyBtdWNoIG1lbW9yeSB0byBkZXZvdGUgdG8gdGhlCi0JY2FjaGluZyBzY2hlbWUuCi0KLQlTZWUgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8jZmFxLWNsaWVudC1jYWNoaW5nCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOiAKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC45LjIJMjAwNy0wNi0xOAotCi0KLU5ldyBpbiB0aGUgMC45LjIgeDExdm5jIHJlbGVhc2U6Ci0KLQlBIGNvbXBpbGUtdGltZSBidWcgaXMgZml4ZWQgZm9yIHdoZW4gdGhlIE9wZW5TU0wgbGlicmFyeSBpcyBub3QKLQkJYXZhaWxhYmxlIG9yIC0td2l0aG91dC1zc2wgaXMgc3VwcGxpZWQ7IHByZXZpb3VzbHkgdGhlCi0JCWJ1aWxkIHdvdWxkIGZhaWwuCi0KLQlPbmUgY2FuIGNvbmZpZ3VyZSB4MTF2bmMgdmlhICJjb25maWd1cmUgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIiCi0JCXRvIHVzZSBhIHN5c3RlbSBpbnN0YWxsZWQgbGlidm5jc2VydmVyIGxpYnJhcnkgaW5zdGVhZCBvZgotCQl0aGUgb25lIGJ1bmRsZWQgaW4gdGhlIHJlbGVhc2UgdGFyYmFsbC4gCi0KLQlJZiBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyIG9yIGNoYXQgaXMgZGV0ZWN0ZWQsIHRoZW4gVk5DIGNsaWVudHMKLQkJYXJlICJwaW5nZWQiIG1vcmUgb2Z0ZW4gdG8gcHJldmVudCB0aGVzZSBzaWRlIGNoYW5uZWxzCi0JCWZyb20gYmVjb21pbmcgc2VydmljZWQgdG9vIGluZnJlcXVlbnRseS4KLQotCUluIC11bml4cHcgbW9kZSBpbiB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGRpYWxvZyBubyB0ZXh0IHdpbGwKLQkJYmUgZWNob2VkIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgc2VudCBpcyAiRXNjYXBlIi4gIFRoaXMKLQkJZW5hYmxlcyBhIGNvbnZlbmllbmNlIGZlYXR1cmUgaW4gU1NWTkMgdG8gc2VuZCB0aGUgdXNlcm5hbWUKLQkJYW5kIHBhc3N3b3JkIGF1dG9tYXRpY2FsbHkuICAKLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVdoZW4gYnVpbGRpbmcgZnJvbSB0aGUgQ1ZTIHRyZWUgLS13aXRoLXgxMXZuYyBtdXN0IGJlIHN1cHBsaWVkIGlmCi0JCXlvdSB3YW50IHgxMXZuYyB0byBiZSBidWlsdC4gIFRoZSBMaWJWTkNTZXJ2ZXIgcmVsZWFzZQotCQl0YXJiYWxsIG5vIGxvbmdlciBjb250YWlucyB0aGUgeDExdm5jIHNvdXJjZS4KLQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAgfCBsZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuOS4xCTIwMDctMDUtMjQKLQotCi1OZXcgaW4gdGhlIDAuOS4xIHgxMXZuYyByZWxlYXNlOgotCi0JQSBuZXcgVW5peCB1c2VybmFtZSBpZGVudGlmaWNhdGlvbiBzY2hlbWUgaXMgcHJvdmlkZWQgd2hlbgotCQlTU0wgY2xpZW50IGNlcnRpZmljYXRlcyBhcmUgdXNlZCB0byBhdXRoZW50aWNhdGUgVk5DCi0JCXZpZXdlcnMuICBUaGUgdXNlcm5hbWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlICdTdWJqZWN0JwotCQlzZWN0aW9uIG9mIHRoZSBjZXJ0LiAgVGhlIG9wdGlvbiBpcyAiLXVzZXJzIHNzbHBlZXI9IgotCQl3aGljaCwgbGlrZSAiLXVzZXJzIHVuaXhwdz0iIGFscmVhZHkgZG9lcywgd2lsbCBjYXVzZQotCQlhIHN3aXRjaCB0byB0aGUgVW5peCB1c2VyLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHRoZQotCQktZmluZCBhbmQgLWNyZWF0ZSBvcHRpb25zIHRoYXQgdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcKLQkJWCBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBvciBjcmVhdGUgYSBuZXcgb25lLgotCi0JVGhlIFVsdHJhVk5DIEphdmEgVmlld2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgU1NMCi0JCWNvbm5lY3Rpb25zLiAgU29tZSBidWdzIHdlcmUgYWxzbyBmaXhlZCBhbmQgc29tZQotCQlpbXByb3ZlbWVudHMgYWRkZWQuICBBIHBhdGNoIGZpbGUgYW5kIGEgY29tcGlsZWQgamFyIGZpbGUKLQkJKFVsdHJhVmlld2VyU1NMLmphciBhbmQgU2lnbmVkVWx0cmFWaWV3ZXJTU0wuamFyIGluIHRoZQotCQljbGFzc2VzL3NzbCBkaXJlY3RvcnkpIGFyZSBwcm92aWRlZCBpbiB0aGUgeDExdm5jIHBhY2thZ2UuCi0KLQlGb3IgdGhlIC11c2VyIG9wdGlvbiBncm91cHMgYXJlIG5vdyBoYW5kbGVkIGJldHRlciBieSB1c2luZwotCQlpbml0Z3JvdXBzKDMpLCBvciBpZiBmaW5lciBjb250cm9sIGlzIG5lZWRlZCBvbmUgY2FuCi0JCXVzZTogIi11c2VycyB1c2VyMS5ncm91cDEsLi4uIgotCi0JV2hlbiBTU0wgY2xpZW50IGNlcnRpZmljYXRpb24gaXMgYmVpbmcgdXNlZCBhbmQgZXh0ZXJuYWwgbG9naW4KLQkJcHJvZ3JhbXMgYXJlIGJlaW5nIHVzZWQgdGhlIGVudi4gdmFyLiBSRkJfU1NMX0NMSUVOVF9DRVJUCi0JCWlzIHNldCB0byB0aGUgY2xpZW50cyBjZXJ0aWZpY2F0ZS4gIFNldCBYMTFWTkNfU1NMUEVFUl9DTgotCQl0byB1c2UgdGhlIENvbW1vbiBOYW1lIGluc3RlYWQgb2YgdGhlIGNlcnRpZmljYXRlIGVtYWlsCi0JCWFkZHJlc3MgdG8gZmluZCB0aGUgdW5peCB1c2VybmFtZS4KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVRoZSAtd2FpdCBhbmQgLWRlZmVyIGRlZmF1bHRzIHdlcmUgbG93ZXJlZCBmcm9tIDMwIHRvIDIwCi0JCW1pbGxpc2Vjb25kcywgc2V0IHRoZSB2YWx1ZXMgZXhwbGljaXRseSBpZiB0aGlzIGluY3JlYXNlcwotCQl0aGUgbG9hZCB0b28gbXVjaCBmb3IgeW91ciBsaWtpbmcuCi0KLQlJbiAtY3JlYXRlIG1vZGUgd2hlcmUgYSBYdmZiIHNlc3Npb24gaXMgc3RhcnRlZCwgbXdtIHdhcyBhZGRlZAotCQlhcyBhIHNlc3Npb24gdHlwZS4gIHNldHBncnAoMikgaXMgdXNlZCBmb3IgdGhlIHNwYXduZWQKLQkJcHJvY2VzcyBpZiBhdmFpbGFibGUuICBUaGUgWEtFWUJPQVJEIGV4dGVuc2lvbiBpcyAKLQkJZW5hYmxlZCAoK2tiLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGFsd2F5cyB3b3JrKS4KLQkJVHJ1ZUNvbG9yIGlzIGZvcmNlZCB0byBiZSB0aGUgZGVmYXVsdCB2aXN1YWwgKHJlY2VudAotCQlYdmZiIHNlZW0gdG8gY2hvb3NlIERpcmVjdENvbG9yLCB0aGlzIGlzIGxpa2VseSBhIGJ1ZykKLQkJT25lIGNhbiBhbHNvIGZvcmNlIGNyZWF0aW5nIGEgbmV3IFh2ZmIgYnkgc2V0dGluZyB0aGUKLQkJZW52LiB2YXIuIFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFMgKG5vdCBleGFjdGx5Ci0JCWNsZWFyIHdoYXQgdGhpcyB3b3VsZCBiZSB1c2VkIGZvcikuIAotCi0JVGhlIFdBSVRCRyBlbnYuIHZhci4gZW5hYmxlcyAtZGlzcGxheSBXQUlUOi4uLiB0byB0YWtlIHBsYWNlIGluCi0JCXRoZSBiYWNrZ3JvdW5kLgotCi0JT25lIGNhbiBzcGVjaWZ5IHRoZSBYMTFWTkNfU0tJUF9ESVNQTEFZIGVudi4gdmFyLiBmb3IgYSBsaXN0IG9mCi0JCWRpc3BsYXlzIHRvIGV4Y2x1ZGUgaW4gdGhlIEZJTkRESVNQTEFZIGFjdGlvbi4JVGhpcyBjYW4KLQkJYWxzbyBiZSBzcGVjaWZpZWQgdmlhIG5kPS4uLiBhcyBhIC11bml4cHcgbG9naW4gb3B0aW9uLgotCi0Jc2V0c2lkKCkgb3Igc2V0cGdycCgpIGlzIGNhbGxlZCBmb3IgdGhlIGV4dGVybmFsIGNvbW1hbmQgc3Bhd25lZAotCQlieSB0aGUgLWdvbmUgb3B0aW9uIChzaW5jZSBpdCBtYXkgYmUgbG9uZyBsaXZlZCwgZS5nLiBhCi0JCXNjcmVlbiBsb2NrZXIpLgotCi0JVGhlIHNjcmlwdCAib25ldGltZWtleSIgdXRpbGl0eSBpcyBwcm92aWRlZCBpbiB0aGUgY2xhc3Nlcy9zc2wKLQkJc3ViZGlyZWN0b3J5IHRoYXQgYWxsb3dzIGEgKHZlcnkgbG9uZykgc3RyaW5nIHJlcHJlc2VudGluZwotCQlhIENsaWVudCBTU0wgY2VydGlmaWNhdGUgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGF1dGhlbnRpY2F0aW5nCi0JCWNsaWVudCwgb3IgdmlhIGh0dHBzIGNnaSBzY3JpcHQgKGUuZy4gYWZ0ZXIgYSB3ZWIgbG9naW4pLgotCi0JU29tZSBidWdzIHdlcmUgZml4ZWQgaW4gdGhlIGxpYnZuY3NlcnZlciBpbXBsZW1lbnRhdGlvbiBvZgotCQlVbHRyYVZOQyBmaWxlIHRyYW5zZmVyLgotCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246IAotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwIHwgbGVzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjkJMjAwNy0wNC0xOAotCi0KLU5ldyBpbiB0aGUgMC45IHgxMXZuYyByZWxlYXNlOgotCi0JVk5DIFNlcnZpY2UgYWR2ZXJ0aXNpbmcgdmlhIG1ETlMgLyBaZXJvQ29uZiAvIEJvbkpvdXIgd2l0aCB0aGUKLQkJQXZhaGkgY2xpZW50IGxpYnJhcnkuIEVuYWJsZSB2aWEgIi1hdmFoaSIuCi0KLQlJbXBsZW1lbnRhdGlvbnMgb2YgVWx0cmFWTkMncyBUZXh0Q2hhdCwgU2luZ2xlV2luZG93LCBhbmQKLQkJU2VydmVySW5wdXQgZXh0ZW5zaW9ucyAocmVxdWlyZXMgdWx0cmF2bmMgdmlld2VyIG9yIHNzdm5jCi0JCVVuaXggdmlld2VyKS4gVGhleSB0b2dnbGUgdGhlIHNlbGVjdGlvbiBvZiBhIHNpbmdsZSB3aW5kb3cKLQkJKC1pZCksIGFuZCBkaXNhYmxlIChmcmllbmRseSkgdXNlciBpbnB1dCBhbmQgdmlld2luZwotCQkobW9uaXRvciBibGFuaykgYXQgdGhlIFZOQyBzZXJ2ZXIuCi0KLQlTaG9ydCBhbGlhc2VzICItZmluZCIsICItY3JlYXRlIiwgIi1zdmMiLCBhbmQgIi14ZG1zdmMiIGZvcgotCQljb21tb25seSB1c2VkIEZJTkRDUkVBVEVESVNQTEFZIHVzYWdlIG1vZGVzICh0byBmaW5kCi0JCXRoZSB1c2VyJ3MgZGlzcGxheSBvciBjcmVhdGUgb25lLCBldGMpLgotCi0JUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgKHZpZXdlciBsaXN0ZW5pbmcpIG5vdyB3b3JrIGluIFNTTAotCQkoLXNzbCkgbW9kZS4KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCU5ldyBvcHRpb25zIHRvIGNvbnRyb2wgdGhlIE1vbml0b3IgcG93ZXIgc3RhdGUgYW5kIGtleWJvYXJkL21vdXNlCi0JCWdyYWJiaW5nOiAtZm9yY2VkcG1zLCAtY2xpZW50ZHBtcywgLW5vc2VydmVyZHBtcywKLQkJYW5kIC1ncmFiYWx3YXlzLgotCi0JQSBzaW1wbGUgd2F5IHRvIGVtdWxhdGUgaW5ldGQoOCkgdG8gc29tZSBkZWdyZWUgdmlhIHRoZSAiLWxvb3BiZyIKLQkJb3B0aW9uLgotCi0JTW9uaXRvciB0aGUgYWNjdXJhY3kgb2YgWERBTUFHRSBhbmQgYXBwbHkgIi1ub3hkYW1hZ2UiIGlmIGl0IGlzCi0JCW5vdCB3b3JraW5nIHdlbGwuIE9wZW5HTCBhcHBsaWNhdGlvbnMgbGlrZSBsaWtlIGJlcnlsIGFuZAotCQlNeXRoVHYgaGF2ZSBiZWVuIHNob3duIHRvIG1ha2UgWERBTUFHRSBub3Qgd29yayBwcm9wZXJseS4KLQotCUZvciBKYXZhIFNTTCBjb25uZWN0aW9ucyBpbnZvbHZpbmcgYSByb3V0ZXIvZmlyZXdhbGwgcG9ydAotCQlyZWRpcmVjdGlvbiwgYW4gb3B0aW9uIC1odHRwc3JlZGlyIHRvIHNwYXJlIHRoZSB1c2VyCi0JCWZyb20gbmVlZGluZyB0byBpbmNsdWRlIFBPUlQ9Tk5OIGluIHRoZSBicm93c2VyIFVSTC4KLQotCUEgLXNsZWVwaW4gbiBvcHRpb24gdG8gZGVsYXkgc3RhcnR1cCBieSBuIHNlY29uZHMgdG8gbGV0IHJlZGlycwotCQlhbmQgbGlzdGVuaW5nIGNsaWVudHMgdG8gZ2V0IHN0YXJ0ZWQuCi0KLQlUaWdodFZOQyBmaWxlIHRyYW5zZmVyIGlzIG5vdyBvZmYgYnkgZGVmYXVsdDsgZW5hYmxlIHZpYQotCQktdGlnaHRmaWxleGZlcgotCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOiAKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC44LjQJMjAwNy0wMi0wMQotCi0KLU5ldyBpbiB0aGUgMC44LjQgeDExdm5jIHJlbGVhc2U6Ci0KLQlOYXRpdmUgTWFjIE9TIFggQXF1YS9RdWFydHogc3VwcG9ydC4gIEl0IGV4cG9ydHMgdGhlIGZ1bGwKLQkJZGlzcGxheSAobm8gWDExIHNlcnZlciwgZXRjKS4KLQotCQlUaGlzIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIE9TWHZuYzsgc29tZSBhY3Rpdml0aWVzCi0JCWFyZSBmYXN0ZXIgKGFuZCBzZWUgdGhlIGNsaWVudC1zaWRlIGNhY2hpbmcgZmVhdHVyZQotCQktbmNhY2hlIGluIHRoZSAwLjguNSBkZXZlbG9wbWVudCB2ZXJzaW9uIGZvciBtb3JlCi0JCXNwZWVkdXBzKS4KLQotCXgxMXZuYyBjYW4gYWN0IGFzIGEgVk5DIHJlZmxlY3Rvci9yZXBlYXRlciB1c2luZyB0aGUKLQkJIi1yZWZsZWN0IGhvc3Q6TiIgb3B0aW9uLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGxhcmdlCi0JCWNsYXNzcm9vbSBicm9hZGNhc3Rpbmcgb3IgZGVtb3MuICBZb3Ugc2V0IHVwIGEgbnVtYmVyCi0JCW9mIHJlZmxlY3RvcnMgdG8gc3ByZWFkIHRoZSBuZXR3b3JrIGFuZCBDUFUgbG9hZCBhcm91bmQKLQkJZm9yIGJldHRlciByZXNwb25zZS4KLQotCUEgbmV3IGxvZ2luIG1vZGU6ICItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSAtdW5peHB3IC4uLiIKLQkJdGhhdCB3aWxsIENyZWF0ZSBhIG5ldyBYIHNlc3Npb24gKFh2ZmIsIFhkdW1teSwgb3IKLQkJWG9yZykgZm9yIHRoZSB1c2VyIGlmIGl0IGNhbm5vdCBmaW5kIHRoZSB1c2VyJ3MgWAotCQlzZXNzaW9uIGRpc3BsYXkgdmlhIHRoZSBGSU5ERElTUExBWSBtZXRob2QuICBJdCB3aWxsCi0JCWJlIHJlLWZvdW5kIHVwb24gcmVjb25uZWN0aW9uLgotCi0JCVRoaXMgZW5hYmxlcyBhIHNpbXBsZSAidGVybWluYWwgc2VydmljZXMiIG1vZGUgYmFzZWQgb24KLQkJVW5peCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYW5kIHdoZXJlIHRoZSB1c2VyIGRvZXMgbm90Ci0JCWhhdmUgdG8gbWVtb3JpemUgdGhlaXIgVk5DIGRpc3BsYXkgbnVtYmVyLCBldGMuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCU9wdGlvbiAtbm9kcG1zIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggcHJvZ3JhbXMgbGlrZSBLREUncwotCQlrZGVza3RvcF9sb2NrIHRoYXQga2VlcCByZXN0YXJ0aW5nIHRoZSBzY3JlZW4gc2F2ZXIKLQkJZXZlcnkgZmV3IHNlY29uZHMgZXZlbiB3aXRoIGFjdGl2ZSBWTkMgY2xpZW50cyBjb25uZWN0ZWQuCi0KLQlUaGUgIi1OIiBvcHRpb24gY291cGxlcyB0aGUgVk5DIERpc3BsYXkgbnVtYmVyIHRvIHRoZSBYIERpc3BsYXkKLQkJbnVtYmVyLiBFLmcuIGlmIHlvdXIgWCBESVNQTEFZIGlzIDoyIHRoZW4gdGhlIFZOQyBkaXNwbGF5Ci0JCXdpbGwgYmUgOjIgKGkuZS4gdXNpbmcgcG9ydCA1OTAyKS4gSWYgdGhhdCBwb3J0IGlzIHRha2VuCi0JCXgxMXZuYyB3aWxsIGV4aXQuCi0KLQlXaXJlZnJhbWUgY29weXJlY3QgZGV0ZWN0aW9uIGZvciBsb2NhbCB1c2VyIGFjdGl2aXR5IChlLmcuIHNvbWVvbmUKLQkJc2l0dGluZyBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBtb3Zpbmcgd2luZG93cykuICBZb3UKLQkJY2FuIGRpc2FibGUgdGhpcyB3aXRoIHRoZSAtbm93aXJlZnJhbWVsb2NhbCBvcHRpb24uCi0KLQlUbyBhdXRvbWF0aWNhbGx5IGZpeCB0aGUgY29tbW9uIG1vdXNlIG1vdGlvbiBwcm9ibGVtIG9uIFhJTkVSQU1BCi0JCShtdWx0aS1oZWFkZWQpIGRpc3BsYXlzLCB0aGUgLXh3YXJwcG9pbnRlciBvcHRpb24gaXMKLQkJZW5hYmxlZCBieSBkZWZhdWx0IHdoZW4gWElORVJBTUEgaXMgYWN0aXZlLiAgWW91IGNhbgotCQlkaXNhYmxlIHRoaXMgd2l0aCB0aGUgLW5veHdhcnBwb2ludGVyIG9wdGlvbi4KLQotCUJ5IGRlZmF1bHQgaW4gLXJlZmxlY3QgbW9kZSAtc2hhcmVkIGlzIGltcGxpZWQgKGl0IG1ha2VzIHNlbnNlKSwKLQkJdXNlIC1ub3NoYXJlZCBhZnRlciB0aGUgLXJlZmxlY3Qgb3B0aW9uIHRvIGRpc2FibGUgdGhpcy4gCi0KLQlUaGUgLXByb2cgb3B0aW9uIGxldHMgeW91IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCAoYXJndlswXSkgdG8KLQkJdGhlIHByb2dyYW0sIGluIGNhc2UgaXQgaXMgc3Bhd25lZCBieSBpbmV0ZC90Y3BkIGFuZAotCQljYW5ub3QgZGV0ZXJtaW5lIGl0cyBwYXRoLiAgVGhlIHBhdGggaXMgbmVlZGVkIGZvciB0aGUKLQkJLWh0dHAgb3B0aW9uIHRvIGd1ZXNzIHRoZSBodHRwIGNsYXNzZXMgZGlyZWN0b3J5LgotCi0JVXN1YWxseSBub3QgbmVlZGVkLCBidXQgdGhlcmUgYXJlIG1hbnkgb3B0aW9ucyBmb3IgdHVuaW5nIHRoZQotCQluYXRpdmUgTWFjIE9TIFggbW9kZTogLW1hY25vZGltIC1tYWNub3NsZWVwIC1tYWNub3NhdmVyCi0JCS1tYWNub3dhaXQgLW1hY3doZWVsIC1tYWNub3N3YXAgLW1hY25vcmVzaXplIC1tYWNpY29uYW5pbQotCQktbWFjbWVudS4KLQotCUFuIG9wdGlvbiAtZGVidWdfeGRhbWFnZSBoYXMgYmVlbiBhZGRlZCBmb3IgZGVidWdnaW5nIGFuZCBwcm9maWxpbmcuCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246IAotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwIHwgbGVzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjguMwkyMDA2LTExLTEzCi0KLQotTmV3IGluIHRoZSAwLjguMyB4MTF2bmMgcmVsZWFzZToKLQotCVRoZSAtc3NsIG9wdGlvbiBwcm92aWRlcyBTU0wgZW5jcnlwdGlvbiBhbmQgYXV0aGVudGljYXRpb24KLQkJbmF0aXZlbHkgdmlhIHRoZSB3d3cub3BlbnNzbC5vcmcgbGlicmFyeS4gIE9uZSBjYW4gdXNlCi0JCWZyb20gYSBzaW1wbGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgc2VydmVyIGNlcnRpZmljYXRlCi0JCXVwIHRvIGZ1bGwgQ0EgYW5kIGNsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBzY2hlbWVzLgotCi0JVGhlIC1zc2x2ZXJpZnkgb3B0aW9uIGFsbG93cyBmb3IgYXV0aGVudGljYXRpbmcgVk5DIGNsaWVudHMgdmlhCi0JCXRoZWlyIGNlcnRpZmljYXRlcyBpbiBlaXRoZXIgLXNzbCBvciAtc3R1bm5lbCBtb2Rlcy4KLQotCUNlcnRpZmljYXRlIGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50IHRvb2xzIGFyZSBwcm92aWRlIGluIHRoZQotCQktc3NsR2VuQ2VydCwgLXNzbEdlbkNBLCBhbmQgcmVsYXRlZCBvcHRpb25zLgotCi0JQW4gU1NMIGVuYWJsZWQgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciBhcHBsZXQgaXMgcHJvdmlkZWQgaW4KLQkJY2xhc3Nlcy9zc2wvVm5jVmlld2VyLmphci4KLQotCQlUaGUgYXBwbGV0IG1heSBhbHNvIGJlIGxvYWRlZCBpbnRvIHRoZSB3ZWIKLQkJYnJvd3NlciB2aWEgSFRUUFMsIGkuZSBvbmUgY2FuIHVzZSB0aGUgVk5DIHBvcnQsCi0JCWUuZy4gaHR0cHM6Ly9ob3N0OjU5MDAvCi0KLQkJU2VlIG91ciAiRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIiBwcm9qZWN0LCBmb3IgbmF0aXZlCi0JCVNTTCBlbmFibGVkIHZpZXdlcnMuCi0KLQlUaGUgLXVuaXhwdyBvcHRpb24gc3VwcG9ydHMgVW5peCB1c2VybmFtZSBhbmQgcGFzc3dvcmQKLQkJYXV0aGVudGljYXRpb24uIFRoZSAtc3NsIG9yIC1sb2NhbGhvc3QgYW5kIC1zdHVubmVsCi0JCW9wdGlvbnMgKG9yIGRldGVjdGlvbiBvZiBhbiBTU0ggdHVubmVsKSBhcmUgZW5mb3JjZWQgaW4KLQkJdGhpcyBtb2RlIHRvIHByZXZlbnQgcGFzc3dvcmQgc25pZmZpbmcuCi0KLQlDb3VwbGluZyAtdW5peHB3IHdpdGggLWRpc3BsYXkgV0FJVDpjbWQ9RklORERJU1BMQVkgcHJvdmlkZXMgYQotCQl3YXkgdG8gYWxsb3cgYSB1c2VyIHRvIGxvZ2luIHdpdGggdGhlaXIgVU5JWCBwYXNzd29yZAotCQlhbmQgaGF2ZSB0aGVpciBkaXNwbGF5IGNvbm5lY3RlZCB0byBhdXRvbWF0aWNhbGx5LgotCi0JSG9va3MgYXJlIHByb3ZpZGVkIGluIHRoZSAtdW5peHB3X2NtZCBhbmQgIi1wYXNzd2RmaWxlIGNtZDosY3VzdG9tOi4uLiIKLQkJb3B0aW9ucyB0byBhbGxvdyB5b3UgdG8gc3VwcGx5IHlvdXIgb3duIGF1dGhlbnRpY2F0aW9uCi0JCWFuZCBwYXNzd29yZCBsb29rdXAgcHJvZ3JhbXMgKGUuZy4gTERBUCkuCi0KLQlUaGUgIi11bHRyYWZpbGV4ZmVyIiBhbGlhcyBpcyBwcm92aWRlZCBhbmQgaW1wcm92ZWQgVWx0cmFWTkMKLQkJZmlsZXRyYW5zZmVyIHJhdGVzIGhhdmUgYmVlbiBhY2hpZXZlZC4KLQotCVRoZSAtcm90YXRlIG9wdGlvbiBlbmFibGVzIHlvdSB0byByb3RhdGUgb3IgcmVmbGVjdCB0aGUgc2NyZWVuCi0JCWJlZm9yZSBleHBvcnRpbmcgdmlhIFZOQy4gVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIG9uCi0JCWhhbmRoZWxkcyBhbmQgb3RoZXIgZGV2aWNlcyB3aGVyZSB0aGUgcm90YXRpb24gb3JpZW50YXRpb24KLQkJaXMgbm90ICJuYXR1cmFsIi4KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCVNpbWlsYXIgdG8gLXNzbCwgdGhlIC1zdHVubmVsIG9wdGlvbiBzdGFydHMgdXAgYSBTU0wgdHVubmVsIHNlcnZlcgotCQlzdHVubmVsICh0aGF0IG11c3QgYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgb24gdGhlIHN5c3RlbSkKLQkJdG8gYWxsb3cgb25seSBlbmNyeXB0ZWQgU1NMIGNvbm5lY3Rpb25zIGZyb20gdGhlIG5ldHdvcmsuCi0KLQlPcHRpb24gLXNzbG5vZmFpbCB0byBleGl0IGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBhbnkgU1NMCi0JCWNvbm5lY3Rpb24gZmFpbHVyZXMuCi0KLQlBIHNpbXBsZXIgdmFyaWFudCBvZiAtdW5peHB3IGlzIHRoZSAtdW5peHB3X25pcyBvcHRpb24gdGhhdAotCQl3b3JrcyBpbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMgYXJlCi0JCXJlYWRhYmxlLCBlLmcuIE5JUy4KLQotCXgxMXZuYyBjYW4gYmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdG8gbm90IGRlcGVuZCBvbiBYMTEgbGlicmFyaWVzCi0JCSIuL2NvbmZpZ3VyZSAtLXdpdGhvdXQteCIgZm9yIC1yYXdmYiBvbmx5IG9wZXJhdGlvbgotCQkoZS5nLiBlbWJlZGRlZCBsaW51eCBjb25zb2xlIGRldmljZXMpLgotCi0JQWRkIC1jdXJzb3JfZHJhZyB0byBjaGFuZ2UgdGhlIG1vdXNlIGN1cnNvciBkdXJpbmcgRHJhZyBhbmQgRHJvcCwgZXRjLgotCi0JVW5kZXIgdGhlICItY29ubmVjdF9vcl9leGl0IGhvc3QiIG9wdGlvbiB4MTF2bmMgd2lsbCBleGl0Ci0JCWltbWVkaWF0ZWx5IHVubGVzcyB0aGUgcmV2ZXJzZSBjb25uZWN0aW9uIHRvIGhvc3QKLQkJc3VjY2VlZHMuIFRoZSAiLXJmYnBvcnQgMCIgb3B0aW9uIGRpc2FibGVzIFRDUCBsaXN0ZW5pbmcKLQkJZm9yIGNvbm5lY3Rpb25zICh1c2VmdWwgZm9yIHRoaXMgbW9kZSkuCi0KLQlUaGUgIi1yYXdmYiByYW5kIiBhbmQgIi1yYXdmYiBub25lIiBvcHRpb25zIGFyZSB1c2VmdWwgZm9yCi0JCXRlc3RpbmcgYXV0b21hdGlvbiBzY3JpcHRzLCBldGMuLCB3aXRob3V0IHJlcXVpcmluZyBhCi0JCWZ1bGwgZGVza3RvcC4KLQotCVJlZHVjZWQgc3Bld2luZyBvZiBpbmZvcm1hdGlvbiBhdCBzdGFydHVwLCB1c2UgIi12ZXJib3NlIiAoYWxzbwotCQkiLXYiKSB0byB0dXJuIGl0IGJhY2sgb24gZm9yIGRlYnVnZ2luZy4KLQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAgfCBsZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuOC4yCTIwMDYtMDctMTMKLQotCi1OZXcgaW4gdGhlIDAuOC4yIHgxMXZuYyByZWxlYXNlOgotCi0JU3VwcG9ydCBmb3IgZnVsbCBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQgaW50byB0aGUgTGludXgKLQkJY29uc29sZSBmcmFtZWJ1ZmZlciAvZGV2L2ZiMCBpbiAtcmF3ZmIgbW9kZQotCQkoaS5lLiBub24tWDExKSBieSB1c2luZyB0aGUgTGludXggInVpbnB1dCIgZHJpdmVyLgotCi0JCVRoaXMgZW5hYmxlcywgZm9yIGV4YW1wbGUsIHZpZXdpbmcgYW5kIGludGVyYWN0aW5nCi0JCXdpdGggUXQtZW1iZWRkZWQvUXRvcGlhLUNvcmUgYXBwcyBvbiBMaW51eC1iYXNlZAotCQloYW5kaGVsZHMsIGV0Yy4KLQotCQlPcHRpb25zOiAgIC1yYXdmYiBjb25zLCAtcGlwZWlucHV0IFVJTlBVVCBNb3JlIGluZm86Ci0JCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI2ZhcS1xdC1lbWJlZGRlZAotCi0JRXh0ZW5zaW9uIG9mIHRoZSBkaXNwbGF5IG9wdGlvbjogLWRpc3BsYXkgV0FJVDo8ZGlzcC1vci1jbWQ+Ci0JCXRvIGRlbGF5IHgxMXZuYydzIG9wZW5pbmcgb2YgdGhlIFggZGlzcGxheQotCQl1bnRpbCBhIFZOQyBjbGllbnQgY29ubmVjdHMgKHVzZWZ1bCBidWlsdC1pbjoKLQkJLWRpc3BsYXkgV0FJVDpjbWQ9RklORERJU1BMQVksIHRvIGZpbmQgYSB1c2VyJ3MKLQkJZGlzcGxheSBhbmQgWGF1dGhvcml0eSBkYXRhKS4KLQotCU9wdGlvbnMgLWdyYWJrYmQgYW5kIC1ncmFicHRyIGhhdmUgeDExdm5jIHRyeSB0byBncmFiCi0JCXRoZSBYIGRpc3BsYXkgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkIHRvCi0JCXByZXZlbnQgYSAobm9uLW1hbGljaW91cykgdXNlciBhdCB0aGUgcGh5c2ljYWwgWAotCQlkaXNwbGF5IGZyb20gcGVyZm9ybWluZyBrZXlib2FyZCBvciBtb3VzZSBpbnB1dC4KLQkJRS5nLiByZW1vdGUgaGVscC1kZXNrIHN1cHBvcnQuCi0JCi0KLSAgbWlzY2VsbGFuZW91cyBuZXcgZmVhdHVyZXMgYW5kIGNoYW5nZXM6Ci0KLQktYWxsb3dlZGNtZHMgb3B0aW9uIHRvIGZpbmUtdHVuZSB3aGljaCBleHRlcm5hbCBjb21tYW5kcwotCQltYXkgYmUgcnVuIGJ5IHgxMXZuYywgcmF0aGVyIHRoYW4gc2h1dHRpbmcKLQkJdGhlbSBhbGwgb2ZmIHdpdGggLW5vY21kcy4KLQotCS1lbnYgVkFSPVZBTFVFIGNvbnZlbmllbmNlIG9wdGlvbiB0byBhdm9pZCB0aGUgbmVlZCBvZgotCQlzZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgc3RhcnRpbmcKLQkJeDExdm5jLgotCi0JLWFsbGlucHV0IG9wdGlvbiB0byBlbmFibGUgbGlidm5jc2VydmVyIGhhbmRsZUV2ZW50c0VhZ2VybHkKLQkJcGFyYW1ldGVyIChub3QgY2xlYXIgaXQgeWllbGRzIGFuIGltcHJvdmVtZW50KS4KLQotCS1yYXdmYiByYW5kICBmdW4vdGVzdGluZyBvcHRpb24gdXNpbmcgL2Rldi91cmFuZG9tIGFzIGEgZmIuCi0KLQktbGljZW5zZSwgLWNvcHlpbmcsIC13YXJyYW50eSBvcHRpb24uCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246IAotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwIHwgbGVzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXgxMXZuYyAwLjguMQkyMDA2LTA2LTAzCi0KLU5ldyBpbiB0aGUgMC44LjEgeDExdm5jIHJlbGVhc2U6Ci0KLQlJbXByb3ZlZCBzdXBwb3J0IGZvciB3ZWJjYW1zIGFuZCB0diB0dW5lcnMgd2l0aCB2aWRlbzRsaW51eAotCQkvZGV2L3ZpZGVvOiBzZWUgdGhlICItcmF3ZmIgdmlkZW8iIGFuZCAiLXBpcGVpbnB1dCBWSUQiCi0JCW9wdGlvbnMuICh0aGUgbGF0dGVyIGdpdmVzIGEgc2ltcGxlIGtleWJvYXJkIGNvbnRyb2wKLQkJb2YgYSB0diB0dW5lcjsgc2VlIGFsc28gdGhlIC1mcmVxdGFiIG9wdGlvbiBmb3Igc3RhdGlvbnMpLgotCi0JRkJQTSBzdXBwb3J0IGZvciBoYXJkd2FyZSB0aGF0IHByb3ZpZGVzIGZyYW1lYnVmZmVyIHBvd2VyCi0JCW1hbmFnZW1lbnQgKGl0IG5lZWRzIHRvIGJlIGRpc2FibGVkIHdoZW4gdm5jIGNsaWVudHMKLQkJYXJlIGNvbm5lY3RlZCkuCi0KLQlUaGUgLXVzZXB3IG9wdGlvbiB3aWxsIHJlcXVpcmUgeDExdm5jIHRvIHVzZSBhIHBhc3N3b3JkIG9mIAotCQlzb21lIHNvcnQgb3Igb3RoZXJ3aXNlIGV4aXQgaW1tZWRpYXRlbHkuICBQdXQgaXQgaW4KLQkJeW91ciB+Ly54MTF2bmNyYyBzbyB5b3UgZG9uJ3QgZm9yZ2V0LgotCi0JVGhlIGNvbW1hbmQgIngxMXZuYyAtc3RvcmVwYXNzd2QiIHdpbGwgcHJvbXB0IGZvciBhIHBhc3N3b3JkCi0JCXdpdGhvdXQgZWNob2luZyBhbmQgc2F2ZSBpdCBpbiB+Ly52bmMvcGFzc3dkCi0KLQlUaGUgWCBDTElQQk9BUkQgc2VsZWN0aW9uIGlzIG1hbmFnZWQgaW4gYWRkaXRpb24gdG8gdGhlCi0JCVggUFJJTUFSWSBzZWxlY3Rpb24uCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCUNvbnZlbmllbmNlIG9wdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBMaW51eCBjb25zb2xlOiAtcmF3ZmIgY29ucwotCQlldGMuIChyZXF1aXJlcyAvZGV2L2ZiMCB0byBiZSB3b3JraW5nKS4KLQotCWNsaXBib2FyZC9jdXQtdGV4dCBpbnB1dCBjYW4gbm93IGJlIG1hbmFnZWQgb24gYSBwZXItY2xpZW50Ci0JCWJhc2lzLgotCi0JLWNhcHNsb2NrIGFuZCAtc2tpcF9sb2Nra2V5cyBvcHRpb25zIGNhbiBoZWxwIG1ha2UgQ2Fwc0xvY2sgd29yawotCQliZXR0ZXIuCi0KLQlUaGUgWGR1bW15IHdyYXBwZXIgc2NyaXB0IGlzIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgdHJlZS4KLQotCUEgbW9kZSAiLWdvbmUgcG9wdXAiIGFzIGJlZW4gYWRkZWQuCi0KLQktMjR0bzMyIG9wdGlvbiB0byBhdm9pZCAyNGJwcCBwcm9ibGVtcy4KLQotCS14aW5lcmFtYSBpcyBvbiBieSBkZWZhdWx0LgotCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uOiAKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy94MTF2bmNfb3B0cy5odG1sCi0gICAgICAgCXgxMXZuYyAtaGVscCB8IGxlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC44CTIwMDYtMDItMTMKLQotCi1OZXcgaW4gdGhlIDAuOCB4MTF2bmMgcmVsZWFzZToKLQotCVRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgc3VwcG9ydCBpcyBlbmFibGVkIHZpYSB0aGUgZXh0ZW5zaW9uIHRvCi0JCUxpYlZOQ1NlcnZlciBhZGRlZCBieSBSb2hpdCBLdW1hci4KLQotCVRoZSAtcGFzc3dkZmlsZSBvcHRpb24gaGFzIGJlZW4gZW5oYW5jZWQgdG8gaGFuZGxlIGFueSBudW1iZXIKLQkJb2YgZnVsbC1hY2Nlc3MgYW5kIHZpZXcgb25seSBwYXNzd29yZHMgaW4gYW4gZWFzeSB0bwotCQltYWludGFpbiBmb3JtYXQsIGFuZCBhZGRpdGlvbmFsIGZlYXR1cmVzLgotCi0JVGhlIC04dG8yNCBvcHRpb24gZW5hYmxlcyBtdWx0aS1kZXB0aCB2aWV3aW5nIG9uIHN5c3RlbXMgdGhhdCBkbwotCQlub3Qgc3VwcG9ydCAtb3ZlcmxheS4gVGhlIDhicHAgcmVnaW9ucyBhcmUgdHJhbnNmb3JtZWQKLQkJdG8gZGVwdGggMjQgVHJ1ZUNvbG9yIGJlZm9yZSBleHBvcnRpbmcgdmlhIFZOQy4KLQotCVRoZSB4MTF2bmMgc291cmNlIGNvZGUgaGFzIGdvbmUgdGhyb3VnaCBhIG1ham9yIHJlb3JnYW5pemF0aW9uLgotCQlUaGUgYnVpbGQgaGFzIGJlZW4gZW5oYW5jZWQgYW5kIG1hbnkgYnVncyBmaXhlZC4KLQotCi0gIG1pc2NlbGxhbmVvdXMgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzOgotCi0JLWFmdGVyYWNjZXB0IG9wdGlvbiBpcyBsaWtlIC1hY2NlcHQgaG93ZXZlciBpdCBlbmFibGVzIHJ1bm5pbmcKLQkJYSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgYWZ0ZXIgY2xpZW50IGF1dGhlbnRpY2F0aW9uCi0JCWhhcyB0YWtlbiBwbGFjZS4gVGhlIFJGQl8qIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlCi0JCWJlZW4gZXh0ZW5kZWQuCi0JLWxvb3Agb3B0aW9uIHdpbGwgcnVuIHgxMXZuYyBpbiBhbiBvdXRlciBsb29wIHJlc3RhcnRpbmcgZWFjaCB0aW1lCi0JCSh1c2VmdWwgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIFggc2VydmVyIHJlc3RhcnRzIG9mdGVuKS4KLQktc2xvd19mYiBhbGxvd3MgZm9yIHNsb3cgcG9sbGluZyBmb3Igc3BlY2lhbCBwdXJwb3NlIGFwcGxpY2F0aW9ucwotCQkoZS5nLiB2aWRlbykuICAtYmxhY2tvdXQgbm9wdHIsV3hIK1grWSwuLi4gd2lsbCBwcmV2ZW50Ci0JdGhlIHBvaW50ZXIgZnJvbSBnb2luZyBpbnRvIGEgYmxhY2tlZCBvdXQgcmVnaW9uLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAgfCBsZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuNy4yCTIwMDUtMDctMTEKLQotCi1OZXcgaW4gdGhlIDAuNy4yIHgxMXZuYyByZWxlYXNlOgotCi0JVGhlIFggREFNQUdFIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgdG8gZHJhbWF0aWNhbGx5IHJlZHVjZQotCQlyZXNvdXJjZSBjb25zdW1wdGlvbiB3aGVuIGlkbGU6IG9mdGVuIDIwIHRpbWVzIGxlc3M7Ci0JCWFuZCB0byBwaWNrIHVwIHNtYWxsIGNoYW5nZWQgcmVnaW9ucyBtb3JlIHF1aWNrbHkuCi0KLQkJREFNQUdFIHNlbmRzIGV2ZW50cyBpbmRpY2F0aW5nIGRhbWFnZWQgKG1vZGlmaWVkKSBzY3JlZW4KLQkJcmVjdGFuZ2xlcyB0byB4MTF2bmMuICBUaGVzZSBhcmUgdXNlZCBhcyBoaW50cyB0byBmb2N1cwotCQl0aGUgcG9sbGluZyBhbmQgYWxzbyBpZiB0aGUgcmVjdGFuZ2xlIGlzIGJlbG93IGEgc2l6ZQotCQl0aHJlc2hvbGQgaXQgaXMgYWNjZXB0ZWQgdW5jb25kaXRpb25hbGx5IChpLmUuIGRyYWdnZWQgaW4KLQkJZnJvbSB0aGUgZnJhbWVidWZmZXIpLglUdW5pbmcgaXMgcG9zc2libGUgd2l0aCAteGRfYXJlYS4KLQotCQlEQU1BR0UgaXMgYXZhaWxhYmxlIG9uIHJlY2VudCBYb3JnIHNlcnZlcnMgYW5kIFNvbGFyaXMgMTAuCi0KLQktd2lyZWZyYW1lOiBIZXVyaXN0aWNzIGFyZSB1c2VkIHRvIGd1ZXNzIHdoZW4gYSB3aW5kb3cgaXMgYmVpbmcKLQkJbW92ZWQgb3IgcmVzaXplZCBhbmQgZHVyaW5nIHRoaXMgcGVyaW9kIHNob3cgb25seSBhCi0JCW1vdmluZyB3aXJlZnJhbWUgb3V0bGluZS4gIEp1c3QgbGlrZSBvbiB2aWRlbyBjYXJkcyBpbgotCQl0aGUgOTAncywgcmVtZW1iZXI/ICBUaGlzIGlzIHRvIGF2b2lkIHdpbmRvdyAibHVyY2hpbmciCi0JCXdoZW4geW91IG1vdmUgb3IgcmVzaXplIG9uZSBvcGFxdWVseS4KLQotCQlBbHNvLCAtd2lyZWNvcHlyZWN0IGFwcGxpZXMgdGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZwotCQlmb3IgdGhlIG1vdmVkIHdpbmRvdy4gIEJvdGggYXJlIG9uIGJ5IGRlZmF1bHQsIHVzZQotCQktbm93aXJlZnJhbWUgb3IgLW5vd2lyZWNvcHlyZWN0IHRvIGRpc2FibGUgKGFrYSAtbm93ZgotCQlhbmQgLW5vd2NyKS4KLQotCS1zY3JvbGxjb3B5cmVjdDogU25pZmYgdGhlIFgxMSBwcm90b2NvbCB2aWEgdGhlIFJFQ09SRCBleHRlbnNpb24KLQkJYW5kIHRvIHRyeSB0byBkZXRlY3Qgd2luZG93IHNjcm9sbHMgKGUuZy4gdmlhIHNjcm9sbGJhciwKLQkJVXAvRG93biBhcnJvdywgZXRjKS4gIFdoZW4gZGV0ZWN0ZWQsIHRoZSBWTkMgQ29weVJlY3QKLQkJZW5jb2RpbmcgaXMgYXBwbGllZCB0byB0aGUgc2Nyb2xsZWQgcmVnaW9ucyBmb3IgYSBzcGVlZHVwLgotCi0JCVRoZSBjb250ZW50cyBvZiB0aGUgc2Nyb2xsaW5nIHdpbmRvdyBtYXkgb25seSBiZQotCQlhcHByb3hpbWF0ZSB3aGlsZSBpdCBpcyBiZWluZyBzY3JvbGxlZDogZS5nLiB0ZWFyaW5nLAotCQlidW5jaGluZy11cCwgZXRjLiAgVGhlIGhldXJpc3RpY3Mgd2lsbCBhbHNvIG1pc3Mgc2Nyb2xscwotCQlieSBjZXJ0YWluIHRvb2xraXRzIG9yIGFwcGxpY2F0aW9ucywgc28gdGhvc2Ugd2lsbCBzdGlsbAotCQloYXBwZW4gdGhlIHNsb3cgd2F5LiAgVG8gZGlzYWJsZSB1c2UgLW5vc2Nyb2xsY29weXJlY3QKLQkJKGFrYSAtbm9zY3IpLiAgVHVuaW5nIGlzIGFsc28gYXZhaWxhYmxlLCBzZWUgdGhlIC1oZWxwCi0JCWVudHJ5LgotCi0JLWxpc3RlbjogTWFrZXMgeDExdm5jIGxpc3RlbiBvbmx5IG9uIGEgc2luZ2xlIG5ldHdvcmsgaW50ZXJmYWNlLgotCQktbG9jYWxob3N0IG5vdyBpbXBsaWVzICctbGlzdGVuIGxvY2FsaG9zdCcuCi0KLQktcmF3ZmI6IEluc3RlYWQgb2YgcG9sbGluZyBhbiBYIHNlcnZlciBmcmFtZWJ1ZmZlciwgcG9sbCBhIHJhdwotCQlvbmUgKGkuZS4gYSBtYXBwZWQgZmlsZSBvciBhIHNobSBzZWdtZW50KS4gIEUuZy4gZm9yCi0JCXRoZSBsaW51eCBmcmFtZWJ1ZmZlciBkZXZpY2U6Ci0KLQkJICAgIC1yYXdmYiBtYXA6L2Rldi9mYjBAMTAyNHg3Njh4MzIKLQotCQlUaGlzIGlzIGEgYml0IG91dCBvZiB4MTF2bmMncyBzY29wZSBidXQgbWF5IGhhdmUgc29tZQotCQlpbnRlcmVzdGluZyBhcHBsaWNhdGlvbnMuICBQZXJoYXBzIC9kZXYvdmlkZW8/Ci0KLQktcGlwZWlucHV0OiBQaXBlIHRoZSBWTkMgdXNlcidzIHBvaW50ZXIgYW5kIGtleWJvYXJkIGlucHV0IGV2ZW50cwotCQl0byBhIGhlbHBlciBwcm9ncmFtIHlvdSBwcm92aWRlLiAgVHdvIGV4YW1wbGVzIGFyZSBpbgotCQltaXNjL3ZjaW5qZWN0LnBsIGFuZCBtaXNjL3NsaWRlLnBsLiAgUHJpbWFyaWx5IGludGVuZGVkCi0JCWZvciB1c2Ugd2l0aCAtcmF3ZmIgdG8gc29tZWhvdyBrbHVkZ2UtdXAgdXNlciBpbnB1dCwKLQkJYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgYnkgaXRzZWxmLgotCi0JSW1wcm92ZW1lbnRzIGZvciB0aGUgbWFnbmlmaWNhdGlvbiBzY2FsaW5nIGNhc2UgKGUuZy4gLXNjYWxlIDIpCi0JCWZvciB1c2UgaW4gbG93IHZpc2lvbiBhcHBsaWNhdGlvbnMuICBJdCBpcyBmYXN0ZXIgYW5kCi0JCW5vLWJsZW5kaW5nIDpuYiBub3cgd29ya3MgY29ycmVjdGx5LgotCi0JTW9yZSBzYWZldHkgbWVhc3VyZXMgYXJlIHRha2VuIFdSVCByZW1vdGUtY29udHJvbCBpbiB0aGUKLQkJZGVmYXVsdCBtb2RlLiAgU2VlIHRoZSAtdW5zYWZlLCAtc2FmZXIsIC1wcml2cmVtb3RlLAotCQlhbmQgLW5vY21kcyBvcHRpb25zLgotCi0JVGhlIEdVSSBoYXMgYmVlbiBpbXByb3ZlZCwgYW5kIHJ1bm5pbmcgd2l0aCB0aGUgb3B0aW9ucyAiLWd1aSBpY29uIgotCQlwcmVzZW50cyBhIHNtYWxsLCBzaW1wbGUgZ3VpIGluc3RlYWQgb2YgdGhlIGZ1bGwgYmxvd24gb25lLAotCQlhbmQgIi1ndWkgdHJheSIgYXR0ZW1wdHMgdG8gZW1iZWQgdGhlIHNtYWxsIGljb24gaW4gdGhlCi0JCXN5c3RlbSB0cmF5LiAgVXNlICItZ3VpIHRyYXk9c2V0cGFzcyIgdG8gcHJvbXB0IGZvcgotCQlzZXNzaW9uIHBhc3N3b3JkIGNyZWF0aW9uIGF0IHN0YXJ0dXAuCi0KLQotICBtaXNjZWxsYW5lb3VzIG5ldyBmZWF0dXJlcyBhbmQgY2hhbmdlczoKLQotCS14a2I6IGEgc2ltcGxlIHRlc3QgaXMgcGVyZm9ybWVkIGF0IHN0YXJ0dXAgdG8gc2VlIGlmIGl0IGlzIGEKLQkJZ29vZCBpZGVhIHRvIGFwcGx5IC14a2IgbW9kZSBmb3IgdGhlIGN1cnJlbnQga2V5Ym9hcmQKLQkJa2V5bWFwcGluZyAoaS5lLiBpZiBrZXlzeW1zIGxpa2UgISwgQCwgWyBhcmUgb3RoZXJ3aXNlCi0JCXVuYXZhaWxhYmxlKS4gIFRvIGRpc2FibGUgdXNlIC1ub3hrYi4KLQkgSVNPX0xldmVsM19TaGlmdCB2cy4gTW9kZV9zd2l0Y2g6ICBTZXQgdGhpbmdzIHVwIGluIC14a2IgbW9kZSB0bwotCQlwcmVmZXIgSVNPX0xldmVsM19TaGlmdCBvdmVyIE1vZGVfc3dpdGNoIGZvciBtb2R0d2Vha2luZy4KLQkJTm8gb3ZlcnJpZGU7IGxldCBtZSBrbm93IGlmIHRoaXMgY2F1c2VzIHByb2JsZW1zLgotCS1hZGRfa2V5c3ltcyBpcyBub3cgdGhlIGRlZmF1bHQsIHVzZSAtbm9hZGRfa2V5c3ltcyB0byBkaXNhYmxlLgotCQl0aGUgYWRkZWQga2V5c3ltcyBhcmUgcGVyaW9kaWNhbGx5IGRlbGV0ZWQuCi0JLXJlbWFwIERFQUQ6IHNob3J0aGFuZCBmb3IgbWFwcGluZyBtYW55ICJkZWFkIiBrZXlzeW1zIHRvIHRoZWlyCi0JCSJ1bi1kZWFkIiBjb3VudGVycGFydHMsIGUuZy4gZ3JhdmUgLT4gZGVhZF9ncmF2ZS4gIEZvcgotCQlzb21lIFZOQyB2aWV3ZXJzIHRoYXQgYXJlIHVuYWJsZSB0byBzZW5kIHRoZSBkZWFkIGtleXN5bS4KLQktc2tpcF9kdXBzOiBza2lwIGltcG9zc2libGUgZHVwbGljYXRlIGtleSBldmVudHMgc2VudCBieSBzb21lIFZOQwotCQl2aWV3ZXJzLiAtbm9za2lwX2R1cHMgdG8gZGlzYWJsZSAoY3VycmVudGx5IG9mZiBieSBkZWZhdWx0KS4KLQktc2xvcHB5X2tleXM6IHRyeSB0byBoYW5kbGUgc2xvcHB5IGtleWJvYXJkaW5nIChlc3AuIGJldHdlZW4KLQkJZGlmZmVyZW50IGxhbmd1YWdlIGtleWJvYXJkcykgd2hlcmUsIHNheSwgU2hpZnQgaXMgcmVsZWFzZWQKLQkJYmVmb3JlIHRoZSBrZXkuCi0JLW5vcmVwZWF0IE46IHBpbmctcG9uZyBOIHRpbWVzIGlmIHNvbWV0aGluZyBlbHNlIG9uIHRoZSBkZXNrdG9wCi0JCXJlc3RvcmVzIGtleSBhdXRvcmVwZWF0aW5nIChlLmcuIHNlc3Npb24gc3RhcnR1cCkuIERlZmF1bHQKLQkJMi4gIEFsc28sIElmIHRoZSBWTkMgY2xpZW50IGlzIGlkbGUgZm9yIDUgbWluLiBhdXRvcmVwZWF0Ci0JCWlzIHJlc3RvcmVkLgotCS13YWl0X3VpOiBJZiB0aGVyZSBpcyB2ZXJ5IHJlY2VudCB1c2VyIGlucHV0LCBjdXQgdGhlIC13YWl0IHNsZWVwCi0JCXRpbWUgYnkgdGhlIHNwZWNpZmllZCBmYWN0b3IgKGRlZmF1bHQgMi4wKS4KLQktbm93YWl0X2JvZzogRGV0ZWN0aW9uIGlzIG5vdyBpbiBwbGFjZSB0byB3YXRjaCBmb3IgcG9sbGluZyAiYm9nZ2luZwotCQlkb3duIiAoZS5nLiBsb3RzIG9mIHNjcm9sbGluZyB0ZXh0IGZyb20gYSBsb25nIGJ1aWxkIGluIGEKLQkJdGVybWluYWwpIGFuZCB0byBzbGVlcCBtb3JlLiAgVXNlIC1ub3dhaXRfYm9nIHRvIGRpc2FibGUuCi0JLWZsYWc6IHdyaXRlIFBPUlQ9NTkwMCB0byBhIGZsYWcgZmlsZSB0byBhaWQgd3JhcHBlciBzY3JpcHRzLgotCS1odHRwOiB0cnkgdG8gZ3Vlc3Mgd2hhdCB0aGUgLWh0dHBkaXIgc2hvdWxkIGJlIGFuZCBpZiBmb3VuZAotCQllbmFibGUgaHR0cCBsaXN0ZW5pbmcuCi0JLWNsaXAgV3hIK1grWTogb25seSBzaG93IHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG5vdCB0aGUKLQkJZW50aXJlIHNjcmVlbi4KLQkgY3Vyc29ycyBhcmUgbm93IHNjYWxlZCBieSBkZWZhdWx0IHVuZGVyIC1zY2FsZSwgdXNlIC1zY2FsZV9jdXJzb3IKLQkJdG8gbW9kaWZ5IHRoaXMgYmVoYXZpb3IuCi0JLWFycm93IG46IHNlbGVjdCBmcm9tIHNvbWUgZGlmZmVyZW50IGFycm93IGN1cnNvcnMgKGlnbm9yZWQgdW5kZXIKLQkJWEZJWEVTIGN1cnNvciBncmFiYmluZyBtb2RlKS4KLQktbm9sb29rdXA6IGRpc2FibGUgRE5TIGxvb2t1cHMgZm9yIGJyb2tlbiBlbnZpcm9ubWVudHMuCi0JLXNlbGRpcjogZmluZSB0dW5lIGFuZCBkZWJ1ZyBzZWxlY3Rpb24gdHJhbnNmZXIuIAotCSBidWlsZC10aW1lIGN1c3RvbWl6YXRpb24gbWFjcm9zOiBTSEFSRUQsIEZPUkVWRVIsIE5PUkVQRUFULAotCQlSRU1PVEVfQ09OVFJPTCwgU01BTExfRk9PVFBSSU5ULCBkZWZhdWx0IHBhc3N3ZCwgZXRjLgotCQlzZWUgdGhlIHRvcCBvZiB0aGUgeDExdm5jLmMgZm9yIG1vcmUgaW5mby4KLQkteHRyYXA6IERFQy1YVFJBUCBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGZvciBsZWdhY3kgc3lzdGVtcwotCQl3aXRoIGluc3VmZmljaWVudCBYVEVTVCBleHRlbnNpb24gKFgxMVI1KS4KLQktc2hpZnRjbWFwOiBmb3IgbGVnYWN5IHN5c3RlbXMgd2l0aCBub24tc3RhbmRhcmQgY29sb3JtYXAgdmFsdWVzLgotCS1ub3hyZWNvcmQ6IGRvIG5vdCB1c2UgdGhlIFJFQ09SRCBleHRlbnNpb24gZm9yIGFueXRoaW5nIChjdXJyZW50bHkKLQkJb25seSAtc2Nyb2xsY29weXJlY3QgYW5kIGdyYWJzZXJ2ZXIgd2F0Y2hpbmcgdXNlIGl0KS4KLQktZ3JhYl9idXN0ZXI6IGZvcmsgYSBoZWxwZXIgdGhyZWFkIHRvIHdhdGNoIGZvciBYR3JhYlNlcnZlciBkZWFkbG9jawotCQlpbiB4MTF2bmMgYW5kIGJyZWFrIHRoZSBncmFiLiAgVW5kZXIgLXNjcm9sbGNvcHlyZWN0IHRoZXJlCi0JCWlzIGEgc21hbGwgd2luZG93IHdoZXJlIHgxMXZuYyBpcyB2dWxuZXJhYmxlIHRvIHRoaXMgZGVhZGxvY2suCi0JLWRiZzogICBBICJjcmFzaCBzaGVsbCIgd2l0aCB0aXBzIG9uIGRlYnVnZ2luZyB3aWxsIGJlIHByZXNlbnRlZAotCQlpbnN0ZWFkIG9mIGV4aXRpbmcgd2hlbiBhIGZhdGFsIGVycm9yIG9jY3Vycy4JCi0JLWZpeHNjcmVlbjogcGVyaW9kaWNhbGx5IHJlZnJlc2ggdGhlIHNjcmVlbiB0byBnZXQgcmlkIG9mIHBhaW50aW5nCi0JCWVycm9ycywgZXRjLiBpbmR1Y2VkIGJ5IG5ldyBmZWF0dXJlcywganBlZyBjb21wcmVzc2lvbiwgZXRjLgotCS1zcGVlZHM6IFRlbGwgeDExdm5jIHdoYXQgdGhlIG5ldHdvcmsgYW5kIGZiIHNwZWVkcyBhcmUgaW5zdGVhZCBvZgotCQloYXZpbmcgaXQgdHJ5IHRvIG1lYXN1cmUgdGhlbS4gICh0aGVzZSBzcGVlZHMgYXJlIHVzZWQgYnkKLQkJdmFyaW91cyBmZWF0dXJlcywgc3VjaCBhcyAtd2lyZWZyYW1lLCAtc2Nyb2xsY29weXJlY3QsIGV0Yy4pLgotCS13bWR0OiBzZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIG9yIGRlc2t0b3AgdG8gc3BhcmUgeDExdm5jIGZyb20gZ3Vlc3NpbmcuCi0JLXJlYWR0aW1lb3V0OiBzZXQgbGlidm5jc2VydmVyJ3MgcmVhZCB0aW1lb3V0IHBhcmFtZXRlciwgdXNlZnVsIG9uCi0JCXZlcnkgc2xvdyBsaW5rcyB0aGF0IHRha2UgbW9yZSB0aGFuIDIwc2VjcyB0byBwYWludAotCQl0aGUgd2hvbGUgc2NyZWVuLgotCS1ub3B3OiBJZiB5b3UgdXNlIHgxMXZuYyB3aXRob3V0IGEgcGFzc3dvcmQgaXQgbm93IHByaW50cyBvdXQgYQotCQlzY2FyeSB3YXJuaW5nIG1lc3NhZ2UuICBVc2UgLW5vcHcgdG8gZGlzYWJsZSB0aGUgd2FybmluZy4KLQkgcGx1Z2dlZCBYIGV2ZW50IGxlYWtzOyBwZXJpb2RpY2FsbHkgcHVyZ2UgYW55IHJlbWFpbmluZyBidWlsZHVwLgotCQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC43LjEJMjAwNS0wMi0yNAotCi0KLU5ldyBpbiB0aGUgMC43LjEgeDExdm5jIHJlbGVhc2U6Ci0KLQlJbXByb3ZlZCBhbGdvcml0aG0gZm9yIGFwcHJveGltYXRpbmcgWEZJWEVTIGN1cnNvcnMgd2l0aAotCQl0cmFuc3BhcmVuY3kgKGFscGhhIGNoYW5uZWwpLiAgTm8gbW9yZSB1Z2x5IGJsYWNrIGZ1enoKLQkJYXJvdW5kIHRyYW5zbHVjZW50IGN1cnNvcnMuICBUdW5pbmcgcGFyYW1ldGVycyAtYWxwaGEqCi0JCWlmIGl0IGlzIHN0aWxsIG5vdCByaWdodC4KLQotCUFkZGVkIG1lY2hhbmlzbXMgdG8gaGFuZGxlIFhGSVhFUyBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5Ci0JCWV4YWN0bHkgKGkuZS4gYmxlbmQgaW4gdGhlIGJhY2tncm91bmQpLiAgV29ya3MgYnkgZGVmYXVsdAotCQl1bmRlciAtbm9jdXJzb3JzaGFwZSB1cGRhdGVzLCBhbmQgYWxzbyB3b3JrcyB1bmRlciBsaW1pdGVkCi0JCWNpcmN1bXN0YW5jZXMgZm9yIGN1cnNvcnNoYXBlIHVwZGF0ZXMgaWYgdGhlIFZOQyB2aWV3ZXIKLQkJaXMgcGF0Y2hlZCAoVGlnaHRWTkMgdmlld2VyIHBhdGNoIHByb3ZpZGVkKS4KLQotCS1zb2xpZDogdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBzd2l0Y2ggdGhlIGJhY2tncm91bmQgdG8gYSBzb2xpZAotCQljb2xvciB3aGVuIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4gIFdvcmtzIG9uIEdOT01FLCBLREUsCi0JCUNERSwgYW5kIGNsYXNzaWMgWC4KLQotCS1pbnB1dDogYWxsb3dzIGZpbmUtdHVuaW5nIHRoZSB0eXBlIG9mIGFsbG93ZWQgdXNlciBpbnB1dAotCQkoS2V5c3Ryb2tlLCBNb3VzZS1tb3Rpb24sIEJ1dHRvbi1jbGljaykuICBVc2VmdWwgZm9yCi0JCWNlcnRhaW4gYXBwbGljYXRpb25zIG9mIHgxMXZuYywgZS5nLiBkZW1vcy4gQWxzbwotCQlwZXItY2xpZW50IHNldHRpbmdzIHZpYSAtUiBpbnB1dDp4eXouLgotCi0JLXVzZXJzOiBlbmFibGVzIHN3aXRjaGluZyB0byBkaWZmZXJlbnQgdXNlcnMgaWYgc3RhcnRlZCBhcyByb290LgotCQlQbGVhc2UgcmVhZCB0aGUgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuCi0KLQktZ3VpIGV6OiBsZXNzIGRhdW50aW5nIEdVSSB3aXRoIGZld2VyIG9wdGlvbnMgdmlhICctZ3VpIGV6JyBvcgotCQkiTWlzYyAtPiBzaW1wbGUtZ3VpIiBvbmNlIHN0YXJ0ZWQuCi0KLSAgbWlzY2VsbGFuZW91cyBuZXcgZmVhdHVyZXMgYW5kIGNoYW5nZXM6Ci0KLQktbmFwIGlzIG5vdyB0aGUgZGVmYXVsdCwgdXNlIC1ub25hcCB0byBkaXNhYmxlLgotCS1zbmFwZmI6IHNuYXBzaG90IGgvdyBmYiB0byBSQU0gcGVyaW9kaWNhbGx5LCBub3QgY2xlYXIgaG93IHVzZWZ1bC4uLgotCS10aW1lb3V0IG46IGZvciB1c2UgaW4gY2VydGFpbiBhcHBsaWNhdGlvbnMsIGV4aXQgaWYgbm8gY2xpZW50Ci0JCWNvbm5lY3RzIGFmdGVyIG4gc2Vjb25kcy4KLQktb2EgYW5kIC1sb2dhcHBlbmQgZm9yIGFwcGVuZGluZyB0byBsb2dmaWxlcy4KLQktb3B0cyB3aWxsIGp1c3Qgc2hvdyB0aGUgb3B0aW9ucyB3L28gdGhlIGxvbmcgLWhlbHAgZGVzY3JpcHRpb25zLgotCWlmIHlvdSBmb3JnZXQgdG8gc2V0IC1kaXNwbGF5LCBpdCB3aWxsIGJlZXAgYW5kIHRyeSA6MCBhZnRlciBhIGJpdC4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb246IAotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKLSAgICAgICAJeDExdm5jIC1oZWxwCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQoteDExdm5jIDAuNwkyMDA0LTEyLTIzCi0KLQotTmV3IGluIHRoZSAwLjcgeDExdm5jIHJlbGVhc2U6Ci0KLQlTdXBwb3J0IGZvciB0aGUgWEZJWEVTIFggZXh0ZW5zaW9uIHRvIHNob3cgdGhlIGV4YWN0IG1vdXNlIGN1cnNvcgotCQlzaGFwZS4gIFJlcXVpcmVzIGxpYlhmaXhlcy4gIEZvciBhcHByb3hpbWF0ZSBjdXJzb3IKLQkJc2hhcGVzIGFsc28gc2VlOiAtY3Vyc29yIChub25lfGFycm93fFh8c29tZXxtb3N0KQotCi0JLXJlbW90ZS8tUjogcmVtb3RlLWNvbnRyb2wgc3VwcG9ydDogbmVhcmx5IGV2ZXJ5IHNldHRpbmcgY2FuIGJlCi0JCWNoYW5nZWQgZHluYW1pY2FsbHkgd2l0aG91dCByZXN0YXJ0aW5nIHgxMXZuYy4JRm9yCi0JCWV4YW1wbGUsICJ4MTF2bmMgLVIgc2hhcmVkIiwgYW5kICJ4MTF2bmMgLVIgc2NhbGU6My80IgotCQl3aWxsIGNvbm5lY3QgdG8gYSBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIgdG8gbWFrZSBpdCBzaGFyZWQKLQkJYW5kIHJlLXNjYWxlZCwgcmVzcGVjdGl2ZWx5LgotCi0JLWd1aTogbGF1bmNoZXMgYSBzaW1wbGUgdGNsL3RrIEdVSSBiYXNlZCBvbiB0aGUgcmVtb3RlIGNvbnRyb2wKLQkJZnVuY3Rpb24uICBSZXF1aXJlcyB0aGUgdGNsL3RrICJ3aXNoIiBwcm9ncmFtLgotCi0JLW92ZXJsYXk6IHN1cHBvcnQgZm9yIG92ZXJsYXkvbXVsdGktZGVwdGggKGUuZy4gMjQrOCkgdmlzdWFscwotCQlvbiBTb2xhcmlzIChTVU5fT1ZMIGV4dGVuc2lvbikgYW5kIElSSVguCi0KLQkteHJhbmRyOiBzdXBwb3J0IGZvciB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlIGFuZCBSZWZsZWN0aW9uKQotCQlleHRlbnNpb246IGlmIHRoZSBzY3JlZW4gY2hhbmdlcyBzaXplIG9yIHJvdGF0ZXMgeDExdm5jCi0JCWNyZWF0ZXMgYSBuZXcgZnJhbWVidWZmZXIgdG8gbWF0Y2ggaXQuICBVc2VmdWwgdG8gaGF2ZSBhIFZOQwotCQlWaWV3ZXIgdGhhdCBzdXBwb3J0cyBOZXdGQlNpemUgZXh0ZW5zaW9uLiAoYWxzbyAtcGFkZ2VvbSkKLQotCS1wb2ludGVyX21vZGU6IEV4cGVyaW1lbnRhbCBwb2ludGVyIGlucHV0IGhhbmRsaW5nIHNjaGVtZXMsCi0JCWUuZy46ICItcG9pbnRlcl9tb2RlIDMiIChzaW1pbGFyIHRvIC1ub2RyYWdnaW5nKQotCi0JbWFuIHBhZ2UgeDExdm5jLjEgYW5kIFJFQURNRSBmaWxlcyBjcmVhdGVkLgotCi0gIG1pc2NlbGxhbmVvdXMgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzOgotCi0JLXNiOiBzZXQgc2NyZWVuIGJsYW5rIGlkbGUgdGltZW91dAotCS1ub2N1cnNvcnNoYXBlOiBkaXNhYmxlIGN1cnNvciBzaGFwZSBWTkMgZXh0ZW5zaW9uLgotCVJGQl9NT0RFID0gImFjY2VwdCIgb3IgImdvbmUiIHBhc3NlZCB0byAtYWNjZXB0Ly1nb25lIGNvbW1hbmRzLgotICAgICAgICAtdm5jY29ubmVjdCBpcyBub3cgdGhlIGRlZmF1bHQuCi0gICAgICAgIC1ub3JlcGVhdCBpcyBub3cgdGhlIGRlZmF1bHQuCi0JIi1pZCBwaWNrIiB0byBwaWNrIGEgd2luZG93IHZpYSB4d2luaW5mbyBmb3IgdGhlIC1pZCBvcHRpb24uIAotCS1zaWQgb3B0aW9uOiBsaWtlIC1pZCBidXQgY3JvcHMgcm9vdCB3aW5kb3cgaW5zdGVhZC4KLQlSZWxhdGVkIHRvIHJlbW90ZS1jb250cm9sOiAtcXVlcnksIC1ub3JlbW90ZSwgLXN5bmMsIAotCQktZGVueV9hbGwsIC1zYWZlciwgLXVuc2FmZS4KLQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi14MTF2bmMgMC42LjIJMjAwNC0wOC0wMgotCi1OZXcgaW4gdGhlIDAuNi4yIHgxMXZuYyByZWxlYXNlOgotCi0JLXNjYWxlIG9wdGlvbiBmb3Igc2VydmVyIHNpZGUgc2NhbGluZyAoZS5nLiAtc2NhbGUgMi8zKS4KLQotCS1zdG9yZXBhc3N3ZCBvcHRpb24gdG8gY3JlYXRlIFZOQyBwYXNzd29yZCBmaWxlcy4KLQotCX4vLngxMXZuY3JjIHNpbXBsZSBjb25maWcgZmlsZSBzdXBwb3J0LgotCi0JLWN1cnNvcnBvcyBub3cgdGhlIGRlZmF1bHQgKHNlbmQgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZXMgdG8gY2xpZW50cwotCQl0aGF0IHVuZGVyc3RhbmQgdGhlbSwgZGlzYWJsZSB3aXRoIC1ub2N1cnNvcnBvcykKLQotCW1vcmUgY29ubmVjdGlvbiBpbmZvIHNlbnQgdG8gdGhlIC1hY2NlcHQgYW5kIC1nb25lIGNvbW1hbmRzLgotCi0gIG5ldyBrZXlib2FyZCByZWxhdGVkIGZlYXR1cmVzOgotCi0JLW1vZHR3ZWFrIGlzIG5vdyB0aGUgZGVmYXVsdCAoaXQgYXV0b21hdGljYWxseSBhZGp1c3RzIHRoZSBtb2RpZmllcgotCQlrZXlzIHN0YXRlIHRvIHNlbmQgYSBLZXlzeW0gcHJvcGVybHksIGRpc2FibGUgLW5vbW9kdHdlYWspCi0JCXRoaXMgd29ya3MgYXJvdW5kICJnaG9zdCIga2V5cyBsaWtlICI8ID4iIGluIFhGcmVlODYuCi0KLQkteGtiIG9wdGlvbiB0byB1c2UgWEtFWUJPQVJEIGV4dGVuc2lvbiBmb3IgbW9kdHdlYWstaW5nIHRvIGZ1cnRoZXIKLQkJaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2Ygc2VuZGluZyBLZXlzeW1zIGJldHdlZW4gZGlmZmVyZW50Ci0JCWxhbmd1YWdlIGtleWJvYXJkcy4KLQotCS1za2lwX2tleWNvZGVzIGFuZCAtYWRkX2tleXN5bXMgb3B0aW9ucyB0byBmaW5lIHR1bmUgc3R1YmJvcm4KLQkJa2V5Ym9hcmQgZGlmZmVyZW5jZXMuCi0KLQktbm9yZXBlYXQgb3B0aW9uIHRvIHR1cm4gb2ZmIFggc2VydmVyIGtleSBhdXRvcmVwZWF0IHdoZW4gY2xpZW50cwotCQlhcmUgY29ubmVjdGVkICh3b3JrcyBhcm91bmQgdGhlIHJlcGVhdGVkIGNoYXJhY3RlcnMgcHJvYmxlbSkKLQotCS1jbGVhcl9tb2RzIGFuZCAtY2xlYXJfa2V5cyB0byBzZW5kIGtleSByZWxlYXNlIGV2ZW50cyBhdAotCQlzdGFydHVwIGFuZCBleGl0LgkKLQotICByZW1vdmVkIG9wdGlvbnM6Ci0KLQktaGludHMvLW5vaGludHM6IHdlIG5vdyBhbHdheXMgdXNlIGhpbnRzLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbjogCi0KLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMveDExdm5jX29wdHMuaHRtbAotICAgICAgIAl4MTF2bmMgLWhlbHAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL2FsbG93ZWRfaW5wdXRfdC5oIGIveDExdm5jL2FsbG93ZWRfaW5wdXRfdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU4MTRlLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9hbGxvd2VkX2lucHV0X3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX0FMTE9XRURfSU5QVVRfVF9ICi0jZGVmaW5lIF9YMTFWTkNfQUxMT1dFRF9JTlBVVF9UX0gKLQotLyogLS0gYWxsb3dlZF9pbnB1dF90LmggLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWxsb3dlZF9pbnB1dCB7Ci0JaW50IGtleXN0cm9rZTsKLQlpbnQgbW90aW9uOwotCWludCBidXR0b247Ci0JaW50IGNsaXBib2FyZDsKLQlpbnQgZmlsZXM7Ci19IGFsbG93ZWRfaW5wdXRfdDsKLQotI2VuZGlmIC8qIF9YMTFWTkNfQUxMT1dFRF9JTlBVVF9UX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9hcHBzaGFyZS5jIGIveDExdm5jL2FwcHNoYXJlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2RmMTcuLjAwMDAwMDAKLS0tIGEveDExdm5jL2FwcHNoYXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTI0ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gYXBwc2hhcmUuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0KLWV4dGVybiBpbnQgcGlja193aW5kb3dpZCh1bnNpZ25lZCBsb25nICpudW0pOwotZXh0ZXJuIGNoYXIgKmdldF94cHJvcChjaGFyICpwcm9wLCBXaW5kb3cgd2luKTsKLWV4dGVybiBpbnQgc2V0X3hwcm9wKGNoYXIgKnByb3AsIFdpbmRvdyB3aW4sIGNoYXIgKnZhbHVlKTsKLWV4dGVybiB2b2lkIHNldF9lbnYoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOwotZXh0ZXJuIGRvdWJsZSBkbm93KHZvaWQpOwotCi1zdGF0aWMgY2hhciAqdXNhZ2UgPQotIlxuIgotIiAgeDExdm5jIC1hcHBzaGFyZTogYW4gZXhwZXJpbWVudCBpbiBhcHBsaWNhdGlvbiBzaGFyaW5nIHZpYSB4MTF2bmMuXG4iCi0iXG4iCi0jaWYgIVNNQUxMX0ZPT1RQUklOVAotIiAgVXNhZ2U6ICAgeDExdm5jIC1hcHBzaGFyZSAtaWQgd2luZG93aWQgLWNvbm5lY3Qgdmlld2VyX2hvc3Q6MFxuIgotIiAgICAgICAgICAgeDExdm5jIC1hcHBzaGFyZSAtaWQgcGljayAgICAgLWNvbm5lY3Qgdmlld2VyX2hvc3Q6MFxuIgotIlxuIgotIiAgQm90aCB0aGUgLWNvbm5lY3Qgb3B0aW9uIGFuZCB0aGUgLWlkIChvciAtc2lkKSBvcHRpb24gYXJlIHJlcXVpcmVkLlxuIgotIiAgKEhvd2V2ZXIgc2VlIHRoZSAtY29udHJvbCBvcHRpb24gYmVsb3cgdGhhdCBjYW4gcmVwbGFjZSAtY29ubmVjdC4pXG4iCi0iXG4iCi0iICBUaGUgVk5DIHZpZXdlciBhdCB2aWV3ZXJfaG9zdCBNVVNUIGJlIGluICdsaXN0ZW4nIG1vZGUuICBUaGlzIGlzIGJlY2F1c2VcbiIKLSIgIGEgbmV3IFZOQyBjb25uZWN0aW9uIChhbmQgdmlld2VyIHdpbmRvdykgaXMgZXN0YWJsaXNoZWQgZm9yIGVhY2ggbmV3XG4iCi0iICB0b3BsZXZlbCB3aW5kb3cgdGhhdCB0aGUgYXBwbGljYXRpb24gY3JlYXRlcy4gIEZvciBleGFtcGxlOlxuIgotIlxuIgotIiAgICAgICB2bmN2aWV3ZXIgLWxpc3RlbiAwXG4iCi0iXG4iCi0iICBUaGUgJy1jb25uZWN0IHZpZXdlcl9ob3N0OjAnIGluZGljYXRlcyB0aGUgbGlzdGVuaW5nIHZpZXdlciB0byBjb25uZWN0IHRvLlxuIgotIlxuIgotIiAgTm8gcGFzc3dvcmQgc2hvdWxkIGJlIHVzZWQsIG90aGVyd2lzZSBpdCB3aWxsIG5lZWQgdG8gYmUgdHlwZWQgZm9yIGVhY2hcbiIKLSIgIG5ldyB3aW5kb3cgKG9yIG9uZSBjb3VsZCB1c2Ugdm5jdmlld2VyIC1wYXNzd2QgZmlsZSBpZiB0aGUgdmlld2VyIHN1cHBvcnRzXG4iCi0iICB0aGF0LikgIEZvciBzZWN1cml0eSBhbiBTU0ggdHVubmVsIGNhbiBiZSB1c2VkOlxuIgotIlxuIgotIiAgICAgICBzc2ggLVIgNTUwMDpsb2NhbGhvc3Q6NTUwMCB1c2VyQHNlcnZlcl9ob3N0XG4iCi0iXG4iCi0iICAodGhlbiB1c2UgLWNvbm5lY3QgbG9jYWxob3N0OjApXG4iCi0iXG4iCi0iICBUaGUgLWlkLy1zaWQgb3B0aW9uIGlzIGFzIGluIHgxMXZuYygxKS4gIEl0IGlzIGVpdGhlciBhIG51bWVyaWNhbCB3aW5kb3dcbiIKLSIgIGlkIG9yIHRoZSBzdHJpbmcgJ3BpY2snIHdoaWNoIHdpbGwgYXNrIHRoZSB1c2VyIHRvIGNsaWNrIG9uIGFuIGFwcCB3aW5kb3cuXG4iCi0iICBUbyB0cmFjayBtb3JlIHRoYW4gb25lIGFwcGxpY2F0aW9uIGF0IHRoZSBzYW1lIHRpbWUsIGxpc3QgdGhlaXIgd2luZG93IGlkc1xuIgotIiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyAoc2VlIGFsc28gdGhlICdhZGRfYXBwJyBjb21tYW5kIGJlbG93LilcbiIKLSJcbiIKLSIgIEFkZGl0aW9uYWwgb3B0aW9uczpcbiIKLSJcbiIKLSIgICAgICAtaCwgLWhlbHAgICAgICBQcmludCB0aGlzIGhlbHAuXG4iCi0iICAgICAgLWRlYnVnICAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCAoc2FtZSBhcyBYMTFWTkNfQVBQU0hBUkVfREVCVUc9MSlcbiIKLSIgICAgICAtc2hvd21lbnVzICAgICBDcmVhdGUgYSBuZXcgdmlld2VyIHdpbmRvdyBldmVuIGlmIGEgbmV3IHdpbmRvdyBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgaW5zaWRlIG9mIGFuIGV4aXN0aW5nIG9uZS4gIERlZmF1bHQgaXMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gbm90IHNob3cgdGhlbSBpbiBhIG5ldyB2aWV3ZXIgd2luZG93LlxuIgotIiAgICAgIC1ub2V4aXQgICAgICAgIERvIG5vdCBleGl0IGlmIHRoZSBtYWluIGFwcCAod2luZG93aWQvcGljaykgd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgZ29lcyBhd2F5LiAgRGVmYXVsdCBpcyB0byBleGl0LlxuIgotIiAgICAgIC1kaXNwbGF5IGRweSAgIFggRElTUExBWSB0byB1c2UuXG4iCi0iICAgICAgLXRyYWNrZGlyIGRpciAgU2V0IHRyYWNraW5nIGRpcmVjdG9yeSB0byAnZGlyJy4geDExdm5jIC1hcHBzaGFyZSBkb2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgYmV0dGVyIGlmIGl0IGNhbiBjb21tdW5pY2F0ZSB3aXRoIHRoZSB4MTF2bmMncyB2aWEgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2hhbm5lbC4gQnkgZGVmYXVsdCBhIGRpciBpbiAvdG1wIGlzIHVzZWQsIC10cmFja2RpclxuIgotIiAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhbm90aGVyIGRpcmVjdG9yeSwgb3IgdXNlICdub25lJyB0byBkaXNhYmxlLlxuIgotIiAgICAgIC1hcmdzICdzdHJpbmcnIFBhc3Mgb3B0aW9ucyAnc3RyaW5nJyB0byB4MTF2bmMgKGUuZy4gLXNjYWxlIDMvNCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAtdmlld29ubHksIC13YWl0LCAtb25jZSwgZXRjLilcbiIKLSIgICAgICAtZW52IFZBUj1WQUwgICBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIGNtZGxpbmUgYXMgaW4geDExdm5jLlxuIgotIlxuIgotIiAgICAgIC1jb250cm9sIGZpbGUgIFRoaXMgaXMgYSBmaWxlIHRoYXQgb25lIGVkaXRzIHRvIG1hbmFnZSB0aGUgYXBwc2hhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICBtb2RlLiAgSXQgcmVwbGFjZXMgLWNvbm5lY3QuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnIydcbiIKLSIgICAgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZC4gIEluaXRpYWxseSBzdGFydCBvZmYgd2l0aCBhbGwgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZCBjbGllbnRzIGluIHRoZSBmaWxlLCBvbmUgcGVyIGxpbmUuICBJZiB5b3UgYWRkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgYSBuZXcgY2xpZW50LWxpbmUsIHRoYXQgY2xpZW50IGlzIGNvbm5lY3RlZCB0by4gSWYgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChvciBjb21tZW50IG91dCkgYSBjbGllbnQtbGluZSwgdGhhdCBjbGllbnQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgKGZvciB0aGlzIHRvIHdvcmssIGRvIG5vdCBkaXNhYmxlIHRyYWNrZGlyLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gcHV0IGNtZD0gbGluZXMgaW4gdGhlIGNvbnRyb2wgZmlsZSB0byBwZXJmb3JtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGFjdGlvbnMuICBUaGVzZSBhcmUgc3VwcG9ydGVkOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9cXVpdCAgICAgICAgICAgIERpc2Nvbm5lY3QgYWxsIGNsaWVudHMgYW5kIGV4aXQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGNtZD1yZXN0YXJ0ICAgICAgICAgUmVzdGFydCBhbGwgb2YgdGhlIHgxMXZuYydzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9bm9vcCAgICAgICAgICAgIERvIG5vdGhpbmcgKGUuZy4gcGluZylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgY21kPXgxMXZuYyAgICAgICAgICBSdW4gcHMoMSkgbG9va2luZyBmb3IgeDExdm5jJ3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgY21kPWhlbHAgICAgICAgICAgICBQcmludCBvdXQgaGVscCB0ZXh0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9YWRkX3dpbmRvdzp3aW4gIEFkZCBhIHdpbmRvdyB0byBiZSB3YXRjaGVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9ZGVsX3dpbmRvdzp3aW4gIERlbGV0ZSBhIHdpbmRvdy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgY21kPWFkZF9hcHA6d2luICAgICBBZGQgYW4gYXBwbGljYXRpb24gdG8gYmUgd2F0Y2hlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgY21kPWRlbF9hcHA6d2luICAgICBEZWxldGUgYW4gYXBwbGljYXRpb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGNtZD1hZGRfY2xpZW50Omhvc3QgQWRkIGNsaWVudCAoJ2ludGVybmFsJyBtb2RlIG9ubHkpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGNtZD1kZWxfY2xpZW50Omhvc3QgRGVsIGNsaWVudCAoJ2ludGVybmFsJyBtb2RlIG9ubHkpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGNtZD1saXN0X3dpbmRvd3MgICAgTGlzdCBhbGwgdHJhY2tlZCB3aW5kb3dzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9bGlzdF9hcHBzICAgICAgIExpc3QgYWxsIHRyYWNrZWQgYXBwbGljYXRpb25zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9bGlzdF9jbGllbnRzICAgIExpc3QgYWxsIGNvbm5lY3RlZCBjbGllbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9bGlzdF9hbGwgICAgICAgIExpc3QgYWxsIHRocmVlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9cHJpbnRfbG9ncyAgICAgIFByaW50IG91dCB0aGUgeDExdm5jIGxvZ2ZpbGVzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9ZGVidWc6biAgICAgICAgIFNldCAtZGVidWcgdG8gbiAoMCBvciAxKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgY21kPXNob3dtZW51czpuICAgICBTZXQgLXNob3dtZW51cyB0byBuICgwIG9yIDEpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9bm9leGl0Om4gICAgICAgIFNldCAtbm9leGl0IHRvIG4gKDAgb3IgMSkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSAnLWNvbW1hbmQgaW50ZXJuYWwnIG1vZGUgZGVzY3JpYmVkIGJlbG93IGZvciBhIHdheVxuIgotIiAgICAgICAgICAgICAgICAgICAgIHRoYXQgdHJhY2tzIGNvbm5lY3RlZCBjbGllbnRzIGludGVybmFsbHkgKG5vdCBpbiBhIGZpbGUuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgIEluICctc2hlbGwnIG1vZGUgKHNlZSBiZWxvdykgeW91IGNhbiB0eXBlIGluIHRoZSBhYm92ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGxlYWRpbmcgJ2NtZD0nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgIEZvciAnYWRkX3dpbmRvdycgYW5kICdkZWxfd2luZG93JyB0aGUgJ3dpbicgY2FuIGJlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICBudW1lcmljYWwgd2luZG93IGlkIG9yICdwaWNrJy4gIFNhbWUgZm9yICdhZGRfYXBwJy4gIEJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgc3VyZSB0byByZW1vdmUgb3IgY29tbWVudCBvdXQgdGhlIGFkZC9kZWwgbGluZSBxdWlja2x5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgKGUuZy4gYmVmb3JlIHBpY2tpbmcpIG9yIGl0IHdpbGwgYmUgcmUtcnVuIHRoZSBuZXh0IHRpbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBwcm9jZXNzZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgSWYgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29udHJvbCBmaWxlIGJ1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgIGVuZGluZyB3aXRoIHN1ZmZpeCAnLmNtZCcgaXMgZm91bmQsIHRoZW4gY29tbWFuZHMgaW4gaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAoY21kPS4uLikgYXJlIHByb2Nlc3NlZCBhbmQgdGhlbiB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgJ29uZSB0aW1lJyBjb21tYW5kIGFjdGlvbnMgdG8gYmUgcnVuLiAgQW55XG4iCi0iICAgICAgICAgICAgICAgICAgICAgY2xpZW50IGhvc3RuYW1lcyBpbiB0aGUgJy5jbWQnIGZpbGUgYXJlIGlnbm9yZWQuICBBbHNvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgc2VlIGJlbG93IGZvciB0aGUgWDExVk5DX0FQUFNIQVJFX0NPTU1BTkQgWCBwcm9wZXJ0eVxuIgotIiAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIHNpbWlsYXIgdG8gJy5jbWQnXG4iCi0iXG4iCi0iICAgICAgLWNvbnRyb2wgaW50ZXJuYWwgICBNYW5hZ2UgY29ubmVjdGVkIGNsaWVudHMgaW50ZXJuYWxseSwgc2VlIGJlbG93LlxuIgotIiAgICAgIC1jb250cm9sIHNoZWxsICAgICAgU2FtZSBhczogLXNoZWxsIC1jb250cm9sIGludGVybmFsXG4iCi0iXG4iCi0iICAgICAgLWRlbGF5IHNlY3MgICAgTWF4aW11bSB0aW1lb3V0IGRlbGF5IGJlZm9yZSByZS1jaGVja2luZyB0aGUgY29udHJvbCBmaWxlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBhIGZyYWN0aW9uLCBlLmcuIC1kZWxheSAwLjI1ICBEZWZhdWx0IDAuNVxuIgotIlxuIgotIiAgICAgIC1zaGVsbCAgICAgICAgIFNpbXBsZSBjb21tYW5kIGxpbmUgZm9yICctY29udHJvbCBpbnRlcm5hbCcgbW9kZSAoc2VlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMgb2YgdGhpcyBtb2RlIGJlbG93LikgIEVudGVyICc/JyBmb3IgY29tbWFuZCBsaXN0LlxuIgotIlxuIgotIiAgVG8gc3RvcCB4MTF2bmMgLWFwcHNoYXJlIHByZXNzIEN0cmwtQywgb3IgKGlmIC1ub2V4aXQgbm90IHN1cHBsaWVkKSBkZWxldGVcbiIKLSIgIHRoZSBpbml0aWFsIGFwcCB3aW5kb3cgb3IgZXhpdCB0aGUgYXBwbGljYXRpb24uIE9yIGNtZD1xdWl0IGluIC1jb250cm9sIG1vZGUuXG4iCi0iXG4iCi0jaWYgMAotIiAgSWYgeW91IHdhbnQgeW91ciBzZXR1cCB0byBzdXJ2aXZlIHBlcmlvZHMgb2YgdGltZSB3aGVyZSB0aGVyZSBhcmUgbm8gY2xpZW50c1xuIgotIiAgY29ubmVjdGVkIHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IC1hcmdzICctZm9yZXZlcicgb3RoZXJ3aXNlIHRoZSB4MTF2bmMnc1xuIgotIiAgd2lsbCBleGl0IHdoZW4gdGhlIGxhc3QgY2xpZW50IGRpc2Nvbm5lY3RzLiAgSG93ZXJ2ZXIsIF9zdGFydGluZ18gd2l0aCBub1xuIgotIiAgY2xpZW50cyAoZS5nLiBlbXB0eSBjb250cm9sIGZpbGUpIHdpbGwgd29yayB3aXRob3V0IC1hcmdzICctZm9yZXZlcicuXG4iCi0iXG4iCi0jZW5kaWYKLSIgIEluIGFkZGl0aW9uIHRvIHRoZSAnLmNtZCcgZmlsZSBjaGFubmVsLCBmb3IgZmFzdGVyIHJlc3BvbnNlIHlvdSBjYW4gc2V0XG4iCi0iICBYMTFWTkNfQVBQU0hBUkVfQ09NTUFORCBYIHByb3BlcnR5IG9uIHRoZSByb290IHdpbmRvdyB0byB0aGUgc3RyaW5nIHRoYXRcbiIKLSIgIHdvdWxkIGdvIGludG8gdGhlICcuY21kJyBmaWxlLiAgRm9yIGV4YW1wbGU6XG4iCi0iXG4iCi0iIHhwcm9wIC1yb290IC1mIFgxMVZOQ19BUFBTSEFSRV9DT01NQU5EIDhzIC1zZXQgWDExVk5DX0FQUFNIQVJFX0NPTU1BTkQgY21kPXF1aXRcbiIKLSJcbiIKLSIgIFRoZSBwcm9wZXJ0eSB2YWx1ZSB3aWxsIGJlIHNldCB0byAnRE9ORScgYWZ0ZXIgdGhlIGNvbW1hbmQocykgaXMgcHJvY2Vzc2VkLlxuIgotIlxuIgotIiAgSWYgLWNvbnRyb2wgZmlsZSBpcyBzcGVjaWZpZWQgYXMgJ2ludGVybmFsJyB0aGVuIG5vIGNvbnRyb2wgZmlsZSBpcyB1c2VkXG4iCi0iICBhbmQgY2xpZW50IHRyYWNraW5nIGlzIGRvbmUgaW50ZXJuYWxseS4gIFlvdSBtdXN0IGFkZCBhbmQgZGVsZXRlIGNsaWVudHNcbiIKLSIgIHdpdGggdGhlIGNtZD1hZGRfY2xpZW50OjxjbGllbnQ+IGFuZCBjbWQ9ZGVsX2NsaWVudDo8Y2xpZW50PiBjb21tYW5kcy5cbiIKLSIgIE5vdGUgdGhhdCAnLWNvbnRyb2wgaW50ZXJuYWwnIGlzIHJlcXVpcmVkIGZvciAnLXNoZWxsJyBtb2RlLiAgVXNpbmdcbiIKLSIgICctY29udHJvbCBzaGVsbCcgaW1wbGllcyBpbnRlcm5hbCBtb2RlIGFuZCAtc2hlbGwuXG4iCi0iXG4iCi0iICBMaW1pdGF0aW9uczpcbiIKLSJcbiIKLSIgICAgIFRoaXMgaXMgYSBxdWljayBsYXNoLXVwLCBtYW55IHRoaW5ncyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LlxuIgotIlxuIgotIiAgICAgVGhlIG1haW4gaWRlYSBpcyB0byBwcm92aWRlIHNpbXBsZSBhcHBsaWNhdGlvbiBzaGFyaW5nIGZvciB0d28gb3IgbW9yZVxuIgotIiAgICAgcGFydGllcyB0byBjb2xsYWJvcmF0ZSB3aXRob3V0IG5lZWRpbmcgdG8gc2hhcmUgdGhlIGVudGlyZSBkZXNrdG9wLiAgSXRcbiIKLSIgICAgIHByb3ZpZGVzIGFuIGltcHJvdmVtZW50IG92ZXIgLWlkLy1zaWQgdGhhdCBvbmx5IHNob3dzIGEgc2luZ2xlIHdpbmRvdy5cbiIKLSJcbiIKLSIgICAgIE9ubHkgcmV2ZXJzZSBjb25uZWN0aW9ucyBjYW4gYmUgZG9uZS4gIChOb3RlOiBvbmUgY2FuIHNwZWNpZnkgbXVsdGlwbGVcbiIKLSIgICAgIHZpZXdpbmcgaG9zdHMgdmlhOiAtY29ubmVjdCBob3N0MSxob3N0Mixob3N0MyBvciBhZGQvcmVtb3ZlIHRoZW1cbiIKLSIgICAgIGR5bmFtaWNhbGx5IGFzIGRlc2NyaWJlZCBhYm92ZS4pXG4iCi0iXG4iCi0iICAgICBJZiBhIG5ldyB3aW5kb3cgb2JzY3VyZXMgYW4gb2xkIG9uZSwgeW91IHdpbGwgc2VlIHNvbWUgb3IgYWxsIG9mIHRoZVxuIgotIiAgICAgbmV3IHdpbmRvdyBpbiB0aGUgb2xkIG9uZS4gIFRoZSBob3BlIGlzIHRoaXMgaXMgYSBwb3B1cCBkaWFsb2cgb3IgbWVudVxuIgotIiAgICAgdGhhdCB3aWxsIGdvIGF3YXkgc29vbi4gIE90aGVyd2lzZSBhIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgd2lsbFxuIgotIiAgICAgbmVlZCB0byBtb3ZlIGl0LiAoU2VlIGFsc28gdGhlIFNTVk5DIHZpZXdlciBmZWF0dXJlcyBkZXNjcmliZWQgYmVsb3cuKSBcbiIKLSJcbiIKLSIgICAgIFRoZSB2aWV3ZXIgc2lkZSBjYW5ub3QgcmVzaXplIG9yIG1ha2Ugd2luZG93cyBtb3ZlIG9uIHRoZSBwaHlzaWNhbFxuIgotIiAgICAgZGlzcGxheS4gIEFnYWluLCBhIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgbWF5IG5lZWQgdG8gaGVscCwgb3JcbiIKLSIgICAgIHVzZSB0aGUgU1NWTkMgdmlld2VyIChzZWUgVGlwIGJlbG93LilcbiIKLSJcbiIKLSIgICAgIFRpcDogSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBpdHMgb3duICdyZXNpemUgY29ybmVyJywgdGhlbiBkcmFnZ2luZ1xuIgotIiAgICAgICAgICBpdCBtYXkgc3VjY2Vzc2Z1bGx5IHJlc2l6ZSB0aGUgYXBwbGljYXRpb24gd2luZG93LlxuIgotIiAgICAgVGlwOiBTb21lIGRlc2t0b3AgZW52aXJvbm1lbnRzIGVuYWJsZSBtb3ZpbmcgYSB3aW5kb3cgdmlhLCBzYXksXG4iCi0iICAgICAgICAgIEFsdCtMZWZ0LUJ1dHRvbi1EcmFnLiAgT25lIG1heSBiZSBhYmxlIHRvIG1vdmUgYSB3aW5kb3cgdGhpcyB3YXkuXG4iCi0iICAgICAgICAgIEFsc28sIGUuZy4sIEFsdCtSaWdodC1CdXR0b24tRHJhZyBtYXkgcmVzaXplIGEgd2luZG93LlxuIgotIiAgICAgVGlwOiBDbGlja2luZyBvbiBwYXJ0IG9mIGFuIG9ic2N1cmVkIHdpbmRvdyBtYXkgcmFpc2UgaXQgdG8gdGhlIHRvcC5cbiIKLSIgICAgICAgICAgQWxzbywgZS5nLiwgQWx0K01pZGRsZS1CdXR0b24gbWF5IHRvZ2dsZSBSYWlzZS9Mb3dlci5cbiIKLSJcbiIKLSIgICAgIFRpcDogVGhlIFNTVk5DIDEuMC4yNSB1bml4IGFuZCBtYWNvc3ggdm5jdmlld2VyIGhhcyAnRXNjYXBlS2V5cycgaG90XG4iCi0iICAgICAgICAgIGtleXMgdGhhdCB3aWxsIG1vdmUsIHJlc2l6ZSwgcmFpc2UsIGFuZCBsb3dlciB0aGUgd2luZG93IHZpYSB0aGVcbiIKLSIgICAgICAgICAgeDExdm5jIC1yZW1vdGVfcHJlZml4IFgxMVZOQ19BUFBTSEFSRV9DTUQ6IGZlYXR1cmUuICBTbyBpbiB0aGVcbiIKLSIgICAgICAgICAgdmlld2VyIHdoaWxlIGhvbGRpbmcgZG93biBTaGlmdF9MK1N1cGVyX0wrQWx0X0wgdGhlIGFycm93IGtleXNcbiIKLSIgICAgICAgICAgbW92ZSB0aGUgd2luZG93LCBQYWdlVXAvUGFnZURuL0hvbWUvRW5kIHJlc2l6ZSBpdCwgYW5kIC0gYW5kICtcbiIKLSIgICAgICAgICAgcmFpc2UgYW5kIGxvd2VyIGl0LiAgS2V5ICdNJyBvciBCdXR0b24xIG1vdmVzIHRoZSByZW1vdGUgd2luZG93XG4iCi0iICAgICAgICAgIHRvIHRoZSArWCtZIG9mIHRoZSB2aWV3ZXIgd2luZG93LiAgS2V5ICdEJyBvciBCdXR0b24zIGRlbGV0ZXNcbiIKLSIgICAgICAgICAgdGhlIHJlbW90ZSB3aW5kb3cuXG4iCi0iXG4iCi0iICAgICAgICAgIFlvdSBjYW4gcnVuIHRoZSBTU1ZOQyB2bmN2aWV3ZXIgd2l0aCBvcHRpb25zICctZXNjYXBlIGRlZmF1bHQnLFxuIgotIiAgICAgICAgICAnLW11bHRpbGlzdGVuJyBhbmQgJy1lbnYgVk5DVklFV0VSX01JTl9USVRMRT0xJzsgb3IganVzdCBydW5cbiIKLSIgICAgICAgICAgd2l0aCBvcHRpb24gJy1hcHBzaGFyZScgdG8gZW5hYmxlIHRoZXNlIGFuZCBhdXRvbWF0aWMgcGxhY2VtZW50LlxuIgotIlxuIgotIiAgICAgSWYgYW55IHBhcnQgb2YgYSB3aW5kb3cgZ29lcyBvZmYgb2YgdGhlIGRpc3BsYXkgc2NyZWVuLCB0aGVuIHgxMXZuY1xuIgotIiAgICAgbWF5IGJlIHVuYWJsZSB0byBwb2xsIGl0ICh3aXRob3V0IGNyYXNoaW5nKSwgYW5kIHNvIHRoZSB3aW5kb3cgd2lsbFxuIgotIiAgICAgc3RvcCB1cGRhdGluZyB1bnRpbCB0aGUgd2luZG93IGlzIGNvbXBsZXRlbHkgb24tc2NyZWVuIGFnYWluLlxuIgotIlxuIgotIiAgICAgVGhlIChzdG9jaykgdm5jIHZpZXdlciBkb2VzIG5vdCBrbm93IHdoZXJlIHRvIGJlc3QgcG9zaXRpb24gZWFjaCBuZXdcbiIKLSIgICAgIHZpZXdlciB3aW5kb3c7IGl0IGxpa2VseSBjZW50ZXJzIGVhY2ggb25lIChpbmNsdWRpbmcgd2hlbiByZXNpemVkLilcbiIKLSIgICAgIE5vdGU6IFRoZSBTU1ZOQyB2aWV3ZXIgaW4gJy1hcHBzaGFyZScgbW9kZSBwbGFjZXMgdGhlbSBjb3JyZWN0bHkuXG4iCi0iXG4iCi0iICAgICBEZWxldGluZyBhIHZpZXdlciB3aW5kb3cgZG9lcyBub3QgZGVsZXRlIHRoZSByZWFsIHdpbmRvdy5cbiIKLSIgICAgIE5vdGU6IFRoZSBTU1ZOQyB2aWV3ZXIgU2hpZnQrRXNjYXBlS2V5cytCdXR0b24zIGRlbGV0ZXMgaXQuXG4iCi0iXG4iCi0iICAgICBTb21ldGltZXMgbmV3IHdpbmRvdyBkZXRlY3Rpb24gZmFpbHMuXG4iCi0iXG4iCi0iICAgICBTb21ldGltZXMgbWVudS9wb3B1cCBkZXRlY3Rpb24gZmFpbHMuXG4iCi0iXG4iCi0iICAgICBTb21ldGltZXMgdGhlIGNvbnRlbnRzIG9mIGEgbWVudS9wb3B1cCB3aW5kb3cgaGF2ZSBibGFja2VkLW91dCByZWdpb25zLlxuIgotIiAgICAgVHJ5IC1zaWQgb3IgLXNob3dtZW51cyBhcyBhIHdvcmthcm91bmQuXG4iCi0iXG4iCi0iICAgICBJZiB0aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwIGEgbmV3IGFwcGxpY2F0aW9uIChhIGRpZmZlcmVudCBwcm9jZXNzKVxuIgotIiAgICAgdGhhdCBuZXcgYXBwbGljYXRpb24gd2lsbCBub3QgYmUgdHJhY2tlZCAoYnV0LCB1bmZvcnR1bmF0ZWx5LCBpdCBtYXlcbiIKLSIgICAgIGNvdmVyIHVwIGV4aXN0aW5nIHdpbmRvd3MgdGhhdCBhcmUgYmVpbmcgdHJhY2tlZC4pIFNlZSBjbWQ9YWRkX3dpbmRvd1xuIgotIiAgICAgYW5kIGNtZD1hZGRfYXBwIGRlc2NyaWJlZCBhYm92ZS5cbiIKLSJcbiIKLSNlbmRpZgotOwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBXTUFYIDE5MgotI2RlZmluZSBDTUFYIDEyOAotI2RlZmluZSBBTUFYIDMyCi0KLXN0YXRpYyBXaW5kb3cgcm9vdCA9IE5vbmU7Ci1zdGF0aWMgV2luZG93IHdhdGNoW1dNQVhdOwotc3RhdGljIFdpbmRvdyBhcHBzW1dNQVhdOwotc3RhdGljIGludCBzdGF0ZVtXTUFYXTsKLXN0YXRpYyBjaGFyICpjbGllbnRzW0NNQVhdOwotc3RhdGljIFhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci1zdGF0aWMgY2hhciAqdGlja2VyX2F0b21fc3RyID0gIlgxMVZOQ19BUFBTSEFSRV9USUNLRVIiOwotc3RhdGljIEF0b20gdGlja2VyX2F0b20gPSBOb25lOwotc3RhdGljIGNoYXIgKmNtZF9hdG9tX3N0ciA9ICJYMTFWTkNfQVBQU0hBUkVfQ09NTUFORCI7Ci1zdGF0aWMgQXRvbSBjbWRfYXRvbSA9IE5vbmU7Ci1zdGF0aWMgY2hhciAqY29ubmVjdF90byA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqeDExdm5jX2FyZ3MgPSAiIjsKLXN0YXRpYyBjaGFyICppZF9vcHQgPSAiLWlkIjsKLXN0YXRpYyBpbnQgc2tpcF9tZW51cyA9IDE7Ci1zdGF0aWMgaW50IGV4aXRfbm9fYXBwX3dpbiA9IDE7Ci1zdGF0aWMgaW50IHNoZWxsID0gMDsKLXN0YXRpYyBpbnQgdHJlZV9kZXB0aCA9IDM7Ci1zdGF0aWMgY2hhciAqcHJvbXB0ID0gImFwcHNoYXJlPiAiOwotc3RhdGljIGNoYXIgKngxMXZuYyA9ICJ4MTF2bmMiOwotc3RhdGljIGNoYXIgKmNvbnRyb2wgPSBOVUxMOwotc3RhdGljIGNoYXIgKnRyYWNrZGlyID0gInVuc2V0IjsKLXN0YXRpYyBjaGFyICp0cmFja3ByZSA9ICIvdG1wL3gxMXZuYy1hcHBzaGFyZS10cmFja2Rpci10bXAiOwotc3RhdGljIGNoYXIgKnRyYWNrdG1wID0gTlVMTDsKLXN0YXRpYyBjaGFyIHVuaXF1ZV90YWdbMTAwXTsKLXN0YXRpYyBpbnQgdXNlX2ZvcmV2ZXIgPSAxOwotc3RhdGljIGludCBsYXN0X2V2ZW50X3R5cGUgPSAwOwotc3RhdGljIHBpZF90IGhlbHBlcl9waWQgPSAwOwotc3RhdGljIHBpZF90IHBhcmVudF9waWQgPSAwOwotc3RhdGljIGRvdWJsZSBoZWxwZXJfZGVsYXkgPSAwLjU7Ci1zdGF0aWMgaW50IGFwcHNoYXJlX2RlYnVnID0gMDsKLXN0YXRpYyBkb3VibGUgc3RhcnRfdGltZSA9IDAuMDsKLQotc3RhdGljIHZvaWQgZ2V0X3dtX25hbWUoV2luZG93IHdpbiwgY2hhciAqKm5hbWUpOwotc3RhdGljIGludCB3aW5fYXR0cihXaW5kb3cgd2luKTsKLXN0YXRpYyBpbnQgZ2V0X3h5KFdpbmRvdyB3aW4sIGludCAqeCwgaW50ICp5KTsKLXN0YXRpYyBXaW5kb3cgY2hlY2tfaW5zaWRlKFdpbmRvdyB3aW4pOwotc3RhdGljIGludCBvdXJzKFdpbmRvdyB3aW4pOwotc3RhdGljIHZvaWQgZGVzdHJveV93aW4oV2luZG93IHdpbik7Ci1zdGF0aWMgaW50IHNhbWVfYXBwKFdpbmRvdyB3aW4sIFdpbmRvdyBhcHApOwotCi1zdGF0aWMgdm9pZCBmZih2b2lkKSB7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JZmZsdXNoKHN0ZGVycik7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF93aW4oV2luZG93IHdpbikgewotCWludCBpOwotCWZvciAoaT0wOyBpIDwgV01BWDsgaSsrKSB7Ci0JCWlmICh3YXRjaFtpXSA9PSB3aW4pIHsKLQkJCXJldHVybiBpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBmaW5kX2FwcChXaW5kb3cgYXBwKSB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJaWYgKGFwcHNbaV0gPT0gYXBwKSB7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9jbGllbnQoY2hhciAqY2wpIHsKLQlpbnQgaTsKLQlmb3IgKGk9MDsgaSA8IENNQVg7IGkrKykgewotCQlpZiAoY2wgPT0gTlVMTCkgewotCQkJaWYgKGNsaWVudHNbaV0gPT0gTlVMTCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNsaWVudHNbaV0gPT0gTlVMTCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoY2xpZW50c1tpXSwgY2wpKSB7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhY2tkaXJfcGlkKFdpbmRvdyB3aW4pIHsKLQlGSUxFICpmOwotCWludCBsbiA9IDAsIHBpZCA9IDA7Ci0JY2hhciBsaW5lWzEwMjRdOwotCi0JaWYgKCF0cmFja2RpcikgewotCQlyZXR1cm4gMDsKLQl9Ci0Jc3ByaW50Zih0cmFja3RtcCwgIiVzLzB4JWx4LmxvZyIsIHRyYWNrZGlyLCB3aW4pOwotCWYgPSBmb3Blbih0cmFja3RtcCwgInIiKTsKLQlpZiAoIWYpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpICE9IE5VTEwpIHsKLQkJaWYgKGxuKysgPiAzMCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHN0cnN0cihsaW5lLCAieDExdm5jIHZlcnNpb246IikpIHsKLQkJCWNoYXIgKnEgPSBzdHJzdHIobGluZSwgInBpZDoiKTsKLQkJCWlmIChxKSB7Ci0JCQkJaW50IHA7Ci0JCQkJaWYgKHNzY2FuZihxLCAicGlkOiAlZCIsICZwKSA9PSAxKSB7Ci0JCQkJCWlmIChwID4gMCkgewotCQkJCQkJcGlkID0gcDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWZjbG9zZShmKTsKLQlyZXR1cm4gcGlkOwotfQotCi1zdGF0aWMgdm9pZCB0cmFja2Rpcl9jbGVhbnVwKFdpbmRvdyB3aW4pIHsKLQljaGFyICpzdWZmaXhbXSA9IHsibG9nIiwgImNvbm5lY3QiLCBOVUxMfTsKLQlpbnQgaT0wOwotCWlmICghdHJhY2tkaXIpIHsKLQkJcmV0dXJuOwotCX0KLQl3aGlsZSAoc3VmZml4W2ldICE9IE5VTEwpIHsKLQkJc3ByaW50Zih0cmFja3RtcCwgIiVzLzB4JWx4LiVzIiwgdHJhY2tkaXIsIHdpbiwgc3VmZml4W2ldKTsKLQkJaWYgKGFwcHNoYXJlX2RlYnVnICYmICFzdHJjbXAoc3VmZml4W2ldLCAibG9nIikpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAia2VlcGluZzogICVzXG4iLCB0cmFja3RtcCk7Ci0JCQlmZigpOwotCQl9IGVsc2UgewotCQkJaWYgKGFwcHNoYXJlX2RlYnVnKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJyZW1vdmluZzogJXNcbiIsIHRyYWNrdG1wKTsKLQkJCQlmZigpOwotCQkJfQotCQkJdW5saW5rKHRyYWNrdG1wKTsKLQkJfQotCQlpKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBsYXVuY2goV2luZG93IHdpbikgewotCWNoYXIgKmNtZCwgKnRtcCwgKmNvbm50bywgKm5hbWU7Ci0JaW50IGxlbiwgdGltZW8gPSAzMCwgdWYgPSB1c2VfZm9yZXZlcjsKLQlpbnQgdyA9IDAsIGggPSAwLCB4ID0gMCwgeSA9IDA7Ci0KLQlpZiAod2luX2F0dHIod2luKSkgewotCQkvKiBtYXliZSBzd2l0Y2ggdG8gZGVidWcgb25seS4gKi8KLQkJdyA9IGF0dHIud2lkdGg7Ci0JCWggPSBhdHRyLmhlaWdodDsKLQkJZ2V0X3h5KHdpbiwgJngsICZ5KTsKLQl9Ci0KLQlnZXRfd21fbmFtZSh3aW4sICZuYW1lKTsKLQotCWlmIChzdHJzdHIoeDExdm5jX2FyZ3MsICItb25jZSIpKSB7Ci0JCXVmID0gMDsKLQl9Ci0KLQlpZiAoY29udHJvbCkgewotCQlpbnQgaSA9IDA7Ci0JCWxlbiA9IDA7Ci0JCWZvciAoaT0wOyBpIDwgQ01BWDsgaSsrKSB7Ci0JCQlpZiAoY2xpZW50c1tpXSAhPSBOVUxMKSB7Ci0JCQkJbGVuICs9IHN0cmxlbihjbGllbnRzW2ldKSArIDI7Ci0JCQl9Ci0JCX0KLQkJY29ubnRvID0gKGNoYXIgKikgY2FsbG9jKGxlbiwgMSk7Ci0JCWZvciAoaT0wOyBpIDwgQ01BWDsgaSsrKSB7Ci0JCQlpZiAoY2xpZW50c1tpXSAhPSBOVUxMKSB7Ci0JCQkJaWYgKGNvbm50b1swXSAhPSAnXDAnKSB7Ci0JCQkJCXN0cmNhdChjb25udG8sICIsIik7Ci0JCQkJfQotCQkJCXN0cmNhdChjb25udG8sIGNsaWVudHNbaV0pOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJY29ubnRvID0gc3RyZHVwKGNvbm5lY3RfdG8pOwotCX0KLQlpZiAoIXN0cmNtcChjb25udG8sICIiKSkgewotCQl0aW1lbyA9IDA7Ci0JfQotCWlmICh1ZikgewotCQl0aW1lbyA9IDA7Ci0JfQotCQotCWxlbiA9IDEwMDAgKyBzdHJsZW4oeDExdm5jKSArIHN0cmxlbihjb25udG8pICsgc3RybGVuKHgxMXZuY19hcmdzKQotCSAgICArIDMgKiAodHJhY2tkaXIgPyBzdHJsZW4odHJhY2tkaXIpIDogMTAwKTsKLQotCWNtZCA9IChjaGFyICopIGNhbGxvYyhsZW4sIDEpOwotCXRtcCA9IChjaGFyICopIGNhbGxvYyhsZW4sIDEpOwotCi0Jc3ByaW50ZihjbWQsICIlcyAlcyAweCVseCAtYmcgLXF1aWV0ICVzIC1ub3B3IC1yZmJwb3J0IDAgIgotCSAgICAiLXRpbWVvdXQgJWQgLW5veGRhbWFnZSAtbm94aW5lcmFtYSAtbm9yYyAtcmVwZWF0IC1zcGVlZHMgZHNsICIKLQkgICAgIi1lbnYgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIgLWVudiBYMTFWTkNfQVBQU0hBUkVfQUNUSVZFPTEgIgotCSAgICAiLWVudiBYMTFWTkNfTk9fQ0hFQ0tfUE09MSAtZW52ICVzIC1ub3ZuY2Nvbm5lY3QgLXNoYXJlZCAtbm9uYXAgIgotCSAgICAiLXJlbW90ZV9wcmVmaXggWDExVk5DX0FQUFNIQVJFX0NNRDoiLAotCSAgICB4MTF2bmMsIGlkX29wdCwgd2luLCB1c2VfZm9yZXZlciA/ICItZm9yZXZlciIgOiAiLW9uY2UiLCB0aW1lbywgdW5pcXVlX3RhZyk7Ci0KLQlpZiAodHJhY2tkaXIpIHsKLQkJRklMRSAqZjsKLQkJc3ByaW50Zih0cmFja3RtcCwgIiAtbm9xdWlldCAtbyAlcy8weCVseC5sb2ciLCB0cmFja2Rpciwgd2luKTsKLQkJc3RyY2F0KGNtZCwgdHJhY2t0bXApOwotCQlzcHJpbnRmKHRyYWNrdG1wLCAiJXMvMHglbHguY29ubmVjdCIsIHRyYWNrZGlyLCB3aW4pOwotCQlmID0gZm9wZW4odHJhY2t0bXAsICJ3Iik7Ci0JCWlmIChmKSB7Ci0JCQlmcHJpbnRmKGYsICIlcyIsIGNvbm50byk7Ci0JCQlmY2xvc2UoZik7Ci0JCQlzcHJpbnRmKHRtcCwgIiAtY29ubmVjdF9vcl9leGl0ICclcyciLCB0cmFja3RtcCk7Ci0JCQlzdHJjYXQoY21kLCB0bXApOwotCQl9IGVsc2UgewotCQkJc3ByaW50Zih0bXAsICIgLWNvbm5lY3Rfb3JfZXhpdCAnJXMnIiwgY29ubnRvKTsKLQkJCXN0cmNhdChjbWQsIHRtcCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIXN0cmNtcChjb25udG8sICIiKSkgewotCQkJc3ByaW50Zih0bXAsICIgLWNvbm5lY3QgJyVzJyIsIGNvbm50byk7Ci0JCX0gZWxzZSB7Ci0JCQlzcHJpbnRmKHRtcCwgIiAtY29ubmVjdF9vcl9leGl0ICclcyciLCBjb25udG8pOwotCQl9Ci0JCXN0cmNhdChjbWQsIHRtcCk7Ci0JfQotCWlmICh1ZikgewotCQljaGFyICpxID0gc3Ryc3RyKGNtZCwgIi1jb25uZWN0X29yX2V4aXQiKTsKLQkJaWYgKHEpIHEgPSBzdHJzdHIocSwgIl9vcl9leGl0Iik7Ci0JCWlmIChxKSB7Ci0JCQl1bnNpZ25lZCBpbnQgaTsKLQkJCWZvciAoaT0wOyBpIDwgc3RybGVuKCJfb3JfZXhpdCIpOyBpKyspIHsKLQkJCQkqcSA9ICcgJzsKLQkJCQlxKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdHJjYXQoY21kLCAiICIpOwotCXN0cmNhdChjbWQsIHgxMXZuY19hcmdzKTsKLQotCWZwcmludGYoc3Rkb3V0LCAibGF1bmNoaW5nOiB4MTF2bmMgZm9yIHdpbmRvdyAweCUwOGx4ICVkeCVkKyVkKyVkIFwiJXNcIlxuIiwKLQkgICAgd2luLCB3LCBoLCB4LCB5LCBuYW1lKTsKLQotCWlmIChhcHBzaGFyZV9kZWJ1ZykgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxucnVubmluZzogICAlc1xuXG4iLCBjbWQpOwotCX0KLQlmZigpOwotCi0Jc3lzdGVtKGNtZCk7Ci0KLQlmcmVlKGNtZCk7Ci0JZnJlZSh0bXApOwotCWZyZWUoY29ubnRvKTsKLQlmcmVlKG5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wKFdpbmRvdyB3aW4pIHsKLQljaGFyICpjbWQ7Ci0JaW50IHBpZCA9IC0xOwotCWludCBmID0gZmluZF93aW4od2luKTsKLQlpZiAoZiA8IDAgfHwgd2luID09IE5vbmUpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc3RhdGVbZl0gPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCWlmICh0cmFja2RpcikgewotCQlwaWQgPSB0cmFja2Rpcl9waWQod2luKTsKLQkJaWYgKHBpZCA+IDApIHsKLQkJCWlmIChhcHBzaGFyZV9kZWJ1Zykge2ZwcmludGYoc3RkZXJyLAotCQkJICAgICJzZW5kaW5nIFNJR1RFUk0gdG86ICVkXG4iLCBwaWQpOyBmZigpO30KLQkJCWtpbGwoKHBpZF90KSBwaWQsIFNJR1RFUk0pOwotCQl9Ci0JfQotCi0JY21kID0gKGNoYXIgKikgbWFsbG9jKDEwMDAgKyBzdHJsZW4oeDExdm5jKSk7Ci0Jc3ByaW50ZihjbWQsICJwa2lsbCAtVEVSTSAtZiAnJXMgJXMgMHglbHggLWJnJyIsIHgxMXZuYywgaWRfb3B0LCB3aW4pOwotCWlmIChhcHBzaGFyZV9kZWJ1ZykgewotCQlmcHJpbnRmKHN0ZG91dCwgInN0b3BwaW5nOiAgMHglMDhseCAtICVzXG4iLCB3aW4sIGNtZCk7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRvdXQsICJzdG9wcGluZzogIHgxMXZuYyBmb3Igd2luZG93IDB4JTA4bHggICIKLQkJICAgICIocGlkOiAlZClcbiIsIHdpbiwgcGlkKTsKLQl9Ci0JZmYoKTsKLQlzeXN0ZW0oY21kKTsKLQotCXNwcmludGYoY21kLCAiKHNsZWVwIDAuMjUgMj4vZGV2L251bGwgfHwgc2xlZXAgMTsgcGtpbGwgLUtJTEwgLWYgJyVzICIKLQkgICAgIiVzIDB4JWx4IC1iZycpICYiLCB4MTF2bmMsIGlkX29wdCwgd2luKTsKLQlzeXN0ZW0oY21kKTsKLQotCWlmICh0cmFja2RpcikgewotCQl0cmFja2Rpcl9jbGVhbnVwKHdpbik7Ci0JfQotCi0JZnJlZShjbWQpOwotfQotCi1zdGF0aWMgdm9pZCBraWxsX2hlbHBlcl9waWQodm9pZCkgewotCWludCBzdGF0dXM7Ci0JaWYgKGhlbHBlcl9waWQgPD0gMCkgewotCQlyZXR1cm47Ci0JfQotCWZwcmludGYoc3RkZXJyLCAic3RvcHBpbmc6IGhlbHBlcl9waWQ6ICVkXG4iLCAoaW50KSBoZWxwZXJfcGlkKTsKLQlraWxsKGhlbHBlcl9waWQsIFNJR1RFUk0pOwotCXVzbGVlcCg1MCAqIDEwMDApOwotCWtpbGwoaGVscGVyX3BpZCwgU0lHS0lMTCk7Ci0JdXNsZWVwKDI1ICogMTAwMCk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1dBSVRfSCAmJiBMSUJWTkNTRVJWRVJfSEFWRV9XQUlUUElEIAotCXdhaXRwaWQoaGVscGVyX3BpZCwgJnN0YXR1cywgV05PSEFORyk7IAotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGJlX2hlbHBlcl9waWQoY2hhciAqZHB5X3N0cikgewotCWludCBjbnQgPSAwOwotCWludCBtcyA9IChpbnQpICgxMDAwICogaGVscGVyX2RlbGF5KTsKLQlkb3VibGUgbGFzdF9jaGVjayA9IDAuMDsKLQotCWlmIChtcyA8IDUwKSBtcyA9IDUwOwotCi0jaWYgTk9fWDExCi0JZnByaW50ZihzdGRlcnIsICJiZV9oZWxwZXJfcGlkOiBub3QgY29tcGlsZWQgd2l0aCBYMTEuXG4iKTsKLSNlbHNlCi0JZHB5ID0gWE9wZW5EaXNwbGF5KGRweV9zdHIpOwotCXRpY2tlcl9hdG9tID0gWEludGVybkF0b20oZHB5LCB0aWNrZXJfYXRvbV9zdHIsIEZhbHNlKTsKLQotCXdoaWxlICgxKSB7Ci0JCWNoYXIgdG1wWzMyXTsKLQkJc3ByaW50Zih0bXAsICJIRUxQRVJfQ05UXyUwOGQiLCBjbnQrKyk7Ci0JCVhDaGFuZ2VQcm9wZXJ0eShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIHRpY2tlcl9hdG9tLCBYQV9TVFJJTkcsIDgsCi0JCSAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyICopIHRtcCwgc3RybGVuKHRtcCkpOwotCQlYRmx1c2goZHB5KTsKLQkJdXNsZWVwKG1zKjEwMDApOwotCQlpZiAocGFyZW50X3BpZCA+IDApIHsKLQkJCWlmKGRub3coKSA+IGxhc3RfY2hlY2sgKyAxLjApIHsKLQkJCQlsYXN0X2NoZWNrID0gZG5vdygpOwotCQkJCWlmIChraWxsKHBhcmVudF9waWQsIDApICE9IDApIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJiZV9oZWxwZXJfcGlkOiBwYXJlbnQgJWQgaXMgZ29uZS5cbiIsIChpbnQpIHBhcmVudF9waWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQlleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9sb2dzKHZvaWQpIHsKLQlpZiAodHJhY2tkaXIpIHsKLQkJRElSICpkaXIgPSBvcGVuZGlyKHRyYWNrZGlyKTsKLQkJaWYgKGRpcikgewotCQkJc3RydWN0IGRpcmVudCAqZHA7Ci0JCQl3aGlsZSAoIChkcCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotCQkJCUZJTEUgKmY7Ci0JCQkJY2hhciAqbmFtZSA9IGRwLT5kX25hbWU7Ci0JCQkJaWYgKCFzdHJjbXAobmFtZSwgIi4iKSB8fCAhc3RyY21wKG5hbWUsICIuLiIpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoc3Ryc3RyKG5hbWUsICIweCIpICE9IG5hbWUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzdHJzdHIobmFtZSwgIi5sb2ciKSA9PSBOVUxMKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlzcHJpbnRmKHRyYWNrdG1wLCAiJXMvJXMiLCB0cmFja2RpciwgbmFtZSk7Ci0JCQkJZiA9IGZvcGVuKHRyYWNrdG1wLCAiciIpOwotCQkJCWlmIChmKSB7Ci0JCQkJCWNoYXIgbGluZVsxMDI0XTsKLQkJCQkJZnByaW50ZihzdGRlcnIsICI9PT09PSB4MTF2bmMgbG9nICVzID09PT09XG4iLCB0cmFja3RtcCk7Ci0JCQkJCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpICE9IE5VTEwpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaW5lKTsKLQkJCQkJfQotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQkJCWZmKCk7Ci0JCQkJCWZjbG9zZShmKTsKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZWRpcihkaXIpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhcHBzaGFyZV9jbGVhbnVwKGludCBzKSB7Ci0JaW50IGk7Ci0JaWYgKHMpIHt9Ci0KLQlpZiAodXNlX2ZvcmV2ZXIpIHsKLQkJLyogbGF1bmNoIHRoaXMgYmFja3VwIGluIGNhc2UgdGhleSBraWxsIC05IHVzIGJlZm9yZSB3ZSB0ZXJtaW5hdGUgZXZlcnl0aGluZyAqLwotCQljaGFyIGNtZFsxMDAwXTsKLQkJc3ByaW50ZihjbWQsICIoc2xlZXAgMzsgcGtpbGwgLVRFUk0gLWYgJyVzJykgJiIsIHVuaXF1ZV90YWcpOwotCQlpZiAoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGNtZCk7Ci0JCXN5c3RlbShjbWQpOwotCX0KLQotCWZvciAoaT0wOyBpIDwgV01BWDsgaSsrKSB7Ci0JCWlmICh3YXRjaFtpXSAhPSBOb25lKSB7Ci0JCQlzdG9wKHdhdGNoW2ldKTsKLQkJfQotCX0KLQotCWlmICh0cmFja2RpcikgewotCQlESVIgKmRpciA9IG9wZW5kaXIodHJhY2tkaXIpOwotCQlpZiAoZGlyKSB7Ci0JCQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQkJCXdoaWxlICggKGRwID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqbmFtZSA9IGRwLT5kX25hbWU7Ci0JCQkJaWYgKCFzdHJjbXAobmFtZSwgIi4iKSB8fCAhc3RyY21wKG5hbWUsICIuLiIpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoc3Ryc3RyKG5hbWUsICIweCIpICE9IG5hbWUpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJza2lwcGluZzogJXNcbiIsIG5hbWUpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCFhcHBzaGFyZV9kZWJ1ZykgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgInJlbW92aW5nOiAlc1xuIiwgbmFtZSk7Ci0JCQkJCXNwcmludGYodHJhY2t0bXAsICIlcy8lcyIsIHRyYWNrZGlyLCBuYW1lKTsKLQkJCQkJdW5saW5rKHRyYWNrdG1wKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAia2VlcGluZzogICVzXG4iLCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZWRpcihkaXIpOwotCQl9Ci0JCWlmICghYXBwc2hhcmVfZGVidWcpIHsKLQkJCWlmIChzdHJzdHIodHJhY2tkaXIsIHRyYWNrcHJlKSA9PSB0cmFja2RpcikgewotCQkJCWlmIChhcHBzaGFyZV9kZWJ1ZykgZnByaW50ZihzdGRlcnIsICJyZW1vdmluZzogJXNcbiIsIHRyYWNrZGlyKTsKLQkJCQlybWRpcih0cmFja2Rpcik7Ci0JCQl9Ci0JCX0KLQkJZmYoKTsKLQl9Ci0KLQlraWxsX2hlbHBlcl9waWQoKTsKLQkJCQotI2lmICFOT19YMTEKLQlYQ2xvc2VEaXNwbGF5KGRweSk7Ci0jZW5kaWYKLQlmcHJpbnRmKHN0ZG91dCwgImRvbmUuXG4iKTsKLQlmZigpOwotCWV4aXQoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhcF94ZXJyb3IoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmVycm9yKSB7Ci0JaWYgKGQgfHwgZXJyb3IpIHt9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2F0aW9uIG9mIHdpbmRvdyAqLwotICAgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAgICAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHdpbmRvdyAqLwotICAgIGludCBib3JkZXJfd2lkdGg7ICAgICAgICAgICAvKiBib3JkZXIgd2lkdGggb2Ygd2luZG93ICovCi0gICAgaW50IGRlcHRoOyAgICAgICAgICAgICAgICAgIC8qIGRlcHRoIG9mIHdpbmRvdyAqLwotICAgIFZpc3VhbCAqdmlzdWFsOyAgICAgICAgICAgICAvKiB0aGUgYXNzb2NpYXRlZCB2aXN1YWwgc3RydWN0dXJlICovCi0gICAgV2luZG93IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIHJvb3Qgb2Ygc2NyZWVuIGNvbnRhaW5pbmcgd2luZG93ICovCi0gICAgaW50IGNsYXNzOyAgICAgICAgICAgICAgICAgIC8qIElucHV0T3V0cHV0LCBJbnB1dE9ubHkqLwotICAgIGludCBiaXRfZ3Jhdml0eTsgICAgICAgICAgICAvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCi0gICAgaW50IHdpbl9ncmF2aXR5OyAgICAgICAgICAgIC8qIG9uZSBvZiB0aGUgd2luZG93IGdyYXZpdHkgdmFsdWVzICovCi0gICAgaW50IGJhY2tpbmdfc3RvcmU7ICAgICAgICAgIC8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCi0gICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2VydmVkIGlmIHBvc3NpYmxlICovCi0gICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BpeGVsOy8qIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgcGxhbmVzICovCi0gICAgQm9vbCBzYXZlX3VuZGVyOyAgICAgICAgICAgIC8qIGJvb2xlYW4sIHNob3VsZCBiaXRzIHVuZGVyIGJlIHNhdmVkPyAqLwotICAgIENvbG9ybWFwIGNvbG9ybWFwOyAgICAgICAgICAvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLwotICAgIEJvb2wgbWFwX2luc3RhbGxlZDsgICAgICAgICAvKiBib29sZWFuLCBpcyBjb2xvciBtYXAgY3VycmVudGx5IGluc3RhbGxlZCovCi0gICAgaW50IG1hcF9zdGF0ZTsgICAgICAgICAgICAgIC8qIElzVW5tYXBwZWQsIElzVW52aWV3YWJsZSwgSXNWaWV3YWJsZSAqLwotICAgIGxvbmcgYWxsX2V2ZW50X21hc2tzOyAgICAgICAvKiBzZXQgb2YgZXZlbnRzIGFsbCBwZW9wbGUgaGF2ZSBpbnRlcmVzdCBpbiovCi0gICAgbG9uZyB5b3VyX2V2ZW50X21hc2s7ICAgICAgIC8qIG15IGV2ZW50IG1hc2sgKi8KLSAgICBsb25nIGRvX25vdF9wcm9wYWdhdGVfbWFzazsgLyogc2V0IG9mIGV2ZW50cyB0aGF0IHNob3VsZCBub3QgcHJvcGFnYXRlICovCi0gICAgQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsgICAgIC8qIGJvb2xlYW4gdmFsdWUgZm9yIG92ZXJyaWRlLXJlZGlyZWN0ICovCi0gICAgU2NyZWVuICpzY3JlZW47ICAgICAgICAgICAgIC8qIGJhY2sgcG9pbnRlciB0byBjb3JyZWN0IHNjcmVlbiAqLwotfSBYV2luZG93QXR0cmlidXRlczsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnZXRfd21fbmFtZShXaW5kb3cgd2luLCBjaGFyICoqbmFtZSkgewotCWludCBvazsKLQotI2lmICFOT19YMTEKLSAgICAgICAgWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCW9rID0gWEZldGNoTmFtZShkcHksIHdpbiwgbmFtZSk7Ci0gICAgICAgCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotI2VuZGlmCi0KLQlpZiAoIW9rIHx8ICpuYW1lID09IE5VTEwpIHsKLQkJKm5hbWUgPSBzdHJkdXAoInVua25vd24iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgd2luX2F0dHIoV2luZG93IHdpbikgewotCWludCBvayA9IDA7Ci0jaWYgIU5PX1gxMQotICAgICAgICBYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0Jb2sgPSBYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIHdpbiwgJmF0dHIpOwotICAgICAgIAlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLSNlbmRpZgotCi0JaWYgKG9rKSB7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2luX3NlbGVjdChXaW5kb3cgd2luLCBpbnQgaWdub3JlKSB7Ci0jaWYgIU5PX1gxMQotICAgICAgICBYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0JaWYgKGlnbm9yZSkgewotCQlYU2VsZWN0SW5wdXQoZHB5LCB3aW4sIDApOwotCX0gZWxzZSB7Ci0JCVhTZWxlY3RJbnB1dChkcHksIHdpbiwgU3Vic3RydWN0dXJlTm90aWZ5TWFzayk7Ci0JfQotCVhTeW5jKGRweSwgRmFsc2UpOwotICAgICAgIAlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgV2luZG93IGdldF9wYXJlbnQoV2luZG93IHdpbikgewotCWludCBvazsKLQlXaW5kb3cgciwgcGFyZW50ID0gTm9uZSwgKmxpc3QgPSBOVUxMOwotCXVuc2lnbmVkIGludCBuY2hpbGQ7Ci0KLSNpZiAhTk9fWDExCi0gICAgICAgIFhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQlvayA9IFhRdWVyeVRyZWUoZHB5LCB3aW4sICZyLCAmcGFyZW50LCAmbGlzdCwgJm5jaGlsZCk7Ci0gICAgICAgCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCi0JaWYgKCFvaykgewotCQlyZXR1cm4gTm9uZTsKLQl9Ci0JaWYgKGxpc3QpIHsKLQkJWEZyZWUobGlzdCk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIHBhcmVudDsKLX0KLQotc3RhdGljIGludCBnZXRfeHkoV2luZG93IHdpbiwgaW50ICp4LCBpbnQgKnkpIHsKLQlXaW5kb3cgY3I7Ci0JQm9vbCByYyA9IEZhbHNlOyAKLSNpZiAhTk9fWDExCi0JWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCi0JcmMgPSBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoZHB5LCB3aW4sIHJvb3QsIDAsIDAsIHgsIHksICZjcik7Ci0gICAgICAgCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotI2VuZGlmCi0KLQlpZiAoIXJjKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotc3RhdGljIFdpbmRvdyBjaGVja19pbnNpZGUoV2luZG93IHdpbikgewotCWludCBpLCBud2luID0gMDsKLQlpbnQgdywgaCwgeCwgeTsKLQlpbnQgV3NbV01BWF0sIEhzW1dNQVhdLCBYc1tXTUFYXSwgWXNbV01BWF07Ci0JV2luZG93IHdpbnNbV01BWF07Ci0KLQlpZiAoIXdpbl9hdHRyKHdpbikpIHsKLQkJcmV0dXJuIE5vbmU7IAotCX0KLQotCS8qIHN0b3JlIHRoZW0gZmlyc3QgdG8gZ2l2ZSB0aGUgd2luIGFwcCBtb3JlIHRpbWUgdG8gc2V0dGxlLiAgKi8KLQlmb3IgKGk9MDsgaSA8IFdNQVg7IGkrKykgewotCQlpbnQgWCwgWTsKLQkJV2luZG93IHdjaGsgPSB3YXRjaFtpXTsKLQkJaWYgKHdjaGsgPT0gTm9uZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0YXRlW2ldID09IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghd2luX2F0dHIod2NoaykpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghZ2V0X3h5KHdjaGssICZYLCAmWSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJWHNbbndpbl0gPSBYOwotCQlZc1tud2luXSA9IFk7Ci0JCVdzW253aW5dID0gYXR0ci53aWR0aDsKLQkJSHNbbndpbl0gPSBhdHRyLmhlaWdodDsKLQkJd2luc1tud2luXSA9IHdjaGs7Ci0JCW53aW4rKzsKLQl9Ci0KLQlpZiAobndpbiA9PSAwKSB7Ci0JCXJldHVybiBOb25lOwotCX0KLQotCWlmICghd2luX2F0dHIod2luKSkgewotCQlyZXR1cm4gTm9uZTsgCi0JfQotCXcgPSBhdHRyLndpZHRoOwotCWggPSBhdHRyLmhlaWdodDsKLQotCWdldF94eSh3aW4sICZ4LCAmeSk7Ci0JaWYgKCFnZXRfeHkod2luLCAmeCwgJnkpKSB7Ci0JCXJldHVybiBOb25lOwotCX0KLQotCWZvciAoaT0wOyBpIDwgbndpbjsgaSsrKSB7Ci0JCWludCBYLCBZLCBXLCBIOwotCQlXaW5kb3cgd2NoayA9IHdpbnNbaV07Ci0JCVggPSBYc1tpXTsKLQkJWSA9IFlzW2ldOwotCQlXID0gV3NbaV07Ci0JCUggPSBIc1tpXTsKLQotCQlpZiAoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiY2hlY2sgaW5zaWRlOiAweCVseCAgJWR4JWQrJWQrJWQgJWR4JWQrJWQrJWRcbiIsIHdjaGssIHcsIGgsIHgsIHksIFcsIEgsIFgsIFkpOwotCi0JCWlmIChYIDw9IHggJiYgWSA8PSB5KSB7Ci0JCQlpZiAoeCArIHcgIDw9IFggKyBXICYmIHkgKyBoIDwgWSArIEgpIHsKLQkJCQlyZXR1cm4gd2NoazsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBOb25lOwotfQotCi1zdGF0aWMgdm9pZCBhZGRfd2luKFdpbmRvdyB3aW4pIHsKLQlpbnQgaWR4ICA9IGZpbmRfd2luKHdpbik7Ci0JaW50IGZyZWUgPSBmaW5kX3dpbihOb25lKTsKLQlpZiAoaWR4ID49IDApIHsKLQkJaWYgKGFwcHNoYXJlX2RlYnVnKSB7ZnByaW50ZihzdGRlcnIsICJhbHJlYWR5IHdhdGNoaW5nIHdpbmRvdzogMHglbHhcbiIsIHdpbik7IGZmKCk7fQotCQlyZXR1cm47Ci0JfQotCWlmIChmcmVlIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInJhbiBvdXQgb2Ygc2xvdHMgZm9yIHdpbmRvdzogMHglbHhcbiIsIHdpbik7IGZmKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXBwc2hhcmVfZGVidWcpIHtmcHJpbnRmKHN0ZGVyciwgIndhdGNoaW5nOiAweCVseCBhdCAlZFxuIiwgd2luLCBmcmVlKTsgZmYoKTt9Ci0KLQl3YXRjaFtmcmVlXSA9IHdpbjsKLQlzdGF0ZVtmcmVlXSA9IDA7Ci0KLQl3aW5fc2VsZWN0KHdpbiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV93aW4oV2luZG93IHdpbikgewotCWludCBpOwotCWZvciAoaT0wOyBpIDwgV01BWDsgaSsrKSB7Ci0JCWlmICh3YXRjaFtpXSA9PSB3aW4pIHsKLQkJCXdhdGNoW2ldID0gTm9uZTsKLQkJCXN0YXRlW2ldID0gMDsKLQkJCWlmIChhcHBzaGFyZV9kZWJ1Zykge2ZwcmludGYoc3RkZXJyLCAiZGVsZXRpbmc6IDB4JWx4IGF0ICVkXG4iLCB3aW4sIGkpOyBmZigpO30KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgcmVjdXJzZV9zZWFyY2goaW50IGxldmVsLCBpbnQgbGV2ZWxfbWF4LCBXaW5kb3cgdG9wLCBXaW5kb3cgYXBwLCBpbnQgKm53KSB7Ci0JV2luZG93IHcsIHIsIHBhcmVudCwgKmxpc3QgPSBOVUxMOwotCXVuc2lnbmVkIGludCBuY2hpbGQ7Ci0JaW50IG9rID0gMDsKLQotCWlmIChhcHBzaGFyZV9kZWJ1ZyA+IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsZXZlbDogJWQgbGV2ZWxfbWF4OiAlZCAgdG9wOiAweCVseCAgYXBwOiAweCVseFxuIiwgbGV2ZWwsIGxldmVsX21heCwgdG9wLCBhcHApOwotCX0KLQlpZiAobGV2ZWwgPj0gbGV2ZWxfbWF4KSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0jaWYgIU5PX1gxMQotCW9rID0gWFF1ZXJ5VHJlZShkcHksIHRvcCwgJnIsICZwYXJlbnQsICZsaXN0LCAmbmNoaWxkKTsKLQlpZiAob2spIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpIDwgKGludCkgbmNoaWxkOyBpKyspIHsKLQkJCXcgPSBsaXN0W2ldOwotCQkJaWYgKHcgPT0gTm9uZSB8fCBmaW5kX3dpbih3KSA+PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAob3Vycyh3KSAmJiB3ICE9IGFwcCkgewotCQkJCWlmIChhcHBzaGFyZV9kZWJ1ZykgZnByaW50ZihzdGRlcnIsICJhZGQgbGV2ZWwgJWQgMHglbHggJWQvJWRcbiIsCi0JCQkJICAgIGxldmVsLCB3LCBpLCBuY2hpbGQpOwotCQkJCWFkZF93aW4odyk7Ci0JCQkJKCpudykrKzsKLQkJCX0KLQkJfQotCQlmb3IgKGk9MDsgaSA8IChpbnQpIG5jaGlsZDsgaSsrKSB7Ci0JCQl3ID0gbGlzdFtpXTsKLQkJCWlmICh3ID09IE5vbmUgfHwgb3Vycyh3KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSAKLQkJCXJlY3Vyc2Vfc2VhcmNoKGxldmVsKzEsIGxldmVsX21heCwgdywgYXBwLCBudyk7Ci0JCX0KLQl9Ci0JaWYgKGxpc3QpIHsKLQkJWEZyZWUobGlzdCk7Ci0JfQotI2VuZGlmCi19Ci0JCQotc3RhdGljIHZvaWQgYWRkX2FwcChXaW5kb3cgYXBwKSB7Ci0JaW50IGksIG53ID0gMCwgZnJlZSA9IC0xOwotICAgICAgICBYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCi0jaWYgIU5PX1gxMQotCWkgPSBmaW5kX2FwcChhcHApOwotCWlmIChpID49IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJhbHJlYWR5IHRyYWNraW5nIGFwcDogMHglbHhcbiIsIGFwcCk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJaWYgKHNhbWVfYXBwKGFwcHNbaV0sIGFwcCkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiYWxyZWFkeSB0cmFja2luZyBhcHA6IDB4JWx4IHZpYSAweCVseFxuIiwgYXBwLCBhcHBzW2ldKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlmcmVlID0gZmluZF9hcHAoTm9uZSk7Ci0JaWYgKGZyZWUgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicmFuIG91dCBvZiBhcHAgc2xvdHMuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlhcHBzW2ZyZWVdID0gYXBwOwotCi0JYWRkX3dpbihhcHApOwotCi0gICAgICAgIG9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0JcmVjdXJzZV9zZWFyY2goMCwgdHJlZV9kZXB0aCwgcm9vdCwgYXBwLCAmbncpOwotICAgICAgIAlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLSNlbmRpZgotCWZwcmludGYoc3RkZXJyLCAidHJhY2tpbmcgJWQgd2luZG93cyByZWxhdGVkIHRvIGFwcCB3aW5kb3cgMHglbHhcbiIsIG53LCBhcHApOwotfQotCi1zdGF0aWMgdm9pZCBkZWxfYXBwKFdpbmRvdyBhcHApIHsKLQlpbnQgaTsKLQlmb3IgKGk9MDsgaSA8IFdNQVg7IGkrKykgewotCQlXaW5kb3cgd2luID0gd2F0Y2hbaV07Ci0JCWlmICh3aW4gIT0gTm9uZSkgewotCQkJaWYgKHNhbWVfYXBwKGFwcCwgd2luKSkgewotCQkJCWRlc3Ryb3lfd2luKHdpbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJV2luZG93IGFwcDIgPSBhcHBzW2ldOwotCQlpZiAoYXBwMiAhPSBOb25lKSB7Ci0JCQlpZiAoc2FtZV9hcHAoYXBwLCBhcHAyKSkgewotCQkJCWFwcHNbaV0gPSBOb25lOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3YWl0X3VudGlsX2VtcHR5KGNoYXIgKmZpbGUpIHsKLQlkb3VibGUgdCA9IDAuMCwgZHQgPSAwLjA1OwotCXdoaWxlICh0IDwgMS4wKSB7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQlpZiAoc3RhdChmaWxlLCAmc2IpICE9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2Iuc3Rfc2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdCArPSBkdDsKLQkJdXNsZWVwKCAoaW50KSAoZHQgKiAxMDAwICogMTAwMCkgKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaWVudChjaGFyICpjbGllbnQsIGludCBhZGQpIHsKLQlESVIgKmRpcjsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQotCWlmICghY2xpZW50KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCF0cmFja2RpcikgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vIHRyYWNrZGlyLCBjYW5ub3QgJXMgY2xpZW50OiAlc1xuIiwKLQkJICAgIGFkZCA/ICJhZGQiIDogImRpc2Nvbm5lY3QiLCBjbGllbnQpOwotCQlmZigpOwotCQlyZXR1cm47Ci0JfQotCWZwcmludGYoc3Rkb3V0LCAiJXMgY2xpZW50OiAlc1xuIiwgYWRkID8gImFkZGluZyAgIiA6ICJkZWxldGluZyIsIGNsaWVudCk7Ci0KLQlkaXIgPSBvcGVuZGlyKHRyYWNrZGlyKTsKLQlpZiAoIWRpcikgewotCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuZGlyIHRyYWNrZGlyOiAlc1xuIiwgdHJhY2tkaXIpOwotCQlyZXR1cm47Ci0JfQotCXdoaWxlICggKGRwID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7Ci0JCWNoYXIgKm5hbWUgPSBkcC0+ZF9uYW1lOwotCQlpZiAoIXN0cmNtcChuYW1lLCAiLiIpIHx8ICFzdHJjbXAobmFtZSwgIi4uIikpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIobmFtZSwgIjB4IikgIT0gbmFtZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0cnN0cihuYW1lLCAiLmNvbm5lY3QiKSkgewotCQkJRklMRSAqZjsKLQkJCWNoYXIgKnRtcDsKLQkJCVdpbmRvdyB0d2luOwotCi0JCQlpZiAoc2Nhbl9oZXhkZWMobmFtZSwgJnR3aW4pKSB7Ci0JCQkJaW50IGYgPSBmaW5kX3dpbih0d2luKTsKLQkJCQlpZiAoYXBwc2hhcmVfZGVidWcpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJ0d2luOiAweCVseCBuYW1lPSVzIGY9JWRcbiIsIHR3aW4sIG5hbWUsIGYpOwotCQkJCQlmZigpOwotCQkJCX0KLQkJCQlpZiAoZiA8IDApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQl0bXAgPSAoY2hhciAqKSBjYWxsb2MoMTAwICsgc3RybGVuKGNsaWVudCksIDEpOwotCQkJc3ByaW50Zih0cmFja3RtcCwgIiVzLyVzIiwgdHJhY2tkaXIsIG5hbWUpOwotCQkJaWYgKGFkZCkgewotCQkJCXNwcmludGYodG1wLCAiJXNcbiIsIGNsaWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXNwcmludGYodG1wLCAiY21kPWNsb3NlOiVzXG4iLCBjbGllbnQpOwotCQkJfQotCQkJd2FpdF91bnRpbF9lbXB0eSh0cmFja3RtcCk7Ci0JCQlmID0gZm9wZW4odHJhY2t0bXAsICJ3Iik7Ci0JCQlpZiAoZikgewotCQkJCWlmIChhcHBzaGFyZV9kZWJ1ZykgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNsaWVudDogJXMgKyAlcyIsCi0JCQkJCWFkZCA/ICJhZGQiIDogImRpc2Nvbm5lY3QiLCB0cmFja3RtcCwgdG1wKTsKLQkJCQkJZmYoKTsKLQkJCQl9Ci0JCQkJZnByaW50ZihmLCAiJXMiLCB0bXApOwotCQkJCWZjbG9zZShmKTsKLQkJCX0KLQkJCWZyZWUodG1wKTsKLQkJfQotCX0KLQljbG9zZWRpcihkaXIpOwotfQotCi1zdGF0aWMgdm9pZCBtYXBwZWQoV2luZG93IHdpbikgewotCWludCBmOwotCWlmICh3aW4gPT0gTm9uZSkgewotCQlyZXR1cm47Ci0JfQotCWYgPSBmaW5kX3dpbih3aW4pOwotCWlmIChmIDwgMCkgewotCQlpZiAod2luX2F0dHIod2luKSkgewotCQkJaWYgKGdldF9wYXJlbnQod2luKSA9PSByb290KSB7Ci0JCQkJLyogWFhYIG1vcmUgY2FzZXM/ICovCi0JCQkJYWRkX3dpbih3aW4pOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1bm1hcHBlZChXaW5kb3cgd2luKSB7Ci0JaW50IGYgPSBmaW5kX3dpbih3aW4pOwotCWlmIChmIDwgMCB8fCB3aW4gPT0gTm9uZSkgewotCQlyZXR1cm47Ci0JfQotCXN0b3Aod2luKTsJCi0Jc3RhdGVbZl0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X3dpbihXaW5kb3cgd2luKSB7Ci0Jc3RvcCh3aW4pOwotCWRlbGV0ZV93aW4od2luKTsKLX0KLQotc3RhdGljIFdpbmRvdyBwYXJzZV93aW4oY2hhciAqc3RyKSB7Ci0JV2luZG93IHdpbiA9IE5vbmU7Ci0JaWYgKCFzdHIpIHsKLQkJcmV0dXJuIE5vbmU7Ci0JfQotCWlmICghc3RyY21wKHN0ciwgInBpY2siKSB8fCAhc3RyY21wKHN0ciwgInAiKSkgewotCQlzdGF0aWMgZG91YmxlIGxhc3RfcGljayA9IDAuMDsKLQkJaWYgKGRub3coKSA8IHN0YXJ0X3RpbWUgKyAxNSkgewotCQkJOwotCQl9IGVsc2UgaWYgKGRub3coKSA8IGxhc3RfcGljayArIDIpIHsKLQkJCXJldHVybiBOb25lOwotCQl9IGVsc2UgewotCQkJbGFzdF9waWNrID0gZG5vdygpOwotCQl9Ci0JCWlmICghcGlja193aW5kb3dpZCgmd2luKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJwYXJzZV93aW46IGJhZCB3aW5kb3cgcGljay5cbiIpOwotCQkJd2luID0gTm9uZTsKLQkJfQotCQlpZiAod2luID09IHJvb3QpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicGFyc2Vfd2luOiBpZ25vcmluZyBwaWNrIG9mIHJvb3R3aW4gMHglbHguXG4iLCB3aW4pOwotCQkJd2luID0gTm9uZTsKLQkJfQotCQlmZigpOwotCX0gZWxzZSBpZiAoIXNjYW5faGV4ZGVjKHN0ciwgJndpbikpIHsKLQkJd2luID0gTm9uZTsKLQl9Ci0JcmV0dXJuIHdpbjsKLX0KLQotc3RhdGljIHZvaWQgYWRkX29yX2RlbF9hcHAoY2hhciAqc3RyLCBpbnQgYWRkKSB7Ci0JV2luZG93IHdpbiA9IHBhcnNlX3dpbihzdHIpOwotCi0JaWYgKHdpbiAhPSBOb25lKSB7Ci0JCWlmIChhZGQpIHsKLQkJCWFkZF9hcHAod2luKTsKLQkJfSBlbHNlIHsKLQkJCWRlbF9hcHAod2luKTsKLQkJfQotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhbGwiKSkgewotCQlpZiAoIWFkZCkgewotCQkJaW50IGk7Ci0JCQlmb3IgKGk9MDsgaSA8IEFNQVg7IGkrKykgewotCQkJCWlmIChhcHBzW2ldICE9IE5vbmUpIHsKLQkJCQkJZGVsX2FwcChhcHBzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9vcl9kZWxfd2luKGNoYXIgKnN0ciwgaW50IGFkZCkgewotCVdpbmRvdyB3aW4gPSBwYXJzZV93aW4oc3RyKTsKLQotCWlmICh3aW4gIT0gTm9uZSkgewotCQlpbnQgZiA9IGZpbmRfd2luKHdpbik7Ci0JCWlmIChhZGQpIHsKLQkJCWlmIChmIDwgMCAmJiB3aW5fYXR0cih3aW4pKSB7Ci0JCQkJYWRkX3dpbih3aW4pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGYgPj0gMCkgewotCQkJCWRlc3Ryb3lfd2luKHdpbik7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYWxsIikpIHsKLQkJaWYgKCFhZGQpIHsKLQkJCWludCBpOwotCQkJZm9yIChpPTA7IGkgPCBXTUFYOyBpKyspIHsKLQkJCQlpZiAod2F0Y2hbaV0gIT0gTm9uZSkgewotCQkJCQlkZXN0cm95X3dpbih3YXRjaFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSAKLX0KLQotc3RhdGljIHZvaWQgYWRkX29yX2RlbF9jbGllbnQoY2hhciAqc3RyLCBpbnQgYWRkKSB7Ci0JaW50IGk7Ci0KLQlpZiAoIXN0cikgewotCQlyZXR1cm47Ci0JfQotCWlmIChzdHJjbXAoY29udHJvbCwgImludGVybmFsIikpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoYWRkKSB7Ci0JCWludCBpZHggID0gZmluZF9jbGllbnQoc3RyKTsKLQkJaW50IGZyZWUgPSBmaW5kX2NsaWVudChOVUxMKTsKLQotCQlpZiAoaWR4ID49MCkgewotCQkJZnByaW50ZihzdGRlcnIsICJhbHJlYWR5IHRyYWNraW5nIGNsaWVudDogJXMgaW4gc2xvdCAlZFxuIiwgc3RyLCBpZHgpOwotCQkJZmYoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZnJlZSA8IDApIHsKLQkJCXN0YXRpYyBpbnQgY250ID0gMDsKLQkJCWlmIChjbnQrKyA8IDEwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJyYW4gb3V0IG9mIGNsaWVudCBzbG90cy5cbiIpOwotCQkJCWZmKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2xpZW50c1tmcmVlXSA9IHN0cmR1cChzdHIpOwotCQljbGllbnQoc3RyLCAxKTsKLQl9IGVsc2UgewotCQlpZiAoc3RyWzBdID09ICcjJyB8fCBzdHJbMF0gPT0gJyUnKSB7Ci0JCQlpZiAoc3NjYW5mKHN0cisxLCAiJWQiLCAmaSkgPT0gMSkgewotCQkJCWktLTsKLQkJCQlpZiAoMCA8PSBpICYmIGkgPCBDTUFYKSB7Ci0JCQkJCWlmIChjbGllbnRzW2ldICE9IE5VTEwpIHsKLQkJCQkJCWNsaWVudChjbGllbnRzW2ldLCAwKTsKLQkJCQkJCWZyZWUoY2xpZW50c1tpXSk7Ci0JCQkJCQljbGllbnRzW2ldID0gTlVMTDsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImFsbCIpKSB7Ci0JCQlmb3IgKGk9MDsgaSA8IENNQVg7IGkrKykgewotCQkJCWlmIChjbGllbnRzW2ldID09IE5VTEwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNsaWVudChjbGllbnRzW2ldLCAwKTsKLQkJCQlmcmVlKGNsaWVudHNbaV0pOwotCQkJCWNsaWVudHNbaV0gPSBOVUxMOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaSA9IGZpbmRfY2xpZW50KHN0cik7Ci0JCWlmIChpID49IDApIHsKLQkJCWZyZWUoY2xpZW50c1tpXSk7Ci0JCQljbGllbnRzW2ldID0gTlVMTDsKLQkJCWNsaWVudChzdHIsIDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCByZXN0YXJ0X3gxMXZuYyh2b2lkKSB7Ci0JaW50IGksIG4gPSAwOwotCVdpbmRvdyB3aW4sIGFjdGl2ZVtXTUFYXTsKLQlmb3IgKGk9MDsgaSA8IFdNQVg7IGkrKykgewotCQl3aW4gPSB3YXRjaFtpXTsKLQkJaWYgKHdpbiA9PSBOb25lKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc3RhdGVbaV0pIHsKLQkJCWFjdGl2ZVtuKytdID0gd2luOwotCQkJc3RvcCh3aW4pOwotCQl9Ci0JfQotCWlmIChuKSB7Ci0JCXVzbGVlcCgxNTAwICogMTAwMCk7Ci0JfQotCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCXdpbiA9IGFjdGl2ZVtpXTsKLQkJbGF1bmNoKHdpbik7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbWFzayA9IDB4M2ZjMDAwMDA7IC8qIDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICovCi0KLXN0YXRpYyB2b2lkIGluaXRfY21hc2sodm9pZCkgewotCS8qIGRlcGVuZGVudCBvbiB0aGUgWCBzZXJ2ZXIgaW1wbGVtZW50YXRpb247IFhtdUNsaWVudFdpbmRvdyBiZXR0ZXI/ICovCi0JLyogeGMvcHJvZ3JhbXMvWHNlcnZlci9pbmNsdWRlL3Jlc291cmNlLmggKi8KLQlpbnQgZGlkaXQgPSAwLCByZXNfY250ID0gMjksIGNsaWVudF9iaXRzID0gODsKLQotCWlmIChnZXRlbnYoIlgxMVZOQ19BUFBTSEFSRV9DTElFTlRfTUFTSyIpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY3I7Ci0JCWlmIChzc2NhbmYoZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQ0xJRU5UX01BU0siKSwgIjB4JWx4IiwgJmNyKSA9PSAxKSB7Ci0JCQljbWFzayA9IGNyOwotCQkJZGlkaXQgPSAxOwotCQl9Ci0JfSBlbHNlIGlmIChnZXRlbnYoIlgxMVZOQ19BUFBTSEFSRV9DTElFTlRfQklUUyIpKSB7Ci0JCWludCBjciA9IGF0b2koZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQ0xJRU5UX0JJVFMiKSk7Ci0JCWlmIChjciA+IDApIHsKLQkJCWNsaWVudF9iaXRzID0gY3I7Ci0JCX0KLQl9Ci0JaWYgKCFkaWRpdCkgewotCQljbWFzayA9ICgoKDEgPDwgY2xpZW50X2JpdHMpIC0gMSkgPDwgKHJlc19jbnQtY2xpZW50X2JpdHMpKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJjbGllbnRfbWFzazogMHglMDhseFxuIiwgY21hc2spOwotfQotCi1zdGF0aWMgaW50IHNhbWVfYXBwKFdpbmRvdyB3aW4sIFdpbmRvdyBhcHApIHsKLQlpZiAoICh3aW4gJiBjbWFzaykgPT0gKGFwcCAmIGNtYXNrKSApIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IG91cnMoV2luZG93IHdpbikgewotCWludCBpOwotCWZvciAoaT0wOyBpIDwgQU1BWDsgaSsrKSB7Ci0JCWlmIChhcHBzW2ldICE9IE5vbmUpIHsKLQkJCWlmIChzYW1lX2FwcCh3aW4sIGFwcHNbaV0pKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpc3RfY2xpZW50cyh2b2lkKSB7Ci0JaW50IGksIG4gPSAwOwotCWZvciAoaT0wOyBpIDwgQ01BWDsgaSsrKSB7Ci0JCWlmIChjbGllbnRzW2ldID09IE5VTEwpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZwcmludGYoc3Rkb3V0LCAiY2xpZW50WyUwMmRdICVzXG4iLCArK24sIGNsaWVudHNbaV0pOwotCX0KLQlmcHJpbnRmKHN0ZG91dCwgInRvdGFsIGNsaWVudHM6ICVkXG4iLCBuKTsKLQlmZigpOwotfQotCi1zdGF0aWMgdm9pZCBsaXN0X3dpbmRvd3Modm9pZCkgewotCWludCBpLCBuID0gMDsKLQlmb3IgKGk9MDsgaSA8IFdNQVg7IGkrKykgewotCQljaGFyICpuYW1lOwotCQlXaW5kb3cgd2luID0gd2F0Y2hbaV07Ci0JCWlmICh3aW4gPT0gTm9uZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJZ2V0X3dtX25hbWUod2luLCAmbmFtZSk7Ci0JCWZwcmludGYoc3Rkb3V0LCAid2luZG93WyUwMmRdIDB4JTA4bHggc3RhdGU6ICVkIHNsb3Q6ICUwM2QgXCIlc1wiXG4iLAotCQkgICAgKytuLCB3aW4sIHN0YXRlW2ldLCBpLCBuYW1lKTsKLQkJZnJlZShuYW1lKTsKLQl9Ci0JZnByaW50ZihzdGRvdXQsICJ0b3RhbCB3aW5kb3dzOiAlZFxuIiwgbik7Ci0JZmYoKTsKLX0KLQotc3RhdGljIHZvaWQgbGlzdF9hcHBzKHZvaWQpIHsKLQlpbnQgaSwgbiA9IDA7Ci0JZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJY2hhciAqbmFtZTsKLQkJV2luZG93IHdpbiA9IGFwcHNbaV07Ci0JCWlmICh3aW4gPT0gTm9uZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJZ2V0X3dtX25hbWUod2luLCAmbmFtZSk7Ci0JCWZwcmludGYoc3Rkb3V0LCAiYXBwWyUwMmRdIDB4JTA4bHggc3RhdGU6ICVkIHNsb3Q6ICUwM2QgXCIlc1wiXG4iLAotCQkgICAgKytuLCB3aW4sIHN0YXRlW2ldLCBpLCBuYW1lKTsKLQkJZnJlZShuYW1lKTsKLQl9Ci0JZnByaW50ZihzdGRvdXQsICJ0b3RhbCBhcHBzOiAlZFxuIiwgbik7Ci0JZmYoKTsKLX0KLQotc3RhdGljIGludCBwcm9jZXNzX2NvbnRyb2woY2hhciAqZmlsZSwgaW50IGNoZWNrX2NsaWVudHMpIHsKLQlpbnQgaSwgbm5ldyA9IDAsIHNlZW5bQ01BWF07Ci0JY2hhciBsaW5lWzEwMjRdLCAqbmV3Y3RsW0NNQVhdOwotCUZJTEUgKmY7Ci0KLQlmID0gZm9wZW4oZmlsZSwgInIiKTsKLQlpZiAoIWYpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChjaGVja19jbGllbnRzKSB7Ci0JCWZvciAoaT0wOyBpIDwgQ01BWDsgaSsrKSB7Ci0JCQlzZWVuW2ldID0gMDsKLQkJfQotCX0KLQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnEgPSBzdHJjaHIobGluZSwgJ1xuJyk7Ci0JCWlmIChxKSAqcSA9ICdcMCc7Ci0KLQkJaWYgKGFwcHNoYXJlX2RlYnVnKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrX2NvbnRyb2w6ICVzXG4iLCBsaW5lKTsKLQkJCWZmKCk7Ci0JCX0KLQotCQlxID0gbGJsYW5rcyhsaW5lKTsKLQkJaWYgKHFbMF0gPT0gJyMnKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChxLCAiIikpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIocSwgImNtZD0iKSA9PSBxKSB7Ci0JCQljaGFyICpjbWQgPSBxICsgc3RybGVuKCJjbWQ9Iik7Ci0JCQlpZiAoIXN0cmNtcChjbWQsICJxdWl0IikpIHsKLQkJCQlpZiAoc3RyY21wKGNvbnRyb2wsIGZpbGUpICYmIHN0cnN0cihmaWxlLCAiLmNtZCIpKSB7Ci0JCQkJCUZJTEUgKmYyID0gZm9wZW4oZmlsZSwgInciKTsKLQkJCQkJaWYgKGYyKSBmY2xvc2UoZjIpOwotCQkJCX0KLQkJCQlhcHBzaGFyZV9jbGVhbnVwKDApOwotCQkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIndhaXQiKSkgewotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiYmNhc3Q6IikgPT0gY21kKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiZGVsX3dpbmRvdzoiKSA9PSBjbWQpIHsKLQkJCQlhZGRfb3JfZGVsX3dpbihjbWQgKyBzdHJsZW4oImRlbF93aW5kb3c6IiksIDApOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiYWRkX3dpbmRvdzoiKSA9PSBjbWQpIHsKLQkJCQlhZGRfb3JfZGVsX3dpbihjbWQgKyBzdHJsZW4oImFkZF93aW5kb3c6IiksIDEpOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiZGVsOiIpID09IGNtZCkgewotCQkJCWFkZF9vcl9kZWxfd2luKGNtZCArIHN0cmxlbigiZGVsOiIpLCAwKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImFkZDoiKSA9PSBjbWQpIHsKLQkJCQlhZGRfb3JfZGVsX3dpbihjbWQgKyBzdHJsZW4oImFkZDoiKSwgMSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJkZWxfY2xpZW50OiIpID09IGNtZCkgewotCQkJCWFkZF9vcl9kZWxfY2xpZW50KGNtZCArIHN0cmxlbigiZGVsX2NsaWVudDoiKSwgMCk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJhZGRfY2xpZW50OiIpID09IGNtZCkgewotCQkJCWFkZF9vcl9kZWxfY2xpZW50KGNtZCArIHN0cmxlbigiYWRkX2NsaWVudDoiKSwgMSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICItIikgPT0gY21kKSB7Ci0JCQkJYWRkX29yX2RlbF9jbGllbnQoY21kICsgc3RybGVuKCItIiksIDApOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiKyIpID09IGNtZCkgewotCQkJCWFkZF9vcl9kZWxfY2xpZW50KGNtZCArIHN0cmxlbigiKyIpLCAxKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImRlbF9hcHA6IikgPT0gY21kKSB7Ci0JCQkJYWRkX29yX2RlbF9hcHAoY21kICsgc3RybGVuKCJkZWxfYXBwOiIpLCAwKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImFkZF9hcHA6IikgPT0gY21kKSB7Ci0JCQkJYWRkX29yX2RlbF9hcHAoY21kICsgc3RybGVuKCJhZGRfYXBwOiIpLCAxKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImRlYnVnOiIpID09IGNtZCkgewotCQkJCWFwcHNoYXJlX2RlYnVnID0gYXRvaShjbWQgKyBzdHJsZW4oImRlYnVnOiIpKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgInNob3dtZW51czoiKSA9PSBjbWQpIHsKLQkJCQlza2lwX21lbnVzID0gYXRvaShjbWQgKyBzdHJsZW4oInNob3dtZW51czoiKSk7Ci0JCQkJc2tpcF9tZW51cyA9ICEoc2tpcF9tZW51cyk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJub2V4aXQ6IikgPT0gY21kKSB7Ci0JCQkJZXhpdF9ub19hcHBfd2luID0gYXRvaShjbWQgKyBzdHJsZW4oIm5vZXhpdDoiKSk7Ci0JCQkJZXhpdF9ub19hcHBfd2luID0gIShleGl0X25vX2FwcF93aW4pOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAidXNlX2ZvcmV2ZXI6IikgPT0gY21kKSB7Ci0JCQkJdXNlX2ZvcmV2ZXIgPSBhdG9pKGNtZCArIHN0cmxlbigidXNlX2ZvcmV2ZXI6IikpOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAidHJlZV9kZXB0aDoiKSA9PSBjbWQpIHsKLQkJCQl0cmVlX2RlcHRoID0gYXRvaShjbWQgKyBzdHJsZW4oInRyZWVfZGVwdGg6IikpOwotCQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAieDExdm5jX2FyZ3M6IikgPT0gY21kKSB7Ci0JCQkJeDExdm5jX2FyZ3MgPSBzdHJkdXAoY21kICsgc3RybGVuKCJ4MTF2bmNfYXJnczoiKSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJlbnY6IikgPT0gY21kKSB7Ci0JCQkJcHV0ZW52KGNtZCArIHN0cmxlbigiZW52OiIpKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm5vb3AiKSA9PSBjbWQpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicmVzdGFydCIpKSB7Ci0JCQkJcmVzdGFydF94MTF2bmMoKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJsaXN0X2NsaWVudHMiKSB8fCAhc3RyY21wKGNtZCwgImxjIikpIHsKLQkJCQlsaXN0X2NsaWVudHMoKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJsaXN0X3dpbmRvd3MiKSB8fCAhc3RyY21wKGNtZCwgImx3IikpIHsKLQkJCQlsaXN0X3dpbmRvd3MoKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJsaXN0X2FwcHMiKSB8fCAhc3RyY21wKGNtZCwgImxhIikpIHsKLQkJCQlsaXN0X2FwcHMoKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJsaXN0X2FsbCIpIHx8ICFzdHJjbXAoY21kLCAibHMiKSkgewotCQkJCWxpc3Rfd2luZG93cygpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQlsaXN0X2FwcHMoKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQkJbGlzdF9jbGllbnRzKCk7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicHJpbnRfbG9ncyIpIHx8ICFzdHJjbXAoY21kLCAicGwiKSkgewotCQkJCXByaW50X2xvZ3MoKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICI/IikgfHwgIXN0cmNtcChjbWQsICJoIikgfHwgIXN0cmNtcChjbWQsICJoZWxwIikpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImF2YWlsYWJsZSBjb21tYW5kczpcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIHF1aXQgcmVzdGFydCBub29wIHgxMXZuYyBoZWxwID8gISAhIVxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgYWRkX3dpbmRvdzp3aW4gIChhZGQ6d2luLCBhZGQ6cGljaylcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgZGVsX3dpbmRvdzp3aW4gIChkZWw6d2luLCBkZWw6cGljaywgZGVsOmFsbClcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgYWRkX2FwcDp3aW4gICAgIChhZGRfYXBwOnBpY2spXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGRlbF9hcHA6d2luICAgICAoZGVsX2FwcDpwaWNrLCBkZWxfYXBwOmFsbClcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgYWRkX2NsaWVudDpob3N0ICgraG9zdClcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgZGVsX2NsaWVudDpob3N0ICgtaG9zdCwgLWFsbClcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGxpc3Rfd2luZG93cyAgICAobHcpXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGxpc3RfYXBwcyAgICAgICAobGEpXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGxpc3RfY2xpZW50cyAgICAobGMpXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGxpc3RfYWxsICAgICAgICAobHMpXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgIHByaW50X2xvZ3MgICAgICAocGwpXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgICBkZWJ1ZzpuICAgc2hvd21lbnVzOm4gICBub2V4aXQ6blxuIik7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLCAidW5yZWNvZ25pemVkICVzXG4iLCBxKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChjaGVja19jbGllbnRzKSB7Ci0JCQlpbnQgaWR4ID0gZmluZF9jbGllbnQocSk7Ci0JCQlpZiAoaWR4ID49IDApIHsKLQkJCQlzZWVuW2lkeF0gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQluZXdjdGxbbm5ldysrXSA9IHN0cmR1cChxKTsKLQkJCX0KLQkJfQotCX0KLQlmY2xvc2UoZik7Ci0KLQlpZiAoY2hlY2tfY2xpZW50cykgewotCQlmb3IgKGk9MDsgaSA8IENNQVg7IGkrKykgewotCQkJaWYgKGNsaWVudHNbaV0gPT0gTlVMTCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFzZWVuW2ldKSB7Ci0JCQkJY2xpZW50KGNsaWVudHNbaV0sIDApOwotCQkJCWZyZWUoY2xpZW50c1tpXSk7Ci0JCQkJY2xpZW50c1tpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpPTA7IGkgPCBubmV3OyBpKyspIHsKLQkJCWludCBmcmVlID0gZmluZF9jbGllbnQoTlVMTCk7Ci0JCQlpZiAoZnJlZSA8IDApIHsKLQkJCQlzdGF0aWMgaW50IGNudCA9IDA7Ci0JCQkJaWYgKGNudCsrIDwgMTApIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJyYW4gb3V0IG9mIGNsaWVudCBzbG90cy5cbiIpOwotCQkJCQlmZigpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGllbnRzW2ZyZWVdID0gbmV3Y3RsW2ldOwotCQkJY2xpZW50KG5ld2N0bFtpXSwgMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfY29udHJvbCh2b2lkKSB7Ci0Jc3RhdGljIGludCBsYXN0X3NpemUgPSAtMTsKLQlzdGF0aWMgdGltZV90IGxhc3RfbXRpbWUgPSAwOwotCXN0cnVjdCBzdGF0IHNiOwotCWNoYXIgKmNvbnRyb2xfY21kOwotCi0JaWYgKCFjb250cm9sKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICghc3RyY21wKGNvbnRyb2wsICJpbnRlcm5hbCIpKSB7Ci0JCXJldHVybiAxOwotCX0KLQkJCi0JY29udHJvbF9jbWQgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oY29udHJvbCkgKyBzdHJsZW4oIi5jbWQiKSArIDEpOwotCXNwcmludGYoY29udHJvbF9jbWQsICIlcy5jbWQiLCBjb250cm9sKTsKLQlpZiAoc3RhdChjb250cm9sX2NtZCwgJnNiKSA9PSAwKSB7Ci0JCUZJTEUgKmY7Ci0JCWlmIChzYi5zdF9zaXplID4gMCkgewotCQkJcHJvY2Vzc19jb250cm9sKGNvbnRyb2xfY21kLCAwKTsKLQkJfQotCQlmID0gZm9wZW4oY29udHJvbF9jbWQsICJ3Iik7Ci0JCWlmIChmKSB7Ci0JCQlmY2xvc2UoZik7Ci0JCX0KLQl9Ci0JZnJlZShjb250cm9sX2NtZCk7Ci0KLQlpZiAoc3RhdChjb250cm9sLCAmc2IpICE9IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChsYXN0X3NpemUgPT0gKGludCkgc2Iuc3Rfc2l6ZSAmJiBsYXN0X210aW1lID09IHNiLnN0X210aW1lKSB7Ci0JCXJldHVybiAxOwotCX0KLQlsYXN0X3NpemUgPSAoaW50KSBzYi5zdF9zaXplOwotCWxhc3RfbXRpbWUgPSBzYi5zdF9tdGltZTsKLQotCXJldHVybiBwcm9jZXNzX2NvbnRyb2woY29udHJvbCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZSh2b2lkKSB7Ci0JaW50IGksIGFwcF9vayA9IDA7Ci0JaWYgKGxhc3RfZXZlbnRfdHlwZSAhPSBQcm9wZXJ0eU5vdGlmeSkgewotCQlpZiAoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiXG51cGRhdGUgLi4uXG4iKTsKLQl9IGVsc2UgaWYgKGFwcHNoYXJlX2RlYnVnID4gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgInVwZGF0ZSAuLi4gcHJvcGVydHlub3RpZnlcbiIpOwotCX0KLQlpZiAoIWNoZWNrX2NvbnRyb2woKSkgewotCQlyZXR1cm47Ci0JfQotCWZvciAoaT0wOyBpIDwgV01BWDsgaSsrKSB7Ci0JCVdpbmRvdyB3aW4gPSB3YXRjaFtpXTsKLQkJaWYgKHdpbiA9PSBOb25lKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXdpbl9hdHRyKHdpbikpIHsKLQkJCWRlc3Ryb3lfd2luKHdpbik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoZmluZF9hcHAod2luKSA+PSAwKSB7Ci0JCQlhcHBfb2srKzsKLQkJfQotCQlpZiAoc3RhdGVbaV0gPT0gMCkgewotCQkJaWYgKGF0dHIubWFwX3N0YXRlID09IElzVmlld2FibGUpIHsKLQkJCQlpZiAoc2tpcF9tZW51cykgewotCQkJCQlXaW5kb3cgaW5zaWRlID0gY2hlY2tfaW5zaWRlKHdpbik7Ci0JCQkJCWlmIChpbnNpZGUgIT0gTm9uZSkgewotCQkJCQkJaWYgKGFwcHNoYXJlX2RlYnVnKSB7ZnByaW50ZihzdGRlcnIsICJza2lwX21lbnVzOiB3aW5kb3cgMHglbHggaXMgaW5zaWRlIG9mIDB4JWx4LCBub3QgdHJhY2tpbmcgaXQuXG4iLCB3aW4sIGluc2lkZSk7IGZmKCk7fQotCQkJCQkJZGVsZXRlX3dpbih3aW4pOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbGF1bmNoKHdpbik7Ci0JCQkJc3RhdGVbaV0gPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlW2ldID09IDEpIHsKLQkJCWlmIChhdHRyLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQkJc3RvcCh3aW4pOwotCQkJCXN0YXRlW2ldID0gMDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoZXhpdF9ub19hcHBfd2luICYmICFhcHBfb2spIHsKLQkJZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJCWlmIChhcHBzW2ldICE9IE5vbmUpIHsKLQkJCQlmcHJpbnRmKHN0ZG91dCwgIm1haW4gYXBwbGljYXRpb24gd2luZG93IGlzIGdvbmU6IDB4JWx4XG4iLCBhcHBzW2ldKTsKLQkJCX0KLQkJfQotCQlmZigpOwotCQlhcHBzaGFyZV9jbGVhbnVwKDApOwotCX0KLQlpZiAobGFzdF9ldmVudF90eXBlICE9IFByb3BlcnR5Tm90aWZ5KSB7Ci0JCWlmIChhcHBzaGFyZV9kZWJ1Zykge2ZwcmludGYoc3RkZXJyLCAidXBkYXRlIGRvbmUuXG4iKTsgZmYoKTt9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBleGl0ZXIoY2hhciAqbXNnLCBpbnQgcmMpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbXNnKTsKLQlmZigpOwotCWtpbGxfaGVscGVyX3BpZCgpOwotCWV4aXQocmMpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfdHJhY2tkaXIodm9pZCkgewotCWNoYXIgdG1wWzI1Nl07Ci0Jc3RydWN0IHN0YXQgc2I7Ci0JaWYgKCFzdHJjbXAodHJhY2tkaXIsICJub25lIikpIHsKLQkJdHJhY2tkaXIgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCWlmICghc3RyY21wKHRyYWNrZGlyLCAidW5zZXQiKSkgewotCQlpbnQgZmQ7Ci0JCXNwcmludGYodG1wLCAiJXMuWFhYWFhYIiwgdHJhY2twcmUpOwotCQlmZCA9IG1rc3RlbXAodG1wKTsKLQkJaWYgKGZkIDwgMCkgewotCQkJc3RyY2F0KHRtcCwgIjogZmFpbGVkIHRvIGNyZWF0ZSBmaWxlLlxuIik7Ci0JCQlleGl0ZXIodG1wLCAxKTsKLQkJfQotCQkvKiBYWFggcmFjZSAqLwotCQljbG9zZShmZCk7Ci0JCXVubGluayh0bXApOwotCQlpZiAobWtkaXIodG1wLCAwNzAwKSAhPSAwKSB7Ci0JCQlzdHJjYXQodG1wLCAiOiBmYWlsZWQgdG8gY3JlYXRlIGRpci5cbiIpOwotCQkJZXhpdGVyKHRtcCwgMSk7Ci0JCX0KLQkJdHJhY2tkaXIgPSBzdHJkdXAodG1wKTsKLQl9Ci0JaWYgKHN0YXQodHJhY2tkaXIsICZzYikgIT0gMCkgewotCQlpZiAobWtkaXIodHJhY2tkaXIsIDA3MDApICE9IDApIHsKLQkJCWV4aXRlcigiY291bGQgbm90IG1ha2UgdHJhY2tkaXIuXG4iLCAxKTsKLQkJfQotCX0gZWxzZSBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0JCWV4aXRlcigidHJhY2tkaXIgbm90IGEgZGlyZWN0b3J5LlxuIiwgMSk7Ci0JfQotCXRyYWNrdG1wID0gKGNoYXIgKikgY2FsbG9jKDEwMDAgKyBzdHJsZW4odHJhY2tkaXIpLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19zdHJpbmcoY2hhciAqc3RyKSB7Ci0JRklMRSAqZjsKLQljaGFyICpmaWxlOwotCWlmICh0cmFja2RpcikgewotCQlzcHJpbnRmKHRyYWNrdG1wLCAiJXMvMHhwcm9wLmNtZCIsIHRyYWNrZGlyKTsKLQkJZmlsZSA9IHN0cmR1cCh0cmFja3RtcCk7Ci0JfSBlbHNlIHsKLQkJY2hhciB0bXBbXSA9ICIvdG1wL3gxMXZuYy1hcHBzaGFyZS5jbWQuWFhYWFhYIjsKLQkJaW50IGZkID0gbWtzdGVtcCh0bXApOwotCQlpZiAoZmQgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmlsZSA9IHN0cmR1cCh0bXApOwotCQljbG9zZShmZCk7Ci0JfQotCWYgPSBmb3BlbihmaWxlLCAidyIpOwotCWlmIChmKSB7Ci0JCWZwcmludGYoZiwgIiVzIiwgc3RyKTsKLQkJZmNsb3NlKGYpOwotCQlwcm9jZXNzX2NvbnRyb2woZmlsZSwgMCk7Ci0JfQotCXVubGluayhmaWxlKTsKLQlmcmVlKGZpbGUpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2hlbGwodm9pZCkgewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCXN0YXRpYyBjaGFyIGxhc3RsaW5lWzEwMDBdOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWZkX3NldCByZmRzOwotCWludCBmZDAgPSBmaWxlbm8oc3RkaW4pOwotCi0JaWYgKGZpcnN0KSB7Ci0JCW1lbXNldChsYXN0bGluZSwgMCwgc2l6ZW9mKGxhc3RsaW5lKSk7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlGRF9aRVJPKCZyZmRzKTsKLQlGRF9TRVQoZmQwLCAmcmZkcyk7Ci0JdHYudHZfc2VjID0gMDsgCi0JdHYudHZfdXNlYyA9IDA7IAotCXNlbGVjdChmZDArMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0JaWYgKEZEX0lTU0VUKGZkMCwgJnJmZHMpKSB7Ci0JCWNoYXIgbGluZVsxMDAwXSwgbGluZTJbMTAxMF07Ci0JCWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7Ci0JCQljaGFyICpzdHIgPSBsYmxhbmtzKGxpbmUpOwotCQkJY2hhciAqcSA9IHN0cnJjaHIoc3RyLCAnXG4nKTsKLQkJCWlmIChxKSAqcSA9ICdcMCc7Ci0JCQlpZiAoc3RyY21wKHN0ciwgIiIpKSB7Ci0JCQkJaWYgKCFzdHJjbXAoc3RyLCAiISEiKSkgewotCQkJCQlzcHJpbnRmKGxpbmUsICIlcyIsIGxhc3RsaW5lKTsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbGluZSk7Ci0JCQkJCXN0ciA9IGxpbmU7Ci0JCQkJfQotCQkJCWlmIChzdHJzdHIoc3RyLCAiISIpID09IHN0cikgewotCQkJCQlzeXN0ZW0oc3RyKzEpOwotCQkJCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJ4MTF2bmMiKSB8fCAhc3RyY21wKHN0ciwgInBzIikpIHsKLQkJCQkJY2hhciAqY21kID0gInBzIC1lbGYgfCBlZ3JlcCAnUElEfHgxMXZuYycgfCBncmVwIC12IGVncmVwIjsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgY21kKTsKLQkJCQkJc3lzdGVtKGNtZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3ByaW50ZihsaW5lMiwgImNtZD0lcyIsIHN0cik7Ci0JCQkJCXByb2Nlc3Nfc3RyaW5nKGxpbmUyKTsKLQkJCQl9Ci0JCQkJc3ByaW50ZihsYXN0bGluZSwgIiVzIiwgc3RyKTsKLQkJCX0KLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIlxuJXMiLCBwcm9tcHQpOyBmZigpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX3Byb3BfY21kKHZvaWQpIHsKLQljaGFyICp2YWx1ZSwgKnN0ciwgKmRvbmUgPSAiRE9ORSI7Ci0KLQlpZiAoY21kX2F0b20gPT0gTm9uZSkgewotCQlyZXR1cm47Ci0JfQotCi0JdmFsdWUgPSBnZXRfeHByb3AoY21kX2F0b21fc3RyLCByb290KTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCi0Jc3RyID0gbGJsYW5rcyh2YWx1ZSk7Ci0JaWYgKCFzdHJjbXAoc3RyLCBkb25lKSkgewotCQlmcmVlKHZhbHVlKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc3Ryc3RyKHN0ciwgImNtZD1xdWl0IikgPT0gc3RyIHx8IHN0cnN0cihzdHIsICJcbmNtZD1xdWl0IikpIHsKLQkJc2V0X3hwcm9wKGNtZF9hdG9tX3N0ciwgcm9vdCwgZG9uZSk7Ci0JCWFwcHNoYXJlX2NsZWFudXAoMCk7Ci0JfQotCi0JcHJvY2Vzc19zdHJpbmcoc3RyKTsKLQotCWZyZWUodmFsdWUpOwotCXNldF94cHJvcChjbWRfYXRvbV9zdHIsIHJvb3QsIGRvbmUpOwotfQotCi0jZGVmaW5lIFBSRUZJWCBpZihhcHBzaGFyZV9kZWJ1ZykgZnByaW50ZihzdGRlcnIsICIgICU4LjJmICAweCUwOGx4IDogIiwgZG5vdygpIC0gc3RhcnQsIGV2Lnhhbnkud2luZG93KTsKLQotc3RhdGljIHZvaWQgbW9uaXRvcih2b2lkKSB7Ci0jaWYgIU5PX1gxMQotCVhFdmVudCBldjsKLQlkb3VibGUgc3RhcnQgPSBkbm93KCk7Ci0JaW50IGdvdF9wcm9wX2NtZCA9IDA7Ci0KLQlpZiAoc2hlbGwpIHsKLQkJdXBkYXRlKCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiXG5cbiIpOwotCQlwcm9jZXNzX3N0cmluZygiY21kPWhlbHAiKTsKLQkJZnByaW50ZihzdGRlcnIsICJcbiVzIiwgcHJvbXB0KTsgZmYoKTsKLQl9Ci0KLQl3aGlsZSAoMSkgewotCQlpbnQgdDsKLQotCQlpZiAoWEV2ZW50c1F1ZXVlZChkcHksIFF1ZXVlZEFscmVhZHkpID09IDApIHsKLQkJCXVwZGF0ZSgpOwotCQkJaWYgKGdvdF9wcm9wX2NtZCkgewotCQkJCWhhbmRsZV9wcm9wX2NtZCgpOwotCQkJfQotCQkJZ290X3Byb3BfY21kID0gMDsKLQkJCWlmIChzaGVsbCkgewotCQkJCWhhbmRsZV9zaGVsbCgpOwotCQkJfQotCQl9Ci0KLQkJWE5leHRFdmVudChkcHksICZldik7Ci0KLQkJbGFzdF9ldmVudF90eXBlID0gZXYudHlwZTsKLQotCQlzd2l0Y2ggKGV2LnR5cGUpIHsKLQkJY2FzZSBFeHBvc2U6Ci0JCQlQUkVGSVgKLQkJCWlmKGFwcHNoYXJlX2RlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkV4cG9zZSAlMDRkeCUwNGQrJTA0ZCslMDRkXG4iLCBldi54ZXhwb3NlLndpZHRoLCBldi54ZXhwb3NlLmhlaWdodCwgZXYueGV4cG9zZS54LCBldi54ZXhwb3NlLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ29uZmlndXJlTm90aWZ5OgotI2lmIDAKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJlTm90aWZ5ICUwNGR4JTA0ZCslMDRkKyUwNGQgIGFib3ZlOiAweCVseFxuIiwgZXYueGNvbmZpZ3VyZS53aWR0aCwgZXYueGNvbmZpZ3VyZS5oZWlnaHQsIGV2Lnhjb25maWd1cmUueCwgZXYueGNvbmZpZ3VyZS55LCBldi54Y29uZmlndXJlLmFib3ZlKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgVmlzaWJpbGl0eU5vdGlmeToKLQkJCVBSRUZJWAotCQkJaWYgKGFwcHNoYXJlX2RlYnVnKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlZpc2liaWxpdHlOb3RpZnk6ICIpOwotCQkJdCA9IGV2Lnh2aXNpYmlsaXR5LnN0YXRlOwotCQkJaWYgKHQgPT0gVmlzaWJpbGl0eUZ1bGx5T2JzY3VyZWQpICAgICBmcHJpbnRmKHN0ZGVyciwgIlZpc2liaWxpdHlGdWxseU9ic2N1cmVkXG4iKTsKLQkJCWlmICh0ID09IFZpc2liaWxpdHlQYXJ0aWFsbHlPYnNjdXJlZCkgZnByaW50ZihzdGRlcnIsICJWaXNpYmlsaXR5UGFydGlhbGx5T2JzY3VyZWRcbiIpOwotCQkJaWYgKHQgPT0gVmlzaWJpbGl0eVVub2JzY3VyZWQpICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlZpc2liaWxpdHlVbm9ic2N1cmVkXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE1hcE5vdGlmeToKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiTWFwTm90aWZ5ICAgICAgd2luOiAweCVseFxuIiwgZXYueG1hcC53aW5kb3cpOwotCQkJaWYgKG91cnMoZXYueG1hcC53aW5kb3cpKSB7Ci0JCQkJbWFwcGVkKGV2LnhtYXAud2luZG93KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFVubWFwTm90aWZ5OgotCQkJUFJFRklYCi0JCQlpZihhcHBzaGFyZV9kZWJ1ZykgZnByaW50ZihzdGRlcnIsICJVbm1hcE5vdGlmeSAgICB3aW46IDB4JWx4XG4iLCBldi54bWFwLndpbmRvdyk7Ci0JCQlpZiAob3Vycyhldi54bWFwLndpbmRvdykpIHsKLQkJCQl1bm1hcHBlZChldi54bWFwLndpbmRvdyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBNYXBSZXF1ZXN0OgotCQkJUFJFRklYCi0JCQlpZihhcHBzaGFyZV9kZWJ1ZykgZnByaW50ZihzdGRlcnIsICJNYXBSZXF1ZXN0XG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENyZWF0ZU5vdGlmeToKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlTm90aWZ5IHBhcmVudDogMHglbHggIHdpbjogMHglbHhcbiIsIGV2LnhjcmVhdGV3aW5kb3cucGFyZW50LCBldi54Y3JlYXRld2luZG93LndpbmRvdyk7Ci0JCQlpZiAoZXYueGNyZWF0ZXdpbmRvdy5wYXJlbnQgPT0gcm9vdCAmJiBvdXJzKGV2LnhjcmVhdGV3aW5kb3cud2luZG93KSkgewotCQkJCWlmIChmaW5kX3dpbihldi54Y3JlYXRld2luZG93LndpbmRvdykgPj0gMCkgewotCQkJCQlkZXN0cm95X3dpbihldi54Y3JlYXRld2luZG93LndpbmRvdyk7Ci0JCQkJfQotCQkJCWFkZF93aW4oZXYueGNyZWF0ZXdpbmRvdy53aW5kb3cpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRGVzdHJveU5vdGlmeToKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiRGVzdHJveU5vdGlmeSAgd2luOiAweCVseFxuIiwgZXYueGRlc3Ryb3l3aW5kb3cud2luZG93KTsKLQkJCWlmIChvdXJzKGV2LnhkZXN0cm95d2luZG93LndpbmRvdykpIHsKLQkJCQlkZXN0cm95X3dpbihldi54ZGVzdHJveXdpbmRvdy53aW5kb3cpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ29uZmlndXJlUmVxdWVzdDoKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJlUmVxdWVzdFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBDaXJjdWxhdGVSZXF1ZXN0OgotI2lmIDAKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiQ2lyY3VsYXRlUmVxdWVzdCBwYXJlbnQ6IDB4JWx4ICB3aW46IDB4JWx4XG4iLCBldi54Y2lyY3VsYXRlcmVxdWVzdC5wYXJlbnQsIGV2LnhjaXJjdWxhdGVyZXF1ZXN0LndpbmRvdyk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIENpcmN1bGF0ZU5vdGlmeToKLSNpZiAwCi0JCQlQUkVGSVgKLQkJCWlmKGFwcHNoYXJlX2RlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkNpcmN1bGF0ZU5vdGlmeVxuIik7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIFByb3BlcnR5Tm90aWZ5OgotI2lmIDAKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiUHJvcGVydHlOb3RpZnlcbiIpOwotI2VuZGlmCi0JCQlpZiAoY21kX2F0b20gIT0gTm9uZSAmJiBldi54cHJvcGVydHkuYXRvbSA9PSBjbWRfYXRvbSkgewotCQkJCWdvdF9wcm9wX2NtZCsrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUmVwYXJlbnROb3RpZnk6Ci0JCQlQUkVGSVgKLQkJCWlmKGFwcHNoYXJlX2RlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIlJlcGFyZW50Tm90aWZ5IHBhcmVudDogMHglbHggIHdpbjogMHglbHhcbiIsIGV2LnhyZXBhcmVudC5wYXJlbnQsIGV2LnhyZXBhcmVudC53aW5kb3cpOwotCQkJaWYgKG91cnMoZXYueHJlcGFyZW50LndpbmRvdykpIHsKLQkJCQlpZiAob3Vycyhldi54cmVwYXJlbnQucGFyZW50KSkgewotCQkJCQlkZXN0cm95X3dpbihldi54cmVwYXJlbnQud2luZG93KTsKLQkJCQl9IGVsc2UgaWYgKGV2LnhyZXBhcmVudC5wYXJlbnQgPT0gcm9vdCkgewotCQkJCQkvKiA/Pz8gKi8KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVBSRUZJWAotCQkJaWYoYXBwc2hhcmVfZGVidWcpIGZwcmludGYoc3RkZXJyLCAiVW5rbm93bjogJWRcbiIsIGV2LnR5cGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotaW50IGFwcHNoYXJlX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotCWludCBpOwotCWNoYXIgKmFwcF9zdHIgPSBOVUxMOwotCWNoYXIgKmRweV9zdHIgPSBOVUxMOwotCWxvbmcgeHNlbGVjdGlucHV0ID0gMDsKLSNpZiBOT19YMTEKLQlleGl0ZXIoIm5vdCBjb21waWxlZCB3aXRoIFgxMVxuIiwgMSk7Ci0jZWxzZQotCWZvciAoaT0wOyBpIDwgV01BWDsgaSsrKSB7Ci0JCXdhdGNoW2ldID0gTm9uZTsKLQkJc3RhdGVbaV0gPSAwOwotCX0KLQlmb3IgKGk9MDsgaSA8IEFNQVg7IGkrKykgewotCQlhcHBzW2ldICA9IE5vbmU7Ci0JfQotCWZvciAoaT0wOyBpIDwgQ01BWDsgaSsrKSB7Ci0JCWNsaWVudHNbaV0gPSBOVUxMOwotCX0KLQotCXgxMXZuYyA9IHN0cmR1cChhcmd2WzBdKTsKLQotCWZvciAoaT0xOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWludCBlbmQgPSAoaSA9PSBhcmdjLTEpID8gMSA6IDA7Ci0JCWNoYXIgKnMgPSBhcmd2W2ldOwotCQlpZiAoc3Ryc3RyKHMsICItLSIpID09IHMpIHsKLQkJCXMrKzsKLQkJfQotCi0JCWlmICghc3RyY21wKHMsICItaCIpIHx8ICFzdHJjbXAocywgIi1oZWxwIikpIHsKLQkJCWZwcmludGYoc3Rkb3V0LCAiJXMiLCB1c2FnZSk7Ci0JCQlleGl0KDApOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocywgIi1pZCIpKSB7Ci0JCQlpZF9vcHQgPSAiLWlkIjsKLQkJCWlmIChlbmQpIGV4aXRlcigibm8gLWlkIHZhbHVlIHN1cHBsaWVkXG4iLCAxKTsKLQkJCWFwcF9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItc2lkIikpIHsKLQkJCWlkX29wdCA9ICItc2lkIjsKLQkJCWlmIChlbmQpIGV4aXRlcigibm8gLXNpZCB2YWx1ZSBzdXBwbGllZFxuIiwgMSk7Ci0JCQlhcHBfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChzLCAiLWNvbm5lY3QiKSB8fCAhc3RyY21wKHMsICItY29ubmVjdF9vcl9leGl0IikgfHwgIXN0cmNtcChzLCAiLWNvZSIpKSB7Ci0JCQlpZiAoZW5kKSBleGl0ZXIoIm5vIC1jb25uZWN0IHZhbHVlIHN1cHBsaWVkXG4iLCAxKTsKLQkJCWNvbm5lY3RfdG8gPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItY29udHJvbCIpKSB7Ci0JCQlpZiAoZW5kKSBleGl0ZXIoIm5vIC1jb250cm9sIHZhbHVlIHN1cHBsaWVkXG4iLCAxKTsKLQkJCWNvbnRyb2wgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWlmICghc3RyY21wKGNvbnRyb2wsICJzaGVsbCIpKSB7Ci0JCQkJZnJlZShjb250cm9sKTsKLQkJCQljb250cm9sID0gc3RyZHVwKCJpbnRlcm5hbCIpOwotCQkJCXNoZWxsID0gMTsKLQkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItdHJhY2tkaXIiKSkgewotCQkJaWYgKGVuZCkgZXhpdGVyKCJubyAtdHJhY2tkaXIgdmFsdWUgc3VwcGxpZWRcbiIsIDEpOwotCQkJdHJhY2tkaXIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItZGlzcGxheSIpKSB7Ci0JCQlpZiAoZW5kKSBleGl0ZXIoIm5vIC1kaXNwbGF5IHZhbHVlIHN1cHBsaWVkXG4iLCAxKTsKLQkJCWRweV9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCXNldF9lbnYoIkRJU1BMQVkiLCBkcHlfc3RyKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItZGVsYXkiKSkgewotCQkJaWYgKGVuZCkgZXhpdGVyKCJubyAtZGVsYXkgdmFsdWUgc3VwcGxpZWRcbiIsIDEpOwotCQkJaGVscGVyX2RlbGF5ID0gYXRvZihhcmd2WysraV0pOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocywgIi1hcmdzIikpIHsKLQkJCWlmIChlbmQpIGV4aXRlcigibm8gLWFyZ3MgdmFsdWUgc3VwcGxpZWRcbiIsIDEpOwotCQkJeDExdm5jX2FyZ3MgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItZW52IikpIHsKLQkJCWlmIChlbmQpIGV4aXRlcigibm8gLWVudiB2YWx1ZSBzdXBwbGllZFxuIiwgMSk7Ci0JCQlwdXRlbnYoYXJndlsrK2ldKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItZGVidWciKSkgewotCQkJYXBwc2hhcmVfZGVidWcrKzsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItc2hvd21lbnVzIikpIHsKLQkJCXNraXBfbWVudXMgPSAwOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocywgIi1ub2V4aXQiKSkgewotCQkJZXhpdF9ub19hcHBfd2luID0gMDsKLQkJfSBlbHNlIGlmICghc3RyY21wKHMsICItc2hlbGwiKSkgewotCQkJc2hlbGwgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocywgIi1ub2NtZHMiKSB8fCAhc3RyY21wKHMsICItc2FmZXIiKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJpZ25vcmluZyAlcyBpbiAtYXBwc2hhcmUgbW9kZS5cbiIsIHMpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocywgIi1hcHBzaGFyZSIpKSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInVucmVjb2duaXplZCAneDExdm5jIC1hcHBzaGFyZScgb3B0aW9uOiAlc1xuIiwgcyk7Ci0JCQlleGl0ZXIoIiIsIDEpOwotCQl9Ci0JfQotCi0JaWYgKGdldGVudigiWDExVk5DX0FQUFNIQVJFX0RFQlVHIikpIHsKLQkJYXBwc2hhcmVfZGVidWcgPSBhdG9pKGdldGVudigiWDExVk5DX0FQUFNIQVJFX0RFQlVHIikpOwotCX0KLQotCS8qIGxldCB1c2VyIG92ZXJyaWRlIG5hbWUgZm9yIG11bHRpcGxlIGluc3RhbmNlczogKi8KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQ09NTUFORF9QUk9QTkFNRSIpKSB7Ci0JCWNtZF9hdG9tX3N0ciA9IHN0cmR1cChnZXRlbnYoIlgxMVZOQ19BUFBTSEFSRV9DT01NQU5EX1BST1BOQU1FIikpOwotCX0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfVElDS0VSX1BST1BOQU1FIikpIHsKLQkJdGlja2VyX2F0b21fc3RyID0gc3RyZHVwKGdldGVudigiWDExVk5DX0FQUFNIQVJFX1RJQ0tFUl9QUk9QTkFNRSIpKTsKLQl9Ci0KLQlpZiAoc2hlbGwpIHsKLQkJaWYgKCFjb250cm9sIHx8IHN0cmNtcChjb250cm9sLCAiaW50ZXJuYWwiKSkgewotCQkJZXhpdGVyKCJtb2RlIC1zaGVsbCByZXF1aXJlcyAnLWNvbnRyb2wgaW50ZXJuYWwnXG4iLCAxKTsKLQkJfQotCX0KLQotCWlmIChjb25uZWN0X3RvID09IE5VTEwgJiYgY29udHJvbCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQlpZiAoc3RhdChjb250cm9sLCAmc2IpID09IDApIHsKLQkJCWludCBsZW4gPSAxMDAgKyBzYi5zdF9zaXplOwotCQkJRklMRSAqZiA9IGZvcGVuKGNvbnRyb2wsICJyIik7Ci0KLQkJCWlmIChmKSB7Ci0JCQkJY2hhciAqbGluZSA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCQkJCWNvbm5lY3RfdG8gPSAoY2hhciAqKSBjYWxsb2MoMiAqIGxlbiwgMSk7Ci0JCQkJd2hpbGUgKGZnZXRzKGxpbmUsIGxlbiwgZikgIT0gTlVMTCkgewotCQkJCQljaGFyICpxID0gc3RyY2hyKGxpbmUsICdcbicpOwotCQkJCQlpZiAocSkgKnEgPSAnXDAnOwotCQkJCQlxID0gbGJsYW5rcyhsaW5lKTsKLQkJCQkJaWYgKHFbMF0gPT0gJyMnKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoY29ubmVjdF90b1swXSAhPSAnXDAnKSB7Ci0JCQkJCQlzdHJjYXQoY29ubmVjdF90bywgIiwiKTsKLQkJCQkJfQotCQkJCQlzdHJjYXQoY29ubmVjdF90bywgcSk7Ci0JCQkJfQotCQkJCWZjbG9zZShmKTsKLQkJCX0KLQkJCWZwcmludGYoc3RkZXJyLCAic2V0IC1jb25uZWN0IHRvOiAlc1xuIiwgY29ubmVjdF90byk7Ci0JCX0KLQl9Ci0JaWYgKDAgJiYgY29ubmVjdF90byA9PSBOVUxMICYmIGNvbnRyb2wgPT0gTlVMTCkgewotCQlleGl0ZXIoIm5vIC1jb25uZWN0IGhvc3Qgb3IgLWNvbnRyb2wgZmlsZSBzcGVjaWZpZWQuXG4iLCAxKTsKLQl9Ci0KLQlpZiAoY29udHJvbCkgewotCQlwaWRfdCBwaWQ7Ci0JCXBhcmVudF9waWQgPSBnZXRwaWQoKTsKLQkJcGlkID0gZm9yaygpOwotCQlpZiAocGlkID09IChwaWRfdCkgLTEpIHsKLQkJCTsKLQkJfSBlbHNlIGlmIChwaWQgPT0gMCkgewotCQkJYmVfaGVscGVyX3BpZChkcHlfc3RyKTsKLQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQloZWxwZXJfcGlkID0gcGlkOwotCQl9Ci0JfQotCi0JZHB5ID0gWE9wZW5EaXNwbGF5KGRweV9zdHIpOwotCWlmICghZHB5KSB7Ci0JCWV4aXRlcigiY2Fubm90IG9wZW4gZGlzcGxheVxuIiwgMSk7Ci0JfQotCi0Jcm9vdCA9IERlZmF1bHRSb290V2luZG93KGRweSk7Ci0KLQl4c2VsZWN0aW5wdXQgPSBTdWJzdHJ1Y3R1cmVOb3RpZnlNYXNrOwotCWlmIChoZWxwZXJfcGlkID4gMCkgewotCQl0aWNrZXJfYXRvbSA9IFhJbnRlcm5BdG9tKGRweSwgdGlja2VyX2F0b21fc3RyLCBGYWxzZSk7Ci0JCXhzZWxlY3RpbnB1dCB8PSBQcm9wZXJ0eUNoYW5nZU1hc2s7Ci0JfQotCVhTZWxlY3RJbnB1dChkcHksIHJvb3QsIHhzZWxlY3RpbnB1dCk7Ci0KLQljbWRfYXRvbSA9IFhJbnRlcm5BdG9tKGRweSwgY21kX2F0b21fc3RyLCBGYWxzZSk7Ci0KLQlpbml0X2NtYXNrKCk7Ci0KLQlzcHJpbnRmKHVuaXF1ZV90YWcsICJYMTFWTkNfQVBQU0hBUkVfVEFHPSVkLXRhZyIsIGdldHBpZCgpKTsKLQotCXN0YXJ0X3RpbWUgPSBkbm93KCk7Ci0KLQlpZiAoYXBwX3N0ciA9PSBOVUxMKSB7Ci0JCWV4aXRlcigibm8gLWlkLy1zaWQgd2luZG93IHNwZWNpZmllZC5cbiIsIDEpOwotCX0gZWxzZSB7Ci0JCWNoYXIgKnAsICpzdHIgPSBzdHJkdXAoYXBwX3N0cik7Ci0JCWNoYXIgKmFsaXN0W0FNQVhdOwotCQlpbnQgaSwgbiA9IDA7Ci0KLQkJcCA9IHN0cnRvayhzdHIsICIsIik7Ci0JCXdoaWxlIChwKSB7Ci0JCQlpZiAobiA+PSBBTUFYKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJyYW4gb3V0IG9mIGFwcCBzbG90czogJXNcbiIsIGFwcF9zdHIpOwotCQkJCWV4aXRlcigiIiwgMSk7Ci0JCQl9Ci0JCQlhbGlzdFtuKytdID0gc3RyZHVwKHApOwotCQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQl9Ci0JCWZyZWUoc3RyKTsKLQotCQlmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCQkJV2luZG93IGFwcCA9IE5vbmU7Ci0JCQlwID0gYWxpc3RbaV07Ci0JCQlhcHAgPSBwYXJzZV93aW4ocCk7Ci0JCQlmcmVlKHApOwotCi0JCQlpZiAoYXBwICE9IE5vbmUpIHsKLQkJCQlpZiAoIW91cnMoYXBwKSkgewotCQkJCQlhZGRfYXBwKGFwcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc2V0X3RyYWNrZGlyKCk7Ci0KLQlzaWduYWwoU0lHSU5ULCAgYXBwc2hhcmVfY2xlYW51cCk7Ci0Jc2lnbmFsKFNJR1RFUk0sIGFwcHNoYXJlX2NsZWFudXApOwotCi0JcmZiTG9nRW5hYmxlKDApOwotCi0JaWYgKGNvbm5lY3RfdG8pIHsKLQkJY2hhciAqcCwgKnN0ciA9IHN0cmR1cChjb25uZWN0X3RvKTsKLQkJaW50IG4gPSAwOwotCQlwID0gc3RydG9rKHN0ciwgIiwiKTsKLQkJd2hpbGUgKHApIHsKLQkJCWNsaWVudHNbbisrXSA9IHN0cmR1cChwKTsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJfQotCQlmcmVlKHN0cik7Ci0JfSBlbHNlIHsKLQkJY29ubmVjdF90byA9IHN0cmR1cCgiIik7Ci0JfQotCi0JZm9yIChpPTA7IGkgPCBBTUFYOyBpKyspIHsKLQkJaWYgKGFwcHNbaV0gPT0gTm9uZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJZnByaW50ZihzdGRvdXQsICJVc2luZyBhcHAgd2luOiAweCUwOGx4ICByb290OiAweCUwOGx4XG4iLCBhcHBzW2ldLCByb290KTsKLQl9Ci0JZnByaW50ZihzdGRvdXQsICJcbiIpOwotCi0JbW9uaXRvcigpOwotCi0JYXBwc2hhcmVfY2xlYW51cCgwKTsKLQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9hdmFoaS5jIGIveDExdm5jL2F2YWhpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOWEzNGYuLjAwMDAwMDAKLS0tIGEveDExdm5jL2F2YWhpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBhdmFoaS5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLQotdm9pZCBhdmFoaV9pbml0aWFsaXNlKHZvaWQpOwotdm9pZCBhdmFoaV9hZHZlcnRpc2UoY2hhciAqbmFtZSwgY2hhciAqaG9zdCwgdWludDE2X3QgcG9ydCk7Ci12b2lkIGF2YWhpX3Jlc2V0KHZvaWQpOwotdm9pZCBhdmFoaV9jbGVhbnVwKHZvaWQpOwotCi1zdGF0aWMgcGlkX3QgYXZhaGlfcGlkID0gMDsKLQotc3RhdGljIHZvaWQga2lsbF9hdmFoaV9waWQodm9pZCkgewotCWlmIChhdmFoaV9waWQgIT0gMCkgewotCQlyZmJMb2coImtpbGxfYXZhaGlfcGlkOiAlZFxuIiwgKGludCkgYXZhaGlfcGlkKTsKLQkJa2lsbChhdmFoaV9waWQsIFNJR1RFUk0pOwotCQlhdmFoaV9waWQgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCB0cnlfYXZhaGlfaGVscGVyKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIHVpbnQxNl90IHBvcnQpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JY2hhciAqY21kLCAqcCwgKnBhdGggPSBnZXRlbnYoIlBBVEgiKSwgcG9ydHN0clszMl07Ci0JaW50IGk7Ci0KLQlpZiAoIW5hbWUgfHwgIWhvc3QgfHwgIXBvcnQpIHt9Ci0KLQkvKiBhdmFoaS1wdWJsaXNoICovCi0JaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygiemVyb2NvbmYiKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXBhdGgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcGF0aCA9IHN0cmR1cChwYXRoKTsgCi0JY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwYXRoKSArIDEwMCk7Ci0Jc3ByaW50Zihwb3J0c3RyLCAiJWQiLCAoaW50KSBwb3J0KTsKLQotCXAgPSBzdHJ0b2socGF0aCwgIjoiKTsKLQl3aGlsZSAocCkgewotCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0JCXNwcmludGYoY21kLCAiJXMvYXZhaGktcHVibGlzaCIsIHApOwotCQlpZiAoc3RhdChjbWQsICZzYnVmKSA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCQlzcHJpbnRmKGNtZCwgIiVzL2Rucy1zZCIsIHApOwotCQlpZiAoc3RhdChjbWQsICZzYnVmKSA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCQlzcHJpbnRmKGNtZCwgIiVzL21ETlMiLCBwKTsKLQkJaWYgKHN0YXQoY21kLCAmc2J1ZikgPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJY21kWzBdID0gJ1wwJzsKLQotCQlwID0gc3RydG9rKE5VTEwsICI6Iik7Ci0JfQotCWZyZWUocGF0aCk7Ci0KLQlpZiAoIXN0cmNtcChjbWQsICIiKSkgewotCQlmcmVlKGNtZCk7Ci0JCXJmYkxvZygiQ291bGQgbm90IGZpbmQgYW4gZXh0ZXJuYWwgYXZhaGkvemVyb2NvbmYgaGVscGVyIHByb2dyYW0uXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYXZhaGlfcGlkID0gZm9yaygpOwotCi0JaWYgKGF2YWhpX3BpZCA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJmb3JrIik7Ci0JCWF2YWhpX3BpZCA9IDA7Ci0JCWZyZWUoY21kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGF2YWhpX3BpZCAhPSAwKSB7Ci0JCWludCBzdGF0dXM7Ci0KLQkJdXNsZWVwKDUwMCAqIDEwMDApOwotCQl3YWl0cGlkKGF2YWhpX3BpZCwgJnN0YXR1cywgV05PSEFORyk7IAotCQlpZiAoa2lsbChhdmFoaV9waWQsIDApICE9IDApIHsKLQkJCXdhaXRwaWQoYXZhaGlfcGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCQlhdmFoaV9waWQgPSAwOwotCQkJZnJlZShjbWQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygiJXMgaGVscGVyIHBpZCBpczogJWRcbiIsIGNtZCwgKGludCkgYXZhaGlfcGlkKTsKLQkJfQotCQlmcmVlKGNtZCk7Ci0JCXJldHVybiAxOwotCX0KLQotCWZvciAoaT0zOyBpPDI1NjsgaSsrKSB7Ci0JCWNsb3NlKGkpOwotCX0KLQotCWlmIChzdHJzdHIoY21kLCAiL2F2YWhpLXB1Ymxpc2giKSkgewotCQlleGVjbHAoY21kLCBjbWQsICItcyIsIG5hbWUsICJfcmZiLl90Y3AiLCBwb3J0c3RyLCAoY2hhciAqKSBOVUxMKTsKLQl9IGVsc2UgewotCQlleGVjbHAoY21kLCBjbWQsICItUiIsIG5hbWUsICJfcmZiLl90Y3AiLCAiLiIsIHBvcnRzdHIsIChjaGFyICopIE5VTEwpOwotCX0KLQlleGl0KDEpOwotI2Vsc2UKLQlpZiAoIW5hbWUgfHwgIWhvc3QgfHwgIXBvcnQpIHt9Ci0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotI2lmICFkZWZpbmVkKExJQlZOQ1NFUlZFUl9IQVZFX0FWQUhJKSB8fCAhZGVmaW5lZChMSUJWTkNTRVJWRVJfSEFWRV9MSUJQVEhSRUFEKQotdm9pZCBhdmFoaV9pbml0aWFsaXNlKHZvaWQpIHsKLQlyZmJMb2coImF2YWhpX2luaXRpYWxpc2U6IG5vIEF2YWhpIHN1cHBvcnQgYXQgYnVpbGR0aW1lLlxuIik7Ci19Ci0KLXZvaWQgYXZhaGlfYWR2ZXJ0aXNlKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIHVpbnQxNl90IHBvcnQpIHsKLQljaGFyICp0OwotCXQgPSBnZXRlbnYoIlgxMVZOQ19BVkFISV9OQU1FIik7IGlmICh0KSBuYW1lID0gdDsKLQl0ID0gZ2V0ZW52KCJYMTFWTkNfQVZBSElfSE9TVCIpOyBpZiAodCkgaG9zdCA9IHQ7Ci0JdCA9IGdldGVudigiWDExVk5DX0FWQUhJX1BPUlQiKTsgaWYgKHQpIHBvcnQgPSBhdG9pKHQpOwotCi0JaWYgKCF0cnlfYXZhaGlfaGVscGVyKG5hbWUsIGhvc3QsIHBvcnQpKSB7Ci0JCXJmYkxvZygiYXZhaGlfYWR2ZXJ0aXNlOiAgbm8gQXZhaGkgc3VwcG9ydCBhdCBidWlsZHRpbWUuXG4iKTsKLQkJYXZhaGkgPSAwOwotCX0KLX0KLQotdm9pZCBhdmFoaV9yZXNldCh2b2lkKSB7Ci0Ja2lsbF9hdmFoaV9waWQoKTsKLQlyZmJMb2coImF2YWhpX3Jlc2V0OiBubyBBdmFoaSBzdXBwb3J0IGF0IGJ1aWxkdGltZS5cbiIpOwotfQotCi12b2lkIGF2YWhpX2NsZWFudXAodm9pZCkgewotCWtpbGxfYXZhaGlfcGlkKCk7Ci0JcmZiTG9nKCJhdmFoaV9jbGVhbnVwOiBubyBBdmFoaSBzdXBwb3J0IGF0IGJ1aWxkdGltZS5cbiIpOwotfQotI2Vsc2UKLQotI2luY2x1ZGUgPGF2YWhpLWNvbW1vbi90aHJlYWQtd2F0Y2guaD4KLSNpbmNsdWRlIDxhdmFoaS1jb21tb24vYWx0ZXJuYXRpdmUuaD4KLSNpbmNsdWRlIDxhdmFoaS1jbGllbnQvY2xpZW50Lmg+Ci0jaW5jbHVkZSA8YXZhaGktY2xpZW50L3B1Ymxpc2guaD4KLQotI2luY2x1ZGUgPGF2YWhpLWNvbW1vbi9tYWxsb2MuaD4KLSNpbmNsdWRlIDxhdmFoaS1jb21tb24vZXJyb3IuaD4KLQotCi1zdGF0aWMgQXZhaGlUaHJlYWRlZFBvbGwgKl9wb2xsID0gTlVMTDsKLXN0YXRpYyBBdmFoaUNsaWVudCAqX2NsaWVudCA9IE5VTEw7Ci1zdGF0aWMgQXZhaGlFbnRyeUdyb3VwICpfZ3JvdXAgPSBOVUxMOwotCi1zdGF0aWMgaW50IGRiID0gMDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqaG9zdDsKLQl1aW50MTZfdCBwb3J0OwotfSBhdmFoaV9zZXJ2aWNlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICpuYW1lOwotCWNoYXIgKmhvc3Q7Ci0JdWludDE2X3QgcG9ydDsKLX0gYXZhaGlfcmVnX3Q7Ci0KLSNkZWZpbmUgTlJFRyAxNgotc3RhdGljIGF2YWhpX3JlZ190IHJlZ2lzdGVyZWRbTlJFR107Ci0KLXZvaWQgYXZhaGlfaW5pdGlhbGlzZSh2b2lkKSB7Ci0JaW50IHJldDsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQotCWlmIChnZXRlbnYoIkFWQUhJX0RFQlVHIikpIHsKLQkJZGIgPSAxOwotCX0KLQlpZiAoZmlyc3QpIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPE5SRUc7IGkrKykgewotCQkJcmVnaXN0ZXJlZFtpXS5uYW1lID0gTlVMTDsKLQkJCXJlZ2lzdGVyZWRbaV0uaG9zdCA9IE5VTEw7Ci0JCX0KLQkJZmlyc3QgPSAwOwotCX0KLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImluICBhdmFoaV9pbml0aWFsaXNlXG4iKTsKLQlpZiAoX3BvbGwpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfaW5pdGlhbGlzZTogcG9sbCBub3QgbnVsbFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoISAoX3BvbGwgPSBhdmFoaV90aHJlYWRlZF9wb2xsX25ldygpKSApIHsKLQkJcmZiTG9nKCJ3YXJuaW5nOiB1bmFibGUgdG8gb3BlbiBBdmFoaSBwb2xsLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlfY2xpZW50ID0gYXZhaGlfY2xpZW50X25ldyhhdmFoaV90aHJlYWRlZF9wb2xsX2dldChfcG9sbCksCi0JICAgIDAsIE5VTEwsIE5VTEwsICZyZXQpOwotCWlmICghIF9jbGllbnQpIHsKLQkJcmZiTG9nKCJ3YXJuaW5nOiB1bmFibGUgdG8gb3BlbiBBdmFoaSBjbGllbnQ6ICVzXG4iLAotCQkgICAgYXZhaGlfc3RyZXJyb3IocmV0KSk7Ci0KLQkJYXZhaGlfdGhyZWFkZWRfcG9sbF9mcmVlKF9wb2xsKTsKLQkJX3BvbGwgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGF2YWhpX3RocmVhZGVkX3BvbGxfc3RhcnQoX3BvbGwpIDwgMCkgewotCQlyZmJMb2coIndhcm5pbmc6IHVuYWJsZSB0byBzdGFydCBBdmFoaSBwb2xsLlxuIik7Ci0JCWF2YWhpX2NsaWVudF9mcmVlKF9jbGllbnQpOwotCQlfY2xpZW50ID0gTlVMTDsKLQkJYXZhaGlfdGhyZWFkZWRfcG9sbF9mcmVlKF9wb2xsKTsKLQkJX3BvbGwgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIm91dCBhdmFoaV9pbml0aWFsaXNlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgX2F2YWhpX2NyZWF0ZV9zZXJ2aWNlcyhjaGFyICpuYW1lLCBjaGFyICpob3N0LAotICAgIHVpbnQxNl90IHBvcnQpOwotCi1zdGF0aWMgdm9pZCBfYXZhaGlfZW50cnlfZ3JvdXBfY2FsbGJhY2soQXZhaGlFbnRyeUdyb3VwICpnLAotICAgIEF2YWhpRW50cnlHcm91cFN0YXRlIHN0YXRlLCB2b2lkICp1c2VyZGF0YSkgewotCWNoYXIgKm5ld19uYW1lOwotCWF2YWhpX3NlcnZpY2VfdCAqc3ZjID0gKGF2YWhpX3NlcnZpY2VfdCAqKXVzZXJkYXRhOwotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiaW4gIF9hdmFoaV9lbnRyeV9ncm91cF9jYWxsYmFjayAlZCAweCVwXG4iLCBzdGF0ZSwgc3ZjKTsKLQlpZiAoZyAhPSBfZ3JvdXAgJiYgX2dyb3VwICE9IE5VTEwpIHsKLQkJcmZiTG9nKCJhdmFoaV9lbnRyeV9ncm91cF9jYWxsYmFjayBmYXRhbCBlcnJvciAoZ3JvdXApLlxuIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmICh1c2VyZGF0YSA9PSBOVUxMKSB7Ci0JCXJmYkxvZygiYXZhaGlfZW50cnlfZ3JvdXBfY2FsbGJhY2sgZmF0YWwgZXJyb3IgKHVzZXJkYXRhKS5cbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCXN3aXRjaChzdGF0ZSkgewotCWNhc2UgQVZBSElfRU5UUllfR1JPVVBfRVNUQUJMSVNIRUQ6Ci0JCXJmYkxvZygiQXZhaGkgZ3JvdXAgJXMgZXN0YWJsaXNoZWQuXG4iLCBzdmMtPm5hbWUpOwotI2lmIDAJCS8qIGlzIHRoaXMgdGhlIHNlZ3YgcHJvYmxlbT8gKi8KLQkJZnJlZShzdmMpOwotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgQVZBSElfRU5UUllfR1JPVVBfQ09MTElTSU9OOgotCQluZXdfbmFtZSA9IGF2YWhpX2FsdGVybmF0aXZlX3NlcnZpY2VfbmFtZShzdmMtPm5hbWUpOwotCQlfYXZhaGlfY3JlYXRlX3NlcnZpY2VzKG5ld19uYW1lLCBzdmMtPmhvc3QsIHN2Yy0+cG9ydCk7Ci0JCXJmYkxvZygiQXZhaGkgRW50cnkgZ3JvdXAgY29sbGlzaW9uXG4iKTsKLQkJYXZhaGlfZnJlZShuZXdfbmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVZBSElfRU5UUllfR1JPVVBfRkFJTFVSRToKLQkJcmZiTG9nKCJBdmFoaSBFbnRyeSBncm91cCBmYWlsdXJlOiAlc1xuIiwKLQkJICAgIGF2YWhpX3N0cmVycm9yKGF2YWhpX2NsaWVudF9lcnJubygKLQkJICAgIGF2YWhpX2VudHJ5X2dyb3VwX2dldF9jbGllbnQoZykpKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJvdXQgX2F2YWhpX2VudHJ5X2dyb3VwX2NhbGxiYWNrXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgX2F2YWhpX2NyZWF0ZV9zZXJ2aWNlcyhjaGFyICpuYW1lLCBjaGFyICpob3N0LCB1aW50MTZfdCBwb3J0KSB7Ci0JYXZhaGlfc2VydmljZV90ICpzdmMgPSAoYXZhaGlfc2VydmljZV90ICopbWFsbG9jKHNpemVvZihhdmFoaV9zZXJ2aWNlX3QpKTsKLQlpbnQgcmV0ID0gMDsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImluICBfYXZhaGlfY3JlYXRlX3NlcnZpY2VzICAnJXMnICclcycgJWRcbiIsIG5hbWUsIGhvc3QsIHBvcnQpOwotCXN2Yy0+bmFtZSA9IG5hbWU7Ci0Jc3ZjLT5ob3N0ID0gaG9zdDsKLQlzdmMtPnBvcnQgPSBwb3J0OwotCi0JaWYgKCFfZ3JvdXApIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgX2F2YWhpX2NyZWF0ZV9zZXJ2aWNlcyBjcmVhdGUgZ3JvdXBcbiIpOwotCQlfZ3JvdXAgPSBhdmFoaV9lbnRyeV9ncm91cF9uZXcoX2NsaWVudCwKLQkJICAgIF9hdmFoaV9lbnRyeV9ncm91cF9jYWxsYmFjaywgc3ZjKTsKLQl9Ci0JaWYgKCFfZ3JvdXApIHsKLQkJcmZiTG9nKCJhdmFoaV9lbnRyeV9ncm91cF9uZXcoKSBmYWlsZWQ6ICVzXG4iLAotCQkgICAgYXZhaGlfc3RyZXJyb3IoYXZhaGlfY2xpZW50X2Vycm5vKF9jbGllbnQpKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXQgPSBhdmFoaV9lbnRyeV9ncm91cF9hZGRfc2VydmljZShfZ3JvdXAsIEFWQUhJX0lGX1VOU1BFQywKLQkgICAgQVZBSElfUFJPVE9fVU5TUEVDLCAwLCBuYW1lLCAiX3JmYi5fdGNwIiwgTlVMTCwgTlVMTCwgcG9ydCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmZiTG9nKCJGYWlsZWQgdG8gYWRkIF9yZmIuX3RjcCBzZXJ2aWNlOiAlc1xuIiwKLQkJICAgIGF2YWhpX3N0cmVycm9yKHJldCkpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gYXZhaGlfZW50cnlfZ3JvdXBfY29tbWl0KF9ncm91cCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmZiTG9nKCJGYWlsZWQgdG8gY29tbWl0IGVudHJ5X2dyb3VwOjogJXNcbiIsCi0JCSAgICBhdmFoaV9zdHJlcnJvcihyZXQpKTsKLQkJcmV0dXJuOwotCX0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJvdXQgX2F2YWhpX2NyZWF0ZV9zZXJ2aWNlc1xuIik7Ci19Ci0KLXZvaWQgYXZhaGlfYWR2ZXJ0aXNlKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIHVpbnQxNl90IHBvcnQpIHsKLQlpbnQgaTsKLQljaGFyICp0OwotCXQgPSBnZXRlbnYoIlgxMVZOQ19BVkFISV9OQU1FIik7IGlmICh0KSBuYW1lID0gdDsKLQl0ID0gZ2V0ZW52KCJYMTFWTkNfQVZBSElfSE9TVCIpOyBpZiAodCkgaG9zdCA9IHQ7Ci0JdCA9IGdldGVudigiWDExVk5DX0FWQUhJX1BPUlQiKTsgaWYgKHQpIHBvcnQgPSBhdG9pKHQpOwotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiaW4gIGF2YWhpX2FkdmVydGlzZTogJyVzJyAnJXMnICVkXG4iLCBuYW1lLCBob3N0LCBwb3J0KTsKLQlpZiAoIV9jbGllbnQpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfYWR2ZXJ0aXNlIGNsaWVudCBudWxsXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoX3BvbGwgPT0gTlVMTCkgewotCQlyZmJMb2coIkF2YWhpIHBvbGwgbm90IGluaXRpYWxpemVkLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0JLyogd2VsbCwgd2UganVzdCB0cmFjayBpdCBvdXJzZWx2ZXMuLi4gKi8KLQlmb3IgKGk9MDsgaTxOUkVHOyBpKyspIHsKLQkJaWYgKCFyZWdpc3RlcmVkW2ldLm5hbWUpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJjbXAocmVnaXN0ZXJlZFtpXS5uYW1lLCBuYW1lKSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0cmNtcChyZWdpc3RlcmVkW2ldLmhvc3QsIGhvc3QpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocmVnaXN0ZXJlZFtpXS5wb3J0ICE9IHBvcnQpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICAgIGF2YWhpX2FkdmVydGlzZSBhbHJlYWR5IGRpZCB0aGlzIG9uZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpPTA7IGk8TlJFRzsgaSsrKSB7Ci0JCWlmICghcmVnaXN0ZXJlZFtpXS5uYW1lKSB7Ci0JCQlyZWdpc3RlcmVkW2ldLm5hbWUgPSBzdHJkdXAobmFtZSk7Ci0JCQlyZWdpc3RlcmVkW2ldLmhvc3QgPSBzdHJkdXAoaG9zdCk7Ci0JCQlyZWdpc3RlcmVkW2ldLnBvcnQgPSBwb3J0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlhdmFoaV90aHJlYWRlZF9wb2xsX2xvY2soX3BvbGwpOwotCV9hdmFoaV9jcmVhdGVfc2VydmljZXMobmFtZSwgaG9zdCwgcG9ydCA+PSA1OTAwID8gcG9ydCA6IDU5MDArcG9ydCk7Ci0JYXZhaGlfdGhyZWFkZWRfcG9sbF91bmxvY2soX3BvbGwpOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIm91dCBhdmFoaV9hZHZlcnRpc2VcbiIpOwotfQotCi12b2lkIGF2YWhpX3Jlc2V0KHZvaWQpIHsKLQlpbnQgaTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJpbiAgYXZhaGlfcmVzZXRcbiIpOwotCWZvciAoaT0wOyBpPE5SRUc7IGkrKykgewotCQlpZiAocmVnaXN0ZXJlZFtpXS5uYW1lKSB7Ci0JCQlmcmVlKHJlZ2lzdGVyZWRbaV0ubmFtZSk7Ci0JCQlyZWdpc3RlcmVkW2ldLm5hbWUgPSBOVUxMOwotCQl9Ci0JCWlmIChyZWdpc3RlcmVkW2ldLmhvc3QpIHsKLQkJCWZyZWUocmVnaXN0ZXJlZFtpXS5ob3N0KTsKLQkJCXJlZ2lzdGVyZWRbaV0uaG9zdCA9IE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKCFfY2xpZW50IHx8ICFfZ3JvdXApIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfcmVzZXQgY2xpZW50L2dyb3VwIG51bGxcbiIpOwotCQlyZXR1cm47Ci0JfQotCWF2YWhpX2VudHJ5X2dyb3VwX3Jlc2V0KF9ncm91cCk7Ci0JcmZiTG9nKCJBdmFoaSByZXNldHRpbmcgZ3JvdXAuXG4iKTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJvdXQgYXZhaGlfcmVzZXRcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBhdmFoaV90aW1lb3V0IChpbnQgc2lnKSB7Ci0JcmZiTG9nKCJzaWc6ICVkLCBhdmFoaV9jbGVhbnVwIHRpbWVkIG91dC5cbiIsIHNpZyk7Ci0JZXhpdCgxKTsKLX0KLQotCi12b2lkIGF2YWhpX2NsZWFudXAodm9pZCkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImluICBhdmFoaV9jbGVhbnVwXG4iKTsKLQlpZiAoIV9jbGllbnQpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfY2xlYW51cCBjbGllbnQgbnVsbFxuIik7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICAgIGF2YWhpX2NsZWFudXAgcG9sbF9sb2NrXG4iKTsKLQlhdmFoaV90aHJlYWRlZF9wb2xsX2xvY2soX3BvbGwpOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgICBhdmFoaV9jbGVhbnVwIHBvbGxfc3RvcFxuIik7Ci0KLQlzaWduYWwoU0lHQUxSTSwgYXZhaGlfdGltZW91dCk7Ci0JYWxhcm0oMyk7Ci0JYXZhaGlfdGhyZWFkZWRfcG9sbF9zdG9wKF9wb2xsKTsKLQlhbGFybSgwKTsKLQlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfY2xlYW51cCBjbGllbnRfZnJlZVxuIik7Ci0JYXZhaGlfY2xpZW50X2ZyZWUoX2NsaWVudCk7Ci0JX2NsaWVudCA9IE5VTEw7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgYXZhaGlfY2xlYW51cCBwb2xsX2ZyZWVcbiIpOwotCWF2YWhpX3RocmVhZGVkX3BvbGxfZnJlZShfcG9sbCk7Ci0JX3BvbGwgPSBOVUxMOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIm91dCBhdmFoaV9jbGVhbnVwXG4iKTsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9hdmFoaS5oIGIveDExdm5jL2F2YWhpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiN2E2YmMuLjAwMDAwMDAKLS0tIGEveDExdm5jL2F2YWhpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19BVkFISV9ICi0jZGVmaW5lIF9YMTFWTkNfQVZBSElfSAotCi0vKiAtLSBhdmFoaS5oIC0tICovCi0KLWV4dGVybiB2b2lkIGF2YWhpX2luaXRpYWxpc2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBhdmFoaV9hZHZlcnRpc2UoY2hhciAqbmFtZSwgY2hhciAqaG9zdCwgdWludDE2X3QgcG9ydCk7Ci1leHRlcm4gdm9pZCBhdmFoaV9yZXNldCh2b2lkKTsKLWV4dGVybiB2b2lkIGF2YWhpX2NsZWFudXAodm9pZCk7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX0FWQUhJX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9ibGFja291dF90LmggYi94MTF2bmMvYmxhY2tvdXRfdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTRmNWI0Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9ibGFja291dF90LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19CTEFDS09VVF9UX0gKLSNkZWZpbmUgX1gxMVZOQ19CTEFDS09VVF9UX0gKLQotLyogLS0gYmxhY2tvdXRfdC5oIC0tICovCi0KLXR5cGVkZWYgc3RydWN0IGJvdXQgewotCWludCB4MSwgeTEsIHgyLCB5MjsKLX0gYmxhY2tvdXRfdDsKLQotI2RlZmluZSBCT19NQVggMzIKLXR5cGVkZWYgc3RydWN0IHRib3V0IHsKLQlibGFja291dF90IGJvW0JPX01BWF07CS8qIGhhcmR3aXJlZCBtYXggcmVjdGFuZ2xlcy4gKi8KLQlpbnQgY292ZXI7Ci0JaW50IGNvdW50OwotfSB0aWxlX2JsYWNrb3V0X3Q7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX0JMQUNLT1VUX1RfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2NsZWFudXAuYyBiL3gxMXZuYy9jbGVhbnVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZGI4MTkuLjAwMDAwMDAKLS0tIGEveDExdm5jL2NsZWFudXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc2OSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIGNsZWFudXAuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAieGRhbWFnZS5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotI2luY2x1ZGUgImd1aS5oIgotI2luY2x1ZGUgInNvbGlkLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAic3NsY21kcy5oIgotI2luY2x1ZGUgInNzbGhlbHBlci5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0jaW5jbHVkZSAibWFjb3N4LmgiCi0jaW5jbHVkZSAibWFjb3N4Q0cuaCIKLSNpbmNsdWRlICJhdmFoaS5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgInhyZWNvcmQuaCIKLSNpbmNsdWRlICJ4ZXZlbnRzLmgiCi0jaW5jbHVkZSAidWlucHV0LmgiCi0KLS8qCi0gKiBFeGl0aW5nIGFuZCBlcnJvciBoYW5kbGluZyByb3V0aW5lcwotICovCi0KLWludCB0cmFwcGVkX3hlcnJvciA9IDA7Ci1pbnQgdHJhcHBlZF94aW9lcnJvciA9IDA7Ci1pbnQgdHJhcHBlZF9nZXRpbWFnZV94ZXJyb3IgPSAwOwotaW50IHRyYXBwZWRfcmVjb3JkX3hlcnJvciA9IDA7Ci1YRXJyb3JFdmVudCAqdHJhcHBlZF94ZXJyb3JfZXZlbnQ7Ci0KLS8qIFhYWCBDSEVDSyBCRUZPUkUgUkVMRUFTRSAqLwotaW50IGNyYXNoX2RlYnVnID0gMDsKLQotdm9pZCBjbGVhbl9zaG0oaW50IHF1aWNrKTsKLXZvaWQgY2xlYW5fdXBfZXhpdChpbnQgcmV0KTsKLWludCB0cmFwX3hlcnJvcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZXJyb3IpOwotaW50IHRyYXBfeGlvZXJyb3IoRGlzcGxheSAqZCk7Ci1pbnQgdHJhcF9nZXRpbWFnZV94ZXJyb3IoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmVycm9yKTsKLWNoYXIgKnhlcnJvcl9zdHJpbmcoWEVycm9yRXZlbnQgKmVycm9yKTsKLXZvaWQgaW5pdGlhbGl6ZV9jcmFzaF9oYW5kbGVyKHZvaWQpOwotdm9pZCBpbml0aWFsaXplX3NpZ25hbHModm9pZCk7Ci12b2lkIHVuc2V0X3NpZ25hbHModm9pZCk7Ci12b2lkIGNsb3NlX2V4ZWNfZmRzKHZvaWQpOwotaW50IGtub3duX3NpZ3BpcGVfbW9kZShjaGFyICpzKTsKLQotCi1zdGF0aWMgaW50IGV4aXRfZmxhZyA9IDA7Ci1zdGF0aWMgaW50IGV4aXRfc2lnID0gMDsKLQotc3RhdGljIHZvaWQgY2xlYW5faWNvbl9tb2RlKHZvaWQpOwotc3RhdGljIGludCBYZXJyb3IoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmVycm9yKTsKLXN0YXRpYyBpbnQgWElPZXJyKERpc3BsYXkgKmQpOwotc3RhdGljIHZvaWQgY3Jhc2hfc2hlbGxfaGVscCh2b2lkKTsKLXN0YXRpYyB2b2lkIGNyYXNoX3NoZWxsKHZvaWQpOwotc3RhdGljIHZvaWQgaW50ZXJydXB0ZWQgKGludCBzaWcpOwotCi0KLXZvaWQgY2xlYW5fc2htKGludCBxdWljaykgewotCWludCBpLCBjbnQgPSAwOwotCi0JLyoKLQkgKiB0byBhdm9pZCBkZWFkbG9jaywgZXRjLCB1bmRlciBxdWljaz0xIHdlIGp1c3QgZGVsZXRlIHRoZSBzaG0KLQkgKiBhcmVhcyBhbmQgbGVhdmUgdGhlIFggc3R1ZmYgaGFuZ2luZy4KLQkgKi8KLQlpZiAocXVpY2spIHsKLQkJc2htX2RlbGV0ZSgmc2NhbmxpbmVfc2htKTsKLQkJc2htX2RlbGV0ZSgmZnVsbHNjcmVlbl9zaG0pOwotCQlzaG1fZGVsZXRlKCZzbmFwcmVjdF9zaG0pOwotCX0gZWxzZSB7Ci0JCXNobV9jbGVhbigmc2NhbmxpbmVfc2htLCBzY2FubGluZSk7Ci0JCXNobV9jbGVhbigmZnVsbHNjcmVlbl9zaG0sIGZ1bGxzY3JlZW4pOwotCQlzaG1fY2xlYW4oJnNuYXByZWN0X3NobSwgc25hcHJlY3QpOwotCX0KLQotCS8qIAotCSAqIEhlcmUgd2UgaGF2ZSB0byBjbGVhbiB1cCBxdWl0ZSBhIGZldyBzaG0gYXJlYXMgZm9yIGFsbAotCSAqIHRoZSBwb3NzaWJsZSB0aWxlIHJvdyBydW5zICg0MCBmb3IgMTI4MCksIG5vdCBhcyByb2J1c3QKLQkgKiBhcyBvbmUgbWlnaHQgbGlrZS4uLiBzb21ldGltZXMgbmVlZCB0byBydW4gaXBjcm0oMSkuIAotCSAqLwotCWZvcihpPTE7IGk8PW50aWxlc194OyBpKyspIHsKLQkJaWYgKGkgPiB0aWxlX3NobV9jb3VudCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHF1aWNrKSB7Ci0JCQlzaG1fZGVsZXRlKCZ0aWxlX3Jvd19zaG1baV0pOwotCQl9IGVsc2UgewotCQkJc2htX2NsZWFuKCZ0aWxlX3Jvd19zaG1baV0sIHRpbGVfcm93W2ldKTsKLQkJfQotCQljbnQrKzsKLQkJaWYgKHNpbmdsZV9jb3B5dGlsZV9jb3VudCAmJiBpID49IHNpbmdsZV9jb3B5dGlsZV9jb3VudCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFxdWlldCAmJiBjbnQgPiAwKSB7Ci0JCXJmYkxvZygiZGVsZXRlZCAlZCB0aWxlX3JvdyBwb2xsaW5nIGltYWdlcy5cbiIsIGNudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjbGVhbl9pY29uX21vZGUodm9pZCkgewotCWlmIChpY29uX21vZGUgJiYgaWNvbl9tb2RlX2ZoKSB7Ci0JCWZwcmludGYoaWNvbl9tb2RlX2ZoLCAicXVpdFxuIik7Ci0JCWZmbHVzaChpY29uX21vZGVfZmgpOwotCQlmY2xvc2UoaWNvbl9tb2RlX2ZoKTsKLQkJaWNvbl9tb2RlX2ZoID0gTlVMTDsKLQkJaWYgKGljb25fbW9kZV9maWxlKSB7Ci0JCQl1bmxpbmsoaWNvbl9tb2RlX2ZpbGUpOwotCQkJaWNvbl9tb2RlX2ZpbGUgPSBOVUxMOwotCQl9Ci0JfQotfQotCi0vKgotICogTm9ybWFsIGV4aXRpbmcKLSAqLwotdm9pZCBjbGVhbl91cF9leGl0KGludCByZXQpIHsKLQlzdGF0aWMgaW50IGRlcHRoID0gMDsKLQlleGl0X2ZsYWcgPSAxOwotCi0JaWYgKGRlcHRoKysgPiAyKSB7Ci0JCWV4aXQocmV0KTsKLQl9Ci0KLQlpZiAoaWNvbl9tb2RlKSB7Ci0JCWNsZWFuX2ljb25fbW9kZSgpOwotCX0KLQotCS8qIHJlbW92ZSB0aGUgc2htIGFyZWFzOiAqLwotCWNsZWFuX3NobSgwKTsKLQotCXN0b3Bfc3R1bm5lbCgpOwotCWlmICh1c2Vfb3BlbnNzbCkgewotCQlzc2xfaGVscGVyX3BpZCgwLCAwKTsJLyoga2lsbGFsbCAqLwotCX0KLQotCWlmIChzc2hfcGlkID4gMCkgewotCQlraWxsKHNzaF9waWQsIFNJR1RFUk0pOwotCQlzc2hfcGlkID0gMDsKLQl9Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAoY2xpZW50X2Nvbm5lY3RfZmlsZSkgewotCQlpZiAoc3Ryc3RyKGNsaWVudF9jb25uZWN0X2ZpbGUsICIvdG1wL3gxMXZuYy1tYWNvc3gtcmVtb3RlIikKLQkJICAgID09IGNsaWVudF9jb25uZWN0X2ZpbGUpIHsKLQkJCXVubGluayhjbGllbnRfY29ubmVjdF9maWxlKTsKLQkJfQotCX0KLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJbWFjb3N4Q0dfZmluaSgpOwotCX0KLSNlbmRpZgotCi0JaWYgKHBpcGVpbnB1dF9maCAhPSBOVUxMKSB7Ci0JCXBjbG9zZShwaXBlaW5wdXRfZmgpOwotCQlwaXBlaW5wdXRfZmggPSBOVUxMOwotCX0KLQotCXNodXRkb3duX3VpbnB1dCgpOwotCi0JaWYgKHVuaXhfc29jaykgewotCQlpZiAodW5peF9zb2NrX2ZkID49IDApIHsKLQkJCXJmYkxvZygiZGVsZXRpbmcgdW5peCBzb2NrOiAlc1xuIiwgdW5peF9zb2NrKTsKLQkJCWNsb3NlKHVuaXhfc29ja19mZCk7Ci0JCQl1bml4X3NvY2tfZmQgPSAtMTsKLQkJCXVubGluayh1bml4X3NvY2spOwotCQl9Ci0JfQotCi0JaWYgKCEgZHB5KSB7CS8qIHJhd19yYiBoYWNrICovCi0JCWlmIChybV9mbGFnZmlsZSkgewotCQkJdW5saW5rKHJtX2ZsYWdmaWxlKTsKLQkJCXJtX2ZsYWdmaWxlID0gTlVMTDsKLQkJfQotCQlleGl0KHJldCk7Ci0JfQotCi0JLyogWCBrZXlib2FyZCBjbGVhbnVwcyAqLwotCWRlbGV0ZV9hZGRlZF9rZXljb2RlcygwKTsKLQotCWlmIChjbGVhcl9tb2RzID09IDEpIHsKLQkJY2xlYXJfbW9kaWZpZXJzKDApOwotCX0gZWxzZSBpZiAoY2xlYXJfbW9kcyA9PSAyKSB7Ci0JCWNsZWFyX2tleXMoKTsKLQl9IGVsc2UgaWYgKGNsZWFyX21vZHMgPT0gMykgewotCQljbGVhcl9rZXlzKCk7Ci0JCWNsZWFyX2xvY2tzKCk7Ci0JfQotCi0JaWYgKG5vX2F1dG9yZXBlYXQpIHsKLQkJYXV0b3JlcGVhdCgxLCAwKTsKLQl9Ci0JaWYgKHVzZV9zb2xpZF9iZykgewotCQlzb2xpZF9iZygxKTsKLQl9Ci0JaWYgKG5jYWNoZSB8fCBuY2FjaGUwKSB7Ci0JCWtkZV9ub19hbmltYXRlKDEpOwotCX0KLQlYX0xPQ0s7Ci0JWFRlc3REaXNjYXJkX3dyKGRweSk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRQotCWlmICh4ZGFtYWdlKSB7Ci0JCVhEYW1hZ2VEZXN0cm95KGRweSwgeGRhbWFnZSk7Ci0JfQotI2VuZGlmCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWFRSQVAKLQlpZiAodHJhcF9jdHgpIHsKLQkJWEVGcmVlVEModHJhcF9jdHgpOwotCX0KLSNlbmRpZgotCS8qIFhYWCByZHB5X2N0cmwsIGV0Yy4gY2Fubm90IGNsb3NlIHcvbyBibG9ja2luZyAqLwotCVhDbG9zZURpc3BsYXlfd3IoZHB5KTsKLQlYX1VOTE9DSzsKLQotCWZmbHVzaChzdGRlcnIpOwotCi0JaWYgKHJtX2ZsYWdmaWxlKSB7Ci0JCXVubGluayhybV9mbGFnZmlsZSk7Ci0JCXJtX2ZsYWdmaWxlID0gTlVMTDsKLQl9Ci0KLQlpZiAoYXZhaGkpIHsKLQkJYXZhaGlfY2xlYW51cCgpOwotCQlmZmx1c2goc3RkZXJyKTsKLQl9Ci0KLQlleGl0KHJldCk7Ci19Ci0KLS8qIFgxMSBlcnJvciBoYW5kbGVycyAqLwotCi1zdGF0aWMgWEVycm9ySGFuZGxlciAgIFhlcnJvcl9kZWY7Ci1zdGF0aWMgWElPRXJyb3JIYW5kbGVyIFhJT2Vycl9kZWY7Ci0KLWludCB0cmFwX3hlcnJvcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZXJyb3IpIHsKLQl0cmFwcGVkX3hlcnJvciA9IDE7Ci0JdHJhcHBlZF94ZXJyb3JfZXZlbnQgPSBlcnJvcjsKLQotCWlmIChkKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0cmFwX3hpb2Vycm9yKERpc3BsYXkgKmQpIHsKLQl0cmFwcGVkX3hpb2Vycm9yID0gMTsKLQotCWlmIChkKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0cmFwX2dldGltYWdlX3hlcnJvcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZXJyb3IpIHsKLQl0cmFwcGVkX2dldGltYWdlX3hlcnJvciA9IDE7Ci0JdHJhcHBlZF94ZXJyb3JfZXZlbnQgPSBlcnJvcjsKLQotCWlmIChkKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEFyZSBzaWxseSBYb3JnIHBlb3BsZSByZW1vdmluZyBYX1NobUF0dGFjaCBmcm9tIFhTaG0uaD8gKi8KLS8qIElOREVFRCEgIFdoYXQgc3R1cGlkLCBteW9waWMgbW9yb25zLi4uICAqLwotLyogTWFpbnRlbmFuY2UgTW9ua2V5cyBidXN5IHR5cGluZyBhdCB0aGVpciBrZXlib2FyZHMuLi4gKi8KLSNpZm5kZWYgWF9TaG1BdHRhY2gKLSNkZWZpbmUgWF9TaG1BdHRhY2ggMQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgWGVycm9yKERpc3BsYXkgKmQsIFhFcnJvckV2ZW50ICplcnJvcikgewotCVhfVU5MT0NLOwotCi0JaWYgKGdldGVudigiWDExVk5DX1BSSU5UX1hFUlJPUiIpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiWGVycm9yOiBtYWpvcl9vcGNvZGU6ICVkIG1pbm9yX29wY29kZTogJWQgZXJyb3JfY29kZTogJWRcbiIsCi0JCSAgICBlcnJvci0+cmVxdWVzdF9jb2RlLCBlcnJvci0+bWlub3JfY29kZSwgZXJyb3ItPmVycm9yX2NvZGUpOwotCX0KLQotCWlmICh4c2htX29wY29kZSA+IDAgJiYgZXJyb3ItPnJlcXVlc3RfY29kZSA9PSB4c2htX29wY29kZSkgewotCQlpZiAoZXJyb3ItPm1pbm9yX2NvZGUgPT0gWF9TaG1BdHRhY2gpIHsKLQkJCWNoYXIgKmRzdHIgPSBEaXNwbGF5U3RyaW5nKGRweSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuWDExIE1JVCBTaGFyZWQgTWVtb3J5IEF0dGFjaCBmYWlsZWQ6XG4iKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiICBJcyB5b3VyIERJU1BMQVk9JXMgb24gYSByZW1vdGUgbWFjaGluZT9cbiIsIGRzdHIpOwotCQkJaWYgKHN0cnN0cihkc3RyLCAibG9jYWxob3N0OiIpKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgIE5vdGU6ICAgRElTUExBWT1sb2NhbGhvc3Q6TiBzdWdnZXN0cyBhIFNTSCBYMTEgcmVkaXIgdG8gYSByZW1vdGUgbWFjaGluZS5cbiIpOwotCQkJfSBlbHNlIGlmIChkc3RyWzBdICE9ICc6JykgewotCQkJCWZwcmludGYoc3RkZXJyLCAiICBOb3RlOiAgIERJU1BMQVk9aG9zdG5hbWU6TiBzdWdnZXN0cyBhIHJlbW90ZSBkaXNwbGF5LlxuIik7Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgU3VnZ2VzdGlvbiwgdXNlOiB4MTF2bmMgLWRpc3BsYXkgOjAgLi4uIGZvciBsb2NhbCBkaXNwbGF5IDowXG5cbiIpOwotCQl9Ci0JfQotCi0JaW50ZXJydXB0ZWQoMCk7Ci0KLQlpZiAoZCkge30gLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQotCXJldHVybiAoKlhlcnJvcl9kZWYpKGQsIGVycm9yKTsKLX0KLQotdm9pZCB3YXRjaF9sb29wKHZvaWQpOwotCi1zdGF0aWMgaW50IFhJT2VycihEaXNwbGF5ICpkKSB7Ci0Jc3RhdGljIGludCByZW9wZW4gPSAwLCBybWF4ID0gMTsKLQlYX1VOTE9DSzsKLQotCWlmIChnZXRlbnYoIlgxMVZOQ19SRU9QRU5fRElTUExBWSIpKSB7Ci0JCXJtYXggPSBhdG9pKGdldGVudigiWDExVk5DX1JFT1BFTl9ESVNQTEFZIikpOwotCX0KLQotI2lmICFOT19YMTEKLQlpZiAocmVvcGVuIDwgcm1heCAmJiBnZXRlbnYoIlgxMVZOQ19SRU9QRU5fRElTUExBWSIpKSB7Ci0JCWludCBkYiA9IGdldGVudigiWDExVk5DX1JFT1BFTl9ERUJVRyIpID8gMSA6IDA7Ci0JCWludCBzbGVlcG1heCA9IDEwLCBpOwotCQlEaXNwbGF5ICpzYXZlX2RweSA9IGRweTsKLQkJY2hhciAqZHN0ciA9IHN0cmR1cChEaXNwbGF5U3RyaW5nKHNhdmVfZHB5KSk7Ci0JCXJlb3BlbisrOwkKLQkJaWYgKGdldGVudigiWDExVk5DX1JFT1BFTl9TTEVFUF9NQVgiKSkgewotCQkJc2xlZXBtYXggPSBhdG9pKGdldGVudigiWDExVk5DX1JFT1BFTl9TTEVFUF9NQVgiKSk7Ci0JCX0KLQkJcmZiTG9nKCIqKiogWElPIGVycm9yOiBUcnlpbmcgdG8gcmVvcGVuWyVkLyVkXSBkaXNwbGF5ICclcydcbiIsIHJlb3Blbiwgcm1heCwgZHN0cik7Ci0JCXJmYkxvZygiKioqIFhJTyBlcnJvcjogTm90ZSB0aGUgcmVvcGVuZWQgc3RhdGUgbWF5IGJlIHVuc3RhYmxlLlxuIik7Ci0JCWZvciAoaT0wOyBpIDwgc2xlZXBtYXg7IGkrKykgewotCQkJdXNsZWVwICgxMDAwICogMTAwMCk7Ci0JCQlkcHkgPSBYT3BlbkRpc3BsYXlfd3IoZHN0cik7Ci0JCQlyZmJMb2coImRweVslZC8lZF06ICVwXG4iLCBpKzEsIHNsZWVwbWF4LCBkcHkpOwotCQkJaWYgKGRweSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWxhc3Rfb3Blbl94ZGlzcGxheSA9IHRpbWUoTlVMTCk7Ci0JCWlmIChkcHkpIHsKLQkJCXJmYkxvZygiKioqIFhJTyBlcnJvcjogUmVvcGVuZWQgZGlzcGxheSAnJXMnIHN1Y2Nlc3NmdWxseS5cbiIsIGRzdHIpOwotCQkJaWYgKGRiKSByZmJMb2coIioqKiBYSU8gZXJyb3I6ICclcycgMHgleFxuIiwgZHN0ciwgZHB5KTsKLQkJCXNjciA9IERlZmF1bHRTY3JlZW4oZHB5KTsKLQkJCXJvb3R3aW4gPSBSb290V2luZG93KGRweSwgc2NyKTsKLQkJCWlmIChkYikgcmZiTG9nKCIqKiogWElPIGVycm9yOiBkaXNhYmxlX2dyYWJzZXJ2ZXJcbiIpOwotCQkJZGlzYWJsZV9ncmFic2VydmVyKGRweSwgMCk7Ci0JCQlpZiAoZGIpIHJmYkxvZygiKioqIFhJTyBlcnJvcjogeHJlY29yZFxuIik7Ci0JCQl6ZXJvZGlzcF94cmVjb3JkKCk7Ci0JCQlpbml0aWFsaXplX3hyZWNvcmQoKTsKLQkJCWlmIChkYikgcmZiTG9nKCIqKiogWElPIGVycm9yOiB4ZGFtYWdlXG4iKTsKLQkJCWNyZWF0ZV94ZGFtYWdlX2lmX25lZWRlZCgxKTsKLQkJCWlmIChkYikgcmZiTG9nKCIqKiogWElPIGVycm9yOiBkb19uZXdfZmJcbiIpOwotCQkJaWYgKHVzaW5nX3NobSkgewotCQkJCWlmIChkYikgcmZiTG9nKCIqKiogWElPIGVycm9yOiBjbGVhbl9zaG1cbiIpOwotCQkJCWNsZWFuX3NobSgxKTsKLQkJCX0KLQkJCWRvX25ld19mYigxKTsKLQkJCWlmIChkYikgcmZiTG9nKCIqKiogWElPIGVycm9yOiBjaGVja194ZXZlbnRzXG4iKTsKLQkJCWNoZWNrX3hldmVudHMoMSk7Ci0KLQkJCS8qIHNhZGx5LCB3ZSBjYW4gbmV2ZXIgcmV0dXJuLi4uICovCi0JCQlpZiAoZGIpIHJmYkxvZygiKioqIFhJTyBlcnJvcjogd2F0Y2hfbG9vcFxuIik7Ci0JCQl3YXRjaF9sb29wKCk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwkKLQkJfQotCX0KLSNlbmRpZgotCi0JaW50ZXJydXB0ZWQoLTEpOwotCi0JaWYgKGQpIHt9IC8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0KLQlyZXR1cm4gKCpYSU9lcnJfZGVmKShkKTsKLX0KLQotc3RhdGljIGNoYXIgKnhlcnJvcnNbXSA9IHsKLQkiU3VjY2VzcyIsCi0JIkJhZFJlcXVlc3QiLAotCSJCYWRWYWx1ZSIsCi0JIkJhZFdpbmRvdyIsCi0JIkJhZFBpeG1hcCIsCi0JIkJhZEF0b20iLAotCSJCYWRDdXJzb3IiLAotCSJCYWRGb250IiwKLQkiQmFkTWF0Y2giLAotCSJCYWREcmF3YWJsZSIsCi0JIkJhZEFjY2VzcyIsCi0JIkJhZEFsbG9jIiwKLQkiQmFkQ29sb3IiLAotCSJCYWRHQyIsCi0JIkJhZElEQ2hvaWNlIiwKLQkiQmFkTmFtZSIsCi0JIkJhZExlbmd0aCIsCi0JIkJhZEltcGxlbWVudGF0aW9uIiwKLQkidW5rbm93biIKLX07Ci1zdGF0aWMgaW50IHhlcnJvcnNfbWF4ID0gQmFkSW1wbGVtZW50YXRpb247Ci0KLWNoYXIgKnhlcnJvcl9zdHJpbmcoWEVycm9yRXZlbnQgKmVycm9yKSB7Ci0JaW50IGluZGV4ID0gLTE7Ci0JaWYgKGVycm9yKSB7Ci0JCWluZGV4ID0gKGludCkgZXJyb3ItPmVycm9yX2NvZGU7Ci0JfQotCWlmICgwIDw9IGluZGV4ICYmIGluZGV4IDw9IHhlcnJvcnNfbWF4KSB7Ci0JCXJldHVybiB4ZXJyb3JzW2luZGV4XTsKLQl9IGVsc2UgewotCQlyZXR1cm4geGVycm9yc1t4ZXJyb3JzX21heCsxXTsKLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICpjcmFzaF9zdGFja19jb21tYW5kMSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqY3Jhc2hfc3RhY2tfY29tbWFuZDIgPSBOVUxMOwotc3RhdGljIGNoYXIgKmNyYXNoX2RlYnVnX2NvbW1hbmQgPSBOVUxMOwotCi12b2lkIGluaXRpYWxpemVfY3Jhc2hfaGFuZGxlcih2b2lkKSB7Ci0JaW50IHBpZCA9IHByb2dyYW1fcGlkOwotCWNyYXNoX3N0YWNrX2NvbW1hbmQxID0gKGNoYXIgKikgbWFsbG9jKDEwMDApOwotCWNyYXNoX3N0YWNrX2NvbW1hbmQyID0gKGNoYXIgKikgbWFsbG9jKDEwMDApOwotCWNyYXNoX2RlYnVnX2NvbW1hbmQgPSAgKGNoYXIgKikgbWFsbG9jKDEwMDApOwotCi0Jc25wcmludGYoY3Jhc2hfc3RhY2tfY29tbWFuZDEsIDUwMCwgImVjaG8gd2hlcmUgPiAvdG1wL2dkYi4lZDsiCi0JICAgICIgZW52IFBBVEg9JFBBVEg6L3Vzci9sb2NhbC9iaW46L3Vzci9zZncvYmluOi91c3IvYmluIgotCSAgICAiIGdkYiAteCAvdG1wL2dkYi4lZCAtYmF0Y2ggLW4gJXMgJWQ7IgotCSAgICAiIHJtIC1mIC90bXAvZ2RiLiVkIiwgcGlkLCBwaWQsIHByb2dyYW1fbmFtZSwgcGlkLCBwaWQpOwotCXNucHJpbnRmKGNyYXNoX3N0YWNrX2NvbW1hbmQyLCA1MDAsICJwc3RhY2sgJWQiLCBwcm9ncmFtX3BpZCk7Ci0JCi0Jc25wcmludGYoY3Jhc2hfZGVidWdfY29tbWFuZCwgNTAwLCAiZ2RiICVzICVkIiwgcHJvZ3JhbV9uYW1lLCBwaWQpOwotfQotCi1zdGF0aWMgdm9pZCBjcmFzaF9zaGVsbF9oZWxwKHZvaWQpIHsKLQlpbnQgcGlkID0gcHJvZ3JhbV9waWQ7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgKioqIFdlbGNvbWUgdG8gdGhlIHgxMXZuYyBjcmFzaCBzaGVsbCEgKioqXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJQUk9HUkFNOiAlcyAgUElEOiAlZFxuIiwgcHJvZ3JhbV9uYW1lLCBwaWQpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlBPU1NJQkxFIERFQlVHR0VSIENPTU1BTkQ6XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICVzXG4iLCBjcmFzaF9kZWJ1Z19jb21tYW5kKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJQcmVzcyBcInFcIiB0byBxdWl0LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJQcmVzcyBcImhcIiBvciBcIj9cIiBmb3IgdGhpcyBoZWxwLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJQcmVzcyBcInNcIiB0byB0cnkgdG8gcnVuIHNvbWUgY29tbWFuZHMgdG8iCi0JICAgICIgc2hvdyBhIHN0YWNrIHRyYWNlIChnZGIvcHN0YWNrKS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkFueXRoaW5nIGVsc2UgaXMgcGFzc2VkIHRvIC1RIHF1ZXJ5IGZ1bmN0aW9uLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBjcmFzaF9zaGVsbCh2b2lkKSB7Ci0JY2hhciBxcnlbMTAwMF0sIGNtZFsxMDAwXSwgbGluZVsxMDAwXTsKLQljaGFyICpzdHIsICpwOwotCi0JY3Jhc2hfc2hlbGxfaGVscCgpOwotCWZwcmludGYoc3RkZXJyLCAiXG5jcmFzaD4gIik7Ci0Jd2hpbGUgKGZnZXRzKGxpbmUsIDEwMDAsIHN0ZGluKSAhPSBOVUxMKSB7Ci0JCXN0ciA9IGxibGFua3MobGluZSk7Ci0KLQkJcCA9IHN0cjsKLQkJd2hpbGUoKnApIHsKLQkJCWlmICgqcCA9PSAnXG4nKSB7Ci0JCQkJKnAgPSAnXDAnOwotCQkJfQotCQkJcCsrOwotCQl9Ci0KLQkJaWYgKCpzdHIgPT0gJ3EnICYmICooc3RyKzEpID09ICdcMCcpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicXVpdGluZy5cbiIpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ2gnICYmICooc3RyKzEpID09ICdcMCcpIHsKLQkJCWNyYXNoX3NoZWxsX2hlbHAoKTsKLQkJfSBlbHNlIGlmICgqc3RyID09ICc/JyAmJiAqKHN0cisxKSA9PSAnXDAnKSB7Ci0JCQljcmFzaF9zaGVsbF9oZWxwKCk7Ci0JCX0gZWxzZSBpZiAoKnN0ciA9PSAncycgJiYgKihzdHIrMSkgPT0gJ1wwJykgewotCQkJc3ByaW50ZihjbWQsICJzaCAtYyAnKCVzKSAmJyIsIGNyYXNoX3N0YWNrX2NvbW1hbmQxKTsKLQkJCS8qIGNyYXNoICovCi0JCQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJjcmFzaCIpKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJcbm5vX2V4dGVybmFsX2NtZHM9JWRcbiIsCi0JCQkJICAgIG5vX2V4dGVybmFsX2NtZHMpOwotCQkJCWdvdG8gY3Jhc2hfcHJvbXB0OwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsICJcbnJ1bm5pbmc6XG5cdCVzXG5cbiIsCi0JCQkgICAgY3Jhc2hfc3RhY2tfY29tbWFuZDEpOwotCQkJc3lzdGVtKGNtZCk7Ci0JCQl1c2xlZXAoMTAwMCoxMDAwKTsKLQotCQkJc3ByaW50ZihjbWQsICJzaCAtYyAnKCVzKSAmJyIsIGNyYXNoX3N0YWNrX2NvbW1hbmQyKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiXG5ydW5uaW5nOlxuXHQlc1xuXG4iLAotCQkJICAgIGNyYXNoX3N0YWNrX2NvbW1hbmQyKTsKLQkJCXN5c3RlbShjbWQpOwotCQkJdXNsZWVwKDEwMDAqMTAwMCk7Ci0JCX0gZWxzZSB7Ci0JCQlzbnByaW50ZihxcnksIDEwMDAsICJxcnk9JXMiLCBzdHIpOwotCQkJcCA9IHByb2Nlc3NfcmVtb3RlX2NtZChxcnksIDEpOwotCQkJZnByaW50ZihzdGRlcnIsICJcblxucmVzdWx0OlxuJXNcbiIsIHApOwotCQkJZnJlZShwKTsKLQkJfQotCQkKLWNyYXNoX3Byb21wdDoKLQkJZnByaW50ZihzdGRlcnIsICJjcmFzaD4gIik7Ci0JfQotfQotCi0vKgotICogR2VuZXJhbCBwcm9ibGVtIGhhbmRsZXIKLSAqLwotc3RhdGljIHZvaWQgaW50ZXJydXB0ZWQgKGludCBzaWcpIHsKLQlleGl0X3NpZyA9IHNpZzsKLQlpZiAoZXhpdF9mbGFnKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXh0cmFbJWRdIHNpZ25hbDogJWRcbiIsIGV4aXRfZmxhZywgc2lnKTsKLQkJZXhpdF9mbGFnKys7Ci0JCWlmICh1c2VfdGhyZWFkcykgewotCQkJdXNsZWVwMigyNTAgKiAxMDAwKTsKLQkJfSBlbHNlIGlmIChleGl0X2ZsYWcgPD0gMikgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChybV9mbGFnZmlsZSkgewotCQkJdW5saW5rKHJtX2ZsYWdmaWxlKTsKLQkJCXJtX2ZsYWdmaWxlID0gTlVMTDsKLQkJfQotCQlleGl0KDQpOwotCX0KLQlleGl0X2ZsYWcrKzsKLQlpZiAoc2lnID09IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJjYXVnaHQgWDExIGVycm9yOlxuIik7Ci0JCWlmIChjcmFzaF9kZWJ1ZykgeyBjcmFzaF9zaGVsbCgpOyB9Ci0JfSBlbHNlIGlmIChzaWcgPT0gLTEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJjYXVnaHQgWElPIGVycm9yOlxuIik7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJjYXVnaHQgc2lnbmFsOiAlZFxuIiwgc2lnKTsKLQl9Ci0JaWYgKHNpZyA9PSBTSUdJTlQpIHsKLQkJc2h1dF9kb3duID0gMTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjcmFzaF9kZWJ1ZykgewotCQljcmFzaF9zaGVsbCgpOwotCX0KLQotCVhfVU5MT0NLOwotCi0JaWYgKGljb25fbW9kZSkgewotCQljbGVhbl9pY29uX21vZGUoKTsKLQl9Ci0JLyogcmVtb3ZlIHRoZSBzaG0gYXJlYXMgd2l0aCBxdWljaz0xOiAqLwotCWNsZWFuX3NobSgxKTsKLQotCWlmIChzaWcgPT0gLTEpIHsKLQkJLyogbm90IHdvcnRoIHRyeWluZyBhbnkgbW9yZSBjbGVhbnVwLCBYIHNlcnZlciBwcm9iYWJseSBnb25lICovCi0JCWlmIChybV9mbGFnZmlsZSkgewotCQkJdW5saW5rKHJtX2ZsYWdmaWxlKTsKLQkJCXJtX2ZsYWdmaWxlID0gTlVMTDsKLQkJfQotCQlleGl0KDMpOwotCX0KLQotCS8qIFgga2V5Ym9hcmQgY2xlYW51cHMgKi8KLQlkZWxldGVfYWRkZWRfa2V5Y29kZXMoMCk7Ci0KLQlpZiAoY2xlYXJfbW9kcyA9PSAxKSB7Ci0JCWNsZWFyX21vZGlmaWVycygwKTsKLQl9IGVsc2UgaWYgKGNsZWFyX21vZHMgPT0gMikgewotCQljbGVhcl9rZXlzKCk7Ci0JfSBlbHNlIGlmIChjbGVhcl9tb2RzID09IDMpIHsKLQkJY2xlYXJfa2V5cygpOwotCQljbGVhcl9sb2NrcygpOwotCX0KLQlpZiAobm9fYXV0b3JlcGVhdCkgewotCQlhdXRvcmVwZWF0KDEsIDApOwotCX0KLQlpZiAodXNlX3NvbGlkX2JnKSB7Ci0JCXNvbGlkX2JnKDEpOwotCX0KLQlpZiAobmNhY2hlIHx8IG5jYWNoZTApIHsKLQkJa2RlX25vX2FuaW1hdGUoMSk7Ci0JfQotCXN0b3Bfc3R1bm5lbCgpOwotCi0JaWYgKGNyYXNoX2RlYnVnKSB7Ci0JCWNyYXNoX3NoZWxsKCk7Ci0JfQotCi0JaWYgKHNpZykgewotCQlpZiAocm1fZmxhZ2ZpbGUpIHsKLQkJCXVubGluayhybV9mbGFnZmlsZSk7Ci0JCQlybV9mbGFnZmlsZSA9IE5VTEw7Ci0JCX0KLQkJZXhpdCgyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGlnbm9yZV9zaWdzKGNoYXIgKmxpc3QpIHsKLQljaGFyICpzdHIsICpwOwotCWludCBpZ25vcmUgPSAxOwotCWlmIChsaXN0ID09IE5VTEwgfHwgKmxpc3QgPT0gJ1wwJykgewotCQlyZXR1cm47Ci0JfQotCXN0ciA9IHN0cmR1cChsaXN0KTsKLQlwID0gc3RydG9rKHN0ciwgIjosIik7Ci0KLSNkZWZpbmUgU0VUU0lHKHgsIHkpIFwKLQlpZiAoc3Ryc3RyKHAsIHgpKSB7IFwKLQkJaWYgKGlnbm9yZSkgeyBcCi0JCQlzaWduYWwoeSwgU0lHX0lHTik7IFwKLQkJfSBlbHNlIHsgXAotCQkJc2lnbmFsKHksIGludGVycnVwdGVkKTsgXAotCQl9IFwKLQl9Ci0KLSNpZmRlZiBTSUdfSUdOCi0Jd2hpbGUgKHApIHsKLQkJaWYgKCFzdHJjbXAocCwgImlnbm9yZSIpKSB7Ci0JCQlpZ25vcmUgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgImV4aXQiKSkgewotCQkJaWdub3JlID0gMDsKLQkJfQotCQkvKiBUYWtlIG9mZiBldmVyeSAnc2lnJyA7LSkgKi8KLSNpZmRlZiBTSUdIVVAKLQkJU0VUU0lHKCJIVVAiLCBTSUdIVVApOwotI2VuZGlmCi0jaWZkZWYgU0lHSU5UCi0JCVNFVFNJRygiSU5UIiwgU0lHSU5UKTsKLSNlbmRpZgotI2lmZGVmIFNJR1FVSVQKLQkJU0VUU0lHKCJRVUlUIiwgU0lHUVVJVCk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUUkFQCi0JCVNFVFNJRygiVFJBUCIsIFNJR1RSQVApOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotCQlTRVRTSUcoIkFCUlQiLCBTSUdBQlJUKTsKLSNlbmRpZgotI2lmZGVmIFNJR0JVUwotCQlTRVRTSUcoIkJVUyIsIFNJR0JVUyk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdGUEUKLQkJU0VUU0lHKCJGUEUiLCBTSUdGUEUpOwotI2VuZGlmCi0jaWZkZWYgU0lHU0VHVgotCQlTRVRTSUcoIlNFR1YiLCBTSUdTRUdWKTsKLSNlbmRpZgotI2lmZGVmIFNJR1BJUEUKLQkJU0VUU0lHKCJQSVBFIiwgU0lHUElQRSk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdURVJNCi0JCVNFVFNJRygiVEVSTSIsIFNJR1RFUk0pOwotI2VuZGlmCi0jaWZkZWYgU0lHVVNSMQotCQlTRVRTSUcoIlVTUjEiLCBTSUdVU1IxKTsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjIKLQkJU0VUU0lHKCJVU1IyIiwgU0lHVVNSMik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdDT05UCi0JCVNFVFNJRygiQ09OVCIsIFNJR0NPTlQpOwotI2VuZGlmCi0jaWZkZWYgU0lHU1RPUAotCQlTRVRTSUcoIlNUT1AiLCBTSUdTVE9QKTsKLSNlbmRpZgotI2lmZGVmIFNJR1RTVFAKLQkJU0VUU0lHKCJUU1RQIiwgU0lHVFNUUCk7Ci0jZW5kaWYKLQkJcCA9IHN0cnRvayhOVUxMLCAiOiwiKTsKLQl9Ci0jZW5kaWYJLyogU0lHX0lHTiAqLwotCWZyZWUoc3RyKTsKLX0KLQotLyogc2lnbmFsIGhhbmRsZXJzICovCi12b2lkIGluaXRpYWxpemVfc2lnbmFscyh2b2lkKSB7Ci0Jc2lnbmFsKFNJR0hVUCwgIGludGVycnVwdGVkKTsKLQlzaWduYWwoU0lHSU5ULCAgaW50ZXJydXB0ZWQpOwotCXNpZ25hbChTSUdRVUlULCBpbnRlcnJ1cHRlZCk7Ci0Jc2lnbmFsKFNJR0FCUlQsIGludGVycnVwdGVkKTsKLQlzaWduYWwoU0lHVEVSTSwgaW50ZXJydXB0ZWQpOwotCXNpZ25hbChTSUdCVVMsICBpbnRlcnJ1cHRlZCk7Ci0Jc2lnbmFsKFNJR1NFR1YsIGludGVycnVwdGVkKTsKLQlzaWduYWwoU0lHRlBFLCAgaW50ZXJydXB0ZWQpOwotCi0JaWYgKCFzaWdwaXBlIHx8ICpzaWdwaXBlID09ICdcMCcgfHwgIXN0cmNtcChzaWdwaXBlLCAic2tpcCIpKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHN0cnN0cihzaWdwaXBlLCAiaWdub3JlOiIpID09IHNpZ3BpcGUpIHsKLQkJaWdub3JlX3NpZ3Moc2lncGlwZSk7Ci0JfSBlbHNlIGlmIChzdHJzdHIoc2lncGlwZSwgImV4aXQ6IikgPT0gc2lncGlwZSkgewotCQlpZ25vcmVfc2lncyhzaWdwaXBlKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc2lncGlwZSwgImlnbm9yZSIpKSB7Ci0jaWZkZWYgU0lHX0lHTgotCQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc2lncGlwZSwgImV4aXQiKSkgewotCQlyZmJMb2coImluaXRpYWxpemVfc2lnbmFsczogd2lsbCBleGl0IG9uIFNJR1BJUEVcbiIpOwotCQlzaWduYWwoU0lHUElQRSwgaW50ZXJydXB0ZWQpOwotCX0KLQotI2lmIE5PX1gxMQotCXJldHVybjsKLSNlbHNlCi0JWF9MT0NLOwotCVhlcnJvcl9kZWYgPSBYU2V0RXJyb3JIYW5kbGVyKFhlcnJvcik7Ci0JWElPZXJyX2RlZiA9IFhTZXRJT0Vycm9ySGFuZGxlcihYSU9lcnIpOwotCVhfVU5MT0NLOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIHVuc2V0X3NpZ25hbHModm9pZCkgewotCXNpZ25hbChTSUdIVVAsICBTSUdfREZMKTsKLQlzaWduYWwoU0lHSU5ULCAgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOwotCXNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLQlzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR0JVUywgIFNJR19ERkwpOwotCXNpZ25hbChTSUdTRUdWLCBTSUdfREZMKTsKLQlzaWduYWwoU0lHRlBFLCAgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOwotfQotCi12b2lkIGNsb3NlX2V4ZWNfZmRzKHZvaWQpIHsKLQlpbnQgZmQ7Ci0jaWZkZWYgRkRfQ0xPRVhFQwotCWZvciAoZmQgPSAzOyBmZCA8IDY0OyBmZCsrKSB7Ci0JCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZEKTsKLQkJaWYgKGZsYWdzICE9IC0xKSB7Ci0JCQlmbGFncyB8PSBGRF9DTE9FWEVDOwotCQkJZmNudGwoZmQsIEZfU0VURkQsIGZsYWdzKTsKLQkJfQotCX0KLSNlbmRpZgotfQotCi1pbnQga25vd25fc2lncGlwZV9tb2RlKGNoYXIgKnMpIHsKLS8qCi0gKiBza2lwLCBpZ25vcmUsIGV4aXQKLSAqLwotCWlmIChzdHJzdHIocywgImlnbm9yZToiKSA9PSBzKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoc3Ryc3RyKHMsICJleGl0OiIpID09IHMpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChzdHJjbXAocywgInNraXAiKSAmJiBzdHJjbXAocywgImlnbm9yZSIpICYmIAotCSAgICBzdHJjbXAocywgImV4aXQiKSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL2NsZWFudXAuaCBiL3gxMXZuYy9jbGVhbnVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGRjZWEuLjAwMDAwMDAKLS0tIGEveDExdm5jL2NsZWFudXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX0NMRUFOVVBfSAotI2RlZmluZSBfWDExVk5DX0NMRUFOVVBfSAotCi0vKiAtLSBjbGVhbnVwLmggLS0gKi8KLQotZXh0ZXJuIGludCB0cmFwcGVkX3hlcnJvcjsKLWV4dGVybiBpbnQgdHJhcHBlZF94aW9lcnJvcjsKLWV4dGVybiBpbnQgdHJhcHBlZF9nZXRpbWFnZV94ZXJyb3I7Ci1leHRlcm4gaW50IHRyYXBwZWRfcmVjb3JkX3hlcnJvcjsKLWV4dGVybiBYRXJyb3JFdmVudCAqdHJhcHBlZF94ZXJyb3JfZXZlbnQ7Ci0KLWV4dGVybiBpbnQgY3Jhc2hfZGVidWc7Ci0KLWV4dGVybiB2b2lkIGNsZWFuX3NobShpbnQgcXVpY2spOwotZXh0ZXJuIHZvaWQgY2xlYW5fdXBfZXhpdChpbnQgcmV0KTsKLQotZXh0ZXJuIGludCB0cmFwX3hlcnJvcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZXJyb3IpOwotZXh0ZXJuIGludCB0cmFwX3hpb2Vycm9yKERpc3BsYXkgKmQpOwotZXh0ZXJuIGludCB0cmFwX2dldGltYWdlX3hlcnJvcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZXJyb3IpOwotZXh0ZXJuIGNoYXIgKnhlcnJvcl9zdHJpbmcoWEVycm9yRXZlbnQgKmVycm9yKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfY3Jhc2hfaGFuZGxlcih2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfc2lnbmFscyh2b2lkKTsKLWV4dGVybiB2b2lkIHVuc2V0X3NpZ25hbHModm9pZCk7Ci1leHRlcm4gdm9pZCBjbG9zZV9leGVjX2Zkcyh2b2lkKTsKLWV4dGVybiBpbnQga25vd25fc2lncGlwZV9tb2RlKGNoYXIgKnMpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19DTEVBTlVQX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9jb25uZWN0aW9ucy5jIGIveDExdm5jL2Nvbm5lY3Rpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTliNWMuLjAwMDAwMDAKLS0tIGEveDExdm5jL2Nvbm5lY3Rpb25zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDM3ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gY29ubmVjdGlvbnMuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgImd1aS5oIgotI2luY2x1ZGUgInNvbGlkLmgiCi0jaW5jbHVkZSAicmF0ZXMuaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLSNpbmNsdWRlICJ1bml4cHcuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotI2luY2x1ZGUgInNzbGNtZHMuaCIKLSNpbmNsdWRlICJzc2xoZWxwZXIuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJ4ZXZlbnRzLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAibWFjb3N4LmgiCi0jaW5jbHVkZSAibWFjb3N4Q0cuaCIKLSNpbmNsdWRlICJ1c2VyaW5wdXQuaCIKLSNpbmNsdWRlICJwb2ludGVyLmgiCi0jaW5jbHVkZSAieHJhbmRyLmgiCi0KLS8qCi0gKiByb3V0aW5lcyBmb3IgaGFuZGxpbmcgaW5jb21pbmcsIG91dGdvaW5nLCBldGMgY29ubmVjdGlvbnMKLSAqLwotCi0vKiBzdHJpbmcgZm9yIHRoZSBWTkNfQ09OTkVDVCBwcm9wZXJ0eSAqLwotY2hhciB2bmNfY29ubmVjdF9zdHJbVk5DX0NPTk5FQ1RfTUFYKzFdOwotQXRvbSB2bmNfY29ubmVjdF9wcm9wID0gTm9uZTsKLWNoYXIgeDExdm5jX3JlbW90ZV9zdHJbWDExVk5DX1JFTU9URV9NQVgrMV07Ci1BdG9tIHgxMXZuY19yZW1vdGVfcHJvcCA9IE5vbmU7Ci1yZmJDbGllbnRQdHIgaW5ldGRfY2xpZW50ID0gTlVMTDsKLQotaW50IGFsbF9jbGllbnRzX2luaXRpYWxpemVkKHZvaWQpOwotY2hhciAqbGlzdF9jbGllbnRzKHZvaWQpOwotaW50IG5ld19mYl9zaXplX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLXZvaWQgY2xvc2VfYWxsX2NsaWVudHModm9pZCk7Ci12b2lkIGNsb3NlX2NsaWVudHMoY2hhciAqc3RyKTsKLXZvaWQgc2V0X2NsaWVudF9pbnB1dChjaGFyICpzdHIpOwotdm9pZCBzZXRfY2hpbGRfaW5mbyh2b2lkKTsKLWludCBjbWRfb2soY2hhciAqY21kKTsKLXZvaWQgY2xpZW50X2dvbmUocmZiQ2xpZW50UHRyIGNsaWVudCk7Ci12b2lkIGNsaWVudF9nb25lX2NoYXRfaGVscGVyKHJmYkNsaWVudFB0ciBjbGllbnQpOwotdm9pZCByZXZlcnNlX2Nvbm5lY3QoY2hhciAqc3RyKTsKLXZvaWQgc2V0X3ZuY19jb25uZWN0X3Byb3AoY2hhciAqc3RyKTsKLXZvaWQgcmVhZF92bmNfY29ubmVjdF9wcm9wKGludCk7Ci12b2lkIHNldF94MTF2bmNfcmVtb3RlX3Byb3AoY2hhciAqc3RyKTsKLXZvaWQgcmVhZF94MTF2bmNfcmVtb3RlX3Byb3AoaW50KTsKLXZvaWQgY2hlY2tfY29ubmVjdF9pbnB1dHModm9pZCk7Ci12b2lkIGNoZWNrX2d1aV9pbnB1dHModm9pZCk7Ci1yZmJDbGllbnRQdHIgY3JlYXRlX25ld19jbGllbnQoaW50IHNvY2ssIGludCBzdGFydF90aHJlYWQpOwotZW51bSByZmJOZXdDbGllbnRBY3Rpb24gbmV3X2NsaWVudChyZmJDbGllbnRQdHIgY2xpZW50KTsKLWVudW0gcmZiTmV3Q2xpZW50QWN0aW9uIG5ld19jbGllbnRfY2hhdF9oZWxwZXIocmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1yZmJCb29sIHBhc3N3b3JkX2NoZWNrX2NoYXRfaGVscGVyKHJmYkNsaWVudFB0ciBjbCwgY29uc3QgY2hhciogcmVzcG9uc2UsIGludCBsZW4pOwotdm9pZCBzdGFydF9jbGllbnRfaW5mb19zb2NrKGNoYXIgKmhvc3RfcG9ydF9jb29raWUpOwotdm9pZCBzZW5kX2NsaWVudF9pbmZvKGNoYXIgKnN0cik7Ci12b2lkIGFkanVzdF9ncmFicyhpbnQgZ3JhYiwgaW50IHF1aWV0KTsKLXZvaWQgY2hlY2tfbmV3X2NsaWVudHModm9pZCk7Ci1pbnQgYWNjZXB0X2NsaWVudChyZmJDbGllbnRQdHIgY2xpZW50KTsKLXZvaWQgY2hlY2tfaXB2Nl9saXN0ZW4obG9uZyB1c2VjKTsKLXZvaWQgY2hlY2tfdW5peF9zb2NrKGxvbmcgdXNlYyk7Ci1pbnQgcnVuX3VzZXJfY29tbWFuZChjaGFyICpjbWQsIHJmYkNsaWVudFB0ciBjbGllbnQsIGNoYXIgKm1vZGUsIGNoYXIgKmlucHV0LAotICAgIGludCBsZW4sIEZJTEUgKm91dHB1dCk7Ci1pbnQgY2hlY2tfYWNjZXNzKGNoYXIgKmFkZHIpOwotdm9pZCBjbGllbnRfc2V0X25ldChyZmJDbGllbnRQdHIgY2xpZW50KTsKLWNoYXIgKmdldF94cHJvcChjaGFyICpwcm9wLCBXaW5kb3cgd2luKTsKLWludCBzZXRfeHByb3AoY2hhciAqcHJvcCwgV2luZG93IHdpbiwgY2hhciAqdmFsdWUpOwotY2hhciAqYmN4X3hhdHRhY2goY2hhciAqc3RyLCBpbnQgKnBnX2luaXQsIGludCAqa2dfaW5pdCk7Ci12b2lkIGdyYWJfc3RhdGUoaW50ICpwdHJfZ3JhYmJlZCwgaW50ICprYmRfZ3JhYmJlZCk7Ci1jaGFyICp3aW5pbmZvKFdpbmRvdyB3aW4sIGludCBzaG93X2NoaWxkcmVuKTsKLQotc3RhdGljIHJmYkNsaWVudFB0ciAqY2xpZW50X21hdGNoKGNoYXIgKnN0cik7Ci1zdGF0aWMgdm9pZCBmcmVlX2NsaWVudF9kYXRhKHJmYkNsaWVudFB0ciBjbGllbnQpOwotc3RhdGljIHZvaWQgdWdseV9nZW9tKGNoYXIgKnAsIGludCAqeCwgaW50ICp5KTsKLXN0YXRpYyBpbnQgdWdseV93aW5kb3coY2hhciAqYWRkciwgY2hhciAqdXNlcmhvc3QsIGludCBYLCBpbnQgWSwKLSAgICBpbnQgdGltZW91dCwgY2hhciAqbW9kZSwgaW50IGFjY2VwdCk7Ci1zdGF0aWMgaW50IGFjdGlvbl9tYXRjaChjaGFyICphY3Rpb24sIGludCByYyk7Ci1zdGF0aWMgdm9pZCBjaGVja19jb25uZWN0X2ZpbGUoY2hhciAqZmlsZSk7Ci1zdGF0aWMgdm9pZCBzZW5kX2NsaWVudF9jb25uZWN0KHZvaWQpOwotCi0KLS8qCi0gKiBjaGVjayB0aGF0IGFsbCBjbGllbnRzIGFyZSBpbiBSRkJfTk9STUFMIHN0YXRlCi0gKi8KLWludCBhbGxfY2xpZW50c19pbml0aWFsaXplZCh2b2lkKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IG9rID0gMTsKLQotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm4gb2s7Ci0JfQotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCWlmIChjbC0+c3RhdGUgIT0gUkZCX05PUk1BTCkgewotCQkJb2sgPSAwOwotCQl9IGVsc2UgewotCQkJY2xpZW50X25vcm1hbF9jb3VudCsrOwotCQl9Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQotCXJldHVybiBvazsKLX0KLQotY2hhciAqbGlzdF9jbGllbnRzKHZvaWQpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQljaGFyICpsaXN0LCB0bXBbMjU2XTsKLQlpbnQgY291bnQgPSAwOwotCi0JaWYgKCFzY3JlZW4pIHsKLQkJcmV0dXJuIHN0cmR1cCgiIik7Ci0JfQotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCWNsaWVudF9zZXRfbmV0KGNsKTsKLQkJY291bnQrKzsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JLyoKLQkgKiBlYWNoIGNsaWVudDoKLSAgICAgICAgICogPGlkPjo8aXA+Ojxwb3J0Pjo8dXNlcj46PHVuaXg+Ojxob3N0bmFtZT46PGlucHV0Pjo8bG9naW52aWV3Pjo8dGltZT4sCi0JICogOCsxKzY0KzErNSsxKzI0KzErMjQrMSsyNTYrMSs1KzErMSsxKzEwKzEKLQkgKiAxMjMuMTIzLjEyMy4xMjM6NjAwMDAvMHgxMTExMTExMS1ydywKLQkgKiBzbyBjb3VudCsxICogMTAwMCBtdXN0IGNvdmVyIGl0LgotCSAqLwotCWxpc3QgPSAoY2hhciAqKSBtYWxsb2MoKGNvdW50KzEpKjEwMDApOwotCQotCWxpc3RbMF0gPSAnXDAnOwotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2wtPmNsaWVudERhdGE7Ci0JCWNoYXIgKnRtcF9ob3N0LCAqcDsKLQotCQlpZiAoISBjZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCpsaXN0ICE9ICdcMCcpIHsKLQkJCXN0cmNhdChsaXN0LCAiLCIpOwotCQl9Ci0JCXNwcmludGYodG1wLCAiMHgleDoiLCBjZC0+dWlkKTsKLQkJc3RyY2F0KGxpc3QsIHRtcCk7Ci0JCXAgPSB0bXBfaG9zdCA9IHN0cmR1cChjbC0+aG9zdCk7Ci0JCXdoaWxlICgqcCkgewotCQkJaWYgKCpwID09ICc6JykgKnAgPSAnIyc7Ci0JCQlwKys7Ci0JCX0KLQkJc3RyY2F0KGxpc3QsIHRtcF9ob3N0KTsKLQkJZnJlZSh0bXBfaG9zdCk7Ci0JCXN0cmNhdChsaXN0LCAiOiIpOwotCQlzcHJpbnRmKHRtcCwgIiVkOiIsIGNkLT5jbGllbnRfcG9ydCk7Ci0JCXN0cmNhdChsaXN0LCB0bXApOwotCQlpZiAoY2QtPnVzZXJuYW1lWzBdID09ICdcMCcpIHsKLQkJCWNoYXIgKnMgPSBpZGVudF91c2VybmFtZShjbCk7Ci0JCQlpZiAocykgZnJlZShzKTsKLQkJfQotCQlpZiAoc3Ryc3RyKGNkLT51c2VybmFtZSwgIlVOSVg6IikgPT0gY2QtPnVzZXJuYW1lKSB7Ci0JCQlzdHJjYXQobGlzdCwgY2QtPnVzZXJuYW1lICsgc3RybGVuKCJVTklYOiIpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cmNhdChsaXN0LCBjZC0+dXNlcm5hbWUpOwotCQl9Ci0JCXN0cmNhdChsaXN0LCAiOiIpOwotCQlpZiAoY2QtPnVuaXhuYW1lWzBdID09ICdcMCcpIHsKLQkJCXN0cmNhdChsaXN0LCAibm9uZSIpOwotCQl9IGVsc2UgewotCQkJc3RyY2F0KGxpc3QsIGNkLT51bml4bmFtZSk7Ci0JCX0KLQkJc3RyY2F0KGxpc3QsICI6Iik7Ci0JCXAgPSB0bXBfaG9zdCA9IHN0cmR1cChjZC0+aG9zdG5hbWUpOwotCQl3aGlsZSAoKnApIHsKLQkJCWlmICgqcCA9PSAnOicpICpwID0gJyMnOwotCQkJcCsrOwotCQl9Ci0JCXN0cmNhdChsaXN0LCB0bXBfaG9zdCk7Ci0JCWZyZWUodG1wX2hvc3QpOwotCQlzdHJjYXQobGlzdCwgIjoiKTsKLQkJc3RyY2F0KGxpc3QsIGNkLT5pbnB1dCk7Ci0JCXN0cmNhdChsaXN0LCAiOiIpOwotCQlzcHJpbnRmKHRtcCwgIiVkIiwgY2QtPmxvZ2luX3ZpZXdvbmx5KTsKLQkJc3RyY2F0KGxpc3QsIHRtcCk7Ci0JCXN0cmNhdChsaXN0LCAiOiIpOwotCQlzcHJpbnRmKHRtcCwgIiVkIiwgKGludCkgY2QtPmxvZ2luX3RpbWUpOwotCQlzdHJjYXQobGlzdCwgdG1wKTsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCXJldHVybiBsaXN0OwotfQotCi0vKiBjb3VudCBudW1iZXIgb2YgY2xpZW50cyBzdXBwb3J0aW5nIE5ld0ZCU2l6ZSAqLwotaW50IG5ld19mYl9zaXplX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGNvdW50ID0gMDsKLQotCWlmICghIHMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHMpOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQlpZiAoY2wtPnVzZU5ld0ZCU2l6ZSkgewotCQkJY291bnQrKzsKLQkJfQotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci0JcmV0dXJuIGNvdW50OwotfQotCi12b2lkIGNsb3NlX2FsbF9jbGllbnRzKHZvaWQpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCXJmYkNsb3NlQ2xpZW50KGNsKTsKLQkJcmZiQ2xpZW50Q29ubmVjdGlvbkdvbmUoY2wpOwotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci19Ci0KLXN0YXRpYyByZmJDbGllbnRQdHIgKmNsaWVudF9tYXRjaChjaGFyICpzdHIpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbCwgKmNsX2xpc3Q7Ci0JaW50IGksIG4sIGhvc3Rfd2FybiA9IDAsIGhleF93YXJuID0gMDsKLQotCW4gPSBjbGllbnRfY291bnQgKyAxMDsKLQljbF9saXN0ID0gKHJmYkNsaWVudFB0ciAqKSBtYWxsb2MobiAqIHNpemVvZihyZmJDbGllbnRQdHIpKTsKLQkKLQlpID0gMDsKLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJQ2xpZW50RGF0YSAqY2QgPSAoQ2xpZW50RGF0YSAqKSBjbC0+Y2xpZW50RGF0YTsKLQkJaWYgKHN0cnN0cihzdHIsICIweCIpID09IHN0cikgewotCQkJdW5zaWduZWQgaW50IGluOwotCQkJaW50IGlkOwotCQkJaWYgKCEgY2QpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChzc2NhbmYoc3RyLCAiMHgleCIsICZpbikgIT0gMSkgewotCQkJCWlmIChoZXhfd2FybisrKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZmJMb2coInNraXBwaW5nIGludmFsaWQgY2xpZW50IGhleCBpZDogJXNcbiIsCi0JCQkJICAgIHN0cik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZCA9ICh1bnNpZ25lZCBpbnQpIGluOwotCQkJaWYgKGNkLT51aWQgPT0gaWQpIHsKLQkJCQljbF9saXN0W2krK10gPSBjbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBwb3J0ID0gLTE7Ci0JCQljaGFyICpyc3RyID0gc3RyZHVwKHN0cik7Ci0JCQljaGFyICpxID0gc3RycmNocihyc3RyLCAnOicpOwotCQkJaWYgKHEpIHsKLQkJCQlwb3J0ID0gYXRvaShxKzEpOwotCQkJCSpxID0gJ1wwJzsKLQkJCQlpZiAocG9ydCA9PSAwICYmIHFbMV0gIT0gJzAnKSB7Ci0JCQkJCXBvcnQgPSAtMTsKLQkJCQl9IGVsc2UgaWYgKHBvcnQgPCAwKSB7Ci0JCQkJCXBvcnQgPSAtcG9ydDsKLQkJCQl9IGVsc2UgaWYgKHBvcnQgPCAyMDApIHsKLQkJCQkJcG9ydCA9IDU1MDAgKyBwb3J0OwotCQkJCX0KLQkJCX0KLQkJCWlmIChpcHY2X2lwKHN0cikpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKCEgZG90dGVkX2lwKHN0ciwgMCkpIHsKLQkJCQljaGFyICpvcmlnID0gcnN0cjsKLQkJCQlyc3RyID0gaG9zdDJpcChyc3RyKTsKLQkJCQlmcmVlKG9yaWcpOwotCQkJCWlmIChyc3RyID09IE5VTEwgfHwgKnJzdHIgPT0gJ1wwJykgewotCQkJCQlpZiAoaG9zdF93YXJuKyspIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJmYkxvZygic2tpcHBpbmcgYmFkIGxvb2t1cDogXCIlc1wiXG4iLCBzdHIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmZiTG9nKCJsb29rdXA6ICVzIC0+ICVzIHBvcnQ9JWRcbiIsIHN0ciwgcnN0ciwgcG9ydCk7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChyc3RyLCBjbC0+aG9zdCkpIHsKLQkJCQlpbnQgb2sgPSAxOwotCQkJCWlmIChwb3J0ID4gMCkgewotCQkJCQlpZiAoY2QgIT0gTlVMTCAmJiBjZC0+Y2xpZW50X3BvcnQgPiAwKSB7Ci0JCQkJCQlpZiAoY2QtPmNsaWVudF9wb3J0ICE9IHBvcnQpIHsKLQkJCQkJCQlvayA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbnQgY3BvcnQgPSBnZXRfcmVtb3RlX3BvcnQoY2wtPnNvY2spOwotCQkJCQkJaWYgKGNwb3J0ICE9IHBvcnQpIHsKLQkJCQkJCQlvayA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9rKSB7Ci0JCQkJCWNsX2xpc3RbaSsrXSA9IGNsOwotCQkJCX0KLQkJCX0KLQkJCWZyZWUocnN0cik7Ci0JCX0KLQkJaWYgKGkgPj0gbiAtIDEpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQotCWNsX2xpc3RbaV0gPSBOVUxMOwotCi0JcmV0dXJuIGNsX2xpc3Q7Ci19Ci0KLXZvaWQgY2xvc2VfY2xpZW50cyhjaGFyICpzdHIpIHsKLQlyZmJDbGllbnRQdHIgKmNsX2xpc3QsICpjcDsKLQotCWlmICghc3RyY21wKHN0ciwgImFsbCIpIHx8ICFzdHJjbXAoc3RyLCAiKiIpKSB7Ci0JCWNsb3NlX2FsbF9jbGllbnRzKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoISBzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQkKLQljbF9saXN0ID0gY2xpZW50X21hdGNoKHN0cik7Ci0KLQljcCA9IGNsX2xpc3Q7Ci0Jd2hpbGUgKCpjcCkgewotCQlyZmJDbG9zZUNsaWVudCgqY3ApOwotCQlyZmJDbGllbnRDb25uZWN0aW9uR29uZSgqY3ApOwotCQljcCsrOwotCX0KLQlmcmVlKGNsX2xpc3QpOwotfQotCi12b2lkIHNldF9jbGllbnRfaW5wdXQoY2hhciAqc3RyKSB7Ci0JcmZiQ2xpZW50UHRyICpjbF9saXN0LCAqY3A7Ci0JY2hhciAqcCwgKnZhbDsKLQotCS8qIHN0ciBpcyAibWF0Y2g6dmFsdWUiICovCi0KLQlpZiAoISBzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQotCXAgPSBzdHJyY2hyKHN0ciwgJzonKTsKLQlpZiAoISBwKSB7Ci0JCXJldHVybjsKLQl9Ci0JKnAgPSAnXDAnOwotCXArKzsKLQl2YWwgPSBzaG9ydF9rbWJjZihwKTsKLQkKLQljbF9saXN0ID0gY2xpZW50X21hdGNoKHN0cik7Ci0KLQljcCA9IGNsX2xpc3Q7Ci0Jd2hpbGUgKCpjcCkgewotCQlDbGllbnREYXRhICpjZCA9IChDbGllbnREYXRhICopICgqY3ApLT5jbGllbnREYXRhOwotCQlpZiAoISBjZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJY2QtPmlucHV0WzBdID0gJ1wwJzsKLQkJc3RyY2F0KGNkLT5pbnB1dCwgIl8iKTsKLQkJc3RyY2F0KGNkLT5pbnB1dCwgdmFsKTsKLQkJY3ArKzsKLQl9Ci0KLQlmcmVlKHZhbCk7Ci0JZnJlZShjbF9saXN0KTsKLX0KLQotdm9pZCBzZXRfY2hpbGRfaW5mbyh2b2lkKSB7Ci0JY2hhciBwaWRbMTZdOwotCS8qIHNldCB1cCB1c2VmdWwgZW52aXJvbm1lbnQgZm9yIGNoaWxkIHByb2Nlc3MgKi8KLQlzcHJpbnRmKHBpZCwgIiVkIiwgKGludCkgZ2V0cGlkKCkpOwotCXNldF9lbnYoIlgxMVZOQ19QSUQiLCBwaWQpOwotCWlmIChwcm9ncmFtX25hbWUpIHsKLQkJLyogZS5nLiBmb3IgcmVtb3RlIGNvbnRyb2wgLVIgKi8KLQkJc2V0X2VudigiWDExVk5DX1BST0ciLCBwcm9ncmFtX25hbWUpOwotCX0KLQlpZiAocHJvZ3JhbV9jbWRsaW5lKSB7Ci0JCXNldF9lbnYoIlgxMVZOQ19DTURMSU5FIiwgcHJvZ3JhbV9jbWRsaW5lKTsKLQl9Ci0JaWYgKHJhd19mYl9zdHIpIHsKLQkJc2V0X2VudigiWDExVk5DX1JBV0ZCX1NUUiIsIHJhd19mYl9zdHIpOwotCX0gZWxzZSB7Ci0JCXNldF9lbnYoIlgxMVZOQ19SQVdGQl9TVFIiLCAiIik7Ci0JfQotfQotCi1pbnQgY21kX29rKGNoYXIgKmNtZCkgewotCWNoYXIgKnAsICpzdHI7Ci0JaWYgKG5vX2V4dGVybmFsX2NtZHMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIGNtZCB8fCBjbWRbMF0gPT0gJ1wwJykgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgYWxsb3dlZF9leHRlcm5hbF9jbWRzKSB7Ci0JCS8qIGRlZmF1bHQsIGFsbG93IGFueSAob3ZlcnJpZGRlbiBieSAtbm9jbWRzKSAqLwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlzdHIgPSBzdHJkdXAoYWxsb3dlZF9leHRlcm5hbF9jbWRzKTsKLQlwID0gc3RydG9rKHN0ciwgIiwiKTsKLQl3aGlsZSAocCkgewotCQlpZiAoIXN0cmNtcChwLCBjbWQpKSB7Ci0JCQlmcmVlKHN0cik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUoc3RyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHV0aWxpdHkgdG8gcnVuIGEgdXNlciBzdXBwbGllZCBjb21tYW5kIHNldHRpbmcgc29tZSBSRkJfIGVudiB2YXJzLgotICogdXNlZCBieSwgZS5nLiwgYWNjZXB0X2NsaWVudCgpIGFuZCBjbGllbnRfZ29uZSgpCi0gKi8KLWludCBydW5fdXNlcl9jb21tYW5kKGNoYXIgKmNtZCwgcmZiQ2xpZW50UHRyIGNsaWVudCwgY2hhciAqbW9kZSwgY2hhciAqaW5wdXQsCi0gICBpbnQgbGVuLCBGSUxFICpvdXRwdXQpIHsKLQljaGFyICpvbGRfZGlzcGxheSA9IE5VTEw7Ci0JY2hhciAqYWRkciA9IE5VTEw7Ci0JY2hhciBzdHJbMTAwXTsKLQlpbnQgcmMsIG9rOwotCUNsaWVudERhdGEgKmNkID0gTlVMTDsKLQljbGllbnRfc2V0X25ldChjbGllbnQpOwotCWlmIChjbGllbnQgIT0gTlVMTCkgewotCQljZCA9IChDbGllbnREYXRhICopIGNsaWVudC0+Y2xpZW50RGF0YTsKLQkJYWRkciA9IGNsaWVudC0+aG9zdDsKLQl9Ci0KLQlpZiAoYWRkciA9PSBOVUxMIHx8IGFkZHJbMF0gPT0gJ1wwJykgewotCQlhZGRyID0gInVua25vd24taG9zdCI7Ci0JfQotCi0JLyogc2V0IFJGQl9DTElFTlRfSUQgdG8gc2VtaSB1bmlxdWUgaWQgZm9yIGNvbW1hbmQgdG8gdXNlICovCi0JaWYgKGNkICYmIGNkLT51aWQpIHsKLQkJc3ByaW50ZihzdHIsICIweCV4IiwgY2QtPnVpZCk7Ci0JfSBlbHNlIHsKLQkJLyogbm90IGFjY2VwdGVkIHlldDogKi8KLQkJc3ByaW50ZihzdHIsICIweCV4IiwgY2xpZW50c19zZXJ2ZWQpOwotCX0KLQlzZXRfZW52KCJSRkJfQ0xJRU5UX0lEIiwgc3RyKTsKLQotCS8qIHNldCBSRkJfQ0xJRU5UX0lQIHRvIElQIGFkZHIgZm9yIGNvbW1hbmQgdG8gdXNlICovCi0Jc2V0X2VudigiUkZCX0NMSUVOVF9JUCIsIGFkZHIpOwotCi0JLyogc2V0IFJGQl9YMTFWTkNfUElEIHRvIG91ciBwaWQgZm9yIGNvbW1hbmQgdG8gdXNlICovCi0Jc3ByaW50ZihzdHIsICIlZCIsIChpbnQpIGdldHBpZCgpKTsKLQlzZXRfZW52KCJSRkJfWDExVk5DX1BJRCIsIHN0cik7Ci0KLQlpZiAoY2xpZW50ID09IE5VTEwpIHsKLQkJOwotCX0gZWxzZSBpZiAoY2xpZW50LT5zdGF0ZSA9PSBSRkJfUFJPVE9DT0xfVkVSU0lPTikgewotCQlzZXRfZW52KCJSRkJfU1RBVEUiLCAiUFJPVE9DT0xfVkVSU0lPTiIpOwotCX0gZWxzZSBpZiAoY2xpZW50LT5zdGF0ZSA9PSBSRkJfU0VDVVJJVFlfVFlQRSkgewotCQlzZXRfZW52KCJSRkJfU1RBVEUiLCAiU0VDVVJJVFlfVFlQRSIpOwotCX0gZWxzZSBpZiAoY2xpZW50LT5zdGF0ZSA9PSBSRkJfQVVUSEVOVElDQVRJT04pIHsKLQkJc2V0X2VudigiUkZCX1NUQVRFIiwgIkFVVEhFTlRJQ0FUSU9OIik7Ci0JfSBlbHNlIGlmIChjbGllbnQtPnN0YXRlID09IFJGQl9JTklUSUFMSVNBVElPTikgewotCQlzZXRfZW52KCJSRkJfU1RBVEUiLCAiSU5JVElBTElTQVRJT04iKTsKLQl9IGVsc2UgaWYgKGNsaWVudC0+c3RhdGUgPT0gUkZCX05PUk1BTCkgewotCQlzZXRfZW52KCJSRkJfU1RBVEUiLCAiTk9STUFMIik7Ci0JfSBlbHNlIHsKLQkJc2V0X2VudigiUkZCX1NUQVRFIiwgIlVOS05PV04iKTsKLQl9Ci0JaWYgKGNlcnRyZXRfc3RyKSB7Ci0JCXNldF9lbnYoIlJGQl9TU0xfQ0xJRU5UX0NFUlQiLCBjZXJ0cmV0X3N0cik7Ci0JfSBlbHNlIHsKLQkJc2V0X2VudigiUkZCX1NTTF9DTElFTlRfQ0VSVCIsICIiKTsKLQl9Ci0KLQkvKiBzZXQgUkZCX0NMSUVOVF9QT1JUIHRvIHBlZXIgcG9ydCBmb3IgY29tbWFuZCB0byB1c2UgKi8KLQlpZiAoY2QgJiYgY2QtPmNsaWVudF9wb3J0ID4gMCkgewotCQlzcHJpbnRmKHN0ciwgIiVkIiwgY2QtPmNsaWVudF9wb3J0KTsKLQl9IGVsc2UgaWYgKGNsaWVudCkgewotCQlzcHJpbnRmKHN0ciwgIiVkIiwgZ2V0X3JlbW90ZV9wb3J0KGNsaWVudC0+c29jaykpOwotCX0KLQlzZXRfZW52KCJSRkJfQ0xJRU5UX1BPUlQiLCBzdHIpOwotCi0Jc2V0X2VudigiUkZCX01PREUiLCBtb2RlKTsKLQotCS8qIAotCSAqIG5vdyBkbyBSRkJfU0VSVkVSX0lQIGFuZCBSRkJfU0VSVkVSX1BPUlQgKGkuZS4gdXMhKQotCSAqIFRoaXMgd2lsbCBlc3RhYmxpc2ggYSA1LXR1cGxlIChpbmNsdWRpbmcgdGNwKSB0aGUgZXh0ZXJuYWwKLQkgKiBwcm9ncmFtIGNhbiBwb3RlbnRpYWxseSB1c2UgdG8gd29yayBvdXQgdGhlIHZpcnR1YWwgY2lyY3VpdAotCSAqIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0JICovCi0JaWYgKGNkICYmIGNkLT5zZXJ2ZXJfaXApIHsKLQkJc2V0X2VudigiUkZCX1NFUlZFUl9JUCIsIGNkLT5zZXJ2ZXJfaXApOwotCX0gZWxzZSBpZiAoY2xpZW50KSB7Ci0JCWNoYXIgKnNpcCA9IGdldF9sb2NhbF9ob3N0KGNsaWVudC0+c29jayk7Ci0JCXNldF9lbnYoIlJGQl9TRVJWRVJfSVAiLCBzaXApOwotCQlpZiAoc2lwKSBmcmVlKHNpcCk7Ci0JfQotCi0JaWYgKGNkICYmIGNkLT5zZXJ2ZXJfcG9ydCA+IDApIHsKLQkJc3ByaW50ZihzdHIsICIlZCIsIGNkLT5zZXJ2ZXJfcG9ydCk7Ci0JfSBlbHNlIGlmIChjbGllbnQpIHsKLQkJc3ByaW50ZihzdHIsICIlZCIsIGdldF9sb2NhbF9wb3J0KGNsaWVudC0+c29jaykpOwotCX0KLQlzZXRfZW52KCJSRkJfU0VSVkVSX1BPUlQiLCBzdHIpOwotCi0JaWYgKGNkKSB7Ci0JCXNwcmludGYoc3RyLCAiJWQiLCBjZC0+bG9naW5fdmlld29ubHkpOwotCX0gZWxzZSB7Ci0JCXNwcmludGYoc3RyLCAiJWQiLCAtMSk7Ci0JfQotCXNldF9lbnYoIlJGQl9MT0dJTl9WSUVXT05MWSIsIHN0cik7Ci0KLQlpZiAoY2QpIHsKLQkJc3ByaW50ZihzdHIsICIlZCIsIChpbnQpIGNkLT5sb2dpbl90aW1lKTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKHN0ciwgIj4lZCIsIChpbnQpIHRpbWUoTlVMTCkpOwotCX0KLQlzZXRfZW52KCJSRkJfTE9HSU5fVElNRSIsIHN0cik7Ci0KLQlzcHJpbnRmKHN0ciwgIiVkIiwgKGludCkgdGltZShOVUxMKSk7Ci0Jc2V0X2VudigiUkZCX0NVUlJFTlRfVElNRSIsIHN0cik7Ci0KLQlpZiAoIWNkIHx8ICFjZC0+dXNlcm5hbWUgfHwgY2QtPnVzZXJuYW1lWzBdID09ICdcMCcpIHsKLQkJc2V0X2VudigiUkZCX1VTRVJOQU1FIiwgInVua25vd24tdXNlciIpOwotCX0gZWxzZSB7Ci0JCXNldF9lbnYoIlJGQl9VU0VSTkFNRSIsIGNkLT51c2VybmFtZSk7Ci0JfQotCS8qIAotCSAqIEJldHRlciBzZXQgRElTUExBWSB0byB0aGUgb25lIHdlIGFyZSBwb2xsaW5nLCBpZiB0aGV5Ci0JICogd2FudCBzb21ldGhpbmcgdHJpY2tpZXIsIHRoZXkgY2FuIGhhbmRsZSBvbiB0aGVpciBvd24KLQkgKiB2aWEgZW52aXJvbm1lbnQsIGV0Yy4gCi0JICovCi0JaWYgKGdldGVudigiRElTUExBWSIpKSB7Ci0JCW9sZF9kaXNwbGF5ID0gc3RyZHVwKGdldGVudigiRElTUExBWSIpKTsKLQl9Ci0KLQlpZiAocmF3X2ZiICYmICEgZHB5KSB7CS8qIHJhd19mYiBoYWNrICovCi0JCXNldF9lbnYoIkRJU1BMQVkiLCAicmF3ZmIiKTsKLQl9IGVsc2UgewotCQlzZXRfZW52KCJESVNQTEFZIiwgRGlzcGxheVN0cmluZyhkcHkpKTsKLQl9Ci0KLQkvKgotCSAqIHdvcmsgb3V0IHRoZSBudW1iZXIgb2YgY2xpZW50cyAoaGF2ZSB0byB1c2UgY2xpZW50X2NvdW50Ci0JICogc2luY2UgdGhlcmUgaXMgZGVhZGxvY2sgaW4gcmZiR2V0Q2xpZW50SXRlcmF0b3IpIAotCSAqLwotCXNwcmludGYoc3RyLCAiJWQiLCBjbGllbnRfY291bnQpOwotCXNldF9lbnYoIlJGQl9DTElFTlRfQ09VTlQiLCBzdHIpOwotCi0JLyogZ29uZSwgYWNjZXB0LCBhZnRlcmFjY2VwdCAqLwotCW9rID0gMDsKLQlpZiAoIXN0cmNtcChtb2RlLCAiZW52IikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghc3RyY21wKG1vZGUsICJhY2NlcHQiKSAmJiBjbWRfb2soImFjY2VwdCIpKSB7Ci0JCW9rID0gMTsKLQl9Ci0JaWYgKCFzdHJjbXAobW9kZSwgImFmdGVyYWNjZXB0IikgJiYgY21kX29rKCJhZnRlcmFjY2VwdCIpKSB7Ci0JCW9rID0gMTsKLQl9Ci0JaWYgKCFzdHJjbXAobW9kZSwgImdvbmUiKSAmJiBjbWRfb2soImdvbmUiKSkgewotCQlvayA9IDE7Ci0JfQotCWlmICghc3RyY21wKG1vZGUsICJjbWRfdmVyaWZ5IikgJiYgY21kX29rKCJ1bml4cHciKSkgewotCQlvayA9IDE7Ci0JfQotCWlmICghc3RyY21wKG1vZGUsICJyZWFkX3Bhc3N3ZHMiKSAmJiBjbWRfb2soInBhc3N3ZGZpbGUiKSkgewotCQlvayA9IDE7Ci0JfQotCWlmICghc3RyY21wKG1vZGUsICJjdXN0b21fcGFzc3dkIikgJiYgY21kX29rKCJjdXN0b21fcGFzc3dkIikpIHsKLQkJb2sgPSAxOwotCX0KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhb2spIHsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlyZmJMb2coImNhbm5vdCBydW4gZXh0ZXJuYWwgY29tbWFuZHMgaW4gLW5vY21kcyBtb2RlOlxuIik7Ci0JCXJmYkxvZygiICAgXCIlc1wiXG4iLCBjbWQpOwotCQlyZmJMb2coIiAgIGV4aXRpbmcuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JcmZiTG9nKCJydW5uaW5nIGNvbW1hbmQ6XG4iKTsKLQlpZiAoIXF1aWV0KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4gICVzXG5cbiIsIGNtZCk7Ci0JfQotCWNsb3NlX2V4ZWNfZmRzKCk7Ci0KLQlpZiAob3V0cHV0ICE9IE5VTEwpIHsKLQkJRklMRSAqcGg7Ci0JCWNoYXIgbGluZVsxMDI0XTsKLQkJY2hhciAqY21kMiA9IE5VTEw7Ci0JCWNoYXIgdG1wW10gPSAiL3RtcC94MTF2bmMtdG1wLlhYWFhYWCI7Ci0JCWludCBkZWx0bXAgPSAwOwotCi0JCWlmIChpbnB1dCAhPSBOVUxMKSB7Ci0JCQlpbnQgdG1wX2ZkID0gbWtzdGVtcCh0bXApOwotCQkJaWYgKHRtcF9mZCA8IDApIHsKLQkJCQlyZmJMb2coIm1rc3RlbXAgZmFpbGVkIG9uOiAlc1xuIiwgdG1wKTsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJd3JpdGUodG1wX2ZkLCBpbnB1dCwgbGVuKTsKLQkJCWNsb3NlKHRtcF9mZCk7Ci0JCQlkZWx0bXAgPSAxOwotCQkJY21kMiA9IChjaGFyICopIG1hbGxvYygxMDAgKyBzdHJsZW4odG1wKSArIHN0cmxlbihjbWQpKTsKLQkJCXNwcmludGYoY21kMiwgIi9iaW4vY2F0ICVzIHwgJXMiLCB0bXAsIGNtZCk7Ci0JCQkKLQkJCXBoID0gcG9wZW4oY21kMiwgInIiKTsKLQkJfSBlbHNlIHsKLQkJCXBoID0gcG9wZW4oY21kLCAiciIpOwotCQl9Ci0JCWlmIChwaCA9PSBOVUxMKSB7Ci0JCQlyZmJMb2coInBvcGVuKCVzKSBmYWlsZWQiLCBjbWQpOwotCQkJcmZiTG9nUGVycm9yKCJwb3BlbiIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKLQkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgcGgpICE9IE5VTEwpIHsKLQkJCWludCBqLCBrID0gLTE7Ci0JCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJsaW5lOiAlcyIsIGxpbmUpOwotCQkJLyogdGFrZSBjYXJlIHRvIGhhbmRsZSBlbWJlZGRlZCBudWxscyAqLwotCQkJZm9yIChqPTA7IGogPCAoaW50KSBzaXplb2YobGluZSk7IGorKykgewotCQkJCWlmIChsaW5lW2pdICE9ICdcMCcpIHsKLQkJCQkJayA9IGo7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGsgPj0gMCkgewotCQkJCXdyaXRlKGZpbGVubyhvdXRwdXQpLCBsaW5lLCBrKzEpOwotCQkJfQotCQkJbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7Ci0JCX0KLQotCQlyYyA9IHBjbG9zZShwaCk7Ci0KLQkJaWYgKGNtZDIgIT0gTlVMTCkgewotCQkJZnJlZShjbWQyKTsKLQkJfQotCQlpZiAoZGVsdG1wKSB7Ci0JCQl1bmxpbmsodG1wKTsKLQkJfQotCQlnb3RvIGdvdF9yYzsKLQl9IGVsc2UgaWYgKGlucHV0ICE9IE5VTEwpIHsKLQkJRklMRSAqcGggPSBwb3BlbihjbWQsICJ3Iik7Ci0JCWlmIChwaCA9PSBOVUxMKSB7Ci0JCQlyZmJMb2coInBvcGVuKCVzKSBmYWlsZWQiLCBjbWQpOwotCQkJcmZiTG9nUGVycm9yKCJwb3BlbiIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQl3cml0ZShmaWxlbm8ocGgpLCBpbnB1dCwgbGVuKTsKLQkJcmMgPSBwY2xvc2UocGgpOwotCQlnb3RvIGdvdF9yYzsKLQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JewotCQlwaWRfdCBwaWQsIHBpZHc7Ci0JCXN0cnVjdCBzaWdhY3Rpb24gc2EsIGludHIsIHF1aXQ7Ci0JCXNpZ3NldF90IG9tYXNrOwotCi0JCXNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotCQlzYS5zYV9mbGFncyA9IDA7Ci0JCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLQkJc2lnYWN0aW9uKFNJR0lOVCwgICZzYSwgJmludHIpOwotCQlzaWdhY3Rpb24oU0lHUVVJVCwgJnNhLCAmcXVpdCk7Ci0KLQkJc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdDSExEKTsKLQkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc2Euc2FfbWFzaywgJm9tYXNrKTsKLQotCQlpZiAoKHBpZCA9IGZvcmsoKSkgPiAwIHx8IHBpZCA9PSAtMSkgewotCi0JCQlpZiAocGlkICE9IC0xKSB7Ci0JCQkJcGlkdyA9IHdhaXRwaWQocGlkLCAmcmMsIDApOwotCQkJfQotCi0JCQlzaWdhY3Rpb24oU0lHSU5ULCAgJmludHIsIChzdHJ1Y3Qgc2lnYWN0aW9uICopIE5VTEwpOwotCQkJc2lnYWN0aW9uKFNJR1FVSVQsICZxdWl0LCAoc3RydWN0IHNpZ2FjdGlvbiAqKSBOVUxMKTsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIChzaWdzZXRfdCAqKSBOVUxMKTsKLQotCQkJaWYgKHBpZCA9PSAtMSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZvcmtcbiIpOwotCQkJCXJmYkxvZ1BlcnJvcigiZm9yayIpOwotCQkJCXJjID0gc3lzdGVtKGNtZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiB0aGlzIHNob3VsZCBjbG9zZSBwb3J0IDU5MDAsIGV0Yy4uICovCi0JCQlpbnQgZmQ7Ci0JCQlzaWdhY3Rpb24oU0lHSU5ULCAgJmludHIsIChzdHJ1Y3Qgc2lnYWN0aW9uICopIE5VTEwpOwotCQkJc2lnYWN0aW9uKFNJR1FVSVQsICZxdWl0LCAoc3RydWN0IHNpZ2FjdGlvbiAqKSBOVUxMKTsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIChzaWdzZXRfdCAqKSBOVUxMKTsKLQkJCWZvciAoZmQ9MzsgZmQ8MjU2OyBmZCsrKSB7Ci0JCQkJY2xvc2UoZmQpOwotCQkJfQotLyogWFhYIHRlc3QgbW9yZSAqLwotCQkJaWYgKCFzdHJjbXAobW9kZSwgImdvbmUiKSkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NFVFNJRAotCQkJCXNldHNpZCgpOwotI2Vsc2UKLQkJCQlzZXRwZ3JwKCk7Ci0jZW5kaWYKLQkJCX0KLQkJCWV4ZWNscCgiL2Jpbi9zaCIsICIvYmluL3NoIiwgIi1jIiwgY21kLCAoY2hhciAqKSBOVUxMKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0jZWxzZQotCXJjID0gc3lzdGVtKGNtZCk7Ci0jZW5kaWYKLQlnb3RfcmM6Ci0KLQlpZiAocmMgPj0gMjU2KSB7Ci0JCXJjID0gcmMvMjU2OwotCX0KLQlyZmJMb2coImNvbW1hbmQgcmV0dXJuZWQ6ICVkXG4iLCByYyk7Ci0KLQlpZiAob2xkX2Rpc3BsYXkpIHsKLQkJc2V0X2VudigiRElTUExBWSIsIG9sZF9kaXNwbGF5KTsKLQkJZnJlZShvbGRfZGlzcGxheSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2NsaWVudF9kYXRhKHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpZiAoISBjbGllbnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY2xpZW50LT5jbGllbnREYXRhKSB7Ci0JCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2xpZW50LT5jbGllbnREYXRhOwotCQlpZiAoY2QpIHsKLQkJCWlmIChjZC0+c2VydmVyX2lwKSB7Ci0JCQkJZnJlZShjZC0+c2VydmVyX2lwKTsKLQkJCQljZC0+c2VydmVyX2lwID0gTlVMTDsKLQkJCX0KLQkJCWlmIChjZC0+aG9zdG5hbWUpIHsKLQkJCQlmcmVlKGNkLT5ob3N0bmFtZSk7Ci0JCQkJY2QtPmhvc3RuYW1lID0gTlVMTDsKLQkJCX0KLQkJCWlmIChjZC0+dXNlcm5hbWUpIHsKLQkJCQlmcmVlKGNkLT51c2VybmFtZSk7Ci0JCQkJY2QtPnVzZXJuYW1lID0gTlVMTDsKLQkJCX0KLQkJCWlmIChjZC0+dW5peG5hbWUpIHsKLQkJCQlmcmVlKGNkLT51bml4bmFtZSk7Ci0JCQkJY2QtPnVuaXhuYW1lID0gTlVMTDsKLQkJCX0KLQkJfQotCQlmcmVlKGNsaWVudC0+Y2xpZW50RGF0YSk7Ci0JCWNsaWVudC0+Y2xpZW50RGF0YSA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFjY2VwdGVkX2NsaWVudCA9IDA7Ci0KLS8qCi0gKiBjYWxsYmFjayBmb3Igd2hlbiBhIGNsaWVudCBkaXNjb25uZWN0cwotICovCi12b2lkIGNsaWVudF9nb25lKHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlDbGllbnREYXRhICpjZCA9IE5VTEw7Ci0KLQlDTElFTlRfTE9DSzsKLQotCWNsaWVudF9jb3VudC0tOwotCWlmIChjbGllbnRfY291bnQgPCAwKSBjbGllbnRfY291bnQgPSAwOwotCi0Jc3BlZWRzX25ldF9yYXRlX21lYXN1cmVkID0gMDsKLQlzcGVlZHNfbmV0X2xhdGVuY3lfbWVhc3VyZWQgPSAwOwotCi0JcmZiTG9nKCJjbGllbnRfY291bnQ6ICVkXG4iLCBjbGllbnRfY291bnQpOwotCWxhc3RfY2xpZW50X2dvbmUgPSBkbm93KCk7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzICYmIHVuaXhwd19jbGllbnQpIHsKLQkJaWYgKGNsaWVudCA9PSB1bml4cHdfY2xpZW50KSB7Ci0JCQl1bml4cHdfaW5fcHJvZ3Jlc3MgPSAwOwotCQkJLyogbXV0ZXggKi8KLQkJCXNjcmVlbi0+cGVybWl0RmlsZVRyYW5zZmVyID0gdW5peHB3X2ZpbGVfeGZlcl9zYXZlOwotCQkJaWYgKCh0aWdodGZpbGV4ZmVyID0gdW5peHB3X3RpZ2h0dm5jX3hmZXJfc2F2ZSkpIHsKLSNpZmRlZiBMSUJWTkNTRVJWRVJfV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIKLQkJCQlyZmJMb2coInJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb246IDNcbiIpOwotCQkJCXJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb24oKTsKLSNlbmRpZgotCQkJfQotCQkJdW5peHB3X2NsaWVudCA9IE5VTEw7Ci0JCQljb3B5X3NjcmVlbigpOwotCQl9Ci0JfQotCi0KLQlpZiAobm9fYXV0b3JlcGVhdCAmJiBjbGllbnRfY291bnQgPT0gMCkgewotCQlhdXRvcmVwZWF0KDEsIDApOwotCX0KLQlpZiAodXNlX3NvbGlkX2JnICYmIGNsaWVudF9jb3VudCA9PSAwKSB7Ci0JCXNvbGlkX2JnKDEpOwotCX0KLQlpZiAoKG5jYWNoZSB8fCBuY2FjaGUwKSAmJiBjbGllbnRfY291bnQgPT0gMCkgewotCQlrZGVfbm9fYW5pbWF0ZSgxKTsKLQl9Ci0JaWYgKGNsaWVudC0+Y2xpZW50RGF0YSkgewotCQljZCA9IChDbGllbnREYXRhICopIGNsaWVudC0+Y2xpZW50RGF0YTsKLQkJaWYgKGNkLT5zc2xfaGVscGVyX3BpZCA+IDApIHsKLQkJCWludCBzdGF0dXM7Ci0JCQlyZmJMb2coInNlbmRpbmcgU0lHVEVSTSB0byBzc2xfaGVscGVyX3BpZDogJWRcbiIsCi0JCQkgICAgY2QtPnNzbF9oZWxwZXJfcGlkKTsKLQkJCWtpbGwoY2QtPnNzbF9oZWxwZXJfcGlkLCBTSUdURVJNKTsKLQkJCXVzbGVlcCgyMDAqMTAwMCk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1dBSVRfSCAmJiBMSUJWTkNTRVJWRVJfSEFWRV9XQUlUUElEIAotCQkJd2FpdHBpZChjZC0+c3NsX2hlbHBlcl9waWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLSNlbmRpZgotCQkJc3NsX2hlbHBlcl9waWQoY2QtPnNzbF9oZWxwZXJfcGlkLCAtMSk7CS8qIGRlbGV0ZSAqLwotCQl9Ci0JfQotCWlmIChnb25lX2NtZCAmJiAqZ29uZV9jbWQgIT0gJ1wwJykgewotCQlpZiAoc3Ryc3RyKGdvbmVfY21kLCAicG9wdXAiKSA9PSBnb25lX2NtZCkgewotCQkJaW50IHggPSAtNjQwMDAsIHkgPSAtNjQwMDAsIHRpbWVvdXQgPSAxMjA7Ci0JCQljaGFyICp1c2VyaG9zdCA9IGlkZW50X3VzZXJuYW1lKGNsaWVudCk7Ci0JCQljaGFyICphZGRyLCAqcCwgKm1vZGU7Ci0KLQkJCS8qIGV4dHJhY3QgdGltZW91dCAqLwotCQkJaWYgKChwID0gc3RyY2hyKGdvbmVfY21kLCAnOicpKSAhPSBOVUxMKSB7Ci0JCQkJaW50IGluOwotCQkJCWlmIChzc2NhbmYocCsxLCAiJWQiLCAmaW4pID09IDEpIHsKLQkJCQkJdGltZW91dCA9IGluOwotCQkJCX0KLQkJCX0KLQkJCS8qIGV4dHJhY3QgZ2VvbWV0cnkgKi8KLQkJCWlmICgocCA9IHN0cnBicmsoZ29uZV9jbWQsICIrLSIpKSAhPSBOVUxMKSB7Ci0JCQkJdWdseV9nZW9tKHAsICZ4LCAmeSk7Ci0JCQl9Ci0KLQkJCS8qIGZpbmQgbW9kZTogbW91c2UsIGtleSwgb3IgYm90aCAqLwotCQkJaWYgKHN0cnN0cihnb25lX2NtZCwgInBvcHVwbW91c2UiKSA9PSBnb25lX2NtZCkgewotCQkJCW1vZGUgPSAibW91c2Vfb25seSI7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihnb25lX2NtZCwgInBvcHVwa2V5IikgPT0gZ29uZV9jbWQpIHsKLQkJCQltb2RlID0gImtleV9vbmx5IjsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kZSA9ICJib3RoIjsKLQkJCX0KLQotCQkJYWRkciA9IGNsaWVudC0+aG9zdDsKLQotCQkJdWdseV93aW5kb3coYWRkciwgdXNlcmhvc3QsIHgsIHksIHRpbWVvdXQsIG1vZGUsIDApOwotCi0JCQlmcmVlKHVzZXJob3N0KTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiY2xpZW50X2dvbmU6IHVzaW5nIGNtZDogJXNcbiIsIGNsaWVudC0+aG9zdCk7Ci0JCQlydW5fdXNlcl9jb21tYW5kKGdvbmVfY21kLCBjbGllbnQsICJnb25lIiwgTlVMTCwgMCwgTlVMTCk7Ci0JCX0KLQl9Ci0KLQlmcmVlX2NsaWVudF9kYXRhKGNsaWVudCk7Ci0KLQlpZiAoaW5ldGQgJiYgY2xpZW50ID09IGluZXRkX2NsaWVudCkgewotCQlyZmJMb2coImluZXRkIHZpZXdlciBleGl0ZWQuXG4iKTsKLQkJaWYgKGd1aV9waWQgPiAwKSB7Ci0JCQlyZmJMb2coImtpbGxpbmcgZ3VpX3BpZCAlZFxuIiwgZ3VpX3BpZCk7Ci0JCQlraWxsKGd1aV9waWQsIFNJR1RFUk0pOwotCQl9Ci0JCWNsZWFuX3VwX2V4aXQoMCk7Ci0JfQotCi0JaWYgKGNvbm5lY3Rfb25jZSkgewotCQkvKgotCQkgKiBUaGlzIG5vbi1leGl0IGlzIGRvbmUgZm9yIGEgYmFkIHBhc3N3ZCB0byBiZSBjb25zaXN0ZW50Ci0JCSAqIHdpdGggb3VyIFJGQl9DTElFTlRfUkVGVVNFIGJlaGF2aW9yIGluIG5ld19jbGllbnQoKSAgKGkuZS4KLQkJICogd2UgZGlzY29ubmVjdCBhZnRlciAxIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbikuCi0JCSAqLwotCQlpZiAoKGNsaWVudC0+c3RhdGUgPT0gUkZCX1BST1RPQ09MX1ZFUlNJT04gfHwKLQkJICAgICBjbGllbnQtPnN0YXRlID09IFJGQl9TRUNVUklUWV9UWVBFIHx8Ci0JCSAgICAgY2xpZW50LT5zdGF0ZSA9PSBSRkJfQVVUSEVOVElDQVRJT04gfHwKLQkJICAgICBjbGllbnQtPnN0YXRlID09IFJGQl9JTklUSUFMSVNBVElPTikgJiYgYWNjZXB0ZWRfY2xpZW50KSB7Ci0JCQlyZmJMb2coImNvbm5lY3Rfb25jZTogaW52YWxpZCBwYXNzd29yZCBvciBlYXJseSAiCi0JCQkgICAiZGlzY29ubmVjdC4gICVkXG4iLCBjbGllbnQtPnN0YXRlKTsKLQkJCXJmYkxvZygiY29ubmVjdF9vbmNlOiB3YWl0aW5nIGZvciBuZXh0IGNvbm5lY3Rpb24uXG4iKTsgCi0JCQlhY2NlcHRlZF9jbGllbnQtLTsKLQkJCWlmIChhY2NlcHRlZF9jbGllbnQgPCAwKSB7Ci0JCQkJYWNjZXB0ZWRfY2xpZW50ID0gMDsKLQkJCX0KLQkJCUNMSUVOVF9VTkxPQ0s7Ci0JCQlpZiAoY29ubmVjdF9vcl9leGl0KSB7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2hhcmVkICYmIGNsaWVudF9jb3VudCA+IDApICB7Ci0JCQlyZmJMb2coImNvbm5lY3Rfb25jZTogb3RoZXIgc2hhcmVkIGNsaWVudHMgc3RpbGwgIgotCQkJICAgICJjb25uZWN0ZWQsIG5vdCBleGl0aW5nLlxuIik7Ci0JCQlDTElFTlRfVU5MT0NLOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmZiTG9nKCJ2aWV3ZXIgZXhpdGVkLlxuIik7Ci0JCWlmICgoY2xpZW50X2Nvbm5lY3QgfHwgY29ubmVjdF9vcl9leGl0KSAmJiBndWlfcGlkID4gMCkgewotCQkJcmZiTG9nKCJraWxsaW5nIGd1aV9waWQgJWRcbiIsIGd1aV9waWQpOwotCQkJa2lsbChndWlfcGlkLCBTSUdURVJNKTsKLQkJfQotCQlDTElFTlRfVU5MT0NLOwotCQljbGVhbl91cF9leGl0KDApOwotCX0KLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUgJiYgY2xpZW50X2NvdW50ID09IDApIHsKLQkJbWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFja19vZmYoKTsKLQl9Ci0jZW5kaWYKLQlDTElFTlRfVU5MT0NLOwotfQotCi0vKgotICogU2ltcGxlIHJvdXRpbmUgdG8gbGltaXQgYWNjZXNzIHZpYSBzdHJpbmcgY29tcGFyZS4gIEEgcG93ZXIgdXNlciB3aWxsCi0gKiB3YW50IHRvIGNvbXBpbGUgbGlidm5jc2VydmVyIHdpdGggbGlid3JhcCBzdXBwb3J0IGFuZCB1c2UgL2V0Yy9ob3N0cy5hbGxvdy4KLSAqLwotaW50IGNoZWNrX2FjY2VzcyhjaGFyICphZGRyKSB7Ci0JaW50IGFsbG93ZWQgPSAwOwotCWludCBzc2wgPSAwOwotCWNoYXIgKnAsICpsaXN0OwotCi0JaWYgKHVzZV9vcGVuc3NsIHx8IHVzZV9zdHVubmVsKSB7Ci0JCXNzbCA9IDE7Ci0JfQotCWlmIChkZW55X2FsbCkgewotCQlyZmJMb2coImNoZWNrX2FjY2VzczogbmV3IGNvbm5lY3Rpb25zIGFyZSBjdXJyZW50bHkgIgotCQkgICAgImJsb2NrZWQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChhZGRyID09IE5VTEwgfHwgKmFkZHIgPT0gJ1wwJykgewotCQlyZmJMb2coImNoZWNrX2FjY2VzczogZGVueWluZyBlbXB0eSBob3N0IElQIGFkZHJlc3Mgc3RyaW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChhbGxvd19saXN0ID09IE5VTEwpIHsKLQkJLyogc2V0IHRvICIiIHRvIHBvc3NpYmx5IGFwcGVuZCBhbGxvd19vbmNlICovCi0JCWFsbG93X2xpc3QgPSBzdHJkdXAoIiIpOwotCX0KLQlpZiAoKmFsbG93X2xpc3QgPT0gJ1wwJyAmJiBhbGxvd19vbmNlID09IE5VTEwpIHsKLQkJLyogbm8gY29uc3RyYWludHMsIGFjY2VwdCBpdCAqLwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoc3RyY2hyKGFsbG93X2xpc3QsICcvJykpIHsKLQkJLyogYSBmaWxlIG9mIElQIGFkZHJlc2VzcyBvciBwcmVmaXhlcyAqLwotCQlpbnQgbGVuLCBsZW4yID0gMDsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJRklMRSAqaW47Ci0JCWNoYXIgbGluZVsxMDI0XSwgKnE7Ci0KLQkJaWYgKHN0YXQoYWxsb3dfbGlzdCwgJnNidWYpICE9IDApIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiY2hlY2tfYWNjZXNzOiBmYWlsdXJlIHN0YXRpbmcgZmlsZTogJXNcbiIsCi0JCQkgICAgYWxsb3dfbGlzdCk7Ci0JCQlyZmJMb2dQZXJyb3IoInN0YXQiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJbGVuID0gc2J1Zi5zdF9zaXplICsgMTsJLyogMSBtb3JlIGZvciAnXDAnIGF0IGVuZCAqLwotCQlpZiAoYWxsb3dfb25jZSkgewotCQkJbGVuMiA9IHN0cmxlbihhbGxvd19vbmNlKSArIDI7Ci0JCQlsZW4gKz0gbGVuMjsKLQkJfQotCQlpZiAoc3NsKSB7Ci0JCQlsZW4yID0gc3RybGVuKCIxMjcuMC4wLjEiKSArIDI7Ci0JCQlsZW4gKz0gbGVuMjsKLQkJfQotCQlsaXN0ID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0JCWxpc3RbMF0gPSAnXDAnOwotCQkKLQkJaW4gPSBmb3BlbihhbGxvd19saXN0LCAiciIpOwotCQlpZiAoaW4gPT0gTlVMTCkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJjaGVja19hY2Nlc3M6IGNhbm5vdCBvcGVuOiAlc1xuIiwgYWxsb3dfbGlzdCk7Ci0JCQlyZmJMb2dQZXJyb3IoImZvcGVuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXdoaWxlIChmZ2V0cyhsaW5lLCAxMDI0LCBpbikgIT0gTlVMTCkgewotCQkJaWYgKCAocSA9IHN0cmNocihsaW5lLCAnIycpKSAhPSBOVUxMKSB7Ci0JCQkJKnEgPSAnXDAnOwotCQkJfQotCQkJaWYgKHN0cmxlbihsaXN0KSArIHN0cmxlbihsaW5lKSA+PQotCQkJICAgIChzaXplX3QpIChsZW4gLSBsZW4yKSkgewotCQkJCS8qIGZpbGUgZ3JldyBzaW5jZSBvdXIgc3RhdCgpICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJjYXQobGlzdCwgbGluZSk7Ci0JCX0KLQkJZmNsb3NlKGluKTsKLQkJaWYgKGFsbG93X29uY2UpIHsKLQkJCXN0cmNhdChsaXN0LCAiXG4iKTsKLQkJCXN0cmNhdChsaXN0LCBhbGxvd19vbmNlKTsKLQkJCXN0cmNhdChsaXN0LCAiXG4iKTsKLQkJfQotCQlpZiAoc3NsKSB7Ci0JCQlzdHJjYXQobGlzdCwgIlxuIik7Ci0JCQlzdHJjYXQobGlzdCwgIjEyNy4wLjAuMSIpOwotCQkJc3RyY2F0KGxpc3QsICJcbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGxlbiA9IHN0cmxlbihhbGxvd19saXN0KSArIDE7Ci0JCWlmIChhbGxvd19vbmNlKSB7Ci0JCQlsZW4gKz0gc3RybGVuKGFsbG93X29uY2UpICsgMTsKLQkJfQotCQlpZiAoc3NsKSB7Ci0JCQlsZW4gKz0gc3RybGVuKCIxMjcuMC4wLjEiKSArIDE7Ci0JCX0KLQkJbGlzdCA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCQlsaXN0WzBdID0gJ1wwJzsKLQkJc3RyY2F0KGxpc3QsIGFsbG93X2xpc3QpOwotCQlpZiAoYWxsb3dfb25jZSkgewotCQkJc3RyY2F0KGxpc3QsICIsIik7Ci0JCQlzdHJjYXQobGlzdCwgYWxsb3dfb25jZSk7Ci0JCX0KLQkJaWYgKHNzbCkgewotCQkJc3RyY2F0KGxpc3QsICIsIik7Ci0JCQlzdHJjYXQobGlzdCwgIjEyNy4wLjAuMSIpOwotCQl9Ci0JfQotCi0JaWYgKGFsbG93X29uY2UpIHsKLQkJZnJlZShhbGxvd19vbmNlKTsKLQkJYWxsb3dfb25jZSA9IE5VTEw7Ci0JfQotCQotCXAgPSBzdHJ0b2sobGlzdCwgIiwgXHRcblxyIik7Ci0Jd2hpbGUgKHApIHsKLQkJY2hhciAqY2hrLCAqcSwgKnIgPSBOVUxMOwotCQlpZiAoKnAgPT0gJ1wwJykgewotCQkJcCA9IHN0cnRvayhOVUxMLCAiLCBcdFxuXHIiKTsKLQkJCWNvbnRpbnVlOwkKLQkJfQotCQlpZiAoaXB2Nl9pcChwKSkgewotCQkJY2hrID0gcDsKLQkJfSBlbHNlIGlmICghIGRvdHRlZF9pcChwLCAxKSkgewotCQkJciA9IGhvc3QyaXAocCk7Ci0JCQlpZiAociA9PSBOVUxMIHx8ICpyID09ICdcMCcpIHsKLQkJCQlyZmJMb2coImNoZWNrX2FjY2VzczogYmFkIGxvb2t1cCBcIiVzXCJcbiIsIHApOwotCQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwgXHRcblxyIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZmJMb2coImNoZWNrX2FjY2VzczogbG9va3VwICVzIC0+ICVzXG4iLCBwLCByKTsKLQkJCWNoayA9IHI7Ci0JCX0gZWxzZSB7Ci0JCQljaGsgPSBwOwotCQl9Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19BQ0NFU1MiKSkgZnByaW50ZihzdGRlcnIsICJjaGs6ICVzICBwYXJ0OiAlcyAgYWRkcjogJXNcbiIsIGNoaywgcCwgYWRkcik7Ci0KLQkJcSA9IHN0cnN0cihhZGRyLCBjaGspOwotCQlpZiAoaXB2Nl9pcChhZGRyKSkgewotCQkJaWYgKCFzdHJjbXAoY2hrLCAibG9jYWxob3N0IikgJiYgIXN0cmNtcChhZGRyLCAiOjoxIikpIHsKLQkJCQlyZmJMb2coImNoZWNrX2FjY2VzczogY2xpZW50IGFkZHIgJXMgaXMgbG9jYWwuXG4iLCBhZGRyKTsKLQkJCQlhbGxvd2VkID0gMTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChjaGssICI6OjEiKSAmJiAhc3RyY21wKGFkZHIsICI6OjEiKSkgewotCQkJCXJmYkxvZygiY2hlY2tfYWNjZXNzOiBjbGllbnQgYWRkciAlcyBpcyBsb2NhbC5cbiIsIGFkZHIpOwotCQkJCWFsbG93ZWQgPSAxOwotCQkJfSBlbHNlIGlmICghc3RyY21wKGNoaywgIjEyNy4wLjAuMSIpICYmICFzdHJjbXAoYWRkciwgIjo6MSIpKSB7Ci0JCQkJLyogdGhpcyBpZiBmb3IgaG9zdDJpcCgibG9jYWxob3N0IikgKi8KLQkJCQlyZmJMb2coImNoZWNrX2FjY2VzczogY2xpZW50IGFkZHIgJXMgaXMgbG9jYWwuXG4iLCBhZGRyKTsKLQkJCQlhbGxvd2VkID0gMTsKLQkJCX0gZWxzZSBpZiAocSA9PSBhZGRyKSB7Ci0JCQkJcmZiTG9nKCJjaGVja19hY2Nlc3M6IGNsaWVudCAlcyBtYXRjaGVzIHBhdHRlcm4gJXNcbiIsIGFkZHIsIGNoayk7Ci0JCQkJYWxsb3dlZCA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hrW3N0cmxlbihjaGspLTFdICE9ICcuJykgewotCQkJaWYgKCFzdHJjbXAoYWRkciwgY2hrKSkgewotCQkJCWlmIChjaGsgIT0gcCkgewotCQkJCQlyZmJMb2coImNoZWNrX2FjY2VzczogY2xpZW50ICVzICIgIm1hdGNoZXMgaG9zdCAlcz0lc1xuIiwgYWRkciwgY2hrLCBwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZmJMb2coImNoZWNrX2FjY2VzczogY2xpZW50ICVzICIgIm1hdGNoZXMgaG9zdCAlc1xuIiwgYWRkciwgY2hrKTsKLQkJCQl9Ci0JCQkJYWxsb3dlZCA9IDE7Ci0JCQl9IGVsc2UgaWYoIXN0cmNtcChjaGssICJsb2NhbGhvc3QiKSAmJiAhc3RyY21wKGFkZHIsICIxMjcuMC4wLjEiKSkgewotCQkJCWFsbG93ZWQgPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKHEgPT0gYWRkcikgewotCQkJcmZiTG9nKCJjaGVja19hY2Nlc3M6IGNsaWVudCAlcyBtYXRjaGVzIHBhdHRlcm4gJXNcbiIsIGFkZHIsIGNoayk7Ci0JCQlhbGxvd2VkID0gMTsKLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIFx0XG5cciIpOwotCQlpZiAocikgewotCQkJZnJlZShyKTsKLQkJfQotCQlpZiAoYWxsb3dlZCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZnJlZShsaXN0KTsKLQlyZXR1cm4gYWxsb3dlZDsKLX0KLQotLyoKLSAqIHgxMXZuYydzIGZpcnN0IChhbmQgb25seSkgdmlzaWJsZSB3aWRnZXQ6IGFjY2VwdC9yZWplY3QgZGlhbG9nIHdpbmRvdy4KLSAqIFdlIGdvIHRocm91Z2ggdGhpcyBwYWluIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gbGliWHQuLi4KLSAqLwotc3RhdGljIGludCB1Z2x5X3dpbmRvdyhjaGFyICphZGRyLCBjaGFyICp1c2VyaG9zdCwgaW50IFgsIGludCBZLAotICAgIGludCB0aW1lb3V0LCBjaGFyICptb2RlLCBpbnQgYWNjZXB0KSB7Ci0jaWYgTk9fWDExCi0JaWYgKCFhZGRyIHx8ICF1c2VyaG9zdCB8fCAhWCB8fCAhWSB8fCAhdGltZW91dCB8fCAhbW9kZSB8fCAhYWNjZXB0KSB7fQotCVJBV0ZCX1JFVCgwKQotCW5veDExX2V4aXQoMSk7Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCi0jZGVmaW5lIHQyeDJfd2lkdGggMTYKLSNkZWZpbmUgdDJ4Ml9oZWlnaHQgMTYKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHQyeDJfYml0c1tdID0gewotICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzMywgMHgzMywgMHgzMywgMHgzMywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLSAgIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzMsCi0gICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDMzLCAweDMzLCAweDMzLCAweDMzfTsKLQotCVdpbmRvdyBhd2luOwotCUdDIGdjOwotCVhTaXplSGludHMgaGludHM7Ci0JWEdDVmFsdWVzIHZhbHVlczsKLQlzdGF0aWMgWEZvbnRTdHJ1Y3QgKmZvbnRfaW5mbyA9IE5VTEw7Ci0Jc3RhdGljIFBpeG1hcCBpY28gPSAwOwotCXVuc2lnbmVkIGxvbmcgdmFsdWVtYXNrID0gMDsKLQlzdGF0aWMgY2hhciBkYXNoX2xpc3RbXSA9IHsyMCwgNDB9OwotCWludCBsaXN0X2xlbmd0aCA9IHNpemVvZihkYXNoX2xpc3QpOwotCi0JQXRvbSB3bV9wcm90b2NvbHM7Ci0JQXRvbSB3bV9kZWxldGVfd2luZG93OwotCi0JWEV2ZW50IGV2OwotCWxvbmcgZXZtYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrCi0JICAgIHwgU3RydWN0dXJlTm90aWZ5TWFzazsKLQlkb3VibGUgd2FpdGVkID0gMC4wOwotCi0JLyogc3RyaW5ncyBhbmQgZ2VvbWV0cmllcyB5L24gKi8KLQlLZXlDb2RlIGtleV95LCBrZXlfbiwga2V5X3Y7Ci0JY2hhciBzdHJoWzEwMF07Ci0JY2hhciBzdHJpWzEwMF07Ci0JY2hhciBzdHIxX2JbXSA9ICJUbyBhY2NlcHQ6IHByZXNzIFwieVwiIG9yIGNsaWNrIHRoZSBcIlllc1wiIGJ1dHRvbiI7Ci0JY2hhciBzdHIyX2JbXSA9ICJUbyByZWplY3Q6IHByZXNzIFwiblwiIG9yIGNsaWNrIHRoZSBcIk5vXCIgYnV0dG9uIjsKLQljaGFyIHN0cjNfYltdID0gIlZpZXcgb25seTogcHJlc3MgXCJ2XCIgb3IgY2xpY2sgdGhlIFwiVmlld1wiIGJ1dHRvbiI7Ci0JY2hhciBzdHIxX21bXSA9ICJUbyBhY2NlcHQ6IGNsaWNrIHRoZSBcIlllc1wiIGJ1dHRvbiI7Ci0JY2hhciBzdHIyX21bXSA9ICJUbyByZWplY3Q6IGNsaWNrIHRoZSBcIk5vXCIgYnV0dG9uIjsKLQljaGFyIHN0cjNfbVtdID0gIlZpZXcgb25seTogY2xpY2sgdGhlIFwiVmlld1wiIGJ1dHRvbiI7Ci0JY2hhciBzdHIxX2tbXSA9ICJUbyBhY2NlcHQ6IHByZXNzIFwieVwiIjsKLQljaGFyIHN0cjJfa1tdID0gIlRvIHJlamVjdDogcHJlc3MgXCJuXCIiOwotCWNoYXIgc3RyM19rW10gPSAiVmlldyBvbmx5OiBwcmVzcyBcInZcIiI7Ci0JY2hhciAqc3RyMSwgKnN0cjIsICpzdHIzOwotCWNoYXIgc3RyX3lbXSA9ICJZZXMiOwotCWNoYXIgc3RyX25bXSA9ICJObyI7Ci0JY2hhciBzdHJfdltdID0gIlZpZXciOwotCWludCB4LCB5LCB3ID0gMzQ1LCBoID0gMTc1LCByZXQgPSAwOwotCWludCBYX3NoID0gMjAsIFlfc2ggPSAzMCwgZFkgPSAyMDsKLQlpbnQgWWVfeCA9IDIwLCAgWWVfeSA9IDAsIFllX3cgPSA0NSwgWWVfaCA9IDIwOwotCWludCBOb194ID0gNzUsICBOb195ID0gMCwgTm9fdyA9IDQ1LCBOb19oID0gMjA7IAotCWludCBWaV94ID0gMTMwLCBWaV95ID0gMCwgVmlfdyA9IDQ1LCBWaV9oID0gMjA7IAotCWNoYXIgKnNwcm9wID0gIm5ldyB4MTF2bmMgY2xpZW50IjsKLQotCUtleUNvZGUga2V5X287Ci0KLQlSQVdGQl9SRVQoMCkKLQotCWlmICghIGFjY2VwdCkgewotCQlzcHJpbnRmKHN0cl95LCAiT0siKTsKLQkJc3Byb3AgPSAieDExdm5jIGNsaWVudCBkaXNjb25uZWN0ZWQiOwotCQloID0gMTEwOwotCQlzdHIxID0gIiI7Ci0JCXN0cjIgPSAiIjsKLQkJc3RyMyA9ICIiOwotCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAibW91c2Vfb25seSIpKSB7Ci0JCXN0cjEgPSBzdHIxX207Ci0JCXN0cjIgPSBzdHIyX207Ci0JCXN0cjMgPSBzdHIzX207Ci0JfSBlbHNlIGlmICghc3RyY21wKG1vZGUsICJrZXlfb25seSIpKSB7Ci0JCXN0cjEgPSBzdHIxX2s7Ci0JCXN0cjIgPSBzdHIyX2s7Ci0JCXN0cjMgPSBzdHIzX2s7Ci0JCWggLT0gZFk7Ci0JfSBlbHNlIHsKLQkJc3RyMSA9IHN0cjFfYjsKLQkJc3RyMiA9IHN0cjJfYjsKLQkJc3RyMyA9IHN0cjNfYjsKLQl9Ci0JaWYgKHZpZXdfb25seSkgewotCQloIC09IGRZOwotCX0KLQotCS8qIFhYWCBoYW5kbGUgY29mZl94L2NvZmZfeT8gKi8KLQlpZiAoWCA8IC1kcHlfeCkgewotCQl4ID0gKGRweV94IC0gdykvMjsJLyogbGFyZ2UgbmVnYXRpdmU6IGNlbnRlciAqLwotCQlpZiAoeCA8IDApIHggPSAwOwotCX0gZWxzZSBpZiAoWCA8IDApIHsKLQkJeCA9IGRweV94ICsgWCAtIHc7CS8qIGZyb20gbG93ZXIgcmlnaHQgKi8KLQl9IGVsc2UgewotCQl4ID0gWDsJCQkvKiBmcm9tIHVwcGVyIGxlZnQgKi8KLQl9Ci0JCi0JaWYgKFkgPCAtZHB5X3kpIHsKLQkJeSA9IChkcHlfeSAtIGgpLzI7Ci0JCWlmICh5IDwgMCkgeSA9IDA7Ci0JfSBlbHNlIGlmIChZIDwgMCkgewotCQl5ID0gZHB5X3kgKyBZIC0gaDsKLQl9IGVsc2UgewotCQl5ID0gWTsKLQl9Ci0KLQlYX0xPQ0s7Ci0KLQlhd2luID0gWENyZWF0ZVNpbXBsZVdpbmRvdyhkcHksIHdpbmRvdywgeCwgeSwgdywgaCwgNCwKLQkgICAgQmxhY2tQaXhlbChkcHksIHNjciksIFdoaXRlUGl4ZWwoZHB5LCBzY3IpKTsKLQotCXdtX3Byb3RvY29scyA9IFhJbnRlcm5BdG9tKGRweSwgIldNX1BST1RPQ09MUyIsIEZhbHNlKTsKLQl3bV9kZWxldGVfd2luZG93ID0gWEludGVybkF0b20oZHB5LCAiV01fREVMRVRFX1dJTkRPVyIsIEZhbHNlKTsKLQlYU2V0V01Qcm90b2NvbHMoZHB5LCBhd2luLCAmd21fZGVsZXRlX3dpbmRvdywgMSk7Ci0KLQlpZiAoISBpY28pIHsKLQkJaWNvID0gWENyZWF0ZUJpdG1hcEZyb21EYXRhKGRweSwgYXdpbiwgKGNoYXIgKikgdDJ4Ml9iaXRzLAotCQkgICAgdDJ4Ml93aWR0aCwgdDJ4Ml9oZWlnaHQpOwotCX0KLQotCWhpbnRzLmZsYWdzID0gUFBvc2l0aW9uIHwgUFNpemUgfCBQTWluU2l6ZTsKLQloaW50cy54ID0geDsKLQloaW50cy55ID0geTsKLQloaW50cy53aWR0aCA9IHc7Ci0JaGludHMuaGVpZ2h0ID0gaDsKLQloaW50cy5taW5fd2lkdGggPSB3OwotCWhpbnRzLm1pbl9oZWlnaHQgPSBoOwotCi0JWFNldFN0YW5kYXJkUHJvcGVydGllcyhkcHksIGF3aW4sIHNwcm9wLCAieDExdm5jIHF1ZXJ5IiwgaWNvLCBOVUxMLAotCSAgICAwLCAmaGludHMpOwotCi0JWFNlbGVjdElucHV0X3dyKGRweSwgYXdpbiwgZXZtYXNrKTsKLQotCWlmICghIGZvbnRfaW5mbyAmJiAoZm9udF9pbmZvID0gWExvYWRRdWVyeUZvbnQoZHB5LCAiZml4ZWQiKSkgPT0gTlVMTCkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygidWdseV93aW5kb3c6IGNhbm5vdCBsb2NhdGUgZm9udCBmaXhlZC5cbiIpOwotCQlYX1VOTE9DSzsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQlnYyA9IFhDcmVhdGVHQyhkcHksIGF3aW4sIHZhbHVlbWFzaywgJnZhbHVlcyk7Ci0JWFNldEZvbnQoZHB5LCBnYywgZm9udF9pbmZvLT5maWQpOwotCVhTZXRGb3JlZ3JvdW5kKGRweSwgZ2MsIEJsYWNrUGl4ZWwoZHB5LCBzY3IpKTsKLQlYU2V0TGluZUF0dHJpYnV0ZXMoZHB5LCBnYywgMSwgTGluZVNvbGlkLCBDYXBCdXR0LCBKb2luTWl0ZXIpOwotCVhTZXREYXNoZXMoZHB5LCBnYywgMCwgZGFzaF9saXN0LCBsaXN0X2xlbmd0aCk7Ci0KLQlYTWFwV2luZG93KGRweSwgYXdpbik7Ci0JWEZsdXNoX3dyKGRweSk7Ci0KLQlpZiAoYWNjZXB0KSB7Ci0JCWNoYXIgKmlwID0gYWRkcjsKLQkJY2hhciAqdHlwZSA9ICJhY2NlcHQiOwotCQlpZiAodW5peHB3ICYmIHN0cnN0cih1c2VyaG9zdCwgIlVOSVg6IikgIT0gdXNlcmhvc3QpIHsKLQkJCXR5cGUgPSAiVU5JWFBXIjsKLQkJCWlmIChvcGVuc3NsX2xhc3RfaXApIHsKLQkJCQlpcCA9IG9wZW5zc2xfbGFzdF9pcDsKLQkJCX0KLQkJfQotCQlzbnByaW50ZihzdHJoLCAxMDAsICJ4MTF2bmM6ICVzIGNvbm5lY3Rpb24gZnJvbSAlcz8iLCB0eXBlLCBpcCk7Ci0JfSBlbHNlIHsKLQkJc25wcmludGYoc3RyaCwgMTAwLCAieDExdm5jOiBjbGllbnQgZGlzY29ubmVjdGVkIGZyb20gJXMiLCBhZGRyKTsKLQl9Ci0Jc25wcmludGYoc3RyaSwgMTAwLCAiICAgICAgICAoJXMpIiwgdXNlcmhvc3QpOwotCi0Ja2V5X28gPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWFN0cmluZ1RvS2V5c3ltKCJvIikpOwotCWtleV95ID0gWEtleXN5bVRvS2V5Y29kZShkcHksIFhTdHJpbmdUb0tleXN5bSgieSIpKTsKLQlrZXlfbiA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBYU3RyaW5nVG9LZXlzeW0oIm4iKSk7Ci0Ja2V5X3YgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWFN0cmluZ1RvS2V5c3ltKCJ2IikpOwotCi0Jd2hpbGUgKDEpIHsKLQkJaW50IG91dCA9IC0xLCB4LCB5LCB0dywgazsKLQotCQlpZiAoWENoZWNrV2luZG93RXZlbnQoZHB5LCBhd2luLCBldm1hc2ssICZldikpIHsKLQkJCTsJLyogcHJvY2VlZCB0byBoYW5kbGluZyAqLwotCQl9IGVsc2UgaWYgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBDbGllbnRNZXNzYWdlLCAmZXYpKSB7Ci0JCQk7CS8qIHByb2NlZWQgdG8gaGFuZGxpbmcgKi8KLQkJfSBlbHNlIHsKLQkJCWludCBtcyA9IDEwMDsJLyogc2xlZXAgYSBiaXQgKi8KLQkJCXVzbGVlcChtcyAqIDEwMDApOwotCQkJd2FpdGVkICs9ICgoZG91YmxlKSBtcykvMTAwMC47Ci0JCQlpZiAodGltZW91dCAmJiAoaW50KSB3YWl0ZWQgPj0gdGltZW91dCkgewotCQkJCXJmYkxvZygidWdseV93aW5kb3c6IHBvcHVwIHRpbWVkIG91dCBhZnRlciAiCi0JCQkJICAgICIlZCBzZWNvbmRzLlxuIiwgdGltZW91dCk7Ci0JCQkJb3V0ID0gMDsKLQkJCQlldi50eXBlID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCQlzd2l0Y2goZXYudHlwZSkgewotCQljYXNlIEV4cG9zZToKLQkJCXdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgRXhwb3NlLCAmZXYpKSB7Ci0JCQkJOwotCQkJfQotCQkJaz0wOwotCi0JCQkvKiBpbnN0cnVjdGlvbnMgKi8KLQkJCVhEcmF3U3RyaW5nKGRweSwgYXdpbiwgZ2MsIFhfc2gsIFlfc2grKGsrKykqZFksCi0JCQkgICAgc3RyaCwgc3RybGVuKHN0cmgpKTsKLQkJCVhEcmF3U3RyaW5nKGRweSwgYXdpbiwgZ2MsIFhfc2gsIFlfc2grKGsrKykqZFksCi0JCQkgICAgc3RyaSwgc3RybGVuKHN0cmkpKTsKLQkJCWlmIChhY2NlcHQpIHsKLQkJCSAgWERyYXdTdHJpbmcoZHB5LCBhd2luLCBnYywgWF9zaCwgWV9zaCsoaysrKSpkWSwKLQkJCSAgICBzdHIxLCBzdHJsZW4oc3RyMSkpOwotCQkJICBYRHJhd1N0cmluZyhkcHksIGF3aW4sIGdjLCBYX3NoLCBZX3NoKyhrKyspKmRZLAotCQkJICAgIHN0cjIsIHN0cmxlbihzdHIyKSk7Ci0JCQkgIGlmICghIHZpZXdfb25seSkgewotCQkJCVhEcmF3U3RyaW5nKGRweSwgYXdpbiwgZ2MsIFhfc2gsIFlfc2grKGsrKykqZFksCi0JCQkJICAgIHN0cjMsIHN0cmxlbihzdHIzKSk7Ci0JCQkgIH0KLQkJCX0KLQotCQkJaWYgKCFzdHJjbXAobW9kZSwgImtleV9vbmx5IikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogYnV0dG9ucyAqLwotCQkJWWVfeSA9IFlfc2graypkWTsKLQkJCU5vX3kgPSBZX3NoK2sqZFk7Ci0JCQlWaV95ID0gWV9zaCtrKmRZOwotCQkJWERyYXdSZWN0YW5nbGUoZHB5LCBhd2luLCBnYywgWWVfeCwgWWVfeSwgWWVfdywgWWVfaCk7Ci0KLQkJCWlmIChhY2NlcHQpIHsKLQkJCSAgWERyYXdSZWN0YW5nbGUoZHB5LCBhd2luLCBnYywgTm9feCwgTm9feSwgTm9fdywgTm9faCk7Ci0JCQkgIGlmICghIHZpZXdfb25seSkgewotCQkJCVhEcmF3UmVjdGFuZ2xlKGRweSwgYXdpbiwgZ2MsIFZpX3gsIFZpX3ksCi0JCQkJICAgIFZpX3csIFZpX2gpOwotCQkJICB9Ci0JCQl9Ci0KLQkJCXR3ID0gWFRleHRXaWR0aChmb250X2luZm8sIHN0cl95LCBzdHJsZW4oc3RyX3kpKTsKLQkJCXR3ID0gKFllX3cgLSB0dykvMjsKLQkJCWlmICh0dyA8IDApIHR3ID0gMTsKLQkJCVhEcmF3U3RyaW5nKGRweSwgYXdpbiwgZ2MsIFllX3grdHcsIFllX3krWWVfaC01LAotCQkJICAgIHN0cl95LCBzdHJsZW4oc3RyX3kpKTsKLQotCQkJaWYgKCFhY2NlcHQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXR3ID0gWFRleHRXaWR0aChmb250X2luZm8sIHN0cl9uLCBzdHJsZW4oc3RyX24pKTsKLQkJCXR3ID0gKE5vX3cgLSB0dykvMjsKLQkJCWlmICh0dyA8IDApIHR3ID0gMTsKLQkJCVhEcmF3U3RyaW5nKGRweSwgYXdpbiwgZ2MsIE5vX3grdHcsIE5vX3krTm9faC01LAotCQkJICAgIHN0cl9uLCBzdHJsZW4oc3RyX24pKTsKLQotCQkJaWYgKCEgdmlld19vbmx5KSB7Ci0JCQkJdHcgPSBYVGV4dFdpZHRoKGZvbnRfaW5mbywgc3RyX3YsCi0JCQkJICAgIHN0cmxlbihzdHJfdikpOwotCQkJCXR3ID0gKFZpX3cgLSB0dykvMjsKLQkJCQlpZiAodHcgPCAwKSB0dyA9IDE7Ci0JCQkJWERyYXdTdHJpbmcoZHB5LCBhd2luLCBnYywgVmlfeCt0dywKLQkJCQkgICAgVmlfeStWaV9oLTUsIHN0cl92LCBzdHJsZW4oc3RyX3YpKTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDbGllbnRNZXNzYWdlOgotCQkJaWYgKGV2LnhjbGllbnQubWVzc2FnZV90eXBlID09IHdtX3Byb3RvY29scyAmJgotCQkJICAgIChBdG9tKSBldi54Y2xpZW50LmRhdGEubFswXSA9PSB3bV9kZWxldGVfd2luZG93KSB7Ci0JCQkJb3V0ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQnV0dG9uUHJlc3M6Ci0JCQl4ID0gZXYueGJ1dHRvbi54OwotCQkJeSA9IGV2LnhidXR0b24ueTsKLQkJCWlmICghc3RyY21wKG1vZGUsICJrZXlfb25seSIpKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmICh4ID4gWWVfeCAmJiB4IDwgWWVfeCtZZV93ICYmIHkgPiBZZV95Ci0JCQkgICAgJiYgeSA8IFllX3krWWVfaCkgewotCQkJCW91dCA9IDE7Ci0JCQl9IGVsc2UgaWYgKCEgYWNjZXB0KSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmICh4ID4gTm9feCAmJiB4IDwgTm9feCtOb193ICYmIHkgPiBOb195Ci0JCQkgICAgJiYgeSA8IE5vX3krTm9faCkgewotCQkJCW91dCA9IDA7Ci0JCQl9IGVsc2UgaWYgKCEgdmlld19vbmx5ICYmIHggPiBWaV94ICYmIHggPCBWaV94K1ZpX3cKLQkJCSAgICAmJiB5ID4gVmlfeSAmJiB5IDwgVmlfeStZZV9oKSB7Ci0JCQkJb3V0ID0gMjsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgS2V5UHJlc3M6Ci0JCQlpZiAoIXN0cmNtcChtb2RlLCAibW91c2Vfb25seSIpKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmICghIGFjY2VwdCkgewotCQkJCWlmIChldi54a2V5LmtleWNvZGUgPT0ga2V5X28pIHsKLQkJCQkJb3V0ID0gMTsKLQkJCQl9Ci0JCQkJaWYgKGV2LnhrZXkua2V5Y29kZSA9PSBrZXlfeSkgewotCQkJCQlvdXQgPSAxOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZXYueGtleS5rZXljb2RlID09IGtleV95KSB7Ci0JCQkJb3V0ID0gMTsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKGV2LnhrZXkua2V5Y29kZSA9PSBrZXlfbikgewotCQkJCW91dCA9IDA7Ci0JCQl9IGVsc2UgaWYgKCEgdmlld19vbmx5ICYmIGV2LnhrZXkua2V5Y29kZSA9PSBrZXlfdikgewotCQkJCW91dCA9IDI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChvdXQgIT0gLTEpIHsKLQkJCXJldCA9IG91dDsKLQkJCVhTZWxlY3RJbnB1dF93cihkcHksIGF3aW4sIDApOwotCQkJWFVubWFwV2luZG93KGRweSwgYXdpbik7Ci0JCQlYRnJlZV93cihnYyk7Ci0JCQlYRGVzdHJveVdpbmRvdyhkcHksIGF3aW4pOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlYX1VOTE9DSzsKLQotCXJldHVybiByZXQ7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBwcm9jZXNzIGEgInllczowLG5vOiosdmlldzozIiB0eXBlIGFjdGlvbiBsaXN0IGNvbXBhcmluZyB0byBjb21tYW5kCi0gKiByZXR1cm4gY29kZSByYy4gICogbWVhbnMgdGhlIGRlZmF1bHQgYWN0aW9uIHdpdGggbm8gb3RoZXIgbWF0Y2guCi0gKi8KLXN0YXRpYyBpbnQgYWN0aW9uX21hdGNoKGNoYXIgKmFjdGlvbiwgaW50IHJjKSB7Ci0JY2hhciAqcCwgKnEsICpzID0gc3RyZHVwKGFjdGlvbik7Ci0JaW50IGNhc2VzWzRdLCBpLCByZXN1bHQ7Ci0JY2hhciAqbGFiZWxzWzRdOwotCi0JbGFiZWxzWzFdID0gInllcyI7Ci0JbGFiZWxzWzJdID0gIm5vIjsKLQlsYWJlbHNbM10gPSAidmlldyI7Ci0KLQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHByb2Nlc3MgYWN0aW9uIGxpbmU6ICVzXG4iLAotCSAgICBhY3Rpb24pOwotCi0JZm9yIChpPTE7IGkgPD0gMzsgaSsrKSB7Ci0JCWNhc2VzW2ldID0gLTI7Ci0JfQotCi0JcCA9IHN0cnRvayhzLCAiLCIpOwotCXdoaWxlIChwKSB7Ci0JCWlmICgocSA9IHN0cmNocihwLCAnOicpKSAhPSBOVUxMKSB7Ci0JCQlpbnQgaW4sIGsgPSAxOwotCQkJKnEgPSAnXDAnOwotCQkJcSsrOwotCQkJaWYgKHN0cnN0cihwLCAieWVzIikgPT0gcCkgewotCQkJCWsgPSAxOwotCQkJfSBlbHNlIGlmIChzdHJzdHIocCwgIm5vIikgPT0gcCkgewotCQkJCWsgPSAyOwotCQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInZpZXciKSA9PSBwKSB7Ci0JCQkJayA9IDM7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCQlyZmJMb2coImludmFsaWQgYWN0aW9uIGxpbmU6ICVzXG4iLCBhY3Rpb24pOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlpZiAoKnEgPT0gJyonKSB7Ci0JCQkJY2FzZXNba10gPSAtMTsKLQkJCX0gZWxzZSBpZiAoc3NjYW5mKHEsICIlZCIsICZpbikgPT0gMSkgewotCQkJCWlmIChpbiA8IDApIHsKLQkJCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJCQlyZmJMb2coImludmFsaWQgYWN0aW9uIGxpbmU6ICVzXG4iLAotCQkJCQkgICAgYWN0aW9uKTsKLQkJCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCQl9Ci0JCQkJY2FzZXNba10gPSBpbjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJCXJmYkxvZygiaW52YWxpZCBhY3Rpb24gbGluZTogJXNcbiIsIGFjdGlvbik7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiaW52YWxpZCBhY3Rpb24gbGluZTogJXNcbiIsIGFjdGlvbik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQl9Ci0JZnJlZShzKTsKLQotCXJlc3VsdCA9IC0xOwotCWZvciAoaT0xOyBpIDw9IDM7IGkrKykgewotCQlpZiAoY2FzZXNbaV0gPT0gLTEpIHsKLQkJCXJmYkxvZygiYWNjZXB0X2NsaWVudDogZGVmYXVsdCBhY3Rpb24gaXMgY2FzZT0lZCAlc1xuIiwKLQkJCSAgICBpLCBsYWJlbHNbaV0pOwotCQkJcmVzdWx0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJcmZiTG9nKCJhY2NlcHRfY2xpZW50OiBubyBkZWZhdWx0IGFjdGlvblxuIik7Ci0JfQotCWZvciAoaT0xOyBpIDw9IDM7IGkrKykgewotCQlpZiAoY2FzZXNbaV0gPj0gMCAmJiBjYXNlc1tpXSA9PSByYykgewotCQkJcmZiTG9nKCJhY2NlcHRfY2xpZW50OiBtYXRjaGVkIGFjdGlvbiBpcyBjYXNlPSVkICVzXG4iLAotCQkJICAgIGksIGxhYmVsc1tpXSk7Ci0JCQlyZXN1bHQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcmZiTG9nKCJubyBhY3Rpb24gbWF0Y2g6ICVzIHJjPSVkIHNldCB0byBub1xuIiwgYWN0aW9uLCByYyk7Ci0JCXJlc3VsdCA9IDI7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHVnbHlfZ2VvbShjaGFyICpwLCBpbnQgKngsIGludCAqeSkgewotCWludCB4MSwgeTE7Ci0KLQlpZiAoc3NjYW5mKHAsICIrJWQrJWQiLCAmeDEsICZ5MSkgPT0gMikgewotCQkqeCA9IHgxOwotCQkqeSA9IHkxOwotCX0gZWxzZSBpZiAoc3NjYW5mKHAsICIrJWQtJWQiLCAmeDEsICZ5MSkgPT0gMikgewotCQkqeCA9IHgxOwotCQkqeSA9IC15MTsKLQl9IGVsc2UgaWYgKHNzY2FuZihwLCAiLSVkKyVkIiwgJngxLCAmeTEpID09IDIpIHsKLQkJKnggPSAteDE7Ci0JCSp5ID0geTE7Ci0JfSBlbHNlIGlmIChzc2NhbmYocCwgIi0lZC0lZCIsICZ4MSwgJnkxKSA9PSAyKSB7Ci0JCSp4ID0gLXgxOwotCQkqeSA9IC15MTsKLQl9Ci19Ci0KLS8qCi0gKiBTaW1wbGUgcm91dGluZSB0byBwcm9tcHQgdGhlIHVzZXIgb24gdGhlIFggZGlzcGxheSB3aGV0aGVyIGFuIGluY29taW5nCi0gKiBjbGllbnQgc2hvdWxkIGJlIGFsbG93ZWQgdG8gY29ubmVjdCBvciBub3QuICBJZiBhIGd1aSBpcyBpbnZvbHZlZCBpdAotICogd2lsbCBiZSBydW5uaW5nIGluIHRoZSBlbnZpcm9ubWVudC9jb250ZXh0IG9mIHRoZSBYMTEgRElTUExBWS4KLSAqCi0gKiBUaGUgY29tbWFuZCBzdXBwbGllZCB2aWEgLWFjY2VwdCBpcyBydW4gYXMgaXMgKGkuZS4gbm8gc3RyaW5nCi0gKiBzdWJzdGl0dXRpb24pIHdpdGggdGhlIFJGQl9DTElFTlRfSVAgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHRvIHRoZQotICogaW5jb21pbmcgY2xpZW50J3MgbnVtZXJpY2FsIElQIGFkZHJlc3MuCi0gKiAKLSAqIElmIHRoZSBleHRlcm5hbCBjb21tYW5kIGV4aXRzIHdpdGggMCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkLCBvdGhlcndpc2UKLSAqIHRoZSBjbGllbnQgaXMgcmVqZWN0ZWQuCi0gKiAKLSAqIFNvbWUgYnVpbHRpbnMgYXJlIHByb3ZpZGVkOgotICoKLSAqCXhtZXNzYWdlOiAgdXNlIGhvbWVicmV3IHhtZXNzYWdlKDEpIGZvciB0aGUgZXh0ZXJuYWwgY29tbWFuZC4gIAotICoJcG9wdXA6ICAgICB1c2UgaW50ZXJuYWwgWCB3aWRnZXRzIGZvciBwcm9tcHRpbmcuCi0gKiAKLSAqLwotaW50IGFjY2VwdF9jbGllbnQocmZiQ2xpZW50UHRyIGNsaWVudCkgewotCi0JY2hhciB4bWVzc2FnZVsyMDBdLCAqY21kID0gTlVMTDsKLQljaGFyICphZGRyID0gY2xpZW50LT5ob3N0OwotCWNoYXIgKmFjdGlvbiA9IE5VTEw7Ci0KLQlpZiAoYWNjZXB0X2NtZCA9PSBOVUxMIHx8ICphY2NlcHRfY21kID09ICdcMCcpIHsKLQkJcmV0dXJuIDE7CS8qIG5vIGNvbW1hbmQgc3BlY2lmaWVkLCBzbyB3ZSBhY2NlcHQgKi8KLQl9Ci0KLQlpZiAoYWRkciA9PSBOVUxMIHx8IGFkZHJbMF0gPT0gJ1wwJykgewotCQlhZGRyID0gInVua25vd24taG9zdCI7Ci0JfQotCi0JaWYgKHN0cnN0cihhY2NlcHRfY21kLCAicG9wdXAiKSA9PSBhY2NlcHRfY21kKSB7Ci0JCS8qIHVzZSBvdXIgYnVpbHRpbiBwb3B1cCBidXR0b24gKi8KLQotCQkvKiAocG9wdXB8cG9wdXBrZXl8cG9wdXBtb3VzZSlbKy1YKy1ZXVs6dGltZW91dF0gKi8KLQotCQlpbnQgcmV0LCB0aW1lb3V0ID0gMTIwOwotCQlpbnQgeCA9IC02NDAwMCwgeSA9IC02NDAwMDsKLQkJY2hhciAqcCwgKm1vZGU7Ci0JCWNoYXIgKnVzZXJob3N0ID0gaWRlbnRfdXNlcm5hbWUoY2xpZW50KTsKLQotCQkvKiBleHRyYWN0IHRpbWVvdXQgKi8KLQkJaWYgKChwID0gc3RyY2hyKGFjY2VwdF9jbWQsICc6JykpICE9IE5VTEwpIHsKLQkJCWludCBpbjsKLQkJCWlmIChzc2NhbmYocCsxLCAiJWQiLCAmaW4pID09IDEpIHsKLQkJCQl0aW1lb3V0ID0gaW47Ci0JCQl9Ci0JCX0KLQkJLyogZXh0cmFjdCBnZW9tZXRyeSAqLwotCQlpZiAoKHAgPSBzdHJwYnJrKGFjY2VwdF9jbWQsICIrLSIpKSAhPSBOVUxMKSB7Ci0JCQl1Z2x5X2dlb20ocCwgJngsICZ5KTsKLQkJfQotCi0JCS8qIGZpbmQgbW9kZTogbW91c2UsIGtleSwgb3IgYm90aCAqLwotCQlpZiAoc3Ryc3RyKGFjY2VwdF9jbWQsICJwb3B1cG1vdXNlIikgPT0gYWNjZXB0X2NtZCkgewotCQkJbW9kZSA9ICJtb3VzZV9vbmx5IjsKLQkJfSBlbHNlIGlmIChzdHJzdHIoYWNjZXB0X2NtZCwgInBvcHVwa2V5IikgPT0gYWNjZXB0X2NtZCkgewotCQkJbW9kZSA9ICJrZXlfb25seSI7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlID0gImJvdGgiOwotCQl9Ci0KLQkJaWYgKGRweSA9PSBOVUxMICYmIHVzZV9kcHkgJiYgc3Ryc3RyKHVzZV9kcHksICJXQUlUOiIpID09Ci0JCSAgICB1c2VfZHB5KSB7Ci0JCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHdhcm5pbmcgYWxsb3dpbmcgY2xpZW50IHVuZGVyIGNvbmRpdGlvbnM6XG4iKTsKLQkJCXJmYkxvZygiICAtZGlzcGxheSBXQUlUOiwgZHB5ID09IE5VTEwsIC1hY2NlcHQgcG9wdXAuXG4iKTsKLQkJCXJmYkxvZygiICAgVGhlcmUgd2lsbCBiZSBhbm90aGVyIHBvcHVwLlxuIik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCXJmYkxvZygiYWNjZXB0X2NsaWVudDogdXNpbmcgYnVpbHRpbiBwb3B1cCBmb3I6ICVzXG4iLCBhZGRyKTsKLQkJaWYgKChyZXQgPSB1Z2x5X3dpbmRvdyhhZGRyLCB1c2VyaG9zdCwgeCwgeSwgdGltZW91dCwKLQkJICAgIG1vZGUsIDEpKSkgewotCQkJZnJlZSh1c2VyaG9zdCk7Ci0JCQlpZiAocmV0ID09IDIpIHsKLQkJCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHZpZXdvbmx5OiAlc1xuIiwgYWRkcik7Ci0JCQkJY2xpZW50LT52aWV3T25seSA9IFRSVUU7Ci0JCQl9Ci0JCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHBvcHVwIGFjY2VwdGVkOiAlc1xuIiwgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIHsKLQkJCWZyZWUodXNlcmhvc3QpOwotCQkJcmZiTG9nKCJhY2NlcHRfY2xpZW50OiBwb3B1cCByZWplY3RlZDogJXNcbiIsIGFkZHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCX0gZWxzZSBpZiAoIXN0cmNtcChhY2NlcHRfY21kLCAieG1lc3NhZ2UiKSkgewotCQkvKiBtYWtlIG91ciBvd24gY29tbWFuZCB1c2luZyB4bWVzc2FnZSgxKSAqLwotCi0JCWlmICh2aWV3X29ubHkpIHsKLQkJCXNwcmludGYoeG1lc3NhZ2UsICJ4bWVzc2FnZSAtYnV0dG9ucyB5ZXM6MCxubzoyIC1jZW50ZXIiCi0JCQkgICAgIiAneDExdm5jOiBhY2NlcHQgY29ubmVjdGlvbiBmcm9tICVzPyciLCBhZGRyKTsKLQkJfSBlbHNlIHsKLQkJCXNwcmludGYoeG1lc3NhZ2UsICJ4bWVzc2FnZSAtYnV0dG9ucyB5ZXM6MCxubzoyLCIKLQkJCSAgICAidmlldy1vbmx5OjMgLWNlbnRlciIgIiAneDExdm5jOiBhY2NlcHQgY29ubmVjdGlvbiIKLQkJCSAgICAiIGZyb20gJXM/JyIsIGFkZHIpOwotCQkJYWN0aW9uID0gInllczowLG5vOiosdmlldzozIjsKLQkJfQotCQljbWQgPSB4bWVzc2FnZTsKLQkJCi0JfSBlbHNlIHsKLQkJLyogdXNlIHRoZSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQ6ICovCi0KLQkJY21kID0gYWNjZXB0X2NtZDsKLQotCQkvKiBleHRyYWN0IGFueSBhY3Rpb24gcHJlZml4OiAgeWVzOk4sbm86TSx2aWV3OksgKi8KLQkJaWYgKHN0cnN0cihhY2NlcHRfY21kLCAieWVzOiIpID09IGFjY2VwdF9jbWQpIHsKLQkJCWNoYXIgKnA7Ci0JCQlpZiAoKHAgPSBzdHJwYnJrKGFjY2VwdF9jbWQsICIgXHQiKSkgIT0gTlVMTCkgewotCQkJCWludCBpOwotCQkJCWNtZCA9IHA7Ci0JCQkJcCA9IGFjY2VwdF9jbWQ7Ci0JCQkJZm9yIChpPTA7IGk8MjAwOyBpKyspIHsKLQkJCQkJaWYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSB7Ci0JCQkJCQl4bWVzc2FnZVtpXSA9ICdcMCc7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl4bWVzc2FnZVtpXSA9ICpwOwotCQkJCQlwKys7Ci0JCQkJfQotCQkJCXhtZXNzYWdlWzIwMC0xXSA9ICdcMCc7Ci0JCQkJYWN0aW9uID0geG1lc3NhZ2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoY21kKSB7Ci0JCWludCByYzsKLQotCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHVzaW5nIGNtZCBmb3I6ICVzXG4iLCBhZGRyKTsKLQkJcmMgPSBydW5fdXNlcl9jb21tYW5kKGNtZCwgY2xpZW50LCAiYWNjZXB0IiwgTlVMTCwgMCwgTlVMTCk7Ci0KLQkJaWYgKGFjdGlvbikgewotCQkJaW50IHJlc3VsdDsKLQotCQkJaWYgKHJjIDwgMCkgewotCQkJCXJmYkxvZygiYWNjZXB0X2NsaWVudDogY2Fubm90IHVzZSBuZWdhdGl2ZSAiCi0JCQkJICAgICJyYzogJWQsIGFjdGlvbiAlc1xuIiwgcmMsIGFjdGlvbik7Ci0JCQkJcmVzdWx0ID0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gYWN0aW9uX21hdGNoKGFjdGlvbiwgcmMpOwotCQkJfQotCi0JCQlpZiAocmVzdWx0ID09IDEpIHsKLQkJCQlyYyA9IDA7Ci0JCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAyKSB7Ci0JCQkJcmMgPSAxOwotCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMykgewotCQkJCXJjID0gMDsKLQkJCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IHZpZXdvbmx5OiAlc1xuIiwgYWRkcik7Ci0JCQkJY2xpZW50LT52aWV3T25seSA9IFRSVUU7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gMTsJLyogTk9UUkVBQ0hFRCAqLwotCQkJfQotCQl9Ci0KLQkJaWYgKHJjID09IDApIHsKLQkJCXJmYkxvZygiYWNjZXB0X2NsaWVudDogYWNjZXB0ZWQ6ICVzXG4iLCBhZGRyKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJhY2NlcHRfY2xpZW50OiByZWplY3RlZDogJXNcbiIsIGFkZHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlyZmJMb2coImFjY2VwdF9jbGllbnQ6IG5vIGNvbW1hbmQsIHJlamVjdGluZyAlc1xuIiwgYWRkcik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIHJldHVybiAwOyBOT1RSRUFDSEVEICovCi19Ci0KLXZvaWQgY2hlY2tfaXB2Nl9saXN0ZW4obG9uZyB1c2VjKSB7Ci0jaWYgWDExVk5DX0lQVjYKLQlmZF9zZXQgZmRzOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCWludCBuZmRzLCBjc29jayA9IC0xLCBvbmUgPSAxOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjsKLQlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IG5tYXggPSAwOwotCWNoYXIgKm5hbWU7Ci0KLQlpZiAoIWlwdjZfbGlzdGVuIHx8IG5vaXB2NikgewotCQlyZXR1cm47Ci0JfQotCWlmIChpcHY2X2xpc3Rlbl9mZCA8IDAgJiYgaXB2Nl9odHRwX2ZkIDwgMCkgewotCQlyZXR1cm47Ci0JfQotCi0JRkRfWkVSTygmZmRzKTsKLQlpZiAoaXB2Nl9saXN0ZW5fZmQgPj0gMCkgewotCQlGRF9TRVQoaXB2Nl9saXN0ZW5fZmQsICZmZHMpOwotCQlubWF4ID0gaXB2Nl9saXN0ZW5fZmQ7Ci0JfQotCWlmIChpcHY2X2h0dHBfZmQgPj0gMCAmJiBzY3JlZW4tPmh0dHBTb2NrIDwgMCkgewotCQlGRF9TRVQoaXB2Nl9odHRwX2ZkLCAmZmRzKTsKLQkJaWYgKGlwdjZfaHR0cF9mZCA+IG5tYXgpIHsKLQkJCW5tYXggPSBpcHY2X2h0dHBfZmQ7Ci0JCX0KLQl9Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCi0JbmZkcyA9IHNlbGVjdChubWF4KzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLQlpZiAobmZkcyA8PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXB2Nl9saXN0ZW5fZmQgPj0gMCAmJiBGRF9JU1NFVChpcHY2X2xpc3Rlbl9mZCwgJmZkcykpIHsKLQotCQljc29jayA9IGFjY2VwdChpcHY2X2xpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCWlmIChjc29jayA8IDApIHsKLQkJCXJmYkxvZ1BlcnJvcigiY2hlY2tfaXB2Nl9saXN0ZW46IGFjY2VwdCIpOwotCQkJZ290byBlcnIxOwotCQl9Ci0JCWlmIChmY250bChjc29jaywgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKSB7Ci0JCQlyZmJMb2dQZXJyb3IoImNoZWNrX2lwdjZfbGlzdGVuOiBmY250bCIpOwotCQkJY2xvc2UoY3NvY2spOwotCQkJZ290byBlcnIxOwotCQl9Ci0JCWlmIChzZXRzb2Nrb3B0KGNzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0JCSAgICAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLQkJCXJmYkxvZ1BlcnJvcigiY2hlY2tfaXB2Nl9saXN0ZW46IHNldHNvY2tvcHQiKTsKLQkJCWNsb3NlKGNzb2NrKTsKLQkJCWdvdG8gZXJyMTsKLQkJfQotCi0JCW5hbWUgPSBpcHY2X2dldGlwYWRkcigoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBhZGRybGVuKTsKLQotCQlpcHY2X2NsaWVudF9pcF9zdHIgPSBuYW1lOwotCQljbCA9IHJmYk5ld0NsaWVudChzY3JlZW4sIGNzb2NrKTsKLQkJaXB2Nl9jbGllbnRfaXBfc3RyID0gTlVMTDsKLQkJaWYgKGNsID09IE5VTEwpIHsKLQkJCWNsb3NlKGNzb2NrKTsKLQkJCWdvdG8gZXJyMTsKLQkJfQotCi0JCWlmIChuYW1lKSB7Ci0JCQlpZiAoY2wtPmhvc3QpIHsKLQkJCQlmcmVlKGNsLT5ob3N0KTsKLQkJCX0KLQkJCWNsLT5ob3N0ID0gbmFtZTsKLQkJCXJmYkxvZygiaXB2NiBjbGllbnQ6ICVzXG4iLCBuYW1lKTsKLQkJfQotCX0KLQotCWVycjE6Ci0KLQlpZiAoaXB2Nl9odHRwX2ZkID49IDAgJiYgRkRfSVNTRVQoaXB2Nl9odHRwX2ZkLCAmZmRzKSkgewotCi0JCWNzb2NrID0gYWNjZXB0KGlwdjZfaHR0cF9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCWlmIChjc29jayA8IDApIHsKLQkJCXJmYkxvZ1BlcnJvcigiY2hlY2tfaXB2Nl9saXN0ZW46IGFjY2VwdCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmY250bChjc29jaywgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKSB7Ci0JCQlyZmJMb2dQZXJyb3IoImNoZWNrX2lwdjZfbGlzdGVuOiBmY250bCIpOwotCQkJY2xvc2UoY3NvY2spOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzZXRzb2Nrb3B0KGNzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0JCSAgICAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLQkJCXJmYkxvZ1BlcnJvcigiY2hlY2tfaXB2Nl9saXN0ZW46IHNldHNvY2tvcHQiKTsKLQkJCWNsb3NlKGNzb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXJmYkxvZygiY2hlY2tfaXB2Nl9saXN0ZW46IHNldHRpbmcgaHR0cFNvY2sgdG8gJWRcbiIsIGNzb2NrKTsKLQkJc2NyZWVuLT5odHRwU29jayA9IGNzb2NrOwotCi0JCWlmIChzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrIDwgMCkgewotCQkJLyogdGhpcyBtYXkgbm90IGFsd2F5cyB3b3JrLi4uICovCi0JCQlpbnQgc2F2ZSA9IHNjcmVlbi0+aHR0cExpc3RlblNvY2s7Ci0JCQlzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID0gaXB2Nl9odHRwX2ZkOwkKLQkJCXJmYkxvZygiY2hlY2tfaXB2Nl9saXN0ZW46IG5vIGh0dHBMaXN0ZW5Tb2NrLCBjYWxsaW5nIHJmYkh0dHBDaGVja0ZkcygpXG4iKTsKLQkJCXJmYkh0dHBDaGVja0ZkcyhzY3JlZW4pOwotCQkJc2NyZWVuLT5odHRwTGlzdGVuU29jayA9IHNhdmU7CQotCQl9Ci0JfQotI2VuZGlmCi0JaWYgKHVzZWMpIHt9Ci19Ci0KLXZvaWQgY2hlY2tfdW5peF9zb2NrKGxvbmcgdXNlYykgewotCWZkX3NldCBmZHM7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IG5mZHMsIGNzb2NrID0gLTE7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCWludCBubWF4ID0gMDsKLQljaGFyICpuYW1lOwotCi0JaWYgKCF1bml4X3NvY2sgfHwgdW5peF9zb2NrX2ZkIDwgMCkgewotCQlyZXR1cm47Ci0JfQotCi0JRkRfWkVSTygmZmRzKTsKLQlpZiAodW5peF9zb2NrX2ZkID49IDApIHsKLQkJRkRfU0VUKHVuaXhfc29ja19mZCwgJmZkcyk7Ci0JCW5tYXggPSB1bml4X3NvY2tfZmQ7Ci0JfQotCi0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQotCW5mZHMgPSBzZWxlY3Qobm1heCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JaWYgKG5mZHMgPD0gMCkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVuaXhfc29ja19mZCA+PSAwICYmIEZEX0lTU0VUKHVuaXhfc29ja19mZCwgJmZkcykpIHsKLQkJY3NvY2sgPSBhY2NlcHRfdW5peCh1bml4X3NvY2tfZmQpOwotCQlpZiAoY3NvY2sgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZjbnRsKGNzb2NrLCBGX1NFVEZMLCBPX05PTkJMT0NLKSA8IDApIHsKLQkJCXJmYkxvZ1BlcnJvcigiY2hlY2tfdW5peF9zb2NrOiBmY250bCIpOwotCQkJY2xvc2UoY3NvY2spOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogcmZiTmV3Q2xpZW50KCkgd2lsbCBzY3JldyB1cyB3aXRoIHNldHNvY2tvcHQgVENQX05PREVMQVkuLi4KLQkJICAgeW91IG5lZWQgdG8gY29tbWVudCBvdXQgaW4gbGlidm5jc2VydmVyL3JmYnNlcnZlci5jOgotCQkJcmZiTG9nUGVycm9yKCJzZXRzb2Nrb3B0IGZhaWxlZCIpOwotCQkJY2xvc2Uoc29jayk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJICovCi0JCWNsID0gcmZiTmV3Q2xpZW50KHNjcmVlbiwgY3NvY2spOwotCi0JCWlmIChjbCA9PSBOVUxMKSB7Ci0JCQljbG9zZShjc29jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQluYW1lID0gc3RyZHVwKHVuaXhfc29jayk7Ci0KLQkJaWYgKG5hbWUpIHsKLQkJCWlmIChjbC0+aG9zdCkgewotCQkJCWZyZWUoY2wtPmhvc3QpOwotCQkJfQotCQkJY2wtPmhvc3QgPSBuYW1lOwotCQkJcmZiTG9nKCJ1bml4IHNvY2sgY2xpZW50OiAlc1xuIiwgbmFtZSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBGb3IgdGhlIC1jb25uZWN0IDxmaWxlPiBvcHRpb246IHBlcmlvZGljYWxseSByZWFkIHRoZSBmaWxlIGxvb2tpbmcgZm9yCi0gKiBhIGNvbm5lY3Qgc3RyaW5nLiAgSWYgb25lIGlzIGZvdW5kIHNldCBjbGllbnRfY29ubmVjdCB0byBpdC4KLSAqLwotc3RhdGljIHZvaWQgY2hlY2tfY29ubmVjdF9maWxlKGNoYXIgKmZpbGUpIHsKLQlGSUxFICppbjsKLQljaGFyIGxpbmVbVk5DX0NPTk5FQ1RfTUFYXSwgaG9zdFtWTkNfQ09OTkVDVF9NQVhdOwotCXN0YXRpYyBpbnQgZmlyc3Rfd2FybiA9IDEsIHRydW5jYXRlX29rID0gMTsKLQlzdGF0aWMgZG91YmxlIGxhc3RfdGltZSA9IDAuMCwgZGVsYXkgPSAwLjU7IAotCWRvdWJsZSBub3cgPSBkbm93KCk7Ci0Jc3RydWN0IHN0YXQgc2J1ZjsKLQotCWlmIChsYXN0X3RpbWUgPT0gMC4wKSB7Ci0JCWlmICghZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQUNUSVZFIikpIHsKLQkJCS8qIHNraXAgZmlyc3QgKi8KLQkJCWxhc3RfdGltZSA9IG5vdzsKLQkJfSBlbHNlIHsKLQkJCWRlbGF5ID0gMC4yNTsKLQkJfQotCX0KLQlpZiAobm93IC0gbGFzdF90aW1lIDwgZGVsYXkpIHsKLQkJLyogY2hlY2sgb25seSBhYm91dCBvbmNlIGEgc2Vjb25kICovCi0JCXJldHVybjsKLQl9Ci0JbGFzdF90aW1lID0gbm93OwotCi0JaWYgKCEgdHJ1bmNhdGVfb2spIHsKLQkJLyogY2hlY2sgaWYgcGVybWlzc2lvbnMgY2hhbmdlZCAqLwotCQlpZiAoYWNjZXNzKGZpbGUsIFdfT0spID09IDApIHsKLQkJCXRydW5jYXRlX29rID0gMTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlmIChzdGF0KGZpbGUsICZzYnVmKSA9PSAwKSB7Ci0JCS8qIHNraXAgZW1wdHkgZmlsZSBkaXJlY3RseSAqLwotCQlpZiAoc2J1Zi5zdF9zaXplID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWluID0gZm9wZW4oZmlsZSwgInIiKTsKLQlpZiAoaW4gPT0gTlVMTCkgewotCQlpZiAoZmlyc3Rfd2FybikgewotCQkJcmZiTG9nKCJjaGVja19jb25uZWN0X2ZpbGU6IGZvcGVuIGZhaWx1cmU6ICVzXG4iLCBmaWxlKTsKLQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCWZpcnN0X3dhcm4gPSAwOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZmdldHMobGluZSwgVk5DX0NPTk5FQ1RfTUFYLCBpbikgIT0gTlVMTCkgewotCQlpZiAoc3NjYW5mKGxpbmUsICIlcyIsIGhvc3QpID09IDEpIHsKLQkJCWlmIChzdHJsZW4oaG9zdCkgPiAwKSB7Ci0JCQkJY2hhciAqc3RyID0gc3RyZHVwKGhvc3QpOwotCQkJCWlmIChzdHJsZW4oc3RyKSA+IDM4KSB7Ci0JCQkJCWNoYXIgdHJpbVsxMDBdOyAKLQkJCQkJdHJpbVswXSA9ICdcMCc7Ci0JCQkJCXN0cm5jYXQodHJpbSwgc3RyLCAzOCk7Ci0JCQkJCXJmYkxvZygicmVhZCBjb25uZWN0IGZpbGU6ICVzIC4uLlxuIiwKLQkJCQkJICAgIHRyaW0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJmYkxvZygicmVhZCBjb25uZWN0IGZpbGU6ICVzXG4iLCBzdHIpOwotCQkJCX0KLQkJCQlpZiAoIXN0cmNtcChzdHIsICJjbWQ9c3RvcCIpICYmCi0JCQkJICAgIGRub3d4KCkgPCAzLjApIHsKLQkJCQkJcmZiTG9nKCJpZ25vcmluZyBzdGFsZSBjbWQ9c3RvcFxuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2xpZW50X2Nvbm5lY3QgPSBzdHI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWZjbG9zZShpbik7Ci0KLQkvKiB0cnVuY2F0ZSBmaWxlICovCi0JaW4gPSBmb3BlbihmaWxlLCAidyIpOwotCWlmIChpbiAhPSBOVUxMKSB7Ci0JCWZjbG9zZShpbik7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBpZiB3ZSBjYW5ub3QgdHJ1bmNhdGUgKi8KLQkJcmZiTG9nKCJjaGVja19jb25uZWN0X2ZpbGU6IGNvdWxkIG5vdCB0cnVuY2F0ZSAlcywgIgotCQkgICAiZGlzYWJsaW5nIGNoZWNraW5nLlxuIiwgZmlsZSk7Ci0JCXRydW5jYXRlX29rID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc29ja3M1X3Byb3h5KGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgc29jaykgewotCXVuc2lnbmVkIGNoYXIgYnVmWzUxMl0sIHRtcFsyXTsKLQljaGFyIHJlcGx5WzUxMl07Ci0JaW50IGxlbiwgbiwgaSwgaiA9IDA7Ci0KLQltZW1zZXQoYnVmLCAwLCA1MTIpOwotCW1lbXNldChyZXBseSwgMCwgNTEyKTsKLQotCWJ1ZlswXSA9IDB4NTsKLQlidWZbMV0gPSAweDE7Ci0JYnVmWzJdID0gMHgwOwotCi0Jd3JpdGUoc29jaywgYnVmLCAzKTsKLQotCW4gPSByZWFkKHNvY2ssIGJ1ZiwgMik7Ci0KLQlpZiAobiAhPSAyKSB7Ci0JCXJmYkxvZygic29ja3M1X3Byb3h5OiByZWFkIGVycm9yOiAlZFxuIiwgbik7Ci0JCWNsb3NlKHNvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGJ1ZlswXSAhPSAweDUgfHwgYnVmWzFdICE9IDB4MCkgewotCQlyZmJMb2coInNvY2tzNV9wcm94eTogaGFuZHNoYWtlIGVycm9yOiAlZCAlZFxuIiwgKGludCkgYnVmWzBdLCAoaW50KSBidWZbMV0pOwotCQljbG9zZShzb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYnVmWzBdID0gMHg1OwotCWJ1ZlsxXSA9IDB4MTsKLQlidWZbMl0gPSAweDA7Ci0JYnVmWzNdID0gMHgzOwotCi0JYnVmWzRdID0gKHVuc2lnbmVkIGNoYXIpIHN0cmxlbihob3N0KTsKLQlzdHJjYXQoKGNoYXIgKikgYnVmKzUsIGhvc3QpOyAKLQotCWxlbiA9IDUgKyBzdHJsZW4oaG9zdCk7Ci0KLQlidWZbbGVuXSAgID0gKHVuc2lnbmVkIGNoYXIpIChwb3J0ID4+IDgpOwotCWJ1ZltsZW4rMV0gPSAodW5zaWduZWQgY2hhcikgKHBvcnQgJiAweGZmKTsKLQotCXdyaXRlKHNvY2ssIGJ1ZiwgbGVuKzIpOwotCi0JZm9yIChpPTA7IGk8NDsgaSsrKSB7Ci0JCWludCBuOwotCQluID0gcmVhZChzb2NrLCB0bXAsIDEpOwotCQlqKys7Ci0JCWlmIChuIDwgMCkgewotCQkJaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWktLTsKLQkJCQlpZiAoaiA+IDEwMCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJcmVwbHlbaV0gPSB0bXBbMF07Ci0JfQotCWlmIChyZXBseVszXSA9PSAweDEpIHsKLQkJcmVhZChzb2NrLCByZXBseSs0LCA0ICsgMik7Ci0JfSBlbHNlIGlmIChyZXBseVszXSA9PSAweDMpIHsKLQkJbiA9IHJlYWQoc29jaywgdG1wLCAxKTsKLQkJcmVwbHlbNF0gPSB0bXBbMF07Ci0JCXJlYWQoc29jaywgcmVwbHkrNSwgKGludCkgcmVwbHlbNF0gKyAyKTsKLQl9IGVsc2UgaWYgKHJlcGx5WzNdID09IDB4NCkgewotCQlyZWFkKHNvY2ssIHJlcGx5KzQsIDE2ICsgMik7Ci0JfQotCi0JaWYgKDApIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPGxlbisyOyBpKyspIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiYlslZF06ICVkXG4iLCBpLCAoaW50KSBidWZbaV0pOwotCQl9Ci0JCWZvciAoaT0wOyBpPGxlbisyOyBpKyspIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiclslZF06ICVkXG4iLCBpLCAoaW50KSByZXBseVtpXSk7Ci0JCX0KLQl9Ci0JaWYgKHJlcGx5WzBdID09IDB4NSAmJiByZXBseVsxXSA9PSAweDAgJiYgcmVwbHlbMl0gPT0gMHgwKSB7Ci0JCXJmYkxvZygiU09DS1M1IGNvbm5lY3QgT0sgdG8gJXM6JWQgc29jaz0lZFxuIiwgaG9zdCwgcG9ydCwgc29jayk7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJmYkxvZygiU09DS1M1IGVycm9yIHRvICVzOiVkIHNvY2s9JWRcbiIsIGhvc3QsIHBvcnQsIHNvY2spOwotCQljbG9zZShzb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNvY2tzX3Byb3h5KGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgc29jaykgewotCXVuc2lnbmVkIGNoYXIgYnVmWzUxMl0sIHRtcFsyXTsKLQljaGFyIHJlcGx5WzE2XTsKLQlpbnQgc29ja3M0YSA9IDAsIGxlbiwgaSwgaiA9IDAsIGQxLCBkMiwgZDMsIGQ0OwotCi0JbWVtc2V0KGJ1ZiwgMCwgNTEyKTsKLQotCWJ1ZlswXSA9IDB4NDsKLQlidWZbMV0gPSAweDE7Ci0JYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpIChwb3J0ID4+IDgpOwotCWJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSAocG9ydCAmIDB4ZmYpOwotCi0KLQlpZiAoc3RybGVuKGhvc3QpID4gMjU2KSAgewotCQlyZmJMb2coInNvY2tzX3Byb3h5OiBob3N0bmFtZSB0b28gbG9uZzogJXNcbiIsIGhvc3QpOwotCQljbG9zZShzb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFzdHJjbXAoaG9zdCwgImxvY2FsaG9zdCIpIHx8ICFzdHJjbXAoaG9zdCwgIjEyNy4wLjAuMSIpKSB7Ci0JCWJ1Zls0XSA9IDEyNzsKLQkJYnVmWzVdID0gMDsKLQkJYnVmWzZdID0gMDsKLQkJYnVmWzddID0gMTsKLQl9IGVsc2UgaWYgKHNzY2FuZihob3N0LCAiJWQuJWQuJWQuJWQiLCAmZDEsICZkMiwgJmQzLCAmZDQpID09IDQpIHsKLQkJYnVmWzRdID0gKHVuc2lnbmVkIGNoYXIpIGQxOwotCQlidWZbNV0gPSAodW5zaWduZWQgY2hhcikgZDI7Ci0JCWJ1Zls2XSA9ICh1bnNpZ25lZCBjaGFyKSBkMzsKLQkJYnVmWzddID0gKHVuc2lnbmVkIGNoYXIpIGQ0OwotCX0gZWxzZSB7Ci0JCWJ1Zls0XSA9IDB4MDsKLQkJYnVmWzVdID0gMHgwOwotCQlidWZbNl0gPSAweDA7Ci0JCWJ1Zls3XSA9IDB4MzsKLQkJc29ja3M0YSA9IDE7Ci0JfQotCWxlbiA9IDg7Ci0KLQlzdHJjYXQoKGNoYXIgKilidWYrOCwgIm5vYm9keSIpOyAKLQlsZW4gKz0gc3RybGVuKCJub2JvZHkiKSArIDE7Ci0KLQlpZiAoc29ja3M0YSkgewotCQlzdHJjYXQoKGNoYXIgKikgYnVmKzgrc3RybGVuKCJub2JvZHkiKSArIDEsIGhvc3QpOwotCQlsZW4gKz0gc3RybGVuKGhvc3QpICsgMTsKLQl9Ci0KLQl3cml0ZShzb2NrLCBidWYsIGxlbik7Ci0KLQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJaW50IG47Ci0JCW4gPSByZWFkKHNvY2ssIHRtcCwgMSk7Ci0JCWorKzsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaS0tOwotCQkJCWlmIChqID4gMTAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCQlyZXBseVtpXSA9IHRtcFswXTsKLQl9Ci0JaWYgKDApIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImJbJWRdOiAlZFxuIiwgaSwgKGludCkgYnVmW2ldKTsKLQkJfQotCQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiclslZF06ICVkXG4iLCBpLCAoaW50KSByZXBseVtpXSk7Ci0JCX0KLQl9Ci0JaWYgKHJlcGx5WzBdID09IDB4MCAmJiByZXBseVsxXSA9PSAweDVhKSB7Ci0JCWlmIChzb2NrczRhKSB7Ci0JCQlyZmJMb2coIlNPQ0tTNGEgY29ubmVjdCBPSyB0byAlczolZCBzb2NrPSVkXG4iLCBob3N0LCBwb3J0LCBzb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiU09DS1M0ICBjb25uZWN0IE9LIHRvICVzOiVkIHNvY2s9JWRcbiIsIGhvc3QsIHBvcnQsIHNvY2spOwotCQl9Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCWlmIChzb2NrczRhKSB7Ci0JCQlyZmJMb2coIlNPQ0tTNGEgZXJyb3IgdG8gJXM6JWQgc29jaz0lZFxuIiwgaG9zdCwgcG9ydCwgc29jayk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIlNPQ0tTNCAgZXJyb3IgdG8gJXM6JWQgc29jaz0lZFxuIiwgaG9zdCwgcG9ydCwgc29jayk7Ci0JCX0KLQkJY2xvc2Uoc29jayk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotI2RlZmluZSBQWFlfSFRUUAkxCi0jZGVmaW5lIFBYWV9HRVQJCTIKLSNkZWZpbmUgUFhZX1NPQ0tTCTMKLSNkZWZpbmUgUFhZX1NPQ0tTNQk0Ci0jZGVmaW5lIFBYWV9TU0gJCTUKLSNkZWZpbmUgUFhZIDMKLQotc3RhdGljIGludCBweHlfZ2V0X3NvY2s7Ci0KLXN0YXRpYyBpbnQgcGNvbm5lY3QoaW50IHBzb2NrLCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IHR5cGUsIGNoYXIgKmh0dHBfcGF0aCwgY2hhciAqZ2V0aG9zdCwgaW50IGdldHBvcnQpIHsKLQljaGFyIHJlcGx5WzQwOTZdOwotCWludCBpLCBvaywgbGVuOwotCWNoYXIgKnJlcTsKLQotCXB4eV9nZXRfc29jayA9IC0xOwotCi0JaWYgKHR5cGUgPT0gUFhZX1NPQ0tTKSB7Ci0JCXJldHVybiBzb2Nrc19wcm94eShob3N0LCBwb3J0LCBwc29jayk7Ci0JfQotCWlmICh0eXBlID09IFBYWV9TT0NLUzUpIHsKLQkJcmV0dXJuIHNvY2tzNV9wcm94eShob3N0LCBwb3J0LCBwc29jayk7Ci0JfQotCWlmICh0eXBlID09IFBYWV9TU0gpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JbGVuID0gc3RybGVuKCJDT05ORUNUICIpICsgc3RybGVuKGhvc3QpOwotCWlmICh0eXBlID09IFBYWV9HRVQpIHsKLQkJbGVuICs9IHN0cmxlbihodHRwX3BhdGgpICsgc3RybGVuKGdldGhvc3QpOwotCQlsZW4gKz0gc3RybGVuKCJob3N0PSIpICsgMSArIHN0cmxlbigicG9ydD0iKSArIDEgKyAxOwotCX0KLQlsZW4gKz0gMSArIDIwICsgc3RybGVuKCJIVFRQLzEuMVxyXG4iKSArIDE7Ci0KLQlyZXEgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwotCi0JaWYgKHR5cGUgPT0gUFhZX0dFVCkgewotCQlpbnQgbm9xdWVyeSA9IDA7Ci0JCWNoYXIgKnQgPSBzdHJzdHIoaHR0cF9wYXRoLCAiX19FTkRfXyIpOwotCQlpZiAodCkgewotCQkJbm9xdWVyeSA9IDE7Ci0JCQkqdCA9ICdcMCc7Ci0JCX0KLQotCQlpZiAobm9xdWVyeSkgewotCQkJc3ByaW50ZihyZXEsICJHRVQgJXMgSFRUUC8xLjFcclxuIiwgaHR0cF9wYXRoKTsKLQkJfSBlbHNlIHsKLQkJCXNwcmludGYocmVxLCAiR0VUICVzaG9zdD0lcyZwb3J0PSVkIEhUVFAvMS4xXHJcbiIsIGh0dHBfcGF0aCwgaG9zdCwgcG9ydCk7Ci0JCX0KLQl9IGVsc2UgewotCQlzcHJpbnRmKHJlcSwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8xLjFcclxuIiwgaG9zdCwgcG9ydCk7Ci0JfQotCXJmYkxvZygiaHR0cCBwcm94eTogJXMiLCByZXEpOwotCXdyaXRlKHBzb2NrLCByZXEsIHN0cmxlbihyZXEpKTsKLQotCWlmICh0eXBlID09IFBYWV9HRVQpIHsKLQkJY2hhciAqdCA9ICJDb25uZWN0aW9uOiBjbG9zZVxyXG4iOwotCQl3cml0ZShwc29jaywgdCwgc3RybGVuKHQpKTsKLQl9Ci0KLQlpZiAodHlwZSA9PSBQWFlfR0VUKSB7Ci0JCXNwcmludGYocmVxLCAiSG9zdDogJXM6JWRcclxuIiwgZ2V0aG9zdCwgZ2V0cG9ydCk7Ci0JCXJmYkxvZygiaHR0cCBwcm94eTogJXMiLCByZXEpOwotCQlzcHJpbnRmKHJlcSwgIkhvc3Q6ICVzOiVkXHJcblxyXG4iLCBnZXRob3N0LCBnZXRwb3J0KTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKHJlcSwgIkhvc3Q6ICVzOiVkXHJcbiIsIGhvc3QsIHBvcnQpOwotCQlyZmJMb2coImh0dHAgcHJveHk6ICVzIiwgcmVxKTsKLQkJc3ByaW50ZihyZXEsICJIb3N0OiAlczolZFxyXG5cclxuIiwgaG9zdCwgcG9ydCk7Ci0JfQotCi0Jd3JpdGUocHNvY2ssIHJlcSwgc3RybGVuKHJlcSkpOwotCi0Jb2sgPSAwOwotCXJlcGx5WzBdID0gJ1wwJzsKLQotCWZvciAoaT0wOyBpPDQwOTY7IGkrKykgewotCQlpbnQgbjsKLQkJcmVxWzBdID0gcmVxWzFdID0gJ1wwJzsKLQkJbiA9IHJlYWQocHNvY2ssIHJlcSwgMSk7Ci0JCWlmIChuIDwgMCkgewotCQkJaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWlmIChuID09IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXN0cmNhdChyZXBseSwgcmVxKTsKLQkJaWYgKHN0cnN0cihyZXBseSwgIlxyXG5cclxuIikpIHsKLQkJCWlmIChzdHJzdHIocmVwbHksICJIVFRQLyIpID09IHJlcGx5KSB7Ci0JCQkJY2hhciAqcSA9IHN0cmNocihyZXBseSwgJyAnKTsKLQkJCQlpZiAocSkgewotCQkJCQlxKys7Ci0JCQkJCWlmIChxWzBdID09ICcyJyAmJiBxWzFdID09ICcwJyAmJiBxWzJdID09ICcwJyAmJiBxWzNdID09ICcgJykgewotCQkJCQkJb2sgPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAodHlwZSA9PSBQWFlfR0VUKSB7Ci0JCWNoYXIgKnQxID0gc3Ryc3RyKHJlcGx5LCAiVk5DLUlQLVBvcnQ6ICIpOwotCQljaGFyICp0MiA9IHN0cnN0cihyZXBseSwgIlZOQy1Ib3N0LVBvcnQ6ICIpOwotCQljaGFyICpzLCAqbmV3aG9zdCA9IE5VTEw7Ci0JCWludCBuZXdwb3J0ID0gMDsKLQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgcmVwbHkpOwotCQlpZiAodDEpIHsKLQkJCXQxICs9IHN0cmxlbigiVk5DLUlQLVBvcnQ6ICIpOwotCQkJcyA9IHN0cnN0cih0MSwgIjoiKTsKLQkJCWlmIChzKSB7Ci0JCQkJKnMgPSAnXDAnOwotCQkJCW5ld2hvc3QgPSBzdHJkdXAodDEpOwotCQkJCW5ld3BvcnQgPSBhdG9pKHMrMSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodDIpIHsKLQkJCXQyICs9IHN0cmxlbigiVk5DLUhvc3QtUG9ydDogIik7Ci0JCQlzID0gc3Ryc3RyKHQyLCAiOiIpOwotCQkJaWYgKHMpIHsKLQkJCQkqcyA9ICdcMCc7Ci0JCQkJbmV3aG9zdCA9IHN0cmR1cCh0Mik7Ci0JCQkJbmV3cG9ydCA9IGF0b2kocysxKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3aG9zdCAmJiBuZXdwb3J0ID4gMCkgewotCQkJcmZiTG9nKCJwcm94eSBHRVQgcmVjb25uZWN0IHRvOiAlczolZFxuIiwgbmV3aG9zdCwgbmV3cG9ydCk7Ci0JCQlweHlfZ2V0X3NvY2sgPSBjb25uZWN0X3RjcChuZXdob3N0LCBuZXdwb3J0KTsKLQkJfQotCX0KLQlmcmVlKHJlcSk7Ci0KLQlyZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgcHJveHlfY29ubmVjdChjaGFyICpob3N0LCBpbnQgcG9ydCkgewotCWNoYXIgKnAsICpxLCAqc3RyOwotCWludCBpLCBuLCBweHlbUFhZXSxweHlfcFtQWFldOwotCWludCBwc29jayA9IC0xOwotCWNoYXIgKnB4eV9oW1BYWV0sICpweHlfZ1tQWFldOwotCi0JaWYgKCEgY29ubmVjdF9wcm94eSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCXN0ciA9IHN0cmR1cChjb25uZWN0X3Byb3h5KTsKLQotCWZvciAoaT0wOyBpPFBYWTsgaSsrKSB7Ci0JCXB4eVtpXSA9IDA7Ci0JCXB4eV9wW2ldID0gMDsKLQkJcHh5X2hbaV0gPSBOVUxMOwotCQlweHlfZ1tpXSA9IE5VTEw7Ci0JfQotCi0JbiA9IDA7Ci0JcCA9IHN0cjsKLQl3aGlsZSAocCkgewotCQljaGFyICpocCwgKmMsICpzID0gTlVMTDsKLQotCQlxID0gc3RyY2hyKHAsICcsJyk7Ci0JCWlmIChxKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0KLQotCQlpZiAobj09MCkgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQlyZmJMb2coInByb3h5X2Nvbm5lY3RbJWRdOiAlc1xuIiwgbisxLCBwKTsKLQotCQlweHlbbl0gPSAwOwotCQlweHlfcFtuXSA9IDA7Ci0JCXB4eV9oW25dID0gTlVMTDsKLQkJcHh5X2dbbl0gPSBOVUxMOwotCi0JCWlmIChzdHJzdHIocCwgInNvY2tzOi8vIikgPT0gcCkJewotCQkJaHAgPSBzdHJzdHIocCwgIjovLyIpICsgMzsKLQkJCXB4eVtuXSA9IFBYWV9TT0NLUzsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInNvY2tzNDovLyIpID09IHApIHsKLQkJCWhwID0gc3Ryc3RyKHAsICI6Ly8iKSArIDM7Ci0JCQlweHlbbl0gPSBQWFlfU09DS1M7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJzb2NrczU6Ly8iKSA9PSBwKSB7Ci0JCQlocCA9IHN0cnN0cihwLCAiOi8vIikgKyAzOwotCQkJcHh5W25dID0gUFhZX1NPQ0tTNTsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInNzaDovLyIpID09IHApIHsKLQkJCWlmIChuICE9IDApIHsKLQkJCQlyZmJMb2coInNzaDovLyBwcm94eSBtdXN0IGJlIHRoZSBmaXJzdCBvbmVcbiIpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlocCA9IHN0cnN0cihwLCAiOi8vIikgKyAzOwotCQkJcHh5W25dID0gUFhZX1NTSDsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImh0dHA6Ly8iKSA9PSBwKSB7Ci0JCQlocCA9IHN0cnN0cihwLCAiOi8vIikgKyAzOwotCQkJcHh5W25dID0gUFhZX0hUVFA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJodHRwczovLyIpID09IHApIHsKLQkJCWhwID0gc3Ryc3RyKHAsICI6Ly8iKSArIDM7Ci0JCQlweHlbbl0gPSBQWFlfSFRUUDsKLQkJfSBlbHNlIHsKLQkJCWhwID0gcDsKLQkJCXB4eVtuXSA9IFBYWV9IVFRQOwotCQl9Ci0JCWMgPSBzdHJzdHIoaHAsICI6Iik7Ci0JCWlmICghYyAmJiBweHlbbl0gPT0gUFhZX1NTSCkgewotCQkJY2hhciAqaHAyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihocCkgKyA1KTsKLQkJCXNwcmludGYoaHAyLCAiJXM6MSIsIGhwKTsKLQkJCWhwID0gaHAyOwotCQkJYyA9IHN0cnN0cihocCwgIjoiKTsKLQkJfQotCQlpZiAoIWMpIHsKLQkJCXB4eVtuXSA9IDA7Ci0JCQlpZiAocSkgewotCQkJCSpxID0gJywnOwotCQkJCXAgPSBxICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcCA9IE5VTEw7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQotCQlpZiAocHh5W25dID09IFBYWV9IVFRQKSB7Ci0JCQlzID0gc3Ryc3RyKGMsICIvIik7Ci0JCQlpZiAocykgewotCQkJCXB4eVtuXSA9IFBYWV9HRVQ7Ci0JCQkJcHh5X2dbbl0gPSBzdHJkdXAocyk7Ci0JCQkJKnMgPSAnXDAnOwotCQkJfQotCQl9Ci0JCXB4eV9wW25dID0gYXRvaShjKzEpOwotCi0JCWlmIChweHlfcFtuXSA8PSAwKSB7Ci0JCQlweHlbbl0gPSAwOwotCQkJcHh5X3Bbbl0gPSAwOwotCQkJaWYgKHEpIHsKLQkJCQkqcSA9ICcsJzsKLQkJCQlwID0gcSArIDE7Ci0JCQl9IGVsc2UgewotCQkJCXAgPSBOVUxMOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJKmMgPSAnXDAnOwotCQlweHlfaFtuXSA9IHN0cmR1cChocCk7Ci0KLQkJaWYgKCsrbiA+PSBQWFkpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHEpIHsKLQkJCSpxID0gJywnOwotCQkJcCA9IHEgKyAxOwotCQl9IGVsc2UgewotCQkJcCA9IE5VTEw7Ci0JCX0KLQl9Ci0JZnJlZShzdHIpOwotCi0JaWYgKCFuKSB7Ci0JCXBzb2NrID0gLTE7Ci0JCWdvdG8gcHh5X2NsZWFuOwotCX0KLQotCWlmIChweHlbMF0gPT0gUFhZX1NTSCkgewotCQlpbnQgcmMsIGxlbiA9IDA7Ci0JCWNoYXIgKmNtZCwgKnNzaDsKLQkJaW50IHNwb3J0ID0gZmluZF9mcmVlX3BvcnQoNzMwMCwgODAwMCk7Ci0JCWlmIChnZXRlbnYoIlNTSCIpKSB7Ci0JCQlzc2ggPSBnZXRlbnYoIlNTSCIpOwotCQl9IGVsc2UgewotCQkJc3NoID0gInNzaCI7Ci0JCX0KLQkJbGVuID0gMjAwICsgc3RybGVuKHNzaCkgKyBzdHJsZW4ocHh5X2hbMF0pICsgc3RybGVuKGhvc3QpOwotCQljbWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQkJaWYgKG4gPT0gMSkgewotCQkJaWYgKHB4eV9wWzBdIDw9IDEpIHsKLQkJCQlzcHJpbnRmKGNtZCwgIiVzIC1mICAgICAgIC1MICclZDolczolZCcgJyVzJyAnc2xlZXAgMjAnIiwgc3NoLCAgICAgICAgICAgc3BvcnQsIGhvc3QsIHBvcnQsIHB4eV9oWzBdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3ByaW50ZihjbWQsICIlcyAtZiAtcCAlZCAtTCAnJWQ6JXM6JWQnICclcycgJ3NsZWVwIDIwJyIsIHNzaCwgcHh5X3BbMF0sIHNwb3J0LCBob3N0LCBwb3J0LCBweHlfaFswXSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHh5X3BbMF0gPD0gMSkgewotCQkJCXNwcmludGYoY21kLCAiJXMgLWYgICAgICAgLUwgJyVkOiVzOiVkJyAnJXMnICdzbGVlcCAyMCciLCBzc2gsICAgICAgICAgICBzcG9ydCwgcHh5X2hbMV0sIHB4eV9wWzFdLCBweHlfaFswXSk7Ci0JCQl9IGVsc2UgewotCQkJCXNwcmludGYoY21kLCAiJXMgLWYgLXAgJWQgLUwgJyVkOiVzOiVkJyAnJXMnICdzbGVlcCAyMCciLCBzc2gsIHB4eV9wWzBdLCBzcG9ydCwgcHh5X2hbMV0sIHB4eV9wWzFdLCBweHlfaFswXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygic3NoIikpIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJCXJmYkxvZygiICAgXCIlc1wiXG4iLCBjbWQpOwotCQkJcmZiTG9nKCIgICBleGl0aW5nLlxuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWNsb3NlX2V4ZWNfZmRzKCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJcmZiTG9nKCJydW5uaW5nOiAlc1xuIiwgY21kKTsKLQkJcmMgPSBzeXN0ZW0oY21kKTsKLQkJZnJlZShjbWQpOwotCQlpZiAocmMgIT0gMCkgewotCQkJcHNvY2sgPSAtMTsKLQkJCWdvdG8gcHh5X2NsZWFuOwotCQl9Ci0JCXBzb2NrID0gY29ubmVjdF90Y3AoImxvY2FsaG9zdCIsIHNwb3J0KTsKLQotCX0gZWxzZSB7Ci0JCXBzb2NrID0gY29ubmVjdF90Y3AocHh5X2hbMF0sIHB4eV9wWzBdKTsKLQl9Ci0KLQlpZiAocHNvY2sgPCAwKSB7Ci0JCXBzb2NrID0gLTE7Ci0JCWdvdG8gcHh5X2NsZWFuOwotCX0KLQlyZmJMb2coIm9wZW5lZCBzb2NrZXQgdG8gcHJveHk6ICVzOiVkXG4iLCBweHlfaFswXSwgcHh5X3BbMF0pOwotCi0JaWYgKG4gPj0gMikgewotCQlpZiAoISBwY29ubmVjdChwc29jaywgcHh5X2hbMV0sIHB4eV9wWzFdLCBweHlbMF0sIHB4eV9nWzBdLCBweHlfaFswXSwgcHh5X3BbMF0pKSB7Ci0JCQljbG9zZShwc29jayk7IHBzb2NrID0gLTE7IGdvdG8gcHh5X2NsZWFuOwotCQl9Ci0JCWlmIChweHlfZ2V0X3NvY2sgPj0gMCkge2Nsb3NlKHBzb2NrKTsgcHNvY2sgPSBweHlfZ2V0X3NvY2s7fQotCQkKLQkJaWYgKG4gPj0gMykgewotCQkJaWYgKCEgcGNvbm5lY3QocHNvY2ssIHB4eV9oWzJdLCBweHlfcFsyXSwgcHh5WzFdLCBweHlfZ1sxXSwgcHh5X2hbMV0sIHB4eV9wWzFdKSkgewotCQkJCWNsb3NlKHBzb2NrKTsgcHNvY2sgPSAtMTsgZ290byBweHlfY2xlYW47Ci0JCQl9Ci0JCQlpZiAocHh5X2dldF9zb2NrID49IDApIHtjbG9zZShwc29jayk7IHBzb2NrID0gcHh5X2dldF9zb2NrO30KLQkJCWlmICghIHBjb25uZWN0KHBzb2NrLCBob3N0LCBwb3J0LCBweHlbMl0sIHB4eV9nWzJdLCBweHlfaFsyXSwgcHh5X3BbMl0pKSB7Ci0JCQkJY2xvc2UocHNvY2spOyBwc29jayA9IC0xOyBnb3RvIHB4eV9jbGVhbjsKLQkJCX0KLQkJCWlmIChweHlfZ2V0X3NvY2sgPj0gMCkge2Nsb3NlKHBzb2NrKTsgcHNvY2sgPSBweHlfZ2V0X3NvY2s7fQotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoISBwY29ubmVjdChwc29jaywgaG9zdCwgcG9ydCwgcHh5WzFdLCBweHlfZ1sxXSwgcHh5X2hbMV0sIHB4eV9wWzFdKSkgewotCQkJCWNsb3NlKHBzb2NrKTsgcHNvY2sgPSAtMTsgZ290byBweHlfY2xlYW47Ci0JCQl9Ci0JCQlpZiAocHh5X2dldF9zb2NrID49IDApIHtjbG9zZShwc29jayk7IHBzb2NrID0gcHh5X2dldF9zb2NrO30KLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghIHBjb25uZWN0KHBzb2NrLCBob3N0LCBwb3J0LCBweHlbMF0sIHB4eV9nWzBdLCBweHlfaFswXSwgcHh5X3BbMF0pKSB7Ci0JCQljbG9zZShwc29jayk7IHBzb2NrID0gLTE7IGdvdG8gcHh5X2NsZWFuOwotCQl9Ci0JCWlmIChweHlfZ2V0X3NvY2sgPj0gMCkge2Nsb3NlKHBzb2NrKTsgcHNvY2sgPSBweHlfZ2V0X3NvY2s7fQotCX0KLQotCXB4eV9jbGVhbjoKLQlmb3IgKGk9MDsgaSA8IFBYWTsgaSsrKSB7Ci0JCWlmIChweHlfaFtpXSAhPSBOVUxMKSB7Ci0JCQlmcmVlKHB4eV9oW2ldKTsKLQkJfQotCQlpZiAocHh5X2dbaV0gIT0gTlVMTCkgewotCQkJZnJlZShweHlfZ1tpXSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcHNvY2s7Ci19Ci0KLWNoYXIgKmdldF9yZXBlYXRlcl9zdHJpbmcoY2hhciAqc3RyLCBpbnQgKmxlbikgewotCWludCBwcmVuLCB3aGljaCA9IDA7Ci0JaW50IHByZXN0cmluZ19sZW4gPSAwOwkKLQljaGFyICpwcmVzdHJpbmcgPSBOVUxMLCAqcHRtcCA9IE5VTEw7Ci0JY2hhciAqZXF1YWxzID0gc3RyY2hyKHN0ciwgJz0nKTsKLQljaGFyICpwbHVzICAgPSBzdHJyY2hyKHN0ciwgJysnKTsKLQotCSpsZW4gPSAwOwotCWlmICghcGx1cyB8fCAhZXF1YWxzKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCSpwbHVzID0gJ1wwJzsKLQlpZiAoc3Ryc3RyKHN0ciwgInJlcGVhdGVyPSIpID09IHN0cikgewotCQkvKiB1bHRyYXZuYyByZXBlYXRlciBodHRwOi8vd3d3LnV2bmMuY29tL2FkZG9ucy9yZXBlYXRlci5odG1sICovCi0JCXByZXN0cmluZ19sZW4gPSAyNTA7Ci0JCXB0bXAgPSAoY2hhciAqKSBjYWxsb2MocHJlc3RyaW5nX2xlbisxLCAxKTsKLQkJc25wcmludGYocHRtcCwgMjUwLCAiJXMiLCBzdHIgKyBzdHJsZW4oInJlcGVhdGVyPSIpKTsKLQkJd2hpY2ggPSAxOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgInByZT0iKSA9PSBzdHIpIHsKLQkJcHJlc3RyaW5nX2xlbiA9IHN0cmxlbihzdHIgKyBzdHJsZW4oInByZT0iKSk7Ci0JCXB0bXAgPSAoY2hhciAqKSBjYWxsb2MocHJlc3RyaW5nX2xlbisxLCAxKTsKLQkJc25wcmludGYocHRtcCwgcHJlc3RyaW5nX2xlbisxLCAiJXMiLCBzdHIgKyBzdHJsZW4oInByZT0iKSk7Ci0JCXdoaWNoID0gMjsKLQl9IGVsc2UgaWYgKHNzY2FuZihzdHIsICJwcmUlZD0iLCAmcHJlbikgPT0gMSkgewotCQlpZiAocHJlbiA+IDAgJiYgcHJlbiA8PSAxNjM4NCkgewotCQkJcHJlc3RyaW5nX2xlbiA9IHByZW47Ci0JCQlwdG1wID0gKGNoYXIgKikgY2FsbG9jKHByZXN0cmluZ19sZW4rMSwgMSk7Ci0JCQlzbnByaW50ZihwcmVzdHJpbmcsIHByZXN0cmluZ19sZW4sICIlcyIsIGVxdWFscysxKTsKLQkJCXdoaWNoID0gMzsKLQkJfQotCX0KLQlpZiAocHRtcCAhPSBOVUxMKSB7Ci0JCWludCBpLCBrID0gMDsKLQkJY2hhciAqcCA9IHB0bXA7Ci0JCXByZXN0cmluZyA9IChjaGFyICopY2FsbG9jKHByZXN0cmluZ19sZW4rMSwgMSk7Ci0JCS8qIHRyYW5zbGF0ZSBcbiB0byBuZXdsaW5lLCBldGMuICovCi0JCWZvciAoaT0wOyBpIDwgcHJlc3RyaW5nX2xlbjsgaSsrKSB7Ci0JCQlpZiAoaSA8IHByZXN0cmluZ19sZW4tMSAmJiAqKHAraSkgPT0gJ1xcJykgewotCQkJCWlmICgqKHAraSsxKSA9PSAncicpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXHInOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAnbicpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXG4nOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAndCcpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXHQnOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAnYScpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXGEnOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAnYicpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXGInOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAndicpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXHYnOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAnZicpIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAnXGYnOyBpKys7Ci0JCQkJfSBlbHNlIGlmICgqKHAraSsxKSA9PSAnXFwnKSB7Ci0JCQkJCXByZXN0cmluZ1trKytdID0gJ1xcJzsgaSsrOwotCQkJCX0gZWxzZSBpZiAoKihwK2krMSkgPT0gJ2MnKSB7Ci0JCQkJCXByZXN0cmluZ1trKytdID0gJywnOyBpKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJlc3RyaW5nW2srK10gPSAqKHAraSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwcmVzdHJpbmdbaysrXSA9ICoocCtpKTsKLQkJCX0KLQkJfQotCQlpZiAod2hpY2ggPT0gMikgewotCQkJcHJlc3RyaW5nX2xlbiA9IGs7Ci0JCX0KLQkJaWYgKCFxdWlldCkgewotCQkJcmZiTG9nKCItY29ubmVjdCBwcmVzdHJpbmc6ICclcydcbiIsIHByZXN0cmluZyk7Ci0JCX0KLQkJZnJlZShwdG1wKTsKLQl9Ci0JKnBsdXMgPSAnKyc7Ci0KLQkqbGVuID0gcHJlc3RyaW5nX2xlbjsKLQlyZXR1cm4gcHJlc3RyaW5nOwotfQotCi0jaWZuZGVmIFVTRV9USU1FT1VUX0lOVEVSUlVQVAotI2RlZmluZSBVU0VfVElNRU9VVF9JTlRFUlJVUFQgMAotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJldmVyc2VfY29ubmVjdF90aW1lb3V0IChpbnQgc2lnKSB7Ci0JcmZiTG9nKCJzaWc6ICVkLCByZXZlcnNlX2Nvbm5lY3RfdGltZW91dC5cbiIsIHNpZyk7Ci0jaWYgVVNFX1RJTUVPVVRfSU5URVJSVVBUCi0JcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3RfdGltZW91dCBwcm9jZWVkaW5nIGFzc3VtaW5nIGNvbm5lY3QoMikgaW50ZXJydXB0LlxuIik7Ci0jZWxzZQotCWNsZWFuX3VwX2V4aXQoMCk7Ci0jZW5kaWYKLX0KLQotCi0vKgotICogRG8gYSByZXZlcnNlIGNvbm5lY3QgZm9yIGEgc2luZ2xlICJob3N0IiBvciAiaG9zdDpwb3J0IgotICovCi0KLXN0YXRpYyBpbnQgZG9fcmV2ZXJzZV9jb25uZWN0KGNoYXIgKnN0cl9pbikgewotCXJmYkNsaWVudFB0ciBjbDsKLQljaGFyICpob3N0LCAqcCwgKnN0ciA9IHN0cl9pbiwgKnMgPSBOVUxMOwotCWNoYXIgKnByZXN0cmluZyA9IE5VTEw7Ci0JaW50IHByZXN0cmluZ19sZW4gPSAwOwotCWludCBycG9ydCA9IDU1MDAsIGxlbiA9IHN0cmxlbihzdHIpOwotCWludCBzZXRfYWxhcm0gPSAwOwotCi0JaWYgKGxlbiA8IDEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChsZW4gPiAxMDI0KSB7Ci0JCXJmYkxvZygicmV2ZXJzZV9jb25uZWN0OiBzdHJpbmcgdG9vIGxvbmc6ICVkIGJ5dGVzXG4iLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFzY3JlZW4pIHsKLQkJcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3Q6IHNjcmVlbiBub3Qgc2V0dXAgeWV0LlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm4gMDsKLQotCS8qIGxvb2sgZm9yIHJlcGVhdGVyIHByZS1zdHJpbmcgKi8KLQlpZiAoc3RyY2hyKHN0ciwgJz0nKSAmJiBzdHJyY2hyKHN0ciwgJysnKQotCSAgICAmJiAoc3Ryc3RyKHN0ciwgInByZSIpID09IHN0ciB8fCBzdHJzdHIoc3RyLCAicmVwZWF0ZXI9IikgPT0gc3RyKSkgewotCQlwcmVzdHJpbmcgPSBnZXRfcmVwZWF0ZXJfc3RyaW5nKHN0ciwgJnByZXN0cmluZ19sZW4pOwotCQlzdHIgPSBzdHJyY2hyKHN0ciwgJysnKSArIDE7Ci0JfSBlbHNlIGlmIChzdHJyY2hyKHN0ciwgJysnKSAmJiBzdHJzdHIoc3RyLCAicmVwZWF0ZXI6Ly8iKSA9PSBzdHIpIHsKLQkJLyogcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrc3RyaW5nICovCi0JCS8qICAgcmVwZWF0ZXI9c3RyaW5nK2hvc3Q6cG9ydCAqLwotCQljaGFyICpwbHVzID0gc3RycmNocihzdHIsICcrJyk7Ci0JCXN0ciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oc3RyX2luKSsxKTsKLQkJcyA9IHN0cjsKLQkJKnBsdXMgPSAnXDAnOwotCQlzcHJpbnRmKHN0ciwgInJlcGVhdGVyPSVzKyVzIiwgcGx1cysxLCBzdHJfaW4gKyBzdHJsZW4oInJlcGVhdGVyOi8vIikpOwotCQlwcmVzdHJpbmcgPSBnZXRfcmVwZWF0ZXJfc3RyaW5nKHN0ciwgJnByZXN0cmluZ19sZW4pOwotCQlzdHIgPSBzdHJyY2hyKHN0ciwgJysnKSArIDE7Ci0JCSpwbHVzID0gJysnOwotCX0KLQotCS8qIGNvcHkgaW4gdG8gaG9zdCAqLwotCWhvc3QgPSAoY2hhciAqKSBtYWxsb2MobGVuKzEpOwotCWlmICghIGhvc3QpIHsKLQkJcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3Q6IGNvdWxkIG5vdCBtYWxsb2Mgc3RyaW5nICVkXG4iLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3RybmNweShob3N0LCBzdHIsIGxlbik7Ci0JaG9zdFtsZW5dID0gJ1wwJzsKLQotCS8qIGV4dHJhY3QgcG9ydCwgaWYgYW55ICovCi0JaWYgKChwID0gc3RycmNocihob3N0LCAnOicpKSAhPSBOVUxMKSB7Ci0JCXJwb3J0ID0gYXRvaShwKzEpOwotCQlpZiAocnBvcnQgPCAwKSB7Ci0JCQlycG9ydCA9IC1ycG9ydDsKLQkJfSBlbHNlIGlmIChycG9ydCA8IDIwKSB7Ci0JCQlycG9ydCA9IDU1MDAgKyBycG9ydDsKLQkJfQotCQkqcCA9ICdcMCc7Ci0JfQotCi0JaWYgKGlwdjZfY2xpZW50X2lwX3N0cikgewotCQlmcmVlKGlwdjZfY2xpZW50X2lwX3N0cik7Ci0JCWlwdjZfY2xpZW50X2lwX3N0ciA9IE5VTEw7Ci0JfQotCi0JaWYgKHVzZV9vcGVuc3NsKSB7Ci0JCWludCB2bmNzb2NrOwotCQlpZiAoY29ubmVjdF9wcm94eSkgewotCQkJdm5jc29jayA9IHByb3h5X2Nvbm5lY3QoaG9zdCwgcnBvcnQpOwotCQl9IGVsc2UgewotCQkJdm5jc29jayA9IGNvbm5lY3RfdGNwKGhvc3QsIHJwb3J0KTsKLQkJfQotCQlpZiAodm5jc29jayA8IDApIHsKLQkJCXJmYkxvZygicmV2ZXJzZV9jb25uZWN0OiBmYWlsZWQgdG8gY29ubmVjdCB0bzogJXNcbiIsIHN0cik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAocHJlc3RyaW5nICE9IE5VTEwpIHsKLQkJCXdyaXRlKHZuY3NvY2ssIHByZXN0cmluZywgcHJlc3RyaW5nX2xlbik7Ci0JCQlmcmVlKHByZXN0cmluZyk7Ci0JCX0KLS8qIFhYWCB1c2UgaGVhZGVyICovCi0jZGVmaW5lIE9QRU5TU0xfUkVWRVJTRSA2Ci0JCWlmICghZ2V0ZW52KCJYMTFWTkNfRElTQUJMRV9TU0xfQ0xJRU5UX01PREUiKSkgewotCQkJb3BlbnNzbF9pbml0KDEpOwotCQl9Ci0KLQkJaWYgKGZpcnN0X2Nvbm5fdGltZW91dCA+IDApIHsKLQkJCXNldF9hbGFybSA9IDE7Ci0JCQlzaWduYWwoU0lHQUxSTSwgcmV2ZXJzZV9jb25uZWN0X3RpbWVvdXQpOwotI2lmIFVTRV9USU1FT1VUX0lOVEVSUlVQVAotCQkJc2lnaW50ZXJydXB0KFNJR0FMUk0sIDEpOwotI2VuZGlmCi0JCQlyZmJMb2coInJldmVyc2VfY29ubmVjdDogdXNpbmcgYWxhcm0oKSB0aW1lb3V0IG9mICVkIHNlY29uZHMuXG4iLCBmaXJzdF9jb25uX3RpbWVvdXQpOwotCQkJYWxhcm0oZmlyc3RfY29ubl90aW1lb3V0KTsKLQkJfQotCQlhY2NlcHRfb3BlbnNzbChPUEVOU1NMX1JFVkVSU0UsIHZuY3NvY2spOwotCQlpZiAoc2V0X2FsYXJtKSB7YWxhcm0oMCk7IHNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTt9Ci0KLQkJb3BlbnNzbF9pbml0KDApOwotCQlmcmVlKGhvc3QpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAodXNlX3N0dW5uZWwpIHsKLQkJaWYoc3RyY21wKGhvc3QsICJsb2NhbGhvc3QiKSAmJiBzdHJjbXAoaG9zdCwgIjEyNy4wLjAuMSIpKSB7Ci0JCQlpZiAoIWdldGVudigiU1RVTk5FTF9ESVNBQkxFX0xPQ0FMSE9TVCIpKSB7Ci0JCQkJcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3Q6IGVycm9yIGhvc3Qgbm90IGxvY2FsaG9zdCBpbiAtc3R1bm5lbCBtb2RlLlxuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAodW5peHB3KSB7Ci0JCWludCBpc19sb2NhbGhvc3QgPSAwLCB1c2VyX2Rpc2FibGVkX2l0ID0gMDsKLQotCQlpZighc3RyY21wKGhvc3QsICJsb2NhbGhvc3QiKSB8fCAhc3RyY21wKGhvc3QsICIxMjcuMC4wLjEiKSkgewotCQkJaXNfbG9jYWxob3N0ID0gMTsKLQkJfQotCQlpZiAoZ2V0ZW52KCJVTklYUFdfRElTQUJMRV9MT0NBTEhPU1QiKSkgewotCQkJdXNlcl9kaXNhYmxlZF9pdCA9IDE7Ci0JCX0KLQotCQlpZiAoISBpc19sb2NhbGhvc3QpIHsKLQkJCWlmICh1c2VyX2Rpc2FibGVkX2l0KSB7Ci0JCQkJcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3Q6IHdhcm5pbmcgZGlzYWJsaW5nIGxvY2FsaG9zdCBjb25zdHJhaW50IGluIC11bml4cHdcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coInJldmVyc2VfY29ubmVjdDogZXJyb3Igbm90IGxvY2FsaG9zdCBpbiAtdW5peHB3XG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChmaXJzdF9jb25uX3RpbWVvdXQgPiAwKSB7Ci0JCXNldF9hbGFybSA9IDE7Ci0JCXNpZ25hbChTSUdBTFJNLCByZXZlcnNlX2Nvbm5lY3RfdGltZW91dCk7Ci0jaWYgVVNFX1RJTUVPVVRfSU5URVJSVVBUCi0JCXNpZ2ludGVycnVwdChTSUdBTFJNLCAxKTsKLSNlbmRpZgotCQlyZmJMb2coInJldmVyc2VfY29ubmVjdDogdXNpbmcgYWxhcm0oKSB0aW1lb3V0IG9mICVkIHNlY29uZHMuXG4iLCBmaXJzdF9jb25uX3RpbWVvdXQpOwotCQlhbGFybShmaXJzdF9jb25uX3RpbWVvdXQpOwotCX0KLQotCWlmIChjb25uZWN0X3Byb3h5ICE9IE5VTEwpIHsKLQkJaW50IHNvY2sgPSBwcm94eV9jb25uZWN0KGhvc3QsIHJwb3J0KTsKLQkJaWYgKHNldF9hbGFybSkge2FsYXJtKDApOyBzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7fQotCQlpZiAoc29jayA+PSAwKSB7Ci0JCQlpZiAocHJlc3RyaW5nICE9IE5VTEwpIHsKLQkJCQl3cml0ZShzb2NrLCBwcmVzdHJpbmcsIHByZXN0cmluZ19sZW4pOwotCQkJCWZyZWUocHJlc3RyaW5nKTsKLQkJCX0KLQkJCWNsID0gY3JlYXRlX25ld19jbGllbnQoc29jaywgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSBpZiAocHJlc3RyaW5nICE9IE5VTEwpIHsKLQkJaW50IHNvY2sgPSBjb25uZWN0X3RjcChob3N0LCBycG9ydCk7Ci0JCWlmIChzZXRfYWxhcm0pIHthbGFybSgwKTsgc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpO30KLQkJaWYgKHNvY2sgPj0gMCkgewotCQkJd3JpdGUoc29jaywgcHJlc3RyaW5nLCBwcmVzdHJpbmdfbGVuKTsKLQkJCWZyZWUocHJlc3RyaW5nKTsKLQkJCWNsID0gY3JlYXRlX25ld19jbGllbnQoc29jaywgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWNsID0gcmZiUmV2ZXJzZUNvbm5lY3Rpb24oc2NyZWVuLCBob3N0LCBycG9ydCk7Ci0JCWlmIChjbCA9PSBOVUxMKSB7Ci0JCQlpbnQgc29jayA9IGNvbm5lY3RfdGNwKGhvc3QsIHJwb3J0KTsKLQkJCWlmIChzb2NrID49IDApIHsKLQkJCQljbCA9IGNyZWF0ZV9uZXdfY2xpZW50KHNvY2ssIDEpOwotCQkJfQotCQl9Ci0JCWlmIChzZXRfYWxhcm0pIHthbGFybSgwKTsgc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpO30KLQkJaWYgKGNsICE9IE5VTEwgJiYgdXNlX3RocmVhZHMpIHsKLQkJCWNsLT5vbkhvbGQgPSBGQUxTRTsKLQkJCXJmYlN0YXJ0T25Ib2xkQ2xpZW50KGNsKTsKLQkJfQotCX0KLQotCWZyZWUoaG9zdCk7Ci0KLQlpZiAoaXB2Nl9jbGllbnRfaXBfc3RyKSB7Ci0JCWZyZWUoaXB2Nl9jbGllbnRfaXBfc3RyKTsKLQkJaXB2Nl9jbGllbnRfaXBfc3RyID0gTlVMTDsKLQl9Ci0KLQotCWlmIChjbCA9PSBOVUxMKSB7Ci0JCWlmIChxdWlldCAmJiBjb25uZWN0X29yX2V4aXQpIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJfQotCQlyZmJMb2coInJldmVyc2VfY29ubmVjdDogJXMgZmFpbGVkXG4iLCBzdHIpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZmJMb2coInJldmVyc2VfY29ubmVjdDogJXMvJXMgT0tcbiIsIHN0ciwgY2wtPmhvc3QpOwotCQkvKiBsZXQncyBzZWUgaWYgYW55b25lIGNvbXBsYWluczogKi8KLQkJaWYgKCEgZ2V0ZW52KCJYMTFWTkNfUkVWRVJTRV9DT05ORUNUSU9OX05PX0FVVEgiKSkgewotCQkJcmZiTG9nKCJyZXZlcnNlX2Nvbm5lY3Q6IHR1cm5pbmcgb24gYXV0aCBmb3IgJXNcbiIsCi0JCQkgICAgY2wtPmhvc3QpOwotCQkJY2wtPnJldmVyc2VDb25uZWN0aW9uID0gRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotfQotCi0vKgotICogQnJlYWsgdXAgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdHMgYW5kIGNhbGwgZG9fcmV2ZXJzZV9jb25uZWN0KCkKLSAqLwotdm9pZCByZXZlcnNlX2Nvbm5lY3QoY2hhciAqc3RyKSB7Ci0JY2hhciAqcCwgKnRtcDsKLQlpbnQgc2xlZXBfYmV0d2Vlbl9ob3N0ID0gMzAwOwotCWludCBzbGVlcF9taW4gPSAxNTAwLCBzbGVlcF9tYXggPSA0NTAwLCBuX21heCA9IDU7Ci0JaW50IG4sIHRvdCwgdCwgZHQgPSAxMDAsIGNudCA9IDA7Ci0JaW50IG5jbGllbnRzMCA9IGNsaWVudF9jb3VudDsKLQlpbnQgbGNudCwgajsKLQljaGFyICoqbGlzdDsKLQlpbnQgZG9fYXBwc2hhcmUgPSAwOwotCi0JaWYgKCFnZXRlbnYoIlgxMVZOQ19SRVZFUlNFX1VTRV9PTERfU0xFRVAiKSkgewotCQlzbGVlcF9taW4gPSA1MDA7Ci0JCXNsZWVwX21heCA9IDI1MDA7Ci0JfQotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JdG1wID0gc3RyZHVwKHN0cik7Ci0KLQlsaXN0ID0gKGNoYXIgKiopIGNhbGxvYyggKHN0cmxlbih0bXApKzIpICogc2l6ZW9mIChjaGFyICopLCAxKTsKLQlsY250ID0gMDsKLQotCXAgPSBzdHJ0b2sodG1wLCAiLCBcdFxyXG4iKTsKLQl3aGlsZSAocCkgewotCQlsaXN0W2xjbnQrK10gPSBzdHJkdXAocCk7Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIiwgXHRcclxuIik7Ci0JfQotCWZyZWUodG1wKTsKLQotCWlmIChzdWJ3aW4gJiYgZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQUNUSVZFIikpIHsKLQkJZG9fYXBwc2hhcmUgPSAxOwotCQlzbGVlcF9iZXR3ZWVuX2hvc3QgPSAwOwkvKiB0b28gYWdyZXNzaXZlPz8/ICovCi0JfQotCWlmIChnZXRlbnYoIlgxMVZOQ19SRVZFUlNFX1NMRUVQX0JFVFdFRU5fSE9TVCIpKSB7Ci0JCXNsZWVwX2JldHdlZW5faG9zdCA9IGF0b2koZ2V0ZW52KCJYMTFWTkNfUkVWRVJTRV9TTEVFUF9CRVRXRUVOX0hPU1QiKSk7Ci0JfQotCi0JaWYgKGRvX2FwcHNoYXJlKSB7Ci0JCWlmIChzY3JlZW4gJiYgZHB5KSB7Ci0JCQljaGFyICpzID0gY2hvb3NlX3RpdGxlKERpc3BsYXlTdHJpbmcoZHB5KSk7Ci0KLQkJCS8qIG11dGV4ICovCi0JCQlzY3JlZW4tPmRlc2t0b3BOYW1lID0gczsKLQkJCWlmIChyZmJfZGVza3RvcF9uYW1lKSB7Ci0JCQkJZnJlZShyZmJfZGVza3RvcF9uYW1lKTsKLQkJCX0KLQkJCXJmYl9kZXNrdG9wX25hbWUgPSBzdHJkdXAocyk7Ci0JCX0KLQl9Ci0KLQlmb3IgKGogPSAwOyBqIDwgbGNudDsgaisrKSB7Ci0JCXAgPSBsaXN0W2pdOwotCQkKLQkJaWYgKChuID0gZG9fcmV2ZXJzZV9jb25uZWN0KHApKSAhPSAwKSB7Ci0JCQlpbnQgaTsKLQkJCXByb2dyZXNzX2NsaWVudCgpOwotCQkJZm9yIChpPTA7IGkgPCAzOyBpKyspIHsKLQkJCQlyZmJQRSgtMSk7Ci0JCQl9Ci0JCX0KLQkJY250ICs9IG47Ci0JCWlmIChsaXN0W2orMV0gIT0gTlVMTCkgewotCQkJdCA9IDA7Ci0JCQl3aGlsZSAodCA8IHNsZWVwX2JldHdlZW5faG9zdCkgewotCQkJCWRvdWJsZSB0MSwgdDI7Ci0JCQkJaW50IGk7Ci0JCQkJdDEgPSBkbm93KCk7Ci0JCQkJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLQkJCQkJcmZiUEUoLTEpOwotCQkJCQlpZiAoZG9fYXBwc2hhcmUgJiYgdCA9PSAwKSB7Ci0JCQkJCQlyZmJQRSgtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdDIgPSBkbm93KCk7Ci0JCQkJdCArPSAoaW50KSAoMTAwMCAqICh0MiAtIHQxKSk7Ci0JCQkJaWYgKHQgPj0gc2xlZXBfYmV0d2Vlbl9ob3N0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl1c2xlZXAoZHQgKiAxMDAwKTsKLQkJCQl0ICs9IGR0OwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChqID0gMDsgaiA8IGxjbnQ7IGorKykgewotCQlwID0gbGlzdFtqXTsKLQkJaWYgKHApIGZyZWUocCk7Ci0JfQotCWZyZWUobGlzdCk7Ci0KLQlpZiAoY250ID09IDApIHsKLQkJaWYgKGNvbm5lY3Rfb3JfZXhpdCkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJleGl0aW5nIHVuZGVyIC1jb25uZWN0X29yX2V4aXRcbiIpOwotCQkJaWYgKGd1aV9waWQgPiAwKSB7Ci0JCQkJcmZiTG9nKCJraWxsaW5nIGd1aV9waWQgJWRcbiIsIGd1aV9waWQpOwotCQkJCWtpbGwoZ3VpX3BpZCwgU0lHVEVSTSk7Ci0JCQl9Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWlmICh4cmFuZHIgfHwgeHJhbmRyX21heWJlKSB7Ci0JCQljaGVja194cmFuZHJfZXZlbnQoInJldmVyc2VfY29ubmVjdDEiKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBYWFg6IHdlIG5lZWQgdG8gcHJvY2VzcyBzb21lIG9mIHRoZSBpbml0aWFsIGhhbmRzaGFraW5nCi0JICogZXZlbnRzLCBvdGhlcndpc2UgdGhlIGNsaWVudCBjYW4gZ2V0IG1lc3NlZCB1cCAod2h5Pz8pIAotCSAqIHNvIHdlIHNlbmQgcmZiUHJvY2Vzc0V2ZW50cygpIGFsbCBvdmVyIHRoZSBwbGFjZS4KLQkgKgotCSAqIEhvdyBtdWNoIGlzIHRoaXMgc3RpbGwgbmVlZGVkPwotCSAqLwotCi0JbiA9IGNudDsKLQlpZiAobiA+PSBuX21heCkgewotCQluID0gbl9tYXg7IAotCX0KLQl0ID0gc2xlZXBfbWF4IC0gc2xlZXBfbWluOwotCXRvdCA9IHNsZWVwX21pbiArICgobi0xKSAqIHQpIC8gKG5fbWF4LTEpOwotCi0JaWYgKGRvX2FwcHNoYXJlKSB7Ci0JCXRvdCAvPSAzOwotCQlpZiAodG90IDwgZHQpIHsKLQkJCXRvdCA9IGR0OwotCQl9Ci0JCXRvdCA9IDA7CS8qIHRvbyBhZ3Jlc3NpdmU/Pz8gKi8KLQl9Ci0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfUkVWRVJTRV9TTEVFUF9NQVgiKSkgewotCQl0b3QgPSBhdG9pKGdldGVudigiWDExVk5DX1JFVkVSU0VfU0xFRVBfTUFYIikpOwotCX0KLQotCXQgPSAwOwotCXdoaWxlICh0IDwgdG90KSB7Ci0JCWludCBpOwotCQlkb3VibGUgdDEsIHQyOwotCQl0MSA9IGRub3coKTsKLQkJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLQkJCXJmYlBFKC0xKTsKLQkJCWlmICh0ID09IDApIHJmYlBFKC0xKTsKLQkJfQotCQl0MiA9IGRub3coKTsKLQkJdCArPSAoaW50KSAoMTAwMCAqICh0MiAtIHQxKSk7Ci0JCWlmICh0ID49IHRvdCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJdXNsZWVwKGR0ICogMTAwMCk7Ci0JCXQgKz0gZHQ7Ci0JfQotCWlmIChjb25uZWN0X29yX2V4aXQpIHsKLQkJaWYgKGNsaWVudF9jb3VudCA8PSBuY2xpZW50czApICB7Ci0JCQlmb3IgKHQgPSAwOyB0IDwgMTA7IHQrKykgewotCQkJCWludCBpOwotCQkJCWZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0JCQkJCXJmYlBFKC0xKTsKLQkJCQl9Ci0JCQkJdXNsZWVwKDEwMCAqIDEwMDApOwotCQkJfQotCQl9Ci0JCWlmIChjbGllbnRfY291bnQgPD0gbmNsaWVudHMwKSAgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJleGl0aW5nIHVuZGVyIC1jb25uZWN0X29yX2V4aXRcbiIpOwotCQkJaWYgKGd1aV9waWQgPiAwKSB7Ci0JCQkJcmZiTG9nKCJraWxsaW5nIGd1aV9waWQgJWRcbiIsIGd1aV9waWQpOwotCQkJCWtpbGwoZ3VpX3BpZCwgU0lHVEVSTSk7Ci0JCQl9Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JfQotCWlmICh4cmFuZHIgfHwgeHJhbmRyX21heWJlKSB7Ci0JCWNoZWNrX3hyYW5kcl9ldmVudCgicmV2ZXJzZV9jb25uZWN0MiIpOwotCX0KLX0KLQotLyoKLSAqIFJvdXRpbmVzIGZvciBtb25pdG9yaW5nIHRoZSBWTkNfQ09OTkVDVCBhbmQgWDExVk5DX1JFTU9URSBwcm9wZXJ0aWVzCi0gKiBmb3IgY2hhbmdlcy4gIFRoZSB2bmNjb25uZWN0KDEpIHdpbGwgc2V0IGl0IG9uIG91ciBYIGRpc3BsYXkuCi0gKi8KLXZvaWQgc2V0X3ZuY19jb25uZWN0X3Byb3AoY2hhciAqc3RyKSB7Ci0JUkFXRkJfUkVUX1ZPSUQKLSNpZiAhTk9fWDExCi0JaWYgKHZuY19jb25uZWN0X3Byb3AgPT0gTm9uZSkgcmV0dXJuOwotCVhDaGFuZ2VQcm9wZXJ0eShkcHksIHJvb3R3aW4sIHZuY19jb25uZWN0X3Byb3AsIFhBX1NUUklORywgOCwKLQkgICAgUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKXN0ciwgc3RybGVuKHN0cikpOwotI2Vsc2UKLQlpZiAoIXN0cikge30KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBzZXRfeDExdm5jX3JlbW90ZV9wcm9wKGNoYXIgKnN0cikgewotCVJBV0ZCX1JFVF9WT0lECi0jaWYgIU5PX1gxMQotCWlmICh4MTF2bmNfcmVtb3RlX3Byb3AgPT0gTm9uZSkgcmV0dXJuOwotCVhDaGFuZ2VQcm9wZXJ0eShkcHksIHJvb3R3aW4sIHgxMXZuY19yZW1vdGVfcHJvcCwgWEFfU1RSSU5HLCA4LAotCSAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyICopc3RyLCBzdHJsZW4oc3RyKSk7Ci0jZWxzZQotCWlmICghc3RyKSB7fQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIHJlYWRfdm5jX2Nvbm5lY3RfcHJvcChpbnQgbm9tc2cpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghbm9tc2cpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlBdG9tIHR5cGU7Ci0JaW50IGZvcm1hdCwgc2xlbiwgZGxlbjsKLQl1bnNpZ25lZCBsb25nIG5pdGVtcyA9IDAsIGJ5dGVzX2FmdGVyID0gMDsKLQl1bnNpZ25lZCBjaGFyKiBkYXRhID0gTlVMTDsKLQlpbnQgZGIgPSAxOwotCi0Jdm5jX2Nvbm5lY3Rfc3RyWzBdID0gJ1wwJzsKLQlzbGVuID0gMDsKLQotCWlmICghIHZuY19jb25uZWN0IHx8IHZuY19jb25uZWN0X3Byb3AgPT0gTm9uZSkgewotCQkvKiBub3QgYWN0aXZlIG9yIHByb2JsZW0gd2l0aCBWTkNfQ09OTkVDVCBhdG9tICovCi0JCXJldHVybjsKLQl9Ci0JUkFXRkJfUkVUX1ZPSUQKLQotCS8qIHJlYWQgdGhlIHByb3BlcnR5IHZhbHVlIGludG8gdm5jX2Nvbm5lY3Rfc3RyOiAqLwotCWRvIHsKLQkJaWYgKFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksCi0JCSAgICB2bmNfY29ubmVjdF9wcm9wLCBuaXRlbXMvNCwgVk5DX0NPTk5FQ1RfTUFYLzE2LCBGYWxzZSwKLQkJICAgIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsICZmb3JtYXQsICZuaXRlbXMsICZieXRlc19hZnRlciwKLQkJICAgICZkYXRhKSA9PSBTdWNjZXNzKSB7Ci0KLQkJCWRsZW4gPSBuaXRlbXMgKiAoZm9ybWF0LzgpOwotCQkJaWYgKHNsZW4gKyBkbGVuID4gVk5DX0NPTk5FQ1RfTUFYKSB7Ci0JCQkJLyogdG9vIGJpZyAqLwotCQkJCXJmYkxvZygid2FybmluZzogdHJ1bmNhdGluZyBsYXJnZSBWTkNfQ09OTkVDVCIKLQkJCQkgICAiIHN0cmluZyA+ICVkIGJ5dGVzLlxuIiwgVk5DX0NPTk5FQ1RfTUFYKTsKLQkJCQlYRnJlZV93cihkYXRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1lbWNweSh2bmNfY29ubmVjdF9zdHIrc2xlbiwgZGF0YSwgZGxlbik7Ci0JCQlzbGVuICs9IGRsZW47Ci0JCQl2bmNfY29ubmVjdF9zdHJbc2xlbl0gPSAnXDAnOwotCQkJWEZyZWVfd3IoZGF0YSk7Ci0JCX0KLQl9IHdoaWxlIChieXRlc19hZnRlciA+IDApOwotCi0Jdm5jX2Nvbm5lY3Rfc3RyW1ZOQ19DT05ORUNUX01BWF0gPSAnXDAnOwotCWlmICghIGRiIHx8IG5vbXNnKSB7Ci0JCTsKLQl9IGVsc2UgewotCQlyZmJMb2coInJlYWQgVk5DX0NPTk5FQ1Q6ICVzXG4iLCB2bmNfY29ubmVjdF9zdHIpOwotCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCByZWFkX3gxMXZuY19yZW1vdGVfcHJvcChpbnQgbm9tc2cpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghbm9tc2cpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlBdG9tIHR5cGU7Ci0JaW50IGZvcm1hdCwgc2xlbiwgZGxlbjsKLQl1bnNpZ25lZCBsb25nIG5pdGVtcyA9IDAsIGJ5dGVzX2FmdGVyID0gMDsKLQl1bnNpZ25lZCBjaGFyKiBkYXRhID0gTlVMTDsKLQlpbnQgZGIgPSAxOwotCi0JeDExdm5jX3JlbW90ZV9zdHJbMF0gPSAnXDAnOwotCXNsZW4gPSAwOwotCi0JaWYgKCEgdm5jX2Nvbm5lY3QgfHwgeDExdm5jX3JlbW90ZV9wcm9wID09IE5vbmUpIHsKLQkJLyogbm90IGFjdGl2ZSBvciBwcm9ibGVtIHdpdGggWDExVk5DX1JFTU9URSBhdG9tICovCi0JCXJldHVybjsKLQl9Ci0JUkFXRkJfUkVUX1ZPSUQKLQotCS8qIHJlYWQgdGhlIHByb3BlcnR5IHZhbHVlIGludG8geDExdm5jX3JlbW90ZV9zdHI6ICovCi0JZG8gewotCQlpZiAoWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwKLQkJICAgIHgxMXZuY19yZW1vdGVfcHJvcCwgbml0ZW1zLzQsIFgxMVZOQ19SRU1PVEVfTUFYLzE2LCBGYWxzZSwKLQkJICAgIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsICZmb3JtYXQsICZuaXRlbXMsICZieXRlc19hZnRlciwKLQkJICAgICZkYXRhKSA9PSBTdWNjZXNzKSB7Ci0KLQkJCWRsZW4gPSBuaXRlbXMgKiAoZm9ybWF0LzgpOwotCQkJaWYgKHNsZW4gKyBkbGVuID4gWDExVk5DX1JFTU9URV9NQVgpIHsKLQkJCQkvKiB0b28gYmlnICovCi0JCQkJcmZiTG9nKCJ3YXJuaW5nOiB0cnVuY2F0aW5nIGxhcmdlIFgxMVZOQ19SRU1PVEUiCi0JCQkJICAgIiBzdHJpbmcgPiAlZCBieXRlcy5cbiIsIFgxMVZOQ19SRU1PVEVfTUFYKTsKLQkJCQlYRnJlZV93cihkYXRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1lbWNweSh4MTF2bmNfcmVtb3RlX3N0citzbGVuLCBkYXRhLCBkbGVuKTsKLQkJCXNsZW4gKz0gZGxlbjsKLQkJCXgxMXZuY19yZW1vdGVfc3RyW3NsZW5dID0gJ1wwJzsKLQkJCVhGcmVlX3dyKGRhdGEpOwotCQl9Ci0JfSB3aGlsZSAoYnl0ZXNfYWZ0ZXIgPiAwKTsKLQotCXgxMXZuY19yZW1vdGVfc3RyW1gxMVZOQ19SRU1PVEVfTUFYXSA9ICdcMCc7Ci0JaWYgKCEgZGIgfHwgbm9tc2cpIHsKLQkJOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHgxMXZuY19yZW1vdGVfc3RyLCAiYW5zPXN0b3A6Ti9BLGFucz1xdWl0Ok4vQSxhbnM9IikpIHsKLQkJOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHgxMXZuY19yZW1vdGVfc3RyLCAicXJ5PXN0b3AscXVpdCxleGl0IikpIHsKLQkJOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHgxMXZuY19yZW1vdGVfc3RyLCAiYWNrPSIpID09IHgxMXZuY19yZW1vdGVfc3RyKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHF1aWV0ICYmIHN0cnN0cih4MTF2bmNfcmVtb3RlX3N0ciwgInFyeT1waW5nIikgPT0KLQkgICAgeDExdm5jX3JlbW90ZV9zdHIpIHsKLQkJOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHgxMXZuY19yZW1vdGVfc3RyLCAiY21kPSIpICYmCi0JICAgIHN0cnN0cih4MTF2bmNfcmVtb3RlX3N0ciwgInBhc3N3ZCIpKSB7Ci0JCXJmYkxvZygicmVhZCBYMTFWTkNfUkVNT1RFOiAqXG4iKTsKLQl9IGVsc2UgaWYgKHN0cmxlbih4MTF2bmNfcmVtb3RlX3N0cikgPiAzNikgewotCQljaGFyIHRyaW1bMTAwXTsgCi0JCXRyaW1bMF0gPSAnXDAnOwotCQlzdHJuY2F0KHRyaW0sIHgxMXZuY19yZW1vdGVfc3RyLCAzNik7Ci0JCXJmYkxvZygicmVhZCBYMTFWTkNfUkVNT1RFOiAlcyAuLi5cbiIsIHRyaW0pOwotCQkKLQl9IGVsc2UgewotCQlyZmJMb2coInJlYWQgWDExVk5DX1JFTU9URTogJXNcbiIsIHgxMXZuY19yZW1vdGVfc3RyKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLWV4dGVybiBpbnQgcmNfbnBpZWNlczsKLQotdm9pZCBncmFiX3N0YXRlKGludCAqcHRyX2dyYWJiZWQsIGludCAqa2JkX2dyYWJiZWQpIHsKLQlpbnQgcmNwLCByY2s7Ci0JZG91YmxlIHQwLCB0MTsKLQlkb3VibGUgdGEsIHRiLCB0YzsKLQkqcHRyX2dyYWJiZWQgPSAtMTsKLQkqa2JkX2dyYWJiZWQgPSAtMTsKLQotCWlmICghZHB5KSB7Ci0JCXJldHVybjsKLQl9Ci0JKnB0cl9ncmFiYmVkID0gMDsKLQkqa2JkX2dyYWJiZWQgPSAwOwotCi0jaWYgIU5PX1gxMQotCVhfTE9DSzsKLQotCVhTeW5jKGRweSwgRmFsc2UpOwotCi0JdGEgPSB0MCA9IGRub3coKTsKLQotCXJjcCA9IFhHcmFiUG9pbnRlcihkcHksIHdpbmRvdywgRmFsc2UsIDAsIEdyYWJNb2RlQXN5bmMsIEdyYWJNb2RlQXN5bmMsIE5vbmUsIE5vbmUsIEN1cnJlbnRUaW1lKTsKLQlYVW5ncmFiUG9pbnRlcihkcHksIEN1cnJlbnRUaW1lKTsKLQotCXRiID0gZG5vdygpOwotCQotCXJjayA9IFhHcmFiS2V5Ym9hcmQoZHB5LCB3aW5kb3csIEZhbHNlLCBHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jLCBDdXJyZW50VGltZSk7Ci0JWFVuZ3JhYktleWJvYXJkKGRweSwgQ3VycmVudFRpbWUpOwotCi0JdGMgPSBkbm93KCk7Ci0KLQlYU3luYyhkcHksIEZhbHNlKTsKLQotCXQxID0gZG5vdygpOwotCi0JWF9VTkxPQ0s7Ci0JaWYgKHJjcCA9PSBBbHJlYWR5R3JhYmJlZCB8fCByY3AgPT0gR3JhYkZyb3plbikgewotCQkqcHRyX2dyYWJiZWQgPSAxOwotCX0KLQlpZiAocmNrID09IEFscmVhZHlHcmFiYmVkIHx8IHJjayA9PSBHcmFiRnJvemVuKSB7Ci0JCSprYmRfZ3JhYmJlZCA9IDE7Ci0JfQotCWlmIChyY19ucGllY2VzIDwgMTApIHsKLQkJcmZiTG9nKCJncmFiX3N0YXRlOiBjaGVja2VkICVkLCVkIGluICUuNmYgc2VjICglLjZmICUuNmYpXG4iLAotCQkgICAgKnB0cl9ncmFiYmVkLCAqa2JkX2dyYWJiZWQsIHQxLXQwLCB0Yi10YSwgdGMtdGIpOwotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBwbW92ZShpbnQgeCwgaW50IHkpIHsKLQlpZiAoeCA8IDAgfHwgeSA8IDApIHsKLQkJcmZiTG9nKCJwbW92ZTogc2tpcHBpbmcgbmVnYXRpdmUgeCBvciB5OiAlZCAlZFxuIiwgeCwgeSk7Ci0JCXJldHVybjsKLQl9Ci0JcmZiTG9nKCJwbW92ZTogeCB5OiAlZCAlZFxuIiwgeCwgeSk7Ci0JcG9pbnRlcl9ldmVudCgwLCB4LCB5LCBOVUxMKTsKLQlYX0xPQ0s7Ci0JWEZsdXNoX3dyKGRweSk7Ci0JWF9VTkxPQ0s7Ci19Ci0KLQotY2hhciAqYmN4X3hhdHRhY2goY2hhciAqc3RyLCBpbnQgKnBnX2luaXQsIGludCAqa2dfaW5pdCkgewotCWludCBncmFiX2NoZWNrID0gMTsKLQlpbnQgc2hpZnQgPSAyMDsKLQlpbnQgZmluYWxfeCA9IDMwLCBmaW5hbF95ID0gMzA7Ci0JaW50IGV4dHJhX3ggPSAtMSwgZXh0cmFfeSA9IC0xOwotCWludCB0MSwgdDIsIGR0ID0gNDAgKiAxMDAwOwotCWludCBpZm5lZWRlZCA9IDA7Ci0JY2hhciAqZGlyID0gIm5vbmUiLCAqZmxpcCA9ICJub25lIiwgKnE7Ci0JaW50IHBnMSwga2cxLCBwZzIsIGtnMjsKLQljaGFyIF9iY3hfcmVzWzEyOF07Ci0JCi0JLyogc3RyOlt1cCxkb3duLGxlZnQscmlnaHRdK25vZ3JhYmNoZWNrK3NoaWZ0PW4rZmluYWw9eCt5K2V4dHJhX21vdmU9eCt5K1ttYXN0ZXJfdG9fc2xhdmUsc2xhdmVfdG9fbWFzdGVyLE0yUyxTMk1dK2R0PW4rcmV0cnk9bitpZm5lZWRlZCAqLwotCi0JaWYgKHN0cnN0cihzdHIsICJ1cCIpKSB7Ci0JCWRpciA9ICJ1cCI7Ci0JfSBlbHNlIGlmIChzdHJzdHIoc3RyLCAiZG93biIpKSB7Ci0JCWRpciA9ICJkb3duIjsKLQl9IGVsc2UgaWYgKHN0cnN0cihzdHIsICJsZWZ0IikpIHsKLQkJZGlyID0gImxlZnQiOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgInJpZ2h0IikpIHsKLQkJZGlyID0gInJpZ2h0IjsKLQl9IGVsc2UgewotCQlyZXR1cm4gc3RyZHVwKCJGQUlMLE5PX0RJUkVDVElPTl9TUEVDSUZJRUQiKTsKLQl9Ci0KLQlpZiAoc3Ryc3RyKHN0ciwgIm1hc3Rlcl90b19zbGF2ZSIpIHx8IHN0cnN0cihzdHIsICJNMlMiKSkgewotCQlmbGlwID0gIk0yUyI7Ci0JfSBlbHNlIGlmIChzdHJzdHIoc3RyLCAic2xhdmVfdG9fbWFzdGVyIikgfHwgc3Ryc3RyKHN0ciwgIlMyTSIpKSB7Ci0JCWZsaXAgPSAiUzJNIjsKLQl9IGVsc2UgewotCQlyZXR1cm4gc3RyZHVwKCJGQUlMLE5PX01PREVfQ0hBTkdFX1NQRUNJRklFRCIpOwotCX0KLQotCWlmIChzdHJzdHIoc3RyLCAibm9ncmFiY2hlY2siKSkgewotCQlncmFiX2NoZWNrID0gMDsKLQl9Ci0JaWYgKHN0cnN0cihzdHIsICJpZm5lZWRlZCIpKSB7Ci0JCWlmbmVlZGVkID0gMTsKLQl9Ci0JcSA9IHN0cnN0cihzdHIsICJzaGlmdD0iKTsKLQlpZiAocSAmJiBzc2NhbmYocSwgInNoaWZ0PSVkIiwgJnQxKSA9PSAxKSB7Ci0JCXNoaWZ0ID0gdDE7Ci0JfQotCXEgPSBzdHJzdHIoc3RyLCAiZmluYWw9Iik7Ci0JaWYgKHEgJiYgc3NjYW5mKHEsICJmaW5hbD0lZCslZCIsICZ0MSwgJnQyKSA9PSAyKSB7Ci0JCWZpbmFsX3ggPSB0MTsKLQkJZmluYWxfeSA9IHQyOwotCX0KLQlxID0gc3Ryc3RyKHN0ciwgImV4dHJhX21vdmU9Iik7Ci0JaWYgKHEgJiYgc3NjYW5mKHEsICJleHRyYV9tb3ZlPSVkKyVkIiwgJnQxLCAmdDIpID09IDIpIHsKLQkJZXh0cmFfeCA9IHQxOwotCQlleHRyYV95ID0gdDI7Ci0JfQotCXEgPSBzdHJzdHIoc3RyLCAiZHQ9Iik7Ci0JaWYgKHEgJiYgc3NjYW5mKHEsICJkdD0lZCIsICZ0MSkgPT0gMSkgewotCQlkdCA9IHQxICogMTAwMDsKLQl9Ci0KLQlpZiAoZ3JhYl9jaGVjaykgewotCQlpbnQgcmVhZF9pbml0ID0gMDsKLQotCQlpZiAoKnBnX2luaXQgPj0wICYmICprZ19pbml0ID49MCkgIHsKLQkJCXBnMSA9ICpwZ19pbml0OwotCQkJa2cxID0gKmtnX2luaXQ7Ci0JCQlyZWFkX2luaXQgPSAxOwotCQl9IGVsc2UgewotCQkJZ3JhYl9zdGF0ZSgmcGcxLCAma2cxKTsKLQkJCXJlYWRfaW5pdCA9IDA7Ci0JCX0KLQotCQlpZiAoIXN0cmNtcChmbGlwLCAiTTJTIikpIHsKLQkJCWlmIChpZm5lZWRlZCAmJiBwZzEgPT0gMSAmJiBrZzEgPT0gMSkgewotCQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IE0yUyBncmFiIHN0YXRlIGlzIGFscmVhZHkgd2hhdCB3ZSB3YW50LCBza2lwcGluZyBtb3ZlczogICVkLCVkXG4iLCBwZzEsIGtnMSk7Ci0JCQkJcmV0dXJuIHN0cmR1cCgiRE9ORSxHUkFCX09LIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChmbGlwLCAiUzJNIikpIHsKLQkJCWlmIChpZm5lZWRlZCAmJiBwZzEgPT0gMCAmJiBrZzEgPT0gMCkgewotCQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IFMyTSBncmFiIHN0YXRlIGlzIGFscmVhZHkgd2hhdCB3ZSB3YW50LCBza2lwcGluZyBtb3ZlczogICVkLCVkXG4iLCBwZzEsIGtnMSk7Ci0JCQkJcmV0dXJuIHN0cmR1cCgiRE9ORSxHUkFCX09LIik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVhZF9pbml0KSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChmbGlwLCAiTTJTIikpIHsKLQkJCWlmIChwZzEgIT0gMCB8fCBrZzEgIT0gMCkgewotCQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IE0yUyBpbml0IGdyYWIgc3RhdGUgaW5jb3JyZWN0OiAgJWQsJWRcbiIsIHBnMSwga2cxKTsKLQkJCQl1c2xlZXAoMipkdCk7Ci0JCQkJZ3JhYl9zdGF0ZSgmcGcxLCAma2cxKTsKLQkJCQlyZmJMb2coImJjeF94YXR0YWNoOiBzbGVwdCBhbmQgcmV0cmllZCwgZ3JhYiBpcyBub3c6ICVkLCVkXG4iLCBwZzEsIGtnMSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChmbGlwLCAiUzJNIikpIHsKLQkJCWlmIChwZzEgIT0gMSB8fCBrZzEgIT0gMSkgewotCQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IFMyTSBpbml0IGdyYWIgc3RhdGUgaW5jb3JyZWN0OiAgJWQsJWRcbiIsIHBnMSwga2cxKTsKLQkJCQl1c2xlZXAoMipkdCk7Ci0JCQkJZ3JhYl9zdGF0ZSgmcGcxLCAma2cxKTsKLQkJCQlyZmJMb2coImJjeF94YXR0YWNoOiBzbGVwdCBhbmQgcmV0cmllZCwgZ3JhYiBpcyBub3c6ICVkLCVkXG4iLCBwZzEsIGtnMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZWFkX2luaXQpIHsKLQkJCSpwZ19pbml0ID0gcGcxOwotCQkJKmtnX2luaXQgPSBrZzE7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEEgZ3VpZGUgZm9yIEJBUkNPIHhhdHRhY2g6Ci0JICoKLQkgKiAgIEZvciAtY3Vyc29yX3J1bGUgJ2IoMCk6JTp0KDEpLHQoMSk6JTpiKDApJwotCSAqCWRvd24rTTJTICB1cCtTMk0KLQkgKiAgIEZvciAtY3Vyc29yX3J1bGUgJ3IoMCk6JTpsKDEpLGwoMSk6JTpyKDApJwotCSAqCXJpZ2h0K00yUyAgbGVmdCtTMk0KLQkgKgotCSAqICAgRm9yIC1jdXJzb3JfcnVsZSAndCgwKTolOmIoMSksYigxKTolOnQoMCknCi0JICoJdXArTTJTICBkb3duK1MyTQotCSAqICAgRm9yIC1jdXJzb3JfcnVsZSAnbCgwKTolOnIoMSkscigxKTolOmwoMCknCi0JICoJbGVmdCtNMlMgIHJpZ2h0K1MyTQotCSAqICAgRm9yIC1jdXJzb3JfcnVsZSAnbCgwKTolOnIoMSkscigxKTolOmwoMCkscigwKTolOmwoMSksbCgxKTolOnIoMCknCi0JICoJbGVmdCtNMlMgIHJpZ2h0K1MyTSAgKHdlIHVzZWQgdG8gZG8gYm90aCAncmlnaHQnKQotCSAqLwotCi0JaWYgKCFzdHJjbXAoZmxpcCwgIk0yUyIpKSB7Ci0JCWlmICghc3RyY21wKGRpciwgInVwIikpIHsKLQkJCXBtb3ZlKHNoaWZ0LCAwKTsJCS8qIGdvIHRvIHRvcCBlZGdlICovCi0JCQl1c2xlZXAoZHQpOwotCQkJcG1vdmUoc2hpZnQrMSwgMCk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZGlyLCAiZG93biIpKSB7Ci0JCQlwbW92ZShzaGlmdCwgICBkcHlfeS0xKTsJLyogZ28gdG8gYm90dG9tIGVkZ2UgKi8KLQkJCXVzbGVlcChkdCk7Ci0JCQlwbW92ZShzaGlmdCsxLCBkcHlfeS0xKTsJLyogbW92ZSAxIGZvciBNb3Rpb25Ob3RpZnkgKi8KLQkJfSBlbHNlIGlmICghc3RyY21wKGRpciwgImxlZnQiKSkgewotCQkJcG1vdmUoMCwgc2hpZnQpOwkJLyogZ28gdG8gbGVmdCBlZGdlICovCi0JCQl1c2xlZXAoZHQpOwotCQkJcG1vdmUoMCwgc2hpZnQrMSk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZGlyLCAicmlnaHQiKSkgewotCQkJcG1vdmUoZHB5X3gtMSwgc2hpZnQpOwkJLyogZ28gdG8gcmlnaHQgZWRnZSAqLwotCQkJdXNsZWVwKGR0KTsKLQkJCXBtb3ZlKGRweV94LTEsIHNoaWZ0KzEpOwkvKiBtb3ZlIDEgZm9yIE1vdGlvbiBOb3RpZnkgICovCi0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoZmxpcCwgIlMyTSIpKSB7Ci0JCWludCBkdHMgPSBkdC8yOwotCQlpZiAoIXN0cmNtcChkaXIsICJ1cCIpKSB7Ci0JCQlwbW92ZShzaGlmdCwgMik7CQkvKiBBcHByb2FjaCB0b3AgZWRnZSBpbiAzIG1vdmVzLiAgMXN0IG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQsIDEpOwkJLyogMm5kIG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQsIDApOwkJLyogM3JkIG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQrMSwgMCk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZShzaGlmdCsxLCBkcHlfeS0yKTsJLyogZ28gdG8gaGVpZ2h0LTIgZm9yIGV4dHJhIHBpeGVsIChzbGF2ZSB5IG5vdyA9PSAwPykgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQsICAgZHB5X3ktMik7CS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKHNoaWZ0LCAxKTsJCS8qIGdvIHRvIDEgdG8gYmUgc3VyZSBzbGF2ZSB5ID09IDAgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQrMSwgMSk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZGlyLCAiZG93biIpKSB7Ci0JCQlwbW92ZShzaGlmdCwgICBkcHlfeS0zKTsJLyogQXBwcm9hY2ggYm90dG9tIGVkZ2UgaW4gMyBtb3Zlcy4gIDFzdCBtb3ZlICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKHNoaWZ0LCAgIGRweV95LTIpOwkvKiAybmQgbW92ZSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZShzaGlmdCwgICBkcHlfeS0xKTsJLyogM3JkIG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoc2hpZnQrMSwgZHB5X3ktMSk7CS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKHNoaWZ0KzEsIDEpOwkJLyogZ28gdG8gMSBmb3IgZXh0cmEgcGl4ZWwgKHNsYXZlIHkgbm93ID09IGRweV95LTE/KSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZShzaGlmdCwgMSk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZShzaGlmdCwgICBkcHlfeS0yKTsJLyogZ28gdG8gZHB5X3ktMiB0byBiZSBzdXJlIHNsYXZlIHkgPT0gZHB5X3ktMSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZShzaGlmdCsxLCBkcHlfeS0yKTsJLyogbW92ZSAxIGZvciBNb3Rpb25Ob3RpZnkgKi8KLQkJfSBlbHNlIGlmICghc3RyY21wKGRpciwgImxlZnQiKSkgewotCQkJcG1vdmUoMiwgc2hpZnQpOwkJLyogQXBwcm9hY2ggbGVmdCBlZGdlIGluIDMgbW92ZXMuICAxc3QgbW92ZSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZSgxLCBzaGlmdCk7CQkvKiAybmQgbW92ZSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZSgwLCBzaGlmdCk7CQkvKiAzcmQgbW92ZSAqLwotCQkJdXNsZWVwKGR0cyk7Ci0JCQlwbW92ZSgwLCBzaGlmdCsxKTsJCS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKGRweV94LTIsIHNoaWZ0KzEpOwkvKiBnbyB0byB3aWR0aC0yIGZvciBleHRyYSBwaXhlbCAoc2xhdmUgeCBub3cgPT0gMD8pICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKGRweV94LTIsIHNoaWZ0KTsJCS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKDEsIHNoaWZ0KTsJCS8qIGdvIHRvIDEgdG8gYmUgc3VyZSBzbGF2ZSB4ID09IDAgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoMSwgc2hpZnQrMSk7CQkvKiBtb3ZlIDEgZm9yIE1vdGlvbk5vdGlmeSAqLwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZGlyLCAicmlnaHQiKSkgewotCQkJcG1vdmUoZHB5X3gtMywgc2hpZnQpOwkJLyogQXBwcm9hY2ggcmlnaHQgZWRnZSBpbiAzIG1vdmVzLiAgMXN0IG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoZHB5X3gtMiwgc2hpZnQpOwkJLyogMm5kIG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoZHB5X3gtMSwgc2hpZnQpOwkJLyogM3JkIG1vdmUgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoZHB5X3gtMSwgc2hpZnQrMSk7CS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKDEsIHNoaWZ0KzEpOwkJLyogZ28gdG8gMSB0byBleHRyYSBwaXhlbCAoc2xhdmUgeCBub3cgPT0gZHB5X3gtMT8pICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKDEsIHNoaWZ0KTsJCS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCQl1c2xlZXAoZHRzKTsKLQkJCXBtb3ZlKGRweV94LTIsIHNoaWZ0KTsJCS8qIGdvIHRvIGRweV94LTIgdG8gYmUgc3VyZSBzbGF2ZSB4ID09IGRweV94LTEgKi8KLQkJCXVzbGVlcChkdHMpOwotCQkJcG1vdmUoZHB5X3gtMiwgc2hpZnQrMSk7CS8qIG1vdmUgMSBmb3IgTW90aW9uTm90aWZ5ICovCi0JCX0KLQl9Ci0KLQl1c2xlZXAoZHQpOwotCXBtb3ZlKGZpbmFsX3gsIGZpbmFsX3kpOwotCXVzbGVlcChkdCk7Ci0KLQlpZiAoZXh0cmFfeCA+PSAwICYmIGV4dHJhX3kgPj0gMCkgewotCQlwbW92ZShleHRyYV94LCBleHRyYV95KTsKLQkJdXNsZWVwKGR0KTsKLQl9Ci0KLQlzdHJjcHkoX2JjeF9yZXMsICJET05FIik7Ci0KLQlpZiAoZ3JhYl9jaGVjaykgewotCQljaGFyIHN0WzY0XTsKLQotCQl1c2xlZXAoMypkdCk7Ci0JCWdyYWJfc3RhdGUoJnBnMiwgJmtnMik7Ci0KLQkJaWYgKCFzdHJjbXAoZmxpcCwgIk0yUyIpKSB7Ci0JCQlpZiAocGcyICE9IDEgfHwga2cyICE9IDEpIHsKLQkJCQlyZmJMb2coImJjeF94YXR0YWNoOiBNMlMgZmluaSBncmFiIHN0YXRlIGluY29ycmVjdDogICVkLCVkXG4iLCBwZzIsIGtnMik7Ci0JCQkJdXNsZWVwKDIqZHQpOwotCQkJCWdyYWJfc3RhdGUoJnBnMiwgJmtnMik7Ci0JCQkJcmZiTG9nKCJiY3hfeGF0dGFjaDogc2xlcHQgYW5kIHJldHJpZWQsIGdyYWIgaXMgbm93OiAlZCwlZFxuIiwgcGcyLCBrZzIpOwotCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZmxpcCwgIlMyTSIpKSB7Ci0JCQlpZiAocGcyICE9IDAgfHwga2cyICE9IDApIHsKLQkJCQlyZmJMb2coImJjeF94YXR0YWNoOiBTMk0gZmluaSBncmFiIHN0YXRlIGluY29ycmVjdDogICVkLCVkXG4iLCBwZzIsIGtnMik7Ci0JCQkJdXNsZWVwKDIqZHQpOwotCQkJCWdyYWJfc3RhdGUoJnBnMiwgJmtnMik7Ci0JCQkJcmZiTG9nKCJiY3hfeGF0dGFjaDogc2xlcHQgYW5kIHJldHJpZWQsIGdyYWIgaXMgbm93OiAlZCwlZFxuIiwgcGcyLCBrZzIpOwotCQkJfQotCQl9Ci0KLQkJc3ByaW50ZihzdCwgIjolZCwlZC0lZCwlZCIsIHBnMSwga2cxLCBwZzIsIGtnMik7Ci0KLQkJaWYgKGdldGVudigiR1JBQl9DSEVDS19MT09QIikpIHsKLQkJCWludCBpLCBuID0gYXRvaShnZXRlbnYoIkdSQUJfQ0hFQ0tfTE9PUCIpKTsKLQkJCXJmYkxvZygiZ3JhYiBzdDogJXNcbiIsIHN0KTsKLQkJCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCQkJdXNsZWVwKGR0KTsKLQkJCQlncmFiX3N0YXRlKCZwZzIsICZrZzIpOwotCQkJCXNwcmludGYoc3QsICI6JWQsJWQtJWQsJWQiLCBwZzEsIGtnMSwgcGcyLCBrZzIpOwotCQkJCXJmYkxvZygiZ3JhYiBzdDogJXNcbiIsIHN0KTsKLQkJCX0KLQkJfQotCi0JCWlmICghc3RyY21wKGZsaXAsICJNMlMiKSkgewotCQkJaWYgKHBnMSA9PSAwICYmIGtnMSA9PSAwICYmIHBnMiA9PSAxICYmIGtnMiA9PSAxKSB7Ci0JCQkJc3RyY2F0KF9iY3hfcmVzLCAiLEdSQUJfT0siKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJiY3hfeGF0dGFjaDogTTJTIGdyYWIgc3RhdGUgaW5jb3JyZWN0OiAlZCwlZCAtPiAlZCwlZFxuIiwgcGcxLCBrZzEsIHBnMiwga2cyKTsKLQkJCQlzdHJjYXQoX2JjeF9yZXMsICIsR1JBQl9GQUlMIik7Ci0JCQkJaWYgKHBnMiA9PSAxICYmIGtnMiA9PSAxKSB7Ci0JCQkJCXN0cmNhdChfYmN4X3JlcywgIl9JTklUIik7Ci0JCQkJfSBlbHNlIGlmIChwZzEgPT0gMCAmJiBrZzEgPT0gMCkgewotCQkJCQlzdHJjYXQoX2JjeF9yZXMsICJfRklOQUwiKTsKLQkJCQl9Ci0JCQkJc3RyY2F0KF9iY3hfcmVzLCBzdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChmbGlwLCAiUzJNIikpIHsKLQkJCWlmIChwZzEgPT0gMSAmJiBrZzEgPT0gMSAmJiBwZzIgPT0gMCAmJiBrZzIgPT0gMCkgewotCQkJCXN0cmNhdChfYmN4X3JlcywgIixHUkFCX09LIik7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IFMyTSBncmFiIHN0YXRlIGluY29ycmVjdDogJWQsJWQgLT4gJWQsJWRcbiIsIHBnMSwga2cxLCBwZzIsIGtnMik7Ci0JCQkJc3RyY2F0KF9iY3hfcmVzLCAiLEdSQUJfRkFJTCIpOwotCQkJCWlmIChwZzIgPT0gMCAmJiBrZzIgPT0gMCkgewotCQkJCQlzdHJjYXQoX2JjeF9yZXMsICJfSU5JVCIpOwotCQkJCX0gZWxzZSBpZiAocGcxID09IDEgJiYga2cxID09IDEpIHsKLQkJCQkJc3RyY2F0KF9iY3hfcmVzLCAiX0ZJTkFMIik7Ci0JCQkJfQotCQkJCXN0cmNhdChfYmN4X3Jlcywgc3QpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBzdHJkdXAoX2JjeF9yZXMpOwotfQotCi1pbnQgc2V0X3hwcm9wKGNoYXIgKnByb3AsIFdpbmRvdyB3aW4sIGNoYXIgKnZhbHVlKSB7Ci0JaW50IHJjID0gLTE7Ci0jaWYgIU5PX1gxMQotCUF0b20gYXByb3A7Ci0KLQlSQVdGQl9SRVQocmMpCi0KLQlpZiAoIXByb3AgfHwgIXZhbHVlKSB7Ci0JCXJldHVybiByYzsKLQl9Ci0JaWYgKHdpbiA9PSBOb25lKSB7Ci0JCXdpbiA9IHJvb3R3aW47Ci0JfQotCWFwcm9wID0gWEludGVybkF0b20oZHB5LCBwcm9wLCBGYWxzZSk7Ci0JaWYgKGFwcm9wID09IE5vbmUpIHsKLQkJcmV0dXJuIHJjOwotCX0KLQlyYyA9IFhDaGFuZ2VQcm9wZXJ0eShkcHksIHdpbiwgYXByb3AsIFhBX1NUUklORywgOCwKLQkgICAgUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKXZhbHVlLCBzdHJsZW4odmFsdWUpKTsKLQlyZXR1cm4gcmM7Ci0jZWxzZQotCVJBV0ZCX1JFVChyYykKLQlpZiAoIXByb3AgfHwgIXdpbiB8fCAhdmFsdWUpIHt9Ci0JcmV0dXJuIHJjOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1jaGFyICpnZXRfeHByb3AoY2hhciAqcHJvcCwgV2luZG93IHdpbikgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVChOVUxMKQotCWlmICghcHJvcCB8fCAhd2luKSB7fQotCXJldHVybiBOVUxMOwotI2Vsc2UKLQlBdG9tIHR5cGUsIGFwcm9wOwotCWludCBmb3JtYXQsIHNsZW4sIGRsZW47Ci0JdW5zaWduZWQgbG9uZyBuaXRlbXMgPSAwLCBieXRlc19hZnRlciA9IDA7Ci0JdW5zaWduZWQgY2hhciogZGF0YSA9IE5VTEw7Ci0JY2hhciBnZXRfc3RyW1ZOQ19DT05ORUNUX01BWCsxXTsKLQotCVJBV0ZCX1JFVChOVUxMKQotCi0JaWYgKHByb3AgPT0gTlVMTCB8fCAhc3RyY21wKHByb3AsICIiKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHdpbiA9PSBOb25lKSB7Ci0JCXdpbiA9IHJvb3R3aW47Ci0JfQotCWFwcm9wID0gWEludGVybkF0b20oZHB5LCBwcm9wLCBUcnVlKTsKLQlpZiAoYXByb3AgPT0gTm9uZSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlnZXRfc3RyWzBdID0gJ1wwJzsKLQlzbGVuID0gMDsKLQotCS8qIHJlYWQgdGhlIHByb3BlcnR5IHZhbHVlIGludG8gZ2V0X3N0cjogKi8KLQlkbyB7Ci0JCWlmIChYR2V0V2luZG93UHJvcGVydHkoZHB5LCB3aW4sIGFwcm9wLCBuaXRlbXMvNCwKLQkJICAgIFZOQ19DT05ORUNUX01BWC8xNiwgRmFsc2UsIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsCi0JCSAgICAmZm9ybWF0LCAmbml0ZW1zLCAmYnl0ZXNfYWZ0ZXIsICZkYXRhKSA9PSBTdWNjZXNzKSB7Ci0KLQkJCWRsZW4gPSBuaXRlbXMgKiAoZm9ybWF0LzgpOwotCQkJaWYgKHNsZW4gKyBkbGVuID4gVk5DX0NPTk5FQ1RfTUFYKSB7Ci0JCQkJLyogdG9vIGJpZyAqLwotCQkJCXJmYkxvZygiZ2V0X3hwcm9wOiB3YXJuaW5nOiB0cnVuY2F0aW5nIGxhcmdlICclcyciCi0JCQkJICAgIiBzdHJpbmcgPiAlZCBieXRlcy5cbiIsIHByb3AsIFZOQ19DT05ORUNUX01BWCk7Ci0JCQkJWEZyZWVfd3IoZGF0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQltZW1jcHkoZ2V0X3N0citzbGVuLCBkYXRhLCBkbGVuKTsKLQkJCXNsZW4gKz0gZGxlbjsKLQkJCWdldF9zdHJbc2xlbl0gPSAnXDAnOwotCQkJWEZyZWVfd3IoZGF0YSk7Ci0JCX0KLQl9IHdoaWxlIChieXRlc19hZnRlciA+IDApOwotCi0JZ2V0X3N0cltWTkNfQ09OTkVDVF9NQVhdID0gJ1wwJzsKLQlyZmJMb2coImdldF9wcm9wOiByZWFkOiAnJXMnID0gJyVzJ1xuIiwgcHJvcCwgZ2V0X3N0cik7Ci0KLQlyZXR1cm4gc3RyZHVwKGdldF9zdHIpOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgY2hhciBfd2luX2ZtdFsxMDAwXTsKLQotc3RhdGljIGNoYXIgKndpbl9mbXQoV2luZG93IHdpbiwgWFdpbmRvd0F0dHJpYnV0ZXMgYSkgewotCW1lbXNldChfd2luX2ZtdCwgMCwgc2l6ZW9mKF93aW5fZm10KSk7Ci0Jc3ByaW50Zihfd2luX2ZtdCwgIjB4JWx4OiVkeCVkeCVkKyVkKyVkLW1hcDolZC1idzolZC1jbDolZC12aXM6JWQtYnM6JWQvJWQiLAotCSAgICB3aW4sIGEud2lkdGgsIGEuaGVpZ2h0LCBhLmRlcHRoLCBhLngsIGEueSwgYS5tYXBfc3RhdGUsIGEuYm9yZGVyX3dpZHRoLCBhLmNsYXNzLAotCSAgICAoaW50KSAoKGEudmlzdWFsKS0+dmlzdWFsaWQpLCBhLmJhY2tpbmdfc3RvcmUsIGEuc2F2ZV91bmRlcik7Ci0JcmV0dXJuIF93aW5fZm10OwotfQotCi1jaGFyICp3aW5pbmZvKFdpbmRvdyB3aW4sIGludCBzaG93X2NoaWxkcmVuKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUKE5VTEwpCi0JaWYgKCF3aW4gfHwgIXNob3dfY2hpbGRyZW4pIHt9Ci0JcmV0dXJuIE5VTEw7Ci0jZWxzZQotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JaW50IG4sIHNpemUgPSBYMTFWTkNfUkVNT1RFX01BWDsKLQljaGFyIGdldF9zdHJbWDExVk5DX1JFTU9URV9NQVgrMV07Ci0JdW5zaWduZWQgaW50IG5jaGlsZHJlbjsKLQlXaW5kb3cgcnIsIHByLCAqY2hpbGRyZW47IAotCi0JUkFXRkJfUkVUKE5VTEwpCi0KLQlpZiAod2luID09IE5vbmUpIHsKLQkJcmV0dXJuIHN0cmR1cCgiTm9uZSIpOwotCX0KLQotCVhfTE9DSzsKLQlpZiAoIXZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKSkgewotCQlYX1VOTE9DSzsKLQkJcmV0dXJuIHN0cmR1cCgiSW52YWxpZCIpOwotCX0KLQlnZXRfc3RyWzBdID0gJ1wwJzsKLQotCWlmIChzaG93X2NoaWxkcmVuKSB7Ci0JCVhRdWVyeVRyZWVfd3IoZHB5LCB3aW4sICZyciwgJnByLCAmY2hpbGRyZW4sICZuY2hpbGRyZW4pOwotCX0gZWxzZSB7Ci0JCW5jaGlsZHJlbiA9IDE7Ci0JCWNoaWxkcmVuID0gKFdpbmRvdyAqKSBjYWxsb2MoMiAqIHNpemVvZihXaW5kb3cpLCAxKTsKLQkJY2hpbGRyZW5bMF0gPSB3aW47Ci0JfQotCWZvciAobj0wOyBuIDwgKGludCkgbmNoaWxkcmVuOyBuKyspIHsKLQkJY2hhciB0bXBbMzJdOwotCQljaGFyICpzdHIgPSAiSW52YWxpZCI7Ci0JCVdpbmRvdyB3ID0gY2hpbGRyZW5bbl07Ci0JCWlmICh2YWxpZF93aW5kb3codywgJmF0dHIsIDEpKSB7Ci0JCQlpZiAoIXNob3dfY2hpbGRyZW4pIHsKLQkJCQlzdHIgPSB3aW5fZm10KHcsIGF0dHIpOwotCQkJfSBlbHNlIHsKLQkJCQlzcHJpbnRmKHRtcCwgIjB4JWx4Iiwgdyk7Ci0JCQkJc3RyID0gdG1wOwotCQkJfQotCQl9Ci0JCWlmICgoaW50KSAoc3RybGVuKGdldF9zdHIpICsgMSArIHN0cmxlbihzdHIpKSA+PSBzaXplKSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCXN0cmNhdChnZXRfc3RyLCAiLCIpOwotCQl9Ci0JCXN0cmNhdChnZXRfc3RyLCBzdHIpOwotCX0KLQlnZXRfc3RyW3NpemVdID0gJ1wwJzsKLQlpZiAoIXNob3dfY2hpbGRyZW4pIHsKLQkJZnJlZShjaGlsZHJlbik7Ci0JfSBlbHNlIGlmIChuY2hpbGRyZW4pIHsKLQkJWEZyZWVfd3IoY2hpbGRyZW4pOwotCX0KLQlyZmJMb2coIndpbmluZm8gY29tcHV0ZWQ6ICVzXG4iLCBnZXRfc3RyKTsKLQlYX1VOTE9DSzsKLQotCXJldHVybiBzdHJkdXAoZ2V0X3N0cik7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBjaGVjayBpZiBjbGllbnRfY29ubmVjdCBoYXMgYmVlbiBzZXQsIGlmIHNvIG1ha2UgdGhlIHJldmVyc2UgY29ubmVjdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIHNlbmRfY2xpZW50X2Nvbm5lY3Qodm9pZCkgewotCWlmIChjbGllbnRfY29ubmVjdCAhPSBOVUxMKSB7Ci0JCWNoYXIgKnN0ciA9IGNsaWVudF9jb25uZWN0OwotCQlpZiAoc3Ryc3RyKHN0ciwgImNtZD0iKSA9PSBzdHIgfHwgc3Ryc3RyKHN0ciwgInFyeT0iKSA9PSBzdHIpIHsKLQkJCXByb2Nlc3NfcmVtb3RlX2NtZChjbGllbnRfY29ubmVjdCwgMCk7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgImFucz0iKSA9PSBzdHIKLQkJICAgIHx8IHN0cnN0cihzdHIsICJhcm89IikgPT0gc3RyKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgImFjaz0iKSA9PSBzdHIpIHsKLQkJCTsKLQkJfSBlbHNlIHsKLQkJCXJldmVyc2VfY29ubmVjdChjbGllbnRfY29ubmVjdCk7Ci0JCX0KLQkJZnJlZShjbGllbnRfY29ubmVjdCk7Ci0JCWNsaWVudF9jb25uZWN0ID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBtb25pdG9yIHRoZSB2YXJpb3VzIGlucHV0IG1ldGhvZHMKLSAqLwotdm9pZCBjaGVja19jb25uZWN0X2lucHV0cyh2b2lkKSB7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQkvKiBmbHVzaCBhbnkgYWxyZWFkeSBzZXQ6ICovCi0Jc2VuZF9jbGllbnRfY29ubmVjdCgpOwotCi0JLyogY29ubmVjdCBmaWxlOiAqLwotCWlmIChjbGllbnRfY29ubmVjdF9maWxlICE9IE5VTEwpIHsKLQkJY2hlY2tfY29ubmVjdF9maWxlKGNsaWVudF9jb25uZWN0X2ZpbGUpOwkJCi0JfQotCXNlbmRfY2xpZW50X2Nvbm5lY3QoKTsKLQotCS8qIFZOQ19DT05ORUNUIHByb3BlcnR5ICh2bmNjb25uZWN0IHByb2dyYW0pICovCi0JaWYgKHZuY19jb25uZWN0ICYmICp2bmNfY29ubmVjdF9zdHIgIT0gJ1wwJykgewotCQljbGllbnRfY29ubmVjdCA9IHN0cmR1cCh2bmNfY29ubmVjdF9zdHIpOwotCQl2bmNfY29ubmVjdF9zdHJbMF0gPSAnXDAnOwotCX0KLQlzZW5kX2NsaWVudF9jb25uZWN0KCk7Ci0KLQkvKiBYMTFWTkNfUkVNT1RFIHByb3BlcnR5ICovCi0JaWYgKHZuY19jb25uZWN0ICYmICp4MTF2bmNfcmVtb3RlX3N0ciAhPSAnXDAnKSB7Ci0JCWNsaWVudF9jb25uZWN0ID0gc3RyZHVwKHgxMXZuY19yZW1vdGVfc3RyKTsKLQkJeDExdm5jX3JlbW90ZV9zdHJbMF0gPSAnXDAnOwotCX0KLQlzZW5kX2NsaWVudF9jb25uZWN0KCk7Ci19Ci0KLXZvaWQgY2hlY2tfZ3VpX2lucHV0cyh2b2lkKSB7Ci0JaW50IGksIGdubWF4ID0gMCwgbiA9IDAsIG5mZHM7Ci0JaW50IHNvY2tzW0lDT05fTU9ERV9TT0NLU107Ci0JZmRfc2V0IGZkczsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQljaGFyIGJ1ZltYMTFWTkNfUkVNT1RFX01BWCsxXTsKLQlzc2l6ZV90IG5ieXRlczsKLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybjsKLQotCWZvciAoaT0wOyBpPElDT05fTU9ERV9TT0NLUzsgaSsrKSB7Ci0JCWlmIChpY29uX21vZGVfc29ja3NbaV0gPj0gMCkgewotCQkJc29ja3NbbisrXSA9IGk7Ci0JCQlpZiAoaWNvbl9tb2RlX3NvY2tzW2ldID4gZ25tYXgpIHsKLQkJCQlnbm1heCA9IGljb25fbW9kZV9zb2Nrc1tpXTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghIG4pIHsKLQkJcmV0dXJuOwotCX0KLQotCUZEX1pFUk8oJmZkcyk7Ci0JZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCUZEX1NFVChpY29uX21vZGVfc29ja3Nbc29ja3NbaV1dLCAmZmRzKTsKLQl9Ci0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQotCW5mZHMgPSBzZWxlY3QoZ25tYXgrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQlpZiAobmZkcyA8PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCWludCBrLCBmZCA9IGljb25fbW9kZV9zb2Nrc1tzb2Nrc1tpXV07Ci0JCWNoYXIgKnA7Ci0JCWNoYXIgKipsaXN0OwotCQlpbnQgbGluZDsKLQotCQlpZiAoISBGRF9JU1NFVChmZCwgJmZkcykpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZvciAoaz0wOyBrPD1YMTFWTkNfUkVNT1RFX01BWDsgaysrKSB7Ci0JCQlidWZba10gPSAnXDAnOwotCQl9Ci0JCW5ieXRlcyA9IHJlYWQoZmQsIGJ1ZiwgWDExVk5DX1JFTU9URV9NQVgpOwotCQlpZiAobmJ5dGVzIDw9IDApIHsKLQkJCWNsb3NlKGZkKTsKLQkJCWljb25fbW9kZV9zb2Nrc1tzb2Nrc1tpXV0gPSAtMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbGlzdCA9IChjaGFyICoqKSBjYWxsb2MoKHN0cmxlbihidWYpKzIpICogc2l6ZW9mKGNoYXIgKiksIDEpOwotCi0JCWxpbmQgPSAwOwotCQlwID0gc3RydG9rKGJ1ZiwgIlxyXG4iKTsKLQkJd2hpbGUgKHApIHsKLQkJCWxpc3RbbGluZCsrXSA9IHN0cmR1cChwKTsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIlxyXG4iKTsKLQkJfQotCi0JCWxpbmQgPSAwOwotCQl3aGlsZSAobGlzdFtsaW5kXSAhPSBOVUxMKSB7Ci0JCQlwID0gbGlzdFtsaW5kKytdOwotCQkJaWYgKHN0cnN0cihwLCAiY21kPSIpID09IHAgfHwKLQkJCSAgICBzdHJzdHIocCwgInFyeT0iKSA9PSBwKSB7Ci0JCQkJY2hhciAqc3RyID0gcHJvY2Vzc19yZW1vdGVfY21kKHAsIDEpOwotCQkJCWlmICghIHN0cikgewotCQkJCQlzdHIgPSBzdHJkdXAoIiIpOwotCQkJCX0KLQkJCQluYnl0ZXMgPSB3cml0ZShmZCwgc3RyLCBzdHJsZW4oc3RyKSk7Ci0JCQkJd3JpdGUoZmQsICJcbiIsIDEpOwotCQkJCWZyZWUoc3RyKTsKLQkJCQlpZiAobmJ5dGVzIDwgMCkgewotCQkJCQljbG9zZShmZCk7Ci0JCQkJCWljb25fbW9kZV9zb2Nrc1tzb2Nrc1tpXV0gPSAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbGluZCA9IDA7Ci0JCXdoaWxlIChsaXN0W2xpbmRdICE9IE5VTEwpIHsKLQkJCXAgPSBsaXN0W2xpbmQrK107Ci0JCQlpZiAocCkgZnJlZShwKTsKLQkJfQotCQlmcmVlKGxpc3QpOwotCX0KLX0KLQotcmZiQ2xpZW50UHRyIGNyZWF0ZV9uZXdfY2xpZW50KGludCBzb2NrLCBpbnQgc3RhcnRfdGhyZWFkKSB7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCi0JaWYgKCFzY3JlZW4pIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JY2wgPSByZmJOZXdDbGllbnQoc2NyZWVuLCBzb2NrKTsKLQotCWlmIChjbCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwkKLQl9Ci0JaWYgKHVzZV90aHJlYWRzKSB7Ci0JCWNsLT5vbkhvbGQgPSBGQUxTRTsKLQkJaWYgKHN0YXJ0X3RocmVhZCkgewotCQkJcmZiU3RhcnRPbkhvbGRDbGllbnQoY2wpOwotCQl9Ci0JfQotCXJldHVybiBjbDsKLX0KLQotc3RhdGljIGludCB0dXJuX29mZl90cnVlY29sb3IgPSAwOwotCi1zdGF0aWMgdm9pZCB0dXJuX29mZl90cnVlY29sb3JfYWQocmZiQ2xpZW50UHRyIGNsaWVudCkgewotCWlmIChjbGllbnQpIHt9Ci0JaWYgKHR1cm5fb2ZmX3RydWVjb2xvcikgewotCQlyZmJMb2coInR1cm5pbmcgb2ZmIHRydWVjb2xvciBhZHZlcnRpc2luZy5cbiIpOwotCQkvKiBtdXRleCAqLwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC50cnVlQ29sb3VyID0gRkFMU0U7Ci0JCXNjcmVlbi0+ZGlzcGxheUhvb2sgPSBOVUxMOwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC5yZWRTaGlmdCAgID0gMDsKLQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZ3JlZW5TaGlmdCA9IDA7Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LmJsdWVTaGlmdCAgPSAwOwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC5yZWRNYXggICAgID0gMDsKLQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZ3JlZW5NYXggICA9IDA7Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LmJsdWVNYXggICAgPSAwOwotCQl0dXJuX29mZl90cnVlY29sb3IgPSAwOwotCX0KLX0KLQotLyoKLSAqIHNvbWUgb3ZlcnJpZGVzIGZvciB0aGUgbG9jYWwgY29uc29sZSB0ZXh0IGNoYXQuCi0gKiBjb3VsZCBiZSB1c2VmdWwgaW4gZ2VuZXJhbCBmb3IgbG9jYWwgaGVscGVycy4KLSAqLwotCi1yZmJCb29sIHBhc3N3b3JkX2NoZWNrX2NoYXRfaGVscGVyKHJmYkNsaWVudFB0ciBjbCwgY29uc3QgY2hhciogcmVzcG9uc2UsIGludCBsZW4pIHsKLQlpZiAocmVzcG9uc2UgfHwgbGVuKSB7fQotCWlmIChjbCAhPSBjaGF0X3dpbmRvd19jbGllbnQpIHsKLQkJcmZiTG9nKCJpbnZhbGlkIGNsaWVudCBkdXJpbmcgY2hhdF9oZWxwZXIgbG9naW5cbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFjbC0+aG9zdCkgewotCQkJcmZiTG9nKCJlbXB0eSBjbC0+aG9zdCBkdXJpbmcgY2hhdF9oZWxwZXIgbG9naW5cbiIpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWlmIChzdHJjbXAoY2wtPmhvc3QsICIxMjcuMC4wLjEiKSkgewotCQkJcmZiTG9nKCJpbnZhbGlkIGNsLT5ob3N0IGR1cmluZyBjaGF0X2hlbHBlciBsb2dpbjogJXNcbiIsIGNsLT5ob3N0KTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQlyZmJMb2coImNoYXRfaGVscGVyIGxvZ2luIGFjY2VwdGVkXG4iKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotfQotCi1lbnVtIHJmYk5ld0NsaWVudEFjdGlvbiBuZXdfY2xpZW50X2NoYXRfaGVscGVyKHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpZiAoY2xpZW50KSB7fQotCWNsaWVudC0+Y2xpZW50R29uZUhvb2sgPSBjbGllbnRfZ29uZV9jaGF0X2hlbHBlcjsKLQlyZmJMb2coIm5ldyBjaGF0IGhlbHBlclxuIik7Ci0JcmV0dXJuKFJGQl9DTElFTlRfQUNDRVBUKTsKLX0KLQotdm9pZCBjbGllbnRfZ29uZV9jaGF0X2hlbHBlcihyZmJDbGllbnRQdHIgY2xpZW50KSB7Ci0JaWYgKGNsaWVudCkge30KLQlyZmJMb2coImZpbmlzaGVkIGNoYXQgaGVscGVyXG4iKTsKLQljaGF0X3dpbmRvd19jbGllbnQgPSBOVUxMOwotfQotCi12b2lkIGNsaWVudF9zZXRfbmV0KHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlDbGllbnREYXRhICpjZDsgCi0JaWYgKGNsaWVudCA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JY2QgPSAoQ2xpZW50RGF0YSAqKSBjbGllbnQtPmNsaWVudERhdGE7Ci0JaWYgKGNkID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY2QtPmNsaWVudF9wb3J0IDwgMCkgewotCQlkb3VibGUgZHQgPSBkbm93KCk7Ci0JCWNkLT5jbGllbnRfcG9ydCA9IGdldF9yZW1vdGVfcG9ydChjbGllbnQtPnNvY2spOwotCQljZC0+c2VydmVyX3BvcnQgPSBnZXRfbG9jYWxfcG9ydChjbGllbnQtPnNvY2spOwotCQljZC0+c2VydmVyX2lwICAgPSBnZXRfbG9jYWxfaG9zdChjbGllbnQtPnNvY2spOwotCQljZC0+aG9zdG5hbWUgPSBpcDJob3N0KGNsaWVudC0+aG9zdCk7Ci0JCXJmYkxvZygiY2xpZW50X3NldF9uZXQ6ICVzICAlLjRmXG4iLCBjbGllbnQtPmhvc3QsIGRub3coKSAtIGR0KTsKLQl9Ci19Ci0vKgotICogbGlidm5jc2VydmVyIGNhbGxiYWNrIGZvciB3aGVuIGEgbmV3IGNsaWVudCBjb25uZWN0cwotICovCi1lbnVtIHJmYk5ld0NsaWVudEFjdGlvbiBuZXdfY2xpZW50KHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlDbGllbnREYXRhICpjZDsgCi0KLQlDTElFTlRfTE9DSzsKLQotCWxhc3RfZXZlbnQgPSBsYXN0X2lucHV0ID0gdGltZShOVUxMKTsKLQotCWxhdGVzdF9jbGllbnQgPSBjbGllbnQ7Ci0KLQlpZiAoaW5ldGQpIHsKLQkJLyogCi0JCSAqIFNldCB0aGlzIHNvIHdlIGV4aXQgYXMgc29vbiBhcyBjb25uZWN0aW9uIGNsb3NlcywKLQkJICogb3RoZXJ3aXNlIGNsaWVudF9nb25lIGlzIG9ubHkgY2FsbGVkIGFmdGVyIFJGQl9DTElFTlRfQUNDRVBUCi0JCSAqLwotCQlpZiAoaW5ldGRfY2xpZW50ID09IE5VTEwpIHsKLQkJCWluZXRkX2NsaWVudCA9IGNsaWVudDsKLQkJCWNsaWVudC0+Y2xpZW50R29uZUhvb2sgPSBjbGllbnRfZ29uZTsKLQkJfQotCX0KLQotCWNsaWVudHNfc2VydmVkKys7Ci0KLQlpZiAodXNlX29wZW5zc2wgfHwgdXNlX3N0dW5uZWwpIHsKLQkJaWYgKCEgc3NsX2luaXRpYWxpemVkKSB7Ci0JCQlyZmJMb2coImRlbnlpbmcgYWRkaXRpb25hbCBjbGllbnQ6ICVzIHNzbCBub3Qgc2V0dXAiCi0JCQkgICAgIiB5ZXQuXG4iLCBjbGllbnQtPmhvc3QpOwotCQkJQ0xJRU5UX1VOTE9DSzsKLQkJCXJldHVybihSRkJfQ0xJRU5UX1JFRlVTRSk7Ci0JCX0KLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZmJMb2coImRlbnlpbmcgYWRkaXRpb25hbCBjbGllbnQ6ICVzIGR1cmluZyAtdW5peHB3IGxvZ2luLlxuIiwKLQkJICAgICBjbGllbnQtPmhvc3QpOwotCQlDTElFTlRfVU5MT0NLOwotCQlyZXR1cm4oUkZCX0NMSUVOVF9SRUZVU0UpOwotCX0KLQlpZiAoY29ubmVjdF9vbmNlKSB7Ci0JCWlmIChzY3JlZW4tPmRvbnREaXNjb25uZWN0ICYmIHNjcmVlbi0+bmV2ZXJTaGFyZWQpIHsKLQkJCWlmICghIHNoYXJlZCAmJiBhY2NlcHRlZF9jbGllbnQpIHsKLQkJCQlyZmJMb2coImRlbnlpbmcgYWRkaXRpb25hbCBjbGllbnQ6ICVzOiVkXG4iLAotCQkJCSAgICAgY2xpZW50LT5ob3N0LCBnZXRfcmVtb3RlX3BvcnQoY2xpZW50LT5zb2NrKSk7Ci0JCQkJQ0xJRU5UX1VOTE9DSzsKLQkJCQlyZXR1cm4oUkZCX0NMSUVOVF9SRUZVU0UpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGlwdjZfY2xpZW50X2lwX3N0ciAhPSBOVUxMKSB7Ci0JCXJmYkxvZygicmVuYW1pbmcgY2xpZW50LT5ob3N0IGZyb20gJyVzJyB0byAnJXMnXG4iLAotCQkgICAgY2xpZW50LT5ob3N0ID8gY2xpZW50LT5ob3N0IDogIiIsIGlwdjZfY2xpZW50X2lwX3N0cik7Ci0JCWlmIChjbGllbnQtPmhvc3QpIHsKLQkJCWZyZWUoY2xpZW50LT5ob3N0KTsKLQkJfQotCQljbGllbnQtPmhvc3QgPSBzdHJkdXAoaXB2Nl9jbGllbnRfaXBfc3RyKTsKLQl9Ci0KLQlpZiAoISBjaGVja19hY2Nlc3MoY2xpZW50LT5ob3N0KSkgewotCQlyZmJMb2coImRlbnlpbmcgY2xpZW50OiAlcyBkb2VzIG5vdCBtYXRjaCAlc1xuIiwgY2xpZW50LT5ob3N0LAotCQkgICAgYWxsb3dfbGlzdCA/IGFsbG93X2xpc3QgOiAiKG51bGwpIiApOwotCQlDTElFTlRfVU5MT0NLOwotCQlyZXR1cm4oUkZCX0NMSUVOVF9SRUZVU0UpOwotCX0KLQotCWNsaWVudC0+Y2xpZW50RGF0YSA9ICh2b2lkICopIGNhbGxvYyhzaXplb2YoQ2xpZW50RGF0YSksIDEpOwotCWNkID0gKENsaWVudERhdGEgKikgY2xpZW50LT5jbGllbnREYXRhOwotCi0JLyogc2VlIGNsaWVudF9zZXRfbmV0KCkgd2UgZGVsYXkgdGhlIEROUyBsb29rdXBzIGR1cmluZyBoYW5kc2hha2UgKi8KLQljZC0+Y2xpZW50X3BvcnQgPSAtMTsKLQljZC0+dXNlcm5hbWUgPSBzdHJkdXAoIiIpOwotCWNkLT51bml4bmFtZSA9IHN0cmR1cCgiIik7Ci0KLQljZC0+aW5wdXRbMF0gPSAnLSc7Ci0JY2QtPmxvZ2luX3ZpZXdvbmx5ID0gLTE7Ci0JY2QtPmxvZ2luX3RpbWUgPSB0aW1lKE5VTEwpOwotCWNkLT5zc2xfaGVscGVyX3BpZCA9IDA7Ci0KLQlpZiAodXNlX29wZW5zc2wgJiYgb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQpIHsKLQkJY2QtPnNzbF9oZWxwZXJfcGlkID0gb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQ7Ci0JCW9wZW5zc2xfbGFzdF9oZWxwZXJfcGlkID0gMDsKLQl9Ci0KLQlpZiAoISBhY2NlcHRfY2xpZW50KGNsaWVudCkpIHsKLQkJcmZiTG9nKCJkZW55aW5nIGNsaWVudDogJXMgbG9jYWwgdXNlciByZWplY3RlZCBjb25uZWN0aW9uLlxuIiwKLQkJICAgIGNsaWVudC0+aG9zdCk7Ci0JCXJmYkxvZygiZGVueWluZyBjbGllbnQ6IGFjY2VwdF9jbWQ9XCIlc1wiXG4iLAotCQkgICAgYWNjZXB0X2NtZCA/IGFjY2VwdF9jbWQgOiAiKG51bGwpIiApOwotCi0JCWZyZWVfY2xpZW50X2RhdGEoY2xpZW50KTsKLQotCQlDTElFTlRfVU5MT0NLOwotCQlyZXR1cm4oUkZCX0NMSUVOVF9SRUZVU0UpOwotCX0KLQotCS8qIFdlIHdpbGwgUkZCX0NMSUVOVF9BQ0NFUFQgb3IgUkZCX0NMSUVOVF9PTl9IT0xEIGZyb20gaGVyZSBvbi4gKi8KLQotCWlmIChwYXNzd2RmaWxlKSB7Ci0JCWlmIChzdHJzdHIocGFzc3dkZmlsZSwgInJlYWQ6IikgPT0gcGFzc3dkZmlsZSB8fAotCQkgICAgc3Ryc3RyKHBhc3N3ZGZpbGUsICJjbWQ6IikgPT0gcGFzc3dkZmlsZSkgewotCQkJaWYgKHJlYWRfcGFzc3dkcyhwYXNzd2RmaWxlKSkgewotCQkJCWluc3RhbGxfcGFzc3dkcygpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coInByb2JsZW0gcmVhZGluZzogJXNcbiIsIHBhc3N3ZGZpbGUpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHBhc3N3ZGZpbGUsICJjdXN0b206IikgPT0gcGFzc3dkZmlsZSkgewotCQkJaWYgKHNjcmVlbikgewotCQkJCS8qIG11dGV4ICovCi0JCQkJc2NyZWVuLT5wYXNzd29yZENoZWNrID0gY3VzdG9tX3Bhc3N3ZF9jaGVjazsKLQkJCX0KLQkJfQotCX0KLQotCWNkLT51aWQgPSBjbGllbnRzX3NlcnZlZDsKLQotCWNsaWVudC0+Y2xpZW50R29uZUhvb2sgPSBjbGllbnRfZ29uZTsKLQotCWlmIChjbGllbnRfY291bnQpIHsKLQkJc3BlZWRzX25ldF9yYXRlX21lYXN1cmVkID0gMDsKLQkJc3BlZWRzX25ldF9sYXRlbmN5X21lYXN1cmVkID0gMDsKLQl9Ci0JY2xpZW50X2NvdW50Kys7Ci0KLQlsYXN0X2tleWJvYXJkX2lucHV0ID0gbGFzdF9wb2ludGVyX2lucHV0ID0gdGltZShOVUxMKTsKLQotCWlmIChub19hdXRvcmVwZWF0ICYmIGNsaWVudF9jb3VudCA9PSAxICYmICEgdmlld19vbmx5KSB7Ci0JCS8qCi0JCSAqIGZpcnN0IGNsaWVudCwgdHVybiBvZmYgWCBzZXJ2ZXIgYXV0b3JlcGVhdAotCQkgKiBYWFggaGFuZGxlIGR5bmFtaWMgY2hhbmdlIG9mIHZpZXdfb25seSBhbmQgcGVyLWNsaWVudC4KLQkJICovCi0JCWF1dG9yZXBlYXQoMCwgMCk7Ci0JfQotI2lmZGVmIE1BQ09TWAotCWlmIChtYWNvc3hfY29uc29sZSAmJiBjbGllbnRfY291bnQgPT0gMSkgewotCQltYWNvc3hDR19yZWZyZXNoX2NhbGxiYWNrX29uKCk7Ci0JfQotI2VuZGlmCi0JaWYgKHVzZV9zb2xpZF9iZyAmJiBjbGllbnRfY291bnQgPT0gMSkgewotCQlzb2xpZF9iZygwKTsKLQl9Ci0KLQlpZiAocGFkX2dlb21ldHJ5KSB7Ci0JCWluc3RhbGxfcGFkZGVkX2ZiKHBhZF9nZW9tZXRyeSk7Ci0JfQotCi0JY2QtPnRpbWVyID0gbGFzdF9uZXdfY2xpZW50ID0gZG5vdygpOwotCWNkLT5zZW5kX2NtcF9yYXRlID0gMC4wOwotCWNkLT5zZW5kX3Jhd19yYXRlID0gMC4wOwotCWNkLT5sYXRlbmN5ID0gMC4wOwotCWNkLT5jbXBfYnl0ZXNfc2VudCA9IDA7Ci0JY2QtPnJhd19ieXRlc19zZW50ID0gMDsKLQotCWFjY2VwdGVkX2NsaWVudCsrOwotCXJmYkxvZygiaW5jciBhY2NlcHRlZF9jbGllbnQ9JWQgZm9yICVzOiVkICBzb2NrPSVkXG4iLCBhY2NlcHRlZF9jbGllbnQsCi0JICAgIGNsaWVudC0+aG9zdCwgZ2V0X3JlbW90ZV9wb3J0KGNsaWVudC0+c29jayksIGNsaWVudC0+c29jayk7Ci0JbGFzdF9jbGllbnQgPSB0aW1lKE5VTEwpOwotCi0JaWYgKG5jYWNoZSkgewotCQljaGVja19uY2FjaGUoMSwgMCk7Ci0JfQotCi0JaWYgKGFkdmVydGlzZV90cnVlY29sb3IgJiYgaW5kZXhlZF9jb2xvcikgewotCQlpbnQgcnMgPSAwLCBncyA9IDIsIGJzID0gNDsKLQkJaW50IHJtID0gMywgZ20gPSAzLCBibSA9IDM7Ci0JCWlmIChicHAgPj0gMjQpIHsKLQkJCXJzID0gMCwgZ3MgPSA4LCBicyA9IDE2OwotCQkJcm0gPSAyNTUsIGdtID0gMjU1LCBibSA9IDI1NTsKLQkJfSBlbHNlIGlmIChicHAgPj0gMTYpIHsKLQkJCXJzID0gMCwgZ3MgPSA1LCBicyA9IDEwOwotCQkJcm0gPSAzMSwgZ20gPSAzMSwgYm0gPSAzMTsKLQkJfQotCQlyZmJMb2coImFkdmVydGlzaW5nIHRydWVjb2xvci5cbiIpOwotCQlpZiAoZ2V0ZW52KCJBRFZFUlRfQk1TSElGVCIpKSB7Ci0JCQlibS0tOwotCQl9Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsaWVudC0+dXBkYXRlTXV0ZXgpOwotCi0JCWNsaWVudC0+Zm9ybWF0LnRydWVDb2xvdXIgPSBUUlVFOwotCQljbGllbnQtPmZvcm1hdC5yZWRTaGlmdCAgID0gcnM7Ci0JCWNsaWVudC0+Zm9ybWF0LmdyZWVuU2hpZnQgPSBnczsKLQkJY2xpZW50LT5mb3JtYXQuYmx1ZVNoaWZ0ICA9IGJzOwotCQljbGllbnQtPmZvcm1hdC5yZWRNYXggICAgID0gcm07Ci0JCWNsaWVudC0+Zm9ybWF0LmdyZWVuTWF4ICAgPSBnbTsKLQkJY2xpZW50LT5mb3JtYXQuYmx1ZU1heCAgICA9IGJtOwotCi0JCWlmICh1c2VfdGhyZWFkcykgVU5MT0NLKGNsaWVudC0+dXBkYXRlTXV0ZXgpOwotCi0JCXJmYlNldFRyYW5zbGF0ZUZ1bmN0aW9uKGNsaWVudCk7Ci0KLQkJLyogbXV0ZXggKi8KLQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQudHJ1ZUNvbG91ciA9IFRSVUU7Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LnJlZFNoaWZ0ICAgPSByczsKLQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZ3JlZW5TaGlmdCA9IGdzOwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlU2hpZnQgID0gYnM7Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LnJlZE1heCAgICAgPSBybTsKLQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZ3JlZW5NYXggICA9IGdtOwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlTWF4ICAgID0gYm07Ci0JCXNjcmVlbi0+ZGlzcGxheUhvb2sgPSB0dXJuX29mZl90cnVlY29sb3JfYWQ7Ci0KLQkJdHVybl9vZmZfdHJ1ZWNvbG9yID0gMTsKLQl9Ci0KLQlpZiAodW5peHB3KSB7Ci0JCXVuaXhwd19pbl9wcm9ncmVzcyA9IDE7Ci0JCXVuaXhwd19jbGllbnQgPSBjbGllbnQ7Ci0JCXVuaXhwd19sb2dpbl92aWV3b25seSA9IDA7Ci0KLQkJdW5peHB3X2ZpbGVfeGZlcl9zYXZlID0gc2NyZWVuLT5wZXJtaXRGaWxlVHJhbnNmZXI7Ci0JCXNjcmVlbi0+cGVybWl0RmlsZVRyYW5zZmVyID0gRkFMU0U7Ci0JCXVuaXhwd190aWdodHZuY194ZmVyX3NhdmUgPSB0aWdodGZpbGV4ZmVyOwotCQl0aWdodGZpbGV4ZmVyID0gMDsKLSNpZmRlZiBMSUJWTkNTRVJWRVJfV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIKLQkJcmZiTG9nKCJyZmJVbnJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb246IDFcbiIpOwotCQlyZmJVbnJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb24oKTsKLSNlbmRpZgotCi0JCWlmIChjbGllbnQtPnZpZXdPbmx5KSB7Ci0JCQl1bml4cHdfbG9naW5fdmlld29ubHkgPSAxOwotCQkJY2xpZW50LT52aWV3T25seSA9IEZBTFNFOwotCQl9Ci0JCXVuaXhwd19sYXN0X3RyeV90aW1lID0gdGltZShOVUxMKSArIDEwOwotCi0JCXVuaXhwd19zY3JlZW4oMSk7Ci0JCXVuaXhwd19rZXlzdHJva2UoMCwgMCwgMSk7Ci0KLQkJaWYgKCF1bml4cHdfaW5fcmZiUEUpIHsKLQkJCXJmYkxvZygibmV3IGNsaWVudDogJXMgaW4gbm9uLXVuaXhwd19pbl9yZmJQRS5cbiIsCi0JCQkgICAgIGNsaWVudC0+aG9zdCk7Ci0JCX0KLQkJQ0xJRU5UX1VOTE9DSzsKLQkJaWYgKCF1c2VfdGhyZWFkcykgewotCQkJLyogYWx3YXlzIHB1dCBjbGllbnQgb24gaG9sZCBldmVuIGlmIHVuaXhwd19pbl9yZmJQRSBpcyB0cnVlICovCi0JCQlyZXR1cm4oUkZCX0NMSUVOVF9PTl9IT0xEKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHVuaXhwdyB0aHJlYWRzIGlzIHN0aWxsIGluIHRlc3RpbmcgbW9kZSwgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2VlIFVOSVhQV19USFJFQURTICovCi0JCQlyZXR1cm4oUkZCX0NMSUVOVF9BQ0NFUFQpOwotCQl9Ci0JfQotCi0JQ0xJRU5UX1VOTE9DSzsKLQlyZXR1cm4oUkZCX0NMSUVOVF9BQ0NFUFQpOwotfQotCi12b2lkIHN0YXJ0X2NsaWVudF9pbmZvX3NvY2soY2hhciAqaG9zdF9wb3J0X2Nvb2tpZSkgewotCWNoYXIgKmhvc3QgPSBOVUxMLCAqY29va2llID0gTlVMTCwgKnA7Ci0JY2hhciAqc3RyID0gc3RyZHVwKGhvc3RfcG9ydF9jb29raWUpOwotCWludCBpLCBwb3J0LCBzb2NrLCBuZXh0ID0gLTE7Ci0Jc3RhdGljIHRpbWVfdCBzdGFydF90aW1lW0lDT05fTU9ERV9TT0NLU107Ci0JdGltZV90IG9sZGVzdCA9IDA7Ci0JaW50IGRiID0gMDsKLQotCXBvcnQgPSAtMTsKLQotCWZvciAoaSA9IDA7IGkgPCBJQ09OX01PREVfU09DS1M7IGkrKykgewotCQlpZiAoaWNvbl9tb2RlX3NvY2tzW2ldIDwgMCkgewotCQkJbmV4dCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAob2xkZXN0ID09IDAgfHwgc3RhcnRfdGltZVtpXSA8IG9sZGVzdCkgewotCQkJbmV4dCA9IGk7Ci0JCQlvbGRlc3QgPSBzdGFydF90aW1lW2ldOwotCQl9Ci0JfQotCi0JcCA9IHN0cnRvayhzdHIsICI6Iik7Ci0JaSA9IDA7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKGkgPT0gMCkgewotCQkJaG9zdCA9IHN0cmR1cChwKTsKLQkJfSBlbHNlIGlmIChpID09IDEpIHsKLQkJCXBvcnQgPSBhdG9pKHApOwotCQl9IGVsc2UgaWYgKGkgPT0gMikgewotCQkJY29va2llID0gc3RyZHVwKHApOwotCQl9Ci0JCWkrKzsKLQkJcCA9IHN0cnRvayhOVUxMLCAiOiIpOwotCX0KLQlmcmVlKHN0cik7Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiJXMvJWQvJXMgbmV4dD0lZFxuIiwgaG9zdCwgcG9ydCwgY29va2llLCBuZXh0KTsKLQotCWlmIChob3N0ICYmIHBvcnQgJiYgY29va2llKSB7Ci0JCWlmICgqaG9zdCA9PSAnXDAnKSB7Ci0JCQlmcmVlKGhvc3QpOwotCQkJaG9zdCA9IHN0cmR1cCgibG9jYWxob3N0Iik7Ci0JCX0KLQkJc29jayA9IGNvbm5lY3RfdGNwKGhvc3QsIHBvcnQpOwotCQlpZiAoc29jayA8IDApIHsKLQkJCXVzbGVlcCgyMDAgKiAxMDAwKTsKLQkJCXNvY2sgPSBjb25uZWN0X3RjcChob3N0LCBwb3J0KTsKLQkJfQotCQlpZiAoc29jayA+PSAwKSB7Ci0JCQljaGFyICpsc3QgPSBsaXN0X2NsaWVudHMoKTsKLQkJCWljb25fbW9kZV9zb2Nrc1tuZXh0XSA9IHNvY2s7Ci0JCQlzdGFydF90aW1lW25leHRdID0gdGltZShOVUxMKTsKLQkJCXdyaXRlKHNvY2ssICJDT09LSUU6Iiwgc3RybGVuKCJDT09LSUU6IikpOwotCQkJd3JpdGUoc29jaywgY29va2llLCBzdHJsZW4oY29va2llKSk7Ci0JCQl3cml0ZShzb2NrLCAiXG4iLCBzdHJsZW4oIlxuIikpOwotCQkJd3JpdGUoc29jaywgIm5vbmVcbiIsIHN0cmxlbigibm9uZVxuIikpOwotCQkJd3JpdGUoc29jaywgIm5vbmVcbiIsIHN0cmxlbigibm9uZVxuIikpOwotCQkJd3JpdGUoc29jaywgbHN0LCBzdHJsZW4obHN0KSk7Ci0JCQl3cml0ZShzb2NrLCAiXG4iLCBzdHJsZW4oIlxuIikpOwotCQkJaWYgKGRiKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJsaXN0OiAlc1xuIiwgbHN0KTsKLQkJCX0KLQkJCWZyZWUobHN0KTsKLQkJCXJmYkxvZygiY2xpZW50X2luZm9fc29jayB0bzogJXM6JWRcbiIsIGhvc3QsIHBvcnQpOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJmYWlsZWQgY2xpZW50X2luZm9fc29jazogJXM6JWRcbiIsIGhvc3QsIHBvcnQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJtYWxmb3JtZWQgY2xpZW50X2luZm9fc29jazogJXNcbiIsIGhvc3RfcG9ydF9jb29raWUpOwkKLQl9Ci0KLQlpZiAoaG9zdCkgZnJlZShob3N0KTsKLQlpZiAoY29va2llKSBmcmVlKGNvb2tpZSk7Ci19Ci0KLXZvaWQgc2VuZF9jbGllbnRfaW5mbyhjaGFyICpzdHIpIHsKLQlpbnQgaTsKLQlzdGF0aWMgY2hhciAqcHN0ciA9IE5VTEw7Ci0Jc3RhdGljIGludCBsZW4gPSAxMjg7IAotCi0JaWYgKCFzdHIgfHwgc3RybGVuKHN0cikgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwc3RyKSAgewotCQlwc3RyID0gKGNoYXIgKiltYWxsb2MobGVuKTsKLQl9Ci0JaWYgKHN0cmxlbihzdHIpICsgMiA+IChzaXplX3QpIGxlbikgewotCQlmcmVlKHBzdHIpOwotCQlsZW4gKj0gMjsKLQkJcHN0ciA9IChjaGFyICopbWFsbG9jKGxlbik7Ci0JfQotCXN0cmNweShwc3RyLCBzdHIpOwotCXN0cmNhdChwc3RyLCAiXG4iKTsKLQotCWlmIChpY29uX21vZGVfZmgpIHsKLQkJaWYgKDApIGZwcmludGYoaWNvbl9tb2RlX2ZoLCAiXG4iKTsKLQkJZnByaW50ZihpY29uX21vZGVfZmgsICIlcyIsIHBzdHIpOwotCQlmZmx1c2goaWNvbl9tb2RlX2ZoKTsKLQl9Ci0KLQlmb3IgKGk9MDsgaTxJQ09OX01PREVfU09DS1M7IGkrKykgewotCQlpbnQgbGVuLCBuLCBzb2NrID0gaWNvbl9tb2RlX3NvY2tzW2ldOwotCQljaGFyICpidWYgPSBwc3RyOwotCi0JCWlmIChzb2NrIDwgMCkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlsZW4gPSBzdHJsZW4ocHN0cik7Ci0JCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQlpZiAoMCkgd3JpdGUoc29jaywgIlxuIiwgMSk7Ci0JCQluID0gd3JpdGUoc29jaywgYnVmLCBsZW4pOwotCQkJaWYgKG4gPiAwKSB7Ci0JCQkJYnVmICs9IG47Ci0JCQkJbGVuIC09IG47Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xvc2Uoc29jayk7Ci0JCQlpY29uX21vZGVfc29ja3NbaV0gPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi12b2lkIGFkanVzdF9ncmFicyhpbnQgZ3JhYiwgaW50IHF1aWV0KSB7Ci0JUkFXRkJfUkVUX1ZPSUQKLSNpZiBOT19YMTEKLQlpZiAoIWdyYWIgfHwgIXF1aWV0KSB7fQotCXJldHVybjsKLSNlbHNlCi0JLyogbi5iLiBjYWxsZXIgZGVjaWRlcyB0byBYX0xPQ0sgb3Igbm90LiAqLwotCWlmIChncmFiKSB7Ci0JCWlmIChncmFiX2tiZCkgewotCQkJaWYgKCEgcXVpZXQpIHsKLQkJCQlyZmJMb2coImdyYWJiaW5nIGtleWJvYXJkIHdpdGggWEdyYWJLZXlib2FyZFxuIik7Ci0JCQl9Ci0JCQlYR3JhYktleWJvYXJkKGRweSwgd2luZG93LCBGYWxzZSwgR3JhYk1vZGVBc3luYywKLQkJCSAgICBHcmFiTW9kZUFzeW5jLCBDdXJyZW50VGltZSk7Ci0JCX0KLQkJaWYgKGdyYWJfcHRyKSB7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCXJmYkxvZygiZ3JhYmJpbmcgcG9pbnRlciB3aXRoIFhHcmFiUG9pbnRlclxuIik7Ci0JCQl9Ci0JCQlYR3JhYlBvaW50ZXIoZHB5LCB3aW5kb3csIEZhbHNlLCAwLCBHcmFiTW9kZUFzeW5jLAotCQkJICAgIEdyYWJNb2RlQXN5bmMsIE5vbmUsIE5vbmUsIEN1cnJlbnRUaW1lKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChncmFiX2tiZCkgewotCQkJaWYgKCEgcXVpZXQpIHsKLQkJCQlyZmJMb2coInVuZ3JhYmJpbmcga2V5Ym9hcmQgd2l0aCBYVW5ncmFiS2V5Ym9hcmRcbiIpOwotCQkJfQotCQkJWFVuZ3JhYktleWJvYXJkKGRweSwgQ3VycmVudFRpbWUpOwotCQl9Ci0JCWlmIChncmFiX3B0cikgewotCQkJaWYgKCEgcXVpZXQpIHsKLQkJCQlyZmJMb2coInVuZ3JhYmJpbmcgcG9pbnRlciB3aXRoIFhVbmdyYWJQb2ludGVyXG4iKTsKLQkJCX0KLQkJCVhVbmdyYWJQb2ludGVyKGRweSwgQ3VycmVudFRpbWUpOwotCQl9Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIGNoZWNrX25ld19jbGllbnRzKHZvaWQpIHsKLQlzdGF0aWMgaW50IGxhc3RfY291bnQgPSAtMTsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQlpbnQgaSwgc2VuZF9pbmZvID0gMDsKLQlpbnQgcnVuX2FmdGVyX2FjY2VwdCA9IDA7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSB7Ci0JCXN0YXRpYyBkb3VibGUgbHBpbmcgPSAwLjA7Ci0JCWlmIChscGluZyA8IGRub3coKSArIDUpIHsKLQkJCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCAxLCAxLCAxKTsKLQkJCWxwaW5nID0gZG5vdygpOwotCQl9Ci0JCWlmICh1bml4cHdfY2xpZW50ICYmIHVuaXhwd19jbGllbnQtPnZpZXdPbmx5KSB7Ci0JCQl1bml4cHdfbG9naW5fdmlld29ubHkgPSAxOwotCQkJdW5peHB3X2NsaWVudC0+dmlld09ubHkgPSBGQUxTRTsKLQkJfQotCQlpZiAodGltZShOVUxMKSA+IHVuaXhwd19sYXN0X3RyeV90aW1lICsgNDUpIHsKLQkJCXJmYkxvZygidW5peHB3X2Rlbnk6IHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXBseS5cbiIpOwotCQkJdW5peHB3X2RlbnkoKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGdyYWJfYWx3YXlzKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKGdyYWJfa2JkIHx8IGdyYWJfcHRyKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdF9mb3JjZSA9IDAuMDsKLQkJaWYgKGNsaWVudF9jb3VudCAhPSBsYXN0X2NvdW50IHx8IGRub3coKSA+IGxhc3RfZm9yY2UgKyAwLjI1KSB7Ci0JCQlpbnQgcSA9IChjbGllbnRfY291bnQgPT0gbGFzdF9jb3VudCk7Ci0JCQlsYXN0X2ZvcmNlID0gZG5vdygpOwotCQkJWF9MT0NLOwotCQkJaWYgKGNsaWVudF9jb3VudCkgewotCQkJCWFkanVzdF9ncmFicygxLCBxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRqdXN0X2dyYWJzKDAsIHEpOwotCQkJfQotCQkJWF9VTkxPQ0s7Ci0JCX0KLQl9Ci0JCi0JaWYgKGxhc3RfY291bnQgPT0gLTEpIHsKLQkJbGFzdF9jb3VudCA9IDA7Ci0JfSBlbHNlIGlmIChjbGllbnRfY291bnQgPT0gbGFzdF9jb3VudCkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGNsaWVudF9jb3VudCA+IGxhc3RfY291bnQpIHsKLQkJaWYgKGFmdGVyYWNjZXB0X2NtZCAhPSBOVUxMICYmIGFmdGVyYWNjZXB0X2NtZFswXSAhPSAnXDAnKSB7Ci0JCQlydW5fYWZ0ZXJfYWNjZXB0ID0gMTsKLQkJfQotCX0KLQotCWxhc3RfY291bnQgPSBjbGllbnRfY291bnQ7Ci0KLQlpZiAoISBzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIGNsaWVudF9jb3VudCkgewotCQlzZW5kX2NsaWVudF9pbmZvKCJjbGllbnRzOm5vbmUiKTsKLQkJcmV0dXJuOwotCX0KLQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQlDbGllbnREYXRhICpjZCA9IChDbGllbnREYXRhICopIGNsLT5jbGllbnREYXRhOwotCQljaGFyICpzOwotCi0JCWNsaWVudF9zZXRfbmV0KGNsKTsKLQkJaWYgKCEgY2QpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNkLT5sb2dpbl92aWV3b25seSA8IDApIHsKLQkJCS8qIHRoaXMgaXMgYSBnZW5lcmFsIHRyaWdnZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MgKi8KLQkJCWlmIChjbC0+dmlld09ubHkpIHsKLQkJCQljZC0+bG9naW5fdmlld29ubHkgPSAxOwotCQkJCXMgPSBhbGxvd2VkX2lucHV0X3ZpZXdfb25seTsKLQkJCQlpZiAocyAmJiBjZC0+aW5wdXRbMF0gPT0gJy0nKSB7Ci0JCQkJCWNsLT52aWV3T25seSA9IEZBTFNFOwotCQkJCQljZC0+aW5wdXRbMF0gPSAnXDAnOwotCQkJCQlzdHJuY3B5KGNkLT5pbnB1dCwgcywgQ0lMRU4pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2QtPmxvZ2luX3ZpZXdvbmx5ID0gMDsKLQkJCQlzID0gYWxsb3dlZF9pbnB1dF9ub3JtYWw7Ci0JCQkJaWYgKHMgJiYgY2QtPmlucHV0WzBdID09ICctJykgewotCQkJCQljZC0+aW5wdXRbMF0gPSAnXDAnOwotCQkJCQlzdHJuY3B5KGNkLT5pbnB1dCwgcywgQ0lMRU4pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChydW5fYWZ0ZXJfYWNjZXB0KSB7Ci0JCQkJcnVuX3VzZXJfY29tbWFuZChhZnRlcmFjY2VwdF9jbWQsIGNsLAotCQkJCSAgICAiYWZ0ZXJhY2NlcHQiLCBOVUxMLCAwLCBOVUxMKTsKLQkJCX0KLQkJfQotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci0KLQlpZiAoaWNvbl9tb2RlX2ZoKSB7Ci0JCXNlbmRfaW5mbysrOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgSUNPTl9NT0RFX1NPQ0tTOyBpKyspIHsKLQkJaWYgKHNlbmRfaW5mbyB8fCBpY29uX21vZGVfc29ja3NbaV0gPj0gMCkgewotCQkJc2VuZF9pbmZvKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoc2VuZF9pbmZvKSB7Ci0JCWNoYXIgKnN0ciwgKnMgPSBsaXN0X2NsaWVudHMoKTsKLQkJc3RyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigiY2xpZW50czoiKSArIHN0cmxlbihzKSArIDEpOwotCQlzcHJpbnRmKHN0ciwgImNsaWVudHM6JXMiLCBzKTsKLQkJc2VuZF9jbGllbnRfaW5mbyhzdHIpOwotCQlmcmVlKHN0cik7Ci0JCWZyZWUocyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS94MTF2bmMvY29ubmVjdGlvbnMuaCBiL3gxMXZuYy9jb25uZWN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRlZmZiLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9jb25uZWN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfQ09OTkVDVElPTlNfSAotI2RlZmluZSBfWDExVk5DX0NPTk5FQ1RJT05TX0gKLQotLyogLS0gY29ubmVjdGlvbnMuaCAtLSAqLwotCi1leHRlcm4gY2hhciB2bmNfY29ubmVjdF9zdHJbXTsKLWV4dGVybiBBdG9tIHZuY19jb25uZWN0X3Byb3A7Ci1leHRlcm4gY2hhciB4MTF2bmNfcmVtb3RlX3N0cltdOwotZXh0ZXJuIEF0b20geDExdm5jX3JlbW90ZV9wcm9wOwotZXh0ZXJuIHJmYkNsaWVudFB0ciBpbmV0ZF9jbGllbnQ7Ci0KLQotZXh0ZXJuIGludCBhbGxfY2xpZW50c19pbml0aWFsaXplZCh2b2lkKTsKLWV4dGVybiBjaGFyICpsaXN0X2NsaWVudHModm9pZCk7Ci1leHRlcm4gaW50IG5ld19mYl9zaXplX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWV4dGVybiB2b2lkIGNsb3NlX2FsbF9jbGllbnRzKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xvc2VfY2xpZW50cyhjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgc2V0X2NsaWVudF9pbnB1dChjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgc2V0X2NoaWxkX2luZm8odm9pZCk7Ci1leHRlcm4gaW50IGNtZF9vayhjaGFyICpjbWQpOwotZXh0ZXJuIHZvaWQgY2xpZW50X2dvbmUocmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1leHRlcm4gdm9pZCBjbGllbnRfZ29uZV9jaGF0X2hlbHBlcihyZmJDbGllbnRQdHIgY2xpZW50KTsKLWV4dGVybiB2b2lkIHJldmVyc2VfY29ubmVjdChjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgc2V0X3ZuY19jb25uZWN0X3Byb3AoY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIHJlYWRfdm5jX2Nvbm5lY3RfcHJvcChpbnQpOwotZXh0ZXJuIHZvaWQgc2V0X3gxMXZuY19yZW1vdGVfcHJvcChjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgcmVhZF94MTF2bmNfcmVtb3RlX3Byb3AoaW50KTsKLWV4dGVybiB2b2lkIGNoZWNrX2Nvbm5lY3RfaW5wdXRzKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfZ3VpX2lucHV0cyh2b2lkKTsKLWV4dGVybiByZmJDbGllbnRQdHIgY3JlYXRlX25ld19jbGllbnQoaW50IHNvY2ssIGludCBzdGFydF90aHJlYWQpOwotZXh0ZXJuIGVudW0gcmZiTmV3Q2xpZW50QWN0aW9uIG5ld19jbGllbnQocmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1leHRlcm4gZW51bSByZmJOZXdDbGllbnRBY3Rpb24gbmV3X2NsaWVudF9jaGF0X2hlbHBlcihyZmJDbGllbnRQdHIgY2xpZW50KTsKLWV4dGVybiByZmJCb29sIHBhc3N3b3JkX2NoZWNrX2NoYXRfaGVscGVyKHJmYkNsaWVudFB0ciBjbCwgY29uc3QgY2hhciogcmVzcG9uc2UsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgc3RhcnRfY2xpZW50X2luZm9fc29jayhjaGFyICpob3N0X3BvcnRfY29va2llKTsKLWV4dGVybiB2b2lkIHNlbmRfY2xpZW50X2luZm8oY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIGFkanVzdF9ncmFicyhpbnQgZ3JhYiwgaW50IHF1aWV0KTsKLWV4dGVybiB2b2lkIGNoZWNrX25ld19jbGllbnRzKHZvaWQpOwotZXh0ZXJuIGludCBhY2NlcHRfY2xpZW50KHJmYkNsaWVudFB0ciBjbGllbnQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfaXB2Nl9saXN0ZW4obG9uZyB1c2VjKTsKLWV4dGVybiB2b2lkIGNoZWNrX3VuaXhfc29jayhsb25nIHVzZWMpOwotZXh0ZXJuIGludCBydW5fdXNlcl9jb21tYW5kKGNoYXIgKmNtZCwgcmZiQ2xpZW50UHRyIGNsaWVudCwgY2hhciAqbW9kZSwgY2hhciAqaW5wdXQsCi0gICAgaW50IGxlbiwgRklMRSAqb3V0cHV0KTsKLWV4dGVybiBpbnQgY2hlY2tfYWNjZXNzKGNoYXIgKmFkZHIpOwotZXh0ZXJuIHZvaWQgY2xpZW50X3NldF9uZXQocmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1leHRlcm4gY2hhciAqZ2V0X3hwcm9wKGNoYXIgKnByb3AsIFdpbmRvdyB3aW4pOwotZXh0ZXJuIGludCBzZXRfeHByb3AoY2hhciAqcHJvcCwgV2luZG93IHdpbiwgY2hhciAqdmFsdWUpOwotZXh0ZXJuIGNoYXIgKmJjeF94YXR0YWNoKGNoYXIgKnN0ciwgaW50ICpwZ19pbml0LCBpbnQgKmtnX2luaXQpOwotZXh0ZXJuIHZvaWQgZ3JhYl9zdGF0ZShpbnQgKnB0cl9ncmFiYmVkLCBpbnQgKmtiZF9ncmFiYmVkKTsKLWV4dGVybiBjaGFyICp3aW5pbmZvKFdpbmRvdyB3aW4sIGludCBzaG93X2NoaWxkcmVuKTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfQ09OTkVDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2N1cnNvci5jIGIveDExdm5jL2N1cnNvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDYxM2E2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9jdXJzb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMjUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBjdXJzb3IuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJ1bml4cHcuaCIKLSNpbmNsdWRlICJtYWNvc3guaCIKLQotaW50IHhmaXhlc19wcmVzZW50ID0gMDsKLWludCB4Zml4ZXNfZmlyc3RfaW5pdGlhbGl6ZWQgPSAwOwotaW50IHVzZV94Zml4ZXMgPSAxOwotaW50IGdvdF94Zml4ZXNfY3Vyc29yX25vdGlmeSA9IDA7Ci1pbnQgY3Vyc29yX2NoYW5nZXMgPSAwOwotaW50IGFscGhhX3RocmVzaG9sZCA9IDI0MDsKLWRvdWJsZSBhbHBoYV9mcmFjID0gMC4zMzsKLWludCBhbHBoYV9yZW1vdmUgPSAwOwotaW50IGFscGhhX2JsZW5kID0gMTsKLWludCBhbHRfYXJyb3cgPSAxOwotCi0KLXZvaWQgZmlyc3RfY3Vyc29yKHZvaWQpOwotdm9pZCBzZXR1cF9jdXJzb3JzX2FuZF9wdXNoKHZvaWQpOwotdm9pZCBpbml0aWFsaXplX3hmaXhlcyh2b2lkKTsKLWludCBrbm93bl9jdXJzb3JzX21vZGUoY2hhciAqcyk7Ci12b2lkIGluaXRpYWxpemVfY3Vyc29yc19tb2RlKHZvaWQpOwotaW50IGdldF93aGljaF9jdXJzb3Iodm9pZCk7Ci12b2lkIHJlc3RvcmVfY3Vyc29yX3NoYXBlX3VwZGF0ZXMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLXZvaWQgZGlzYWJsZV9jdXJzb3Jfc2hhcGVfdXBkYXRlcyhyZmJTY3JlZW5JbmZvUHRyIHMpOwotaW50IGN1cnNvcl9zaGFwZV91cGRhdGVzX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWludCBjdXJzb3JfcG9zX3VwZGF0ZXNfY2xpZW50cyhyZmJTY3JlZW5JbmZvUHRyIHMpOwotdm9pZCBjdXJzb3JfcG9zaXRpb24oaW50IHgsIGludCB5KTsKLXZvaWQgc2V0X25vX2N1cnNvcih2b2lkKTsKLXZvaWQgc2V0X3dhcnJvd19jdXJzb3Iodm9pZCk7Ci1pbnQgc2V0X2N1cnNvcihpbnQgeCwgaW50IHksIGludCB3aGljaCk7Ci1pbnQgY2hlY2tfeDExX3BvaW50ZXIodm9pZCk7Ci1pbnQgc3RvcmVfY3Vyc29yKGludCBzZXJpYWwsIHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCB3LCBpbnQgaCwgaW50IGNicHAsIGludCB4aG90LCBpbnQgeWhvdCk7Ci11bnNpZ25lZCBsb25nIGdldF9jdXJzb3Jfc2VyaWFsKGludCBtb2RlKTsKLQotCi10eXBlZGVmIHN0cnVjdCB3aW5fc3RyX2luZm8gewotCWNoYXIgKndtX25hbWU7Ci0JY2hhciAqcmVzX25hbWU7Ci0JY2hhciAqcmVzX2NsYXNzOwotfSB3aW5fc3RyX2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgY3Vyc29yX2luZm8gewotCWNoYXIgKmRhdGE7CS8qIGRhdGEgYW5kIG1hc2sgcG9pbnRlcnMgKi8KLQljaGFyICptYXNrOwotCWludCB3eCwgd3k7CS8qIHNpemUgb2YgY3Vyc29yICovCi0JaW50IHN4LCBzeTsJLyogc2hpZnQgdG8gaXRzIGNlbnRlcmluZyBwb2ludCAqLwotCWludCByZXZlcnNlOwkvKiBzd2FwIGJsYWNrIGFuZCB3aGl0ZSAqLwotCXJmYkN1cnNvclB0ciByZmI7Ci19IGN1cnNvcl9pbmZvX3Q7Ci0KLQotc3RhdGljIHZvaWQgY3Vyc19jb3B5KGN1cnNvcl9pbmZvX3QgKmRlc3QsIGN1cnNvcl9pbmZvX3QgKnNyYyk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9jdXJzb3JzKHZvaWQpOwotc3RhdGljIHZvaWQgc2V0X3JmYl9jdXJzb3IoaW50IHdoaWNoKTsKLXN0YXRpYyB2b2lkIHRyZWVfZGVzY2VuZF9jdXJzb3IoaW50ICpkZXB0aCwgV2luZG93ICp3LCB3aW5fc3RyX2luZm9fdCAqd2luZm8pOwotc3RhdGljIHJmYkN1cnNvclB0ciBwaXhlbHMyY3Vycyh1bnNpZ25lZCBsb25nICpwaXhlbHMsIGludCB3LCBpbnQgaCwKLSAgICBpbnQgeGhvdCwgaW50IHlob3QsIGludCBCcHApOwotc3RhdGljIGludCBnZXRfZXhhY3RfY3Vyc29yKGludCBpbml0KTsKLXN0YXRpYyB2b2lkIHNldF9jdXJzb3Jfd2FzX2NoYW5nZWQocmZiU2NyZWVuSW5mb1B0ciBzKTsKLQotCi0vKgotICogSGVyZSBiZWdpbnMgYSBiaXQgb2YgYSBtZXNzIHRvIGV4cGVyaW1lbnQgd2l0aCBtdWx0aXBsZSBjdXJzb3JzIAotICogZHJhd24gb24gdGhlIHJlbW90ZSBiYWNrZ3JvdW5kIC4uLgotICovCi1zdGF0aWMgdm9pZCBjdXJzX2NvcHkoY3Vyc29yX2luZm9fdCAqZGVzdCwgY3Vyc29yX2luZm9fdCAqc3JjKSB7Ci0JaWYgKHNyYy0+ZGF0YSAhPSBOVUxMKSB7Ci0JCWRlc3QtPmRhdGEgPSBzdHJkdXAoc3JjLT5kYXRhKTsKLQl9IGVsc2UgewotCQlkZXN0LT5kYXRhID0gTlVMTDsKLQl9Ci0JaWYgKHNyYy0+bWFzayAhPSBOVUxMKSB7Ci0JCWRlc3QtPm1hc2sgPSBzdHJkdXAoc3JjLT5tYXNrKTsKLQl9IGVsc2UgewotCQlkZXN0LT5tYXNrID0gTlVMTDsKLQl9Ci0JZGVzdC0+d3ggPSBzcmMtPnd4OwotCWRlc3QtPnd5ID0gc3JjLT53eTsKLQlkZXN0LT5zeCA9IHNyYy0+c3g7Ci0JZGVzdC0+c3kgPSBzcmMtPnN5OwotCWRlc3QtPnJldmVyc2UgPSBzcmMtPnJldmVyc2U7Ci0JZGVzdC0+cmZiID0gc3JjLT5yZmI7Ci0KLQlpZiAocm90YXRpbmcgJiYgcm90YXRpbmdfY3Vyc29ycyAmJiBkZXN0LT5kYXRhICE9IE5VTEwpIHsKLQkJaW50IHR4LCB0eTsKLQkJcm90YXRlX2N1cnMoZGVzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPnd4LCBzcmMtPnd5LCAxKTsKLQkJcm90YXRlX2N1cnMoZGVzdC0+bWFzaywgc3JjLT5tYXNrLCBzcmMtPnd4LCBzcmMtPnd5LCAxKTsKLQkJcm90YXRlX2Nvb3JkcyhkZXN0LT5zeCwgZGVzdC0+c3ksICZ0eCwgJnR5LCBzcmMtPnd4LCBzcmMtPnd5KTsKLQkJZGVzdC0+c3ggPSB0eDsKLQkJZGVzdC0+c3kgPSB0eTsKLQkJaWYgKCEgcm90YXRpbmdfc2FtZSkgewotCQkJZGVzdC0+d3ggPSBzcmMtPnd5OwotCQkJZGVzdC0+d3kgPSBzcmMtPnd4OwotCQl9Ci0JfQotfQotCi0vKiBlbXB0eSBjdXJzb3IgKi8KLXN0YXRpYyBjaGFyKiBjdXJzX2VtcHR5X2RhdGEgPQotIiAgIgotIiAgIjsKLQotc3RhdGljIGNoYXIqIGN1cnNfZW1wdHlfbWFzayA9Ci0iICAiCi0iICAiOwotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX2VtcHR5ID0ge05VTEwsIE5VTEwsIDIsIDIsIDAsIDAsIDAsIE5VTEx9OwotCi0vKiBkb3QgY3Vyc29yICovCi1zdGF0aWMgY2hhciogY3Vyc19kb3RfZGF0YSA9Ci0iICAiCi0iIHgiOwotCi1zdGF0aWMgY2hhciogY3Vyc19kb3RfbWFzayA9Ci0iICAiCi0iIHgiOwotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX2RvdCA9IHtOVUxMLCBOVUxMLCAyLCAyLCAwLCAwLCAwLCBOVUxMfTsKLQotCi0vKiBtYWluIGN1cnNvciAqLwotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3dfZGF0YSA9Ci0iICAgICAgICAgICAgICAgICAgIgotIiB4ICAgICAgICAgICAgICAgICIKLSIgeHggICAgICAgICAgICAgICAiCi0iIHh4eCAgICAgICAgICAgICAgIgotIiB4eHh4ICAgICAgICAgICAgICIKLSIgeHh4eHggICAgICAgICAgICAiCi0iIHh4eHh4eCAgICAgICAgICAgIgotIiB4eHh4eHh4ICAgICAgICAgICIKLSIgeHh4eHh4eHggICAgICAgICAiCi0iIHh4eHh4ICAgICAgICAgICAgIgotIiB4eCB4eCAgICAgICAgICAgICIKLSIgeCAgIHh4ICAgICAgICAgICAiCi0iICAgICB4eCAgICAgICAgICAgIgotIiAgICAgIHh4ICAgICAgICAgICIKLSIgICAgICB4eCAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgIgotIiAgICAgICAgICAgICAgICAgICIKLSIgICAgICAgICAgICAgICAgICAiOwotCi1zdGF0aWMgY2hhciogY3Vyc19hcnJvd19tYXNrID0KLSJ4eCAgICAgICAgICAgICAgICAiCi0ieHh4ICAgICAgICAgICAgICAgIgotInh4eHggICAgICAgICAgICAgICIKLSJ4eHh4eCAgICAgICAgICAgICAiCi0ieHh4eHh4ICAgICAgICAgICAgIgotInh4eHh4eHggICAgICAgICAgICIKLSJ4eHh4eHh4eCAgICAgICAgICAiCi0ieHh4eHh4eHh4ICAgICAgICAgIgotInh4eHh4eHh4eHggICAgICAgICIKLSJ4eHh4eHh4eHh4ICAgICAgICAiCi0ieHh4eHh4eCAgICAgICAgICAgIgotInh4eCB4eHh4ICAgICAgICAgICIKLSJ4eCAgeHh4eCAgICAgICAgICAiCi0iICAgICB4eHh4ICAgICAgICAgIgotIiAgICAgeHh4eCAgICAgICAgICIKLSIgICAgICB4eCAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgIgotIiAgICAgICAgICAgICAgICAgICI7Ci1zdGF0aWMgY3Vyc29yX2luZm9fdCBjdXJfYXJyb3cgPSB7TlVMTCwgTlVMTCwgMTgsIDE4LCAwLCAwLCAxLCBOVUxMfTsKLQotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3cyX2RhdGEgPQotIiAgICAgICAgICAgICAgICAgICIKLSIgeCAgICAgICAgICAgICAgICAiCi0iIHh4ICAgICAgICAgICAgICAgIgotIiB4eHggICAgICAgICAgICAgICIKLSIgeHh4eCAgICAgICAgICAgICAiCi0iIHh4eHh4ICAgICAgICAgICAgIgotIiB4eHh4eHggICAgICAgICAgICIKLSIgeHh4eHh4eCAgICAgICAgICAiCi0iIHh4eHh4eHh4ICAgICAgICAgIgotIiB4eHh4eCAgICAgICAgICAgICIKLSIgeHggeHggICAgICAgICAgICAiCi0iIHggICB4eCAgICAgICAgICAgIgotIiAgICAgeHggICAgICAgICAgICIKLSIgICAgICB4eCAgICAgICAgICAiCi0iICAgICAgeHggICAgICAgICAgIgotIiAgICAgICAgICAgICAgICAgICIKLSIgICAgICAgICAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgIjsKLQotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3cyX21hc2sgPQotInh4ICAgICAgICAgICAgICAgICIKLSJ4eHggICAgICAgICAgICAgICAiCi0ieHh4eCAgICAgICAgICAgICAgIgotInh4eHh4ICAgICAgICAgICAgICIKLSJ4eHh4eHggICAgICAgICAgICAiCi0ieHh4eHh4eCAgICAgICAgICAgIgotInh4eHh4eHh4ICAgICAgICAgICIKLSJ4eHh4eHh4eHggICAgICAgICAiCi0ieHh4eHh4eHh4eCAgICAgICAgIgotInh4eHh4eHh4eHggICAgICAgICIKLSJ4eHh4eHh4ICAgICAgICAgICAiCi0ieHh4IHh4eHggICAgICAgICAgIgotInh4ICB4eHh4ICAgICAgICAgICIKLSIgICAgIHh4eHggICAgICAgICAiCi0iICAgICB4eHh4ICAgICAgICAgIgotIiAgICAgIHh4ICAgICAgICAgICIKLSIgICAgICAgICAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgIjsKLXN0YXRpYyBjdXJzb3JfaW5mb190IGN1cl9hcnJvdzIgPSB7TlVMTCwgTlVMTCwgMTgsIDE4LCAwLCAwLCAwLCBOVUxMfTsKLQotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3czX2RhdGEgPSAKLSIgICAgICAgICAgICAgICAgIgotIiB4eCAgICAgICAgICAgICAiCi0iIHh4eHggICAgICAgICAgICIKLSIgIHh4eHh4ICAgICAgICAgIgotIiAgeHh4eHh4eCAgICAgICAiCi0iICAgeHh4eHh4eHggICAgICIKLSIgICB4eHh4eHh4eHh4ICAgIgotIiAgICB4eHh4eCAgICAgICAiCi0iICAgIHh4eHh4ICAgICAgICIKLSIgICAgIHh4ICB4ICAgICAgIgotIiAgICAgeHggICB4ICAgICAiCi0iICAgICAgeCAgICB4ICAgICIKLSIgICAgICB4ICAgICB4ICAgIgotIiAgICAgICAgICAgICB4ICAiCi0iICAgICAgICAgICAgICB4ICIKLSIgICAgICAgICAgICAgICAgIjsKLQotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3czX21hc2sgPSAKLSJ4eHggICAgICAgICAgICAgIgotInh4eHh4ICAgICAgICAgICAiCi0ieHh4eHh4eCAgICAgICAgICIKLSIgeHh4eHh4eHggICAgICAgIgotIiB4eHh4eHh4eHh4ICAgICAiCi0iICB4eHh4eHh4eHh4eHggICIKLSIgIHh4eHh4eHh4eHh4eCAgIgotIiAgIHh4eHh4eHh4eHh4ICAiCi0iICAgeHh4eHh4eCAgICAgICIKLSIgICAgeHh4eHh4eCAgICAgIgotIiAgICB4eHh4IHh4eCAgICAiCi0iICAgICB4eHggIHh4eCAgICIKLSIgICAgIHh4eCAgIHh4eCAgIgotIiAgICAgeHh4ICAgIHh4eCAiCi0iICAgICAgICAgICAgIHh4eCIKLSIgICAgICAgICAgICAgIHh4IjsKLQotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX2Fycm93MyA9IHtOVUxMLCBOVUxMLCAxNiwgMTYsIDAsIDAsIDEsIE5VTEx9OwotCi1zdGF0aWMgY2hhciogY3Vyc19hcnJvdzRfZGF0YSA9IAotIiAgICAgICAgICAgICAgICAiCi0iIHh4ICAgICAgICAgICAgICIKLSIgeHh4eCAgICAgICAgICAgIgotIiAgeHh4eHggICAgICAgICAiCi0iICB4eHh4eHh4ICAgICAgICIKLSIgICB4eHh4eHh4eCAgICAgIgotIiAgIHh4eHh4eHh4eHggICAiCi0iICAgIHh4eHh4ICAgICAgICIKLSIgICAgeHh4eHggICAgICAgIgotIiAgICAgeHggIHggICAgICAiCi0iICAgICB4eCAgIHggICAgICIKLSIgICAgICB4ICAgIHggICAgIgotIiAgICAgIHggICAgIHggICAiCi0iICAgICAgICAgICAgIHggICIKLSIgICAgICAgICAgICAgIHggIgotIiAgICAgICAgICAgICAgICAiOwotCi1zdGF0aWMgY2hhciogY3Vyc19hcnJvdzRfbWFzayA9IAotInh4eCAgICAgICAgICAgICAiCi0ieHh4eHggICAgICAgICAgICIKLSJ4eHh4eHh4ICAgICAgICAgIgotIiB4eHh4eHh4eCAgICAgICAiCi0iIHh4eHh4eHh4eHggICAgICIKLSIgIHh4eHh4eHh4eHh4eCAgIgotIiAgeHh4eHh4eHh4eHh4ICAiCi0iICAgeHh4eHh4eHh4eHggICIKLSIgICB4eHh4eHh4ICAgICAgIgotIiAgICB4eHh4eHh4ICAgICAiCi0iICAgIHh4eHggeHh4ICAgICIKLSIgICAgIHh4eCAgeHh4ICAgIgotIiAgICAgeHh4ICAgeHh4ICAiCi0iICAgICB4eHggICAgeHh4ICIKLSIgICAgICAgICAgICAgeHh4IgotIiAgICAgICAgICAgICAgeHgiOwotCi1zdGF0aWMgY3Vyc29yX2luZm9fdCBjdXJfYXJyb3c0ID0ge05VTEwsIE5VTEwsIDE2LCAxNiwgMCwgMCwgMCwgTlVMTH07Ci0KLXN0YXRpYyBjaGFyKiBjdXJzX2Fycm93NV9kYXRhID0gCi0ieCAgICAgICAgICAgICAgIgotIiB4eCAgICAgICAgICAgICIKLSIgeHh4eCAgICAgICAgICAiCi0iICB4eHh4eCAgICAgICAgIgotIiAgeHh4eHh4eCAgICAgICIKLSIgICB4eHggICAgICAgICAiCi0iICAgeHggeCAgICAgICAgIgotIiAgICB4ICB4ICAgICAgICIKLSIgICAgeCAgIHggICAgICAiCi0iICAgICAgICAgeCAgICAgIgotIiAgICAgICAgICB4ICAgICIKLSIgICAgICAgICAgIHggICAiCi0iICAgICAgICAgICAgeCAgIgotIiAgICAgICAgICAgICB4ICIKLSIgICAgICAgICAgICAgIHgiOwotCi1zdGF0aWMgY2hhciogY3Vyc19hcnJvdzVfbWFzayA9IAotInh4ICAgICAgICAgICAgICIKLSJ4eHh4ICAgICAgICAgICAiCi0iIHh4eHh4ICAgICAgICAgIgotIiB4eHh4eHh4ICAgICAgICIKLSIgIHh4eHh4eHh4ICAgICAiCi0iICB4eHh4eHh4eCAgICAgIgotIiAgIHh4eHh4ICAgICAgICIKLSIgICB4eHh4eHggICAgICAiCi0iICAgIHh4IHh4eCAgICAgIgotIiAgICAgeCAgeHh4ICAgICIKLSIgICAgICAgICB4eHggICAiCi0iICAgICAgICAgIHh4eCAgIgotIiAgICAgICAgICAgeHh4ICIKLSIgICAgICAgICAgICB4eHgiCi0iICAgICAgICAgICAgIHh4IjsKLQotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX2Fycm93NSA9IHtOVUxMLCBOVUxMLCAxNSwgMTUsIDAsIDAsIDEsIE5VTEx9OwotCi1zdGF0aWMgY2hhciogY3Vyc19hcnJvdzZfZGF0YSA9IAotInggICAgICAgICAgICAgICIKLSIgeHggICAgICAgICAgICAiCi0iIHh4eHggICAgICAgICAgIgotIiAgeHh4eHggICAgICAgICIKLSIgIHh4eHh4eHggICAgICAiCi0iICAgeHh4ICAgICAgICAgIgotIiAgIHh4IHggICAgICAgICIKLSIgICAgeCAgeCAgICAgICAiCi0iICAgIHggICB4ICAgICAgIgotIiAgICAgICAgIHggICAgICIKLSIgICAgICAgICAgeCAgICAiCi0iICAgICAgICAgICB4ICAgIgotIiAgICAgICAgICAgIHggICIKLSIgICAgICAgICAgICAgeCAiCi0iICAgICAgICAgICAgICB4IjsKLQotc3RhdGljIGNoYXIqIGN1cnNfYXJyb3c2X21hc2sgPSAKLSJ4eCAgICAgICAgICAgICAiCi0ieHh4eCAgICAgICAgICAgIgotIiB4eHh4eCAgICAgICAgICIKLSIgeHh4eHh4eCAgICAgICAiCi0iICB4eHh4eHh4eCAgICAgIgotIiAgeHh4eHh4eHggICAgICIKLSIgICB4eHh4eCAgICAgICAiCi0iICAgeHh4eHh4ICAgICAgIgotIiAgICB4eCB4eHggICAgICIKLSIgICAgIHggIHh4eCAgICAiCi0iICAgICAgICAgeHh4ICAgIgotIiAgICAgICAgICB4eHggICIKLSIgICAgICAgICAgIHh4eCAiCi0iICAgICAgICAgICAgeHh4IgotIiAgICAgICAgICAgICB4eCI7Ci0KLXN0YXRpYyBjdXJzb3JfaW5mb190IGN1cl9hcnJvdzYgPSB7TlVMTCwgTlVMTCwgMTUsIDE1LCAwLCAwLCAwLCBOVUxMfTsKLQotaW50IGFsdF9hcnJvd19tYXggPSA2OwotLyoKLSAqIEl0IHR1cm5zIG91dCB3ZSBjYW4gYXQgbGVhc3QgZGV0ZWN0IG1vdXNlIGlzIG9uIHRoZSByb290IHdpbmRvdyBzbyAKLSAqIHNob3cgaXQgKHVuZGVyIC1jdXJzb3IgWCkgd2l0aCB0aGlzIGZhbWlsaWFyIGN1cnNvci4uLiAKLSAqLwotc3RhdGljIGNoYXIqIGN1cnNfcm9vdF9kYXRhID0KLSIgICAgICAgICAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgIgotIiAgeHh4ICAgICAgICB4eHggICIKLSIgIHh4eHggICAgICB4eHh4ICAiCi0iICB4eHh4eCAgICB4eHh4eCAgIgotIiAgIHh4eHh4ICB4eHh4eCAgICIKLSIgICAgeHh4eHh4eHh4eCAgICAiCi0iICAgICB4eHh4eHh4eCAgICAgIgotIiAgICAgIHh4eHh4eCAgICAgICIKLSIgICAgICB4eHh4eHggICAgICAiCi0iICAgICB4eHh4eHh4eCAgICAgIgotIiAgICB4eHh4eHh4eHh4ICAgICIKLSIgICB4eHh4eCAgeHh4eHggICAiCi0iICB4eHh4eCAgICB4eHh4eCAgIgotIiAgeHh4eCAgICAgIHh4eHggICIKLSIgIHh4eCAgICAgICAgeHh4ICAiCi0iICAgICAgICAgICAgICAgICAgIgotIiAgICAgICAgICAgICAgICAgICI7Ci0KLXN0YXRpYyBjaGFyKiBjdXJzX3Jvb3RfbWFzayA9Ci0iICAgICAgICAgICAgICAgICAgIgotIiB4eHh4ICAgICAgICB4eHh4ICIKLSIgeHh4eHggICAgICB4eHh4eCAiCi0iIHh4eHh4eCAgICB4eHh4eHggIgotIiB4eHh4eHh4ICB4eHh4eHh4ICIKLSIgIHh4eHh4eHh4eHh4eHh4ICAiCi0iICAgeHh4eHh4eHh4eHh4ICAgIgotIiAgICB4eHh4eHh4eHh4ICAgICIKLSIgICAgIHh4eHh4eHh4ICAgICAiCi0iICAgICB4eHh4eHh4eCAgICAgIgotIiAgICB4eHh4eHh4eHh4ICAgICIKLSIgICB4eHh4eHh4eHh4eHggICAiCi0iICB4eHh4eHh4eHh4eHh4eCAgIgotIiB4eHh4eHh4ICB4eHh4eHh4ICIKLSIgeHh4eHh4ICAgIHh4eHh4eCAiCi0iIHh4eHh4ICAgICAgeHh4eHggIgotIiB4eHh4ICAgICAgICB4eHh4ICIKLSIgICAgICAgICAgICAgICAgICAiOwotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX3Jvb3QgPSB7TlVMTCwgTlVMTCwgMTgsIDE4LCA4LCA4LCAxLCBOVUxMfTsKLQotc3RhdGljIGNoYXIqIGN1cnNfZmxldXJfZGF0YSA9IAotIiAgICAgICAgICAgICAgICAiCi0iICAgICAgIHh4ICAgICAgICIKLSIgICAgICB4eHh4ICAgICAgIgotIiAgICAgeHh4eHh4ICAgICAiCi0iICAgICAgIHh4ICAgICAgICIKLSIgICB4ICAgeHggICB4ICAgIgotIiAgeHggICB4eCAgIHh4ICAiCi0iIHh4eHh4eHh4eHh4eHh4ICIKLSIgeHh4eHh4eHh4eHh4eHggIgotIiAgeHggICB4eCAgIHh4ICAiCi0iICAgeCAgIHh4ICAgeCAgICIKLSIgICAgICAgeHggICAgICAgIgotIiAgICAgeHh4eHh4ICAgICAiCi0iICAgICAgeHh4eCAgICAgICIKLSIgICAgICAgeHggICAgICAgIgotIiAgICAgICAgICAgICAgICAiOwotCi1zdGF0aWMgY2hhciogY3Vyc19mbGV1cl9tYXNrID0gCi0iICAgICAgeHh4eCAgICAgICIKLSIgICAgICB4eHh4eCAgICAgIgotIiAgICAgeHh4eHh4ICAgICAiCi0iICAgIHh4eHh4eHh4ICAgICIKLSIgICB4IHh4eHh4eCB4ICAgIgotIiAgeHh4IHh4eHggeHh4ICAiCi0ieHh4eHh4eHh4eHh4eHh4eCIKLSJ4eHh4eHh4eHh4eHh4eHh4IgotInh4eHh4eHh4eHh4eHh4eHgiCi0ieHh4eHh4eHh4eHh4eHh4eCIKLSIgIHh4eCB4eHh4IHh4eCAgIgotIiAgIHggeHh4eHh4IHggICAiCi0iICAgIHh4eHh4eHh4ICAgICIKLSIgICAgIHh4eHh4eCAgICAgIgotIiAgICAgIHh4eHggICAgICAiCi0iICAgICAgeHh4eCAgICAgICI7Ci0KLXN0YXRpYyBjdXJzb3JfaW5mb190IGN1cl9mbGV1ciA9IHtOVUxMLCBOVUxMLCAxNiwgMTYsIDgsIDgsIDEsIE5VTEx9OwotCi1zdGF0aWMgY2hhciogY3Vyc19wbHVzX2RhdGEgPSAKLSIgICAgICAgICAgICAiCi0iICAgICB4eCAgICAgIgotIiAgICAgeHggICAgICIKLSIgICAgIHh4ICAgICAiCi0iICAgICB4eCAgICAgIgotIiB4eHh4eHh4eHh4ICIKLSIgeHh4eHh4eHh4eCAiCi0iICAgICB4eCAgICAgIgotIiAgICAgeHggICAgICIKLSIgICAgIHh4ICAgICAiCi0iICAgICB4eCAgICAgIgotIiAgICAgICAgICAgICI7Ci0KLXN0YXRpYyBjaGFyKiBjdXJzX3BsdXNfbWFzayA9IAotIiAgICB4eHh4ICAgICIKLSIgICAgeHh4eCAgICAiCi0iICAgIHh4eHggICAgIgotIiAgICB4eHh4ICAgICIKLSJ4eHh4eHh4eHh4eHgiCi0ieHh4eHh4eHh4eHh4IgotInh4eHh4eHh4eHh4eCIKLSJ4eHh4eHh4eHh4eHgiCi0iICAgIHh4eHggICAgIgotIiAgICB4eHh4ICAgICIKLSIgICAgeHh4eCAgICAiCi0iICAgIHh4eHggICAgIjsKLXN0YXRpYyBjdXJzb3JfaW5mb190IGN1cl9wbHVzID0ge05VTEwsIE5VTEwsIDEyLCAxMiwgNSwgNiwgMSwgTlVMTH07Ci0KLXN0YXRpYyBjaGFyKiBjdXJzX3h0ZXJtX2RhdGEgPSAKLSIgICAgICAgICAgICAgICAgIgotIiAgICAgeHh4IHh4eCAgICAiCi0iICAgICAgIHh4eCAgICAgICIKLSIgICAgICAgIHggICAgICAgIgotIiAgICAgICAgeCAgICAgICAiCi0iICAgICAgICB4ICAgICAgICIKLSIgICAgICAgIHggICAgICAgIgotIiAgICAgICAgeCAgICAgICAiCi0iICAgICAgICB4ICAgICAgICIKLSIgICAgICAgIHggICAgICAgIgotIiAgICAgICAgeCAgICAgICAiCi0iICAgICAgICB4ICAgICAgICIKLSIgICAgICAgIHggICAgICAgIgotIiAgICAgICB4eHggICAgICAiCi0iICAgICB4eHggeHh4ICAgICIKLSIgICAgICAgICAgICAgICAgIjsKLQotc3RhdGljIGNoYXIqIGN1cnNfeHRlcm1fbWFzayA9IAotIiAgICB4eHh4IHh4eHggICAiCi0iICAgIHh4eHh4eHh4eCAgICIKLSIgICAgeHh4eHh4eHh4ICAgIgotIiAgICAgIHh4eHh4ICAgICAiCi0iICAgICAgIHh4eCAgICAgICIKLSIgICAgICAgeHh4ICAgICAgIgotIiAgICAgICB4eHggICAgICAiCi0iICAgICAgIHh4eCAgICAgICIKLSIgICAgICAgeHh4ICAgICAgIgotIiAgICAgICB4eHggICAgICAiCi0iICAgICAgIHh4eCAgICAgICIKLSIgICAgICAgeHh4ICAgICAgIgotIiAgICAgIHh4eHh4ICAgICAiCi0iICAgIHh4eHh4eHh4eCAgICIKLSIgICAgeHh4eHh4eHh4ICAgIgotIiAgICB4eHh4IHh4eHggICAiOwotc3RhdGljIGN1cnNvcl9pbmZvX3QgY3VyX3h0ZXJtID0ge05VTEwsIE5VTEwsIDE2LCAxNiwgOCwgOCwgMSwgTlVMTH07Ci0KLWVudW0gY3Vyc29yX25hbWVzIHsKLQlDVVJTX0VNUFRZID0gMCwKLQlDVVJTX0RPVCwKLQotCUNVUlNfQVJST1csCi0JQ1VSU19XQVJST1csCi0JQ1VSU19ST09ULAotCUNVUlNfV00sCi0JQ1VSU19URVJNLAotCUNVUlNfUExVUywKLQotCUNVUlNfRFlOMSwKLQlDVVJTX0RZTjIsCi0JQ1VSU19EWU4zLAotCUNVUlNfRFlONCwKLQlDVVJTX0RZTjUsCi0JQ1VSU19EWU42LAotCUNVUlNfRFlONywKLQlDVVJTX0RZTjgsCi0JQ1VSU19EWU45LAotCUNVUlNfRFlOMTAsCi0JQ1VSU19EWU4xMSwKLQlDVVJTX0RZTjEyLAotCUNVUlNfRFlOMTMsCi0JQ1VSU19EWU4xNCwKLQlDVVJTX0RZTjE1LAotCUNVUlNfRFlOMTYKLX07Ci0KLSNkZWZpbmUgQ1VSU19EWU5fTUlOIENVUlNfRFlOMQotI2RlZmluZSBDVVJTX0RZTl9NQVggQ1VSU19EWU4xNgotI2RlZmluZSBDVVJTX0RZTl9OVU0gKENVUlNfRFlOX01BWCAtIENVUlNfRFlOX01JTiArIDEpCi0KLSNkZWZpbmUgQ1VSU19NQVggMzIKLXN0YXRpYyBjdXJzb3JfaW5mb190ICpjdXJzb3JzW0NVUlNfTUFYXTsKLQotdm9pZCBmaXJzdF9jdXJzb3Iodm9pZCkgewotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCWlmICghIHNob3dfY3Vyc29yKSB7Ci0JCUxPQ0soc2NyZWVuLT5jdXJzb3JNdXRleCk7Ci0JCXNjcmVlbi0+Y3Vyc29yID0gTlVMTDsKLQkJVU5MT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCX0gZWxzZSB7Ci0JCWdvdF94Zml4ZXNfY3Vyc29yX25vdGlmeSsrOwotCQlzZXRfcmZiX2N1cnNvcihnZXRfd2hpY2hfY3Vyc29yKCkpOwotCQlzZXRfY3Vyc29yX3dhc19jaGFuZ2VkKHNjcmVlbik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9jdXJzb3JzKHZvaWQpIHsKLQlyZmJDdXJzb3JQdHIgcmZiX2N1cnM7Ci0JY2hhciAqc2NhbGUgPSBOVUxMOwotCWludCBpLCBqLCBuID0gMDsKLQlpbnQgd19pbiA9IDAsIGhfaW4gPSAwOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCi0JaWYgKHZlcmJvc2UgfHwgdXNlX3RocmVhZHMpIHsKLQkJcmZiTG9nKCJzZXR0aW5nIHVwICVkIGN1cnNvcnMuLi5cbiIsIENVUlNfTUFYKTsKLQl9Ci0KLQlpZiAoZmlyc3QpIHsKLQkJZm9yIChpPTA7IGk8Q1VSU19NQVg7IGkrKykgewotCQkJY3Vyc29yc1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0JZmlyc3QgPSAwOwotCi0JaWYgKHNjcmVlbikgewotCQlMT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCQlzY3JlZW4tPmN1cnNvciA9IE5VTEw7Ci0JfQotCi0JZm9yIChpPTA7IGk8Q1VSU19NQVg7IGkrKykgewotCQljdXJzb3JfaW5mb190ICpjaTsKLQkJaWYgKGN1cnNvcnNbaV0pIHsKLQkJCS8qIGNsZWFyIG91dCBhbnkgZXhpc3Rpbmcgb25lczogKi8KLQkJCWNpID0gY3Vyc29yc1tpXTsKLQkJCWlmIChjaS0+cmZiKSB7Ci0JCQkJLyogdGhpcyBpcyB0aGUgcmZiQ3Vyc29yIHBhcnQ6ICovCi0JCQkJaWYgKGNpLT5yZmItPnJpY2hTb3VyY2UpIHsKLQkJCQkJZnJlZShjaS0+cmZiLT5yaWNoU291cmNlKTsKLQkJCQkJY2ktPnJmYi0+cmljaFNvdXJjZSA9IE5VTEw7Ci0JCQkJfQotCQkJCWlmIChjaS0+cmZiLT5zb3VyY2UpIHsKLQkJCQkJZnJlZShjaS0+cmZiLT5zb3VyY2UpOwotCQkJCQljaS0+cmZiLT5zb3VyY2UgPSBOVUxMOwotCQkJCX0KLQkJCQlpZiAoY2ktPnJmYi0+bWFzaykgewotCQkJCQlmcmVlKGNpLT5yZmItPm1hc2spOwotCQkJCQljaS0+cmZiLT5tYXNrID0gTlVMTDsKLQkJCQl9Ci0JCQkJZnJlZShjaS0+cmZiKTsKLQkJCQljaS0+cmZiID0gTlVMTDsKLQkJCX0KLQkJCWlmIChjaS0+ZGF0YSkgewotCQkJCWZyZWUoY2ktPmRhdGEpOwotCQkJCWNpLT5kYXRhID0gTlVMTDsKLQkJCX0KLQkJCWlmIChjaS0+bWFzaykgewotCQkJCWZyZWUoY2ktPm1hc2spOwotCQkJCWNpLT5tYXNrID0gTlVMTDsKLQkJCX0KLQkJCWZyZWUoY2kpOwotCQkJY2kgPSBOVUxMOwotCQl9Ci0KLQkJLyogY3JlYXRlIG5ldyBzdHJ1Y3Q6ICovCi0JCWNpID0gKGN1cnNvcl9pbmZvX3QgKikgbWFsbG9jKHNpemVvZihjdXJzb3JfaW5mb190KSk7Ci0JCWNpLT5kYXRhID0gTlVMTDsgCi0JCWNpLT5tYXNrID0gTlVMTDsgCi0JCWNpLT53eCA9IDA7Ci0JCWNpLT53eSA9IDA7Ci0JCWNpLT5zeCA9IDA7Ci0JCWNpLT5zeSA9IDA7Ci0JCWNpLT5yZXZlcnNlID0gMDsKLQkJY2ktPnJmYiA9IE5VTEw7Ci0JCWN1cnNvcnNbaV0gPSBjaTsKLQl9Ci0KLQkvKiBjbGVhciBhbnkgeGZpeGVzIGN1cnNvciBjYWNoZSAobm8gZnJlZWluZyBpcyBkb25lKSAqLwotCWdldF9leGFjdF9jdXJzb3IoMSk7Ci0KLQkvKiBtYW51YWxseSBmaWxsIGluIHRoZSBkYXRhK21hc2tzOiAqLwotCWN1cl9lbXB0eS5kYXRhCT0gY3Vyc19lbXB0eV9kYXRhOwotCWN1cl9lbXB0eS5tYXNrCT0gY3Vyc19lbXB0eV9tYXNrOwotCi0JY3VyX2RvdC5kYXRhCT0gY3Vyc19kb3RfZGF0YTsKLQljdXJfZG90Lm1hc2sJPSBjdXJzX2RvdF9tYXNrOwotCi0JY3VyX2Fycm93LmRhdGEJPSBjdXJzX2Fycm93X2RhdGE7Ci0JY3VyX2Fycm93Lm1hc2sJPSBjdXJzX2Fycm93X21hc2s7Ci0JY3VyX2Fycm93Mi5kYXRhCT0gY3Vyc19hcnJvdzJfZGF0YTsKLQljdXJfYXJyb3cyLm1hc2sJPSBjdXJzX2Fycm93Ml9tYXNrOwotCWN1cl9hcnJvdzMuZGF0YQk9IGN1cnNfYXJyb3czX2RhdGE7Ci0JY3VyX2Fycm93My5tYXNrCT0gY3Vyc19hcnJvdzNfbWFzazsKLQljdXJfYXJyb3c0LmRhdGEJPSBjdXJzX2Fycm93NF9kYXRhOwotCWN1cl9hcnJvdzQubWFzawk9IGN1cnNfYXJyb3c0X21hc2s7Ci0JY3VyX2Fycm93NS5kYXRhCT0gY3Vyc19hcnJvdzVfZGF0YTsKLQljdXJfYXJyb3c1Lm1hc2sJPSBjdXJzX2Fycm93NV9tYXNrOwotCWN1cl9hcnJvdzYuZGF0YQk9IGN1cnNfYXJyb3c2X2RhdGE7Ci0JY3VyX2Fycm93Ni5tYXNrCT0gY3Vyc19hcnJvdzZfbWFzazsKLQotCWN1cl9yb290LmRhdGEJPSBjdXJzX3Jvb3RfZGF0YTsKLQljdXJfcm9vdC5tYXNrCT0gY3Vyc19yb290X21hc2s7Ci0KLQljdXJfcGx1cy5kYXRhCT0gY3Vyc19wbHVzX2RhdGE7Ci0JY3VyX3BsdXMubWFzawk9IGN1cnNfcGx1c19tYXNrOwotCi0JY3VyX2ZsZXVyLmRhdGEJPSBjdXJzX2ZsZXVyX2RhdGE7Ci0JY3VyX2ZsZXVyLm1hc2sJPSBjdXJzX2ZsZXVyX21hc2s7Ci0KLQljdXJfeHRlcm0uZGF0YQk9IGN1cnNfeHRlcm1fZGF0YTsKLQljdXJfeHRlcm0ubWFzawk9IGN1cnNfeHRlcm1fbWFzazsKLQotCWN1cnNfY29weShjdXJzb3JzW0NVUlNfRU1QVFldLCAmY3VyX2VtcHR5KTsJbisrOwotCWN1cnNfY29weShjdXJzb3JzW0NVUlNfRE9UXSwgICAmY3VyX2RvdCk7CW4rKzsKLQotCWlmIChhbHRfYXJyb3cgPCAxIHx8IGFsdF9hcnJvdyA+IGFsdF9hcnJvd19tYXgpIHsKLQkJYWx0X2Fycm93ID0gMTsKLQl9Ci0JaWYgKGFsdF9hcnJvdyA9PSAxKSB7Ci0JCWN1cnNfY29weShjdXJzb3JzW0NVUlNfQVJST1ddLCAmY3VyX2Fycm93KTsJbisrOwotCX0gZWxzZSBpZiAoYWx0X2Fycm93ID09IDIpIHsKLQkJY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19BUlJPV10sICZjdXJfYXJyb3cyKTsJbisrOwotCX0gZWxzZSBpZiAoYWx0X2Fycm93ID09IDMpIHsKLQkJY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19BUlJPV10sICZjdXJfYXJyb3czKTsJbisrOwotCX0gZWxzZSBpZiAoYWx0X2Fycm93ID09IDQpIHsKLQkJY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19BUlJPV10sICZjdXJfYXJyb3c0KTsJbisrOwotCX0gZWxzZSBpZiAoYWx0X2Fycm93ID09IDUpIHsKLQkJY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19BUlJPV10sICZjdXJfYXJyb3c1KTsJbisrOwotCX0gZWxzZSBpZiAoYWx0X2Fycm93ID09IDYpIHsKLQkJY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19BUlJPV10sICZjdXJfYXJyb3c2KTsJbisrOwotCX0gZWxzZSB7Ci0JCWFsdF9hcnJvdyA9IDE7Ci0JCWN1cnNfY29weShjdXJzb3JzW0NVUlNfQVJST1ddLCAmY3VyX2Fycm93KTsJbisrOwotCX0KLQljdXJzX2NvcHkoY3Vyc29yc1tDVVJTX1dBUlJPV10sICZjdXJfYXJyb3cyKTsJbisrOwotCi0JY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19ST09UXSwgJmN1cl9yb290KTsJbisrOwotCWN1cnNfY29weShjdXJzb3JzW0NVUlNfV01dLCAgICZjdXJfZmxldXIpOwluKys7Ci0JY3Vyc19jb3B5KGN1cnNvcnNbQ1VSU19URVJNXSwgJmN1cl94dGVybSk7CW4rKzsKLQljdXJzX2NvcHkoY3Vyc29yc1tDVVJTX1BMVVNdLCAmY3VyX3BsdXMpOwluKys7Ci0KLQlpZiAoc2NhbGVfY3Vyc29yX3N0cikgewotCQlzY2FsZSA9IHNjYWxlX2N1cnNvcl9zdHI7Ci0JfSBlbHNlIGlmIChzY2FsaW5nICYmIHNjYWxlX3N0cikgewotCQlzY2FsZSA9IHNjYWxlX3N0cjsKLQl9Ci0JaWYgKHNjYWxlICYmIHNzY2FuZihzY2FsZSwgIiVkeCVkIiwgJmksICZqKSA9PSAyKSB7Ci0JCWlmICh3ZHB5X3ggPiAwKSB7Ci0JCQl3X2luID0gd2RweV94OyAKLQkJCWhfaW4gPSB3ZHB5X3k7IAotCQl9IGVsc2UgewotCQkJd19pbiA9IGRweV94OyAKLQkJCWhfaW4gPSBkcHlfeTsgCi0JCX0KLQl9Ci0KLQkvKiBzY2FsZSA9IE5VTEwgemVyb2VzIGV2ZXJ5dGhpbmcgKi8KLQlwYXJzZV9zY2FsZV9zdHJpbmcoc2NhbGUsICZzY2FsZV9jdXJzb3JfZmFjX3gsICZzY2FsZV9jdXJzb3JfZmFjX3ksICZzY2FsaW5nX2N1cnNvciwKLQkgICAgJnNjYWxpbmdfY3Vyc29yX2JsZW5kLCAmaiwgJmosICZzY2FsaW5nX2N1cnNvcl9pbnRlcnBvbGF0ZSwKLQkgICAgJnNjYWxlX2N1cnNvcl9udW1lciwgJnNjYWxlX2N1cnNvcl9kZW5vbSwgd19pbiwgaF9pbik7Ci0KLQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJLyogY3JlYXRlIHJmYkN1cnNvcnMgZm9yIHRoZSBzcGVjaWFsIGN1cnNvcnM6ICovCi0KLQkJY3Vyc29yX2luZm9fdCAqY2kgPSBjdXJzb3JzW2ldOwotCi0JCWlmIChzY2FsaW5nX2N1cnNvciAmJiAoc2NhbGVfY3Vyc29yX2ZhY194ICE9IDEuMCB8fCBzY2FsZV9jdXJzb3JfZmFjX3kgIT0gMS4wKSkgewotCQkJaW50IHcsIGgsIHgsIHksIGs7Ci0JCQl1bnNpZ25lZCBsb25nICpwaXhlbHM7Ci0KLQkJCXcgPSBjaS0+d3g7Ci0JCQloID0gY2ktPnd5OwotCi0JCQlwaXhlbHMgPSAodW5zaWduZWQgbG9uZyAqKSBtYWxsb2ModyAqIGgKLQkJCSAgICAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkJCWsgPSAwOwotCQkJZm9yICh5PTA7IHk8aDsgeSsrKSB7Ci0JCQkJZm9yICh4PTA7IHg8dzsgeCsrKSB7Ci0JCQkJCWNoYXIgZCA9IGNpLT5kYXRhW2tdOwotCQkJCQljaGFyIG0gPSBjaS0+bWFza1trXTsKLQkJCQkJdW5zaWduZWQgbG9uZyAqcDsKLQotCQkJCQlwID0gcGl4ZWxzICsgazsKLQotCQkJCQkvKiBzZXQgYWxwaGEgb24gKi8KLQkJCQkJKnAgPSAweGZmMDAwMDAwOwotCi0JCQkJCWlmIChkID09ICcgJyAmJiBtID09ICcgJykgewotCQkJCQkJLyogYWxwaGEgb2ZmICovCi0JCQkJCQkqcCA9IDB4MDAwMDAwMDA7Ci0JCQkJCX0gZWxzZSBpZiAoZCAhPSAnICcpIHsKLQkJCQkJCS8qIGJvZHkgKi8KLQkJCQkJCWlmIChjaS0+cmV2ZXJzZSkgewotCQkJCQkJCSpwIHw9IDB4MDAwMDAwMDA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCSpwIHw9IDB4MDBmZmZmZmY7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAobSAhPSAnICcpIHsKLQkJCQkJCS8qIGVkZ2UgKi8KLQkJCQkJCWlmIChjaS0+cmV2ZXJzZSkgewotCQkJCQkJCSpwIHw9IDB4MDBmZmZmZmY7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCSpwIHw9IDB4MDAwMDAwMDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaysrOwotCQkJCX0KLQkJCX0KLQotCQkJcmZiX2N1cnMgPSBwaXhlbHMyY3VycyhwaXhlbHMsIHcsIGgsIGNpLT5zeCwgY2ktPnN5LAotCQkJICAgIGJwcC84KTsKLQotCQkJZnJlZShwaXhlbHMpOwotCi0JCX0gZWxzZSB7Ci0KLQkJCS8qIHN0YW5kYXJkIFggY3Vyc29yICovCi0JCQlyZmJfY3VycyA9IHJmYk1ha2VYQ3Vyc29yKGNpLT53eCwgY2ktPnd5LAotCQkJICAgIGNpLT5kYXRhLCBjaS0+bWFzayk7Ci0KLQkJCWlmIChjaS0+cmV2ZXJzZSkgewotCQkJCXJmYl9jdXJzLT5mb3JlUmVkICAgPSAweDAwMDA7Ci0JCQkJcmZiX2N1cnMtPmZvcmVHcmVlbiA9IDB4MDAwMDsKLQkJCQlyZmJfY3Vycy0+Zm9yZUJsdWUgID0gMHgwMDAwOwotCQkJCXJmYl9jdXJzLT5iYWNrUmVkICAgPSAweGZmZmY7Ci0JCQkJcmZiX2N1cnMtPmJhY2tHcmVlbiA9IDB4ZmZmZjsKLQkJCQlyZmJfY3Vycy0+YmFja0JsdWUgID0gMHhmZmZmOwotCQkJfQotCQkJcmZiX2N1cnMtPmFscGhhU291cmNlID0gTlVMTDsKLQotCQkJcmZiX2N1cnMtPnhob3QgPSBjaS0+c3g7Ci0JCQlyZmJfY3Vycy0+eWhvdCA9IGNpLT5zeTsKLQkJCXJmYl9jdXJzLT5jbGVhbnVwID0gRkFMU0U7Ci0JCQlyZmJfY3Vycy0+Y2xlYW51cFNvdXJjZSA9IEZBTFNFOwotCQkJcmZiX2N1cnMtPmNsZWFudXBNYXNrID0gRkFMU0U7Ci0JCQlyZmJfY3Vycy0+Y2xlYW51cFJpY2hTb3VyY2UgPSBGQUxTRTsKLQotCQkJaWYgKGJwcCA9PSA4ICYmIGluZGV4ZWRfY29sb3IpIHsKLQkJCQkvKgotCQkJCSAqIHVzZSByaWNoc291cmNlIGluIFBzZXVkb0NvbG9yIGZvciBiZXR0ZXIKLQkJCQkgKiBsb29raW5nIGN1cnNvcnMgKGkuZS4gdHdvLWNvbG9yKS4KLQkJCQkgKi8KLQkJCQlpbnQgeCwgeSwgayA9IDAsIGJ3OwotCQkJCWludCBibGFjayA9IDAsIHdoaXRlID0gMTsKLQkJCQljaGFyIGQsIG07Ci0KLQkJCQlpZiAoZHB5KSB7CS8qIHJhd19mYiBoYWNrICovCi0JCQkJCWJsYWNrID0gQmxhY2tQaXhlbChkcHksIHNjcik7Ci0JCQkJCXdoaXRlID0gV2hpdGVQaXhlbChkcHksIHNjcik7Ci0JCQkJfQotCi0JCQkJcmZiX2N1cnMtPnJpY2hTb3VyY2UgPSAodW5zaWduZWQgY2hhciAqKQotCQkJCSAgICBjYWxsb2MoY2ktPnd4ICogY2ktPnd5LCAxKTsKLQotCQkJCWZvciAoeSA9IDA7IHkgPCBjaS0+d3k7IHkrKykgewotCQkJCSAgICBmb3IgKHggPSAwOyB4IDwgY2ktPnd4OyB4KyspIHsKLQkJCQkJZCA9ICooY2ktPmRhdGEgKyBrKTsKLQkJCQkJbSA9ICooY2ktPm1hc2sgKyBrKTsKLQkJCQkJaWYgKGQgPT0gJyAnICYmIG0gPT0gJyAnKSB7Ci0JCQkJCQlrKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChtICE9ICcgJyAmJiBkID09ICcgJykgewotCQkJCQkJYncgPSBibGFjazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJ3ID0gd2hpdGU7Ci0JCQkJCX0KLQkJCQkJaWYgKGNpLT5yZXZlcnNlKSB7Ci0JCQkJCQlpZiAoYncgPT0gYmxhY2spIHsKLQkJCQkJCQlidyA9IHdoaXRlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlidyA9IGJsYWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCSoocmZiX2N1cnMtPnJpY2hTb3VyY2UraykgPQotCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIpIGJ3OwotCQkJCQlrKys7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2ktPnJmYiA9IHJmYl9jdXJzOwotCX0KLQlpZiAoc2NyZWVuKSB7Ci0JCVVOTE9DSyhzY3JlZW4tPmN1cnNvck11dGV4KTsKLQl9Ci0JaWYgKHZlcmJvc2UpIHsKLQkJcmZiTG9nKCIgIGRvbmUuXG4iKTsKLQl9Ci0JcmZiTG9nKCJcbiIpOwotfQotCi12b2lkIHNldHVwX2N1cnNvcnNfYW5kX3B1c2godm9pZCkgewotCXNldHVwX2N1cnNvcnMoKTsKLQlmaXJzdF9jdXJzb3IoKTsKLX0KLQotLyoKLSAqIERlc2NlbmRzIHdpbmRvdyB0cmVlIGF0IHBvaW50ZXIgdW50aWwgdGhlIHdpbmRvdyBjdXJzb3IgbWF0Y2hlcyB0aGUgY3VycmVudCAKLSAqIGN1cnNvci4gIFNvIGZhciBvbmx5IHVzZWQgdG8gZGV0ZWN0IGlmIG1vdXNlIGlzIG9uIHJvb3QgYmFja2dyb3VuZCBvciBub3QuCi0gKiAocmV0dXJucyAwIGluIHRoYXQgY2FzZSwgMSBvdGhlcndpc2UpLgotICoKLSAqLwotc3RhdGljIHZvaWQgdHJlZV9kZXNjZW5kX2N1cnNvcihpbnQgKmRlcHRoLCBXaW5kb3cgKncsIHdpbl9zdHJfaW5mb190ICp3aW5mbykgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFkZXB0aCB8fCAhdyB8fCAhd2luZm8pIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlXaW5kb3cgciwgYzsKLQlpbnQgaSwgcngsIHJ5LCB3eCwgd3k7Ci0JdW5zaWduZWQgaW50IG1hc2s7Ci0JV2luZG93IHdpbnNbMTBdOwotCWludCBkZXNjZW5kLCBtYXh0cmllcyA9IDEwOwotCWNoYXIgKm5hbWUsICpzID0gbXVsdGlwbGVfY3Vyc29yc19tb2RlOwotCXN0YXRpYyBYQ2xhc3NIaW50ICpjbGFzc2hpbnQgPSBOVUxMOwotCWludCBubV9pbmZvID0gMTsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmICghc3RyY21wKHMsICJkZWZhdWx0IikgfHwgIXN0cmNtcChzLCAiWCIpIHx8ICFzdHJjbXAocywgImFycm93IikpIHsKLQkJbm1faW5mbyA9IDA7Ci0JfQotCi0JKih3aW5mby0+d21fbmFtZSkgICA9ICdcMCc7Ci0JKih3aW5mby0+cmVzX25hbWUpICA9ICdcMCc7Ci0JKih3aW5mby0+cmVzX2NsYXNzKSA9ICdcMCc7Ci0KLQlmb3IgKGk9MDsgaSA8IG1heHRyaWVzOyBpKyspIHsKLQkJd2luc1tpXSA9IE5vbmU7Ci0JfQotCi0JLyogc29tZSB0aW1lcyBhIHdpbmRvdyBjYW4gZ28gYXdheSBiZWZvcmUgd2UgZ2V0IHRvIGl0ICovCi0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0KLQljID0gd2luZG93OwotCWRlc2NlbmQgPSAtMTsKLQotCXdoaWxlIChjKSB7Ci0JCXdpbnNbKytkZXNjZW5kXSA9IGM7Ci0JCWlmIChkZXNjZW5kID49IG1heHRyaWVzIC0gMSkgewotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCBYVGVzdENvbXBhcmVDdXJyZW50Q3Vyc29yV2l0aFdpbmRvd193cihkcHksIGMpICkgewotCQkJYnJlYWs7Ci0JCX0KLQkJLyogVEJEOiBxdWVyeV9wb2ludGVyKCkgKi8KLQkJWFF1ZXJ5UG9pbnRlcl93cihkcHksIGMsICZyLCAmYywgJnJ4LCAmcnksICZ3eCwgJnd5LCAmbWFzayk7Ci0JfQotCi0JaWYgKG5tX2luZm8pIHsKLQkJaW50IGdvdF93bV9uYW1lID0gMCwgZ290X3Jlc19uYW1lID0gMCwgZ290X3Jlc19jbGFzcyA9IDA7Ci0KLQkJaWYgKCEgY2xhc3NoaW50KSB7Ci0JCQljbGFzc2hpbnQgPSBYQWxsb2NDbGFzc0hpbnQoKTsKLQkJfQotCi0JCWZvciAoaSA9IGRlc2NlbmQ7IGkgPj0wOyBpLS0pIHsKLQkJCWMgPSB3aW5zW2ldOwotCQkJaWYgKCEgYykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoISBnb3Rfd21fbmFtZSAmJiBYRmV0Y2hOYW1lKGRweSwgYywgJm5hbWUpKSB7Ci0JCQkJaWYgKG5hbWUpIHsKLQkJCQkJaWYgKCpuYW1lICE9ICdcMCcpIHsKLQkJCQkJCXN0cmNweSh3aW5mby0+d21fbmFtZSwgbmFtZSk7Ci0JCQkJCQlnb3Rfd21fbmFtZSA9IDE7Ci0JCQkJCX0KLQkJCQkJWEZyZWVfd3IobmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsYXNzaGludCAmJiAoISBnb3RfcmVzX25hbWUgfHwgISBnb3RfcmVzX2NsYXNzKSkgewotCQkJICAgIGlmIChYR2V0Q2xhc3NIaW50KGRweSwgYywgY2xhc3NoaW50KSkgewotCQkJCWNoYXIgKnA7Ci0JCQkJcCA9IGNsYXNzaGludC0+cmVzX25hbWU7Ci0JCQkJaWYgKHApIHsKLQkJCQkJaWYgKCpwICE9ICdcMCcgJiYgISBnb3RfcmVzX25hbWUpIHsKLQkJCQkJCXN0cmNweSh3aW5mby0+cmVzX25hbWUsIHApOwotCQkJCQkJZ290X3Jlc19uYW1lID0gMTsKLQkJCQkJfQotCQkJCQlYRnJlZV93cihwKTsKLQkJCQkJY2xhc3NoaW50LT5yZXNfbmFtZSA9IE5VTEw7Ci0JCQkJfQotCQkJCXAgPSBjbGFzc2hpbnQtPnJlc19jbGFzczsKLQkJCQlpZiAocCkgewotCQkJCQlpZiAoKnAgIT0gJ1wwJyAmJiAhIGdvdF9yZXNfY2xhc3MpIHsKLQkJCQkJCXN0cmNweSh3aW5mby0+cmVzX2NsYXNzLCBwKTsKLQkJCQkJCWdvdF9yZXNfY2xhc3MgPSAxOwotCQkJCQl9Ci0JCQkJCVhGcmVlX3dyKHApOwotCQkJCQljbGFzc2hpbnQtPnJlc19jbGFzcyA9IE5VTEw7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJfQotCX0KLQotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCSpkZXB0aCA9IGRlc2NlbmQ7Ci0JKncgPSB3aW5zW2Rlc2NlbmRdOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIGluaXRpYWxpemVfeGZpeGVzKHZvaWQpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYRklYRVMKLQlpZiAoeGZpeGVzX3ByZXNlbnQpIHsKLQkJWF9MT0NLOwotCQlpZiAodXNlX3hmaXhlcykgewotCQkJWEZpeGVzU2VsZWN0Q3Vyc29ySW5wdXQoZHB5LCByb290d2luLAotCQkJCVhGaXhlc0Rpc3BsYXlDdXJzb3JOb3RpZnlNYXNrKTsKLQkJfSBlbHNlIHsKLQkJCVhGaXhlc1NlbGVjdEN1cnNvcklucHV0KGRweSwgcm9vdHdpbiwgMCk7Ci0JCX0KLQkJWF9VTkxPQ0s7Ci0JCXhmaXhlc19maXJzdF9pbml0aWFsaXplZCA9IDE7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyByZmJDdXJzb3JQdHIgcGl4ZWxzMmN1cnModW5zaWduZWQgbG9uZyAqcGl4ZWxzLCBpbnQgdywgaW50IGgsCi0gICAgaW50IHhob3QsIGludCB5aG90LCBpbnQgQnBwKSB7Ci0JcmZiQ3Vyc29yUHRyIGM7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgYmxhY2sgPSAwLCB3aGl0ZSA9IDE7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JY2hhciAqYml0bWFwLCAqcmljaCwgKmFscGhhOwotCWNoYXIgKnBpeGVsc19uZXcgPSBOVUxMOwotCWludCBuX29wYXF1ZSwgbl90cmFucywgbl9hbHBoYSwgbGVuLCBoaXN0b1syNTZdOwotCWludCBzZW5kX2FscGhhID0gMCwgYWxwaGFfc2hpZnQgPSAwLCB0aHJlc2g7Ci0JaW50IGksIHgsIHk7Ci0KLQlpZiAoZmlyc3QgJiYgZHB5KSB7CS8qIHJhd19mYiBoYWNrICovCi0JCVhfTE9DSzsKLQkJYmxhY2sgPSBCbGFja1BpeGVsKGRweSwgc2NyKTsKLQkJd2hpdGUgPSBXaGl0ZVBpeGVsKGRweSwgc2NyKTsKLQkJWF9VTkxPQ0s7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlpZiAoY21hcDh0bzI0ICYmIGNtYXA4dG8yNF9mYiAmJiBkZXB0aCA8PSAxNikgewotCQlpZiAoQnBwIDw9IDIpIHsKLQkJCUJwcCA9IDQ7Ci0JCX0KLQl9Ci0KLQlpZiAoc2NhbGluZ19jdXJzb3IgJiYgKHNjYWxlX2N1cnNvcl9mYWNfeCAhPSAxLjAgfHwgc2NhbGVfY3Vyc29yX2ZhY195ICE9IDEuMCkpIHsKLQkJaW50IFcsIEg7Ci0JCWNoYXIgKnBpeGVsc191c2UgPSAoY2hhciAqKSBwaXhlbHM7Ci0JCXVuc2lnbmVkIGludCAqcGl4ZWxzMzIgPSBOVUxMOwotCi0JCVcgPSB3OwotCQlIID0gaDsKLQotCQl3ID0gc2NhbGVfcm91bmQoVywgc2NhbGVfY3Vyc29yX2ZhY194KTsKLQkJaCA9IHNjYWxlX3JvdW5kKEgsIHNjYWxlX2N1cnNvcl9mYWNfeSk7Ci0KLQkJcGl4ZWxzX25ldyA9IChjaGFyICopIG1hbGxvYyg0KncqaCk7Ci0KLQkJaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA4KSB7Ci0JCQlpbnQgaSwgaiwgayA9IDA7Ci0JCQkvKgotCQkJICogdG8gYXZvaWQgNjRicHAgY29kZSBpbiBzY2FsZV9yZWN0KCkgd2Uga25vY2sKLQkJCSAqIGRvd24gdG8gdW5zaWduZWQgaW50IG9uIDY0Yml0IG1hY2hpbmVzOgotCQkJICovCi0JCQlwaXhlbHMzMiA9ICh1bnNpZ25lZCBpbnQqKSBtYWxsb2MoNCpXKkgpOwotCQkJZm9yIChqPTA7IGo8SDsgaisrKSB7Ci0JCQkgICAgZm9yIChpPTA7IGk8VzsgaSsrKSB7Ci0JCQkJKihwaXhlbHMzMitrKSA9IDB4ZmZmZmZmZmYgJiAoKihwaXhlbHMraykpOwotCQkJCWsrKzsKLQkJCSAgICB9Ci0JCQl9Ci0JCQlwaXhlbHNfdXNlID0gKGNoYXIgKikgcGl4ZWxzMzI7Ci0JCX0KLQotCQlzY2FsZV9yZWN0KHNjYWxlX2N1cnNvcl9mYWNfeCwgc2NhbGVfY3Vyc29yX2ZhY195LCBzY2FsaW5nX2N1cnNvcl9ibGVuZCwKLQkJICAgIHNjYWxpbmdfY3Vyc29yX2ludGVycG9sYXRlLAotCQkgICAgNCwgcGl4ZWxzX3VzZSwgNCpXLCBwaXhlbHNfbmV3LCA0KncsCi0JCSAgICBXLCBILCB3LCBoLCAwLCAwLCBXLCBILCAwKTsKLQotCQlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDgpIHsKLQkJCWludCBpLCBqLCBrID0gMDsKLQkJCXVuc2lnbmVkIGxvbmcgKnBpeGVsczY0OwotCQkJdW5zaWduZWQgaW50KiBzb3VyY2UgPSAodW5zaWduZWQgaW50KikgcGl4ZWxzX25ldzsKLQkJCS8qCi0JCQkgKiBub3cga25vY2sgaXQgYmFjayB1cCB0byB1bnNpZ25lZCBsb25nOgotCQkJICovCi0JCQlwaXhlbHM2NCA9ICh1bnNpZ25lZCBsb25nKikgbWFsbG9jKDgqdypoKTsKLQkJCWZvciAoaj0wOyBqPGg7IGorKykgewotCQkJICAgIGZvciAoaT0wOyBpPHc7IGkrKykgewotCQkJCSoocGl4ZWxzNjQraykgPSAodW5zaWduZWQgbG9uZykgKCooc291cmNlK2spKTsKLQkJCQlrKys7Ci0JCQkgICAgfQotCQkJfQotCQkJZnJlZShwaXhlbHNfbmV3KTsKLQkJCXBpeGVsc19uZXcgPSAoY2hhciAqKSBwaXhlbHM2NDsKLQkJCWlmIChwaXhlbHMzMikgewotCQkJCWZyZWUocGl4ZWxzMzIpOwotCQkJCXBpeGVsczMyID0gTlVMTDsKLQkJCX0KLQkJfQotCQkJCi0JCXBpeGVscyA9ICh1bnNpZ25lZCBsb25nICopIHBpeGVsc19uZXc7Ci0KLQkJeGhvdCA9IHNjYWxlX3JvdW5kKHhob3QsIHNjYWxlX2N1cnNvcl9mYWNfeCk7Ci0JCXlob3QgPSBzY2FsZV9yb3VuZCh5aG90LCBzY2FsZV9jdXJzb3JfZmFjX3kpOwotCX0KLQotCWxlbiA9IHcgKiBoOwotCS8qIGZvciBiaXRtYXAgZGF0YSAqLwotCWJpdG1hcCA9IChjaGFyICopIG1hbGxvYyhsZW4rMSk7Ci0JYml0bWFwW2xlbl0gPSAnXDAnOwotCi0JLyogZm9yIHJpY2ggY3Vyc29yIHBpeGVsIGRhdGEgKi8KLQlyaWNoICA9IChjaGFyICopY2FsbG9jKEJwcCpsZW4sIDEpOwotCWFscGhhID0gKGNoYXIgKiljYWxsb2MoMSpsZW4sIDEpOwotCi0Jbl9vcGFxdWUgPSAwOwotCW5fdHJhbnMgPSAwOwotCW5fYWxwaGEgPSAwOwotCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCWhpc3RvW2ldID0gMDsKLQl9Ci0KLQlpID0gMDsKLQlmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgYTsKLQotCQkJYSA9IDB4ZmYwMDAwMDAgJiAoKihwaXhlbHMraSkpOwotCQkJYSA9IGEgPj4gMjQ7CS8qIGFscGhhIGNoYW5uZWwgKi8KLQkJCWlmIChhID4gMCkgewotCQkJCW5fYWxwaGErKzsKLQkJCX0KLQkJCWhpc3RvW2FdKys7Ci0JCQlpZiAoYSA8ICh1bnNpZ25lZCBpbnQpIGFscGhhX3RocmVzaG9sZCkgewotCQkJCW5fdHJhbnMrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJbl9vcGFxdWUrKzsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCX0KLQlpZiAoYWxwaGFfYmxlbmQpIHsKLQkJc2VuZF9hbHBoYSA9IDA7Ci0JCWlmIChCcHAgPT0gNCkgewotCQkJc2VuZF9hbHBoYSA9IDE7Ci0JCX0KLQkJYWxwaGFfc2hpZnQgPSAyNDsKLQkJaWYgKG1haW5fcmVkX3NoaWZ0ID09IDI0IHx8IG1haW5fZ3JlZW5fc2hpZnQgPT0gMjQgfHwKLQkJICAgIG1haW5fYmx1ZV9zaGlmdCA9PSAyNCkgIHsKLQkJCWFscGhhX3NoaWZ0ID0gMDsJLyogWFhYIGNvcnJlY3Q/ICovCi0JCX0KLQl9Ci0JaWYgKG5fb3BhcXVlID49IGFscGhhX2ZyYWMgKiBuX2FscGhhKSB7Ci0JCXRocmVzaCA9IGFscGhhX3RocmVzaG9sZDsKLQl9IGVsc2UgewotCQluX29wYXF1ZSA9IDA7Ci0JCWZvciAoaT0yNTU7IGk+PTA7IGktLSkgewotCQkJbl9vcGFxdWUgKz0gaGlzdG9baV07Ci0JCQl0aHJlc2ggPSBpOwotCQkJaWYgKG5fb3BhcXVlID49IGFscGhhX2ZyYWMgKiBuX2FscGhhKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpID0gMDsKLQlmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgciwgZywgYiwgYTsKLQkJCXVuc2lnbmVkIGludCB1aTsKLQkJCWNoYXIgKnA7Ci0KLQkJCWEgPSAweGZmMDAwMDAwICYgKCoocGl4ZWxzK2kpKTsKLQkJCWEgPSBhID4+IDI0OwkvKiBhbHBoYSBjaGFubmVsICovCi0KLQkJCWlmIChhIDwgKHVuc2lnbmVkIGludCkgdGhyZXNoKSB7Ci0JCQkJYml0bWFwW2ldID0gJyAnOwotCQkJfSBlbHNlIHsKLQkJCQliaXRtYXBbaV0gPSAneCc7Ci0JCQl9Ci0KLQkJCXIgPSAweDAwZmYwMDAwICYgKCoocGl4ZWxzK2kpKTsKLQkJCWcgPSAweDAwMDBmZjAwICYgKCoocGl4ZWxzK2kpKTsKLQkJCWIgPSAweDAwMDAwMGZmICYgKCoocGl4ZWxzK2kpKTsKLQkJCXIgPSByID4+IDE2OwkvKiByZWQgKi8KLQkJCWcgPSBnID4+IDg7CS8qIGdyZWVuICovCi0JCQliID0gYiA+PiAwOwkvKiBibHVlICovCi0KLQkJCWlmIChhbHBoYV9yZW1vdmUgJiYgYSAhPSAwKSB7Ci0JCQkJciA9ICgyNTUgKiByKSAvIGE7Ci0JCQkJZyA9ICgyNTUgKiBnKSAvIGE7Ci0JCQkJYiA9ICgyNTUgKiBiKSAvIGE7Ci0JCQkJaWYgKHIgPiAyNTUpIHIgPSAyNTU7Ci0JCQkJaWYgKGcgPiAyNTUpIGcgPSAyNTU7Ci0JCQkJaWYgKGIgPiAyNTUpIGIgPSAyNTU7Ci0JCQl9Ci0KLQkJCWlmIChpbmRleGVkX2NvbG9yKSB7Ci0JCQkJLyoKLQkJCQkgKiBDaG9vc2UgYmxhY2sgb3Igd2hpdGUgZm9yCi0JCQkJICogUHNldWRvQ29sb3IgY2FzZS4KLQkJCQkgKi8KLQkJCQlpbnQgdmFsdWUgPSAocitnK2IpLzM7Ci0JCQkJaWYgKHZhbHVlID4gMTI3KSB7Ci0JCQkJCXVpID0gd2hpdGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWkgPSBibGFjazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogT3RoZXJ3aXNlIG1hcCB0aGUgUkdCIGRhdGEgb250bwotCQkJCSAqIHRoZSBmcmFtZWJ1ZmZlciBmb3JtYXQ6Ci0JCQkJICovCi0JCQkJciA9IChtYWluX3JlZF9tYXggICAqIHIpLzI1NTsKLQkJCQlnID0gKG1haW5fZ3JlZW5fbWF4ICogZykvMjU1OwotCQkJCWIgPSAobWFpbl9ibHVlX21heCAgKiBiKS8yNTU7Ci0JCQkJdWkgPSAwOwotCQkJCXVpIHw9IChyIDw8IG1haW5fcmVkX3NoaWZ0KTsKLQkJCQl1aSB8PSAoZyA8PCBtYWluX2dyZWVuX3NoaWZ0KTsKLQkJCQl1aSB8PSAoYiA8PCBtYWluX2JsdWVfc2hpZnQpOwotCQkJCWlmIChzZW5kX2FscGhhKSB7Ci0JCQkJCXVpIHw9IChhIDw8IGFscGhhX3NoaWZ0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIGluc2VydCB2YWx1ZSBpbnRvIHJpY2ggc291cmNlOiAqLwotCQkJcCA9IHJpY2ggKyBCcHAqaTsKLQotCQkJaWYgKEJwcCA9PSAxKSB7Ci0JCQkJKigodW5zaWduZWQgY2hhciAqKXApCi0JCQkJPSAodW5zaWduZWQgY2hhcikgdWk7Ci0JCQl9IGVsc2UgaWYgKEJwcCA9PSAyKSB7Ci0JCQkJKigodW5zaWduZWQgc2hvcnQgKilwKQotCQkJCT0gKHVuc2lnbmVkIHNob3J0KSB1aTsKLQkJCX0gZWxzZSBpZiAoQnBwID09IDMpIHsKLQkJCQkqKCh1bnNpZ25lZCBjaGFyICopcCkKLQkJCQk9ICh1bnNpZ25lZCBjaGFyKSAoKHVpICYgMHgwMDAwZmYpID4+IDApOwotCQkJCSooKHVuc2lnbmVkIGNoYXIgKikocCsxKSkKLQkJCQk9ICh1bnNpZ25lZCBjaGFyKSAoKHVpICYgMHgwMGZmMDApID4+IDgpOwotCQkJCSooKHVuc2lnbmVkIGNoYXIgKikocCsyKSkKLQkJCQk9ICh1bnNpZ25lZCBjaGFyKSAoKHVpICYgMHhmZjAwMDApID4+IDE2KTsKLQkJCX0gZWxzZSBpZiAoQnBwID09IDQpIHsKLQkJCQkqKCh1bnNpZ25lZCBpbnQgKilwKQotCQkJCT0gKHVuc2lnbmVkIGludCkgdWk7Ci0JCQl9Ci0KLQkJCS8qIGluc2VydCBhbHBoYSB2YWx1ZSBpbnRvIGFscGhhIHNvdXJjZTogKi8KLQkJCXAgPSBhbHBoYSArIGk7Ci0JCQkqKCh1bnNpZ25lZCBjaGFyICopcCkgPSAodW5zaWduZWQgY2hhcikgYTsKLQotCQkJaSsrOwotCQl9Ci0JfQotCi0JLyogY3JlYXRlIHRoZSBjdXJzb3Igd2l0aCB0aGUgYml0bWFwOiAqLwotCWMgPSByZmJNYWtlWEN1cnNvcih3LCBoLCBiaXRtYXAsIGJpdG1hcCk7Ci0JZnJlZShiaXRtYXApOwotCi0JaWYgKHBpeGVsc19uZXcpIHsKLQkJZnJlZShwaXhlbHNfbmV3KTsKLQl9Ci0KLQkvKiBzZXQgdXAgdGhlIGN1cnNvciBwYXJhbWV0ZXJzOiAqLwotCWMtPnhob3QgPSB4aG90OwotCWMtPnlob3QgPSB5aG90OwotCWMtPmNsZWFudXAgPSBGQUxTRTsKLQljLT5jbGVhbnVwU291cmNlID0gRkFMU0U7Ci0JYy0+Y2xlYW51cE1hc2sgPSBGQUxTRTsKLQljLT5jbGVhbnVwUmljaFNvdXJjZSA9IEZBTFNFOwotCWMtPnJpY2hTb3VyY2UgPSAodW5zaWduZWQgY2hhciAqKSByaWNoOwotCi0JLyogemVyb2VzIG1lYW4gaW50ZXJwb2xhdGUgdGhlIHJpY2ggY3Vyc29yIHNvbWVob3cgYW5kIHVzZSBCK1cgKi8KLQljLT5mb3JlUmVkICAgPSAwOwotCWMtPmZvcmVHcmVlbiA9IDA7Ci0JYy0+Zm9yZUJsdWUgID0gMDsKLQljLT5iYWNrUmVkICAgPSAwOwotCWMtPmJhY2tHcmVlbiA9IDA7Ci0JYy0+YmFja0JsdWUgID0gMDsKLQotCWMtPnNvdXJjZSA9IE5VTEw7Ci0KLQlpZiAoYWxwaGFfYmxlbmQgJiYgIWluZGV4ZWRfY29sb3IpIHsKLQkJYy0+YWxwaGFTb3VyY2UgPSAodW5zaWduZWQgY2hhciAqKSBhbHBoYTsKLQkJYy0+YWxwaGFQcmVNdWx0aXBsaWVkID0gVFJVRTsKLQl9IGVsc2UgewotCQlmcmVlKGFscGhhKTsKLQkJYy0+YWxwaGFTb3VyY2UgPSBOVUxMOwotCX0KLQlyZXR1cm4gYzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9jdXJzb3IgPSAwOwotc3RhdGljIGludCBsYXN0X2luZGV4ID0gMDsKLXN0YXRpYyB0aW1lX3QgY3Vyc190aW1lc1tDVVJTX01BWF07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJzX2luZGV4W0NVUlNfTUFYXTsKLQotdW5zaWduZWQgbG9uZyBnZXRfY3Vyc29yX3NlcmlhbChpbnQgbW9kZSkgewotCWlmIChtb2RlID09IDApIHsKLQkJcmV0dXJuIGxhc3RfY3Vyc29yOwotCX0gZWxzZSBpZiAobW9kZSA9PSAxKSB7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgbGFzdF9pbmRleDsKLQl9IGVsc2UgewotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIGxhc3RfaW5kZXg7Ci0JfQotfQotCi1zdGF0aWMgaW50IGdldF9leGFjdF9jdXJzb3IoaW50IGluaXQpIHsKLQlpbnQgd2hpY2ggPSBDVVJTX0FSUk9XOwotCi0JaWYgKGluaXQpIHsKLQkJLyogemVybyBvdXQgb3VyIGNhY2hlIChjdXJzb3JzIGFyZSBub3QgZnJlZWQpICovCi0JCWludCBpOwotCQlmb3IgKGk9MDsgaTxDVVJTX01BWDsgaSsrKSB7Ci0JCQljdXJzX3RpbWVzW2ldID0gMDsKLQkJCWN1cnNfaW5kZXhbaV0gPSAwOwotCQl9Ci0JCWxhc3RfY3Vyc29yID0gMDsKLQkJbGFzdF9pbmRleCA9IDA7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJcmV0dXJuIG1hY29zeF9nZXRfY3Vyc29yKCk7Ci0JfQotI2VuZGlmCi0KLQlpZiAocmF3ZmJfdm5jX3JlZmxlY3QpIHsKLQkJaW50IGxhc3RfaWR4ID0gKGludCkgZ2V0X2N1cnNvcl9zZXJpYWwoMSk7Ci0JCWlmIChsYXN0X2lkeCkgewotCQkJd2hpY2ggPSBsYXN0X2lkeDsKLQkJfQotCQlyZXR1cm4gd2hpY2g7Ci0JfQotCWlmICh4Zml4ZXNfcHJlc2VudCAmJiBkcHkpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYRklYRVMKLQkJaW50IGxhc3RfaWR4ID0gKGludCkgZ2V0X2N1cnNvcl9zZXJpYWwoMSk7Ci0JCVhGaXhlc0N1cnNvckltYWdlICp4ZmM7Ci0KLQkJaWYgKGxhc3RfaWR4KSB7Ci0JCQl3aGljaCA9IGxhc3RfaWR4OwotCQl9Ci0JCWlmICghIHhmaXhlc19maXJzdF9pbml0aWFsaXplZCkgewotCQkJcmV0dXJuIHdoaWNoOwotCQl9Ci0KLQkJWF9MT0NLOwotCQlpZiAoISBnb3RfeGZpeGVzX2N1cnNvcl9ub3RpZnkgJiYgeGZpeGVzX2Jhc2VfZXZlbnRfdHlwZSkgewotCQkJLyogdHJ5IGFnYWluIGZvciBYRml4ZXNDdXJzb3JOb3RpZnkgZXZlbnQgKi8KLQkJCVhFdmVudCB4ZXY7Ci0JCQlpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIHhmaXhlc19iYXNlX2V2ZW50X3R5cGUgKwotCQkJICAgIFhGaXhlc0N1cnNvck5vdGlmeSwgJnhldikpIHsKLQkJCQlnb3RfeGZpeGVzX2N1cnNvcl9ub3RpZnkrKzsKLQkJCX0KLQkJfQotCQlpZiAoISBnb3RfeGZpeGVzX2N1cnNvcl9ub3RpZnkpIHsKLQkJCS8qIGV2aWRlbnRseSBubyBjdXJzb3IgY2hhbmdlLCBqdXN0IHJldHVybiBsYXN0IG9uZSAqLwotCQkJWF9VTkxPQ0s7Ci0JCQlyZXR1cm4gd2hpY2g7Ci0JCX0KLQkJZ290X3hmaXhlc19jdXJzb3Jfbm90aWZ5ID0gMDsKLQotCQkvKiByZXRyaWV2ZSB0aGUgY3Vyc29yIGluZm8gKyBwaXhlbHMgZnJvbSBzZXJ2ZXI6ICovCi0JCXhmYyA9IFhGaXhlc0dldEN1cnNvckltYWdlKGRweSk7Ci0JCVhfVU5MT0NLOwotCQlpZiAoISB4ZmMpIHsKLQkJCS8qIGZhaWx1cmUuICovCi0JCQlyZXR1cm4gd2hpY2g7Ci0JCX0KLQotCQl3aGljaCA9IHN0b3JlX2N1cnNvcih4ZmMtPmN1cnNvcl9zZXJpYWwsIHhmYy0+cGl4ZWxzLAotCQkgICAgeGZjLT53aWR0aCwgeGZjLT5oZWlnaHQsIDMyLCB4ZmMtPnhob3QsIHhmYy0+eWhvdCk7Ci0KLQkJWF9MT0NLOwotCQlYRnJlZV93cih4ZmMpOwotCQlYX1VOTE9DSzsKLSNlbmRpZgotCX0KLQlyZXR1cm4od2hpY2gpOwotfQotCi1pbnQgc3RvcmVfY3Vyc29yKGludCBzZXJpYWwsIHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCB3LCBpbnQgaCwgaW50IGNicHAsCi0gICAgaW50IHhob3QsIGludCB5aG90KSB7Ci0JaW50IHdoaWNoID0gQ1VSU19BUlJPVzsKLQlpbnQgdXNlLCBvbGRlc3QsIGk7Ci0JdGltZV90IG9sZHRpbWUsIG5vdzsKLQotI2lmIDAKLWZwcmludGYoc3RkZXJyLCAic2M6ICVkICAlZC8lZCAlZCAtICVkICVkXG4iLCBzZXJpYWwsIHcsIGgsIGNicHAsIHhob3QsIHlob3QpOwotI2VuZGlmCi0KLQlvbGRlc3QgPSBDVVJTX0RZTl9NSU47Ci0JaWYgKHNjcmVlbiAmJiBzY3JlZW4tPmN1cnNvciA9PSBjdXJzb3JzW29sZGVzdF0tPnJmYikgewotCQlvbGRlc3QrKzsKLQl9Ci0Jb2xkdGltZSA9IGN1cnNfdGltZXNbb2xkZXN0XTsKLQlub3cgPSB0aW1lKE5VTEwpOwotCWZvciAoaSA9IENVUlNfRFlOX01JTjsgaSA8PSBDVVJTX0RZTl9NQVg7IGkrKykgewotCQlpZiAoc2NyZWVuICYmIHNjcmVlbi0+Y3Vyc29yID09IGN1cnNvcnNbaV0tPnJmYikgewotCQkJOwotCQl9IGVsc2UgaWYgKGN1cnNfdGltZXNbaV0gPCBvbGR0aW1lKSB7Ci0JCQkvKiB3YXRjaCBmb3Igb2xkZXN0IG9uZSB0byBvdmVyd3JpdGUgKi8KLQkJCW9sZGVzdCA9IGk7Ci0JCQlvbGR0aW1lID0gY3Vyc190aW1lc1tpXTsKLQkJfQotCQlpZiAoc2VyaWFsID09IChpbnQpIGN1cnNfaW5kZXhbaV0pIHsKLQkJCS8qCi0JCQkgKiBnb3QgYSBoaXQgd2l0aCBhbiBleGlzdGluZyBjdXJzb3IsCi0JCQkgKiB1c2UgdGhhdCBvbmUuCi0JCQkgKi8KLSNpZmRlZiBNQUNPU1gKLQkJCWlmIChub3cgPiBjdXJzX3RpbWVzW2ldICsgMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotI2VuZGlmCi0JCQlsYXN0X2N1cnNvciA9IGN1cnNfaW5kZXhbaV07Ci0JCQljdXJzX3RpbWVzW2ldID0gbm93OwotCQkJbGFzdF9pbmRleCA9IGk7Ci0JCQlyZXR1cm4gbGFzdF9pbmRleDsKLQkJfQotCX0KLQotCS8qIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBjdXJzb3IgYW5kIG92ZXJ3cml0ZSBvbGRlc3QgKi8KLQl1c2UgPSBvbGRlc3Q7Ci0JaWYgKGN1cnNvcnNbdXNlXS0+cmZiKSB7Ci0JCS8qIGNsZWFuIHVwIG9sZGVzdCBpZiBpdCBleGlzdHMgKi8KLQkJaWYgKGN1cnNvcnNbdXNlXS0+cmZiLT5yaWNoU291cmNlKSB7Ci0JCQlmcmVlKGN1cnNvcnNbdXNlXS0+cmZiLT5yaWNoU291cmNlKTsKLQkJCWN1cnNvcnNbdXNlXS0+cmZiLT5yaWNoU291cmNlID0gTlVMTDsKLQkJfQotCQlpZiAoY3Vyc29yc1t1c2VdLT5yZmItPmFscGhhU291cmNlKSB7Ci0JCQlmcmVlKGN1cnNvcnNbdXNlXS0+cmZiLT5hbHBoYVNvdXJjZSk7Ci0JCQljdXJzb3JzW3VzZV0tPnJmYi0+YWxwaGFTb3VyY2UgPSBOVUxMOwotCQl9Ci0JCWlmIChjdXJzb3JzW3VzZV0tPnJmYi0+c291cmNlKSB7Ci0JCQlmcmVlKGN1cnNvcnNbdXNlXS0+cmZiLT5zb3VyY2UpOwotCQkJY3Vyc29yc1t1c2VdLT5yZmItPnNvdXJjZSA9IE5VTEw7Ci0JCX0KLQkJaWYgKGN1cnNvcnNbdXNlXS0+cmZiLT5tYXNrKSB7Ci0JCQlmcmVlKGN1cnNvcnNbdXNlXS0+cmZiLT5tYXNrKTsKLQkJCWN1cnNvcnNbdXNlXS0+cmZiLT5tYXNrID0gTlVMTDsKLQkJfQotCQlmcmVlKGN1cnNvcnNbdXNlXS0+cmZiKTsKLQkJY3Vyc29yc1t1c2VdLT5yZmIgPSBOVUxMOwotCX0KLQotCWlmIChyb3RhdGluZyAmJiByb3RhdGluZ19jdXJzb3JzKSB7Ci0JCWNoYXIgKmRzdDsKLQkJaW50IHR4LCB0eTsKLQotCQlkc3QgPSAoY2hhciAqKSBtYWxsb2ModyAqIGggKiBjYnBwLzgpOwotCQlyb3RhdGVfY3Vycyhkc3QsIChjaGFyICopIGRhdGEsIHcsIGgsIGNicHAvOCk7Ci0KLQkJbWVtY3B5KGRhdGEsIGRzdCwgdyAqIGggKiBjYnBwLzgpOwotCQlmcmVlKGRzdCk7Ci0KLQkJcm90YXRlX2Nvb3Jkcyh4aG90LCB5aG90LCAmdHgsICZ0eSwgdywgaCk7Ci0JCXhob3QgPSB0eDsKLQkJeWhvdCA9IHR5OwotCQlpZiAoISByb3RhdGluZ19zYW1lKSB7Ci0JCQlpbnQgdG1wID0gdzsKLQkJCXcgPSBoOwotCQkJaCA9IHRtcDsKLQkJfQotCX0KLQotCS8qIHBsYWNlIGN1cnNvciBpbnRvIG91ciBjb2xsZWN0aW9uICovCi0JY3Vyc29yc1t1c2VdLT5yZmIgPSBwaXhlbHMyY3VycyhkYXRhLCB3LCBoLCB4aG90LCB5aG90LCBicHAvOCk7Ci0KLQkvKiB1cGRhdGUgdGltZSBhbmQgc2VyaWFsIGluZGV4OiAqLwotCWN1cnNfdGltZXNbdXNlXSA9IG5vdzsKLQljdXJzX2luZGV4W3VzZV0gPSBzZXJpYWw7Ci0JbGFzdF9pbmRleCA9IHVzZTsKLQlsYXN0X2N1cnNvciA9IHNlcmlhbDsKLQotCXdoaWNoID0gbGFzdF9pbmRleDsKLQotCXJldHVybiB3aGljaDsKLX0KLQotaW50IGtub3duX2N1cnNvcnNfbW9kZShjaGFyICpzKSB7Ci0vKgotICogZGVmYXVsdDoJc2VlIGluaXRpYWxpemVfY3Vyc29yc19tb2RlKCkgZm9yIGRlZmF1bHQgYmVoYXZpb3IuCi0gKiBhcnJvdzoJdW5jaGFuZ2luZyB3aGl0ZSBhcnJvdy4KLSAqIFhuKjoJCXNob3cgWCBvbiByb290IGJhY2tncm91bmQuICBPcHRpb25hbCBuIHNldHMgdHJlZWRlcHRoLgotICogc29tZToJZG8gdGhlIGhldXJpc3RpY3MgZm9yIHJvb3QsIHdtLCB0ZXJtIGRldGVjdGlvbi4KLSAqIG1vc3Q6CWlmIGRpc3BsYXkgaGF2ZSBvdmVybGF5IG9yIHhmaXhlcywgc2hvdyBhbGwgY3Vyc29ycywKLSAqCQlvdGhlcndpc2UgZG8gdGhlIHNhbWUgYXMgInNvbWUiCi0gKiBub25lOglzaG93IG5vIGN1cnNvci4KLSAqLwotCWlmIChzdHJjbXAocywgImRlZmF1bHQiKSAmJiBzdHJjbXAocywgImFycm93IikgJiYgKnMgIT0gJ1gnICYmCi0JICAgIHN0cmNtcChzLCAic29tZSIpICYmIHN0cmNtcChzLCAibW9zdCIpICYmIHN0cmNtcChzLCAibm9uZSIpKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotdm9pZCBpbml0aWFsaXplX2N1cnNvcnNfbW9kZSh2b2lkKSB7Ci0JY2hhciAqcyA9IG11bHRpcGxlX2N1cnNvcnNfbW9kZTsKLQlpZiAoIXMgfHwgIWtub3duX2N1cnNvcnNfbW9kZShzKSkgewotCQlyZmJMb2coInVua25vd24gY3Vyc29ycyBtb2RlOiAlc1xuIiwgcyk7Ci0JCXJmYkxvZygicmVzZXR0aW5nIGN1cnNvcnMgbW9kZSB0byBcImRlZmF1bHRcIlxuIik7Ci0JCWlmIChtdWx0aXBsZV9jdXJzb3JzX21vZGUpIGZyZWUobXVsdGlwbGVfY3Vyc29yc19tb2RlKTsKLQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKCJkZWZhdWx0Iik7Ci0JCXMgPSBtdWx0aXBsZV9jdXJzb3JzX21vZGU7Ci0JfQotCWlmICghc3RyY21wKHMsICJub25lIikpIHsKLQkJc2hvd19jdXJzb3IgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIHdlIGRvIE5PVCBzZXQgc2hvd19jdXJzb3IgPSAxLCBsZXQgdGhlIGNhbGxlciBkbyB0aGF0ICovCi0JfQotCi0Jc2hvd19tdWx0aXBsZV9jdXJzb3JzID0gMDsKLQlpZiAoc2hvd19jdXJzb3IpIHsKLQkJaWYgKCFzdHJjbXAocywgImRlZmF1bHQiKSkgewotCQkJaWYobXVsdGlwbGVfY3Vyc29yc19tb2RlKSBmcmVlKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCQltdWx0aXBsZV9jdXJzb3JzX21vZGUgPSBzdHJkdXAoIlgiKTsKLQkJCXMgPSBtdWx0aXBsZV9jdXJzb3JzX21vZGU7Ci0JCX0KLQkJaWYgKCpzID09ICdYJyB8fCAhc3RyY21wKHMsICJzb21lIikgfHwgIXN0cmNtcChzLCAibW9zdCIpKSB7Ci0JCQlzaG93X211bHRpcGxlX2N1cnNvcnMgPSAxOwotCQl9IGVsc2UgewotCQkJc2hvd19tdWx0aXBsZV9jdXJzb3JzID0gMDsKLQkJCS8qIGhtbW0sIHNvbWUgYnVnIGdvaW5nIGJhY2sgdG8gYXJyb3cgbW9kZS4uICovCi0JCQlzZXRfcmZiX2N1cnNvcihDVVJTX0FSUk9XKTsKLQkJfQotCQlpZiAoc2NyZWVuKSB7Ci0JCQlzZXRfY3Vyc29yX3dhc19jaGFuZ2VkKHNjcmVlbik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoc2NyZWVuKSB7Ci0JCQlMT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCQkJc2NyZWVuLT5jdXJzb3IgPSBOVUxMOwotCQkJVU5MT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCQkJc2V0X2N1cnNvcl93YXNfY2hhbmdlZChzY3JlZW4pOwotCQl9Ci0JfQotfQotCi1pbnQgZ2V0X3doaWNoX2N1cnNvcih2b2lkKSB7Ci0JaW50IHdoaWNoID0gQ1VSU19BUlJPVzsKLQlpbnQgZGIgPSAwOwotCi0JaWYgKHNob3dfbXVsdGlwbGVfY3Vyc29ycykgewotCQlpbnQgZGVwdGggPSAwLCByaW50OwotCQlzdGF0aWMgd2luX3N0cl9pbmZvX3Qgd2luZm87Ci0JCXN0YXRpYyBpbnQgZmlyc3QgPSAxLCBkZXB0aF9jdXRvZmYgPSAtMTsKLQkJV2luZG93IHdpbiA9IE5vbmU7Ci0JCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7Ci0JCWludCBtb2RlID0gMDsKLQotCQlpZiAoZHJhZ19pbl9wcm9ncmVzcyB8fCBidXR0b25fbWFzaykgewotCQkJLyogWFhYIG5vdCBleGFjdGx5IHdoYXQgd2Ugd2FudCBmb3IgbWVudXMgKi8KLQkJCWlmICghIGN1cnNvcl9kcmFnX2NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXN0cmNtcChtdWx0aXBsZV9jdXJzb3JzX21vZGUsICJhcnJvdyIpKSB7Ci0JCQkvKiBzaG91bGQgbm90IGhhcHBlbi4uLiAqLwotCQkJcmV0dXJuIENVUlNfQVJST1c7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtdWx0aXBsZV9jdXJzb3JzX21vZGUsICJkZWZhdWx0IikpIHsKLQkJCW1vZGUgPSAwOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAobXVsdGlwbGVfY3Vyc29yc19tb2RlLCAiWCIpKSB7Ci0JCQltb2RlID0gMTsKLQkJfSBlbHNlIGlmICghc3RyY21wKG11bHRpcGxlX2N1cnNvcnNfbW9kZSwgInNvbWUiKSkgewotCQkJbW9kZSA9IDI7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtdWx0aXBsZV9jdXJzb3JzX21vZGUsICJtb3N0IikpIHsKLQkJCW1vZGUgPSAzOwotCQl9Ci0KLQkJaWYgKHJhd2ZiX3ZuY19yZWZsZWN0ICYmIG1vZGUgPiAtMSkgewotCQkJcmludCA9IGdldF9leGFjdF9jdXJzb3IoMCk7Ci0JCQlyZXR1cm4gcmludDsKLQkJfQotCQlpZiAobW9kZSA9PSAzKSB7Ci0JCQlpZiAoKHhmaXhlc19wcmVzZW50ICYmIHVzZV94Zml4ZXMpIHx8IG1hY29zeF9jb25zb2xlKSB7Ci0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdldF93aGljaF9jdXJzb3IgY2FsbCBnZXRfZXhhY3RfY3Vyc29yXG4iKTsKLQkJCQlyaW50ID0gZ2V0X2V4YWN0X2N1cnNvcigwKTsKLQkJCQlyZXR1cm4gcmludDsKLQkJCX0KLQkJfQotCi0JCWlmIChkZXB0aF9jdXRvZmYgPCAwKSB7Ci0JCQlpbnQgZGluOwotCQkJaWYgKHNzY2FuZihtdWx0aXBsZV9jdXJzb3JzX21vZGUsICJYJWQiLCAmZGluKSA9PSAxKSB7Ci0JCQkJZGVwdGhfY3V0b2ZmID0gZGluOwotCQkJfSBlbHNlIHsKLQkJCQlkZXB0aF9jdXRvZmYgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZpcnN0KSB7Ci0JCQl3aW5mby53bV9uYW1lICAgPSAoY2hhciAqKSBtYWxsb2MoMTAyNCk7Ci0JCQl3aW5mby5yZXNfbmFtZSAgPSAoY2hhciAqKSBtYWxsb2MoMTAyNCk7Ci0JCQl3aW5mby5yZXNfY2xhc3MgPSAoY2hhciAqKSBtYWxsb2MoMTAyNCk7Ci0JCX0KLQkJZmlyc3QgPSAwOwotCQkKLQkJWF9MT0NLOwotCQl0cmVlX2Rlc2NlbmRfY3Vyc29yKCZkZXB0aCwgJndpbiwgJndpbmZvKTsKLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKGRlcHRoIDw9IGRlcHRoX2N1dG9mZiAmJiAhc3Vid2luKSB7Ci0JCQl3aGljaCA9IENVUlNfUk9PVDsKLQotCQl9IGVsc2UgaWYgKG1vZGUgPT0gMiB8fCBtb2RlID09IDMpIHsKLQkJCWludCB3aGljaDAgPSB3aGljaDsKLQotCQkJLyogYXBwbHkgY3J1ZGUgaGV1cmlzdGljcyB0byBjaG9vc2UgYSBjdXJzb3IuLi4gKi8KLQkJCWlmICh3aW4gJiYgZHB5KSB7Ci0JCQkJaW50IHJhdGlvID0gMTAsIHgsIHk7Ci0JCQkJdW5zaWduZWQgaW50IHcsIGgsIGJ3LCBkOyAgCi0JCQkJV2luZG93IHI7Ci0KLSNpZiAhTk9fWDExCi0JCQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQkJCVhfTE9DSzsKLQkJCQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCi0JCQkJLyogIm5hcnJvdyIgd2luZG93cyBhcmUgV00gKi8KLQkJCQlpZiAoWEdldEdlb21ldHJ5KGRweSwgd2luLCAmciwgJngsICZ5LCAmdywgJmgsCi0JCQkJICAgICZidywgJmQpKSB7Ci0JCQkJCWlmICh3ID4gcmF0aW8gKiBoIHx8IGggPiByYXRpbyAqIHcpIHsKLQkJCQkJCXdoaWNoID0gQ1VSU19XTTsKLQkJCQkJfQotCQkJCX0KLQkJCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJCQlYX1VOTE9DSzsKLQkJCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0jZWxzZQotCQkJCWlmICghciB8fCAhZCB8fCAhYncgfHwgIWggfHwgIXcgfHwgIXkgfHwgIXggfHwgIXJhdGlvIHx8ICFvbGRfaGFuZGxlcikge30KLSNlbmRpZgkvKiBOT19YMTEgKi8KLQkJCX0KLQkJCWlmICh3aGljaCA9PSB3aGljaDApIHsKLQkJCQkvKiB0aGUgc3RyaW5nICJ0ZXJtIiBtZWFucyBJLWJlYW0uICovCi0JCQkJY2hhciAqbmFtZSwgKmNsYXNzOwotCQkJCWxvd2VyY2FzZSh3aW5mby5yZXNfbmFtZSk7Ci0JCQkJbG93ZXJjYXNlKHdpbmZvLnJlc19jbGFzcyk7Ci0JCQkJbmFtZSAgPSB3aW5mby5yZXNfbmFtZTsKLQkJCQljbGFzcyA9IHdpbmZvLnJlc19jbGFzczsKLQkJCQlpZiAoc3Ryc3RyKG5hbWUsICJ0ZXJtIikpIHsKLQkJCQkJd2hpY2ggPSBDVVJTX1RFUk07Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIoY2xhc3MsICJ0ZXJtIikpIHsKLQkJCQkJd2hpY2ggPSBDVVJTX1RFUk07Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIobmFtZSwgICJ0ZXh0IikpIHsKLQkJCQkJd2hpY2ggPSBDVVJTX1RFUk07Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIoY2xhc3MsICJ0ZXh0IikpIHsKLQkJCQkJd2hpY2ggPSBDVVJTX1RFUk07Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIobmFtZSwgICJvbnNvbGUiKSkgewotCQkJCQl3aGljaCA9IENVUlNfVEVSTTsKLQkJCQl9IGVsc2UgaWYgKHN0cnN0cihjbGFzcywgIm9uc29sZSIpKSB7Ci0JCQkJCXdoaWNoID0gQ1VSU19URVJNOwotCQkJCX0gZWxzZSBpZiAoc3Ryc3RyKG5hbWUsICAiY21kdG9vbCIpKSB7Ci0JCQkJCXdoaWNoID0gQ1VSU19URVJNOwotCQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGNsYXNzLCAiY21kdG9vbCIpKSB7Ci0JCQkJCXdoaWNoID0gQ1VSU19URVJNOwotCQkJCX0gZWxzZSBpZiAoc3Ryc3RyKG5hbWUsICAic2hlbGx0b29sIikpIHsKLQkJCQkJd2hpY2ggPSBDVVJTX1RFUk07Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIoY2xhc3MsICJzaGVsbHRvb2wiKSkgewotCQkJCQl3aGljaCA9IENVUlNfVEVSTTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdldF93aGljaF9jdXJzb3Igd2hpY2g6ICVkXG4iLCB3aGljaCk7Ci0JcmV0dXJuIHdoaWNoOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfY3Vyc29yX3dhc19jaGFuZ2VkKHJmYlNjcmVlbkluZm9QdHIgcykgewotCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCi0JaWYgKCEgcykgewotCQlyZXR1cm47Ci0JfQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzKTsKLQlMT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQljbC0+Y3Vyc29yV2FzQ2hhbmdlZCA9IFRSVUU7Ci0JfQotCVVOTE9DSyhzY3JlZW4tPmN1cnNvck11dGV4KTsKLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci19Ci0KLSNpZiAwCi0vKiBub3QgeWV0IHVzZWQgKi8KLXN0YXRpYyB2b2lkIHNldF9jdXJzb3Jfd2FzX21vdmVkKHJmYlNjcmVlbkluZm9QdHIgcykgewotCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCi0JaWYgKCEgcykgewotCQlyZXR1cm47Ci0JfQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJY2wtPmN1cnNvcldhc01vdmVkID0gVFJVRTsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotfQotI2VuZGlmCi0KLXZvaWQgcmVzdG9yZV9jdXJzb3Jfc2hhcGVfdXBkYXRlcyhyZmJTY3JlZW5JbmZvUHRyIHMpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQlpbnQgY291bnQgPSAwOwotCi0JaWYgKCEgcyB8fCAhIHMtPmNsaWVudEhlYWQpIHsKLQkJcmV0dXJuOwotCX0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Iocyk7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCWludCBjaGFuZ2VkID0gMDsKLQkJQ2xpZW50RGF0YSAqY2QgPSAoQ2xpZW50RGF0YSAqKSBjbC0+Y2xpZW50RGF0YTsKLQotCQlpZiAoISBjZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNkLT5oYWRfY3Vyc29yX3NoYXBlX3VwZGF0ZXMpIHsKLQkJCXJmYkxvZygicmVzdG9yaW5nIGVuYWJsZUN1cnNvclNoYXBlVXBkYXRlcyBmb3IgY2xpZW50IgotCQkJICAgICIgMHgleFxuIiwgY2wpOwotCQkJY2wtPmVuYWJsZUN1cnNvclNoYXBlVXBkYXRlcyA9IFRSVUU7CQotCQkJY2hhbmdlZCA9IDE7Ci0JCX0KLQkJaWYgKGNkLT5oYWRfY3Vyc29yX3Bvc191cGRhdGVzKSB7Ci0JCQlyZmJMb2coInJlc3RvcmluZyBlbmFibGVDdXJzb3JQb3NVcGRhdGVzIGZvciBjbGllbnQiCi0JCQkgICAgIiAweCV4XG4iLCBjbCk7Ci0JCQljbC0+ZW5hYmxlQ3Vyc29yUG9zVXBkYXRlcyA9IFRSVUU7CQotCQkJY2hhbmdlZCA9IDE7Ci0JCX0KLQkJaWYgKGNoYW5nZWQpIHsKLQkJCWNsLT5jdXJzb3JXYXNDaGFuZ2VkID0gVFJVRTsKLQkJCWNvdW50Kys7Ci0JCX0KLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotfQotCi12b2lkIGRpc2FibGVfY3Vyc29yX3NoYXBlX3VwZGF0ZXMocmZiU2NyZWVuSW5mb1B0ciBzKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0Jc3RhdGljIGludCBjaGFuZ2VkID0gMDsKLQlpbnQgY291bnQgPSAwOwotCi0JaWYgKCEgcyB8fCAhIHMtPmNsaWVudEhlYWQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Iocyk7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCUNsaWVudERhdGEgKmNkOwotCQljZCA9IChDbGllbnREYXRhICopIGNsLT5jbGllbnREYXRhOwotCi0JCWlmIChjbC0+ZW5hYmxlQ3Vyc29yU2hhcGVVcGRhdGVzKSB7Ci0JCQlpZiAoY2QpIHsKLQkJCQljZC0+aGFkX2N1cnNvcl9zaGFwZV91cGRhdGVzID0gMTsKLQkJCX0KLQkJCWNvdW50Kys7Ci0JCQlpZiAoZGVidWdfcG9pbnRlcikgewotCQkJCXJmYkxvZygiJXMgZGlzYWJsZSBIQ1NVXG4iLCBjbC0+aG9zdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNsLT5lbmFibGVDdXJzb3JQb3NVcGRhdGVzKSB7Ci0JCQlpZiAoY2QpIHsKLQkJCQljZC0+aGFkX2N1cnNvcl9wb3NfdXBkYXRlcyA9IDE7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCQlyZmJMb2coIiVzIGRpc2FibGUgSENQVVxuIiwgY2wtPmhvc3QpOwotCQkJfQotCQl9Ci0JCQotCQljbC0+ZW5hYmxlQ3Vyc29yU2hhcGVVcGRhdGVzID0gRkFMU0U7Ci0JCWNsLT5lbmFibGVDdXJzb3JQb3NVcGRhdGVzID0gRkFMU0U7Ci0JCWNsLT5jdXJzb3JXYXNDaGFuZ2VkID0gRkFMU0U7Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQotCWlmIChjb3VudCkgewotCQljaGFuZ2VkID0gMTsKLQl9Ci19Ci0KLWludCBjdXJzb3Jfc2hhcGVfdXBkYXRlc19jbGllbnRzKHJmYlNjcmVlbkluZm9QdHIgcykgewotCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCWludCBjb3VudCA9IDA7Ci0KLQlpZiAoISBzKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Iocyk7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCWlmIChjbC0+ZW5hYmxlQ3Vyc29yU2hhcGVVcGRhdGVzKSB7Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWludCBjdXJzb3Jfbm9zaGFwZV91cGRhdGVzX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGNvdW50ID0gMDsKLQotCWlmICghIHMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJaWYgKCFjbC0+ZW5hYmxlQ3Vyc29yU2hhcGVVcGRhdGVzKSB7Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWludCBjdXJzb3JfcG9zX3VwZGF0ZXNfY2xpZW50cyhyZmJTY3JlZW5JbmZvUHRyIHMpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQlpbnQgY291bnQgPSAwOwotCi0JaWYgKCEgcykgewotCQlyZXR1cm4gMDsKLQl9Ci0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHMpOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQlpZiAoY2wtPmVuYWJsZUN1cnNvclBvc1VwZGF0ZXMpIHsKLQkJCWNvdW50Kys7Ci0JCX0KLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIFJlY29yZCByZmIgY3Vyc29yIHBvc2l0aW9uIHNjcmVlbi0+Y3Vyc29yWCwgZXRjIChhIGxhIGRlZmF1bHRQdHJBZGRFdmVudCgpKQotICogVGhlbiBzZXQgdXAgZm9yIHNlbmRpbmcgcmZiQ3Vyc29yUG9zVXBkYXRlcyBiYWNrCi0gKiB0byBjbGllbnRzIHRoYXQgdW5kZXJzdGFuZCB0aGVtLiAgVGhpcyBzZWVtcyB0byBiZSBUaWdodFZOQyBzcGVjaWZpYy4KLSAqLwotdm9pZCBjdXJzb3JfcG9zaXRpb24oaW50IHgsIGludCB5KSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGNudCA9IDAsIG5vbkN1cnNvclBvc1VwZGF0ZXNfY2xpZW50cyA9IDA7Ci0JaW50IHhfaW4gPSB4LCB5X2luID0geTsKLQotCS8qIHggYW5kIHkgYXJlIGN1cnJlbnQgcG9zaXRpb25zIG9mIFgxMSBwb2ludGVyIG9uIHRoZSBYMTEgZGlzcGxheSAqLwotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2NhbGluZykgewotCQl4ID0gKChkb3VibGUpIHggLyBkcHlfeCkgKiBzY2FsZWRfeDsKLQkJeCA9IG5maXgoeCwgc2NhbGVkX3gpOwotCQl5ID0gKChkb3VibGUpIHkgLyBkcHlfeSkgKiBzY2FsZWRfeTsKLQkJeSA9IG5maXgoeSwgc2NhbGVkX3kpOwotCX0KLQotCWlmIChjbGlwc2hpZnQpIHsKLQkJaWYgKHggPCAwKSB4ID0gMDsKLQkJaWYgKHkgPCAwKSB5ID0gMDsKLQkJaWYgKHggPj0gZHB5X3gpIHggPSBkcHlfeC0xOwotCQlpZiAoeSA+PSBkcHlfeSkgeSA9IGRweV95LTE7Ci0JfQotCi0JaWYgKHggPT0gc2NyZWVuLT5jdXJzb3JYICYmIHkgPT0gc2NyZWVuLT5jdXJzb3JZKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlMT0NLKHNjcmVlbi0+Y3Vyc29yTXV0ZXgpOwotCXNjcmVlbi0+Y3Vyc29yWCA9IHg7Ci0Jc2NyZWVuLT5jdXJzb3JZID0geTsKLQlVTkxPQ0soc2NyZWVuLT5jdXJzb3JNdXRleCk7Ci0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJaWYgKCEgY2wtPmVuYWJsZUN1cnNvclBvc1VwZGF0ZXMpIHsKLQkJCW5vbkN1cnNvclBvc1VwZGF0ZXNfY2xpZW50cysrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCEgY3Vyc29yX3Bvc191cGRhdGVzKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2wgPT0gbGFzdF9wb2ludGVyX2NsaWVudCkgewotCQkJLyoKLQkJCSAqIHNwZWNpYWwgY2FzZSBpZiB0aGlzIGNsaWVudCB3YXMgdGhlIGxhc3Qgb25lIHRvCi0JCQkgKiBzZW5kIGEgcG9pbnRlciBwb3NpdGlvbi4KLQkJCSAqLwotCQkJaWYgKHhfaW4gPT0gY3Vyc29yX3ggJiYgeV9pbiA9PSBjdXJzb3JfeSkgewotCQkJCWNsLT5jdXJzb3JXYXNNb3ZlZCA9IEZBTFNFOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBhbiBYMTEgYXBwIGV2aWRlbnRseSB3YXJwZWQgdGhlIHBvaW50ZXIgKi8KLQkJCQlpZiAoZGVidWdfcG9pbnRlcikgewotCQkJCQlyZmJMb2coImN1cnNvcl9wb3NpdGlvbjogd2FycCAiCi0JCQkJCSAgICAiZGV0ZWN0ZWQgZHg9JTNkIGR5PSUzZFxuIiwKLQkJCQkJICAgIGN1cnNvcl94IC0geCwgY3Vyc29yX3kgLSB5KTsKLQkJCQl9Ci0JCQkJY2wtPmN1cnNvcldhc01vdmVkID0gVFJVRTsKLQkJCQljbnQrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNsLT5jdXJzb3JXYXNNb3ZlZCA9IFRSVUU7Ci0JCQljbnQrKzsKLQkJfQotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci0KLQlpZiAoZGVidWdfcG9pbnRlciAmJiBjbnQpIHsKLQkJcmZiTG9nKCJjdXJzb3JfcG9zaXRpb246IHNlbnQgcG9zaXRpb24geD0lM2QgeT0lM2QgdG8gJWQiCi0JCSAgICAiIGNsaWVudHNcbiIsIHgsIHksIGNudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzZXRfcmZiX2N1cnNvcihpbnQgd2hpY2gpIHsKLQotCWlmICghIHNob3dfY3Vyc29yKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCEgc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKCFjdXJzb3JzW3doaWNoXSB8fCAhY3Vyc29yc1t3aGljaF0tPnJmYikgewotCQlyZmJMb2coIm5vbi1leGlzdGVudCBjdXJzb3I6IHdoaWNoPSVkXG4iLCB3aGljaCk7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlyZmJTZXRDdXJzb3Ioc2NyZWVuLCBjdXJzb3JzW3doaWNoXS0+cmZiKTsKLQl9Ci19Ci0KLXZvaWQgc2V0X25vX2N1cnNvcih2b2lkKSB7Ci0Jc2V0X3JmYl9jdXJzb3IoQ1VSU19FTVBUWSk7Ci19Ci0KLXZvaWQgc2V0X3dhcnJvd19jdXJzb3Iodm9pZCkgewotCXNldF9yZmJfY3Vyc29yKENVUlNfV0FSUk9XKTsKLX0KLQotaW50IHNldF9jdXJzb3IoaW50IHgsIGludCB5LCBpbnQgd2hpY2gpIHsKLQlzdGF0aWMgaW50IGxhc3QgPSAtMTsKLQlpbnQgY2hhbmdlZF9jdXJzb3IgPSAwOwotCi0JaWYgKHggfHwgeSkge30gLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQotCWlmICh3aGljaCA8IDApIHsKLQkJd2hpY2ggPSBsYXN0OwkKLQl9Ci0JaWYgKGxhc3QgPCAwIHx8IHdoaWNoICE9IGxhc3QpIHsKLQkJc2V0X3JmYl9jdXJzb3Iod2hpY2gpOwotCQljaGFuZ2VkX2N1cnNvciA9IDE7Ci0JfQotCWxhc3QgPSB3aGljaDsKLQotCXJldHVybiBjaGFuZ2VkX2N1cnNvcjsKLX0KLQotLyoKLSAqIHJvdXRpbmUgY2FsbGVkIHBlcmlvZGljYWxseSB0byB1cGRhdGUgY3Vyc29yIGFzcGVjdHMsIHRoaXMgY2F0Y2hlcwotICogd2FycHMgYW5kIGN1cnNvciBzaGFwZSBjaGFuZ2VzLiAKLSAqLwotaW50IGNoZWNrX3gxMV9wb2ludGVyKHZvaWQpIHsKLQlXaW5kb3cgcm9vdF93LCBjaGlsZF93OwotCXJmYkJvb2wgcmV0ID0gMDsKLQlpbnQgcm9vdF94LCByb290X3ksIHdpbl94LCB3aW5feTsKLQlpbnQgeCwgeSwgcmludDsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAwOwotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCXJldCA9IG1hY29zeF9nZXRfY3Vyc29yX3Bvcygmcm9vdF94LCAmcm9vdF95KTsKLQl9IGVsc2UgewotCQlSQVdGQl9SRVQoMCkKLQl9Ci0jZWxzZQotCi0JUkFXRkJfUkVUKDApCi0KLSMgICBpZiBOT19YMTEKLQlyZXR1cm4gMDsKLSMgICBlbmRpZgotCi0jZW5kaWYKLQotCi0jaWYgISBOT19YMTEKLQlpZiAoZHB5KSB7Ci0JCVhfTE9DSzsKLQkJcmV0ID0gWFF1ZXJ5UG9pbnRlcl93cihkcHksIHJvb3R3aW4sICZyb290X3csICZjaGlsZF93LCAmcm9vdF94LCAmcm9vdF95LAotCQkgICAgJndpbl94LCAmd2luX3ksICZtYXNrKTsKLQkJWF9VTkxPQ0s7Ci0JfQotI2Vsc2UKLQlpZiAoIW1hc2sgfHwgIXdpbl95IHx8ICF3aW5feCB8fCAhY2hpbGRfdyB8fCAhcm9vdF93KSB7fQotI2VuZGlmCS8qIE5PX1gxMSAqLwotCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJjaGVja194MTFfcG9pbnRlciAlZCAlZFxuIiwgcm9vdF94LCByb290X3kpOwotCWlmICghIHJldCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJc3RhdGljIGludCBsYXN0X3ggPSAtMSwgbGFzdF95ID0gLTE7Ci0JCWlmIChyb290X3ggIT0gbGFzdF94IHx8IHJvb3RfeSAhPSBsYXN0X3kpIHsKLQkJCXJmYkxvZygiWFF1ZXJ5UG9pbnRlcjogICAgIHg6JTRkLCB5OiU0ZClcbiIsCi0JCQkgICAgcm9vdF94LCByb290X3kpOwotCQl9Ci0JCWxhc3RfeCA9IHJvb3RfeDsKLQkJbGFzdF95ID0gcm9vdF95OwotCX0KLQotCS8qIG9mZnNldCBzdWJ0cmFjdGVkIHNpbmNlIFhRdWVyeVBvaW50ZXIgcmVsYXRpdmUgdG8gcm9vdHdpbiAqLwotCXggPSByb290X3ggLSBvZmZfeCAtIGNvZmZfeDsKLQl5ID0gcm9vdF95IC0gb2ZmX3kgLSBjb2ZmX3k7Ci0KLQlpZiAoY2xpcHNoaWZ0KSB7Ci0JCXN0YXRpYyBpbnQgY250ID0gMDsKLQkJaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gZHB5X3ggfHwgeSA+PSBkcHlfeSkgIHsKLQkJCWlmIChjbnQrKyAlIDQgIT0gMCkgewotCQkJCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCQkJCXJmYkxvZygiU2tpcHBpbmcgY3Vyc29yX3Bvc2l0aW9uKCkgb3V0c2lkZSBvdXIgY2xpcHNoaWZ0XG4iKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiByZWNvcmQgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcmZiIHNjcmVlbiAqLwotCWN1cnNvcl9wb3NpdGlvbih4LCB5KTsKLQotCS8qIGNoYW5nZSB0aGUgY3Vyc29yIHNoYXBlIGlmIG5lY2Vzc2FyeSAqLwotCXJpbnQgPSBzZXRfY3Vyc29yKHgsIHksIGdldF93aGljaF9jdXJzb3IoKSk7Ci0JcmV0dXJuIHJpbnQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9jdXJzb3IuaCBiL3gxMXZuYy9jdXJzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NDk0NC4uMDAwMDAwMAotLS0gYS94MTF2bmMvY3Vyc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19DVVJTT1JfSAotI2RlZmluZSBfWDExVk5DX0NVUlNPUl9ICi0KLS8qIC0tIGN1cnNvci5oIC0tICovCi0KLWV4dGVybiBpbnQgeGZpeGVzX3ByZXNlbnQ7Ci1leHRlcm4gaW50IHhmaXhlc19maXJzdF9pbml0aWFsaXplZDsKLWV4dGVybiBpbnQgdXNlX3hmaXhlczsKLWV4dGVybiBpbnQgZ290X3hmaXhlc19jdXJzb3Jfbm90aWZ5OwotZXh0ZXJuIGludCBjdXJzb3JfY2hhbmdlczsKLWV4dGVybiBpbnQgYWxwaGFfdGhyZXNob2xkOwotZXh0ZXJuIGRvdWJsZSBhbHBoYV9mcmFjOwotZXh0ZXJuIGludCBhbHBoYV9yZW1vdmU7Ci1leHRlcm4gaW50IGFscGhhX2JsZW5kOwotZXh0ZXJuIGludCBhbHRfYXJyb3c7Ci1leHRlcm4gaW50IGFsdF9hcnJvd19tYXg7Ci0KLQotZXh0ZXJuIHZvaWQgZmlyc3RfY3Vyc29yKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0dXBfY3Vyc29yc19hbmRfcHVzaCh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfeGZpeGVzKHZvaWQpOwotZXh0ZXJuIGludCBrbm93bl9jdXJzb3JzX21vZGUoY2hhciAqcyk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX2N1cnNvcnNfbW9kZSh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0X3doaWNoX2N1cnNvcih2b2lkKTsKLWV4dGVybiB2b2lkIHJlc3RvcmVfY3Vyc29yX3NoYXBlX3VwZGF0ZXMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWV4dGVybiB2b2lkIGRpc2FibGVfY3Vyc29yX3NoYXBlX3VwZGF0ZXMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWV4dGVybiBpbnQgY3Vyc29yX3NoYXBlX3VwZGF0ZXNfY2xpZW50cyhyZmJTY3JlZW5JbmZvUHRyIHMpOwotZXh0ZXJuIGludCBjdXJzb3Jfbm9zaGFwZV91cGRhdGVzX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWV4dGVybiBpbnQgY3Vyc29yX3Bvc191cGRhdGVzX2NsaWVudHMocmZiU2NyZWVuSW5mb1B0ciBzKTsKLWV4dGVybiB2b2lkIGN1cnNvcl9wb3NpdGlvbihpbnQgeCwgaW50IHkpOwotZXh0ZXJuIHZvaWQgc2V0X25vX2N1cnNvcih2b2lkKTsKLWV4dGVybiB2b2lkIHNldF93YXJyb3dfY3Vyc29yKHZvaWQpOwotZXh0ZXJuIGludCBzZXRfY3Vyc29yKGludCB4LCBpbnQgeSwgaW50IHdoaWNoKTsKLWV4dGVybiBpbnQgY2hlY2tfeDExX3BvaW50ZXIodm9pZCk7Ci1leHRlcm4gaW50IHN0b3JlX2N1cnNvcihpbnQgc2VyaWFsLCB1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgdywgaW50IGgsIGludCBjYnBwLCBpbnQgeGhvdCwgaW50IHlob3QpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2N1cnNvcl9zZXJpYWwoaW50IG1vZGUpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19DVVJTT1JfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2VuYy5oIGIveDExdm5jL2VuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ0OWJiLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9lbmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNjUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfRU5DX0gKLSNkZWZpbmUgX1gxMVZOQ19FTkNfSAotCi0vKiAtLSBlbmMuaCAtLSAqLwotCi0jaWYgMAotOnIgL2hvbWUvcnVuZ2UvdXZuYy91bHRyYVNDL3JjNC91bHRyYXZuY19kc21faGVscGVyLmMKLSNlbmRpZgotCi0vKgotICogdWx0cmF2bmNfZHNtX2hlbHBlci5jIHVuaXgvb3BlbnNzbCBVbHRyYVZOQyBlbmNyeXB0aW9uIGVuY29kZXIvZGVjb2Rlci4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKGFsc28gYSBnZW5lcmljIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHR1bm5lbCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAoYWxzbyBhIGdlbmVyaWMgVENQIHJlbGF5IGFuZCBzdXBwb3J0cyBJUHY2KQotICoKLSAqIGNvbXBpbGUgdmlhOgotCi0gICBjYyAgICAgICAtTyAtbyB1bHRyYXZuY19kc21faGVscGVyIHVsdHJhdm5jX2RzbV9oZWxwZXIuYyAtbHNzbCAtbGNyeXB0bwotICAgY2MgLUREQkcgLU8gLW8gdWx0cmF2bmNfZHNtX2hlbHBlciB1bHRyYXZuY19kc21faGVscGVyLmMgLWxzc2wgLWxjcnlwdG8KLQotICoKLSAqIFNlZSB1c2FnZSBiZWxvdyBmb3IgaG93IHRvIHJ1biBpdC4KLSAqCi0gKiBOb3RlOiBzaW5jZSB0aGUgVWx0cmFWTkMgRFNNIHBsdWdpbiBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRoZSBSRkIKLSAqIChha2EgVk5DKSBwcm90b2NvbCAoZXh0cmEgZGF0YSBpcyBzZW50KSwgeW91IHdpbGwgKkFMU08qIG5lZWQgdG8gbW9kaWZ5Ci0gKiB5b3VyIFZOQyB2aWV3ZXIgb3Igc2VydmVyIHRvIGRpc2NhcmQgKG9yIGluc2VydCkgdGhpcyBleHRyYSBkYXRhLgotICoKLSAqIFRoaXMgdG9vbCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBSRkIgcHJvdG9jb2w6IGl0IHNpbXBseQotICogZW5jcnlwdHMvZGVjcnlwdHMgYSBzdHJlYW0gdXNpbmcgYSBzeW1tZXRyaWMgY2lwaGVyLCBhcmM0IGFuZCBhZXN2MiwKLSAqIChvdGhlcnMgaGF2ZSBiZWVuIGFkZGVkLCBzZWUgdXNhZ2UpLiAgSXQgY291bGQgYmUgdXNlZCBhcyBhIGdlbmVyYWwKLSAqIGVuY3J5cHRlZCB0dW5uZWw6Ci0gKgotICogICBhbnktY2xpZW50IDw9PiB1bHRyYXZuY19kc21faGVscGVyIDwtLW5ldHdvcmstLT4gdWx0cmF2bmNfZHNtX2hlbHBlcihyZXZlcnNlIG1vZGUpIDw9PiBhbnktc2VydmVyCi0gKgotICogZS5nLiB0byBjb25uZWN0IGEgbm9uLXVsdHJhLWRzbS12bmMgdmlld2VyIHRvIGEgbm9uLXVsdHJhLWRzbS12bmMgc2VydmVyCi0gKiB3aXRob3V0IHVzaW5nIFNTSCBvciBTU0wuCi0gKgotICogSXQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGdlbmVyYWwgVENQIHJlbGF5IChubyBlbmNyeXB0aW9uLikKLSAqCi0gKiBJdCBzdXBwb3J0cyBJUHY2IGFuZCBzbyBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgSVB2NiBnYXRld2F5LgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotICogIFVTQSAgb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqCi0gKiAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UgZ2l2ZXMgcGVybWlzc2lvbgotICogIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgdWx0cmF2bmNfZHNtX2hlbHBlciB3aXRoIHRoZQotICogIE9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci0gKiAgdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotICogIHRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLSAqICBtb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi0gKiAgZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotICogIHNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgY2hhciAqdXNhZ2UgPSAKLSAgICAiXG4iCi0gICAgInVsdHJhdm5jX2RzbV9oZWxwZXI6IGEgc3ltbWV0cmljIGVuY3J5cHRpb24gdHVubmVsLiB2ZXJzaW9uIDAuMlxuIgotICAgICJcbiIKLSAgICAiICAgICAgIENyZWF0ZWQgdG8gZW5hYmxlIGVuY3J5cHRlZCBWTkMgY29ubmVjdGlvbnMgdG8gVWx0cmFWTkMsIGl0IGNhbiBhY3QgYXNcbiIKLSAgICAiICAgICAgIGEgZ2VuZXJhbCBlbmNyeXB0ZWQgdHVubmVsIGJldHdlZW4gYW55IHR3byBhcHBsaWNhdGlvbnMuICBJdCBjYW4gYWxzb1xuIgotICAgICIgICAgICAgYmUgdXNlZCBhcyBhIGdlbmVyYWwgVENQIHJlbGF5IChpLmUuIG5vIGVuY3J5cHRpb24pIG9yIGFuIElQdjYgZ2F0ZXdheS5cbiIKLSAgICAiXG4iCi0gICAgIlVzYWdlOiB1bHRyYXZuY19kc21faGVscGVyIGNpcGhlciBrZXlmaWxlIGxpc3RlbnBvcnQgcmVtb3RlaG9zdDpwb3J0XG4iCi0gICAgIiAgICAgICB1bHRyYXZuY19kc21faGVscGVyIHJlbGF5IGxpc3RlbnBvcnQgcmVtb3RlaG9zdDpwb3J0XG4iCi0gICAgIiAgICAgICB1bHRyYXZuY19kc21faGVscGVyIHNob3djZXJ0IHJlbW90ZWhvc3Q6cG9ydFxuIgotICAgICJcbiIKLSAgICAiZS5nLjogIHVsdHJhdm5jX2RzbV9oZWxwZXIgYXJjNCAuL2FyYzQua2V5IDU5MDEgc25vb3B5Lm5ldDo1OTAwXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgSVB2NiBpcyBzdXBwb3J0ZWQ6IGJvdGggSVB2NCBhbmQgSVB2NiBhcmUgYXR0ZW1wdGVkIHRvIGxpc3RlbiBvbiAocG9ydFxuIgotICAgICIgICAgICAgICAgICAgICAnbGlzdGVucG9ydCcuKSAgRm9yIGNvbm5lY3Rpb25zIHRvIHJlbW90ZWhvc3QsIGlmIElQdjQgZmFpbHNcbiIKLSAgICAiICAgICAgICAgICAgICAgdGhlbiBJUHY2IGlzIHRyaWVkLiAgU2V0IHRoZSBlbnYuIHZhciBVTFRSQVZOQ19EU01fSEVMUEVSX05PSVBWNlxuIgotICAgICIgICAgICAgICAgICAgICB0byBjb21wbGV0ZWx5IGRpc2FibGUgdGhlIHVzZSBvZiBJUHY2LlxuIgotICAgICJcbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICBjaXBoZXI6IHNwZWNpZnkgJ21zcmM0JywgJ21zcmM0X3NjJywgJ2FyYzQnLCAnYWVzdjInLCAnYWVzLWNmYicsXG4iCi0gICAgIiAgICAgICAgICAgICAgICdhZXMyNTYnLCAnYmxvd2Zpc2gnLCAnM2RlcycsICdzZWN1cmV2bmMnLlxuIgotICAgICJcbiIKLSAgICAiICAgICAgICAgICAgICAgQWxzbyAnbm9uZScsICdyZWxheScsIG9yICdzaG93Y2VydCcuICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICAnbXNyYzRfc2MnIGVuYWJsZXMgYSB3b3JrYXJvdW5kIGZvciBVVk5DIFNDIC1wbHVnaW4gdXNlLlxuIgotICAgICIgICAgICAgICAgICAoaXQgbWlnaHQgbm90IGJlIHJlcXVpcmVkIGluIFNDIGNpcmNhIDIwMDkgYW5kIGxhdGVyOyB0cnkgJ21zcmM0Jy4pXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1c2UgJ3NlY3VyZXZuYycgZm9yIFNlY3VyZVZOQ1BsdWdpbiAoUlNBIGtleSBleGNoYW5nZSkuICAna2V5ZmlsZScgaXNcbiIKLSAgICAiICAgICAgICAgICB1c2VkIGFzIGEgc2VydmVyIFJTQSBrZXlzdG9yZSBpbiB0aGlzIG1vZGUuICBJZiAna2V5ZmlsZScgZG9lcyBub3RcbiIKLSAgICAiICAgICAgICAgICBleGlzdCB0aGUgdXNlciBpcyBwcm9tcHRlZCB3aGV0aGVyIHRvIHNhdmUgdGhlIGtleSBvciBub3QgKGEgTUQ1XG4iCi0gICAgIiAgICAgICAgICAgaGFzaCBvZiBpdCBpcyBzaG93bikgIElmICdrZXlmaWxlJyBhbHJlYWR5IGV4aXN0cyB0aGUgc2VydmVyIGtleVxuIgotICAgICIgICAgICAgICAgIG11c3QgbWF0Y2ggaXRzIGNvbnRlbnRzIG9yIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICAgIEhPV0VWRVIsIGlmICdrZXlmaWxlJyBlbmRzIGluIHRoZSBzdHJpbmcgJ0NsaWVudEF1dGgucGtleScsIHRoZW4gdGhlXG4iCi0gICAgIiAgICAgICAgICAgbm9ybWFsIFNlY3VyZVZOQ1BsdWdpbiBjbGllbnQga2V5IGF1dGhlbnRpY2F0aW9uIGlzIHBlcmZvcm1lZC5cbiIKLSAgICAiICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBkbyBib3RoIGhhdmUgJ2tleWZpbGUnIGVuZCB3aXRoICdDbGllbnRBdXRoLnBrZXkucnNhJ1xuIgotICAgICIgICAgICAgICAgIHRoYXQgZmlsZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBSU0Ega2V5c3RvcmUsIGFuZCB0aGUgJy5yc2EnIHdpbGwgYmVcbiIKLSAgICAiICAgICAgICAgICB0cmltbWVkIG9mZiBhbmQgdGhlIHJlbWFpbmluZyBuYW1lIHVzZWQgYXMgdGhlIENsaWVudCBBdXRoIGZpbGUuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1c2UgJy4nIHRvIGhhdmUgaXQgdHJ5IHRvIGd1ZXNzIHRoZSBjaXBoZXIgZnJvbSB0aGUga2V5ZmlsZSBuYW1lLFxuIgotICAgICIgICAgICAgICAgIGUuZy4gJ2FyYzQua2V5JyBpbXBsaWVzIGFyYzQsICdyYzQua2V5JyBpbXBsaWVzIG1zcmM0LCBldGMuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1c2UgJ3JldjphcmM0JywgZXRjLiB0byByZXZlcnNlIHRoZSByb2xlcyBvZiBlbmNyeXB0ZXIgYW5kIGRlY3J5cHRlci5cbiIKLSAgICAiICAgICAgICAgICAoaS5lLiBpZiB5b3Ugd2FudCB0byB1c2UgaXQgZm9yIGEgdm5jIHNlcnZlciwgbm90IHZuYyB2aWV3ZXIpXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1c2UgJ25vdWx0cmE6Li4uJyB0byBza2lwIHN0ZXBzIGludm9sdmluZyBzYWx0IGFuZCBJViB0byB0cnkgdG8gYmVcbiIKLSAgICAiICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggVWx0cmFWTkMgRFNNLCBpLmUuIGFzc3VtZSBhIG5vcm1hbCBzeW1tZXRyaWMgY2lwaGVyXG4iCi0gICAgIiAgICAgICAgICAgYXQgdGhlIG90aGVyIGVuZC5cbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICAgIHVzZSAnbm91bHRyYTpyZXY6Li4uJyBpZiBib3RoIGFyZSB0byBiZSBzdXBwbGllZC5cbiIKLSAgICAiXG4iCi0gICAgIlxuIgotICAgICIgICAgICAga2V5ZmlsZTogZmlsZSBob2xkaW5nIHRoZSBrZXkgKDE2IGJ5dGVzIGZvciBhcmM0IGFuZCBhZXN2MiwgODcgZm9yIG1zcmM0KVxuIgotICAgICIgICAgICAgICAgIEUuZy4gZGQgaWY9L2Rldi9yYW5kb20gb2Y9Li9teS5rZXkgYnM9MTYgY291bnQ9MVxuIgotICAgICIgICAgICAgICAgIGtleWZpbGUgY2FuIGFsc28gYmUgcHc9PHN0cmluZz4gdG8gdXNlIFwic3RyaW5nXCIgZm9yIHRoZSBrZXkuXG4iCi0gICAgIiAgICAgICAgICAgT3IgZm9yICdzZWN1cmV2bmMnIHRoZSBSU0Ega2V5c3RvcmUgYW5kL29yIENsaWVudEF1dGggZmlsZS5cbiIKLSAgICAiXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgbGlzdGVucG9ydDogcG9ydCB0byBsaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb24gb24uICh1c2UgMCB0byBjb25uZWN0XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICB0byBzdGRpbywgdXNlIGEgbmVnYXRpdmUgdmFsdWUgdG8gZm9yY2UgbG9jYWxob3N0IGxpc3RlbmluZylcbiIKLSAgICAiXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgcmVtb3RlaG9zdDpwb3J0OiBob3N0IGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8uIChlLmcuIHVsdHJhdm5jIHNlcnZlcilcbiIKLSAgICAiXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgQWxzbzogY2lwaGVyIG1heSBiZSBjaXBoZXJAbixtIHdoZXJlIG4gaXMgdGhlIHNhbHQgc2l6ZSBhbmQgbSBpcyB0aGVcbiIKLSAgICAiICAgICAgIGluaXRpYWxpemF0aW9uIHZlY3RvciBzaXplLiBFLmcuIGFlc3YyQDgsMTYgIFVzZSBuPS0xIHRvIGRpc2FibGUgc2FsdFxuIgotICAgICIgICAgICAgYW5kIHRoZSBNRDUgaGFzaCAoaS5lLiBpbnNlcnQgdGhlIGtleWRhdGEgZGlyZWN0bHkgaW50byB0aGUgY2lwaGVyLilcbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICBVc2UgY2lwaGVyQG1kK24sbSB0byBjaGFuZ2UgdGhlIG1lc3NhZ2UgZGlnZXN0LiBFLmcuIGFyYzRAc2hhKzgsMTZcbiIKLSAgICAiICAgICAgIFN1cHBvcnRlZDogJ21kNScsICdzaGEnLCAnc2hhMScsICdyaXBlbWQxNjAnLlxuIgotICAgICJcbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICBUQ1AgUmVsYXkgbW9kZTogdG8gY29ubmVjdCB3aXRob3V0IGFueSBlbmNyeXB0aW9uIHVzZSBhIGNpcGhlciB0eXBlIG9mXG4iCi0gICAgIiAgICAgICBlaXRoZXIgJ3JlbGF5JyBvciAnbm9uZScgKGJvdGggYXJlIHRoZSBlcXVpdmFsZW50KTpcbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICAgIHVsdHJhdm5jX2RzbV9oZWxwZXIgcmVsYXkgbGlzdGVucG9ydCByZW1vdGVob3N0OnBvcnRcbiIKLSAgICAiICAgICAgICAgdWx0cmF2bmNfZHNtX2hlbHBlciBub25lICBsaXN0ZW5wb3J0IHJlbW90ZWhvc3Q6cG9ydFxuIgotICAgICJcbiIKLSAgICAiICAgICAgIHdoZXJlICdyZWxheScgb3IgJ25vbmUnIGlzIGEgbGl0ZXJhbCBzdHJpbmcuXG4iCi0gICAgIiAgICAgICBOb3RlIHRoYXQgZm9yIHRoaXMgbW9kZSBubyBrZXlmaWxlIGlzIHN1cHBsZWQuXG4iCi0gICAgIiAgICAgICBOb3RlIHRoYXQgdGhpcyBtb2RlIGNhbiBhY3QgYXMgYW4gSVB2NCB0byBJUHY2IGdhdGV3YXkuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1bHRyYXZuY19kc21faGVscGVyIHJlbGF5IDgwODAgaXB2Ni5iZWlqaW5nMjAwOC5jbjo4MFxuIgotICAgICJcbiIKLSAgICAiXG4iCi0gICAgIiAgICAgICBTU0wgU2hvdyBDZXJ0aWZpY2F0ZSBtb2RlOiAgU2V0IHRoZSBjaXBoZXIgdG8gJ3Nob3djZXJ0JyB0byBmZXRjaFxuIgotICAgICIgICAgICAgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBmcm9tIHJlbW90ZWhvc3Q6cG9ydCBhbmQgcHJpbnQgaXQgdG8gdGhlIHN0ZG91dC5cbiIKLSAgICAiICAgICAgIE5vIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIG9yIHZlcmlmaWNhdGlvbiBpcyBwZXJmb3JtZWQuICBFLmcuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgICB1bHRyYXZuY19kc21faGVscGVyIHNob3djZXJ0IHd3dy52ZXJpc2lnbi5jb206NDQzXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgKHRoZSBvdXRwdXQgcmVzZW1ibGVzIHRoYXQgb2YgJ29wZW5zc2wgc19jbGllbnQgLi4uJykgIFNldCB0aGUgZW52IHZhclxuIgotICAgICIgICAgICAgVUxUUkFWTkNfRFNNX0hFTFBFUl9TSE9XQ0VSVF9BREg9MSBmb3IgQW5vbnltb3VzIERpZmZpZSBIZWxsbWFuIG1vZGUuXG4iCi0gICAgIlxuIgotICAgICJcbiIKLSAgICAiICAgICAgIExvb3BpbmcgTW9kZTogIFNldCB0aGUgZW52LiB2YXIuIFVMVFJBVk5DX0RTTV9IRUxQRVJfTE9PUD0xIHRvIGhhdmUgaXRcbiIKLSAgICAiICAgICAgIHJlc3RhcnQgaXRzZWxmIGFmdGVyIGV2ZXJ5IGRpc2Nvbm5lY3Rpb24gaW4gYW4gZW5kbGVzcyBsb29wLiAgSXQgcGF1c2VzXG4iCi0gICAgIiAgICAgICA1MDAgbXNlYyBiZWZvcmUgcmVzdGFydGluZy4gIFVzZSBVTFRSQVZOQ19EU01fSEVMUEVSX0xPT1A9TiB0byBzZXQgdGhlXG4iCi0gICAgIiAgICAgICBwYXVzZSB0byBOIG1zZWMuXG4iCi0gICAgIlxuIgotICAgICIgICAgICAgWW91IGNhbiBhbHNvIHNldCB0aGUgZW52LiB2YXIuIFVMVFJBVk5DX0RTTV9IRUxQRVJfQkcgdG8gaGF2ZSB0aGVcbiIKLSAgICAiICAgICAgIHByb2dyYW0gZm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kIGZvciBlYWNoIGNvbm5lY3Rpb24sIHRoZXJlYnkgYWN0aW5nXG4iCi0gICAgIiAgICAgICBhcyBhIHNpbXBsZSBkYWVtb24uXG4iCi07Ci0KLS8qCi0gKiBXZSBjYW4gYWxzbyBydW4gYXMgYSBtb2R1bGUgaW5jbHVkZWQgaW50byB4MTF2bmMgKC1lbmMgb3B0aW9uKQotICogVGhlIGluY2x1ZGVyIG11c3Qgc2V0IEVOQ19NT0RVTEUgYW5kIEVOQ19IQVZFX09QRU5TU0wuCi0gKgotICogTm90ZSB0aGF0IHdoZW4gcnVubmluZyBhcyBhIG1vZHVsZSB3ZSBzdGlsbCBhc3N1bWUgd2UgaGF2ZSBiZWVuCi0gKiBmb3JrZWQgb2ZmIG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBhbmQgYXJlIGNvbW11bmljYXRpbmcgYmFjayB0byBpdAotICogdmlhIGEgc29ja2V0LiAgU28gd2UgKnN0aWxsKiBleGl0KDMpIGF0IHRoZSBlbmQgb3Igb24gZXJyb3IuICBBbmQKLSAqIHRoZSBnbG9iYWwgc2V0dGluZ3Mgd29uJ3Qgd29yay4KLSAqLwotI2lmZGVmIEVOQ19NT0RVTEUKLSMgIGRlZmluZSBtYWluIF9fZW5jX21haW4KLXN0YXRpYyBjaGFyICpwcm9nID0gImVuY19oZWxwZXIiOwotI2Vsc2UKLSMgIGRlZmluZSBFTkNfSEFWRV9PUEVOU1NMIDEKLXN0YXRpYyBjaGFyICpwcm9nID0gInVsdHJhdm5jX2RzbV9oZWxwZXIiOwotI2VuZGlmCi0KLS8qIHVuaXggaW5jbHVkZXMgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotCi0vKiBTb2xhcmlzIChzeXN2PykgbmVlZHMgSU5BRERSX05PTkUgKi8KLSNpZm5kZWYgSU5BRERSX05PTkUKLSNkZWZpbmUgSU5BRERSX05PTkUgKChpbl9hZGRyX3QpIDB4ZmZmZmZmZmYpCi0jZW5kaWYKLQotLyogb3BlbnNzbCBpbmNsdWRlcyAqLwotI2lmIEVOQ19IQVZFX09QRU5TU0wKLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+Ci1zdGF0aWMgY29uc3QgRVZQX0NJUEhFUiAqQ2lwaGVyOwotc3RhdGljIGNvbnN0IEVWUF9NRCAqRGlnZXN0OwotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICpjaXBoZXIgPSBOVUxMOwkvKiBuYW1lIG9mIGNpcGhlciwgZS5nLiAiYWVzdjIiICovCi1zdGF0aWMgaW50IHJldmVyc2UgPSAwOwkJLyogbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KLXN0YXRpYyBpbnQgbXNyYzRfc2MgPSAwOwkvKiBlbmFibGVzIHdvcmthcm91bmQgZm9yIFNDIEkvSUkgKi8KLXN0YXRpYyBpbnQgbm91bHRyYSA9IDA7CQkvKiBtYW5hZ2Ugc2FsdC9pdiBkaWZmZXJlbnRseSBmcm9tIHVsdHJhZHNtICovCi1zdGF0aWMgaW50IG5vbWQgPSAwOwkJLyogdXNlIHRoZSBrZXlkYXRhIGRpcmVjdGx5LCBubyBtZDUgb3Igc2FsdCAqLwotc3RhdGljIGludCBwd19pbiA9IDA7CQkvKiBwdz0uLi4uIHJlYWQgaW4gKi8KLQotCi0vKiBUaGUgZGF0YSB0aGF0IHdhcyByZWFkIGluIGZyb20ga2V5IGZpbGUgKG9yIHB3PXBhc3N3b3JkKSAqLwotc3RhdGljIGNoYXIga2V5ZGF0YVsxMDI0XTsKLXN0YXRpYyBpbnQga2V5ZGF0YV9sZW47Ci0KLS8qIFNpemUgb2Ygc2FsdCBhbmQgSVY7IGJhc2VkIG9uIFVsdHJhVk5DIERTTSAqLwotI2RlZmluZSBTQUxUIDE2Ci0jZGVmaW5lIE1TUkM0X1NBTFQgMTEKLSNkZWZpbmUgSVZFQyAxNgotCi0vKiBTZXQgZGVmYXVsdCB2YWx1ZXMgb2Ygc2FsdCBhbmQgSVYgKi8KLXN0YXRpYyBpbnQgc2FsdF9zaXplID0gU0FMVDsKLXN0YXRpYyBpbnQgaXZlY19zaXplID0gSVZFQzsKLQotLyogVG8gdHJhY2sgcGFyZW50IGFuZCBjaGlsZCBwaWRzICovCi1zdGF0aWMgcGlkX3QgcGFyZW50LCBjaGlsZDsKLQotLyogdHJhbnNmZXIgYnVmZmVyIHNpemUgKi8KLSNkZWZpbmUgQlNJWkUgODE5MgotCi0vKiBTb21lIHZlcnkgdmVyYm9zZSBkZWJ1Z2dpbmcgc3R1ZmYgSSBlbmFibGUgZm9yIHRlc3RpbmcgKi8KLSNpZmRlZiBEQkcKLSMgIGluY2x1ZGUgImRiZy5oIgotI2Vsc2UKLSMgIGRlZmluZSBERUNfQ1RfREJHKHAsIG4pCi0jICBkZWZpbmUgREVDX1BUX0RCRyhwLCBuKQotIyAgZGVmaW5lIEVOQ19DVF9EQkcocCwgbikKLSMgIGRlZmluZSBFTkNfUFRfREJHKHAsIG4pCi0jICBkZWZpbmUgUFJJTlRfSVZFQwotIyAgZGVmaW5lIFBSSU5UX0tFWURBVEEKLSMgIGRlZmluZSBQUklOVF9LRVlTVFJfQU5EX0ZSSUVORFMKLSMgIGRlZmluZSBQUklOVF9MT09QX0RCRzEKLSMgIGRlZmluZSBQUklOVF9MT09QX0RCRzIKLSMgIGRlZmluZSBQUklOVF9MT09QX0RCRzMKLSNlbmRpZgotCi0vKiBTZWN1cmVWTkNQbHVnaW4gZnJvbTogaHR0cDovL2FkYW13YWxsaW5nLmNvbS9TZWN1cmVWTkMvICovCi0jZGVmaW5lIFNFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkUgMjcwCi0jZGVmaW5lIFNFQ1VSRVZOQ19FTkNSWVBURURfS0VZX1NJWkUgMjU2Ci0jZGVmaW5lIFNFQ1VSRVZOQ19TSUdOQVRVUkVfU0laRSAyNTYKLSNkZWZpbmUgU0VDVVJFVk5DX0tFWV9TSVpFIDE2Ci0jZGVmaW5lIFNFQ1VSRVZOQ19SRVNFUlZFRF9TSVpFIDQKLSNkZWZpbmUgU0VDVVJFVk5DX1JDNF9EUk9QX0JZVEVTIDMwNzIKLSNkZWZpbmUgU0VDVVJFVk5DX1JBTkRfS0VZX1NPVVJDRSAxMDI0Ci1zdGF0aWMgaW50IHNlY3VyZXZuYyA9IDA7Ci1zdGF0aWMgaW50IHNlY3VyZXZuY19hcmM0ID0gMDsKLXN0YXRpYyBjaGFyICpzZWN1cmV2bmNfZmlsZSA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIGVuY19jb25uZWN0aW9ucyhpbnQsIGNoYXIqLCBpbnQpOwotCi0jaWYgIUVOQ19IQVZFX09QRU5TU0wKLQotLyogSW4gY2FzZSB3ZSBhcmUgYSBtb2R1bGUgYW5kIHRoZXJlIGlzIG5vIE9wZW5TU0wgYnVpbGR0aW1lIHN1cHBvcnQgKi8KLQotZXh0ZXJuIHZvaWQgZW5jX2RvKGNoYXIgKmNpcGgsIGNoYXIgKmtleWZpbGUsIGNoYXIgKmxwb3J0LCBjaGFyICpyaHApIHsgCi0JZnByaW50ZihzdGRlcnIsICIlczogbm90IGNvbXBpbGVkIHdpdGggT3BlblNTTFxuIiwgcHJvZyk7Ci0JZXhpdCgxKTsKLX0KLQotI2Vsc2UKLQotI2lmIGRlZmluZWQoTk9fRVZQX2Flc18yNTZfY2ZiKSB8fCAoZGVmaW5lZCAoX19TVlI0KSAmJiBkZWZpbmVkIChfX3N1bikgJiYgIWRlZmluZWQoRVZQX2Flc18yNTZfY2ZiKSAmJiAhZGVmaW5lZChBU1NVTUVfRVZQX2Flc18yNTZfY2ZiKSkKLS8qCi0gKiBGb3IgU29sYXJpcyAxMCBtaXNzaW5nIDE5MiAmIDI1NiBiaXQgY3J5cHRvLgotICogTm90ZSB0aGF0IEVWUF9hZXNfMjU2X2NmYiBpcyBhIG1hY3JvLgotICovCi0jdW5kZWYgRVZQX2Flc18yNTZfY2ZiCi0jZGVmaW5lIEVWUF9hZXNfMjU2X2NmYigpIEVWUF9hZXNfMTI4X2NmYigpOyB7ZnByaW50ZihzdGRlcnIsICJOb3QgY29tcGlsZWQgd2l0aCBFVlBfYWVzXzI1Nl9jZmIoKSAnYWVzMjU2JyBzdXBwb3J0LlxuIik7IGV4aXQoMSk7fQotI2VuZGlmCi0KLS8qIElmIHdlIGFyZSBhIG1vZHVsZSwgZW5jX2RvKCkgaXMgdGhlIG9ubHkgaW50ZXJmYWNlIHdlIGV4cG9ydC4gICovCi0KLQotLyogVGhpcyB3b3JrcyBvdXQga2V5IHR5cGUgJiBldGMuLCByZWFkcyBrZXksIGNhbGxzIGVuY19jb25uZWN0aW9ucyAqLwotCi1leHRlcm4gdm9pZCBlbmNfZG8oY2hhciAqY2lwaCwgY2hhciAqa2V5ZmlsZSwgY2hhciAqbHBvcnQsIGNoYXIgKnJocCkgeyAKLQotCXN0cnVjdCBzdGF0IHNiOwotCWNoYXIgKnEsICpwLCAqY29ubmVjdF9ob3N0OwotCWNoYXIgdG1wWzE2XTsKLQlpbnQgZmQsIGxlbiA9IDAsIGxpc3Rlbl9wb3J0ID0gMCwgY29ubmVjdF9wb3J0LCBtYml0czsKLQotCXEgPSBjaXBoOwotCi0JLyogY2hlY2sgZm9yIG5vdWx0cmEgbW9kZTogKi8KLQlpZiAoc3Ryc3RyKHEsICJub3VsdHJhOiIpID09IHEpIHsKLQkJbm91bHRyYSA9IDE7Ci0JCXEgKz0gc3RybGVuKCJub3VsdHJhOiIpOwotCX0KLQotCS8qIGNoZWNrIGZvciByZXZlcnNlIG1vZGU6ICovCi0JaWYgKHN0cnN0cihxLCAicmV2OiIpID09IHEpIHsKLQkJcmV2ZXJzZSA9IDE7Ci0JCXEgKz0gc3RybGVuKCJyZXY6Iik7Ci0JfQotCi0JLyogd29yayBvdXQgd2hpY2ggY2lwaGVyIGFuZCBzZXQgQ2lwaGVyIHRvIHRoZSBzZWxlY3RlZCBvbmUuICovCi0JaWYgKCFzdHJjYXNlY21wKHEsICJtc3JjNCIpKSB7Ci0JCUNpcGhlciA9IEVWUF9yYzQoKTsJCWNpcGhlciA9ICJtc3JjNCI7Ci0KLQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHEsICJtc3JjNF9zYyIpKSB7Ci0JCUNpcGhlciA9IEVWUF9yYzQoKTsJCWNpcGhlciA9ICJtc3JjNCI7Ci0JCW1zcmM0X3NjID0gMTsJCQkvKiBubyBzYWx0L2l2IHdvcmthcm91bmQgKi8KLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICJhcmM0IikgPT0gcSkgewotCQlDaXBoZXIgPSBFVlBfcmM0KCk7CQljaXBoZXIgPSAiYXJjNCI7Ci0KLQl9IGVsc2UgaWYgKHN0cnN0cihxLCAiYWVzdjIiKSA9PSBxIHx8IHN0cnN0cihxLCAiYWVzLW9mYiIpID09IHEpIHsKLQkJQ2lwaGVyID0gRVZQX2Flc18xMjhfb2ZiKCk7CWNpcGhlciA9ICJhZXN2MiI7Ci0KLQl9IGVsc2UgaWYgKHN0cnN0cihxLCAiYWVzLWNmYiIpID09IHEpIHsKLQkJQ2lwaGVyID0gRVZQX2Flc18xMjhfY2ZiKCk7CWNpcGhlciA9ICJhZXMtY2ZiIjsKLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICJhZXMyNTYiKSA9PSBxKSB7Ci0JCUNpcGhlciA9IEVWUF9hZXNfMjU2X2NmYigpOwljaXBoZXIgPSAiYWVzMjU2IjsKLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICJibG93ZmlzaCIpID09IHEpIHsKLQkJQ2lwaGVyID0gRVZQX2JmX2NmYigpOwkJY2lwaGVyID0gImJsb3dmaXNoIjsKLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICIzZGVzIikgPT0gcSkgewotCQlDaXBoZXIgPSBFVlBfZGVzX2VkZTNfY2ZiKCk7CWNpcGhlciA9ICIzZGVzIjsKLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICJzZWN1cmV2bmMiKSA9PSBxKSB7Ci0JCUNpcGhlciA9IEVWUF9hZXNfMTI4X29mYigpOwljaXBoZXIgPSAic2VjdXJldm5jIjsKLQkJc2VjdXJldm5jID0gMTsKLQotCX0gZWxzZSBpZiAoc3Ryc3RyKHEsICJub25lIikgPT0gcSB8fCBzdHJzdHIocSwgInJlbGF5IikgPT0gcSkgewotCQljaXBoZXIgPSAibm9uZSI7Ci0KLQl9IGVsc2UgaWYgKHN0cnN0cihxLCAic2hvd2NlcnQiKSA9PSBxKSB7Ci0JCWNpcGhlciA9ICJzaG93Y2VydCI7Ci0KLQl9IGVsc2UgaWYgKHN0cnN0cihxLCAiLiIpID09IHEpIHsKLQkJLyogb3RoZXJ3aXNlLCB0cnkgdG8gZ3Vlc3MgY2lwaGVyIGZyb20ga2V5IGZpbGVuYW1lOiAqLwotCQlpZiAoc3Ryc3RyKGtleWZpbGUsICJhcmM0LmtleSIpKSB7Ci0JCQlDaXBoZXIgPSBFVlBfcmM0KCk7CQljaXBoZXIgPSAiYXJjNCI7Ci0KLQkJfSBlbHNlIGlmIChzdHJzdHIoa2V5ZmlsZSwgInJjNC5rZXkiKSkgewotCQkJQ2lwaGVyID0gRVZQX3JjNCgpOwkJY2lwaGVyID0gIm1zcmM0IjsKLQotCQl9IGVsc2UgaWYgKHN0cnN0cihrZXlmaWxlLCAiYWVzdjIua2V5IikpIHsKLQkJCUNpcGhlciA9IEVWUF9hZXNfMTI4X29mYigpOwljaXBoZXIgPSAiYWVzdjIiOwotCi0JCX0gZWxzZSBpZiAoc3Ryc3RyKGtleWZpbGUsICJhZXMtY2ZiLmtleSIpKSB7Ci0JCQlDaXBoZXIgPSBFVlBfYWVzXzEyOF9jZmIoKTsJY2lwaGVyID0gImFlcy1jZmIiOwotCi0JCX0gZWxzZSBpZiAoc3Ryc3RyKGtleWZpbGUsICJhZXMyNTYua2V5IikpIHsKLQkJCUNpcGhlciA9IEVWUF9hZXNfMjU2X2NmYigpOwljaXBoZXIgPSAiYWVzMjU2IjsKLQotCQl9IGVsc2UgaWYgKHN0cnN0cihrZXlmaWxlLCAiYmxvd2Zpc2gua2V5IikpIHsKLQkJCUNpcGhlciA9IEVWUF9iZl9jZmIoKTsJCWNpcGhlciA9ICJibG93ZmlzaCI7Ci0KLQkJfSBlbHNlIGlmIChzdHJzdHIoa2V5ZmlsZSwgIjNkZXMua2V5IikpIHsKLQkJCUNpcGhlciA9IEVWUF9kZXNfZWRlM19jZmIoKTsJY2lwaGVyID0gIjNkZXMiOwotCi0JCX0gZWxzZSBpZiAoc3Ryc3RyKGtleWZpbGUsICJzZWN1cmV2bmMuIikpIHsKLQkJCUNpcGhlciA9IEVWUF9hZXNfMTI4X29mYigpOwljaXBoZXIgPSAic2VjdXJldm5jIjsKLQkJCXNlY3VyZXZuYyA9IDE7Ci0KLQkJfSBlbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IGZpZ3VyZSBvdXQgY2lwaGVyLCBzdXBwbHkgJ21zcmM0JywgJ2FyYzQnLCBvciAnYWVzdjInIC4uLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJjYW5ub3QgZmlndXJlIG91dCBjaXBoZXIsIHN1cHBseSAnbXNyYzQnLCAnYXJjNCcsIG9yICdhZXN2MicgLi4uXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZSBkaWdlc3QgKG1kNSkgKi8KLQlpZiAoIXNlY3VyZXZuYykgewotCQlEaWdlc3QgPSBFVlBfbWQ1KCk7Ci0JfSBlbHNlIHsKLQkJRGlnZXN0ID0gRVZQX3NoYTEoKTsKLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIHVzZXIgc3BlY2lmaWVkIHNhbHQgYW5kIElWIHNpemVzIGF0IHRoZSBlbmQKLQkgKiAoIGNpcGhAc2FsdCxpdiBhbmQgY2lwaEBbbWQrXXNhbHQsaXYgKToKLQkgKi8KLQlwID0gc3RyY2hyKHEsICdAJyk7Ci0JaWYgKHApIHsKLQkJaW50IHMsIHY7Ci0JCXArKzsKLQkJaWYgKHN0cnN0cihwLCAibWQ1KyIpID09IHApIHsKLQkJCURpZ2VzdCA9IEVWUF9tZDUoKTsgICAgICAgIHAgKz0gc3RybGVuKCJtZDUrIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJzaGErIikgPT0gcCkgewotCQkJRGlnZXN0ID0gRVZQX3NoYSgpOyAgICAgICAgcCArPSBzdHJsZW4oInNoYSsiKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInNoYTErIikgPT0gcCkgewotCQkJRGlnZXN0ID0gRVZQX3NoYTEoKTsgICAgICAgcCArPSBzdHJsZW4oInNoYTErIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJyaXBlKyIpID09IHApIHsKLQkJCURpZ2VzdCA9IEVWUF9yaXBlbWQxNjAoKTsgIHAgKz0gc3RybGVuKCJyaXBlKyIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAicmlwZW1kMTYwKyIpID09IHApIHsKLQkJCURpZ2VzdCA9IEVWUF9yaXBlbWQxNjAoKTsgIHAgKz0gc3RybGVuKCJyaXBlbWQxNjArIik7Ci0JCX0KLQkJaWYgKHNzY2FuZihwLCAiJWQsJWQiLCAmcywgJnYpID09IDIpIHsKLQkJCS8qIGNpcGhlckBuLG0gKi8KLQkJCWlmICgtMSA8PSBzICYmIHMgPD0gU0FMVCkgewotCQkJCXNhbHRfc2l6ZSA9IHM7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgc2FsdCBzaXplOiAlZFxuIiwKLQkJCQkgICAgcHJvZywgcyk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWlmICgwIDw9IHYgJiYgdiA8PSBFVlBfTUFYX0lWX0xFTkdUSCkgewotCQkJCWl2ZWNfc2l6ZSA9IHY7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgSVYgc2l6ZTogJWRcbiIsCi0JCQkJICAgIHByb2csIHYpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKHAsICIlZCIsICZzKSA9PSAxKSB7Ci0JCQkvKiBjaXBoZXJAbiAqLwotCQkJaWYgKC0xIDw9IHMgJiYgcyA8PSBTQUxUKSB7Ci0JCQkJc2FsdF9zaXplID0gczsKLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBzYWx0IHNpemU6ICVkXG4iLAotCQkJCSAgICBwcm9nLCBzKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQl9Ci0JCWlmIChzYWx0X3NpemUgPT0gLTEpIHsKLQkJCS8qIGxldCBzYWx0ID0gLTEgbWVhbiBza2lwIGJvdGggTUQ1IGFuZCBzYWx0ICovCi0JCQlub21kID0gMTsKLQkJCXNhbHRfc2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKiBwb3J0IHRvIGxpc3RlbiBvbiAoMCA9PiBzdGRpbywgbmVnYXRpdmUgPT4gbG9jYWxob3N0KSAqLwotCWlmIChscG9ydCAhPSBOVUxMKSB7Ci0JCWxpc3Rlbl9wb3J0ID0gYXRvaShscG9ydCk7Ci0JfQotCi0JLyogZXh0cmFjdCByZW1vdGUgaG9zdG5hbWUgYW5kIHBvcnQgKi8KLQlxID0gc3RycmNocihyaHAsICc6Jyk7Ci0JaWYgKHEpIHsKLQkJY29ubmVjdF9wb3J0ID0gYXRvaShxKzEpOwotCQkqcSA9ICdcMCc7Ci0JfSBlbHNlIHsKLQkJLyogb3RoZXJ3aXNlIGd1ZXNzIFZOQyBkaXNwbGF5IDAgLi4uICovCi0JCWNvbm5lY3RfcG9ydCA9IDU5MDA7Ci0JfQotCWNvbm5lY3RfaG9zdCA9IHN0cmR1cChyaHApOwotCi0JLyogY2hlY2sgZm9yIGFuZCByZWFkIGluIHRoZSBrZXkgZmlsZSAqLwotCW1lbXNldChrZXlkYXRhLCAwLCBzaXplb2Yoa2V5ZGF0YSkpOwotCi0JaWYgKCFzdHJjbXAoY2lwaGVyLCAibm9uZSIpKSB7Ci0JCWdvdG8gcmVhZGVkX2luOwotCX0KLQlpZiAoIXN0cmNtcChjaXBoZXIsICJzaG93Y2VydCIpKSB7Ci0JCWdvdG8gcmVhZGVkX2luOwotCX0KLQotCWlmIChzZWN1cmV2bmMpIHsKLQkJLyogbm90ZSB0aGUga2V5ZmlsZSBmb3IgcnNhIHZlcmlmaWNhdGlvbiBsYXRlciAqLwotCQlpZiAoa2V5ZmlsZSAhPSBOVUxMICYmIHN0cmNhc2VjbXAoa2V5ZmlsZSwgIm5vbmUiKSkgewotCQkJc2VjdXJldm5jX2ZpbGUgPSBrZXlmaWxlOwotCQl9Ci0JCWdvdG8gcmVhZGVkX2luOwotCX0KLQotCWlmIChzdGF0KGtleWZpbGUsICZzYikgIT0gMCkgewotCQlpZiAoc3Ryc3RyKGtleWZpbGUsICJwdz0iKSA9PSBrZXlmaWxlKSB7Ci0JCQkvKiB1c2VyIHNwZWNpZmllZCBrZXkvcGFzc3dvcmQgb24gY21kbGluZSAqLwotCQkJaW50IGk7Ci0JCQlsZW4gPSAwOwotCQkJcHdfaW4gPSAxOwotCQkJZm9yIChpPTA7IGkgPCAoaW50KSBzdHJsZW4oa2V5ZmlsZSk7IGkrKykgewotCQkJCS8qIGxvYWQgdGhlIHN0cmluZyB0byBrZXlkYXRhOiAqLwotCQkJCWludCBuID0gaSArIHN0cmxlbigicHc9Iik7Ci0JCQkJa2V5ZGF0YVtpXSA9IGtleWZpbGVbbl07Ci0JCQkJaWYgKGtleWZpbGVbbl0gPT0gJ1wwJykgYnJlYWs7Ci0JCQkJbGVuKys7Ci0JCQkJaWYgKGkgPiAxMDApIGJyZWFrOwotCQkJfQotCQkJZ290byByZWFkZWRfaW47Ci0JCX0KLQkJLyogb3RoZXJ3aXNlIGludmFsaWQgZmlsZSAqLwotCQlwZXJyb3IoInN0YXQiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKHNiLnN0X3NpemUgPiAxMDI0KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXM6IGtleSBmaWxlIHRvbyBiaWcuXG4iLCBwcm9nKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZmQgPSBvcGVuKGtleWZpbGUsIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKSB7Ci0JCXBlcnJvcigib3BlbiIpOwotCQlleGl0KDEpOwotCX0KLQotCS8qIHJlYWQgaXQgYWxsIGluICovCi0JbGVuID0gKGludCkgcmVhZChmZCwga2V5ZGF0YSwgKHNpemVfdCkgc2Iuc3Rfc2l6ZSk7Ci0JaWYgKGxlbiAhPSBzYi5zdF9zaXplKSB7Ci0JCXBlcnJvcigicmVhZCIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiVzLCBjb3VsZCBub3QgcmVhZCBrZXkgZmlsZS5cbiIsIHByb2cpOwotCQlleGl0KDEpOwotCX0KLQljbG9zZShmZCk7Ci0KLQlyZWFkZWRfaW46Ci0KLQotCS8qIGNoZWNrIGZvciB1bHRyYXZuYyBtc3JjNCBmb3JtYXQgJ3JjNC5rZXknICovCi0JbWJpdHMgPSAwOwotCWlmIChzdHJzdHIoa2V5ZGF0YSwgIjEyOCBiaXQiKSA9PSBrZXlkYXRhKSB7Ci0JCW1iaXRzID0gMTI4OwotCX0gZWxzZSBpZiAoc3Ryc3RyKGtleWRhdGEsICIgNTYgYml0IikgPT0ga2V5ZGF0YSkgewotCQltYml0cyA9IDU2OwotCX0gZWxzZSBpZiAoc3Ryc3RyKGtleWRhdGEsICIgNDAgYml0IikgPT0ga2V5ZGF0YSkgewotCQltYml0cyA9IDQwOwotCX0KLQlpZiAobWJpdHMgPiAwKSB7Ci0JCS8qIDQgaXMgZm9yIGludCBrZXkgbGVuZ3RoLCAxMiBpcyBmb3IgQkxPQkhFQURFUi4gKi8KLQkJaW50IGksIG9mZnNldCA9IHN0cmxlbigieHh4IGJpdCIpICsgNCArIDEyOwotCi0JCS8qIHRoZSBrZXkgaXMgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIhICovCi0JCWxlbiA9IG1iaXRzLzg7Ci0JCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRtcFtpXSA9IGtleWRhdGFbb2Zmc2V0ICsgbGVuIC0gaSAtIDFdOwotCQl9Ci0KLQkJLyogY2xlYXIga2V5ZGF0YSBhbmQgdGhlbiBjb3B5IHRoZSByZXZlcnNlZCBieXRlcyB0aGVyZTogKi8KLQkJbWVtc2V0KGtleWRhdGEsIDAsIHNpemVvZihrZXlkYXRhKSk7Ci0JCW1lbWNweShrZXlkYXRhLCB0bXAsIGxlbik7Ci0JfQotCi0Ja2V5ZGF0YV9sZW4gPSBsZW47Ci0KLQkvKiBpbml0aWFsaXplIHJhbmRvbSAqLwotCVJBTkRfcG9sbCgpOwotCi0JLyoKLQkgKiBTZXR1cCBjb25uZWN0aW9ucywgdGhlbiB0cmFuc2ZlciBkYXRhIHdoZW4gdGhleSBhcmUgYWxsCi0JICogaG9va2VkIHVwLgotCSAqLwotCWVuY19jb25uZWN0aW9ucyhsaXN0ZW5fcG9ydCwgY29ubmVjdF9ob3N0LCBjb25uZWN0X3BvcnQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGVuY19yYXdfeGZlcihpbnQgc29ja19mciwgaW50IHNvY2tfdG8pIHsKLQotCXVuc2lnbmVkIGNoYXIgYnVmW0JTSVpFXTsKLQl1bnNpZ25lZCBjaGFyICpwc3JjID0gTlVMTDsKLQlpbnQgbGVuLCBtLCBuID0gMDsKLQkKLQkvKiB6ZXJvIHRoZSBidWZmZXJzICovCi0JbWVtc2V0KGJ1ZiwgMCwgQlNJWkUpOwotCi0JLyogbm93IGxvb3AgZm9yZXZlciBwcm9jZXNzaW5nIHRoZSBkYXRhIHN0cmVhbSAqLwotCXdoaWxlICgxKSB7Ci0JCWVycm5vID0gMDsKLQotCQkvKiBnZW5lcmFsIGNhc2Ugb2YgbG9vcCwgcmVhZCBzb21lIGluOiAqLwotCQluID0gcmVhZChzb2NrX2ZyLCBidWYsIEJTSVpFKTsKLQotCQlpZiAobiA9PSAwIHx8IChuIDwgMCAmJiBlcnJubyAhPSBFSU5UUikpIHsKLQkJCS8qIGZhaWx1cmUgdG8gcmVhZCBhbnkgZGF0YSwgaXQgaXMgRU9GIG9yIGZhdGFsIGVycm9yICovCi0JCQlpbnQgZXJyID0gZXJybm87Ci0KLQkJCS8qIGRlYnVnIG91dHB1dDogKi8KLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGlucHV0IHN0cmVhbSBmaW5pc2hlZDogbj0lZCwgZXJyPSVkIiwgcHJvZywgbiwgZXJyKTsKLQotCQkJLyogRU9GIG9yIGZhdGFsIGVycm9yICovCi0JCQlicmVhazsKLQotCQl9IGVsc2UgaWYgKG4gPiAwKSB7Ci0KLQkJCS8qIHdyaXRlIGRhdGEgdG8gdGhlIG90aGVyIGVuZDogKi8KLQkJCWxlbiA9IG47Ci0JCQlwc3JjID0gYnVmOwotCQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCQllcnJubyA9IDA7Ci0JCQkJbSA9IHdyaXRlKHNvY2tfdG8sIHBzcmMsIGxlbik7Ci0KLQkJCQlpZiAobSA+IDApIHsKLQkJCQkJLyogc2Nvb3QgdGhlbSBieSBob3cgbXVjaCB3YXMgd3JpdHRlbjogKi8KLQkJCQkJcHNyYyArPSBtOwotCQkJCQlsZW4gIC09IG07Ci0JCQkJfQotCQkJCWlmIChtIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkgewotCQkJCQkvKiBpbnRlcnJ1cHRlZCBvciBibG9ja2VkICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvKiBFT0Ygb3IgZmF0YWwgZXJyb3IgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHRoaXMgaXMgRUlOVFIgKi8KLQkJfQotCX0KLQotCS8qIHRyYW5zZmVyIGRvbmUgKHZpZXdlciBleGl0ZWQgb3Igc29tZSBlcnJvcikgKi8KLQotCWZwcmludGYoc3RkZXJyLCAiXG4lczogY2xvc2Ugc29ja190b1xuIiwgcHJvZyk7Ci0JY2xvc2Uoc29ja190byk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgICAiJXM6IGNsb3NlIHNvY2tfZnJcbiIsIHByb2cpOwotCWNsb3NlKHNvY2tfZnIpOwotCi0JLyoga2lsbCBvdXIgcGFydG5lciBhZnRlciAxIHNlY3MuICovCi0Jc2xlZXAoMSk7Ci0JaWYgKGNoaWxkKSAgewotCQlpZiAoa2lsbChjaGlsZCwgU0lHVEVSTSkgPT0gMCkgewotCQkJZnByaW50ZihzdGRlcnIsICIlc1slZF06IGtpbGxlZCBteSBwYXJ0bmVyOiAlZFxuIiwKLQkJCSAgICBwcm9nLCAoaW50KSBnZXRwaWQoKSwgKGludCkgY2hpbGQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGtpbGwocGFyZW50LCBTSUdURVJNKSA9PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzWyVkXToga2lsbGVkIG15IHBhcnRuZXI6ICVkXG4iLAotCQkJICAgIHByb2csIChpbnQpIGdldHBpZCgpLCAoaW50KSBwYXJlbnQpOwotCQl9Ci0JfQotfQotCi0jaWYgRU5DX0hBVkVfT1BFTlNTTAotLyoKLSAqIEluaXRpYWxpemUgY2lwaGVyIGNvbnRleHQgYW5kIHRoZW4gbG9vcCB0aWxsIEVPRiBkb2luZyB0cmFuc2ZlciAmCi0gKiBlbmNyeXB0IG9yIGRlY3J5cHQuCi0gKi8KLXN0YXRpYyB2b2lkIGVuY194ZmVyKGludCBzb2NrX2ZyLCBpbnQgc29ja190bywgaW50IGVuY3J5cHQpIHsKLQkvKgotCSAqIFdlIGtlZXAgYm90aCBFIGFuZCBEIGFzcGVjdHMgaW4gY2FzZSB3ZSByZXZlcnQgYmFjayB0byBhCi0JICogc2luZ2xlIHByb2Nlc3MgY2FsbGluZyBzZWxlY3QoMikgb24gYWxsIGZkcy4uLgotCSAqLwotCXVuc2lnbmVkIGNoYXIgRV9rZXlzdHJbRVZQX01BWF9LRVlfTEVOR1RIXTsKLQl1bnNpZ25lZCBjaGFyIERfa2V5c3RyW0VWUF9NQVhfS0VZX0xFTkdUSF07Ci0JRVZQX0NJUEhFUl9DVFggRV9jdHgsIERfY3R4OwotCUVWUF9DSVBIRVJfQ1RYICpjdHggPSBOVUxMOwotCi0JdW5zaWduZWQgY2hhciBidWZbQlNJWkVdLCBvdXRbQlNJWkVdOwotCXVuc2lnbmVkIGNoYXIgKnBzcmMgPSBOVUxMLCAqa2V5c3RyOwotCXVuc2lnbmVkIGNoYXIgc2FsdFtTQUxUKzFdOwotCXVuc2lnbmVkIGNoYXIgaXZlY19yZWFsW0VWUF9NQVhfSVZfTEVOR1RIXTsKLQl1bnNpZ25lZCBjaGFyICppdmVjID0gaXZlY19yZWFsOwotCi0JaW50IGksIGNudCwgbGVuLCBtLCBuID0gMCwgdmIgPSAwLCBmaXJzdCA9IDE7Ci0JaW50IHdob29wcyA9IDE7IC8qIGZvciB0aGUgbXNyYzQgcHJvYmxlbSAqLwotCWNoYXIgKmVuY3N0ciwgKmVuY3N5bTsKLQkKLQkvKiB6ZXJvIHRoZSBidWZmZXJzICovCi0JbWVtc2V0KGJ1ZiwgIDAsIEJTSVpFKTsKLQltZW1zZXQob3V0LCAgMCwgQlNJWkUpOwotCW1lbXNldChzYWx0LCAwLCBzaXplb2Yoc2FsdCkpOwotCW1lbXNldChpdmVjX3JlYWwsIDAsIHNpemVvZihpdmVjX3JlYWwpKTsKLQltZW1zZXQoRV9rZXlzdHIsIDAsIHNpemVvZihFX2tleXN0cikpOwotCW1lbXNldChEX2tleXN0ciwgMCwgc2l6ZW9mKERfa2V5c3RyKSk7Ci0KLQlpZiAoIXN0cmNtcChjaXBoZXIsICJtc3JjNCIpKSB7Ci0JCXNhbHRfc2l6ZSA9IE1TUkM0X1NBTFQ7IC8qIDExIHZzLiAxNiAqLwotCX0KLQotCWlmIChtc3JjNF9zYykgewotCQl3aG9vcHMgPSAxOwkvKiBmb3JjZSB3b3JrYXJvdW5kIGluIFNDIG1vZGUgKi8KLQl9Ci0KLQlpZiAoZ2V0ZW52KCJFTkNSWVBUX1ZFUkJPU0UiKSkgewotCQl2YiA9IDE7CS8qIGxldCB1c2VyIHR1cm4gb24gc29tZSBkZWJ1Z2dpbmcgdmlhIGVudi4gdmFyLiAqLwotCX0KLQotCS8qCi0JICogcmV2ZXJzZSBtb2RlLCBlLmcuIHdlIGhlbHAgYSB2bmMgc2VydmVyIGluc3RlYWQgb2YgYSB2aWV3ZXIuCi0JICovCi0JaWYgKHJldmVyc2UpIHsKLQkJZW5jcnlwdCA9ICghZW5jcnlwdCk7Ci0JfQotCWVuY3N0ciA9IGVuY3J5cHQgPyAiZW5jcnlwdCIgOiAiZGVjcnlwdCI7ICAvKiBzdHJpbmcgZm9yIG1lc3NhZ2VzICovCi0JZW5jc3ltID0gZW5jcnlwdCA/ICIrIiA6ICItIjsKLQotCS8qIHVzZSB0aGUgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGNvbnRleHQgdmFyaWFibGVzIGJlbG93ICovCi0JaWYgKGVuY3J5cHQpIHsKLQkJY3R4ID0gJkVfY3R4OwotCQlrZXlzdHIgPSBFX2tleXN0cjsKLQl9IGVsc2UgewotCQljdHggPSAmRF9jdHg7Ci0JCWtleXN0ciA9IERfa2V5c3RyOwotCX0KLQotCWlmIChzZWN1cmV2bmMpIHsKLQkJZmlyc3QgPSAwOwkvKiBubyBuZWVkIGZvciBzYWx0K2l2IG9uIGZpcnN0IHRpbWUgKi8KLQkJc2FsdF9zaXplID0gMDsJLyogd2Ugd2FudCBubyBzYWx0ICovCi0JCW4gPSAwOwkJLyogbm90aGluZyByZWFkICovCi0JCWl2ZWNfc2l6ZSA9IDA7CS8qIHdlIHdhbnQgbm8gSVYuICovCi0JCWl2ZWMgPSBOVUxMOwotCX0gZWxzZSBpZiAoZW5jcnlwdCkgewotCQkvKiBlbmNyeXB0ZXIgaW5pdGlhbGl6ZXMgdGhlIHNhbHQgYW5kIGluaXRpYWxpemF0aW9uIHZlY3RvciAqLwotCi0JCS8qCi0JCSAqIE91ciBzYWx0IGlzIDE2IGJ5dGVzIGJ1dCBJIGJlbGlldmUgb25seSB0aGUgZmlyc3QgOAotCQkgKiBieXRlcyBhcmUgdXNlZCBieSBFVlBfQnl0ZXNUb0tleSgzKS4gIFNpbmNlIHdlIHNlbmQgaXQKLQkJICogdG8gdGhlIG90aGVyICJwbHVnaW4iIHdlIG5lZWQgdG8ga2VlcCBpdCAxNi4gIEFsc28sCi0JCSAqIHRoZSBJViBzaXplIGNhbiBkZXBlbmQgb24gdGhlIGNpcGhlciB0eXBlLiAgQWdhaW4sIDE2LgotCQkgKi8KLQkJUkFORF9ieXRlcyhzYWx0LCBzYWx0X3NpemUpOwotCQlSQU5EX2J5dGVzKGl2ZWMsIGl2ZWNfc2l6ZSk7Ci0KLQkJLyogcGxhY2UgdGhlbSBpbiB0aGUgc2VuZCBidWZmZXI6ICovCi0JCW1lbWNweShidWYsIHNhbHQsIHNhbHRfc2l6ZSk7Ci0JCW1lbWNweShidWYrc2FsdF9zaXplLCBpdmVjLCBpdmVjX3NpemUpOwotCi0JCW4gPSBzYWx0X3NpemUgKyBpdmVjX3NpemU7Ci0KLQkJRU5DX1BUX0RCRyhidWYsIG4pOwotCi0JfSBlbHNlIHsKLQkJLyogZGVjcnlwdGVyIG5lZWRzIHRvIHJlYWQgc2FsdCArIGl2IGZyb20gdGhlIHdpcmU6ICovCi0KLQkJLyogc2xlZXAgMTAwIG1zIChUT0RPOiBzZWxlY3Qgb24gZmQpICovCi0JCXN0cnVjdCB0aW1ldmFsIHR2OwotCQl0di50dl9zZWMgID0gMDsKLQkJdHYudHZfdXNlYyA9IDEwMCAqIDEwMDA7Ci0JCXNlbGVjdCgxLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JCWlmIChzYWx0X3NpemUraXZlY19zaXplID09IDApIHsKLQkJCW4gPSAwOwkvKiBubyBzYWx0IG9yIGl2LCBza2lwIHJlYWRpbmcuICovCi0JCX0gZWxzZSB7Ci0JCQluID0gcmVhZChzb2NrX2ZyLCBidWYsIHNhbHRfc2l6ZStpdmVjX3NpemUrOTYpOwotCQl9Ci0JCWlmIChuID09IDAgJiYgc2FsdF9zaXplK2l2ZWNfc2l6ZSA+IDApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGRlY3J5cHQgZmluaXNoZWQuXG4iLCBwcm9nKTsKLQkJCWdvdG8gZmluaXNoZWQ7Ci0JCX0KLQkJaWYgKG4gPCBzYWx0X3NpemUraXZlY19zaXplKSB7Ci0JCSAgICBpZiAobXNyYzRfc2MgJiYgbiA9PSAxMikgewotCQkJZnByaW50ZihzdGRlcnIsICIlczogb25seSAlZCBieXRlcyByZWFkLiBBc3N1bWluZyAiCi0JCQkgICAgIlVWTkMgU2luZ2xlIENsaWNrIHNlcnZlci5cbiIsIHByb2csIG4pOwotCQkgICAgfSBlbHNlIHsKLQkJCWlmIChuIDwgMCkgcGVycm9yKCJyZWFkIik7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjb3VsZCBub3QgcmVhZCBlbm91Z2ggZm9yIHNhbHQgIgotCQkJICAgICJhbmQgaXZlYzogbj0lZFxuIiwgcHJvZywgbik7Ci0JCQlnb3RvIGZpbmlzaGVkOwotCQkgICAgfQotCQl9Ci0KLQkJREVDX0NUX0RCRyhidWYsIG4pOwotCi0JCWlmIChtc3JjNF9zYyAmJiBuID09IDEyKSB7Ci0JCQk7IC8qIHNlbmQgaXQgYXMgaXMgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIGV4dHJhY3QgdGhlbSB0byB0aGVpciBidWZmZXJzOiAqLwotCQkJbWVtY3B5KHNhbHQsIGJ1Ziwgc2FsdF9zaXplKTsKLQkJCW1lbWNweShpdmVjLCBidWYrc2FsdF9zaXplLCBpdmVjX3NpemUpOwotCi0JCQkvKiB0aGUgcmVzdCBpcyBzb21lIGVuY3J5cHRlZCBkYXRhOiAqLwotCQkJbiA9IG4gLSBzYWx0X3NpemUgLSBpdmVjX3NpemU7Ci0JCQlwc3JjID0gYnVmICsgc2FsdF9zaXplICsgaXZlY19zaXplOwotCQkKLQkJCWlmIChuID4gMCkgewotCQkJCS8qCi0JCQkJICogY29weSBpdCBkb3duIHRvIHRoZSBzdGFydCBvZiBidWYgZm9yCi0JCQkJICogc2VuZGluZyBiZWxvdzoKLQkJCQkgKi8KLQkJCQlmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCQkJCQlidWZbaV0gPSBwc3JjW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIGRlYnVnIG91dHB1dCAqLwotCVBSSU5UX0tFWURBVEE7Ci0JUFJJTlRfSVZFQzsKLQotCWlmICghc3RyY21wKGNpcGhlciwgIm1zcmM0IikpIHsKLQkJLyogc3BlY2lhbCBjYXNlcyBmb3IgTVNSQzQ6ICovCi0KLQkJaWYgKHdob29wcykgewotCQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgLSBXQVJOSU5HOiBNU1JDNCBtb2RlIGFuZCBJR05PUklORyByYW5kb20gc2FsdFxuIiwgcHJvZywgZW5jc3RyKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIC0gV0FSTklORzogYW5kIGluaXRpYWxpemF0aW9uIHZlY3RvciEhXG4iLCBwcm9nLCBlbmNzdHIpOwotCQkJRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOwotCQkJaWYgKHB3X2luKSB7Ci0JCQkgICAgLyogZm9yIHB3PXh4eHggYSBtZDUgaGFzaCBpcyB1c2VkICovCi0JCQkgICAgRVZQX0J5dGVzVG9LZXkoQ2lwaGVyLCBEaWdlc3QsIE5VTEwsICh1bnNpZ25lZCBjaGFyICopIGtleWRhdGEsCi0JCQkgICAgICAgIGtleWRhdGFfbGVuLCAxLCBrZXlzdHIsIE5VTEwpOwotCQkJICAgIEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgQ2lwaGVyLCBOVUxMLCBrZXlzdHIsIE5VTEwsCi0JCQkgICAgICAgIGVuY3J5cHQpOwotCQkJfSBlbHNlIHsKLQkJCSAgICAvKiBvdGhlcndpc2Uga2V5ZGF0YSBhcyBpcyAqLwotCQkJICAgIEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgQ2lwaGVyLCBOVUxMLAotCQkJICAgICAgICAodW5zaWduZWQgY2hhciAqKSBrZXlkYXRhLCBOVUxMLCBlbmNyeXB0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFhYWCBtaWdodCBub3QgYmUgY29ycmVjdCwganVzdCBleGl0LiAqLwotCQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgLSBOb3Qgc3VyZSBhYm91dCBtc3JjNCAmJiAhd2hvb3BzIGNhc2UsIGV4aXRpbmcuXG4iLCBwcm9nLCBlbmNzdHIpOwotCQkJZXhpdCgxKTsKLQotCQkJRVZQX0J5dGVzVG9LZXkoQ2lwaGVyLCBEaWdlc3QsIE5VTEwsICh1bnNpZ25lZCBjaGFyICopIGtleWRhdGEsCi0JCQkgICAga2V5ZGF0YV9sZW4sIDEsIGtleXN0ciwgaXZlYyk7IAotCQkJRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOwotCQkJRVZQX0NpcGhlckluaXRfZXgoY3R4LCBDaXBoZXIsIE5VTEwsIGtleXN0ciwgaXZlYywKLQkJCSAgICBlbmNyeXB0KTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJdW5zaWduZWQgY2hhciAqaW5fc2FsdCA9IE5VTEw7Ci0KLQkJLyogY2hlY2sgc2FsdCBhbmQgSVYgc291cmNlIGFuZCBzaXplLiAqLwotCQlpZiAoc2VjdXJldm5jKSB7Ci0JCQlpbl9zYWx0ID0gTlVMTDsKLQkJfSBlbHNlIGlmIChzYWx0X3NpemUgPD0gMCkgewotCQkJLyogbGV0IHNhbHRfc2l6ZSA9IDAgbWVhbiBrZWVwIGl0IG91dCBvZiB0aGUgTUQ1ICovCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAtIFdBUk5JTkc6IG5vIHNhbHRcbiIsCi0JCQkgICAgcHJvZywgZW5jc3RyKTsKLQkJCWluX3NhbHQgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJaW5fc2FsdCA9IHNhbHQ7Ci0JCX0KLQotCQlpZiAoaXZlY19zaXplIDwgQ2lwaGVyLT5pdl9sZW4gJiYgIXNlY3VyZXZuYykgewotCQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgLSBXQVJOSU5HOiBzaG9ydCBJViAlZCA8ICVkXG4iLAotCQkJICAgIHByb2csIGVuY3N0ciwgaXZlY19zaXplLCBDaXBoZXItPml2X2xlbik7Ci0JCX0KLQotCQkvKiBtYWtlIHRoZSBoYXNoZWQgdmFsdWUgYW5kIHBsYWNlIGluIGtleXN0ciAqLwotCi0JCS8qCi0JCSAqIFhYWCBOLkIuOiBEU00gcGx1Z2luIGhhZCBjb3VudD0wLCBhbmQgb3Zlcndyb3RlIGl2ZWMKLQkJICogYnkgbm90IHBhc3NpbmcgTlVMTCBpdi4KLQkJICovCi0KLQkJaWYgKG5vbWQpIHsKLQkJCS8qIHNwZWNpYWwgbW9kZTogbm8gc2FsdCBvciBtZDUsIHVzZSBrZXlkYXRhIGRpcmVjdGx5ICovCi0KLQkJCWludCBzeiA9IGtleWRhdGFfbGVuIDwgRVZQX01BWF9LRVlfTEVOR1RIID8KLQkJCSAgICBrZXlkYXRhX2xlbiA6IEVWUF9NQVhfS0VZX0xFTkdUSDsgCi0KLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIC0gV0FSTklORzogbm8tbWQ1IHNwZWNpZmllZDogaWdub3Jpbmcgc2FsdCAmIGhhc2hcbiIsIHByb2csIGVuY3N0cik7Ci0JCQltZW1jcHkoa2V5c3RyLCBrZXlkYXRhLCBzeik7Ci0KLQkJfSBlbHNlIGlmIChub3VsdHJhICYmIGl2ZWNfc2l6ZSA+IDApIHsKLQkJCS8qICJub3JtYWwiIG1vZGUsIGRvbid0IG92ZXJ3cml0ZSBpdmVjLiAqLwotCi0JCQlFVlBfQnl0ZXNUb0tleShDaXBoZXIsIERpZ2VzdCwgaW5fc2FsdCwgKHVuc2lnbmVkIGNoYXIgKikga2V5ZGF0YSwKLQkJCSAgICBrZXlkYXRhX2xlbiwgMSwga2V5c3RyLCBOVUxMKTsKLQotCQl9IGVsc2UgewotCQkJLyogCi0JCQkgKiBVbHRyYSBEU00gY29tcGF0aWJpbGl0eSBtb2RlLiAgTm90ZSB0aGF0IHRoaXMKLQkJCSAqIGNsb2JiZXJzIHRoZSBpdmVjIHdlIHNldCB1cCBhYm92ZSEgIFVuZGVyCi0JCQkgKiBub3VsdHJhIHdlIG92ZXJ3cml0ZSBpdmVjIG9ubHkgaWYgaXZlY19zaXplPTAuCi0JCQkgKgotCQkJICogU2VjdXJlVk5DIGFsc28gZ29lcyB0aHJvdWdoIGhlcmUuIGluX3NhbHQgYW5kIGl2ZWMgYXJlIE5VTEwuCi0JCQkgKiBBbmQgaXZlYyBpcyBOVUxMIGJlbG93IGluIHRoZSBFVlBfQ2lwaGVySW5pdF9leCgpIGNhbGwuCi0JCQkgKi8KLQkJCUVWUF9CeXRlc1RvS2V5KENpcGhlciwgRGlnZXN0LCBpbl9zYWx0LCAodW5zaWduZWQgY2hhciAqKSBrZXlkYXRhLAotCQkJICAgIGtleWRhdGFfbGVuLCAxLCBrZXlzdHIsIGl2ZWMpOwotCQl9Ci0KLQotCQkvKiBpbml0aWFsaXplIHRoZSBjb250ZXh0ICovCi0JCUVWUF9DSVBIRVJfQ1RYX2luaXQoY3R4KTsKLQotCi0JCS8qIHNldCB0aGUgY2lwaGVyICYgaW5pdGlhbGl6ZSAqLwotCi0JCS8qCi0JCSAqIFhYWCBOLkIuOiBEU00gcGx1Z2luIGltcGxlbWVudGF0aW9uIGhhZCBlbmNyeXB0PTEKLQkJICogZm9yIGJvdGggKGkuZS4gcGVyZmVjdGx5IHN5bW1ldHJpYykKLQkJICovCi0KLQkJRVZQX0NpcGhlckluaXRfZXgoY3R4LCBDaXBoZXIsIE5VTEwsIGtleXN0ciwgaXZlYywgZW5jcnlwdCk7Ci0JfQotCi0JaWYgKHNlY3VyZXZuYyAmJiBzZWN1cmV2bmNfYXJjNCkgewotCQkvKiBuZWVkIHRvIGRpc2NhcmQgaW5pdGlhbCAzMDcyIGJ5dGVzICovCi0JCXVuc2lnbmVkIGNoYXIgYnVmMVtTRUNVUkVWTkNfUkM0X0RST1BfQllURVNdOwotCQl1bnNpZ25lZCBjaGFyIGJ1ZjJbU0VDVVJFVk5DX1JDNF9EUk9QX0JZVEVTXTsKLQkJaW50IGNudCA9IDA7Ci0JCUVWUF9DaXBoZXJVcGRhdGUoY3R4LCBidWYxLCAmY250LCBidWYyLCBTRUNVUkVWTkNfUkM0X0RST1BfQllURVMpOwotCX0KLQotCS8qIGRlYnVnIG91dHB1dCAqLwotCVBSSU5UX0tFWVNUUl9BTkRfRlJJRU5EUzsKLQotCS8qIG5vdyBsb29wIGZvcmV2ZXIgcHJvY2Vzc2luZyB0aGUgZGF0YSBzdHJlYW0gKi8KLQotCXdoaWxlICgxKSB7Ci0JCWVycm5vID0gMDsKLQkJaWYgKGZpcnN0ICYmIG4gPiAwKSB7Ci0JCQlpZiAoZW5jcnlwdCAmJiBtc3JjNF9zYykgewotCQkJCS8qIHNraXAgc2VuZGluZyBzYWx0K2l2ICovCi0JCQkJZmlyc3QgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvKiB1c2UgdGhhdCBmaXJzdCBibG9jayBvZiBkYXRhIHBsYWNlZCBpbiBidWYgKi8KLQkJCX0KLQkJfSBlbHNlIGlmIChmaXJzdCAmJiBuID09IDAgJiYgc2FsdF9zaXplICsgaXZlY19zaXplID09IDApIHsKLQkJCWZpcnN0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJLyogZ2VuZXJhbCBjYXNlIG9mIGxvb3AsIHJlYWQgc29tZSBpbjogKi8KLQkJCW4gPSByZWFkKHNvY2tfZnIsIGJ1ZiwgQlNJWkUpOwotCQl9Ci0KLQkJLyogZGVidWcgb3V0cHV0OiAqLwotCQlpZiAodmIpIGZwcmludGYoc3RkZXJyLCAiJXMlZC8lZCAiLCBlbmNzeW0sIG4sIGVycm5vKTsKLQkJUFJJTlRfTE9PUF9EQkcxOwotCi0JCWlmIChuID09IDAgfHwgKG4gPCAwICYmIGVycm5vICE9IEVJTlRSKSkgewotCQkJLyogZmFpbHVyZSB0byByZWFkIGFueSBkYXRhLCBpdCBpcyBFT0Ygb3IgZmF0YWwgZXJyb3IgKi8KLQkJCWludCBlcnIgPSBlcnJubzsKLQotCQkJLyogZGVidWcgb3V0cHV0OiAqLwotCQkJUFJJTlRfTE9PUF9EQkcyOwotCQkJZnByaW50ZihzdGRlcnIsICIlczogJXMgLSBpbnB1dCBzdHJlYW0gZmluaXNoZWQ6IG49JWQsIGVycj0lZCIsIHByb2csIGVuY3N0ciwgbiwgZXJyKTsKLQotCQkJLyogRU9GIG9yIGZhdGFsIGVycm9yICovCi0JCQlicmVhazsKLQotCQl9IGVsc2UgaWYgKG4gPiAwKSB7Ci0JCQkvKiB3ZSByZWFkIGluIHNvbWUgZGF0YSwgbm93IHRyYW5zZm9ybSBpdDogKi8KLQotCQkJaWYgKGZpcnN0ICYmIGVuY3J5cHQpIHsKLQkJCQkvKiBmaXJzdCB0aW1lLCBjb3B5IHRoZSBzYWx0IGFuZCBpdmVjIHRvIG91dFtdIGZvciBzZW5kaW5nICovCi0JCQkJbWVtY3B5KG91dCwgYnVmLCBuKTsKLQkJCQljbnQgPSBuOwotCi0JCQl9IGVsc2UgaWYgKCFFVlBfQ2lwaGVyVXBkYXRlKGN0eCwgb3V0LCAmY250LCBidWYsIG4pKSB7Ci0JCQkJLyogb3RoZXJ3aXNlLCB3ZSB0cmFuc2Zvcm0gdGhlIGRhdGEgKi8KLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlbmNfeGZlciBFVlBfQ2lwaGVyVXBkYXRlIGZhaWxlZC5cbiIsIHByb2cpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBkZWJ1ZyBvdXRwdXQ6ICovCi0JCQlpZiAodmIpIGZwcmludGYoc3RkZXJyLCAiJXNjJWQvJWQgIiwgZW5jc3ltLCBjbnQsIG4pOwotCQkJUFJJTlRfTE9PUF9EQkczOwotCi0JCQkvKiB3cml0ZSB0cmFuc2Zvcm1lZCBkYXRhIHRvIHRoZSBvdGhlciBlbmQ6ICovCi0JCQlsZW4gPSBjbnQ7Ci0JCQlwc3JjID0gb3V0OwotCQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCQllcnJubyA9IDA7Ci0JCQkJbSA9IHdyaXRlKHNvY2tfdG8sIHBzcmMsIGxlbik7Ci0KLQkJCQkvKiBkZWJ1ZyBvdXRwdXQ6ICovCi0JCQkJaWYgKHZiKSBmcHJpbnRmKHN0ZGVyciwgIm0lcyVkLyVkICIsIGVuY3N5bSwgbSwgZXJybm8pOwotCi0JCQkJaWYgKG0gPiAwKSB7Ci0JCQkJCS8qIHNjb290IHRoZW0gYnkgaG93IG11Y2ggd2FzIHdyaXR0ZW46ICovCi0JCQkJCXBzcmMgKz0gbTsKLQkJCQkJbGVuICAtPSBtOwotCQkJCX0KLQkJCQlpZiAobSA8IDAgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpIHsKLQkJCQkJLyogaW50ZXJydXB0ZWQgb3IgYmxvY2tlZCAqLwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogRU9GIG9yIGZhdGFsIGVycm9yICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiB0aGlzIGlzIEVJTlRSICovCi0JCX0KLQkJZmlyc3QgPSAwOwotCX0KLQotCS8qIHRyYW5zZmVyIGRvbmUgKHZpZXdlciBleGl0ZWQgb3Igc29tZSBlcnJvcikgKi8KLQlmaW5pc2hlZDoKLQotCWZwcmludGYoc3RkZXJyLCAiXG4lczogJXMgLSBjbG9zZSBzb2NrX3RvXG4iLCBwcm9nLCBlbmNzdHIpOwotCWNsb3NlKHNvY2tfdG8pOwotCi0JZnByaW50ZihzdGRlcnIsICAgIiVzOiAlcyAtIGNsb3NlIHNvY2tfZnJcbiIsIHByb2csIGVuY3N0cik7Ci0JY2xvc2Uoc29ja19mcik7Ci0KLQkvKiBraWxsIG91ciBwYXJ0bmVyIGFmdGVyIDIgc2Vjcy4gKi8KLQlzbGVlcCgyKTsKLQlpZiAoY2hpbGQpICB7Ci0JCWlmIChraWxsKGNoaWxkLCBTSUdURVJNKSA9PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzWyVkXTogJXMgLSBraWxsZWQgbXkgcGFydG5lcjogJWRcbiIsCi0JCQkgICAgcHJvZywgKGludCkgZ2V0cGlkKCksIGVuY3N0ciwgKGludCkgY2hpbGQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGtpbGwocGFyZW50LCBTSUdURVJNKSA9PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzWyVkXTogJXMgLSBraWxsZWQgbXkgcGFydG5lcjogJWRcbiIsCi0JCQkgICAgcHJvZywgKGludCkgZ2V0cGlkKCksIGVuY3N0ciwgKGludCkgcGFyZW50KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBzZWN1cmV2bmNfc2VydmVyX3JzYV9zYXZlX2RpYWxvZyhjaGFyICpmaWxlLCBjaGFyICptZDVzdHIsIHVuc2lnbmVkIGNoYXIqIHJzYWJ1ZikgewotCS8qIHNpbmNlIHdlIGFyZSBsaWtlbHkgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCwgdXNlIHRoaXMga2x1ZGdlIGJ5IHJ1bm5pbmcgdGsgKi8KLQlGSUxFICpwOwotCWNoYXIgc3RyWzJdLCAqcSA9IGZpbGUsICpjbWQgPSBnZXRlbnYoIldJU0giKSA/IGdldGVudigiV0lTSCIpIDogIndpc2giOwotCWludCByYzsKLQotCW1lbXNldChzdHIsIDAsIHNpemVvZihzdHIpKTsKLQotCXAgPSBwb3BlbihjbWQsICJ3Iik7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogY291bGQgbm90IHJ1bjogJXNcbiIsIGNtZCk7IAotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBzdGFydCBwaXBpbmcgdGsvdGNsIGNvZGUgdG8gaXQ6ICovCi0JZnByaW50ZihwLCAid20gd2l0aGRyYXcgLlxuIik7Ci0JZnByaW50ZihwLCAic2V0IHggW2V4cHIgW3dpbmZvIHNjcmVlbndpZHRoICAuXS8yXVxuIik7Ci0JZnByaW50ZihwLCAic2V0IHkgW2V4cHIgW3dpbmZvIHNjcmVlbmhlaWdodCAuXS8yXVxuIik7Ci0JZnByaW50ZihwLCAid20gZ2VvbWV0cnkgLiArJHgrJHk7IHVwZGF0ZVxuIik7Ci0JZnByaW50ZihwLCAiY2F0Y2gge29wdGlvbiBhZGQgKkRpYWxvZy5tc2cuZm9udCB7aGVsdmV0aWNhIC0xNCBib2xkfX1cbiIpOwotCWZwcmludGYocCwgImNhdGNoIHtvcHRpb24gYWRkICpEaWFsb2cubXNnLndyYXBMZW5ndGggNml9XG4iKTsKLQlmcHJpbnRmKHAsICJzZXQgYW5zIFt0a19tZXNzYWdlQm94IC10aXRsZSBcIlNhdmUgYW5kIFRydXN0IFVsdHJhVk5DIFJTQSBLZXk/XCIgLWljb24gcXVlc3Rpb24gIik7Ci0JZnByaW50ZihwLCAiLXR5cGUgeWVzbm8gLW1lc3NhZ2UgXCJTYXZlIGFuZCBUcnVzdCBVbHRyYVZOQyBTZWN1cmVWTkNQbHVnaW4gUlNBIEtleVxcblxcbiIpOwotCWZwcmludGYocCwgIldpdGggTUQ1IHN1bTogJXNcXG5cXG4iLCBtZDVzdHIpOwotCWZwcmludGYocCwgIkluIGZpbGU6ICIpOwotCXdoaWxlICgqcSAhPSAnXDAnKSB7Ci0JCS8qIHNhbml0aXplIHVzZXIgc3VwcGxpZWQgc3RyaW5nOiAqLwotCQlzdHJbMF0gPSAqcTsKLQkJaWYgKHN0cnBicmsoc3RyLCAiW10oKXt9YCdcIiQmKnw8PiIpID09IE5VTEwpIHsKLQkJCWZwcmludGYocCwgIiVzIiwgc3RyKTsKLQkJfQotCQlxKys7Ci0JfQotCWZwcmludGYocCwgIiA/XCJdXG4iKTsKLQlmcHJpbnRmKHAsICJpZiB7ICRhbnMgPT0gXCJ5ZXNcIiB9IHtkZXN0cm95IC47IGV4aXQgMH0gZWxzZSB7ZGVzdHJveSAuOyBleGl0IDF9XG4iKTsKLQlyYyA9IHBjbG9zZShwKTsKLQlpZiAocmMgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogcXVlcnkgcmV0dXJuZWQ6ICVkLiAgc2F2aW5nIGl0LlxuIiwgcmMpOwotCQlwID0gZm9wZW4oZmlsZSwgInciKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJjaGVja3NlcnZlcl9yc2E6IGNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXdyaXRlKGZpbGVubyhwKSwgcnNhYnVmLCBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFKTsKLQkJZmNsb3NlKHApOwotCQlyZXR1cm4gMjsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogcXVlcnkgcmV0dXJuZWQ6ICVkLiAgTk9UIHNhdmluZyBpdC5cbiIsIHJjKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotc3RhdGljIGNoYXIgKnJzYV9tZDVfc3VtKHVuc2lnbmVkIGNoYXIqIHJzYWJ1ZikgewotCUVWUF9NRF9DVFggbWQ7Ci0JY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgdG1wWzE2XTsKLQljaGFyIG1kNXN0cltFVlBfTUFYX01EX1NJWkUgKiA4XTsKLQl1bnNpZ25lZCBpbnQgaSwgc2l6ZSA9IDA7Ci0KLQlFVlBfRGlnZXN0SW5pdCgmbWQsIEVWUF9tZDUoKSk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIHJzYWJ1ZiwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRSk7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgKHVuc2lnbmVkIGNoYXIgKilkaWdlc3QsICZzaXplKTsKLQotCW1lbXNldChtZDVzdHIsIDAsIHNpemVvZihtZDVzdHIpKTsKLQlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyIHVjID0gKHVuc2lnbmVkIGNoYXIpIGRpZ2VzdFtpXTsKLQkJc3ByaW50Zih0bXAsICIlMDJ4IiwgKGludCkgdWMpOwotCQlzdHJjYXQobWQ1c3RyLCB0bXApOwotCX0KLQlyZXR1cm4gc3RyZHVwKG1kNXN0cik7Ci19Ci0KLXN0YXRpYyBpbnQgc2VjdXJldm5jX2NoZWNrX3NlcnZlcl9yc2EoY2hhciAqZmlsZSwgdW5zaWduZWQgY2hhciAqcnNhYnVmKSB7Ci0Jc3RydWN0IHN0YXQgc2I7Ci0JdW5zaWduZWQgY2hhciBmaWxlYnVmW1NFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkVdOwotCWNoYXIgKm1kNXN0ciA9IHJzYV9tZDVfc3VtKHJzYWJ1Zik7Ci0KLQlpZiAoIWZpbGUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbWVtc2V0KGZpbGVidWYsIDAsIHNpemVvZihmaWxlYnVmKSk7Ci0JaWYgKHN0YXQoZmlsZSwgJnNiKSA9PSAwKSB7Ci0JCWludCBuLCBmZCwgaSwgb2sgPSAxOwotCi0JCWlmIChzYi5zdF9zaXplICE9IFNFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkUpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiY2hlY2tzZXJ2ZXJfcnNhOiBmaWxlIGlzIHdyb25nIHNpemU6ICVkICE9ICVkICclcydcbiIsCi0JCQkgICAgKGludCkgc2Iuc3Rfc2l6ZSwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRSwgZmlsZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7Ci0JCWlmIChmZCA8IDApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiY2hlY2tzZXJ2ZXJfcnNhOiBjb3VsZCBub3Qgb3BlbjogJyVzJ1xuIiwgZmlsZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCW4gPSAoaW50KSByZWFkKGZkLCBmaWxlYnVmLCBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFKTsKLQkJY2xvc2UoZmQpOwotCQlpZiAobiAhPSBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogY291bGQgbm90IHJlYWQgYWxsIG9mIGZpbGU6ICVkICE9ICVkICclcydcbiIsCi0JCQkgICAgbiwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRSwgZmlsZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWZvciAoaT0wOyBpIDwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRTsgaSsrKSB7Ci0JCQlpZiAoZmlsZWJ1ZltpXSAhPSByc2FidWZbaV0pIHsKLQkJCQlvayA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFvaykgewotCQkJY2hhciAqc3RyMSA9IHJzYV9tZDVfc3VtKHJzYWJ1Zik7Ci0JCQljaGFyICpzdHIyID0gcnNhX21kNV9zdW0oZmlsZWJ1Zik7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogcnNhIGtleXN0b3JlIGNvbnRlbnRzIGRpZmZlciBmb3IgJyVzJ1xuIiwgZmlsZSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogTUQ1IHN1bSBvZiBzZXJ2ZXIga2V5OiAlc1xuIiwgc3RyMSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrc2VydmVyX3JzYTogTUQ1IHN1bSBvZiBrZXlzdG9yZTogICAlc1xuIiwgc3RyMik7Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0gZWxzZSB7Ci0KLQkJZnByaW50ZihzdGRlcnIsICJjaGVja3NlcnZlcl9yc2E6IHJzYSBrZXlzdG9yZSBmaWxlIGRvZXMgbm90IGV4aXN0OiAnJXMnXG4iLCBmaWxlKTsKLQkJZnByaW50ZihzdGRlcnIsICJjaGVja3NlcnZlcl9yc2E6IGFza2luZyB1c2VyIGlmIHdlIHNob3VsZCBzdG9yZSByc2Ega2V5IGluIGl0LlxuXG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICJjaGVja3NlcnZlcl9yc2E6IFJTQSBrZXkgaGFzIE1ENSBzdW06ICVzXG5cbiIsIG1kNXN0cik7IAotCi0JCXJldHVybiBzZWN1cmV2bmNfc2VydmVyX3JzYV9zYXZlX2RpYWxvZyhmaWxlLCBtZDVzdHIsIHJzYWJ1Zik7Ci0JfQotfQotCi1zdGF0aWMgUlNBICpsb2FkX2NsaWVudF9hdXRoKGNoYXIgKmZpbGUpIHsKLQlzdHJ1Y3Qgc3RhdCBzYjsKLQlpbnQgZmQsIG47Ci0JY2hhciAqY29udGVudHM7Ci0JUlNBICpyc2E7Ci0KLQlpZiAoIWZpbGUpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzdGF0KGZpbGUsICZzYikgIT0gMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwotCWlmIChmZCA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2FkX2NsaWVudF9hdXRoOiBjb3VsZCBub3Qgb3BlbjogJyVzJ1xuIiwgZmlsZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNvbnRlbnRzID0gKGNoYXIgKikgbWFsbG9jKHNiLnN0X3NpemUpOwotCW4gPSAoaW50KSByZWFkKGZkLCBjb250ZW50cywgc2Iuc3Rfc2l6ZSk7Ci0JY2xvc2UoZmQpOwotCi0JaWYgKG4gIT0gc2Iuc3Rfc2l6ZSkgIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2FkX2NsaWVudF9hdXRoOiBjb3VsZCBub3QgcmVhZCBhbGwgb2Y6ICclcydcbiIsIGZpbGUpOwotCQlmcmVlKGNvbnRlbnRzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcnNhID0gZDJpX1JTQVByaXZhdGVLZXkoTlVMTCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopICgodm9pZCAqKSAmY29udGVudHMpLCBzYi5zdF9zaXplKTsKLQlpZiAoIXJzYSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImxvYWRfY2xpZW50X2F1dGg6IGQyaV9SU0FQcml2YXRlS2V5IGZhaWxlZCBmb3I6ICclcydcbiIsIGZpbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoUlNBX2NoZWNrX2tleShyc2EpICE9IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2FkX2NsaWVudF9hdXRoOiByc2Ega2V5IGludmFsaWQ6ICclcydcbiIsIGZpbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcnNhOwotfQotCi1zdGF0aWMgdm9pZCBzc2xleGl0KGNoYXIgKm1zZykgewotCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBtc2csIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLCBOVUxMKSk7Ci0JZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgc2VjdXJldm5jX3NldHVwKGludCBjb25uMSwgaW50IGNvbm4yKSB7Ci0JUlNBICpyc2EgPSBOVUxMOwotCUVWUF9DSVBIRVJfQ1RYIGluaXRfY3R4OwotCXVuc2lnbmVkIGNoYXIga2V5c3RyW0VWUF9NQVhfS0VZX0xFTkdUSF07Ci0JdW5zaWduZWQgY2hhciAqcnNhYnVmLCAqcnNhc2F2OwotCXVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9rZXlidWY7Ci0JdW5zaWduZWQgY2hhciAqaW5pdGtleTsJCi0JdW5zaWduZWQgaW50IHNlcnZlcl9mbGFncyA9IDA7Ci0JdW5zaWduZWQgY2hhciBvbmUgPSAxLCB6ZXJvID0gMCwgc2lnID0gMTY7Ci0JdW5zaWduZWQgY2hhciBiMSwgYjIsIGIzLCBiNDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltCU0laRV0sIHRvX3ZpZXdlcltCU0laRV07Ci0JaW50IHRvX3ZpZXdlcl9sZW4gPSAwOwotCWludCBuID0gMCwgbGVuLCByYzsKLQlpbnQgc2VydmVyID0gcmV2ZXJzZSA/IGNvbm4xIDogY29ubjI7Ci0JaW50IHZpZXdlciA9IHJldmVyc2UgPyBjb25uMiA6IGNvbm4xOwotCWNoYXIgKmNsaWVudF9hdXRoID0gTlVMTDsKLQlpbnQgY2xpZW50X2F1dGhfcmVxID0gMDsKLQlpbnQga2V5c3RvcmVfdmVyaWZpZWQgPSAwOwotCi0JRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKLQotCS8qIGFsbG9jIGFuZCByZWFkIGZyb20gc2VydmVyIHRoZSAyNzAgY29tcHJpc2luZyB0aGUgcnNhIHB1YmxpYyBrZXk6ICovCi0JcnNhYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jKFNFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkUsIDEpOwotCXJzYXNhdiA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyhTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFLCAxKTsKLQlsZW4gPSAwOwotCXdoaWxlIChsZW4gPCBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFKSB7Ci0JCW4gPSByZWFkKHNlcnZlciwgcnNhYnVmICsgbGVuLCBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFIC0gbGVuKTsKLQkJaWYgKG4gPT0gMCB8fCAobiA8IDAgJiYgZXJybm8gIT0gRUlOVFIpKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogZmFpbCByZWFkIHJzYWJ1Zjogbj0lZCBsZW49JWRcbiIsIG4sIGxlbik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWxlbiArPSBuOwotCX0KLQlpZiAobGVuICE9IFNFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkUpIHsKLQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IGZhaWwgZmluYWwgcmVhZCByc2FidWY6IG49JWQgbGVuPSVkXG4iLCBuLCBsZW4pOwotCQlleGl0KDEpOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogcnNhIGRhdGEgcmVhZCBsZW46ICVkXG4iLCBsZW4pOwotCW1lbWNweShyc2FzYXYsIHJzYWJ1ZiwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogUlNBIGtleSBoYXMgTUQ1IHN1bTogJXNcbiIsIHJzYV9tZDVfc3VtKHJzYWJ1ZikpOyAKLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDpcbiIpOyAKLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogT25lIHdheSB0byBwcmludCBvdXQgdGhlIFNlY3VyZVZOQyBTZXJ2ZXIga2V5IE1ENSBzdW0gaXM6XG5cbiIpOyAKLQlmcHJpbnRmKHN0ZGVyciwgIm9wZW5zc2wgcnNhIC1pbmZvcm0gREVSIC1vdXRmb3JtIERFUiAtcHVib3V0IC1pbiAuL1NlcnZlcl9TZWN1cmVWTkMucGtleSB8IGRkIGJzPTEgc2tpcD0yNCB8IG1kNXN1bVxuXG4iKTsKLQlpZiAoc2VjdXJldm5jX2ZpbGUgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDpcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogKiogV0FSTklORzogVUxUUkFWTkMgU0VSVkVSIFJTQSBLRVkgTk9UIFZFUklGSUVELiAgICoqXG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6ICoqIFdBUk5JTkc6IEEgTUFOLUlOLVRIRS1NSURETEUgQVRUQUNLIElTIFBPU1NJQkxFLiAqKlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOlxuIik7Ci0JfSBlbHNlIHsKLQkJY2hhciAqcSA9IHN0cnJjaHIoc2VjdXJldm5jX2ZpbGUsICdDJyk7Ci0JCWludCBza2lwID0gMDsKLQkJaWYgKHEpIHsKLQkJCWlmICghc3RyY21wKHEsICJDbGllbnRBdXRoLnBrZXkiKSkgewotCQkJCWNsaWVudF9hdXRoID0gc3RyZHVwKHNlY3VyZXZuY19maWxlKTsKLQkJCQlza2lwID0gMTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChxLCAiQ2xpZW50QXV0aC5wa2V5LnJzYSIpKSB7Ci0JCQkJY2xpZW50X2F1dGggPSBzdHJkdXAoc2VjdXJldm5jX2ZpbGUpOwotCQkJCXEgPSBzdHJyY2hyKGNsaWVudF9hdXRoLCAnLicpOwotCQkJCSpxID0gJ1wwJzsKLQkJCX0KLQkJfQotCQlpZiAoIXNraXApIHsKLQkJCXJjID0gc2VjdXJldm5jX2NoZWNrX3NlcnZlcl9yc2Eoc2VjdXJldm5jX2ZpbGUsIHJzYWJ1Zik7Ci0JCX0KLQkJaWYgKHNraXApIHsKLQkJCTsKLQkJfSBlbHNlIGlmIChyYyA9PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDpcbiIpOwotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IFZFUklGWV9FUlJPUjogU0VSVkVSIFJTQSBLRVkgRElEIE5PVCBNQVRDSDpcbiIpOwotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6ICAgICAlc1xuIiwgc2VjdXJldm5jX2ZpbGUpOwotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6XG4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0gZWxzZSBpZiAocmMgPT0gLTEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBVc2VyIGNhbmNlbGxlZCB0aGUgc2F2ZSBhbmQgaGVuY2UgdGhlIGNvbm5lY3Rpb24uXG4iKTsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiAgICAgJXNcbiIsIHNlY3VyZXZuY19maWxlKTsKLQkJCWV4aXQoMSk7Ci0JCX0gZWxzZSBpZiAocmMgPT0gMSkgewotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IFZFUklGWSBTVUNDRVNTOiBzZXJ2ZXIgcnNhIGtleSBtYXRjaGVzIHRoZSBjb250ZW50cyBvZjpcbiIpOwotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6ICAgICAlc1xuIiwgc2VjdXJldm5jX2ZpbGUpOwotCQkJa2V5c3RvcmVfdmVyaWZpZWQgPSAxOwotCQl9IGVsc2UgaWYgKHJjID09IDIpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBTZXJ2ZXIgcnNhIGtleSBzdG9yZWQgaW46XG4iKTsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiAgICAgJXNcbiIsIHNlY3VyZXZuY19maWxlKTsKLQkJCWtleXN0b3JlX3ZlcmlmaWVkID0gMjsKLQkJfQotCX0KLQotCS8qCi0JICogcmVhZCBpbiB0aGUgc2VydmVyIGZsYWdzLiBOb3RlIHRoYXQgU2VjdXJlVk5DUGx1Z2luIHNlbmRzIHRoZXNlCi0JICogaW4gbGl0dGxlIGVuZGlhbiBhbmQgbm90IG5ldHdvcmsgb3JkZXIhIQotCSAqLwotCXJlYWQoc2VydmVyLCAoY2hhciAqKSAmYjEsIDEpOwotCXJlYWQoc2VydmVyLCAoY2hhciAqKSAmYjIsIDEpOwotCXJlYWQoc2VydmVyLCAoY2hhciAqKSAmYjMsIDEpOwotCXJlYWQoc2VydmVyLCAoY2hhciAqKSAmYjQsIDEpOwotCQotCXNlcnZlcl9mbGFncyA9IDA7Ci0Jc2VydmVyX2ZsYWdzIHw9ICgodW5zaWduZWQgaW50KSBiNCkgPDwgMjQ7Ci0Jc2VydmVyX2ZsYWdzIHw9ICgodW5zaWduZWQgaW50KSBiMykgPDwgMTY7Ci0Jc2VydmVyX2ZsYWdzIHw9ICgodW5zaWduZWQgaW50KSBiMikgPDwgODsKLQlzZXJ2ZXJfZmxhZ3MgfD0gKCh1bnNpZ25lZCBpbnQpIGIxKSA8PCAwOwotCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBzZXJ2ZXJfZmxhZ3M6IDB4JTA4eFxuIiwgc2VydmVyX2ZsYWdzKTsKLQotCS8qIGNoZWNrIGZvciBhcmM0IHVzYWdlOiAqLwotCWlmIChzZXJ2ZXJfZmxhZ3MgJiAweDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IHNlcnZlciB1c2VzIEFFUyBjaXBoZXIuXG4iKTsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogc2VydmVyIHVzZXMgQVJDNCBjaXBoZXIuXG4iKTsKLQkJc2VjdXJldm5jX2FyYzQgPSAxOwotCQlDaXBoZXIgPSBFVlBfcmM0KCk7Ci0JfQotCi0JLyogY2hlY2sgZm9yIGNsaWVudCBhdXRoIHNpZ25hdHVyZSByZXF1aXJlbWVudDogKi8KLQlpZiAoc2VydmVyX2ZsYWdzICYgKHNpZyA8PCAyNCkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IHNlcnZlciByZXF1aXJlcyBDbGllbnQgQXV0aCBzaWduYXR1cmUuXG4iKTsKLQkJY2xpZW50X2F1dGhfcmVxID0gMTsKLQkJaWYgKCFjbGllbnRfYXV0aCkgewotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IEhvd2V2ZXIsIE5PICpDbGllbnRBdXRoLnBrZXkga2V5ZmlsZSB3YXMgc3VwcGxpZWQgb24gb3VyXG4iKTsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBjb21tYW5kIGxpbmUuICBFeGl0aW5nLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgZmlyc3QgcGFja2V0ICdSRkIgMDAzLjAwNicgaXMgb2JzY3VyZWQgd2l0aCBrZXkKLQkgKiB0aGF0IGlzIGEgc2hhMSBoYXNoIG9mIHB1YmxpYyBrZXkuICBTbyBtYWtlIHRoaXMgdG1wIGtleSBub3c6Ci0gCSAqCi0JICovCi0JaW5pdGtleSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyhTRUNVUkVWTkNfS0VZX1NJWkUsIDEpOwotCUVWUF9CeXRlc1RvS2V5KEVWUF9yYzQoKSwgRVZQX3NoYTEoKSwgTlVMTCwgcnNhYnVmLCBTRUNVUkVWTkNfUlNBX1BVQktFWV9TSVpFLCAxLCBpbml0a2V5LCBOVUxMKTsKLQotCS8qIGV4cGFuZCB0aGUgdHJhbnNwb3J0ZWQgcnNhYnVmIGludG8gYW4gcnNhIG9iamVjdCAqLwotCXJzYSA9IGQyaV9SU0FQdWJsaWNLZXkoTlVMTCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopICZyc2FidWYsIFNFQ1VSRVZOQ19SU0FfUFVCS0VZX1NJWkUpOwotCWlmIChyc2EgPT0gTlVMTCkgewotCQlzc2xleGl0KCJzZWN1cmV2bmNfc2V0dXA6IGZhaWxlZCB0byBjcmVhdGUgcnNhIik7Ci0JfQotCi0JLyoKLQkgKiBCYWNrIHRvIHRoZSB3b3JrIGludm9sdmluZyB0aGUgdG1wIG9ic2N1cmluZyBrZXk6Ci0JICovCi0JRVZQX0NJUEhFUl9DVFhfaW5pdCgmaW5pdF9jdHgpOwotCXJjID0gRVZQX0NpcGhlckluaXRfZXgoJmluaXRfY3R4LCBFVlBfcmM0KCksIE5VTEwsIGluaXRrZXksIE5VTEwsIDEpOwotCWlmIChyYyA9PSAwKSB7Ci0JCXNzbGV4aXQoInNlY3VyZXZuY19zZXR1cDogRVZQX0NpcGhlckluaXRfZXgoaW5pdF9jdHgpIGZhaWxlZCIpOwotCX0KLQotCS8qIGZvciB0aGUgZmlyc3Qgb2JzY3VyZWQgcGFja2V0LCByZWFkIHdoYXQgd2UgY2FuLi4uICovCi0JbiA9IHJlYWQoc2VydmVyLCAoY2hhciAqKSBidWYsIEJTSVpFKTsKLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogZGF0YSByZWFkOiAlZFxuIiwgbik7Ci0JaWYgKG4gPCAwKSB7Ci0JCWV4aXQoMSk7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBpbml0aWFsIGRhdGFbJWRdOiAiLCBuKTsKLQkKLQkvKiBkZWNvZGUgd2l0aCB0aGUgdG1wIGtleSAqLwotCWlmIChuID4gMCkgewotCQltZW1zZXQodG9fdmlld2VyLCAwLCBzaXplb2YodG9fdmlld2VyKSk7Ci0JCWlmIChFVlBfQ2lwaGVyVXBkYXRlKCZpbml0X2N0eCwgdG9fdmlld2VyLCAmbGVuLCBidWYsIG4pID09IDApIHsKLQkJCXNzbGV4aXQoInNlY3VyZXZuY19zZXR1cDogRVZQX0NpcGhlclVwZGF0ZShpbml0X2N0eCkgZmFpbGVkIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXRvX3ZpZXdlcl9sZW4gPSBsZW47Ci0JfQotCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmluaXRfY3R4KTsKLQlmcmVlKGluaXRrZXkpOwotCi0JLyogcHJpbnQgd2hhdCB3ZSB3b3VsZCBzZW5kIHRvIHRoZSB2aWV3ZXIgKHNlbnQgYmVsb3cpOiAqLwotCXdyaXRlKDIsIHRvX3ZpZXdlciwgMTIpOwkvKiBhbmQgZmlyc3QgMTIgYnl0ZXMgJ1JGQiAuLi4nIGFzIG1lc3NhZ2UgKi8KLQotCS8qIG5vdyBjcmVhdGUgdGhlIHJhbmRvbSBzZXNzaW9uIGtleTogKi8KLQllbmNyeXB0ZWRfa2V5YnVmID0gKHVuc2lnbmVkIGNoYXIqKSBjYWxsb2MoUlNBX3NpemUocnNhKSwgMSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogY3JlYXRpbmcgcmFuZG9tIHNlc3Npb24ga2V5OiAlZC8lZFxuIiwKLQkgICAgU0VDVVJFVk5DX0tFWV9TSVpFLCBTRUNVUkVWTkNfUkFORF9LRVlfU09VUkNFKTsKLQlrZXlkYXRhX2xlbiA9IFNFQ1VSRVZOQ19SQU5EX0tFWV9TT1VSQ0U7Ci0KLQlyYyA9IFJBTkRfYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKilrZXlkYXRhLCBTRUNVUkVWTkNfUkFORF9LRVlfU09VUkNFKTsKLQlpZiAocmMgPD0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogUkFORF9ieXRlcygpIGZhaWxlZDogJXNcbiIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLCBOVUxMKSk7Ci0JCXJjID0gUkFORF9wc2V1ZG9fYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKilrZXlkYXRhLCBTRUNVUkVWTkNfUkFORF9LRVlfU09VUkNFKTsKLQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IFJBTkRfcHNldWRvX2J5dGVzKCkgcmM9JWRcbiIsIHJjKTsKLQkJaWYgKGdldGVudigiUkFORFNUUiIpKSB7Ci0JCQljaGFyICpzID0gZ2V0ZW52KCJSQU5EU1RSIik7IAotCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IHNlZWRpbmcgd2l0aCBSQU5EU1RSIGxlbj0lZFxuIiwgc3RybGVuKHMpKTsKLQkJCVJBTkRfYWRkKHMsIHN0cmxlbihzKSwgc3RybGVuKHMpKTsKLQkJfQotCX0KLQotCS8qIE4uQi4gdGhpcyB3aWxsIGJlIHJlcGVhdGVkIGluIGVuY194ZmVyKCkgc2V0dXAuICovCi0JRVZQX0J5dGVzVG9LZXkoQ2lwaGVyLCBEaWdlc3QsIE5VTEwsICh1bnNpZ25lZCBjaGFyICopIGtleWRhdGEsIGtleWRhdGFfbGVuLCAxLCBrZXlzdHIsIE5VTEwpOwotCi0JLyogZW5jcnlwdCB0aGUgc2Vzc2lvbiBrZXkgd2l0aCB0aGUgc2VydmVyJ3MgcHVibGljIHJzYSBrZXk6ICovCi0JbiA9IFJTQV9wdWJsaWNfZW5jcnlwdChTRUNVUkVWTkNfS0VZX1NJWkUsIGtleXN0ciwgZW5jcnlwdGVkX2tleWJ1ZiwgcnNhLCBSU0FfUEtDUzFfUEFERElORyk7Ci0JaWYgKG4gPT0gLTEpIHsKLQkJc3NsZXhpdCgic2VjdXJldm5jX3NldHVwOiBSU0FfcHVibGljX2VuY3J5cHQoKSBmYWlsZWQiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBzaXplOiAlZC4gc2VuZGluZyB0byBzZXJ2ZXIuXG4iLCBuKTsKLQotCS8qIHNlbmQgaXQgdG8gdGhlIHNlcnZlcjogKi8KLQl3cml0ZShzZXJ2ZXIsIGVuY3J5cHRlZF9rZXlidWYsIG4pOwotCWZyZWUoZW5jcnlwdGVkX2tleWJ1Zik7Ci0KLQkvKgotCSAqIFJlcGx5IGJhY2sgd2l0aCBmbGFncyBpbmRpY2F0aW5nIGNpcGhlciAoc2FtZSBhcyBvbmUgc2VudCB0bwotCSAqIHVzKSBhbmQgd2UgZG8gbm90IHdhbnQgY2xpZW50LXNpZGUgYXV0aC4KLQkgKgotCSAqIFdlIHNlbmQgaXQgb3V0IG9uIHRoZSB3aXJlIGluIGxpdHRsZSBlbmRpYW4gb3JkZXI6Ci0JICovCi0JaWYgKHNlY3VyZXZuY19hcmM0KSB7Ci0JCXdyaXRlKHNlcnZlciwgKGNoYXIgKikmemVybywgMSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGUoc2VydmVyLCAoY2hhciAqKSZvbmUsIDEpOwotCX0KLQl3cml0ZShzZXJ2ZXIsIChjaGFyICopJnplcm8sIDEpOwotCXdyaXRlKHNlcnZlciwgKGNoYXIgKikmemVybywgMSk7Ci0JaWYgKGNsaWVudF9hdXRoX3JlcSkgewotCQl3cml0ZShzZXJ2ZXIsIChjaGFyICopJnNpZywgMSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGUoc2VydmVyLCAoY2hhciAqKSZ6ZXJvLCAxKTsKLQl9Ci0KLQlpZiAoY2xpZW50X2F1dGhfcmVxICYmIGNsaWVudF9hdXRoKSB7Ci0JCVJTQSAqY2xpZW50X3JzYSA9IGxvYWRfY2xpZW50X2F1dGgoY2xpZW50X2F1dGgpOwotCQlFVlBfTURfQ1RYIGRjdHg7Ci0JCXVuc2lnbmVkIGNoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV0sICpzaWduYXR1cmU7Ci0JCXVuc2lnbmVkIGludCBuZGlnID0gMCwgbnNpZyA9IDA7Ci0KLQkJaWYgKDApIHsKLQkJCS8qIGZvciB0ZXN0aW5nIG9ubHksIHVzZSB0aGUgd3JvbmcgUlNBIGtleTogKi8KLQkJCWNsaWVudF9yc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDIwNDgsIDB4MTAwMDEsIE5VTEwsIE5VTEwpOwotCQl9Ci0JCQotCQlpZiAoY2xpZW50X3JzYSA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogcHJvYmxlbSByZWFkaW5nIHJzYSBrZXkgZnJvbSAnJXMnXG4iLCBjbGllbnRfYXV0aCk7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQkJRVZQX0RpZ2VzdEluaXQoJmRjdHgsIEVWUF9zaGExKCkpOwotCQlFVlBfRGlnZXN0VXBkYXRlKCZkY3R4LCBrZXlzdHIsIFNFQ1VSRVZOQ19LRVlfU0laRSk7Ci0JCS8qCi0JCSAqIFdpdGhvdXQgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBNSVRNIGlzIHN0aWxsIHBvc3NpYmxlLgotCQkgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIE1JVE0ga25vd3Mga2V5c3RyIGFuZCBjYW4gdXNlIGl0IHdpdGgKLQkJICogdGhlIHNlcnZlciBjb25uZWN0aW9uIGFzIHdlbGwsIGFuZCB0aGVuIGhlIGp1c3QgZm9yd2FyZHMgb3VyCi0JCSAqIHNpZ25lZCBkaWdlc3QuICBUaGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWxvdyB3b3VsZCBiZSB0aGUKLQkJICogTUlUTSdzIHJzYSBwdWJsaWMga2V5LCBhbmQgc28gdGhlIHJlYWwgVk5DIHNlcnZlciB3aWxsIG5vdGljZQotCQkgKiB0aGUgZGlmZmVyZW5jZS4gIEFuZCBNSVRNIGNhbid0IHNpZ24ga2V5c3RyK3NlcnZlcl9yc2EucHViIHNpbmNlCi0JCSAqIGhlIGRvZXNuJ3QgaGF2ZSBWaWV3ZXJfQ2xpZW50QXV0aC5wa2V5LgotCQkgKi8KLQkJaWYgKDApIHsKLQkJCUVWUF9EaWdlc3RVcGRhdGUoJmRjdHgsIHJzYXNhdiwgU0VDVVJFVk5DX1JTQV9QVUJLRVlfU0laRSk7Ci0JCQlpZiAoIWtleXN0b3JlX3ZlcmlmaWVkKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6XG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogV2FybmluZzogZXZlbiAqV0lUSCogQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGluIFNlY3VyZVZOQyxcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBhbiBhdHRhY2tlciBtYXkgYmUgYWJsZSB0byB0cmljayB5b3UgaW50byBjb25uZWN0aW5nIHRvIGhpc1xuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IGZha2UgVk5DIHNlcnZlciBhbmQgc3VwcGx5aW5nIFZOQyBvciBXaW5kb3dzIHBhc3N3b3JkcywgZXRjLlxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IFRvIGluY3JlYXNlIHNlY3VyaXR5IG1hbnVhbGx5IHZlcmlmeSB0aGUgU2VydmVyIFJTQSBrZXkncyBNRDVcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBjaGVja3N1bSBhbmQgdGhlbiBoYXZlIFNTVk5DIHNhdmUgdGhlIGtleSBpbiBpdHMga2V5c3RvcmUgdG9cbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgc2VydmVyIGluIHN1YnNlcXVlbnQgY29ubmVjdGlvbnMuXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDpcbiIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFrZXlzdG9yZV92ZXJpZmllZCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOlxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IFdBUk5JTkc6IFRIRSBGSVJTVCBWRVJTSU9OIE9GIFRIRSBTRUNVUkVWTkMgUFJPVE9DT0wgSVNcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBXQVJOSU5HOiBCRUlORyBVU0VELiAgKkVWRU4qIFdJVEggQ0xJRU5UIEFVVEhFTlRJQ0FUSU9OIElUXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogV0FSTklORzogSVMgU1VTQ0VQVElCTEUgVE8gQSBNQU4tSU4tVEhFLU1JRERMRSBBVFRBQ0suXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogVG8gaW5jcmVhc2Ugc2VjdXJpdHkgbWFudWFsbHkgdmVyaWZ5IHRoZSBTZXJ2ZXIgUlNBIGtleSdzIE1ENVxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IGNoZWNrc3VtIGFuZCB0aGVuIGhhdmUgU1NWTkMgc2F2ZSB0aGUga2V5IGluIGl0cyBrZXlzdG9yZSB0b1xuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzZWN1cmV2bmNfc2V0dXA6IGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBzZXJ2ZXIgaW4gc3Vic2VxdWVudCBjb25uZWN0aW9ucy5cbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOlxuIik7Ci0JCQl9Ci0JCX0KLQkJRVZQX0RpZ2VzdEZpbmFsKCZkY3R4LCAodW5zaWduZWQgY2hhciAqKWRpZ2VzdCwgJm5kaWcpOwotCi0JCXNpZ25hdHVyZSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyhSU0Ffc2l6ZShjbGllbnRfcnNhKSwgMSk7Ci0JCVJTQV9zaWduKE5JRF9zaGExLCBkaWdlc3QsIG5kaWcsIHNpZ25hdHVyZSwgJm5zaWcsIGNsaWVudF9yc2EpOwotCi0JCWZwcmludGYoc3RkZXJyLCAic2VjdXJldm5jX3NldHVwOiBzZW5kaW5nIENsaWVudEF1dGgucGtleSBzaWduZWQgZGF0YTogJWRcbiIsIG5zaWcpOwotCQl3cml0ZShzZXJ2ZXIsIHNpZ25hdHVyZSwgbnNpZyk7Ci0JCWZyZWUoc2lnbmF0dXJlKTsKLQotCQlSU0FfZnJlZShjbGllbnRfcnNhKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgInNlY3VyZXZuY19zZXR1cDogZG9uZS5cbiIpOwotCi0JLyogbm93IHNlbmQgdGhlICdSRkIgLi4uJyB0byB0aGUgdmlld2VyICovCi0JaWYgKHRvX3ZpZXdlcl9sZW4gPiAwKSB7Ci0JCXdyaXRlKHZpZXdlciwgdG9fdmlld2VyLCB0b192aWV3ZXJfbGVuKTsKLQl9Ci19Ci0KLSNpZm5kZWYgRU5DX0RJU0FCTEVfU0hPV19DRVJUCi1zdGF0aWMgdm9pZCBlbmNfc3NsZXJyZXhpdCh2b2lkKSB7Ci0JdW5zaWduZWQgbG9uZyBlcnIgPSBFUlJfZ2V0X2Vycm9yKCk7Ci0KLQlpZiAoZXJyKSB7Ci0JCWNoYXIgc3RyWzI1Nl07Ci0JCUVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzdHIpOwotCQlmcHJpbnRmKHN0ZG91dCwgInNzbCBlcnJvcjogJXNcbiIsIHN0cik7Ci0JfQotCWV4aXQoMSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2hvd19jZXJ0KGludCBzb2NrKSB7Ci0jaWZuZGVmIEVOQ19ESVNBQkxFX1NIT1dfQ0VSVAotCVNTTF9DVFggKmN0eDsKLQlTU0wgKnNzbCA9IE5VTEw7Ci0JU1RBQ0tfT0YoWDUwOSkgKnNrID0gTlVMTDsKLQlYNTA5ICpwZWVyID0gTlVMTDsKLQlTU0xfQ0lQSEVSICpjOwotCUJJTyAqYmlvOwotCXVuc2lnbmVkIGNoYXIgKnNpZCA9ICAodW5zaWduZWQgY2hhciAqKSAidWx0cmF2bmNfZHNtX2hlbHBlciBTSUQiOwotCWxvbmcgbW9kZTsKLQlpbnQgaTsKLQotCWZwcmludGYoc3Rkb3V0LCAiQ09OTkVDVEVEKCUwOFgpXG4iLHNvY2spOwotCi0JU1NMX2xpYnJhcnlfaW5pdCgpOwotCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKLQotCWlmICghUkFORF9zdGF0dXMoKSkgewotCQlSQU5EX3BvbGwoKTsKLQl9Ci0JLyogdGhpcyBpcyBub3QgZm9yIGEgc2VjdXJlZCBjb25uZWN0aW9uLiAqLwotCWZvciAoaT0wOyBpIDwgMTAwOyBpKyspIHsKLQkJaWYgKCFSQU5EX3N0YXR1cygpKSB7Ci0JCQljaGFyIHRtcFszMl07Ci0JCQlzcHJpbnRmKHRtcCwgIiVkIiwgZ2V0cGlkKCkgKiAoMTcgKyBpKSk7Ci0JCQlSQU5EX2FkZCh0bXAsIHN0cmxlbih0bXApLCA1KTsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JY3R4ID0gU1NMX0NUWF9uZXcoIFNTTHYyM19jbGllbnRfbWV0aG9kKCkgKTsKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRvdXQsICJzaG93X2NlcnQ6IFNTTF9DVFhfbmV3IGZhaWxlZC5cbiIpOwotCQljbG9zZShzb2NrKTsKLQkJZW5jX3NzbGVycmV4aXQoKTsKLQl9Ci0KLQltb2RlID0gMDsKLQltb2RlIHw9IFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFOwotCW1vZGUgfD0gU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVI7Ci0JU1NMX0NUWF9zZXRfbW9kZShjdHgsIG1vZGUpOwotCi0JaWYgKGdldGVudigiVUxUUkFWTkNfRFNNX0hFTFBFUl9TSE9XQ0VSVF9BREgiKSkgewotCQlTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHgsICJBREg6QFNUUkVOR1RIIik7Ci0JCVNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIFNTTF9WRVJJRllfTk9ORSwgTlVMTCk7Ci0JfQotCi0Jc3NsID0gU1NMX25ldyhjdHgpOwotCi0JaWYgKHNzbCA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAic2hvd19jZXJ0OiBTU0xfbmV3IGZhaWxlZC5cbiIpOwotCQljbG9zZShzb2NrKTsKLQkJZW5jX3NzbGVycmV4aXQoKTsKLQl9Ci0KLQlTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dChzc2wsIHNpZCwgc3RybGVuKChjaGFyICopc2lkKSk7Ci0KLQlpZiAoISBTU0xfc2V0X2ZkKHNzbCwgc29jaykpIHsKLQkJZnByaW50ZihzdGRvdXQsICJzaG93X2NlcnQ6IFNTTF9zZXRfZmQgZmFpbGVkLlxuIik7Ci0JCWNsb3NlKHNvY2spOwotCQllbmNfc3NsZXJyZXhpdCgpOwotCX0KLQotCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShzc2wpOwotCi0JaWYgKFNTTF9jb25uZWN0KHNzbCkgPD0gMCkgewotCQl1bnNpZ25lZCBsb25nIGVyciA9IEVSUl9nZXRfZXJyb3IoKTsKLQkJZnByaW50ZihzdGRvdXQsICJzaG93X2NlcnQ6IFNTTF9jb25uZWN0IGZhaWxlZC5cbiIpOwotCQlpZiAoZXJyKSB7Ci0JCQljaGFyIHN0clsyNTZdOwotCQkJRVJSX2Vycm9yX3N0cmluZyhlcnIsIHN0cik7Ci0JCQlmcHJpbnRmKHN0ZG91dCwgInNzbCBlcnJvcjogJXNcbiIsIHN0cik7Ci0JCX0KLQl9Ci0KLQlTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsKTsKLQotCXNrID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oc3NsKTsKLQlpZiAoc2sgIT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZG91dCwgIi0tLVxuQ2VydGlmaWNhdGUgY2hhaW5cbiIpOwotCQlmb3IgKGk9MDsgaSA8IHNrX1g1MDlfbnVtKHNrKTsgaSsrKSB7Ci0JCQljaGFyIGJ1ZlsyMDQ4XTsKLQkJCVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShza19YNTA5X3ZhbHVlKHNrLGkpKSwgYnVmLCBzaXplb2YgYnVmKTsKLQkJCWZwcmludGYoc3Rkb3V0LCAiJTJkIHM6JXNcbiIsIGksIGJ1Zik7Ci0JCQlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShza19YNTA5X3ZhbHVlKHNrLGkpKSwgYnVmLCBzaXplb2YgYnVmKTsKLQkJCWZwcmludGYoc3Rkb3V0LCAiICAgaTolc1xuIiwgYnVmKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAic2hvd19jZXJ0OiBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbiBmYWlsZWQuXG4iKTsKLQl9Ci0JZnByaW50ZihzdGRvdXQsICItLS1cbiIpOwotCXBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKTsKLQliaW8gPSBCSU9fbmV3X2ZwKHN0ZG91dCwgQklPX05PQ0xPU0UpOwotCWlmIChwZWVyICE9IE5VTEwpIHsKLQkJY2hhciBidWZbMjA0OF07Ci0JCUJJT19wcmludGYoYmlvLCJTZXJ2ZXIgY2VydGlmaWNhdGVcbiIpOwotCQlQRU1fd3JpdGVfYmlvX1g1MDkoYmlvLCBwZWVyKTsKLQotCQlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksIGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0JCUJJT19wcmludGYoYmlvLCJzdWJqZWN0PSVzXG4iLGJ1Zik7Ci0JCVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHBlZXIpLCBidWYsIHNpemVvZiBidWYpOwotCQlCSU9fcHJpbnRmKGJpbywiaXNzdWVyPSVzXG4iLGJ1Zik7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRvdXQsICJzaG93X2NlcnQ6IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZSBmYWlsZWQuXG4iKTsKLQl9Ci0KLQljID0gU1NMX2dldF9jdXJyZW50X2NpcGhlcihzc2wpOwotCUJJT19wcmludGYoYmlvLCItLS1cbk5ldywgJXMsIENpcGhlciBpcyAlc1xuIiwgU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihjKSwgU1NMX0NJUEhFUl9nZXRfbmFtZShjKSk7Ci0KLQlpZiAocGVlciAhPSBOVUxMKSB7Ci0JCUVWUF9QS0VZICpwa3RtcDsKLQkJcGt0bXAgPSBYNTA5X2dldF9wdWJrZXkocGVlcik7Ci0JCUJJT19wcmludGYoYmlvLCJTZXJ2ZXIgcHVibGljIGtleSBpcyAlZCBiaXRcbiIsIEVWUF9QS0VZX2JpdHMocGt0bXApKTsKLQkJRVZQX1BLRVlfZnJlZShwa3RtcCk7Ci0JfQotCUJJT19wcmludGYoYmlvLCItLS1cbkRPTkVcbi0tLVxuIik7Ci0JCi0JZmZsdXNoKHN0ZG91dCk7Ci0KLSNlbmRpZgotCWNsb3NlKHNvY2spOwotCWV4aXQoMCk7Ci19Ci0KLSNpZm5kZWYgU09MX0lQVjYKLSNpZmRlZiAgSVBQUk9UT19JUFY2Ci0jZGVmaW5lIFNPTF9JUFY2IElQUFJPVE9fSVBWNgotI2VuZGlmCi0jZW5kaWYKLQotLyoKLSAqIExpc3RlbnMgb24gaW5jb21pbmcgcG9ydCBmb3IgYSBjbGllbnQsIHRoZW4gY29ubmVjdHMgdG8gcmVtb3RlIHNlcnZlci4KLSAqIFRoZW4gZm9ya3MgaW50byB0d28gcHJvY2Vzc2VzIG9uZSBpcyB0aGUgZW5jcnlwdGVyIHRoZSBvdGhlciB0aGUKLSAqIGRlY3J5cHRlci4KLSAqLwotc3RhdGljIHZvaWQgZW5jX2Nvbm5lY3Rpb25zKGludCBsaXN0ZW5fcG9ydCwgY2hhciAqY29ubmVjdF9ob3N0LCBpbnQgY29ubmVjdF9wb3J0KSB7Ci0JaW50IGxpc3Rlbl9mZCA9IC0xLCBsaXN0ZW5fZmQ2ID0gLTEsIGNvbm4xID0gLTEsIGNvbm4yID0gLTEsIHJldCwgb25lID0gMTsKLQlzb2NrbGVuX3QgY2xlbjsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IHNvY2thZGRyX2luIGNsaWVudCwgc2VydmVyOwotCWZkX3NldCBmZHM7Ci0JaW50IG1heGZkID0gLTE7Ci0KLQkvKiB6ZXJvIG1lYW5zIHVzZSBzdGRpbyAocHJlZmVyYWJseSBmcm9tIHNvY2tldHBhaXIoKSkgKi8KLQlpZiAobGlzdGVuX3BvcnQgPT0gMCkgewotCQljb25uMSA9IGZpbGVubyhzdGRpbik7Ci0JCWdvdG8gdXNlX3N0ZGlvOwotCX0KLQotCWlmICghc3RyY21wKGNpcGhlciwgInNob3djZXJ0IikpIHsKLQkJZ290byB1c2Vfc3RkaW87Ci0JfQotCi0JLyogZmQ9bixtIG1lYW5zIHVzZSB0aGUgc3VwcGxpZWQgYWxyZWFkeSBlc3RhYmxpc2hlZCBzb2NrZXRzICovCi0JaWYgKHNzY2FuZihjb25uZWN0X2hvc3QsICJmZD0lZCwlZCIsICZjb25uMSwgJmNvbm4yKSA9PSAyKSB7Ci0JCWdvdG8gdXNlX2lucHV0X2ZkczsKLQl9Ci0KLQkvKiBjcmVhdGUgdGhlIGxpc3RlbmluZyBzb2NrZXQ6ICovCi0JbWVtc2V0KCZjbGllbnQsIDAsIHNpemVvZihjbGllbnQpKTsKLQljbGllbnQuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JaWYgKGxpc3Rlbl9wb3J0IDwgMCkgewotCQkvKiBuZWdhdGl2ZSBwb3J0IG1lYW5zIHVzZSBsb29wYmFjayAqLwotCQljbGllbnQuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKLQkJY2xpZW50LnNpbl9wb3J0ID0gaHRvbnMoLWxpc3Rlbl9wb3J0KTsKLQl9IGVsc2UgewotCQljbGllbnQuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0JCWNsaWVudC5zaW5fcG9ydCA9IGh0b25zKGxpc3Rlbl9wb3J0KTsKLQl9Ci0KLQlsaXN0ZW5fZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOyAKLQlpZiAobGlzdGVuX2ZkIDwgMCkgewotCQlwZXJyb3IoInNvY2tldCIpOwotCQlnb3RvIHRyeTY7Ci0JfQotCi0JcmV0ID0gc2V0c29ja29wdChsaXN0ZW5fZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKLQkgICAgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcGVycm9yKCJzZXRzb2Nrb3B0Iik7Ci0JCWNsb3NlKGxpc3Rlbl9mZCk7Ci0JCWxpc3Rlbl9mZCA9IC0xOwotCQlnb3RvIHRyeTY7Ci0JfQotCi0JcmV0ID0gYmluZChsaXN0ZW5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudCwgc2l6ZW9mKGNsaWVudCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXBlcnJvcigiYmluZCIpOwotCQljbG9zZShsaXN0ZW5fZmQpOwotCQlsaXN0ZW5fZmQgPSAtMTsKLQkJZ290byB0cnk2OwotCX0KLQotCXJldCA9IGxpc3RlbihsaXN0ZW5fZmQsIDIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXBlcnJvcigibGlzdGVuIik7Ci0JCWNsb3NlKGxpc3Rlbl9mZCk7Ci0JCWxpc3Rlbl9mZCA9IC0xOwotCQlnb3RvIHRyeTY7Ci0JfQotCi0JdHJ5NjoKLSNpZmRlZiBBRl9JTkVUNgotCWlmICghZ2V0ZW52KCJVTFRSQVZOQ19EU01fSEVMUEVSX05PSVBWNiIpKSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luOwotCQlpbnQgb25lID0gMSwgc29jayA9IC0xOwotCi0JCXNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKLQkJaWYgKHNvY2sgPCAwKSB7Ci0JCQlwZXJyb3IoInNvY2tldDYiKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7Ci0JCQlwZXJyb3IoInNldHNvY2tvcHQ2IFNPX1JFVVNFQUREUiIpOwotCQkJY2xvc2Uoc29jayk7Ci0JCQlzb2NrID0gLTE7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotI2lmIGRlZmluZWQoU09MX0lQVjYpICYmIGRlZmluZWQoSVBWNl9WNk9OTFkpCi0JCWlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9JUFY2LCBJUFY2X1Y2T05MWSwgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7Ci0JCQlwZXJyb3IoInNldHNvY2tvcHQ2IElQVjZfVjZPTkxZIik7Ci0JCQljbG9zZShzb2NrKTsKLQkJCXNvY2sgPSAtMTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotI2VuZGlmCi0KLQkJbWVtc2V0KChjaGFyICopJnNpbiwgMCwgc2l6ZW9mKHNpbikpOwotCQlzaW4uc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLQotCQlpZiAobGlzdGVuX3BvcnQgPCAwKSB7Ci0JCQlzaW4uc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKLQkJCXNpbi5zaW42X3BvcnQgPSBodG9ucygtbGlzdGVuX3BvcnQpOwotCQl9IGVsc2UgewotCQkJc2luLnNpbjZfYWRkciA9IGluNmFkZHJfYW55OwotCQkJc2luLnNpbjZfcG9ydCA9IGh0b25zKGxpc3Rlbl9wb3J0KTsKLQkJfQotCi0JCWlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHNpbikpIDwgMCkgewotCQkJcGVycm9yKCJiaW5kNiIpOwotCQkJY2xvc2Uoc29jayk7Ci0JCQlzb2NrID0gLTE7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlpZiAobGlzdGVuKHNvY2ssIDIpIDwgMCkgewotCQkJcGVycm9yKCJsaXN0ZW42Iik7Ci0JCQljbG9zZShzb2NrKTsKLQkJCXNvY2sgPSAtMTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWZhaWw6Ci0JCWxpc3Rlbl9mZDYgPSBzb2NrOwotCX0KLSNlbmRpZgotCi0JaWYgKGxpc3Rlbl9mZCA8IDAgJiYgbGlzdGVuX2ZkNiA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGxpc3RlbiBvbiBwb3J0OiAlZFxuIiwKLQkJICAgIHByb2csIGxpc3Rlbl9wb3J0KTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YWl0aW5nIGZvciBjb25uZWN0aW9uIG9uIHBvcnQ6ICVkXG4iLAotCSAgICBwcm9nLCBsaXN0ZW5fcG9ydCk7Ci0KLQkvKiB3YWl0IGZvciBhIGNvbm5lY3Rpb246ICovCi0JRkRfWkVSTygmZmRzKTsKLQlpZiAobGlzdGVuX2ZkID49IDApIHsKLQkJRkRfU0VUKGxpc3Rlbl9mZCwgJmZkcyk7Ci0JCWlmIChsaXN0ZW5fZmQgPiBtYXhmZCkgewotCQkJbWF4ZmQgPSBsaXN0ZW5fZmQ7Ci0JCX0KLQl9Ci0JaWYgKGxpc3Rlbl9mZDYgPj0gMCkgewotCQlGRF9TRVQobGlzdGVuX2ZkNiwgJmZkcyk7Ci0JCWlmIChsaXN0ZW5fZmQ2ID4gbWF4ZmQpIHsKLQkJCW1heGZkID0gbGlzdGVuX2ZkNjsKLQkJfQotCX0KLQlpZiAoc2VsZWN0KG1heGZkKzEsICZmZHMsIE5VTEwsIE5VTEwsIE5VTEwpIDw9IDApIHsKLQkJcGVycm9yKCJzZWxlY3QiKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAoRkRfSVNTRVQobGlzdGVuX2ZkLCAmZmRzKSkgewotCQljbGVuID0gc2l6ZW9mKGNsaWVudCk7Ci0JCWNvbm4xID0gYWNjZXB0KGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmY2xpZW50LCAmY2xlbik7Ci0JCWlmIChjb25uMSA8IDApIHsKLQkJCXBlcnJvcigiYWNjZXB0Iik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfSBlbHNlIGlmIChGRF9JU1NFVChsaXN0ZW5fZmQ2LCAmZmRzKSkgewotI2lmZGVmIEFGX0lORVQ2Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjsKLQkJc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0KLQkJY29ubjEgPSBhY2NlcHQobGlzdGVuX2ZkNiwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFkZHJsZW4pOwotCQlpZiAoY29ubjEgPCAwKSB7Ci0JCQlwZXJyb3IoImFjY2VwdDYiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLSNlbHNlCi0JCWZwcmludGYoc3RkZXJyLCAiTm8gSVB2NiAvIEFGX0lORVQ2IHN1cHBvcnQuXG4iKTsKLQkJZXhpdCgxKTsKLSNlbmRpZgotCX0KLQotCWlmIChzZXRzb2Nrb3B0KGNvbm4xLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpIDwgMCkgewotCQlwZXJyb3IoInNldHNvY2tvcHQgVENQX05PREVMQVkiKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQkvKiBkb25lIHdpdGggdGhlIGxpc3RlbmluZyBzb2NrZXQocyk6ICovCi0JaWYgKGxpc3Rlbl9mZCA+PSAwKSB7Ci0JCWNsb3NlKGxpc3Rlbl9mZCk7Ci0JfQotCWlmIChsaXN0ZW5fZmQ2ID49IDApIHsKLQkJY2xvc2UobGlzdGVuX2ZkNik7Ci0JfQotCi0JaWYgKGdldGVudigiVUxUUkFWTkNfRFNNX0hFTFBFUl9CRyIpKSB7Ci0JCWludCBwLCBuOwotCQlpZiAoKHAgPSBmb3JrKCkpID4gMCkgIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHB1dHRpbmcgY2hpbGQgJWQgaW4gYmFja2dyb3VuZC5cbiIsCi0JCQkgICAgcHJvZywgcCk7Ci0JCQlleGl0KDApOwotCQl9IGVsc2UgaWYgKHAgPT0gLTEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBmb3JrXG4iLCBwcm9nKTsKLQkJCXBlcnJvcigiZm9yayIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoc2V0c2lkKCkgPT0gLTEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHNldHNpZCBmYWlsZWRcbiIsIHByb2cpOwotCQkJcGVycm9yKCJzZXRzaWQiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJLyogYWRqdXN0IG91ciBzdGRpbyAqLwotCQluID0gb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOwotCQlkdXAyKG4sIDApOwotCQlkdXAyKG4sIDEpOwotCQlkdXAyKG4sIDIpOwotCQlpZiAobiA+IDIpIHsKLQkJCWNsb3NlKG4pOwotCQl9Ci0JfQotCi0JdXNlX3N0ZGlvOgotCi0JZnByaW50ZihzdGRlcnIsICIlczogZ290IGNvbm5lY3Rpb246ICVkXG4iLCBwcm9nLCBjb25uMSk7Ci0KLQkvKiBub3cgY29ubmVjdCB0byByZW1vdGUgc2VydmVyOiAqLwotCW1lbXNldCgmc2VydmVyLCAwLCBzaXplb2Yoc2VydmVyKSk7Ci0Jc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCXNlcnZlci5zaW5fcG9ydCA9IGh0b25zKGNvbm5lY3RfcG9ydCk7Ci0KLQlpZiAoKHNlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoY29ubmVjdF9ob3N0KSkgPT0gaHRvbmwoSU5BRERSX05PTkUpKSB7Ci0JCWlmICghKGhwID0gZ2V0aG9zdGJ5bmFtZShjb25uZWN0X2hvc3QpKSkgewotCQkJcGVycm9yKCJnZXRob3N0YnluYW1lIik7Ci0JCQlnb3RvIHRyeWNvbm42OwotCQl9Ci0JCXNlcnZlci5zaW5fYWRkci5zX2FkZHIgPSAqKHVuc2lnbmVkIGxvbmcgKilocC0+aF9hZGRyOwotCX0KLQotCWNvbm4yID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAoY29ubjIgPCAwKSB7Ci0JCXBlcnJvcigic29ja2V0Iik7Ci0JCWdvdG8gdHJ5Y29ubjY7Ci0JfQotCi0JaWYgKGNvbm5lY3QoY29ubjIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyLCAoc2l6ZW9mKHNlcnZlcikpKSA8IDApIHsKLQkJcGVycm9yKCJjb25uZWN0Iik7Ci0JCWdvdG8gdHJ5Y29ubjY7Ci0JfQotCi0JdHJ5Y29ubjY6Ci0jaWZkZWYgQUZfSU5FVDYKLQlpZiAoY29ubjIgPCAwICYmICFnZXRlbnYoIlVMVFJBVk5DX0RTTV9IRUxQRVJfTk9JUFY2IikpIHsKLQkJaW50IGVycjsKLQkJc3RydWN0IGFkZHJpbmZvICphaTsKLQkJc3RydWN0IGFkZHJpbmZvIGhpbnRzOwotCQljaGFyIHNlcnZpY2VbMzJdOwotCi0JCWZwcmludGYoc3RkZXJyLCAiY29ubmVjdFtpcHY2XTogdHJ5aW5nIHRvIGNvbm5lY3QgdmlhIElQdjYgdG8gJXNcbiIsIGNvbm5lY3RfaG9zdCk7Ci0JCWNvbm4yID0gLTE7Ci0KLQkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JCXNwcmludGYoc2VydmljZSwgIiVkIiwgY29ubmVjdF9wb3J0KTsKLQotCQloaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0JCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0jaWZkZWYgQUlfQUREUkNPTkZJRwotCQloaW50cy5haV9mbGFncyB8PSBBSV9BRERSQ09ORklHOwotI2VuZGlmCi0jaWZkZWYgQUlfTlVNRVJJQ1NFUlYKLQkJaGludHMuYWlfZmxhZ3MgfD0gQUlfTlVNRVJJQ1NFUlY7Ci0jZW5kaWYKLQotCQllcnIgPSBnZXRhZGRyaW5mbyhjb25uZWN0X2hvc3QsIHNlcnZpY2UsICZoaW50cywgJmFpKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImdldGFkZHJpbmZvWyVkXTogJXNcbiIsIGVyciwgZ2FpX3N0cmVycm9yKGVycikpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGFkZHJpbmZvICphcCA9IGFpOwotCQkJd2hpbGUgKGFwICE9IE5VTEwpIHsKLQkJCQlpbnQgZmQgPSAtMTsKLQkJCQlmZCA9IHNvY2tldChhcC0+YWlfZmFtaWx5LCBhcC0+YWlfc29ja3R5cGUsIGFwLT5haV9wcm90b2NvbCk7Ci0JCQkJaWYgKGZkID09IC0xKSB7Ci0JCQkJCXBlcnJvcigic29ja2V0NiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBkbXNnID0gMDsgCi0JCQkJCWludCByZXMgPSBjb25uZWN0KGZkLCBhcC0+YWlfYWRkciwgYXAtPmFpX2FkZHJsZW4pOwotI2lmIGRlZmluZWQoU09MX0lQVjYpICYmIGRlZmluZWQoSVBWNl9WNk9OTFkpCi0JCQkJCWlmIChyZXMgIT0gMCkgewotCQkJCQkJaW50IHplcm8gPSAwOwotCQkJCQkJcGVycm9yKCJjb25uZWN0NiIpOwotCQkJCQkJZG1zZyA9IDE7Ci0JCQkJCQlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfVjZPTkxZLCAoY2hhciAqKSZ6ZXJvLCBzaXplb2YoemVybykpID09IDApIHsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgImNvbm5lY3RbaXB2Nl06IHRyeWluZyBhZ2FpbiB3aXRoIElQVjZfVjZPTkxZPTBcbiIpOwotCQkJCQkJCXJlcyA9IGNvbm5lY3QoZmQsIGFwLT5haV9hZGRyLCBhcC0+YWlfYWRkcmxlbik7Ci0JCQkJCQkJZG1zZyA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLSNlbmRpZgotCQkJCQlpZiAocmVzID09IDApIHsKLQkJCQkJCWNvbm4yID0gZmQ7IAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWRtc2cpIHBlcnJvcigiY29ubmVjdDYiKTsKLQkJCQkJCWNsb3NlKGZkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhcCA9IGFwLT5haV9uZXh0OwotCQkJfQotCQkJZnJlZWFkZHJpbmZvKGFpKTsKLQkJfQotCX0KLSNlbmRpZgotCWlmIChjb25uMiA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29ubmVjdCB0byAlc1xuIiwgY29ubmVjdF9ob3N0KTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKGNvbm4yID49IDAgJiYgc2V0c29ja29wdChjb25uMiwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLQkJcGVycm9yKCJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIik7Ci0JfQotCi0JdXNlX2lucHV0X2ZkczoKLQotCWlmICghc3RyY21wKGNpcGhlciwgInNob3djZXJ0IikpIHsKLQkJc2hvd19jZXJ0KGNvbm4yKTsKLQkJY2xvc2UoY29ubjIpOwotCQlleGl0KDApOwotCX0KLQotCWlmIChzZWN1cmV2bmMpIHsKLQkJc2VjdXJldm5jX3NldHVwKGNvbm4xLCBjb25uMik7Ci0JfQotCi0JLyogZm9yayBpbnRvIHR3byBwcm9jZXNzZXM7IG9uZSBmb3IgZWFjaCBkaXJlY3Rpb246ICovCi0JcGFyZW50ID0gZ2V0cGlkKCk7Ci0JCi0JY2hpbGQgPSBmb3JrKCk7Ci0JCi0JaWYgKGNoaWxkID09IChwaWRfdCkgLTEpIHsKLQkJLyogY291bGRuJ3QgZm9yay4uLiAqLwotCQlwZXJyb3IoImZvcmsiKTsKLQkJY2xvc2UoY29ubjEpOwotCQljbG9zZShjb25uMik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogRG8gdHJhbnNmZXIvZW5jb2RlL2RlY29kZSBsb29wOiAqLwotCi0JaWYgKGNoaWxkID09IDApIHsKLQkJLyogZW5jcnlwdGVyOiBsb2NhbC12aWV3ZXIgLT4gcmVtb3RlLXNlcnZlciAqLwotCQlpZiAoIXN0cmNtcChjaXBoZXIsICJub25lIikgfHwgIXN0cmNtcChjaXBoZXIsICJyZWxheSIpKSB7Ci0JCQllbmNfcmF3X3hmZXIoY29ubjEsIGNvbm4yKTsKLQkJfSBlbHNlIHsKLQkJCWVuY194ZmVyKGNvbm4xLCBjb25uMiwgMSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBkZWNyeXB0ZXI6IHJlbW90ZS1zZXJ2ZXIgLT4gbG9jYWwtdmlld2VyICovCi0JCWlmICghc3RyY21wKGNpcGhlciwgIm5vbmUiKSB8fCAhc3RyY21wKGNpcGhlciwgInJlbGF5IikpIHsKLQkJCWVuY19yYXdfeGZlcihjb25uMiwgY29ubjEpOwotCQl9IGVsc2UgewotCQkJZW5jX3hmZXIoY29ubjIsIGNvbm4xLCAwKTsKLQkJfQotCX0KLX0KLSNlbmRpZiAvKiBFTkNfSEFWRV9PUEVOU1NMICovCi0KLXN0YXRpYyB2b2lkIGRvbG9vcCAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotCWludCBtcyA9IGF0b2koZ2V0ZW52KCJVTFRSQVZOQ19EU01fSEVMUEVSX0xPT1AiKSk7Ci0JaWYgKG1zID4gMCkgewotCQljaGFyICpjbWQ7Ci0JCWludCBpLCBsZW4gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCQlsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pICsgMjsKLQkJfQotCQljbWQgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwotCQljbWRbMF0gPSAnXDAnOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCQlzdHJjYXQoY21kLCBhcmd2W2ldKTsKLQkJCWlmIChpIDwgYXJnYyAtIDEpIHsKLQkJCQlzdHJjYXQoY21kLCAiICIpOwotCQkJfQotCQl9Ci0KLQkJcHV0ZW52KCJVTFRSQVZOQ19EU01fSEVMUEVSX0xPT1BfU0VUPTEiKTsKLQkJaWYgKG1zID09IDEpIHsKLQkJCW1zID0gNTAwOwotCQl9Ci0JCWkgPSAwOwotCQl3aGlsZSAoMSkgewotCQkJZnByaW50ZihzdGRlcnIsICJsb29wIHJ1bm5pbmdbJWRdOiAlc1xuIiwgKytpLCBjbWQpOwotCQkJc3lzdGVtKGNtZCk7Ci0JCQl1c2xlZXAoMTAwMCAqIG1zKTsKLQkJfQotCX0KLX0KLQotZXh0ZXJuIGludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JY2hhciAqa2YsICpxOwotCi0JaWYgKGdldGVudigiVUxUUkFWTkNfRFNNX0hFTFBFUl9MT09QIikpIHsKLQkJaWYgKCFnZXRlbnYoIlVMVFJBVk5DX0RTTV9IRUxQRVJfTE9PUF9TRVQiKSkgewotCQkJZG9sb29wKGFyZ2MsIGFyZ3YpOwotCQl9Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMykgewotCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAic2hvd2NlcnQiKSkgewotCQkJZW5jX2RvKGFyZ3ZbMV0sIE5VTEwsIE5VTEwsIGFyZ3ZbMl0pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGFyZ2MgPT0gNCkgewotCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAibm9uZSIpIHx8ICFzdHJjbXAoYXJndlsxXSwgInJlbGF5IikpIHsKLQkJCWVuY19kbyhhcmd2WzFdLCBOVUxMLCBhcmd2WzJdLCBhcmd2WzNdKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChhcmdjIDwgNSkgewotCQlmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCB1c2FnZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogZ3VhcmQgYWdhaW5zdCBwdz0gb24gY21kbGluZSAoZS5nLiBsaW51eCkgKi8KLQlrZiA9IHN0cmR1cChhcmd2WzJdKTsKLQlxID0gc3Ryc3RyKGFyZ3ZbMl0sICJwdz0iKTsKLQlpZiAocSkgewotCQl3aGlsZSAoKnEgIT0gJ1wwJykgewotCQkJKnEgPSAnXDAnOwkvKiBub3cgcHMoMSkgd29uJ3Qgc2hvdyBpdCAqLwotCQkJcSsrOwotCQl9Ci0JfQotCi0JZW5jX2RvKGFyZ3ZbMV0sIGtmLCBhcmd2WzNdLCBhcmd2WzRdKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogYSBjcnVkZSB1dGlsaXR5IHRvIGhhdmUgdGhpcyB3b3JrICJrZXlsZXNzIiBpLmUuIHRoZSB2bmMgcGFzc3dvcmQKLSAqIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHByZS1zaGFyZWQga2V5IGZpbGUuCi0gKi8KLQotLyoKLQotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIG1kNV90b19yYzRrZXkucGwKLSMKLSMgVGhpcyBwcm9ncmFtIHJlcXVpcmVzIG1kNXN1bSgxKSBpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLgotIwotIyBJdCB0cmFuc2xhdGVzIGEgVk5DIHBhc3N3b3JkIHRvIGEgdWx0cmF2bmMgZHNtIHBsdWdpbiAKLSMgY29tcGF0aWJsZSBrZXkgZmlsZS4KLSMKLSMgU3VwcGx5IFZOQyBwYXNzd29yZCBvbiBjbWRsaW5lLCBjYXB0dXJlIGluIGtleSBmaWxlOgotIwotIwltZDVfdG9fcmM0a2V5LnBsIHN3b3JkZmlzaCAgICA+IHJjNC5rZXkKLSMJbWQ1X3RvX3JjNGtleS5wbCAtYSBzd29yZGZpc2ggPiBhcmM0LmtleQotIwotIyBVc2UgcmM0LmtleSB3aXRoIHVsdHJhdm5jX2RzbV9oZWxwZXIgaW4gbXNyYzQgbW9kZSwKLSMgb3IgYXJjNC5rZXkgaW4gZWl0aGVyIGFyYzQgb3IgYWVzdjQgbW9kZS4KLSMKLSMKLSRyZm10ID0gMTsKLWlmICgkQVJHVlswXSBlcSAnLWEnKSB7Ci0JJHJmbXQgPSAwOwotCXNoaWZ0OwotfQotCi0jIG4uYi4gdGhpcyBpcyBub3Qgc3VwZXIgc2VjdXJlIGFnYWluc3QgYmFkIGxvY2Fscy4uLgotCi0kcHcgPSBzaGlmdDsKLSR0bXAgPSAiL3RtcC9tZDVvdXQuJCQiOwotCi1vcGVuKE1ENSwgInwgbWQ1c3VtID4gJHRtcCIpOwotcHJpbnQgTUQ1ICRwdzsKLWNsb3NlIE1ENTsKLQotJG1kNSA9IGBjYXQgJHRtcGA7Ci11bmxpbmsgJHRtcDsKLQotKCRtZDUsICRqdW5rKSA9IHNwbGl0KC9ccy8sICRtZDUpOwotCi1wcmludCAiMTI4IGJpdCIgaWYgJHJmbXQ7Ci1wcmludCAnYScgeCA0CWlmICRyZm10OwotcHJpbnQgJ2InIHggMTIJaWYgJHJmbXQ7Ci0KLSRzdHIgPSAnJzsKLWZvcmVhY2ggJGQgKHNwbGl0KC8vLCAkbWQ1KSkgewotCSRzdHIgLj0gJGQ7Ci0JaWYgKGxlbmd0aCgkc3RyKSA9PSAyKSB7Ci0JCXB1c2ggQGtleSwgJHN0cjsKLQkJJHN0ciA9ICcnOwotCX0KLX0KLQotQGtleSA9IChyZXZlcnNlIEBrZXkpIGlmICRyZm10OwotCi1mb3JlYWNoICRoIChAa2V5KSB7Ci0JJGMgPSBwYWNrKCdjJywgaGV4KCIweCRoIikpOwkKLQlwcmludCAkYzsKLX0KLQotcHJpbnQgJ2MnIHggNDgJaWYgJHJmbXQ7Ci0KLSovCi0jZW5kaWYgLyogX1gxMVZOQ19FTkNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2VudW1zLmggYi94MTF2bmMvZW51bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljZTg0Yy4uMDAwMDAwMAotLS0gYS94MTF2bmMvZW51bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX0VOVU1TX0gKLSNkZWZpbmUgX1gxMVZOQ19FTlVNU19ICi0KLS8qIC0tIGVudW1zLmggLS0gKi8KLQotZW51bSB7Ci0JTFJfVU5TRVQgPSAwLAotCUxSX1VOS05PV04sCi0JTFJfRElBTFVQLAotCUxSX0JST0FEQkFORCwKLQlMUl9MQU4KLX07Ci0KLWVudW0gc2Nyb2xsX3R5cGVzIHsKLQlTQ1JfTk9ORSA9IDAsCi0JU0NSX01PVVNFLAotCVNDUl9LRVksCi0JU0NSX0ZBSUwsCi0JU0NSX1NVQ0NFU1MKLX07Ci0KLSNlbmRpZiAvKiBfWDExVk5DX0VOVU1TX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9ndWkuYyBiL3gxMXZuYy9ndWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwMWFkYi4uMDAwMDAwMAotLS0gYS94MTF2bmMvZ3VpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBndWkuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieGV2ZW50cy5oIgotI2luY2x1ZGUgIndpbl91dGlscy5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotCi0jaW5jbHVkZSAidGt4MTF2bmMuaCIKLQotI2RlZmluZSBTWVNURU1fVFJBWV9SRVFVRVNUX0RPQ0sgICAgMAotI2RlZmluZSBTWVNURU1fVFJBWV9CRUdJTl9NRVNTQUdFICAgMQotI2RlZmluZSBTWVNURU1fVFJBWV9DQU5DRUxfTUVTU0FHRSAgMgotI2RlZmluZSBYRU1CRURfVkVSU0lPTiAwCi0jZGVmaW5lIFhFTUJFRF9NQVBQRUQgICgxIDw8IDApCi0KLWludCBpY29uX21vZGUgPSAwOwkJLyogaGFjayBmb3IgLWd1aSB0cmF5L2ljb24gKi8KLWNoYXIgKmljb25fbW9kZV9maWxlID0gTlVMTDsKLUZJTEUgKmljb25fbW9kZV9maCA9IE5VTEw7Ci1pbnQgaWNvbl9tb2RlX3NvY2tzW0lDT05fTU9ERV9TT0NLU107Ci1pbnQgdHJheV9tYW5hZ2VyX29rID0gMDsKLVdpbmRvdyB0cmF5X3JlcXVlc3QgPSBOb25lOwotV2luZG93IHRyYXlfd2luZG93ID0gTm9uZTsKLWludCB0cmF5X3VuZW1iZWQgPSAwOwotcGlkX3QgcnVuX2d1aV9waWQgPSAwOwotcGlkX3QgZ3VpX3BpZCA9IDA7Ci0KLQotY2hhciAqZ2V0X2d1aV9jb2RlKHZvaWQpOwotaW50IHRyYXlfZW1iZWQoV2luZG93IGljb253aW4sIGludCByZW1vdmUpOwotdm9pZCBkb19ndWkoY2hhciAqb3B0cywgaW50IHNsZWVwKTsKLQotCi1zdGF0aWMgV2luZG93IHR3ZWFrX3RrX3dpbmRvd19pZChXaW5kb3cgd2luKTsKLXN0YXRpYyBpbnQgdHJheV9tYW5hZ2VyX3J1bm5pbmcoRGlzcGxheSAqZCwgV2luZG93ICptYW5hZ2VyKTsKLXN0YXRpYyB2b2lkIHJ1bl9ndWkoY2hhciAqZ3VpX3hkaXNwbGF5LCBpbnQgY29ubmVjdF90b194MTF2bmMsIGludCBzdGFydF94MTF2bmMsCi0gICAgaW50IHNpbXBsZV9ndWksIHBpZF90IHBhcmVudCwgY2hhciAqZ3VpX29wdHMpOwotCi0KLWNoYXIgKmdldF9ndWlfY29kZSh2b2lkKSB7Ci0JcmV0dXJuIGd1aV9jb2RlOwotfQotCi1zdGF0aWMgV2luZG93IHR3ZWFrX3RrX3dpbmRvd19pZChXaW5kb3cgd2luKSB7Ci0jaWYgTk9fWDExCi0JaWYgKCF3aW4pIHt9Ci0JcmV0dXJuIE5vbmU7Ci0jZWxzZQotCWNoYXIgKm5hbWUgPSBOVUxMOwotCVdpbmRvdyBwYXJlbnQsIG5ld193aW47Ci0KLQlpZiAoZ2V0ZW52KCJOT19UV0VBS19US19XSU5ET1dfSUQiKSkgewotCQlyZXR1cm4gd2luOwotCX0KLQotCS8qIGhhY2sgZm9yIHRrLCBkb2VzIG5vdCByZXBvcnQgb3V0ZXJtb3N0IHdpbmRvdyAqLwotCW5ld193aW4gPSB3aW47Ci0JcGFyZW50ID0gcGFyZW50X3dpbmRvdyh3aW4sICZuYW1lKTsKLQlpZiAocGFyZW50ICYmIG5hbWUgIT0gTlVMTCkgewotCQlsb3dlcmNhc2UobmFtZSk7Ci0JCWlmIChzdHJzdHIobmFtZSwgIndpc2giKSB8fCBzdHJzdHIobmFtZSwgIngxMXZuYyIpKSB7Ci0JCQluZXdfd2luID0gcGFyZW50OwotCQkJcmZiTG9nKCJ0cmF5X2VtYmVkOiB1c2luZyBwYXJlbnQ6ICVzXG4iLCBuYW1lKTsKLQkJfQotCX0KLQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCVhGcmVlX3dyKG5hbWUpOwotCX0KLQlyZXR1cm4gbmV3X3dpbjsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotaW50IHRyYXlfZW1iZWQoV2luZG93IGljb253aW4sIGludCByZW1vdmUpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVQoMCkKLQlpZiAoIWljb253aW4gfHwgIXJlbW92ZSkge30KLQlyZXR1cm4gMDsKLSNlbHNlCi0JWEV2ZW50IGV2OwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7Ci0JV2luZG93IG1hbmFnZXI7Ci0JQXRvbSB4ZW1iZWRfaW5mbzsKLQlBdG9tIHRhdG9tOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JbG9uZyBpbmZvWzJdID0ge1hFTUJFRF9WRVJTSU9OLCBYRU1CRURfTUFQUEVEfTsKLQlsb25nIGRhdGEgPSAwOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAocmVtb3ZlKSB7Ci0JCWlmICghdmFsaWRfd2luZG93KGljb253aW4sICZhdHRyLCAxKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWNvbndpbiA9IHR3ZWFrX3RrX3dpbmRvd19pZChpY29ud2luKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCi0JCS8qCi0JCSAqIHVuZm9ydHVuYXRlbHkgbm8gZGVza3RvcHMgc2VlbSB0byBvYmV5IHRoaXMKLQkJICogcGFydCBvZiB0aGUgWEVNQkVEIHNwZWMgeWV0Li4uCi0JCSAqLwotCQlYUmVwYXJlbnRXaW5kb3coZHB5LCBpY29ud2luLCByb290d2luLCAwLCAwKTsKLQotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJaWYgKHRyYXBwZWRfeGVycm9yKSB7Ci0JCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCXJldHVybiAxOwotCX0KLQotCXhlbWJlZF9pbmZvID0gWEludGVybkF0b20oZHB5LCAiX1hFTUJFRF9JTkZPIiwgRmFsc2UpOwotCWlmICh4ZW1iZWRfaW5mbyA9PSBOb25lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdHJheV9tYW5hZ2VyX3J1bm5pbmcoZHB5LCAmbWFuYWdlcikpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7Ci0JZXYueGNsaWVudC50eXBlID0gQ2xpZW50TWVzc2FnZTsKLQlldi54Y2xpZW50LndpbmRvdyA9IG1hbmFnZXI7Ci0JZXYueGNsaWVudC5tZXNzYWdlX3R5cGUgPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX1NZU1RFTV9UUkFZX09QQ09ERSIsCi0JICAgIEZhbHNlKTsKLQlldi54Y2xpZW50LmZvcm1hdCA9IDMyOwotCWV2LnhjbGllbnQuZGF0YS5sWzBdID0gQ3VycmVudFRpbWU7Ci0JZXYueGNsaWVudC5kYXRhLmxbMV0gPSBTWVNURU1fVFJBWV9SRVFVRVNUX0RPQ0s7Ci0JZXYueGNsaWVudC5kYXRhLmxbMl0gPSBpY29ud2luOwotCWV2LnhjbGllbnQuZGF0YS5sWzNdID0gMDsKLQlldi54Y2xpZW50LmRhdGEubFs0XSA9IDA7Ci0KLQlpZiAoIXZhbGlkX3dpbmRvdyhpY29ud2luLCAmYXR0ciwgMSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWNvbndpbiA9IHR3ZWFrX3RrX3dpbmRvd19pZChpY29ud2luKTsKLQlldi54Y2xpZW50LmRhdGEubFsyXSA9IGljb253aW47Ci0KLQlYVW5tYXBXaW5kb3coZHB5LCBpY29ud2luKTsKLQotCXRyYXBwZWRfeGVycm9yID0gMDsKLQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCi0JWFNlbmRFdmVudChkcHksIG1hbmFnZXIsIEZhbHNlLCBOb0V2ZW50TWFzaywgJmV2KTsKLQlYU3luYyhkcHksIEZhbHNlKTsKLQotCWlmICh0cmFwcGVkX3hlcnJvcikgewotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlYQ2hhbmdlUHJvcGVydHkoZHB5LCBpY29ud2luLCB4ZW1iZWRfaW5mbywgeGVtYmVkX2luZm8sIDMyLAotCSAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyICopJmluZm8sIDIpOwotCi0jaWYgMAotewotWFNpemVIaW50cyAqeHN6aCA9IFhBbGxvY1NpemVIaW50cygpOwoteHN6aC0+ZmxhZ3MgPSBQTWluU2l6ZTsKLXhzemgtPm1pbl93aWR0aCA9IDI0OwoteHN6aC0+bWluX2hlaWdodCA9IDI0OwotWFNldFdNTm9ybWFsSGludHMoZHB5LCBpY29ud2luLCB4c3poKTsKLX0KLSNlbmRpZgotCi0JLyoga2x1ZGdlIGZvciBLREUgZXZpZGVudGx5IG5lZWRlZC4uLiAqLwotCXRhdG9tID0gWEludGVybkF0b20oZHB5LCAiS1dNX0RPQ0tXSU5ET1ciLCBGYWxzZSk7Ci0JWENoYW5nZVByb3BlcnR5KGRweSwgaWNvbndpbiwgdGF0b20sIHRhdG9tLCAzMiwgUHJvcE1vZGVSZXBsYWNlLAotCSAgICAodW5zaWduZWQgY2hhciAqKSZkYXRhLCAxKTsKLQl0YXRvbSA9IFhJbnRlcm5BdG9tKGRweSwgIl9LREVfTkVUX1dNX1NZU1RFTV9UUkFZX1dJTkRPV19GT1IiLCBGYWxzZSk7Ci0JWENoYW5nZVByb3BlcnR5KGRweSwgaWNvbndpbiwgdGF0b20sIFhBX1dJTkRPVywgMzIsIFByb3BNb2RlUmVwbGFjZSwKLQkgICAgKHVuc2lnbmVkIGNoYXIgKikmZGF0YSwgMSk7Ci0KLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyBpbnQgdHJheV9tYW5hZ2VyX3J1bm5pbmcoRGlzcGxheSAqZCwgV2luZG93ICptYW5hZ2VyKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUKDApCi0JaWYgKCFkIHx8ICFtYW5hZ2VyKSB7fQotCXJldHVybiAwOwotI2Vsc2UKLQljaGFyIHRyYXlfc3RyaW5nWzEwMF07Ci0JQXRvbSB0cmF5X21hbmFnZXI7Ci0JV2luZG93IHRyYXlfd2luOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAobWFuYWdlcikgewotCQkqbWFuYWdlciA9IE5vbmU7Ci0JfQotCXNwcmludGYodHJheV9zdHJpbmcsICJfTkVUX1NZU1RFTV9UUkFZX1MlZCIsIHNjcik7Ci0KLQl0cmF5X21hbmFnZXIgPSBYSW50ZXJuQXRvbShkLCB0cmF5X3N0cmluZywgVHJ1ZSk7Ci0JaWYgKHRyYXlfbWFuYWdlciA9PSBOb25lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXRyYXlfd2luID0gWEdldFNlbGVjdGlvbk93bmVyKGQsIHRyYXlfbWFuYWdlcik7Ci0JaWYgKG1hbmFnZXIpIHsKLQkJKm1hbmFnZXIgPSB0cmF5X3dpbjsKLQl9Ci0KLQlpZiAodHJheV93aW4gPT0gTm9uZSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyBjaGFyICpndWlfZ2VvbWV0cnkgPSBOVUxMOwotc3RhdGljIGludCBpY29uX2luX3RyYXkgPSAwOwotc3RhdGljIGNoYXIgKmljb25fbW9kZV9lbWJlZF9pZCA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqaWNvbl9tb2RlX2ZvbnQgPSBOVUxMOwotc3RhdGljIGNoYXIgKmljb25fbW9kZV9wYXJhbXMgPSBOVUxMOwotCi1zdGF0aWMgaW50IGdvdF9zaWd1c3IxID0gMDsKLQotc3RhdGljIHZvaWQgc2lndXNyMSAoaW50IHNpZykgewotCWdvdF9zaWd1c3IxID0gMTsKLQlpZiAoMCkgc2lnID0gMDsKLX0KLQotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIG1lc3MgaXMgZm9yIHdpc2ggb24gU29sYXJpczogKi8KLQotc3RhdGljIGNoYXIgKmV4dHJhX3BhdGggPSAiOi91c3IvbG9jYWwvYmluOi91c3IvYmluL1gxMTovdXNyL3Nmdy9iaW4iCi0JICAgICI6L3Vzci9YMTFSNi9iaW46L3Vzci9vcGVud2luL2JpbjovdXNyL2R0L2Jpbjovb3B0L3Nmdy9iaW4iOwotc3RhdGljIGNoYXIgKndpc2hlc1tdID0geyJ3aXNoOC40IiwgIndpc2giLCAid2lzaDguMyIsICJ3aXNoOC41IiwgIndpc2g4LjYiLCAid2lzaDguNyIsICJ3aXNoeCIsICJ3aXNoOC4wIiwgTlVMTH07Ci0KLXN0YXRpYyB2b2lkIHJ1bl9ndWkoY2hhciAqZ3VpX3hkaXNwbGF5LCBpbnQgY29ubmVjdF90b194MTF2bmMsIGludCBzdGFydF94MTF2bmMsCi0gICAgaW50IHNpbXBsZV9ndWksIHBpZF90IHBhcmVudCwgY2hhciAqZ3VpX29wdHMpIHsKLQljaGFyICp4MTF2bmNfeGRpc3BsYXkgPSBOVUxMOwotCWNoYXIgY21kWzEwMF07Ci0JY2hhciAqd2lzaCA9IE5VTEwsICpvcmlnX3BhdGgsICpmdWxsX3BhdGgsICp0cGF0aCwgKnA7Ci0JY2hhciAqb2xkX3hhdXRoID0gTlVMTDsKLQlpbnQgdHJ5X21heCA9IDQsIHNsZWVwID0gMzAwLCB0b3RtcywgcmMgPSAwOwotCXBpZF90IG15cGlkID0gZ2V0cGlkKCk7Ci0JRklMRSAqcGlwZSwgKnRtcGY7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgInJ1bl9ndWk6ICVzIC0tICVkICVkXG4iLCBndWlfeGRpc3BsYXksIGNvbm5lY3RfdG9feDExdm5jLCAoaW50KSBwYXJlbnQpOwotCWlmICgqZ3VpX2NvZGUgPT0gJ1wwJykgewotCQlyZmJMb2coImd1aTogZ3VpIG5vdCBjb21waWxlZCBpbnRvIHRoaXMgcHJvZ3JhbS5cbiIpOwotCQlleGl0KDApOwotCX0KLQlpZiAoZ2V0ZW52KCJESVNQTEFZIikgIT0gTlVMTCkgewotCQkvKiB3b3JzdCBjYXNlICovCi0JCXgxMXZuY194ZGlzcGxheSA9IHN0cmR1cChnZXRlbnYoIkRJU1BMQVkiKSk7Ci0JfQotCWlmICh1c2VfZHB5KSB7Ci0JCS8qIGJldHRlciAqLwotCQl4MTF2bmNfeGRpc3BsYXkgPSBzdHJkdXAodXNlX2RweSk7Ci0JfQotCWlmIChjb25uZWN0X3RvX3gxMXZuYykgewotCQlpbnQgaTsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlpZiAoISBjbGllbnRfY29ubmVjdF9maWxlKSB7Ci0JCQlpZiAoZ2V0ZW52KCJYQVVUSE9SSVRZIikgIT0gTlVMTCkgewotCQkJCW9sZF94YXV0aCA9IHN0cmR1cChnZXRlbnYoIlhBVVRIT1JJVFkiKSk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZF94YXV0aCA9IHN0cmR1cCgiIik7Ci0JCQl9Ci0JCQlkcHkgPSBYT3BlbkRpc3BsYXlfd3IoeDExdm5jX3hkaXNwbGF5KTsgCi0JCQlpZiAoISBkcHkgJiYgYXV0aF9maWxlKSB7Ci0JCQkJc2V0X2VudigiWEFVVEhPUklUWSIsIGF1dGhfZmlsZSk7Ci0JCQkJZHB5ID0gWE9wZW5EaXNwbGF5X3dyKHgxMXZuY194ZGlzcGxheSk7Ci0JCQl9Ci0JCQlpZiAoISBkcHkgJiYgISB4MTF2bmNfeGRpc3BsYXkpIHsKLQkJCQkvKiB3b3JzdGVzdCBjYXNlICovCi0JCQkJeDExdm5jX3hkaXNwbGF5ID0gc3RyZHVwKCI6MCIpOwotCQkJCWRweSA9IFhPcGVuRGlzcGxheV93cih4MTF2bmNfeGRpc3BsYXkpOyAKLQkJCX0KLQkJCWlmICghIGRweSkgewotCQkJCXJmYkxvZygiZ3VpOiBjb3VsZCBub3Qgb3BlbiB4MTF2bmMgIgotCQkJCSAgICAiZGlzcGxheTogJXNcbiIsIE5PTlVMKHgxMXZuY194ZGlzcGxheSkpOwotI2lmZGVmIE1BQ09TWAotCQkJCWdvdG8gbWFjanVtcDsKLSNlbmRpZgotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlzY3IgPSBEZWZhdWx0U2NyZWVuKGRweSk7Ci0JCQlyb290d2luID0gUm9vdFdpbmRvdyhkcHksIHNjcik7Ci0JCQlpbml0aWFsaXplX3ZuY19jb25uZWN0X3Byb3AoKTsKLQkJCWluaXRpYWxpemVfeDExdm5jX3JlbW90ZV9wcm9wKCk7Ci0JCX0KLQotI2lmZGVmIE1BQ09TWAotCQltYWNqdW1wOgotI2VuZGlmCi0JCQotCQlzaWduYWwoU0lHVVNSMSwgc2lndXNyMSk7Ci0JCWdvdF9zaWd1c3IxID0gMDsKLQkJdG90bXMgPSAwOwotCQl3aGlsZSAodG90bXMgPCAzNTAwKSB7Ci0JCQl1c2xlZXAoNTAqMTAwMCk7Ci0JCQl0b3RtcyArPSA1MDsKLQkJCWlmIChnb3Rfc2lndXNyMSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQlpZiAoISBxdWlldCkgcmZiTG9nKCJndWk6IGdvdCBTSUdVU1IxXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghIHN0YXJ0X3gxMXZuYyAmJiB0b3RtcyA+PSAxNTApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzaWduYWwoU0lHVVNSMSwgU0lHX0RGTCk7Ci0JCWlmICghIGdvdF9zaWd1c3IxKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0KLQkJaWYgKCFxdWlldCAmJiAhIGdvdF9zaWd1c3IxKSB7Ci0JCQlyZmJMb2coImd1aTogdHJ5aW5nIHRvIGNvbnRhY3QgYSB4MTF2bmMgc2VydmVyIGF0IFgiCi0JCQkgICAgIiBkaXNwbGF5ICVzIC4uLlxuIiwgTk9OVUwoeDExdm5jX3hkaXNwbGF5KSk7Ci0JCX0KLQotCQlmb3IgKGk9MDsgaTx0cnlfbWF4OyBpKyspIHsKLQkJCWlmICghIGdvdF9zaWd1c3IxKSB7Ci0JCQkJaWYgKCFxdWlldCkgewotCQkJCQlyZmJMb2coImd1aTogcGluZ2luZyAlcyB0cnk9JWQgLi4uXG4iLAotCQkJCQkgICAgTk9OVUwoeDExdm5jX3hkaXNwbGF5KSwgaSsxKTsKLQkJCQl9Ci0JCQkJcmMgPSBzZW5kX3JlbW90ZV9jbWQoInFyeT1waW5nIiwgMSwgMSk7Ci0JCQkJaWYgKHJjID09IDApIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocGFyZW50ICYmIG15cGlkICE9IHBhcmVudCAmJiBraWxsKHBhcmVudCwgMCkgIT0gMCkgewotCQkJCXJmYkxvZygiZ3VpOiBwYXJlbnQgcHJvY2VzcyAlZCBoYXMgZ29uZSIKLQkJCQkgICAgIiBhd2F5OiBiYWlsaW5nIG91dC5cbiIsIHBhcmVudCk7Ci0JCQkJcmMgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdXNsZWVwKHNsZWVwKjEwMDApOwotCQl9Ci0JCXNldF9lbnYoIlgxMVZOQ19YRElTUExBWSIsIHgxMXZuY194ZGlzcGxheSk7Ci0JCWlmIChnZXRlbnYoIlhBVVRIT1JJVFkiKSAhPSBOVUxMKSB7Ci0JCQlzZXRfZW52KCJYMTFWTkNfQVVUSF9GSUxFIiwgZ2V0ZW52KCJYQVVUSE9SSVRZIikpOwotCQl9Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlyZmJMb2coImd1aTogcGluZyBzdWNjZWVkZWQuXG4iKTsKLQkJCXNldF9lbnYoIlgxMVZOQ19DT05ORUNUIiwgIjEiKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiZ3VpOiBjb3VsZCBub3QgY29ubmVjdCB0bzogJyVzJywgdHJ5IgotCQkJICAgICIgYWdhaW4gbWFudWFsbHkuXG4iLCB4MTF2bmNfeGRpc3BsYXkpOwotCQl9Ci0JCWlmIChjbGllbnRfY29ubmVjdF9maWxlKSB7Ci0JCQlzZXRfZW52KCJYMTFWTkNfQ09OTkVDVF9GSUxFIiwgY2xpZW50X2Nvbm5lY3RfZmlsZSk7Ci0JCX0KLQkJaWYgKGRweSkgIHsKLQkJCVhDbG9zZURpc3BsYXlfd3IoZHB5KTsKLQkJCWRweSA9IE5VTEw7Ci0JCX0KLQkJaWYgKG9sZF94YXV0aCkgewotCQkJaWYgKCpvbGRfeGF1dGggPT0gJ1wwJykgewotCQkJCS8qIHdhc24ndCBzZXQsIGhhY2sgaXQgb3V0IGlmIGl0IGlzIG5vdyAqLwotCQkJCWNoYXIgKnhhdXRoID0gZ2V0ZW52KCJYQVVUSE9SSVRZIik7Ci0JCQkJaWYgKHhhdXRoKSB7Ci0JCQkJCSooeGF1dGgtMikgPSAnXyc7CS8qIHlvdyAqLwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X2VudigiWEFVVEhPUklUWSIsIG9sZF94YXV0aCk7Ci0JCQl9Ci0JCQlmcmVlKG9sZF94YXV0aCk7Ci0JCX0KLQkJcmZiTG9nRW5hYmxlKDApOwotCX0KLQotCW9yaWdfcGF0aCA9IGdldGVudigiUEFUSCIpOwotCWlmICghIG9yaWdfcGF0aCkgewotCQlvcmlnX3BhdGggPSBzdHJkdXAoIi9iaW46L3Vzci9iaW46L3Vzci9iaW4vWDExIik7Ci0JfQotCWZ1bGxfcGF0aCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ob3JpZ19wYXRoKStzdHJsZW4oZXh0cmFfcGF0aCkrMSk7Ci0Jc3RyY3B5KGZ1bGxfcGF0aCwgb3JpZ19wYXRoKTsKLQlzdHJjYXQoZnVsbF9wYXRoLCBleHRyYV9wYXRoKTsKLQotCXRwYXRoID0gc3RyZHVwKGZ1bGxfcGF0aCk7Ci0JcCA9IHN0cnRvayh0cGF0aCwgIjoiKTsKLQotCXdoaWxlIChwKSB7Ci0JCWNoYXIgKnRyeTsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJaW50IGk7Ci0KLQkJdHJ5ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwKSArIDEgKyBzdHJsZW4oIndpc2g4LjQiKSArIDEpOwotCQlpID0gMDsKLQkJd2hpbGUgKHdpc2hlc1tpXSAhPSBOVUxMKSB7Ci0JCQlzcHJpbnRmKHRyeSwgIiVzLyVzIiwgcCwgd2lzaGVzW2ldKTsKLQkJCWlmIChzdGF0KHRyeSwgJnNidWYpID09IDApIHsKLQkJCQkvKiBhc3N1bWUgZXhlY3V0YWJsZSwgc2hvdWxkIGNoZWNrIG1vZGUgKi8KLQkJCQl3aXNoID0gd2lzaGVzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCWZyZWUodHJ5KTsKLQkJaWYgKHdpc2gpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIjoiKTsKLQl9Ci0JZnJlZSh0cGF0aCk7Ci0JaWYgKCF3aXNoKSB7Ci0JCXdpc2ggPSBzdHJkdXAoIndpc2giKTsKLQl9Ci0JaWYgKGdldGVudigiV0lTSCIpKSB7Ci0JCWNoYXIgKncgPSBnZXRlbnYoIldJU0giKTsKLQkJaWYgKHN0cmNtcCh3LCAiIikpIHsKLQkJCXdpc2ggPSBzdHJkdXAodyk7Ci0JCX0KLQl9Ci0JaWYgKGdldGVudigiREVCVUdfV0lTSCIpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAid2lzaDogJXNcbiIsIHdpc2gpOwotCX0KLQlzZXRfZW52KCJQQVRIIiwgZnVsbF9wYXRoKTsKLQlzZXRfZW52KCJESVNQTEFZIiwgZ3VpX3hkaXNwbGF5KTsKLQlzZXRfZW52KCJYMTFWTkNfUFJPRyIsIHByb2dyYW1fbmFtZSk7Ci0Jc2V0X2VudigiWDExVk5DX0NNRExJTkUiLCBwcm9ncmFtX2NtZGxpbmUpOwotCXNldF9lbnYoIlgxMVZOQ19XSVNIQ01EIiwgd2lzaCk7Ci0JaWYgKHNpbXBsZV9ndWkpIHsKLQkJc2V0X2VudigiWDExVk5DX1NJTVBMRV9HVUkiLCAiMSIpOwotCX0KLQlpZiAoZ3VpX29wdHMpIHsKLQkJc2V0X2VudigiWDExVk5DX0dVSV9QQVJBTVMiLCBndWlfb3B0cyk7Ci0JfQotCWlmIChndWlfZ2VvbWV0cnkpIHsKLQkJc2V0X2VudigiWDExVk5DX0dVSV9HRU9NIiwgZ3VpX2dlb21ldHJ5KTsKLQl9Ci0JaWYgKHN0YXJ0X3gxMXZuYykgewotCQlzZXRfZW52KCJYMTFWTkNfU1RBUlRFRCIsICIxIik7Ci0JfQotCWlmIChpY29uX21vZGUpIHsKLQkJc2V0X2VudigiWDExVk5DX0lDT05fTU9ERSIsICIxIik7Ci0JCWlmIChpY29uX21vZGVfZmlsZSkgewotCQkJc2V0X2VudigiWDExVk5DX0NMSUVOVF9GSUxFIiwgaWNvbl9tb2RlX2ZpbGUpOwotCQl9Ci0JCWlmIChpY29uX2luX3RyYXkpIHsKLQkJCWlmICh0cmF5X21hbmFnZXJfb2spIHsKLQkJCQlzZXRfZW52KCJYMTFWTkNfSUNPTl9NT0RFIiwgIlRSQVk6UlVOTklORyIpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRfZW52KCJYMTFWTkNfSUNPTl9NT0RFIiwgIlRSQVkiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldF9lbnYoIlgxMVZOQ19JQ09OX01PREUiLCAiSUNPTiIpOwotCQl9Ci0JCWlmIChpY29uX21vZGVfcGFyYW1zKSB7Ci0JCQljaGFyICpwLCAqc3RyID0gc3RyZHVwKGljb25fbW9kZV9wYXJhbXMpOwotCQkJcCA9IHN0cnRvayhzdHIsICI6LS8sLisiKTsKLQkJCXdoaWxlIChwKSB7Ci0JCQkJaWYoc3Ryc3RyKHAsICJzZXRwIikgPT0gcCkgewotCQkJCQlzZXRfZW52KCJYMTFWTkNfSUNPTl9TRVRQQVNTIiwgIjEiKTsKLQkJCQkJaWYgKHJjICE9IDApIHsKLQkJCQkJCXNldF9lbnYoIlgxMVZOQ19TRVRQQVNTX0ZBSUwiLCAiMSIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmKHN0cnN0cihwLCAibm9hZHZhbmNlZCIpID09IHApIHsKLQkJCQkJc2V0X2VudigiWDExVk5DX0lDT05fTk9BRFZBTkNFRCIsICIxIik7Ci0JCQkJfSBlbHNlIGlmKHN0cnN0cihwLCAibWluaW1hbCIpID09IHApIHsKLQkJCQkJc2V0X2VudigiWDExVk5DX0lDT05fTUlOSU1BTCIsICIxIik7Ci0JCQkJfSBlbHNlIGlmIChzdHJzdHIocCwgIjB4IikgPT0gcCkgewotCQkJCQlzZXRfZW52KCJYMTFWTkNfSUNPTl9FTUJFRF9JRCIsIHApOwotCQkJCQlpY29uX21vZGVfZW1iZWRfaWQgPSBzdHJkdXAocCk7Ci0JCQkJfQotCQkJCXAgPSBzdHJ0b2soTlVMTCwgIjotLywuKyIpOwotCQkJfQotCQkJZnJlZShzdHIpOwotCQl9Ci0JfQotCWlmIChpY29uX21vZGVfZm9udCkgewotCQlzZXRfZW52KCJYMTFWTkNfSUNPTl9GT05UIiwgaWNvbl9tb2RlX2ZvbnQpOwotCX0KLQotCS8qIGd1aSAqLwotCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soImd1aSIpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzICIKLQkJICAgICJtb2RlOlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgXCIlc1wiXG4iLCAiZ3VpICsgd2lzaCIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiAgIGV4aXRpbmcuXG4iKTsKLQkJZmZsdXNoKHN0ZGVycik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JdG1wZiA9IHRtcGZpbGUoKTsKLQlpZiAodG1wZiA9PSBOVUxMKSB7Ci0JCS8qIGlmIG5vIHRtcGZpbGUsIHVzZSBhIHBpcGUgKi8KLQkJaWYgKGljb25fbW9kZV9lbWJlZF9pZCkgewotCQkJaWYgKHN0cmxlbihpY29uX21vZGVfZW1iZWRfaWQpIDwgMjApIHsKLQkJCQlzdHJjYXQoY21kLCAiIC11c2UgIik7Ci0JCQkJc3RyY2F0KGNtZCwgaWNvbl9tb2RlX2VtYmVkX2lkKTsKLQkJCX0KLQkJfQotCQljbG9zZV9leGVjX2ZkcygpOwotCQlwaXBlID0gcG9wZW4oY21kLCAidyIpOwotCQlpZiAoISBwaXBlKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBydW46ICVzXG4iLCBjbWQpOwotCQkJcGVycm9yKCJwb3BlbiIpOwotCQl9Ci0JCWZwcmludGYocGlwZSwgIiVzIiwgZ3VpX2NvZGUpOwotCQlwY2xvc2UocGlwZSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogd2UgcHJlZmVyIGEgdG1wZmlsZSBzaW5jZSB0aGVuIHRoaXMgeDExdm5jIHByb2Nlc3MKLQkJICogd2lsbCB0aGVuIGJlIGdvbmUsIG90aGVyd2lzZSB0aGUgeDExdm5jIHByb2dyYW0gdGV4dAotCQkgKiB3aWxsIHN0aWxsIGJlIGluIHVzZS4KLQkJICovCi0JCWludCBuID0gZmlsZW5vKHRtcGYpOwotCQlmcHJpbnRmKHRtcGYsICIlcyIsIGd1aV9jb2RlKTsKLQkJZmZsdXNoKHRtcGYpOwotCQlyZXdpbmQodG1wZik7Ci0JCWR1cDIobiwgMCk7Ci0JCWNsb3NlKG4pOwotCQlpZiAoaWNvbl9tb2RlX2VtYmVkX2lkKSB7Ci0JCQlleGVjbHAod2lzaCwgd2lzaCwgIi0iLCAiLXVzZSIsIGljb25fbW9kZV9lbWJlZF9pZCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsgCi0JCX0gZWxzZSB7Ci0JCQlleGVjbHAod2lzaCwgd2lzaCwgIi0iLCAoY2hhciAqKSBOVUxMKTsgCi0JCX0KLQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZXhlYyB3aXNoOiAlcyAtXG4iLCB3aXNoKTsKLQkJcGVycm9yKCJleGVjbHAiKTsKLQl9Ci0JZXhpdCgwKTsKLX0KLQotdm9pZCBkb19ndWkoY2hhciAqb3B0cywgaW50IHNsZWVwKSB7Ci0JY2hhciAqcywgKnA7Ci0JY2hhciAqb2xkX3hhdXRoID0gTlVMTDsKLQljaGFyICpndWlfeGRpc3BsYXkgPSBOVUxMOwotCWludCBnb3RfZ3VpX3hkaXNwbGF5ID0gMDsKLQlpbnQgc3RhcnRfeDExdm5jID0gMTsKLQlpbnQgY29ubmVjdF90b194MTF2bmMgPSAwOwotCWludCBzaW1wbGVfZ3VpID0gMCwgbm9uZV9ndWkgPSAwOwotCWludCBwb3J0cHJvbXB0ID0gMDsKLQlEaXNwbGF5ICp0ZXN0X2RweTsKLQotCWlmIChvcHRzKSB7Ci0JCXMgPSBzdHJkdXAob3B0cyk7Ci0JfSBlbHNlIHsKLQkJcyA9IHN0cmR1cCgiIik7Ci0JfQotCi0JaWYgKHVzZV9kcHkpIHsKLQkJLyogd29yc3QgY2FzZSAqLwotCQlndWlfeGRpc3BsYXkgPSBzdHJkdXAodXNlX2RweSk7Ci0JCQotCX0KLQlpZiAoZ2V0ZW52KCJESVNQTEFZIikgIT0gTlVMTCkgewotCQkvKiBiZXR0ZXIgKi8KLQkJZ3VpX3hkaXNwbGF5ID0gc3RyZHVwKGdldGVudigiRElTUExBWSIpKTsKLQl9Ci0KLQlwID0gc3RydG9rKHMsICIsIik7Ci0KLQl3aGlsZShwKSB7Ci0JCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoc3RyY2hyKHAsICc6JykgIT0gTlVMTCkgewotCQkJLyogYmVzdCAqLwotCQkJaWYgKGd1aV94ZGlzcGxheSkgewotCQkJCWZyZWUoZ3VpX3hkaXNwbGF5KTsKLQkJCX0KLQkJCWd1aV94ZGlzcGxheSA9IHN0cmR1cChwKTsKLQkJCWdvdF9ndWlfeGRpc3BsYXkgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgIndhaXQiKSkgewotCQkJc3RhcnRfeDExdm5jID0gMDsKLQkJCWNvbm5lY3RfdG9feDExdm5jID0gMDsKLQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJub25lIikpIHsKLQkJCW5vbmVfZ3VpID0gMTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJwb3J0cHJvbXB0IikpIHsKLQkJCXN0YXJ0X3gxMXZuYyA9IDA7Ci0JCQljb25uZWN0X3RvX3gxMXZuYyA9IDA7Ci0JCQlwb3J0cHJvbXB0ID0gMTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJjb25uIikgfHwgIXN0cmNtcChwLCAiY29ubmVjdCIpKSB7Ci0JCQlzdGFydF94MTF2bmMgPSAwOwotCQkJY29ubmVjdF90b194MTF2bmMgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgImV6IikgfHwgIXN0cmNtcChwLCAic2ltcGxlIikpIHsKLQkJCXNpbXBsZV9ndWkgPSAxOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiaWNvbmZvbnQiKSA9PSBwKSB7Ci0JCQljaGFyICpxOwotCQkJaWYgKChxID0gc3RyY2hyKHAsICc9JykpICE9IE5VTEwpIHsKLQkJCQlpY29uX21vZGVfZm9udCA9IHN0cmR1cChxKzEpOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiZnVsbCIpID09IHApIHsKLQkJCWlmIChzdHJzdHIocCwgInNldHAiKSAmJiAwKSB7Ci0JCQkJc2V0X2VudigiWDExVk5DX0lDT05fTU9ERSIsICIyIik7Ci0JCQkJc2V0X2VudigiWDExVk5DX0lDT05fU0VUUEFTUyIsICIyIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJ0cmF5IikgPT0gcCB8fCBzdHJzdHIocCwgImljb24iKSA9PSBwKSB7Ci0JCQljaGFyICpxOwotCQkJaWNvbl9tb2RlID0gMTsKLQkJCWlmICgocSA9IHN0cmNocihwLCAnPScpKSAhPSBOVUxMKSB7Ci0JCQkJaWNvbl9tb2RlX3BhcmFtcyA9IHN0cmR1cChxKzEpOwotCQkJCWlmIChzdHJzdHIoaWNvbl9tb2RlX3BhcmFtcywgInNldHAiKSkgewotCQkJCQlkZW55X2FsbCA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0cnN0cihwLCAidHJheSIpID09IHApIHsKLQkJCQlpY29uX2luX3RyYXkgPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiZ2VvbSIpID09IHApIHsKLQkJCWNoYXIgKnE7Ci0JCQlpZiAoKHEgPSBzdHJjaHIocCwgJz0nKSkgIT0gTlVMTCkgewotCQkJCWd1aV9nZW9tZXRyeSA9IHN0cmR1cChxKzEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJ1bnJlY29nbml6ZWQgZ3VpIG9wdDogJXNcbiIsIHApOwotCQl9Ci0JCQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUocyk7Ci0KLQlpZiAobm9uZV9ndWkpIHsKLQkJaWYgKCFzdGFydF94MTF2bmMpIHsKLQkJCWV4aXQoMCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoc3RhcnRfeDExdm5jKSB7Ci0JCWNvbm5lY3RfdG9feDExdm5jID0gMTsKLQl9Ci0KLQotI2lmZGVmIE1BQ09TWAotCWdvdG8gc3RhcnRpdDsKLSNlbmRpZgotCi0JaWYgKGljb25fbW9kZSAmJiAhZ290X2d1aV94ZGlzcGxheSkgewotCQkvKiBmb3IgdHJheSBtb2RlLCBwcmVmZXIgdGhlIHBvbGxlZCBESVNQTEFZICovCi0JCWlmICh1c2VfZHB5KSB7Ci0JCQlpZiAoZ3VpX3hkaXNwbGF5KSB7Ci0JCQkJZnJlZShndWlfeGRpc3BsYXkpOwotCQkJfQotCQkJZ3VpX3hkaXNwbGF5ID0gc3RyZHVwKHVzZV9kcHkpOwotCQl9Ci0JfQotCi0JaWYgKCEgZ3VpX3hkaXNwbGF5KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgWCBESVNQTEFZIGZvciBndWkiCi0JCSAgICAiIHRvIGRpc3BsYXkgb24uXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKCFxdWlldCAmJiAhcG9ydHByb21wdCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInN0YXJ0aW5nIGd1aSwgdHJ5aW5nIGRpc3BsYXk6ICVzXG4iLAotCQkgICAgZ3VpX3hkaXNwbGF5KTsKLQl9Ci0JdGVzdF9kcHkgPSBYT3BlbkRpc3BsYXlfd3IoZ3VpX3hkaXNwbGF5KTsKLQlpZiAoISB0ZXN0X2RweSAmJiBhdXRoX2ZpbGUpIHsKLQkJaWYgKGdldGVudigiWEFVVEhPUklUWSIpICE9IE5VTEwpIHsKLQkJCW9sZF94YXV0aCA9IHN0cmR1cChnZXRlbnYoIlhBVVRIT1JJVFkiKSk7Ci0JCX0KLQkJc2V0X2VudigiWEFVVEhPUklUWSIsIGF1dGhfZmlsZSk7Ci0JCXRlc3RfZHB5ID0gWE9wZW5EaXNwbGF5X3dyKGd1aV94ZGlzcGxheSk7Ci0JfQotCWlmICghIHRlc3RfZHB5KSB7Ci0JCWlmICghIG9sZF94YXV0aCAmJiBnZXRlbnYoIlhBVVRIT1JJVFkiKSAhPSBOVUxMKSB7Ci0JCQlvbGRfeGF1dGggPSBzdHJkdXAoZ2V0ZW52KCJYQVVUSE9SSVRZIikpOwotCQl9Ci0JCXNldF9lbnYoIlhBVVRIT1JJVFkiLCAiIik7Ci0JCXRlc3RfZHB5ID0gWE9wZW5EaXNwbGF5X3dyKGd1aV94ZGlzcGxheSk7Ci0JfQotCWlmICghIHRlc3RfZHB5KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhbm5vdCBjb25uZWN0IHRvIGd1aSBYIERJU1BMQVk6ICVzXG4iLAotCQkgICAgZ3VpX3hkaXNwbGF5KTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKGljb25fbW9kZSAmJiBpY29uX2luX3RyYXkpIHsKLQkJaWYgKHRyYXlfbWFuYWdlcl9ydW5uaW5nKHRlc3RfZHB5LCBOVUxMKSkgewotCQkJdHJheV9tYW5hZ2VyX29rID0gMTsKLQkJfSBlbHNlIHsKLQkJCXRyYXlfbWFuYWdlcl9vayA9IDA7Ci0JCX0KLQl9Ci0JWENsb3NlRGlzcGxheV93cih0ZXN0X2RweSk7Ci0KLSNpZmRlZiBNQUNPU1gKLQlzdGFydGl0OgotI2VuZGlmCi0JaWYgKHBvcnRwcm9tcHQpIHsKLQkJY2hhciAqY21kLCAqcCwgKnAyLCAqcDEsICpwMCA9IGdldGVudigiUEFUSCIpOwotCQljaGFyIHRmMVtdID0gIi90bXAveDExdm5jX3BvcnRfcHJvbXB0LjJYWFhYWFgiOwotCQljaGFyIHRmMltdID0gIi90bXAveDExdm5jX3BvcnRfcHJvbXB0LjFYWFhYWFgiOwotCQlpbnQgZmQ7Ci0JCWNoYXIgKmRzdHIgPSAiIiwgKndpc2ggPSBOVUxMOwotCQljaGFyIGxpbmVbMTI4XTsKLQkJRklMRSAqZnA7Ci0KLQkJaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygiZ3VpIikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChndWlfeGRpc3BsYXkpIHsKLQkJCWRzdHIgPSBndWlfeGRpc3BsYXk7Ci0JCQlpZiAoc3RyY2hyKGd1aV94ZGlzcGxheSwgJ1wnJykpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwMCkgewotCQkJcDAgPSAiIjsKLQkJfQotCQlpZiAoc3RyY2hyKHAwLCAnXCcnKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmQgPSBta3N0ZW1wKHRmMik7Ci0JCWlmIChmZCA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQljbG9zZShmZCk7Ci0KLQkJZmQgPSBta3N0ZW1wKHRmMSk7Ci0JCWlmIChmZCA8IDApIHsKLQkJCXVubGluayh0ZjIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJd3JpdGUoZmQsIGd1aV9jb2RlLCBzdHJsZW4oZ3VpX2NvZGUpKTsKLQkJY2xvc2UoZmQpOwotCi0JCXAxID0gKGNoYXIgKikgbWFsbG9jKDEwICsgc3RybGVuKHAwKSArIHN0cmxlbihleHRyYV9wYXRoKSk7Ci0JCXNwcmludGYocDEsICIlczolcyIsIHAwLCBleHRyYV9wYXRoKTsKLQkJcDIgPSBzdHJkdXAocDEpOwotCQlwID0gc3RydG9rKHAyLCAiOiIpOwotCi0JCXdoaWxlIChwKSB7Ci0JCQljaGFyICp0cnk7Ci0JCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCQkJaW50IGk7Ci0KLQkJCXRyeSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ocCkgKyAxICsgc3RybGVuKCJ3aXNoOC40IikgKyAxKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKHdpc2hlc1tpXSAhPSBOVUxMKSB7Ci0JCQkJc3ByaW50Zih0cnksICIlcy8lcyIsIHAsIHdpc2hlc1tpXSk7Ci0JCQkJaWYgKHN0YXQodHJ5LCAmc2J1ZikgPT0gMCkgewotCQkJCQkvKiBhc3N1bWUgZXhlY3V0YWJsZSwgc2hvdWxkIGNoZWNrIG1vZGUgKi8KLQkJCQkJd2lzaCA9IHdpc2hlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJCWZyZWUodHJ5KTsKLQkJCWlmICh3aXNoKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwID0gc3RydG9rKE5VTEwsICI6Iik7Ci0JCX0KLQkJZnJlZShwMik7Ci0KLQkJaWYgKCF3aXNoKSB7Ci0JCQl3aXNoID0gIndpc2giOwotCQl9Ci0KLQkJY21kID0gKGNoYXIgKikgbWFsbG9jKDIwMCArIHN0cmxlbihkc3RyKSArIHN0cmxlbihwMSkpOwotCi0JCWlmICghc3RyY21wKGRzdHIsICIiKSkgewotCQkJc3ByaW50ZihjbWQsICJlbnYgUEFUSD0nJXMnICVzICVzIC1uYW1lIHgxMXZuY19wb3J0X3Byb21wdCAtcG9ydHByb21wdCA+ICVzIiwgcDEsIHdpc2gsIHRmMSwgdGYyKTsKLQkJfSBlbHNlIHsKLQkJCXNwcmludGYoY21kLCAiZW52IFBBVEg9JyVzJyBESVNQTEFZPSclcycgJXMgJXMgLW5hbWUgeDExdm5jX3BvcnRfcHJvbXB0IC1wb3J0cHJvbXB0ID4gJXMiLCBwMSwgZHN0ciwgd2lzaCwgdGYxLCB0ZjIpOwotCQl9Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19QT1JUUFJPTVBUIikpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiY21kPSVzXG4iLCBjbWQpOwotCQl9Ci0JCWlmICh1c2Vfb3BlbnNzbCkgewotCQkJc2V0X2VudigiWDExVk5DX1NTTF9FTkFCTEVEIiwgIjEiKTsKLQkJfQotCQlpZiAoYWxsb3dfbGlzdCAmJiAhc3RyY21wKGFsbG93X2xpc3QsICIxMjcuMC4wLjEiKSkgewotCQkJc2V0X2VudigiWDExVk5DX0xPQ0FMSE9TVF9FTkFCTEVEIiwgIjEiKTsKLQkJfQotCQlpZiAoZ290X3VsdHJhZmlsZXhmZXIpIHsKLQkJCXNldF9lbnYoIlgxMVZOQ19GSUxFVFJBTlNGRVJfRU5BQkxFRCIsICJ1bHRyYSIpOwotCQl9IGVsc2UgaWYgKHRpZ2h0ZmlsZXhmZXIpIHsKLQkJCXNldF9lbnYoIlgxMVZOQ19GSUxFVFJBTlNGRVJfRU5BQkxFRCIsICJ0aWdodCIpOwotCQl9Ci0JCXN5c3RlbShjbWQpOwotCQlmcmVlKGNtZCk7Ci0JCWZyZWUocDEpOwotCi0JCWZwID0gZm9wZW4odGYyLCAiciIpOwotCQltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKLQkJaWYgKGZwKSB7Ci0JCQlmZ2V0cyhsaW5lLCAxMjgsIGZwKTsKLQkJCWZjbG9zZShmcCk7Ci0JCQlpZiAobGluZVswXSAhPSAnXDAnKSB7Ci0JCQkJaW50IHJlYWRwb3J0ID0gYXRvaShsaW5lKTsKLQkJCQlpZiAocmVhZHBvcnQgPiAwKSB7Ci0JCQkJCWdvdF9yZmJwb3J0X3ZhbCA9IHJlYWRwb3J0OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChzdHJzdHIobGluZSwgInNzbDAiKSkgewotCQkJaWYgKHVzZV9vcGVuc3NsKSB1c2Vfb3BlbnNzbCA9IDA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGxpbmUsICJzc2wxIikpIHsKLQkJCWlmICghdXNlX29wZW5zc2wpIHsKLQkJCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQkJb3BlbnNzbF9wZW0gPSBzdHJkdXAoIlNBVkVfTk9QUk9NUFQiKTsKLQkJCQlzZXRfZW52KCJYMTFWTkNfR09UX1NTTCIsICIxIik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3Ryc3RyKGxpbmUsICJsb2NhbGhvc3QwIikpIHsKLQkJCWlmIChhbGxvd19saXN0ICYmICFzdHJjbXAoYWxsb3dfbGlzdCwgIjEyNy4wLjAuMSIpKSB7Ci0JCQkJYWxsb3dfbGlzdCA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGxpbmUsICJsb2NhbGhvc3QxIikpIHsKLQkJCWFsbG93X2xpc3QgPSBzdHJkdXAoIjEyNy4wLjAuMSIpOwotCQl9Ci0KLQkJaWYgKHN0cnN0cihsaW5lLCAiZnRfdWx0cmEiKSkgewotCQkJZ290X3VsdHJhZmlsZXhmZXIgPSAxOwotCQkJdGlnaHRmaWxleGZlciA9IDA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGxpbmUsICJmdF90aWdodCIpKSB7Ci0JCQlnb3RfdWx0cmFmaWxleGZlciA9IDA7Ci0JCQl0aWdodGZpbGV4ZmVyID0gMTsKLQkJfSBlbHNlIGlmIChzdHJzdHIobGluZSwgImZ0X25vbmUiKSkgewotCQkJZ290X3VsdHJhZmlsZXhmZXIgPSAwOwotCQkJdGlnaHRmaWxleGZlciA9IDA7Ci0JCX0KLQotCQl1bmxpbmsodGYxKTsKLQkJdW5saW5rKHRmMik7Ci0KLQkJaWYgKG9sZF94YXV0aCkgewotCQkJc2V0X2VudigiWEFVVEhPUklUWSIsIG9sZF94YXV0aCk7Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHN0YXJ0X3gxMXZuYykgewotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSwotCQkvKiBmb3JrIGludG8gdGhlIGJhY2tncm91bmQgbm93ICovCi0JCWludCBwOwotCQlwaWRfdCBwYXJlbnQgPSBnZXRwaWQoKTsKLQotCQlpZiAoaWNvbl9tb2RlKSB7Ci0JCQljaGFyIHRmW10gPSAiL3RtcC94MTF2bmMudHJheS5YWFhYWFgiOyAKLQkJCWludCBmZDsKLQotCQkJZmQgPSBta3N0ZW1wKHRmKTsKLQkJCWlmIChmZCA8IDApIHsKLQkJCQlpY29uX21vZGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQljbG9zZShmZCk7Ci0JCQkJaWNvbl9tb2RlX2ZoID0gZm9wZW4odGYsICJ3Iik7Ci0JCQkJaWYgKCEgaWNvbl9tb2RlX2ZoKSB7Ci0JCQkJCWljb25fbW9kZSA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2htb2QodGYsIDA0MDApOwotCQkJCQlpY29uX21vZGVfZmlsZSA9IHN0cmR1cCh0Zik7Ci0JCQkJCXJmYkxvZygiaWNvbl9tb2RlX2ZpbGU9JXNcbiIsIGljb25fbW9kZV9maWxlKTsKLQkJCQkJZnByaW50ZihpY29uX21vZGVfZmgsICJub25lXG4iKTsKLQkJCQkJZnByaW50ZihpY29uX21vZGVfZmgsICJub25lXG4iKTsKLQkJCQkJZmZsdXNoKGljb25fbW9kZV9maCk7Ci0JCQkJCWlmICghIGdvdF9jb25uZWN0X29uY2UpIHsKLQkJCQkJCWlmICghY2xpZW50X2Nvbm5lY3QgJiYgIWNvbm5lY3Rfb3JfZXhpdCkgewotCQkJCQkJCS8qIHdhbnQgLWZvcmV2ZXIgZm9yIHRyYXk/ICovCi0JCQkJCQkJY29ubmVjdF9vbmNlID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgocCA9IGZvcmsoKSkgPiAwKSAgewotCQkJOwkvKiBwYXJlbnQgKi8KLQkJfSBlbHNlIGlmIChwID09IC0xKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmb3JrXG4iKTsKLQkJCXBlcnJvcigiZm9yayIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzbGVlcCA+IDApIHsKLQkJCQl1c2xlZXAoc2xlZXAgKiAxMDAwICogMTAwMCk7Ci0JCQl9Ci0JCQlydW5fZ3VpKGd1aV94ZGlzcGxheSwgY29ubmVjdF90b194MTF2bmMsIHN0YXJ0X3gxMXZuYywKLQkJCSAgICBzaW1wbGVfZ3VpLCBwYXJlbnQsIG9wdHMpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoY29ubmVjdF90b194MTF2bmMpIHsKLQkJCXJ1bl9ndWlfcGlkID0gcDsKLQkJCWd1aV9waWQgPSBwOwotCQl9Ci0jZWxzZQotCQlmcHJpbnRmKHN0ZGVyciwgInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGZvcms6IHN0YXJ0ICIKLQkJICAgICJ4MTF2bmMgaW4gdGhlIGd1aS5cbiIpOwotCQlzdGFydF94MTF2bmMgPSAwOwotI2VuZGlmCi0JfQotCWlmICghc3RhcnRfeDExdm5jKSB7Ci0JCXJ1bl9ndWkoZ3VpX3hkaXNwbGF5LCBjb25uZWN0X3RvX3gxMXZuYywgc3RhcnRfeDExdm5jLAotCQkgICAgc2ltcGxlX2d1aSwgMCwgb3B0cyk7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmIChvbGRfeGF1dGgpIHsKLQkJc2V0X2VudigiWEFVVEhPUklUWSIsIG9sZF94YXV0aCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9ndWkuaCBiL3gxMXZuYy9ndWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5N2RkYi4uMDAwMDAwMAotLS0gYS94MTF2bmMvZ3VpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19HVUlfSAotI2RlZmluZSBfWDExVk5DX0dVSV9ICi0KLS8qIC0tIGd1aS5oIC0tICovCi0KLWV4dGVybiBpbnQgaWNvbl9tb2RlOwotZXh0ZXJuIGNoYXIgKmljb25fbW9kZV9maWxlOwotZXh0ZXJuIEZJTEUgKmljb25fbW9kZV9maDsKLWV4dGVybiBpbnQgaWNvbl9tb2RlX3NvY2tzW107Ci1leHRlcm4gaW50IHRyYXlfbWFuYWdlcl9vazsKLWV4dGVybiBXaW5kb3cgdHJheV9yZXF1ZXN0OwotZXh0ZXJuIFdpbmRvdyB0cmF5X3dpbmRvdzsKLWV4dGVybiBpbnQgdHJheV91bmVtYmVkOwotZXh0ZXJuIHBpZF90IHJ1bl9ndWlfcGlkOwotZXh0ZXJuIHBpZF90IGd1aV9waWQ7Ci0KLWV4dGVybiBjaGFyICpnZXRfZ3VpX2NvZGUodm9pZCk7Ci1leHRlcm4gaW50IHRyYXlfZW1iZWQoV2luZG93IGljb253aW4sIGludCByZW1vdmUpOwotZXh0ZXJuIHZvaWQgZG9fZ3VpKGNoYXIgKm9wdHMsIGludCBzbGVlcCk7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX0dVSV9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvaGVscC5jIGIveDExdm5jL2hlbHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkNWMxMi4uMDAwMDAwMAotLS0gYS94MTF2bmMvaGVscC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0MSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIGhlbHAuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieGRhbWFnZS5oIgotI2luY2x1ZGUgImN1cnNvci5oIgotCi0vKgotICogdGV4dCBwcmludGVkIG91dCB1bmRlciAtaGVscCBvcHRpb24KLSAqLwotCi12b2lkIHByaW50X2hlbHAoaW50IG1vZGUpOwotdm9pZCBwcmludF9saWNlbnNlKHZvaWQpOwotdm9pZCB4b3Blbl9kaXNwbGF5X2ZhaWxfbWVzc2FnZShjaGFyICpkaXNwKTsKLXZvaWQgbm9wYXNzd29yZF93YXJuaW5nX21zZyhpbnQgZ290bG9jKTsKLQotCi12b2lkIHByaW50X2hlbHAoaW50IG1vZGUpIHsKLSNpZiAhU0tJUF9IRUxQCi0JY2hhciBoZWxwW10gPSAKLSJcbiIKLSJ4MTF2bmM6IGFsbG93IFZOQyBjb25uZWN0aW9ucyB0byByZWFsIFgxMSBkaXNwbGF5cy4gJXNcbiIKLSJcbiIKLSIodHlwZSBcIngxMXZuYyAtb3B0c1wiIHRvIGp1c3QgbGlzdCB0aGUgb3B0aW9ucy4pXG4iCi0iXG4iCi0iVHlwaWNhbCB1c2FnZSBpczpcbiIKLSJcbiIKLSIgICBSdW4gdGhpcyBjb21tYW5kIGluIGEgc2hlbGwgb24gdGhlIHJlbW90ZSBtYWNoaW5lIFwiZmFyLWhvc3RcIlxuIgotIiAgIHdpdGggWCBzZXNzaW9uIHlvdSB3aXNoIHRvIHZpZXc6XG4iCi0iXG4iCi0iICAgICAgIHgxMXZuYyAtZGlzcGxheSA6MFxuIgotIlxuIgotIiAgIFRoZW4gcnVuIHRoaXMgaW4gYW5vdGhlciB3aW5kb3cgb24gdGhlIG1hY2hpbmUgeW91IGFyZSBzaXR0aW5nIGF0OlxuIgotIlxuIgotIiAgICAgICB2bmN2aWV3ZXIgZmFyLWhvc3Q6MFxuIgotIlxuIgotIk9uY2UgeDExdm5jIGVzdGFibGlzaGVzIGNvbm5lY3Rpb25zIHdpdGggdGhlIFgxMSBzZXJ2ZXIgYW5kIHN0YXJ0cyBsaXN0ZW5pbmdcbiIKLSJhcyBhIFZOQyBzZXJ2ZXIgaXQgd2lsbCBwcmludCBvdXQgYSBzdHJpbmc6IFBPUlQ9WFhYWCB3aGVyZSBYWFhYIGlzIHR5cGljYWxseVxuIgotIjU5MDAgKHRoZSBkZWZhdWx0IFZOQyBzZXJ2ZXIgcG9ydCkuICBPbmUgd291bGQgbmV4dCBydW4gc29tZXRoaW5nIGxpa2VcbiIKLSJ0aGlzIG9uIHRoZSBsb2NhbCBtYWNoaW5lOiBcInZuY3ZpZXdlciBob3N0bmFtZTpOXCIgd2hlcmUgXCJob3N0bmFtZVwiIGlzXG4iCi0idGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgcnVubmluZyB4MTF2bmMgYW5kIE4gaXMgWFhYWCAtIDU5MDAsIGkuZS4gdXN1YWxseVxuIgotIlwidm5jdmlld2VyIGhvc3RuYW1lOjBcIi5cbiIKLSJcbiIKLSJCeSBkZWZhdWx0IHgxMXZuYyB3aWxsIG5vdCBhbGxvdyB0aGUgc2NyZWVuIHRvIGJlIHNoYXJlZCBhbmQgaXQgd2lsbCBleGl0XG4iCi0iYXMgc29vbiBhcyB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgU2VlIC1zaGFyZWQgYW5kIC1mb3JldmVyIGJlbG93IHRvIG92ZXJyaWRlXG4iCi0idGhlc2UgcHJvdGVjdGlvbnMuICBTZWUgdGhlIEZBUSBmb3IgZGV0YWlscyBob3cgdG8gdHVubmVsIHRoZSBWTkMgY29ubmVjdGlvblxuIgotInRocm91Z2ggYW4gZW5jcnlwdGVkIGNoYW5uZWwgc3VjaCBhcyBzc2goMSkuICBJbiBicmllZjpcbiIKLSJcbiIKLSIgICAgICAgc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWhvc3QgJ3gxMXZuYyAtbG9jYWxob3N0IC1kaXNwbGF5IDowJ1xuIgotIlxuIgotIiAgICAgICB2bmN2aWV3ZXIgLWVuY29kaW5ncyAnY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlJyBsb2NhbGhvc3Q6MFxuIgotIlxuIgotIkFsc28sIHVzZSBvZiBhIFZOQyBwYXNzd29yZCAoLXJmYmF1dGggb3IgLXBhc3N3ZGZpbGUpIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLlxuIgotIlxuIgotIkZvciBhZGRpdGlvbmFsIGluZm8gc2VlOiBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL1xuIgotIiAgICAgICAgICAgICAgICAgICAgYW5kICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sXG4iCi0iXG4iCi0iXG4iCi0iQ29uZmlnIGZpbGUgc3VwcG9ydDogaWYgdGhlIGZpbGUgJEhPTUUvLngxMXZuY3JjIGV4aXN0cyB0aGVuIGVhY2ggbGluZSBpblxuIgotIml0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWFuZCBsaW5lIG9wdGlvbi4gIERpc2FibGUgd2l0aCAtbm9yYy4gIEZvclxuIgotImVhY2ggb3B0aW9uIG5hbWUsIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBcIi1cIiBpcyBub3QgcmVxdWlyZWQuICBFLmcuIGEgbGluZVxuIgotInRoYXQgaXMgZWl0aGVyIFwiZm9yZXZlclwiIG9yIFwiLWZvcmV2ZXJcIiBtYXkgYmUgdXNlZCBhbmQgYXJlIGVxdWl2YWxlbnQuXG4iCi0iTGlrZXdpc2UgXCJ3YWl0IDEwMFwiIG9yIFwiLXdhaXQgMTAwXCIgYXJlIGFjY2VwdGFibGUgYW5kIGVxdWl2YWxlbnQgbGluZXMuXG4iCi0iVGhlIFwiI1wiIGNoYXJhY3RlciBjb21tZW50cyBvdXQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBpbiB0aGUgdXN1YWwgd2F5XG4iCi0iKGJhY2tzbGFzaCBpdCBmb3IgYSBsaXRlcmFsKS4gIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgdHJpbW1lZCBvZmYuXG4iCi0iTGluZXMgbWF5IGJlIGNvbnRpbnVlZCB3aXRoIGEgXCJcXFwiIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIGxpbmUgKGl0XG4iCi0iYmVjb21lcyBhIHNwYWNlIGNoYXJhY3RlcikuXG4iCi0iXG4iCi0iT3B0aW9uczpcbiIKLSJcbiIKLSItZGlzcGxheSBkaXNwICAgICAgICAgIFgxMSBzZXJ2ZXIgZGlzcGxheSB0byBjb25uZWN0IHRvLCB1c3VhbGx5IDowLiAgVGhlIFhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciBwcm9jZXNzIG11c3QgYmUgcnVubmluZyBvbiBzYW1lIG1hY2hpbmUgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IE1JVC1TSE0uICBFcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIERJU1BMQVlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIFwiZGlzcFwiLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBvZiB0aGUgXCItZGlzcGxheSBXQUlUOi4uLlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLCB3aGVyZSBhbGlhcyBcIi1maW5kXCIgd2lsbCBmaW5kIHRoZSB1c2VyJ3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgYXV0b21hdGljYWxseSwgYW5kIFwiLWNyZWF0ZVwiIHdpbGwgY3JlYXRlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFh2ZmIgc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlzIGZvdW5kLlxuIgotIlxuIgotIi1hdXRoIGZpbGUgICAgICAgICAgICAgU2V0IHRoZSBYIGF1dGhvcml0eSBmaWxlIHRvIGJlIFwiZmlsZVwiLCBlcXVpdmFsZW50IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSBYQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIFwiZmlsZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgc3RhcnR1cC4gIFNhbWUgYXMgLXhhdXRoIGZpbGUuICBTZWUgWHNlY3VyaXR5KDcpLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGF1dGgoMSkgbWFuIHBhZ2VzIGZvciBtb3JlIGluZm8uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgJy1hdXRoIGd1ZXNzJyB0byBoYXZlIHgxMXZuYyB1c2UgaXRzIC1maW5kYXV0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtIChkZXNjcmliZWQgYmVsb3cpIHRvIHRyeSB0byBndWVzcyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhBVVRIT1JJVFkgZmlsZW5hbWUgYW5kIHVzZSBpdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhETS9HRE0vS0RNOiBpZiB5b3UgYXJlIHJ1bm5pbmcgeDExdm5jIGFzIHJvb3QgYW5kIHdhbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmQgdGhlIFhBVVRIT1JJVFkgYmVmb3JlIGFueW9uZSBoYXMgbG9nZ2VkIGludG8gYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFggc2Vzc2lvbiB5ZXQsIHVzZTogeDExdm5jIC1lbnYgRkRfWERNPTEgLWF1dGggZ3Vlc3MgLi4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbi4pICBXaGVuIHJ1bm5pbmcgYXMgcm9vdCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZEX1hETT0xIHdpbGwgYmUgdHJpZWQgaWYgdGhlIGluaXRpYWwgLWF1dGggZ3Vlc3MgZmFpbHMuXG4iCi0iXG4iCi0iLU4gICAgICAgICAgICAgICAgICAgICBJZiB0aGUgWCBkaXNwbGF5IGlzIDpOLCB0cnkgdG8gc2V0IHRoZSBWTkMgZGlzcGxheSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBiZSA6TiBUaGlzIGp1c3Qgc2V0cyB0aGUgLXJmYnBvcnQgb3B0aW9uIHRvIDU5MDArTlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByb2dyYW0gd2lsbCBleGl0IGltbWVkaWF0ZWx5IGlmIHRoYXQgcG9ydCBpcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gVGhlIC1OIG9wdGlvbiBvbmx5IHdvcmtzIHdpdGggbm9ybWFsIC1kaXNwbGF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwgZS5nLiA6MCBvciA6OCwgLU4gaXMgaWdub3JlZCBpbiB0aGUgLWRpc3BsYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFdBSVQ6Li4uLCAtY3JlYXRlLCAtZmluZCwgLXN2YywgLXJlZGlyZWN0LCBldGMgbW9kZXMuXG4iCi0iXG4iCi0iLWF1dG9wb3J0IG4gICAgICAgICAgICBBdXRvbWF0aWNhbGx5IHByb2JlIGZvciBhIGZyZWUgVk5DIHBvcnQgc3RhcnRpbmcgYXQgbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHN0YXJ0IHByb2JpbmcgYXQgNTkwMC4gIFVzZSB0aGlzIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdGF5IGF3YXkgZnJvbSBvdGhlciBWTkMgc2VydmVycyBuZWFyIDU5MDAuXG4iCi0iXG4iCi0iLXJmYnBvcnQgc3RyICAgICAgICAgICBUaGUgVk5DIHBvcnQgdG8gbGlzdGVuIG9uIChhIExpYlZOQ1NlcnZlciBvcHRpb24pLCBlLmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA1OTAwLCA1OTAxLCBldGMuICBJZiBzcGVjaWZpZWQgYXMgXCItcmZicG9ydCBQUk9NUFRcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgeDExdm5jIC1ndWkgaXMgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVudGVyIHRoZSBwb3J0IG51bWJlci5cbiIKLSJcbiIKLSNpZiBYMTFWTkNfSVBWNgotIi02ICAgICAgICAgICAgICAgICAgICAgSVB2NiBsaXN0ZW5pbmcgc3VwcG9ydC4gIEluIGFkZGl0aW9uIHRvIElQdjQsIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBhZGRyZXNzIGlzIGxpc3RlbmVkIG9uIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzYW1lIHBvcnQgbnVtYmVyIGFzIElQdjQgaXMgdXNlZC5cbiIKLSJcbiIKLSNpZiBYMTFWTkNfTElTVEVONgotIiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogIFRoaXMgeDExdm5jIGJpbmFyeSB3YXMgY29tcGlsZWQgdG8gaGF2ZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLTZcIiBJUHY2IGxpc3RlbmluZyBtb2RlIEVOQUJMRUQgYnkgZGVmYXVsdCAoQ1BQRkxBR1NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX0xJU1RFTjY9MSkuICBTbyB0byBkaXNhYmxlIElQdjYgbGlzdGVuaW5nIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHlvdSBNVVNUIHN1cHBseSB0aGUgXCItbm82XCIgb3B0aW9uIChzZWUgYmVsb3cuKVxuIgotI2Vsc2UKLSIgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6ICBUaGlzIHgxMXZuYyBiaW5hcnkgd2FzIGNvbXBpbGVkIHRvIGhhdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBcIi02XCIgSVB2NiBsaXN0ZW5pbmcgbW9kZSBESVNBQkxFRCBieSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoQ1BQRkxBR1MgLURYMTFWTkNfTElTVEVONj0wKS5cbiIKLSNlbmRpZgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFwiLTZcIiBtb2RlIHdvcmtzIGZvciBib3RoIG5vcm1hbCBjb25uZWN0aW9ucyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1zc2wgZW5jcnlwdGVkIG9uZXMuICBOZWFybHkgZXZlcnl0aGluZyBpcyBzdXBwb3J0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgSVB2NiBjYXNlLCBidXQgdGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgLXN0dW5uZWwgZm9yIGl0cyBJUHY2IHN1cHBvcnQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHksIGZvciBhYnNvbHV0ZWx5IGV2ZXJ5dGhpbmcgdG8gd29yayBjb3JyZWN0bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYWNoaW5lIG1heSBuZWVkIHRvIGhhdmUgc29tZSBJUHY0IHN1cHBvcnQsIGF0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGVhc3QgZm9yIHRoZSBsb29wYmFjayBpbnRlcmZhY2UuICBIb3dldmVyLCBmb3IgbmVhcmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbGwgdXNhZ2UgbW9kZXMgbm8gSVB2NCBzdXBwb3J0IGlzIHJlcXVpcmVkLiBTZWUgLW5vcGl2NC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBoYXZlIHRyb3VibGUgY29tcGlsaW5nIG9yIHJ1bm5pbmcgaW4gSVB2NiBtb2RlLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0IC1EWDExVk5DX0lQVjY9MCBpbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlIElQdjYgc3VwcG9ydC5cbiIKLSJcbiIKLSItbm82ICAgICAgICAgICAgICAgICAgIERpc2FibGUgSVB2NiBsaXN0ZW5pbmcgc3VwcG9ydCAob25seSB1c2VmdWwgaWYgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi02XCIgbW9kZSBpcyBjb21waWxlZCBpbiB0byBiZSB0aGUgZGVmYXVsdDsgc2VlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX0xJU1RFTjYgZGVzY3JpcHRpb24gYWJvdmUgdW5kZXIgXCItNlwiLilcbiIKLSJcbiIKLSItbm9pcHY2ICAgICAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gdXNlIElQdjYgZm9yIGFueSBsaXN0ZW5pbmcgb3IgY29ubmVjdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0cy4gIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgbGlzdGVuaW5nIHNlcnZpY2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvcnQocykgYW5kIG91dGdvaW5nIGNvbm5lY3Rpb25zIGZyb20gLWNvbm5lY3QsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdF9vcl9leGl0LCBvciAtcHJveHkuICBVc2UgdGhpcyBpZiB5b3UgYXJlIGhhdmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMgZHVlIHRvIElQdjYuXG4iCi0iXG4iCi0iLW5vaXB2NCAgICAgICAgICAgICAgICBEbyBub3QgdHJ5IHRvIHVzZSBJUHY0IGZvciBhbnkgbGlzdGVuaW5nIG9yIGNvbm5lY3RpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHMuICBUaGlzIGlzIG1haW5seSBmb3IgZXhwbG9yaW5nIHRoZSBiZWhhdmlvciBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIG9uIGFuIElQdjYtb25seSBzeXN0ZW0sIGJ1dCBtYXkgaGF2ZSBvdGhlciB1c2VzLlxuIgotIlxuIgotI2VuZGlmCi0iLXJlb3BlbiAgICAgICAgICAgICAgICBJZiB0aGUgWCBzZXJ2ZXIgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHRyeSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVvcGVuIHRoZSBYIGRpc3BsYXkgKHVwIHRvIG9uZSB0aW1lLikgIFRoaXMgaXMgb2YgdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGlzcGxheSBtYW5hZ2VycyBsaWtlIEdETSAoS2lsbEluaXRDbGllbnRzIG9wdGlvbilcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQga2lsbCB4MTF2bmMganVzdCBhZnRlciB0aGUgdXNlciBsb2dzIGludG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYIHNlc3Npb24uICBOb3RlOiB0aGUgcmVvcGVuZWQgc3RhdGUgbWF5IGJlIHVuc3RhYmxlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2V0IFgxMVZOQ19SRU9QRU5fRElTUExBWT1uIHRvIHJlb3BlbiBuIHRpbWVzIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0IFgxMVZOQ19SRU9QRU5fU0xFRVBfTUFYIHRvIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgMTAsIHRvIGtlZXAgdHJ5aW5nIHRvIHJlb3BlbiB0aGUgZGlzcGxheSAob25jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVyIHNlY29uZC4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGU6IGFzIG9mIDAuOS45LCB4MTF2bmMgdHJpZXMgdG8gYXV0b21hdGljYWxseSBhdm9pZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcga2lsbGVkIGJ5IHRoZSBkaXNwbGF5IG1hbmFnZXIgYnkgZGVsYXlpbmcgY3JlYXRpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Mgb3IgdXNpbmcgWEZJWEVTLiAgU28geW91IHNob3VsZG4ndCBuZWVkIHRvIHVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgS2lsbEluaXRDbGllbnRzPWZhbHNlIGFzIGxvbmcgYXMgeW91IGxvZyBpbiBxdWlja2x5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2ggKHdpdGhpbiA0NSBzZWNvbmRzIG9mIGNvbm5lY3RpbmcuKSAgWW91IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB0aGlzIGJ5IHNldHRpbmcgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gc2V0IGl0IHRvIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBkZWxheS5cbiIKLSJcbiIKLSItcmVmbGVjdCBob3N0Ok4gICAgICAgIEluc3RlYWQgb2YgY29ubmVjdGluZyB0byBhbmQgcG9sbGluZyBhbiBYIGRpc3BsYXksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSByZW1vdGUgVk5DIHNlcnZlciBob3N0Ok4gYW5kIGJlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rvci9yZXBlYXRlciBmb3IgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJ5aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBtYW5hZ2UgdGhlIGNhc2Ugb2YgbWFueSBzaW11bHRhbmVvdXMgVk5DIHZpZXdlcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGNsYXNzcm9vbSBicm9hZGNhc3RpbmcpIHdoZXJlLCBlLmcuIHlvdSBwdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgcmVwZWF0ZXIgb24gZWFjaCBuZXR3b3JrIHN3aXRjaCwgZXRjLCB0byBpbXByb3ZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBieSBkaXN0cmlidXRpbmcgdGhlIGxvYWQgYW5kIG5ldHdvcmtcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyYWZmaWMuICBJbXBsaWVzIC1zaGFyZWQgKHVzZSAtbm9zaGFyZWQgYXMgYSBsYXRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHRvIGRpc2FibGUpLiBTZWUgdGhlIGRpc2N1c3Npb24gYmVsb3cgdW5kZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2bmM6aG9zdDpOIGZvciBtb3JlIGRldGFpbHMuXG4iCi0iXG4iCi0iLWlkIHdpbmRvd2lkICAgICAgICAgICBTaG93IHRoZSBYIHdpbmRvdyBjb3JyZXNwb25kaW5nIHRvIFwid2luZG93aWRcIiBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgZGlzcGxheS4gIE5ldyB3aW5kb3dzIGxpa2UgcG9wdXAgbWVudXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnQgdG9wbGV2ZWxzLCBldGMsIG1heSBub3QgYmUgc2VlbiBvciBtYXkgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwZWQuICBEaXNhYmxpbmcgU2F2ZVVuZGVycyBvciBCYWNraW5nU3RvcmUgaW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYIHNlcnZlciBtYXkgaGVscCBzaG93IHRoZW0uICB4MTF2bmMgbWF5IGNyYXNoIGlmIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IGlzIGluaXRpYWxseSBwYXJ0aWFsbHkgb2JzY3VyZWQsIGNoYW5nZXMgc2l6ZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGljb25pZmllZCwgZXRjLiAgU29tZSBzdGVwcyBhcmUgdGFrZW4gdG8gYXZvaWQgdGhpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSAteHJhbmRyIG1lY2hhbmlzbSBpcyB1c2VkIHRvIHRyYWNrIHJlc2l6ZXMuICBVc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHh3aW5pbmZvKDEpIHRvIGdldCB0aGUgd2luZG93IGlkLCBvciB1c2UgXCItaWQgcGlja1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBoYXZlIHgxMXZuYyBydW4geHdpbmluZm8oMSkgZm9yIHlvdSBhbmQgZXh0cmFjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlkLiAgVGhlIC1pZCBvcHRpb24gaXMgdXNlZnVsIGZvciBleHBvcnRpbmcgdmVyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlIGFwcGxpY2F0aW9ucyAoZS5nLiB0aGUgY3VycmVudCB2aWV3IG9uIGEgd2ViY2FtKS5cbiIKLSItc2lkIHdpbmRvd2lkICAgICAgICAgIEFzIC1pZCwgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIHdpbmRvdyBkaXJlY3RseSBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRzIGEgcm9vdCB2aWV3IHRvIGl0OiB0aGlzIHNob3dzIFNhdmVVbmRlcnMgbWVudXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBldGMsIGFsdGhvdWdoIHRoZXkgd2lsbCBiZSBjbGlwcGVkIGlmIHRoZXkgZXh0ZW5kIGJleW9uZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdy5cbiIKLSJcbiIKLSItYXBwc2hhcmUgICAgICAgICAgICAgIFNpbXBsZSBhcHBsaWNhdGlvbiBzaGFyaW5nIGJhc2VkIG9uIHRoZSAtaWQvLXNpZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtLiAgRXZlcnkgbmV3IHRvcGxldmVsIHdpbmRvdyB0aGF0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY3JlYXRlcyBpbmR1Y2VzIGEgbmV3IHZpZXdlciB3aW5kb3cgdmlhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIHJldmVyc2UgY29ubmVjdGlvbi4gIFRoZSAtaWQvLXNpZCBhbmQgLWNvbm5lY3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYXJlIHJlcXVpcmVkLiAgUnVuICd4MTF2bmMgLWFwcHNoYXJlIC1oZWxwJ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby5cbiIKLSJcbiIKLSNpZiAwCi0iLWZyZWV6ZV93aGVuX29ic2N1cmVkICBQcm9iYWJseSBvbmx5IG9mIHVzZSBpbiAtYXBwc2hhcmUgbW9kZTogaWYgdGhlIC1pZC8tc2lkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9ic2N1cmVkIGJ5IG90aGVyIHdpbmRvd3MsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdG9wIGNoZWNraW5nIGZvciBmcmFtZWJ1ZmZlciB1cGRhdGVzLiAgTW91c2UgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlib2FyZCBldmVudHMgYXJlIHN0aWxsIHByb2Nlc3NlZCBhbmQgaW5qZWN0ZWQuXG4iCi0iXG4iCi0jZW5kaWYKLSItY2xpcCBXeEgrWCtZICAgICAgICAgIE9ubHkgc2hvdyB0aGUgc3ViLXJlZ2lvbiBvZiB0aGUgZnVsbCBkaXNwbGF5IHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZWN0YW5nbGUgZ2VvbWV0cnkgd2l0aCBzaXplIFd4SCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArWCtZLiAgVGhlIFZOQyBkaXNwbGF5IGhhcyBzaXplIFd4SCAoaS5lLiBzbWFsbGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBmdWxsIGRpc3BsYXkpLiAgVGhpcyBhbHNvIHdvcmtzIGZvciAtaWQvLXNpZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVyZSB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSB1cHBlciBsZWZ0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXIgb2YgdGhlIHNlbGVjdGVkIHdpbmRvdy4gIEFuIGV4YW1wbGUgdXNlIG9mIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiB3b3VsZCBiZSB0byBzcGxpdCBhIGxhcmdlIChlLmcuIFhpbmVyYW1hKSBkaXNwbGF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHR3byBwYXJ0cyB0byBiZSBhY2Nlc3NlZCB2aWEgc2VwYXJhdGUgdmlld2VycyBieVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhIHNlcGFyYXRlIHgxMXZuYyBvbiBlYWNoIHBhcnQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgJy1jbGlwIHhpbmVyYW1hMCcgdG8gY2xpcCB0byB0aGUgZmlyc3QgeGluZXJhbWFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1Yi1zY3JlZW4gKGlmIHhpbmVyYW1hIGlzIGFjdGl2ZSkuICB4aW5lcmFtYTEgZm9yIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMm5kIHN1Yi1zY3JlZW4sIGV0Yy4gIFRoaXMgd2F5IHlvdSBkb24ndCBuZWVkIHRvIGZpZ3VyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRoZSBXeEgrWCtZIG9mIHRoZSBkZXNpcmVkIHhpbmVyYW1hIHN1Yi1zY3JlZW4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5zIGFyZSBzb3J0ZWQgaW4gaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKDAsMCkgb3JpZ2luIChJLmUuIG5vdCB0aGUgWHNlcnZlcidzIG9yZGVyKS5cbiIKLSJcbiIKLSItZmxhc2hjbWFwICAgICAgICAgICAgIEluIDhicHAgaW5kZXhlZCBjb2xvciwgbGV0IHRoZSBpbnN0YWxsZWQgY29sb3JtYXAgZmxhc2hcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBwb2ludGVyIG1vdmVzIGZyb20gd2luZG93IHRvIHdpbmRvdyAoc2xvdykuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHNvIHRyeSB0aGUgLTh0bzI0IG9wdGlvbiB0byBhdm9pZCBmbGFzaCBhbHRvZ2V0aGVyLlxuIgotIi1zaGlmdGNtYXAgbiAgICAgICAgICAgUmFyZSBwcm9ibGVtLCBidXQgc29tZSA4YnBwIGRpc3BsYXlzIHVzZSBsZXNzIHRoYW4gMjU2XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb2xvcmNlbGxzIChlLmcuIDE2LWNvbG9yIGdyYXlzY2FsZSwgcGVyaGFwcyB0aGUgb3RoZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgYXJlIHVzZWQgZm9yIGRvdWJsZSBidWZmZXJpbmcpICphbmQqIGFsc28gbmVlZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgdGhlIHBpeGVscyB2YWx1ZXMgYXdheSBmcm9tIDAsIC4uLCBuY2VsbHMuICBcIm5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBzaGlmdCB0byBiZSBhcHBsaWVkIHRvIHRoZSBwaXhlbCB2YWx1ZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBzZWUgdGhlIHBpeGVsIHZhbHVlcyBzZXQgREVCVUdfQ01BUD0xIHRvIHByaW50IG91dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBjb2xvcm1hcCBoaXN0b2dyYW0uICBFeGFtcGxlOiAtc2hpZnRjbWFwIDI0MFxuIgotIi1ub3RydWVjb2xvciAgICAgICAgICAgRm9yIDhicHAgZGlzcGxheXMsIGZvcmNlIGluZGV4ZWQgY29sb3IgKGkuZS4gYSBjb2xvcm1hcClcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgaXQgbG9va3MgbGlrZSA4YnBwIFRydWVDb2xvciAocmFyZSBwcm9ibGVtKS5cbiIKLSItYWR2ZXJ0aXNlX3RydWVjb2xvciAgIElmIHRoZSBYMTEgZGlzcGxheSBpcyBpbmRleGVkIGNvbG9yLCBsaWUgdG8gY2xpZW50c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGZpcnN0IGNvbm5lY3QgYnkgdGVsbGluZyB0aGVtIGl0IGlzIHRydWVjb2xvci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIHdvcmthcm91bmQgUmVhbFZOQzogaW5QRiBoYXMgY29sb3VyTWFwIGJ1dCBub3QgOGJwcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlICctYWR2ZXJ0aXNlX3RydWVjb2xvciByZXNldCcgdG8gcmVzZXQgY2xpZW50IGZiIHRvby5cbiIKLSJcbiIKLSItdmlzdWFsIG4gICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHByb2JhYmx5IGRvZXMgbm90IGRvIHdoYXQgeW91IHRoaW5rLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSXQgc2ltcGx5ICpmb3JjZXMqIHRoZSB2aXN1YWwgdXNlZCBmb3IgdGhlIGZyYW1lYnVmZmVyO1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXkgYmUgYSBiYWQgdGhpbmcuLi4gKGUuZy4gbWVzc2VzIHVwIGNvbG9ycyBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgYSBjcmFzaCkuIEl0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBhbmQgZm9yIHNvbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdvcmthcm91bmRzLiAgbiBtYXkgYmUgYSBkZWNpbWFsIG51bWJlciwgb3IgMHggaGV4LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUnVuIHhkcHlpbmZvKDEpIGZvciB0aGUgdmFsdWVzLiAgT25lIG1heSBhbHNvIHVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJUcnVlQ29sb3JcIiwgZXRjLiBzZWUgPFgxMS9YLmg+IGZvciBhIGxpc3QuICBJZiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbmRzIGluIFwiOm1cIiB0aGVuIGZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmlzdWFsIGRlcHRoIGlzIGZvcmNlZCB0byBiZSBtLiAgWW91IG1heSB3YW50IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgLW5vc2htIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24gKHNvIFhHZXRJbWFnZSBtYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlIHRoZSBwaXhlbCBkYXRhKS5cbiIKLSJcbiIKLSItb3ZlcmxheSAgICAgICAgICAgICAgIEhhbmRsZSBtdWx0aXBsZSBkZXB0aCB2aXN1YWxzIG9uIG9uZSBzY3JlZW4sIGUuZy4gOCsyNFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDI0Kzggb3ZlcmxheSB2aXN1YWxzICh0aGUgMzIgYml0cyBwZXIgcGl4ZWwgYXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWQgd2l0aCA4IGZvciBQc2V1ZG9Db2xvciBhbmQgMjQgZm9yIFRydWVDb2xvcikuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgLW92ZXJsYXkgb25seSB3b3JrcyBvbiBTb2xhcmlzIHZpYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWFJlYWRTY3JlZW4oM1gxMSkgYW5kIElSSVggdXNpbmcgWFJlYWREaXNwbGF5KDMpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT24gU29sYXJpcyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBpbWFnZSBcImJsZWVkaW5nXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyb3VuZCB0cmFuc2llbnQgcG9wdXAgbWVudXMgKGJ1dCBub3QgZm9yIHRoZSBtZW51XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYpOiBhIHdvcmthcm91bmQgaXMgdG8gZGlzYWJsZSBTYXZlVW5kZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBieSBwYXNzaW5nIHRoZSBcIi1zdVwiIGFyZ3VtZW50IHRvIFhzdW4gKGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAvZXRjL2R0L2NvbmZpZy9Yc2VydmVycykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgLW92ZXJsYXkgYXMgYSB3b3JrYXJvdW5kIGZvciBzaXR1YXRpb25zIGxpa2UgdGhlc2U6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTb21lIGxlZ2FjeSBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgZGVmYXVsdCB2aXN1YWwgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIDhicHAgKDgrMjQpLCBvciB0aGV5IHdpbGwgdXNlIDhicHAgUHNldWRvQ29sb3IgZXZlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZGVmYXVsdCB2aXN1YWwgaXMgZGVwdGggMjQgVHJ1ZUNvbG9yICgyNCs4KS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZXNlIGNhc2VzIGNvbG9ycyBpbiBzb21lIHdpbmRvd3Mgd2lsbCBiZSBpbmNvcnJlY3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHgxMXZuYyB1bmxlc3MgLW92ZXJsYXkgaXMgdXNlZC4gIEFub3RoZXIgdXNlIG9mXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtb3ZlcmxheSBpcyB0byBlbmFibGUgc2hvd2luZyB0aGUgZXhhY3QgbW91c2UgY3Vyc29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSAoZGV0YWlscyBiZWxvdykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVbmRlciAtb3ZlcmxheSwgcGVyZm9ybWFuY2Ugd2lsbCBiZSBzb21ld2hhdCBzbG93ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byB0aGUgZXh0cmEgaW1hZ2UgdHJhbnNmb3JtYXRpb25zIHJlcXVpcmVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgZG8gbm90IHVzZSAtb3ZlcmxheSwgYnV0IHJhdGhlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlIHRoZSBYIHNlcnZlciBzbyB0aGF0IHRoZSBkZWZhdWx0IHZpc3VhbCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggMjQgVHJ1ZUNvbG9yIGFuZCB0cnkgdG8gaGF2ZSBhbGwgYXBwcyB1c2UgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsIChlLmcuIHNvbWUgYXBwcyBoYXZlIC11c2UyNCBvciAtdmlzdWFsIG9wdGlvbnMpLlxuIgotIi1vdmVybGF5X25vY3Vyc29yICAgICAgU2V0cyAtb3ZlcmxheSwgYnV0IGRvZXMgbm90IHRyeSB0byBkcmF3IHRoZSBleGFjdCBtb3VzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIHNoYXBlIHVzaW5nIHRoZSBvdmVybGF5IG1lY2hhbmlzbS5cbiIKLSJcbiIKLSItOHRvMjQgW29wdHNdICAgICAgICAgIFRyeSB0aGlzIG9wdGlvbiBpZiAtb3ZlcmxheSBpcyBub3Qgc3VwcG9ydGVkIG9uIHlvdXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9TLCBhbmQgeW91IGhhdmUgYSBsZWdhY3kgOGJwcCBhcHAgdGhhdCB5b3Ugd2FudCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlldyBvbiBhIG11bHRpLWRlcHRoIGRpc3BsYXkgd2l0aCBkZWZhdWx0IGRlcHRoIDI0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGlzIDMyIGJwcCkgT1IgaGF2ZSBhIGRlZmF1bHQgZGVwdGggOCBkaXNwbGF5IHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIDI0IG92ZXJsYXkgd2luZG93cyBmb3Igc29tZSBhcHBzLiAgVGhpcyBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1heSBub3Qgd29yayBvbiBhbGwgWCBzZXJ2ZXJzIGFuZCBoYXJkd2FyZSAodGVzdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbiBYRnJlZTg2L1hvcmcgbWdhIGRyaXZlciBhbmQgWHN1bikuICBUaGUgXCJvcHRzXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpcyBub3QgcmVxdWlyZWQgYW5kIGlzIGRlc2NyaWJlZCBiZWxvdy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBlbmFibGVzIGEgaGFjayB3aGVyZSB4MTF2bmMgbW9uaXRvcnMgd2luZG93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIDMgbGV2ZWxzIGZyb20gdGhlIHJvb3Qgd2luZG93LiAgSWYgaXQgZmluZHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFueSB0aGF0IGFyZSA4YnBwIGl0IGV4dHJhY3RzIHRoZSBpbmRleGVkIGNvbG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCB2YWx1ZXMgdXNpbmcgWEdldEltYWdlKCkgYW5kIHRoZW4gYXBwbGllcyBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiB1c2luZyB0aGUgY29sb3JtYXAocykgdG8gY3JlYXRlIFRydWVDb2xvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkdCIHZhbHVlcyB0aGF0IGl0IGluIHR1cm4gaW5zZXJ0cyBpbnRvIGJpdHMgMS0yNCBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYW1lYnVmZmVyLiAgVGhpcyBjcmVhdGVzIGEgZGVwdGggMjQgXCJ2aWV3XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBkaXNwbGF5IHRoYXQgaXMgdGhlbiBleHBvcnRlZCB2aWEgVk5DLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgZm9yIGRlZmF1bHQgZGVwdGggOCBkaXNwbGF5cywgdGhlIGRlcHRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAyNCByZWdpb25zIGFyZSByZWFkIGJ5IFhHZXRJbWFnZSgpIGFuZCBldmVyeXRoaW5nIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBhbmQgaW5zZXJ0ZWQgaW50byBhIGRlcHRoIDI0IFRydWVDb2xvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgZXZlbiBpZiB0aGVyZSBhcmUgKm5vKiBkZXB0aCAyNCB2aXN1YWxzIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIChpLmUuIHB1cmUgOGJwcCksIHRoaXMgbW9kZSBpcyBwb3RlbnRpYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW4gaW1wcm92ZW1lbnQgb3ZlciAtZmxhc2hjbWFwIGJlY2F1c2UgaXQgYXZvaWRzIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hpbmcgYW5kIHNob3dzIGVhY2ggd2luZG93IGluIHRoZSBjb3JyZWN0IGNvbG9yLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRob2Qgd29ya3MgT0ssIGJ1dCBtYXkgc3RpbGwgaGF2ZSBidWdzIGFuZCBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBob2cgcmVzb3VyY2VzLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIDhicHAgd2luZG93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW50IGNvbG9ybWFwcywgb25lIG1heSBoYXZlIHRvIGljb25pZnkgYWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidXQgb25lIGZvciB0aGUgY29sb3JzIHRvIGJlIGNvcnJlY3QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBtYXkgYmUgcGFpbnRpbmcgZXJyb3JzIGZvciBjbGlwcGluZyBhbmQgc3dpdGNoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHdpbmRvd3Mgb2YgZGVwdGhzIDggYW5kIDI0LiAgSGV1cmlzdGljcyBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgdG8gdHJ5IHRvIG1pbmltaXplIHRoZSBwYWludGluZyBlcnJvcnMuICBPbmUgY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHByZXNzIDMgQWx0X0wncyBpbiBhIHJvdyB0byByZWZyZXNoIHRoZSBzY3JlZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBlcnJvciBkb2VzIG5vdCByZXBhaXIgaXRzZWxmLiAgQWxzbyB0aGUgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZml4c2NyZWVuIDg9My4wIG9yIC1maXhzY3JlZW4gVj0zLjAgbWF5IGJlIHVzZWQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSByZWZyZXNoIHRoZSBzY3JlZW4gYXQgdGhlIGNvc3Qgb2YgYmFuZHdpZHRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZXZlcnkgMyBzZWMgZm9yIHRoaXMgZXhhbXBsZSkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgW29wdHNdIHN0cmluZyBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHNldHRpbmdzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgc2V0dGluZ3MgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgZm9yIHNvbWUgWCBzZXJ2ZXJzIHdpdGggZGVmYXVsdCBkZXB0aCAyNCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHVwIG1heSBiZSBhY2hpZXZlZCB2aWEgdGhlIG9wdGlvbiBcIm5vZ2V0aW1hZ2VcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZW5hYmxlcyBhIHNjaGVtZSB3ZXJlIFhHZXRJbWFnZSgpIGlzIG5vdCB1c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byByZXRyaWV2ZSB0aGUgOGJwcCBkYXRhLiAgSW5zdGVhZCwgaXQgYXNzdW1lcyB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgOGJwcCBkYXRhIGlzIGluIGJpdHMgMjUtMzIgb2YgdGhlIDMyYml0IFggcGl4ZWxzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdGhhdCB0aGUgWCBzZXJ2ZXIgc2hvdWxkIHB1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgdGhlcmUgZm9yIG91ciBwb2xsIHJlcXVlc3RzLCBidXQgc29tZSBkbyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZSBleHRyYSBzdGVwcyB0byByZXRyaWV2ZSBpdCBjYW4gYmUgc2tpcHBlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRlc3RlZCB3aXRoIG1nYSBkcml2ZXIgd2l0aCBYRnJlZTg2L1hvcmcuICBGb3IgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGRlcHRoIDggY2FzZSB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRqdXN0IGhvdyBvZnRlbiBYR2V0SW1hZ2UoKSBpcyB1c2VkIHRvIHBvbGwgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub24tZGVmYXVsdCB2aXN1YWwgcmVnaW9ucyBmb3IgY2hhbmdlcywgdXNlIHRoZSBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwicG9sbD10XCIgd2hlcmUgXCJ0XCIgaXMgYSBmbG9hdGluZyBwb2ludCB0aW1lLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICUuMmYpXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoZSBvcHRpb24gXCJsZXZlbDJcIiB3aWxsIGxpbWl0IHRoZSBzZWFyY2hcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBub24tZGVmYXVsdCB2aXN1YWwgd2luZG93cyB0byB0d28gbGV2ZWxzIGZyb20gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByb290IHdpbmRvdy4gIERvIHRoaXMgb24gc2xvdyBtYWNoaW5lcyB3aGVyZSB5b3Uga25vd1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyBtYW5hZ2VyIG9ubHkgaW1wb3NlcyBvbmUgZXh0cmEgd2luZG93IGJldHdlZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHAgd2luZG93IGFuZCB0aGUgcm9vdCB3aW5kb3cuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHNvIGZvciB2ZXJ5IHNsb3cgbWFjaGluZXMgdXNlIFwiY2FjaGV3aW49dFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0IGlzIGEgZmxvYXRpbmcgcG9pbnQgYW1vdW50IG9mIHRpbWUgdG8gY2FjaGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhHZXRXaW5kb3dBdHRyaWJ1dGVzIHJlc3VsdHMuICBFLmcuIGNhY2hld2luPTUuMC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWF5IGxlYWQgdG8gdGhlIHdpbmRvd3MgYmVpbmcgdW5ub3RpY2VkIGZvciB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQgb2YgdGltZSB3aGVuIGRlaWNvbmlmeWluZywgcGFpbnRpbmcgZXJyb3JzLCBldGMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXaGlsZSB0ZXN0aW5nIG9uIGEgdmVyeSBvbGQgU1MyMCB0aGVzZSBvcHRpb25zIGdhdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvbGVyYWJsZSByZXNwb25zZTogLTh0bzI0IHBvbGw9MC4yLGNhY2hld2luPTUuMC4gRm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hY2hpbmUgLW92ZXJsYXkgaXMgc3VwcG9ydGVkIGFuZCBnaXZlcyBiZXR0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nIGZvciB0aGlzIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJkYmc9MVwiLCBcImRiZz0yXCIsIG9yIFwiZGJnPTNcIi5cbiIKLSJcbiIKLSItMjR0bzMyICAgICAgICAgICAgICAgIFZlcnkgcmFyZSBwcm9ibGVtOiBpZiB0aGUgZnJhbWVidWZmZXIgKFggZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgLXJhd2ZiKSBpcyAyNGJwcCBpbnN0ZWFkIG9mIHRoZSB1c3VhbCAzMmJwcCwgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHkgdHJhbnNmb3JtIHRoZSBwaXhlbHMgdG8gMzJicHAuICBUaGlzIHdpbGwgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsb3dlciwgYnV0IGNhbiBiZSB1c2VkIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdoZXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgdmlld2VycyBjYW5ub3QgaGFuZGxlIDI0YnBwIChlLmcuIFwibWFpbjogc2V0UEY6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgOCwgMTYgb3IgMzIgYnBwP1wiKS4gIFNlZSB0aGUgRkFRIGZvciBtb3JlIGluZm8uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY2FzZSBvZiAtcmF3ZmIgbW9kZSwgdGhlIHBpeGVscyBhcmUgZGlyZWN0bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJ5IGluc2VydGluZyBhIDAgYnl0ZSB0byBwYWQgdGhlbSBvdXQgdG8gMzJicHAuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgWCBkaXNwbGF5cywgYSBrbHVkZ2UgaXMgZG9uZSB0aGF0IGlzIGVxdWl2YWxlbnQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLW5vc2htIC12aXN1YWwgVHJ1ZUNvbG9yOjMyXCIuICAoSWYgYmV0dGVyIHBlcmZvcm1hbmNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQgZm9yIHRoZSBsYXR0ZXIsIGZlZWwgZnJlZSB0byBhc2spLlxuIgotIlxuIgotIi1zY2FsZSBmcmFjdGlvbiAgICAgICAgU2NhbGUgdGhlIGZyYW1lYnVmZmVyIGJ5IGZhY3RvciBcImZyYWN0aW9uXCIuICBWYWx1ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiAxIHNocmluayB0aGUgZmIsIGxhcmdlciBvbmVzIGV4cGFuZCBpdC4gTm90ZTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSBtYXkgbm90IGJlIHNoYXJwIGFuZCByZXNwb25zZSBtYXkgYmUgc2xvd2VyLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJmcmFjdGlvblwiIGNvbnRhaW5zIGEgZGVjaW1hbCBwb2ludCBcIi5cIiBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgdGFrZW4gYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGFsdGVybmF0aXZlbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub3RhdGlvbiBcIm0vblwiIG1heSBiZSB1c2VkIHRvIGRlbm90ZSBmcmFjdGlvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0bHksIGUuZy4gLXNjYWxlIDIvM1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gc2NhbGUgYXN5bW1ldHJpY2FsbHkgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLCBzcGVjaWZ5IGEgV3hIIGdlb21ldHJ5IHRvIHN0cmV0Y2ggdG86XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuICctc2NhbGUgMTAyNHg3NjgnLCBvciBhbHNvICctc2NhbGUgMC45eDAuNzUnXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTY2FsaW5nIE9wdGlvbnM6IGNhbiBiZSBhZGRlZCBhZnRlciBcImZyYWN0aW9uXCIgdmlhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIjpcIiwgdG8gc3VwcGx5IG11bHRpcGxlIFwiOlwiIG9wdGlvbnMgdXNlIGNvbW1hcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBqdXN0IHdhbnQgYSBxdWljaywgcm91Z2ggc2NhbGluZyB3aXRob3V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZywgYXBwZW5kIFwiOm5iXCIgdG8gXCJmcmFjdGlvblwiIChlLmcuIC1zY2FsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMS8zOm5iKS4gIE5vIGJsZW5kaW5nIGlzIHRoZSBkZWZhdWx0IGZvciA4YnBwIGluZGV4ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCB0byBmb3JjZSBibGVuZGluZyBmb3IgdGhpcyBjYXNlIHVzZSBcIjpmYlwiLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSAtc2Nyb2xsY29weXJlY3QgYW5kIC13aXJlY29weXJlY3QgdW5kZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1zY2FsZSB1c2UgXCI6bm9jclwiLiAgSWYgeW91IG5lZWQgdG8gdG8gZW5hYmxlIHRoZW0gdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIjpjclwiIG9yIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBhIHNsb3cgbGluayBpcyBkZXRlY3RlZCwgXCI6bm9jclwiIG1heSBiZSBhcHBsaWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5LiAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1vcmUgZXNvdGVyaWMgb3B0aW9uczogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2bmN2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2NhbGVkIHdpZHRoIGlzIGFkanVzdGVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgNDpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGRpc2FibGUgdGhpcyB1c2UgXCI6bjRcIi4gIFwiOmluXCIgdXNlIGludGVycG9sYXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZSBldmVuIHdoZW4gc2hyaW5raW5nLCBcIjpwYWRcIiBwYWQgc2NhbGVkIHdpZHRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgaGVpZ2h0IHRvIGJlIG11bHRpcGxlcyBvZiBzY2FsaW5nIGRlbm9taW5hdG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzIGZvciAyLzMpLlxuIgotIlxuIgotIi1nZW9tZXRyeSBXeEggICAgICAgICAgU2FtZSBhcyAtc2NhbGUgV3hIXG4iCi0iXG4iCi0iLXNjYWxlX2N1cnNvciBmcmFjICAgICBCeSBkZWZhdWx0IGlmIC1zY2FsZSBpcyBzdXBwbGllZCB0aGUgY3Vyc29yIHNoYXBlIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgYnkgdGhlIHNhbWUgZmFjdG9yLiAgRGVwZW5kaW5nIG9uIHlvdXIgdXNhZ2UsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3UgbWF5IHdhbnQgdG8gc2NhbGUgdGhlIGN1cnNvciBpbmRlcGVuZGVudGx5IG9mIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIG9yIG5vdCBhdCBhbGwuICBJZiB5b3Ugc3BlY2lmeSAtc2NhbGVfY3Vyc29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3Vyc29yIHdpbGwgYmUgc2NhbGVkIGJ5IHRoYXQgZmFjdG9yLiAgV2hlbiB1c2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNjYWxlIG1vZGUgdG8ga2VlcCB0aGUgY3Vyc29yIGF0IGl0cyBcIm5hdHVyYWxcIiBzaXplXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgXCItc2NhbGVfY3Vyc29yIDFcIi4gIE1vc3Qgb2YgdGhlIFwiOlwiIHNjYWxpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYXBwbHkgaGVyZSBhcyB3ZWxsLlxuIgotIlxuIgotIi12aWV3b25seSAgICAgICAgICAgICAgQWxsIFZOQyBjbGllbnRzIGNhbiBvbmx5IHdhdGNoIChkZWZhdWx0ICVzKS5cbiIKLSItc2hhcmVkICAgICAgICAgICAgICAgIFZOQyBkaXNwbGF5IGlzIHNoYXJlZCwgaS5lLiBtb3JlIHRoYW4gb25lIHZpZXdlciBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgYXQgdGhlIHNhbWUgdGltZSAoZGVmYXVsdCAlcykuXG4iCi0iLW9uY2UgICAgICAgICAgICAgICAgICBFeGl0IGFmdGVyIHRoZSBmaXJzdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHZpZXdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdHMsIG9wcG9zaXRlIG9mIC1mb3JldmVyLiBUaGlzIGlzIHRoZSBEZWZhdWx0LlxuIgotIi1mb3JldmVyICAgICAgICAgICAgICAgS2VlcCBsaXN0ZW5pbmcgZm9yIG1vcmUgY29ubmVjdGlvbnMgcmF0aGVyIHRoYW4gZXhpdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgc29vbiBhcyB0aGUgZmlyc3QgY2xpZW50KHMpIGRpc2Nvbm5lY3QuIFNhbWUgYXMgLW1hbnlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGdldCB0aGUgc3RhbmRhcmQgbm9uLXNoYXJlZCBWTkMgYmVoYXZpb3Igd2hlcmUgd2hlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBuZXcgVk5DIGNsaWVudCBjb25uZWN0cyB0aGUgZXhpc3RpbmcgVk5DIGNsaWVudCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCB1c2U6ICAtbmV2ZXJzaGFyZWQgLWZvcmV2ZXIgICBUaGlzIG1ldGhvZCBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsc28gYmUgdXNlZCB0byBndWFyZCBhZ2FpbnN0IGh1bmcgVENQIGNvbm5lY3Rpb25zIHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBnbyBhd2F5LlxuIgotIlxuIgotIi1sb29wICAgICAgICAgICAgICAgICAgQ3JlYXRlIGFuIG91dGVyIGxvb3AgcmVzdGFydGluZyB0aGUgeDExdm5jIHByb2Nlc3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZW5ldmVyIGl0IHRlcm1pbmF0ZXMuICAtYmcgYW5kIC1pbmV0ZCBhcmUgaWdub3JlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBtb2RlIChob3dldmVyIHNlZSAtbG9vcGJnIGJlbG93KS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZWZ1bCBmb3IgY29udGludWluZyBldmVuIGlmIHRoZSBYIHNlcnZlciB0ZXJtaW5hdGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzdGFydHMgKGF0IHRoYXQgbW9tZW50IHRoZSBwcm9jZXNzIHdpbGwgbmVlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiB0byByZWNvbm5lY3QgdG8gdGhlIG5ldyBYIHNlcnZlciBvZiBjb3Vyc2UpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlLCBlLmcuLCAtbG9vcDEwMCB0byBzbGVlcCAxMDAgbWlsbGlzZWNzIGJldHdlZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRzLCBldGMuICBEZWZhdWx0IGlzIDIwMDBtcyAoaS5lLiAyIHNlY3MpIFVzZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gLWxvb3AzMDAsNSB0byBzbGVlcCAzMDAgbXMgYW5kIG9ubHkgbG9vcCA1IHRpbWVzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgLWxvb3BiZyAocGx1cyBhbnkgbnVtYmVycykgaXMgc3BlY2lmaWVkIGluc3RlYWQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgXCItYmdcIiBvcHRpb24gaXMgaW1wbGllZCBhbmQgdGhlIG1vZGUgYXBwcm94aW1hdGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmV0ZCg4KSB1c2FnZSB0byBzb21lIGRlZ3JlZS4gIEluIHRoaXMgY2FzZSB3aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBnb2VzIGludG8gdGhlIGJhY2tncm91bmQgYW55IGxpc3RlbmluZyBzb2NrZXRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBwb3J0cyA1OTAwLCA1ODAwKSBhcmUgY2xvc2VkLCBzbyB0aGUgbmV4dCBvbmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsb29wIGNhbiB1c2UgdGhlbS4gIFRoaXMgbW9kZSB3aWxsIG9ubHkgYmUgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZSBpZiBhIFZOQyBjbGllbnQgKHRoZSBvbmx5IGNsaWVudCBmb3IgdGhhdCBwcm9jZXNzKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBjb25uZWN0ZWQgYmVmb3JlIHRoZSBwcm9jZXNzIGdvZXMgaW50byB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQsIGZvciBleGFtcGxlLCB1c2FnZSBvZiAtZGlzcGxheSBXQUlUOi4uLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXN2YywgYW5kIC1jb25uZWN0IGNhbiBtYWtlIHVzZSBvZiB0aGlzIFwicG9vciBtYW4nc1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmV0ZCBtb2RlLiAgVGhlIGRlZmF1bHQgd2FpdCB0aW1lIGlzIDUwMG1zIGluIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuICBUaGlzIHVzYWdlIGNvdWxkIHVzZSB1c2VmdWw6ICAtc3ZjIC1iZyAtbG9vcGJnXG4iCi0iXG4iCi0iLXRpbWVvdXQgbiAgICAgICAgICAgICBFeGl0IHVubGVzcyBhIGNsaWVudCBjb25uZWN0cyB3aXRoaW4gdGhlIGZpcnN0IG4gc2Vjb25kc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgc3RhcnR1cC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGhhdmUgYmVlbiBubyBjb25uZWN0aW9uIGF0dGVtcHRzIGFmdGVyIG5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgeDExdm5jIGV4aXRzIGltbWVkaWF0ZWx5LiAgSWYgYSBjbGllbnQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBjb25uZWN0IGJ1dCBoYXMgbm90IHByb2dyZXNzZWQgdG8gdGhlIG5vcm1hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nIHN0YXRlLCB4MTF2bmMgZ2l2ZXMgaXQgYSBmZXcgbW9yZSBzZWNvbmRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBmaW5pc2ggYW5kIGV4aXRzIGlmIGl0IGRvZXMgbm90IG1ha2UgaXQgdG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgc3RhdGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmV2ZXJzZSBjb25uZWN0aW9ucyB2aWEgLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSB0aW1lb3V0IG9mIG4gc2Vjb25kcyB3aWxsIGJlIHNldCBmb3IgYWxsIHJldmVyc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RzLiAgSWYgdGhlIGNvbm5lY3QgdGltZW91dCBhbGFybSBnb2VzIG9mZixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB3aWxsIGV4aXQgaW1tZWRpYXRlbHkuXG4iCi0iXG4iCi0iLXNsZWVwaW4gbiAgICAgICAgICAgICBBdCBzdGFydHVwIHNsZWVwIG4gc2Vjb25kcyBiZWZvcmUgcHJvY2VlZGluZyAoZS5nLiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgcmVkaXJzIGFuZCBsaXN0ZW5pbmcgY2xpZW50cyB0byBzdGFydCB1cClcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGEgcmFuZ2UgaXMgZ2l2ZW46ICctc2xlZXBpbiBtaW4tbWF4JywgYSByYW5kb20gdmFsdWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gbWluIGFuZCBtYXggaXMgc2xlcHQuIEUuZy4gJy1zbGVlcGluIDAtMjAnIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgJy1zbGVlcGluIDEwLTMwJy4gIEZsb2F0cyBhcmUgYWxsb3dlZCB0b28uXG4iCi0iXG4iCi0iLWluZXRkICAgICAgICAgICAgICAgICBMYXVuY2hlZCBieSBpbmV0ZCg4KTogc3RkaW8gaW5zdGVhZCBvZiBsaXN0ZW5pbmcgc29ja2V0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgeW91IGFyZSBub3QgcmVkaXJlY3Rpbmcgc3RkZXJyIHRvIGEgbG9nIGZpbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh2aWEgc2hlbGwgMj4gb3IgLW8gb3B0aW9uKSB5b3UgTVVTVCBhbHNvIHNwZWNpZnkgdGhlIC1xXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sIG90aGVyd2lzZSB0aGUgc3RkZXJyIGdvZXMgdG8gdGhlIHZpZXdlciB3aGljaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjYXVzZSBpdCB0byBhYm9ydC4gIFNwZWNpZnlpbmcgYm90aCAtaW5ldGQgYW5kIC1xXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gLW8gd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBzdGRlcnIuXG4iCi0iXG4iCi0iLXRpZ2h0ZmlsZXhmZXIgICAgICAgICBFbmFibGUgdGhlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgZXh0ZW5zaW9uLiBOb3RlIHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2hlbiB0aGUgLXZpZXdvbmx5IG9wdGlvbiBpcyBzdXBwbGllZCBhbGwgZmlsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJzIGFyZSBkaXNhYmxlZC4gIEFsc28gY2xpZW50cyB0aGF0IGxvZyBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgY2Fubm90IHRyYW5zZmVyIGZpbGVzLiAgSG93ZXZlciwgaWYgdGhlIHJlbW90ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBtZWNoYW5pc20gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGdsb2JhbCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVyLWNsaWVudCB2aWV3b25seSBzdGF0ZSB0aGUgZmlsZXRyYW5zZmVyIHBlcm1pc3Npb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIE5PVCBjaGFuZ2UuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6IHBsZWFzZSB1bmRlcnN0YW5kIGlmIC10aWdodGZpbGV4ZmVyIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNwbGF5IG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2ZSBpdCBzd2l0Y2ggdXNlcnMgdmlhIHRoZSAtdXNlcnMgb3B0aW9uLCB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8gZmlsZXRyYW5zZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWFkcyBhbmQgd3JpdGVzIGFzICpyb290Ki5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFsc28sIHRpZ2h0ZmlsZXhmZXIgaXMgZGlzYWJsZWQgaW4gLXVuaXhwdyBtb2RlLlxuIgotIlxuIgotIi11bHRyYWZpbGV4ZmVyICAgICAgICAgTm90ZTogdG8gZW5hYmxlIFVsdHJhVk5DIGZpbGV0cmFuc2ZlciBhbmQgdG8gZ2V0IGl0IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3JrIHlvdSBwcm9iYWJseSBuZWVkIHRvIHN1cHBseSB0aGVzZSBMaWJWTkNTZXJ2ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFwiLXJmYnZlcnNpb24gMy42IC1wZXJtaXRmaWxldHJhbnNmZXJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItdWx0cmFmaWxleGZlclwiIGlzIGFuIGFsaWFzIGZvciB0aGlzIGNvbWJpbmF0aW9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JUQU5UOiBwbGVhc2UgdW5kZXJzdGFuZCBpZiAtdWx0cmFmaWxleGZlciBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGFuZCB5b3UgcnVuIHgxMXZuYyBhcyByb290IGZvciwgc2F5LCBpbmV0ZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzcGxheSBtYW5hZ2VyIChnZG0sIGtkbSwgLi4uKSBhY2Nlc3MgYW5kIHlvdSBkb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmUgaXQgc3dpdGNoIHVzZXJzIHZpYSB0aGUgLXVzZXJzIG9wdGlvbiwgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIFZpZXdlcnMgdGhhdCBjb25uZWN0IGFyZSBhYmxlIHRvIGRvIGZpbGV0cmFuc2ZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVhZHMgYW5kIHdyaXRlcyBhcyAqcm9vdCouXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgc2FkbHkgeW91IGNhbm5vdCBkbyBib3RoIC10aWdodGZpbGV4ZmVyIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXVsdHJhZmlsZXhmZXIgYXQgdGhlIHNhbWUgdGltZSBiZWNhdXNlIHRoZSBsYXR0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIHNldHRpbmcgdGhlIHZlcnNpb24gdG8gMy42IGFuZCB0aWdodHZuYyB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgZG8gZmlsZXRyYW5zZmVyIHdoZW4gaXQgc2VlcyB0aGF0IHZlcnNpb24gbnVtYmVyLlxuIgotIlxuIgotIi1odHRwICAgICAgICAgICAgICAgICAgSW5zdGVhZCBvZiB1c2luZyAtaHR0cGRpciAoc2VlIGJlbG93KSB0byBzcGVjaWZ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgSmF2YSB2bmN2aWV3ZXIgYXBwbGV0IGlzLCBoYXZlIHgxMXZuYyB0cnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvICpndWVzcyogd2hlcmUgdGhlIGRpcmVjdG9yeSBpcyBieSBsb29raW5nIHJlbGF0aXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcHJvZ3JhbSBsb2NhdGlvbiBhbmQgaW4gc3RhbmRhcmQgbG9jYXRpb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3NlcywgZXRjKS4gIFVuZGVyIC1zc2wgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1zdHVubmVsIHRoZSBzc2wgY2xhc3NlcyBzdWJkaXJlY3RvcnkgaXMgc291Z2h0LlxuIgotIi1odHRwX3NzbCAgICAgICAgICAgICAgQXMgLWh0dHAsIGJ1dCBmb3JjZSBsb29rdXAgZm9yIHNzbCBjbGFzc2VzIHN1YmRpci5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBmb3IgSFRUUFMsIHNpbmdsZS1wb3J0IEphdmEgYXBwbGV0IGRlbGl2ZXJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHNldCBYMTFWTkNfSFRUUFNfRE9XTkxPQURfV0FJVF9USU1FIHRvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBhcHBsZXQgZG93bmxvYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmlzaC4gIFRoZSBkZWZhdWx0IGlzIDE1LlxuIgotIlxuIgotIi1hdmFoaSAgICAgICAgICAgICAgICAgVXNlIHRoZSBBdmFoaS9tRE5TIFplcm9Db25mIHByb3RvY29sIHRvIGFkdmVydGlzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBWTkMgc2VydmVyIHRvIHRoZSBsb2NhbCBuZXR3b3JrLiAoUmVsYXRlZCB0ZXJtczpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlenZvdXMsIEJvbmpvdXIpLiAgRGVwZW5kaW5nIG9uIHlvdXIgc2V0dXAsIHlvdVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWF5IG5lZWQgdG8gc3RhcnQgYXZhaGktZGFlbW9uIGFuZCBvcGVuIHVkcCBwb3J0IDUzNTNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHlvdXIgZmlyZXdhbGwuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCBYMTFWTkNfQVZBSElfTkFNRSwgWDExVk5DX0FWQUhJX0hPU1QsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQvb3IgWDExVk5DX0FWQUhJX1BPUlQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXMuICBGb3IgZXhhbXBsZTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX0FWQUhJX05BTUU9d2FsbHlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBhdmFoaSBBUEkgY2Fubm90IGJlIGZvdW5kIGF0IGJ1aWxkIHRpbWUsIGEgaGVscGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGxpa2UgYXZhaGktcHVibGlzaCgxKSBvciBkbnMtc2QoMSkgd2lsbCBiZSB0cmllZFxuIgotIlxuIgotIi1tZG5zICAgICAgICAgICAgICAgICAgU2FtZSBhcyAtYXZhaGkuXG4iCi0iLXplcm9jb25mICAgICAgICAgICAgICBTYW1lIGFzIC1hdmFoaS5cbiIKLSJcbiIKLSItY29ubmVjdCBzdHJpbmcgICAgICAgIEZvciB1c2Ugd2l0aCBcInZuY3ZpZXdlciAtbGlzdGVuXCIgcmV2ZXJzZSBjb25uZWN0aW9ucy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFwic3RyaW5nXCIgaGFzIHRoZSBmb3JtIFwiaG9zdFwiIG9yIFwiaG9zdDpwb3J0XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUgb25jZSBhdCBzdGFydHVwLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGNvbW1hcyBmb3IgYSBsaXN0IG9mIGhvc3QncyBhbmQgaG9zdDpwb3J0J3MuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFLmcuIC1jb25uZWN0IGhvc3QxLGhvc3QyIG9yIGhvc3QxOjAsaG9zdDI6NTY3OC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0byByZXZlcnNlIGNvbm5lY3QgdG8gbXVsdGlwbGUgaG9zdHMgYXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzYW1lIHRpbWUgeW91IHdpbGwgbGlrZWx5IG5lZWQgdG8gYWxzbyBzdXBwbHk6IC1zaGFyZWRcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgbW9zdCB2bmMgc2VydmVycywgeDExdm5jIHdpbGwgcmVxdWlyZSBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCBmb3IgcmV2ZXJzZSBhcyB3ZWxsIGFzIGZvciBmb3J3YXJkIGNvbm5lY3Rpb25zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKHByb3ZpZGVkIHBhc3N3b3JkIGF1dGggaGFzIGJlZW4gZW5hYmxlZCwgLXJmYmF1dGgsIGV0YylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB0byByZXF1aXJlIGEgcGFzc3dvcmQgZm9yIHJldmVyc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHNldCBYMTFWTkNfUkVWRVJTRV9DT05ORUNUSU9OX05PX0FVVEg9MSBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91ciBlbnZpcm9ubWVudCBiZWZvcmUgc3RhcnRpbmcgeDExdm5jLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJzdHJpbmdcIiBjb250YWlucyBcIi9cIiBpdCBpcyBpbnN0ZWFkIGludGVycHJldGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBhIGZpbGUgdG8gcGVyaW9kaWNhbGx5IGNoZWNrIGZvciBuZXcgaG9zdHMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgbGluZSBpcyByZWFkIGFuZCB0aGVuIHRoZSBmaWxlIGlzIHRydW5jYXRlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJlIGNhcmVmdWwgYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZmlsZSBpZiB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHJ1bm5pbmcgYXMgcm9vdCAoZS5nLiB2aWEgZ2RtKDEpLCBldGMpLlxuIgotIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZXIgbW9kZTogU29tZSBzZXJ2aWNlcyBwcm92aWRlIGFuIGludGVybWVkaWF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJ2bmMgcmVwZWF0ZXJcIjogaHR0cDovL3d3dy51dm5jLmNvbS9hZGRvbnMvcmVwZWF0ZXIuaHRtbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBhbHNvIGh0dHA6Ly9rb3RpLm1ibmV0LmZpL2p0a28vIGZvciBsaW51eCBwb3J0KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhY3RzIGFzIGEgcHJveHkvZ2F0ZXdheS4gIE1vZGVzIGxpa2UgdGhlc2UgcmVxdWlyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5pdGlhbCBzdHJpbmcgdG8gYmUgc2VudCBmb3IgdGhlIHJldmVyc2UgY29ubmVjdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBWTkMgcHJvdG9jb2wgaXMgc3RhcnRlZC4gIEhlcmUgYXJlIHRoZSB3YXlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBkbyB0aGlzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCBwcmU9c29tZV9zdHJpbmcraG9zdDpwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHByZTEyOD1zb21lX3N0cmluZytob3N0OnBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcmVwZWF0ZXI9SUQ6MTIzNCtob3N0OnBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcmVwZWF0ZXI9MjMuNDUuNjcuODk6OjU1MDEraG9zdDpwb3J0XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTU1ZOQyBub3RhdGlvbiBpcyBhbHNvIHN1cHBvcnRlZDpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6MTIzNFxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQXMgd2l0aCBub3JtYWwgLWNvbm5lY3QgdXNhZ2UsIGlmIHRoZSByZXBlYXRlciBwb3J0IGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcGxpZWQgNTUwMCBpcyBhc3N1bWVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2ljIGlkZWEgaXMgYmV0d2VlbiB0aGUgc3BlY2lhbCB0YWcsIGUuZy4gXCJwcmU9XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBcIitcIiBpcyB0aGUgcHJlLXN0cmluZyB0byBiZSBzZW50LiAgTm90ZSB0aGF0IGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNhc2UgaG9zdDpwb3J0IGlzIHRoZSByZXBlYXRlciBzZXJ2ZXIsIE5PVCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZuYyB2aWV3ZXIuICBTb21laG93IHRoZSBwcmUtc3RyaW5nIHRlbGxzIHRoZSByZXBlYXRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIGhvdyB0byBmaW5kIHRoZSB2bmMgdmlld2VyIGFuZCBjb25uZWN0IHlvdSB0byBpdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIHByZT1zb21lX3N0cmluZytob3N0OnBvcnQsIFwic29tZV9zdHJpbmdcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgc2ltcGx5IHNlbnQuIEluIHRoZSBjYXNlIHByZU5OTj1zb21lX3N0cmluZytob3N0OnBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic29tZV9zdHJpbmdcIiBpcyBzZW50IGluIGEgbnVsbCBwYWRkZWQgYnVmZmVyIG9mXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggTk5OLiAgcmVwZWF0ZXI9IGlzIHRoZSBzYW1lIGFzIHByZTI1MD0sIHRoaXMgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1bHRyYXZuYyByZXBlYXRlciBidWZmZXIgc2l6ZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MgbGlrZSBcIlxcblwiIGFuZCBcIlxcclwiLCBldGMuIGFyZSBleHBhbmRlZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZSBhbmQgY2FycmlhZ2UgcmV0dXJuLiAgXCJcXGNcIiBpcyBleHBhbmRlZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCIsXCIgc2luY2UgdGhlIGNvbm5lY3Qgc3RyaW5nIGlzIGNvbW1hIHNlcGFyYXRlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIHRoZSAtcHJveHkgb3B0aW9uIGJlbG93IGZvciBhZGRpdGlvbmFsIHdheXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHBsdW1iIHJldmVyc2UgY29ubmVjdGlvbnMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlIFNTTDogdXNpbmcgLWNvbm5lY3QgaW4gLXNzbCBtb2RlIG1ha2VzIHgxMXZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWN0IGFzIGFuIFNTTCBjbGllbnQgKGluaXRpYXRlcyBTU0wgY29ubmVjdGlvbikgcmF0aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGFuIFNTTCBzZXJ2ZXIuICBUaGUgaWRlYSBpcyB4MTF2bmMgbWlnaHQgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gc3R1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUgd2l0aCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlciBpbiBsaXN0ZW5pbmcgbW9kZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwgdXNlIC1lbnYgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXaXRoIHRoaXMgdGhlIHZpZXdlciBzaWRlIGNhbiBhY3QgYXMgdGhlIFNTTCBjbGllbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIGl0IG5vcm1hbGx5IGRvZXMgZm9yIGZvcndhcmQgY29ubmVjdGlvbnMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlIFNTTCBSZXBlYXRlciBtb2RlOiAgVGhpcyB3aWxsIHdvcmssIGJ1dCBub3RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlmIHRoZSBWTkMgQ2xpZW50IGRvZXMgYW55IHNvcnQgb2YgYSAnRmV0Y2ggQ2VydCdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBiZWZvcmUgY29ubmVjdGluZywgdGhlbiB0aGUgUmVwZWF0ZXIgd2lsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGlrZWx5IGRyb3AgdGhlIGNvbm5lY3Rpb24gYW5kIGJvdGggc2lkZXMgd2lsbCBuZWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byByZXN0YXJ0LiAgQ29uc2lkZXIgdGhlIHVzZSBvZiAtY29ubmVjdF9vcl9leGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWxvb3AzMDAsMiB0byBoYXZlIHgxMXZuYyByZWNvbm5lY3Qgb25jZSB0byB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVyIGFmdGVyIHRoZSBmZXRjaC4gIFlvdSB3aWxsIHByb2JhYmx5IGFsc28gd2FudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcGx5IC1zc2xvbmx5IHRvIGF2b2lkIHgxMXZuYyB0aGlua2luZyB0aGUgZGVsYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHJlc3BvbnNlIG1lYW5zIHRoZSBjb25uZWN0aW9uIGlzIFZlTkNyeXB0LiAgVGhlIGVudlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmFyIFgxMVZOQ19ESVNBQkxFX1NTTF9DTElFTlRfTU9ERT0xIGRpc2N1c3NlZCBhYm92ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWF5IGFsc28gYmUgdXNlZnVsIChpLmUuIHRoZSB2aWV3ZXIgY2FuIGRvIGEgZm9yd2FyZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhcyBpdCBub3JtYWxseSBkb2VzLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgdGhlIC1jb25uZWN0IG9wdGlvbiBzaG91bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gSVB2NiBob3N0cyBwcm9wZXJseS4gIElmIHRoZXJlIGFyZSBwcm9ibGVtc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBkaXNhYmxlIElQdjYgYnkgc2V0dGluZyAtRFgxMVZOQ19JUFY2PTBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIENQUEZMQUdTIHdoZW4gY29uZmlndXJpbmcuICBJZiB0aGVyZSBwcm9ibGVtc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBJUHY2IGhvc3RzIGNvbnNpZGVyIGEgcmVsYXkgbGlrZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluZXQ2dG80IHNjcmlwdCBvciB0aGUgLXByb3h5IG9wdGlvbi5cbiIKLSJcbiIKLSItY29ubmVjdF9vcl9leGl0IHN0ciAgIEFzIHdpdGggLWNvbm5lY3QsIGV4Y2VwdCBpZiBub25lIG9mIHRoZSByZXZlcnNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBzdWNjZWVkLCB0aGVuIHgxMXZuYyBzaHV0cyBkb3duIGltbWVkaWF0ZWx5XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbiBlYXNpZXIgdG8gdHlwZSBhbGlhcyBmb3IgdGhpcyBvcHRpb24gaXMgJy1jb2UnXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBCeSB0aGUgd2F5LCBpZiB5b3UgZG8gbm90IHdhbnQgeDExdm5jIHRvIGxpc3RlbiBvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQU5ZIGludGVyZmFjZSB1c2UgLXJmYnBvcnQgMCAgd2hpY2ggaXMgaGFuZHkgZm9yIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3Rfb3JfZXhpdCBtb2RlLlxuIgotIlxuIgotIi1wcm94eSBzdHJpbmcgICAgICAgICAgVXNlIHByb3h5IGluIHN0cmluZyAoZS5nLiBob3N0OnBvcnQpIGFzIGEgcHJveHkgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWtpbmcgcmV2ZXJzZSBjb25uZWN0aW9ucyAoLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXZWIgcHJveGllcyBhcmUgc3VwcG9ydGVkLCBidXQgbm90ZSBieSBkZWZhdWx0IG1vc3Qgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW0gb25seSBzdXBwb3J0IGRlc3RpbmF0aW9uIGNvbm5lY3Rpb25zIHRvIHBvcnRzIDQ0M1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgNTYzLCBzbyB0aGlzIG1pZ2h0IG5vdCBiZSB2ZXJ5IHVzZWZ1bCAodGhlIHZpZXdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd291bGQgbmVlZCB0byBsaXN0ZW4gb24gdGhhdCBwb3J0IG9yIHRoZSByb3V0ZXIgd291bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gZG8gYSBwb3J0IHJlZGlyZWN0aW9uKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEEgd2ViIHByb3h5IG1heSBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIFwiaG9zdDpwb3J0XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIFwiaHR0cDovL2hvc3Q6cG9ydFwiICh0aGUgcG9ydCBpcyByZXF1aXJlZCBldmVuIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB0aGUgY29tbW9uIGNob2ljZXMgODAgb3IgODA4MClcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tTNCwgU09DS1M0YSwgYW5kIFNPQ0tTNSBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTT0NLUyBwcm94aWVzIG5vcm1hbGx5IGRvIG5vdCBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBvcnQgbnVtYmVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgZm9ybWF0IGxpa2UgdGhpczogc29ja3M6Ly9ob3N0OnBvcnQgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvY2tzNTovL2hvc3Q6cG9ydC4gIE5vdGUgdGhhdCBzc2ggLUQgZG9lcyBub3Qgc3VwcG9ydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU09DS1M0YSwgc28gdXNlIHNvY2tzNTovLy4gIEZvciBzb2NrczovLyBTT0NLUzQgaXMgdXNlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb24gYSBudW1lcmljYWwgSVAgYW5kIFwibG9jYWxob3N0XCIsIG90aGVyd2lzZSBTT0NLUzRhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIChhbmQgc28gdGhlIHByb3h5IHRyaWVzIHRvIGRvIHRoZSBETlMgbG9va3VwKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFuIGV4cGVyaW1lbnRhbCBtb2RlIGlzIFwiLXByb3h5IGh0dHA6Ly9ob3N0OnBvcnQvLi4uXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhlIFwiL1wiIGFmdGVyIHRoZSBwb3J0IHRoYXQgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIG5vcm1hbCB3ZWIgcHJveHkuICBUaGUgcG9ydCBtdXN0IGJlIHN1cHBsaWVkIGV2ZW4gaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHRoZSBkZWZhdWx0IDgwLiAgRm9yIHRoaXMgbW9kZSBhIEdFVCBpcyBkb25lIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3VwcGxpZWQgVVJMIHdpdGggdGhlIHN0cmluZyBob3N0PUgmcG9ydD1QIGFwcGVuZGVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSCBhbmQgUCB3aWxsIGJlIHRoZSAtY29ubmVjdCByZXZlcnNlIGNvbm5lY3QgaG9zdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHBvcnQuICBVc2UgdGhlIHN0cmluZyBcIl9fRU5EX19cIiB0byBkaXNhYmxlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kaW5nLiAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0aGF0IG1heWJlIHNvbWUgY2dpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgcHJvdmlkZXMgdGhlIGFjdHVhbCB2aWV3ZXIgaG9va3VwIGFuZCB0dW5uZWxsaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGFjdHVhbGx5IGFjaGlldmUgdGhpcyB3aXRoaW4gY2dpLCBwaHAsIGV0Yy4gaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjbGVhci4uLiAgQSBjdXN0b20gd2ViIHNlcnZlciBvciBhcGFjaGUgbW9kdWxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBzdHJhaWdodC1mb3J3YXJkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBleHBlcmltZW50YWwgbW9kZSBpcyBcIi1wcm94eSBzc2g6Ly91c2VyQGhvc3RcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSBhIFNTSCB0dW5uZWwgaXMgdXNlZCBmb3IgdGhlIHByb3h5aW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJ1c2VyQFwiIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHlvdXIgdW5peCB1c2VybmFtZSBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IG9uIFwiaG9zdFwiLiAgRm9yIGEgbm9uLXN0YW5kYXJkIFNTSCBwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2Ugc3NoOi8vdXNlckBob3N0OnBvcnQuICBJZiBwcm94aWVzIGFyZSBjaGFpbmVkIChzZWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5leHQgcGFyYWdyYXBoKSB0aGVuIHRoZSBzc2ggb25lIG11c3QgYmUgdGhlIGZpcnN0IG9uZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHNzaC1hZ2VudCBpcyBub3QgYWN0aXZlLCB0aGVuIHRoZSBzc2ggcGFzc3dvcmQgbmVlZHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGVudGVyZWQgaW4gdGhlIHRlcm1pbmFsIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IGxvY2FsaG9zdDowIC1wcm94eSBzc2g6Ly9tZUBmcmllbmRzLXBjOjIyMjJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3Qgc25vb3B5OjAgLXByb3h5IHNzaDovL3NzaC5jb21wYW55LmNvbVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgcHJveGllcyBtYXkgYmUgY2hhaW5lZCB0b2dldGhlciBpbiBjYXNlIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gcmljb2NoZXQgb2ZmIG9mIGEgbnVtYmVyIG9mIGhvc3RzIHRvIGZpbmFsbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoIHRoZSBWTkMgdmlld2VyLiAgVXAgdG8gMyBtYXkgYmUgY2hhaW5lZCwgc2VwYXJhdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW0gYnkgY29tbWFzIGluIHRoZSBvcmRlciB0aGV5IGFyZSB0byBiZSBjb25uZWN0ZWQgdG8uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFLmcuOiAgaHR0cDovL2hvc3QxOnBvcnQxLHNvY2tzNTovL2hvc3QyOnBvcnQyIG9yIHRocmVlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaWtlOiAgZmlyc3Qsc2Vjb25kLHRoaXJkXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJUHY2OiBhcyBvZiB4MTF2bmMgMC45LjEwIHRoZSAtcHJveHkgb3B0aW9uIHNob3VsZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byBJUHY2IGhvc3RzIHByb3Blcmx5LiAgSWYgdGhlcmUgYXJlIHByb2JsZW1zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGRpc2FibGUgSVB2NiBieSBzZXR0aW5nIC1EWDExVk5DX0lQVjY9MFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gQ1BQRkxBR1Mgd2hlbiBjb25maWd1cmluZy4gIElmIHRoZXJlIHByb2JsZW1zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nIHRvIElQdjYgaG9zdHMgY29uc2lkZXIgYSByZWxheSBsaWtlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW5ldDZ0bzQgc2NyaXB0LlxuIgotIlxuIgotIi12bmNjb25uZWN0ICAgICAgICAgICAgTW9uaXRvciB0aGUgVk5DX0NPTk5FQ1QgWCBwcm9wZXJ0eSBzZXQgYnkgdGhlIHN0YW5kYXJkXG4iCi0iLW5vdm5jY29ubmVjdCAgICAgICAgICBWTkMgcHJvZ3JhbSB2bmNjb25uZWN0KDEpLiAgV2hlbiB0aGUgcHJvcGVydHkgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBcImhvc3RcIiBvciBcImhvc3Q6cG9ydFwiIGVzdGFibGlzaCBhIHJldmVyc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICBVc2luZyB4cHJvcCgxKSBpbnN0ZWFkIG9mIHZuY2Nvbm5lY3QgbWF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3JrIChzZWUgdGhlIEZBUSkuICBUaGUgLXJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSB1c2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfUkVNT1RFIGNoYW5uZWwsIGFuZCB0aGlzIG9wdGlvbiBkaXNhYmxlcy9lbmFibGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBhcyB3ZWxsLiAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIHVzZSBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZXNlIFgxMSBwcm9wZXJ0aWVzIChlLmcuIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgZm9yIG11bHRpcGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMncyBvbiB0aGUgc2FtZSBkaXNwbGF5KSBzZXQgdGhlIFZOQ19DT05ORUNUIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfUkVNT1RFIGVudi4gdmFycy4gdG8gdGhlIHN0cmluZyB5b3Ugd2FudCwgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiAtZW52IFgxMVZOQ19SRU1PVEU9WDExVk5DX1JFTU9URV8xMjM0NVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBzaWRlcyBvZiB0aGUgY2hhbm5lbCBtdXN0IHVzZSB0aGUgc2FtZSB1bmlxdWUgbmFtZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzYW1lIGNhbiBiZSBkb25lIGZvciB0aGUgaW50ZXJuYWwgWDExVk5DX1RJQ0tFUlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgKGhlYXJ0YmVhdCBhbmQgdGltZXN0YW1wKSBpZiBkZXNpcmVkLlxuIgotIlxuIgotIi1hbGxvdyBob3N0MVssaG9zdDIuLl0gT25seSBhbGxvdyBjbGllbnQgY29ubmVjdGlvbnMgZnJvbSBob3N0cyBtYXRjaGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGhvc3RuYW1lcyBvciBJUCBhZGRyZXNzZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDYW4gYWxzbyBiZSBhIG51bWVyaWNhbCBJUCBwcmVmaXgsIGUuZy4gXCIxOTIuMTY4LjEwMC5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gbWF0Y2ggYSBzaW1wbGUgc3VibmV0LCBmb3IgbW9yZSBjb250cm9sIGJ1aWxkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgd2l0aCBsaWJ3cmFwIHN1cHBvcnQgKFNlZSB0aGUgRkFRKS4gIElmIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBjb250YWlucyBhIFwiL1wiIGl0IGluc3RlYWQgaXMgYSBpbnRlcnByZXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBmaWxlIGNvbnRhaW5pbmcgYWRkcmVzc2VzIG9yIHByZWZpeGVzIHRoYXQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlLXJlYWQgZWFjaCB0aW1lIGEgbmV3IGNsaWVudCBjb25uZWN0cy4gIExpbmVzIGNhbiBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudGVkIG91dCB3aXRoIHRoZSBcIiNcIiBjaGFyYWN0ZXIgaW4gdGhlIHVzdWFsIHdheS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1hbGxvdyBhcHBsaWVzIGluIC1zc2wgbW9kZSwgYnV0IG5vdCBpbiAtc3R1bm5lbCBtb2RlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSVB2NjogYXMgb2YgeDExdm5jIDAuOS4xMCBhIGhvc3QgY2FuIGJlIHNwZWNpZmllZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gSVB2NiBudW1lcmljYWwgZm9ybWF0LCBlLmcuIDIwMDE6NDg2MDpiMDA5Ojo5My5cbiIKLSJcbiIKLSItbG9jYWxob3N0ICAgICAgICAgICAgIEJhc2ljYWxseSB0aGUgc2FtZSBhcyBcIi1hbGxvdyAxMjcuMC4wLjFcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGlmIHlvdSB3YW50IHRvIHJlc3RyaWN0IHdoaWNoIG5ldHdvcmsgaW50ZXJmYWNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgbGlzdGVucyBvbiwgc2VlIHRoZSAtbGlzdGVuIG9wdGlvbiBiZWxvdy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEUuZy4gXCItbGlzdGVuIGxvY2FsaG9zdFwiIG9yIFwiLWxpc3RlbiAxOTIuMTY4LjMuMjFcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgb3B0aW9uIFwiLWxvY2FsaG9zdFwiIGltcGxpZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWxpc3RlbiBsb2NhbGhvc3RcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEEgcmFyZSBjYXNlLCBidXQgZm9yIG5vbi1sb2NhbGhvc3QgLWxpc3RlbiB1c2FnZSwgaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHlvdSB1c2UgdGhlIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSAoLVIpIHRvIGNoYW5nZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1saXN0ZW4gaW50ZXJmYWNlIHlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtYWxsb3cgbGlzdCAoYW5kIHZpY2UgdmVyc2EpIHRvIGF2b2lkIHNpdHVhdGlvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG5vIGNvbm5lY3Rpb25zIChvciB0b28gbWFueSkgYXJlIGFsbG93ZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHdhbnQgeDExdm5jIHRvIGxpc3RlbiBvbiBBTlkgaW50ZXJmYWNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZXZpZGVudGx5IHlvdSBhcmUgdXNpbmcgLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIHBsYW4gdG8gdXNlIHJlbW90ZSBjb250cm9sOiAtUiBjb25uZWN0Omhvc3QpLCB1c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1yZmJwb3J0IDBcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGlmIElQdjYgaXMgc3VwcG9ydGVkLCB0aGlzIG9wdGlvbiBhdXRvbWF0aWNhbGx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHRoZSBJUHY2IGxvb3BiYWNrIGFkZHJlc3MgJzo6MScgYXMgd2VsbC5cbiIKLSJcbiIKLSItdW5peHNvY2sgc3RyICAgICAgICAgIExpc3RlbiBvbiB0aGUgdW5peCBzb2NrZXQgKEFGX1VOSVgpICdzdHInXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29ubmVjdGlvbnMuICBUaGlzIG1vZGUgaXMgZm9yIGVpdGhlciBsb2NhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgb3IgYSB0dW5uZWwgZW5kcG9pbnQgd2hlcmUgb25lIHdhbnRzIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBwZXJtaXNzaW9uIG9mIHRoZSB1bml4IHNvY2tldCBmaWxlIHRvIGRldGVybWluZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBjYW4gY29ubmVjdCB0byBpdC4gIChUaGlzIGN1cnJlbnRseSByZXF1aXJlcyBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZWRpdCB0byBsaWJ2bnNlcnZlci9yZmJzZXJ2ZXIuYzogY29tbWVudCBvdXQgbGluZXMgMzEwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgMzExLCAnY2xvc2Uoc29jayknIGFuZCAncmV0dXJuIE5VTEwnIGluIHJmYnNlcnZlci5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgc2V0c29ja29wdCgpIGNhbGwuKSBOb3RlIHRoYXQgdG8gZGlzYWJsZSBhbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRjcCBsaXN0ZW5pbmcgcG9ydHMgc3BlY2lmeSAnLXJmYnBvcnQgMCcgYW5kIHNob3VsZCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIHdpdGggdGhpcyBtb2RlLiAgRXhhbXBsZTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICBta2RpciB+L3M7IGNobW9kIDcwMCB+L3M7XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC11bml4c29jayB+L3MvbXlzb2NrIC1yZmJwb3J0IDAgLi4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgU1NWTkMgdW5peCB2bmN2aWV3ZXIgY2FuIGNvbm5lY3QgdG8gdW5peCBzb2NrZXRzLlxuIgotIlxuIgotI2lmIFgxMVZOQ19JUFY2Ci0iLWxpc3RlbjYgc3RyICAgICAgICAgICBXaGVuIGluIElQdjYgbGlzdGVuIG1vZGUgXCItNlwiLCBsaXN0ZW4gb25seSBvbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggYWRkcmVzcyBcInN0clwiLiAgSXQgYWxzbyB3b3Jrc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmsgc2NvcGUgYWRkcmVzc2VzIChmZTgwOjoyMTk6ZGJmZjpmZWU1OjNmOTIlJWV0aDApXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgSVB2NiBob3N0bmFtZSBzdHJpbmdzIChlLmcuIGlwdjYuZ29vZ2xlLmNvbS4pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgTGliVk5DU2VydmVyIC1saXN0ZW4gb3B0aW9uIGZvciB0aGUgSVB2NCBpbnRlcmZhY2UuXG4iCi0iXG4iCi0jZW5kaWYKLSItbm9sb29rdXAgICAgICAgICAgICAgIERvIG5vdCB1c2UgZ2V0aG9zdGJ5bmFtZSgpIG9yIGdldGhvc3RieWFkZHIoKSB0byBsb29rIHVwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBob3N0IG5hbWVzIG9yIElQIG51bWJlcnMuICBVc2UgdGhpcyBpZiBuYW1lIHJlc29sdXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY29ycmVjdGx5IHNldCB1cCBhbmQgbGVhZHMgdG8gbG9uZyBwYXVzZXMgYXMgbmFtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwcyB0aW1lIG91dCwgZXRjLlxuIgotIlxuIgotIi1pbnB1dCBzdHJpbmcgICAgICAgICAgRmluZSB0dW5pbmcgb2YgYWxsb3dlZCB1c2VyIGlucHV0LiAgSWYgXCJzdHJpbmdcIiBkb2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgY29udGFpbiBhIGNvbW1hIFwiLFwiIHRoZSB0dW5pbmcgYXBwbGllcyBvbmx5IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgY2xpZW50cy4gIE90aGVyd2lzZSB0aGUgcGFydCBiZWZvcmUgXCIsXCIgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBub3JtYWwgY2xpZW50cyBhbmQgdGhlIHBhcnQgYWZ0ZXIgZm9yIHZpZXctb25seVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy4gIFwiS1wiIGlzIGZvciBLZXlzdHJva2UgaW5wdXQsIFwiTVwiIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTW91c2UtbW90aW9uIGlucHV0LCBcIkJcIiBmb3IgQnV0dG9uLWNsaWNrIGlucHV0LCBcIkNcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgZm9yIENsaXBib2FyZCBpbnB1dCwgYW5kIFwiRlwiIGlzIGZvciBGaWxlIHRyYW5zZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodWx0cmF2bmMgb25seSkuICBUaGVpciBwcmVzZW5jZSBpbiB0aGUgc3RyaW5nIGVuYWJsZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdHlwZSBvZiBpbnB1dC4gIEUuZy4gXCItaW5wdXQgTVwiIG1lYW5zIG5vcm1hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlcnMgY2FuIG9ubHkgbW92ZSB0aGUgbW91c2UgYW5kICBcIi1pbnB1dCBLTUJDRixNXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxldHMgbm9ybWFsIHVzZXJzIGRvIGFueXRoaW5nIGFuZCBlbmFibGVzIHZpZXctb25seVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlcnMgdG8gbW92ZSB0aGUgbW91c2UuICBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgZ2xvYmFsIC12aWV3b25seSBpcyBpbiBlZmZlY3QgKGFsbCBpbnB1dCBpcyBkaXNjYXJkZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHRoYXQgY2FzZSkuXG4iCi0iXG4iCi0iLWdyYWJrYmQgICAgICAgICAgICAgICBXaGVuIFZOQyB2aWV3ZXJzIGFyZSBjb25uZWN0ZWQsIGF0dGVtcHQgdG8gdGhlIGdyYWJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXlib2FyZCBzbyBhIChub24tbWFsaWNpb3VzKSB1c2VyIHNpdHRpbmcgYXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBkaXNwbGF5IGlzIG5vdCBhYmxlIHRvIGVudGVyIGtleXN0cm9rZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCB1c2VzIFhHcmFiS2V5Ym9hcmQoM1gxMSkgYW5kIHNvIGl0IGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VjdXJlIGFuZCBkb2VzIG5vdCBydWxlIG91dCB0aGUgcGVyc29uIGF0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgZGlzcGxheSBpbmplY3Rpbmcga2V5c3Ryb2tlcyBieSBmbG9vZGluZyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB3aXRoIHRoZW0sIGdyYWJiaW5nIHRoZSBrZXlib2FyZCBoaW1zZWxmLCBldGMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTb21lIGRlZ3JlZSBvZiBjb29wZXJhdGlvbiBmcm9tIHRoZSBwZXJzb24gYXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IGlzIGFzc3VtZWQuICBUaGlzIGlzIGludGVuZGVkIGZvciByZW1vdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhlbHAtZGVzayBvciBlZHVjYXRpb25hbCB1c2FnZSBtb2Rlcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IG9uIHNvbWUgcmVjZW50ICgxMi8yMDEwKSBYIHNlcnZlcnMgYW5kL29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZXNrdG9wcywgLWdyYWJrYmQgbm8gbG9uZ2VyIHdvcmtzOiBpdCBwcmV2ZW50cyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBtYW5hZ2VyIGZyb20gcmVzaXppbmcgd2luZG93cyBhbmQgc2ltaWxhciB0aGluZ3MuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUcnkgLXVuZ3JhYmJvdGggYmVsb3cgKG1pZ2h0IG5vdCB3b3JrLilcbiIKLSJcbiIKLSItZ3JhYnB0ciAgICAgICAgICAgICAgIEFzIC1ncmFia2JkLCBidXQgZm9yIHRoZSBtb3VzZSBwb2ludGVyIHVzaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYR3JhYlBvaW50ZXIoM1gxMSkuICBVbmZvcnR1bmF0ZWx5IGR1ZSB0byB0aGUgd2F5IHRoZSBYXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgd29ya3MsIHRoZSBtb3VzZSBjYW4gc3RpbGwgYmUgbW92ZWQgYXJvdW5kIGJ5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSwgYnV0IGhlIHdpbGwgbm90IGJlIGFibGUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSB3aW5kb3cgZm9jdXMgd2l0aCBpdC4gIEFsc28gc29tZSB3aW5kb3cgbWFuYWdlcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FsbCBYR3JhYlNlcnZlcigzWDExKSBmb3IgcmVzaXplcywgZXRjLCB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhY3Qgb24gdGhlIGxvY2FsIHVzZXIncyBpbnB1dC4gIEFnYWluLCBzb21lIGRlZ3JlZSBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpb24gZnJvbSB0aGUgcGVyc29uIGF0IHRoZSBkaXNwbGF5IGlzIGFzc3VtZWQuXG4iCi0iXG4iCi0iLXVuZ3JhYmJvdGggICAgICAgICAgICBXaGVuZXZlciB0aGVyZSBpcyBhbnkgaW5wdXQgKGVpdGhlciBrZXlib2FyZCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciksIHVuZ3JhYiAqYm90aCogdGhlIGtleWJvYXJkIGFuZCB0aGUgcG9pbnRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgaW5qZWN0aW5nIHRoZSBzeW50aGV0aWMgaW5wdXQuICBUaGlzIGlzIHRvIGFsbG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlcnMsIGV0Yy4gYSBjaGFuY2UgdG8gZ3JhYi5cbiIKLSJcbiIKLSItZ3JhYmFsd2F5cyAgICAgICAgICAgIEFwcGx5IGJvdGggLWdyYWJrYmQgYW5kIC1ncmFicHRyIGV2ZW4gd2hlbiBubyBWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMgYXJlIGNvbm5lY3RlZC4gIElmIHlvdSBvbmx5IHdhbnQgb25lIG9mIHRoZW0sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIC1SIHJlbW90ZSBjb250cm9sIHRvIHR1cm4gdGhlIG90aGVyIGJhY2sgb24sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIC1SIG5vZ3JhYnB0ci5cbiIKLSJcbiIKLSNpZmRlZiBFTkFCTEVfR1JBQkxPQ0FMCi0iLWdyYWJsb2NhbCBuICAgICAgICAgICBJZiBpdCBhcHBlYXJzIHRoYXQgYSB1c2VyIHNpdHRpbmcgYXQgdGhlIHBoeXNpY2FsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IGhhcyBpbmplY3RlZCBhIGtleXN0cm9rZSBvciBtb3VzZSBldmVudCBpZ25vcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFueSBWTkMgY2xpZW50IGlucHV0cyBmb3IgdGhlIG5leHQgbiBzZWNvbmRzLiAgVGhlIGlkZWFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoYXQgZHVyaW5nIGEgZGVtb25zdHJhdGlvbiwgZXRjLCB0aGUgbG9jYWwgdXNlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdmlld2VycyBhY2NpZGVudGFsbHkgbW92aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW91c2UsIGV0Yy4gIFRoZSBkZXRlY3Rpb24gb2YgbG9jYWwgdXNlciBpbnB1dCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94aW1hdGUgYW5kIHNvIGF0IHRpbWVzIGdpdmVzIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiIKLSJcbiIKLSNlbmRpZgotIi12aWV3cGFzc3dkIHN0cmluZyAgICAgU3VwcGx5IGEgMm5kIHBhc3N3b3JkIGZvciB2aWV3LW9ubHkgbG9naW5zLiAgVGhlIC1wYXNzd2RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChmdWxsLWFjY2VzcykgcGFzc3dvcmQgbXVzdCBhbHNvIGJlIHN1cHBsaWVkLlxuIgotIlxuIgotIi1wYXNzd2RmaWxlIGZpbGVuYW1lICAgU3BlY2lmeSB0aGUgTGliVk5DU2VydmVyIHBhc3N3b3JkIHZpYSB0aGUgZmlyc3QgbGluZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUgXCJmaWxlbmFtZVwiIChpbnN0ZWFkIG9mIHZpYSAtcGFzc3dkIG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIG90aGVycyBtaWdodCBzZWUgaXQgdmlhIHBzKDEpKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgZGVzY3JpcHRpb25zIGJlbG93IGZvciBob3cgdG8gc3VwcGx5IG11bHRpcGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZHMsIHZpZXctb25seSBwYXNzd29yZHMsIHRvIHNwZWNpZnkgZXh0ZXJuYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1zIGZvciB0aGUgYXV0aGVudGljYXRpb24sIGFuZCBvdGhlciBmZWF0dXJlcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlbmFtZSBpcyBwcmVmaXhlZCB3aXRoIFwicm06XCIgaXQgd2lsbCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBhZnRlciBiZWluZyByZWFkLiAgUGVyaGFwcyB0aGlzIGlzIHVzZWZ1bCBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRpbmcgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBmaWxlLiAgSW4gZ2VuZXJhbCwgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCBmaWxlIHNob3VsZCBub3QgYmUgcmVhZGFibGUgYnkgdW50cnVzdGVkIHVzZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoQlRXOiBuZWl0aGVyIHNob3VsZCB0aGUgVk5DIC1yZmJhdXRoIGZpbGU6IGl0IGlzIE5PVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkLCBvbmx5IG9ic2N1cmVkIHdpdGggYSBmaXhlZCBrZXkpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpbGVuYW1lIGlzIHByZWZpeGVkIHdpdGggXCJyZWFkOlwiIGl0IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSBiZSBjaGVja2VkIGZvciBjaGFuZ2VzIGFuZCByZXJlYWQuICBJdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSByZXJlYWQganVzdCB3aGVuIGEgbmV3IGNsaWVudCBjb25uZWN0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgbGF0ZXN0IHBhc3N3b3JkcyB3aWxsIGJlIHVzZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBcImZpbGVuYW1lXCIgaXMgcHJlZml4ZWQgd2l0aCBcImNtZDpcIiB0aGVuIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFmdGVyIHRoZSBcIjpcIiBpcyBydW4gYXMgYW4gZXh0ZXJuYWwgY29tbWFuZDpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBpZiBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2VyZSByZWFkIGZyb20gYSBwYXNzd29yZCBmaWxlIChzZWUgYmVsb3cpLiAgSWYgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGRvZXMgbm90IGV4aXQgd2l0aCAwLCB0aGVuIHgxMXZuYyB0ZXJtaW5hdGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGVseS4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIDEwMDAgcGFzc3dvcmRzIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdheSBzZXQgWDExVk5DX01BWF9QQVNTV0RTIGJlZm9yZSBzdGFydGluZyB4MTF2bmMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gLWFjY2VwdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBkdWUgdG8gdGhlIFZOQyBwcm90b2NvbCBvbmx5IHRoZSBmaXJzdCA4XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIGEgcGFzc3dvcmQgYXJlIHVzZWQgKERFUyBrZXkpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJmaWxlbmFtZVwiIGlzIHByZWZpeGVkIHdpdGggXCJjdXN0b206XCIgdGhlbiBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gcGFzc3dvcmQgY2hlY2tlciBpcyBzdXBwbGllZCBhcyBhbiBleHRlcm5hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmb2xsb3dpbmcgdGhlIFwiOlwiLiBUaGUgY29tbWFuZCB3aWxsIGJlIHJ1blxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhIGNsaWVudCBhdXRoZW50aWNhdGVzLiAgSWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkLCBvdGhlcndpc2UgaXQgaXMgcmVqZWN0ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gLWFjY2VwdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdGFuZGFyZCBpbnB1dCB0byB0aGUgY3VzdG9tIGNvbW1hbmQgd2lsbCBiZSBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsIGRpZ2l0IFwibGVuXCIgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLiBcImxlblwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGNoYWxsZW5nZSBzaXplIGFuZCBpcyB1c3VhbGx5IDE2ICh0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFZOQyBzcGVjKS4gIFRoZW4gZm9sbG93cyBsZW4gYnl0ZXMgd2hpY2ggaXMgdGhlIHJhbmRvbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlIHN0cmluZyB0aGF0IHdhcyBzZW50IHRvIHRoZSBjbGllbnQuIFRoaXMgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZm9sbG93ZWQgYnkgbGVuIG1vcmUgYnl0ZXMgaG9sZGluZyB0aGUgY2xpZW50J3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIChpLmUuIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIGVuY3J5cHRlZCB2aWEgREVTXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSB1c2VyIHBhc3N3b3JkIGluIHRoZSBzdGFuZGFyZCBzaXR1YXRpb24pLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFwiY3VzdG9tOlwiIHNjaGVtZSBjYW4gYmUgdXNlZnVsIHRvIGltcGxlbWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBwYXNzd29yZHMgb3IgdG8gaW1wbGVtZW50IG1ldGhvZHMgd2hlcmUgbG9uZ2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZHMgYW5kL29yIGRpZmZlcmVudCBlbmNyeXB0aW9uIGFsZ29yaXRobXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSB1c2VkLiAgVGhlIGxhdHRlciB3aWxsIHJlcXVpcmUgY3VzdG9taXppbmcgdGhlIFZOQ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IGFzIHdlbGwuICBPbmUgY291bGQgY3JlYXRlIGFuIE1ENVNVTSBiYXNlZCBzY2hlbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmb3JtYXQgZm9yIC1wYXNzd2RmaWxlOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgbXVsdGlwbGUgbm9uLWJsYW5rIGxpbmVzIGV4aXN0IGluIHRoZSBmaWxlIHRoZXkgYXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbGwgdGFrZW4gYXMgdmFsaWQgcGFzc3dvcmRzLiAgQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBQYXNzd29yZCBsaW5lcyBtYXkgYmUgXCJjb21tZW50ZWQgb3V0XCIgKGlnbm9yZWQpIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGV5IGJlZ2luIHdpdGggdGhlIGNoYXJhY3RlciBcIiNcIiBvciB0aGUgbGluZSBjb250YWluc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmluZyBcIl9fU0tJUF9fXCIuICBMaW5lcyBtYXkgYmUgYW5ub3RhdGVkIGJ5IHVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIFwiX19DT01NX19cIiBzdHJpbmc6IGZyb20gaXQgdG8gdGhlIGVuZCBvZiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgaXMgaWdub3JlZC4gIEFuIGVtcHR5IHBhc3N3b3JkIG1heSBiZSBzcGVjaWZpZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpYSB0aGUgXCJfX0VNUFRZX19cIiBzdHJpbmcgb24gYSBsaW5lIGJ5IGl0c2VsZiAobm90ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91ciB2aWV3ZXIgbWlnaHQgbm90IGFjY2VwdCBlbXB0eSBwYXNzd29yZHMpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBcIl9fQkVHSU5fVklFV09OTFlfX1wiIGFwcGVhcnMgb24gYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGluZSBieSBpdHNlbGYsIHRoZSByZW1haW5pbmcgcGFzc3dvcmRzIGFyZSB1c2VkIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgYWNjZXNzLiAgRm9yIGNvbXBhdGliaWxpdHksIGFzIGEgc3BlY2lhbCBjYXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZSBjb250YWlucyBvbmx5IHR3byBwYXNzd29yZCBsaW5lcyB0aGUgMm5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmUgaXMgYXV0b21hdGljYWxseSB0YWtlbiBhcyB0aGUgdmlld29ubHkgcGFzc3dvcmQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgdGhlIFwiX19CRUdJTl9WSUVXT05MWV9fXCIgdG9rZW4gbXVzdCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBoYXZlIHZpZXdvbmx5IHBhc3N3b3Jkcy4gICh0aXA6IG1ha2UgdGhlIDNyZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxhc3QgbGluZSBiZSBcIl9fQkVHSU5fVklFV09OTFlfX1wiIHRvIGhhdmUgMlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1hY2Nlc3MgcGFzc3dvcmRzKVxuIgotIlxuIgotIi1zaG93cmZiYXV0aCBmaWxlbmFtZSAgUHJpbnQgdG8gdGhlIHNjcmVlbiB0aGUgb2JzY3VyZWQgVk5DIHBhc3N3b3JkIGtlcHQgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZmJhdXRoIGZpbGUgXCJmaWxlbmFtZVwiIGFuZCB0aGVuIGV4aXQuXG4iCi0iXG4iCi0iLXVuaXhwdyBbbGlzdF0gICAgICAgICBVc2UgVW5peCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uICB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdXNlIHRoZSBzdSgxKSBwcm9ncmFtIHRvIHZlcmlmeSB0aGUgdXNlcidzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZC4gIFtsaXN0XSBpcyBhbiBvcHRpb25hbCBjb21tYSBzZXBhcmF0ZWQgbGlzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgYWxsb3dlZCBVbml4IHVzZXJuYW1lcy4gIElmIHRoZSBbbGlzdF0gc3RyaW5nIGJlZ2luc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY2hhcmFjdGVyIFwiIVwiIHRoZW4gdGhlIGVudGlyZSBsaXN0IGlzIHRha2VuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBhbiBleGNsdWRlIGxpc3QuICBTZWUgYmVsb3cgZm9yIHBlci11c2VyIG9wdGlvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBIGZhbWlsaWFyIFwibG9naW46XCIgYW5kIFwiUGFzc3dvcmQ6XCIgZGlhbG9nIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgb24gYSBibGFjayBzY3JlZW4gaW5zaWRlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdm5jdmlld2VyLiAgVGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCBpZiB0aGUgdXNlciBmYWlsc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcGx5IHRoZSBjb3JyZWN0IHBhc3N3b3JkIGluIDMgdHJpZXMgb3IgZG9lcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlbmQgb25lIGJlZm9yZSBhIDQ1IHNlY29uZCB0aW1lb3V0LiAgRXhpc3RpbmcgY2xpZW50c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIHZpZXctb25seSBkdXJpbmcgdGhpcyBwZXJpb2QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHJlY2VpdmVkIGlzIFwiRXNjYXBlXCIgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVuaXggdXNlcm5hbWUgd2lsbCBub3QgYmUgZGlzcGxheWVkIGFmdGVyIFwibG9naW46XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIGl0IGlzIHR5cGVkLiAgVGhpcyBjb3VsZCBiZSBvZiB1c2UgZm9yIFZOQyB2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGF1dG9tYXRpY2FsbHkgdHlwZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIGRldGFpbGVkIGJlaGF2aW9yIG9mIHN1KDEpIGNhbiB2YXJ5IGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9TIHRvIE9TIGFuZCBmb3IgbG9jYWwgY29uZmlndXJhdGlvbnMsIHRlc3QgdGhlIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBkZXBsb3ltZW50IHRvIG1ha2Ugc3VyZSBpdCBpcyB3b3JraW5nIHByb3Blcmx5LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHdpbGwgYXR0ZW1wdCB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIHJlamVjdCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb2dpbiBpZiBhbnl0aGluZyBhYm5vcm1hbCBvY2N1cnMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPbmUgY2FzZSB0byBub3RlOiBGcmVlQlNEIGFuZCB0aGUgb3RoZXIgQlNEJ3MgYnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXQgaXMgaW1wb3NzaWJsZSBmb3IgdGhlIHVzZXIgcnVubmluZyB4MTF2bmMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlIGhpcyAqb3duKiBwYXNzd29yZCB2aWEgc3UoMSkgKGNvbW1lbnRpbmcgb3V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFtX3NlbGYuc28gZW50cnkgaW4gL2V0Yy9wYW0uZC9zdSBlbGltaW5hdGVzIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yKS4gIFNvIHRoZSB4MTF2bmMgbG9naW4gd2lsbCBhbHdheXMgKkZBSUwqIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlIChldmVuIHdoZW4gdGhlIGNvcnJlY3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQSBwb3NzaWJsZSB3b3JrYXJvdW5kIGZvciB0aGlzIG9uICpCU0Qgd291bGQgYmUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHgxMXZuYyBhcyByb290IHdpdGggdGhlIFwiLXVzZXJzICtub2JvZHlcIiBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGltbWVkaWF0ZWx5IHN3aXRjaCB0byB1c2VyIG5vYm9keSB3aGVyZSB0aGUgc3UnaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHByb2NlZWQgbm9ybWFsbHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIHNvdXJjZSBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIFBBTSBtb2R1bGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHByb21wdCBmb3IgZXh0cmEgaW5mbywgZS5nLiBwYXNzd29yZCBhZ2luZyBtb2R1bGVzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgbG9naW5zIHdpbGwgZmFpbCBhcyB3ZWxsIGV2ZW4gd2hlbiB0aGUgY29ycmVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgaXMgc3VwcGxpZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAqKklNUE9SVEFOVCoqOiB0byBwcmV2ZW50IHRoZSBVbml4IHBhc3N3b3JkIGJlaW5nIHNlbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluICpjbGVhciB0ZXh0KiBvdmVyIHRoZSBuZXR3b3JrLCBvbmUgb2YgdHdvIHNjaGVtZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZW5mb3JjZWQ6IDEpIHRoZSAtc3NsIGJ1aWx0aW4gU1NMIG1vZGUsIG9yIDIpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlIGJvdGggLWxvY2FsaG9zdCBhbmQgLXN0dW5uZWwgYmUgZW5hYmxlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAxKSBlbnN1cmVzIHRoZSB0cmFmZmljIGlzIGVuY3J5cHRlZCBiZXR3ZWVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIgYW5kIHNlcnZlci4gIEEgUEVNIGZpbGUgd2lsbCBiZSByZXF1aXJlZCwgc2VlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc2lvbiB1bmRlciAtc3NsIGJlbG93ICh1bmRlciBzb21lIGNpcmN1bXN0YW5jZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgdGVtcG9yYXJ5IG9uZSBjYW4gYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIDIpIHJlcXVpcmVzIHRoZSB2aWV3ZXIgY29ubmVjdGlvbiB0byBhcHBlYXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbWUgZnJvbSB0aGUgc2FtZSBtYWNoaW5lIHgxMXZuYyBpcyBydW5uaW5nIG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBmcm9tIGEgc3NoIC1MIHBvcnQgcmVkaXJlY3Rpb24pLiAgQW5kIHRoYXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCBTU0wgbW9kZSBiZSB1c2VkIGZvciBlbmNyeXB0aW9uIG92ZXIgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLiAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiAtc3R1bm5lbCBiZWxvdykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBhcyBhIGNvbnZlbmllbmNlLCBpZiB5b3Ugc3NoKDEpIGluIGFuZCBzdGFydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGl0IHdpbGwgY2hlY2sgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTU0hfQ09OTkVDVElPTiBpcyBzZXQgYW5kIGFwcGVhcnMgcmVhc29uYWJsZS4gIElmIGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb2VzLCB0aGVuIHRoZSAtc3NsIG9yIC1zdHVubmVsIHJlcXVpcmVtZW50IHdpbGwgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQgc2luY2UgaXQgaXMgYXNzdW1lZCB5b3UgYXJlIHVzaW5nIHNzaCBmb3IgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgdHVubmVsbGluZy4gIC1sb2NhbGhvc3QgaXMgc3RpbGwgZW5mb3JjZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgLXNzbCBvciAtc3R1bm5lbCB0byBmb3JjZSBTU0wgdXNhZ2UgZXZlbiBpZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU1NIX0NPTk5FQ1RJT04gaXMgc2V0LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gb3ZlcnJpZGUgdGhlIGFib3ZlIHJlc3RyaWN0aW9ucyB5b3UgY2FuIHNldFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBzdGFydGluZyB4MTF2bmM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgVU5JWFBXX0RJU0FCTEVfU1NMPTEgdG8gZGlzYWJsZSByZXF1aXJpbmcgZWl0aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc3NsIG9yIC1zdHVubmVsIChhcyB1bmRlciBTU0hfQ09OTkVDVElPTi4pICBFdmlkZW50bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIGJlIHVzaW5nIGEgZGlmZmVyZW50IG1ldGhvZCB0byBlbmNyeXB0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBiZXR3ZWVuIHRoZSB2bmN2aWV3ZXIgYW5kIHgxMXZuYzogcGVyaGFwcyBzc2goMSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIElQU0VDIFZQTi4gLWxvY2FsaG9zdCBpcyBzdGlsbCBlbmZvcmNlZCAoaG93ZXZlcixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGguKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2V0IFVOSVhQV19ESVNBQkxFX0xPQ0FMSE9TVD0xIHRvIGRpc2FibGUgdGhlIC1sb2NhbGhvc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50IGluIC11bml4cHcgbW9kZXMuICBPbmUgc2hvdWxkIG5ldmVyIGRvIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGFsbG93IHRoZSBVbml4IHBhc3N3b3JkcyB0byBiZSBzbmlmZmVkIG9uIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay4pICBUaGlzIGFsc28gZGlzYWJsZXMgdGhlIGxvY2FsaG9zdCByZXF1aXJlbWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJldmVyc2UgY29ubmVjdGlvbnMgKHNlZSBiZWxvdy4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdXNlIG9mIC1sb2NhbGhvc3Qgd2l0aCBzc2goMSkgKGFuZCBubyAtdW5peHB3KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcm91Z2hseSB0aGUgc2FtZSBhcyByZXF1aXJpbmcgYSBVbml4IHVzZXIgbG9naW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzaW5jZSBhIFVuaXggcGFzc3dvcmQgb3IgdGhlIHVzZXIncyBwdWJsaWMga2V5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIGJ5IHNzaGQgb24gdGhlIG1hY2hpbmUgd2hlcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBydW5zIGFuZCBvbmx5IGxvY2FsIGNvbm5lY3Rpb25zIGZyb20gdGhhdCBtYWNoaW5lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgYWNjZXB0ZWQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUmVnYXJkaW5nIHJldmVyc2UgY29ubmVjdGlvbnMgKGUuZy4gLVIgY29ubmVjdDpob3N0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgLWNvbm5lY3QgaG9zdCksIHdoZW4gdGhlIC1sb2NhbGhvc3QgY29uc3RyYWludCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gZWZmZWN0IHRoZW4gcmV2ZXJzZSBjb25uZWN0aW9ucyBjYW4gb25seSBiZSB1c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBjb25uZWN0IHRvIHRoZSBzYW1lIG1hY2hpbmUgeDExdm5jIGlzIHJ1bm5pbmcgb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHBvcnQgNTUwMCkuICBQbGVhc2UgdXNlIGEgc3NoIG9yIHN0dW5uZWwgcG9ydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb24gdG8gdGhlIHZpZXdlciBtYWNoaW5lIHRvIHR1bm5lbCB0aGUgcmV2ZXJzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBvdmVyIGFuIGVuY3J5cHRlZCBjaGFubmVsLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gLWluZXRkIG1vZGUgdGhlIE1ldGhvZCAxKSB3aWxsIGJlIGVuZm9yY2VkIChub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAyKS4gIFdpdGggLXNzbCBpbiBlZmZlY3QgcmV2ZXJzZSBjb25uZWN0aW9uc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGRpc2FibGVkLiAgSWYgeW91IG92ZXJyaWRlIHRoaXMgdmlhIGVudi4gdmFyLCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3VyZSB0byBhbHNvIHVzZSBlbmNyeXB0aW9uIGZyb20gdGhlIHZpZXdlciB0byBpbmV0ZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRpcDogeW91IGNhbiBhbHNvIGhhdmUgeW91ciBvd24gc3R1bm5lbCBzcGF3biB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIC1pbmV0ZCBtb2RlICh0aGVyZWJ5IGJ5cGFzc2luZyBpbmV0ZCkuICBTZWUgdGhlIEZBUVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRldGFpbHMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciBuYW1lcyBpbiB0aGUgY29tbWEgc2VwYXJhdGVkIFtsaXN0XSBtYXkgaGF2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVyLXVzZXIgb3B0aW9ucyBhZnRlciBhIFwiOlwiLCBlLmcuIFwiZnJlZDpvcHRzXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIFwib3B0c1wiIGlzIGEgXCIrXCIgc2VwYXJhdGVkIGxpc3Qgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwidmlld29ubHlcIiwgXCJmdWxsYWNjZXNzXCIsIFwiaW5wdXQ9WFhYWFwiLCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJkZW55XCIsIGUuZy4gXCJrYXJsLHdhbGx5OnZpZXdvbmx5LGJvc3M6aW5wdXQ9TVwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIFwiaW5wdXQ9XCIgaXQgaXMgdGhlIEssTSxCLEMgZGVzY3JpYmVkIHVuZGVyIC1pbnB1dC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGFuIGl0ZW0gaW4gdGhlIGxpc3QgaXMgXCIqXCIgdGhhdCBtZWFucyB0aG9zZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBhcHBseSB0byBhbGwgdXNlcnMuICBJdCBBTFNPIGltcGxpZXMgYWxsIHVzZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgYWxsb3dlZCB0byBsb2cgaW4gYWZ0ZXIgc3VwcGx5aW5nIGEgdmFsaWQgcGFzc3dvcmQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgXCJkZW55XCIgdG8gZXhwbGljaXRseSBkZW55IHNvbWUgdXNlcnMgaWYgeW91IHVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCIqXCIgdG8gc2V0IGEgZ2xvYmFsIG9wdGlvbi4gIElmIFtsaXN0XSBiZWdpbnMgd2l0aCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiIVwiIGNoYXJhY3RlciB0aGVuIFwiKlwiIGlzIGlnbm9yZWQgZm9yIGNoZWNraW5nIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBpcyBhbGxvd2VkLCBidXQgdGhlIG9wdGlvbiB2YWx1ZXMgYXNzb2NpYXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpdCBkbyBhcHBseSBhcyBub3JtYWwuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBzb21lIHV0aWxpdGllcyBmb3IgY2hlY2tpbmcgcGFzc3dvcmRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiBbbGlzdF0gc3RhcnRzIHdpdGggdGhlIFwiJSVcIiBjaGFyYWN0ZXIuICBTZWUgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBxdWlja19wdygpIGZ1bmN0aW9uIGZvciBtb3JlIGRldGFpbHMuICBEZXNjcmlwdGlvbjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiJSUtXCIgb3IgXCIlJXN0ZGluXCIgbWVhbnMgcmVhZCBvbmUgbGluZSBmcm9tIHN0ZGluLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCIlJWVudlwiIG1lYW5zIGl0IGlzIGluICRVTklYUFcgZW52IHZhci4gIEEgbGVhZGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCIlJS9cIiBvciBcIiUlLlwiIG1lYW5zIHJlYWQgdGhlIGZpcnN0IGxpbmUgZnJvbSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lIHRoYXQgZm9sbG93cyBhZnRlciB0aGUgJSUgY2hhcmFjdGVyLiAlJSBieVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmIG1lYW5zIHByb21wdCBmb3IgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZTogJSV1c2VyOnBhc3MgICBFLmcuIC11bml4cHcgJSVmcmVkOnN3b3JkZmlzaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBvdGhlciBjYXNlcyB1c2VyOnBhc3MgaXMgcmVhZCBmcm9tIHRoZSBpbmRpY2F0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS4gIElmIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0ICdZIHVzZXInIGlzIHByaW50ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcHJvZ3JhbSBleGl0IGNvZGUgaXMgMC4gIElmIHRoZSBwYXNzd29yZCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0IGl0IHByaW50cyAnTiB1c2VyJyBhbmQgdGhlIGV4aXQgY29kZSBpcyAxLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgc29tZSBvdGhlciBlcnJvciB0aGUgZXhpdCBjb2RlIGlzIDIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgZW5hYmxlcyB4MTF2bmMgdG8gYmUgYSBnZW5lcmFsIHVuaXggdXNlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgY2hlY2tpbmcgdG9vbDsgaXQgY291bGQgYmUgdXNlZCBmcm9tIHNjcmlwdHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIG90aGVyIHByb2dyYW1zLiAgVGhlc2UgJSUgcGFzc3dvcmQgY2hlY2tzIGFsc28gYXBwbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSAtdW5peHB3X25pcyBhbmQgLXVuaXhwd19jbWQgb3B0aW9ucy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgJSUgcGFzc3dvcmQgY2hlY2ssIGlmIHRoZSBlbnYuIHZhci4gVU5JWFBXX0NNRFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIGEgY29tbWFuZCB0aGVuIGl0IGlzIHJ1biBhcyB0aGUgdXNlciAoYXNzdW1pbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0LikgIFRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwcmludGVkLCB0aGUgcHJvZ3JhbSBvciBzY3JpcHQgbXVzdCBtYW5hZ2UgdGhhdCBieVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29tZSBvdGhlciBtZWFucy4gIFRoZSBleGl0IGNvZGUgb2YgeDExdm5jIHdpbGwgZGVwZW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kIHRoYXQgaXMgcnVuLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1ub3VuaXhwdyB0byBkaXNhYmxlIHVuaXhwdyBtb2RlIGlmIGl0IHdhcyBlbmFibGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlYXJsaWVyIGluIHRoZSBjbWQgbGluZSAoZS5nLiAtc3ZjIG1vZGUpXG4iCi0iXG4iCi0iLXVuaXhwd19uaXMgW2xpc3RdICAgICBBcyAtdW5peHB3IGFib3ZlLCBob3dldmVyIGRvIG5vdCB1c2Ugc3UoMSkgYnV0IHJhdGhlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSB0cmFkaXRpb25hbCBnZXRwd25hbSgzKSArIGNyeXB0KDMpIG1ldGhvZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5IHBhc3N3b3Jkcy4gQWxsIG9mIHRoZSBhYm92ZSAtdW5peHB3IG9wdGlvbnMgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyBhcHBseS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSByZXF1aXJlcyB0aGF0IHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmRzIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWFkYWJsZS4gIEVuY3J5cHRlZCBwYXNzd29yZHMgc3RvcmVkIGluIC9ldGMvc2hhZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGluYWNjZXNzaWJsZSB1bmxlc3MgeDExdm5jIGlzIHJ1biBhcyByb290LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgXCJOSVNcIiBtb2RlIHNpbXBseSBiZWNhdXNlIGluIG1vc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5JUyBzZXR1cHMgdXNlciBlbmNyeXB0ZWQgcGFzc3dvcmRzIGFyZSBhY2Nlc3NpYmxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBcInlwY2F0IHBhc3N3ZFwiKSBieSBhbiBvcmRpbmFyeSB1c2VyIGFuZCBzbyB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGNhbiBhdXRoZW50aWNhdGUgQU5ZIHVzZXIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOSVMgaXMgbm90IHJlcXVpcmVkIGZvciB0aGlzIG1vZGUgdG8gd29yayAob25seSB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnZXRwd25hbSgzKSByZXR1cm4gdGhlIGVuY3J5cHRlZCBwYXNzd29yZCBpcyByZXF1aXJlZCksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgaXMgdW5saWtlbHkgaXQgd2lsbCB3b3JrIChhcyBhbiBvcmRpbmFyeSB1c2VyKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3QgbW9kZXJuIGVudmlyb25tZW50cyB1bmxlc3MgTklTIGlzIGF2YWlsYWJsZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHgxMXZuYyBpcyBydW4gYXMgcm9vdCBpdCB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSBhYmxlIHRvIHRvIGFjY2VzcyAvZXRjL3NoYWRvdyBldmVuIGlmIE5JUyBpcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAobm90ZSBydW5uaW5nIGFzIHJvb3QgaXMgb2Z0ZW4gZG9uZSB3aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIHgxMXZuYyBmcm9tIGluZXRkIGFuZCB4ZG0vZ2RtL2tkbSkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMb29rZWQgYXQgYW5vdGhlciB3YXksIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdSgxKSBtZXRob2QgcHJvdmlkZWQgYnkgLXVuaXhwdyAoaS5lLiBzdV92ZXJpZnkoKSksIHlvdVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIHJ1biB4MTF2bmMgYXMgcm9vdCBhbmQgdXNlIC11bml4cHdfbmlzLiAgQW55IHVzZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBhc3N3b3JkcyBpbiAvZXRjL3NoYWRvdyBjYW4gdGhlbiBiZSBhdXRoZW50aWNhdGVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gLXVuaXhwd19uaXMgbW9kZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBpcyB4MTF2bmMnc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBwYXNzd29yZCB2ZXJpZnlpbmcgZnVuY3Rpb24gYmFzZWQgb24gc3UgY2FsbGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgZnVuY3Rpb24gc3VfdmVyaWZ5KCkgdGhhdCBydW5zIC9iaW4vc3VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIGEgcHNldWRvdGVybWluYWwgdG8gdmVyaWZ5IHBhc3N3b3Jkcy4pICBIb3dldmVyLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgLXVuaXhwd19uaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAtZmluZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1jcmVhdGUgLWRpc3BsYXkgV0FJVDouLi4gbW9kZXMgdGhlbiwgaWYgeDExdm5jIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIGFzIHJvb3QsIC9iaW4vc3UgbWF5IGJlIGNhbGxlZCBleHRlcm5hbGx5IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW4gdGhlIGZpbmQgb3IgY3JlYXRlIGNvbW1hbmRzLlxuIgotIlxuIgotIi11bml4cHdfY21kIGNtZCAgICAgICAgQXMgLXVuaXhwdyBhYm92ZSwgaG93ZXZlciBkbyBub3QgdXNlIHN1KDEpIGJ1dCByYXRoZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJ1biB0aGUgZXh0ZXJuYWxseSBzdXBwbGllZCBjb21tYW5kIFwiY21kXCIuICBUaGUgZmlyc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgb2YgaXRzIHN0ZGluIHdpbGwgYmUgdGhlIHVzZXJuYW1lIGFuZCB0aGUgc2Vjb25kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaW5lIHRoZSByZWNlaXZlZCBwYXNzd29yZC4gIElmIHRoZSBjb21tYW5kIGV4aXRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHN0YXR1cyAwIChzdWNjZXNzKSB0aGUgVk5DIHVzZXIgd2lsbCBiZSBhY2NlcHRlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgcmVqZWN0ZWQgZm9yIGFueSBvdGhlciByZXR1cm4gc3RhdHVzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pYyBwYXNzd29yZHMgYW5kIG5vbi11bml4IHBhc3N3b3JkcywgZS5nLiBMREFQLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGltcGxlbWVudGVkIHRoaXMgd2F5IGJ5IHByb3ZpZGluZyB5b3VyIG93biBjdXN0b21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlciBwcm9ncmFtLiAgTm90ZSB0aGF0IHRoZSByZW1vdGUgdmlld2VyIGlzIGdpdmVuIDNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyaWVzIHRvIGVudGVyIHRoZSBjb3JyZWN0IHBhc3N3b3JkLCBhbmQgc28gdGhlIHByb2dyYW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjYWxsZWQgaW4gYSByb3cgdGhhdCBtYW55IChvciBtb3JlKSB0aW1lcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGEgbGlzdCBvZiBhbGxvd2VkIHVzZXJzIGlzIG5lZWRlZCB0byBsaW1pdCB3aG8gY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb2cgaW4sIHVzZSAtdW5peHB3IFtsaXN0XSBpbiBhZGRpdGlvbiB0byB0aGlzIG9wdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyB0aGUgXCJjbWRcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBhbHNvIGJlIHJ1biB3aXRoIHRoZSBSRkJfVU5JWFBXX0NNRF9SVU4gZW52LiB2YXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub24tZW1wdHkgYW5kIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXNwbGF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaW5kL2NyZWF0ZSBjb21tYW5kLiAgVGhlIGZpcnN0IHR3byBsaW5lcyBvZiBpbnB1dCBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dkIGFzIGluIHRoZSBub3JtYWwgY2FzZSBkZXNjcmliZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLiAgVG8gc3VwcG9ydCBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImNtZFwiIHNob3VsZCBydW4gdGhlIHJlcXVlc3RlZCBjb21tYW5kIGFzIHRoZSB1c2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoYW5kIG1vc3QgbGlrZWx5IHJlZnVzaW5nIHRvIHJ1biBpdCBpZiB0aGUgcGFzc3dvcmQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb3JyZWN0LikgIEhlcmUgaXMgYW4gZXhhbXBsZSBzY3JpcHQgKG5vdGUgaXQgaGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIGhhcmR3aXJlZCBib2d1cyBwYXNzd29yZCBcImFiY1wiISlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIyEvYmluL3NoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICMgRXhhbXBsZSB4MTF2bmMgLXVuaXhwd19jbWQgc2NyaXB0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlYWQgdGhlIGZpcnN0IHR3byBsaW5lcyBvZiBzdGRpbiAodXNlciBhbmQgcGFzc3dkKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIHVzZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBwYXNzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgJGRlYnVnID0gMSBdOyB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAllY2hvIFwidXNlcjogJHVzZXJcIiAxPiYyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAllY2hvIFwicGFzczogJHBhc3NcIiAxPiYyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAllbnYgfCBlZ3JlcCAtaSAncmZifHZuYycgMT4mMlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBmaVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgcGFzc3dvcmQgaXMgdmFsaWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICMgKEEgcmVhbCBleGFtcGxlIHdvdWxkIHVzZSBsZGFwIGxvb2t1cCwgZXRjISlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyBcIlgkcGFzc1wiICE9IFwiWGFiY1wiIF07IHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgCWV4aXQgMQkjIGluY29ycmVjdCBwYXNzd29yZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBmaVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyBcIlgkUkZCX1VOSVhQV19DTURfUlVOXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAlleGl0IDAJIyBjb3JyZWN0IHBhc3N3b3JkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgCSMgUnVuIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCAoZmluZGRpc3BsYXkpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAlpZiBbICRkZWJ1ZyA9IDEgXTsgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAJCWVjaG8gXCJydW46ICRSRkJfVU5JWFBXX0NNRF9SVU5cIiAxPiYyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIAlmaVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAJZXhlYyAvYmluL3N1IC0gXCIkdXNlclwiIC1jIFwiJFJGQl9VTklYUFdfQ01EX1JVTlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIGZpXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiAtdW5peHB3X2NtZCBtb2RlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIGlzIHgxMXZuYydzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHBhc3N3b3JkIHZlcmlmeWluZyBmdW5jdGlvbiBiYXNlZCBvbiBzdSBjYWxsZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBmdW5jdGlvbiBzdV92ZXJpZnkoKSB0aGF0IHJ1bnMgL2Jpbi9zdSBpbiBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG90ZXJtaW5hbCB0byB2ZXJpZnkgcGFzc3dvcmRzLikgIEl0IGlzIHVwIHRvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgdW5peHB3X2NtZCB0byBkbyB1c2VyIHN3aXRjaGluZyBpZiBkZXNpcmVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIHRoZSBwZXJtaXNzaW9ucyB0byBkbyBzby5cbiIKLSJcbiIKLSItZmluZCAgICAgICAgICAgICAgICAgIEZpbmQgdGhlIHVzZXIncyBkaXNwbGF5IHVzaW5nIEZJTkRESVNQTEFZLiBUaGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBhbGlhcyBmb3IgXCItZGlzcGxheSBXQUlUOmNtZD1GSU5ERElTUExBWVwiLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBvdmVycmlkZSB0aGUgLWZpbmQgc2V0dGluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIGFuZCB0aGUgbmV4dCBmZXcgb3B0aW9ucyBzZWUgLWRpc3BsYXkgV0FJVDouLi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IGZvciBhbGwgb2YgdGhlIGRldGFpbHMuXG4iCi0iXG4iCi0iLWZpbmRkcHkgICAgICAgICAgICAgICBSdW4gdGhlIEZJTkRESVNQTEFZIHByb2dyYW0sIHByaW50IG91dCB0aGUgZm91bmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgKGlmIGFueSkgYW5kIGV4aXQuICBPdXRwdXQgaXMgbGlrZTogRElTUExBWT06MC4wXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBESVNQTEFZPTowLjAsWFBJRD0xMjM0NSBvciBESVNQTEFZPTowLjAsVlQ9Ny4gIFhQSUQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBmb3VuZCBYIHNlcnZlci4gIFZUIGlzIHRoZSBMaW51eFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB0ZXJtaW5hbCBvZiB0aGUgWCBzZXJ2ZXIuXG4iCi0iLWxpc3RkcHkgICAgICAgICAgICAgICBIYXZlIHRoZSBGSU5ERElTUExBWSBwcm9ncmFtIGxpc3QgYWxsIG9mIHlvdXIgZGlzcGxheXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGFsbCB0aGUgWCBkaXNwbGF5cyBvbiB0aGUgbG9jYWwgbWFjaGluZSB0aGF0IHlvdVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhY2Nlc3MgcmlnaHRzIHRvKS4gIHgxMXZuYyB0aGVuIGV4aXRzLlxuIgotIlxuIgotIi1maW5kYXV0aCBbZGlzcF0gICAgICAgQXBwbHkgdGhlIC1maW5kLy1maW5kZHB5IGhldXJpc3RpY3MgdG8gdHJ5IHRvIGd1ZXNzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgWEFVVEhPUklUWSBmaWxlIGZvciBESVNQTEFZICdkaXNwJy4gIElmICdkaXNwJ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHN1cHBsaWVkLCB0aGVuIHRoZSB2YWx1ZSBpbiB0aGUgLWRpc3BsYXkgb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbWRsaW5lIGlzIHVzZWQ7IGZhaWxpbmcgdGhhdCAkRElTUExBWSBpcyB1c2VkO1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZhaWxpbmcgdGhhdCBcIjowXCIgaXMgdXNlZC4gIHgxMXZuYyB0aGVuIGV4aXRzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90aGluZyBpcyBwcmludGVkIG91dCwgdGhhdCBtZWFucyBubyBYQVVUSE9SSVRZIHdhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgZm9yICdkaXNwJzsgaS5lLiBmYWlsdXJlLiAgSWYgXCJYQVVUSE9SSVRZPVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmludGVkIG91dCwgdGhhdCBtZWFucyB1c2UgdGhlIGRlZmF1bHQgKGkuZS4gZG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZXQgWEFVVEhPUklUWSkuICBJZiBcIlhBVVRIT1JJVFk9L3BhdGgvdG8vZmlsZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmludGVkIG91dCwgdGhlbiB1c2UgdGhhdCBmaWxlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWERNL0dETS9LRE06IGlmIHlvdSBhcmUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCBhbmQgd2FudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gZmluZCB0aGUgWEFVVEhPUklUWSBiZWZvcmUgYW55b25lIGhhcyBsb2dnZWQgaW50byBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWCBzZXNzaW9uIHlldCwgdXNlOiB4MTF2bmMgLWVudiBGRF9YRE09MSAtZmluZGF1dGggLi4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbi4pICBXaGVuIHJ1bm5pbmcgYXMgcm9vdCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZEX1hETT0xIHdpbGwgYmUgdHJpZWQgaWYgdGhlIGluaXRpYWwgLWZpbmRhdXRoIGZhaWxzLlxuIgotIlxuIgotIi1jcmVhdGUgICAgICAgICAgICAgICAgRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIHVzZXIncyBkaXNwbGF5IHVzaW5nIEZJTkRESVNQTEFZLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhhdCBkb2Vzbid0IHN1Y2NlZWQgY3JlYXRlIGFuIFggc2Vzc2lvbiB2aWEgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGSU5EQ1JFQVRFRElTUExBWSBtZXRob2QuICBUaGlzIGlzIGFuIGFsaWFzIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBpZiBhIC1kaXNwbGF5IG9jY3VycyBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIG92ZXJyaWRlIHRoZSAtY3JlYXRlIHNldHRpbmcuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTU0ggTk9URTogZm9yIGJvdGggLWZpbmQgYW5kIC1jcmVhdGUgeW91IGNhbiAoc2hvdWxkISlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0aGUgXCItbG9jYWxob3N0XCIgb3B0aW9uIHRvIGZvcmNlIFNTSCB0dW5uZWwgYWNjZXNzLlxuIgotIlxuIgotIi14ZHVtbXkgICAgICAgICAgICAgICAgQXMgaW4gLWNyZWF0ZSwgZXhjZXB0IFhkdW1teSBpbnN0ZWFkIG9mIFh2ZmIuXG4iCi0iLXh2bmMgICAgICAgICAgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWHZuYyBpbnN0ZWFkIG9mIFh2ZmIuXG4iCi0iLXh2bmNfcmVkaXJlY3QgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWHZuYy5yZWRpcmVjdCBpbnN0ZWFkIG9mIFh2ZmIuXG4iCi0iLXhkdW1teV94dmZiICAgICAgICAgICBTZXRzIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVhkdW1teSxYdmZiXG4iCi0iXG4iCi0iLWNyZWF0ZV94c3J2IHN0ciAgICAgICBTZXRzIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLTxzdHI+ICBDYW4gYmUgb24gY21kbGluZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgYW55dGhpbmcgdGhhdCBzZXRzIFdBSVQ6Li4gYW5kIG90aGVyIHRoaW5nc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gLXN2YywgLXhkbXN2YykgdG8gYWRqdXN0IHRoZSBYIHNlcnZlciBsaXN0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogLXN2YyAuLi4gLWNyZWF0ZV94c3J2IFhkdW1teSxYXG4iCi0iXG4iCi0iLXN2YyAgICAgICAgICAgICAgICAgICBUZXJtaW5hbCBzZXJ2aWNlcyBtb2RlIGJhc2VkIG9uIFNTTCBhY2Nlc3MuICBBbGlhcyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIgLXVuaXhwdyAtdXNlcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVuaXhwdz0gLXNzbCBTQVZFICAgQWxzbyBcIi1zZXJ2aWNlXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBpZiBhIC1kaXNwbGF5LCAtdW5peHB3LCAtdXNlcnMsIG9yIC1zc2wgb2NjdXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC1zdmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4iCi0iXG4iCi0iLXN2Y194ZHVtbXkgICAgICAgICAgICBBcyAtc3ZjIGV4Y2VwdCBYZHVtbXkgaW5zdGVhZCBvZiBYdmZiLlxuIgotIi1zdmNfeHZuYyAgICAgICAgICAgICAgQXMgLXN2YyBleGNlcHQgWHZuYyBpbnN0ZWFkIG9mIFh2ZmIuXG4iCi0iLXN2Y194ZHVtbXlfeHZmYiAgICAgICBBcyAtc3ZjIHdpdGggWGR1bW15LFh2ZmIuXG4iCi0iXG4iCi0iLXhkbXN2YyAgICAgICAgICAgICAgICBEaXNwbGF5IG1hbmFnZXIgVGVybWluYWwgc2VydmljZXMgbW9kZSBiYXNlZCBvbiBTU0wuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbGlhcyBmb3IgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYi54ZG1jcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXVuaXhwdyAtdXNlcnMgdW5peHB3PSAtc3NsIFNBVkUgIEFsc28gXCIteGRtX3NlcnZpY2VcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGlmIGEgLWRpc3BsYXksIC11bml4cHcsIC11c2Vycywgb3IgLXNzbCBvY2N1cnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUgaXQgd2lsbCBvdmVycmlkZSB0aGUgLXhkbXN2Y1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIHNlc3Npb24gYSB1c2VyIHdpbGwgaGF2ZSB0byBmaXJzdCBsb2cgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSAtdW5peHB3IGRpYWxvZyBhbmQgdGhlbiBsb2cgaW4gYWdhaW4gdG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYRE0vR0RNL0tETSBwcm9tcHQuICBTdWJzZXF1ZW50IHJlLWNvbm5lY3Rpb25zIHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgcmVxdWlyZSB0aGUgLXVuaXhwdyBwYXNzd29yZC4gIFNlZSB0aGUgZGlzY3Vzc2lvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgLWRpc3BsYXkgV0FJVDouLi4gZm9yIG1vcmUgZGV0YWlscyBhYm91dCBYRE0sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBldGMgY29uZmlndXJhdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJlbWVtYmVyIHRvIGVuYWJsZSBYRE1DUCBpbiB0aGUgeGRtLWNvbmZpZywgZ2RtLmNvbmYsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBrZG1yYyBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUgLWRpc3BsYXkgV0FJVDogZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm8uXG4iCi0iXG4iCi0iLXNzaHhkbXN2YyAgICAgICAgICAgICBEaXNwbGF5IG1hbmFnZXIgVGVybWluYWwgc2VydmljZXMgbW9kZSBiYXNlZCBvbiBTU0guXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbGlhcyBmb3IgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYi54ZG1jcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWxvY2FsaG9zdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSAtbG9jYWxob3N0IG9wdGlvbiBjb25zdHJhaW5zIGNvbm5lY3Rpb25zIHRvIGNvbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHZpYSBhIFNTSCB0dW5uZWwgKHdoaWNoIHdpbGwgcmVxdWlyZSBhIGxvZ2luKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIHNlc3Npb24gYSB1c2VyIHdpbGwgYWxzbyBoYXZlIHRvIGxvZyBpbnRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgWERNIEdETSBLRE0gcHJvbXB0LiBTdWJzZXF1ZW50IHJlLWNvbm5lY3Rpb25zIHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgb25seSByZXF1aXJlIHRoZSBTU0ggbG9naW4uICBTZWUgdGhlIGRpc2N1c3Npb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIC1kaXNwbGF5IFdBSVQ6Li4uIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgWERNLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXRjIGNvbmZpZ3VyYXRpb24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBSZW1lbWJlciB0byBlbmFibGUgWERNQ1AgaW4gdGhlIHhkbS1jb25maWcsIGdkbS5jb25mLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3Iga2RtcmMgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIC1kaXNwbGF5IFdBSVQ6IGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLlxuIgotIlxuIgotIi11bml4cHdfc3lzdGVtX2dyZWV0ZXIgUHJlc2VudCBhIFwiUHJlc3MgJ0VzY2FwZScgZm9yIFN5c3RlbSBHcmVldGVyXCIgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY29ubmVjdGluZyBWTkMgY2xpZW50IGluIGNvbWJpbmVkIC11bml4cHdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCB4ZG1jcCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyAoZS5nLiAteGRtc3ZjKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5IGluIGEgLXVuaXhwdyBtb2RlIHRoZSBWTkMgY2xpZW50IG11c3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSBhIHZhbGlkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBnYWluIGFjY2Vzcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIC11bml4cHdfc3lzdGVtX2dyZWV0ZXIgaXMgc3VwcGxpZWQgQU5EXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgRklORENSRUFURURJU1BMQVkgY29tbWFuZCBtYXRjaGVzICd4ZG1jcCcsIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIHRvIHByZXNzIEVzY2FwZSBhbmQgdGhlbiBnZXQgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWERNL0dETS9LRE0gbG9naW4vZ3JlZXRlciBwYW5lbCBpbnN0ZWFkLiBUaGV5IHdpbGwgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGRpcmVjdGx5IHRvIHRoZSBncmVldGVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBpbiB4ZG1jcCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlIHRoZSB1c2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtdXN0IHN1cHBseSBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIFRXSUNFLiAgRmlyc3QgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHVuaXhwdyBsb2dpbiBkaWFsb2csIGFuZCBzZWNvbmQgdG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50IFhETS9HRE0vS0RNIGdyZWV0ZXIuICBOb3RlIHRoYXQgaWYgdGhlIHVzZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlLWNvbm5lY3RzIGFuZCBzdXBwbGllcyBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdW5peHB3IGRpYWxvZyB0aGUgeGRtY3AgZ3JlZXRlciBpcyBza2lwcGVkIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGUgaXMgY29ubmVjdGVkIGRpcmVjdGx5IHRvIGhpcyBleGlzdGluZyBYIHNlc3Npb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTbyB0aGUgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBvcHRpb24gYXZvaWRzIHRoZSBleHRyYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgYXQgWCBzZXNzaW9uIGNyZWF0aW9uIHRpbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAgeDExdm5jIC14ZG1zdmMgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIC11bml4cHcgYW5kIC1kaXNwbGF5IFdBSVQ6Li4uIGZvciBtb3JlIGluZm8uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCBvcHRpb25zIGFmdGVyIGEgY29sb24gYXQgdGhlIGVuZCBvZiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIChlLmcuIHVzZXI6c29saWQpIGRlc2NyaWJlZCB1bmRlciAtZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV0FJVDogYXJlIGFsc28gYXBwbGllZCBpbiB0aGlzIG1vZGUgaWYgdGhleSBhcmUgdHlwZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIGJlZm9yZSB0aGUgdXNlciBoaXRzIEVzY2FwZS4gIFRoZSB1c2VybmFtZSBpcyBpZ25vcmVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIGNvbG9uIG9wdGlvbnMgYXJlIG5vdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgMiBsaW5lcyBpbiBhIHNtYWxsIGZvbnQsIHNldFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudi4gdmFyLiBYMTFWTkNfU1lTVEVNX0dSRUVURVIxPXRydWUgZm9yIGEgMSBsaW5lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGluIGEgbGFyZ2VyIGZvbnQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgdXNlciBwcmVzc2VkIEVzY2FwZSB0aGUgRklORENSRUFURURJU1BMQVkgY29tbWFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBydW4gd2l0aCB0aGUgZW52LiB2YXIuIFgxMVZOQ19YRE1fT05MWT0xLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUmVtZW1iZXIgdG8gZW5hYmxlIFhETUNQIGluIHRoZSB4ZG0tY29uZmlnLCBnZG0uY29uZixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIGtkbXJjIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZSAtZGlzcGxheSBXQUlUOiBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mby5cbiIKLSJcbiIKLSItcmVkaXJlY3QgcG9ydCAgICAgICAgIEFzIGluIEZJTkRDUkVBVEVESVNQTEFZLVh2bmMucmVkaXJlY3QgbW9kZSBleGNlcHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IGltbWVkaWF0ZWx5IChpLmUuIHdpdGhvdXQgWCBzZXNzaW9uIGZpbmRpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIGNyZWF0aW9uKSB0byBhIFZOQyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQuIFlvdVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGFsc28gc3VwcGx5IGhvc3Q6cG9ydCB0byByZWRpcmVjdCB0byBhIGRpZmZlcmVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIDAgPD0gcG9ydCA8IDIwMCBpdCBpcyB0YWtlbiBhcyBhIFZOQyBkaXNwbGF5ICg1OTAwIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byBnZXQgdGhlIGFjdHVhbCBwb3J0KSwgaWYgcG9ydCA8IDAgdGhlbiAtcG9ydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmx5IHRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhlIC1yZWRpcmVjdCBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIGNvbmp1bmN0aW9uIHdpdGggU1NMIHN1cHBvcnQsIGUuZy4gLXNzbCBTQVZFLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBhZGQgU1NMIGVuY3J5cHRpb24gdG8gYSBWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgU1NMIChlLmcuIFh2bmMgb3Igdm5jLnNvKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gZmFjdCwgdGhlIHByb3RvY29sIGRvZXMgbm90IGV2ZW4gbmVlZCB0byBiZSBWTkMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgc28gXCItcmZicG9ydCBwb3J0MSAtc3NsIFNBVkUgLXJlZGlyZWN0IGhvc3Q6cG9ydDJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGFjdCBhcyBhIHJlcGxhY2VtZW50IGZvciBzdHVubmVsKDEpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIG9ubHkgYWxsb3dzIG9uZSByZWRpcmVjdGVkIGNvbm5lY3Rpb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWZvcmV2ZXIgb3B0aW9uIGRvZXMgbm90IGFwcGx5LiAgVXNlIC1pbmV0ZCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWxvb3AgZm9yIHBlcnNpc3RlbnQgc2VydmljZS5cbiIKLSJcbiIKLSItZGlzcGxheSBXQUlUOi4uLiAgICAgIEEgc3BlY2lhbCB1c2FnZSBtb2RlIGZvciB0aGUgbm9ybWFsIC1kaXNwbGF5IG9wdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZWZ1bCB3aXRoIC11bml4cHcsIGJ1dCBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBpdC4gIElmIHRoZSBkaXNwbGF5IHN0cmluZyBiZWdpbnMgd2l0aCBXQUlUOiB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2FpdHMgdW50aWwgYSBWTkMgY2xpZW50IGNvbm5lY3RzIGJlZm9yZSBvcGVuaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgWCBkaXNwbGF5IChvciAtcmF3ZmIgZGV2aWNlKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgdXNlZnVsIGZvciBkZWxheWluZyBvcGVuaW5nIHRoZSBkaXNwbGF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2VydGFpbiB1c2FnZSBtb2RlcyAoc2F5IGlmIHgxMXZuYyBpcyBzdGFydGVkIGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBib290IHRpbWUgYW5kIG5vIFggc2VydmVyIGlzIHJ1bm5pbmcgb3IgdXNlcnMgbG9nZ2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiB5ZXQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBpcywgZS5nLiBXQUlUOjAuMCBvciBXQUlUOjEsIGkuZS4gXCJXQUlUXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIGZyb250IG9mIGEgbm9ybWFsIFggZGlzcGxheSwgdGhlbiB0aGF0IGluZGljYXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyB1c2VkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT25lIGNhbiBhbHNvIGluc2VydCBhIGdlb21ldHJ5IGJldHdlZW4gY29sb25zLCBlLmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXQUlUOjEyODB4MTAyNDouLi4gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBkaXNwbGF5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudCBmaXJzdCBhdHRhY2hlcyB0byBzaW5jZSBzb21lIFZOQyB2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGFkanVzdCB0byBhIG5ldyBmcmFtZWJ1ZmZlciBzaXplLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQSBtb3JlIGludGVyZXN0aW5nIGNhc2UgaXMgbGlrZSB0aGlzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUlUOmNtZD0vdXNyL2xvY2FsL2Jpbi9maW5kX2Rpc3BsYXlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGNvbW1hbmQgYWZ0ZXIgXCJjbWQ9XCIgaXMgcnVuIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljYWxseSB3b3JrIG91dCB0aGUgRElTUExBWSBhbmQgb3B0aW9uYWxseSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhBVVRIT1JJVFkgZGF0YS4gIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tYW5kIG91dHB1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgZm9ybSBESVNQTEFZPTx4ZGlzcGxheT4uICBPbiBMaW51eFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHZpcnR1YWwgdGVybWluYWwgaXMga25vd24gYXBwZW5kIFwiLFZUPW5cIiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdHJpbmcgYW5kIHRoZSBjaHZ0KDEpIHByb2dyYW0gd2lsbCBhbHNvIGJlIHJ1bi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFueSByZW1haW5pbmcgb3V0cHV0IGlzIHRha2VuIGFzIFhBVVRIT1JJVFkgZGF0YS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBlaXRoZXIgb2YgdGhlIGZvcm0gWEFVVEhPUklUWT08ZmlsZT4gb3IgcmF3XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4YXV0aG9yaXR5IGRhdGEgZm9yIHRoZSBkaXNwbGF5LiBGb3IgZXhhbXBsZTtcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGF1dGggZXh0cmFjdCAtICRESVNQTEFZXCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEFzIHNwZWNpZmllZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCB5b3UgY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgeW91ciBvd24gV0FJVDpjbWQ9Li4uIHByb2dyYW0gb3Igc2NyaXB0LCBCVVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSB0d28gdmVyeSB1c2VmdWwgKkJVSUxULUlOKiBvbmVzOiBGSU5ERElTUExBWVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGFsaWFzIC1maW5kIGFib3ZlKSBhbmQgRklORENSRUFURURJU1BMQVkgKGFsaWFzIC1jcmVhdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLikgIE1vc3QgcGVvcGxlIHVzZSB0aGVzZSBpbnN0ZWFkIG9mIGNyZWF0aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVpciBvd24gc2NyaXB0LiAgUmVhZCB0aGUgZm9sbG93aW5nIChlc3BlY2lhbGx5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQlVJTFQtSU4gbW9kZXMgc2VjdGlvbnMpIHRvIHNlZSBob3cgdG8gY29uZmlndXJlIHRoZXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0d28gdXNlZnVsIGJ1aWx0aW4gLWRpc3BsYXkgV0FJVDogbW9kZXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY2FzZSBvZiAtdW5peHB3IChhbmQgLXVuaXhwd19uaXMgb25seSBpZiB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHJ1bm5pbmcgYXMgcm9vdCksIHRoZW4gdGhlIGNtZD0gY29tbWFuZCBpcyBydW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2VyIHdobyBqdXN0IGF1dGhlbnRpY2F0ZWQgdmlhIHRoZSBsb2dpbiBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIHByb21wdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC11bml4cHdfY21kLCB0aGUgY29tbWFuZHMgd2lsbCBhbHNvIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW4gYXMgdGhlIGxvZ2dlZC1pbiB1c2VyLCBhcyBsb25nIGFzIHRoZSB1c2VyLXN1cHBsaWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIgcHJvZ3JhbSBzdXBwb3J0cyBSRkJfVU5JWFBXX0NNRF9SVU4gKHNlZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC11bml4cHdfY21kIG9wdGlvbi4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHNvIGluIHRoZSBjYXNlIG9mIC11bml4cHcsIHRoZSB1c2VyIGxvZ2dpbmcgaW4gY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSBhIGNvbG9uIGF0IHRoZSBlbmQgb2YgaGVyIHVzZXJuYW1lIGFuZCBzdXBwbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgZmV3IG9wdGlvbnM6IHNjYWxlPSwgc2NhbGVfY3Vyc29yPSAob3Igc2M9KSwgc29saWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChvciBzbyksIGlkPSwgY2xlYXJfbW9kcyAob3IgY20pLCBjbGVhcl9rZXlzIChvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2spLCBjbGVhcl9hbGwgKG9yIGNhKSwgcmVwZWF0LCBzcGVlZHM9IChvciBzcD0pLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVhZHRpbWVvdXQ9IChvciByZD0pLCB2aWV3b25seSAob3Igdm8pLCBub2Rpc3BsYXk9XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAob3IgbmQ9KSwgcm90YXRlPSAob3Igcm89KSwgb3Igbm9uY2FjaGUgKG9yIG5jKSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsbCBzZXBhcmF0ZWQgYnkgY29tbWFzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgdXNlciBsb2dzIGluIHN1Y2Nlc3NmdWxseSwgdGhlc2Ugb3B0aW9ucyB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSBhcHBsaWVkIHRvIHRoZSBWTkMgc2NyZWVuLiAgRm9yIGV4YW1wbGUsXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpbjogZnJlZDpzY2FsZT0zLzQsc2M9MSxyZXBlYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkOiAuLi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luOiBydW5nZTpzcD1tb2RlbSxyZD0xMjAsc29saWRcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb252ZW5pZW5jZSBtL24gaW1wbGllcyBzY2FsZT0gZS5nLiBmcmVkOjMvNCAgSWYgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGFuZCBlbnRlciB5b3VyIHBhc3N3b3JkIGluY29ycmVjdGx5LCB0byByZXRyaWV2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91ciBsb25nIFwibG9naW46XCIgbGluZSBwcmVzcyB0aGUgVXAgYXJyb3cgb25jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGJlZm9yZSB0eXBpbmcgYW55dGhpbmcgZWxzZSkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNb3N0IG9mIHRoZXNlIGNvbG9uIG9wdGlvbnMgb25seSBhcHBseSB0byB0aGUgYnVpbHRpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRklORERJU1BMQVkgYW5kIEZJTkRDUkVBVEVESVNQTEFZIG1vZGVzLCBidXQgbm90ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGV4dHJlbmFsIGNvbW1hbmQgaW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBhcyB3ZWxsIGFuZCBzbyBjb3VsZCBiZSB1c2VkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGxvZ2luIHBhbmVsLCBwcmVzcyBGMSB0byBnZXQgYSBsaXN0IG9mIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9wdGlvbnMgdGhhdCB5b3UgY2FuIGFkZCBhZnRlciB0aGUgdXNlcm5hbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIG9wdGlvbiBpcyBcImdlb209V3hIXCIgb3IgXCJnZW9tPVd4SHhEXCIgKG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnZT0pLiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBpbiBGSU5EQ1JFQVRFRElTUExBWVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVuIGEgdmlydHVhbCBYIHNlcnZlciBzdWNoIGFzIFh2ZmIgaXMgZ29pbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNyZWF0ZWQuICBJdCBzZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IGRpc3BsYXksIGFuZCBvcHRpb25hbGx5IHRoZSBjb2xvciBkZXB0aCBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2VsbC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzdXBwbHkgXCJnbm9tZVwiLCBcImtkZVwiLCBcInR3bVwiLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJmdndtXCIsIFwibXdtXCIsIFwiZHR3bVwiLCBcIndtYWtlclwiLCBcInhmY2VcIixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwibHhkZVwiLCBcImVubGlnaHRlbm1lbnRcIiwgXCJYc2Vzc2lvblwiLCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJmYWlsc2FmZVwiIChzYW1lIGFzIFwieHRlcm1cIikgdG8gaGF2ZSB0aGUgY3JlYXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSB1c2UgdGhhdCBtb2RlIGZvciB0aGUgdXNlciBzZXNzaW9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBcInRhZz0uLi5cIiB0byBzZXQgdGhlIHVuaXF1ZSBGRF9UQUcgZGVza3RvcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiB0YWcgZGVzY3JpYmVkIGJlbG93LiAgTm90ZTogdGhpcyBvcHRpb24gd2lsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgaWdub3JlZCBpZiB0aGUgRkRfVEFHIGVudi4gdmFyLiBpcyBhbHJlYWR5IHNldCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHZpZXdlci1zaWRlIHN1cHBsaWVkIHZhbHVlIGlzIG5vdCBjb21wbGV0ZWx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgb3IgJ18nIG9yICctJyBjaGFyYWN0ZXJzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlciBwcmVmZXJlbmNlcyBmaWxlOiBJbnN0ZWFkIG9mIGhhdmluZyB0aGUgdXNlciB0eXBlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiBnZW9tPVd4SCwuLi4gZXRjLiBldmVyeSB0aW1lIGhlIGxvZ3MgaW4gdG8gZmluZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgY3JlYXRlIGhpcyBYIHNlc3Npb24sIGlmIHlvdSBzZXQgRkRfVVNFUlBSRUZTIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIHN0cmluZyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIFwiL1wiIGNoYXJhY3RlcixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBpcyBwcmVwZW5kZWQgdG8gdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFuZCBpZiB0aGUgZmlsZSBleGlzdHMgaXRzIGZpcnN0IGxpbmUgaXMgcmVhZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFwcGVuZGVkIHRvIGFueSBvcHRpb25zIGhlIHN1cHBsaWVkIGF0IHRoZSBsb2dpbjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb21wdC4gIEZvciBleGFtcGxlIC1lbnYgRkRfVVNFUlBSRUZTPS54MTF2bmNfY3JlYXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHVzZXIgcHV0IFwiZ2VvbT0xNjAweDEyMDBcIiBpbiBoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIH4vLngxMXZuY19jcmVhdGUgZmlsZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGRpc2FibGUgdGhlIG9wdGlvbiBzZXR0aW5nIHNldCB0aGUgZW52aXJvbm1lbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIFgxMVZOQ19OT19VTklYUFdfT1BUUz0xIGJlZm9yZSBzdGFydGluZyB4MTF2bmMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBzZXQgYW55IG90aGVyIG9wdGlvbnMsIHRoZSB1c2VyIGNhbiB1c2UgdGhlIGd1aVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKHgxMXZuYyAtZ3VpIGNvbm5lY3QpIG9yIHRoZSByZW1vdGUgY29udHJvbCBtZXRob2RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh4MTF2bmMgLVIgb3B0OnZhbCkgZHVyaW5nIGhpcyBWTkMgc2Vzc2lvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIHdlIHNlZSB0aGUgY29tYmluYXRpb24gb2YgLWRpc3BsYXkgV0FJVDpjbWQ9Li4uIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXVuaXhwdyBhbGxvd3MgYXV0b21hdGljIHBhaXJpbmcgb2YgYW4gdW5peFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZCBWTkMgdXNlciB3aXRoIGhpcyBkZXNrdG9wLiAgVGhpcyBjb3VsZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgdmVyeSB1c2VmdWwgb24gU3VuUmF5cyBhbmQgYWxzbyBhbnkgc3lzdGVtIHdoZXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSB1c2VycyBzaGFyZSBhIGdpdmVuIG1hY2hpbmUuICBUaGUgdXNlciBkb2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgbmVlZCB0byByZW1lbWJlciBzcGVjaWFsIHBvcnRzIG9yIHBhc3N3b3JkcyBzZXQgdXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBoaXMgZGVza3RvcCBhbmQgVk5DLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQSBuaWNlIHdheSB0byB1c2UgV0FJVDpjbWQ9Li4uIGlzIG91dCBvZiBpbmV0ZCg4KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGl0IGF1dG9tYXRpY2FsbHkgZm9ya3MgYSBuZXcgeDExdm5jIGZvciBlYWNoIHVzZXIpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBoYXZlIHRoZSB4MTF2bmMgaW5ldGQgc3Bhd25lZCBwcm9jZXNzIHJ1biBhcyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNheSwgcm9vdCBvciBub2JvZHkuICBXaGVuIHJ1biBhcyByb290IChmb3IgZWl0aGVyIGluZXRkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNwbGF5IG1hbmFnZXIpLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZSBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLXVzZXJzIHVuaXhwdz1cIiB0byBoYXZlIHRoZSB4MTF2bmMgcHJvY2VzcyBzd2l0Y2ggdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGFzIHdlbGwuICBOb3RlOiB0aGVyZSB3aWxsIGJlIGEgMm5kIFNTTCBoZWxwZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdGhhdCB3aWxsIG5vdCBzd2l0Y2gsIGJ1dCBpdCBpcyBvbmx5IGVuY29kaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGVjb2RpbmcgdGhlIGVuY3J5cHRlZCBzdHJlYW0gYXQgdGhhdCBwb2ludC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJVSUxULUlOIG1vZGVzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLS0gQXV0b21hdGljIEZpbmRpbmcgb2YgVXNlciBYIFNlc3Npb25zIC0tXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBcyBhIHNwZWNpYWwgY2FzZSwgV0FJVDpjbWQ9RklORERJU1BMQVkgd2lsbCBydW4gYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0IHRoYXQgd29ya3Mgb24gbW9zdCBVbml4ZXMgdG8gZGV0ZXJtaW5lIGEgdXNlcidzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBESVNQTEFZIHZhcmlhYmxlIGFuZCB4YXV0aG9yaXR5IGRhdGEgKHNlZSB3aG8oMSkpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVGhlIG9wdGlvbiBcIi1maW5kXCIgaXMgYW4gYWxpYXMgZm9yIHRoaXMgbW9kZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGhhdmUgdGhpcyBkZWZhdWx0IHNjcmlwdCBwcmludGVkIHRvIHN0ZG91dCAoZS5nLiBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb24pIHJ1biB3aXRoIFdBSVQ6Y21kPUZJTkRESVNQTEFZLXByaW50IFRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRoZSBzY3JpcHQgcnVuIHRvIHByaW50IHdoYXQgZGlzcGxheSBpdCB3b3VsZCBmaW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgXCItZmluZGRweVwiIG9yIFdBSVQ6Y21kPUZJTkRESVNQTEFZLXJ1blxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0YW5kYXJkIHNjcmlwdCBydW5zIHhkcHlpbmZvKDEpIHJ1biBvbiBwb3RlbnRpYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlzLiAgSWYgeW91ciBYIHNlcnZlcihzKSBoYXZlIGEgbG9naW4gZ3JlZXRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBleGNsdXNpdmVseSBncmFicyB0aGUgWHNlcnZlciwgdGhlbiB4ZHB5aW5mb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIGZvcmV2ZXIgYW5kIHRoaXMgbW9kZSB3aWxsIG5vdCB3b3JrLiAgU2VlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWRpc3BsYXktbWFuYWdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGhvdyB0byBkaXNhYmxlIHRoaXMgZm9yIGR0Z3JlZXQgb24gU29sYXJpcyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZvciBvdGhlciBncmVldGVycy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIC1maW5kL2NtZD1GSU5ERElTUExBWSBtb2RlLCBpZiB5b3Ugc2V0IEZEX1hETT0xLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAneDExdm5jIC1lbnYgRkRfWERNPTEgLWZpbmQgLi4uJyBhbmQgeDExdm5jIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIGFzIHJvb3QgKGUuZy4gaW5ldGQpIHRoZW4gaXQgd2lsbCB0cnkgdG8gZmluZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFhBVVRIT1JJVFkgZmlsZSBvZiBhIHJ1bm5pbmcgWERNL0dETS9LRE0gbG9naW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyZWV0ZXIgKGkuZS4gbm8gdXNlciBoYXMgbG9nZ2VkIGludG8gYW4gWCBzZXNzaW9uIHlldC4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBcyBhbm90aGVyIHNwZWNpYWwgY2FzZSwgV0FJVDpjbWQ9SFRUUE9OQ0Ugd2lsbCBhbGxvd1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHRvIHNlcnZpY2Ugb25lIGh0dHAgcmVxdWVzdCBhbmQgdGhlbiBleGl0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW4gLWluZXRkIG1vZGUgdG8gcnVuIG9uLCBzYXksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb3J0IDU4MDAgYW5kIGFsbG93IHRoZSBKYXZhIHZuY3ZpZXdlciB0byBiZSBkb3dubG9hZGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBieSBjbGllbnQgd2ViIGJyb3dzZXJzLiAgRm9yIGV4YW1wbGU6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgNTgxNSBzdHJlYW0gdGNwIG5vd2FpdCByb290IC91c3Ivc2Jpbi90Y3BkIC8uLi4veDExdm5jIFxcXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgLXEgLWh0dHBfc3NsIC1wcm9nIC8uLi4veDExdm5jIFxcXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAtZGlzcGxheSBXQUlUOmNtZD1IVFRQT05DRVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2hlcmUgLy4uLi94MTF2bmMgaXMgdGhlIGZ1bGwgcGF0aCB0byB4MTF2bmMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIGluIHRoZSBBcGFjaGUgU1NMLXBvcnRhbCBleGFtcGxlIChzZWUgRkFRKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgbW9kZSB5b3UgY2FuIHNldCBYMTFWTkNfU0tJUF9ESVNQTEFZIHRvIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRpc3BsYXlzIChlLmcuIFwiOjAsOjFcIikgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpbiB0aGUgZmluZGluZyBwcm9jZXNzLiAgVGhlIFwiOlwiIGlzIG9wdGlvbmFsLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2VzIG4tbSBlLmcuIDAtMjAgY2FuIGFsc28gYmUgc3VwcGxpZWQuIFRoaXMgc3RyaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBzZXQgYnkgdGhlIGNvbm5lY3RpbmcgdXNlciB2aWEgXCJuZD1cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgXCIrXCIgaW5zdGVhZCBvZiBcIixcIiAgSWYgXCJuZD1hbGxcIiBvciB5b3Ugc2V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfU0tJUF9ESVNQTEFZPWFsbCB0aGVuIGFsbCBkaXNwbGF5IGZpbmRpbmcgZmFpbHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIGlmIHlvdSBzZXQgWDExVk5DX0ZJTkRESVNQTEFZX0FMV0FZU19GQUlMUz0xIChiZWxvdy4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPbiBzb21lIHN5c3RlbXMgbHNvZigxKSBjYW4gYmUgdmVyeSBzbG93LiAgU2V0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW52LiB2YXIuIEZJTkRfRElTUExBWV9OT19MU09GPTEgdG8gc2tpcCB1c2luZyBsc29mIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZmluZCB0aGUgTGludXggVlQgdGhlIFggc2VydmVyIGlzIHJ1bm5pbmcgb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXQgRklORF9ESVNQTEFZX05PX1ZUX0ZJTkQ9MSB0byBhdm9pZCBsb29raW5nIGF0IGFsbC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC0tIEF1dG9tYXRpYyBDcmVhdGlvbiBvZiBVc2VyIFggU2Vzc2lvbnMgLS1cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFuIGludGVyZXN0aW5nIG9wdGlvbiBpcyBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpcyBsaWtlIEZJTkRESVNQTEFZIGluIHRoYXQgaXMgdXNlcyB0aGUgc2FtZSBtZXRob2RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmQgYW4gZXhpc3RpbmcgZGlzcGxheS4gIEhvd2V2ZXIsIGlmIGl0IGRvZXMgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaW5kIG9uZSBpdCB3aWxsIHRyeSB0byAqc3RhcnQqIHVwIGFuIFggc2VydmVyIHNlc3Npb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIG9ubHkgdGltZSB4MTF2bmMgdHJpZXMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IHN0YXJ0IHVwIGFuIFggc2VydmVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVGhlIG9wdGlvbiBcIi1jcmVhdGVcIiBpcyBhbiBhbGlhcyBmb3IgdGhpcyBtb2RlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSXQgd2lsbCBzdGFydCBsb29raW5nIGZvciBhbiBvcGVuIGRpc3BsYXkgbnVtYmVyIGF0IDoyMFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGUgdmlhIFgxMVZOQ19DUkVBVEVfU1RBUlRJTkdfRElTUExBWV9OVU1CRVI9blxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCA4MCBYIGRpc3BsYXlzIGFyZSBhbGxvd2VkIChpLmUuIGdvaW5nIHRvIDo5OSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRlIHZpYSBYMTFWTkNfQ1JFQVRFX01BWF9ESVNQTEFZUz1uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgaXRzIGhldXJpc3RpY3MsIHRoZSBjcmVhdGUgZGlzcGxheSBzY3JpcHQgc2V0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTENfQUxMPUMgc28gdGhhdCBjb21tYW5kIG91dHB1dCBpcyB1bmlmb3JtLiAgQnkgZGVmYXVsdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCB0cnkgdG8gcmVzdG9yZSBMQ19BTEwgcmlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBzZXNzaW9uLiAgSG93ZXZlciwgaWYgeW91IGRvbid0IG1pbmQgaXQga2VlcGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTENfQUxMPUMgc2V0IHRoZSBlbnYuIHZhci46IFgxMVZOQ19DUkVBVEVfTENfQUxMX0NfT0s9MVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBGSU5EQ1JFQVRFRElTUExBWSB3aWxsIHRyeSBYdmZiIGFuZCB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYZHVtbXk6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgWGR1bW15IHdyYXBwZXIgaXMgcGFydCBvZiB0aGUgeDExdm5jIHNvdXJjZSBjb2RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoeDExdm5jL21pc2MvWGR1bW15KSAgSXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBQQVRIXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgaGF2ZSBydW4gXCJYZHVtbXkgLWluc3RhbGxcIiBvbmNlIHRvIGNyZWF0ZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCBsaWJyYXJ5LiAgWGR1bW15IG9ubHkgd29ya3Mgb24gTGludXguICBBcyBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMTIvMjAwOSBpdCBubyBsb25nZXIgbmVlZHMgdG8gYmUgcnVuIGFzIHJvb3QsIGFuZCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdG8gbm90IHJ1biBhcyByb290LiAgSW4gc29tZSBjaXJjdW1zdGFuY2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyBtYXkgcmVxdWlyZSBydW5uaW5nIGl0IGFzIHJvb3QsIGluIHRoZXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBzcGVjaWZ5IEZEX1hEVU1NWV9SVU5fQVNfUk9PVD0xLCB0aGlzIGlzIHRoZSBzYW1lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBzdXBwbHlpbmcgLXJvb3QgdG8gdGhlIFhkdW1teSBjbWRsaW5lLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWHZmYiBpcyBhdmFpbGFibGUgb24gbW9zdCBwbGF0Zm9ybXMgYW5kIGRvZXMgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlIHJvb3QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbiBhZHZhbnRhZ2Ugb2YgWGR1bW15IG92ZXIgWHZmYiBpcyB0aGF0IFhkdW1teSBzdXBwb3J0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkFORFIgZHluYW1pYyBzY3JlZW4gcmVzaXppbmcuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHgxMXZuYyBleGl0cyAoaS5lLiB1c2VyIGRpc2Nvbm5lY3RzKSB0aGUgWFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24gc3RheXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBGSU5ERElTUExBWSB3aWxsIGZpbmQgaXQgZGlyZWN0bHkgbmV4dCB0aW1lLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbXVzdCBleGl0IHRoZSBYIHNlc3Npb24gaW4gdGhlIHVzdWFsIHdheSBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIHRlcm1pbmF0ZSAob3Iga2lsbCB0aGUgWCBzZXJ2ZXIgcHJvY2VzcyBpZiBhbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZmFpbHMpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gdHJvdWJsZXNob290IHRoZSBGSU5EQ1JFQVRFRElTUExBWSBtZWNoYW5pc20sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIGZvbGxvd2luZyBlbnYuIHZhci4gdG8gYW4gb3V0cHV0IGxvZyBmaWxlLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZS5nIC1lbnYgQ1JFQVRFX0RJU1BMQVlfT1VUUFVUPS90bXAvbXlkZWJ1Zy50eHRcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIHRoaXMgaXMgYSBzb21ld2hhdCBvZGQgbW9kZSBmb3IgeDExdm5jIGluIHRoYXQgaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RhcnQgdXAgYW5kIHBvbGwgdmlydHVhbCBYIHNlcnZlcnMhICBUaGlzIGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBmcm9tLCBzYXksIGluZXRkKDgpIHRvIHByb3ZpZGUgYSBtZWFucyBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGVseSBnZXR0aW5nIGEgZGVza3RvcCAoZWl0aGVyIHJlYWwgb3IgdmlydHVhbClcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtYWNoaW5lLiAgRS5nLiBhIGRlc2t0b3Agc2VydmljZTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgNTkwMCBzdHJlYW0gdGNwIG5vd2FpdCByb290IC91c3Ivc2Jpbi90Y3BkIC8uLi4veDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgLXEgLWh0dHAgLXNzbCBTQVZFIC11bml4cHcgLXVzZXJzIHVuaXhwdz1cXFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgLXBhc3N3ZCBzZWNyZXQgLXByb2cgLy4uLi94MTF2bmMgXFxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXaGVyZSAvLi4uL3gxMXZuYyBpcyB0aGUgZnVsbCBwYXRoIHRvIHgxMXZuYy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgLXN2Yy8tc2VydmljZSBvcHRpb24gYWxpYXMgYWJvdmUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBmb3Igc29tZSByZWFzb24geW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBldmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBkaXNwbGF5IHNldCB0aGUgZW52LiB2YXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFM9MSAoYWxzbyAtZW52IC4uLilcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgc2V0dGluZyBYMTFWTkNfU0tJUF9ESVNQTEFZPWFsbCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5aW5nIFwibmQ9YWxsXCIgYWZ0ZXIgXCJ1c2VybmFtZTpcIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLXByaW50IHRvIHByaW50IG91dCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCB0aGF0IGlzIHVzZWQgZm9yIHRoaXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdGhlIHByZWZlcnJlZCBYIHNlcnZlciBvcmRlciB2aWEgZS5nLixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVhkdW1teSxYdmZiLFggIGFuZC9vciBsZWF2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3V0IG9uZXMgeW91IGRvIG5vdCB3YW50LiAgVGhlIHRoZSBjYXNlIFwiWFwiIG1lYW5zIHRyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQgdXAgYSByZWFsLCBoYXJkd2FyZSBYIHNlcnZlciB1c2luZyB4aW5pdCgxKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3Igc3RhcnR4KDEpLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBYIHNlcnZlciBydW5uaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgWCBjYXNlIG1heSBvbmx5IHdvcmsgb24gTGludXggKHNlZSBzdGFydHgoMSkpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJYdm5jXCIgd2lsbCBzdGFydCB1cCBhIFZOQyBYIHNlcnZlciAocmVhbC1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIHRpZ2h0LXZuYywgZS5nLiB1c2UgaWYgWHZmYiBpcyBub3QgYXZhaWxhYmxlKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiWHNydlwiIHdpbGwgc3RhcnQgdXAgdGhlIHNlcnZlciBwcm9ncmFtIGluIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgXCJGRF9YU1JWXCIgaWYgaXQgaXMgbm9uLWVtcHR5LiBZb3UgY2FuIG1ha2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmUgYSB3cmFwcGVyIHNjcmlwdCBpZiB5b3UgbGlrZSAoaXQgbXVzdCBoYW5kbGUgOk4sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZ2VvbWV0cnksIGFuZCAtZGVwdGggYW5kIG90aGVyIFggc2VydmVyIG9wdGlvbnMpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEZEX0dFT00gKG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfQ1JFQVRFX0dFT00pIHRvIFd4SCBvciBXeEh4RCB0byBzZXQgdGhlIHdpZHRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgaGVpZ2h0IGFuZCBvcHRpb25hbGx5IHRoZSBjb2xvciBkZXB0aCBvZiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgZGlzcGxheS4gIFlvdSBjYW4gYWxzbyBzZXQgRkRfU0VTUyB0byBiZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gKHNob3J0IG5hbWUgb2YgdGhlIHdpbmRvd21hbmFnZXI6IGtkZSwgZ25vbWUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0d20sIGZhaWxzYWZlLCBldGMuKS4gRkRfT1BUUyBjb250YWlucyBleHRyYSBvcHRpb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBYIHNlcnZlci4gWW91IGNhbiBhbHNvIHNldCBGRF9QUk9HIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzZXNzaW9uL3dpbmRvd21hbmFnZXIgcHJvZ3JhbS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1vcmUgRkQgdHJpY2tzOiAgRkRfQ1VQUz1wb3J0IG9yIEZEX0NVUFM9aG9zdDpwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgY3VwcyBwcmludGluZyBlbnZpcm9ubWVudC4gIFNpbWlsYXJseSBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZEX0VTRD1wb3J0IG9yIEZEX0VTRD1ob3N0OnBvcnQgZm9yIGVzZGRzcCBzb3VuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb24uICBTZXQgRkRfRVhUUkEgdG8gYSBjb21tYW5kIHRvIGJlIHJ1biBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmZXcgc2Vjb25kcyBhZnRlciB0aGUgWCBzZXJ2ZXIgc3RhcnRzIHVwLiAgU2V0IEZEX1RBR1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlc3Npb24sIGl0IGlzIHNldCBhcyBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWCBwcm9wZXJ0eSwgdGhhdCBtYWtlcyBGSU5ERElTUExBWSBvbmx5IGZpbmQgc2Vzc2lvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhhdCB0YWcgdmFsdWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgRkRfWERNQ1BfSUYgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXIgaXMgcnVubmluZyBvbjsgZGVmYXVsdCBpcyAnbG9jYWxob3N0J1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYnV0IHlvdSBtYXkgbmVlZCB0byBzZXQgaXQgdG8gJzo6MScgb24gc29tZSBJUHY2IG9ubHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbXMgb3IgbWlzY29uZmlndXJlZCBkaXNwbGF5IG1hbmFnZXJzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdGhlIEZJTkRDUkVBVEVESVNQTEFZIHNlc3Npb24gdG8gY29udGFjdCBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWERNQ1AgbG9naW4gbWFuYWdlciAoeGRtL2dkbS9rZG0pIG9uIHRoZSBzYW1lIG1hY2hpbmUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHVzZSBcIlh2ZmIueGRtY3BcIiBpbnN0ZWFkIG9mIFwiWHZmYlwiLCBldGMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc3VwcGx5IGhpcyB1c2VybmFtZSBhbmQgcGFzc3dvcmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtb3JlIHRpbWUgKGJ1dCBoZSBnZXRzIHRvIHNlbGVjdCBoaXMgZGVza3RvcCB0eXBlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGNhbiBiZSB1c2VmdWwpLiAgRm9yIHRoaXMgdG8gd29yaywgeW91IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gZW5hYmxlIGxvY2FsaG9zdCBYRE1DUCAodWRwIHBvcnQgMTc3KSBmb3IgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXIuICBUaGlzIHNlZW1zIHRvIGJlOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZG0gaW4gZ2RtLmNvbmY6ICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbeGRtY3BdXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtkbSBpbiBrZG1yYzogICAgICBFbmFibGU9dHJ1ZSBpbiBzZWN0aW9uIFtYZG1jcF1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeGRtIGluIHhkbS1jb25maWc6IERpc3BsYXlNYW5hZ2VyLnJlcXVlc3RQb3J0OiAxNzdcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgc2hvcnRoYW5kIG9wdGlvbnMgYWJvdmUgXCItc3ZjXCIsIFwiLXhkbXN2Y1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgXCItc3NoeGRtc3ZjXCIgdGhhdCBzcGVjaWZ5IHRoZSBhYm92ZSBvcHRpb25zIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29tZSB1c2VmdWwgY2FzZXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugc2V0IHRoZSBlbnYuIHZhciBXQUlUQkc9MSB4MTF2bmMgd2lsbCBnbyBpbnRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBvbmNlIGxpc3RlbmluZyBpbiB3YWl0IG1vZGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIHNwZWNpYWwgbW9kZSBpcyBGSU5EQ1JFQVRFRElTUExBWS1Ydm5jLnJlZGlyZWN0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKG9yIEZJTkRESVNQTEFZLVh2bmMucmVkaXJlY3QpLiAgSW4gdGhpcyBjYXNlIGl0IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHVwIFh2bmMgYXMgYWJvdmUgaWYgbmVlZGVkLCBidXQgaW5zdGVhZCBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9sbGluZyBpdCBpbiBpdHMgbm9ybWFsIHdheSwgaXQgc2ltcGx5IGRvZXMgYSBzb2NrZXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uIG9mIHRoZSBjb25uZWN0ZWQgVk5DIHZpZXdlciB0byB0aGUgWHZuYy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIGluIFh2bmMucmVkaXJlY3QgeDExdm5jIGRvZXMgbm8gVk5DIGJ1dCBtZXJlbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycyB0aGUgZGF0YSBiYWNrIGFuZCBmb3J0aC4gIFRoaXMgc2hvdWxkIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmYXN0ZXIgdGhlbiB4MTF2bmMncyBwb2xsaW5nIG1ldGhvZCwgYnV0IG5vdCBhcyBmYXN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBjb25uZWN0aW5nIGRpcmVjdGx5IHRvIHRoZSBYdm5jIHdpdGggdGhlIFZOQyBWaWV3ZXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgaWRlYSBoZXJlIGlzIHRvIHRha2UgYWR2YW50YWdlIG9mIHgxMXZuYydzIGRpc3BsYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmcvY3JlYXRpbmcgc2NoZW1lLCBTU0wsIGFuZCBwZXJoYXBzIGEgZmV3IG90aGVycy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1vc3Qgb2YgeDExdm5jJ3Mgb3B0aW9ucyBkbyBub3QgYXBwbHkgaW4gdGhpcyBtb2RlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWHZuYy5yZWRpcmVjdCBzaG91bGQgYWxzbyB3b3JrIGZvciB0aGUgdm5jLnNvIFggc2VydmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgZm9yIHRoZSBoL3cgZGlzcGxheSBob3dldmVyIGl0IHdpbGwgd29yayBvbmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmluZGluZyB0aGUgZGlzcGxheSBhbmQgdGhlIHVzZXIgbXVzdCBhbHJlYWR5IGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWQgaW50byB0aGUgWCBjb25zb2xlLlxuIgotIlxuIgotIi12ZW5jcnlwdCBtb2RlICAgICAgICAgVGhlIFZlTkNyeXB0IGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIFNTTC9UTFMgY29ubmVjdGlvbnMuICBJZiB0aGUgLXNzbCBtb2RlIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCB0aGVuIFZlTkNyeXB0IGlzIGVuYWJsZWQgYXMgd2VsbCBCWSBERUZBVUxUXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodGhleSBib3RoIHVzZSBhIFNTTC9UTFMgdHVubmVsLCBvbmx5IHRoZSBwcm90b2NvbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBjb250cm9sIHdoZW4gYW5kIGhvdyBWZU5DcnlwdCBpcyB1c2VkLCBzcGVjaWZ5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBzdHJpbmcuICBJZiBtb2RlIGlzIFwibmV2ZXJcIiwgdGhlbiBWZU5DcnlwdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90IHVzZWQuICBJZiBtb2RlIGlzIFwic3VwcG9ydFwiICh0aGUgZGVmYXVsdCkgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVmVOQ3J5cHQgaXMgc3VwcG9ydGVkLiAgSWYgbW9kZSBpcyBcIm9ubHlcIiwgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpbWlsYXIgYW5kIG9sZGVyIEFOT05UTFMgcHJvdG9jb2wgaXMgbm90IHNpbXVsdGFuZW91c2x5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuICB4MTF2bmMncyBub3JtYWwgU1NMIG1vZGUgKHZuY3M6Ly8pIHdpbGwgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCB1bmRlciAtc3NsIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gXCJmb3JjZVwiLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgbW9kZSBpcyBwcmVmaXhlZCB3aXRoIFwibm9kaDpcIiwgdGhlbiBEaWZmaWUgSGVsbG1hblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzIGtleSBleGNoYW5nZSBpcyBkaXNhYmxlZC4gIElmIG1vZGUgaXMgcHJlZml4ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggXCJub3g1MDk6XCIsIHRoZW4gWDUwOSBrZXkgZXhjaGFuZ2UgaXMgZGlzYWJsZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBkaXNhYmxlIGFsbCBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gYWNjZXNzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrKSB5b3Ugd2lsbCBuZWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBzdXBwbHkgXCItdmVuY3J5cHQgbm9kaDpzdXBwb3J0IC1hbm9udGxzIG5ldmVyXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIFwiLXZlbmNyeXB0IG5vZGg6b25seVwiXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggXCJuZXdkaDpcIiwgdGhlbiBuZXcgRGlmZmllXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBIZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBjYW4gYmUgdGltZSBjb25zdW1pbmc6IDEtNjAgc2Vjczsgc2VlIC1kaHBhcmFtc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgZm9yIGEgZmFzdGVyIHdheSkgcmF0aGVyIHRoYW4gdXNpbmcgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtub3duIHZhbHVlcyBpcyBub3Qga25vd24gdG8gYmUgYSBzZWN1cml0eSBwcm9ibGVtLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGFwcGxpZXMgdG8gQU5PTlRMUyBhcyB3ZWxsLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTG9uZyBleGFtcGxlOiAtdmVuY3J5cHQgbmV3ZGg6bm94NTA5OnN1cHBvcnRcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFsc28sIGlmIG1vZGUgaXMgcHJlZml4ZWQgd2l0aCBcInBsYWluOlwiLCB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiAtdW5peHB3IG1vZGUgaXMgYWN0aXZlIHRoZSBWZU5DcnlwdCBcIipQbGFpblwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZStwYXNzd2QgbWV0aG9kIGlzIGVuYWJsZWQgZm9yIFVuaXggbG9naW5zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIGluIC11bml4cHcgbW9kZSB0aGUgbm9ybWFsIGxvZ2luIHBhbmVsIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSAqTVVTVCogc3VwcGx5IHRoZSAtc3NsIG9wdGlvbiBmb3IgVmVOQ3J5cHQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIGFjdGl2ZS4gIFRoZSAtdmVuY3J5cHQgb3B0aW9uIG9ubHkgZmluZS10dW5lcyBpdHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5cbiIKLSJcbiIKLSItYW5vbnRscyBtb2RlICAgICAgICAgIFRoZSBBTk9OVExTIGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIFNTTC9UTFMgY29ubmVjdGlvbnMuICBJZiB0aGUgLXNzbCBtb2RlIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCB0aGVuIEFOT05UTFMgaXMgZW5hYmxlZCBhcyB3ZWxsIEJZIERFRkFVTFRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh0aGV5IGJvdGggdXNlIGEgU1NML1RMUyB0dW5uZWwsIG9ubHkgdGhlIHByb3RvY29sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UgaXMgYSBsaXR0bGUgZGlmZmVyZW50LilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFOT05UTFMgaXMgYW4gb2xkZXIgU1NML1RMUyBtb2RlIGludHJvZHVjZWQgYnkgdmluby5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHJlZmVycmVkIHRvIGFzICdUTFMnIGZvciBpdHMgcmVnaXN0ZXJlZCBWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5LXR5cGUgbmFtZSwgYnV0IHdlIHVzZSB0aGUgbW9yZSBkZXNjcmlwdGl2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgJ0FOT05UTFMnIGhlcmUgYmVjYXVzZSBpdCBwcm92aWRlcyBvbmx5IEFub255bW91c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRGlmZmllLUhlbGxtYW4gZW5jcnlwdGVkIGNvbm5lY3Rpb25zLCBhbmQgaGVuY2Ugbm9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGZvciBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGNvbnRyb2wgd2hlbiBhbmQgaG93IEFOT05UTFMgaXMgdXNlZCwgc3BlY2lmeSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgc3RyaW5nLiAgSWYgbW9kZSBpcyBcIm5ldmVyXCIsIHRoZW4gQU5PTlRMUyBpcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBJZiBtb2RlIGlzIFwic3VwcG9ydFwiICh0aGUgZGVmYXVsdCkgdGhlbiBBTk9OVExTXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQuICBJZiBtb2RlIGlzIFwib25seVwiLCB0aGVuIHRoZSBzaW1pbGFyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWZU5DcnlwdCBwcm90b2NvbCBpcyBub3Qgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jJ3Mgbm9ybWFsIFNTTCBtb2RlICh2bmNzOi8vKSB3aWxsIGJlIHN1cHBvcnRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgLXNzbCB1bmxlc3MgeW91IHNldCBtb2RlIHRvIFwiZm9yY2VcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIG1vZGUgaXMgcHJlZml4ZWQgd2l0aCBcIm5ld2RoOlwiLCB0aGVuIG5ldyBEaWZmaWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhlbGxtYW4gcGFyYW1ldGVycyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIGNvbm5lY3Rpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZzogMS02MCBzZWNzOyBzZWUgLWRocGFyYW1zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyBmb3IgYSBmYXN0ZXIgd2F5KSByYXRoZXIgdGhhbiB1c2luZyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIHZhbHVlcyBpbiB0aGUgcHJvZ3JhbS4gIFVzaW5nIGZpeGVkLCBwdWJsaWNseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga25vd24gdmFsdWVzIGlzIG5vdCBrbm93biB0byBiZSBhIHNlY3VyaXR5IHByb2JsZW0uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgYXBwbGllcyB0byBWZU5DcnlwdCBhcyB3ZWxsLiAgU2VlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgXCJwbGFpbjpcIiB1bmRlciAtdmVuY3J5cHQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMb25nIGV4YW1wbGU6IC1hbm9udGxzIG5ld2RoOnBsYWluOnN1cHBvcnRcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSAqTVVTVCogc3VwcGx5IHRoZSAtc3NsIG9wdGlvbiBmb3IgQU5PTlRMUyB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgYWN0aXZlLiAgVGhlIC1hbm9udGxzIG9wdGlvbiBvbmx5IGZpbmUtdHVuZXMgaXRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uXG4iCi0iXG4iCi0iLXNzbG9ubHkgICAgICAgICAgICAgICBTYW1lIGFzOiBcIi12ZW5jcnlwdCBuZXZlciAtYW5vbnRscyBuZXZlclwiICBpLmUuIGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlcyB0aGUgVmVOQ3J5cHQgYW5kIEFOT05UTFMgZW5jcnlwdGlvbiBtZXRob2RzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgb25seSBhbGxvd3Mgc3RhbmRhcmQgU1NMIHR1bm5lbGluZy4gIFlvdSBtdXN0IGFsc29cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB0aGUgLXNzbCAuLi4gb3B0aW9uIChzZWUgYmVsb3cuKVxuIgotIlxuIgotIlxuIgotIi1kaHBhcmFtcyBmaWxlICAgICAgICAgRm9yIHNvbWUgb3BlcmF0aW9ucyBhIHNldCBvZiBEaWZmaWUgSGVsbG1hbiBwYXJhbWV0ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAocHJpbWUgYW5kIGdlbmVyYXRvcikgaXMgbmVlZGVkLiAgSWYgc28sIHVzZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gXCJmaWxlXCIuIEluIHBhcnRpY3VsYXIsIHRoZSBWZU5DcnlwdCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFOT05UTFMgYW5vbnltb3VzIERIIG1vZGUgbmVlZCB0aGVtLiAgQnkgZGVmYXVsdCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCBzZXQgaXMgdXNlZC4gSWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoYXQgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjYW4gc3BlY2lmeSBcIm5ld2RoOlwiIHRvIHRoZSAtdmVuY3J5cHQgYW5kIC1hbm9udGxzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHRvIGdlbmVyYXRlIGEgbmV3IHNldCBlYWNoIHNlc3Npb24uICBJZiB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB0b28gc2xvdyBmb3IgeW91LCB1c2UgLWRocGFyYW1zIGZpbGUgdG8gYSBzZXQgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIG1hbnVhbGx5IHZpYSBcIm9wZW5zc2wgZGhwYXJhbSAtb3V0IGZpbGUgMTAyNFwiXG4iCi0iXG4iCi0iLW5vc3NsICAgICAgICAgICAgICAgICBEaXNhYmxlIHRoZSAtc3NsIG9wdGlvbiAoc2VlIGJlbG93KS4gU2luY2UgLXNzbCBpcyBvZmZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ5IGRlZmF1bHQgLW5vc3NsIHdvdWxkIG9ubHkgYmUgdXNlZCBvbiB0aGUgY29tbWFuZGxpbmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHVuc2V0IGFueSAqZWFybGllciogLXNzbCBvcHRpb24gKG9yIC1zdmMuLi4pXG4iCi0iXG4iCi0iLXNzbCBbcGVtXSAgICAgICAgICAgICBVc2UgdGhlIG9wZW5zc2wgbGlicmFyeSAod3d3Lm9wZW5zc2wub3JnKSB0byBwcm92aWRlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0LWluIGVuY3J5cHRlZCBTU0wvVExTIHR1bm5lbCBiZXR3ZWVuIFZOQyB2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgeDExdm5jLiAgVGhpcyByZXF1aXJlcyBsaWJzc2wgc3VwcG9ydCB0byBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQgaW50byB4MTF2bmMgYXQgYnVpbGQgdGltZS4gIElmIHgxMXZuYyBpcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0IHdpdGggbGlic3NsIHN1cHBvcnQgaXQgd2lsbCBleGl0IGltbWVkaWF0ZWx5IHdoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1zc2wgaXMgcHJlc2NyaWJlZC4gIFNlZSB0aGUgLXN0dW5uZWwgb3B0aW9uIGJlbG93IGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW4gYWx0ZXJuYXRpdmUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk5DIFZpZXdlci1zaWRlIG5lZWRzIHRvIHN1cHBvcnQgU1NML1RMUyBhcyB3ZWxsLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoaXMgVVJMIGFuZCBhbHNvIHRoZSBkaXNjdXNzaW9uIGJlbG93IGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWRlYXMgb24gaG93IHRvIGVuYWJsZSBTU0wgc3VwcG9ydCBmb3IgdGhlIHZpZXdlcjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC10dW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lbC12aWV3ZXJzIC4gIHgxMXZuYyBwcm92aWRlcyBhbiBTU0wgZW5hYmxlZCBKYXZhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIgYXBwbGV0IGluIHRoZSBjbGFzc2VzL3NzbCBkaXJlY3RvcnkgKC1odHRwIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciBvcHRpb25zLikgIFRoZSBTU1ZOQyB2aWV3ZXIgcGFja2FnZSBzdXBwb3J0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU1NMIHR1bm5lbHMgdG9vLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIFZOQyBWaWV3ZXIgc3VwcG9ydHMgVmVOQ3J5cHQgb3IgQU5PTlRMUyAodmlubydzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uIG1vZGUpIHRoZXkgYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoZSAtc3NsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2RlIChzZWUgdGhlIC12ZW5jcnlwdCBhbmQgLWFub250bHMgb3B0aW9ucyBmb3IgbW9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5mbzsgdXNlIC1zc2xvbmx5IHRvIGRpc2FibGUgYm90aCBvZiB0aGVtLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZSBcIi1zc2wgL3BhdGgvdG8vbXljZXJ0LnBlbVwiIHRvIHNwZWNpZnkgYW4gU1NMXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSBmaWxlIGluIFBFTSBmb3JtYXQgdG8gdXNlIHRvIGlkZW50aWZ5IGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBhIGtleSBmb3IgdGhpcyBzZXJ2ZXIuICBTZWUgb3BlbnNzbCgxKSBmb3IgbW9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5mbyBhYm91dCBQRU1zIGFuZCB0aGUgLXNzbEdlbkNlcnQgYW5kIFwiLXNzbCBTQVZFXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYmVsb3cgZm9yIGhvdyB0byBjcmVhdGUgdGhlbS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb25uZWN0aW5nIFZOQyB2aWV3ZXIgU1NMIHR1bm5lbCBjYW4gKGF0IGl0cyBvcHRpb24pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUgdGhpcyBzZXJ2ZXIgaWYgaXQgaGFzIHRoZSBwdWJsaWMga2V5IHBhcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjZXJ0aWZpY2F0ZSAob3IgYSBjb21tb24gY2VydGlmaWNhdGUgYXV0aG9yaXR5LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ0EsIGlzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHdheSB0byB2ZXJpZnkgdGhpcyBzZXJ2ZXInc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2VydCwgc2VlIC1zc2xHZW5DQSBiZWxvdykuICBUaGlzIGF1dGhlbnRpY2F0aW9uIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb25lIHRvIHByZXZlbnQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIE90aGVyd2lzZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBWTkMgdmlld2VyIHNpbXBseSBhY2NlcHRzIHRoaXMgc2VydmVyJ3Mga2V5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXSVRIT1VUIHZlcmlmaWNhdGlvbiwgdGhlIHRyYWZmaWMgaXMgcHJvdGVjdGVkIGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBhc3NpdmUgc25pZmZpbmcgb24gdGhlIG5ldHdvcmssIGJ1dCAqTk9UKiBmcm9tXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiBUaGVyZSBhcmUgaGFja2VyIHRvb2xzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaWtlIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluIHRoYXQgaW1wbGVtZW50IFNTTFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzIGVtcHR5IG9yIHRoZSBzdHJpbmcgXCJTQVZFXCIgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zc2woMSkgY29tbWFuZCBtdXN0IGJlIGF2YWlsYWJsZSB0byBnZW5lcmF0ZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHRoZSBmaXJzdCB0aW1lLiAgQSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIChzZWUgLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydCBmb3IgdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBhIENlcnRpZmljYXRlIEF1dGhvcml0eS4pICBJdCB3aWxsIGJlIHNhdmVkIHRvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB+Ly52bmMvY2VydHMvc2VydmVyLnBlbS4gIE9uIHN1YnNlcXVlbnQgY2FsbHMgaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHVzZWQgZGlyZWN0bHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgXCJTQVZFX05PUFJPTVBUXCIgdG8gYXZvaWQgYmVpbmcgcHJvbXB0ZWQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3QgdGhlIGdlbmVyYXRlZCBrZXkgd2l0aCBhIHBhc3NwaHJhc2UuICBIb3dldmVyIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgYW5kIC1iZyBtb2RlcyB0aGVyZSB3aWxsIGJlIG5vIHByb21wdGluZyBmb3IgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSBpbiBlaXRoZXIgY2FzZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzIFwiU0FWRV9QUk9NUFRcIiB0aGUgc2VydmVyLnBlbSBjZXJ0aWZpY2F0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHlvdXIgYW5zd2VycyB0byBpdHMgcHJvbXB0cyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsbCBpbmZvIHN1Y2ggYXMgT3JnYW5pemF0aW9uYWxOYW1lLCBDb21tb25OYW1lLCBldGMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgXCJTQVZFLTxzdHJpbmc+XCIgYW5kIFwiU0FWRV9QUk9NUFQtPHN0cmluZz5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVmZXIgdG8gdGhlIGZpbGUgfi8udm5jL2NlcnRzL3NlcnZlci08c3RyaW5nPi5wZW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgKGl0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0KS4gIEUuZy4gXCJTQVZFLWNoYXJsaWVcIiB3aWxsIHN0b3JlIHRvIHRoZSBmaWxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB+Ly52bmMvY2VydHMvc2VydmVyLWNoYXJsaWUucGVtXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczogeDExdm5jIC1zc2wgU0FWRSAtZGlzcGxheSA6MCAuLi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCBTQVZFLXNvbWVvdGhlciAtZGlzcGxheSA6MCAuLi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzIFwiVE1QXCIgYW5kIHRoZSBvcGVuc3NsKDEpIHV0aWxpdHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZXhpc3RzIGluIFBBVEgsIHRoZW4gYSB0ZW1wb3JhcnksIHNlbGYtc2lnbmVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBzZXNzaW9uLiAgSWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zc2woMSkgY2Fubm90IGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSB0ZW1wb3JhcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHgxMXZuYyBleGl0cyBpbW1lZGlhdGVseS4gIFRoZSB0ZW1wb3JhcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnQgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB4MTF2bmMgZXhpdHMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBzdWNjZXNzZnVsIGluIHVzaW5nIG9wZW5zc2woMSkgdG8gZ2VuZXJhdGUgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5IGNlcnRpZmljYXRlIGluIFwiU0FWRVwiIG9yIFwiVE1QXCIgY3JlYXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzLCB0aGUgcHVibGljIHBhcnQgb2YgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gc3RkZXJyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBvbmUgY291bGQgY29weSBpdCB0byB0aGUgY2xpZW50LXNpZGUgdG8gcHJvdmlkZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24gb2YgdGhlIHNlcnZlciB0byBWTkMgdmlld2Vycy4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBJbiBcIlRNUFwiIG1vZGUsIHVubGVzcyB5b3Ugc2FmZWx5IGNvcHkgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgcGFydCBvZiB0aGUgdGVtcG9yYXJ5IENlcnQgdG8gdGhlIHZpZXdlciBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSAqZXZlcnkgdGltZSogKHVubGlrZWx5Li4uKSwgdGhlbiBvbmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzaXZlIHNuaWZmaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZCBhbmQgeW91IGFyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgb3BlbiB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiAgVGhpcyBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2h5IHRoZSBkZWZhdWx0IFwiU0FWRVwiIG1vZGUgaXMgcHJlZmVycmVkIChhbmQgbW9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29waGlzdGljYXRlZCBDQSBtb2RlIHRvbykuICBPbmx5IHdpdGggc2F2ZWQga2V5cyBBTkRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBWTkMgdmlld2VyIGF1dGhlbnRpY2F0aW5nIHRoZW0gKHZpYSB0aGUgcHVibGljXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSksIGFyZSBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzIHByZXZlbnRlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzIFwiQU5PTlwiIHRoZW4gdGhlIERpZmZpZS1IZWxsbWFuIGFub255bW91c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5IGV4Y2hhbmdlIG1ldGhvZCBpcyB1c2VkLiAgSW4gdGhpcyBtb2RlIHRoZXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgKm5vKiBTU0wgY2VydGlmaWNhdGVzIGFuZCBzbyBpdCBpcyBub3QgcG9zc2libGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGF1dGhlbnRpY2F0ZSBlaXRoZXIgdGhlIFZOQyBzZXJ2ZXIgb3IgVk5DIGNsaWVudC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRodXMgb25seSBwYXNzaXZlIG5ldHdvcmsgc25pZmZpbmcgYXR0YWNrcyBhcmUgYXZvaWRlZDpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBcIkFOT05cIiBtZXRob2QgaXMgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF0dGFja3MuICBcIkFOT05cIiBpcyBub3QgcmVjb21tZW5kZWQ7IGluc3RlYWQgdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIFNTTCBQRU0geW91IGNyZWF0ZWQgb3IgdGhlIGRlZmF1bHQgXCJTQVZFXCIgbWV0aG9kLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1zc2xkaXIgYmVsb3cgdG8gdXNlIGEgZGlyZWN0b3J5IGJlc2lkZXMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IH4vLnZuYy9jZXJ0c1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91ciB4MTF2bmMgYmluYXJ5IHdhcyBub3QgY29tcGlsZWQgd2l0aCBPcGVuU1NMXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHN1cHBvcnQsIHVzZSBvZiB0aGUgLXNzbCBvcHRpb24gd2lsbCBpbmR1Y2UgYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZSBmYWlsdXJlIGFuZCBleGl0LiAgRm9yIHN1Y2ggYmluYXJpZXMsIGNvbnNpZGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgLXN0dW5uZWwgb3B0aW9uIGZvciBTU0wgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTWlzYyBJbmZvOiBJbiB0ZW1wb3JhcnkgY2VydCBjcmVhdGlvbiBtb2RlIFwiVE1QXCIsIHNldFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudi4gdmFyLiBYMTFWTkNfU0hPV19UTVBfUEVNPTEgdG8gaGF2ZSB4MTF2bmMgcHJpbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG91dCB0aGUgZW50aXJlIGNlcnRpZmljYXRlLCBpbmNsdWRpbmcgdGhlIFBSSVZBVEUgS0VZXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LCB0byBzdGRlcnIuICBUaGVyZSBhcmUgYmV0dGVyIHdheXMgdG8gZ2V0L3NhdmUgdGhpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5mby4gIFNlZSBcIlNBVkVcIiBhYm92ZSBhbmQgXCItc3NsR2VuQ2VydFwiIGJlbG93LlxuIgotIlxuIgotIi1zc2x0aW1lb3V0IG4gICAgICAgICAgU2V0IFNTTCByZWFkIHRpbWVvdXQgdG8gbiBzZWNvbmRzLiAgSW4gc29tZSBzaXR1YXRpb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBhbiBpY29uaWZpZWQgdmlld2VyIGluIFdpbmRvd3MpIHRoZSB2aWV3ZXIgc3RvcHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRhbGtpbmcgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYWZ0ZXIgdGhlIGRlZmF1bHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgKDI1cyBmb3IgYWJvdXQgdGhlIGZpcnN0IG1pbnV0ZSwgNDMyMDBzIGxhdGVyKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB6ZXJvIHRvIHBvbGwgZm9yZXZlci4gIFNldCB0byBhIG5lZ2F0aXZlIHZhbHVlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIGJ1aWx0aW4gc2V0dGluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGRvZXMgTk9UIGFwcGx5IHRvIHRoZSAqaW5pdGlhbCogc3NsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbml0IGNvbm5lY3Rpb24uICBUaGUgZGVmYXVsdCB0aW1lb3V0IGZvciB0aGF0IGlzIDIwc2VjLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1lbnYgU1NMX0lOSVRfVElNRU9VVD1uIHRvIG1vZGlmeSBpdC5cbiIKLSJcbiIKLSItc3Nsbm9mYWlsICAgICAgICAgICAgIEV4aXQgYXQgdGhlIGZpcnN0IFNTTCBjb25uZWN0aW9uIGZhaWx1cmUuIFVzZWZ1bCB3aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRpbmcgU1NMIGNvbm5lY3Rpb25zIChlLmcuIHgxMXZuYyBpcyBzdGFydGVkIHZpYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3NoKSBhbmQgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB3YWl0aW5nIGFyb3VuZCBmb3IgbW9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIHR5aW5nIHVwIHBvcnRzLCBldGMuXG4iCi0iXG4iCi0iLXNzbGRpciBkaXIgICAgICAgICAgICBVc2UgXCJkaXJcIiBhcyBhbiBhbHRlcm5hdGUgc3NsIGNlcnRpZmljYXRlIGFuZCBrZXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgdG9wbGV2ZWwgZGlyZWN0b3J5LiAgVGhlIGRlZmF1bHQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIH4vLnZuYy9jZXJ0c1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkaXJlY3RvcnkgaXMgdXNlZCB0byBzdG9yZSBzZXJ2ZXIgYW5kIG90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYW5kIGFsc28gb3RoZXIgbWF0ZXJpYWxzLiAgRS5nLiBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpbXBsZXN0IGNhc2UsIFwiLXNzbCBTQVZFXCIgd2lsbCBzdG9yZSB0aGUgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgY2VydCBpbiBkaXIvc2VydmVyLnBlbVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIG9mIGFsdGVybmF0ZSBkaXJlY3RvcmllcyB2aWEgLXNzbGRpciBhbGxvd3MgeW91IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgbXVsdGlwbGUgVk5DIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGtleXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIHVzZSBpcyBpZiB+Ly52bmMvY2VydCBpcyBvbiBhbiBORlMgc2hhcmUgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtaWdodCB3YW50IHlvdXIgY2VydGlmaWNhdGVzIGFuZCBrZXlzIHRvIGJlIG9uIGEgbG9jYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW0gdG8gcHJldmVudCBuZXR3b3JrIHNub29waW5nIChmb3IgZXhhbXBsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNzbGRpciAvdmFyL2xpYi94MTF2bmMtY2VydHMpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNzbGRpciBhZmZlY3RzIG5lYXJseSBhbGwgb2YgdGhlIG90aGVyIC1zc2wqIG9wdGlvbnMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIC1zc2wgU0FWRSwgLXNzbEdlbkNlcnQsIGV0Yy4uXG4iCi0iXG4iCi0iLXNzbHZlcmlmeSBwYXRoICAgICAgICBGb3IgZWl0aGVyIG9mIHRoZSAtc3NsIG9yIC1zdHVubmVsIG1vZGVzLCB1c2UgXCJwYXRoXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgY2VydGlmaWNhdGVzIHRvIGF1dGhlbnRpY2F0ZSBpbmNvbWluZyBWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICpDbGllbnQqIGNvbm5lY3Rpb25zIChub3JtYWxseSBvbmx5IHRoZSBzZXJ2ZXIgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgaW4gU1NMLikgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBtZXRob2RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlcGxhY2Ugc3RhbmRhcmQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gb2YgY2xpZW50cy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFwicGF0aFwiIGlzIGEgZGlyZWN0b3J5IGl0IGNvbnRhaW5zIHRoZSBjbGllbnQgKG9yIENBKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzIGluIHNlcGFyYXRlIGZpbGVzLiAgSWYgcGF0aCBpcyBhIGZpbGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBjb250YWlucyBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMuIFNlZSBzcGVjaWFsIHRva2Vuc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cuICBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBcIkNBcGF0aCA9IGRpclwiIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJDQWZpbGUgPSBmaWxlXCIgc3R1bm5lbCBvcHRpb25zLiAgU2VlIHRoZSBzdHVubmVsKDgpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYW5wYWdlIGZvciBkZXRhaWxzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2wgLXNzbHZlcmlmeSB+L215LmNydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgfi9teV9wZW1fZGlyL1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGlmIHBhdGggaXMgYSBkaXJlY3RvcnksIGl0IG11c3QgY29udGFpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlcnRzIGluIHNlcGFyYXRlIGZpbGVzIG5hbWVkIGxpa2UgPEhBU0g+LjAsIHdoZXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgPEhBU0g+IGlzIGZvdW5kIGJ5IHJ1bm5pbmcgdGhlIGNvbW1hbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwib3BlbnNzbCB4NTA5IC1oYXNoIC1ub291dCAtaW4gZmlsZS5jcnRcIi4gRXZpZGVudGx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmUgdXNlcyA8SEFTSD4uMSBpZiB0aGVyZSBpcyBhIGNvbGxpc2lvbi4uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRoZSBrZXktbWFuYWdlbWVudCB1dGlsaXR5IFwiLXNzbENlcnRJbmZvIEhBU0hPTlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgXCItc3NsQ2VydEluZm8gSEFTSE9GRlwiIHdpbGwgY3JlYXRlL2RlbGV0ZSB0aGVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzIGZvciB5b3UgYXV0b21hdGljYWxseSAodmlhIHN5bWxpbmspIGluIHRoZSBIQVNIXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJzIGl0IG1hbmFnZXMuICBUaGVuIHlvdSBjYW4gcG9pbnQgLXNzbHZlcmlmeSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIEhBU0ggc3ViZGlyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lhbCB0b2tlbnM6IGluIC1zc2wgbW9kZSwgaWYgXCJwYXRoXCIgaXMgbm90IGEgZmlsZSBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBkaXJlY3RvcnksIGl0IGlzIHRha2VuIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyB0aGF0IGFyZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgYSB0b2tlbiBpcyBcIkNBXCIgdGhhdCBtZWFucyBsb2FkIHRoZSBDQS9jYWNlcnQucGVtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGZyb20gdGhlIHNzbCBkaXJlY3RvcnkuICBJZiBhIHRva2VuIGlzIFwiY2xpZW50c1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbCB0aGUgZmlsZXMgY2xpZW50cy8qLmNydCBpbiB0aGUgc3NsIGRpcmVjdG9yeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGxvYWRlZC4gIE90aGVyd2lzZSB0aGUgZmlsZSBjbGllbnRzL3Rva2VuLmNydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgYXR0ZW1wdGVkIHRvIGJlIGxvYWRlZC4gIEFzIGEga2x1ZGdlLCB1c2UgYSB0b2tlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGlrZSAuLi9zZXJ2ZXItZm9vIHRvIGxvYWQgYSBzZXJ2ZXIgY2VydCBpZiB5b3UgZmluZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBuZWNlc3NhcnkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgLXNzbGRpciB0byB1c2UgYSBkaXJlY3RvcnkgZGlmZmVyZW50IGZyb20gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB+Ly52bmMvY2VydHMgZGVmYXVsdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgXCJDQVwiIGNlcnQgaXMgbG9hZGVkIHlvdSBkbyBub3QgbmVlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gbG9hZCBhbnkgb2YgdGhlIGNlcnRzIHRoYXQgaGF2ZSBiZWVuIHNpZ25lZCBieSBpdC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gbG9hZCBhbnkgYWRkaXRpb25hbCBzZWxmLXNpZ25lZCBjZXJ0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlci5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgQ0FcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCAtc3NsdmVyaWZ5IHNlbGY6ZnJlZCxzZWxmOmppbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgQ0EsY2xpZW50c1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXN1YWxseSBcIi1zc2x2ZXJpZnkgQ0FcIiBpcyB0aGUgbW9zdCBlZmZlY3RpdmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIC1zc2xHZW5DQSBhbmQgLXNzbEdlbkNlcnQgb3B0aW9ucyBiZWxvdyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhvdyB0byBzZXQgdXAgYW5kIG1hbmFnZSB0aGUgQ0EgZnJhbWV3b3JrLlxuIgotIlxuIgotIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogdGhlIGZvbGxvd2luZyB1dGlsaXRpZXMsIC1zc2xHZW5DQSwgLXNzbEdlbkNlcnQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc3NsRW5jS2V5LCAtc3NsQ2VydEluZm8sIGFuZCAtc3NsQ1JMIGFyZSBwcm92aWRlZCBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbmVzcywgYnV0IGZvciBjYXN1YWwgdXNhZ2UgdGhleSBhcmUgb3ZlcmtpbGwuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGV5IHByb3ZpZGUgVk5DIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGtleSBjcmVhdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlcnZlciAvIGNsaWVudCBrZXkgZ2VuZXJhdGlvbiBhbmQgc2lnbmluZy4gIFNvIHRoZXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgYSBiYXNpYyBQdWJsaWMgS2V5IG1hbmFnZW1lbnQgZnJhbWV3b3JrIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DLWluZyB3aXRoIHgxMXZuYy4gKG5vdGUgdGhhdCB0aGV5IHJlcXVpcmUgb3BlbnNzbCgxKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgc2ltcGxlc3QgdXNhZ2UgbW9kZSwgXCItc3NsIFRNUFwiICh3aGVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGl0cyBvd24sIHNlbGYtc2lnbmVkLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5IGtleSBhbmQgdGhlIFZOQyB2aWV3ZXJzIGFsd2F5cyBhY2NlcHQgaXQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIGFjY2VwdGluZyB2aWEgYSBkaWFsb2cgYm94KSBpcyBwcm9iYWJseSBzYWZlIGVub3VnaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3Qgc2NlbmFyaW9zLiAgQ0EgbWFuYWdlbWVudCBpcyBub3QgbmVlZGVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gcHJvdGVjdCBhZ2FpbnN0IE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MgdGhlIFwiVE1QXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgY2FuIGJlIGltcHJvdmVkIGJ5IHVzaW5nIFwiLXNzbCBTQVZFXCIgKHNhbWUgYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLXNzbFwiLCBpLmUuIHRoZSBkZWZhdWx0KSB0byBoYXZlIHgxMXZuYyBjcmVhdGUgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2VyIHRlcm0gc2VsZi1zaWduZWQgY2VydGlmaWNhdGUsIGFuZCB0aGVuIChzYWZlbHkpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkgY2VydCB0byB0aGUgZGVzaXJlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IG1hY2hpbmVzIChjYXJlIG11c3QgYmUgdGFrZW4gdGhlIHByaXZhdGUga2V5IHBhcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdG9sZW47IHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIHBhc3NwaHJhc2UpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU28ga2VlcCBpbiBtaW5kIG5vIENBIGtleSBjcmVhdGlvbiBvciBtYW5hZ2VtZW50XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydCkgaXMgbmVlZGVkIGZvciBlaXRoZXIgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhYm92ZSB0d28gY29tbW9uIHVzYWdlIG1vZGVzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT25lIG1pZ2h0IHdhbnQgdG8gdXNlIC1zc2xHZW5DQSBhbmQgLXNzbEdlbkNlcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBoYWQgYSBsYXJnZSBudW1iZXIgb2YgVk5DIGNsaWVudCBhbmQgc2VydmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc3RhdGlvbnMuICBUaGF0IHdheSB0aGUgYWRtaW5pc3RyYXRvciBjb3VsZCBnZW5lcmF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgQ0Ega2V5IHdpdGggLXNzbEdlbkNBIGFuZCBkaXN0cmlidXRlIGl0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgcGFydCB0byBhbGwgb2YgdGhlIHdvcmtzdGF0aW9ucy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5leHQsIGhlIGNvdWxkIGNyZWF0ZSBzaWduZWQgVk5DIHNlcnZlciBrZXlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoLXNzbEdlbkNlcnQgc2VydmVyIC4uLikgZm9yIGVhY2ggd29ya3N0YXRpb24gb3IgdXNlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGVuIHgxMXZuYyB3b3VsZCB1c2UgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW55IFZOQyBjbGllbnQgdGhhdCBoYXMgdGhlIENBIGNlcnQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbGx5LCB0aGUgYWRtaW4gY291bGQgYWxzbyBtYWtlIGl0IHNvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudHMgdGhlbXNlbHZlcyBhcmUgYXV0aGVudGljYXRlZCB0byB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICgtc3NsR2VuQ2VydCBjbGllbnQgLi4uKSAgRm9yIHRoaXMgLXNzbHZlcmlmeSB3b3VsZCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCB0byB0aGUgQ0EgY2VydCAoYW5kL29yIHNlbGYtc2lnbmVkIGNlcnRzKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCBvZiB0aGVzZSBjZXJ0IGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5IGZpbGVzLiAgT24gdGhlIFZOQyBjbGllbnQgc2lkZSwgdGhleSB3aWxsIG5lZWQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIFwiaW1wb3J0ZWRcIiBzb21laG93LiAgV2ViIGJyb3dzZXJzIGhhdmUgXCJNYW5hZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlc1wiIGFjdGlvbnMgYXMgZG9lcyB0aGUgSmF2YSBhcHBsZXQgcGx1Z2luXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIFBhbmVsLiAgc3R1bm5lbCBjYW4gYWxzbyB1c2UgdGhlc2UgZmlsZXMgKHNlZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNzX3ZuY3ZpZXdlciBleGFtcGxlIHNjcmlwdCBpbiB0aGUgRkFRIGFuZCBTU1ZOQy4pXG4iCi0iXG4iCi0iLXNzbENSTCBwYXRoICAgICAgICAgICBTZXQgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgKENSTCkgdG8gXCJwYXRoXCIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgYXBwbGllcyBmb3IgYm90aCAtc3NsIGFuZCAtc3R1bm5lbCBtb2Rlcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHBhdGggaXMgYSBmaWxlLCB0aGUgZmlsZSBjb250YWlucyBvbmUgb3IgbW9yZSBDUkxzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiBQRU0gZm9ybWF0LiAgSWYgcGF0aCBpcyBhIGRpcmVjdG9yeSwgaXQgY29udGFpbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhc2ggbmFtZWQgZmlsZXMgb2YgQ1JMcyBpbiB0aGUgdXN1YWwgT3BlblNTTCBtYW5uZXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIE9wZW5TU0wgYW5kIHN0dW5uZWwoOCkgZG9jdW1lbnRhdGlvbiBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mby5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpZiAtc3NsdmVyaWZ5IGhhcyBiZWVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZDogaXQgY2hlY2tzIGZvciByZXZvY2F0aW9uIGFsb25nIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgY2hhaW4gdXNlZCB0byB2ZXJpZnkgdGhlIFZOQyBjbGllbnQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgLXNzbENSTCBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCB3aGVuIC1zc2x2ZXJpZnkgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgYSBDUkwncyBleHBpcmF0aW9uIGRhdGUgaGFzIHBhc3NlZCwgYWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTU0wgY29ubmVjdGlvbnMgd2lsbCBmYWlsIHJlZ2FyZGxlc3Mgb2YgaWYgdGhleSBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIHN1YmplY3Qgb2YgdGhlIENSTCBvciBub3QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJhcmVseSB3aWxsIG9uZSdzIHgxMXZuYyAtc3NsIGluZnJhc3RydWN0dXJlIGJlIHNvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSB0aGF0IHRoaXMgb3B0aW9uIHdvdWxkIGJlIHVzZWZ1bCAoc2luY2Ugbm9ybWFsbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgLXNzbHZlcmlmeSBmaWxlIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgc2hvdWxkIGJlIGVub3VnaC4pICBIb3dldmVyLCB3aGVuIHVzaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2l0aCBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoc2VlIC1zc2xHZW5DQSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGF1dGhlbnRpY2F0ZSBDbGllbnRzIHZpYSBTU0wvVExTLCB0aGUgLXNzbENSTCBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VmdWwgdG8gcmV2b2tlIHVzZXJzJyBjZXJ0cyB3aG9zZSBwcml2YXRlIFNTTFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5cyB3ZXJlIGxvc3Qgb3Igc3RvbGVuIChlLmcuIGxhcHRvcC4pICBUaGlzIHdheSBhIG5ld1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ0EgY2VydCtrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBuZXcgc2lnbmVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQga2V5cyBnZW5lcmF0ZWQgYW5kIGRpc3RyaWJ1dGVkIHRvIGFsbCB1c2Vycy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIENSTCBmaWxlIHdpdGggcmV2b2tlZCBjZXJ0aWZpY2F0ZXMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyAnb3BlbnNzbCBjYSAtcmV2b2tlIC4uLicgYW5kICdvcGVuc3NsIGNhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZ2VuY3JsIC4uLicgYXJlIHVzZWZ1bC4gIChSdW4gdGhlbSBpbiB+Ly52bmMvY2VydHMpXG4iCi0iXG4iCi0iLXNzbEdlbkNBIFtkaXJdICAgICAgICBHZW5lcmF0ZSB5b3VyIG93biBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcHJpdmF0ZSBrZXksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwgYW5kIG90aGVyIGZpbGVzIGluIGRpcmVjdG9yeSBbZGlyXS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB0aGVuIGV4aXRzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgW2Rpcl0gaXMgbm90IHN1cHBsaWVkLCBhIC1zc2xkaXIgc2V0dGluZyBpcyB1c2VkLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3Igb3RoZXJ3aXNlIH4vLnZuYy9jZXJ0cyBpcyB1c2VkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21tYW5kIGFsc28gY3JlYXRlcyBkaXJlY3RvcmllcyB3aGVyZSBzZXJ2ZXIgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgY2VydHMgYW5kIGtleXMgd2lsbCBiZSBzdG9yZWQuICBUaGUgb3BlbnNzbCgxKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIFBBVEguXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgQ0EgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGNvbW1hbmQgZXhpdHM7IHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW4uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgaW5mb3JtYXRpb24gdG8gcHV0IGludG8gdGhlIENBXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZS4gIFRoZSBpbmZvIGRvZXMgbm90IGhhdmUgdG8gYmUgYWNjdXJhdGUganVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgbG9uZyBhcyBjbGllbnRzIGFjY2VwdCB0aGUgY2VydCBmb3IgVk5DIGNvbm5lY3Rpb25zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBhIHBhc3NwaHJhc2Ugb2YgYXQgbGVhc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDQgY2hhcmFjdGVycyBmb3IgdGhlIENBIHByaXZhdGUga2V5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT25jZSB5b3UgaGF2ZSBnZW5lcmF0ZWQgdGhlIENBIHlvdSBjYW4gZGlzdHJpYnV0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXRzIGNlcnRpZmljYXRlIHBhcnQsIFtkaXJdL0NBL2NhY2VydC5wZW0sIHRvIG90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc3RhdGlvbnMgd2hlcmUgVk5DIHZpZXdlcnMgd2lsbCBiZSBydW4uICBPbmUgd2lsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBcImltcG9ydFwiIHRoaXMgY2VydGlmaWNhdGUgaW4gdGhlIGFwcGxpY2F0aW9ucyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gV2ViIGJyb3dzZXIsIEphdmEgYXBwbGV0IHBsdWdpbiwgc3R1bm5lbCwgZXRjLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTmV4dCwgeW91IGNhbiBjcmVhdGUgYW5kIHNpZ24ga2V5cyB1c2luZyB0aGUgQ0Egd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1zc2xHZW5DZXJ0IG9wdGlvbiBiZWxvdy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DQVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DQSAgfi9teUNBZGlyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbGRpciB+L215Q0FkaXIgLXNzbEdlbkNBXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodGhlIGxhc3QgdHdvIGxpbmVzIGFyZSBlcXVpdmFsZW50KVxuIgotIlxuIgotIi1zc2xHZW5DZXJ0IHR5cGUgbmFtZSAgR2VuZXJhdGUgYSBWTkMgc2VydmVyIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5IHBhaXIgc2lnbmVkIGJ5IHRoZSBDQSBjcmVhdGVkIHByZXZpb3VzbHkgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNzbEdlbkNBLiAgVGhlIG9wZW5zc2woMSkgcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIGluIFBBVEguXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgQ2VydGlmaWNhdGUgaXMgZ2VuZXJhdGVkIHgxMXZuYyBleGl0czsgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgc2VydmVyIGlzIG5vdCBydW4uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBrZXkgdG8gYmUgZ2VuZXJhdGVkIGlzIHRoZSBzdHJpbmcgXCJ0eXBlXCIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBlaXRoZXIgXCJzZXJ2ZXJcIiAoaS5lLiBmb3IgdXNlIGJ5IHgxMXZuYykgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiY2xpZW50XCIgKGZvciBhIFZOQyB2aWV3ZXIpLiAgTm90ZSB0aGF0IHR5cGljYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb25seSBcInNlcnZlclwiIGlzIHVzZWQ6IHRoZSBWTkMgY2xpZW50cyBhdXRoZW50aWNhdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW1zZWx2ZXMgYnkgYSBub24tcHVibGljLWtleSBtZXRob2QgKGUuZy4gVk5DIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bml4IHBhc3N3b3JkKS4gIFwidHlwZVwiIGlzIHJlcXVpcmVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQW4gYXJiaXRyYXJ5IGRlZmF1bHQgbmFtZSB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBpcyBzdXBwbGllZCBieSB0aGUgXCJuYW1lXCIgc3RyaW5nLiAgWW91IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGl0IGF0IHRoZSB2YXJpb3VzIHByb21wdHMgd2hlbiBjcmVhdGluZyB0aGUga2V5LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgaXMgb3B0aW9uYWwuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBuYW1lIGlzIGxlZnQgYmxhbmsgZm9yIGNsaWVudHMga2V5cyB0aGVuIFwibm9ib2R5XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQuICBJZiBsZWZ0IGJsYW5rIGZvciBzZXJ2ZXIga2V5cywgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgc2VydmVyIGtleTogXCJzZXJ2ZXIucGVtXCIgaXMgY3JlYXRlZCAodGhpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhdmVkIG9uZSByZWZlcmVuY2VkIGJ5IFwiLXNzbCBTQVZFXCIgd2hlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciBpcyBzdGFydGVkKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJuYW1lXCIgYmVnaW5zIHdpdGggdGhlIHN0cmluZyBcInNlbGY6XCIgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIGluc3RlYWQgb2Ygb25lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgYnkgeW91ciBDQSBrZXkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBcIm5hbWVcIiBiZWdpbnMgd2l0aCB0aGUgc3RyaW5nIFwicmVxOlwiIHRoZW4gb25seSBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXkgKC5rZXkpIGFuZCBhIGNlcnRpZmljYXRlIHNpZ25pbmcgKnJlcXVlc3QqICgucmVxKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gIFlvdSBjYW4gdGhlbiBzZW5kIHRoZSAucmVxIGZpbGUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuIGV4dGVybmFsIENBIChldmVuIGEgcHJvZmVzc2lvbmFsIG9uZSwgZS5nLiBUaGF3dGUpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBjb21iaW5lIHRoZSAua2V5IGFuZCB0aGUgcmVjZWl2ZWQgY2VydCBpbnRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgLnBlbSBmaWxlIHdpdGggdGhlIHNhbWUgYmFzZW5hbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBcInNlcnZlclwiIGFuZCBcImNsaWVudFwiIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaW1wbHkgdGhlIGNob2ljZSBvZiBvdXRwdXQgZmlsZW5hbWVzIGFuZCBzdWItZGlyZWN0b3J5LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYWtlcyBpdCBzbyB0aGUgLXNzbCBTQVZFLW5hbWUgb3B0aW9uIGNhbiBlYXNpbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpY2sgdXAgdGhlIHgxMXZuYyBQRU0gZmlsZSB0aGlzIG9wdGlvbiBnZW5lcmF0ZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbmQgc2ltaWxhcmx5IG1ha2VzIGl0IGVhc3kgZm9yIHRoZSAtc3NsdmVyaWZ5IG9wdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gcGljayB1cCB5b3VyIGNsaWVudCBjZXJ0cy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgZmlsZW5hbWUgb3IgZGlyZWN0b3J5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiBlaXRoZXIgdGhlIFwic2VydmVyXCIgYW5kIFwiY2xpZW50XCIgY2VydHMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHJlbmFtZSB0aGUgZmlsZXMgb3IgbW92ZSB0aGVtIHRvIHdoZXJldmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3UgbGlrZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFByZWNlZGUgdGhpcyBvcHRpb24gd2l0aCAtc3NsZGlyIFtkaXJdIHRvIHVzZSBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCB+Ly52bmMvY2VydHMgWW91IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gcnVuIC1zc2xHZW5DQSBvbiB0aGF0IGRpcmVjdG9yeSBmaXJzdCBiZWZvcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvaW5nIGFueSAtc3NsR2VuQ2VydCBrZXkgY3JlYXRpb24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHlvdSBjYW5ub3QgcmVjcmVhdGUgYSBjZXJ0IHdpdGggZXhhY3RseSB0aGUgc2FtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzdGlndWlzaGVkIG5hbWUgKEROKSBhcyBhbiBleGlzdGluZyBvbmUuICBUbyBkbyBzbyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCB0aGUgW2Rpcl0vQ0EvaW5kZXgudHh0IGZpbGUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGUgbGluZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNpbWlsYXIgdG8gLXNzbEdlbkNBLCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBmaWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSByZWNvcmRlZCBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHdoZW4gaXQgaXMgY3JlYXRlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRpcDogaWYgeW91IGtub3cgdGhlIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvdGhlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVvcGxlIHdpbGwgYmUgY29ubmVjdGluZyB0bywgeW91IGNhbiB1c2UgdGhhdCBhcyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk5hbWUgXCJDTlwiIHRvIGF2b2lkIHNvbWUgYXBwbGljYXRpb25zIChlLmcuIHdlYlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcnMgYW5kIGphdmEgcGx1Z2luKSBjb21wbGFpbmluZyB0aGF0IGl0IGRvZXMgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCB0aGUgaG9zdG5hbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IHRoZSBDQSBwcml2YXRlIGtleVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSB0byB1bmxvY2sgdGhlIHByaXZhdGUga2V5IGNyZWF0ZWQgZnJvbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNzbEdlbkNBLiAgVGhpcyBwcml2YXRlIGtleSBpcyB1c2VkIHRvIHNpZ24gdGhlIHNlcnZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgY2xpZW50IGNlcnRpZmljYXRlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFwic2VydmVyXCIgY2VydHMgY2FuIGJlIHVzZWQgYnkgeDExdm5jIGRpcmVjdGx5IGJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGVtIHZpYSB0aGUgLXNzbCBbcGVtXSBvcHRpb24uICBUaGUgZGVmYXVsdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3aWxsIGJlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtLiAgVGhpcyBvbmUgd291bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgc2ltcGx5IHR5cGluZyAtc3NsIFNBVkUuICBUaGUgcGVtIGZpbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIGNlcnRpZmljYXRlIGFuZCB0aGUgcHJpdmF0ZSBrZXkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY3J0IGZpbGUgY29udGFpbnMgdGhlIGNlcnQgb25seS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBcImNsaWVudFwiIGNlcnQgKyBwcml2YXRlIGtleSBmaWxlIHdpbGwgbmVlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29waWVkIGFuZCBpbXBvcnRlZCBpbnRvIHRoZSBWTkMgdmlld2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaWRlIGFwcGxpY2F0aW9ucyAoV2ViIGJyb3dzZXIsIEphdmEgcGx1Z2luLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3R1bm5lbCwgZXRjLikgIE9uY2UgdGhhdCBpcyBkb25lIHlvdSBjYW4gZGVsZXRlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJjbGllbnRcIiBwcml2YXRlIGtleSBmaWxlIG9uIHRoaXMgbWFjaGluZSBzaW5jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgb25seSBuZWVkZWQgb24gdGhlIFZOQyB2aWV3ZXIgc2lkZS4gIFRoZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gfi8udm5jL2NlcnRzL2NsaWVudHMvPG5hbWU+LnBlbSBjb250YWlucyBib3RoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VydCBhbmQgcHJpdmF0ZSBrZXkuICBUaGUgPG5hbWU+LmNydCBjb250YWlucyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIG9ubHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBrbm93IG9uZSBzaG91bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIG5ldyBrZXlzIHdpdGggYSBwYXNzcGhyYXNlLiAgT3RoZXJ3aXNlIGlmIGFuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bnRydXN0ZWQgdXNlciBzdGVhbHMgdGhlIGtleSBmaWxlIGhlIGNvdWxkIHVzZSBpdCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFzcXVlcmFkZSBhcyB0aGUgeDExdm5jIHNlcnZlciAob3IgVk5DIHZpZXdlciBjbGllbnQpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgd2hldGhlciB0byBlbmNyeXB0IHRoZSBrZXkgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBwYXNzcGhyYXNlIG9yIG5vdC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT25lIGluY29udmVuaWVuY2UgdG8gYSBwYXNzcGhyYXNlIGlzIHRoYXQgaXQgbXVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgdHlwZWQgaW4gRVZFUlkgdGltZSB4MTF2bmMgb3IgdGhlIGNsaWVudCBhcHAgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgdXAuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IHNlcnZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCBTQVZFIC1kaXNwbGF5IDowIC4uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gb24gdmlld2VyIHVzaW5nIHNzX3ZuY3ZpZXdlciBzdHVubmVsIHdyYXBwZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIEZBUSk6XG4iCi0KLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9jYWNlcnQuY3J0IGhvc3RuYW1lOjBcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzc3VtZXMgdGhlIGNhY2VydC5jcnQgY2VydCBmcm9tIC1zc2xHZW5DQVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2FzIHNhZmVseSBjb3BpZWQgdG8gdGhlIFZOQyB2aWV3ZXIgbWFjaGluZSB3aGVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3Nfdm5jdmlld2VyIGlzIHJ1bilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgdXNpbmcgYSBuYW1lOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyIGNoYXJsaWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2wgU0FWRS1jaGFybGllIC1kaXNwbGF5IDowIC4uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSBmb3IgYSBjbGllbnQgY2VydGlmaWNhdGUgKHJhcmVseSB1c2VkKTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCByb2dlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3Agfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIucGVtIHNvbWVob3N0Oi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0gIH4vLnZuYy9jZXJ0cy9jbGllbnRzL3JvZ2VyLnBlbVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGlzIHRoZW4gc3RhcnRlZCB3aXRoIHRoZSBvcHRpb24gLXNzbHZlcmlmeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIuY3J0IChvciBzaW1wbHkgLXNzbHZlcmlmeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcm9nZXIpLCBhbmQgb24gdGhlIHZpZXdlciB1c2VyIG9uIHNvbWVob3N0IGNvdWxkIGRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Nfdm5jdmlld2VyIC1teWNlcnQgLi9yb2dlci5wZW0gaG9zdG5hbWU6MFxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHNldCB0aGUgZW52LiB2YXIgUkVRX0FSR1M9Jy4uLicgaXQgd2lsbCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIG9wZW5zc2wgcmVxKDEpLiAgQSBjb21tb24gdXNlIHdvdWxkIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBSRVFfQVJHUz0nLWRheXMgMTA5NScgdG8gYnVtcCB1cCB0aGUgZXhwaXJhdGlvbiBkYXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoMyB5ZWFycyBpbiB0aGlzIGNhc2UpLlxuIgotIlxuIgotIi1zc2xFbmNLZXkgcGVtICAgICAgICAgVXRpbGl0eSB0byBlbmNyeXB0IGFuIGV4aXN0aW5nIFBFTSBmaWxlIHdpdGggYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSB5b3Ugc3VwcGx5IHdoZW4gcHJvbXB0ZWQuICBGb3IgdGhhdCBrZXkgdG8gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4gYnkgeDExdm5jKSB0aGUgcGFzc3BocmFzZSBtdXN0IGJlIHN1cHBsaWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgXCJTQVZFXCIgbm90YXRpb24gZGVzY3JpYmVkIHVuZGVyIC1zc2wgYXBwbGllcyBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2VsbC4gKHByZWNlZGUgdGhpcyBvcHRpb24gd2l0aCAtc3NsZGlyIFtkaXJdIHRvIHJlZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIGRpcmVjdG9yeSBiZXNpZGVzIHRoZSBkZWZhdWx0IH4vLnZuYy9jZXJ0cylcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvcGVuc3NsKDEpIHByb2dyYW0gbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGF2YWlsYWJsZSBpbiBQQVRILiAgQWZ0ZXIgdGhlIEtleSBmaWxlIGlzIGVuY3J5cHRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHgxMXZuYyBjb21tYW5kIGV4aXRzOyB0aGUgVk5DIHNlcnZlciBpcyBub3QgcnVuLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsRW5jS2V5IC9wYXRoL3RvL2Zvby5wZW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xFbmNLZXkgU0FWRVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEVuY0tleSBTQVZFLWNoYXJsaWVcbiIKLSJcbiIKLSItc3NsQ2VydEluZm8gcGVtICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhpc3RpbmcgUEVNIGZpbGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiBhZGRpdGlvbiB0aGUgcHVibGljIGNlcnRpZmljYXRlIGlzIGFsc28gcHJpbnRlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvcGVuc3NsKDEpIHByb2dyYW0gbXVzdCBiZSBpbiBQQVRILiBCYXNpY2FsbHkgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIFwib3BlbnNzbCB4NTA5IC10ZXh0XCIgaXMgcnVuIG9uIHRoZSBwZW0uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgaW5mbyBpcyBwcmludGVkIHRoZSB4MTF2bmMgY29tbWFuZCBleGl0cztcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW4uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgXCJTQVZFXCIgbm90YXRpb24gZGVzY3JpYmVkIHVuZGVyIC1zc2wgYXBwbGllc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nICBcIkxJU1RcIiB3aWxsIGdpdmUgYSBsaXN0IG9mIGFsbCBjZXJ0cyBiZWluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZCAoaW4gdGhlIH4vLnZuYy9jZXJ0cyBkaXIsIHVzZSAtc3NsZGlyIHRvIHJlZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBhbm90aGVyIGRpcikuICBcIkFMTFwiIHdpbGwgcHJpbnQgb3V0IHRoZSBpbmZvIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgbWFuYWdlZCBrZXkgKHRoaXMgY2FuIGJlIHZlcnkgbG9uZykuICBHaXZpbmcgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IG9yIHNlcnZlciBjZXJ0IHNob3J0bmFtZSB3aWxsIGFsc28gdHJ5IGEgbG9va3VwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAtc3NsQ2VydEluZm8gY2hhcmxpZSkuICBVc2UgXCJMSVNUTFwiIG9yIFwiTExcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgbG9uZyAobHMgLWwgc3R5bGUpIGxpc3RpbmcuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBcIkhBU0hPTlwiIHdpbGwgY3JlYXRlIHN1YmRpcnMgW2Rpcl0vSEFTSCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFtkaXJdL0hBU0ggd2l0aCBPcGVuU1NMIGhhc2ggZmlsZW5hbWVzIChlLmcuIDBkNWZiYmYxLjApXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBwb2ludGluZyB1cCB0byB0aGUgY29ycmVzcG9uZGluZyAqLmNydCBmaWxlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKFtkaXJdIGlzIH4vLnZuYy9jZXJ0cyBvciBvbmUgZ2l2ZW4gYnkgLXNzbGRpci4pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdXNlZnVsIHdheSBmb3Igb3RoZXIgT3BlblNTTCBhcHBsaWNhdGlvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHN0dW5uZWwpIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNlcnRzIHdpdGhvdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhdmluZyB0byBjb25jYXRlbmF0ZSB0aGVtLiAgeDExdm5jIHdpbGwgbm90IHVzZSB0aGVtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgeW91IHNwZWNpZmljYWxseSByZWZlcmVuY2UgdGhlbS4gIFwiSEFTSE9GRlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVzIHRoZXNlIEhBU0ggc3ViZGlycy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMSVNULCBMSVNUTCwgTEwsIEFMTCwgSEFTSE9OLCBIQVNIT0ZGIHdvcmRzIGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBiZSBsb3dlcmNhc2UsIGUuZy4gXCJsaXN0XCIuXG4iCi0iXG4iCi0iLXNzbERlbENlcnQgcGVtICAgICAgICBQcm9tcHRzIHlvdSB0byBkZWxldGUgYWxsIC5jcnQgLnBlbSAua2V5IC5yZXEgZmlsZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBbcGVtXS4gIHgxMXZuYyB0aGVuIGV4aXRzLiBcIlNBVkVcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxvb2t1cHMgYXMgaW4gLXNzbENlcnRJbmZvIGFwcGx5IGFzIHdlbGwuXG4iCi0iXG4iCi0iLXNzbFNjcmlwdHMgICAgICAgICAgICBQcmludHMgb3V0IGJvdGggdGhlICdnZW5DQScgYW5kICdnZW5DZXJ0JyB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zc2wgd3JhcHBlciBzY3JpcHRzIGZvciB5b3UgdG8gZXhhbWluZSwgbW9kaWZ5LCBldGMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2NyaXB0cyBhcmUgcHJpbnRlZCB0byBzdGRvdXQgYW5kIHRoZW4gdGhlIHgxMXZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy5cbiIKLSJcbiIKLSJcbiIKLSItc3R1bm5lbCBbcGVtXSAgICAgICAgIFVzZSB0aGUgc3R1bm5lbCg4KSAoc3R1bm5lbC5taXJ0Lm5ldCkgdG8gcHJvdmlkZSBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIFNTTCB0dW5uZWwgYmV0d2VlbiB2aWV3ZXJzIGFuZCB4MTF2bmMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGV4dGVybmFsIHR1bm5lbCBtZXRob2Qgd2FzIGltcGxlbWVudGVkIHByaW9yIHRvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlZCAtc3NsIGVuY3J5cHRpb24gZGVzY3JpYmVkIGFib3ZlLiAgSXQgc3RpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzIHdlbGwgYW5kIGF2b2lkcyB0aGUgcmVxdWlyZW1lbnQgb2YgbGlua2luZyB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgT3BlblNTTCBsaWJyYXJpZXMuICBUaGlzIG1vZGUgcmVxdWlyZXMgc3R1bm5lbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZSB2aWEgUEFUSFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKG4uYi4gc3R1bm5lbCBpcyBvZnRlbiBpbnN0YWxsZWQgaW4gc2JpbiBkaXJlY3RvcmllcykuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDQueCBvZiBzdHVubmVsIGlzIGFzc3VtZWQgKGJ1dCBzZWUgLXN0dW5uZWwzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWxvdy4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBbcGVtXSBpcyBvcHRpb25hbCwgdXNlIFwiLXN0dW5uZWwgL3BhdGgvdG8vc3R1bm5lbC5wZW1cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSBhIFBFTSBjZXJ0aWZpY2F0ZSBmaWxlIHRvIHBhc3MgdG8gc3R1bm5lbC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgLXNzbCBvcHRpb24gZm9yIG1vcmUgaW5mbyBvbiBjZXJ0aWZpY2F0ZSBmaWxlcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHlvdXIgc3R1bm5lbCBoYXMgaXRzIG93biBjZXJ0aWZpY2F0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyBvbiB5b3VyIHN0dW5uZWwgY29uZmlndXJhdGlvbjsgc3R1bm5lbCBvZnRlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVzIG9uZSBhdCBpbnN0YWxsIHRpbWUuICBTZWUgeW91ciBzdHVubmVsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLiAgSW4gYW55IGV2ZW50LCBpZiB5b3Ugd2FudCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgY2VydGlmaWNhdGUgeW91IG11c3Qgc3VwcGx5IHRoZSBmdWxsIHBhdGggdG8gaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIFtwZW1dLiAgTm90ZTogdGhlIGZpbGUgbWF5IG9ubHkgYmUgcmVhZGFibGUgYnkgcm9vdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFtwZW1dIG1heSBhbHNvIGJlIHRoZSBzcGVjaWFsIHN0cmluZ3MgXCJUTVBcIiwgXCJTQVZFXCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgXCJTQVZFLi4uXCIgYXMgZGVzY3JpYmVkIGluIHRoZSAtc3NsIG9wdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFtwZW1dIGlzIG5vdCBzdXBwbGllZCwgXCJTQVZFXCIgaXMgYXNzdW1lZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgVmVOQ3J5cHQsIEFOT05UTFMsIGFuZCBcIkFOT05cIiBtb2Rlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gLXN0dW5uZWwgbW9kZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0dW5uZWwgaXMgc3RhcnRlZCB1cCBhcyBhIGNoaWxkIHByb2Nlc3Mgb2YgeDExdm5jIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW55IFNTTCBjb25uZWN0aW9ucyBzdHVubmVsIHJlY2VpdmVzIGFyZSBkZWNyeXB0ZWQgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIHgxMXZuYyBvdmVyIGEgbG9jYWwgc29ja2V0LiAgVGhlIHN0cmluZ3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFNTTCBWTkMgZGVza3RvcCBpcyAuLi5cIiBhbmQgXCJTU0xQT1JUPS4uLlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cCB0byBpbmRpY2F0ZSB0aGlzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIC1sb2NhbGhvc3Qgb3B0aW9uIGlzIGVuZm9yY2VkIGJ5IGRlZmF1bHQgdG8gYXZvaWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZSByb3V0aW5nIGFyb3VuZCB0aGUgU1NMIGNoYW5uZWwuICBVc2UgLWVudlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU1RVTk5FTF9ESVNBQkxFX0xPQ0FMSE9TVD0xIHRvIGRpc2FibGUgdGhpcyBzZWN1cml0eVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgLWVudiBTVFVOTkVMX0RFQlVHPTEgZm9yIG1vcmUgZGVidWdnaW5nIHByaW50b3V0LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2V0IC1lbnYgU1RVTk5FTF9QUk9HPXh4eCB0byB0aGUgZnVsbCBwYXRoIG9mIHN0dW5uZWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0geW91IHdhbnQgdG8gYmUgdXNlZCAoZS5nLiAvdXNyL2Jpbi9zdHVubmVsNCkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgLWVudiBTVFVOTkVMX0xJU1RFTj14eHggdG8gdGhlIGFkZHJlc3Mgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGludGVyZmFjZSB0byBsaXN0ZW4gb24gKHRoZSBkZWZhdWx0IGlzIHRvIGxpc3RlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb24gYWxsIGludGVyZmFjZXMpLCBlLmcuIFNUVU5ORUxfTElTVEVOPTE5Mi4xNjguMS4xMDAuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBIHNpbXBsZSB3YXkgdG8gYWRkIElQdjYgc3VwcG9ydCBpcyBTVFVOTkVMX0xJU1RFTj06OlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWW91ciBWTkMgdmlld2VyIHdpbGwgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gY29ubmVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlhIFNTTC4gIFVuZm9ydHVuYXRlbHkgbm90IHRvbyBtYW55IGRvIHRoaXMuICBTZWUgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBTU0wgdmlld2VycyB1bmRlciB0aGUgLXNzbCBvcHRpb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgeDExdm5jIHByb2plY3QncyBTU1ZOQyBpcyBhbiBvcHRpb24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHNvLCBpbiB0aGUgeDExdm5jIGRpc3RyaWJ1dGlvbiwgcGF0Y2hlZCBUaWdodFZOQ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFVsdHJhVk5DIEphdmEgYXBwbGV0IGphciBmaWxlcyBhcmUgcHJvdmlkZWQgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbGFzc2VzL3NzbCBkaXJlY3RvcnkgdGhhdCBkbyBTU0wgY29ubmVjdGlvbnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgc2VydmluZyB0aGVtIHdpdGggdGhlIC1odHRwLCAtaHR0cF9zc2wsIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciAoc2VlIHRoZSBvcHRpb24gZGVzY3JpcHRpb25zIGZvciBtb3JlIGluZm8uKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGZvciB0aGUgSmF2YSB2aWV3ZXIgYXBwbGV0IHVzYWdlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCI/UE9SVD14eHh4XCIgaW4gdGhlIHZhcmlvdXMgVVJMcyBwcmludGVkIGF0IHN0YXJ0dXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgbmVlZCB0byBiZSBzdXBwbGllZCB0byB0aGUgd2ViIGJyb3dzZXIgdG8gY29ubmVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVybHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGF1dG9tYXRpYyBcInNpbmdsZSBwb3J0XCIgSFRUUFMgbW9kZSBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXNzbCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGluIC1zdHVubmVsIG1vZGUuICBIb3dldmVyLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgY2FuIGJlIGVtdWxhdGVkIHZpYTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgJSUgeDExdm5jIC1zdHVubmVsIC1odHRwX3NzbCAtaHR0cF9vbmVwb3J0IC4uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCwgaXQgaXMgYWxzbyBub3QgdG9vIGRpZmZpY3VsdCB0byBzZXQgdXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuIHN0dW5uZWwgb3Igb3RoZXIgU1NMIHR1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBIHNpbXBsZSBleGFtcGxlIG9uIFVuaXggdXNpbmcgc3R1bm5lbCAzLnggaXM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICUlIHN0dW5uZWwgLWMgLWQgbG9jYWxob3N0OjU5MDEgLXIgcmVtb3RlaG9zdDo1OTAwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICUlIHZuY3ZpZXdlciBsb2NhbGhvc3Q6MVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIFdpbmRvd3MsIHN0dW5uZWwgaGFzIGJlZW4gcG9ydGVkIHRvIGl0IGFuZCB0aGVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIHByb2JhYmx5IG90aGVyIHN1Y2ggdG9vbHMgYXZhaWxhYmxlLiAgU2VlIHRoZSBGQVFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBTU1ZOQyBmb3IgbW9yZSBleGFtcGxlcy5cbiIKLSJcbiIKLSItc3R1bm5lbDMgIFtwZW1dICAgICAgIFVzZSB2ZXJzaW9uIDMueCBzdHVubmVsIGNvbW1hbmQgbGluZSBzeW50YXggaW5zdGVhZCBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA0LnguICBUaGUgLWh0dHAvLWh0dHBkaXIgSmF2YSBhcHBsZXQgc2VydmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBtb2RlLlxuIgotIlxuIgotIi1lbmMgY2lwaGVyOmtleWZpbGUgICAgVXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHdpdGggY2lwaGVyIFwiY2lwaGVyXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWNyZXQga2V5IGRhdGEgaW4gXCJrZXlmaWxlXCIuICBJZiBrZXlmaWxlIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwdz08c3RyaW5nPiB0aGVuIFwic3RyaW5nXCIgaXMgdXNlZCBhcyB0aGUga2V5IGRhdGEuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgU1NMIHZpYSB0aGUgLXNzbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGluc3RlYWQgb2YgdGhpcyBvcHRpb24gYmVjYXVzZSBTU0wgaXMgd2VsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZCBhbmQgdGFrZXMgZ3JlYXQgY2FyZSB0byBlc3RhYmxpc2ggdW5pcXVlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGtleXMgYW5kIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIHNvZnR3YXJlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBkbyBub3Qgd2FudCB0byBkZWFsIHdpdGggU1NMXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBkbyBub3Qgd2FudCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIFNTSCBidXQgd2FudCBzb21lIGVuY3J5cHRpb24gZm9yIHlvdXIgVk5DIHNlc3Npb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPciBpZiB5b3UgbXVzdCBpbnRlcmZhY2Ugd2l0aCBhIHN5bW1ldHJpYyBrZXkgdHVubmVsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHlvdSBkbyBub3QgaGF2ZSBjb250cm9sIG92ZXIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBtb2RlIHdpbGwgTk9UIHdvcmsgd2l0aCB0aGUgVWx0cmFWTkMgRFNNXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zIGJlY2F1c2UgdGhleSBhbHRlciB0aGUgUkZCIHByb3RvY29sIGluIGFkZGl0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0dW5uZWxsaW5nIHdpdGggdGhlIHN5bW1ldHJpYyBjaXBoZXIgKGFuIHVuZm9ydHVuYXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2Ugb2YgaW1wbGVtZW50YXRpb24uLi4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIgY2FuIGJlIG9uZSBvZjogIGFyYzQsIGFlc3YyLCBhZXMtY2ZiLCBibG93ZmlzaCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFlczI1Niwgb3IgM2Rlcy4gIFNlZSB0aGUgT3BlblNTTCBkb2N1bWVudGF0aW9uIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLiAgVGhlIGtleXNpemUgaXMgMTI4IGJpdHMgKGV4Y2VwdCBmb3IgYWVzMjU2KS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgb25lIHdheSB0byBtYWtlIGEga2V5ZmlsZSB3aXRoIHRoYXQgbWFueSBiaXRzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZCBpZj0vZGV2L3JhbmRvbSBvZj0uL215LmtleSBicz0xNiBjb3VudD0xXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2lsbCBuZWVkIHRvIHNlY3VyZWx5IHNoYXJlIHRoaXMga2V5IHdpdGggdGhlIG90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaWRlIG9mIHRoZSBWTkMgY29ubmVjdGlvbiAoU2VlIFNTVk5DIGZvciBleGFtcGxlcykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAgLWVuYyBibG93ZmlzaDouL215LmtleVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogIC1lbmMgYmxvd2Zpc2g6cHc9c3dvcmRmaXNoXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IDE2IGJ5dGVzIG9mIHJhbmRvbSBzYWx0IGZvbGxvd2VkIGJ5IDE2IGJ5dGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiByYW5kb20gaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFyZSBzZW50IGF0IHRoZSB2ZXJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gIFRoZSBvdGhlciBzaWRlIG11c3QgcmVhZCB0aGVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluaXRpYWxpemUgdGhlaXIgY2lwaGVyIHdpdGggdGhlbS4gIFRoZXNlIHZhbHVlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFrZSB0aGUgc2Vzc2lvbiBrZXkgdW5pcXVlICh3aXRob3V0IHRoZW0gdGhlIHNlY3VyaXR5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBtaW5pbWFsKS4gIFNpbWlsYXJseSwgdGhlIG90aGVyIHNpZGUgbXVzdCBzZW5kIHVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdHMgcmFuZG9tIHNhbHQgYW5kIElWIHdpdGggdGhvc2Ugc2FtZSBsZW5ndGhzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNhbHQgYW5kIGtleSBkYXRhIGFyZSBjb21iaW5lZCB0byBjcmVhdGUgYSBzZXNzaW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXkgdXNpbmcgYW4gbWQ1IGhhc2ggYXMgZGVzY3JpYmVkIGluIEVWUF9CeXRlc1RvS2V5KDMpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGV4YWN0IGNhbGwgaXM6IEVWUF9CeXRlc1RvS2V5KENpcGhlciwgRVZQX21kNSgpLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwga2V5ZGF0YSwgbGVuLCAxLCBrZXlzdHIsIE5VTEwpOyAgd2hlcmUgc2FsdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmRvbSBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGtleWRhdGEgaXMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgc2VjcmV0IGtleSBkYXRhLiAga2V5c3RyIGlzIHRoZSByZXN1bHRpbmcgc2Vzc2lvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5LiAgVGhlIGNpcGhlciBpcyB0aGVuIHNlZWRlZCB3aXRoIGtleXN0ciBhbmQgdXNlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmRvbSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYXMgaXRzIGZpcnN0IGJsb2NrLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gbW9kaWZ5IHRoZSBhbW91bnQgb2YgcmFuZG9tIHNhbHQgYW5kIGluaXRpYWxpemF0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdXNlIGNpcGhlckBuLG0gd2hlcmUgbiBpcyB0aGUgc2FsdCBsZW5ndGggYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgbGVuZ3RoLiAgRS5nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lbmMgYWVzLWNmYkA4LDE2Oi4vbXkua2V5XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBub3QgYSBnb29kIGlkZWEgdG8gc2V0IGVpdGhlciBvbmUgdG8gemVybyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsdGhvdWdoIHlvdSBtYXkgYmUgZm9yY2VkIHRvIGlmIHRoZSBvdGhlciBzaWRlIG9mIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsIGlzIG5vdCB1bmRlciB5b3VyIGNvbnRyb2wuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBza2lwIHRoZSBzYWx0IGFuZCBFVlBfQnl0ZXNUb0tleSBNRDUgZW50aXJlbHkgKG5vXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYXNoaW5nIGlzIGRvbmU6IHRoZSBrZXlkYXRhIGlzIGRpcmVjdGx5IGluc2VydGVkIGludG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaXBoZXIpIHNwZWNpZnkgXCItMVwiIGZvciB0aGUgc2FsdCwgZS5nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lbmMgYmxvd2Zpc2hALTEsMTY6Li9teS5rZXlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtZXNzYWdlIGRpZ2VzdCBjYW4gYWxzbyBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVzaWRlcyB0aGUgZGVmYXVsdCBNRDUuICBVc2UgY2lwaGVyQG1kK24sbSB3aGVyZSBcIm1kXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBvbmUgb2Ygc2hhLCBzaGExLCBtZDUsIG9yIHJpcGUuICBGb3IgZXhhbXBsZTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZW5jIGFyYzRAc2hhKzgsMTY6Li9teS5rZXlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBTU1ZOQyB2bmMgdmlld2VyIHByb2plY3Qgc3VwcGxpZXMgYSBzeW1tZXRyaWNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24gdG9vbCBuYW1lZCBcInVsdHJhdm5jX2RzbV9oZWxwZXJcIiB0aGF0IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBvbiB0aGUgdmlld2VyIHNpZGUuICBGb3IgZXhhbXBsZTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNzdm5jdmlld2VyIGV4ZWM9J3VsdHJhdm5jX2RzbV9oZWxwZXIgYXJjNCBteS5rZXkgMCBoOnAnXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBoOnAgaXMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9mIHRoZSB4MTF2bmMgc2VydmVyLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdWx0cmF2bmNfZHNtX2hlbHBlciBtYXkgYWxzbyBiZSB1c2VkIHN0YW5kYWxvbmUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgYSBzeW1tZXRyaWMgZW5jcnlwdGlvbiB0dW5uZWwgZm9yIGFueSB2aWV3ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlcnZlciAoVk5DIG9yIG90aGVyd2lzZS4pIFRoZSBjaXBoZXIgKDFzdCBhcmcpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgc3ludGF4IGFzIHdlIHVzZSBhYm92ZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFsc28gc2VlIHRoZSAnTm9uLVVsdHJhIERTTScgU1NWTkMgb3B0aW9uIGZvciB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICdVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW4nIGFkdmFuY2VkIG9wdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciBib3RoIHdheXMgb2YgdXNpbmcgdGhlIHZpZXdlciwgeW91IGNhbiBzcGVjaWZ5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCxpdmVjIHNpemVzIChpbiBHVUkgb3IsIGUuZy4gYXJjNEA4LDE2KS5cbiIKLSJcbiIKLSItaHR0cHMgW3BvcnRdICAgICAgICAgIFVzZSBhIHNwZWNpYWwsIHNlcGFyYXRlIEhUVFBTIHBvcnQgKC1zc2wgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCBtb2RlcyBvbmx5KSBmb3IgSFRUUFMgSmF2YSB2aWV3ZXIgYXBwbGV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZGluZy4gSS5lLiBub3QgNTkwMCBhbmQgbm90IDU4MDAgKHRoZSBkZWZhdWx0cy4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBCQUNLR1JPVU5EOiBJbiAtc3NsIG1vZGUsIGl0IHR1cm5zIG91dCB5b3UgY2FuIHVzZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBWTkMgcG9ydCAoZS5nLiA1OTAwKSBmb3IgYm90aCBWTkMgYW5kIEhUVFBTXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy4gKEhUVFBTIGlzIHVzZWQgdG8gcmV0cmlldmUgYSBTU0wtYXdhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFZuY1ZpZXdlci5qYXIgYXBwbGV0IHRoYXQgaXMgcHJvdmlkZWQgd2l0aCB4MTF2bmMpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgYm90aCB1c2UgU1NMIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgZXh0ZW5kZWQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdCBpZiBIVFRQIHRyYWZmaWMgKGkuZS4gR0VUKSBpcyB0YWtpbmcgcGxhY2UgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXQgYWNjb3JkaW5nbHkuICBUaGUgVVJMIHdvdWxkIGJlLCBlLmcuOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9teW1hY2hpbmUub3JnOjU5MDAvXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGZpcmV3YWxscywgZXRjLCBiZWNhdXNlIG9ubHkgb25lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb3J0IG5lZWRzIHRvIGJlIGFsbG93ZWQgaW4uICBIb3dldmVyLCB0aGlzIGhldXJpc3RpY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWRkcyBhIGZldyBzZWNvbmRzIGRlbGF5IHRvIGVhY2ggY29ubmVjdGlvbiBhbmQgY2FuIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bnJlbGlhYmxlIChlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRha2VzIG11Y2ggdGltZSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9uZGVyIHRoZSBDZXJ0aWZpY2F0ZSBkaWFsb2dzIGluIGhpcyBicm93c2VyLCBKYXZhIFZNLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgVk5DIFZpZXdlciBhcHBsZXQuICBUaGF0J3MgcmlnaHQgMyBzZXBhcmF0ZSBcIkFyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91IHN1cmUgeW91IHdhbnQgdG8gY29ubmVjdD9cIiBkaWFsb2dzISlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBCQUNLR1JPVU5ELlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVVNBR0U6IFNvIHVzZSB0aGUgLWh0dHBzIG9wdGlvbiB0byBwcm92aWRlIGEgc2VwYXJhdGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb3JlIHJlbGlhYmxlIEhUVFBTIHBvcnQgdGhhdCB4MTF2bmMgd2lsbCBsaXN0ZW4gb24uICBJZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgW3BvcnRdIGlzIG5vdCBwcm92aWRlZCAob3IgaXMgMCksIG9uZSBpcyBhdXRvc2VsZWN0ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgVVJMIHRvIHVzZSBpcyBwcmludGVkIG91dCBhdCBzdGFydHVwLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTTCBKYXZhIGFwcGxldCBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1odHRwZGlyIG9wdGlvbi4gIElmIG5vdCBzdXBwbGllZCwgLWh0dHBzIHdpbGwgdHJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBndWVzcyB0aGUgZGlyZWN0b3J5IGFzIHRob3VnaCB0aGUgLWh0dHAgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YXMgc3VwcGxpZWQuXG4iCi0iXG4iCi0iLWh0dHBzcmVkaXIgW3BvcnRdICAgICBJbiAtc3NsIG1vZGUgd2l0aCB0aGUgSmF2YSBhcHBsZXQgcmV0cmlldmVkIHZpYSBIVFRQUyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIEhUTUwgZmlsZSBjb250YWluaW5nIGFwcGxldCBwYXJhbWV0ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoJ2luZGV4LnZuYycgb3IgJ3Byb3h5LnZuYycpIGlzIHNlbnQgZG8gTk9UIHNldCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGxldCBQT1JUIHBhcmFtZXRlciB0byB0aGUgYWN0dWFsIFZOQyBwb3J0IGJ1dCBzZXQgaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIFwicG9ydFwiIGluc3RlYWQuICBJZiBcInBvcnRcIiBpcyBub3Qgc3VwcGxpZWQsIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciBpcyBndWVzc2VkIGZyb20gdGhlIEhvc3Q6IEhUVFAgaGVhZGVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VmdWwgd2hlbiBhbiBpbmNvbWluZyBUQ1AgY29ubmVjdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb24gaXMgcGVyZm9ybWVkIGJ5IGEgcm91dGVyL2dhdGV3YXkvZmlyZXdhbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZyb20gb25lIHBvcnQgdG8gYW4gaW50ZXJuYWwgbWFjaGluZSB3aGVyZSB4MTF2bmMgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBhIGRpZmZlcmVudCBwb3J0LiBUaGUgSmF2YSBhcHBsZXQgbmVlZHMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGZpcmV3YWxsL3JvdXRlciBwb3J0LCBub3QgdGhlIFZOQyBwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgaW50ZXJuYWwgd29ya3N0YXRpb24uIEZvciBleGFtcGxlLCBvbmUgY291bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyIGZyb20gbXlnYXRld2F5LmNvbTo0NDMgdG8gd29ya3N0YXRpb246NTkwMC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc3BhcmVzIHRoZSB1c2VyIGZyb20gaGF2aW5nIHRvIHR5cGUgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXlnYXRld2F5LmNvbS8/UE9SVD00NDMgaW50byB0aGVpciB3ZWJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuIE5vdGUgdGhhdCBwb3J0IDQ0MyBpcyB0aGUgZGVmYXVsdCBodHRwcyBwb3J0O1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgcG9ydHMgbXVzdCBiZSBleHBsaWNpdGx5IGluZGljYXRlZCwgZm9yIGV4YW1wbGU6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL215Z2F0ZXdheS5jb206ODAwMC8/UE9SVD04MDAwLiAgVG8gYXZvaWQgaGF2aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlIHRoZSBQT1JUPSBpbiB0aGUgYnJvd3NlciBVUkwsIHNpbXBseSBzdXBwbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWh0dHBzcmVkaXJcIiB0byB4MTF2bmMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCB3b3JrIGluIC1zdHVubmVsIG1vZGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNb3JlIHRyaWNrczogc2V0IHRoZSBlbnYgdmFyIFgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGV4dHJhIFVSTCBwYXJhbWV0ZXJzIHRvIHVzZS4gIFRoaXMgd2F5IHlvdSBkb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90IG5lZWQgdG8gc3BlY2lmeSBleHRyYSBQQVJBTVMgaW4gdGhlIGluZGV4LnZuYyBmaWxlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiB4MTF2bmMgLWVudiBYMTFWTkNfRVhUUkFfSFRUUFNfUEFSQU1TPSc/R0VUPTEnIC4uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgbm9uLVNTTCBIVFRQIHBvcnQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXR3b3JrIChpLmUuIHlvdSBqdXN0IHdhbnQgdGhlIHNpbmdsZSBWTkMvSFRUUFNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsIGUuZy4gNTkwMCwgb3BlbiBmb3IgY29ubmVjdGlvbnMpIHRoZW4gc3BlY2lmeSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiAtZW52IFgxMVZOQ19IVFRQX0xJU1RFTl9MT0NBTEhPU1Q9MSAgVGhpcyB3YXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBMaWJWTkNTZXJ2ZXIgaHR0cGQgc2VydmVyIHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgYXZhaWxhYmxlIG9uIGxvY2FsaG9zdCAobm90ZSB0aGF0IGluIC1zc2wgbW9kZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTIHJlcXVlc3RzIGFyZSByZWRpcmVjdGVkIGZyb20gU1NMIHRvIHRoZSBub24tU1NMXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgSFRUUCBzZXJ2ZXIuKVxuIgotIlxuIgotIi1odHRwX29uZXBvcnQgICAgICAgICAgRm9yIFVOLWVuY3J5cHRlZCBjb25uZWN0aW9ucyBtb2RlIChpLmUuIG5vIC1zc2wsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCwgb3IgLWVuYyBvcHRpb25zKSwgYWxsb3cgdGhlIEphdmEgVk5DIFZpZXdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGV0IHRvIGJlIGRvd25sb2FkZWQgdGhydSB0aGUgVk5DIHBvcnQgdmlhIEhUVFAuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGF0IGlzIHRvIHNheSwgeW91IGNhbiB1c2UgYSBzaW5nbGUgcG9ydCBmb3IgSmF2YVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGV0IHZpZXdlciBjb25uZWN0aW9ucyBieSB1c2luZyBhIFVSTCBpbiB5b3VyIHdlYlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlciBsaWtlIHRoaXMsIGZvciBleGFtcGxlOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2hvc3RuYW1lOjU5MDBcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWd1bGFyLCB0d28tcG9ydCBtb2RlLCBVUkwgaHR0cDovL2hvc3RuYW1lOjU4MDBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgY29udGludWUgdG8gd29yayBhcyB3ZWxsLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGlzIG1vZGUgd2lsbCBOT1Qgd29yayB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgLXNzbCwgLXN0dW5uZWwsIG9yIC1lbmMgZW5jcnlwdGlvbiBvcHRpb25zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGlzIGl0IGVxdWl2YWxlbnQgdG8gJy1lbmMgbm9uZScgKGkuZS4gaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgdGhlIHNhbWUgZGV0ZWN0aW9uIG1lY2hhbmlzbSBhcyBmb3IgSFRUUFMsIGJ1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBubyBlbmNyeXB0aW9uLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTIHNpbmdsZS1wb3J0IGlzIG9uIGJ5IGRlZmF1bHQgaW4gLXNzbCBlbmNyeXB0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKGFuZCAtZW5jIHRvbyksIHNvIHlvdSBvbmx5IG5lZWQgLWh0dHBfb25lcG9ydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBkb2luZyBub24tU1NMIGVuY3J5cHRlZCBjb25uZWN0aW9ucy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBjb3VsZCBhbHNvIGJlIHVzZWZ1bCBmb3IgU1NIIHR1bm5lbHMgc2luY2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IG1lYW5zIG9ubHkgb25lIHBvcnQgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSAtaHR0cHNyZWRpciBvcHRpb24gbWF5IGFsc28gYmUgdXNlZnVsIGZvciB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHdoZW4gdXNpbmcgYW4gU1NIIHR1bm5lbCBhcyB3ZWxsIGFzIGZvciByb3V0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgcmVkaXJlY3Rpb25zLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSAtZW52IFgxMVZOQ19IVFRQX0xJU1RFTl9MT0NBTEhPU1Q9MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGRlc2NyaWJlZCBhYm92ZSB1bmRlciAtaHR0cHNyZWRpciBhcHBsaWVzIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIExpYlZOQ1NlcnZlciBodHRwZCBzZXJ2ZXIgaW4gYWxsIGNhc2VzIChzc2wgb3Igbm90LilcbiIKLSJcbiIKLSItc3NoIHVzZXJAaG9zdDpkaXNwICAgIENyZWF0ZSBhIHJlbW90ZSBsaXN0ZW5pbmcgcG9ydCBvbiBtYWNoaW5lIFwiaG9zdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWEgYSBTU0ggdHVubmVsIHVzaW5nIHRoZSAtUiBycG9ydDpsb2NhbGhvc3Q6bHBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC4gbHBvcnQgd2lsbCBiZSB0aGUgbG9jYWwgeDExdm5jIGxpc3RlbmluZyBwb3J0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc28gYSBjb25uZWN0aW9uIHRvIHJwb3J0ICg1OTAwK2Rpc3ApIG9uIFwiaG9zdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlYWNoIHgxMXZuYy4gIEUuZy4gZnJlZEBzbm9vcHkuY29tOjBcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgdXNlZnVsIGlmIGEgZmlyZXdhbGwvcm91dGVyIHByZXZlbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBjb25uZWN0aW9ucyB0byB0aGUgeDExdm5jIG1hY2hpbmUsIGJ1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNzaCBtYWNoaW5lIFwiaG9zdFwiIGNhbiBiZSByZWFjaGVkIGJ5IHRoZSBWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci4gXCJ1c2VyQFwiIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHRoZSByZW1vdGUgdW5peFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgdGhlIHJlbW90ZSBzc2hkIGlzIHVzdWFsbHkgY29uZmlndXJlZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuIG9ubHkgb24gbG9jYWxob3N0IGZvciBycG9ydCwgc28gdGhlIHZpZXdlciBtYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gc3NoIC1MIHJlZGlyIHRvIFwiaG9zdFwiIGFzIHdlbGwgKFNlZSBTU1ZOQyB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGUgdGhpcykuICBUaGUgc3NoZCBzZXR0aW5nIEdhdGV3YXlQb3J0cyBlbmFibGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5pbmcgb24gYWxsIGludGVyZmFjZXMgZm9yIHJwb3J0OyB2aWV3ZXJzIGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVhY2ggaXQgbW9yZSBlYXNpbHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImRpc3BcIiBpcyB0aGUgVk5DIGRpc3BsYXkgZm9yIHRoZSByZW1vdGUgU1NIIHNpZGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIDAgY29ycmVzcG9uZHMgdG8gcG9ydCA1OTAwLCBldGMuICBJZiBkaXNwIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMjAwIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBwb3J0LiAgVXNlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIHRvIGZvcmNlIGEgbG93IHBvcnQsIGUuZy4gaG9zdDotODAgd2lsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHBvcnQgODAuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBzc2gtYWdlbnQgaXMgbm90IGFjdGl2ZSwgdGhlbiB0aGUgc3NoIHBhc3N3b3JkIG5lZWRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBlbnRlcmVkIGluIHRoZSB0ZXJtaW5hbCB3aGVyZSB4MTF2bmMgaXMgcnVubmluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgdGhlIHJlbW90ZSBzc2ggd2lsbCBpc3N1ZSBhICdzbGVlcCAzMDAnIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YWl0IGZvciB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBmb3IgNSBtaW5zLiAgVG8gbW9kaWZ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHVzZSB1c2VyQGhvc3Q6ZGlzcCtzZWNzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbW90ZSBTU0ggc2VydmVyIGlzIG9uIGEgbm9uLXN0YW5kYXJkIHBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIG5vdCAyMikgdXNlIHVzZXJAaG9zdDpwb3J0OmRpc3Arc2Vjcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgc3NoIHByb2Nlc3MgTUFZIE5PVCBiZSBraWxsZWQgd2hlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGV4aXRzLiAgSXQgdHJpZXMgYnkgbG9va2luZyBhdCBwcygxKSBvdXRwdXQuXG4iCi0iXG4iCi0iLXVzZXB3ICAgICAgICAgICAgICAgICBJZiBubyBvdGhlciBwYXNzd29yZCBtZXRob2Qgd2FzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmaXJzdCBsb29rIGZvciB+Ly52bmMvcGFzc3dkIGFuZCBpZiBmb3VuZCB1c2UgaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggLXJmYmF1dGg7IG5leHQsIGxvb2sgZm9yIH4vLnZuYy9wYXNzd2RmaWxlIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIGl0IHdpdGggLXBhc3N3ZGZpbGU7IG90aGVyd2lzZSwgcHJvbXB0IHRoZSB1c2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBwYXNzd29yZCB0byBjcmVhdGUgfi8udm5jL3Bhc3N3ZCBhbmQgdXNlIGl0IHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtcmZiYXV0aCBvcHRpb24uICBJZiBub25lIG9mIHRoZXNlIHN1Y2NlZWQgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBleGl0cyBpbW1lZGlhdGVseS5cbiIKLSJcbiIKLSItc3RvcmVwYXNzd2QgcGFzcyBmaWxlIFN0b3JlIHBhc3N3b3JkIFwicGFzc1wiIGFzIHRoZSBWTkMgcGFzc3dvcmQgaW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaWxlIFwiZmlsZVwiLiAgT25jZSB0aGUgcGFzc3dvcmQgaXMgc3RvcmVkIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy4gIFVzZSB0aGUgcGFzc3dvcmQgdmlhIFwiLXJmYmF1dGggZmlsZVwiXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIFwieDExdm5jIC1zdG9yZXBhc3N3ZFwiLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQgYW5kIGl0IGlzIHN0b3JlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZpbGUgfi8udm5jL3Bhc3N3ZC4gIENhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB0aGUgZmlsZSB0byBzdG9yZSB0aGUgcHJvbXB0ZWQgcGFzc3dvcmQgaW4uXG4iCi0iXG4iCi0iLW5vcHcgICAgICAgICAgICAgICAgICBEaXNhYmxlIHRoZSBiaWcgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IHVzZSB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgc29tZSBzb3J0IG9mIHBhc3N3b3JkLlxuIgotIlxuIgotIi1hY2NlcHQgc3RyaW5nICAgICAgICAgUnVuIGEgY29tbWFuZCAocG9zc2libHkgdG8gcHJvbXB0IHRoZSB1c2VyIGF0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWDExIGRpc3BsYXkpIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluY29taW5nIGNsaWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGFsbG93ZWQgdG8gY29ubmVjdCBvciBub3QuICBcInN0cmluZ1wiIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbiBleHRlcm5hbCBjb21tYW5kIHJ1biB2aWEgc3lzdGVtKDMpIG9yIHNvbWUgc3BlY2lhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FzZXMgZGVzY3JpYmVkIGJlbG93LiAgQmUgc3VyZSB0byBxdW90ZSBcInN0cmluZ1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBjb250YWlucyBzcGFjZXMsIHNoZWxsIGNoYXJhY3RlcnMsIGV0Yy4gIElmIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29tbWFuZCByZXR1cm5zIDAgdGhlIGNsaWVudCBpcyBhY2NlcHRlZCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgY2xpZW50IGlzIHJlamVjdGVkLiAgU2VlIGJlbG93IGZvciBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHRvIGFjY2VwdCBhIGNsaWVudCB2aWV3LW9ubHkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB4MTF2bmMgaXMgcnVubmluZyBhcyByb290IChzYXkgZnJvbSBpbmV0ZCg4KSBvciBmcm9tXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXJzIHhkbSgxKSwgZ2RtKDEpLCBldGMpLCB0aGluayBhYm91dCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBjYXJlZnVsbHkgYmVmb3JlIHN1cHBseWluZyB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gKGxpa2V3aXNlIGZvciB0aGUgLWdvbmUgb3B0aW9uKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50OiBUaGUgUkZCX0NMSUVOVF9JUCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gdGhlIGluY29taW5nIGNsaWVudCBJUCBudW1iZXIgYW5kIHRoZSBwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX1BPUlQgKG9yIC0xIGlmIHVuYXZhaWxhYmxlKS4gIFNpbWlsYXJseSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJGQl9TRVJWRVJfSVAgYW5kIFJGQl9TRVJWRVJfUE9SVCAodGhlIHgxMXZuYyBzaWRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY29ubmVjdGlvbiksIGFyZSBzZXQgdG8gYWxsb3cgaWRlbnRpZmljYXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0Y3AgdmlydHVhbCBjaXJjdWl0LiAgVGhlIHgxMXZuYyBwcm9jZXNzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZCB3aWxsIGJlIGluIFJGQl9YMTFWTkNfUElELCBhIGNsaWVudCBpZCBudW1iZXIgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJGQl9DTElFTlRfSUQsIGFuZCB0aGUgbnVtYmVyIG9mIG90aGVyIGNvbm5lY3RlZCBjbGllbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX0NPVU5ULiAgUkZCX01PREUgd2lsbCBiZSBcImFjY2VwdFwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkZCX1NUQVRFIHdpbGwgYmUgUFJPVE9DT0xfVkVSU0lPTiwgU0VDVVJJVFlfVFlQRSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OLCBJTklUSUFMSVNBVElPTiwgTk9STUFMLCBvciBVTktOT1dOXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHVwIHRvIHdoaWNoIHN0YXRlIHRoZSBjbGllbnQgaGFzIGFjaGlldmVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkZCX0xPR0lOX1ZJRVdPTkxZIHdpbGwgYmUgMCwgMSwgb3IgLTEgKHVua25vd24pLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkZCX1VTRVJOQU1FLCBSRkJfTE9HSU5fVElNRSwgYW5kIFJGQl9DVVJSRU5UX1RJTUUgbWF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbHNvIGJlIHNldC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFwic3RyaW5nXCIgaXMgXCJwb3B1cFwiIHRoZW4gYSBidWlsdGluIHBvcHVwIHdpbmRvd1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gIFRoZSBwb3B1cCB3aWxsIHRpbWUgb3V0IGFmdGVyIDEyMCBzZWNvbmRzLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIFwicG9wdXA6TlwiIHRvIG1vZGlmeSB0aGUgdGltZW91dCB0byBOIHNlY29uZHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh1c2UgMCBmb3Igbm8gdGltZW91dCkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY2FzZSBvZiBcInBvcHVwXCIgYW5kIHdoZW4gdGhlIC11bml4cHcgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZW4gYSAqc2Vjb25kKiB3aW5kb3cgd2lsbCBiZSBwb3BwZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVwIGFmdGVyIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSBsb2dzIGluIHZpYSBoaXMgVU5JWFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQuICBUaGlzIHRpbWUgdGhlIHVzZXIgd2lsbCBiZSBpZGVudGlmaWVkIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVTklYOnVzZXJuYW1lQGhvc3RuYW1lLCB0aGUgXCJVTklYOlwiIHByZWZpeCBpbmRpY2F0ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHVzZXIgdGhlIHZpZXdlciBsb2dnZWQgYXMgdmlhIC11bml4cHcuICBUaGUgZmlyc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwIGlzIG9ubHkgZm9yIHdoZXRoZXIgdG8gYWxsb3cgaGltIHRvIGV2ZW4gKnRyeSpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvZ2luIHZpYSB1bml4IHBhc3N3b3JkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJzdHJpbmdcIiBpcyBcInhtZXNzYWdlXCIgdGhlbiBhbiB4bWVzc2FnZSgxKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBpcyB1c2VkIGZvciB0aGUgY29tbWFuZC4gIHhtZXNzYWdlIG11c3QgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBmb3IgdGhpcyB0byB3b3JrLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBcInBvcHVwXCIgYW5kIFwieG1lc3NhZ2VcIiB3aWxsIHByZXNlbnQgYW4gb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWNjZXB0aW5nIHRoZSBjbGllbnQgXCJWaWV3LU9ubHlcIiAodGhlIGNsaWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9ubHkgd2F0Y2gpLiAgVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgcHJlc2VudGVkIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtdmlld29ubHkgaGFzIGJlZW4gc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSBlbnRpcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgaXMgdmlldyBvbmx5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBpcyBwcmVmaXhlZCB3aXRoIHNvbWV0aGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGlrZSBcInllczowLG5vOiosdmlldzozIG15Y29tbWFuZCAuLi5cIiB0aGVuIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZXMgdGhlIG51bWVyaWNhbCBjb21tYW5kIHJldHVybiBjb2RlIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpb25zOiBhY2NlcHQsIHJlamVjdCwgYW5kIGFjY2VwdC12aWV3LW9ubHksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuICBVc2UgXCIqXCIgaW5zdGVhZCBvZiBhIG51bWJlciB0byBpbmRpY2F0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgYWN0aW9uIChpbiBjYXNlIHRoZSBjb21tYW5kIHJldHVybnMgYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgdmFsdWUpLiAgRS5nLiBcIm5vOipcIiBpcyBhIGdvb2QgY2hvaWNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHgxMXZuYyBibG9ja3Mgd2hpbGUgdGhlIGV4dGVybmFsIGNvbW1hbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIHBvcHVwIGlzIHJ1bm5pbmcgKG90aGVyIGNsaWVudHMgbWF5IHNlZSBubyB1cGRhdGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgdGhpcyBwZXJpb2QpLiAgU28gYSBwZXJzb24gc2l0dGluZyBhIHRoZSBwaHlzaWNhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyBuZWVkZWQgdG8gcmVzcG9uZCB0byBhbiBwb3B1cCBwcm9tcHQuICh1c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgMm5kIHgxMXZuYyBpZiB5b3UgbG9jayB5b3Vyc2VsZiBvdXQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTW9yZSAtYWNjZXB0IHRyaWNrczogdXNlIFwicG9wdXBtb3VzZVwiIHRvIG9ubHkgYWxsb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIGNsaWNrcyBpbiB0aGUgYnVpbHRpbiBwb3B1cCB0byBiZSByZWNvZ25pemVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5IHVzZSBcInBvcHVwa2V5XCIgdG8gb25seSByZWNvZ25pemVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZSByZXNwb25zZXMuICBUaGVzZSBhcmUgdG8gaGVscCBhdm9pZCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYWNjaWRlbnRhbGx5IGFjY2VwdGluZyBhIGNsaWVudCBieSB0eXBpbmcgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsaWNraW5nLiBBbGwgMyBvZiB0aGUgcG9wdXAga2V5d29yZHMgY2FuIGJlIGZvbGxvd2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBieSArTitNIHRvIHN1cHBseSBhIHBvc2l0aW9uIGZvciB0aGUgcG9wdXAgd2luZG93LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gY2VudGVyIHRoZSBwb3B1cCB3aW5kb3cuXG4iCi0iLWFmdGVyYWNjZXB0IHN0cmluZyAgICBBcyAtYWNjZXB0LCBleGNlcHQgdG8gcnVuIGEgdXNlciBzdXBwbGllZCBjb21tYW5kIGFmdGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIGNsaWVudCBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgYXV0aGVudGljYXRlZC4gUkZCX01PREVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIFwiYWZ0ZXJhY2NlcHRcIiBhbmQgdGhlIG90aGVyIFJGQl8qXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgYXJlIGFzIGluIC1hY2NlcHQuICBVbmxpa2UgLWFjY2VwdCwgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHJldHVybiBjb2RlIGlzIG5vdCBpbnRlcnByZXRlZCBieSB4MTF2bmMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAtYWZ0ZXJhY2NlcHQgJ2tpbGxhbGwgeGxvY2sgJidcbiIKLSItZ29uZSBzdHJpbmcgICAgICAgICAgIEFzIC1hY2NlcHQsIGV4Y2VwdCB0byBydW4gYSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgd2hlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBjbGllbnQgZ29lcyBhd2F5IChkaXNjb25uZWN0cykuICBSRkJfTU9ERSB3aWxsIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gXCJnb25lXCIgYW5kIHRoZSBvdGhlciBSRkJfKiB2YXJpYWJsZXMgYXJlIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiAtYWNjZXB0LiAgVGhlIFwicG9wdXBcIiBhY3Rpb25zIGFwcGx5IGFzIHdlbGwuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVbmxpa2UgLWFjY2VwdCwgdGhlIGNvbW1hbmQgcmV0dXJuIGNvZGUgaXMgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlZCBieSB4MTF2bmMuICBFeGFtcGxlOiAtZ29uZSAneGxvY2sgJidcbiIKLSJcbiIKLSItdXNlcnMgbGlzdCAgICAgICAgICAgIElmIHgxMXZuYyBpcyBzdGFydGVkIGFzIHJvb3QgKHNheSBmcm9tIGluZXRkKDgpIG9yIGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgbWFuYWdlcnMgeGRtKDEpLCBnZG0oMSksIGV0YyksIHRoZW4gYXMgc29vblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgcG9zc2libGUgYWZ0ZXIgY29ubmVjdGlvbnMgdG8gdGhlIFggZGlzcGxheSBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkIHRyeSB0byBzd2l0Y2ggdG8gb25lIG9mIHRoZSB1c2VycyBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hIHNlcGFyYXRlZCBcImxpc3RcIi4gIElmIHgxMXZuYyBpcyBub3QgcnVubmluZyBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcm9vdCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2h5IHVzZSB0aGlzIG9wdGlvbj8gIEluIGdlbmVyYWwgaXQgaXMgbm90IG5lZWRlZCBzaW5jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBYIGRpc3BsYXkgYW5kIGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBpdHMgcHJpbWFyeSBmdW5jdGlvbnMuICBUaGUgb3B0aW9uIHdhcyBhZGRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzb21lIG9mIHRoZSAqZXh0ZXJuYWwqIHV0aWxpdHkgY29tbWFuZHMgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvY2Nhc2lvbmFsbHkgcnVucyB3b3JrIHByb3Blcmx5LiAgSW4gcGFydGljdWxhciB1bmRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgR05PTUUgYW5kIEtERSB0byBpbXBsZW1lbnQgdGhlIFwiLXNvbGlkIGNvbG9yXCIgZmVhdHVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29tbWFuZHMgKGdjb25mdG9vbC0yIGFuZCBkY29wKSB1bmZvcnR1bmF0ZWx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJ1biBhcyB0aGUgdXNlciBvd25pbmcgdGhlIGRlc2t0b3Agc2Vzc2lvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoaXMgb3B0aW9uIHN3aXRjaGVzIHVzZXJpZCBpdCBhbHNvIGFmZmVjdHMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VyaWQgdXNlZCB0byBydW4gdGhlIHByb2Nlc3NlcyBmb3IgdGhlIC1hY2NlcHQgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZ29uZSBvcHRpb25zLiAgSXQgYWxzbyBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIHJlYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIGZvciBvcHRpb25zIHN1Y2ggYXMgLWNvbm5lY3QsIC1hbGxvdywgYW5kIC1yZW1hcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gdGhlIHVsdHJhIGFuZCB0aWdodCBmaWxldHJhbnNmZXIgZmVhdHVyZSBpZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gIE5vdGUgdGhhdCB0aGUgLWNvbm5lY3QgZmlsZSBpcyBhbHNvIHNvbWV0aW1lc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiB0by5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIGJlIGNhcmVmdWwgd2l0aCB0aGlzIG9wdGlvbiBzaW5jZSBpbiBzb21lIHNpdHVhdGlvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0cyB1c2UgY2FuIGRlY3JlYXNlIHNlY3VyaXR5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCB0aGUgc3dpdGNoIHRvIGEgdXNlciB3aWxsIG9ubHkgdGFrZSBwbGFjZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGRpc3BsYXkgY2FuIHN0aWxsIGJlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgYXMgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciAodGhpcyBpcyBwcmltYXJpbHkgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhY3R1YWwgb3duZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzZXNzaW9uKS4gRXhhbXBsZTogXCItdXNlcnMgZnJlZCx3aWxtYSxiZXR0eVwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgbWFsaWNpb3VzIGxvY2FsIHVzZXIgXCJiYXJuZXlcIiBieVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tseSB1c2luZyBcInhob3N0ICtcIiB3aGVuIGxvZ2dpbmcgaW4gbWF5IHBvc3NpYmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIHgxMXZuYyBwcm9jZXNzIHRvIHN3aXRjaCB0byB1c2VyIFwiZnJlZFwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBoYXBwZW5zIG5leHQ/XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVbmRlciBkaXNwbGF5IG1hbmFnZXJzIGl0IG1heSBiZSBhIGxvbmcgdGltZSBiZWZvcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzd2l0Y2ggc3VjY2VlZHMgKGkuZS4gYSB1c2VyIGxvZ3MgaW4pLiAgVG8gaW5zdGVhZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFrZSBpdCBzd2l0Y2ggaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBpZiB0aGUgZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHJlb3BlbmVkIHByZWZpeCB0aGUgdXNlcm5hbWUgd2l0aCB0aGUgXCIrXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlci4gRS5nLiBcIi11c2VycyArYm9iXCIgb3IgXCItdXNlcnMgK25vYm9keVwiLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxhdHRlciAoaS5lLiBzd2l0Y2hpbmcgaW1tZWRpYXRlbHkgdG8gdXNlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJub2JvZHlcIikgaXMgdGhlIG9ubHkgb2J2aW91cyB1c2Ugb2YgdGhlIC11c2VycyBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaW5jcmVhc2VzIHNlY3VyaXR5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbm90YXRpb24gdG8gYXNzb2NpYXRlIGEgZ3JvdXAgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSB1c2VyOiB1c2VyMS5ncm91cDEsdXNlcjIuZ3JvdXAyLC4uLiAgTm90ZSB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbml0Z3JvdXBzKDIpIHdpbGwgc3RpbGwgYmUgY2FsbGVkIGZpcnN0IHRvIHRyeSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIHRvIEFMTCBvZiBhIHVzZXIncyBncm91cHMgKHByaW1hcnkgYW5kIGFkZGl0aW9uYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcykuICBPbmx5IGlmIHRoYXQgZmFpbHMgb3IgaXQgaXMgbm90IGF2YWlsYWJsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgc2luZ2xlIGdyb3VwIHNwZWNpZmllZCBhcyBhYm92ZSAob3IgdGhlIHVzZXInc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSBncm91cCBpZiBub3Qgc3BlY2lmaWVkKSBpcyBzd2l0Y2hlZCB0byB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXRnaWQoMikuICBVc2UgLWVudiBYMTFWTkNfU0lOR0xFX0dST1VQPTEgdG8gcHJldmVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHJ5aW5nIGluaXRncm91cHMoMikgYW5kIG9ubHkgc3dpdGNoIHRvIHRoZSBzaW5nbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLiAgVGhpcyBzb3J0IG9mIHNldHRpbmcgaXMgb25seSByZWFsbHkgbmVlZGVkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWtlIHRoZSB1bHRyYSBvciB0aWdodCBmaWxldHJhbnNmZXIgcGVybWlzc2lvbnMgd29ya1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVybHkuIFRoaXMgZm9ybWF0IGFwcGxpZXMgdG8gYW55IGNvbW1hIHNlcGFyYXRlZCBsaXN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiB1c2VycywgZXZlbiB0aGUgc3BlY2lhbCBcIj1cIiBtb2RlcyBkZXNjcmliZWQgYmVsb3cuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiAtdW5peHB3IG1vZGUsIGlmIFwiLXVzZXJzIHVuaXhwdz1cIiBpcyBzdXBwbGllZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhZnRlciBhIHVzZXIgYXV0aGVudGljYXRlcyBoaW1zZWxmIHZpYSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC11bml4cHcgbWVjaGFuaXNtLCB4MTF2bmMgd2lsbCB0cnkgdG8gc3dpdGNoIHRvIHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXMgdGhvdWdoIFwiLXVzZXJzICt1c2VybmFtZVwiIGhhZCBiZWVuIHN1cHBsaWVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gbGltaXQgd2hpY2ggdXNlcnMgdGhpcyB3aWxsIGJlIGRvbmUgZm9yLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSB0aGVtIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgYWZ0ZXIgXCJ1bml4cHc9XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGFib3ZlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5LCBpbiAtc3NsIG1vZGUsIGlmIFwiLXVzZXJzIHNzbHBlZXI9XCIgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIHRoZW4gYWZ0ZXIgYW4gU1NMIGNsaWVudCBhdXRoZW50aWNhdGVzIHdpdGggaGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ICh0aGUgLXNzbHZlcmlmeSBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHRoaXMpIHgxMXZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBleHRyYWN0IGEgVU5JWCB1c2VybmFtZSBmcm9tIHRoZSBcImVtYWlsQWRkcmVzc1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAodXNlcm5hbWVAaG9zdG5hbWUuY29tKSBvZiB0aGUgXCJTdWJqZWN0XCIgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4NTA5IFNTTCBjZXJ0IGFuZCB0aGVuIHRyeSB0byBzd2l0Y2ggdG8gdGhhdCB1c2VyIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggXCItdXNlcnMgK3VzZXJuYW1lXCIgaGFkIGJlZW4gc3VwcGxpZWQuICBJZiB5b3VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gbGltaXQgd2hpY2ggdXNlcnMgdGhpcyB3aWxsIGJlIGRvbmUgZm9yLCBwcm92aWRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVtIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgYWZ0ZXIgXCJzc2xwZWVyPVwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBlbnYuIHZhciBYMTFWTkNfU1NMUEVFUl9DTiB0byB1c2UgdGhlIENvbW1vblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAobm9ybWFsbHkgYSBob3N0bmFtZSkgaW5zdGVhZCBvZiB0aGUgRW1haWwgZmllbGQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBmb3Igc3NscGVlcj0gbW9kZSB0aGUgeDExdm5jIGFkbWluaXN0cmF0b3IgbXVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGFrZSBjYXJlIHRoYXQgYW55IGNsaWVudCBjZXJ0cyBoZSBhZGRzIHRvIC1zc2x2ZXJpZnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdGhlIGludGVuZGVkIFVOSVggdXNlcm5hbWUgaW4gdGhlIFwiZW1haWxBZGRyZXNzXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBjZXJ0LiAgT3RoZXJ3aXNlIGEgdXNlciBtYXkgYmUgYWJsZSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9nIGluIGFzIGFub3RoZXIuICBUaGlzIGNvbW1hbmQgY2FuIGJlIG9mIHVzZSBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tpbmc6IFwib3BlbnNzbCB4NTA5IC10ZXh0IC1pbiBmaWxlLmNydFwiLCBzZWUgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIlN1YmplY3Q6XCIgbGluZS4gIEFsc28sIGFsb25nIHdpdGggdGhlIG5vcm1hbCBSRkJfKlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW52LiB2YXJzLiAoc2VlIC1hY2NlcHQpIHBhc3NlZCB0byBleHRlcm5hbCBjbWQ9XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcywgUkZCX1NTTF9DTElFTlRfQ0VSVCB3aWxsIGJlIHNldCB0byB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCdzIHg1MDkgY2VydGlmaWNhdGUgc3RyaW5nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNzbHBlZXI9IG1vZGUgY2FuIGFpZCBmaW5kaW5nIFggc2Vzc2lvbnMgdmlhIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRklORERJU1BMQVkgYW5kIEZJTkRDUkVBVEVESVNQTEFZIG1lY2hhbmlzbXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBpbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSB1c2VyICpiZWZvcmUqIGNvbm5lY3Rpb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgWCBkaXNwbGF5IGFyZSBtYWRlIG9yIGFueSBmaWxlcyBvcGVuZWQgdXNlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgY2hhcmFjdGVyOiBcIi11c2VycyA9Ym9iXCIuICBUaGF0IHVzZXIgbmVlZHMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIGFibGUgdG8gb3BlbiB0aGUgWCBkaXNwbGF5IGFuZCBhbnkgZmlsZXMgb2YgY291cnNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgdXNlciBcImd1ZXNzPVwiIG1lYW5zIHRvIGV4YW1pbmUgdGhlIHV0bXB4XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSAoc2VlIHdobygxKSkgbG9va2luZyBmb3IgYSB1c2VyIGF0dGFjaGVkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGlzcGxheSBudW1iZXIgKGZyb20gRElTUExBWSBvciAtZGlzcGxheSBvcHRpb24pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgdHJ5IGhpbS9oZXIuICBUbyBsaW1pdCB0aGUgbGlzdCBvZiBndWVzc2VzLCB1c2U6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi11c2VycyBndWVzcz1ib2IsYmV0dHlcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV2ZW4gbW9yZSBzaW5pc3RlciBpcyB0aGUgc3BlY2lhbCB1c2VyIFwibHVyaz1cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyB0byB0cnkgdG8gZ3Vlc3MgdGhlIERJU1BMQVkgZnJvbSB0aGUgdXRtcHhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luIGRhdGFiYXNlIGFzIHdlbGwuICBTbyBpdCBcImx1cmtzXCIgd2FpdGluZyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFueW9uZSB0byBsb2cgaW50byBhbiBYIHNlc3Npb24gYW5kIHRoZW4gY29ubmVjdHMgdG8gaXQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgbGlzdCBvZiB1c2VycyBhZnRlciB0aGUgPSB0byBsaW1pdCB3aGljaCB1c2Vyc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB0cmllZC4gIFRvIGVuYWJsZSBhIGRpZmZlcmVudCBzZWFyY2hpbmcgbW9kZSwgaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB1c2VyIGluIHRoZSBsaXN0IGlzIHNvbWV0aGluZyBsaWtlIFwiOjBcIiBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCI6MC0yXCIgdGhhdCBpbmRpY2F0ZXMgYSByYW5nZSBvZiBESVNQTEFZIG51bWJlcnMgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB0cmllZCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGluIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXRtcHggZGF0YWJhc2UpIGZvciBhbGwgdXNlcnMgdGhhdCBhcmUgbG9nZ2VkIGluLiAgQWxzb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2VlIHRoZSBcIi1kaXNwbGF5IFdBSVQ6Li4uXCIgZnVuY3Rpb25hbGl0eS4gIEV4YW1wbGVzOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItdXNlcnMgbHVyaz1cIiBhbmQgYWxzbyBcIi11c2VycyBsdXJrPTowLTEsYm9iLG1hcnlcIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQmUgZXNwZWNpYWxseSBjYXJlZnVsIHVzaW5nIHRoZSBcImd1ZXNzPVwiIGFuZCBcImx1cms9XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2Ugb24gbWFjaGluZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdW50cnVzdHdvcnRoeSBsb2NhbCB1c2Vycy5cbiIKLSJcbiIKLSItbm9zaG0gICAgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIE1JVC1TSE0gZXh0ZW5zaW9uIGZvciB0aGUgcG9sbGluZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZSBkaXNwbGF5cyBjYW4gYmUgcG9sbGVkIHRoaXMgd2F5OiBiZSBjYXJlZnVsIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhbiB1c2UgbGFyZ2UgYW1vdW50cyBvZiBuZXR3b3JrIGJhbmR3aWR0aC4gIFRoaXMgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsc28gb2YgdXNlIGlmIHRoZSBsb2NhbCBtYWNoaW5lIGhhcyBhIGxpbWl0ZWQgbnVtYmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBzaG0gc2VnbWVudHMgYW5kIC1vbmV0aWxlIGlzIG5vdCBzdWZmaWNpZW50LlxuIgotIi1mbGlwYnl0ZW9yZGVyICAgICAgICAgU29tZXRpbWVzIG5lZWRlZCBpZiByZW1vdGVseSBwb2xsZWQgaG9zdCBoYXMgZGlmZmVyZW50XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmRpYW5uZXNzLiAgSWdub3JlZCB1bmxlc3MgLW5vc2htIGlzIHNldC5cbiIKLSItb25ldGlsZSAgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIG5ldyBjb3B5X3RpbGVzKCkgZnJhbWVidWZmZXIgbWVjaGFuaXNtLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAganVzdCB1c2UgMSBzaG0gdGlsZSBmb3IgcG9sbGluZy4gIExpbWl0cyBzaG0gc2VnbWVudHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gMy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGRpc2FibGUgYW55IGF1dG9tYXRpYyBzaG0gcmVkdWN0aW9uIHNldCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFyLiBYMTFWTkNfTk9fTElNSVRfU0hNLlxuIgotIlxuIgotIi1zb2xpZCBbY29sb3JdICAgICAgICAgVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gY2hhbmdlIHRoZSBkZXNrdG9wIGJhY2tncm91bmQgdG8gYSBzb2xpZCBjb2xvci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBbY29sb3JdIGlzIG9wdGlvbmFsOiB0aGUgZGVmYXVsdCBjb2xvciBpcyBcImN5YW40XCIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSBkaWZmZXJlbnQgb25lIHNwZWNpZnkgdGhlIFggY29sb3IgKHJnYi50eHQgbmFtZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJkYXJrYmx1ZVwiIG9yIG51bWVyaWNhbCBcIiNSUkdHQkJcIikuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhpcyBvcHRpb24gb25seSB3b3JrcyBvbiBHTk9NRSwgS0RFLCBDREUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYRkNFLCBhbmQgY2xhc3NpYyBYIChpLmUuIHdpdGggdGhlIGJhY2tncm91bmQgaW1hZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSByb290IHdpbmRvdykuICBUaGUgXCJnY29uZnRvb2wtMlwiLCBcImRjb3BcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFwieGZjb25mLXF1ZXJ5XCIgZXh0ZXJuYWwgY29tbWFuZHMgYXJlIHJ1biBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEdOT01FLCBLREUsIGFuZCBYRkNFIHJlc3BlY3RpdmVseS4gIFRoaXMgYWxzbyB3b3Jrc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb24gbmF0aXZlIE1hY09TWC4gIChUaGVyZSBpcyBubyBjb2xvciBzZWxlY3Rpb24gZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNYWNPU1ggb3IgWEZDRS4pICBPdGhlciBkZXNrdG9wcyB3b24ndCB3b3JrLCAoc2VuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXMgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgaWYgeW91IGZpbmQgdGhlbSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB4MTF2bmMgaXMgcnVubmluZyBhcyByb290IChpbmV0ZCg4KSBvciBnZG0oMSkpLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC11c2VycyBvcHRpb24gbWF5IGJlIG5lZWRlZCBmb3IgR05PTUUsIEtERSwgWEZDRS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHgxMXZuYyBndWVzc2VzIHlvdXIgZGVza3RvcCBpbmNvcnJlY3RseSwgeW91IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UgaXQgYnkgcHJlZml4aW5nIGNvbG9yIHdpdGggXCJnbm9tZTpcIiwgXCJrZGU6XCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImNkZTpcIiwgXCJ4ZmNlOlwiLCBvciBcInJvb3Q6XCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGU6IC1zb2xpZCBubyBsb25nZXIgd29ya3Mgb24gS0RFNC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSB3b3JrcyBpbiBhIGxpbWl0ZWQgd2F5IG9uIHRoZSBNYWMgT1MgWCBDb25zb2xlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9uZSBjb2xvciAoJ2tlbHAnKSB1c2luZyB0aGUgc2NyZWVuc2F2ZXIgd3JpdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJhY2tncm91bmQuICBMb29rIGluIFwifi9MaWJyYXJ5L1NjcmVlbiBTYXZlcnNcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZuY1NvbGlkQ29sb3IucG5nIHRvIGNoYW5nZSB0aGUgY29sb3IuXG4iCi0iXG4iCi0iLWJsYWNrb3V0IHN0cmluZyAgICAgICBCbGFjayBvdXQgcmVjdGFuZ2xlcyBvbiB0aGUgc2NyZWVuLiBcInN0cmluZ1wiIGlzIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFd4SCtYK1kgdHlwZSBnZW9tZXRyaWVzIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZWFjaCByZWN0YW5nbGUuICBJZiBvbmUgb2YgdGhlIGl0ZW1zIG9uIHRoZSBsaXN0IGlzIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFwibm9wdHJcIiB0aGUgbW91c2UgcG9pbnRlciB3aWxsIG5vdCBiZSBhbGxvd2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBnbyBpbnRvIGEgYmxhY2tlZCBvdXQgcmVnaW9uLlxuIgotIi14aW5lcmFtYSAgICAgICAgICAgICAgSWYgeW91ciBzY3JlZW4gaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgbW9uaXRvcnNcbiIKLSItbm94aW5lcmFtYSAgICAgICAgICAgIGdsdWVkIHRvZ2V0aGVyIHZpYSBYSU5FUkFNQSwgYW5kIHRoYXQgc2NyZWVuIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgYSByZWN0YW5nbGUgdGhpcyBvcHRpb24gd2lsbCB0cnkgdG8gZ3Vlc3MgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmVhcyB0byBibGFjayBvdXQgKGlmIHlvdXIgc3lzdGVtIGhhcyBsaWJYaW5lcmFtYSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAlc1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCwgd2UgaGF2ZSBub3RpY2VkIG9uIFhJTkVSQU1BIGRpc3BsYXlzIHlvdSBtYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gdXNlIHRoZSBcIi14d2FycHBvaW50ZXJcIiBvcHRpb24gaWYgdGhlIG1vdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIG1pc2JlaGF2ZXMgYW5kIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gVXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi1ub3h3YXJwcG9pbnRlclwiIGlmIHlvdSBkbyBub3Qgd2FudCB0aGlzLlxuIgotIlxuIgotIi14dHJhcCAgICAgICAgICAgICAgICAgVXNlIHRoZSBERUMtWFRSQVAgZXh0ZW5zaW9uIGZvciBrZXlzdHJva2UgYW5kIG1vdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpbnNlcnRpb24uICBGb3IgdXNlIG9uIGxlZ2FjeSBzeXN0ZW1zLCBlLmcuIFgxMVI1LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhbiBpbmNvbXBsZXRlIG9yIG1pc3NpbmcgWFRFU1QgZXh0ZW5zaW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBERUMtWFRSQVAgd2lsbCBiZSB1c2VkIGlmIFhURVNUIHNlcnZlciBncmFiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGlzIG1pc3NpbmcsIHVzZSAteHRyYXAgdG8gZG8gdGhlIGtleXN0cm9rZSBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIGluc2VydGlvbiB2aWEgREVDLVhUUkFQIGFzIHdlbGwuXG4iCi0iXG4iCi0iLXhyYW5kciBbbW9kZV0gICAgICAgICBJZiB0aGUgZGlzcGxheSBzdXBwb3J0cyB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgUmVmbGVjdGlvbikgZXh0ZW5zaW9uLCBhbmQgeW91IGV4cGVjdCBYUkFORFIgZXZlbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBvY2N1ciB0byB0aGUgZGlzcGxheSB3aGlsZSB4MTF2bmMgaXMgcnVubmluZywgdGhpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBpbmRpY2F0ZXMgeDExdm5jIHNob3VsZCB0cnkgdG8gcmVzcG9uZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlbSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgY3Jhc2hpbmcgYnkgYXNzdW1pbmcgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbGQgc2NyZWVuIHNpemUpLiAgU2VlIHRoZSB4cmFuZHIoMSkgbWFucGFnZSBhbmQgcnVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAneHJhbmRyIC1xJyBmb3IgbW9yZSBpbmZvLiAgW21vZGVdIGlzIG9wdGlvbmFsIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGJlbG93LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2F0Y2hpbmcgZm9yIFhSQU5EUiBldmVudHMgYW5kIHRyYXBwaW5nIGVycm9yc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2VzIHBvbGxpbmcgb3ZlcmhlYWQsIG9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYUkFORFIgY2hhbmdlcyBhcmUgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSBvbiBhIHJvdGF0YWJsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIFBEQSBvciBsYXB0b3AsIG9yIHVzaW5nIGEgWFJBTkRSLWF3YXJlIERlc2t0b3BcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHlvdSByZXNpemUgb2Z0ZW4uICBJdCBpcyBiZXN0IHRvIGJlIHZpZXdpbmcgd2l0aCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2bmN2aWV3ZXIgdGhhdCBzdXBwb3J0cyB0aGUgTmV3RkJTaXplIGVuY29kaW5nLCBzaW5jZSBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga25vd3MgaG93IHRvIHJlYWN0IHRvIHNjcmVlbiBzaXplIGNoYW5nZXMuICBPdGhlcndpc2UsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgdHJpZXMgdG8gZG8gc28gc29tZXRoaW5nIHJlYXNvbmFibGUgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXJzIHRoYXQgY2Fubm90IGRvIHRoaXMgKHBvcnRpb25zIG9mIHRoZSBzY3JlZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjbGlwcGVkLCB1bnVzZWQsIGV0YykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBub3cgaXMgdG8gY2hlY2sgZm9yIFhSQU5EUiBldmVudHMsIGJ1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHRyYXAgZXZlcnkgWCBjYWxsIHRoYXQgbWF5IGZhaWwgZHVlIHRvIHJlc2l6ZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGEgcmVzaXplIGV2ZW50IGlzIHJlY2VpdmVkLCB0aGUgZnVsbCAteHJhbmRyIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGVuYWJsZWQuICBUbyBkaXNhYmxlIGV2ZW4gY2hlY2tpbmcgZm9yIGV2ZW50cyBzdXBwbHk6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtbm94cmFuZHIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIm1vZGVcIiBkZWZhdWx0cyB0byBcInJlc2l6ZVwiLCB3aGljaCBtZWFucyBjcmVhdGUgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmV3LCByZXNpemVkLCBmcmFtZWJ1ZmZlciBhbmQgaG9wZSBhbGwgdmlld2VycyBjYW4gY29wZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY2hhbmdlLiAgXCJuZXdmYnNpemVcIiBtZWFucyBmaXJzdCBkaXNjb25uZWN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbGwgdmlld2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBOZXdGQlNpemUgVk5DXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgYW5kIHRoZW4gcmVzaXplIHRoZSBmcmFtZWJ1ZmZlci4gIFwiZXhpdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZWFucyBkaXNjb25uZWN0IGFsbCB2aWV3ZXIgY2xpZW50cywgYW5kIHRoZW4gdGVybWluYXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMuXG4iCi0iXG4iCi0iLXJvdGF0ZSBzdHJpbmcgICAgICAgICBSb3RhdGUgYW5kL29yIGZsaXAgdGhlIGZyYW1lYnVmZmVyIHZpZXcgZXhwb3J0ZWQgYnkgVk5DLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBYUkFORFIgYW5kIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb25lIGluIHNvZnR3YXJlIGluIG1haW4gbWVtb3J5IGFuZCBzbyBtYXkgYmUgc2xvd2VyLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGNvdWxkIGJlIHVzZWZ1bCBvbiBhIGhhbmRoZWxkIHdpdGggcG9ydHJhaXQgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxhbmRzY2FwZSBtb2RlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzY2FubGluZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgb2YgdGhlIGFjdHVhbCBmcmFtZWJ1ZmZlci4gIFwic3RyaW5nXCIgY2FuIGJlOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAgICAgZmxpcCBhbG9uZyB4LWF4aXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgICAgIGZsaXAgYWxvbmcgeS1heGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5ICAgICBmbGlwIGFsb25nIHgtIGFuZCB5LWF4ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICArOTAgICAgIHJvdGF0ZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC05MCAgICAgcm90YXRlIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICs5MHggICAgIHJvdGF0ZSA5MCBkZWdyZWVzIENXLCB0aGVuIGZsaXAgYWxvbmcgeFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgKzkweSAgICAgcm90YXRlIDkwIGRlZ3JlZXMgQ1csIHRoZW4gZmxpcCBhbG9uZyB5XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVzZSBnaXZlIGFsbCBwb3NzaWJsZSByb3RhdGlvbnMgYW5kIHJlZmxlY3Rpb25zLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNlczogc2FtZSBhcyB4eTogIHl4LCArMTgwLCAtMTgwLCAxODBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgLTkwOiArMjcwLCAyNzBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgKzkwOiA5MCwgKGRpdHRvIGZvciA5MHgsIDkweSlcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIExpa2UgLXNjYWxlLCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQgYXQgdGhlIHZlcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBhbnkgY2hhaW4gb2YgZnJhbWVidWZmZXIgdHJhbnNmb3JtYXRpb25zIGFuZCBzb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW55IG9wdGlvbnMgd2l0aCBnZW9tZXRyaWVzLCBlLmcuIC1ibGFja291dCwgLWNsaXAsIGV0Yy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgWCAob3IgLXJhd2ZiKSBmcmFtZWJ1ZmZlcixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgZmluYWwgb25lIHNlbnQgdG8gVk5DIHZpZXdlcnMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIGN1cnNvciBzaGFwZSB0byBiZSByb3RhdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggXCJzdHJpbmdcIiB3aXRoIFwibmM6XCIsIGUuZy4gXCJuYzorOTBcIixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwibmM6eHlcIiwgZXRjLlxuIgotIlxuIgotIi1wYWRnZW9tIFd4SCAgICAgICAgICAgV2hlbmV2ZXIgYSBuZXcgdm5jdmlld2VyIGNvbm5lY3RzLCB0aGUgZnJhbWVidWZmZXIgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBmYWtlLCBzb2xpZCBibGFjayBvbmUgb2YgZ2VvbWV0cnkgV3hILlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRseSBhZnRlcndhcmRzIHRoZSBmcmFtZWJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVhbCBvbmUuICBUaGlzIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCB2bmN2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRvIG5vdCBzdXBwb3J0IE5ld0ZCU2l6ZSBhbmQgb25lIHdhbnRzIHRvIG1ha2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cmUgdGhlIGluaXRpYWwgdmlld2VyIGdlb21ldHJ5IHdpbGwgYmUgYmlnIGVub3VnaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gaGFuZGxlIGFsbCBzdWJzZXF1ZW50IHJlc2l6ZXMgKGUuZy4gdW5kZXIgLXhyYW5kcixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1yZW1vdGUgaWQ6d2luZG93aWQsIHJlc2NhbGluZywgZXRjLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIC11bml4cHcgbW9kZSB0aGlzIHNldHMgdGhlIHNpemUgb2YgdGhlIGxvZ2luIHNjcmVlbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZSBcIm9uY2U6V3hIXCIgaXQgaWdub3JlIHBhZGdlb20gYWZ0ZXIgdGhlIGxvZ2luXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gaXMgc2V0IHVwLlxuIgotIlxuIgotIi1vIGxvZ2ZpbGUgICAgICAgICAgICAgV3JpdGUgc3RkZXJyIG1lc3NhZ2VzIHRvIGZpbGUgXCJsb2dmaWxlXCIgaW5zdGVhZCBvZiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlcm1pbmFsLiAgU2FtZSBhcyBcIi1sb2dmaWxlIGZpbGVcIi4gIFRvIGFwcGVuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGZpbGUgdXNlIFwiLW9hIGZpbGVcIiBvciBcIi1sb2dhcHBlbmQgZmlsZVwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCJsb2dmaWxlXCIgY29udGFpbnMgdGhlIHN0cmluZyBcIiUlVk5DRElTUExBWVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBleHBhbmRlZCB0byB0aGUgdm5jIGRpc3BsYXkgKHRoZSBuYW1lIG1heSBuZWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBndWVzc2VkIGF0LikgIFwiJSVIT01FXCIgd29ya3MgdG9vLlxuIgotIlxuIgotIi1mbGFnIGZpbGUgICAgICAgICAgICAgV3JpdGUgdGhlIFwiUE9SVD1OTk5OXCIgKGUuZy4gUE9SVD01OTAwKSBzdHJpbmcgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiZmlsZVwiIGluIGFkZGl0aW9uIHRvIHN0ZG91dC4gIFRoaXMgb3B0aW9uIGNvdWxkIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgYnkgd3JhcHBlciBzY3JpcHQgdG8gZGV0ZWN0IHdoZW4geDExdm5jIGlzIHJlYWR5LlxuIgotIlxuIgotIi1ybWZsYWcgZmlsZSAgICAgICAgICAgUmVtb3ZlIFwiZmlsZVwiIGF0IGV4aXQgdG8gc2lnbmFsIHdoZW4geDExdm5jIGlzIGRvbmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlsZSBpcyBjcmVhdGVkIGF0IHN0YXJ0dXAgaWYgaXQgZG9lcyBub3QgYWxyZWFkeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Qgb3IgaWYgXCJmaWxlXCIgaXMgcHJlZml4ZWQgd2l0aCBcImNyZWF0ZTpcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlIGlzIGNyZWF0ZWQsIHRoZSB4MTF2bmMgUElEIGlzIHBsYWNlZCBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUuICBPdGhlcndpc2UgdGhlIGZpbGVzIGNvbnRlbnRzIGlzIG5vdCBjaGFuZ2VkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHByZWZpeCBcIm5vY3JlYXRlOlwiIHRvIHByZXZlbnQgY3JlYXRpb24uXG4iCi0iXG4iCi0iLXJjIGZpbGVuYW1lICAgICAgICAgICBVc2UgXCJmaWxlbmFtZVwiIGluc3RlYWQgb2YgJEhPTUUvLngxMXZuY3JjIGZvciByYyBmaWxlLlxuIgotIi1ub3JjICAgICAgICAgICAgICAgICAgRG8gbm90IHByb2Nlc3MgYW55IC54MTF2bmNyYyBmaWxlIGZvciBvcHRpb25zLlxuIgotIlxuIgotIi1lbnYgVkFSPVZBTFVFICAgICAgICAgU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnVkFSJyB0byB2YWx1ZSAnVkFMVUUnXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdCB4MTF2bmMgc3RhcnR1cC4gIFRoaXMgaXMgYSBjb252ZW5pZW5jZSB1dGlsaXR5IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCBzaGVsbCBzY3JpcHQgd3JhcHBlcnMsIGV0Yy4gdG8gc2V0IHRoZSBlbnYuIHZhci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgc3BlY2lmeSBhcyBtYW55IG9mIHRoZXNlIGFzIG5lZWRlZCBvbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbGluZS5cbiIKLSItcHJvZyAvcGF0aC90by94MTF2bmMgIFNldCB0aGUgZnVsbCBwYXRoIHRvIHRoZSB4MTF2bmMgcHJvZ3JhbSBmb3IgY2FzZXMgd2hlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSBhcmd2WzBdIChlLmcuIHRjcGQvaW5ldGQpXG4iCi0iXG4iCi0iLWgsIC1oZWxwICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgdGV4dC5cbiIKLSItPywgLW9wdHMgICAgICAgICAgICAgIE9ubHkgbGlzdCB0aGUgeDExdm5jIG9wdGlvbnMuXG4iCi0iLVYsIC12ZXJzaW9uICAgICAgICAgICBQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuXG4iCi0iLWxpY2Vuc2UgICAgICAgICAgICAgICBQcmludCBvdXQgbGljZW5zZSBpbmZvcm1hdGlvbi4gIFNhbWUgYXMgLWNvcHlpbmcgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtd2FycmFudHkuXG4iCi0iXG4iCi0iLWRiZyAgICAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIGV4aXRpbmcgYWZ0ZXIgY2xlYW5pbmcgdXAsIHJ1biBhIHNpbXBsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJkZWJ1ZyBjcmFzaCBzaGVsbFwiIHdoZW4gZmF0YWwgZXJyb3JzIGFyZSB0cmFwcGVkLlxuIgotIlxuIgotIi1xLCAtcXVpZXQgICAgICAgICAgICAgQmUgcXVpZXQgYnkgcHJpbnRpbmcgbGVzcyBpbmZvcm1hdGlvbmFsIG91dHB1dCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyLiAodXNlIC1ub3F1aWV0IHRvIHVuZG8gYW4gZWFybGllciAtcXVpZXQuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIC1xdWlldCBvcHRpb24gZG9lcyBub3QgZWxpbWluYXRlIGFsbCBpbmZvcm1hdGlvbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGl0IG9ubHkgcmVkdWNlcyBpdC4gIEl0IGlzIGlnbm9yZWQgaW4gbW9zdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5IHVzYWdlIG1vZGVzLCBlLmcuIC1zdG9yZXBhc3N3ZC4gIFRvIGVsaW1pbmF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxsIG91dHB1dCB1c2U6IDI+L2Rldi9udWxsIDE+JjIsIGV0Yy5cbiIKLSJcbiIKLSItdiwgLXZlcmJvc2UgICAgICAgICAgIFByaW50IG91dCBtb3JlIGluZm9ybWF0aW9uIHRvIHN0ZGVyci5cbiIKLSJcbiIKLSItYmcgICAgICAgICAgICAgICAgICAgIEdvIGludG8gdGhlIGJhY2tncm91bmQgYWZ0ZXIgc2NyZWVuIHNldHVwLiAgTWVzc2FnZXMgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVyciBhcmUgbG9zdCB1bmxlc3MgLW8gbG9nZmlsZSBpcyB1c2VkLiAgU29tZXRoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaWtlIHRoaXMgY291bGQgYmUgdXNlZnVsIGluIGEgc2NyaXB0OlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9YHNzaCAtdCAkaG9zdCBcIngxMXZuYyAtZGlzcGxheSA6MCAtYmdcIiB8IGdyZXAgUE9SVGBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0PWBlY2hvIFwiJHBvcnRcIiB8IHNlZCAtZSAncy9QT1JUPS8vJ2BcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICBwb3J0PWBleHByICRwb3J0IC0gNTkwMGBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICB2bmN2aWV3ZXIgJGhvc3Q6JHBvcnRcbiIKLSJcbiIKLSItbW9kdHdlYWsgICAgICAgICAgICAgIE9wdGlvbiAtbW9kdHdlYWsgYXV0b21hdGljYWxseSB0cmllcyB0byBhZGp1c3QgdGhlIEFsdEdyXG4iCi0iLW5vbW9kdHdlYWsgICAgICAgICAgICBhbmQgU2hpZnQgbW9kaWZpZXJzIGZvciBkaWZmZXJpbmcgbGFuZ3VhZ2Uga2V5Ym9hcmRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGNsaWVudCBhbmQgaG9zdC4gIE90aGVyd2lzZSwgb25seSBhIHNpbmdsZSBrZXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXNzL3JlbGVhc2Ugb2YgYSBLZXljb2RlIGlzIHNpbXVsYXRlZCAoaS5lLiBpZ25vcmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoZSBtb2RpZmllcnM6IHRoaXMgdXN1YWxseSB3b3JrcyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCBrZXlib2FyZHMpLiAgQWxzbyB1c2VmdWwgaW4gcmVzb2x2aW5nIGNhc2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBhIEtleXN5bSBpcyBib3VuZCB0byBtdWx0aXBsZSBrZXlzIChlLmcuIFwiPFwiICsgXCI+XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBcIixcIiArIFwiPFwiIGtleXMpLiAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCB3aXRoIGtleXMgYW5kIC14a2Igb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1ub3hrYiwgYW5kIHNpbWlsYXIgdGhpbmdzIGRvbid0IGhlbHAsIHRyeSAtbm9tb2R0d2Vhay5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9uIHNvbWUgSFAtVVggc3lzdGVtcyBpdCBpcyBiZWVuIG5vdGVkIHRoYXQgdGhleSBoYXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbiBvZGQga2V5bWFwcGluZyB3aGVyZSBhIHNpbmdsZSBrZXljb2RlIHdpbGwgaGF2ZSBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGUuZy4gXCIjXCIsIHVwIHRvIHRocmVlIHRpbWVzLiAgWW91IGNhbiBjaGVja1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlhIFwieG1vZG1hcCAtcGtcIiBvciB0aGUgLWRrIG9wdGlvbi4gIFRoZSBmYWlsdXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB3aGVuIHlvdSB0cnkgdG8gdHlwZSBcIiNcIiBpdCB5aWVsZHMgXCIzXCIuICBJZiB5b3VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGlzIHByb2JsZW0gdHJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNT0RUV0VBS19MT1dFU1Q9MSB0byBzZWUgaWYgaXQgaGVscHMuXG4iCi0iXG4iCi0iLXhrYiAgICAgICAgICAgICAgICAgICBXaGVuIGluIG1vZHR3ZWFrIG1vZGUsIHVzZSB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiAoaWZcbiIKLSItbm94a2IgICAgICAgICAgICAgICAgIHRoZSBYIGRpc3BsYXkgc3VwcG9ydHMgaXQpIHRvIGRvIHRoZSBtb2RpZmllciB0d2Vha2luZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgcG93ZXJmdWwgYW5kIHNob3VsZCBiZSB0cmllZCBpZiB0aGVyZSBhcmUgc3RpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleW1hcHBpbmcgcHJvYmxlbXMgd2hlbiB1c2luZyAtbW9kdHdlYWsgYnkgaXRzZWxmLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIGNvbW1vbiBrZXlzeW1zLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAhLCBALCBbLCBhcmUgb25seSBhY2Nlc3NpYmxlIHZpYSAteGtiIG1vZGUgYW5kIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGVuIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSBtb2RlLiAgVG8gZGlzYWJsZSB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgZGV0ZWN0aW9uIHVzZSAtbm94a2IuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXaGVuIC14a2IgbW9kZSBpcyBhY3RpdmUgeW91IGNhbiBzZXQgdGhlc2UgZW52LiB2YXJzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhleSBhcHBseSBvbmx5IHdoZW4gdGhlcmUgaXMgYW1iaWd1aXR5IGFzIHRvIHdoaWNoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXkgdG8gY2hvb3NlIChpLmUgdGhlIG1hcHBpbmcgaXMgbm90IG9uZS10by1vbmUpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTk9LRVlISU5UUz0xOiBmb3IgdXAgYXNjaWkga2V5c3Ryb2tlcyBkbyBub3QgdXNlIHNjb3JlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoaW50cyBzYXZlZCB3aGVuIHRoZSBrZXkgd2FzIHByZXNzZWQgZG93bi4gTk9BTllET1dOPTE6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXAga2V5c3Ryb2tlcyBkbyBub3QgcmVzb3J0IHRvIHNlYXJjaGluZyB0aHJvdWdoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzIHRoYXQgYXJlIGN1cnJlbnRseSBwcmVzc2VkIGRvd24uICBLRVlTRE9XTj1OOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXIgdGhlIGxhc3QgTiBrZXlzIHByZXNzIGRvd24gZm9yIHRpZS1icmVha2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhbiB1cCBrZXlzdHJva2UgY29tZXMgaW4uXG4iCi0iXG4iCi0iLWNhcHNsb2NrICAgICAgICAgICAgICBXaGVuIGluIC1tb2R0d2VhayAodGhlIGRlZmF1bHQpIG9yIC14a2IgbW9kZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlmIGEga2V5c3ltIGluIHRoZSByYW5nZSBBLVogY29tZXMgaW4gY2hlY2sgdGhlIFhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB0byBzZWUgaWYgdGhlIENhcHNfTG9jayBpcyBzZXQuICBJZiBpdCBpcyBkb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90IGFydGlmaWNpYWxseSBwcmVzcyBTaGlmdCB0byBnZW5lcmF0ZSB0aGUga2V5c3ltLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGVuYWJsZSB0aGUgQ2Fwc0xvY2sga2V5IHRvIGJlaGF2ZSBjb3JyZWN0bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHNvbWUgY2lyY3Vtc3RhbmNlczogbmFtZWx5ICpib3RoKiB0aGUgVk5DIHZpZXdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZSBhbmQgdGhlIHgxMXZuYyBYIHNlcnZlciBhcmUgaW4gdGhlIENhcHNMb2NrXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbiBzdGF0ZS4gIElmIG9uZSBzaWRlIGhhcyBDYXBzTG9jayBvbiBhbmQgdGhlIG90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZmYgYW5kIHRoZSBrZXlib2FyZCBpcyBub3QgYmVoYXZpbmcgYXMgeW91IHRoaW5rIGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgeW91IHNob3VsZCBjb3JyZWN0IHRoZSBDYXBzTG9jayBzdGF0ZXMgKGhpbnQ6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcmVzc2luZyBDYXBzTG9jayBpbnNpZGUgYW5kIG91dHNpZGUgb2YgdGhlIHZpZXdlciBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhlbHAgdG9nZ2xlIHRoZW0gYm90aCB0byB0aGUgY29ycmVjdCBzdGF0ZSkuICBIb3dldmVyLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGJlc3QgcmVzdWx0cyBkbyBub3QgdXNlIHRoaXMgb3B0aW9uLCBidXQgcmF0aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAqb25seSogZW5hYmxlIENhcHNMb2NrIG9uIHRoZSBWTkMgdmlld2VyIHNpZGUgKGkuZS4gYnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXNzaW5nIENhcHNMb2NrIG91dHNpZGUgb2YgdGhlIHZpZXdlciB3aW5kb3csIGFsc29cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1za2lwX2xvY2trZXlzIGJlbG93KS4gIEFsc28gdHJ5IC1ub21vZHR3ZWFrIGZvciBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB3b3JrYXJvdW5kLlxuIgotIlxuIgotIi1za2lwX2xvY2trZXlzICAgICAgICAgSGF2ZSB4MTF2bmMgaWdub3JlIGFsbCBDYXBzX0xvY2ssIFNoaWZ0X0xvY2ssIE51bV9Mb2NrLFxuIgotIi1ub3NraXBfbG9ja2tleXMgICAgICAgU2Nyb2xsX0xvY2sga2V5c3ltcyByZWNlaXZlZCBmcm9tIHZpZXdlcnMuICBUaGUgaWRlYSBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91IHByZXNzIENhcHNfTG9jayBvbiB0aGUgVk5DIFZpZXdlciBzaWRlIGJ1dCB0aGF0IGRvZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjaGFuZ2UgdGhlIGxvY2sgc3RhdGUgaW4gdGhlIHgxMXZuYy1zaWRlIFggc2VydmVyLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTmV2ZXJ0aGVsZXNzIHlvdXIgY2FwaXRhbGl6ZWQgbGV0dGVycyBjb21lIGluIG92ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aXJlIGFuZCBhcmUgYXBwbGllZCBjb3JyZWN0bHkgdG8gdGhlIHgxMXZuYy1zaWRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYIHNlcnZlci4gIE5vdGUgdGhpcyBtb2RlIHByb2JhYmx5IHdvbid0IGRvIHdoYXQgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YW50IGluIC1ub21vZHR3ZWFrIG1vZGUuICBBbHNvLCBhIGtsdWRnZSBmb3IgS1BfblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzIGlzIGFsd2F5cyBkb25lIGluIHRoaXMgbW9kZTogdGhleSBhcmUgbWFwcGVkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGRpZ2l0IGtleXN5bXMuICBTZWUgYWxzbyAtY2Fwc2xvY2sgYWJvdmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAtbm9za2lwX2xvY2trZXlzLlxuIgotIlxuIgotIi1za2lwX2tleWNvZGVzIHN0cmluZyAgSWdub3JlIHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkZWNpbWFsIGtleWNvZGVzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcyB0aGVzZSBhcmUga2V5Y29kZXMgbm90IG9uIHlvdXIga2V5Ym9hcmQgYnV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3VyIFggc2VydmVyIHRoaW5rcyBleGlzdC4gIEN1cnJlbnRseSBvbmx5IGFwcGxpZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIC14a2IgbW9kZS4gIFVzZSB0aGlzIG9wdGlvbiB0byBoZWxwIHgxMXZuYyBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2UgcHJvYmxlbSBpdCB0cmllcyB0byBzb2x2ZTogS2V5c3ltIC0+IEtleWNvZGUocylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW1iaWd1aXRpZXMgZXhpc3QgKG1vcmUgdGhhbiBvbmUgS2V5Y29kZSBwZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEtleXN5bSkuICBSdW4gJ3htb2RtYXAgLXBrJyB0byBzZWUgeW91ciBrZXltYXBwaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogXCItc2tpcF9rZXljb2RlcyA5NCwxMTRcIlxuIgotIi1zbG9wcHlfa2V5cyAgICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGlvbiB0aGF0IHRyaWVzIHRvIGNvcnJlY3Qgc29tZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJzbG9wcHlcIiBrZXkgYmVoYXZpb3IuICBFLmcuIGlmIGF0IHRoZSB2aWV3ZXIgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcmVzcyBTaGlmdCtLZXkgYnV0IHRoZW4gcmVsZWFzZSB0aGUgU2hpZnQgYmVmb3JlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBLZXkgdGhhdCBjb3VsZCBnaXZlIHJpc2UgdG8gZXh0cmEgdW53YW50ZWQgY2hhcmFjdGVyc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgb25seSBiZXR3ZWVuIGtleWJvYXJkcyBvZiBkaWZmZXJlbnQgbGFuZ3VhZ2VzKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBvYnNlcnZlIHByb2JsZW1zIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvbWUga2V5c3Ryb2tlcy5cbiIKLSItc2tpcF9kdXBzICAgICAgICAgICAgIFNvbWUgVk5DIHZpZXdlcnMgc2VuZCBpbXBvc3NpYmxlIHJlcGVhdGVkIGtleSBldmVudHMsXG4iCi0iLW5vc2tpcF9kdXBzICAgICAgICAgICBlLmcuIGtleS1kb3duLCBrZXktZG93biwga2V5LXVwLCBrZXktdXAgYWxsIGZvciB0aGUgc2FtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5LCBvciAyMCBkb3ducyBpbiBhIHJvdyBmb3IgdGhlIHNhbWUgbW9kaWZpZXIga2V5IVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyAtc2tpcF9kdXBzIG1lYW5zIHRvIHNraXAgdGhlc2UgZHVwbGljYXRlcyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgcHJvY2VzcyB0aGUgZmlyc3QgZXZlbnQuIE5vdGU6IHNvbWUgVk5DIHZpZXdlcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSB0aGV5IGNhbiBzZW5kIGRvd24ncyB3aXRob3V0IHRoZSBjb3JyZXNwb25kaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1cCdzIGFuZCBzbyB5b3Ugc2hvdWxkIG5vdCBzZXQgdGhpcyBvcHRpb24gZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVzZSB2aWV3ZXJzIChzeW1wdG9tOiBzb21lIGtleXMgZG8gbm90IGF1dG9yZXBlYXQpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlc1xuIgotIi1hZGRfa2V5c3ltcyAgICAgICAgICAgSWYgYSBLZXlzeW0gaXMgcmVjZWl2ZWQgZnJvbSBhIFZOQyB2aWV3ZXIgYW5kIHRoYXRcbiIKLSItbm9hZGRfa2V5c3ltcyAgICAgICAgIEtleXN5bSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgWCBzZXJ2ZXIsIHRoZW4gYWRkIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgS2V5c3ltIHRvIHRoZSBYIHNlcnZlcidzIGtleWJvYXJkIG1hcHBpbmcgb24gYW4gdW51c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXkuICBBZGRlZCBLZXlzeW1zIHdpbGwgYmUgcmVtb3ZlZCBwZXJpb2RpY2FsbHkgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHdoZW4geDExdm5jIGV4aXRzLiAgRGVmYXVsdDogJXNcbiIKLSItY2xlYXJfbW9kcyAgICAgICAgICAgIEF0IHN0YXJ0dXAgYW5kIGV4aXQgY2xlYXIgdGhlIG1vZGlmaWVyIGtleXMgYnkgc2VuZGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVsZWFzZSBmb3IgZWFjaCBvbmUuIFRoZSBMb2NrIG1vZGlmaWVycyBhcmUgc2tpcHBlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gY2xlYXIgdGhlIHN0YXRlIGlmIHRoZSBkaXNwbGF5IHdhcyBhY2NpZGVudGFsbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgd2l0aCBhbnkgcHJlc3NlZCBkb3duLlxuIgotIi1jbGVhcl9rZXlzICAgICAgICAgICAgQXMgLWNsZWFyX21vZHMsIGV4Y2VwdCB0cnkgdG8gcmVsZWFzZSBBTlkgcHJlc3NlZCBrZXkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYW5kIC1jbGVhcl9tb2RzIGNhbiBpbnRlcmZlcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBwZXJzb24gdHlwaW5nIGF0IHRoZSBwaHlzaWNhbCBrZXlib2FyZC5cbiIKLSItY2xlYXJfYWxsICAgICAgICAgICAgIEFzIC1jbGVhcl9rZXlzLCBleGNlcHQgdHJ5IHRvIHJlbGVhc2UgYW55IENhcHNMb2NrLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9jaywgZXRjLiBsb2NrcyBhcyB3ZWxsLlxuIgotIlxuIgotIi1yZW1hcCBzdHJpbmcgICAgICAgICAgUmVhZCBLZXlzeW0gcmVtYXBwaW5ncyBmcm9tIGZpbGUgbmFtZWQgXCJzdHJpbmdcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCBpcyBvbmUgcGFpciBvZiBLZXlzeW1zIHBlciBsaW5lIChjYW4gYmUgbmFtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgaGV4IHZhbHVlKSBzZXBhcmF0ZWQgYnkgYSBzcGFjZS4gIElmIG5vIGZpbGUgbmFtZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgZXhpc3RzLCBpdCBpcyBpbnN0ZWFkIGludGVycHJldGVkIGFzIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvcm06IGtleTEta2V5MixrZXkzLWtleTQsLi4uICBTZWUgPFgxMS9rZXlzeW1kZWYuaD5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBmaWxlIGZvciBhIGxpc3Qgb2YgS2V5c3ltIG5hbWVzLCBvciB1c2UgeGV2KDEpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gbWFwIGEga2V5IHRvIGEgYnV0dG9uIGNsaWNrLCB1c2UgdGhlIGZha2UgS2V5c3ltc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJCdXR0b24xXCIsIC4uLiwgZXRjLiBFLmc6IFwiLXJlbWFwIFN1cGVyX1ItQnV0dG9uMlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodXNlZnVsIGZvciBwYXN0aW5nIG9uIGEgbGFwdG9wKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSSB1c2UgdGhlc2UgaWYgdGhlIG1hY2hpbmUgSSBhbSB2aWV3aW5nIGZyb20gZG9lcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYSBzY3JvbGx3aGVlbCBvciBJIGRvbid0IGxpa2UgdXNpbmcgdGhlIG9uZSBpdCBoYXM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlbWFwIFN1cGVyX1ItQnV0dG9uNCxNZW51LUJ1dHRvbjVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmVtYXAgS1BfQWRkLUJ1dHRvbjQsS1BfRW50ZXItQnV0dG9uNVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvcm1lciB3b3VsZCBiZSB1c2VkIG9uIGEgUEMsIHRoZSBsYXR0ZXIgb24gYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTWFjQm9vay4gIFRoaXMgd2F5IHRob3NlIGxpdHRsZSB1c2VkIGtleXMgY2FuIGJlIHVzZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGdlbmVyYXRlIGJpZ2dlciBob3BzIHRoYW4gdGhlIFVwIGFuZCBEb3duIGFycm93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZS4gIE9uZSBjYW4gc2Nyb2xsIHRocm91Z2ggdGV4dCBvciB3ZWIgcGFnZXMgbW9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tseSB0aGlzIHdheSAoZXNwZWNpYWxseSBpZiB4MTF2bmMgc2Nyb2xsIGRldGVjdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgYWN0aXZlLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZSBCdXR0b240NCwgQnV0dG9uMTIsIGV0Yy4gZm9yIG11bHRpcGxlIGNsaWNrcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGRpc2FibGUgYSBrZXlzeW0gKGkuZS4gbWFrZSBpdCBzbyBpdCB3aWxsIG5vdCBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQpLCByZW1hcCBpdCB0byBcIk5vU3ltYm9sXCIgb3IgXCJOb25lXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWFkIGtleXM6IFwiZGVhZFwiIChvciBzaWxlbnQsIG11dGUpIGtleXMgYXJlIGtleXMgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHByb2R1Y2UgYSBjaGFyYWN0ZXIgYnV0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSAybmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZS4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgYWNjZW50aW5nIGNoYXJhY3RlcnMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIHRvIHB1dCBcImBcIiBvbiB0b3Agb2YgXCJhXCIgYnkgcHJlc3NpbmcgdGhlIGRlYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleSBhbmQgdGhlbiBcImFcIi4gIE5vdGUgdGhhdCB0aGlzIGludGVycHJldGF0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcGFydCBvZiBjb3JlIFgxMSwgaXQgaXMgdXAgdG8gdGhlIHRvb2xraXQgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIGRlY2lkZSBob3cgdG8gcmVhY3QgdG8gdGhlIHNlcXVlbmNlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFgxMSBuYW1lcyBmb3IgdGhlc2Uga2V5c3ltcyBhcmUgXCJkZWFkX2dyYXZlXCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImRlYWRfYWN1dGVcIiwgZXRjLiAgSG93ZXZlciBzb21lIFZOQyB2aWV3ZXJzIHNlbmQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW1zIFwiZ3JhdmVcIiwgXCJhY3V0ZVwiIGluc3RlYWQgdGhlcmVieSBkaXNhYmxpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY2NlbnRpbmcuICBUbyB3b3JrIGFyb3VuZCB0aGlzIC1yZW1hcCBjYW4gYmUgdXNlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlIFwiLXJlbWFwIGdyYXZlLWRlYWRfZ3JhdmUsYWN1dGUtZGVhZF9hY3V0ZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBcyBhIGNvbnZlbmllbmNlLCBcIi1yZW1hcCBERUFEXCIgYXBwbGllcyB0aGVzZSByZW1hcHM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgICAgIGdyYXZlLWRlYWRfZ3JhdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICAgYWN1dGUtZGVhZF9hY3V0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICAgICBhc2NpaWNpcmN1bS1kZWFkX2NpcmN1bWZsZXhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAgICAgYXNjaWl0aWxkZS1kZWFkX3RpbGRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gICAgIG1hY3Jvbi1kZWFkX21hY3JvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgICBicmV2ZS1kZWFkX2JyZXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgICAgIGFib3ZlZG90LWRlYWRfYWJvdmVkb3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAgICAgZGlhZXJlc2lzLWRlYWRfZGlhZXJlc2lzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gICAgIGRlZ3JlZS1kZWFkX2Fib3ZlcmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBICAgICBkb3VibGVhY3V0ZS1kZWFkX2RvdWJsZWFjdXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgICAgIGNhcm9uLWRlYWRfY2Fyb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgY2VkaWxsYS1kZWFkX2NlZGlsbGFcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBqdXN0IHdhbnQgYSBzdWJzZXQgdXNlIHRoZSBmaXJzdCBsZXR0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLCBlLmcuIFwiLXJlbWFwIERFQUQ9Z2FcIiB0byBnZXQgdGhlIGZpcnN0IHR3by5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcmVtYXBzIG1heSBhbHNvIGJlIHN1cHBsaWVkIHZpYSBjb21tYXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuICBcIi1yZW1hcCBERUFEPWdhLFN1cGVyX1ItQnV0dG9uMlwiLiAgRmluYWxseSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiREVBRD1taXNzaW5nXCIgbWVhbnMgdG8gYXBwbHkgYWxsIG9mIHRoZSBhYm92ZSBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBhcyB0aGUgbGVmdCBoYW5kIG1lbWJlciBpcyBub3QgYWxyZWFkeSBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFgxMSBrZXltYXAuXG4iCi0iXG4iCi0iLW5vcmVwZWF0ICAgICAgICAgICAgICBPcHRpb24gLW5vcmVwZWF0IGRpc2FibGVzIFggc2VydmVyIGtleSBhdXRvIHJlcGVhdCB3aGVuXG4iCi0iLXJlcGVhdCAgICAgICAgICAgICAgICBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkIGFuZCBWTkMga2V5Ym9hcmQgaW5wdXQgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpZGxlIGZvciBtb3JlIHRoYW4gNSBtaW51dGVzLiAgVGhpcyB3b3JrcyBhcm91bmQgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0aW5nIGtleXN0cm9rZXMgYnVnICh0cmlnZ2VyZWQgYnkgbG9uZyBwcm9jZXNzaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWxheXMgYmV0d2VlbiBrZXkgZG93biBhbmQga2V5IHVwIGNsaWVudCBldmVudHM6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgZnJvbSBsYXJnZSBzY3JlZW4gY2hhbmdlcyBvciBoaWdoIGxhdGVuY3kpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2V0IHRoZSBlbnYuIHZhci4gWDExVk5DX0lETEVfVElNRU9VVCB0byB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBpZGxlIHNlY29uZHMgeW91IHdhbnQgKDVtaW4gPSAzMDBzZWNzKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHlvdXIgVk5DIHZpZXdlciBzaWRlIHdpbGwgbGlrZWx5IGRvIGF1dG9yZXBlYXRpbmcsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGlzIGlzIG5vIGxvc3MgdW5sZXNzIHNvbWVvbmUgaXMgc2ltdWx0YW5lb3VzbHkgYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWFsIFggZGlzcGxheS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVzZSBcIi1ub3JlcGVhdCBOXCIgdG8gc2V0IGhvdyBtYW55IHRpbWVzIG5vcmVwZWF0IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlc2V0IGlmIHNvbWV0aGluZyBlbHNlIChlLmcuIFggc2Vzc2lvbiBtYW5hZ2VyKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdW5kb2VzIGl0LiAgVGhlIGRlZmF1bHQgaXMgMi4gIFVzZSBhIG5lZ2F0aXZlIHZhbHVlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgdW5saW1pdGVkIHJlc2V0cy5cbiIKLSJcbiIKLSItbm9mYiAgICAgICAgICAgICAgICAgIElnbm9yZSB2aWRlbyBmcmFtZWJ1ZmZlcjogb25seSBwcm9jZXNzIGtleWJvYXJkIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlci4gIEludGVuZGVkIGZvciB1c2Ugd2l0aCBXaW4yVk5DIGFuZCB4MnZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZHVhbC1tb25pdG9yIHNldHVwcy5cbiIKLSItbm9iZWxsICAgICAgICAgICAgICAgIERvIG5vdCB3YXRjaCBmb3IgWEJlbGwgZXZlbnRzLiAobm8gYmVlcHMgd2lsbCBiZSBoZWFyZClcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFhCZWxsIG1vbml0b3JpbmcgcmVxdWlyZXMgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24uXG4iCi0iLW5vc2VsICAgICAgICAgICAgICAgICBEbyBub3QgbWFuYWdlIGV4Y2hhbmdlIG9mIFggc2VsZWN0aW9uL2N1dGJ1ZmZlciBiZXR3ZWVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgdmlld2VycyBhbmQgdGhlIFggc2VydmVyIGF0IGFsbC5cbiIKLSItbm9wcmltYXJ5ICAgICAgICAgICAgIERvIG5vdCBwb2xsIHRoZSBQUklNQVJZIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyB0byBzZW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiYWNrIHRvIGNsaWVudHMuICAoUFJJTUFSWSBpcyBzdGlsbCBzZXQgb24gcmVjZWl2ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMsIGhvd2V2ZXIpLlxuIgotIi1ub3NldHByaW1hcnkgICAgICAgICAgRG8gbm90IHNldCB0aGUgUFJJTUFSWSBzZWxlY3Rpb24gZm9yIGNoYW5nZXMgcmVjZWl2ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZyb20gVk5DIGNsaWVudHMuXG4iCi0iLW5vY2xpcGJvYXJkICAgICAgICAgICBEbyBub3QgcG9sbCB0aGUgQ0xJUEJPQVJEIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyB0byBzZW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiYWNrIHRvIGNsaWVudHMuICAoQ0xJUEJPQVJEIGlzIHN0aWxsIHNldCBvbiByZWNlaXZlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcywgaG93ZXZlcikuXG4iCi0iLW5vc2V0Y2xpcGJvYXJkICAgICAgICBEbyBub3Qgc2V0IHRoZSBDTElQQk9BUkQgc2VsZWN0aW9uIGZvciBjaGFuZ2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBmcm9tIFZOQyBjbGllbnRzLlxuIgotIi1zZWxkaXIgc3RyaW5nICAgICAgICAgSWYgZGlyZWN0aW9uIHN0cmluZyBpcyBcInNlbmRcIiwgb25seSBzZW5kIHRoZSBzZWxlY3Rpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHZpZXdlcnMsIGFuZCBpZiBpdCBpcyBcInJlY3ZcIiBvbmx5IHJlY2VpdmUgaXQgZnJvbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld2Vycy4gIFRvIHdvcmsgYXJvdW5kIGFwcHMgc2V0dGluZyB0aGUgc2VsZWN0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0b28gZnJlcXVlbnRseSBhbmQgbWVzc2luZyB1cCB0aGUgb3RoZXIgZW5kLiAgWW91IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgc3VwcGx5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0aW9ucyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBcImRlYnVnXCIgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0LlxuIgotIlxuIgotIi1jdXJzb3IgW21vZGVdICAgICAgICAgU2V0cyBob3cgdGhlIHBvaW50ZXIgY3Vyc29yIHNoYXBlIChsaXR0bGUgaWNvbiBhdCB0aGVcbiIKLSItbm9jdXJzb3IgICAgICAgICAgICAgIG1vdXNlIHBvaW50ZXIpIHNob3VsZCBiZSBoYW5kbGVkLiAgVGhlIFwibW9kZVwiIHN0cmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgb3B0aW9uYWwgYW5kIGlzIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBzaG93IHNvbWUgc29ydCBvZiBjdXJzb3Igc2hhcGUocykuICBIb3cgdGhpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgZG9uZSBkZXBlbmRzIG9uIHRoZSBWTkMgdmlld2VyIGFuZCB0aGUgWCBzZXJ2ZXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgLW5vY3Vyc29yIHRvIGRpc2FibGUgY3Vyc29yIHNoYXBlcyBjb21wbGV0ZWx5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBWTkMgdmlld2VycyBzdXBwb3J0IHRoZSBUaWdodFZOQyBDdXJzb3JQb3NVcGRhdGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgQ3Vyc29yU2hhcGVVcGRhdGVzIGV4dGVuc2lvbnMgKGN1dHMgZG93biBvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayB0cmFmZmljIGJ5IG5vdCBoYXZpbmcgdG8gc2VuZCB0aGUgY3Vyc29yIGltYWdlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBldmVyeSB0aW1lIHRoZSBwb2ludGVyIGlzIG1vdmVkKSwgaW4gd2hpY2ggY2FzZSB0aGVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyBhcmUgdXNlZCAoc2VlIC1ub2N1cnNvcnNoYXBlIGFuZCAtbm9jdXJzb3Jwb3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRvIGRpc2FibGUpLiAgRm9yIG90aGVyIHZpZXdlcnMgdGhlIGN1cnNvciBzaGFwZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgZnJhbWVidWZmZXIgZXZlcnkgdGltZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgaXMgbW92ZWQgb3IgY2hhbmdlZCBhbmQgZ2V0cyBzZW50IGFsb25nIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdGhlciBmcmFtZWJ1ZmZlciB1cGRhdGVzLiAgSW4gdGhpcyBjYXNlLCB0aGVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzb21lIGxhZyBiZXR3ZWVuIHRoZSB2bmMgdmlld2VyIHBvaW50ZXIgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVtb3RlIGN1cnNvciBwb3NpdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBYIGRpc3BsYXkgc3VwcG9ydHMgcmV0cmlldmluZyB0aGUgY3Vyc29yIHNoYXBlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBYIHNlcnZlciwgdGhlbiB0aGUgZGVmYXVsdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIHRoYXQgbW9kZS4gIE9uIFNvbGFyaXMgdGhpcyBjYW4gYmUgZG9uZSB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgU1VOX09WTCBleHRlbnNpb24gdXNpbmcgLW92ZXJsYXkgKHNlZSBhbHNvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLW92ZXJsYXlfbm9jdXJzb3Igb3B0aW9uKS4gIEEgc2ltaWxhciBvdmVybGF5IHNjaGVtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBvbiBJUklYLiAgWG9yZyAoZS5nLiBMaW51eCkgYW5kIHJlY2VudCBTb2xhcmlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYc3VuIHNlcnZlcnMgc3VwcG9ydCB0aGUgWEZJWEVTIGV4dGVuc2lvbiB0byByZXRyaWV2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV4YWN0IGN1cnNvciBzaGFwZSBmcm9tIHRoZSBYIHNlcnZlci4gIElmIFhGSVhFU1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpdCBpcyBwcmVmZXJyZWQgb3ZlciBPdmVybGF5IGFuZCBpcyB1c2VkIGJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IChzZWUgLW5veGZpeGVzIGJlbG93KS4gIFRoaXMgY2FuIGJlIGRpc2FibGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIC1ub2N1cnNvciwgYW5kIGFsc28gc29tZSB2YWx1ZXMgb2YgdGhlIFwibW9kZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gYmVsb3cuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdW5kZXIgWEZJWEVTIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKSB3aWxsIHVzdWFsbHkgbm90IGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgYW5kIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWF5IGZpbmQgT3ZlcmxheSBwcmVmZXJhYmxlLiAgU2VlIGFsc28gdGhlIC1hbHBoYWN1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1hbHBoYWZyYWMgb3B0aW9ucyBiZWxvdyBhcyBmdWRnZSBmYWN0b3JzIHRvIHRyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uIGZvciBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBnaXZlbiB0aGVtZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBcIm1vZGVcIiBzdHJpbmcgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWluZyBvZiBjdXJzb3Igc2hhcGVzLiAgSXQgY2FuIGJlIHVzZWQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgd2F5czpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWN1cnNvciBhcnJvd1wiIC0ganVzdCBzaG93IHRoZSBzdGFuZGFyZCBhcnJvd1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90aGluZyBtb3JlIG9yIG5vdGhpbmcgbGVzcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWN1cnNvciBub25lXCIgLSBzYW1lIGFzIFwiLW5vY3Vyc29yXCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWN1cnNvciBYXCIgLSB3aGVuIHRoZSBjdXJzb3IgYXBwZWFycyB0byBiZSBvbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgd2luZG93LCBkcmF3IHRoZSBmYW1pbGlhciBYIHNoYXBlLiAgU29tZSBkZXNrdG9wc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBHTk9NRSBjb3ZlciB1cCB0aGUgcm9vdCB3aW5kb3cgY29tcGxldGVseSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbyB0aGlzIHdpbGwgbm90IHdvcmssIHRyeSBcIlgxXCIsIGV0YywgdG8gdHJ5IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCB0aGUgdHJlZSBkZXB0aC4gIE9uIGhpZ2ggbGF0ZW5jeSBsaW5rcyBvciBzbG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lcyB0aGVyZSB3aWxsIGJlIGEgdGltZSBsYWcgYmV0d2VlbiBleHBlY3RlZCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3R1YWwgY3Vyc29yIHNoYXBlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItY3Vyc29yIHNvbWVcIiAtIGxpa2UgXCJYXCIgYnV0IHVzZSBhZGRpdGlvbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIHRyeSB0byBndWVzcyBpZiB0aGUgd2luZG93IHNob3VsZCBoYXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIHdpbmRvd21hbmFnZXItbGlrZSByZXNpemVyIGN1cnNvciBvciBhIHRleHQgaW5wdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEktYmVhbSBjdXJzb3IuICBUaGlzIGlzIGEgY29tcGxldGUgaGFjaywgYnV0IG1heSBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGluIHNvbWUgc2l0dWF0aW9ucyBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgbGl0dGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGZlZWRiYWNrIGFib3V0IHRoZSBjdXJzb3Igc2hhcGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi1jdXJzb3IgbW9zdFwiIC0gdHJ5IHRvIHNob3cgYXMgbWFueSBjdXJzb3JzIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4gIE9mdGVuIHRoaXMgd2lsbCBvbmx5IGJlIHRoZSBzYW1lIGFzIFwic29tZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgdGhlIGRpc3BsYXkgaGFzIG92ZXJsYXkgdmlzdWFscyBvciBYRklYRVNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgYXZhaWxhYmxlLiAgT24gU29sYXJpcyBhbmQgSVJJWCBpZiBYRklYRVNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUsIC1vdmVybGF5IG1vZGUgd2lsbCBiZSBhdHRlbXB0ZWQuXG4iCi0iXG4iCi0iLWN1cnNvcl9kcmFnICAgICAgICAgICBTaG93IGN1cnNvciBzaGFwZSBjaGFuZ2VzIGV2ZW4gd2hlbiB0aGUgbW91c2UgaXMgYmVpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWQgd2l0aCBhIG1vdXNlIGJ1dHRvbiBkb3duLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJlIGFibGUgdG8gc2VlIERyYWctYW5kLURyb3AgY3Vyc29yIGljb25zLCBldGMuXG4iCi0iXG4iCi0iLWFycm93IG4gICAgICAgICAgICAgICBDaG9vc2UgYW4gYWx0ZXJuYXRlIFwiYXJyb3dcIiBjdXJzb3IgZnJvbSBhIHNldCBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29tZSBjb21tb24gb25lcy4gIG4gY2FuIGJlIDEgdG8gJWQuICBEZWZhdWx0IGlzOiAlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCB3aGVuIGluIFhGSVhFUyBjdXJzb3ItZ3JhYmJpbmcgbW9kZS5cbiIKLSJcbiIKLSItbm94Zml4ZXMgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIFhGSVhFUyBleHRlbnNpb24gdG8gZHJhdyB0aGUgZXhhY3QgY3Vyc29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSBldmVuIGlmIGl0IGlzIGF2YWlsYWJsZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHdvcmsgYXJvdW5kIGEgY3Jhc2ggaW4gWG9yZyAxLjUgYW5kIGxhdGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21lIHBlb3BsZSBuZWVkZWQgdG8gdXNlIC1ub3hmaXhlcy4gIFRoZSBYb3JnIGNyYXNoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZCByaWdodCBhZnRlciBhIERpc3BsYXkgTWFuYWdlciAoZS5nLiBHRE0pIGxvZ2luLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjkgaXQgdHJpZXMgdG8gYXV0b21hdGljYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgdXNpbmcgWEZJWEVTIHVudGlsIGl0IGlzIHN1cmUgYSB3aW5kb3cgbWFuYWdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcnVubmluZy4gIFNlZSB0aGUgLXJlb3BlbiBvcHRpb24gZm9yIG1vcmUgaW5mbyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhvdyB0byB1c2UgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIgdG8gZGlzYWJsZSBpdC5cbiIKLSJcbiIKLSItYWxwaGFjdXQgbiAgICAgICAgICAgIFdoZW4gdXNpbmcgdGhlIFhGSVhFUyBleHRlbnNpb24gZm9yIHRoZSBjdXJzb3Igc2hhcGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5IHdpbGwgbm90IHVzdWFsbHkgYmUgZGlzcGxheWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBleGFjdGx5IChidXQgb3BhcXVlIG9uZXMgd2lsbCkuICBUaGlzIG9wdGlvbiBzZXRzIG4gYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgY3V0b2ZmIGZvciBjdXJzb3JzIHRoYXQgaGF2ZSB0cmFuc3BhcmVuY3kgKFwiYWxwaGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxcIiB3aXRoIHZhbHVlcyByYW5naW5nIGZyb20gMCB0byAyNTUpIEFueSBjdXJzb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIHdpdGggYWxwaGEgdmFsdWUgbGVzcyB0aGFuIG4gYmVjb21lcyBjb21wbGV0ZWx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC4gIE90aGVyd2lzZSB0aGUgcGl4ZWwgaXMgY29tcGxldGVseSBvcGFxdWUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICVkXG4iCi0iXG4iCi0iLWFscGhhZnJhYyBmcmFjdGlvbiAgICBXaXRoIHRoZSB0aHJlc2hvbGQgaW4gLWFscGhhY3V0IHNvbWUgY3Vyc29ycyB3aWxsIGJlY29tZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxtb3N0IGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYmVjYXVzZSB0aGVpciBhbHBoYSB2YWx1ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgaGlnaCBlbm91Z2guICBGb3IgdGhvc2UgY3Vyc29ycyBhZGp1c3QgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSB0aHJlc2hvbGQgdW50aWwgZnJhY3Rpb24gb2YgdGhlIG5vbi16ZXJvIGFscGhhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIHBpeGVscyBiZWNvbWUgb3BhcXVlLiAgRGVmYXVsdCAlLjJmXG4iCi0iLWFscGhhcmVtb3ZlICAgICAgICAgICBCeSBkZWZhdWx0LCBYRklYRVMgY3Vyc29ycyBwaXhlbHMgd2l0aCB0cmFuc3BhcmVuY3kgaGF2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFscGhhIGZhY3RvciBtdWx0aXBsaWVkIGludG8gdGhlIFJHQiBjb2xvciB2YWx1ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoYXQgY29ycmVzcG9uZGluZyB0byBibGVuZGluZyB0aGUgY3Vyc29yIHdpdGggYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmxhY2sgYmFja2dyb3VuZCkuICBTcGVjaWZ5IHRoaXMgb3B0aW9uIHRvIHJlbW92ZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGZhY3Rvci4gKHVzZWZ1bCBmb3IgbGlnaHQgY29sb3JlZCBzZW1pLXRyYW5zcGFyZW50XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JzKS5cbiIKLSItbm9hbHBoYWJsZW5kICAgICAgICAgIEluIFhGSVhFUyBtb2RlIGRvIG5vdCBzZW5kIGN1cnNvciBhbHBoYSBjaGFubmVsIGRhdGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIExpYlZOQ1NlcnZlci4gIFRoZSBkZWZhdWx0IGlzIHRvIHNlbmQgaXQuICBUaGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFscGhhYmxlbmQgZWZmZWN0IHdpbGwgb25seSBiZSB2aXNpYmxlIGluIC1ub2N1cnNvcnNoYXBlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIGZvciBjbGllbnRzIHdpdGggY3Vyc29yc2hhcGV1cGRhdGVzIHR1cm5lZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2ZmLiAoSG93ZXZlciB0aGVyZSBpcyBhIGhhY2sgZm9yIDMyYnBwIHdpdGggZGVwdGggMjQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCB1c2VzIHRoZSBleHRyYSA4IGJpdHMgdG8gc3RvcmUgY3Vyc29yIHRyYW5zcGFyZW5jeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSB3aXRoIGEgaGFja2VkIHZuY3ZpZXdlciB0aGF0IGFwcGxpZXMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgbG9jYWxseS4gIFNlZSB0aGUgRkFRIGZvciBtb3JlIGluZm8pLlxuIgotIlxuIgotIi1ub2N1cnNvcnNoYXBlICAgICAgICAgRG8gbm90IHVzZSB0aGUgVGlnaHRWTkMgQ3Vyc29yU2hhcGVVcGRhdGVzIGV4dGVuc2lvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBjbGllbnRzIHN1cHBvcnQgaXQuICBTZWUgLWN1cnNvciBhYm92ZS5cbiIKLSItY3Vyc29ycG9zICAgICAgICAgICAgIE9wdGlvbiAtY3Vyc29ycG9zIGVuYWJsZXMgc2VuZGluZyB0aGUgWCBjdXJzb3IgcG9zaXRpb25cbiIKLSItbm9jdXJzb3Jwb3MgICAgICAgICAgIGJhY2sgdG8gYWxsIHZuYyBjbGllbnRzIHRoYXQgc3VwcG9ydCB0aGUgVGlnaHRWTkNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvclBvc1VwZGF0ZXMgZXh0ZW5zaW9uLiAgT3RoZXIgY2xpZW50cyB3aWxsIGJlIGFibGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSB0aGUgcG9pbnRlciBtb3Rpb25zLiBEZWZhdWx0OiAlc1xuIgotIi14d2FycHBvaW50ZXIgICAgICAgICAgTW92ZSB0aGUgcG9pbnRlciB3aXRoIFhXYXJwUG9pbnRlcigzWCkgaW5zdGVhZCBvZlxuIgotIi1ub3h3YXJwcG9pbnRlciAgICAgICAgdGhlIFhURVNUIGV4dGVuc2lvbi4gIFVzZSB0aGlzIGFzIGEgd29ya2Fyb3VuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHBvaW50ZXIgbW90aW9uIGJlaGF2ZXMgaW5jb3JyZWN0bHksIGUuZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIHRvdWNoc2NyZWVucyBvciBvdGhlciBub24tc3RhbmRhcmQgc2V0dXBzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgYWxzbyBzb21ldGltZXMgbmVlZGVkIG9uIFhJTkVSQU1BIGRpc3BsYXlzIGFuZCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBieSBkZWZhdWx0IGlmIFhJTkVSQU1BIGlzIGZvdW5kIHRvIGJlIGFjdGl2ZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIHByZXZlbnQgdGhpcywgdXNlIC1ub3h3YXJwcG9pbnRlci5cbiIKLSJcbiIKLSItYWx3YXlzX2luamVjdCAgICAgICAgIEV2ZW4gaWYgdGhlcmUgaXMgbm8gZGlzcGxhY2VtZW50IChkeCA9IGR5ID0gMCkgZm9yIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFZOQyBtb3VzZSBldmVudCBmb3JjZSB0aGUgcG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIHgseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYW55d2F5LiAgUmVjZW50ICgyMDA5KSBndWkgdG9vbGtpdHMgKGdub21lKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBwcm9ibGVtcyB3aXRoIHgxMXZuYydzIG9yaWdpbmFsIG1vdXNlIGlucHV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gbWV0aG9kLiAgU28geDExdm5jJ3MgbW91c2UgaW5wdXQgaW5qZWN0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gbW9kaWZpZWQuICBUbyByZWdhaW4gdGhlIE9MRCBiZWhhdmlvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgb3B0aW9uOiAtYWx3YXlzX2luamVjdC4gIFRoZW4geDExdm5jIHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBmb3JjZSBwb3NpdGlvbmluZyB0aGUgbW91c2UgdG8gdGhlIHgseSBwb3NpdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiB0aGF0IHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFZOQyBpbnB1dCBldmVudC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwbGFjZSB0aGlzIHByb2JsZW0gd2FzIG5vdGljZWQgd2FzIGluIGdub21lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbDogaWYgeW91IHByZXNzZWQgYW5kIHJlbGVhc2VkIG1vdXNlIGJ1dHRvbiAzLCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZW51IHdhcyBwb3N0ZWQgYW5kIHRoZW4gaXRzIGZpcnN0IGVsZW1lbnQgJ05ldyBUZXJtaW5hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2luZG93JyB3YXMgYWN0aXZhdGVkLiAgVGhpcyB3YXMgYmVjYXVzZSB4MTF2bmMgaW5qZWN0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb3VzZSBwb3NpdGlvbiB0d2ljZTogb25jZSBvbiBCdXR0b25QcmVzcyBhbmQgYWdhaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIEJ1dHRvblJlbGVhc2UuICBUaGUgdG9vbGtpdCBpbnRlcnByZXRlZCB0aGUgMm5kIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXMgbW91c2UgbW90aW9uIGV2ZW4gdGhvdWdoIHRoZSBtb3VzZSBoYWRuJ3QgbW92ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTbyBub3cgYnkgZGVmYXVsdCB4MTF2bmMgdHJpZXMgdG8gYXZvaWQgaW5qZWN0aW5nIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMm5kIG9uZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3aXRoIHRoZSBuZXcgZGVmYXVsdCB4MTF2bmMgd2lsbCBiZSBvYmxpdmlvdXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGFwcGxpY2F0aW9ucyBtb3ZpbmcgdGhlIHBvaW50ZXIgKHdhcnBpbmcpIG9yIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBtb3ZpbmcgaXQuICBTbyBpdCBtaWdodCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGluamVjdCBCdXR0b25SZWxlYXNlIGF0IHRoZSB3cm9uZyBwb3NpdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgKG9yIHNpbWlsYXIgc2NlbmFyaW9zKSBjYXVzZXMgcHJvYmxlbXMgaW4geW91clxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsIHNwZWNpZnkgLWFsd2F5c19pbmplY3QgZm9yIHRoZSBvbGQgbWV0aG9kLlxuIgotIlxuIgotIi1idXR0b25tYXAgc3RyaW5nICAgICAgU3RyaW5nIHRvIHJlbWFwIG1vdXNlIGJ1dHRvbnMuICBGb3JtYXQ6IElKSy1MTU4sIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hcHMgYnV0dG9ucyBJIC0+IEwsIGV0Yy4sIGUuZy4gIC1idXR0b25tYXAgMTMtMzFcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbiBwcmVzc2VzIGNhbiBhbHNvIGJlIG1hcHBlZCB0byBrZXlzdHJva2VzOiByZXBsYWNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIGJ1dHRvbiBkaWdpdCBvbiB0aGUgcmlnaHQgb2YgdGhlIGRhc2ggd2l0aCA6PHN5bT46XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciA6PHN5bTE+KzxzeW0yPjogZXRjLiBmb3IgbXVsdGlwbGUga2V5cy4gRm9yIGV4YW1wbGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgdmlld2luZyBtYWNoaW5lIGhhcyBhIG1vdXNlLXdoZWVsIChidXR0b25zIDQgNSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgeDExdm5jIHNpZGUgZG9lcyBub3QsIHRoZXNlIHdpbGwgZG8gc2Nyb2xsczpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYnV0dG9ubWFwIDEyMzQ1LTEyMzpQcmlvcjo6TmV4dDpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYnV0dG9ubWFwIDEyMzQ1LTEyMzpVcCtVcCtVcDo6RG93bitEb3duK0Rvd246XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgPFgxMS9rZXlzeW1kZWYuaD4gaGVhZGVyIGZpbGUgZm9yIGEgbGlzdCBvZiBLZXlzeW1zLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgdXNlIHRoZSB4ZXYoMSkgcHJvZ3JhbS4gIE5vdGU6IG1hcHBpbmcgb2YgYnV0dG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGlja3MgdG8gS2V5c3ltcyBtYXkgbm90IHdvcmsgaWYgLW1vZHR3ZWFrIG9yIC14a2IgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmb3IgdGhlIEtleXN5bS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBpbmNsdWRlIGEgbW9kaWZpZXIgbGlrZSBcIlNoaWZ0X0xcIiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyJ3MgdXAvZG93biBzdGF0ZSBpcyB0b2dnbGVkLCBlLmcuIHRvIHNlbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlXCIgdXNlIDpTaGlmdF9MK3QrU2hpZnRfTCtoK2U6ICh0aGUgMXN0IG9uZSBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgZG93biBhbmQgdGhlIDJuZCBvbmUgaXMgc2hpZnQgdXApLiAobm90ZTogdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIHN0YXRlIG9mIHRoZSBtb2RpZmllciBpcyBpZ25vcmVkIGFuZCBub3QgcmVzZXQpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBpbmNsdWRlIGJ1dHRvbiBldmVudHMgdXNlIFwiQnV0dG9uMVwiLCAuLi4gZXRjLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWJ1dHRvbm1hcCBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBNYWNPU1ggY29uc29sZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gLXJhd2ZiIG1vZGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXb3JrYXJvdW5kOiB1c2UgLWJ1dHRvbm1hcCBJSi4uLi1MTS4uLj1uIHRvIGxpbWl0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG1vdXNlIGJ1dHRvbnMgdG8gbiwgZS5nLiAxMjMtMTIzPTMuICBUaGlzIHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnQgeDExdm5jIGZyb20gY3Jhc2hpbmcgaWYgdGhlIFggc2VydmVyIHJlcG9ydHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSA1IGJ1dHRvbnMgKDQvNSBzY3JvbGwgd2hlZWwpLCBidXQgdGhlcmUgYXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHJlYWxseSAzLlxuIgotIlxuIgotIi1ub2RyYWdnaW5nICAgICAgICAgICAgRG8gbm90IHVwZGF0ZSB0aGUgZGlzcGxheSBkdXJpbmcgbW91c2UgZHJhZ2dpbmcgZXZlbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAobW91c2UgYnV0dG9uIGhlbGQgZG93bikuICBHcmVhdGx5IGltcHJvdmVzIHJlc3BvbnNlIG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbG93IHNldHVwcywgYnV0IHlvdSBsb3NlIGFsbCB2aXN1YWwgZmVlZGJhY2sgZm9yIGRyYWdzLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGV4dCBzZWxlY3Rpb24sIGFuZCBzb21lIG1lbnUgdHJhdmVyc2Fscy4gIEl0IG92ZXJyaWRlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW55IC1wb2ludGVyX21vZGUgc2V0dGluZy5cbiIKLSJcbiIKLSNpZm5kZWYgTk9fTkNBQ0hFCi0iLW5jYWNoZSBuICAgICAgICAgICAgICBDbGllbnQtc2lkZSBjYWNoaW5nIHNjaGVtZS4gIEZyYW1lYnVmZmVyIG1lbW9yeSBcIm5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGFuIGludGVnZXIpIHRpbWVzIHRoYXQgb2YgdGhlIGZ1bGwgZGlzcGxheSBpcyBhbGxvY2F0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRoZSBhY3R1YWwgZnJhbWVidWZmZXIgdG8gY2FjaGUgc2NyZWVuIGNvbnRlbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmFwaWQgcmV0cmlldmFsLiAgU28gYSBXIHggSCBmcmFtYnVmZmVyIGlzIGV4cGFuZGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBhIFcgeCAobisxKSpIIG9uZS4gIFVzZSAwIHRvIGRpc2FibGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgXCJuXCIgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIHRoZSBkZWZhdWx0IGlzIDEwLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoaXMgYW5kIHRoZSBvdGhlciAtbmNhY2hlKiBvcHRpb25zIGJlbG93IHlvdSBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFiYnJldmlhdGUgXCItbmNhY2hlXCIgd2l0aCBcIi1uY1wiLiAgQWxzbywgXCItbm9uY1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyBcIi1uY2FjaGUgMFwiXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBvcHRpb24sIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW4gYXdrd2FyZCB3YXkgaW4gdGhhdCBpbiB0aGUgVk5DIFZpZXdlciB5b3UgY2FuIHNlZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIGNhY2hlIGNvbnRlbnRzIGlmIHlvdSBzY3JvbGwgZG93biwgZXRjLiAgU28geW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgdG8gc2V0IHRoaW5ncyB1cCBzbyB5b3UgY2FuJ3Qgc2VlIHRoYXQgcmVnaW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBtZXRob2QgaXMgc3VjY2Vzc2Z1bCwgdGhlIGNoYW5nZXMgcmVxdWlyZWQgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzIHRvIGRvIHRoaXMgbGVzcyBhd2t3YXJkbHkgd2lsbCBiZSBpbnZlc3RpZ2F0ZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgU1NWTkMgdmlld2VyIGRvZXMgYSBnb29kIGpvYiBhdCBhdXRvbWF0aWNhbGx5IGhpZGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4gIE9yIHVzZSBTU1ZOQydzIC15Y3JvcCBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGV4cGxpY2l0bHkgaGlkZSB0aGUgcmVnaW9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgbW9kZSBjb25zdW1lcyBhIGh1Z2UgYW1vdW50IG9mIG1lbW9yeSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJvdGggb24gdGhlIHgxMXZuYyBzZXJ2ZXIgc2lkZSBhbmQgb24gdGhlIFZOQyBWaWV3ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpZGUuICBJZiBuPTIgdGhlbiB0aGUgYW1vdW50IG9mIFJBTSB1c2VkIGlzIHJvdWdobHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyaXBsZWQgZm9yIGJvdGggeDExdm5jIGFuZCB0aGUgVk5DIFZpZXdlci4gIEFzIGEgcnVsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGh1bWIsIG5vdGUgdGhhdCAxMjgweDEwMjQgYXQgZGVwdGggMjQgaXMgYWJvdXQgNU1CXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBwaXhlbCBkYXRhLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlYXNvbmFibGUgcmVzcG9uc2Ugd2hlbiBjeWNsaW5nIHRocm91Z2ggNCB0byA2XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSAoZS5nLiB3ZWIgYnJvd3Nlcikgd2luZG93cyBhIHZhbHVlIG4gb2YgNiB0byAxMlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQuICh0aGF0J3MgcmlnaHQ6IH4xMFggbW9yZSBtZW1vcnkuLi4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIG9mIHRoZSB3YXkgd2luZG93IGJhY2tpbmdzdG9yZSBhbmQgc2F2ZXVuZGVyc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGltcGxlbWVudGVkLCBuIG11c3QgYmUgZXZlbi4gIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ5IDEgaWYgaXQgaXMgbm90LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGFsc28gd29ya3MgZm9yIG5hdGl2ZSBNYWNPUyBYLCBidXQgbWF5IG5vdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgYXMgZWZmZWN0aXZlIGFzIHRoZSBYIHZlcnNpb24uICBUaGlzIGlzIGR1ZSB0byBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgdGhpbmdzLCBvbmUgaXMgdGhlIGRyb3Atc2hhZG93IGNvbXBvc2l0aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGxlYXZlcyBleHRyYSBhcmVhcyB0aGF0IG5lZWQgdG8gYmUgcmVwYWlyZWQgKHNlZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLW5jYWNoZV9wYWQpLiAgQW5vdGhlciBpcyB0aGUgd2luZG93IGljb25pZmljYXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMgbmVlZCB0byBiZSBhdm9pZGVkIChzZWUgLW1hY2ljb250aW1lKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEl0IGFwcGVhcnMgdGhlIHRoYXQgdGhlICdTY2FsZScgYW5pbWF0aW9uIG1vZGUgZ2l2ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJldHRlciByZXN1bHRzIHRoYW4gdGhlICdHZW5pZScgb25lLiAgQWxzbywgd2luZG93IGV2ZW50XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gbm90IGFzIGFjY3VyYXRlIGFzIHRoZSBYIHZlcnNpb24uXG4iCi0iXG4iCi0iLW5jYWNoZV9jciAgICAgICAgICAgICBJbiAtbmNhY2hlIG1vZGUsIHRyeSB0byBkbyBjb3B5cmVjdCBvcGFxdWUgd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb3Zlcy9kcmFncyBpbnN0ZWFkIG9mIHdpcmVmcmFtZXMgKHRoaXMgY2FuIGluZHVjZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgZXJyb3JzKS4gIFRoZSB3aXJlZnJhbWUgd2lsbCBzdGlsbCBiZSB1c2VkIHdoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdmluZyBhIHdpbmRvdyB3aG9zZSBzYXZlLXVuZGVycyBoYXMgbm90IHlldCBiZWVuIHNldFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgaGFzIGJlZW4gaW52YWxpZGF0ZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTb21lIFZOQyBWaWV3ZXJzIHByb3ZpZGUgYmV0dGVyIHJlc3BvbnNlIHRoYW4gb3RoZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoaXMgb3B0aW9uLiAgT24gVW5peCwgcmVhbHZuYyB2aWV3ZXIgZ2l2ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNtb290aGVyIGRyYWdzIHRoYW4gdGlnaHR2bmMgdmlld2VyLiAgUmVzcG9uc2UgbWF5IGFsc29cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIGNob3BweSBpZiB0aGUgc2VydmVyIHNpZGUgbWFjaGluZSBpcyB0b28gc2xvdy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aW1lcyBvbiB2ZXJ5IHNsb3cgbW9kZW0gY29ubmVjdGlvbnMsIHRoaXMgYWN0dWFsbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdpdmVzIGFuIGltcHJvdmVtZW50IGJlY2F1c2Ugbm8gcGl4ZWwgZGF0YSBhdCBhbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChub3QgZXZlbiB0aGUgYm94IGFuaW1hdGlvbikgaXMgc2VudCBkdXJpbmcgdGhlIGRyYWcuXG4iCi0iXG4iCi0iLW5jYWNoZV9ub19tb3ZlcmFpc2UgICBJbiAtbmNhY2hlIG1vZGUsIGRvIG5vdCBhc3N1bWUgdGhhdCBtb3ZpbmcgYSB3aW5kb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgY2F1c2UgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIHJhaXNlIGl0IHRvIHRoZSB0b3BcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdGFjay4gIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBpdCBkb2VzLCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNvIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW55IHdpcmVmcmFtZSwgZXRjLCB3aW5kb3cgbW92ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aW5kb3cgd2lsbCBiZSBwdXNoZWQgdG8gdG9wIGluIHRoZSBWTkMgdmlld2VyLlxuIgotIlxuIgotIi1uY2FjaGVfbm9fZHRjaGFuZ2UgICAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgdHJ5IHRvIGd1ZXNzIHdoZW4gdGhlIGRlc2t0b3BcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh2aWV3cG9ydCkgY2hhbmdlcyB0byBhbm90aGVyIG9uZSAoaS5lLiBhbm90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJlYSkuICBUaGUgZGVmYXVsdCBpcyB0byB0cnkgdG8gZ3Vlc3MgYW5kIHdoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkIHRyeSB0byBtYWtlIHRoZSB0cmFuc2lzdGlvbiBtb3JlIHNtb290aGx5LlxuIgotIlxuIgotIi1uY2FjaGVfbm9fcm9vdHBpeG1hcCAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgdHJ5IHRvIHNuYXBzaG90IHRoZSBkZXNrdG9wXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIHRvIHVzZSBpbiBndWVzc2luZyBvciByZWNvbnN0cnVjdGluZyB3aW5kb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNhdmUtdW5kZXJzLlxuIgotIlxuIgotIi1uY2FjaGVfa2VlcF9hbmltcyAgICAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgdHJ5IHRvIGRpc2FibGUgd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyIGFuaW1hdGlvbnMgYW5kIG90aGVyIGVmZmVjdHMgKHRoYXQgdXN1YWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVncmFkZSBuY2FjaGUgcGVyZm9ybWFuY2Ugb3IgY2F1c2UgcGFpbnRpbmcgZXJyb3JzKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHRyeSB0byBkaXNhYmxlIHRoZW0gb24gS0RFIChidXQgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBHTk9NRSkgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIG90aGVyIHdpbmRvdyBtYW5hZ2VycyBvciBkZXNrdG9wcyB0aGF0IHByb3ZpZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMsIGVmZmVjdHMsIGNvbXBvc2l0aW5nLCB0cmFuc2x1Y2VuY3ksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBldGMuIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhlIC1uY2FjaGUgbWV0aG9kIHlvdSB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGRpc2FibGUgdGhlbSBtYW51YWxseS5cbiIKLSJcbiIKLSItbmNhY2hlX29sZF93bSAgICAgICAgIEluIC1uY2FjaGUgbW9kZSwgZW5hYmxlIHNvbWUgaGV1cmlzdGljcyBmb3Igb2xkIHN0eWxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlcnMgc3VjaCBhcyBmdndtIGFuZCB0d20uXG4iCi0iXG4iCi0iLW5jYWNoZV9wYWQgbiAgICAgICAgICBJbiAtbmNhY2hlIG1vZGUsIHBhZCBlYWNoIHdpbmRvdyB3aXRoIG4gcGl4ZWxzIGZvciB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcgcmVjdGFuZ2xlcy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gdHJ5IHRvIGltcHJvdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaXR1YXRpb24gd2l0aCBkcm9wc2hhZG93cyBvciBvdGhlciBjb21wb3NpdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gTWFjT1MgWCB3aW5kb3cgbWFuYWdlciksIGFsdGhvdWdoIGl0IGNvdWxkIG1ha2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyB3b3JzZS4gIFRoZSBkZWZhdWx0IGlzIDAgb24gVW5peCBhbmQgMjQgb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1hY09TIFguXG4iCi0iLWRlYnVnX25jYWNoZSAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBhbmQgcHJvZmlsaW5nIG91dHB1dCB1bmRlciAtbmNhY2hlLlxuIgotIlxuIgotI2VuZGlmCi0iLXdpcmVmcmFtZSBbc3RyXSAgICAgICBUcnkgdG8gZGV0ZWN0IHdpbmRvdyBtb3ZlcyBvciByZXNpemVzIHdoZW4gYSBtb3VzZVxuIgotIi1ub3dpcmVmcmFtZSAgICAgICAgICAgYnV0dG9uIGlzIGhlbGQgZG93biBhbmQgc2hvdyBhIHdpcmVmcmFtZSBpbnN0ZWFkIG9mXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbCBvcGFxdWUgd2luZG93LiAgVGhpcyBpcyBiYXNlZCBjb21wbGV0ZWx5IG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIGFuZCBtYXkgbm90IGFsd2F5cyB3b3JrOiBpdCBkZXBlbmRzIG9uIHlvdXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBtYW5hZ2VyIGFuZCBldmVuIGhvdyB5b3UgbW92ZSB0aGluZ3MgYXJvdW5kLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1wb2ludGVyX21vZGUgYmVsb3cgZm9yIGRpc2N1c3Npb24gb2YgdGhlIFwiYm9nZ2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG93blwiIHByb2JsZW0gdGhpcyB0cmllcyB0byBhdm9pZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICVzXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTaG9ydGVyIGFsaWFzZXM6ICAtd2YgW3N0cl0gIGFuZCAtbm93ZlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIFwic3RyXCIgaXMgb3B0aW9uYWwgYW5kLCBvZiBjb3Vyc2UsIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWQgd2l0aCBtYW55IHR1bmFibGUgcGFyYW1ldGVycyBmb3IgdGhpcyBzY2hlbWU6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHNoYWRlLGxpbmV3aWR0aCxwZXJjZW50LFQrQitMK1IsbW9kLHQxK3QyK3QzK3Q0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlc1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGxlYXZlIG5vdGhpbmcgYmV0d2VlbiBjb21tYXM6IFwiLCxcIiB0aGUgZGVmYXVsdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgdXNlZC4gIElmIHlvdSBkb24ndCBzcGVjaWZ5IGVub3VnaCBjb21tYXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhaWxpbmcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHRzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJzaGFkZVwiIGluZGljYXRlIHRoZSBcImNvbG9yXCIgZm9yIHRoZSB3aXJlZnJhbWUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c3VhbGx5IGEgZ3JleXNjYWxlOiAwLTI1NSwgaG93ZXZlciBmb3IgMTYgYW5kIDMyYnBwIHlvdVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIHNwZWNpZnkgYW4gcmdiLnR4dCBYIGNvbG9yIChlLmcuIFwiZG9kZ2VyYmx1ZVwiKSBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSA+IDI1NSBpcyB0cmVhdGVkIGFzIFJHQiAoZS5nLiByZWQgaXMgMHhmZjAwMDApLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJsaW5ld2lkdGhcIiBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgd2lyZWZyYW1lIGluIHBpeGVscy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwicGVyY2VudFwiIGluZGljYXRlcyB0byBub3QgYXBwbHkgdGhlIHdpcmVmcmFtZSBzY2hlbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHdpbmRvd3Mgd2l0aCBhcmVhIGxlc3MgdGhhbiB0aGlzIHBlcmNlbnQgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmdWxsIHNjcmVlbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiVCtCK0wrUlwiIGluZGljYXRlcyBmb3VyIGludGVnZXJzIGZvciBob3cgY2xvc2UgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0aGUgcG9pbnRlciBoYXMgdG8gYmUgZnJvbSB0aGUgVG9wLCBCb3R0b20sIExlZnQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBSaWdodCBlZGdlcyBvZiB0aGUgd2luZG93IHRvIGNvbnNpZGVyIHdpcmVmcmFtaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHNwZWVkdXAgdG8gcXVpY2tseSBleGNsdWRlIGEgd2luZG93IGZyb20gYmVpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZWQ6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkgdGhlIHNwZWVkdXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzY3JvbGxpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IHdpbGwgbGlrZWx5IGJlIHNsb3dlcikuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIm1vZFwiIHNwZWNpZmllcyBpZiBhIGJ1dHRvbiBkb3duIGV2ZW50IGluIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJpb3Igb2YgdGhlIHdpbmRvdyB3aXRoIGEgbW9kaWZpZXIga2V5IChBbHQsIFNoaWZ0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXRjLikgZG93biBzaG91bGQgaW5kaWNhdGUgYSB3aXJlZnJhbWUgb3Bwb3J0dW5pdHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgXCIwXCIgb3IgXCJub25lXCIgdG8gc2tpcCBpdCwgXCIxXCIgb3IgXCJhbGxcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYXBwbHkgaXQgdG8gYW55IG1vZGlmaWVyLCBvciBcIlNoaWZ0XCIsIFwiQWx0XCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRyb2xcIiwgXCJNZXRhXCIsIFwiU3VwZXJcIiwgb3IgXCJIeXBlclwiIHRvIG9ubHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5IGZvciB0aGF0IHR5cGUgb2YgbW9kaWZpZXIga2V5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJ0MSt0Mit0Myt0NFwiIHNwZWNpZnkgZm91ciBmbG9hdGluZyBwb2ludCB0aW1lcyBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHBvaW50ZXIgdG8gbW92ZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHQyIGlzIGhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSB3aW5kb3cgdG8gc3RhcnQgbW92aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBiZWluZyByZXNpemVkIChmb3Igc29tZSB3aW5kb3cgbWFuYWdlcnMgdGhpcyBjYW4gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciBsb25nKSwgdDMgaXMgaG93IGxvbmcgdG8ga2VlcCBhIHdpcmVmcmFtZSBtb3ZpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSByZXBhaW50aW5nIHRoZSB3aW5kb3cuIHQ0IGlzIHRoZSBtaW5pbXVtIHRpbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gc2VuZGluZyB3aXJlZnJhbWUgXCJhbmltYXRpb25zXCIuICBJZiBhIHNsb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgaXMgZGV0ZWN0ZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgYXV0b21hdGljYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB0byBzb21ldGhpbmcgYmV0dGVyIGZvciBhIHNsb3cgbGluay5cbiIKLSJcbiIKLSItbm93aXJlZnJhbWVsb2NhbCAgICAgIEJ5IGRlZmF1bHQsIG1vdXNlIG1vdGlvbiBhbmQgYnV0dG9uIHByZXNzZXMgb2YgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBzaXR0aW5nIGF0IHRoZSBMT0NBTCBkaXNwbGF5IGFyZSBtb25pdG9yZWQgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWluZyBvcHBvcnR1bml0aWVzIChzbyB0aGF0IHRoZSBjaGFuZ2VzIHdpbGwgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgZWZmaWNpZW50bHkgdG8gdGhlIFZOQyBjbGllbnRzKS4gIFVzZSB0aGlzIG9wdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLlxuIgotIlxuIgotIi13aXJlY29weXJlY3QgbW9kZSAgICAgU2luY2UgdGhlIC13aXJlZnJhbWUgbWVjaGFuaXNtIGV2aWRlbnRseSB0cmFja3MgbW92aW5nXG4iCi0iLW5vd2lyZWNvcHlyZWN0ICAgICAgICB3aW5kb3dzIGFjY3VyYXRlbHksIGEgc3BlZWR1cCBjYW4gYmUgb2J0YWluZWQgYnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRlbGxpbmcgdGhlIFZOQyB2aWV3ZXJzIHRvIGxvY2FsbHkgY29weSB0aGUgdHJhbnNsYXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IHJlZ2lvbi4gIFRoaXMgaXMgdGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZzpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZWJ1ZmZlciB1cGRhdGUgZG9lc24ndCBuZWVkIHRvIHNlbmQgdGhlIGFjdHVhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmV3IGltYWdlIGRhdGEuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTaG9ydGVyIGFsaWFzZXM6ICAtd2NyIFttb2RlXSAgYW5kIC1ub3djclxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJtb2RlXCIgY2FuIGJlIFwibmV2ZXJcIiAoc2FtZSBhcyAtbm93aXJlY29weXJlY3QpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBuZXZlciB0cnkgdGhlIGNvcHlyZWN0LCBcInRvcFwiIG1lYW5zIG9ubHkgZG8gaXQgaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aW5kb3cgd2FzIG5vdCBjb3ZlcmVkIGJ5IGFueSBvdGhlciB3aW5kb3dzLCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiYWx3YXlzXCIgbWVhbnMgdG8gdHJhbnNsYXRlIHRoZSBvcmdpbmFsbHkgdW5vYnNjdXJlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uICh0aGlzIG1heSBsb29rIG9kZCBhcyB0aGUgcmVtYWluaW5nIHBpZWNlcyBjb21lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiwgYnV0IGhlbHBzIG9uIGEgc2xvdyBsaW5rKS4gIERlZmF1bHQ6IFwiJXNcIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlcmUgY2FuIGJlIHBhaW50aW5nIGVycm9ycyBvciBzbG93IHJlc3BvbnNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIC1zY2FsZSBzbyB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBDb3B5UmVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIFwiLXdpcmVjb3B5cmVjdCBuZXZlclwiIG9uIHRoZSBjb21tYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaW5lIG9yIGJ5IHJlbW90ZS1jb250cm9sLiAgT3IgeW91IGNhbiBhbHNvIHVzZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLXNjYWxlIHh4eDpub2NyXCIgc2NhbGUgb3B0aW9uLlxuIgotIlxuIgotIi1kZWJ1Z193aXJlZnJhbWUgICAgICAgVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCBmb3IgdGhlIHdpcmVmcmFtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGV1cmlzdGljcy4gIFwiLWR3ZlwiIGlzIGFuIGFsaWFzLiAgU3BlY2lmeSBtdWx0aXBsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgZm9yIG1vcmUgb3V0cHV0LlxuIgotIlxuIgotIi1zY3JvbGxjb3B5cmVjdCBtb2RlICAgTGlrZSAtd2lyZWNvcHlyZWN0LCBidXQgdXNlIGhldXJpc3RpY3MgdG8gdHJ5IHRvIGd1ZXNzXG4iCi0iLW5vc2Nyb2xsY29weXJlY3QgICAgICBpZiBhIHdpbmRvdyBoYXMgc2Nyb2xsZWQgaXRzIGNvbnRlbnRzIChlaXRoZXIgdmVydGljYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgaG9yaXpvbnRhbGx5KS4gIFRoaXMgcmVxdWlyZXMgdGhlIFJFQ09SRCBYIGV4dGVuc2lvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gXCJzbm9vcFwiIG9uIFggYXBwbGljYXRpb25zIChjdXJyZW50bHkgZm9yIGNlcnRhaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhDb3B5QXJlYSBhbmQgWENvbmZpZ3VyZVdpbmRvdyBYIHByb3RvY29sIHJlcXVlc3RzKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOiBIaXR0aW5nIDxSZXR1cm4+IGluIGEgdGVybWluYWwgd2luZG93IHdoZW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Igd2FzIGF0IHRoZSBib3R0b20sIHRoZSB0ZXh0IHNjcm9sbHMgdXAgb25lIGxpbmUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBIaXR0aW5nIDxEb3duPiBhcnJvdyBpbiBhIHdlYiBicm93c2VyIHdpbmRvdywgdGhlIHdlYlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBzY3JvbGxzIHVwIGEgc21hbGwgYW1vdW50LiAgT3Igc2Nyb2xsaW5nIHdpdGggYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyIG9yIG1vdXNlIHdoZWVsLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRlciBhbGlhc2VzOiAgLXNjciBbbW9kZV0gIGFuZCAtbm9zY3JcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2NoZW1lIHdpbGwgbm90IGFsd2F5cyBkZXRlY3Qgc2Nyb2xscywgYnV0IHdoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IGRvZXMgdGhlcmUgaXMgYSBuaWNlIHNwZWVkdXAgZnJvbSB1c2luZyB0aGUgVk5DXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDb3B5UmVjdCBlbmNvZGluZyAoc2VlIC13aXJlY29weXJlY3QpLiAgVGhlIHNwZWVkdXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGJvdGggaW4gcmVkdWNlZCBuZXR3b3JrIHRyYWZmaWMgYW5kIHJlZHVjZWQgWFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgcG9sbGluZy9jb3B5aW5nLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5kdWNlIHVuZGVzaXJlZCB0cmFuc2llbnRzIChlLmcuIGEgdGVybWluYWwgY3Vyc29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzY3JvbGxlZCB1cCB3aGVuIGl0IHNob3VsZCBub3QgYmUpIG9yIG90aGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYWludGluZyBlcnJvcnMgKHdpbmRvdyB0ZWFyaW5nLCBidW5jaGluZy11cCwgZXRjKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IHJlcGFpcmVkIGluIGEgc2hvcnQgcGVyaW9kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiB0aW1lLiAgSWYgdGhpcyBpcyB1bmFjY2VwdGFibGUgZGlzYWJsZSB0aGUgZmVhdHVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAtbm9zY3JvbGxjb3B5cmVjdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNjcmVlbiBjbGVhcmluZyBrbHVkZ2VzOiAgZm9yIHRlc3RpbmcgYXQgbGVhc3QsIHRoZXJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgc29tZSBcIm1hZ2ljIGtleSBzZXF1ZW5jZXNcIiAobXVzdCBiZSBkb25lIGluIGxlc3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gMSBzZWNvbmQpIHRvIGFpZCByZXBhaXJpbmcgcGFpbnRpbmcgZXJyb3JzIHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBzZWVuIHdoZW4gdXNpbmcgdGhpcyBtb2RlOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMyBBbHRfTCdzICAgaW4gYSByb3c6IHJlc2VuZCB3aG9sZSBzY3JlZW4sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA0IEFsdF9MJ3MgICBpbiBhIHJvdzogcmVyZWFkIGFuZCByZXNlbmQgd2hvbGUgc2NyZWVuLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMyBTdXBlcl9MJ3MgaW4gYSByb3c6IG1hcmsgd2hvbGUgc2NyZWVuIGZvciBwb2xsaW5nLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgNCBTdXBlcl9MJ3MgaW4gYSByb3c6IHJlc2V0IFJFQ09SRCBjb250ZXh0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgNSBTdXBlcl9MJ3MgaW4gYSByb3c6IHRyeSB0byBwdXNoIGEgYmxhY2sgc2NyZWVuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3RlOiBBbHRfTCBpcyB0aGUgTGVmdCBcIkFsdFwiIGtleSAoYSBzaW5nbGUga2V5KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU3VwZXJfTCBpcyB0aGUgTGVmdCBcIlN1cGVyXCIga2V5IChXaW5kb3dzIGZsYWcpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBhcmUgbW9kaWZpZXIga2V5cywgYW5kIHNvIHNob3VsZCBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGNoYXJhY3RlcnMgd2hlbiBwcmVzc2VkIGJ5IHRoZW1zZWx2ZXMuICBBbHNvLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91ciBWTkMgdmlld2VyIG1heSBoYXZlIGl0cyBvd24gcmVmcmVzaCBob3Qta2V5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBidXR0b24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIm1vZGVcIiBjYW4gYmUgXCJuZXZlclwiIChzYW1lIGFzIC1ub3Njcm9sbGNvcHlyZWN0KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gbmV2ZXIgdHJ5IHRoZSBjb3B5cmVjdCwgXCJrZXlzXCIgbWVhbnMgdG8gdHJ5IGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiByZXNwb25zZSB0byBrZXlzdHJva2VzIG9ubHksIFwibW91c2VcIiBtZWFucyB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IGl0IGluIHJlc3BvbnNlIHRvIG1vdXNlIGV2ZW50cyBvbmx5LCBcImFsd2F5c1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB0byBkbyBib3RoLiBEZWZhdWx0OiBcIiVzXCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZXJlIGNhbiBiZSBwYWludGluZyBlcnJvcnMgb3Igc2xvdyByZXNwb25zZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB1c2luZyAtc2NhbGUgc28geW91IG1heSB3YW50IHRvIGRpc2FibGUgQ29weVJlY3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSBcIi1zY3JvbGxjb3B5cmVjdCBuZXZlclwiIG9uIHRoZSBjb21tYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaW5lIG9yIGJ5IHJlbW90ZS1jb250cm9sLiAgT3IgeW91IGNhbiBhbHNvIHVzZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLXNjYWxlIHh4eDpub2NyXCIgc2NhbGUgb3B0aW9uLlxuIgotIlxuIgotIi1zY3JfYXJlYSBuICAgICAgICAgICAgU2V0IHRoZSBtaW5pbXVtIGFyZWEgaW4gcGl4ZWxzIGZvciBhIHJlY3RhbmdsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIC1zY3JvbGxjb3B5cmVjdCBkZXRlY3Rpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS4gIFRoaXMgaXMgdG8gYXZvaWQgd2FzdGluZyB0aGUgZWZmb3J0IG9uIHNtYWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGVzIHRoYXQgd291bGQgYmUgcXVpY2tseSB1cGRhdGVkIHRoZSBub3JtYWwgd2F5LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiBzdXBwb3NlIGFuIGFwcCB1cGRhdGVkIHRoZSBwb3NpdGlvbiBvZiBpdHMgc2tpbm55XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXIgZmlyc3QgYW5kIHRoZW4gc2hpZnRlZCB0aGUgbGFyZ2UgcGFuZWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbnRyb2xsZWQuICBXZSB3YW50IHRvIGJlIHN1cmUgdG8gc2tpcCB0aGUgc21hbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhciBhbmQgZ2V0IHRoZSBsYXJnZSBwYW5lbC4gRGVmYXVsdDogJWRcbiIKLSJcbiIKLSItc2NyX3NraXAgbGlzdCAgICAgICAgIFNraXAgc2Nyb2xsIGRldGVjdGlvbiBmb3IgYXBwbGljYXRpb25zIG1hdGNoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RyaW5ncyBpbiBcImxpc3RcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgYXBwbGljYXRpb25zIGltcGxlbWVudCB0aGVpciBzY3JvbGxpbmcgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0cmFuZ2Ugd2F5cyB3aGVyZSB0aGUgWENvcHlBcmVhLCBldGMsIGFsc28gYXBwbGllc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gaW52aXNpYmxlIHBvcnRpb25zIG9mIHRoZSB3aW5kb3c6IGlmIHdlIENvcHlSZWN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aG9zZSBhcmVhcyBpdCBsb29rcyBhd2Z1bCBkdXJpbmcgdGhlIHNjcm9sbCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIG1heSBiZSBwYWludGluZyBlcnJvcnMgbGVmdCBhZnRlciB0aGUgc2Nyb2xsLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU29mZmljZS5iaW4gaXMgdGhlIHdvcnN0IGtub3duIG9mZmVuZGVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIFwiIyNcIiB0byBkZW5vdGUgdGhlIHN0YXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBjbGFzc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gXCIjI1hUZXJtXCIpIGFuZCBcIisrXCIgdG8gZGVub3RlIHRoZSBzdGFydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlIG5hbWUgKGUuZy4gXCIrK3h0ZXJtXCIpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0cmluZyB5b3VyIGxpc3QgaXMgbWF0Y2hlZCBhZ2FpbnN0IGlzIG9mIHRoZSBmb3JtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIl5eV01fTkFNRSMjQ2xhc3MrK0luc3RhbmNlPHNhbWUtZm9yLWFueS1zdWJ3aW5kb3dzPlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgXCJ4bHNjbGllbnRzIC1sYVwiIGNvbW1hbmQgd2lsbCBwcm92aWRlIHRoaXMgaW5mby5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGEgcGF0dGVybiBpcyBwcmVmaXhlZCB3aXRoIFwiS0VZOlwiIGl0IG9ubHkgYXBwbGllc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gS2V5c3Ryb2tlIGdlbmVyYXRlZCBzY3JvbGxzIChlLmcuIFVwIGFycm93KS4gIElmIGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmVmaXhlZCB3aXRoIFwiTU9VU0U6XCIgaXQgb25seSBhcHBsaWVzIHRvIE1vdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmR1Y2VkIHNjcm9sbHMgKGUuZy4gZHJhZ2dpbmcgb24gYSBzY3JvbGxiYXIpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSItc2NyX2luYyBsaXN0ICAgICAgICAgIE9wcG9zaXRlIG9mIC1zY3Jfc2tpcDogdGhpcyBsaXN0IGlzIGNvbnN1bHRlZCBmaXJzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGlmIHRoZXJlIGlzIGEgbWF0Y2ggdGhlIHdpbmRvdyB3aWxsIGJlIG1vbml0b3JlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlhIFJFQ09SRCBmb3Igc2Nyb2xscyBpcnJlc3BlY3RpdmUgb2YgLXNjcl9za2lwLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1zY3Jfc2tpcCAnKicgdG8gc2tpcCBhbnl0aGluZyB0aGF0IGRvZXMgbm90IG1hdGNoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3VyIC1zY3JfaW5jLiAgVXNlIC1zY3JfaW5jICcqJyB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcuXG4iCi0iXG4iCi0iLXNjcl9rZXlzIGxpc3QgICAgICAgICBGb3Iga2V5c3Ryb2tlIHNjcm9sbCBkZXRlY3Rpb24sIG9ubHkgYXBwbHkgdGhlIFJFQ09SRFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGV1cmlzdGljcyB0byB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5c3ltcyBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0XCIuICBZb3UgbWF5IGZpbmQgdGhlIFJFQ09SRCBvdmVyaGVhZCBmb3IgZXZlcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZiB5b3VyIGtleXN0cm9rZXMgZGlzcnVwdHMgdHlwaW5nIHRvbyBtdWNoLCBidXQgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkb24ndCB3YW50IHRvIHR1cm4gaXQgb2ZmIGNvbXBsZXRlbHkgd2l0aCBcIi1zY3IgbW91c2VcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1zY3JfcGFybXMgZG9lcyBub3Qgd29yayBvciBpcyB0b28gY29uZnVzaW5nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxpc3RlZCBrZXlzeW1zIGNhbiBiZSBudW1lcmljIG9yIHRoZSBrZXlzeW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGluIHRoZSA8WDExL2tleXN5bWRlZi5oPiBoZWFkZXIgZmlsZSBvciBmcm9tIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGV2KDEpIHByb2dyYW0uICBFeGFtcGxlOiBcIi1zY3Jfa2V5cyBVcCxEb3duLFJldHVyblwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT25lIHByb2JhYmx5IHdhbnRzIHRvIGhhdmUgYXBwbGljYXRpb24gc3BlY2lmaWMgbGlzdHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGZvciB0ZXJtaW5hbHMsIGV0YykgYnV0IHRoYXQgaXMgdG9vIGlja3kgdG8gdGhpbmtcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IGZvciBub3cuLi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIFwibGlzdFwiIGJlZ2lucyB3aXRoIHRoZSBcIi1cIiBjaGFyYWN0ZXIgdGhlIGxpc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHRha2VuIGFzIGFuIGV4Y2x1ZGUgbGlzdDogYWxsIGtleXN5bXMgZXhjZXB0IHRob3NlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsaXN0IHdpbGwgYmUgY29uc2lkZXJlZC4gIFRoZSBzcGVjaWFsIHN0cmluZyBcImJ1aWx0aW5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kcyB0byBhbiBpbnRlcm5hbCBsaXN0IG9mIGtleXN5bXMgdGhhdCBhcmUgbGlrZWx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBjYXVzZSBzY3JvbGxzLiAgQlRXLCBieSBkZWZhdWx0IG1vZGlmaWVyIGtleXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTaGlmdF9MLCBDb250cm9sX1IsIGV0YywgYXJlIHNraXBwZWQgc2luY2UgdGhleSBhbG1vc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGluZHVjZSBzY3JvbGxpbmcgYnkgdGhlbXNlbHZlcy5cbiIKLSJcbiIKLSItc2NyX3Rlcm0gbGlzdCAgICAgICAgIFlldCBhbm90aGVyIGNvc21ldGljIGtsdWRnZS4gIEFwcGx5IHNoZWxsL3Rlcm1pbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIGFwcGxpY2F0aW9ucyBtYXRjaGluZyBjb21tYSBzZXBhcmF0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgKHNhbWUgYXMgZm9yIC1zY3Jfc2tpcC8tc2NyX2luYykuICBGb3IgZXhhbXBsZSBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5ub3lpbmcgdHJhbnNpZW50IHVuZGVyIHNjcm9sbCBkZXRlY3Rpb24gaXMgaWYgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoaXQgRW50ZXIgaW4gYSB0ZXJtaW5hbCBzaGVsbCB3aXRoIGZ1bGwgdGV4dCB3aW5kb3csXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgc29saWQgdGV4dCBjdXJzb3IgYmxvY2sgd2lsbCBiZSBzY3JvbGxlZCB1cC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIGZvciBhIHNob3J0IHRpbWUgdGhlcmUgYXJlIHR3byAob3IgbW9yZSkgYmxvY2tcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnMgb24gdGhlIHNjcmVlbi4gIFRoZXJlIGFyZSBzaW1pbGFyIHNjZW5hcmlvcyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGFuIG91dHB1dCBsaW5lIGlzIGR1cGxpY2F0ZWQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgdHJhbnNpZW50cyBhcmUgaW5kdWNlZCBieSB0aGUgYXBwcm94aW1hdGlvbiBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsIGRldGVjdGlvbiAoZS5nLiBpdCBkZXRlY3RzIHRoZSBzY3JvbGwsIGJ1dCBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmYWN0IHRoYXQgdGhlIGJsb2NrIGN1cnNvciB3YXMgY2xlYXJlZCBqdXN0IGJlZm9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjcm9sbCkuICBJbiBuZWFybHkgYWxsIGNhc2VzIHRoZXNlIHRyYW5zaWVudCBlcnJvcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSByZXBhaXJlZCB3aGVuIHRoZSB0cnVlIFggZnJhbWVidWZmZXIgaXMgY29uc3VsdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgbm9ybWFsIHBvbGxpbmcuICBCdXQgdGhleSBhcmUgZGlzdHJhY3RpbmcsIHNvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGF0IHRoaXMgb3B0aW9uIHByb3ZpZGVzIGlzIGV4dHJhIFwicGFkZGluZ1wiIG5lYXIgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gb2YgdGhlIHRlcm1pbmFsIHdpbmRvdzogYSBmZXcgZXh0cmEgbGluZXMgbmVhclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSB3aWxsIG5vdCBiZSBzY3JvbGxlZCwgYnV0IHJhdGhlciB1cGRhdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBhY3R1YWwgWCBmcmFtZWJ1ZmZlci4gIFRoaXMgdXN1YWxseSByZWR1Y2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgYW5ub3lpbmcgYXJ0aWZhY3RzLiAgVXNlIFwibm9uZVwiIHRvIGRpc2FibGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiBcIiVzXCJcbiIKLSJcbiIKLSItc2NyX2tleXJlcGVhdCBsby1oaSAgIElmIGEga2V5IGlzIGhlbGQgZG93biAob3Igb3RoZXJ3aXNlIHJlcGVhdHMgcmFwaWRseSkgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGluZHVjZXMgYSByYXBpZCBzZXF1ZW5jZSBvZiBzY3JvbGxzIChlLmcuIGhvbGRpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvd24gYW4gQXJyb3cga2V5KSB0aGUgXCJzY3JvbGxjb3B5cmVjdFwiIGRldGVjdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIG92ZXJoZWFkIG1heSBub3QgYmUgYWJsZSB0byBrZWVwIHVwLiAgQSB0aW1lIHBlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIHNjcm9sbCBlc3RpbWF0ZSBpcyBwZXJmb3JtZWQgYW5kIGlmIHRoYXQgZXN0aW1hdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RzIGEgc3VzdGFpbmFibGUgc2Nyb2xscmF0ZSBvZiBrZXlzIHBlciBzZWNvbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gXCJsb1wiIGFuZCBcImhpXCIgdGhlbiByZXBlYXRlZCBrZXlzIHdpbGwgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERJU0NBUkRFRCB0byBtYWludGFpbiB0aGUgc2Nyb2xscmF0ZS4gRm9yIGV4YW1wbGUgeW91clxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5IGF1dG9yZXBlYXQgbWF5IGJlIDI1IGtleXMvc2VjLCBidXQgZm9yIGEgbGFyZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBvciBzbG93IGxpbmsgb25seSA4IHNjcm9sbHMgcGVyIHNlY29uZCBjYW4gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1c3RhaW5lZCwgdGhlbiByb3VnaGx5IDIgb3V0IG9mIGV2ZXJ5IDMgcmVwZWF0ZWQga2V5c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBkaXNjYXJkZWQgZHVyaW5nIHRoaXMgcGVyaW9kLiBEZWZhdWx0OiBcIiVzXCJcbiIKLSJcbiIKLSItc2NyX3Bhcm1zIHN0cmluZyAgICAgIFNldCB2YXJpb3VzIHBhcmFtZXRlcnMgZm9yIHRoZSBzY3JvbGxjb3B5cmVjdCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyBzaW1pbGFyIHRvIHRoYXQgZm9yIC13aXJlZnJhbWUgYW5kIHBhY2tlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBsb3RzIG9mIHBhcmFtZXRlcnM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IFQrQitMK1IsdDErdDIrdDMsczErczIrczMrczQrczVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICVzXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgbGVhdmUgbm90aGluZyBiZXR3ZWVuIGNvbW1hczogXCIsLFwiIHRoZSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyB1c2VkLiAgSWYgeW91IGRvbid0IHNwZWNpZnkgZW5vdWdoIGNvbW1hcyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFpbGluZyBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdHMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIlQrQitMK1JcIiBpbmRpY2F0ZXMgZm91ciBpbnRlZ2VycyBmb3IgaG93IGNsb3NlIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgdGhlIHBvaW50ZXIgaGFzIHRvIGJlIGZyb20gdGhlIFRvcCwgQm90dG9tLCBMZWZ0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgUmlnaHQgZWRnZXMgb2YgdGhlIHdpbmRvdyB0byBjb25zaWRlciBzY3JvbGxjb3B5cmVjdC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIC13aXJlZnJhbWUgb3ZlcmxhcHMgaXQgdGFrZXMgcHJlY2VkZW5jZS4gIFRoaXMgaXMgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlZWR1cCB0byBxdWlja2x5IGV4Y2x1ZGUgYSB3aW5kb3cgZnJvbSBiZWluZyB3YXRjaGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2Nyb2xsY29weXJlY3Q6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVlZHVwICh0aGluZ3MgbGlrZSBzZWxlY3RpbmcgdGV4dCB3aWxsIGxpa2VseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgc2xvd2VyKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwidDErdDIrdDNcIiBzcGVjaWZ5IHRocmVlIGZsb2F0aW5nIHBvaW50IHRpbWVzIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIHRoYXQgYXBwbHkgdG8gc2Nyb2xsY29weXJlY3QgZGV0ZWN0aW9uIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICpLZXlzdHJva2UqIGlucHV0OiB0MSBpcyBob3cgbG9uZyB0byB3YWl0IGFmdGVyIGEga2V5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmVzc2VkIGZvciB0aGUgZmlyc3Qgc2Nyb2xsLCB0MiBpcyBob3cgbG9uZyB0byBrZWVwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb29raW5nIGFmdGVyIGEgS2V5c3Ryb2tlIHNjcm9sbCBmb3IgbW9yZSBzY3JvbGxzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdDMgaXMgaG93IGZyZXF1ZW50bHkgdG8gdHJ5IHRvIHVwZGF0ZSBzdXJyb3VuZGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFycyBvdXRzaWRlIG9mIHRoZSBzY3JvbGxpbmcgYXJlYSAoMC4wIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJzMStzMitzMytzNCtzNVwiIHNwZWNpZnkgZml2ZSBmbG9hdGluZyBwb2ludCB0aW1lc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gc2Vjb25kcyB0aGF0IGFwcGx5IHRvIHNjcm9sbGNvcHlyZWN0IGRldGVjdGlvbiB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAqTW91c2UqIGlucHV0OiBzMSBpcyBob3cgbG9uZyB0byB3YWl0IGFmdGVyIGEgbW91c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiBpcyBwcmVzc2VkIGZvciB0aGUgZmlyc3Qgc2Nyb2xsLCBzMiBpcyBob3cgbG9uZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8ga2VlcCB3YWl0aW5nIGZvciBhZGRpdGlvbmFsIHNjcm9sbHMgYWZ0ZXIgdGhlIGZpcnN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNb3VzZSBzY3JvbGwgd2FzIGRldGVjdGVkLiAgczMgaXMgaG93IGZyZXF1ZW50bHkgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byB1cGRhdGUgc3Vycm91bmRpbmcgc2Nyb2xsYmFycyBvdXRzaWRlIG9mIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nIGFyZWEgKDAuMCB0byBkaXNhYmxlKS4gIHM0IGlzIGhvdyBsb25nIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgcG9pbnRlciBtb3Rpb24gKHRvIHRyeSB0byBnZXQgZmV3ZXIsIGJpZ2dlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW91c2Ugc2Nyb2xscykuIHM1IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gc3BlbmQganVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRpbmcgdGhlIHNjcm9sbCB3aW5kb3cgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbi5cbiIKLSJcbiIKLSItZml4c2NyZWVuIHN0cmluZyAgICAgIFBlcmlvZGljYWxseSBcInJlcGFpclwiIHRoZSBzY3JlZW4gYmFzZWQgb24gc2V0dGluZ3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIFwic3RyaW5nXCIuICBIb3BlZnVsbHkgeW91IHdvbid0IG5lZWQgdGhpcyBvcHRpb24sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlbiB0aGUgLXNjcm9sbGNvcHlyZWN0IG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtd2lyZWNvcHlyZWN0IGZlYXR1cmVzIGxlYXZlIHRvbyBtYW55IHBhaW50aW5nIGVycm9ycyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBjYW4gYmUgdXNlZCBmb3IgYW55IHNjZW5hcmlvLiAgVGhpcyBvcHRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljYWxseSBwZXJmb3JtcyBjb3N0bHkgb3BlcmF0aW9ucyBhbmQgc29cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlIG1heSBiZSByZWR1Y2VkIHdoZW4gaXQgaXMgb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSAzIEFsdF9MJ3MgKHRoZSBMZWZ0IFwiQWx0XCIga2V5KSB0YXBzIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIHJvdyAoYXMgZGVzY3JpYmVkIHVuZGVyIC1zY3JvbGxjb3B5cmVjdCkgaW5zdGVhZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsbHkgcmVxdWVzdCBhIHNjcmVlbiByZXBhaW50IHdoZW4gaXQgaXMgbmVlZGVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIG9mXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZm9sbG93aW5nOiBcIlY9dFwiLCBcIkM9dFwiLCBcIlg9dFwiLCBhbmQgXCI4PXRcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZXNlIFwidFwiIHN0YW5kcyBmb3IgYSB0aW1lIGluIHNlY29uZHMgKGl0IGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIGZsb2F0aW5nIHBvaW50IGV2ZW4gdGhvdWdoIG9uZSBzaG91bGQgdXN1YWxseSB1c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA+IDIgdG8gYXZvaWQgd2FzdGluZyByZXNvdXJjZXMpLiAgViBzZXRzIGhvd1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbnRseSB0aGUgZW50aXJlIHNjcmVlbiBzaG91bGQgYmUgc2VudCB0byB2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoaXQgaXMgbGlrZSB0aGUgMyBBbHRfTCdzKS4gIEMgc2V0cyBob3cgbG9uZyB0byB3YWl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBhIENvcHlSZWN0IHRvIHJlcGFpbnQgdGhlIGZ1bGwgc2NyZWVuLiAgWCBzZXRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBob3cgZnJlcXVlbnRseSB0byByZXJlYWQgdGhlIGZ1bGwgWDExIGZyYW1lYnVmZmVyIGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBYIHNlcnZlciBhbmQgcHVzaCBpdCBvdXQgdG8gY29ubmVjdGVkIHZpZXdlcnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2Ugb2YgWCBzaG91bGQgYmUgcmFyZSwgcGxlYXNlIHJlcG9ydCBhIGJ1ZyBpZiB5b3VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpbmQgeW91IG5lZWQgaXQuIDg9IGFwcGxpZXMgb25seSBmb3IgLTh0bzI0IG1vZGU6IGl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXRzIGhvdyBvZnRlbiB0aGUgbm9uLWRlZmF1bHQgdmlzdWFsIHJlZ2lvbnMgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gKGUuZy4gOGJwcCB3aW5kb3dzKSBhcmUgcmVmcmVzaGVkLiAgRXhhbXBsZXM6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZml4c2NyZWVuIFY9MTAgLWZpeHNjcmVlbiBDPTEwXG4iCi0iXG4iCi0iLWRlYnVnX3Njcm9sbCAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBpbmZvIHByaW50b3V0IGZvciB0aGUgc2Nyb2xsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzLiAgXCItZHNcIiBpcyBhbiBhbGlhcy4gIFNwZWNpZnkgaXQgbXVsdGlwbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIGZvciBtb3JlIG91dHB1dC5cbiIKLSJcbiIKLSItbm94cmVjb3JkICAgICAgICAgICAgIERpc2FibGUgYW55IHVzZSBvZiB0aGUgUkVDT1JEIGV4dGVuc2lvbi4gIFRoaXMgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSAtc2Nyb2xsY29weXJlY3Qgc2NoZW1lIGFuZCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciBYIHNlcnZlciBncmFicy5cbiIKLSJcbiIKLSItZ3JhYl9idXN0ZXIgICAgICAgICAgIFNvbWUgb2YgdGhlIHVzZSBvZiB0aGUgUkVDT1JEIGV4dGVuc2lvbiBjYW4gbGVhdmUgYVxuIgotIi1ub2dyYWJfYnVzdGVyICAgICAgICAgdGlueSB3aW5kb3cgZm9yIFhHcmFiU2VydmVyIGRlYWRsb2NrLiAgVGhpcyBpcyBvbmx5IGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2hvbGUtc2VydmVyIGdyYWJiaW5nIGFwcGxpY2F0aW9uIGV4cGVjdHMgbW91c2Ugb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleWJvYXJkIGlucHV0IGJlZm9yZSByZWxlYXNpbmcgdGhlIGdyYWIuICBJdCBpcyB1c3VhbGx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIHdpbmRvdyBtYW5hZ2VyIHRoYXQgZG9lcyB0aGlzLiAgeDExdm5jIHRha2VzIGNhcmUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIHRoZSBwcm9ibGVtLCBidXQgaWYgY2F1Z2h0IHgxMXZuYyB3aWxsIGZyZWV6ZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFdpdGhvdXQgLWdyYWJfYnVzdGVyLCB0aGUgb25seSBzb2x1dGlvbiBpcyB0byBnbyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGRpc3BsYXkgYW5kIGdpdmUgaXQgc29tZSBpbnB1dCB0byBzYXRpc2Z5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYmJpbmcgYXBwLiAgT3IgbWFudWFsbHkga2lsbCBhbmQgcmVzdGFydCB0aGUgd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyIGlmIHRoYXQgaXMgZmVhc2libGUuICBXaXRoIC1ncmFiX2J1c3RlciwgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGZvcmsgYSBoZWxwZXIgdGhyZWFkIGFuZCBpZiB4MTF2bmMgYXBwZWFycyB0byBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3R1Y2sgaW4gYSBncmFiIGFmdGVyIGEgcGVyaW9kIG9mIHRpbWUgKDIwLTMwIHNlYykgdGhlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBpbmplY3Qgc29tZSB1c2VyIGlucHV0OiBidXR0b24gY2xpY2tzLCBFc2NhcGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBtb3Rpb24sIGV0YyB0byB0cnkgdG8gYnJlYWsgdGhlIGdyYWIuICBJZiB5b3VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaWVuY2UgYSBsb3Qgb2YgZ3JhYiBkZWFkbG9jaywgcGxlYXNlIHJlcG9ydCBhIGJ1Zy5cbiIKLSJcbiIKLSItZGVidWdfZ3JhYnMgICAgICAgICAgIFR1cm4gb24gZGVidWdnaW5nIGluZm8gcHJpbnRvdXQgd2l0aCByZXNwZWN0IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYR3JhYlNlcnZlcigpIGRlYWRsb2NrIGZvciAtc2Nyb2xsY29weXJlY3QgbW9kZS5cbiIKLSJcbiIKLSItZGVidWdfc2VsICAgICAgICAgICAgIFR1cm4gb24gZGVidWdnaW5nIGluZm8gcHJpbnRvdXQgd2l0aCByZXNwZWN0IHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZLCBDTElQQk9BUkQsIGFuZCBDVVRCVUZGRVIwIHNlbGVjdGlvbnMuXG4iCi0iXG4iCi0iLXBvaW50ZXJfbW9kZSBuICAgICAgICBWYXJpb3VzIHBvaW50ZXIgbW90aW9uIHVwZGF0ZSBzY2hlbWVzLiBcIi1wbVwiIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbiBhbGlhcy4gIFRoZSBwcm9ibGVtIGlzIHBvaW50ZXIgbW90aW9uIGNhbiBjYXVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmFwaWQgY2hhbmdlcyBvbiB0aGUgc2NyZWVuOiBjb25zaWRlciB0aGUgcmFwaWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgd2hlbiB5b3UgZHJhZyBhIGxhcmdlIHdpbmRvdyBhcm91bmQgb3BhcXVlbHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOZWl0aGVyIHgxMXZuYydzIHNjcmVlbiBwb2xsaW5nIGFuZCB2bmMgY29tcHJlc3Npb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmVzIG5vciB0aGUgYmFuZHdpZHRoIHRvIHRoZSB2bmN2aWV3ZXJzIGNhbiBrZWVwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1cCB0aGVzZSByYXBpZCBzY3JlZW4gY2hhbmdlczogZXZlcnl0aGluZyB3aWxsIGJvZyBkb3duXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGRyYWdnaW5nIG9yIHNjcm9sbGluZy4gIFNvIGEgc2NoZW1lIGhhcyB0byBiZSB1c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBcImVhdFwiIG11Y2ggb2YgdGhhdCBwb2ludGVyIGlucHV0IGJlZm9yZSByZS1wb2xsaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2NyZWVuIGFuZCBzZW5kaW5nIG91dCBmcmFtZWJ1ZmZlciB1cGRhdGVzLiBUaGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgbnVtYmVyIFwiblwiIGNhbiBiZSAwIHRvICVkIGFuZCBzZWxlY3RzIG9uZSBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjaGVtZXMgZGVzcmliZWQgYmVsb3cuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIC13aXJlZnJhbWUgYW5kIC1zY3JvbGxjb3B5cmVjdCBtb2Rlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxlbWVudCAtcG9pbnRlcl9tb2RlIGJ5IGRldGVjdGluZyAoYW5kIGltcHJvdmluZylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gcGVyaW9kcyBvZiBcInJhcGlkIHNjcmVlbiBjaGFuZ2VcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG49MDogZG9lcyB0aGUgc2FtZSBhcyAtbm9kcmFnZ2luZy4gKGFsbCBzY3JlZW4gcG9sbGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VzcGVuZGVkIGlmIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbj0xOiB3YXMgdGhlIG9yaWdpbmFsIHNjaGVtZSB1c2VkIHRvIGFib3V0IEphbiAyMDA0OlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXQgYmFzaWNhbGx5IGp1c3Qgc2tpcHMgLWlucHV0X3NraXAga2V5Ym9hcmQgb3IgcG9pbnRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIGJlZm9yZSByZXBvbGxpbmcgdGhlIHNjcmVlbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG49MiBpcyBhbiBpbXByb3ZlZCBzY2hlbWU6IGJ5IHdhdGNoaW5nIHRoZSBjdXJyZW50IHJhdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIGlucHV0IGV2ZW50cyBpdCB0cmllcyB0byBkZXRlY3QgaWYgaXQgc2hvdWxkIHRyeSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJlYXRcIiBhZGRpdGlvbmFsIHBvaW50ZXIgZXZlbnRzIGJlZm9yZSBjb250aW51aW5nLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbj0zIGlzIGJhc2ljYWxseSBhIGR5bmFtaWMgLW5vZHJhZ2dpbmcgbW9kZTogaXQgZGV0ZWN0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgbW91c2UgbW90aW9uIGhhcyBwYXVzZWQgYW5kIHRoZW4gcmVmcmVzaGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGlzcGxheS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG49NCBhdHRlbXB0cyB0byBtZWFzdXJlcyBuZXR3b3JrIHJhdGVzIGFuZCBsYXRlbmN5LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZpZGVvIGNhcmQgcmVhZCByYXRlLCBhbmQgaG93IG1hbnkgdGlsZXMgaGF2ZSBiZWVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIG9uIHRoZSBzY3JlZW4uICBGcm9tIHRoaXMsIGl0IGFnZ3Jlc3NpdmVseSB0cmllc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gcHVzaCBzY3JlZW4gXCJmcmFtZXNcIiB3aGVuIGl0IGRlY2lkZXMgaXQgaGFzIGVub3VnaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIHRvIGRvIHNvLiAgTk9UIEZJTklTSEVELlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbiBpcyAlZC4gTm90ZSB0aGF0IG1vZGVzIDIsIDMsIDQgd2lsbCBza2lwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtaW5wdXRfc2tpcCBrZXlib2FyZCBldmVudHMgKGJ1dCBpdCB3aWxsIG5vdCBjb3VudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBldmVudHMpLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbW9kZXMgYXJlIG5vdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGluIC10aHJlYWRzIG1vZGUgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaGFuZGxpbmcgbWVjaGFuaXNtLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gdHJ5IG91dCB0aGUgZGlmZmVyZW50IHBvaW50ZXIgbW9kZXMgdG8gc2VlIHdoaWNoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmUgZ2l2ZXMgdGhlIGJlc3QgcmVzcG9uc2UgZm9yIHlvdXIgdXNhZ2UsIGl0IGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb252ZW5pZW50IHRvIHVzZSB0aGUgcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb24sIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZSBcIngxMXZuYyAtUiBwbTo0XCIgb3IgdGhlIHRjbC90ayBndWkgKFR1bmluZyAtPlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tb2RlIC0+IG4pLlxuIgotIlxuIgotIi1pbnB1dF9za2lwIG4gICAgICAgICAgRm9yIHRoZSBwb2ludGVyIGhhbmRsaW5nIHdoZW4gbm9uLXRocmVhZGVkOiB0cnkgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgbiB1c2VyIGlucHV0IGV2ZW50cyBiZWZvcmUgc2Nhbm5pbmcgZGlzcGxheS4gbiA8IDBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRvIGFjdCBhcyB0aG91Z2ggdGhlcmUgaXMgYWx3YXlzIHVzZXIgaW5wdXQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlZFxuIgotIlxuIgotIi1hbGxpbnB1dCAgICAgICAgICAgICAgSGF2ZSB4MTF2bmMgcmVhZCBhbmQgcHJvY2VzcyBhbGwgYXZhaWxhYmxlIGNsaWVudCBpbnB1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHByb2NlZWRpbmcuXG4iCi0iXG4iCi0iLWlucHV0X2VhZ2VybHkgICAgICAgICBTaW1pbGFyIHRvIC1hbGxpbnB1dCBidXQgdXNlIHRoZSBoYW5kbGVFdmVudHNFYWdlcmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc20gYnVpbHQgaW50byBMaWJWTkNTZXJ2ZXIuXG4iCi0iXG4iCi0iLXNwZWVkcyByZCxidyxsYXQgICAgICB4MTF2bmMgdHJpZXMgdG8gZXN0aW1hdGUgc29tZSBzcGVlZCBwYXJhbWV0ZXJzIHRoYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSB1c2VkIHRvIG9wdGltaXplIHNjaGVkdWxpbmcgKGUuZy4gLXBvaW50ZXJfbW9kZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgNCwgLXdpcmVmcmFtZSwgLXNjcm9sbGNvcHlyZWN0KSBhbmQgb3RoZXIgdGhpbmdzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSAtc3BlZWRzIG9wdGlvbiB0byBzZXQgdGhlc2UgbWFudWFsbHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHJpcGxlIFwicmQsYncsbGF0XCIgY29ycmVzcG9uZHMgdG8gdmlkZW8gaC93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWFkIHJhdGUgaW4gTUIvc2VjLCBuZXR3b3JrIGJhbmR3aWR0aCB0byBjbGllbnRzIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBLQi9zZWMsIGFuZCBuZXR3b3JrIGxhdGVuY3kgdG8gY2xpZW50cyBpbiBtaWxsaXNlY29uZHMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuICBJZiBhIHZhbHVlIGlzIGxlZnQgYmxhbmssIGUuZy4gXCItc3BlZWRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAsMTAwLDE1XCIsIHRoZW4gdGhlIGludGVybmFsIHNjaGVtZSBpcyB1c2VkIHRvIGVzdGltYXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgdmFsdWUocykuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUeXBpY2FsIFBDIHZpZGVvIGNhcmRzIGhhdmUgcmVhZCByYXRlcyBvZiA1LTEwIE1CL3NlYy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmcmFtZWJ1ZmZlciBpcyBpbiBtYWluIG1lbW9yeSBpbnN0ZWFkIG9mIHZpZGVvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoL3cgKGUuZy4gU3VuUmF5LCBzaGFkb3dmYiwgZHVtbXkgZHJpdmVyLCBYdmZiKSwgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWFkIHJhdGUgbWF5IGJlIG11Y2ggZmFzdGVyLiAgXCJ4MTFwZXJmIC1nZXRpbWFnZTUwMFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBnZXQgYSBsb3dlciBib3VuZCAocmVtZW1iZXIgdG8gZmFjdG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYnl0ZXMgcGVyIHBpeGVsKS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlc3RpbWF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgYmFuZHdpdGggYW5kIGxhdGVuY3kgdG8gY2xpZW50cy4gIEZvciB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgdGhlIHBpbmcoMSkgY29tbWFuZCBjYW4gYmUgdXNlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciBjb252ZW5pZW5jZSB0aGVyZSBhcmUgc29tZSBhbGlhc2VzIHByb3ZpZGVkLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBcIi1zcGVlZHMgbW9kZW1cIi4gIFRoZSBhbGlhc2VzIGFyZTogXCJtb2RlbVwiIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgNiw0LDIwMDsgXCJkc2xcIiBmb3IgNiwxMDAsNTA7IGFuZCBcImxhblwiIGZvciA2LDUwMDAsMVxuIgotIlxuIgotIi13bWR0IHN0cmluZyAgICAgICAgICAgRm9yIHNvbWUgZmVhdHVyZXMsIGUuZy4gLXdpcmVmcmFtZSBhbmQgLXNjcm9sbGNvcHlyZWN0LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGhhcyB0byB3b3JrIGFyb3VuZCBpc3N1ZXMgZm9yIGNlcnRhaW4gd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VycyBvciBkZXNrdG9wcyAoY3VycmVudGx5IGtkZSBhbmQgeGZjZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGl0IHRyaWVzIHRvIGd1ZXNzIHdoaWNoIG9uZSwgYnV0IGl0IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3MgaW5jb3JyZWN0bHkuICBVc2UgdGhpcyBvcHRpb24gdG8gaW5kaWNhdGUgd2hpY2hcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdtL2R0LiAgXCJzdHJpbmdcIiBjYW4gYmUgXCJnbm9tZVwiLCBcImtkZVwiLCBcImNkZVwiLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJ4ZmNlXCIsIG9yIFwicm9vdFwiIChjbGFzc2ljIFggd20pLiAgQW55dGhpbmcgZWxzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJwcmV0ZWQgYXMgXCJyb290XCIuXG4iCi0iXG4iCi0iLWRlYnVnX3BvaW50ZXIgICAgICAgICBQcmludCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciBldmVyeSBwb2ludGVyIGV2ZW50LlxuIgotIi1kZWJ1Z19rZXlib2FyZCAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgZXZlcnkga2V5Ym9hcmQgZXZlbnQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTYW1lIGFzIC1kcCBhbmQgLWRrLCByZXNwZWN0aXZlbHkuICBVc2UgbXVsdGlwbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIGZvciBtb3JlIG91dHB1dC5cbiIKLSJcbiIKLSItZGVmZXIgdGltZSAgICAgICAgICAgIFRpbWUgaW4gbXMgdG8gZGVsYXkgc2VuZGluZyB1cGRhdGVzIHRvIGNvbm5lY3RlZCBjbGllbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoZGVmZXJVcGRhdGVUaW1lKSAgRGVmYXVsdDogJWRcbiIKLSJcbiIKLSItd2FpdCB0aW1lICAgICAgICAgICAgIFRpbWUgaW4gbXMgdG8gcGF1c2UgYmV0d2VlbiBzY3JlZW4gcG9sbHMuICBVc2VkIHRvIGN1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG93biBvbiBsb2FkLiAgRGVmYXVsdDogJWRcbiIKLSJcbiIKLSItZXh0cmFfZmJ1ciBuICAgICAgICAgIFBlcmZvcm0gZXh0cmEgRnJhbWVCdWZmZXJVcGRhdGVSZXF1ZXN0cyBjaGVja3MgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byBiZSBpbiBiZXR0ZXIgc3luYyB3aXRoIHRoZSBjbGllbnQncyByZXF1ZXN0cy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgdGhpcyBkb2VzIGlzIHBlcmZvcm0gZXh0cmEgcG9sbHMgb2YgdGhlIGNsaWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0IGF0IGNyaXRpY2FsIHRpbWVzIChiZWZvcmUgJy1kZWZlcicgYW5kICctd2FpdCdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzLikgIFRoZSBkZWZhdWx0IGlzIG49MS4gIFNldCB0byBhIGxhcmdlciBudW1iZXIgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBtb3JlIGNoZWNrcyBvciBzZXQgdG8gbj0wIHRvIGRpc2FibGUuICBBIGRvd25zaWRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGVzZSBleHRyYSBjYWxscyBpcyB0aGF0IG1vcmUgbW91c2UgaW5wdXQgbWF5IGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgdGhhbiBkZXNpcmVkLlxuIgotIlxuIgotIi13YWl0X3VpIGZhY3RvciAgICAgICAgRmFjdG9yIGJ5IHdoaWNoIHRvIGN1dCB0aGUgLXdhaXQgdGltZSBpZiB0aGVyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVjZW50IHVzZXIgaW5wdXQgKHBvaW50ZXIgb3Iga2V5Ym9hcmQpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSW1wcm92ZXMgcmVzcG9uc2UsIGJ1dCBpbmNyZWFzZXMgdGhlIGxvYWQgd2hlbmV2ZXIgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW92aW5nIHRoZSBtb3VzZSBvciB0eXBpbmcuICBEZWZhdWx0OiAlLjJmXG4iCi0iLXNldGRlZmVyIG4gICAgICAgICAgICBXaGVuIHRoZSAtd2FpdF91aSBtZWNoYW5pc20gY3V0cyBkb3duIHRoZSB3YWl0IHRpbWUgbXMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIGRlZmVyIHRpbWUgdG8gdGhlIHNhbWUgbXMgdmFsdWUuIG49MSB0byBlbmFibGUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAwIHRvIGRpc2FibGUsIGFuZCAtMSB0byBzZXQgZGVmZXIgdG8gMCAobm8gZGVsYXkpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5LCAyIGFuZCAtMiBpbmRpY2F0ZSAndXJnZW50X3VwZGF0ZScgbW9kZSBzaG91bGRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gcHVzaCB0aGUgdXBkYXRlcyBldmVuIHNvb25lci4gIERlZmF1bHQ6IDFcbiIKLSItbm93YWl0X2JvZyAgICAgICAgICAgIERvIG5vdCBkZXRlY3QgaWYgdGhlIHNjcmVlbiBwb2xsaW5nIGlzIFwiYm9nZ2luZyBkb3duXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbGVlcCBtb3JlLiAgU29tZSBhY3Rpdml0aWVzIHdpdGggbm8gdXNlciBpbnB1dCBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsb3cgdGhpbmdzIGRvd24gYSBsb3Q6IGNvbnNpZGVyIGEgbGFyZ2UgdGVybWluYWwgd2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbG9uZyBidWlsZCBydW5uaW5nIGluIGl0IGNvbnRpbnVvdXNseSBzdHJlYW1pbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRleHQgb3V0cHV0LiAgQnkgZGVmYXVsdCB4MTF2bmMgd2lsbCB0cnkgdG8gZGV0ZWN0IHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICgzIHNjcmVlbiBwb2xscyBpbiBhIHJvdyBlYWNoIGxvbmdlciB0aGFuIDAuMjUgc2VjIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vIHVzZXIgaW5wdXQpLCBhbmQgc2xlZXAgdXAgdG8gMS41IHNlY3MgdG8gbGV0IHRoaW5nc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRjaCB1cFwiLiAgVXNlIHRoaXMgb3B0aW9uIHRvIGRpc2FibGUgdGhhdCBkZXRlY3Rpb24uXG4iCi0iLXNsb3dfZmIgdGltZSAgICAgICAgICBGbG9hdGluZyBwb2ludCB0aW1lIGluIHNlY29uZHMgdG8gZGVsYXkgYWxsIHNjcmVlblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9sbGluZy4gIEZvciBzcGVjaWFsIHB1cnBvc2UgdXNhZ2Ugd2hlcmUgYSBsb3cgZnJhbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgaXMgYWNjZXB0YWJsZSBhbmQgZGVzaXJhYmxlLCBidXQgeW91IHdhbnQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGlucHV0IHByb2Nlc3NlZCBhdCB0aGUgbm9ybWFsIHJhdGUgc28geW91IGNhbm5vdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdXNlIC13YWl0LlxuIgotIi14cmVmcmVzaCB0aW1lICAgICAgICAgRmxvYXRpbmcgcG9pbnQgdGltZSBpbiBzZWNvbmRzIHRvIGluZGljYXRlIGhvdyBvZnRlbiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZG8gdGhlIGVxdWl2YWxlbnQgb2YgeHJlZnJlc2goMSkgdG8gZm9yY2UgYWxsIHdpbmRvd3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpbiB0aGUgdmlld2FibGUgYXJlYSBpZiAtaWQsIC1zaWQsIG9yIC1jbGlwIGlzIHVzZWQpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byByZXBhaW50IHRoZW1zZWx2ZXMuICBVc2UgdGhpcyBvbmx5IGlmIGFwcGxpY2F0aW9uc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWlzYmVoYXZlIGJ5IG5vdCByZXBhaW50aW5nIHRoZW1zZWx2ZXMgcHJvcGVybHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyAtbm94ZGFtYWdlLlxuIgotIi1uYXAgICAgICAgICAgICAgICAgICAgTW9uaXRvciBhY3Rpdml0eSBhbmQgaWYgaXQgaXMgbG93IHRha2UgbG9uZ2VyIG5hcHNcbiIKLSItbm9uYXAgICAgICAgICAgICAgICAgIGJldHdlZW4gc2NyZWVuIHBvbGxzIHRvIHJlYWxseSBjdXQgZG93biBsb2FkIHdoZW4gaWRsZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICVzXG4iCi0iLXNiIHRpbWUgICAgICAgICAgICAgICBUaW1lIGluIHNlY29uZHMgYWZ0ZXIgTk8gYWN0aXZpdHkgKGUuZy4gc2NyZWVuIGJsYW5rKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVhbGx5IHRocm90dGxlIGRvd24gdGhlIHNjcmVlbiBwb2xscyAoaS5lLiBzbGVlcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFib3V0IDEuNSBzZWNzKS4gVXNlIDAgdG8gZGlzYWJsZS4gIERlZmF1bHQ6ICVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyLiBYMTFWTkNfU0JfRkFDVE9SIHRvIHNjYWxlIGl0LlxuIgotIlxuIgotIi1yZWFkdGltZW91dCBuICAgICAgICAgU2V0IExpYlZOQ1NlcnZlciByZmJNYXhDbGllbnRXYWl0IHRvIG4gc2Vjb25kcy4gT25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsb3cgbGlua3MgdGhhdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHBhaW50IHRoZSBmaXJzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIExpYlZOQ1NlcnZlciBtYXkgaGl0IHRoZSB0aW1lb3V0IGFuZCBkcm9wIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4gIERlZmF1bHQ6ICVkIHNlY29uZHMuXG4iCi0iLXBpbmcgbiAgICAgICAgICAgICAgICBTZW5kIGEgMXgxIGZyYW1lYnVmZmVyIHVwZGF0ZSB0byBhbGwgY2xpZW50cyBldmVyeSBuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIChlLmcuIHRvIHRyeSB0byBrZWVwIGEgbmV0d29yayBjb25uZWN0aW9uIGFsaXZlKVxuIgotIlxuIgotIi1ub2ZicG0gICAgICAgICAgICAgICAgSWYgdGhlIHN5c3RlbSBzdXBwb3J0cyB0aGUgRkJQTSAoRnJhbWUgQnVmZmVyIFBvd2VyXG4iCi0iLWZicG0gICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50KSBleHRlbnNpb24gKGkuZS4gc29tZSBTdW4gc3lzdGVtcyksIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnQgdGhlIHZpZGVvIGgvdyBmcm9tIGdvaW5nIGludG8gYSByZWR1Y2VkIHBvd2VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSB3aGVuIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGQlBNIGNhcGFibGUgdmlkZW8gaC93IHNhdmUgZW5lcmd5IHdoZW4gdGhlIHdvcmtzdGF0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBpZGxlIGJ5IGdvaW5nIGludG8gbG93IHBvd2VyIHN0YXRlcyAoc2ltaWxhciB0byBEUE1TXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9uaXRvcnMpLiAgVGhpcyBpbnRlcmZlcmVzIHdpdGggeDExdm5jJ3MgcG9sbGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZyYW1lYnVmZmVyIGRhdGEuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi1ub2ZicG1cIiBtZWFucyBwcmV2ZW50IEZCUE0gbG93IHBvd2VyIHN0YXRlcyB3aGVuZXZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZCwgd2hpbGUgXCItZmJwbVwiIG1lYW5zIHRvIG5vdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciB0aGUgRkJQTSBzdGF0ZSBhdCBhbGwuICBTZWUgdGhlIHhzZXQoMSkgbWFucGFnZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRldGFpbHMuICAtbm9mYnBtIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBydW5uaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcInhzZXQgZmJwbSBmb3JjZSBvblwiIHBlcmlvZGljYWxseS4gIERlZmF1bHQ6ICVzXG4iCi0iXG4iCi0iLW5vZHBtcyAgICAgICAgICAgICAgICBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZSBEUE1TIChEaXNwbGF5IFBvd2VyIE1hbmFnZW1lbnRcbiIKLSItZHBtcyAgICAgICAgICAgICAgICAgIFNpZ25hbGluZykgZXh0ZW5zaW9uLCB0aGVuIHByZXZlbnQgdGhlIG1vbml0b3IgZnJvbVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ29pbmcgaW50byBhIHJlZHVjZWQgcG93ZXIgc3RhdGUgd2hlbiBWTkMgY2xpZW50c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNvbm5lY3RlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERQTVMgcmVkdWNlZCBwb3dlciBtb25pdG9yIHN0YXRlcyBhcmUgYSBnb29kIHRoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgeW91IG5vcm1hbGx5IHdhbnQgdGhlIHBvd2VyIGRvd24gdG8gdGFrZSBwbGFjZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgeDExdm5jIGhhcyBubyBwcm9ibGVtIGV4cG9ydGluZyB0aGUgZGlzcGxheSBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSkuICBZb3UgcHJvYmFibHkgb25seSB3YW50IHRvIHVzZSBcIi1ub2RwbXNcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCBTY3JlZW4gU2F2ZXJzIGtpY2tpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIGluIERQTVMgbG93IHBvd2VyIHN0YXRlcy4gIFRoZXJlIGlzIGtub3duIHByb2JsZW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGgga2Rlc2t0b3BfbG9jayBvbiBLREUgd2hlcmUgdGhlIHNjcmVlbiBzYXZlciBrZWVwc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2lja2luZyBpbiBldmVyeSB0aW1lIHVzZXIgaW5wdXQgc3RvcHMgZm9yIGEgc2Vjb25kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciB0d28uICBTcGVjaWZ5aW5nIFwiLW5vZHBtc1wiIHdvcmtzIGFyb3VuZCBpdC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLW5vZHBtc1wiIG1lYW5zIHByZXZlbnQgRFBNUyBsb3cgcG93ZXIgc3RhdGVzIHdoZW5ldmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLCB3aGlsZSBcIi1kcG1zXCIgbWVhbnMgdG8gbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIHRoZSBEUE1TIHN0YXRlIGF0IGFsbC4gIFNlZSB0aGUgeHNldCgxKSBtYW5wYWdlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlscy4gIC1ub2RwbXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHJ1bm5pbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwieHNldCBkcG1zIGZvcmNlIG9uXCIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogJXNcbiIKLSJcbiIKLSItZm9yY2VkcG1zICAgICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgdGhlIERQTVMgKERpc3BsYXkgUG93ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZW1lbnQgU2lnbmFsaW5nKSBleHRlbnNpb24sIHRoZW4gdHJ5IHRvIGtlZXAgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIGluIGEgcG93ZXJlZCBvZmYgc3RhdGUuICBUaGlzIGlzIHRvIHByZXZlbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2V5IHBlb3BsZSBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBmcm9tIHZpZXdpbmcgd2hhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgb24gdGhlIHNjcmVlbi4gIEJlIHN1cmUgdG8gbG9jayB0aGUgc2NyZWVuIGJlZm9yZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGZhciBmcm9tIGJ1bGxldCBwcm9vZiwgZS5nLiBzdXBwb3NlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21lb25lIGF0dGFjaGVzIGEgbm9uLURQTVMgbW9uaXRvciwgb3IgbG9hZHMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lIHNvIHRoYXQgdGhlcmUgaXMgYSBnYXAgb2YgdGltZSBiZWZvcmUgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgcG93ZXJlZCBvZmYgc3RhdGU/ICBPbiBtYW55IG1hY2hpbmVzIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoZSBmbG9vZHMgaXQgd2l0aCBrZXlib2FyZCBhbmQgbW91c2UgaW5wdXQgaGUgY2FuIHNlZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hlcyBvZiB3aGF0IGlzIG9uIHRoZSBzY3JlZW4gYmVmb3JlIHRoZSBEUE1TIG9mZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgaXMgcmVlc3RhYmxpc2hlZC4gIEZvciB0aGlzIHRvIHdvcmsgc2VjdXJlbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgc3VwcG9ydCBpbiB0aGUgWCBzZXJ2ZXIgdG8gZG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXhhY3RseSByYXRoZXIgdGhhbiBhcHByb3hpbWF0ZWx5IHdpdGggRFBNUy5cbiIKLSJcbiIKLSItY2xpZW50ZHBtcyAgICAgICAgICAgIEFzIC1mb3JjZWRwbXMgYnV0IG9ubHkgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLlxuIgotIlxuIgotIi1ub3NlcnZlcmRwbXMgICAgICAgICAgVGhlIFVsdHJhVk5DIFNlcnZlcklucHV0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgVk5DIHZpZXdlciB0byBjbGljayBhIGJ1dHRvbiB0aGF0IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlIHRoZSBzZXJ2ZXIgKHgxMXZuYykgdG8gdHJ5IHRvIGRpc2FibGUga2V5Ym9hcmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtb3VzZSBpbnB1dCBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgcHV0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciBpbiBkcG1zIHBvd2VyZWQgb2ZmIHN0YXRlLiAgVXNlIHRoaXMgb3B0aW9uIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBza2lwIHBvd2VyaW5nIG9mZiB0aGUgbW9uaXRvci5cbiIKLSJcbiIKLSItbm91bHRyYWV4dCAgICAgICAgICAgIERpc2FibGUgdGhlIGZvbGxvd2luZyBVbHRyYVZOQyBleHRlbnNpb25zOiBTaW5nbGVXaW5kb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBTZXJ2ZXJJbnB1dC4gIFRoZSBvdGhlcnMgbWFuYWdlZCBieSBMaWJWTkNTZXJ2ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Y2hhdCwgMS9uIHNjYWxpbmcsIHJmYkVuY29kaW5nVWx0cmEpIGFyZSBub3QuXG4iCi0iXG4iCi0iLWNoYXR3aW5kb3cgICAgICAgICAgICBQbGFjZSBhIGxvY2FsIFVsdHJhVk5DIGNoYXQgd2luZG93IG9uIHRoZSBYMTEgZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB4MTF2bmMgaXMgcG9sbGluZy4gIFRoYXQgd2F5IHRoZSBwZXJzb24gb24gdGhlIFZOQ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld2VyLXNpZGUgY2FuIGNoYXQgd2l0aCB0aGUgcGVyc29uIGF0IHRoZSBwaHlzaWNhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWDExIGNvbnNvbGUuIChlLmcuIGhlbHBkZXNrIHcvbyB0ZWxlcGhvbmUpXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyB0byB3b3JrIHRoZSBTU1ZOQyBwYWNrYWdlICh2ZXJzaW9uIDEuMC4yMSBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIpIE1VU1QgQkUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gd2hlcmUgeDExdm5jIHJ1bnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgJ3Nzdm5jJyBjb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIGluICRQQVRILlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNzdm5jdmlld2VyIGlzIHVzZWQgYXMgYSBjaGF0IHdpbmRvdyBoZWxwZXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpbXBsaWVzICctcmZidmVyc2lvbiAzLjYnIHNvIGFzIHRvIHRyaWNrXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVbHRyYVZOQyB2aWV3ZXJzLCBvdGhlcndpc2UgdGhleSBhc3N1bWUgY2hhdCBpcyBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gIFRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcmZidmVyc2lvbiwgcGxhY2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGl0IGFmdGVyIHRoZSAtY2hhdHdpbmRvdyBvcHRpb24gb24gdGhlIGNtZGxpbmUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyB0aGUgcmVtb3RlIGNvbnRyb2wgJ2NoYXRvbicgYW5kICdjaGF0b2ZmJ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy4gIFRoZXNlIGNhbiBhbHNvIGJlIHNldCBmcm9tIHRoZSB0a3gxMXZuYyBHVUkuXG4iCi0iXG4iCi0iLW5veGRhbWFnZSAgICAgICAgICAgICBEbyBub3QgdXNlIHRoZSBYIERBTUFHRSBleHRlbnNpb24gdG8gZGV0ZWN0IGZyYW1lYnVmZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgVXNlIC14ZGFtYWdlIGlmIHlvdXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdG8gaGF2ZSBpdCBvZmYuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMncyB1c2Ugb2YgdGhlIERBTUFHRSBleHRlbnNpb246IDEpIHNpZ25pZmljYW50bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZXMgdGhlIGxvYWQgd2hlbiB0aGUgc2NyZWVuIGlzIG5vdCBjaGFuZ2luZyBtdWNoLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDIpIGRldGVjdHMgY2hhbmdlZCBhcmVhcyAoc21hbGwgb25lcyBieSBkZWZhdWx0KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBxdWlja2x5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGlzIG92ZXJseSBjb25zZXJ2YXRpdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZXBvcnRzIGxhcmdlIGFyZWFzIChlLmcuIGEgd2hvbGUgdGVybWluYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIGJyb3dzZXIgd2luZG93KSBhcyBkYW1hZ2VkIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggc21hbGxlciAoc29tZXRpbWVzIGp1c3QgYSBmZXdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscykuICBTbyBoZXVyaXN0aWNzIHdlcmUgaW50cm9kdWNlZCB0byBza2lwIGxhcmdlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcmVhcyBhbmQgdXNlIHRoZSBkYW1hZ2UgcmVjdGFuZ2xlcyBvbmx5IGFzIFwiaGludHNcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB0cmFkaXRpb25hbCBzY2FubGluZSBwb2xsaW5nLiAgVGhlIGZvbGxvd2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHVuaW5nIHBhcmFtZXRlcnMgYXJlIGludHJvZHVjZWQgdG8gYWRqdXN0IHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOlxuIgotIlxuIgotIi14ZF9hcmVhIEEgICAgICAgICAgICAgU2V0IHRoZSBsYXJnZXN0IERBTUFHRSByZWN0YW5nbGUgYXJlYSBcIkFcIiAoaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsczogd2lkdGggKiBoZWlnaHQpIHRvIHRydXN0IGFzIHRydWx5IGRhbWFnZWQ6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVjdGFuZ2xlIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIGZyYW1lYnVmZmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoc2xvdykgbm8gbWF0dGVyIHdoYXQuICBTZXQgdG8gemVybyB0byB0cnVzdCAqYWxsKlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlcy4gRGVmYXVsdDogJWRcbiIKLSIteGRfbWVtIGYgICAgICAgICAgICAgIFNldCBob3cgbG9uZyBEQU1BR0UgcmVjdGFuZ2xlcyBzaG91bGQgYmUgXCJyZW1lbWJlcmVkXCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImZcIiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgaXMgaW4gdW5pdHMgb2YgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZSByZXBlYXQgY3ljbGUgdGltZSAoJWQgaXRlcmF0aW9ucykuICBUaGUgZGVmYXVsdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKCUuMWYpIHNob3VsZCBnaXZlIG5vIHBhaW50aW5nIHByb2JsZW1zLiBJbmNyZWFzZSBpdCBpZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgYXJlIHByb2JsZW1zIG9yIGRlY3JlYXNlIGl0IHRvIGxpdmUgb24gdGhlIGVkZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChwZXJoYXBzIHVzZWZ1bCBvbiBhIHNsb3cgbWFjaGluZSkuXG4iCi0iXG4iCi0iLXNpZ3BpcGUgc3RyaW5nICAgICAgICBCcm9rZW4gcGlwZSAoU0lHUElQRSkgaGFuZGxpbmcuICBcInN0cmluZ1wiIGNhbiBiZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJpZ25vcmVcIiBvciBcImV4aXRcIi4gIEZvciBcImlnbm9yZVwiIExpYlZOQ1NlcnZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBoYW5kbGUgdGhlIGFicnVwdCBsb3NzIG9mIGEgY2xpZW50IGFuZCBjb250aW51ZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBcImV4aXRcIiB4MTF2bmMgd2lsbCBjbGVhbnVwIGFuZCBleGl0IGF0IHRoZSAxc3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiBjb25uZWN0aW9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgbm90IHJlYWxseSBuZWVkZWQgc2luY2UgTGliVk5DU2VydmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBkb2luZyB0aGUgY29ycmVjdCB0aGluZyBub3cgZm9yIHF1aXRlIHNvbWUgdGltZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGZvciBjb252ZW5pZW5jZSB5b3UgY2FuIHVzZSBpdCB0byBpZ25vcmUgb3RoZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbHMsIGUuZy4gXCItc2lncGlwZSBpZ25vcmU6SFVQLElOVCxURVJNXCIgaW4gY2FzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3b3VsZCBiZSB1c2VmdWwgZm9yIHNvbWUgc29ydCBvZiBhcHBsaWNhdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBwdXQgXCJleGl0Oi4uXCIgaW4gdGhlIGxpc3QgdG8gaGF2ZSB4MTF2bmNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAgb24gdGhlIGxpc3RlZCBzaWduYWxzLiBcIi1zaWdcIiBpcyBhbiBhbGlhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgb3B0aW9uIGlmIHlvdSBkb24ndCBsaWtlIHRoZSAncGlwZScuIEV4YW1wbGU6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtc2lnIGlnbm9yZTpJTlQsVEVSTSxleGl0OlVTUjFcbiIKLSJcbiIKLSItdGhyZWFkcyAgICAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdGhyZWFkZWQgTGliVk5DU2VydmVyXG4iCi0iLW5vdGhyZWFkcyAgICAgICAgICAgICBhbGdvcml0aG0gW3JmYlJ1bkV2ZW50TG9vcF0gaWYgbGlicHRocmVhZCBpcyBhdmFpbGFibGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIG1vZGUgbmV3IHRocmVhZHMgKG9uZSBmb3IgaW5wdXQgYW5kIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG91dHB1dCkgYXJlIGNyZWF0ZWQgdG8gaGFuZGxlIGVhY2ggbmV3IGNsaWVudC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICVzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHN0YWJpbGl0eSBpcyBtdWNoIGltcHJvdmVkIGluIHZlcnNpb24gMC45LjguXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGllbnRzIGluIHRocmVhZGVkIG1vZGUgc2hvdWxkIGJlIHN0YWJsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBaUkxFIGVuY29kaW5nIG9uIGFsbCBwbGF0Zm9ybXMuICBUaGUgVGlnaHQgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBabGliIGVuY29kaW5ncyBhcmUgY3VycmVudGx5IG9ubHkgc3RhYmxlIG9uIExpbnV4IGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgY2xpZW50cy4gIENvbXBpbGUgd2l0aCAtRFRMUz1fX3RocmVhZCBpZiB5b3VyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBPUyBhbmQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0IGl0LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlc2l6ZXMgKHJhbmRyLCBldGMuKSBzZXQgdGhpcyBlbnYuIHZhci4gdG8gdGhlIG51bWJlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwOiBYMTFWTkNfVEhSRUFEU19ORVdfRkJfU0xFRVBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF0IHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkb19uZXdfZmIoKSBhY3Rpb24uICBUaGlzIGlzIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaW91cyBhY3Rpdml0aWVzIHNldHRsZS4gIERlZmF1bHQgaXMgYWJvdXQgNTAwbXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGllbnRzIGluIHRocmVhZGVkIG1vZGUgY291bGQgeWllbGQgYmV0dGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBmb3IgJ2NsYXNzLXJvb20nIGJyb2FkY2FzdGluZyB1c2FnZTsgYWxzbyBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWFwcHNoYXJlIGJyb2FkY2FzdCBtb2RlLiAgU2VlIGFsc28gdGhlIC1yZWZsZWN0IG9wdGlvbi5cbiIKLSJcbiIKLSItZnMgZiAgICAgICAgICAgICAgICAgIElmIHRoZSBmcmFjdGlvbiBvZiBjaGFuZ2VkIHRpbGVzIGluIGEgcG9sbCBpcyBncmVhdGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGYsIHRoZSB3aG9sZSBzY3JlZW4gaXMgdXBkYXRlZC4gIERlZmF1bHQ6ICUuMmZcbiIKLSItZ2FwcyBuICAgICAgICAgICAgICAgIEhldXJpc3RpYyB0byBmaWxsIGluIGdhcHMgaW4gcm93cyBvciBjb2xzIG9mIG4gb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGlsZXMuICBVc2VkIHRvIGltcHJvdmUgdGV4dCBwYWdpbmcuICBEZWZhdWx0OiAlZFxuIgotIi1ncm93IG4gICAgICAgICAgICAgICAgSGV1cmlzdGljIHRvIGdyb3cgaXNsYW5kcyBvZiBjaGFuZ2VkIHRpbGVzIG4gb3Igd2lkZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ5IGNoZWNraW5nIHRoZSB0aWxlIG5lYXIgdGhlIGJvdW5kYXJ5LiAgRGVmYXVsdDogJWRcbiIKLSItZnV6eiBuICAgICAgICAgICAgICAgIFRvbGVyYW5jZSBpbiBwaXhlbHMgdG8gbWFyayBhIHRpbGVzIGVkZ2VzIGFzIGNoYW5nZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlZFxuIgotIi1kZWJ1Z190aWxlcyAgICAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgdGlsZXMsIGZiIHVwZGF0ZXMsIGV0Yy5cbiIKLSJcbiIKLSItc25hcGZiICAgICAgICAgICAgICAgIEluc3RlYWQgb2YgcG9sbGluZyB0aGUgWCBkaXNwbGF5IGZyYW1lYnVmZmVyIChmYilcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvciBjaGFuZ2VzLCBwZXJpb2RpY2FsbHkgY29weSBhbGwgb2YgWCBkaXNwbGF5IGZiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnRvIG1haW4gbWVtb3J5IGFuZCBleGFtaW5lIHRoYXQgY29weSBmb3IgY2hhbmdlcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChUaGlzIHNldHRpbmcgYWxzbyBhcHBsaWVzIGZvciBub24tWCAtcmF3ZmIgbW9kZXMpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIHRoaXMgd2lsbCBpbXByb3ZlIGludGVyYWN0aXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgb3IgYXQgbGVhc3QgbWFrZSB0aGluZ3MgbG9vayBzbW9vdGhlciwgYnV0IGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMgKG1vc3QhKSBpdCB3aWxsIG1ha2UgdGhlIHJlc3BvbnNlIHdvcnNlLiAgSWYgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoL3cgZmIgaXMgc3VjaCB0aGF0IHJlYWRpbmcgc21hbGwgdGlsZXMgaXMgdmVyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2xvdyB0aGlzIG1vZGUgY291bGQgaGVscC4gIFRvIGtlZXAgdGhlIFwiZnJhbWVyYXRlXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVwIHRoZSBzY3JlZW4gc2l6ZSB4IGJwcCBjYW5ub3QgYmUgdG9vIGxhcmdlLiAgTm90ZSB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZGUgaXMgdmVyeSB3YXN0ZWZ1bCBvZiBtZW1vcnkgSS9PIHJlc291cmNlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGl0IG1ha2VzIGZ1bGwgc2NyZWVuIGNvcGllcyBldmVuIGlmIG5vdGhpbmcgY2hhbmdlcykuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJdCBtYXkgYmUgb2YgdXNlIGluIHZpZGVvIGNhcHR1cmUtbGlrZSBhcHBsaWNhdGlvbnMsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3ZWJjYW1zLCBvciB3aGVyZSB3aW5kb3cgdGVhcmluZyBpcyBhIHByb2JsZW0uXG4iCi0iXG4iCi0iLXJhd2ZiIHN0cmluZyAgICAgICAgICBJbnN0ZWFkIG9mIHBvbGxpbmcgWCwgcG9sbCB0aGUgbWVtb3J5IG9iamVjdCBzcGVjaWZpZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIFwic3RyaW5nXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgZmlsZSBwb2xsaW5nLCB0byBtZW1vcnkgbWFwIG1tYXAoMikgYSBmaWxlIHVzZTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwibWFwOi9wYXRoL3RvL2EvZmlsZUBXeEh4QlwiLCB3aXRoIGZyYW1lYnVmZmVyIFdpZHRoLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSGVpZ2h0LCBhbmQgQml0cyBwZXIgcGl4ZWwuICBcIm1tYXA6Li4uXCIgaXMgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzYW1lLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgdHJvdWJsZSB3aXRoIG1tYXAsIHVzZSBcImZpbGU6Ly4uLlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2xvd2VyIGxzZWVrKDIpIGJhc2VkIHJlYWRpbmcuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgXCJzbmFwOi4uLlwiIHRvIGltcGx5IC1zbmFwZmIgbW9kZSBhbmQgdGhlIFwiZmlsZTpcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzICh0aGlzIGlzIGZvciB1bnNlZWthYmxlIGRldmljZXMgdGhhdCBvbmx5IHByb3ZpZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmYiBhbGwgYXQgb25jZSwgZS5nLiBhIHZpZGVvIGNhbWVyYSBwcm92aWRlcyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdob2xlIGZyYW1lKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIHN0cmluZyBpcyBvZiB0aGUgZm9ybTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic2htOk5AV3hIeEJcIiB3aGljaCBzcGVjaWZpZXMgYSBzaG1pZCBOIGFuZCB3aXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBXeEh4QiBhcyBhYm92ZS4gIFNlZSBzaG1hdCgxKSBhbmQgaXBjcygxKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCBzdXBwbHkgYSB0eXBlIFwibWFwXCIgaXMgYXNzdW1lZCBpZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgZXhpc3RzIChzZWUgdGhlIG5leHQgcGFyYWdyYXBocyBmb3Igc29tZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyB0byB0aGlzLilcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHN0cmluZyBpcyBcInNldHVwOmNtZFwiLCB0aGVuIHRoZSBjb21tYW5kIFwiY21kXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHJ1biBhbmQgdGhlIGZpcnN0IGxpbmUgZnJvbSBpdCBpcyByZWFkIGFuZCB1c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBcInN0cmluZ1wiLiAgVGhpcyBhbGxvd3MgaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmluZyBXeEh4QiwgZXRjLiBUaGVzZSBhcmUgb2Z0ZW4gZG9uZSBhcyByb290XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbyB0YWtlIGNhcmUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoIFwidmlkZW9cIiwgc2VlIHRoZSBWSURFTzRMSU5VWFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdyB3aGVyZSB0aGUgZGV2aWNlIG1heSBiZSBxdWVyaWVkIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBwb3NzaWJseSBzZXQpIHRoZSBmcmFtZWJ1ZmZlciBwYXJhbWV0ZXJzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCBcImNvbnNvbGVcIiwgXCIvZGV2L2ZiXCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImZiXCIsIG9yIFwidnRcIiwgc2VlIHRoZSBMSU5VWCBDT05TT0xFIGRpc2N1c3Npb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgb3BlbmVkIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlcyAoYW5kIHBvc3NpYmx5IG1vdXNlIGV2ZW50cykgYXJlIGluc2VydGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBjb25zb2xlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCBcInZuY1wiLCBzZWUgdGhlIFZOQyBIT1NUXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBpcyB0YWtlbiBhcyB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBhbm90aGVyIHJlbW90ZSBWTkMgc2VydmVyLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgc3VmZml4ZXMgYXJlIFwiOlIvRy9CXCIgYW5kIFwiK09cIiB0byBzcGVjaWZ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBtYXNrcyAoaW4gaGV4KSBhbmQgYW4gb2Zmc2V0IGludG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgb2JqZWN0LiAgSWYgdGhlIG1hc2tzIGFyZSBub3QgcHJvdmlkZWQgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBndWVzc2VzIHRoZW0gYmFzZWQgb24gdGhlIGJwcCAoaWYgdGhlIGNvbG9ycyBsb29rIHdyb25nLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91IG5lZWQgdG8gcHJvdmlkZSB0aGUgbWFza3MuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBvcHRpb25hbCBzdWZmaXggaXMgdGhlIEJ5dGVzIFBlciBMaW5lIHdoaWNoIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21lIGNhc2VzIGlzIG5vdCBXeEIvOC4gIFNwZWNpZnkgaXQgYXMgV3hIeEItQlBMXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIDgwMHg2MDB4MTYtMjA0OC4gIFRoaXMgY291bGQgYmUgYSBub3JtYWwgd2lkdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgYXQgMTZicHAgZmIsIGJ1dCBvbmx5IHdpZHRoIDgwMCBzaG93cyB1cC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvIHRoZSBmdWxsIGZvcm1hdCBpczogbW9kZTpmaWxlQFd4SHhCOlIvRy9CK08tQlBMXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgc2htOjIxMDMzNzkzM0A4MDB4NjAweDMyOmZmL2ZmMDAvZmYwMDAwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIG1hcDovZGV2L2ZiMEAxMDI0eDc2OHgzMlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBtYXA6L3RtcC9YdmZiX3NjcmVlbjBANjQweDQ4MHg4KzMyMzJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgZmlsZTovdG1wL215LnBubUAyNTB4MjAweDI0KzM3XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIGZpbGU6L2Rldi91cmFuZG9tQDEyOHgxMjh4OFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBzbmFwOi9kZXYvdmlkZW8wQDMyMHgyNDB4MjQgLTI0dG8zMlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2aWRlbzBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdmlkZW8gLXBpcGVpbnB1dCBWSURcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2dDJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdm5jOnNvbWVob3N0OjBcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzZWUgaXBjcygxKSBhbmQgZmJzZXQoMSkgZm9yIHRoZSBmaXJzdCB0d28gZXhhbXBsZXMpXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsIGFsbCB1c2VyIGlucHV0IGlzIGRpc2NhcmRlZCBieSBkZWZhdWx0IChzZWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtcGlwZWlucHV0IG9wdGlvbiBmb3IgaG93IHRvIHVzZSBhIGhlbHBlciBwcm9ncmFtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBpbnNlcnQpLiAgTW9zdCBvZiB0aGUgWDExIChzY3JlZW4sIGtleWJvYXJkLCBtb3VzZSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgZG8gbm90IG1ha2Ugc2Vuc2UgYW5kIG1hbnkgd2lsbCBjYXVzZSB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHRvIGNyYXNoLCBzbyBwbGVhc2UgdGhpbmsgdHdpY2UgYmVmb3JlIHNldHRpbmcgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5naW5nIHRoZW0gaW4gYSBydW5uaW5nIHgxMXZuYy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBETyBOT1Qgd2FudCB4MTF2bmMgdG8gY2xvc2UgdGhlIFggRElTUExBWSBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmIgbW9kZSwgcHJlcGVuZCBhIFwiK1wiIGUuZy4gK2ZpbGU6L2Rldi9mYjAuLi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEtlZXBpbmcgdGhlIGRpc3BsYXkgb3BlbiBlbmFibGVzIHRoZSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtY29udHJvbCBjaGFubmVsLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3Ugc3BlY2lmeSAtbm92aWV3b25seSwgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCBhcmUgU1RJTEwgc2VudCB0byB0aGUgWFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwgdGhpcyB1c2FnZSBzaG91bGQgYmUgdmVyeSByYXJlLCBpLmUuIGRvaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgc3RyYW5nZSB3aXRoIC9kZXYvZmIwLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRldmljZSBpcyBub3QgXCJzZWVrYWJsZVwiIChlLmcuIHdlYmNhbSkgdHJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nIGl0IGFsbCBhdCBvbmNlIGluIGZ1bGwgc25hcHMgdmlhIHRoZSBcInNuYXA6XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKG5vdGU6IHRoaXMgaXMgYSByZXNvdXJjZSBob2cpLiAgSWYgeW91IGFyZSB1c2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogb3IgbWFwOiBBTkQgdGhlIGRldmljZSBuZWVkcyB0byBiZSByZW9wZW5lZCBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICpldmVyeSogc25hcGZiIHNuYXBzaG90LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU05BUEZCX1JBV0ZCX1JFU0VUPTEgYXMgd2VsbC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHgxMXZuYyB0byBkeW5hbWljYWxseSB0cmFuc2Zvcm0gYSAyNGJwcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmIgdG8gMzJicHAgKG5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2xvd2VyKSBhbHNvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgdGhlIC0yNHRvMzIgb3B0aW9uLiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2F5LCBhIHZpZGVvIGNhbWVyYSB0aGF0IGRlbGl2ZXJzIHRoZSBwaXhlbCBkYXRhIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAyNGJwcCBwYWNrZWQgUkdCLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCB1bmRlciBcInZpZGVvXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgaWYgdGhlIGJwcCBpcyAyNC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5IHRoZSBiaXRzIHBlciBwaXhlbCwgQiwgaXMgOCwgMTYsIG9yIDMyIChvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmFyZWx5IDI0KSwgaG93ZXZlciB0aGVyZSBpcyBhbHNvIHNvbWUgc3VwcG9ydCBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEIgPCA4IChlLmcuIG9sZCBncmFwaGljcyBkaXNwbGF5cyA0IGJwcCBvciAxIGJwcCkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgeW91IGNlcnRhaW5seSBtdXN0IHN1cHBseSB0aGUgbWFza3MgYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdlbGw6IFd4SHhCOlIvRy9CLiAgVGhlIHBpeGVscyB3aWxsIGJlIHBhZGRlZCBvdXQgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDggYnBwIHVzaW5nIGRlcHRoIDggdHJ1ZWNvbG9yLiAgVGhlIHNjaGVtZSBjdXJyZW50bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHdvcmsgd2l0aCBzbmFwIGZiIChhc2sgaWYgaW50ZXJlc3RlZC4pIEI9MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbW9ub2Nocm9tZSBleGFtcGxlOiBmaWxlOi9kZXYvdXJhbmRvbUAxMjh4MTI4eDE6MS8xLzFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgb3RoZXIgbGlrZSB0aGlzIGFyZSAxMjh4MTI4eDI6My8zLzMgMTI4eDEyOHg0OjcvNy83XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgQiA8IDggZnJhbWVidWZmZXJzIHlvdSBjYW4gYWxzbyBzZXQgdGhlIGVudi4gdmFyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBSQVdGQl9DR0E9MSB0byB0cnkgYSBDR0EgbWFwcGluZyBmb3IgQj00IChlLmcuIGxpbnV4XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2Z2ExNmZiIGRyaXZlci4pICBOb3RlIHdpdGggbG93IGJwcCBhbmQvb3IgcmVzb2x1dGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVkdBIGFuZCBWR0ExNiBtb2RlcyBvbiB0aGUgTGludXggY29uc29sZSBvbmUncyBhdHRlbXB0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBleHBvcnQgdGhlbSB2aWEgeDExdm5jIGNhbiBvZnRlbiBiZSB0aHdhcnRlZCBkdWUgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgY29sb3IgcGFsZXR0ZXMsIHBpeGVsIHBhY2tpbmdzLCBhbmQgZXZlbiB2aWRlb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgYnVmZmVyaW5nLiAgT1RPSCwgb2Z0ZW4gZXhwZXJpbWVudGluZyB3aXRoIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUkdCIG1hc2tzIGNhbiB5aWVsZCBzb21ldGhpbmcgcmVjb2duaXphYmxlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVklERU80TElOVVg6IG9uIExpbnV4IHNvbWUgYXR0ZW1wdCBpcyBtYWRlIHRvIGhhbmRsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gZGV2aWNlcyAod2ViY2FtcyBvciBUViB0dW5lcnMpIGF1dG9tYXRpY2FsbHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgaWRlYSBpcyB0aGUgV3hIeEIgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBpdHNlbGYuICBTbyBpZiB5b3UgZG8gbm90IHN1cHBseSBcIkBXeEh4Qi4uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB4MTF2bmMgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHRoZW0uICBJdCBmaXJzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHJpZXMgdGhlIHY0bCBBUEkgaWYgdGhhdCBzdXBwb3J0IGhhcyBiZWVuIGNvbXBpbGVkIGluLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIGl0IHdpbGwgcnVuIHRoZSB2NGwtaW5mbygxKSBleHRlcm5hbCBwcm9ncmFtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhdmFpbGFibGUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2ltcGxlc3QgZXhhbXBsZXMgYXJlIFwiLXJhd2ZiIHZpZGVvXCIgYW5kIFwiLXJhd2ZiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzFcIiB3aGljaCBpbXBseSB0aGUgZGV2aWNlIGZpbGUgL2Rldi92aWRlbyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC9kZXYvdmlkZW8xLCByZXNwZWN0aXZlbHkuICBZb3UgY2FuIGFsc28gc3VwcGx5IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgL2RldiBpZiB5b3UgbGlrZSwgZS5nLiBcIi1yYXdmYiAvZGV2L3ZpZGVvMFwiXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdmlkZW8gY2FwdHVyZSBkZXZpY2UgZnJhbWVidWZmZXIgdXN1YWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyBjb250aW51b3VzbHkgKGUuZy4gYnJpZ2h0bmVzcyBmbHVjdHVhdGlvbnMpLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeW91IG1heSB3YW50IHRvIHVzZSB0aGUgLXdhaXQsIC1zbG93X2ZiLCBvciAtZGVmZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgdG8gbG93ZXIgdGhlIFwiZnJhbWVyYXRlXCIgdG8gY3V0IGRvd24gb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgVk5DIHRyYWZmaWMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBIG1vcmUgc29waGlzdGljYXRlZCB2aWRlbyBkZXZpY2Ugc2NoZW1lIGFsbG93c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UncyBzZXR0aW5ncyB1c2luZzpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdmlkZW86PHNldHRpbmdzPlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByZWZpeCBjb3VsZCBhbHNvIGJlLCBhcyBhYm92ZSwgZS5nLiBcInZpZGVvMTpcIiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgZGV2aWNlIGZpbGUuICBUaGUgdjRsIEFQSSBtdXN0IGJlIGF2YWlsYWJsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgdG8gd29yay4gIE90aGVyd2lzZSwgeW91IHdpbGwgbmVlZCB0byB0cnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUgdGhlIGRldmljZSB3aXRoIGFuIGV4dGVybmFsIHByb2dyYW0sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlLmcuIHhhd3R2LCBzcGNhdmlldywgYW5kIGhvcGUgdGhleSBwZXJzaXN0IHdoZW4geDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZS1vcGVucyB0aGUgZGV2aWNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgPHNldHRpbmdzPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZXZpY2UncyBicmlnaHRuZXNzLCBjb2xvciwgY29udHJhc3QsIGFuZCBodWUgY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gcGVyY2VudGFnZXMsIGUuZy4gYnI9ODAsY289NTAsY249NDQsaHU9NjAuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGV2aWNlIGZpbGVuYW1lIGNhbiBiZSBzZXQgdG9vIGlmIG5lZWRlZCAoaWYgaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJ2aWRlb1wiKSwgZS5nLiBmbj0vZGV2L3FjYW0uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgd2lkdGgsIGhlaWdodCBhbmQgYnBwIG9mIHRoZSBmcmFtZWJ1ZmZlciBjYW4gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNldCB2aWEsIGUuZy4sIHc9MTYwLGg9MTIwLGJwcD0xNi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0ZWQgdG8gdGhlIGJwcCBhYm92ZSwgdGhlIHBpeGVsIGZvcm1hdCBjYW4gYmUgc2V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWEgdGhlIGZtdD1YWFgsIHdoZXJlIFhYWCBjYW4gYmUgb25lIG9mOiBHUkVZLCBISTI0MCxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFJHQjU1NSwgUkdCNTY1LCBSR0IyNCwgYW5kIFJHQjMyICh3aXRoIGJwcCA4LCA4LCAxNiwgMTYsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAyNCwgYW5kIDMyIHJlc3BlY3RpdmVseSkuICBTZWUgaHR0cDovL3d3dy5saW51eHR2Lm9yZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyAoVjRMIGFwaSkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgVFYvcmYgdHVuZXIgY2FyZHMgb25lIGNhbiBzZXQgdGhlIHR1bmluZyBtb2RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWEgdHVuPVhYWCB3aGVyZSBYWFggY2FuIGJlIG9uZSBvZiBQQUwsIE5UU0MsIFNFQ0FNLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgQVVUTy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYW4gc3dpdGNoIHRoZSBpbnB1dCBjaGFubmVsIGJ5IHRoZSBpbnA9WFhYIHNldHRpbmcsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBYWFggaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGNoYW5uZWwgKFRlbGV2aXNpb24sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUxLCBTLVZpZGVvLCBldGMpLiAgVXNlIHRoZSBuYW1lIHRoYXQgaXMgaW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRoYXQgaXMgcHJpbnRlZCBhdCBzdGFydHVwLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGlucHV0IGNoYW5uZWxzIHdpdGggdHVuZXJzIChlLmcuIFRlbGV2aXNpb24pIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGNoYW5nZSB3aGljaCBzdGF0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBzdGE9WFhYXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLiAgWFhYIGlzIHRoZSBzdGF0aW9uIG51bWJlci4gIEN1cnJlbnRseSBvbmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgbnRzYy1jYWJsZS11cyAoVVMgY2FibGUpIGNoYW5uZWxzIGFyZSBidWlsdCBpbnRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMuICBTZWUgdGhlIC1mcmVxdGFiIG9wdGlvbiBiZWxvdyB0byBzdXBwbHkgb25lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHhhd3R2LiBJZiBYWFggaXMgZ3JlYXRlciB0aGFuIDUwMCwgdGhlbiBpdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgYSByYXcgZnJlcXVlbmN5IGluIEtIei5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdmlkZW86YnI9ODAsdz0zMjAsaD0yNDAsZm10PVJHQjMyLHR1bj1OVFNDLHN0YT00N1xuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IG5lZWQgdG8gYWRkIGlucD1UZWxldmlzaW9uIHRvbyBmb3IgdGhlIGlucHV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIHRvIGJlIFRWIGlmIHRoZSBjYXJkIGRvZXNuJ3QgY29tZSB1cCBieSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IG9uZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBub3QgYWxsIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyB3aWxsIHN1cHBvcnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsbCBvZiB0aGUgYWJvdmUgc2V0dGluZ3MuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIC1waXBlaW5wdXQgVklEIG9wdGlvbiBiZWxvdyBmb3IgYSB3YXkgdG8gY29udHJvbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNldHRpbmdzIHRocm91Z2ggdGhlIFZOQyBWaWV3ZXIgdmlhIGtleXN0cm9rZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBcyBhIHNob3J0Y3V0LCBpZiB0aGUgc3RyaW5nIGJlZ2lucyBcIlZpZGVvLi5cIiBpbnN0ZWFkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBcInZpZGVvLi5cIiB0aGVuIC1waXBlaW5wdXQgVklEIGlzIGltcGxpZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBcyBhYm92ZSwgaWYgeW91IHNwZWNpZnkgYSBcIkBXeEh4Qi4uLlwiIGFmdGVyIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgPHNldHRpbmdzPiBzdHJpbmcgdGhleSBhcmUgdXNlZCB2ZXJiYXRpbTogdGhlIGRldmljZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHF1ZXJpZWQgZm9yIHRoZSBjdXJyZW50IHZhbHVlcy4gIE90aGVyd2lzZSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3aWxsIGJlIHF1ZXJpZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMSU5VWCBDT05TT0xFOiAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSB3YXlzIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWV3IGFuZCBwb3NzaWJseSBpbnRlcmFjdCB3aXRoIHRoZSBMaW51eCB0ZXh0L2dyYXBoaWNzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlIChpLmUuIG5vdCBYMTEgWEZyZWU4Ni9Yb3JnKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgdGhlIExpYlZOQ1NlcnZlciBMaW51eFZOQyBwcm9ncmFtIGlzIG9uIHlvdXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSB5b3UgbWF5IHdhbnQgdG8gdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgYmVjYXVzZSBpdCB3aWxsIGJlIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBMaW51eCB0ZXh0IGNvbnNvbGUgYW5kIGluY2x1ZGVzIG1vdXNlIHN1cHBvcnQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcywgaG93ZXZlciwgdGhlIGJhc2ljIExpbnV4Vk5DIGZ1bmN0aW9uYWxpdHkgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBpZiB5b3UgcmVwbGFjZSBcImNvbnNvbGVcIiB3aXRoIFwidnRcIiBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVzIGJlbG93LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHJhd2ZiIHN0cmluZyBiZWdpbnMgd2l0aCBcImNvbnNvbGVcIiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGRldmljZSAvZGV2L2ZiMCBpcyBvcGVuZWQgYW5kIC9kZXYvdHR5MCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVkIHRvby4gIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBpbmplY3Qga2V5c3Ryb2tlc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBhbGwgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZSBiYXNpYyBvbmVzIGFyZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBuZWVkIHRvIGJlIHJvb3QgdG8gaW5qZWN0IGtleXN0cm9rZXMsIGJ1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90IG5lY2Vzc2FyaWx5IHRvIG9wZW4gL2Rldi9mYjAuICAvZGV2L3R0eTAgcmVmZXJzIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZlIFZULCB0byBpbmRpY2F0ZSBvbmUgZXhwbGljaXRseSwgdXNlLCBlLmcuLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJjb25zb2xlMlwiIGZvciAvZGV2L3R0eTIsIGV0Yy4gYnkgaW5kaWNhdGluZyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIFZUIG51bWJlci5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgTGludXggZnJhbWVidWZmZXIgZGV2aWNlLCAvZGV2L2ZiMCwgKGZiMSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV0YykgdG8gYmUgZW5hYmxlZCB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGRyaXZlcnMgbXVzdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmUgbG9hZGVkLiAgRS5nLiB2ZXNhZmIgb3IgdmdhMTZmYiBhbmQgYWxzbyBieSBzZXR0aW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgYm9vdCBwYXJhbWV0ZXIgdmdhPTB4MzAxIChvciAweDMxNCwgMHgzMTcsIGV0Yy4pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoVGhlIHZnYT0uLi4gbWV0aG9kIGlzIHRoZSBwcmVmZXJyZWQgd2F5OyBzZXQgeW91clxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZXMgdXAgdGhhdCB3YXkuKSAgT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgJ05vIHN1Y2ggZGV2aWNlJyBlcnJvci4gIFlvdSBjYW4gYWxzbyBsb2FkIGEgTGludXhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGRyaXZlciBzcGVjaWZpYyB0byB5b3VyIG1ha2Ugb2YgdmlkZW8gY2FyZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZnVuY3Rpb25hbGl0eS4gIE9uY2UgdGhlIG1hY2hpbmUgaXMgYm9vdGVkIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9mdGVuICdtb2Rwcm9iZScgdGhlIGZiIGRyaXZlciBhcyByb290IHRvIG9idGFpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBmcmFtZWJ1ZmZlciBkZXZpY2UuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgY2Fubm90IGdldCAvZGV2L2ZiMCB3b3JraW5nIG9uIExpbnV4LCB0cnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBMaW51eFZOQyBlbXVsYXRpb24gbW9kZSBieSBcIi1yYXdmYiB2dE5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgTiA9IDEsIC4uLiA2IGlzIHRoZSBMaW51eCBWaXJ0dWFsIFRlcm1pbmFsIChha2FcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc29sZSkgeW91IHdpc2ggdG8gdmlldywgZS5nLiBcIi1yYXdmYiB2dDJcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVubGlrZSAvZGV2L2ZiIG1vZGUsIGl0IG5lZWQgbm90IGJlIHRoZSBhY3RpdmUgVmlydHVhbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGVybWluYWwuICBOb3RlIHRoYXQgdGhpcyBtb2RlIGNhbiBvbmx5IHNob3cgdGV4dCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBncmFwaGljcy4gIHgxMXZuYyBwb2xscyB0aGUgdGV4dCBpbiAvZGV2L3Zjc2FOXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyLiBSQVdGQl9WQ1NBX0JXPTEgdG8gZGlzYWJsZSBjb2xvcnMgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBcInZ0TlwiIG1vZGUgKGkuZS4gYmxhY2sgYW5kIHdoaXRlIG9ubHkuKSAgSWYgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJlZmVyIHRoZSBkZWZhdWx0IDE2YnBwIHNldCBSQVdGQl9WQ1NBX0JQUCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgOCBvciAzMi4gIElmIHlvdSBuZWVkIHRvIHR3ZWFrIHRoZSByYXdmYiBwYXJhbWV0ZXJzIGJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgJ2NvbnNvbGVfZ3Vlc3MnIHN0cmluZyBwcmludGVkIGF0IHN0YXJ0dXAsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZSBzdXJlIHRvIGluZGljYXRlIHRoZSBzbmFwOiBtZXRob2QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXQ6IElmIHRoZSBMaW51eCB2ZXJzaW9uIGFwcGVhcnMgdG8gYmUgMi42XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBsYXRlciBhbmQgdGhlIFwidWlucHV0XCIgbW9kdWxlIGFwcGVhcnMgdG8gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgKG1vZHByb2JlIHVpbnB1dCksIHRoZW4gdGhlIHVpbnB1dCBtZXRob2RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIC9kZXYvdHR5Ti4gIHVpbnB1dCBhbGxvd3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbiBvZiBCT1RIIGtleXN0cm9rZXMgYW5kIG1vdXNlIGlucHV0IGFuZCBzbyBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkIHdoZW4gYWNjZXNzaW5nIGdyYXBoaWNhbCAoZS5nLiBRVC1lbWJlZGRlZClcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4IGNvbnNvbGUgYXBwcy4gIEl0IGFsc28gcHJvdmlkZXMgbW9yZSBhY2N1cmF0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlIGluc2VydGlvbi4gIFNlZSAtcGlwZWlucHV0IFVJTlBVVCBiZWxvdyBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBtb2RlOyB5b3Ugd2lsbCBoYXZlIHRvIHVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBpZiB5b3Ugd2FudCB0byB0d2VhayBhbnkgVUlOUFVUIHBhcmFtZXRlcnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGFsc28gd2FudCB0byBhbHNvIHVzZSB0aGUgLW5vZHJhZ2dpbmcgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtY3Vyc29yIG5vbmUgb3B0aW9ucy4gIFVzZSBcImNvbnNvbGUwXCIsIGV0YyAgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1waXBlaW5wdXQgQ09OU09MRSB0byBmb3JjZSB0aGUgL2Rldi90dHlOIG1ldGhvZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgeW91IGNhbiBjaGFuZ2UgdGhlIExpbnV4IFZUIHJlbW90ZWx5IHVzaW5nIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2h2dCgxKSBjb21tYW5kIHRvIG1ha2UgdGhlIG9uZSB5b3Ugd2FudCBiZSB0aGUgYWN0aXZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmUgKGUuZy4gJ2NodnQgMycpLiAgU29tZXRpbWVzIHN3aXRjaGluZyBvdXQgYW5kIGJhY2tcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RzIHRoZSBmcmFtZWJ1ZmZlcidzIGdyYXBoaWNzIHN0YXRlLiAgRm9yIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItcmF3ZmIgdnROXCIgbW9kZSB0aGVyZSBpcyBubyBuZWVkIHRvIHN3aXRjaCB0aGUgVlQncy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIHNraXAgaW5wdXQgaW5qZWN0aW5nIGVudGlyZWx5IHVzZSBcImNvbnNvbGV4XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIFwidnR4XCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIFwiL2Rldi9mYjBcIiAoMSwgZXRjLikgY2FuIGJlIHVzZWQgaW5zdGVhZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgXCJjb25zb2xlXCIuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGRldmljZSwgZS5nLiAvZGV2L2ZiMS4gIEFzIGEgc2hvcnRjdXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi9kZXYvXCIgY2FuIGJlIGRyb3BwZWQuICBJZiB0aGUgbmFtZSBpcyBzb21ldGhpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YW5kYXJkLCB1c2UgXCJjb25zb2xlOi9kZXYvZm9vZmJcIlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBndWVzcyB0aGUgZnJhbWVidWZmZXInc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV3hIeEIgYW5kIG1hc2tzIGF1dG9tYXRpY2FsbHkgKHNvbWV0aW1lcyB0aGUga2VybmVsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnaXZlcyBpbmNvcnJlY3QgaW5mb3JtYXRpb24pLCBzcGVjaWZ5IHRoZW0gd2l0aCBhIEBXeEh4QlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBvcHRpb25hbCA6Ui9HL0IgbWFza3MpIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIC9kZXYvZmIwICAgICAgICAgICAoc2FtZSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZTMgICAgICAgICAgIChmb3JjZSAvZGV2L3R0eTMpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIGNvbnNvbGV4ICAgICAgICAgICAobm8ga2V5c3Ryb2tlcyBvciBtb3VzZSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZTovZGV2L25vbnN0ZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgVUlOUFVUOmFjY2VsPTQuMFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2dDMgICAgICAgICAgICAgICAgKC9kZXYvdHR5MyB3L28gL2Rldi9mYjApXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgSE9TVDogaWYgdGhlIC1yYXdmYiBzdHJpbmcgaXMgb2YgdGhlIGZvcm1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwidm5jOmhvc3Q6TlwiIHRoZW4gdGhlIFZOQyBkaXNwbGF5IFwiTlwiIG9uIHRoZSByZW1vdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFZOQyBzZXJ2ZXIgXCJob3N0XCIgaXMgY29ubmVjdGVkIHRvIChpLmUuIHgxMXZuYyBhY3RzIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhIFZOQyBjbGllbnQgaXRzZWxmKSBhbmQgdGhhdCBmcmFtZWJ1ZmZlciBpcyBleHBvcnRlZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBpcyByZWFsbHkgb25seSBvZiB1c2UgaWYgeW91IGFyZSB0cnlpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gdGhlIGNhc2Ugb2YgbWFueSAoZS5nLiA+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAxMCkgc2ltdWx0YW5lb3VzIFZOQyB2aWV3ZXJzLCBhbmQgeW91IHRyeSBhIGRpdmlkZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnF1ZXIgc2NoZW1lIHRvIHJlZHVjZSBiYW5kd2lkdGggYW5kIGltcHJvdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVuZXNzLiAgKEhvd2V2ZXIsIGFub3RoZXIgdXNlciBmb3VuZCB0aGlzIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCB0byBleHBvcnQgYSBkZW1vIGRpc3BsYXkgdGhyb3VnaCBhIHNsb3cgbGluazpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gbXVsdGlwbGUgZGVtbyB2aWV3ZXJzIGNvbm5lY3RlZCB0byB0aGUgcmVmbGVjdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIG9uIHRoZSBmYXN0IHNpZGUgb2YgdGhlIGxpbmssIGFuZCBzbyBhdm9pZGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbGwgb2YgdGhlIGRlbW8gdmlld2VycyBnb2luZyB0aHJvdWdoIHRoZSBzbG93IGxpbmsuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZXJlIHdpbGwgYmUgNjQgc2ltdWx0YW5lb3VzIFZOQ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld2VycyB0aGlzIGNhbiBsZWFkIHRvIGEgbG90IG9mIHJlZHVuZGFudCBWTkMgdHJhZmZpY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYW5kIGZyb20gdGhlIHNlcnZlciBob3N0Ok4sIGV4dHJhIENQVSB1c2FnZSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbGwgdmlld2VycyByZXNwb25zZSBjYW4gYmUgcmVkdWNlZCBieSBoYXZpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgZm9yIHdyaXRlcyB0byB0aGUgc2xvd2VzdCBjbGllbnQgdG8gZmluaXNoLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgeW91IHNldCB1cCA4IHJlZmxlY3RvcnMvcmVwZWF0ZXJzIHN0YXJ0ZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3B0aW9uIC1yYXdmYiB2bmM6aG9zdDpOLCB0aGVuIHRoZXJlIGFyZSBvbmx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA4IGNvbm5lY3Rpb25zIHRvIGhvc3Q6Ti4gIEVhY2ggcmVwZWF0ZXIgdGhlbiBoYW5kbGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA4IHZuYyB2aWV3ZXIgY29ubmVjdGlvbnMgdGhlcmVieSBzcHJlYWRpbmcgdGhlIGxvYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyb3VuZC4gIEluIGNsYXNzcm9vbSBicm9hZGNhc3QgdXNhZ2UsIHRyeSB0byBwdXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlcnMgb24gZGlmZmVyZW50IHN3aXRjaGVzLiAgVGhpcyBtb2RlIGlzIHRoZSBzYW1lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyAtcmVmbGVjdCBob3N0Ok4uICBSZXBsYWNlIFwiaG9zdDpOXCIgYnkgXCJsaXN0ZW5cIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgXCJsaXN0ZW46cG9ydFwiIGZvciBhIHJldmVyc2UgY29ubmVjdGlvbi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgcGVyZm9ybWFuY2Ugd2lsbCBub3QgYmUgYXMgZ29vZCBhcyBhIHNpbmdsZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0IGNvbm5lY3Rpb24gYmVjYXVzZSwgYW1vbmcgb3RoZXIgdGhpbmdzLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBmcmFtZWJ1ZmZlciBwb2xsaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgcG9pbnRlciBtb3Rpb24gY2FuIHN0aWxsIGluZHVjZSBtYW55IGNoYW5nZXMgcGVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgdGhhdCBtdXN0IGJlIHByb3BhZ2F0ZWQuICBUaXA6IGlmIHRoZSByZW1vdGUgVk5DXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB4MTF2bmMgZG9pbmcgd2lyZWZyYW1pbmcsIG9yIGFuIFggZGlzcGxheSB0aGF0IGRvZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtaW5nIHRoYXQgZ2l2ZXMgbXVjaCBiZXR0ZXIgcmVzcG9uc2UgdGhhbiBvcGFxdWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBkcmFnZ2luZy4gIENvbnNpZGVyIHRoZSAtbm9kcmFnZ2luZyBvcHRpb24gaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9ibGVtIGlzIHNldmVyZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbnYuIHZhci4gWDExVk5DX1JFRkxFQ1RfUEFTU1dPUkQgY2FuIGJlIHNldCB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkIG5lZWRlZCB0byBsb2cgaW50byB0aGUgdm5jIGhvc3Qgc2VydmVyLCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gXCJmaWxlOnBhdGhfdG9fZmlsZVwiIHRvIGluZGljYXRlIGEgZmlsZSBjb250YWluaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc3dvcmQgYXMgaXRzIGZpcnN0IGxpbmUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBzZXQgdGhlIHBpeGVsIGZvcm1hdCB0aGF0IHgxMXZuYyByZXF1ZXN0cyBhcyBhIFZOQ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ0xJRU5UIHNldCB0aGUgZW52LiB2YXJzOiBYMTFWTkNfUkVGTEVDVF9iaXRzUGVyU2FtcGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfUkVGTEVDVF9zYW1wbGVzUGVyUGl4ZWwsIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFRkxFQ1RfYnl0ZXNQZXJQaXhlbDsgdGhlIGRlZmF1bHRzIGFyZSA4LCAzLCA0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMiwgMywgMSB3b3VsZCBnaXZlIGEgbG93IGNvbG9yIG1vZGUuICBTZWUgdGhlIGZ1bmN0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZmJHZXRDbGllbnQoKSBpbiBsaWJ2bmNjbGllbnQgZm9yIG1vcmUgaW5mby5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTkMgSE9TVCBtb2RlIGltcGxpZXMgLXNoYXJlZC4gIFVzZSAtbm9zaGFyZWQgYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgc3Vic2VxdWVudCBjbWRsaW5lIG9wdGlvbiB0byBkaXNhYmxlIHNoYXJpbmcuXG4iCi0iXG4iCi0iLWZyZXF0YWIgZmlsZSAgICAgICAgICBGb3IgdXNlIHdpdGggXCItcmF3ZmIgdmlkZW9cIiBmb3IgVFYgdHVuZXIgZGV2aWNlcyB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBzdGF0aW9uIGZyZXF1ZW5jaWVzLiAgSW5zdGVhZCBvZiB1c2luZyB0aGUgYnVpbHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIG50c2MtY2FibGUtdXMgbWFwcGluZyBvZiBzdGF0aW9uIG51bWJlciB0byBmcmVxdWVuY3ksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIGRhdGEgaW4gZmlsZS4gIEZvciBzdGF0aW9ucyB0aGF0IGFyZSBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMsIGUuZy4gU0UyMCwgdGhleSBhcmUgcGxhY2VkIGFib3ZlIHRoZSBoaWdoZXN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZCBzdGF0aW9uIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZC4gIEV4YW1wbGU6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIi1mcmVxdGFiIC91c3IvWDExUjYvc2hhcmUveGF3dHYvZXVyb3BlLXdlc3QubGlzdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIG1ha2UgeW91ciBvd24gZnJlcXRhYiBieSBjb3B5aW5nIHRoZSB4YXd0dlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LlxuIgotIlxuIgotIi1waXBlaW5wdXQgY21kICAgICAgICAgVGhpcyBvcHRpb24gbGV0cyB5b3Ugc3VwcGx5IGFuIGV4dGVybmFsIGNvbW1hbmQgaW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiY21kXCIgdGhhdCB4MTF2bmMgd2lsbCBwaXBlIGFsbCBvZiB0aGUgdXNlciBpbnB1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHRvIGluIGEgc2ltcGxlIGZvcm1hdC4gIEluIC1waXBlaW5wdXQgbW9kZSBieVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB4MTF2bmMgd2lsbCBub3QgcHJvY2VzcyBhbnkgb2YgdGhlIHVzZXIgaW5wdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy4gIElmIHlvdSBwcmVmaXggXCJjbWRcIiB3aXRoIFwidGVlOlwiIGl0IHdpbGxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJvdGggc2VuZCB0aGVtIHRvIHRoZSBwaXBlIGNvbW1hbmQgYW5kIHByb2Nlc3MgdGhlbS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgcnVuIFwiLXBpcGVpbnB1dFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGVlOi9iaW4vY2F0XCIuICBBbm90aGVyIHByZWZpeCBpcyBcInJlb3BlblwiIHdoaWNoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB0byByZW9wZW4gcGlwZSBpZiBpdCBleGl0cy4gIFNlcGFyYXRlIG11bHRpcGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcyB3aXRoIGNvbW1hcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEluIGNvbWJpbmF0aW9uIHdpdGggLXJhd2ZiIG9uZSBtaWdodCBiZSBhYmxlIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkbyBhbXVzaW5nIHRoaW5ncyAoZS5nLiBjb250cm9sIG5vbi1YIGRldmljZXMpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVG8gZmFjaWxpdGF0ZSB0aGlzLCBpZiAtcmF3ZmIgaXMgaW4gZWZmZWN0IHRoZW4gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaW4gWDExVk5DX1JBV0ZCX1NUUiBmb3IgdGhlIHBpcGUgY29tbWFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGlmIGl0IHdhbnRzLiBEbyAnZW52IHwgZ3JlcCBYMTFWTkMnIGZvciBtb3JlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQnVpbHQtaW4gcGlwZWlucHV0IG1vZGVzIChubyBleHRlcm5hbCBwcm9ncmFtIHJlcXVpcmVkKTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIGNtZCBpcyBcIlZJRFwiIGFuZCB5b3UgYXJlIHVzaW5nIHRoZSAtcmF3ZmIgZm9yIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGNhcHR1cmUgZGV2aWNlLCB0aGVuIGFuIGludGVybmFsIGxpc3Qgb2Yga2V5Ym9hcmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzIGlzIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgb2YgdGhlIHZpZGVvLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1hcHBpbmdzIGFyZTpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgXCJCXCIgYW5kIFwiYlwiIGFkanVzdCB0aGUgYnJpZ2h0bmVzcyB1cCBhbmQgZG93bi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgXCJIXCIgYW5kIFwiaFwiIGFkanVzdCB0aGUgaHVlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBcIkNcIiBhbmQgXCJjXCIgYWRqdXN0IHRoZSBjb2xvdXIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIFwiTlwiIGFuZCBcIm5cIiBhZGp1c3QgdGhlIGNvbnRyYXN0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBcIlNcIiBhbmQgXCJzXCIgYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIHNjcmVlbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgXCJJXCIgYW5kIFwiaVwiIGN5Y2xlIHRocm91Z2ggaW5wdXQgY2hhbm5lbHMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIFVwIGFuZCBEb3duIGFycm93cyBhZGp1c3QgdGhlIHN0YXRpb24gKGlmIGEgdHVuZXIpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgIEYxLCBGMiwgLi4uLCBGNiB3aWxsIHN3aXRjaCB0aGUgdmlkZW8gY2FwdHVyZSBwaXhlbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgdG8gSEkyNDAsIFJHQjU2NSwgUkdCMjQsIFJHQjMyLCBSR0I1NTUsIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICBHUkVZIHJlc3BlY3RpdmVseS4gIFNlZSAtcmF3ZmIgdmlkZW8gZm9yIGRldGFpbHMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBjbWQgaXMgXCJDT05TT0xFXCIgb3IgXCJDT05TT0xFblwiIHdoZXJlIG5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIGEgTGludXggY29uc29sZSBudW1iZXIsIHRoZW4gdGhlIGxpbnV4IGNvbnNvbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZSBpbnNlcnRpb24gdG8gL2Rldi90dHlOIChzZWUgLXJhd2ZiIGNvbnNvbGUpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBwZXJmb3JtZWQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiBjbWQgYmVnaW5zIHdpdGggXCJVSU5QVVRcIiB0aGVuIHRoZSBMaW51eCB1aW5wdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpcyB1c2VkIHRvIGluc2VydCBib3RoIGtleXN0cm9rZSBhbmQgbW91c2UgZXZlbnRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgTGludXggY29uc29sZSAoc2VlIC1yYXdmYiBhYm92ZSkuICBUaGlzIHVzdWFsbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSAvZGV2L2lucHV0L3VpbnB1dCBkZXZpY2UgZmlsZSAoeW91IG1heSBuZWVkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgaXQgd2l0aCBcIm1rbm9kIC9kZXYvaW5wdXQvdWlucHV0IGMgMTAgMjIzXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbnNlcnQgdGhlIG1vZHVsZSB3aXRoIFwibW9kcHJvYmUgdWlucHV0XCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgVUlOUFVUIG1vZGUgY3VycmVudGx5IG9ubHkgZG9lcyBVUyBrZXlib2FyZHMgKGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29kZSBvcHRpb24gbWF5IGJlIGFkZGVkKSwgYW5kIG5vdCBhbGwga2V5c3ltc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN1cHBvcnRlZC4gIEJ1dCBpdCBpcyBwcm9iYWJseSBtb3JlIGFjY3VyYXRlIHRoYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBcIkNPTlNPTEVcIiBtZXRob2QuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IHdhbnQgdG8gdXNlIHRoZSBvcHRpb25zIC1jdXJzb3Igbm9uZSBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1ub2RyYWdnaW5nIGluIHRoaXMgbW9kZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgdHVuaW5nIG9wdGlvbnMgbWF5IGJlIHN1cHBsaWVkIHZpYTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFVJTlBVVDpvcHQxLG9wdDIsLi4uIChhIGNvbW1hIHNlcGFyYXRlZCBsaXN0KS4gSWYgYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBiZWdpbnMgd2l0aCBcIi9cIiBpdCBpcyB0YWtlbiBhcyB0aGUgdWlucHV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgZmlsZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2hpY2ggdWlucHV0IGlzIGluamVjdGVkIGNhbiBiZSBjb250cm9sbGVkIGJ5IGFuIG9wdGlvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hZGUgb2YgdGhlIGNoYXJhY3RlcnMgXCJLXCIsIFwiTVwiLCBhbmQgXCJCXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIC1pbnB1dCBvcHRpb24pLCBlLmcuIFwiS01cIiBhbGxvd3Mga2V5c3Ryb2tlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgbW90aW9uIGJ1dCBub3QgYnV0dG9uIGNsaWNrcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEEgVUlOUFVUIG9wdGlvbiBvZiB0aGUgZm9ybTogYWNjZWw9Ziwgb3IgYWNjZWw9ZngrZnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNldHMgdGhlIG1vdXNlIG1vdGlvbiBcImFjY2VsZXJhdGlvblwiLiAgVGhpcyBpcyB1c2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBjb3JyZWN0IHJhdyBtb3VzZSByZWxhdGl2ZSBtb3Rpb24gaW50byBob3cgbXVjaCB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGN1cnNvciBtb3ZlcyAoeDExdm5jIGhhcyBubyBjb250cm9sIG92ZXIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBrbm93bGVkZ2Ugb2YgaG93IHRoZSB3aW5kb3dpbmcgYXBwbGljYXRpb24gaW50ZXJwcmV0c1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhdyBtb3VzZSBtb3Rpb25zKS4gIFR5cGljYWxseSB0aGUgYWNjZWxlcmF0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gWCBkaXNwbGF5IGlzIDIgKHNlZSB4c2V0IFwibVwiIG9wdGlvbikuICBcImZcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGUuZy4gMy4wLiAgVXNlIFwiZngrZnlcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gc3VwcGx5IGRpZmZlcmVudCBjb3JyZWN0aW9ucyBmb3IgeCBhbmQgeS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IGFjY2VsZXJhdGlvbiBpcyAyLjAgc2luY2UgaXQgc2VlbXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJvdGggWCBhbmQgcXQtZW1iZWRkZWQgb2Z0ZW4gKGJ1dCBub3QgYWx3YXlzKSB1c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFdmVuIHdpdGggYSBjb3JyZWN0IGFjY2VsIHNldHRpbmcgdGhlIG1vdXNlIHBvc2l0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGdldCBvdXQgb2Ygc3luYyAocHJvYmFibHkgZHVlIHRvIGEgbW91c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZXNob2xkXCIgc2V0dGluZyB3aGVyZSB0aGUgYWNjZWxlcmF0aW9uIGRvZSBub3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5LCBzZXQgeHNldCgxKSkuICBUaGUgb3B0aW9uIHJlc2V0PU4gc2V0cyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBtcyAoZGVmYXVsdCAxNTApIGFmdGVyIHdoaWNoIHRoZSBjdXJzb3IgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZCB0byBiZSByZXNldCAoYnkgZm9yY2luZyB0aGUgbW91c2UgdG8gKDAsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAwKSB2aWEgc21hbGwgaW5jcmVtZW50cyBhbmQgdGhlbiBiYWNrIG91dCB0byAoeCwgeSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIDEganVtcCksIFRoaXMgY29ycmVjdGlvbiBzZWVtcyB0byBiZSBuZWVkZWQgYnV0IGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgamVya2luZXNzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2l0aCBtZW51cywgZXRjLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHJlc2V0PTAgdG8gZGlzYWJsZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19VSU5QVVRfVEhSRVNIT0xEUyB0aGVuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZXNoPW4gbW9kZSB3aWxsIGJlIGVuYWJsZWQuICBJdCBpcyBjdXJyZW50bHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdCB3b3JraW5nIHdlbGwuICBJZiB8ZHh8IDw9IHRocmVzaCBhbmQgfGR5fCA8IHRocmVzaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm8gYWNjZWxlcmF0aW9uIGlzIGFwcGxpZWQuICBVc2UgXCJ0aHJlc2g9K25cIiB8ZHh8ICtcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHxkeXwgPCB0aHJlc2ggdG8gYmUgdXNlZCBpbnN0ZWFkIChYMTE/KVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtcGlwZWlucHV0IFVJTlBVVDphY2NlbD00LjAgLWN1cnNvciBub25lXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgdWlucHV0IGRldmljZSBoYXMgYW4gYWJzb2x1dGUgcG9pbnRlciAoYXMgb3Bwb3NlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBub3JtYWwgbW91c2UgdGhhdCBpcyBhIHJlbGF0aXZlIHBvaW50ZXIpIHlvdSBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIG9wdGlvbiBcImFic1wiLiAgTm90ZSB0aGF0IGEgdG91Y2hwYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgbGFwdG9wIGlzIGFuIGFic29sdXRlIGRldmljZSB0byBzb21lIGRlZ3JlZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgKHVzdWFsbHkpIGF2b2lkcyBhbGwgdGhlIHByb2JsZW1zIHdpdGggbW91c2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbi4gIElmIHgxMXZuYyBoYXMgdHJvdWJsZSBkZWR1Y2luZyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpemUgb2YgdGhlIGRldmljZSwgdXNlIFwiYWJzPVd4SFwiLiAgRnVydGhlcm1vcmUsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZGV2aWNlIGlzIGEgdG91Y2hzY3JlZW4gKGFzc3VtZWQgdG8gaGF2ZSBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGUgcG9pbnRlcikgdXNlIFwidG91Y2hcIiBvciBcInRvdWNoPVd4SFwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRvdWNoc2NyZWVucywgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVzc3VyZSBpbmNyZWFzZSBpcyBpbmplY3RlZCwgYW5kIHdoZW4gdGhlIGJ1dHRvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVsZWFzZWQgYSBwcmVzc3VyZSBvZiB6ZXJvIGlzIGluamVjdGVkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgdG91Y2ggaGFzIGJlZW4gc2V0LCB1c2UgXCJ0b3VjaF9hbHdheXM9MVwiIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSB3aGVuZXZlciB0aGUgbW91c2UgbW92ZXMgd2l0aCBubyBidXR0b25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZXNzZWQsIGEgdG91Y2ggZXZlbnQgb2YgemVybyBwcmVzc3VyZSBzaG91bGQgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgYW55d2F5LiAgQWxzbyB1c2UgXCJidG5fdG91Y2g9MVwiIHRvIGluZGljYXRlIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJUTl9UT1VDSCBrZXlzdHJva2UgcHJlc3Mgb3IgcmVsZWFzZSBzaG91bGQgYmUgc2VudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHByZXNzdXJlIGNoYW5nZS4gIFNldCBcImRyYWdza2lwPW5cIiB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBuIGRyYWdnZWQgbW91c2UgdG91Y2hlcyAod2l0aCBwcmVzc3VyZSBhcHBsaWVkKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGluamVjdGluZyBvbmUuICBUbyBpbmRpY2F0ZSB0aGUgcHJlc3N1cmUgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNlbnQgd2hlbiB0aGVyZSBpcyBhIGJ1dHRvbiBjbGljayBmb3IgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hzY3JlZW4gZGV2aWNlLCBzcGVjaWZ5IHByZXNzdXJlPW4sIGUuZy4gbj01LiBUaGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgbj0xLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgYSB0b3VjaCBzY3JlZW4gaXMgYmVpbmcgdXNlZCAoXCJ0b3VjaFwiIGFib3ZlKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0IGlzIGhhdmluZyBpdHMgaW5wdXQgcHJvY2Vzc2VkIGJ5IHRzbGliLCB5b3UgY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSB0c2xpYiBjYWxpYnJhdGlvbiBmaWxlIHZpYSB0c2xpYl9jYWw9PGZpbGU+LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRzbGliX2NhbD0vZXRjL3BvaW50ZXJjYWwuICBUbyBnZXQgYWNjdXJhdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIGV2ZW4gdXNhYmxlIHBvc2l0aW9uaW5nIHRoaXMgaXMgcmVxdWlyZWQgd2hlbiB0c2xpYlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdXNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIExpbnV4IHVpbnB1dCBtZWNoYW5pc20gY2FuIGJlIGJ5cGFzc2VkIGFuZCBvbmUgY2FuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBpbnB1dCBldmVudHMgRElSRUNUTFkgdG8gdGhlIGRldmljZXMgaW5zdGVhZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIGRvIHRoaXMsIHNwZWNpZnkgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBpbnB1dCBjbGFzc2VzOiBkaXJlY3RfcmVsPTxkZXZpY2U+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfYWJzPTxkZXZpY2U+IGRpcmVjdF9idG49PGRldmljZT4gb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdF9rZXk9PGRldmljZT4uICBUaGUgPGRldmljZT4gZmlsZSBpcyB1c3VhbGx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgbGlrZSAvZGV2L2lucHV0L2V2ZW50MSBidXQgeW91IGNhbiBzcGVjaWZ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbnkgZGV2aWNlIGZpbGUgb3IgcGlwZS4gIFlvdSBtdXN0IHNwZWNpZnkgZWFjaCBvbmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhYm92ZSBjbGFzc2VzIGV2ZW4gaWYgdGhleSBjb3JyZXNwb25kIHRvIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZXZpY2UgZmlsZSAocmVsL2FicyBhbmQgYnRuIGFyZSBvZnRlbiB0aGUgc2FtZS4pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBMb29rIGF0IHRoZSBmaWxlIC9wcm9jL2J1cy9pbnB1dC9kZXZpY2VzIHRvIGdldCBhbiBpZGVhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aGF0IGlzIGF2YWlsYWJsZSBhbmQgdGhlIGRldmljZSBmaWxlbmFtZXMuICBOb3RlOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIC9kZXYvaW5wdXQvbW91c2UqIGRldmljZXMgZG8gbm90IHNlZW0gdG8gd29yayxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgY29ycmVzcG9uZGluZyAvZGV2L2lucHV0L2V2ZW50KiBmaWxlIGluc3RlYWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbnkgaW5wdXQgY2xhc3Mgbm90IGRpcmVjdGx5IHNwZWNpZmllZCBhcyBhYm92ZSB3aWxsIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkIHZpYSB0aGUgdWlucHV0IG1lY2hhbmlzbS4gIFRvIGRpc2FibGUgY3JlYXRpbmcgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0IGRldmljZSAoYW5kIHRoZXJlYnkgZGlzY2FyZGluZyB1bmhhbmRsZWQgaW5wdXQpLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBcIm5vdWlucHV0XCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBVSU5QVVQ6ZGlyZWN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3YXMgdXNlZCBvbiBhIHF0bW9rbyBOZW8gZnJlZXJ1bm5lciAoYXJtZWwpOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAtcGlwZWlucHV0IFVJTlBVVDp0b3VjaCx0c2xpYl9jYWw9L2V0Yy9wb2ludGVyY2FsLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MSxub3VpbnB1dCxkcmFnc2tpcD00XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUgdGhlIGxvbmcgbGluZSBoYXMgYmVlbiBzcGxpdCBpbnRvIHR3by4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgZW52LiB2YXIgWDExVk5DX1VJTlBVVF9ERUJVRz0xIG9yIGhpZ2hlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IGRlYnVnZ2luZyBvdXRwdXQgZm9yIFVJTlBVVCBtb2RlLlxuIgotIlxuIgotIi1tYWNub2RpbSAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZGlzYWJsZSBkaW1taW5nLiBcbiIKLSItbWFjbm9zbGVlcCAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgZGlzcGxheSBzbGVlcC5cbiIKLSItbWFjbm9zYXZlciAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgc2NyZWVuc2F2ZXIuXG4iCi0iLW1hY25vd2FpdCAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkbyBub3Qgd2FpdCBmb3IgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRvIHN3aXRjaCBiYWNrIHRvIGhpcyBkaXNwbGF5LlxuIgotIi1tYWN3aGVlbCBuICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgc2V0IHRoZSBtb3VzZSB3aGVlbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQgdG8gbiAoZGVmYXVsdCA1KS5cbiIKLSItbWFjbm9zd2FwICAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCBzd2FwIG1vdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zIDIgYW5kIDMuXG4iCi0iLW1hY25vcmVzaXplICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkbyBub3QgcmVzaXplIG9yIHJlc2V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVidWZmZXIgZXZlbiBpZiBpdCBpcyBkZXRlY3RlZCB0aGF0IHRoZSBzY3JlZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gb3IgZGVwdGggaGFzIGNoYW5nZWQuXG4iCi0iLW1hY2ljb25hbmltIG4gICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBzZXQgbiB0byB0aGUgbnVtYmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgd2luZG93IGljb25pZnkvZGVpY29uaWZ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24gdGFrZXMuICBJbiAtbmNhY2hlIG1vZGUgdGhpcyB2YWx1ZSB3aWxsIGJlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHNraXAgdGhlIGFuaW1hdGlvbiBpZiBwb3NzaWJsZS4gKGRlZmF1bHQgNDAwKVxuIgotIi1tYWNtZW51ICAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgaW4gLW5jYWNoZSBjbGllbnQtc2lkZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2FjaGluZyBtb2RlLCB0cnkgdG8gY2FjaGUgcHVsbCBkb3duIG1lbnVzIChub3QgcGVyZmVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGV5IGhhdmUgYW5pbWF0ZWQgZmFkZXMsIGV0Yy4pXG4iCi0iLW1hY3Vza2JkICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCB1c2UgdGhlIG9yaWdpbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzdHJva2UgaW5zZXJ0aW9uIGNvZGUgYmFzZWQgb24gYSBVUyBrZXlib2FyZC5cbiIKLSItbWFjbm9vcGVuZ2wgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCB1c2UgT3BlbkdMIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIGNhcHR1cmUsIGJ1dCByYXRoZXIgdXNlIHRoZSBvcmlnaW5hbCwgZGVwcmVjYXRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmF3IG1lbW9yeSBhY2Nlc3MgbWV0aG9kOiBhZGRyID0gQ0dEaXNwbGF5QmFzZUFkZHJlc3MoKS5cbiIKLSItbWFjbm9yYXdmYiAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgdGhlIHJhdyBtZW1vcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2NyZWVuIGNhcHR1cmUgbWV0aG9kLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTUFDT1NYIE5PVEU6IFRoZXJlIGFyZSBzb21lIGRlcHJlY2F0ZWQgTWFjT1NYIGludGVyZmFjZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGluamVjdCBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGFuZCB0aGUgcmF3IG1lbW9yeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFzIHdlbGwgKGhvd2V2ZXIsIE9wZW5HTFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwcmVmZXJyZWQgaWYgYXZhaWxhYmxlIGJlY2F1c2UgaXQgaXMgZmFzdGVyLilcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYW4gZm9yY2Ugbm90IHVzaW5nIGFueSBkZXByZWNhdGVkIGludGVyZmFjZXMgYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgdGltZSBieSBzZXR0aW5nIC1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEPTFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluIENQUEZMQUdTLiAgT3IgdG8gdHVybiB0aGVtIG9mZiBvbmUgYnkgb25lOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFM9MSBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfRlJBTUVCVUZGRVI9MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQXQgcnVuIHRpbWUsIGZvciB0ZXN0aW5nIGFuZCB3b3JrYXJvdW5kcywgb25lIGNhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB0aGVtIGJ5IHVzaW5nOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQ9MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUz0xIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUj0xXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIGRvaW5nIGVpdGhlciBvZiB0aGVzZSBmb3IgdGhlIG1vdXNlIGlucHV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3QgZXZlcnl0aGluZyB3b3JrcyBjdXJyZW50bHksIGUuZy4gZG91YmxlIGNsaWNrcyBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtaW5nLiAgQWxzbywgc2NyZWVuIHJlc29sdXRpb24gYW5kIHBpeGVsIGRlcHRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdW5sZXNzIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCBmcmFtZWJ1ZmZlciBpbnRlcmZhY2VzIGFyZSBhbGxvd2VkLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgaWYgeW91IGFyZSBjb21waWxpbmcgb24gYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9sZGVyIG1hY2hpbmUgdGhhdCBkb2VzIG5vdCBoYXZlIHNvbWUgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXdlciBpbnRlcmZhY2VzLCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVTQ1JPTExXSEVFTEVWRU5UXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtRFgxMVZOQ19NQUNPU1hfTk9fQ0dFVkVOVENSRUFURU1PVVNFRVZFTlQgb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX01BQ09TWF9OT19DR0VWRU5UQ1JFQVRFS0VZQk9BUkRFVkVOVC4gIFVzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX1VTRV9HRVRNQUlOREVWSUNFIHRvIHJlZ2FpbiB0aGUgdmVyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2xkIFF1aWNrRHJhdyBHZXRNYWluRGV2aWNlKCkgaW50ZXJmYWNlIChyYXJlLi4uKVxuIgotIlxuIgotIi1ndWkgW2d1aS1vcHRzXSAgICAgICAgU3RhcnQgdXAgYSBzaW1wbGUgdGNsL3RrIGd1aSBiYXNlZCBvbiB0aGUgcmVtb3RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIG9wdGlvbnMgLXJlbW90ZS8tcXVlcnkgZGVzY3JpYmVkIGJlbG93LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXMgdGhlIFwid2lzaFwiIHByb2dyYW0gdG8gYmUgaW5zdGFsbGVkIG9uIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZS4gIFwiZ3VpLW9wdHNcIiBpcyBub3QgcmVxdWlyZWQ6IHRoZSBkZWZhdWx0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBzdGFydCB1cCBib3RoIHRoZSBmdWxsIGd1aSBhbmQgeDExdm5jIHdpdGggdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBndWkgc2hvd2luZyB1cCBvbiB0aGUgWCBkaXNwbGF5IGluIHRoZSBlbnZpcm9ubWVudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgRElTUExBWS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiZ3VpLW9wdHNcIiBjYW4gYmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpdGVtcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBhcmUgdGhlc2UgdHlwZXMgb2YgaXRlbXM6IDEpIGEgZ3VpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBhIDIpIGd1aSBcInNpbXBsaWNpdHlcIiwgMykgdGhlIFggZGlzcGxheSB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGd1aSBzaG91bGQgZGlzcGxheSBvbiwgNCkgYSBcInRyYXlcIiBvciBcImljb25cIiBtb2RlLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDUpIGEgZ3VpIGdlb21ldHJ5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMSkgVGhlIGd1aSBtb2RlIGNhbiBiZSBcInN0YXJ0XCIsIFwiY29ublwiLCBvciBcIndhaXRcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJzdGFydFwiIGlzIHRoZSBkZWZhdWx0IG1vZGUgYWJvdmUgYW5kIGlzIG5vdCByZXF1aXJlZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiY29ublwiIG1lYW5zIGRvIG5vdCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHVwIHgxMXZuYyxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbnN0ZWFkIGp1c3QgdHJ5IHRvIGNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgeDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLiAgXCJ3YWl0XCIgbWVhbnMganVzdCBzdGFydCB0aGUgZ3VpIGFuZCBub3RoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbHNlICh5b3Ugd2lsbCBsYXRlciBpbnN0cnVjdCB0aGUgZ3VpIHRvIHN0YXJ0IHgxMXZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgY29ubmVjdCB0byBhbiBleGlzdGluZyBvbmUuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgMikgVGhlIGd1aSBzaW1wbGljaXR5IGlzIG9mZiBieSBkZWZhdWx0IChhIHBvd2VyLXVzZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGd1aSB3aXRoIGFsbCBvcHRpb25zIGlzIHByZXNlbnRlZCkgVG8gc3RhcnQgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIGxlc3MgZGF1bnRpbmcgc3VwcGx5IHRoZSBzdHJpbmcgXCJzaW1wbGVcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKFwiZXpcIiBpcyBhbiBhbGlhcyBmb3IgdGhpcykuICBPbmNlIHRoZSBndWkgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgeW91IGNhbiB0b2dnbGUgYmV0d2VlbiB0aGUgdHdvIHdpdGggXCJNaXNjIC0+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfZ3VpXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAzKSBOb3RlIHRoZSBwb3NzaWJsZSBjb25mdXNpb24gcmVnYXJkaW5nIHRoZSBwb3RlbnRpYWxseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHdvIGRpZmZlcmVudCBYIGRpc3BsYXlzOiB4MTF2bmMgcG9sbHMgb25lLCBidXQgeW91XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYXkgd2FudCB0aGUgZ3VpIHRvIGFwcGVhciBvbiBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3Ugc3NoIGluIGFuZCB4MTF2bmMgaXMgbm90IHJ1bm5pbmcgeWV0IHlvdSBtYXkgd2FudFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGd1aSB0byBjb21lIGJhY2sgdG8geW91IHZpYSB5b3VyIHNzaCByZWRpcmVjdGVkIFhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgKGUuZy4gbG9jYWxob3N0OjEwKS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGd1aSBYIGRpc3BsYXkgaW4gXCJndWktb3B0c1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCAtZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGFyZSB0cmllZCAoaW4gdGhhdCBvcmRlcikuICBSZWdhcmRpbmcgdGhlIHgxMXZuY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWCBkaXNwbGF5IHRoZSBndWkgd2lsbCB0cnkgdG8gY29tbXVuaWNhdGlvbiB3aXRoLCBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdHJpZXMgLWRpc3BsYXkgYW5kIHRoZW4gRElTUExBWS4gIEZvciBleGFtcGxlLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJ4MTF2bmMgLWRpc3BsYXkgOjAgLWd1aSBvdGhlcmhvc3Q6MFwiLCB3aWxsIHJlbW90ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBhbiB4MTF2bmMgcG9sbGluZyA6MCBhbmQgZGlzcGxheSB0aGUgZ3VpIG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvdGhlcmhvc3Q6MCBUaGUgXCJ0cmF5L2ljb25cIiBtb2RlIGJlbG93IHJldmVyc2VzIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2UsIHByZWZlcnJpbmcgdG8gZGlzcGxheSBvbiB0aGUgeDExdm5jIGRpc3BsYXkuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA0KSBXaGVuIFwidHJheVwiIG9yIFwiaWNvblwiIGlzIHNwZWNpZmllZCwgdGhlIGd1aVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudHMgaXRzZWxmIGFzIGEgc21hbGwgaWNvbiB3aXRoIGJlaGF2aW9yIHR5cGljYWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgXCJzeXN0ZW0gdHJheVwiIG9yIFwiZG9jayBhcHBsZXRcIi4gIFRoZSBjb2xvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGljb24gaW5kaWNhdGVzIHN0YXR1cyAoY29ubmVjdGVkIGNsaWVudHMpIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYWxzbyBhIGJhbGxvb24gc3RhdHVzLiAgQ2xpY2tpbmcgb24gdGhlIGljb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdpdmVzIGEgbWVudSBmcm9tIHdoaWNoIHByb3BlcnRpZXMsIGV0YywgY2FuIGJlIHNldCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdWxsIGd1aSBpcyBhdmFpbGFibGUgdW5kZXIgXCJBZHZhbmNlZFwiLiAgVG8gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IGZ1bmN0aW9uYWwsIHRoZSBndWkgbW9kZSBzaG91bGQgYmUgXCJzdGFydFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAodGhlIGRlZmF1bHQpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRyYXkgb3IgaWNvbiBtb2RlIHdpbGwgaW1wbHkgdGhlIC1mb3JldmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgb3B0aW9uIChpZiB0aGUgeDExdm5jIHNlcnZlciBpcyBzdGFydGVkIGFsb25nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBndWkpIHVubGVzcyAtY29ubmVjdCBvciAtY29ubmVjdF9vcl9leGl0IGhhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBzcGVjaWZpZWQuICBTbyB4MTF2bmMgKGFuZCB0aGUgdHJheS9pY29uIGd1aSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgd2FpdCBmb3IgbW9yZSBjb25uZWN0aW9ucyBhZnRlciB0aGUgZmlyc3QgY2xpZW50XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0cy4gIElmIHlvdSB3YW50IG9ubHkgb25lIHZpZXdlciBjb25uZWN0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHRoZSAtb25jZSBvcHRpb24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgXCJpY29uXCIgdGhlIGd1aSBqdXN0IGEgc21hbGwgc3RhbmRhbG9uZSB3aW5kb3cuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBGb3IgXCJ0cmF5XCIgaXQgd2lsbCBhdHRlbXB0IHRvIGVtYmVkIGl0c2VsZiBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic3lzdGVtIHRyYXlcIiBpZiBwb3NzaWJsZS4gSWYgXCI9c2V0cGFzc1wiIGlzIGFwcGVuZGVkIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGF0IHN0YXJ0dXAgdGhlIFgxMSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2V0IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIHNlc3Npb24gcGFzc3dvcmQuICBJZiA9PGhleG51bWJlcj4gaXMgYXBwZW5kZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaWNvbiB3aWxsIGF0dGVtcHQgdG8gZW1iZWQgaXRzZWxmIGluIHRoZSB3aW5kb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGJ5IGhleG51bWJlci4gIFVzZSA9bm9hZHZhbmNlZCB0byBkaXNhYmxlIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnVsbCBndWkuIChUbyBzdXBwbHkgbW9yZSB0aGFuIG9uZSwgdXNlIFwiK1wiIHNpZ24pLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiAtZ3VpIHRyYXk9c2V0cGFzcyBhbmQgLWd1aSBpY29uPTB4MzYwMDAyOFxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgbW9kZXM6IFwiZnVsbFwiLCB0aGUgZGVmYXVsdCBhbmQgbmVlZCBub3QgYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZC4gIFwiLWd1aSBub25lXCIsIGRvIG5vdCBzaG93IGEgZ3VpLCB1c2VmdWxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIG92ZXJyaWRlIGEgfi8ueDExdm5jcmMgc2V0dGluZywgZXRjLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgNSkgV2hlbiBcImdlb209K1grWVwiIGlzIHNwZWNpZmllZCwgdGhhdCBnZW9tZXRyeVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgcGFzc2VkIHRvIHRoZSBndWkgdG9wbGV2ZWwuICBUaGlzIGlzIHRoZSBpY29uIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpY29uL3RyYXkgbW9kZSwgb3IgdGhlIGZ1bGwgZ3VpIG90aGVyd2lzZS4gIFlvdSBjYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsc28gc3BlY2lmeSB3aWR0aCBhbmQgaGVpZ2h0LCBpLmUuIFd4SCtYK1ksIGJ1dCBpdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHJlY29tbWVuZGVkLiAgSW4gXCJ0cmF5XCIgbW9kZSB0aGUgZ2VvbWV0cnkgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgdW5sZXNzIHRoZSBzeXN0ZW0gdHJheSBtYW5hZ2VyIGRvZXMgbm90IHNlZW1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcuICBPbmUgY291bGQgaW1hZ2luZSB1c2luZyBzb21ldGhpbmcgbGlrZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItZ3VpIHRyYXksZ2VvbT0rNDAwMCs0MDAwXCIgd2l0aCBhIGRpc3BsYXkgbWFuYWdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgZ3VpIGludmlzaWJsZSB1bnRpbCBzb21lb25lIGxvZ3MgaW4uLi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE1vcmUgaWNvbiB0cmlja3MsIFwiaWNvbj1taW5pbWFsXCIgZ2l2ZXMgYW4gaWNvbiBqdXN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBWTkMgZGlzcGxheSBudW1iZXIuICBZb3UgY2FuIGFsc28gc2V0IHRoZSBmb250XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFwiaWNvbmZvbnQ9Li4uXCIuICBUaGUgZm9sbG93aW5nIGNvdWxkIGJlIHVzZWZ1bDpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwiLWd1aSBpY29uPW1pbmltYWwsaWNvbmZvbnQ9NXg4LGdlb209MjR4MTArMC0wXCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYWwgZXhhbXBsZXMgb2YgdGhlIC1ndWkgb3B0aW9uOiBcIngxMXZuYyAtZ3VpXCIsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcIngxMXZuYyAtZ3VpIGV6XCIgXCJ4MTF2bmMgLWd1aSBsb2NhbGhvc3Q6MTBcIixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwieDExdm5jIC1ndWkgY29ubixob3N0OjBcIiwgXCJ4MTF2bmMgLWd1aSB0cmF5LGV6XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwieDExdm5jIC1ndWkgdHJheT1zZXRwYXNzXCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3QgaW50ZW5kIHRvIHN0YXJ0IHgxMXZuYyBmcm9tIHRoZSBndWlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGp1c3QgcmVtb3RlIGNvbnRyb2wgYW4gZXhpc3Rpbmcgb25lKSwgdGhlbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGd1aSBwcm9jZXNzIGNhbiBydW4gb24gYSBkaWZmZXJlbnQgbWFjaGluZSBmcm9tIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHNlcnZlciBhcyBsb25nIGFzIFggcGVybWlzc2lvbnMsIGV0Yy4gcGVybWl0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHR3by5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEZPTlRTOiBPbiBzb21lIHN5c3RlbXMgdGhlIHRrIGZvbnRzIGNhbiBiZSB0b28gc21hbGwsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBqYWdnZWQsIG9yIG90aGVyd2lzZSB1bnJlYWRhYmxlLiAgVGhlcmUgYXJlIDQgZW52IHZhcnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc2V0IHRvIGJlIHRoZSB0ayBmb250IHlvdSBwcmVmZXI6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfRk9OVF9CT0xEICAgbWFpbiBmb250IGZvciBtZW51cyBhbmQgYnV0dG9ucy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GT05UX0ZJWEVEICBmb250IGZvciBmaXhlZCB3aWR0aCB0ZXh0LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX0ZPTlRfQk9MRF9TTUFMTCAgdHJheSBpY29uIGZvbnQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfRk9OVF9SRUdfU01BTEwgICB0cmF5IGljb24gbWVudSBmb250LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxhc3QgdHdvIG9ubHkgYXBwbHkgZm9yIHRoZSB0cmF5IGljb24gbW9kZS5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6XG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19GT05UX0JPTEQ9J0hlbHZldGljYSAtMTYgYm9sZCdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX0ZPTlRfRklYRUQ9J0NvdXJpZXIgLTE0J1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfRk9OVF9SRUdfU01BTEw9J0hlbHZldGljYSAtMTInXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHB1dCB0aGUgbGluZXMgbGlrZSB0aGUgYWJvdmUgKHdpdGhvdXQgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXMpIGluIHlvdXIgfi8ueDExdm5jcmMgZmlsZSB0byBhdm9pZCBoYXZpbmcgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlbSBvbiB0aGUgeDExdm5jIGNvbW1hbmQgbGluZS5cbiIKLSJcbiIKLSItcmVtb3RlIGNvbW1hbmQgICAgICAgIFJlbW90ZWx5IGNvbnRyb2wgc29tZSBhc3BlY3RzIG9mIGFuIGFscmVhZHkgcnVubmluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHNlcnZlci4gIFwiLVJcIiBhbmQgXCItclwiIGFyZSBhbGlhc2VzIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCItcmVtb3RlXCIuICBBZnRlciB0aGUgcmVtb3RlIGNvbnRyb2wgY29tbWFuZCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2VudCB0byB0aGUgcnVubmluZyBzZXJ2ZXIgdGhlICd4MTF2bmMgLXJlbW90ZSAuLi4nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgY29tbWFuZCBleGl0cy4gIFlvdSBjYW4gb2Z0ZW4gdXNlIHRoZSAtcXVlcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgKHNlZSBiZWxvdykgdG8gc2VlIGlmIHRoZSB4MTF2bmMgc2VydmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgeW91ciAtcmVtb3RlIGNvbW1hbmQuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgdGhhdCBvZiBYXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIChzcGVjaWZpY2FsbHkgWDExVk5DX1JFTU9URSksIGFuZCBzbyB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIG11c3QgYmUgcnVuIHdpdGggY29ycmVjdCBzZXR0aW5ncyBmb3IgRElTUExBWVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHBvc3NpYmx5IFhBVVRIT1JJVFkgdG8gY29ubmVjdCB0byB0aGUgWCBzZXJ2ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZXQgdGhlIHByb3BlcnR5LiAgQWx0ZXJuYXRpdmVseSwgdXNlIHRoZSAtZGlzcGxheVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1hdXRoIG9wdGlvbnMgdG8gc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWVzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1bm5pbmcgc2VydmVyIGNhbm5vdCB1c2UgdGhlIC1ub3ZuY2Nvbm5lY3Qgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoYXQgZGlzYWJsZXMgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFNlZSBiZWxvdyBmb3IgYWx0ZXJuYXRlIGNoYW5uZWxzLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICd4MTF2bmMgLXJlbW90ZSBzdG9wJyAod2hpY2ggaXMgdGhlIHNhbWUgYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICd4MTF2bmMgLVIgc3RvcCcpIHdpbGwgY2xvc2UgZG93biB0aGUgeDExdm5jIHNlcnZlci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICd4MTF2bmMgLVIgc2hhcmVkJyB3aWxsIGVuYWJsZSBzaGFyZWQgY29ubmVjdGlvbnMsIGFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgJ3gxMXZuYyAtUiBzY2FsZTozLzQnIHdpbGwgcmVzY2FsZSB0aGUgZGVza3RvcC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRvIHVzZSBhIGRpZmZlcmVudCBuYW1lIGZvciB0aGUgWDExIHByb3BlcnR5IChlLmcuIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgZm9yIG11bHRpcGxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMncyBvbiB0aGUgc2FtZSBkaXNwbGF5KSBzZXQgdGhlIFgxMVZOQ19SRU1PVEVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBzdHJpbmcgeW91IHdhbnQsIGZvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZTogLWVudiBYMTFWTkNfUkVNT1RFPVgxMVZOQ19SRU1PVEVfMTIzNDVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJvdGggc2lkZXMgb2YgdGhlIGNoYW5uZWwgbXVzdCB1c2UgdGhlIHNhbWUgdW5pcXVlIG5hbWUuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBydW4gYSBidW5jaCBvZiBjb21tYW5kcyBpbiBhIHNlcXVlbmNlIHVzZSBzb21ldGhpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpa2U6IHgxMXZuYyAtUiAnc2NyaXB0OmZpcnN0Y21kO3NlY29uZGNtZDsuLi4nXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBVc2UgeDExdm5jIC1SIHNjcmlwdDpmaWxlPS9wYXRoL3RvL2ZpbGUgdG8gcmVhZCBjb21tYW5kc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIGZpbGUgKGNhbiBiZSBtdWx0aS1saW5lIGFuZCB1c2UgdGhlIGNvbW1lbnQgJyMnXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgaW4gdGhlIG5vcm1hbCB3YXkuICBUaGUgJzsnIHNlcGFyYXRvciBtdXN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSB1c2VkIHRvIHNlcGFyYXRlIGVhY2ggY29tbWFuZC4pXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUbyBub3QgdHJ5IHRvIGNvbnRhY3QgYW5vdGhlciB4MTF2bmMgcHJvY2VzcyBhbmQgaW5zdGVhZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAganVzdCBydW4gdGhlIGNvbW1hbmQgKG9yIHF1ZXJ5KSBkaXJlY3RseSwgcHJlZml4IHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCB3aXRoIHRoZSBzdHJpbmcgXCJESVJFQ1Q6XCJcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgLXJlbW90ZS8tUiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3RvcCAgICAgICAgICAgIHRlcm1pbmF0ZSB0aGUgc2VydmVyLCBzYW1lIGFzIFwicXVpdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJleGl0XCIgb3IgXCJzaHV0ZG93blwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGluZyAgICAgICAgICAgIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlciByZXNwb25kcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXM6IGFucz1waW5nOjxkaXNwbGF5PlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGluZzpteXN0cmluZyAgIGFzIGFib3ZlLCBidXQgdXNlIHlvdXIgb3duIHVuaXF1ZSBzdHJpbmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOiBhbnM9cGluZzpteXN0cmluZzo8eGRpc3BsYXk+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBibGFja2VuICAgICAgICAgdHJ5IHRvIHB1c2ggYSBibGFjayBmYiB1cGRhdGUgdG8gYWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyAoZHVlIHRvIHRpbWluZ3MgYSBjbGllbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VsZCBtaXNzIGl0KS4gU2FtZSBhcyBcInplcm9cIiwgYWxzb1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiemVybzp4MSx5MSx4Mix5MlwiIGZvciBhIHJlY3RhbmdsZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggICAgICAgICBzZW5kIHRoZSBlbnRpcmUgZmIgdG8gYWxsIGNsaWVudHMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNldCAgICAgICAgICAgcmVjcmVhdGUgdGhlIGZiLCBwb2xsaW5nIG1lbW9yeSwgZXRjLlxuIgotLyogZXh0LiBjbWQuICovCi0iICAgICAgICAgICAgICAgICAgICAgICBpZDp3aW5kb3dpZCAgICAgc2V0IC1pZCB3aW5kb3cgdG8gXCJ3aW5kb3dpZFwiLiBlbXB0eVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFwicm9vdFwiIHRvIGdvIGJhY2sgdG8gcm9vdCB3aW5kb3dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpZDp3aW5kb3dpZCAgICBzZXQgLXNpZCB3aW5kb3cgdG8gXCJ3aW5kb3dpZFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpZF9jbWQ6Y21kICAgICAgY21kczogcmFpc2UsIGxvd2VyLCBtYXAsIHVubWFwLCBpY29uaWZ5LFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmU6ZFhkWSwgcmVzaXplOmRXZEgsIGdlb206V3hIK1grWS4gZFhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWSwgZFcsIGFuZCBkSCBtdXN0IGhhdmUgYSBsZWFkaW5nIFwiK1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgXCItXCIgZS5nLjogbW92ZTotMzArMTAgcmVzaXplOisyMCszNVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc286IHdtX2RlbGV0ZSwgd21fbmFtZTpzdHJpbmcgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbl9uYW1lOnN0cmluZy4gQWxzbyBpZF9jbWQ6d2luPU46Y21kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YWl0bWFwcGVkICAgICAgd2FpdCB1bnRpbCBzdWJ3aW4gaXMgbWFwcGVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm93YWl0bWFwcGVkICAgIGRvIG5vdCB3YWl0IHVudGlsIHN1YndpbiBpcyBtYXBwZWQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGlwOld4SCtYK1kgICAgc2V0IC1jbGlwIG1vZGUgdG8gXCJXeEgrWCtZXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoY21hcCAgICAgICBlbmFibGUgIC1mbGFzaGNtYXAgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZmxhc2hjbWFwICAgICBkaXNhYmxlIC1mbGFzaGNtYXAgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Y21hcDpuICAgICBzZXQgLXNoaWZ0Y21hcCB0byBuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90cnVlY29sb3IgICAgIGVuYWJsZSAgLW5vdHJ1ZWNvbG9yIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0cnVlY29sb3IgICAgICAgZGlzYWJsZSAtbm90cnVlY29sb3IgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgICAgICAgICBlbmFibGUgIC1vdmVybGF5IG1vZGUgKGlmIGFwcGxpY2FibGUpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9vdmVybGF5ICAgICAgIGRpc2FibGUgLW92ZXJsYXkgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfY3Vyc29yICBpbiAtb3ZlcmxheSBtb2RlLCBlbmFibGUgY3Vyc29yIGRyYXdpbmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5X25vY3Vyc29yIGRpc2FibGUgY3Vyc29yIGRyYXdpbmcuIHNhbWUgYXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9vdmVybGF5X2N1cnNvci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDh0bzI0ICAgICAgICAgICBlbmFibGUgIC04dG8yNCBtb2RlIChpZiBhcHBsaWNhYmxlKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vOHRvMjQgICAgICAgICBkaXNhYmxlIC04dG8yNCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgOHRvMjRfb3B0czpzdHIgIHNldCB0aGUgLTh0bzI0IG9wdHMgdG8gXCJzdHJcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDI0dG8zMiAgICAgICAgICBlbmFibGUgIC0yNHRvMzIgbW9kZSAoaWYgYXBwbGljYWJsZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBubzI0dG8zMiAgICAgICAgZGlzYWJsZSAtMjR0bzMyIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWw6dmlzICAgICAgc2V0IC12aXN1YWwgdG8gXCJ2aXNcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6ZnJhYyAgICAgIHNldCAtc2NhbGUgdG8gXCJmcmFjXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2N1cnNvcjpmICBzZXQgLXNjYWxlX2N1cnNvciB0byBcImZcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgICAgICAgIGVuYWJsZSAgLXZpZXdvbmx5IG1vZGUuXG4iCi0vKiBhY2Nlc3MgdmlldyxzaGFyZSxmb3JldmVyICovCi0iICAgICAgICAgICAgICAgICAgICAgICBub3ZpZXdvbmx5ICAgICAgZGlzYWJsZSAtdmlld29ubHkgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCAgICAgICAgICBlbmFibGUgIC1zaGFyZWQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2hhcmVkICAgICAgICBkaXNhYmxlIC1zaGFyZWQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvcmV2ZXIgICAgICAgICBlbmFibGUgIC1mb3JldmVyIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2ZvcmV2ZXIgICAgICAgZGlzYWJsZSAtZm9yZXZlciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDpuICAgICAgIHJlc2V0IC10aW1lb3V0IHRvIG4sIGlmIHRoZXJlIGFyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBubyBjbGllbnRzLCBleGl0IHVubGVzcyBvbmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0cyBpbiB0aGUgbmV4dCBuIHNlY3MuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aWdodGZpbGV4ZmVyICAgZW5hYmxlICBmaWxldHJhbnNmZXIgZm9yIE5FVyBjbGllbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm90aWdodGZpbGV4ZmVyIGRpc2FibGUgZmlsZXRyYW5zZmVyIGZvciBORVcgY2xpZW50cy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVsdHJhZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgY2xpZW50cy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdWx0cmFmaWxleGZlciBkaXNhYmxlIGZpbGV0cmFuc2ZlciBmb3IgY2xpZW50cy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJmYnZlcnNpb246bi5tICBzZXQgLXJmYnZlcnNpb24gZm9yIG5ldyBjbGllbnRzLlxuIgotLyogYWNjZXNzICovCi0iICAgICAgICAgICAgICAgICAgICAgICBodHRwICAgICAgICAgICAgZW5hYmxlICBodHRwIGNsaWVudCBjb25uZWN0aW9ucy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vaHR0cCAgICAgICAgICBkaXNhYmxlIGh0dHAgY2xpZW50IGNvbm5lY3Rpb25zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVueSAgICAgICAgICAgIGRlbnkgYW55IG5ldyBjb25uZWN0aW9ucywgc2FtZSBhcyBcImxvY2tcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9kZW55ICAgICAgICAgIGFsbG93IG5ldyBjb25uZWN0aW9ucywgc2FtZSBhcyBcInVubG9ja1wiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhdmFoaSAgICAgICAgICAgZW5hYmxlICBhdmFoaSBzZXJ2aWNlIGFkdmVydGlzaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9hdmFoaSAgICAgICAgIGRpc2FibGUgYXZhaGkgc2VydmljZSBhZHZlcnRpc2luZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1kbnMgICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub21kbnMgICAgICAgICAgZGlzYWJsZSBhdmFoaSBzZXJ2aWNlIGFkdmVydGlzaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgemVyb2NvbmYgICAgICAgIGVuYWJsZSAgYXZhaGkgc2VydmljZSBhZHZlcnRpc2luZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vemVyb2NvbmYgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuXG4iCi0vKiBhY2Nlc3MsIGZpbGVuYW1lICovCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0Omhvc3QgICAgZG8gcmV2ZXJzZSBjb25uZWN0aW9uIHRvIGhvc3QsIFwiaG9zdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBob3N0OnBvcnRzLiAgU2VlIC1jb25uZWN0LiAgUGFzc3dvcmRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgYXMgd2l0aCBmd2QgY29ubmVjdGlvbnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFgxMVZOQ19SRVZFUlNFX0NPTk5FQ1RJT05fTk9fQVVUSD0xXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0Omhvc3QgZGlzY29ubmVjdCBhbnkgY2xpZW50cyBmcm9tIFwiaG9zdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBhcyBcImNsb3NlOmhvc3RcIi4gIFVzZSBob3N0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhbGxcIiB0byBjbG9zZSBhbGwgY3VycmVudCBjbGllbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBrbm93IHRoZSBjbGllbnQgaW50ZXJuYWwgaGV4IElELFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gMHgzIChyZXR1cm5lZCBieSBcIi1xdWVyeSBjbGllbnRzXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgUkZCX0NMSUVOVF9JRCkgeW91IGNhbiB1c2UgdGhhdCB0b28uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm94eTpob3N0OnBvcnQgc2V0IHJldmVyc2UgY29ubmVjdGlvbiBwcm94eSAoZW1wdHkgdG9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKS5cbiIKLS8qIGFjY2VzcyAqLwotIiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dvbmNlOmhvc3QgIEZvciB0aGUgbmV4dCBjb25uZWN0aW9uIG9ubHksIGFsbG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBmcm9tIFwiaG9zdFwiLiBJbiAtc3NsIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gY29ubmVjdGlvbnMgYXJlIGFsbG93ZWQgKGkuZS4gRmV0Y2hcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0KSB1bmxlc3MgWDExVk5DX05PX1NTTF9BTExPV19UV0lDRT0xXG4iCi0vKiBhY2Nlc3MgKi8KLSIgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Omhvc3RsaXN0ICBzZXQgLWFsbG93IGxpc3QgdG8gKGNvbW1hIHNlcGFyYXRlZClcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhvc3RsaXN0XCIuIFNlZSAtYWxsb3cgYW5kIC1sb2NhbGhvc3QuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG8gbm90IHVzZSB3aXRoIC1hbGxvdyAvcGF0aC90by9maWxlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIFwiK2hvc3RcIiB0byBhZGQgYSBzaW5nbGUgaG9zdCwgYW5kXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIFwiLWhvc3RcIiB0byBkZWxldGUgYSBzaW5nbGUgaG9zdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxob3N0ICAgICAgIGVuYWJsZSAgLWxvY2FsaG9zdCBtb2RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2xvY2FsaG9zdCAgICAgZGlzYWJsZSAtbG9jYWxob3N0IG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbjpzdHIgICAgICBzZXQgLWxpc3RlbiB0byBzdHIsIGVtcHR5IHRvIGRpc2FibGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2lwdjYgICAgICAgICAgZW5hYmxlICAtbm9pcHY2IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcHY2ICAgICAgICAgICAgZGlzYWJsZSAtbm9pcHY2IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2lwdjQgICAgICAgICAgZW5hYmxlICAtbm9pcHY0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcHY0ICAgICAgICAgICAgZGlzYWJsZSAtbm9pcHY0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgZW5hYmxlICAtNiBJUHY2IGxpc3RlbmluZyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm82ICAgICAgICAgICAgIGRpc2FibGUgLTYgSVB2NiBsaXN0ZW5pbmcgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cCAgICAgICAgICBkaXNhYmxlIC1ub2xvb2t1cCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9sb29rdXAgICAgICAgIGVuYWJsZSAgLW5vbG9va3VwIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsb29rdXAgICAgICAgICAgZGlzYWJsZSAtbm9sb29rdXAgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OnN0ciAgICAgICBzZXQgLWlucHV0IHRvIFwic3RyXCIsIGVtcHR5IHRvIGRpc2FibGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBncmFia2JkICAgICAgICAgZW5hYmxlICAtZ3JhYmtiZCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9ncmFia2JkICAgICAgIGRpc2FibGUgLWdyYWJrYmQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyYWJwdHIgICAgICAgICBlbmFibGUgIC1ncmFicHRyIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2dyYWJwdHIgICAgICAgZGlzYWJsZSAtZ3JhYnB0ciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYmFsd2F5cyAgICAgIGVuYWJsZSAgLWdyYWJhbHdheXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZ3JhYmFsd2F5cyAgICBkaXNhYmxlIC1ncmFiYWx3YXlzIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBncmFibG9jYWw6biAgICAgc2V0IC1ncmFibG9jYWwgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pbnB1dDpzdHIgc2V0IHRoZSBLLCBNLCBCIC1pbnB1dCBvbiBhIHBlci1jbGllbnRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpcy4gIHNlbGVjdCB3aGljaCBjbGllbnQgYXMgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCwgZS5nLiBjbGllbnRfaW5wdXQ6aG9zdDpNQlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNsaWVudF9pbnB1dDoweDI6S1xuIgotLyogZXh0LiBjbWQuICovCi0iICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ6Y21kICAgICAgc2V0IC1hY2NlcHQgXCJjbWRcIiAoZW1wdHkgdG8gZGlzYWJsZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhZnRlcmFjY2VwdDpjbWQgc2V0IC1hZnRlcmFjY2VwdCAoZW1wdHkgdG8gZGlzYWJsZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnb25lOmNtZCAgICAgICAgc2V0IC1nb25lIFwiY21kXCIgKGVtcHR5IHRvIGRpc2FibGUpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9zaG0gICAgICAgICAgIGVuYWJsZSAgLW5vc2htIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaG0gICAgICAgICAgICAgZGlzYWJsZSAtbm9zaG0gbW9kZSAoaS5lLiB1c2Ugc2htKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZsaXBieXRlb3JkZXIgICBlbmFibGUgLWZsaXBieXRlb3JkZXIgbW9kZSwgeW91IG1heSBuZWVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2V0IG5vc2htIGZvciB0aGlzIHRvIGRvIHNvbWV0aGluZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZmxpcGJ5dGVvcmRlciBkaXNhYmxlIC1mbGlwYnl0ZW9yZGVyIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmV0aWxlICAgICAgICAgZW5hYmxlICAtb25ldGlsZSBtb2RlLiAoeW91IG1heSBuZWVkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHNobSBmb3IgdGhpcyB0byBkbyBzb21ldGhpbmcpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub29uZXRpbGUgICAgICAgZGlzYWJsZSAtb25ldGlsZSBtb2RlLlxuIgotLyogZXh0LiBjbWQuICovCi0iICAgICAgICAgICAgICAgICAgICAgICBzb2xpZCAgICAgICAgICAgZW5hYmxlICAtc29saWQgbW9kZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9zb2xpZCAgICAgICAgIGRpc2FibGUgLXNvbGlkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb2xpZF9jb2xvcjpjb2xvciBzZXQgLXNvbGlkIGNvbG9yIChhbmQgYXBwbHkgaXQpLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tvdXQ6c3RyICAgIHNldCAtYmxhY2tvdXQgXCJzdHJcIiAoZW1wdHkgdG8gZGlzYWJsZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1ibGFja291dCBmb3IgdGhlIGZvcm0gb2YgXCJzdHJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHk6IFd4SCtYK1ksLi4uKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBcIitXeEgrWCtZXCIgdG8gYXBwZW5kIGEgc2luZ2xlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlIHVzZSBcIi1XeEgrWCtZXCIgdG8gZGVsZXRlIG9uZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGluZXJhbWEgICAgICAgIGVuYWJsZSAgLXhpbmVyYW1hIG1vZGUuIChpZiBhcHBsaWNhYmxlKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94aW5lcmFtYSAgICAgIGRpc2FibGUgLXhpbmVyYW1hIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4dHJhcCAgICAgICAgICAgZW5hYmxlICAteHRyYXAgaW5wdXQgbW9kZShpZiBhcHBsaWNhYmxlKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94dHJhcCAgICAgICAgIGRpc2FibGUgLXh0cmFwIGlucHV0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB4cmFuZHIgICAgICAgICAgZW5hYmxlICAteHJhbmRyIG1vZGUuIChpZiBhcHBsaWNhYmxlKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94cmFuZHIgICAgICAgIGRpc2FibGUgLXhyYW5kciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeHJhbmRyX21vZGU6bW9kZSBzZXQgdGhlIC14cmFuZHIgbW9kZSB0byBcIm1vZGVcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZTptb2RlICAgICBzZXQgdGhlIC1yb3RhdGUgbW9kZSB0byBcIm1vZGVcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBhZGdlb206V3hIICAgICBzZXQgLXBhZGdlb20gdG8gV3hIIChlbXB0eSB0byBkaXNhYmxlKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIFd4SCBpcyBcImZvcmNlXCIgb3IgXCJkb1wiIHRoZSBwYWRkZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSBmYiBpcyBpbW1lZGlhdGVseSBhcHBsaWVkLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgICAgICAgICAgIGVuYWJsZSAgLXF1aWV0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3F1aWV0ICAgICAgICAgZGlzYWJsZSAtcXVpZXQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vZHR3ZWFrICAgICAgICBlbmFibGUgIC1tb2R0d2VhayBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9tb2R0d2VhayAgICAgIGVuYWJsZSAgLW5vbW9kdHdlYWsgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHhrYiAgICAgICAgICAgICBlbmFibGUgIC14a2IgbW9kdHdlYWsgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5veGtiICAgICAgICAgICBkaXNhYmxlIC14a2IgbW9kdHdlYWsgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNhcHNsb2NrICAgICAgICBlbmFibGUgIC1jYXBzbG9jayBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jYXBzbG9jayAgICAgIGRpc2FibGUgLWNhcHNsb2NrIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBza2lwX2xvY2trZXlzICAgZW5hYmxlICAtc2tpcF9sb2Nra2V5cyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9za2lwX2xvY2trZXlzIGRpc2FibGUgLXNraXBfbG9ja2tleXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNraXBfa2V5Y29kZXM6c3RyIGVuYWJsZSAteGtiIC1za2lwX2tleWNvZGVzIFwic3RyXCIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlfa2V5cyAgICAgZW5hYmxlICAtc2xvcHB5X2tleXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2xvcHB5X2tleXMgICBkaXNhYmxlIC1zbG9wcHlfa2V5cyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9kdXBzICAgICAgIGVuYWJsZSAgLXNraXBfZHVwcyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9za2lwX2R1cHMgICAgIGRpc2FibGUgLXNraXBfZHVwcyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWRkX2tleXN5bXMgICAgIGVuYWJsZSAtYWRkX2tleXN5bXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vYWRkX2tleXN5bXMgICBzdG9wIGFkZGluZyBrZXlzeW1zLiB0aG9zZSBhZGRlZCB3aWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgYmUgcmVtb3ZlZCBhdCBleGl0LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfbW9kcyAgICAgIGVuYWJsZSAgLWNsZWFyX21vZHMgbW9kZSBhbmQgY2xlYXIgdGhlbS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vY2xlYXJfbW9kcyAgICBkaXNhYmxlIC1jbGVhcl9tb2RzIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9rZXlzICAgICAgZW5hYmxlICAtY2xlYXJfa2V5cyBtb2RlIGFuZCBjbGVhciB0aGVtLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jbGVhcl9rZXlzICAgIGRpc2FibGUgLWNsZWFyX2tleXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2xvY2tzICAgICBkbyB0aGUgY2xlYXJfbG9ja3MgYWN0aW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYWxsICAgICAgIGRvIHRoZSBjbGVhcl9hbGwgYWN0aW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAga2V5c3RhdGUgICAgICAgIGhhdmUgeDExdm5jIHByaW50IGN1cnJlbnQga2V5c3RhdGUuXG4iCi0vKiBmaWxlbmFtZSAqLwotIiAgICAgICAgICAgICAgICAgICAgICAgcmVtYXA6c3RyICAgICAgIHNldCAtcmVtYXAgXCJzdHJcIiAoZW1wdHkgdG8gZGlzYWJsZSkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1yZW1hcCBmb3IgdGhlIGZvcm0gb2YgXCJzdHJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHk6IGtleTEta2V5MixrZXkzLWtleTQsLi4uKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBcIitrZXkxLWtleTJcIiB0byBhcHBlbmQgYSBzaW5nbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXBwaW5nLCB1c2UgXCIta2V5MS1rZXkyXCIgdG8gZGVsZXRlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9yZXBlYXQgICAgICAgIGVuYWJsZSAgLW5vcmVwZWF0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgICAgICAgICAgZGlzYWJsZSAtbm9yZXBlYXQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZmIgICAgICAgICAgICBlbmFibGUgIC1ub2ZiIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmYiAgICAgICAgICAgICAgZGlzYWJsZSAtbm9mYiBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmVsbCAgICAgICAgICAgIGVuYWJsZSAgYmVsbCAoaWYgc3VwcG9ydGVkKS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vYmVsbCAgICAgICAgICBkaXNhYmxlIGJlbGwuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZW5kYmVsbCAgICAgICAgcmluZyB0aGUgYmVsbCBub3cuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3NlbCAgICAgICAgICAgZW5hYmxlICAtbm9zZWwgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlbCAgICAgICAgICAgICBkaXNhYmxlIC1ub3NlbCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9wcmltYXJ5ICAgICAgIGVuYWJsZSAgLW5vcHJpbWFyeSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSAgICAgICAgIGRpc2FibGUgLW5vcHJpbWFyeSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9zZXRwcmltYXJ5ICAgIGVuYWJsZSAgLW5vc2V0cHJpbWFyeSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0cHJpbWFyeSAgICAgIGRpc2FibGUgLW5vc2V0cHJpbWFyeSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jbGlwYm9hcmQgICAgIGVuYWJsZSAgLW5vY2xpcGJvYXJkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQgICAgICAgZGlzYWJsZSAtbm9jbGlwYm9hcmQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2V0Y2xpcGJvYXJkICBlbmFibGUgIC1ub3NldGNsaXBib2FyZCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2xpcGJvYXJkICAgIGRpc2FibGUgLW5vc2V0Y2xpcGJvYXJkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZWxkaXI6c3RyICAgICAgc2V0IC1zZWxkaXIgdG8gXCJzdHJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX2N1dGJ1ZmZlciByZXNlbmQgdGhlIG1vc3QgcmVjZW50IENVVEJVRkZFUjAgY29weVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX2NsaXBib2FyZCByZXNlbmQgdGhlIG1vc3QgcmVjZW50IENMSVBCT0FSRCBjb3B5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfcHJpbWFyeSAgIHJlc2VuZCB0aGUgbW9zdCByZWNlbnQgUFJJTUFSWSBjb3B5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6bW9kZSAgICAgZW5hYmxlICAtY3Vyc29yIFwibW9kZVwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jdXJzb3IgICAgIGVuYWJsZSAgc2hvd2luZyBhIGN1cnNvci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2hvd19jdXJzb3IgICBkaXNhYmxlIHNob3dpbmcgYSBjdXJzb3IuIChzYW1lIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJub2N1cnNvclwiKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yX2RyYWcgICAgIGVuYWJsZSAgY3Vyc29yIGNoYW5nZXMgZHVyaW5nIGRyYWcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2N1cnNvcl9kcmFnICAgZGlzYWJsZSBjdXJzb3IgY2hhbmdlcyBkdXJpbmcgZHJhZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFycm93Om4gICAgICAgICBzZXQgLWFycm93IHRvIGFsdGVybmF0ZSBuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGZpeGVzICAgICAgICAgIGVuYWJsZSAgeGZpeGVzIGN1cnNvciBzaGFwZSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGN1cnNvciBzaGFwZSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFjdXQ6biAgICAgIHNldCAtYWxwaGFjdXQgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFscGhhZnJhYzpmICAgICBzZXQgLWFscGhhZnJhYyB0byBmLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFyZW1vdmUgICAgIGVuYWJsZSAgLWFscGhhcmVtb3ZlIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2FscGhhcmVtb3ZlICAgZGlzYWJsZSAtYWxwaGFyZW1vdmUgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFscGhhYmxlbmQgICAgICBkaXNhYmxlIC1ub2FscGhhYmxlbmQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vYWxwaGFibGVuZCAgICBlbmFibGUgIC1ub2FscGhhYmxlbmQgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnNoYXBlICAgICBkaXNhYmxlIC1ub2N1cnNvcnNoYXBlIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2N1cnNvcnNoYXBlICAgZW5hYmxlICAtbm9jdXJzb3JzaGFwZSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29ycG9zICAgICAgIGRpc2FibGUgLW5vY3Vyc29ycG9zIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2N1cnNvcnBvcyAgICAgZW5hYmxlICAtbm9jdXJzb3Jwb3MgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHh3YXJwICAgICAgICAgICBlbmFibGUgIC14d2FycHBvaW50ZXIgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5veHdhcnAgICAgICAgICBkaXNhYmxlIC14d2FycHBvaW50ZXIgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c19pbmplY3QgICBlbmFibGUgIC1hbHdheXNfaW5qZWN0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2Fsd2F5c19pbmplY3QgZGlzYWJsZSAtYWx3YXlzX2luamVjdCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ubWFwOnN0ciAgIHNldCAtYnV0dG9ubWFwIFwic3RyXCIsIGVtcHR5IHRvIGRpc2FibGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nICAgICAgICBkaXNhYmxlIC1ub2RyYWdnaW5nIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RyYWdnaW5nICAgICAgZW5hYmxlICAtbm9kcmFnZ2luZyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlICAgICAgICAgIHJlZW5hYmxlIC1uY2FjaGUgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlICAgICAgICBkaXNhYmxlICAtbmNhY2hlIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfc2l6ZTpuICAgc2V0IC1uY2FjaGUgc2l6ZSB0byBuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX2NyICAgICAgIGVuYWJsZSAgLW5jYWNoZV9jciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfY3IgICAgIGRpc2FibGUgLW5jYWNoZV9jciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX25vX21vdmVyYWlzZSAgICAgZW5hYmxlICBub19tb3ZlcmFpc2UgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX25vX21vdmVyYWlzZSAgIGRpc2FibGUgbm9fbW92ZXJhaXNlIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fZHRjaGFuZ2UgICAgICBlbmFibGUgIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfbm9fZHRjaGFuZ2UgICAgZGlzYWJsZSBuY2FjaGVfbm9fZHRjaGFuZ2UgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9vbGRfd20gICAgICAgICAgIGVuYWJsZSAgbmNhY2hlX29sZF93bSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfb2xkX3dtICAgICAgICAgZGlzYWJsZSBuY2FjaGVfb2xkX3dtIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fcm9vdHBpeG1hcCAgICBlbmFibGUgIG5jYWNoZV9ub19yb290cGl4bWFwLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfbm9fcm9vdHBpeG1hcCAgZGlzYWJsZSBuY2FjaGVfbm9fcm9vdHBpeG1hcC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9yZXNldF9yb290cGl4bWFwIHJlY2hlY2sgdGhlIHJvb3QgcGl4bWFwLCBuY3JwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfa2VlcF9hbmltcyAgICAgICBlbmFibGUgIG5jYWNoZV9rZWVwX2FuaW1zLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfa2VlcF9hbmltcyAgICAgZGlzYWJsZSBuY2FjaGVfa2VlcF9hbmltcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9wYWQ6biAgICBzZXQgLW5jYWNoZV9wYWQgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZSAgICAgICBlbmFibGUgIC13aXJlZnJhbWUgbW9kZS4gc2FtZSBhcyBcIndmXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vd2lyZWZyYW1lICAgICBkaXNhYmxlIC13aXJlZnJhbWUgbW9kZS4gc2FtZSBhcyBcIm5vd2ZcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1lOnN0ciAgIGVuYWJsZSAgLXdpcmVmcmFtZSBtb2RlIHN0cmluZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZV9tb2RlOnN0ciBlbmFibGUgIC13aXJlZnJhbWUgbW9kZSBzdHJpbmcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWVsb2NhbCAgZW5hYmxlICB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyBcIndmbFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3dpcmVmcmFtZSAgICAgZGlzYWJsZSB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyBcIm5vd2ZsXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVjb3B5cmVjdDpzdHIgc2V0IC13aXJlY29weXJlY3Qgc3RyaW5nLiBzYW1lIGFzIFwid2NyOlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxjb3B5cmVjdDpzdHIgc2V0IC1zY3JvbGxjb3B5cmVjdCBzdHJpbmcuIHNhbWUgXCJzY3JcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9zY3JvbGxjb3B5cmVjdCBkaXNhYmxlIC1zY3JvbGxjb3B5cmVjdCBtb2RlLiBcIm5vc2NyXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcl9hcmVhOm4gICAgICBzZXQgLXNjcl9hcmVhIHRvIG5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcl9za2lwOmxpc3QgICBzZXQgLXNjcl9za2lwIHRvIFwibGlzdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JfaW5jOmxpc3QgICAgc2V0IC1zY3JfaW5jIHRvIFwibGlzdFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3Jfa2V5czpsaXN0ICAgc2V0IC1zY3Jfa2V5cyB0byBcImxpc3RcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Rlcm06bGlzdCAgIHNldCAtc2NyX3Rlcm0gdG8gXCJsaXN0XCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcl9rZXlyZXBlYXQ6c3RyIHNldCAtc2NyX2tleXJlcGVhdCB0byBcInN0clwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY3JfcGFybXM6c3RyICAgc2V0IC1zY3JfcGFybXMgcGFyYW1ldGVycy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZpeHNjcmVlbjpzdHIgICBzZXQgLWZpeHNjcmVlbiB0byBcInN0clwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94cmVjb3JkICAgICAgIGRpc2FibGUgYWxsIHVzZSBvZiBSRUNPUkQgZXh0ZW5zaW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeHJlY29yZCAgICAgICAgIGVuYWJsZSAgdXNlIG9mIFJFQ09SRCBleHRlbnNpb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yZWNvcmQgICAgcmVzZXQgUkVDT1JEIGV4dGVuc2lvbiAoaWYgYXZhaWwuKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tb2RlOm4gIHNldCAtcG9pbnRlcl9tb2RlIHRvIG4uIHNhbWUgYXMgXCJwbVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9za2lwOm4gICAgc2V0IC1pbnB1dF9za2lwIHRvIG4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbGxpbnB1dCAgICAgICAgZW5hYmxlICB1c2Ugb2YgLWFsbGlucHV0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2FsbGlucHV0ICAgICAgZGlzYWJsZSB1c2Ugb2YgLWFsbGlucHV0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lYWdlcmx5ICAgZW5hYmxlICB1c2Ugb2YgLWlucHV0X2VhZ2VybHkgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vaW5wdXRfZWFnZXJseSBkaXNhYmxlIHVzZSBvZiAtaW5wdXRfZWFnZXJseSBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3NsdGltZW91dDpuICAgIHNldCAtc3NsdGltZW91dCB0byBuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRzOnN0ciAgICAgIHNldCAtc3BlZWRzIHRvIHN0ci5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdtZHQ6c3RyICAgICAgICBzZXQgLXdtZHQgdG8gc3RyLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfcG9pbnRlciAgIGVuYWJsZSAgLWRlYnVnX3BvaW50ZXIsIHNhbWUgYXMgXCJkcFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3BvaW50ZXIgZGlzYWJsZSAtZGVidWdfcG9pbnRlciwgc2FtZSBhcyBcIm5vZHBcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfa2V5Ym9hcmQgICBlbmFibGUgIC1kZWJ1Z19rZXlib2FyZCwgc2FtZSBhcyBcImRrXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfa2V5Ym9hcmQgZGlzYWJsZSAtZGVidWdfa2V5Ym9hcmQsIHNhbWUgYXMgXCJub2RrXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGU6biAgICAgICBpbmplY3Qga2V5c3Ryb2tlICdrZXljb2RlJyAoeG1vZG1hcCAtcGspXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXljb2RlOm4sZG93biAgaW5qZWN0ICdrZXljb2RlJyAoZG93bj0wLDEpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW06c3RyICAgICAgaW5qZWN0IGtleXN0cm9rZSAna2V5c3ltJyAobnVtYmVyL25hbWUpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW06c3RyLGRvd24gaW5qZWN0ICdrZXlzeW0nIChkb3duPTAsMSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHB0cjp4LHksbWFzayAgICBpbmplY3QgcG9pbnRlciBldmVudCB4LCB5LCBidXR0b24tbWFza1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmFrZWJ1dHRvbmV2ZW50OmJ1dHRvbixkb3duIGRpcmVjdCBYVGVzdEZha2VCdXR0b25FdmVudC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwOnQgICAgICAgICBzbGVlcCBmbG9hdGluZyBwb2ludCB0aW1lIHQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBnZXRfeHByb3A6cCAgICAgZ2V0IFggcHJvcGVydHkgbmFtZWQgJ3AnLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0X3hwcm9wOnA6dmFsIHNldCBYIHByb3BlcnR5IG5hbWVkICdwJyB0byAndmFsJy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIC0+IGlkPU5OTjpwIGZvciBoZXgvZGVjIHdpbmRvdyBpZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbmluZm86aWQgICAgICBnZXQgaW5mbyBhYm91dCBYIHdpbmRvdyBpZC4gIHVzZSAncm9vdCdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igcm9vdCB3aW5kb3csIHVzZSAraWQgZm9yIGNoaWxkcmVuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYl9zdGF0ZSAgICAgIGdldCBzdGF0ZSBvZiBwb2ludGVyIGFuZCBrZXlib2FyZCBncmFiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9wb3MgICAgIHByaW50IFhRdWVyeVBvaW50ZXIgeCx5IGN1cnNvciBwb3NpdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfeCAgICAgICBwcmludCBYUXVlcnlQb2ludGVyIHggY3Vyc29yIHBvc2l0aW9uLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl95ICAgICAgIHByaW50IFhRdWVyeVBvaW50ZXIgeSBjdXJzb3IgcG9zaXRpb24uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3NhbWUgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciBwdHIgb24gc2FtZSBzY3JlZW4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3Jvb3QgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciBjdXJyIHB0ciByb290d2luLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tYXNrICAgIHByaW50IFhRdWVyeVBvaW50ZXIgYnV0dG9uIGFuZCBtb2RzIG1hc2tcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlX3ggICAgICAgICBwcmludCB4MTF2bmMncyBpZGVhIG9mIGN1cnNvciBwb3NpdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlX3kgICAgICAgICBwcmludCB4MTF2bmMncyBpZGVhIG9mIGN1cnNvciBwb3NpdGlvbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vb3AgICAgICAgICAgICBkbyBub3RoaW5nLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVmZXI6biAgICAgICAgIHNldCAtZGVmZXIgdG8gbiBtcyxzYW1lIGFzIGRlZmVydXBkYXRlOm5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdhaXQ6biAgICAgICAgICBzZXQgLXdhaXQgdG8gbiBtcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2ZidXI6biAgICBzZXQgLWV4dHJhX2ZidXIgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfdWk6ZiAgICAgICBzZXQgLXdhaXRfdWkgZmFjdG9yIHRvIGYuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXRkZWZlcjpuICAgICAgc2V0IC1zZXRkZWZlciB0byAtMiwtMSwwLDEsIG9yIDIuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2JvZyAgICAgICAgZGlzYWJsZSAtbm93YWl0X2JvZyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm93YWl0X2JvZyAgICAgIGVuYWJsZSAgLW5vd2FpdF9ib2cgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsb3dfZmI6ZiAgICAgICBzZXQgLXNsb3dfZmIgdG8gZiBzZWNvbmRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeHJlZnJlc2g6ZiAgICAgIHNldCAteHJlZnJlc2ggdG8gZiBzZWNvbmRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVhZHRpbWVvdXQ6biAgIHNldCByZWFkIHRpbWVvdXQgdG8gbiBzZWNvbmRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmFwICAgICAgICAgICAgIGVuYWJsZSAgLW5hcCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uYXAgICAgICAgICAgIGRpc2FibGUgLW5hcCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2I6biAgICAgICAgICAgIHNldCAtc2IgdG8gbiBzLCBzYW1lIGFzIHNjcmVlbl9ibGFuazpuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmYnBtICAgICAgICAgICAgZGlzYWJsZSAtbm9mYnBtIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2ZicG0gICAgICAgICAgZW5hYmxlICAtbm9mYnBtIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkcG1zICAgICAgICAgICAgZGlzYWJsZSAtbm9kcG1zIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RwbXMgICAgICAgICAgZW5hYmxlICAtbm9kcG1zIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWRwbXMgICAgICAgZW5hYmxlICAtZm9yY2VkcG1zIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2ZvcmNlZHBtcyAgICAgZGlzYWJsZSAtZm9yY2VkcG1zIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRkcG1zICAgICAgZW5hYmxlICAtY2xpZW50ZHBtcyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jbGllbnRkcG1zICAgIGRpc2FibGUgLWNsaWVudGRwbXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2VydmVyZHBtcyAgICBlbmFibGUgIC1ub3NlcnZlcmRwbXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcmRwbXMgICAgICBkaXNhYmxlIC1ub3NlcnZlcmRwbXMgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdWx0cmFleHQgICAgICBlbmFibGUgIC1ub3VsdHJhZXh0IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1bHRyYWV4dCAgICAgICAgZGlzYWJsZSAtbm91bHRyYWV4dCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhdHdpbmRvdyAgICAgIGVuYWJsZSAgbG9jYWwgY2hhdHdpbmRvdyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jaGF0d2luZG93ICAgIGRpc2FibGUgbG9jYWwgY2hhdHdpbmRvdyBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhdG9uICAgICAgICAgIGJlZ2luIGNoYXQgdXNpbmcgbG9jYWwgd2luZG93LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhdG9mZiAgICAgICAgIGVuZCAgIGNoYXQgdXNpbmcgbG9jYWwgd2luZG93LlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGRhbWFnZSAgICAgICAgIGVuYWJsZSAgeGRhbWFnZSBwb2xsaW5nIGhpbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm94ZGFtYWdlICAgICAgIGRpc2FibGUgeGRhbWFnZSBwb2xsaW5nIGhpbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGRfYXJlYTpBICAgICAgIHNldCAteGRfYXJlYSBtYXggcGl4ZWwgYXJlYSB0byBcIkFcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeGRfbWVtOmYgICAgICAgIHNldCAteGRfbWVtIHJlbWVtYnJhbmNlIHRvIFwiZlwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmczpmcmFjICAgICAgICAgc2V0IC1mcyBmcmFjdGlvbiB0byBcImZyYWNcIiwgZS5nLiAwLjVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdhcHM6biAgICAgICAgICBzZXQgLWdhcHMgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyb3c6biAgICAgICAgICBzZXQgLWdyb3cgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZ1eno6biAgICAgICAgICBzZXQgLWZ1enogdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNuYXBmYiAgICAgICAgICBlbmFibGUgIC1zbmFwZmIgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc25hcGZiICAgICAgICBkaXNhYmxlIC1zbmFwZmIgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiOnN0ciAgICAgICBzZXQgLXJhd2ZiIG1vZGUgdG8gXCJzdHJcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF9hY2NlbDpmICBzZXQgdWlucHV0X2FjY2VsIHRvIGYuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXRfdGhyZXNoOm4gc2V0IHVpbnB1dF90aHJlc2ggdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF9yZXNldDpuICBzZXQgdWlucHV0X3Jlc2V0IHRvIG4gbXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXRfYWx3YXlzOm4gc2V0IHVpbnB1dF9hbHdheXMgdG8gMS8wLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NpdmU6biAgIHNldCBMaWJWTkNTZXJ2ZXIgLXByb2dyZXNzaXZlIHNsaWNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IHBhcmFtZXRlciB0byBuLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVza3RvcDpzdHIgICAgIHNldCAtZGVza3RvcCBuYW1lIHRvIHN0ciBmb3IgbmV3IGNsaWVudHMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByZmJwb3J0Om4gICAgICAgc2V0IC1yZmJwb3J0IHRvIG4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNub3NhdmVyICAgICAgZW5hYmxlICAtbWFjbm9zYXZlciBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjc2F2ZXIgICAgICAgIGRpc2FibGUgLW1hY25vc2F2ZXIgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hY25vd2FpdCAgICAgICBlbmFibGUgIC1tYWNub3dhaXQgIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWN3YWl0ICAgICAgICAgZGlzYWJsZSAtbWFjbm93YWl0ICBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjd2hlZWw6biAgICAgIHNldCAtbWFjd2hlZWwgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hY25vc3dhcCAgICAgICBlbmFibGUgIC1tYWNub3N3YXAgbW91c2UgYnV0dG9uIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNzd2FwICAgICAgICAgZGlzYWJsZSAtbWFjbm9zd2FwIG1vdXNlIGJ1dHRvbiBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjbm9yZXNpemUgICAgIGVuYWJsZSAgLW1hY25vcmVzaXplIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNyZXNpemUgICAgICAgZGlzYWJsZSAtbWFjbm9yZXNpemUgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hY2ljb25hbmltOm4gICBzZXQgLW1hY2ljb25hbmltIHRvIG4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNtZW51ICAgICAgICAgZW5hYmxlICAtbWFjbWVudSAgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG1hY25vbWVudSAgICAgICBkaXNhYmxlIC1tYWNtZW51ICBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbWFjdXNrYmQgICAgICAgIGVuYWJsZSAgLW1hY3Vza2JkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNub3Vza2JkICAgICAgZGlzYWJsZSAtbWFjdXNrYmQgbW9kZS5cbiIKLS8qIGFjY2VzcyAqLwotIiAgICAgICAgICAgICAgICAgICAgICAgaHR0cHBvcnQ6biAgICAgIHNldCAtaHR0cHBvcnQgdG8gbi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGh0dHBkaXI6ZGlyICAgICBzZXQgLWh0dHBkaXIgdG8gZGlyIChhbmQgZW5hYmxlIGh0dHApLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlaHR0cHByb3h5ICAgZW5hYmxlICAtZW5hYmxlaHR0cHByb3h5IG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2VuYWJsZWh0dHBwcm94eSBkaXNhYmxlIC1lbmFibGVodHRwcHJveHkgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c3NoYXJlZCAgICAgZW5hYmxlICAtYWx3YXlzc2hhcmVkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2Fsd2F5c3NoYXJlZCAgIGRpc2FibGUgLWFsd2F5c3NoYXJlZCBtb2RlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5IGludGVyZmVyZSB3aXRoIG90aGVyIG9wdGlvbnMpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuZXZlcnNoYXJlZCAgICAgIGVuYWJsZSAgLW5ldmVyc2hhcmVkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub25ldmVyc2hhcmVkICAgIGRpc2FibGUgLW5ldmVyc2hhcmVkIG1vZGUuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXkgaW50ZXJmZXJlIHdpdGggb3RoZXIgb3B0aW9ucylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRvbnRkaXNjb25uZWN0ICAgZW5hYmxlICAtZG9udGRpc2Nvbm5lY3QgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZG9udGRpc2Nvbm5lY3QgZGlzYWJsZSAtZG9udGRpc2Nvbm5lY3QgbW9kZS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heSBpbnRlcmZlcmUgd2l0aCBvdGhlciBvcHRpb25zKVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfeGV2ZW50cyAgIGVuYWJsZSAgZGVidWdnaW5nIFggZXZlbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z194ZXZlbnRzIGRpc2FibGUgZGVidWdnaW5nIFggZXZlbnRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfeGRhbWFnZSAgIGVuYWJsZSAgZGVidWdnaW5nIFggREFNQUdFIG1lY2hhbmlzbS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfeGRhbWFnZSBkaXNhYmxlIGRlYnVnZ2luZyBYIERBTUFHRSBtZWNoYW5pc20uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z193aXJlZnJhbWUgZW5hYmxlICAgZGVidWdnaW5nIHdpcmVmcmFtZSBtZWNoYW5pc20uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3dpcmVmcmFtZSBkaXNhYmxlIGRlYnVnZ2luZyB3aXJlZnJhbWUgbWVjaGFuaXNtLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc2Nyb2xsICAgIGVuYWJsZSAgZGVidWdnaW5nIHNjcm9sbGNvcHkgbWVjaGFuaXNtLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19zY3JvbGwgIGRpc2FibGUgZGVidWdnaW5nIHNjcm9sbGNvcHkgbWVjaGFuaXNtLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfdGlsZXMgICAgIGVuYWJsZSAgLWRlYnVnX3RpbGVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3RpbGVzICAgZGlzYWJsZSAtZGVidWdfdGlsZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2dyYWJzICAgICBlbmFibGUgIC1kZWJ1Z19ncmFic1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19ncmFicyAgIGRpc2FibGUgLWRlYnVnX2dyYWJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zZWwgICAgICAgZW5hYmxlICAtZGVidWdfc2VsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3NlbCAgICAgZGlzYWJsZSAtZGVidWdfc2VsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19uY2FjaGUgICAgZW5hYmxlICAtZGVidWdfbmNhY2hlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX25jYWNoZSAgZGlzYWJsZSAtZGVidWdfbmNhY2hlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkYmcgICAgICAgICAgICAgZW5hYmxlICAtZGJnIGNyYXNoIHNoZWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RiZyAgICAgICAgICAgZGlzYWJsZSAtZGJnIGNyYXNoIHNoZWxsXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3JlbW90ZSAgICAgICAgZGlzYWJsZSB0aGUgLXJlbW90ZSBjb21tYW5kIHByb2Nlc3NpbmcsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGJlIHR1cm5lZCBiYWNrIG9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYmN4X3hhdHRhY2g6c3RyICBUaGlzIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgaXMgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2Ugd2l0aCB0aGUgQkFSQ08geGF0dGFjaCBwcm9ncmFtIG9yIHRoZSB4MnggcHJvZ3JhbS5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgcHJvZ3JhbXMgYXJlIGZvciAncG9pbnRlciBhbmQga2V5Ym9hcmQnXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nIGJldHdlZW4gc2VwYXJhdGUgWCBkaXNwbGF5cy4gIEluIGdlbmVyYWwgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0d28gZGlzcGxheXMgYXJlIHVzdWFsbHkgbmVhcmJ5LCBlLmcuIG9uIHRoZSBzYW1lIGRlc2ssXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gc2hhcmUgYSBzaW5nbGUgcG9pbnRlciBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleWJvYXJkIGJldHdlZW4gdGhlbS4gIFRoZSB1c2VyIG1vdmVzIHRoZSBtb3VzZSB0b1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW4gZWRnZSBhbmQgdGhlbiB0aGUgbW91c2UgcG9pbnRlciBhcHBlYXJzIHRvICdqdW1wJ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG90aGVyIGRpc3BsYXkgc2NyZWVuLiAgVGh1cyBpdCBlbXVsYXRlcyB3aGF0IGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBYIHNlcnZlciB3b3VsZCBkbyBmb3IgdHdvIHNjcmVlbnMgKGUuZy4gOjAuMCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDowLjEpIFRoZSBpbGx1c2lvbiBvZiBhIHNpbmdsZSBYc2VydmVyIHdpdGggbXVsdGlwbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbnMgaXMgYWNoaWV2ZWQgYnkgZm9yd2FyZGluZyBldmVudHMgdG8gdGhlIDJuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb25lIHZpYSB0aGUgWFRFU1QgZXh0ZW5zaW9uLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgV2hhdCB0aGUgeDExdm5jIGJjeF94YXR0YWNoIGNvbW1hbmQgZG9lcyBpcyB0byBwZXJmb3JtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzb21lIHBvaW50ZXIgbW92ZW1lbnRzIHRvIHRyeSB0byBJTkRVQ0UgeGF0dGFjaC94MnhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvICdqdW1wJyB0byB0aGUgb3RoZXIgZGlzcGxheS4gIEluIHdoYXQgZm9sbG93cyB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICdtYXN0ZXInIGRpc3BsYXkgcmVmZXJzIHRvIHRoZSBvbmUgdGhhdCB3aGVuIGl0IGhhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgJ2ZvY3VzJyBpdCBpcyBiYXNpY2FsbHkgZG9pbmcgbm90aGluZyBiZXNpZGVzIHdhdGNoaW5nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1vdXNlIHRvIGdvIG92ZXIgYW4gZWRnZS4gIFRoZSAnc2xhdmUnXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHJlZmVycyB0byB0aGUgb25lIHRvIHdoaWNoIHRoZSBtb3VzZSBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGtleWJvYXJkIGlzIHJlZGlyZWN0ZWQgdG8gb25jZSBhbiBlZGdlIGluIHRoZSBtYXN0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGNyb3NzZWQuICBOb3RlIHRoYXQgdGhlIHgxMXZuYyBleGVjdXRpbmcgdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiY3hfeGF0dGFjaCBjb21tYW5kIE1VU1QgYmUgdGhlIG9uZSBjb25uZWN0ZWQgdG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAqbWFzdGVyKiBkaXNwbGF5LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgQWxzbyBub3RlIHRoYXQgd2hlbiBpbnB1dCBpcyBiZWluZyByZWRpcmVjdGVkICh2aWFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFhURVNUKSBmcm9tIHRoZSBtYXN0ZXIgZGlzcGxheSB0byB0aGUgc2xhdmUgZGlzcGxheSxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIgZGlzcGxheSdzIHBvaW50ZXIgYW5kIGtleWJvYXJkIGFyZSAqZ3JhYmJlZCpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ5IHhhdHRhY2gveDJ4LiAgeDExdm5jIGNhbiB1c2UgdGhpcyBpbmZvIHRvIHZlcmlmeSB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyL3NsYXZlIG1vZGUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZSBjb3JyZWN0bHkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgXCJpZm5lZWRlZFwiIG9wdGlvbiAoc2VlIGJlbG93KVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgaXMgdGhhdCBvZiB0aGUgZGVzaXJlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgc3RhdGUsIHRoZW4gbm8gcG9pbnRlciBtb3ZlbWVudHMgYXJlIGluamVjdGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbmQgXCJET05FLEdSQUJfT0tcIiBpcyByZXR1cm5lZC5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic3RyXCIgbXVzdCBjb250YWluIG9uZSBvZiBcInVwXCIsIFwiZG93blwiLCBcImxlZnRcIixcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9yIFwicmlnaHRcIiB0byBpbmRpY2F0ZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSAnanVtcCcuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcInN0clwiIG11c3QgYWxzbyBjb250YWluIG9uZSBvZiBcIm1hc3Rlcl90b19zbGF2ZVwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciBcInNsYXZlX3RvX21hc3RlclwiIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIG1vZGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSBpbmR1Y2VkIGJ5IHRoZSBqdW1wLiAgVXNlIFwiTTJTXCIgYW5kIFwiUzJNXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzIHNob3J0ZXIgYWxpYXNlcy5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwic3RyXCIgbWF5IGJlIGEgXCIrXCIgc2VwYXJhdGVkIGxpc3Qgb2YgYWRkaXRpb25hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdHVuaW5nIG9wdGlvbnMuICBUaGUgXCJzaGlmdD1uXCIgb3B0aW9uIGluZGljYXRlcyBhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IHNoaWZ0IHBvc2l0aW9uIGF3YXkgZnJvbSAoMCwwKSAoZGVmYXVsdCAyMCkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImZpbmFsPXgreVwiIHNwZWNpZmllcyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIGN1cnNvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIG1vdmUgc2VxdWVuY2U7IGRlZmF1bHQgMzArMzAuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBcImV4dHJhX21vdmU9eCt5XCIgbWVhbnMgdG8gZG8gb25lIG1vcmUgcG9pbnRlciBtb3ZlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBcImZpbmFsXCIgdG8geCt5LiAgXCJkdD1uXCIgc2V0cyB0aGUgc2xlZXAgdGltZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9pbnRlciBtb3ZlcyAoZGVmYXVsdDogNDBtcylcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwicmV0cnk9blwiIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBpZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdyYWIgc3RhdGUgY2hhbmdlIGZhaWxzLiBcImlmbmVlZGVkXCIgbWVhbnMgdG8gbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcHBseSB0aGUgcG9pbnRlciBtb3ZlbWVudHMgaWYgdGhlIGluaXRpYWwgZ3JhYiBzdGF0ZSBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBvZiB0aGUgZGVzaXJlZCBmaW5hbCBzdGF0ZS4gXCJub2dyYWJjaGVja1wiIG1lYW5zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byBub3QgY2hlY2sgaWYgdGhlIGdyYWIgc3RhdGUgY2hhbmdlZCBhcyBleHBlY3RlZCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYXBwbHkgdGhlIHBvaW50ZXIgbW92ZW1lbnRzIChkZWZhdWx0IGlzIHRvIGNoZWNrXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ3JhYiBzdGF0ZXMuKVxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IFwidXBcIiwgZXRjLiwgdG8gYmN4X3hhdHRhY2hcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdGhpbmcgd2lsbCBiZSBhdHRlbXB0ZWQgYW5kIHRoZSBjb21tYW5kIHJldHVybnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJpbmcgRkFJTCxOT19ESVJFQ1RJT05fU1BFQ0lGSUVELiAgSWYgeW91IGRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3BlY2lmeSBcIm1hc3Rlcl90b19zbGF2ZVwiIG9yIFwiTTJTXCIsIGV0Yy4sIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiY3hfeGF0dGFjaCBub3RoaW5nIHdpbGwgYmUgYXR0ZW1wdGVkIGFuZCB0aGUgY29tbWFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgc3RyaW5nIEZBSUwsTk9fTU9ERV9DSEFOR0VfU1BFQ0lGSUVELlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgY29udGFpbiBcIkRPTkVcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgXCJET05FLEdSQUJfT0tcIiBpZiB0aGUgZ3JhYiBzdGF0ZSBjaGFuZ2VkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhcyBleHBlY3RlZCAob3IgaWYgXCJpZm5lZWRlZFwiIHdhcyBzdXBwbGllZCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgd2FzIGFscmVhZHkgdGhlIGRlc2lyZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uZS4pICBJZiB0aGUgaW5pdGlhbCBncmFiIHN0YXRlIHdhcyBpbmNvcnJlY3QsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIGZpbmFsIGdyYWIgc3RhdGUgd2FzIGNvcnJlY3QgdGhlbiBpdCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgXCJET05FLEdSQUJfRkFJTF9JTklUXCIuICBJZiB0aGUgaW5pdGlhbCBncmFiIHN0YXRlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3YXMgY29ycmVjdCwgYnV0IHRoZSBmaW5hbCBncmFiIHN0YXRlIHdhcyBpbmNvcnJlY3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgXCJET05FLEdSQUJfRkFJTF9GSU5BTFwiLiAgSWYgYm90aCBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdCBpdCB3aWxsIGJlIFwiRE9ORSxHUkFCX0ZBSUxcIi4gIFVuZGVyIGdyYWJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgdGhlIHN0cmluZyB3aWxsIGJlIGZvbGxvd2VkIGJ5IFwiOnAxLGsxLXAyLGsyXCJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlICBwMSxrMSBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgcG9pbnRlciBhbmQga2V5Ym9hcmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdyYWIgc3RhdGVzIGFuZCBwMixrMiB0aGUgZmluYWwgb25lcy4gSWYgR1JBQl9GQUlMIG9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBHUkFCX0ZBSUxfRklOQUwgb2NjdXJzLCB0aGUgYWN0aW9uIHdpbGwgYmUgcmV0cmllZCB1cFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gMyB0aW1lczsgdHJ5aW5nIHRvIHJlc2V0IHRoZSBzdGF0ZSBhbmQgc2xlZXBpbmcgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYml0IGJldHdlZW4gZWFjaCB0cnkuICBTZXQgcmV0cnk9biB0byBhZGp1c3QgdGhlIG51bWJlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb2YgcmV0cmllcywgemVybyB0byBkaXNhYmxlIHJldHJpZXMuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczpcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAtUiBiY3hfeGF0dGFjaDpkb3duK00yU1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1SIGJjeF94YXR0YWNoOnVwK1MyTVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1SIGJjeF94YXR0YWNoOnVwK1MyTStub2dyYWJjaGVjaytkdD0zMFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1SIGJjeF94YXR0YWNoOmRvd24rTTJTK2V4dHJhX21vdmU9MTAwKzEwMFxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3IgdXNlIC1RIGluc3RlYWQgb2YgLVIgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCB0ZXh0LlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBiY3hfeGF0dGFjaDpzdHIgZGVzY3JpcHRpb24uXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgdm5jY29ubmVjdCgxKSBjb21tYW5kIGZyb20gc3RhbmRhcmQgVk5DXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zIG1heSBhbHNvIGJlIHVzZWQgaWYgc3RyaW5nIGlzIHByZWZpeGVkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFwiY21kPVwiIEUuZy4gJ3ZuY2Nvbm5lY3QgY21kPXN0b3AnLiAgVW5kZXIgc29tZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2lyY3Vtc3RhbmNlcyB4cHJvcCgxKSBjYW4gdXNlZCBpZiBpdCBzdXBwb3J0cyAtc2V0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSBGQVEpLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgXCItY29ubmVjdCAvcGF0aC90by9maWxlXCIgaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIgdGhlbiB0aGF0IGZpbGUgY2FuIGJlIHVzZWQgYXMgYVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBjaGFubmVsICh0aGlzIGlzIHRoZSBvbmx5IHdheSB0byByZW1vdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgb25lIG9mIG1hbnkgeDExdm5jJ3MgcG9sbGluZyB0aGUgc2FtZSBYIGRpc3BsYXkpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTaW1wbHkgcnVuOiAneDExdm5jIC1jb25uZWN0IC9wYXRoL3RvL2ZpbGUgLXJlbW90ZSAuLi4nXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvciB5b3UgY2FuIGRpcmVjdGx5IHdyaXRlIHRvIHRoZSBmaWxlIHZpYSBzb21ldGhpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGxpa2U6IFwiZWNobyBjbWQ9c3RvcCA+IC9wYXRoL3RvL2ZpbGVcIiwgZXRjLlxuIgotIlxuIgotIi1xdWVyeSB2YXJpYWJsZSAgICAgICAgTGlrZSAtcmVtb3RlLCBleGNlcHQganVzdCBxdWVyeSB0aGUgdmFsdWUgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIFwidmFyaWFibGVcIi4gIFwiLVFcIiBpcyBhbiBhbGlhcyBmb3IgXCItcXVlcnlcIi5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIHF1ZXJpZXMgY2FuIGJlIGRvbmUgYnkgc2VwYXJhdGluZyB2YXJpYWJsZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJ5IGNvbW1hcywgZS5nLiAtcXVlcnkgdmFyMSx2YXIyLiBUaGUgcmVzdWx0cyBjb21lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBiYWNrIGluIHRoZSBmb3JtIGFucz12YXIxOnZhbHVlMSxhbnM9dmFyMjp2YWx1ZTIsLi4uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgSWYgYSB2YXJpYWJsZSBpcyByZWFkLW9ubHksXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpdCBjb21lcyBiYWNrIHdpdGggcHJlZml4IFwiYXJvPVwiIGluc3RlYWQgb2YgXCJhbnM9XCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBTb21lIC1yZW1vdGUgY29tbWFuZHMgYXJlIHB1cmUgYWN0aW9ucyB0aGF0IGRvIG5vdCBtYWtlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZW5zZSBhcyB2YXJpYWJsZXMsIGUuZy4gXCJzdG9wXCIgb3IgXCJkaXNjb25uZWN0XCIsIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGVzZSBjYXNlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgXCJOL0FcIi4gIFRvIGRpcmVjdCBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBzdHJhaWdodCB0byB0aGUgWDExVk5DX1JFTU9URSBwcm9wZXJ0eSBvciBjb25uZWN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHVzZSBcInFyeT0uLi5cIiBpbnN0ZWFkIG9mIFwiY21kPS4uLlwiXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBhbnM9IHN0b3AgcXVpdCBleGl0IHNodXRkb3duIHBpbmcgcmVzZW5kX2N1dGJ1ZmZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX2NsaXBib2FyZCByZXNlbmRfcHJpbWFyeSBibGFja2VuIHplcm8gcmVmcmVzaFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgY2xvc2UgZGlzY29ubmVjdCBpZF9jbWQgaWQgc2lkIHdhaXRtYXBwZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vd2FpdG1hcHBlZCBjbGlwIGZsYXNoY21hcCBub2ZsYXNoY21hcCBzaGlmdGNtYXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRydWVjb2xvciBub3RydWVjb2xvciBvdmVybGF5IG5vb3ZlcmxheSBvdmVybGF5X2N1cnNvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheV95ZXNjdXJzb3Igbm9vdmVybGF5X25vY3Vyc29yIG5vb3ZlcmxheV9jdXJzb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vb3ZlcmxheV95ZXNjdXJzb3Igb3ZlcmxheV9ub2N1cnNvciA4dG8yNCBubzh0bzI0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICA4dG8yNF9vcHRzIDI0dG8zMiBubzI0dG8zMiB2aXN1YWwgc2NhbGUgc2NhbGVfY3Vyc29yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB2aWV3b25seSBub3ZpZXdvbmx5IHNoYXJlZCBub3NoYXJlZCBmb3JldmVyIG5vZm9yZXZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb25jZSB0aW1lb3V0IHRpZ2h0ZmlsZXhmZXIgbm90aWdodGZpbGV4ZmVyIHVsdHJhZmlsZXhmZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vdWx0cmFmaWxleGZlciByZmJ2ZXJzaW9uIGRlbnkgbG9jayBub2RlbnkgdW5sb2NrIGF2YWhpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtZG5zIHplcm9jb25mIG5vYXZhaGkgbm9tZG5zIG5vemVyb2NvbmYgY29ubmVjdCBwcm94eVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dvbmNlIGFsbG93IG5vaXB2NiBpcHY2IG5vaXB2NCBpcHY0IG5vNiA2IGxvY2FsaG9zdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9sb2NhbGhvc3QgbGlzdGVuIGxvb2t1cCBub2xvb2t1cCBhY2NlcHQgYWZ0ZXJhY2NlcHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGdvbmUgc2htIG5vc2htIGZsaXBieXRlb3JkZXIgbm9mbGlwYnl0ZW9yZGVyIG9uZXRpbGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vb25ldGlsZSBzb2xpZF9jb2xvciBzb2xpZCBub3NvbGlkIGJsYWNrb3V0IHhpbmVyYW1hXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3hpbmVyYW1hIHh0cmFwIG5veHRyYXAgeHJhbmRyIG5veHJhbmRyIHhyYW5kcl9tb2RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUgcGFkZ2VvbSBxdWlldCBxIG5vcXVpZXQgbW9kdHdlYWsgbm9tb2R0d2VhayB4a2JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5veGtiIGNhcHNsb2NrIG5vY2Fwc2xvY2sgc2tpcF9sb2Nra2V5cyBub3NraXBfbG9ja2tleXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNraXBfa2V5Y29kZXMgc2xvcHB5X2tleXMgbm9zbG9wcHlfa2V5cyBza2lwX2R1cHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vc2tpcF9kdXBzIGFkZF9rZXlzeW1zIG5vYWRkX2tleXN5bXMgY2xlYXJfbW9kc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9jbGVhcl9tb2RzIGNsZWFyX2tleXMgbm9jbGVhcl9rZXlzIGNsZWFyX2FsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfbG9ja3Mga2V5c3RhdGUgcmVtYXAgcmVwZWF0IG5vcmVwZWF0IGZiIG5vZmIgYmVsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9iZWxsIHNlbmRiZWxsIHNlbCBub3NlbCBwcmltYXJ5IG5vcHJpbWFyeSBzZXRwcmltYXJ5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3NldHByaW1hcnkgY2xpcGJvYXJkIG5vY2xpcGJvYXJkIHNldGNsaXBib2FyZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9zZXRjbGlwYm9hcmQgc2VsZGlyIGN1cnNvcnNoYXBlIG5vY3Vyc29yc2hhcGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnBvcyBub2N1cnNvcnBvcyBjdXJzb3JfZHJhZyBub2N1cnNvcl9kcmFnIGN1cnNvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jdXJzb3Igbm9zaG93X2N1cnNvciBub2N1cnNvciBhcnJvdyB4Zml4ZXMgbm94Zml4ZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHhkYW1hZ2Ugbm94ZGFtYWdlIHhkX2FyZWEgeGRfbWVtIGFscGhhY3V0IGFscGhhZnJhY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFyZW1vdmUgbm9hbHBoYXJlbW92ZSBhbHBoYWJsZW5kIG5vYWxwaGFibGVuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgeHdhcnBwb2ludGVyIHh3YXJwIG5veHdhcnBwb2ludGVyIG5veHdhcnAgYWx3YXlzX2luamVjdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9hbHdheXNfaW5qZWN0IGJ1dHRvbm1hcCBkcmFnZ2luZyBub2RyYWdnaW5nIG5jYWNoZV9jclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfY3IgbmNhY2hlX25vX21vdmVyYWlzZSBub25jYWNoZV9ub19tb3ZlcmFpc2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9ub19kdGNoYW5nZSBub25jYWNoZV9ub19kdGNoYW5nZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX25vX3Jvb3RwaXhtYXAgbm9uY2FjaGVfbm9fcm9vdHBpeG1hcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX3Jlc2V0X3Jvb3RwaXhtYXAgbmNycCBuY2FjaGVfa2VlcF9hbmltc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfa2VlcF9hbmltcyBuY2FjaGVfb2xkX3dtIG5vbmNhY2hlX29sZF93bVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX3BhZCBuY2FjaGUgbm9uY2FjaGUgbmNhY2hlX3NpemUgZGVidWdfbmNhY2hlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX25jYWNoZSB3aXJlZnJhbWVfbW9kZSB3aXJlZnJhbWUgd2Ygbm93aXJlZnJhbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vd2Ygd2lyZWZyYW1lbG9jYWwgd2ZsIG5vd2lyZWZyYW1lbG9jYWwgbm93ZmxcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpcmVjb3B5cmVjdCB3Y3Igbm93aXJlY29weXJlY3Qgbm93Y3Igc2NyX2FyZWFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcl9za2lwIHNjcl9pbmMgc2NyX2tleXMgc2NyX3Rlcm0gc2NyX2tleXJlcGVhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Bhcm1zIHNjcm9sbGNvcHlyZWN0IHNjciBub3Njcm9sbGNvcHlyZWN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub3NjciBmaXhzY3JlZW4gbm94cmVjb3JkIHhyZWNvcmQgcmVzZXRfcmVjb3JkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX21vZGUgcG0gaW5wdXRfc2tpcCBhbGxpbnB1dCBub2FsbGlucHV0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lYWdlcmx5IG5vaW5wdXRfZWFnZXJseSBpbnB1dCBncmFia2JkIG5vZ3JhYmtiZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYnB0ciBub2dyYWJwdHIgZ3JhYmFsd2F5cyBub2dyYWJhbHdheXMgZ3JhYmxvY2FsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaW5wdXQgc3NsdGltZW91dCBzcGVlZHMgd21kdCBkZWJ1Z19wb2ludGVyIGRwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3BvaW50ZXIgbm9kcCBkZWJ1Z19rZXlib2FyZCBkayBub2RlYnVnX2tleWJvYXJkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RrIGtleWNvZGUga2V5c3ltIHB0ciBmYWtlYnV0dG9uZXZlbnQgc2xlZXAgZ2V0X3hwcm9wXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXRfeHByb3Agd2luaW5mbyBiY3hfeGF0dGFjaCBkZWZlcnVwZGF0ZSBkZWZlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2V0ZGVmZXIgZXh0cmFfZmJ1ciB3YWl0X3VpIHdhaXRfYm9nIG5vd2FpdF9ib2dcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNsb3dfZmIgeHJlZnJlc2ggd2FpdCByZWFkdGltZW91dCBuYXAgbm9uYXAgc2JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbl9ibGFuayBmYnBtIG5vZmJwbSBkcG1zIG5vZHBtcyBjbGllbnRkcG1zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2NsaWVudGRwbXMgZm9yY2VkcG1zIG5vZm9yY2VkcG1zIG5vc2VydmVyZHBtc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyZHBtcyBub3VsdHJhZXh0IHVsdHJhZXh0IGNoYXR3aW5kb3cgbm9jaGF0d2luZG93XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjaGF0b24gY2hhdG9mZiBmcyBnYXBzIGdyb3cgZnV6eiBzbmFwZmIgbm9zbmFwZmJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiIHVpbnB1dF9hY2NlbCB1aW5wdXRfdGhyZXNoIHVpbnB1dF9yZXNldFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0X2Fsd2F5cyBwcm9ncmVzc2l2ZSByZmJwb3J0IGh0dHAgbm9odHRwIGh0dHBwb3J0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBodHRwZGlyIGVuYWJsZWh0dHBwcm94eSBub2VuYWJsZWh0dHBwcm94eSBhbHdheXNzaGFyZWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vYWx3YXlzc2hhcmVkIG5ldmVyc2hhcmVkIG5vYWx3YXlzc2hhcmVkIGRvbnRkaXNjb25uZWN0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBub2RvbnRkaXNjb25uZWN0IGRlc2t0b3AgZGVidWdfeGV2ZW50cyBub2RlYnVnX3hldmVudHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3hldmVudHMgZGVidWdfeGRhbWFnZSBub2RlYnVnX3hkYW1hZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3hkYW1hZ2UgZGVidWdfd2lyZWZyYW1lIG5vZGVidWdfd2lyZWZyYW1lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z193aXJlZnJhbWUgZGVidWdfc2Nyb2xsIG5vZGVidWdfc2Nyb2xsIGRlYnVnX3Njcm9sbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfdGlsZXMgZGJ0IG5vZGVidWdfdGlsZXMgbm9kYnQgZGVidWdfdGlsZXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2dyYWJzIG5vZGVidWdfZ3JhYnMgZGVidWdfc2VsIG5vZGVidWdfc2VsIGRiZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbm9kYmcgbWFjbm9zYXZlciBtYWNzYXZlciBub21hY25vc2F2ZXIgbWFjbm93YWl0IG1hY3dhaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5vbWFjbm93YWl0IG1hY3doZWVsIG1hY25vc3dhcCBtYWNzd2FwIG5vbWFjbm9zd2FwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNub3Jlc2l6ZSBtYWNyZXNpemUgbm9tYWNub3Jlc2l6ZSBtYWNpY29uYW5pbSBtYWNtZW51XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBtYWNub21lbnUgbm9tYWNtZW51IG1hY3Vza2JkIG5vbWFjdXNrYmQgbm9yZW1vdGVcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFybz0gIG5vb3AgZGlzcGxheSB2bmNkaXNwbGF5IGljb25fbW9kZSBhdXRvcG9ydFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbG9vcCBsb29wYmcgZGVza3RvcG5hbWUgZ3Vlc3NfZGVza3RvcCBndWVzc19kYnVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBodHRwX3VybCBhdXRoIHhhdXRoIHVzZXJzIHJvb3RzaGlmdCBjbGlwc2hpZnQgc2NhbGVfc3RyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfeCBzY2FsZWRfeSBzY2FsZV9udW1lciBzY2FsZV9kZW5vbSBzY2FsZV9mYWNfeFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmFjX3kgc2NhbGluZ19ibGVuZCBzY2FsaW5nX25vbXVsdDQgc2NhbGluZ19wYWRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmdfaW50ZXJwb2xhdGUgaW5ldGQgcHJpdnJlbW90ZSB1bnNhZmUgc2FmZXIgbm9jbWRzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd2RmaWxlIHVuaXhwdyB1bml4cHdfbmlzIHVuaXhwd19saXN0IHNzbCBzc2xfcGVtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzc2x2ZXJpZnkgc3R1bm5lbCBzdHVubmVsX3BlbSBodHRwcyBodHRwc3JlZGlyIHVzZXB3XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2luZ19zaG0gbG9nZmlsZSBvIGZsYWcgcm1mbGFnIHJjIG5vcmMgaCBoZWxwIFYgdmVyc2lvblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGFzdG1vZCBiZyBzaWdwaXBlIHRocmVhZHMgcmVhZHJhdGUgbmV0cmF0ZSBuZXRsYXRlbmN5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwaXBlaW5wdXQgY2xpZW50cyBjbGllbnRfY291bnQgcGlkIGV4dF94dGVzdCBleHRfeHRyYXBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4dF94cmVjb3JkIGV4dF94a2IgZXh0X3hzaG0gZXh0X3hpbmVyYW1hIGV4dF9vdmVybGF5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBleHRfeGZpeGVzIGV4dF94ZGFtYWdlIGV4dF94cmFuZHIgcm9vdHdpbiBudW1fYnV0dG9uc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uX21hc2sgbW91c2VfeCBtb3VzZV95IGdyYWJfc3RhdGUgcG9pbnRlcl9wb3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfeCBwb2ludGVyX3kgcG9pbnRlcl9zYW1lIHBvaW50ZXJfcm9vdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tYXNrIGJwcCBkZXB0aCBpbmRleGVkX2NvbG9yIGRweV94IGRweV95IHdkcHlfeFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgd2RweV95IG9mZl94IG9mZl95IGNkcHlfeCBjZHB5X3kgY29mZl94IGNvZmZfeSByZmJhdXRoXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwYXNzd2Qgdmlld3Bhc3N3ZFxuIgotIlxuIgotIi1RRCB2YXJpYWJsZSAgICAgICAgICAgSnVzdCBsaWtlIC1xdWVyeSB2YXJpYWJsZSwgYnV0IHJldHVybnMgdGhlIGRlZmF1bHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGZvciB0aGF0IHBhcmFtZXRlciAobm8gcnVubmluZyB4MTF2bmMgc2VydmVyXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zdWx0ZWQpXG4iCi0iXG4iCi0iLXN5bmMgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IC1yZW1vdGUgY29tbWFuZHMgYXJlIHJ1biBhc3luY2hyb25vdXNseSwgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaXMsIHRoZSByZXF1ZXN0IGlzIHBvc3RlZCBhbmQgdGhlIHByb2dyYW0gaW1tZWRpYXRlbHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4aXRzLiAgVXNlIC1zeW5jIHRvIGhhdmUgdGhlIHByb2dyYW0gd2FpdCBmb3IgYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSB4MTF2bmMgc2VydmVyIHRoYXQgY29tbWFuZCB3YXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCAoc29tZWhvdykuICBPbiB0aGUgb3RoZXIgaGFuZCAtcXVlcnkgcmVxdWVzdHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhbHdheXMgcHJvY2Vzc2VkIHN5bmNocm9ub3VzbHkgYmVjYXVzZSB0aGV5IGhhdmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgZm9yIHRoZSBhbnN3ZXIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBbHNvIG5vdGUgdGhhdCBpZiBib3RoIC1yZW1vdGUgYW5kIC1xdWVyeSByZXF1ZXN0cyBhcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSAtcmVtb3RlIGlzIHByb2Nlc3NlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgKHN5bmNocm9ub3VzbHk6IG5vIG5lZWQgZm9yIC1zeW5jKSwgYW5kIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtcXVlcnkgcmVxdWVzdCBpcyBwcm9jZXNzZWQgaW4gdGhlIG5vcm1hbCB3YXkuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyBmb3IgYSByZWxpYWJsZSB3YXkgdG8gc2VlIGlmIHRoZSAtcmVtb3RlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHdhcyBwcm9jZXNzZWQgYnkgcXVlcnlpbmcgZm9yIGFueSBuZXcgc2V0dGluZ3MuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGVyZSBpcyB0aW1lb3V0IG9mIGEgZmV3IHNlY29uZHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIG5leHQgcGFyYWdyYXBoKSBzbyBpZiB0aGUgeDExdm5jIHRha2VzIGxvbmdlclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGF0IHRvIHByb2Nlc3MgdGhlIHJlcXVlc3RzIHRoZSByZXF1ZXN0ZXIgd2lsbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhpbmsgdGhhdCBhIGZhaWx1cmUgaGFzIHRha2VuIHBsYWNlLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gd2FpdCAzLjUgc2Vjb25kcy4gIE9yIGlmIGNtZD1zdG9wXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBvbmx5IDEuMCBzZWNvbmRzLiAgSWYgY21kIG1hdGNoZXMgJ3NjcmlwdDonIHRoZW4gaXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgd2FpdCB1cCB0byAxMC4wIHNlY29uZHMuICBTZXQgWDExVk5DX1NZTkNfVElNRU9VVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHlvdSB3YW50IGl0IHRvIHdhaXQuXG4iCi0iXG4iCi0iLXF1ZXJ5X3JldHJpZXMgc3RyICAgICBJZiBhIHF1ZXJ5IGZhaWxzIHRvIGdldCBhIHJlc3BvbnNlIGZyb20gYW4geDExdm5jXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsIHJldHJ5IHVwIHRvIG4gdGltZXMuICBcInN0clwiIGlzIHNwZWNpZmllZCBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbls6dF1bL21hdGNoXSAgT3B0aW9uYWxseSB0aGUgZGVsYXkgYmV0d2VlbiB0cmllcyBtYXlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGJlIHNwZWNpZmllZCBieSBcInRcIiBhIGZsb2F0aW5nIHBvaW50IHRpbWUgKGRlZmF1bHRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIDAuNSBzZWNvbmRzLikgIE5vdGU6IHRoZSByZXNwb25zZSBpcyBub3QgY2hlY2tlZCBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5IG9yIHdoZXRoZXIgaXQgY29ycmVzcG9uZHMgdG8gdGhlIHF1ZXJ5IHNlbnQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgcXVlcnkgXCJwaW5nOm15c3RyaW5nXCIgbWF5IGJlIHVzZWQgdG8gaGVscCB1bmlxdWVseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZnkgdGhlIHF1ZXJ5LiAgT3B0aW9uYWxseSwgYSBtYXRjaGluZyBzdHJpbmcgYWZ0ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGEgXCIvXCIgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIHRoZSByZXN1bHQgdGV4dC4gIFVwIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBuIHJldHJpZXMgd2lsbCB0YWtlIHBsYWNlIHVudGlsIHRoZSBtYXRjaGluZyBzdHJpbmcgaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIGluIHRoZSBvdXRwdXQgdGV4dC4gIElmIHRoZSBtYXRjaCBzdHJpbmcgaXMgbmV2ZXJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIGlzIDE7IGlmIHRoZSBtYXRjaCBpc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgaXQgZXhpdHMgd2l0aCAwLiAgTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBzdGRvdXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZWQgZm9yIGVhY2ggcmV0cnkgKGkuZS4gbXVsdGlwbGUgbGluZXMgcHJpbnRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRvIHN0ZG91dC4pXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAtcXVlcnlfcmV0cmllcyA0OjEuNS9ncmFiX3N0YXRlXG4iCi0iXG4iCi0iLXJlbW90ZV9wcmVmaXggc3RyICAgICBFbmFibGUgYSByZW1vdGUtY29udHJvbCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgVk5DIGNsaWVudHMuICBzdHIgaXMgYSBub24tZW1wdHkgc3RyaW5nLiBJZiBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50IHNlbmRzIHJmYkN1dFRleHQgaGF2aW5nIHRoZSBwcmVmaXggXCJzdHJcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgcGFydCBhZnRlciBpdCBpcyBwcm9jZXNzZWQgYXMgdGhvdWdoIGl0IHdlcmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdmlhICd4MTF2bmMgLXJlbW90ZSAuLi4nLiAgSWYgaXQgYmVnaW5zIHdpdGhcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG5laXRoZXIgJ2NtZD0nIG5vciAncXJ5PScgdGhlbiAncXJ5PScgaXMgYXNzdW1lZC5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIEFueSBjb3JyZXNwb25kaW5nIG91dHB1dCB0ZXh0IGZvciB0aGF0IHJlbW90ZSBjb250cm9sXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIHNlbnQgYmFjayB0byBhbGwgY2xpZW50IGFzIHJmYkN1dFRleHQuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV0dXJuZWQgb3V0cHV0IGlzIGFsc28gcHJlZml4ZWQgd2l0aCBcInN0clwiLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogLXJlbW90ZV9wcmVmaXggRE9fVEhJUzpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBlbmFibGluZyAtcmVtb3RlX3ByZWZpeCBhbGxvd3MgdGhlIHJlbW90ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgVk5DIHZpZXdlcnMgdG8gcnVuIHgxMXZuYyAtcmVtb3RlIGNvbW1hbmRzLiAgRG8gbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhpcyBvcHRpb24gaWYgdGhleSBhcmUgbm90IHRvIGJlIHRydXN0ZWQuXG4iCi0iXG4iCi0iLW5vcmVtb3RlICAgICAgICAgICAgICBEbyBub3QgcHJvY2VzcyBhbnkgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMgb3IgcXVlcmllcy5cbiIKLSIteWVzcmVtb3RlICAgICAgICAgICAgIERvIHByb2Nlc3MgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMgb3IgcXVlcmllcy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICVzXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBBIG5vdGUgYWJvdXQgc2VjdXJpdHkgd3J0IHJlbW90ZSBjb250cm9sIGNvbW1hbmRzLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgSWYgc29tZW9uZSBjYW4gY29ubmVjdCB0byB0aGUgWCBkaXNwbGF5IGFuZCBjaGFuZ2VcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBYMTFWTkNfUkVNT1RFLCB0aGVuIHRoZXkgY2FuIHJlbW90ZWx5XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIHgxMXZuYy4gIE5vcm1hbGx5IGFjY2VzcyB0byB0aGUgWCBkaXNwbGF5IGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQuICBOb3RlIHRoYXQgaWYgdGhleSBjYW4gbW9kaWZ5IFgxMVZOQ19SRU1PVEVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBYIHNlcnZlciwgdGhleSBoYXZlIGVub3VnaCBwZXJtaXNzaW9ucyB0byBhbHNvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBydW4gdGhlaXIgb3duIHgxMXZuYyBhbmQgdGh1cyBoYXZlIGNvbXBsZXRlIGNvbnRyb2xcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBkZXNrdG9wLiAgSWYgdGhlICBcIi1jb25uZWN0IC9wYXRoL3RvL2ZpbGVcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBpcyBiZWluZyB1c2VkLCBvYnZpb3VzbHkgYW55b25lIHdobyBjYW4gd3JpdGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRvIC9wYXRoL3RvL2ZpbGUgY2FuIHJlbW90ZWx5IGNvbnRyb2wgeDExdm5jLiAgU28gYmVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHN1cmUgdG8gcHJvdGVjdCB0aGUgWCBkaXNwbGF5IGFuZCB0aGF0IGZpbGUncyB3cml0ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuICBTZWUgLXByaXZyZW1vdGUgYmVsb3cuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgYXJlIHBhcmFub2lkIGFuZCBkbyBub3QgdGhpbmsgLW5vcmVtb3RlIGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2gsIHRvIGRpc2FibGUgdGhlIFgxMVZOQ19SRU1PVEUgcHJvcGVydHkgY2hhbm5lbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVseSB1c2UgLW5vdm5jY29ubmVjdCwgb3IgdXNlIHRoZSAtc2FmZXIgb3B0aW9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHNodXRzIG1hbnkgdGhpbmdzIG9mZi5cbiIKLSJcbiIKLSItdW5zYWZlICAgICAgICAgICAgICAgIEEgZmV3IHJlbW90ZSBjb21tYW5kcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRseTogaWQ6cGljaywgYWNjZXB0OjxjbWQ+LCBnb25lOjxjbWQ+LCBhbmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiOnNldHVwOjxjbWQ+KSBiZWNhdXNlIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBleHRlcm5hbCBwcm9ncmFtcy4gIElmIHlvdSBzcGVjaWZ5IC11bnNhZmUsIHRoZW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHRoZXNlIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzIGFyZSBhbGxvd2VkLiAgTm90ZSB0aGF0XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHN0aWxsIHNwZWNpZnkgdGhlc2UgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgdGhleSBqdXN0IGNhbm5vdCBiZSBpbnZva2VkIHZpYSByZW1vdGUtY29udHJvbC5cbiIKLSItc2FmZXIgICAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1ub3ZuY2Nvbm5lY3QgLW5vcmVtb3RlIGFuZCBwcm9oaWJpdGluZ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgLWd1aSBhbmQgdGhlIC1jb25uZWN0IGZpbGUuIFNodXRzIG9mZiBjb21tdW5jYXRpb25cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLlxuIgotIi1wcml2cmVtb3RlICAgICAgICAgICAgUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MgYW5kIGRpc2FibGUgcmVtb3RlLWNvbnRyb2xcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzIGlmIGl0IGFwcGVhcnMgdGhhdCB0aGUgWCBESVNQTEFZIGFuZC9vclxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGZpbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IG90aGVyIHVzZXJzLiAgT25jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWNvbnRyb2wgaXMgZGlzYWJsZWQgaXQgY2Fubm90IGJlIHR1cm5lZCBiYWNrIG9uLlxuIgotIi1ub2NtZHMgICAgICAgICAgICAgICAgTm8gZXh0ZXJuYWwgY29tbWFuZHMgKGUuZy4gc3lzdGVtKDMpLCBwb3BlbigzKSwgZXhlYygzKSlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcnVuIGF0IGFsbC5cbiIKLSItYWxsb3dlZGNtZHMgbGlzdCAgICAgIFwibGlzdFwiIGNvbnRhaW5zIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG9ubHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHJ1bi4gIFRoZSBmdWxsIGxpc3Qgb2ZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgb3B0aW9ucyBpczpcbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICBzdHVubmVsLCBzc2wsIHVuaXhwdywgV0FJVCwgemVyb2NvbmYsIGlkLCBhY2NlcHQsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJhY2NlcHQsIGdvbmUsIHBpcGVpbnB1dCwgdjRsLWluZm8sIHJhd2ZiLXNldHVwLFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgIGR0LCBndWksIHNzaCwgc3RvcmVwYXNzd2QsIHBhc3N3ZGZpbGUsIGN1c3RvbV9wYXNzd2QsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgZmluZGF1dGgsIGNyYXNoLlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgU2VlIGVhY2ggb3B0aW9uJ3MgaGVscCB0byBsZWFybiB0aGUgYXNzb2NpYXRlZCBleHRlcm5hbFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC4gIE5vdGUgdGhhdCB0aGUgLW5vY21kcyBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRpc2FibGVzIGFsbCBleHRlcm5hbCBjb21tYW5kcy5cbiIKLSJcbiIKLSItZGVueV9hbGwgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCAtcmVtb3RlIG5vZGVueTogc3RhcnQgb3V0IGRlbnlpbmcgYWxsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBjbGllbnRzIHVudGlsIFwiLXJlbW90ZSBub2RlbnlcIiBpcyB1c2VkIHRvXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlbSBpbi5cbiIKLSJcbiIKLSIlc1xuIgotIlxuIgotIlRoZXNlIG9wdGlvbnMgYXJlIHBhc3NlZCB0byBMaWJWTkNTZXJ2ZXI6XG4iCi0iXG4iCi07Ci0JLyogaGF2ZSBib3RoIG91ciBoZWxwIGFuZCByZmJVc2FnZSB0byBzdGRvdXQgZm9yIG1vcmUoMSksIGV0Yy4gKi8KLQlkdXAyKDEsIDIpOwotCi0JLyogcmVnaXN0ZXIgZXh0ZW5zaW9uKHMpIHRvIGdldCB0aGVpciBoZWxwIG91dHB1dCAqLwotI2lmZGVmIExJQlZOQ1NFUlZFUl9XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUgotCXJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb24oKTsKLSNlbmRpZgotCi0JaWYgKG1vZGUgPT0gMSkgewotCQljaGFyICpwOwkKLQkJaW50IGwgPSAwOwotCQlmcHJpbnRmKHN0ZGVyciwgIngxMXZuYzogYWxsb3cgVk5DIGNvbm5lY3Rpb25zIHRvIHJlYWwgIgotCQkgICAgIlgxMSBkaXNwbGF5cy4gJXNcblxueDExdm5jIG9wdGlvbnM6XG4iLCBsYXN0bW9kKTsKLQkJcCA9IHN0cnRvayhoZWxwLCAiXG4iKTsKLQkJd2hpbGUgKHApIHsKLQkJCWludCB3ID0gMjM7Ci0JCQljaGFyIHRtcFsxMDBdOwotCQkJaWYgKHBbMF0gPT0gJy0nKSB7Ci0JCQkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCQkJCXN0cm5jcHkodG1wLCBwLCB3KTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgJXMiLCB0bXApOwotCQkJCWwrKzsKLQkJCQlpZiAobCAlIDMgPT0gMCkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQkJfQotCQkJfQotCQkJcCA9IHN0cnRvayhOVUxMLCAiXG4iKTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5MaWJWTkNTZXJ2ZXIgb3B0aW9uczpcbiIpOwotCQlyZmJVc2FnZSgpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotI2lmIDEKLQlmcHJpbnRmKHN0ZGVyciwgaGVscCwgbGFzdG1vZCwKLQkJUE9MTF84VE8yNF9ERUxBWSwKLQkJc2NhbGluZ19jb3B5cmVjdCA/ICI6Y3IiOiI6bm9jciIsCi0JCXZpZXdfb25seSA/ICJvbiI6Im9mZiIsCi0JCXNoYXJlZCA/ICJvbiI6Im9mZiIsCi0JCXZuY19jb25uZWN0ID8gIi12bmNjb25uZWN0IjoiLW5vdm5jY29ubmVjdCIsCi0JCXhpbmVyYW1hID8gIi14aW5lcmFtYSI6Ii1ub3hpbmVyYW1hIiwKLQkJdXNlX21vZGlmaWVyX3R3ZWFrID8gIi1tb2R0d2VhayI6Ii1ub21vZHR3ZWFrIiwKLQkJc2tpcF9kdXBsaWNhdGVfa2V5X2V2ZW50cyA/ICItc2tpcF9kdXBzIjoiLW5vc2tpcF9kdXBzIiwKLQkJYWRkX2tleXN5bXMgPyAiLWFkZF9rZXlzeW1zIjoiLW5vYWRkX2tleXN5bXMiLAotCQlub19hdXRvcmVwZWF0ID8gIi1ub3JlcGVhdCI6Ii1yZXBlYXQiLAotCQlhbHRfYXJyb3dfbWF4LCBhbHRfYXJyb3csCi0JCWFscGhhX3RocmVzaG9sZCwKLQkJYWxwaGFfZnJhYywKLQkJY3Vyc29yX3Bvc191cGRhdGVzID8gIi1jdXJzb3Jwb3MiOiItbm9jdXJzb3Jwb3MiLAotCQl3aXJlZnJhbWUgPyAiLXdpcmVmcmFtZSI6Ii1ub3dpcmVmcmFtZSIsCi0JCVdJUkVGUkFNRV9QQVJNUywKLQkJd2lyZWZyYW1lX2NvcHlyZWN0X2RlZmF1bHQsCi0JCXNjcm9sbF9jb3B5cmVjdF9kZWZhdWx0LAotCQlzY3JvbGxjb3B5cmVjdF9taW5fYXJlYSwKLQkJc2Nyb2xsX3NraXBfc3RyMCA/IHNjcm9sbF9za2lwX3N0cjAgOiAiKGVtcHR5KSIsCi0JCXNjcm9sbF90ZXJtX3N0cjAsCi0JCW1heF9rZXlyZXBlYXRfc3RyMCwKLQkJU0NST0xMX0NPUFlSRUNUX1BBUk1TLAotCQlwb2ludGVyX21vZGVfbWF4LCBwb2ludGVyX21vZGUsCi0JCXVpX3NraXAsCi0JCWRlZmVyX3VwZGF0ZSwKLQkJd2FpdG1zLAotCQl3YWl0X3VpLAotCQl0YWtlX25hcHMgPyAidGFrZSBuYXBzIjoibm8gbmFwcyIsCi0JCXNjcmVlbl9ibGFuaywKLQkJcmZiTWF4Q2xpZW50V2FpdC8xMDAwLAotCQl3YXRjaF9mYnBtID8gIi1ub2ZicG0iOiItZmJwbSIsCi0JCXdhdGNoX2RwbXMgPyAiLW5vZHBtcyI6Ii1kcG1zIiwKLQkJeGRhbWFnZV9tYXhfYXJlYSwgTlNDQU4sIHhkYW1hZ2VfbWVtb3J5LAotCQl1c2VfdGhyZWFkcyA/ICItdGhyZWFkcyI6Ii1ub3RocmVhZHMiLAotCQlmc19mcmFjLAotCQlnYXBzX2ZpbGwsCi0JCWdyb3dfZmlsbCwKLQkJdGlsZV9mdXp6LAotCQlhY2NlcHRfcmVtb3RlX2NtZHMgPyAiLXllc3JlbW90ZSI6Ii1ub3JlbW90ZSIsCi0JCSIiCi0JKTsKLSNlbHNlCi0JZnByaW50ZihzdGRlcnIsICIlcyIsIGhlbHApOwotI2VuZGlmCi0KLQlyZmJVc2FnZSgpOwotI2VuZGlmCi0JZXhpdCgxKTsKLX0KLQotdm9pZCB4b3Blbl9kaXNwbGF5X2ZhaWxfbWVzc2FnZShjaGFyICpkaXNwKSB7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiKioqIHgxMXZuYyB3YXMgdW5hYmxlIHRvIG9wZW4gdGhlIFggRElTUExBWTogXCIlc1wiLCIKLQkgICAgIiBpdCBjYW5ub3QgY29udGludWUuXG4iLCBkaXNwKTsKLQlmcHJpbnRmKHN0ZGVyciwgIioqKiBUaGVyZSBtYXkgYmUgXCJYbGliOlwiIGVycm9yIG1lc3NhZ2VzIGFib3ZlIgotCSAgICAiIHdpdGggZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlNvbWUgdGlwcyBhbmQgZ3VpZGVsaW5lczpcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIioqIEFuIFggc2VydmVyICh0aGUgb25lIHlvdSB3aXNoIHRvIHZpZXcpIG11c3QiCi0JICAgICIgYmUgcnVubmluZyBiZWZvcmUgeDExdm5jIGlzXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIHN0YXJ0ZWQ6IHgxMXZuYyBkb2VzIG5vdCBzdGFydCB0aGUgWCBzZXJ2ZXIuICAiCi0JICAgICIoaG93ZXZlciwgc2VlIHRoZSAtY3JlYXRlXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIG9wdGlvbiBpZiB0aGF0IGlzIHdoYXQgeW91IHJlYWxseSB3YW50KS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIioqIFlvdSBtdXN0IHVzZSAtZGlzcGxheSA8ZGlzcD4sIC1PUi0gc2V0IGFuZCIKLQkgICAgIiBleHBvcnQgeW91ciAkRElTUExBWVxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byByZWZlciB0byB0aGUgZGlzcGxheSBvZiIKLQkgICAgIiB0aGUgZGVzaXJlZCBYIHNlcnZlci5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiIC0gVXN1YWxseSB0aGUgZGlzcGxheSBpcyBzaW1wbHkgXCI6MFwiIChpbiBmYWN0IgotCSAgICAiIHgxMXZuYyB1c2VzIHRoaXMgaWYgeW91IGZvcmdldFxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICB0byBzcGVjaWZ5IGl0KSwgYnV0IGluIHNvbWUgbXVsdGktdXNlciIKLQkgICAgIiBzaXR1YXRpb25zIGl0IGNvdWxkIGJlIFwiOjFcIiwgXCI6MlwiLFxuIik7IAotCWZwcmludGYoc3RkZXJyLCAiICAgb3IgZXZlbiBcIjoxMzdcIi4gIEFzayB5b3VyIGFkbWluaXN0cmF0b3IiCi0JICAgICIgb3IgYSBndXJ1IGlmIHlvdSBhcmUgaGF2aW5nXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIGRpZmZpY3VsdHkgZGV0ZXJtaW5pbmcgd2hhdCB5b3VyIFggRElTUExBWSBpcy5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIioqIE5leHQsIHlvdSBuZWVkIHRvIGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyIKLQkgICAgIiAoWGF1dGhvcml0eSkgXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIHRvIGNvbm5lY3QgdG8gdGhlIFggRElTUExBWS4gICBIZXJlIGFyZSBzb21lIgotCSAgICAiIFRpcHM6XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgLSBPZnRlbiwgeW91IGp1c3QgbmVlZCB0byBydW4geDExdm5jIGFzIHRoZSB1c2VyIgotCSAgICAiIGxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb24uXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIFNvIG1ha2Ugc3VyZSB0byBiZSB0aGF0IHVzZXIgd2hlbiB5b3UgdHlwZSIKLQkgICAgIiB4MTF2bmMuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAtIEJlaW5nIHJvb3QgaXMgdXN1YWxseSBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIgotCSAgICAiIGluY29ycmVjdCBNSVQtTUFHSUMtQ09PS0lFXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIGZpbGUgbWF5IGJlIGFjY2Vzc2VkLiAgVGhlIGNvb2tpZSBmaWxlIGNvbnRhaW5zIgotCSAgICAiIHRoZSBzZWNyZXQga2V5IHRoYXRcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgYWxsb3dzIHgxMXZuYyB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIgotCSAgICAiIFggRElTUExBWS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiIC0gWW91IGNhbiBleHBsaWNpdGx5IGluZGljYXRlIHdoaWNoIE1JVC1NQUdJQy1DT09LSUUiCi0JICAgICIgZmlsZSBzaG91bGQgYmUgdXNlZFxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICBieSB0aGUgLWF1dGggb3B0aW9uLCBlLmcuOlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICAgICAgeDExdm5jIC1hdXRoIC9ob21lL3NvbWV1c2VyLy5YYXV0aG9yaXR5IgotCSAgICAiIC1kaXNwbGF5IDowXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICB4MTF2bmMgLWF1dGggL3RtcC8uZ2Rtem5kVmxSIgotCSAgICAiIC1kaXNwbGF5IDowXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIHlvdSBtdXN0IGhhdmUgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXV0aCBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICBTZWUgYWxzbyAnLWF1dGggZ3Vlc3MnIGFuZCAnLWZpbmRhdXRoJyBkaXNjdXNzZWQgYmVsb3cuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIqKiBJZiBOTyBPTkUgaXMgbG9nZ2VkIGludG8gYW4gWCBzZXNzaW9uIHlldCwgYnV0IgotCSAgICAiIHRoZXJlIGlzIGEgZ3JlZXRlciBsb2dpblxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICBwcm9ncmFtIGxpa2UgXCJnZG1cIiwgXCJrZG1cIiwgXCJ4ZG1cIiwgb3IiCi0JICAgICIgXCJkdGxvZ2luXCIgcnVubmluZywgeW91IHdpbGwgbmVlZFxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICB0byBmaW5kIGFuZCB1c2UgdGhlIHJhdyBkaXNwbGF5IG1hbmFnZXIiCi0JICAgICIgTUlULU1BR0lDLUNPT0tJRSBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICBTb21lIGV4YW1wbGVzIGZvciB2YXJpb3VzIGRpc3BsYXkgbWFuYWdlcnM6XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgICAgIGdkbTogICAgIC1hdXRoIC92YXIvZ2RtLzowLlhhdXRoXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgLWF1dGggL3Zhci9saWIvZ2RtLzowLlhhdXRoXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAga2RtOiAgICAgLWF1dGggL3Zhci9saWIva2RtL0E6MC1jcldrNzJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAtYXV0aCAvdmFyL3J1bi94YXV0aC9BOjAtY3JXazcyXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgeGRtOiAgICAgLWF1dGggL3Zhci9saWIveGRtL2F1dGhkaXIvYXV0aGZpbGVzL0E6MC1YUXZhSmtcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgICBkdGxvZ2luOiAtYXV0aCAvdmFyL2R0L0E6MC1VZ2FhWGFcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIFNvbWV0aW1lcyB0aGUgY29tbWFuZCBcInBzIHd3d3dhdXggfCBncmVwIGF1dGhcIiIKLQkgICAgIiBjYW4gcmV2ZWFsIHRoZSBmaWxlIGxvY2F0aW9uLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjkgeW91IGNhbiBoYXZlIGl0IHRyeSB0byBndWVzcyBieSB1c2luZzpcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgLWF1dGggZ3Vlc3NcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIChzZWUgYWxzbyB0aGUgeDExdm5jIC1maW5kYXV0aCBvcHRpb24uKVxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgT25seSByb290IHdpbGwgaGF2ZSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSIKLQkgICAgIiBmaWxlLCBhbmQgc28geDExdm5jIG11c3QgYmUgcnVuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgIGFzIHJvb3QgKG9yIGNvcHkgaXQpLiAgVGhlIHJhbmRvbSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlbmFtZXMiCi0JICAgICIgd2lsbCBvZiBjb3Vyc2VcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAgY2hhbmdlIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBjb29raWUgZmlsZSByZXNpZGVzIGluIgotCSAgICAiIGlzIHN5c3RlbSBkZXBlbmRlbnQuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJTZWUgYWxzbzogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbFxuIik7Ci19Ci0KLXZvaWQgbm9wYXNzd29yZF93YXJuaW5nX21zZyhpbnQgZ290bG9jKSB7Ci0KLQljaGFyIHN0cjFbXSA9Ci0iIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCi0iI0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgICoqICBXQVJOSU5HICAqKiAgV0FSTklORyAgKiogIFdBUk5JTkcgICoqICBXQVJOSU5HICAqKiAgIEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgICAgICAgIFlPVSBBUkUgUlVOTklORyBYMTFWTkMgV0lUSE9VVCBBIFBBU1NXT1JEISEgICAgICAgIEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgIFRoaXMgbWVhbnMgYW55b25lIHdpdGggbmV0d29yayBhY2Nlc3MgdG8gdGhpcyBjb21wdXRlciAgIEAjXG4iCi0iI0AgIG1heSBiZSBhYmxlIHRvIHZpZXcgYW5kIGNvbnRyb2wgeW91ciBkZXNrdG9wLiAgICAgICAgICAgIEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgPj4+IElmIHlvdSBkaWQgbm90IG1lYW4gdG8gZG8gdGhpcyBQcmVzcyBDVFJMLUMgbm93ISEgPDw8IEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAjXG4iCi07Ci0JY2hhciBzdHIyW10gPQotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBZb3UgY2FuIGNyZWF0ZSBhbiB4MTF2bmMgcGFzc3dvcmQgZmlsZSBieSBydW5uaW5nOiAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgIHgxMXZuYyAtc3RvcmVwYXNzd2QgcGFzc3dvcmQgL3BhdGgvdG8vcGFzc2ZpbGUgICAgICBAI1xuIgotIiNAICBvciAgIHgxMXZuYyAtc3RvcmVwYXNzd2QgL3BhdGgvdG8vcGFzc2ZpbGUgICAgICAgICAgICAgICBAI1xuIgotIiNAICBvciAgIHgxMXZuYyAtc3RvcmVwYXNzd2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAodGhlIGxhc3Qgb25lIHdpbGwgdXNlIH4vLnZuYy9wYXNzd2QpICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBhbmQgdGhlbiBzdGFydGluZyB4MTF2bmMgdmlhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgeDExdm5jIC1yZmJhdXRoIC9wYXRoL3RvL3Bhc3NmaWxlICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBhbiBleGlzdGluZyB+Ly52bmMvcGFzc3dkIGZpbGUgZnJvbSBhbm90aGVyIFZOQyAgICAgICAgICBAI1xuIgotIiNAICBhcHBsaWNhdGlvbiB3aWxsIHdvcmsgZmluZSB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBZb3UgY2FuIGFsc28gdXNlIHRoZSAtcGFzc3dkZmlsZSBvciAtcGFzc3dkIG9wdGlvbnMuICAgICBAI1xuIgotIiNAICAobm90ZSAtcGFzc3dkIGlzIHVuc2FmZSBpZiBsb2NhbCB1c2VycyBhcmUgbm90IHRydXN0ZWQpICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBNYWtlIHN1cmUgYW55IC1yZmJhdXRoIGFuZCAtcGFzc3dkZmlsZSBwYXNzd29yZCBmaWxlcyAgICBAI1xuIgotIiNAICBjYW5ub3QgYmUgcmVhZCBieSB1bnRydXN0ZWQgdXNlcnMuICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBVc2UgeDExdm5jIC11c2VwdyB0byBhdXRvbWF0aWNhbGx5IHVzZSB5b3VyICAgICAgICAgICAgICBAI1xuIgotIiNAICB+Ly52bmMvcGFzc3dkIG9yIH4vLnZuYy9wYXNzd2RmaWxlIHBhc3N3b3JkIGZpbGVzLiAgICAgICBAI1xuIgotIiNAICAoYW5kIHByb21wdCB5b3UgdG8gY3JlYXRlIH4vLnZuYy9wYXNzd2QgaWYgbmVpdGhlciAgICAgICBAI1xuIgotIiNAICBmaWxlIGV4aXN0cy4pICBVbmRlciAtdXNlcHcsIHgxMXZuYyB3aWxsIGV4aXQgaWYgaXQgICAgICBAI1xuIgotIiNAICBjYW5ub3QgZmluZCBhIHBhc3N3b3JkIHRvIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBFdmVuIHdpdGggYSBwYXNzd29yZCwgdGhlIHN1YnNlcXVlbnQgVk5DIHRyYWZmaWMgaXMgICAgICBAI1xuIgotIiNAICBzZW50IGluIHRoZSBjbGVhci4gIENvbnNpZGVyIHR1bm5lbGxpbmcgdmlhIHNzaCgxKTogICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI3R1bm5lbGxpbmcgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBPciB1c2luZyB0aGUgeDExdm5jIFNTTCBvcHRpb25zOiAtc3NsIGFuZCAtc3R1bm5lbCAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICBQbGVhc2UgUmVhZCB0aGUgZG9jdW1lbnRpb24gZm9yIG1vcmUgaW5mbyBhYm91dCAgICAgICAgICBAI1xuIgotIiNAICBwYXNzd29yZHMsIHNlY3VyaXR5LCBhbmQgZW5jcnlwdGlvbi4gICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAI1xuIgotIiNAICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXBhc3N3ZCAgICBAI1xuIgotOwotCWNoYXIgc3RyM1tdID0KLSIjQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCNcbiIKLSIjQCAgWW91IGFyZSB1c2luZyB0aGUgLWxvY2FsaG9zdCBvcHRpb24gYW5kIHRoYXQgaXMgYSBnb29kICAgQCNcbiIKLSIjQCAgdGhpbmchISBFc3BlY2lhbGx5IGlmIHlvdSBzc2goMSkgaW50byB0aGlzIG1hY2hpbmUgYW5kICAgQCNcbiIKLSIjQCAgdXNlIHBvcnQgcmVkaXJlY3Rpb24uICBOZXZlcnRoZWxlc3MsIHdpdGhvdXQgYSBwYXNzd29yZCAgQCNcbiIKLSIjQCAgb3RoZXIgdXNlcnMgY291bGQgcG9zc2libHkgZG8gcmVkaXJlY3Rpb24gYXMgd2VsbCB0byAgICAgQCNcbiIKLSIjQCAgZ2FpbiBhY2Nlc3MgdG8geW91ciBkZXNrdG9wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCNcbiIKLTsKLQljaGFyIHN0cjRbXSA9Ci0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgIFRvIGRpc2FibGUgdGhpcyB3YXJuaW5nIHVzZSB0aGUgLW5vcHcgb3B0aW9uLCBvciBwdXQgICAgIEAjXG4iCi0iI0AgICdub3B3JyBvbiBhIGxpbmUgaW4geW91ciB+Ly54MTF2bmNyYyBmaWxlLiAgICAgICAgICAgICAgIEAjXG4iCi0iI0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAjXG4iCi0iI0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAjXG4iCi0iIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCi07Ci0JY2hhciBzdHI1W10gPQotIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4iCi07Ci0JaWYgKGluZXRkKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgc3RyMSk7Ci0JZmZsdXNoKHN0ZGVycik7Ci0jaWYgIVBBU1NXRF9SRVFVSVJFRAotCXVzbGVlcCg3NTAgKiAxMDAwKTsKLSNlbmRpZgotCWlmICghcXVpZXQpIHsKLQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cjIpOwotCQlpZiAoZ290bG9jKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgc3RyMyk7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cjQpOwotCX0gZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXMiLCBzdHI1KTsKLQl9Ci0JZmZsdXNoKHN0ZGVycik7Ci0jaWYgIVBBU1NXRF9SRVFVSVJFRAotCXVzbGVlcCgyNTAgKiAxMDAwKTsKLSNlbmRpZgotfQotCi12b2lkIHByaW50X2xpY2Vuc2Uodm9pZCkgewotCWNoYXIgbGljZW5zZVtdID0gCi0jaWYgIVNLSVBfSEVMUAotIgkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFXG4iCi0iCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTFcbiIKLSJcbiIKLSIgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAwMjExMS0xMzA3LCBVU0EuXG4iCi0iIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllc1xuIgotIiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC5cbiIKLSJcbiIKLSIJCQkgICAgUHJlYW1ibGVcbiIKLSJcbiIKLSIgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXJcbiIKLSJmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpY1xuIgotIkxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWVcbiIKLSJzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpc1xuIgotIkdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlXG4iCi0iRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0b1xuIgotInVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnlcbiIKLSJ0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG9cbiIKLSJ5b3VyIHByb2dyYW1zLCB0b28uXG4iCi0iXG4iCi0iICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90XG4iCi0icHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdVxuIgotImhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3JcbiIKLSJ0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXRcbiIKLSJpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdFxuIgotImluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy5cbiIKLSJcbiIKLSIgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWRcbiIKLSJhbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuXG4iCi0iVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3VcbiIKLSJkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuXG4iCi0iXG4iCi0iICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyXG4iCi0iZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0XG4iCi0ieW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGVcbiIKLSJzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyXG4iCi0icmlnaHRzLlxuIgotIlxuIgotIiAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZFxuIgotIigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksXG4iCi0iZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS5cbiIKLSJcbiIKLSIgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluXG4iCi0idGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWVcbiIKLSJzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2VcbiIKLSJ3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzb1xuIgotInRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsXG4iCi0iYXV0aG9ycycgcmVwdXRhdGlvbnMuXG4iCi0iXG4iCi0iICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZVxuIgotInBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWVcbiIKLSJwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlXG4iCi0icHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55XG4iCi0icGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC5cbiIKLSJcbiIKLSIgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kXG4iCi0ibW9kaWZpY2F0aW9uIGZvbGxvdy5cbiIKLSIMXG4iCi0iCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0VcbiIKLSIgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT05cbiIKLSJcbiIKLSIgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnNcbiIKLSJhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZFxuIgotInVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgXCJQcm9ncmFtXCIsIGJlbG93LFxuIgotInJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhIFwid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbVwiXG4iCi0ibWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzpcbiIKLSJ0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LFxuIgotImVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyXG4iCi0ibGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpblxuIgotInRoZSB0ZXJtIFwibW9kaWZpY2F0aW9uXCIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgXCJ5b3VcIi5cbiIKLSJcbiIKLSJBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdFxuIgotImNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2ZcbiIKLSJydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtXG4iCi0iaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGVcbiIKLSJQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLlxuIgotIldoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLlxuIgotIlxuIgotIiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzXG4iCi0ic291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91XG4iCi0iY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZVxuIgotImNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGVcbiIKLSJub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7XG4iCi0iYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZVxuIgotImFsb25nIHdpdGggdGhlIFByb2dyYW0uXG4iCi0iXG4iCi0iWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kXG4iCi0ieW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS5cbiIKLSJcbiIKLSIgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb25cbiIKLSJvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kXG4iCi0iZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxXG4iCi0iYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczpcbiIKLSJcbiIKLSIgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4iCi0iICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuXG4iCi0iXG4iCi0iICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpblxuIgotIiAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnlcbiIKLSIgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmRcbiIKLSIgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLlxuIgotIlxuIgotIiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5XG4iCi0iICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2hcbiIKLSIgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhblxuIgotIiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGFcbiIKLSIgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlXG4iCi0iICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXJcbiIKLSIgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXNcbiIKLSIgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXRcbiIKLSIgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvblxuIgotIiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LilcbiIKLSIMXG4iCi0iVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZlxuIgotImlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sXG4iCi0iYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluXG4iCi0idGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZVxuIgotInNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdVxuIgotImRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZFxuIgotIm9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZlxuIgotInRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlXG4iCi0iZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LlxuIgotIlxuIgotIlRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdFxuIgotInlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0b1xuIgotImV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvclxuIgotImNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uXG4iCi0iXG4iCi0iSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbVxuIgotIndpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZlxuIgotImEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyXG4iCi0idGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS5cbiIKLSJcbiIKLSIgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LFxuIgotInVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotIlNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiIKLSJcbiIKLSIgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZVxuIgotIiAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnNcbiIKLSIgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsXG4iCi0iXG4iCi0iICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlXG4iCi0iICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyXG4iCi0iICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGVcbiIKLSIgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZVxuIgotIiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bVxuIgotIiAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsXG4iCi0iXG4iCi0iICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyXG4iCi0iICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzXG4iCi0iICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91XG4iCi0iICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2hcbiIKLSIgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pXG4iCi0iXG4iCi0iVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvclxuIgotIm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlXG4iCi0iY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnlcbiIKLSJhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG9cbiIKLSJjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhXG4iCi0ic3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlXG4iCi0iYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnlcbiIKLSJmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZVxuIgotIm9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50XG4iCi0iaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLlxuIgotIlxuIgotIklmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmdcbiIKLSJhY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50XG4iCi0iYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzXG4iCi0iZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90XG4iCi0iY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS5cbiIKLSIMXG4iCi0iICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW1cbiIKLSJleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0XG4iCi0ib3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzXG4iCi0idm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuIgotIkhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyXG4iCi0idGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2hcbiIKLSJwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuXG4iCi0iXG4iCi0iICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3RcbiIKLSJzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvclxuIgotImRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZVxuIgotInByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnlcbiIKLSJtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGVcbiIKLSJQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZFxuIgotImFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmdcbiIKLSJ0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC5cbiIKLSJcbiIKLSIgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGVcbiIKLSJQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZVxuIgotIm9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG9cbiIKLSJ0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlclxuIgotInJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi5cbiIKLSJZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0b1xuIgotInRoaXMgTGljZW5zZS5cbiIKLSJcbiIKLSIgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnRcbiIKLSJpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLFxuIgotImNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3JcbiIKLSJvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90XG4iCi0iZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3RcbiIKLSJkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzXG4iCi0iTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdVxuIgotIm1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnRcbiIKLSJsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5XG4iCi0iYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuXG4iCi0idGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0b1xuIgotInJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uXG4iCi0iXG4iCi0iSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyXG4iCi0iYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0b1xuIgotImFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyXG4iCi0iY2lyY3Vtc3RhbmNlcy5cbiIKLSJcbiIKLSJJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55XG4iCi0icGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnlcbiIKLSJzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlXG4iCi0iaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzXG4iCi0iaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlXG4iCi0iZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZFxuIgotInRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0XG4iCi0ic3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZ1xuIgotInRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdFxuIgotImltcG9zZSB0aGF0IGNob2ljZS5cbiIKLSJcbiIKLSJUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG9cbiIKLSJiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS5cbiIKLSIMXG4iCi0iICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpblxuIgotImNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZVxuIgotIm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2VcbiIKLSJtYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmdcbiIKLSJ0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nXG4iCi0iY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzXG4iCi0idGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuXG4iCi0iXG4iCi0iICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9uc1xuIgotIm9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbFxuIgotImJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0b1xuIgotImFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLlxuIgotIlxuIgotIkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW1cbiIKLSJzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgXCJhbnlcbiIKLSJsYXRlciB2ZXJzaW9uXCIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuIgotImVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4iCi0iU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZlxuIgotInRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmVcbiIKLSJGb3VuZGF0aW9uLlxuIgotIlxuIgotIiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZVxuIgotInByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3JcbiIKLSJ0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWVcbiIKLSJTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXNcbiIKLSJtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fsc1xuIgotIm9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmRcbiIKLSJvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS5cbiIKLSJcbiIKLSNlbmRpZgotIgkJCSAgICBOTyBXQVJSQU5UWVxuIgotIlxuIgotIiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZXG4iCi0iRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOXG4iCi0iT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFU1xuIgotIlBST1ZJREUgVEhFIFBST0dSQU0gXCJBUyBJU1wiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRURcbiIKLSJPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRlxuIgotIk1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVNcbiIKLSJUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFXG4iCi0iUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsXG4iCi0iUkVQQUlSIE9SIENPUlJFQ1RJT04uXG4iCi0iXG4iCi0iICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HXG4iCi0iV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUlxuIgotIlJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsXG4iCi0iSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HXG4iCi0iT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRFxuIgotIlRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWVxuIgotIllPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSXG4iCi0iUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFXG4iCi0iUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLlxuIgotIlxuIgotI2lmICFTS0lQX0hFTFAKLSIJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TXG4iCi0iDFxuIgotIglBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zXG4iCi0iXG4iCi0iICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0XG4iCi0icG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdFxuIgotImZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLlxuIgotIlxuIgotIiAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3RcbiIKLSJ0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5XG4iCi0iY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3RcbiIKLSJ0aGUgXCJjb3B5cmlnaHRcIiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLlxuIgotIlxuIgotIiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPlxuIgotIiAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj5cbiIKLSJcbiIKLSIgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiIKLSIgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiIKLSIgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3JcbiIKLSIgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKLSJcbiIKLSIgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4iCi0iICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCi0iICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiIKLSIgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiIKLSJcbiIKLSIgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiIKLSIgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiIKLSIgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiIKLSJcbiIKLSJBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC5cbiIKLSJcbiIKLSJJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzXG4iCi0id2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZTpcbiIKLSJcbiIKLSIgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yXG4iCi0iICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy5cbiIKLSIgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdFxuIgotIiAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuXG4iCi0iXG4iCi0iVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlXG4iCi0icGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heVxuIgotImJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZVxuIgotIm1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uXG4iCi0iXG4iCi0iWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXJcbiIKLSJzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhIFwiY29weXJpZ2h0IGRpc2NsYWltZXJcIiBmb3IgdGhlIHByb2dyYW0sIGlmXG4iCi0ibmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOlxuIgotIlxuIgotIiAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbVxuIgotIiAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuXG4iCi0iXG4iCi0iICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODlcbiIKLSIgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlXG4iCi0iXG4iCi0iVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvXG4iCi0icHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXlcbiIKLSJjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGVcbiIKLSJsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWxcbiIKLSJQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS5cbiIKLSNlbmRpZgotOwotCi0JY2hhciB0b3BbXSA9Ci0iXG4iCi0ieDExdm5jOiBhIFZOQyBzZXJ2ZXIgZm9yIFggZGlzcGxheXMuICAlc1xuIgotIlxuIgotIkNvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+XG4iCi0iQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiIKLSJcbiIKLTsKLQlkdXAyKDEsIDIpOwotCWZwcmludGYoc3RkZXJyLCB0b3AsIGxhc3Rtb2QpOwotCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaWNlbnNlKTsKLQlleGl0KDEpOwotfQotCmRpZmYgLS1naXQgYS94MTF2bmMvaGVscC5oIGIveDExdm5jL2hlbHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwN2FmOC4uMDAwMDAwMAotLS0gYS94MTF2bmMvaGVscC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfSEVMUF9ICi0jZGVmaW5lIF9YMTFWTkNfSEVMUF9ICi0KLS8qIC0tIGhlbHAuaCAtLSAqLwotCi1leHRlcm4gdm9pZCBwcmludF9oZWxwKGludCBtb2RlKTsKLWV4dGVybiB2b2lkIHByaW50X2xpY2Vuc2Uodm9pZCk7Ci1leHRlcm4gdm9pZCB4b3Blbl9kaXNwbGF5X2ZhaWxfbWVzc2FnZShjaGFyICpkaXNwKTsKLWV4dGVybiB2b2lkIG5vcGFzc3dvcmRfd2FybmluZ19tc2coaW50IGdvdGxvYyk7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX0hFTFBfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2luZXQuYyBiL3gxMXZuYy9pbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTkxMWUuLjAwMDAwMDAKLS0tIGEveDExdm5jL2luZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDkzNiArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIGluZXQuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAic3NsaGVscGVyLmgiCi0KLS8qCi0gKiBTaW1wbGUgdXRpbGl0eSB0byBtYXAgaG9zdCBuYW1lIHRvIGRvdHRlZCBJUCBhZGRyZXNzLiAgSWdub3JlcyBhbGlhc2VzLgotICogVXAgdG8gY2FsbGVyIHRvIGZyZWUgcmV0dXJuZWQgc3RyaW5nLgotICovCi1jaGFyICpob3N0MmlwKGNoYXIgKmhvc3QpOwotY2hhciAqcmF3Mmhvc3QoY2hhciAqcmF3LCBpbnQgbGVuKTsKLWNoYXIgKnJhdzJpcChjaGFyICpyYXcpOwotY2hhciAqaXAyaG9zdChjaGFyICppcCk7Ci1pbnQgaXB2Nl9pcChjaGFyICpob3N0KTsKLWludCBkb3R0ZWRfaXAoY2hhciAqaG9zdCwgaW50IHBhcnRpYWwpOwotaW50IGdldF9yZW1vdGVfcG9ydChpbnQgc29jayk7Ci1pbnQgZ2V0X2xvY2FsX3BvcnQoaW50IHNvY2spOwotY2hhciAqZ2V0X3JlbW90ZV9ob3N0KGludCBzb2NrKTsKLWNoYXIgKmdldF9sb2NhbF9ob3N0KGludCBzb2NrKTsKLWNoYXIgKmlkZW50X3VzZXJuYW1lKHJmYkNsaWVudFB0ciBjbGllbnQpOwotaW50IGZpbmRfZnJlZV9wb3J0KGludCBzdGFydCwgaW50IGVuZCk7Ci1pbnQgZmluZF9mcmVlX3BvcnQ2KGludCBzdGFydCwgaW50IGVuZCk7Ci1pbnQgaGF2ZV9zc2hfZW52KHZvaWQpOwotY2hhciAqaXB2Nl9nZXRuYW1laW5mbyhzdHJ1Y3Qgc29ja2FkZHIgKnBhZGRyLCBpbnQgYWRkcmxlbik7Ci1jaGFyICppcHY2X2dldGlwYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnBhZGRyLCBpbnQgYWRkcmxlbik7Ci1pbnQgbGlzdGVuNihpbnQgcG9ydCk7Ci1pbnQgbGlzdGVuX3VuaXgoY2hhciAqZmlsZSk7Ci1pbnQgYWNjZXB0X3VuaXgoaW50IHMpOwotaW50IGNvbm5lY3RfdGNwKGNoYXIgKmhvc3QsIGludCBwb3J0KTsKLWludCBsaXN0ZW5fdGNwKGludCBwb3J0LCBpbl9hZGRyX3QgaWZhY2UsIGludCB0cnk2KTsKLQotc3RhdGljIGludCBnZXRfcG9ydChpbnQgc29jaywgaW50IHJlbW90ZSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2hvc3QoaW50IHNvY2ssIGludCByZW1vdGUpOwotCi1jaGFyICpob3N0MmlwKGNoYXIgKmhvc3QpIHsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0JY2hhciAqc3RyOwotCi0JaWYgKCEgaG9zdF9sb29rdXApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaHAgPSBnZXRob3N0YnluYW1lKGhvc3QpOwotCWlmICghaHApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWFkZHIuc2luX2FkZHIuc19hZGRyID0gICoodW5zaWduZWQgbG9uZyAqKWhwLT5oX2FkZHI7Ci0Jc3RyID0gc3RyZHVwKGluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7Ci0JcmV0dXJuIHN0cjsKLX0KLQotY2hhciAqcmF3Mmhvc3QoY2hhciAqcmF3LCBpbnQgbGVuKSB7Ci0JY2hhciAqc3RyOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX05FVERCX0ggJiYgTElCVk5DU0VSVkVSX0hBVkVfTkVUSU5FVF9JTl9ICi0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCi0JaWYgKCEgaG9zdF9sb29rdXApIHsKLQkJcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotCX0KLQotCWhwID0gZ2V0aG9zdGJ5YWRkcihyYXcsIGxlbiwgQUZfSU5FVCk7Ci0JaWYgKCFocCkgewotCQlyZXR1cm4gc3RyZHVwKGluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKXJhdykpKTsKLQl9Ci0Jc3RyID0gc3RyZHVwKGhwLT5oX25hbWUpOwotI2Vsc2UKLQlzdHIgPSBzdHJkdXAoInVua25vd24iKTsKLSNlbmRpZgotCXJldHVybiBzdHI7Ci19Ci0KLWNoYXIgKnJhdzJpcChjaGFyICpyYXcpIHsKLQlyZXR1cm4gc3RyZHVwKGluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKXJhdykpKTsKLX0KLQotY2hhciAqaXAyaG9zdChjaGFyICppcCkgewotCWNoYXIgKnN0cjsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9ORVREQl9IICYmIExJQlZOQ1NFUlZFUl9IQVZFX05FVElORVRfSU5fSAotCXN0cnVjdCBob3N0ZW50ICpocDsKLQlpbl9hZGRyX3QgaWFkZHI7Ci0KLQlpZiAoISBob3N0X2xvb2t1cCkgewotCQlyZXR1cm4gc3RyZHVwKCJ1bmtub3duIik7Ci0JfQotCi0JaWFkZHIgPSBpbmV0X2FkZHIoaXApOwotCWlmIChpYWRkciA9PSBodG9ubChJTkFERFJfTk9ORSkpIHsKLQkJcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotCX0KLQotCWhwID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZpYWRkciwgc2l6ZW9mKGluX2FkZHJfdCksIEFGX0lORVQpOwotCWlmICghaHApIHsKLQkJcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotCX0KLQlzdHIgPSBzdHJkdXAoaHAtPmhfbmFtZSk7Ci0jZWxzZQotCXN0ciA9IHN0cmR1cCgidW5rbm93biIpOwotI2VuZGlmCi0JcmV0dXJuIHN0cjsKLX0KLQotaW50IGlwdjZfaXAoY2hhciAqaG9zdF9pbikgewotCWNoYXIgKnAsICpob3N0LCBhWzJdOwotCWludCBuY29sID0gMCwgbmhleCA9IDA7Ci0KLQlpZiAoaG9zdF9pblswXSA9PSAnWycpICB7Ci0JCWhvc3QgPSBob3N0X2luICsgMTsKLQl9IGVsc2UgewotCQlob3N0ID0gaG9zdF9pbjsKLQl9Ci0KLQlpZiAoc3Ryc3RyKGhvc3QsICI6OmZmZmY6IikgPT0gaG9zdCB8fCBzdHJzdHIoaG9zdCwgIjo6RkZGRjoiKSA9PSBob3N0KSB7Ci0JCXJldHVybiBkb3R0ZWRfaXAoaG9zdCArIHN0cmxlbigiOjpmZmZmOiIpLCAwKTsKLQl9Ci0KLQlhWzFdID0gJ1wwJzsKLQotCXAgPSBob3N0OwotCXdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICclJyAmJiAqcCAhPSAnXScpIHsKLQkJaWYgKCpwID09ICc6JykgewotCQkJbmNvbCsrOwotCQl9IGVsc2UgewotCQkJbmhleCsrOwotCQl9Ci0JCWFbMF0gPSAqcDsKLQkJaWYgKHN0cnBicmsoYSwgIjphYmNkZWYwMTIzNDU2Nzg5IikgPT0gYSkgewotCQkJcCsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChuY29sIDwgMiB8fCBuY29sID4gOCB8fCBuaGV4ID09IDApIHsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1pbnQgZG90dGVkX2lwKGNoYXIgKmhvc3QsIGludCBwYXJ0aWFsKSB7Ci0JaW50IGxlbiwgZG90cyA9IDA7Ci0JY2hhciAqcCA9IGhvc3Q7Ci0KLQlpZiAoIWhvc3QpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBob3N0WzBdKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlsZW4gPSBzdHJsZW4oaG9zdCk7Ci0JaWYgKCFwYXJ0aWFsICYmICFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBob3N0W2xlbi0xXSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJaWYgKCpwID09ICcuJykgZG90cysrOwotCQlpZiAoKnAgPT0gJy4nIHx8IGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICgqcCkpKSB7Ci0JCQlwKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFwYXJ0aWFsICYmIGRvdHMgIT0gMykgewotCQlyZXR1cm4gMDsJCi0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGdldF9wb3J0KGludCBzb2NrLCBpbnQgcmVtb3RlKSB7Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOwotCXVuc2lnbmVkIGludCBzYWRkcl9sZW47Ci0JaW50IHNhZGRyX3BvcnQ7Ci0JCi0Jc2FkZHJfbGVuID0gc2l6ZW9mKHNhZGRyKTsKLQltZW1zZXQoJnNhZGRyLCAwLCBzaXplb2Yoc2FkZHIpKTsKLQlzYWRkcl9wb3J0ID0gLTE7Ci0JaWYgKHJlbW90ZSkgewotCQlpZiAoIWdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsICZzYWRkcl9sZW4pKSB7Ci0JCQlzYWRkcl9wb3J0ID0gbnRvaHMoc2FkZHIuc2luX3BvcnQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCAmc2FkZHJfbGVuKSkgewotCQkJc2FkZHJfcG9ydCA9IG50b2hzKHNhZGRyLnNpbl9wb3J0KTsKLQkJfQotCX0KLQlyZXR1cm4gc2FkZHJfcG9ydDsKLX0KLQotaW50IGdldF9yZW1vdGVfcG9ydChpbnQgc29jaykgewotCXJldHVybiBnZXRfcG9ydChzb2NrLCAxKTsKLX0KLQotaW50IGdldF9sb2NhbF9wb3J0KGludCBzb2NrKSB7Ci0JcmV0dXJuIGdldF9wb3J0KHNvY2ssIDApOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0X2hvc3QoaW50IHNvY2ssIGludCByZW1vdGUpIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7Ci0JdW5zaWduZWQgaW50IHNhZGRyX2xlbjsKLQlpbnQgc2FkZHJfcG9ydDsKLQljaGFyICpzYWRkcl9pcF9zdHIgPSBOVUxMOwotCQotCXNhZGRyX2xlbiA9IHNpemVvZihzYWRkcik7Ci0JbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7Ci0Jc2FkZHJfcG9ydCA9IC0xOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX05FVElORVRfSU5fSAotCWlmIChyZW1vdGUpIHsKLQkJaWYgKCFnZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCAmc2FkZHJfbGVuKSkgewotCQkJc2FkZHJfaXBfc3RyID0gaW5ldF9udG9hKHNhZGRyLnNpbl9hZGRyKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgJnNhZGRyX2xlbikpIHsKLQkJCXNhZGRyX2lwX3N0ciA9IGluZXRfbnRvYShzYWRkci5zaW5fYWRkcik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlpZiAoISBzYWRkcl9pcF9zdHIpIHsKLQkJc2FkZHJfaXBfc3RyID0gInVua25vd24iOwotCX0KLQlyZXR1cm4gc3RyZHVwKHNhZGRyX2lwX3N0cik7Ci19Ci0KLWNoYXIgKmdldF9yZW1vdGVfaG9zdChpbnQgc29jaykgewotCXJldHVybiBnZXRfaG9zdChzb2NrLCAxKTsKLX0KLQotY2hhciAqZ2V0X2xvY2FsX2hvc3QoaW50IHNvY2spIHsKLQlyZXR1cm4gZ2V0X2hvc3Qoc29jaywgMCk7Ci19Ci0KLWNoYXIgKmlkZW50X3VzZXJuYW1lKHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlDbGllbnREYXRhICpjZCA9IChDbGllbnREYXRhICopIGNsaWVudC0+Y2xpZW50RGF0YTsKLQljaGFyICpzdHIsICpuZXdob3N0LCAqdXNlciA9IE5VTEwsICpuZXd1c2VyID0gTlVMTDsKLQlpbnQgbGVuOwotCi0JaWYgKGNkKSB7Ci0JCXVzZXIgPSBjZC0+dXNlcm5hbWU7Ci0JfQotCWlmICghdXNlciB8fCAqdXNlciA9PSAnXDAnKSB7Ci0JCWludCBuLCBzb2NrLCBvayA9IDA7Ci0JCWludCBibG9jayA9IDA7Ci0JCWludCByZWZ1c2VkID0gMDsKLQotCQkvKgotCQkgKiBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgb3BlcmF0aW9uIHdpbGwgYmxvY2sgZm9yCi0JCSAqIGEgbG9uZyB0aW1lOiBhIGZpcmV3YWxsIG1heSBqdXN0IGlnbm9yZSBvdXIgcGFja2V0cy4KLQkJICovCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSwotCSAgICB7CXBpZF90IHBpZCwgcGlkdzsKLQkJaW50IHJjOwotCQlpZiAoKHBpZCA9IGZvcmsoKSkgPiAwKSB7Ci0JCQl1c2xlZXAoMTAwICogMTAwMCk7CS8qIDAuMSBzZWMgZm9yIHF1aWNrIHN1Y2Nlc3Mgb3IgcmVmdXNhbCAqLwotCQkJcGlkdyA9IHdhaXRwaWQocGlkLCAmcmMsIFdOT0hBTkcpOwotCQkJaWYgKHBpZHcgPD0gMCkgewotCQkJCXVzbGVlcCgxNTAwICogMTAwMCk7CS8qIDEuNSBzZWMgKi8KLQkJCQlwaWR3ID0gd2FpdHBpZChwaWQsICZyYywgV05PSEFORyk7Ci0JCQkJaWYgKHBpZHcgPD0gMCkgewotCQkJCQlpbnQgcmMyOwotCQkJCQlyZmJMb2coImlkZW50X3VzZXJuYW1lOiBzZXQgYmxvY2s9MSAoaHVuZylcbiIpOwotCQkJCQlibG9jayA9IDE7Ci0JCQkJCWtpbGwocGlkLCBTSUdURVJNKTsKLQkJCQkJdXNsZWVwKDEwMCAqIDEwMDApOwotCQkJCQl3YWl0cGlkKHBpZCwgJnJjMiwgV05PSEFORyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBpZHcgPiAwICYmICFibG9jaykgewotCQkJCWlmIChXSUZFWElURUQocmMpICYmIFdFWElUU1RBVFVTKHJjKSA9PSAxKSB7Ci0JCQkJCXJmYkxvZygiaWRlbnRfdXNlcm5hbWU6IHNldCByZWZ1c2VkPTEgKGV4aXQpXG4iKTsKLQkJCQkJcmVmdXNlZCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCQkJOwotCQl9IGVsc2UgewotCQkJLyogY2hpbGQgKi8KLQkJCXNpZ25hbChTSUdIVVAsICBTSUdfREZMKTsKLQkJCXNpZ25hbChTSUdJTlQsICBTSUdfREZMKTsKLQkJCXNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKLQkJCXNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKLQotCQkJaWYgKChzb2NrID0gY29ubmVjdF90Y3AoY2xpZW50LT5ob3N0LCAxMTMpKSA8IDApIHsKLQkJCQlleGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQljbG9zZShzb2NrKTsKLQkJCQlleGl0KDApOwotCQkJfQotCQl9Ci0JICAgIH0KLSNlbmRpZgotCQlpZiAoYmxvY2sgfHwgcmVmdXNlZCkgewotCQkJOwotCQl9IGVsc2UgaWYgKChzb2NrID0gY29ubmVjdF90Y3AoY2xpZW50LT5ob3N0LCAxMTMpKSA8IDApIHsKLQkJCXJmYkxvZygiaWRlbnRfdXNlcm5hbWU6IGNvdWxkIG5vdCBjb25uZWN0IHRvIGlkZW50OiAlczolZFxuIiwKLQkJCSAgICBjbGllbnQtPmhvc3QsIDExMyk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyIG1zZ1sxMjhdOwotCQkJaW50IHJldDsKLQkJCWZkX3NldCByZmRzOwotCQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0JCQlpbnQgcnBvcnQgPSBnZXRfcmVtb3RlX3BvcnQoY2xpZW50LT5zb2NrKTsKLQkJCWludCBscG9ydCA9IGdldF9sb2NhbF9wb3J0KGNsaWVudC0+c29jayk7Ci0KLQkJCXNwcmludGYobXNnLCAiJWQsICVkXHJcbiIsIHJwb3J0LCBscG9ydCk7Ci0JCQluID0gd3JpdGUoc29jaywgbXNnLCBzdHJsZW4obXNnKSk7Ci0KLQkJCUZEX1pFUk8oJnJmZHMpOwotCQkJRkRfU0VUKHNvY2ssICZyZmRzKTsKLQkJCXR2LnR2X3NlYyAgPSAzOwotCQkJdHYudHZfdXNlYyA9IDA7Ci0JCQlyZXQgPSBzZWxlY3Qoc29jaysxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsgCi0KLQkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJaW50IGk7Ci0JCQkJY2hhciAqcSwgKnA7Ci0JCQkJZm9yIChpPTA7IGkgPCAoaW50KSBzaXplb2YobXNnKTsgaSsrKSB7Ci0JCQkJCW1zZ1tpXSA9ICdcMCc7Ci0JCQkJfQotCQkJCXVzbGVlcCgyNTAqMTAwMCk7Ci0JCQkJbiA9IHJlYWQoc29jaywgbXNnLCAxMjcpOwotCQkJCWNsb3NlKHNvY2spOwotCQkJCWlmIChuIDw9IDApIGdvdG8gYmFkcmVwbHk7Ci0KLQkJCQkvKiAzMjc4MiAsIDYwMDAgOiBVU0VSSUQgOiBVTklYIDpydW5nZSAqLwotCQkJCXEgPSBzdHJzdHIobXNnLCAiVVNFUklEIik7Ci0JCQkJaWYgKCFxKSBnb3RvIGJhZHJlcGx5OwotCQkJCXEgPSBzdHJzdHIocSwgIjoiKTsKLQkJCQlpZiAoIXEpIGdvdG8gYmFkcmVwbHk7Ci0JCQkJcSsrOwotCQkJCXEgPSBzdHJzdHIocSwgIjoiKTsKLQkJCQlpZiAoIXEpIGdvdG8gYmFkcmVwbHk7Ci0JCQkJcSsrOwotCQkJCXEgPSBsYmxhbmtzKHEpOwotCQkJCXAgPSBxOwotCQkJCXdoaWxlICgqcCkgewotCQkJCQlpZiAoKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nKSB7Ci0JCQkJCQkqcCA9ICdcMCc7Ci0JCQkJCX0KLQkJCQkJcCsrOwotCQkJCX0KLQkJCQlvayA9IDE7Ci0JCQkJaWYgKHN0cmxlbihxKSA+IDI0KSB7Ci0JCQkJCSoocSsyNCkgPSAnXDAnOwotCQkJCX0KLQkJCQluZXd1c2VyID0gc3RyZHVwKHEpOwotCi0JCQkJYmFkcmVwbHk6Ci0JCQkJbiA9IDA7CS8qIGF2b2lkIHN5bnRheCBlcnJvciAqLwotCQkJfSBlbHNlIHsKLQkJCQljbG9zZShzb2NrKTsKLQkJCX0KLQkJfQotCQlpZiAoISBvayB8fCAhbmV3dXNlcikgewotCQkJbmV3dXNlciA9IHN0cmR1cCgidW5rbm93bi11c2VyIik7Ci0JCX0KLQkJaWYgKGNkKSB7Ci0JCQlpZiAoY2QtPnVzZXJuYW1lKSB7Ci0JCQkJZnJlZShjZC0+dXNlcm5hbWUpOwotCQkJfQotCQkJY2QtPnVzZXJuYW1lID0gbmV3dXNlcjsKLQkJfQotCQl1c2VyID0gbmV3dXNlcjsKLQl9Ci0JaWYgKCFzdHJjbXAodXNlciwgInVua25vd24tdXNlciIpICYmIGNkICYmIGNkLT51bml4bmFtZVswXSAhPSAnXDAnKSB7Ci0JCXVzZXIgPSBjZC0+dW5peG5hbWU7Ci0JfQotCWlmICh1bml4cHcgJiYgb3BlbnNzbF9sYXN0X2lwICYmIHN0cnN0cigiVU5JWDoiLCB1c2VyKSAhPSB1c2VyKSB7Ci0JCW5ld2hvc3QgPSBpcDJob3N0KG9wZW5zc2xfbGFzdF9pcCk7Ci0JfSBlbHNlIHsKLQkJbmV3aG9zdCA9IGlwMmhvc3QoY2xpZW50LT5ob3N0KTsKLQl9Ci0JbGVuID0gc3RybGVuKHVzZXIpICsgMSArIHN0cmxlbihuZXdob3N0KSArIDE7Ci0Jc3RyID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0Jc3ByaW50ZihzdHIsICIlc0AlcyIsIHVzZXIsIG5ld2hvc3QpOwotCWZyZWUobmV3aG9zdCk7Ci0JcmV0dXJuIHN0cjsKLX0KLQotaW50IGZpbmRfZnJlZV9wb3J0KGludCBzdGFydCwgaW50IGVuZCkgewotCWludCBwb3J0OwotCWlmIChzdGFydCA8PSAwKSB7Ci0JCXN0YXJ0ID0gMTAyNDsKLQl9Ci0JaWYgKGVuZCA8PSAwKSB7Ci0JCWVuZCA9IDY1NTMwOwotCX0KLQlmb3IgKHBvcnQgPSBzdGFydDsgcG9ydCA8PSBlbmQ7IHBvcnQrKykgIHsKLQkJaW50IHNvY2sgPSBsaXN0ZW5fdGNwKHBvcnQsIGh0b25sKElOQUREUl9BTlkpLCAwKTsKLQkJaWYgKHNvY2sgPj0gMCkgewotCQkJY2xvc2Uoc29jayk7Ci0JCQlyZXR1cm4gcG9ydDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGZpbmRfZnJlZV9wb3J0NihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQlpbnQgcG9ydDsKLQlpZiAoc3RhcnQgPD0gMCkgewotCQlzdGFydCA9IDEwMjQ7Ci0JfQotCWlmIChlbmQgPD0gMCkgewotCQllbmQgPSA2NTUzMDsKLQl9Ci0JZm9yIChwb3J0ID0gc3RhcnQ7IHBvcnQgPD0gZW5kOyBwb3J0KyspICB7Ci0JCWludCBzb2NrID0gbGlzdGVuNihwb3J0KTsKLQkJaWYgKHNvY2sgPj0gMCkgewotCQkJY2xvc2Uoc29jayk7Ci0JCQlyZXR1cm4gcG9ydDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGhhdmVfc3NoX2Vudih2b2lkKSB7Ci0JY2hhciAqc3RyLCAqcCA9IGdldGVudigiU1NIX0NPTk5FQ1RJT04iKTsKLQljaGFyICpyaG9zdCwgKnJwb3J0LCAqbGhvc3QsICpscG9ydDsKLQkKLQlpZiAoISBwKSB7Ci0JCWNoYXIgKnEgPSBnZXRlbnYoIlNTSF9DTElFTlQiKTsKLQkJaWYgKCEgcSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHN0cnN0cihxLCAiMTI3LjAuMC4xIikgIT0gTlVMTCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHN0cnN0cihwLCAiMTI3LjAuMC4xIikgIT0gTlVMTCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzdHIgPSBzdHJkdXAocCk7Ci0JCi0JcCA9IHN0cnRvayhzdHIsICIgIik7Ci0Jcmhvc3QgPSBwOwotCi0JcCA9IHN0cnRvayhOVUxMLCAiICIpOwotCWlmICghIHApIGdvdG8gZmFpbDsKLQotCXJwb3J0ID0gcDsKLQotCXAgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLQlpZiAoISBwKSBnb3RvIGZhaWw7Ci0KLQlsaG9zdCA9IHA7Ci0JCi0JcCA9IHN0cnRvayhOVUxMLCAiICIpOwotCWlmICghIHApIGdvdG8gZmFpbDsKLQotCWxwb3J0ID0gcDsKLQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiJWQvJWQgLSAnJXMnICclcydcbiIsIGF0b2kocnBvcnQpLCBhdG9pKGxwb3J0KSwgcmhvc3QsIGxob3N0KTsKLQotCWlmIChhdG9pKHJwb3J0KSA8PSAxNiB8fCBhdG9pKHJwb3J0KSA+IDY1NTM1KSB7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKGF0b2kobHBvcnQpIDw9IDE2IHx8IGF0b2kobHBvcnQpID4gNjU1MzUpIHsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmICghc3RyY21wKHJob3N0LCBsaG9zdCkpIHsKLQkJZ290byBmYWlsOwotCX0KLQotCWZyZWUoc3RyKTsKLQotCXJldHVybiAxOwotCQotCWZhaWw6Ci0KLQlmcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotY2hhciAqaXB2Nl9nZXRuYW1laW5mbyhzdHJ1Y3Qgc29ja2FkZHIgKnBhZGRyLCBpbnQgYWRkcmxlbikgewotI2lmIFgxMVZOQ19JUFY2Ci0JY2hhciBuYW1lWzIwMF07Ci0JaWYgKG5vaXB2NikgewotCQlyZXR1cm4gc3RyZHVwKCJ1bmtub3duIik7Ci0JfQotCWlmIChnZXRuYW1laW5mbyhwYWRkciwgYWRkcmxlbiwgbmFtZSwgc2l6ZW9mKG5hbWUpLCBOVUxMLCAwLCAwKSA9PSAwKSB7Ci0JCXJldHVybiBzdHJkdXAobmFtZSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotfQotCi1jaGFyICppcHY2X2dldGlwYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnBhZGRyLCBpbnQgYWRkcmxlbikgewotI2lmIFgxMVZOQ19JUFY2ICYmIGRlZmluZWQoTklfTlVNRVJJQ0hPU1QpCi0JY2hhciBuYW1lWzIwMF07Ci0JaWYgKG5vaXB2NikgewotCQlyZXR1cm4gc3RyZHVwKCJ1bmtub3duIik7Ci0JfQotCWlmIChnZXRuYW1laW5mbyhwYWRkciwgYWRkcmxlbiwgbmFtZSwgc2l6ZW9mKG5hbWUpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCkgPT0gMCkgewotCQlyZXR1cm4gc3RyZHVwKG5hbWUpOwotCX0KLSNlbmRpZgotCXJldHVybiBzdHJkdXAoInVua25vd24iKTsKLX0KLQotaW50IGxpc3RlbjYoaW50IHBvcnQpIHsKLSNpZiBYMTFWTkNfSVBWNgotCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luOwotCWludCBmZCA9IC0xLCBvbmUgPSAxOwotCi0JaWYgKG5vaXB2NikgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChwb3J0IDw9IDAgfHwgNjU1MzUgPCBwb3J0KSB7Ci0JCS8qIGZvciB1cywgaW52YWxpZCBwb3J0IG1lYW5zIGRvIG5vdCBsaXN0ZW4uICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlmZCA9IHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApOwotCWlmIChmZCA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW42OiBzb2NrZXQiKTsKLQkJcmZiTG9nKCIoSWdub3JlIHRoZSBhYm92ZSBlcnJvciBpZiB0aGlzIHN5c3RlbSBpcyBJUHY0LW9ubHkuKVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW42OiBzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUiIpOyAKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0jaWYgZGVmaW5lZChTT0xfSVBWNikgJiYgZGVmaW5lZChJUFY2X1Y2T05MWSkKLQlpZiAoc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfVjZPTkxZLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW42OiBzZXRzb2Nrb3B0IElQVjZfVjZPTkxZIik7IAotCQljbG9zZShmZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0jZW5kaWYKLQotCW1lbXNldCgoY2hhciAqKSZzaW4sIDAsIHNpemVvZihzaW4pKTsKLQlzaW4uc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLQlzaW4uc2luNl9wb3J0ICAgPSBodG9ucyhwb3J0KTsKLQlzaW4uc2luNl9hZGRyICAgPSBpbjZhZGRyX2FueTsKLQotCWlmIChsaXN0ZW5fc3RyNikgewotCQlpZiAoIXN0cmNtcChsaXN0ZW5fc3RyNiwgImxvY2FsaG9zdCIpIHx8ICFzdHJjbXAobGlzdGVuX3N0cjYsICI6OjEiKSkgewotCQkJc2luLnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgZXJyOwotCQkJc3RydWN0IGFkZHJpbmZvICphaTsKLQkJCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKLQkJCWNoYXIgc2VydmljZVszMl07Ci0KLQkJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCQkJc3ByaW50ZihzZXJ2aWNlLCAiJWQiLCBwb3J0KTsKLQotCQkJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotI2lmZGVmIEFJX0FERFJDT05GSUcKLQkJCWhpbnRzLmFpX2ZsYWdzIHw9IEFJX0FERFJDT05GSUc7Ci0jZW5kaWYKLSNpZmRlZiBBSV9OVU1FUklDSE9TVAotCQkJaWYoaXB2Nl9pcChsaXN0ZW5fc3RyNikpIHsKLQkJCQloaW50cy5haV9mbGFncyB8PSBBSV9OVU1FUklDSE9TVDsKLQkJCX0KLSNlbmRpZgotI2lmZGVmIEFJX05VTUVSSUNTRVJWCi0JCQloaW50cy5haV9mbGFncyB8PSBBSV9OVU1FUklDU0VSVjsKLSNlbmRpZgotCQkJZXJyID0gZ2V0YWRkcmluZm8obGlzdGVuX3N0cjYsIHNlcnZpY2UsICZoaW50cywgJmFpKTsKLQkJCWlmIChlcnIgPT0gMCkgewotCQkJCXN0cnVjdCBhZGRyaW5mbyAqYXAgPSBhaTsKLQkJCQllcnIgPSAxOwotCQkJCXdoaWxlIChhcCAhPSBOVUxMKSB7Ci0JCQkJCWNoYXIgKnMgPSBpcHY2X2dldGlwYWRkcihhcC0+YWlfYWRkciwgYXAtPmFpX2FkZHJsZW4pOwotCQkJCQlpZiAoIXMpIHMgPSBzdHJkdXAoInVua25vd24iKTsKLQotCQkJCQlyZmJMb2coImxpc3RlbjY6IGNoZWNraW5nOiAlcyBmYW1pbHk6ICVkXG4iLCBzLCBhcC0+YWlfZmFtaWx5KTsgCi0JCQkJCWlmIChhcC0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCQkJCQltZW1jcHkoKGNoYXIgKikmc2luLCBhcC0+YWlfYWRkciwgc2l6ZW9mKHNpbikpOwotCQkJCQkJcmZiTG9nKCJsaXN0ZW42OiB1c2luZzogICAgJXMgc2NvcGVfaWQ6ICVkXG4iLCBzLCBzaW4uc2luNl9zY29wZV9pZCk7IAotCQkJCQkJZXJyID0gMDsKLQkJCQkJCWZyZWUocyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlmcmVlKHMpOwotCQkJCQlhcCA9IGFwLT5haV9uZXh0OwotCQkJCX0KLQkJCQlmcmVlYWRkcmluZm8oYWkpOwotCQkJfQotCi0JCQlpZiAoZXJyICE9IDApIHsKLQkJCQlyZmJMb2coIkludmFsaWQgb3IgVW5zdXBwb3J0ZWQgLWxpc3RlbjYgc3RyaW5nOiAlc1xuIiwgbGlzdGVuX3N0cjYpOwotCQkJCWNsb3NlKGZkKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGFsbG93X2xpc3QgJiYgIXN0cmNtcChhbGxvd19saXN0LCAiMTI3LjAuMC4xIikpIHsKLQkJc2luLnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7Ci0JfSBlbHNlIGlmIChsaXN0ZW5fc3RyKSB7Ci0JCWlmICghc3RyY21wKGxpc3Rlbl9zdHIsICJsb2NhbGhvc3QiKSkgewotCQkJc2luLnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7Ci0JCX0KLQl9Ci0KLQlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCBzaXplb2Yoc2luKSkgPCAwKSB7Ci0JCXJmYkxvZ1BlcnJvcigibGlzdGVuNjogYmluZCIpOyAKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChsaXN0ZW4oZmQsIDMyKSA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW42OiBsaXN0ZW4iKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBmZDsKLSNlbHNlCi0JaWYgKHBvcnQpIHt9Ci0JcmV0dXJuIC0xOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfU09DS0VUX0gKLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNlbmRpZgotCi1pbnQgbGlzdGVuX3VuaXgoY2hhciAqZmlsZSkgewotI2lmICFkZWZpbmVkKEFGX1VOSVgpIHx8ICFkZWZpbmVkKExJQlZOQ1NFUlZFUl9IQVZFX1NZU19TT0NLRVRfSCkKLQlpZiAoc29jaykge30KLQlyZXR1cm4gLTE7Ci0jZWxzZQotCWludCBzLCBsZW47Ci0Jc3RydWN0IHNvY2thZGRyX3VuIHNhdW47Ci0KLQlzID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAocyA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW5fdW5peDogc29ja2V0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2F1bi5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLQlzdHJjcHkoc2F1bi5zdW5fcGF0aCwgZmlsZSk7Ci0JdW5saW5rKGZpbGUpOwotCi0JbGVuID0gc2l6ZW9mKHNhdW4uc3VuX2ZhbWlseSkgKyBzdHJsZW4oc2F1bi5zdW5fcGF0aCk7Ci0KLQlpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnNhdW4sIGxlbikgPCAwKSB7Ci0JCXJmYkxvZ1BlcnJvcigibGlzdGVuX3VuaXg6IGJpbmQiKTsKLQkJY2xvc2Uocyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAobGlzdGVuKHMsIDMyKSA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJsaXN0ZW5fdW5peDogbGlzdGVuIik7Ci0JCWNsb3NlKHMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJmYkxvZygibGlzdGVuaW5nIG9uIHVuaXggc29ja2V0OiAlcyBmZD0lZFxuIiwgZmlsZSwgcyk7Ci0JcmV0dXJuIHM7Ci0jZW5kaWYKLX0KLQotaW50IGFjY2VwdF91bml4KGludCBzKSB7Ci0jaWYgIWRlZmluZWQoQUZfVU5JWCkgfHwgIWRlZmluZWQoTElCVk5DU0VSVkVSX0hBVkVfU1lTX1NPQ0tFVF9IKQotCWlmIChzKSB7fQotCXJldHVybiAtMTsKLSNlbHNlCi0JaW50IGZkLCBmcm9tbGVuOwotCXN0cnVjdCBzb2NrYWRkcl91biBmc2F1bjsKLQotCWZkID0gYWNjZXB0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnNhdW4sICZmcm9tbGVuKTsKLQlpZiAoZmQgPCAwKSB7Ci0JCXJmYkxvZ1BlcnJvcigiYWNjZXB0X3VuaXg6IGFjY2VwdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBmZDsKLSNlbmRpZgotfQotCi1pbnQgY29ubmVjdF90Y3AoY2hhciAqaG9zdCwgaW50IHBvcnQpIHsKLQlkb3VibGUgdDAgPSBkbm93KCk7Ci0JaW50IGZkID0gLTE7Ci0JaW50IGZhaWw0ID0gbm9pcHY0OwotCWlmIChnZXRlbnYoIklQVjRfRkFJTFMiKSkgewotCQlmYWlsNCA9IDI7Ci0JfQotCi0JcmZiTG9nKCJjb25uZWN0X3RjcDogdHJ5aW5nOiAgICVzICVkXG4iLCBob3N0LCBwb3J0KTsKLQotCWlmIChmYWlsNCkgewotCQlpZiAoZmFpbDQgPiAxKSB7Ci0JCQlyZmJMb2coIlRFU1RJTkc6IElQVjRfRkFJTFMgZm9yIGNvbm5lY3RfdGNwLlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlmZCA9IHJmYkNvbm5lY3RUb1RjcEFkZHIoaG9zdCwgcG9ydCk7Ci0JfQotCi0JaWYgKGZkID49IDApIHsKLQkJcmV0dXJuIGZkOwotCX0KLQlyZmJMb2dQZXJyb3IoImNvbm5lY3RfdGNwOiBjb25uZWN0aW9uIGZhaWxlZCIpOwotCi0JaWYgKGRub3coKSAtIHQwIDwgNC4wKSB7Ci0JCXJmYkxvZygiY29ubmVjdF90Y3A6IHJlLXRyeWluZyAlcyAlZFxuIiwgaG9zdCwgcG9ydCk7Ci0JCXVzbGVlcCAoMTAwICogMTAwMCk7Ci0JCWlmICghZmFpbDQpIHsKLQkJCWZkID0gcmZiQ29ubmVjdFRvVGNwQWRkcihob3N0LCBwb3J0KTsKLQkJfQotCQlpZiAoZmQgPCAwKSB7Ci0JCQlyZmJMb2dQZXJyb3IoImNvbm5lY3RfdGNwOiBjb25uZWN0aW9uIGZhaWxlZCIpOwotCQl9Ci0JfQotCi0JaWYgKGZkIDwgMCAmJiAhbm9pcHY2KSB7Ci0jaWYgWDExVk5DX0lQVjYKLQkJaW50IGVycjsKLQkJc3RydWN0IGFkZHJpbmZvICphaTsKLQkJc3RydWN0IGFkZHJpbmZvIGhpbnRzOwotCQljaGFyIHNlcnZpY2VbMzJdLCAqaG9zdDIsICpxOwotCi0JCXJmYkxvZygiY29ubmVjdF90Y3A6IHRyeWluZyBJUHY2ICVzICVkXG4iLCBob3N0LCBwb3J0KTsKLQotCQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLQkJc3ByaW50ZihzZXJ2aWNlLCAiJWQiLCBwb3J0KTsKLQotCQloaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0JCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0jaWZkZWYgQUlfQUREUkNPTkZJRwotCQloaW50cy5haV9mbGFncyB8PSBBSV9BRERSQ09ORklHOwotI2VuZGlmCi0JCWlmKGlwdjZfaXAoaG9zdCkpIHsKLSNpZmRlZiBBSV9OVU1FUklDSE9TVAotCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY2XTogc2V0dGluZyBBSV9OVU1FUklDSE9TVCBmb3IgJXNcbiIsIGhvc3QpOwotCQkJaGludHMuYWlfZmxhZ3MgfD0gQUlfTlVNRVJJQ0hPU1Q7Ci0jZW5kaWYKLQkJfQotI2lmZGVmIEFJX05VTUVSSUNTRVJWCi0JCWhpbnRzLmFpX2ZsYWdzIHw9IEFJX05VTUVSSUNTRVJWOwotI2VuZGlmCi0KLQkJaWYgKCFzdHJjbXAoaG9zdCwgIjEyNy4wLjAuMSIpKSB7Ci0JCQlob3N0MiA9IHN0cmR1cCgiOjoxIik7Ci0JCX0gZWxzZSBpZiAoaG9zdFswXSA9PSAnWycpIHsKLQkJCWhvc3QyID0gc3RyZHVwKGhvc3QrMSk7Ci0JCX0gZWxzZSB7Ci0JCQlob3N0MiA9IHN0cmR1cChob3N0KTsKLQkJfQotCQlxID0gc3RycmNocihob3N0MiwgJ10nKTsKLQkJaWYgKHEpIHsKLQkJCSpxID0gJ1wwJzsKLQkJfQotCi0JCWVyciA9IGdldGFkZHJpbmZvKGhvc3QyLCBzZXJ2aWNlLCAmaGludHMsICZhaSk7Ci0JCWlmIChlcnIgIT0gMCkgewotCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY2XTogZ2V0YWRkcmluZm9bJWRdOiAlc1xuIiwgZXJyLCBnYWlfc3RyZXJyb3IoZXJyKSk7Ci0JCQl1c2xlZXAoMTAwICogMTAwMCk7Ci0JCQllcnIgPSBnZXRhZGRyaW5mbyhob3N0Miwgc2VydmljZSwgJmhpbnRzLCAmYWkpOwotCQl9Ci0JCWZyZWUoaG9zdDIpOwotCi0JCWlmIChlcnIgIT0gMCkgewotCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY2XTogZ2V0YWRkcmluZm9bJWRdOiAlc1xuIiwgZXJyLCBnYWlfc3RyZXJyb3IoZXJyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYWRkcmluZm8gKmFwID0gYWk7Ci0JCQl3aGlsZSAoYXAgIT0gTlVMTCkgewotCQkJCWludCBzb2NrOwotCi0JCQkJaWYgKGZhaWw0KSB7Ci0JCQkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2cHRyOwotCQkJCQlpZiAoYXAtPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikgewotCQkJCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY2XTogc2tpcHBpbmcgQUZfSU5FVCBhZGRyZXNzIHVuZGVyIC1ub2lwdjRcbiIpOwotCQkJCQkJYXAgPSBhcC0+YWlfbmV4dDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0jaWZkZWYgSU42X0lTX0FERFJfVjRNQVBQRUQKLQkJCQkJczZwdHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBhcC0+YWlfYWRkcjsKLQkJCQkJaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKCYoczZwdHItPnNpbjZfYWRkcikpKSB7Ci0JCQkJCQlyZmJMb2coImNvbm5lY3RfdGNwW2lwdjZdOiBza2lwcGluZyBWNE1BUFBFRCBhZGRyZXNzIHVuZGVyIC1ub2lwdjRcbiIpOwotCQkJCQkJYXAgPSBhcC0+YWlfbmV4dDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0jZW5kaWYKLQkJCQl9Ci0KLQkJCQlzb2NrID0gc29ja2V0KGFwLT5haV9mYW1pbHksIGFwLT5haV9zb2NrdHlwZSwgYXAtPmFpX3Byb3RvY29sKTsKLQotCQkJCWlmIChzb2NrID09IC0xKSB7Ci0JCQkJCXJmYkxvZ1BlcnJvcigiY29ubmVjdF90Y3BbaXB2Nl06IHNvY2tldCIpOwotCQkJCQlpZiAoMCkgcmZiTG9nKCIoSWdub3JlIHRoZSBhYm92ZSBlcnJvciBpZiB0aGlzIHN5c3RlbSBpcyBJUHY0LW9ubHkuKVxuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IHJlcyA9IC0xLCBkbXNnID0gMDsKLQkJCQkJY2hhciAqcyA9IGlwdjZfZ2V0aXBhZGRyKGFwLT5haV9hZGRyLCBhcC0+YWlfYWRkcmxlbik7Ci0JCQkJCWlmICghcykgcyA9IHN0cmR1cCgidW5rbm93biIpOwotCi0JCQkJCXJmYkxvZygiY29ubmVjdF90Y3BbaXB2Nl06IHRyeWluZyBzb2NrPSVkIGZhbT0lZCBwcm90bz0lZCB1c2luZyAlc1xuIiwKLQkJCQkJICAgIHNvY2ssIGFwLT5haV9mYW1pbHksIGFwLT5haV9wcm90b2NvbCwgcyk7Ci0JCQkJCXJlcyA9IGNvbm5lY3Qoc29jaywgYXAtPmFpX2FkZHIsIGFwLT5haV9hZGRybGVuKTsKLSNpZiBkZWZpbmVkKFNPTF9JUFY2KSAmJiBkZWZpbmVkKElQVjZfVjZPTkxZKQotCQkJCQlpZiAocmVzICE9IDApIHsKLQkJCQkJCWludCB6ZXJvID0gMDsKLQkJCQkJCXJmYkxvZ1BlcnJvcigiY29ubmVjdF90Y3BbaXB2Nl06IGNvbm5lY3QiKTsKLQkJCQkJCWRtc2cgPSAxOwotCQkJCQkJaWYgKHNldHNvY2tvcHQoc29jaywgU09MX0lQVjYsIElQVjZfVjZPTkxZLCAoY2hhciAqKSZ6ZXJvLCBzaXplb2YoemVybykpID09IDApIHsKLQkJCQkJCQlyZmJMb2coImNvbm5lY3RfdGNwW2lwdjZdOiB0cnlpbmcgYWdhaW4gd2l0aCBJUFY2X1Y2T05MWT0wXG4iKTsKLQkJCQkJCQlyZXMgPSBjb25uZWN0KHNvY2ssIGFwLT5haV9hZGRyLCBhcC0+YWlfYWRkcmxlbik7Ci0JCQkJCQkJZG1zZyA9IDA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJmYkxvZ1BlcnJvcigiY29ubmVjdF90Y3BbaXB2Nl06IHNldHNvY2tvcHQgSVBWNl9WNk9OTFkiKTsKLQkJCQkJCX0KLQkJCQkJfQotI2VuZGlmCi0JCQkJCWlmIChyZXMgPT0gMCkgewotCQkJCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY2XTogY29ubmVjdCBPS1xuIik7Ci0JCQkJCQlmZCA9IHNvY2s7Ci0JCQkJCQlpZiAoIWlwdjZfY2xpZW50X2lwX3N0cikgewotCQkJCQkJCWlwdjZfY2xpZW50X2lwX3N0ciA9IHN0cmR1cChzKTsKLQkJCQkJCX0KLQkJCQkJCWZyZWUocyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghZG1zZykgcmZiTG9nUGVycm9yKCJjb25uZWN0X3RjcFtpcHY2XTogY29ubmVjdCIpOwotCQkJCQkJY2xvc2Uoc29jayk7Ci0JCQkJCX0KLQkJCQkJZnJlZShzKTsKLQkJCQl9Ci0JCQkJYXAgPSBhcC0+YWlfbmV4dDsKLQkJCX0KLQkJCWZyZWVhZGRyaW5mbyhhaSk7Ci0JCX0KLSNlbmRpZgotCX0KLQlpZiAoZmQgPCAwICYmICFmYWlsNCkgewotCQkvKiB0aGlzIGlzIGEga2x1ZGdlIGZvciBJUHY0LW9ubHkgbWFjaGluZXMgZ2V0dGluZyB2NG1hcHBlZCBzdHJpbmcuICovCi0JCWNoYXIgKnEsICpob3N0MjsKLQkJaWYgKGhvc3RbMF0gPT0gJ1snKSB7Ci0JCQlob3N0MiA9IHN0cmR1cChob3N0KzEpOwotCQl9IGVsc2UgewotCQkJaG9zdDIgPSBzdHJkdXAoaG9zdCk7Ci0JCX0KLQkJcSA9IHN0cnJjaHIoaG9zdDIsICddJyk7Ci0JCWlmIChxKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0KLQkJaWYgKHN0cnN0cihob3N0MiwgIjo6ZmZmZjoiKSA9PSBob3N0MiB8fCBzdHJzdHIoaG9zdDIsICI6OkZGRkY6IikgPT0gaG9zdDIpIHsKLQkJCWNoYXIgKmhvc3QzID0gaG9zdDIgKyBzdHJsZW4oIjo6ZmZmZjoiKTsKLQkJCWlmIChkb3R0ZWRfaXAoaG9zdDMsIDApKSB7Ci0JCQkJcmZiTG9nKCJjb25uZWN0X3RjcFtpcHY0XTogdHJ5aW5nIGZhbGxiYWNrIHRvIElQdjQgZm9yICVzXG4iLCBob3N0Mik7Ci0JCQkJZmQgPSByZmJDb25uZWN0VG9UY3BBZGRyKGhvc3QzLCBwb3J0KTsKLQkJCQlpZiAoZmQgPCAwKSB7Ci0JCQkJCXJmYkxvZ1BlcnJvcigiY29ubmVjdF90Y3BbaXB2NF06IGNvbm5lY3Rpb24gZmFpbGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZyZWUoaG9zdDIpOwotCX0KLQlyZXR1cm4gZmQ7Ci19Ci0KLWludCBsaXN0ZW5fdGNwKGludCBwb3J0LCBpbl9hZGRyX3QgaWZhY2UsIGludCB0cnk2KSB7Ci0JaW50IGZkID0gLTE7Ci0JaW50IGZhaWw0ID0gbm9pcHY0OwotCWlmIChnZXRlbnYoIklQVjRfRkFJTFMiKSkgewotCQlmYWlsNCA9IDI7Ci0JfQotCi0JaWYgKHBvcnQgPD0gMCB8fCA2NTUzNSA8IHBvcnQpIHsKLQkJLyogZm9yIHVzLCBpbnZhbGlkIHBvcnQgbWVhbnMgZG8gbm90IGxpc3Rlbi4gKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChmYWlsNCkgewotCQlpZiAoZmFpbDQgPiAxKSB7Ci0JCQlyZmJMb2coIlRFU1RJTkc6IElQVjRfRkFJTFMgZm9yIGxpc3Rlbl90Y3A6IHBvcnQ9JWQgdHJ5Nj0lZFxuIiwgcG9ydCwgdHJ5Nik7Ci0JCX0KLQl9IGVsc2UgewotCQlmZCA9IHJmYkxpc3Rlbk9uVENQUG9ydChwb3J0LCBpZmFjZSk7Ci0JfQotCi0JaWYgKGZkID49IDApIHsKLQkJcmV0dXJuIGZkOwotCX0KLQlpZiAoZmFpbDQgPiAxKSB7Ci0JCXJmYkxvZ1BlcnJvcigibGlzdGVuX3RjcDogbGlzdGVuIGZhaWxlZCIpOwotCX0KLQotCWlmIChmZCA8IDAgJiYgdHJ5NiAmJiBpcHY2X2xpc3RlbiAmJiAhbm9pcHY2KSB7Ci0jaWYgWDExVk5DX0lQVjYKLQkJY2hhciAqc2F2ZSA9IGxpc3Rlbl9zdHI2OwotCQlpZiAoaWZhY2UgPT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSkgewotCQkJbGlzdGVuX3N0cjYgPSAibG9jYWxob3N0IjsKLQkJCXJmYkxvZygibGlzdGVuX3RjcDogcmV0cnlpbmcgb24gSVB2NiBpbjZhZGRyX2xvb3BiYWNrIC4uLlxuIik7Ci0JCQlmZCA9IGxpc3RlbjYocG9ydCk7Ci0JCX0gZWxzZSBpZiAoaWZhY2UgPT0gaHRvbmwoSU5BRERSX0FOWSkpIHsKLQkJCWxpc3Rlbl9zdHI2ID0gTlVMTDsKLQkJCXJmYkxvZygibGlzdGVuX3RjcDogcmV0cnlpbmcgb24gSVB2NiBpbjZhZGRyX2FueSAuLi5cbiIpOwotCQkJZmQgPSBsaXN0ZW42KHBvcnQpOwotCQl9Ci0JCWxpc3Rlbl9zdHI2ID0gc2F2ZTsKLSNlbmRpZgotCX0KLQlyZXR1cm4gZmQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9pbmV0LmggYi94MTF2bmMvaW5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkYmI0Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9pbmV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19JTkVUX0gKLSNkZWZpbmUgX1gxMVZOQ19JTkVUX0gKLQotLyogLS0gaW5ldC5oIC0tICovCi0KLWV4dGVybiBjaGFyICpob3N0MmlwKGNoYXIgKmhvc3QpOwotZXh0ZXJuIGNoYXIgKnJhdzJob3N0KGNoYXIgKnJhdywgaW50IGxlbik7Ci1leHRlcm4gY2hhciAqcmF3MmlwKGNoYXIgKnJhdyk7Ci1leHRlcm4gY2hhciAqaXAyaG9zdChjaGFyICppcCk7Ci1leHRlcm4gaW50IGlwdjZfaXAoY2hhciAqaG9zdCk7Ci1leHRlcm4gaW50IGRvdHRlZF9pcChjaGFyICpob3N0LCBpbnQgcGFydGlhbCk7Ci1leHRlcm4gaW50IGdldF9yZW1vdGVfcG9ydChpbnQgc29jayk7Ci1leHRlcm4gaW50IGdldF9sb2NhbF9wb3J0KGludCBzb2NrKTsKLWV4dGVybiBjaGFyICpnZXRfcmVtb3RlX2hvc3QoaW50IHNvY2spOwotZXh0ZXJuIGNoYXIgKmdldF9sb2NhbF9ob3N0KGludCBzb2NrKTsKLWV4dGVybiBjaGFyICppZGVudF91c2VybmFtZShyZmJDbGllbnRQdHIgY2xpZW50KTsKLWV4dGVybiBpbnQgZmluZF9mcmVlX3BvcnQoaW50IHN0YXJ0LCBpbnQgZW5kKTsKLWV4dGVybiBpbnQgZmluZF9mcmVlX3BvcnQ2KGludCBzdGFydCwgaW50IGVuZCk7Ci1leHRlcm4gaW50IGhhdmVfc3NoX2Vudih2b2lkKTsKLWV4dGVybiBjaGFyICppcHY2X2dldG5hbWVpbmZvKHN0cnVjdCBzb2NrYWRkciAqcGFkZHIsIGludCBhZGRybGVuKTsKLWV4dGVybiBjaGFyICppcHY2X2dldGlwYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnBhZGRyLCBpbnQgYWRkcmxlbik7Ci1leHRlcm4gaW50IGxpc3RlbjYoaW50IHBvcnQpOwotZXh0ZXJuIGludCBsaXN0ZW5fdW5peChjaGFyICpmaWxlKTsKLWV4dGVybiBpbnQgYWNjZXB0X3VuaXgoaW50IHMpOwotZXh0ZXJuIGludCBjb25uZWN0X3RjcChjaGFyICpob3N0LCBpbnQgcG9ydCk7Ci1leHRlcm4gaW50IGxpc3Rlbl90Y3AoaW50IHBvcnQsIGluX2FkZHJfdCBpZmFjZSwgaW50IHRyeTYpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19JTkVUX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9rZXlib2FyZC5jIGIveDExdm5jL2tleWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZmY3MGUuLjAwMDAwMDAKLS0tIGEveDExdm5jL2tleWJvYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDE4ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0ga2V5Ym9hcmQuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAieHJlY29yZC5oIgotI2luY2x1ZGUgInhpbmVyYW1hLmgiCi0jaW5jbHVkZSAicG9pbnRlci5oIgotI2luY2x1ZGUgInVzZXJpbnB1dC5oIgotI2luY2x1ZGUgIndpbl91dGlscy5oIgotI2luY2x1ZGUgInJhdGVzLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgImFsbG93ZWRfaW5wdXRfdC5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgInY0bC5oIgotI2luY2x1ZGUgImxpbnV4ZmIuaCIKLSNpbmNsdWRlICJ1aW5wdXQuaCIKLSNpbmNsdWRlICJtYWNvc3guaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLQotdm9pZCBnZXRfa2V5c3RhdGUoaW50ICprZXlzdGF0ZSk7Ci12b2lkIGNsZWFyX21vZGlmaWVycyhpbnQgaW5pdCk7Ci1pbnQgdHJhY2tfbW9kX3N0YXRlKHJmYktleVN5bSBrZXlzeW0sIHJmYkJvb2wgZG93biwgcmZiQm9vbCBzZXQpOwotdm9pZCBjbGVhcl9rZXlzKHZvaWQpOwotdm9pZCBjbGVhcl9sb2Nrcyh2b2lkKTsKLWludCBnZXRfYXV0b3JlcGVhdF9zdGF0ZSh2b2lkKTsKLWludCBnZXRfaW5pdGlhbF9hdXRvcmVwZWF0X3N0YXRlKHZvaWQpOwotdm9pZCBhdXRvcmVwZWF0KGludCByZXN0b3JlLCBpbnQgYmVxdWlldCk7Ci12b2lkIGNoZWNrX2FkZF9rZXlzeW1zKHZvaWQpOwotaW50IGFkZF9rZXlzeW0oS2V5U3ltIGtleXN5bSk7Ci12b2lkIGRlbGV0ZV9hZGRlZF9rZXljb2RlcyhpbnQgYmVxdWlldCk7Ci12b2lkIGluaXRpYWxpemVfcmVtYXAoY2hhciAqaW5maWxlKTsKLWludCBzbG9wcHlfa2V5X2NoZWNrKGludCBrZXksIHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgaW50ICpuZXdfa2MpOwotdm9pZCBzd2l0Y2hfdG9feGtiX2lmX2JldHRlcih2b2lkKTsKLWNoYXIgKnNob3J0X2ttYmNmKGNoYXIgKnN0cik7Ci12b2lkIGluaXRpYWxpemVfYWxsb3dlZF9pbnB1dCh2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV9tb2R0d2Vhayh2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV9rZXlib2FyZF9hbmRfcG9pbnRlcih2b2lkKTsKLXZvaWQgZ2V0X2FsbG93ZWRfaW5wdXQocmZiQ2xpZW50UHRyIGNsaWVudCwgYWxsb3dlZF9pbnB1dF90ICppbnB1dCk7Ci1kb3VibGUgdHlwaW5nX3JhdGUoZG91YmxlIHRpbWVfd2luZG93LCBpbnQgKnJlcGVhdGluZyk7Ci1pbnQgc2tpcF9jcl93aGVuX3NjYWxpbmcoY2hhciAqbW9kZSk7Ci12b2lkIGtleWJvYXJkKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci0KLQotc3RhdGljIHZvaWQgZGVsZXRlX2tleWNvZGUoS2V5Q29kZSBrYywgaW50IGJlcXVpZXQpOwotc3RhdGljIGludCBjb3VudF9hZGRlZF9rZXljb2Rlcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGFkZF9yZW1hcChjaGFyICpsaW5lKTsKLXN0YXRpYyB2b2lkIGFkZF9kZWFkX2tleXN5bXMoY2hhciAqc3RyKTsKLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfeGtiX21vZHR3ZWFrKHZvaWQpOwotc3RhdGljIHZvaWQgeGtiX3R3ZWFrX2tleWJvYXJkKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwKLSAgICByZmJDbGllbnRQdHIgY2xpZW50KTsKLXN0YXRpYyB2b2lkIHR3ZWFrX21vZChzaWduZWQgY2hhciBtb2QsIHJmYkJvb2wgZG93bik7Ci1zdGF0aWMgdm9pZCBtb2RpZmllcl90d2Vha19rZXlib2FyZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sCi0gICAgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1zdGF0aWMgdm9pZCBwaXBlX2tleWJvYXJkKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci0KLQotLyoKLSAqIFJvdXRpbmUgdG8gcmV0cmVpdmUgY3VycmVudCBzdGF0ZSBrZXlib2FyZC4gIDEgbWVhbnMgZG93biwgMCB1cC4KLSAqLwotdm9pZCBnZXRfa2V5c3RhdGUoaW50ICprZXlzdGF0ZSkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFrZXlzdGF0ZSkge30KLQlyZXR1cm47Ci0jZWxzZQotCWludCBpLCBrOwotCWNoYXIga2V5c1szMl07Ci0KLQlSQVdGQl9SRVRfVk9JRAotCQotCS8qIG4uYi4gY2FsbGVyIGRlY2lkZXMgdG8gWF9MT0NLIG9yIG5vdC4gKi8KLQlYUXVlcnlLZXltYXAoZHB5LCBrZXlzKTsKLQlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7Ci0JCWNoYXIgYyA9IGtleXNbaV07Ci0KLQkJZm9yIChrPTA7IGsgPCA4OyBrKyspIHsKLQkJCWlmIChjICYgMHgxKSB7Ci0JCQkJa2V5c3RhdGVbOCppICsga10gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlrZXlzdGF0ZVs4KmkgKyBrXSA9IDA7Ci0JCQl9Ci0JCQljID0gYyA+PiAxOwotCQl9Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0vKgotICogVHJ5IHRvIEtleVJlbGVhc2UgYW55IG5vbi1Mb2NrIG1vZGlmaWVycyB0aGF0IGFyZSBkb3duLgotICovCi12b2lkIGNsZWFyX21vZGlmaWVycyhpbnQgaW5pdCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFpbml0KSB7fQotCXJldHVybjsKLSNlbHNlCi0Jc3RhdGljIEtleUNvZGUga2V5Y29kZXNbMjU2XTsKLQlzdGF0aWMgS2V5U3ltICBrZXlzeW1zWzI1Nl07Ci0Jc3RhdGljIGNoYXIgKmtleXN0cnNbMjU2XTsKLQlzdGF0aWMgaW50IGtjb3VudCA9IDAsIGZpcnN0ID0gMTsKLQlpbnQga2V5c3RhdGVbMjU2XTsKLQlpbnQgaSwgaiwgbWlua2V5LCBtYXhrZXksIHN5bXNfcGVyX2tleWNvZGU7Ci0JS2V5U3ltICprZXltYXA7Ci0JS2V5U3ltIGtleXN5bTsKLQlLZXlDb2RlIGtleWNvZGU7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JLyogbi5iLiBjYWxsZXIgZGVjaWRlcyB0byBYX0xPQ0sgb3Igbm90LiAqLwotCWlmIChmaXJzdCkgewotCQkvKgotCQkgKiB3ZSBzdG9yZSByZXN1bHRzIGluIHN0YXRpYyBhcnJheXMsIHRvIGFpZCBpbnRlcnJ1cHRlZAotCQkgKiBjYXNlLCBidXQgbW9kaWZpZXJzIGNvdWxkIGhhdmUgY2hhbmdlZCBkdXJpbmcgc2Vzc2lvbi4uLgotCQkgKi8KLQkJWERpc3BsYXlLZXljb2RlcyhkcHksICZtaW5rZXksICZtYXhrZXkpOwotCi0JCWtleW1hcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZHB5LCBtaW5rZXksIChtYXhrZXkgLSBtaW5rZXkgKyAxKSwKLQkJICAgICZzeW1zX3Blcl9rZXljb2RlKTsKLQotCQlmb3IgKGkgPSBtaW5rZXk7IGkgPD0gbWF4a2V5OyBpKyspIHsKLQkJICAgIGZvciAoaiA9IDA7IGogPCBzeW1zX3Blcl9rZXljb2RlOyBqKyspIHsKLQkJCWNoYXIgKnN0cjsKLQkJCWtleXN5bSA9IGtleW1hcFsgKGkgLSBtaW5rZXkpICogc3ltc19wZXJfa2V5Y29kZSArIGogXTsKLQkJCWlmIChrZXlzeW0gPT0gTm9TeW1ib2wgfHwgISBpc21vZGtleShrZXlzeW0pKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkcHksIGtleXN5bSk7Ci0JCQlpZiAoa2V5Y29kZSA9PSBOb1N5bWJvbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJa2V5Y29kZXNba2NvdW50XSA9IGtleWNvZGU7Ci0JCQlrZXlzeW1zW2tjb3VudF0gID0ga2V5c3ltOwotCQkJc3RyID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0JCQlpZiAoISBzdHIpIHN0ciA9ICJudWxsIjsKLQkJCWtleXN0cnNba2NvdW50XSAgPSBzdHJkdXAoc3RyKTsKLQkJCWtjb3VudCsrOwotCQkgICAgfQotCQl9Ci0JCVhGcmVlX3dyKCh2b2lkICopIGtleW1hcCk7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKGluaXQpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQlnZXRfa2V5c3RhdGUoa2V5c3RhdGUpOwotCWZvciAoaT0wOyBpIDwga2NvdW50OyBpKyspIHsKLQkJa2V5c3ltICA9IGtleXN5bXNbaV07Ci0JCWtleWNvZGUgPSBrZXljb2Rlc1tpXTsKLQotCQlpZiAoISBrZXlzdGF0ZVsoaW50KSBrZXljb2RlXSkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoY2xlYXJfbW9kcykgewotCQkJcmZiTG9nKCJjbGVhcl9tb2RpZmllcnM6IHVwOiAlLTEwcyAoMHgleCkgIgotCQkJICAgICJrZXljb2RlPTB4JXhcbiIsIGtleXN0cnNbaV0sIGtleXN5bSwga2V5Y29kZSk7Ci0JCX0KLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBrZXljb2RlLCBGYWxzZSwgQ3VycmVudFRpbWUpOwotCX0KLQlYRmx1c2hfd3IoZHB5KTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotc3RhdGljIEtleVN5bSBzaW1wbGVfbW9kc1tdID0gewotCVhLX1NoaWZ0X0wsIFhLX1NoaWZ0X1IsCi0JWEtfQ29udHJvbF9MLCBYS19Db250cm9sX1IsCi0JWEtfTWV0YV9MLCBYS19NZXRhX1IsCi0JWEtfQWx0X0wsIFhLX0FsdF9SLAotCVhLX1N1cGVyX0wsIFhLX1N1cGVyX1IsCi0JWEtfSHlwZXJfTCwgWEtfSHlwZXJfUiwKLQlYS19Nb2RlX3N3aXRjaCwKLQlOb1N5bWJvbAotfTsKLSNkZWZpbmUgTlNJTVBMRV9NT0RTIDEzCi0KLWludCB0cmFja19tb2Rfc3RhdGUocmZiS2V5U3ltIGtleXN5bSwgcmZiQm9vbCBkb3duLCByZmJCb29sIHNldCkgewotCUtleVN5bSBzeW0gPSAoS2V5U3ltKSBrZXlzeW07CQotCXN0YXRpYyByZmJCb29sIGlzZG93bltOU0lNUExFX01PRFNdOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCBpLCBjbnQgPSAwOwotCi0JLyoKLQkgKiBzaW1wbGUgdHJhY2tpbmcgbWV0aG9kIGZvciB0aGUgbW9kaWZpZXIgc3RhdGUgd2l0aG91dAotCSAqIGNvbnRhY3RpbmcgdGhlIFhzZXJ2ZXIuICBJZ25vcmVzLCBvZiBjb3Vyc2Ugd2hhdCBrZXlzIGFyZQotCSAqIHByZXNzZWQgb24gdGhlIHBoeXNpY2FsIGRpc3BsYXkuCi0JICoKLQkgKiBUaGlzIGlzIHVucmVsYXRlZCB0byBvdXIgbW9kX3R3ZWFrIGFuZCB4a2Igc3R1ZmYuCi0JICogSnVzdCBhIHNpbXBsZSB0aGluZyBmb3Igd2lyZWZyYW1lL3Njcm9sbCBoZXVyaXN0aWNzLCAKLQkgKiBzbG9wcHkga2V5cyBldGMuCi0JICovCi0KLQlpZiAoZmlyc3QpIHsKLQkJZm9yIChpPTA7IGk8TlNJTVBMRV9NT0RTOyBpKyspIHsKLQkJCWlzZG93bltpXSA9IEZBTFNFOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlpZiAoc3ltICE9IE5vU3ltYm9sKSB7Ci0JCWZvciAoaT0wOyBpPE5TSU1QTEVfTU9EUzsgaSsrKSB7Ci0JCQlpZiAoc3ltID09IHNpbXBsZV9tb2RzW2ldKSB7Ci0JCQkJaWYgKHNldCkgewotCQkJCQlpc2Rvd25baV0gPSBkb3duOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaXNkb3duW2ldKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qIG5vdCBhIG1vZGlmaWVyICovCi0JCWlmIChzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyogY2FsbGVkIHdpdGggTm9TeW1ib2w6IHJldHVybiBudW1iZXIgY3VycmVudGx5IHByZXNzZWQ6ICovCi0JZm9yIChpPTA7IGk8TlNJTVBMRV9NT0RTOyBpKyspIHsKLQkJaWYgKGlzZG93bltpXSkgewotCQkJY250Kys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNudDsKLX0KLQotLyoKLSAqIEF0dGVtcHQgdG8gc2V0IGFsbCBrZXlzIHRvIFVwIHBvc2l0aW9uLiAgQ2FuIG1lc3MgdXAgdHlwaW5nIGF0IHRoZQotICogcGh5c2ljYWwga2V5Ym9hcmQgc28gdXNlIHdpdGggY2F1dGlvbi4KLSAqLwotdm9pZCBjbGVhcl9rZXlzKHZvaWQpIHsKLQlpbnQgaywga2V5c3RhdGVbMjU2XTsKLQotCVJBV0ZCX1JFVF9WT0lECi0JCi0JLyogbi5iLiBjYWxsZXIgZGVjaWRlcyB0byBYX0xPQ0sgb3Igbm90LiAqLwotCWdldF9rZXlzdGF0ZShrZXlzdGF0ZSk7Ci0JZm9yIChrPTA7IGs8MjU2OyBrKyspIHsKLQkJaWYgKGtleXN0YXRlW2tdKSB7Ci0JCQlLZXlDb2RlIGtleWNvZGUgPSAoS2V5Q29kZSkgazsKLQkJCXJmYkxvZygiY2xlYXJfa2V5czoga2V5Y29kZT0lZFxuIiwga2V5Y29kZSk7Ci0JCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGtleWNvZGUsIEZhbHNlLCBDdXJyZW50VGltZSk7Ci0JCX0KLQl9Ci0JWEZsdXNoX3dyKGRweSk7Ci19Ci0JCQotCi12b2lkIGNsZWFyX2xvY2tzKHZvaWQpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCXJldHVybjsKLSNlbHNlCi0JWE1vZGlmaWVyS2V5bWFwICptYXA7Ci0JaW50IGksIGosIGsgPSAwOwotCXVuc2lnbmVkIGludCBzdGF0ZSA9IDA7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JLyogbi5iLiBjYWxsZXIgZGVjaWRlcyB0byBYX0xPQ0sgb3Igbm90LiAqLwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hLRVlCT0FSRAotCWlmICh4a2JfcHJlc2VudCkgewotCQlYa2JTdGF0ZVJlYyBrYnN0YXRlOwotCQlYa2JHZXRTdGF0ZShkcHksIFhrYlVzZUNvcmVLYmQsICZrYnN0YXRlKTsKLQkJcmZiTG9nKCJsb2NrZWQ6ICAweCV4XG4iLCBrYnN0YXRlLmxvY2tlZF9tb2RzKTsKLQkJcmZiTG9nKCJsYXRjaGVkOiAweCV4XG4iLCBrYnN0YXRlLmxhdGNoZWRfbW9kcyk7Ci0JCXJmYkxvZygiY29tcGF0OiAgMHgleFxuIiwga2JzdGF0ZS5jb21wYXRfc3RhdGUpOwotCQlzdGF0ZSA9IGtic3RhdGUubG9ja2VkX21vZHM7Ci0JCWlmICghIHN0YXRlKSB7Ci0JCQlzdGF0ZSA9IGtic3RhdGUuY29tcGF0X3N0YXRlOwotCQl9Ci0JfSBlbHNlIAotI2VuZGlmCi0JewotCQlzdGF0ZSA9IG1hc2tfc3RhdGUoKTsKLQkJLyogdGhpcyBtYXkgY29udGFpbiBub24tbG9ja3MgdG9vLi4uICovCi0JCXJmYkxvZygic3RhdGU6ICAgMHgleFxuIiwgc3RhdGUpOwotCX0KLQlpZiAoISBzdGF0ZSkgewotCQlyZXR1cm47Ci0JfQotCW1hcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZHB5KTsKLQlpZiAoISBtYXApIHsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWludCBkaWQgPSAwOwotCQlmb3IgKGogPSAwOyBqIDwgbWFwLT5tYXhfa2V5cGVybW9kOyBqKyspIHsKLQkJCWlmICghIGRpZCAmJiBzdGF0ZSAmICgweDEgPDwgaSkpIHsKLQkJCQlpZiAobWFwLT5tb2RpZmllcm1hcFtrXSkgewotCQkJCQlLZXlDb2RlIGtleSA9IG1hcC0+bW9kaWZpZXJtYXBba107Ci0JCQkJCUtleVN5bSBrcyA9IFhLZXljb2RlVG9LZXlzeW0oZHB5LCBrZXksIDApOwotCQkJCQljaGFyICpubSA9IFhLZXlzeW1Ub1N0cmluZyhrcyk7Ci0JCQkJCXJmYkxvZygidG9nZ2xpbmc6ICUwM2QgLyAlMDNkIC0tICVzXG4iLCBrZXksIGtzLCBubSA/IG5tIDogIkJhZEtleSIpOwotCQkJCQlkaWQgPSAxOwotCQkJCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGtleSwgVHJ1ZSwgQ3VycmVudFRpbWUpOwotCQkJCQl1c2xlZXAoMTAqMTAwMCk7Ci0JCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwga2V5LCBGYWxzZSwgQ3VycmVudFRpbWUpOwotCQkJCQlYRmx1c2hfd3IoZHB5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlrKys7Ci0JCX0KLQl9Ci0JWEZyZWVNb2RpZmllcm1hcChtYXApOwotCVhGbHVzaF93cihkcHkpOwotCXJmYkxvZygic3RhdGU6ICAgMHgleFxuIiwgbWFza19zdGF0ZSgpKTsKLSNlbmRpZgotfQotCi0vKgotICogS2x1ZGdlIGZvciAtbm9yZXBlYXQgb3B0aW9uOiB3ZSB0dXJuIG9mZiBrZXlzdHJva2UgYXV0b3JlcGVhdCBpbgotICogdGhlIFggc2VydmVyIHdoZW4gY2xpZW50cyBhcmUgY29ubmVjdGVkLiAgVGhpcyBtYXkgYW5ub3kgcGVvcGxlIGF0Ci0gKiB0aGUgcGh5c2ljYWwgZGlzcGxheS4gIFdlIGRvIHRoaXMgYmVjYXVzZSAna2V5IGRvd24nIGFuZCAna2V5IHVwJwotICogdXNlciBpbnB1dCBldmVudHMgbWF5IGJlIHNlcGFyYXRlZCBieSAxMDBzIG9mIG1zIGR1ZSB0byBzY3JlZW4gZmIKLSAqIHByb2Nlc3Npbmcgb3IgbGluayBsYXRlbmN5LCB0aGVyZWJ5IGluZHVjaW5nIHRoZSBYIHNlcnZlciB0byBhcHBseQotICogYXV0b3JlcGVhdCB3aGVuIGl0IHNob3VsZCBub3QuICBTaW5jZSB0aGUgKmNsaWVudCogaXMgbGlrZWx5IGRvaW5nCi0gKiBrZXlzdHJva2UgYXV0b3JlcGVhdGluZyBhcyB3ZWxsLCBpdCBraW5kIG9mIG1ha2VzIHNlbnNlIHRvIHNodXQgaXQKLSAqIG9mZiBpZiBubyBvbmUgaXMgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkuLi4KLSAqLwotc3RhdGljIGludCBzYXZlX2F1dG9fcmVwZWF0ID0gLTE7Ci0KLWludCBnZXRfYXV0b3JlcGVhdF9zdGF0ZSh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUKDApCi0JcmV0dXJuIDA7Ci0jZWxzZQotCVhLZXlib2FyZFN0YXRlIGtzdGF0ZTsKLQotCVJBV0ZCX1JFVCgwKQotCi0JWF9MT0NLOwotCVhHZXRLZXlib2FyZENvbnRyb2woZHB5LCAma3N0YXRlKTsKLQlYX1VOTE9DSzsKLQlyZXR1cm4ga3N0YXRlLmdsb2JhbF9hdXRvX3JlcGVhdDsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotaW50IGdldF9pbml0aWFsX2F1dG9yZXBlYXRfc3RhdGUodm9pZCkgewotCWlmIChzYXZlX2F1dG9fcmVwZWF0IDwgMCkgewotCQlzYXZlX2F1dG9fcmVwZWF0ID0gZ2V0X2F1dG9yZXBlYXRfc3RhdGUoKTsKLQl9Ci0JcmV0dXJuIHNhdmVfYXV0b19yZXBlYXQ7Ci19Ci0KLXZvaWQgYXV0b3JlcGVhdChpbnQgcmVzdG9yZSwgaW50IGJlcXVpZXQpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghcmVzdG9yZSB8fCAhYmVxdWlldCkge30KLQlyZXR1cm47Ci0jZWxzZQotCWludCBnbG9iYWxfYXV0b19yZXBlYXQ7Ci0JWEtleWJvYXJkQ29udHJvbCBrY3RybDsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAocmVzdG9yZSkgewotCQlpZiAoc2F2ZV9hdXRvX3JlcGVhdCA8IDApIHsKLQkJCXJldHVybjsJCS8qIG5vdGhpbmcgdG8gcmVzdG9yZSAqLwotCQl9Ci0JCWdsb2JhbF9hdXRvX3JlcGVhdCA9IGdldF9hdXRvcmVwZWF0X3N0YXRlKCk7Ci0JCS8qIHJlYWQgc3RhdGUgYW5kIHNraXAgcmVzdG9yZSBpZiBlcXVhbCAoZS5nLiBubyBjbGllbnRzKSAqLwotCQlpZiAoZ2xvYmFsX2F1dG9fcmVwZWF0ID09IHNhdmVfYXV0b19yZXBlYXQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVhfTE9DSzsKLQkJa2N0cmwuYXV0b19yZXBlYXRfbW9kZSA9IHNhdmVfYXV0b19yZXBlYXQ7Ci0JCVhDaGFuZ2VLZXlib2FyZENvbnRyb2woZHB5LCBLQkF1dG9SZXBlYXRNb2RlLCAma2N0cmwpOwotCQlYRmx1c2hfd3IoZHB5KTsKLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKCEgYmVxdWlldCAmJiAhIHF1aWV0KSB7Ci0JCQlyZmJMb2coIlJlc3RvcmVkIFggc2VydmVyIGtleSBhdXRvcmVwZWF0IHRvOiAlZFxuIiwKLQkJCSAgICBzYXZlX2F1dG9fcmVwZWF0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWdsb2JhbF9hdXRvX3JlcGVhdCA9IGdldF9hdXRvcmVwZWF0X3N0YXRlKCk7Ci0JCWlmIChzYXZlX2F1dG9fcmVwZWF0IDwgMCkgewotCQkJLyoKLQkJCSAqIHdlIG9ubHkgcmVtZW1iZXIgdGhlIHN0YXRlIGF0IHN0YXJ0dXAKLQkJCSAqIHRvIGF2b2lkIGNvbmZ1c2luZyBvdXJzZWx2ZXMgbGF0ZXIgb24uCi0JCQkgKi8KLQkJCXNhdmVfYXV0b19yZXBlYXQgPSBnbG9iYWxfYXV0b19yZXBlYXQ7Ci0JCX0KLQotCQlYX0xPQ0s7Ci0JCWtjdHJsLmF1dG9fcmVwZWF0X21vZGUgPSBBdXRvUmVwZWF0TW9kZU9mZjsKLQkJWENoYW5nZUtleWJvYXJkQ29udHJvbChkcHksIEtCQXV0b1JlcGVhdE1vZGUsICZrY3RybCk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQlYX1VOTE9DSzsKLQotCQlpZiAoISBiZXF1aWV0ICYmICEgcXVpZXQpIHsKLQkJCXJmYkxvZygiRGlzYWJsZWQgWCBzZXJ2ZXIga2V5IGF1dG9yZXBlYXQuXG4iKTsKLQkJCWlmIChub19yZXBlYXRfY291bnRkb3duID49IDApIHsKLQkJCQlyZmJMb2coIiAgdG8gZm9yY2UgYmFjayBvbiBydW46ICd4c2V0IHIgb24nICglZCAiCi0JCQkJICAgICJ0aW1lcylcbiIsIG5vX3JlcGVhdF9jb3VudGRvd24rMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBXZSBwZXJpb2RpY2FsbHkgZGVsZXRlIGFueSBrZXlzeW1zIHdlIGhhdmUgYWRkZWQsIHRoaXMgaXMgdG8KLSAqIGxlc3NlbiBvdXIgZWZmZWN0IG9uIHRoZSBYIHNlcnZlciBzdGF0ZSBpZiB3ZSBhcmUgdGVybWluYXRlZCBhYnJ1cHRseQotICogYW5kIGNhbm5vdCBjbGVhciB0aGVtIGFuZCBhbHNvIHRvIGNsZWFyIG91dCBhbnkgc3RyYW5nZSBsaXR0bGUgdXNlZAotICogb25lcyB0aGF0IHdvdWxkIGp1c3QgZmlsbCB1cCB0aGUga2V5bWFwcGluZy4gCi0gKi8KLXZvaWQgY2hlY2tfYWRkX2tleXN5bXModm9pZCkgewotCXN0YXRpYyB0aW1lX3QgbGFzdF9jaGVjayA9IDA7Ci0JaW50IGNsZWFyX2ZyZXEgPSAzMDAsIHF1aWV0ID0gMSwgY291bnQ7IAotCXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JaWYgKG5vdyA+IGxhc3RfY2hlY2sgKyBjbGVhcl9mcmVxKSB7Ci0JCWNvdW50ID0gY291bnRfYWRkZWRfa2V5Y29kZXMoKTsKLQkJLyoKLQkJICogb25seSByZWFsbHkgZGVsZXRlIGlmIHRoZXkgaGF2ZSBub3QgdHlwZWQgcmVjZW50bHkKLQkJICogYW5kIHdlIGhhdmUgYWRkZWQgOCBvciBtb3JlLgotCQkgKi8KLQkJaWYgKG5vdyA+IGxhc3Rfa2V5Ym9hcmRfaW5wdXQgKyA1ICYmIGNvdW50ID49IDgpIHsKLQkJCVhfTE9DSzsKLQkJCWRlbGV0ZV9hZGRlZF9rZXljb2RlcyhxdWlldCk7Ci0JCQlYX1VOTE9DSzsKLQkJfQotCQlsYXN0X2NoZWNrID0gbm93OwotCX0KLX0KLQotc3RhdGljIEtleVN5bSBhZGRlZF9rZXlzeW1zWzB4MTAwXTsKLQotLyogdGhlc2UgYXJlIGp1c3QgZm9yIHJmYkxvZyBtZXNzYWdlczogKi8KLXN0YXRpYyBLZXlTeW0gYWxsdGltZV9hZGRlZF9rZXlzeW1zWzEwMjRdOwotc3RhdGljIGludCBhbGx0aW1lX2xlbiA9IDEwMjQ7Ci1zdGF0aWMgaW50IGFsbHRpbWVfbnVtID0gMDsKLQotaW50IGFkZF9rZXlzeW0oS2V5U3ltIGtleXN5bSkgewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCBuOwotI2lmIE5PX1gxMQotCWlmIChmaXJzdCkgewotCQlmb3IgKG49MDsgbiA8IDB4MTAwOyBuKyspIHsKLQkJCWFkZGVkX2tleXN5bXNbbl0gPSBOb1N5bWJvbDsKLQkJfQotCQlmaXJzdCA9IDA7Ci0JfQotCVJBV0ZCX1JFVCgwKQotCWlmICgha2V5c3ltKSB7fQotCXJldHVybiAwOwotI2Vsc2UKLQlpbnQgbWlua2V5LCBtYXhrZXksIHN5bXNfcGVyX2tleWNvZGU7Ci0JaW50IGtjLCByZXQgPSAwOwotCUtleVN5bSAqa2V5bWFwOwotCi0JaWYgKGZpcnN0KSB7Ci0JCWZvciAobj0wOyBuIDwgMHgxMDA7IG4rKykgewotCQkJYWRkZWRfa2V5c3ltc1tuXSA9IE5vU3ltYm9sOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlSQVdGQl9SRVQoMCkKLQotCWlmIChrZXlzeW0gPT0gTm9TeW1ib2wpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIHRoZXJlIGNhbiBiZSBhIHJhY2UgYmVmb3JlIE1hcHBpbmdOb3RpZnkgKi8KLQlmb3IgKG49MDsgbiA8IDB4MTAwOyBuKyspIHsKLQkJaWYgKGFkZGVkX2tleXN5bXNbbl0gPT0ga2V5c3ltKSB7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCX0KLQotCVhEaXNwbGF5S2V5Y29kZXMoZHB5LCAmbWlua2V5LCAmbWF4a2V5KTsKLQlrZXltYXAgPSBYR2V0S2V5Ym9hcmRNYXBwaW5nKGRweSwgbWlua2V5LCAobWF4a2V5IC0gbWlua2V5ICsgMSksCi0JICAgICZzeW1zX3Blcl9rZXljb2RlKTsKLQotCWZvciAoa2MgPSBtaW5rZXkrMTsga2MgPD0gbWF4a2V5OyBrYysrKSB7Ci0JCWludCBpLCBqLCBkaWRtc2cgPSAwLCBpc19lbXB0eSA9IDE7Ci0JCWNoYXIgKnN0cjsKLQkJS2V5U3ltIG5ld2tzWzhdOwotCi0JCWZvciAobj0wOyBuIDwgc3ltc19wZXJfa2V5Y29kZTsgbisrKSB7Ci0JCQlpZiAoa2V5bWFwWyAoa2MtbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyBuXQotCQkJICAgICE9IE5vU3ltYm9sKSB7Ci0JCQkJaXNfZW1wdHkgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghIGlzX2VtcHR5KSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWZvciAoaT0wOyBpPDg7IGkrKykgewotCQkJbmV3a3NbaV0gPSBOb1N5bWJvbDsKLQkJfQotCQlpZiAoYWRkX2tleXN5bXMgPT0gMikgewotCQkJbmV3a3NbMF0gPSBrZXlzeW07CS8qIFhYWCByZW1vdmUgbWUgKi8KLQkJfSBlbHNlIHsKLQkJCWZvcihpPTA7IGkgPCBzeW1zX3Blcl9rZXljb2RlOyBpKyspIHsKLQkJCQluZXdrc1tpXSA9IGtleXN5bTsKLQkJCQlpZiAoaSA+PSA3KSBicmVhazsKLQkJCX0KLQkJfQotCi0JCVhDaGFuZ2VLZXlib2FyZE1hcHBpbmcoZHB5LCBrYywgc3ltc19wZXJfa2V5Y29kZSwKLQkJICAgIG5ld2tzLCAxKTsKLQotCQlpZiAoYWxsdGltZV9udW0gPj0gYWxsdGltZV9sZW4pIHsKLQkJCWRpZG1zZyA9IDE7CS8qIHNvbWV0aGluZyB3ZWlyZCAqLwotCQl9IGVsc2UgewotCQkJZm9yIChqPTA7IGo8YWxsdGltZV9udW07IGorKykgewotCQkJCWlmIChhbGx0aW1lX2FkZGVkX2tleXN5bXNbal0gPT0ga2V5c3ltKSB7Ci0JCQkJCWRpZG1zZyA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoISBkaWRtc2cpIHsKLQkJCXN0ciA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwotCQkJcmZiTG9nKCJhZGRlZCBtaXNzaW5nIGtleXN5bSB0byBYIGRpc3BsYXk6ICUwM2QgIgotCQkJICAgICIweCV4IFwiJXNcIlxuIiwga2MsIGtleXN5bSwgc3RyID8gc3RyIDogIm51bGwiKTsKLQotCQkJaWYgKGFsbHRpbWVfbnVtIDwgYWxsdGltZV9sZW4pIHsKLQkJCQlhbGx0aW1lX2FkZGVkX2tleXN5bXNbYWxsdGltZV9udW0rK10gPSBrZXlzeW07Ci0JCQl9Ci0JCX0KLQotCQlYRmx1c2hfd3IoZHB5KTsKLQkJYWRkZWRfa2V5c3ltc1trY10gPSBrZXlzeW07Ci0JCXJldCA9IGtjOwotCQlicmVhazsKLQl9Ci0JWEZyZWVfd3Ioa2V5bWFwKTsKLQlyZXR1cm4gcmV0OwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVfa2V5Y29kZShLZXlDb2RlIGtjLCBpbnQgYmVxdWlldCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFrYyB8fCAhYmVxdWlldCkge30KLQlyZXR1cm47Ci0jZWxzZQotCWludCBtaW5rZXksIG1heGtleSwgc3ltc19wZXJfa2V5Y29kZSwgaTsKLQlLZXlTeW0gKmtleW1hcDsKLQlLZXlTeW0ga3N5bSwgbmV3a3NbOF07Ci0JY2hhciAqc3RyOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCVhEaXNwbGF5S2V5Y29kZXMoZHB5LCAmbWlua2V5LCAmbWF4a2V5KTsKLQlrZXltYXAgPSBYR2V0S2V5Ym9hcmRNYXBwaW5nKGRweSwgbWlua2V5LCAobWF4a2V5IC0gbWlua2V5ICsgMSksCi0JICAgICZzeW1zX3Blcl9rZXljb2RlKTsKLQotCWZvciAoaT0wOyBpPDg7IGkrKykgewotCQluZXdrc1tpXSA9IE5vU3ltYm9sOwotCX0KLQotCVhDaGFuZ2VLZXlib2FyZE1hcHBpbmcoZHB5LCBrYywgc3ltc19wZXJfa2V5Y29kZSwgbmV3a3MsIDEpOwotCi0JaWYgKCEgYmVxdWlldCAmJiAhIHF1aWV0KSB7Ci0JCWtzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRweSwga2MsIDApOwotCQlzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa3N5bSk7Ci0JCXJmYkxvZygiZGVsZXRlZCBrZXljb2RlIGZyb20gWCBkaXNwbGF5OiAlMDNkIDB4JXggXCIlc1wiXG4iLAotCQkgICAga2MsIGtzeW0sIHN0ciA/IHN0ciA6ICJudWxsIik7Ci0JfQotCi0JWEZyZWVfd3Ioa2V5bWFwKTsKLQlYRmx1c2hfd3IoZHB5KTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotc3RhdGljIGludCBjb3VudF9hZGRlZF9rZXljb2Rlcyh2b2lkKSB7Ci0JaW50IGtjLCBjb3VudCA9IDA7Ci0JZm9yIChrYyA9IDA7IGtjIDwgMHgxMDA7IGtjKyspIHsKLQkJaWYgKGFkZGVkX2tleXN5bXNba2NdICE9IE5vU3ltYm9sKSB7Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotdm9pZCBkZWxldGVfYWRkZWRfa2V5Y29kZXMoaW50IGJlcXVpZXQpIHsKLQlpbnQga2M7Ci0JZm9yIChrYyA9IDA7IGtjIDwgMHgxMDA7IGtjKyspIHsKLQkJaWYgKGFkZGVkX2tleXN5bXNba2NdICE9IE5vU3ltYm9sKSB7Ci0JCQlkZWxldGVfa2V5Y29kZShrYywgYmVxdWlldCk7Ci0JCQlhZGRlZF9rZXlzeW1zW2tjXSA9IE5vU3ltYm9sOwotCQl9Ci0JfQotfQotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBmb3IgYW4gZXhwZXJpbWVudGFsIC1yZW1hcCBvcHRpb24gdG8gYWxsb3cgdGhlIHVzZXIKLSAqIHRvIHJlbWFwIGtleXN0cm9rZXMuICBJdCBpcyBjdXJyZW50bHkgY29uZnVzaW5nIHdydCBtb2RpZmllcnMuLi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qga2V5cmVtYXAgewotCUtleVN5bSBiZWZvcmU7Ci0JS2V5U3ltIGFmdGVyOwotCWludCBpc2J1dHRvbjsKLQlzdHJ1Y3Qga2V5cmVtYXAgKm5leHQ7Ci19IGtleXJlbWFwX3Q7Ci0KLXN0YXRpYyBrZXlyZW1hcF90ICprZXlyZW1hcHMgPSBOVUxMOwotCi1zdGF0aWMgdm9pZCBhZGRfcmVtYXAoY2hhciAqbGluZSkgewotCWNoYXIgc3RyMVsyNTZdLCBzdHIyWzI1Nl07Ci0JS2V5U3ltIGtzeW0xLCBrc3ltMjsKLQlpbnQgaXNidG4gPSAwOwotCXVuc2lnbmVkIGludCBpOwotCXN0YXRpYyBrZXlyZW1hcF90ICpjdXJyZW50ID0gTlVMTDsKLQlrZXlyZW1hcF90ICpyZW1hcDsKLQotCWlmIChzc2NhbmYobGluZSwgIiVzICVzIiwgc3RyMSwgc3RyMikgIT0gMikgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygicmVtYXA6IGludmFsaWQgbGluZTogJXNcbiIsIGxpbmUpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQlpZiAoc3NjYW5mKHN0cjEsICIweCV4IiwgJmkpID09IDEpIHsKLQkJa3N5bTEgPSAoS2V5U3ltKSBpOwotCX0gZWxzZSB7Ci0JCWtzeW0xID0gWFN0cmluZ1RvS2V5c3ltKHN0cjEpOwotCX0KLQlpZiAoc3NjYW5mKHN0cjIsICIweCV4IiwgJmkpID09IDEpIHsKLQkJa3N5bTIgPSAoS2V5U3ltKSBpOwotCX0gZWxzZSB7Ci0JCWtzeW0yID0gWFN0cmluZ1RvS2V5c3ltKHN0cjIpOwotCX0KLQlpZiAoa3N5bTIgPT0gTm9TeW1ib2wpIHsKLQkJaWYgKHNzY2FuZihzdHIyLCAiQnV0dG9uJXUiLCAmaSkgPT0gMSkgewotCQkJa3N5bTIgPSAoS2V5U3ltKSBpOwotCQkJaXNidG4gPSAxOyAKLQkJfQotCX0KLQlpZiAoa3N5bTEgPT0gTm9TeW1ib2wgfHwga3N5bTIgPT0gTm9TeW1ib2wpIHsKLQkJaWYgKHN0cmNhc2VjbXAoc3RyMiwgIk5vU3ltYm9sIikgJiYgc3RyY2FzZWNtcChzdHIyLCAiTm9uZSIpKSB7Ci0JCQlyZmJMb2coIndhcm5pbmc6IHNraXBwaW5nIGludmFsaWQgcmVtYXAgbGluZTogJXMiLCBsaW5lKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlyZW1hcCA9IChrZXlyZW1hcF90ICopIG1hbGxvYygoc2l6ZV90KSBzaXplb2Yoa2V5cmVtYXBfdCkpOwotCXJlbWFwLT5iZWZvcmUgPSBrc3ltMTsKLQlyZW1hcC0+YWZ0ZXIgID0ga3N5bTI7Ci0JcmVtYXAtPmlzYnV0dG9uID0gaXNidG47Ci0JcmVtYXAtPm5leHQgICA9IE5VTEw7Ci0KLQlyZmJMb2coInJlbWFwcGluZzogKCVzLCAweCV4KSAtPiAoJXMsIDB4JXgpIGlzYnRuPSVkXG4iLCBzdHIxLAotCSAgICBrc3ltMSwgc3RyMiwga3N5bTIsIGlzYnRuKTsKLQotCWlmIChrZXlyZW1hcHMgPT0gTlVMTCkgewotCQlrZXlyZW1hcHMgPSByZW1hcDsKLQl9IGVsc2UgewotCQljdXJyZW50LT5uZXh0ID0gcmVtYXA7Ci0JfQotCWN1cnJlbnQgPSByZW1hcDsKLX0KLQotc3RhdGljIHZvaWQgYWRkX2RlYWRfa2V5c3ltcyhjaGFyICpzdHIpIHsKLQljaGFyICpwLCAqcTsKLQlpbnQgaTsKLQljaGFyICpsaXN0W10gPSB7Ci0JCSJnIGdyYXZlIGRlYWRfZ3JhdmUiLAotCQkiYSBhY3V0ZSBkZWFkX2FjdXRlIiwKLQkJImMgYXNjaWljaXJjdW0gZGVhZF9jaXJjdW1mbGV4IiwKLQkJInQgYXNjaWl0aWxkZSBkZWFkX3RpbGRlIiwKLQkJIm0gbWFjcm9uIGRlYWRfbWFjcm9uIiwKLQkJImIgYnJldmUgZGVhZF9icmV2ZSIsCi0JCSJEIGFib3ZlZG90IGRlYWRfYWJvdmVkb3QiLAotCQkiZCBkaWFlcmVzaXMgZGVhZF9kaWFlcmVzaXMiLAotCQkibyBkZWdyZWUgZGVhZF9hYm92ZXJpbmciLAotCQkiQSBkb3VibGVhY3V0ZSBkZWFkX2RvdWJsZWFjdXRlIiwKLQkJInIgY2Fyb24gZGVhZF9jYXJvbiIsCi0JCSJlIGNlZGlsbGEgZGVhZF9jZWRpbGxhIiwKLS8qCQkieCBYWFgtb2dvbmVrIGRlYWRfb2dvbmVrIiwgKi8KLS8qCQkieCBYWFgtYmVsb3dkb3QgZGVhZF9iZWxvd2RvdCIsICovCi0vKgkJInggWFhYLWhvb2sgZGVhZF9ob29rIiwgKi8KLS8qCQkieCBYWFgtaG9ybiBkZWFkX2hvcm4iLCAqLwotCQlOVUxMCi0JfTsKLQotCXAgPSBzdHI7Ci0KLQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKCpwKSkpIHsKLQkJCSpwID0gJ1wwJzsKLQkJfQotCQlwKys7Ci0JfQotCi0JaWYgKCFzdHJjbXAoc3RyLCAiREVBRCIpKSB7Ci0JCWZvciAoaSA9IDA7IGxpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCQlwID0gbGlzdFtpXSArIDI7Ci0JCQlhZGRfcmVtYXAocCk7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiREVBRD1taXNzaW5nIikpIHsKLQkJZm9yIChpID0gMDsgbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKLQkJCUtleVN5bSBrc3ltLCBrc3ltMjsKLQkJCWludCBpbm1hcCA9IDA7Ci0KLQkJCXAgPSBzdHJkdXAobGlzdFtpXSArIDIpOwotCQkJcSA9IHN0cmNocihwLCAnICcpOwotCQkJaWYgKHEgPT0gTlVMTCkgewotCQkJCWZyZWUocCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkqcSA9ICdcMCc7Ci0JCQlrc3ltID0gWFN0cmluZ1RvS2V5c3ltKHApOwotCQkJKnEgPSAnICc7Ci0JCQlpZiAoa3N5bSA9PSBOb1N5bWJvbCkgewotCQkJCWZyZWUocCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoWEtleXN5bVRvS2V5Y29kZShkcHksIGtzeW0pKSB7Ci0JCQkJaW5tYXAgPSAxOwotCQkJfQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hLRVlCT0FSRAotCQkJaWYgKCEgaW5tYXAgJiYgeGtiX3ByZXNlbnQgJiYgZHB5KSB7Ci0JCQkJaW50IGtjLCBncnAsIGx2bDsKLQkJCQlmb3IgKGtjID0gMDsga2MgPCAweDEwMDsga2MrKykgewotCQkJCSAgICBmb3IgKGdycCA9IDA7IGdycCA8IDQ7IGdycCsrKSB7Ci0JCQkJCWZvciAobHZsID0gMDsgbHZsIDwgODsgbHZsKyspIHsKLQkJCQkJCWtzeW0yID0gWGtiS2V5Y29kZVRvS2V5c3ltKGRweSwKLQkJCQkJCSAgICBrYywgZ3JwLCBsdmwpOwotCQkJCQkJaWYgKGtzeW0yID09IE5vU3ltYm9sKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoa3N5bTIgPT0ga3N5bSkgewotCQkJCQkJCWlubWFwID0gMTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSAgICB9Ci0JCQkJfQotCQkJfQotI2Vsc2UKLQkJCWlmICgoa3N5bTIgPSAwKSkge30KLSNlbmRpZgotCQkJaWYgKCEgaW5tYXApIHsKLQkJCQlhZGRfcmVtYXAocCk7Ci0JCQl9Ci0JCQlmcmVlKHApOwotCQl9Ci0JfSBlbHNlIGlmICgocCA9IHN0cmNocihzdHIsICc9JykpICE9IE5VTEwpIHsKLQkJd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJCWZvciAoaSA9IDA7IGxpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCQkJcSA9IGxpc3RbaV07Ci0JCQkJaWYgKCpwID09ICpxKSB7Ci0JCQkJCXEgKz0gMjsKLQkJCQkJYWRkX3JlbWFwKHEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwKys7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIHRoZSAtcmVtYXAgc3RyaW5nIChmaWxlIG9yIG1hcHBpbmcgc3RyaW5nKQotICovCi12b2lkIGluaXRpYWxpemVfcmVtYXAoY2hhciAqaW5maWxlKSB7Ci0JRklMRSAqaW47Ci0JY2hhciAqcCwgKnEsIGxpbmVbMjU2XTsKLQotCWlmIChrZXlyZW1hcHMgIT0gTlVMTCkgewotCQkvKiBmcmVlIGxhc3QgcmVtYXBwaW5nICovCi0JCWtleXJlbWFwX3QgKm5leHRfcmVtYXAsICpjdXJyX3JlbWFwID0ga2V5cmVtYXBzOwotCQl3aGlsZSAoY3Vycl9yZW1hcCAhPSBOVUxMKSB7Ci0JCQluZXh0X3JlbWFwID0gY3Vycl9yZW1hcC0+bmV4dDsKLQkJCWZyZWUoY3Vycl9yZW1hcCk7Ci0JCQljdXJyX3JlbWFwID0gbmV4dF9yZW1hcDsKLQkJfQotCQlrZXlyZW1hcHMgPSBOVUxMOwotCX0KLQlpZiAoaW5maWxlID09IE5VTEwgfHwgKmluZmlsZSA9PSAnXDAnKSB7Ci0JCS8qIGp1c3QgdW5zZXQgcmVtYXBwaW5nICovCi0JCXJldHVybjsKLQl9Ci0KLQlpbiA9IGZvcGVuKGluZmlsZSwgInIiKTsgCi0JaWYgKGluID09IE5VTEwpIHsKLQkJLyogYXNzdW1lIGNtZCBsaW5lIGtleTEta2V5MixrZXkzLWtleTQgKi8KLQkJaWYgKHN0cnN0cihpbmZpbGUsICJERUFEIikgPT0gaW5maWxlKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNocihpbmZpbGUsICctJykpIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygicmVtYXA6IGNhbm5vdCBvcGVuOiAlc1xuIiwgaW5maWxlKTsKLQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKChpbiA9IHRtcGZpbGUoKSkgPT0gTlVMTCkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJyZW1hcDogY2Fubm90IG9wZW4gdG1wZmlsZSBmb3IgJXNcbiIsIGluZmlsZSk7Ci0JCQlyZmJMb2dQZXJyb3IoInRtcGZpbGUiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQotCQkvKiBjb3B5IGluIHRoZSBzdHJpbmcgdG8gZmlsZSBmb3JtYXQgKi8KLQkJcCA9IGluZmlsZTsKLQkJd2hpbGUgKCpwKSB7Ci0JCQlpZiAoKnAgPT0gJy0nKSB7Ci0JCQkJZnByaW50ZihpbiwgIiAiKTsKLQkJCX0gZWxzZSBpZiAoKnAgPT0gJywnIHx8ICpwID09ICcgJyB8fCAgKnAgPT0gJ1x0JykgewotCQkJCWZwcmludGYoaW4sICJcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlmcHJpbnRmKGluLCAiJWMiLCAqcCk7Ci0JCQl9Ci0JCQlwKys7Ci0JCX0KLQkJZnByaW50ZihpbiwgIlxuIik7Ci0JCWZmbHVzaChpbik7CQotCQlyZXdpbmQoaW4pOwotCX0KLQotCXdoaWxlIChmZ2V0cyhsaW5lLCAyNTYsIGluKSAhPSBOVUxMKSB7Ci0JCXAgPSBsYmxhbmtzKGxpbmUpOwotCQlpZiAoKnAgPT0gJ1wwJykgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0cmNocihsaW5lLCAnIycpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChzdHJzdHIocCwgIkRFQUQiKSA9PSBwKSAgewotCQkJYWRkX2RlYWRfa2V5c3ltcyhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgocSA9IHN0cmNocihsaW5lLCAnLScpKSAhPSBOVUxMKSB7Ci0JCQkvKiBhbGxvdyBLZXlzeW0xLUtleXN5bTIgbm90YXRpb24gKi8KLQkJCSpxID0gJyAnOwkKLQkJfQotCQlhZGRfcmVtYXAocCk7Ci0JfQotCWZjbG9zZShpbik7Ci19Ci0KLS8qCi0gKiBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB1c2luZyB0aGUgWGtiIChYS0VZQk9BUkQpIGV4dGVuc2lvbiBmb3IgaGFuZGxpbmcKLSAqIHVzZXIgaW5wdXQuICBpbmVsZWdhbnQsIHNsb3csIGFuZCBpbmNvbXBsZXRlIGN1cnJlbnRseS4uLiBidXQgaW5pdGlhbAotICogdGVzdHMgc2hvdyBpdCBpcyB1c2VmdWwgZm9yIHNvbWUgc2V0dXBzLgotICovCi10eXBlZGVmIHN0cnVjdCBrZXljaGFyIHsKLQlLZXlDb2RlIGNvZGU7Ci0JaW50IGdyb3VwOwotCWludCBsZXZlbDsKLX0ga2V5Y2hhcl90OwotCi0vKiBtYXggbnVtYmVyIG9mIGtleSBncm91cHMgYW5kIHNoaWZ0IGxldmVscyB3ZSBjb25zaWRlciAqLwotI2RlZmluZSBHUlAgNAotI2RlZmluZSBMVkwgOAotc3RhdGljIGludCBsdmxfbWF4LCBncnBfbWF4LCBrY19taW4sIGtjX21heDsKLXN0YXRpYyBLZXlTeW0geGtia2V5c3ltc1sweDEwMF1bR1JQXVtMVkxdOwotc3RhdGljIHVuc2lnbmVkIGludCB4a2JzdGF0ZVsweDEwMF1bR1JQXVtMVkxdOwotc3RhdGljIHVuc2lnbmVkIGludCB4a2JpZ25vcmVbMHgxMDBdW0dSUF1bTFZMXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgeGtibW9kaWZpZXJzWzB4MTAwXVtHUlBdW0xWTF07Ci1zdGF0aWMgaW50IG11bHRpX2tleVsweDEwMF0sIG1vZGVfc3dpdGNoWzB4MTAwXSwgc2tpcGtleWNvZGVbMHgxMDBdOwotc3RhdGljIGludCBzaGlmdF9rZXlzWzB4MTAwXTsKLQotLyoKLSAqIGZvciB0cnlpbmcgdG8gb3JkZXIgdGhlIGtleWNvZGVzIHRvIGF2b2lkIHByb2JsZW1zLCBub3RlIHRoZQotICogKmZpcnN0KiBrZXljb2RlIGJvdW5kIHRvIGl0LiAga2NfdmVjIHdpbGwgYmUgYSBwZXJtdXRhdGlvbgotICogb2YgMS4uLjI1NiB0byBnZXQgdGhlbSBpbiB0aGUgcHJlZmVycmVkIG9yZGVyLgotICovCi1zdGF0aWMgaW50IGtjX3ZlY1sweDEwMF07Ci1zdGF0aWMgaW50IGtjMV9zaGlmdCwga2MxX2NvbnRyb2wsIGtjMV9jYXBsb2NrLCBrYzFfYWx0Owotc3RhdGljIGludCBrYzFfbWV0YSwga2MxX251bWxvY2ssIGtjMV9zdXBlciwga2MxX2h5cGVyOwotc3RhdGljIGludCBrYzFfbW9kZV9zd2l0Y2gsIGtjMV9pc29fbGV2ZWwzX3NoaWZ0LCBrYzFfbXVsdGlfa2V5OwotCQotaW50IHNsb3BweV9rZXlfY2hlY2soaW50IGtleSwgcmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLCBpbnQgKm5ld19rYykgewotCWlmICghc2xvcHB5X2tleXMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JUkFXRkJfUkVUKDApCi0jaWYgTk9fWDExCi0JaWYgKCFrZXkgfHwgIWRvd24gfHwgIWtleXN5bSB8fCAhbmV3X2tjKSB7fQotCXJldHVybiAwOwotI2Vsc2UKLQkKLQlpZiAoIWRvd24gJiYgIWtleWNvZGVfc3RhdGVba2V5XSAmJiAhSXNNb2RpZmllcktleShrZXlzeW0pKSB7Ci0JCWludCBpLCBjbnQgPSAwLCBkb3dua2V5ID0gLTE7Ci0JCWludCBubW9kc19kb3duID0gdHJhY2tfbW9kX3N0YXRlKE5vU3ltYm9sLCBGQUxTRSwgRkFMU0UpOwotCQlpbnQgbW9kc19kb3duWzI1Nl07Ci0KLQkJaWYgKG5tb2RzX2Rvd24pIHsKLQkJCS8qIHRyYWNraW5nIHRvIHNraXAgZG93biBtb2RpZmllciBrZXljb2Rlcy4gKi8KLQkJCWZvcihpPTA7IGk8MjU2OyBpKyspIHsKLQkJCQltb2RzX2Rvd25baV0gPSAwOwotCQkJfQotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoc2ltcGxlX21vZHNbaV0gIT0gTm9TeW1ib2wpIHsKLQkJCQlLZXlTeW0ga3N5bSA9IHNpbXBsZV9tb2RzW2ldOwotCQkJCUtleUNvZGUgayA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBrc3ltKTsKLQkJCQlpZiAoayAhPSBOb1N5bWJvbCAmJiBrZXljb2RlX3N0YXRlWyhpbnQpIGtdKSB7Ci0JCQkJCW1vZHNfZG93blsoaW50KSBrXSA9IDE7Ci0JCQkJfQotCQkJCQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiB0aGUga2V5Y29kZSBpcyBhbHJlYWR5IHVwLi4uIGxvb2sgZm9yIGEgc2luZ2xlIG9uZQotCQkgKiAobm9uIG1vZGlmaWVyKSB0aGF0IGlzIGRvd24KLQkJICovCi0JCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCQlpZiAoa2V5Y29kZV9zdGF0ZVtpXSkgewotCQkJCWlmIChubW9kc19kb3duICYmIG1vZHNfZG93bltpXSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY250Kys7Ci0JCQkJZG93bmtleSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICBzbG9wcHlfa2V5czogJWQvMHgleCAiCi0JCQkJICAgICItPiAlZC8weCV4ICAobm1vZHM6ICVkKVxuIiwgKGludCkga2V5LAotCQkJCSAgICAoaW50KSBrZXksIGRvd25rZXksIGRvd25rZXksIG5tb2RzX2Rvd24pOwotCQkJfQotCQkJKm5ld19rYyA9IGRvd25rZXk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotI2lmICFMSUJWTkNTRVJWRVJfSEFWRV9YS0VZQk9BUkQgfHwgU0tJUF9YS0IKLQotLyogZW1wdHkgZnVuY3Rpb25zIGZvciBubyB4a2IgKi8KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfeGtiX21vZHR3ZWFrKHZvaWQpIHt9Ci1zdGF0aWMgdm9pZCB4a2JfdHdlYWtfa2V5Ym9hcmQocmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLAotICAgIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpZiAoIWNsaWVudCB8fCAhZG93biB8fCAha2V5c3ltKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotfQotdm9pZCBzd2l0Y2hfdG9feGtiX2lmX2JldHRlcih2b2lkKSB7fQotCi0jZWxzZQotCi12b2lkIHN3aXRjaF90b194a2JfaWZfYmV0dGVyKHZvaWQpIHsKLQlLZXlTeW0ga2V5c3ltLCAqa2V5bWFwOwotCWludCBtaXNzX25veGtiWzI1Nl0sIG1pc3NfeGtiWzI1Nl0sIG1pc3Npbmdfbm94a2IgPSAwLCBtaXNzaW5nX3hrYiA9IDA7Ci0JaW50IGksIGosIGssIG4sIG1pbmtleSwgbWF4a2V5LCBzeW1zX3Blcl9rZXljb2RlOwotCWludCBzeW1zX2d0XzQgPSAwOwotCWludCBrYywgZ3JwLCBsdmw7Ci0KLQkvKiBub24tYWxwaGFudW1lcmljIG9uIHVzIGtleWJvYXJkICovCi0JS2V5U3ltIG11c3RfaGF2ZVtdID0gewotCQlYS19leGNsYW0sCi0JCVhLX2F0LAotCQlYS19udW1iZXJzaWduLAotCQlYS19kb2xsYXIsCi0JCVhLX3BlcmNlbnQsCi0vKgkJWEtfYXNjaWljaXJjdW0sICovCi0JCVhLX2FtcGVyc2FuZCwKLQkJWEtfYXN0ZXJpc2ssCi0JCVhLX3BhcmVubGVmdCwKLQkJWEtfcGFyZW5yaWdodCwKLQkJWEtfdW5kZXJzY29yZSwKLQkJWEtfcGx1cywKLQkJWEtfbWludXMsCi0JCVhLX2VxdWFsLAotCQlYS19icmFja2V0bGVmdCwKLQkJWEtfYnJhY2tldHJpZ2h0LAotCQlYS19icmFjZWxlZnQsCi0JCVhLX2JyYWNlcmlnaHQsCi0JCVhLX2JhciwKLQkJWEtfYmFja3NsYXNoLAotCQlYS19zZW1pY29sb24sCi0vKgkJWEtfYXBvc3Ryb3BoZSwgKi8KLQkJWEtfY29sb24sCi0JCVhLX3F1b3RlZGJsLAotCQlYS19jb21tYSwKLQkJWEtfcGVyaW9kLAotCQlYS19sZXNzLAotCQlYS19ncmVhdGVyLAotCQlYS19zbGFzaCwKLQkJWEtfcXVlc3Rpb24sCi0vKgkJWEtfYXNjaWl0aWxkZSwgKi8KLS8qCQlYS19ncmF2ZSwgKi8KLQkJTm9TeW1ib2wKLQl9OwotCi0JaWYgKCEgdXNlX21vZGlmaWVyX3R3ZWFrIHx8IGdvdF9ub3hrYikgewotCQlyZXR1cm47Ci0JfQotCWlmICh1c2VfeGtiX21vZHR3ZWFrKSB7Ci0JCS8qIGFscmVhZHkgdXNpbmcgaXQgKi8KLQkJcmV0dXJuOwotCX0KLQlSQVdGQl9SRVRfVk9JRAotCi0JWERpc3BsYXlLZXljb2RlcyhkcHksICZtaW5rZXksICZtYXhrZXkpOwotCi0Ja2V5bWFwID0gWEdldEtleWJvYXJkTWFwcGluZyhkcHksIG1pbmtleSwgKG1heGtleSAtIG1pbmtleSArIDEpLAotCSAgICAmc3ltc19wZXJfa2V5Y29kZSk7Ci0KLQkvKiBoYW5kbGUgYWxwaGFiZXRpYyBjaGFyIHdpdGggb25seSBvbmUga2V5c3ltIChubyB1cHBlciArIGxvd2VyKSAqLwotCWZvciAoaSA9IG1pbmtleTsgaSA8PSBtYXhrZXk7IGkrKykgewotCQlLZXlTeW0gbG93ZXIsIHVwcGVyOwotCQkvKiAybmQgb25lICovCi0JCWtleXN5bSA9IGtleW1hcFsoaSAtIG1pbmtleSkgKiBzeW1zX3Blcl9rZXljb2RlICsgMV07Ci0JCWlmIChrZXlzeW0gIT0gTm9TeW1ib2wpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIDFzdCBvbmUgKi8KLQkJa2V5c3ltID0ga2V5bWFwWyhpIC0gbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyAwXTsKLQkJaWYgKGtleXN5bSA9PSBOb1N5bWJvbCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJWENvbnZlcnRDYXNlKGtleXN5bSwgJmxvd2VyLCAmdXBwZXIpOwotCQlpZiAobG93ZXIgIT0gdXBwZXIpIHsKLQkJCWtleW1hcFsoaSAtIG1pbmtleSkgKiBzeW1zX3Blcl9rZXljb2RlICsgMF0gPSBsb3dlcjsKLQkJCWtleW1hcFsoaSAtIG1pbmtleSkgKiBzeW1zX3Blcl9rZXljb2RlICsgMV0gPSB1cHBlcjsKLQkJfQotCX0KLQotCWsgPSAwOwotCXdoaWxlIChtdXN0X2hhdmVba10gIT0gTm9TeW1ib2wpIHsKLQkJaW50IGdvdGl0ID0gMDsKLQkJS2V5U3ltIG11c3QgPSBtdXN0X2hhdmVba107Ci0JCWZvciAoaSA9IG1pbmtleTsgaSA8PSBtYXhrZXk7IGkrKykgewotCQkgICAgZm9yIChqID0gMDsgaiA8IHN5bXNfcGVyX2tleWNvZGU7IGorKykgewotCQkJa2V5c3ltID0ga2V5bWFwWyhpLW1pbmtleSkgKiBzeW1zX3Blcl9rZXljb2RlICsgal07Ci0JCQlpZiAoaiA+PSA0KSB7Ci0JCQkgICAgaWYgKGsgPT0gMCAmJiBrZXlzeW0gIT0gTm9TeW1ib2wpIHsKLQkJCQkvKiBmb3Igaz0wIGNvdW50IHRoZSBoaWdoIGtleXN5bXMgKi8KLQkJCQlzeW1zX2d0XzQrKzsKLQkJCQlpZiAoZGVidWdfa2V5Ym9hcmQgPiAxKSB7Ci0JCQkJCWNoYXIgKnN0ciA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIi0gaGlnaCBrZXlzeW0gbWFwcGluZyIKLQkJCQkJICAgICI6IGF0ICUzZCBqPSVkICIKLQkJCQkJICAgICInJXMnXG4iLCBpLCBqLCBzdHIgPyBzdHIgOiAibnVsbCIpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgICAgY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoa2V5c3ltID09IG11c3QpIHsKLQkJCQlpZiAoZGVidWdfa2V5Ym9hcmQgPiAxKSB7Ci0JCQkJCWNoYXIgKnN0ciA9IFhLZXlzeW1Ub1N0cmluZyhtdXN0KTsKLQkJCQkJZnByaW50ZihzdGRlcnIsICItIGF0ICUzZCBqPSVkIGZvdW5kICIKLQkJCQkJICAgICInJXMnXG4iLCBpLCBqLCBzdHIgPyBzdHIgOiAibnVsbCIpOwotCQkJCX0KLQkJCQkvKiBuLmIuIGRvIG5vdCBicmVhaywgc2VlIHN5bXNfZ3RfNCBhYm92ZS4gKi8KLQkJCQlnb3RpdCA9IDE7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkJaWYgKCEgZ290aXQpIHsKLQkJCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJCQljaGFyICpzdHIgPSBYS2V5c3ltVG9TdHJpbmcobXVzdCk7Ci0JCQkJS2V5Q29kZSBrYyA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBtdXN0KTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIi0gZGlkIG5vdCBmaW5kIDB4JWx4ICclcydcdCIKLQkJCQkgICAgIktzMktjOiAlZFxuIiwgbXVzdCwgc3RyID8gc3RyOiJudWxsIiwga2MpOyAKLQkJCQlpZiAoa2MgIT0gTm9uZSkgewotCQkJCQlpbnQgajI7Ci0JCQkJCWZvcihqMj0wOyBqMjxzeW1zX3Blcl9rZXljb2RlOyBqMisrKSB7Ci0JCQkJCQlrZXlzeW0gPSBrZXltYXBbKGtjLW1pbmtleSkgKgotCQkJCQkJICAgIHN5bXNfcGVyX2tleWNvZGUgKyBqMl07Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgJWQ9MHglbHgiLAotCQkJCQkJICAgIGoyLCBrZXlzeW0pOwotCQkJCQl9Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCQltaXNzaW5nX25veGtiKys7Ci0JCQltaXNzX25veGtiW2tdID0gMTsKLQkJfSBlbHNlIHsKLQkJCW1pc3Nfbm94a2Jba10gPSAwOwotCQl9Ci0JCWsrKzsKLQl9Ci0JbiA9IGs7Ci0KLQlYRnJlZV93cihrZXltYXApOwotCWlmIChtaXNzaW5nX25veGtiID09IDAgJiYgc3ltc19wZXJfa2V5Y29kZSA+IDQgJiYgc3ltc19ndF80ID49IDApIHsKLQkJLyogd2UgdXNlZCB0byBoYXZlIHN5bXNfZ3RfNCA+PSA4LCBub3cgYWx3YXlzIG9uLiAqLwotCQlpZiAoISByYXdfZmJfc3RyKSB7Ci0JCQlyZmJMb2coIlxuIik7Ci0JCQlyZmJMb2coIlhLRVlCT0FSRDogbnVtYmVyIG9mIGtleXN5bXMgcGVyIGtleWNvZGUgJWQgaXMgZ3JlYXRlclxuIiwgc3ltc19wZXJfa2V5Y29kZSk7Ci0JCQlyZmJMb2coIiAgdGhhbiA0IGFuZCAlZCBrZXlzeW1zIGFyZSBtYXBwZWQgYWJvdmUgNC5cbiIsIHN5bXNfZ3RfNCk7Ci0JCQlyZmJMb2coIiAgQXV0b21hdGljYWxseSBzd2l0Y2hpbmcgdG8gLXhrYiBtb2RlLlxuIik7Ci0JCQlyZmJMb2coIiAgSWYgdGhpcyBtYWtlcyB0aGUga2V5IG1hcHBpbmcgd29yc2UgeW91IGNhblxuIik7Ci0JCQlyZmJMb2coIiAgZGlzYWJsZSBpdCB3aXRoIHRoZSBcIi1ub3hrYlwiIG9wdGlvbi5cbiIpOwotCQkJcmZiTG9nKCIgIEFsc28sIHJlbWVtYmVyIFwiLXJlbWFwIERFQURcIiBmb3IgYWNjZW50aW5nIGNoYXJhY3RlcnMuXG4iKTsKLQkJCXJmYkxvZygiXG4iKTsKLQkJfQotCi0JCXVzZV94a2JfbW9kdHdlYWsgPSAxOwotCQlyZXR1cm47Ci0KLQl9IGVsc2UgaWYgKG1pc3Npbmdfbm94a2IgPT0gMCkgewotCQlpZiAoISByYXdfZmJfc3RyKSB7Ci0JCQlyZmJMb2coIlxuIik7Ci0JCQlyZmJMb2coIlhLRVlCT0FSRDogYWxsICVkIFwibXVzdCBoYXZlXCIga2V5c3ltcyBhY2NvdW50ZWQgZm9yLlxuIiwgbik7Ci0JCQlyZmJMb2coIiAgTm90IGF1dG9tYXRpY2FsbHkgc3dpdGNoaW5nIHRvIC14a2IgbW9kZS5cbiIpOwotCQkJcmZiTG9nKCIgIElmIHNvbWUga2V5cyBzdGlsbCBjYW5ub3QgYmUgdHlwZWQsIHRyeSB1c2luZyAteGtiLlxuIik7Ci0JCQlyZmJMb2coIiAgQWxzbywgcmVtZW1iZXIgXCItcmVtYXAgREVBRFwiIGZvciBhY2NlbnRpbmcgY2hhcmFjdGVycy5cbiIpOwotCQkJcmZiTG9nKCJcbiIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGs9MDsgazxuOyBrKyspIHsKLQkJbWlzc194a2Jba10gPSAxOwotCX0KLQotCWZvciAoa2MgPSAwOyBrYyA8IDB4MTAwOyBrYysrKSB7Ci0JICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgR1JQOyBncnArKykgewotCQlmb3IgKGx2bCA9IDA7IGx2bCA8IExWTDsgbHZsKyspIHsKLQkJCS8qIGxvb2sgdXAgdGhlIEtleXN5bSwgaWYgYW55ICovCi0JCQlrZXlzeW0gPSBYa2JLZXljb2RlVG9LZXlzeW0oZHB5LCBrYywgZ3JwLCBsdmwpOwotCQkJaWYgKGtleXN5bSA9PSBOb1N5bWJvbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChrPTA7IGs8bjsgaysrKSB7Ci0JCQkJaWYgKGtleXN5bSA9PSBtdXN0X2hhdmVba10pIHsKLQkJCQkJbWlzc194a2Jba10gPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCSAgICB9Ci0JfQotCi0JZm9yIChrPTA7IGs8bjsgaysrKSB7Ci0JCWlmIChtaXNzX3hrYltrXSkgewotCQkJbWlzc2luZ194a2IrKzsKLQkJfQotCX0KLQotCXJmYkxvZygiXG4iKTsKLQlpZiAobWlzc2luZ194a2IgPCBtaXNzaW5nX25veGtiKSB7Ci0JCXJmYkxvZygiWEtFWUJPQVJEOlxuIik7Ci0JCXJmYkxvZygiU3dpdGNoaW5nIHRvIC14a2IgbW9kZSB0byByZWNvdmVyIHRoZXNlIGtleXN5bXM6XG4iKTsKLQl9IGVsc2UgewotCQlyZmJMb2coIlhLRVlCT0FSRDogXCJtdXN0IGhhdmVcIiBrZXlzeW1zIGJldHRlciBhY2NvdW50ZWQiCi0JCSAgICAiIGZvclxuIik7Ci0JCXJmYkxvZygidW5kZXIgLW5veGtiIG1vZGU6IG5vdCBzd2l0Y2hpbmcgdG8gLXhrYiBtb2RlOlxuIik7Ci0JfQotCi0JcmZiTG9nKCIgICB4a2IgIG5veGtiICAgS2V5c3ltICAoXCJYXCIgbWVhbnMgcHJlc2VudClcbiIpOwotCXJmYkxvZygiICAgLS0tICAtLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQlmb3IgKGs9MDsgazxuOyBrKyspIHsKLQkJY2hhciAqeHgsICp4biwgKm5hbWU7Ci0KLQkJa2V5c3ltID0gbXVzdF9oYXZlW2tdOwotCQlpZiAoa2V5c3ltID09IE5vU3ltYm9sKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIW1pc3NfeGtiW2tdICYmICFtaXNzX25veGtiW2tdKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAobWlzc194a2Jba10pIHsKLQkJCXh4ID0gIiAgICI7Ci0JCX0gZWxzZSB7Ci0JCQl4eCA9ICIgWCAiOwotCQl9Ci0JCWlmIChtaXNzX25veGtiW2tdKSB7Ci0JCQl4biA9ICIgICAiOwotCQl9IGVsc2UgewotCQkJeG4gPSAiIFggIjsKLQkJfQotCQluYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0JCXJmYkxvZygiICAgJXMgICVzICAgICAweCVseCAgJXNcbiIsIHh4LCB4biwga2V5c3ltLAotCQkgICAgbmFtZSA/IG5hbWUgOiAibnVsbCIpOwotCX0KLQlyZmJMb2coIlxuIik7Ci0KLQlpZiAobWlzc2luZ194a2IgPCBtaXNzaW5nX25veGtiKSB7Ci0JCXJmYkxvZygiICBJZiB0aGlzIG1ha2VzIHRoZSBrZXkgbWFwcGluZyB3b3JzZSB5b3UgY2FuXG4iKTsKLQkJcmZiTG9nKCIgIGRpc2FibGUgaXQgd2l0aCB0aGUgXCItbm94a2JcIiBvcHRpb24uXG4iKTsKLQkJcmZiTG9nKCJcbiIpOwotCi0JCXVzZV94a2JfbW9kdHdlYWsgPSAxOwotCi0JfSBlbHNlIHsKLQkJcmZiTG9nKCIgIElmIHNvbWUga2V5cyBzdGlsbCBjYW5ub3QgYmUgdHlwZWQsIHRyeSB1c2luZyIKLQkJICAgICIgLXhrYi5cbiIpOwotCQlyZmJMb2coIiAgQWxzbywgcmVtZW1iZXIgXCItcmVtYXAgREVBRFwiIGZvciBhY2NlbnRpbmciCi0JCSAgICAiIGNoYXJhY3RlcnMuXG4iKTsKLQl9Ci0JcmZiTG9nKCJcbiIpOwotfQotCi0vKiBzZXRzIHVwIGFsbCB0aGUga2V5bWFwcGluZyBpbmZvIHZpYSBYa2IgQVBJICovCi0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfeGtiX21vZHR3ZWFrKHZvaWQpIHsKLQlLZXlTeW0ga3M7Ci0JaW50IGtjLCBncnAsIGx2bCwgazsKLQl1bnNpZ25lZCBpbnQgc3RhdGU7Ci0KLS8qCi0gKiBIZXJlIGlzIGEgZ3VpZGU6Ci0KLVdvcmthcm91bmRzIGFycmF5czoKLQotbXVsdGlfa2V5W10gICAgIGluZGljYXRlcyB3aGljaCBrZXljb2RlcyBoYXZlIE11bHRpX2tleSAoQ29tcG9zZSkKLSAgICAgICAgICAgICAgICBib3VuZCB0byB0aGVtLgotbW9kZV9zd2l0Y2hbXSAgIGluZGljYXRlcyB3aGljaCBrZXljb2RlcyBoYXZlIE1vZGVfc3dpdGNoIChBbHRHcikKLSAgICAgICAgICAgICAgICBib3VuZCB0byB0aGVtLgotc2hpZnRfa2V5c1tdICAgIGluZGljYXRlcyB3aGljaCBrZXljb2RlcyBoYXZlIFNoaWZ0IGJvdW5kIHRvIHRoZW0uCi1za2lwa2V5Y29kZVtdICAgaW5kaWNhdGVzIHdoaWNoIGtleWNvZGVzIGFyZSB0byBiZSBza2lwcGVkCi0gICAgICAgICAgICAgICAgZm9yIGFueSBsb29rdXBzIGZyb20gLXNraXBfa2V5Y29kZXMgb3B0aW9uLiAKLQotR3JvdXBzIGFuZCBMZXZlbHMsIGhlcmUgaXMgYW4gZXhhbXBsZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgXiAgICAgICAgICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB8ICAgICAgTDIgfCBBICAgQUUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc2hpZnQgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbGV2ZWwgICAgTDEgfCBhICAgYWUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIEcxICBHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGdyb3VwIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotVHJhZGl0aW9uYWxseSB0aGlzIGl0IGFsbCBhIGtleSBjb3VsZCBkby4gIEwxIHZzLiBMMiBzZWxlY3RlZCB2aWEgU2hpZnQKLWFuZCBHMSB2cy4gRzIgc2VsZWN0ZWQgdmlhIE1vZGVfc3dpdGNoLiAgVXAgdG8gNCBLZXlzeW1zIGNvdWxkIGJlIGJvdW5kCi10byBhIGtleS4gIFNlZSBpbml0aWFsaXplX21vZHR3ZWFrKCkgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhhdCB0eXBlCi1vZiBrZXltYXAgZnJvbSBYR2V0S2V5Ym9hcmRNYXBwaW5nKCkuCi0KLVhrYiBnaXZlcyB1cyB1cCB0byA0IGdyb3VwcyBhbmQgNjMgc2hpZnQgbGV2ZWxzIHBlciBrZXksIHdpdGggdGhlCi1zaXR1YXRpb24gYmVpbmcgcG90ZW50aWFsbHkgZGlmZmVyZW50IGZvciBlYWNoIGtleS4gIFRoaXMgaXMgY29tcGxpY2F0ZWQsCi1hbmQgSSBkb24ndCBjbGFpbSB0byB1bmRlcnN0YW5kIGl0IGFsbCwgYnV0IGluIHRoZSBmb2xsb3dpbmcgd2UganVzdCB0aGluawotb2YgcmFuZ2luZyBvdmVyIHRoZSBncm91cCBhbmQgbGV2ZWwgaW5kaWNlcyBhcyBjb3ZlcmluZyBhbGwgb2YgdGhlIGNhc2VzLgotVGhpcyBnaXZlcyB1cyBhbiBhY2N1cmF0ZSB2aWV3IG9mIHRoZSBrZXltYXAuICBUaGUgbWFpbiB0cmlja3kgcGFydAotaXMgbWFwcGluZyBiZXR3ZWVuIGdyb3VwK2xldmVsIGFuZCBtb2RpZmllciBzdGF0ZS4KLQotT24gY3VycmVudCBsaW51eC9YRnJlZTg2IHNldHVwcyAoWGtiIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCkgdGhlCi1pbmZvcm1hdGlvbiBmcm9tIFhHZXRLZXlib2FyZE1hcHBpbmcoKSAoZXZpZGVudGx5IHRoZSBjb21wYXQgbWFwKQotaXMgaW5jb21wbGV0ZSBhbmQgaW5hY2N1cmF0ZSwgc28gd2UgYXJlIHJlYWxseSBmb3JjZWQgdG8gdXNlIHRoZQotWGtiIEFQSS4KLQoteGtia2V5c3ltc1tdICAgICAgRm9yIGEgKGtleWNvZGUsZ3JvdXAsbGV2ZWwpIGhvbGRzIHRoZSBLZXlTeW0gKDAgZm9yIG5vbmUpCi14a2JzdGF0ZVtdICAgICAgICBGb3IgYSAoa2V5Y29kZSxncm91cCxsZXZlbCkgaG9sZHMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAgIG1vZGlmaWVyIHN0YXRlIG5lZWRlZCB0byBnZXQgdGhhdCBLZXlTeW0KLXhrYmlnbm9yZVtdICAgICAgIEZvciBhIChrZXljb2RlLGdyb3VwLGxldmVsKSB3aGljaCBtb2RpZmllcnMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICBpZ25vcmVkICh0aGUgMCBiaXRzIGNhbiBiZSBpZ25vcmVkKS4KLXhrYm1vZGlmaWVyc1tdICAgIEZvciB0aGUgS2V5U3ltIGJvdW5kIHRvIHRoaXMgKGtleWNvZGUsZ3JvdXAsbGV2ZWwpIHN0b3JlCi0gICAgICAgICAgICAgICAgICB0aGUgbW9kaWZpZXIgbWFzay4gICAKLSAqCi0gKi8KLQotCVJBV0ZCX1JFVF9WT0lECi0KLQkvKiBpbml0aWFsaXplIGFsbCB0aGUgYXJyYXlzOiAqLwotCWZvciAoa2MgPSAwOyBrYyA8IDB4MTAwOyBrYysrKSB7Ci0JCW11bHRpX2tleVtrY10gPSAwOwotCQltb2RlX3N3aXRjaFtrY10gPSAwOwotCQlza2lwa2V5Y29kZVtrY10gPSAwOwotCQlzaGlmdF9rZXlzW2tjXSA9IDA7Ci0KLQkJZm9yIChncnAgPSAwOyBncnAgPCBHUlA7IGdycCsrKSB7Ci0JCQlmb3IgKGx2bCA9IDA7IGx2bCA8IExWTDsgbHZsKyspIHsKLQkJCQl4a2JrZXlzeW1zW2tjXVtncnBdW2x2bF0gPSBOb1N5bWJvbDsKLQkJCQl4a2Jtb2RpZmllcnNba2NdW2dycF1bbHZsXSA9IC0xOwotCQkJCXhrYnN0YXRlW2tjXVtncnBdW2x2bF0gPSAtMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogdGhlIGFycmF5IGlzIDI1NipMVkwqR1JQLCBidXQgd2UgY2FuIG1ha2UgdGhlIHNlYXJjaGVkIHJlZ2lvbgotCSAqIHNtYWxsZXIgYnkgY29tcHV0aW5nIHRoZSBhY3R1YWwgcmFuZ2VzLgotCSAqLwotCWx2bF9tYXggPSAwOwotCWdycF9tYXggPSAwOwotCWtjX21heCA9IDA7Ci0Ja2NfbWluID0gMHgxMDA7Ci0KLQkvKiBmaXJzdCBrZXljb2RlIGZvciBhIG1vZGlmaWVyIHR5cGUgKG11bHRpX2tleSB0b28pICovCi0Ja2MxX3NoaWZ0ID0gLTE7Ci0Ja2MxX2NvbnRyb2wgPSAtMTsKLQlrYzFfY2FwbG9jayA9IC0xOwotCWtjMV9hbHQgPSAtMTsKLQlrYzFfbWV0YSA9IC0xOwotCWtjMV9udW1sb2NrID0gLTE7Ci0Ja2MxX3N1cGVyID0gLTE7Ci0Ja2MxX2h5cGVyID0gLTE7Ci0Ja2MxX21vZGVfc3dpdGNoID0gLTE7Ci0Ja2MxX2lzb19sZXZlbDNfc2hpZnQgPSAtMTsKLQlrYzFfbXVsdGlfa2V5ID0gLTE7Ci0KLQkvKgotCSAqIGxvb3Agb3ZlciBhbGwgcG9zc2libGUgKGtleWNvZGUsIGdyb3VwLCBsZXZlbCkgdHJpcGxlcwotCSAqIGFuZCByZWNvcmQgd2hhdCB3ZSBmaW5kIGZvciBpdDoKLQkgKi8KLQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJcmZiTG9nKCJpbml0aWFsaXplX3hrYl9tb2R0d2VhazogWEtCIGtleWNvZGUgLT4ga2V5c3ltcyAiCi0JCSAgICAibWFwcGluZyBpbmZvOlxuIik7Ci0JfQotCWZvciAoa2MgPSAwOyBrYyA8IDB4MTAwOyBrYysrKSB7Ci0JICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgR1JQOyBncnArKykgewotCQlmb3IgKGx2bCA9IDA7IGx2bCA8IExWTDsgbHZsKyspIHsKLQkJCXVuc2lnbmVkIGludCBtcywgbW9kczsKLQkJCWludCBzdGF0ZV9zYXZlID0gLTEsIG1vZHNfc2F2ZSA9IC0xOwotCQkJS2V5U3ltIGtzMjsKLQotCQkJLyogbG9vayB1cCB0aGUgS2V5c3ltLCBpZiBhbnkgKi8KLQkJCWtzID0gWGtiS2V5Y29kZVRvS2V5c3ltKGRweSwga2MsIGdycCwgbHZsKTsKLQkJCXhrYmtleXN5bXNba2NdW2dycF1bbHZsXSA9IGtzOwotCi0JCQkvKiBpZiBubyBLZXlzeW0sIG9uIHRvIG5leHQgKi8KLQkJCWlmIChrcyA9PSBOb1N5bWJvbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyoKLQkJCSAqIGZvciB2YXJpb3VzIHdvcmthcm91bmRzLCBub3RlIHdoZXJlIHRoZXNlIHNwZWNpYWwKLQkJCSAqIGtleXMgYXJlIGJvdW5kIHRvLgotCQkJICovCi0JCQlpZiAoa3MgPT0gWEtfTXVsdGlfa2V5KSB7Ci0JCQkJbXVsdGlfa2V5W2tjXSA9IGx2bCsxOwotCQkJfQotCQkJaWYgKGtzID09IFhLX01vZGVfc3dpdGNoKSB7Ci0JCQkJbW9kZV9zd2l0Y2hba2NdID0gbHZsKzE7Ci0JCQl9Ci0JCQlpZiAoa3MgPT0gWEtfU2hpZnRfTCB8fCBrcyA9PSBYS19TaGlmdF9SKSB7Ci0JCQkJc2hpZnRfa2V5c1trY10gPSBsdmwrMTsKLQkJCX0KLQotCQkJaWYgKGtzID09IFhLX1NoaWZ0X0wgfHwga3MgPT0gWEtfU2hpZnRfUikgewotCQkJCWlmIChrYzFfc2hpZnQgPT0gLTEpIHsKLQkJCQkJa2MxX3NoaWZ0ID0ga2M7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGtzID09IFhLX0NvbnRyb2xfTCB8fCBrcyA9PSBYS19Db250cm9sX1IpIHsKLQkJCQlpZiAoa2MxX2NvbnRyb2wgPT0gLTEpIHsKLQkJCQkJa2MxX2NvbnRyb2wgPSBrYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoa3MgPT0gWEtfQ2Fwc19Mb2NrIHx8IGtzID09IFhLX0NhcHNfTG9jaykgewotCQkJCWlmIChrYzFfY2FwbG9jayA9PSAtMSkgewotCQkJCQlrYzFfY2FwbG9jayA9IGtjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChrcyA9PSBYS19BbHRfTCB8fCBrcyA9PSBYS19BbHRfUikgewotCQkJCWlmIChrYzFfYWx0ID09IC0xKSB7Ci0JCQkJCWtjMV9hbHQgPSBrYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoa3MgPT0gWEtfTWV0YV9MIHx8IGtzID09IFhLX01ldGFfUikgewotCQkJCWlmIChrYzFfbWV0YSA9PSAtMSkgewotCQkJCQlrYzFfbWV0YSA9IGtjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChrcyA9PSBYS19OdW1fTG9jaykgewotCQkJCWlmIChrYzFfbnVtbG9jayA9PSAtMSkgewotCQkJCQlrYzFfbnVtbG9jayA9IGtjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChrcyA9PSBYS19TdXBlcl9MIHx8IGtzID09IFhLX1N1cGVyX1IpIHsKLQkJCQlpZiAoa2MxX3N1cGVyID09IC0xKSB7Ci0JCQkJCWtjMV9zdXBlciA9IGtjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChrcyA9PSBYS19IeXBlcl9MIHx8IGtzID09IFhLX0h5cGVyX1IpIHsKLQkJCQlpZiAoa2MxX2h5cGVyID09IC0xKSB7Ci0JCQkJCWtjMV9oeXBlciA9IGtjOwotCQkJCX0KLQkJCX0KLQkJCWlmIChrcyA9PSBYS19Nb2RlX3N3aXRjaCkgewotCQkJCWlmIChrYzFfbW9kZV9zd2l0Y2ggPT0gLTEpIHsKLQkJCQkJa2MxX21vZGVfc3dpdGNoID0ga2M7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGtzID09IFhLX0lTT19MZXZlbDNfU2hpZnQpIHsKLQkJCQlpZiAoa2MxX2lzb19sZXZlbDNfc2hpZnQgPT0gLTEpIHsKLQkJCQkJa2MxX2lzb19sZXZlbDNfc2hpZnQgPSBrYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoa3MgPT0gWEtfTXVsdGlfa2V5KSB7CS8qIG5vdCBhIG1vZGlmaWVyLi4gKi8KLQkJCQlpZiAoa2MxX211bHRpX2tleSA9PSAtMSkgewotCQkJCQlrYzFfbXVsdGlfa2V5ID0ga2M7Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogcmVjb3JkIG1heGltdW0gZXh0ZW50IGZvciBncm91cC9sZXZlbCBpbmRpY2VzCi0JCQkgKiBhbmQga2V5Y29kZSByYW5nZToKLQkJCSAqLwotCQkJaWYgKGdycCA+IGdycF9tYXgpIHsKLQkJCQlncnBfbWF4ID0gZ3JwOwotCQkJfQotCQkJaWYgKGx2bCA+IGx2bF9tYXgpIHsKLQkJCQlsdmxfbWF4ID0gbHZsOwotCQkJfQotCQkJaWYgKGtjID4ga2NfbWF4KSB7Ci0JCQkJa2NfbWF4ID0ga2M7Ci0JCQl9Ci0JCQlpZiAoa2MgPCBrY19taW4pIHsKLQkJCQlrY19taW4gPSBrYzsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIGxvb2t1cCBvbiAqa2V5c3ltKiAoaS5lLiBub3Qga2MsIGdycCwgbHZsKQotCQkJICogYW5kIGdldCB0aGUgbW9kaWZpZXIgbWFzay4gIHRoaXMgaXMgMCBmb3IKLQkJCSAqIG1vc3Qga2V5c3ltcywgb25seSBub24gemVybyBmb3IgbW9kaWZpZXJzLgotCQkJICovCi0JCQltcyA9IFhrYktleXN5bVRvTW9kaWZpZXJzKGRweSwga3MpOwotCQkJeGtibW9kaWZpZXJzW2tjXVtncnBdW2x2bF0gPSBtczsKLQotCQkJLyoKLQkJCSAqIEFtdXNpbmcgaGV1cmlzdGljIChtYXkgaGF2ZSBidWdzKS4gIFRoZXJlIGFyZQotCQkJICogOCBtb2RpZmllciBiaXRzLCBzbyAyNTYgcG9zc2libGUgbW9kaWZpZXIKLQkJCSAqIHN0YXRlcy4gIFdlIGxvb3Agb3ZlciBhbGwgb2YgdGhlbSBmb3IgdGhpcwotCQkJICoga2V5Y29kZSAoc2ltdWxhdGluZyBLZXkgImV2ZW50cyIpIGFuZCBhc2sKLQkJCSAqIFhrYkxvb2t1cEtleVN5bSB0byB0ZWxsIHVzIHRoZSBLZXlzeW0uICBPbmNlIGl0Ci0JCQkgKiBtYXRjaGVzIHRoZSBLZXlzeW0gd2UgaGF2ZSBmb3IgdGhpcyAoa2V5Y29kZSwKLQkJCSAqIGdyb3VwLCBsZXZlbCksIGdvdHRlbiB2aWEgWGtiS2V5Y29kZVRvS2V5c3ltKCkKLQkJCSAqIGFib3ZlLCB3ZSB0aGVuIChob3BlZnVsbHkuLi4pIGtub3cgdGhhdCBzdGF0ZQotCQkJICogb2YgbW9kaWZpZXJzIG5lZWRlZCB0byBnZW5lcmF0ZSB0aGlzIGtleXN5bS4KLQkJCSAqCi0JCQkgKiBZZXMuLi4ga2VlcCB5b3VyIGZpbmdlcnMgY3Jvc3NlZC4KLQkJCSAqCi0JCQkgKiBOb3RlIHRoYXQgbWFueSBvZiB0aGUgMjU2IHN0YXRlcyBnaXZlIHRoZQotCQkJICogS2V5c3ltLCB3ZSBqdXN0IG5lZWQgb25lLCBhbmQgd2UgdGFrZSB0aGUKLQkJCSAqIGZpcnN0IG9uZSBmb3VuZC4KLQkJCSAqLwotCQkJc3RhdGUgPSAwOwotCQkJd2hpbGUoc3RhdGUgPCAyNTYpIHsKLQkJCQlpZiAoWGtiTG9va3VwS2V5U3ltKGRweSwga2MsIHN0YXRlLCAmbW9kcywKLQkJCQkgICAgJmtzMikpIHsKLQotCQkJCQkvKiBzYXZlIHRoZXNlIGZvciB3b3JrYXJvdW5kIGJlbG93ICovCi0JCQkJCWlmIChzdGF0ZV9zYXZlID09IC0xKSB7Ci0JCQkJCQlzdGF0ZV9zYXZlID0gc3RhdGU7Ci0JCQkJCQltb2RzX3NhdmUgPSBtb2RzOwotCQkJCQl9Ci0JCQkJCWlmIChrczIgPT0ga3MpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiB6ZXJvIHRoZSBpcnJlbGV2YW50IGJpdHMKLQkJCQkJCSAqIGJ5IGFuZGluZyB3aXRoIG1vZHMuCi0JCQkJCQkgKi8KLQkJCQkJCXhrYnN0YXRlW2tjXVtncnBdW2x2bF0KLQkJCQkJCSAgICA9IHN0YXRlICYgbW9kczsKLQkJCQkJCS8qCi0JCQkJCQkgKiBhbHNvIHJlbWVtYmVyIHRoZSBpcnJlbGV2YW50Ci0JCQkJCQkgKiBiaXRzIHNpbmNlIGl0IGlzIGhhbmR5LgotCQkJCQkJICovCi0JCQkJCQl4a2JpZ25vcmVba2NdW2dycF1bbHZsXSA9IG1vZHM7Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0YXRlKys7Ci0JCQl9Ci0JCQlpZiAoeGtic3RhdGVba2NdW2dycF1bbHZsXSA9PSAodW5zaWduZWQgaW50KSAtMQotCQkJICAgICYmIGdycCA9PSAxKSB7Ci0JCQkJLyoKLQkJCQkgKiBIYWNrIG9uIFNvbGFyaXMgOSBmb3IgTW9kZV9zd2l0Y2gKLQkJCQkgKiBmb3IgR3JvdXAyIGNoYXJhY3RlcnMuICBXZSBmb3JjZSB0aGUgCi0JCQkJICogTW9kZV9zd2l0Y2ggbW9kaWZpZXIgYml0IG9uLgotCQkJCSAqIFhYWCBOZWVkIHRvIGZpZ3VyZSBvdXQgYmV0dGVyIHdoYXQgaXMKLQkJCQkgKiBoYXBwZW5pbmcgaGVyZS4gIElzIGNvbXBhdCBvbiBzb21laG93Pz8KLQkJCQkgKi8KLQkJCQl1bnNpZ25lZCBpbnQgbXMyOwotCQkJCW1zMiA9IFhrYktleXN5bVRvTW9kaWZpZXJzKGRweSwgWEtfTW9kZV9zd2l0Y2gpOwotCi0JCQkJeGtic3RhdGVba2NdW2dycF1bbHZsXQotCQkJCSAgICA9IChzdGF0ZV9zYXZlICYgbW9kc19zYXZlKSB8IG1zMjsKLQotCQkJCXhrYmlnbm9yZVtrY11bZ3JwXVtsdmxdID0gbW9kc19zYXZlIHwgbXMyOwotCQkJfQotCi0JCQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJCQljaGFyICpzdHI7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgICUwM2QgIEclZCBMJWQgIG1vZD0lcyAiLAotCQkJCSAgICBrYywgZ3JwKzEsIGx2bCsxLCBiaXRwcmludChtcywgOCkpOwotCQkJCWZwcmludGYoc3RkZXJyLCAic3RhdGU9JXMgIiwKLQkJCQkgICAgYml0cHJpbnQoeGtic3RhdGVba2NdW2dycF1bbHZsXSwgOCkpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiaWdub3JlPSVzICIsCi0JCQkJICAgIGJpdHByaW50KHhrYmlnbm9yZVtrY11bZ3JwXVtsdmxdLCA4KSk7Ci0JCQkJc3RyID0gWEtleXN5bVRvU3RyaW5nKGtzKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiBrcz0weCUwOGx4IFwiJXNcIlxuIiwKLQkJCQkgICAga3MsIHN0ciA/IHN0ciA6ICJudWxsIik7Ci0JCQl9Ci0JCX0KLQkgICAgfQotCX0KLQotCS8qCi0JICoga2NfdmVjIHdpbGwgYmUgdXNlZCBpbiBzb21lIHBsYWNlcyB0byBmaW5kIG1vZGlmaWVycywgZXRjCi0JICogd2UgYXBwbHkgc29tZSBwZXJtdXRhdGlvbnMgdG8gaXQgYXMgd29ya2Fyb3VuZHMuCi0JICovCi0JZm9yIChrYyA9IDA7IGtjIDwgMHgxMDA7IGtjKyspIHsKLQkJa2NfdmVjW2tjXSA9IGtjOwotCX0KLQotCWlmIChrYzFfbW9kZV9zd2l0Y2ggIT0gLTEgJiYga2MxX2lzb19sZXZlbDNfc2hpZnQgIT0gLTEpIHsKLQkJaWYgKGtjMV9tb2RlX3N3aXRjaCA8IGtjMV9pc29fbGV2ZWwzX3NoaWZ0KSB7Ci0JCQkvKiB3ZSBwcmVmZXIgWEtfSVNPX0xldmVsM19TaGlmdDogKi8KLQkJCWtjX3ZlY1trYzFfbW9kZV9zd2l0Y2hdID0ga2MxX2lzb19sZXZlbDNfc2hpZnQ7Ci0JCQlrY192ZWNba2MxX2lzb19sZXZlbDNfc2hpZnRdID0ga2MxX21vZGVfc3dpdGNoOwotCQl9Ci0JfQotCS8qIGFueSBtb3JlPyBuZWVkIHRvIHdhdGNoIGZvciB1bmRvaW5nIHRoZSBhYm92ZS4gKi8KLQotCS8qCi0JICogcHJvY2VzcyB0aGUgdXNlciBzdXBwbGllZCAtc2tpcF9rZXljb2RlcyBzdHJpbmcuCi0JICogVGhpcyBpcyBwcmVzdW1hYmx5IGEgbGlzdCBpZiAiZ2hvc3QiIGtleWNvZGVzLCB0aGUgWCBzZXJ2ZXIKLQkgKiB0aGlua3MgdGhleSBleGlzdCwgYnV0IHRoZXkgZG8gbm90LiAgZ2hvc3RzIGNhbiBsZWFkIHRvCi0JICogYW1iaWd1aXRpZXMgaW4gdGhlIHJldmVyc2UgbWFwOiBLZXlzeW0gLT4gS2V5Q29kZSArIE1vZHN0YXRlLAotCSAqIHNvIGlmIHdlIGNhbiBpZ25vcmUgdGhlbSBzbyBtdWNoIHRoZSBiZXR0ZXIuICBQcmVzdW1hYmx5IHRoZQotCSAqIHVzZXIgY2FuIG5ldmVyIGdlbmVyYXRlIHRoZW0gZnJvbSB0aGUgcGh5c2ljYWwga2V5Ym9hcmQuCi0JICogVGhlcmUgbWF5IGJlIG90aGVyIHJlYXNvbnMgdG8gZGVhZGVuIHNvbWUga2V5cy4KLQkgKi8KLQlpZiAoc2tpcF9rZXljb2RlcyAhPSBOVUxMKSB7Ci0JCWNoYXIgKnAsICpzdHIgPSBzdHJkdXAoc2tpcF9rZXljb2Rlcyk7Ci0JCXAgPSBzdHJ0b2soc3RyLCAiLCBcdFxuXHIiKTsKLQkJd2hpbGUgKHApIHsKLQkJCWsgPSAxOwotCQkJaWYgKHNzY2FuZihwLCAiJWQiLCAmaykgIT0gMSB8fCBrIDwgMCB8fCBrID49IDB4MTAwKSB7Ci0JCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJCXJmYkxvZygiaW52YWxpZCBza2lwX2tleWNvZGVzOiAlcyAlc1xuIiwKLQkJCQkgICAgc2tpcF9rZXljb2RlcywgcCk7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCXNraXBrZXljb2RlW2tdID0gMTsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwgXHRcblxyIik7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJZnByaW50ZihzdGRlcnIsICJncnBfbWF4PSVkIGx2bF9tYXg9JWRcbiIsIGdycF9tYXgsIGx2bF9tYXgpOwotCX0KLX0KLQotc3RhdGljIHNob3J0ICoqc2NvcmVfaGludCA9IE5VTEw7Ci0vKgotICogQ2FsbGVkIG9uIHVzZXIga2V5Ym9hcmQgaW5wdXQuICBUcnkgdG8gc29sdmUgdGhlIHJldmVyc2UgbWFwcGluZwotICogcHJvYmxlbTogS2V5U3ltIChmcm9tIFZOQyBjbGllbnQpID0+IEtleUNvZGUocykgdG8gcHJlc3MgdG8gZ2VuZXJhdGUKLSAqIGl0LiAgVGhlIG9uZS10by1tYW55IEtleVN5bSA9PiBLZXlDb2RlIG1hcHBpbmcgbWFrZXMgaXQgZGlmZmljdWx0LCBhcwotICogZG9lcyB3b3JraW5nIG91dCB3aGF0IGNoYW5nZXMgdG8gdGhlIG1vZGlmaWVyIGtleXByZXNzZXMgYXJlIG5lZWRlZC4KLSAqLwotc3RhdGljIHZvaWQgeGtiX3R3ZWFrX2tleWJvYXJkKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwKLSAgICByZmJDbGllbnRQdHIgY2xpZW50KSB7Ci0KLQlpbnQga2MsIGdycCwgbHZsLCBpLCBrY2k7Ci0JaW50IGtjX2ZbMHgxMDBdLCBncnBfZlsweDEwMF0sIGx2bF9mWzB4MTAwXSwgc3RhdGVfZlsweDEwMF0sIGZvdW5kOwotCWludCBpZ25vcmVfZlsweDEwMF07Ci0JdW5zaWduZWQgaW50IHN0YXRlID0gMDsKLQotCi0JLyogdGhlc2UgYXJlIHVzZWQgZm9yIGZpbmRpbmcgbW9kaWZpZXJzLCBldGMgKi8KLQlYa2JTdGF0ZVJlYyBrYnN0YXRlOwotCWludCBnb3Rfa2JzdGF0ZSA9IDA7Ci0JaW50IEtjX2YsIEdycF9mID0gMCwgTHZsX2YgPSAwOwotIwlkZWZpbmUgS0xBU1QgMTAKLQlzdGF0aWMgaW50IEtjX2xhc3RfZG93bltLTEFTVF07Ci0Jc3RhdGljIEtleVN5bSBLc19sYXN0X2Rvd25bS0xBU1RdOwotCXN0YXRpYyBpbnQga2xhc3QgPSAwLCBraGludHMgPSAxLCBhbnlkb3duID0gMTsKLQlzdGF0aWMgaW50IGNudCA9IDA7Ci0KLQlpZiAoIWNsaWVudCB8fCAhZG93biB8fCAha2V5c3ltKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCVhfTE9DSzsKLQotCWlmIChrbGFzdCA9PSAwKSB7Ci0JCWludCBpLCBqOwotCQlmb3IgKGk9MDsgaTxLTEFTVDsgaSsrKSB7Ci0JCQlLY19sYXN0X2Rvd25baV0gPSAtMTsKLQkJCUtzX2xhc3RfZG93bltpXSA9IE5vU3ltYm9sOwotCQl9Ci0JCWlmIChnZXRlbnYoIk5PS0VZSElOVFMiKSkgewotCQkJa2hpbnRzID0gMDsKLQkJfQotCQlpZiAoZ2V0ZW52KCJOT0FOWURPV04iKSkgewotCQkJYW55ZG93biA9IDA7Ci0JCX0KLQkJaWYgKGdldGVudigiS0VZU0RPV04iKSkgewotCQkJa2xhc3QgPSBhdG9pKGdldGVudigiS0VZU0RPV04iKSk7Ci0JCQlpZiAoa2xhc3QgPCAxKSBrbGFzdCA9IDE7Ci0JCQlpZiAoa2xhc3QgPiBLTEFTVCkga2xhc3QgPSBLTEFTVDsKLQkJfSBlbHNlIHsKLQkJCWtsYXN0ID0gMzsKLQkJfQotCQlpZiAoa2hpbnRzICYmIHNjb3JlX2hpbnQgPT0gTlVMTCkgewotCQkJc2NvcmVfaGludCA9IChzaG9ydCAqKikgbWFsbG9jKDB4MTAwICogc2l6ZW9mKHNob3J0ICopKTsKLQkJCWZvciAoaT0wOyBpPDB4MTAwOyBpKyspIHsKLQkJCQlzY29yZV9oaW50W2ldID0gKHNob3J0ICopIG1hbGxvYygweDEwMCAqIHNpemVvZihzaG9ydCkpOwotCQkJfQotCQkJCi0JCQlmb3IgKGk9MDsgaTwweDEwMDsgaSsrKSB7Ci0JCQkJZm9yIChqPTA7IGo8MHgxMDA7IGorKykgewotCQkJCQlzY29yZV9oaW50W2ldW2pdID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWNudCsrOwotCWlmIChjbnQgJSAxMDAgJiYga2hpbnRzICYmIHNjb3JlX2hpbnQgIT0gTlVMTCkgewotCQlpbnQgaSwgajsKLQkJZm9yIChpPTA7IGk8MHgxMDA7IGkrKykgewotCQkJZm9yIChqPTA7IGo8MHgxMDA7IGorKykgewotCQkJCXNjb3JlX2hpbnRbaV1bal0gPSAtMTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQljaGFyICpzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQotCQlpZiAoZGVidWdfa2V5Ym9hcmQgPiAxKSB7Ci0JCQlyZmJMb2coIi0tLS0tLS0tLS1zdGFydC14a2JfdHdlYWtfa2V5Ym9hcmQgKCVzKSAiCi0JCQkgICAgIi0tLS0tLS0tXG4iLCBkb3duID8gIkRPV04iIDogIlVQIik7Ci0JCX0KLQotCQlyZmJMb2coInhrYl90d2Vha19rZXlib2FyZDogJXMga2V5c3ltPTB4JXggXCIlc1wiXG4iLAotCQkgICAgZG93biA/ICJkb3duIiA6ICJ1cCIsIChpbnQpIGtleXN5bSwgc3RyID8gc3RyIDogIm51bGwiKTsKLQl9Ci0KLQkvKgotCSAqIHNldCBldmVyeXRoaW5nIHRvIG5vdC15ZXQtZm91bmQuCi0JICogdGhlc2UgImZvdW5kIiBhcnJheXMgKCpfZikgbGV0IHVzIGR5bmFtaWNhbGx5IGNvbnNpZGVyIHRoZQotCSAqIG9uZS10by1tYW55IEtleXN5bSAtPiBLZXljb2RlIGlzc3VlLiAgd2Ugc2V0IHRoZSBzaXplIGF0IDI1NiwKLQkgKiBidXQgb2YgY291cnNlIG9ubHkgdmVyeSBmZXcgd2lsbCBiZSBmb3VuZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMHgxMDA7IGkrKykgewotCQlrY19mW2ldICAgID0gLTE7Ci0JCWdycF9mW2ldICAgPSAtMTsKLQkJbHZsX2ZbaV0gICA9IC0xOwotCQlzdGF0ZV9mW2ldID0gLTE7Ci0JCWlnbm9yZV9mW2ldID0gLTE7Ci0JfQotCWZvdW5kID0gMDsKLQotCS8qCi0JICogbG9vcCBvdmVyIGFsbCAoa2V5Y29kZSwgZ3JvdXAsIGxldmVsKSB0cmlwbGVzIGxvb2tpbmcgZm9yCi0JICogbWF0Y2hpbmcga2V5c3ltcy4gIEFtYXppbmdseSB0aGlzIGlzbid0IHNsb3cgKGJ1dCBtYXliZSBpZgotCSAqIHlvdSB0eXBlIHJlYWxseSBmYXN0Li4uKS4gIEhhc2ggbG9va3VwIGludG8gYSBsaW5rZWQgbGlzdCBvZgotCSAqIChrZXljb2RlLGdycCxsdmwpIHRyaXBsZXMgd291bGQgYmUgdGhlIHdheSB0byBpbXByb3ZlIHRoaXMKLQkgKiBpbiB0aGUgZnV0dXJlIGlmIG5lZWRlZC4KLQkgKi8KLQlmb3IgKGtjID0ga2NfbWluOyBrYyA8PSBrY19tYXg7IGtjKyspIHsKLQkgICAgZm9yIChncnAgPSAwOyBncnAgPCBncnBfbWF4KzE7IGdycCsrKSB7Ci0JCWZvciAobHZsID0gMDsgbHZsIDwgbHZsX21heCsxOyBsdmwrKykgewotCQkJaWYgKGtleXN5bSAhPSB4a2JrZXlzeW1zW2tjXVtncnBdW2x2bF0pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qIGdvdCBhIGtleXN5bSBtYXRjaCAqLwotCQkJc3RhdGUgPSB4a2JzdGF0ZVtrY11bZ3JwXVtsdmxdOwotCi0JCQlpZiAoZGVidWdfa2V5Ym9hcmQgPiAxKSB7Ci0JCQkJY2hhciAqczEsICpzMjsKLQkJCQlzMSA9IFhLZXlzeW1Ub1N0cmluZyhYS2V5Y29kZVRvS2V5c3ltKGRweSwKLQkJCQkgICAga2MsIDApKTsKLQkJCQlpZiAoISBzMSkgczEgPSAibnVsbCI7Ci0JCQkJczIgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQkJCQlpZiAoISBzMikgczIgPSAibnVsbCI7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgIGdvdCBtYXRjaCBrYz0lMDNkPTB4JTAyeCBHJWQiCi0JCQkJICAgICIgTCVkICBrcz0weCV4IFwiJXNcIiAgKGJhc2VzeW06IFwiJXNcIilcbiIsCi0JCQkJICAgIGtjLCBrYywgZ3JwKzEsIGx2bCsxLCBrZXlzeW0sIHMyLCBzMSk7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgICAgbmVlZCBzdGF0ZTogJXNcbiIsCi0JCQkJICAgIGJpdHByaW50KHN0YXRlLCA4KSk7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgICAgaWdub3JhYmxlIDogJXNcbiIsCi0JCQkJICAgIGJpdHByaW50KHhrYmlnbm9yZVtrY11bZ3JwXVtsdmxdLCA4KSk7Ci0JCQl9Ci0KLQkJCS8qIHNhdmUgaXQgaWYgc3RhdGUgaXMgT0sgYW5kIG5vdCB0b2xkIHRvIHNraXAgKi8KLQkJCWlmIChzdGF0ZSA9PSAodW5zaWduZWQgaW50KSAtMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHNraXBrZXljb2RlW2tjXSAmJiBkZWJ1Z19rZXlib2FyZCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIHh4eCBza2lwcGluZyBrZXljb2RlOiAlZCAiCi0JCQkJICAgIkclZC9MJWRcbiIsIGtjLCBncnArMSwgbHZsKzEpOwotCQkJfQotCQkJaWYgKHNraXBrZXljb2RlW2tjXSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZvdW5kID4gMCAmJiBrYyA9PSBrY19mW2ZvdW5kLTFdKSB7Ci0JCQkJLyogaWdub3JlIHJlcGVhdHMgZm9yIHNhbWUga2V5Y29kZSAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJa2NfZltmb3VuZF0gPSBrYzsKLQkJCWdycF9mW2ZvdW5kXSA9IGdycDsKLQkJCWx2bF9mW2ZvdW5kXSA9IGx2bDsKLQkJCXN0YXRlX2ZbZm91bmRdID0gc3RhdGU7Ci0JCQlpZ25vcmVfZltmb3VuZF0gPSB4a2JpZ25vcmVba2NdW2dycF1bbHZsXTsKLQkJCWZvdW5kKys7Ci0JCX0KLQkgICAgfQotCX0KLQotI2RlZmluZSBQS0JTVEFURSAgXAotCWZwcmludGYoc3RkZXJyLCAiICAgIC0tLSBjdXJyZW50IG1vZCBzdGF0ZTpcbiIpOyBcCi0JZnByaW50ZihzdGRlcnIsICIgICAgbW9kcyAgICAgIDogJXNcbiIsIGJpdHByaW50KGtic3RhdGUubW9kcywgOCkpOyBcCi0JZnByaW50ZihzdGRlcnIsICIgICAgYmFzZV9tb2RzIDogJXNcbiIsIGJpdHByaW50KGtic3RhdGUuYmFzZV9tb2RzLCA4KSk7IFwKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBsYXRjaF9tb2RzOiAlc1xuIiwgYml0cHJpbnQoa2JzdGF0ZS5sYXRjaGVkX21vZHMsIDgpKTsgXAotCWZwcmludGYoc3RkZXJyLCAiICAgIGxvY2tfbW9kcyA6ICVzXG4iLCBiaXRwcmludChrYnN0YXRlLmxvY2tlZF9tb2RzLCA4KSk7IFwKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBjb21wYXQgICAgOiAlc1xuIiwgYml0cHJpbnQoa2JzdGF0ZS5jb21wYXRfc3RhdGUsIDgpKTsKLQotCS8qCi0JICogTm93IGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQgZnJvbSB0aGUgWCBzZXJ2ZXIuCi0JICogVGhpcyBzZWVtcyB0byBiZSB0aGUgc2FmZXN0IHdheSB0byBnbyBhcyBvcHBvc2VkIHRvIG91cgotCSAqIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vZGlmaWVyIHN0YXRlIG9uIG91ciBvd24uICBBZ2FpbiwKLQkgKiB0aGlzIGlzIGZvcnR1bmF0ZWx5IG5vdCB0b28gc2xvdy4KLQkgKi8KLQotCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJLyogZ2V0IHN0YXRlIGVhcmx5IGZvciBkZWJ1ZyBvdXRwdXQgKi8KLQkJWGtiR2V0U3RhdGUoZHB5LCBYa2JVc2VDb3JlS2JkLCAma2JzdGF0ZSk7Ci0JCWdvdF9rYnN0YXRlID0gMTsKLQkJUEtCU1RBVEUKLQl9Ci0KLQlpZiAoIWZvdW5kICYmIGFkZF9rZXlzeW1zICYmIGtleXN5bSAmJiAhIElzTW9kaWZpZXJLZXkoa2V5c3ltKSkgewotCQlpbnQgbmV3X2tjID0gYWRkX2tleXN5bShrZXlzeW0pOwotCQlpZiAobmV3X2tjICE9IDApIHsKLQkJCWZvdW5kID0gMTsKLQkJCWtjX2ZbMF0gPSBuZXdfa2M7Ci0JCQlncnBfZlswXSA9IDA7IAotCQkJbHZsX2ZbMF0gPSAwOyAKLQkJCXN0YXRlX2ZbMF0gPSAwOwotCQl9Ci0JfQotCi0JaWYgKCFmb3VuZCAmJiBkZWJ1Z19rZXlib2FyZCkgewotCQljaGFyICpzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQkJZnByaW50ZihzdGRlcnIsICIgICAgKioqIE5PIGtleSBmb3VuZCBmb3I6IDB4JXggJXMgICIKLQkJICAgICIqa2V5c3Ryb2tlIGlnbm9yZWQqXG4iLCBrZXlzeW0sIHN0ciA/IHN0ciA6ICJudWxsIik7Ci0JfQotCWlmICghZm91bmQpIHsKLQkJWF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiAKLQkgKiB3ZSB0cnkgdG8gb3B0aW1pemUgaGVyZSBpZiBmb3VuZCA+IDEKLQkgKiBlLmcuIG1pbmltaXplIGx2bCBvciBncnAsIG9yIG90aGVyIHRoaW5ncyB0byBnaXZlCi0JICogInNhZmVzdCIgc2NlbmFyaW8gdG8gc2ltdWxhdGUgdGhlIGtleXN0cm9rZXMuCi0JICovCi0KLQlpZiAoZm91bmQgPiAxKSB7Ci0JCWlmIChkb3duKSB7Ci0JCQlpbnQgbCwgc2NvcmVbMHgxMDBdOwotCQkJaW50IGJlc3QgPSAwLCBiZXN0X3Njb3JlID0gLTE7Ci0JCQkvKiBuZWVkIHRvIGJyZWFrIHRoZSB0aWUuLi4gKi8KLQkJCWlmICghIGdvdF9rYnN0YXRlKSB7Ci0JCQkJWGtiR2V0U3RhdGUoZHB5LCBYa2JVc2VDb3JlS2JkLCAma2JzdGF0ZSk7Ci0JCQkJZ290X2tic3RhdGUgPSAxOwotCQkJfQotCQkJaWYgKGtoaW50cyAmJiBrZXlzeW0gPCAweDEwMCkgewotCQkJCWludCBrcyA9IChpbnQpIGtleXN5bSwgajsKLQkJCQlmb3IgKGo9MDsgajwgMHgxMDA7IGorKykgewotCQkJCQlzY29yZV9oaW50W2tzXVtqXSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCWZvciAobD0wOyBsIDwgZm91bmQ7IGwrKykgewotCQkJCWludCBteXNjb3JlID0gMCwgYiA9IDB4MSwgaTsKLQkJCQlpbnQgY3VyciwgY3Vycl9zdGF0ZSA9IGtic3RhdGUubW9kczsKLQkJCQlpbnQgbmVlZCwgbmVlZF9zdGF0ZSA9IHN0YXRlX2ZbbF07Ci0JCQkJaW50IGlnbm9yZV9zdGF0ZSA9IGlnbm9yZV9mW2xdOwotCi0JCQkJLyogc2VlIGhvdyBtYW55IG1vZGlmaWVycyBuZWVkIHRvIGJlIGNoYW5nZWQgKi8KLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJCQkJY3VyciA9IGIgJiBjdXJyX3N0YXRlOwotCQkJCQluZWVkID0gYiAmIG5lZWRfc3RhdGU7Ci0JCQkJCWlmICghIChiICYgaWdub3JlX3N0YXRlKSkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgaWYgKGN1cnIgPT0gbmVlZCkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbXlzY29yZSsrOwotCQkJCQl9Ci0JCQkJCWIgPSBiIDw8IDE7Ci0JCQkJfQotCQkJCW15c2NvcmUgKj0gMTAwOwotCi0JCQkJLyogdGhyb3cgaW4gc29tZSBtaW5pbWl6YXRpb24gb2YgbHZsIHRvbzogKi8KLQkJCQlteXNjb3JlICs9IDIqbHZsX2ZbbF0gKyBncnBfZltsXTsKLQotCQkJCS8qCi0JCQkJICogWFhYIHNpbmNlIHdlIG5vdyBpbnRlcm5hbGx5IHRyYWNrCi0JCQkJICoga2V5Y29kZV9zdGF0ZVtdLCB3ZSBjb3VsZCB0aHJvdyB0aGF0IGludG8KLQkJCQkgKiB0aGUgc2NvcmUgYXMgd2VsbC4gIEkuZS4gaWYgaXQgaXMgYWxyZWFkeQotCQkJCSAqIGRvd24sIGl0IGlzIHBvaW50bGVzcyB0byB0aGluayB3ZSBjYW4KLQkJCQkgKiBwcmVzcyBpdCBkb3duIGZ1cnRoZXIhICBFLmcuCi0JCQkJICogICBteXNjb3JlICs9IDEwMDAgKiBrZXljb2RlX3N0YXRlW2tjX2ZbbF1dOwotCQkJCSAqIEFsc28gY291bGQgd2F0Y2ggbXVsdGlwbGUgbW9kaWZpZXIKLQkJCQkgKiBwcm9ibGVtLCBlLmcuIFNoaWZ0K2tleSAtPiBBbHQKLQkJCQkgKiBrZXljb2RlID0gMTI1IG9uIG15IGtleWJvYXJkLgotCQkJCSAqLwotCi0JCQkJc2NvcmVbbF0gPSBteXNjb3JlOwotCQkJCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIgICAgKioqIHNjb3JlIGZvciAiCi0JCQkJCSAgICAia2V5Y29kZSAlMDNkOiAlNGRcbiIsCi0JCQkJCSAgICBrY19mW2xdLCBteXNjb3JlKTsKLQkJCQl9Ci0JCQkJaWYgKGtoaW50cyAmJiBrZXlzeW0gPCAweDEwMCAmJiBrY19mW2xdIDwgMHgxMDApIHsKLQkJCQkJc2NvcmVfaGludFsoaW50KSBrZXlzeW1dW2tjX2ZbbF1dID0gKHNob3J0KSBzY29yZVtsXTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGw9MDsgbCA8IGZvdW5kOyBsKyspIHsKLQkJCQlpbnQgbXlzY29yZSA9IHNjb3JlW2xdOwotCQkJCWlmIChiZXN0X3Njb3JlID09IC0xIHx8IG15c2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0JCQkJCWJlc3QgPSBsOwotCQkJCQliZXN0X3Njb3JlID0gbXlzY29yZTsKLQkJCQl9Ci0JCQl9Ci0JCQlLY19mID0ga2NfZltiZXN0XTsKLQkJCUdycF9mID0gZ3JwX2ZbYmVzdF07Ci0JCQlMdmxfZiA9IGx2bF9mW2Jlc3RdOwotCQkJc3RhdGUgPSBzdGF0ZV9mW2Jlc3RdOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQkvKiB1cCAqLwotCQkJaW50IGksIEtjX2xvYyA9IC0xOwotCQkJS2NfZiA9IC0xOwotCi0JCQkvKiBmaXJzdCB0cnkgdGhlIHNjb3JlcyB3ZSByZW1lbWJlcmVkIHdoZW4gdGhlIGtleSB3ZW50IGRvd246ICovCi0JCQlpZiAoa2hpbnRzICYmIGtleXN5bSA8IDB4MTAwKSB7Ci0JCQkJLyogbG93IGtleXN5bXMsIGFzY2lpLCBvbmx5ICovCi0JCQkJaW50IGtzID0gKGludCkga2V5c3ltOwotCQkJCWludCBvayA9IDEsIGxiZXN0ID0gMCwgbDsKLQkJCQlzaG9ydCBzYmVzdCA9IC0xOwotCQkJCWZvciAobD0wOyBsIDwgZm91bmQ7IGwrKykgewotCQkJCQlpZiAoa2NfZltsXSA8IDB4MTAwKSB7Ci0JCQkJCQlpbnQga2V5ID0gKGludCkga2NfZltsXTsKLQkJCQkJCWlmICghIGtleWNvZGVfc3RhdGVba2V5XSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJaWYgKHNjb3JlX2hpbnRba3NdW2tleV0gPCAwKSB7Ci0JCQkJCQkJb2sgPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJaWYgKHNiZXN0IDwgMCB8fCBzY29yZV9oaW50W2tzXVtrZXldIDwgc2Jlc3QpIHsKLQkJCQkJCQlzYmVzdCA9IHNjb3JlX2hpbnRba3NdW2tleV07Ci0JCQkJCQkJbGJlc3QgPSBsOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJb2sgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9rICYmIHNiZXN0ICE9IC0xKSB7Ci0JCQkJCUtjX2YgPSBrY19mW2xiZXN0XTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnX2tleWJvYXJkICYmIEtjX2YgIT0gLTEpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIgICAgVVA6IGZvdW5kIHZpYSBzY29yZV9oaW50LCBzL2w9JWQvJWRcbiIsCi0JCQkJCSAgICBzYmVzdCwgbGJlc3QpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogbmV4dCBsb29rIGF0IG91ciBsaXN0IG9mIHJlY2VudGx5IHByZXNzZWQgZG93biBrZXlzICovCi0JCQlpZiAoS2NfZiA9PSAtMSkgewotCQkJCWZvciAoaT1rbGFzdC0xOyBpPj0wOyBpLS0pIHsKLQkJCQkJLyoKLQkJCQkJICogc29tZSBwZW9wbGUgdHlwZSByZWFsbHkgZmFzdCBhbmQgbGVhdmUKLQkJCQkJICogbG90cyBvZiBrZXlzIGRvd24gYmVmb3JlIHJlbGVhc2luZwotCQkJCQkgKiB0aGVtLiAgdGhpcyBnaXZlcyBwcm9ibGVtIG9uIHdlaXJkCi0JCQkJCSAqIHF3ZXJ0eStkdm9yYWsga2V5bWFwcGluZ3Mgd2hlcmUgZWFjaAotCQkJCQkgKiBhbHBoYSBjaGFyYWN0ZXIgaXMgb24gVFdPIGtleXMuCi0JCQkJCSAqLwotCQkJCQlpZiAoa2V5c3ltID09IEtzX2xhc3RfZG93bltpXSkgewotCQkJCQkJaW50IGw7Ci0JCQkJCQlmb3IgKGw9MDsgbCA8IGZvdW5kOyBsKyspIHsKLQkJCQkJCQlpZiAoS2NfbGFzdF9kb3duW2ldID09IGtjX2ZbbF0pIHsKLQkJCQkJCQkJaW50IGtleSA9IChpbnQpIGtjX2ZbbF07Ci0JCQkJCQkJCWlmIChrZXljb2RlX3N0YXRlW2tleV0pIHsKLQkJCQkJCQkJCUtjX2YgPSBLY19sYXN0X2Rvd25baV07Ci0JCQkJCQkJCQlLY19sb2MgPSBpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKEtjX2YgIT0gLTEpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZWJ1Z19rZXlib2FyZCAmJiBLY19mICE9IC0xKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIFVQOiBmb3VuZCB2aWEga2xhc3QsIGk9JWRcbiIsIEtjX2xvYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBuZXh0IGp1c3QgY2hlY2sgZm9yICJiZXN0IiBvbmUgdGhhdCBpcyBkb3duICovCi0JCQlpZiAoS2NfZiA9PSAtMSAmJiBhbnlkb3duKSB7Ci0JCQkJaW50IGw7Ci0JCQkJaW50IGJlc3QgPSAtMSwgbGJlc3QgPSAwOwotCQkJCS8qCi0JCQkJICogSWYgaXQgaXMgYWxyZWFkeSBkb3duLCB0aGF0IGlzCi0JCQkJICogYSBncmVhdCBoaW50LiAgVXNlIGl0LgotCQkJCSAqCi0JCQkJICogbm90ZToga2V5Y29kZV9zdGF0ZSBpcyBpbnRlcm5hbCBhbmQKLQkJCQkgKiBpZ25vcmVzIHNvbWVvbmUgcHJlc3Npbmcga2V5cyBvbiB0aGUKLQkJCQkgKiBwaHlzaWNhbCBkaXNwbGF5IChidXQgaXMgdXBkYXRlZAotCQkJCSAqIHBlcmlvZGljYWxseSB0byBjbGVhbiBvdXQgc3RhbGUgaW5mbykuCi0JCQkJICovCi0JCQkJZm9yIChsPTA7IGwgPCBmb3VuZDsgbCsrKSB7Ci0JCQkJCWludCBrZXkgPSAoaW50KSBrY19mW2xdOwotCQkJCQlpbnQgaiwgam1hdGNoID0gLTE7Ci0KLQkJCQkJaWYgKCEga2V5Y29kZV9zdGF0ZVtrZXldKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkvKiBicmVhayB0aWVzIGJhc2VkIG9uIGxvd2VzdCBYS2V5Y29kZVRvS2V5c3ltIGluZGV4ICovCi0JCQkJCWZvciAoaj0wOyBqPDg7IGorKykgewotCQkJCQkJS2V5U3ltIGtzID0gWEtleWNvZGVUb0tleXN5bShkcHksIGtjX2ZbbF0sIGopOwotCQkJCQkJaWYgKGtzICE9IE5vU3ltYm9sICYmIGtzID09IGtleXN5bSkgewotCQkJCQkJCWptYXRjaCA9IGo7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGptYXRjaCA9PSAtMSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGJlc3QgPT0gLTEgfHwgam1hdGNoIDwgYmVzdCkgewotCQkJCQkJYmVzdCA9IGptYXRjaDsKLQkJCQkJCWxiZXN0ID0gbDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYmVzdCAhPSAtMSkgewotCQkJCQlLY19mID0ga2NfZltsYmVzdF07Ci0JCQkJfQotCQkJCWlmIChkZWJ1Z19rZXlib2FyZCAmJiBLY19mICE9IC0xKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIFVQOiBmb3VuZCB2aWEgZG93bmxpc3QsIGw9JWRcbiIsIGxiZXN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIG5leHQsIHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kIHRoYXQgaXMgZG93biAqLwotCQkJaWYgKEtjX2YgPT0gLTEpIHsKLQkJCQlpbnQgbDsKLQkJCQlmb3IgKGw9MDsgbCA8IGZvdW5kOyBsKyspIHsKLQkJCQkJaW50IGtleSA9IChpbnQpIGtjX2ZbbF07Ci0JCQkJCWlmIChrZXljb2RlX3N0YXRlW2tleV0pIHsKLQkJCQkJCUtjX2YgPSBrY19mW2xdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlYnVnX2tleWJvYXJkICYmIEtjX2YgIT0gLTEpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIgICAgVVA6IHNldCB0byBmaXJzdCBvbmUgZG93biwga2NfZlslZF0hIVxuIiwgbCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBsYXN0LCB1c2UgdGhlIGZpcnN0IG9uZSBmb3VuZCAqLwotCQkJaWYgKEtjX2YgPT0gLTEpIHsKLQkJCQkvKiBob3BlIGZvciB0aGUgYmVzdC4uLiBYWFggY2hlY2sgbW9kcyAqLwotCQkJCUtjX2YgPSBrY19mWzBdOwotCQkJCWlmIChkZWJ1Z19rZXlib2FyZCAmJiBLY19mICE9IC0xKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIFVQOiBzZXQgdG8gZmlyc3Qgb25lIGF0IGFsbCwga2NfZlswXSEhXG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlLY19mID0ga2NfZlswXTsKLQkJR3JwX2YgPSBncnBfZlswXTsKLQkJTHZsX2YgPSBsdmxfZlswXTsKLQkJc3RhdGUgPSBzdGF0ZV9mWzBdOwotCX0KLQotCWlmIChkZWJ1Z19rZXlib2FyZCAmJiBmb3VuZCA+IDEpIHsKLQkJaW50IGw7Ci0JCWNoYXIgKnN0cjsKLQkJZnByaW50ZihzdGRlcnIsICIgICAgKioqIGZvdW5kIG1vcmUgdGhhbiBvbmUga2V5Y29kZTogIik7Ci0JCWZvciAobCA9IDA7IGwgPCBmb3VuZDsgbCsrKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiUwM2QgIiwga2NfZltsXSk7Ci0JCX0KLQkJZm9yIChsID0gMDsgbCA8IGZvdW5kOyBsKyspIHsKLQkJCXN0ciA9IFhLZXlzeW1Ub1N0cmluZyhYS2V5Y29kZVRvS2V5c3ltKGRweSxrY19mW2xdLDApKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIFwiJXNcIiIsIHN0ciA/IHN0ciA6ICJudWxsIik7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICIsIHBpY2tlZCB0aGlzIG9uZTogJTAzZCAgKGxhc3QgZG93bjogJTAzZClcbiIsCi0JCSAgICBLY19mLCBLY19sYXN0X2Rvd25bMF0pOwotCX0KLQotCWlmIChzbG9wcHlfa2V5cykgewotCQlpbnQgbmV3X2tjOwotCQlpZiAoc2xvcHB5X2tleV9jaGVjayhLY19mLCBkb3duLCBrZXlzeW0sICZuZXdfa2MpKSB7Ci0JCQlLY19mID0gbmV3X2tjOwotCQl9Ci0JfQotCi0JaWYgKGRvd24pIHsKLQkJLyoKLQkJICogbmVlZCB0byBzZXQgdXAgdGhlIG1vZHMgZm9yIHR3ZWFraW5nIGFuZCBvdGhlciB3b3JrYXJvdW5kcwotCQkgKi8KLQkJaW50IG5lZWRtb2RzWzhdLCBzZW50bW9kc1s4XSwgSWxpc3RbOF0sIGtleXN0YXRlWzI1Nl07Ci0JCWludCBpbnZvbHZlc19tdWx0aV9rZXksIHNoaWZ0X2lzX2Rvd247Ci0JCWludCBpLCBqLCBiLCBjdXJyLCBuZWVkOwotCQl1bnNpZ25lZCBpbnQgbXM7Ci0JCUtleVN5bSBrczsKLQkJQm9vbCBkbjsKLQotCQkvKiByZW1lbWJlciB0aGVzZSB0byBhaWQgdGhlIHN1YnNlcXVlbnQgdXAgY2FzZTogKi8KLQkJZm9yIChpPUtMQVNULTE7IGkgPj0gMTsgaS0tKSB7Ci0JCQlLc19sYXN0X2Rvd25baV0gPSBLc19sYXN0X2Rvd25baS0xXTsKLQkJCUtjX2xhc3RfZG93bltpXSA9IEtjX2xhc3RfZG93bltpLTFdOwotCQl9Ci0JCUtzX2xhc3RfZG93blswXSA9IGtleXN5bTsKLQkJS2NfbGFzdF9kb3duWzBdID0gS2NfZjsKLQotCQlpZiAoISBnb3Rfa2JzdGF0ZSkgewotCQkJLyogZ2V0IHRoZSBjdXJyZW50IG1vZGlmaWVyIHN0YXRlIGlmIHdlIGhhdmVuJ3QgeWV0ICovCi0JCQlYa2JHZXRTdGF0ZShkcHksIFhrYlVzZUNvcmVLYmQsICZrYnN0YXRlKTsKLQkJCWdvdF9rYnN0YXRlID0gMTsKLQkJfQotCi0JCS8qCi0JCSAqIG5lZWRtb2RzW10gd2hldGhlciBvciBub3QgdGhhdCBtb2RpZmllciBiaXQgbmVlZHMKLQkJICogICAgICAgICAgICBzb21ldGhpbmcgZG9uZSB0byBpdC4gCi0JCSAqICAgICAgICAgICAgPCAwIG1lYW5zIG5vLAotCQkgKiAgICAgICAgICAgIDAgICBtZWFucyBuZWVkcyB0byBnbyB1cC4KLQkJICogICAgICAgICAgICAxICAgbWVhbnMgbmVlZHMgdG8gZ28gZG93bi4KLQkJICoKLQkJICogLTEsIC0yLCAtMyBhcmUgdXNlZCBmb3IgZGVidWdnaW5nIGluZm8gdG8gaW5kaWNhdGUKLQkJICogd2h5IG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSB3aXRoIHRoZSBtb2RpZmllciwgc2VlIGJlbG93LgotCQkgKgotCQkgKiBzZW50bW9kc1tdIGlzIHRoZSBjb3JyZXNwb25kaW5nIGtleWNvZGUgdG8gdXNlCi0JCSAqIHRvIGFjaGlldmUgdGhlIG5lZWRtb2RzW10gcmVxdWlyZW1lbnQgZm9yIHRoZSBiaXQuCi0JCSAqLwotCi0JCWZvciAoaT0wOyBpPDg7IGkrKykgewotCQkJbmVlZG1vZHNbaV0gPSAtMTsKLQkJCXNlbnRtb2RzW2ldID0gMDsKLQkJfQotCi0JCS8qCi0JCSAqIExvb3Agb3ZlciB0aGUgOCBtb2RpZmllciBiaXRzIGFuZCBjaGVjayBpZiB0aGUgY3VycmVudAotCQkgKiBzZXR0aW5nIGlzIHdoYXQgd2UgbmVlZCBpdCB0byBiZSBvciB3aGV0aGVyIGl0IHNob3VsZAotCQkgKiBiZSBjaGFuZ2VkIChieSB1cyBzZW5kaW5nIHNvbWUga2V5Y29kZSBldmVudCkKLQkJICoKLQkJICogSWYgbm90aGluZyBuZWVkcyB0byBiZSBkb25lIHRvIGl0IHJlY29yZCB3aHk6Ci0JCSAqICAgLTEgIHRoZSBtb2RpZmllciBiaXQgaXMgaWdub3JlZC4KLQkJICogICAtMiAgdGhlIG1vZGlmaWVyIGJpdCBpcyBpZ25vcmVkLCBidXQgaXMgY29ycmVjdCBhbnl3YXkuCi0JCSAqICAgLTMgIHRoZSBtb2RpZmllciBiaXQgaXMgY29ycmVjdC4KLQkJICovCi0KLQkJYiA9IDB4MTsKLQkJZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0JCQljdXJyID0gYiAmIGtic3RhdGUubW9kczsKLQkJCW5lZWQgPSBiICYgc3RhdGU7Ci0KLQkJCWlmICghIChiICYgeGtiaWdub3JlW0tjX2ZdW0dycF9mXVtMdmxfZl0pKSB7Ci0JCQkJLyogaXJyZWxldmFudCBtb2RpZmllciBiaXQgKi8KLQkJCQluZWVkbW9kc1tpXSA9IC0xOwotCQkJCWlmIChjdXJyID09IG5lZWQpIG5lZWRtb2RzW2ldID0gLTI7Ci0JCQl9IGVsc2UgaWYgKGN1cnIgPT0gbmVlZCkgewotCQkJCS8qIGFscmVhZHkgY29ycmVjdCAqLwotCQkJCW5lZWRtb2RzW2ldID0gLTM7Ci0JCQl9IGVsc2UgaWYgKCEgY3VyciAmJiBuZWVkKSB7Ci0JCQkJLyogbmVlZCBpdCBkb3duICovCi0JCQkJbmVlZG1vZHNbaV0gPSAxOwotCQkJfSBlbHNlIGlmIChjdXJyICYmICEgbmVlZCkgewotCQkJCS8qIG5lZWQgaXQgdXAgKi8KLQkJCQluZWVkbW9kc1tpXSA9IDA7Ci0JCQl9Ci0KLQkJCWIgPSBiIDw8IDE7Ci0JCX0KLQotCQkvKgotCQkgKiBBZ2FpbiB3ZSBkeW5hbWljYWxseSBwcm9iZSB0aGUgWCBzZXJ2ZXIgZm9yIGluZm9ybWF0aW9uLAotCQkgKiB0aGlzIHRpbWUgZm9yIHRoZSBzdGF0ZSBvZiBhbGwgdGhlIGtleWNvZGVzLiAgVXNlZnVsCi0JCSAqIGluZm8sIGFuZCBldmlkZW50bHkgaXMgbm90IHRvbyBzbG93Li4uCi0JCSAqLwotCQlnZXRfa2V5c3RhdGUoa2V5c3RhdGUpOwotCi0JCS8qCi0JCSAqIFdlIHRyeSB0byBkZXRlcm1pbmUgaWYgU2hpZnQgaXMgZG93biAoc2luY2UgdGhhdCBjYW4KLQkJICogc2NyZXcgdXAgSVNPX0xldmVsM19TaGlmdCBtYW5pcHVsYXRpb25zKS4KLQkJICovCi0JCXNoaWZ0X2lzX2Rvd24gPSAwOwotCi0JCWZvciAoa2MgPSBrY19taW47IGtjIDw9IGtjX21heDsga2MrKykgewotCQkJaWYgKHNraXBrZXljb2RlW2tjXSAmJiBkZWJ1Z19rZXlib2FyZCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIHh4eCBza2lwcGluZyBrZXljb2RlOiAiCi0JCQkJICAgICIlZFxuIiwga2MpOwotCQkJfQotCQkJaWYgKHNraXBrZXljb2RlW2tjXSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHNoaWZ0X2tleXNba2NdICYmIGtleXN0YXRlW2tjXSkgewotCQkJCXNoaWZ0X2lzX2Rvd24gPSBrYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIE5vdyBsb29wIG92ZXIgdGhlIG1vZGlmaWVyIGJpdHMgYW5kIHRyeSB0byBkZWR1Y2UgdGhlCi0JCSAqIGtleWNvZGUgcHJlc3Nlcy9yZWxlYXNlIHJlcXVpcmUgdG8gbWF0Y2ggdGhlIGRlc2lyZWQKLQkJICogc3RhdGUuCi0JCSAqLwotCQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJCWlmIChuZWVkbW9kc1tpXSA8IDAgJiYgZGVidWdfa2V5Ym9hcmQgPiAxKSB7Ci0JCQkJaW50IGsgPSAtbmVlZG1vZHNbaV0gLSAxOwotCQkJCWNoYXIgKndvcmRzW10gPSB7Imlnbm9yYWJsZSIsCi0JCQkJICAgICJiaXRzZXQraWdub3JhYmxlIiwgImJpdHNldCJ9OwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgICsrKyBuZWVkbW9kczogbW9kPSVkIGlzICIKLQkJCQkgICAgIk9LICAoJXMpXG4iLCBpLCB3b3Jkc1trXSk7Ci0JCQl9Ci0JCQlpZiAobmVlZG1vZHNbaV0gPCAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWIgPSAxIDw8IGk7Ci0KLQkJCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICArKysgbmVlZG1vZHM6IG1vZD0lZCAlcyAiCi0JCQkJICAgICJuZWVkIGl0IHRvIGJlOiAlZCAlc1xuIiwgaSwgYml0cHJpbnQoYiwgOCksCi0JCQkJICAgIG5lZWRtb2RzW2ldLCBuZWVkbW9kc1tpXSA/ICJkb3duIiA6ICJ1cCIpOwotCQkJfQotCi0JCQkvKgotCQkJICogQWdhaW4sIGFuIGluZWZmaWNpZW50IGxvb3AsIHRoaXMgdGltZSBqdXN0Ci0JCQkgKiBsb29raW5nIGZvciBtb2RpZmllcnMuLi4KLQkJCSAqIAotCQkJICogbm90ZSB0aGUgdXNlIG9mIGtjX3ZlYyB0byBwcmVmZXIgWEtfSVNPX0xldmVsM19TaGlmdAotCQkJICogb3ZlciBYS19Nb2RlX3N3aXRjaC4KLQkJCSAqLwotCQkJZm9yIChrY2kgPSBrY19taW47IGtjaSA8PSBrY19tYXg7IGtjaSsrKSB7Ci0JCQkgIGZvciAoZ3JwID0gMDsgZ3JwIDwgZ3JwX21heCsxOyBncnArKykgewotCQkJICAgIGZvciAobHZsID0gMDsgbHZsIDwgbHZsX21heCsxOyBsdmwrKykgewotCQkJCWludCBza2lwID0gMSwgZGJtc2cgPSAwOwotCi0JCQkJa2MgPSBrY192ZWNba2NpXTsKLQotCQkJCW1zID0geGtibW9kaWZpZXJzW2tjXVtncnBdW2x2bF07Ci0JCQkJaWYgKCEgbXMgfHwgbXMgIT0gKHVuc2lnbmVkIGludCkgYikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoc2tpcGtleWNvZGVba2NdICYmIGRlYnVnX2tleWJvYXJkKSB7Ci0JCQkJICAgIGZwcmludGYoc3RkZXJyLCAiICAgIHh4eCBza2lwcGluZyBrZXljb2RlOiIKLQkJCQkJIiAlZCBHJWQvTCVkXG4iLCBrYywgZ3JwKzEsIGx2bCsxKTsKLQkJCQl9Ci0JCQkJaWYgKHNraXBrZXljb2RlW2tjXSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlrcyA9IHhrYmtleXN5bXNba2NdW2dycF1bbHZsXTsKLQkJCQlpZiAoISBrcykgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoa3MgPT0gWEtfU2hpZnRfTCkgewotCQkJCQlza2lwID0gMDsKLQkJCQl9IGVsc2UgaWYgKGtzID09IFhLX1NoaWZ0X1IpIHsKLQkJCQkJc2tpcCA9IDA7Ci0JCQkJfSBlbHNlIGlmIChrcyA9PSBYS19Nb2RlX3N3aXRjaCkgewotCQkJCQlza2lwID0gMDsKLQkJCQl9IGVsc2UgaWYgKGtzID09IFhLX0lTT19MZXZlbDNfU2hpZnQpIHsKLQkJCQkJc2tpcCA9IDA7Ci0JCQkJfQotCi0JCQkJaWYgKHdhdGNoX2NhcHNsb2NrICYmIGtic3RhdGUubG9ja2VkX21vZHMgJiBMb2NrTWFzaykgewotCQkJCSAgICBpZiAoa2V5c3ltID49ICdBJyAmJiBrZXlzeW0gPD0gJ1onKSB7Ci0JCQkJCWlmIChrcyA9PSBYS19TaGlmdF9MIHx8IGtzID09IFhLX1NoaWZ0X1IpIHsKLQkJCQkJCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICBBLVogY2FwbG9jayBza2lwIFNoaWZ0XG4iKTsKLQkJCQkJCX0KLQkJCQkJCXNraXAgPSAxOwotCQkJCQl9IGVsc2UgaWYgKGtzID09IFhLX0NhcHNfTG9jaykgewotCQkJCQkJaWYgKGRlYnVnX2tleWJvYXJkID4gMSkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIEEtWiBjYXBsb2NrIG5vc2tpcCBDYXBzTG9ja1xuIik7Ci0JCQkJCQl9Ci0JCQkJCQlza2lwID0gMDsKLQkJCQkJfQotCQkJCSAgICB9Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogQWx0LCBNZXRhLCBDb250cm9sLCBTdXBlciwKLQkJCQkgKiBIeXBlciwgTnVtLCBDYXBzIGFyZSBza2lwcGVkLgotCQkJCSAqCi0JCQkJICogWFhYIG5lZWQgbW9yZSB3b3JrIG9uIExvY2tzLAotCQkJCSAqIGFuZCBub24tc3RhbmRhcmQgbW9kaWZpZXJzLgotCQkJCSAqIChlLmcuIFhGODZfTmV4dF9WTW9kZSB1c2luZwotCQkJCSAqIEN0cmwrQWx0KQotCQkJCSAqLwotCQkJCWlmIChkZWJ1Z19rZXlib2FyZCA+IDEpIHsKLQkJCQkJY2hhciAqc3RyID0gWEtleXN5bVRvU3RyaW5nKGtzKTsKLQkJCQkJaW50IGt0ID0ga2V5c3RhdGVba2NdOwotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICA9PT0gZm9yIG1vZD0lcyAiCi0JCQkJCSAgICAiZm91bmQga2M9JTAzZC9HJWQvTCVkIGl0IGlzICVkICIKLQkJCQkJICAgICIlcyBza2lwPSVkICglcylcbiIsIGJpdHByaW50KGIsOCksCi0JCQkJCSAgICBrYywgZ3JwKzEsIGx2bCsxLCBrdCwga3QgPwotCQkJCQkgICAgImRvd24iIDogInVwICAiLCBza2lwLCBzdHIgPwotCQkJCQkgICAgc3RyIDogIm51bGwiKTsKLQkJCQl9Ci0KLQkJCQlpZiAoISBza2lwICYmIG5lZWRtb2RzW2ldICE9Ci0JCQkJICAgIGtleXN0YXRlW2tjXSAmJiBzZW50bW9kc1tpXSA9PSAwKSB7Ci0JCQkJCXNlbnRtb2RzW2ldID0ga2M7Ci0JCQkJCWRibXNnID0gMTsKLQkJCQl9Ci0KLQkJCQlpZiAoZGVidWdfa2V5Ym9hcmQgPiAxICYmIGRibXNnKSB7Ci0JCQkJCWludCBubSA9IG5lZWRtb2RzW2ldOwotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICA+Pj4gd2UgY2hvb3NlICIKLQkJCQkJICAgICJrYz0lMDNkPTB4JTAyeCB0byBjaGFuZ2UgaXQgdG86ICIKLQkJCQkJICAgICIlZCAlc1xuIiwga2MsIGtjLCBubSwgbm0gPwotCQkJCQkgICAgImRvd24iIDogInVwIik7Ci0JCQkJfQotCQkJCQkKLQkJCSAgICB9Ci0JCQkgIH0KLQkJCX0KLQkJfQotCQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJCS8qCi0JCQkgKiByZXZlcnNlIG9yZGVyIGlzIHVzZWZ1bCBmb3IgdHdlYWtpbmcKLQkJCSAqIElTT19MZXZlbDNfU2hpZnQgYmVmb3JlIFNoaWZ0LCBidXQgYXNzdW1lcyB0aGV5Ci0JCQkgKiBhcmUgaW4gdGhhdCBvcmRlciAoaS5lLiBTaGlmdCBpcyBmaXJzdCBiaXQpLgotCQkJICovCi0JCQlpbnQgcmV2ZXJzZSA9IDE7Ci0JCQlpZiAocmV2ZXJzZSkgewotCQkJCUlsaXN0W2ldID0gNyAtIGk7Ci0JCQl9IGVsc2UgewotCQkJCUlsaXN0W2ldID0gaTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIGNoZWNrIHRvIHNlZSBpZiBNdWx0aV9rZXkgaXMgYm91bmQgdG8gb25lIG9mIHRoZSBNb2RzCi0JCSAqIHdlIGhhdmUgdG8gdHdlYWsKLQkJICovCi0JCWludm9sdmVzX211bHRpX2tleSA9IDA7Ci0JCWZvciAoaj0wOyBqPDg7IGorKykgewotCQkJaSA9IElsaXN0W2pdOwotCQkJaWYgKHNlbnRtb2RzW2ldID09IDApIGNvbnRpbnVlOwotCQkJZG4gPSAoQm9vbCkgbmVlZG1vZHNbaV07Ci0JCQlpZiAoIWRuKSBjb250aW51ZTsKLQkJCWlmIChtdWx0aV9rZXlbc2VudG1vZHNbaV1dKSB7Ci0JCQkJaW52b2x2ZXNfbXVsdGlfa2V5ID0gaSsxOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludm9sdmVzX211bHRpX2tleSAmJiBzaGlmdF9pc19kb3duICYmIG5lZWRtb2RzWzBdIDwgMCkgewotCQkJLyoKLQkJCSAqIFdvcmthcm91bmQgZm9yIE11bHRpX2tleSBhbmQgc2hpZnQuCi0JCQkgKiBBc3N1bWVzIFNoaWZ0IGlzIGJpdCAxIChuZWVkbW9kc1swXSkKLQkJCSAqLwotCQkJaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgICAgXl5eIHRyeWluZyB0byBhdm9pZCAiCi0JCQkJICAgICJpbmFkdmVydGVudCBNdWx0aV9rZXkgZnJvbSBTaGlmdCAiCi0JCQkJICAgICIoZG9pbmcgJTAzZCB1cCBub3cpXG4iLCBzaGlmdF9pc19kb3duKTsKLQkJCX0KLQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgc2hpZnRfaXNfZG93biwgRmFsc2UsCi0JCQkgICAgQ3VycmVudFRpbWUpOwotCQl9IGVsc2UgewotCQkJaW52b2x2ZXNfbXVsdGlfa2V5ID0gMDsKLQkJfQotCi0JCWZvciAoaj0wOyBqPDg7IGorKykgewotCQkJLyogZG8gdGhlIE1vZCB1cHMgKi8KLQkJCWkgPSBJbGlzdFtqXTsKLQkJCWlmIChzZW50bW9kc1tpXSA9PSAwKSBjb250aW51ZTsKLQkJCWRuID0gKEJvb2wpIG5lZWRtb2RzW2ldOwotCQkJaWYgKGRuKSBjb250aW51ZTsKLQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgc2VudG1vZHNbaV0sIGRuLCBDdXJyZW50VGltZSk7Ci0JCX0KLQkJZm9yIChqPTA7IGo8ODsgaisrKSB7Ci0JCQkvKiBuZXh0LCBkbyB0aGUgTW9kIGRvd25zICovCi0JCQlpID0gSWxpc3Rbal07Ci0JCQlpZiAoc2VudG1vZHNbaV0gPT0gMCkgY29udGludWU7Ci0JCQlkbiA9IChCb29sKSBuZWVkbW9kc1tpXTsKLQkJCWlmICghZG4pIGNvbnRpbnVlOwotCQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBzZW50bW9kc1tpXSwgZG4sIEN1cnJlbnRUaW1lKTsKLQkJfQotCi0JCWlmIChpbnZvbHZlc19tdWx0aV9rZXkpIHsKLQkJCS8qCi0JCQkgKiBSZXZlcnNlIHdvcmthcm91bmQgZm9yIE11bHRpX2tleSBhbmQgc2hpZnQuCi0JCQkgKi8KLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIHZ2diB0cnlpbmcgdG8gYXZvaWQgIgotCQkJCSAgICAiaW5hZHZlcnRlbnQgTXVsdGlfa2V5IGZyb20gU2hpZnQgIgotCQkJCSAgICAiKGRvaW5nICUwM2QgZG93biBub3cpXG4iLCBzaGlmdF9pc19kb3duKTsKLQkJCX0KLQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgc2hpZnRfaXNfZG93biwgVHJ1ZSwKLQkJCSAgICBDdXJyZW50VGltZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBXaXRoIHRoZSBhYm92ZSBtb2RpZmllciB3b3JrIGRvbmUsIHNlbmQgdGhlIGFjdHVhbCBrZXljb2RlOgotCQkgKi8KLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBLY19mLCAoQm9vbCkgZG93biwgQ3VycmVudFRpbWUpOwotCi0JCS8qCi0JCSAqIE5vdyB1bmRvIHRoZSBtb2RpZmllciB3b3JrOgotCQkgKi8KLQkJZm9yIChqPTc7IGo+PTA7IGotLSkgewotCQkJLyogcmV2ZXJzZSBNb2QgZG93bnMgd2UgZGlkICovCi0JCQlpID0gSWxpc3Rbal07Ci0JCQlpZiAoc2VudG1vZHNbaV0gPT0gMCkgY29udGludWU7Ci0JCQlkbiA9IChCb29sKSBuZWVkbW9kc1tpXTsKLQkJCWlmICghZG4pIGNvbnRpbnVlOwotCQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBzZW50bW9kc1tpXSwgIWRuLAotCQkJICAgIEN1cnJlbnRUaW1lKTsKLQkJfQotCQlmb3IgKGo9Nzsgaj49MDsgai0tKSB7Ci0JCQkvKiBmaW5hbGx5IHJldmVyc2UgdGhlIE1vZCB1cHMgd2UgZGlkICovCi0JCQlpID0gSWxpc3Rbal07Ci0JCQlpZiAoc2VudG1vZHNbaV0gPT0gMCkgY29udGludWU7Ci0JCQlkbiA9IChCb29sKSBuZWVkbW9kc1tpXTsKLQkJCWlmIChkbikgY29udGludWU7Ci0JCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIHNlbnRtb2RzW2ldLCAhZG4sCi0JCQkgICAgQ3VycmVudFRpbWUpOwotCQl9Ci0KLQl9IGVsc2UgeyAvKiBmb3IgdXAgY2FzZSwgaG9wZWZ1bGx5IGp1c3QgbmVlZCB0byBwb3AgaXQgdXA6ICovCi0KLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBLY19mLCAoQm9vbCkgZG93biwgQ3VycmVudFRpbWUpOwotCX0KLQlYX1VOTE9DSzsKLX0KLSNlbmRpZgotCi0vKgotICogRm9yIHR3ZWFraW5nIG1vZGlmaWVycyB3cnQgdGhlIEFsdC1HcmFwaCBrZXksIGV0Yy4KLSAqLwotI2RlZmluZSBMRUZUU0hJRlQgMQotI2RlZmluZSBSSUdIVFNISUZUIDIKLSNkZWZpbmUgQUxUR1IgNAotc3RhdGljIGNoYXIgbW9kX3N0YXRlID0gMDsKLQotc3RhdGljIGNoYXIgbW9kaWZpZXJzWzB4MTAwXTsKLXN0YXRpYyBLZXlDb2RlIGtleWNvZGVzWzB4MTAwXTsKLXN0YXRpYyBLZXlDb2RlIGxlZnRfc2hpZnRfY29kZSwgcmlnaHRfc2hpZnRfY29kZSwgYWx0Z3JfY29kZSwgaXNvX2xldmVsM19jb2RlOwotCi0vKiB3b3JrYXJvdW5kIGZvciBYMTFSNSwgTGF0aW4gMSBvbmx5ICovCi0jaWZuZGVmIFhDb252ZXJ0Q2FzZQotI2RlZmluZSBYQ29udmVydENhc2Uoc3ltLCBsb3dlciwgdXBwZXIpIFwKLSoobG93ZXIpID0gc3ltOyBcCi0qKHVwcGVyKSA9IHN5bTsgXAotaWYgKHN5bSA+PiA4ID09IDApIHsgXAotICAgIGlmICgoc3ltID49IFhLX0EpICYmIChzeW0gPD0gWEtfWikpIFwKLSAgICAgICAgKihsb3dlcikgKz0gKFhLX2EgLSBYS19BKTsgXAotICAgIGVsc2UgaWYgKChzeW0gPj0gWEtfYSkgJiYgKHN5bSA8PSBYS196KSkgXAotICAgICAgICAqKHVwcGVyKSAtPSAoWEtfYSAtIFhLX0EpOyBcCi0gICAgZWxzZSBpZiAoKHN5bSA+PSBYS19BZ3JhdmUpICYmIChzeW0gPD0gWEtfT2RpYWVyZXNpcykpIFwKLSAgICAgICAgKihsb3dlcikgKz0gKFhLX2FncmF2ZSAtIFhLX0FncmF2ZSk7IFwKLSAgICBlbHNlIGlmICgoc3ltID49IFhLX2FncmF2ZSkgJiYgKHN5bSA8PSBYS19vZGlhZXJlc2lzKSkgXAotICAgICAgICAqKHVwcGVyKSAtPSAoWEtfYWdyYXZlIC0gWEtfQWdyYXZlKTsgXAotICAgIGVsc2UgaWYgKChzeW0gPj0gWEtfT29ibGlxdWUpICYmIChzeW0gPD0gWEtfVGhvcm4pKSBcCi0gICAgICAgICoobG93ZXIpICs9IChYS19vc2xhc2ggLSBYS19Pb2JsaXF1ZSk7IFwKLSAgICBlbHNlIGlmICgoc3ltID49IFhLX29zbGFzaCkgJiYgKHN5bSA8PSBYS190aG9ybikpIFwKLSAgICAgICAgKih1cHBlcikgLT0gKFhLX29zbGFzaCAtIFhLX09vYmxpcXVlKTsgXAotfQotI2VuZGlmCi0KLWNoYXIgKnNob3J0X2ttYmNmKGNoYXIgKnN0cikgewotCWludCBpLCBzYXdfayA9IDAsIHNhd19tID0gMCwgc2F3X2IgPSAwLCBzYXdfYyA9IDAsIHNhd19mID0gMCwgbiA9IDEwOwotCWNoYXIgKnAsIHRtcFsxMF07Ci0JCi0JZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCXRtcFtpXSA9ICdcMCc7Ci0JfQotCi0JcCA9IHN0cjsKLQlpID0gMDsKLQl3aGlsZSAoKnApIHsKLQkJaWYgKCgqcCA9PSAnSycgfHwgKnAgPT0gJ2snKSAmJiAhc2F3X2spIHsKLQkJCXRtcFtpKytdID0gJ0snOwotCQkJc2F3X2sgPSAxOwotCQl9IGVsc2UgaWYgKCgqcCA9PSAnTScgfHwgKnAgPT0gJ20nKSAmJiAhc2F3X20pIHsKLQkJCXRtcFtpKytdID0gJ00nOwotCQkJc2F3X20gPSAxOwotCQl9IGVsc2UgaWYgKCgqcCA9PSAnQicgfHwgKnAgPT0gJ2InKSAmJiAhc2F3X2IpIHsKLQkJCXRtcFtpKytdID0gJ0InOwotCQkJc2F3X2IgPSAxOwotCQl9IGVsc2UgaWYgKCgqcCA9PSAnQycgfHwgKnAgPT0gJ2MnKSAmJiAhc2F3X2MpIHsKLQkJCXRtcFtpKytdID0gJ0MnOwotCQkJc2F3X2MgPSAxOwotCQl9IGVsc2UgaWYgKCgqcCA9PSAnRicgfHwgKnAgPT0gJ2YnKSAmJiAhc2F3X2YpIHsKLQkJCXRtcFtpKytdID0gJ0YnOwotCQkJc2F3X2YgPSAxOwotCQl9Ci0JCXArKzsKLQl9Ci0JcmV0dXJuKHN0cmR1cCh0bXApKTsKLX0KLQotdm9pZCBpbml0aWFsaXplX2FsbG93ZWRfaW5wdXQodm9pZCkgewotCWNoYXIgKnN0cjsKLQotCWlmIChhbGxvd2VkX2lucHV0X25vcm1hbCkgewotCQlmcmVlKGFsbG93ZWRfaW5wdXRfbm9ybWFsKTsKLQkJYWxsb3dlZF9pbnB1dF9ub3JtYWwgPSBOVUxMOwotCX0KLQlpZiAoYWxsb3dlZF9pbnB1dF92aWV3X29ubHkpIHsKLQkJZnJlZShhbGxvd2VkX2lucHV0X3ZpZXdfb25seSk7Ci0JCWFsbG93ZWRfaW5wdXRfdmlld19vbmx5ID0gTlVMTDsKLQl9Ci0KLQlpZiAoISBhbGxvd2VkX2lucHV0X3N0cikgewotCQlhbGxvd2VkX2lucHV0X25vcm1hbCA9IHN0cmR1cCgiS01CQ0YiKTsKLQkJYWxsb3dlZF9pbnB1dF92aWV3X29ubHkgPSBzdHJkdXAoIiIpOwotCX0gZWxzZSB7Ci0JCWNoYXIgKnAsICpzdHIgPSBzdHJkdXAoYWxsb3dlZF9pbnB1dF9zdHIpOwotCQlwID0gc3RyY2hyKHN0ciwgJywnKTsKLQkJaWYgKHApIHsKLQkJCWFsbG93ZWRfaW5wdXRfdmlld19vbmx5ID0gc3RyZHVwKHArMSk7Ci0JCQkqcCA9ICdcMCc7Ci0JCQlhbGxvd2VkX2lucHV0X25vcm1hbCA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgewotCQkJYWxsb3dlZF9pbnB1dF9ub3JtYWwgPSBzdHJkdXAoc3RyKTsKLQkJCWFsbG93ZWRfaW5wdXRfdmlld19vbmx5ID0gc3RyZHVwKCIiKTsKLQkJfQotCQlmcmVlKHN0cik7Ci0JfQotCi0JLyogc2hvcnRlbiB0aGVtICovCi0Jc3RyID0gc2hvcnRfa21iY2YoYWxsb3dlZF9pbnB1dF9ub3JtYWwpOwotCWZyZWUoYWxsb3dlZF9pbnB1dF9ub3JtYWwpOwotCWFsbG93ZWRfaW5wdXRfbm9ybWFsID0gc3RyOwotCi0Jc3RyID0gc2hvcnRfa21iY2YoYWxsb3dlZF9pbnB1dF92aWV3X29ubHkpOwotCWZyZWUoYWxsb3dlZF9pbnB1dF92aWV3X29ubHkpOwotCWFsbG93ZWRfaW5wdXRfdmlld19vbmx5ID0gc3RyOwotCi0JaWYgKHNjcmVlbikgewotCQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCQlyZmJDbGllbnRQdHIgY2w7Ci0KLQkJaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0JCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQkJQ2xpZW50RGF0YSAqY2QgPSAoQ2xpZW50RGF0YSAqKSBjbC0+Y2xpZW50RGF0YTsKLQotCQkJaWYgKCEgY2QpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLSNpZiAwCi1yZmJMb2coImNkOiAlcFxuIiwgY2QpOwotcmZiTG9nKCJjZC0+aW5wdXQ6ICVzXG4iLCBjZC0+aW5wdXQpOwotcmZiTG9nKCJjZC0+bG9naW5fdmlld29ubHk6ICVkXG4iLCBjZC0+bG9naW5fdmlld29ubHkpOwotcmZiTG9nKCJhbGxvd2VkX2lucHV0X3ZpZXdfb25seTogJXNcbiIsIGFsbG93ZWRfaW5wdXRfdmlld19vbmx5KTsKLSNlbmRpZgotCi0JCQlpZiAoY2QtPmlucHV0WzBdID09ICc9JykgewotCQkJCTsJLyogY3VzdG9tIHNldHRpbmcgKi8KLQkJCX0gZWxzZSBpZiAoY2QtPmxvZ2luX3ZpZXdvbmx5KSB7Ci0JCQkJaWYgKCphbGxvd2VkX2lucHV0X3ZpZXdfb25seSAhPSAnXDAnKSB7Ci0JCQkJCWNsLT52aWV3T25seSA9IEZBTFNFOwotCQkJCQljZC0+aW5wdXRbMF0gPSAnXDAnOwotCQkJCQlzdHJuY3B5KGNkLT5pbnB1dCwKLQkJCQkJICAgIGFsbG93ZWRfaW5wdXRfdmlld19vbmx5LCBDSUxFTik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2wtPnZpZXdPbmx5ID0gVFJVRTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhbGxvd2VkX2lucHV0X25vcm1hbCkgewotCQkJCQljZC0+aW5wdXRbMF0gPSAnXDAnOwotCQkJCQlzdHJuY3B5KGNkLT5pbnB1dCwKLQkJCQkJICAgIGFsbG93ZWRfaW5wdXRfbm9ybWFsLCBDSUxFTik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQl9Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9tb2R0d2Vhayh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlyZXR1cm47Ci0jZWxzZQotCUtleVN5bSBrZXlzeW0sICprZXltYXA7Ci0JaW50IGksIGosIG1pbmtleSwgbWF4a2V5LCBzeW1zX3Blcl9rZXljb2RlOwotCWludCB1c2VfbG93ZXN0X2luZGV4ID0gMDsKLQotCWlmICh1c2VfeGtiX21vZHR3ZWFrKSB7Ci0JCWluaXRpYWxpemVfeGtiX21vZHR3ZWFrKCk7Ci0JCXJldHVybjsKLQl9Ci0JbWVtc2V0KG1vZGlmaWVycywgLTEsIHNpemVvZihtb2RpZmllcnMpKTsKLQlmb3IgKGk9MDsgaTwweDEwMDsgaSsrKSB7Ci0JCWtleWNvZGVzW2ldID0gTm9TeW1ib2w7Ci0JfQotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChnZXRlbnYoIk1PRFRXRUFLX0xPV0VTVCIpKSB7Ci0JCXVzZV9sb3dlc3RfaW5kZXggPSAxOwotCX0KLQotCVhfTE9DSzsKLQlYRGlzcGxheUtleWNvZGVzKGRweSwgJm1pbmtleSwgJm1heGtleSk7Ci0KLQlrZXltYXAgPSBYR2V0S2V5Ym9hcmRNYXBwaW5nKGRweSwgbWlua2V5LCAobWF4a2V5IC0gbWlua2V5ICsgMSksCi0JICAgICZzeW1zX3Blcl9rZXljb2RlKTsKLQotCS8qIGhhbmRsZSBhbHBoYWJldGljIGNoYXIgd2l0aCBvbmx5IG9uZSBrZXlzeW0gKG5vIHVwcGVyICsgbG93ZXIpICovCi0JZm9yIChpID0gbWlua2V5OyBpIDw9IG1heGtleTsgaSsrKSB7Ci0JCUtleVN5bSBsb3dlciwgdXBwZXI7Ci0JCS8qIDJuZCBvbmUgKi8KLQkJa2V5c3ltID0ga2V5bWFwWyhpIC0gbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyAxXTsKLQkJaWYgKGtleXN5bSAhPSBOb1N5bWJvbCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJLyogMXN0IG9uZSAqLwotCQlrZXlzeW0gPSBrZXltYXBbKGkgLSBtaW5rZXkpICogc3ltc19wZXJfa2V5Y29kZSArIDBdOwotCQlpZiAoa2V5c3ltID09IE5vU3ltYm9sKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlYQ29udmVydENhc2Uoa2V5c3ltLCAmbG93ZXIsICZ1cHBlcik7Ci0JCWlmIChsb3dlciAhPSB1cHBlcikgewotCQkJa2V5bWFwWyhpIC0gbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyAwXSA9IGxvd2VyOwotCQkJa2V5bWFwWyhpIC0gbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyAxXSA9IHVwcGVyOwotCQl9Ci0JfQotCWZvciAoaSA9IG1pbmtleTsgaSA8PSBtYXhrZXk7IGkrKykgewotCQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJCWlmIChpID09IG1pbmtleSkgewotCQkJCXJmYkxvZygiaW5pdGlhbGl6ZV9tb2R0d2Vhazoga2V5Y29kZSAtPiAiCi0JCQkJICAgICJrZXlzeW1zIG1hcHBpbmcgaW5mbzpcbiIpOwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsICIgICUwM2QgICIsIGkpOwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCBzeW1zX3Blcl9rZXljb2RlOyBqKyspIHsKLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCWNoYXIgKnN5bTsKLSNpZiAwCi0JCQkJc3ltID1YS2V5c3ltVG9TdHJpbmcoWEtleWNvZGVUb0tleXN5bShkcHksaSxqKSk7Ci0jZWxzZQotCQkJCWtleXN5bSA9IGtleW1hcFsoaS1taW5rZXkpKnN5bXNfcGVyX2tleWNvZGUral07Ci0JCQkJc3ltID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0jZW5kaWYKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiUtMThzICIsIHN5bSA/IHN5bSA6ICJudWxsIik7Ci0JCQkJaWYgKGogPT0gc3ltc19wZXJfa2V5Y29kZSAtIDEpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChqID49IDQpIHsKLQkJCQkvKgotCQkJCSAqIFNvbWV0aGluZyB3YWNreSBpbiB0aGUga2V5bWFwcGluZy4KLQkJCQkgKiBJZ25vcmUgdGhlc2Ugbm9uIFNoaWZ0L0FsdEdyIGNob3JkcwotCQkJCSAqIGZvciBub3cuLi4gbi5iLiB3ZSB0cnkgdG8gYXV0b21hdGljYWxseQotCQkJCSAqIHN3aXRjaCB0byAteGtiIGZvciB0aGlzIGNhc2UuCi0JCQkJICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlrZXlzeW0gPSBrZXltYXBbIChpIC0gbWlua2V5KSAqIHN5bXNfcGVyX2tleWNvZGUgKyBqIF07Ci0JCQlpZiAoIGtleXN5bSA+PSAnICcgJiYga2V5c3ltIDwgMHgxMDAKLQkJCSAgICAmJiBpID09IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBrZXlzeW0pICkgewotCQkJCWlmICh1c2VfbG93ZXN0X2luZGV4ICYmIGtleWNvZGVzW2tleXN5bV0gIT0gTm9TeW1ib2wpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWtleWNvZGVzW2tleXN5bV0gPSBpOwotCQkJCW1vZGlmaWVyc1trZXlzeW1dID0gajsKLQkJCX0KLQkJfQotCX0KLQotCWxlZnRfc2hpZnRfY29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBYS19TaGlmdF9MKTsKLQlyaWdodF9zaGlmdF9jb2RlID0gWEtleXN5bVRvS2V5Y29kZShkcHksIFhLX1NoaWZ0X1IpOwotCWFsdGdyX2NvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfTW9kZV9zd2l0Y2gpOwotCWlzb19sZXZlbDNfY29kZSA9IE5vU3ltYm9sOwotI2lmZGVmIFhLX0lTT19MZXZlbDNfU2hpZnQKLQlpc29fbGV2ZWwzX2NvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfSVNPX0xldmVsM19TaGlmdCk7Ci0jZW5kaWYKLQotCVhGcmVlX3dyICgodm9pZCAqKSBrZXltYXApOwotCi0JWF9VTkxPQ0s7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBkb2VzIHRoZSBhY3R1YWwgdHdlYWs6Ci0gKi8KLXN0YXRpYyB2b2lkIHR3ZWFrX21vZChzaWduZWQgY2hhciBtb2QsIHJmYkJvb2wgZG93bikgewotCXJmYkJvb2wgaXNfc2hpZnQgPSBtb2Rfc3RhdGUgJiAoTEVGVFNISUZUfFJJR0hUU0hJRlQpOwotCUJvb2wgZG4gPSAoQm9vbCkgZG93bjsKLQlLZXlDb2RlIGFsdGdyID0gYWx0Z3JfY29kZTsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAobW9kIDwgMCkgewotCQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJCXJmYkxvZygidHdlYWtfbW9kOiBTa2lwOiAgZG93bj0lZCBpbmRleD0lZFxuIiwgZG93biwKLQkJCSAgICAoaW50KSBtb2QpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCXJmYkxvZygidHdlYWtfbW9kOiBTdGFydDogIGRvd249JWQgaW5kZXg9JWQgbW9kX3N0YXRlPTB4JXgiCi0JCSAgICAiIGlzX3NoaWZ0PSVkXG4iLCBkb3duLCAoaW50KSBtb2QsIChpbnQpIG1vZF9zdGF0ZSwKLQkJICAgIGlzX3NoaWZ0KTsKLQl9Ci0KLQlpZiAodXNlX2lzb19sZXZlbDMgJiYgaXNvX2xldmVsM19jb2RlKSB7Ci0JCWFsdGdyID0gaXNvX2xldmVsM19jb2RlOwotCX0KLQotCVhfTE9DSzsKLQlpZiAoaXNfc2hpZnQgJiYgbW9kICE9IDEpIHsKLQkgICAgaWYgKG1vZF9zdGF0ZSAmIExFRlRTSElGVCkgewotCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGxlZnRfc2hpZnRfY29kZSwgIWRuLCBDdXJyZW50VGltZSk7Ci0JICAgIH0KLQkgICAgaWYgKG1vZF9zdGF0ZSAmIFJJR0hUU0hJRlQpIHsKLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCByaWdodF9zaGlmdF9jb2RlLCAhZG4sIEN1cnJlbnRUaW1lKTsKLQkgICAgfQotCX0KLQlpZiAoICEgaXNfc2hpZnQgJiYgbW9kID09IDEgKSB7Ci0JICAgIFhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgbGVmdF9zaGlmdF9jb2RlLCBkbiwgQ3VycmVudFRpbWUpOwotCX0KLQlpZiAoIGFsdGdyICYmIChtb2Rfc3RhdGUgJiBBTFRHUikgJiYgbW9kICE9IDIgKSB7Ci0JICAgIFhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgYWx0Z3IsICFkbiwgQ3VycmVudFRpbWUpOwotCX0KLQlpZiAoIGFsdGdyICYmICEgKG1vZF9zdGF0ZSAmIEFMVEdSKSAmJiBtb2QgPT0gMiApIHsKLQkgICAgWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBhbHRnciwgZG4sIEN1cnJlbnRUaW1lKTsKLQl9Ci0JWF9VTkxPQ0s7Ci0KLQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJcmZiTG9nKCJ0d2Vha19tb2Q6IEZpbmlzaDogZG93bj0lZCBpbmRleD0lZCBtb2Rfc3RhdGU9MHgleCIKLQkJICAgICIgaXNfc2hpZnQ9JWRcbiIsIGRvd24sIChpbnQpIG1vZCwgKGludCkgbW9kX3N0YXRlLAotCQkgICAgaXNfc2hpZnQpOwotCX0KLX0KLQotLyoKLSAqIHR3ZWFrIHRoZSBtb2RpZmllciB1bmRlciAtbW9kdHdlYWsKLSAqLwotc3RhdGljIHZvaWQgbW9kaWZpZXJfdHdlYWtfa2V5Ym9hcmQocmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLAotICAgIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghZG93biB8fCAha2V5c3ltIHx8ICFjbGllbnQpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlLZXlDb2RlIGs7Ci0JaW50IHR3ZWFrID0gMDsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAodXNlX3hrYl9tb2R0d2VhaykgewotCQl4a2JfdHdlYWtfa2V5Ym9hcmQoZG93biwga2V5c3ltLCBjbGllbnQpOwotCQlyZXR1cm47Ci0JfQotCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQlyZmJMb2coIm1vZGlmaWVyX3R3ZWFrX2tleWJvYXJkOiAlcyBrZXlzeW09MHgleFxuIiwKLQkJICAgIGRvd24gPyAiZG93biIgOiAidXAiLCAoaW50KSBrZXlzeW0pOwotCX0KLQotI2RlZmluZSBBREpVU1RNT0Qoc3ltLCBzdGF0ZSkgXAotCWlmIChrZXlzeW0gPT0gc3ltKSB7IFwKLQkJaWYgKGRvd24pIHsgXAotCQkJbW9kX3N0YXRlIHw9IHN0YXRlOyBcCi0JCX0gZWxzZSB7IFwKLQkJCW1vZF9zdGF0ZSAmPSB+c3RhdGU7IFwKLQkJfSBcCi0JfQotCi0JQURKVVNUTU9EKFhLX1NoaWZ0X0wsIExFRlRTSElGVCkKLQlBREpVU1RNT0QoWEtfU2hpZnRfUiwgUklHSFRTSElGVCkKLQlBREpVU1RNT0QoWEtfTW9kZV9zd2l0Y2gsIEFMVEdSKQotCi0JaWYgKCBkb3duICYmIGtleXN5bSA+PSAnICcgJiYga2V5c3ltIDwgMHgxMDAgKSB7Ci0JCXVuc2lnbmVkIGludCBzdGF0ZSA9IDA7Ci0JCXR3ZWFrID0gMTsKLQkJaWYgKHdhdGNoX2NhcHNsb2NrICYmIGtleXN5bSA+PSAnQScgJiYga2V5c3ltIDw9ICdaJykgewotCQkJWF9MT0NLOwotCQkJc3RhdGUgPSBtYXNrX3N0YXRlKCk7Ci0JCQlYX1VOTE9DSzsKLQkJfQotCQlpZiAoc3RhdGUgJiBMb2NrTWFzaykgewotCQkJLyogY2Fwc2xvY2sgc2V0IGZvciBBLVosIHNvIG5vIHR3ZWFrICovCi0JCQlYX0xPQ0s7Ci0JCQlrID0gWEtleXN5bVRvS2V5Y29kZShkcHksIChLZXlTeW0pIGtleXN5bSk7Ci0JCQlYX1VOTE9DSzsKLQkJCXR3ZWFrID0gMDsKLQkJfSBlbHNlIHsKLQkJCXR3ZWFrX21vZChtb2RpZmllcnNba2V5c3ltXSwgVHJ1ZSk7Ci0JCQlrID0ga2V5Y29kZXNba2V5c3ltXTsKLQkJfQotCX0gZWxzZSB7Ci0JCVhfTE9DSzsKLQkJayA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCAoS2V5U3ltKSBrZXlzeW0pOwotCQlYX1VOTE9DSzsKLQl9Ci0JaWYgKGsgPT0gTm9TeW1ib2wgJiYgYWRkX2tleXN5bXMgJiYgISBJc01vZGlmaWVyS2V5KGtleXN5bSkpIHsKLQkJaW50IG5ld19rYyA9IGFkZF9rZXlzeW0oa2V5c3ltKTsKLQkJaWYgKG5ld19rYykgewotCQkJayA9IG5ld19rYzsKLQkJfQotCX0KLQotCWlmIChzbG9wcHlfa2V5cykgewotCQlpbnQgbmV3X2tjOwotCQlpZiAoc2xvcHB5X2tleV9jaGVjaygoaW50KSBrLCBkb3duLCBrZXlzeW0sICZuZXdfa2MpKSB7Ci0JCQlrID0gKEtleUNvZGUpIG5ld19rYzsKLQkJfQotCX0KLQotCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQljaGFyICpzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQkJcmZiTG9nKCJtb2RpZmllcl90d2Vha19rZXlib2FyZDogS2V5U3ltIDB4JXggXCIlc1wiIC0+ICIKLQkJICAgICJLZXlDb2RlIDB4JXglc1xuIiwgKGludCkga2V5c3ltLCBzdHIgPyBzdHIgOiAibnVsbCIsCi0JCSAgICAoaW50KSBrLCBrID8gIiIgOiAiICppZ25vcmVkKiIpOwotCX0KLQlpZiAoIGsgIT0gTm9TeW1ib2wgKSB7Ci0JCVhfTE9DSzsKLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBrLCAoQm9vbCkgZG93biwgQ3VycmVudFRpbWUpOwotCQlYX1VOTE9DSzsKLQl9Ci0KLQlpZiAoIHR3ZWFrICkgewotCQl0d2Vha19tb2QobW9kaWZpZXJzW2tleXN5bV0sIEZhbHNlKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9rZXlib2FyZF9hbmRfcG9pbnRlcih2b2lkKSB7Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJaW5pdGlhbGl6ZV9yZW1hcChyZW1hcF9maWxlKTsKLQkJaW5pdGlhbGl6ZV9wb2ludGVyX21hcChwb2ludGVyX3JlbWFwKTsKLQl9Ci0jZW5kaWYKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAodXNlX21vZGlmaWVyX3R3ZWFrKSB7Ci0JCWluaXRpYWxpemVfbW9kdHdlYWsoKTsKLQl9Ci0KLQlpbml0aWFsaXplX3JlbWFwKHJlbWFwX2ZpbGUpOwotCWluaXRpYWxpemVfcG9pbnRlcl9tYXAocG9pbnRlcl9yZW1hcCk7Ci0KLQlYX0xPQ0s7Ci0JY2xlYXJfbW9kaWZpZXJzKDEpOwotCWlmIChjbGVhcl9tb2RzID09IDEpIHsKLQkJY2xlYXJfbW9kaWZpZXJzKDApOwotCX0KLQlpZiAoY2xlYXJfbW9kcyA9PSAzKSB7Ci0JCWNsZWFyX2xvY2tzKCk7Ci0JfQotCVhfVU5MT0NLOwotfQotCi12b2lkIGdldF9hbGxvd2VkX2lucHV0KHJmYkNsaWVudFB0ciBjbGllbnQsIGFsbG93ZWRfaW5wdXRfdCAqaW5wdXQpIHsKLQlDbGllbnREYXRhICpjZDsKLQljaGFyICpzdHI7Ci0KLQlpbnB1dC0+a2V5c3Ryb2tlID0gMDsKLQlpbnB1dC0+bW90aW9uICAgID0gMDsKLQlpbnB1dC0+YnV0dG9uICAgID0gMDsKLQlpbnB1dC0+Y2xpcGJvYXJkID0gMDsKLQlpbnB1dC0+ZmlsZXMgICAgID0gMDsKLQotCWlmICghIGNsaWVudCkgewotCQlpbnB1dC0+a2V5c3Ryb2tlID0gMTsKLQkJaW5wdXQtPm1vdGlvbiAgICA9IDE7Ci0JCWlucHV0LT5idXR0b24gICAgPSAxOwotCQlpbnB1dC0+Y2xpcGJvYXJkID0gMTsKLQkJaW5wdXQtPmZpbGVzICAgICA9IDE7Ci0JCXJldHVybjsKLQl9Ci0KLQljZCA9IChDbGllbnREYXRhICopIGNsaWVudC0+Y2xpZW50RGF0YTsKLQotCWlmICghIGNkKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKGNkLT5pbnB1dFswXSAhPSAnLScpIHsKLQkJc3RyID0gY2QtPmlucHV0OwotCX0gZWxzZSBpZiAoY2xpZW50LT52aWV3T25seSkgewotCQlpZiAoYWxsb3dlZF9pbnB1dF92aWV3X29ubHkpIHsKLQkJCXN0ciA9IGFsbG93ZWRfaW5wdXRfdmlld19vbmx5OwotCQl9IGVsc2UgewotCQkJc3RyID0gIiI7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYWxsb3dlZF9pbnB1dF9ub3JtYWwpIHsKLQkJCXN0ciA9IGFsbG93ZWRfaW5wdXRfbm9ybWFsOwotCQl9IGVsc2UgewotCQkJc3RyID0gIktNQkNGIjsKLQkJfQotCX0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIkdBSTogJXMgLSAlc1xuIiwgc3RyLCBjZC0+aW5wdXQpOwotCi0Jd2hpbGUgKCpzdHIpIHsKLQkJaWYgKCpzdHIgPT0gJ0snKSB7Ci0JCQlpbnB1dC0+a2V5c3Ryb2tlID0gMTsKLQkJfSBlbHNlIGlmICgqc3RyID09ICdNJykgewotCQkJaW5wdXQtPm1vdGlvbiA9IDE7Ci0JCX0gZWxzZSBpZiAoKnN0ciA9PSAnQicpIHsKLQkJCWlucHV0LT5idXR0b24gPSAxOwotCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ0MnKSB7Ci0JCQlpbnB1dC0+Y2xpcGJvYXJkID0gMTsKLQkJfSBlbHNlIGlmICgqc3RyID09ICdGJykgewotCQkJaW5wdXQtPmZpbGVzID0gMTsKLQkJfQotCQlzdHIrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFwcGx5X3JlbWFwKHJmYktleVN5bSAqa2V5c3ltLCBpbnQgKmlzYnV0dG9uKSB7Ci0JaWYgKGtleXJlbWFwcykgewotCQlrZXlyZW1hcF90ICpyZW1hcCA9IGtleXJlbWFwczsKLQkJd2hpbGUgKHJlbWFwICE9IE5VTEwpIHsKLQkJCWlmIChyZW1hcC0+YmVmb3JlID09ICprZXlzeW0pIHsKLQkJCQkqa2V5c3ltID0gcmVtYXAtPmFmdGVyOwotCQkJCSppc2J1dHRvbiA9IHJlbWFwLT5pc2J1dHRvbjsKLQkJCQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJCQkJY2hhciAqc3RyMSwgKnN0cjI7Ci0JCQkJCVhfTE9DSzsKLQkJCQkJc3RyMSA9IFhLZXlzeW1Ub1N0cmluZyhyZW1hcC0+YmVmb3JlKTsKLQkJCQkJc3RyMiA9IFhLZXlzeW1Ub1N0cmluZyhyZW1hcC0+YWZ0ZXIpOwotCQkJCQlyZmJMb2coImtleWJvYXJkKCk6IHJlbWFwcGluZyBrZXlzeW06ICIKLQkJCQkJICAgICIweCV4IFwiJXNcIiAtPiAweCV4IFwiJXNcIlxuIiwKLQkJCQkJICAgIChpbnQpIHJlbWFwLT5iZWZvcmUsCi0JCQkJCSAgICBzdHIxID8gc3RyMSA6ICJudWxsIiwKLQkJCQkJICAgIChpbnQpIHJlbWFwLT5hZnRlciwKLQkJCQkJICAgIHJlbWFwLT5pc2J1dHRvbiA/ICJidXR0b24iIDoKLQkJCQkJICAgIHN0cjIgPyBzdHIyIDogIm51bGwiKTsKLQkJCQkJWF9VTkxPQ0s7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJcmVtYXAgPSByZW1hcC0+bmV4dDsKLQkJfQotCX0KLX0KLQotLyogZm9yIC1waXBlaW5wdXQgbW9kZSAqLwotc3RhdGljIHZvaWQgcGlwZV9rZXlib2FyZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpbnQgY2FuX2lucHV0ID0gMCwgdWlkID0gMCwgaXNidXR0b24gPSAwOwotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQljaGFyICpuYW1lOwotCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2xpZW50LT5jbGllbnREYXRhOwotCi0JYXBwbHlfcmVtYXAoJmtleXN5bSwgJmlzYnV0dG9uKTsKLQotCWlmIChpc2J1dHRvbikgewotCQlpbnQgbWFzaywgYnV0dG9uID0gKGludCkga2V5c3ltOwotCQlpbnQgeCA9IGN1cnNvcl94LCB5ID0gY3Vyc29yX3k7Ci0JCWNoYXIgKmIsIGJzdHJbMzJdOwotCi0JCWlmICghZG93bikgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJcmZiTG9nKCJrZXlib2FyZCgpOiByZW1hcHBpbmcga2V5c3Ryb2tlIHRvIGJ1dHRvbiAlZCIKLQkJCSAgICAiIGNsaWNrXG4iLCBidXR0b24pOwotCQl9Ci0JCWR0aW1lMCgmbGFzdF9rZXlfdG9fYnV0dG9uX3JlbWFwX3RpbWUpOwotCi0JCS8qCi0JCSAqIFRoaXMgaW4gcHJpbmNpcGxlIGNhbiBiZSBhIGxpdHRsZSBkaWNleS4uLiBpLmUuIGV2ZW4KLQkJICogcmVtYXAgdGhlIGJ1dHRvbiBjbGljayB0byBrZXlzdHJva2Ugc2VxdWVuY2VzIQotCQkgKiBVc3VhbGx5IGp1c3Qgd2lsbCBzaW11bGF0ZSB0aGUgYnV0dG9uIGNsaWNrLgotCQkgKi8KLQotCQkvKiBsb29wIG92ZXIgcG9zc2libGUgbXVsdGljbGlja3M6IEJ1dHRvbjEyMyAqLwotCQlzcHJpbnRmKGJzdHIsICIlZCIsIGJ1dHRvbik7Ci0JCWIgPSBic3RyOwotCQl3aGlsZSAoKmIgIT0gJ1wwJykgewotCQkJY2hhciB0WzJdOwotCQkJaW50IGJ1dHQ7Ci0JCQl0WzBdID0gKmI7Ci0JCQl0WzFdID0gJ1wwJzsKLQkJCWlmIChzc2NhbmYodCwgIiVkIiwgJmJ1dHQpID09IDEpIHsKLQkJCQltYXNrID0gMTw8KGJ1dHQtMSk7Ci0JCQkJcG9pbnRlcl9ldmVudChtYXNrLCB4LCB5LCBjbGllbnQpOwotCQkJCW1hc2sgPSAwOwotCQkJCXBvaW50ZXJfZXZlbnQobWFzaywgeCwgeSwgY2xpZW50KTsKLQkJCX0KLQkJCWIrKzsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBpcGVpbnB1dF9pbnQgPT0gUElQRUlOUFVUX1ZJRCkgewotCQl2NGxfa2V5X2NvbW1hbmQoZG93biwga2V5c3ltLCBjbGllbnQpOwotCX0gZWxzZSBpZiAocGlwZWlucHV0X2ludCA9PSBQSVBFSU5QVVRfQ09OU09MRSkgewotCQljb25zb2xlX2tleV9jb21tYW5kKGRvd24sIGtleXN5bSwgY2xpZW50KTsKLQl9IGVsc2UgaWYgKHBpcGVpbnB1dF9pbnQgPT0gUElQRUlOUFVUX1VJTlBVVCkgewotCQl1aW5wdXRfa2V5X2NvbW1hbmQoZG93biwga2V5c3ltLCBjbGllbnQpOwotCX0gZWxzZSBpZiAocGlwZWlucHV0X2ludCA9PSBQSVBFSU5QVVRfTUFDT1NYKSB7Ci0JCW1hY29zeF9rZXlfY29tbWFuZChkb3duLCBrZXlzeW0sIGNsaWVudCk7Ci0JfSBlbHNlIGlmIChwaXBlaW5wdXRfaW50ID09IFBJUEVJTlBVVF9WTkMpIHsKLQkJdm5jX3JlZmxlY3Rfc2VuZF9rZXkoKHVpbnQzMl90KSBrZXlzeW0sIGRvd24pOwotCX0KLQlpZiAocGlwZWlucHV0X2ZoID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHZpZXdfb25seSkgewotCQlnZXRfYWxsb3dlZF9pbnB1dChjbGllbnQsICZpbnB1dCk7Ci0JCWlmIChpbnB1dC5rZXlzdHJva2UpIHsKLQkJCWNhbl9pbnB1dCA9IDE7CS8qIFhYWCBkaXN0aW5ndWlzaCBsYXRlciAqLwotCQl9Ci0JfQotCWlmIChjZCkgewotCQl1aWQgPSBjZC0+dWlkOwotCX0KLQlpZiAoISBjYW5faW5wdXQpIHsKLQkJdWlkID0gLXVpZDsKLQl9Ci0KLQlYX0xPQ0s7Ci0JbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwotCVhfVU5MT0NLOwotCi0JZnByaW50ZihwaXBlaW5wdXRfZmgsICJLZXlzeW0gJWQgJWQgJXUgJXMgJXNcbiIsIHVpZCwgZG93biwKLQkgICAga2V5c3ltLCBuYW1lID8gbmFtZSA6ICJudWxsIiwgZG93biA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIpOwotCi0JZmZsdXNoKHBpcGVpbnB1dF9maCk7Ci0JY2hlY2tfcGlwZWlucHV0KCk7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IGtleWV2ZW50IHsKLQlyZmJLZXlTeW0gc3ltOwotCXJmYkJvb2wgZG93bjsKLQlkb3VibGUgdGltZTsKLX0ga2V5ZXZlbnRfdDsKLQotI2RlZmluZSBLRVlfSElTVCAyNTYKLXN0YXRpYyBpbnQga2V5X2hpc3RvcnlfaWR4ID0gLTE7Ci1zdGF0aWMga2V5ZXZlbnRfdCBrZXlfaGlzdG9yeVtLRVlfSElTVF07Ci0KLWRvdWJsZSB0eXBpbmdfcmF0ZShkb3VibGUgdGltZV93aW5kb3csIGludCAqcmVwZWF0aW5nKSB7Ci0JZG91YmxlIGR0ID0gMS4wLCBub3cgPSBkbm93KCk7Ci0JS2V5U3ltIGtleSA9IE5vU3ltYm9sOwotCWludCBpLCBpZHgsIGNudCA9IDAsIHJlcGVhdF9rZXlzID0gMDsKLQotCWlmIChrZXlfaGlzdG9yeV9pZHggPT0gLTEpIHsKLQkJaWYgKHJlcGVhdGluZykgewotCQkJKnJlcGVhdGluZyA9IDA7Ci0JCX0KLQkJcmV0dXJuIDAuMDsKLQl9Ci0JaWYgKHRpbWVfd2luZG93ID4gMC4wKSB7Ci0JCWR0ID0gdGltZV93aW5kb3c7Ci0JfQotCWZvciAoaT0wOyBpPEtFWV9ISVNUOyBpKyspIHsKLQkJaWR4ID0ga2V5X2hpc3RvcnlfaWR4IC0gaTsKLQkJaWYgKGlkeCA8IDApIHsKLQkJCWlkeCArPSBLRVlfSElTVDsKLQkJfQotCQlpZiAoISBrZXlfaGlzdG9yeVtpZHhdLmRvd24pIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChub3cgPiBrZXlfaGlzdG9yeVtpZHhdLnRpbWUgKyBkdCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJY250Kys7Ci0JCWlmIChrZXkgPT0gTm9TeW1ib2wpIHsKLQkJCWtleSA9IGtleV9oaXN0b3J5W2lkeF0uc3ltOwotCQkJcmVwZWF0X2tleXMgPSAxOwotCQl9IGVsc2UgaWYgKGtleSA9PSBrZXlfaGlzdG9yeVtpZHhdLnN5bSkgewotCQkJcmVwZWF0X2tleXMrKzsKLQkJfQotCX0KLQotCWlmIChyZXBlYXRpbmcpIHsKLQkJaWYgKHJlcGVhdF9rZXlzID49IDIpIHsKLQkJCSpyZXBlYXRpbmcgPSByZXBlYXRfa2V5czsKLQkJfSBlbHNlIHsKLQkJCSpyZXBlYXRpbmcgPSAwOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBuLmIuIGtleXJhdGUgY291bGQgc2VlbSB2ZXJ5IGhpZ2ggd2l0aCBsaWJ2bmNzZXJ2ZXIgYnVmZmVyaW5nIHRoZW0KLQkgKiBzbyBhdm9pZCB1c2luZyBzbWFsbCBkdC4KLQkgKi8KLQlyZXR1cm4gKChkb3VibGUpIGNudCkvZHQ7Ci19Ci0KLWludCBza2lwX2NyX3doZW5fc2NhbGluZyhjaGFyICptb2RlKSB7Ci0JaW50IGdvdCA9IDA7Ci0JCi0JaWYgKCFzY2FsaW5nKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChzY2FsaW5nX2NvcHlyZWN0ICE9IHNjYWxpbmdfY29weXJlY3QwKSB7Ci0JCS8qIHVzZXIgb3ZlcnJpZGUgdmlhIC1zY2FsZTogKi8KLQkJaWYgKCEgc2NhbGluZ19jb3B5cmVjdCkgewotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoKm1vZGUgPT0gJ3MnKSB7Ci0JCWdvdCA9IGdvdF9zY3JvbGxjb3B5cmVjdDsKLQl9IGVsc2UgaWYgKCptb2RlID09ICd3JykgewotCQlnb3QgPSBnb3Rfd2lyZWNvcHlyZWN0OwotCX0KLQlpZiAoc2NhbGluZ19jb3B5cmVjdCB8fCBnb3QpIHsKLQkJaW50IGxhdCwgcmF0ZTsKLQkJaW50IGxpbmsgPSBsaW5rX3JhdGUoJmxhdCwgJnJhdGUpOwotCQlpZiAobGluayA9PSBMUl9ESUFMVVApIHsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKHJhdGUgPCAyNSkgewotCQkJLyogdGhlIGZpbGwtaW4gb2YgdGhlIHJlcGFpciBtYXkgYmUgdG9vIHNsb3cgKi8KLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLS8qCi0gKiBrZXkgZXZlbnQgaGFuZGxlci4gIFNlZSB0aGUgYWJvdmUgZnVuY3Rpb25zIGZvciBjb250b3J0aW9ucyBmb3IKLSAqIHJ1bm5pbmcgdW5kZXIgLW1vZHR3ZWFrLgotICovCi1zdGF0aWMgcmZiQ2xpZW50UHRyIGxhc3Rfa2V5Ym9hcmRfY2xpZW50ID0gTlVMTDsKLQotdm9pZCBrZXlib2FyZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlLZXlDb2RlIGs7Ci0JaW50IGlkeCwgaXNidXR0b24gPSAwOwotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQlkb3VibGUgdG5vdzsKLQlzdGF0aWMgaW50IHNraXBwZWRfbGFzdF9kb3duOwotCXN0YXRpYyByZmJCb29sIGxhc3RfZG93bjsKLQlzdGF0aWMgcmZiS2V5U3ltIGxhc3Rfa2V5c3ltID0gTm9TeW1ib2w7Ci0Jc3RhdGljIHJmYktleVN5bSBtYXhfa2V5cmVwZWF0X2xhc3Rfa2V5c3ltID0gTm9TeW1ib2w7Ci0Jc3RhdGljIGRvdWJsZSBtYXhfa2V5cmVwZWF0X2xhc3RfdGltZSA9IDAuMDsKLQlzdGF0aWMgZG91YmxlIG1heF9rZXlyZXBlYXRfYWx3YXlzID0gLTEuMDsKLQotCWlmICh0aHJlYWRzX2Ryb3BfaW5wdXQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWR0aW1lMCgmdG5vdyk7Ci0JZ290X2tleWJvYXJkX2NhbGxzKys7Ci0KLQlpZiAoZGVidWdfa2V5Ym9hcmQpIHsKLQkJY2hhciAqc3RyOwotCQlYX0xPQ0s7Ci0JCXN0ciA9IFhLZXlzeW1Ub1N0cmluZygoS2V5U3ltKSBrZXlzeW0pOwotCQlYX1VOTE9DSzsKLQkJcmZiTG9nKCIjIGtleWJvYXJkKCVzLCAweCV4IFwiJXNcIikgdWlwPSVkICAlLjRmXG4iLAotCQkgICAgZG93biA/ICJkb3duIjoidXAiLCAoaW50KSBrZXlzeW0sIHN0ciA/IHN0ciA6ICJudWxsIiwKLQkJICAgIHVuaXhwd19pbl9wcm9ncmVzcywgdG5vdyAtIHgxMXZuY19zdGFydCk7Ci0JfQotCi0JaWYgKGtleXN5bSA8PSAwKSB7Ci0JCXJmYkxvZygia2V5Ym9hcmQ6IHNraXBwaW5nIDB4MCBrZXlzeW1cbiIpOwotCQlyZXR1cm47Ci0JfQotCQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJaWYgKHVuaXhwd19kZW5pZWQpIHsKLQkJCXJmYkxvZygia2V5Ym9hcmQ6IGlnbm9yaW5nIGtleXN0cm9rZSAweCV4IGluICIKLQkJCSAgICAidW5peHB3X2RlbmllZD0xIHN0YXRlXG4iLCAoaW50KSBrZXlzeW0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjbGllbnQgIT0gdW5peHB3X2NsaWVudCkgewotCQkJcmZiTG9nKCJrZXlib2FyZDogc2tpcHBpbmcgb3RoZXIgY2xpZW50IGluIHVuaXhwd1xuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1bml4cHdfa2V5c3Ryb2tlKGRvd24sIGtleXN5bSwgMCk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChza2lwX2R1cGxpY2F0ZV9rZXlfZXZlbnRzKSB7Ci0JCWlmIChrZXlzeW0gPT0gbGFzdF9rZXlzeW0gJiYgZG93biA9PSBsYXN0X2Rvd24pIHsKLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCXJmYkxvZygic2tpcHBpbmcgZHVwIGtleSBldmVudDogJWQgMHgleFxuIiwKLQkJCQkgICAgZG93biwga2V5c3ltKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlmIChza2lwX2xvY2trZXlzKSB7Ci0JCS8qICB3ZSBkb24ndCBoYW5kbGUgWEtfSVNPKl9Mb2NrIG9yIFhLX0thbmFfTG9jayAuLi4gKi8KLQkJaWYgKGtleXN5bSA9PSBYS19TY3JvbGxfTG9jayB8fCBrZXlzeW0gPT0gWEtfTnVtX0xvY2sgfHwKLQkJICAgIGtleXN5bSA9PSBYS19DYXBzX0xvY2sgfHwga2V5c3ltID09IFhLX1NoaWZ0X0xvY2spIHsKLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCXJmYkxvZygic2tpcHBpbmcgbG9jayBrZXkgZXZlbnQ6ICVkIDB4JXhcbiIsCi0JCQkJICAgIGRvd24sIGtleXN5bSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoa2V5c3ltID49IFhLX0tQXzAgJiYga2V5c3ltIDw9IFhLX0tQXzkpIHsKLQkJCS8qIHVnaCB0aGlzIGlzIHByb2JhYmx5IHdoYXQgdGhleSBtZWFudC4uLiBhc3N1bWUgTnVtTG9jay4gKi8KLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCXJmYkxvZygiY2hhbmdlZCBLUCBkaWdpdCB0byByZWd1bGFyIGRpZ2l0OiAlZCAweCV4XG4iLAotCQkJCSAgICBkb3duLCBrZXlzeW0pOwotCQkJfQotCQkJa2V5c3ltID0gKGtleXN5bSAtIFhLX0tQXzApICsgWEtfMDsKLQkJfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkgewotCQkJaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCQkJcmZiTG9nKCJjaGFuZ2VkIFhLX0tQX0RlY2ltYWwgdG8gWEtfcGVyaW9kOiAlZCAweCV4XG4iLAotCQkJCSAgICBkb3duLCBrZXlzeW0pOwotCQkJfQotCQkJa2V5c3ltID0gWEtfcGVyaW9kOyAKLQkJfQotCX0KLQotCUlOUFVUX0xPQ0s7Ci0KLQlsYXN0X2Rvd24gPSBkb3duOwotCWxhc3Rfa2V5c3ltID0ga2V5c3ltOwotCWxhc3Rfa2V5Ym9hcmRfdGltZSA9IHRub3c7Ci0KLQlsYXN0X3JmYl9kb3duID0gZG93bjsKLQlsYXN0X3JmYl9rZXlzeW0gPSBrZXlzeW07Ci0JbGFzdF9yZmJfa2V5dGltZSA9IHRub3c7Ci0JbGFzdF9yZmJfa2V5X2FjY2VwdGVkID0gRkFMU0U7Ci0KLQlpZiAoa2V5X2hpc3RvcnlfaWR4ID09IC0xKSB7Ci0JCWZvciAoaWR4PTA7IGlkeDxLRVlfSElTVDsgaWR4KyspIHsKLQkJCWtleV9oaXN0b3J5W2lkeF0uc3ltID0gTm9TeW1ib2w7Ci0JCQlrZXlfaGlzdG9yeVtpZHhdLmRvd24gPSBGQUxTRTsKLQkJCWtleV9oaXN0b3J5W2lkeF0udGltZSA9IDAuMDsKLQkJfQotCX0KLQlpZHggPSArK2tleV9oaXN0b3J5X2lkeDsKLQlpZiAoa2V5X2hpc3RvcnlfaWR4ID49IEtFWV9ISVNUKSB7Ci0JCWtleV9oaXN0b3J5X2lkeCA9IDA7Ci0JCWlkeCA9IDA7Ci0JfQotCWtleV9oaXN0b3J5W2lkeF0uc3ltID0ga2V5c3ltOwotCWtleV9oaXN0b3J5W2lkeF0uZG93biA9IGRvd247Ci0Ja2V5X2hpc3RvcnlbaWR4XS50aW1lID0gdG5vdzsKLQotCWlmIChkb3duICYmIChrZXlzeW0gPT0gWEtfQWx0X0wgfHwga2V5c3ltID09IFhLX1N1cGVyX0wpKSB7Ci0JCWludCBpLCBrLCBydW4gPSAwLCB1cHMgPSAwOwotCQlkb3VibGUgZGVsYXkgPSAxLjA7Ci0JCUtleVN5bSBrczsKLQkJZm9yIChpPTA7IGk8MTY7IGkrKykgewotCQkJayA9IGlkeCAtIGk7Ci0JCQlpZiAoayA8IDApIGsgKz0gS0VZX0hJU1Q7Ci0JCQlpZiAoIWtleV9oaXN0b3J5W2tdLmRvd24pIHsKLQkJCQl1cHMrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWtzID0ga2V5X2hpc3Rvcnlba10uc3ltOwotCQkJaWYgKGtleV9oaXN0b3J5W2tdLnRpbWUgPCB0bm93IC0gZGVsYXkpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoa3MgPT0ga2V5c3ltICYmIGtzID09IFhLX0FsdF9MKSB7Ci0JCQkJcnVuKys7Ci0JCQl9IGVsc2UgaWYgKGtzID09IGtleXN5bSAmJiBrcyA9PSBYS19TdXBlcl9MKSB7Ci0JCQkJcnVuKys7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICh1cHMgPCAyKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAocnVuID09IDMgJiYga2V5c3ltID09IFhLX0FsdF9MKSB7Ci0JCQlyZmJMb2coIjMqQWx0X0wsIGNhbGxpbmc6IHJlZnJlc2hfc2NyZWVuKDApXG4iKTsKLQkJCXJlZnJlc2hfc2NyZWVuKDApOwotCQl9IGVsc2UgaWYgKHJ1biA9PSA0ICYmIGtleXN5bSA9PSBYS19BbHRfTCkgewotCQkJcmZiTG9nKCI0KkFsdF9MLCBzZXR0aW5nOiBkb19jb3B5X3NjcmVlblxuIik7Ci0JCQlkb19jb3B5X3NjcmVlbiA9IDE7Ci0JCX0gZWxzZSBpZiAocnVuID09IDUgJiYga2V5c3ltID09IFhLX0FsdF9MKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAocnVuID09IDMgJiYga2V5c3ltID09IFhLX1N1cGVyX0wpIHsKLQkJCXJmYkxvZygiMypTdXBlcl9MLCBjYWxsaW5nOiBzZXRfeGRhbWFnZV9tYXJrKClcbiIpOwotCQkJc2V0X3hkYW1hZ2VfbWFyaygwLCAwLCBkcHlfeCwgZHB5X3kpOwotCQl9IGVsc2UgaWYgKHJ1biA9PSA0ICYmIGtleXN5bSA9PSBYS19TdXBlcl9MKSB7Ci0JCQlyZmJMb2coIjQqU3VwZXJfTCwgY2FsbGluZzogY2hlY2tfeHJlY29yZF9yZXNldCgpXG4iKTsKLQkJCWNoZWNrX3hyZWNvcmRfcmVzZXQoMSk7Ci0JCX0gZWxzZSBpZiAocnVuID09IDUgJiYga2V5c3ltID09IFhLX1N1cGVyX0wpIHsKLQkJCXJmYkxvZygiNSpTdXBlcl9MLCBjYWxsaW5nOiBwdXNoX2JsYWNrX3NjcmVlbigwKVxuIik7Ci0JCQlwdXNoX2JsYWNrX3NjcmVlbigwKTsKLQkJfQotCX0KLQotI2lmZGVmIE1BWF9LRVlSRVBFQVQgCi0JaWYgKG1heF9rZXlyZXBlYXRfYWx3YXlzIDwgMC4wKSB7Ci0JCWlmIChnZXRlbnYoIk1BWF9LRVlSRVBFQVQiKSkgewotCQkJbWF4X2tleXJlcGVhdF9hbHdheXMgPSBhdG9mKGdldGVudigiTUFYX0tFWVJFUEVBVCIpKTsKLQkJfSBlbHNlIHsKLQkJCW1heF9rZXlyZXBlYXRfYWx3YXlzID0gMC4wOwotCQl9Ci0JfQotCWlmIChtYXhfa2V5cmVwZWF0X2Fsd2F5cyA+IDAuMCkgewotCQltYXhfa2V5cmVwZWF0X3RpbWUgPSBtYXhfa2V5cmVwZWF0X2Fsd2F5czsKLQl9Ci0jZWxzZQotCWlmICgwKSB7bWF4X2tleXJlcGVhdF9hbHdheXM9MDt9Ci0jZW5kaWYKLQlpZiAoIWRvd24gJiYgc2tpcHBlZF9sYXN0X2Rvd24pIHsKLQkJaW50IGRiID0gZGVidWdfc2Nyb2xsOwotCQlpZiAoa2V5c3ltID09IG1heF9rZXlyZXBlYXRfbGFzdF9rZXlzeW0pIHsKLQkJCXNraXBwZWRfbGFzdF9kb3duID0gMDsKLQkJCWlmIChkYikgcmZiTG9nKCItLS0gc2Nyb2xsIGtleXJhdGUgc2tpcHBpbmcgMHglbHggJXMgIgotCQkJICAgICIlLjRmICAlLjRmXG4iLCBrZXlzeW0sIGRvd24gPyAiZG93biI6InVwICAiLAotCQkJICAgIHRub3cgLSB4MTF2bmNfc3RhcnQsIHRub3cgLSBtYXhfa2V5cmVwZWF0X2xhc3RfdGltZSk7IAotCQkJSU5QVVRfVU5MT0NLOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWlmIChkb3duICYmIG1heF9rZXlyZXBlYXRfdGltZSA+IDAuMCkgewotCQlpbnQgc2tpcCA9IDA7Ci0JCWludCBkYiA9IGRlYnVnX3Njcm9sbDsKLQotCQlpZiAobWF4X2tleXJlcGVhdF9sYXN0X2tleXN5bSAhPSBOb1N5bWJvbCAmJgotCQkgICAgbWF4X2tleXJlcGVhdF9sYXN0X2tleXN5bSAhPSBrZXlzeW0pIHsKLQkJCTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0bm93IDwgbWF4X2tleXJlcGVhdF9sYXN0X3RpbWUrbWF4X2tleXJlcGVhdF90aW1lKSB7Ci0JCQkJc2tpcCA9IDE7Ci0JCQl9Ci0JCX0KLQkJbWF4X2tleXJlcGVhdF90aW1lID0gMC4wOwotCQlpZiAoc2tpcCkgewotCQkJaWYgKGRiKSByZmJMb2coIi0tLSBzY3JvbGwga2V5cmF0ZSBza2lwcGluZyAweCVseCAlcyAiCi0JCQkgICAgIiUuNGYgICUuNGZcbiIsIGtleXN5bSwgZG93biA/ICJkb3duIjoidXAgICIsCi0JCQkgICAgdG5vdyAtIHgxMXZuY19zdGFydCwgdG5vdyAtIG1heF9rZXlyZXBlYXRfbGFzdF90aW1lKTsgCi0JCQltYXhfa2V5cmVwZWF0X2xhc3Rfa2V5c3ltID0ga2V5c3ltOwotCQkJc2tpcHBlZF9sYXN0X2Rvd24gPSAxOwotCQkJSU5QVVRfVU5MT0NLOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaWYgKGRiKSByZmJMb2coIi0tLSBzY3JvbGwga2V5cmF0ZSBLRUVQSU5HICAweCVseCAlcyAiCi0JCQkgICAgIiUuNGYgICUuNGZcbiIsIGtleXN5bSwgZG93biA/ICJkb3duIjoidXAgICIsCi0JCQkgICAgdG5vdyAtIHgxMXZuY19zdGFydCwgdG5vdyAtIG1heF9rZXlyZXBlYXRfbGFzdF90aW1lKTsgCi0JCX0KLQl9Ci0JbWF4X2tleXJlcGVhdF9sYXN0X2tleXN5bSA9IGtleXN5bTsKLQltYXhfa2V5cmVwZWF0X2xhc3RfdGltZSA9IHRub3c7Ci0Jc2tpcHBlZF9sYXN0X2Rvd24gPSAwOwotCWxhc3RfcmZiX2tleV9hY2NlcHRlZCA9IFRSVUU7Ci0KLQlpZiAocGlwZWlucHV0X2ZoICE9IE5VTEwgfHwgcGlwZWlucHV0X2ludCkgewotCQlwaXBlX2tleWJvYXJkKGRvd24sIGtleXN5bSwgY2xpZW50KTsJLyogTUFDT1NYIGhlcmUuICovCi0JCWlmICghIHBpcGVpbnB1dF90ZWUpIHsKLQkJCWlmICghIHZpZXdfb25seSB8fCByYXdfZmIpIHsJLyogcmF3X2ZiIGhhY2sgKi8KLQkJCQlsYXN0X2tleWJvYXJkX2NsaWVudCA9IGNsaWVudDsKLQkJCQlsYXN0X2V2ZW50ID0gbGFzdF9pbnB1dCA9IG5vdzsKLQkJCQlsYXN0X2tleWJvYXJkX2lucHV0ID0gbm93OwotCQkKLQkJCQlsYXN0X2tleXN5bSA9IGtleXN5bTsKLQotCQkJCWxhc3RfcmZiX2Rvd24gPSBkb3duOwotCQkJCWxhc3RfcmZiX2tleXN5bSA9IGtleXN5bTsKLQkJCQlsYXN0X3JmYl9rZXl0aW1lID0gdG5vdzsKLQkJCQlsYXN0X3JmYl9rZXlfaW5qZWN0ZWQgPSBkbm93KCk7Ci0KLQkJCQlnb3RfdXNlcl9pbnB1dCsrOwotCQkJCWdvdF9rZXlib2FyZF9pbnB1dCsrOwotCQkJfQotCQkJSU5QVVRfVU5MT0NLOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JaWYgKHZpZXdfb25seSkgewotCQlJTlBVVF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0JZ2V0X2FsbG93ZWRfaW5wdXQoY2xpZW50LCAmaW5wdXQpOwotCWlmICghIGlucHV0LmtleXN0cm9rZSkgewotCQlJTlBVVF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQl0cmFja19tb2Rfc3RhdGUoa2V5c3ltLCBkb3duLCBUUlVFKTsJLyogaWdub3JlcyByZW1hcHMgKi8KLQotCWxhc3Rfa2V5Ym9hcmRfY2xpZW50ID0gY2xpZW50OwotCWxhc3RfZXZlbnQgPSBsYXN0X2lucHV0ID0gbm93OwotCWxhc3Rfa2V5Ym9hcmRfaW5wdXQgPSBub3c7Ci0KLQlsYXN0X2tleXN5bSA9IGtleXN5bTsKLQotCWxhc3RfcmZiX2Rvd24gPSBkb3duOwotCWxhc3RfcmZiX2tleXN5bSA9IGtleXN5bTsKLQlsYXN0X3JmYl9rZXl0aW1lID0gdG5vdzsKLQlsYXN0X3JmYl9rZXlfaW5qZWN0ZWQgPSBkbm93KCk7Ci0KLQlnb3RfdXNlcl9pbnB1dCsrOwotCWdvdF9rZXlib2FyZF9pbnB1dCsrOwotCQotCVJBV0ZCX1JFVF9WT0lECi0KLQotCWFwcGx5X3JlbWFwKCZrZXlzeW0sICZpc2J1dHRvbik7Ci0KLQlpZiAodXNlX3hyZWNvcmQgJiYgISB4cmVjb3JkaW5nICYmIGRvd24pIHsKLQotCQlpZiAoIXN0cmNtcChzY3JvbGxfY29weXJlY3QsICJuZXZlciIpKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChzY3JvbGxfY29weXJlY3QsICJtb3VzZSIpKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoc2tpcF9jcl93aGVuX3NjYWxpbmcoInNjcm9sbCIpKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoISB4cmVjb3JkX3NraXBfa2V5c3ltKGtleXN5bSkpIHsKLQkJCXNuYXBzaG90X3N0YWNrX2xpc3QoMCwgMC4yNSk7Ci0JCQl4cmVjb3JkX3dhdGNoKDEsIFNDUl9LRVkpOwotCQkJeHJlY29yZF9zZXRfYnlfa2V5cyA9IDE7Ci0JCQl4cmVjb3JkX2tleXN5bSA9IGtleXN5bTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZWJ1Z19zY3JvbGwpIHsKLQkJCQljaGFyICpzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQkJCQlyZmJMb2coInhyZWNvcmRfc2tpcF9rZXlzeW06ICVzXG4iLAotCQkJCSAgICBzdHIgPyBzdHIgOiAiTm9TeW1ib2wiKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChpc2J1dHRvbikgewotCQlpbnQgbWFzaywgYnV0dG9uID0gKGludCkga2V5c3ltOwotCQljaGFyICpiLCBic3RyWzMyXTsKLQotCQlpZiAoISBkb3duKSB7Ci0JCQlJTlBVVF9VTkxPQ0s7Ci0JCQlyZXR1cm47CS8qIG5vdGhpbmcgdG8gc2VuZCAqLwotCQl9Ci0JCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJcmZiTG9nKCJrZXlib2FyZCgpOiByZW1hcHBpbmcga2V5c3Ryb2tlIHRvIGJ1dHRvbiAlZCIKLQkJCSAgICAiIGNsaWNrXG4iLCBidXR0b24pOwotCQl9Ci0JCWR0aW1lMCgmbGFzdF9rZXlfdG9fYnV0dG9uX3JlbWFwX3RpbWUpOwotCi0JCVhfTE9DSzsKLQkJLyoKLQkJICogVGhpcyBpbiBwcmluY2lwbGUgY2FuIGJlIGEgbGl0dGxlIGRpY2V5Li4uIGkuZS4gZXZlbgotCQkgKiByZW1hcCB0aGUgYnV0dG9uIGNsaWNrIHRvIGtleXN0cm9rZSBzZXF1ZW5jZXMhCi0JCSAqIFVzdWFsbHkganVzdCB3aWxsIHNpbXVsYXRlIHRoZSBidXR0b24gY2xpY2suCi0JCSAqLwotCi0JCS8qIGxvb3Agb3ZlciBwb3NzaWJsZSBtdWx0aWNsaWNrczogQnV0dG9uMTIzICovCi0JCXNwcmludGYoYnN0ciwgIiVkIiwgYnV0dG9uKTsKLQkJYiA9IGJzdHI7Ci0JCXdoaWxlICgqYiAhPSAnXDAnKSB7Ci0JCQljaGFyIHRbMl07Ci0JCQlpbnQgYnV0dDsKLQkJCXRbMF0gPSAqYjsKLQkJCXRbMV0gPSAnXDAnOwotCQkJaWYgKHNzY2FuZih0LCAiJWQiLCAmYnV0dCkgPT0gMSkgewotCQkJCW1hc2sgPSAxPDwoYnV0dC0xKTsKLQkJCQlkb19idXR0b25fbWFza19jaGFuZ2UobWFzaywgYnV0dCk7CS8qIGRvd24gKi8KLQkJCQltYXNrID0gMDsKLQkJCQlkb19idXR0b25fbWFza19jaGFuZ2UobWFzaywgYnV0dCk7CS8qIHVwICovCi0JCQl9Ci0JCQliKys7Ci0JCX0KLQkJWEZsdXNoX3dyKGRweSk7Ci0JCVhfVU5MT0NLOwotCQlJTlBVVF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodXNlX21vZGlmaWVyX3R3ZWFrKSB7Ci0JCW1vZGlmaWVyX3R3ZWFrX2tleWJvYXJkKGRvd24sIGtleXN5bSwgY2xpZW50KTsKLQkJWF9MT0NLOwotCQlYRmx1c2hfd3IoZHB5KTsKLQkJWF9VTkxPQ0s7Ci0JCUlOUFVUX1VOTE9DSzsKLQkJcmV0dXJuOwotCX0KLQotCVhfTE9DSzsKLQotCWsgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgKEtleVN5bSkga2V5c3ltKTsKLQotCWlmIChrID09IE5vU3ltYm9sICYmIGFkZF9rZXlzeW1zICYmICEgSXNNb2RpZmllcktleShrZXlzeW0pKSB7Ci0JCWludCBuZXdfa2MgPSBhZGRfa2V5c3ltKGtleXN5bSk7Ci0JCWlmIChuZXdfa2MpIHsKLQkJCWsgPSBuZXdfa2M7Ci0JCX0KLQl9Ci0JaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCWNoYXIgKnN0ciA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwotCQlyZmJMb2coImtleWJvYXJkKCk6IEtleVN5bSAweCV4IFwiJXNcIiAtPiBLZXlDb2RlIDB4JXglc1xuIiwKLQkJICAgIChpbnQpIGtleXN5bSwgc3RyID8gc3RyIDogIm51bGwiLCAoaW50KSBrLAotCQkgICAgayA/ICIiIDogIiAqaWdub3JlZCoiKTsKLQl9Ci0KLQlpZiAoIGsgIT0gTm9TeW1ib2wgKSB7Ci0JCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgaywgKEJvb2wpIGRvd24sIEN1cnJlbnRUaW1lKTsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JfQotCi0JWF9VTkxPQ0s7Ci0JSU5QVVRfVU5MT0NLOwotfQotCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9rZXlib2FyZC5oIGIveDExdm5jL2tleWJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTFhODkuLjAwMDAwMDAKLS0tIGEveDExdm5jL2tleWJvYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19LRVlCT0FSRF9ICi0jZGVmaW5lIF9YMTFWTkNfS0VZQk9BUkRfSAotCi0vKiAtLSBrZXlib2FyZC5oIC0tICovCi0jaW5jbHVkZSAiYWxsb3dlZF9pbnB1dF90LmgiCi0KLWV4dGVybiB2b2lkIGdldF9rZXlzdGF0ZShpbnQgKmtleXN0YXRlKTsKLWV4dGVybiB2b2lkIGNsZWFyX21vZGlmaWVycyhpbnQgaW5pdCk7Ci1leHRlcm4gaW50IHRyYWNrX21vZF9zdGF0ZShyZmJLZXlTeW0ga2V5c3ltLCByZmJCb29sIGRvd24sIHJmYkJvb2wgc2V0KTsKLWV4dGVybiB2b2lkIGNsZWFyX2tleXModm9pZCk7Ci1leHRlcm4gdm9pZCBjbGVhcl9sb2Nrcyh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0X2F1dG9yZXBlYXRfc3RhdGUodm9pZCk7Ci1leHRlcm4gaW50IGdldF9pbml0aWFsX2F1dG9yZXBlYXRfc3RhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCBhdXRvcmVwZWF0KGludCByZXN0b3JlLCBpbnQgYmVxdWlldCk7Ci1leHRlcm4gdm9pZCBjaGVja19hZGRfa2V5c3ltcyh2b2lkKTsKLWV4dGVybiBpbnQgYWRkX2tleXN5bShLZXlTeW0ga2V5c3ltKTsKLWV4dGVybiB2b2lkIGRlbGV0ZV9hZGRlZF9rZXljb2RlcyhpbnQgYmVxdWlldCk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3JlbWFwKGNoYXIgKmluZmlsZSk7Ci1leHRlcm4gaW50IHNsb3BweV9rZXlfY2hlY2soaW50IGtleSwgcmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLCBpbnQgKm5ld19rYyk7Ci1leHRlcm4gdm9pZCBzd2l0Y2hfdG9feGtiX2lmX2JldHRlcih2b2lkKTsKLWV4dGVybiBjaGFyICpzaG9ydF9rbWJjZihjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9hbGxvd2VkX2lucHV0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9tb2R0d2Vhayh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfa2V5Ym9hcmRfYW5kX3BvaW50ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBnZXRfYWxsb3dlZF9pbnB1dChyZmJDbGllbnRQdHIgY2xpZW50LCBhbGxvd2VkX2lucHV0X3QgKmlucHV0KTsKLWV4dGVybiBkb3VibGUgdHlwaW5nX3JhdGUoZG91YmxlIHRpbWVfd2luZG93LCBpbnQgKnJlcGVhdGluZyk7Ci1leHRlcm4gaW50IHNraXBfY3Jfd2hlbl9zY2FsaW5nKGNoYXIgKm1vZGUpOwotZXh0ZXJuIHZvaWQga2V5Ym9hcmQocmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLCByZmJDbGllbnRQdHIgY2xpZW50KTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfS0VZQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL2xpbnV4ZmIuYyBiL3gxMXZuYy9saW51eGZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzFjNWYuLjAwMDAwMDAKLS0tIGEveDExdm5jL2xpbnV4ZmIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIGxpbnV4ZmIuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJ4aW5lcmFtYS5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgInBvaW50ZXIuaCIKLSNpbmNsdWRlICJhbGxvd2VkX2lucHV0X3QuaCIKLSNpbmNsdWRlICJ1aW5wdXQuaCIKLSNpbmNsdWRlICJrZXlib2FyZC5oIgotI2luY2x1ZGUgIm1hY29zeC5oIgotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX0lPQ1RMX0gKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJTlVYX0ZCX0gKLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2VuZGlmCi0KLWNoYXIgKmNvbnNvbGVfZ3Vlc3MoY2hhciAqc3RyLCBpbnQgKmZkKTsKLXZvaWQgY29uc29sZV9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpOwotdm9pZCBjb25zb2xlX3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLQotCi12b2lkIGxpbnV4X2Rldl9mYl9tc2coY2hhciAqKTsKLQotY2hhciAqY29uc29sZV9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpIHsKLQljaGFyICpxLCAqaW4gPSBzdHJkdXAoc3RyKTsKLQljaGFyICphdHBhcm1zID0gTlVMTCwgKmZpbGUgPSBOVUxMOwotCWludCBkb19pbnB1dCwgaGF2ZV91aW5wdXQsIHR0eSA9IC0xOwotCi0jaWZkZWYgTUFDT1NYCi0JcmV0dXJuIG1hY29zeF9jb25zb2xlX2d1ZXNzKHN0ciwgZmQpOwotI2VuZGlmCi0KLQotCWlmIChzdHJzdHIoaW4sICIvZGV2L2ZiIikgPT0gaW4pIHsKLQkJZnJlZShpbik7Ci0JCWluID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigiY29uc29sZToiKSArIHN0cmxlbihzdHIpICsgMSk7Ci0JCXNwcmludGYoaW4sICJjb25zb2xlOiVzIiwgc3RyKTsKLQl9IGVsc2UgaWYgKHN0cnN0cihpbiwgImZiIikgPT0gaW4pIHsKLQkJZnJlZShpbik7Ci0JCWluID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigiY29uc29sZTovZGV2LyIpICsgc3RybGVuKHN0cikgKyAxKTsKLQkJc3ByaW50ZihpbiwgImNvbnNvbGU6L2Rldi8lcyIsIHN0cik7Ci0JfSBlbHNlIGlmIChzdHJzdHIoaW4sICJ2dCIpID09IGluKSB7Ci0JCWZyZWUoaW4pOwotCQlpbiA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oImNvbnNvbGVfIikgKyBzdHJsZW4oc3RyKSArIDEpOwotCQlzcHJpbnRmKGluLCAiY29uc29sZV8lcyIsIHN0cik7Ci0JfQotCi0JaWYgKHN0cnN0cihpbiwgImNvbnNvbGUiKSAhPSBpbikgewotCQlyZmJMb2coImNvbnNvbGVfZ3Vlc3M6IHVucmVjb2duaXplZCBjb25zb2xlL2ZiIGZvcm1hdDogJXNcbiIsIHN0cik7Ci0JCWZyZWUoaW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlxID0gc3RycmNocihpbiwgJ0AnKTsKLQlpZiAocSkgewotCQlhdHBhcm1zID0gc3RyZHVwKHErMSk7Ci0JCSpxID0gJ1wwJzsKLQl9Ci0JcSA9IHN0cnJjaHIoaW4sICc6Jyk7Ci0JaWYgKHEpIHsKLQkJZmlsZSA9IHN0cmR1cChxKzEpOwotCQkqcSA9ICdcMCc7Ci0JfQotCWlmICghIGZpbGUgfHwgZmlsZVswXSA9PSAnXDAnKSAgewotCQlmaWxlID0gc3RyZHVwKCIvZGV2L2ZiIik7Ci0JfQotCWlmIChzdHJzdHIoZmlsZSwgImZiIikgPT0gZmlsZSkgewotCQlxID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigiL2Rldi8iKSArIHN0cmxlbihmaWxlKSArIDEpOwotCQlzcHJpbnRmKHEsICIvZGV2LyVzIiwgZmlsZSk7Ci0JCWZyZWUoZmlsZSk7Ci0JCWZpbGUgPSBxOwotCX0KLQlpZiAoIXN0cmNtcChmaWxlLCAiL2Rldi9mYiIpKSB7Ci0JCS8qIHNvbWV0aW1lcyBubyBzeWxpbmsgZmIgLT4gZmIwICovCi0JCXN0cnVjdCBzdGF0IHNidWY7Ci0JCWlmIChzdGF0KGZpbGUsICZzYnVmKSAhPSAwKSB7Ci0JCQlmcmVlKGZpbGUpOwotCQkJZmlsZSA9IHN0cmR1cCgiL2Rldi9mYjAiKTsKLQkJfQotCX0KLQotCWRvX2lucHV0ID0gMTsKLQlpZiAocGlwZWlucHV0X3N0cikgewotCQloYXZlX3VpbnB1dCA9IDA7Ci0JCWRvX2lucHV0ID0gMDsKLQl9IGVsc2UgewotCQloYXZlX3VpbnB1dCA9IGNoZWNrX3VpbnB1dCgpOwotCX0KLQlpZiAoc3Ryc3RyKGluLCAiY29uc29sZV92dCIpKSB7Ci0JCWhhdmVfdWlucHV0ID0gMDsKLQl9Ci0KLQlpZiAoIXN0cmNtcChpbiwgImNvbnNvbGV4IikpIHsKLQkJZG9faW5wdXQgPSAwOwotCX0gZWxzZSBpZiAoc3Ryc3RyKGluLCAiY29uc29sZV92dHgiKSkgewotCQloYXZlX3VpbnB1dCA9IDA7Ci0JCWRvX2lucHV0ID0gMDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoaW4sICJjb25zb2xlIikpIHsKLQkJLyogY3VycmVudCBhY3RpdmUgVlQ6ICovCi0JCWlmICghIGhhdmVfdWlucHV0KSB7Ci0JCQl0dHkgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IG47Ci0JCWlmIChzc2NhbmYoaW4sICJjb25zb2xlJWQiLCAmbikgPT0gMSkgIHsKLQkJCXR0eSA9IG47Ci0JCQloYXZlX3VpbnB1dCA9IDA7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKGluLCAiY29uc29sZV92dCVkIiwgJm4pID09IDEpICB7Ci0JCQl0dHkgPSBuOwotCQkJaGF2ZV91aW5wdXQgPSAwOwotCQl9Ci0JfQotCWlmIChzdHJzdHIoaW4sICJjb25zb2xlX3Z0IikgPT0gaW4pIHsKLQkJY2hhciB0bXBbMTAwXTsKLQkJaW50IGZkLCByb3dzID0gMzAsIGNvbHMgPSA4MCwgdywgaDsKLQkJc3ByaW50Zih0bXAsICIvZGV2L3Zjc2ElZCIsIHR0eSk7Ci0JCWZpbGUgPSBzdHJkdXAodG1wKTsKLQkJZmQgPSBvcGVuKGZpbGUsIE9fUkRXUik7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlyZWFkKGZkLCB0bXAsIDQpOwotCQkJcm93cyA9ICh1bnNpZ25lZCBjaGFyKSB0bXBbMF07Ci0JCQljb2xzID0gKHVuc2lnbmVkIGNoYXIpIHRtcFsxXTsKLQkJCWNsb3NlKGZkKTsKLQkJfQotCQl3ID0gY29scyAqIDg7Ci0JCWggPSByb3dzICogMTY7Ci0JCXJmYkxvZygiJXMgJWR4JWRcbiIsIGZpbGUsIGNvbHMsIHJvd3MpOwotCQlpZiAoZ2V0ZW52KCJSQVdGQl9WQ1NBX0JQUCIpKSB7Ci0JCQkvKiA4YnBwLCBldGMgKi8KLQkJCWludCBidCA9IGF0b2koZ2V0ZW52KCJSQVdGQl9WQ1NBX0JQUCIpKTsKLQkJCWlmIChidCA+IDAgJiYgYnQgPD0zMikgewotCQkJCXNwcmludGYodG1wLCAiJWR4JWR4JWQiLCB3LCBoLCBidCk7Ci0JCQl9IGVsc2UgewotCQkJCXNwcmludGYodG1wLCAiJWR4JWR4MTYiLCB3LCBoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIGRlZmF1bHQgMTZicHAgKi8KLQkJCXNwcmludGYodG1wLCAiJWR4JWR4MTYiLCB3LCBoKTsKLQkJfQotCQlhdHBhcm1zID0gc3RyZHVwKHRtcCk7Ci0JfQotCXJmYkxvZygiY29uc29sZV9ndWVzczogZmlsZSBpcyAlc1xuIiwgZmlsZSk7Ci0KLQlpZiAoISBhdHBhcm1zKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElOVVhfRkJfSAotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19JT0NUTF9ICi0JCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXJfaW5mbzsKLQkJaW50IGQgPSBvcGVuKGZpbGUsIE9fUkRXUik7Ci0JCWlmIChkID49IDApIHsKLQkJCWludCB3LCBoLCBiOwotCQkJdW5zaWduZWQgbG9uZyBybSA9IDAsIGdtID0gMCwgYm0gPSAwOwotCQkJaWYgKGlvY3RsKGQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2YXJfaW5mbykgIT0gLTEpIHsKLQkJCQl3ID0gKGludCkgdmFyX2luZm8ueHJlczsKLQkJCQloID0gKGludCkgdmFyX2luZm8ueXJlczsKLQkJCQliID0gKGludCkgdmFyX2luZm8uYml0c19wZXJfcGl4ZWw7Ci0KLQkJCQlybSA9ICgxIDw8IHZhcl9pbmZvLnJlZC5sZW5ndGgpICAgLSAxOwotCQkJCWdtID0gKDEgPDwgdmFyX2luZm8uZ3JlZW4ubGVuZ3RoKSAtIDE7Ci0JCQkJYm0gPSAoMSA8PCB2YXJfaW5mby5ibHVlLmxlbmd0aCkgIC0gMTsKLQkJCQlybSA9IHJtIDw8IHZhcl9pbmZvLnJlZC5vZmZzZXQ7Ci0JCQkJZ20gPSBnbSA8PCB2YXJfaW5mby5ncmVlbi5vZmZzZXQ7Ci0JCQkJYm0gPSBibSA8PCB2YXJfaW5mby5ibHVlLm9mZnNldDsKLQotCQkJCWlmIChiID09IDggJiYgcm0gPT0gMHhmZiAmJiBnbSA9PSAweGZmICYmIGJtID09IDB4ZmYpIHsKLQkJCQkJLyogSSBkb24ndCBiZWxpZXZlIGl0Li4uICovCi0JCQkJCXJtID0gMHgwNzsKLQkJCQkJZ20gPSAweDM4OwotCQkJCQlibSA9IDB4YzA7Ci0JCQkJfQotCQkJCWlmIChiIDw9IDggJiYgKHJtID09IGdtICYmIGdtID09IGJtKSkgewotCQkJCQlpZiAoYiA9PSA0KSB7Ci0JCQkJCQlybSA9IDB4MDc7Ci0JCQkJCQlnbSA9IDB4Mzg7Ci0JCQkJCQlibSA9IDB4YzA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLyogQDY2NjY2eDY2NjY2eDMyOjB4ZmZmZmZmZmY6Li4uICovCi0JCQkJYXRwYXJtcyA9IChjaGFyICopIG1hbGxvYygyMDApOwotCQkJCXNwcmludGYoYXRwYXJtcywgIiVkeCVkeCVkOiVseC8lbHgvJWx4IiwKLQkJCQkgICAgdywgaCwgYiwgcm0sIGdtLCBibSk7Ci0JCQkJKmZkID0gZDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVycm9yKCJpb2N0bCIpOwotCQkJCWNsb3NlKGQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJjb3VsZCBub3Qgb3BlbjogJXNcbiIsIGZpbGUpOwotCQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JCQlsaW51eF9kZXZfZmJfbXNnKGZpbGUpOwotCQkJY2xvc2UoZCk7Ci0JCX0KLSNlbmRpZgotI2VuZGlmCi0JfQotCi0JaWYgKGF0cGFybXMpIHsKLQkJaW50IGd3LCBnaCwgZ2I7Ci0JCWlmIChzc2NhbmYoYXRwYXJtcywgIiVkeCVkeCVkIiwgJmd3LCAmZ2gsICZnYikgPT0gMykgIHsKLQkJCWZiX3ggPSBndzsJCi0JCQlmYl95ID0gZ2g7CQotCQkJZmJfYiA9IGdiOwkKLQkJfQotCX0KLQotCWlmIChkb19pbnB1dCkgewotCQlpZiAodHR5ID49MCAmJiB0dHkgPCA2NCkgewotCQkJcGlwZWlucHV0X3N0ciA9IChjaGFyICopIG1hbGxvYygxMCk7Ci0JCQlzcHJpbnRmKHBpcGVpbnB1dF9zdHIsICJDT05TT0xFJWQiLCB0dHkpOwotCQkJcmZiTG9nKCJjb25zb2xlX2d1ZXNzOiBmaWxlIHBpcGVpbnB1dCAlc1xuIiwKLQkJCSAgICBwaXBlaW5wdXRfc3RyKTsKLQkJCWluaXRpYWxpemVfcGlwZWlucHV0KCk7Ci0JCX0gZWxzZSBpZiAoaGF2ZV91aW5wdXQpIHsKLQkJCXBpcGVpbnB1dF9zdHIgPSBzdHJkdXAoIlVJTlBVVCIpOwotCQkJcmZiTG9nKCJjb25zb2xlX2d1ZXNzOiBmaWxlIHBpcGVpbnB1dCAlc1xuIiwKLQkJCSAgICBwaXBlaW5wdXRfc3RyKTsKLQkJCWluaXRpYWxpemVfcGlwZWlucHV0KCk7Ci0JCX0KLQl9Ci0KLQlpZiAoISBhdHBhcm1zKSB7Ci0JCXJmYkxvZygiY29uc29sZV9ndWVzczogY291bGQgbm90IGdldCBAIHBhcmFtZXRlcnMuXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oIm1tYXA6IikgKyBzdHJsZW4oZmlsZSkgKyAxICsgc3RybGVuKGF0cGFybXMpICsgMSk7Ci0JaWYgKHN0cnN0cihpbiwgImNvbnNvbGVfdnQiKSkgewotCQlzcHJpbnRmKHEsICJzbmFwOiVzQCVzIiwgZmlsZSwgYXRwYXJtcyk7Ci0JfSBlbHNlIHsKLQkJc3ByaW50ZihxLCAibWFwOiVzQCVzIiwgZmlsZSwgYXRwYXJtcyk7Ci0JfQotCWZyZWUoYXRwYXJtcyk7Ci0JcmV0dXJuIHE7Ci19Ci0KLXZvaWQgY29uc29sZV9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlzdGF0aWMgaW50IGNvbnRyb2wgPSAwLCBhbHQgPSAwOwotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQotCWlmIChkZWJ1Z19rZXlib2FyZCkgZnByaW50ZihzdGRlcnIsICJjb25zb2xlX2tleV9jb21tYW5kOiAlZCAlc1xuIiwgKGludCkga2V5c3ltLCBkb3duID8gImRvd24iIDogInVwIik7Ci0KLQlpZiAocGlwZWlucHV0X2NvbnNfZmQgPCAwKSB7Ci0JCXJldHVybjsJCQotCX0KLQlpZiAodmlld19vbmx5KSB7Ci0JCXJldHVybjsKLQl9Ci0JZ2V0X2FsbG93ZWRfaW5wdXQoY2xpZW50LCAmaW5wdXQpOwotCWlmICghIGlucHV0LmtleXN0cm9rZSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogRnJvbSBMaW51eFZOQy5jOiAqLwotCWlmIChrZXlzeW0gPT0gWEtfQ29udHJvbF9MIHx8IGtleXN5bSA9PSBYS19Db250cm9sX1IpIHsKLQkJaWYgKCEgZG93bikgewotCQkJaWYgKGNvbnRyb2wgPiAwKSB7Ci0JCQkJY29udHJvbC0tOwotCQkJfQotCQl9IGVsc2UgewotCQkJY29udHJvbCsrOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGtleXN5bSA9PSBYS19BbHRfTCB8fCBrZXlzeW0gPT0gWEtfQWx0X1IpIHsKLQkJaWYgKCEgZG93bikgewotCQkJaWYgKGFsdCA+IDApIHsKLQkJCQlhbHQtLTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFsdCsrOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFkb3duKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGtleXN5bSA9PSBYS19Fc2NhcGUpIHsKLQkJa2V5c3ltID0gMjc7Ci0JfQotCWlmIChjb250cm9sKSB7Ci0JCS8qIHNoaWZ0IGRvd24gdG8gdGhlICJjb250cm9sIiB6b25lICovCi0JCWlmIChrZXlzeW0gPj0gJ2EnICYmIGtleXN5bSA8PSAneicpIHsKLQkJCWtleXN5bSAtPSAoJ2EnIC0gMSk7Ci0JCX0gZWxzZSBpZiAoa2V5c3ltID49ICdBJyAmJiBrZXlzeW0gPD0gJ1onKSB7Ci0JCQlrZXlzeW0gLT0gKCdBJyAtIDEpOwotCQl9IGVsc2UgewotCQkJa2V5c3ltID0gMHhmZmZmOwotCQl9Ci0JfSBlbHNlIGlmIChhbHQpIHsKLQkJLyogc2hpZnQgdXAgdG8gdGhlIHVwcGVyIGhhbGYgTGF0aW4gem9uZSAqLwotCQlpZiAoa2V5c3ltID49ICchJyAmJiBrZXlzeW0gPD0gJ34nKSB7Ci0JCQlrZXlzeW0gKz0gMTI4OwotCQl9Ci0JfQotCWlmIChkZWJ1Z19rZXlib2FyZCkgZnByaW50ZihzdGRlcnIsICJrZXlzeW0gbm93OiAlZFxuIiwgKGludCkga2V5c3ltKTsKLQlpZiAoa2V5c3ltID09IFhLX1RhYikgewotCQlrZXlzeW0gPSAnXHQnOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIpIHsKLQkJa2V5c3ltID0gJ1xyJzsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19CYWNrU3BhY2UpIHsKLQkJa2V5c3ltID0gODsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19Ib21lIHx8IGtleXN5bSA9PSBYS19LUF9Ib21lKSB7Ci0JCWtleXN5bSA9IDE7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfRW5kIHx8IGtleXN5bSA9PSBYS19LUF9FbmQpIHsKLQkJa2V5c3ltID0gNTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19VcCB8fCBrZXlzeW0gPT0gWEtfS1BfVXApIHsKLQkJa2V5c3ltID0gMTY7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfRG93biB8fCBrZXlzeW0gPT0gWEtfS1BfRG93bikgewotCQlrZXlzeW0gPSAxNDsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19SaWdodCB8fCBrZXlzeW0gPT0gWEtfS1BfUmlnaHQpIHsKLQkJa2V5c3ltID0gNjsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19OZXh0IHx8IGtleXN5bSA9PSBYS19LUF9OZXh0KSB7Ci0JCWtleXN5bSA9IDY7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfTGVmdCB8fCBrZXlzeW0gPT0gWEtfS1BfTGVmdCkgewotCQlrZXlzeW0gPSAyOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX1ByaW9yIHx8IGtleXN5bSA9PSBYS19LUF9QcmlvcikgewotCQlrZXlzeW0gPSAyOwotCX0gZWxzZSB7Ci0JCWlmIChrZXlzeW0gPj0gWEtfS1BfTXVsdGlwbHkgJiYga2V5c3ltIDw9IFhLX0tQX0VxdWFsKSB7Ci0JCQlrZXlzeW0gLT0gMHhGRjgwOwotCQl9Ci0JfQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19JT0NUTF9IICYmIGRlZmluZWQoVElPQ1NUSSkKLQlpZiAoa2V5c3ltIDwgMHgxMDApIHsKLQkJaWYgKGlvY3RsKHBpcGVpbnB1dF9jb25zX2ZkLCBUSU9DU1RJLCAma2V5c3ltKSAhPSAtMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXBlcnJvcigiaW9jdGwiKTsKLQkJY2xvc2UocGlwZWlucHV0X2NvbnNfZmQpOwotCQlwaXBlaW5wdXRfY29uc19mZCA9IC0xOwotCQlpZiAoISBwaXBlaW5wdXRfY29uc19kZXYpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwaXBlaW5wdXRfY29uc19mZCA9IG9wZW4ocGlwZWlucHV0X2NvbnNfZGV2LCBPX1dST05MWSk7Ci0JCWlmIChwaXBlaW5wdXRfY29uc19mZCA8IDApIHsKLQkJCXJmYkxvZygicGlwZWlucHV0OiBjb3VsZCBub3QgcmVvcGVuICVzXG4iLAotCQkJICAgIHBpcGVpbnB1dF9jb25zX2Rldik7Ci0JCQlwZXJyb3IoIm9wZW4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW9jdGwocGlwZWlucHV0X2NvbnNfZmQsIFRJT0NTVEksICZrZXlzeW0pID09IC0xKSB7Ci0JCQlwZXJyb3IoImlvY3RsIik7Ci0JCQljbG9zZShwaXBlaW5wdXRfY29uc19mZCk7Ci0JCQlwaXBlaW5wdXRfY29uc19mZCA9IC0xOwotCQkJcmZiTG9nKCJwaXBlaW5wdXQ6IGNvdWxkIG5vdCByZW9wZW4gJXNcbiIsCi0JCQkgICAgcGlwZWlucHV0X2NvbnNfZGV2KTsKLQkJfQotCX0KLSNlbmRpZgotCi0JaWYgKGNsaWVudCkge30KLX0KLQotdm9pZCBjb25zb2xlX3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KSB7Ci0JLyogZG8gbm90IGZvcmdldCB2aWV3b25seSBwZXJtcyAqLwotCWlmIChtYXNrIHx8IHggfHwgeSB8fCBjbGllbnQpIHt9Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9saW51eGZiLmggYi94MTF2bmMvbGludXhmYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NmM5Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9saW51eGZiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19MSU5VWEZCX0gKLSNkZWZpbmUgX1gxMVZOQ19MSU5VWEZCX0gKLQotLyogLS0gbGludXhmYi5oIC0tICovCi1leHRlcm4gY2hhciAqY29uc29sZV9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpOwotZXh0ZXJuIHZvaWQgY29uc29sZV9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpOwotZXh0ZXJuIHZvaWQgY29uc29sZV9wb2ludGVyX2NvbW1hbmQoaW50IG1hc2ssIGludCB4LCBpbnQgeSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci0KLQotI2VuZGlmIC8qIF9YMTFWTkNfTElOVVhGQl9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvbWFjb3N4LmMgYi94MTF2bmMvbWFjb3N4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTI2ZjQuLjAwMDAwMDAKLS0tIGEveDExdm5jL21hY29zeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUyICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gbWFjb3N4LmMgLS0gKi8KLQotI2luY2x1ZGUgInJmYi9yZmJjb25maWcuaCIKLSNpZiAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoTElCVk5DU0VSVkVSX0hBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZKSkKLQotI2RlZmluZSBET01BQyAxCi0KLSNlbHNlCi0KLSNkZWZpbmUgRE9NQUMgMAotCi0jZW5kaWYKLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAic2NyZWVuLmgiCi0jaW5jbHVkZSAicG9pbnRlci5oIgotI2luY2x1ZGUgImFsbG93ZWRfaW5wdXRfdC5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAiY3Vyc29yLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJtYWNvc3hDRy5oIgotI2luY2x1ZGUgIm1hY29zeENHUC5oIgotI2luY2x1ZGUgIm1hY29zeENHUy5oIgotCi12b2lkIG1hY29zeF9sb2coY2hhciAqKTsKLWNoYXIgKm1hY29zeF9jb25zb2xlX2d1ZXNzKGNoYXIgKnN0ciwgaW50ICpmZCk7Ci12b2lkIG1hY29zeF9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpOwotdm9pZCBtYWNvc3hfcG9pbnRlcl9jb21tYW5kKGludCBtYXNrLCBpbnQgeCwgaW50IHksIHJmYkNsaWVudFB0ciBjbGllbnQpOwotY2hhciAqbWFjb3N4X2dldF9mYl9hZGRyKHZvaWQpOwotaW50IG1hY29zeF9nZXRfY3Vyc29yKHZvaWQpOwotaW50IG1hY29zeF9nZXRfY3Vyc29yX3BvcyhpbnQgKiwgaW50ICopOwotdm9pZCBtYWNvc3hfc2VuZF9zZWwoY2hhciAqLCBpbnQpOwotdm9pZCBtYWNvc3hfc2V0X3NlbChjaGFyICosIGludCk7Ci1pbnQgbWFjb3N4X3ZhbGlkX3dpbmRvdyhXaW5kb3csIFhXaW5kb3dBdHRyaWJ1dGVzKik7Ci0KLVN0YXR1cyBtYWNvc3hfeHF1ZXJ5dHJlZShXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwgV2luZG93ICpwYXJlbnRfcmV0dXJuLAotICAgIFdpbmRvdyAqKmNoaWxkcmVuX3JldHVybiwgdW5zaWduZWQgaW50ICpuY2hpbGRyZW5fcmV0dXJuKTsKLWludCBtYWNvc3hfZ2V0X3dtX2ZyYW1lX3BvcyhpbnQgKnB4LCBpbnQgKnB5LCBpbnQgKngsIGludCAqeSwgaW50ICp3LCBpbnQgKmgsCi0gICAgV2luZG93ICpmcmFtZSwgV2luZG93ICp3aW4pOwotCi12b2lkIG1hY29zeF9hZGRfbWFwbm90aWZ5KFdpbmRvdyB3aW4sIGludCBsZXZlbCwgaW50IG1hcCk7Ci12b2lkIG1hY29zeF9hZGRfY3JlYXRlKFdpbmRvdyB3aW4sIGludCBsZXZlbCk7Ci12b2lkIG1hY29zeF9hZGRfZGVzdHJveShXaW5kb3cgd2luLCBpbnQgbGV2ZWwpOwotdm9pZCBtYWNvc3hfYWRkX3Zpc25vdGlmeShXaW5kb3cgd2luLCBpbnQgbGV2ZWwsIGludCBvYnNjdXJlZCk7Ci1pbnQgbWFjb3N4X2NoZWNrZXZlbnQoWEV2ZW50ICpldik7Ci0KLXZvaWQgbWFjb3N4X2xvZyhjaGFyICpzdHIpIHsKLQlyZmJMb2coc3RyKTsKLX0KLQotI2lmICghIERPTUFDKQotCi12b2lkIG1hY29zeF9ldmVudF9sb29wKHZvaWQpIHsKLQlyZXR1cm47Ci19Ci1jaGFyICptYWNvc3hfY29uc29sZV9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpIHsKLQlpZiAoIXN0ciB8fCAhZmQpIHt9Ci0JcmV0dXJuIE5VTEw7Ci19Ci12b2lkIG1hY29zeF9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpZiAoIWRvd24gfHwgIWtleXN5bSB8fCAhY2xpZW50KSB7fQotCXJldHVybjsKLX0KLXZvaWQgbWFjb3N4X3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KSB7Ci0JaWYgKCFtYXNrIHx8ICF4IHx8ICF5IHx8ICFjbGllbnQpIHt9Ci0JcmV0dXJuOwotfQotY2hhciAqbWFjb3N4X2dldF9mYl9hZGRyKHZvaWQpIHsKLQlyZXR1cm4gTlVMTDsKLX0KLWludCBtYWNvc3hfZ2V0X2N1cnNvcih2b2lkKSB7Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgbWFjb3N4X2dldF9jdXJzb3JfcG9zKGludCAqeCwgaW50ICp5KSB7Ci0JaWYgKCF4IHx8ICF5KSB7fQotCXJldHVybiAwOwotfQotdm9pZCBtYWNvc3hfc2VuZF9zZWwoY2hhciAqIHN0ciwgaW50IGxlbikgewotCWlmICghc3RyIHx8ICFsZW4pIHt9Ci0JcmV0dXJuOwotfQotdm9pZCBtYWNvc3hfc2V0X3NlbChjaGFyICogc3RyLCBpbnQgbGVuKSB7Ci0JaWYgKCFzdHIgfHwgIWxlbikge30KLQlyZXR1cm47Ci19Ci1pbnQgbWFjb3N4X3ZhbGlkX3dpbmRvdyhXaW5kb3cgdywgWFdpbmRvd0F0dHJpYnV0ZXMqIGEpIHsKLQlpZiAoIXcgfHwgIWEpIHt9Ci0JcmV0dXJuIDA7Ci19Ci1TdGF0dXMgbWFjb3N4X3hxdWVyeXRyZWUoV2luZG93IHcsIFdpbmRvdyAqcm9vdF9yZXR1cm4sIFdpbmRvdyAqcGFyZW50X3JldHVybiwKLSAgICBXaW5kb3cgKipjaGlsZHJlbl9yZXR1cm4sIHVuc2lnbmVkIGludCAqbmNoaWxkcmVuX3JldHVybikgewotCWlmICghdyB8fCAhcm9vdF9yZXR1cm4gfHwgIXBhcmVudF9yZXR1cm4gfHwgIWNoaWxkcmVuX3JldHVybiB8fCAhbmNoaWxkcmVuX3JldHVybikge30KLQlyZXR1cm4gKFN0YXR1cykgMDsKLX0KLXZvaWQgbWFjb3N4X2FkZF9tYXBub3RpZnkoV2luZG93IHdpbiwgaW50IGxldmVsLCBpbnQgbWFwKSB7Ci0JaWYgKCF3aW4gfHwgIWxldmVsIHx8ICFtYXApIHt9Ci0JcmV0dXJuOwotfQotdm9pZCBtYWNvc3hfYWRkX2NyZWF0ZShXaW5kb3cgd2luLCBpbnQgbGV2ZWwpIHsKLQlpZiAoIXdpbiB8fCAhbGV2ZWwpIHt9Ci0JcmV0dXJuOwotfQotdm9pZCBtYWNvc3hfYWRkX2Rlc3Ryb3koV2luZG93IHdpbiwgaW50IGxldmVsKSB7Ci0JaWYgKCF3aW4gfHwgIWxldmVsKSB7fQotCXJldHVybjsKLX0KLXZvaWQgbWFjb3N4X2FkZF92aXNub3RpZnkoV2luZG93IHdpbiwgaW50IGxldmVsLCBpbnQgb2JzY3VyZWQpIHsKLQlpZiAoIXdpbiB8fCAhbGV2ZWwgfHwgIW9ic2N1cmVkKSB7fQotCXJldHVybjsKLX0KLQotaW50IG1hY29zeF9jaGVja2V2ZW50KFhFdmVudCAqZXYpIHsKLQlpZiAoIWV2KSB7fQotCXJldHVybiAwOwotfQotCi0KLSNlbHNlIAotCi12b2lkIG1hY29zeF9ldmVudF9sb29wKHZvaWQpIHsKLQltYWNvc3hDR19ldmVudF9sb29wKCk7Ci19Ci0KLWNoYXIgKm1hY29zeF9nZXRfZmJfYWRkcih2b2lkKSB7Ci0JbWFjb3N4Q0dfaW5pdCgpOwotCXJldHVybiBtYWNvc3hDR19nZXRfZmJfYWRkcigpOwotfQotCi1pbnQgbWFjb3N4X29wZW5nbF9nZXRfd2lkdGgodm9pZCk7Ci1pbnQgbWFjb3N4X29wZW5nbF9nZXRfaGVpZ2h0KHZvaWQpOwotaW50IG1hY29zeF9vcGVuZ2xfZ2V0X2JwcCh2b2lkKTsKLWludCBtYWNvc3hfb3BlbmdsX2dldF9icHModm9pZCk7Ci1pbnQgbWFjb3N4X29wZW5nbF9nZXRfc3BwKHZvaWQpOwotCi1jaGFyICptYWNvc3hfY29uc29sZV9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpIHsKLQljaGFyICpxLCAqaW4gPSBzdHJkdXAoc3RyKTsKLQljaGFyICphdHBhcm1zID0gTlVMTCwgKmZpbGUgPSBOVUxMOwotCi0JbWFjb3N4Q0dfaW5pdCgpOwotCi0JaWYgKHN0cnN0cihpbiwgImNvbnNvbGUiKSAhPSBpbikgewotCQlyZmJMb2coImNvbnNvbGVfZ3Vlc3M6IHVucmVjb2duaXplZCBjb25zb2xlL2ZiIGZvcm1hdDogJXNcbiIsIHN0cik7Ci0JCWZyZWUoaW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkqZmQgPSAtMTsKLQotCXEgPSBzdHJyY2hyKGluLCAnQCcpOwotCWlmIChxKSB7Ci0JCWF0cGFybXMgPSBzdHJkdXAocSsxKTsKLQkJKnEgPSAnXDAnOwotCX0KLQlxID0gc3RycmNocihpbiwgJzonKTsKLQlpZiAocSkgewotCQlmaWxlID0gc3RyZHVwKHErMSk7Ci0JCSpxID0gJ1wwJzsKLQl9Ci0JaWYgKCEgZmlsZSB8fCBmaWxlWzBdID09ICdcMCcpICB7Ci0JCWZpbGUgPSBzdHJkdXAoIi9kZXYvbnVsbCIpOwotCX0KLQlyZmJMb2coImNvbnNvbGVfZ3Vlc3M6IGZpbGUgaXMgJXNcbiIsIGZpbGUpOwotCi0JaWYgKCEgcGlwZWlucHV0X3N0cikgewotCQlwaXBlaW5wdXRfc3RyID0gc3RyZHVwKCJNQUNPU1giKTsKLQkJaW5pdGlhbGl6ZV9waXBlaW5wdXQoKTsKLQl9Ci0KLQlpZiAoISBhdHBhcm1zKSB7Ci0JCWludCB3LCBoLCBiLCBicHMsIGRlcDsKLQkJdW5zaWduZWQgbG9uZyBybSA9IDAsIGdtID0gMCwgYm0gPSAwOwotCi0JCWlmIChtYWNvc3hfcmVhZF9vcGVuZ2wpIHsKLQkJCXcgPSBtYWNvc3hfb3BlbmdsX2dldF93aWR0aCgpOwotCQkJaCA9IG1hY29zeF9vcGVuZ2xfZ2V0X2hlaWdodCgpOwotCQkJYiA9IG1hY29zeF9vcGVuZ2xfZ2V0X2JwcCgpOwotCi0JCQlicHMgPSBtYWNvc3hfb3BlbmdsX2dldF9icHMoKTsKLQkJCWRlcCA9IG1hY29zeF9vcGVuZ2xfZ2V0X3NwcCgpICogYnBzOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQl3ID0gbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSgpOwotCQkJaCA9IG1hY29zeENHX0NHRGlzcGxheVBpeGVsc0hpZ2goKTsKLQkJCWIgPSBtYWNvc3hDR19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWwoKTsKLQotCQkJYnBzID0gbWFjb3N4Q0dfQ0dEaXNwbGF5Qml0c1BlclNhbXBsZSgpOwotCQkJZGVwID0gbWFjb3N4Q0dfQ0dEaXNwbGF5U2FtcGxlc1BlclBpeGVsKCkgKiBicHM7Ci0JCX0KLQotCQlybSA9ICgxIDw8IGJwcykgLSAxOwotCQlnbSA9ICgxIDw8IGJwcykgLSAxOwotCQlibSA9ICgxIDw8IGJwcykgLSAxOwotCQlybSA9IHJtIDw8IDIgKiBicHM7Ci0JCWdtID0gZ20gPDwgMSAqIGJwczsKLQkJYm0gPSBibSA8PCAwICogYnBzOwotCi0JCWlmIChiID09IDggJiYgcm0gPT0gMHhmZiAmJiBnbSA9PSAweGZmICYmIGJtID09IDB4ZmYpIHsKLQkJCS8qIEkgZG9uJ3QgYmVsaWV2ZSBpdC4uLiAqLwotCQkJcm0gPSAweDA3OwotCQkJZ20gPSAweDM4OwotCQkJYm0gPSAweGMwOwotCQl9Ci0JCQotCQkvKiBANjY2NjZ4NjY2NjZ4MzI6MHhmZmZmZmZmZjouLi4gKi8KLQkJYXRwYXJtcyA9IChjaGFyICopIG1hbGxvYygyMDApOwotCQlzcHJpbnRmKGF0cGFybXMsICIlZHglZHglZDolbHgvJWx4LyVseCIsIHcsIGgsIGIsIHJtLCBnbSwgYm0pOwotCX0KLQlpZiAoYXRwYXJtcykgewotCQlpbnQgZ3csIGdoLCBnYjsKLQkJaWYgKHNzY2FuZihhdHBhcm1zLCAiJWR4JWR4JWQiLCAmZ3csICZnaCwgJmdiKSA9PSAzKSAgewotCQkJZmJfeCA9IGd3OwkKLQkJCWZiX3kgPSBnaDsJCi0JCQlmYl9iID0gZ2I7CQotCQl9Ci0JfQotCWlmICghIGF0cGFybXMpIHsKLQkJcmZiTG9nKCJjb25zb2xlX2d1ZXNzOiBjb3VsZCBub3QgZ2V0IEAgcGFyYW1ldGVycy5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlxID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigibWFwOm1hY29zeDoiKSArIHN0cmxlbihmaWxlKSArIDEgKyBzdHJsZW4oYXRwYXJtcykgKyAxKTsKLQlzcHJpbnRmKHEsICJtYXA6bWFjb3N4OiVzQCVzIiwgZmlsZSwgYXRwYXJtcyk7Ci0JZnJlZShhdHBhcm1zKTsKLQlyZXR1cm4gcTsKLX0KLQotV2luZG93IG1hY29zeF9jbGlja19mcmFtZSA9IE5vbmU7Ci0KLXZvaWQgbWFjb3N4X3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KSB7Ci0JYWxsb3dlZF9pbnB1dF90IGlucHV0OwotCXN0YXRpYyBpbnQgbGFzdF9tYXNrID0gMDsKLQlpbnQgcmM7Ci0KLQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJtYWNvc3hfcG9pbnRlcl9jb21tYW5kOiAlZCAlZCAtICVkXG4iLCB4LCB5LCBtYXNrKTsKLQotCWlmIChtYXNrID49IDApIHsKLQkJZ290X3BvaW50ZXJfY2FsbHMrKzsKLQl9Ci0KLQlpZiAodmlld19vbmx5KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlnZXRfYWxsb3dlZF9pbnB1dChjbGllbnQsICZpbnB1dCk7Ci0KLQlpZiAoISBpbnB1dC5tb3Rpb24gfHwgISBpbnB1dC5idXR0b24pIHsKLQkJLyogWFhYIGZpeCBtZSB3aXRoIGxhc3RfeCwgbGFzdF95LCBldGMuICovCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAobWFzayA+PSAwKSB7Ci0JCWdvdF91c2VyX2lucHV0Kys7Ci0JCWdvdF9wb2ludGVyX2lucHV0Kys7Ci0JCWxhc3RfcG9pbnRlcl9jbGllbnQgPSBjbGllbnQ7Ci0JCWxhc3RfcG9pbnRlcl90aW1lID0gdGltZShOVUxMKTsKLQl9Ci0JaWYgKGxhc3RfbWFzayAhPSBtYXNrKSB7Ci0JCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImFib3V0IHRvIGluamVjdCBtYXNrIGNoYW5nZSAlZCAtPiAlZDogJS40ZlxuIiwgbGFzdF9tYXNrLCBtYXNrLCBkbm93eCgpKTsKLQkJaWYgKG1hc2spIHsKLQkJCWludCBweCwgcHksIHgsIHksIHcsIGg7Ci0JCQltYWNvc3hfY2xpY2tfZnJhbWUgPSBOb25lOwotCQkJaWYgKCFtYWNvc3hfZ2V0X3dtX2ZyYW1lX3BvcygmcHgsICZweSwgJngsICZ5LCAmdywgJmgsICZtYWNvc3hfY2xpY2tfZnJhbWUsIE5VTEwpKSB7Ci0JCQkJbWFjb3N4X2NsaWNrX2ZyYW1lID0gTm9uZTsKLQkJCX0KLQkJfQotCX0KLQotCW1hY29zeENHX3BvaW50ZXJfaW5qZWN0KG1hc2ssIHgsIHkpOwotCi0JaWYgKGN1cnNvcl94ICE9IHggfHwgY3Vyc29yX3kgIT0geSkgewotCQlsYXN0X3BvaW50ZXJfbW90aW9uX3RpbWUgPSBkbm93KCk7Ci0JfQotCi0JY3Vyc29yX3ggPSB4OwotCWN1cnNvcl95ID0geTsKLQotCWlmIChsYXN0X21hc2sgIT0gbWFzaykgewotCQlsYXN0X3BvaW50ZXJfY2xpY2tfdGltZSA9IGRub3coKTsKLQkJaWYgKG5jYWNoZSA+IDApIHsKLQkJCS8qIFhYWCBZICovCi0JCQlpbnQgaTsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImFib3V0IHRvIGdldCBhbGwgd2luZG93czogICAgICAgICAgICUuNGZcbiIsIGRub3d4KCkpOwotCQkJZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKLQkJCQltYWNvc3hDR1NfZ2V0X2FsbF93aW5kb3dzKCk7Ci0JCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiISIpOwotCQkJCWlmIChtYWNvc3hfY2hlY2tldmVudChOVUxMKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJcbmRvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUuNGZcbiIsIGRub3d4KCkpOwotCQl9Ci0JfQotCWxhc3RfbWFzayA9IG1hc2s7Ci0KLQkvKiByZWNvcmQgdGhlIHgsIHkgcG9zaXRpb24gZm9yIHRoZSByZmIgc2NyZWVuIGFzIHdlbGwuICovCi0JY3Vyc29yX3Bvc2l0aW9uKHgsIHkpOwotCi0JLyogY2hhbmdlIHRoZSBjdXJzb3Igc2hhcGUgaWYgbmVjZXNzYXJ5ICovCi0JcmMgPSBzZXRfY3Vyc29yKHgsIHksIGdldF93aGljaF9jdXJzb3IoKSk7Ci0JY3Vyc29yX2NoYW5nZXMgKz0gcmM7Ci0KLQlsYXN0X2V2ZW50ID0gbGFzdF9pbnB1dCA9IGxhc3RfcG9pbnRlcl9pbnB1dCA9IHRpbWUoTlVMTCk7Ci19Ci0KLXZvaWQgaW5pdF9rZXlfdGFibGUodm9pZCkgewotCW1hY29zeENHX2luaXRfa2V5X3RhYmxlKCk7Ci19Ci0KLXZvaWQgbWFjb3N4X2tleV9jb21tYW5kKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCkgewotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQlpZiAoZGVidWdfa2V5Ym9hcmQpIGZwcmludGYoc3RkZXJyLCAibWFjb3N4X2tleV9jb21tYW5kOiAlZCAlc1xuIiwgKGludCkga2V5c3ltLCBkb3duID8gImRvd24iIDogInVwIik7Ci0KLQlpZiAodmlld19vbmx5KSB7Ci0JCXJldHVybjsKLQl9Ci0JZ2V0X2FsbG93ZWRfaW5wdXQoY2xpZW50LCAmaW5wdXQpOwotCWlmICghIGlucHV0LmtleXN0cm9rZSkgewotCQlyZXR1cm47Ci0JfQotCi0JaW5pdF9rZXlfdGFibGUoKTsKLQltYWNvc3hDR19rZXlzeW1faW5qZWN0KChpbnQpIGRvd24sICh1bnNpZ25lZCBpbnQpIGtleXN5bSk7Ci19Ci0KLWV4dGVybiB2b2lkIG1hY29zeEdDU19wb2xsX3BiKHZvaWQpOwotCi1pbnQgbWFjb3N4X2dldF9jdXJzb3JfcG9zKGludCAqeCwgaW50ICp5KSB7Ci0JbWFjb3N4Q0dfZ2V0X2N1cnNvcl9wb3MoeCwgeSk7Ci0JaWYgKG5vZmIpIHsKLQkJLyogZ29vZCB0aW1lIHRvIHBvbGwgdGhlIHBhc3RlYm9hcmQgKi8KLQkJbWFjb3N4R0NTX3BvbGxfcGIoKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjdXR0ZXh0ID0gTlVMTDsKLXN0YXRpYyBpbnQgY3V0bGVuID0gMDsKLQotdm9pZCBtYWNvc3hfc2VuZF9zZWwoY2hhciAqc3RyLCBpbnQgbGVuKSB7Ci0JaWYgKHNjcmVlbiAmJiBhbGxfY2xpZW50c19pbml0aWFsaXplZCgpKSB7Ci0JCWlmIChjdXR0ZXh0KSB7Ci0JCQlpbnQgbiA9IGN1dGxlbjsKLQkJCWlmIChsZW4gPCBuKSB7Ci0JCQkJbiA9IGxlbjsKLQkJCX0KLQkJCWlmICghbWVtY21wKHN0ciwgY3V0dGV4dCwgKHNpemVfdCkgbikpIHsKLQkJCQkvKiB0aGUgc2FtZSB0ZXh0IHdlIHNldCBwYXN0ZWJvYXJkIHRvIC4uLiAqLwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQlyZmJMb2coIm1hY29zeF9zZW5kX3NlbDogJWRcbiIsIGxlbik7Ci0JCX0KLQkJcmZiU2VuZFNlcnZlckN1dFRleHQoc2NyZWVuLCBzdHIsIGxlbik7Ci0JfQotfQotCi12b2lkIG1hY29zeF9zZXRfc2VsKGNoYXIgKnN0ciwgaW50IGxlbikgewotCWlmIChzY3JlZW4gJiYgYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQlpZiAoY3V0bGVuIDw9IGxlbikgewotCQkJaWYgKGN1dHRleHQpIHsKLQkJCQlmcmVlKGN1dHRleHQpOwotCQkJfQotCQkJY3V0bGVuID0gMioobGVuKzEpOwotCQkJY3V0dGV4dCA9IChjaGFyICopIGNhbGxvYyhjdXRsZW4sIDEpOwotCQl9Ci0JCW1lbWNweShjdXR0ZXh0LCBzdHIsIChzaXplX3QpIGxlbik7Ci0JCWN1dHRleHRbbGVuXSA9ICdcMCc7Ci0JCWlmIChkZWJ1Z19zZWwpIHsKLQkJCXJmYkxvZygibWFjb3N4X3NldF9zZWw6ICVkXG4iLCBsZW4pOwotCQl9Ci0JCW1hY29zeEdDU19zZXRfcGFzdGVib2FyZChzdHIsIGxlbik7Ci0JfQotfQotCi1pbnQgbWFjb3N4X2dldF9jdXJzb3Iodm9pZCkgewotCXJldHVybiBtYWNvc3hDR19nZXRfY3Vyc29yKCk7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IGV2ZGF0IHsKLQlpbnQgd2luOwotCWludCBtYXA7Ci0JaW50IGxldmVsOwotCWludCB2aXM7Ci0JaW50IHR5cGU7Ci19IGV2ZGF0X3Q7Ci0KLSNkZWZpbmUgTUFYX0VWRU5UUyAxMDI0Ci1ldmRhdF90IG1hY19ldmVudHNbTUFYX0VWRU5UU107Ci1pbnQgbWFjX2V2ZW50c19wdHIgPSAwOwotaW50IG1hY19ldmVudHNfbGFzdCA9IDA7Ci0KLXZvaWQgbWFjb3N4X2FkZF9tYXBub3RpZnkoV2luZG93IHdpbiwgaW50IGxldmVsLCBpbnQgbWFwKSB7Ci0JaW50IGkgPSBtYWNfZXZlbnRzX2xhc3QrKzsKLQltYWNfZXZlbnRzW2ldLndpbiA9IHdpbjsKLQltYWNfZXZlbnRzW2ldLmxldmVsID0gbGV2ZWw7Ci0KLQlpZiAobWFwKSB7Ci0JCW1hY19ldmVudHNbaV0udHlwZSA9IE1hcE5vdGlmeTsKLQl9IGVsc2UgewotCQltYWNfZXZlbnRzW2ldLnR5cGUgPSBVbm1hcE5vdGlmeTsKLQl9Ci0JbWFjX2V2ZW50c1tpXS5tYXAgPSBtYXA7Ci0JbWFjX2V2ZW50c1tpXS52aXMgPSAtMTsKLQotCW1hY19ldmVudHNfbGFzdCA9IG1hY19ldmVudHNfbGFzdCAlIE1BWF9FVkVOVFM7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgbWFjb3N4X2FkZF9jcmVhdGUoV2luZG93IHdpbiwgaW50IGxldmVsKSB7Ci0JaW50IGkgPSBtYWNfZXZlbnRzX2xhc3QrKzsKLQltYWNfZXZlbnRzW2ldLndpbiA9IHdpbjsKLQltYWNfZXZlbnRzW2ldLmxldmVsID0gbGV2ZWw7Ci0KLQltYWNfZXZlbnRzW2ldLnR5cGUgPSBDcmVhdGVOb3RpZnk7Ci0JbWFjX2V2ZW50c1tpXS5tYXAgPSAtMTsKLQltYWNfZXZlbnRzW2ldLnZpcyA9IC0xOwotCi0JbWFjX2V2ZW50c19sYXN0ID0gbWFjX2V2ZW50c19sYXN0ICUgTUFYX0VWRU5UUzsKLQotCXJldHVybjsKLX0KLQotdm9pZCBtYWNvc3hfYWRkX2Rlc3Ryb3koV2luZG93IHdpbiwgaW50IGxldmVsKSB7Ci0JaW50IGkgPSBtYWNfZXZlbnRzX2xhc3QrKzsKLQltYWNfZXZlbnRzW2ldLndpbiA9IHdpbjsKLQltYWNfZXZlbnRzW2ldLmxldmVsID0gbGV2ZWw7Ci0KLQltYWNfZXZlbnRzW2ldLnR5cGUgPSBEZXN0cm95Tm90aWZ5OwotCW1hY19ldmVudHNbaV0ubWFwID0gLTE7Ci0JbWFjX2V2ZW50c1tpXS52aXMgPSAtMTsKLQotCW1hY19ldmVudHNfbGFzdCA9IG1hY19ldmVudHNfbGFzdCAlIE1BWF9FVkVOVFM7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgbWFjb3N4X2FkZF92aXNub3RpZnkoV2luZG93IHdpbiwgaW50IGxldmVsLCBpbnQgb2JzY3VyZWQpIHsKLQlpbnQgaSA9IG1hY19ldmVudHNfbGFzdCsrOwotCW1hY19ldmVudHNbaV0ud2luID0gd2luOwotCW1hY19ldmVudHNbaV0ubGV2ZWwgPSBsZXZlbDsKLQotCW1hY19ldmVudHNbaV0udHlwZSA9IFZpc2liaWxpdHlOb3RpZnk7Ci0JbWFjX2V2ZW50c1tpXS5tYXAgPSAtMTsKLQotCW1hY19ldmVudHNbaV0udmlzID0gMTsKLQlpZiAob2JzY3VyZWQgPT0gMCkgewotCQltYWNfZXZlbnRzW2ldLnZpcyA9IFZpc2liaWxpdHlVbm9ic2N1cmVkOwotCX0gZWxzZSBpZiAob2JzY3VyZWQgPT0gMSkgewotCQltYWNfZXZlbnRzW2ldLnZpcyA9IFZpc2liaWxpdHlQYXJ0aWFsbHlPYnNjdXJlZDsKLQl9IGVsc2UgaWYgKG9ic2N1cmVkID09IDIpIHsKLQkJbWFjX2V2ZW50c1tpXS52aXMgPSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZDsgCS8qIE5JICovCi0JfQotCi0JbWFjX2V2ZW50c19sYXN0ID0gbWFjX2V2ZW50c19sYXN0ICUgTUFYX0VWRU5UUzsKLQotCXJldHVybjsKLX0KLQotaW50IG1hY29zeF9jaGVja2V2ZW50KFhFdmVudCAqZXYpIHsKLQlpbnQgaSA9IG1hY19ldmVudHNfcHRyOwotCi0JaWYgKG1hY19ldmVudHNfcHRyID09IG1hY19ldmVudHNfbGFzdCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGV2ID09IE5VTEwpIHsKLQkJcmV0dXJuIG1hY19ldmVudHNbaV0udHlwZTsKLQl9Ci0KLQlldi0+eGFueS53aW5kb3cgPSBtYWNfZXZlbnRzW2ldLndpbjsKLQotCWlmIChtYWNfZXZlbnRzW2ldLnR5cGUgPT0gQ3JlYXRlTm90aWZ5KSB7Ci0JCWV2LT50eXBlID0gQ3JlYXRlTm90aWZ5OwotCQlldi0+eGFueS53aW5kb3cgPSByb290d2luOwotCQlldi0+eGNyZWF0ZXdpbmRvdy53aW5kb3cgPSBtYWNfZXZlbnRzW2ldLndpbjsKLQl9IGVsc2UgaWYgKG1hY19ldmVudHNbaV0udHlwZSA9PSBEZXN0cm95Tm90aWZ5KSB7Ci0JCWV2LT50eXBlID0gRGVzdHJveU5vdGlmeTsKLQkJZXYtPnhkZXN0cm95d2luZG93LndpbmRvdyA9IG1hY19ldmVudHNbaV0ud2luOwotCX0gZWxzZSBpZiAobWFjX2V2ZW50c1tpXS50eXBlID09IFZpc2liaWxpdHlOb3RpZnkpIHsKLQkJZXYtPnR5cGUgPSBWaXNpYmlsaXR5Tm90aWZ5OwotCQlldi0+eHZpc2liaWxpdHkuc3RhdGUgPSBtYWNfZXZlbnRzW2ldLnZpczsKLQl9IGVsc2UgaWYgKG1hY19ldmVudHNbaV0udHlwZSA9PSBNYXBOb3RpZnkpIHsKLQkJZXYtPnR5cGUgPSBNYXBOb3RpZnk7Ci0JfSBlbHNlIGlmIChtYWNfZXZlbnRzW2ldLnR5cGUgPT0gVW5tYXBOb3RpZnkpIHsKLQkJZXYtPnR5cGUgPSBVbm1hcE5vdGlmeTsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gbWFjb3N4X2NoZWNrZXZlbnQ6ICVkXG4iLCBtYWNfZXZlbnRzW2ldLnR5cGUpOwotCX0KLQltYWNfZXZlbnRzX3B0cisrOwotCW1hY19ldmVudHNfcHRyID0gbWFjX2V2ZW50c19wdHIgJSBNQVhfRVZFTlRTOwotCi0JcmV0dXJuIG1hY19ldmVudHNbaV0udHlwZTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3Qgd2luZGF0IHsKLQlpbnQgd2luOwotCWludCB4LCB5OwotCWludCB3aWR0aCwgaGVpZ2h0OwotCWludCBsZXZlbDsKLQlpbnQgbWFwcGVkOwotCWludCBjbGlwcGVkOwotCWludCBuY2FjaGVfb25seTsKLX0gd2luZGF0X3Q7Ci0KLWV4dGVybiBpbnQgbWFjd2lubWF4OyAKLWV4dGVybiB3aW5kYXRfdCBtYWN3aW5zW107IAotCi1pbnQgbWFjb3N4X2dldF93bV9mcmFtZV9wb3MoaW50ICpweCwgaW50ICpweSwgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoLAotICAgIFdpbmRvdyAqZnJhbWUsIFdpbmRvdyAqd2luKSB7Ci0Jc3RhdGljIGludCBsYXN0X2lkeCA9IC0xOwotCWludCB4MSwgeDIsIHkxLCB5MjsKLQlpbnQgaWR4ID0gLTEsIGs7Ci0JbWFjb3N4Q0dTX2dldF9hbGxfd2luZG93cygpOwotCW1hY29zeENHX2dldF9jdXJzb3JfcG9zKHB4LCBweSk7Ci0KLQlmb3IgKGsgPSAwOyBrPG1hY3dpbm1heDsgaysrKSB7Ci0JCWlmICghIG1hY3dpbnNba10ubWFwcGVkKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQl4MSA9IG1hY3dpbnNba10ueDsKLQkJeDIgPSBtYWN3aW5zW2tdLnggKyBtYWN3aW5zW2tdLndpZHRoOwotCQl5MSA9IG1hY3dpbnNba10ueTsKLQkJeTIgPSBtYWN3aW5zW2tdLnkgKyBtYWN3aW5zW2tdLmhlaWdodDsKLWlmIChkZWJ1Z193aXJlZnJhbWUpIGZwcmludGYoc3RkZXJyLCAiJWQvJWQ6CSVkICVkICVkICAtICVkICVkICVkXG4iLCBrLCBtYWN3aW5zW2tdLndpbiwgeDEsICpweCwgeDIsIHkxLCAqcHksIHkyKTsKLQkJaWYgKHgxIDw9ICpweCAmJiAqcHggPCB4MikgewotCQkJaWYgKHkxIDw9ICpweSAmJiAqcHkgPCB5MikgewotCQkJCWlkeCA9IGs7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JKnggPSBtYWN3aW5zW2lkeF0ueDsKLQkqeSA9IG1hY3dpbnNbaWR4XS55OwotCSp3ID0gbWFjd2luc1tpZHhdLndpZHRoOwotCSpoID0gbWFjd2luc1tpZHhdLmhlaWdodDsKLQkqZnJhbWUgPSAoV2luZG93KSBtYWN3aW5zW2lkeF0ud2luOwotCWlmICh3aW4gIT0gTlVMTCkgewotCQkqd2luID0gKmZyYW1lOwotCX0KLQotCWxhc3RfaWR4ID0gaWR4OwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBtYWNvc3hfdmFsaWRfd2luZG93KFdpbmRvdyB3LCBYV2luZG93QXR0cmlidXRlcyogYSkgewotCXN0YXRpYyBpbnQgbGFzdF9pZHggPSAtMTsKLQlpbnQgd2luID0gKGludCkgdzsKLQlpbnQgaSwgaywgaWR4ID0gLTE7Ci0KLQlpZiAobGFzdF9pZHggPj0gMCAmJiBsYXN0X2lkeCA8IG1hY3dpbm1heCkgewotCQlpZiAobWFjd2luc1tsYXN0X2lkeF0ud2luID09IHdpbikgewotCQkJaWR4ID0gbGFzdF9pZHg7Ci0JCX0KLQl9Ci0KLQlpZiAoaWR4IDwgMCkgewotCQlpZHggPSBtYWNvc3hDR1NfZ2V0X3Fsb29rKHcpOwotCQlpZiAoaWR4ID49IDAgJiYgaWR4IDwgbWFjd2lubWF4KSB7Ci0JCQlpZiAobWFjd2luc1tpZHhdLndpbiAhPSB3aW4pIHsKLQkJCQlpZHggPSAtMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlkeCA9IC0xOwotCQl9Ci0JfQotCi0JaWYgKGlkeCA8IDApIHsKLQkJZm9yIChpID0gMDsgaTxtYWN3aW5tYXg7IGkrKykgewotCQkJayA9IGk7Ci0JCQlpZiAoaSA9PSAtMSkgIHsKLQkJCQlpZiAobGFzdF9pZHggPj0gMCAmJiBsYXN0X2lkeCA8IG1hY3dpbm1heCkgewotCQkJCQlrID0gbGFzdF9pZHg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdF9pZHggPSAtMTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1hY3dpbnNba10ud2luID09IHdpbikgewotCQkJCWlkeCA9IGs7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYS0+eCA9IG1hY3dpbnNbaWR4XS54OwotCWEtPnkgPSBtYWN3aW5zW2lkeF0ueTsKLQlhLT53aWR0aCAgPSBtYWN3aW5zW2lkeF0ud2lkdGg7Ci0JYS0+aGVpZ2h0ID0gbWFjd2luc1tpZHhdLmhlaWdodDsKLQlhLT5kZXB0aCA9IGRlcHRoOwotCWEtPmJvcmRlcl93aWR0aCA9IDA7Ci0JYS0+YmFja2luZ19zdG9yZSA9IDA7Ci0JaWYgKG1hY3dpbnNbaWR4XS5tYXBwZWQpIHsKLQkJYS0+bWFwX3N0YXRlID0gSXNWaWV3YWJsZTsKLQl9IGVsc2UgewotCQlhLT5tYXBfc3RhdGUgPSBJc1VubWFwcGVkOwotCX0KLQotCWxhc3RfaWR4ID0gaWR4OwotCQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIFFUTUFYIDIwNDgKLXN0YXRpYyBXaW5kb3cgY3JldFtRVE1BWF07Ci0KLWV4dGVybiBpbnQgQ0dTX2xldmVsbWF4OwotZXh0ZXJuIGludCBDR1NfbGV2ZWxzW107Ci0KLVN0YXR1cyBtYWNvc3hfeHF1ZXJ5dHJlZShXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwgV2luZG93ICpwYXJlbnRfcmV0dXJuLAotICAgIFdpbmRvdyAqKmNoaWxkcmVuX3JldHVybiwgdW5zaWduZWQgaW50ICpuY2hpbGRyZW5fcmV0dXJuKSB7Ci0KLQlpbnQgaSwgbiwgazsKLQotCSpyb290X3JldHVybiA9IChXaW5kb3cpIDA7Ci0JKnBhcmVudF9yZXR1cm4gPSAoV2luZG93KSAwOwotCWlmICghdykge30KLQotCW1hY29zeENHU19nZXRfYWxsX3dpbmRvd3MoKTsKLQotCW4gPSAwOwotCWZvciAoayA9IENHU19sZXZlbG1heCAtIDE7IGsgPj0gMDsgay0tKSB7Ci0JCWZvciAoaSA9IG1hY3dpbm1heCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAobiA+PSBRVE1BWCkgYnJlYWs7Ci0JCQlpZiAobWFjd2luc1tpXS5sZXZlbCA9PSBDR1NfbGV2ZWxzW2tdKSB7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJrPSVkIGk9JWQgbj0lZFxuIiwgaywgaSwgbik7Ci0JCQkJY3JldFtuKytdID0gKFdpbmRvdykgbWFjd2luc1tpXS53aW47Ci0JCQl9Ci0JCX0KLQl9Ci0JKmNoaWxkcmVuX3JldHVybiA9IGNyZXQ7Ci0JKm5jaGlsZHJlbl9yZXR1cm4gPSAodW5zaWduZWQgaW50KSBtYWN3aW5tYXg7Ci0KLQlyZXR1cm4gKFN0YXR1cykgMTsKLX0KLQotaW50IG1hY29zeF9jaGVja19vZmZzY3JlZW4oaW50IHdpbikgewotCXNyYVJlZ2lvblB0ciByMCwgcjE7Ci0JaW50IHgxLCB5MSwgeDIsIHkyOwotCWludCByZXQ7Ci0JaW50IGkgPSBtYWNvc3hDR1NfZmluZF9pbmRleCh3aW4pOwotCi0JaWYgKGkgPCAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXgxID0gbWFjd2luc1tpXS54OwotCXkxID0gbWFjd2luc1tpXS55OwotCXgyID0gbWFjd2luc1tpXS54ICsgbWFjd2luc1tpXS53aWR0aDsKLQl5MiA9IG1hY3dpbnNbaV0ueSArIG1hY3dpbnNbaV0uaGVpZ2h0OwotCi0JcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHgxLCB5MSwgeDIsIHkyKTsKLQotCWlmIChzcmFSZ25BbmQocjEsIHIwKSkgewotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXJldCA9IDE7Ci0JfQotCXNyYVJnbkRlc3Ryb3kocjApOwotCXNyYVJnbkRlc3Ryb3kocjEpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IG1hY29zeF9jaGVja19jbGlwcGVkKGludCB3aW4sIGludCAqbGlzdCwgaW50IG4pIHsKLQlzcmFSZWdpb25QdHIgcjAsIHIxLCByMjsKLQlpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGssIGosIGkgPSBtYWNvc3hDR1NfZmluZF9pbmRleCh3aW4pOwotCi0JaWYgKGkgPCAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXgxID0gbWFjd2luc1tpXS54OwotCXkxID0gbWFjd2luc1tpXS55OwotCXgyID0gbWFjd2luc1tpXS54ICsgbWFjd2luc1tpXS53aWR0aDsKLQl5MiA9IG1hY3dpbnNbaV0ueSArIG1hY3dpbnNbaV0uaGVpZ2h0OwotCi0JcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHgxLCB5MSwgeDIsIHkyKTsKLQlzcmFSZ25BbmQocjEsIHIwKTsKLQotCWZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKLQkJaiA9IG1hY29zeENHU19maW5kX2luZGV4KGxpc3Rba10pOwkvKiBYWFggc2xvdz8gKi8KLQkJaWYgKGogPCAwKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQl4MSA9IG1hY3dpbnNbal0ueDsKLQkJeTEgPSBtYWN3aW5zW2pdLnk7Ci0JCXgyID0gbWFjd2luc1tqXS54ICsgbWFjd2luc1tqXS53aWR0aDsKLQkJeTIgPSBtYWN3aW5zW2pdLnkgKyBtYWN3aW5zW2pdLmhlaWdodDsKLQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHgxLCB5MSwgeDIsIHkyKTsKLQkJaWYgKHNyYVJnbkFuZChyMiwgcjEpKSB7Ci0JCQlyZXQgPSAxOwotCQkJc3JhUmduRGVzdHJveShyMik7Ci0JCQlicmVhazsKLQkJfQotCQlzcmFSZ25EZXN0cm95KHIyKTsKLQl9Ci0Jc3JhUmduRGVzdHJveShyMCk7Ci0Jc3JhUmduRGVzdHJveShyMSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLSNlbmRpZiAJLyogTElCVk5DU0VSVkVSX0hBVkVfTUFDT1NYX05BVElWRV9ESVNQTEFZICovCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9tYWNvc3guaCBiL3gxMXZuYy9tYWNvc3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2MjBjOC4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWFjb3N4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19NQUNPU1hfSAotI2RlZmluZSBfWDExVk5DX01BQ09TWF9ICi0KLS8qIC0tIG1hY29zeC5oIC0tICovCi0KLWV4dGVybiB2b2lkIG1hY29zeF9sb2coY2hhciAqKTsKLWV4dGVybiBjaGFyICptYWNvc3hfY29uc29sZV9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpOwotZXh0ZXJuIGNoYXIgKm1hY29zeF9nZXRfZmJfYWRkcih2b2lkKTsKLWV4dGVybiB2b2lkIG1hY29zeF9rZXlfY29tbWFuZChyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4X3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLWV4dGVybiB2b2lkIG1hY29zeF9ldmVudF9sb29wKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hfZ2V0X2N1cnNvcih2b2lkKTsKLWV4dGVybiBpbnQgbWFjb3N4X2dldF9jdXJzb3JfcG9zKGludCAqLCBpbnQgKik7Ci1leHRlcm4gaW50IG1hY29zeF92YWxpZF93aW5kb3coV2luZG93LCBYV2luZG93QXR0cmlidXRlcyopOwotZXh0ZXJuIFN0YXR1cyBtYWNvc3hfeHF1ZXJ5dHJlZShXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwgV2luZG93ICpwYXJlbnRfcmV0dXJuLAotICAgIFdpbmRvdyAqKmNoaWxkcmVuX3JldHVybiwgdW5zaWduZWQgaW50ICpuY2hpbGRyZW5fcmV0dXJuKTsKLWV4dGVybiBpbnQgbWFjb3N4X2dldF93bV9mcmFtZV9wb3MoaW50ICpweCwgaW50ICpweSwgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoLAotICAgIFdpbmRvdyAqZnJhbWUsIFdpbmRvdyAqd2luKTsKLWV4dGVybiB2b2lkIG1hY29zeF9zZW5kX3NlbChjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfc2V0X3NlbChjaGFyICosIGludCk7Ci0KLWV4dGVybiB2b2lkIG1hY29zeF9hZGRfbWFwbm90aWZ5KFdpbmRvdyB3aW4sIGludCBsZXZlbCwgaW50IG1hcCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfYWRkX2NyZWF0ZShXaW5kb3cgd2luLCBpbnQgbGV2ZWwpOwotZXh0ZXJuIHZvaWQgbWFjb3N4X2FkZF9kZXN0cm95KFdpbmRvdyB3aW4sIGludCBsZXZlbCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfYWRkX3Zpc25vdGlmeShXaW5kb3cgd2luLCBpbnQgbGV2ZWwsIGludCBvYnNjdXJlZCk7Ci1leHRlcm4gaW50IG1hY29zeF9jaGVja2V2ZW50KFhFdmVudCAqZXYpOwotCi1leHRlcm4gV2luZG93IG1hY29zeF9jbGlja19mcmFtZTsKLQotCi0jZW5kaWYgLyogX1gxMVZOQ19NQUNPU1hfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL21hY29zeENHLmMgYi94MTF2bmMvbWFjb3N4Q0cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNDFlMC4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWFjb3N4Q0cuYworKysgL2Rldi9udWxsCkBAIC0xLDk4OSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIG1hY29zeENHLmMgLS0gKi8KLQotLyoKLSAqIFdlIG5lZWQgdG8ga2VlcCB0aGlzIHNlcGFyYXRlIGZyb20gbmVhcmx5IGV2ZXJ5dGhpbmcgZWxzZSwgZS5nLiByZmIuaAotICogYW5kIHRoZSBvdGhlciBzdHVmZiwgb3RoZXJ3aXNlIGl0IGRvZXMgbm90IHdvcmsgcHJvcGVybHksIG1vdXNlIGRyYWdzCi0gKiB3aWxsIG5vdCB3b3JrISEKLSAqLwotCi12b2lkIG1hY29zeENHX2R1bW15KHZvaWQpIHt9Ci0KLSNpZiAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotCi0jaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci0jaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+Ci0KLXZvaWQgbWFjb3N4Q0dfaW5pdCh2b2lkKTsKLXZvaWQgbWFjb3N4Q0dfZmluaSh2b2lkKTsKLXZvaWQgbWFjb3N4Q0dfZXZlbnRfbG9vcCh2b2lkKTsKLWNoYXIgKm1hY29zeENHX2dldF9mYl9hZGRyKHZvaWQpOwotCi1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSh2b2lkKTsKLWludCBtYWNvc3hDR19DR0Rpc3BsYXlQaXhlbHNIaWdoKHZvaWQpOwotaW50IG1hY29zeENHX0NHRGlzcGxheUJpdHNQZXJQaXhlbCh2b2lkKTsKLWludCBtYWNvc3hDR19DR0Rpc3BsYXlCaXRzUGVyU2FtcGxlKHZvaWQpOwotaW50IG1hY29zeENHX0NHRGlzcGxheVNhbXBsZXNQZXJQaXhlbCh2b2lkKTsKLWludCBtYWNvc3hDR19DR0Rpc3BsYXlCeXRlc1BlclJvdyh2b2lkKTsKLQotdm9pZCBtYWNvc3hDR19wb2ludGVyX2luamVjdChpbnQgbWFzaywgaW50IHgsIGludCB5KTsKLWludCBtYWNvc3hDR19nZXRfY3Vyc29yX3BvcyhpbnQgKngsIGludCAqeSk7Ci1pbnQgbWFjb3N4Q0dfZ2V0X2N1cnNvcih2b2lkKTsKLXZvaWQgbWFjb3N4Q0dfaW5pdF9rZXlfdGFibGUodm9pZCk7Ci12b2lkIG1hY29zeENHX2tleXN5bV9pbmplY3QoaW50IGRvd24sIHVuc2lnbmVkIGludCBrZXlzeW0pOwotdm9pZCBtYWNvc3hDR19rZXljb2RlX2luamVjdChpbnQgZG93biwgaW50IGtleWNvZGUpOwotCi1DR0RpcmVjdERpc3BsYXlJRCBkaXNwbGF5SUQgPSAwOwotCi1leHRlcm4gdm9pZCBtYWNvc3hfbG9nKGNoYXIgKik7Ci1leHRlcm4gaW50IGNvbGxlY3Rfbm9uX1hfeGRhbWFnZShpbnQgeF9pbiwgaW50IHlfaW4sIGludCB3X2luLCBpbnQgaF9pbiwgaW50IGNhbGwpOwotCi1zdGF0aWMgdm9pZCBtYWNvc3hDR19jYWxsYmFjayhDR1JlY3RDb3VudCBuLCBjb25zdCBDR1JlY3QgKnJlY3RzLCB2b2lkICpkdW0pIHsKLQlpbnQgaSwgZGIgPSAwOwotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJtYWNvc3hfY2FsbGJhY2s6IG49JWRcbiIsIChpbnQpIG4pOwotCWlmICghZHVtKSB7fQotCWZvciAoaT0wOyBpIDwgKGludCkgbjsgaSsrKSB7Ci0JCWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgOiAlZyAlZyAtICVnICVnXG4iLCByZWN0c1tpXS5vcmlnaW4ueCwgcmVjdHNbaV0ub3JpZ2luLnksIHJlY3RzW2ldLnNpemUud2lkdGgsIHJlY3RzW2ldLnNpemUuaGVpZ2h0KTsKLQkJY29sbGVjdF9ub25fWF94ZGFtYWdlKCAoaW50KSByZWN0c1tpXS5vcmlnaW4ueCwgKGludCkgcmVjdHNbaV0ub3JpZ2luLnksCi0JCSAgICAoaW50KSByZWN0c1tpXS5zaXplLndpZHRoLCAoaW50KSByZWN0c1tpXS5zaXplLmhlaWdodCwgMSk7Ci0JfQotfQotCi0jaWYgMAotPiAKLT4gaWYgZ2NjIC1ESEFWRV9DT05GSUdfSCAtSS4gLUkuIC1JLi4gICAtSS9vcHQvbG9jYWwvaW5jbHVkZSAgIC1JL29wdC9sb2NhbC9pbmNsdWRlIC1PYmpDIC1nIC1PMiAtV2FsbCAtTVQgeDExdm5jLW1hY29zeENHLm8gLU1EIC1NUCAtTUYgIi5kZXBzL3gxMXZuYy1tYWNvc3hDRy5UcG8iIC1jIC1vIHgxMXZuYy1tYWNvc3hDRy5vIGB0ZXN0IC1mICdtYWNvc3hDRy5jJyB8fCBlY2hvICcuLydgbWFjb3N4Q0cuYzsgXAotPiAJdGhlbiBtdiAtZiAiLmRlcHMveDExdm5jLW1hY29zeENHLlRwbyIgIi5kZXBzL3gxMXZuYy1tYWNvc3hDRy5QbyI7IGVsc2Ugcm0gLWYgIi5kZXBzL3gxMXZuYy1tYWNvc3hDRy5UcG8iOyBleGl0IDE7IGZpCi0+IG1hY29zeENHLmM6MTQ5OiB3YXJuaW5nOiBDR1NldExvY2FsRXZlbnRzU3VwcHJlc3Npb25JbnRlcnZhbCBpcyBkZXByZWNhdGVkIChkZWNsYXJlZCBhdCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcmsvSGVhZGVycy9DR1JlbW90ZU9wZXJhdGlvbi5oOjM3MykKLT4gbWFjb3N4Q0cuYzoxNTA6IHdhcm5pbmc6IENHU2V0TG9jYWxFdmVudHNGaWx0ZXJEdXJpbmdTdXBwcmVzc2lvblN0YXRlIGlzIGRlcHJlY2F0ZWQgKGRlY2xhcmVkIGF0IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcGxpY2F0aW9uU2VydmljZXMuZnJhbWV3b3JrL0ZyYW1ld29ya3MvQ29yZUdyYXBoaWNzLmZyYW1ld29yay9IZWFkZXJzL0NHUmVtb3RlT3BlcmF0aW9uLmg6MzY2KQotPiBtYWNvc3hDRy5jOjE1Mzogd2FybmluZzogQ0dTZXRMb2NhbEV2ZW50c0ZpbHRlckR1cmluZ1N1cHByZXNzaW9uU3RhdGUgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dSZW1vdGVPcGVyYXRpb24uaDozNjYpCi0+IG1hY29zeENHLmM6MjQ0OiB3YXJuaW5nOiBDR0Rpc3BsYXlCYXNlQWRkcmVzcyBpcyBkZXByZWNhdGVkIChkZWNsYXJlZCBhdCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcmsvSGVhZGVycy9DR0RpcmVjdERpc3BsYXkuaDo0NjYpCi0+IG1hY29zeENHLmM6MjU0OiB3YXJuaW5nOiBDR0Rpc3BsYXlCaXRzUGVyUGl4ZWwgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dEaXJlY3REaXNwbGF5Lmg6NTE3KQotPiBtYWNvc3hDRy5jOjI1Nzogd2FybmluZzogQ0dEaXNwbGF5Qml0c1BlclNhbXBsZSBpcyBkZXByZWNhdGVkIChkZWNsYXJlZCBhdCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcmsvSGVhZGVycy9DR0RpcmVjdERpc3BsYXkuaDo1MjIpCi0+IG1hY29zeENHLmM6MjYwOiB3YXJuaW5nOiBDR0Rpc3BsYXlTYW1wbGVzUGVyUGl4ZWwgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dEaXJlY3REaXNwbGF5Lmg6NTI2KQotPiBtYWNvc3hDRy5jOjI2Mzogd2FybmluZzogQ0dEaXNwbGF5Qnl0ZXNQZXJSb3cgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dEaXJlY3REaXNwbGF5Lmg6NDc2KQotPiBtYWNvc3hDRy5jOjQxOTogd2FybmluZzogQ0dQb3N0U2Nyb2xsV2hlZWxFdmVudCBpcyBkZXByZWNhdGVkIChkZWNsYXJlZCBhdCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcmsvSGVhZGVycy9DR1JlbW90ZU9wZXJhdGlvbi5oOjMyNykKLT4gbWFjb3N4Q0cuYzo0MjI6IHdhcm5pbmc6IENHUG9zdFNjcm9sbFdoZWVsRXZlbnQgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dSZW1vdGVPcGVyYXRpb24uaDozMjcpCi0+IG1hY29zeENHLmM6NDI1OiB3YXJuaW5nOiBDR1Bvc3RNb3VzZUV2ZW50IGlzIGRlcHJlY2F0ZWQgKGRlY2xhcmVkIGF0IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcGxpY2F0aW9uU2VydmljZXMuZnJhbWV3b3JrL0ZyYW1ld29ya3MvQ29yZUdyYXBoaWNzLmZyYW1ld29yay9IZWFkZXJzL0NHUmVtb3RlT3BlcmF0aW9uLmg6MzA3KQotPiBtYWNvc3hDRy5jOjY0MTogd2FybmluZzogQ0dQb3N0S2V5Ym9hcmRFdmVudCBpcyBkZXByZWNhdGVkIChkZWNsYXJlZCBhdCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcmsvSGVhZGVycy9DR1JlbW90ZU9wZXJhdGlvbi5oOjMzMykKLT4gbWFjb3N4Q0cuYzo2NjE6IHdhcm5pbmc6IENHUG9zdEtleWJvYXJkRXZlbnQgaXMgZGVwcmVjYXRlZCAoZGVjbGFyZWQgYXQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrL0hlYWRlcnMvQ0dSZW1vdGVPcGVyYXRpb24uaDozMzMpCi0+Ci0KLVgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUwotWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFMKLVgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUgotWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVECi0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNhbGxiYWNrX3NldCA9IDA7Ci1leHRlcm4gaW50IG5vZmI7Ci0KLXZvaWQgbWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFja19vbih2b2lkKSB7Ci0JaWYgKG5vZmIpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIGNhbGxiYWNrX3NldCkgewotCQlpZiAoMSkgbWFjb3N4X2xvZygibWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFjazogcmVnaXN0ZXJcbiIpOwotCQlDR1JlZ2lzdGVyU2NyZWVuUmVmcmVzaENhbGxiYWNrKG1hY29zeENHX2NhbGxiYWNrLCBOVUxMKTsKLQl9Ci0JY2FsbGJhY2tfc2V0ID0gMTsKLX0KLQotdm9pZCBtYWNvc3hDR19yZWZyZXNoX2NhbGxiYWNrX29mZih2b2lkKSB7Ci0JaWYgKGNhbGxiYWNrX3NldCkgewotCQlpZiAoMSkgbWFjb3N4X2xvZygibWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFjazogdW5yZWdpc3RlclxuIik7Ci0JCUNHVW5yZWdpc3RlclNjcmVlblJlZnJlc2hDYWxsYmFjayhtYWNvc3hDR19jYWxsYmFjaywgTlVMTCk7Ci0JfQotCWNhbGxiYWNrX3NldCA9IDA7Ci19Ci0KLWV4dGVybiBpbnQgbWFjb3N4X25vc2NyZWVuc2F2ZXI7Ci1leHRlcm4gaW50IG1hY29zeF9yZWFkX29wZW5nbDsKLWV4dGVybiBpbnQgbWFjb3N4X3JlYWRfcmF3ZmI7Ci0KLWV4dGVybiB2b2lkIG1hY29zeEdDU19pbml0cGIodm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHUF9pbml0X2RpbW1pbmcodm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHUF91bmRpbSh2b2lkKTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dQX2RpbV9zaHV0ZG93bih2b2lkKTsKLWV4dGVybiB2b2lkIG1hY29zeENHUF9zY3JlZW5zYXZlcl90aW1lcl9vZmYodm9pZCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hDR1Bfc2NyZWVuc2F2ZXJfdGltZXJfb24odm9pZCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfb3BlbmdsX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfb3BlbmdsX2Zpbmkodm9pZCk7Ci0KLWludCB4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfbG9jYWxldmVudHMgPSAwOwotaW50IHgxMXZuY19tYWNvc3hfbm9fZGVwcmVjYXRlZF9wb3N0ZXZlbnRzICA9IDA7Ci1pbnQgeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX2ZyYW1lYnVmZmVyID0gMDsKLQotdm9pZCBtYWNvc3hDR19pbml0KHZvaWQpIHsKLQotCXgxMXZuY19tYWNvc3hfbm9fZGVwcmVjYXRlZF9sb2NhbGV2ZW50cyA9IDA7Ci0JeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX3Bvc3RldmVudHMgID0gMDsKLQl4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfZnJhbWVidWZmZXIgPSAwOwotCi0JaWYgKGdldGVudigiWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0xPQ0FMRVZFTlRTIikgfHwgZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQiKSkgewotCQl4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfbG9jYWxldmVudHMgPSAxOwotCX0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUyIpIHx8IGdldGVudigiWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEIikpIHsKLQkJeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX3Bvc3RldmVudHMgPSAxOwotCX0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfRlJBTUVCVUZGRVIiKSB8fCBnZXRlbnYoIlgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRCIpKSB7Ci0JCXgxMXZuY19tYWNvc3hfbm9fZGVwcmVjYXRlZF9mcmFtZWJ1ZmZlciA9IDE7Ci0JfQotCi0JaWYgKGRpc3BsYXlJRCA9PSAwKSB7Ci0JCW1hY29zeF9sb2coIm1hY29zeENHX2luaXQ6IGluaXRpYWxpemluZyBkaXNwbGF5LlxuIik7Ci0KLQkJZGlzcGxheUlEID0ga0NHRGlyZWN0TWFpbkRpc3BsYXk7Ci0jaWZkZWYgWDExVk5DX01BQ09TWF9VU0VfR0VUTUFJTkRFVklDRQotCQkvKiBub3Qgc3VyZSB0aGlzIGV2ZXIgZGlkIGFueXRoaW5nLiAqLwotCQkodm9pZCkgR2V0TWFpbkRldmljZSgpOwotI2VuZGlmCi0JCWlmIChkaXNwbGF5SUQgPT0gMCkgewotCQkJbWFjb3N4X2xvZygibWFjb3N4Q0dfaW5pdDogY291bGQgbm90IGdldCBrQ0dEaXJlY3RNYWluRGlzcGxheSAvIENHTWFpbkRpc3BsYXlJRCgpIGRpc3BsYXkuXG4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQotI2lmIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUyB8fCBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQKLQkJbWFjb3N4X2xvZygiTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUzogbm90IGNhbGxpbmcgQ0dTZXRMb2NhbEV2ZW50c1N1cHByZXNzaW9uSW50ZXJ2YWwoKVxuIik7Ci0JCW1hY29zeF9sb2coIk5PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM6IG5vdCBjYWxsaW5nIENHU2V0TG9jYWxFdmVudHNGaWx0ZXJEdXJpbmdTdXByZXNzaW9uU3RhdGUoKVxuIik7Ci0jZWxzZQotCQlpZiAoIXgxMXZuY19tYWNvc3hfbm9fZGVwcmVjYXRlZF9sb2NhbGV2ZW50cykgewotCQkJQ0dTZXRMb2NhbEV2ZW50c1N1cHByZXNzaW9uSW50ZXJ2YWwoMC4wKTsKLQkJCUNHU2V0TG9jYWxFdmVudHNGaWx0ZXJEdXJpbmdTdXByZXNzaW9uU3RhdGUoCi0JCQkgICAga0NHRXZlbnRGaWx0ZXJNYXNrUGVybWl0QWxsRXZlbnRzLAotCQkJICAgIGtDR0V2ZW50U3VwcmVzc2lvblN0YXRlU3VwcmVzc2lvbkludGVydmFsKTsKLQkJCUNHU2V0TG9jYWxFdmVudHNGaWx0ZXJEdXJpbmdTdXByZXNzaW9uU3RhdGUoCi0JCQkgICAga0NHRXZlbnRGaWx0ZXJNYXNrUGVybWl0QWxsRXZlbnRzLAotCQkJICAgIGtDR0V2ZW50U3VwcmVzc2lvblN0YXRlUmVtb3RlTW91c2VEcmFnKTsKLQkJfSBlbHNlIHsKLQkJCW1hY29zeF9sb2coIk5PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM6IG5vdCBjYWxsaW5nIENHU2V0TG9jYWxFdmVudHNTdXBwcmVzc2lvbkludGVydmFsKClcbiIpOwotCQkJbWFjb3N4X2xvZygiTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUzogbm90IGNhbGxpbmcgQ0dTZXRMb2NhbEV2ZW50c0ZpbHRlckR1cmluZ1N1cHJlc3Npb25TdGF0ZSgpXG4iKTsKLQkJfQotI2VuZGlmCi0KLQkJbWFjb3N4X29wZW5nbF9pbml0KCk7Ci0KLQkJaWYgKCFtYWNvc3hfcmVhZF9vcGVuZ2wpIHsKLQkJCWNoYXIgKmFkZHIgPSBtYWNvc3hDR19nZXRfZmJfYWRkcigpOwotCQkJaWYgKGFkZHIgPT0gTlVMTCkgewotCQkJCW1hY29zeF9sb2coIm1hY29zeENHX2luaXQ6IGNvdWxkIG5vdCBnZXQgcmF3IGZyYW1lYnVmZmVyIGFkZHJlc3MgLyBDR0Rpc3BsYXlCYXNlQWRkcmVzcygpLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCW1hY29zeF9yZWFkX3Jhd2ZiID0gMTsKLQkJCW1hY29zeF9sb2coIm1hY29zeENHX2luaXQ6IHVzaW5nIHJhdyBmcmFtZWJ1ZmZlciBhZGRyZXNzIGZvciBzY3JlZW4gY2FwdHVyZS5cbiIpOwotCQl9Ci0KLQkJbWFjb3N4Q0dQX2luaXRfZGltbWluZygpOwotCQlpZiAobWFjb3N4X25vc2NyZWVuc2F2ZXIpIHsKLQkJCW1hY29zeENHUF9zY3JlZW5zYXZlcl90aW1lcl9vbigpOwotCQl9Ci0KLQkJbWFjb3N4R0NTX2luaXRwYigpOwotCX0KLX0KLQotdm9pZCBtYWNvc3hDR19maW5pKHZvaWQpIHsKLQltYWNvc3hDR1BfZGltX3NodXRkb3duKCk7Ci0JaWYgKG1hY29zeF9ub3NjcmVlbnNhdmVyKSB7Ci0JCW1hY29zeENHUF9zY3JlZW5zYXZlcl90aW1lcl9vZmYoKTsKLQl9Ci0JbWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFja19vZmYoKTsKLQltYWNvc3hfb3BlbmdsX2ZpbmkoKTsKLQlkaXNwbGF5SUQgPSAwOwotfQotCi1leHRlcm4gaW50IGRweV94LCBkcHlfeSwgYnBwLCB3ZHB5X3gsIHdkcHlfeTsKLWV4dGVybiBpbnQgY2xpZW50X2NvdW50LCBub2ZiOwotZXh0ZXJuIHZvaWQgZG9fbmV3X2ZiKGludCk7Ci1leHRlcm4gaW50IG1hY29zeF93YWl0X2Zvcl9zd2l0Y2gsIG1hY29zeF9yZXNpemU7Ci0KLWV4dGVybiB2b2lkIG1hY29zeEdDU19wb2xsX3BiKHZvaWQpOwotI2lmIDAKLWV4dGVybiB2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nIHVzZWMpOwotI2Vsc2UKLWV4dGVybiBpbnQgdXNsZWVwKHVzZWNvbmRzX3QgdXNlYyk7Ci0jZW5kaWYKLWV4dGVybiB1bnNpZ25lZCBpbnQgc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpOwotZXh0ZXJuIHZvaWQgY2xlYW5fdXBfZXhpdChpbnQgcmV0KTsKLQotdm9pZCBtYWNvc3hDR19ldmVudF9sb29wKHZvaWQpIHsKLQlPU1N0YXR1cyByYzsKLQlpbnQgbmJwcDsKLQlzdGF0aWMgaW50IG5icHBfc2F2ZSA9IC0xOwotCi0JbWFjb3N4R0NTX3BvbGxfcGIoKTsKLQlpZiAobm9mYikgewotCQlyZXR1cm47Ci0JfQotCi0JcmMgPSBSdW5DdXJyZW50RXZlbnRMb29wKGtFdmVudER1cmF0aW9uU2Vjb25kLzMwKTsKLQotCWlmIChjbGllbnRfY291bnQpIHsKLQkJbWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFja19vbigpOwotCX0gZWxzZSB7Ci0JCW1hY29zeENHX3JlZnJlc2hfY2FsbGJhY2tfb2ZmKCk7Ci0JfQotCi0JbmJwcCA9IG1hY29zeENHX0NHRGlzcGxheUJpdHNQZXJQaXhlbCgpOwotCi0JaWYgKG5icHBfc2F2ZSA8IDApIHsKLQkJbmJwcF9zYXZlID0gbmJwcDsKLQl9Ci0JCQotCWlmIChuYnBwID4gMCAmJiBuYnBwICE9IG5icHBfc2F2ZSkgewotCQluYnBwX3NhdmUgPSBuYnBwOwotCQlpZiAobWFjb3N4X3Jlc2l6ZSkgewotCQkJZG9fbmV3X2ZiKDEpOwotCQl9Ci0JfSBlbHNlIGlmICh3ZHB5X3ggIT0gbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSgpKSB7Ci0JICAgIGlmICh3ZHB5X3kgIT0gbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzSGlnaCgpKSB7Ci0JCWlmIChtYWNvc3hfd2FpdF9mb3Jfc3dpdGNoKSB7Ci0JCQlpbnQgY250ID0gMDsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJaWYobWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSgpID4gMCkgewotCQkJCQlpZihtYWNvc3hDR19DR0Rpc3BsYXlQaXhlbHNIaWdoKCkgPiAwKSB7Ci0JCQkJCQl1c2xlZXAoNTAwKjEwMDApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKChjbnQrKyAlIDEyMCkgPT0gMCkgewotCQkJCQltYWNvc3hfbG9nKCJ3YWl0aW5nIGZvciB1c2VyIHRvICIKLQkJCQkJICAgICJzd2l0Y2ggYmFjay4uXG4iKTsKLQkJCQl9Ci0JCQkJc2xlZXAoMSk7Ci0JCQl9Ci0JCQlpZiAod2RweV94ID09IG1hY29zeENHX0NHRGlzcGxheVBpeGVsc1dpZGUoKSkgewotCQkJCWlmICh3ZHB5X3kgPT0gbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzSGlnaCgpKSB7Ci0JCQkJCW1hY29zeF9sb2coIndlJ3JlIGJhY2suLi5cbiIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtYWNvc3hfcmVzaXplKSB7Ci0JCQlkb19uZXdfZmIoMSk7Ci0JCX0KLQkgICAgfQotCX0KLQlpZiAobmJwcCA+IDApIHsKLQkJbmJwcF9zYXZlID0gbmJwcDsKLQl9Ci19Ci0KLWV4dGVybiBpbnQgbWFjb3N4X25vX3Jhd2ZiOwotZXh0ZXJuIGludCBtYWNvc3hfcmVhZF9vcGVuZ2w7Ci1leHRlcm4gaW50IG1hY29zeF9vcGVuZ2xfZ2V0X3dpZHRoKCk7Ci1leHRlcm4gaW50IG1hY29zeF9vcGVuZ2xfZ2V0X2hlaWdodCgpOwotZXh0ZXJuIGludCBtYWNvc3hfb3BlbmdsX2dldF9icHAoKTsKLWV4dGVybiBpbnQgbWFjb3N4X29wZW5nbF9nZXRfYnBzKCk7Ci1leHRlcm4gaW50IG1hY29zeF9vcGVuZ2xfZ2V0X3NwcCgpOwotCi0jaWYgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0ZSQU1FQlVGRkVSIHx8IFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRAotCi1jaGFyICptYWNvc3hDR19nZXRfZmJfYWRkcih2b2lkKSB7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSh2b2lkKSB7Ci0JcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X3dpZHRoKCk7Ci19Ci1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzSGlnaCh2b2lkKSB7Ci0JcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X2hlaWdodCgpOwotfQotaW50IG1hY29zeENHX0NHRGlzcGxheUJpdHNQZXJQaXhlbCh2b2lkKSB7Ci0JcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X2JwcCgpOwotfQotaW50IG1hY29zeENHX0NHRGlzcGxheUJpdHNQZXJTYW1wbGUodm9pZCkgewotCXJldHVybiBtYWNvc3hfb3BlbmdsX2dldF9icHMoKTsKLX0KLWludCBtYWNvc3hDR19DR0Rpc3BsYXlTYW1wbGVzUGVyUGl4ZWwodm9pZCkgewotCXJldHVybiBtYWNvc3hfb3BlbmdsX2dldF9zcHAoKTsKLX0KLWludCBtYWNvc3hDR19DR0Rpc3BsYXlCeXRlc1BlclJvdyh2b2lkKSB7Ci0JcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X3dpZHRoKCkgKiBtYWNvc3hfb3BlbmdsX2dldF9icHAoKSAvIDg7Ci19Ci0KLSNlbHNlCi0KLWNoYXIgKm1hY29zeENHX2dldF9mYl9hZGRyKHZvaWQpIHsKLQlpZiAoeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX2ZyYW1lYnVmZmVyKSB7Ci0JCW1hY29zeF9sb2coIkNHRGlzcGxheUJhc2VBZGRyZXNzIGRpc2FibGVkIGJ5IGVudi4gdmFyXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChtYWNvc3hfbm9fcmF3ZmIpIHsKLQkJbWFjb3N4X2xvZygiQ0dEaXNwbGF5QmFzZUFkZHJlc3MgZGlzYWJsZWQgYnkgdXNlci5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG1hY29zeF9yZWFkX29wZW5nbCkgewotCQltYWNvc3hfbG9nKCJDR0Rpc3BsYXlCYXNlQWRkcmVzcyBkaXNhYmxlZCBieSBPcGVuR0wuXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoY2hhciAqKSBDR0Rpc3BsYXlCYXNlQWRkcmVzcyhkaXNwbGF5SUQpOwotfQotCi1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSh2b2lkKSB7Ci0JaWYgKCgwICYmIG1hY29zeF9yZWFkX29wZW5nbCkgfHwgeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX2ZyYW1lYnVmZmVyKSB7Ci0JCXJldHVybiBtYWNvc3hfb3BlbmdsX2dldF93aWR0aCgpOwotCX0KLQlyZXR1cm4gKGludCkgQ0dEaXNwbGF5UGl4ZWxzV2lkZShkaXNwbGF5SUQpOwotfQotaW50IG1hY29zeENHX0NHRGlzcGxheVBpeGVsc0hpZ2godm9pZCkgewotCWlmICgoMCAmJiBtYWNvc3hfcmVhZF9vcGVuZ2wpIHx8IHgxMXZuY19tYWNvc3hfbm9fZGVwcmVjYXRlZF9mcmFtZWJ1ZmZlcikgewotCQlyZXR1cm4gbWFjb3N4X29wZW5nbF9nZXRfaGVpZ2h0KCk7Ci0JfQotCXJldHVybiAoaW50KSBDR0Rpc3BsYXlQaXhlbHNIaWdoKGRpc3BsYXlJRCk7Ci19Ci1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5Qml0c1BlclBpeGVsKHZvaWQpIHsKLQlpZiAoKDAgJiYgbWFjb3N4X3JlYWRfb3BlbmdsKSB8fCB4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfZnJhbWVidWZmZXIpIHsKLQkJcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X2JwcCgpOwotCX0KLQlyZXR1cm4gKGludCkgQ0dEaXNwbGF5Qml0c1BlclBpeGVsKGRpc3BsYXlJRCk7Ci19Ci1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5Qml0c1BlclNhbXBsZSh2b2lkKSB7Ci0JaWYgKG1hY29zeF9yZWFkX29wZW5nbCB8fCB4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfZnJhbWVidWZmZXIpIHsKLQkJcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X2JwcygpOwotCX0KLQlyZXR1cm4gKGludCkgQ0dEaXNwbGF5Qml0c1BlclNhbXBsZShkaXNwbGF5SUQpOwotfQotaW50IG1hY29zeENHX0NHRGlzcGxheVNhbXBsZXNQZXJQaXhlbCh2b2lkKSB7Ci0JaWYgKG1hY29zeF9yZWFkX29wZW5nbCB8fCB4MTF2bmNfbWFjb3N4X25vX2RlcHJlY2F0ZWRfZnJhbWVidWZmZXIpIHsKLQkJcmV0dXJuIG1hY29zeF9vcGVuZ2xfZ2V0X3NwcCgpOwotCX0KLQlyZXR1cm4gKGludCkgQ0dEaXNwbGF5U2FtcGxlc1BlclBpeGVsKGRpc3BsYXlJRCk7Ci19Ci1pbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5Qnl0ZXNQZXJSb3codm9pZCkgewotCWlmIChtYWNvc3hfcmVhZF9vcGVuZ2wgfHwgeDExdm5jX21hY29zeF9ub19kZXByZWNhdGVkX2ZyYW1lYnVmZmVyKSB7Ci0JCXJldHVybiBtYWNvc3hfb3BlbmdsX2dldF93aWR0aCgpICogbWFjb3N4X29wZW5nbF9nZXRfYnBwKCkvODsKLQl9Ci0JcmV0dXJuIChpbnQpIENHRGlzcGxheUJ5dGVzUGVyUm93KGRpc3BsYXlJRCk7OwotfQotCi0jZW5kaWYKLQotdHlwZWRlZiBpbnQgQ0dTQ29ubmVjdGlvblJlZjsKLXN0YXRpYyBDR1NDb25uZWN0aW9uUmVmIGNvbm4gPSAwOwotZXh0ZXJuIENHRXJyb3IgQ0dTTmV3Q29ubmVjdGlvbih2b2lkKiwgQ0dTQ29ubmVjdGlvblJlZiopOwotZXh0ZXJuIENHRXJyb3IgQ0dTUmVsZWFzZUNvbm5lY3Rpb24oQ0dTQ29ubmVjdGlvblJlZik7Ci1leHRlcm4gQ0dFcnJvciBDR1NHZXRHbG9iYWxDdXJzb3JEYXRhU2l6ZShDR1NDb25uZWN0aW9uUmVmLCBpbnQqKTsKLWV4dGVybiBDR0Vycm9yIENHU0dldEdsb2JhbEN1cnNvckRhdGEoQ0dTQ29ubmVjdGlvblJlZiwgdW5zaWduZWQgY2hhciosCi0gICAgaW50KiwgaW50KiwgQ0dSZWN0KiwgQ0dQb2ludCosIGludCosIGludCosIGludCopOwotZXh0ZXJuIENHRXJyb3IgQ0dTR2V0Q3VycmVudEN1cnNvckxvY2F0aW9uKENHU0Nvbm5lY3Rpb25SZWYsIENHUG9pbnQqKTsKLWV4dGVybiBpbnQgQ0dTQ3VycmVudEN1cnNvclNlZWQodm9pZCk7Ci1leHRlcm4gaW50IENHU0hhcmR3YXJlQ3Vyc29yQWN0aXZlKCk7IAotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfbG9jYWxfYnV0dG9uX21hc2sgPSAwOwotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2xvY2FsX21vZF9tYXNrID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9sb2NhbF94ID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9sb2NhbF95ID0gMDsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBkaXNwbGF5X2J1dHRvbl9tYXNrOwotZXh0ZXJuIHVuc2lnbmVkIGludCBkaXNwbGF5X21vZF9tYXNrOwotZXh0ZXJuIGludCBnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dDsKLWV4dGVybiB0aW1lX3QgbGFzdF9sb2NhbF9pbnB1dDsKLQotc3RhdGljIENHUG9pbnQgY3VycmVudF9jdXJzb3JfcG9zKHZvaWQpIHsKLQlDR1BvaW50IHBvczsKLQlwb3MueCA9IDA7Ci0JcG9zLnkgPSAwOwotCWlmICghIGNvbm4pIHsKLQkJaWYgKENHU05ld0Nvbm5lY3Rpb24oTlVMTCwgJmNvbm4pICE9IGtDR0Vycm9yU3VjY2VzcykgewotCQkJbWFjb3N4X2xvZygiQ0dTTmV3Q29ubmVjdGlvbiBlcnJvci5cbiIpOwotCQkJaWYgKCFkcHlfeCB8fCAhZHB5X3kgfHwgIXdkcHlfeCB8fCAhd2RweV95KSB7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoQ0dTR2V0Q3VycmVudEN1cnNvckxvY2F0aW9uKGNvbm4sICZwb3MpICE9IGtDR0Vycm9yU3VjY2VzcykgewotCQltYWNvc3hfbG9nKCJDR1NHZXRDdXJyZW50Q3Vyc29yTG9jYXRpb24gZXJyb3JcbiIpOwotCX0KLQotCWRpc3BsYXlfYnV0dG9uX21hc2sgPSBHZXRDdXJyZW50QnV0dG9uU3RhdGUoKTsKLSNpZiAwCi0vKiBub3QgdXNlZCB5ZXQgKi8KLQlkaXNwbGF5X21vZF9tYXNrID0gR2V0Q3VycmVudEtleU1vZGlmaWVycygpOwotI2VuZGlmCi0KLQlpZiAobGFzdF9sb2NhbF9idXR0b25fbWFzayAhPSBkaXNwbGF5X2J1dHRvbl9tYXNrKSB7Ci0JCWdvdF9sb2NhbF9wb2ludGVyX2lucHV0Kys7Ci0JCWxhc3RfbG9jYWxfaW5wdXQgPSB0aW1lKE5VTEwpOwotCX0gZWxzZSBpZiAocG9zLnggIT0gbGFzdF9sb2NhbF94IHx8IHBvcy55ICE9IGxhc3RfbG9jYWxfeSkgewotCQlnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dCsrOwotCQlsYXN0X2xvY2FsX2lucHV0ID0gdGltZShOVUxMKTsKLQl9Ci0JbGFzdF9sb2NhbF9idXR0b25fbWFzayA9IGRpc3BsYXlfYnV0dG9uX21hc2s7Ci0JbGFzdF9sb2NhbF9tb2RfbWFzayA9IGRpc3BsYXlfbW9kX21hc2s7Ci0JbGFzdF9sb2NhbF94ID0gcG9zLng7Ci0JbGFzdF9sb2NhbF95ID0gcG9zLnk7Ci0KLQlyZXR1cm4gcG9zOwotfQotCi1pbnQgbWFjb3N4Q0dfZ2V0X2N1cnNvcl9wb3MoaW50ICp4LCBpbnQgKnkpIHsKLQlDR1BvaW50IHBvcyA9IGN1cnJlbnRfY3Vyc29yX3BvcygpOwotCSp4ID0gcG9zLng7Ci0JKnkgPSBwb3MueTsKLQlyZXR1cm4gMTsKLX0KLQotZXh0ZXJuIGludCBnZXRfY3Vyc29yX3NlcmlhbChpbnQpOwotZXh0ZXJuIGludCBzdG9yZV9jdXJzb3IoaW50IHNlcmlhbCwgdW5zaWduZWQgbG9uZyAqZGF0YSwgaW50IHcsIGludCBoLCBpbnQgY2JwcCwgaW50IHhob3QsIGludCB5aG90KTsKLQotaW50IG1hY29zeENHX2dldF9jdXJzb3Iodm9pZCkgewotCWludCBsYXN0X2lkeCA9IChpbnQpIGdldF9jdXJzb3Jfc2VyaWFsKDEpOwotCWludCB3aGljaCA9IDE7Ci0JQ0dFcnJvciBlcnI7Ci0JaW50IGRhdGFzaXplLCByb3dfYnl0ZXMsIGNkZXB0aCwgY29tcHMsIGJwY29tcDsKLQlDR1JlY3QgcmVjdDsKLQlDR1BvaW50IGhvdDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCWludCBjdXJzb3Jfc2VlZDsKLQlzdGF0aWMgaW50IGxhc3RfY3Vyc29yX3NlZWQgPSAtMTsKLQlzdGF0aWMgdGltZV90IGxhc3RfZmV0Y2ggPSAwOwotCXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotCi0JaWYgKGxhc3RfaWR4KSB7Ci0JCXdoaWNoID0gbGFzdF9pZHg7Ci0JfQotCi0JaWYgKCEgY29ubikgewotCQlpZiAoQ0dTTmV3Q29ubmVjdGlvbihOVUxMLCAmY29ubikgIT0ga0NHRXJyb3JTdWNjZXNzKSB7Ci0JCQltYWNvc3hfbG9nKCJDR1NOZXdDb25uZWN0aW9uIGVycm9yLlxuIik7Ci0JCQlpZiAoIWRweV94IHx8ICFkcHlfeSB8fCAhd2RweV94IHx8ICF3ZHB5X3kpIHsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJcmV0dXJuIHdoaWNoOwotCQl9Ci0JfQotCi0JLyogWFhYIGFsbCBvZiB0aGVzZSBpbnRlcmZhY2VzIGFyZSB1bmRvY3VtZW50ZWQuICovCi0KLQljdXJzb3Jfc2VlZCA9IENHU0N1cnJlbnRDdXJzb3JTZWVkKCk7Ci0JaWYgKGxhc3RfaWR4ICYmIGN1cnNvcl9zZWVkID09IGxhc3RfY3Vyc29yX3NlZWQpIHsKLQkJaWYgKG5vdyA8IGxhc3RfZmV0Y2ggKyAyKSB7Ci0JCQlyZXR1cm4gd2hpY2g7Ci0JCX0KLQl9Ci0JbGFzdF9jdXJzb3Jfc2VlZCA9IGN1cnNvcl9zZWVkOwotCWxhc3RfZmV0Y2ggPSBub3c7Ci0KLQlpZiAoQ0dTR2V0R2xvYmFsQ3Vyc29yRGF0YVNpemUoY29ubiwgJmRhdGFzaXplKSAhPSBrQ0dFcnJvclN1Y2Nlc3MpIHsKLQkJbWFjb3N4X2xvZygiQ0dTR2V0R2xvYmFsQ3Vyc29yRGF0YVNpemUgZXJyb3JcbiIpOwotCQlyZXR1cm4gd2hpY2g7Ci0JfQotCi0JZGF0YSA9ICh1bnNpZ25lZCBjaGFyKikgbWFsbG9jKGRhdGFzaXplKTsKLQotCWVyciA9IENHU0dldEdsb2JhbEN1cnNvckRhdGEoY29ubiwgZGF0YSwgJmRhdGFzaXplLCAmcm93X2J5dGVzLAotCSAgICAmcmVjdCwgJmhvdCwgJmNkZXB0aCwgJmNvbXBzLCAmYnBjb21wKTsKLSNpZiAwCi0JZnByaW50ZihzdGRlcnIsICJkYXRhc2l6ZTogJWQgcm93X2J5dGVzOiAlZCBjZGVwdGg6ICVkIGNvbXBzOiAlZCBicGNvbXA6ICVkIHc6ICVkIGg6ICVkXG4iLAotCSAgZGF0YXNpemUsIHJvd19ieXRlcywgY2RlcHRoLCBjb21wcywgYnBjb21wLCAoaW50KSByZWN0LnNpemUud2lkdGgsIChpbnQpIHJlY3Quc2l6ZS5oZWlnaHQpOwotI2VuZGlmCi0JaWYgKGVyciAhPSBrQ0dFcnJvclN1Y2Nlc3MpIHsKLQkJbWFjb3N4X2xvZygiQ0dTR2V0R2xvYmFsQ3Vyc29yRGF0YSBlcnJvclxuIik7Ci0JCXJldHVybiB3aGljaDsKLQl9Ci0KLQlpZiAoY2RlcHRoID09IDI0KSB7Ci0JCWNkZXB0aCA9IDMyOwotCX0KLQotCWlmIChzaXplb2YobG9uZykgPT0gOCAmJiBjb21wcyAqIGJwY29tcCA8PSAzMikgewotCQkvKiBwYWQgaXQgb3V0IHRvIHVuc2lnbmVkIGxvbmcgYXJyYXkgc2l6ZSAobGlrZSB4Zml4ZXMpICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBjaGFyICpkc2F2ZTsKLQkJdW5zaWduZWQgY2hhciAqZGF0YTY0ID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoMiAqZGF0YXNpemUpOwotCQl1bnNpZ25lZCBpbnQgICp1SSA9ICh1bnNpZ25lZCBpbnQgICopIGRhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgKnVMID0gKHVuc2lnbmVkIGxvbmcgKikgZGF0YTY0OwotCQlmb3IgKGk9MDsgaSA8IGRhdGFzaXplLzQ7IGkrKykgewotCQkJdUxbaV0gPSB1SVtpXTsKLQkJfQotCQlkc2F2ZSA9IGRhdGE7Ci0JCWRhdGEgPSBkYXRhNjQ7Ci0JCWZyZWUoZHNhdmUpOwotCX0KLQotCXdoaWNoID0gc3RvcmVfY3Vyc29yKGN1cnNvcl9zZWVkLCAodW5zaWduZWQgbG9uZyopIGRhdGEsCi0JICAgIChpbnQpIHJlY3Quc2l6ZS53aWR0aCwgKGludCkgcmVjdC5zaXplLmhlaWdodCwgY2RlcHRoLCAoaW50KSBob3QueCwgKGludCkgaG90LnkpOwotCi0JZnJlZShkYXRhKTsKLQlyZXR1cm4od2hpY2gpOwotfQotCi1leHRlcm4gaW50IG1hY29zeF9tb3VzZV93aGVlbF9zcGVlZDsKLWV4dGVybiBpbnQgbWFjb3N4X3N3YXAyMzsKLWV4dGVybiBpbnQgb2ZmX3gsIGNvZmZfeCwgb2ZmX3ksIGNvZmZfeTsKLQotZXh0ZXJuIGludCBkZWJ1Z19wb2ludGVyOwotCi1zdGF0aWMgdm9pZCBDR1Bvc3RTY3JvbGxXaGVlbEV2ZW50X3dyKENHV2hlZWxDb3VudCB3aGVlbF9jb3VudCwgaW50IHdoZWVsX2Rpc3RhbmNlKSB7Ci0Jc3RhdGljIGludCBwb3N0X21vZGUgPSAtMSwgbWNudCA9IDA7Ci0KLSNpZiAhWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFMgJiYgIVgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRAotCWlmIChwb3N0X21vZGUgPCAwKSB7Ci0JCXBvc3RfbW9kZSA9IDE7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTIikgfHwgZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQiKSkgewotCQkJcG9zdF9tb2RlID0gMDsKLQkJfQotCX0KLQkKLQlpZiAocG9zdF9tb2RlKSB7Ci0JCWlmIChtY250KysgPCAxMCB8fCBkZWJ1Z19wb2ludGVyKSBmcHJpbnRmKHN0ZGVyciwgIkNHUG9zdFNjcm9sbFdoZWVsRXZlbnQoKVxuIik7Ci0JCUNHUG9zdFNjcm9sbFdoZWVsRXZlbnQod2hlZWxfY291bnQsIHdoZWVsX2Rpc3RhbmNlKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJLyogWFhYIDEwLjUgYW5kIGxhdGVyICovCi0jaWZuZGVmIFgxMVZOQ19NQUNPU1hfTk9fQ0dFVkVOVENSRUFURVNDUk9MTFdIRUVMRVZFTlQKLQkJQ0dFdmVudFJlZiBldmVudDsKLQkJZXZlbnQgPSBDR0V2ZW50Q3JlYXRlU2Nyb2xsV2hlZWxFdmVudChOVUxMLCBrQ0dTY3JvbGxFdmVudFVuaXRMaW5lLCB3aGVlbF9jb3VudCwgd2hlZWxfZGlzdGFuY2UpOwotCQlpZiAoZXZlbnQgIT0gTlVMTCkgewotCQkJQ0dFdmVudFBvc3Qoa0NHSElERXZlbnRUYXAsIGV2ZW50KTsKLQkJCUNGUmVsZWFzZShldmVudCk7Ci0JCX0KLSNlbmRpZgotCQlpZiAobWNudCsrIDwgMTAgfHwgZGVidWdfcG9pbnRlcikgZnByaW50ZihzdGRlcnIsICJDR0V2ZW50Q3JlYXRlU2Nyb2xsV2hlZWxFdmVudCgpXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENHUG9zdE1vdXNlRXZlbnRfd3IoQ0dQb2ludCBsb2MsIGludCB1cGRhdGUsIGludCBjb3VudCwgaW50IGQxLCBpbnQgZDIsIGludCBkMywgaW50IHAxLCBpbnQgcDIsIGludCBwMykgewotCXN0YXRpYyBpbnQgcG9zdF9tb2RlID0gLTEsIG1jbnQgPSAwOwotCi0jaWYgIVgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTICYmICFYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQKLQlpZiAocG9zdF9tb2RlIDwgMCkgewotCQlwb3N0X21vZGUgPSAxOwotCQlpZiAoZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUyIpIHx8IGdldGVudigiWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEIikpIHsKLQkJCXBvc3RfbW9kZSA9IDA7Ci0JCX0KLQl9Ci0JCi0JaWYgKHBvc3RfbW9kZSkgewotCQlpZiAobWNudCsrIDwgMTAgfHwgZGVidWdfcG9pbnRlcikgZnByaW50ZihzdGRlcnIsICJDR1Bvc3RNb3VzZUV2ZW50KClcbiIpOwotCQlDR1Bvc3RNb3VzZUV2ZW50KGxvYywgdXBkYXRlLCBjb3VudCwgZDEsIGQyLCBkMyk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCS8qIFhYWCAxMC40IGFuZCBsYXRlciAqLwotI2lmbmRlZiBYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVNT1VTRUVWRU5UCi0JCUNHRXZlbnRSZWYgZXZlbnQ7Ci0JCXN0YXRpYyBpbnQgeHAgPSAtMSwgeXA7Ci0KLQkJaWYgKHhwID09IC0xKSB7Ci0JCQl4cCA9IGxvYy54OwotCQkJeXAgPSBsb2MueTsKLQkJfQotCQlpZiAoeHAgIT0gbG9jLnggfHwgeXAgIT0gbG9jLnkpIHsKLQkJCWludCBtb3ZlZCA9IDA7Ci0JCQlpZiAocDEgJiYgcDEgPT0gZDEpIHsKLQkJCQlldmVudCA9IENHRXZlbnRDcmVhdGVNb3VzZUV2ZW50KE5VTEwsIGtDR0V2ZW50TGVmdE1vdXNlRHJhZ2dlZCwgbG9jLCAwKTsKLQkJCQlpZiAoZXZlbnQgIT0gTlVMTCkgewotCQkJCQltb3ZlZCA9IDE7Ci0JCQkJCUNHRXZlbnRQb3N0KGtDR0hJREV2ZW50VGFwLCBldmVudCk7Ci0JCQkJCUNGUmVsZWFzZShldmVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHAzICYmIHAzID09IGQzKSB7Ci0JCQkJZXZlbnQgPSBDR0V2ZW50Q3JlYXRlTW91c2VFdmVudChOVUxMLCBrQ0dFdmVudE90aGVyTW91c2VEcmFnZ2VkLCBsb2MsIDApOwotCQkJCWlmIChldmVudCAhPSBOVUxMKSB7Ci0JCQkJCW1vdmVkID0gMTsKLQkJCQkJQ0dFdmVudFBvc3Qoa0NHSElERXZlbnRUYXAsIGV2ZW50KTsKLQkJCQkJQ0ZSZWxlYXNlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocDIgJiYgcDIgPT0gZDIpIHsKLQkJCQlldmVudCA9IENHRXZlbnRDcmVhdGVNb3VzZUV2ZW50KE5VTEwsIGtDR0V2ZW50UmlnaHRNb3VzZURyYWdnZWQsIGxvYywgMCk7Ci0JCQkJaWYgKGV2ZW50ICE9IE5VTEwpIHsKLQkJCQkJbW92ZWQgPSAxOwotCQkJCQlDR0V2ZW50UG9zdChrQ0dISURFdmVudFRhcCwgZXZlbnQpOwotCQkJCQlDRlJlbGVhc2UoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbW92ZWQpIHsKLQkJCQlldmVudCA9IENHRXZlbnRDcmVhdGVNb3VzZUV2ZW50KE5VTEwsIGtDR0V2ZW50TW91c2VNb3ZlZCwgbG9jLCAwKTsKLQkJCQlpZiAoZXZlbnQgIT0gTlVMTCkgewotCQkJCQlDR0V2ZW50UG9zdChrQ0dISURFdmVudFRhcCwgZXZlbnQpOwotCQkJCQlDRlJlbGVhc2UoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl4cCA9IGxvYy54OwotCQl5cCA9IGxvYy55OwotCQlpZiAocDEgIT0gZDEpIHsKLQkJCUNHRXZlbnRUeXBlIHR5cGUgPSAoIXAxICYmIGQxKSA/IGtDR0V2ZW50TGVmdE1vdXNlRG93biA6IGtDR0V2ZW50TGVmdE1vdXNlVXA7Ci0JCQlldmVudCA9IENHRXZlbnRDcmVhdGVNb3VzZUV2ZW50KE5VTEwsIHR5cGUsIGxvYywgMCk7Ci0JCQlpZiAoZXZlbnQgIT0gTlVMTCkgewotCQkJCUNHRXZlbnRQb3N0KGtDR0hJREV2ZW50VGFwLCBldmVudCk7Ci0JCQkJQ0ZSZWxlYXNlKGV2ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAocDMgIT0gZDMpIHsKLQkJCUNHRXZlbnRUeXBlIHR5cGUgPSAoIXAzICYmIGQzKSA/IGtDR0V2ZW50T3RoZXJNb3VzZURvd24gOiBrQ0dFdmVudE90aGVyTW91c2VVcDsKLQkJCWV2ZW50ID0gQ0dFdmVudENyZWF0ZU1vdXNlRXZlbnQoTlVMTCwgdHlwZSwgbG9jLCBrQ0dNb3VzZUJ1dHRvbkNlbnRlcik7Ci0JCQlpZiAoZXZlbnQgIT0gTlVMTCkgewotCQkJCUNHRXZlbnRQb3N0KGtDR0hJREV2ZW50VGFwLCBldmVudCk7Ci0JCQkJQ0ZSZWxlYXNlKGV2ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAocDIgIT0gZDIpIHsKLQkJCUNHRXZlbnRUeXBlIHR5cGUgPSAoIXAyICYmIGQyKSA/IGtDR0V2ZW50UmlnaHRNb3VzZURvd24gOiBrQ0dFdmVudFJpZ2h0TW91c2VVcDsKLQkJCWV2ZW50ID0gQ0dFdmVudENyZWF0ZU1vdXNlRXZlbnQoTlVMTCwgdHlwZSwgbG9jLCAwKTsKLQkJCWlmIChldmVudCAhPSBOVUxMKSB7Ci0JCQkJQ0dFdmVudFBvc3Qoa0NHSElERXZlbnRUYXAsIGV2ZW50KTsKLQkJCQlDRlJlbGVhc2UoZXZlbnQpOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJaWYgKG1jbnQrKyA8IDEwIHx8IGRlYnVnX3BvaW50ZXIpIGZwcmludGYoc3RkZXJyLCAiQ0dFdmVudENyZWF0ZU1vdXNlRXZlbnQoKVxuIik7Ci0JfQotfQotCi12b2lkIG1hY29zeENHX3BvaW50ZXJfaW5qZWN0KGludCBtYXNrLCBpbnQgeCwgaW50IHkpIHsKLQlpbnQgc3dhcDIzID0gbWFjb3N4X3N3YXAyMzsKLQlpbnQgczEgPSAwLCBzMiA9IDEsIHMzID0gMiwgczQgPSAzLCBzNSA9IDQ7Ci0JQ0dQb2ludCBsb2M7Ci0JaW50IHdoZWVsX2Rpc3RhbmNlID0gbWFjb3N4X21vdXNlX3doZWVsX3NwZWVkOwotCXN0YXRpYyBpbnQgY250ID0gMDsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMSwgcHJldjEgPSAwLCBwcmV2MiA9IDAsIHByZXYzID0gMDsgCi0JaW50IGN1cnIxLCBjdXJyMiwgY3VycjM7Ci0KLQlpZiAoc3dhcDIzKSB7Ci0JCXMyID0gMjsKLQkJczMgPSAxOwotCX0KLQotCWxvYy54ID0geCArIG9mZl94ICsgY29mZl94OwotCWxvYy55ID0geSArIG9mZl95ICsgY29mZl95OwotCi0JaWYgKChjbnQrKyAlIDEwKSA9PSAwKSB7Ci0JCW1hY29zeENHUF91bmRpbSgpOwotCX0KLQotCWlmICgobWFzayAmICgxIDw8IHM0KSkpIHsKLQkJQ0dQb3N0U2Nyb2xsV2hlZWxFdmVudF93cigxLCAgd2hlZWxfZGlzdGFuY2UpOwotCX0KLQlpZiAoKG1hc2sgJiAoMSA8PCBzNSkpKSB7Ci0JCUNHUG9zdFNjcm9sbFdoZWVsRXZlbnRfd3IoMSwgLXdoZWVsX2Rpc3RhbmNlKTsKLQl9Ci0KLQljdXJyMSA9IChtYXNrICYgKDEgPDwgczEpKSA/IFRSVUUgOiBGQUxTRTsKLQljdXJyMiA9IChtYXNrICYgKDEgPDwgczIpKSA/IFRSVUUgOiBGQUxTRTsKLQljdXJyMyA9IChtYXNrICYgKDEgPDwgczMpKSA/IFRSVUUgOiBGQUxTRTsKLQotCWlmIChmaXJzdCkgewotCQlwcmV2MSA9IGN1cnIxOwotCQlwcmV2MiA9IGN1cnIyOwotCQlwcmV2MyA9IGN1cnIzOwotCQlmaXJzdCA9IDA7Ci0JfQotCi0JQ0dQb3N0TW91c2VFdmVudF93cihsb2MsIFRSVUUsIDMsIGN1cnIxLCBjdXJyMiwgY3VycjMsIHByZXYxLCBwcmV2MiwgcHJldjMpOwotCi0JcHJldjEgPSBjdXJyMTsKLQlwcmV2MiA9IGN1cnIyOwotCXByZXYzID0gY3VycjM7Ci19Ci0KLSNkZWZpbmUga2V5VGFibGVTaXplIDB4RkZGRgotCi0jaW5jbHVkZSA8cmZiL2tleXN5bS5oPgotCi1zdGF0aWMgaW50IFVTS2V5Q29kZXNbXSA9IHsKLSAgICAvKiBUaGUgYWxwaGFiZXQgKi8KLSAgICBYS19BLCAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogQSAqLwotICAgIFhLX0IsICAgICAgICAgICAgICAgICAxMSwgICAgICAvKiBCICovCi0gICAgWEtfQywgICAgICAgICAgICAgICAgICA4LCAgICAgIC8qIEMgKi8KLSAgICBYS19ELCAgICAgICAgICAgICAgICAgIDIsICAgICAgLyogRCAqLwotICAgIFhLX0UsICAgICAgICAgICAgICAgICAxNCwgICAgICAvKiBFICovCi0gICAgWEtfRiwgICAgICAgICAgICAgICAgICAzLCAgICAgIC8qIEYgKi8KLSAgICBYS19HLCAgICAgICAgICAgICAgICAgIDUsICAgICAgLyogRyAqLwotICAgIFhLX0gsICAgICAgICAgICAgICAgICAgNCwgICAgICAvKiBIICovCi0gICAgWEtfSSwgICAgICAgICAgICAgICAgIDM0LCAgICAgIC8qIEkgKi8KLSAgICBYS19KLCAgICAgICAgICAgICAgICAgMzgsICAgICAgLyogSiAqLwotICAgIFhLX0ssICAgICAgICAgICAgICAgICA0MCwgICAgICAvKiBLICovCi0gICAgWEtfTCwgICAgICAgICAgICAgICAgIDM3LCAgICAgIC8qIEwgKi8KLSAgICBYS19NLCAgICAgICAgICAgICAgICAgNDYsICAgICAgLyogTSAqLwotICAgIFhLX04sICAgICAgICAgICAgICAgICA0NSwgICAgICAvKiBOICovCi0gICAgWEtfTywgICAgICAgICAgICAgICAgIDMxLCAgICAgIC8qIE8gKi8KLSAgICBYS19QLCAgICAgICAgICAgICAgICAgMzUsICAgICAgLyogUCAqLwotICAgIFhLX1EsICAgICAgICAgICAgICAgICAxMiwgICAgICAvKiBRICovCi0gICAgWEtfUiwgICAgICAgICAgICAgICAgIDE1LCAgICAgIC8qIFIgKi8KLSAgICBYS19TLCAgICAgICAgICAgICAgICAgIDEsICAgICAgLyogUyAqLwotICAgIFhLX1QsICAgICAgICAgICAgICAgICAxNywgICAgICAvKiBUICovCi0gICAgWEtfVSwgICAgICAgICAgICAgICAgIDMyLCAgICAgIC8qIFUgKi8KLSAgICBYS19WLCAgICAgICAgICAgICAgICAgIDksICAgICAgLyogViAqLwotICAgIFhLX1csICAgICAgICAgICAgICAgICAxMywgICAgICAvKiBXICovCi0gICAgWEtfWCwgICAgICAgICAgICAgICAgICA3LCAgICAgIC8qIFggKi8KLSAgICBYS19ZLCAgICAgICAgICAgICAgICAgMTYsICAgICAgLyogWSAqLwotICAgIFhLX1osICAgICAgICAgICAgICAgICAgNiwgICAgICAvKiBaICovCi0gICAgWEtfYSwgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIGEgKi8KLSAgICBYS19iLCAgICAgICAgICAgICAgICAgMTEsICAgICAgLyogYiAqLwotICAgIFhLX2MsICAgICAgICAgICAgICAgICAgOCwgICAgICAvKiBjICovCi0gICAgWEtfZCwgICAgICAgICAgICAgICAgICAyLCAgICAgIC8qIGQgKi8KLSAgICBYS19lLCAgICAgICAgICAgICAgICAgMTQsICAgICAgLyogZSAqLwotICAgIFhLX2YsICAgICAgICAgICAgICAgICAgMywgICAgICAvKiBmICovCi0gICAgWEtfZywgICAgICAgICAgICAgICAgICA1LCAgICAgIC8qIGcgKi8KLSAgICBYS19oLCAgICAgICAgICAgICAgICAgIDQsICAgICAgLyogaCAqLwotICAgIFhLX2ksICAgICAgICAgICAgICAgICAzNCwgICAgICAvKiBpICovCi0gICAgWEtfaiwgICAgICAgICAgICAgICAgIDM4LCAgICAgIC8qIGogKi8KLSAgICBYS19rLCAgICAgICAgICAgICAgICAgNDAsICAgICAgLyogayAqLwotICAgIFhLX2wsICAgICAgICAgICAgICAgICAzNywgICAgICAvKiBsICovCi0gICAgWEtfbSwgICAgICAgICAgICAgICAgIDQ2LCAgICAgIC8qIG0gKi8KLSAgICBYS19uLCAgICAgICAgICAgICAgICAgNDUsICAgICAgLyogbiAqLwotICAgIFhLX28sICAgICAgICAgICAgICAgICAzMSwgICAgICAvKiBvICovCi0gICAgWEtfcCwgICAgICAgICAgICAgICAgIDM1LCAgICAgIC8qIHAgKi8KLSAgICBYS19xLCAgICAgICAgICAgICAgICAgMTIsICAgICAgLyogcSAqLwotICAgIFhLX3IsICAgICAgICAgICAgICAgICAxNSwgICAgICAvKiByICovCi0gICAgWEtfcywgICAgICAgICAgICAgICAgICAxLCAgICAgIC8qIHMgKi8KLSAgICBYS190LCAgICAgICAgICAgICAgICAgMTcsICAgICAgLyogdCAqLwotICAgIFhLX3UsICAgICAgICAgICAgICAgICAzMiwgICAgICAvKiB1ICovCi0gICAgWEtfdiwgICAgICAgICAgICAgICAgICA5LCAgICAgIC8qIHYgKi8KLSAgICBYS193LCAgICAgICAgICAgICAgICAgMTMsICAgICAgLyogdyAqLwotICAgIFhLX3gsICAgICAgICAgICAgICAgICAgNywgICAgICAvKiB4ICovCi0gICAgWEtfeSwgICAgICAgICAgICAgICAgIDE2LCAgICAgIC8qIHkgKi8KLSAgICBYS196LCAgICAgICAgICAgICAgICAgIDYsICAgICAgLyogeiAqLwotCi0gICAgLyogTnVtYmVycyAqLwotICAgIFhLXzAsICAgICAgICAgICAgICAgICAyOSwgICAgICAvKiAwICovCi0gICAgWEtfMSwgICAgICAgICAgICAgICAgIDE4LCAgICAgIC8qIDEgKi8KLSAgICBYS18yLCAgICAgICAgICAgICAgICAgMTksICAgICAgLyogMiAqLwotICAgIFhLXzMsICAgICAgICAgICAgICAgICAyMCwgICAgICAvKiAzICovCi0gICAgWEtfNCwgICAgICAgICAgICAgICAgIDIxLCAgICAgIC8qIDQgKi8KLSAgICBYS181LCAgICAgICAgICAgICAgICAgMjMsICAgICAgLyogNSAqLwotICAgIFhLXzYsICAgICAgICAgICAgICAgICAyMiwgICAgICAvKiA2ICovCi0gICAgWEtfNywgICAgICAgICAgICAgICAgIDI2LCAgICAgIC8qIDcgKi8KLSAgICBYS184LCAgICAgICAgICAgICAgICAgMjgsICAgICAgLyogOCAqLwotICAgIFhLXzksICAgICAgICAgICAgICAgICAyNSwgICAgICAvKiA5ICovCi0KLSAgICAvKiBTeW1ib2xzICovCi0gICAgWEtfZXhjbGFtLCAgICAgICAgICAgIDE4LCAgICAgIC8qICEgKi8KLSAgICBYS19hdCwgICAgICAgICAgICAgICAgMTksICAgICAgLyogQCAqLwotICAgIFhLX251bWJlcnNpZ24sICAgICAgICAyMCwgICAgICAvKiAjICovCi0gICAgWEtfZG9sbGFyLCAgICAgICAgICAgIDIxLCAgICAgIC8qICQgKi8KLSAgICBYS19wZXJjZW50LCAgICAgICAgICAgMjMsICAgICAgLyogJSAqLwotICAgIFhLX2FzY2lpY2lyY3VtLCAgICAgICAyMiwgICAgICAvKiBeICovCi0gICAgWEtfYW1wZXJzYW5kLCAgICAgICAgIDI2LCAgICAgIC8qICYgKi8KLSAgICBYS19hc3RlcmlzaywgICAgICAgICAgMjgsICAgICAgLyogKiAqLwotICAgIFhLX3BhcmVubGVmdCwgICAgICAgICAyNSwgICAgICAvKiAoICovCi0gICAgWEtfcGFyZW5yaWdodCwgICAgICAgIDI5LCAgICAgIC8qICkgKi8KLSAgICBYS19taW51cywgICAgICAgICAgICAgMjcsICAgICAgLyogLSAqLwotICAgIFhLX3VuZGVyc2NvcmUsICAgICAgICAyNywgICAgICAvKiBfICovCi0gICAgWEtfZXF1YWwsICAgICAgICAgICAgIDI0LCAgICAgIC8qID0gKi8KLSAgICBYS19wbHVzLCAgICAgICAgICAgICAgMjQsICAgICAgLyogKyAqLwotICAgIFhLX2dyYXZlLCAgICAgICAgICAgICA1MCwgICAgICAvKiBgICovICAvKiBYWFggPyAqLwotICAgIFhLX2FzY2lpdGlsZGUsICAgICAgICA1MCwgICAgICAvKiB+ICovCi0gICAgWEtfYnJhY2tldGxlZnQsICAgICAgIDMzLCAgICAgIC8qIFsgKi8KLSAgICBYS19icmFjZWxlZnQsICAgICAgICAgMzMsICAgICAgLyogeyAqLwotICAgIFhLX2JyYWNrZXRyaWdodCwgICAgICAzMCwgICAgICAvKiBdICovCi0gICAgWEtfYnJhY2VyaWdodCwgICAgICAgIDMwLCAgICAgIC8qIH0gKi8KLSAgICBYS19zZW1pY29sb24sICAgICAgICAgNDEsICAgICAgLyogOyAqLwotICAgIFhLX2NvbG9uLCAgICAgICAgICAgICA0MSwgICAgICAvKiA6ICovCi0gICAgWEtfYXBvc3Ryb3BoZSwgICAgICAgIDM5LCAgICAgIC8qICcgKi8KLSAgICBYS19xdW90ZWRibCwgICAgICAgICAgMzksICAgICAgLyogIiAqLwotICAgIFhLX2NvbW1hLCAgICAgICAgICAgICA0MywgICAgICAvKiAsICovCi0gICAgWEtfbGVzcywgICAgICAgICAgICAgIDQzLCAgICAgIC8qIDwgKi8KLSAgICBYS19wZXJpb2QsICAgICAgICAgICAgNDcsICAgICAgLyogLiAqLwotICAgIFhLX2dyZWF0ZXIsICAgICAgICAgICA0NywgICAgICAvKiA+ICovCi0gICAgWEtfc2xhc2gsICAgICAgICAgICAgIDQ0LCAgICAgIC8qIC8gKi8KLSAgICBYS19xdWVzdGlvbiwgICAgICAgICAgNDQsICAgICAgLyogPyAqLwotICAgIFhLX2JhY2tzbGFzaCwgICAgICAgICA0MiwgICAgICAvKiBcICovCi0gICAgWEtfYmFyLCAgICAgICAgICAgICAgIDQyLCAgICAgIC8qIHwgKi8KLSAgICAvKiBPUyBYIFNlbmRzIHRoaXMgKEVORCBPRiBNRURJVU0pIGZvciBTaGlmdC1UYWIgKHdpdGggVVMgS2V5Ym9hcmQpICovCi0gICAgMHgwMDE5LCAgICAgICAgICAgICAgIDQ4LCAgICAgIC8qIFRhYiAqLwotICAgIFhLX3NwYWNlLCAgICAgICAgICAgICA0OSwgICAgICAvKiBTcGFjZSAqLwotfTsKLQotc3RhdGljIGludCBTcGVjaWFsS2V5Q29kZXNbXSA9IHsKLSAgICAvKiAiU3BlY2lhbCIga2V5cyAqLwotICAgIFhLX1JldHVybiwgICAgICAgICAgICAzNiwgICAgICAvKiBSZXR1cm4gKi8KLSAgICBYS19EZWxldGUsICAgICAgICAgICAxMTcsICAgICAgLyogRGVsZXRlICovCi0gICAgWEtfVGFiLCAgICAgICAgICAgICAgIDQ4LCAgICAgIC8qIFRhYiAqLwotICAgIFhLX0VzY2FwZSwgICAgICAgICAgICA1MywgICAgICAvKiBFc2MgKi8KLSAgICBYS19DYXBzX0xvY2ssICAgICAgICAgNTcsICAgICAgLyogQ2FwcyBMb2NrICovCi0gICAgWEtfTnVtX0xvY2ssICAgICAgICAgIDcxLCAgICAgIC8qIE51bSBMb2NrICovCi0gICAgWEtfU2Nyb2xsX0xvY2ssICAgICAgMTA3LCAgICAgIC8qIFNjcm9sbCBMb2NrICovCi0gICAgWEtfUGF1c2UsICAgICAgICAgICAgMTEzLCAgICAgIC8qIFBhdXNlICovCi0gICAgWEtfQmFja1NwYWNlLCAgICAgICAgIDUxLCAgICAgIC8qIEJhY2tzcGFjZSAqLwotICAgIFhLX0luc2VydCwgICAgICAgICAgIDExNCwgICAgICAvKiBJbnNlcnQgKi8KLQotICAgIC8qIEN1cnNvciBtb3ZlbWVudCAqLwotICAgIFhLX1VwLCAgICAgICAgICAgICAgIDEyNiwgICAgICAvKiBDdXJzb3IgVXAgKi8KLSAgICBYS19Eb3duLCAgICAgICAgICAgICAxMjUsICAgICAgLyogQ3Vyc29yIERvd24gKi8KLSAgICBYS19MZWZ0LCAgICAgICAgICAgICAxMjMsICAgICAgLyogQ3Vyc29yIExlZnQgKi8KLSAgICBYS19SaWdodCwgICAgICAgICAgICAxMjQsICAgICAgLyogQ3Vyc29yIFJpZ2h0ICovCi0gICAgWEtfUGFnZV9VcCwgICAgICAgICAgMTE2LCAgICAgIC8qIFBhZ2UgVXAgKi8KLSAgICBYS19QYWdlX0Rvd24sICAgICAgICAxMjEsICAgICAgLyogUGFnZSBEb3duICovCi0gICAgWEtfSG9tZSwgICAgICAgICAgICAgMTE1LCAgICAgIC8qIEhvbWUgKi8KLSAgICBYS19FbmQsICAgICAgICAgICAgICAxMTksICAgICAgLyogRW5kICovCi0KLSAgICAvKiBOdW1lcmljIGtleXBhZCAqLwotICAgIFhLX0tQXzAsICAgICAgICAgICAgICA4MiwgICAgICAvKiBLUCAwICovCi0gICAgWEtfS1BfMSwgICAgICAgICAgICAgIDgzLCAgICAgIC8qIEtQIDEgKi8KLSAgICBYS19LUF8yLCAgICAgICAgICAgICAgODQsICAgICAgLyogS1AgMiAqLwotICAgIFhLX0tQXzMsICAgICAgICAgICAgICA4NSwgICAgICAvKiBLUCAzICovCi0gICAgWEtfS1BfNCwgICAgICAgICAgICAgIDg2LCAgICAgIC8qIEtQIDQgKi8KLSAgICBYS19LUF81LCAgICAgICAgICAgICAgODcsICAgICAgLyogS1AgNSAqLwotICAgIFhLX0tQXzYsICAgICAgICAgICAgICA4OCwgICAgICAvKiBLUCA2ICovCi0gICAgWEtfS1BfNywgICAgICAgICAgICAgIDg5LCAgICAgIC8qIEtQIDcgKi8KLSAgICBYS19LUF84LCAgICAgICAgICAgICAgOTEsICAgICAgLyogS1AgOCAqLwotICAgIFhLX0tQXzksICAgICAgICAgICAgICA5MiwgICAgICAvKiBLUCA5ICovCi0gICAgWEtfS1BfRW50ZXIsICAgICAgICAgIDc2LCAgICAgIC8qIEtQIEVudGVyICovCi0gICAgWEtfS1BfRGVjaW1hbCwgICAgICAgIDY1LCAgICAgIC8qIEtQIC4gKi8KLSAgICBYS19LUF9BZGQsICAgICAgICAgICAgNjksICAgICAgLyogS1AgKyAqLwotICAgIFhLX0tQX1N1YnRyYWN0LCAgICAgICA3OCwgICAgICAvKiBLUCAtICovCi0gICAgWEtfS1BfTXVsdGlwbHksICAgICAgIDY3LCAgICAgIC8qIEtQICogKi8KLSAgICBYS19LUF9EaXZpZGUsICAgICAgICAgNzUsICAgICAgLyogS1AgLyAqLwotCi0gICAgLyogRnVuY3Rpb24ga2V5cyAqLwotICAgIFhLX0YxLCAgICAgICAgICAgICAgIDEyMiwgICAgICAvKiBGMSAqLwotICAgIFhLX0YyLCAgICAgICAgICAgICAgIDEyMCwgICAgICAvKiBGMiAqLwotICAgIFhLX0YzLCAgICAgICAgICAgICAgICA5OSwgICAgICAvKiBGMyAqLwotICAgIFhLX0Y0LCAgICAgICAgICAgICAgIDExOCwgICAgICAvKiBGNCAqLwotICAgIFhLX0Y1LCAgICAgICAgICAgICAgICA5NiwgICAgICAvKiBGNSAqLwotICAgIFhLX0Y2LCAgICAgICAgICAgICAgICA5NywgICAgICAvKiBGNiAqLwotICAgIFhLX0Y3LCAgICAgICAgICAgICAgICA5OCwgICAgICAvKiBGNyAqLwotICAgIFhLX0Y4LCAgICAgICAgICAgICAgIDEwMCwgICAgICAvKiBGOCAqLwotICAgIFhLX0Y5LCAgICAgICAgICAgICAgIDEwMSwgICAgICAvKiBGOSAqLwotICAgIFhLX0YxMCwgICAgICAgICAgICAgIDEwOSwgICAgICAvKiBGMTAgKi8KLSAgICBYS19GMTEsICAgICAgICAgICAgICAxMDMsICAgICAgLyogRjExICovCi0gICAgWEtfRjEyLCAgICAgICAgICAgICAgMTExLCAgICAgIC8qIEYxMiAqLwotCi0gICAgLyogTW9kaWZpZXIga2V5cyAqLwotICAgIFhLX0FsdF9MLCAgICAgICAgICAgICA1NSwgICAgICAvKiBBbHQgTGVmdCAoLT4gQ29tbWFuZCkgKi8KLSAgICBYS19BbHRfUiwgICAgICAgICAgICAgNTUsICAgICAgLyogQWx0IFJpZ2h0ICgtPiBDb21tYW5kKSAqLwotICAgIFhLX1NoaWZ0X0wsICAgICAgICAgICA1NiwgICAgICAvKiBTaGlmdCBMZWZ0ICovCi0gICAgWEtfU2hpZnRfUiwgICAgICAgICAgIDU2LCAgICAgIC8qIFNoaWZ0IFJpZ2h0ICovCi0gICAgWEtfTWV0YV9MLCAgICAgICAgICAgIDU4LCAgICAgIC8qIE9wdGlvbiBMZWZ0ICgtPiBPcHRpb24pICovCi0gICAgWEtfTWV0YV9SLCAgICAgICAgICAgIDU4LCAgICAgIC8qIE9wdGlvbiBSaWdodCAoLT4gT3B0aW9uKSAqLwotICAgIFhLX1N1cGVyX0wsICAgICAgICAgICA1OCwgICAgICAvKiBPcHRpb24gTGVmdCAoLT4gT3B0aW9uKSAqLwotICAgIFhLX1N1cGVyX1IsICAgICAgICAgICA1OCwgICAgICAvKiBPcHRpb24gUmlnaHQgKC0+IE9wdGlvbikgKi8KLSAgICBYS19Db250cm9sX0wsICAgICAgICAgNTksICAgICAgLyogQ3RybCBMZWZ0ICovCi0gICAgWEtfQ29udHJvbF9SLCAgICAgICAgIDU5LCAgICAgIC8qIEN0cmwgUmlnaHQgKi8KLX07Ci0KLUNHS2V5Q29kZSBrZXlUYWJsZVtrZXlUYWJsZVNpemVdOwotdW5zaWduZWQgY2hhciBrZXlUYWJsZU1vZHNba2V5VGFibGVTaXplXTsKLQotdm9pZCBtYWNvc3hDR19pbml0X2tleV90YWJsZSh2b2lkKSB7Ci0Jc3RhdGljIGludCBpbml0ID0gMDsKLQlpbnQgaTsKLQlpZiAoaW5pdCkgewotCQlyZXR1cm47Ci0JfQotCWluaXQgPSAxOwotCi0JZm9yIChpPTA7IGkgPCBrZXlUYWJsZVNpemU7IGkrKykgewotCQlrZXlUYWJsZVtpXSA9IDB4RkZGRjsKLQkJa2V5VGFibGVNb2RzW2ldID0gMDsKLQl9Ci0JZm9yIChpPTA7IGk8IChpbnQpIChzaXplb2YoVVNLZXlDb2RlcykgLyBzaXplb2YoaW50KSk7IGkgKz0gMikgewotCQlpbnQgaiA9IFVTS2V5Q29kZXNbaV07Ci0JCWtleVRhYmxlWyh1bnNpZ25lZCBzaG9ydCkgal0gPSAoQ0dLZXlDb2RlKSBVU0tleUNvZGVzW2krMV07Ci0JfQotCWZvciAoaT0wOyBpPCAoaW50KSAoc2l6ZW9mKFNwZWNpYWxLZXlDb2RlcykgLyBzaXplb2YoaW50KSk7IGkgKz0gMikgewotCQlpbnQgaiA9IFNwZWNpYWxLZXlDb2Rlc1tpXTsKLQkJa2V5VGFibGVbKHVuc2lnbmVkIHNob3J0KSBqXSA9IChDR0tleUNvZGUpIFNwZWNpYWxLZXlDb2Rlc1tpKzFdOwotCX0KLX0KLQotZXh0ZXJuIHZvaWQgaW5pdF9rZXlfdGFibGUodm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeF91c19rYmQ7Ci0KLWV4dGVybiBpbnQgZGVidWdfa2V5Ym9hcmQ7Ci0KLXZvaWQgQ0dQb3N0S2V5Ym9hcmRFdmVudF93cihDR0NoYXJDb2RlIGtleUNoYXIsIENHS2V5Q29kZSBrZXlDb2RlLCBpbnQgZG93bikgewotCXN0YXRpYyBpbnQgcG9zdF9tb2RlID0gLTEsIG1jbnQgPSAwOwotCi0jaWYgIVgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTICYmICFYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQKLQlpZiAocG9zdF9tb2RlIDwgMCkgewotCQlwb3N0X21vZGUgPSAxOwotCQlpZiAoZ2V0ZW52KCJYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUyIpIHx8IGdldGVudigiWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEIikpIHsKLQkJCXBvc3RfbW9kZSA9IDA7Ci0JCX0KLQl9Ci0JCi0JaWYgKHBvc3RfbW9kZSkgewotCQlpZiAobWNudCsrIDwgMTAgfHwgZGVidWdfa2V5Ym9hcmQpIGZwcmludGYoc3RkZXJyLCAiQ0dQb3N0S2V5Ym9hcmRFdmVudChrZXlDaGFyPSVkLCBrZXlDb2RlPSVkLCBkb3duPSVkKVxuIiwga2V5Q2hhciwga2V5Q29kZSwgZG93bik7Ci0JCUNHUG9zdEtleWJvYXJkRXZlbnQoa2V5Q2hhciwga2V5Q29kZSwgZG93bik7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCS8qIFhYWCAxMC40IGFuZCBsYXRlciAqLwotI2lmbmRlZiBYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVLRVlCT0FSREVWRU5UCi0JCUNHRXZlbnRSZWYgZXZlbnQ7Ci0JCWV2ZW50ID0gQ0dFdmVudENyZWF0ZUtleWJvYXJkRXZlbnQoTlVMTCwga2V5Q29kZSwgZG93bik7Ci0JCWlmIChldmVudCAhPSBOVUxMKSB7Ci0JCQlDR0V2ZW50UG9zdChrQ0dISURFdmVudFRhcCwgZXZlbnQpOwotCQkJQ0ZSZWxlYXNlKGV2ZW50KTsKLQkJfQotI2VuZGlmCi0JCWlmIChtY250KysgPCAxMCB8fCBkZWJ1Z19rZXlib2FyZCkgZnByaW50ZihzdGRlcnIsICJDR0V2ZW50Q3JlYXRlS2V5Ym9hcmRFdmVudChOVUxMLCBrZXlDb2RlPSVkLCBkb3duPSVkKVxuIiwga2V5Q29kZSwgZG93bik7Ci0JfQotfQotCi12b2lkIG1hY29zeENHX2tleWNvZGVfaW5qZWN0KGludCBkb3duLCBpbnQga2V5Y29kZSkgewotCUNHS2V5Q29kZSBrZXlDb2RlID0gKENHS2V5Q29kZSkga2V5Y29kZTsKLQlDR0NoYXJDb2RlIGtleUNoYXIgPSAwOwotCi0JaWYgKGRlYnVnX2tleWJvYXJkKSBmcHJpbnRmKHN0ZGVyciwgIm1hY29zeENHX2tleWNvZGVfaW5qZWN0KGRvd249JWQsIGtleWNvZGU9JWQpXG4iLCBkb3duLCBrZXljb2RlKTsKLQotCUNHUG9zdEtleWJvYXJkRXZlbnRfd3Ioa2V5Q2hhciwga2V5Q29kZSwgZG93bik7Ci19Ci0KLXZvaWQgbWFjb3N4Q0dfa2V5c3ltX2luamVjdChpbnQgZG93biwgdW5zaWduZWQgaW50IGtleXN5bSkgewotCUNHS2V5Q29kZSBrZXlDb2RlID0ga2V5VGFibGVbKHVuc2lnbmVkIHNob3J0KWtleXN5bV07Ci0JQ0dDaGFyQ29kZSBrZXlDaGFyID0gMDsKLSNpZiAwCi0JaW50IHByZXNzTW9kc0ZvcktleXMgPSBGQUxTRTsKLQlVSW50MzIgbW9kc0ZvcktleSA9IGtleVRhYmxlTW9kc1trZXlzeW1dIDw8IDg7Ci0jZW5kaWYKLQotCWluaXRfa2V5X3RhYmxlKCk7Ci0KLQlpZiAoZGVidWdfa2V5Ym9hcmQpIGZwcmludGYoc3RkZXJyLCAibWFjb3N4Q0dfa2V5c3ltX2luamVjdChkb3duPSVkLCBrZXlzeW09JWQpXG4iLCBkb3duLCAoaW50KSBrZXlzeW0pOwotCi0JaWYgKGtleXN5bSA8IDB4RkYgJiYgbWFjb3N4X3VzX2tiZCkgewotCQlrZXlDaGFyID0gKENHQ2hhckNvZGUpIGtleXN5bTsKLQkJaWYgKGRlYnVnX2tleWJvYXJkKSBmcHJpbnRmKHN0ZGVyciwgIm1hY29zeENHX2tleXN5bV9pbmplY3Qga2V5Q2hhcj0+JWRcbiIsIChpbnQpIGtleUNoYXIpOwotCX0KLQlpZiAoa2V5Q29kZSA9PSAweEZGRkYpIHsKLQkJcmV0dXJuOwotCX0KLQltYWNvc3hDR1BfdW5kaW0oKTsKLQotCUNHUG9zdEtleWJvYXJkRXZlbnRfd3Ioa2V5Q2hhciwga2V5Q29kZSwgZG93bik7Ci19Ci0KLSNlbmRpZgkvKiBfX0FQUExFX18gKi8KLQotCmRpZmYgLS1naXQgYS94MTF2bmMvbWFjb3N4Q0cuaCBiL3gxMXZuYy9tYWNvc3hDRy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjllNDk3Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9tYWNvc3hDRy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfTUFDT1NYQ0dfSAotI2RlZmluZSBfWDExVk5DX01BQ09TWENHX0gKLQotLyogLS0gbWFjb3N4Q0cuaCAtLSAqLwotCi1leHRlcm4gdm9pZCBtYWNvc3hDR19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4Q0dfZmluaSh2b2lkKTsKLWV4dGVybiB2b2lkIG1hY29zeENHX2V2ZW50X2xvb3Aodm9pZCk7Ci1leHRlcm4gY2hhciAqbWFjb3N4Q0dfZ2V0X2ZiX2FkZHIodm9pZCk7Ci0KLWV4dGVybiBpbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzV2lkZSh2b2lkKTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5UGl4ZWxzSGlnaCh2b2lkKTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dfQ0dEaXNwbGF5Qml0c1BlclBpeGVsKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hDR19DR0Rpc3BsYXlCaXRzUGVyU2FtcGxlKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hDR19DR0Rpc3BsYXlTYW1wbGVzUGVyUGl4ZWwodm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHX0NHRGlzcGxheUJ5dGVzUGVyUm93KHZvaWQpOwotCi1leHRlcm4gdm9pZCBtYWNvc3hDR19wb2ludGVyX2luamVjdChpbnQgbWFzaywgaW50IHgsIGludCB5KTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dfZ2V0X2N1cnNvcl9wb3MoaW50ICp4LCBpbnQgKnkpOwotZXh0ZXJuIGludCBtYWNvc3hDR19nZXRfY3Vyc29yKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4Q0dfaW5pdF9rZXlfdGFibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hDR19rZXlzeW1faW5qZWN0KGludCBkb3duLCB1bnNpZ25lZCBpbnQga2V5c3ltKTsKLWV4dGVybiB2b2lkIG1hY29zeENHX2tleWNvZGVfaW5qZWN0KGludCBkb3duLCBpbnQga2V5Y29kZSk7Ci0KLWV4dGVybiB2b2lkIG1hY29zeENHX3JlZnJlc2hfY2FsbGJhY2tfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4Q0dfcmVmcmVzaF9jYWxsYmFja19vbih2b2lkKTsKLQotCi0KLSNlbmRpZiAvKiBfWDExVk5DX01BQ09TWENHX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9tYWNvc3hDR1AuYyBiL3gxMXZuYy9tYWNvc3hDR1AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwMDQyYy4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWFjb3N4Q0dQLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBtYWNvc3hDR1AuYyAtLSAqLwotCi12b2lkIG1hY29zeENHUF91bnVzZWQodm9pZCkge30KLQotI2lmIChkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykpCi0KLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNpbmNsdWRlIDxDb2NvYS9Db2NvYS5oPgotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLQotaW50IG1hY29zeENHUF9zYXZlX2RpbSh2b2lkKTsKLWludCBtYWNvc3hDR1BfcmVzdG9yZV9kaW0odm9pZCk7Ci1pbnQgbWFjb3N4Q0dQX3NhdmVfc2xlZXAodm9pZCk7Ci1pbnQgbWFjb3N4Q0dQX3Jlc3RvcmVfc2xlZXAodm9pZCk7Ci1pbnQgbWFjb3N4Q0dQX2luaXRfZGltbWluZyh2b2lkKTsKLWludCBtYWNvc3hDR1BfdW5kaW0odm9pZCk7Ci1pbnQgbWFjb3N4Q0dQX2RpbV9zaHV0ZG93bih2b2lkKTsKLXZvaWQgbWFjb3N4Q0dQX3NjcmVlbnNhdmVyX3RpbWVyX29mZih2b2lkKTsKLXZvaWQgbWFjb3N4Q0dQX3NjcmVlbnNhdmVyX3RpbWVyX29uKHZvaWQpOwotCi0jaW5jbHVkZSA8SU9LaXQvcHdyX21ndC9JT1BNTGliLmg+Ci0jaW5jbHVkZSA8SU9LaXQvcHdyX21ndC9JT1BNLmg+Ci0KLWV4dGVybiBDR0RpcmVjdERpc3BsYXlJRCBkaXNwbGF5SUQ7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRpbV90aW1lOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2xlZXBfdGltZTsKLXN0YXRpYyBpbnQgZGltX3RpbWVfc2F2ZWQgPSAwOwotc3RhdGljIGludCBzbGVlcF90aW1lX3NhdmVkID0gMDsKLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotc3RhdGljIG1hY2hfcG9ydF90IG1hc3Rlcl9kZXZfcG9ydDsKLXN0YXRpYyBpb19jb25uZWN0X3QgcG93ZXJfbWd0OwotCi1leHRlcm4gaW50IGNsaWVudF9jb3VudDsKLWV4dGVybiBpbnQgbWFjb3N4X25vZGltbWluZzsKLWV4dGVybiBpbnQgbWFjb3N4X25vc2xlZXA7Ci1leHRlcm4gaW50IG1hY29zeF9ub3NjcmVlbnNhdmVyOwotCi1zdGF0aWMgRXZlbnRMb29wVGltZXJVUFAgIHNzdGltZXJVUFA7Ci1zdGF0aWMgRXZlbnRMb29wVGltZXJSZWYgIHNzdGltZXI7Ci0KLXZvaWQgbWFjb3N4Q0dfc2NyZWVuc2F2ZXJfdGltZXIoRXZlbnRMb29wVGltZXJSZWYgdGltZXIsIHZvaWQgKmRhdGEpIHsKLQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJtYWNvc3hDR19zY3JlZW5zYXZlcl90aW1lcjogJWRcbiIsIChpbnQpIHRpbWUoMCkpOwotCWlmICghdGltZXIgfHwgIWRhdGEpIHt9Ci0JaWYgKG1hY29zeF9ub3NsZWVwICYmIGNsaWVudF9jb3VudCkgewotCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJVcGRhdGVTeXN0ZW1BY3Rpdml0eTogJWRcbiIsIChpbnQpIHRpbWUoMCkpOwotCQlVcGRhdGVTeXN0ZW1BY3Rpdml0eShJZGxlQWN0aXZpdHkpOwotCX0KLX0KLQotdm9pZCBtYWNvc3hDR1Bfc2NyZWVuc2F2ZXJfdGltZXJfb2ZmKHZvaWQpIHsKLQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJtYWNvc3hDR1Bfc2NyZWVuc2F2ZXJfdGltZXJfb2ZmOiAlZFxuIiwgKGludCkgdGltZSgwKSk7Ci0JUmVtb3ZlRXZlbnRMb29wVGltZXIoc3N0aW1lcik7Ci0JRGlzcG9zZUV2ZW50TG9vcFRpbWVyVVBQKHNzdGltZXJVUFApOwotfQotCi12b2lkIG1hY29zeENHUF9zY3JlZW5zYXZlcl90aW1lcl9vbih2b2lkKSB7Ci0JaWYgKDApIGZwcmludGYoc3RkZXJyLCAibWFjb3N4Q0dQX3NjcmVlbnNhdmVyX3RpbWVyX29uOiAlZFxuIiwgKGludCkgdGltZSgwKSk7Ci0Jc3N0aW1lclVQUCA9IE5ld0V2ZW50TG9vcFRpbWVyVVBQKG1hY29zeENHX3NjcmVlbnNhdmVyX3RpbWVyKTsKLQlJbnN0YWxsRXZlbnRMb29wVGltZXIoR2V0TWFpbkV2ZW50TG9vcCgpLCBrRXZlbnREdXJhdGlvblNlY29uZCAqIDMwLAotCSAgICBrRXZlbnREdXJhdGlvblNlY29uZCAqIDMwLCBzc3RpbWVyVVBQLCBOVUxMLCAmc3N0aW1lcik7Ci19Ci0KLWludCBtYWNvc3hDR1Bfc2F2ZV9kaW0odm9pZCkgewotCWlmIChJT1BNR2V0QWdncmVzc2l2ZW5lc3MocG93ZXJfbWd0LCBrUE1NaW51dGVzVG9EaW0sCi0JICAgICZkaW1fdGltZSkgIT0ga0lPUmV0dXJuU3VjY2VzcykgewotCQlyZXR1cm4gMDsKLQl9Ci0JZGltX3RpbWVfc2F2ZWQgPSAxOwotCXJldHVybiAxOwotfQotCi1pbnQgbWFjb3N4Q0dQX3Jlc3RvcmVfZGltKHZvaWQpIHsKLQlpZiAoISBkaW1fdGltZV9zYXZlZCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKElPUE1TZXRBZ2dyZXNzaXZlbmVzcyhwb3dlcl9tZ3QsIGtQTU1pbnV0ZXNUb0RpbSwKLQkgICAgZGltX3RpbWUpICE9IGtJT1JldHVyblN1Y2Nlc3MpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWRpbV90aW1lX3NhdmVkID0gMDsKLQlkaW1fdGltZSA9IDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBtYWNvc3hDR1Bfc2F2ZV9zbGVlcCh2b2lkKSB7Ci0JaWYgKElPUE1HZXRBZ2dyZXNzaXZlbmVzcyhwb3dlcl9tZ3QsIGtQTU1pbnV0ZXNUb1NsZWVwLAotCSAgICAmc2xlZXBfdGltZSkgIT0ga0lPUmV0dXJuU3VjY2VzcykgewotCQlyZXR1cm4gMDsKLQl9Ci0Jc2xlZXBfdGltZV9zYXZlZCA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBtYWNvc3hDR1BfcmVzdG9yZV9zbGVlcCh2b2lkKSB7Ci0JaWYgKCEgc2xlZXBfdGltZV9zYXZlZCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKElPUE1TZXRBZ2dyZXNzaXZlbmVzcyhwb3dlcl9tZ3QsIGtQTU1pbnV0ZXNUb1NsZWVwLAotCSAgICBkaW1fdGltZSkgIT0ga0lPUmV0dXJuU3VjY2VzcykgewotCQlyZXR1cm4gMDsKLQl9Ci0Jc2xlZXBfdGltZV9zYXZlZCA9IDA7Ci0Jc2xlZXBfdGltZSA9IDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBtYWNvc3hDR1BfaW5pdF9kaW1taW5nKHZvaWQpIHsKLQlpZiAoSU9NYXN0ZXJQb3J0KGJvb3RzdHJhcF9wb3J0LCAmbWFzdGVyX2Rldl9wb3J0KSAhPSAKLQkgICAga0lPUmV0dXJuU3VjY2VzcykgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEocG93ZXJfbWd0ID0gSU9QTUZpbmRQb3dlck1hbmFnZW1lbnQobWFzdGVyX2Rldl9wb3J0KSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChtYWNvc3hfbm9kaW1taW5nKSB7Ci0JCWlmICghIG1hY29zeENHUF9zYXZlX2RpbSgpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoSU9QTVNldEFnZ3Jlc3NpdmVuZXNzKHBvd2VyX21ndCwga1BNTWludXRlc1RvRGltLCAwKQotCQkgICAgIT0ga0lPUmV0dXJuU3VjY2VzcykgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKG1hY29zeF9ub3NsZWVwKSB7Ci0JCWlmICghIG1hY29zeENHUF9zYXZlX3NsZWVwKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChJT1BNU2V0QWdncmVzc2l2ZW5lc3MocG93ZXJfbWd0LCBrUE1NaW51dGVzVG9TbGVlcCwgMCkKLQkJICAgICE9IGtJT1JldHVyblN1Y2Nlc3MpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAxOwotfQotCi1pbnQgbWFjb3N4Q0dQX3VuZGltKHZvaWQpIHsKLQlpZiAoISBpbml0aWFsaXplZCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgbWFjb3N4X25vZGltbWluZykgewotCQlpZiAoISBtYWNvc3hDR1Bfc2F2ZV9kaW0oKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKElPUE1TZXRBZ2dyZXNzaXZlbmVzcyhwb3dlcl9tZ3QsIGtQTU1pbnV0ZXNUb0RpbSwgMCkKLQkJICAgICE9IGtJT1JldHVyblN1Y2Nlc3MpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghIG1hY29zeENHUF9yZXN0b3JlX2RpbSgpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoISBtYWNvc3hfbm9zbGVlcCkgewotCQlpZiAoISBtYWNvc3hDR1Bfc2F2ZV9zbGVlcCgpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoSU9QTVNldEFnZ3Jlc3NpdmVuZXNzKHBvd2VyX21ndCwga1BNTWludXRlc1RvU2xlZXAsIDApCi0JCSAgICAhPSBrSU9SZXR1cm5TdWNjZXNzKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoISBtYWNvc3hDR1BfcmVzdG9yZV9zbGVlcCgpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotaW50IG1hY29zeENHUF9kaW1fc2h1dGRvd24odm9pZCkgewotCWlmICghIGluaXRpYWxpemVkKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZGltX3RpbWVfc2F2ZWQpIHsKLQkJaWYgKCEgbWFjb3N4Q0dQX3Jlc3RvcmVfZGltKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChzbGVlcF90aW1lX3NhdmVkKSB7Ci0JCWlmICghIG1hY29zeENHUF9yZXN0b3JlX3NsZWVwKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi0jZW5kaWYJLyogX19BUFBMRV9fICovCi0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL21hY29zeENHUC5oIGIveDExdm5jL21hY29zeENHUC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzAyNmIwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9tYWNvc3hDR1AuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX01BQ09TWENHUF9ICi0jZGVmaW5lIF9YMTFWTkNfTUFDT1NYQ0dQX0gKLQotLyogLS0gbWFjb3N4Q0dQLmggLS0gKi8KLQotZXh0ZXJuIGludCBtYWNvc3hDR1Bfc2F2ZV9kaW0odm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHUF9yZXN0b3JlX2RpbSh2b2lkKTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dQX3NhdmVfc2xlZXAodm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHUF9yZXN0b3JlX3NsZWVwKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hDR1BfaW5pdF9kaW1taW5nKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hDR1BfdW5kaW0odm9pZCk7Ci1leHRlcm4gaW50IG1hY29zeENHUF9kaW1fc2h1dGRvd24odm9pZCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hDR1Bfc2NyZWVuc2F2ZXJfdGltZXJfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4Q0dQX3NjcmVlbnNhdmVyX3RpbWVyX29uKHZvaWQpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX01BQ09TWENHUF9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvbWFjb3N4Q0dTLmMgYi94MTF2bmMvbWFjb3N4Q0dTLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODAxMzAuLjAwMDAwMDAKLS0tIGEveDExdm5jL21hY29zeENHUy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gbWFjb3N4Q0dTLmMgLS0gKi8KLQotLyoKLSAqIFdlIG5lZWQgdG8ga2VlcCB0aGlzIHNlcGFyYXRlIGZyb20gbmVhcmx5IGV2ZXJ5dGhpbmcgZWxzZSwgZS5nLiByZmIuaAotICogYW5kIHRoZSBvdGhlciBzdHVmZiwgb3RoZXJ3aXNlIGl0IGRvZXMgbm90IHdvcmsgcHJvcGVybHksIG1vdXNlIGRyYWdzCi0gKiB3aWxsIG5vdCB3b3JrISEKLSAqLwotdm9pZCBtYWNvc3hDR1NfdW51c2VkKHZvaWQpIHt9Ci0KLSNpZiAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotCi0jaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci0jaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+Ci0KLWV4dGVybiBDR0RpcmVjdERpc3BsYXlJRCBkaXNwbGF5SUQ7Ci0KLXZvaWQgbWFjb3N4Q0dTX2dldF9hbGxfd2luZG93cyh2b2lkKTsKLWludCBtYWNvc3hDR1NfZ2V0X3Fsb29rKGludCk7Ci12b2lkIG1hY29zeEdDU19zZXRfcGFzdGVib2FyZChjaGFyICpzdHIsIGludCBsZW4pOwotCi10eXBlZGVmIENHRXJyb3IgICAgICAgQ0dTRXJyb3I7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgQ0dTV2luZG93Q291bnQ7Ci10eXBlZGVmIHZvaWQgKiAgICAgICAgQ0dTQ29ubmVjdGlvbklEOwotdHlwZWRlZiBpbnQgICAgICAgICAgIENHU1dpbmRvd0lEOwotdHlwZWRlZiBDR1NXaW5kb3dJRCogIENHU1dpbmRvd0lETGlzdDsKLXR5cGVkZWYgQ0dXaW5kb3dMZXZlbCBDR1NXaW5kb3dMZXZlbDsKLXR5cGVkZWYgTlNSZWN0ICAgICAgICBDR1NSZWN0OwotCi1leHRlcm4gQ0dTQ29ubmVjdGlvbklEIF9DR1NEZWZhdWx0Q29ubmVjdGlvbiAoKTsKLQotZXh0ZXJuIENHU0Vycm9yIENHU0dldE9uU2NyZWVuV2luZG93TGlzdCAoQ0dTQ29ubmVjdGlvbklEIGNpZCwKLSAgICBDR1NDb25uZWN0aW9uSUQgb3duZXIsIENHU1dpbmRvd0NvdW50IGxpc3RDYXBhY2l0eSwKLSAgICBDR1NXaW5kb3dJRExpc3QgbGlzdCwgQ0dTV2luZG93Q291bnQgKmxpc3RDb3VudCk7Ci0KLWV4dGVybiBDR1NFcnJvciBDR1NHZXRXaW5kb3dMaXN0IChDR1NDb25uZWN0aW9uSUQgY2lkLAotICAgIENHU0Nvbm5lY3Rpb25JRCBvd25lciwgQ0dTV2luZG93Q291bnQgbGlzdENhcGFjaXR5LAotICAgIENHU1dpbmRvd0lETGlzdCBsaXN0LCBDR1NXaW5kb3dDb3VudCAqbGlzdENvdW50KTsKLQotZXh0ZXJuIENHU0Vycm9yIENHU0dldFNjcmVlblJlY3RGb3JXaW5kb3cgKENHU0Nvbm5lY3Rpb25JRCBjaWQsCi0gICAgQ0dTV2luZG93SUQgd2lkLCBDR1NSZWN0ICpyZWN0KTsKLQotZXh0ZXJuIENHV2luZG93TGV2ZWwgQ0dTR2V0V2luZG93TGV2ZWwgKENHU0Nvbm5lY3Rpb25JRCBjaWQsCi0gICAgQ0dTV2luZG93SUQgd2lkLCBDR1NXaW5kb3dMZXZlbCAqbGV2ZWwpOwotCi10eXBlZGVmIGVudW0gX0NHU1dpbmRvd09yZGVyaW5nTW9kZSB7Ci0gICAga0NHU09yZGVyQWJvdmUgICAgICAgICAgICAgICAgPSAgMSwgLyogV2luZG93IGlzIG9yZGVyZWQgYWJvdmUgdGFyZ2V0LiAqLwotICAgIGtDR1NPcmRlckJlbG93ICAgICAgICAgICAgICAgID0gLTEsIC8qIFdpbmRvdyBpcyBvcmRlcmVkIGJlbG93IHRhcmdldC4gKi8KLSAgICBrQ0dTT3JkZXJPdXQgICAgICAgICAgICAgICAgICA9ICAwICAvKiBXaW5kb3cgaXMgcmVtb3ZlZCBmcm9tIHRoZSBvbi1zY3JlZW4gd2luZG93IGxpc3QuICovCi19IENHU1dpbmRvd09yZGVyaW5nTW9kZTsKLQotZXh0ZXJuIE9TU3RhdHVzIENHU09yZGVyV2luZG93KGNvbnN0IENHU0Nvbm5lY3Rpb25JRCBjaWQsCi0gICAgY29uc3QgQ0dTV2luZG93SUQgd2lkLCBDR1NXaW5kb3dPcmRlcmluZ01vZGUgcGxhY2UsIENHU1dpbmRvd0lEIHJlbGF0aXZlVG9XaW5kb3dJRCk7Ci0KLXN0YXRpYyBDR1NDb25uZWN0aW9uSUQgY2lkID0gTlVMTDsKLQotZXh0ZXJuIHZvaWQgbWFjb3N4X2xvZyhjaGFyICopOwotCi1pbnQgbWFjd2lubWF4ID0gMDsgCi10eXBlZGVmIHN0cnVjdCB3aW5kYXQgewotCWludCB3aW47Ci0JaW50IHgsIHk7Ci0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JaW50IGxldmVsOwotCWludCBtYXBwZWQ7Ci0JaW50IGNsaXBwZWQ7Ci0JaW50IG5jYWNoZV9vbmx5OwotfSB3aW5kYXRfdDsKLQotZXh0ZXJuIGludCBuY2FjaGU7Ci0KLSNkZWZpbmUgTUFYV0lOREFUIDQwOTYKLXdpbmRhdF90IG1hY3dpbnNbTUFYV0lOREFUXTsgCi1zdGF0aWMgQ0dTV2luZG93SUQgX3dpbnNfYWxsW01BWFdJTkRBVF07IAotc3RhdGljIENHU1dpbmRvd0lEIF93aW5zX21hcHBlZFtNQVhXSU5EQVRdOyAKLXN0YXRpYyBDR1NXaW5kb3dDb3VudCBfd2luc19hbGxfY250LCBfd2luc19tYXBwZWRfY250OyAKLXN0YXRpYyBpbnQgX3dpbnNfaW50W01BWFdJTkRBVF07IAotCi0jZGVmaW5lIFdJTkhJU1ROVU0gMzI3NjgKLSNkZWZpbmUgV0lOSElTVE1BWCA0Ci1jaGFyIHdoaXN0W1dJTkhJU1RNQVhdW1dJTkhJU1ROVU1dOwotaW50IHdoaXN0X2lkeCA9IC0xOwotaW50IHFsb29rW1dJTkhJU1ROVU1dOwotCi1jaGFyIGlzX2V4aXN0ICAgICA9IDB4MTsKLWNoYXIgaXNfbWFwcGVkICAgID0gMHgyOwotY2hhciBpc19jbGlwcGVkICAgPSAweDQ7Ci1jaGFyIGlzX29mZnNjcmVlbiA9IDB4ODsKLQotZXh0ZXJuIGRvdWJsZSBkbm93KHZvaWQpOwotZXh0ZXJuIGRvdWJsZSBkbm93eCh2b2lkKTsKLQotZXh0ZXJuIGludCBkcHlfeCwgZHB5X3k7Ci1leHRlcm4gaW50IG1hY29zeF9pY29uX2FuaW1fdGltZTsKLQotZXh0ZXJuIHZvaWQgbWFjb3N4X2FkZF9tYXBub3RpZnkoaW50LCBpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfYWRkX2NyZWF0ZShpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hfYWRkX2Rlc3Ryb3koaW50LCBpbnQpOwotZXh0ZXJuIHZvaWQgbWFjb3N4X2FkZF92aXNub3RpZnkoaW50LCBpbnQsIGludCk7Ci0KLWludCBDR1NfbGV2ZWxtYXg7Ci1pbnQgQ0dTX2xldmVsc1sxNl07Ci0KLWludCBtYWNvc3hDR1NfZ2V0X3Fsb29rKGludCB3KSB7Ci0JaWYgKHcgPj0gV0lOSElTVE5VTSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBxbG9va1t3XTsKLX0KLQotaW50IG1hY29zeENHU19maW5kX2luZGV4KGludCB3KSB7Ci0Jc3RhdGljIGludCBsYXN0X2luZGV4ID0gLTE7Ci0JaW50IGlkeDsKLQotCWlmIChsYXN0X2luZGV4ID49IDApIHsKLQkJaWYgKG1hY3dpbnNbbGFzdF9pbmRleF0ud2luID09IHcpIHsKLQkJCXJldHVybiBsYXN0X2luZGV4OwotCQl9Ci0JfQotCi0JaWR4ID0gbWFjb3N4Q0dTX2dldF9xbG9vayh3KTsKLQlpZiAoaWR4ID49IDApIHsKLQkJaWYgKG1hY3dpbnNbaWR4XS53aW4gPT0gdykgewotCQkJbGFzdF9pbmRleCA9IGlkeDsKLQkJCXJldHVybiBpZHg7Ci0JCX0KLQl9Ci0KLQlmb3IgKGlkeD0wOyBpZHggPCBtYWN3aW5tYXg7IGlkeCsrKSB7Ci0JCWlmIChtYWN3aW5zW2lkeF0ud2luID09IHcpIHsKLQkJCWxhc3RfaW5kZXggPSBpZHg7Ci0JCQlyZXR1cm4gaWR4OwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotI2lmIDAKLWV4dGVybiB2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nIHVzZWMpOwotI2Vsc2UKLWV4dGVybiBpbnQgdXNsZWVwKHVzZWNvbmRzX3QgdXNlYyk7Ci0jZW5kaWYKLQotaW50IG1hY29zeENHU19mb2xsb3dfYW5pbWF0aW9uX3dpbihpbnQgd2luLCBpbnQgaWR4LCBpbnQgZ3JvdykgewotCWRvdWJsZSB0ID0gZG5vdygpOwotCWludCBkaWZmcyA9IDA7Ci0JaW50IHgsIHksIHcsIGg7Ci0JaW50IHhwID0gLTEsIHlwID0gLTEsIHdwID0gLTEsIGhwID0gLTE7Ci0JQ0dTUmVjdCByZWN0OwotCUNHU0Vycm9yIGVycjsgCi0KLQlpbnQgcmVwcyA9IDA7Ci0KLQlpZiAoY2lkID09IE5VTEwpIHsKLQkJY2lkID0gX0NHU0RlZmF1bHRDb25uZWN0aW9uKCk7Ci0JCWlmIChjaWQgPT0gTlVMTCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoaWR4IDwgMCkgewotCQlpZHggPSBtYWNvc3hDR1NfZmluZF9pbmRleCh3aW4pOyAKLQl9Ci0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKGRub3coKSA8IHQgKyAwLjAwMSAqIG1hY29zeF9pY29uX2FuaW1fdGltZSkgIHsKLQkJZXJyID0gQ0dTR2V0U2NyZWVuUmVjdEZvcldpbmRvdyhjaWQsIHdpbiwgJnJlY3QpOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXggPSAoaW50KSByZWN0Lm9yaWdpbi54OwotCQl5ID0gKGludCkgcmVjdC5vcmlnaW4ueTsKLQkJdyA9IChpbnQpIHJlY3Quc2l6ZS53aWR0aDsKLQkJaCA9IChpbnQpIHJlY3Quc2l6ZS5oZWlnaHQ7Ci0KLQkJaWYgKGdyb3cpIHsKLQkJCW1hY3dpbnNbaWR4XS54ICAgICAgPSB4OwotCQkJbWFjd2luc1tpZHhdLnkgICAgICA9IHk7Ci0JCQltYWN3aW5zW2lkeF0ud2lkdGggID0gdzsKLQkJCW1hY3dpbnNbaWR4XS5oZWlnaHQgPSBoOwotCQl9Ci0JCi0JCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiBjaGFzZTogJTAzZHglMDNkKyUwM2QrJTAzZCAgJWRcbiIsIHcsIGgsIHgsIHksIHdpbik7Ci0JCWlmICh4ID09IHhwICYmIHkgPT0geXAgJiYgdyA9PSB3cCAmJiBoID09IGhwKSAgewotCQkJcmVwcysrOwotCQkJaWYgKHJlcHMgPj0gMikgewotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGlmZnMrKzsKLQkJCXJlcHMgPSAwOwotCQl9Ci0JCXhwID0geDsKLQkJeXAgPSB5OwotCQl3cCA9IHc7Ci0JCWhwID0gaDsKLQkJdXNsZWVwKDUwICogMTAwMCk7Ci0JfQotCWlmIChkaWZmcyA+PSAyKSB7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotZXh0ZXJuIGludCBtYWNvc3hfY2hlY2tfY2xpcHBlZChpbnQgd2luLCBpbnQgKmxpc3QsIGludCBuKTsKLWV4dGVybiBpbnQgbWFjb3N4X2NoZWNrX29mZnNjcmVlbihpbnQgd2luKTsKLQotc3RhdGljIGludCBjaGVja19jbGlwcGVkKGludCB3aW4pIHsKLQlpbnQgaSwgbiA9IDAsIHdpbjI7Ci0JZm9yIChpID0gMDsgaSA8IChpbnQpIF93aW5zX21hcHBlZF9jbnQ7IGkrKykgewotCQl3aW4yID0gKGludCkgX3dpbnNfbWFwcGVkW2ldOwotCQlpZiAod2luMiA9PSB3aW4pIHsKLQkJCWJyZWFrOwotCQl9Ci0JCV93aW5zX2ludFtuKytdID0gd2luMjsKLQl9Ci0JcmV0dXJuIG1hY29zeF9jaGVja19jbGlwcGVkKHdpbiwgX3dpbnNfaW50LCBuKTsKLX0KLQotc3RhdGljIGludCBjaGVja19vZmZzY3JlZW4oaW50IHdpbikgewotCXJldHVybiBtYWNvc3hfY2hlY2tfb2Zmc2NyZWVuKHdpbik7Ci19Ci0KLWV4dGVybiBpbnQgbWFjb3N4X25jYWNoZV9tYWNtZW51OwotCi0KLXZvaWQgbWFjb3N4Q0dTX2dldF9hbGxfd2luZG93cyh2b2lkKSB7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0ID0gMC4wOwotCXN0YXRpYyBpbnQgdG90Y250ID0gMDsKLQlkb3VibGUgZHQgPSAwLjAsIG5vdyA9IGRub3coKTsKLQlpbnQgaSwgZGIgPSAwLCB3aGlzdF9wcnYgPSAwLCBtYXh3aW4gPSAwLCB3aGlzdF9za2lwID0gMDsKLQlDR1NXaW5kb3dDb3VudCBjYXAgPSAoQ0dTV2luZG93Q291bnQpIE1BWFdJTkRBVDsKLQlDR1NFcnJvciBlcnI7IAotCi0JQ0dTX2xldmVsbWF4ID0gMDsKLQlDR1NfbGV2ZWxzW0NHU19sZXZlbG1heCsrXSA9IChpbnQpIGtDR0RyYWdnaW5nV2luZG93TGV2ZWw7CS8qIDUwMCA/ICovCi0JaWYgKDApIENHU19sZXZlbHNbQ0dTX2xldmVsbWF4KytdID0gKGludCkga0NHSGVscFdpbmRvd0xldmVsOwkJLyogMTAyID8gKi8KLQlpZiAobWFjb3N4X25jYWNoZV9tYWNtZW51KSBDR1NfbGV2ZWxzW0NHU19sZXZlbG1heCsrXSA9IChpbnQpIGtDR1BvcFVwTWVudVdpbmRvd0xldmVsOwkvKiAxMDEgcHVsbGRvd24gbWVudSAqLwotCUNHU19sZXZlbHNbQ0dTX2xldmVsbWF4KytdID0gKGludCkga0NHTWFpbk1lbnVXaW5kb3dMZXZlbEtleTsJLyogIDI0ID8gKi8KLQlDR1NfbGV2ZWxzW0NHU19sZXZlbG1heCsrXSA9IChpbnQpIGtDR01vZGFsUGFuZWxXaW5kb3dMZXZlbDsJLyogICA4IG9wZW4gZGlhbG9nIGJveCAqLwotCUNHU19sZXZlbHNbQ0dTX2xldmVsbWF4KytdID0gKGludCkga0NHRmxvYXRpbmdXaW5kb3dMZXZlbDsJLyogICAzID8gKi8KLQlDR1NfbGV2ZWxzW0NHU19sZXZlbG1heCsrXSA9IChpbnQpIGtDR05vcm1hbFdpbmRvd0xldmVsOwkvKiAgIDAgcmVndWxhciB3aW5kb3cgKi8KLQotCWlmIChjaWQgPT0gTlVMTCkgewotCQljaWQgPSBfQ0dTRGVmYXVsdENvbm5lY3Rpb24oKTsKLQkJaWYgKGNpZCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoZHQgPiAwLjAgJiYgbm93IDwgbGFzdCArIGR0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlsYXN0ID0gbm93OwotCi0JbWFjd2lubWF4ID0gMDsgCi0KLQl0b3RjbnQrKzsKLQotCWlmIChuY2FjaGUgPiAwKSB7Ci0JCXdoaXN0X3BydiA9IHdoaXN0X2lkeCsrOwotCQlpZiAod2hpc3RfcHJ2IDwgMCkgewotCQkJd2hpc3Rfc2tpcCA9IDE7Ci0JCQl3aGlzdF9wcnYgPSAwOwotCQl9Ci0JCXdoaXN0X2lkeCA9IHdoaXN0X2lkeCAlIFdJTkhJU1RNQVg7Ci0JCWZvciAoaT0wOyBpIDwgV0lOSElTVE5VTTsgaSsrKSB7Ci0JCQl3aGlzdFt3aGlzdF9pZHhdW2ldID0gMDsKLQkJCXFsb29rW2ldID0gLTE7Ci0JCX0KLQl9Ci0KLQllcnIgPSBDR1NHZXRXaW5kb3dMaXN0KGNpZCwgTlVMTCwgY2FwLCBfd2luc19hbGwsICZfd2luc19hbGxfY250KTsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNudDogJWQgZXJyOiAlZFxuIiwgKGludCkgX3dpbnNfYWxsX2NudCwgZXJyKTsKLQotCWlmIChlcnIgIT0gMCkgewotCQlyZXR1cm47Ci0JfQotCQotCWZvciAoaT0wOyBpIDwgKGludCkgX3dpbnNfYWxsX2NudDsgaSsrKSB7Ci0JCUNHU1JlY3QgcmVjdDsKLQkJQ0dTV2luZG93TGV2ZWwgbGV2ZWw7Ci0JCWludCBqLCBrZWVwaXQgPSAwOwotCQllcnIgPSBDR1NHZXRTY3JlZW5SZWN0Rm9yV2luZG93KGNpZCwgX3dpbnNfYWxsW2ldLCAmcmVjdCk7Ci0JCWlmIChlcnIgIT0gMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHJlY3Qub3JpZ2luLnggPT0gMCAmJiByZWN0Lm9yaWdpbi55ID09IDApIHsKLQkJCWlmIChyZWN0LnNpemUud2lkdGggPT0gZHB5X3gpIHsKLQkJCQlpZiAocmVjdC5zaXplLmhlaWdodCA9PSBkcHlfeSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZXJyID0gQ0dTR2V0V2luZG93TGV2ZWwoY2lkLCBfd2luc19hbGxbaV0sICZsZXZlbCk7Ci0JCWlmIChlcnIgIT0gMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJZm9yIChqPTA7IGo8Q0dTX2xldmVsbWF4OyBqKyspIHsKLQkJCWlmICgoaW50KSBsZXZlbCA9PSBDR1NfbGV2ZWxzW2pdKSB7Ci0JCQkJa2VlcGl0ID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoISBrZWVwaXQpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbWFjd2luc1ttYWN3aW5tYXhdLmxldmVsICA9IChpbnQpIGxldmVsOwotCQltYWN3aW5zW21hY3dpbm1heF0ud2luICAgID0gKGludCkgX3dpbnNfYWxsW2ldOwotCQltYWN3aW5zW21hY3dpbm1heF0ueCAgICAgID0gKGludCkgcmVjdC5vcmlnaW4ueDsKLQkJbWFjd2luc1ttYWN3aW5tYXhdLnkgICAgICA9IChpbnQpIHJlY3Qub3JpZ2luLnk7Ci0JCW1hY3dpbnNbbWFjd2lubWF4XS53aWR0aCAgPSAoaW50KSByZWN0LnNpemUud2lkdGg7Ci0JCW1hY3dpbnNbbWFjd2lubWF4XS5oZWlnaHQgPSAoaW50KSByZWN0LnNpemUuaGVpZ2h0OwotCQltYWN3aW5zW21hY3dpbm1heF0ubWFwcGVkID0gMDsKLQkJbWFjd2luc1ttYWN3aW5tYXhdLmNsaXBwZWQgPSAwOwotCQltYWN3aW5zW21hY3dpbm1heF0ubmNhY2hlX29ubHkgPSAwOwotCQlpZiAobGV2ZWwgPT0ga0NHUG9wVXBNZW51V2luZG93TGV2ZWwpIHsKLQkJCW1hY3dpbnNbbWFjd2lubWF4XS5uY2FjaGVfb25seSA9IDE7Ci0JCX0KLQotaWYgKDAgfHwgZGIpIGZwcmludGYoc3RkZXJyLCAiaT0lMDNkIElEOiAlMDZkICB4OiAlMDNkICB5OiAlMDNkICB3OiAlMDNkIGg6ICUwM2QgbGV2ZWw6ICVkXG4iLCBpLCBfd2luc19hbGxbaV0sCi0gICAgKGludCkgcmVjdC5vcmlnaW4ueCwgKGludCkgcmVjdC5vcmlnaW4ueSwoaW50KSByZWN0LnNpemUud2lkdGgsIChpbnQpIHJlY3Quc2l6ZS5oZWlnaHQsIChpbnQpIGxldmVsKTsKLQotCQlpZiAobWFjd2luc1ttYWN3aW5tYXhdLndpbiA8IFdJTkhJU1ROVU0pIHsKLQkJCXFsb29rW21hY3dpbnNbbWFjd2lubWF4XS53aW5dID0gbWFjd2lubWF4OwotCQkJaWYgKG1hY3dpbnNbbWFjd2lubWF4XS53aW4gPiBtYXh3aW4pIHsKLQkJCQltYXh3aW4gPSBtYWN3aW5zW21hY3dpbm1heF0ud2luOwotCQkJfQotCQl9Ci0KLQkJbWFjd2lubWF4Kys7Ci0JfQotCi0JZXJyID0gQ0dTR2V0T25TY3JlZW5XaW5kb3dMaXN0KGNpZCwgTlVMTCwgY2FwLCBfd2luc19tYXBwZWQsICZfd2luc19tYXBwZWRfY250KTsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNudDogJWQgZXJyOiAlZFxuIiwgKGludCkgX3dpbnNfbWFwcGVkX2NudCwgZXJyKTsKLQotCWlmIChlcnIgIT0gMCkgewotCQlyZXR1cm47Ci0JfQotCQotCWZvciAoaT0wOyBpIDwgKGludCkgX3dpbnNfbWFwcGVkX2NudDsgaSsrKSB7Ci0JCWludCBqLCBpZHggPSAtMTsKLQkJaW50IHdpbiA9IChpbnQpIF93aW5zX21hcHBlZFtpXTsKLQotCQlpZiAoMCA8PSB3aW4gJiYgd2luIDwgV0lOSElTVE5VTSkgewotCQkJaiA9IHFsb29rW3dpbl07Ci0JCQlpZiAoaiA+PSAwICYmIG1hY3dpbnNbal0ud2luID09IHdpbikgewotCQkJCWlkeCA9IGo7IAotCQkJfQotCQl9Ci0JCWlmIChpZHggPCAwKSB7Ci0JCQlmb3IgKGo9MDsgaiA8IG1hY3dpbm1heDsgaisrKSB7Ci0JCQkJaWYgKG1hY3dpbnNbal0ud2luID09IHdpbikgewotCQkJCQlpZHggPSBqOyAKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpZHggPj0gMCkgewotCQkJbWFjd2luc1tpZHhdLm1hcHBlZCA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAobmNhY2hlID4gMCkgewotCQlpbnQgbnY9IDAsIE5CTUFYID0gNjQ7Ci0JCWludCBudl93aW5bNjRdOwotCQlpbnQgbnZfbHZsWzY0XTsKLQkJaW50IG52X3Zpc1s2NF07Ci0KLQkJZm9yIChpPTA7IGkgPCBtYWN3aW5tYXg7IGkrKykgewotCQkJaW50IHdpbiA9IG1hY3dpbnNbaV0ud2luOwotCQkJY2hhciBwcmV2LCBjdXJyOwotCi0JCQlpZiAod2luID49IFdJTkhJU1ROVU0pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJd2hpc3Rbd2hpc3RfaWR4XVt3aW5dIHw9IGlzX2V4aXN0OwotCQkJaWYgKG1hY3dpbnNbaV0ubWFwcGVkKSB7Ci0JCQkJd2hpc3Rbd2hpc3RfaWR4XVt3aW5dIHw9IGlzX21hcHBlZDsKLQkJCQlpZiAoY2hlY2tfY2xpcHBlZCh3aW4pKSB7Ci0JCQkJCXdoaXN0W3doaXN0X2lkeF1bd2luXSB8PSBpc19jbGlwcGVkOwotCQkJCQltYWN3aW5zW2ldLmNsaXBwZWQgPSAxOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tfb2Zmc2NyZWVuKHdpbikpIHsKLQkJCQkJd2hpc3Rbd2hpc3RfaWR4XVt3aW5dIHw9IGlzX29mZnNjcmVlbjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXdoaXN0W3doaXN0X2lkeF1bd2luXSB8PSBpc19vZmZzY3JlZW47Ci0JCQl9Ci0KLQkJCWN1cnIgPSB3aGlzdFt3aGlzdF9pZHhdW3dpbl07Ci0JCQlwcmV2ID0gd2hpc3Rbd2hpc3RfcHJ2XVt3aW5dOwotCi0JCQlpZiAod2hpc3Rfc2tpcCkgewotCQkJCTsKLQkJCX0gZWxzZSBpZiAoICEocHJldiAmIGlzX21hcHBlZCkgJiYgKGN1cnIgJiBpc19tYXBwZWQpKSB7Ci0JCQkJLyogTWFwTm90aWZ5ICovCi0JCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiTWFwTm90aWZ5OiAgICVkLyVkICAlZCAgICAgICAgICAgICAgICUuNGYgdG90PSVkXG4iLCBwcmV2LCBjdXJyLCB3aW4sIGRub3d4KCksIHRvdGNudCk7IAotCQkJCW1hY29zeF9hZGRfbWFwbm90aWZ5KHdpbiwgbWFjd2luc1tpXS5sZXZlbCwgMSk7Ci0JCQkJaWYgKDApIG1hY29zeENHU19mb2xsb3dfYW5pbWF0aW9uX3dpbih3aW4sIGksIDEpOwotCi0JCQl9IGVsc2UgaWYgKCAhKGN1cnIgJiBpc19tYXBwZWQpICYmIChwcmV2ICYgaXNfbWFwcGVkKSkgewotCQkJCS8qIFVubWFwTm90aWZ5ICovCi0JCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiVW5tYXBOb3RpZnk6ICVkLyVkICAlZCAgICAgICAgICAgICAgICUuNGYgQSB0b3Q9JWRcbiIsIHByZXYsIGN1cnIsIHdpbiwgZG5vd3goKSwgdG90Y250KTsgCi0JCQkJbWFjb3N4X2FkZF9tYXBub3RpZnkod2luLCBtYWN3aW5zW2ldLmxldmVsLCAwKTsKLQkJCX0gZWxzZSBpZiAoICEocHJldiAmIGlzX2V4aXN0KSAmJiAoY3VyciAmIGlzX2V4aXN0KSkgewotCQkJCS8qIENyZWF0ZU5vdGlmeSAqLwotCQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZU5vdGlmeTolZC8lZCAgJWQgICAgICAgICAgICAgICAlLjRmIHdoaXN0OiAlZC8lZCAweCV4IHRvdD0lZFxuIiwgcHJldiwgY3Vyciwgd2luLCBkbm93eCgpLCB3aGlzdF9wcnYsIHdoaXN0X2lkeCwgd2luLCB0b3RjbnQpOyAKLQkJCQltYWNvc3hfYWRkX2NyZWF0ZSh3aW4sIG1hY3dpbnNbaV0ubGV2ZWwpOwotCQkJCWlmIChjdXJyICYgaXNfbWFwcGVkKSB7Ci0JCQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIk1hcE5vdGlmeTogICAlZC8lZCAgJWQgICAgICAgICAgICAgICAlLjRmIHRvdD0lZFxuIiwgcHJldiwgY3Vyciwgd2luLCBkbm93eCgpLCB0b3RjbnQpOyAKLQkJCQkJbWFjb3N4X2FkZF9tYXBub3RpZnkod2luLCBtYWN3aW5zW2ldLmxldmVsLCAxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2hpc3Rfc2tpcCkgewotCQkJCTsKLQkJCX0gZWxzZSBpZiAobnYgPj0gTkJNQVgpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKCEoY3VyciAmIGlzX21hcHBlZCkpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKCEocHJldiAmIGlzX21hcHBlZCkpIHsKLQkJCQlpZiAoMSkgewotCQkJCQk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyICYgaXNfY2xpcHBlZCkgewotCQkJCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJWaXNpYk5vdGlmeTogJWQvJWQgICVkICAgICAgICAgICAgICAgT0JTIHRvdD0lZFxuIiwgcHJldiwgY3Vyciwgd2luLCB0b3RjbnQpOyAKLQkJCQkJbnZfd2luW252XSA9IHdpbjsKLQkJCQkJbnZfbHZsW252XSA9IG1hY3dpbnNbaV0ubGV2ZWw7Ci0JCQkJCW52X3Zpc1tudisrXSA9IDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiVmlzaWJOb3RpZnk6ICVkLyVkICAlZCAgICAgICAgICAgICAgIFVOT0JTIHRvdD0lZFxuIiwgcHJldiwgY3Vyciwgd2luLCB0b3RjbnQpOyAKLQkJCQkJbnZfd2luW252XSA9IHdpbjsKLQkJCQkJbnZfbHZsW252XSA9IG1hY3dpbnNbaV0ubGV2ZWw7Ci0JCQkJCW52X3Zpc1tudisrXSA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAgICAgICAgKCAhKHByZXYgJiBpc19jbGlwcGVkKSAmJiAgKGN1cnIgJiBpc19jbGlwcGVkKSApIHsKLQkJCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiVmlzaWJOb3RpZnk6ICVkLyVkICAlZCAgICAgICAgICAgICAgIE9CUyB0b3Q9JWRcbiIsIHByZXYsIGN1cnIsIHdpbiwgdG90Y250KTsgCi0JCQkJCW52X3dpbltudl0gPSB3aW47Ci0JCQkJCW52X2x2bFtudl0gPSBtYWN3aW5zW2ldLmxldmVsOwotCQkJCQludl92aXNbbnYrK10gPSAxOwotCQkJCX0gZWxzZSBpZiAoICAocHJldiAmIGlzX2NsaXBwZWQpICYmICEoY3VyciAmIGlzX2NsaXBwZWQpICkgewotCQkJCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJWaXNpYk5vdGlmeTogJWQvJWQgICVkICAgICAgICAgICAgICAgVU5PQlMgdG90PSVkXG4iLCBwcmV2LCBjdXJyLCB3aW4sIHRvdGNudCk7IAotCQkJCQludl93aW5bbnZdID0gd2luOwotCQkJCQludl9sdmxbbnZdID0gbWFjd2luc1tpXS5sZXZlbDsKLQkJCQkJbnZfdmlzW252KytdID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChpPTA7IGkgPCBtYXh3aW47IGkrKykgewotCQkJY2hhciBwcmV2LCBjdXJyOwotCQkJaW50IHdpbiA9IGk7Ci0JCQlpbnQgcSA9IHFsb29rW2ldOwotCQkJaW50IGx2bCA9IDA7Ci0KLQkJCWlmICh3aGlzdF9za2lwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChxID49IDApIHsKLQkJCQlsdmwgPSBtYWN3aW5zW3FdLmxldmVsOwkKLQkJCX0KLQkJCWN1cnIgPSB3aGlzdFt3aGlzdF9pZHhdW3dpbl07Ci0JCQlwcmV2ID0gd2hpc3Rbd2hpc3RfcHJ2XVt3aW5dOwotCQkJaWYgKCEoY3VyciAmIGlzX2V4aXN0KSAmJiAocHJldiAmIGlzX2V4aXN0KSkgewotCQkJCWlmIChwcmV2ICYgaXNfbWFwcGVkKSB7Ci0JCQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlVubWFwTm90aWZ5OiAlZC8lZCAgJWQgICAgICAgICAgICAgICAlLjRmIEIgdG90PSVkXG4iLCBwcmV2LCBjdXJyLCB3aW4sIGRub3d4KCksIHRvdGNudCk7IAotCQkJCQltYWNvc3hfYWRkX21hcG5vdGlmeSh3aW4sIGx2bCwgMCk7Ci0JCQkJfQotCQkJCS8qIERlc3Ryb3lOb3RpZnkgKi8KLQkJCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJEZXN0cm9Ob3RpZnk6JWQvJWQgICVkICAgICAgICAgICAgICAgJS40ZiB0b3Q9JWRcbiIsIHByZXYsIGN1cnIsIHdpbiwgZG5vd3goKSwgdG90Y250KTsgCi0JCQkJbWFjb3N4X2FkZF9kZXN0cm95KHdpbiwgbHZsKTsKLQkJCX0KLQkJfQotCQlpZiAobnYpIHsKLQkJCWludCBrOwotCQkJZm9yIChrID0gMDsgayA8IG52OyBrKyspIHsKLQkJCQltYWNvc3hfYWRkX3Zpc25vdGlmeShudl93aW5ba10sIG52X2x2bFtrXSwgbnZfdmlzW2tdKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotI2lmIDEKLU5TTG9jayAqcGJsb2NrID0gbmlsOwotTlNTdHJpbmcgKnBic3RyID0gbmlsOwotTlNTdHJpbmcgKmN1dHRleHQgPSBuaWw7Ci0KLWludCBwYmNudCA9IC0xOwotTlNTdHJpbmdFbmNvZGluZyBwYmVuYyA9IE5TV2luZG93c0NQMTI1MlN0cmluZ0VuY29kaW5nOwotCi12b2lkIG1hY29zeEdDU19pbml0cGIodm9pZCkgewotCU5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0JcGJsb2NrID0gW1tOU0xvY2sgYWxsb2NdIGluaXRdOwotCWlmICghW05TUGFzdGVib2FyZCBnZW5lcmFsUGFzdGVib2FyZF0pIHsKLQkJbWFjb3N4X2xvZygibWFjb3N4R0NTX2luaXRwYjogKipQQVNURUJPQVJEIElOQUNDRVNTSUJMRSoqLlxuIik7Ci0JCW1hY29zeF9sb2coIm1hY29zeEdDU19pbml0cGI6IENsaXBib2FyZCBleGNoYW5nZSB3aWxsIE5PVCB3b3JrLlxuIik7Ci0JCW1hY29zeF9sb2coIm1hY29zeEdDU19pbml0cGI6IFN0YXJ0IHgxMXZuYyAqaW5zaWRlKiBBcXVhIGZvciBDbGlwYm9hcmQuXG4iKTsKLQkJcGJjbnQgPSAwOwotCQlwYnN0ciA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOkAiXGU8UEFTVEVCT0FSRCBJTkFDQ0VTU0lCTEU+XGUiXTsgCi0JfQotCVtwb29sIHJlbGVhc2VdOwotfQotCi12b2lkIG1hY29zeEdDU19zZXRfcGFzdGVib2FyZChjaGFyICpzdHIsIGludCBsZW4pIHsKLQlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotCWlmIChwYmNudCAhPSAwKSB7Ci0JCVtwYmxvY2sgbG9ja107Ci0JCVtjdXR0ZXh0IHJlbGVhc2VdOwotCQljdXR0ZXh0ID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOltOU0RhdGEgZGF0YVdpdGhCeXRlczpzdHIgbGVuZ3RoOmxlbl0gZW5jb2Rpbmc6IHBiZW5jXTsKLQkJaWYgKFtbTlNQYXN0ZWJvYXJkIGdlbmVyYWxQYXN0ZWJvYXJkXSBkZWNsYXJlVHlwZXM6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0Ok5TU3RyaW5nUGJvYXJkVHlwZV0gb3duZXI6bmlsXSkgewotCQkJTlNfRFVSSU5HCi0JCQkJW1tOU1Bhc3RlYm9hcmQgZ2VuZXJhbFBhc3RlYm9hcmRdIHNldFN0cmluZzpjdXR0ZXh0IGZvclR5cGU6TlNTdHJpbmdQYm9hcmRUeXBlXTsKLQkJCU5TX0hBTkRMRVIKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIm1hY29zeEdDU19zZXRfcGFzdGVib2FyZDogcHJvYmxlbSB3cml0aW5nIHRvIHBhc3RlYm9hcmRcbiIpOwotCQkJTlNfRU5ESEFORExFUgotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJtYWNvc3hHQ1Nfc2V0X3Bhc3RlYm9hcmQ6IHByb2JsZW0gd3JpdGluZyB0byBwYXN0ZWJvYXJkXG4iKTsKLQkJfQotCQlbY3V0dGV4dCByZWxlYXNlXTsKLQkJY3V0dGV4dCA9IG5pbDsKLQkJW3BibG9jayB1bmxvY2tdOwotCX0KLQlbcG9vbCByZWxlYXNlXTsKLX0KLQotZXh0ZXJuIHZvaWQgbWFjb3N4X3NlbmRfc2VsKGNoYXIgKiwgaW50KTsKLQotdm9pZCBtYWNvc3hHQ1NfcG9sbF9wYih2b2lkKSB7Ci0KLQlzdGF0aWMgZG91YmxlIGRsYXN0ID0gMC4wOwotCWRvdWJsZSBub3cgPSBkbm93KCk7Ci0KLQlpZiAobm93IDwgZGxhc3QgKyAwLjIpIHsKLQkJcmV0dXJuOwotCX0KLQlkbGFzdCA9IG5vdzsKLQotICAgewotCU5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0JW3BibG9jayBsb2NrXTsKLQlpZiAocGJjbnQgIT0gW1tOU1Bhc3RlYm9hcmQgZ2VuZXJhbFBhc3RlYm9hcmRdIGNoYW5nZUNvdW50XSkgewotCQlwYmNudCA9IFtbTlNQYXN0ZWJvYXJkIGdlbmVyYWxQYXN0ZWJvYXJkXSBjaGFuZ2VDb3VudF07Ci0JCVtwYnN0ciByZWxlYXNlXTsKLQkJcGJzdHIgPSBuaWw7Ci0JCWlmIChbW05TUGFzdGVib2FyZCBnZW5lcmFsUGFzdGVib2FyZF0gYXZhaWxhYmxlVHlwZUZyb21BcnJheTpbTlNBcnJheSBhcnJheVdpdGhPYmplY3Q6TlNTdHJpbmdQYm9hcmRUeXBlXV0pIHsKLQkJCXBic3RyID0gW1tbTlNQYXN0ZWJvYXJkIGdlbmVyYWxQYXN0ZWJvYXJkXSBzdHJpbmdGb3JUeXBlOk5TU3RyaW5nUGJvYXJkVHlwZV0gY29weV07Ci0JCQlpZiAocGJzdHIpIHsKLQkJCQlOU0RhdGEgKnN0ciA9IFtwYnN0ciBkYXRhVXNpbmdFbmNvZGluZzpwYmVuYyBhbGxvd0xvc3N5Q29udmVyc2lvbjpZRVNdOwotCQkJCWlmIChbc3RyIGxlbmd0aF0pIHsKLQkJCQkJbWFjb3N4X3NlbmRfc2VsKChjaGFyICopIFtzdHIgYnl0ZXNdLCBbc3RyIGxlbmd0aF0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlbcGJsb2NrIHVubG9ja107Ci0JW3Bvb2wgcmVsZWFzZV07Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2VuZGlmCS8qIF9fQVBQTEVfXyAqLwotCmRpZmYgLS1naXQgYS94MTF2bmMvbWFjb3N4Q0dTLmggYi94MTF2bmMvbWFjb3N4Q0dTLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmRlYmQuLjAwMDAwMDAKLS0tIGEveDExdm5jL21hY29zeENHUy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfTUFDT1NYQ0dTX0gKLSNkZWZpbmUgX1gxMVZOQ19NQUNPU1hDR1NfSAotCi0vKiAtLSBtYWNvc3hDR1MuaCAtLSAqLwotCi1leHRlcm4gdm9pZCBtYWNvc3hDR1NfZ2V0X2FsbF93aW5kb3dzKHZvaWQpOwotZXh0ZXJuIGludCBtYWNvc3hDR1NfZ2V0X3Fsb29rKGludCk7Ci1leHRlcm4gdm9pZCBtYWNvc3hHQ1Nfc2V0X3Bhc3RlYm9hcmQoY2hhciAqc3RyLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dTX2ZvbGxvd19hbmltYXRpb25fd2luKGludCB3aW4sIGludCBpZHgsIGludCBncm93KTsKLWV4dGVybiBpbnQgbWFjb3N4Q0dTX2ZpbmRfaW5kZXgoaW50IHcpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX01BQ09TWENHU19IICovCmRpZmYgLS1naXQgYS94MTF2bmMvbWFjb3N4X29wZW5nbC5jIGIveDExdm5jL21hY29zeF9vcGVuZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ODI3OS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWFjb3N4X29wZW5nbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gbWFjb3N4X29wZW5nbC5jIC0tICovCi0KLSNpZiAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotCi0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLQotI2luY2x1ZGUgPHJmYi9yZmIuaD4KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9NQUNPU1hfT1BFTkdMX0gKLSNpbmNsdWRlIDxPcGVuR0wvT3BlbkdMLmg+Ci0jaW5jbHVkZSA8T3BlbkdML2dsLmg+Ci0jZW5kaWYKLQotZXh0ZXJuIGludCBtYWNvc3hfbm9fb3BlbmdsLCBtYWNvc3hfcmVhZF9vcGVuZ2w7Ci1leHRlcm4gQ0dEaXJlY3REaXNwbGF5SUQgZGlzcGxheUlEOwotCi1zdGF0aWMgQ0dMQ29udGV4dE9iaiBnbENvbnRleHRPYmo7Ci0KLWludCBtYWNvc3hfb3BlbmdsX3dpZHRoID0gMDsKLWludCBtYWNvc3hfb3BlbmdsX2hlaWdodCA9IDA7Ci1pbnQgbWFjb3N4X29wZW5nbF9icHAgPSAwOwotCi1pbnQgbWFjb3N4X29wZW5nbF9nZXRfd2lkdGgodm9pZCkgewotCUdMaW50IHZpZXdwb3J0WzRdOwotCi0JZ2xHZXRJbnRlZ2VydihHTF9WSUVXUE9SVCwgdmlld3BvcnQpOwotCXJldHVybiAoaW50KSB2aWV3cG9ydFsyXTsKLX0KLQotaW50IG1hY29zeF9vcGVuZ2xfZ2V0X2hlaWdodCh2b2lkKSB7Ci0JR0xpbnQgdmlld3BvcnRbNF07Ci0KLQlnbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2aWV3cG9ydCk7Ci0JcmV0dXJuIChpbnQpIHZpZXdwb3J0WzNdOwotfQotCi1pbnQgbWFjb3N4X29wZW5nbF9nZXRfYnBwKHZvaWQpIHsKLQlyZXR1cm4gMzI7Ci19Ci0KLWludCBtYWNvc3hfb3BlbmdsX2dldF9icHModm9pZCkgewotCXJldHVybiA4OwotfQotCi1pbnQgbWFjb3N4X29wZW5nbF9nZXRfc3BwKHZvaWQpIHsKLQlyZXR1cm4gMzsKLX0KLQotdm9pZCBtYWNvc3hfb3BlbmdsX2luaXQodm9pZCkgewotCUNHTFBpeGVsRm9ybWF0T2JqIHBpeGVsRm9ybWF0T2JqOwotCUdMaW50IG51bVBpeGVsRm9ybWF0czsKLQlDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyaWJzW10gPSB7Ci0JCWtDR0xQRkFGdWxsU2NyZWVuLAotCQlrQ0dMUEZBRGlzcGxheU1hc2ssCi0JCTAsCi0JCTAKLQl9OwotCi0JaWYgKG1hY29zeF9ub19vcGVuZ2wpIHsKLQkJcmV0dXJuOwotCX0KLQotCWF0dHJpYnNbMl0gPSBDR0Rpc3BsYXlJRFRvT3BlbkdMRGlzcGxheU1hc2soZGlzcGxheUlEKTsKLQotCUNHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMsICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7Ci0JaWYgKHBpeGVsRm9ybWF0T2JqID09IE5VTEwpIHsKLQkJcmZiTG9nKCJtYWNvc3hfb3BlbmdsX2luaXQ6IENHTENob29zZVBpeGVsRm9ybWF0IGZhaWxlZC4gTm90IHVzaW5nIE9wZW5HTC5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1hdE9iaiwgTlVMTCwgJmdsQ29udGV4dE9iaik7Ci0JQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0T2JqKTsKLQotCWlmIChnbENvbnRleHRPYmogPT0gTlVMTCkgewotCQlyZmJMb2coIm1hY29zeF9vcGVuZ2xfaW5pdDogQ0dMQ3JlYXRlQ29udGV4dCBmYWlsZWQuIE5vdCB1c2luZyBPcGVuR0wuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCUNHTFNldEN1cnJlbnRDb250ZXh0KGdsQ29udGV4dE9iaik7Ci0JQ0dMU2V0RnVsbFNjcmVlbihnbENvbnRleHRPYmopOwotCi0JbWFjb3N4X29wZW5nbF93aWR0aCAgPSBtYWNvc3hfb3BlbmdsX2dldF93aWR0aCgpOwotCW1hY29zeF9vcGVuZ2xfaGVpZ2h0ID0gbWFjb3N4X29wZW5nbF9nZXRfaGVpZ2h0KCk7Ci0KLQltYWNvc3hfb3BlbmdsX2JwcCA9IG1hY29zeF9vcGVuZ2xfZ2V0X2JwcCgpOwotCi0JZ2xGaW5pc2goKTsKLQotCWdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOwotCWdsUGl4ZWxTdG9yZWkoR0xfUEFDS19ST1dfTEVOR1RILCAwKTsKLQlnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfU0tJUF9ST1dTLCAwKTsKLQlnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfU0tJUF9QSVhFTFMsIDApOwotCi0JcmZiTG9nKCJtYWNvc3hfb3BlbmdsX2luaXQ6IFVzaW5nIE9wZW5HTCBmb3Igc2NyZWVuIGNhcHR1cmUuXG4iKTsKLQltYWNvc3hfcmVhZF9vcGVuZ2wgPSAxOwotfQotCi12b2lkIG1hY29zeF9vcGVuZ2xfZmluaSh2b2lkKSB7Ci0JaWYgKCFtYWNvc3hfcmVhZF9vcGVuZ2wpIHsKLQkJcmV0dXJuOwotCX0KLQlDR0xTZXRDdXJyZW50Q29udGV4dChOVUxMKTsKLQlDR0xDbGVhckRyYXdhYmxlKGdsQ29udGV4dE9iaik7Ci0JQ0dMRGVzdHJveUNvbnRleHQoZ2xDb250ZXh0T2JqKTsKLX0KLQotdm9pZCBtYWNvc3hfY29weV9vcGVuZ2woY2hhciAqZGVzdCwgaW50IHgsIGludCB5LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpIHsKLQlpbnQgeWZsaXAgPSBtYWNvc3hfb3BlbmdsX2hlaWdodCAtIHkgLSBoOyAKLQotCUNHTFNldEN1cnJlbnRDb250ZXh0KGdsQ29udGV4dE9iaik7Ci0KLQlnbFJlYWRQaXhlbHMoKEdMaW50KSB4LCAoR0xpbnQpIHlmbGlwLCAoaW50KSB3LCAoaW50KSBoLAotCSAgICBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsIGRlc3QpOwotCi0JaWYgKGggPiAxKSB7Ci0JCXN0YXRpYyBjaGFyICpwYnVmID0gTlVMTDsKLQkJc3RhdGljIGludCBidWZsZW4gPSAwOwotCQlpbnQgdG9wID0gMCwgYm90ID0gaCAtIDEsIHJvd2xlbiA9IHcgKiBtYWNvc3hfb3BlbmdsX2JwcC84OwotCQljaGFyICpwdG9wLCAqcGJvdDsKLQotCQlpZiAocm93bGVuID4gYnVmbGVuIHx8IGJ1ZmxlbiA9PSAwKSAgewotCQkJYnVmbGVuID0gcm93bGVuICsgMTI4OwotCQkJaWYgKHBidWYpIHsKLQkJCQlmcmVlKHBidWYpOwotCQkJfQotCQkJcGJ1ZiA9IChjaGFyICopIG1hbGxvYyhidWZsZW4pOwotCQl9Ci0JCXdoaWxlICh0b3AgPCBib3QpIHsKLQkJCXB0b3AgPSBkZXN0ICsgdG9wICogcm93bGVuOwotCQkJcGJvdCA9IGRlc3QgKyBib3QgKiByb3dsZW47Ci0JCQltZW1jcHkocGJ1ZiwgcHRvcCwgcm93bGVuKTsKLQkJCW1lbWNweShwdG9wLCBwYm90LCByb3dsZW4pOwotCQkJbWVtY3B5KHBib3QsIHBidWYsIHJvd2xlbik7Ci0JCQl0b3ArKzsKLQkJCWJvdC0tOwotCQl9Ci0JfQotfQotCi0KLSNlbHNlCi0KLSNlbmRpZgkvKiBfX0FQUExFX18gKi8KLQpkaWZmIC0tZ2l0IGEveDExdm5jL21hY29zeF9vcGVuZ2wuaCBiL3gxMXZuYy9tYWNvc3hfb3BlbmdsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzFhMGMuLjAwMDAwMDAKLS0tIGEveDExdm5jL21hY29zeF9vcGVuZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX01BQ09TWF9PUEVOR0xfSAotI2RlZmluZSBfWDExVk5DX01BQ09TWF9PUEVOR0xfSAotCi0vKiAtLSBtYWNvc3hfb3BlbmdsLmggLS0gKi8KLQotZXh0ZXJuIHZvaWQgbWFjb3N4X29wZW5nbF9pbml0KHZvaWQpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX01BQ09TWF9PUEVOR0xfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvLmN2c2lnbm9yZSBiL3gxMXZuYy9taXNjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTRlNzIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFrZWZpbGUKLU1ha2VmaWxlLmluCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL0xJQ0VOU0UgYi94MTF2bmMvbWlzYy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRiZGIwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1UaGUgZm9sbG93aW5nIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5OgotCi0JTWFrZWZpbGUuYW0KLQlSRUFETUUKLQlYZHVtbXkKLQlibG9ja2RweS5jCi0JcmFuZmIucGwKLQlyeDExdm5jCi0JcngxMXZuYy5wbAotCXNobV9jbGVhcgotCXNsaWRlLnBsCi0JdmNpbmplY3QucGwKLQl4MTF2bmNfbG9vcAotCXgxMXZuY19wdwotCi1hcmUgYWxsIENvcHlyaWdodCAoQykgMjAwMi0yMDA5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci1hbmQgYXJlIGFsbCByZWxlYXNlZCB1bmRlciB0aGlzIGxpY2Vuc2U6Ci0KLSAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLQotICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotICBVU0EgIG9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9NYWtlZmlsZS5hbSBiL3gxMXZuYy9taXNjL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE1MGFhLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1TVUJESVJTID0gdHVyYm92bmMKLURJU1RfU1VCRElSUyA9IHR1cmJvdm5jCi1FWFRSQV9ESVNUPVJFQURNRSBibG9ja2RweS5jIGR0Vm5jUG9wdXAgcngxMXZuYyByeDExdm5jLnBsIHNobV9jbGVhciByYW5mYi5wbCBzbGlkZS5wbCB2Y2luamVjdC5wbCB4MTF2bmNfbG9vcCBYZHVtbXkgdWx0cmF2bmNfcmVwZWF0ZXIucGwgY29ubmVjdF9zd2l0Y2ggcGFubmVyLnBsIGRlc2t0b3AuY2dpIGluZXQ2dG80IHVpbnB1dC5wbCBxdF90c2xpYl9pbmplY3QucGwKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL01ha2VmaWxlLmluIGIveDExdm5jL21pc2MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMmU0NDAuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXN1YmRpciA9IHgxMXZuYy9taXNjCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2F0XzAgPSBACi1TT1VSQ0VTID0KLURJU1RfU09VUkNFUyA9Ci1SRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCi0JcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAotICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKLSAgICBufG5vfE5PKSBmYWxzZTs7IFwKLSAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAotICBlc2FjCi1SRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAotICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi1BTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKLQkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAotCWRpc3RkaXIKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1hbV9fcmVsYXRpdml6ZSA9IFwKLSAgZGlyMD1gcHdkYDsgXAotICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKLSAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKLSAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKLSAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCi0gIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKLSAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAotICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCi0gICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAotICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKLSAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCi0gICAgICBlbHNlIFwKLSAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCi0gICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCi0gICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKLSAgICAgICAgZmk7IFwKLSAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKLSAgICAgIGZpOyBcCi0gICAgZmk7IFwKLSAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKLSAgZG9uZTsgXAotICByZWxkaXI9IiQkZGlyMiIKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLVNVQkRJUlMgPSB0dXJib3ZuYwotRElTVF9TVUJESVJTID0gdHVyYm92bmMKLUVYVFJBX0RJU1QgPSBSRUFETUUgYmxvY2tkcHkuYyBkdFZuY1BvcHVwIHJ4MTF2bmMgcngxMXZuYy5wbCBzaG1fY2xlYXIgcmFuZmIucGwgc2xpZGUucGwgdmNpbmplY3QucGwgeDExdm5jX2xvb3AgWGR1bW15IHVsdHJhdm5jX3JlcGVhdGVyLnBsIGNvbm5lY3Rfc3dpdGNoIHBhbm5lci5wbCBkZXNrdG9wLmNnaSBpbmV0NnRvNCB1aW5wdXQucGwgcXRfdHNsaWJfaW5qZWN0LnBsCi1hbGw6IGFsbC1yZWN1cnNpdmUKLQotLlNVRkZJWEVTOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB4MTF2bmMvbWlzYy9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSB4MTF2bmMvbWlzYy9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6Ci0JQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKLQlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCi0JICBjYXNlICQkZiBpbiBcCi0JICAgICo9KiB8IC0tWyFrXSopOzsgXAotCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZG90X3NlZW49bm87IFwKLQljYXNlICIkQCIgaW4gXAotCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAotCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAotCWVzYWM7IFwKLQlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCi0JICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlyZXY9IiQkcmV2IC4iOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCi0JZG9uZQotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0Jc2V0IHg7IFwKLQloZXJlPWBwd2RgOyBcCi0JaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD0uOyBcCi0JZWxzZSBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD07IFwKLQlmaTsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAotCSAgICAgIHNldCAiJCRAIiAiJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlzaGlmdDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAotCSAgZWxzZSBcCi0JICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgICAkJHVuaXF1ZTsgXAotCSAgZmk7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCi0JICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgICQoYW1fX21ha2VfZHJ5cnVuKSBcCi0JICAgICAgfHwgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKLQkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKLQkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKLQkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCi0JICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCi0JICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAotCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCi0JICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKLQkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCi0JICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCi0JICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCi0JCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKLQkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAotCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKLQkgICAgICAgIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZQotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtc3RyaXA6Ci0JaWYgdGVzdCAteiAnJChTVFJJUCknOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAgIGluc3RhbGw7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICAgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgICAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyIgaW5zdGFsbDsgXAotCWZpCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLXJlY3Vyc2l2ZQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtcmVjdXJzaXZlCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tcmVjdXJzaXZlCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLQotaW5zdGFsbC1pbmZvLWFtOgotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKLQotcGRmOiBwZGYtcmVjdXJzaXZlCi0KLXBkZi1hbToKLQotcHM6IHBzLXJlY3Vyc2l2ZQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY3RhZ3MtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAotCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKLQlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAotCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCi0JaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKLQlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKLQl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvUkVBRE1FIGIveDExdm5jL21pc2MvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQxZGZmLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQotSW4gdGhpcyBkaXJlY3RvcnkgeW91J2xsIGZpbmQgYSBob2RnZXBvZGdlIG9mIHdyYXBwZXIgc2NyaXB0cyBhbmQKLXV0aWxpdHkgcHJvZ3JhbXMgdGhhdCBoYXZlIGZvdW5kIHNvbWUgdXNlIHdpdGggeDExdm5jLiAgCi0KLVNvbWUgYXJlIG9uIHRoZSByb3VnaCBzaWRlIGFuZCB3aWxsIG5lZWQgc29tZSBjdXN0b21pemF0aW9uIGZvciB5b3VyCi11c2UuICBNYW55IG9mIHRoZW0gYXJlIGRlc2NyaWJlZCBvbiB0aGUgd2VicGFnZToKLQotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMKLQotKHVzZSB5b3VyIGJyb3dzZXIncyBGaW5kIGFjdGlvbiB0byBmaW5kIHRoZW0hKS4gIFNvbWUgb2YgdGhlbSBhbHNvIGhhdmUKLWRvY3VtZW50YXRpb24gbmVhciB0aGUgdG9wIG9mIHRoZSBmaWxlLgotCi14MTF2bmMgLWFjY2VwdCBzY3JpcHRzOiAKLQotICAgYmxvY2tkcHkuYwl0cnkgdG8gbG9jayBzY3JlZW4gaWYgbG9jYWwgcGVyc29uIGtub2NrcyBtb25pdG9yIG91dCBvZiBEUE1TCi0gICBkdFZuY1BvcHVwCUNERS9kdGtzaCBieSBTdGVmYW4gUmFkbWFuIHRvIGFjY2VwdCBjb25uZWN0aW9ucywgbG9jayBzY3JlZW4KLQoteDExdm5jIGxhdW5jaCB3cmFwcGVyczoKLQotICAgcngxMXZuYwlzaW1wbGUgc3NoL3JzaCB4MTF2bmMgbGF1bmNoZXIuICAtUyBvcHRpb24gbmVlZHMgd29yay4uLgotICAgcngxMXZuYy5wbAlwZXJsIHNjcmlwdCB0cmllcyB0byBkbyByeDExdm5jIC1TIHR1bm5lbGxpbmcgYmV0dGVyLgotCi14MTF2bmMgLXBpcGVpbnB1dC8tcmF3ZmIgdXRpbGl0aWVzOgotCi0gICB2Y2luamVjdC5wbAlwZXJsIHNjcmlwdCBsaWtlIExpbnV4Vk5DLmMsIGZvciB4MTF2bmMgdmlld2luZyBvZiBsaW51eCBjb25zb2xlIAotICAgc2xpZGUucGwJYW11c2luZyBleGFtcGxlIHVzaW5nIHgxMXZuYyAtcmF3ZmIgZm9yIGpwZWcgc2xpZGVzaG93LiAKLSAgIHJhbmZiLnBsCWV4YW1wbGUgLXJhd2ZiIHNldHVwOi4vcmFuZmIucGwgdG8gc2V0IHVwIGEgZnJhbWVidWZmZXIuCi0KLSAgIHVpbnB1dC5wbCAgICB0ZXN0IHBlcmwgc2NyaXB0IGZvciBMaW51eCB1aW5wdXQgaW5qZWN0aW9uLgotCi0gICBxdF90c2xpYl9pbmplY3QucGwgdG91Y2hzY3JlZW4gLXBpcGVpbnB1dCBoZWxwZXIgZm9yIHRzbGliIG9uIHF0bW9rby4KLQotTWlzYy4gc2NyaXB0czoKLQotICAgc2htX2NsZWFyCWxpc3Qgb3IgcmVtb3ZlIG9ycGhhbmVkIHNobSBzbG90cyBmcm9tIGhhcmQgeDExdm5jIGNyYXNoZXMuCi0gICB4MTF2bmNfbG9vcAlrbHVkZ2UgdG8gcnVuIGluIGJnIGF0dGFjaGluZyB4MTF2bmMgdG8gWCBsb2dpbi4gIEJldHRlciB0bwotCQl1c2UgWHNldHVwIG1lY2hhbmlzbS4KLSAgIFhkdW1teSAgICAgICBBbiBMRF9QUkVMT0FEIGtsdWRnZSB0byBydW4gdGhlIFhvcmcgImR1bW15IiBkZXZpY2UgZHJpdmVyCi0JCWxpa2UgWHZmYi4KLQotICAgdWx0cmF2bmNfcmVwZWF0ZXIucGw6IFVuaXggc2NyaXB0IHRvIGFjdCBhcyBVbHRyYVZOQyByZXBlYXRlciBwcm94eS4KLQotICAgY29ubmVjdF9zd2l0Y2g6ICBTaGFyZSBIVFRQUywgVk5DLCBTU0gsIGV0Yy4gdGhyb3VnaCBhIHNpbmdsZSBwb3J0IChlLmcuIDQ0MykKLQotICAgcGFubmVyLnBsICAgIEFsbG93cyBhIHNtYWxsIHJlY3RhbmdsZSB0byBwYW4gYXJvdW5kIGEgZGVza3RvcCBtb3JlIG9yIGxlc3MuCi0KLSAgIGRlc2t0b3AuY2dpICBDR0kgc2NyaXB0IGZvciBjcmVhdGluZyBtdWx0aS11c2VyIHZpcnR1YWwgZGVza3RvcHMgb24gYQotICAgICAgICAgICAgICAgIHNlcnZlci4gIEFsc28gY2FuIGRvIHBvcnQtcmVkaXJlY3Rpb24gdG8gaW50ZXJuYWwgbWFjaGluZXMuCi0KLSAgIGluZXQ2dG80ICAgICBpcHY2IHRvIGlwdjQgcmVsYXkgKGkuZS4gdW50aWwgbGlidm5jc2VydmVyIHN1cHBvcnRzIGlwdjYpCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9YZHVtbXkgYi94MTF2bmMvbWlzYy9YZHVtbXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzOGE3YjMuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvWGR1bW15CisrKyAvZGV2L251bGwKQEAgLTEsMTkzMCArMCwwIEBACi0jIS9iaW4vc2gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFhkdW1teS4KLSMgCi0jIFhkdW1teSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBYZHVtbXkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBYZHVtbXk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLSMgb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAKLSMgCi0jIFhkdW1teTogYW4gTERfUFJFTE9BRCBoYWNrIHRvIHJ1biBhIHN0b2NrIFhvcmcoMSkgb3IgWEZyZWU4NigxKSBzZXJ2ZXIKLSMgd2l0aCB0aGUgImR1bW15IiB2aWRlbyBkcml2ZXIgdG8gbWFrZSBpdCBhdm9pZCBMaW51eCBWVCBzd2l0Y2hpbmcsIGV0Yy4KLSMKLSMgUnVuICJYZHVtbXkgLWhlbHAiIGZvciBtb3JlIGluZm8uCi0jCi1pbnN0YWxsPSIiCi11bmluc3RhbGw9IiIKLXJ1bml0PTEKLXByY29uZj0iIgotbm90d2Vhaz0iIgotcm9vdD0iIgotbm9zdWRvPSIiCi14c2VydmVyPSIiCi1nZW9tPSIiCi1ub21vZGVsaW5lcz0iIgotZGVwdGg9IiIKLWRlYnVnPSIiCi1zdHJhY2U9IiIKLWNtZGxpbmVfY29uZmlnPSIiCi0KLVBBVEg9JFBBVEg6L2JpbjovdXNyL2JpbgotZXhwb3J0IFBBVEgKLQotcHJvZ3JhbT1gYmFzZW5hbWUgIiQwImAKLQotaGVscCAoKSB7Ci0JJHtQQUdFUjotbW9yZX0gPDwgRU5ECi0kcHJvZ3JhbToKLQotICAgIEEgaGFjayB0byBydW4gYSBzdG9jayBYb3JnKDEpIG9yIFhGcmVlODYoMSkgWCBzZXJ2ZXIgd2l0aCB0aGUgImR1bW15IgotICAgIChSQU0tb25seSBmcmFtZWJ1ZmZlcikgdmlkZW8gZHJpdmVyIHN1Y2ggdGhhdCBpdCBBVk9JRFMgdGhlIExpbnV4IFZUCi0gICAgc3dpdGNoaW5nLCBvcGVuaW5nIGRldmljZSBmaWxlcyBpbiAvZGV2LCBrZXlib2FyZCBhbmQgbW91c2UgY29uZmxpY3RzLAotICAgIGFuZCBvdGhlciBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5vcm1hbCB1c2Ugb2YgImR1bW15Ii4KLQotICAgIEluIG90aGVyIHdvcmRzLCBpdCB0cmllcyB0byBtYWtlIFhvcmcvWEZyZWU4NiB3aXRoIHRoZSAiZHVtbXkiCi0gICAgZGV2aWNlIGRyaXZlciBhY3QgbW9yZSBsaWtlIFh2ZmIoMSkuCi0KLSAgICBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGUgWGR1bW15IHNjcmlwdCBpcyB0byBwcm92aWRlIGEgdmlydHVhbCBYCi0gICAgc2VydmVyIGZvciB4MTF2bmMgYnV0IHdpdGggbW9yZSBmZWF0dXJlcyB0aGFuIFh2ZmIgKG9yIFh2bmMpOyBob3dldmVyCi0gICAgaXQgY291bGQgYmUgdXNlZCBmb3Igb3RoZXIgcmVhc29ucyAoZS5nLiBiZXR0ZXIgYXV0b21hdGVkIHRlc3RpbmcKLSAgICB0aGFuIHdpdGggWHZmYi4pICBPbmUgbmljZSB0aGluZyBpcyB0aGUgZHVtbXkgc2VydmVyIHN1cHBvcnRzIFJBTkRSCi0gICAgZHluYW1pYyByZXNpemluZyB3aGlsZSBYdmZiIGRvZXMgbm90LgotCi0gICAgU28sIGZvciBleGFtcGxlLCB4MTF2bmMrWGR1bW15IHRlcm1pbmFsIHNlcnZpY2VzIGFyZSBhIGxpdHRsZSBiZXR0ZXIKLSAgICB0aGFuIHgxMXZuYytYdmZiLgotCi0gICAgVG8gYWNoaWV2ZSB0aGlzLCB3aGlsZSBydW5uaW5nIHRoZSByZWFsIFhzZXJ2ZXIgJHByb2dyYW0gaW50ZXJjZXB0cwotICAgIHN5c3RlbSBhbmQgbGlicmFyeSBjYWxscyB2aWEgdGhlIExEX1BSRUxPQUQgbWV0aG9kIGFuZCBtb2RpZmllcwotICAgIHRoZSBiZWhhdmlvciB0byBtYWtlIGl0IHdvcmsgY29ycmVjdGx5IChlLmcuIGF2b2lkIHRoZSBWVCBzdHVmZi4pCi0gICAgTERfUFJFTE9BRCB0cmlja3MgYXJlIHVzdWFsbHkgImNsZXZlciBoYWNrcyIgYW5kIHNvIG1pZ2h0IG5vdCB3b3JrCi0gICAgaW4gYWxsIHNpdHVhdGlvbnMgb3IgYnJlYWsgd2hlbiBzb21ldGhpbmcgY2hhbmdlcy4KLQotICAgIFdBUk5JTkc6IFRha2UgY2FyZSBpbiB1c2luZyBYZHVtbXksIGFsdGhvdWdoIGl0IG5ldmVyIGhhcyBpdCBpcwotICAgIHBvc3NpYmxlIHRoYXQgaXQgY291bGQgZGFtYWdlIGhhcmR3YXJlLiAgT25lIGNhbiB1c2UgdGhlIC1wcmNvbmYKLSAgICBvcHRpb24gdG8gaGF2ZSBpdCBwcmludCBvdXQgdGhlIHhvcmcuY29uZiBjb25maWcgdGhhdCBpdCB3b3VsZCB1c2UKLSAgICBhbmQgdGhlbiBpbnNwZWN0IGl0IGNhcmVmdWxseSBiZWZvcmUgYWN0dWFsbHkgdXNpbmcgaXQuCi0KLSAgICBUaGlzIHByb2dyYW0gbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIHJ1biBhcyByb290IGFzIG9mIDEyLzIwMDkuCi0gICAgSG93ZXZlciwgaWYgdGhlcmUgYXJlIHByb2JsZW1zIGZvciBjZXJ0YWluIHNpdHVhdGlvbnMgKHVzdWFsbHkgb2xkZXIKLSAgICBzZXJ2ZXJzKSBpdCBtYXkgcGVyZm9ybSBiZXR0ZXIgaWYgcnVuIGFzIHJvb3QgKHVzZSB0aGUgLXJvb3Qgb3B0aW9uLikKLSAgICBXaGVuIHJ1bm5pbmcgYXMgcm9vdCByZW1lbWJlciB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGFuZCB0aGF0IFhkdW1teQotICAgIGNvbWVzIHdpdGhvdXQgYW55IHdhcnJhbnR5LgotCi0gICAgZ2NjL2NjIGFuZCBvdGhlciBidWlsZCB0b29scyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgc2NyaXB0IHRvIGJlIGFibGUKLSAgICB0byBjb21waWxlIHRoZSBMRF9QUkVMT0FEIHNoYXJlZCBvYmplY3QuICBCZSBzdXJlIHRoZXkgYXJlIGluc3RhbGxlZAotICAgIG9uIHRoZSBzeXN0ZW0uICBTZWUgLWluc3RhbGwgYW5kIC11bmluc3RhbGwgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgWW91ciBMaW51eCBkaXN0cmlidXRpb24gbWF5IG5vdCBpbnN0YWxsIHRoZSBkdW1teSBkcml2ZXIgYnkgZGVmYXVsdCwKLSAgICBlLmc6Ci0KLSAgICAgICAgL3Vzci9saWIveG9yZy9tb2R1bGVzL2RyaXZlcnMvZHVtbXlfZHJ2LnNvCi0gICAgCi0gICAgc29tZSBoYXZlIGl0IGluIGEgcGFja2FnZSBuYW1lZCB4c2VydmVyLXhvcmctdmlkZW8tZHVtbXkgeW91IHRoYXQKLSAgICBuZWVkIHRvIGluc3RhbGwuCi0KLVVzYWdlOgotCi0JJHByb2dyYW0gPCR7cHJvZ3JhbX0tYXJncz4gPFhzZXJ2ZXItYXJncz4KLQotCShhY3R1YWxseSwgdGhlIGFyZ3VtZW50cyBjYW4gYmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLikKLQotRXhhbXBsZXM6Ci0KLQkkcHJvZ3JhbSAtaW5zdGFsbAotCi0JJHByb2dyYW0gOjEKLQotCSRwcm9ncmFtIC1kZWJ1ZyA6MQotCi0JJHByb2dyYW0gLXRtcGRpciB+L215dG1wIDoxIC1ub2xpc3RlbiB0Y3AKLQotc3RhcnR4IGV4YW1wbGU6Ci0KLQlzdGFydHggLWUgYmFzaCAtLSAkcHJvZ3JhbSA6MiAtZGVwdGggMTYKLQotCShpZiBzdGFydHggbmVlZHMgdG8gYmUgcnVuIGFzIHJvb3QsIHlvdSBjYW4gc3UoMSkgdG8gYSBub3JtYWwKLQl1c2VyIGluIHRoZSBiYXNoIHNoZWxsIGFuZCB0aGVuIGxhdW5jaCB+Ly54aW5pdHJjIG9yIH4vLnhzZXNzaW9uLAotCWdub21lLXNlc3Npb24sIHN0YXJ0a2RlLCBzdGFydHhmY2U0LCBldGMuKQotCi14ZG0gZXhhbXBsZToKLQotCXhkbSAtY29uZmlnIC91c3IvbG9jYWwvZHVtbXkveGRtLWNvbmZpZyAtbm9kYWVtb24KLQotCXdoZXJlIHRoZSB4ZG0tY29uZmlnIGZpbGUgaGFzIGxpbmU6Ci0KLQkgICAgIERpc3BsYXlNYW5hZ2VyLnNlcnZlcnM6ICAgICAgICAgL3Vzci9sb2NhbC9kdW1teS9Yc2VydmVycwotCi0JYW5kIC91c3IvbG9jYWwvZHVtbXkvWHNlcnZlcnMgaGFzIGxpbmVzOgotCi0JICAgICA6MSBsb2NhbCAvdXNyL2xvY2FsL2R1bW15L1hkdW1teSA6MSAtZGVidWcKLQkgICAgIDoyIGxvY2FsIC91c3IvbG9jYWwvZHVtbXkvWGR1bW15IDoyIC1kZWJ1ZwotCi0gICAgICAgICgtZGVidWcgaXMgb3B0aW9uYWwpCi0KLWdkbS9rZG0gZXhhbXBsZToKLQotCVRCRC4KLQotUm9vdCBwZXJtaXNzaW9uIGFuZCB4MTF2bmM6Ci0KLQlVcGRhdGU6IGFzIG9mIDEyLzIwMDkgdGhpcyBwcm9ncmFtIG5vIGxvbmdlciBtdXN0IGJlIHJ1biBhcyByb290LgotCVNvIHRyeSBpdCBhcyBub24tcm9vdCBiZWZvcmUgcnVubmluZyBpdCBhcyByb290IGFuZC9vciB0aGUKLQlmb2xsb3dpbmcgc2NoZW1lcy4KLQotCUluIHNvbWUgY2lyY3Vtc3RhbmNlcyBYIHNlcnZlciBwcm9ncmFtIG1heSBuZWVkIHRvIGJlIHJ1biBhcyByb290LgotCUlmIHNvLCBvbmUgY291bGQgcnVuIHgxMXZuYyBhcyByb290IHdpdGggLXVuaXhwdyAoaXQgc3dpdGNoZXMKLQl0byB0aGUgdXNlciB0aGF0IGxvZ3MgaW4pIGFuZCB0aGF0IG1heSBiZSBPSywgc29tZSBvdGhlciBpZGVhczoKLQotCS0gYWRkIHRoaXMgdG8gc3VkbyB2aWEgdmlzdWRvOgotCi0JCUFMTCBBTEwgPSBOT1BBU1NXRDogL3Vzci9sb2NhbC9iaW4vWGR1bW15Ci0KLQktIHVzZSB0aGlzIGxpdHRsZSBzdWlkIHdyYXBwZXI6Ci0vKiAKLSAqIHhkdW1teS5jCi0gKgotICAgY2MgLW8gLi94ZHVtbXkgeGR1bW15LmMKLSAgIHN1ZG8gY3AgLi94ZHVtbXkgL3Vzci9sb2NhbC9iaW4veGR1bW15Ci0gICBzdWRvIGNob3duIHJvb3Q6cm9vdCAvdXNyL2xvY2FsL2Jpbi94ZHVtbXkKLSAgIHN1ZG8gY2htb2QgdStzIC91c3IvbG9jYWwvYmluL3hkdW1teQotICoKLSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCWNoYXIgc3RyWzEwMF07Ci0Jc3ByaW50ZihzdHIsICJYRFVNTVlfVUlEPSVkIiwgKGludCkgZ2V0dWlkKCkpOwotCXB1dGVudihzdHIpOwotCXNldHVpZCgwKTsgIAotCXNldGdpZCgwKTsKLQlleGVjdigiL3Vzci9sb2NhbC9iaW4vWGR1bW15IiwgYXJndik7IAotCWV4aXQoMSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotT3B0aW9uczoKLQotICAgICR7cHJvZ3JhbX0tYXJnczoKLQotCS1pbnN0YWxsCUNvbXBpbGUgdGhlIExEX1BSRUxPQUQgc2hhcmVkIG9iamVjdCBhbmQgaW5zdGFsbCBpdAotCQkJbmV4dCB0byB0aGUgJHByb2dyYW0gc2NyaXB0IGZpbGUgYXM6Ci0KLQkJCSAgJDAuc28KLQotCQkJV2hlbiB0aGF0IGZpbGUgZXhpc3RzIGl0IGlzIHVzZWQgYXMgdGhlIExEX1BSRUxPQUQKLQkJCXNoYXJlZCBvYmplY3Qgd2l0aG91dCByZWNvbXBpbGluZy4gIE90aGVyd2lzZSwKLQkJCWVhY2ggdGltZSAkcHJvZ3JhbSBpcyBydW4gdGhlIExEX1BSRUxPQUQgc2hhcmVkCi0JCQlvYmplY3QgaXMgY29tcGlsZWQgYXMgYSBmaWxlIGluIC90bXAgKG9yIC10bXBkaXIpCi0KLQkJCUlmIHlvdSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JCQlJTlRFUlBPU0VfR0VUVUlEPTEgd2hlbiBidWlsZGluZywgdGhlbiB3aGVuCi0JCQkkcHJvZ3JhbSBpcyBydW4gYXMgYW4gb3JkaW5hcnkgdXNlciwgdGhlIHNoYXJlZAotCQkJb2JqZWN0IHdpbGwgaW50ZXJwb3NlIGdldHVpZCgpIGNhbGxzIGFuZCBwcmV0ZW5kCi0JCQl0byBiZSByb290LiAgT3RoZXJ3aXNlIGl0IGRvZXNuJ3QgcHJldGVuZCB0bwotCQkJYmUgcm9vdC4KLQotCQkJWW91IGNhbiBhbHNvIHNldCB0aGUgQ0ZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlCi0JCQl0byBhbnl0aGluZyBlbHNlIHlvdSB3YW50IG9uIHRoZSBjb21waWxlIGNtZGxpbmUuCi0KLQktdW5pbnN0YWxsCVJlbW92ZSB0aGUgZmlsZToKLQotCQkJICAkMC5zbwotCi0JCQlUaGUgTERfUFJFTE9BRCBzaGFyZWQgb2JqZWN0IHdpbGwgdGhlbiBiZSBjb21waWxlZAotCQkJZWFjaCB0aW1lIHRoaXMgcHJvZ3JhbSBpcyBydW4uCi0KLQlUaGUgWCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWQgdW5kZXIgLWluc3RhbGwsIC11bmluc3RhbGwsIG9yIC1wcmNvbmYuCi0KLQotCTpOCQlUaGUgRElTUExBWSAoZS5nLiA6MTUpIGlzIG9mdGVuIHRoZSBmaXJzdAotCQkJYXJndW1lbnQuICBJdCBpcyBwYXNzZWQgdG8gdGhlIHJlYWwgWCBzZXJ2ZXIgYW5kCi0JCQlhbHNvIHVzZWQgYnkgdGhlIFhkdW1teSBzY3JpcHQgYXMgYW4gaWRlbnRpZmllci4KLQotCS1nZW9tIGdlb20xWyxnZW9tMi4uLl0JVGFrZSB0aGUgZ2VvbWV0cnkgKGUuZy4gMTAyNHg3NjgpIG9yIGxpc3QKLQkJCW9mIGdlb21ldHJpZXMgYW5kIGluc2VydCB0aGVtIGludG8gdGhlIFNjcmVlbgotCQkJc2VjdGlvbiBvZiB0aGUgdHdlYWtlZCBYIHNlcnZlciBjb25maWcgZmlsZS4KLQkJCVVzZSB0aGlzIHRvIGhhdmUgYSBkaWZmZXJlbnQgZ2VvbWV0cnkgdGhhbiB0aGUKLQkJCW9uZShzKSBpbiB0aGUgc3lzdGVtIGNvbmZpZyBmaWxlLgotCi0JCQlUaGUgb3B0aW9uIC1nZW9tZXRyeSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIC1nZW9tOwotCQkJeDExdm5jIGNhbGxzIFhkdW1teSBhbmQgWHZmYiB0aGlzIHdheS4KLQotCS1ub21vZGVsaW5lcwlXaGVuIHlvdSBzcGVjaWZ5IC1nZW9tLy1nZW9tZXRyeSwgJHByb2dyYW0gd2lsbAotCQkJY3JlYXRlIE1vZGVsaW5lcyBmb3IgZWFjaCBnZW9tZXRyeSBhbmQgcHV0IHRoZW0KLQkJCWluIHRoZSBNb25pdG9yIHNlY3Rpb24uICBJZiB5b3UgZG8gbm90IHdhbnQgdGhpcwotCQkJdGhlbiBzdXBwbHkgLW5vbW9kZWxpbmVzLgotCi0JLWRlcHRoIG4JVXNlIHBpeGVsIGNvbG9yIGRlcHRoIG4gKGUuZy4gOCwgMTYsIG9yIDI0KS4gVGhpcwotCQkJbWFrZXMgc3VyZSB0aGUgWCBjb25maWcgZmlsZSBoYXMgYSBTY3JlZW4uRGlzcGxheQotCQkJc3Vic2VjdGlvbiBvZiB0aGlzIGRlcHRoLiAgTm90ZSB0aGlzIG9wdGlvbiBpcwotCQkJQUxTTyBwYXNzZWQgdG8gdGhlIFggc2VydmVyLgotCi0JLURFUFRIIG4JU2FtZSBhcyAtZGVwdGgsIGV4Y2VwdCBub3QgcGFzc2VkIHRvIFggc2VydmVyLgotCi0JLXRtcGRpciBkaXIJU3BlY2lmeSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIG93bmVkIGJ5IHlvdSBhbmQKLQkJCW9ubHkgd3JpdGFibGUgYnkgeW91LiAgVGhpcyBpcyB1c2VkIGluIHBsYWNlIG9mCi0JCQkvdG1wL1hkdW1teS5cJFVTRVIvLi4gIHRvIHBsYWNlIHRoZSAkcHJvZ3JhbS5zbwotCQkJc2hhcmVkIG9iamVjdCwgdHdlYWtlZCBjb25maWcgZmlsZXMsIGV0Yy4KLQotCS1ub25yb290CVJ1biBpbiBub24tcm9vdCBtb2RlICh3b3JraW5nIDEyLzIwMDksIG5vdyBkZWZhdWx0KQotCi0JLXJvb3QJCVJ1biBhcyByb290IChtYXkgc3RpbGwgYmUgbmVlZGVkIGluIHNvbWUKLQkJCWVudmlyb25tZW50cy4pICBTYW1lIGFzIFhEVU1NWV9SVU5fQVNfUk9PVD0xLgotCi0JLW5vc3VkbwkJRG8gbm90IHRyeSB0byB1c2Ugc3VkbygxKSB3aGVuIHJlLXJ1bm5pbmcgYXMgcm9vdCwKLQkJCXVzZSBzdSgxKSBpbnN0ZWFkLgotCi0JLXhzZXJ2ZXIgcGF0aAlTcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBYc2VydmVyIHRvIHVzZS4gIERlZmF1bHQKLQkJCWlzIHRvIHRyeSAiWG9yZyIgZmlyc3QgYW5kIHRoZW4gIlhGcmVlODYiLiAgSWYKLQkJCXRob3NlIGFyZSBub3QgaW4gXCRQQVRILCBpdCB0cmllcyB0aGVzZSBsb2NhdGlvbnM6Ci0JCQkJL3Vzci9iaW4vWG9yZwotCQkJCS91c3IvWDExUjYvYmluL1hvcmcKLQkJCQkvdXNyL1gxMVI2L2Jpbi9YRnJlZTg2Ci0KLQktbgkJRG8gbm90IHJ1biB0aGUgY29tbWFuZCB0byBzdGFydCB0aGUgWCBzZXJ2ZXIsCi0JCQlqdXN0IHNob3cgdGhlIGNvbW1hbmQgdGhhdCAkcHJvZ3JhbSB3b3VsZCBydW4uCi0JCQlUaGUgTERfUFJFTE9BRCBzaGFyZWQgb2JqZWN0IHdpbGwgYmUgYnVpbHQsCi0JCQlpZiBuZWVkZWQuICBBbHNvIG5vdGUgYW55IFhEVU1NWSogZW52aXJvbm1lbnQKLQkJCXZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgc2V0LgotCi0JLXByY29uZgkJUHJpbnQsIHRvIHN0ZG91dCwgdGhlIHR3ZWFrZWQgWG9yZy9YRnJlZTg2Ci0JCQljb25maWcgZmlsZSAoLWNvbmZpZyBhbmQgLXhmODZjb25maWcgc2VydmVyCi0JCQlvcHRpb25zLCByZXNwZWN0aXZlbHkuKSAgVGhlIFhzZXJ2ZXIgaXMgbm90Ci0JCQlzdGFydGVkLgotCi0JLW5vdHdlYWsJRG8gbm90IHR3ZWFrIChtb2RpZnkpIHRoZSBYb3JnL1hGcmVlODYgY29uZmlnIGZpbGUKLQkJCShzeXN0ZW0gb3Igc2VydmVyIGNvbW1hbmQgbGluZSkgYXQgYWxsLiAgVGhlIC1nZW9tCi0JCQlhbmQgc2ltaWxhciBjb25maWcgZmlsZSBtb2RpZmljYXRpb25zIGFyZSBpZ25vcmVkLgotCi0JCQlJdCBpcyB1cCB0byB5b3UgdG8gbWFrZSBzdXJlIGl0IGlzIGEgd29ya2luZwotCQkJY29uZmlnIGZpbGUgKGUuZy4gImR1bW15IiBkcml2ZXIsIGV0Yy4pCi0JCQlQZXJoYXBzIHlvdSB3YW50IHRvIHVzZSBhIGZpbGUgYmFzZWQgb24gdGhlCi0JCQktcHJjb25mIG91dHB1dC4KLQotCS1kZWJ1ZwkJRXh0cmEgZGVidWdnaW5nIG91dHB1dC4KLQotCS1zdHJhY2UJCXN0cmFjZSgxKSB0aGUgWHNlcnZlciBwcm9jZXNzIChmb3IgdHJvdWJsZXNob290aW5nLikKLQktbHRyYWNlCQlsdHJhY2UoMSkgaW5zdGVhZCBvZiBzdHJhY2UgKGNhbiBiZSBzbG93LikKLQotCS1oLCAtaGVscAlQcmludCBvdXQgdGhpcyBoZWxwLgotCi0KLSAgICBYc2VydmVyLWFyZ3M6Ci0KLQlNb3N0IG9mIHRoZSBYb3JnIGFuZCBYRnJlZTg2IG9wdGlvbnMgd2lsbCB3b3JrIGFuZCBhcmUgc2ltcGx5Ci0JcGFzc2VkIGFsb25nIGlmIHlvdSBzdXBwbHkgdGhlbS4gIEltcG9ydGFudCBvbmVzIHRoYXQgbWF5IGJlCi0Jc3VwcGxpZWQgaWYgbWlzc2luZzoKLQotCTpOCQlYIERpc3BsYXkgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gdXNlLgotCi0JdnROTgkJTGludXggdmlydHVhbCB0ZXJtaW5hbCAoVlQpIHRvIHVzZSAoYSBWVCBpcyBjdXJyZW50bHkKLQkJCXN0aWxsIHVzZWQsIGp1c3Qgbm90IHN3aXRjaGVkIHRvIGFuZCBmcm9tLikKLQotCS1jb25maWcgZmlsZQkJRHJpdmVyICJkdW1teSIgdHdlYWtlZCBjb25maWcgZmlsZSwgYQotCS14Zjg2Y29uZmlnIGZpbGUJbnVtYmVyIG9mIHNldHRpbmdzIGFyZSB0d2Vha2VkIGJlc2lkZXMgRHJpdmVyLgotCi0JSWYgLWNvbmZpZy8teGY4NmNvbmZpZyBpcyBub3QgZ2l2ZW4sIHRoZSBzeXN0ZW0gb25lCi0JKGUuZy4gL2V0Yy9YMTEveG9yZy5jb25mKSBpcyB1c2VkLiAgSWYgdGhlIHN5c3RlbSBvbmUgY2Fubm90IGJlCi0JZm91bmQsIGEgYnVpbHQtaW4gb25lIGlzIHVzZWQuCUFueSBzZXR0aW5ncyBpbiB0aGUgY29uZmlnIGZpbGUKLQl0aGF0IGFyZSBub3QgY29uc2lzdGVudCB3aXRoICJkdW1teSIgbW9kZSB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JKHVubGVzcyAtbm90d2VhayBpcyBzcGVjaWZpZWQuKQotCi0JVXNlIC1jb25maWcgeGR1bW15LWJ1aWx0aW4gdG8gZm9yY2UgdXNhZ2Ugb2YgdGhlIGJ1aWx0aW4gY29uZmlnLgotCi0JSWYgImZpbGUiIGlzIG9ubHkgYSBiYXNlbmFtZSAoZS5nLiAieG9yZy5kdW1teS5jb25mIikgd2l0aCBubyAvJ3MsCi0JdGhlbiBubyB0d2Vha2luZyBvZiBpdCBpcyBkb25lOiB0aGUgWCBzZXJ2ZXIgd2lsbCBsb29rIGZvciB0aGF0Ci0JYmFzZW5hbWUgdmlhIGl0cyBub3JtYWwgc2VhcmNoIGFsZ29yaXRobS4gIElmIHRoZSBmb3VuZCBmaWxlIGRvZXMKLQlub3QgcmVmZXIgdG8gdGhlICJkdW1teSIgZHJpdmVyLCBldGMsIHRoZW4gdGhlIFggc2VydmVyIHdpbGwgZmFpbC4KLQotTm90ZXM6Ci0KLSAgICBUaGUgWG9yZy9YRnJlZTg2ICJkdW1teSIgZHJpdmVyIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQuICBJdCB3b3JrcwotICAgIHdlbGwgaW4gdGhpcyBtb2RlLCBidXQgaXQgaXMgZXZpZGVudGx5IG5vdCBpbnRlbmRlZCBmb3IgZW5kLXVzZXJzLgotICAgIFNvIGl0IGNvdWxkIGJlIHJlbW92ZWQgb3IgYnJva2VuIGF0IGFueSB0aW1lLgotCi0gICAgSWYgdGhlIGRpc3BsYXkgWHNlcnZlci1hcmcgKGUuZy4gOjEpIGlzIG5vdCBnaXZlbiwgb3IgIjoiIGlzIGdpdmVuCi0gICAgdGhhdCBpbmRpY2F0ZXMgJHByb2dyYW0gc2hvdWxkIHRyeSB0byBmaW5kIGEgZnJlZSBvbmUgKGJhc2VkIG9uCi0gICAgdGNwIHBvcnRzLikKLQotICAgIElmIHRoZSBkaXNwbGF5IHZpcnR1YWwgdGVybWluYWwsIFZULCAoZS5nLiB2dDkpIGlzIG5vdCBnaXZlbiB0aGF0Ci0gICAgaW5kaWNhdGVzICRwcm9ncmFtIHNob3VsZCB0cnkgdG8gZmluZCBhIGZyZWUgb25lIChvciBndWVzcyBhIGhpZ2ggb25lLikgCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIG5vdCBjb21wbGV0ZWx5IHNlY3VyZSBXUlQgZmlsZXMgaW4gL3RtcCAoYnV0IGl0IHRyaWVzCi0gICAgdG8gYSBnb29kIGRlZ3JlZS4pICBCZXR0ZXIgaXMgdG8gdXNlIHRoZSAtdG1wZGlyIG9wdGlvbiB0byBzdXBwbHkgYQotICAgIGRpcmVjdG9yeSBvbmx5IHdyaXRhYmxlIGJ5IHlvdS4gIEV2ZW4gYmV0dGVyIGlzIHRvIGdldCByaWQgb2YgdXNlcnMKLSAgICBvbiB0aGUgbG9jYWwgbWFjaGluZSB5b3UgZG8gbm90IHRydXN0IDotKQotCi0gICAgU2V0IFhEVU1NWV9TRVRfWFY9MSB0byB0dXJuIG9uIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHRoaXMgc2NyaXB0LgotCi1FTkQKLX0KLQotd2FybigpIHsKLQllY2hvICIkKiIgMT4mMgotfQotCi1pZiBbICJYJFhEVU1NWV9TRVRfWFYiICE9ICJYIiBdOyB0aGVuCi0Jc2V0IC14dgotZmkKLQotaWYgWyAiWCRYRFVNTVlfVUlEIiA9ICJYIiBdOyB0aGVuCi0JWERVTU1ZX1VJRD1gaWQgLXVgCi0JZXhwb3J0IFhEVU1NWV9VSUQKLWZpCi1pZiBbICJYJFhEVU1NWV9VSUQiID0gIlgwIiBdOyB0aGVuCi0JaWYgWyAiWCRTVURPX1VJRCIgIT0gIlgiIF07IHRoZW4KLQkJWERVTU1ZX1VJRD0kU1VET19VSUQKLQkJZXhwb3J0IFhEVU1NWV9VSUQKLQlmaQotZmkKLQotIyBjaGVjayBpZiByb290PTEgZmlyc3Q6Ci0jCi1pZiBbICJYJFhEVU1NWV9SVU5fQVNfUk9PVCIgPSAiWDEiIF07IHRoZW4KLQlyb290PTEKLWZpCi1mb3IgYXJnIGluICQqCi1kbwotCWlmIFsgIlgkYXJnIiA9ICJYLW5vbnJvb3QiIF07IHRoZW4KLQkJcm9vdD0iIgotCWVsaWYgWyAiWCRhcmciID0gIlgtcm9vdCIgXTsgdGhlbgotCQlyb290PTEKLQlmaQotZG9uZQotCi0jIFNlZSBpZiBpdCByZWFsbHkgbmVlZHMgdG8gYmUgcnVuIGFzIHJvb3Q6Ci0jCi1pZiBbICJYJFhEVU1NWV9TVV9FWEVDIiA9ICJYIiAtYSAiWCRyb290IiA9ICJYMSIgLWEgIlhgaWQgLXVgIiAhPSAiWDAiICBdOyB0aGVuCi0JIyB0aGlzIGlzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHN1L3N1ZG8gZG9lc24ndCB3b3JrOgotCVhEVU1NWV9TVV9FWEVDPTEKLQlleHBvcnQgWERVTU1ZX1NVX0VYRUMKLQotCWRvc3U9MQotCW5vc3Vkbz0iIgotCi0JZm9yIGFyZyBpbiAkKgotCWRvCi0JCWlmIFsgIlgkYXJnIiA9ICJYLW5vbnJvb3QiIF07IHRoZW4KLQkJCWRvc3U9IiIKLQkJZWxpZiBbICJYJGFyZyIgPSAiWC1ub3N1ZG8iIF07IHRoZW4KLQkJCW5vc3Vkbz0iMSIKLQkJZWxpZiBbICJYJGFyZyIgPSAiWC1oZWxwIiBdOyB0aGVuCi0JCQlkb3N1PSIiCi0JCWVsaWYgWyAiWCRhcmciID0gIlgtaCIgXTsgdGhlbgotCQkJZG9zdT0iIgotCQllbGlmIFsgIlgkYXJnIiA9ICJYLWluc3RhbGwiIF07IHRoZW4KLQkJCWRvc3U9IiIKLQkJZWxpZiBbICJYJGFyZyIgPSAiWC11bmluc3RhbGwiIF07IHRoZW4KLQkJCWRvc3U9IiIKLQkJZWxpZiBbICJYJGFyZyIgPSAiWC1uIiBdOyB0aGVuCi0JCQlkb3N1PSIiCi0JCWVsaWYgWyAiWCRhcmciID0gIlgtcHJjb25mIiBdOyB0aGVuCi0JCQlkb3N1PSIiCi0JCWZpCi0JZG9uZQotCWlmIFsgJGRvc3UgXTsgdGhlbgotCQkjIHdlIG5lZWQgdG8gcmVzdGFydCBpdCB3aXRoIHN1L3N1ZG86Ci0JCWlmIHR5cGUgc3VkbyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCW5vc3Vkbz0xCi0JCWZpCi0JCWlmIFsgIlgkbm9zdWRvIiA9ICJYIiBdOyB0aGVuCi0JCQl3YXJuICIkcHJvZ3JhbTogc3VwcGx5IHRoZSBzdWRvIHBhc3N3b3JkIHRvIHJlc3RhcnQgYXMgcm9vdDoiCi0JCQlpZiBbICJYJFhEVU1NWV9VSUQiICE9ICJYIiBdOyB0aGVuCi0JCQkJZXhlYyBzdWRvICQwIC11aWQgJFhEVU1NWV9VSUQgIiRAIgotCQkJZWxzZQotCQkJCWV4ZWMgc3VkbyAkMCAiJEAiCi0JCQlmaQotCQllbHNlCi0JCQl3YXJuICIkcHJvZ3JhbTogc3VwcGx5IHRoZSByb290IHBhc3N3b3JkIHRvIHJlc3RhcnQgYXMgcm9vdDoiCi0JCQlpZiBbICJYJFhEVU1NWV9VSUQiICE9ICJYIiBdOyB0aGVuCi0JCQkJZXhlYyBzdSAtYyAiJDAgLXVpZCAkWERVTU1ZX1VJRCAkKiIKLQkJCWVsc2UKLQkJCQlleGVjIHN1IC1jICIkMCAkKiIKLQkJCWZpCi0JCWZpCi0JCSMgRE9ORToKLQkJZXhpdAotCWZpCi1maQotCi0jIFRoaXMgd2lsbCBob2xkIHRoZSBYIGRpc3BsYXksIGUuZy4gOjIwCi0jCi1kaXNwPSIiCi1hcmdzPSIiCi1jbWRsaW5lX2NvbmZpZz0iIgotCi0jIFByb2Nlc3MgWGR1bW15IGFyZ3M6Ci0jCi13aGlsZSBbICJYJDEiICE9ICJYIiBdCi1kbwotICAgIGlmIFsgIlgkMSIgPSAiWC1jb25maWciIC1vICJYJDEiID0gIlgteGY4NmNvbmZpZyIgXTsgdGhlbgotICAgIAljbWRsaW5lX2NvbmZpZz0iJDIiCi0gICAgZmkKLSAgICBjYXNlICQxIGluIAotCSI6IiopCWRpc3A9JDEKLSAgICAgICAgICAgICAgICA7OwotCSItaW5zdGFsbCIpIGluc3RhbGw9MTsgcnVuaXQ9IiIKLSAgICAgICAgICAgICAgICA7OwotCSItdW5pbnN0YWxsIikgdW5pbnN0YWxsPTE7IHJ1bml0PSIiCi0gICAgICAgICAgICAgICAgOzsKLQkiLW4iKSAgcnVuaXQ9IiIKLSAgICAgICAgICAgICAgICA7OwotCSItbm8iKSBydW5pdD0iIgotICAgICAgICAgICAgICAgIDs7Ci0JIi1ub3J1biIpIHJ1bml0PSIiCi0gICAgICAgICAgICAgICAgOzsKLQkiLXByY29uZiIpIHByY29uZj0xOyBydW5pdD0iIgotICAgICAgICAgICAgICAgIDs7Ci0JIi1ub3R3ZWFrIikgbm90d2Vhaz0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLW5vY29uZiIpICBub3R3ZWFrPTEKLSAgICAgICAgICAgICAgICA7OwotCSItbm9ucm9vdCIpIHJvb3Q9IiIKLSAgICAgICAgICAgICAgICA7OwotCSItcm9vdCIpICAgIHJvb3Q9MQotICAgICAgICAgICAgICAgIDs7Ci0JIi1ub3N1ZG8iKSBub3N1ZG89MQotICAgICAgICAgICAgICAgIDs7Ci0JIi14c2VydmVyIikgeHNlcnZlcj0iJDIiOyBzaGlmdAotICAgICAgICAgICAgICAgIDs7Ci0JIi11aWQiKSBYRFVNTVlfVUlEPSIkMiI7IHNoaWZ0Ci0JCWV4cG9ydCBYRFVNTVlfVUlECi0gICAgICAgICAgICAgICAgOzsKLQkiLWdlb20iKSAgICAgZ2VvbT0iJDIiOyBzaGlmdAotICAgICAgICAgICAgICAgIDs7Ci0JIi1nZW9tZXRyeSIpIGdlb209IiQyIjsgc2hpZnQKLSAgICAgICAgICAgICAgICA7OwotCSItbm9tb2RlbGluZXMiKSBub21vZGVsaW5lcz0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLWRlcHRoIikgZGVwdGg9IiQyIjsgYXJncz0iJGFyZ3MgLWRlcHRoICQyIjsKLQkJICBzaGlmdAotICAgICAgICAgICAgICAgIDs7Ci0JIi1ERVBUSCIpIGRlcHRoPSIkMiI7IHNoaWZ0Ci0gICAgICAgICAgICAgICAgOzsKLQkiLXRtcGRpciIpIFhEVU1NWV9UTVBESVI9IiQyIjsgc2hpZnQKLSAgICAgICAgICAgICAgICA7OwotCSItZGVidWciKSAgIGRlYnVnPTEKLSAgICAgICAgICAgICAgICA7OwotCSItbm9kZWJ1ZyIpIGRlYnVnPSIiCi0gICAgICAgICAgICAgICAgOzsKLQkiLXN0cmFjZSIpIHN0cmFjZT0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLWx0cmFjZSIpIHN0cmFjZT0yCi0gICAgICAgICAgICAgICAgOzsKLQkiLWgiKQkgaGVscDsgZXhpdCAwCi0gICAgICAgICAgICAgICAgOzsKLQkiLWhlbHAiKSBoZWxwOyBleGl0IDAKLSAgICAgICAgICAgICAgICA7OwotCSopCWFyZ3M9IiRhcmdzICQxIgotICAgICAgICAgICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0Ci1kb25lCi0KLSMgVHJ5IHRvIGdldCBhIHVzZXJuYW1lIGZvciB1c2UgaW4gb3VyIHRtcCBkaXJlY3RvcnksIGV0Yy4KLSMKLXVzZXI9IiIKLWlmIFsgWGBpZCAtdWAgPSAiWDAiICBdOyB0aGVuCi0JdXNlcj1yb290CSMgdGhpcyB3aWxsIGFsc28gYmUgdXNlZCBiZWxvdyBmb3IgaWQ9MAotZWxpZiBbICJYJFVTRVIiICE9ICJYIiBdOyB0aGVuCi0JdXNlcj0kVVNFUgotZWxpZiBbICJYJExPR05BTUUiICE9ICJYIiBdOyB0aGVuCi0JdXNlcj0kTE9HTkFNRQotZmkKLQotIyBLZWVwIHRyeWluZy4uLgotIwotaWYgWyAiWCR1c2VyIiA9ICJYIiBdOyB0aGVuCi0JdXNlcj1gd2hvYW1pIDI+L2Rldi9udWxsYAotZmkKLWlmIFsgIlgkdXNlciIgPSAiWCIgXTsgdGhlbgotCXVzZXI9YGJhc2VuYW1lICIkSE9NRSJgCi1maQotaWYgWyAiWCR1c2VyIiA9ICJYIiAtbyAiWCR1c2VyIiA9ICJYLiIgXTsgdGhlbgotCXVzZXI9InUkJCIKLWZpCi0KLWlmIFsgIlgkZGVidWciID0gIlgxIiAtYSAiWCRydW5pdCIgIT0gIlgiIF07IHRoZW4KLQllY2hvICIiCi0JZWNobyAiL3Vzci9iaW4vZW52OiIKLQllbnYgfCBlZ3JlcCAtdiAnXihMU19DT0xPUlN8VEVSTUNBUCknIHwgc29ydAotCWVjaG8gIiIKLWZpCi0KLSMgRnVuY3Rpb24gdG8gY29tcGlsZSB0aGUgTERfUFJFTE9BRCBzaGFyZWQgb2JqZWN0OgotIwotbWFrZV9zbygpIHsKLQkjIGV4dHJhY3QgY29kZSBlbWJlZGRlZCBpbiB0aGlzIHNjcmlwdCBpbnRvIGEgdG1wIEMgZmlsZTogCi0JbjE9YGdyZXAgLW4gJ14jY29kZV9iZWdpbicgJDAgfCBoZWFkIC0xIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi0JbjI9YGdyZXAgLW4gJ14jY29kZV9lbmQnICAgJDAgfCBoZWFkIC0xIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi0JbjE9YGV4cHIgJG4xICsgMWAKLQlkbj1gZXhwciAkbjIgLSAkbjFgCi0KLQl0bXA9JHRkaXIvWGR1bW15LiRSQU5ET00kJC5jCi0Jcm0gLWYgJHRtcAotCWlmIFsgLWUgJHRtcCAtbyAtaCAkdG1wIF07IHRoZW4KLQkJd2FybiAiJHRtcCBzdGlsbCBleGlzdHMuIgotCQlleGl0IDEKLQlmaQotCXRvdWNoICR0bXAgfHwgZXhpdCAxCi0JdGFpbCAtbiArJG4xICQwIHwgaGVhZCAtbiAkZG4gPiAkdG1wCi0KLQkjIGNvbXBpbGUgaXQgdG8gWGR1bW15LnNvOgotCWlmIFsgLWYgIiRTTyIgXTsgdGhlbgotCQltdiAkU08gJFNPLiQkCi0JCXJtIC1mICRTTy4kJAotCWZpCi0Jcm0gLWYgJFNPCi0JdG91Y2ggJFNPCi0JaWYgWyAhIC1mICIkU08iIF07IHRoZW4KLQkJU089JHRkaXIvWGR1bW15LiR1c2VyLnNvCi0JCXdhcm4gIndhcm5pbmcgc3dpdGNoaW5nIExEX1BSRUxPQUQgc2hhcmVkIG9iamVjdCB0bzogJFNPIgotCWZpCi0KLQlpZiBbIC1mICIkU08iIF07IHRoZW4KLQkJbXYgJFNPICRTTy4kJAotCQlybSAtZiAkU08uJCQKLQlmaQotCXJtIC1mICRTTwotCi0JIyB3ZSBhc3N1bWUgZ2NjOgotCWlmIFsgIlgkSU5URVJQT1NFX0dFVFVJRCIgPSAiWDEiIF07IHRoZW4KLQkJQ0ZMQUdTPSIkQ0ZMQUdTIC1ESU5URVJQT1NFX0dFVFVJRCIKLQlmaQotCWVjaG8gIiRwcm9ncmFtOiIgY2MgLXNoYXJlZCAtZlBJQyAkQ0ZMQUdTIC1vICRTTyAkdG1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2MgLXNoYXJlZCAtZlBJQyAkQ0ZMQUdTIC1vICRTTyAkdG1wCi0JcmM9JD8KLQlybSAtZiAkdG1wCi0JaWYgWyAkcmMgIT0gMCBdOyB0aGVuCi0JCXdhcm4gIiRwcm9ncmFtOiBjYW5ub3QgYnVpbGQgJFNPIgotCQlleGl0IDEKLQlmaQotCWlmIFsgIlgkZGVidWciICE9ICJYIiAtbyAiWCRpbnN0YWxsIiAhPSAiWCIgXTsgdGhlbgotCQl3YXJuICIkcHJvZ3JhbTogY3JlYXRlZCAgJFNPIgotCQlscyAtbCAiJFNPIgotCWZpCi19Ci0KLSMgU2V0IHRkaXIgdG8gdG1wIGRpciBmb3IgbWFrZV9zbygpOgotaWYgWyAiWCRYRFVNTVlfVE1QRElSIiAhPSAiWCIgXTsgdGhlbgotCXRkaXI9JFhEVU1NWV9UTVBESVIKLQlta2RpciAtcCAkdGRpcgotZWxzZQotCXRkaXI9Ii90bXAiCi1maQotCi0jIEhhbmRsZSAtaW5zdGFsbC8tdW5pbnN0YWxsIGNhc2U6Ci1TTz0kMC5zbwotaWYgWyAiWCRpbnN0YWxsIiAhPSAiWCIgLW8gIlgkdW5pbnN0YWxsIiAhPSAiWCIgXTsgdGhlbgotCWlmIFsgLWUgIiRTTyIgLW8gLWggIiRTTyIgXTsgdGhlbgotCQl3YXJuICIkcHJvZ3JhbTogcmVtb3ZpbmcgJFNPIgotCWZpCi0JaWYgWyAtZiAiJFNPIiBdOyB0aGVuCi0JCW12ICRTTyAkU08uJCQKLQkJcm0gLWYgJFNPLiQkCi0JZmkKLQlybSAtZiAkU08KLQlpZiBbIC1lICIkU08iIC1vIC1oICIkU08iIF07IHRoZW4KLQkJd2FybiAid2FybmluZzogJFNPIHN0aWxsIGV4aXN0cy4iCi0JCWV4aXQgMQotCWZpCi0JaWYgWyAkaW5zdGFsbCBdOyB0aGVuCi0JCW1ha2Vfc28KLQkJaWYgWyAhIC1mICIkU08iIF07IHRoZW4KLQkJCWV4aXQgMQotCQlmaQotCWZpCi0JZXhpdCAwCi1maQotCi0jIFdlIG5lZWQgYSB0bXAgZGlyZWN0b3J5IGZvciB0aGUgLnNvLCB0d2Vha2VkIGNvbmZpZyBmaWxlLCBhbmQgZm9yCi0jIHJlZGlyZWN0aW5nIGZpbGVuYW1lcyB3ZSBjYW5ub3QgY3JlYXRlICh1bmRlciAtbm9ucm9vdCkKLSMKLXRhY2s9IiIKLWlmIFsgIlgkWERVTU1ZX1RNUERJUiIgPSAiWCIgXTsgdGhlbgotCVhEVU1NWV9UTVBESVI9Ii90bXAvWGR1bW15LiR1c2VyIgotCi0JIyB0cnkgdG8gdGFjayBvbiBhIHVuaXF1ZSBzdWJkaXIgKGRpc3BsYXkgbnVtYmVyIG9yIHBpZCkKLQkjIHRvIGFsbG93IG11bHRpcGxlIGluc3RhbmNlcwotCSMKLQlpZiBbICJYJGRpc3AiICE9ICJYIiBdOyB0aGVuCi0JCXQwPSRkaXNwCi0JZWxzZQotCQl0MD0kMQotCWZpCi0JdGFjaz1gZWNobyAiJHQwIiB8IHNlZCAtZSAncy9eLio6Ly8nYAotCWlmIGVjaG8gIiR0YWNrIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuCi0JCToKLQllbHNlCi0JCXRhY2s9JCQKLQlmaQotCWlmIFsgIlgkdGFjayIgIT0gIlgiIF07IHRoZW4KLQkJWERVTU1ZX1RNUERJUj0iJFhEVU1NWV9UTVBESVIvJHRhY2siCi0JZmkKLWZpCi0KLXRtcD0kWERVTU1ZX1RNUERJUgotaWYgZWNobyAiJHRtcCIgfCBncmVwICdeL3RtcCcgPiAvZGV2L251bGw7IHRoZW4KLQlpZiBbICJYJHRtcCIgIT0gIlgvdG1wIiAtYSAiWCR0bXAiICE9ICJYL3RtcC8iIF07IHRoZW4KLQkJIyBjbGVhbiB0aGlzIHN1YmRpciBvZiAvdG1wIG91dCwgb3RoZXJ3aXNlIGxlYXZlIGl0Li4uCi0JCXJtIC1yZiAkWERVTU1ZX1RNUERJUgotCQlpZiBbIC1lICRYRFVNTVlfVE1QRElSIF07IHRoZW4KLQkJCXdhcm4gIiRYRFVNTVlfVE1QRElSIHN0aWxsIGV4aXN0cyIKLQkJCWV4aXQgMQotCQlmaQotCWZpCi1maQotCi1ta2RpciAtcCAkWERVTU1ZX1RNUERJUgotY2htb2QgNzAwICRYRFVNTVlfVE1QRElSCi1pZiBbICJYJHRhY2siICE9ICJYIiBdOyB0aGVuCi0JY2htb2QgNzAwIGBkaXJuYW1lICIkWERVTU1ZX1RNUERJUiJgIDI+L2Rldi9udWxsCi1maQotCi0jIFNlZSBpZiB3ZSBjYW4gd3JpdGUgc29tZXRoaW5nIHRoZXJlOgotIwotdGZpbGU9IiRYRFVNTVlfVE1QRElSL3Rlc3QuZmlsZSIKLXRvdWNoICR0ZmlsZQotaWYgWyAhIC1mICIkdGZpbGUiIF07IHRoZW4KLQlYRFVNTVlfVE1QRElSPSIvdG1wL1hkdW1teS4kJC4kVVNFUiIKLQl3YXJuICJ3YXJuaW5nOiBzZXR0aW5nIHRtcGRpciB0byAkWERVTU1ZX1RNUERJUiAuLi4iCi0Jcm0gLXJmICRYRFVNTVlfVE1QRElSIHx8IGV4aXQgMQotCW1rZGlyIC1wICRYRFVNTVlfVE1QRElSIHx8IGV4aXQgMQotZmkKLXJtIC1mICR0ZmlsZQotCi1leHBvcnQgWERVTU1ZX1RNUERJUgotCi0jIENvbXBpbGUgdGhlIExEX1BSRUxPQUQgc2hhcmVkIG9iamVjdCBpZiBuZWVkZWQgKG5lZWRzIFhEVU1NWV9UTVBESVIpCi0jCi1pZiBbICEgLWYgIiRTTyIgXTsgdGhlbgotCVNPPSIkWERVTU1ZX1RNUERJUi9YZHVtbXkuc28iCi0JbWFrZV9zbwotZmkKLQotIyBEZWNpZGUgd2hpY2ggWCBzZXJ2ZXIgdG8gdXNlOgotIwotaWYgWyAiWCR4c2VydmVyIiA9ICJYIiBdOyB0aGVuCi0JaWYgdHlwZSBYb3JnID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQl4c2VydmVyPSJYb3JnIgotCWVsaWYgdHlwZSBYRnJlZTg2ID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQl4c2VydmVyPSJYRnJlZTg2IgotCWVsaWYgLXggL3Vzci9iaW4vWG9yZzsgdGhlbgotCQl4c2VydmVyPSIvdXNyL2Jpbi9Yb3JnIgotCWVsaWYgLXggL3Vzci9YMTFSNi9iaW4vWG9yZzsgdGhlbgotCQl4c2VydmVyPSIvdXNyL1gxMVI2L2Jpbi9Yb3JnIgotCWVsaWYgLXggL3Vzci9YMTFSNi9iaW4vWEZyZWU4NjsgdGhlbgotCQl4c2VydmVyPSIvdXNyL1gxMVI2L2Jpbi9YRnJlZTg2IgotCWZpCi0JaWYgWyAiWCR4c2VydmVyIiA9ICJYIiBdOyB0aGVuCi0JCSMganVzdCBsZXQgaXQgZmFpbCBiZWxvdy4KLQkJeHNlcnZlcj0iL3Vzci9iaW4vWG9yZyIKLQkJd2FybiAiJHByb2dyYW06IGNhbm5vdCBsb2NhdGUgYSBzdG9jayBYc2VydmVyLi4uIGFzc3VtaW5nICR4c2VydmVyIgotCWZpCi1maQotCi0jIFNlZSBpZiB0aGUgYmluYXJ5IGlzIHN1aWQgb3Igbm90IHJlYWRhYmxlIHVuZGVyIC1ub25yb290IG1vZGU6Ci0jCi1pZiBbICJYJEJBU0hfVkVSU0lPTiIgIT0gIlgiIF07IHRoZW4KLQl4c2VydmVyX3BhdGg9YHR5cGUgLXAgJHhzZXJ2ZXIgMj4vZGV2L251bGxgCi1lbHNlCi0JeHNlcnZlcl9wYXRoPWB0eXBlICR4c2VydmVyIDI+L2Rldi9udWxsIHwgYXdrICd7cHJpbnQgJE5GfSdgCi1maQotaWYgWyAtZSAiJHhzZXJ2ZXJfcGF0aCIgLWEgIlgkcm9vdCIgPSAiWCIgLWEgIlgkcnVuaXQiICE9ICJYIiBdOyB0aGVuCi0JaWYgWyAhIC1yICR4c2VydmVyX3BhdGggLW8gLXUgJHhzZXJ2ZXJfcGF0aCAtbyAtZyAkeHNlcnZlcl9wYXRoIF07IHRoZW4KLQkJIyBYWFggbm90IHF1aXRlIGNvcnJlY3Qgd2l0aCBybSAtcmYgJFhEVU1NWV9UTVBESVIgLi4uCi0JCSMgd2Uga2VlcCBvbiBhIGZpbGVzeXN0ZW0gd2Uga25vdyByb290IGNhbiB3cml0ZSB0by4KLQkJYmFzZT1gYmFzZW5hbWUgIiR4c2VydmVyX3BhdGgiYAotCQluZXc9Ii90bXAvJGJhc2UuJHVzZXIuYmluIgotCQlpZiBbIC1lICRuZXcgXTsgdGhlbgotCQkJc25ldz1gbHMgLWwgJG5ldyAgICAgICAgICB8IGF3ayAne3ByaW50ICQ1fScgfCBncmVwICdeWzAtOV1bMC05XSokJ2AKLQkJCXNvbGQ9YGxzIC1sICR4c2VydmVyX3BhdGggfCBhd2sgJ3twcmludCAkNX0nIHwgZ3JlcCAnXlswLTldWzAtOV0qJCdgCi0JCQlpZiBbICJYJHNuZXciICE9ICJYIiAtYSAiWCRzb2xkIiAhPSAiWCIgLWEgIlgkc29sZCIgIT0gIlgkc25ldyIgXTsgdGhlbgotCQkJCXdhcm4gInJlbW92aW5nIGRpZmZlcmVudCBzaXplZCBjb3B5OiIKLQkJCQlscyAtbCAkbmV3ICR4c2VydmVyX3BhdGgKLQkJCQlybSAtZiAkbmV3Ci0JCQlmaQotCQlmaQotCQlpZiBbICEgLWUgJG5ldyAtbyAhIC1zICRuZXcgXTsgdGhlbgotCQkJcm0gLWYgJG5ldwotCQkJdG91Y2ggJG5ldyB8fCBleGl0IDEKLQkJCWNobW9kIDcwMCAkbmV3IHx8IGV4aXQgMQotCQkJaWYgWyAhIC1yICR4c2VydmVyX3BhdGggXTsgdGhlbgotCQkJCXdhcm4gIiIKLQkJCQl3YXJuICJORUVEIFRPIENPUFkgVU5SRUFEQUJMRSAkeHNlcnZlcl9wYXRoIHRvICRuZXcgYXMgcm9vdDoiCi0JCQkJd2FybiAiIgotCQkJCWxzIC1sICR4c2VydmVyX3BhdGggMT4mMgotCQkJCXdhcm4gIiIKLQkJCQl3YXJuICJUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlOiIKLQkJCQl3YXJuICIgICAgY2F0ICR4c2VydmVyX3BhdGggPiAkbmV3IgotCQkJCXdhcm4gIiIKLQkJCQlub3M9JG5vc3VkbwotCQkJCWlmIHR5cGUgc3VkbyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQkJCToKLQkJCQllbHNlCi0JCQkJCW5vcz0xCi0JCQkJZmkKLQkJCQlpZiBbICJYJG5vcyIgPSAiWDEiIF07IHRoZW4KLQkJCQkJd2FybiAiUGxlYXNlIHN1cHBseSByb290IHBhc3N3ZCB0byAnc3UgLWMnIgotCQkJCQlzdSAtYyAiY2F0ICR4c2VydmVyX3BhdGggPiAkbmV3IgotCQkJCWVsc2UKLQkJCQkJd2FybiAiUGxlYXNlIHN1cHBseSB0aGUgc3VkbyBwYXNzd2QgaWYgYXNrZWQ6IgotCQkJCQlzdWRvIC9iaW4vc2ggLWMgImNhdCAkeHNlcnZlcl9wYXRoID4gJG5ldyIKLQkJCQlmaQotCQkJZWxzZQotCQkJCXdhcm4gIiIKLQkJCQl3YXJuICJDT1BZSU5HIFNFVFVJRCAkeHNlcnZlcl9wYXRoIHRvICRuZXciCi0JCQkJd2FybiAiIgotCQkJCWxzIC1sICR4c2VydmVyX3BhdGggMT4mMgotCQkJCXdhcm4gIiIKLQkJCQljYXQgJHhzZXJ2ZXJfcGF0aCA+ICRuZXcKLQkJCWZpCi0JCQlscyAtbCAkbmV3Ci0JCQlpZiBbIC1zICRuZXcgXTsgdGhlbgotCQkJCToKLQkJCWVsc2UKLQkJCQlybSAtZiAkbmV3Ci0JCQkJbHMgLWwgJG5ldwotCQkJCWV4aXQgMQotCQkJZmkKLQkJCXdhcm4gIiIKLQkJCXdhcm4gIlBsZWFzZSByZXN0YXJ0IFhkdW1teSBub3cuIgotCQkJZXhpdCAwCi0JCWZpCi0JCWlmIFsgISAtTyAkbmV3IF07IHRoZW4KLQkJCXdhcm4gImZpbGUgXCIkbmV3XCIgbm90IG93bmVkIGJ5IHVzISIKLQkJCWxzIC1sICRuZXcKLQkJCWV4aXQgMQotCQlmaQotCQl4c2VydmVyPSRuZXcKLQlmaSAKLWZpCi0KLSMgV29yayBvdXQgZGlzcGxheToKLSMKLWlmIFsgIlgkZGlzcCIgIT0gIlgiIF07IHRoZW4KLQk6Ci1lbGlmIFsgIlgkMSIgIT0gIlgiIF07IHRoZW4KLQlpZiBlY2hvICIkMSIgfCBncmVwICdeOlswLTldJyA+IC9kZXYvbnVsbDsgdGhlbgotCQlkaXNwPSQxCi0JCXNoaWZ0Ci0JZWxpZiBbICJYJDEiID0gIlg6IiBdOyB0aGVuCi0JCSMgIjoiIG1lYW5zIGZvciB1cyB0byBmaW5kIG9uZS4KLQkJc2hpZnQKLQlmaQotZmkKLWlmIFsgIlgkZGlzcCIgPSAiWCIgLW8gIlgkZGlzcCIgPSAiWDoiIF07IHRoZW4KLQkjIHRyeSB0byBmaW5kIGFuIG9wZW4gZGlzcGxheSBwb3J0OgotCSMgKHRjcCBvdXRkYXRlZC4uLikKLQlwb3J0cz1gbmV0c3RhdCAtYW50IHwgZ3JlcCBMSVNURU4gfCBhd2sgJ3twcmludCAkNH0nIHwgc2VkIC1lICdzL14uKjovLydgCi0Jbj0wCi0Jd2hpbGUgWyAkbiAtbGUgMjAgXQotCWRvCi0JCXBvcnQ9YHByaW50ZiAiNjAlMDJkIiAkbmAKLQkJaWYgZWNobyAiJHBvcnRzIiB8IGdyZXAgIl4ke3BvcnR9XCQiID4gL2Rldi9udWxsOyB0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCWRpc3A9IjokbiIKLQkJCXdhcm4gIiRwcm9ncmFtOiBhdXRvLXNlbGVjdGVkIERJU1BMQVkgJGRpc3AiCi0JCQlicmVhawkKLQkJZmkKLQkJbj1gZXhwciAkbiArIDFgCi0JZG9uZQotZmkKLQotIyBXb3JrIG91dCB3aGljaCB2dCB0byB1c2UsIHRyeSB0byBmaW5kL2d1ZXNzIGFuIG9wZW4gb25lIGlmIG5lY2Vzc2FyeS4KLSMKLXZ0PSIiCi1mb3IgYXJnIGluICQqCi1kbwotCWlmIGVjaG8gIiRhcmciIHwgZ3JlcCAnXnZ0JyA+IC9kZXYvbnVsbDsgdGhlbgotCQl2dD0kYXJnCi0JCWJyZWFrCi0JZmkKLWRvbmUKLWlmIFsgIlgkdnQiID0gIlgiIF07IHRoZW4KLQlpZiBbICJYJHVzZXIiID0gIlhyb290IiBdOyB0aGVuCi0JCSMgcm9vdCBjYW4gdXNlciBmdXNlcigxKSB0byBzZWUgaWYgaXQgaXMgaW4gdXNlOgotCQlpZiB0eXBlIGZ1c2VyID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJIyB0cnkgL2Rldi90dHkxNyB0aHJ1IC9kZXYvdHR5MzIKLQkJCW49MTcKLQkJCXdoaWxlIFsgJG4gLWxlIDMyIF0KLQkJCWRvCi0JCQkJZGV2PSIvZGV2L3R0eSRuIgotCQkJCWlmIGZ1c2VyICRkZXYgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQkJCToKLQkJCQllbHNlCi0JCQkJCXZ0PSJ2dCRuIgotCQkJCQl3YXJuICIkcHJvZ3JhbTogYXV0by1zZWxlY3RlZCBWVCAkdnQgPT4gJGRldiIKLQkJCQkJYnJlYWsKLQkJCQlmaQotCQkJCW49YGV4cHIgJG4gKyAxYAotCQkJZG9uZQotCQlmaQotCWZpCi0JaWYgWyAiWCR2dCIgPSAiWCIgXTsgdGhlbgotCQkjIHRha2UgYSB3aWxkIGd1ZXNzLi4uCi0JCXZ0PXZ0MTYKLQkJd2FybiAiJHByb2dyYW06IHNlbGVjdGVkIGZhbGxiYWNrIFZUICR2dCIKLQlmaQotZWxzZQotCXZ0PSIiCi1maQotCi0jIERlY2lkZSBmbGF2b3Igb2YgWHNlcnZlcjoKLSMKLXN0eXBlPWBiYXNlbmFtZSAiJHhzZXJ2ZXIiYAotaWYgZWNobyAiJHN0eXBlIiB8IGdyZXAgLWkgeGZyZWU4NiA+IC9kZXYvbnVsbDsgdGhlbgotCXN0eXBlPXhmcmVlODYKLWVsc2UKLQlzdHlwZT14b3JnCi1maQotCi10d2Vha19jb25maWcoKSB7Ci0gICAgaW49IiQxIgotICAgIGNvbmZpZzI9IiRYRFVNTVlfVE1QRElSL3hkdW1teV9tb2RpZmllZF94Y29uZmlnLmNvbmYiCi0gICAgaWYgWyAiWCRkaXNwIiAhPSAiWCIgXTsgdGhlbgotICAgIAlkPWBlY2hvICIkZGlzcCIgfCBzZWQgLWUgJ3MsLywsZycgLWUgJ3MvOi9fL2cnYAotCWNvbmZpZzI9IiRjb25maWcyJGQiCi0gICAgZmkKLSAgICAKLSAgICAjIHBlcmwgc2NyaXB0IHRvIHR3ZWFrIHRoZSBjb25maWcgZmlsZS4uLiBhZGQvZGVsZXRlIG9wdGlvbnMsIGV0Yy4KLSAgICAjCi0gICAgZW52IFhEVU1NWV9HRU9NPSRnZW9tIFwKLSAgICAgICAgWERVTU1ZX0RFUFRIPSRkZXB0aCBcCi0gICAgICAgIFhEVU1NWV9OT01PREVMSU5FUz0kbm9tb2RlbGluZXMgXAotICAgICAgICBwZXJsID4gJGNvbmZpZzIgPCAkaW4gLWUgJwotICAgICRuID0gMDsKLSAgICAkZ2VvbSAgPSAkRU5We1hEVU1NWV9HRU9NfTsKLSAgICAkZGVwdGggPSAkRU5We1hEVU1NWV9ERVBUSH07Ci0gICAgJG5vbW9kZWxpbmVzID0gJEVOVntYRFVNTVlfTk9NT0RFTElORVN9OwotICAgICRtb2RlX3N0ciA9ICIiOwotICAgICR2aWRlb3JhbSA9ICIyNDAwMCI7Ci0gICAgJEhvcml6U3luYyAgID0gIjMwLjAgLSAxMzAuMCI7Ci0gICAgJFZlcnRSZWZyZXNoID0gIjUwLjAgLSAyNTAuMCI7Ci0gICAgaWYgKCRnZW9tIG5lICIiKSB7Ci0gICAgCW15ICR0bXAgPSAiIjsKLQlmb3JlYWNoICRnIChzcGxpdCgvLC8sICRnZW9tKSkgewotCQkkdG1wIC49ICJcIiRnXCIgIjsKLQkJaWYgKCEkbm9tb2RlbGluZXMgJiYgJGcgPX4gLyhcZCspeChcZCspLykgewotCQkJbXkgJHcgPSAkMTsKLQkJCW15ICRoID0gJDI7Ci0JCQkkbW9kZV9zdHIgLj0gIiAgTW9kZWxpbmUgXCIkZ1wiICI7Ci0JCQlteSAkZG90ID0gc3ByaW50ZigiJS4yZiIsICR3ICogJGggKiA3MCAqIDEuZS02KTsKLQkJCSRtb2RlX3N0ciAuPSAkZG90OwotCQkJJG1vZGVfc3RyIC49ICIgIiAuICR3OwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgxLjAyICogJHcpOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgxLjEwICogJHcpOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgxLjIwICogJHcpOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuICRoOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgkaCArIDEpOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgkaCArIDMpOwotCQkJJG1vZGVfc3RyIC49ICIgIiAuIGludCgkaCArIDIwKTsKLQkJCSRtb2RlX3N0ciAuPSAiXG4iOwotCQl9Ci0JfQotCSR0bXAgPX4gcy9ccyokLy87Ci0JJGdlb20gPSAkdG1wOwotICAgIH0KLSAgICB3aGlsZSAoPD4pIHsKLQlpZiAoJEVOVntYRFVNTVlfTk9UV0VBS30pIHsKLQkJcHJpbnQgJF87Ci0JCW5leHQ7Ci0JfQotCSRuKys7Ci0JaWYgKC9eXHMqIy8pIHsKLQkJIyBwYXNzIGNvbW1lbnRzIHN0cmFpZ2h0IHRocnUKLQkJcHJpbnQ7Ci0JCW5leHQ7Ci0JfQotCWlmICgvXlxzKlNlY3Rpb25ccysoXFMrKS9pKSB7Ci0JCSMgc3RhcnQgb2YgU2VjdGlvbgotCQkkc2VjdCA9ICQxOwotCQkkc2VjdCA9fiBzL1xXLy9nOwotCQkkc2VjdCA9fiB5L0EtWi9hLXovOwotCQkkc2VjdHN7JHNlY3R9ID0gMTsKLQkJcHJpbnQ7Ci0JCW5leHQ7Ci0JfQotCWlmICgvXlxzKkVuZFNlY3Rpb24vaSkgewotCQkjIGVuZCBvZiBTZWN0aW9uCi0JCWlmICgkc2VjdCBlcSAic2VydmVyZmxhZ3MiKSB7Ci0JCQlpZiAoISRnb3RfRG9udFZUU3dpdGNoKSB7Ci0JCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJcHJpbnQgIiAgT3B0aW9uIFwiRG9udFZUU3dpdGNoXCIgXCJ0cnVlXCJcbiI7Ci0JCQl9Ci0JCQlpZiAoISRnb3RfQWxsb3dNb3VzZU9wZW5GYWlsKSB7Ci0JCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJcHJpbnQgIiAgT3B0aW9uIFwiQWxsb3dNb3VzZU9wZW5GYWlsXCIgXCJ0cnVlXCJcbiI7Ci0JCQl9Ci0JCQlpZiAoISRnb3RfUGNpRm9yY2VOb25lKSB7Ci0JCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJcHJpbnQgIiAgT3B0aW9uIFwiUGNpRm9yY2VOb25lXCIgXCJ0cnVlXCJcbiI7Ci0JCQl9Ci0JCX0gZWxzaWYgKCRzZWN0IGVxICJkZXZpY2UiKSB7Ci0JCQlpZiAoISRnb3RfRHJpdmVyKSB7Ci0JCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJcHJpbnQgIiAgRHJpdmVyIFwiZHVtbXlcIlxuIjsKLQkJCX0KLQkJCWlmICghJGdvdF9WaWRlb1JhbSkgewotCQkJCXByaW50ICIgICMjWGR1bW15OiMjXG4iOwotCQkJCXByaW50ICIgIFZpZGVvUmFtICR2aWRlb3JhbVxuIjsKLQkJCX0KLQkJfSBlbHNpZiAoJHNlY3QgZXEgInNjcmVlbiIpIHsKLQkJCWlmICgkZGVwdGggbmUgIiIgJiYgIWdvdF9EZWZhdWx0RGVwdGgpIHsKLQkJCQlwcmludCAiICAjI1hkdW1teTojI1xuIjsKLQkJCQlwcmludCAiICBEZWZhdWx0RGVwdGggJGRlcHRoXG4iOwotCQkJfQotCQkJaWYgKCRnb3RfTW9uaXRvciBlcSAiIikgewotCQkJCXByaW50ICIgICMjWGR1bW15OiMjXG4iOwotCQkJCXByaW50ICIgIE1vbml0b3IgXCJNb25pdG9yMFwiXG4iOwotCQkJfQotCQl9IGVsc2lmICgkc2VjdCBlcSAibW9uaXRvciIpIHsKLQkJCWlmICghZ290X0hvcml6U3luYykgewotCQkJCXByaW50ICIgICMjWGR1bW15OiMjXG4iOwotCQkJCXByaW50ICIgIEhvcml6U3luYyAgICRIb3JpelN5bmNcbiI7Ci0JCQl9Ci0JCQlpZiAoIWdvdF9WZXJ0UmVmcmVzaCkgewotCQkJCXByaW50ICIgICMjWGR1bW15OiMjXG4iOwotCQkJCXByaW50ICIgIFZlcnRSZWZyZXNoICRWZXJ0UmVmcmVzaFxuIjsKLQkJCX0KLQkJCWlmICghJG5vbW9kZWxpbmVzKSB7Ci0JCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJcHJpbnQgJG1vZGVfc3RyOwotCQkJfQotCQl9Ci0JCSRzZWN0ID0gIiI7Ci0JCXByaW50OwotCQluZXh0OwotCX0KLQotCWlmICgvXlxzKlN1YlNlY3Rpb25ccysoXFMrKS9pKSB7Ci0JCSMgc3RhcnQgb2YgU2VjdGlvbgotCQkkc3Vic2VjdCA9ICQxOwotCQkkc3Vic2VjdCA9fiBzL1xXLy9nOwotCQkkc3Vic2VjdCA9fiB5L0EtWi9hLXovOwotCQkkc3Vic2VjdHN7JHN1YnNlY3R9ID0gMTsKLQkJaWYgKCRzZWN0IGVxICJzY3JlZW4iICYmICRzdWJzZWN0IGVxICJkaXNwbGF5IikgewotCQkJJGdvdF9Nb2RlcyA9IDA7Ci0JCX0KLQkJcHJpbnQ7Ci0JCW5leHQ7Ci0JfQotCWlmICgvXlxzKkVuZFN1YlNlY3Rpb24vaSkgewotCQkjIGVuZCBvZiBTdWJTZWN0aW9uCi0JCWlmICgkc2VjdCBlcSAic2NyZWVuIikgewotCQkJaWYgKCRzdWJzZWN0IGVxICJkaXNwbGF5IikgewotCQkJCWlmICgkZGVwdGggbmUgIiIgJiYgISRzZXRfRGVwdGgpIHsKLQkJCQkJcHJpbnQgIiAgICAgICAgICAjI1hkdW1teTojI1xuIjsKLQkJCQkJcHJpbnQgIiAgICAgICAgICBEZXB0aFx0JGRlcHRoXG4iOwotCQkJCX0KLQkJCQlpZiAoJGdlb20gbmUgIiIgJiYgISAkZ290X01vZGVzKSB7Ci0JCQkJCXByaW50ICIgICAgICAgICAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkJCXByaW50ICIgICAgICAgICAgTW9kZXNcdCRnZW9tXG4iOwotCQkJCX0KLQkJCX0KLQkJfQotCQkkc3Vic2VjdCA9ICIiOwotCQlwcmludDsKLQkJbmV4dDsKLQl9Ci0KLQkkbCA9ICRfOwotCSRsID1+IHMvIy4qJC8vOwotCWlmICgkc2VjdCBlcSAic2VydmVyZmxhZ3MiKSB7Ci0JCWlmICgkbCA9fiAvXlxzKk9wdGlvbi4qRG9udFZUU3dpdGNoL2kpIHsKLQkJCSRfID1+IHMvZmFsc2UvdHJ1ZS9pZzsKLQkJCSRnb3RfRG9udFZUU3dpdGNoID0gMTsKLQkJfQotCQlpZiAoJGwgPX4gL15ccypPcHRpb24uKkFsbG93TW91c2VPcGVuRmFpbC9pKSB7Ci0JCQkkXyA9fiBzL2ZhbHNlL3RydWUvaWc7Ci0JCQkkZ290X0FsbG93TW91c2VPcGVuRmFpbCA9IDE7Ci0JCX0KLQkJaWYgKCRsID1+IC9eXHMqT3B0aW9uLipQY2lGb3JjZU5vbmUvaSkgewotCQkJJF8gPX4gcy9mYWxzZS90cnVlL2lnOwotCQkJJGdvdF9QY2lGb3JjZU5vbmU9IDE7Ci0JCX0KLQl9Ci0JaWYgKCRzZWN0IGVxICJtb2R1bGUiKSB7Ci0JCWlmICgkbCA9fiAvXlxzKkxvYWQuKlxiKGRyaXxmYmRldmh3KVxiL2kpIHsKLQkJCSRfID0gIiMjWGR1bW15IyMgJF8iOwotCQl9Ci0JfQotCWlmICgkc2VjdCBlcSAibW9uaXRvciIpIHsKLQkJaWYgKCRsID1+IC9eXHMqSG9yaXpTeW5jL2kpIHsKLQkJCSRnb3RfSG9yaXpTeW5jID0gMTsKLQkJfQotCQlpZiAoJGwgPX4gL15ccypWZXJ0UmVmcmVzaC9pKSB7Ci0JCQkkZ290X1ZlcnRSZWZyZXNoID0gMTsKLQkJfQotCX0KLQlpZiAoJHNlY3QgZXEgImRldmljZSIpIHsKLQkJaWYgKCRsID1+IC9eKFxzKkRyaXZlcilcYi9pKSB7Ci0JCQkkXyA9ICIkMSBcImR1bW15XCJcbiI7Ci0JCQkkZ290X0RyaXZlciA9IDE7Ci0JCX0KLQkJaWYgKCRsID1+IC9eXHMqVmlkZW9SYW0vaSkgewotCQkJJGdvdF9WaWRlb1JhbT0gMTsKLQkJfQotCX0KLQlpZiAoJHNlY3QgZXEgImlucHV0ZGV2aWNlIikgewotCQlpZiAoJGwgPX4gL15ccypPcHRpb24uKlxiRGV2aWNlXGIvaSkgewotCQkJcHJpbnQgIiAgIyNYZHVtbXk6IyNcbiI7Ci0JCQkkXyA9ICIgIE9wdGlvbiBcIkRldmljZVwiIFwiL2Rldi9kaWxiZXJ0JG5cIlxuIjsKLQkJfQotCX0KLQlpZiAoJHNlY3QgZXEgInNjcmVlbiIpIHsKLQkJaWYgKCRsID1+IC9eXHMqRGVmYXVsdERlcHRoXHMrKFxkKykvaSkgewotCQkJaWYgKCRkZXB0aCBuZSAiIikgewotCQkJCXByaW50ICIgICMjWGR1bW15OiMjXG4iOwotCQkJCSRfID0gIiAgRGVmYXVsdERlcHRoXHQkZGVwdGhcbiI7Ci0JCQl9Ci0JCQkkZ290X0RlZmF1bHREZXB0aCA9IDE7Ci0JCX0KLQkJaWYgKCRsID1+IC9eXHMqTW9uaXRvclxzKyhcUyspL2kpIHsKLQkJCSRnb3RfTW9uaXRvciA9ICQxOwotCQkJJGdvdF9Nb25pdG9yID1+IHMvIi8vZzsKLQkJfQotCQlpZiAoJHN1YnNlY3QgZXEgImRpc3BsYXkiKSB7Ci0JCQlpZiAoJGdlb20gbmUgIiIpIHsKLQkJCQlpZiAoJGwgPX4gL14oXHMqTW9kZXMpXGIvaSkgewotCQkJCQlwcmludCAiICAgICAgICAgICMjWGR1bW15OiMjXG4iOwotCQkJCQkkXyA9ICIkMSAkZ2VvbVxuIjsKLQkJCQkJJGdvdF9Nb2RlcyA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCRsID1+IC9eXHMqRGVwdGhccysoXGQrKS9pKSB7Ci0JCQkJbXkgJGQgPSAkMTsKLQkJCQlpZiAoISRzZXRfRGVwdGggJiYgJGRlcHRoIG5lICIiKSB7Ci0JCQkJCSRzZXRfRGVwdGggPSAxOwotCQkJCQlpZiAoJGRlcHRoICE9ICRkKSB7Ci0JCQkJCQlwcmludCAiICAgICAgICAgICMjWGR1bW15OiMjXG4iOwotCQkJCQkJJF8gPSAgIiAgICAgICAgICBEZXB0aFx0JGRlcHRoXG4iOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaW50OwotICAgIH0KLSAgICBpZiAoJEVOVntYRFVNTVlfTk9UV0VBS30pIHsKLQlleGl0OwotICAgIH0KLSAgICAjIGNyZWF0ZSBhbnkgY3J1Y2lhbCBzZWN0aW9ucyB0aGF0IGFyZSBtaXNzaW5nOgotICAgIGlmICghIGV4aXN0cygkc2VjdHN7c2VydmVyZmxhZ3N9KSkgewotCXByaW50ICJcbiMjWGR1bW15OiMjXG4iOwotICAgIAlwcmludCAiU2VjdGlvbiBcIlNlcnZlckZsYWdzXCJcbiI7Ci0gICAgCXByaW50ICIgIE9wdGlvbiBcIkRvbnRWVFN3aXRjaFwiIFwidHJ1ZVwiXG4iOwotICAgIAlwcmludCAiICBPcHRpb24gXCJBbGxvd01vdXNlT3BlbkZhaWxcIiBcInRydWVcIlxuIjsKLSAgICAJcHJpbnQgIiAgT3B0aW9uIFwiUGNpRm9yY2VOb25lXCIgXCJ0cnVlXCJcbiI7Ci0gICAgCXByaW50ICJFbmRTZWN0aW9uXG4iOwotICAgIH0KLSAgICBpZiAoISBleGlzdHMoJHNlY3Rze2RldmljZX0pKSB7Ci0JcHJpbnQgIlxuIyNYZHVtbXk6IyNcbiI7Ci0gICAgCXByaW50ICJTZWN0aW9uIFwiRGV2aWNlXCJcbiI7Ci0gICAgCXByaW50ICIgIElkZW50aWZpZXIgXCJWaWRlb2NhcmQwXCJcbiI7Ci0gICAgCXByaW50ICIgIERyaXZlciBcImR1bW15XCJcbiI7Ci0JcHJpbnQgIiAgVmlkZW9SYW0gJHZpZGVvcmFtXG4iOwotICAgIAlwcmludCAiRW5kU2VjdGlvblxuIjsKLSAgICB9Ci0gICAgaWYgKCEgZXhpc3RzKCRzZWN0c3ttb25pdG9yfSkpIHsKLQlwcmludCAiXG4jI1hkdW1teTojI1xuIjsKLSAgICAJcHJpbnQgIlNlY3Rpb24gXCJNb25pdG9yXCJcbiI7Ci0gICAgCXByaW50ICIgIElkZW50aWZpZXIgXCJNb25pdG9yMFwiXG4iOwotICAgIAlwcmludCAiICBIb3JpelN5bmMgICAkSG9yaXpTeW5jXG4iOwotICAgIAlwcmludCAiICBWZXJ0UmVmcmVzaCAkVmVydFJlZnJlc2hcbiI7Ci0gICAgCXByaW50ICJFbmRTZWN0aW9uXG4iOwotICAgIH0KLSAgICBpZiAoISBleGlzdHMoJHNlY3Rze3NjcmVlbn0pKSB7Ci0JcHJpbnQgIlxuIyNYZHVtbXk6IyNcbiI7Ci0gICAgCXByaW50ICJTZWN0aW9uIFwiU2NyZWVuXCJcbiI7Ci0gICAgCXByaW50ICIgIElkZW50aWZpZXIgXCJTY3JlZW4wXCJcbiI7Ci0gICAgCXByaW50ICIgIERldmljZSBcIlZpZGVvY2FyZDBcIlxuIjsKLQlpZiAoJGdvdF9Nb25pdG9yIG5lICIiKSB7Ci0gICAgCQlwcmludCAiICBNb25pdG9yIFwiJGdvdF9Nb25pdG9yXCJcbiI7Ci0JfSBlbHNlIHsKLSAgICAJCXByaW50ICIgIE1vbml0b3IgXCJNb25pdG9yMFwiXG4iOwotCX0KLQlpZiAoJGRlcHRoIG5lICIiKSB7Ci0gICAgCQlwcmludCAiICBEZWZhdWx0RGVwdGggJGRlcHRoXG4iOwotCX0gZWxzZSB7Ci0gICAgCQlwcmludCAiICBEZWZhdWx0RGVwdGggMjRcbiI7Ci0JfQotICAgIAlwcmludCAiICBTdWJTZWN0aW9uIFwiRGlzcGxheVwiXG4iOwotICAgIAlwcmludCAiICAgIFZpZXdwb3J0IDAgMFxuIjsKLSAgICAJcHJpbnQgIiAgICBEZXB0aCAyNFxuIjsKLQlpZiAoJGdvdF9Nb2RlcykgewotCQk7Ci0JfSBlbHNpZiAoJGdlb20gbmUgIiIpIHsKLSAgICAJCXByaW50ICIgICAgTW9kZXMgJGdlb21cbiI7Ci0JfSBlbHNlIHsKLSAgICAJCXByaW50ICIgICAgTW9kZXMgXCIxMjgweDEwMjRcIiBcIjEwMjR4NzY4XCIgXCI4MDB4NjAwXCJcbiI7Ci0JfQotICAgIAlwcmludCAiICBFbmRTdWJTZWN0aW9uXG4iOwotICAgIAlwcmludCAiRW5kU2VjdGlvblxuIjsKLSAgICB9Ci0nOwotfQotCi0jIFdvcmsgb3V0IGNvbmZpZyBmaWxlIGFuZCB0d2VhayBpdC4KLSMKLWlmIFsgIlgkY21kbGluZV9jb25maWciID0gIlgiIF07IHRoZW4KLQk6Ci1lbGlmIFsgIlgkY21kbGluZV9jb25maWciID0gIlh4ZHVtbXktYnVpbHRpbiIgXTsgdGhlbgotCToKLWVsaWYgZWNobyAiJGNtZGxpbmVfY29uZmlnIiB8IGdyZXAgJy8nID4gL2Rldi9udWxsOyB0aGVuCi0JOgotZWxzZQotCSMgaWdub3JlIGJhc2VuYW1lIG9ubHkgY2FzZSAobGV0IHNlcnZlciBoYW5kbGUgaXQpCi0JY21kbGluZV9jb25maWc9IiIKLQlub3R3ZWFrPTEKLWZpCi0KLWNvbmZpZz0kY21kbGluZV9jb25maWcKLQotaWYgWyAiWCRub3R3ZWFrIiA9ICJYMSIgLWEgIlgkcm9vdCIgPSAiWCIgLWEgIC1mICIkY21kbGluZV9jb25maWciIF07IHRoZW4KLQkjIGlmIG5vdCByb290IHdlIG5lZWQgdG8gY29weSAoYnV0IG5vdCB0d2VhaykgdGhlIHNwZWNpZmllZCBjb25maWcuCi0JWERVTU1ZX05PVFdFQUs9MQotCWV4cG9ydCBYRFVNTVlfTk9UV0VBSwotCW5vdHdlYWs9IiIKLWZpCi0KLWlmIFsgISAkbm90d2VhayBdOyB0aGVuCi0JIyB0d2Vha2VkIGNvbmZpZyB3aWxsIGJlIHB1dCBpbiAkY29uZmlnMjoKLQljb25maWcyPSIiCi0JaWYgWyAiWCRjb25maWciID0gIlgiIF07IHRoZW4KLQkJIyB1c2UgdGhlIGRlZmF1bHQgb25lOgotCQlpZiBbICJYJHN0eXBlIiA9ICJYeG9yZyIgXTsgdGhlbgotCQkJY29uZmlnPS9ldGMvWDExL3hvcmcuY29uZgotCQllbHNlCi0JCQlpZiBbIC1mICIvZXRjL1gxMS9YRjg2Q29uZmlnLTQiIF07IHRoZW4KLQkJCQljb25maWc9Ii9ldGMvWDExL1hGODZDb25maWctNCIKLQkJCWVsc2UKLQkJCQljb25maWc9Ii9ldGMvWDExL1hGODZDb25maWciCi0JCQlmaQotCQlmaQotCQlpZiBbICEgLWYgIiRjb25maWciIF07IHRoZW4KLQkJCWZvciBjIGluIC9ldGMvWDExL3hvcmcuY29uZiAvZXRjL1gxMS9YRjg2Q29uZmlnLTQgL2V0Yy9YMTEvWEY4NkNvbmZpZwotCQkJZG8KLQkJCQlpZiBbIC1mICRjIF07IHRoZW4KLQkJCQkJY29uZmlnPSRjCi0JCQkJCWJyZWFrCi0JCQkJZmkKLQkJCWRvbmUKLQkJZmkKLQlmaQotCi0JaWYgWyAiWCRjb25maWciID0gIlh4ZHVtbXktYnVpbHRpbiIgXTsgdGhlbgotCQljb25maWc9IiIKLQlmaQotCi0JaWYgWyAhIC1mICIkY29uZmlnIiBdOyB0aGVuCi0JCWNvbmZpZz0iJFhEVU1NWV9UTVBESVIveG9yZy5jb25mIgotCQl3YXJuICIkcHJvZ3JhbTogdXNpbmcgbWluaW1hbCBidWlsdC1pbiB4b3JnLmNvbmYgc2V0dGluZ3MuIgotCQljYXQgPiAkY29uZmlnIDw8RU5ECi0KLVNlY3Rpb24gIlNlcnZlckxheW91dCIKLSAgICBJZGVudGlmaWVyICAgICAiTGF5b3V0MCIKLSAgICBTY3JlZW4gICAgICAwICAiU2NyZWVuMCIKLSAgICBJbnB1dERldmljZSAgICAiS2V5Ym9hcmQwIiAiQ29yZUtleWJvYXJkIgotICAgIElucHV0RGV2aWNlICAgICJNb3VzZTAiICJDb3JlUG9pbnRlciIKLUVuZFNlY3Rpb24KLQotU2VjdGlvbiAiRmlsZXMiCi1FbmRTZWN0aW9uCi0KLVNlY3Rpb24gIk1vZHVsZSIKLSAgICBMb2FkICAgICAgICAgICAiZGJlIgotICAgIExvYWQgICAgICAgICAgICJleHRtb2QiCi0gICAgTG9hZCAgICAgICAgICAgImZyZWV0eXBlIgotICAgIExvYWQgICAgICAgICAgICJnbHgiCi1FbmRTZWN0aW9uCi0KLVNlY3Rpb24gIklucHV0RGV2aWNlIgotICAgIElkZW50aWZpZXIgICAgICJNb3VzZTAiCi0gICAgRHJpdmVyICAgICAgICAgIm1vdXNlIgotICAgIE9wdGlvbiAgICAgICAgICJQcm90b2NvbCIgImF1dG8iCi0gICAgT3B0aW9uICAgICAgICAgIkRldmljZSIgIi9kZXYvcHNhdXgiCi0gICAgT3B0aW9uICAgICAgICAgIkVtdWxhdGUzQnV0dG9ucyIgIm5vIgotICAgIE9wdGlvbiAgICAgICAgICJaQXhpc01hcHBpbmciICI0IDUiCi1FbmRTZWN0aW9uCi0KLVNlY3Rpb24gIklucHV0RGV2aWNlIgotICAgIElkZW50aWZpZXIgICAgICJLZXlib2FyZDAiCi0gICAgRHJpdmVyICAgICAgICAgImtiZCIKLUVuZFNlY3Rpb24KLQotU2VjdGlvbiAiTW9uaXRvciIKLSAgICBJZGVudGlmaWVyICAgICAiTW9uaXRvcjAiCi0gICAgVmVuZG9yTmFtZSAgICAgIlVua25vd24iCi0gICAgTW9kZWxOYW1lICAgICAgIlVua25vd24iCi0gICAgSG9yaXpTeW5jICAgICAgIDMwLjAgLSAxMzAuMAotICAgIFZlcnRSZWZyZXNoICAgICA1MC4wIC0gMjUwLjAKLSAgICBPcHRpb24gICAgICAgICAiRFBNUyIKLUVuZFNlY3Rpb24KLQotU2VjdGlvbiAiRGV2aWNlIgotICAgIElkZW50aWZpZXIgICAgICJEZXZpY2UwIgotICAgIERyaXZlciAgICAgICAgICJmb292aWRlbyIKLSAgICBWZW5kb3JOYW1lICAgICAiZm9vdmlkZW8gQ29ycG9yYXRpb24iCi1FbmRTZWN0aW9uCi0KLVNlY3Rpb24gIlNjcmVlbiIKLSAgICBJZGVudGlmaWVyICAgICAiU2NyZWVuMCIKLSAgICBEZXZpY2UgICAgICAgICAiRGV2aWNlMCIKLSAgICBNb25pdG9yICAgICAgICAiTW9uaXRvcjAiCi0gICAgRGVmYXVsdERlcHRoICAgIDI0Ci0gICAgU3ViU2VjdGlvbiAgICAgIkRpc3BsYXkiCi0gICAgICAgIERlcHRoICAgICAgIDI0Ci0gICAgICAgIE1vZGVzICAgICAgICAgICAiMTI4MHgxMDI0IgotICAgIEVuZFN1YlNlY3Rpb24KLUVuZFNlY3Rpb24KLQotRU5ECi0JZmkKLQotCWlmIFsgLWYgIiRjb25maWciIF07IHRoZW4KLQkJdHdlYWtfY29uZmlnICRjb25maWcKLQlmaQotCi0JIyBub3cgd2UgbmVlZCB0byBnZXQgb3VyIHR3ZWFrZWQgY29uZmlnIGZpbGUgb250byB0aGUgY29tbWFuZCBsaW5lOgotCWlmIFsgIlgkY21kbGluZV9jb25maWciID0gIlgiIF07IHRoZW4KLQkJIyBhcHBlbmQgdG8gY21kbGluZSAoRlVCQVIgd2lsbCBiZSBzdWJzdGl0dXRlZCBiZWxvdy4pCi0JCWlmIFsgIlgkc3R5cGUiID0gIlh4b3JnIiBdOyB0aGVuCi0JCQlhcmdzPSIkYXJncyAtY29uZmlnIEZVQkFSIgotCQllbHNlCi0JCQlhcmdzPSIkYXJncyAteGY4NmNvbmZpZyBGVUJBUiIKLQkJZmkKLQlmaQotCWlmIFsgIlgkY29uZmlnMiIgIT0gIlgiIF07IHRoZW4KLQkJIyBvciBtb2RpZnkgJGFyZ3M6Ci0JCWMyPSRjb25maWcyCi0JCWlmIFsgIlgkcm9vdCIgPSAiWCIgXTsgdGhlbgotCQkJIyBvcmRpbmFyeSB1c2VyIGNhbm5vdCB1c2UgYWJzb2x1dGUgcGF0aC4KLQkJCWMyPWBiYXNlbmFtZSAkY29uZmlnMmAKLQkJZmkKLQkJYXJncz1gZWNobyAiJGFyZ3MiIHwgc2VkIFwKLQkJCS1lICJzLC1jb25maWcgICpbXiBdW14gXSosLWNvbmZpZyAkYzIsZyIgXAotCQkJLWUgInMsLXhmODZjb25maWcgICpbXiBdW14gXSosLXhmODZjb25maWcgJGMyLGciYAotCWZpCi1maQotCi1pZiBbICRwcmNvbmYgXTsgdGhlbgotCXdhcm4gIiIKLQl3YXJuICJQcmludGluZyBvdXQgdGhlIFhvcmcvWEZyZWU4NiBzZXJ2ZXIgY29uZmlnIGZpbGU6IgotCXdhcm4gIiIKLQlpZiBbICJYJGNvbmZpZzIiID0gIlgiIF07IHRoZW4KLQkJd2FybiAiTk8gQ09ORklHIEdFTkVSQVRFRC4iCi0JCWV4aXQgMQotCWVsc2UKLQkJY2F0ICIkY29uZmlnMiIKLQlmaQotCWV4aXQgMAotZmkKLQotaWYgWyAkZGVidWcgXTsgdGhlbgotCVhEVU1NWV9ERUJVRz0xCi0JZXhwb3J0IFhEVU1NWV9ERUJVRwotZmkKLWlmIFsgJHJvb3QgXTsgdGhlbgotCVhEVU1NWV9ST09UPTEKLQlleHBvcnQgWERVTU1ZX1JPT1QKLWZpCi0KLSMgRmluYWxseSwgcnVuIGl0OgotIwotaWYgWyAiWCRkZWJ1ZyIgIT0gIlgiIC1vICJYJHJ1bml0IiA9ICJYIiBdOyB0aGVuCi0JaWYgWyAhICRydW5pdCBdOyB0aGVuCi0JCWVjaG8gIiIKLQkJZWNobyAiL3Vzci9iaW4vZW52OiIKLQkJZW52IHwgZWdyZXAgLXYgJ14oTFNfQ09MT1JTfFRFUk1DQVApJyB8IHNvcnQKLQkJZWNobyAiIgotCQllY2hvICJYRFVNTVkqOiIKLQkJZW52IHwgZ3JlcCAnXlhEVU1NWScgfCBzb3J0Ci0JCWVjaG8gIiIKLQlmaQotCXdhcm4gIiIKLQl3YXJuICJUaGUgY29tbWFuZCB0byBydW4gaXM6IgotCXdhcm4gIiIKLQlzbz0kU08KLQlwd2Q9YHB3ZGAKLQlpZiBlY2hvICIkc28iIHwgZ3JlcCAnXlwuLycgPiAvZGV2L251bGw7IHRoZW4KLQkJc289YGVjaG8gIiRzbyIgfCBzZWQgLWUgInMsXlwuLCRwd2QsImAKLQlmaQotCWlmIGVjaG8gIiRzbyIgfCBncmVwICcvJyA+IC9kZXYvbnVsbDsgdGhlbgotCQk6Ci0JZWxzZQotCQlzbz0iJHB3ZC8kc28iCi0JZmkKLQl3YXJuICJlbnYgTERfUFJFTE9BRD0kc28gJHhzZXJ2ZXIgJGRpc3AgJGFyZ3MgJHZ0IgotCXdhcm4gIiIKLQlpZiBbICEgJHJ1bml0IF07IHRoZW4KLQkJZXhpdCAwCi0JZmkKLWZpCi0KLWlmIFsgJHN0cmFjZSBdOyB0aGVuCi0JaWYgWyAiWCRzdHJhY2UiID0gIlgyIiBdOyB0aGVuCi0JCWx0cmFjZSAtZiBlbnYgTERfUFJFTE9BRD0kU08gJHhzZXJ2ZXIgJGRpc3AgJGFyZ3MgJHZ0Ci0JZWxzZQotCQlzdHJhY2UgLWYgZW52IExEX1BSRUxPQUQ9JFNPICR4c2VydmVyICRkaXNwICRhcmdzICR2dAotCWZpCi1lbHNlCi0JZXhlYyBlbnYgTERfUFJFTE9BRD0kU08gJHhzZXJ2ZXIgJGRpc3AgJGFyZ3MgJHZ0Ci1maQotCi1leGl0ICQ/Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY29kZSgpIHsKLSNjb2RlX2JlZ2luCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgT19BQ0NNT0RFICAgICAgICAgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkgICAgICAgICAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkgICAgICAgICAgICAgMDEKLSNkZWZpbmUgT19SRFdSICAgICAgICAgICAgICAgMDIKLSNkZWZpbmUgT19DUkVBVCAgICAgICAgICAgIDAxMDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTCAgICAgICAgICAgICAwMjAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWSAgICAgICAgICAgMDQwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQyAgICAgICAgICAgMDEwMDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5EICAgICAgICAgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sgICAgICAgIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZICAgICAgICBPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQyAgICAgICAgICAgMDEwMDAwCi0jZGVmaW5lIE9fRlNZTkMgICAgICAgICAgT19TWU5DCi0jZGVmaW5lIE9fQVNZTkMgICAgICAgICAgMDIwMDAwCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLQotI2RlZmluZSBfX1VTRV9HTlUKLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1zdGF0aWMgY2hhciB0bXBkaXJbNDA5Nl07Ci1zdGF0aWMgY2hhciBzdHIxWzQwOTZdOwotc3RhdGljIGNoYXIgc3RyMls0MDk2XTsKLQotc3RhdGljIGNoYXIgZGV2c1syNTZdWzEwMjRdOwotc3RhdGljIGludCBkZWJ1ZyA9IC0xOwotc3RhdGljIGludCByb290ID0gLTE7Ci1zdGF0aWMgaW50IGNoYW5nZWRfdWlkID0gMDsKLXN0YXRpYyBpbnQgc2F3X2ZvbnRzID0gMDsKLXN0YXRpYyBpbnQgc2F3X2xpYl9tb2R1bGVzID0gMDsKLQotc3RhdGljIHRpbWVfdCBzdGFydCA9IDA7IAotCi12b2lkIGNoZWNrX2RlYnVnKHZvaWQpIHsKLQlpZiAoZGVidWcgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIlhEVU1NWV9ERUJVRyIpICE9IE5VTEwpIHsKLQkJCWRlYnVnID0gMTsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnID0gMDsKLQkJfQotCQkvKiBwcmV2ZW50IG90aGVyIHByb2Nlc3NlcyB1c2luZyB0aGUgcHJlbG9hZDogKi8KLQkJcHV0ZW52KCJMRF9QUkVMT0FEPSIpOwotCX0KLX0KLXZvaWQgY2hlY2tfcm9vdCh2b2lkKSB7Ci0JaWYgKHJvb3QgPCAwKSB7Ci0JCS8qIHNjcmlwdCB0ZWxscyB1cyBpZiB3ZSBhcmUgcm9vdCAqLwotCQlpZiAoZ2V0ZW52KCJYRFVNTVlfUk9PVCIpICE9IE5VTEwpIHsKLQkJCXJvb3QgPSAxOwotCQl9IGVsc2UgewotCQkJcm9vdCA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgY2hlY2tfdWlkKHZvaWQpIHsKLQlpZiAoc3RhcnQgPT0gMCkgewotCQlzdGFydCA9IHRpbWUoTlVMTCk7Ci0JCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJTVEFSVDogJXVcbiIsICh1bnNpZ25lZCBpbnQpIHN0YXJ0KTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoY2hhbmdlZF91aWQgPT0gMCkgewotCQlpZiAoc2F3X2ZvbnRzIHx8IHRpbWUoTlVMTCkgPiBzdGFydCArIDIwKSB7Ci0JCQlpZiAoZ2V0ZW52KCJYRFVNTVlfVUlEIikpIHsKLQkJCQlpbnQgdWlkID0gYXRvaShnZXRlbnYoIlhEVU1NWV9VSUQiKSk7Ci0JCQkJaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIlNFVFJFVUlEOiAlZCBzYXdfZm9udHM9JWRcbiIsIHVpZCwgc2F3X2ZvbnRzKTsKLQkJCQlpZiAodWlkID49IDApIHsKLQkJCQkJLyogdGhpcyB3aWxsIHNpbXBseSBmYWlsIGluIC1ub25yb290IG1vZGU6ICovCi0JCQkJCXNldHJldWlkKHVpZCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCWNoYW5nZWRfdWlkID0gMTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBDSEVDS0lUIGlmIChkZWJ1ZyA8IDApIGNoZWNrX2RlYnVnKCk7IFwKLQkJaWYgKHJvb3QgIDwgMCkgY2hlY2tfcm9vdCgpOyBcCi0JCWNoZWNrX3VpZCgpOwotCi1zdGF0aWMgdm9pZCBzZXRfdG1wZGlyKHZvaWQpIHsKLQljaGFyICpzOwotCXN0YXRpYyBpbnQgZGlkc2V0ID0gMDsKLQlpZiAoZGlkc2V0KSB7Ci0JCXJldHVybjsKLQl9Ci0JcyA9IGdldGVudigiWERVTU1ZX1RNUERJUiIpOwotCWlmICghIHMpIHsKLQkJcyA9ICIvdG1wIjsKLQl9Ci0JdG1wZGlyWzBdID0gJ1wwJzsKLQlzdHJjYXQodG1wZGlyLCBzKTsKLQlzdHJjYXQodG1wZGlyLCAiLyIpOwotCWRpZHNldCA9IDE7Ci19Ci0KLXN0YXRpYyBjaGFyICp0bXBkaXJfcGF0aChjb25zdCBjaGFyICpwYXRoKSB7Ci0JY2hhciAqc3RyOwotCXNldF90bXBkaXIoKTsKLQlzdHJjcHkoc3RyMiwgcGF0aCk7Ci0Jc3RyID0gc3RyMjsKLQl3aGlsZSAoKnN0cikgewotCQlpZiAoKnN0ciA9PSAnLycpIHsKLQkJCSpzdHIgPSAnXyc7Ci0JCX0KLQkJc3RyKys7Ci0JfQotCXN0cmNweShzdHIxLCB0bXBkaXIpOwotCXN0cmNhdChzdHIxLCBzdHIyKTsKLQlyZXR1cm4gc3RyMTsKLX0KLQotaW50IG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncywgdW5zaWduZWQgc2hvcnQgbW9kZSkgewotCWludCBmZDsKLQljaGFyICpzdG9yZV9kZXYgPSBOVUxMOwotCXN0YXRpYyBpbnQgKCpyZWFsX29wZW4pKGNvbnN0IGNoYXIgKiwgaW50ICwgdW5zaWduZWQgc2hvcnQpID0gTlVMTDsKLQotCUNIRUNLSVQKLQlpZiAoISByZWFsX29wZW4pIHsKLQkJcmVhbF9vcGVuID0gKGludCAoKikoY29uc3QgY2hhciAqLCBpbnQgLCB1bnNpZ25lZCBzaG9ydCkpCi0JCQlkbHN5bShSVExEX05FWFQsICJvcGVuIik7Ci0JfQotCi0JaWYgKHN0cnN0cihwYXRobmFtZSwgImxpYi9tb2R1bGVzLyIpKSB7Ci0JCS8qIG5vdCBjdXJyZW50bHkgdXNlZC4gKi8KLQkJc2F3X2xpYl9tb2R1bGVzID0gMTsKLQl9Ci0KLQlpZiAoIXJvb3QpIHsKLQkJaWYgKHN0cnN0cihwYXRobmFtZSwgIi9kZXYvIikgPT0gcGF0aG5hbWUpIHsKLQkJCXN0b3JlX2RldiA9IHN0cmR1cChwYXRobmFtZSk7Ci0JCX0KLQkJaWYgKHN0cnN0cihwYXRobmFtZSwgIi9kZXYvdHR5IikgPT0gcGF0aG5hbWUgJiYgc3RyY21wKHBhdGhuYW1lLCAiL2Rldi90dHkiKSkgewotCQkJcGF0aG5hbWUgPSB0bXBkaXJfcGF0aChwYXRobmFtZSk7Ci0JCQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiT1BFTjogJXMgLT4gJXMgKGFzIEZJRk8pXG4iLCBzdG9yZV9kZXYsIHBhdGhuYW1lKTsKLQkJCS8qIHdlIG1ha2UgaXQgYSBGSUZPIHNvIGlvY3RsIG9uIGl0IGRvZXMgbm90IGZhaWwgKi8KLQkJCXVubGluayhwYXRobmFtZSk7Ci0JCQlta2ZpZm8ocGF0aG5hbWUsIDA2NjYpOwotCQl9IGVsc2UgaWYgKDApIHsKLQkJCS8qIHdlIHVzZWQgdG8gaGFuZGxlIG1vcmUgL2RldiBmaWxlcyAuLi4gKi8KLQkJCWZkID0gcmVhbF9vcGVuKHBhdGhuYW1lLCBPX1dST05MWXxPX0NSRUFULCAwNzc3KTsKLQkJCWNsb3NlKGZkKTsKLQkJfQotCX0KLQotCWZkID0gcmVhbF9vcGVuKHBhdGhuYW1lLCBmbGFncywgbW9kZSk7Ci0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiT1BFTjogJXMgJWQgJWQgZmQ9JWRcbiIsIHBhdGhuYW1lLCBmbGFncywgbW9kZSwgZmQpOwotCi0JaWYgKCEgcm9vdCkgewotCQlpZiAoc3RvcmVfZGV2KSB7Ci0JCQlpZiAoZmQgPCAyNTYpIHsKLQkJCQlzdHJjcHkoZGV2c1tmZF0sIHN0b3JlX2Rldik7Ci0JCQl9Ci0JCQlmcmVlKHN0b3JlX2Rldik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4oZmQpOwotfQotCi1pbnQgb3BlbjY0KGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIHVuc2lnbmVkIHNob3J0IG1vZGUpIHsKLQlpbnQgZmQ7Ci0KLQlDSEVDS0lUCi0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIk9QRU42NDogJXMgJWQgJWRcbiIsIHBhdGhuYW1lLCBmbGFncywgbW9kZSk7Ci0KLQlmZCA9IG9wZW4ocGF0aG5hbWUsIGZsYWdzLCBtb2RlKTsKLQlyZXR1cm4oZmQpOwotfQotCi1pbnQgcmVuYW1lKGNvbnN0IGNoYXIgKm9sZHBhdGgsIGNvbnN0IGNoYXIgKm5ld3BhdGgpIHsKLQlzdGF0aWMgaW50ICgqcmVhbF9yZW5hbWUpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSA9IE5VTEw7Ci0KLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9yZW5hbWUpIHsKLQkJcmVhbF9yZW5hbWUgPSAoaW50ICgqKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpCi0JCQlkbHN5bShSVExEX05FWFQsICJyZW5hbWUiKTsKLQl9Ci0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiUkVOQU1FOiAlcyAlc1xuIiwgb2xkcGF0aCwgbmV3cGF0aCk7Ci0KLQlpZiAocm9vdCkgewotCQlyZXR1cm4ocmVhbF9yZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkpOwotCX0KLQotCWlmIChzdHJzdHIob2xkcGF0aCwgIi92YXIvbG9nIikgPT0gb2xkcGF0aCkgewotCQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiUkVOQU1FOiByZXR1cm5pbmcgMFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4ocmVhbF9yZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkpOwotfQotCi1GSUxFICpmb3Blbihjb25zdCBjaGFyICpwYXRobmFtZSwgY29uc3QgY2hhciAqbW9kZSkgewotCXN0YXRpYyBGSUxFKiAoKnJlYWxfZm9wZW4pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSA9IE5VTEw7Ci0JY2hhciAqc3RyOwotCi0JaWYgKCEgc2F3X2ZvbnRzKSB7Ci0JCWlmIChzdHJzdHIocGF0aG5hbWUsICIvZm9udHMvIikpIHsKLQkJCWlmIChzdHJzdHIocGF0aG5hbWUsICJmb250cy5kaXIiKSkgewotCQkJCXNhd19mb250cyA9IDE7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwYXRobmFtZSwgImZvbnRzLmFsaWFzIikpIHsKLQkJCQlzYXdfZm9udHMgPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZm9wZW4pIHsKLQkJcmVhbF9mb3BlbiA9IChGSUxFKiAoKikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKQotCQkJZGxzeW0oUlRMRF9ORVhULCAiZm9wZW4iKTsKLQl9Ci0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiRk9QRU46ICVzICVzXG4iLCBwYXRobmFtZSwgbW9kZSk7Ci0KLQlpZiAoc3Ryc3RyKHBhdGhuYW1lLCAieGR1bW15X21vZGlmaWVkX3hjb25maWcuY29uZiIpKSB7Ci0JCS8qIG1ha2Ugb3VyIGNvbmZpZyBhcHBlYXIgdG8gYmUgaW4gL2V0Yy9YMTEsIGV0Yy4gKi8KLQkJY2hhciAqcSA9IHN0cnJjaHIocGF0aG5hbWUsICcvJyk7Ci0JCWlmIChxICE9IE5VTEwgJiYgZ2V0ZW52KCJYRFVNTVlfVE1QRElSIikgIT0gTlVMTCkgewotCQkJc3RyY3B5KHN0cjEsIGdldGVudigiWERVTU1ZX1RNUERJUiIpKTsKLQkJCXN0cmNhdChzdHIxLCBxKTsKLQkJCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJGT1BFTjogJXMgLT4gJXNcbiIsIHBhdGhuYW1lLCBzdHIxKTsKLQkJCXBhdGhuYW1lID0gc3RyMTsKLQkJfQotCX0KLQotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2ZvcGVuKHBhdGhuYW1lLCBtb2RlKSk7Ci0JfQotCi0Jc3RyID0gKGNoYXIgKikgcGF0aG5hbWU7Ci0JaWYgKHN0cnN0cihwYXRobmFtZSwgIi92YXIvbG9nIikgPT0gcGF0aG5hbWUpIHsKLQkJc3RyID0gdG1wZGlyX3BhdGgocGF0aG5hbWUpOwotCQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiRk9QRU46ICVzIC0+ICVzXG4iLCBwYXRobmFtZSwgc3RyKTsKLQl9Ci0JcmV0dXJuKHJlYWxfZm9wZW4oc3RyLCBtb2RlKSk7Ci19Ci0KLQotI2RlZmluZSBSRVRVUk4wIGlmIChkZWJ1ZykgXAotCXtmcHJpbnRmKHN0ZGVyciwgIklPQ1RMOiBjb3ZlcmVkICVkIDB4JXhcbiIsIGZkLCByZXEpO30gcmV0dXJuIDA7Ci0jZGVmaW5lIFJFVFVSTjEgaWYgKGRlYnVnKSBcCi0Je2ZwcmludGYoc3RkZXJyLCAiSU9DVEw6IGNvdmVyZWQgJWQgMHgleFxuIiwgZmQsIHJlcSk7fSByZXR1cm4gLTE7Ci0KLWludCBpb2N0bChpbnQgZmQsIGludCByZXEsIHZvaWQgKnB0cikgewotCXN0YXRpYyBpbnQgY2xvc2VkX3hmODZJbmZvX2NvbnNvbGVGZCA9IDA7Ci0Jc3RhdGljIGludCAoKnJlYWxfaW9jdGwpKGludCwgaW50ICwgdm9pZCAqKSA9IE5VTEw7Ci0KLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9pb2N0bCkgewotCQlyZWFsX2lvY3RsID0gKGludCAoKikoaW50LCBpbnQgLCB2b2lkICopKQotCQkJZGxzeW0oUlRMRF9ORVhULCAib3BlbiIpOwotCX0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiSU9DVEw6ICVkIDB4JXggJXBcbiIsIGZkLCByZXEsIHB0cik7Ci0KLQkvKiBiYXNlZCBvbiB4b3JnLXgxMS02LjguMS1kdWFsaGVhZC5wYXRjaCAqLwotCWlmIChyZXEgPT0gVlRfR0VUTU9ERSkgewotCQkvKiBjbG9zZSh4Zjg2SW5mby5jb25zb2xlRmQpICovCi0JCWlmICgwICYmICEgY2xvc2VkX3hmODZJbmZvX2NvbnNvbGVGZCkgewotCQkJLyogSSB0aGluayBiZXR0ZXIgbm90IHRvIGNsb3NlIGl0Li4uICovCi0JCQljbG9zZShmZCk7Ci0JCQljbG9zZWRfeGY4NkluZm9fY29uc29sZUZkID0gMTsKLQkJfQotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gVlRfU0VUTU9ERSkgewotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gVlRfR0VUU1RBVEUpIHsKLQkJUkVUVVJOMAotCX0gZWxzZSBpZiAocmVxID09IEtEU0VUTU9ERSkgewotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gS0RTRVRMRUQpIHsKLQkJUkVUVVJOMAotCX0gZWxzZSBpZiAocmVxID09IEtER0tCTU9ERSkgewotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gS0RTS0JNT0RFKSB7Ci0JCVJFVFVSTjAKLQl9IGVsc2UgaWYgKHJlcSA9PSBWVF9BQ1RJVkFURSkgewotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gVlRfV0FJVEFDVElWRSkgewotCQlSRVRVUk4wCi0JfSBlbHNlIGlmIChyZXEgPT0gVlRfUkVMRElTUCkgewotCQlpZiAocHRyID09ICh2b2lkICopIDEpIHsKLQkJCVJFVFVSTjEKLQkJfSBlbHNlIGlmIChwdHIgPT0gKHZvaWQgKikgVlRfQUNLQUNRKSB7Ci0JCQlSRVRVUk4wCi0JCX0KLQl9Ci0KLQlyZXR1cm4ocmVhbF9pb2N0bChmZCwgcmVxLCBwdHIpKTsKLX0KLQotdHlwZWRlZiB2b2lkICgqc2lnaGFuZGxlcl90KShpbnQpOwotI2RlZmluZSBTSUdVU1IxICAgICAgIDEwCi0jZGVmaW5lIFNJR19ERkwgICAgICAgKChzaWdoYW5kbGVyX3QpMCkKLQotc2lnaGFuZGxlcl90IHNpZ25hbChpbnQgc2lnbnVtLCBzaWdoYW5kbGVyX3QgaGFuZGxlcikgewotCXN0YXRpYyBzaWdoYW5kbGVyX3QgKCpyZWFsX3NpZ25hbCkoaW50LCBzaWdoYW5kbGVyX3QpID0gTlVMTDsKLQotCUNIRUNLSVQKLQlpZiAoISByZWFsX3NpZ25hbCkgewotCQlyZWFsX3NpZ25hbCA9IChzaWdoYW5kbGVyX3QgKCopKGludCwgc2lnaGFuZGxlcl90KSkKLQkJCWRsc3ltKFJUTERfTkVYVCwgInNpZ25hbCIpOwotCX0KLQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJTSUdOQUw6ICVkICVwXG4iLCBzaWdudW0sIGhhbmRsZXIpOwotCi0JaWYgKHNpZ251bSA9PSBTSUdVU1IxKSB7Ci0JCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJTSUdOQUw6IHNraXAgU0lHVVNSMVxuIik7Ci0JCXJldHVybiBTSUdfREZMOwotCX0KLQkKLQlyZXR1cm4ocmVhbF9zaWduYWwoc2lnbnVtLCBoYW5kbGVyKSk7Ci19Ci0KLWludCBjbG9zZShpbnQgZmQpIHsKLQlzdGF0aWMgaW50ICgqcmVhbF9jbG9zZSkoaW50KSA9IE5VTEw7Ci0KLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9jbG9zZSkgewotCQlyZWFsX2Nsb3NlID0gKGludCAoKikoaW50KSkgZGxzeW0oUlRMRF9ORVhULCAiY2xvc2UiKTsKLQl9Ci0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiQ0xPU0U6ICVkXG4iLCBmZCk7Ci0JaWYgKCFyb290KSB7Ci0JCWlmIChmZCA8IDI1NikgewotCQkJZGV2c1tmZF1bMF0gPSAnXDAnOwotCQl9Ci0JfQotCXJldHVybihyZWFsX2Nsb3NlKGZkKSk7Ci19Ci0KLXN0cnVjdCBzdGF0IHsKLQlpbnQgZm9vOwotfTsKLQotaW50IHN0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1ZikgewotCXN0YXRpYyBpbnQgKCpyZWFsX3N0YXQpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKikgPSBOVUxMOwotCi0JQ0hFQ0tJVAotCWlmICghIHJlYWxfc3RhdCkgewotCQlyZWFsX3N0YXQgPSAoaW50ICgqKShjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKQotCQkJZGxzeW0oUlRMRF9ORVhULCAic3RhdCIpOwotCX0KLQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJTVEFUOiAlc1xuIiwgcGF0aCk7Ci0KLQlyZXR1cm4ocmVhbF9zdGF0KHBhdGgsIGJ1ZikpOwotfQotCi1pbnQgc3RhdDY0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpIHsKLQlzdGF0aWMgaW50ICgqcmVhbF9zdGF0NjQpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKikgPSBOVUxMOwotCi0JQ0hFQ0tJVAotCWlmICghIHJlYWxfc3RhdDY0KSB7Ci0JCXJlYWxfc3RhdDY0ID0gKGludCAoKikoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKSkKLQkJCWRsc3ltKFJUTERfTkVYVCwgInN0YXQ2NCIpOwotCX0KLQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJTVEFUNjQ6ICVzXG4iLCBwYXRoKTsKLQotCXJldHVybihyZWFsX3N0YXQ2NChwYXRoLCBidWYpKTsKLX0KLQotaW50IGNob3duKGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCkgewotCXN0YXRpYyBpbnQgKCpyZWFsX2Nob3duKShjb25zdCBjaGFyICosIHVpZF90LCBnaWRfdCkgPSBOVUxMOwotCi0JQ0hFQ0tJVAotCWlmICghIHJlYWxfY2hvd24pIHsKLQkJcmVhbF9jaG93biA9IChpbnQgKCopKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KSkKLQkJCWRsc3ltKFJUTERfTkVYVCwgImNob3duIik7Ci0JfQotCi0JaWYgKHJvb3QpIHsKLQkJcmV0dXJuKHJlYWxfY2hvd24ocGF0aCwgb3duZXIsIGdyb3VwKSk7Ci0JfQotCi0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkNIT1dOOiAlcyAlZCAlZFxuIiwgcGF0aCwgb3duZXIsIGdyb3VwKTsKLQotCWlmIChzdHJzdHIocGF0aCwgIi9kZXYiKSA9PSBwYXRoKSB7Ci0JCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJDSE9XTjogcmV0dXJuIDBcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4ocmVhbF9jaG93bihwYXRoLCBvd25lciwgZ3JvdXApKTsKLX0KLQotZXh0ZXJuIGludCAqX19lcnJub19sb2NhdGlvbiAodm9pZCk7Ci0jaWZuZGVmIEVOT0RFVgotI2RlZmluZSBFTk9ERVYgMTkKLSNlbmRpZgotCi1pbnQgaW9wZXJtKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBudW0sIGludCB0dXJuX29uKSB7Ci0Jc3RhdGljIGludCAoKnJlYWxfaW9wZXJtKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpID0gTlVMTDsKLQotCUNIRUNLSVQKLQlpZiAoISByZWFsX2lvcGVybSkgewotCQlyZWFsX2lvcGVybSA9IChpbnQgKCopKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCkpCi0JCQlkbHN5bShSVExEX05FWFQsICJpb3Blcm0iKTsKLQl9Ci0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIklPUEVSTTogJWQgJWQgJWRcbiIsIChpbnQpIGZyb20sIChpbnQpIG51bSwgdHVybl9vbik7Ci0JaWYgKHJvb3QpIHsKLQkJcmV0dXJuKHJlYWxfaW9wZXJtKGZyb20sIG51bSwgdHVybl9vbikpOwotCX0KLQlpZiAoZnJvbSA9PSAwICYmIG51bSA9PSAxMDI0ICYmIHR1cm5fb24gPT0gMSkgewotCQkvKiB3ZSB3YW50IHhmODZFbmFibGVJTyB0byBmYWlsICovCi0JCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJJT1BFUk06IHNldHRpbmcgRU5PREVWLlxuIik7Ci0JCSpfX2Vycm5vX2xvY2F0aW9uKCkgPSBFTk9ERVY7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpb3BsKGludCBsZXZlbCkgewotCXN0YXRpYyBpbnQgKCpyZWFsX2lvcGwpKGludCkgPSBOVUxMOwotCi0JQ0hFQ0tJVAotCWlmICghIHJlYWxfaW9wbCkgewotCQlyZWFsX2lvcGwgPSAoaW50ICgqKShpbnQpKSBkbHN5bShSVExEX05FWFQsICJpb3BsIik7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJJT1BMOiAlZFxuIiwgbGV2ZWwpOwotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2lvcGwobGV2ZWwpKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBJTlRFUlBPU0VfR0VUVUlEIAotCi0vKgotICogd2UgZ290IHRoaW5ncyB0byB3b3JrIHcvbyBwcmV0ZW5kaW5nIHRvIGJlIHJvb3QuCi0gKiBzbyB3ZSBubyBsb25nZXIgaW50ZXJwb3NlIGdldHVpZCgpLCBldGMuCi0gKi8KLQotdWlkX3QgZ2V0dWlkKHZvaWQpIHsKLQlzdGF0aWMgdWlkX3QgKCpyZWFsX2dldHVpZCkodm9pZCkgPSBOVUxMOwotCUNIRUNLSVQKLQlpZiAoISByZWFsX2dldHVpZCkgewotCQlyZWFsX2dldHVpZCA9ICh1aWRfdCAoKikodm9pZCkpIGRsc3ltKFJUTERfTkVYVCwgImdldHVpZCIpOwotCX0KLQlpZiAocm9vdCkgewotCQlyZXR1cm4ocmVhbF9nZXR1aWQoKSk7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJHRVRVSUQ6IDBcbiIpOwotCXJldHVybiAwOwotfQotdWlkX3QgZ2V0ZXVpZCh2b2lkKSB7Ci0Jc3RhdGljIHVpZF90ICgqcmVhbF9nZXRldWlkKSh2b2lkKSA9IE5VTEw7Ci0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZ2V0ZXVpZCkgewotCQlyZWFsX2dldGV1aWQgPSAodWlkX3QgKCopKHZvaWQpKSBkbHN5bShSVExEX05FWFQsICJnZXRldWlkIik7Ci0JfQotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2dldGV1aWQoKSk7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJHRVRFVUlEOiAwXG4iKTsKLQlyZXR1cm4gMDsKLX0KLXVpZF90IGdldGV1aWRfa2x1ZGdlMSh2b2lkKSB7Ci0Jc3RhdGljIHVpZF90ICgqcmVhbF9nZXRldWlkKSh2b2lkKSA9IE5VTEw7Ci0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZ2V0ZXVpZCkgewotCQlyZWFsX2dldGV1aWQgPSAodWlkX3QgKCopKHZvaWQpKSBkbHN5bShSVExEX05FWFQsICJnZXRldWlkIik7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJHRVRFVUlEOiAwIHNhd19saWJtb2R1bGVzPSVkXG4iLCBzYXdfbGliX21vZHVsZXMpOwotCWlmIChyb290ICYmICFzYXdfbGliX21vZHVsZXMpIHsKLQkJcmV0dXJuKHJlYWxfZ2V0ZXVpZCgpKTsKLQl9IGVsc2UgewotCQlzYXdfbGliX21vZHVsZXMgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXVpZF90IGdldHVpZDMyKHZvaWQpIHsKLQlzdGF0aWMgdWlkX3QgKCpyZWFsX2dldHVpZDMyKSh2b2lkKSA9IE5VTEw7Ci0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZ2V0dWlkMzIpIHsKLQkJcmVhbF9nZXR1aWQzMiA9ICh1aWRfdCAoKikodm9pZCkpIGRsc3ltKFJUTERfTkVYVCwgImdldHVpZDMyIik7Ci0JfQotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2dldHVpZDMyKCkpOwotCX0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiR0VUVUlEMzI6IDBcbiIpOwotCXJldHVybiAwOwotfQotdWlkX3QgZ2V0ZXVpZDMyKHZvaWQpIHsKLQlzdGF0aWMgdWlkX3QgKCpyZWFsX2dldGV1aWQzMikodm9pZCkgPSBOVUxMOwotCUNIRUNLSVQKLQlpZiAoISByZWFsX2dldGV1aWQzMikgewotCQlyZWFsX2dldGV1aWQzMiA9ICh1aWRfdCAoKikodm9pZCkpIGRsc3ltKFJUTERfTkVYVCwgImdldGV1aWQzMiIpOwotCX0KLQlpZiAocm9vdCkgewotCQlyZXR1cm4ocmVhbF9nZXRldWlkMzIoKSk7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJHRVRFVUlEMzI6IDBcbiIpOwotCXJldHVybiAwOwotfQotCi1naWRfdCBnZXRnaWQodm9pZCkgewotCXN0YXRpYyBnaWRfdCAoKnJlYWxfZ2V0Z2lkKSh2b2lkKSA9IE5VTEw7Ci0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZ2V0Z2lkKSB7Ci0JCXJlYWxfZ2V0Z2lkID0gKGdpZF90ICgqKSh2b2lkKSkgZGxzeW0oUlRMRF9ORVhULCAiZ2V0Z2lkIik7Ci0JfQotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2dldGdpZCgpKTsKLQl9Ci0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkdFVEdJRDogMFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1naWRfdCBnZXRlZ2lkKHZvaWQpIHsKLQlzdGF0aWMgZ2lkX3QgKCpyZWFsX2dldGVnaWQpKHZvaWQpID0gTlVMTDsKLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9nZXRlZ2lkKSB7Ci0JCXJlYWxfZ2V0ZWdpZCA9IChnaWRfdCAoKikodm9pZCkpIGRsc3ltKFJUTERfTkVYVCwgImdldGVnaWQiKTsKLQl9Ci0JaWYgKHJvb3QpIHsKLQkJcmV0dXJuKHJlYWxfZ2V0ZWdpZCgpKTsKLQl9Ci0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkdFVEVHSUQ6IDBcbiIpOwotCXJldHVybiAwOwotfQotZ2lkX3QgZ2V0Z2lkMzIodm9pZCkgewotCXN0YXRpYyBnaWRfdCAoKnJlYWxfZ2V0Z2lkMzIpKHZvaWQpID0gTlVMTDsKLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9nZXRnaWQzMikgewotCQlyZWFsX2dldGdpZDMyID0gKGdpZF90ICgqKSh2b2lkKSkgZGxzeW0oUlRMRF9ORVhULCAiZ2V0Z2lkMzIiKTsKLQl9Ci0JaWYgKHJvb3QpIHsKLQkJcmV0dXJuKHJlYWxfZ2V0Z2lkMzIoKSk7Ci0JfQotCWlmIChkZWJ1ZykgZnByaW50ZihzdGRlcnIsICJHRVRHSUQzMjogMFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1naWRfdCBnZXRlZ2lkMzIodm9pZCkgewotCXN0YXRpYyBnaWRfdCAoKnJlYWxfZ2V0ZWdpZDMyKSh2b2lkKSA9IE5VTEw7Ci0JQ0hFQ0tJVAotCWlmICghIHJlYWxfZ2V0ZWdpZDMyKSB7Ci0JCXJlYWxfZ2V0ZWdpZDMyID0gKGdpZF90ICgqKSh2b2lkKSkgZGxzeW0oUlRMRF9ORVhULCAiZ2V0ZWdpZDMyIik7Ci0JfQotCWlmIChyb290KSB7Ci0JCXJldHVybihyZWFsX2dldGVnaWQzMigpKTsKLQl9Ci0JaWYgKGRlYnVnKSBmcHJpbnRmKHN0ZGVyciwgIkdFVEVHSUQzMjogMFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmIDAKLS8qIG1heWJlIHdlIG5lZWQgdG8gaW50ZXJwb3NlIG9uIHN0cmNtcCBzb21lZGF5Li4uIGhlcmUgaXMgdGhlIHRlbXBsYXRlICovCi1pbnQgc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgewotCXN0YXRpYyBpbnQgKCpyZWFsX3N0cmNtcCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopID0gTlVMTDsKLQlDSEVDS0lUCi0JaWYgKCEgcmVhbF9zdHJjbXApIHsKLQkJcmVhbF9zdHJjbXAgPSAoaW50ICgqKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGRsc3ltKFJUTERfTkVYVCwgInN0cmNtcCIpOwotCX0KLQlpZiAoZGVidWcpIGZwcmludGYoc3RkZXJyLCAiU1RSQ01QOiAnJXMnICclcydcbiIsIHMxLCBzMik7Ci0JcmV0dXJuKHJlYWxfc3RyY21wKHMxLCBzMikpOwotfQotI2VuZGlmCi0KLSNjb2RlX2VuZAotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvYmxvY2tkcHkuYyBiL3gxMXZuYy9taXNjL2Jsb2NrZHB5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjQyOGUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvYmxvY2tkcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKgotICogYmxvY2tkcHkuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKLSAqICBVU0EuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoaXMgdG9vbCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggeDExdm5jLiAgSXQgaXMgYSBrbHVkZ2UgdG8gdHJ5IHRvIAotICogImJsb2NrIiBhY2Nlc3MgdmlhIHRoZSBwaHlzaWNhbCBkaXNwbGF5IHdoaWxlIHgxMXZuYyBpcyBydW5uaW5nLgotICoKLSAqIFRoZSBleHBlY3RlZCBhcHBsaWNhdGlvbiBpcyB0aGF0IG9mIGEgdXNlciB3aG8gc2NyZWVuLWxvY2tzIGhpcwotICogd29ya3N0YXRpb24gYmVmb3JlIGxlYXZpbmcgYW5kIHRoZW4gbGF0ZXIgdW5sb2NrcyBpdCByZW1vdGVseSB2aWEKLSAqIHgxMXZuYy4gIFRoZSB1c2VyIGlzIGNvbmNlcm5lZCBwZW9wbGUgd2l0aCBwaHlzaWNhbCBhY2Nlc3MgdG8gdGhlCi0gKiBtYWNoaW5lIHdpbGwgYmUgd2F0Y2hpbmcsIGV0Yy4KLSAqCi0gKiBPZiBjb3Vyc2UgaWYgcGVvcGxlIGhhdmUgcGh5c2ljYWwgYWNjZXNzIHRvIHRoZSBtYWNoaW5lIHRoZXJlIGFyZQotICogbXVjaCBsYXJnZXIgcG90ZW50aWFsIHNlY3VyaXR5IHByb2JsZW1zLCBidXQgdGhlIGlkZWEgaGVyZSBpcyB0byBwdXQKLSAqIHVwIGEgbGFyZ2VyIGJhcnJpZXIgdGhhbiBzaW1wbHkgdHVybmluZyBvbiB0aGUgbW9uaXRvciBhbmQgdGFwcGluZwotICogdGhlIG1vdXNlIChpLmUuIHRvIHdha2UgdXAgdGhlIG1vbml0b3IgZnJvbSBEUE1TIGFuZCB0aGVuIG9ic2VydmUKLSAqIHRoZSB4MTF2bmMgYWN0aXZpdHkpLgotICoKLSAqIFRoaXMgcHJvZ3JhbSByZXF1aXJlcyBEUE1TIHN1cHBvcnQgaW4gdGhlIHZpZGVvIGNhcmQgYW5kIG1vbml0b3IsCi0gKiBhbmQgdGhlIERQTVMgZXh0ZW5zaW9uIGluIHRoZSBYIHNlcnZlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIGxpYnJhcnkgd2l0aCB0aGUgRFBNUyBBUEkgKGxpYlhleHQpLgotICoKLSAqIEl0IHN0YXJ0cyBvZmYgYnkgZm9yY2luZyB0aGUgc3RhdGUgdG8gYmUgRFBNU01vZGVPZmYgKGxvd2VzdCBwb3dlcikuCi0gKiBUaGVuIGl0IHBlcmlvZGljYWxseSAoYSBmZXcgdGltZXMgYSBzZWNvbmQpIGNoZWNrcyBpZiB0aGUgc3lzdGVtIGlzCi0gKiBzdGlsbCBpbiB0aGF0IHN0YXRlLiAgSWYgaXQgZGlzY292ZXJzIGl0IHRvIGJlIGluIGFub3RoZXIgc3RhdGUsIGl0Ci0gKiBpbW1lZGlhdGVseSBydW5zLCBhcyBhIHNlcGFyYXRlIGNvbW1hbmQsIGEgc2NyZWVuLWxvY2sgcHJvZ3JhbSwgInhsb2NrIgotICogYnkgZGVmYXVsdC4gIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBYTE9DS19DTUQgb3IgLWxvY2sgb3B0aW9uIGNhbgotICogb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LiAgInhzY3JlZW5zYXZlci1jb21tYW5kIiBtaWdodCBiZSBhbm90aGVyIGNob2ljZS4KLSAqCi0gKiBJdCBpcyB1cCB0byB0aGUgdXNlciB0byBtYWtlIHN1cmUgdGhlIHNjcmVlbi1sb2NrIGNvbW1hbmQgd29ya3MKLSAqIGFuZCBQQVRIIGlzIHNldCB1cCBjb3JyZWN0bHksIGV0Yy4gIFRoZSBjb21tYW5kIGNhbiBkbyBhbnl0aGluZywKLSAqIGl0IGRvZXNuJ3QgaGF2ZSB0byBsb2NrIHRoZSBzY3JlZW4uICBJdCBjb3VsZCBtYWtlIHRoZSBzb3VuZCBvZiBhCi0gKiBkb2cgYmFya2luZywgZm9yIGV4YW1wbGUgOi0pCi0gKgotICogVGhlIG9wdGlvbiAnLWdyYWInIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBhZGRpdGlvbmFsbHkgY2FsbAotICogWEdyYWJTZXJ2ZXIoKSB0byB0cnkgdG8gcHJldmVudCBwaHlzaWNhbCBtb3VzZSBvciBrZXlib2FyZCBpbnB1dCB0byBnZXQKLSAqIHRvIGFueSBhcHBsaWNhdGlvbnMgb24gdGhlIHNjcmVlbi4gIE5PVEU6IGRvIE5PVCB1c2UsIG5vdCB3b3JraW5nIHlldCEKLSAqIEZyZWV6ZXMgZXZlcnl0aGluZy4KLSAqCi0gKiBUaGUgb3B0aW9uczogLWRpc3BsYXkgYW5kIC1hdXRoIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgRElTUExBWSBhbmQKLSAqIFhBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSB0aGUgY29tbWFuZCBsaW5lLgotICoKLSAqIFRoZSBvcHRpb25zIC1zdGFuZGJ5IGFuZCAtc3VzcGVuZCBjaGFuZ2UgdGhlIGRlc2lyZWQgRFBNUyBsZXZlbAotICogdG8gYmUgRFBNU01vZGVTdGFuZGJ5IGFuZCBEUE1TTW9kZVN1c3BlbmQsIHJlc3BlY3RpdmVseS4gCi0gKgotICogVGhlIG9wdGlvbiAnLWYgZmxhZ2ZpbGUnIGluZGljYXRlcyBhIGZsYWcgZmlsZSB0byB3YXRjaCBmb3IgdG8gY2F1c2UKLSAqIHRoZSBwcm9ncmFtIHRvIGNsZWFuIHVwIGFuZCBleGl0IG9uY2UgaXQgZXhpc3RzLiAgTm8gc2NyZWVuIGxvY2tpbmcgaXMKLSAqIGRvbmUgd2hlbiB0aGUgZmlsZSBhcHBlYXJzOiBpdCBpcyBhbiAnYWxsIGNsZWFyJyBmbGFnLiAgUHJlc3VtYWJseSB0aGUKLSAqIHgxMXZuYyB1c2VyIGhhcyByZWxvY2tlZCB0aGUgc2NyZWVuIGJlZm9yZSB0aGUgZmxhZ2ZpbGUgaXMgY3JlYXRlZC4KLSAqIFNlZSBiZWxvdyBmb3IgY291cGxpbmcgdGhpcyBiZWhhdmlvciB3aXRoIHRoZSAtZ29uZSBjb21tYW5kLgotICoKLSAqIFRoZSBvcHRpb24gJy1iZycgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGZvcmsgaW50byB0aGUgYmFja2dyb3VuZCBhbmQKLSAqIHJldHVybiAwIGlmIGV2ZXJ5dGhpbmcgbG9va3Mgb2suICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgdXAgdG8gdGhhdAotICogcG9pbnQgdGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSAxLgotICogCi0gKiBPcHRpb24gJy12JyBwcmludHMgbW9yZSBpbmZvIG91dCwgdXNlZnVsIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0gKiAKLSAqIAotICogVGhlc2Ugb3B0aW9ucyBhbGxvdyB0aGlzIHNvcnQgb2YgeDExdm5jIHVzYWdlOgotICoKLSAqIHgxMXZuYyAuLi4gLWFjY2VwdCAiYmxvY2tkcHkgLWJnIC1mICRIT01FLy5iZHB5IiAtZ29uZSAidG91Y2ggJEhPTUUvLmJkcHkiCi0gKgotICogKHRoaXMgbWF5IGFsc28gd29yayBmb3IgZ29uZTogLWdvbmUgImtpbGxhbGwgYmxvY2tkcHkiKQotICoKLSAqIEluIHRoZSBhYm92ZSwgb25jZSBhIGNsaWVudCBjb25uZWN0cyB0aGlzIHByb2dyYW0gc3RhcnRzIHVwIGluIHRoZQotICogYmFja2dyb3VuZCBhbmQgbW9uaXRvcnMgdGhlIERQTVMgbGV2ZWwuICBXaGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMKLSAqIChoZSByZWxvY2tlZCB0aGUgc2NyZWVuIGJlZm9yZSBkb2luZyBzbykgdGhlIGZsYWcgZmlsZSBpcyBjcmVhdGVkIGFuZAotICogc28gdGhpcyBwcm9ncmFtIGV4aXRzIG5vcm1hbGx5LiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBwaHlzaWNhbAotICogbW91c2Ugb3Iga2V5Ym9hcmQgd2FzIHVzZWQgZHVyaW5nIHRoZSBzZXNzaW9uLCB0aGlzIHByb2dyYW0gd291bGQKLSAqIGhhdmUgbG9ja2VkIHRoZSBzY3JlZW4gYXMgc29vbiBhcyBpdCBub3RpY2VkIHRoZSBEUE1TIGNoYW5nZS4KLSAqCi0gKiBPbmUgY291bGQgY3JlYXRlIHNoZWxsIHNjcmlwdHMgZm9yIC1hY2NlcHQgYW5kIC1nb25lIHRoYXQgZG8gbXVjaAotICogbW9yZSBzb3BoaXN0aWNhdGVkIHRoaW5ncy4gIFRoaXMgd291bGQgYmUgbmVlZGVkIGlmIG1vcmUgdGhhbiBvbmUKLSAqIGNsaWVudCBjb25uZWN0cyBhdCBhIHRpbWUuCi0gKgotICogSXQgaXMgaW1wb3J0YW50IHRvIHJlbWVtYmVyIG9uY2UgdGhpcyBwcm9ncmFtIGxvY2tzIHRoZSBzY3JlZW4KLSAqIGl0ICpleGl0cyosIHNvIG5vdGhpbmcgd2lsbCBiZSB3YXRjaGluZyB0aGUgc2NyZWVuIGF0IHRoYXQgcG9pbnQuCi0gKiBEb24ndCBpbW1lZGlhdGVseSB1bmxvY2sgdGhlIHNjcmVlbiBmcm9tIGluIHgxMXZuYyEhICBCZXN0IHRvIHRoaW5rCi0gKiBhYm91dCB3aGF0IG1pZ2h0IGhhdmUgaGFwcGVuZWQsIGRpc2Nvbm5lY3QgdGhlIFZOQyB2aWV3ZXIsIGFuZCB0aGVuCi0gKiByZXN0YXJ0IHgxMXZuYyAodGhlcmVieSBoYXZpbmcgdGhpcyBtb25pdG9yaW5nIHByb2dyYW0gc3RhcnRlZCBhZ2FpbikuCi0gKgotICoKLSAqIFRvIGNvbXBpbGUgb24gTGludXggb3IgU29sYXJpczoKLQotIGNjIC1vIGJsb2NrZHB5IGJsb2NrZHB5LmMgLUwgL3Vzci9YMTFSNi9saWIgLUwgL3Vzci9vcGVud2luL2xpYiAtbFgxMSAtbFhleHQKLQotICogKG1heSBhbHNvIG5lZWQgLUkgL3Vzci8uLi4vaW5jbHVkZSBvbiBvbGRlciBtYWNoaW5lcykuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1hwcm90by5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RwbXMuaD4KLQotRGlzcGxheSAqZHB5ID0gTlVMTDsKLUNBUkQxNiBzdGFuZGJ5LCBzdXNwZW5kLCBvZmY7Ci1pbnQgZ3JhYiA9IDA7Ci1pbnQgdmVyYm9zZSA9IDA7Ci1pbnQgYmcgPSAwOwotCi0vKiBmb3Igc2xlZXBpbmcgc29tZSBudW1iZXIgb2YgbWlsbGlzZWNzICovCi1zdHJ1Y3QgdGltZXZhbCBfbXlzbGVlcDsKLSNkZWZpbmUgbXNsZWVwKHgpIFwKLSAgICAgICAgX215c2xlZXAudHZfc2VjICA9ICgoeCkqMTAwMCkgLyAxMDAwMDAwOyBcCi0gICAgICAgIF9teXNsZWVwLnR2X3VzZWMgPSAoKHgpKjEwMDApICUgMTAwMDAwMDsgXAotICAgICAgICBzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJl9teXNsZWVwKTsgCi0KLS8qIGNhbGxlZCBvbiBzaWduYWwgb3IgaWYgRFBNUyBjaGFuZ2VkLCBvciBvdGhlciBwcm9ibGVtICovCi12b2lkIHJlc2V0KGludCBzaWcpIHsKLQlpZiAoZ3JhYikgewotCQlpZiAodmVyYm9zZSkgewotCQkJZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIFhVbmdyYWJTZXJ2ZXIoKVxuIik7Ci0JCX0KLQkJWFVuZ3JhYlNlcnZlcihkcHkpOwotCX0KLQlpZiAodmVyYm9zZSkgewotCQlmcHJpbnRmKHN0ZGVyciwgInJlc2V0dGluZyBvcmlnaW5hbCBEUE1TIHZhbHVlcy5cbiIpOyAKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJibG9ja2RweTogcmVzZXQgc2lnPSVkIGNhbGxlZFxuIiwgc2lnKTsKLQlEUE1TRW5hYmxlKGRweSk7Ci0JRFBNU1NldFRpbWVvdXRzKGRweSwgc3RhbmRieSwgc3VzcGVuZCwgb2ZmKTsKLQlYRmx1c2goZHB5KTsKLQlpZiAoc2lnKSB7Ci0JCVhDbG9zZURpc3BsYXkoZHB5KTsKLQkJZXhpdCgwKTsKLQl9Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotCi0JaW50IHZlcmJvc2UgPSAwLCBiZyA9IDA7Ci0JaW50IGksIGV2LCBlcjsKLQljaGFyICpsb2NrX2NtZCA9ICJ4bG9jayI7Ci0JY2hhciAqZmxhZ19maWxlID0gTlVMTDsKLQljaGFyIGVzdHJbMTAwXSwgY21kWzUwMF07Ci0Jc3RydWN0IHN0YXQgc2J1ZjsKLQlDQVJEMTYgcG93ZXI7Ci0JQ0FSRDE2IGRlc2lyZWQgPSBEUE1TTW9kZU9mZjsKLQlCT09MIHN0YXRlOwotCQotCi0JLyogc2V0dXAgdGhlIGxvY2sgY29tbWFuZC4gaXQgbWF5IGJlIHJlc2V0IGJ5IC1sb2NrIGJlbG93LiAqLwotCWlmIChnZXRlbnYoIlhMT0NLX0NNRCIpKSB7Ci0JCWxvY2tfY21kID0gKGNoYXIgKikgZ2V0ZW52KCJYTE9DS19DTUQiKTsKLQl9Ci0KLQkvKiBwcm9jZXNzIGNtZCBsaW5lOiAqLwotCWZvciAoaT0xOyBpPGFyZ2M7IGkrKykgewotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWRpc3BsYXkiKSkgewotCQkJc3ByaW50Zihlc3RyLCAiRElTUExBWT0lcyIsIGFyZ3ZbKytpXSk7Ci0JCQlwdXRlbnYoc3RyZHVwKGVzdHIpKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYXV0aCIpKSB7Ci0JCQlzcHJpbnRmKGVzdHIsICJYQVVUSE9SSVRZPSVzIiwgYXJndlsrK2ldKTsKLQkJCXB1dGVudihzdHJkdXAoZXN0cikpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1sb2NrIikpIHsKLQkJCWxvY2tfY21kID0gYXJndlsrK2ldOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1mIikpIHsKLQkJCWZsYWdfZmlsZSA9IGFyZ3ZbKytpXTsKLQkJCXVubGluayhmbGFnX2ZpbGUpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1ncmFiIikpIHsKLQkJCWdyYWIgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iZyIpKSB7Ci0JCQliZyA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXYiKSkgewotCQkJdmVyYm9zZSA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXN0YW5kYnkiKSkgewotCQkJZGVzaXJlZCA9IERQTVNNb2RlU3RhbmRieTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItc3VzcGVuZCIpKSB7Ci0JCQlkZXNpcmVkID0gRFBNU01vZGVTdXNwZW5kOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vZmYiKSkgewotCQkJZGVzaXJlZCA9IERQTVNNb2RlT2ZmOwotCQl9Ci0JfQotCi0JLyogd2Ugd2FudCBpdCB0byBnbyBpbnRvIGJhY2tncm91bmQgdG8gYXZvaWQgYmxvY2tpbmcsIHNvIGFkZCAnJicuICovCi0Jc3RyY3B5KGNtZCwgbG9ja19jbWQpOwotCXN0cmNhdChjbWQsICIgJiIpOwotCWxvY2tfY21kID0gY21kOwotCi0JLyogY2xvc2UgYW55IGZpbGUgZGVzY3JpcHRvcnMgd2UgbWF5IGhhdmUgaW5oZXJpdGVkIChlLmcuIHBvcnQgNTkwMCkgKi8KLQlmb3IgKGk9MzsgaTw9MTAwOyBpKyspIHsKLQkJY2xvc2UoaSk7Ci0JfQotCi0JLyogb3BlbiBESVNQTEFZICovCi0JZHB5ID0gWE9wZW5EaXNwbGF5KE5VTEwpOwotCWlmICghIGRweSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlhPcGVuRGlzcGxheSBmYWlsZWQuXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQkvKiBjaGVjayBmb3IgRFBNUyBleHRlbnNpb24gKi8KLQlpZiAoISBEUE1TUXVlcnlFeHRlbnNpb24oZHB5LCAmZXYsICZlcikpIHsKLQkJZnByaW50ZihzdGRlcnIsICJEUE1TUXVlcnlFeHRlbnNpb24gZmFpbGVkLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmICghIERQTVNDYXBhYmxlKGRweSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJEUE1TQ2FwYWJsZSBmYWlsZWQuXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JLyogbWFrZSBzdXJlIERQTVMgaXMgZW5hYmxlZCAqLwotCWlmICghIERQTVNFbmFibGUoZHB5KSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkRQTVNFbmFibGUgZmFpbGVkLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogcmV0cmlldmUgdGhlIHRpbWVvdXRzIGZvciBsYXRlciByZXNldHRpbmcgKi8KLQlpZiAoISBEUE1TR2V0VGltZW91dHMoZHB5LCAmc3RhbmRieSwgJnN1c3BlbmQsICZvZmYpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiRFBNU0dldFRpbWVvdXRzIGZhaWxlZC5cbiIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoISBzdGFuZGJ5IHx8ICEgc3VzcGVuZCB8fCAhIG9mZikgewotCQkvKiBpZiBub25lLCBzZXQgdG8gc29tZSByZWFzb25hYmxlIHZhbHVlcyAqLwotCQlzdGFuZGJ5ID0gOTAwOwotCQlzdXNwZW5kID0gMTIwMDsKLQkJb2ZmID0gMTgwMDsKLQl9Ci0JaWYgKHZlcmJvc2UpIHsKLQkJZnByaW50ZihzdGRlcnIsICJEUE1TIHRpbWVvdXRzOiAlZCAlZCAlZFxuIiwgc3RhbmRieSwKLQkJICAgIHN1c3BlbmQsIG9mZik7Ci0JfQotCi0JLyogbm93IHNldCB0aGVtIHRvIHZlcnkgc21hbGwgdmFsdWVzICovCi0JaWYgKGRlc2lyZWQgPT0gRFBNU01vZGVPZmYpIHsKLQkJaWYgKCEgRFBNU1NldFRpbWVvdXRzKGRweSwgMSwgMSwgMSkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiRFBNU1NldFRpbWVvdXRzIGZhaWxlZC5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0gZWxzZSBpZiAoZGVzaXJlZCA9PSBEUE1TTW9kZVN1c3BlbmQpIHsKLQkJaWYgKCEgRFBNU1NldFRpbWVvdXRzKGRweSwgMSwgMSwgMCkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiRFBNU1NldFRpbWVvdXRzIGZhaWxlZC5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0gZWxzZSBpZiAoZGVzaXJlZCA9PSBEUE1TTW9kZVN0YW5kYnkpIHsKLQkJaWYgKCEgRFBNU1NldFRpbWVvdXRzKGRweSwgMSwgMCwgMCkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiRFBNU1NldFRpbWVvdXRzIGZhaWxlZC5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQlYRmx1c2goZHB5KTsKLQotCS8qIHNldCBoYW5kbGVycyBmb3IgY2xlYW4gdXAgaW4gY2FzZSB3ZSB0ZXJtaW5hdGUgdmlhIHNpZ25hbCAqLwotCXNpZ25hbChTSUdIVVAsICByZXNldCk7Ci0Jc2lnbmFsKFNJR0lOVCwgIHJlc2V0KTsKLQlzaWduYWwoU0lHUVVJVCwgcmVzZXQpOwotCXNpZ25hbChTSUdBQlJULCByZXNldCk7Ci0Jc2lnbmFsKFNJR1RFUk0sIHJlc2V0KTsKLQotCS8qIGZvcmNlIHN0YXRlIGludG8gRFBNUyBPZmYgKGxvd2VzdCBwb3dlcikgbW9kZSAqLwotCWlmICghIERQTVNGb3JjZUxldmVsKGRweSwgZGVzaXJlZCkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJEUE1TRm9yY2VMZXZlbCBmYWlsZWQuXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JWEZsdXNoKGRweSk7Ci0KLQkvKiByZWFkIHN0YXRlICovCi0JbXNsZWVwKDUwMCk7Ci0JaWYgKCEgRFBNU0luZm8oZHB5LCAmcG93ZXIsICZzdGF0ZSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJEUE1TSW5mbyBmYWlsZWQuXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJwb3dlcjogJWQgc3RhdGU6ICVkXG4iLCBwb3dlciwgc3RhdGUpOyAKLQotCS8qIGdyYWIgZGlzcGxheSBpZiBkZXNpcmVkLiBOT1QgV09SS0lORyAqLwotCWlmIChncmFiKSB7Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgWEdyYWJTZXJ2ZXIoKVxuIik7Ci0JCX0KLQkJWEdyYWJTZXJ2ZXIoZHB5KTsKLQl9Ci0KLQkvKiBnbyBpbnRvIGJhY2tncm91bmQgaWYgZGVzaXJlZC4gKi8KLQlpZiAoYmcpIHsKLQkJcGlkX3QgcDsKLQkJaWYgKChwID0gZm9yaygpKSAhPSAwKSB7Ci0JCQlpZiAocCA8IDApIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gZm9ya2luZy5cbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFhYWCBubyBmZCBjbG9zaW5nICovCi0JCQkJZXhpdCgwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIG1haW4gbG9vcDogKi8KLQl3aGlsZSAoMSkgewotCQkvKiByZWFzc2VydCBEUE1TTW9kZU9mZiAoZGVzaXJlZCkgKi8KLQkJaWYgKHZlcmJvc2UpIGZwcmludGYoc3RkZXJyLCAicmVhc3NlcnRpbmcgZGVzaXJlZCBEUE1TTW9kZVxuIik7Ci0JCURQTVNGb3JjZUxldmVsKGRweSwgZGVzaXJlZCk7Ci0JCVhGbHVzaChkcHkpOwotCi0JCS8qIHdhaXQgYSBiaXQgKi8KLQkJbXNsZWVwKDIwMCk7Ci0KLQkJLyogY2hlY2sgZm9yIGZsYWcgZmlsZSBhcHBlYXJlbmNlICovCi0JCWlmIChmbGFnX2ZpbGUgJiYgc3RhdChmbGFnX2ZpbGUsICZzYnVmKSA9PSAwKSB7Ci0JCQlpZiAodmVyYm9zZSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiZmxhZyBmb3VuZDogJXNcbiIsIGZsYWdfZmlsZSk7Ci0JCQl9Ci0JCQl1bmxpbmsoZmxhZ19maWxlKTsKLQkJCXJlc2V0KDApOwotCQkJZXhpdCgwKTsKLQkJfQotCi0JCS8qIGNoZWNrIHN0YXRlIGFuZCBwb3dlciBsZXZlbCAqLwotCQlpZiAoISBEUE1TSW5mbyhkcHksICZwb3dlciwgJnN0YXRlKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJEUE1TSW5mbyBmYWlsZWQuXG4iKTsKLQkJCXJlc2V0KDApOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAodmVyYm9zZSkgewotCQkJZnByaW50ZihzdGRlcnIsICJwb3dlcjogJWQgc3RhdGU6ICVkXG4iLCBwb3dlciwgc3RhdGUpOyAKLQkJfQotCQlpZiAoIXN0YXRlIHx8IHBvd2VyICE9IGRlc2lyZWQpIHsKLQkJCS8qIFNvbWVvbmUgKG9yIG1heWJlIGEgY2F0KSBpcyBldmlkZW50bHkgd2F0Y2hpbmcuLi4gICovCi0JCQlmcHJpbnRmKHN0ZGVyciwgIkRQTVMgQ0hBTkdFOiBwb3dlcjogJWQgc3RhdGU6ICVkXG4iLAotCQkJICAgIHBvd2VyLCBzdGF0ZSk7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVzZXQoMCk7Ci0JZnByaW50ZihzdGRlcnIsICJsb2NraW5nIHNjcmVlbiB3aXRoIGNvbW1hbmQ6IFwiJXNcIlxuIiwgbG9ja19jbWQpOyAKLQlzeXN0ZW0obG9ja19jbWQpOwotCWV4aXQoMCk7Ci19CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9jb25uZWN0X3N3aXRjaCBiL3gxMXZuYy9taXNjL2Nvbm5lY3Rfc3dpdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODM3NmM2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2Nvbm5lY3Rfc3dpdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCBieSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotIwotIyBjb25uZWN0X3N3aXRjaCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBjb25uZWN0X3N3aXRjaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIGNvbm5lY3Rfc3dpdGNoOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi0jIG9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIAotIyAKLSMgY29ubmVjdF9zd2l0Y2g6Ci0jCi0jIEEga2x1ZGdlIHNjcmlwdCB0aGF0IHNpdHMgYmV0d2VlbiB3ZWIgY2xpZW50cyBhbmQgYSBtb2Rfc3NsIChodHRwcykKLSMgZW5hYmxlZCBhcGFjaGUgd2Vic2VydmVyLiAgCi0jCi0jIElmIGFuIGluY29taW5nIHdlYiBjbGllbnQgY29ubmVjdGlvbiBtYWtlcyBhIHByb3h5IENPTk5FQ1QgcmVxdWVzdAotIyBpdCBpcyBoYW5kbGVkIGRpcmVjdGx5IGJ5IHRoaXMgc2NyaXB0IChhcGFjaGUgaXMgbm90IGludm9sdmVkKS4KLSMgT3RoZXJ3aXNlLCBhbGwgb3RoZXIgY29ubmVjdGlvbnMgYXJlIGZvcndhcmRlZCB0byB0aGUgYXBhY2hlIHdlYnNlcnZlci4KLSMKLSMgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBWTkMgcmVkaXJlY3Rpb24gdXNpbmcgYW4gZXhpc3RpbmcgaHR0cHMgKHBvcnQKLSMgNDQzKSB3ZWJzZXJ2ZXIsIHRoZXJlYnkgbm90IHJlcXVpcmluZyBhIDJuZCAobm9uLWh0dHBzKSBwb3J0IG9wZW4gb24KLSMgdGhlIGZpcmV3YWxsIGZvciB0aGUgQ09OTkVDVCByZXF1ZXN0cy4KLSMKLSMgSXQgZG9lcyBub3Qgc2VlbSBwb3NzaWJsZSAodG8gbWUpIHRvIGFjaGlldmUgdGhpcyBlbnRpcmVseSB3aXRoaW4gYXBhY2hlCi0jIGJlY2F1c2UgdGhlIENPTk5FQ1QgcmVxdWVzdCBhcHBlYXJzIHRvIGJlIGZvcndhcmRlZCBlbmNyeXB0ZWQgdG8KLSMgdGhlIHJlbW90ZSBob3N0IGFuZCBzbyB0aGUgU1NMIGRpZXMgaW1tZWRpYXRlbHkuIAotIwotIyBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlZGlyZWN0IEFOWSBwcm90b2NvbCwgZS5nLiBTU0gsIG5vdCBqdXN0IFZOQy4KLSMgU2VlIENPTk5FQ1RfU1dJVENIX0FQUExZX1ZOQ19PRkZTRVQ9MCB0byBkaXNhYmxlIFZOQyA1OTAwIHNoaWZ0LgotIwotIyBOb3RlOiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGlzIHNjcmlwdCBmb3IgYSBub24tc3NsIGFwYWNoZSB3ZWJzZXJ2ZXIKLSMgcG9ydCBiZWNhdXNlIG1vZF9wcm94eSB3b3JrcyBmaW5lIGZvciBkb2luZyB0aGUgc3dpdGNoaW5nIGFsbCBpbnNpZGUKLSMgYXBhY2hlIChzZWUgUHJveHlSZXF1ZXN0cyBhbmQgQWxsb3dDT05ORUNUIHBhcmFtZXRlcnMpLgotIwotIwotIyBBcGFjaGUgY29uZmlndXJhdGlvbjoKLSMKLSMgVGhlIG1vZF9zc2wgY29uZmlndXJhdGlvbiBpcyBvZnRlbiBpbiBhIGZpbGUgbmFtZWQgc3NsLmNvbmYuICBJbiB0aGUKLSMgc2ltcGxlc3QgY2FzZSB5b3UgY2hhbmdlIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0jCi0jICAgRnJvbToKLSMgICAKLSMgICAgIExpc3RlbiA0NDMKLSMgICAgIAotIyAgICAgPFZpcnR1YWxIb3N0IF9kZWZhdWx0Xzo0NDM+Ci0jICAgICAuLi4KLSMgICAgIDwvVmlydHVhbEhvc3Q+Ci0jICAgICAKLSMgICBUbzoKLSMgICAKLSMgICAgIExpc3RlbiAxMjcuMC4wLjE6NDQzCi0jICAgICAKLSMgICAgIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86NDQzPgotIyAgICAgLi4uCi0jICAgICA8L1ZpcnR1YWxIb3N0PgotIwotIyAoaS5lLiBqdXN0IGNoYW5nZSB0aGUgTGlzdGVuIGRpcmVjdGl2ZSkuCi0jCi0jIElmIHlvdSBoYXZlIG1vZF9zc2wgbGlzdGVuaW5nIG9uIGEgZGlmZmVyZW50IGludGVybmFsIHBvcnQsIHlvdSBkbwotIyBub3QgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhbGhvc3QgTGlzdGVuIGFkZHJlc3MuCi0jCi0jIEl0IGlzIHByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIHNldCAkbGlzdGVuX2hvc3QgYmVsb3cgdG8gdGhlIGtub3duCi0jIElQIGFkZHJlc3MgeW91IHdhbnQgdGhlIHNlcnZpY2UgdG8gbGlzdGVuIG9uICh0byBhdm9pZCBsb2NhbGhvc3Qgd2hlcmUKLSMgYXBhY2hlIGlzIGxpc3RlbmluZykuCi0jCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5PVEU6IEZvciBtb3JlIGluZm8gb24gY29uZmlndXJhdGlvbiBzZXR0aW5ncywgcmVhZCBiZWxvdyBmb3IKLSMgICAgICAgYWxsIG9mIHRoZSBDT05ORUNUX1NXSVRDSF8qIGVudi4gdmFyLiBwYXJhbWV0ZXJzLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBbGxvdyBlbnYgdmFycyB0byBhbHNvIGJlIHNwZWNpZmllZCBvbiBjbWRsaW5lOgotIwotZm9yZWFjaCBteSAkYXJnIChAQVJHVikgewotCWlmICgkYXJnID1+IC9eKENPTk5FQ1RfU1dJVENILio/KT0oLiopJC8pIHsKLQkJJEVOVnskMX0gPSAkMjsKLQl9Ci19Ci0KLSMgU2V0IHVwIGxvZ2dpbmc6Ci0jCi1pZiAoZXhpc3RzICRFTlZ7Q09OTkVDVF9TV0lUQ0hfTE9HRklMRX0pIHsKLQljbG9zZSBTVERPVVQ7Ci0JaWYgKCFvcGVuKFNURE9VVCwgIj4+JEVOVntDT05ORUNUX1NXSVRDSF9MT0dGSUxFfSIpKSB7Ci0JCWRpZSAiY29ubmVjdF9zd2l0Y2g6ICRFTlZ7Q09OTkVDVF9TV0lUQ0hfTE9HRklMRX0gJCFcbiI7Ci0JfQotCWNsb3NlIFNUREVSUjsKLQlvcGVuKFNUREVSUiwgIj4mU1RET1VUIik7Ci19Ci1zZWxlY3QoU1RERVJSKTsgJHwgPSAxOwotc2VsZWN0KFNURE9VVCk7ICR8ID0gMTsKLQotIyBpbnRlcnJ1cHQgaGFuZGxlcjoKLSMKLW15ICRsb29wcGlkID0gJyc7Ci1teSAkcGlkZmlsZSA9ICcnOwotbXkgJGxpc3Rlbl9zb2NrID0gJyc7CSMgZGVjbGFyZWQgaGVyZSBmb3IgZ2V0X291dCgpCi0jCi1zdWIgZ2V0X291dCB7Ci0JcHJpbnQgU1RERVJSICIkX1swXTpcdCQkIGxvb3BwaWQ9JGxvb3BwaWRcbiI7Ci0JY2xvc2UgJGxpc3Rlbl9zb2NrIGlmICRsaXN0ZW5fc29jazsKLQlpZiAoJGxvb3BwaWQpIHsKLQkJa2lsbCAnVEVSTScsICRsb29wcGlkOwotCQlmc2xlZXAoMC4yKTsKLQl9Ci0JdW5saW5rICRwaWRmaWxlIGlmICRwaWRmaWxlOwotCWV4aXQgMDsKLX0KLSRTSUd7SU5UfSAgPSBcJmdldF9vdXQ7Ci0kU0lHe1RFUk19ID0gXCZnZXRfb3V0OwotCi0jIHBpZGZpbGU6Ci0jCi1zdWIgb3Blbl9waWRmaWxlIHsKLQlpZiAoZXhpc3RzICRFTlZ7Q09OTkVDVF9TV0lUQ0hfUElERklMRX0pIHsKLQkJbXkgJHBmID0gJEVOVntDT05ORUNUX1NXSVRDSF9QSURGSUxFfTsKLQkJaWYgKG9wZW4oUElELCAiPiRwZiIpKSB7Ci0JCQlwcmludCBQSUQgIiQkXG4iOwotCQkJY2xvc2UgUElEOwotCQkJJHBpZGZpbGUgPSAkcGY7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludCBTVERFUlIgImNvdWxkIG5vdCBvcGVuIHBpZGZpbGU6ICRwZiAtICQhIC0gY29udGludWluZy4uLlxuIjsKLQkJfQotCQlkZWxldGUgJEVOVntDT05ORUNUX1NXSVRDSF9QSURGSUxFfTsKLQl9Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNldCBDT05ORUNUX1NXSVRDSF9MT09QPTEgdG8gaGF2ZSB0aGlzIHNjcmlwdCBjcmVhdGUgYW4gb3V0ZXIgbG9vcAotIyByZXN0YXJ0aW5nIGl0c2VsZiBpZiBpdCBldmVyIGV4aXRzLiAgU2V0IENPTk5FQ1RfU1dJVENIX0xPT1A9QkcgdG8KLSMgZG8gdGhpcyBpbiB0aGUgYmFja2dyb3VuZCBhcyBhIGRhZW1vbi4KLQotaWYgKGV4aXN0cyAkRU5We0NPTk5FQ1RfU1dJVENIX0xPT1B9KSB7Ci0JbXkgJGNzbCA9ICRFTlZ7Q09OTkVDVF9TV0lUQ0hfTE9PUH07Ci0JaWYgKCRjc2wgbmUgJ0JHJyAmJiAkY3NsIG5lICcxJykgewotCQlkaWUgImNvbm5lY3Rfc3dpdGNoOiBpbnZhbGlkIENPTk5FQ1RfU1dJVENIX0xPT1AuXG4iOwotCX0KLQlpZiAoJGNzbCBlcSAnQkcnKSB7Ci0JCSMgZ28gaW50byBiZyBhcyAiZGFlbW9uIjoKLQkJc2V0cGdycCgwLCAwKTsKLQkJbXkgJHBpZCA9IGZvcmsoKTsKLQkJaWYgKCEgZGVmaW5lZCAkcGlkKSB7Ci0JCQlkaWUgImNvbm5lY3Rfc3dpdGNoOiAkIVxuIjsKLQkJfSBlbHNpZiAoJHBpZCkgewotCQkJd2FpdDsKLQkJCWV4aXQgMDsKLQkJfQotCQlpZiAoZm9yaykgewotCQkJZXhpdCAwOwotCQl9Ci0JCXNldHBncnAoMCwgMCk7Ci0JCWNsb3NlIFNURElOOwotCQlpZiAoISAkRU5We0NPTk5FQ1RfU1dJVENIX0xPR0ZJTEV9KSB7Ci0JCQljbG9zZSBTVERPVVQ7Ci0JCQljbG9zZSBTVERFUlI7Ci0JCX0KLQl9Ci0JZGVsZXRlICRFTlZ7Q09OTkVDVF9TV0lUQ0hfTE9PUH07Ci0KLQlpZiAoZXhpc3RzICRFTlZ7Q09OTkVDVF9TV0lUQ0hfUElERklMRX0pIHsKLQkJb3Blbl9waWRmaWxlKCk7Ci0JfQotCi0JcHJpbnQgU1RERVJSICJjb25uZWN0X3N3aXRjaDogc3RhcnRpbmcgc2VydmljZSBhdCAiLCBzY2FsYXIobG9jYWx0aW1lKSwgIiBtYXN0ZXItcGlkPSQkXG4iOwotCXdoaWxlICgxKSB7Ci0JCSRsb29wcGlkID0gZm9yazsKLQkJaWYgKCEgZGVmaW5lZCAkbG9vcHBpZCkgewotCQkJc2xlZXAgMTA7Ci0JCX0gZWxzaWYgKCRsb29wcGlkKSB7Ci0JCQl3YWl0OwotCQl9IGVsc2UgewotCQkJZXhlYyAkMDsJCi0JCQlleGl0IDE7Ci0JCX0KLQkJcHJpbnQgU1RERVJSICJjb25uZWN0X3N3aXRjaDogcmUtc3RhcnRpbmcgc2VydmljZSBhdCAiLCBzY2FsYXIobG9jYWx0aW1lKSwgIiBtYXN0ZXItcGlkPSQkXG4iOwotCQlzbGVlcCAxOwotCX0KLQlleGl0IDA7Ci19Ci1pZiAoZXhpc3RzICRFTlZ7Q09OTkVDVF9TV0lUQ0hfUElERklMRX0pIHsKLQlvcGVuX3BpZGZpbGUoKTsKLX0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBkZWZhdWx0cyBmb3IgaG9zdHMgYW5kIHBvcnRzICh5b3UgY2FuIG92ZXJyaWRlIHRoZW0gYmVsb3cgaWYgbmVlZGVkKToKLSMKLSMgTG9vayBiZWxvdyBmb3IgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgbGV0IHlvdSBzZXQgdGhlIHZhcmlvdXMKLSMgcGFyYW1ldGVycyB3aXRob3V0IG5lZWRpbmcgdG8gZWRpdCB0aGlzIHNjcmlwdDoKLSMKLSMJQ09OTkVDVF9TV0lUQ0hfTElTVEVOCi0jCUNPTk5FQ1RfU1dJVENIX0hUVFBECi0jCUNPTk5FQ1RfU1dJVENIX0FMTE9XRUQKLSMJQ09OTkVDVF9TV0lUQ0hfQUxMT1dfRklMRQotIwlDT05ORUNUX1NXSVRDSF9WRVJCT1NFCi0jCUNPTk5FQ1RfU1dJVENIX0FQUExZX1ZOQ19PRkZTRVQKLSMJQ09OTkVDVF9TV0lUQ0hfVk5DX09GRlNFVAotIwlDT05ORUNUX1NXSVRDSF9MSVNURU5fSVBWNgotIwlDT05ORUNUX1NXSVRDSF9CVUZTSVpFCi0jCUNPTk5FQ1RfU1dJVENIX0xPR0ZJTEUKLSMJQ09OTkVDVF9TV0lUQ0hfUElERklMRQotIwlDT05ORUNUX1NXSVRDSF9NQVhfQ09OTkVDVElPTlMKLSMKLSMgWW91IGNhbiBhbHNvIHNldCB0aGVzZSBvbiB0aGUgY21kbGluZToKLSMgICAgICBjb25uZWN0X3N3aXRjaCBDT05ORUNUX1NXSVRDSF9MSVNURU49WCBDT05ORUNUX1NXSVRDSF9BTExPV19GSUxFPVkgLi4uCi0jCi0KLSMgQnkgZGVmYXVsdCB3ZSB3aWxsIHVzZSBob3N0bmFtZSBhbmQgYXNzdW1lIGl0IHJlc29sdmVzOgotIwotbXkgJGhvc3RuYW1lID0gYGhvc3RuYW1lYDsKLWNob21wICRob3N0bmFtZTsKLQotbXkgJGxpc3Rlbl9ob3N0ID0gJGhvc3RuYW1lOwkKLW15ICRsaXN0ZW5fcG9ydCA9IDQ0MzsJCi0KLSMgTGV0IHVzZXIgb3ZlcnJpZGUgbGlzdGVuaW5nIHNpdHVhdGlvbiwgZS5nLiBtdWx0aWhvbWVkOgotIwotaWYgKGV4aXN0cyAkRU5We0NPTk5FQ1RfU1dJVENIX0xJU1RFTn0pIHsKLQkjCi0JIyBFLmcuIENPTk5FQ1RfU1dJVENIX0xJU1RFTj0xOTIuMTY4LjAuMzI6NDQzCi0JIwotCSRsaXN0ZW5faG9zdCA9ICcnOwotCSRsaXN0ZW5fcG9ydCA9ICcnOwotCWlmICgkRU5We0NPTk5FQ1RfU1dJVENIX0xJU1RFTn0gPX4gL14oLiopOihcZCspJC8pIHsKLQkJKCRsaXN0ZW5faG9zdCwgJGxpc3Rlbl9wb3J0KSA9ICgkMSwgJDIpOwotCX0KLX0KLQotbXkgJGh0dHBkX2hvc3QgPSAnbG9jYWxob3N0JzsJCi1teSAkaHR0cGRfcG9ydCA9IDQ0MzsJCi0KLWlmIChleGlzdHMgJEVOVntDT05ORUNUX1NXSVRDSF9IVFRQRH0pIHsKLQkjCi0JIyBFLmcuIENPTk5FQ1RfU1dJVENIX0hUVFBEPTEyNy4wLjAuMTo0NDMKLQkjCi0JJGh0dHBkX2hvc3QgPSAnJzsKLQkkaHR0cGRfcG9ydCA9ICcnOwotCWlmICgkRU5We0NPTk5FQ1RfU1dJVENIX0hUVFBEfSA9fiAvXiguKik6KFxkKykkLykgewotCQkoJGh0dHBkX2hvc3QsICRodHRwZF9wb3J0KSA9ICgkMSwgJDIpOwotCX0KLX0KLQotbXkgJGJ1ZnNpemUgPSA4MTkyOwotaWYgKGV4aXN0cyAkRU5We0NPTk5FQ1RfU1dJVENIX0JVRlNJWkV9KSB7Ci0JIwotCSMgRS5nLiBDT05ORUNUX1NXSVRDSF9CVUZTSVpFPTMyNzY4Ci0JIwotCSRidWZzaXplID0gJEVOVntDT05ORUNUX1NXSVRDSF9CVUZTSVpFfTsKLX0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFlvdSBjYW4vc2hvdWxkIG92ZXJyaWRlIHRoZSBob3N0L3BvcnQgc2V0dGluZ3MgaGVyZToKLSMKLSMkbGlzdGVuX2hvc3QgPSAnMjMuNDUuNjcuODknOwkJIyBzZXQgdG8geW91ciBpbnRlcmZhY2UgSVAgbnVtYmVyLgotIyRsaXN0ZW5fcG9ydCA9IDU1NTsJCQkjIGFuZC9vciBub25zdGFuZGFyZCBwb3J0LgotIyRodHRwZF9ob3N0ICA9ICdzb21laG9zdCc7CQkjIG1heWJlIHlvdSByZWRpciBodHRwcyB0byBhbm90aGVyIG1hY2hpbmUuCi0jJGh0dHBkX3BvcnQgID0gNjY2OwkJCSMgYW5kL29yIG5vbnN0YW5kYXJkIHBvcnQuCi0KLSMgWW91IG11c3Qgc2V0IHRoZSBhbGxvd2VkIGhvc3Q6cG9ydCBDT05ORUNUIHJlZGlyZWN0aW9uIGxpc3QuCi0jIE9ubHkgdGhlc2UgaG9zdDpwb3J0IHBhaXJzIHdpbGwgYmUgcmVkaXJlY3RlZCB0by4KLSMgUG9ydCByYW5nZXMgYXJlIGFsbG93ZWQgdG9vOiAgaG9zdDo1OTAwLTU5MzAuCi0jIElmIHRoZXJlIGlzIG9uZSBlbnRyeSBuYW1lZCBBTEwgYWxsIGNvbm5lY3Rpb25zIGFyZSBhbGxvdy4KLSMgWW91IG11c3Qgc3VwcGx5IHNvbWV0aGluZywgZGVmYXVsdCBpcyBkZW55LgotIwotbXkgQGFsbG93ZWQgPSBxdygKLQltYWNoaW5lMTo1OTE1Ci0JbWFjaGluZTI6NTkwMAotKTsKLQotaWYgKGV4aXN0cyAkRU5We0NPTk5FQ1RfU1dJVENIX0FMTE9XRUR9KSB7Ci0JIwotCSMgRS5nLiBDT05ORUNUX1NXSVRDSF9BTExPV0VEPW1hY2hpbmUxOjU5MTUsbWFjaGluZTI6NTkwMAotCSMKLQlAYWxsb3dlZCA9IHNwbGl0KC8sLywgJEVOVntDT05ORUNUX1NXSVRDSF9BTExPV0VEfSk7Ci19Ci0KLSMgT3IgeW91IGNvdWxkIGFsc28gdXNlIGFuIGV4dGVybmFsICJhbGxvdyBmaWxlIi4KLSMgVGhleSBnZXQgYWRkZWQgdG8gdGhlIEBhbGxvd2VkIGxpc3QuCi0jIFRoZSBmaWxlIGlzIHJlLXJlYWQgZm9yIGVhY2ggbmV3IGNvbm5lY3Rpb24uCi0jCi0jIEZvcm1hdCBvZiAkYWxsb3dfZmlsZToKLSMKLSMgICAgIGhvc3QxIHZuY2Rpc3AKLSMgICAgIGhvc3QyIHZuY2Rpc3AKLSMKLSMgd2hlcmUsIGUuZy4gdm5jZGlzcCA9IDE1ID0+IHBvcnQgNTkxNSwgc2F5Ci0jCi0jICAgICBqb2VzYm94ICAxNSAKLSMgICAgIGZyZWRzYm94IDE1IAotIyAgICAgcnVwZXJ0ICAgIDEgCi0KLSMgRm9yIGV4YW1wbHksIG1pbmUgaXM6Ci0jCi1teSAkYWxsb3dfZmlsZSA9ICcvZGlzdC9hcGFjaGUvMi4wL2NvbmYvdm5jLmhvc3RzJzsKLSRhbGxvd19maWxlID0gJyc7Ci0KLWlmIChleGlzdHMgJEVOVntDT05ORUNUX1NXSVRDSF9BTExPV19GSUxFfSkgewotCSMgRS5nLiBDT05ORUNUX1NXSVRDSF9BTExPV19GSUxFPS91c3IvbG9jYWwvZXRjL2FsbG93LnR4dAotCSRhbGxvd19maWxlID0gJEVOVntDT05ORUNUX1NXSVRDSF9BTExPV19GSUxFfTsKLX0KLQotIyBTZXQgdG8gMSB0byByZS1tYXAgdG8gdm5jIHBvcnQsIGUuZy4gJ2hvc3RuYW1lIDE1JyB0byAnaG9zdG5hbWUgNTkxNScKLSMgaS5lLiBhc3N1bWUgYSBwb3J0IDAgPD0gcG9ydCA8IDIwMCBpcyBhY3R1YWxseSBhIFZOQyBkaXNwbGF5Ci0jIGFuZCBhZGQgNTkwMCB0byBpdC4gIFNldCB0byAwIHRvIG5vdCBkbyB0aGUgbWFwcGluZy4KLSMgTm90ZSB0aGF0IG5lZ2F0aXZlIHBvcnRzLCBlLmcuICdqb2VzYm94IC0yMicgZ28gZGlyZWN0bHkgdG8gLXBvcnQuCi0jCi1teSAkYXBwbHlfdm5jX29mZnNldCA9IDE7Ci1teSAkdm5jX29mZnNldCA9IDU5MDA7Ci0KLWlmIChleGlzdHMgJEVOVntDT05ORUNUX1NXSVRDSF9BUFBMWV9WTkNfT0ZGU0VUfSkgewotCSMKLQkjIEUuZy4gQ09OTkVDVF9TV0lUQ0hfQVBQTFlfVk5DX09GRlNFVD0wCi0JIwotCSRhcHBseV92bmNfb2Zmc2V0ID0gJEVOVntDT05ORUNUX1NXSVRDSF9BUFBMWV9WTkNfT0ZGU0VUfTsKLX0KLWlmIChleGlzdHMgJEVOVntDT05ORUNUX1NXSVRDSF9WTkNfT0ZGU0VUfSkgewotCSMKLQkjIEUuZy4gQ09OTkVDVF9TV0lUQ0hfVk5DX09GRlNFVD02MDAwCi0JIwotCSR2bmNfb2Zmc2V0ID0gJEVOVntDT05ORUNUX1NXSVRDSF9WTkNfT0ZGU0VUfTsKLX0KLQotIyBTZXQgdG8gMSBvciBoaWdoZXIgZm9yIG1vcmUgaW5mbyBvdXRwdXQ6Ci0jCi1teSAkdmVyYm9zZSA9IDA7Ci0KLWlmIChleGlzdHMgJEVOVntDT05ORUNUX1NXSVRDSF9WRVJCT1NFfSkgewotCSMKLQkjIEUuZy4gQ09OTkVDVF9TV0lUQ0hfVkVSQk9TRT0xCi0JIwotCSR2ZXJib3NlID0gJEVOVntDT05ORUNUX1NXSVRDSF9WRVJCT1NFfTsKLX0KLQotIyB6ZXJvIG1lYW5zIGxvb3AgZm9yZXZlciwgcG9zaXRpdmUgdmFsdWUgbWVhbnMgZXhpdCBhZnRlciBoYW5kbGluZyB0aGF0Ci0jIG1hbnkgY29ubmVjdGlvbnMuCi0jCi1teSAkY21heCA9IDA7Ci1pZiAoZXhpc3RzICRFTlZ7Q09OTkVDVF9TV0lUQ0hfTUFYX0NPTk5FQ1RJT05TfSkgewotCSRjbWF4ID0gJEVOVntDT05ORUNUX1NXSVRDSF9NQVhfQ09OTkVDVElPTlN9OwotfQotCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgIE5vIG5lZWQgZm9yIGFueSBjaGFuZ2VzIGJlbG93IGhlcmUuCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXVzZSBJTzo6U29ja2V0OjpJTkVUOwotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsKLQotIyBUZXN0IGZvciBJTkVUNiBzdXBwb3J0OgotIwotbXkgJGhhdmVfaW5ldDYgPSAwOwotZXZhbCAidXNlIElPOjpTb2NrZXQ6OklORVQ2OyI7Ci0kaGF2ZV9pbmV0NiA9IDEgaWYgJEAgZXEgIiI7Ci0KLW15ICRraWxscGlkID0gMTsKLQotc2V0cGdycCgwLCAwKTsKLQotaWYgKGV4aXN0cyAkRU5We0NPTk5FQ1RfU1dJVENIX0xJU1RFTl9JUFY2fSkgewotCSMgbm90ZSB3ZSBsZWF2ZSBvdXQgTG9jYWxBZGRyLgotCW15ICRjbWQgPSAnCi0JCSRsaXN0ZW5fc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoCi0JCQlMaXN0ZW4gICAgPT4gMTAsCi0JCQlMb2NhbFBvcnQgPT4gJGxpc3Rlbl9wb3J0LAotCQkJUmV1c2VBZGRyID0+IDEsCi0JCQlEb21haW4gICAgPT4gQUZfSU5FVDYsCi0JCQlQcm90byAgICAgPT4gInRjcCIKLQkJKTsKLQknOwotCWV2YWwgJGNtZDsKLQlkaWUgIiRAXG4iIGlmICRAOwotfSBlbHNlIHsKLQkkbGlzdGVuX3NvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoCi0JCUxpc3RlbiAgICA9PiAxMCwKLQkJTG9jYWxBZGRyID0+ICRsaXN0ZW5faG9zdCwKLQkJTG9jYWxQb3J0ID0+ICRsaXN0ZW5fcG9ydCwKLQkJUmV1c2VBZGRyID0+IDEsCi0JCVByb3RvICAgICA9PiAidGNwIgotCSk7Ci19Ci0KLWlmICghICRsaXN0ZW5fc29jaykgewotCWRpZSAiY29ubmVjdF9zd2l0Y2g6ICQhXG4iOwotfQotCi1teSAkY3VycmVudF9maDEgPSAnJzsKLW15ICRjdXJyZW50X2ZoMiA9ICcnOwotCi1teSAkY29ubiA9IDA7Ci0KLXdoaWxlICgxKSB7Ci0JJGNvbm4rKzsKLQlpZiAoJGNtYXggPiAwICYmICRjb25uID4gJGNtYXgpIHsKLQkJcHJpbnQgU1RERVJSICJsYXN0IGNvbm5lY3Rpb24gKCRjbWF4KVxuIiBpZiAkdmVyYm9zZTsgCi0JCWxhc3Q7Ci0JfQotCXByaW50IFNUREVSUiAibGlzdGVuaW5nIGZvciBjb25uZWN0aW9uOiAkY29ublxuIiBpZiAkdmVyYm9zZTsgCi0JbXkgKCRjbGllbnQsICRpcCkgPSAkbGlzdGVuX3NvY2stPmFjY2VwdCgpOwotCWlmICghICRjbGllbnQpIHsKLQkJZnNsZWVwKDAuNSk7Ci0JCW5leHQ7Ci0JfQotCXByaW50IFNUREVSUiAiY29ubjogJGNvbm4gLS0gIiwgJGNsaWVudC0+cGVlcmhvc3QoKSwgIiBhdCAiLCBzY2FsYXIobG9jYWx0aW1lKSwgIlxuIiBpZiAkdmVyYm9zZTsKLQotCW15ICRwaWQgPSBmb3JrKCk7Ci0JaWYgKCEgZGVmaW5lZCAkcGlkKSB7Ci0JCWRpZSAiY29ubmVjdF9zd2l0Y2g6ICQhXG4iOwotCX0gZWxzaWYgKCRwaWQpIHsKLQkJd2FpdDsKLQkJbmV4dDsKLQl9IGVsc2UgewotCQljbG9zZSAkbGlzdGVuX3NvY2s7Ci0JCWlmIChmb3JrKSB7Ci0JCQlleGl0IDA7Ci0JCX0KLQkJc2V0cGdycCgwLCAwKTsKLQkJaGFuZGxlX2Nvbm4oJGNsaWVudCk7Ci0JfQotfQotCi1leGl0IDA7Ci0KLXN1YiBoYW5kbGVfY29ubiB7Ci0JbXkgJGNsaWVudCA9IHNoaWZ0OwotCi0JbXkgJHN0YXJ0ID0gdGltZSgpOwotCi0JbXkgQGFsbG93ID0gQGFsbG93ZWQ7Ci0KLQkjIHJlYWQgYWxsb3cgZmlsZS4gIE5vdGUgd2UgcmVhZCBpdCBmb3IgZXZlcnkgY29ubmVjdGlvbgotCSMgdG8gYWxsb3cgdGhlIGFkbWluIHRvIG1vZGlmeSBpdCB3L28gcmVzdGFydGluZyB1cy4KLQkjIGJldHRlciB3YXkgd291bGQgYmUgdG8gcmVhZCBpbiBwYXJlbnQgYW5kIGNoZWNrIG10aW1lLgotCSMKLQlpZiAoJGFsbG93X2ZpbGUgJiYgLWYgJGFsbG93X2ZpbGUpIHsKLQkJaWYgKG9wZW4oQUxMT1csICI8JGFsbG93X2ZpbGUiKSkgewotCQkJd2hpbGUgKDxBTExPVz4pIHsKLQkJCQluZXh0IGlmIC9eXHMqIy87Ci0JCQkJbmV4dCBpZiAvXlxzKiQvOwotCQkJCWNob21wOwotCQkJCW15ICgkaG9zdCwgJGRweSkgPSBzcGxpdCgnICcsICRfKTsgCi0JCQkJbmV4dCBpZiAhIGRlZmluZWQgJGhvc3Q7Ci0JCQkJbmV4dCBpZiAhIGRlZmluZWQgJGRweTsKLQkJCQlpZiAoJGRweSA8IDApIHsKLQkJCQkJJGRweSA9IC0kZHB5OwotCQkJCX0gZWxzaWYgKCRhcHBseV92bmNfb2Zmc2V0KSB7Ci0JCQkJCSRkcHkgKz0gJHZuY19vZmZzZXQgaWYgJGRweSA8IDIwMDsKLQkJCQl9Ci0JCQkJcHVzaCBAYWxsb3csICIkaG9zdDokZHB5IjsKLQkJCX0KLQkJCWNsb3NlKEFMTE9XKTsKLQkJfSBlbHNlIHsKLQkJCXdhcm4gIiRhbGxvd19maWxlOiAkIVxuIjsKLQkJfQotCX0KLQotCSMgUmVhZCB0aGUgZmlyc3QgNyBieXRlcyBvZiBjb25uZWN0aW9uLCBzZWUgaWYgaXQgaXMgJ0NPTk5FQ1QnCi0JIwotCW15ICRzdHIgPSAnJzsKLQlteSAkTiA9IDA7Ci0JbXkgJGlzY29ubiA9IDE7Ci0JZm9yIChteSAkaSA9IDA7ICRpIDwgNzsgJGkrKykgewotCQlteSAkYjsKLQkJc3lzcmVhZCgkY2xpZW50LCAkYiwgMSk7Ci0JCSRzdHIgLj0gJGI7Ci0JCSROKys7Ci0JCXByaW50IFNUREVSUiAicmVhZDogJyRzdHInXG4iIGlmICR2ZXJib3NlID4gMTsKLQkJbXkgJGNzdHIgPSBzdWJzdHIoJ0NPTk5FQ1QnLCAwLCAkaSsxKTsKLQkJaWYgKCRzdHIgbmUgJGNzdHIpIHsKLQkJCSRpc2Nvbm4gPSAwOwotCQkJbGFzdDsKLQkJfQotCX0KLQotCW15ICRzb2NrID0gJyc7Ci0KLQlpZiAoJGlzY29ubikgewotCQkjIGl0IGlzIENPTk5FQ1QsIHJlYWQgcmVzdCBvZiBIVFRQIGhlYWRlcjoKLQkJIwotCQl3aGlsZSAoJHN0ciAhfiAvXHJcblxyXG4vKSB7Ci0JCQlteSAkYjsKLQkJCXN5c3JlYWQoJGNsaWVudCwgJGIsIDEpOwotCQkJJHN0ciAuPSAkYjsKLQkJfQotCQlwcmludCBTVERFUlIgInJlYWQ6ICAkc3RyXG4iIGlmICR2ZXJib3NlID4gMTsKLQotCQkjIGdldCBodHRwIHZlcnNpb24gYW5kIGhvc3Q6cG9ydAotCQkjCi0JCW15ICRvayA9IDA7Ci0JCW15ICRob3N0cG9ydCA9ICcnOwotCQlteSAkaHR0cF92ZXJzID0gJzEuMCc7Ci0JCWlmICgkc3RyID1+IC9eQ09OTkVDVFxzKyhcUyspXHMrSFRUUFwvKFxTKykvKSB7Ci0JCQkkaG9zdHBvcnQgPSAkMTsKLQkJCSRodHRwX3ZlcnMgPSAkMjsKLQkJCW15ICRoID0gJyc7Ci0JCQlteSAkcCA9ICcnOwotCi0JCQlpZiAoJGhvc3Rwb3J0ID1+IC9eKC4qKTooXGQrKSQvKSB7Ci0JCQkJKCRoLCAkcCkgPSAoJDEsICQyKTsKLQkJCX0KLQkJCWlmICgkcCA9fiAvXlxkKyQvKSB7Ci0JCQkJIyBjaGVjayBhbGxvd2VkIGhvc3QgbGlzdDoKLQkJCQlmb3JlYWNoIG15ICRocCAoQGFsbG93KSB7Ci0JCQkJCWlmICgkaHAgZXEgJ0FMTCcpIHsKLQkJCQkJCSRvayA9IDE7Ci0JCQkJCX0KLQkJCQkJaWYgKCRocCBlcSAkaG9zdHBvcnQpIHsKLQkJCQkJCSRvayA9IDE7Ci0JCQkJCX0KLQkJCQkJaWYgKCRocCA9fiAvXiguKik6KFxkKyktKFxkKykkLykgewotCQkJCQkJbXkgJGFob3N0ID0gJDE7Ci0JCQkJCQlteSAkcG1pbiAgPSAkMjsKLQkJCQkJCW15ICRwbWF4ICA9ICQzOwotCQkJCQkJaWYgKCRoIGVxICRhaG9zdCkgewotCQkJCQkJCWlmICgkcCA+PSAkcG1pbiAmJiAkcCA8PSAkcG1heCkgewotCQkJCQkJCQkkb2sgPSAxOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlsYXN0IGlmICRvazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlteSAkbXNnXzEgPSAiSFRUUC8kaHR0cF92ZXJzIDIwMCBDb25uZWN0aW9uIEVzdGFibGlzaGVkXHJcbiIKLQkJICAgICAuICJQcm94eS1hZ2VudDogY29ubmVjdF9zd2l0Y2ggdjAuMlxyXG5cclxuIjsKLQkJbXkgJG1zZ18yID0gIkhUVFAvJGh0dHBfdmVycyA1MDIgQmFkIEdhdGV3YXlcclxuIgotCQkJICAgICAuICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIjsKLQotCQlpZiAoISAkb2spIHsKLQkJCSMgZGlzYWxsb3dlZC4gZHJvcCB3aXRoIG1lc3NhZ2UuCi0JCQkjCi0JCQlzeXN3cml0ZSgkY2xpZW50LCAkbXNnXzIsIGxlbmd0aCgkbXNnXzIpKTsKLQkJCWNsb3NlICRjbGllbnQ7Ci0JCQlleGl0IDA7Ci0JCX0KLQotCQlteSAkaG9zdCA9ICcnOwotCQlteSAkcG9ydCA9ICcnOwotCi0JCWlmICgkaG9zdHBvcnQgPX4gL14oLiopOihcZCspJC8pIHsKLQkJCSgkaG9zdCwgJHBvcnQpID0gKCQxLCAkMik7Ci0JCX0KLQotCQlwcmludCBTVERFUlIgImNvbm5lY3RpbmcgdG86ICRob3N0OiRwb3J0XG4iIGlmICR2ZXJib3NlOwotCi0JCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJUGVlckFkZHIgPT4gJGhvc3QsCi0JCQlQZWVyUG9ydCA9PiAkcG9ydCwKLQkJCVByb3RvID0+ICJ0Y3AiCi0JCSk7Ci0JCXByaW50IFNUREVSUiAiY29ubmVjdCB0byBob3N0PSckaG9zdCcgcG9ydD0nJHBvcnQnIGZhaWxlZDogJCFcbiIgaWYgISRzb2NrOwotCQlpZiAoISAkc29jayAmJiAkaGF2ZV9pbmV0NikgewotCQkJZXZhbCB7JHNvY2sgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQkJCVBlZXJBZGRyID0+ICRob3N0LAotCQkJCVBlZXJQb3J0ID0+ICRwb3J0LAotCQkJCVByb3RvID0+ICJ0Y3AiCi0JCQkpO307Ci0JCQlwcmludCBTVERFUlIgImNvbm5lY3QgdG8gaG9zdD0nJGhvc3QnIHBvcnQ9JyRwb3J0JyBmYWlsZWQ6ICQhIChpcHY2KVxuIiBpZiAhJHNvY2s7Ci0JCX0KLQkJbXkgJG1zZzsKLQotCQkjIHNlbmQgdGhlIGNvbm5lY3QgcHJveHkgcmVwbHk6Ci0JCSMKLQkJaWYgKCRzb2NrKSB7Ci0JCQkkbXNnID0gJG1zZ18xOwotCQl9IGVsc2UgewotCQkJJG1zZyA9ICRtc2dfMjsKLQkJfQotCQlzeXN3cml0ZSgkY2xpZW50LCAkbXNnLCBsZW5ndGgoJG1zZykpOwotCQkkc3RyID0gJyc7Ci0JfSBlbHNlIHsKLQkJIyBvdGhlcndpc2UsIHJlZGlyZWN0IHRvIGFwYWNoZSBmb3Igbm9ybWFsIGh0dHBzOgotCQkjCi0JCXByaW50IFNUREVSUiAiY29ubmVjdGluZyB0bzogJGh0dHBkX2hvc3Q6JGh0dHBkX3BvcnRcbiIgaWYgJHZlcmJvc2U7Ci0JCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJUGVlckFkZHIgPT4gJGh0dHBkX2hvc3QsCi0JCQlQZWVyUG9ydCA9PiAkaHR0cGRfcG9ydCwKLQkJCVByb3RvID0+ICJ0Y3AiCi0JCSk7Ci0JCWlmICghICRzb2NrICYmICRoYXZlX2luZXQ2KSB7Ci0JCQlldmFsIHskc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoCi0JCQkJUGVlckFkZHIgPT4gJGh0dHBkX2hvc3QsCi0JCQkJUGVlclBvcnQgPT4gJGh0dHBkX3BvcnQsCi0JCQkJUHJvdG8gPT4gInRjcCIKLQkJCSk7fTsKLQkJfQotCX0KLQotCWlmICghICRzb2NrKSB7Ci0JCWNsb3NlICRjbGllbnQ7Ci0JCWRpZSAiY29ubmVjdF9zd2l0Y2g6ICQhXG4iOwotCX0KLQotCSMgZ2V0IHJlYWR5IGZvciB4ZmVyIHBoYXNlOgotCSMKLQkkY3VycmVudF9maDEgPSAkY2xpZW50OwotCSRjdXJyZW50X2ZoMiA9ICRzb2NrOwotCi0JJFNJR3tURVJNfSA9IHN1YiB7cHJpbnQgU1RERVJSICJnb3Qgc2lndGVybVxbJCRdXG4iIGlmICR2ZXJib3NlOyBjbG9zZSAkY3VycmVudF9maDE7IGNsb3NlICRjdXJyZW50X2ZoMjsgZXhpdCAwfTsKLQotCW15ICRwYXJlbnQgPSAkJDsKLQlpZiAobXkgJGNoaWxkID0gZm9yaygpKSB7Ci0JCXhmZXIoJHNvY2ssICRjbGllbnQsICdTLT5DJyk7Ci0JCWlmICgka2lsbHBpZCkgewotCQkJZnNsZWVwKDAuNSk7Ci0JCQlraWxsICdURVJNJywgJGNoaWxkOwotCQl9Ci0JfSBlbHNlIHsKLQkJIyB3cml0ZSB0aG9zZSBmaXJzdCBieXRlcyBpZiBub3QgQ09OTkVDVDoKLQkJIwotCQlpZiAoJHN0ciBuZSAnJyAmJiAkTiA+IDApIHsKLQkJCXN5c3dyaXRlKCRzb2NrLCAkc3RyLCAkTik7Ci0JCX0KLQkJeGZlcigkY2xpZW50LCAkc29jaywgJ0MtPlMnKTsKLQkJaWYgKCRraWxscGlkKSB7Ci0JCQlmc2xlZXAoMC43NSk7Ci0JCQlraWxsICdURVJNJywgJHBhcmVudDsKLQkJfQotCX0KLQlpZiAoJHZlcmJvc2UgPiAxKSB7Ci0JCW15ICRkdCA9IHRpbWUoKSAtICRzdGFydDsKLQkJcHJpbnQgU1RERVJSICJkdXJhdGlvblxbJCRdOiAkZHQgc2Vjb25kcy4gIiwgc2NhbGFyKGxvY2FsdGltZSksICJcbiI7Ci0JfQotCWV4aXQgMDsKLX0KLQotc3ViIHhmZXIgewotCW15KCRpbiwgJG91dCwgJGxhYikgPSBAXzsKLQlteSAoJFJJTiwgJFdJTiwgJEVJTiwgJFJPVVQpOwotCSRSSU4gPSAkV0lOID0gJEVJTiA9ICIiOwotCSRST1VUID0gIiI7Ci0JdmVjKCRSSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JdmVjKCRXSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JJEVJTiA9ICRSSU4gfCAkV0lOOwotCW15ICRidWY7Ci0KLQl3aGlsZSAoMSkgewotCQlteSAkbmYgPSAwOwotCQl3aGlsZSAoISAkbmYpIHsKLQkJCSRuZiA9IHNlbGVjdCgkUk9VVD0kUklOLCB1bmRlZiwgdW5kZWYsIHVuZGVmKTsKLQkJfQotCQlteSAkbGVuID0gc3lzcmVhZCgkaW4sICRidWYsICRidWZzaXplKTsKLQkJaWYgKCEgZGVmaW5lZCgkbGVuKSkgewotCQkJbmV4dCBpZiAkISA9fiAvXkludGVycnVwdGVkLzsKLQkJCXByaW50IFNUREVSUiAiY29ubmVjdF9zd2l0Y2hcWyRsYWIvJGNvbm4vJCRdOiAkIVxuIjsKLQkJCWxhc3Q7Ci0JCX0gZWxzaWYgKCRsZW4gPT0gMCkgewotCQkJcHJpbnQgU1RERVJSICJjb25uZWN0X3N3aXRjaFxbJGxhYi8kY29ubi8kJF06ICIKLQkJCSAgICAuICJJbnB1dCBpcyBFT0YuXG4iOwotCQkJbGFzdDsKLQkJfQotCi0JCWlmICgwKSB7Ci0JCQkjIHZlcnkgdmVyYm9zZSBkZWJ1Z2dpbmcgb2YgZGF0YToKLQkJCXN5c3dyaXRlKFNUREVSUiAsICJcbiRsYWI6ICIsIDYpOwotCQkJc3lzd3JpdGUoU1RERVJSICwgJGJ1ZiwgJGxlbik7Ci0JCX0KLQotCQlteSAkb2Zmc2V0ID0gMDsKLQkJbXkgJHF1aXQgPSAwOwotCQl3aGlsZSAoJGxlbikgewotCQkJbXkgJHdyaXR0ZW4gPSBzeXN3cml0ZSgkb3V0LCAkYnVmLCAkbGVuLCAkb2Zmc2V0KTsKLQkJCWlmICghIGRlZmluZWQgJHdyaXR0ZW4pIHsKLQkJCQlwcmludCBTVERFUlIgImNvbm5lY3Rfc3dpdGNoXFskbGFiLyRjb25uLyQkXTogIgotCQkJCSAgICAuICJPdXRwdXQgaXMgRU9GLiAkIVxuIjsKLQkJCQkkcXVpdCA9IDE7Ci0JCQkJbGFzdDsKLQkJCX0KLQkJCSRsZW4gLT0gJHdyaXR0ZW47Ci0JCQkkb2Zmc2V0ICs9ICR3cml0dGVuOwotCQl9Ci0JCWxhc3QgaWYgJHF1aXQ7Ci0JfQotCWNsb3NlKCRpbik7Ci0JY2xvc2UoJG91dCk7Ci19Ci0KLXN1YiBmc2xlZXAgewotCW15ICgkdGltZSkgPSBAXzsKLQlzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgJHRpbWUpIGlmICR0aW1lOwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZGVza3RvcC5jZ2kgYi94MTF2bmMvbWlzYy9kZXNrdG9wLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk5YTM5Yy4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9kZXNrdG9wLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBkZXNrdG9wLmNnaToKLSMKLSMgVGhpcyBpcyBhbiBleGFtcGxlIENHSSBzY3JpcHQgdG8gcHJvdmlkZSBtdWx0aS11c2VyIHdlYiBhY2Nlc3MgdG8KLSMgeDExdm5jIGRlc2t0b3BzLiAgVGhlIHVzZXIgZGVza3RvcCBzZXNzaW9ucyBydW4gaW4gJ1h2ZmInIGRpc3BsYXlzCi0jIHRoYXQgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4KLSMKLSMgVGhpcyBzY3JpcHQgc2hvdWxkL211c3QgYmUgc2VydmVkIGJ5IGFuIEhUVFBTIChpLmUuIFNTTCkgd2Vic2VydmVyLAotIyBvdGhlcndpc2UgdGhlIHVuaXggYW5kIHZuYyBwYXNzd29yZHMgd291bGQgYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrCi0jIHVuZW5jcnlwdGVkIChzZWUgYmVsb3cgdG8gZGlzYWJsZSBpZiB5b3UgcmVhbGx5IHdhbnQgdG8uKQotIwotIyBUaGUgSmF2YSBWTkMgVmlld2VyIGFwcGxldCBjb25uZWN0aW9ucyBhcmUgZW5jcnlwdGVkIGJ5IFNTTCBhcyB3ZWxsLgotIwotIyBZb3UgY2FuIHVzZSB0aGlzIHNjcmlwdCB0byBwcm92aWRlIHVuaXggdXNlcnMgZGVza3RvcHMgYXZhaWxhYmxlIG9uCi0jIGRlbWFuZCB2aWEgYW55IEphdmEgZW5hYmxlZCB3ZWIgYnJvd3Nlci4gIE9uZSBjb3VsZCBhbHNvIHVzZSB0aGlzIGZvcgotIyBhIHNwZWNpYWwtcHVycG9zZSAnc2luZ2xlIGFwcGxpY2F0aW9uJyBzZXJ2aWNlIHJ1bm5pbmcgaW4gYSBtaW5pbWFsCi0jIHdpbmRvdyBtYW5hZ2VyLgotIwotIyBPbmUgZXhhbXBsZSBvZiBhIHNwZWNpYWwtcHVycG9zZSBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHNjaWVudGlmaWMKLSMgZGF0YSB2aXN1YWxpemF0aW9uIHRvb2wgcnVubmluZyBvbiBhIHNlcnZlciB3aGVyZSB0aGUgZGF0YSBpcyBob3VzZWQuCi0jIFRvIGRvIHRoaXMgc2V0ICR4MTF2bmNfZXh0cmFfb3B0cyA9ICctZW52IEZEX1BST0c9L3BhdGgvdG8vYXBwL2xhdW5jaGVyJwotIyB3aGVyZSB0aGUgcHJvZ3JhbSBsYXVuY2hlcyB5b3VyIHNwZWNpYWwgcHVycG9zZSBhcHBsaWNhdGlvbi4gIEEgdmVyeQotIyBzaW1wbGUgZXhhbXBsZTogICctZW52IEZEX1BST0c9L3Vzci9iaW4veGNsb2NrJwotIyAKLSMKLSMgRGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBwbGFjZSB0aGlzIHNjcmlwdCwgdGhlIHVzZXIgYWNjZXNzZXMgdGhlIHNlcnZpY2UKLSMgd2l0aCB0aGUgVVJMOgotIwotIyAgICAgaHR0cHM6Ly95b3VyLndlYnNlcnZlci5uZXQvY2dpLWJpbi9kZXNrdG9wLmNnaQotIwotIyBUaGVuIHRoZXkgbG9naW4gd2l0aCB0aGVpciB1bml4IHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBnZXQgdGhlaXIKLSMgb3duIGRlc2t0b3Agc2Vzc2lvbi4KLSMKLSMgSWYgdGhlIHVzZXIgaGFzIGFuIGV4aXN0aW5nIGRlc2t0b3AgaXQgaXMgY29ubmVjdGVkIHRvIGRpcmVjdGx5LAotIyBvdGhlcndpc2UgYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkIGluc2lkZSBhbiBYdmZiIGRpc3BsYXkgYW5kIHRoZW4KLSMgY29ubmVjdGVkIHRvIGJ5IFZOQy4KLSMKLSMgSXQgaXMgcG9zc2libGUgdG8gZG8gcG9ydCByZWRpcmVjdGlvbiB0byBvdGhlciBtYWNoaW5lcyBydW5uaW5nIFNTTAotIyBlbmFibGVkIFZOQyBzZXJ2ZXJzIChzZWUgYmVsb3cuKSAgVGhpcyBzY3JpcHQgZG9lcyBub3Qgc3RhcnQgdGhlIFZOQwotIyBzZXJ2ZXJzIG9uIHRoZSBvdGhlciBtYWNoaW5lcywgYWx0aG91Z2ggd2l0aCBzb21lIGV4dHJhIHJpZ2dpbmcgeW91Ci0jIHNob3VsZCBiZSBhYmxlIHRvIGRvIHRoYXQgYXMgd2VsbC4KLSMKLSMgWW91IGNhbiBjdXN0b21pemUgdGhlIGxvZ2luIHByb2NlZHVyZSB0byB3aGF0ZXZlciB5b3Ugd2FudCBieSBtb2RpZnlpbmcKLSMgdGhpcyBzY3JpcHQsIG9yIGJ5IHVzaW5nIGlkZWFzIGluIHRoaXMgc2NyaXB0IHdyaXRlIHlvdXIgb3duIFBIUCwKLSMgKGZvciBleGFtcGxlKSwgc2NyaXB0LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3ZlcnJpZGluZyBkZWZhdWx0IHNldHRpbmdzOgotIwotIyBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSBhbnkgc2V0dGluZ3MgaW4gdGhpcyBzY3JpcHQgYW5kIGRvIG5vdAotIyB3YW50IHRvIGVkaXQgdGhpcyBzY3JpcHQgY3JlYXRlIHRoZSBhc3NpZ25tZW50cyBpbiBhIGZpbGUgbmFtZWQKLSMgJ2Rlc2t0b3AuY2dpLmNvbmYnIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBkZXNrdG9wLmNnaS4gIEl0IHdpbGwgYmUKLSMgc291cmNlZCBhZnRlciB0aGUgZGVmYXVsdHMgYXJlIHNldC4gIFRoZSBmb3JtYXQgb2YgZGVza3RvcC5jZ2kuY29uZgotIyBpcyBzaW1wbHkgcGVybCBzdGF0ZW1lbnRzIHRoYXQgbWFrZSB0aGUgYXNzaWdubWVudHMuCi0jCi0jIEZvciBleGFtcGxlLCBpZiB5b3UgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gZGVza3RvcC5jZ2kuY29uZjoKLSMKLSMJJHgxMXZuYyA9ICcvdXNyL2xvY2FsL2Jpbi94MTF2bmMnOwotIwotIyB0aGF0IHdpbGwgc2V0IHRoZSBwYXRoIHRvIHRoZSB4MTF2bmMgYmluYXJ5IHRvIHRoYXQgbG9jYXRpb24uICBMb29rIGF0Ci0jIHRoZSBzZXR0aW5ncyBiZWxvdyBmb3IgdGhlIG90aGVyIHZhcmlhYmxlcyB0aGF0IHlvdSBjYW4gbW9kaWZ5LCBmb3IKLSMgZXhhbXBsZSBvbmUgY291bGQgc2V0ICRhbGxvd2VkX3VzZXJzX2ZpbGUuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyB4MTF2bmM6Ci0jCi0jIFlvdSBuZWVkIHRvIGluc3RhbGwgeDExdm5jIG9yIG90aGVyd2lzZSBoYXZlIGl0IGF2YWlsYWJsZS4gIEl0IGlzCi0jIFJFUVVJUkVEIHRoYXQgeW91IHVzZSB4MTF2bmMgMC45LjEwIG9yIGxhdGVyLiAgSXQgd29uJ3Qgd29yayB3aXRoCi0jIGVhcmxpZXIgdmVyc2lvbnMuICBTZWUgYmVsb3cgdGhlICR4MTF2bmMgcGFyYW1ldGVyIHRoYXQgeW91IGNhbiBzZXQKLSMgdG8gdGhlIGZ1bGwgcGF0aCB0byB4MTF2bmMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBYdmZiOgotIwotIyBOb3RlIHRoYXQgdGhlIHgxMXZuYyAtY3JlYXRlIHZpcnR1YWwgZGVza3RvcCBzZXJ2aWNlIHVzZWQgYmVsb3cgcmVxdWlyZXMKLSMgdGhhdCB5b3UgaW5zdGFsbCB0aGUgJ1h2ZmInIHByb2dyYW0uICBPbiBkZWJpYW4gdGhpcyBpcyBjdXJyZW50bHkgZG9uZQotIyB2aWEgJ2FwdC1nZXQgaW5zdGFsbCB4dmZiJy4KLSMKLSMgSWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSBnZXR0aW5nICd4MTF2bmMgLWNyZWF0ZScgdG8gd29yayB3aXRoIHRoaXMKLSMgc2NyaXB0IChpdCBjYW4gYmUgdHJpY2t5KSwgdHJ5IGl0IG1hbnVhbGx5IGFuZC9vciBzZWUgdGhlIHgxMXZuYyBGQVEKLSMgbGlua3MgYmVsb3cuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBcGFjaGUgaHR0cGQ6Ci0jCi0jIFlvdSBzaG91bGQgcHV0IHRoaXMgc2NyaXB0IGluLCBzYXksIGEgY2dpLWJpbiBkaXJlY3RvcnkuICBFbmFibGUgY2dpCi0jIHNjcmlwdHMgaW4geW91ciBhcGFjaGUgKG9yIG90aGVyIGh0dHBkKSBjb25maWcuICBGb3IgZXhhbXBsZSwgd2UgaGF2ZQotIyB0aGVzZSBsaW5lcyAobm90IGNvbW1lbnRlZCk6Ci0jCi0jIEluIGh0dHBkLmNvbmY6Ci0jCi0jCVNjcmlwdEFsaWFzIC9jZ2ktYmluLyAiL2Rpc3QvYXBhY2hlLzIuMC9jZ2ktYmluLyIKLSMKLSMJPERpcmVjdG9yeSAiL2Rpc3QvYXBhY2hlLzIuMC9jZ2ktYmluIj4KLSMJICAgIEFsbG93T3ZlcnJpZGUgTm9uZQotIwkgICAgT3B0aW9ucyBOb25lICAgICAKLSMJICAgIE9yZGVyIGFsbG93LGRlbnkKLSMJICAgIEFsbG93IGZyb20gYWxsIAotIwk8L0RpcmVjdG9yeT4KLSMKLSMgYW5kIGluIHNzbC5jb25mOgotIwotIwk8RGlyZWN0b3J5ICIvZGlzdC9hcGFjaGUvMi4wL2NnaS1iaW4iPgotIwkgICAgU1NMT3B0aW9ucyArU3RkRW52VmFycwotIwk8L0RpcmVjdG9yeT4KLSMKLSMgRG8gbm90IGJlIGNvbmZ1c2VkIGJ5IHRoZSBub24tc3RhbmRhcmQgL2Rpc3QvYXBhY2hlLzIuMCBhcGFjaGUKLSMgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRoYXQgd2UgaGFwcGVuIHRvIHVzZS4gIFlvdXJzIHdpbGwgYmUgZGlmZmVyZW50LgotIwotIyBZb3UgY2FuIHRlc3QgdGhhdCB5b3UgaGF2ZSBDR0kgc2NyaXB0cyB3b3JraW5nIHByb3Blcmx5IHdpdGggdGhlIAotIyAndGVzdC1jZ2knIGFuZCAncHJpbnRlbnYnIHNjcmlwdHMgYXBhY2hlIHByb3ZpZGVzLgotIwotIyBDb3B5IHRoaXMgZmlsZSAoZGVza3RvcC5jZ2kpIHRvIC9kaXN0L2FwYWNoZS8yLjAvY2dpLWJpbiBhbmQgdGhlbiBydW4KLSMgJ2NobW9kIDc1NSAuLi4nIG9uIGl0IHRvIG1ha2UgaXQgZXhlY3V0YWJsZS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEFwcGxldCBKYXIgZmlsZXMgc2VydmVkIGJ5IGFwYWNoZToKLSMKLSMgWW91IHdpbGwgKmFsc28qIG5lZWQgdG8gY29weSB0aGUgeDExdm5jIGNsYXNzZXMvc3NsL1VsdHJhVmlld2VyU1NMLmphcgotIyBmaWxlIHRvIHRoZSBodHRwZCBEb2N1bWVudFJvb3QgdG8gYmUgYWNjZXNzaWJsZSBieTogL1VsdHJhVmlld2VyU1NMLmphcgotIyBpbiBhIFVSTCAob3IgY2hhbmdlICRhcHBsZXRfamFyIGJlbG93IG9yIHRoZSBodG1sIGluICRhcHBsZXRfaHRtbCBpZgotIyB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24uKQotIwotIyBUaGlzIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBhcGFjaGUgRG9jdW1lbnRSb290ICdodGRvY3MnIGRpcmVjdG9yeS4KLSMgRm9yIG91ciAobm9uLXN0YW5kYXJkIGxvY2F0aW9uIGluc3RhbGxhdGlvbikgdGhhdCBtZWFudCB3ZSBjb3BpZWQgdGhlCi0jIGZpbGUgdG86Ci0jCi0jICAgIC9kaXN0L2FwYWNoZS8yLjAvaHRkb2NzL1VsdHJhVmlld2VyU1NMLmphcgotIwotIyAoeW91ciBEb2N1bWVudFJvb3QgZGlyZWN0b3J5IHdpbGwgYmUgZGlmZmVyZW50LikgCi0jCi0jIFRoZSBWbmNWaWV3ZXIuamFyICh0aWdodHZuYykgd2lsbCBhbHNvIHdvcmssIGJ1dCB5b3UgbmVlZCB0byBjaGFuZ2UKLSMgdGhlICRhcHBsZXRfamFyIGJlbG93LiAgWW91IGNhbiBnZXQgdGhlc2UgamFyIGZpbGVzIGZyb20gdGhlIHgxMXZuYwotIyB0YXJiYWxsIGZyb206Ci0jCi0jICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI2Rvd25sb2FkaW5nCi0jCi0jIFRoaXMgc2NyaXB0IHJlcXVpcmVzIHgxMXZuYyAwLjkuMTAgb3IgbGF0ZXIuCi0jCi0jIE5vdGUgdGhhdCB0aGUgdXNhZ2UgbW9kZSBmb3IgdGhpcyBzY3JpcHQgaXMgYSBkaWZmZXJlbnQgZnJvbSByZWd1bGFyCi0jICd4MTF2bmMgLWh0dHAgLi4uJyB1c2FnZSB3aGVyZSB4MTF2bmMgYWN0cyBhcyBhIG1pbmkgd2ViIHNlcnZlciBhbmQKLSMgc2VydmVzIGl0cyBvd24gYXBwbGV0IGphcnMuICBXZSBkb24ndCB1c2UgdGhhdCBtb2RlIGZvciB0aGlzIHNjcmlwdC4KLSMgQXBhY2hlIChodHRwZCkgc2VydmVzIHRoZSBqYXJzLgotIwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTm90ZXMgYW5kIEluZm9ybWF0aW9uOgotIwotIyBFYWNoIHgxMXZuYyBzZXJ2ZXIgY3JlYXRlZCBmb3IgYSB1c2VyIGxvZ2luIHdpbGwgbGlzdGVuIG9uIGl0cyBvd24gcG9ydAotIyAoc2VlIGJlbG93IGZvciBwb3J0IHNlbGVjdGlvbiBzY2hlbWVzLikgIFlvdXIgZmlyZXdhbGwgbXVzdCBsZXQgaW4gKkFMTCoKLSMgb2YgdGhlc2UgcG9ydHMgKGUuZy4gYSBwb3J0IHJhbmdlLCBzZWUgYmVsb3cgZm9yIHRoZSBzeW50YXguKQotIwotIyBJdCBpcyBhbHNvIHBvc3NpYmxlLCBhbHRob3VnaCBub3QgYXMgcmVsaWFibGUsIHRvIGRvIGFsbCBvZiB0aGlzIHRocm91Z2gKLSMgYSBzaW5nbGUgcG9ydCwgc2VlIHRoZSBmaXhlZCBwb3J0IHNjaGVtZSAkZmluZF9mcmVlX3BvcnQgPSAnZml4ZWQ6NTkxMCcKLSMgYmVsb3cuICBUaGlzIHNpbmdsZSBwb3J0IG1vZGUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhcGFjaGUncyBwb3J0Ci0jICh1c3VhbGx5IDQ0MyBmb3IgaHR0cHMpIGFuZCBtdXN0IGFsc28gYmUgYWxsb3dlZCBpbiBieSB5b3VyIGZpcmV3YWxsLgotIwotIyBOb3RlOiBUaGUgZml4ZWQgcG9ydCBzY2hlbWUgaXMgRElTQUJMRUQgYnkgZGVmYXVsdC4KLSMKLSMgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBoYXZlIHRoaXMgc2NyaXB0IGFjdCBhcyBhIHZuYyByZWRpcmVjdG9yIHRvIFNTTAotIyBlbmFibGVkIFZOQyBzZXJ2ZXJzIHJ1bm5pbmcgb24gKm90aGVyKiBtYWNoaW5lcyBpbnNpZGUgeW91ciBmaXJld2FsbAotIyAocHJlc3VtYWJseSB0aGUgdXNlcnMnIGRlc2t0b3BzKSBTZWUgdGhlICRlbmFibGVfcG9ydF9yZWRpcmVjdGlvbgotIyBzZXR0aW5nIGJlbG93LiAgVGhlIHVzZXIgcHJvdmlkZXMgJ3VzZXJuYW1lQGhvc3Q6cG9ydCcgaW5zdGVhZCBvZiBqdXN0Ci0jICd1c2VybmFtZScgd2hlbiBzaGUgbG9ncyBpbi4gIFRoaXMgc2NyaXB0IGRvZXNuJ3Qgc3RhcnQgVk5DIHNlcnZlcnMKLSMgb24gdGhvc2Ugb3RoZXIgbWFjaGluZXMsIHRoZSBzZXJ2ZXJzIG11c3QgYmUgcnVubmluZyB0aGVyZSBhbHJlYWR5LgotIyAoSWYgeW91IHdhbnQgdGhpcyBzY3JpcHQgdG8gc3RhcnQgdGhlbSB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBpdAotIyB5b3Vyc2VsZi4pICBJdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgaG9zdDpwb3J0IGFsbG93IGxpc3QgdG8gbGltaXQKLSMgd2hpY2ggaW50ZXJuYWwgbWFjaGluZXMgYW5kIHBvcnRzIGNhbiBiZSByZWRpcmVjdGVkIHRvLiAgVGhpcyBpcyB0aGUKLSMgJHBvcnRfcmVkaXJlY3Rpb25fYWxsb3dlZF9ob3N0cyBwYXJhbWV0ZXIuCi0jCi0jIE5vdGU6IFRoZSB2bmMgcmVkaXJlY3RvciBzY2hlbWUgaXMgRElTQUJMRUQgYnkgZGVmYXVsdC4KLSMKLSMgTm90ZSB0aGVyZSBhcmUgKnR3byogU1NMIGNlcnRpZmljYXRlcyBpbnZvbHZlZCB0aGF0IHRoZSB1c2VyIG1heSBiZQotIyBhc2tlZCB0byBpbnNwZWN0OiBhcGFjaGUncyBTU0wgY2VydCBhbmQgeDExdm5jJ3MgU1NMIGNlcnQuICBUaGlzIG1heQotIyBjb25mdXNlIG5haXZlIHVzZXJzLiAgWW91IG1heSB3YW50IHRvIHVzZSB0aGUgc2FtZSBjZXJ0IGZvciBib3RoLgotIwotIyBUaGlzIHNjcmlwdCBwcm92aWRlcyBvbmUgZXhhbXBsZSBvbiBob3cgdG8gcHJvdmlkZSB0aGUgc2VydmljZS4gIFlvdSBjYW4KLSMgY3VzdG9taXplIGl0IHRvIG1lZXQgeW91ciBuZWVkcywgZS5nLiBzd2l0Y2ggdG8gcGhwLCBuZXdlciBjZ2kgbW9kdWxlcywKLSMgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uLCBTUUwgZGF0YWJhc2UgZm9yIHVzZXIgYXV0aGVudGljYXRpb24sIGV0YywKLSMgZXRjLiAgSWYgeW91IHBsYW4gdG8gdXNlIGl0IGluIHByb2R1Y3Rpb24sIHBsZWFzZSBleGFtaW5lIGFsbCBzZWN1cml0eQotIyBhc3BlY3RzIG9mIGl0IGNhcmVmdWxseTsgcmVhZCB0aGUgY29tbWVudHMgaW4gdGhlIHNjcmlwdCBmb3IgbW9yZSBpbmZvLgotIwotIyBNb3JlIGluZm9ybWF0aW9uIGFuZCBiYWNrZ3JvdW5kIGFuZCB0cm91Ymxlc2hvb3Rpbmc6Ci0jCi0jICAgICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEteHZmYgotIyAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC10dW5uZWwtdmlld2VycwotIyAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC1qYXZhLXZpZXdlci1wcm94eQotIyAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC1wb3J0YWwKLSMgICAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS11bml4LXBhc3N3b3JkcwotIyAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXVzZXJsb2dpbgotIwotIwotIyBQbGVhc2UgYWxzbyByZWFkIHRoZSBjb21tZW50cyBiZWxvdyBmb3IgY2hhbmdpbmcgc3BlY2lmaWMgc2V0dGluZ3MuCi0jIFlvdSBjYW4gbW9kaWZ5IHRoZW0gaW4gdGhpcyBzY3JpcHQgb3IgYnkgb3ZlcnJpZGUgZmlsZSAnZGVza3RvcC5jZ2kuY29uZicKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMTAgYnkgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSMKLSMgZGVza3RvcC5jZ2kgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgZGVza3RvcC5jZ2kgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBkZXNrdG9wLmNnaTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIyBvciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdXNlIHN0cmljdDsKLXVzZSBJTzo6U29ja2V0OjpJTkVUOwotCi0jIFRlc3QgZm9yIElORVQ2IHN1cHBvcnQ6Ci0jCi1teSAkaGF2ZV9pbmV0NiA9IDA7Ci1ldmFsICJ1c2UgSU86OlNvY2tldDo6SU5FVDY7IjsKLSRoYXZlX2luZXQ2ID0gMSBpZiAkQCBlcSAiIjsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGF0aCB0byB0aGUgeDExdm5jIHByb2dyYW06Ci0jCi1teSAkeDExdm5jID0gJy91c3IvYmluL3gxMXZuYyc7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgWW91IGNhbiBzZXQgc29tZSBleHRyYSB4MTF2bmMgY21kbGluZSBvcHRpb25zIGhlcmU6Ci0jCi1teSAkeDExdm5jX2V4dHJhX29wdHMgPSAnJzsKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPdmVycmlkZSB0aGUgZGVmYXVsdCB4MTF2bmMgdmlld2VyIGNvbm5lY3Rpb24gdGltZW91dCBvZiA3NSBzZWNvbmRzOgotIwotbXkgJHgxMXZuY190aW1lb3V0ID0gJyc7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVENQIFBvcnRzOgotIwotIyBTZXQgZmluZF9mcmVlX3BvcnQgdG8gMSAob3IgdGhlIG90aGVyIG1vZGVzIGRlc2NyaWJlZCBiZWxvdykgdG8KLSMgYXV0b3NlbGVjdCBhIGZyZWUgcG9ydCB0byB1c2UuICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgYSBwb3J0IGJhc2VkIG9uCi0jIHRoZSB1c2VyaWQgbnVtYmVyICg3MDAwICsgdWlkKS4KLSMKLW15ICRmaW5kX2ZyZWVfcG9ydCA9IDA7Ci0KLSMgT3Igc3BlY2lmeSBhIHBvcnQgcmFuZ2U6Ci0jCi0jJGZpbmRfZnJlZV9wb3J0ID0gJzcwMDAtODAwMCc7Ci0jCi0jIE9yIGluZGljYXRlIHRvIHVzZSBhIGtsdWRnZSB0byB0cnkgdG8gZG8gZXZlcnl0aGluZyB0aHJvdWdoIGEgU0lOR0xFCi0jIHBvcnQuICBUbyB0cnkgdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgcG9ydCwgc2ltdWx0YW5lb3VzIGluc3RhbmNlcwotIyBvZiB0aGlzIHNjcmlwdCBhdHRlbXB0IHRvICd0YWtlIHR1cm5zJyB1c2luZyBpdCB0aGUgc2luZ2xlIHBvcnQuCi0jCi0jJGZpbmRfZnJlZV9wb3J0ID0gJ2ZpeGVkOjU5MTAnOwotCi0jIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvcnQgZm9yIDcwMDAgKyB1aWQgYW5kIGFsc28gJGZpbmRfZnJlZV9wb3J0ID0gMQotIyBhdXRvc2VsZWN0aW9uOgotIwotbXkgJHN0YXJ0aW5nX3BvcnQgPSA3MDAwOwotCi0jIExpc3RlbiBvbiBBRl9JTkVUNiBpZiBJTzo6U29ja2V0OjpJTkVUNiBpcyBhdmFpbGFibGUuCi0jCi1teSAkbGlzdGVuX29uX2lwdjYgPSAwOwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBvcnQgcmVkaXJlY3Rpb24gbW9kZToKLSMKLSMgVGhpcyBpcyB0byBlbmFibGUgcG9ydCByZWRpcmVjdGlvbiBtb2RlOiB1c2VybmFtZUBob3N0OnBvcnQuIElmCi0jIHVzZXJuYW1lIGlzIHZhbGlkLCB0aGVyZSB3aWxsIGJlIGEgcG9ydCByZWRpcmVjdGlvbiB0byBpbnRlcm5hbCBtYWNoaW5lCi0jIGhvc3Q6cG9ydC4gIFByZXN1bWFibHkgdGhlcmUgaXMgYWxyZWFkeSBhbiBTU0wgZW5hYmxlZCBhbmQgcGFzc3dvcmQKLSMgcHJvdGVjdGVkIFZOQyBzZXJ2ZXIgcnVubmluZyB0aGVyZS4gIFdlIGRvbid0IHN0YXJ0IHRoYXQgVk5DIHNlcnZlci4KLSMgKFlvdSBtaWdodCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8gZG8gdGhpcyB5b3Vyc2VsZi4pCi0jCi0jIFNlZSB0aGUgbmV4dCBzZXR0aW5nIGZvciBhbiBhbGxvd2VkIGhvc3RzIGZpbGUuICBUaGUgZGVmYXVsdCBmb3IgcG9ydAotIyByZWRpcmVjdGlvbiBpcyBvZmYuCi0jCi1teSAkZW5hYmxlX3BvcnRfcmVkaXJlY3Rpb24gPSAwOwotCi0jIEEgZmlsZSB3aXRoIGFsbG93ZWQgcG9ydCByZWRpcmVjdGlvbnMuICBUaGUgZW1wdHkgc3RyaW5nICcnICh0aGUKLSMgZGVmYXVsdCkgbWVhbnMgYWxsIGhvc3Q6cG9ydCByZWRpcmVjdGlvbnMgd291bGQgYmUgYWxsb3dlZC4KLSMKLSMgRm9ybWF0IG9mIHRoZSBmaWxlOiBBIGxpc3Qgb2YgJ3VzZXJAaG9zdDpwb3J0JyBvciAnaG9zdDpwb3J0JwotIyBlbnRyaWVzLCBvbmUgcGVyIGxpbmUuICBQb3J0IHJhbmdlcywgZS5nLiBob3N0Om4tbSBhcmUgYWxzbyBhY2NlcHRlZC4KLSMKLSMgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyB0cmltbWVkIG9mZiBlYWNoIGxpbmUuICBCbGFuayBsaW5lcwotIyBhbmQgY29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoICcjJyBhcmUgc2tpcHBlZC4gIEEgbGluZSBjb25zaXN0aW5nIG9mCi0jICdBTEwnIG1hdGNoZXMgZXZlcnl0aGluZy4gIElmIG5vIG1hdGNoIGNhbiBiZSBmb3VuZCBvciB0aGUgZmlsZSBjYW5ub3QKLSMgYmUgb3BlbmVkIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCi0jCi1teSAkcG9ydF9yZWRpcmVjdGlvbl9hbGxvd2VkX2hvc3RzID0gJyc7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQWxsb3dlZCB1c2VyczoKLSMKLSMgVG8gbGltaXQgd2hpY2ggdXNlcnMgY2FuIHVzZSB0aGlzIHNlcnZpY2UsIHNldCB0aGUgZm9sbG93aW5nIHRvIGEgZmlsZQotIyB0aGF0IGNvbnRhaW5zIHRoZSBhbGxvd2VkIHVzZXIgbmFtZXMgb25lIHBlciBsaW5lLiAgTGluZXMgc3RhcnRpbmcgd2l0aAotIyB0aGUgJyMnIGNoYXJhY3RlciBhcmUgc2tpcHBlZC4KLSMKLW15ICRhbGxvd2VkX3VzZXJzX2ZpbGUgPSAnJzsKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZW5pZWQgdXNlcnM6Ci0jCi0jIEFzIHdpdGggJGFsbG93ZWRfdXNlcnNfZmlsZSwgYnV0IHRvIGRlbnkgY2VydGFpbiB1c2Vycy4gIEFwcGxpZWQgYWZ0ZXIKLSMgYW55ICRhbGxvd2VkX3VzZXJzX2ZpbGUgY2hlY2sgYW5kIG92ZXJyaWRlcyB0aGUgcmVzdWx0LgotIwotbXkgJGRlbmllZF91c2Vyc19maWxlID0gJyc7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgdHJ1c3RVcmxWbmNDZXJ0IGFwcGxldCBwYXJhbWV0ZXI6Ci0jCi0jIFNldCB0byAwIHRvIGhhdmUgdGhlIGphdmEgYXBwbGV0IGh0bWwgc2V0IHRoZSBwYXJhbWV0ZXIKLSMgdHJ1c3RVcmxWbmNDZXJ0PW5vLCBpLmUuIHRoZSBhcHBsZXQgd2lsbCBub3QgYXV0b21hdGljYWxseSBhY2NlcHQKLSMgYW4gU1NMIGNlcnQgYWxyZWFkeSBhY2NlcHRlZCBieSBhbiBIVFRQUyBVUkwuICBTZWUgJGFwcGxldF9odG1sIGFuZAotIyBwcmludF9hcHBsZXRfaHRtbCgpIGJlbG93IGZvciBtb3JlIGluZm8uCi0jCi1teSAkdHJ1c3RVcmxWbmNDZXJ0ID0gMTsKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPbmUtdGltZSBWTkMgcGFzc3dvcmQgZmlmbzoKLSMKLSMgRm9yIGV4dHJhIHNlY3VyaXR5IGFnYWluc3QgbG9jYWwgdW50cnVzdGVkIHVzZXJzIGEgZmlmbyBpcyB1c2VkCi0jIHRvIGNvcHkgdGhlIG9uZS10aW1lIFZOQyBwYXNzd29yZCB0byB0aGUgdXNlcidzIFZOQyBwYXNzd29yZCBmaWxlCi0jIH51c2VyL3gxMXZuYy5wdy4gIElmIHRoYXQgZmlmbyB0cmFuc2ZlciB0ZWNobmlxdWUgY2F1c2VzIHByb2JsZW1zLAotIyB5b3UgY2FuIHNldCB0aGlzIHZhbHVlIHRvIDEgdG8gZGlzYWJsZSB0aGUgc2VjdXJpdHkgZmVhdHVyZToKLSMKLW15ICRkaXNhYmxlX3ZuY19wYXNzd2RfZmlmb19zYWZldHkgPSAwOwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbW1lbnQgdGhpcyBvdXQgaWYgeW91IGRvbid0IHdhbnQgUEFUSCBtb2RpZmllZDoKLSMKLSRFTlZ7UEFUSH0gPSAiL3Vzci9iaW46L2JpbjokRU5We1BBVEh9IjsKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBGb3IgdGhlIG5leHQgdHdvIHNldHRpbmdzLCBub3RlIHRoYXQgbW9zdCB1c2VycyB3aWxsIGJlIGNvbmZ1c2VkIHRoYXQKLSMgZ2VvbWV0cnkgYW5kIHNlc3Npb24gYXJlIGlnbm9yZWQgd2hlbiB0aGV5IGFyZSByZXR1cm5pbmcgdG8gdGhlaXIKLSMgZXhpc3RpbmcgZGVza3RvcCBzZXNzaW9uICh4MTF2bmMgRklORERJU1BMQVkgYWN0aW9uLikKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBVc2VkIGJlbG93IGlmIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IHByZWZlcnJlZCBnZW9tZXRyeSBhbmQgY29sb3IgZGVwdGg6Ci0jCi1teSAkZGVmYXVsdF9nZW9tZXRyeSA9ICcxMDI0eDc2OHgyNCc7Ci0KLQotIyBTZXQgdGhpcyB0byB0aGUgbGlzdCBvZiB4MTF2bmMgLWNyZWF0ZSBzZXNzaW9ucyB0eXBlcyB0byBzaG93IGEgc2Vzc2lvbgotIyBkcm9wZG93biBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZyb20uCi0jCi1teSAkc2Vzc2lvbl90eXBlcyA9ICcnOwotIwotIyBleGFtcGxlOgotIyRzZXNzaW9uX3R5cGVzID0gJ2dub21lIGtkZSB4ZmNlIGx4ZGUgd21ha2VyIGVubGlnaHRlbm1lbnQgbXdtIHR3bSBmYWlsc2FmZSc7IAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIHVzZXIgc2V0dGluZyBhIHVuaXF1ZSB0YWcgZm9yIGVhY2ggb25lCi0jIG9mIGhpcyBkZXNrdG9wcyBhbmQgc28gY2FuIGhhdmUgbXVsdGlwbGUgb25lcyBzaW11bHRhbmVvdXNseSBhbmQKLSMgc2VsZWN0IHdoaWNoIG9uZSBoZSB3YW50cy4gIEZvciBub3cgd2UganVzdCBoYWNrIHRoaXMgb250byBnZW9tZXRyeQotIyAxMDI0eDc2OHgyNDpteV8ybmRfZGVza3RvcCBidXQgdWx0aW1hdGVseSB0aGVyZSBzaG91bGQgYmUgYSBmb3JtIGVudHJ5Ci0jIGZvciBpdC4gIFNlYXJjaCBmb3IgZW5hYmxlX3VuaXF1ZV90YWdzIGZvciBtb3JlIGluZm86Ci0jCi1teSAkZW5hYmxlX3VuaXF1ZV90YWdzID0gMDsKLW15ICR1bmlxdWVfdGFnID0gJyc7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU3RyaW5nIG9mIEhUTUwgZm9yIHRoZSBsb2dpbiBmb3JtOgotIwotIyBGZWVsIGZyZWUgdG8gY3VzdG9taXplIHRvIHlvdXIgdGFzdGUsIF9VU0VSTkFNRV8gYW5kIF9HRU9NRVRSWV8gYXJlCi0jIGV4cGFuZGVkIHRvIHRoYXQgb2YgdGhlIHJlcXVlc3QuCi0jCi1teSAkbG9naW5fc3RyID0gPDwiRU5EIjsKLTx0aXRsZT54MTF2bmMgd2ViIGFjY2VzczwvdGl0bGU+Ci08aDM+eDExdm5jIHdlYiBhY2Nlc3M8L2gzPgotPGZvcm0gYWN0aW9uPSIkRU5We1JFUVVFU1RfVVJJfSIgbWV0aG9kPSJwb3N0Ij4KLSA8dGFibGUgYm9yZGVyPSIwIj4KLSAgPHRyPjx0ZCBjb2xzcGFuPTI+PGgyPkxvZ2luPC9oMj48L3RkPjwvdHI+Ci0gIDx0cj48dGQ+VXNlcm5hbWU6PC90ZD48dGQ+Ci0gIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VybmFtZSIgbWF4bGVuZ3RoPSI0MCIgdmFsdWU9Il9VU0VSTkFNRV8iPgotICA8L3RkPjwvdHI+Ci0gIDx0cj48dGQ+UGFzc3dvcmQ6PC90ZD48dGQ+Ci0gIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIG1heGxlbmd0aD0iNTAiPgotICA8L3RkPjwvdHI+Ci0gIDx0cj48dGQ+R2VvbWV0cnk6PC90ZD48dGQ+Ci0gIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJnZW9tZXRyeSIgbWF4bGVuZ3RoPSI0MCIgdmFsdWU9Il9HRU9NRVRSWV8iPgotICA8L3RkPjwvdHI+Ci0gIDwhLS0gc2Vzc2lvbiAtLT4KLSAgPHRyPjx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0icmlnaHQiPgotICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+Ci0gIDwvdGQ+PC90cj4KLSA8L3RhYmxlPgotPC9mb3JtPgotRU5ECi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU3RyaW5nIG9mIEhUTUwgcmV0dXJuZWQgdG8gd2ViIGJyb3dzZXIgdG8gbGF1bmNoIGFwcGxldDoKLSMKLSMgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0byB5b3VyIHRhc3RlLCBfVUlEXywgX1ZOQ19QT1JUXywgX1dJRFRIXywKLSMgX0hFSUdIVF8sIF9QQVNTXywgX1RSVVNUX1VWQ18sIF9BUFBMRVRfSkFSXywgYW5kIF9BUFBMRVRfQ0xBU1NfIGFyZQotIyBleHBhbmRlZCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGJlZm9yZSBzZW5kaW5nIG91dCB0byB0aGUgYnJvd3Nlci4KLSMKLW15ICRhcHBsZXRfaHRtbCA9IDw8IkVORCI7Ci08aHRtbD4KLTxUSVRMRT4KLXgxMXZuYyBkZXNrdG9wIChfVUlEXy9fVk5DX1BPUlRfKQotPC9USVRMRT4KLTxBUFBMRVQgQ09ERT1fQVBQTEVUX0NMQVNTXyBBUkNISVZFPV9BUFBMRVRfSkFSXyBXSURUSD1fV0lEVEhfIEhFSUdIVD1fSEVJR0hUXz4KLTxwYXJhbSBuYW1lPVBPUlQgdmFsdWU9X1ZOQ19QT1JUXz4KLTxwYXJhbSBuYW1lPVZOQ1NFUlZFUlBPUlQgdmFsdWU9X1ZOQ19QT1JUXz4KLTxwYXJhbSBuYW1lPVBBU1NXT1JEIHZhbHVlPV9QQVNTXz4KLTxwYXJhbSBuYW1lPXRydXN0VXJsVm5jQ2VydCB2YWx1ZT1fVFJVU1RfVVZDXz4KLTxwYXJhbSBuYW1lPSJPcGVuIE5ldyBXaW5kb3ciIHZhbHVlPXllcz4KLTxwYXJhbSBuYW1lPSJPZmZlciBSZWxvZ2luIiB2YWx1ZT1ubz4KLTxwYXJhbSBuYW1lPSJpZ25vcmVNU0xvZ29uQ2hlY2siIHZhbHVlPXllcz4KLTxwYXJhbSBuYW1lPSJkZWxheUF1dGhQYW5lbCIgdmFsdWU9eWVzPgotPCEtLSBleHRyYSAtLT4KLTwvQVBQTEVUPgotPGJyPgotPGEgaHJlZj0iJEVOVntSRVFVRVNUX1VSSX0iPkxvZ2luIHBhZ2U8L2E+PGJyPgotPGEgaHJlZj1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jPngxMXZuYyB3ZWJzaXRlPC9hPgotPC9odG1sPgotRU5ECi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlc2UgamF2YSBhcHBsZXQgc3RyaW5ncyBhcmUgZXhwYW5kZWQgaW50byB0aGUgYWJvdmUgJGFwcGxldF9odG1sLgotIyBOb3RlIHRoYXQgJGFwcGxldF9qYXIgaXMgcmVsYXRpdmUgdG8geW91ciBhcGFjaGUgRG9jdW1lbnRSb290IChodGRvY3MpCi0jIG5vdCB0aGUgZmlsZXN5c3RlbSByb290LiAKLSMKLW15ICRhcHBsZXRfamFyID0gJy9VbHRyYVZpZXdlclNTTC5qYXInOwotbXkgJGFwcGxldF9jbGFzcyA9ICdWbmNWaWV3ZXIuY2xhc3MnOwotCi0jIFRoZXNlIG1ha2UgdGhlIGFwcGxldCBwYW5lbCBzbWFsbGVyIGJlY2F1c2Ugd2UgdXNlICdPcGVuIE5ldyBXaW5kb3cnCi0jIGFueXdheSAoc2V0IHRvICdXJyBvciAnSCcgdG8gdXNlIGFjdHVhbCBzZXNzaW9uIGdlb21ldHJ5IHZhbHVlcyk6Ci0jCi1teSAkYXBwbGV0X3dpZHRoICA9ICc0MDAnOwotbXkgJGFwcGxldF9oZWlnaHQgPSAnMzAwJzsKLQotIyBUbyBjdXN0b21pemUgQUxMIG9mIHRoZSBIVE1MIHByaW50ZWQgb3V0IHlvdSBtYXkgbmVlZCB0byByZWRlZmluZQotIyB0aGUgYnllKCkgc3VidHJvdXRpbmUgaW4geW91ciBkZXNrdG9wLmNnaS5jb25mIGZpbGUuIAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE92ZXJyaWRlIGFueSBvZiB0aGUgYWJvdmUgc2V0dGluZ3MgYnkgc2V0dGluZyB0aGVtIGluIGEgZmlsZSBuYW1lZAotIyAnZGVza3RvcC5jZ2kuY29uZicuICBJdCBpcyBzb3VyY2VkIGhlcmUuCi0jCi0jIFlvdSBjYW4gb3ZlcnJpZGUgYW55IHZhcmlhYmxlIHNldCBhYm92ZSBieSBzdXBwbHlpbmcgcGVybCBjb2RlCi0jIGluICQwLmNvbmYgdGhhdCBzZXRzIGl0IHRvIHRoZSBkZXNpcmVkIHZhbHVlLgotIwotIyBTb21lIGV4YW1wbGVzIHlvdSBjb3VsZCBwdXQgaW4gJDAuY29uZjoKLSMKLSMgICAkeDExdm5jID0gJy91c3IvbG9jYWwvYmluL3gxMXZuYyc7Ci0jICAgJHgxMXZuY19leHRyYV9vcHRzID0gJy1lbnYgRkRfUFJPRz0vdXNyL2Jpbi94Y2xvY2snOwotIyAgICR4MTF2bmNfZXh0cmFfb3B0cyA9ICctc3NsIC91c3IvbG9jYWwvZXRjL2R0Y2dpLnBlbSc7Ci0jICAgJGZpbmRfZnJlZV9wb3J0ID0gJ2ZpeGVkOjU5OTknOwotIyAgICRlbmFibGVfcG9ydF9yZWRpcmVjdGlvbiA9IDE7Ci0jICAgJGFsbG93ZWRfdXNlcnNfZmlsZSA9ICcvdXNyL2xvY2FsL2V0Yy9kdGNnaS5hbGxvd2VkJzsKLSMKLWlmICgtZiAiJDAuY29uZiIpIHsKLQlldmFsIGBjYXQgIiQwLmNvbmYiYDsKLX0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgT0YgTUFJTiBVU0VSIFNFVFRJTkdTLgotIyBPbmx5IHBvd2VyIHVzZXJzIHNob3VsZCBjaGFuZ2UgYW55dGhpbmcgYmVsb3cuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFByaW50IGh0dHAgaGVhZGVyIHJlcGx5OgotIwotcHJpbnQgU1RET1VUICJDb250ZW50LVR5cGU6IHRleHQvaHRtbFxyXG5cclxuIjsKLQotCi0jIFJlcXVpcmUgSFRUUFMgc28gdGhhdCB1bml4IGFuZCB2bmMgcGFzc3dvcmRzIGFyZSBub3Qgc2VudCBpbiBjbGVhciB0ZXh0Ci0jIChwZXJoYXBzIGl0IGlzIHRvbyBsYXRlLi4uKSAgRGlzYWJsZSBIVFRQUyBoZXJlIGF0IHlvdXIgb3duIHJpc2suCi0jCi1pZiAoJEVOVntIVFRQU30gIX4gL15vbiQvaSkgewotCWJ5ZSgiSFRUUFMgbXVzdCBiZSB1c2VkICh0byBlbmNyeXB0IHBhc3N3b3JkcykiKTsKLX0KLQotCi0jIFJlYWQgVVJMIHJlcXVlc3Q6Ci0jCi1teSAkcmVxdWVzdDsKLWlmICgkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICJQT1NUIikgewotCXJlYWQoU1RESU4sICRyZXF1ZXN0LCAkRU5WeydDT05URU5UX0xFTkdUSCd9KTsKLX0gZWxzaWYgKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgIkdFVCIgKSB7Ci0JJHJlcXVlc3QgPSAkRU5WeydRVUVSWV9TVFJJTkcnfTsKLX0gZWxzZSB7Ci0JJHJlcXVlc3QgPSAkQVJHVlswXTsKLX0KLQotbXkgJXJlcXVlc3QgPSB1cmxfZGVjb2RlKHNwbGl0KC9bJj1dLywgJHJlcXVlc3QpKTsKLQotCi0jIEV4cGVyaW1lbnQgZm9yIEZEX1RBRyB4MTF2bmMgZmVhdHVyZSBmb3IgbXVsdGlwbGUgZGVza3RvcHMgZm9yIGEKLSMgc2luZ2xlIHVzZXI6Ci0jCi0jIHdlIGhpZGUgaXQgaW4gZ2VvbWV0cnk6dGFnIGZvciBub3c6Ci0jCi1pZiAoJGVuYWJsZV91bmlxdWVfdGFncyAmJiAkcmVxdWVzdHtnZW9tZXRyeX0gPX4gL14oLiopOihcdyspJC8pIHsKLQkkcmVxdWVzdHtnZW9tZXRyeX0gPSAkMTsKLQkkdW5pcXVlX3RhZyA9ICQyOwotfQotCi0jIENoZWNrL3NldCBnZW9tZXRyeSBhbmQgc2Vzc2lvbjoKLSMKLWlmICghZXhpc3RzICRyZXF1ZXN0e2dlb21ldHJ5fSB8fCAkcmVxdWVzdHtnZW9tZXRyeX0gIX4gL15beFxkXSskLykgewotCSMgZGVmYXVsdCBnZW9tZXRyeSBhbmQgZGVwdGg6Ci0JJHJlcXVlc3R7Z2VvbWV0cnl9ID0gJGRlZmF1bHRfZ2VvbWV0cnk7Ci19Ci1pZiAoIWV4aXN0cyAkcmVxdWVzdHtzZXNzaW9ufSB8fCAkcmVxdWVzdHtzZXNzaW9ufSA9fiAvXlxzKiQvKSB7Ci0JJHJlcXVlc3R7c2Vzc2lvbn0gPSAnJzsKLX0KLQotCi0jIEV4cGFuZCBfVVNFUk5BTUVfIGFuZCBfR0VPTUVUUllfIGluIHRoZSBsb2dpbiBzdHJpbmcgSFRNTDoKLSMKLSRsb2dpbl9zdHIgPX4gcy9fVVNFUk5BTUVfLyRyZXF1ZXN0e3VzZXJuYW1lfS9nOwotJGxvZ2luX3N0ciA9fiBzL19HRU9NRVRSWV8vJHJlcXVlc3R7Z2VvbWV0cnl9L2c7Ci0KLQotIyBDaGVjayB4MTF2bmMgdmVyc2lvbiBmb3IgaW5zdGFsbGVycyBvZiB0aGlzIHNjcmlwdCB3aG8gZG8gbm90IGtub3cKLSMgaG93IHRvIHJlYWQgYW5kIGZvbGxvdyBpbnN0cnVjdGlvbnM6Ci0jCi1teSAkdmVyc2lvbiA9IChzcGxpdCgnICcsIGAkeDExdm5jIC12ZXJzaW9uYCkpWzFdOwotJHZlcnNpb24gPX4gcy9cRCokLy87Ci0KLW15ICgkbWFqb3IsICRtaW5vciwgJG1pY3JvKSA9IHNwbGl0KC9cLi8sICR2ZXJzaW9uKTsKLWlmICgkbWFqb3IgIX4gL15cZCskLyB8fCAkbWlub3IgIX4gL15cZCskLykgewotCWJ5ZSgiVGhlIHgxMXZuYyBwcm9ncmFtIGlzIG5vdCBpbnN0YWxsZWQgY29ycmVjdGx5LiIpOwotfQotJG1pY3JvID0gMCB1bmxlc3MgJG1pY3JvOwotbXkgJGxldmVsICA9ICRtYWpvciAqIDEwMCAqIDEwMCArICRtaW5vciAqIDEwMCArICRtaWNybzsKLW15ICRuZWVkZWQgPSAgICAgIDAgKiAxMDAgKiAxMDAgKyAgICAgIDkgKiAxMDAgKyAgICAgMTA7Ci1pZiAoJGxldmVsIDwgJG5lZWRlZCkgewotCWJ5ZSgieDExdm5jIHZlcnNpb24gMC45LjEwIG9yIGxhdGVyIGlzIHJlcXVpcmVkLiAoRm91bmQgdmVyc2lvbiAkdmVyc2lvbikiKTsKLX0KLQotCi0jIFNldCB1cCB1c2VyIHNlbGVjdGVkIGRlc2t0b3Agc2Vzc2lvbiBsaXN0LCBpZiBlbmFibGVkOgotIwotbXkgJXNlc3Npb25zOwotCi1pZiAoJHNlc3Npb25fdHlwZXMgbmUgJycpIHsKLQlteSAkc3RyID0gIjx0cj48dGQ+U2Vzc2lvbjo8L3RkPjx0ZD5cbjxzZWxlY3QgbmFtZT1zZXNzaW9uPiI7Ci0JJHN0ciAuPSAiPG9wdGlvbiB2YWx1ZT1ub25lPnNlbGVjdDwvb3B0aW9uPiI7Ci0KLQlmb3JlYWNoIG15ICRzZXNzIChzcGxpdCgnICcsICRzZXNzaW9uX3R5cGVzKSkgewotCQluZXh0IGlmICRzZXNzID1+IC9eXHMqJC87Ci0JCW5leHQgaWYgJHNlc3MgIX4gL15cdyskLzsgIyBhbHBoYW51bWVyaWMKLQkJJHNlc3Npb25zeyRzZXNzfSA9IDE7Ci0JCSRzdHIgLj0gIjxvcHRpb24gdmFsdWU9JHNlc3M+JHNlc3M8L29wdGlvbj4iOwotCX0KLQkkc3RyIC49ICI8L3NlbGVjdD5cbjwvdGQ+PC90cj4iOwotCi0JIyBUaGlzIGZvcmNlcyAkcmVxdWVzdHtzZXNzaW9ufSB0byBiZSBhIHZhbGlkIG9uZToKLQkjCi0JaWYgKCEgZXhpc3RzICRzZXNzaW9uc3skcmVxdWVzdHtzZXNzaW9ufX0pIHsKLQkJJHJlcXVlc3R7c2Vzc2lvbn0gPSAnbm9uZSc7Ci0JfQotCi0JIyBJbnNlcnQgaW50byBsb2dpbl9zdHI6Ci0JIwotCW15ICRyID0gJHJlcXVlc3R7c2Vzc2lvbn07Ci0JJHN0ciA9fiBzL29wdGlvbiB2YWx1ZT1cUSRyXEUvb3B0aW9uIHNlbGVjdGVkIHZhbHVlPSRyLzsKLQkkbG9naW5fc3RyID1+IHMvPCEtLSBzZXNzaW9uIC0tPi8kc3RyLzsKLX0KLQotCi0jIElmIG5vIHVzZXJuYW1lIG9yIHBhc3N3b3JkLCBzaG93IGxvZ2luIGZvcm06Ci0jCi1pZiAoISRyZXF1ZXN0e3VzZXJuYW1lfSAmJiAhJHJlcXVlc3R7cGFzc3dvcmR9KSB7Ci0JYnllKCRsb2dpbl9zdHIpOwotfSBlbHNpZiAoISRyZXF1ZXN0e3VzZXJuYW1lfSkgewotCWJ5ZSgiTm8gVXNlcm5hbWUuPHA+JGxvZ2luX3N0ciIpOwotfSBlbHNpZiAoISRyZXF1ZXN0e3Bhc3N3b3JkfSkgewotCWJ5ZSgiTm8gUGFzc3dvcmQuPHA+JGxvZ2luX3N0ciIpOwotfQotCi0KLSMgU29tZSBzaG9ydGhhbmQgbmFtZXM6Ci0jCi1teSAkdXNlcm5hbWUgPSAkcmVxdWVzdHt1c2VybmFtZX07Ci1teSAkcGFzc3dvcmQgPSAkcmVxdWVzdHtwYXNzd29yZH07Ci1teSAkZ2VvbWV0cnkgPSAkcmVxdWVzdHtnZW9tZXRyeX07Ci1teSAkc2Vzc2lvbiAgPSAkcmVxdWVzdHtzZXNzaW9ufTsKLQotCi0jIElmIHBvcnQgcmVkaXJlY3Rpb24gaXMgZW5hYmxlZCwgc3BsaXQgdXNlcm5hbWVAaG9zdDpwb3J0Ci0jCi1teSAkcmVkaXJlY3RfaG9zdCA9ICcnOwotbXkgJGN1cnJlbnRfZmgxID0gJyc7Ci1teSAkY3VycmVudF9maDIgPSAnJzsKLQotaWYgKCRlbmFibGVfcG9ydF9yZWRpcmVjdGlvbikgewotCSgkdXNlcm5hbWUsICRyZWRpcmVjdF9ob3N0KSA9IHNwbGl0KC9ALywgJHVzZXJuYW1lLCAyKTsKLQlpZiAoJHJlZGlyZWN0X2hvc3QgbmUgJycpIHsKLQkJIyB3aWxsIGV4aXQgaWYgdGhlIHJlZGlyZWN0aW9uIGlzIG5vdCBhbGxvd2VkOgotCQljaGVja19yZWRpcmVjdF9ob3N0KCk7Ci0JfQotfQotCi0jIElmIHRoZXJlIGlzIGFuICRhbGxvd2VkX3VzZXJzX2ZpbGUsIGNoZWNrIHVzZXJuYW1lIGFnYWluc3QgaXQ6Ci0jCi1pZiAoJGFsbG93ZWRfdXNlcnNfZmlsZSBuZSAnJykgewotCWlmICghIG9wZW4oVVNFUlMsICI8JGFsbG93ZWRfdXNlcnNfZmlsZSIpKSB7Ci0JCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzAiKTsKLQl9Ci0JbXkgJG9rID0gMDsKLQl3aGlsZSAoPFVTRVJTPikgewotCQljaG9tcDsKLQkJJF8gPX4gcy9eXHMqLy87Ci0JCSRfID1+IHMvXHMqJC8vOwotCQluZXh0IGlmIC9eIy87Ci0JCWlmICgkdXNlcm5hbWUgZXEgJF8pIHsKLQkJCSRvayA9IDE7Ci0JCX0KLQl9Ci0JY2xvc2UgVVNFUlM7Ci0JaWYgKCEgJG9rKSB7Ci0JCWJ5ZSgiRGVuaWVkIFVzZXJuYW1lLjxwPiRsb2dpbl9zdHIiKTsKLQl9Ci19Ci0KLSMgSWYgdGhlcmUgaXMgYSAkZGVuaWVkX3VzZXJzX2ZpbGUsIGNoZWNrIHVzZXJuYW1lIGFnYWluc3QgaXQ6Ci0jCi1pZiAoJGRlbmllZF91c2Vyc19maWxlIG5lICcnKSB7Ci0JaWYgKCEgb3BlbihVU0VSUywgIjwkZGVuaWVkX3VzZXJzX2ZpbGUiKSkgewotCQlieWUoIkludGVybmFsIEVycm9yICMwIik7Ci0JfQotCW15ICRvayA9IDE7Ci0Jd2hpbGUgKDxVU0VSUz4pIHsKLQkJY2hvbXA7Ci0JCSRfID1+IHMvXlxzKi8vOwotCQkkXyA9fiBzL1xzKiQvLzsKLQkJbmV4dCBpZiAvXiMvOwotCQlpZiAoJHVzZXJuYW1lIGVxICRfKSB7Ci0JCQkkb2sgPSAwOwotCQl9Ci0JfQotCWNsb3NlIFVTRVJTOwotCWlmICghICRvaykgewotCQlieWUoIkRlbmllZCBVc2VybmFtZS48cD4kbG9naW5fc3RyIik7Ci0JfQotfQotCi0jIFJlcXVpcmUgdXNlcm5hbWUgdG8gYmUgYWxwaGFudW1lcmljICsgJy0nICsgJ18nOgotIyAob25lIG1heSB3YW50IHRvIGFkZCAnLicgYXMgd2VsbCkKLSMKLWlmICgkdXNlcm5hbWUgIX4gL15cd1stXHddKiQvKSB7Ci0JYnllKCJJbnZhbGlkIFVzZXJuYW1lLjxwPiRsb2dpbl9zdHIiKTsKLX0KLQotCi0jIEdldCB0aGUgdXNlcmlkIG51bWJlciwgd2UgbWF5IHVzZSBpdCBhcyBoaXMgVk5DIGRpc3BsYXkgcG9ydDsgdGhpcwotIyBhbHNvIGNoZWNrcyBpZiB0aGUgdXNlcm5hbWUgZXhpc3RzOgotIwotbXkgJHVpZCA9IGAvdXNyL2Jpbi9pZCAtdSAnJHVzZXJuYW1lJ2A7Ci1jaG9tcCAkdWlkOwotaWYgKCQ/ICE9IDAgfHwgJHVpZCAhfiAvXlxkKyQvKSB7Ci0JYnllKCJJbnZhbGlkIFVzZXJuYW1lLjxwPiRsb2dpbl9zdHIiKTsKLX0KLQotCi0jIFVzZSB4MTF2bmMgdHJpY2sgdG8gY2hlY2sgaWYgdGhlIHVuaXggcGFzc3dvcmQgaXMgdmFsaWQ6Ci0jIChyZXF1aXJlcyB4MTF2bmMgMC45LjEwIG9yIGxhdGVyLikKLSMKLWlmICghb3BlbihYMTFWTkMsICJ8ICR4MTF2bmMgLXVuaXhwdyBcJXN0ZGluID4gL2Rldi9udWxsIikpIHsKLQlieWUoIkludGVybmFsIEVycm9yICMxIik7Ci19Ci1wcmludCBYMTFWTkMgIiR1c2VybmFtZTokcGFzc3dvcmRcbiI7Ci0KLWlmICghY2xvc2UgWDExVk5DKSB7Ci0JIyB4MTF2bmMgcmV0dXJucyBub24temVybyBmb3IgaW52YWxpZCB1c2VybmFtZStwYXNzd29yZDoKLQlieWUoIkludmFsaWQgUGFzc3dvcmQuPHA+JGxvZ2luX3N0ciIpOwotfQotCi0KLSMgSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3IgdXNlIGJlbG93OgotIwotaW5pdGlhbGl6ZV9yYW5kb20oKTsKLQotCi0jIFNldCB2bmMgcG9ydDoKLSMKLW15ICR2bmNfcG9ydCA9IDA7Ci1teSAkZml4ZWRfcG9ydCA9IDA7Ci0KLWlmICghICRmaW5kX2ZyZWVfcG9ydCkgewotCSMgRml4ZWQgcG9ydCBiYXNlZCBvbiB1c2VyaWQgKHdlIGFzc3VtZSBpdCBpcyBmcmVlKToKLQkjCi0JJHZuY19wb3J0ID0gJHN0YXJ0aW5nX3BvcnQgKyAkdWlkOwotCi19IGVsc2lmICgkZmluZF9mcmVlX3BvcnQgPX4gL15maXhlZDooXGQrKSQvKSB7Ci0JIwotCSMgRW5hYmxlIHRoZSAtbG9vcGJnIG1ldGhvZCB0aGF0IHRyaWVzIHRvIHNoYXJlIGEgc2luZ2xlIHBvcnQ6Ci0JIwotCSR2bmNfcG9ydCA9ICQxOwotCSRmaXhlZF9wb3J0ID0gMTsKLX0gZWxzZSB7Ci0JIyBBdXRvc2VsZWN0IGEgcG9ydCwgZWl0aGVyIGRlZmF1bHQgcmFuZ2UgKDcwMDAtODAwMCkgb3IgYSB1c2VyCi0JIyBzdXBwbGllZCByYW5nZS4gIChub3RlIHRoYXQgJGZpbmRfZnJlZV9wb3J0IHdpbGwgbm93IGNvbnRhaW4KLQkjIGEgc29ja2V0IGxpc3RlbmluZyBvbiB0aGUgZm91bmQgcG9ydCBzbyB0aGF0IGl0IGlzIGhlbGQuKQotCSMKLQkkdm5jX3BvcnQgPSBhdXRvX3NlbGVjdF9wb3J0KCk7Ci19Ci0KLSMgQ2hlY2sgZm9yIGNyYXp5IHBvcnQgdmFsdWU6Ci0jCi1pZiAoJHZuY19wb3J0ID4gNjQwMDAgfHwgJHZuY19wb3J0IDwgMSkgewotCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzIgJHZuY19wb3J0Iik7Ci19Ci0KLQotIyBJZiBwb3J0IHJlZGlyZWN0aW9uIGlzIGVuYWJsZWQgYW5kIHRoZSB1c2VyIHNlbGVjdGVkIGl0IHZpYQotIyB1c2VybmFtZUBob3N0OnBvcnQsIHdlIGRvIHRoYXQgcmlnaHQgbm93IGFuZCB0aGVuIGV4aXQuCi0jCi1pZiAoJGVuYWJsZV9wb3J0X3JlZGlyZWN0aW9uICYmICRyZWRpcmVjdF9ob3N0IG5lICcnKSB7Ci0JcG9ydF9yZWRpcigpOwotCWV4aXQgMDsKLX0KLQotCi0jIE1ha2UgYSByYW5kb20sIG9uZXRpbWUgdm5jIHBhc3N3b3JkOgotIwotbXkgJHBhc3MgPSAnJzsKLW15ICRjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7Ci1teSBAYWJjID0gc3BsaXQoLy8sICRjaGFycyk7Ci0KLWZvciAobXkgJGkgPSAwOyAkaSA8IDg7ICRpKyspIHsKLQkkcGFzcyAuPSAkYWJjWyByYW5kKHNjYWxhcihAYWJjKSkgXTsKLX0KLQotIyBVc2UgeDExdm5jIHRyaWNrIHRvIHN3aXRjaCB0byB1c2VyIGFuZCBzdG9yZSB2bmMgcGFzcyBpbiB0aGUgcGFzc3dkZmlsZS4KLSMgUmVzdWx0IGlzICRwYXNzIGlzIHBsYWNlZCBpbiB1c2VyJ3MgJEhPTUUveDExdm5jLnB3Ci0jCi0jIChUaGlzIGlzIGFjdHVhbGx5IGRpZmZpY3VsdCB0byBkbyB3aXRob3V0IHVudHJ1c3RlZCBMT0NBTCB1c2VycyBiZWluZwotIyBhYmxlIHRvIHNlZSB0aGUgcGFzcyBhcyB3ZWxsLCBzZWUgY29weV9wYXNzd29yZF90b191c2VyKCkgZm9yIGRldGFpbHMKLSMgb24gaG93IHdlIHRyeSB0byBhdm9pZCB0aGlzLikKLSMKLWNvcHlfcGFzc3dvcmRfdG9fdXNlcigkcGFzcyk7Ci0KLQotIyBNYWtlIGEgdG1wIGZpbGUgZm9yIHgxMXZuYyBsYXVuY2hlciBzY3JpcHQ6Ci0jCi1teSAkdG1wZmlsZSA9IGAvYmluL21rdGVtcCAvdG1wL2Rlc2t0b3AuY2dpLlhYWFhYWGA7Ci1jaG9tcCAkdG1wZmlsZTsKLQotIyBDaGVjayBpZiB0aGUgdG1wZmlsZSBpcyB2YWxpZDoKLSMKLWlmICghIC1lICR0bXBmaWxlIHx8ICEgLW8gJHRtcGZpbGUgfHwgLWwgJHRtcGZpbGUpIHsKLQl1bmxpbmsgJHRtcGZpbGU7Ci0JYnllKCJJbnRlcm5hbCBFcnJvciAjMyIpOwotfQotaWYgKCFjaG1vZCAwNjQ0LCAkdG1wZmlsZSkgewotCXVubGluayAkdG1wZmlsZTsKLQlieWUoIkludGVybmFsIEVycm9yICM0Iik7Ci19Ci1pZiAoIW9wZW4oVE1QLCAiPiR0bXBmaWxlIikpIHsKLQl1bmxpbmsgJHRtcGZpbGU7Ci0JYnllKCJJbnRlcm5hbCBFcnJvciAjNSIpOwotfQotCi0KLSMgVGhlIHgxMXZuYyBjb21tYW5kLiAgWW91IGFkanVzdCBpdCB0byBzdWl0IHlvdXIgbmVlZHMuCi0jCi0jIHNvbWUgaWRlYXM6ICAtZW52IEZEX1BST0c9L3Vzci9iaW4vZ25vbWUtc2Vzc2lvbiAKLSMgICAgICAgICAgICAgIC1lbnYgRkRfU0VTUz1rZGUKLSMgICAgICAgICAgICAgIC1lbnYgRkRfVEFHPW15XzJuZF9kZXNrdG9wCi0jICAgICAgICAgICAgICAtdWx0cmFmaWxleGZlcgotIwotIyBOb3RlIHRoYXQgLXRpbWVvdXQgd2lsbCBjYXVzZSBpdCB0byBleGl0IGlmIGNsaWVudCBkb2VzIG5vdCBjb25uZWN0Ci0jIGFuZCAtc3Nsb25seSBkaXNhYmxlcyBWZU5DcnlwdCBTU0wgY29ubmVjdGlvbnMuCi0KLSMgU29tZSBzZXR0aW5nczoKLSMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgZW5jb3VudGVyIHRpbWluZyBwcm9ibGVtcywgZXRjLikKLSMKLW15ICR0aW1lb3V0ID0gNzU7Ci1teSAkZXh0cmEgPSAnJzsKLWlmICgkZml4ZWRfcG9ydCkgewotCSMgc2V0dGluZ3MgZm9yIGZpeGVkIHBvcnQgY2FzZToKLQkkdGltZW91dCA9IDQ1OwotCSRleHRyYSAuPSAiIC1sb29wYmcxMDAsMSI7Ci19Ci0kdGltZW91dCA9ICR4MTF2bmNfdGltZW91dCBpZiAkeDExdm5jX3RpbWVvdXQgbmUgJyc7Ci0KLWlmICgkc2Vzc2lvbl90eXBlcyBuZSAnJykgewotCSMgc2V0dGluZ3MgZm9yIHNlc3Npb24gc2VsZWN0aW9uIGNhc2U6Ci0JaWYgKGV4aXN0cyAkc2Vzc2lvbnN7JHNlc3Npb259KSB7Ci0JCSRleHRyYSAuPSAiIC1lbnYgRkRfU0VTUz0nJHNlc3Npb24nIjsKLQl9Ci19Ci1pZiAoJGVuYWJsZV91bmlxdWVfdGFncyAmJiAkdW5pcXVlX3RhZyBuZSAnJyAmJiAkdW5pcXVlX3RhZyA9fiAvXlx3KyQvKSB7Ci0JJGV4dHJhIC49ICIgLWVudiBGRF9UQUc9JyR1bmlxdWVfdGFnJyI7Ci19Ci0KLSMgVGhpcyBtZDVzdW0gY2hlY2sgb2YgdGhlIHZuYyBwYXNzd2QgaXMgZm9yIGV4dHJhIHNhZmV0eSAoc2VlCi0jIGNvcHlfcGFzc3dvcmRfdG9fdXNlciBmb3IgZGV0YWlscy4pCi0jCi1teSAkbWQ1c3VtID0gJyc7Ci1zeXN0ZW0oInR5cGUgbWQ1c3VtID4gL2Rldi9udWxsIik7Ci1pZiAoJD8gPT0gMCkgewotCW15ICRtZDUgPSBgL2Jpbi9ta3RlbXAgL3RtcC9kZXNrdG9wLmNnaS5YWFhYWFhgOwotCWNob21wICRtZDU7Ci0JIyBjb21wdXRlIG1kNXN1bSBvZiBwYXNzd29yZDoKLQlpZiAoLW8gJG1kNSAmJiBvcGVuKE1ENSwgInwgbWQ1c3VtID4gJG1kNSIpKSB7Ci0JCXByaW50IE1ENSAiJHBhc3NcbiI7Ci0JCWNsb3NlIE1ENTsKLQkJaWYgKG9wZW4oTUQ1LCAiPCRtZDUiKSkgewotCQkJIyByZWFkIGl0OgotCQkJbXkgJGxpbmUgPSA8TUQ1PjsKLQkJCWNsb3NlIE1ENTsKLQkJCW15ICgkcywgJHQpID0gc3BsaXQoJyAnLCAkbGluZSk7Ci0JCQlpZiAobGVuZ3RoKCRzKSA+PSAzMiAmJiAkcyA9fiAvXlx3KyQvKSB7Ci0JCQkJIyBzaGVsbCBjb2RlIGZvciB1c2VyIHRvIGNoZWNrIGhlIGhhcyBjb3JyZWN0IHBhc3N3ZDoKLQkJCQkkbWQ1c3VtID0gImlmIG1kNXN1bSBcJEhPTUUveDExdm5jLnB3IHwgZ3JlcCAnJHMnID4gL2Rldi9udWxsOyB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaSI7Ci0JCQl9Ci0JCX0KLQl9Ci0JdW5saW5rICRtZDU7Ci19Ci0KLSMgV3JpdGUgeDExdm5jIGNvbW1hbmQgdG8gdGhlIHRtcCBmaWxlOgotIwotcHJpbnQgVE1QIDw8IkVORCI7Ci0jIS9iaW4vc2gKLWV4cG9ydCBQQVRIPS91c3IvYmluOi9iaW46XCRQQVRICi0kbWQ1c3VtCi0keDExdm5jIC1zaWdwaXBlIGlnbm9yZTpIVVAgLW5vcHcgLXJmYnBvcnQgJHZuY19wb3J0IFxcCi0gICAgLXBhc3N3ZGZpbGUgXCRIT01FL3gxMXZuYy5wdyAtb2EgXCRIT01FL3gxMXZuYy5sb2cgXFwKLSAgICAtY3JlYXRlIC1zc2wgU0FWRSAtc3Nsb25seSAtZW52IEZEX0dFT009JGdlb21ldHJ5IFxcCi0gICAgLXRpbWVvdXQgJHRpbWVvdXQgJGV4dHJhICR4MTF2bmNfZXh0cmFfb3B0cyBcXAotICAgICAgICA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwgJgotc2xlZXAgMgotZXhpdCAwCi1FTkQKLQotY2xvc2UgVE1QOwotCi0jIE5vdyBsYXVuY2ggeDExdm5jIHRvIHN3aXRjaCB0byB1c2VyIGFuZCBydW4gdGhlIHdyYXBwZXIgc2NyaXB0OgotIyAodGhpcyByZXF1aXJlcyB4MTF2bmMgMC45LjEwIG9yIGxhdGVyLikKLSMKLSRFTlZ7VU5JWFBXX0NNRH0gPSAiL2Jpbi9zaCAkdG1wZmlsZSI7Ci0KLSMgRm9yIHRoZSBmaXhlZCBwb3J0IHNjaGVtZSB3ZSB0cnkgdG8gY29vcGVyYXRlIHZpYSBsb2NrIGZpbGU6Ci0jIChkaXNhYmxlZCBieSBkZWZhdWx0LikKLSMKLW15ICRybWxvY2sgPSAnJzsKLSMKLWlmICgkZml4ZWRfcG9ydCkgewotCSMgdHJ5IHRvIGdyYWIgdGhlIGZpeGVkIHBvcnQgZm9yIHRoZSBuZXh0IDkwIHNlY3MgcmVtb3Zpbmcgc3RhbGUKLQkjIGxvY2tzIG9sZGVyIHRoYW4gNjAgc2VjczoKLQkjCi0JJHJtbG9jayA9IGxvY2tfZml4ZWRfcG9ydCg5MCwgNjApOwotfQotCi0jIFN0YXJ0IHRoZSB4MTF2bmMgY21kOgotIwotaWYgKCFvcGVuKFgxMVZOQywgInwgJHgxMXZuYyAtdW5peHB3IFwlc3RkaW4gPiAvZGV2L251bGwiKSkgewotCXVubGluayAkdG1wZmlsZTsKLQl1bmxpbmsgJHJtbG9jayBpZiAkcm1sb2NrOwotCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzYiKTsKLX0KLQotc2VsZWN0KFgxMVZOQyk7ICR8ID0gMTsgc2VsZWN0KFNURE9VVCk7Ci0KLSMgQ2xvc2UgYW55IHBvcnQgd2UgaGVsZC4gIFRoZXJlIGlzIHN0aWxsIGEgZ2FwIG9mIHRpbWUgYmV0d2VlbiBub3cKLSMgYW5kIHdoZW4gd2hlbiB4MTF2bmMgaW4gJHRtcGZpbGUgcmVvcGVucyB0aGUgcG9ydCBhZnRlciB0aGUgcGFzc3dvcmQKLSMgYXV0aGVudGljYXRpb24uICBTbyBhbm90aGVyIGluc3RhbmNlIG9mIHRoaXMgc2NyaXB0IGNvdWxkIGFjY2lkZW50YWxseQotIyB0aGluayBpdCBpcyBmcmVlLi4uCi0jIAotc2xlZXAgMTsKLWNsb3NlICRmaW5kX2ZyZWVfcG9ydCBpZiAkZmluZF9mcmVlX3BvcnQ7Ci0KLXByaW50IFgxMVZOQyAiJHVzZXJuYW1lOiRwYXNzd29yZFxuIjsKLWNsb3NlIFgxMVZOQzsJIyBub3RlIHdlIGlnbm9yZSByZXR1cm4gdmFsdWUuCi11bmxpbmsgJHRtcGZpbGU7Ci0KLWlmICgkcm1sb2NrKSB7Ci0JIyBsZXQgb3VyIHgxMXZuYyBwcm9jZWVkIGEgYml0IGJlZm9yZSByZW1vdmluZyBsb2NrLgotCXNsZWVwIDI7Ci0JdW5saW5rICRybWxvY2s7Ci19Ci0KLSMgUmV0dXJuIGh0bWwgZm9yIHRoZSBqYXZhIGFwcGxldCB0byBjb25uZWN0IHRvIHgxMXZuYy4KLSMKLXByaW50X2FwcGxldF9odG1sKCk7Ci0KLWV4aXQgMDsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU3Vicm91dGluZXM6Ci0KLSMgcHJpbnQgdGhlIG1lc3NhZ2UgdG8gY2xpZW50IGFuZCBleGl0IHdpdGggc3VjY2Vzcy4KLSMKLXN1YiBieWUgewotCW15ICRtc2cgPSBzaGlmdDsKLQlwcmludCBTVERPVVQgIjxodG1sPiRtc2c8L2h0bWw+XG4iOwotCWV4aXQgMDsKLX0KLQotIyBkZWNvZGUgJXh4IHRvIGNoYXJhY3RlcjoKLSMKLXN1YiB1cmxfZGVjb2RlIHsKLQlmb3JlYWNoIChAXykgewotCQl0ci8rLyAvOwotCQlzLyUoLi4pL3BhY2soImMiLGhleCgkMSkpL2dlOwotCX0KLQlAXzsKLX0KLQotIyBzZWVkIHJhbmRvbQotIwotc3ViIGluaXRpYWxpemVfcmFuZG9tIHsKLQlteSAkcmJ5dGVzID0gJyc7Ci0JaWYgKG9wZW4oUkFOLCAiPC9kZXYvdXJhbmRvbSIpKSB7Ci0JCXJlYWQoUkFOLCAkcmJ5dGVzLCA4KTsKLQl9IGVsc2lmIChvcGVuKFJBTiwgIjwvZGV2L3JhbmRvbSIpKSB7Ci0JCXJlYWQoUkFOLCAkcmJ5dGVzLCA4KTsKLQl9IGVsc2UgewotCQkkcmJ5dGVzID0gc3ByaW50ZigiJTA4ZCIsICQkKTsKLQl9Ci0JY2xvc2UgUkFOOwotCi0JIyBzZXQgc2VlZDoKLQkjCi0JbXkgJHNlZWQgPSBqb2luKCcnLCB1bnBhY2soIkM4IiwgJHJieXRlcykpOwotCSRzZWVkID0gc3Vic3RyKCRzZWVkLCAtOSk7Ci0Jc3JhbmQoJHNlZWQpOwotCi0JZm9yIChteSAkaSA9IDA7ICRpIDwgKCQkICUgNDA5Nik7ICRpKyspIHsKLQkJIyBNaXggaXQgdXAgZXZlbiBhIGxpdHRsZSBiaXQgbW9yZS4gIFRoZXJlIHNob3VsZCBiZQotCQkjIG92ZXIgMSBiaWxsaW9uIHBvc3NpYmxlIHZuYyBwYXNzd29yZHMgbm93LgotCQlyYW5kKCk7Ci0JfQotfQotCi0jIEF1dG9zZWxlY3QgYSBwb3J0IGZvciB2bmMuICBOb3RlIHRoYXQgYSBzb2NrZXQgZm9yIHRoZSBmb3VuZCBwb3J0Ci0jIGlzIGtlcHQgb3BlbiAoYW5kIHN0b3JlZCBpbiAkZmluZF9mcmVlX3BvcnQpIHVudGlsIHdlIGNhbGwgeDExdm5jIGF0Ci0jIHRoZSBlbmQuCi0jCi1zdWIgYXV0b19zZWxlY3RfcG9ydCB7Ci0JbXkgJHBtaW4gPSAkc3RhcnRpbmdfcG9ydDsJIyBkZWZhdWx0IHJhbmdlIDcwMDAtODAwMC4KLQlteSAkcG1heCA9ICRzdGFydGluZ19wb3J0ICsgMTAwMDsKLQotCWlmICgkZmluZF9mcmVlX3BvcnQgPX4gL14oXGQrKS0oXGQrKSQvKSB7Ci0JCSMgdXNlciBzdXBwbGllZCBhIHJhbmdlOgotCQkkcG1pbiA9ICQxOwotCQkkcG1heCA9ICQyOwotCQlpZiAoJHBtaW4gPiAkcG1heCkgewotCQkJKCRwbWluLCAkcG1heCkgPSAoJHBtYXgsICRwbWluKTsKLQkJfQotCX0gZWxzaWYgKCRmaW5kX2ZyZWVfcG9ydCA+IDEwMjQpIHsKLQkJIyB1c2VyIHN1cHBsaWVkIGEgc3RhcnRpbmcgcG9ydDoKLQkJJHBtaW4gPSAkZmluZF9mcmVlX3BvcnQ7Ci0JCSRwbWF4ID0gJHBtaW4gKyAxMDAwOwotCX0KLQotCSMgVHJ5IHRvIGFkZCBhIGJpdCBvZiByYW5kb21uZXNzIHRvIHRoZSBzdGFydGluZyBwb3J0IHNvCi0JIyBzaW11bHRhbmVvdXMgaW5zdGFuY2VzIG9mIHRoaXMgc2NyaXB0IHdvbid0IGJlIGZvb2xlZCBieSB0aGUgZ2FwCi0JIyBvZiB0aW1lIGJlZm9yZSB4MTF2bmMgcmVvcGVucyB0aGUgcG9ydCAoc2VlIG5lYXIgdGhlIGJvdHRvbS4pCi0JIwotCW15ICRkcCA9IGludChyYW5kKDEuMCkgKiAwLjI1ICogKCRwbWF4IC0gJHBtaW4pKTsKLQlpZiAoJHBtaW4gKyAkZHAgPCAkcG1heCAtIDIwKSB7Ci0JCSRwbWluID0gJHBtaW4gKyAkZHA7Ci0JfQotCi0JbXkgJHBvcnQgPSAwOwotCi0JIyBOb3cgdHJ5IHRvIGZpbmQgYSBmcmVlIG9uZToKLQkjCi0JZm9yIChteSAkcCA9ICRwbWluOyAkcCA8PSAkcG1heDsgJHArKykgewotCQlteSAkc29jayA9ICcnOwotCQlpZiAoJGhhdmVfaW5ldDYgJiYgJGxpc3Rlbl9vbl9pcHY2KSB7Ci0JCQlldmFsIHskc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoCi0JCQkJTGlzdGVuICAgID0+IDEsCi0JCQkJTG9jYWxQb3J0ID0+ICRwLAotCQkJCVJldXNlQWRkciA9PiAxLAotCQkJCURvbWFpbiAgICA9PiBBRl9JTkVUNiwKLQkJCQlMb2NhbEFkZHIgPT4gIjo6IiwKLQkJCQlQcm90byAgICAgPT4gInRjcCIKLQkJCSk7fTsKLQkJfSBlbHNlIHsKLQkJCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJCUxpc3RlbgkgID0+IDEsCi0JCQkJTG9jYWxQb3J0ID0+ICRwLAotCQkJCVJldXNlQWRkciA9PiAxLAotCQkJCVByb3RvICAgICA9PiAidGNwIgotCQkJKTsKLQkJfQotCQlpZiAoJHNvY2spIHsKLQkJCSMgd2Ugd2lsbCBrZWVwIHRoaXMgb3BlbiB1bnRpbCB3ZSBjYWxsIHgxMXZuYzoKLQkJCSRmaW5kX2ZyZWVfcG9ydCA9ICRzb2NrOwotCQkJJHBvcnQgPSAkcDsKLQkJCWxhc3Q7Ci0JCX0KLQl9Ci0JcmV0dXJuICRwb3J0OwotfQotCi0jIFNpbmNlIGFwYWNoZSB0eXBpY2FsbHkgcnVucyBhcyB1c2VyICdhcGFjaGUnLCAnbm9ib2R5JywgZXRjLCBhbmQgbm90Ci0jIGFzIHJvb3QgaXQgaXMgdHJpY2t5IGZvciB1cyB0byBjb3B5IHRoZSBwYXNzIHN0cmluZyB0byBhIGZpbGUgb3duZWQgYnkKLSMgdGhlIHVzZXIgd2l0aG91dCBzb21lIG90aGVyIHVudHJ1c3RlZCBsb2NhbCB1c2VyIGJlaW5nIGFibGUgdG8gbGVhcm4KLSMgdGhlIHBhc3N3b3JkIChlLmcuIHZpYSByZWFkaW5nIGEgZmlsZSBvciB3YXRjaGluZyBwcy4pICBOb3RlIHRoYXQgd2l0aAotIyB0aGUgeDExdm5jIC11bml4cHcgdHJpY2sgd2UgdW5mb3J0dW5hdGVseSBjYW4ndCB1c2UgYSBwaXBlIGJlY2F1c2UKLSMgdGhlIHVzZXIgY29tbWFuZCBpcyBydW4gaW4gaXRzIG93biB0dHkuCi0jCi0jIFRoZSBiZXN0IHdheSB3b3VsZCBiZSBhIHN1ZG8gYWN0aW9uIG9yIGEgc3BlY2lhbCBzZXR1aWQgcHJvZ3JhbSBmb3IKLSMgY29weWluZy4gIFNvIGNvbnNpZGVyIGRvaW5nIHRoYXQgYW5kIHRoZXJlYnkgc2ltcGxpZnkgdGhpcyBmdW5jdGlvbi4KLSMKLSMgU2hvcnQgb2YgYSBzcGVjaWFsIHByb2dyYW0gZG9pbmcgdGhpcywgd2UgdXNlIGEgZmlmbyBzbyBPTkxZIE9ORQotIyBwcm9jZXNzIGNhbiByZWFkIHRoZSBwYXNzd29yZC4gIElmIHRoZSB1bnRydXN0ZWQgbG9jYWwgdXNlciByZWFkcyBpdCwKLSMgdGhlbiB0aGUgbG9nZ2luZy1pbiB1c2VyJ3MgeDExdm5jIHdvbid0IGdldCBpdC4gIFRoZSBsb2dpbiBhbmQgeDExdm5jCi0jIHdpbGwgZmFpbCwgYnV0IHRoZSB1bnRydXN0ZWQgdXNlciB3b24ndCBnYWluIGFjY2VzcyB0byB0aGUgbG9nZ2luZy1pbgotIyB1c2VyJ3MgZGVza3RvcC4KLSMKLSMgU28gaGVyZSB3ZSBzdGFydCBsb25nLCB0ZWRpb3VzIHdvcmsgY2FyZWZ1bGx5IG1hbmFnaW5nIHRoZSBmaWZvLgotIwotc3ViIGNvcHlfcGFzc3dvcmRfdG9fdXNlciB7Ci0KLQlteSAkcGFzcyA9IHNoaWZ0OwotCQotCW15ICR1c2VfZmlmbyA9ICcnOwotCi0JIyBGaW5kIGEgY29tbWFuZCB0byBtYWtlIGEgZmlmbzoKLQkjCi0Jc3lzdGVtKCJ0eXBlIG1rZmlmbyA+IC9kZXYvbnVsbCIpOwotCWlmICgkPyA9PSAwKSB7Ci0JCSR1c2VfZmlmbyA9ICdta2ZpZm8gJXMnOwotCX0gZWxzZSB7Ci0JCXN5c3RlbSgidHlwZSBta25vZCA+IC9kZXYvbnVsbCIpOwotCQlpZiAoJD8gPT0gMCkgewotCQkJJHVzZV9maWZvID0gJ21rbm9kICVzIHAnOwotCQl9Ci0JfQotCi0JIyBDcmVhdGUgdGhlIGZpbGVuYW1lIGZvciBvdXIgZmlmbzoKLQkjCi0JbXkgJGZpZm8gPSBgL2Jpbi9ta3RlbXAgL3RtcC9kZXNrdG9wLmNnaS5YWFhYWFhgOwotCWNob21wICRmaWZvOwotCi0JaWYgKCEgLWUgJGZpZm8gfHwgISAtbyAkZmlmbyB8fCAtbCAkZmlmbykgewotCQl1bmxpbmsgJGZpZm87Ci0JCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzciKTsKLQl9Ci0KLQkjIGRpc2FibGUgZmlmbyBzYWZldHkgaWYgcmVxdWVzdGVkOgotCSMKLQlpZiAoJGRpc2FibGVfdm5jX3Bhc3N3ZF9maWZvX3NhZmV0eSkgewotCQkkdXNlX2ZpZm8gPSAnJzsKLQl9Ci0KLQkjIE1ha2UgdGhlIGZpZm86Ci0JIwotCWlmICgkdXNlX2ZpZm8pIHsKLQkJJHVzZV9maWZvID0gc3ByaW50ZigkdXNlX2ZpZm8sICRmaWZvKTsKLQotCQkjIHRoZXJlIGlzIGEgc21hbGwgcmFjZSBoZXJlOgotCQlzeXN0ZW0oInVtYXNrIDA3Nzsgcm0gLWYgJGZpZm87ICR1c2VfZmlmbzsgY2htb2QgNjAwICRmaWZvIik7Ci0KLQkJaWYgKCFjaG1vZCAwNjAwLCAkZmlmbykgewotCQkJIyB3ZSBjaG1vZCBvbmNlIG1vcmUuLgotCQkJdW5saW5rICRmaWZvOwotCQkJYnllKCJJbnRlcm5hbCBFcnJvciAjOCIpOwotCQl9Ci0KLQkJaWYgKCEgLW8gJGZpZm8gfHwgISAtcCAkZmlmbyB8fCAtbCAkZmlmbykgIHsKLQkJCSMgYnV0IHdlIGdldCBvdXQgaWYgbm90IG93bmVkIGJ5IHVzIGFueW1vcmU6Ci0JCQl1bmxpbmsgJGZpZm87Ci0JCQlieWUoIkludGVybmFsIEVycm9yICM5Iik7Ci0JCX0KLQl9Ci0KLQkjIEJ1aWxkIGNtZCBmb3IgdXNlciB0byByZWFkIG91ciBmaWZvOgotCSMKLQlteSAkdXB3ID0gJyRIT01FL3gxMXZuYy5wdyc7Ci0JJEVOVntVTklYUFdfQ01EfSA9ICJ0b3VjaCAkdXB3OyBjaG1vZCA2MDAgJHVwdzsgY2F0ICRmaWZvID4gJHVwdyI7Ci0KLQkjIFN0YXJ0IGl0OgotCSMKLQlpZiAoIW9wZW4oWDExVk5DLCAifCAkeDExdm5jIC11bml4cHcgXCVzdGRpbiA+IC9kZXYvbnVsbCIpKSB7Ci0JCXVubGluayAkZmlmbzsKLQkJYnllKCJJbnRlcm5hbCBFcnJvciAjMTAiKTsKLQl9Ci0Jc2VsZWN0KFgxMVZOQyk7ICR8ID0gMTsgc2VsZWN0KFNURE9VVCk7Ci0KLQlpZiAoISAkdXNlX2ZpZm8pIHsKLQkJIyByZWd1bGFyIGZpbGUsIHdlIG5lZWQgdG8gd3JpdGUgaXQgbm93LgotCQlpZiAoIW9wZW4oRklGTywgIj4kZmlmbyIpKSB7Ci0JCQljbG9zZSBYMTFWTkM7Ci0JCQl1bmxpbmsgJGZpZm87Ci0JCQlieWUoIkludGVybmFsIEVycm9yICMxMSIpOwotCQl9Ci0JCXByaW50IEZJRk8gIiRwYXNzXG4iOwotCQljbG9zZSBGSUZPOwotCX0KLQotCSMgb3BlbiBmaWZvIHVwIGZvciByZWFkaW5nLgotCSMgKHRoaXMgbWVhbnMgdGhlIGJhZCBndXkgY2FuIHJlYWQgaXQgdG9vLikKLQkjCi0JaWYgKCFjaG1vZCAwNjQ0LCAkZmlmbykgewotCQl1bmxpbmsgJGZpZm87Ci0JCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzEyIik7Ci0JfQotCi0JIyBzZW5kIHRoZSB1c2VyJ3MgcGFzc3dkIG5vdzoKLQkjCi0JcHJpbnQgWDExVk5DICIkdXNlcm5hbWU6JHBhc3N3b3JkXG4iOwotCi0JaWYgKCR1c2VfZmlmbykgewotCQkjIHdhaXQgYSBiaXQgZm9yIHRoZSBjYXQgJGZpZm8gdG8gc3RhcnQsIHJlYWRlciB3aWxsIGJsb2NrLgotCQlzbGVlcCAxOwotCQlpZiAoIW9wZW4oRklGTywgIj4kZmlmbyIpKSB7Ci0JCQljbG9zZSBYMTFWTkM7Ci0JCQl1bmxpbmsgJGZpZm87Ci0JCQlieWUoIkludGVybmFsIEVycm9yICMxMyIpOwotCQl9Ci0JCSMgaGVyZSBpdCBnb2VzOgotCQlwcmludCBGSUZPICIkcGFzc1xuIjsKLQkJY2xvc2UgRklGTzsKLQl9Ci0JY2xvc2UgWDExVk5DOwkjIG5vdGUgd2UgaWdub3JlIHJldHVybiB2YWx1ZS4KLQlmc2xlZXAoMC41KTsKLQl1bmxpbmsgJGZpZm87Ci0KLQkjIERvbmUhCi19Ci0KLSMgRm9yIGZpeGVkLCBzaW5nbGUgcG9ydCBtb2RlLiAgVHJ5IHRvIG9wZW4gYW5kIGxvY2sgdGhlIHBvcnQgYmVmb3JlCi0jIHByb2NlZWRpbmcuCi0jCi1zdWIgbG9ja19maXhlZF9wb3J0IHsKLQlteSAoJHRfbWF4LCAkdF9hZ2UpID0gQF87Ci0KLQkjIGxvY2sgZmlsZSBuYW1lOgotCSMKLQlteSAkbG9jayA9ICcvdG1wL2Rlc2t0b3AuY2dpLmxvY2snOwotCW15ICRyZW1vdmUgPSAnJzsKLQotCW15ICR0ID0gMDsKLQlteSAkc29jayA9ICcnOwotCi0Jd2hpbGUgKCR0IDwgJHRfbWF4KSB7Ci0JCWlmICgtZSAkbG9jaykgewotCQkJIyBjbGVhbiBvdXQgc3RhbGUgbG9ja3MgaWYgcG9zc2libGU6Ci0JCQlpZiAoISAtbCAkbG9jaykgewotCQkJCXVubGluayAkbG9jazsKLQkJCX0gZWxzZSB7Ci0JCQkJbXkgKCRwaWQsICR0aW1lKSA9IHNwbGl0KC86LywgcmVhZGxpbmsoJGxvY2spKTsKLQkJCQlpZiAoISAtZCAiL3Byb2MvJHBpZCIpIHsKLQkJCQkJdW5saW5rICRsb2NrOwotCQkJCX0KLQkJCQlpZiAodGltZSgpID4gJHRpbWUgKyAkdF9hZ2UpIHsKLQkJCQkJdW5saW5rICRsb2NrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW15ICRyZWFzb24gPSAnJzsKLQotCQlpZiAoLWwgJGxvY2spIHsKLQkJCSMgc29tZW9uZSBoYXMgbG9ja2VkIGl0LgotCQkJJHJlYXNvbiA9ICdsb2NrZWQnOwotCQl9IGVsc2UgewotCQkJIyB1bmxvY2tlZCwgdHJ5IHRvIGxpc3RlbiBvbiBwb3J0OgotCQkJaWYgKCRoYXZlX2luZXQ2ICYmICRsaXN0ZW5fb25faXB2NikgewotCQkJCWV2YWwgeyRzb2NrID0gSU86OlNvY2tldDo6SU5FVDYtPm5ldygKLQkJCQkJTGlzdGVuICAgID0+IDEsCi0JCQkJCUxvY2FsUG9ydCA9PiAkdm5jX3BvcnQsCi0JCQkJCVJldXNlQWRkciA9PiAxLAotCQkJCQlEb21haW4gICAgPT4gQUZfSU5FVDYsCi0JCQkJCUxvY2FsQWRkciA9PiAiOjoiLAotCQkJCQlQcm90byAgICAgPT4gInRjcCIKLQkJCQkpO307Ci0JCQl9IGVsc2UgewotCQkJCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJCQlMaXN0ZW4JICA9PiAxLAotCQkJCQlMb2NhbFBvcnQgPT4gJHZuY19wb3J0LAotCQkJCQlSZXVzZUFkZHIgPT4gMSwKLQkJCQkJUHJvdG8gICAgID0+ICJ0Y3AiCi0JCQkJKTsKLQkJCX0KLQkJCWlmICgkc29jaykgewotCQkJCSMgd2UgZ290IGl0LCBub3cgdHJ5IHRvIGxvY2s6Ci0JCQkJbXkgJHN0ciA9ICIkJDoiIC4gdGltZSgpOwotCQkJCWlmIChzeW1saW5rKCRzdHIsICRsb2NrKSkgewotCQkJCQkkcmVtb3ZlID0gJGxvY2s7Ci0JCQkJCSRmaW5kX2ZyZWVfcG9ydCA9ICRzb2NrOwotCQkJCQlsYXN0OwotCQkJCX0KLQkJCQkjIHdvdywgd2UgZGlkbid0IGxvY2sgaXQuLi4KLQkJCQkkcmVhc29uID0gInN5bWxpbmsgZmFpbGVkOiAkISI7Ci0JCQkJY2xvc2UgJHNvY2s7Ci0JCQl9IGVsc2UgewotCQkJCSRyZWFzb24gPSAibGlzdGVuIGZhaWxlZDogJCEiOwotCQkJfQotCQl9Ci0JCSMgc2xlZXAgYSBiaXQgYW5kIHRoZW4gdHJ5IGFnYWluOgotCQkjCi0JCXByaW50IFNUREVSUiAiJCQgZmFpbGVkIHRvIGdldCBmaXhlZCBwb3J0ICR2bmNfcG9ydCBmb3IgJHVzZXJuYW1lIGF0ICR0ICgkcmVhc29uKVxuIjsKLQkJJHNvY2sgPSAnJzsKLQkJJHQgKz0gNTsKLQkJc2xlZXAgNTsKLQl9Ci0JaWYgKCEgJHNvY2spIHsKLQkJYnllKCJGYWlsZWQgdG8gbG9jayBmaXhlZCBUQ1AgcG9ydC4gVHJ5IGFnYWluIGEgYml0IGxhdGVyLjxwPiRsb2dpbl9zdHIiKTsKLQl9Ci0JcHJpbnQgU1RERVJSICIkJCBnb3QgZml4ZWQgcG9ydCAkdm5jX3BvcnQgZm9yICR1c2VybmFtZSBhdCAkdFxuIjsKLQotCSMgUmV0dXJuIHRoZSBmaWxlIHRvIHJlbW92ZSwgaWYgYW55OgotCSMKLQlyZXR1cm4gJHJlbW92ZTsKLX0KLQotCi0jIFJldHVybiBodG1sIGZvciB0aGUgamF2YSBhcHBsZXQgdG8gY29ubmVjdCB0byB4MTF2bmMuCi0jCi0jIE4uQi4gUGxlYXNlIGV4YW1pbmUgdGhlIGFwcGxldCBwYXJhbXMsIGUuZy4gdHJ1c3RVcmxWbmNDZXJ0PXllcyB0bwotIyBzZWUgaWYgeW91IGFncmVlIHdpdGggdGhlbS4gIFNlZSB4MTF2bmMgY2xhc3Nlcy9zc2wvUkVBRE1FIGZvciBhbGwKLSMgcGFyYW1ldGVycy4KLSMKLSMgTm90ZSBob3cgd2UgZG8gbm90IHRha2UgZXh0cmVtZSBjYXJlIHRvIGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyIHRvCi0jIHRoZSBjbGllbnQgYXBwbGV0IChidXQgbm90ZSB0aGF0IHRydXN0VXJsVm5jQ2VydD15ZXMgaXMgYmV0dGVyIHRoYW4KLSMgdHJ1c3RBbGxWbmNDZXJ0cz15ZXMpICBPbmUgY2FuIHRpZ2h0ZW4gYWxsIG9mIHRoaXMgdXAgYXQgdGhlIGV4cGVuc2UKLSMgb2YgZXh0cmEgY2VydGlmaWNhdGUgZGlhbG9ncyAoYXNzdW1pbmcgdGhlIHVzZXIgYm90aGVycyB0byBjaGVjay4uLikKLSMKLSMgVGhpcyBhc3N1bWVzIC9VbHRyYVZpZXdlclNTTC5qYXIgaXMgYXQgZG9jdW1lbnQgcm9vdDsgeW91IG5lZWQgdG8gcHV0Ci0jIGl0IHRoZXJlLgotIwotc3ViIHByaW50X2FwcGxldF9odG1sIHsKLQlteSAoJFcsICRILCAkRCkgPSBzcGxpdCgveC8sICRnZW9tZXRyeSk7Ci0KLQkjIG1ha2UgaXQgc21hbGxlciBzaW5jZSB3ZSAnT3BlbiBOZXcgV2luZG93JyBiZWxvdyBhbnl3YXkuCi0JaWYgKCRhcHBsZXRfd2lkdGggbmUgJ1cnKSB7Ci0JCSRXID0gJGFwcGxldF93aWR0aDsKLQl9Ci0JaWYgKCRhcHBsZXRfaGVpZ2h0IG5lICdIJykgewotCQkkSCA9ICRhcHBsZXRfaGVpZ2h0OwotCX0KLQotCW15ICR0VVZDID0gKCR0cnVzdFVybFZuY0NlcnQgPyAneWVzJyA6ICdubycpOwotCi0JIyBzZWUgJGFwcGxldF9odG1sIHNldCBpbiBkZWZhdWx0cyBzZWN0aW9uIGZvciBtb3JlIGluZm86Ci0JIwotCW15ICRzdHIgPSAkYXBwbGV0X2h0bWw7Ci0KLQkkc3RyID1+IHMvX1VJRF8vJHVpZC9nOwotCSRzdHIgPX4gcy9fVk5DX1BPUlRfLyR2bmNfcG9ydC9nOwotCSRzdHIgPX4gcy9fV0lEVEhfLyRXL2c7Ci0JJHN0ciA9fiBzL19IRUlHSFRfLyRIL2c7Ci0JJHN0ciA9fiBzL19QQVNTXy8kcGFzcy9nOwotCSRzdHIgPX4gcy9fQVBQTEVUX0pBUl8vJGFwcGxldF9qYXIvZzsKLQkkc3RyID1+IHMvX0FQUExFVF9DTEFTU18vJGFwcGxldF9jbGFzcy9nOwotCSRzdHIgPX4gcy9fVFJVU1RfVVZDXy8kdFVWQy9nOwotCi0JaWYgKCRlbmFibGVfcG9ydF9yZWRpcmVjdGlvbiAmJiAkcmVkaXJlY3RfaG9zdCBuZSAnJykgewotCQkkc3RyID1+IHMvbmFtZT1QQVNTV09SRCB2YWx1ZT0uKj4vbmFtZT1OT1RfVVNFRCB2YWx1ZT15ZXM+L2k7Ci0JCSMkc3RyID1+IHMvPCEtLSBleHRyYSAtLT4vPCEtLSBleHRyYSAtLT5cbjxwYXJhbSBuYW1lPSJpZ25vcmVQcm94eSIgdmFsdWU9eWVzPi87Ci0JfQotCi0JcHJpbnQgJHN0cjsKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGZvbGxvd2luZyBzdWJyb3V0aW5lcyBhcmUgZm9yIHBvcnQgcmVkaXJlY3Rpb24gb25seSwgd2hpY2ggaXMKLSMgZGlzYWJsZWQgYnkgZGVmYXVsdCAoJGVuYWJsZV9wb3J0X3JlZGlyZWN0aW9uID09IDApCi0jCi1zdWIgcG9ydF9yZWRpciB7Ci0JIyBUbyBhaWQgaW4gYXZvaWRpbmcgem9tYmllczoKLQkjCi0Jc2V0cGdycCgwLCAwKTsKLQotCSMgRm9yIHRoZSBmaXhlZCBwb3J0IHNjaGVtZSB3ZSB0cnkgdG8gY29vcGVyYXRlIHZpYSBsb2NrIGZpbGU6Ci0JIwotCW15ICRybWxvY2sgPSAnJzsKLQkjCi0JaWYgKCRmaXhlZF9wb3J0KSB7Ci0JCSMgdHJ5IHRvIGdyYWIgdGhlIGZpeGVkIHBvcnQgZm9yIHRoZSBuZXh0IDkwIHNlY3MgcmVtb3ZpbmcKLQkJIyBzdGFsZSBsb2NrcyBvbGRlciB0aGFuIDYwIHNlY3M6Ci0JCSMKLQkJJHJtbG9jayA9IGxvY2tfZml4ZWRfcG9ydCg5MCwgNjApOwotCi0JfSBlbHNpZiAoJGZpbmRfZnJlZV9wb3J0IGVxICcwJykgewotCQlpZiAoJGhhdmVfaW5ldDYgJiYgJGxpc3Rlbl9vbl9pcHY2KSB7Ci0JCQlldmFsIHskZmluZF9mcmVlX3BvcnQgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQkJCUxpc3RlbiAgICA9PiAxLAotCQkJCUxvY2FsUG9ydCA9PiAkdm5jX3BvcnQsCi0JCQkJUmV1c2VBZGRyID0+IDEsCi0JCQkJRG9tYWluICAgID0+IEFGX0lORVQ2LAotCQkJCUxvY2FsQWRkciA9PiAiOjoiLAotCQkJCVByb3RvICAgICA9PiAidGNwIgotCQkJKTt9OwotCQl9IGVsc2UgewotCQkJJGZpbmRfZnJlZV9wb3J0ID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJCUxpc3RlbgkgID0+IDEsCi0JCQkJTG9jYWxQb3J0ID0+ICR2bmNfcG9ydCwKLQkJCQlSZXVzZUFkZHIgPT4gMSwKLQkJCQlQcm90byAgICAgPT4gInRjcCIKLQkJCSk7Ci0JCX0KLQl9Ci0JIyBJbiBhbGwgY2FzZXMsIGF0IHRoaXMgcG9pbnQgJGZpbmRfZnJlZV9wb3J0IGlzIHRoZSBsaXN0ZW5pbmcKLQkjIHNvY2tldC4KLQotCSMgZm9yayBhIGhlbHBlciBwcm9jZXNzIHRvIGRvIHRoZSBwb3J0IHJlZGlyOgotCSMKLQkjIEFjdHVhbGx5IHdlIG5lZWQgdG8gc3Bhd24gNCghKSBvZiB0aGVtIGluIGNhc2UgdGhlIHByb3h5IGNoZWNrCi0JIyAvY2hlY2suaHR0cHMucHJveHkuY29ubmVjdGlvbiAoaXQgaXMgYnkgZGVmYXVsdCkgYW5kIHRoZSBvdGhlcgotCSMgdGVzdCBjb25uZWN0aW9ucy4gIFNwYXduIG9uZSBmb3IgZWFjaCBleHBlY3RlZCBjb25uZWN0aW9uLCBmb3IKLQkjIHdoYXRldmVyIGFwcGxldCBwYXJhbWV0ZXIgdXNhZ2UgbW9kZSB5b3Ugc2V0IHVwLgotCSMKLQlmb3IgKG15ICRuID0gMTsgJG4gPD0gNDsgJG4rKykgewotCQlteSAkcGlkID0gZm9yaygpOwotCQlpZiAoISBkZWZpbmVkICRwaWQpIHsKLQkJCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzE0Iik7Ci0JCX0gZWxzaWYgKCRwaWQpIHsKLQkJCXdhaXQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9yaykgewotCQkJCWV4aXQgMDsKLQkJCX0KLQkJCXNldHBncnAoMCwgMCk7Ci0JCQloYW5kbGVfY29ubigpOwotCQkJZXhpdCAwOwotCQl9Ci0JfQotCi0JIyBXZSBub3cgY2xvc2UgdGhlIGxpc3RlbmluZyBzb2NrZXQ6Ci0JIwotCWNsb3NlICRmaW5kX2ZyZWVfcG9ydDsKLQkKLQlpZiAoJHJtbG9jaykgewotCQkjIGxldCBvdXIgcHJvY2VzcyBwcm9jZWVkIGEgYml0IGJlZm9yZSByZW1vdmluZyBsb2NrLgotCQlzbGVlcCAxOwotCQl1bmxpbmsgJHJtbG9jazsKLQl9Ci0KLQkjIE5vdyBzZW5kIGh0bWwgdG8gdGhlIGJyb3dzZXIgc28gaXQgY2FuIGNvbm5lY3Q6Ci0JIwotCXByaW50X2FwcGxldF9odG1sKCk7Ci0KLQlleGl0IDA7Ci19Ci0KLSMgVGhpcyBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGEgdXNlcm5hbWVAaG9zdDpwb3J0IGZvciB0aGUgcG9ydAotIyByZWRpcmVjdGlvbiBtb2RlLiAgRmluaXNoZXMgYW5kIGV4aXRzIGlmIGl0IGlzIGludmFsaWQuCi0jCi1zdWIgY2hlY2tfcmVkaXJlY3RfaG9zdCB7Ci0JIyBGaXJzdCBjaGVjayB0aGF0IHRoZSBob3N0OnBvcnQgc3RyaW5nIGlzIHZhbGlkOgotCSMKLQlpZiAoJHJlZGlyZWN0X2hvc3QgIX4gL15cd1stXHdcLl0qOlxkKyQvKSB7Ci0JCWJ5ZSgiSW52YWxpZCBSZWRpcmVjdCBIb3N0OlBvcnQuPHA+JGxvZ2luX3N0ciIpOwotCX0KLQkjIFNlY29uZCwgY2hlY2sgaWYgdGhlIGFsbG93ZWQgaG9zdCBmaWxlIHBlcm1pdHMgaXQ6Ci0JIwotCWlmICgkcG9ydF9yZWRpcmVjdGlvbl9hbGxvd2VkX2hvc3RzIG5lICcnKSB7Ci0JCWlmICghIG9wZW4oQUxMT1dFRCwgIjwkcG9ydF9yZWRpcmVjdGlvbl9hbGxvd2VkX2hvc3RzIikpIHsKLQkJCWJ5ZSgiSW50ZXJuYWwgRXJyb3IgIzE1Iik7Ci0JCX0KLQkJbXkgJG9rID0gMDsKLQkJd2hpbGUgKG15ICRsaW5lID0gPEFMTE9XRUQ+KSB7Ci0JCQljaG9tcCAkbGluZTsKLQkJCSMgc2tpcCBibGFuayBsaW5lcyBhbmQgJyMnIGNvbW1lbnRzOgotCQkJbmV4dCBpZiAkbGluZSA9fiAvXlxzKiQvOwotCQkJbmV4dCBpZiAkbGluZSA9fiAvXlxzKiMvOwotCi0JCQkjIHRyaW0gc3BhY2VzIGZyb20gZW5kczoKLQkJCSRsaW5lID1+IHMvXlxzKi8vOwotCQkJJGxpbmUgPX4gcy9ccyokLy87Ci0KLQkJCSMgY29sbGVjdCBob3N0OnBvcnRzIGluIGNhc2UgcG9ydCByYW5nZSBnaXZlbjoKLQkJCW15IEBpdGVtczsKLQkJCWlmICgkbGluZSA9fiAvXiguKik6KFxkKyktKFxkKykkLykgewotCQkJCSMgcG9ydCByYW5nZToKLQkJCQlteSAkaG9zdCA9ICQxOwotCQkJCW15ICRwbWluID0gJDI7Ci0JCQkJbXkgJHBtYXggPSAkMzsKLQkJCQlmb3IgKG15ICRwID0gJHBtaW47ICRwIDw9ICRwbWF4OyAkcCsrKSB7Ci0JCQkJCXB1c2ggQGl0ZW1zLCAiJGhvc3Q6JHAiOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcHVzaCBAaXRlbXMsICRsaW5lOwotCQkJfQotCi0JCQkjIG5vdyBjaGVjayBlYWNoIGl0ZW0gZm9yIGEgbWF0Y2g6Ci0JCQlmb3JlYWNoIG15ICRpdGVtIChAaXRlbXMpIHsKLQkJCQlpZiAoJGl0ZW0gZXEgJ0FMTCcpIHsKLQkJCQkJJG9rID0gMTsKLQkJCQkJbGFzdDsKLQkJCQl9IGVsc2lmICgkaXRlbSA9fiAvQC8pIHsKLQkJCQkJaWYgKCIkdXNlcm5hbWVcQCRyZWRpcmVjdF9ob3N0IiBlcSAkaXRlbSkgewotCQkJCQkJJG9rID0gMTsKLQkJCQkJCWxhc3Q7Ci0JCQkJCX0KLQkJCQl9IGVsc2lmICgkcmVkaXJlY3RfaG9zdCBlcSAkaXRlbSkgewotCQkJCQkkb2sgPSAxOwotCQkJCQlsYXN0OwotCQkJCX0KLQkJCX0KLQkJCSMgZ290IGEgbWF0Y2g6Ci0JCQlsYXN0IGlmICRvazsKLQkJfQotCQljbG9zZSBBTExPV0VEOwotCi0JCWlmICghICRvaykgewotCQkJYnllKCJEaXNhbGxvd2VkIFJlZGlyZWN0IEhvc3Q6UG9ydC48cD4kbG9naW5fc3RyIik7Ci0JCX0KLQl9Ci19Ci0KLSMgTXVjaCBvZiB0aGlzIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSAnY29ubmVjdF9zd2l0Y2gnOgotIwotIyAoaXQgb25seSBhcHBsaWVzIHRvIHRoZSB2bmMgcmVkaXJlY3RvciAkZW5hYmxlX3BvcnRfcmVkaXJlY3Rpb24gbW9kZQotIyB3aGljaCBpcyBvZmYgYnkgZGVmYXVsdC4pCi0jCi1zdWIgaGFuZGxlX2Nvbm4gewotCWNsb3NlIFNURElOOwotCWNsb3NlIFNURE9VVDsKLQljbG9zZSBTVERFUlI7Ci0KLQkkU0lHe0FMUk19ID0gc3ViIHtjbG9zZSAkZmluZF9mcmVlX3BvcnQ7IGV4aXQgMH07Ci0KLQkjIFdlIG9ubHkgd2FpdCAzMCBzZWNzIGZvciB0aGUgcmVkaXIgY2FzZSwgZXNwLiBzaW5jZQotCSMgd2UgbmVlZCB0byBzcGF3biBzbyBtYW55IGhlbHBlcnMuLi4KLQkjCi0JYWxhcm0oMzApOwotCi0JbXkgKCRjbGllbnQsICRpcCkgPSAkZmluZF9mcmVlX3BvcnQtPmFjY2VwdCgpOwotCi0JYWxhcm0oMCk7Ci0KLQljbG9zZSAkZmluZF9mcmVlX3BvcnQ7Ci0KLQlpZiAoISRjbGllbnQpIHsKLQkJZXhpdCAxOwotCX0KLQotCW15ICRob3N0ID0gJyc7Ci0JbXkgJHBvcnQgPSAnJzsKLQlpZiAoJHJlZGlyZWN0X2hvc3QgPX4gL14oLiopOihcZCspJC8pIHsKLQkJKCRob3N0LCAkcG9ydCkgPSAoJDEsICQyKTsKLQl9Ci0KLQlteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQkJUGVlckFkZHIgPT4gJGhvc3QsCi0JCVBlZXJQb3J0ID0+ICRwb3J0LAotCQlQcm90byA9PiAidGNwIgotCSk7Ci0JaWYgKCEgJHNvY2sgJiYgJGhhdmVfaW5ldDYpIHsKLQkJZXZhbCB7JHNvY2sgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQkJUGVlckFkZHIgPT4gJGhvc3QsCi0JCQlQZWVyUG9ydCA9PiAkcG9ydCwKLQkJCVByb3RvID0+ICJ0Y3AiCi0JCSk7fTsKLQl9Ci0KLQlpZiAoISAkc29jaykgewotCQljbG9zZSAkY2xpZW50OwotCQlleGl0IDE7Ci0JfQotCi0JJGN1cnJlbnRfZmgxID0gJGNsaWVudDsKLQkkY3VycmVudF9maDIgPSAkc29jazsKLQotCSRTSUd7VEVSTX0gPSBzdWIge2Nsb3NlICRjdXJyZW50X2ZoMTsgY2xvc2UgJGN1cnJlbnRfZmgyOyBleGl0IDB9OwotCi0JbXkgJGtpbGxwaWQgPSAxOwotCi0JbXkgJHBhcmVudCA9ICQkOwotCWlmIChteSAkY2hpbGQgPSBmb3JrKCkpIHsKLQkJeGZlcigkc29jaywgJGNsaWVudCwgJ1MtPkMnKTsKLQkJaWYgKCRraWxscGlkKSB7Ci0JCQlmc2xlZXAoMC41KTsKLQkJCWtpbGwgJ1RFUk0nLCAkY2hpbGQ7Ci0JCX0KLQl9IGVsc2UgewotCQl4ZmVyKCRjbGllbnQsICRzb2NrLCAnQy0+UycpOwotCQlpZiAoJGtpbGxwaWQpIHsKLQkJCWZzbGVlcCgwLjc1KTsKLQkJCWtpbGwgJ1RFUk0nLCAkcGFyZW50OwotCQl9Ci0JfQotCWV4aXQgMDsKLX0KLQotIyBUaGlzIGRvZXMgc29ja2V0IGRhdGEgdHJhbnNmZXIgaW4gb25lIGRpcmVjdGlvbi4KLSMKLXN1YiB4ZmVyIHsKLQlteSgkaW4sICRvdXQsICRsYWIpID0gQF87Ci0JbXkgKCRSSU4sICRXSU4sICRFSU4sICRST1VUKTsKLQkkUklOID0gJFdJTiA9ICRFSU4gPSAiIjsKLQkkUk9VVCA9ICIiOwotCXZlYygkUklOLCBmaWxlbm8oJGluKSwgMSkgPSAxOwotCXZlYygkV0lOLCBmaWxlbm8oJGluKSwgMSkgPSAxOwotCSRFSU4gPSAkUklOIHwgJFdJTjsKLQlteSAkYnVmOwotCi0Jd2hpbGUgKDEpIHsKLQkJbXkgJG5mID0gMDsKLQkJd2hpbGUgKCEgJG5mKSB7Ci0JCQkkbmYgPSBzZWxlY3QoJFJPVVQ9JFJJTiwgdW5kZWYsIHVuZGVmLCB1bmRlZik7Ci0JCX0KLQkJbXkgJGxlbiA9IHN5c3JlYWQoJGluLCAkYnVmLCA4MTkyKTsKLQkJaWYgKCEgZGVmaW5lZCgkbGVuKSkgewotCQkJbmV4dCBpZiAkISA9fiAvXkludGVycnVwdGVkLzsKLQkJCWxhc3Q7Ci0JCX0gZWxzaWYgKCRsZW4gPT0gMCkgewotCQkJbGFzdDsKLQkJfQotCi0JCW15ICRvZmZzZXQgPSAwOwotCQlteSAkcXVpdCA9IDA7Ci0JCXdoaWxlICgkbGVuKSB7Ci0JCQlteSAkd3JpdHRlbiA9IHN5c3dyaXRlKCRvdXQsICRidWYsICRsZW4sICRvZmZzZXQpOwotCQkJaWYgKCEgZGVmaW5lZCAkd3JpdHRlbikgewotCQkJCSRxdWl0ID0gMTsKLQkJCQlsYXN0OwotCQkJfQotCQkJJGxlbiAtPSAkd3JpdHRlbjsKLQkJCSRvZmZzZXQgKz0gJHdyaXR0ZW47Ci0JCX0KLQkJbGFzdCBpZiAkcXVpdDsKLQl9Ci0JY2xvc2UoJGluKTsKLQljbG9zZSgkb3V0KTsKLX0KLQotIyBTbGVlcCBhIHNtYWxsIGFtb3VudCBvZiB0aW1lIChmbG9hdCkKLSMKLXN1YiBmc2xlZXAgewotCW15ICgkdGltZSkgPSBAXzsKLQlzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgJHRpbWUpIGlmICR0aW1lOwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZHRWbmNQb3B1cCBiL3gxMXZuYy9taXNjL2R0Vm5jUG9wdXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MGNjOGIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZHRWbmNQb3B1cAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIS91c3IvZHQvYmluL2R0a3NoCi0jCi0jIGFjY2VwdCBkaWFsb2cgc2NyaXB0IGZvciB4MTF2bmMKLSMgMjAwNC0wNy0xMyBzdGVmYW4ucmFkbWFuQGN0YnRvLm9yZwotIyBzaG91bGQgd29yayBpbiBhbnkgQ0RFIGVudmlyb25tZW50IChTdW4sSFAsSUJNLC4uLikKLSMgCi0jIHdoZW4gY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycyBzaG93cyBhIENERSBxdWVzdGlvbiBkaWFsb2c6Ci0jICAgRG8geW91IHdhbnQgdG8gYWNjZXB0IGEgVk5DIGNvbm5lY3Rpb24KLSMgICBmcm9tIElQIGFkZHJlc3MgJFJGQl9DTElFTlRfSVAgdG8geW91ciBkZXNrdG9wPwotIyAgIE5vdGU6Ci0jICAgQWZ0ZXIgMzAgc2Vjb25kcyB0aGUgc2NyZWVuIHdpbGwKLSMgICBiZSBsb2NrZWQgYW5kIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUKLSMgICBhY2NlcHRlZCBhdXRvbWF0aWNhbGx5LiIKLSMgICAgICAgW1llc30ge19fTm9fX10gW1ZpZXcvT25seV0KLSMgYW5kIGNvdW50cyBkb3duIGEgdGltZXIgaW4gdGhlIGRpYWxvZyB0aXRsZSBiYXIKLSMgd2hlbiB0aGUgdGltZXIgaXMgZG93biB0byAwLCBpdCBsb2NrcyB0aGUgZGlzcGxheSBhbmQgcmV0dXJucyAwCi0jIChpZiB0aGUgc2NyZWVubG9jayB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgbG9naW4gcHJvbXB0IHdhcyBhY3RpdmUpCi0jCi0jIGJ1dHRvbnM9cmV0Y29kZToKLSMgICAgWWVzID0gMAotIyAgICBObyA9IDEgKHNhbWUgYXMgY2xvc2luZyB0aGUgZGlhbG9nIHdpbmRvd3MpCi0jICAgIFZpZXcvT25seSA9IDMKLSMKLSMgdXNhZ2U6IHgxMXZuYyAtZm9yZXZlciAtc2hhcmVkIC1hY2NlcHQgInllczowLG5vOiosdmlldzozIGR0Vm5jUG9wdXAiIC1nb25lICJkdFZuY1BvcHVwIGxvY2siCi0jCi0jIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zOiB3aGVuIHlvdSByZXR1cm4gdG8geW91ciBjb25zb2xlIGFuZCB1bmxvY2sgdGhlIGRpc3BsYXkgCi0jICAgICAgICAgICAgICAgICAgeW91IGNhbiBuZXZlciBrbm93IGlmIGVueW9uZSBlbHNlIGlzIGNvbm5lY3RlZCB0byB5b3VyIGRpc3BsYXkKLSMKLQotIyB0aW1lb3V0IHVudGlsIGFjY2VwdAotdGltZW91dD0zMAotCi0jIGRpYWxvZyBtZXNzYWdlCi10ZXN0IC16ICIke1JGQl9DTElFTlRfSVB9IiAmJiB1bmtub3duPSJhbiB1bmtub3duICIgfHwgaXA9IiRSRkJfQ0xJRU5UX0lQICIKLW1lc3NhZ2U9IlwKLURvIHlvdSB3YW50IHRvIGFjY2VwdCBhIFZOQyBjb25uZWN0aW9uCi1mcm9tICR7dW5rbm93bn1JUCBhZGRyZXNzICR7aXB9dG8geW91ciBkZXNrdG9wPwotTm90ZToKLUFmdGVyICR0aW1lb3V0IHNlY29uZHMgdGhlIHNjcmVlbiB3aWxsCi1iZSBsb2NrZWQgYW5kIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUKLWFjY2VwdGVkIGF1dG9tYXRpY2FsbHkuIgotCi0jIGFjdGlvbiBmdW5jdGlvbnMKLWFjY2VwdCAoKSB7Ci0JZXhpdCAwCi19Ci1yZWplY3QgKCkgewotCWV4aXQgMQotfQotdmlldyAoKSB7Ci0JZXhpdCAzCi19Ci1sb2NrICgpIHsKLSAgICAgICAgIyBsb2NrIG9ubHkgaWYgZHRzZXNzaW9uIGFjdGl2ZQotICAgICAgICB4cmRiIC1xdWVyeSB8IGdyZXAgLWMgJ15kdHNlc3Npb24qJyB8fCBhY2NlcHQKLQkjIGFjY2VwdCBvbmx5IGlmIGxvY2sgc3VjY2VlZHMKLQkvdXNyL2R0L2Jpbi9kdGFjdGlvbiBMb2NrRGlzcGxheSAmJiBhY2NlcHQgfHwgcmVqZWN0Ci19Ci0KLSMgbWFpbgotCi0jIGFjdGlvbnMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseQotdGVzdCAkIyAtZ3QgMCAmJiAkQAotCi0jIGluaXRpYWxpemUgdGhlIGRpc3BsYXkKLVh0SW5pdGlhbGl6ZSBUT1BMRVZFTCB2bmNQb3B1cCBWbmNQb3B1cCAiJDAiICIkQCIKLQotIyBjcmVhdGUgYSBtZXNzYWdlIGRpYWxvZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUKLVhtQ3JlYXRlUXVlc3Rpb25EaWFsb2cgRElBTE9HICRUT1BMRVZFTCBkaWFsb2cgXAotCWRpYWxvZ1RpdGxlOiIkRFRLU0hfQVBQTkFNRSIgXAotICAgICAgICBtZXNzYWdlU3RyaW5nOiIkbWVzc2FnZSIgXAotCXVubWFwQ2FsbGJhY2s6cmVqZWN0IFwKLSMgICAgICAgIHN5bWJvbFBpeG1hcDovdXNyL2R0L2FwcGNvbmZpZy9pY29ucy9DL0R0RmxhZy5tLnBtCi0KLSMgY2hhbmdlIHRoZSBPSyBidXR0b24gdG8gIlllcyIKLVhtTWVzc2FnZUJveEdldENoaWxkIE9LX0JVVFRPTiAkRElBTE9HIERJQUxPR19PS19CVVRUT04KLVh0U2V0VmFsdWVzICRPS19CVVRUT04gXAotCWxhYmVsU3RyaW5nOiJZZXMiIFwKLQlhY3RpdmF0ZUNhbGxiYWNrOmFjY2VwdAotCi0jIGNoYW5nZSB0aGUgQ2FuY2VsIEJ1dHRvbiB0byAiTm8iCi1YbU1lc3NhZ2VCb3hHZXRDaGlsZCBDQU5DRUxfQlVUVE9OICRESUFMT0cgRElBTE9HX0NBTkNFTF9CVVRUT04KLVh0U2V0VmFsdWVzICRDQU5DRUxfQlVUVE9OIFwKLQlsYWJlbFN0cmluZzoiTm8iIFwKLQlhY3RpdmF0ZUNhbGxiYWNrOnJlamVjdAotCi0jIGNoYW5nZSBIZWxwIGJ1dHRvbiB0byBWaWV3LU9ubHksIHNldCBmb2N1cyBhbmQgbWFrZSBpdCB0aGUgZGVmYXVsdAotWG1NZXNzYWdlQm94R2V0Q2hpbGQgSEVMUF9CVVRUT04gJERJQUxPRyBESUFMT0dfSEVMUF9CVVRUT04KLVh0U2V0VmFsdWVzICRIRUxQX0JVVFRPTiBcCi0JbGFiZWxTdHJpbmc6IlZpZXdcbk9ubHkiIFwKLQlhY3RpdmF0ZUNhbGxiYWNrOnZpZXcKLQotIyBtYWtlICJObyIgdGhlIGRlZmF1bHQgKGZvciB1bm1hcCBhcyB3ZWxsKQotWHRTZXRWYWx1ZXMgJERJQUxPRyBcCi0JZGVmYXVsdEJ1dHRvbjokQ0FOQ0VMX0JVVFRPTiBpbml0aWFsRm9jdXM6JENBTkNFTF9CVVRUT04gXAotCi0jIGNyZWF0ZSB0aGUgdGlja2VyCi10aWNrZXIgKCkgewotICAgICAgICB0ZXN0ICR0aW1lb3V0IC1lcSAwICYmIGxvY2sKLQlYdFNldFZhbHVlcyAkRElBTE9HIGRpYWxvZ1RpdGxlOiJhY2NlcHRpbmcgaW4gJHRpbWVvdXQgc2Vjb25kcyIKLQlYdEFkZFRpbWVPdXQgVElDS0VSIDEwMDAgdGlja2VyCi0gICAgICAgIHRpbWVvdXQ9YGV4cHIgJHRpbWVvdXQgLSAxYAotfQotCi0jIGRpc3BsYXkgZGlhbG9nIGFuZCBhY3RpdmF0ZSB0aWNrZXIKLVh0QWRkVGltZU91dCBUSUNLRVIgMTAwMCB0aWNrZXIKLVh0TWFuYWdlQ2hpbGQgJERJQUxPRwotWHRNYWluTG9vcAotCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvQ09QWUlORyBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y2YjEyLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMDIxMTEtMTMwNywgVVNBLgotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQlBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1JFQURNRSBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWI5M2EuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0gICAgICAgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQzogU1NML1NTSCBWTkMgdmlld2VyKQotCi1Db3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhlc2UgYnVuZGxlcyBwcm92aWRlIDEpIEFuIGVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciBvbiBVbml4LCAyKSBCaW5hcmllcwotZm9yIG1hbnkgT3BlcmF0aW5nIFN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzIGFuZCBNYWMgT1MgWCkgZm9yIHlvdXIKLWNvbnZlbmllbmNlLCAzKSBXcmFwcGVyIHNjcmlwdHMgYW5kIGEgR1VJIGZvciBnbHVpbmcgdGhlbSBhbGwgdG9nZXRoZXIuCi0KLU9uZSBjYW4gc3RyYWlnaHQtZm9yd2FyZGx5IGRvd25sb2FkIGFsbCBvZiB0aGUgY29tcG9uZW50cyBhbmQgZ2V0IHRoZW0KLXRvIHdvcmsgdG9nZXRoZXIgYnkgb25lc2VsZjogdGhpcyBidW5kbGUgaXMgbW9zdGx5IGZvciB5b3VyIGNvbnZlbmllbmNlCi10byBjb21iaW5lIGFuZCB3cmFwIHRvZ2V0aGVyIHRoZSBmcmVlbHkgYXZhaWxhYmxlIHNvZnR3YXJlLgotCi1CdW5kbGVkIHNvZnR3YXJlIGNvLXNoaXBwZWQgaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlZCBieSBvdGhlcnMuCi1TZWUgdGhlc2Ugc2l0ZXMgYW5kIHJlbGF0ZWQgb25lcyBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKLQotICAgICAgICBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQotICAgICAgICBodHRwOi8vd3d3LnJlYWx2bmMuY29tCi0gICAgICAgIGh0dHA6Ly9zdHVubmVsLm1pcnQubmV0Ci0gICAgICAgIGh0dHA6Ly93d3cuc3R1bm5lbC5vcmcKLSAgICAgICAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZwotICAgICAgICBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL3B1dHR5LwotCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY290dm5jLwotCi1Ob3RlOiBTb21lIG9mIHRoZSBiaW5hcmllcyBpbmNsdWRlZCBjb250YWluIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgdGhhdAoteW91IG1heSBub3QgYmUgYWxsb3dlZCB0byBkb3dubG9hZCwgdXNlLCBvciByZWRpc3RyaWJ1dGUuICBQbGVhc2UgY2hlY2sKLXlvdXIgc2l0dWF0aW9uIGZpcnN0IGJlZm9yZSBkb3dubG9hZGluZyBhbnkgb2YgdGhlc2UgYnVuZGxlcy4gIFNlZSB0aGUKLXN1cnZleSBodHRwOi8vcmVjaHRlbi51dnQubmwva29vcHMvY3J5cHRvbGF3L2luZGV4Lmh0bSBmb3IgdXNlZnVsCi1pbmZvcm1hdGlvbi4KLQotQWxsIHdvcmsgZG9uZSBieSBLYXJsIEouIFJ1bmdlIGluIHRoaXMgcHJvamVjdCBpcwotQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggS2FybCBKLiBSdW5nZSBhbmQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCBhcwotZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhpcyBkaXJlY3RvcnkuCi0KLUFsbCB0aGUgZmlsZXMgYW5kIGluZm9ybWF0aW9uIGluIHRoaXMgcHJvamVjdCBhcmUgcHJvdmlkZWQgIkFTIElTIgotd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQuICBVc2UgdGhlbSBhdCB5b3VyIG93biByaXNrLgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgYnVuZGxlIGNvbnRhaW5zIGEgY29udmVuaWVudCBjb2xsZWN0aW9uIG9mIGVuaGFuY2VkIFRpZ2h0Vk5DCi12aWV3ZXJzIGFuZCBzdHVubmVsIGJpbmFyaWVzIGZvciBkaWZmZXJlbnQgZmxhdm9ycyBvZiBVbml4IGFuZCB3cmFwcGVyCi1zY3JpcHRzIGFuZCBhIEdVSSBmcm9udC1lbmQgdG8gZ2x1ZSB0aGVtIHRvZ2V0aGVyLiAgQXV0b21hdGljIFNTTCBhbmQKLVNTSCBlbmNyeXB0aW9uIHR1bm5lbGxpbmcgaXMgcHJvdmlkZWQuCi0KLUEgV2luZG93cyBTU0wgd3JhcHBlciBmb3IgdGhlIGJ1bmRsZWQgVGlnaHRWTkMgYmluYXJ5IGFuZCBvdGhlciB1dGlsaXRpZXMKLWFyZSBwcm92aWRlZC4gIChMYXVuY2ggc3N2bmMuZXhlIGluIHRoZSBXaW5kb3dzIHN1YmRpcmVjdG9yeSkuCi0KLVRoZSBzaG9ydCBuYW1lIG9mIHRoZSBwcm9qZWN0IGlzICJzc3ZuYyIgZm9yIFNTTC9TU0ggVk5DIFZpZXdlci4KLQotSXQgaXMgYSBzZWxmLWNvbnRhaW5lZCBidW5kbGUsIHlvdSBjb3VsZCBjYXJyeSBpdCBhcm91bmQgb24sIHNheSwKLWEgVVNCIG1lbW9yeSBzdGljayBmb3Igc2VjdXJlIFZOQyB2aWV3aW5nIGZyb20gYWxtb3N0IGFueSBtYWNoaW5lLAotVW5peCwgTWFjLCBvciBXaW5kb3dzLgotCi1GZWF0dXJlczoKLS0tLS0tLS0tCi0KLVRoZSBlbmhhbmNlZCBUaWdodFZOQyB2aWV3ZXIgZmVhdHVyZXMgYXJlOgotCi0JLSBTU0wgc3VwcG9ydCBmb3IgY29ubmVjdGlvbnMgdXNpbmcgdGhlIGJ1bmRsZWQgc3R1bm5lbCBwcm9ncmFtLgotCi0JLSBBdXRvbWF0aWMgU1NIIGNvbm5lY3Rpb25zIGZyb20gdGhlIEdVSSAoc3NoIG11c3QgYWxyZWFkeSBiZQotCSAgaW5zdGFsbGVkIG9uIFVuaXg7IGJ1bmRsZWQgcGxpbmsgaXMgdXNlZCBvbiBXaW5kb3dzKQotCi0JLSBBYmlsaXR5IHRvIFNhdmUgYW5kIExvYWQgVk5DIHByb2ZpbGVzIGZvciBkaWZmZXJlbnQgaG9zdHMuCi0KLQktIFlvdSBjYW4gYWxzbyB1c2UgeW91ciBvd24gVk5DIFZpZXdlciwgZS5nLiBVbHRyYVZOQyBvciBSZWFsVk5DLAotCSAgd2l0aCB0aGUgZnJvbnQtZW5kIEdVSSBvciBzY3JpcHRzIGlmIHlvdSBsaWtlLgotCi0JLSBDcmVhdGUgb3IgSW1wb3J0IFNTTCBDZXJ0aWZpY2F0ZXMgYW5kIFByaXZhdGUgS2V5cy4KLQotCS0gUmV2ZXJzZSAodmlld2VyIGxpc3RlbmluZykgVk5DIGNvbm5lY3Rpb25zIHZpYSBTU0wgYW5kIFNTSC4KLQotCS0gVmVOQ3J5cHQgU1NML1RMUyBWTkMgZW5jcnlwdGlvbiBzdXBwb3J0ICh1c2VkIGJ5IFZlTkNyeXB0LAotCSAgUUVNVSwgZ2dpLCBsaWJ2aXJ0L3ZpcnQtbWFuYWdlci94ZW4sIHZpbmFncmUvZ3ZuY3ZpZXdlci9ndGstdm5jKQotCi0JLSBBTk9OVExTIFNTTC9UTFMgVk5DIGVuY3J5cHRpb24gc3VwcG9ydCAodXNlZCBieSBWaW5vKQotCi0JLSBWZU5DcnlwdCBhbmQgQU5PTlRMUyBhcmUgYWxzbyBlbmFibGVkIGZvciBhbnkgM3JkIHBhcnR5IFZOQwotCSAgVmlld2VyIChlLmcuIFJlYWxWTkMsIFRpZ2h0Vk5DLCBVbHRyYVZOQyAuLi4pIG9uIFVuaXgsIE1hY09TWCwKLQkgIGFuZCBXaW5kb3dzIHZpYSB0aGUgcHJvdmlkZWQgU1NWTkMgVmVOQ3J5cHQgVmlld2VyIEJyaWRnZSB0b29sCi0JICAodXNlICdDaGFuZ2UgVk5DIFZpZXdlcicgdG8gc2VsZWN0IHRoZSBvbmUgeW91IHdhbnQuKQotCi0JLSBTdXBwb3J0IGZvciBXZWIgUHJveGllcywgU09DS1MgUHJveGllcywgYW5kIHRoZSBVbHRyYVZOQwotCSAgcmVwZWF0ZXIgcHJveHkgKGUuZy4gcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6MTIzNCkuIE11bHRpcGxlCi0JICBwcm94aWVzIG1heSBiZSBjaGFpbmVkIHRvZ2V0aGVyICgzIG1heCkuCi0KLQktIFN1cHBvcnQgZm9yIFNTSCBHYXRld2F5IGNvbm5lY3Rpb25zIGFuZCBub24tc3RhbmRhcmQgU1NIIHBvcnRzLgotCi0JLSBBdXRvbWF0aWMgU2VydmljZSB0dW5uZWxsaW5nIHZpYSBTU0ggZm9yIENVUFMgYW5kIFNNQiBQcmludGluZywKLQkgIEVTRC9BUlRTRCBBdWRpbywgYW5kIFNNQiAoV2luZG93cy9TYW1iYSkgZmlsZXN5c3RlbSBtb3VudGluZy4KLQotCS0gU2V0cyB1cCBhbnkgYWRkaXRpb25hbCBTU0ggcG9ydCByZWRpcmVjdGlvbnMgdGhhdCB5b3Ugd2FudC4KLQotCS0gWmVyb2NvbmYgKGFrYSBCb25qb3VyKSBpcyB1c2VkIG9uIFVuaXggYW5kIE1hYyBPUyBYIHRvIGZpbmQKLQkgIFZOQyBzZXJ2ZXJzIG9uIHlvdXIgbG9jYWwgbmV0d29yayBpZiB0aGUgYXZhaGktYnJvd3NlIG9yIGRucy1zZAotCSAgcHJvZ3JhbSBpcyBhdmFpbGFibGUgYW5kIGluIHlvdXIgUEFUSC4KLQotICAgICAgICAtIFBvcnQgS25vY2tpbmcgZm9yICJjbG9zZWQgcG9ydCIgU1NIL1NTTCBjb25uZWN0aW9ucy4gIEluIGFkZGl0aW9uCi0gICAgICAgICAgdG8gYSBzaW1wbGUgZml4ZWQgcG9ydCBzZXF1ZW5jZSBhbmQgb25lLXRpbWUtcGFkIGltcGxlbWVudGF0aW9uLAotICAgICAgICAgIGEgaG9vayBpcyBhbHNvIHByb3ZpZGVkIHRvIHJ1biBhbnkgcG9ydCBrbm9ja2luZyBjbGllbnQgYmVmb3JlIGEKLSAgICAgICAgICBjb25uZWN0aW5nLgotCi0JLSBTdXBwb3J0IGZvciBuYXRpdmUgTWFjT1MgWCB1c2FnZSB3aXRoIGJ1bmRsZWQgQ2hpY2tlbiBvZiB0aGUKLQkgIFZOQyB2aWV3ZXIgKHRoZSBVbml4IFgxMSB2aWV3ZXIgaXMgYWxzbyBwcm92aWRlZCBmb3IgTWFjT1MgWCwKLQkgIGFuZCBpcyBiZXR0ZXIgSU1ITykuCi0KLQktIER5bmFtaWMgVk5DIFNlcnZlciBQb3J0IGRldGVybWluYXRpb24gYW5kIHJlZGlyZWN0aW9uICh1c2luZwotCSAgc3NoJ3MgYnVpbHRpbiBTT0NLUyBwcm94eSwgLUQpIGZvciBzZXJ2ZXJzIGxpa2UgeDExdm5jIHRoYXQKLQkgIHByaW50IG91dCBQT1JUPSBhdCBzdGFydHVwLgotCi0gICAgICAgIC0gVW5peCBVc2VybmFtZSBhbmQgUGFzc3dvcmQgZW50cnkgZm9yIHVzZSB3aXRoICJ4MTF2bmMgLXVuaXhwdyIKLQkgIHR5cGUgbG9naW4gZGlhbG9ncy4KLQotCS0gU2ltcGxpZmllZCBtb2RlIGxhdW5jaGVkIGJ5IGNvbW1hbmQgInNzaHZuYyIgdGhhdCBpcyBTU0ggT25seS4KLQotCS0gU2ltcGxpZmllZCBtb2RlIGxhdW5jaGVkIGJ5IGNvbW1hbmQgInRzdm5jIiB0aGF0IHByb3ZpZGVzIGEgVk5DCi0JICAiVGVybWluYWwgU2VydmljZXMiIG1vZGUgKHVzZXMgeDExdm5jIG9uIHRoZSByZW1vdGUgc2lkZSkuCi0KLQotCSh0aGUgZm9sbG93aW5nIGZlYXR1cmVzIG9ubHkgYXBwbHkgdG8gdGhlIGJ1bmRsZWQgVW5peCB0aWdodHZuYyB2aWV3ZXIKLSAgICAgICAgaW5jbHVkaW5nIE1hY09TIFgpCi0KLQktIHJmYk5ld0ZCU2l6ZSBWTkMgc3VwcG9ydCAoc2NyZWVuIHJlc2l6aW5nKQotCi0JLSBDbGllbnQtc2lkZSBTY2FsaW5nIG9mIHRoZSBWaWV3ZXIuCi0KLQktIFpSTEUgVk5DIGVuY29kaW5nIHN1cHBvcnQgKFJlYWxWTkMncyBlbmNvZGluZykKLQotCS0gU3VwcG9ydCBmb3IgdGhlIFpZV1JMRSBlbmNvZGluZywgYSB3YXZlbGV0IGJhc2VkIGV4dGVuc2lvbiB0bwotCSAgWlJMRSB0byBpbXByb3ZlIGNvbXByZXNzaW9uIG9mIG1vdGlvbiB2aWRlbyBhbmQgcGhvdG8gcmVnaW9ucy4KLQotCS0gVHVyYm9WTkMgc3VwcG9ydCAoVmlydHVhbEdMJ3MgbW9kaWZpZWQgVGlnaHRWTkMgZW5jb2Rpbmc7Ci0JICByZXF1aXJlcyBUdXJib0pQRUcgbGlicmFyeSkKLQotICAgICAgICAtIFBpcGVsaW5lZCBVcGRhdGVzIG9mIHRoZSBmcmFtZWJ1ZmZlciBhcyBpbiBUdXJib1ZOQyAoYXNrcyBmb3IKLSAgICAgICAgICB0aGUgbmV4dCB1cGRhdGUgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBoYXMgZmluaXNoZWQgZG93bmxvYWRpbmc7Ci0gICAgICAgICAgdGhpcyBnaXZlcyBzb21lIHNwZWVkdXAgb24gaGlnaCBsYXRlbmN5IGNvbm5lY3Rpb25zLikKLQotCS0gQ3Vyc29yIGFscGhhYmxlbmRpbmcgd2l0aCB4MTF2bmMgYXQgMzJicHAgKC1hbHBoYSBvcHRpb24pCi0KLQktIE9wdGlvbiAiLXVuaXhwdyAuLi4iIGZvciB1c2Ugd2l0aCAieDExdm5jIC11bml4cHciIGxvZ2luIGRpYWxvZ3MuCi0KLQktIFN1cHBvcnQgZm9yIFVsdHJhVk5DIGV4dGVuc2lvbnM6IFNpbmdsZSBXaW5kb3csIERpc2FibGUKLQkgIFNlcnZlci1zaWRlIElucHV0LCAxL24gU2VydmVyIHNpZGUgc2NhbGluZywgVGV4dCBDaGF0IChzaGVsbAotCSAgdGVybWluYWwgVUkpLiBCb3RoIFVsdHJhVk5DIGFuZCB4MTF2bmMgc2VydmVycyBzdXBwb3J0IHRoZXNlCi0JICBleHRlbnNpb25zCi0KLQktIFVsdHJhVk5DIEZpbGUgVHJhbnNmZXIgdmlhIGFuIGF1eGlsaWFyeSBKYXZhIGhlbHBlciBwcm9ncmFtCi0JICAoamF2YSBtdXN0IGJlIGluICRQQVRIKS4gTm90ZSB0aGF0IHRoZSB4MTF2bmMgc2VydmVyIHN1cHBvcnRzCi0JICBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyLgotCi0JLSBDb25uZWN0aW9uIHN1cHBvcnQgZm9yIHRoZSBVbHRyYVZOQyByZXBlYXRlciBwcm94eSAoLXJlcGVhdGVyCi0JICBvcHRpb24pLgotCi0JLSBTdXBwb3J0IGZvciBVbHRyYVZOQyBTaW5nbGUgQ2xpY2sgb3BlcmF0aW9uLiAoYm90aCB1bmVuY3J5cHRlZDoKLQkgIFNDIEksIGFuZCBTU0wgZW5jcnlwdGVkOiBTQyBJSUkpCi0KLSAgICAgICAgLSBTdXBwb3J0IGZvciBVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW4gbW9kZS4gKEFSQzQgYW5kCi0gICAgICAgICAgQUVTVjIsIE1TUkM0LCBhbmQgU2VjdXJlVk5DKQotCi0gICAgICAgIC0gU3VwcG9ydCBmb3IgVWx0cmFWTkMgTVMtTG9nb24gYXV0aGVudGljYXRpb24gKE5PVEU6IHRoZQotICAgICAgICAgIFVsdHJhVk5DIE1TLUxvZ29uIGtleSBleGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHdlYWs7IGFuCi0gICAgICAgICAgZWF2ZXNkcm9wcGVyIG9uIHRoZSBuZXR3b3JrIGNhbiByZWNvdmVyIHlvdXIgV2luZG93cyBwYXNzd29yZAotICAgICAgICAgIGVhc2lseSBpbiBhIGZldyBzZWNvbmRzOyB5b3UgbmVlZCB0byB1c2UgYW4gYWRkaXRpb25hbCBlbmNyeXB0ZWQKLSAgICAgICAgICB0dW5uZWwgd2l0aCBNUy1Mb2dvbi4pCi0KLSAgICAgICAgLSBTdXBwb3J0IGZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbiAoaW5jbHVkaW5nIGJsb3dmaXNoIGFuZCAzZGVzCi0gICAgICAgICAgY2lwaGVycykgdG8gTm9uLVVsdHJhVk5DIFNlcnZlcnMuIEFueSBzZXJ2ZXIgdXNpbmcgdGhlIHNhbWUKLSAgICAgICAgICBlbmNyeXB0aW9uIG1ldGhvZCB3aWxsIHdvcmssIGUuZy46ICB4MTF2bmMgLWVuYyBibG93ZmlzaDouL215LmtleQotCi0JLSBJbnN0ZWFkIG9mIGhvc3RuYW1lOmRpc3BsYXkgb25lIGNhbiBhbHNvIHN1cHBseSAiZXhlYz1jb21tYW5kCi0JICBhcmdzLi4uIiB0byBjb25uZWN0IHRoZSB2aWV3ZXIgdG8gdGhlIHN0ZGlvIG9mIGFuIGV4dGVybmFsIGNvbW1hbmQKLQkgIChlLmcuIHN0dW5uZWwgb3Igc29jYXQpIHJhdGhlciB0aGFuIHVzaW5nIGEgVENQL0lQIHNvY2tldC4gVW5peAotCSAgZG9tYWluIHNvY2tldHMsIGUuZy4gL3BhdGgvdG8vdW5peC9zb2NrZXQsIGFuZCBhIHByZXZpb3VzbHkKLQkgIG9wZW5lZCBmaWxlIGRlc2NyaXB0b3IgZmQ9MCwgd29yayB0b28uCi0KLSAgICAgICAgLSBMb2NhbCBQb3J0IFByb3RlY3Rpb25zIGZvciBTVFVOTkVMIGFuZCBTU0g6IGF2b2lkIGhhdmluZyBmb3IKLSAgICAgICAgICBsb25nIHBlcmlvZHMgb2YgdGltZSBhIGxpc3RlbmluZyBwb3J0IG9uIHRoZSB0aGUgbG9jYWwgKFZOQwotICAgICAgICAgIHZpZXdlcikgc2lkZSB0aGF0IHJlZGlyZWN0cyB0byB0aGUgcmVtb3RlIHNpZGUuCi0KLQktIFJldmVyc2UgKHZpZXdlciBsaXN0ZW5pbmcpIFZOQyBjb25uZWN0aW9ucyBjYW4gc2hvdyBhCi0JICBQb3B1cCBkaWFsb2cgYXNraW5nIHdoZXRoZXIgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uIG9yIG5vdAotCSAgKC1hY2NlcHRwb3B1cC4pIFRoZSBleHRyYSBpbmZvIHByb3ZpZGVkIGJ5IFVsdHJhVk5DIFNpbmdsZSBDbGljawotCSAgcmV2ZXJzZSBjb25uZWN0aW9ucyBpcyBhbHNvIHN1cHBvcnRlZCAoLWFjY2VwdHBvcHVwc2MpCi0KLQktIEV4dHJlbWVseSBsb3cgY29sb3IgbW9kZXM6IDY0IGFuZCA4IGNvbG9ycyBpbiA4YnBwCi0JICAoLXVzZTY0Ly1iZ3IyMjIsIC11c2U4Ly1iZ3IxMTEpCi0KLQktIE1lZGl1bSBjb2xvciBtb2RlOiAxNmJwcCBtb2RlIGV2ZW4gZm9yIDMyYnBwIFZpZXdlciBkaXNwbGF5Ci0JICAoLTE2YnBwLy1iZ3I1NjUpCi0KLQktIHgxMXZuYydzIGNsaWVudC1zaWRlIGNhY2hpbmcgLW5jYWNoZSBtZXRob2QgY3JvcHBpbmcgb3B0aW9uCi0JICAoLXljcm9wIG4pLiBUaGlzIHdpbGwgImhpZGUiIHRoZSBsYXJnZSBwaXhlbCBidWZmZXIgY2FjaGUKLQkgIGJlbG93IHRoZSBhY3R1YWwgZGlzcGxheS4gU2V0IHRvIGFjdHVhbCBoZWlnaHQgb3IgdXNlIC0xIGZvcgotCSAgYXV0b2RldGVjdGlvbiAodGFsbCBzY3JlZW5zIGFyZSBhdXRvZGV0ZWN0ZWQgYnkgZGVmYXVsdCkuCi0KLSAgICAgICAgLSBFc2NhcGUgS2V5czogZW5hYmxlIGEgc2V0IG9mIG1vZGlmaWVyIGtleXMgc28gd2hlbiB0aGV5Ci0gICAgICAgICAgYXJlIGFsbCBwcmVzc2VkIGRvd24geW91IGNhbiBpbnZva2UgUG9wdXAgbWVudSBhY3Rpb25zIHZpYQotICAgICAgICAgIGtleXN0cm9rZXMuIEkuZS4sIGEgc2V0IG9mICdIb3QgS2V5cycuIE9uZSBjYW4gYWxzbyBwYW4gKG1vdmUpCi0gICAgICAgICAgdGhlIGRlc2t0b3AgaW5zaWRlIHRoZSB2aWV3cG9ydCB2aWEgQXJyb3cga2V5cyBvciBhIG1vdXNlIGRyYWcuCi0KLQktIFNjcm9sbGJhciB3aWR0aCBzZXR0aW5nOiAtc2J3aWR0aCBuLCB0aGUgZGVmYXVsdCBpcyB2ZXJ5IHRoaW4sCi0JICAyIHBpeGVscywgZm9yIGxlc3MgZGlzdHJhY3RpbmcgLXljcm9wIHVzYWdlLgotCi0JLSBTZWxlY3Rpb24gdGV4dCBzZW5kaW5nIGFuZCByZWNlaXZpbmcgY2FuIGJlIGZpbmUtdHVuZWQgd2l0aCB0aGUKLQkgIC1zZW5kY2xpcGJvYXJkLCAtc2VuZGFsd2F5cywgYW5kIC1yZWN2dGV4dCBvcHRpb25zLgotCi0JLSBUaWdodFZOQyBjb21wcmVzc2lvbiBhbmQgcXVhbGl0eSBsZXZlbHMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0Ci0JICBiYXNlZCBvbiBvYnNlcnZlZCBuZXR3b3JrIGxhdGVuY3kgKG4uYi4gbm90IGJhbmR3aWR0aC4pCi0KLQktIEltcHJvdmVtZW50cyB0byB0aGUgUG9wdXAgbWVudSwgYWxsIG9mIHRoZXNlIGNhbiBub3cgYmUgY2hhbmdlZAotCSAgZHluYW1pY2FsbHkgdmlhIHRoZSBtZW51OiBWaWV3T25seSwgVG9nZ2xlIEJlbGwsIEN1cnNvclNoYXBlCi0JICB1cGRhdGVzLCBYMTEgQ3Vyc29yLCBDdXJzb3IgQWxwaGFibGVuZGluZywgVG9nZ2xlIFRpZ2h0L1pSTEUsCi0JICBUb2dnbGUgSlBFRywgRnVsbENvbG9yLzE2YnBwLzhicHAgKDI1Ni82NC84IGNvbG9ycyksIEdyZXlzY2FsZQotCSAgZm9yIGxvdyBjb2xvciBtb2RlcywgU2NhbGluZyB0aGUgVmlld2VyIHJlc29sdXRpb24sIEVzY2FwZSBLZXlzLAotCSAgUGlwZWxpbmUgVXBkYXRlcywgYW5kIG90aGVycywgaW5jbHVkaW5nIFVsdHJhVk5DIGV4dGVuc2lvbnMuCi0KLQktIE1haW50YWlucyBpdHMgb3duIEJhY2tpbmdTdG9yZSBpZiB0aGUgWCBzZXJ2ZXIgZG9lcyBub3QKLQotCS0gVGhlIGRlZmF1bHQgZm9yIGxvY2FsaG9zdDowIGNvbm5lY3Rpb25zIGlzIG5vdCByYXcgZW5jb2RpbmcKLQkgIChsb2NhbCBtYWNoaW5lKS4gRGVmYXVsdCBhc3N1bWVzIHlvdSBhcmUgdXNpbmcgU1NIIHR1bm5lbC4gVXNlCi0JICAtcmF3bG9jYWwgdG8gcmV2ZXJ0LgotCi0JLSBYR3JhYlNlcnZlciBzdXBwb3J0IGZvciBmdWxsc2NyZWVuIG1vZGUsIGZvciBvbGQgd2luZG93IG1hbmFnZXJzCi0JICAoLWdyYWIvLWdyYWJhbGwgb3B0aW9uKS4KLQotCS0gRml4IGZvciBQb3B1cCBtZW51IHBvc2l0aW9uaW5nIGZvciBvbGQgd2luZG93IG1hbmFnZXJzCi0JICAoLXBvcHVwZml4IG9wdGlvbikuCi0KLQktIFJ1biB2bmN2aWV3ZXIgLWhlbHAgZm9yIGFsbCBvcHRpb25zLgotCi0KLQotVGhlIGxpc3Qgb2Ygc29mdHdhcmUgYnVuZGxlZCBpbiB0aGUgYXJjaGl2ZSBmaWxlczoKLQotICAgICAgICBUaWdodFZOQyBWaWV3ZXIgICAgICAgICAgICh3aW5kb3dzLCB1bml4LCBtYWNvc3gpCi0gICAgICAgIENoaWNrZW4gb2YgdGhlIFZOQyBWaWV3ZXIgKG1hY29zeCkKLSAgICAgICAgU3R1bm5lbCAgICAgICAgICAgICAgICAgICAod2luZG93cywgdW5peCwgbWFjb3N4KQotICAgICAgICBQdXR0eS9QbGluay9QYWdlYW50ICAgICAgICh3aW5kb3dzKQotICAgICAgICBPcGVuU1NMICAgICAgICAgICAgICAgICAgICh3aW5kb3dzKQotICAgICAgICBlc291bmQgICAgICAgICAgICAgICAgICAgICh3aW5kb3dzKQotCi1UaGVzZSBhcmUgYWxsIHNlbGYtY29udGFpbmVkIGluIHRoZSBidW5kbGUgZGlyZWN0b3J5OiB0aGV5IHdpbGwgbm90IGJlCi1pbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uICBKdXN0IHVuLXppcCBvciB1bi10YXIgdGhlIGZpbGUgeW91IGRvd25sb2FkZWQKLWFuZCBydW4gaXQgc3RyYWlnaHQgZnJvbSBpdHMgZGlyZWN0b3J5LgotCi0KLVF1aWNrIFN0YXJ0OgotLS0tLS0tLS0tLS0KLQotVW5peCBhbmQgTWFjIE9TIFg6Ci0KLSAgICBJbnNpZGUgYSBUZXJtaW5hbCBkbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLgotCi0gICAgVW5wYWNrIHRoZSBhcmNoaXZlOgotCi0gICAgICAgICUgZ3ppcCAtZGMgc3N2bmMtMS4wLjI4LnRhci5neiB8IHRhciB4dmYgLQotCi0gICAgUnVuIHRoZSBHVUk6Ci0KLSAgICAgICAgJSAuL3Nzdm5jL1VuaXgvc3N2bmMgICAgICAgICAgICAgICAoZm9yIFVuaXgpCi0KLSAgICAgICAgJSAuL3Nzdm5jL01hY09TWC9zc3ZuYyAgICAgICAgICAgICAoZm9yIE1hYyBPUyBYKQotCi0gICAgVGhlIHNtYWxsZXIgZmlsZSAic3N2bmNfbm9fd2luZG93cy0xLjAuMjgudGFyLmd6IgotICAgIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGFzIHdlbGwuCi0KLSAgICBPbiBNYWNPU1ggeW91IGNvdWxkIGFsc28gY2xpY2sgb24gdGhlIFNTVk5DIGFwcCBpY29uIGluIHRoZSBGaW5kZXIuCi0KLSAgICBPbiBNYWNPU1ggaWYgeW91IGRvbid0IGxpa2UgdGhlIENoaWNrZW4gb2YgdGhlIFZOQyAoZS5nLiBubyBsb2NhbAotICAgIGN1cnNvcnMsIG5vIHNjcmVlbiBzaXplIHJlc2NhbGluZywgYW5kIG5vIHBhc3N3b3JkIHByb21wdGluZyksIGFuZCB5b3UKLSAgICBoYXZlIHRoZSBYRGFyd2luIFggc2VydmVyIGluc3RhbGxlZCwgeW91IGNhbiBzZXQgRElTUExBWSBiZWZvcmUgc3RhcnRpbmcKLSAgICBzc3ZuYyAob3IgdHlwZSBESVNQTEFZPS4uLiBpbiBIb3N0OkRpc3AgYW5kIGhpdCBSZXR1cm4pLiAgVGhlbiBvdXIKLSAgICBlbmhhbmNlZCBUaWdodFZOQyB2aWV3ZXIgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgQ09UVk5DLgotICAgIFVwZGF0ZTogdGhlcmUgaXMgbm93IGEgJ1VzZSBYMTEgdm5jdmlld2VyIG9uIE1hY09TWCcgdW5kZXIgT3B0aW9ucyAuLi4KLQotCi0gICAgSWYgeW91IHdhbnQgYSBTU0gtb25seSB0b29sICh3aXRob3V0IHRoZSBkaXN0cmFjdGlvbnMgb2YgU1NMKSBydW4KLSAgICB0aGUgY29tbWFuZDoKLQotICAgICAgICAgICAgICAgIHNzaHZuYwotCi0gICAgaW5zdGVhZCBvZiAic3N2bmMiLiAgT3IgY2xpY2sgIlNTSC1Pbmx5IE1vZGUiIHVuZGVyIE9wdGlvbnMuCi0gICAgQ29udHJvbC1oIHdpbGwgdG9nZ2xlIGJldHdlZW4gdGhlIHR3byBtb2Rlcy4KLQotCQkKLSAgICBJZiB5b3Ugd2FudCBhIHNpbXBsZSBWTkMgVGVybWluYWwgU2VydmljZXMgb25seSBtb2RlIChyZXF1aXJlcyB4MTF2bmMKLSAgICBvbiB0aGUgcmVtb3RlIHNlcnZlcikgcnVuIHRoZSBjb21tYW5kOgotCi0gICAgICAgICAgICAgICAgdHN2bmMKLQotICAgIGluc3RlYWQgb2YgInNzdm5jIi4gIE9yIGNsaWNrICJUZXJtaW5hbCBTZXJ2aWNlcyIgdW5kZXIgT3B0aW9ucy4KLSAgICBDb250cm9sLXQgd2lsbCB0b2dnbGUgYmV0d2VlbiB0aGUgdHdvIG1vZGVzLgotCi0gICAgInRzdm5jIHByb2ZpbGUtbmFtZSIgYW5kICJ0c3ZuYyB1c2VyQGhvc3RuYW1lIiB3b3JrIHRvby4KLQotCi1Vbml4L01hY09TWCBJbnN0YWxsOgotCi0gICAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgaW5zdGFsbCBmb3IgdGhlIGJ1bmRsZXMsIGJ1dCB5b3UgY2FuIG1ha2UKLSAgICBzeW1saW5rcyBsaWtlIHNvOgotCi0JY2QgL2EvZGlyZWN0b3J5L2luL1BBVEgKLQlsbiAtcyAvcGF0aC90by9zc3ZuYy9iaW4ve3MsdH0qIC4KLQotICAgIE9yIHB1dCAvcGF0aC90by9zc3ZuYy9iaW4sIC9wYXRoL3RvL3Nzdm5jL1VuaXgsIG9yIC9wYXRoL3RvL3Nzdm5jL01hY09TWAotICAgIGluIHlvdXIgUEFUSC4KLQotICAgIEZvciB0aGUgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsIGl0IHdpbGwgY29tcGlsZSBhbmQgaW5zdGFsbCwgZS5nLjoKLQotICAgICAgIGd6aXAgLWRjIHNzdm5jLTEuMC4yOC5zcmMudGFyLmd6IHwgdGFyIHh2ZiAtCi0gICAgICAgY2Qgc3N2bmMtMS4wLjI4Ci0gICAgICAgbWFrZSBjb25maWcKLSAgICAgICBtYWtlIGFsbAotICAgICAgIG1ha2UgUFJFRklYPS9teS9pbnN0YWxsL2RpciBpbnN0YWxsCi0KLSAgICB0aGVuIGhhdmUgL215L2luc3RhbGwvZGlyL2JpbiBpbiB5b3VyIFBBVEguCi0KLQotV2luZG93czoKLQotICAgIFVuemlwLCB1c2luZyBXaW5aaXAgb3IgYSBzaW1pbGFyIHV0aWxpdHksIHRoZSB6aXAgZmlsZToKLQotICAgICAgICBzc3ZuYy0xLjAuMjguemlwCi0KLSAgICBSdW4gdGhlIEdVSSwgZS5nLjoKLQotCVN0YXJ0IC0+IFJ1biAtPiBCcm93c2UKLQotICAgIGFuZCB0aGVuIG5hdmlnYXRlIHRvCi0KLSAgICAgICAgLi4uL3Nzdm5jL1dpbmRvd3Mvc3N2bmMuZXhlCi0KLSAgICBzZWxlY3QgT3BlbiwgYW5kIHRoZW4gT0sgdG8gbGF1bmNoIGl0LgotCi0gICAgVGhlIHNtYWxsZXIgZmlsZSAic3N2bmNfd2luZG93c19vbmx5LTEuMC4yOC56aXAiCi0gICAgY291bGQgaGF2ZSBiZWVuIHVzZWQgYXMgd2VsbC4KLQotICAgIFlvdSBjYW4gbWFrZSBhIFdpbmRvd3Mgc2hvcnRjdXQgdG8gdGhpcyBwcm9ncmFtIGlmIHlvdSB3YW50IHRvLgotCi0gICAgU2VlIHRoZSBXaW5kb3dzL1JFQURNRS50eHQgZm9yIG1vcmUgaW5mby4KLQotCi0gICAgSWYgeW91IHdhbnQgYSBTU0gtb25seSB0b29sICh3aXRob3V0IHRoZSBkaXN0cmFjdGlvbnMgb2YgU1NMKSBydW4KLSAgICB0aGUgY29tbWFuZDoKLQotICAgICAgICAgICAgICAgIHNzaHZuYy5iYXQKLQotICAgIE9yIGNsaWNrICJTU0gtT25seSBNb2RlIiB1bmRlciBPcHRpb25zLgotCi0KLSAgICBJZiB5b3Ugd2FudCBhIHNpbXBsZSBWTkMgVGVybWluYWwgU2VydmljZXMgb25seSBtb2RlIChyZXF1aXJlcyB4MTF2bmMKLSAgICBvbiB0aGUgcmVtb3RlIHNlcnZlcikgcnVuIHRoZSBjb21tYW5kOgotCi0gICAgICAgICAgICAgICAgdHN2bmMuYmF0Ci0KLSAgICBPciBjbGljayAiVGVybWluYWwgU2VydmljZXMiIHVuZGVyIE9wdGlvbnMuICBDb250cm9sLXQgd2lsbCB0b2dnbGUKLSAgICBiZXR3ZWVuIHRoZSB0d28gbW9kZXMuICAidHN2bmMgcHJvZmlsZS1uYW1lIiBhbmQgInRzdm5jIHVzZXJAaG9zdG5hbWUiCi0gICAgd29yayB0b28uCi0KLQotCi1JbXBvcnRhbnQgTm90ZSBmb3IgV2luZG93cyBWaXN0YTogT25lIHVzZXIgcmVwb3J0cyB0aGF0IG9uIFdpbmRvd3MgVmlzdGEKLWlmIHlvdSBtb3ZlIG9yIGV4dHJhY3QgdGhlICJzc3ZuYyIgZm9sZGVyIGRvd24gdG8gdGhlICJQcm9ncmFtIEZpbGVzIgotZm9sZGVyIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGRvIHRoaXMgYXMgdGhlIEFkbWluaXN0cmF0b3IuIEJ1dCB0aGVuCi13aGVuIHlvdSBzdGFydCB1cCBzc3ZuYywgYXMgYSByZWd1bGFyIHVzZXIsIGl0IGNhbm5vdCBjcmVhdGUgZmlsZXMgaW4KLXRoYXQgZm9sZGVyIGFuZCBzbyBpdCBmYWlscyB0byBydW4gcHJvcGVybHkuIFdlIHJlY29tbWVuZCB0byBub3QgY29weQotb3IgZXh0cmFjdCB0aGUgInNzdm5jIiBmb2xkZXIgaW50byAiUHJvZ3JhbSBGaWxlcyIuIFJhdGhlciwgZXh0cmFjdAotaXQgdG8gc29tZXdoZXJlIHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb24gKGUuZy4gQzpcIG9yIHlvdXIgVXNlciBkaXIpCi1hbmQgY3JlYXRlIGEgU2hvcnRjdXQgdG8gc3N2bmMuZXhlIG9uIHRoZSBkZXNrdG9wLgotCi1JZiB5b3UgbXVzdCBwdXQgYSBsYXVuY2hlciBmaWxlIGRvd24gaW4gIlByb2dyYW0gRmlsZXMiLCBwZXJoYXBzIGFuCi0ic3N2bmMuYmF0IiB0aGF0IGxvb2tzIGxpa2UgdGhpczoKLQotQzoKLWNkIFxzc3ZuY1xXaW5kb3dzCi1zc3ZuYy5leGUKLQotCi1TU0gtT05MWSBNb2RlOgotLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGRvbid0IGNhcmUgZm9yIFNTTCBhbmQgdGhlIGRpc3RyYWN0aW9ucyBpdCBwcm92aWRlcyBpbiB0aGUgR1VJLAotcnVuICJzc2h2bmMiICh1bml4L21hY29zeCkgb3IgInNzaHZuYy5iYXQiICh3aW5kb3dzKSB0byBydW4gYW4gU1NIIG9ubHkKLXZlcnNpb24gb2YgdGhlIEdVSS4KLQotVGVybWluYWwgU2VydmljZXMgTW9kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGVyZSBpcyBhbiBldmVuIHNpbXBsZXIgbW9kZSB0aGF0IHVzZXMgeDExdm5jIG9uIHRoZSByZW1vdGUgc2lkZSBmb3IgdGhlCi1zZXNzaW9uIGZpbmRpbmcgYW5kIG1hbmFnZW1lbnQuICBSdW4gInRzdm5jIiAodW5peC9tYWNvc3gpIG9yICJ0c3ZuYy5iYXQiCi0od2luZG93cykgdG8gcnVuIHRoZSBUZXJtaW5hbCBTZXJ2aWNlcyB2ZXJzaW9uIG9mIHRoZSBHVUkuCi0KLQotQnVuZGxlIEluZm86Ci0tLS0tLS0tLS0tLS0KLQotVGhlIGJ1bmRsZSBmaWxlcyB1bnBhY2sgYSBkaXJlY3RvcnkvZm9sZGVyIG5hbWVkOiBzc3ZuYwotCi1JdCBjb250YWlucyB0aGVzZSBwcm9ncmFtcyB0byBsYXVuY2ggdGhlIEdVSToKLQotICAgICAgICBXaW5kb3dzL3Nzdm5jLmV4ZSAgICAgICAgZm9yIFdpbmRvd3MKLSAgICAgICAgTWFjT1NYL3Nzdm5jICAgICAgICAgICAgIGZvciBNYWMgT1MgWAotICAgICAgICBVbml4L3Nzdm5jICAgICAgICAgICAgICAgZm9yIFVuaXgKLQotKHRoZSBNYWMgT1MgWCBhbmQgVW5peCBsYXVuY2hlcnMgYXJlIHNpbXBseSBsaW5rcyB0byB0aGUgYmluIGRpcmVjdG9yeSkuCi0KLQotWW91ciBidW5kbGUgZmlsZSBzaG91bGQgaGF2ZSBpbmNsdWRlZCBiaW5hcmllcyBmb3IgbWFueSBPUydzOiBMaW51eCwKLVNvbGFyaXMsIEZyZWVCU0QsIGV0Yy4gIFVucGFjayB5b3VyIGFyY2hpdmUgYW5kIHNlZSB0aGUgc3ViZGlyZWN0b3JpZXMgb2YKLQotCS4vYmluCi0KLWZvciB0aGUgb25lcyB0aGF0IHdlcmUgc2hpcHBlZCBpbiB0aGlzIHByb2plY3QsIGUuZy4gLi9iaW4vTGludXguaTY4NgotUnVuICJ1bmFtZSAtc20iIHRvIHNlZSB5b3VyIE9TK2FyY2ggY29tYmluYXRpb24gKG4uYi4gYWxsIExpbnV4IHg4NiBhcmUKLW1hcHBlZCB0byBMaW51eC5pNjg2KS4gICAoU2VlIHRoZSAuL2Jpbi9zc3ZuY19jbWQgLWggb3V0cHV0IGZvciBob3cgdG8KLW92ZXJyaWRlIHBsYXRmb3JtIGF1dG9kZWN0aW9uIHZpYSB0aGUgVU5BTUUgZW52LiB2YXIpLgotCi0KLU1lbW9yeSBTdGljayBVc2FnZToKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGNyZWF0ZSBhIGRpcmVjdG9yeSBuYW1lZCAiSG9tZSIgaW4gdGhhdCB0b3BsZXZlbCBzc3ZuYyBkaXJlY3RvcnkKLXRoZW4gdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIHN0b3JpbmcgVk5DIHByb2ZpbGVzIGFuZAotY2VydGlmaWNhdGVzLiAgQWxzbywgZm9yIGNvbnZlbmllbmNlLCBpZiB5b3UgZmlyc3QgcnVuIHRoZSBjb21tYW5kIHdpdGgKLSIuIiBhcyBhbiBhcmd1bWVudCAoZS5nLiAic3N2bmMgLiIpIGl0IHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgdGhhdAotIkhvbWUiIGRpcmVjdG9yeSBmb3IgeW91LiAgVGhpcyBpcyBoYW5keSBpZiB5b3Ugd2FudCB0byBwbGFjZSBTU1ZOQwotb24gYSBVU0IgZmxhc2ggZHJpdmUgdGhhdCB5b3UgY2FycnkgYXJvdW5kIGZvciBtb2JpbGUgdXNlIGFuZCB5b3Ugd2FudAotdGhlIHByb2ZpbGVzIHlvdSBjcmVhdGUgdG8gc3RheSB3aXRoIHRoZSBkcml2ZSAob3RoZXJ3aXNlIHlvdSdkIGhhdmUgdG8KLWJyb3dzZSB0byB0aGUgZHJpdmUgZGlyZWN0b3J5IGVhY2ggdGltZSB5b3UgbG9hZCBvciBzYXZlKS4KLQotT25lIHVzZXIgb24gV2luZG93cyBjcmVhdGVkIGEgQkFUIGZpbGUgdG8gbGF1bmNoIFNTVk5DIGFuZCBuZWVkZWQgdG8KLWRvIHRoaXMgdG8gZ2V0IHRoZSBIb21lIGRpcmVjdG9yeSBjb3JyZWN0OgotCi1jZCBcc3N2bmNcV2luZG93cwotc3RhcnQgXHNzdm5jXFdpbmRvd3Ncc3N2bmMuZXhlCi0KLShhbiBvcHRpb25hbCBwcm9maWxlIG5hbWUgY2FuIGJlIHN1cHBsaWVkIHRvIHRoZSBzc3ZuYy5leGUgbGluZSkKLQotV0FSTklORzogaWYgeW91IHVzZSBzc3ZuYyBmcm9tIGFuICJJbnRlcm5ldCBDYWZlIiwgaS5lLiAgYW4gdW50cnVzdGVkCi1jb21wdXRlciwgYW4gaW50cnVkZXIgbWF5IGJlIGNhcHR1cmluZyBrZXlzdHJva2VzIGV0Yy4KLQotCi1FeHRlcm5hbCBEZXBlbmRlbmNpZXM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU9uIFdpbmRvd3MgZXZlcnl0aGluZyBpcyBpbmNsdWRlZC4gIExldCB1cyBrbm93IGlmIHlvdSBmaW5kIG90aGVyd2lzZS4KLQotT24gVW5peCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgZG8geW91IG5lZWQgdGhlc2UgcHJvZ3JhbXMgaW5zdGFsbGVkOgotCQotCS0gYmFzaWMgdW5peCB1dGlsaXRpZXMgKHNoLCBscywgY2F0LCBhd2ssIHNlZCwgZXRjLi4pCi0JLSB0Y2wvdGsgKHdpc2ggaW50ZXJwcmV0ZXIpCi0JLSB4dGVybQotCS0gcGVybAotCS0gc3NoCi0JLSBvcGVuc3NsCi0KLSAgICBMZXNzZXIgdXNlZCBvbmVzOiBuZXRjYXQsIGVzZC9hcnRzZCwgc21iY2xpZW50LCBzbWJtb3VudCwgY3VwcwotCQotT24gTWFjIE9TIFggZGVwZW5kaW5nIG9uIHdoYXQgeW91IGRvIHlvdSBuZWVkIHRoZXNlIHByb2dyYW1zIGluc3RhbGxlZDoKLQkKLQktIGJhc2ljIHVuaXggdXRpbGl0aWVzIChzaCwgbHMsIGNhdCwgYXdrLCBzZWQsIGV0Yy4uKQotCS0gdGNsL3RrICh3aXNoIGludGVycHJldGVyKQotCS0gVGVybWluYWwKLQktIHBlcmwKLQktIHNzaAotCS0gb3BlbnNzbAotCi0gICAgTGVzc2VyIHVzZWQgb25lczogbmV0Y2F0LCBzbWJjbGllbnQsIGN1cHMKLQotTW9zdCBNYWMgT1MgWCBhbmQgVW5peCBPUyBjb21lIHdpdGggdGhlIG1haW4gY29tcG9uZW50cyBpbnN0YWxsZWQuIAotCQotU2VlIHRoZSBSRUFETUUuc3JjIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZGVwZW5kZW5jaWVzLgotCi0KLVR1cmJvVk5DIFN1cHBvcnQ6Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLVR1cmJvVk5DIGlzIHN1cHBvcnRlZCBpbiBhbiBleHBlcmltZW50YWwgd2F5LiAgVG8gaXQgYnVpbGQgdmlhIHRoZQotYnVpbGQudW5peCBzY3JpcHQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIGRvIHNvbWV0aGluZyBsaWtlOgotCi0JZW52IFRVUkJPVk5DPSctTC9ESVIgLVhsaW5rZXIgLS1ycGF0aD0vRElSIC1sdHVyYm9qcGVnJyAuL2J1aWxkLnVuaXgKLQotd2hlcmUgeW91IHJlcGxhY2UgL0RJUiB3aXRoIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYnR1cmJvanBlZy5zbwotKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTExNzUwOSZwYWNrYWdlX2lkPTE2NjEwMCkKLWlzIGluc3RhbGxlZC4KLQotWW91IG1heSBub3QgbmVlZCB0byBzZXQgcnBhdGggaWYgbGlidHVyYm9qcGVnLnNvIGlzIGluc3RhbGxlZCBpbiBhCi1zdGFuZGFyZCBsb2NhdGlvbiBvciB5b3UgdXNlIExEX0xJQlJBUllfUEFUSCB0byBwb2ludCB0byBpdC4KLQotU2VlIHRoZSB0dXJib3ZuYy9SRUFETUUgaW4gdGhlIHZuY191bml4c3JjL3ZuY3ZpZXdlciBkaXJlY3RvcnkgZm9yCi1tb3JlIGluZm8uICBZb3UgY2FuIGZpbmQgaXQgaW4gdGhlIHNzdm5jIHNvdXJjZSB0YXJiYWxsIGFuZCBhbHNvCi1pbjoKLQotCXNyYy96aXBzL3ZuY191bml4c3JjX3ZuY3ZpZXdlci5wYXRjaGVkLnRhcgotCi1Nb3JlIFR1cmJvVk5DIGZlYXR1cmVzIHdpbGwgYmUgZW5hYmxlZCBpbiB0aGUgZnV0dXJlLgotCi0KLUlmIHlvdSBuZWVkIHRvIEJ1aWxkOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91ciBPUy9hcmNoIGlzIG5vdCBpbmNsdWRlZCBvciB0aGUgcHJvdmlkZWQgYmluYXJ5IGhhcyB0aGUgd3JvbmcKLWxpYnJhcnkgZGVwZW5kZW5jaWVzLCBldGMuIHRoZSBzY3JpcHQgImJ1aWxkLnVuaXgiIG1heSBiZSBhYmxlIHRvCi1zdWNjZXNzZnVsbHkgYnVpbGQgb24gZm9yIHlvdSBhbmQgZGVwb3NpdCB0aGUgYmluYXJpZXMgZG93biBpbiAuL2Jpbi8uLi4KLXVzaW5nIHRoZSBpbmNsdWRlZCBzb3VyY2UgY29kZS4gIEl0IGlzIGEgaGFjayBidXQgdXN1YWxseSB3b3Jrcy4KLQotWW91IE1VU1QgcnVuIHRoZSBidWlsZC51bml4IHNjcmlwdCBmcm9tIHRoaXMgZGlyZWN0b3J5ICh0aGF0IHRoaXMgdG9wbGV2ZWwKLVJFQURNRSBpcyBpbiwgaS5lICJzc3ZuYyIpIGFuZCBsaWtlIHRoaXM6Ci0KLQkuL2J1aWxkLnVuaXgKLQotVG8gdXNlIGN1c3RvbSBsb2NhdGlvbnMgZm9yIGxpYnJhcmllcyBzZWUgdGhlIExERkxBR1NfT1MgYW5kIENQUEZMQUdTX09TCi1kZXNjcmlwdGlvbiBhdCB0aGUgdG9wIG9mIHRoZSBidWlsZC51bml4IHNjcmlwdC4KLQotWW91IGNhbiBzZXQgdGhlc2UgZW52LiB2YXJzIHRvIGN1c3RvbWl6ZSB0aGUgYnVpbGQ6Ci0KLQlTU1ZOQ19CVUlMRF9OT19TVEFUSUM9MSAgICAgICAgZG8gbm90IHRyeSB0byBzdGF0aWNhbGx5IGxpbmsgbGlicwotCVNTVk5DX0JVSUxEX0ZPUkNFX09WRVJXUklURT0xICBkbyBub3QgcHJvbXB0IGFib3V0IGV4aXN0aW5nIGJpbmFyaWVzCi0JU1NWTkNfQlVJTERfU0tJUF9WSUVXRVI9MSAgICAgIGRvIG5vdCBidWlsZCB2bmN2aWV3ZXIKLQlTU1ZOQ19CVUlMRF9TS0lQX1NUVU5ORUw9MSAgICAgZG8gbm90IGJ1aWxkIHN0dW5uZWwKLQlTU1ZOQ19CVUlMRF9VTFRSQUZUUD0xICAgICAgICAgb25seSBidWlsZCB0aGUgZmlsZSB4ZmVyIGhlbHBlciBqYXIKLQotaGVyZSBpcyBhbiBleGFtcGxlIHRvIGJ1aWxkIG9ubHkgdGhlIHZuY3ZpZXdlciBhbmQgd2l0aCBub3JtYWwgbGlicmFyeQotbGlua2luZyAoYW5kIGluIGEgbW9yZSBvciBsZXNzIGF1dG9tYXRlZCB3YXkpOgotCi0gZW52IFNTVk5DX0JVSUxEX05PX1NUQVRJQz0xIFNTVk5DX0JVSUxEX0ZPUkNFX09WRVJXUklURT0xIFNTVk5DX0JVSUxEX1NLSVBfU1RVTk5FTD0xIC4vYnVpbGQudW5peAotCi1GZWVsIGZyZWUgdG8gYXNrIHVzIGlmIHlvdSBuZWVkIGhlbHAgcnVubmluZyAuL2J1aWxkLnVuaXgKLQotCi1Db252ZW50aWFsIEJ1aWxkOgotCi1BIG1vcmUgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsIGlzIHByb3ZpZGVkIGluIHNzdm5jLXgueS56LnNyYy50YXIuZ3ouCi1JdCB1c2VzIGEgbW9yZSBvciBsZXNzIGZhbWlsaWFyICdtYWtlIGNvbmZpZzsgbWFrZSBhbGw7IG1ha2UgUFJFRklYPXBhdGggaW5zdGFsbCcKLW1ldGhvZC4gIEl0IGRvZXMgbm90IGluY2x1ZGUgc3R1bm5lbCwgc28gdGhhdCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUKLXN5c3RlbSBzZXBhcmF0ZWx5LgotCi0KLVRoZSBwcm9ncmFtczoKLS0tLS0tLS0tLS0tLQotCi1VbnBhY2sgeW91ciBhcmNoaXZlLCBhbmQgeW91IHdpbGwgc2VlICJiaW4iLCAiV2luZG93cyIsICJzcmMiIGRpcmVjdG9yaWVzCi1hbmQgb3RoZXIgZmlsZXMuICBUaGUgY29tbWFuZCBsaW5lIHdyYXBwZXIgc2NyaXB0czogCi0KLQkuL2Jpbi9zc3ZuY19jbWQKLQkuL2Jpbi90aWdodHZuY3ZpZXdlcgotCi1hcmUgdGhlIG1haW4gcHJvZ3JhbXMgdGhhdCBhcmUgcnVuIGFuZCB3aWxsIHRyeSB0byBhdXRvZGV0ZWN0IHlvdXIgT1MrYXJjaAotY29tYmluYXRpb24gYW5kIGlmIGJpbmFyaWVzIGFyZSBwcmVzZW50IGZvciBpdCBhdXRvbWF0aWNhbGx5IHVzZSB0aGVtLgotKGlmIG5vdCBmb3VuZCB0cnkgdGhlIHJ1bm5pbmcgdGhlIGJ1aWxkLnVuaXggc2NyaXB0KS4KLQotSWYgeW91IHByZWZlciBhIEdVSSB0byBwcm9tcHQgZm9yIHBhcmFtZXRlcnMgYW5kIHRoZW4gc3RhcnQgc3N2bmNfY21kCi15b3UgY2FuIHJ1biB0aGlzIGluc3RlYWQ6Ci0KLQkuL2Jpbi9zc3ZuYyAgICAgICAKLQotdGhpcyBpcyB0aGUgc2FtZSBHVUkgdGhhdCBpcyBydW4gb24gV2luZG93cyAodGhlIHNzdm5jLmV4ZSkuCi1UaGVyZSBhcmUgYWxzbzoKLQotCS4vYmluL3NzaHZuYwkoU1NILU9ubHkpCi0JLi9iaW4vdHN2bmMJKFRlcm1pbmFsIFNlcnZpY2VzIE1vZGUpCi0KLUZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBtYWtlIHN5bWxpbmtzIGZyb20gYSBkaXJlY3RvcnkgaW4geW91ciBQQVRIIHRvCi1hbnkgb2YgdGhlIDMgcHJvZ3JhbXMgYWJvdmUgeW91IHdpc2ggdG8gcnVuLiAgVGhhdCBpcyBhbGwgeW91IHVzdWFsbHkKLW5lZWQgdG8gZG8gZm9yIGl0IHRvIHBpY2sgdXAgYWxsIG9mIHRoZSBiaW5hcmllcywgdXRpbHMsIGV0Yy4gRS5nLgotYXNzdW1pbmcgJEhPTUUvYmluIGlzIGluIHlvdXIgJFBBVEg6Ci0KLQljZCAkSE9NRS9iaW4KLQlsbiAtcyAvcGF0aC90by9zc3ZuYy9iaW4ve3MsdH0qIC4KLQotKG5vdGUgdGhlICIuIiBhdCB0aGUgZW5kKS4gVGhlIGFib3ZlIGNvbW1hbmRzIGlzIGJhc2ljYWxseSB0aGUgd2F5IHRvCi0iaW5zdGFsbCIgdGhpcyBvbiBVbml4IG9yIE1hY09TIFguCi0KLUFsc28gbGlua3MgdG8gdGhlIEdVSSBsYXVuY2hlciBzY3JpcHQgYXJlIHByb3ZpZGVkIGluOgotCi0JTWFjT1NYL3Nzdm5jCi0JVW5peC9zc3ZuYwotCi1hbmQgc3Nodm5jIGFuZCB0c3ZuYy4gIFlvdSBjb3VsZCBhbHNvIHB1dCB0aGUgVW5peCBvciBNYWNPU1ggZGlyZWN0b3J5Ci1pbiB5b3VyIFBBVEguCi0KLQotT24gV2luZG93cyB1bnBhY2sgeW91ciBhcmNoaXZlIGFuZCBydW46Ci0KLQlXaW5kb3dzL3Nzdm5jLmV4ZQotCi0KLUV4YW1wbGVzOgotLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBhc3N1bWUgeW91IGFyZSBpbiB0aGUgdG9wbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZQotYXJjaGl2ZSB5b3UgdW5wYWNrZWQuCi0KLVVzZSBlbmhhbmNlZCBUaWdodFZOQyB1bml4IHZpZXdlciB0byBjb25uZWN0IHRvIHgxMXZuYyB2aWEgU1NMOgotCi0JLi9iaW4vc3N2bmNfY21kICAgZmFyLWF3YXkuZWFzdDowCi0KLQkuL2Jpbi90aWdodHZuY3ZpZXdlciAtc3NsICBmYXItYXdheS5lYXN0OjAgICAoc2FtZSkKLQotCS4vYmluL3Nzdm5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFydCBHVUkgbGF1bmNoZXIpCi0KLVVzZSBlbmhhbmNlZCBUaWdodFZOQyB1bml4IHZpZXdlciB3aXRob3V0IFNTTDoKLQotCS4vYmluL3RpZ2h0dm5jdmlld2VyIGZhci1hd2F5LmVhc3Q6MAotCi1Vc2UgU1NMIHRvIGNvbm5lY3QgdG8gYSB4MTF2bmMgc2VydmVyLCBhbmQgYWxzbyB2ZXJpZnkgdGhlIHNlcnZlcidzCi1pZGVudGl0eSB1c2luZyB0aGUgU1NMIENlcnRpZmljYXRlIGluIHRoZSBmaWxlIC4veDExdm5jLnBlbToKLQotCS4vYmluL3Nzdm5jX2NtZCAtYWxwaGEgLXZlcmlmeSAuL3gxMXZuYy5wZW0gZmFyLWF3YXkuZWFzdDowCi0KLShhbHNvIHR1cm5zIG9uIHRoZSB2aWV3ZXItc2lkZSBjdXJzb3IgYWxwaGFibGVuZGluZyBoYWNrKS4gCi0KLQotQnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHN1YmRpcmVjdG9yaWVzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkuL2Jpbi91dGlsCQlzb21lIHV0aWxpdHkgc2NyaXB0cywgZS5nLiBzc192bmN2aWV3ZXIKLQkJCQlhbmQgc3N2bmMudGNsCi0KLQkuL3NyYwkJCXNvdXJjZSBjb2RlIGFuZCBwYXRjaGVzLgotCS4vc3JjL3ppcHMJCXppcCBmaWxlcyBvZiBzb3VyY2UgY29kZSBhbmQgYmluYXJpZXMuCi0KLQkuL3NyYy92bmNfdW5peHNyYwl1bnBhY2tlZCB0aWdodHZuYyBzb3VyY2UgY29kZSB0cmVlLgotCS4vc3JjL3N0dW5uZWwtNC4xNAl1bnBhY2tlZCBzdHVubmVsIHNvdXJjZSBjb2RlIHRyZWUuCi0JLi9zcmMvcGF0Y2hlcwkJcGF0Y2hlcyB0byBUaWdodFZOQyB2aWV3ZXIgZm9yIHRoZSBuZXcKLQkJCQlmZWF0dXJlcyBvbiBVbml4ICh1c2VkIGJ5IGJ1aWxkLnVuaXgpLgotCS4vc3JjL3RtcAkJdGVtcG9yYXJ5IGJ1aWxkIGRpciBmb3IgYnVpbGQudW5peAotCQkJCSh0aGUgbGFzdCBmb3VyIGFyZSB1c2VkIGJ5IGJ1aWxkLnVuaXgpCi0KLQotCS4vbWFuCQkJbWFuIHBhZ2VzIGZvciBUaWdodFZOQyB2aWV3ZXIgYW5kIHN0dW5uZWwuCi0KLQkuL1dpbmRvd3MJCVN0b2NrIFRpZ2h0Vk5DIHZpZXdlciBhbmQgU3R1bm5lbCwgT3BlbnNzbAotCQkJCWV0YyBXaW5kb3dzIGJpbmFyaWVzLiBzc3ZuYy5leGUgaXMgdGhlCi0JCQkJcHJvZ3JhbSB0byBydW4uCi0KLQkuL01hY09TWAkJY29udGFpbnMgYW4gdW5wYWNrZWQgQ2hpY2tlbiBvZiB0aGUgVk5DCi0JCQkJdmlld2VyIGFuZCBhIHN5bWxpbmsgdG8gc3N2bmMuCi0KLQkuL1VuaXgJCQljb250YWlucyBhIHN5bWxpbmsgdG8gc3N2bmMuCi0KLURlcGVuZGluZyBvbiB3aGljaCBidW5kbGUgeW91IHVzZSBub3QgYWxsIG9mIHRoZSBhYm92ZSBtYXkgYmUgcHJlc2VudC4KLVRoZSBzbWFsbGVzdCBidW5kbGVzIHdpdGggYmluYXJpZXMgYXJlOgotCi0Jc3N2bmNfd2luZG93c19vbmx5LTEueC55LnppcCAgIFdpbmRvd3MKLQlzc3ZuY19ub193aW5kb3dzLTEueC55LnRhci5neiAgVW5peCBhbmQgTWFjT1NYCi0KLWhvd2V2ZXIsIHRoZSB0aW55IHNjcmlwdHMgb25seSBvbmUgKG9ubHkgNjBLQikgd2lsbCBydW4gcHJvcGVybHkgb24gVW5peAotYXMgbG9uZyBhcyB5b3UgaW5zdGFsbCBleHRlcm5hbCB2bmN2aWV3ZXIgYW5kIHN0dW5uZWwgcGFja2FnZXM6Ci0KLQlzc3ZuY191bml4X21pbmltYWwtMS54LnkudGFyLmd6Ci0KLQotVW50cnVzdGVkIExvY2FsIFVzZXJzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAqSU1QT1JUQU5UIFdBUk5JTkcqOiAgSWYgeW91IHJ1biBTU1ZOQyBvbiBhIHdvcmtzdGF0aW9uIG9yIGNvbXB1dGVyCi0gICAgdGhhdCBvdGhlciB1c2VycyBjYW4gbG9nIGludG8gYW5kIHlvdSBETyBOT1QgVFJVU1QgdGhlc2UgdXNlcnMKLSAgICAoaXQgaXMgYSBzaGFtZSBidXQgc29tZXRpbWVzIG9uZSBoYXMgdG8gd29yayBpbiBhbiBlbnZpcm9ubWVudCBsaWtlCi0gICAgdGhpcyksIHRoZW4gcGxlYXNlIG5vdGUgdGhlIGZvbGxvd2luZyB3YXJuaW5nLgotCi0gICAgQnkgJ2RvIG5vdCB0cnVzdCcgd2UgbWVhbiB0aGV5IG1pZ2h0IHRyeSB0byBnYWluIGFjY2VzcyB0byByZW1vdGUKLSAgICBtYWNoaW5lcyB5b3UgY29ubmVjdCB0byB2aWEgU1NWTkMuICBOb3RlIHRoYXQgYW4gdW50cnVzdGVkIGxvY2FsCi0gICAgdXNlciBjYW4gb2Z0ZW4gb2J0YWluIHJvb3QgYWNjZXNzIGluIGEgc2hvcnQgYW1vdW50IG9mIHRpbWU7IGlmIGEKLSAgICB1c2VyIGhhcyBhY2hpZXZlZCB0aGF0LCB0aGVuIGFsbCBiZXRzIGFyZSBvZmYgZm9yIEFOWVRISU5HIHRoYXQgeW91Ci0gICAgZG8gb24gdGhlIHdvcmtzdGF0aW9uLiAgSXQgaXMgYmVzdCB0byBnZXQgcmlkIG9mIFVudHJ1c3RlZCBMb2NhbAotICAgIFVzZXJzIGFzIHNvb24gYXMgcG9zc2libGUuCi0KLSAgICBCb3RoIHRoZSBTU0wgYW5kIFNTSCB0dW5uZWxzIHNldCB1cCBieSBTU1ZOQyBsaXN0ZW4gb24gY2VydGFpbiBwb3J0cwotICAgIG9uIHRoZSAnbG9jYWxob3N0JyBhZGRyZXNzIGFuZCByZWRpcmVjdCBUQ1AgY29ubmVjdGlvbnMgdG8gdGhlIHJlbW90ZQotICAgIG1hY2hpbmU7IHVzdWFsbHkgdGhlIFZOQyBzZXJ2ZXIgcnVubmluZyB0aGVyZSAoYnV0IGl0IGNvdWxkIGFsc28gYmUKLSAgICBhbm90aGVyIHNlcnZpY2UsIGUuZy4gQ1VQUyBwcmludGluZykuICBUaGVzZSBhcmUgdGhlIHN0dW5uZWwoOCkgU1NMCi0gICAgcmVkaXJlY3Rpb24gYW5kIHRoZSBzc2goMSkgJy1MJyBwb3J0IHJlZGlyZWN0aW9uLiAgQmVjYXVzZSAnbG9jYWxob3N0JwotICAgIGlzIHVzZWQgb25seSB1c2VycyBvciBwcm9ncmFtcyBvbiB0aGUgc2FtZSB3b3Jrc3RhdGlvbiB0aGF0IGlzCi0gICAgcnVubmluZyBTU1ZOQyBjYW4gY29ubmVjdCB0byB0aGVzZSBwb3J0cywgaG93ZXZlciB0aGlzIGluY2x1ZGVzIGFueQotICAgIGxvY2FsIHVzZXJzIChub3QganVzdCB0aGUgdXNlciBydW5uaW5nIFNTVk5DLikKLQotICAgIElmIHRoZSB1bnRydXN0ZWQgbG9jYWwgdXNlciB0cmllcyB0byBjb25uZWN0IHRvIHRoZXNlIHBvcnRzLCBoZSBtYXkKLSAgICBzdWNjZWVkIGluIHZhcnlpbmcgZGVncmVlcyB0byBnYWluIGFjY2VzcyB0byB0aGUgcmVtb3RlIG1hY2hpbmUuCi0gICAgV2Ugbm93IGxpc3Qgc29tZSBzYWZlZ3VhcmRzIG9uZSBjYW4gcHV0IGluIHBsYWNlIHRvIHRyeSB0byBtYWtlIHRoaXMKLSAgICBtb3JlIGRpZmZpY3VsdCB0byBhY2hpZXZlLgotCi0gICAgSXQgcHJvYmFibHkgcGF5cyB0byBoYXZlIHRoZSBWTkMgc2VydmVyIHJlcXVpcmUgYSBwYXNzd29yZCwgZXZlbgotICAgIHRob3VnaCB0aGVyZSBoYXMgYWxyZWFkeSBiZWVuIFNTTCBvciBTU0ggYXV0aGVudGljYXRpb24gKHZpYQotICAgIGNlcnRpZmljYXRlcyBvciBwYXNzd29yZHMpLiAgSW4gZ2VuZXJhbCBpZiB0aGUgVk5DIFNlcnZlciByZXF1aXJlcwotICAgIFNTTCBhdXRoZW50aWNhdGlvbiBvZiB0aGUgdmlld2VyIHRoYXQgaGVscHMsIHVubGVzcyB0aGUgdW50cnVzdGVkCi0gICAgbG9jYWwgdXNlciBoYXMgZ2FpbmVkIGFjY2VzcyB0byB5b3VyIFNTVk5DIGNlcnRpZmljYXRlIGtleXMuCi0KLSAgICBJZiB0aGUgVk5DIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIG9ubHkgYWxsb3cgb25lIHZpZXdlciBjb25uZWN0aW9uCi0gICAgYXQgYSB0aW1lLCB0aGVuIHRoZSB3aW5kb3cgb2Ygb3Bwb3J0dW5pdHkgdGhhdCB0aGUgdW50cnVzdGVkIGxvY2FsCi0gICAgdXNlciBjYW4gdXNlIGlzIGdyZWF0bHkgcmVkdWNlZDogaGUgbWlnaHQgb25seSBoYXZlIGEgc2Vjb25kIG9yIHR3bwotICAgIGJldHdlZW4gdGhlIHR1bm5lbCBiZWluZyBzZXQgdXAgYW5kIHRoZSBTU1ZOQyB2bmN2aWV3ZXIgY29ubmVjdGluZwotICAgIHRvIGl0IChpLmUuIGlmIHRoZSBWTkMgc2VydmVyIG9ubHkgYWxsb3dzIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHRoZQotICAgIHVudHJ1c3RlZCBsb2NhbCB1c2VyIGNhbm5vdCBjb25uZWN0IG9uY2UgeW91ciBzZXNzaW9uIGlzIGVzdGFibGlzaGVkKS4KLSAgICBTaW1pbGFybHksIHdoZW4geW91IGRpc2Nvbm5lY3QgdGhlIHR1bm5lbCBpcyB0b3JuIGRvd24gcXVpY2tseSBhbmQKLSAgICB0aGVyZSBpcyBsaXR0bGUgb3Igbm8gd2luZG93IG9mIG9wcG9ydHVuaXR5IHRvIGNvbm5lY3QgKGUuZy4geDExdm5jCi0gICAgaW4gaXRzIGRlZmF1bHQgbW9kZSBleGl0cyBhZnRlciB0aGUgZmlyc3QgY2xpZW50IGRpc2Nvbm5lY3RzKS4KLQotICAgIEFsc28gZm9yIFNTTCB0dW5uZWxsaW5nIHdpdGggc3R1bm5lbCg4KSBvbiBVbml4IHVzaW5nIG9uZSBvZiB0aGUgU1NWTkMKLSAgICBwcmVidWlsdCAnYnVuZGxlcycsIGEgcGF0Y2hlZCBzdHVubmVsIGlzIHByb3ZpZGVkIHRoYXQgZGVuaWVzIGFsbAotICAgIGNvbm5lY3Rpb25zIGFmdGVyIHRoZSBmaXJzdCBvbmUsIGFuZCBleGl0cyB3aGVuIHRoZSBmaXJzdCBvbmUgY2xvc2VzLgotICAgIFRoaXMgaXMgbm90IHRydWUgaWYgdGhlIHN5c3RlbSBpbnN0YWxsZWQgc3R1bm5lbCg4KSBpcyB1c2VkIGFuZCBpcwotICAgIG5vdCB0cnVlIHdoZW4gdXNpbmcgU1NWTkMgb24gV2luZG93cy4KLQotICAgIFRoZSBmb2xsb3dpbmcgYXJlIHR3byBleHBlcmltZW50YWwgZmVhdHVyZXMgdGhhdCBhcmUgYWRkZWQgdG8gU1NWTkMKLSAgICB0byBpbXByb3ZlIHRoZSBzaXR1YXRpb24gZm9yIHRoZSBTU0wvc3R1bm5lbCBjYXNlLiAgU2V0IHRoZW0gdmlhCi0gICAgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiAiU1RVTk5FTCBMb2NhbCBQb3J0IFByb3RlY3Rpb25zIi4KLQotICAgIDEpIEZvciBTU0wgdHVubmVsbGluZyB3aXRoIHN0dW5uZWwoOCkgb24gVW5peCB0aGVyZSBpcyBhIHNldHRpbmcKLSAgICAgICAnVXNlIHN0dW5uZWwgRVhFQyBtb2RlJyAoZXhwZXJpbWVudGFsKSB0aGF0IHdpbGwgdHJ5IHRvIGV4ZWMoMikKLSAgICAgICBzdHVubmVsIGluc3RlYWQgb2YgdXNpbmcgYSBsaXN0ZW5pbmcgc29ja2V0LiAgVGhpcyB3aWxsIHJlcXVpcmUKLSAgICAgICB1c2luZyB0aGUgc3BlY2lhbGx5IG1vZGlmaWVkIHZuY3ZpZXdlciB1bml4IHZpZXdlciBwcm92aWRlZAotICAgICAgIGJ5IFNTVk5DLiAgSWYgdGhpcyBtb2RlIHByb3ZlcyBzdGFibGUgaXQgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQuCi0KLSAgICAyKSBGb3IgU1NMIHR1bm5lbGxpbmcgd2l0aCBzdHVubmVsKDgpIG9uIFVuaXggdGhlcmUgaXMgYSBzZXR0aW5nCi0gICAgICAgJ1VzZSBzdHVubmVsIElERU5UIGNoZWNrJyAoZXhwZXJpbWVudGFsKSB0byBsaW1pdCBzb2NrZXQKLSAgICAgICBjb25uZWN0aW9ucyB0byBiZSBmcm9tIHlvdSAodGhpcyBhc3N1bWVzIHRoZSB1bnRydXN0ZWQgbG9jYWwKLSAgICAgICB1c2VyIGhhcyBub3QgYmVjb21lIHJvb3Qgb24geW91ciB3b3Jrc3RhdGlvbiBhbmQgaGFzIG1vZGlmaWVkCi0gICAgICAgeW91ciBsb2NhbCBJREVOVCBjaGVjayBzZXJ2aWNlOyBpZiBoZSBoYXMgeW91IGhhdmUgbXVjaCBiaWdnZXIKLSAgICAgICBwcm9ibGVtcyB0byB3b3JyeSBhYm91dC4uLikKLQotICAgIFRoZXJlIGlzIGFsc28gb25lIHNpbXBsZSBMRF9QUkVMT0FEIHRyaWNrIGZvciBTU0ggdG8gbGltaXQgdGhlIG51bWJlcgotICAgIG9mIGFjY2VwdGVkIHBvcnQgcmVkaXJlY3Rpb24gY29ubmVjdGlvbnMuICBUaGlzIG1ha2VzIHRoZSB3aW5kb3cgb2YKLSAgICB0aW1lIHRoZSB1bnRydXN0ZWQgbG9jYWwgdXNlciBjYW4gY29ubmVjdCB0byB0aGUgdHVubmVsIG11Y2ggc21hbGxlci4KLSAgICBFbmFibGUgaXQgdmlhIE9wdGlvbnMgLT4gQWR2YW5jZWQgLT4gIlNTSCBMb2NhbCBQb3J0IFByb3RlY3Rpb25zIi4KLSAgICBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIGxpbV9hY2NlcHQuc28gZmlsZSBpbiB5b3VyIFNTVk5DIHBhY2thZ2UuCi0KLSAgICBUaGUgbWFpbiBtZXNzYWdlIGlzIHRvICdXYXRjaCB5b3VyIEJhY2snIHdoZW4geW91IGNvbm5lY3QgdmlhIHRoZQotICAgIFNTVk5DIHR1bm5lbHMgYW5kIHRoZXJlIGFyZSB1c2VycyB5b3UgZG9uJ3QgdHJ1c3Qgb24geW91ciB3b3Jrc3RhdGlvbi4KLSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIEFOWSB1c2Ugb2YgU1NIICctTCcgcG9ydCByZWRpcmVjdGlvbnMgb3Igb3V0Z29pbmcKLSAgICBzdHVubmVsIFNTTCByZWRpcmVjdGlvbiBzZXJ2aWNlcy4KLQotCi1IZWxwIGFuZCBJbmZvOgotLS0tLS0tLS0tLS0tLQotCi1Gb3IgbW9yZSBoZWxwIG9uIG90aGVyIG9wdGlvbnMgYW5kIHVzYWdlIHBhdHRlcm5zIHJ1biB0aGVzZToKLQotCS4vYmluL3Nzdm5jX2NtZCAtaAotCS4vYmluL3V0aWwvc3Nfdm5jdmlld2VyIC1oCi0KLVNlZSBhbHNvOgotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYwotCWh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwKLQl4MTF2bmMgLWggfCBtb3JlCi0KLQlodHRwOi8vc3R1bm5lbC5taXJ0Lm5ldAotCWh0dHA6Ly93d3cuc3R1bm5lbC5vcmcKLQlodHRwOi8vd3d3Lm9wZW5zc2wub3JnCi0JaHR0cDovL3d3dy50aWdodHZuYy5jb20KLSAgICAgICAgaHR0cDovL3d3dy5yZWFsdm5jLmNvbQotICAgICAgICBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL3B1dHR5LwotCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY290dm5jLwpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvUkVBRE1FLnR4dCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODE2ZDIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQ0KLVRoaXMgaXMgYSBXaW5kb3dzIHV0aWxpdHkgdG8gYXV0b21hdGljYWxseSBzdGFydCB1cCBTVFVOTkVMIHRvIHJlZGlyZWN0DQotU1NMIFZOQyBjb25uZWN0aW9ucyB0byBhIHJlbW90ZSBob3N0LiAgVGhlbiBUaWdodFZOQyBWaWV3ZXIgKGluY2x1ZGVkKQ0KLWlzIGxhdW5jaGVkIHRvIHVzZSB0aGlzIFNTTCB0dW5uZWwuDQotDQotQW4gZXhhbXBsZSBzZXJ2ZXIgd291bGQgYmUgIngxMXZuYyAtc3NsIiwgb3IgYW55IFZOQyBzZXJ2ZXIgd2l0aCBhDQotMm5kIFNUVU5ORUwgcHJvZ3JhbSBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIgc2lkZS4NCi0NCi1KdXN0IGNsaWNrIG9uIHRoZSBwcm9ncmFtICJzc3ZuYy5leGUiLCBhbmQgdGhlbiBlbnRlciB0aGUgcmVtb3RlDQotVk5DIFNlcnZlciBhbmQgY2xpY2sgIkNvbm5lY3QiLiAgQ2xpY2sgb24gIkhlbHAiIGZvciBtb3JlIGluZm9ybWF0aW9uDQotaW5mb3JtYXRpb24uICBZb3UgY2FuIGFsc28gc2V0IHNvbWUgc2ltcGxlIG9wdGlvbnMgdW5kZXIgIk9wdGlvbnMgLi4uIg0KLQ0KLUlmIHlvdSB3YW50IHRoYXQgYXBwbGljYXRpb24gdG8gcnVuIGluICJTU0gtT05MWSIgbW9kZSwgY2xpY2sgb24NCi10aGUgInNzaHZuYy5iYXQiIHdyYXBwZXIgaW5zdGVhZC4gIE9yIGVudGVyIFNTSF9PTkxZLg0KLQ0KLU5vdGUgdGhhdCBvbiBXaW5kb3dzIHdoZW4gdGhlIFRpZ2h0Vk5DIHZpZXdlciBkaXNjb25uZWN0cyB5b3UgbWF5IG5lZWQgdG8NCi10ZXJtaW5hdGUgdGhlIFNUVU5ORUwgcHJvZ3JhbSBtYW51YWxseS4gIFRvIGRvIHRoaXM6IENsaWNrIG9uIHRoZSBTVFVOTkVMDQotaWNvbiAoZGFyayBncmVlbikgb24gdGhlIFN5c3RlbSBUcmF5IGFuZCB0aGVuIGNsaWNrICJFeGl0Ii4gIEJlZm9yZSB0aGF0LA0KLWhvd2V2ZXIsIHlvdSB3aWxsIGJlIHByb21wdGVkIGlmIHlvdSB3YW50IHNzdm5jLmV4ZSB0byB0cnkgdG8gdGVybWluYXRlDQotU1RVTk5FTCBmb3IgeW91LiAoTm90ZSB0aGF0IGV2ZW4gaWYgU1RVTk5FTCB0ZXJtaW5hdGlvbiBpcyBzdWNjZXNzZnVsLA0KLXRoZSBUcmF5IEljb24gbWF5IG5vdCBnbyBhd2F5IHVudGlsIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBpdCEpDQotDQotV2l0aCB0aGlzIFNUVU5ORUwgYW5kIFRpZ2h0Vk5DIFZpZXdlciB3cmFwcGVyIHlvdSBjYW4gYWxzbyBlbmFibGUgdXNpbmcNCi1TU0wgQ2VydGlmaWNhdGVzIHdpdGggU1RVTk5FTCwgYW5kIHNvIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBvbmx5IGVuY3J5cHRlZA0KLWJ1dCBpdCBpcyBhbHNvIG5vdCBzdXNjZXB0aWJsZSB0byBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLg0KLQ0KLVNlZSB0aGUgU1RVTk5FTCBhbmQgeDExdm5jIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBjcmVhdGUgYW5kIGFkZCBTU0wNCi1DZXJ0aWZpY2F0ZXMgKFBFTSBmaWxlcykgZm9yIGF1dGhlbnRpY2F0aW9uLiAgQ2xpY2sgb24gdGhlICJDZXJ0cyAuLi4iDQotYnV0dG9uIHRvIHNwZWNpZnkgdGhlIGNlcnRpZmljYXRlKHMpLiAgU2VlIHRoZSBIZWxwIHRoZXJlIGZvciBtb3JlIGluZm8NCi1hbmQgYWxzbzoNCi0NCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYw0KLQlodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQ0KLQlodHRwOi8vd3d3LnN0dW5uZWwub3JnDQotCWh0dHA6Ly93d3cub3BlbnNzbC5vcmcNCi0JaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9wdXR0eS8NCi0NCi1Zb3UgY2FuIHVzZSB4MTF2bmMgdG8gY3JlYXRlIGNlcnRpZmljYXRlcyBpZiB5b3UgbGlrZToNCi0NCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc3NsLWNhDQotDQotDQotTWlzYzoNCi0NCi0JVGhlIG9wZW5zc2wuZXhlIHN0dW5uZWwuZXhlIHZuY3ZpZXdlci5leGUgbGliZWF5MzIuZGxsDQotCWxpYnNzbDMyLmRsbCBwcm9ncmFtcyBjYW1lIGZyb20gdGhlIHdlYnNpdGVzIG1lbnRpb25lZCBhYm92ZS4NCi0NCi0JSU1QT1JUQU5UOiBzb21lIG9mIHRoZXNlIGJpbmFyaWVzIG1heSBoYXZlIGNyeXB0b2dyYXBoaWMNCi0Jc29mdHdhcmUgdGhhdCB5b3UgbWF5IG5vdCBiZSBhbGxvd2VkIHRvIGRvd25sb2FkIG9yIHVzZS4NCi0JU2VlIHRoZSBhYm92ZSB3ZWJzaXRlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgYWxzbyB0aGUNCi0gICAgICAgIHV0aWwvaW5mbyBzdWJkaXJlY3Rvcmllcy4gDQotDQotCUFsc28sIHRoZSBraWxsLmV4ZSBhbmQgdGxpc3QuZXhlIHByb2dyYW1zIGluIHRoZSB3OTggZGlyZWN0b3J5DQotCWNhbWUgZnJvbSBkaWFnbm9zdGljIHRvb2xzIGZ0cCBzaXRlIG9mIE1pY3Jvc29mdCdzLg0KLQ0KLQ0KLQ0KLUltcG9ydGFudCBOb3RlIGZvciBXaW5kb3dzIFZpc3RhOiBPbmUgdXNlciByZXBvcnRzIHRoYXQgb24gV2luZG93cyBWaXN0YQ0KLWlmIHlvdSBtb3ZlIG9yIGV4dHJhY3QgdGhlICJzc3ZuYyIgZm9sZGVyIGRvd24gdG8gdGhlICJQcm9ncmFtIEZpbGVzIg0KLWZvbGRlciB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBkbyB0aGlzIGFzIHRoZSBBZG1pbmlzdHJhdG9yLiBCdXQgdGhlbg0KLXdoZW4geW91IHN0YXJ0IHVwIHNzdm5jLCBhcyBhIHJlZ3VsYXIgdXNlciwgaXQgY2Fubm90IGNyZWF0ZSBmaWxlcyBpbg0KLXRoYXQgZm9sZGVyIGFuZCBzbyBpdCBmYWlscyB0byBydW4gcHJvcGVybHkuIFdlIHJlY29tbWVuZCB0byBub3QgY29weQ0KLW9yIGV4dHJhY3QgdGhlICJzc3ZuYyIgZm9sZGVyIGludG8gIlByb2dyYW0gRmlsZXMiLiBSYXRoZXIsIGV4dHJhY3QNCi1pdCB0byBzb21ld2hlcmUgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbiAoZS5nLiBDOlwgb3IgeW91ciBVc2VyIGRpcikNCi1hbmQgY3JlYXRlIGEgU2hvcnRjdXQgdG8gc3N2bmMuZXhlIG9uIHRoZSBkZXNrdG9wLg0KLQ0KLUlmIHlvdSBtdXN0IHB1dCBhIGxhdW5jaGVyIGZpbGUgZG93biBpbiAiUHJvZ3JhbSBGaWxlcyIsIHBlcmhhcHMgYW4NCi0ic3N2bmMuYmF0IiB0aGF0IGxvb2tzIGxpa2UgdGhpczoNCi1DOg0KLWNkIFxzc3ZuY1xXaW5kb3dzDQotc3N2bmMuZXhlDQotDQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3Mvc3Nodm5jLmJhdCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3NzaHZuYy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDJkOWUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3Mvc3Nodm5jLmJhdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN0YXJ0IHNzdm5jLmV4ZSAtc3NoICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy90c3ZuYy5iYXQgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy90c3ZuYy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzFkMDIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdHN2bmMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3RhcnQgc3N2bmMuZXhlIC10cyAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9jb25uZWN0X2JyLnRjbCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvY29ubmVjdF9ici50Y2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjMmUwYjAuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9jb25uZWN0X2JyLnRjbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzEgKzAsMCBAQAotIyEvdXNyL2Jpbi93aXNoCi0KLXByb2MgY2hlY2tfY2FsbGJhY2sge30gewotCWdsb2JhbCBkZWJ1ZwotCWlmIHskZGVidWd9IHsKLQkJcHV0cyBzdGRlcnIgIi4iCi0JfQotCWNoZWNrX2Nsb3NlZAotCWFmdGVyIDEwMDAgY2hlY2tfY2FsbGJhY2sgCi19Ci0KLXByb2MgZ2V0b3V0IHt9IHsKLQlnbG9iYWwgY2xpZW50X2ZoIHNlcnZlcl9maAotCi0Jc2V0IGRlbGF5IDUwCi0JY2F0Y2gge2ZsdXNoICRjbGllbnRfZmh9Ci0JYWZ0ZXIgJGRlbGF5Ci0JY2F0Y2gge2Nsb3NlICRjbGllbnRfZmh9Ci0Jc2V0IGNsaWVudF9maCAiIgotCWFmdGVyICRkZWxheQotCWNhdGNoIHtmbHVzaCAkc2VydmVyX2ZofQotCWFmdGVyICRkZWxheQotCWNhdGNoIHtjbG9zZSAkc2VydmVyX2ZofQotCXNldCBzZXJ2ZXJfZmggIiIKLQlhZnRlciAkZGVsYXkKLQotCWdsb2JhbCBibWVzZ19jbnQKLQlpZiBbaW5mbyBleGlzdHMgYm1lc2dfY250XSB7Ci0JCWNhdGNoIHt0a3dhaXQgd2luZG93IC5ibWVzZyRibWVzZ19jbnR9Ci0JfQotCWRlc3Ryb3kgLgotCWV4aXQKLX0KLQotcHJvYyBjaGVja19jbG9zZWQge30gewotCWdsb2JhbCBnb3RfY29ubmVjdGlvbiBkZWJ1ZwotCWdsb2JhbCBjbGllbnRfZmggc2VydmVyX2ZoCi0KLQlpZiB7ISAkZ290X2Nvbm5lY3Rpb259IHsKLQkJcmV0dXJuCi0JfQotCWlmIHskY2xpZW50X2ZoICE9ICIifSB7Ci0JCXNldCBlZiAiIgotCQljYXRjaCB7c2V0IGVmIFtlb2YgJGNsaWVudF9maF19Ci0JCWlmIHskZWYgPT0gMX0gewotCQkJaWYgeyRkZWJ1Z30gewotCQkJCXB1dHMgc3RkZXJyICJjbGllbnRfZmggRU9GIgotCQkJfQotCQkJZ2V0b3V0Ci0JCX0KLQl9Ci0JaWYgeyRzZXJ2ZXJfZmggIT0gIiJ9IHsKLQkJc2V0IGVmICIiCi0JCWNhdGNoIHtzZXQgZWYgW2VvZiAkc2VydmVyX2ZoXX0KLQkJaWYgeyRlZiA9PSAxfSB7Ci0JCQlpZiB7JGRlYnVnfSB7Ci0JCQkJcHV0cyBzdGRlcnIgInNlcnZlcl9maCBFT0YiCi0JCQl9Ci0JCQlnZXRvdXQKLQkJfQotCX0KLX0KLQotcHJvYyB4ZmVyX2luX3RvX291dCB7fSB7Ci0JZ2xvYmFsIGNsaWVudF9maCBzZXJ2ZXJfZmggZGVidWcgZG9fYnJpZGdlCi0JaWYgeyRjbGllbnRfZmggIT0gIiIgJiYgIVtlb2YgJGNsaWVudF9maF19IHsKLQkJc2V0IGVmICIiCi0JCWNhdGNoIHtzZXQgZWYgW2VvZiAkY2xpZW50X2ZoXX0KLQkJaWYgeyRlZiA9PSAwfSB7Ci0JCQlzZXQgc3RyICIiCi0JCQljYXRjaCB7c2V0IHN0ciBbcmVhZCAkY2xpZW50X2ZoIDQwOTZdfQotCQkJaWYgeyRkZWJ1Z30gewotCQkJCSNwdXRzIHN0ZGVyciAieGZlcl9pbl90b19vdXQ6ICRzdHIiCi0JCQkJcHV0cyBzdGRlcnIgInhmZXJfaW5fdG9fb3V0OiBbc3RyaW5nIGxlbmd0aCAkc3RyXSIKLQkJCX0KLQkJCWlmIHskc2VydmVyX2ZoICE9ICIiICYmICRzdHIgIT0gIiJ9IHsKLQkJCQljYXRjaCB7cHV0cyAtbm9uZXdsaW5lICRzZXJ2ZXJfZmggJHN0cn0KLQkJCQljYXRjaCB7Zmx1c2ggJHNlcnZlcl9maH0KLQkJCX0KLQkJfQotCX0KLQljaGVja19jbG9zZWQKLX0KLQotcHJvYyB4ZmVyX291dF90b19pbiB7fSB7Ci0JZ2xvYmFsIGNsaWVudF9maCBzZXJ2ZXJfZmggZGVidWcgZG9fYnJpZGdlCi0JaWYgeyRzZXJ2ZXJfZmggIT0gIiJ9IHsKLQkJc2V0IGVmICIiCi0JCWNhdGNoIHtzZXQgZWYgW2VvZiAkc2VydmVyX2ZoXX0KLQkJaWYgeyRlZiA9PSAwfSB7Ci0JCQlzZXQgc3RyICIiCi0JCQljYXRjaCB7c2V0IHN0ciBbcmVhZCAkc2VydmVyX2ZoIDQwOTZdfQotCQkJaWYgeyRkZWJ1Z30gewotCQkJCSNwdXRzIHN0ZGVyciAieGZlcl9vdXRfdG9faW46ICRzdHIiCi0JCQkJcHV0cyBzdGRlcnIgInhmZXJfb3V0X3RvX2luOiBbc3RyaW5nIGxlbmd0aCAkc3RyXSIKLQkJCX0KLQkJCWlmIHskY2xpZW50X2ZoICE9ICIiICYmICRzdHIgIT0gIiJ9IHsKLQkJCQljYXRjaCB7cHV0cyAtbm9uZXdsaW5lICRjbGllbnRfZmggJHN0cn0KLQkJCQljYXRjaCB7Zmx1c2ggJGNsaWVudF9maH0KLQkJCX0KLQkJfQotCX0KLQljaGVja19jbG9zZWQKLX0KLQotcHJvYyBibWVzZyB7bXNnfSB7Ci0JZ2xvYmFsIGVudgotCWlmIHshIFtpbmZvIGV4aXN0cyBlbnYoQk1FU0cpXX0gewotCQlyZXR1cm4KLQl9Ci0JaWYgeyRlbnYoQk1FU0cpID09IDB9IHsKLQkJcmV0dXJuCi0JfQotCi0JZ2xvYmFsIGJtZXNnX2NudAotCWlmIHshIFtpbmZvIGV4aXN0cyBibWVzZ19jbnRdfSB7Ci0JCXNldCBibWVzZ19jbnQgMAotCX0KLQlpbmNyIGJtZXNnX2NudAotCXNldCB3IC5ibWVzZyRibWVzZ19jbnQKLQljYXRjaCB7ZGVzdHJveSAkd30KLQl0b3BsZXZlbCAkdwotCWxhYmVsICR3LmwgLXdpZHRoIDcwIC10ZXh0ICIkbXNnIgotCXBhY2sgJHcubAotCXVwZGF0ZQotCWlmIHskZW52KEJNRVNHKSA+IDF9IHsKLQkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkZW52KEJNRVNHKX0ge2luY3IgaX0gewotCQkJYWZ0ZXIgMTAwMAotCQkJdXBkYXRlCi0JCX0KLQl9Ci19Ci0KLXByb2MgZG9fY29ubmVjdF9odHRwIHtzb2NrIGhvc3Rwb3J0IHdoaWNofSB7Ci0JZ2xvYmFsIGRlYnVnIGN1cl9wcm94eQotCXNldCBjb24gIiIKLQlhcHBlbmQgY29uICJDT05ORUNUICRob3N0cG9ydCBIVFRQLzEuMVxyXG4iCi0JYXBwZW5kIGNvbiAiSG9zdDogJGhvc3Rwb3J0XHJcbiIKLQlhcHBlbmQgY29uICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIgotCi0JcHV0cyBzdGRlcnIgInB4eT0kd2hpY2ggQ09OTkVDVCAkaG9zdHBvcnQgSFRUUC8xLjEgdmlhICRjdXJfcHJveHkiCi0JYm1lc2cgIkg6ICR3aGljaCBDT05ORUNUICRob3N0cG9ydCBIVFRQLzEuMSAkY3VyX3Byb3h5IjsKLQotCXB1dHMgLW5vbmV3bGluZSAkc29jayAkY29uCi0JZmx1c2ggJHNvY2sKLQotCXNldCByICIiCi0Jc2V0IGNudCAwCi0Jd2hpbGUgezF9IHsKLQkJaW5jciBjbnQKLQkJc2V0IGMgW3JlYWQgJHNvY2sgMV0KLQkJaWYgeyRjID09ICIifSB7Ci0JCQljaGVja19jbG9zZWQKLQkJCWFmdGVyIDIwCi0JCX0KLQkJYXBwZW5kIHIgJGMKLQkJaWYge1tyZWdleHAgIlxyXG5cclxuIiAkcl0gfHwgW3JlZ2V4cCAiYS0tbm8tLVxuXG4iICRyXX0gewotCQkJYnJlYWsKLQkJfQotCQlpZiB7JGNudCA+IDMwMDAwfSB7Ci0JCQlicmVhawotCQl9Ci0JfQotCWlmIHshIFtyZWdleHAge0hUVFAvLiogMjAwfSAkcl19IHsKLQkJcHV0cyBzdGRlcnIgImRpZCBub3QgZmluZCBIVFRQIDIwMCAjMSIKLQkJZGVzdHJveSAuCi0JCWV4aXQgMQotCX0KLX0KLQotcHJvYyBkb19jb25uZWN0X3NvY2tzNCB7c29jayBob3N0cG9ydCB3aGljaH0gewotCWdsb2JhbCBkZWJ1ZyBjdXJfcHJveHkKLQotCXNldCBob3N0ICIiCi0Jc2V0IHBvcnQgIiIKLQlpZiBbcmVnZXhwIHteKC4qKTooWzAtOV1bMC05XSopJH0gJGhvc3Rwb3J0IG12YXIgaG9zdCBwb3J0XSB7Ci0JCTsKLQl9IGVsc2UgewotCQlwdXRzIHN0ZGVyciAiY291bGQgbm90IHBhcnNlIGhvc3Q6cG9ydCAkaG9zdHBvcnQiCi0JCWRlc3Ryb3kgLgotCQlleGl0IDEKLQl9Ci0KLQlzZXQgaTEgIiIKLQlzZXQgaTIgIiIKLQlzZXQgaTMgIiIKLQlzZXQgaTQgIiIKLQotCXNldCBzb2NrczRhIDAKLQotCWlmIHskaG9zdCA9PSAibG9jYWxob3N0IiB8fCAkaG9zdCA9PSAiMTI3LjAuMC4xIn0gewotCQlzZXQgaTEgMTI3Ci0JCXNldCBpMiAwCi0JCXNldCBpMyAwCi0JCXNldCBpNCAxCi0JCQotCX0gZWxzZWlmIFtyZWdleHAge15bMC05XVswLTldKlwuWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKiR9ICRob3N0XSB7Ci0JCXNldCBuIFtzcGxpdCAkaG9zdCAiLiJdCi0JCXNldCBpMSBbbGluZGV4ICRuIDBdCi0JCXNldCBpMiBbbGluZGV4ICRuIDFdCi0JCXNldCBpMyBbbGluZGV4ICRuIDJdCi0JCXNldCBpNCBbbGluZGV4ICRuIDNdCi0JfSBlbHNlIHsKLQkJc2V0IGkxIDAKLQkJc2V0IGkyIDAKLQkJc2V0IGkzIDAKLQkJc2V0IGk0IDMKLQkJCi0JCXNldCBzb2NrczRhIDEKLQl9Ci0KLQlpZiB7JHNvY2tzNGF9IHsKLQkJcHV0cyBzdGRlcnIgInB4eT0kd2hpY2ggc29ja3M0YSBjb25uZWN0aW9uIHRvICRob3N0OiRwb3J0IHZpYSAkY3VyX3Byb3h5IgotCX0gZWxzZSB7Ci0JCXB1dHMgc3RkZXJyICJweHk9JHdoaWNoIHNvY2tzNCAgY29ubmVjdGlvbiB0byAkaG9zdDokcG9ydCB2aWEgJGN1cl9wcm94eSIKLQl9Ci0KLQlzZXQgcDEgW2JpbmFyeSBmb3JtYXQgY2NTY2NjYyA0IDEgJHBvcnQgJGkxICRpMiAkaTMgJGk0XQotCXNldCBwMiAibm9ib2R5IgotCXNldCBwMyBbYmluYXJ5IGZvcm1hdCBjIDBdCi0KLQlwdXRzIC1ub25ld2xpbmUgJHNvY2sgJHAxCi0JcHV0cyAtbm9uZXdsaW5lICRzb2NrICRwMgotCXB1dHMgLW5vbmV3bGluZSAkc29jayAkcDMKLQlpZiB7JHNvY2tzNGF9IHsKLQkJcHV0cyAtbm9uZXdsaW5lICRzb2NrICRob3N0Ci0JCXB1dHMgLW5vbmV3bGluZSAkc29jayAkcDMKLQl9Ci0JZmx1c2ggJHNvY2sKLQotCXNldCByICIiOyBzZXQgcyAiIjsgc2V0IGkgMDsgc2V0IGNudCAwCi0Jc2V0IG9rIDEKLQl3aGlsZSB7JGNudCA8IDMwMDAwICYmICRpIDwgOH0gewotCQlpbmNyIGNudAotCQlzZXQgYyBbcmVhZCAkc29jayAxXQotCQlpZiB7JGMgPT0gIiJ9IHsKLQkJCWNoZWNrX2Nsb3NlZAotCQkJYWZ0ZXIgMjAKLQkJCWNvbnRpbnVlCi0JCX0KLQkJCi0JCWJpbmFyeSBzY2FuICRjIGMgcwotCQlpZiB7JGkgPT0gMCAmJiAkcyAhPSAwfSB7Ci0JCQlwdXRzIHN0ZGVyciAic29ja3M0OiAkaSAtICRzIgotCQkJc2V0IG9rIDAKLQkJfQotCQlpZiB7JGkgPT0gMSAmJiAkcyAhPSA5MH0gewotCQkJcHV0cyBzdGRlcnIgInNvY2tzNDogJGkgLSAkcyIKLQkJCXNldCBvayAwCi0JCX0KLQkJc2V0IHIgIiRyLCRzIgotCQlpbmNyIGkKLQl9Ci0JaWYgeyEgJG9rfSB7Ci0JCXB1dHMgc3RkZXJyICJzb2NrczQgZmFpbHVyZTogJHIiCi0JCWRlc3Ryb3kgLgotCQlleGl0IDEKLQl9Ci19Ci0KLXByb2MgZG9fY29ubmVjdF9zb2NrczUge3NvY2sgaG9zdHBvcnQgd2hpY2h9IHsKLQlnbG9iYWwgZGVidWcgY3VyX3Byb3h5Ci0KLQlzZXQgaG9zdCAiIgotCXNldCBwb3J0ICIiCi0JaWYgW3JlZ2V4cCB7XiguKik6KFswLTldWzAtOV0qKSR9ICRob3N0cG9ydCBtdmFyIGhvc3QgcG9ydF0gewotCQk7Ci0JfSBlbHNlIHsKLQkJcHV0cyBzdGRlcnIgImNvdWxkIG5vdCBwYXJzZSBob3N0OnBvcnQgJGhvc3Rwb3J0IgotCQlkZXN0cm95IC4KLQkJZXhpdCAxCi0JfQotCi0Jc2V0IHAxIFtiaW5hcnkgZm9ybWF0IGNjYyA1IDEgMF0KLQlwdXRzIC1ub25ld2xpbmUgJHNvY2sgJHAxCi0JZmx1c2ggJHNvY2sKLQotCXNldCByICIiOyBzZXQgcyAiIjsgc2V0IGkgMDsgc2V0IGNudCAwCi0Jc2V0IG9rIDEKLQl3aGlsZSB7JGNudCA8IDMwMDAwICYmICRpIDwgMn0gewotCQlpbmNyIGNudAotCQlzZXQgYyBbcmVhZCAkc29jayAxXQotCQlpZiB7JGMgPT0gIiJ9IHsKLQkJCWNoZWNrX2Nsb3NlZAotCQkJYWZ0ZXIgMjAKLQkJCWNvbnRpbnVlCi0JCX0KLQkJCi0JCWJpbmFyeSBzY2FuICRjIGMgcwotCQlpZiB7JGkgPT0gMCAmJiAkcyAhPSA1fSB7Ci0JCQlwdXRzIHN0ZGVyciAiJGkgLSAkcyIKLQkJCXNldCBvayAwCi0JCX0KLQkJaWYgeyRpID09IDEgJiYgJHMgIT0gMH0gewotCQkJcHV0cyBzdGRlcnIgIiRpIC0gJHMiCi0JCQlzZXQgb2sgMAotCQl9Ci0JCXNldCByICIkciwkcyIKLQkJaW5jciBpCi0JfQotCWlmIHshICRva30gewotCQlwdXRzIHN0ZGVyciAic29ja3M1IGZhaWx1cmU6ICRyIgotCQlkZXN0cm95IC4KLQkJZXhpdCAxCi0JfQotCi0Jc2V0IGxlbiBbc3RyaW5nIGxlbmd0aCAkaG9zdF0KLQlzZXQgcDEgW2JpbmFyeSBmb3JtYXQgY2NjY2MgNSAxIDAgMyAkbGVuXQotCXNldCBwMiAkaG9zdAotCi0Jc2V0IG4xIFtleHByIGludCgkcG9ydC8yNTYpXQotCXNldCBuMiBbZXhwciAiJHBvcnQgLSAkbjEgKiAyNTYiXQotCXNldCBwMyBbYmluYXJ5IGZvcm1hdCBjYyAkbjEgJG4yXQotCi0JcHV0cyBzdGRlcnIgInB4eT0kd2hpY2ggc29ja3M1ICBjb25uZWN0aW9uIHRvICRob3N0OiRwb3J0IHZpYSAkY3VyX3Byb3h5IgotCi0JcHV0cyAtbm9uZXdsaW5lICRzb2NrICRwMQotCXB1dHMgLW5vbmV3bGluZSAkc29jayAkcDIKLQlwdXRzIC1ub25ld2xpbmUgJHNvY2sgJHAzCi0JZmx1c2ggJHNvY2sKLQotCXNldCBpMSAiIjsgc2V0IGkyICIiOyBzZXQgaTMgIiI7IHNldCBpNCAiIgotCXNldCByICIiOyBzZXQgcyAiIjsgc2V0IGkgMDsgc2V0IGNudCAwCi0Jc2V0IG9rIDEKLQl3aGlsZSB7JGNudCA8IDMwMDAwICYmICRpIDwgNH0gewotCQlpbmNyIGNudAotCQlzZXQgYyBbcmVhZCAkc29jayAxXQotCQlpZiB7JGMgPT0gIiJ9IHsKLQkJCWNoZWNrX2Nsb3NlZAotCQkJYWZ0ZXIgMjAKLQkJCWNvbnRpbnVlCi0JCX0KLQkJCi0JCWJpbmFyeSBzY2FuICRjIGMgcwotCQlpZiB7JGkgPT0gMH0gewotCQkJc2V0IGkxICRzCi0JCX0gZWxzZWlmIHskaSA9PSAxfSB7Ci0JCQlzZXQgaTIgJHMKLQkJfSBlbHNlaWYgeyRpID09IDJ9IHsKLQkJCXNldCBpMyAkcwotCQl9IGVsc2VpZiB7JGkgPT0gM30gewotCQkJc2V0IGk0ICRzCi0JCX0KLQkJaW5jciBpCi0JfQotCXNldCByICJpMT0kaTEsaTI9JGkyLGkzPSRpMyxpND0kaTQiCi0KLQlpZiB7JGk0ID09IDF9IHsKLQkJc2V0IG4gNgotCX0gZWxzZWlmIHskaTQgPT0gM30gewotCQlzZXQgYyAiIgotCQlmb3Ige3NldCBpIDB9IHskaSA8IDEwMDB9IHtpbmNyIGl9IHsKLQkJCXNldCBjIFtyZWFkICRzb2NrIDFdCi0JCQlpZiB7JGMgPT0gIiJ9IHsKLQkJCQljaGVja19jbG9zZWQKLQkJCQlhZnRlciAyMAotCQkJCWNvbnRpbnVlCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiB7JGMgPT0gIiJ9IHsKLQkJCXB1dHMgc3RkZXJyICJzb2NrczUgZmFpbHVyZSBjOiAkciIKLQkJCWRlc3Ryb3kgLgotCQkJZXhpdCAxCi0JCX0KLQkJYmluYXJ5IHNjYW4gJGMgYyBzCi0JCXNldCBuIFtleHByICRzICsgMl0gCi0JfSBlbHNlaWYgeyRpNCA9PSA0fSB7Ci0JCXNldCBuIDE4IAotCX0gZWxzZSB7Ci0JCXB1dHMgc3RkZXJyICJzb2NrczUgZmFpbHVyZSB4OiAkciIKLQkJZGVzdHJveSAuCi0JCWV4aXQgMQotCX0KLQkjcHV0cyAibj0kbiAtLS0gJHIiCi0KLQlzZXQgaSAwOyBzZXQgY250IDAKLQl3aGlsZSB7JGNudCA8IDMwMDAwICYmICRpIDwgJG59IHsKLQkJaW5jciBjbnQKLQkJc2V0IGMgW3JlYWQgJHNvY2sgMV0KLQkJaWYgeyRjID09ICIifSB7Ci0JCQljaGVja19jbG9zZWQKLQkJCWFmdGVyIDIwCi0JCQljb250aW51ZQotCQl9Ci0JCWluY3IgaQotCX0KLQlpZiB7JGkxICE9IDUgfHwgJGkyICE9IDAgfHwgJGkzICE9IDB9IHsKLQkJcHV0cyBzdGRlcnIgInNvY2tzIGZhaWx1cmUgJHIiCi0JCWRlc3Ryb3kgLgotCQlleGl0IDEKLQl9Ci19Ci0KLXByb2MgZG9fY29ubmVjdF9yZXBlYXRlciB7c29jayBob3N0cG9ydCB3aGljaCByZXBlYXRlcn0gewotCWdsb2JhbCBkZWJ1ZyBjdXJfcHJveHkKLQotCSMgMjUwIGlzIFVsdHJhVk5DIGJ1ZmZlciBzaXplLgotCXNldCBjb24gW2JpbmFyeSBmb3JtYXQgYTI1MCAkcmVwZWF0ZXJdCi0KLQlwdXRzIHN0ZGVyciAicHh5PSR3aGljaCBSRVBFQVRFUiAkcmVwZWF0ZXIgdmlhICRjdXJfcHJveHkiCi0JYm1lc2cgIlI6ICR3aGljaCBDT05ORUNUICRob3N0cG9ydCB8ICRyZXBlYXRlciAkY3VyX3Byb3h5IjsKLQotCXB1dHMgLW5vbmV3bGluZSAkc29jayAkY29uCi0JZmx1c2ggJHNvY2sKLQotCXNldCByICIiCi0Jc2V0IGNudCAwCi0Jd2hpbGUgezF9IHsKLQkJaW5jciBjbnQKLQkJc2V0IGMgW3JlYWQgJHNvY2sgMV0KLQkJaWYgeyRjID09ICIifSB7Ci0JCQljaGVja19jbG9zZWQKLQkJCWFmdGVyIDIwCi0JCX0KLQkJYXBwZW5kIHIgJGMKLQkJaWYge1tzdHJpbmcgbGVuZ3RoICRyXSA+PSAxMn0gewotCQkJcHV0cyBzdGRlcnIgImRvX2Nvbm5lY3RfcmVwZWF0ZXI6ICRyIgotCQkJYnJlYWsKLQkJfQotCQlpZiB7JGNudCA+IDMwMDAwfSB7Ci0JCQlicmVhawotCQl9Ci0JfQotfQotCi1wcm9jIHZyZWFkIHtuIHNvY2t9IHsKLQlzZXQgc3RyICIiCi0Jc2V0IG1heCAzMDAwCi0Jc2V0IGR0IDEwCi0Jc2V0IGkgMAotCXNldCBjbnQgMAotCXdoaWxlIHskY250IDwgJG1heCAmJiAkaSA8ICRufSB7Ci0JCWluY3IgY250Ci0JCXNldCBjIFtyZWFkICRzb2NrIDFdCi0JCWlmIHskYyA9PSAiIn0gewotCQkJY2hlY2tfY2xvc2VkCi0JCQlhZnRlciAkZHQKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaW5jciBpCi0JCWFwcGVuZCBzdHIgJGMKLQl9Ci0JaWYgeyRpICE9ICRufSB7Ci0JCXB1dHMgc3RkZXJyICJ2cmVhZCBmYWlsdXJlICRuICAkaSIKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0JcmV0dXJuICRzdHIKLX0KLQotcHJvYyBhcHBlbmRfaGFuZHNoYWtlIHtzdHJ9IHsKLQlnbG9iYWwgZW52Ci0JaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0UpXSB7Ci0JCXNldCBmaWxlICRlbnYoU1NWTkNfUFJFRElHRVNURURfSEFORFNIQUtFKQotCQlzZXQgZmggIiIKLQkJY2F0Y2gge3NldCBmaCBbb3BlbiAkZmlsZSBhXX0KLQkJaWYgeyRmaCAhPSAiIn0gewotCQkJcHV0cyAkZmggJHN0cgotCQkJY2F0Y2gge2Nsb3NlICRmaH0KLQkJfQotCX0KLX0KLQotcHJvYyB2ZW5jcnlwdF9icmlkZ2VfY29ubmVjdGlvbiB7ZmggaG9zdCBwb3J0fSB7Ci0JcHV0cyBzdGRlcnIgInZlbmNyeXB0X2JyaWRnZV9jb25uZWN0aW9uOiBnb3QgY29ubmVjdGlvbiAkZmggJGhvc3QgJHBvcnQiCi0JYm1lc2cgICAgICAgInZlbmNyeXB0X2JyaWRnZV9jb25uZWN0aW9uOiBnb3QgY29ubmVjdGlvbiAkZmggJGhvc3QgJHBvcnQiCi0JZ2xvYmFsIHZpZXdlcl9zb2NrCi0Jc2V0IHZpZXdlcl9zb2NrICRmaAotfQotCi1wcm9jIGNlbnRlcl93aW4ge3d9IHsKLQl1cGRhdGUKLQlzZXQgVyBbd2luZm8gc2NyZWVud2lkdGggICR3XQotCXNldCBXIFtleHByICRXICsgMV0KLQl3bSBnZW9tZXRyeSAkdyArJFcrMAotCXVwZGF0ZQotCXNldCB4IFtleHByIFt3aW5mbyBzY3JlZW53aWR0aCAgJHddLzIgLSBbd2luZm8gd2lkdGggICR3XS8yXQotCXNldCB5IFtleHByIFt3aW5mbyBzY3JlZW5oZWlnaHQgJHddLzIgLSBbd2luZm8gaGVpZ2h0ICR3XS8yXQotCi0Jd20gZ2VvbWV0cnkgJHcgKyR4KyR5Ci0Jd20gZGVpY29uaWZ5ICR3Ci0JdXBkYXRlCi19Ci0KLQotcHJvYyBnZXRfdXNlcl9wYXNzIHt9IHsKLQlnbG9iYWwgZW52Ci0Jc2V0IHVwICIiCi0JaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19VTklYUFcpXSB7Ci0JCXNldCBybSAwCi0JCXNldCB1cCAkZW52KFNTVk5DX1VOSVhQVykKLQkJaWYgW3JlZ2V4cCB7XnJtOn0gJHVwXSAgewotCQkJc2V0IHJtIDEKLQkJCXJlZ3N1YiB7XnJtOn0gJHVwICIiIHVwCi0JCX0KLQkJaWYgW2ZpbGUgZXhpc3RzICR1cF0gewotCQkJc2V0IGZoICIiCi0JCQlzZXQgZiAkdXAKLQkJCWNhdGNoIHtzZXQgZmggW29wZW4gJHVwIHJdfQotCQkJaWYgeyRmaCAhPSAiIn0gewotCQkJCWdldHMgJGZoIHUJCi0JCQkJZ2V0cyAkZmggcAkKLQkJCQljYXRjaCB7Y2xvc2UgJGZofQotCQkJCXNldCB1cCAiJHVAJHAiCi0JCQl9Ci0JCQlpZiB7JHJtfSB7Ci0JCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmfQotCQkJfQotCQl9Ci0JfSBlbHNlaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19WRU5DUllQVF9VU0VSUEFTUyldIHsKLQkJc2V0IHVwICRlbnYoU1NWTkNfVkVOQ1JZUFRfVVNFUlBBU1MpCi0JfQotCWlmIHskdXAgIT0gIiJ9IHsKLQkJcmV0dXJuICR1cAotCX0KLQotCXRvcGxldmVsIC50Ci0Jd20gdGl0bGUgLnQge1ZlTkNyeXB0IFZpZXdlciBCcmlkZ2UgVXNlci9QYXNzfQotCi0JZ2xvYmFsIHVzZXIgcGFzcwotCXNldCB1c2VyICIiCi0Jc2V0IHBhc3MgIiIKLQlsYWJlbCAudC5sIC10ZXh0IHtTU1ZOQyBWZU5DcnlwdCBWaWV3ZXIgQnJpZGdlfQotCi0JZnJhbWUgLnQuZjAKLQlmcmFtZSAudC5mMC5mTAotCWxhYmVsIC50LmYwLmZMLmxhIC10ZXh0IHtVc2VybmFtZTogfQotCWxhYmVsIC50LmYwLmZMLmxiIC10ZXh0IHtQYXNzd29yZDogfQotCi0JcGFjayAudC5mMC5mTC5sYSAudC5mMC5mTC5sYiAtc2lkZSB0b3AKLQotCWZyYW1lIC50LmYwLmZSCi0JZW50cnkgLnQuZjAuZlIuZWEgLXdpZHRoIDI0IC10ZXh0dmFyaWFibGUgdXNlcgotCWVudHJ5IC50LmYwLmZSLmViIC13aWR0aCAyNCAtdGV4dHZhcmlhYmxlIHBhc3MgLXNob3cgKgotCi0JcGFjayAudC5mMC5mUi5lYSAudC5mMC5mUi5lYiAtc2lkZSB0b3AgLWZpbGwgeAotCi0JcGFjayAudC5mMC5mTCAtc2lkZSBsZWZ0Ci0JcGFjayAudC5mMC5mUiAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC50Lm5vIC10ZXh0IENhbmNlbCAtY29tbWFuZCB7c2V0IHVzZXIgIiI7IHNldCBwYXNzICIiOyBkZXN0cm95IC50fQotCWJ1dHRvbiAudC5vayAtdGV4dCBEb25lICAgLWNvbW1hbmQge2Rlc3Ryb3kgLnR9Ci0KLQljZW50ZXJfd2luIC50Ci0JcGFjayAudC5sIC50LmYwIC50Lm5vIC50Lm9rIC1zaWRlIHRvcCAtZmlsbCB4Ci0JdXBkYXRlCi0Jd20gZGVpY29uaWZ5IC50Ci0KLQliaW5kIC50LmYwLmZSLmVhIDxSZXR1cm4+IHtmb2N1cyAudC5mMC5mUi5lYn0KLQliaW5kIC50LmYwLmZSLmViIDxSZXR1cm4+IHtkZXN0cm95IC50fQotCWZvY3VzIC50LmYwLmZSLmVhCi0KLQl3bSByZXNpemFibGUgLnQgMSAwCi0Jd20gbWluc2l6ZSAudCBbd2luZm8gcmVxd2lkdGggLnRdIFt3aW5mbyByZXFoZWlnaHQgLnRdCi0KLQl0a3dhaXQgd2luZG93IC50Ci0JaWYgeyR1c2VyID09ICIiIHx8ICRwYXNzID09ICIifSB7Ci0JCXJldHVybiAiIgotCX0gZWxzZSB7Ci0JCXJldHVybiAiJHVzZXJAJHBhc3MiCi0JfQotfQotCi1wcm9jIGRvX3ZlbmNyeXB0X3ZpZXdlcl9icmlkZ2Uge2xpc3RlbiBjb25uZWN0fSB7Ci0JZ2xvYmFsIGVudgotCi0JI3NldCBlbnYoQk1FU0cpIDEKLQotCXZlbmNyeXB0X2NvbnN0YW50cwotCi0Jc2V0IGJhY2t3YXJkcyAwCi0KLQlpZiB7ISBbaW5mbyBleGlzdHMgZW52KFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSldfSB7Ci0JCXB1dHMgc3RkZXJyICJubyBTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0UgZmlsZW5hbWUgaW4gZW52aXJvbm1lbnQuIgkKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0Jc2V0IGhhbmRzaGFrZSAkZW52KFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSkKLQlibWVzZyAkaGFuZHNoYWtlCi0KLQlpZiB7JGxpc3RlbiA8IDB9IHsKLQkJc2V0IGJhY2t3YXJkcyAxCi0JCXNldCBsaXN0ZW4gW2V4cHIgLSRsaXN0ZW5dCi0JfQotCi0JIyBsaXN0ZW4gb24gJGxpc3RlbgkKLQlnbG9iYWwgdmlld2VyX3NvY2sKLQlzZXQgdmlld2VyX3NvY2sgIiIKLQlzZXQgbHNvY2sgIiIKLQlzZXQgcmMgW2NhdGNoIHtzZXQgbHNvY2sgW3NvY2tldCAtbXlhZGRyIDEyNy4wLjAuMSAtc2VydmVyIHZlbmNyeXB0X2JyaWRnZV9jb25uZWN0aW9uICRsaXN0ZW5dfV0KLQlpZiB7JHJjICE9IDB9IHsKLQkJcHV0cyBzdGRlcnIgImVycm9yIGxpc3RlbmluZyBvbiAxMjcuMC4wLjE6JGxpc3RlbiIJCi0JCWRlc3Ryb3kgLjsgZXhpdCAxCi0JfQotCWJtZXNnICJsaXN0ZW4gb24gJGxpc3RlbiBPSyIKLQotCSMgYWNjZXB0Ci0JdndhaXQgdmlld2VyX3NvY2sKLQljYXRjaCB7Y2xvc2UgJGxzb2NrfQotCWZjb25maWd1cmUgJHZpZXdlcl9zb2NrIC10cmFuc2xhdGlvbiBiaW5hcnkgLWJsb2NraW5nIDAKLQotCWdsb2JhbCBnb3RfY29ubmVjdGlvbgotCXNldCBnb3RfY29ubmVjdGlvbiAxCi0KLQkjIGNvbm5lY3QgdG8gJGNvbm5lY3QKLQlzZXQgc2VydmVyX3NvY2sgIiIKLQlzZXQgcmMgW2NhdGNoIHtzZXQgc2VydmVyX3NvY2sgW3NvY2tldCAxMjcuMC4wLjEgJGNvbm5lY3RdfV0KLQlpZiB7JHJjICE9IDB9IHsKLQkJcHV0cyBzdGRlcnIgImVycm9yIGNvbm5lY3RpbmcgdG8gMTI3LjAuMC4xOiRjb25uZWN0IgkKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0JYm1lc2cgIm1hZGUgY29ubmVjdGlvbiB0byAkY29ubmVjdCIKLQlmY29uZmlndXJlICRzZXJ2ZXJfc29jayAtdHJhbnNsYXRpb24gYmluYXJ5IC1ibG9ja2luZyAwCi0KLQlpZiB7JGJhY2t3YXJkc30gewotCQlwdXRzIHN0ZGVyciAicmV2ZXJzaW5nIHJvbGVzIG9mIHZpZXdlciBhbmQgc2VydmVyIgotCQlzZXQgdCAkdmlld2VyX3NvY2sKLQkJc2V0IHZpZXdlcl9zb2NrICRzZXJ2ZXJfc29jawotCQlzZXQgc2VydmVyX3NvY2sgJHQKLQl9Ci0KLQkjIHdhaXQgZm9yIFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSAiZG9uZSIsIHB1dCBpbiBoYXNoLgotCXNldCBkdCAyMDAKLQlzZXQgc2xlcHQgMAotCXNldCBtYXh3YWl0IDIwMDAwCi0Jc2V0IGhzKG1vZGUpIGluaXQgCi0Jd2hpbGUgeyRzbGVwdCA8ICRtYXh3YWl0fSB7Ci0JCWFmdGVyICRkdAotCQlzZXQgc2xlcHQgW2V4cHIgJHNsZXB0ICsgJGR0XQotCQlzZXQgZG9uZSAwCi0JCXNldCBmaCAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICRoYW5kc2hha2Ugcl19Ci0JCXNldCBzdHIgIiIKLQkJaWYgeyRmaCAhPSAiIn0gewotCQkJYXJyYXkgdW5zZXQgaHMgCi0JCQl3aGlsZSB7W2dldHMgJGZoIGxpbmVdID4gLTF9IHsKLQkJCQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JCQkJc2V0IHN0ciAiJHN0ciRsaW5lXG4iOwotCQkJCWlmIHskbGluZSA9PSAiZG9uZSJ9IHsKLQkJCQkJc2V0IGRvbmUgMQotCQkJCX0gZWxzZWlmIFtyZWdleHAgez19ICRsaW5lXSB7Ci0JCQkJCXNldCBzIFtzcGxpdCAkbGluZSAiPSJdCi0JCQkJCXNldCBrZXkgW2xpbmRleCAkcyAwXQotCQkJCQlzZXQgdmFsIFtsaW5kZXggJHMgMV0KLQkJCQkJc2V0IGhzKCRrZXkpICR2YWwKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCB7Y2xvc2UgJGZofQotCQl9Ci0JCWlmIHskZG9uZX0gewotCQkJcHV0cyBzdGRlcnIgJHN0cgotCQkJYm1lc2cgIiRzdHIiCi0JCQlicmVhawotCQl9Ci0JfQotCi0JY2F0Y2ggW2ZpbGUgZGVsZXRlICRoYW5kc2hha2VdCi0KLQlpZiB7ISBbaW5mbyBleGlzdHMgaHMoc2VjdHlwZSldfSB7Ci0JCXB1dHMgc3RkZXJyICJubyBocyhzZWN0eXBlKSBmb3VuZCIJCi0JCWRlc3Ryb3kgLjsgZXhpdCAxCi0JfQotCi0JIyByZWFkIHZpZXdlciBSRkIKLQlpZiB7ISBbaW5mbyBleGlzdHMgaHMoc2VydmVyKV19IHsKLQkJc2V0IGhzKHNlcnZlcikgIlJGQiAwMDMuMDA4IgotCX0KLQlwdXRzIC1ub25ld2xpbmUgJHZpZXdlcl9zb2NrICIkaHMoc2VydmVyKVxuIgotCWZsdXNoICR2aWV3ZXJfc29jawotCXB1dHMgc3RkZXJyICJzZW50ICRocyhzZXJ2ZXIpIHRvIHZpZXdlciBzb2NrLiIKLQotCXNldCB2aWV3ZXJfcmZiIFt2cmVhZCAxMiAkdmlld2VyX3NvY2tdCi0JcHV0cyBzdGRlcnIgInJlYWQgdmlld2VyX3JmYiAkdmlld2VyX3JmYiIKLQotCXNldCB2aWV3ZXJfbWFqb3IgMyAKLQlzZXQgdmlld2VyX21pbm9yIDggCi0JaWYgW3JlZ2V4cCB7XlJGQiAwMDNcLjAqKFswLTldWzAtOV0qKX0gJHZpZXdlcl9yZmIgbSB2XSB7Ci0JCXNldCB2aWV3ZXJfbWlub3IgJHYKLQl9Ci0KLQlpZiB7JGhzKHNlY3R5cGUpID09ICRyZmJTZWNUeXBlQW5vblRsc30gewotCQlwdXRzIHN0ZGVyciAiaGFuZGxpbmcgcmZiU2VjVHlwZUFub25UbHMiCi0JCWlmIHskdmlld2VyX21ham9yID4gMyB8fCAkdmlld2VyX21pbm9yID49IDd9IHsKLQkJCXB1dHMgc3RkZXJyICJ2aWV3ZXIgPj0gMy43LCBub3RoaW5nIHRvIHNldCB1cC4iCi0JCX0gZWxzZSB7Ci0JCQlwdXRzIHN0ZGVyciAidmlld2VyIDw9IDMuMywgZmFraW5nIHRoaW5ncyB1cC4iCi0JCQlzZXQgdCBbdnJlYWQgMSAkc2VydmVyX3NvY2tdCi0JCQliaW5hcnkgc2NhbiAkdCBjIG5zZWN0eXBlcwotCQkJcHV0cyBzdGRlcnIgIm5zZWN0eXBlcz0kbnNlY3R5cGVzIgotCQkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnNlY3R5cGVzfSB7aW5jciBpfSB7Ci0JCQkJc2V0IHQgW3ZyZWFkIDEgJHNlcnZlcl9zb2NrXQotCQkJCWJpbmFyeSBzY2FuICR0IGMgc3QKLQkJCQlwdXRzIHN0ZGVyciAiICAgJGk6ICRzdCIKLQkJCQlzZXQgdHlwZXMoJHN0KSAkaQotCQkJfQotCQkJc2V0IHVzZSAxCi0JCQlpZiBbaW5mbyBleGlzdHMgdHlwZXMoMSldIHsKLQkJCQlzZXQgdXNlIDEKLQkJCX0gZWxzZWlmIFtpbmZvIGV4aXN0cyB0eXBlcygyKV0gewotCQkJCXNldCB1c2UgMgotCQkJfSBlbHNlIHsKLQkJCQlwdXRzIHN0ZGVyciAibm8gdmFsaWQgc2VjdHlwZXMiCQotCQkJCWRlc3Ryb3kgLjsgZXhpdCAxCi0JCQl9Ci0JCQkjIHRoaXMgc2hvdWxkIGJlIE1TQjoKLQkJCXZzZW5kX3VjaGFyICR2aWV3ZXJfc29jayAwCi0JCQl2c2VuZF91Y2hhciAkdmlld2VyX3NvY2sgMAotCQkJdnNlbmRfdWNoYXIgJHZpZXdlcl9zb2NrIDAKLQkJCXZzZW5kX3VjaGFyICR2aWV3ZXJfc29jayAkdXNlCi0KLQkJCXZzZW5kX3VjaGFyICRzZXJ2ZXJfc29jayAkdXNlCi0JCQlpZiB7JHVzZSA9PSAxfSB7Ci0JCQkJc2V0IHQgW3ZyZWFkIDQgJHNlcnZlcl9zb2NrXQotCQkJfQotCQl9Ci0JfSBlbHNlaWYgeyRocyhzZWN0eXBlKSA9PSAkcmZiU2VjVHlwZVZlbmNyeXB0fSB7Ci0JCXB1dHMgc3RkZXJyICJoYW5kbGluZyByZmJTZWNUeXBlVmVuY3J5cHQiCi0JCWlmIHshIFtpbmZvIGV4aXN0cyBocyhzdWJ0eXBlKV19IHsKLQkJCXB1dHMgc3RkZXJyICJubyBzdWJ0eXBlIgkKLQkJCWRlc3Ryb3kgLjsgZXhpdCAxCi0JCX0KLQkJc2V0IGZha2VfdHlwZSAiTm9uZSIKLQkJc2V0IHBsYWluIDAKLQotCQlzZXQgc3ViX3R5cGUgJGhzKHN1YnR5cGUpCi0KLQotCQlpZiB7JHN1Yl90eXBlID09ICRyZmJWZW5jcnlwdFRsc05vbmV9IHsKLQkJCXNldCBmYWtlX3R5cGUgIk5vbmUiCi0JCX0gZWxzZWlmIHskc3ViX3R5cGUgPT0gJHJmYlZlbmNyeXB0VGxzVm5jfSB7Ci0JCQlzZXQgZmFrZV90eXBlICJWbmNBdXRoIgotCQl9IGVsc2VpZiB7JHN1Yl90eXBlID09ICRyZmJWZW5jcnlwdFRsc1BsYWlufSB7Ci0JCQlzZXQgZmFrZV90eXBlICJOb25lIgotCQkJc2V0IHBsYWluIDEKLQkJfSBlbHNlaWYgeyRzdWJfdHlwZSA9PSAkcmZiVmVuY3J5cHRYNTA5Tm9uZX0gewotCQkJc2V0IGZha2VfdHlwZSAiTm9uZSIKLQkJfSBlbHNlaWYgeyRzdWJfdHlwZSA9PSAkcmZiVmVuY3J5cHRYNTA5Vm5jfSB7Ci0JCQlzZXQgZmFrZV90eXBlICJWbmNBdXRoIgotCQl9IGVsc2VpZiB7JHN1Yl90eXBlID09ICRyZmJWZW5jcnlwdFg1MDlQbGFpbn0gewotCQkJc2V0IGZha2VfdHlwZSAiTm9uZSIKLQkJCXNldCBwbGFpbiAxCi0JCX0KLQotCQlpZiB7JHBsYWlufSB7Ci0JCQlzZXQgdXAgW2dldF91c2VyX3Bhc3NdCi0JCQlpZiBbcmVnZXhwIHtAfSAkdXBdIHsKLQkJCQlzZXQgdXNlciAkdXAKLQkJCQlzZXQgcGFzcyAkdXAKLQkJCQlyZWdzdWIge0AuKiR9ICAkdXNlciAiIiB1c2VyCi0JCQkJcmVnc3ViIHteW15AXSpAfSAkcGFzcyAiIiBwYXNzCi0JCQkJdnNlbmRfdWNoYXIgJHNlcnZlcl9zb2NrIDAKLQkJCQl2c2VuZF91Y2hhciAkc2VydmVyX3NvY2sgMAotCQkJCXZzZW5kX3VjaGFyICRzZXJ2ZXJfc29jayAwCi0JCQkJdnNlbmRfdWNoYXIgJHNlcnZlcl9zb2NrIFtzdHJpbmcgbGVuZ3RoICR1c2VyXQotCQkJCXZzZW5kX3VjaGFyICRzZXJ2ZXJfc29jayAwCi0JCQkJdnNlbmRfdWNoYXIgJHNlcnZlcl9zb2NrIDAKLQkJCQl2c2VuZF91Y2hhciAkc2VydmVyX3NvY2sgMAotCQkJCXZzZW5kX3VjaGFyICRzZXJ2ZXJfc29jayBbc3RyaW5nIGxlbmd0aCAkcGFzc10KLQkJCQlwdXRzIHN0ZGVyciAic2VuZGluZyBWZW5jcnlwdFBsYWluIHVzZXIgYW5kIHBhc3MuIgotCQkJCXB1dHMgLW5vbmV3bGluZSAkc2VydmVyX3NvY2sgJHVzZXIKLQkJCQlwdXRzIC1ub25ld2xpbmUgJHNlcnZlcl9zb2NrICRwYXNzCi0JCQkJZmx1c2ggJHNlcnZlcl9zb2NrCi0JCQl9Ci0JCX0KLQkJc2V0IGZ0IDAKLQkJaWYgeyRmYWtlX3R5cGUgPT0gIk5vbmUifSB7Ci0JCQlzZXQgZnQgMQotCQl9IGVsc2VpZiB7JGZha2VfdHlwZSA9PSAiVm5jQXV0aCJ9IHsKLQkJCXNldCBmdCAyCi0JCX0gZWxzZSB7Ci0JCQlwdXRzIHN0ZGVyciAibm8gdmFsaWQgZmFrZV90eXBlIgkKLQkJCWRlc3Ryb3kgLjsgZXhpdCAxCi0JCX0KLQotCQlpZiB7JHZpZXdlcl9tYWpvciA+IDMgfHwgJHZpZXdlcl9taW5vciA+PSA3fSB7Ci0JCQl2c2VuZF91Y2hhciAkdmlld2VyX3NvY2sgMQotCQkJdnNlbmRfdWNoYXIgJHZpZXdlcl9zb2NrICRmdAotCQkJc2V0IHQgW3ZyZWFkIDEgJHZpZXdlcl9zb2NrXQotCQkJYmluYXJ5IHNjYW4gJHQgYyBjcgotCQkJaWYgeyRjciAhPSAkZnR9IHsKLQkJCQlwdXRzIHN0ZGVyciAiY2xpZW50IHNlbGVjdGVkIHdyb250IHR5cGUgJGNyICRmdCIJCi0JCQkJZGVzdHJveSAuOyBleGl0IDEKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXB1dHMgc3RkZXJyICJ2aWV3ZXIgPD0gMy4zLCBmYWtpbmcgdGhpbmdzIHVwLiIKLQkJCSMgdGhpcyBzaG91bGQgYmUgTVNCOgotCQkJdnNlbmRfdWNoYXIgJHZpZXdlcl9zb2NrIDAKLQkJCXZzZW5kX3VjaGFyICR2aWV3ZXJfc29jayAwCi0JCQl2c2VuZF91Y2hhciAkdmlld2VyX3NvY2sgMAotCQkJdnNlbmRfdWNoYXIgJHZpZXdlcl9zb2NrICRmdAotCi0JCQlpZiB7JGZ0ID09IDF9IHsKLQkJCQlzZXQgdCBbdnJlYWQgNCAkc2VydmVyX3NvY2tdCi0JCQl9Ci0JCX0KLQl9Ci0KLQlnbG9iYWwgY2xpZW50X2ZoIHNlcnZlcl9maAotCXNldCBjbGllbnRfZmggJHZpZXdlcl9zb2NrCi0Jc2V0IHNlcnZlcl9maCAkc2VydmVyX3NvY2sKLQotCWZpbGVldmVudCAkY2xpZW50X2ZoIHJlYWRhYmxlIHhmZXJfaW5fdG9fb3V0Ci0JZmlsZWV2ZW50ICRzZXJ2ZXJfZmggcmVhZGFibGUgeGZlcl9vdXRfdG9faW4KLX0KLQotcHJvYyB2c2VuZF91Y2hhciB7c29jayBufSB7Ci0Jc2V0IHMgW2JpbmFyeSBmb3JtYXQgYyAkbl0KLQlwdXRzIC1ub25ld2xpbmUgJHNvY2sgJHMKLQlmbHVzaCAkc29jawotfQotCi1wcm9jIHZlbmNyeXB0X2NvbnN0YW50cyB7fSB7Ci0JdXBsZXZlbCB7Ci0JCXNldCByZmJTZWNUeXBlQW5vblRscyAgMTgKLQkJc2V0IHJmYlNlY1R5cGVWZW5jcnlwdCAxOQotCi0JCXNldCByZmJWZW5jcnlwdFBsYWluICAgICAgICAyNTYKLQkJc2V0IHJmYlZlbmNyeXB0VGxzTm9uZSAgICAgIDI1NwotCQlzZXQgcmZiVmVuY3J5cHRUbHNWbmMgICAgICAgMjU4Ci0JCXNldCByZmJWZW5jcnlwdFRsc1BsYWluICAgICAyNTkKLQkJc2V0IHJmYlZlbmNyeXB0WDUwOU5vbmUgICAgIDI2MAotCQlzZXQgcmZiVmVuY3J5cHRYNTA5Vm5jICAgICAgMjYxCi0JCXNldCByZmJWZW5jcnlwdFg1MDlQbGFpbiAgICAyNjIKLQl9Ci19Ci0KLXByb2MgZG9fdmVuY3J5cHQge3NvY2sgd2hpY2h9IHsKLQotCXZlbmNyeXB0X2NvbnN0YW50cwotCi0Jc2V0IHQgW3ZyZWFkIDEgJHNvY2tdCi0JYmluYXJ5IHNjYW4gJHQgYyB2c19tYWpvcgotCXNldCB0IFt2cmVhZCAxICRzb2NrXQotCWJpbmFyeSBzY2FuICR0IGMgdnNfbWlub3IKLQotCWlmIHskdnNfbWlub3IgPT0gIiIgfHwgJHZzX21ham9yID09ICIiIHx8ICR2c19tYWpvciAhPSAwIHx8ICR2c19taW5vciA8IDJ9IHsKLQkJcHV0cyBzdGRlcnIgInZlbmNyeXB0IGZhaWx1cmUgYmFkIHZzIHZlcnNpb24gbWFqb3I9JG1ham9yIG1pbm9yPSRtaW5vciIKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0JcHV0cyBzdGRlcnIgInNlcnZlciB2ZW5jcnlwdCB2ZXJzaW9uICR2c19tYWpvci4kdnNfbWlub3IiCi0JYm1lc2cgInNlcnZlciB2ZW5jcnlwdCB2ZXJzaW9uICR2c19tYWpvci4kdnNfbWlub3IiCi0KLQlhcHBlbmRfaGFuZHNoYWtlICJzdWJ2ZXJzaW9uPTAuMiIKLQl2c2VuZF91Y2hhciAkc29jayAwCi0JdnNlbmRfdWNoYXIgJHNvY2sgMgotCi0Jc2V0IHQgW3ZyZWFkIDEgJHNvY2tdCi0JYmluYXJ5IHNjYW4gJHQgYyByZXN1bHQKLQlpZiB7JHJlc3VsdCAhPSAwfSB7Ci0JCXB1dHMgc3RkZXJyICJ2ZW5jcnlwdCBmYWlsZWQgcmVzdWx0OiAkcmVzdWx0IgotCQlibWVzZyAidmVuY3J5cHQgZmFpbGVkIHJlc3VsdDogJHJlc3VsdCIKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0KLQlzZXQgdCBbdnJlYWQgMSAkc29ja10KLQliaW5hcnkgc2NhbiAkdCBjIG5zdWJ0eXBlcwotCXB1dHMgc3RkZXJyICJuc3VidHlwZXM6ICRuc3VidHlwZXMiCi0JYm1lc2cgIm5zdWJ0eXBlczogJG5zdWJ0eXBlcyIKLQotCWZvciB7c2V0IGkgMH0geyRpIDwgJG5zdWJ0eXBlc30ge2luY3IgaX0gewotCQlzZXQgdCBbdnJlYWQgNCAkc29ja10KLQkJYmluYXJ5IHNjYW4gJHQgSSBzdHlwZQotCQlwdXRzIHN0ZGVyciAic3VidHlwZXM6ICRpOiAkc3R5cGUiCi0JCWFwcGVuZF9oYW5kc2hha2UgInNzdCRpPSRzdHlwZSIKLQkJc2V0IHN1YnR5cGVzKCRzdHlwZSkgJGkKLQl9Ci0KLQlzZXQgc3VidHlwZSAwCi0JaWYgW2luZm8gZXhpc3RzIHN1YnR5cGVzKCRyZmJWZW5jcnlwdFg1MDlOb25lKV0gewotCQlzZXQgc3VidHlwZSAkcmZiVmVuY3J5cHRYNTA5Tm9uZQotCQlwdXRzIHN0ZGVyciAic2VsZWN0ZWQgcmZiVmVuY3J5cHRYNTA5Tm9uZSIKLQl9IGVsc2VpZiBbaW5mbyBleGlzdHMgc3VidHlwZXMoJHJmYlZlbmNyeXB0WDUwOVZuYyldIHsKLQkJc2V0IHN1YnR5cGUgJHJmYlZlbmNyeXB0WDUwOVZuYwotCQlwdXRzIHN0ZGVyciAic2VsZWN0ZWQgcmZiVmVuY3J5cHRYNTA5Vm5jIgotCX0gZWxzZWlmIFtpbmZvIGV4aXN0cyBzdWJ0eXBlcygkcmZiVmVuY3J5cHRYNTA5UGxhaW4pXSB7Ci0JCXNldCBzdWJ0eXBlICRyZmJWZW5jcnlwdFg1MDlQbGFpbgotCQlwdXRzIHN0ZGVyciAic2VsZWN0ZWQgcmZiVmVuY3J5cHRYNTA5UGxhaW4iCi0JfSBlbHNlaWYgW2luZm8gZXhpc3RzIHN1YnR5cGVzKCRyZmJWZW5jcnlwdFRsc05vbmUpXSB7Ci0JCXNldCBzdWJ0eXBlICRyZmJWZW5jcnlwdFRsc05vbmUKLQkJcHV0cyBzdGRlcnIgInNlbGVjdGVkIHJmYlZlbmNyeXB0VGxzTm9uZSIKLQl9IGVsc2VpZiBbaW5mbyBleGlzdHMgc3VidHlwZXMoJHJmYlZlbmNyeXB0VGxzVm5jKV0gewotCQlzZXQgc3VidHlwZSAkcmZiVmVuY3J5cHRUbHNWbmMKLQkJcHV0cyBzdGRlcnIgInNlbGVjdGVkIHJmYlZlbmNyeXB0VGxzVm5jIgotCX0gZWxzZWlmIFtpbmZvIGV4aXN0cyBzdWJ0eXBlcygkcmZiVmVuY3J5cHRUbHNQbGFpbildIHsKLQkJc2V0IHN1YnR5cGUgJHJmYlZlbmNyeXB0VGxzUGxhaW4KLQkJcHV0cyBzdGRlcnIgInNlbGVjdGVkIHJmYlZlbmNyeXB0VGxzUGxhaW4iCi0JfQotCWFwcGVuZF9oYW5kc2hha2UgInN1YnR5cGU9JHN1YnR5cGUiCi0Jc2V0IHN0IFtiaW5hcnkgZm9ybWF0IEkgJHN1YnR5cGVdCi0JcHV0cyAtbm9uZXdsaW5lICRzb2NrICRzdAotCWZsdXNoICRzb2NrCi0JCi0JaWYgeyRzdWJ0eXBlID09IDB9IHsKLQkJcHV0cyBzdGRlcnIgInZlbmNyeXB0IGNvdWxkIG5vdCBmaW5kIGFuIGFjY2VwdGFibGUgc3VidHlwZTogJHN1YnR5cGUiCi0JCWRlc3Ryb3kgLjsgZXhpdCAxCi0JfQotCi0Jc2V0IHQgW3ZyZWFkIDEgJHNvY2tdCi0JYmluYXJ5IHNjYW4gJHQgYyByZXN1bHQKLQlwdXRzIHN0ZGVyciAicmVzdWx0PSRyZXN1bHQiCi0KLQlhcHBlbmRfaGFuZHNoYWtlICJkb25lIgotCi0JaWYgeyRyZXN1bHQgPT0gMH0gewotCQlwdXRzIHN0ZGVyciAidmVuY3J5cHQgZmFpbHVyZSByZXN1bHQ6ICRyZXN1bHQiCi0JCWRlc3Ryb3kgLjsgZXhpdCAxCi0JfQotCi19Ci0KLXByb2MgZG9fY29ubmVjdF92ZW5jcnlwdCB7c29jayBob3N0cG9ydCB3aGljaH0gewotCWdsb2JhbCBkZWJ1ZyBjdXJfcHJveHkKLQotCXZlbmNyeXB0X2NvbnN0YW50cwotCi0JcHV0cyBzdGRlcnIgInB4eT0kd2hpY2ggdmVuY3J5cHQgJGhvc3Rwb3J0IHZpYSAkY3VyX3Byb3h5IgotCWJtZXNnICJWOiAkd2hpY2ggdmVuY3J5cHQgJGhvc3Rwb3J0IHZpYSAkY3VyX3Byb3h5IgotCi0JYXBwZW5kX2hhbmRzaGFrZSAibW9kZT1jb25uZWN0IgotCi0Jc2V0IHNyZmIgW3ZyZWFkIDEyICRzb2NrXQotCXB1dHMgc3RkZXJyICJzcmZiOiAkc3JmYiIKLQlibWVzZyAic3JmYjogJHNyZmIiCi0Jc2V0IHNyZmIgW3N0cmluZyB0cmltICRzcmZiXQotCWFwcGVuZF9oYW5kc2hha2UgInNlcnZlcj0kc3JmYiIKLQotCXNldCBtaW5vciAiIgotCWlmIFtyZWdleHAge15SRkIgMDBbNDU2XVwufSAkc3JmYl0gewotCQlzZXQgbWlub3IgOAotCX0gZWxzZWlmIFtyZWdleHAge15SRkIgMDAzXC4wKihbMC05XVswLTldKil9ICRzcmZiIG12YXIgbWlub3JdIHsKLQkJOwotCX0KLQlpZiB7JG1pbm9yID09ICIiIHx8ICRtaW5vciA8IDd9IHsKLQkJcHV0cyBzdGRlcnIgInZlbmNyeXB0IGZhaWx1cmUgYmFkIG1pbm9yPSRtaW5vciIKLQkJZGVzdHJveSAuOyBleGl0IDEKLQl9Ci0KLQlzZXQgdnJmYiAiUkZCIDAwMy4wMDhcbiIKLQlpZiB7JG1pbm9yID09IDd9IHsKLQkJc2V0IHZyZmIgIlJGQiAwMDMuMDA3XG4iCi0JfQotCXB1dHMgLW5vbmV3bGluZSAkc29jayAkdnJmYgotCWZsdXNoICRzb2NrCi0KLQlzZXQgdnJmYiBbc3RyaW5nIHRyaW0gJHZyZmJdIAotCWFwcGVuZF9oYW5kc2hha2UgInZpZXdlcj0kdnJmYiIKLQlhcHBlbmRfaGFuZHNoYWtlICJsYXRlbmN5PTAuMTAiCi0KLQlzZXQgc3RyIFt2cmVhZCAxICRzb2NrXQotCWJpbmFyeSBzY2FuICRzdHIgYyBuc2VjCi0JcHV0cyBzdGRlcnIgIm5zZWM6ICRuc2VjIgotCWJtZXNnICJuc2VjOiAkbnNlYyIKLQlmb3Ige3NldCBpIDB9IHskaSA8ICRuc2VjfSB7aW5jciBpfSB7Ci0JCXNldCBzdHIgW3ZyZWFkIDEgJHNvY2tdCi0JCWJpbmFyeSBzY2FuICRzdHIgYyBzZWMKLQkJcHV0cyBzdGRlcnIgInNlYzogJHNlYyIKLQkJYm1lc2cgInNlYzogJHNlYyIKLQkJc2V0IHNlY3R5cGVzKCRpKSAkc2VjCi0JfQotCWZvciB7c2V0IGkgMH0geyRpIDwgJG5zZWN9IHtpbmNyIGl9IHsKLQkJaWYgeyRzZWN0eXBlcygkaSkgPT0gJHJmYlNlY1R5cGVWZW5jcnlwdH0gewotCQkJYXBwZW5kX2hhbmRzaGFrZSAic2VjdHlwZT0kcmZiU2VjVHlwZVZlbmNyeXB0IgotCQkJdnNlbmRfdWNoYXIgJHNvY2sgJHJmYlNlY1R5cGVWZW5jcnlwdAotCQkJYWZ0ZXIgNTAwCi0JCQlibWVzZyAiZG9fdmVuY3J5cHQgJHNvY2sgJHdoaWNoIgotCQkJZG9fdmVuY3J5cHQgJHNvY2sgJHdoaWNoCi0JCQlyZXR1cm4KLQkJfQotCX0KLQlmb3Ige3NldCBpIDB9IHskaSA8ICRuc2VjfSB7aW5jciBpfSB7Ci0JCWlmIHskc2VjdHlwZXMoJGkpID09ICRyZmJTZWNUeXBlQW5vblRsc30gewotCQkJYXBwZW5kX2hhbmRzaGFrZSAic2VjdHlwZT0kcmZiU2VjVHlwZUFub25UbHMiCi0JCQl2c2VuZF91Y2hhciAkc29jayAkcmZiU2VjVHlwZUFub25UbHMKLQkJCWJtZXNnICJyZmJTZWNUeXBlQW5vblRscyIKLQkJCWFmdGVyIDUwMAotCQkJYXBwZW5kX2hhbmRzaGFrZSAiZG9uZSIKLQkJCXJldHVybgotCQl9Ci0JfQotfQotCi1wcm9jIGRvX2Nvbm5lY3Qge3NvY2sgdHlwZSBob3N0cG9ydCB3aGljaH0gewotCWlmIHskdHlwZSA9PSAiaHR0cCJ9IAl7Ci0JCWRvX2Nvbm5lY3RfaHR0cCAkc29jayAkaG9zdHBvcnQgJHdoaWNoCi0JfSBlbHNlaWYgeyR0eXBlID09ICJzb2NrcyJ9IHsKLQkJZG9fY29ubmVjdF9zb2NrczQgJHNvY2sgJGhvc3Rwb3J0ICR3aGljaAotCX0gZWxzZWlmIHskdHlwZSA9PSAic29ja3M1In0gewotCQlkb19jb25uZWN0X3NvY2tzNSAkc29jayAkaG9zdHBvcnQgJHdoaWNoCi0JfSBlbHNlaWYgW3JlZ2V4cCAtbm9jYXNlIHtecmVwZWF0ZXI6fSAkdHlwZV0gewotCQlyZWdzdWIgLW5vY2FzZSB7XnJlcGVhdGVyOn0gJHR5cGUgIiIgcmVwZWF0ZXIKLQkJZG9fY29ubmVjdF9yZXBlYXRlciAkc29jayAkaG9zdHBvcnQgJHdoaWNoICRyZXBlYXRlcgotCX0gZWxzZWlmIHskdHlwZSA9PSAidmVuY3J5cHQifSB7Ci0JCWRvX2Nvbm5lY3RfdmVuY3J5cHQgJHNvY2sgJGhvc3Rwb3J0ICR3aGljaAotCX0KLX0KLQotcHJvYyBoYW5kbGVfY29ubmVjdGlvbiB7ZmggaG9zdCBwb3J0fSB7Ci0JZ2xvYmFsIHByb3h5MV9ob3N0IHByb3h5MV9wb3J0IHByb3h5MV90eXBlCi0JZ2xvYmFsIHByb3h5Ml9ob3N0IHByb3h5Ml9wb3J0IHByb3h5Ml90eXBlCi0JZ2xvYmFsIHByb3h5M19ob3N0IHByb3h5M19wb3J0IHByb3h5M190eXBlCi0JZ2xvYmFsIHByb3h5MSBwcm94eTIgcHJveHkzIGRlc3QKLQlnbG9iYWwgZGVidWcgY3VyX3Byb3h5Ci0JZ2xvYmFsIGdvdF9jb25uZWN0aW9uCi0KLQlpZiB7JGdvdF9jb25uZWN0aW9ufSB7Ci0JCWNhdGNoIHtjbG9zZSAkZmh9Ci0JCXJldHVybgotCX0KLQlzZXQgZ290X2Nvbm5lY3Rpb24gMQotCi0JaWYgeyRkZWJ1Z30gewotCQlwdXRzIHN0ZGVyciAiY29ubmVjdGlvbiBmcm9tOiAkaG9zdCAkcG9ydCIJCi0JCXB1dHMgc3RkZXJyICJzb2NrZXQgJHByb3h5MV9ob3N0ICRwcm94eTFfcG9ydCIKLQl9Ci0KLQlzZXQgcmMgW2NhdGNoIHtzZXQgc29jayBbc29ja2V0ICRwcm94eTFfaG9zdCAkcHJveHkxX3BvcnRdfV0KLQlpZiB7JHJjICE9IDB9IHsKLQkJcHV0cyBzdGRlcnIgImVycm9yIGNvbm5lY3RpbmciCQotCQljYXRjaCB7Y2xvc2UgJHNvY2t9Ci0JCWRlc3Ryb3kgLgotCQlleGl0Ci0JfQotCi0JaWYgeyRkZWJ1Z30gewotCQlwdXRzIHN0ZGVyciAiZ290IHNvY2s6ICRzb2NrIgkKLQl9Ci0JCi0JZ2xvYmFsIGNsaWVudF9maCBzZXJ2ZXJfZmgKLQlzZXQgY2xpZW50X2ZoICRmaAotCXNldCBzZXJ2ZXJfZmggJHNvY2sKLQotCWZjb25maWd1cmUgJGZoICAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtYmxvY2tpbmcgMAotCWZjb25maWd1cmUgJHNvY2sgLXRyYW5zbGF0aW9uIGJpbmFyeSAtYmxvY2tpbmcgMAotCi0Jc2V0IGN1cl9wcm94eSAkcHJveHkxCi0JaWYgeyRwcm94eTIgIT0gIiJ9IHsKLQkJZG9fY29ubmVjdCAkc29jayAkcHJveHkxX3R5cGUgIiRwcm94eTJfaG9zdDokcHJveHkyX3BvcnQiIDEKLQotCQlzZXQgY3VyX3Byb3h5ICRwcm94eTIKLQkJaWYgeyRwcm94eTMgIT0gIiJ9IHsKLQkJCWRvX2Nvbm5lY3QgJHNvY2sgJHByb3h5Ml90eXBlICIkcHJveHkzX2hvc3Q6JHByb3h5M19wb3J0IiAyCi0KLQkJCXNldCBjdXJfcHJveHkgJHByb3h5MwotCQkJZG9fY29ubmVjdCAkc29jayAkcHJveHkzX3R5cGUgJGRlc3QgMwotCi0JCX0gZWxzZSB7Ci0JCQlkb19jb25uZWN0ICRzb2NrICRwcm94eTJfdHlwZSAkZGVzdCAyCi0JCX0KLQl9IGVsc2UgewotCQlkb19jb25uZWN0ICRzb2NrICRwcm94eTFfdHlwZSAkZGVzdCAxCi0JfQotCi0JZmlsZWV2ZW50ICRmaCAgIHJlYWRhYmxlIHhmZXJfaW5fdG9fb3V0Ci0JZmlsZWV2ZW50ICRzb2NrIHJlYWRhYmxlIHhmZXJfb3V0X3RvX2luCi19Ci0KLXByb2MgcHJveHlfdHlwZSB7cHJveHl9IHsKLQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15zb2NrczovL30gJHByb3h5XSB7Ci0JCXJldHVybiAic29ja3MiCi0JfSBlbHNlaWYgW3JlZ2V4cCAtbm9jYXNlIHtec29ja3M0Oi8vfSAkcHJveHldIHsKLQkJcmV0dXJuICJzb2NrcyIKLQl9IGVsc2VpZiBbcmVnZXhwIC1ub2Nhc2Uge15zb2NrczRhOi8vfSAkcHJveHldIHsKLQkJcmV0dXJuICJzb2NrcyIKLQl9IGVsc2VpZiBbcmVnZXhwIC1ub2Nhc2Uge15zb2NrczU6Ly99ICRwcm94eV0gewotCQlyZXR1cm4gInNvY2tzNSIKLQl9IGVsc2VpZiBbcmVnZXhwIC1ub2Nhc2Uge15odHRwOi8vfSAkcHJveHldIHsKLQkJcmV0dXJuICJodHRwIgotCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7Xmh0dHBzOi8vfSAkcHJveHldIHsKLQkJcmV0dXJuICJodHRwIgotCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7XnJlcGVhdGVyOi8vLipcKyguKikkfSAkcHJveHkgbWF0IGlkc3RyXSB7Ci0JCXJldHVybiAicmVwZWF0ZXI6JGlkc3RyIgotCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7XnZlbmNyeXB0Oi8vfSAkcHJveHldIHsKLQkJcmV0dXJuICJ2ZW5jcnlwdCIKLQl9IGVsc2UgewotCQlyZXR1cm4gImh0dHAiCi0JfQotfQotCi1wcm9jIHByb3h5X2hvc3Rwb3J0IHtwcm94eX0gewotCXJlZ3N1YiAtbm9jYXNlIHteW2Etel1bYS16MC05XSo6Ly99ICRwcm94eSAiIiBocAotCXJlZ3N1YiB7XCsuKiR9ICRocCAiIiBocAotCWlmIHshIFtyZWdleHAgezpbMC05XX0gJGhwXSAmJiBbcmVnZXhwIHtecmVwZWF0ZXI6fSAkcHJveHldfSB7Ci0JCXNldCBocCAiJGhwOjU5MDAiCi0JfQotCXJldHVybiAkaHAKLX0KLQotcHJvYyBzZXRiIHt9IHsKLQl3bSB3aXRoZHJhdyAuCi0JY2F0Y2gge2Rlc3Ryb3kgLmJ9Ci0JYnV0dG9uIC5iIC10ZXh0ICJDT05ORUNUX0JSIiAtY29tbWFuZCB7ZGVzdHJveSAufQotCXBhY2sgLmIKLQlhZnRlciAxMDAwIGNoZWNrX2NhbGxiYWNrIAotfQotCi1wcm9jIGNvbm5lY3RfYnJfc2xlZXAge30gewotCWdsb2JhbCBlbnYKLQlpZiBbaW5mbyBleGlzdHMgZW52KENPTk5FQ1RfQlJfU0xFRVApXSB7Ci0JCWlmIFtyZWdleHAge15bMC05XVswLTldKiR9ICRlbnYoQ09OTkVDVF9CUl9TTEVFUCldIHsKLQkJCXNldGIKLQkJCWZvciB7c2V0IGkgMH0geyRpIDwgJGVudihDT05ORUNUX0JSX1NMRUVQKX0ge2luY3IgaX0gewotCQkJCWJtZXNnICIkaSBzbGVlcCIJCi0JCQkJYWZ0ZXIgMTAwMAotCQkJfQotCQl9Ci0JfQotfQotCi1nbG9iYWwgZW52Ci0KLXNldCBnb3RfY29ubmVjdGlvbiAwCi1zZXQgcHJveHkxICIiCi1zZXQgcHJveHkyICIiCi1zZXQgcHJveHkzICIiCi1zZXQgY2xpZW50X2ZoICIiCi1zZXQgc2VydmVyX2ZoICIiCi1zZXQgZG9fYnJpZGdlIDAKLXNldCBkZWJ1ZyAwCi0KLWlmIFtpbmZvIGV4aXN0cyBlbnYoQ09OTkVDVF9CUl9ERUJVRyldIHsKLQlzZXQgZGVidWcgMQotfQotCi1pZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX1ZFTkNSWVBUX1ZJRVdFUl9CUklER0UpXSB7Ci0Jc2V0IHMgW3NwbGl0ICRlbnYoU1NWTkNfVkVOQ1JZUFRfVklFV0VSX0JSSURHRSkgIiwiXQotCXNldCBsaXN0ZW4gIFtsaW5kZXggJHMgMF0KLQlzZXQgY29ubmVjdCBbbGluZGV4ICRzIDFdCi0KLQlzZXRiCi0KLQlkb192ZW5jcnlwdF92aWV3ZXJfYnJpZGdlICRsaXN0ZW4gJGNvbm5lY3QKLQlzZXQgZG9fYnJpZGdlIDEKLX0KLQotaWYgeyRkb19icmlkZ2V9IHsKLQk7Ci19IGVsc2UgewotCWlmIHskZGVidWcgJiYgMH0gewotCQlpZiB7ISBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0RFU1QpXX0gewotCQkJc2V0IGVudihTU1ZOQ19ERVNUKSAiaGF5c3RhY2s6MjAzNyIKLQkJfQotCQlpZiB7ISBbaW5mbyBleGlzdHMgZW52KFNTVk5DX1BST1hZKV19IHsKLQkJCXNldCBlbnYoU1NWTkNfUFJPWFkpICJoYXlzdGFjazoyMDM3IgotCQl9Ci0JCWlmIHshIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTElTVEVOKV19IHsKLQkJCXNldCBlbnYoU1NWTkNfTElTVEVOKSAiNjc4OSIKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIHshIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfREVTVCldfSB7Ci0JCQlkZXN0cm95IC47IGV4aXQ7Ci0JCX0KLQkJaWYgeyEgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19QUk9YWSldfSB7Ci0JCQlkZXN0cm95IC47IGV4aXQ7Ci0JCX0KLQkJaWYgeyEgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19MSVNURU4pXSAmJiAhIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfUkVWRVJTRSldfSB7Ci0JCQlkZXN0cm95IC47IGV4aXQ7Ci0JCX0KLQl9Ci0KLQkjc2V0IGVudihCTUVTRykgMQotCi0Jc2V0IGRlc3QgJGVudihTU1ZOQ19ERVNUKQotCi0JaWYgW3JlZ2V4cCB7LH0gJGVudihTU1ZOQ19QUk9YWSldIHsKLQkJc2V0IHMgW3NwbGl0ICRlbnYoU1NWTkNfUFJPWFkpICIsIl0KLQkJc2V0IHByb3h5MSBbbGluZGV4ICRzIDBdCi0JCXNldCBwcm94eTIgW2xpbmRleCAkcyAxXQotCQlzZXQgcHJveHkzIFtsaW5kZXggJHMgMl0KLQl9IGVsc2UgewotCQlzZXQgcHJveHkxICRlbnYoU1NWTkNfUFJPWFkpCi0JfQotCi0Jc2V0IHByb3h5MV90eXBlIFtwcm94eV90eXBlICAgICAkcHJveHkxXQotCXNldCBwcm94eTFfaHAgICBbcHJveHlfaG9zdHBvcnQgJHByb3h5MV0KLQotCXNldCBwcm94eTFfaG9zdCAiIgotCXNldCBwcm94eTFfcG9ydCAiIgotCWlmIFtyZWdleHAge14oLiopOihbMC05XVswLTldKikkfSAkcHJveHkxX2hwIG12YXIgcHJveHkxX2hvc3QgcHJveHkxX3BvcnRdIHsKLQkJOwotCX0gZWxzZSB7Ci0JCXB1dHMgc3RkZXJyICJjb3VsZCBub3QgcGFyc2UgaHAxIGhvc3Q6cG9ydCAkcHJveHkxX2hwIgotCQlkZXN0cm95IC4KLQkJZXhpdCAxCi0JfQotCi0Jc2V0IHByb3h5Ml90eXBlICIiCi0Jc2V0IHByb3h5Ml9ob3N0ICIiCi0Jc2V0IHByb3h5Ml9wb3J0ICIiCi0KLQlpZiB7JHByb3h5MiAhPSAiIn0gewotCQlzZXQgcHJveHkyX3R5cGUgW3Byb3h5X3R5cGUgICAgICRwcm94eTJdCi0JCXNldCBwcm94eTJfaHAgICBbcHJveHlfaG9zdHBvcnQgJHByb3h5Ml0KLQotCQlzZXQgcHJveHkyX2hvc3QgIiIKLQkJc2V0IHByb3h5Ml9wb3J0ICIiCi0JCWlmIFtyZWdleHAge14oLiopOihbMC05XVswLTldKikkfSAkcHJveHkyX2hwIG12YXIgcHJveHkyX2hvc3QgcHJveHkyX3BvcnRdIHsKLQkJCTsKLQkJfSBlbHNlIHsKLQkJCXB1dHMgc3RkZXJyICJjb3VsZCBub3QgcGFyc2UgaHAyIGhvc3Q6cG9ydCAkcHJveHkyX2hwIgotCQkJZGVzdHJveSAuCi0JCQlleGl0IDEKLQkJfQotCX0KLQotCXNldCBwcm94eTNfdHlwZSAiIgotCXNldCBwcm94eTNfaG9zdCAiIgotCXNldCBwcm94eTNfcG9ydCAiIgotCi0JaWYgeyRwcm94eTMgIT0gIiJ9IHsKLQkJc2V0IHByb3h5M190eXBlIFtwcm94eV90eXBlICAgICAkcHJveHkzXQotCQlzZXQgcHJveHkzX2hwICAgW3Byb3h5X2hvc3Rwb3J0ICRwcm94eTNdCi0KLQkJc2V0IHByb3h5M19ob3N0ICIiCi0JCXNldCBwcm94eTNfcG9ydCAiIgotCQlpZiBbcmVnZXhwIHteKC4qKTooWzAtOV1bMC05XSopJH0gJHByb3h5M19ocCBtdmFyIHByb3h5M19ob3N0IHByb3h5M19wb3J0XSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlwdXRzIHN0ZGVyciAiY291bGQgbm90IHBhcnNlIGhwMyBob3N0OnBvcnQgJHByb3h5M19ocCIKLQkJCWRlc3Ryb3kgLgotCQkJZXhpdCAxCi0JCX0KLQl9Ci0KLQlibWVzZyAiMTogJyRwcm94eTFfaG9zdCcgJyRwcm94eTFfcG9ydCcgJyRwcm94eTFfdHlwZSciOwotCWJtZXNnICIyOiAnJHByb3h5Ml9ob3N0JyAnJHByb3h5Ml9wb3J0JyAnJHByb3h5Ml90eXBlJyI7Ci0JYm1lc2cgIjM6ICckcHJveHkzX2hvc3QnICckcHJveHkzX3BvcnQnICckcHJveHkzX3R5cGUnIjsKLQotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfUkVWRVJTRSldIHsKLQkJc2V0IHJob3N0ICIiCi0JCXNldCBycG9ydCAiIgotCQlpZiBbcmVnZXhwIHteKC4qKTooWzAtOV1bMC05XSopJH0gJGVudihTU1ZOQ19SRVZFUlNFKSBtdmFyIHJob3N0IHJwb3J0XSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlwdXRzIHN0ZGVyciAiY291bGQgbm90IHBhcnNlIFNTVk5DX1JFVkVSU0UgaG9zdDpwb3J0ICRlbnYoU1NWTkNfUkVWRVJTRSkiCi0JCQlkZXN0cm95IC4KLQkJCWV4aXQgMQotCQl9Ci0JCXNldGIKLQkJc2V0IHJjIFtjYXRjaCB7c2V0IGxzb2NrIFtzb2NrZXQgJHJob3N0ICRycG9ydF19XQotCQlpZiB7JHJjICE9IDB9IHsKLQkJCXB1dHMgc3RkZXJyICJlcnJvciByZXZlcnNpbmciCQotCQkJYm1lc2cgIjEgZXJyb3IgcmV2ZXJzaW5nIgkKLQkJCWFmdGVyIDIwMDAKLQkJCXNldCByYyBbY2F0Y2gge3NldCBsc29jayBbc29ja2V0ICRyaG9zdCAkcnBvcnRdfV0KLQkJfQotCQlpZiB7JHJjICE9IDB9IHsKLQkJCXB1dHMgc3RkZXJyICJlcnJvciByZXZlcnNpbmciCQotCQkJYm1lc2cgIjIgZXJyb3IgcmV2ZXJzaW5nIgkKLQkJCWFmdGVyIDIwMDAKLQkJCXNldCByYyBbY2F0Y2gge3NldCBsc29jayBbc29ja2V0ICRyaG9zdCAkcnBvcnRdfV0KLQkJfQotCQlpZiB7JHJjICE9IDB9IHsKLQkJCXB1dHMgc3RkZXJyICJlcnJvciByZXZlcnNpbmciCQotCQkJYm1lc2cgIjMgZXJyb3IgcmV2ZXJzaW5nIgkKLQkJCWRlc3Ryb3kgLjsgZXhpdCAxCi0JCX0KLQkJcHV0cyBzdGRlcnIgIlNTVk5DX1JFVkVSU0UgdG8gJHJob3N0ICRycG9ydCBPSyI7Ci0JCWJtZXNnICJTU1ZOQ19SRVZFUlNFIHRvICRyaG9zdCAkcnBvcnQgT0siOwotCQljb25uZWN0X2JyX3NsZWVwCi0JCWhhbmRsZV9jb25uZWN0aW9uICRsc29jayAkcmhvc3QgJHJwb3J0Ci0JfSBlbHNlIHsKLQkJc2V0IGxwb3J0ICRlbnYoU1NWTkNfTElTVEVOKQotCQljb25uZWN0X2JyX3NsZWVwCi0JCXNldCByYyBbY2F0Y2gge3NldCBsc29jayBbc29ja2V0IC1teWFkZHIgMTI3LjAuMC4xIC1zZXJ2ZXIgaGFuZGxlX2Nvbm5lY3Rpb24gJGxwb3J0XX1dCi0JCWlmIHskcmMgIT0gMH0gewotCQkJcHV0cyBzdGRlcnIgImVycm9yIGxpc3RlbmluZyIJCi0JCQlkZXN0cm95IC47IGV4aXQgMQotCQl9Ci0JCXB1dHMgc3RkZXJyICJTU1ZOQ19MSVNURU4gb24gJGxwb3J0IE9LIjsKLQkJc2V0YgotCX0KLX0KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9lc291bmQvZG93bmxvYWQudXJsIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL2Vzb3VuZC9kb3dubG9hZC51cmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjFmNmIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL2Vzb3VuZC9kb3dubG9hZC51cmwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1odHRwOi8vd3d3LnR1eC5vcmcvfnJpY2R1ZGUvRXNvdW5ELmh0bWwKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9vcGVuc3NsL2Rvd25sb2FkLnVybCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9vcGVuc3NsL2Rvd25sb2FkLnVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3ZDRiMS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vb3BlbnNzbC9kb3dubG9hZC51cmwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1odHRwOi8vd3d3LnN0dW5uZWwub3JnL2Rvd25sb2FkL3N0dW5uZWwvd2luMzIvCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vb3BlbnNzbC9sb2NhdGlvbi51cmwgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vb3BlbnNzbC9sb2NhdGlvbi51cmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDA4NjYuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL29wZW5zc2wvbG9jYXRpb24udXJsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cDovL3d3dy5zdHVubmVsLm9yZy9kb3dubG9hZC9iaW5hcmllcy5odG1sCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vcGxpbmsvZG93bmxvYWQudXJsIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3BsaW5rL2Rvd25sb2FkLnVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzOTAxZS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vcGxpbmsvZG93bmxvYWQudXJsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrLyU3ZXNndGF0aGFtL3B1dHR5L2Rvd25sb2FkLmh0bWwKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9wbGluay9saWNlbmNlLnVybCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9wbGluay9saWNlbmNlLnVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmY2MzMS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vcGxpbmsvbGljZW5jZS51cmwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1odHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvJTdlc2d0YXRoYW0vcHV0dHkvbGljZW5jZS5odG1sCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9kb3dubG9hZC51cmwgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9kb3dubG9hZC51cmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2Q0YjEuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvZG93bmxvYWQudXJsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cDovL3d3dy5zdHVubmVsLm9yZy9kb3dubG9hZC9zdHVubmVsL3dpbjMyLwpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvbG9jYXRpb24udXJsIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvbG9jYXRpb24udXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg3NDkxLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL2xvY2F0aW9uLnVybAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotaHR0cDovL3d3dy5zdHVubmVsLm9yZy9kb3dubG9hZC9iaW5hcmllcy5odG1sCi1odHRwOi8vc3R1bm5lbC5taXJ0Lm5ldC8KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby92bmN2aWV3ZXIvZG93bmxvYWQudXJsIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3ZuY3ZpZXdlci9kb3dubG9hZC51cmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzYwZTQuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9pbmZvL3ZuY3ZpZXdlci9kb3dubG9hZC51cmwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1odHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS9kb3dubG9hZC5odG1sCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL2luZm8vdm5jdmlld2VyL2xvY2F0aW9uLnVybCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby92bmN2aWV3ZXIvbG9jYXRpb24udXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg2YWUwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvaW5mby92bmN2aWV3ZXIvbG9jYXRpb24udXJsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cDovL3d3dy50aWdodHZuYy5jb20KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvc3R1bm5lbC1jbGllbnQuY29uZiBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvc3R1bm5lbC1jbGllbnQuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxN2UyMy4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL3N0dW5uZWwtY2xpZW50LmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jCi0jIEV4YW1wbGUgU1NMIHN0dW5uZWwgQ0xJRU5UIGNvbmZpZ3VyYXRpb24gZmlsZS4gICh5b3UgcnVuIHN0dW5uZWwgb24KLSMgdGhpcyBtYWNoaW5lIGFuZCBwb2ludCB5b3VyIHZuYyB2aWV3ZXIgdG8gaXQsIGl0IGdvZXMgdG8gcmVtb3RlIFZOQwotIyBzZXJ2ZXIgdmlhIFNTTCkKLSMKLSMgVG8gdXNlIHRoaXMgZmlsZSB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgaXQuICBUaGVuIHlvdSB3aWxsIG5lZWQKLSMgdG8gbWFudWFsbHkgc3RhcnQgdXAgc3R1bm5lbCB1c2luZyBpdC4KLSMgKGUuZy4gL3BhdGgvdG8vc3R1bm5lbCBzdHVubmVsLXNlcnZlci5jb25mKQotIwotIyBUaGlzIGlzIGp1c3QgYW4gZXhhbXBsZSBhbmQgaXMgbm90IHVzZWQgYnkgdGhlIHRvb2xzIGluIHRoaXMgcGFja2FnZS4KLSMgSXQgaXMgaGVyZSB0byBzaG93IGhvdyB0byBjcmVhdGUgb3V0Z29pbmcgU1NMIGNvbm5lY3Rpb25zIHRvIHJlbW90ZQotIyBWTkMgc2VydmVycyB3aGVuIG5vdCB1c2luZyB0aGUgdG9vbHMgaW4gdGhpcyBwYWNrYWdlLgotIwotY2xpZW50ID0geWVzCi1vcHRpb25zID0gQUxMCi1STkRieXRlcyA9IDIwNDgKLVJORGZpbGUgPSBiYW5hbmFyYW5kLmJpbgotUk5Eb3ZlcndyaXRlID0geWVzCi0jCi0jIFJlbW90ZSBzZXJ2ZXIgY2VydHMgY291bGQgZ28gaGVyZToKLSMgIENBcGF0aCA9IC9wYXRoL3RvLy4uLi9jcnQtZGlyCi0jICBDQWZpbGUgPSAvcGF0aC90by8uLi4vZm9vLmNydAotIyAgdmVyaWZ5ID0gMgotIyBNeSBjZXJ0IGNvdWxkIGdvIGhlcmU6Ci0jICBjZXJ0ID0gL3BhdGgvdG8vLi4uL215LnBlbQotIwotW3ZuY10KLSMKLSMgU2V0IHRvIGxvY2FsIGxpc3RlbmluZyBwb3J0IG51bWJlciAoZS5nLiA1OTAwIGZvciB2bmMgZGlzcGxheSAwKToKLSMKLWFjY2VwdCA9IGxvY2FsaG9zdDo1OTAwCi0jCi0jIFNldCB0byByZW1vdGUgaG9zdDpwb3J0IHRvIGNvbm5lY3QgdG8gKGUuZy4gZmFyLWF3YXkuZWFzdDo1OTAwKToKLSMgKHRoaXMgaXMgd2hlcmUgdGhlIFZOQyBzZXJ2ZXIgaXMuIDowIC0+IHBvcnQgNTkwMCwgZXRjKQotIwotY29ubmVjdCA9IEhPU1Q6UE9SVAotZGVsYXkgPSBubyAKLSMKLSMgWW91IGNvdWxkIGFkZCBhZGRpdGlvbmFsIG9uZXMgZ29pbmcgdG8gb3RoZXIgVk5DIHNlcnZlcnM6Ci0jIFt2bmMyXQotIyBhY2NlcHQgPSBsb2NhbGhvc3Q6NTkwMQotIyBjb25uZWN0ID0gSE9TVDI6UE9SVDIKLSMgZXRjIC4uLgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9zdHVubmVsLXNlcnZlci5jb25mIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC9zdHVubmVsLXNlcnZlci5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTVkZDUwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9XaW5kb3dzL3V0aWwvc3R1bm5lbC1zZXJ2ZXIuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgRXhhbXBsZSBTU0wgc3R1bm5lbCBTRVJWRVIgY29uZmlndXJhdGlvbiBmaWxlLiAgKGUuZy4gZm9yIHlvdXIgVk5DCi0jIHNlcnZlciBvbiB0aGlzIHNhbWUgbWFjaGluZS4pCi0jCi0jIFRvIHVzZSB0aGlzIGZpbGUgeW91IG1heSBuZWVkIHRvIGVkaXQgaXQuICBUaGVuIHlvdSB3aWxsIG5lZWQKLSMgdG8gbWFudWFsbHkgc3RhcnQgdXAgc3R1bm5lbCB1c2luZyBpdC4KLSMgKGUuZy4gL3BhdGgvdG8vc3R1bm5lbCBzdHVubmVsLXNlcnZlci5jb25mKQotIwotIyBUaGlzIGlzIGp1c3QgYW4gZXhhbXBsZSBhbmQgaXMgbm90IHVzZWQgYnkgdGhlIHRvb2xzIGluIHRoaXMgcGFja2FnZS4KLSMgSXQgaXMgaGVyZSBpbiBjYXNlIHlvdSB3YW50ZWQgdG8gc2VlIGhvdyB0byBhZGQgU1NMIHN1cHBvcnQgdG8gYW55Ci0jIFZOQyBzZXJ2ZXIgeW91IGhhdmUuCi0jCi1STkRieXRlcyA9IDIwNDgKLVJORGZpbGUgPSBiYW5hbmFyYW5kLmJpbgotUk5Eb3ZlcndyaXRlID0geWVzCi0jCi0jIFJlbW90ZSBjbGllbnQgY2VydHMgY291bGQgZ28gaGVyZToKLSMgIENBcGF0aCA9IC9wYXRoL3RvLy4uLi9jcnQtZGlyCi0jICBDQWZpbGUgPSAvcGF0aC90by8uLi4vZm9vLmNydAotIyAgdmVyaWZ5ID0gMgotIyBNeSBzZXJ2ZXIgY2VydCBjb3VsZCBnbyBoZXJlOgotIyAgY2VydCA9IC9wYXRoL3RvLy4uLi9teS5wZW0KLSMKLVt2bmNdCi0jCi0jIFNldCB0byBsb2NhbCBsaXN0ZW5pbmcgcG9ydCBudW1iZXIgKGUuZy4gNTkwMSBmb3Igdm5jIGRpc3BsYXkgMSk6Ci0jIHNvIHRoZSByZW1vdGUgdmlld2VycyB3b3VsZCBjb25uZWN0IHRvOiB5b3VybWFjaGluZToxCi0jCi1hY2NlcHQgPSA1OTAxCi0jCi0jIFNldCB0byBsb2NhbGhvc3Q6cG9ydCB0byBjb25uZWN0IHRvIFZOQyBzZXJ2ZXIgb24gdGhpcyBzYW1lIG1hY2hpbmU6Ci0jIChFLmcuIHlvdSBydW4gV2luVk5DIG9uIDowLCBwcmVmZXJhYmx5IGxpc3RlbmluZyBvbiBsb2NhbGhvc3QpLgotIwotY29ubmVjdCA9IGxvY2FsaG9zdDo1OTAwCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL3c5OC9sb2NhdGlvbi51cmwgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvV2luZG93cy91dGlsL3c5OC9sb2NhdGlvbi51cmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTRiOTEuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL1dpbmRvd3MvdXRpbC93OTgvbG9jYXRpb24udXJsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZnRwOi8vZnRwLm1pY3Jvc29mdC5jb20vU2VydmljZXMvVGVjaE5ldC9zYW1wbGVzL1BTL1dpbjk4L1Jlc2tpdC9ESUFHTk9TRS8KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vRGFyd2luLlBvd2VyLk1hY2ludG9zaC8uY3BvdmVyIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoLy5jcG92ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZWM1YWUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoLy5jcG92ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jcCAtcCB2bmN2aWV3ZXIuc2ggdm5jdmlld2VyCi1wd2QKLWxzIC1sIHZuY3ZpZXdlci5zaCB2bmN2aWV3ZXIKLQotKGNkIC4uL0Rhcndpbi5pMzg2OyAuY3BvdmVyKQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoL3ZuY3ZpZXdlci5zaCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vRGFyd2luLlBvd2VyLk1hY2ludG9zaC92bmN2aWV3ZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZGNlZmIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uUG93ZXIuTWFjaW50b3NoL3ZuY3ZpZXdlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIGNvcHkgInZuY3ZpZXdlci5zaCIgYmFjayBvdmVyIHRvICJ2bmN2aWV3ZXIiIGluIGNhc2UgeW91IGRlbGV0ZSBvciBvdmVyd3JpdGUgaXQKLSMgdmlhIGJ1aWxkLnVuaXguIGV0YwotCi1kaXI9YGRpcm5hbWUgIiQwImAKLQotaWYgWyAiWCRTU1ZOQ19EWUxEX0xJQlJBUllfUEFUSCIgIT0gIlgiIF07IHRoZW4KLQlpZiBbICJYJERZTERfTElCUkFSWV9QQVRIIiA9ICJYIiBdIDsgdGhlbgotCQlEWUxEX0xJQlJBUllfUEFUSD0kU1NWTkNfRFlMRF9MSUJSQVJZX1BBVEgKLQllbHNlCi0JCURZTERfTElCUkFSWV9QQVRIPSREWUxEX0xJQlJBUllfUEFUSDokU1NWTkNfRFlMRF9MSUJSQVJZX1BBVEgKLQlmaQotCWV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSAotZmkKLQotaWYgWyAiWCRESVNQTEFZIiAhPSAiWCIgLWEgIlgkREFSV0lOX0NPVFZOQyIgIT0gIlgxIiBdOyB0aGVuCi0JIiRkaXIvdm5jdmlld2VyLngxMSIgIiRAIgotZWxzZQotCWFyZ3M9IiIKLQlmb3IgYSBpbiAiJEAiCi0JZG8KLQkJaWYgZWNobyAiJGEiIHwgZ3JlcCAnXi0nID4gL2Rldi9udWxsOyB0aGVuCi0JCQlhcmdzPSIkYXJncyAkYSIKLQkJZWxpZiBlY2hvICIkYSIgfCBncmVwICc6JyA+IC9kZXYvbnVsbDsgdGhlbgotCQkJaD1gZWNobyAiJGEiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi0JCQlwPWBlY2hvICIkYSIgfCBhd2sgLUY6ICd7cHJpbnQgJDJ9J2AKLQkJCWlmIFsgIlgkcCIgIT0gIlgiIF07IHRoZW4KLQkJCQlpZiBbICRwIC1sdCA1OTAwIF07IHRoZW4KLQkJCQkJcD1gZXhwciAkcCArIDU5MDBgCi0JCQkJZmkKLQkJCWZpCi0JCQlhcmdzPSIkYXJncyAkaDokcCIKLQkJZWxzZQotCQkJYXJncz0iJGFyZ3MgJGEiCi0JCWZpCi0JZG9uZQotCSIkZGlyLy4uLy4uL01hY09TWC9DaGlja2VuIG9mIHRoZSBWTkMuYXBwL0NvbnRlbnRzL01hY09TL0NoaWNrZW4gb2YgdGhlIFZOQyIgJGFyZ3MKLWZpCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL0Rhcndpbi5pMzg2Ly5jcG92ZXIgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL0Rhcndpbi5pMzg2Ly5jcG92ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMDgwYjEuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9EYXJ3aW4uaTM4Ni8uY3BvdmVyCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIS9iaW4vc2gKLQotY3AgLXAgLi4vRGFyd2luLlBvd2VyLk1hY2ludG9zaC92bmN2aWV3ZXIuc2ggLgotY3AgLXAgdm5jdmlld2VyLnNoIHZuY3ZpZXdlcgotcHdkCi1scyAtbCB2bmN2aWV3ZXIuc2ggdm5jdmlld2VyCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3NzaHZuYyBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vc3Nodm5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDI3YjQyLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vc3Nodm5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIS9iaW4vc2gKLSMgCi0jIHdyYXBwZXIgZm9yIFNTSF9PTkxZIG1vZGUgCi0jIAotUEFUSD1gZGlybmFtZSAiJDAiYDokUEFUSDsgZXhwb3J0IFBBVEgKLVNTVk5DX1NTSF9PTkxZPTE7IGV4cG9ydCBTU1ZOQ19TU0hfT05MWQotZXhlYyBzc3ZuYyAtc3NoICIkQCIKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vc3N2bmMgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3Nzdm5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Y2Q2MzZiLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vc3N2bmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IGJ5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0jCi0jIHNzdm5jOgotIwotIyAgICBBIHdyYXBwZXIgZm9yIHNzdm5jX2NtZCB1c2luZyBhIHRjbC90ayBndWkuCi0jCi0jIFNlZSBzc3ZuY19jbWQgZm9yIGRldGFpbHMuCi0jCi1pZiBbICJYJDEiID0gIlgtaGVscCIgLW8gIlgkMSIgPSAiWC1oIiBdOyB0aGVuCi0JY2F0IDw8IEVORAotc3N2bmMgLSBhIEdVSSB3cmFwcGVyIGZvciBTU0wgYW5kIFNTSCBWTkMgY29ubmVjdGlvbnMuCi0KLVNZTk9QU0lTCi0gICAgICAgc3N2bmMKLSAgICAgICBzc3ZuYyBbaG9zdF1bOmRpc3BsYXldCi0gICAgICAgc3N2bmMgW3NhdmVkLXByb2ZpbGUtbmFtZV0KLSAgICAgICBzc3ZuYyBbb3B0aW9uc10gW2hvc3Qtb3ItcHJvZmlsZV0KLSAgICAgICBzc3ZuYyAtY21kIFtzc3ZuY19jbWQtYXJnc10KLSAgICAgICBzc3ZuYyAtLWhlbHAKLQotREVTQ1JJUFRJT04KLSAgICAgICBzc3ZuYyAgaXMgIGEgdGNsL3RrIGd1aSB3cmFwcGVyIHRoYXQgcnVucyBvbiBVbml4LCBNYWNPU1gsIGFuZCBXaW5kb3dzLgotICAgICAgIEl0IHNldHMgdXAgYW4gU1NMIG9yIFNTSCB0dW5uZWwgdG8gIHRoZSAgcmVtb3RlICBWTkMgIFNlcnZlciAgYW5kICB0aGVuCi0gICAgICAgbGF1bmNoZXMgIHRoZSAgVk5DICB2aWV3ZXIgKGVpdGhlciB0aGUgb25lIHByb3ZpZGVkIG9yIGFub3RoZXIgb25lIHRoYXQKLSAgICAgICB5b3UgaGF2ZSBzcGVjaWZpZWQpIHRvIHVzZSB0aGF0IGVuY3J5cHRlZCB0dW5uZWwgdG8gY29ubmVjdCB0byB0aGUgIFZOQwotICAgICAgIFNlcnZlci4gICBUaGUgIHVzZSAgb2YgIFByb3hpZXMgYW5kIEdhdGV3YXlzIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb25zIGlzCi0gICAgICAgaW1wbGVtZW50ZWQuCi0KLU9QVElPTlMKLSAgICAgICAtaGVscCwgLWggICBQcmludCB0aGlzIGhlbHAuCi0KLSAgICAgICAtLWhlbHAgU3RhcnRzICB1cCAgdGhlICBHVUkgIGFzIHRob3VnaCB0aGUgJ0hlbHAnIGJ1dHRvbiB3YXMgcHJlc3NlZCB0bwotICAgICAgICAgICAgICBzaG93IHRoZSBtYWluIEhlbHAgcGFuZWwuCi0KLSAgICAgICAtY21kIFtzc3ZuY19jbWQtYXJnc10KLSAgICAgICAgICAgICAgTGF1bmNoIHRoZSBzc3ZuY19jbWQgdXRpbGl0eSBjb21tYW5kIGRpcmVjdGx5IChubyBHVUkpIHdpdGggIHRoZQotICAgICAgICAgICAgICBnaXZlbiAgYXJndW1lbnRzICAoZm9yIHVzZSB3aGVuIHNzdm5jX2NtZCBpcyBub3QgaW4gb25lJ3MgUEFUSC4pCi0gICAgICAgICAgICAgIElmIG5laXRoZXIgc3N2bmNfY21kIG5vciBzc3ZuY3ZpZXdlciBpcyBpbiBQQVRILCBvbmUgY2FuICBsYXVuY2gKLSAgICAgICAgICAgICAgdGhlIHZpZXdlciBkaXJlY3RseSB2aWE6IHNzdm5jIC1jbWQgLXZpZXdlciBbdmlld2VyLWFyZ3NdCi0KLSAgICAgICAtcHJvZmlsZXMKLSAgICAgICAgICAgICAgTGlzdCB0aGUgc2F2ZWQgU1NWTkMgcHJvZmlsZXMgeW91IGhhdmUgY3JlYXRlZC4gIEEgcHJvZmlsZSBpcyAgYQotICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBob3N0IHdpdGggc3BlY2lmaWMgcGFyYW1ldGVyIHNldHRpbmdzLgotCi0gICAgICAgLWxpc3QgIFNhbWUgYXMgLXByb2ZpbGVzCi0KLSAgICAgICAtc3NoICAgU3RhcnQgIGluICAiU1NIICBPbmx5IE1vZGUiLiAgTm8gU1NMIGFzcGVjdHMgYXJlIHNob3duLiAgU2FtZSBhcwotICAgICAgICAgICAgICBydW5uaW5nIHRoZSBjb21tYW5kIHNzaHZuYwotCi0gICAgICAgLXRzICAgIFN0YXJ0IGluICJUZXJtaW5hbCBTZXJ2aWNlcyAgTW9kZSIuICAgVGhpcyAgaXMgIGxpa2UgICJTU0ggIE9ubHkKLSAgICAgICAgICAgICAgTW9kZSIsIGJ1dCBzaW1wbGVyIGFuZCBhc3N1bWVzIHgxMXZuYyBpcyBhdmFpbGFibGUgb24gdGhlIHJlbW90ZQotICAgICAgICAgICAgICBzaWRlIHRvIHN0YXJ0IGFuZCBtYW5hZ2UgWCBhbmQgVk5DIHNlc3Npb25zLiAgIFNhbWUgIGFzICBydW5uaW5nCi0gICAgICAgICAgICAgIHRoZSBjb21tYW5kIHRzdm5jCi0KLSAgICAgICAtdHNvICAgU2FtZSBhcyAtdHMgIlRlcm1pbmFsIFNlcnZpY2VzIE1vZGUiLCBob3dldmVyIG5ldmVyIGxldCB0aGUgdXNlcgotICAgICAgICAgICAgICBsZWF2ZSB0aGlzIG1vZGUgKG5vIGJ1dHRvbiB0byBzd2l0Y2ggbW9kZXMgaXMgIHByb3ZpZGVkLikgICBTYW1lCi0gICAgICAgICAgICAgIGFzIFNTVk5DX1RTX0FMV0FZUz0xLgotCi0gICAgICAgLXNzbCAgIEZvcmNlIHRoZSBmdWxsIEdVSSBNb2RlOiBib3RoIFNTTCBhbmQgU1NILiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICAgU2FtZSBhcyAtc3MuCi0KLSAgICAgICAtbnYgICAgVG9nZ2xlIHRoZSAiVmVyaWZ5IEFsbCBDZXJ0cyIgYnV0dG9uIHRvIGJlIG9mZiBhdCBzdGFydHVwLgotCi0gICAgICAgLW52YiAgIE5ldmVyIHNob3cgdGhlICJWZXJpZnkgQWxsIENlcnRzIiBidXR0b24uICBTYW1lIGFzIFNTVk5DX05PX1ZFUi0KLSAgICAgICAgICAgICAgSUZZX0FMTF9CVVRUT049MS4KLQotICAgICAgIC1iaWdnZXIKLSAgICAgICAgICAgICAgTWFrZSAgdGhlICBQcm9maWxlICBTZWxlY3Rpb24gIERpYWxvZyAgd2luZG93ICBiaWdnZXIuICAgU2FtZSBhcwotICAgICAgICAgICAgICBTU1ZOQ19CSUdHRVJfRElBTE9HPTEuCi0KLSAgICAgICAtbm9lbmMgU3RhcnQgIG9mZiAgaW4gIGEgIG1vZGUgIHdoZXJlIGEgJ05vIEVuY3J5cHRpb24nIGNoZWNrIGJ1dHRvbiBpcwotICAgICAgICAgICAgICBwcmVzZW50LiAgIFlvdSAgY2FuICB0b2dnbGUgIHRoZSAgbW9kZSAgd2l0aCAgQ3RybC1FLiAgIFNhbWUgIGFzCi0gICAgICAgICAgICAgIFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT049MS4gIE9yICBub2VuYz0xICBpbiAgfi8uc3N2bmNyYy4KLSAgICAgICAgICAgICAgU2VsZWN0aW5nIG5vIGVuY3J5cHRpb24gaXMgdGhlIHNhbWUgYXMgIHRoZSAgdm5jOi8vICBhbmQgIFZuYzovLwotICAgICAgICAgICAgICBwcmVmaXhlcyAgZGVzY3JpYmVkICBiZWxvdy4gIFRoZSAtbm9lbmMgbW9kZSBpcyBub3cgdGhlIGRlZmF1bHQsCi0gICAgICAgICAgICAgIHVzZSAtZW5jIG9yIG5vZW5jPTAgZm9yIHRoZSBvcHBvc2l0ZSBiZWhhdmlvci4KLQotICAgICAgIC1raWxsc3R1bm5lbAotICAgICAgICAgICAgICBPbiBXaW5kb3dzLCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB0aGUgU1RVTk5FTCBwcm9jZXNzIHdoZW4gdGhlCi0gICAgICAgICAgICAgIHZpZXdlciAgZXhpdHMgaW5zdGVhZCBvZiBwcm9tcHRpbmcgeW91IChzYW1lIGFzIGtpbGxzdHVubmVsPTEgaW4KLSAgICAgICAgICAgICAgc3N2bmNfcmMgb3IgdG9nZ2xlIGluIE9wdGlvbnMgbWVudSkKLQotICAgICAgIC1ub2tpbGxzdHVubmVsCi0gICAgICAgICAgICAgIE9uIFdpbmRvd3MsIGRpc2FibGUgLWtpbGxzdHVubmVsIG1vZGUuICBTYW1lIGFzIGtpbGxzdHVubmVsPTAgaW4KLSAgICAgICAgICAgICAgc3N2bmNfcmMgb3IgdG9nZ2xlIGluIE9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCAta2lsbHN0dW5uZWwgbW9kZQotICAgICAgICAgICAgICBpcyBub3cgdGhlIGRlZmF1bHQuCi0KLSAgICAgICAtbXljZXJ0IC9wYXRoL3RvL215Y2VydC5wZW0KLSAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0ICJNeUNlcnQiIHRvICBiZSAgL3BhdGgvdG8vbXljZXJ0LnBlbS4gICBTYW1lICBhcwotICAgICAgICAgICAgICAtY2VydC4gIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB+Ly52bmMvY2VydHMgaXMgcHJlZml4ZWQgYW5kCi0gICAgICAgICAgICAgIHRyaWVkLiBZb3UgY2FuIGFsc28gc2V0IG15Y2VydD0vcGF0aC90by9teWNlcnQucGVtIGluIH4vLnNzdm5jcmMKLQotICAgICAgIC1jYWNlcnQgL3BhdGgvdG8vY2FjZXJ0LmNydAotICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgIlNlcnZlckNlcnQiIHRvIGJlIC9wYXRoL3RvL2NhY2VydC5jcnQuICBTYW1lIGFzCi0gICAgICAgICAgICAgIC1jYS4gIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB+Ly52bmMvY2VydHMgaXMgIHByZWZpeGVkICBhbmQKLSAgICAgICAgICAgICAgdHJpZWQuIFlvdSBjYW4gYWxzbyBzZXQgY2FjZXJ0PS9wYXRoL3RvL2NhY2VydC5jcnQgaW4gfi8uc3N2bmNyYwotCi0gICAgICAgLWNybCAvcGF0aC90by9teWNybC5wZW0KLSAgICAgICAgICAgICAgU2V0ICAgdGhlICAgZGVmYXVsdCAgIENlcnRpZmljYXRlICAgUmV2b2NhdGlvbiAgIExpc3QgICB0byAgICBiZQotICAgICAgICAgICAgICAvcGF0aC90by9teWNybC5wZW0uICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgfi8udm5jL2NlcnRzIGlzCi0gICAgICAgICAgICAgIHByZWZpeGVkIGFuZCB0cmllZC4gIFlvdSBjYW4gYWxzbyBzZXQgY3JsPS9wYXRoL3RvL215Y3JsLnBlbSAgaW4KLSAgICAgICAgICAgICAgfi8uc3N2bmNyYy4KLUVORAotCWV4aXQgMAotZmkKLWlmIFsgIlgkMSIgPSAiWC1zc2giIF07IHRoZW4KLQlpZiBbICJYJDIiID0gIlgtaGVscCIgLW8gIlgkMiIgPSAiWC1oIiBdOyB0aGVuCi0JCWNhdCA8PCBFTkQKLXNzaHZuYyAtIGEgR1VJIHdyYXBwZXIgZm9yIFNTSCBWTkMgY29ubmVjdGlvbnMuCi0KLVNZTk9QU0lTCi0gICAgICAgc3Nodm5jCi0gICAgICAgc3Nodm5jIFtob3N0XVs6ZGlzcGxheV0KLSAgICAgICBzc2h2bmMgW3NhdmVkLXByb2ZpbGUtbmFtZV0KLSAgICAgICBzc2h2bmMgW29wdGlvbnNdIFtob3N0LW9yLXByb2ZpbGVdCi0gICAgICAgc3Nodm5jIC0taGVscAotCi1TZWUgJ3Nzdm5jICQyJyBhbmQgJ3Nzdm5jIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1FTkQKLQkJZXhpdCAwCi0JZmkKLWZpCi0KLWlmIFsgIlgkMSIgPSAiWC10cyIgLW8gIlgkMSIgPSAiWC10c28iIF07IHRoZW4KLQlpZiBbICJYJDIiID0gIlgtaGVscCIgLW8gIlgkMiIgPSAiWC1oIiBdOyB0aGVuCi0JCWNhdCA8PCBFTkQKLXRzdm5jIC0gYSBHVUkgd3JhcHBlciBmb3IgU1NIIFZOQyBjb25uZWN0aW9ucyB1c2luZyB4MTF2bmMgVGVybWluYWwgU2VydmljZXMuCi0KLVNZTk9QU0lTCi0gICAgICAgdHN2bmMKLSAgICAgICB0c3ZuYyBbaG9zdF1bOmRpc3BsYXldCi0gICAgICAgdHN2bmMgW3NhdmVkLXByb2ZpbGUtbmFtZV0KLSAgICAgICB0c3ZuYyBbb3B0aW9uc10gW2hvc3Qtb3ItcHJvZmlsZV0KLSAgICAgICB0c3ZuYyAtLWhlbHAKLQotU2VlICdzc3ZuYyAkMicgYW5kICd0c3ZuYyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLgotRU5ECi0JCWV4aXQgMAotCWZpCi1maQotCi0KLWlmIFsgIlgkWFRFUk1fUFJJTlQiICE9ICJYIiBdOyB0aGVuCi0JWFRFUk1fUFJJTlQ9IiIKLQljYXQgPiAvZGV2L251bGwKLWZpCi1pZiBbICJYJDEiID0gIlgtYmciIF07IHRoZW4KLQlzaGlmdAotCSQwICIkQCIgJgotCWV4aXQgMAotZmkKLQotCi1QQVRIPSRQQVRIOi91c3IvYmluOi9iaW46L3Vzci9iaW4vWDExOi91c3IvWDExUjYvYmluOi91c3Ivb3Blbndpbi9iaW46L3Vzci9zZncvYmluOi91c3IvbG9jYWwvYmluCi1leHBvcnQgUEFUSAotCi1pZiBbICJYJEZVTExOQU1FIiA9ICJYS2FybCBKLiBSdW5nZSIgXTsgdGhlbgotCWlmIFsgIlgkTk9QT1BVRklYIiA9ICJYIiBdOyB0aGVuCi0JCVZOQ1ZJRVdFUl9QT1BVUF9GSVg9MQotCQlleHBvcnQgVk5DVklFV0VSX1BPUFVQX0ZJWAotCWZpCi0JUEFUSD1gZWNobyAiJFBBVEgiIHwgc2VkIC1lICdzLHJ1bmdlL2Jpbi9vdmVycmlkZSwtLS0tLS0tLS0tLS0tLCdgCi1maQotCi1pZiBbICJYJFdJU0giID0gIlgiIF07IHRoZW4KLQlXSVNIPXdpc2gKLQlmb3IgdHJ5IGluIHdpc2g4LjQgd2lzaCB3aXNoOC4zIHdpc2g4LjUgd2lzaDguNgotCWRvCi0JCWlmIHR5cGUgJHRyeSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQlXSVNIPSR0cnkKLQkJCWJyZWFrCi0JCWZpCi0JZG9uZQotCWV4cG9ydCBXSVNICi1maQotCi0KLVNTVk5DX0dVSV9DTUQ9IiQwICQqIgotZXhwb3J0IFNTVk5DX0dVSV9DTUQKLVNTVk5DX0xBVU5DSD0kU1NWTkNfR1VJX0NNRAotZXhwb3J0IFNTVk5DX0xBVU5DSAotCi0jIHdvcmsgb3V0IG9zLmFyY2ggcGxhdGZvcm0gc3RyaW5nIGFuZCBjaGVjayBmb3IgYmluYXJpZXM6Ci0jCi1uYW1lPSRVTkFNRQotaWYgWyAiWCRuYW1lIiA9ICJYIiBdOyB0aGVuCi0JbmFtZT1gdW5hbWUgLXNtIHwgc2VkIC1lICdzLyAvLi9nJyAtZSAncywvLiosLCcgLWUgJ3MvTGludXhcLmkuODYvTGludXguaTY4Ni8nYAotZmkKLQotZEw9Ii1MIgotaWYgdW5hbWUgLXNyIHwgZWdyZXAgJ1N1bk9TIDVcLls1LThdJyA+IC9kZXYvbnVsbDsgdGhlbgotCWRMPSItaCIKLWZpCi0KLWY9IiQwIgotZm9yIHQgaW4gMSAyIDMgNCA1Ci1kbwotCWlmIFsgJGRMICIkZiIgXTsgdGhlbgotCQlmMD0iJGYiCi0JCWY9YGxzIC1sICIkZiIgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2AKLQkJaWYgZWNobyAiJGYiIHwgZ3JlcCAnXi8nID4gL2Rldi9udWxsOyB0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCWY9ImBkaXJuYW1lICIkZjAiYC8kZiIKLQkJZmkKLQllbHNlCi0JCWJyZWFrCi0JZmkKLWRvbmUKLWRpcj1gZGlybmFtZSAiJGYiYAotUEFUSD0iJGRpcjokUEFUSCIKLQotbmVhcmJ5PTAKLWlmIFsgLXggIiRkaXIvdm5jdmlld2VyIiAtYSAteCAiJGRpci9zdHVubmVsIiBdOyB0aGVuCi0JbmVhcmJ5PTEKLWZpCi1pZiBbICJYJG5hbWUiID0gIlguIiBdOyB0aGVuCi0JOgotCSN0eXBlIHZuY3ZpZXdlcgotCSN0eXBlIHN0dW5uZWwKLWVsaWYgWyAhIC1kICIkZGlyLyRuYW1lIiAtYSAkbmVhcmJ5ID0gMCBdOyB0aGVuCi0JZWNobwotCWVjaG8gIkNhbm5vdCBmaW5kIHBsYXRmb3JtIGRpciBmb3IgeW91ciBPUyBgdW5hbWUgLXNtYDoiCi0JZWNobwotCWVjaG8gIiAgICAkZGlyLyRuYW1lIiAKLQllY2hvCi0JUEFUSD0kUEFUSDovdXNyL3NiaW46L3Vzci9sb2NhbC9zYmluOi9kaXN0L3NiaW4KLQotCXF1aXQ9MAotCWlmIHR5cGUgdm5jdmlld2VyID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJOgotCWVsc2UKLQkJZWNobyAidm5jdmlld2VyIG5vdCBmb3VuZCBpbiBQQVRILiIgCi0JCXF1aXQ9MQotCWZpCi0JaWYgdHlwZSBzdHVubmVsID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJOgotCWVsc2UKLQkJZWNobyAic3R1bm5lbCBub3QgZm91bmQgaW4gUEFUSC4iCi0JCXF1aXQ9MQotCWZpCi0JZWNobwotCWlmIFsgIlgkcXVpdCIgPSAiWDEiIF07IHRoZW4KLQkJZWNobyAiWW91IGNhbiBzZXQgdGhlIFwkVU5BTUUgZW52LiB2YXIuIHRvIG92ZXJyaWRlIHRoZSBPUyBzZXR0aW5nLiIKLQkJZWNobyAiT3IsIGlmIGF2YWlsYWJsZSwgcnVuIHRoZSAuL2J1aWxkLnVuaXggc2NyaXB0IHRvIGJ1aWxkIGl0LiIKLQkJZWNobyAiT3IgaW5zdGFsbCBleHRlcm5hbCBcInZuY3ZpZXdlclwiIGFuZCBcInN0dW5uZWxcIiBwYWNrYWdlcy4iCi0JCWV4aXQgMQotCWZpCi0JZWNobyAiVXNpbmcgZXh0ZXJuZWwgXCJ2bmN2aWV3ZXJcIiBhbmQgXCJzdHVubmVsXCIgZm91bmQgaW4gUEFUSC4iCi1lbHNlCi0JU1RVTk5FTD1zdHVubmVsCi0JI1NUVU5ORUxfRVhUUkFfT1BUUz0ke1NUVU5ORUxfRVhUUkFfT1BUUzotIm1heGNvbm4gPSAxIn0KLQkjZXhwb3J0IFNUVU5ORUwgU1RVTk5FTF9FWFRSQV9PUFRTCi0JU1NWTkNfVklFV0VSX0lOVEVSTkFMPTEKLQlleHBvcnQgU1NWTkNfVklFV0VSX0lOVEVSTkFMCi1maQotCi0KLSMgUHV0IG91ciBvcy5hcmNoIGFuZCBvdGhlciB1dGlscyBkaXJzIGF0IGhlYWQgb2YgUEFUSCB0byBiZSBzdXJlIHRvCi0jIHBpY2sgdGhlbSB1cDoKLSMKLVBBVEg9IiRkaXI6JGRpci8kbmFtZTokZGlyL3V0aWw6JFBBVEgiCi1pZiBlY2hvICIkZGlyIiB8IGdyZXAgJ14vJyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLWVsc2UKLQlkaXI9YHB3ZGAvJGRpcgotCVBBVEg9IiRkaXI6JGRpci8kbmFtZTokZGlyL3V0aWw6JFBBVEgiCi1maQotCi1TU1ZOQ19CQVNFRElSPSIkZGlyIgotZXhwb3J0IFNTVk5DX0JBU0VESVIKLVNTVk5DX0JBU0VESVJOQU1FPSIkZGlyLyRuYW1lIgotZXhwb3J0IFNTVk5DX0JBU0VESVJOQU1FCi0KLWlmIFsgLWYgIiRkaXIvdXRpbC91bHRyYWZ0cC5qYXIiIF07IHRoZW4KLQlTU1ZOQ19VTFRSQV9GVFBfSkFSPSIkZGlyL3V0aWwvdWx0cmFmdHAuamFyIgotCWV4cG9ydCBTU1ZOQ19VTFRSQV9GVFBfSkFSCi1maQotCi1pZiBbICJYJDEiID0gIlgtY21kIiAtbyAiWCQxIiA9ICJYLS1jbWQiIF07IHRoZW4KLQlzaGlmdAotCWV4ZWMgc3N2bmNfY21kICIkQCIKLWVsaWYgWyAiWCRXSVNIIiA9ICJYd2lzaCIgXTsgdGhlbgotCWV4ZWMgc3N2bmMudGNsICIkQCIKLWVsc2UKLQlleGVjICRXSVNIICRkaXIvdXRpbC9zc3ZuYy50Y2wgIiRAIgotZmkKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vc3N2bmNfY21kIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9zc3ZuY19jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4NGViNTguLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi9zc3ZuY19jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IGJ5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0jCi0jIHNzdm5jX2NtZDoKLSMKLSMgICAgQSB3cmFwcGVyIHRoYXQgY2FsbHMgc3Nfdm5jdmlld2VyIHRvIHVzZSB0aGUgZW5oYW5jZWQgVGlnaHRWTkMgdmlld2VyLiAKLSMKLSMgVGhlIGVuaGFuY2VkIFRpZ2h0Vk5DIHZpZXdlciBmZWF0dXJlcyBhcmU6Ci0jCi0jCS0gU1NMIHN1cHBvcnQgZm9yIGNvbm5lY3Rpb25zIHVzaW5nIHRoZSBjby1idW5kbGVkIHN0dW5uZWwgcHJvZ3JhbS4KLSMJLSByZmJOZXdGQlNpemUgVk5DIHN1cHBvcnQgKHNjcmVlbiByZXNpemluZykKLSMJLSBjdXJzb3IgYWxwaGFibGVuZGluZyB3aXRoIHgxMXZuYyBhdCAzMmJwcAotIwktIHhncmFic2VydmVyIHN1cHBvcnQgZm9yIGZ1bGxzY3JlZW4gbW9kZSAoZm9yIG9sZCB3aW5kb3cgbWdycykKLSMKLSMKLSMgWW91ciBwbGF0Zm9ybSAoZS5nLiBMaW51eC5pNjg2KSBpcyBhdXRvZGV0ZWN0ZWQgYW5kIGVuaGFuY2VkCi0jIHZuY3ZpZXdlciBhbmQgc3R1bm5lbCBiaW5hcmllcyBmb3IgaXQgYXJlIHVzZWQgKHNlZSB0aGUgLi9iaW4gZGlyZWN0b3J5KS4KLSMKLSMgU2VlIHRoZSBidWlsZC51bml4IHNjcmlwdCBpZiB5b3VyIHBsYXRmb3JtIGlzIG5vdCBpbiB0aGlzIHBhY2thZ2UuCi0jIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGVudi4gdmFyLiBVTkFNRT1vcy5hcmNoIHRvIGFueSAib3MuYXJjaCIgeW91IHdhbnQKLSMgdG8gb3ZlcnJpZGUgdGhlIGF1dG9kZXRldGlvbi4KLSMKLSMgVXNhZ2U6Ci0jCi0jICAgICBzc3ZuY19jbWQgW3NzX3ZuY3ZpZXdlci1hcmdzXSBob3N0bmFtZTpOIFt2bmN2aWV3ZXItYXJnc10KLSMKLSMgIGlmLCBpbnN0ZWFkLCB0aGlzIHNjcmlwdCBpcyBuYW1lZCAidGlnaHR2bmN2aWV3ZXIiIG9yICItdmlld2VyIiBpcyB0aGUKLSMgIGZpcnN0IGFyZ3VtZW50IGl0IGNhbGxzIHRoZSB2bmN2aWV3ZXIgZGlyZWN0bHkgKHRoZXJlIGlzIG5vIGVuY3J5cHRpb24pCi0jICBhbmQgbXVzdCBiZSBpbnZva2VkIGFzOgotIwotIyAgICAgdGlnaHR2bmN2aWV3ZXIgW3ZuY3ZpZXdlci1hcmdzXSBob3N0bmFtZTpOCi0jICBvcgotIyAgICAgc3N2bmNfY21kIC12aWV3ZXIgW3ZuY3ZpZXdlci1hcmdzXSBob3N0bmFtZTpOCi0jCi0jIEluIGJvdGggY2FzZXMsICJob3N0bmFtZTpOIiBpcyB0aGUgaG9zdCBhbmQgVk5DIGRpc3BsYXkgdG8gY29ubmVjdCB0bywKLSMgZS5nLiBzbm9vcHk6MC4gKC1saXN0ZW4gTiBhbmQgLWFwcHNoYXJlIE4gbW9kZXMgd29ya3MgdG9vLikKLSMKLSMgU2VlIHRoZSBzY3JpcHQgdXRpbC9zc192bmN2aWV3ZXIgZm9yIGRldGFpbHMgYWJvdXQgaXRzIGFyZ3VtZW50czoKLSMKLSMJLXZlcmlmeSBwZW1maWxlCi0jCS1teWNlcnQgcGVtZmlsZQotIwktcHJveHkgIHBob3N0OnBwb3J0Ci0jCS1hbHBoYQotIwktZ3JhYgotIwotIyBOLkIuIGlmIHRoaXMgc2NyaXB0IGlzIG5hbWVkICJ0aWdodHZuY3ZpZXdlciIgdGhlIHZuY3ZpZXdlciBpcyBjYWxsZWQKLSMgZGlyZWN0bHksIGFuZCB0aGVyZSB3b24ndCBiZSBhbnkgU1NMIG9yIFNTSCBlbmNyeXB0aW9uIHR1bm5lbHMuCi0jCi0jIElmIHRoZSAqdmVyeSBmaXJzdCogYXJndW1lbnQgaXMgIi1jb3R2bmMiIHRoZW4gaXQgaXMgYXNzdW1lZCB5b3UgYXJlIG9uCi0jIERhcndpbiBhbmQgd2FudCB0byBydW4gdGhlIENoaWNrZW4gb2YgdGhlIFZOQyB2aWV3ZXIgdmlhIG91ciB3cmFwcGVyLgotIwotIwotIyBTZWUgdGhlIFRpZ2h0Vk5DIHZpZXdlciBkb2N1bWVudGF0aW9uIGZvciBvbiBpdHMgY21kbGluZSBhcmd1bWVudHMuCi0jCi0jIEZvciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgVGlnaHRWTkMgMS4zZGV2NSB2aWV3ZXIgLWhlbHAgb3V0cHV0OgotIwotIyAgICAgICBUaWdodFZOQyB2aWV3ZXIgdmVyc2lvbiAxLjNkZXY1Ci0jICAgICAgIAotIyAgICAgICBVc2FnZTogdm5jdmlld2VyIFs8T1BUSU9OUz5dIFs8SE9TVD5dWzo8RElTUExBWSM+XQotIyAgICAgICAgICAgICAgdm5jdmlld2VyIFs8T1BUSU9OUz5dIFs8SE9TVD5dWzo6PFBPUlQjPl0KLSMgICAgICAgICAgICAgIHZuY3ZpZXdlciBbPE9QVElPTlM+XSAtbGlzdGVuIFs8RElTUExBWSM+XQotIyAgICAgICAgICAgICAgdm5jdmlld2VyIC1oZWxwCi0jICAgICAgIAotIyAgICAgICA8T1BUSU9OUz4gYXJlIHN0YW5kYXJkIFh0IG9wdGlvbnMsIG9yOgotIyAgICAgICAgICAgICAgIC12aWEgPEdBVEVXQVk+Ci0jICAgICAgICAgICAgICAgLXNoYXJlZCAoc2V0IGJ5IGRlZmF1bHQpCi0jICAgICAgICAgICAgICAgLW5vc2hhcmVkCi0jICAgICAgICAgICAgICAgLXZpZXdvbmx5Ci0jICAgICAgICAgICAgICAgLWZ1bGxzY3JlZW4KLSMgICAgICAgICAgICAgICAtbm9yYWlzZW9uYmVlcAotIyAgICAgICAgICAgICAgIC1wYXNzd2QgPFBBU1NXRC1GSUxFTkFNRT4gKHN0YW5kYXJkIFZOQyBhdXRoZW50aWNhdGlvbikKLSMgICAgICAgICAgICAgICAtdXNlciA8VVNFUk5BTUU+IChVbml4IGxvZ2luIGF1dGhlbnRpY2F0aW9uKQotIyAgICAgICAgICAgICAgIC1lbmNvZGluZ3MgPEVOQ09ESU5HLUxJU1Q+IChlLmcuICJ0aWdodCBjb3B5cmVjdCIpCi0jICAgICAgICAgICAgICAgLWJncjIzMwotIyAgICAgICAgICAgICAgIC1vd25jbWFwCi0jICAgICAgICAgICAgICAgLXRydWVjb2xvdXIKLSMgICAgICAgICAgICAgICAtZGVwdGggPERFUFRIPgotIyAgICAgICAgICAgICAgIC1jb21wcmVzc2xldmVsIDxDT01QUkVTUy1WQUxVRT4gKDAuLjk6IDAtZmFzdCwgOS1iZXN0KQotIyAgICAgICAgICAgICAgIC1xdWFsaXR5IDxKUEVHLVFVQUxJVFktVkFMVUU+ICgwLi45OiAwLWxvdywgOS1oaWdoKQotIyAgICAgICAgICAgICAgIC1ub2pwZWcKLSMgICAgICAgICAgICAgICAtbm9jdXJzb3JzaGFwZQotIyAgICAgICAgICAgICAgIC14MTFjdXJzb3IKLSMgICAgICAgICAgICAgICAtYXV0b3Bhc3MKLSMgICAgICAgCi0jICAgICAgIE9wdGlvbiBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGUuZy4gLWJnciBpbnN0ZWFkIG9mIC1iZ3IyMzMuCi0jICAgICAgIFNlZSB0aGUgbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jICAKLSMgTm90ZTogdGhlIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciAoU1NWTkMpIGhhcyBtYW55IG1vcmUgb3B0aW9ucywgcnVuCi0jIHRoaXMgc2NyaXB0IGFzICJzc3ZuY19jbWQgVm5jOi8vYTowIC1oZWxwIiBvciAidGlnaHR2bmN2aWV3ZXIgLWhlbHAiCi0jIHRvIHNlZW0gdGhlbS4KLQotaWYgWyAiWCQxIiA9ICJYLWgiIC1vICJYJDEiID0gIlgtaGVscHh4eCIgLW8gIlgkMSIgPSAiWC0taGVscCIgXTsgdGhlbgotCXRhaWwgLW4gKzIgIiQwIiB8IHNlZCAtZSAnL14kLyBxJyAtZSAncy9eIy8vJyAKLQlleGl0Ci1maQotCi0jIEluY2x1ZGUgL3Vzci9iaW4uLi4gdG8gYmUgc3VyZSB0byBnZXQgcmVndWxhciB1dGlsaXRpZXM6Ci0jCi1QQVRIPSRQQVRIOi91c3IvYmluOi9iaW4KLWV4cG9ydCBQQVRICi0KLWlmIFsgIlgkRlVMTE5BTUUiID0gIlhLYXJsIEouIFJ1bmdlIiBdOyB0aGVuCi0JaWYgWyAiWCROT1BPUFVGSVgiID0gIlgiIF07IHRoZW4KLQkJVk5DVklFV0VSX1BPUFVQX0ZJWD0xCi0JCWV4cG9ydCBWTkNWSUVXRVJfUE9QVVBfRklYCi0JZmkKLQlQQVRIPWBlY2hvICIkUEFUSCIgfCBzZWQgLWUgJ3MscnVuZ2UvYmluL292ZXJyaWRlLC0tLS0tLS0tLS0tLS0sJ2AKLWZpCi0KLSMgU2V0IHRoaXMgZm9yIHNzX3ZuY3ZpZXdlciB0byBwaWNrIHVwOgotIwotaWYgWyAiWCQxIiA9ICJYLWNvdHZuYyIgXTsgdGhlbgotCXNoaWZ0Ci0JREFSV0lOX0NPVFZOQz0xCi0JZXhwb3J0IERBUldJTl9DT1RWTkMKLWVsaWYgWyAiWCREQVJXSU5fQ09UVk5DIiA9ICJYIiAtYSAiWCRESVNQTEFZIiA9ICJYIiBdOyB0aGVuCi0JdW5hbWU9YHVuYW1lYAotCWlmIFsgIlgkdW5hbWUiID0gIlhEYXJ3aW4iIF07IHRoZW4KLQkJREFSV0lOX0NPVFZOQz0xCi0JCWV4cG9ydCBEQVJXSU5fQ09UVk5DCi0JZmkKLWZpCi0KLXVzZV9vdXJzPTAKLWlmIFsgIlgkVk5DVklFV0VSQ01EIiA9ICJYIiBdOyB0aGVuCi0JVk5DVklFV0VSQ01EPSJ2bmN2aWV3ZXIiCi0JZXhwb3J0IFZOQ1ZJRVdFUkNNRAotCWlmIFsgIlgkREFSV0lOX0NPVFZOQyIgIT0gIlgxIiBdOyB0aGVuCi0JCXVzZV9vdXJzPTEKLQlmaQotZmkKLQotIyB3b3JrIG91dCBvcy5hcmNoIHBsYXRmb3JtIHN0cmluZyBhbmQgY2hlY2sgZm9yIGJpbmFyaWVzOgotIwotbmFtZT0kVU5BTUUKLWlmIFsgIlgkbmFtZSIgPSAiWCIgXTsgdGhlbgotCW5hbWU9YHVuYW1lIC1zbSB8IHNlZCAtZSAncy8gLy4vZycgLWUgJ3MsLy4qLCwnIC1lICdzL0xpbnV4XC5pLjg2L0xpbnV4Lmk2ODYvJ2AKLWZpCi0KLWRMPSItTCIKLWlmIHVuYW1lIC1zciB8IGVncmVwICdTdW5PUyA1XC5bNS04XScgPiAvZGV2L251bGw7IHRoZW4KLQlkTD0iLWgiCi1maQotCi1mPSIkMCIKLWZvciB0IGluIDEgMiAzIDQgNSA2Ci1kbwotCWlmIFsgJGRMICIkZiIgXTsgdGhlbgotCQlmMD0iJGYiCi0JCWY9YGxzIC1sICIkZiIgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2AKLQkJaWYgZWNobyAiJGYiIHwgZ3JlcCAnXi8nID4gL2Rldi9udWxsOyB0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCWY9ImBkaXJuYW1lICIkZjAiYC8kZiIKLQkJZmkKLQllbHNlCi0JCWJyZWFrCi0JZmkKLWRvbmUKLWRpcj1gZGlybmFtZSAiJGYiYAotUEFUSD0iJGRpcjokUEFUSCIKLVNTVk5DX0JBU0VESVI9IiRkaXIiCi1leHBvcnQgU1NWTkNfQkFTRURJUgotU1NWTkNfQkFTRURJUk5BTUU9IiRkaXIvJG5hbWUiCi1leHBvcnQgU1NWTkNfQkFTRURJUk5BTUUKLVNTVk5DX1VOQU1FPSIkbmFtZSIKLWV4cG9ydCBTU1ZOQ19VTkFNRQotCi1uZWFyYnk9MAotaWYgWyAteCAiJGRpci92bmN2aWV3ZXIiIC1hIC14ICIkZGlyL3N0dW5uZWwiIF07IHRoZW4KLQluZWFyYnk9MQotZmkKLWlmIFsgIlgkbmFtZSIgPSAiWC4iIF07IHRoZW4KLQk6Ci0JI3R5cGUgdm5jdmlld2VyCi0JI3R5cGUgc3R1bm5lbAotZWxpZiBbICEgLWQgIiRkaXIvJG5hbWUiIC1hICRuZWFyYnkgPSAwIF07IHRoZW4KLQllY2hvCi0JZWNobyAiQ2Fubm90IGZpbmQgcGxhdGZvcm0gZGlyIGZvciB5b3VyIE9TIGB1bmFtZSAtc21gOiIKLQllY2hvCi0JZWNobyAiICAgICRkaXIvJG5hbWUiIAotCWVjaG8KLQlQQVRIPSRQQVRIOi91c3Ivc2JpbjovdXNyL2xvY2FsL3NiaW46L2Rpc3Qvc2JpbgotCi0JcXVpdD0wCi0JaWYgdHlwZSB2bmN2aWV3ZXIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQk6Ci0JZWxzZQotCQllY2hvICJ2bmN2aWV3ZXIgbm90IGZvdW5kIGluIFBBVEguIiAKLQkJcXVpdD0xCi0JZmkKLQlpZiB0eXBlIHN0dW5uZWwgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQk6Ci0JZWxzZQotCQllY2hvICJzdHVubmVsIG5vdCBmb3VuZCBpbiBQQVRILiIKLQkJcXVpdD0xCi0JZmkKLQllY2hvCi0JaWYgWyAiWCRxdWl0IiA9ICJYMSIgXTsgdGhlbgotCQllY2hvICJZb3UgY2FuIHNldCB0aGUgXCRVTkFNRSBlbnYuIHZhci4gdG8gb3ZlcnJpZGUgdGhlIE9TIHNldHRpbmcuIgotCQllY2hvICJPciwgaWYgYXZhaWxhYmxlLCBydW4gdGhlIC4vYnVpbGQudW5peCBzY3JpcHQgdG8gYnVpbGQgaXQuIgotCQllY2hvICJPciBpbnN0YWxsIGV4dGVybmFsIFwidm5jdmlld2VyXCIgYW5kIFwic3R1bm5lbFwiIHBhY2thZ2VzLiIKLQkJZXhpdCAxCi0JZmkKLQllY2hvICJVc2luZyBleHRlcm5lbCBcInZuY3ZpZXdlclwiIGFuZCBcInN0dW5uZWxcIiBmb3VuZCBpbiBQQVRILiIKLQotZWxzZQotCVNUVU5ORUw9c3R1bm5lbAotCSNTVFVOTkVMX0VYVFJBX09QVFM9JHtTVFVOTkVMX0VYVFJBX09QVFM6LSJtYXhjb25uID0gMSJ9Ci0JI2V4cG9ydCBTVFVOTkVMIFNUVU5ORUxfRVhUUkFfT1BUUwotCVNTVk5DX1ZJRVdFUl9JTlRFUk5BTD0xCi0JZXhwb3J0IFNTVk5DX1ZJRVdFUl9JTlRFUk5BTAotZmkKLQotaWYgWyAiWCREQVJXSU5fQ09UVk5DIiAhPSAiWDEiIC1hICJYJFZOQ1ZJRVdFUkNNRCIgPSAiWHZuY3ZpZXdlciIgXTsgdGhlbgotCWhzdHI9YCRWTkNWSUVXRVJDTUQgLWggMj4mMSB8IGhlYWQgLTVgCi0JaWYgZWNobyAiJGhzdHIiIHwgZ3JlcCAnU1NWTkMuKlRpZ2h0Vk5DLip2ZXJzaW9uIDFcLjMnID4gL2Rldi9udWxsOyB0aGVuCi0JCSMgd2UgbmVlZCB0byBhdm9pZCByYXcgZW5jb2RpbmcKLQkJdXNlX291cnM9MQotCWZpCi1maQotCi0jIFB1dCBvdXIgb3MuYXJjaCBhbmQgb3RoZXIgdXRpbHMgZGlycyBhdCBoZWFkIG9mIFBBVEggdG8gYmUgc3VyZSB0bwotIyBwaWNrIHRoZW0gdXA6Ci0jCi1QQVRIPSIkZGlyOiRkaXIvJG5hbWU6JGRpci91dGlsOiRQQVRIIgotaWYgZWNobyAiJGRpciIgfCBncmVwICdeLycgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci1lbHNlCi0JZGlyPWBwd2RgLyRkaXIKLQlQQVRIPSIkZGlyOiRkaXIvJG5hbWU6JGRpci91dGlsOiRQQVRIIgotZmkKLQotaWYgWyAtZiAiJGRpci91dGlsL3VsdHJhZnRwLmphciIgXTsgdGhlbgotCVNTVk5DX1VMVFJBX0ZUUF9KQVI9IiRkaXIvdXRpbC91bHRyYWZ0cC5qYXIiCi0JZXhwb3J0IFNTVk5DX1VMVFJBX0ZUUF9KQVIKLWZpCi0KLWJhc2U9YGJhc2VuYW1lICIkMCJgCi1pZiBbICJYJDEiID0gIlgtc3NsIiBdOyB0aGVuCi0Jc2hpZnQJCi0JYmFzZT0ic3N2bmNfY21kIgotZmkKLQotZG9fdmlld2VyX2RpcmVjdGx5PSIiCi1pZiBbICJYJDEiID0gIlgtdmlld2VyIiBdOyB0aGVuCi0JZG9fdmlld2VyX2RpcmVjdGx5PTEKLQlzaGlmdAkKLWZpCi1pZiBbICJYJGJhc2UiID0gIlh0aWdodHZuY3ZpZXdlciIgXTsgdGhlbgotCWRvX3ZpZXdlcl9kaXJlY3RseT0xCi1maQotCi0jIElmIG91cnMgKGFuZCBub3QgY290dm5jKSwgZm9yY2UgdGhlIHVzZSBvZiB0aWdodCBlbmNvZGluZyBmb3IgbG9jYWxob3N0Ci0jIHJlZGlyIGNvbm5lY3Rpb246Ci0jCi0jCi1pZiBbICR1c2Vfb3VycyA9IDEgXTsgdGhlbgotCSMgYXZvaWQgc3lzdGVtIHZuY3ZpZXdlciBhcHAtZGVmYXVsdHMKLQkjWEZJTEVTRUFSQ0hQQVRIPSIvdG1wL3BhdGgvbm93aGVyZSI7IGV4cG9ydCBYRklMRVNFQVJDSFBBVEgKLQotCVNTVk5DX1VTRV9PVVJTPTE7IGV4cG9ydCBTU1ZOQ19VU0VfT1VSUwotCi0JaWYgWyAiWCRTU1ZOQ19UVVJCT1ZOQyIgIT0gIlgiIF07IHRoZW4KLQkJaWYgZWNobyAiJFZOQ1ZJRVdFUkNNRCIgfCBncmVwICdcLnR1cmJvdm5jJyA+IC9kZXYvbnVsbDsgdGhlbgotCQkJOgotCQllbHNlCi0JCQlpZiB0eXBlICIkVk5DVklFV0VSQ01ELnR1cmJvdm5jIiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQkJCVZOQ1ZJRVdFUkNNRD0iJFZOQ1ZJRVdFUkNNRC50dXJib3ZuYyIKLQkJCWZpCi0JCWZpCi0JZmkKLQotCWlmIFsgIlgkZG9fdmlld2VyX2RpcmVjdGx5IiA9ICJYMSIgXTsgdGhlbgotCQkkVk5DVklFV0VSQ01EIC1lbmNvZGluZ3MgJ2NvcHlyZWN0IHRpZ2h0IHpybGUgemxpYiBoZXh0aWxlJyAiJEAiCi0JZWxzZQotCQlzc192bmN2aWV3ZXIgIiRAIiAtZW5jb2RpbmdzICdjb3B5cmVjdCB0aWdodCB6cmxlIHpsaWIgaGV4dGlsZScKLQlmaQotZWxzZQotCWlmIFsgIlgkZG9fdmlld2VyX2RpcmVjdGx5IiA9ICJYMSIgXTsgdGhlbgotCQkkVk5DVklFV0VSQ01EICIkQCIKLQllbHNlCi0JCXNzX3ZuY3ZpZXdlciAiJEAiCi0JZmkKLWZpCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3Rzdm5jIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi90c3ZuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWNmNTVjNi4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3Rzdm5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIS9iaW4vc2gKLSMgCi0jIHdyYXBwZXIgZm9yIFRTX09OTFkgbW9kZSAKLSMgCi1QQVRIPWBkaXJuYW1lICIkMCJgOiRQQVRIOyBleHBvcnQgUEFUSAotU1NWTkNfVFNfT05MWT0xOyBleHBvcnQgU1NWTkNfVFNfT05MWQotZXhlYyBzc3ZuYyAtdHMgIiRAIgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi91dGlsL3NzX3ZuY3ZpZXdlciBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vdXRpbC9zc192bmN2aWV3ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwMjQ1YWYuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi91dGlsL3NzX3ZuY3ZpZXdlcgorKysgL2Rldi9udWxsCkBAIC0xLDM2MzUgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIHNzX3ZuY3ZpZXdlcjogIHdyYXBwZXIgZm9yIHZuY3ZpZXdlciB0byB1c2UgYW4gc3R1bm5lbCBTU0wgdHVubmVsCi0jICAgICAgICAgICAgICAgIG9yIGFuIFNTSCB0dW5uZWwuCi0jCi0jIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IGJ5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0jCi0jIHNzX3ZuY3ZpZXdlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBzc192bmN2aWV3ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBzc192bmN2aWV3ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLSMgb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMgCi0jIAotIyBZb3UgbXVzdCBoYXZlIHN0dW5uZWwoOCkgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGluIHlvdXIgUEFUSAotIyAoaG93ZXZlciwgc2VlIHRoZSAtc3NoIG9wdGlvbiBiZWxvdywgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbCBuZWVkIHNzaCgxKQotIyBpbnN0YWxsZWQpICBOb3RlOiBzdHVubmVsIGlzIHVzdWFsbHkgaW5zdGFsbGVkIGluIGFuICJzYmluIiBzdWJkaXJlY3RvcnkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSAieDExdm5jIC1zc2wgLi4uIiBvciAieDExdm5jIC1zdHVubmVsIC4uLiIgCi0jIGFscmVhZHkgcnVubmluZyBhcyB0aGUgVk5DIHNlcnZlciBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi0jIChvciB1c2Ugc3R1bm5lbCBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIGFueSBvdGhlciBWTkMgc2VydmVyKQotIwotIwotIyBVc2FnZTogc3Nfdm5jdmlld2VyIFtjZXJ0LWFyZ3NdIGhvc3Q6ZGlzcGxheSA8dm5jdmlld2VyLWFyZ3M+Ci0jCi0jIGUuZy46ICBzc192bmN2aWV3ZXIgc25vb3B5OjAKLSMgICAgICAgIHNzX3ZuY3ZpZXdlciBzbm9vcHk6MCAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUiCi0jCi0jIFtjZXJ0LWFyZ3NdIGNhbiBiZToKLSMKLSMJLXZlcmlmeSAvcGF0aC90by9jYWNlcnQucGVtCQkKLSMJLW15Y2VydCAvcGF0aC90by9teWNlcnQucGVtCQkKLSMJLWNybCAgICAvcGF0aC90by9teV9jcmwucGVtICAob3IgZGlyZWN0b3J5KQotIwktcHJveHkgIGhvc3Q6cG9ydAotIwotIyAtdmVyaWZ5IHNwZWNpZmllcyBhIENBIGNlcnQgUEVNIGZpbGUgKG9yIGEgc2VsZi1zaWduZWQgb25lKSBmb3IKLSMgICAgICAgICBhdXRoZW50aWNhdGluZyB0aGUgVk5DIHNlcnZlci4KLSMKLSMgLW15Y2VydCBzcGVjaWZpZXMgdGhpcyBjbGllbnQncyBjZXJ0K2tleSBQRU0gZmlsZSBmb3IgdGhlIFZOQyBzZXJ2ZXIgdG8KLSMJICBhdXRoZW50aWNhdGUgdGhpcyBjbGllbnQuIAotIwotIyAtcHJveHkgIHRyeSBob3N0OnBvcnQgYXMgYSBXZWIgcHJveHkgdG8gdXNlIHRoZSBDT05ORUNUIG1ldGhvZAotIyAgICAgICAgIHRvIHJlYWNoIHRoZSBWTkMgc2VydmVyIChlLmcuIHlvdXIgZmlyZXdhbGwgcmVxdWlyZXMgYSBwcm94eSkuCi0jCi0jICAgICAgICAgRm9yIHRoZSAiZG91YmxlIHByb3h5IiBjYXNlIHVzZSAtcHJveHkgaG9zdDE6cG9ydDEsaG9zdDI6cG9ydDIKLSMgICAgICAgICAodGhlIGZpcnN0IENPTk5FQ1QgaXMgZG9uZSB0aHJvdWdoIGhvc3QxOnBvcnQxIHRvIGhvc3QyOnBvcnQyCi0jICAgICAgICAgYW5kIHRoZW4gYSAybmQgQ09OTkVDVCB0byB0aGUgZGVzdGluYXRpb24gVk5DIHNlcnZlci4pCi0jCi0jICAgICAgICAgVXNlIHNvY2tzOi8vaG9zdDpwb3J0LCBzb2NrczQ6Ly9ob3N0OnBvcnQsIG9yIHNvY2tzNTovL2hvc3QscG9ydAotIyAgICAgICAgIHRvIGZvcmNlIHVzYWdlIG9mIGEgU09DS1MgcHJveHkuICBBbHNvIHJlcGVhdGVyOi8vaG9zdDpwb3J0IGFuZAotIyAgICAgICAgIHNzbHJlcGVhdGVyOi8vaG9zdDpwb3J0LgotIwotIyAtc2hvd2NlcnQgIE9ubHkgZmV0Y2ggdGhlIGNlcnRpZmljYXRlIHVzaW5nIHRoZSAnb3BlbnNzbCBzX2NsaWVudCcKLSMgICAgICAgICAgICBjb21tYW5kIChvcGVuc3NsKDEpIG11c3QgaW4gaW5zdGFsbGVkKS4gIE9uIHNzdm5jIDEuMC4yNyBhbmQKLSMgICAgICAgICAgICBsYXRlciB0aGUgYnVuZGxlZCBjb21tYW5kICd1bHRyYXZuY19kc21faGVscGVyJyBpcyB1c2VkLgotIwotIyAgICBTZWUgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc3NsLWNhIGZvciBkZXRhaWxzIG9uCi0jICAgIFNTTCBjZXJ0aWZpY2F0ZXMgd2l0aCBWTkMuCi0jCi0jIEEgZmV3IG90aGVyIGFyZ3MgKG5vdCByZWxhdGVkIHRvIFNTTCBhbmQgY2VydHMpOgotIwotIyAtMm5kICAgIFJ1biB0aGUgdm5jdmlld2VyIGEgMm5kIHRpbWUgaWYgdGhlIGZpcnN0IGNvbm5lY3Rpb25zIGZhaWxzLgotIwotIyAtc3NoICAgIFVzZSBzc2ggaW5zdGVhZCBvZiBzdHVubmVsIFNTTC4gIHNzaCgxKSBtdXN0IGJlIGluc3RhbGxlZCBhbmQgeW91Ci0jICAgICAgICAgbXVzdCBiZSBhYmxlIHRvIGxvZyBpbnRvIHRoZSByZW1vdGUgbWFjaGluZSB2aWEgc3NoLgotIwotIyAgICAgICAgIEluIHRoaXMgY2FzZSAiaG9zdDpkaXNwbGF5IiBtYXkgYmUgb2YgdGhlIGZvcm0gInVzZXJAaG9zdDpkaXNwbGF5IgotIyAgICAgICAgIHdoZXJlICJ1c2VyQGhvc3QiIGlzIHVzZWQgZm9yIHRoZSBzc2ggbG9naW4gKHNlZSBzc2goMSkgbWFucGFnZSkuCi0jCi0jICAgICAgICAgSWYgLXByb3h5IGlzIHN1cHBsaWVkIGl0IGNhbiBiZSBvZiB0aGUgZm9ybXM6ICJnd2hvc3QiICJnd2hvc3Q6cG9ydCIKLSMgICAgICAgICAidXNlckBnd2hvc3QiIG9yICJ1c2VyQGd3aG9zdDpwb3J0Ii4gICJnd2hvc3QiIGlzIGFuIGluY29taW5nIHNzaCAKLSMgICAgICAgICBnYXRld2F5IG1hY2hpbmUgKHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW5uaW5nIHRoZXJlKSwgYW4gc3NoIC1MCi0jICAgICAgICAgcmVkaXIgaXMgdXNlZCB0byAiaG9zdCIgaW4gImhvc3Q6ZGlzcGxheSIgZnJvbSAiZ3dob3N0Ii4gQW55ICJ1c2VyQCIKLSMgICAgICAgICBwYXJ0IG11c3QgYmUgaW4gdGhlIC1wcm94eSBzdHJpbmcgKG5vdCBpbiAiaG9zdDpkaXNwbGF5IikuCi0jCi0jICAgICAgICAgVW5kZXIgLXByb3h5IHVzZSAiZ3dob3N0OnBvcnQiIGlmIGNvbm5lY3RpbmcgdG8gYW55IHNzaCBwb3J0Ci0jICAgICAgICAgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoMjIpLiAgKGV2ZW4gZm9yIHRoZSBub24tZ2F0ZXdheSBjYXNlLAotIyAgICAgICAgIC1wcm94eSBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSBhIG5vbi1zdGFuZGFyZCBzc2ggcG9ydCkKLSMKLSMgICAgICAgICBBICJkb3VibGUgc3NoIiBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhIC1wcm94eSBzdHJpbmcgd2l0aCB0aGUgdHdvCi0jICAgICAgICAgaG9zdHMgc2VwYXJhdGVkIGJ5IGEgY29tbWE6Ci0jCi0jICAgICAgICAgICAgIFt1c2VyMUBdaG9zdDFbOnBvcnQxXSxbdXNlcjJAXWhvc3QyWzpwb3J0Ml0KLSMKLSMgICAgICAgICBpbiB3aGljaCBjYXNlIGEgc3NoIHRvIGhvc3QxIGFuZCB0aHJ1IGl0IHZpYSBhIC1MIHJlZGlyIGEgMm5kCi0jICAgICAgICAgc3NoIGlzIGVzdGFibGlzaGVkIHRvIGhvc3QyLiAgCi0jCi0jICAgICAgICAgRXhhbXBsZXM6Ci0jCi0jICAgICAgICAgc3Nfdm5jdmlld2VyIC1zc2ggYm9iQGJvYnMtaG9tZS5uZXQ6MAotIyAgICAgICAgIHNzX3ZuY3ZpZXdlciAtc3NoIC1zc2hjbWQgJ3gxMXZuYyAtbG9jYWxob3N0JyBib2JAYm9icy1ob21lLm5ldDowCi0jCi0jICAgICAgICAgc3Nfdm5jdmlld2VyIC1zc2ggLXByb3h5IGZyZWRAbXlnYXRlLmNvbToyMDIyIG15bWFjaGluZTowCi0jICAgICAgICAgc3Nfdm5jdmlld2VyIC1zc2ggLXByb3h5IGJvYkBib2JzLWhvbWUubmV0OjIyMjIgbG9jYWxob3N0OjAKLSMKLSMgICAgICAgICBzc192bmN2aWV3ZXIgLXNzaCAtcHJveHkgZnJlZEBndy1ob3N0LGZyZWRAcGVlY2VlIGxvY2FsaG9zdDowCi0jCi0jIC1zc2hjbWQgY21kICAgUnVuICJjbWQiIHZpYSBzc2ggaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAic2xlZXAgMTUiCi0jICAgICAgICAgICAgICAgZS5nLiAtc3NoY21kICd4MTF2bmMgLWRpc3BsYXkgOjAgLWxvY2FsaG9zdCAtcmZicG9ydCA1OTAwJwotIwotIyAtc3NoYXJncyAiYXJncyIgIHBhc3MgImFyZ3MiIHRvIHRoZSBzc2ggcHJvY2VzcywgZS5nLiAtTC8tUiBwb3J0IHJlZGlycy4KLSMKLSMgLXNzaHNzbCBUdW5uZWwgdGhlIFNTTCBjb25uZWN0aW9uIHRocnUgYSBTU0ggY29ubmVjdGlvbi4gIFRoZSB0dW5uZWwgYXMKLSMgICAgICAgICB1bmRlciAtc3NoIGlzIHNldCB1cCBhbmQgdGhlIFNTTCBjb25uZWN0aW9uIGdvZXMgdGhydSBpdC4gIFVzZQotIyAgICAgICAgIHRoaXMgaWYgeW91IHdhbnQgdG8gaGF2ZSBhbmQgZW5kLXRvLWVuZCBTU0wgY29ubmVjdGlvbiBidXQgbXVzdAotIyAgICAgICAgIGdvIHRocnUgYSBTU0ggZ2F0ZXdheSBob3N0IChlLmcuIG5vdCB0aGUgdm5jIHNlcnZlcikuICBPciB1c2UKLSMgICAgICAgICB0aGlzIGlmIHlvdSBuZWVkIHRvIHR1bm5lbCBhZGRpdGlvbmFsIHNlcnZpY2VzIHZpYSAtUiBhbmQgLUwgCi0jICAgICAgICAgKHNlZSAtc3NoYXJncyBhYm92ZSkuCi0jCi0jICAgICAgICAgc3Nfdm5jdmlld2VyIC1zc2hzc2wgLXByb3h5IGZyZWRAbXlnYXRlLmNvbSBteW1hY2hpbmU6MAotIwotIyAtbGlzdGVuIChvciAtcmV2ZXJzZSkgc2V0IHVwIGEgcmV2ZXJzZSBjb25uZWN0aW9uLgotIwotIyAtYWxwaGEgIHR1cm4gb24gY3Vyc29yIGFscGhhYmxlbmRpbmcgaGFjayBpZiB5b3UgYXJlIHVzaW5nIHRoZQotIyAgICAgICAgIGVuaGFuY2VkIHRpZ2h0dm5jIHZuY3ZpZXdlci4KLSMKLSMgLWdyYWIgICB0dXJuIG9uIFhHcmFiU2VydmVyIGhhY2sgaWYgeW91IGFyZSB1c2luZyB0aGUgZW5oYW5jZWQgdGlnaHR2bmMKLSMgICAgICAgICB2bmN2aWV3ZXIgKGUuZy4gZm9yIGZ1bGxzY3JlZW4gbW9kZSBpbiBzb21lIHdpbmRvd21hbmFnZXJzIGxpa2UKLSMgICAgICAgICBmdndtIHRoYXQgZG8gbm90IG90aGVyd2lzZSB3b3JrIGluIGZ1bGxzY3JlZW4gbW9kZSkKLSMKLSMKLSMgc2V0IFZOQ1ZJRVdFUkNNRCB0byB3aGF0ZXZlciB2bmN2aWV3ZXIgY29tbWFuZCB5b3Ugd2FudCB0byB1c2UuCi0jCi1WTkNJUENNRD0ke1ZOQ1ZJRVdFUkNNRDotdm5jaXB9Ci1WTkNWSUVXRVJDTUQ9JHtWTkNWSUVXRVJDTUQ6LXZuY3ZpZXdlcn0KLWlmIFsgIlgkU1NWTkNfVFVSQk9WTkMiICE9ICJYIiBdOyB0aGVuCi0JaWYgZWNobyAiJFZOQ1ZJRVdFUkNNRCIgfCBncmVwICdcLnR1cmJvdm5jJyA+IC9kZXYvbnVsbDsgdGhlbgotCQk6Ci0JZWxzZQotCQlpZiB0eXBlICIkVk5DVklFV0VSQ01ELnR1cmJvdm5jIiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQkJVk5DVklFV0VSQ01EPSIkVk5DVklFV0VSQ01ELnR1cmJvdm5jIgotCQlmaQotCWZpCi1maQotIwotIyBTYW1lIGZvciBTVFVOTkVMLCBlLmcuIHNldCBpdCB0byAvcGF0aC90by9zdHVubmVsIG9yIHN0dW5uZWw0LCBldGMuCi0jCi0KLSMgdHVybiBvbiB2ZXJib3NlIGRlYnVnZ2luZyBvdXRwdXQKLWlmIFsgIlgkU1NfREVCVUciICE9ICJYIiAtYSAiWCRTU19ERUJVRyIgIT0gIlgwIiBdOyB0aGVuCi0Jc2V0IC14diAKLWZpCi0KLVBBVEg9JFBBVEg6L3Vzci9zYmluOi91c3IvbG9jYWwvc2JpbjovZGlzdC9zYmluOyBleHBvcnQgUEFUSAotCi1sb2NhbGhvc3Q9ImxvY2FsaG9zdCIKLWlmIHVuYW1lIHwgZ3JlcCBEYXJ3aW4gPi9kZXYvbnVsbDsgdGhlbgotCWxvY2FsaG9zdD0iMTI3LjAuMC4xIgotZmkKLQotIyB3b3JrIG91dCB3aGljaCBzdHVubmVsIHRvIHVzZSAoZGViaWFuIGluc3RhbGxzIGFzIHN0dW5uZWw0KQotc3R1bm5lbF9zZXRfaGVyZT0iIgotaWYgWyAiWCRTVFVOTkVMIiA9ICJYIiBdOyB0aGVuCi0JY2hlY2tfc3R1bm5lbD0xCi0JaWYgWyAiWCRTU1ZOQ19CQVNFRElSTkFNRSIgIT0gIlgiIF07IHRoZW4KLQkJaWYgWyAteCAiJFNTVk5DX0JBU0VESVJOQU1FL3N0dW5uZWwiIF07IHRoZW4KLQkJCXR5cGUgc3R1bm5lbCA+IC9kZXYvbnVsbCAyPiYxCi0JCQlpZiBbICQ/ID0gMCBdOyB0aGVuCi0JCQkJIyBmb3VuZCBvdXJzCi0JCQkJU1RVTk5FTD1zdHVubmVsCi0JCQkJY2hlY2tfc3R1bm5lbD0wCi0JCQlmaQotCQlmaQotCWZpCi0JaWYgWyAiWCRjaGVja19zdHVubmVsIiA9ICJYMSIgXTsgdGhlbgotCQl0eXBlIHN0dW5uZWw0ID4gL2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyA9IDAgXTsgdGhlbgotCQkJU1RVTk5FTD1zdHVubmVsNAotCQllbHNlCi0JCQlTVFVOTkVMPXN0dW5uZWwKLQkJZmkKLQlmaQotCXN0dW5uZWxfc2V0X2hlcmU9MQotZmkKLQotaGVscCgpIHsKLQl0YWlsIC1uICsyICIkMCIgfCBzZWQgLWUgJy9eJC8gcScKLX0KLQotc2Vjb25kdHJ5PSIiCi1nb3RhbHBoYT0iIgotdXNlX3NzaD0iIgotdXNlX3NzaHNzbD0iIgotZGlyZWN0X2Nvbm5lY3Q9IiIKLXNzaF9zbGVlcD0xNQotCi0jIHNsZWVwIGxvbmdlciBpbiAtbGlzdGVuIG1vZGU6Ci1pZiBlY2hvICIkKiIgfCBncmVwICcuKi1saXN0ZW4nID4gL2Rldi9udWxsOyB0aGVuCi0Jc3NoX3NsZWVwPTE4MDAKLWZpCi0KLQotc3NoX2NtZD0iIgotIyBlbnYgb3ZlcnJpZGUgb2Ygc3NoX2NtZDoKLWlmIFsgIlgkU1NfVk5DVklFV0VSX1NTSF9DTUQiICE9ICJYIiBdOyB0aGVuCi0Jc3NoX2NtZD0iJFNTX1ZOQ1ZJRVdFUl9TU0hfQ01EIgotZmkKLQotc3NoX2FyZ3M9IiIKLXNob3djZXJ0PSIiCi1yZXZlcnNlPSIiCi0KLWNpcGhlcnM9IiIKLWFub25kaD0iQUxMOlJDNCtSU0E6K1NTTHYyOkBTVFJFTkdUSCIKLWFub25kaF9zZXQ9IiIKLXN0dW5uZWxfZGVidWc9IjYiCi1pZiBbICJYJFNTX0RFQlVHIiAhPSAiWCIgLW8gIlgkU1NWTkNfVkVOQ1JZUFRfREVCVUciICE9ICJYIiAtbyAiWCRTU1ZOQ19TVFVOTkVMX0RFQlVHIiAhPSAiWCIgXTsgdGhlbgotCXN0dW5uZWxfZGVidWc9IjciCi1maQotCi1pZiBbICJYJDEiID0gIlgtdmlld2VyZmxhdm9yIiBdOyB0aGVuCi0JIyBzcGVjaWFsIGNhc2UsIHRyeSB0byBndWVzcyB3aGljaCB2aWV3ZXI6Ci0JIwotCWlmIGVjaG8gIiRWTkNWSUVXRVJDTUQiIHwgZWdyZXAgLWkgJ14oeG1lc3NhZ2V8c2xlZXAgKScgPiAvZGV2L251bGw7IHRoZW4KLQkJZWNobyAidW5rbm93biIKLQkJZXhpdCAwCi0JZmkKLQlpZiBlY2hvICIkVk5DVklFV0VSQ01EIiB8IGdyZXAgLWkgY2hpY2tlbi5vZiA+IC9kZXYvbnVsbDsgdGhlbgotCQllY2hvICJjb3R2bmMiCi0JCWV4aXQgMAotCWZpCi0JaWYgZWNobyAiJFZOQ1ZJRVdFUkNNRCIgfCBncmVwIC1pIHVsdHJhID4gL2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gInVsdHJhdm5jIgotCQlleGl0IDAKLQlmaQotCSMgT0ssIHJ1biBpdCBmb3IgaGVscCBvdXRwdXQuLi4KLQlzdHI9YCRWTkNWSUVXRVJDTUQgLWggMj4mMSB8IGhlYWQgLW4gNWAKLQlpZiBlY2hvICIkc3RyIiB8IGdyZXAgLWkgJ1RpZ2h0Vk5DLnZpZXdlcicgPiAvZGV2L251bGw7IHRoZW4KLQkJZWNobyAidGlnaHR2bmMiCi0JZWxpZiBlY2hvICIkc3RyIiB8IGdyZXAgLWkgJ1ZOQyB2aWV3ZXIgdmVyc2lvbiAzJyA+IC9kZXYvbnVsbDsgdGhlbgotCQllY2hvICJyZWFsdm5jMyIKLQllbGlmIGVjaG8gIiRzdHIiIHwgZ3JlcCAtaSAnVk5DIHZpZXdlciAuKkVkaXRpb24gNCcgPiAvZGV2L251bGw7IHRoZW4KLQkJZWNobyAicmVhbHZuYzQiCi0JZWxpZiBlY2hvICIkc3RyIiB8IGdyZXAgLWkgJ1JlYWxWTkMuTHRkJyA+IC9kZXYvbnVsbDsgdGhlbgotCQllY2hvICJyZWFsdm5jNCIKLQllbHNlCi0JCWVjaG8gInVua25vd24iCi0JZmkKLQlleGl0IDAKLWZpCi1pZiBbICJYJDEiID0gIlgtdmlld2VyaGVscCIgXTsgdGhlbgotCSRWTkNWSUVXRVJDTUQgLWggMj4mMQotCWV4aXQgMAotZmkKLQotIyBncmFiIG91ciBjbWRsaW5lIG9wdGlvbnM6Ci13aGlsZSBbICJYJDEiICE9ICJYIiBdCi1kbwotICAgIGNhc2UgJDEgaW4gCi0JIi12ZXJpZnkiKQlzaGlmdDsgdmVyaWZ5PSIkMSIKLSAgICAgICAgICAgICAgICA7OwotCSItbXljZXJ0IikJc2hpZnQ7IG15Y2VydD0iJDEiCi0gICAgICAgICAgICAgICAgOzsKLQkiLWNybCIpCQlzaGlmdDsgY3JsPSIkMSIKLSAgICAgICAgICAgICAgICA7OwotCSItcHJveHkiKQlzaGlmdDsgcHJveHk9IiQxIgotICAgICAgICAgICAgICAgIDs7Ci0JIi1zc2giKQkJdXNlX3NzaD0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLXNzaHNzbCIpCXVzZV9zc2g9MQotCQkJdXNlX3NzaHNzbD0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLXNzaGNtZCIpCXNoaWZ0OyBzc2hfY21kPSIkMSIKLSAgICAgICAgICAgICAgICA7OwotCSItc3NoYXJncyIpCXNoaWZ0OyBzc2hfYXJncz0iJDEiCi0gICAgICAgICAgICAgICAgOzsKLQkiLWFub25kaCIpCWNpcGhlcnM9ImNpcGhlcnM9JGFub25kaCIKLQkJCVVMVFJBVk5DX0RTTV9IRUxQRVJfU0hPV0NFUlRfQURIPTEKLQkJCWV4cG9ydCBVTFRSQVZOQ19EU01fSEVMUEVSX1NIT1dDRVJUX0FESAotCQkJYW5vbmRoX3NldD0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLWNpcGhlcnMiKQlzaGlmdDsgY2lwaGVycz0iY2lwaGVycz0kMSIKLSAgICAgICAgICAgICAgICA7OwotCSItYWxwaGEiKQlnb3RhbHBoYT0xCi0gICAgICAgICAgICAgICAgOzsKLQkiLXNob3djZXJ0IikJc2hvd2NlcnQ9MQotICAgICAgICAgICAgICAgIDs7Ci0JIi1saXN0ZW4iKQlyZXZlcnNlPTEKLSAgICAgICAgICAgICAgICA7OwotCSItcmV2ZXJzZSIpCXJldmVyc2U9MQotICAgICAgICAgICAgICAgIDs7Ci0JIi0ybmQiKQkJc2Vjb25kdHJ5PTEKLSAgICAgICAgICAgICAgICA7OwotCSItZ3JhYiIpCVZOQ1ZJRVdFUl9HUkFCX1NFUlZFUj0xOyBleHBvcnQgVk5DVklFV0VSX0dSQUJfU0VSVkVSCi0gICAgICAgICAgICAgICAgOzsKLQkiLXgxMWN1cnNvciIpCVZOQ1ZJRVdFUl9YMTFDVVJTT1I9MTsgZXhwb3J0IFZOQ1ZJRVdFUl9YMTFDVVJTT1IKLSAgICAgICAgICAgICAgICA7OwotCSItcmF3bG9jYWwiKQlWTkNWSUVXRVJfUkFXTE9DQUw9MTsgZXhwb3J0IFZOQ1ZJRVdFUl9SQVdMT0NBTAotICAgICAgICAgICAgICAgIDs7Ci0JIi1zY2FsZSIpCXNoaWZ0OyBTU1ZOQ19TQ0FMRT0iJDEiOyBleHBvcnQgU1NWTkNfU0NBTEUKLSAgICAgICAgICAgICAgICA7OwotCSItb25lbGlzdGVuIikJU1NWTkNfTElTVEVOX09OQ0U9MTsgZXhwb3J0IFNTVk5DX0xJU1RFTl9PTkNFCi0gICAgICAgICAgICAgICAgOzsKLQkiLXNlbmRjbGlwYm9hcmQiKQlWTkNWSUVXRVJfU0VORF9DTElQQk9BUkQ9MTsgZXhwb3J0IFZOQ1ZJRVdFUl9TRU5EX0NMSVBCT0FSRAotICAgICAgICAgICAgICAgIDs7Ci0JIi1zZW5kYWx3YXlzIikJVk5DVklFV0VSX1NFTkRfQUxXQVlTPTE7IGV4cG9ydCBWTkNWSUVXRVJfU0VORF9BTFdBWVMKLSAgICAgICAgICAgICAgICA7OwotCSItcmVjdnRleHQiKQlzaGlmdDsgVk5DVklFV0VSX1JFQ1ZfVEVYVD0iJDEiOyBleHBvcnQgVk5DVklFV0VSX1JFQ1ZfVEVYVAotICAgICAgICAgICAgICAgIDs7Ci0JIi1lc2NhcGUiKQlzaGlmdDsgVk5DVklFV0VSX0VTQ0FQRT0iJDEiOyBleHBvcnQgVk5DVklFV0VSX0VTQ0FQRQotICAgICAgICAgICAgICAgIDs7Ci0JIi1zc3ZuY19lbmNvZGluZ3MiKQlzaGlmdDsgVk5DVklFV0VSX0VOQ09ESU5HUz0iJDEiOyBleHBvcnQgVk5DVklFV0VSX0VOQ09ESU5HUwotICAgICAgICAgICAgICAgIDs7Ci0JIi1zc3ZuY19leHRyYV9vcHRzIikJc2hpZnQ7IFZOQ1ZJRVdFUkNNRF9FWFRSQV9PUFRTPSIkMSI7IGV4cG9ydCBWTkNWSUVXRVJDTURfRVhUUkFfT1BUUwotICAgICAgICAgICAgICAgIDs7Ci0JIi1yZmJ2ZXJzaW9uIikJc2hpZnQ7IFZOQ1ZJRVdFUl9SRkJWRVJTSU9OPSIkMSI7IGV4cG9ydCBWTkNWSUVXRVJfUkZCVkVSU0lPTgotICAgICAgICAgICAgICAgIDs7Ci0JIi1ub2JlbGwiKQlWTkNWSUVXRVJfTk9CRUxMPTE7IGV4cG9ydCBWTkNWSUVXRVJfTk9CRUxMCi0gICAgICAgICAgICAgICAgOzsKLQkiLXBvcHVwZml4IikJVk5DVklFV0VSX1BPUFVQX0ZJWD0xOyBleHBvcnQgVk5DVklFV0VSX1BPUFVQX0ZJWAotICAgICAgICAgICAgICAgIDs7Ci0JIi1yZWFsdm5jNCIpCVZOQ1ZJRVdFUl9JU19SRUFMVk5DND0xOyBleHBvcnQgVk5DVklFV0VSX0lTX1JFQUxWTkM0Ci0gICAgICAgICAgICAgICAgOzsKLQkiLWgiKikJaGVscDsgZXhpdCAwCi0gICAgICAgICAgICAgICAgOzsKLQkiLS1oIiopCWhlbHA7IGV4aXQgMAotICAgICAgICAgICAgICAgIDs7Ci0JKikJYnJlYWsKLSAgICAgICAgICAgICAgICA7OwotICAgIGVzYWMKLSAgICBzaGlmdAotZG9uZQotCi0jIG1heGNvbm4gaXMgc29tZXRoaW5nIHdlIGFkZGVkIHRvIHN0dW5uZWwsIHRoaXMgZGlzYWJsZXMgaXQ6Ci1pZiBbICJYJFNTX1ZOQ1ZJRVdFUl9OT19NQVhDT05OIiAhPSAiWCIgXTsgdGhlbgotCVNUVU5ORUxfRVhUUkFfT1BUUz1gZWNobyAiJFNUVU5ORUxfRVhUUkFfT1BUUyIgfCBzZWQgLWUgJ3MvbWF4Y29ubi8jbWF4Y29ubi8nYAotZWxpZiBlY2hvICIkVk5DVklFV0VSQ01EIiB8IGVncmVwIC1pICdeKHhtZXNzYWdlfHNsZWVwICknID4gL2Rldi9udWxsOyB0aGVuCi0JU1RVTk5FTF9FWFRSQV9PUFRTPWBlY2hvICIkU1RVTk5FTF9FWFRSQV9PUFRTIiB8IHNlZCAtZSAncy9tYXhjb25uLyNtYXhjb25uLydgCi1lbGlmIFsgIlgkcmV2ZXJzZSIgIT0gIlgiIF07IHRoZW4KLQlTVFVOTkVMX0VYVFJBX09QVFM9YGVjaG8gIiRTVFVOTkVMX0VYVFJBX09QVFMiIHwgc2VkIC1lICdzL21heGNvbm4vI21heGNvbm4vJ2AKLWVsc2UKLQkjIG5ldyB3YXkgKG91ciBwYXRjaGVzKS4gIG90aGVyIHRoYW4gdGhlIGFib3ZlLCB3ZSBzZXQgdGhlc2U6Ci0JaWYgWyAiWCRTS0lQX1NUVU5ORUxfT05DRSIgPSAiWCIgXTsgdGhlbgotCQlTVFVOTkVMX09OQ0U9MTsgZXhwb3J0IFNUVU5ORUxfT05DRQotCWZpCi0JaWYgWyAiWCRTS0lQX1NUVU5ORUxfTUFYX0NMSUVOVFMiID0gIlgiIF07IHRoZW4KLQkJU1RVTk5FTF9NQVhfQ0xJRU5UUz0xOyBleHBvcnQgU1RVTk5FTF9NQVhfQ0xJRU5UUwotCWZpCi1maQotIyBhbHdheXMgc2V0IHRoaXMgb25lOgotaWYgWyAiWCRTS0lQX1NUVU5ORUxfTk9fU1lTTE9HIiA9ICJYIiBdOyB0aGVuCi0JU1RVTk5FTF9OT19TWVNMT0c9MTsgZXhwb3J0IFNUVU5ORUxfTk9fU1lTTE9HCi1maQotCi0jIHRoaXMgaXMgdGhlIC10IHNzaCBvcHRpb24gKGdpdmVzIGJldHRlciBrZXlib2FyZCByZXNwb25zZSB0aHJ1IFNTSCB0dW5uZWwpCi10YXJnPSItdCIKLWlmIFsgIlgkU1NfVk5DVklFV0VSX05PX1QiICE9ICJYIiBdOyB0aGVuCi0JdGFyZz0iIgotZmkKLQotIyBzZXQgdGhlIGFscGhhIGJsZW5kaW5nIGVudi4gaGFjazogCi1pZiBbICJYJGdvdGFscGhhIiA9ICJYMSIgXTsgdGhlbgotCVZOQ1ZJRVdFUl9BTFBIQUJMRU5EPTEKLQlleHBvcnQgVk5DVklFV0VSX0FMUEhBQkxFTkQKLWVsc2UKLQlOT19BTFBIQUJMRU5EPTEKLQlleHBvcnQgTk9fQUxQSEFCTEVORAotZmkKLQotaWYgWyAiWCRyZXZlcnNlIiAhPSAiWCIgXTsgdGhlbgotCXNzaF9zbGVlcD0xODAwCi0JaWYgWyAiWCRwcm94eSIgIT0gIlgiIF07IHRoZW4KLQkJIyBjaGVjayBwcm94eSB1c2FnZSB1bmRlciByZXZlcnNlIGNvbm5lY3Rpb246Ci0JCWlmIFsgIlgkdXNlX3NzaCIgPSAiWCIgLWEgIlgkdXNlX3NzaHNzbCIgPSAiWCIgXTsgdGhlbgotCQkJZWNobyAiIgotCQkJaWYgZWNobyAiJHByb3h5IiB8IGVncmVwIC1pICIocmVwZWF0ZXJ8dmVuY3J5cHQpOi8vIiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJCToKLQkJCWVsc2UKLQkJCQllY2hvICIqV2FybmluZyo6IFNTTCAtbGlzdGVuIGFuZCBhIFdlYiBwcm94eSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIKLQkJCQlzbGVlcCAyCi0JCQlmaQotCQllbGlmIGVjaG8gIiRwcm94eSIgfCBncmVwICIsIiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJOgotCQllbHNlCi0JCQllY2hvICIiCi0JCQllY2hvICIqV2FybmluZyo6IC1saXN0ZW4gYW5kIGEgc2luZ2xlIHByb3h5L2dhdGV3YXkgZG9lcyBub3QgbWFrZSBzZW5zZS4iCi0JCQlzbGVlcCAyCi0JCWZpCi0KLQkJIyB3ZSBub3cgdHJ5IHRvIFBQUk9YWV9MT09QX1RIWVNFTEYsIHNldCB0aGlzIHZhciB0byBkaXNhYmxlIHRoYXQuCi0JCSNTU1ZOQ19MSVNURU5fT05DRT0xOyBleHBvcnQgU1NWTkNfTElTVEVOX09OQ0UKLQlmaQotZmkKLWlmIFsgIlgkc3NoX2NtZCIgPSAiWCIgXTsgdGhlbgotCSMgaWYgbm8gcmVtb3RlIHNzaCBjbWQsIHNsZWVwIGEgYml0OgotCXNzaF9jbWQ9InNsZWVwICRzc2hfc2xlZXAiCi1maQotCi0jIHRoaXMgc2hvdWxkIGJlIGEgaG9zdDpkaXNwbGF5OgotIwotb3JpZz0iJDEiCi1zaGlmdAotCi1kTD0iLUwiCi1pZiB1bmFtZSAtc3IgfCBlZ3JlcCAnU3VuT1MgNVwuWzUtOF0nID4gL2Rldi9udWxsOyB0aGVuCi0JZEw9Ii1oIgotZmkKLQotaGF2ZV91dm5jX2RzbV9oZWxwZXJfc2hvd2NlcnQ9IiIKLWlmIFsgIlgkc2hvd2NlcnQiID0gIlgxIiAtYSAiWCRTU1ZOQ19VU0VfU19DTElFTlQiID0gIlgiIC1hICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQlpZiB0eXBlIHVsdHJhdm5jX2RzbV9oZWxwZXIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWlmIHVsdHJhdm5jX2RzbV9oZWxwZXIgLWhlbHAgMj4mMSB8IGdyZXAgLXcgc2hvd2NlcnQgPi9kZXYvbnVsbDsgdGhlbgotCQkJaGF2ZV91dm5jX2RzbV9oZWxwZXJfc2hvd2NlcnQ9MQotCQlmaQotCWZpCi1maQotaGF2ZV91dm5jX2RzbV9oZWxwZXJfaXB2Nj0iIgotaWYgWyAiWCRTU1ZOQ19VTFRSQV9EU00iICE9ICJYIiBdOyB0aGVuCi0JaWYgdHlwZSB1bHRyYXZuY19kc21faGVscGVyID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlpZiB1bHRyYXZuY19kc21faGVscGVyIC1oZWxwIDI+JjEgfCBncmVwIC1pdyBpcHY2ID4vZGV2L251bGw7IHRoZW4KLQkJCWhhdmVfdXZuY19kc21faGVscGVyX2lwdjY9MQotCQlmaQotCWZpCi1maQotCi1yY2hrKCkgewotCSMgYSBrbHVkZ2UgdG8gc2V0ICRSQU5ET00gaWYgd2UgYXJlIG5vdCBiYXNoOgotCWlmIFsgIlgkQkFTSF9WRVJTSU9OIiA9ICJYIiBdOyB0aGVuCi0JCVJBTkRPTT1gZGF0ZSArJVNgYHNoIC1jICdlY2hvICQkJ2BgcHMgLWVsZiAyPiYxIHwgc3VtIDI+JjEgfCBhd2sgJ3twcmludCAkMX0nYAotCWZpCi19Ci1yY2hrCi0KLSMgYSBwb3J0YWJsZSwgYnV0IG5vdCBhYnNvbHV0ZWx5IHNhZmUsIHRtcCBmaWxlIGNyZWF0b3IKLW15dG1wKCkgewotCXRmPSQxCi0JaWYgdHlwZSBta3RlbXAgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotCQkjIGlmIHdlIGhhdmUgbWt0ZW1wKDEpLCB1c2UgaXQ6Ci0JCXRmMj0iJHRmLlhYWFhYWCIKLQkJdGYyPWBta3RlbXAgIiR0ZjIiYAotCQlpZiBbICJYJHRmMiIgIT0gIlgiIC1hIC1mICIkdGYyIiBdOyB0aGVuCi0JCQlpZiBbICJYJERFQlVHX01LVEVNUCIgIT0gIlgiIF07IHRoZW4KLQkJCQllY2hvICJteXRtcC1ta3RlbXA6ICR0ZjIiIDE+JjIKLQkJCWZpCi0JCQllY2hvICIkdGYyIgotCQkJcmV0dXJuCi0JCWZpCi0JZmkKLQkjIGZhbGxiYWNrIHRvIG11bHRpcGxlIGNtZHM6Ci0Jcm0gLXJmICIkdGYiIHx8IGV4aXQgMQotCWlmIFsgLWQgIiR0ZiIgXTsgdGhlbgotCQllY2hvICJ0bXAgZmlsZSAkdGYgc3RpbGwgZXhpc3RzIGFzIGEgZGlyZWN0b3J5LiIKLQkJZXhpdCAxCi0JZWxpZiBbICRkTCAiJHRmIiBdOyB0aGVuCi0JCWVjaG8gInRtcCBmaWxlICR0ZiBzdGlsbCBleGlzdHMgYXMgYSBzeW1saW5rLiIKLQkJZXhpdCAxCi0JZWxpZiBbIC1mICIkdGYiIF07IHRoZW4KLQkJZWNobyAidG1wIGZpbGUgJHRmIHN0aWxsIGV4aXN0cy4iCi0JCWV4aXQgMQotCWZpCi0JdG91Y2ggIiR0ZiIgfHwgZXhpdCAxCi0JY2htb2QgNjAwICIkdGYiIHx8IGV4aXQgMQotCXJjaGsKLQlpZiBbICJYJERFQlVHX01LVEVNUCIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAibXl0bXAtdG91Y2g6ICR0ZiIgMT4mMgotCWZpCi0JZWNobyAiJHRmIgotfQotCi0jIHNldCB1cCBzcGVjaWFsIGNhc2Ugb2YgdWx0cmF2bmMgc2luZ2xlIGNsaWNrIElJSSBtb2RlOgotaWYgZWNobyAiJHByb3h5IiB8IGVncmVwICJec3NscmVwZWF0ZXI6Ly8iID4gL2Rldi9udWxsOyB0aGVuCi0JcHN0cj1gZWNobyAiJHByb3h5IiB8IHNlZCAtZSAncyxzc2xyZXBlYXRlcjovLywsJ2AKLQlwc3RyMT1gZWNobyAiJHBzdHIiIHwgc2VkIC1lICdzLysuKiQvLydgCi0JcHN0cjI9YGVjaG8gIiRwc3RyIiB8IHNlZCAtZSAncy9eW14rXSorLy8nYAotCVNTVk5DX1JFUEVBVEVSPSJTQ0lJST0kcHN0cjIiOyBleHBvcnQgU1NWTkNfUkVQRUFURVIKLQlvcmlnPSRwc3RyMQotCWVjaG8KLQllY2hvICJyZXNldDogU1NWTkNfUkVQRUFURVI9JFNTVk5DX1JFUEVBVEVSIG9yaWc9JG9yaWcgcHJveHk9JyciCi0JcHJveHk9IiIKLWZpCi1pZiBlY2hvICIkcHJveHkiIHwgZWdyZXAgInZlbmNyeXB0Oi8vIiA+IC9kZXYvbnVsbDsgdGhlbgotCXZ0bXA9Ii90bXAvc3NfaGFuZHNoYWtlJHtSQU5ET019LiQkLnR4dCIKLQl2dG1wPWBteXRtcCAiJHZ0bXAiYAotCVNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRT0iJHZ0bXAiCi0JZXhwb3J0IFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRQotCWlmIFsgIlgkU1NWTkNfVVNFX09VUlMiID0gIlgiIF07IHRoZW4KLQkJTkVFRF9WRU5DUllQVF9WSUVXRVJfQlJJREdFPTEKLQlmaQotZmkKLWlmIFsgIlgkU1NWTkNfVVNFX09VUlMiID0gIlgiIF07IHRoZW4KLQlWTkNWSUVXRVJDTURfRVhUUkFfT1BUUz0iIgotZmkKLQotCi0jIGNoZWNrIC1zc2ggYW5kIC1teWNlcnQvLXZlcmlmeSBjb25mbGljdDoKLWlmIFsgIlgkdXNlX3NzaCIgPSAiWDEiIC1hICJYJHVzZV9zc2hzc2wiID0gIlgiIF07IHRoZW4KLQlpZiBbICJYJG15Y2VydCIgIT0gIlgiIC1vICJYJHZlcmlmeSIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAiLW15Y2VydCBhbmQgLXZlcmlmeSBjYW5ub3QgYmUgdXNlZCBpbiAtc3NoIG1vZGUiIAotCQlleGl0IDEKLQlmaQotZmkKLQotIyBkaXJlY3QgbW9kZSBWbmM6Ly8gbWVhbnMgc2hvdyBubyB3YXJuaW5ncy4KLSMgZGlyZWN0IG1vZGUgdm5jOi8vIHdpbGwgc2hvdyB3YXJuaW5ncy4KLWlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJ15WW05uXVtDY106Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0JU1NWTkNfTk9fRU5DX1dBUk49MQotCWV4cG9ydCBTU1ZOQ19OT19FTkNfV0FSTgotCW9yaWc9YGVjaG8gIiRvcmlnIiB8IHNlZCAtZSAncy9eLi4uOi92bmM6LydgCi1maQotCi0jIGludGVycHJlc3QgdGhlIHBzZXVkbyBVUkwgcHJvdG86Ly8gc3RyaW5nczoKLWlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJ152bmM6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuYzovLywsJ2AKLQl2ZXJpZnk9IiIKLQlteWNlcnQ9IiIKLQljcmw9IiIKLQl1c2Vfc3NoPSIiCi0JdXNlX3NzaHNzbD0iIgotCWRpcmVjdF9jb25uZWN0PTEKLWVsaWYgZWNobyAiJG9yaWciIHwgZ3JlcCAnXnZuY3M6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuY3M6Ly8sLCdgCi1lbGlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJ152bmNzc2w6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuY3NzbDovLywsJ2AKLWVsaWYgZWNobyAiJG9yaWciIHwgZ3JlcCAnXnZuYytzc2w6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuYy5zc2w6Ly8sLCdgCi1lbGlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJ152bmNzc2g6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuY3NzaDovLywsJ2AKLQl1c2Vfc3NoPTEKLWVsaWYgZWNobyAiJG9yaWciIHwgZ3JlcCAnXnZuYytzc2g6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHZuYy5zc2g6Ly8sLCdgCi0JdXNlX3NzaD0xCi1maQotCi1pZiBbICJYJFNTVk5DX1VMVFJBX0RTTSIgIT0gIlgiIF07IHRoZW4KLSAgICAgICAgdmVyaWZ5PSIiCi0gICAgICAgIG15Y2VydD0iIgotICAgICAgICBjcmw9IiIKLSAgICAgICAgdXNlX3NzaD0iIgotICAgICAgICB1c2Vfc3Noc3NsPSIiCi0gICAgICAgIGRpcmVjdF9jb25uZWN0PTEKLQlpZiBlY2hvICIkU1NWTkNfVUxUUkFfRFNNIiB8IGdyZXAgJ25vdWx0cmE6JyA+IC9kZXYvbnVsbDsgdGhlbgotCQlTU1ZOQ19OT19VTFRSQV9EU009MTsgZXhwb3J0IFNTVk5DX05PX1VMVFJBX0RTTQotCWZpCi1maQotCi0jIHJzaCBtb2RlIGlzIGFuIGludGVybmFsL3NlY3JldCB0aGluZyBvbmx5IEkgdXNlLgotcnNoPSIiCi1pZiBlY2hvICIkb3JpZyIgfCBncmVwICdecnNoOi8vJyA+IC9kZXYvbnVsbDsgdGhlbgotCXVzZV9zc2g9MQotCXJzaD0xCi0Jb3JpZz1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLHJzaDovLywsJ2AKLWVsaWYgZWNobyAiJG9yaWciIHwgZ3JlcCAnXnJzaDonID4gL2Rldi9udWxsOyB0aGVuCi0JdXNlX3NzaD0xCi0JcnNoPTEKLQlvcmlnPWBlY2hvICIkb3JpZyIgfCBzZWQgLWUgJ3MscnNoOiwsJ2AKLWZpCi0KLSMgcGxheSBhcm91bmQgd2l0aCBob3N0OmRpc3BsYXkgcG9ydDoKLWlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJzonID4gL2Rldi9udWxsOyB0aGVuCi0JOgotZWxzZQotCSMgYWRkIG9yIGFzc3VtZSA6MCBpZiBubyAnOicKLQlpZiBbICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQkJb3JpZz0iJG9yaWc6MCIKLQllbGlmIFsgIlgkb3JpZyIgPSAiWCIgXTsgdGhlbgotCQlvcmlnPSI6MCIKLQlmaQotZmkKLQotIyBleHRyYWN0IGhvc3QgYW5kIGRpc3AgbnVtYmVyOgotCi0jIHRyeSB0byBzZWUgaWYgaXQgaXMgaXB2NiBhZGRyZXNzOgotaXB2Nj0wCi1pZiBlY2hvICIkb3JpZyIgfCBncmVwICdcWycgPiAvZGV2L251bGw7IHRoZW4KLQkjIGlwdjYgW2ZlODA6OjIxOTpkYmZmOmZlZTU6M2Y5MiVldGgxXTo1OTAwCi0JaG9zdD1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzL1xdLiokLy8nIC1lICdzL1xbLy8nYAotCWRpc3A9YGVjaG8gIiRvcmlnIiB8IHNlZCAtZSAncy9eLipcXTovLydgCi0JaXB2Nj0xCi1lbGlmIGVjaG8gIiRvcmlnIiB8IGdyZXAgJzouLio6JyA+IC9kZXYvbnVsbDsgdGhlbgotCSMgaXB2NiBmZTgwOjoyMTk6ZGJmZjpmZWU1OjNmOTIlZXRoMTo1OTAwCi0JaG9zdD1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzLzpbXjpdKiQvLydgCi0JZGlzcD1gZWNobyAiJG9yaWciIHwgc2VkIC1lICdzL14uKjovLydgCi0JaXB2Nj0xCi1lbHNlCi0JIyByZWd1bGFyIGhvc3Q6cG9ydAotCWhvc3Q9YGVjaG8gIiRvcmlnIiB8IGF3ayAtRjogJ3twcmludCAkMX0nYAotCWRpc3A9YGVjaG8gIiRvcmlnIiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotZmkKLQotaWYgWyAiWCRyZXZlcnNlIiAhPSAiWCIgLWEgIlgkU1RVTk5FTF9MSVNURU4iID0gIlgiIC1hICJYJGhvc3QiICE9ICJYIiBdOyB0aGVuCi0JU1RVTk5FTF9MSVNURU49JGhvc3QKLQllY2hvICJzZXQgU1RVTk5FTF9MSVNURU49JFNUVU5ORUxfTElTVEVOIgotZmkKLQotaWYgWyAiWCRob3N0IiA9ICJYIiBdOyB0aGVuCi0JaG9zdD0kbG9jYWxob3N0Ci1maQotCi1pZiBbICJYJFNTVk5DX0lQVjYiID0gIlgwIiBdOyB0aGVuCi0JIyBkaXNhYmxlIGNoZWNraW5nIGZvciBpdC4KLQlpcHY2PTAKLSNlbGlmIFsgIlgkcmV2ZXJzZSIgIT0gIlgiIC1hICJYJGlwdjYiID0gIlgxIiBdOyB0aGVuCi0jCWlwdjY9MAotZWxpZiBbICJYJGlwdjYiID0gIlgxIiBdOyB0aGVuCi0JOgotZWxpZiBlY2hvICIkaG9zdCIgfCBncmVwICdeWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKlwuWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlbgotCToKLWVsc2UKLQkjIHJlZ3VsYXIgaG9zdG5hbWUsIGNhbid0IGJlIHN1cmUuLi4KLQlnb3V0PSIiCi0JaWYgdHlwZSBnZXRlbnQgPiAvZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZ291dD1gZ2V0ZW50IGhvc3RzICIkaG9zdCIgMj4vZGV2L251bGxgCi0JZmkKLQlpZiBlY2hvICIkZ291dCIgfCBncmVwICc6Lio6JyA+IC9kZXYvbnVsbDsgdGhlbgotCQlpZiBlY2hvICIkZ291dCIgfCBncmVwICdeWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKlwuWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlbgotCQkJOgotCQllbHNlCi0JCQllY2hvICJpcHY2OiAiYGVjaG8gIiRnb3V0IiB8IGdyZXAgJzouKjonIHwgaGVhZCAtbiAxYAotCQkJaXB2Nj0xCi0JCWZpCi0JZmkKLQlpZiBbICJYJGlwdjYiID0gIlgwIiBdOyB0aGVuCi0JCWhvdXQ9IiIKLQkJaWYgdHlwZSBob3N0ID4gL2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCQlob3N0ICIkaG9zdCIgPi9kZXYvbnVsbCAyPiYxCi0JCQlob3N0ICIkaG9zdCIgPi9kZXYvbnVsbCAyPiYxCi0JCQlob3V0PWBob3N0ICIkaG9zdCIgMj4vZGV2L251bGxgCi0JCWZpCi0JCWlmIGVjaG8gIiRob3V0IiB8IGdyZXAgLWkgJ2hhcyBpcHY2IGFkZHJlc3MnID4gL2Rldi9udWxsOyB0aGVuCi0JCQlpZiBlY2hvICIkaG91dCIgfCBncmVwIC1pICdoYXMgYWRkcmVzcycgPiAvZGV2L251bGw7IHRoZW4KLQkJCQk6Ci0JCQllbHNlCi0JCQkJZWNobyAiaXB2NjogImBlY2hvICIkaG91dCIgfCBncmVwIC1pICdoYXMgaXB2NiBhZGRyZXNzJyB8IGhlYWQgLW4gMWAKLQkJCQlpcHY2PTEKLQkJCWZpCi0JCWZpCi0JZmkKLQlpZiBbICJYJGlwdjYiID0gIlgwIiBdOyB0aGVuCi0JCWRvdXQ9IiIKLQkJaWYgdHlwZSBkaWcgPiAvZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZG91dD1gZGlnIC10IGFueSAiJGhvc3QiIDI+L2Rldi9udWxsYAotCQlmaQotCQlpZiBlY2hvICIkZG91dCIgfCBncmVwIC1pICJeJGhvc3QiIHwgZ3JlcCAnWyAJXUFBQUFbIAldJyA+IC9kZXYvbnVsbDsgdGhlbgotCQkJaWYgZWNobyAiJGRvdXQiIHwgZ3JlcCAtaSAiXiRob3N0IiB8IGdyZXAgJ1sgCV1BWyAJXScgPiAvZGV2L251bGw7IHRoZW4KLQkJCQk6Ci0JCQllbHNlCi0JCQkJZWNobyAiaXB2NjogImBlY2hvICIkZG91dCIgfCBncmVwIC1pICdbIAldQUFBQVsgCV0nIHwgaGVhZCAtbiAxYAotCQkJCWlwdjY9MQotCQkJZmkKLQkJZmkKLQlmaQotCWlmIFsgIlgkaXB2NiIgPSAiWDAiIF07IHRoZW4KLQkJc291dD1gZW52IExPT0tVUD0iJGhvc3QiIFwKLQkJICAgICAgcGVybCAtZSAnCWV2YWwge3VzZSBTb2NrZXR9OyAgZXhpdCAwIGlmICRAOwotCQkJCWV2YWwge3VzZSBTb2NrZXQ2fTsgZXhpdCAwIGlmICRAOwotCQkJCUByZXMgPSBnZXRhZGRyaW5mbygkRU5We0xPT0tVUH0sICJkYXl0aW1lIiwgQUZfVU5TUEVDLCBTT0NLX1NUUkVBTSk7Ci0JCQkJJGlwdjQgPSAwOwotCQkJCSRpcHY2ID0gMDsKLQkJCQkkaXA2ID0gIiI7Ci0JCQkJd2hpbGUgKHNjYWxhcihAcmVzKSA+PSA1KSB7Ci0JCQkJCSgkZmFtaWx5LCAkc29ja3R5cGUsICRwcm90bywgJHNhZGRyLCAkY2Fub24sIEByZXMpID0gQHJlczsKLQkJCQkJJGlwdjQgPSAxIGlmICRmYW1pbHkgPT0gQUZfSU5FVDsKLQkJCQkJJGlwdjYgPSAxIGlmICRmYW1pbHkgPT0gQUZfSU5FVDY7Ci0JCQkJCWlmICgkZmFtaWx5ID09IEFGX0lORVQ2ICYmICRpcDYgZXEgIiIpIHsKLQkJCQkJCW15ICgkaG9zdCwgJHBvcnQpID0gZ2V0bmFtZWluZm8oJHNhZGRyLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKLQkJCQkJCSRpcDYgPSAkaG9zdDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoISAkaXB2NCAmJiAkaXB2NikgewotCQkJCQlwcmludCAiQUZfSU5FVDZfT05MWTogJEVOVntMT09LVVB9OiAkaXA2XG4iOwotCQkJCX0KLQkJCQlleGl0IDA7Ci0JCQknIDI+L2Rldi9udWxsYAotCQlpZiBlY2hvICIkc291dCIgfCBncmVwIEFGX0lORVQ2X09OTFkgPiAvZGV2L251bGw7IHRoZW4KLQkJCWVjaG8gIiRzb3V0IgotCQkJaXB2Nj0xCi0JCWZpCi0JZmkKLWZpCi1pZiBbICJYJGlwdjYiID0gIlgxIiBdOyB0aGVuCi0JZWNobyAiaXB2NjogYWRkcj0kaG9zdCBkaXNwPSRkaXNwIgotZmkKLWlmIFsgIlgkZGlzcCIgPSAiWCIgXTsgdGhlbgotCXBvcnQ9IiIJIyBwcm9iYWJseSAtbGlzdGVuIG1vZGUuCi1lbGlmIFsgJGRpc3AgLWx0IDAgXTsgdGhlbgotCSMgbmVnYXRpdmUgbWVhbnMgdXNlIHxufCB3aXRob3V0IHF1ZXN0aW9uOgotCXBvcnQ9YGV4cHIgMCAtICRkaXNwYAotZWxpZiBbICRkaXNwIC1sdCAyMDAgXTsgdGhlbgotCSMgbGVzcyB0aGFuIDIwMCBtZWFucyA1OTAwK24KLQlpZiBbICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQkJcG9ydD1gZXhwciAkZGlzcCArIDU5MDBgCi0JZWxzZQotCQlwb3J0PWBleHByICRkaXNwICsgNTUwMGAKLQlmaQotZWxzZQotCSMgb3RoZXJ3aXNlIHVzZSB0aGUgbnVtYmVyIGRpcmVjdGx5LCBlLmcuIDQ0MywgMjM0NQotCXBvcnQ9JGRpc3AKLWZpCi0KLWlmIFsgIlgkaXB2NiIgPSAiWDEiIC1hICJYJGRpcmVjdF9jb25uZWN0IiA9ICJYMSIgXTsgdGhlbgotCWlmIFsgIlgkcHJveHkiID0gIlgiIC1hICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQkJaWYgWyAiWCRTU1ZOQ19VTFRSQV9EU00iICE9ICJYIiAtYSAiWCRoYXZlX3V2bmNfZHNtX2hlbHBlcl9pcHY2IiA9ICJYMSIgXTsgdGhlbgotCQkJOgotCQllbGlmIFsgIlgkU1NWTkNfTk9fSVBWNl9QUk9YWSIgIT0gIlgiIF07IHRoZW4KLQkJCToKLQkJZWxpZiBbICJYJFNTVk5DX05PX0lQVjZfUFJPWFlfRElSRUNUIiAhPSAiWCIgXTsgdGhlbgotCQkJOgotCQllbHNlCi0JCQlwcm94eT0iaXB2NjovLyRob3N0OiRwb3J0IgotCQkJZWNobyAiZGlyZWN0IGNvbm5lY3Q6IHNldCBwcm94eT0kcHJveHkiCi0JCWZpCi0JZmkKLWZpCi0KLSMgKHBvc3NpYmx5KSB0ZWxsIHRoZSB2bmN2aWV3ZXIgdG8gb25seSBsaXN0ZW4gb24gbG86IAotaWYgWyAiWCRyZXZlcnNlIiAhPSAiWCIgXTsgdGhlbgotCWlmIFsgIlgkZGlyZWN0X2Nvbm5lY3QiID0gIlgiIC1vICJYJHByb3h5IiAhPSAiWCIgLW8gIlgkU1RVTk5FTF9MSVNURU4iICE9ICJYIiBdOyB0aGVuCi0JCVZOQ1ZJRVdFUl9MSVNURU5fTE9DQUxIT1NUPTEKLQkJZXhwb3J0IFZOQ1ZJRVdFUl9MSVNURU5fTE9DQUxIT1NUCi0JZmkKLWZpCi0KLSMgdHJ5IHRvIGZpbmQgYW4gb3BlbiBsaXN0ZW5pbmcgcG9ydCB2aWEgbmV0c3RhdCgxKToKLWludXNlPSIiCi1pZiB1bmFtZSB8IGdyZXAgTGludXggPiAvZGV2L251bGw7IHRoZW4KLQlpbnVzZT1gbmV0c3RhdCAtYW50IHwgZWdyZXAgJ0xJU1RFTnxXQUlUfEVTVEFCTElTSHxDTE9TRScgfCBhd2sgJ3twcmludCAkNH0nIHwgc2VkICdzL14uKjovLydgCi1lbGlmIHVuYW1lIHwgZ3JlcCBTdW5PUyA+IC9kZXYvbnVsbDsgdGhlbgotCWludXNlPWBuZXRzdGF0IC1hbiAtZiBpbmV0IC1QIHRjcCB8IGVncmVwICdMSVNURU58V0FJVHxFU1RBQkxJU0h8Q0xPU0UnIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNlZCAncy9eLipcLi8vJ2AKLWVsaWYgdW5hbWUgfCBlZ3JlcCAtaSAnYnNkfGRhcndpbicgPiAvZGV2L251bGw7IHRoZW4KLQlpbnVzZT1gbmV0c3RhdCAtYW50IC1mIGluZXQgfCBlZ3JlcCAnTElTVEVOfFdBSVR8RVNUQUJMSVNIfENMT1NFJyB8IGF3ayAne3ByaW50ICQ0fScgfCBzZWQgJ3MvXi4qXC4vLydgCi0jIGFkZCBvdGhlcnMuLi4KLWZpCi0KLSMgdGhpcyBpcyBhIGNydWRlIGF0dGVtcHQgZm9yIHVuaXF1ZSBwb3J0cyB0YWdzLCBldGMuCi1kYXRlX3NlYz1gZGF0ZSArJVNgCi0KLSMgdGhlc2UgYXJlIHNwZWNpYWwgY2FzZXMgb2Ygbm8gdm5jLCBlLmcuIHNsZWVwIG9yIHhtZXNzYWdlLgotIyB0aGVzZSBhcmUgZm9yIHVzaW5nIHNzdm5jIGFzIGEgZ2VuZXJhbCBwb3J0IHJlZGlyZWN0b3IuCi1pZiBlY2hvICIkVk5DVklFV0VSQ01EIiB8IGdyZXAgJ15zbGVlcFsgCV1bIAldKlswLTldWzAtOV0qJyA+IC9kZXYvbnVsbDsgdGhlbgotCWlmIFsgIlgkU1NfVk5DVklFV0VSX0xJU1RFTl9QT1JUIiA9ICJYIiBdOyB0aGVuCi0JCXA9YGVjaG8gIiRWTkNWSUVXRVJDTUQiIHwgYXdrICd7cHJpbnQgJDN9J2AKLQkJaWYgWyAiWCRwIiAhPSAiWCIgXTsgdGhlbgotCQkJU1NfVk5DVklFV0VSX0xJU1RFTl9QT1JUPSRwCi0JCWZpCi0JZmkKLQlwMj1gZWNobyAiJFZOQ1ZJRVdFUkNNRCIgfCBhd2sgJ3twcmludCAkMn0nYAotCVZOQ1ZJRVdFUkNNRD0iZXZhbCBzbGVlcCAkcDI7IGVjaG8gTG9jYWwgIgotZWxpZiBlY2hvICIkVk5DVklFV0VSQ01EIiB8IGdyZXAgJ154bWVzc2FnZVsgCV1bIAldKlswLTldWzAtOV0qJyA+IC9kZXYvbnVsbDsgdGhlbgotCWlmIFsgIlgkU1NfVk5DVklFV0VSX0xJU1RFTl9QT1JUIiA9ICJYIiBdOyB0aGVuCi0JCXA9YGVjaG8gIiRWTkNWSUVXRVJDTUQiIHwgYXdrICd7cHJpbnQgJDJ9J2AKLQkJU1NfVk5DVklFV0VSX0xJU1RFTl9QT1JUPSRwCi0JZmkKLWZpCi0KLSMgdXRpbGl0eSB0byBmaW5kIGEgZnJlZSBwb3J0IHRvIGxpc3RlbiBvbi4KLWZpbmRmcmVlKCkgewotCXRyeTA9JDEKLQl0cnk9JHRyeTAKLQl1c2UwPSIiCi0KLQlpZiBbICJYJFNTX1ZOQ1ZJRVdFUl9MSVNURU5fUE9SVCIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAiJFNTX1ZOQ1ZJRVdFUl9MSVNURU5fUE9SVCIKLQkJcmV0dXJuCQotCWZpCi0JaWYgWyAkdHJ5IC1nZSA2MDAwIF07IHRoZW4KLQkJZm1heD1gZXhwciAkdHJ5ICsgMTAwMGAKLQllbHNlCi0JCWZtYXg9NjAwMAotCWZpCi0KLQl3aGlsZSBbICR0cnkgLWx0ICRmbWF4IF0KLQlkbwotCQlpZiBbICJYJGludXNlIiA9ICJYIiBdOyB0aGVuCi0JCQlicmVhawotCQlmaQotCQlpZiBlY2hvICIkaW51c2UiIHwgZ3JlcCAtdyAkdHJ5ID4gL2Rldi9udWxsOyB0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCXVzZTA9JHRyeQotCQkJYnJlYWsKLQkJZmkKLQkJdHJ5PWBleHByICR0cnkgKyAxYAotCWRvbmUKLQlpZiBbICJYJHVzZTAiID0gIlgiIF07IHRoZW4KLQkJdXNlMD1gZXhwciAkZGF0ZV9zZWMgKyAkdHJ5MGAKLQlmaQotCi0JZWNobyAkdXNlMAotfQotCi0jIHV0aWxpdHkgZm9yIGV4aXRpbmc7IGtpbGxzIHNvbWUgaGVscGVyIHByb2Nlc3NlcywKLSMgcmVtb3ZlcyBmaWxlcywgZXRjLgotZmluYWwoKSB7Ci0JZWNobyAiIgotCWlmIFsgIlgkdG1wX2NmZyIgIT0gIlgiIF07IHRoZW4KLQkJcm0gLWYgJHRtcF9jZmcKLQlmaQotCWlmIFsgIlgkU1NfVk5DVklFV0VSX1JNIiAhPSAiWCIgXTsgdGhlbgotCQlybSAtZiAkU1NfVk5DVklFV0VSX1JNIDI+L2Rldi9udWxsCi0JZmkKLQlpZiBbICJYJHRjZXJ0IiAhPSAiWCIgXTsgdGhlbgotCQlybSAtZiAkdGNlcnQKLQlmaQotCWlmIFsgIlgkcHNzaCIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAiVGVybWluYXRpbmcgYmFja2dyb3VuZCBzc2ggcHJvY2VzcyIKLQkJZWNobyBraWxsIC1URVJNICIkcHNzaCIKLQkJa2lsbCAtVEVSTSAiJHBzc2giIDI+L2Rldi9udWxsCi0JCXNsZWVwIDEKLQkJa2lsbCAtS0lMTCAiJHBzc2giIDI+L2Rldi9udWxsCi0JCXBzc2g9IiIKLQlmaQotCWlmIFsgIlgkc3R1bm5lbF9waWQiICE9ICJYIiBdOyB0aGVuCi0JCWVjaG8gIlRlcm1pbmF0aW5nIGJhY2tncm91bmQgc3R1bm5lbCBwcm9jZXNzIgotCQllY2hvIGtpbGwgLVRFUk0gIiRzdHVubmVsX3BpZCIKLQkJa2lsbCAtVEVSTSAiJHN0dW5uZWxfcGlkIiAyPi9kZXYvbnVsbAotCQlzbGVlcCAxCi0JCWtpbGwgLUtJTEwgIiRzdHVubmVsX3BpZCIgMj4vZGV2L251bGwKLQkJc3R1bm5lbF9waWQ9IiIKLQlmaQotCWlmIFsgIlgkZHNtX3BpZCIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAiVGVybWluYXRpbmcgYmFja2dyb3VuZCB1bHRyYXZuY19kc21faGVscGVyIHByb2Nlc3MiCi0JCWVjaG8ga2lsbCAtVEVSTSAiJGRzbV9waWQiCi0JCWtpbGwgLVRFUk0gIiRkc21fcGlkIiAyPi9kZXYvbnVsbAotCQlzbGVlcCAxCi0JCWtpbGwgLUtJTEwgIiRkc21fcGlkIiAyPi9kZXYvbnVsbAotCQlzdHVubmVsX3BpZD0iIgotCWZpCi0JaWYgWyAiWCR0YWlsX3BpZCIgIT0gIlgiIF07IHRoZW4KLQkJa2lsbCAtVEVSTSAkdGFpbF9waWQKLQlmaQotCWlmIFsgIlgkdGFpbF9waWQyIiAhPSAiWCIgXTsgdGhlbgotCQlraWxsIC1URVJNICR0YWlsX3BpZDIKLQlmaQotfQotCi1pZiBbICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQkjIG5vcm1hbCBjb25uZWN0aW9ucyB0cnkgNTkzMC01OTk5OgotCWlmIFsgIlgkc2hvd2NlcnQiID0gIlgiIF07IHRoZW4KLQkJdXNlPWBmaW5kZnJlZSA1OTMwYAotCWVsc2UKLQkJIyBtb3ZlIGF3YXkgZnJvbSBub3JtYWwgcGxhY2UgZm9yIChwb3NzaWJseSBtYW55KSAtc2hvd2NlcnQKLQkJcHN0YXJ0PWBkYXRlICslU2AKLQkJcHN0YXJ0PWBleHByIDYxMzAgKyAkcHN0YXJ0ICsgJHBzdGFydGAKLQkJdXNlPWBmaW5kZnJlZSAkcHN0YXJ0YAotCWZpCi0JaWYgWyAkdXNlIC1nZSA1OTAwIF07IHRoZW4KLQkJTj1gZXhwciAkdXNlIC0gNTkwMGAKLQllbHNlCi0JCU49JHVzZQotCWZpCi1lbHNlCi0JIyByZXZlcnNlIGNvbm5lY3Rpb25zOgotCXAyPWBleHByICRwb3J0ICsgMzBgCi0JdXNlPWBmaW5kZnJlZSAkcDJgCi0JaWYgWyAkdXNlIC1nZSA1NTAwIF07IHRoZW4KLQkJTj1gZXhwciAkdXNlIC0gNTUwMGAKLQllbHNlCi0JCU49JHVzZQotCWZpCi1maQotCi0jIHRoaXMgaXMgZm9yIG15IHNwZWNpYWwgdXNlIG9mIHNzX3ZuY2lwIC0+IHZuY2lwIHZpZXdlci4KLWlmIGVjaG8gIiQwIiB8IGdyZXAgdm5jaXAgPiAvZGV2L251bGw7IHRoZW4KLQlWTkNWSUVXRVJDTUQ9IiRWTkNJUENNRCIKLWZpCi0KLWlmIGVjaG8gIiRWTkNWSUVXRVJDTUQiIHwgZWdyZXAgLWkgJ14oeG1lc3NhZ2V8c2xlZXAgKScgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci1lbGlmIFsgIlgkVk5DVklFV0VSQ01EX0VYVFJBX09QVFMiICE9ICJYIiBdOyB0aGVuCi0JVk5DVklFV0VSQ01EPSIkVk5DVklFV0VSQ01EICRWTkNWSUVXRVJDTURfRVhUUkFfT1BUUyIKLWZpCi0KLSMgdHJpY2sgZm9yIHRoZSB1bmRvY3VtZW50ZWQgcnNoOi8vaG9zdDpwb3J0IG1ldGhvZC4KLXJzaF9zZXR1cCgpIHsKLQlpZiBlY2hvICIkc3NoX2hvc3QiIHwgZ3JlcCAnQCcgPiAvZGV2L251bGw7IHRoZW4KLQkJdWw9YGVjaG8gIiRzc2hfaG9zdCIgfCBhd2sgLUZAICd7cHJpbnQgJDF9J2AKLQkJdWw9Ii1sICR1bCIKLQkJc3NoX2hvc3Q9YGVjaG8gIiRzc2hfaG9zdCIgfCBhd2sgLUZAICd7cHJpbnQgJDJ9J2AKLQllbHNlCi0JCXVsPSIiCi0JZmkKLQlzc2hfY21kPWBlY2hvICIkc3NoX2NtZCIgfCBzZWQgLWUgJ3MvIC1sb2NhbGhvc3QvIC9nJ2AKLX0KLQotIyB0cmljayBmb3IgdGhlIHVuZG9jdW1lbnRlZCByc2g6Ly9ob3N0OnBvcnQgbWV0aG9kLgotcnNoX3ZpZXdlcigpIHsKLQl0cmFwICJmaW5hbCIgMCAyIDE1Ci0JaWYgWyAiWCRQT1JUIiA9ICJYIiBdOyB0aGVuCi0JCWV4aXQgMQotCWVsaWYgWyAkUE9SVCAtZ2UgNTkwMCBdOyB0aGVuCi0JCXZkcHk9YGV4cHIgJFBPUlQgLSA1OTAwYAotCWVsc2UKLQkJdmRweT0iOiRQT1JUIgotCWZpCi0Jc3R0eSBzYW5lCi0JZWNobyAiJFZOQ1ZJRVdFUkNNRCIgIiRAIiAkc3NoX2hvc3Q6JHZkcHkKLQllY2hvICIiCi0JJFZOQ1ZJRVdFUkNNRCAiJEAiICRzc2hfaG9zdDokdmRweQotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCXNsZWVwIDIKLQkJJFZOQ1ZJRVdFUkNNRCAiJEAiICRzc2hfaG9zdDokdmRweQotCWZpCi19Ci0KLWNoZWNrX3BlcmwoKSB7Ci0JaWYgdHlwZSAiJDEiID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJOgotCWVsaWYgWyAhIC14ICIkMSIgXTsgdGhlbgotCQllY2hvICIiCi0JCWVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCi0JCWVjaG8gIioqIFByb2JsZW0gZmluZGluZyB0aGUgUGVybCBjb21tYW5kICckMSc6ICoqIgotCQllY2hvICIiCi0JCXR5cGUgInBlcmwiCi0JCWVjaG8gIiIKLQkJZWNobyAiKiogUGVyaGFwcyB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBQZXJsIHBhY2thZ2UuICoqIgotCQllY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgotCQllY2hvICIiCi0JCXNsZWVwIDUKLQlmaQotfQotCi0jIHRoaXMgaXMgdGhlIFBQUk9YWSB0b29sLiAgdXNlZCBvbmx5IGhlcmUgZm9yIG5vdy4uLiAKLXBjb2RlKCkgewotCXRmPSQxCi0JUFBST1hZX1BST1hZPSRwcm94eTsgZXhwb3J0IFBQUk9YWV9QUk9YWQotCVBQUk9YWV9ERVNUPSIkaG9zdDokcG9ydCI7IGV4cG9ydCBQUFJPWFlfREVTVAotCWNoZWNrX3BlcmwgL3Vzci9iaW4vcGVybAotCi0JY29kPScjIS91c3IvYmluL3BlcmwKLQotIyBBIGhhY2sgdG8gZ2x1ZSBzdHVubmVsIHRvIGEgV2ViIG9yIFNPQ0tTIHByb3h5LCBVbHRyYVZOQyByZXBlYXRlciBmb3IKLSMgY2xpZW50IGNvbm5lY3Rpb25zLgotIyBBbHNvIGFjdHMgYXMgYSBWZU5DcnlwdCBicmlkZ2UgKGJ5IHJlZGlyZWN0aW5nIHRvIHN0dW5uZWwuKQotCi11c2UgSU86OlNvY2tldDo6SU5FVDsKLQotbXkgJGhhdmVfaW5ldDYgPSAiIjsKLWV2YWwgInVzZSBJTzo6U29ja2V0OjpJTkVUNjsiOwotJGhhdmVfaW5ldDYgPSAxIGlmICRAIGVxICIiOwotCi0jbXkgJGhhdmVfc29jazYgPSAiIjsKLSNldmFsICJ1c2UgU29ja2V0OyB1c2UgU29ja2V0NjsiOwotIyRoYXZlX3NvY2s2ID0gMSBpZiAkQCBlcSAiIjsKLQotaWYgKGV4aXN0cyAkRU5We1BQUk9YWV9MT09QX1RIWVNFTEZ9KSB7Ci0JIyB1c2VkIGZvciByZXZlcnNlIHZuYywgcnVuIGEgcmVwZWF0aW5nIG91dGVyIGxvb3AuCi0JcHJpbnQgU1RERVJSICJQUFJPWFlfTE9PUDogJEVOVntQUFJPWFlfTE9PUF9USFlTRUxGfVxuIjsKLQlteSAkcm0gPSAkRU5We1BQUk9YWV9SRU1PVkV9OwotCW15ICRscCA9ICRFTlZ7UFBST1hZX0xPT1BfVEhZU0VMRn07Ci0JZGVsZXRlICRFTlZ7UFBST1hZX1JFTU9WRX07Ci0JZGVsZXRlICRFTlZ7UFBST1hZX0xPT1BfVEhZU0VMRn07Ci0JJEVOVntQUFJPWFlfTE9PUF9USFlTRUxGX01BU1RFUn0gPSAkJDsKLQlteSAkcGlkID0gJCQ7Ci0JbXkgJGRiZyA9IDA7Ci0JbXkgJGMgPSAwOwotCXVzZSBQT1NJWCAiOnN5c193YWl0X2giOwotCXdoaWxlICgxKSB7Ci0JCSRwaWQgPSBmb3JrKCk7Ci0JCWxhc3QgaWYgISBkZWZpbmVkICRwaWQ7Ci0JCWlmICgkcGlkIGVxICIwIikgewotCQkJbGFzdDsKLQkJfQotCQkkYysrOwotCQlwcmludCBTVERFUlIgIlxuUFBST1hZX0xPT1A6IHBpZD0kJCBjaGlsZD0kcGlkIGNvdW50PSRjXG4iOwotCQl3aGlsZSAoMSkgewotCQkJd2FpdHBpZCgtMSwgV05PSEFORyk7Ci0JCQlmc2xlZXAoMC4yNSk7Ci0JCQlpZiAoISBraWxsIDAsICRwaWQpIHsKLQkJCQlwcmludCBTVERFUlIgIlBQUk9YWV9MT09QOiBjaGlsZD0kcGlkIGdvbmUuXG4iOwotCQkJCWxhc3Q7Ci0JCQl9Ci0JCQlwcmludCBTVERFUlIgIlBQUk9YWV9MT09QOiBjaGlsZD0kcGlkIGFsaXZlLlxuIiBpZiAkZGJnOwotCQkJaWYgKCEgLWYgJGxwKSB7Ci0JCQkJcHJpbnQgU1RERVJSICJQUFJPWFlfTE9PUDogZmxhZyBmaWxlICRscCBnb25lLCBraWxsaW5nICRwaWRcbiI7Ci0JCQkJa2lsbCBURVJNLCAkcGlkOwotCQkJCWZzbGVlcCgwLjEpOwotCQkJCXdhaXQ7Ci0JCQkJbGFzdDsKLQkJCX0KLQkJCXByaW50IFNUREVSUiAiUFBST1hZX0xPT1A6IGZpbGUgZXhpc3RzICRscFxuIiBpZiAkZGJnOwotCQl9Ci0JCWxhc3QgaWYgISAtZiAkbHA7Ci0JCWZzbGVlcCgwLjI1KTsKLQl9Ci0JaWYgKCRwaWQgbmUgIjAiKSB7Ci0JCXVubGluaygkMCkgaWYgJHJtOwotCQlleGl0IDA7Ci0JfQotfQotCi1pZiAoZXhpc3RzICRFTlZ7UFBST1hZX1NMRUVQfSAmJiAkRU5We1BQUk9YWV9TTEVFUH0gPiAwKSB7Ci0JcHJpbnQgU1RERVJSICJQUFJPWFlfUElEOiAkJFxuIjsKLQlzbGVlcCAkRU5We1BQUk9YWV9TTEVFUH07Ci19Ci0KLWZvcmVhY2ggbXkgJHZhciAocXcoCi0JCVBQUk9YWV9ERVNUCi0JCVBQUk9YWV9LSUxMUElECi0JCVBQUk9YWV9MSVNURU4KLQkJUFBST1hZX1BST1hZCi0JCVBQUk9YWV9SRU1PVkUKLQkJUFBST1hZX1JFUEVBVEVSCi0JCVBQUk9YWV9SRVZFUlNFCi0JCVBQUk9YWV9TTEVFUAotCQlQUFJPWFlfU09DS1MKLQkJUFBST1hZX1ZFTkNSWVBUCi0JCVBQUk9YWV9WRU5DUllQVF9WSUVXRVJfQlJJREdFCi0gICAgKSkgewotCWlmICgwIHx8ICRFTlZ7U1NfREVCVUd9IHx8ICRFTlZ7U1NWTkNfVkVOQ1JZUFRfREVCVUd9KSB7Ci0JCXByaW50IFNUREVSUiAiJHZhcjogJEVOVnskdmFyfVxuIjsKLQl9Ci19IAotCi1pZiAoJEVOVntQUFJPWFlfU09DS1N9IG5lICIiICYmICRFTlZ7UFBST1hZX1BST1hZfSAhfiBtLF5zb2NrczU/Oi8vLGkpIHsKLQlpZiAoJEVOVntQUFJPWFlfU09DS1N9IGVxICI1IikgewotCQkkRU5We1BQUk9YWV9QUk9YWX0gPSAic29ja3M1Oi8vJEVOVntQUFJPWFlfUFJPWFl9IjsKLQl9IGVsc2UgewotCQkkRU5We1BQUk9YWV9QUk9YWX0gPSAic29ja3M6Ly8kRU5We1BQUk9YWV9QUk9YWX0iOwotCX0KLX0KLQotbXkgJHJmYlNlY1R5cGVBbm9uVGxzICA9IDE4OwotbXkgJHJmYlNlY1R5cGVWZW5jcnlwdCA9IDE5OwotCi1teSAkcmZiVmVuY3J5cHRQbGFpbiAgICAgICAgPSAyNTY7Ci1teSAkcmZiVmVuY3J5cHRUbHNOb25lICAgICAgPSAyNTc7Ci1teSAkcmZiVmVuY3J5cHRUbHNWbmMgICAgICAgPSAyNTg7Ci1teSAkcmZiVmVuY3J5cHRUbHNQbGFpbiAgICAgPSAyNTk7Ci1teSAkcmZiVmVuY3J5cHRYNTA5Tm9uZSAgICAgPSAyNjA7Ci1teSAkcmZiVmVuY3J5cHRYNTA5Vm5jICAgICAgPSAyNjE7Ci1teSAkcmZiVmVuY3J5cHRYNTA5UGxhaW4gICAgPSAyNjI7Ci0KLW15ICRoYW5kc2hha2VfZmlsZSA9ICIiOwotaWYgKGV4aXN0cyAkRU5We1NTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRX0pICB7Ci0JJGhhbmRzaGFrZV9maWxlID0gJEVOVntTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0V9OwotfQotCi1teSAkaGF2ZV9nZXR0aW1lb2ZkYXkgPSAwOwotZXZhbCAidXNlIFRpbWU6OkhpUmVzOyI7Ci1pZiAoJEAgZXEgIiIpIHsKLQkkaGF2ZV9nZXR0aW1lb2ZkYXkgPSAxOwotfQotc3ViIGdldHRpbWUgewotCW15ICR0ID0gIjAuMCI7Ci0JaWYgKCRoYXZlX2dldHRpbWVvZmRheSkgewotCQkkdCA9IFRpbWU6OkhpUmVzOjpnZXR0aW1lb2ZkYXkoKTsKLQl9Ci0JcmV0dXJuICR0OwotfQotCi1teSAkbGlzdGVuX2hhbmRsZSA9ICIiOwotbXkgJHNvY2sgPSAiIjsKLW15ICRwYXJlbnQgPSAkJDsKLQotbXkgJGluaXRpYWxfZGF0YSA9ICIiOwotCi1pZiAoJEVOVntQUFJPWFlfVkVOQ1JZUFRfVklFV0VSX0JSSURHRX0pIHsKLQlteSAoJGZyb20sICR0bykgPSBzcGxpdCgvLC8sICRFTlZ7UFBST1hZX1ZFTkNSWVBUX1ZJRVdFUl9CUklER0V9KTsKLQlkb192ZW5jcnlwdF92aWV3ZXJfYnJpZGdlKCRmcm9tLCAkdG8pOwotCWV4aXQgMDsKLX0KLQotbXkgKCRmaXJzdCwgJHNlY29uZCwgJHRoaXJkKSA9IHNwbGl0KC8sLywgJEVOVntQUFJPWFlfUFJPWFl9LCAzKTsKLW15ICgkbW9kZV8xc3QsICRtb2RlXzJuZCwgJG1vZGVfM3JkKSA9ICgiIiwgIiIsICIiKTsKLQotKCRmaXJzdCwgJG1vZGVfMXN0KSA9IHVybF9wYXJzZSgkZmlyc3QpOwotCi1teSAoJHByb3h5X2hvc3QsICRwcm94eV9wb3J0KSA9ICgkZmlyc3QsICIiKTsKLWlmICgkcHJveHlfaG9zdCA9fiAvXiguKik6KFxkKykkLykgewotCSRwcm94eV9ob3N0ID0gJDE7Ci0JJHByb3h5X3BvcnQgPSAkMjsKLX0KLW15ICRjb25uZWN0ID0gJEVOVntQUFJPWFlfREVTVH07Ci0KLWlmICgkc2Vjb25kIG5lICIiKSB7Ci0JKCRzZWNvbmQsICRtb2RlXzJuZCkgPSB1cmxfcGFyc2UoJHNlY29uZCk7Ci19Ci0KLWlmICgkdGhpcmQgbmUgIiIpIHsKLQkoJHRoaXJkLCAkbW9kZV8zcmQpID0gdXJsX3BhcnNlKCR0aGlyZCk7Ci19Ci0KLQotcHJpbnQgU1RERVJSICJcbiI7Ci1wcmludCBTVERFUlIgIlBQUk9YWSB2MC40OiBhIHRvb2wgZm9yIFdlYiwgU09DS1MsIGFuZCBVbHRyYVZOQyBwcm94aWVzIGFuZCBmb3JcbiI7Ci1wcmludCBTVERFUlIgIlBQUk9YWSB2MC40OiBJUHY2IGFuZCBWTkMgVmVOQ3J5cHQgYnJpZGdpbmcuXG4iOwotcHJpbnQgU1RERVJSICJwcm94eV9ob3N0OiAgICAgICAkcHJveHlfaG9zdFxuIjsKLXByaW50IFNUREVSUiAicHJveHlfcG9ydDogICAgICAgJHByb3h5X3BvcnRcbiI7Ci1wcmludCBTVERFUlIgInByb3h5X2Nvbm5lY3Q6ICAgICRjb25uZWN0XG4iOwotcHJpbnQgU1RERVJSICJwcHJveHlfcGFyYW1zOiAgICAkRU5We1BQUk9YWV9QUk9YWX1cbiI7Ci1wcmludCBTVERFUlIgInBwcm94eV9saXN0ZW46ICAgICRFTlZ7UFBST1hZX0xJU1RFTn1cbiI7Ci1wcmludCBTVERFUlIgInBwcm94eV9yZXZlcnNlOiAgICRFTlZ7UFBST1hZX1JFVkVSU0V9XG4iOwotcHJpbnQgU1RERVJSICJpb19zb2NrZXRfaW5ldDY6ICAkaGF2ZV9pbmV0NlxuIjsKLXByaW50IFNUREVSUiAiXG4iOwotaWYgKCEgJGhhdmVfaW5ldDYpIHsKLQlwcmludCBTVERFUlIgIlBQUk9YWTogVG8gZW5hYmxlIElQdjYgY29ubmVjdGlvbnMsIGluc3RhbGwgdGhlIElPOjpTb2NrZXQ6OklORVQ2IHBlcmwgbW9kdWxlLlxuXG4iOwotfQotCi1pZiAoMSkgewotCXByaW50IFNUREVSUiAicHByb3h5IDFzdDogJGZpcnN0XHQtICRtb2RlXzFzdFxuIjsKLQlwcmludCBTVERFUlIgInBwcm94eSAybmQ6ICRzZWNvbmRcdC0gJG1vZGVfMm5kXG4iOwotCXByaW50IFNUREVSUiAicHByb3h5IDNyZDogJHRoaXJkXHQtICRtb2RlXzNyZFxuIjsKLQlwcmludCBTVERFUlIgIlxuIjsKLX0KLQotc3ViIHBkaWUgewotCW15ICRtc2cgPSBzaGlmdDsKLQlraWxsX3Byb3h5X3BpZHMoKTsKLQlkaWUgIiRtc2ciOwotfQotCi1pZiAoJEVOVntQUFJPWFlfUkVWRVJTRX0gbmUgIiIpIHsKLQlteSAoJHJob3N0LCAkcnBvcnQpID0gKCRFTlZ7UFBST1hZX1JFVkVSU0V9LCAiIik7Ci0JaWYgKCRyaG9zdCA9fiAvXiguKik6KFxkKykkLykgewotCQkkcmhvc3QgPSAkMTsKLQkJJHJwb3J0ID0gJDI7Ci0JfQotCSRycG9ydCA9IDU5MDAgdW5sZXNzICRycG9ydDsKLQlteSAkZW1zZyA9ICIiOwotCSRsaXN0ZW5faGFuZGxlID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQlQZWVyQWRkciA9PiAkcmhvc3QsCi0JCVBlZXJQb3J0ID0+ICRycG9ydCwKLQkJUHJvdG8gPT4gInRjcCIKLQkpOwotCSRlbXNnID0gJCE7Ci0JaWYgKCEgJGxpc3Rlbl9oYW5kbGUgJiYgJGhhdmVfaW5ldDYpIHsKLQkJZXZhbCB7JGxpc3Rlbl9oYW5kbGUgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQkJUGVlckFkZHIgPT4gJHJob3N0LAotCQkJUGVlclBvcnQgPT4gJHJwb3J0LAotCQkJUHJvdG8gPT4gInRjcCIKLQkJKTt9OwotCQkkZW1zZyAuPSAiIC8gJCEiOwotCX0KLQlpZiAoISAkbGlzdGVuX2hhbmRsZSkgewotCQlwZGllICJwcHJveHk6ICRlbXNnIC0tIFBQUk9YWV9SRVZFUlNFXG4iOwotCX0KLQlwcmludCBTVERFUlIgIlBQUk9YWV9SRVZFUlNFOiBjb25uZWN0ZWQgdG8gJHJob3N0ICRycG9ydFxuIjsKLQotfSBlbHNpZiAoJEVOVntQUFJPWFlfTElTVEVOfSBuZSAiIikgewotCW15ICRsaXN0ZW5fc29jayA9ICIiOwotCW15ICRtYXh0cnkgPSAxMjsKLQlteSAkc2xlZXAgPSA1OwotCW15ICRwMiA9ICIiOwotCW15ICRlbXNnID0gIiI7Ci0JZm9yIChteSAkaT0wOyAkaSA8ICRtYXh0cnk7ICRpKyspICB7Ci0JCW15ICgkaWYsICRwKSA9ICgiIiwgJEVOVntQUFJPWFlfTElTVEVOfSk7Ci0JCWlmICgkcCA9fiAvXiguKik6KFxkKykkLykgewotCQkJJGlmID0gJDE7Ci0JCQkkcCA9ICQyOwotCQl9Ci0JCSRwMiA9ICIqOiRwIjsKLQkJaWYgKCRpZiBlcSAiIikgewotCQkJJGlmID0gImxvY2FsaG9zdCI7Ci0JCX0KLQkJcHJpbnQgU1RERVJSICJwcHJveHkgaW50ZXJmYWNlOiAkaWZcbiI7Ci0KLQkJJGVtc2cgPSAiIjsKLQkJaWYgKCgkaWYgZXEgIklOQUREUl9BTlk2IiB8fCAkaWYgZXEgIjo6IikgJiYgJGhhdmVfaW5ldDYpIHsKLQkJCWV2YWwgeyRsaXN0ZW5fc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoCi0JCQkJTGlzdGVuICAgID0+IDIsCi0JCQkJUmV1c2VBZGRyID0+IDEsCi0JCQkJRG9tYWluICAgID0+IEFGX0lORVQ2LAotCQkJCUxvY2FsQWRkciA9PiAiOjoiLAotCQkJCUxvY2FsUG9ydCA9PiAkcCwKLQkJCQlQcm90byAgICAgPT4gInRjcCIKLQkJCSk7fTsKLQkJCSRwMiA9ICI6OjokcCI7Ci0JCX0gZWxzaWYgKCRpZiA9fiAvXklOQUREUl9BTlkvKSB7Ci0JCQkkbGlzdGVuX3NvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoCi0JCQkJTGlzdGVuICAgID0+IDIsCi0JCQkJUmV1c2VBZGRyID0+IDEsCi0JCQkJTG9jYWxQb3J0ID0+ICRwLAotCQkJCVByb3RvICAgICA9PiAidGNwIgotCQkJKTsKLQkJfSBlbHNpZiAoKCRpZiBlcSAiSU5BRERSX0xPT1BCQUNLNiIgfHwgJGlmIGVxICI6OjEiKSAmJiAkaGF2ZV9pbmV0NikgewotCQkJJHAyID0gIjo6MTokcCI7Ci0JCQlldmFsIHskbGlzdGVuX3NvY2sgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQkJCUxpc3RlbiAgICA9PiAyLAotCQkJCVJldXNlQWRkciA9PiAxLAotCQkJCURvbWFpbiAgICA9PiBBRl9JTkVUNiwKLQkJCQlMb2NhbEFkZHIgPT4gIjo6MSIsCi0JCQkJTG9jYWxQb3J0ID0+ICRwLAotCQkJCVByb3RvICAgICA9PiAidGNwIgotCQkJKTt9OwotCQkJJHAyID0gIjo6MTokcCI7Ci0JCX0gZWxzZSB7Ci0JCQkkcDIgPSAiJGlmOiRwIjsKLQkJCSRsaXN0ZW5fc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQkJCQlMaXN0ZW4gICAgPT4gMiwKLQkJCQlSZXVzZUFkZHIgPT4gMSwKLQkJCQlMb2NhbEFkZHIgPT4gJGlmLAotCQkJCUxvY2FsUG9ydCA9PiAkcCwKLQkJCQlQcm90byAgICAgPT4gInRjcCIKLQkJCSk7Ci0JCQkkZW1zZyA9ICQhOwotCQkJCi0JCQlpZiAoISAkbGlzdGVuX3NvY2sgJiYgJGhhdmVfaW5ldDYpIHsKLQkJCQlwcmludCBTVERFUlIgIlBQUk9YWV9MSVNURU46IHJldHJ5IHdpdGggSU5FVDZcbiI7Ci0JCQkJZXZhbCB7JGxpc3Rlbl9zb2NrID0gSU86OlNvY2tldDo6SU5FVDYtPm5ldygKLQkJCQkJTGlzdGVuICAgID0+IDIsCi0JCQkJCVJldXNlQWRkciA9PiAxLAotCQkJCQlEb21haW4gICAgPT4gQUZfSU5FVDYsCi0JCQkJCUxvY2FsQWRkciA9PiAkaWYsCi0JCQkJCUxvY2FsUG9ydCA9PiAkcCwKLQkJCQkJUHJvdG8gICAgID0+ICJ0Y3AiCi0JCQkJKTt9OwotCQkJCSRlbXNnIC49ICIgLyAkISI7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEgJGxpc3Rlbl9zb2NrKSB7Ci0JCQlpZiAoJGkgPCAkbWF4dHJ5IC0gMSkgewotCQkJCXdhcm4gInBwcm94eTogJGVtc2cgJCFcbiI7Ci0JCQkJd2FybiAiQ291bGQgbm90IGxpc3RlbiBvbiBwb3J0ICRwMiwgcmV0cnlpbmcgaW4gJHNsZWVwIHNlY29uZHMuLi4gKEN0cmwtQyB0byBxdWl0KVxuIjsKLQkJCQlzbGVlcCAkc2xlZXA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsYXN0OwotCQl9Ci0JfQotCWlmICghICRsaXN0ZW5fc29jaykgewotCQlwZGllICJwcHJveHk6ICRlbXNnIC0tIFBQUk9YWV9MSVNURU5cbiI7Ci0JfQotCXByaW50IFNUREVSUiAicHByb3h5OiBsaXN0ZW5pbmcgb24gJHAyXG4iOwotCW15ICRpcDsKLQkoJGxpc3Rlbl9oYW5kbGUsICRpcCkgPSAkbGlzdGVuX3NvY2stPmFjY2VwdCgpOwotCW15ICRlcnIgPSAkITsKLQljbG9zZSAkbGlzdGVuX3NvY2s7Ci0JaWYgKCEgJGxpc3Rlbl9oYW5kbGUpIHsKLQkJcGRpZSAicHByb3h5OiAkZXJyXG4iOwotCX0KLQotCWlmICgkRU5We1BQUk9YWV9MT09QX1RIWVNFTEZfTUFTVEVSfSkgewotCQlteSAkc21sID0gJEVOVntTU1ZOQ19NVUxUSVBMRV9MSVNURU59OyAKLQkJaWYgKCRzbWwgbmUgIiIgJiYgJHNtbCBuZSAiMCIpIHsKLQkJCXNldHBncnAoMCwgMCk7Ci0JCQlpZiAoZm9yaygpKSB7Ci0JCQkJY2xvc2UgJHZpZXdlcl9zb2NrOwotCQkJCXdhaXQ7Ci0JCQkJZXhpdCAwOwotCQkJfQotCQkJaWYgKGZvcmsoKSkgewotCQkJCWNsb3NlICR2aWV3ZXJfc29jazsKLQkJCQlleGl0IDA7Ci0JCQl9Ci0JCQlzZXRwZ3JwKDAsIDApOwotCQkJJHBhcmVudCA9ICQkOwotCQl9Ci0JfQotfQotCi0kc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQlQZWVyQWRkciA9PiAkcHJveHlfaG9zdCwKLQlQZWVyUG9ydCA9PiAkcHJveHlfcG9ydCwKLQlQcm90byA9PiAidGNwIgotKTsKLQotbXkgJGVyciA9ICIiOwotCi1pZiAoISAkc29jayAmJiAkaGF2ZV9pbmV0NikgewotCSRlcnIgPSAkITsKLQotCWV2YWwgeyRzb2NrID0gSU86OlNvY2tldDo6SU5FVDYtPm5ldygKLQkJUGVlckFkZHIgPT4gJHByb3h5X2hvc3QsCi0JCVBlZXJQb3J0ID0+ICRwcm94eV9wb3J0LAotCQlQcm90byA9PiAidGNwIgotCSk7fTsKLQkkZXJyIC49ICIgLyAkISI7Ci19Ci0KLWlmICghICRzb2NrKSB7Ci0JdW5saW5rKCQwKSBpZiAkRU5We1BQUk9YWV9SRU1PVkV9OwotCXBkaWUgInBwcm94eTogJGVyclxuIjsKLX0KLQotdW5saW5rKCQwKSBpZiAkRU5We1BQUk9YWV9SRU1PVkV9OwotCi1pZiAoJEVOVntQUFJPWFlfUFJPWFl9ID1+IC9edmVuY3J5cHQ6LyAmJiAkRU5We1BQUk9YWV9WRU5DUllQVF9SRVZFUlNFfSkgewotCXByaW50IFNUREVSUiAiXG5QUFJPWFk6IHZlbmNyeXB0K3JldmVyc2U6IHN3YXBwaW5nIGxpc3RlbiBzb2NrZXQgd2l0aCBjb25uZWN0IHNvY2tldC5cbiI7Ci0JbXkgJHRtcF9zd2FwID0gJHNvY2s7Ci0JJHNvY2sgPSAkbGlzdGVuX2hhbmRsZTsKLQkkbGlzdGVuX2hhbmRsZSA9ICR0bXBfc3dhcDsKLX0KLQotJGN1cl9wcm94eSA9ICRmaXJzdDsKLXNldG1vZGUoJG1vZGVfMXN0KTsKLQotaWYgKCRzZWNvbmQgbmUgIiIpIHsKLQljb25uZWN0aW9uKCRzZWNvbmQsIDEpOwotCi0Jc2V0bW9kZSgkbW9kZV8ybmQpOwotCSRjdXJfcHJveHkgPSAkc2Vjb25kOwotCi0JaWYgKCR0aGlyZCBuZSAiIikgewotCQljb25uZWN0aW9uKCR0aGlyZCwgMik7Ci0JCXNldG1vZGUoJG1vZGVfM3JkKTsKLQkJJGN1cl9wcm94eSA9ICR0aGlyZDsKLQkJY29ubmVjdGlvbigkY29ubmVjdCwgMyk7Ci0JfSBlbHNlIHsKLQkJY29ubmVjdGlvbigkY29ubmVjdCwgMik7Ci0JfQotfSBlbHNlIHsKLQljb25uZWN0aW9uKCRjb25uZWN0LCAxKTsKLX0KLQotc3ViIGtpbGxfcHJveHlfcGlkcygpIHsKLQlpZiAoJEVOVntQUFJPWFlfVkVOQ1JZUFRfVklFV0VSX0JSSURHRX0pIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoJEVOVntQUFJPWFlfS0lMTFBJRH0pIHsKLQkJZm9yZWFjaCBteSAkcCAoc3BsaXQoLywvLCAkRU5We1BQUk9YWV9LSUxMUElEfSkpIHsKLQkJCWlmICgkcCA9fiAvXihcK3wtKS8pIHsKLQkJCQkkcCA9ICRwYXJlbnQgKyAkcDsKLQkJCX0KLQkJCXByaW50IFNUREVSUiAia2lsbCBURVJNLCAkcCAoUFBST1hZX0tJTExQSUQpXG4iOwotCQkJa2lsbCAiVEVSTSIsICRwOwotCQl9Ci0JfQotfQotCi1zdWIgeGZlciB7Ci0JbXkoJGluLCAkb3V0KSA9IEBfOwotCSRSSU4gPSAkV0lOID0gJEVJTiA9ICIiOwotCSRST1VUID0gIiI7Ci0JdmVjKCRSSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JdmVjKCRXSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JJEVJTiA9ICRSSU4gfCAkV0lOOwotCi0Jd2hpbGUgKDEpIHsKLQkJbXkgJG5mID0gMDsKLQkJd2hpbGUgKCEgJG5mKSB7Ci0JCQkkbmYgPSBzZWxlY3QoJFJPVVQ9JFJJTiwgdW5kZWYsIHVuZGVmLCB1bmRlZik7Ci0JCX0KLQkJbXkgJGxlbiA9IHN5c3JlYWQoJGluLCAkYnVmLCA4MTkyKTsKLQkJaWYgKCEgZGVmaW5lZCgkbGVuKSkgewotCQkJbmV4dCBpZiAkISA9fiAvXkludGVycnVwdGVkLzsKLQkJCXByaW50IFNUREVSUiAicHByb3h5WyQkXTogJCFcbiI7Ci0JCQlsYXN0OwotCQl9IGVsc2lmICgkbGVuID09IDApIHsKLQkJCXByaW50IFNUREVSUiAicHByb3h5WyQkXTogSW5wdXQgaXMgRU9GLlxuIjsKLQkJCWxhc3Q7Ci0JCX0KLQkJbXkgJG9mZnNldCA9IDA7Ci0JCW15ICRxdWl0ID0gMDsKLQkJd2hpbGUgKCRsZW4pIHsKLQkJCW15ICR3cml0dGVuID0gc3lzd3JpdGUoJG91dCwgJGJ1ZiwgJGxlbiwgJG9mZnNldCk7Ci0JCQlpZiAoISBkZWZpbmVkICR3cml0dGVuKSB7Ci0JCQkJcHJpbnQgU1RERVJSICJwcHJveHlbJCRdOiBPdXRwdXQgaXMgRU9GLiAkIVxuIjsKLQkJCQkkcXVpdCA9IDE7Ci0JCQkJbGFzdDsKLQkJCX0KLQkJCSRsZW4gLT0gJHdyaXR0ZW47Ci0JCQkkb2Zmc2V0ICs9ICR3cml0dGVuOwotCQl9Ci0JCWxhc3QgaWYgJHF1aXQ7Ci0JfQotCWNsb3NlKCRvdXQpOwotCWNsb3NlKCRpbik7Ci0JcHJpbnQgU1RERVJSICJwcHJveHlbJCRdOiBmaW5pc2hlZCB4ZmVyLlxuIjsKLX0KLQotc3ViIGhhbmRsZXIgewotCXByaW50IFNUREVSUiAicHByb3h5WyQkXTogZ290IFNJR1RFUk0uXG4iOwotCWNsb3NlICRsaXN0ZW5faGFuZGxlIGlmICRsaXN0ZW5faGFuZGxlOwotCWNsb3NlICRzb2NrIGlmICRzb2NrOwotCWV4aXQ7Ci19Ci0KLXN1YiB4ZmVyX2JvdGggewotCSRjaGlsZCA9IGZvcms7Ci0KLQlpZiAoISBkZWZpbmVkICRjaGlsZCkgewotCQlraWxsX3Byb3h5X3BpZHMoKTsKLQkJZXhpdCAxOwotCX0KLQotCSRTSUd7VEVSTX0gPSAiaGFuZGxlciI7Ci0KLQlpZiAoJGNoaWxkKSB7Ci0JCWlmICgkbGlzdGVuX2hhbmRsZSkgewotCQkJcHJpbnQgU1RERVJSICJwcHJveHkgcGFyZW50WyQkXSAgbGlzdGVuX2hhbmRsZSAtPiBzb2NrZXRcbiI7Ci0JCQl4ZmVyKCRsaXN0ZW5faGFuZGxlLCAkc29jayk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludCBTVERFUlIgInBwcm94eSBwYXJlbnRbJCRdICBTVERJTiAtPiBzb2NrZXRcbiI7Ci0JCQl4ZmVyKFNURElOLCAkc29jayk7Ci0JCX0KLQkJc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuMjUpOwotCQlpZiAoa2lsbCAwLCAkY2hpbGQpIHsKLQkJCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAwLjkpOwotCQkJaWYgKGtpbGwgMCwgJGNoaWxkKSB7Ci0JCQkJcHJpbnQgU1RERVJSICJwcHJveHlbJCRdOiBraWxsIFRFUk0gY2hpbGQgJGNoaWxkXG4iOwotCQkJCWtpbGwgIlRFUk0iLCAkY2hpbGQ7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50IFNUREVSUiAicHByb3h5WyQkXTogY2hpbGQgICRjaGlsZCBnb25lLlxuIjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAwLjA1KTsKLQkJaWYgKCRsaXN0ZW5faGFuZGxlKSB7Ci0JCQlwcmludCBTVERFUlIgInBwcm94eSBjaGlsZCBbJCRdICBzb2NrZXQgLT4gbGlzdGVuX2hhbmRsZVxuIjsKLQkJCWlmICgkaW5pdGlhbF9kYXRhIG5lICIiKSB7Ci0JCQkJbXkgJGxlbiA9IGxlbmd0aCAkaW5pdGlhbF9kYXRhOwotCQkJCXByaW50IFNUREVSUiAicHByb3h5IGNoaWxkIFskJF0gIHNlbmRpbmcgaW5pdGlhbF9kYXRhLCBsZW5ndGggJGxlblxuXG4iOwotCQkJCXN5c3dyaXRlKCRsaXN0ZW5faGFuZGxlLCAkaW5pdGlhbF9kYXRhLCAkbGVuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnQgU1RERVJSICJcbiI7Ci0JCQl9Ci0JCQl4ZmVyKCRzb2NrLCAkbGlzdGVuX2hhbmRsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludCBTVERFUlIgInBwcm94eSBjaGlsZCBbJCRdICBzb2NrZXQgLT4gU1RET1VUXG4iOwotCQkJaWYgKCRpbml0aWFsX2RhdGEgbmUgIiIpIHsKLQkJCQlteSAkbGVuID0gbGVuZ3RoICRpbml0aWFsX2RhdGE7Ci0JCQkJcHJpbnQgU1RERVJSICJwcHJveHkgY2hpbGQgWyQkXSAgc2VuZGluZyBpbml0aWFsX2RhdGEsIGxlbmd0aCAkbGVuXG5cbiI7Ci0JCQkJc3lzd3JpdGUoU1RET1VULCAkaW5pdGlhbF9kYXRhLCAkbGVuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnQgU1RERVJSICJcbiI7Ci0JCQl9Ci0JCQl4ZmVyKCRzb2NrLCBTVERPVVQpOwotCQl9Ci0JCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAwLjI1KTsKLQkJaWYgKGtpbGwgMCwgJHBhcmVudCkgewotCQkJc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuOCk7Ci0JCQlpZiAoa2lsbCAwLCAkcGFyZW50KSB7Ci0JCQkJcHJpbnQgU1RERVJSICJwcHJveHlbJCRdOiBraWxsIFRFUk0gcGFyZW50ICRwYXJlbnRcbiI7Ci0JCQkJa2lsbCAiVEVSTSIsICRwYXJlbnQ7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50IFNUREVSUiAicHByb3h5WyQkXTogcGFyZW50ICRwYXJlbnQgZ29uZS5cbiI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlraWxsX3Byb3h5X3BpZHMoKTsKLX0KLQoteGZlcl9ib3RoKCk7Ci0KLWV4aXQ7Ci0KLXN1YiBmc2xlZXAgewotCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCBzaGlmdCk7Ci19Ci0KLXN1YiB1cmxfcGFyc2UgewotCW15ICRob3N0cG9ydCA9IHNoaWZ0OwotCW15ICRtb2RlID0gImh0dHAiOwotCWlmICgkaG9zdHBvcnQgPX4gbSxec29ja3M0PzovLyhcUyopJCxpKSB7Ci0JCSRtb2RlID0gInNvY2tzNCI7Ci0JCSRob3N0cG9ydCA9ICQxOwotCX0gZWxzaWYgKCRob3N0cG9ydCA9fiBtLF5zb2NrczU6Ly8oXFMqKSQsaSkgewotCQkkbW9kZSA9ICJzb2NrczUiOwotCQkkaG9zdHBvcnQgPSAkMTsKLQl9IGVsc2lmICgkaG9zdHBvcnQgPX4gbSxeaHR0cHM/Oi8vKFxTKikkLGkpIHsKLQkJJG1vZGUgPSAiaHR0cCI7Ci0JCSRob3N0cG9ydCA9ICQxOwotCX0gZWxzaWYgKCRob3N0cG9ydCA9fiBtLF5pcHY2Oi8vKFxTKikkLGkpIHsKLQkJJG1vZGUgPSAiaXB2NiI7Ci0JCSRob3N0cG9ydCA9ICQxOwotCX0gZWxzaWYgKCRob3N0cG9ydCA9fiBtLF5yZXBlYXRlcjovLyhcUyopXCsoXFMqKSQsaSkgewotCQkjIHVsdHJhdm5jIHJlcGVhdGVyIHByb3h5LgotCQkkaG9zdHBvcnQgPSAkMTsKLQkJJG1vZGUgPSAicmVwZWF0ZXI6JDIiOwotCQlpZiAoJGhvc3Rwb3J0ICF+IC86XGQrJC8pIHsKLQkJCSRob3N0cG9ydCAuPSAiOjU5MDAiOwotCQl9Ci0JfSBlbHNpZiAoJGhvc3Rwb3J0ID1+IG0sXnZlbmNyeXB0Oi8vKFxTKikkLGkpIHsKLQkJIyB2ZW5jcnlwdCBoYW5kc2hha2UuCi0JCSRob3N0cG9ydCA9ICQxOwotCQlteSAkbSA9ICJjb25uZWN0IjsKLQkJaWYgKCRob3N0cG9zdCA9fiAvXihcUyspXCsoXFMrKSQvKSB7Ci0JCQkkaG9zdHBvcnQgPSAkMTsKLQkJCSRtb2RlID0gJDI7Ci0JCX0KLQkJJG1vZGUgPSAidmVuY3J5cHQ6JG0iOwotCQlpZiAoJGhvc3Rwb3J0ICF+IC86XGQrJC8pIHsKLQkJCSRob3N0cG9ydCAuPSAiOjU5MDAiOwotCQl9Ci0JfQotCXJldHVybiAoJGhvc3Rwb3J0LCAkbW9kZSk7Ci19Ci0KLXN1YiBzZXRtb2RlIHsKLQlteSAkbW9kZSA9IHNoaWZ0OwotCSRFTlZ7UFBST1hZX1JFUEVBVEVSfSA9ICIiOwotCSRFTlZ7UFBST1hZX1ZFTkNSWVBUfSA9ICIiOwotCWlmICgkbW9kZSA9fiAvXnNvY2tzLykgewotCQlpZiAoJG1vZGUgPX4gL15zb2NrczUvKSB7Ci0JCQkkRU5We1BQUk9YWV9TT0NLU30gPSA1OwotCQl9IGVsc2UgewotCQkJJEVOVntQUFJPWFlfU09DS1N9ID0gMTsKLQkJfQotCX0gZWxzaWYgKCRtb2RlID1+IC9eaXB2Ni9pKSB7Ci0JCSRFTlZ7UFBST1hZX1NPQ0tTfSA9IDA7Ci0JfSBlbHNpZiAoJG1vZGUgPX4gL15yZXBlYXRlcjooLiopLykgewotCQkkRU5We1BQUk9YWV9SRVBFQVRFUn0gPSAkMTsKLQkJJEVOVntQUFJPWFlfU09DS1N9ID0gIiI7Ci0JfSBlbHNpZiAoJG1vZGUgPX4gL152ZW5jcnlwdDooLiopLykgewotCQkkRU5We1BQUk9YWV9WRU5DUllQVH0gPSAkMTsKLQkJJEVOVntQUFJPWFlfU09DS1N9ID0gIiI7Ci0JfSBlbHNlIHsKLQkJJEVOVntQUFJPWFlfU09DS1N9ID0gIiI7Ci0JfQotfQotCi1zdWIgY29ubmVjdGlvbiB7Ci0JbXkgKCRDT05ORUNULCAkdykgPSBAXzsKLQotCW15ICRjb24gPSAiIjsKLQlteSAkbXNnID0gIiI7Ci0KLQlpZiAoJEVOVntQUFJPWFlfU09DS1N9IGVxICI1IikgewotCQkjIFNPQ0tTNQotCQlteSAoJGgsICRwKSA9ICgkQ09OTkVDVCwgIiIpOwotCQlpZiAoJGggPX4gL14oLiopOihcZCspJC8pIHsKLQkJCSRoID0gJDE7Ci0JCQkkcCA9ICQyOwotCQl9Ci0JCSRjb24gLj0gcGFjaygiQyIsIDB4MDUpOwotCQkkY29uIC49IHBhY2soIkMiLCAweDAxKTsKLQkJJGNvbiAuPSBwYWNrKCJDIiwgMHgwMCk7Ci0KLQkJJG1zZyA9ICJTT0NLUzUgdmlhICRjdXJfcHJveHkgdG8gJGg6JHBcblxuIjsKLQkJcHJpbnQgU1RERVJSICJwcm94eV9yZXF1ZXN0JHc6ICRtc2ciOwotCi0JCXN5c3dyaXRlKCRzb2NrLCAkY29uLCBsZW5ndGgoJGNvbikpOwotCi0JCW15ICgkbjEsICRuMiwgJG4zLCAkbjQsICRuNSwgJG42KTsKLQkJbXkgKCRyMSwgJHIyLCAkcjMsICRyNCwgJHI1LCAkcjYpOwotCQlteSAoJHMxLCAkczIsICRzMywgJHM0LCAkczUsICRzNik7Ci0KLQkJJG4xID0gc3lzcmVhZCgkc29jaywgJHIxLCAxKTsKLQkJJG4yID0gc3lzcmVhZCgkc29jaywgJHIyLCAxKTsKLQotCQkkczEgPSB1bnBhY2soIkMiLCAkcjEpOwotCQkkczIgPSB1bnBhY2soIkMiLCAkcjIpOwotCQlpZiAoJHMxICE9IDB4MDUgfHwgJHMyICE9IDB4MDApIHsKLQkJCXByaW50IFNUREVSUiAiU09DS1M1IGZhaWwgczE9JHMxIHMyPSRzMiBuMT0kbjEgbjI9JG4yXG4iOwotCQkJY2xvc2UgJHNvY2s7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQkJJGNvbiA9ICIiOwotCQkkY29uIC49IHBhY2soIkMiLCAweDA1KTsKLQkJJGNvbiAuPSBwYWNrKCJDIiwgMHgwMSk7Ci0JCSRjb24gLj0gcGFjaygiQyIsIDB4MDApOwotCQkkY29uIC49IHBhY2soIkMiLCAweDAzKTsKLQkJJGNvbiAuPSBwYWNrKCJDIiwgbGVuZ3RoKCRoKSk7Ci0JCSRjb24gLj0gJGg7Ci0JCSRjb24gLj0gcGFjaygiQyIsICRwID4+IDgpOwotCQkkY29uIC49IHBhY2soIkMiLCAkcCAmIDB4ZmYpOwotCi0JCXN5c3dyaXRlKCRzb2NrLCAkY29uLCBsZW5ndGgoJGNvbikpOwotCi0JCSRuMSA9IHN5c3JlYWQoJHNvY2ssICRyMSwgMSk7Ci0JCSRuMiA9IHN5c3JlYWQoJHNvY2ssICRyMiwgMSk7Ci0JCSRuMyA9IHN5c3JlYWQoJHNvY2ssICRyMywgMSk7Ci0JCSRuNCA9IHN5c3JlYWQoJHNvY2ssICRyNCwgMSk7Ci0JCSRzMSA9IHVucGFjaygiQyIsICRyMSk7Ci0JCSRzMiA9IHVucGFjaygiQyIsICRyMik7Ci0JCSRzMyA9IHVucGFjaygiQyIsICRyMyk7Ci0JCSRzNCA9IHVucGFjaygiQyIsICRyNCk7Ci0KLQkJaWYgKCRzNCA9PSAweDEpIHsKLQkJCXN5c3JlYWQoJHNvY2ssICRyNSwgNCArIDIpOwotCQl9IGVsc2lmICgkczQgPT0gMHgzKSB7Ci0JCQlzeXNyZWFkKCRzb2NrLCAkcjUsIDEpOwotCQkJJHM1ID0gdW5wYWNrKCJDIiwgJHI1KTsKLQkJCXN5c3JlYWQoJHNvY2ssICRyNiwgJHM1ICsgMik7Ci0JCX0gZWxzaWYgKCRzNCA9PSAweDQpIHsKLQkJCXN5c3JlYWQoJHNvY2ssICRyNSwgMTYgKyAyKTsKLQkJfQotCi0JCWlmICgkczEgIT0gMHg1IHx8ICRzMiAhPSAweDAgfHwgJHMzICE9IDB4MCkgewotCQkJcHJpbnQgU1RERVJSICJTT0NLUzUgZmFpbGVkOiBzMT0kczEgczI9JHMyIHMzPSRzMyBzND0kczQgbjE9JG4xIG4yPSRuMiBuMz0kbjMgbjQ9JG40XG4iOwotCQkJY2xvc2UgJHNvY2s7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQl9IGVsc2lmICgkRU5We1BQUk9YWV9TT0NLU30gZXEgIjEiKSB7Ci0JCSMgU09DS1M0IFNPQ0tTNGEKLQkJbXkgKCRoLCAkcCkgPSAoJENPTk5FQ1QsICIiKTsKLQkJaWYgKCRoID1+IC9eKC4qKTooXGQrKSQvKSB7Ci0JCQkkaCA9ICQxOwotCQkJJHAgPSAkMjsKLQkJfQotCQkkY29uIC49IHBhY2soIkMiLCAweDA0KTsKLQkJJGNvbiAuPSBwYWNrKCJDIiwgMHgwMSk7Ci0JCSRjb24gLj0gcGFjaygibiIsICRwKTsKLQotCQlteSAkU09DS1NfNGEgPSAwOwotCQlpZiAoJGggZXEgImxvY2FsaG9zdCIgfHwgJGggZXEgIjEyNy4wLjAuMSIpIHsKLQkJCSRjb24gLj0gcGFjaygiQyIsIDEyNyk7Ci0JCQkkY29uIC49IHBhY2soIkMiLCAwKTsKLQkJCSRjb24gLj0gcGFjaygiQyIsIDApOwotCQkJJGNvbiAuPSBwYWNrKCJDIiwgMSk7Ci0JCX0gZWxzaWYgKCRoID1+IC9eKFxkKylcLihcZCspXC4oXGQrKVwuKFxkKykkLykgewotCQkJJGNvbiAuPSBwYWNrKCJDIiwgJDEpOwotCQkJJGNvbiAuPSBwYWNrKCJDIiwgJDIpOwotCQkJJGNvbiAuPSBwYWNrKCJDIiwgJDMpOwotCQkJJGNvbiAuPSBwYWNrKCJDIiwgJDQpOwotCQl9IGVsc2UgewotCQkJJGNvbiAuPSBwYWNrKCJDIiwgMCk7Ci0JCQkkY29uIC49IHBhY2soIkMiLCAwKTsKLQkJCSRjb24gLj0gcGFjaygiQyIsIDApOwotCQkJJGNvbiAuPSBwYWNrKCJDIiwgMyk7Ci0JCQkkU09DS1NfNGEgPSAxOwotCQl9Ci0KLQkJJGNvbiAuPSAibm9ib2R5IjsKLQkJJGNvbiAuPSBwYWNrKCJDIiwgMCk7Ci0KLQkJJG1zZyA9ICJTT0NLUzQgdmlhICRjdXJfcHJveHkgdG8gJGg6JHBcblxuIjsKLQkJaWYgKCRTT0NLU180YSkgewotCQkJJGNvbiAuPSAkaDsKLQkJCSRjb24gLj0gcGFjaygiQyIsIDApOwotCQkJJG1zZyA9fiBzL1NPQ0tTNC9TT0NLUzRhLzsKLQkJfQotCQlwcmludCBTVERFUlIgInByb3h5X3JlcXVlc3QkdzogJG1zZyI7Ci0JCXN5c3dyaXRlKCRzb2NrLCAkY29uLCBsZW5ndGgoJGNvbikpOwotCi0JCW15ICRvayA9IDE7Ci0JCWZvciAobXkgJGkgPSAwOyAkaSA8IDg7ICRpKyspIHsKLQkJCW15ICRjOwotCQkJc3lzcmVhZCgkc29jaywgJGMsIDEpOwotCQkJbXkgJHMgPSB1bnBhY2soIkMiLCAkYyk7Ci0JCQlpZiAoJGkgPT0gMCkgewotCQkJCSRvayA9IDAgaWYgJHMgIT0gMHgwOwotCQkJfSBlbHNpZiAoJGkgPT0gMSkgewotCQkJCSRvayA9IDAgaWYgJHMgIT0gMHg1YTsKLQkJCX0KLQkJfQotCQlpZiAoISAkb2spIHsKLQkJCXByaW50IFNUREVSUiAiU09DS1M0IGZhaWxlZC5cbiI7Ci0JCQljbG9zZSAkc29jazsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9IGVsc2lmICgkRU5We1BQUk9YWV9TT0NLU30gZXEgIjAiKSB7Ci0JCSMgaGFjayBmb3IgaXB2NiAicHJveHkiLCBub3RoaW5nIHRvIGRvLCBhc3N1bWUgSU5FVDYgY2FsbCB3b3JrZWQuCi0JCTsKLQl9IGVsc2lmICgkRU5We1BQUk9YWV9SRVBFQVRFUn0gbmUgIiIpIHsKLQkJbXkgJHJlcCA9ICRFTlZ7UFBST1hZX1JFUEVBVEVSfTsKLQkJcHJpbnQgU1RERVJSICJyZXBlYXRlcjogJHJlcFxuIjsKLQkJJHJlcCAuPSBwYWNrKCJ4IikgeCAyNTA7Ci0JCXN5c3dyaXRlKCRzb2NrLCAkcmVwLCAyNTApOwotCi0JCW15ICRyZmIgPSAiIjsKLQotCQlteSAkb2sgPSAxOwotCQlmb3IgKG15ICRpID0gMDsgJGkgPCAxMjsgJGkrKykgewotCQkJbXkgJGM7Ci0JCQlsYXN0IGlmICRFTlZ7UFBST1hZX0dFTkVSSUNfUkVQRUFURVJ9OwotCQkJc3lzcmVhZCgkc29jaywgJGMsIDEpOwotCQkJcHJpbnQgU1RERVJSICRjOwotCQkJJHJmYiAuPSAkYzsKLQkJfQotCQlpZiAoJHJmYiBuZSAiIiAmJiAkcmZiICF+IC9eUkZCIDAwMFwuMDAwLykgewotCQkJJGluaXRpYWxfZGF0YSA9ICRyZmI7Ci0JCQkkcmZiID1+IHMvXG4vL2c7Ci0JCQlwcmludCBTVERFUlIgImRldGVjdGVkIG5vbi1VbHRyYVZOQyByZXBlYXRlcjsgZm9yd2FyZGluZyBcIiRyZmJcIlxubGVuZ3RoOiAiLCBsZW5ndGgoJGluaXRpYWxfZGF0YSksICJcbiI7Ci0JCX0KLQl9IGVsc2lmICgkRU5We1BQUk9YWV9WRU5DUllQVH0gbmUgIiIpIHsKLQkJbXkgJHZlbmNyeXB0ID0gJEVOVntQUFJPWFlfVkVOQ1JZUFR9OwotCQl2ZW5jcnlwdF9kaWFsb2coJHZlbmNyeXB0KTsKLQotCX0gZWxzZSB7Ci0JCSMgV2ViIFByb3h5OgotCQkkY29uID0gIkNPTk5FQ1QgJENPTk5FQ1QgSFRUUC8xLjFcclxuIjsKLQkJJGNvbiAgIC49ICJIb3N0OiAkQ09OTkVDVFxyXG4iOwotCQkkY29uICAgLj0gIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iOwotCQkkbXNnID0gJGNvbjsKLQotCQlwcmludCBTVERFUlIgInByb3h5X3JlcXVlc3QkdzogdmlhICRjdXJfcHJveHk6XG4kbXNnIjsKLQkJc3lzd3JpdGUoJHNvY2ssICRjb24sIGxlbmd0aCgkY29uKSk7Ci0KLQkJbXkgJHJlcCA9ICIiOwotCQlteSAkbiA9IDA7Ci0JCXdoaWxlICgkcmVwICF+IC9cclxuXHJcbi8gJiYgJG4gPCAzMDAwMCkgewotCQkJbXkgJGM7Ci0JCQlzeXNyZWFkKCRzb2NrLCAkYywgMSk7Ci0JCQlwcmludCBTVERFUlIgJGM7Ci0JCQkkcmVwIC49ICRjOwotCQkJJG4rKzsKLQkJfQotCQlpZiAoJHJlcCAhfiBtLEhUVFAvLiogMjAwLCkgewotCQkJcHJpbnQgU1RERVJSICJIVFRQIENPTk5FQ1QgZmFpbGVkLlxuIjsKLQkJCWNsb3NlICRzb2NrOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLX0KLQotc3ViIHZkaWUgewotCWFwcGVuZF9oYW5kc2hha2UoImRvbmVcbiIpOwotCWNsb3NlICRzb2NrOwotCWtpbGxfcHJveHlfcGlkcygpOwotCWV4aXQoMSk7Ci19Ci0KLXN1YiBhbm9udGxzX2hhbmRzaGFrZSB7Ci0JbXkgKCR2bW9kZSwgJGRiKSA9IEBfOwotCi0JcHJpbnQgU1RERVJSICJcblBQUk9YWTogRG9pbmcgQU5PTlRMUyBIYW5kc2hha2VcbiI7Ci0KLQlteSAkcHNlYyA9IHBhY2soIkMiLCAkcmZiU2VjVHlwZUFub25UbHMpOwotCXN5c3dyaXRlKCRzb2NrLCAkcHNlYywgMSk7Ci0KLQlhcHBlbmRfaGFuZHNoYWtlKCJkb25lXG4iKTsKLX0KLQotc3ViIHZlbmNyeXB0X2hhbmRzaGFrZSB7Ci0JCi0JbXkgKCR2bW9kZSwgJGRiKSA9IEBfOwotCi0JcHJpbnQgU1RERVJSICJcblBQUk9YWTogRG9pbmcgVmVOQ3J5cHQgSGFuZHNoYWtlXG4iOwotCi0JbXkgJHBzZWMgPSBwYWNrKCJDIiwgJHJmYlNlY1R5cGVWZW5jcnlwdCk7Ci0KLQlpZiAoZXhpc3RzICRFTlZ7U1NWTkNfVEVTVF9TRUNfVFlQRX0pIHsKLQkJbXkgJGZha2UgPSAkRU5We1NTVk5DX1RFU1RfU0VDX1RZUEV9OwotCQlwcmludCBTVERFUlIgIlBQUk9YWTogc2VuZGluZyBzZWMtdHlwZTogJGZha2VcbiI7Ci0JCSRwc2VjID0gcGFjaygiQyIsICRmYWtlKTsKLQl9Ci0KLQlzeXN3cml0ZSgkc29jaywgJHBzZWMsIDEpOwotCi0JbXkgJHZtYWpvcjsKLQlteSAkdm1pbm9yOwotCXN5c3JlYWQoJHNvY2ssICR2bWFqb3IsIDEpOwotCXN5c3JlYWQoJHNvY2ssICR2bWlub3IsIDEpOwotCi0JdmRpZSBpZiAkdm1ham9yIGVxICIiIHx8ICR2bWlub3IgZXEgIiI7Ci0KLQkkdm1ham9yID0gdW5wYWNrKCJDIiwgJHZtYWpvcik7Ci0JJHZtaW5vciA9IHVucGFjaygiQyIsICR2bWlub3IpOwotCXByaW50IFNUREVSUiAic2VydmVyIHZlbmNyeXB0IHZlcnNpb24gJHZtYWpvci4kdm1pbm9yXG4iIGlmICRkYjsKLQotCWlmIChleGlzdHMgJEVOVntTU1ZOQ19URVNUX1NFQ19UWVBFfSkgewotCQlwcmludCBTVERFUlIgIlBQUk9YWTogY29udGludWluZyBvbiBpbiB0ZXN0IG1vZGUuXG4iOwotCX0gZWxzZSB7Ci0JCXZkaWUgaWYgJHZtYWpvciBuZSAwOwotCQl2ZGllIGlmICR2bWlub3IgPCAyOwotCX0KLQotCSR2bWFqb3IgPSBwYWNrKCJDIiwgMCk7Ci0JJHZtaW5vciA9IHBhY2soIkMiLCAyKTsKLQlhcHBlbmRfaGFuZHNoYWtlKCJzdWJ2ZXJzaW9uPTAuMlxuIik7Ci0KLQlzeXN3cml0ZSgkc29jaywgJHZtYWpvciwgMSk7Ci0Jc3lzd3JpdGUoJHNvY2ssICR2bWlub3IsIDEpOwotCi0JbXkgJHJlc3VsdDsKLQlzeXNyZWFkKCRzb2NrLCAkcmVzdWx0LCAxKTsKLQlwcmludCBTVERFUlIgInJlc3VsdCBlbXB0eVxuIiBpZiAkZGIgJiYgJHJlc3VsdCBlcSAiIjsKLQotCXZkaWUgaWYgJHJlc3VsdCBlcSAiIjsKLQkkcmVzdWx0ID0gdW5wYWNrKCJDIiwgJHJlc3VsdCk7Ci0JcHJpbnQgU1RERVJSICJyZXN1bHQ9JHJlc3VsdFxuIiBpZiAkZGI7Ci0KLQl2ZGllIGlmICRyZXN1bHQgbmUgMDsKLQotCW15ICRuc3VidHlwZXM7Ci0Jc3lzcmVhZCgkc29jaywgJG5zdWJ0eXBlcywgMSk7Ci0KLQl2ZGllIGlmICRuc3VidHlwZXMgZXEgIiI7Ci0JJG5zdWJ0eXBlcyA9IHVucGFjaygiQyIsICRuc3VidHlwZXMpOwotCXByaW50IFNUREVSUiAibnN1YnR5cGVzPSRuc3VidHlwZXNcbiIgaWYgJGRiOwotCi0JbXkgJXN1YnR5cGVzOwotCi0JZm9yIChteSAkaSA9IDA7ICRpIDwgJG5zdWJ0eXBlczsgJGkrKykgewotCQlteSAkc3VidHlwZSA9ICIiOyAKLQkJc3lzcmVhZCgkc29jaywgJHN1YnR5cGUsIDQpOwotCQl2ZGllIGlmIGxlbmd0aCgkc3VidHlwZSkgIT0gNDsKLQotCQkjIFhYWCBmaXggNjRiaXQuCi0JCSRzdWJ0eXBlID0gdW5wYWNrKCJOIiwgJHN1YnR5cGUpOwotCQlwcmludCBTVERFUlIgInN1YnR5cGU6ICRzdWJ0eXBlXG4iIGlmICRkYjsKLQkJJHN1YnR5cGVzeyRzdWJ0eXBlfSA9IDE7Ci0JCWFwcGVuZF9oYW5kc2hha2UoInNzdCRpPSRzdWJ0eXBlXG4iKTsKLQl9Ci0KLQlteSAkc3VidHlwZSA9IDA7Ci0JaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0WDUwOU5vbmV9KSAgewotCQkkc3VidHlwZSA9ICRyZmJWZW5jcnlwdFg1MDlOb25lOwotCQlwcmludCBTVERFUlIgInNlbGVjdGVkIHJmYlZlbmNyeXB0WDUwOU5vbmVcbiIgaWYgJGRiOwotCX0gZWxzaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0WDUwOVZuY30pICB7Ci0JCSRzdWJ0eXBlID0gJHJmYlZlbmNyeXB0WDUwOVZuYzsKLQkJcHJpbnQgU1RERVJSICJzZWxlY3RlZCByZmJWZW5jcnlwdFg1MDlWbmNcbiIgaWYgJGRiOwotCX0gZWxzaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0WDUwOVBsYWlufSkgIHsKLQkJJHN1YnR5cGUgPSAkcmZiVmVuY3J5cHRYNTA5UGxhaW47Ci0JCXByaW50IFNUREVSUiAic2VsZWN0ZWQgcmZiVmVuY3J5cHRYNTA5UGxhaW5cbiIgaWYgJGRiOwotCX0gZWxzaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0VGxzTm9uZX0pICB7Ci0JCSRzdWJ0eXBlID0gJHJmYlZlbmNyeXB0VGxzTm9uZTsKLQkJcHJpbnQgU1RERVJSICJzZWxlY3RlZCByZmJWZW5jcnlwdFRsc05vbmVcbiIgaWYgJGRiOwotCX0gZWxzaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0VGxzVm5jfSkgIHsKLQkJJHN1YnR5cGUgPSAkcmZiVmVuY3J5cHRUbHNWbmM7Ci0JCXByaW50IFNUREVSUiAic2VsZWN0ZWQgcmZiVmVuY3J5cHRUbHNWbmNcbiIgaWYgJGRiOwotCX0gZWxzaWYgKGV4aXN0cyAkc3VidHlwZXN7JHJmYlZlbmNyeXB0VGxzUGxhaW59KSAgewotCQkkc3VidHlwZSA9ICRyZmJWZW5jcnlwdFRsc1BsYWluOwotCQlwcmludCBTVERFUlIgInNlbGVjdGVkIHJmYlZlbmNyeXB0VGxzUGxhaW5cbiIgaWYgJGRiOwotCX0KLQotCWlmIChleGlzdHMgJEVOVntTU1ZOQ19URVNUX1NFQ19TVUJUWVBFfSkgewotCQlteSAkZmFrZSA9ICRFTlZ7U1NWTkNfVEVTVF9TRUNfU1VCVFlQRX07Ci0JCXByaW50IFNUREVSUiAiUFBST1hZOiBzZW5kaW5nIHNlYy1zdWJ0eXBlOiAkZmFrZVxuIjsKLQkJJHN1YnR5cGUgPSAkZmFrZTsKLQl9Ci0KLQlhcHBlbmRfaGFuZHNoYWtlKCJzdWJ0eXBlPSRzdWJ0eXBlXG4iKTsKLQotCW15ICRwc3QgPSBwYWNrKCJOIiwgJHN1YnR5cGUpOwotCXN5c3dyaXRlKCRzb2NrLCAkcHN0LCA0KTsgCi0KLQlpZiAoZXhpc3RzICRFTlZ7U1NWTkNfVEVTVF9TRUNfU1VCVFlQRX0pIHsKLQkJcHJpbnQgU1RERVJSICJQUFJPWFk6IGNvbnRpbnVpbmcgb24gaW4gdGVzdCBtb2RlLlxuIjsKLQl9IGVsc2UgewotCQl2ZGllIGlmICRzdWJ0eXBlID09IDA7Ci0JfQotCi0JbXkgJG9rOwotCXN5c3JlYWQoJHNvY2ssICRvaywgMSk7Ci0JJG9rID0gdW5wYWNrKCJDIiwgJG9rKTsKLQlwcmludCBTVERFUlIgIm9rPSRva1xuIiBpZiAkZGI7Ci0KLQlhcHBlbmRfaGFuZHNoYWtlKCJkb25lXG4iKTsKLQotCXZkaWUgaWYgJG9rID09IDA7Ci19Ci0KLXN1YiB2ZW5jcnlwdF9kaWFsb2cgewotCW15ICR2bW9kZSA9IHNoaWZ0OwotCW15ICRkYiA9IDA7Ci0KLQkkZGIgPSAxIGlmIGV4aXN0cyAkRU5We1NTX0RFQlVHfTsKLQkkZGIgPSAxIGlmIGV4aXN0cyAkRU5We1NTVk5DX1ZFTkNSWVBUX0RFQlVHfTsKLQotCWFwcGVuZF9oYW5kc2hha2UoIm1vZGU9JHZtb2RlXG4iKTsKLQotCW15ICRzZXJ2ZXJfcmZiID0gIiI7Ci0JI3N5c3dyaXRlKCRzb2NrLCAkcmVwLCAyNTApOwotCWZvciAobXkgJGkgPSAwOyAkaSA8IDEyOyAkaSsrKSB7Ci0JCW15ICRjOwotCQlzeXNyZWFkKCRzb2NrLCAkYywgMSk7Ci0JCSRzZXJ2ZXJfcmZiIC49ICRjOwotCQlwcmludCBTVERFUlIgJGM7Ci0JfQotCXByaW50IFNUREVSUiAic2VydmVyX3JmYjogJHNlcnZlcl9yZmJcbiIgaWYgJGRiOwotCWFwcGVuZF9oYW5kc2hha2UoInNlcnZlcj0kc2VydmVyX3JmYiIpOwotCi0JbXkgJG1pbm9yID0gIiI7Ci0JaWYgKCRzZXJ2ZXJfcmZiID1+IC9eUkZCIDAwM1wuKFxkKykvKSB7Ci0JCSRtaW5vciA9ICQxOwotCX0gZWxzZSB7Ci0JCXZkaWU7Ci0JfQotCW15ICR2aWV3ZXJfcmZiID0gIlJGQiAwMDMuMDA4XG4iOwotCWlmICgkbWlub3IgPCA3KSB7Ci0JCXZkaWU7Ci0JfSBlbHNpZiAoJG1pbm9yID09IDcpIHsKLQkJJHZpZXdlcl9yZmIgPSAiUkZCIDAwMy4wMDdcbiI7Ci0JfQotCW15ICRuc2VjOwotCW15ICR0MSA9IGdldHRpbWUoKTsKLQlteSAkdDAgPSBnZXR0aW1lKCk7Ci0KLQlzeXN3cml0ZSgkc29jaywgJHZpZXdlcl9yZmIsIDEyKTsKLQlzeXNyZWFkKCRzb2NrLCAkbnNlYywgMSk7Ci0KLQkkdDEgPSBnZXR0aW1lKCk7Ci0JJHQxID0gc3ByaW50ZigiJS42ZiIsICR0MSAtICR0MCk7Ci0KLQlhcHBlbmRfaGFuZHNoYWtlKCJ2aWV3ZXI9JHZpZXdlcl9yZmIiKTsKLQlhcHBlbmRfaGFuZHNoYWtlKCJsYXRlbmN5PSR0MVxuIik7Ci0KLQl2ZGllIGlmICRuc2VjIGVxICIiOwotCi0JJG5zZWMgPSB1bnBhY2soIkMiLCAkbnNlYyk7Ci0KLQlwcmludCBTVERFUlIgIm5zZWM6ICRuc2VjXG4iIGlmICRkYjsKLQl2ZGllIGlmICRuc2VjIGVxIDAgfHwgJG5zZWMgPiAxMDA7Ci0KLQlteSAlc2VjdHlwZXMgPSAoKTsKLQotCWZvciAobXkgJGkgPSAwOyAkaSA8ICRuc2VjOyAkaSsrKSB7Ci0JCW15ICRzZWM7Ci0JCXN5c3JlYWQoJHNvY2ssICRzZWMsIDEpOwotCQl2ZGllIGlmICRzZWMgZXEgIiI7Ci0JCSRzZWMgPSB1bnBhY2soIkMiLCAkc2VjKTsKLQkJcHJpbnQgU1RERVJSICJzZWM6ICRzZWNcbiIgaWYgJGRiOwotCQkkc2VjdHlwZXN7JHNlY30gPSAxOwotCX0KLQkKLQlpZiAoZXhpc3RzICRzZWN0eXBlc3skcmZiU2VjVHlwZVZlbmNyeXB0fSkgewotCQlwcmludCBTVERFUlIgImZvdW5kIHJmYlNlY1R5cGVWZW5jcnlwdFxuIiBpZiAkZGI7Ci0JCWFwcGVuZF9oYW5kc2hha2UoInNlY3R5cGU9JHJmYlNlY1R5cGVWZW5jcnlwdFxuIik7Ci0JCXZlbmNyeXB0X2hhbmRzaGFrZSgkdm1vZGUsICRkYik7Ci0JfSBlbHNpZiAoZXhpc3RzICRzZWN0eXBlc3skcmZiU2VjVHlwZUFub25UbHN9KSB7Ci0JCXByaW50IFNUREVSUiAiZm91bmQgcmZiU2VjVHlwZUFub25UbHNcbiIgaWYgJGRiOwotCQlhcHBlbmRfaGFuZHNoYWtlKCJzZWN0eXBlPSRyZmJTZWNUeXBlQW5vblRsc1xuIik7Ci0JCWFub250bHNfaGFuZHNoYWtlKCR2bW9kZSwgJGRiKTsKLQl9IGVsc2UgewotCQlwcmludCBTVERFUlIgIk5vIHN1cHBvcnRlZCBzZWMtdHlwZSBmb3VuZFxuIiBpZiAkZGI7Ci0JCXZkaWU7Ci0JfQotfQotCi1zdWIgYXBwZW5kX2hhbmRzaGFrZSB7Ci0JbXkgJHN0ciA9IHNoaWZ0OwotCWlmICgkaGFuZHNoYWtlX2ZpbGUpIHsKLQkJaWYgKG9wZW4oSFNGLCAiPj4kaGFuZHNoYWtlX2ZpbGUiKSkgewotCQkJcHJpbnQgSFNGICRzdHI7Ci0JCQljbG9zZSBIU0Y7Ci0JCX0KLQl9Ci19Ci0KLXN1YiBkb192ZW5jcnlwdF92aWV3ZXJfYnJpZGdlIHsKLQlteSAoJGxpc3RlbiwgJGNvbm5lY3QpID0gQF87Ci0JcHJpbnQgU1RERVJSICJcbnBwcm94eTogc3RhcnRpbmcgdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06ICRsaXN0ZW4gXC0+ICRjb25uZWN0XG4iOwotCW15ICRkYiA9IDA7Ci0JbXkgJGJhY2t3YXJkcyA9IDA7Ci0JaWYgKCRsaXN0ZW4gPCAwKSB7Ci0JCSRiYWNrd2FyZHMgPSAxOwotCQkkbGlzdGVuID0gLSRsaXN0ZW47Ci0JfQotCWlmICgkaGFuZHNoYWtlX2ZpbGUgZXEgIiIpIHsKLQkJZGllICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiBubyBTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0VcbiI7Ci0JfQotCW15ICRsaXN0ZW5fc29jazsKLQlteSAkbWF4dHJ5ID0gMTI7Ci0JbXkgJHNsZWVwID0gNTsKLQlmb3IgKG15ICRpPTA7ICRpIDwgJG1heHRyeTsgJGkrKykgIHsKLQkJJGxpc3Rlbl9zb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJTGlzdGVuICAgID0+IDIsCi0JCQlSZXVzZUFkZHIgPT4gMSwKLQkJCUxvY2FsQWRkciA9PiAiMTI3LjAuMC4xIiwKLQkJCUxvY2FsUG9ydCA9PiAkbGlzdGVuLAotCQkJUHJvdG8gICAgID0+ICJ0Y3AiCi0JCSk7Ci0JCWlmICghICRsaXN0ZW5fc29jaykgewotCQkJaWYgKCRpIDwgJG1heHRyeSAtIDEpIHsKLQkJCQl3YXJuICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiAkIVxuIjsKLQkJCQl3YXJuICJDb3VsZCBub3QgbGlzdGVuIG9uIHBvcnQgJGxpc3RlbiwgcmV0cnlpbmcgaW4gJHNsZWVwIHNlY29uZHMuLi4gKEN0cmwtQyB0byBxdWl0KVxuIjsKLQkJCQlzbGVlcCAkc2xlZXA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsYXN0OwotCQl9Ci0JfQotCWlmICghICRsaXN0ZW5fc29jaykgewotCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06ICQhXG4iOwotCX0KLQlwcmludCBTVERFUlIgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IGxpc3RlbmluZyBvbiBwb3J0ICRsaXN0ZW5cblxuIjsKLQlteSAoJHZpZXdlcl9zb2NrLCAkaXApID0gJGxpc3Rlbl9zb2NrLT5hY2NlcHQoKTsKLQlteSAkZXJyID0gJCE7Ci0JY2xvc2UgJGxpc3Rlbl9zb2NrOwotCWlmICghICR2aWV3ZXJfc29jaykgewotCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06ICRlcnJcbiI7Ci0JfQotCWlmICgkRU5We1BQUk9YWV9MT09QX1RIWVNFTEZfTUFTVEVSfSkgewotCQlteSAkc21sID0gJEVOVntTU1ZOQ19NVUxUSVBMRV9MSVNURU59OyAKLQkJaWYgKCRzbWwgbmUgIiIgJiYgJHNtbCBuZSAiMCIpIHsKLQkJCXNldHBncnAoMCwgMCk7Ci0JCQlpZiAoZm9yaygpKSB7Ci0JCQkJY2xvc2UgJHZpZXdlcl9zb2NrOwotCQkJCXdhaXQ7Ci0JCQkJZXhpdCAwOwotCQkJfQotCQkJaWYgKGZvcmsoKSkgewotCQkJCWNsb3NlICR2aWV3ZXJfc29jazsKLQkJCQlleGl0IDA7Ci0JCQl9Ci0JCQlzZXRwZ3JwKDAsIDApOwotCQkJJHBhcmVudCA9ICQkOwotCQl9Ci0JfQotCXByaW50IFNUREVSUiAidmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IHZpZXdlcl9zb2NrICR2aWV3ZXJfc29ja1xuIiBpZiAkZGI7Ci0KLQlwcmludCBTVERFUlIgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IGNvbm5lY3RpbmcgdG8gMTI3LjAuMC4xOiRjb25uZWN0XG4iOwotCW15ICRzZXJ2ZXJfc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQkJUGVlckFkZHIgPT4gIjEyNy4wLjAuMSIsCi0JCVBlZXJQb3J0ID0+ICRjb25uZWN0LAotCQlQcm90byA9PiAidGNwIgotCSk7Ci0JcHJpbnQgU1RERVJSICJ2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogc2VydmVyX3NvY2sgJHNlcnZlcl9zb2NrXG4iIGlmICRkYjsKLQlpZiAoISAkc2VydmVyX3NvY2spIHsKLQkJbXkgJGVyciA9ICQhOwotCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06ICRlcnJcbiI7Ci0JfQotCi0JaWYgKCRiYWNrd2FyZHMpIHsKLQkJcHJpbnQgU1RERVJSICJ2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogcmV2ZXJzaW5nIHJvbGVzIG9mIHZpZXdlciBhbmQgc2VydmVyLlxuIjsKLQkJbXkgJHQgPSAkdmlld2VyX3NvY2s7Ci0JCSR2aWV3ZXJfc29jayA9ICRzZXJ2ZXJfc29jazsKLQkJJHNlcnZlcl9zb2NrID0gJHQ7Ci0JfQotCi0JbXkgJWhzID0gKCk7Ci0JbXkgJGR0ID0gMC4yOwotCW15ICRzbGVwdCA9IDAuMDsKLQl3aGlsZSAoJHNsZXB0IDwgMjAuMCkgewotCQlzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgJGR0KTsKLQkJJHNsZXB0ICs9ICRkdDsKLQkJaWYgKC1mICRoYW5kc2hha2VfZmlsZSAmJiBvcGVuKEhTRiwgIjwkaGFuZHNoYWtlX2ZpbGUiKSkgewotCQkJbXkgJGRvbmUgPSAwOwotCQkJJWhzID0gKCk7Ci0JCQlteSAkc3RyID0gIiI7Ci0JCQl3aGlsZSAoPEhTRj4pIHsKLQkJCQlwcmludCBTVERFUlIgInZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiAkXyIgaWYgJEVOVntWRU5DUllQVF9WSUVXRVJfQlJJREdFX0RFQlVHfTsKLQkJCQkkc3RyIC49ICJ2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogJF8iOwotCQkJCWNob21wOwotCQkJCWlmICgkXyBlcSAiZG9uZSIpIHsKLQkJCQkJJGRvbmUgPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW15ICgkaywgJHYpID0gc3BsaXQoLz0vLCAkXywgMik7Ci0JCQkJCWlmICgkayBuZSAiIiAmJiAkdiBuZSAiIikgewotCQkJCQkJJGhzeyRrfSA9ICR2OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2xvc2UgSFNGOwotCQkJaWYgKCRkb25lKSB7Ci0JCQkJcHJpbnQgU1RERVJSICJcbiIgLiAkc3RyOwotCQkJCWxhc3Q7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCEgZXhpc3RzICRoc3tzZXJ2ZXJ9KSB7Ci0JCSRoc3tzZXJ2ZXJ9ID0gIlJGQiAwMDMuMDA4IjsKLQl9Ci0JaWYgKCEgZXhpc3RzICRoc3tzZWN0eXBlfSkgewotCQl1bmxpbmsoJGhhbmRzaGFrZV9maWxlKTsKLQkJZGllICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiBubyBzZWN0eXBlLlxuIjsKLQl9Ci0Jc3lzd3JpdGUoJHZpZXdlcl9zb2NrLCAiJGhze3NlcnZlcn1cbiIsIGxlbmd0aCgkaHN7c2VydmVyfSkgKyAxKTsKLQlteSAkdmlld2VyX3JmYiA9ICIiOwotCWZvciAobXkgJGkgPSAwOyAkaSA8IDEyOyAkaSsrKSB7Ci0JCW15ICRjOwotCQlzeXNyZWFkKCR2aWV3ZXJfc29jaywgJGMsIDEpOwotCQkkdmlld2VyX3JmYiAuPSAkYzsKLQkJcHJpbnQgU1RERVJSICRjOwotCX0KLQlteSAkdmlld2VyX21ham9yID0gMzsKLQlteSAkdmlld2VyX21pbm9yID0gODsKLQlpZiAoJHZpZXdlcl9yZmIgPX4gL1JGQiAoXGQrKVwuKFxkKykvKSB7Ci0JCSR2aWV3ZXJfbWFqb3IgPSAkMTsJCi0JCSR2aWV3ZXJfbWlub3IgPSAkMjsJCi0JfQotCW15ICR1MCA9IHBhY2soIkMiLCAwKTsKLQlteSAkdTEgPSBwYWNrKCJDIiwgMSk7Ci0JbXkgJHUyID0gcGFjaygiQyIsIDIpOwotCWlmICgkaHN7c2VjdHlwZX0gPT0gJHJmYlNlY1R5cGVBbm9uVGxzKSB7Ci0JCXVubGluaygkaGFuZHNoYWtlX2ZpbGUpOwotCQlwcmludCBTVERFUlIgIlxucHByb3h5OiB2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogcmZiU2VjVHlwZUFub25UbHNcbiI7Ci0JCWlmICgkdmlld2VyX21ham9yID4gMyB8fCAkdmlld2VyX21pbm9yID49IDcpIHsKLQkJCTsJIyBzZXR1cCBvaywgcHJvY2VlZCB0byB4ZmVyLgotCQl9IGVsc2UgewotCQkJcHJpbnQgU1RERVJSICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiBmYWtpbmcgUkZCIHZlcnNpb24gMy4zIHRvIHZpZXdlci5cbiI7Ci0JCQlteSAkbjsKLQkJCXN5c3JlYWQoJHNlcnZlcl9zb2NrLCAkbiwgMSk7Ci0JCQkkbiA9IHVucGFjaygiQyIsICRuKTsKLQkJCWlmICgkbiA9PSAwKSB7Ci0JCQkJZGllICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiBuc2VjdHlwZXMgPT0gJG4uXG4iOwotCQkJfQotCQkJbXkgJXR5cGVzOwotCQkJZm9yIChteSAkaSA9IDA7ICRpIDwgJG47ICRpKyspIHsKLQkJCQlteSAkdDsKLQkJCQlzeXNyZWFkKCRzZXJ2ZXJfc29jaywgJHQsIDEpOwotCQkJCSR0ID0gdW5wYWNrKCJDIiwgJHQpOwotCQkJCSR0eXBlc3skdH0gPSAxOwotCQkJfQotCQkJbXkgJHVzZSA9IDE7CSMgTm9uZQotCQkJaWYgKGV4aXN0cyAkdHlwZXN7MX0pIHsKLQkJCQkkdXNlID0gMTsJIyBOb25lCi0JCQl9IGVsc2lmIChleGlzdHMgJHR5cGVzezJ9KSB7Ci0JCQkJJHVzZSA9IDI7CSMgVm5jQXV0aAotCQkJfSBlbHNlIHsKLQkJCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IG5vIHZhbGlkIHNlY3R5cGVzIiAuIGpvaW4oIiwiLCBrZXlzICV0eXBlcykgLiAiXG4iOwotCQkJfQotCQkJCQotCQkJIyBzZW5kIDQgYnl0ZXMgc2VjdHlwZSB0byB2aWV3ZXI6IAotCQkJIyAobm90ZSB0aGlzIHNob3VsZCBiZSBNU0IsIG5ldHdvcmsgYnl0ZSBvcmRlci4uLikKLQkJCW15ICR1cCA9IHBhY2soIkMiLCAkdXNlKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHVwLCAxKTsKLQkJCSMgYW5kIHRlbGwgc2VydmVyIHRoZSBvbmUgd2Ugc2VsZWN0ZWQ6Ci0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICR1cCwgMSk7Ci0JCQlpZiAoJHVzZSA9PSAxKSB7Ci0JCQkJIyBldmVuIE5vbmUgaGFzIHNlY3VyaXR5IHJlc3VsdCwgc28gcmVhZCBpdCBoZXJlIGFuZCBkaXNjYXJkIGl0LgotCQkJCW15ICRzciA9ICIiOwotCQkJCXN5c3JlYWQoJHNlcnZlcl9zb2NrLCAkc3IsIDQpOwotCQkJfQotCQl9Ci0JfSBlbHNpZiAoJGhze3NlY3R5cGV9ID09ICRyZmJTZWNUeXBlVmVuY3J5cHQpIHsKLQkJcHJpbnQgU1RERVJSICJcbnBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IHJmYlNlY1R5cGVWZW5jcnlwdFxuIjsKLQkJaWYgKCEgZXhpc3RzICRoc3tzdWJ0eXBlfSkgewotCQkJdW5saW5rKCRoYW5kc2hha2VfZmlsZSk7Ci0JCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IG5vIHN1YnR5cGUuXG4iOwotCQl9Ci0JCW15ICRmYWtlX3R5cGUgPSAiTm9uZSI7Ci0JCW15ICRwbGFpbiA9IDA7Ci0JCW15ICRzdWJfdHlwZSA9ICRoc3tzdWJ0eXBlfTsKLQkJaWYgKCRzdWJfdHlwZSA9PSAkcmZiVmVuY3J5cHRUbHNOb25lKSB7Ci0JCQkkZmFrZV90eXBlID0gIk5vbmUiOwotCQl9IGVsc2lmICgkc3ViX3R5cGUgPT0gJHJmYlZlbmNyeXB0VGxzVm5jKSB7Ci0JCQkkZmFrZV90eXBlID0gIlZuY0F1dGgiOwotCQl9IGVsc2lmICgkc3ViX3R5cGUgPT0gJHJmYlZlbmNyeXB0VGxzUGxhaW4pIHsKLQkJCSRmYWtlX3R5cGUgPSAiTm9uZSI7Ci0JCQkkcGxhaW4gPSAxOwotCQl9IGVsc2lmICgkc3ViX3R5cGUgPT0gJHJmYlZlbmNyeXB0WDUwOU5vbmUpIHsKLQkJCSRmYWtlX3R5cGUgPSAiTm9uZSI7Ci0JCX0gZWxzaWYgKCRzdWJfdHlwZSA9PSAkcmZiVmVuY3J5cHRYNTA5Vm5jKSB7Ci0JCQkkZmFrZV90eXBlID0gIlZuY0F1dGgiOwotCQl9IGVsc2lmICgkc3ViX3R5cGUgPT0gJHJmYlZlbmNyeXB0WDUwOVBsYWluKSB7Ci0JCQkkZmFrZV90eXBlID0gIk5vbmUiOwotCQkJJHBsYWluID0gMTsKLQkJfQotCQlpZiAoJHBsYWluKSB7Ci0JCQlpZiAoIW9wZW4oVywgIj4kaGFuZHNoYWtlX2ZpbGUiKSkgewotCQkJCXVubGluaygkaGFuZHNoYWtlX2ZpbGUpOwotCQkJCWRpZSAicHByb3h5OiB2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogJGhhbmRzaGFrZV9maWxlICQhXG4iOwotCQkJfQotCQkJcHJpbnQgVyA8PCJFTkQiOwotCi0JCQlwcm9jIHByaW50X291dCB7fSB7Ci0JCQkJZ2xvYmFsIHVzZXIgcGFzcyBlbnYKLQotCQkJCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfVVBfREVCVUcpXSB7Ci0JCQkJCXRvcGxldmVsIC5iCi0JCQkJCWJ1dHRvbiAuYi5iIC10ZXh0ICJ1c2VyPVwkdXNlciBwYXNzPVwkcGFzcyIgLWNvbW1hbmQge2Rlc3Ryb3kgLmJ9Ci0JCQkJCXBhY2sgLmIuYgotCQkJCQl1cGRhdGUKLQkJCQkJdGt3YWl0IHdpbmRvdyAuYgotCQkJCX0KLQkJCQkKLQkJCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX1VQX0ZJTEUpXSB7Ci0JCQkJCXNldCBmaCAiIiAKLQkJCQkJY2F0Y2gge3NldCBmaCBbb3BlbiBcJGVudihTU1ZOQ19VUF9GSUxFKSB3XX0KLQkJCQkJaWYge1wkZmggIT0gIiJ9IHsKLQkJCQkJCXB1dHMgXCRmaCB1c2VyPVwkdXNlclxcbnBhc3M9XCRwYXNzCi0JCQkJCQlmbHVzaCBcJGZoCi0JCQkJCQljbG9zZSBcJGZoCi0JCQkJCQlyZXR1cm4KLQkJCQkJfQotCQkJCX0KLQkJCQlwdXRzIHN0ZG91dCB1c2VyPVwkdXNlclxcbnBhc3M9XCRwYXNzCi0JCQkJZmx1c2ggc3Rkb3V0Ci0JCQl9Ci0KLQkJCXByb2MgY2VudGVyX3dpbiB7d30gewotCQkJCXVwZGF0ZQotCQkJCXNldCBXIFt3aW5mbyBzY3JlZW53aWR0aCAgXCR3XQotCQkJCXNldCBXIFtleHByIFwkVyArIDFdCi0JCQkJd20gZ2VvbWV0cnkgXCR3ICtcJFcrMAotCQkJCXVwZGF0ZQotCQkJCXNldCB4IFtleHByIFt3aW5mbyBzY3JlZW53aWR0aCAgXCR3XS8yIC0gW3dpbmZvIHdpZHRoICBcJHddLzJdCi0JCQkJc2V0IHkgW2V4cHIgW3dpbmZvIHNjcmVlbmhlaWdodCBcJHddLzIgLSBbd2luZm8gaGVpZ2h0IFwkd10vMl0KLQotCQkJCXdtIGdlb21ldHJ5IFwkdyArXCR4K1wkeQotCQkJCXdtIGRlaWNvbmlmeSBcJHcKLQkJCQl1cGRhdGUKLQkJCX0KLQotCQkJd20gd2l0aGRyYXcgLgotCi0JCQlnbG9iYWwgZW52Ci0JCQlzZXQgdXAge30KLQkJCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfVU5JWFBXKV0gewotCQkJCXNldCBybSAwCi0JCQkJc2V0IHVwIFwkZW52KFNTVk5DX1VOSVhQVykKLQkJCQlpZiBbcmVnZXhwIHtecm06fSBcJHVwXSAgewotCQkJCQlzZXQgcm0gMQotCQkJCQlyZWdzdWIge15ybTp9IFwkdXAge30gdXAKLQkJCQl9Ci0JCQkJaWYgW2ZpbGUgZXhpc3RzIFwkdXBdIHsKLQkJCQkJc2V0IGZoICIiCi0JCQkJCXNldCBmIFwkdXAKLQkJCQkJY2F0Y2gge3NldCBmaCBbb3BlbiBcJHVwIHJdfQotCQkJCQlpZiB7XCRmaCAhPSAiIn0gewotCQkJCQkJZ2V0cyBcJGZoIHUJCi0JCQkJCQlnZXRzIFwkZmggcAkKLQkJCQkJCWNsb3NlIFwkZmgKLQkJCQkJCXNldCB1cCAiXCR1QFwkcCIKLQkJCQkJfQotCQkJCQlpZiB7XCRybX0gewotCQkJCQkJY2F0Y2gge2ZpbGUgZGVsZXRlIFwkZn0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfVkVOQ1JZUFRfVVNFUlBBU1MpXSB7Ci0JCQkJc2V0IHVwIFwkZW52KFNTVk5DX1ZFTkNSWVBUX1VTRVJQQVNTKQotCQkJfQotCQkJI3B1dHMgc3RkZXJyIHVwPVwkdXAKLQkJCWlmIHtcJHVwICE9ICIifSB7Ci0JCQkJaWYgW3JlZ2V4cCB7QH0gXCR1cF0gewotCQkJCQlnbG9iYWwgdXNlciBwYXNzCi0JCQkJCXNldCB1c2VyIFwkdXAKLQkJCQkJc2V0IHBhc3MgXCR1cAotCQkJCQlyZWdzdWIge0AuKlwkfSAgXCR1c2VyICIiIHVzZXIKLQkJCQkJcmVnc3ViIHteW15AXSpAfSBcJHBhc3MgIiIgcGFzcwotCQkJCQlwcmludF9vdXQKLQkJCQkJZXhpdAotCQkJCX0KLQkJCX0KLQotCQkJd20gdGl0bGUgLiB7VmVOQ3J5cHQgVmlld2VyIEJyaWRnZSBVc2VyL1Bhc3N9Ci0KLQkJCXNldCB1c2VyIHt9Ci0JCQlzZXQgcGFzcyB7fQotCi0JCQlsYWJlbCAubCAtdGV4dCB7U1NWTkMgVmVOQ3J5cHQgVmlld2VyIEJyaWRnZX0KLQotCQkJZnJhbWUgLmYwCi0JCQlmcmFtZSAuZjAuZkwKLQkJCWxhYmVsIC5mMC5mTC5sYSAtdGV4dCB7VXNlcm5hbWU6IH0KLQkJCWxhYmVsIC5mMC5mTC5sYiAtdGV4dCB7UGFzc3dvcmQ6IH0KLQotCQkJcGFjayAuZjAuZkwubGEgLmYwLmZMLmxiIC1zaWRlIHRvcAotCi0JCQlmcmFtZSAuZjAuZlIKLQkJCWVudHJ5IC5mMC5mUi5lYSAtd2lkdGggMjQgLXRleHR2YXJpYWJsZSB1c2VyCi0JCQllbnRyeSAuZjAuZlIuZWIgLXdpZHRoIDI0IC10ZXh0dmFyaWFibGUgcGFzcyAtc2hvdyAqCi0KLQkJCXBhY2sgLmYwLmZSLmVhIC5mMC5mUi5lYiAtc2lkZSB0b3AgLWZpbGwgeAotCi0JCQlwYWNrIC5mMC5mTCAtc2lkZSBsZWZ0Ci0JCQlwYWNrIC5mMC5mUiAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JCQlidXR0b24gLm5vIC10ZXh0IENhbmNlbCAtY29tbWFuZCB7ZGVzdHJveSAufQotCQkJYnV0dG9uIC5vayAtdGV4dCBEb25lICAgLWNvbW1hbmQge3ByaW50X291dDsgZGVzdHJveSAufQotCi0JCQljZW50ZXJfd2luIC4KLQkJCXBhY2sgLmwgLmYwIC5ubyAub2sgLXNpZGUgdG9wIC1maWxsIHgKLQkJCXVwZGF0ZQotCQkJd20gZGVpY29uaWZ5IC4KLQotCQkJYmluZCAuZjAuZlIuZWEgPFJldHVybj4ge2ZvY3VzIC5mMC5mUi5lYn0KLQkJCWJpbmQgLmYwLmZSLmViIDxSZXR1cm4+IHtwcmludF9vdXQ7IGRlc3Ryb3kgLn0KLQkJCWZvY3VzIC5mMC5mUi5lYQotCi0JCQl3bSByZXNpemFibGUgLiAxIDAKLQkJCXdtIG1pbnNpemUgLiBbd2luZm8gcmVxd2lkdGggLl0gW3dpbmZvIHJlcWhlaWdodCAuXQotRU5ECi0JCQljbG9zZSBXOwotCi0JCQkjc3lzdGVtKCJjYXQgJGhhbmRzaGFrZV9maWxlIik7Ci0JCQlteSAkdyA9ICJ3aXNoIjsKLQkJCWlmICgkRU5We1dJU0h9KSB7Ci0JCQkJJHcgPSAkRU5We1dJU0h9OwkKLQkJCX0KLQkJCXByaW50IFNUREVSUiAicHByb3h5OiB2ZW5jcnlwdF92aWV3ZXJfYnJpZGdlWyQkXTogcHJvbXB0ICBWZW5jcnlwdFBsYWluIHVzZXIgYW5kIHBhc3N3ZC5cbiI7Ci0JCQlteSAkcmVzID0gIiI7Ci0JCQlpZiAoYHVuYW1lYCA9fiAvRGFyd2luLykgewotCQkJCW15ICRtdG1wID0gYG1rdGVtcCAvdG1wL2hzdXAuWFhYWFhYYDsKLQkJCQljaG9tcCAkbXRtcDsKLQkJCQlzeXN0ZW0oImVudiBTU1ZOQ19VUF9GSUxFPSRtdG1wICR3ICRoYW5kc2hha2VfZmlsZSIpOwotCQkJCSRyZXMgPSBgY2F0ICRtdG1wYDsKLQkJCQl1bmxpbmsgJG10bXA7Ci0JCQl9IGVsc2UgewotCQkJCSRyZXMgPSBgJHcgJGhhbmRzaGFrZV9maWxlYDsKLQkJCX0KLQkJCW15ICR1c2VyID0gIiI7Ci0JCQlteSAkcGFzcyA9ICIiOwotCQkJaWYgKCRyZXMgPX4gL3VzZXI9KFxTKikvKSB7Ci0JCQkJJHVzZXIgPSAkMTsKLQkJCX0KLQkJCWlmICgkcmVzID1+IC9wYXNzPShcUyopLykgewotCQkJCSRwYXNzID0gJDE7Ci0JCQl9Ci0JCQlwcmludCBTVERFUlIgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IHNlbmRpbmcgVmVuY3J5cHRQbGFpbiB1c2VyIGFuZCBwYXNzd2QuXG4iOwotCQkJbXkgJHVsZW4gPSBwYWNrKCJDIiwgbGVuZ3RoKCR1c2VyKSk7Ci0JCQlteSAkcGxlbiA9IHBhY2soIkMiLCBsZW5ndGgoJHBhc3MpKTsKLQkJCSMgKG5vdGUgdGhpcyBzaG91bGQgYmUgTVNCLCBuZXR3b3JrIGJ5dGUgb3JkZXIuLi4pCi0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICR1MCwgMSk7Ci0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICR1MCwgMSk7Ci0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICR1MCwgMSk7Ci0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICR1bGVuLCAxKTsKLQkJCXN5c3dyaXRlKCRzZXJ2ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCRzZXJ2ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCRzZXJ2ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCRzZXJ2ZXJfc29jaywgJHBsZW4sIDEpOwotCQkJc3lzd3JpdGUoJHNlcnZlcl9zb2NrLCAkdXNlciwgbGVuZ3RoKCR1c2VyKSk7Ci0JCQlzeXN3cml0ZSgkc2VydmVyX3NvY2ssICRwYXNzLCBsZW5ndGgoJHBhc3MpKTsKLQkJfQotCQl1bmxpbmsoJGhhbmRzaGFrZV9maWxlKTsKLQotCQlteSAkZnQgPSAwOwotCQlpZiAoJGZha2VfdHlwZSBlcSAiTm9uZSIpIHsKLQkJCSRmdCA9IDE7Ci0JCX0gZWxzaWYgKCRmYWtlX3R5cGUgZXEgIlZuY0F1dGgiKSB7Ci0JCQkkZnQgPSAyOwotCQl9IGVsc2UgewotCQkJZGllICJwcHJveHk6IHZlbmNyeXB0X3ZpZXdlcl9icmlkZ2VbJCRdOiB1bmtub3duIGZha2UgdHlwZTogJGZha2VfdHlwZVxuIjsKLQkJfQotCQlteSAkZnAgPSBwYWNrKCJDIiwgJGZ0KTsKLQkJaWYgKCR2aWV3ZXJfbWFqb3IgPiAzIHx8ICR2aWV3ZXJfbWlub3IgPj0gNykgewotCQkJc3lzd3JpdGUoJHZpZXdlcl9zb2NrLCAkdTEsIDEpOwotCQkJc3lzd3JpdGUoJHZpZXdlcl9zb2NrLCAkZnAsIDEpOwotCQkJbXkgJGNyOwotCQkJc3lzcmVhZCgkdmlld2VyX3NvY2ssICRjciwgMSk7Ci0JCQkkY3IgPSB1bnBhY2soIkMiLCAkY3IpOwotCQkJaWYgKCRjciAhPSAkZnQpIHsKLQkJCQlkaWUgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IGNsaWVudCBzZWxlY3RlZCB3cm9uZyB0eXBlOiAkY3IgLyAkZnRcbiI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludCBTVERFUlIgInBwcm94eTogdmVuY3J5cHRfdmlld2VyX2JyaWRnZVskJF06IGZha2luZyBSRkIgdmVyc2lvbiAzLjMgdG8gdmlld2VyLlxuIjsKLQkJCSMgc2VuZCA0IGJ5dGVzIHNlY3QgdHlwZSB0byB2aWV3ZXI6IAotCQkJIyAobm90ZSB0aGlzIHNob3VsZCBiZSBNU0IsIG5ldHdvcmsgYnl0ZSBvcmRlci4uLikKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJHUwLCAxKTsKLQkJCXN5c3dyaXRlKCR2aWV3ZXJfc29jaywgJGZwLCAxKTsKLQkJCWlmICgkZnQgPT0gMSkgewotCQkJCSMgZXZlbiBOb25lIGhhcyBzZWN1cml0eSByZXN1bHQsIHNvIHJlYWQgaXQgaGVyZSBhbmQgZGlzY2FyZCBpdC4KLQkJCQlteSAkc3IgPSAiIjsKLQkJCQlzeXNyZWFkKCRzZXJ2ZXJfc29jaywgJHNyLCA0KTsKLQkJCX0KLQkJfQotCX0KLQotCSRsaXN0ZW5faGFuZGxlID0gJHZpZXdlcl9zb2NrOwotCSRzb2NrID0gJHNlcnZlcl9zb2NrOwotCi0JeGZlcl9ib3RoKCk7Ci19Ci0nCi0JIyAnCi0JIyB4cGdfZWNobyB3aWxsIGV4cGFuZCBcbiBcciwgZXRjLgotCSMgdHJ5IHRvIHVuc2V0IGFuZCB0aGVuIHRlc3QgZm9yIGl0LgotCWlmIHR5cGUgc2hvcHQgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotCQlzaG9wdCAtdSB4cGdfZWNobyA+L2Rldi9udWxsIDI+JjEKLQlmaQotCXY9J3ByaW50IFNURE9VVCAiYWJjXG4iOycKLQllY2hvICIkdiIgPiAkdGYKLQljaG1vZCA3MDAgJHRmCi0KLQlsYz1gd2MgLWwgJHRmIHwgYXdrICd7cHJpbnQgJDF9J2AKLQlpZiBbICJYJGxjIiA9ICJYMSIgXTsgdGhlbgotCQllY2hvICIkY29kIiA+ICR0ZgotCWVsc2UKLQkJcHJpbnRmICIlcyIgIiRjb2QiID4gJHRmCi0JCWVjaG8gIiIgPj4gJHRmCi0JZmkKLQkjIHByaW1lIHBlcmwKLQlwZXJsIC1lICd1c2UgSU86OlNvY2tldDo6SU5FVDsgc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuMDEpJyA+L2Rldi9udWxsIDI+JjEKLX0KLQotIyBtYWtlX3RjZXJ0IGlzIG5vIGxvbmdlciBpbnZva2VkIHZpYSB0aGUgc3N2bmMgZ3VpIChMaXN0ZW4gbW9kZSkuCi0jIG1ha2VfdGNlcnQgaXMgZm9yIHRlc3Rpbmcgb25seSBub3cgdmlhIC1teWNlcnQgQlVJTFRJTgotbWFrZV90Y2VydCgpIHsKLQl0Y2VydD0iL3RtcC9zc192bmNfdmlld2VyX3RjZXJ0JHtSQU5ET019LiQkIgotCXRjZXJ0PWBteXRtcCAiJHRjZXJ0ImAKLQljYXQgPiAkdGNlcnQgPDxFTkQKLS0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUVvd0lCQUFLQ0FRRUF2a2ZYeGIwd2N4Z3JqVjJ6aUZpa2pJSSt6ZThpS2NUQnQ0N0wwR00vYzIxZWZlbE4KLSt6WnBKVVVYTHU0eno4UnlxOFErc1FnZk55N3VUT3BOOWJVVWFPazFUbkQ3Z2FEUW5RV2lOSG1xYlcya0wrRFMKLU9LbmdKVlBvOWRFVEFTOGhmNytEMWUxREJaeGpUYzFhNFJRcVdKaXh3cFlqOTlpeFd6dThWQzJtL3hYc2p2T3MKLWpwNCtETEJCNDkwbmJrd3ZzdG1obWlXbTFDbUk1TzV4T2tnaW9WTlFxSHZRTWRWS09TejlQcGJqdlppUlgxVW8KLXFvTXJrKzJOT3F3UDkwVEIzNXlQQVNYYjl6WEtwTzdETGhrdWJlK3lZR2YreWs0NmFENzA3TDA3RWI3Y29zRlAKLVM4NHZOWjlnWDdyUTBVT3dtNXJZQS9vWlRCc2tnYXFodEl6a0x3SURBUUFCQW9JQkFENG90L3NYdDVrUm4wQ2EKLUNJa1U5QVFXbEMrdjI4Z3JSMkVRVzlKaWFacnFjb0ROVXpVcWJDVEpzaTRaa0lGaDJsZjBUc3FFTGJaWU5XNlkKLTZBakpNN2FsNEUwVXFZU0tKVHYyV0N1dVJ4ZGlSczJCTXd0aHF5Qm1qZWFuZXY3YkI2VjB5YnQ3dTNZOHhVL28KLU1yVHVZbnI0dnJFalhQS2RMaXJ3azdBb0RiS3NSWEhTSWlIRUlCT3ExK2RVUTMydDM2dWtkbm56YTR3S0RMWmMKLVBLSGlDZENrL3dPR2h1RGx4RDZSc3BxVUFsUm5KOC9hRWhyZ1d4YWRGWHcxaFJoUnNmL3Yxc2h0QjBUM0RtVGUKLUpjaGp3eWl3OW1yeWI5SlpBY0t4VytmVWM0RVZ2ajZWZFFHcVlJblFKWTVZeG01SkFsVlFVSmljdXVKRXZuNkEKLXJqNW9zUUVDZ1lFQTU1MkNhSHBVaUZsQjRIR2tqYUgwMGtMK2YwK2dSRjRQQU5DUGs2WDNVUERWWXpLbnptdXUKLXlEdklkRUVUR0ZXQndvenRVck9PS3FWdlBFUStrQmEyK0RXV1lhRVJaTHRnMmNJNWJ5ZkRKeFEzbGR6aWxTM0oKLTFTM1dnQ29qcWNzRy9obHhvUUoxZFpGYW5VeS9RaFVaMEIrd2xDK1pwMVE4QXl1R1F2aEhwNjhDZ1lFQTBsQkkKLWVxcTJHR0NkSnVOSE1QRmJpOFEwQm5YNTVMVzVDMWhXamh1WWlFa2IzaE9hSUp1SnJxdmF5QmxoY1FhMmNHcXAKLXVQMzRlOVVDZm9lTGdtb0NRMGI0S3BMMk5Hb3YvbUw0aThiTWdvZzRoY29ZdUlpM3F4TjE4dlZSMTRWS0VoNFUKLVJMazBpZ0FZUFUrSUsyUUJ5YVFsQm85T1NhS2tjZm03VTEvcEs0RUNnWUF4cjZWcEdrMEdEdmZGMlRzdXN2NmQKLUdJZ1Y4WlAwOXFTTFRUSnZ2eHZGL2xRWWVxWnE3c2pJNWFKRDVpM2RlNEpocE8vSVhRSnpmWmZXT3VHYzhYS0EKLTNxWUsvWTJJcVhYR1lSY0hGR1dWL1kxTEZkNTVtQ0FESGxrMGwxV2RPQk9nOFA1aVJ1L0JyOVBiaUxwQ3g5b0kKLXZyT1hwbnAwM2VvZDEvbHVabXFndXdLQmdRQ1dGUlNqOVE3ZGRwU3ZHNkhDRzNybzBxc05zVU1USTF0WjdVQlgKLVNQb2d4NHRMZjFHTjAzRDlaVVpMWlZGVUJ5WktNdFBMWC9IaTdLOUsvQTlpa2FQcnZzbDZHRVg2UVl6ZVRHSngKLTNQdzBhbUZybUR6cjh5U2V3TlI2L1BYYWh4UEV1aEpjdUkzMXJQdWZSUkkzWkxhaDNyRk5iUmJCRlgra2xrSkgKLXpUbm9BUUtCZ0RiVUsvYVFGR2R1U3k3V1VUN0xsTTNVbEd4SjJzQTkwVFFoNEpSUXd6dXIwQUNONUdkWVprcU0KLVlCdHM0c0JKVnd3Sm94RDlPcGJ2S3UzdUtDdDQxQlNqMC9LeW9CempUNDRTMmlvMnRqMXN5dWp0bFZVc3l5QnkKLS9jYTBBN1dCQjhsRDFEN1FNSWhZVW0yTzlrWXRTQ0xsVVRIdDVsZXFHYVJHMzhEcWxYMzYKLS0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUR6RENDQXJRQ0NRRFN6eHp4cWh5cUx6QU5CZ2txaGtpRzl3MEJBUVFGQURDQnB6RUxNQWtHQTFVRUJoTUMKLVZWTXhGakFVQmdOVkJBZ1REVTFoYzNOaFkyaDFjMlYwZEhNeER6QU5CZ05WQkFjVEJrSnZjM1J2YmpFVE1CRUcKLUExVUVDaE1LVFhrZ1EyOXRjR0Z1ZVRFY01Cb0dBMVVFQ3hNVFVISnZaSFZqZENCRVpYWmxiRzl3YldWdWRERVoKLU1CY0dBMVVFQXhNUWQzZDNMbTV2ZDJobGNtVXVibTl1WlRFaE1COEdDU3FHU0liM0RRRUpBUllTWVdSdGFXNUEKLWJtOTNhR1Z5WlM1dWIyNWxNQjRYRFRBM01ETXlNekU0TURjME5Wb1hEVEkyTURVeU1qRTRNRGMwTlZvd2dhY3gKLUN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUlFdzFOWVhOellXTm9kWE5sZEhSek1ROHdEUVlEVlFRSEV3WkMKLWIzTjBiMjR4RXpBUkJnTlZCQW9UQ2sxNUlFTnZiWEJoYm5reEhEQWFCZ05WQkFzVEUxQnliMlIxWTNRZ1JHVjIKLVpXeHZjRzFsYm5ReEdUQVhCZ05WQkFNVEVIZDNkeTV1YjNkb1pYSmxMbTV2Ym1VeElUQWZCZ2txaGtpRzl3MEIKLUNRRVdFbUZrYldsdVFHNXZkMmhsY21VdWJtOXVaVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKLUFRb0NnZ0VCQUw1SDE4VzlNSE1ZSzQxZHM0aFlwSXlDUHMzdklpbkV3YmVPeTlCalAzTnRYbjNwVGZzMmFTVkYKLUZ5N3VNOC9FY3F2RVByRUlIemN1N2t6cVRmVzFGR2pwTlU1dys0R2cwSjBGb2pSNXFtMXRwQy9nMGppcDRDVlQKLTZQWFJFd0V2SVgrL2c5WHRRd1djWTAzTld1RVVLbGlZc2NLV0kvZllzVnM3dkZRdHB2OFY3STd6ckk2ZVBneXcKLVFlUGRKMjVNTDdMWm9ab2xwdFFwaU9UdWNUcElJcUZUVUtoNzBESFZTamtzL1Q2VzQ3MllrVjlWS0txREs1UHQKLWpUcXNEL2RFd2QrY2p3RWwyL2MxeXFUdXd5NFpMbTN2c21Cbi9zcE9PbWcrOU95OU94RyszS0xCVDB2T0x6V2YKLVlGKzYwTkZEc0p1YTJBUDZHVXdiSklHcW9iU001QzhDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVFGQUFPQ0FRRUEKLXZHb21IRXA2VFZVODNYMkVCVWduYk9oektKOXUzZk9JL1VmNUw3cC8vVnhxb3c3T1IxY2d1emgvWUV6bVhPSUwKLWlsTVZuelg5bmovYnZjTEF1cUVQN01SMUE4ZjQrRTgwN3AvTC9TZjQ5QmlDY3dRcTVJOTY2c0dLWVhqa3ZlK1QKLTJHVEJOd01TcSs1a0xTZjZRWThWWkkrcW5yQXVkRVFNZUpCeVFoVFpaMGRIOE5qZXE4RUdsOUtVaW8rVldhaVcKLUNRSzZ4SnVBdkFIcWEwNk9qTG13dTFmWUQ0R0xHU3JPSWlSVmtTWFY4cUxJVW16eGRKYUlSem5rRldzckNFS1IKLXdBSDk2NlNBT3ZkMnM2eU9ITXZ5RFJJTDdXSHhmRVNCNnJESHNkSVcveW55MWZCZVBqdjQ3M0tyeHlYdGJ6N0kKLWRNdzF5VzA5bCtlRW80QTdHendPZHc9PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotRU5ECi0JY2htb2QgNjAwICR0Y2VydAotCWVjaG8gIiR0Y2VydCIKLX0KLQotS2VjaG8oKSB7Ci0JTk9fS0VDSE89MQotCWlmIFsgIlgkVVNFUiIgPSAiWHJ1bmdlIiAtYSAiWCROT19LRUNITyIgPSAiWCIgXTsgdGhlbgotCQllY2hvICJkYmc6ICQqIgotCWZpCi19Ci0KLU5IQUZMX3dhcm5pbmcoKSB7Ci0JZWNobyAiIiAKLQllY2hvICIqKiBXYXJuaW5nOiBGb3IgdGhlIHByb3h5OiAkcHJveHkiIAotCWVjaG8gIioqIFdhcm5pbmc6IHRoZSBzc2goMSkgb3B0aW9uOiAkc3NoX05IQUZMIiAKLQllY2hvICIqKiBXYXJuaW5nOiB3aWxsIGJlIHVzZWQgdG8gYXZvaWQgZnJlcXVlbnQgJ3NzaCBrZXkgaGFzIGNoYW5nZWQgZm9yIGxvY2FsaG9zdCciCi0JZWNobyAiKiogV2FybmluZzogZGlhbG9ncyBhbmQgY29ubmVjdGlvbiBmYWlsdXJlcyAoZm9yIGV4YW1wbGUsIHNzaCB3aWxsIGV4aXQgYXNraW5nIgotCWVjaG8gIioqIFdhcm5pbmc6IHlvdSB0byBtYW51YWxseSByZW1vdmUgYSBrZXkgZnJvbSB+Ly5zc2gva25vd25faG9zdHMuKSIKLQllY2hvICIqKiBXYXJuaW5nOiAiCi0JZWNobyAiKiogV2FybmluZzogVGhpcyBkZWNyZWFzZXMgc2VjdXJpdHk6IGEgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrIGlzIHBvc3NpYmxlLiIKLQllY2hvICIqKiBXYXJuaW5nOiBGb3IgY2hhaW5lZCBzc2ggY29ubmVjdGlvbnMgdGhlIGZpcnN0IHNzaCBsZWcgaXMgc2VjdXJlIGJ1dCB0aGUiCi0JZWNobyAiKiogV2FybmluZzogMm5kIHNzaCBsZWcgaXMgdnVsbmVyYWJsZS4gIEZvciBhbiBzc2ggY29ubmVjdGlvbiBnb2luZyB0aHJvdWdoIgotCWVjaG8gIioqIFdhcm5pbmc6IGEgSFRUUCBvciBTT0NLUyBwcm94eSB0aGUgc3NoIGNvbm5lY3Rpb24gaXMgdnVsbmVyYWJsZS4iCi0JZWNobyAiKiogV2FybmluZzogIgotCWVjaG8gIioqIFdhcm5pbmc6IFlvdSBjYW4gc2V0IHRoZSBTU1ZOQ19TU0hfTE9DQUxIT1NUX0FVVEg9MSBlbnYuIHZhci4gdG8gZGlzYWJsZSIgCi0JZWNobyAiKiogV2FybmluZzogdXNpbmcgdGhlIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0PXllcyBzc2ggb3B0aW9uLiIgCi0JZWNobyAiKiogV2FybmluZzogIgotCWVjaG8gIioqIFdhcm5pbmc6IEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIGNvbmZpZ3VyZSAoaW4gdGhlIFNTVk5DIEdVSSkgdGhlIHNldHRpbmc6IgotCWVjaG8gIioqIFdhcm5pbmc6ICdPcHRpb25zIC0+IEFkdmFuY2VkIC0+IFByaXZhdGUgU1NIIEtub3duSG9zdHMgZmlsZScgKG9yIHNldCIgCi0JZWNobyAiKiogV2FybmluZzogU1NWTkNfS05PV05fSE9TVFNfRklMRSBkaXJlY3RseSkgdG8gYSBwZXItY29ubmVjdGlvbiBrbm93biBob3N0cyIgCi0JZWNobyAiKiogV2FybmluZzogZmlsZS4gIFRoYXQgZmlsZSBob2xkcyB0aGUgJ2xvY2FsaG9zdCcgY2VydCBmb3IgdGhpcyBzcGVjaWZpYyIgCi0JZWNobyAiKiogV2FybmluZzogY29ubmVjdGlvbi4gIFRoaXMgeWllbGRzIGEgYm90aCBzZWN1cmUgYW5kIGNvbnZlbmllbnQgc29sdXRpb24uIiAKLQllY2hvICIiIAotfQotCi1zcGFjZV9leHBhbmQoKSB7Ci0Jc3RyPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvJVNQQUNFLyAvZycgLWUgJ3MvJVRBQi9cdC9nJ2AKLQllY2hvICIkc3RyIgotfQotCi0jIGhhbmRsZSBzc2ggY2FzZToKLSMKLWlmIFsgIlgkdXNlX3NzaCIgPSAiWDEiIF07IHRoZW4KLQkjCi0JIyBVU0lORyBTU0gKLQkjCi0Jc3NoX3BvcnQ9IjIyIgotCXNzaF9ob3N0PSIkaG9zdCIKLQl2bmNfaG9zdD0iJGxvY2FsaG9zdCIKLQlzc2hfVUtIRj0iIgotCWxvY2FsaG9zdF9leHRyYT0iIgotCSMgbGV0IHVzZXIgb3ZlcnJpZGUgc3NoIHZpYSAkU1NICi0Jc3NoPSR7U1NIOi0ic3NoIC14In0KLQotCXNzaHdvcmQ9YGVjaG8gIiRzc2giIHwgYXdrICd7cHJpbnQgJDF9J2AKLQlpZiBbICJYJHNzaHdvcmQiICE9ICJYIiBdOyB0aGVuCi0JCWlmIFsgLXggIiRzc2h3b3JkIiBdOyB0aGVuCi0JCQk6Ci0JCWVsaWYgdHlwZSAiJHNzaHdvcmQiID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCToKLQkJZWxzZQotCQkJZWNobyAiIgotCQkJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgotCQkJZWNobyAiKiogUHJvYmxlbSBmaW5kaW5nIHRoZSBTU0ggY29tbWFuZCAnJHNzaHdvcmQnOiAqKiIKLQkJCWVjaG8gIiIKLQkJCXR5cGUgIiRzc2h3b3JkIgotCQkJZWNobyAiIgotCQkJZWNobyAiKiogUGVyaGFwcyB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBTU0ggY2xpZW50IHBhY2thZ2UuICoqIgotCQkJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgotCQkJZWNobyAiIgotCQkJc2xlZXAgNQotCQlmaQotCWZpCi0KLQlzc2hfTkhBRkw9Ii1vIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0PXllcyIKLQlpZiBbICJYJFNTVk5DX1NTSF9MT0NBTEhPU1RfQVVUSCIgPSAiWDEiIF07IHRoZW4KLQkJc3NoX05IQUZMPSIiCi0JZmkKLQlpZiBbICJYJFNTVk5DX0tOT1dOX0hPU1RTX0ZJTEUiICE9ICJYIiBdOyB0aGVuCi0JCXNzaF9OSEFGTD0iIgotCQotCQlzc2hfVUtIRj0iLW8gVXNlcktub3duSG9zdHNGaWxlPSRTU1ZOQ19LTk9XTl9IT1NUU19GSUxFIgotCQlzc2hfYXJncz0iJHNzaF9hcmdzICRzc2hfVUtIRiIKLQkJaWYgWyAhIC1mICIkU1NWTkNfS05PV05fSE9TVFNfRklMRSIgXTsgdGhlbgotCQkJdG91Y2ggIiRTU1ZOQ19LTk9XTl9IT1NUU19GSUxFIiA+L2Rldi9udWxsIDI+JjEKLQkJZmkKLQkJY2htb2QgNjAwICIkU1NWTkNfS05PV05fSE9TVFNfRklMRSIgPi9kZXYvbnVsbCAyPiYxCi0JZmkKLQlkaWRfc3NoX05IQUZMPSIiCi0KLQlpZiBbICJYJFNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRCIgIT0gIlgiIF07IHRoZW4KLQkJU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEPSIkU1NWTkNfQkFTRURJUi8kU1NWTkNfVU5BTUUvJFNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRCIKLQlmaQotCWlmIFsgIlgkU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEIiAhPSAiWCIgXTsgdGhlbgotCQllY2hvICIiCi0JCWVjaG8gIlNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRD0kU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEIgotCWZpCi0KLQlpZiBbICJYJFNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRCIgIT0gIlgiIC1hIC1mICIkU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEIiBdOyB0aGVuCi0JCXBsdmFyPUxEX1BSRUxPQUQKLQkJaWYgdW5hbWUgfCBncmVwIERhcndpbiA+L2Rldi9udWxsOyB0aGVuCi0JCQlwbHZhcj0iRFlMRF9GT1JDRV9GTEFUX05BTUVTUEFDRT0xIERZTERfSU5TRVJUX0xJQlJBUklFUyIKLQkJZmkKLQkJc3NoPSJlbnYgJHBsdmFyPSRTU1ZOQ19MSU1fQUNDRVBUX1BSRUxPQUQgJHNzaCIKLQllbHNlCi0JCVNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRD0iIgotCWZpCi0KLQlzc2hfdmVuY3J5cHRfcHJveHk9IiIKLQkjIFdlIGhhbmRsZSB2ZW5jcnlwdCBmb3IgU1NIK1NTTCBtb2RlLgotCWlmIGVjaG8gIiRwcm94eSIgfCBncmVwICd2ZW5jcnlwdDovLycgPiAvZGV2L251bGw7IHRoZW4KLQkJcHJveHluZXc9IiIKLQkJZm9yIHBhcnQgaW4gYGVjaG8gIiRwcm94eSIgfCB0ciAnLCcgJyAnYAotCQlkbwotCQkJaWYgZWNobyAiJHBhcnQiIHwgZWdyZXAgLWkgJ152ZW5jcnlwdDovLycgPiAvZGV2L251bGw7IHRoZW4KLQkJCQlzc2hfdmVuY3J5cHRfcHJveHk9JHBhcnQKLQkJCWVsc2UKLQkJCQlpZiBbICJYJHByb3h5bmV3IiA9ICJYIiBdOyB0aGVuCi0JCQkJCXByb3h5bmV3PSIkcGFydCIKLQkJCQllbHNlCi0JCQkJCXByb3h5bmV3PSIkcHJveHluZXcsJHBhcnQiCi0JCQkJZmkKLQkJCWZpCi0JCWRvbmUKLQkJcHJveHk9JHByb3h5bmV3Ci0JZmkgCi0JS2VjaG8gc3NoX3ZlbmNyeXB0X3Byb3h5PSRzc2hfdmVuY3J5cHRfcHJveHkKLQotCSMgbm90ZSB0aGF0IHVzZXIgbXVzdCBzdXBwbHkgaHR0cDovLyBmb3Igd2ViIHByb3h5IGluIFNTSCBhbmQgU1NIK1NTTC4KLQkjIE5vIHh4eHg6Ly8gaW1wbGllcyBzc2ggc2VydmVyK3BvcnQuCi0JIwotCWlmIGVjaG8gIiRwcm94eSIgfCBlZ3JlcCAnKGh0dHB8aHR0cHN8c29ja3N8c29ja3M0fHNvY2tzNSk6Ly8nID4gL2Rldi9udWxsOyB0aGVuCi0JCSMgSGFuZGxlIFdlYiBvciBTT0NLUyBwcm94eShpZXMpIGZvciB0aGUgaW5pdGlhbCBjb25uZWN0LgotCQlLZWNobyBob3N0PSRob3N0Ci0JCUtlY2hvIHBvcnQ9JHBvcnQKLQkJcHByb3h5PSIiCi0JCXNwcm94eTE9IiIKLQkJc3Byb3h5X3Jlc3Q9IiIKLQkJZm9yIHBhcnQgaW4gYGVjaG8gIiRwcm94eSIgfCB0ciAnLCcgJyAnYAotCQlkbwotCQkJS2VjaG8gcHJveHlfcGFydD0kcGFydAotCQkJaWYgWyAiWCRwYXJ0IiA9ICJYIiBdOyB0aGVuCi0JCQkJY29udGludWUKLQkJCWVsaWYgZWNobyAiJHBhcnQiIHwgZWdyZXAgLWkgJ14oaHR0cHxodHRwc3xzb2Nrc3xzb2NrczR8c29ja3M1KTovLycgPiAvZGV2L251bGw7IHRoZW4KLQkJCQlwcHJveHk9IiRwcHJveHksJHBhcnQiCi0JCQllbHNlCi0JCQkJaWYgWyAiWCRzcHJveHkxIiA9ICJYIiBdOyB0aGVuCi0JCQkJCXNwcm94eTE9IiRwYXJ0IgotCQkJCWVsc2UKLQkJCQkJc3Byb3h5X3Jlc3Q9IiRzcHJveHlfcmVzdCwkcGFydCIKLQkJCQlmaQotCQkJZmkKLQkJZG9uZQotCQlwcHJveHk9YGVjaG8gIiRwcHJveHkiIHwgc2VkIC1lICdzL14sLCovLycgLWUgJ3MvLCwqLywvZydgCi0JCXNwcm94eV9yZXN0PWBlY2hvICIkc3Byb3h5X3Jlc3QiIHwgc2VkIC1lICdzL14sLCovLycgLWUgJ3MvLCwqLywvZydgCi0KLQkJS2VjaG8gcHByb3h5PSRwcHJveHkKLQkJS2VjaG8gc3Byb3h5MT0kc3Byb3h5MQotCQlLZWNobyBzcHJveHlfcmVzdD0kc3Byb3h5X3Jlc3QKLQotCQlzcHJveHkxX2hvc3Q9IiIKLQkJc3Byb3h5MV9wb3J0PSIiCi0JCXNwcm94eTFfdXNlcj0iIgotCi0JCWlmIFsgIlgkc3Byb3h5MSIgIT0gIlgiIF07IHRoZW4KLQkJCXNwcm94eTFfaG9zdD1gZWNobyAiJHNwcm94eTEiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi0JCQlzcHJveHkxX3VzZXI9YGVjaG8gIiRzcHJveHkxX2hvc3QiIHwgYXdrIC1GQCAne3ByaW50ICQxfSdgCi0JCQlzcHJveHkxX2hvc3Q9YGVjaG8gIiRzcHJveHkxX2hvc3QiIHwgYXdrIC1GQCAne3ByaW50ICQyfSdgCi0JCQlpZiBbICJYJHNwcm94eTFfaG9zdCIgPSAiWCIgXTsgdGhlbgotCQkJCXNwcm94eTFfaG9zdD0kc3Byb3h5MV91c2VyCi0JCQkJc3Byb3h5MV91c2VyPSIiCi0JCQllbHNlCi0JCQkJc3Byb3h5MV91c2VyPSIke3Nwcm94eTFfdXNlcn1AIgotCQkJZmkKLQkJCXNwcm94eTFfcG9ydD1gZWNobyAiJHNwcm94eTEiIHwgYXdrIC1GOiAne3ByaW50ICQyfSdgCi0JCQlpZiBbICJYJHNwcm94eTFfcG9ydCIgPSAiWCIgXTsgdGhlbgotCQkJCXNwcm94eTFfcG9ydD0iMjIiCi0JCQlmaQotCQllbHNlCi0JCQlzcHJveHkxX2hvc3Q9YGVjaG8gIiRob3N0IiB8IGF3ayAtRjogJ3twcmludCAkMX0nYAotCQkJc3Byb3h5MV91c2VyPWBlY2hvICIkc3Byb3h5MV9ob3N0IiB8IGF3ayAtRkAgJ3twcmludCAkMX0nYAotCQkJc3Byb3h5MV9ob3N0PWBlY2hvICIkc3Byb3h5MV9ob3N0IiB8IGF3ayAtRkAgJ3twcmludCAkMn0nYAotCQkJaWYgWyAiWCRzcHJveHkxX2hvc3QiID0gIlgiIF07IHRoZW4KLQkJCQlzcHJveHkxX2hvc3Q9JHNwcm94eTFfdXNlcgotCQkJCXNwcm94eTFfdXNlcj0iIgotCQkJZWxzZQotCQkJCXNwcm94eTFfdXNlcj0iJHtzcHJveHkxX3VzZXJ9QCIKLQkJCWZpCi0JCQlzcHJveHkxX3BvcnQ9YGVjaG8gIiRob3N0IiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotCQkJaWYgWyAiWCRzcHJveHkxX3BvcnQiID0gIlgiIF07IHRoZW4KLQkJCQlzcHJveHkxX3BvcnQ9IjIyIgotCQkJZmkKLQkJZmkKLQotCQlLZWNobyBzcHJveHkxX2hvc3Q9JHNwcm94eTFfaG9zdAotCQlLZWNobyBzcHJveHkxX3BvcnQ9JHNwcm94eTFfcG9ydAotCQlLZWNobyBzcHJveHkxX3VzZXI9JHNwcm94eTFfdXNlcgotCi0JCXB0bXA9Ii90bXAvc3Nfdm5jdmlld2VyX3NzaCR7UkFORE9NfS4kJC5wbCIKLQkJcHRtcD1gbXl0bXAgIiRwdG1wImAKLQkJUFBST1hZX1JFTU9WRT0xOyBleHBvcnQgUFBST1hZX1JFTU9WRQotCQlwcm94eT0kcHByb3h5Ci0JCXBvcnRfc2F2ZT0kcG9ydAotCQlob3N0X3NhdmU9JGhvc3QKLQkJaWYgWyAiWCRzcHJveHkxX2hvc3QiICE9ICJYIiBdOyB0aGVuCi0JCQlob3N0PSRzcHJveHkxX2hvc3QKLQkJZmkKLQkJaWYgWyAiWCRzcHJveHkxX3BvcnQiICE9ICJYIiBdOyB0aGVuCi0JCQlwb3J0PSRzcHJveHkxX3BvcnQKLQkJZmkKLQkJaG9zdD1gZWNobyAiJGhvc3QiIHwgc2VkIC1lICdzL14uKkAvLydgCi0JCXBvcnQ9YGVjaG8gIiRwb3J0IiB8IHNlZCAtZSAncy9eLio6Ly8nYAotCQlwY29kZSAiJHB0bXAiCi0JCXBvcnQ9JHBvcnRfc2F2ZQotCQlob3N0PSRob3N0X3NhdmUKLQotCQluZD1gZmluZGZyZWUgNjYwMGAKLQkJUFBST1hZX0xJU1RFTj0kbmQ7IGV4cG9ydCBQUFJPWFlfTElTVEVOCi0JCSMgWFhYIG5vIHJldmVyc2UgZm9yZXZlciBQUFJPWFlfTE9PUF9USFlTRUxGIC4uLgotCQkkcHRtcCAmCi0JCXNsZWVwIDEKLQkJaWYgWyAiWCRzc2hfTkhBRkwiICE9ICJYIiAtYSAiWCRkaWRfc3NoX05IQUZMIiAhPSAiWDEiIF07IHRoZW4KLQkJCU5IQUZMX3dhcm5pbmcKLQkJCXNzaF9hcmdzPSIkc3NoX2FyZ3MgJHNzaF9OSEFGTCIKLQkJCWRpZF9zc2hfTkhBRkw9MQotCQlmaQotCQlzbGVlcCAxCi0JCWlmIFsgIlgkc3Byb3h5MSIgPSAiWCIgXTsgdGhlbgotCQkJdT0iIgotCQkJaWYgZWNobyAiJGhvc3QiIHwgZ3JlcCAnQCcgPiAvZGV2L251bGw7IHRoZW4KLQkJCQl1PWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvQC4qJC9ALydgCi0JCQlmaQotCQkJCi0JCQlwcm94eT0iJHt1fSRsb2NhbGhvc3Q6JG5kIgotCQllbHNlCi0JCQlwcm94eT0iJHtzcHJveHkxX3VzZXJ9JGxvY2FsaG9zdDokbmQiCi0JCWZpCi0JCWxvY2FsaG9zdF9leHRyYT0iLjIiCi0JCWlmIFsgIlgkc3Byb3h5X3Jlc3QiICE9ICJYIiBdOyB0aGVuCi0JCQlwcm94eT0iJHByb3h5LCRzcHJveHlfcmVzdCIKLQkJZmkKLQkJS2VjaG8gcHJveHk9JHByb3h5Ci0JZmkKLQotCWlmIGVjaG8gIiRwcm94eSIgfCBncmVwICIsIiA+IC9kZXYvbnVsbDsgdGhlbgotCi0JCXByb3h5MT1gZWNobyAiJHByb3h5IiB8IGF3ayAtRiwgJ3twcmludCAkMX0nYAotCQlwcm94eTI9YGVjaG8gIiRwcm94eSIgfCBhd2sgLUYsICd7cHJpbnQgJDJ9J2AKLQotCQkjIHVzZXIxQGd3MS5jb206cG9ydDEsdXNlcjJAd3MyOnBvcnQyCi0JCXNzaF9ob3N0MT1gZWNobyAiJHByb3h5MSIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J2AKLQkJc3NoX3BvcnQxPWBlY2hvICIkcHJveHkxIiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotCQlpZiBbICJYJHNzaF9wb3J0MSIgIT0gIlgiIF07IHRoZW4KLQkJCXNzaF9wb3J0MT0iLXAgJHNzaF9wb3J0MSIKLQkJZmkKLQkJc3NoX2hvc3QyPWBlY2hvICIkcHJveHkyIiB8IGF3ayAtRjogJ3twcmludCAkMX0nYAotCQlzc2hfdXNlcjI9YGVjaG8gIiRzc2hfaG9zdDIiIHwgYXdrIC1GQCAne3ByaW50ICQxfSdgCi0JCXNzaF9ob3N0Mj1gZWNobyAiJHNzaF9ob3N0MiIgfCBhd2sgLUZAICd7cHJpbnQgJDJ9J2AKLQkJaWYgWyAiWCRzc2hfaG9zdDIiID0gIlgiIF07IHRoZW4KLQkJCXNzaF9ob3N0Mj0kc3NoX3VzZXIyCi0JCQlzc2hfdXNlcjI9IiIKLQkJZWxzZQotCQkJc3NoX3VzZXIyPSIke3NzaF91c2VyMn1AIgotCQlmaQotCQlzc2hfcG9ydDI9YGVjaG8gIiRwcm94eTIiIHwgYXdrIC1GOiAne3ByaW50ICQyfSdgCi0JCWlmIFsgIlgkc3NoX3BvcnQyIiA9ICJYIiBdOyB0aGVuCi0JCQlzc2hfcG9ydDI9IjIyIgotCQlmaQotCQlwcm94cG9ydD1gZmluZGZyZWUgMzUwMGAKLQkJaWYgWyAiWCRzc2hfTkhBRkwiICE9ICJYIiAtYSAiWCRkaWRfc3NoX05IQUZMIiAhPSAiWDEiIF07IHRoZW4KLQkJCU5IQUZMX3dhcm5pbmcKLQkJCWRpZF9zc2hfTkhBRkw9MQotCQkJc2xlZXAgMQotCQlmaQotCQllY2hvCi0JCWVjaG8gIlJ1bm5pbmcgMXN0IHNzaCBwcm94eToiCi0JCXVraGY9IiIKLQkJaWYgWyAiWCRzc2hfVUtIRiIgIT0gIlgiIF07IHRoZW4gCi0JCQl1a2hmPSIkc3NoX1VLSEYkbG9jYWxob3N0X2V4dHJhIgotCQlmaQotCQlpZiBlY2hvICIkc3NoX2hvc3QxIiB8IGdyZXAgJyUnID4gL2Rldi9udWxsOyB0aGVuCi0JCQl1YXRoPWBzcGFjZV9leHBhbmQgIiRzc2hfaG9zdDEiYAotCQllbHNlCi0JCQl1YXRoPSIkc3NoX2hvc3QxIgotCQlmaQotCQllY2hvICIkc3NoIC1mIC14ICRzc2hfcG9ydDEgJHRhcmcgLWUgbm9uZSAkc3NoX05IQUZMICR1a2hmIC1MICRwcm94cG9ydDokc3NoX2hvc3QyOiRzc2hfcG9ydDIgXCIkdWF0aFwiIFwic2xlZXAgMzBcIiIKLQkJZWNobyAiIgotCQkgICAgICAkc3NoIC1mIC14ICRzc2hfcG9ydDEgJHRhcmcgLWUgbm9uZSAkc3NoX05IQUZMICR1a2hmIC1MICRwcm94cG9ydDokc3NoX2hvc3QyOiRzc2hfcG9ydDIgIiR1YXRoIiAic2xlZXAgMzAiCi0JCXNzaF9hcmdzPSIkc3NoX2FyZ3MgJHNzaF9OSEFGTCIKLQkJc2xlZXAgMQotCQlzdHR5IHNhbmUKLQkJcHJveHk9IiR7c3NoX3VzZXIyfSRsb2NhbGhvc3Q6JHByb3hwb3J0IgotCWZpCi0KLQlpZiBbICJYJHByb3h5IiAhPSAiWCIgXTsgdGhlbgotCQlzc2hfcG9ydD1gZWNobyAiJHByb3h5IiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotCQlpZiBbICJYJHNzaF9wb3J0IiA9ICJYIiBdOyB0aGVuCi0JCQlzc2hfcG9ydD0iMjIiCi0JCWZpCi0JCXNzaF9ob3N0PWBlY2hvICIkcHJveHkiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCi0JCXZuY19ob3N0PSIkaG9zdCIKLQlmaQotCi0JZWNobyAiIgotCWVjaG8gIlJ1bm5pbmcgc3NoOiIKLQlzej1gZWNobyAiJHNzaF9jbWQiIHwgd2MgLWNgCi0JaWYgWyAiJHN6IiAtZ3QgMzAwIF07IHRoZW4KLQkJaW5mbz0iLi4uIgotCWVsc2UKLQkJaW5mbz0iJHNzaF9jbWQiCi0JZmkKLQotCUM9IiIKLQlpZiBbICJYJFNTX1ZOQ1ZJRVdFUl9VU0VfQyIgIT0gIlgiIF07IHRoZW4KLQkJQz0iLUMiCi0JZmkKLQotCWdldHBvcnQ9IiIKLQl0ZWVwb3J0PSIiCi0JaWYgZWNobyAiJHNzaF9jbWQiIHwgZWdyZXAgIihQT1JUPXxQPSkgIiA+IC9kZXYvbnVsbDsgdGhlbgotCQlnZXRwb3J0PTEKLQkJaWYgZWNobyAiJHNzaF9jbWQiIHwgZWdyZXAgIlA9ICIgPiAvZGV2L251bGw7IHRoZW4KLQkJCXRlZXBvcnQ9MQotCQlmaQotCi0JCVBPUlQ9IiIKLQkJc3NoX2NtZD1gZWNobyAiJHNzaF9jbWQiIHwgc2VkIC1lICdzL1BPUlQ9WyAJXSovLycgLWUgJ3MvUD0vLydgCi0JCVNTVk5DX05PX0VOQ19XQVJOPTEKLQkJaWYgWyAiWCR1c2Vfc3Noc3NsIiA9ICJYIiBdOyB0aGVuCi0JCQlkaXJlY3RfY29ubmVjdD0xCi0JCWZpCi0JZmkKLQlpZiBbICJYJGdldHBvcnQiICE9ICJYIiBdOyB0aGVuCi0JCXNzaF9yZWRpcj0iLUQgJHt1c2V9IgotCWVsaWYgWyAiWCRyZXZlcnNlIiA9ICJYIiBdOyB0aGVuCi0JCXNzaF9yZWRpcj0iLUwgJHt1c2V9OiR7dm5jX2hvc3R9OiR7cG9ydH0iCi0JZWxzZQotCQlzc2hfcmVkaXI9Ii1SICR7cG9ydH06JHt2bmNfaG9zdH06JHt1c2V9IgotCWZpCi0JcG1hcms9YHNoIC1jICdlY2hvICQkJ2AKLQotCSMgdGhlIC10IG9wdGlvbiBhY3R1YWxseSBzcGVlZHMgdXAgdHlwaW5nIHJlc3BvbnNlIHZpYSBWTkMhIQotCWlmIFsgIlgkc3NoX3BvcnQiID0gIlgyMiIgXTsgdGhlbgotCQlzc2hfcG9ydD0iIgotCWVsc2UKLQkJc3NoX3BvcnQ9Ii1wICRzc2hfcG9ydCIKLQlmaQotCi0JaWYgZWNobyAiJHNzaF9ob3N0IiB8IGdyZXAgJyUnID4gL2Rldi9udWxsOyB0aGVuCi0JCXVhdGg9YHNwYWNlX2V4cGFuZCAiJHNzaF9ob3N0ImAKLQllbHNlCi0JCXVhdGg9IiRzc2hfaG9zdCIKLQlmaQotCWlmIFsgIlgkU1NfVk5DVklFV0VSX1NTSF9PTkxZIiAhPSAiWCIgXTsgdGhlbgotCQllY2hvICIkc3NoIC14ICRzc2hfcG9ydCAkdGFyZyAkQyAkc3NoX2FyZ3MgXCIkdWF0aFwiIFwiJGluZm9cIiIKLQkJZWNobyAiIgotCQkkc3NoIC14ICRzc2hfcG9ydCAkdGFyZyAkQyAkc3NoX2FyZ3MgIiR1YXRoIiAiJHNzaF9jbWQiCi0JCWV4aXQgJD8KLQotCWVsaWYgWyAiWCRTU19WTkNWSUVXRVJfTk9fRiIgIT0gIlgiIF07IHRoZW4KLQkJZWNobyAiJHNzaCAteCAkc3NoX3BvcnQgJHRhcmcgJEMgJHNzaF9yZWRpciAkc3NoX2FyZ3MgXCIkdWF0aFwiIFwiJGluZm9cIiIKLQkJZWNobyAiIgotCQkkc3NoIC14ICRzc2hfcG9ydCAkdGFyZyAkQyAkc3NoX3JlZGlyICRzc2hfYXJncyAiJHVhdGgiICIkc3NoX2NtZCIKLQkJcmM9JD8KLQotCWVsaWYgWyAiWCRnZXRwb3J0IiAhPSAiWCIgXTsgdGhlbgotCQl0cG9ydD0vdG1wL3NzX3ZuY3ZpZXdlcl90cG9ydCR7UkFORE9NfS4kJAotCQl0cG9ydD1gbXl0bXAgIiR0cG9ydCJgCi0JCXRwb3J0Mj0vdG1wL3NzX3ZuY3ZpZXdlcl90cG9ydDIke1JBTkRPTX0uJCQKLQkJdHBvcnQyPWBteXRtcCAiJHRwb3J0MiJgCi0KLQkJaWYgWyAiWCRyc2giICE9ICJYMSIgXTsgdGhlbgotCQkJaWYgZWNobyAiJHNzaF9jbWQiIHwgZ3JlcCAic3VkbyAiID4gL2Rldi9udWxsOyB0aGVuCi0JCQkJZWNobyAiIgotCQkJCWVjaG8gIkluaXRpYWwgc3NoIHdpdGggJ3N1ZG8gaWQnIHRvIHByaW1lIHN1ZG8gc28gaG9wZWZ1bGx5IHRoZSBuZXh0IG9uZSIKLQkJCQllY2hvICJ3aWxsIHJlcXVpcmUgbm8gcGFzc3dvcmQuLi4iCi0JCQkJZWNobyAiIgotCQkJCXRhcmc9Ii10IgotCQkJCSRzc2ggLXggJHNzaF9wb3J0ICR0YXJnICRzc2hfYXJncyAiJHVhdGgiICJzdWRvIGlkOyB0dHkiCi0JCQkJZWNobyAiIgotCQkJZmkKLQkJCWVjaG8gIiRzc2ggLXggLWYgJHNzaF9wb3J0ICR0YXJnICRDICRzc2hfcmVkaXIgJHNzaF9hcmdzIFwiJHVhdGhcIiBcIiRpbmZvXCIiCi0JCQllY2hvICIiCi0JCQkkc3NoIC14IC1mICRzc2hfcG9ydCAkdGFyZyAkQyAkc3NoX3JlZGlyICRzc2hfYXJncyAiJHVhdGgiICIkc3NoX2NtZCIgPiAkdHBvcnQgMj4gJHRwb3J0MgotCQkJaWYgWyAiWCR0ZWVwb3J0IiA9ICJYMSIgXTsgdGhlbgotCQkJCXRhaWwgLWYgJHRwb3J0ICAxPiYyICYKLQkJCQl0YWlsX3BpZD0kIQotCQkJCXRhaWwgLWYgJHRwb3J0MiAxPiYyICYKLQkJCQl0YWlsX3BpZDI9JCEKLQkJCWZpCi0JCQlyYz0kPwotCQllbHNlCi0JCQlyc2hfc2V0dXAKLQkJCWVjaG8gInJzaCAkdWwgXCIkc3NoX2hvc3RcIiBcIiRzc2hfY21kXCIiCi0JCQllY2hvICIiCi0JCQlyc2ggJHVsICIkc3NoX2hvc3QiICIkc3NoX2NtZCIgPiAkdHBvcnQgJgotCQkJc2xlZXAgMQotCQkJcmM9MAotCQlmaQotCi0JCWlmIFsgIlgkU1NWTkNfRVhUUkFfU0xFRVAiICE9ICJYIiBdOyB0aGVuCi0JCQllY2hvICJzbGVlcCAkU1NWTkNfRVhUUkFfU0xFRVAiCi0JCQlzbGVlcCAkU1NWTkNfRVhUUkFfU0xFRVAKLQkJZmkKLQotCQlzdHR5IHNhbmUKLQkJaT0wCi0JCWlmIHR5cGUgcGVybCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQlpbWF4PTUwCi0JCQlzbGVlcGl0PSJwZXJsIC1lICdzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgMC4yMCknIgotCQllbHNlCi0JCQlpbWF4PTEwCi0JCQlzbGVlcGl0PSJzbGVlcCAxIgotCQlmaQotCQl3aGlsZSBbICRpIC1sdCAkaW1heCBdOyBkbwotCQkJI2VjaG8gJHNsZWVwaXQKLQkJCWV2YWwgJHNsZWVwaXQKLQkJCVBPUlQ9YGdyZXAgIl5QT1JUPSIgJHRwb3J0IHwgdHIgJ1xyJyAnICcgfCBoZWFkIC1uIDEgfCBzZWQgLWUgJ3MvUE9SVD0vLycgLWUgJ3MvXHIvL2cnIC1lICdzLyAqJC8vJ2AKLQkJCWlmIGVjaG8gIiRQT1JUIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuCi0JCQkJYnJlYWsKLQkJCWZpCi0JCQl2bnNzPWBzZWQgLWUgJ3MvXHIvL2cnICR0cG9ydCAkdHBvcnQyIHwgZWdyZXAgLWkgJ14oTmV3LiogZGVza3RvcCBpc3xBIFZOQyBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nKS4qOlswLTlbMC05XSokJyB8IGhlYWQgLW4gMSB8IGF3ayAne3ByaW50ICRORn0nYAotCQkJaWYgWyAiWCR2bnNzIiAhPSAiWCIgXTsgdGhlbgotCQkJCVBPUlQ9YGVjaG8gIiR2bnNzIiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotCQkJCWlmIGVjaG8gIiRQT1JUIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuCi0JCQkJCWlmIFsgJFBPUlQgLWx0IDEwMCBdOyB0aGVuCi0JCQkJCQlQT1JUPWBleHByICRQT1JUICsgNTkwMGAKLQkJCQkJZmkKLQkJCQlmaQotCQkJCWlmIGVjaG8gIiRQT1JUIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuCi0JCQkJCXZuc3M9YHNlZCAtZSAncy9cci8vZycgJHRwb3J0IHwgZWdyZXAgLWkgJ14oTmV3LiogZGVza3RvcCBpc3xBIFZOQyBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nKS4qOlswLTlbMC05XSokJyB8IGhlYWQgLW4gMWAKLQkJCQkJZWNobyAidm5jc2VydmVyIHN0cmluZzogJHZuc3MiIDE+JjIKLQkJCQkJYnJlYWsKLQkJCQlmaQotCQkJZmkKLQkJCWk9YGV4cHIgJGkgKyAxYAotCQlkb25lCi0KLQkJZWNobyAiZm91bmQ6IFBPUlQ9JyRQT1JUJyIgMT4mMgotCQlsaDY9IiIKLQkJaWYgWyAiWCRTU1ZOQ19QT1JUX0lQVjYiICE9ICJYIiBdOyB0aGVuCi0JCQlsaDY9MQotCQllbGlmIGVncmVwICdJbmZvOiBsaXN0ZW5pbmcgb24gSVB2NiBvbmx5fEluZm86IGxpc3RlbmluZyBvbmx5IG9uIElQdjYnICR0cG9ydCA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbGg2PTEKLQkJZmkKLQkJaWYgWyAiWCRsaDYiID0gIlgxIiBdOyB0aGVuCi0JCQllY2hvICJzZXQgU09DS1M1IGxvY2FsaG9zdCB0byA6OjEiIDE+JjIKLQkJZmkKLQkJcm0gLWYgJHRwb3J0ICR0cG9ydDIKLQkJaWYgWyAiWCRyc2giID0gIlgxIiBdOyB0aGVuCi0JCQlyc2hfdmlld2VyICIkQCIKLQkJCWV4aXQgJD8KLQkJZmkKLQkJUFBST1hZX1NPQ0tTPTUKLQkJaWYgWyAiWCRTU1ZOQ19TT0NLUzUiICE9ICJYIiBdOyB0aGVuCi0JCQlQUFJPWFlfU09DS1M9NQotCQllbGlmIFsgIlgkU1NWTkNfU09DS1M0IiAhPSAiWCIgXTsgdGhlbgotCQkJUFBST1hZX1NPQ0tTPTEKLQkJZmkKLQkJZXhwb3J0IFBQUk9YWV9TT0NLUwotCQlpZiBbICJYJGxoNiIgPSAiWCIgXTsgdGhlbgotCQkJaG9zdD0iJGxvY2FsaG9zdCIKLQkJZWxzZQotCQkJaG9zdD0iOjoxIgotCQlmaQotCQlwb3J0PSIkUE9SVCIKLQkJcHJveHk9IiRsb2NhbGhvc3Q6JHVzZSIKLQotCWVsc2UKLQkJaWYgWyAiWCRyc2giICE9ICJYMSIgXTsgdGhlbgotCQkJZWNobyAiJHNzaCAteCAtZiAkc3NoX3BvcnQgJHRhcmcgJEMgJHNzaF9yZWRpciAkc3NoX2FyZ3MgXCIkdWF0aFwiIFwiJGluZm9cIiIKLQkJCWVjaG8gIiIKLQkJCSRzc2ggLXggLWYgJHNzaF9wb3J0ICR0YXJnICRDICRzc2hfcmVkaXIgJHNzaF9hcmdzICIkdWF0aCIgIiRzc2hfY21kIgotCQkJcmM9JD8KLQkJZWxzZQotCQkJcnNoX3NldHVwCi0JCQllY2hvICJyc2ggJHVsIFwiJHNzaF9ob3N0XCIgXCIkc3NoX2NtZFwiIgotCQkJZWNobyAiIgotCQkJcnNoICR1bCAiJHNzaF9ob3N0IiAiJHNzaF9jbWQiICYKLQkJCXNsZWVwIDEKLQkJCVBPUlQ9JHBvcnQKLQkJCXJzaF92aWV3ZXIgIiRAIgotCQkJZXhpdCAkPwotCQlmaQotCWZpCi0KLQlpZiBbICIkcmMiICE9ICIwIiBdOyB0aGVuCi0JCWVjaG8gIiIKLQkJZWNobyAic3NoIHRvIFwiJHVhdGhcIiBmYWlsZWQuIgotCQlleGl0IDEKLQlmaQotCXN0dHkgc2FuZQotCi0JYz0wCi0JcHNzaD0iIgotCXdoaWxlIFsgJGMgLWx0IDQwIF0KLQlkbwotCQlwPWBleHByICRwbWFyayArICRjYAotCQlwb3V0PWBwcyAtcCAiJHAiIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiAnXlsgCV0qUElEJyB8IHNlZCAtZSAncy8tTC4qJC8vJyAtZSAncy8teCAuKiQvLydgCi0JCWlmIGVjaG8gIiRwb3V0IiB8IGdyZXAgInNzaCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCWlmIGVjaG8gIiRwb3V0IiB8IGVncmVwIC1pICdzc2guKigtYWRkfC1hZ2VudHwtYXNrfC1rZXlnZW58LWFyZ3YwfHZuYyknID4vZGV2L251bGw7IHRoZW4KLQkJCQk6Ci0JCQllbGlmIGVjaG8gIiRwb3V0IiB8IGVncmVwIC1pICdzY3B8c3NoZCcgPi9kZXYvbnVsbDsgdGhlbgotCQkJCToKLQkJCWVsc2UKLQkJCQlwc3NoPSRwCi0JCQkJYnJlYWsKLQkJCWZpCi0JCWZpCi0JCWM9YGV4cHIgJGMgKyAxYAotCWRvbmUKLQlpZiBbICJYJGdldHBvcnQiICE9ICJYIiBdOyB0aGVuCi0JCToKLQllbGlmIFsgIlgkU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEIiAhPSAiWCIgXSA7IHRoZW4KLQkJc2xlZXAgMgotCWVsaWYgWyAiWCRzc2hfY21kIiA9ICJYc2xlZXAgJHNzaF9zbGVlcCIgXSA7IHRoZW4KLQkJI2VjaG8gVCBzbGVlcCAxCi0JCXNsZWVwIDEKLQllbGlmIGVjaG8gIiRzc2hfY21kIiB8IGdyZXAgJ15zbGVlcCAnID4vZGV2L251bGw7IHRoZW4KLQkJI2VjaG8gVCBzbGVlcCAyCi0JCXNsZWVwIDIKLQllbHNlCi0JCSMgbGV0IGFueSBjb21tYW5kIGdldCBzdGFydGVkIGEgYml0LgotCQkjZWNobyBUIHNsZWVwIDUKLQkJc2xlZXAgNQotCWZpCi0JZWNobyAiIgotCSNyZXNldAotCXN0dHkgc2FuZQotCWlmIFsgIlgkU1NWTkNfRVhUUkFfU0xFRVAiICE9ICJYIiBdOyB0aGVuCi0JCWVjaG8gInNsZWVwICRTU1ZOQ19FWFRSQV9TTEVFUCIKLQkJc2xlZXAgJFNTVk5DX0VYVFJBX1NMRUVQCi0JZmkKLQllY2hvICJzc2hfcGlkPSckcHNzaCciOyBlY2hvCi0JaWYgWyAiWCR1c2Vfc3Noc3NsIiA9ICJYIiAtYSAiWCRnZXRwb3J0IiA9ICJYIiBdOyB0aGVuCi0JCWVjaG8gIlJ1bm5pbmcgdmlld2VyOiIKLQotCQl0cmFwICJmaW5hbCIgMCAyIDE1Ci0JCWlmIFsgIlgkcmV2ZXJzZSIgPSAiWCIgXTsgdGhlbgotCQkJZWNobyAiJFZOQ1ZJRVdFUkNNRCIgIiRAIiAkbG9jYWxob3N0OiROCi0JCQllY2hvICIiCi0JCQkkVk5DVklFV0VSQ01EICIkQCIgJGxvY2FsaG9zdDokTgotCQkJaWYgWyAkPyAhPSAwIF07IHRoZW4KLQkJCQllY2hvICJ2bmN2aWV3ZXIgY29tbWFuZCBmYWlsZWQ6ICQ/IgotCQkJCWlmIFsgIlgkc2Vjb25kdHJ5IiA9ICJYMSIgXTsgdGhlbgotCQkJCQlzbGVlcCAyCi0JCQkJCSRWTkNWSUVXRVJDTUQgIiRAIiAkbG9jYWxob3N0OiROCi0JCQkJZmkKLQkJCWZpCi0JCWVsc2UKLQkJCWVjaG8gIiIKLQkJCWVjaG8gIk5PVEU6IFByZXNzIEN0cmwtQyB0byB0ZXJtaW5hdGUgdmlld2VyIExJU1RFTiBtb2RlLiIKLQkJCWVjaG8gIiIKLQkJCU4yPSROCi0JCQlpZiBbICJYJFZOQ1ZJRVdFUl9JU19SRUFMVk5DNCIgPSAiWDEiIF07IHRoZW4KLQkJCQlOMj1gZWNobyAiJE4yIiB8IHNlZCAtZSAncy86Ly9nJ2AKLQkJCQlpZiBbICROMiAtbGUgMjAwIF07IHRoZW4KLQkJCQkJTjI9YGV4cHIgJE4yICsgNTUwMGAKLQkJCQlmaQotCQkJZmkKLQkJCWVjaG8gIiRWTkNWSUVXRVJDTUQiICIkQCIgLWxpc3RlbiAkTjIKLQkJCWVjaG8gIiIKLQkJCSRWTkNWSUVXRVJDTUQgIiRAIiAtbGlzdGVuICROMgotCQlmaQotCi0JCWV4aXQgJD8KLQllbHNlCi0JCXVzZTI9YGZpbmRmcmVlIDU5NjBgCi0JCWhvc3QwPSRob3N0Ci0JCXBvcnQwPSRwb3J0Ci0JCWhvc3Q9JGxvY2FsaG9zdAotCQlwb3J0PSR1c2UKLQkJdXNlPSR1c2UyCi0JCU49YGV4cHIgJHVzZSAtIDU5MDBgCi0JCWlmIFsgIlgkZ2V0cG9ydCIgIT0gIlgiIF07IHRoZW4KLQkJCWhvc3Q9IiRob3N0MCIKLQkJCXBvcnQ9IiRwb3J0MCIKLQkJZWxzZQotCQkJcHJveHk9IiIKLQkJZmkKLQkJaWYgWyAiWCRzc2hfdmVuY3J5cHRfcHJveHkiICE9ICJYIiBdOyB0aGVuCi0JCQlzc2hfdmVuY3J5cHRfcHJveHk9InZlbmNyeXB0Oi8vJGhvc3Q6JHBvcnQiCi0JCQlpZiBbICJYJHByb3h5IiA9ICJYIiBdOyB0aGVuCi0JCQkJcHJveHk9JHNzaF92ZW5jcnlwdF9wcm94eQotCQkJZWxzZQotCQkJCXByb3h5PSIkcHJveHksJHNzaF92ZW5jcnlwdF9wcm94eSIKLQkJCWZpCi0JCQlLZWNobyAicHJveHlfbm93PSRwcm94eSIKLQkJCXVuc2V0IFBQUk9YWV9MSVNURU4KLQkJZmkKLQlmaQotZmkKLQotaWYgWyAiWCRzdHVubmVsX3NldF9oZXJlIiA9ICJYMSIgLWEgIlgkc2hvd2NlcnQiID0gIlgiIF07IHRoZW4KLQlpZiB0eXBlICRTVFVOTkVMID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJOgotCWVsc2UKLQkJZWNobyAiIgotCQllY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCi0JCWVjaG8gIioqIFByb2JsZW0gZmluZGluZyB0aGUgU3R1bm5lbCBjb21tYW5kICckU1RVTk5FTCc6ICoqIgotCQllY2hvICIiCi0JCXR5cGUgJFNUVU5ORUwKLQkJZWNobyAiIgotCQllY2hvICIqKiBQZXJoYXBzIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIHN0dW5uZWwvc3R1bm5lbDQgcGFja2FnZS4gKioiCi0JCWVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKLQkJZWNobyAiIgotCQlzbGVlcCA1Ci0JZmkKLWZpCi0KLSMgY3JlYXRlIHRoZSBzdHVubmVsIGNvbmZpZyBmaWxlOgotaWYgWyAiWCR2ZXJpZnkiICE9ICJYIiBdOyB0aGVuCi0JaWYgWyAtZCAkdmVyaWZ5IF07IHRoZW4KLQkJdmVyaWZ5PSJDQXBhdGggPSAkdmVyaWZ5IgotCWVsc2UKLQkJdmVyaWZ5PSJDQWZpbGUgPSAkdmVyaWZ5IgotCWZpCi0JdmVyaWZ5PSIkdmVyaWZ5Ci12ZXJpZnkgPSAyIgotZmkKLWlmIFsgIlgkU1NWTkNfU1RVTk5FTF9WRVJJRlkzIiAhPSAiWCIgXTsgdGhlbgotCXZlcmlmeT1gZWNobyAiJHZlcmlmeSIgfCBzZWQgLWUgJ3MvdmVyaWZ5ID0gMi92ZXJpZnkgPSAzLydgCi1maQotaWYgWyAiWCRteWNlcnQiICE9ICJYIiBdOyB0aGVuCi0JY2VydD0iY2VydCA9ICRteWNlcnQiCi1maQotaWYgWyAiWCRjcmwiICE9ICJYIiBdOyB0aGVuCi0JaWYgWyAtZCAkY3JsIF07IHRoZW4KLQkJY3JsPSJDUkxwYXRoID0gJGNybCIKLQllbHNlCi0JCWNybD0iQ1JMZmlsZSA9ICRjcmwiCi0JZmkKLWZpCi0KLWlmIFsgIlgkc2hvd2NlcnQiID0gIlgxIiBdOyB0aGVuCi0JaWYgWyAiWCRoYXZlX3V2bmNfZHNtX2hlbHBlcl9zaG93Y2VydCIgPSAiWDEiIF07IHRoZW4KLQkJOgotCWVsaWYgWyAiWCRTU1ZOQ19OT19JUFY2X1BST1hZIiAhPSAiWCIgXTsgdGhlbgotCQk6Ci0JZWxpZiBbICJYJGlwdjYiID0gIlgxIiAtYSAiWCRwcm94eSIgPSAiWCIgXTsgdGhlbgotCQlwcm94eT0iaXB2NjovLyRob3N0OiRwb3J0IgotCWZpCi1maQotCi1pZiBbICJYJGRpcmVjdF9jb25uZWN0IiAhPSAiWCIgLWEgIlgkU1RVTk5FTF9MSVNURU4iICE9ICJYIiBdOyB0aGVuCi0JcHJveHk9cmV2ZXJzZV9kaXJlY3QKLWZpCi0KLXB0bXA9IiIKLWlmIFsgIlgkcHJveHkiICE9ICJYIiBdOyB0aGVuCi0JcHRtcD0iL3RtcC9zc192bmN2aWV3ZXIke1JBTkRPTX0uJCQucGwiCi0JcHRtcD1gbXl0bXAgIiRwdG1wImAKLQlQUFJPWFlfUkVNT1ZFPTE7IGV4cG9ydCBQUFJPWFlfUkVNT1ZFCi0JcGNvZGUgIiRwdG1wIgotCWlmIFsgIlgkc2hvd2NlcnQiICE9ICJYMSIgLWEgIlgkZGlyZWN0X2Nvbm5lY3QiID0gIlgiIF07IHRoZW4KLQkJaWYgdW5hbWUgfCBlZ3JlcCAnRGFyd2lufFN1bk9TJyA+L2Rldi9udWxsOyB0aGVuCi0JCQl2b3V0PWBlY2hvICIkcHJveHkiIHwgZ3JlcCAtaSB2ZW5jcnlwdGAKLQkJCWlmIFsgIlgkdm91dCIgIT0gIlgiIC1hICJYJHJldmVyc2UiID0gIlgxIiBdOyB0aGVuCi0JCQkJIyBuZWVkIHRvIGV4ZWMgZm9yIHJldmVyc2UgdmVuY3J5cHQKLQkJCQljb25uZWN0PSJleGVjID0gJHB0bXAiCi0JCQllbHNlCi0JCQkJIyBvbiBtYWMgYW5kIHNvbGFyaXMgd2UgbmVlZCB0byBsaXN0ZW4gb24gc29ja2V0IGluc3RlYWQgb2Ygc3RkaW86Ci0JCQkJbmQ9YGZpbmRmcmVlIDY3MDBgCi0JCQkJUFBST1hZX0xJU1RFTj0kbmQKLQkJCQlleHBvcnQgUFBST1hZX0xJU1RFTgotCQkJCWlmIFsgIlgkcmV2ZXJzZSIgPSAiWCIgXTsgdGhlbgotCQkJCQkkcHRtcCAmCi0JCQkJZmkKLQkJCQlzbGVlcCAyCi0JCQkJaG9zdD0iJGxvY2FsaG9zdCIKLQkJCQlwb3J0PSIkbmQiCi0JCQkJY29ubmVjdD0iY29ubmVjdCA9ICRsb2NhbGhvc3Q6JG5kIgotCQkJZmkKLQkJZWxzZQotCQkJIyBvdGhlcndpc2Ugb24gdW5peCB3ZSBjYW4gZXhlYyBpdDoKLQkJCWNvbm5lY3Q9ImV4ZWMgPSAkcHRtcCIKLQkJZmkKLQllbHNlCi0JCWNvbm5lY3Q9ImV4ZWMgPSAkcHRtcCIKLQlmaQotZWxzZQotCWNvbm5lY3Q9ImNvbm5lY3QgPSAkaG9zdDokcG9ydCIKLWZpCi0KLSMgaGFuZGxlIHNob3djZXJ0IGNhc2U6Ci0jCi1pZiBbICJYJHNob3djZXJ0IiA9ICJYMSIgXTsgdGhlbgotCWlmIFsgIlgkcHJveHkiICE9ICJYIiBdOyB0aGVuCi0JCVBQUk9YWV9MSVNURU49JHVzZQotCQlleHBvcnQgUFBST1hZX0xJU1RFTgotCQlpZiBbICJYJFNTX0RFQlVHIiAhPSAiWCIgXTsgdGhlbgotCQkJJHB0bXAgJgotCQllbHNlCi0JCQkkcHRtcCAyPi9kZXYvbnVsbCAmCi0JCWZpCi0JCXNsZWVwIDEKLQkJbW9yZV9zbGVlcD0xCi0JCWlmIHVuYW1lIHwgZ3JlcCBMaW51eCA+IC9kZXYvbnVsbDsgdGhlbgotCQkJaWYgbmV0c3RhdCAtYW50IHwgZ3JlcCBMSVNURU4gfCBncmVwICIxMjcuMC4wLjE6JHVzZSIgPiAvZGV2L251bGw7IHRoZW4KLQkJCQltb3JlX3NsZWVwPSIiCi0JCQlmaQotCQllbGlmIHVuYW1lIHwgZ3JlcCBTdW5PUyA+IC9kZXYvbnVsbDsgdGhlbgotCQkJaWYgbmV0c3RhdCAtYW4gLWYgaW5ldCAtUCB0Y3AgfCBncmVwIExJU1RFTiB8IGdyZXAgIjEyNy4wLjAuMS4kdXNlIiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJCW1vcmVfc2xlZXA9IiIKLQkJCWZpCi0JCWVsaWYgdW5hbWUgfCBlZ3JlcCAtaSAnYnNkfGRhcndpbicgPiAvZGV2L251bGw7IHRoZW4KLQkJCWlmIG5ldHN0YXQgLWFudCAtZiBpbmV0IHwgZ3JlcCBMSVNURU4gfCBncmVwICIxMjcuMC4wLjEuJHVzZSIgPiAvZGV2L251bGw7IHRoZW4KLQkJCQltb3JlX3NsZWVwPSIiCi0JCQlmaQotCQlmaQotCQlpZiBbICJYJG1vcmVfc2xlZXAiID0gIlgxIiBdOyB0aGVuCi0JCQlzbGVlcCAxCi0JCWZpCi0JCWhvc3Q9IiRsb2NhbGhvc3QiCi0JCXBvcnQ9IiR1c2UiCi0JZmkKLQljaXBoZXJfYXJncz0iIgotCWlmIFsgIlgkY2lwaGVycyIgIT0gIlgiIF07IHRoZW4KLQkJY2lwaGVyX2FyZ3M9YGVjaG8gIiRjaXBoZXJzIiB8IHNlZCAtZSAncy9jaXBoZXJzPS8tY2lwaGVyIC8nYAotCWZpCi0JaWYgWyAiWCRoYXZlX3V2bmNfZHNtX2hlbHBlcl9zaG93Y2VydCIgPSAiWDEiIF07IHRoZW4KLQkJOgotCWVsaWYgdHlwZSBvcGVuc3NsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJOgotCWVsc2UKLQkJZWNobyAiIgotCQllY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKLQkJZWNobyAiKiogUHJvYmxlbSBmaW5kaW5nIHRoZSBPcGVuU1NMIGNvbW1hbmQgJ29wZW5zc2wnOiAqKiIgCi0JCWVjaG8gIiIKLQkJdHlwZSBvcGVuc3NsIDI+JjEKLQkJZWNobyAiIgotCQllY2hvICIqKiBQZXJoYXBzIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlICdvcGVuc3NsJyBwYWNrYWdlLiAqKiIKLQkJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCi0JCWVjaG8gIiIKLQlmaQotCSNlY2hvICJvcGVuc3NsIHNfY2xpZW50ICRjaXBoZXJfYXJncyAtY29ubmVjdCAkaG9zdDokcG9ydCIgCi0JaWYgWyAiWCRyZXZlcnNlIiA9ICJYIiBdOyB0aGVuCi0JCWlmIHR5cGUgaG9zdCA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQkJaG9zdCAkaG9zdCA+L2Rldi9udWxsIDI+JjEKLQkJCWhvc3QgJGhvc3QgPi9kZXYvbnVsbCAyPiYxCi0JCWZpCi0JCXRpbWVvdXQ9MTUKLQkJaWYgWyAiWCRTU1ZOQ19GRVRDSF9USU1FT1VUIiAhPSAiWCIgXTsgdGhlbgotCQkJdGltZW91dD0kU1NWTkNfRkVUQ0hfVElNRU9VVAotCQlmaQotCQlpZiBbICJYJGhhdmVfdXZuY19kc21faGVscGVyX3Nob3djZXJ0IiA9ICJYMSIgXTsgdGhlbgotCQkJaWYgdHlwZSBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCQkoc2xlZXAgJHRpbWVvdXQ7IGlmIGtpbGwgLTAgJCQ7IHRoZW4gcGtpbGwgLVRFUk0gLWYgInVsdHJhdm5jX2RzbV9oZWxwZXIuKiRob3N0LiokcG9ydCI7IGZpKSA+L2Rldi9udWxsIDI+JjEgJgotCQkJZmkKLQkJCXVsdHJhdm5jX2RzbV9oZWxwZXIgc2hvd2NlcnQgJGhvc3Q6JHBvcnQgMj4mMQotCQllbHNlCi0JCQlpZiB0eXBlIHBraWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJCShzbGVlcCAkdGltZW91dDsgaWYga2lsbCAtMCAkJDsgdGhlbiBwa2lsbCAtVEVSTSAtZiAib3BlbnNzbC4qc19jbGllbnQuKiRob3N0LiokcG9ydCI7IGZpKSA+L2Rldi9udWxsIDI+JjEgJgotCQkJZmkKLQkJCW9wZW5zc2wgc19jbGllbnQgJGNpcGhlcl9hcmdzIC1wcmV4aXQgLWNvbm5lY3QgJGhvc3Q6JHBvcnQgMj4mMSA8IC9kZXYvbnVsbAotCQlmaQotCQlyYz0kPwotCWVsc2UKLQkJdGNlcnQ9IiIKLQkJaWYgWyAiWCRteWNlcnQiID0gIlgiIF07IHRoZW4KLQkJCXRjZXJ0PWBtYWtlX3RjZXJ0YAotCQkJY2VydF9hcmdzPSItY2VydCAkdGNlcnQgLUNBZmlsZSAkdGNlcnQiCi0JCWVsc2UKLQkJCWNlcnRfYXJncz0iLWNlcnQgJG15Y2VydCAtQ0FmaWxlICRteWNlcnQiCi0JCWZpCi0JCXRtcF9vdXQ9L3RtcC9zaG93Y2VydF9vdXQke1JBTkRPTX0uJCQKLQkJdG1wX291dD1gbXl0bXAgIiR0bXBfb3V0ImAKLQkJdG1wX2Vycj0vdG1wL3Nob3djZXJ0X2VyciR7UkFORE9NfS4kJAotCQl0bXBfZXJyPWBteXRtcCAiJHRtcF9lcnIiYAotCi0JCSNlY2hvICJvcGVuc3NsIHNfc2VydmVyICRjaXBoZXJfYXJncyAkY2VydF9hcmdzIC1hY2NlcHQgJHBvcnQgLXZlcmlmeSAyID4gJHRtcF9vdXQgMj4gJHRtcF9lcnIiIDE+JjIKLQotCQkjIGFzc3VtZSB3ZSBoYXZlIHBlcmw6Ci0JCWNoZWNrX3BlcmwgcGVybAotCi0JCXBlcmwgLWUgIgotCQkJXCRwID0gb3BlbihPLCBcInxvcGVuc3NsIHNfc2VydmVyICRjaXBoZXJfYXJncyAkY2VydF9hcmdzIC1hY2NlcHQgJHBvcnQgLXZlcmlmeSAyIDE+JHRtcF9vdXQgMj4gJHRtcF9lcnJcIik7Ci0JCQlleGl0IDEgdW5sZXNzIFwkcDsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJc2xlZXAgMTsKLQkJCQlpZiAoIW9wZW4oRiwgXCI8JHRtcF9vdXRcIikpIHsKLQkJCQkJa2lsbCBcJHA7Ci0JCQkJCWV4aXQgMTsKLQkJCQl9Ci0JCQkJd2hpbGUgKDxGPikgewotCQkJCQlpZiAoL1JGQiAwMC8pIHsKLQkJCQkJCWZzbGVlcCgwLjI1KTsKLQkJCQkJCXByaW50IE8gXCJSRkIgMDAwLjAwMFxcblwiOwotCQkJCQkJZnNsZWVwKDEuMDApOwotCQkJCQkJa2lsbCBcJHA7Ci0JCQkJCQlmc2xlZXAoMC4yNSk7Ci0JCQkJCQlleGl0IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2xvc2UgRjsKLQkJCX0KLQkJCXN1YiBmc2xlZXAgewotCQkJCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCBzaGlmdCk7Ci0JCQl9Ci0JCSI7Ci0KLQkJZWNobyAiIgotCQljYXQgJHRtcF9vdXQKLQkJZWNobyAiIgotCQllY2hvICItLS0tMi0tLS0iCi0JCWNhdCAkdG1wX2VycgotCQlpZiBncmVwIEJFR0lOLkNFUlRJRklDQVRFICR0bXBfb3V0ID4vZGV2L251bGw7IHRoZW4KLQkJCXJjPTAKLQkJZWxzZQotCQkJcmM9MQotCQlmaQotCi0JCXJtIC1mICR0bXBfb3V0ICR0bXBfZXJyCi0JZmkKLQlpZiBbICJYJFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSIgIT0gIlgiIF07IHRoZW4KLQkJcm0gLWYgJFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRQotCWZpCi0JaWYgWyAiWCRTU1ZOQ19TSE9XQ0VSVF9FWElUXzAiID0gIlgxIiBdOyB0aGVuCi0JCWV4aXQgMAotCWVsc2UKLQkJZXhpdCAkcmMKLQlmaQotZmkKLQotIyBoYW5kbGUgZGlyZWN0IGNvbm5lY3QgY2FzZToKLSMKLWlmIFsgIlgkZGlyZWN0X2Nvbm5lY3QiICE9ICJYIiBdOyB0aGVuCi0JaWYgWyAiWCRTU1ZOQ19VTFRSQV9EU00iICE9ICJYIiBdOyB0aGVuCi0JCVNTVk5DX05PX0VOQ19XQVJOPTEKLQkJZWNobyAiIgotCQllY2hvICJVc2luZyBVbHRyYVZOQyBEU00gUGx1Z2luIGtleSBmb3IgZW5jcnlwdGlvbjoiCi0JCWVjaG8gIiIKLQkJdXN0cj1gZWNobyAiJFNTVk5DX1VMVFJBX0RTTSIgfCBzZWQgLWUgJ3MvcHc9W14gXSovcHc9KioqKioqL2cnYAotCQllY2hvICIgICR1c3RyIFBPUlQgSE9TVDpQT1JUIgotCQllY2hvICIiCi0JZWxpZiBbICJYJGdldHBvcnQiID0gIlgiIF07IHRoZW4KLQkJZWNobyAiIgotCQllY2hvICJSdW5uaW5nIHZpZXdlciBmb3IgZGlyZWN0IGNvbm5lY3Rpb246IgotCQlpZiBlY2hvIFgiJEAiIHwgZ3JlcCBjaGF0b25seSA+IC9kZXYvbnVsbDsgdGhlbgotCQkJOgotCQllbHNlCi0JCQllY2hvICIiCi0JCQllY2hvICIqKiBXQVJOSU5HOiBUSEVSRSBXSUxMIEJFIE5PIFNTTCBPUiBTU0ggRU5DUllQVElPTiAqKiIKLQkJCWVjaG8gIiIKLQkJZmkKLQlmaQotCXg9IiIKLQlpZiBbICJYJFNTVk5DX05PX0VOQ19XQVJOIiAhPSAiWCIgXTsgdGhlbgotCQlpZiBbICJYJGdldHBvcnQiID0gIlgiIF07IHRoZW4KLQkJCXNsZWVwIDEKLQkJZmkKLQllbGlmIHR5cGUgcHJpbnRmID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJcHJpbnRmICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPyBbeV0vbiAiCi0JCXJlYWQgeAotCWVsc2UKLQkJZWNobyAtbiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPyBbeV0vbiAiCi0JCXJlYWQgeAotCWZpCi0JaWYgWyAiWCR4IiA9ICJYbiIgXTsgdGhlbgotCQlleGl0IDEKLQlmaQotCWVjaG8gIiIKLQlpZiBbICJYJHB0bXAiICE9ICJYIiBdOyB0aGVuCi0JCWlmIFsgIlgkcmV2ZXJzZSIgPSAiWCIgXTsgdGhlbgotCQkJUFBST1hZX0xJU1RFTj0kdXNlCi0JCQlleHBvcnQgUFBST1hZX0xJU1RFTgotCQllbHNlCi0JCQlpZiBbICJYJHByb3h5IiA9ICJYcmV2ZXJzZV9kaXJlY3QiIF07IHRoZW4KLQkJCQlQUFJPWFlfTElTVEVOPSIkU1RVTk5FTF9MSVNURU46YGV4cHIgNTUwMCArICRkaXNwYCIKLQkJCQlQUFJPWFlfREVTVD0iJGxvY2FsaG9zdDokdXNlIgotCQkJCVBQUk9YWV9QUk9YWT0iaXB2NjovLyRsb2NhbGhvc3Q6JHVzZSIJIyBub3QgYWx3YXlzIGlwdjYuLgotCQkJCWV4cG9ydCBQUFJPWFlfTElTVEVOIFBQUk9YWV9ERVNUIFBQUk9YWV9QUk9YWQotCQkJCXBwcz0xCi0JCQllbHNlCi0JCQkJUFBST1hZX1JFVkVSU0U9IiRsb2NhbGhvc3Q6JHVzZSIKLQkJCQlleHBvcnQgUFBST1hZX0xJU1RFTgotCQkJCXBwcz0zCi0JCQlmaQotCQkJaWYgWyAiWCRTU1ZOQ19MSVNURU5fT05DRSIgIT0gIlgxIiBdOyB0aGVuCi0JCQkJUFBST1hZX0xPT1BfVEhZU0VMRj1gbXl0bXAgIi90bXAvcHByb3h5X2xvb3BfdGh5c2VsZi4ke1JBTkRPTX0uJCQiYAotCQkJCWV4cG9ydCBQUFJPWFlfTE9PUF9USFlTRUxGCi0JCQkJcHBzPTIKLQkJCWZpCi0JCQlpZiBbICJYJFNTVk5DX0VYVFJBX1NMRUVQIiAhPSAiWCIgXTsgdGhlbgotCQkJCXBwcz1gZXhwciAkcHBzICsgJFNTVk5DX0VYVFJBX1NMRUVQYAotCQkJZmkKLQkJCVBQUk9YWV9TTEVFUD0kcHBzOyBleHBvcnQgUFBST1hZX1NMRUVQOwotCQkJUFBST1hZX0tJTExQSUQ9KzE7IGV4cG9ydCBQUFJPWFlfS0lMTFBJRDsKLQkJZmkKLQotCQkkcHRtcCAmCi0KLQkJaWYgWyAiWCRyZXZlcnNlIiA9ICJYIiBdOyB0aGVuCi0JCQkjc2xlZXAgMgotCQkJI2VjaG8gVCBzbGVlcCAxCi0JCQlzbGVlcCAxCi0JCWZpCi0JCWhvc3Q9IiRsb2NhbGhvc3QiCi0JCWRpc3A9IiROIgotCQlwb3J0PWBleHByICRkaXNwICsgNTkwMGAKLQlmaQotCWlmIFsgIlgkU1NWTkNfRVhUUkFfU0xFRVAiICE9ICJYIiBdOyB0aGVuCi0JCWVjaG8gIlQgc2xlZXAgJFNTVk5DX0VYVFJBX1NMRUVQIgotCQlzbGVlcCAkU1NWTkNfRVhUUkFfU0xFRVAKLQlmaQotCWlmIFsgIlgkcmV2ZXJzZSIgPSAiWCIgXTsgdGhlbgotCQlob3N0ZGlzcD0iJGhvc3Q6JGRpc3AiCi0JCWlmIFsgIlgkU1NWTkNfVUxUUkFfRFNNIiAhPSAiWCIgXTsgdGhlbgotCQkJaWYgWyAiWCRTU1ZOQ19VU0VfT1VSUyIgPSAiWDEiIF07IHRoZW4KLQkJCQlob3N0ZGlzcD0iZXhlYz0kU1NWTkNfVUxUUkFfRFNNIDAgJGhvc3Q6JHBvcnQiCi0JCQllbHNlCi0JCQkJcGY9YGZpbmRmcmVlIDU5NzBgCi0JCQkJY21kPSIkU1NWTkNfVUxUUkFfRFNNIC0kcGYgJGhvc3Q6JHBvcnQiCi0JCQkJcGY9YGV4cHIgJHBmIC0gNTkwMGAKLQkJCQlob3N0ZGlzcD0iJGxvY2FsaG9zdDokcGYiCi0JCQkJdXN0cj1gZWNobyAiJGNtZCIgfCBzZWQgLWUgJ3MvcHc9W14gXSovcHc9KioqKioqL2cnYAotCQkJCWVjaG8gIlJ1bm5pbmc6IgotCQkJCWVjaG8KLQkJCQllY2hvICIkdXN0ciAmIgotCQkJCWVjaG8KLQkJCQkkY21kICYKLQkJCQlkc21fcGlkPSQhCi0JCQkJc2xlZXAgMgotCQkJZmkKLQkJZmkKLQkJaG9zdGRpc3AyPWBlY2hvICIkaG9zdGRpc3AiIHwgc2VkIC1lICdzL3B3PVteIF0qL3B3PSoqKioqKi9nJ2AKLQkJZWNobyAiJFZOQ1ZJRVdFUkNNRCIgIiRAIiAiJGhvc3RkaXNwMiIKLQkJdHJhcCAiZmluYWwiIDAgMiAxNQotCQllY2hvICIiCi0JCSRWTkNWSUVXRVJDTUQgIiRAIiAiJGhvc3RkaXNwIgotCQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQkJZWNobyAidm5jdmlld2VyIGNvbW1hbmQgZmFpbGVkOiAkPyIKLQkJCWlmIFsgIlgkc2Vjb25kdHJ5IiA9ICJYMSIgXTsgdGhlbgotCQkJCXNsZWVwIDIKLQkJCQkkVk5DVklFV0VSQ01EICIkQCIgIiRob3N0ZGlzcCIKLQkJCWZpCi0JCWZpCi0JZWxzZQotCQllY2hvICIiCi0JCWVjaG8gIk5PVEU6IFByZXNzIEN0cmwtQyB0byB0ZXJtaW5hdGUgdmlld2VyIExJU1RFTiBtb2RlLiIKLQkJZWNobyAiIgotCQl0cmFwICJmaW5hbCIgMCAyIDE1Ci0JCWlmIFsgIlgkU1NWTkNfVUxUUkFfRFNNIiAhPSAiWCIgXTsgdGhlbgotCQkJaWYgWyAiWCRTU1ZOQ19MSVNURU5fT05DRSIgPSAiWDEiIF07IHRoZW4KLQkJCQllY2hvICJOT1RFOiBUaGUgdWx0cmF2bmNfZHNtX2hlbHBlciBvbmx5IHJ1bnMgb25jZS4gIFNvIGFmdGVyIHRoZSBmaXJzdCBMSVNURU4iCi0JCQkJZWNobyAiICAgICAgZW5kcyB5b3UgbXVzdCByZXN0YXJ0IHRoZSBMaXN0ZW5pbmcgbW9kZS4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvIgotCQkJCWVjaG8gIiAgICAgIFByZXNzIEN0cmwtQyB0byBzdG9wIHRoZSB2aWV3ZXIgYW5kIHJlc3RhcnQgZm9yIGFub3RoZXIgY29ubmVjdGlvbi4iCi0JCQkJZWNobyAiIgotCQkJZmkKLQkJCSNTU1ZOQ19MSVNURU5fT05DRT0xOyBleHBvcnQgU1NWTkNfTElTVEVOX09OQ0UKLQkJCVZOQ1ZJRVdFUl9MSVNURU5fTE9DQUxIT1NUPTEKLQkJCWV4cG9ydCBWTkNWSUVXRVJfTElTVEVOX0xPQ0FMSE9TVAotCQkJZHBvcnQ9YGV4cHIgNTUwMCArICRkaXNwYAotCQkJY21kPSIkU1NWTkNfVUxUUkFfRFNNICRkcG9ydCAkbG9jYWxob3N0OiR1c2UiCi0JCQl1c3RyPWBlY2hvICIkY21kIiB8IHNlZCAtZSAncy9wdz1bXiBdKi9wdz0qKioqKiovZydgCi0JCQllY2hvICJSdW5uaW5nOiIKLQkJCWVjaG8KLQkJCWVjaG8gIiR1c3RyICYiCi0JCQllY2hvCi0JCQlpZiBbICJYJFNTVk5DX0xJU1RFTl9PTkNFIiA9ICJYMSIgXTsgdGhlbgotCQkJCSRjbWQgJgotCQkJCWRzbV9waWQ9JCEKLQkJCWVsc2UKLQkJCQl3aGlsZSBbIDEgXTsgZG8gJGNtZDsgc2xlZXAgMTsgZG9uZSAmCi0JCQkJZHNtX3BpZD0kIQotCQkJZmkKLQkJCXNsZWVwIDIKLQkJCWRpc3A9JHVzZQotCQkJaWYgWyAkZGlzcCAtZ2UgNTUwMCBdOyB0aGVuCi0JCQkJZGlzcD1gZXhwciAkZGlzcCAtIDU1MDBgCi0JCQlmaQotCQlmaQotCQlkaXNwMj0kZGlzcAotCQlpZiBbICJYJFZOQ1ZJRVdFUl9JU19SRUFMVk5DNCIgPSAiWDEiIF07IHRoZW4KLQkJCWRpc3AyPWBlY2hvICIkZGlzcDIiIHwgc2VkIC1lICdzLzovL2cnYAotCQkJaWYgWyAkZGlzcDIgLWxlIDIwMCBdOyB0aGVuCi0JCQkJZGlzcDI9YGV4cHIgJGRpc3AyICsgNTUwMGAKLQkJCWZpCi0JCWZpCi0JCWVjaG8gIiRWTkNWSUVXRVJDTUQiICIkQCIgLWxpc3RlbiAkZGlzcDIKLQkJZWNobyAiIgotCQkkVk5DVklFV0VSQ01EICIkQCIgLWxpc3RlbiAkZGlzcDIKLQkJaWYgWyAiWCRQUFJPWFlfTE9PUF9USFlTRUxGIiAhPSAiWCIgXTsgdGhlbgotCQkJcm0gLWYgJFBQUk9YWV9MT09QX1RIWVNFTEYKLQkJZmkKLQlmaQotCWV4aXQgJD8KLWZpCi0KLXRtcF9jZmc9L3RtcC9zc192bmN2aWV3ZXIke1JBTkRPTX0uJCQKLXRtcF9jZmc9YG15dG1wICIkdG1wX2NmZyJgCi0KLXN0dW5uZWxfZXhlYz0iIgotaWYgWyAiWCRTU1ZOQ19VU0VfT1VSUyIgIT0gIlgxIiBdOyB0aGVuCi0JOgotZWxpZiBlY2hvICRTVFVOTkVMX0VYVFJBX1NWQ19PUFRTIHwgZ3JlcCAnI3N0dW5uZWwtZXhlYycgPiAvZGV2L251bGw7IHRoZW4KLQlzdHVubmVsX2V4ZWM9IiMiCi1maQotCi1pZiBbICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQotCWlmIGVjaG8gIiRwcm94eSIgfCBncmVwICJecmVwZWF0ZXI6Ly8iID4gL2Rldi9udWxsOyB0aGVuCi0JCWlmIFsgIlgkY2VydCIgPSAiWEJVSUxUSU4iIF07IHRoZW4KLQkJCXR0Y2VydD1gbWFrZV90Y2VydGAKLQkJCWNlcnQ9ImNlcnQgPSAkdHRjZXJ0IgotCQlmaQotCQkjIE5vdGUgZm9yIGxpc3RlbiBtb2RlLCBhbiBlbXB0eSBjZXJ0IHdpbGwgY2F1c2Ugc3R1bm5lbCB0byBmYWlsLgotCQkjIFRoZSBzc3ZuYyBndWkgd2lsbCBoYXZlIGFscmVhZHkgdGFrZW4gY2FyZSBvZiB0aGlzLgotCWZpCi0KLQljYXQgPiAiJHRtcF9jZmciIDw8RU5ECi1mb3JlZ3JvdW5kID0geWVzCi1waWQgPQotY2xpZW50ID0geWVzCi1kZWJ1ZyA9ICRzdHVubmVsX2RlYnVnCi0kY2lwaGVycwotJFNUVU5ORUxfRVhUUkFfT1BUUwotJFNUVU5ORUxfRVhUUkFfT1BUU19VU0VSCi0kY2VydAotJGNybAotJHZlcmlmeQotCi0ke3N0dW5uZWxfZXhlY31bdm5jX3N0dW5uZWxdCi0ke3N0dW5uZWxfZXhlY31hY2NlcHQgPSAkbG9jYWxob3N0OiR1c2UKLSRjb25uZWN0Ci0kU1RVTk5FTF9FWFRSQV9TVkNfT1BUUwotJFNUVU5ORUxfRVhUUkFfU1ZDX09QVFNfVVNFUgotCi1FTkQKLQotZWxzZQotCSMgUkVWRVJTRSBjYXNlOgotCi0Jc3R1bm5lbF9leGVjPSIiCSMgZG9lc24ndCB3b3JrIGZvciBsaXN0ZW5pbmcuCi0KLQlwMj1gZXhwciA1NTAwICsgJE5gCi0JY29ubmVjdD0iY29ubmVjdCA9ICRsb2NhbGhvc3Q6JHAyIgotCWlmIFsgIlgkY2VydCIgPSAiWEJVSUxUSU4iIF07IHRoZW4KLQkJdHRjZXJ0PWBtYWtlX3RjZXJ0YAotCQljZXJ0PSJjZXJ0ID0gJHR0Y2VydCIKLQlmaQotCSMgTm90ZSBmb3IgbGlzdGVuIG1vZGUsIGFuIGVtcHR5IGNlcnQgd2lsbCBjYXVzZSBzdHVubmVsIHRvIGZhaWwuCi0JIyBUaGUgc3N2bmMgZ3VpIHdpbGwgaGF2ZSBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhpcy4KLQotCi0JaGxvYz0iIgotCWlmIFsgIlgkdXNlX3NzaCIgPSAiWDEiIF07IHRoZW4KLQkJaGxvYz0iJGxvY2FsaG9zdDoiCi0JZWxpZiBbICJYJFNUVU5ORUxfTElTVEVOIiAhPSAiWCIgXTsgdGhlbgotCQlobG9jPSIkU1RVTk5FTF9MSVNURU46IgotCWZpCi0JaWYgZWNobyAiJHByb3h5IiB8IGdyZXAgLWkgJ152ZW5jcnlwdDonID4gL2Rldi9udWxsOyB0aGVuCi0JCWhsb2M9IiRsb2NhbGhvc3Q6IgotCQlwdj1gZmluZGZyZWUgNTU3MGAKLQkJcHJveHk9InZlbmNyeXB0OiRwdjokcG9ydCIKLQkJcG9ydD0kcHYKLQkJaWYgWyAiWCRhbm9uZGhfc2V0IiA9ICJYMSIgXTsgdGhlbgotCQkJIyBub3QgbmVlZGVkIGZvciBBTk9OREggaW4gdGhpcyBtb2RlCi0JCQkjY2lwaGVycz0iY2lwaGVycyA9IEFESDpAU1RSRU5HVEgiCi0JCQk6Ci0JCWZpCi0JZmkKLQljYXQgPiAiJHRtcF9jZmciIDw8RU5ECi1mb3JlZ3JvdW5kID0geWVzCi1waWQgPQotY2xpZW50ID0gbm8KLWRlYnVnID0gJHN0dW5uZWxfZGVidWcKLSRjaXBoZXJzCi0kU1RVTk5FTF9FWFRSQV9PUFRTCi0kU1RVTk5FTF9FWFRSQV9PUFRTX1VTRVIKLSRjZXJ0Ci0kY3JsCi0kdmVyaWZ5Ci0KLVt2bmNfc3R1bm5lbF0KLWFjY2VwdCA9ICRobG9jJHBvcnQKLSRjb25uZWN0Ci0kU1RVTk5FTF9FWFRSQV9TVkNfT1BUUwotJFNUVU5ORUxfRVhUUkFfU1ZDX09QVFNfVVNFUgotCi1FTkQKLQotZmkKLQotZWNobyAiIgotZWNobyAiVXNpbmcgdGhpcyBzdHVubmVsIGNvbmZpZ3VyYXRpb246IgotZWNobyAiIgotY2F0ICIkdG1wX2NmZyIgfCB1bmlxCi1lY2hvICIiCi1pZiBlZ3JlcCAtaSAnXlsgCV0qKENBcGF0aHxDQWZpbGUpID0nICIkdG1wX2NmZyIgPiAvZGV2L251bGwgOyB0aGVuCi0JOgotZWxzZQotCWVjaG8gIioqIFdBUk5JTkc6IFRIRSBTVFVOTkVMIENPTkZJRyBIQVMgTk8gU0VSVkVSIENFUlRJRklDQVRFIFNQRUNJRklFRCAgICAgICAqKiIKLQllY2hvICIqKiBXQVJOSU5HOiAodGhlIENBcGF0aCBvciBDQWZpbGUgc3R1bm5lbCBvcHRpb24pIFRIRSBWTkMgU0VSVkVSIFdJTEwgICAgKioiCi0JZWNobyAiKiogV0FSTklORzogTk9UIEJFIEFVVEhFTlRJQ0FURUQuIEEgTUFOLUlOLVRIRS1NSURETEUgQVRUQUNLIElTIFBPU1NJQkxFICoqIgotCWVjaG8gIiIKLWZpCi1zbGVlcCAxCi0KLWlmIFsgIlgkc3R1bm5lbF9leGVjIiA9ICJYIiBdOyB0aGVuCi0JZWNobyAiIgotCWVjaG8gIlJ1bm5pbmcgc3R1bm5lbDoiCi0JZWNobyAiJFNUVU5ORUwgJHRtcF9jZmciCi0Jc3Q9YGVjaG8gIiRTVFVOTkVMIiB8IGF3ayAne3ByaW50ICQxfSdgCi0JJHN0IC1oZWxwID4gL2Rldi9udWxsIDI+JjEKLQkkU1RVTk5FTCAiJHRtcF9jZmciIDwgL2Rldi90dHkgPiAvZGV2L3R0eSAmCi0Jc3R1bm5lbF9waWQ9JCEKLQllY2hvICIiCi0KLQkjIHBhdXNlIGhlcmUgdG8gbGV0IHRoZSB1c2VyIHN1cHBseSBhIHBvc3NpYmxlIHBhc3NwaHJhc2UgZm9yIHRoZQotCSMgbXljZXJ0IGtleToKLQlpZiBbICJYJG15Y2VydCIgIT0gIlgiIF07IHRoZW4KLQkJbnNsPTEwCi0JCWRzbD0wCi0JCWlmIFsgISAtZiAkbXljZXJ0IF07IHRoZW4KLQkJCWRzbD0wCi0JCWVsaWYgZ3JlcCAtaSAnUHJvYy1UeXBlLipFTkNSWVBURUQnICIkbXljZXJ0IiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQkJZHNsPTEKLQkJZmkKLQkJaWYgWyAiWCRkc2wiID0gIlgxIiBdOyB0aGVuCi0JCQllY2hvICIiCi0JCQllY2hvICIoKiogcGF1c2luZyAkbnNsIHNlY3MgZm9yIHBvc3NpYmxlIGNlcnRpZmljYXRlIHBhc3NwaHJhc2UgZGlhbG9nICoqKSIKLQkJCWVjaG8gIiIKLQkJCXNsZWVwICRuc2wKLQkJCWVjaG8gIigqKiBkb25lIHBhdXNpbmcgZm9yIHBhc3NwaHJhc2UgKiopIgotCQkJZWNobyAiIgotCQlmaQotCWZpCi0JI2VjaG8gVCBzbGVlcCAxCi0Jc2xlZXAgMQotCXJtIC1mICIkdG1wX2NmZyIKLWZpCi0KLQotZWNobyAiIgotaWYgWyAiWCRTU1ZOQ19FWFRSQV9TTEVFUCIgIT0gIlgiIF07IHRoZW4KLQllY2hvICJzbGVlcCAkU1NWTkNfRVhUUkFfU0xFRVAiCi0Jc2xlZXAgJFNTVk5DX0VYVFJBX1NMRUVQCi1maQotCi1pZiBbICJYJHJldmVyc2UiID0gIlgiIF07IHRoZW4KLQlpZiBbICJYJE5FRURfVkVOQ1JZUFRfVklFV0VSX0JSSURHRSIgPSAiWDEiIC1hICJYJHB0bXAiICE9ICJYIiBdIDsgdGhlbgotCQlwb3J0MT1gZXhwciA1OTAwICsgJE5gCQkjIHN0dW5uZWwgcG9ydAotCQlwb3J0Mj1gZmluZGZyZWUgNTk3MGAJCSMgYnJpZGdlIHBvcnQgKHZpZXdlciBjb25uZWN0cyB0byBpdC4pCi0JCU49YGV4cHIgJHBvcnQyIC0gNTkwMGAKLQkJZW52IFBQUk9YWV9SRU1PVkU9MCBQUFJPWFlfU0xFRVA9MCBQUFJPWFlfVkVOQ1JZUFRfVklFV0VSX0JSSURHRT0iJHBvcnQyLCRwb3J0MSIgJHB0bXAgJgotCQlzbGVlcCAxCi0JZmkKLQllY2hvICJSdW5uaW5nIHZpZXdlcjoiCi0Jdm5jX2hwPSRsb2NhbGhvc3Q6JE4KLQlpZiBbICJYJHN0dW5uZWxfZXhlYyIgIT0gIlgiIF07IHRoZW4KLQkJdm5jX2hwPSJleGVjPSRTVFVOTkVMICR0bXBfY2ZnIgotCWZpCi0JZWNobyAiJFZOQ1ZJRVdFUkNNRCIgIiRAIiAiJHZuY19ocCIKLQl0cmFwICJmaW5hbCIgMCAyIDE1Ci0JZWNobyAiIgotCSRWTkNWSUVXRVJDTUQgIiRAIiAiJHZuY19ocCIKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQllY2hvICJ2bmN2aWV3ZXIgY29tbWFuZCBmYWlsZWQ6ICQ/IgotCQlpZiBbICJYJHNlY29uZHRyeSIgPSAiWDEiIF07IHRoZW4KLQkJCXNsZWVwIDIKLQkJCSRWTkNWSUVXRVJDTUQgIiRAIiAiJHZuY19ocCIKLQkJZmkKLQlmaQotZWxzZQotCWVjaG8gIlJ1bm5pbmcgdmlld2VyOiIKLQllY2hvICIiCi0JZWNobyAiTk9URTogUHJlc3MgQ3RybC1DIHRvIHRlcm1pbmF0ZSB2aWV3ZXIgTElTVEVOIG1vZGUuIgotCWVjaG8gIiIKLQl0cmFwICJmaW5hbCIgMCAyIDE1Ci0JTjI9JE4KLQlOMl90cmltPWBlY2hvICIkTjIiIHwgc2VkIC1lICdzLzovL2cnYAotCWlmIFsgJE4yX3RyaW0gLWxlIDIwMCBdOyB0aGVuCi0JCU4yX3RyaW09YGV4cHIgJE4yX3RyaW0gKyA1NTAwYAotCWZpCi0JaWYgWyAiWCRwcm94eSIgIT0gIlgiIF07IHRoZW4KLQkJaWYgZWNobyAiJHByb3h5IiB8IGdyZXAgLWkgJ152ZW5jcnlwdDonID4gL2Rldi9udWxsOyB0aGVuCi0JCQlwc3R1bm5lbD1gZWNobyAiJHByb3h5IiB8IGF3ayAtRjogJ3twcmludCAkMn0nYAotCQkJcGxpc3Rlbj1gZWNobyAiJHByb3h5IiB8IGF3ayAtRjogJ3twcmludCAkM30nYAotCQkJSUY9SU5BRERSX0FOWQotCQkJaWYgWyAiWCRTVFVOTkVMX0xJU1RFTiIgIT0gIlgiIF07IHRoZW4KLQkJCQlJRj0kU1RVTk5FTF9MSVNURU4KLQkJCWZpCi0JCQlQUFJPWFlfVkVOQ1JZUFRfUkVWRVJTRT0xOyBleHBvcnQgUFBST1hZX1ZFTkNSWVBUX1JFVkVSU0UKLQkJCVBQUk9YWV9MSVNURU49IiRJRjokcGxpc3RlbiI7IGV4cG9ydCBQUFJPWFlfTElTVEVOCi0JCQlQUFJPWFlfUFJPWFk9InZlbmNyeXB0Oi8vJGxvY2FsaG9zdDokcHN0dW5uZWwiOyBleHBvcnQgUFBST1hZX1BST1hZCi0JCQlQUFJPWFlfREVTVD0iJGxvY2FsaG9zdDokcHN0dW5uZWwiOyBleHBvcnQgUFBST1hZX0RFU1QKLQkJCVNUVU5ORUxfT05DRT0xOyBleHBvcnQgU1RVTk5FTF9PTkNFCi0JCQlTVFVOTkVMX01BWF9DTElFTlRTPTE7IGV4cG9ydCBTVFVOTkVMX01BWF9DTElFTlRTCi0JCQlpZiBbICJYJE5FRURfVkVOQ1JZUFRfVklFV0VSX0JSSURHRSIgPSAiWDEiIC1hICJYJHB0bXAiICE9ICJYIiBdIDsgdGhlbgotCQkJCXBvcnQxPWBleHByIDU1MDAgKyAkTjJgCi0JCQkJcG9ydDI9YGZpbmRmcmVlIDU1ODBgCi0JCQkJTjI9YGV4cHIgJHBvcnQyIC0gNTUwMGAKLQkJCQlOMl90cmltPWBlY2hvICIkTjIiIHwgc2VkIC1lICdzLzovL2cnYAotCQkJCWlmIFsgJE4yX3RyaW0gLWxlIDIwMCBdOyB0aGVuCi0JCQkJCU4yX3RyaW09YGV4cHIgJE4yX3RyaW0gKyA1NTAwYAotCQkJCWZpCi0JCQkJaWYgWyAiWCRTU1ZOQ19MSVNURU5fT05DRSIgIT0gIlgxIiBdOyB0aGVuCi0JCQkJCVBQUk9YWV9MT09QX1RIWVNFTEY9YG15dG1wICIvdG1wL3Bwcm94eV9sb29wX3RoeXNlbGYxLiR7UkFORE9NfS4kJCJgCi0JCQkJCWV4cG9ydCBQUFJPWFlfTE9PUF9USFlTRUxGCi0JCQkJCVBQUk9YWV9MT09QX1RIWVNFTEYwPSRQUFJPWFlfTE9PUF9USFlTRUxGCi0JCQkJZmkKLQkJCQllbnYgUFBST1hZX1JFTU9WRT0wIFBQUk9YWV9TTEVFUD0wIFBQUk9YWV9WRU5DUllQVF9WSUVXRVJfQlJJREdFPSItJHBvcnQxLCRwb3J0MiIgJHB0bXAgJgotCQkJCXNsZWVwIDEKLQkJCWZpCi0JCWVsc2UKLQkJCVBQUk9YWV9SRVZFUlNFPSIkbG9jYWxob3N0OiRwb3J0IjsgZXhwb3J0IFBQUk9YWV9SRVZFUlNFCi0JCQlQUFJPWFlfU0xFRVA9MTsgZXhwb3J0IFBQUk9YWV9TTEVFUDsKLQkJZmkKLQkJUFBST1hZX0tJTExQSUQ9KzE7IGV4cG9ydCBQUFJPWFlfS0lMTFBJRDsKLQkJaWYgWyAiWCRTU1ZOQ19MSVNURU5fT05DRSIgIT0gIlgxIiBdOyB0aGVuCi0JCQlQUFJPWFlfTE9PUF9USFlTRUxGPWBteXRtcCAiL3RtcC9wcHJveHlfbG9vcF90aHlzZWxmMi4ke1JBTkRPTX0uJCQiYAotCQkJZXhwb3J0IFBQUk9YWV9MT09QX1RIWVNFTEYKLQkJZmkKLQkJJHB0bXAgJgotCQkjIEltcG9ydGFudCB0byBoYXZlIG5vIGV4dHJhIHBpZHMgZ2VuZXJhdGVkIGJldHdlZW4gaGVyZSBhbmQgVk5DVklFV0VSQ01ECi0JZmkKLQlpZiBbICJYJFZOQ1ZJRVdFUl9JU19SRUFMVk5DNCIgPSAiWDEiIF07IHRoZW4KLQkJTjI9JE4yX3RyaW0KLQlmaQotCWVjaG8gIiRWTkNWSUVXRVJDTUQiICIkQCIgLWxpc3RlbiAkTjIKLQllY2hvICIiCi0JJFZOQ1ZJRVdFUkNNRCAiJEAiIC1saXN0ZW4gJE4yCi0KLQlpZiBbICJYJFBQUk9YWV9MT09QX1RIWVNFTEYiICE9ICJYIiBdOyB0aGVuCi0JCXJtIC1mICRQUFJPWFlfTE9PUF9USFlTRUxGCi0JZmkKLQlpZiBbICJYJFBQUk9YWV9MT09QX1RIWVNFTEYwIiAhPSAiWCIgXTsgdGhlbgotCQlybSAtZiAkUFBST1hZX0xPT1BfVEhZU0VMRjAKLQlmaQotZmkKLQotc2xlZXAgMQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi91dGlsL3Nzdm5jLnRjbCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vdXRpbC9zc3ZuYy50Y2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlZmIxNDMuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2Jpbi91dGlsL3Nzdm5jLnRjbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MDQxICswLDAgQEAKLSMhL2Jpbi9zaAotIyB0aGUgbmV4dCBsaW5lIHJlc3RhcnRzIHVzaW5nIHdpc2ggXAotZXhlYyB3aXNoICIkMCIgIiRAIgotCi0jCi0jIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIGJ5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0jCi0jIHNzdm5jLnRjbDogZ3VpIHdyYXBwZXIgdG8gdGhlIHByb2dyYW1zIGluIHRoaXMKLSMgcGFja2FnZS4gQWxzbyBzZXRzIHVwIHNlcnZpY2UgcG9ydCBmb3J3YXJkaW5nLgotIwotc2V0IHZlcnNpb24gMS4wLjI4Ci0KLXNldCBidWNrX3plcm8gJGFyZ3YwCi0KLXByb2MgY2VudGVyX3dpbiB7d30gewotCWdsb2JhbCBpc193aW5kb3dzCi0JdXBkYXRlCi0Jc2V0IFcgW3dpbmZvIHNjcmVlbndpZHRoICAkd10KLQlzZXQgVyBbZXhwciAkVyArIDFdCi0Jd20gZ2VvbWV0cnkgJHcgKyRXKzAKLQl1cGRhdGUKLQlzZXQgeCBbZXhwciBbd2luZm8gc2NyZWVud2lkdGggICR3XS8yIC0gW3dpbmZvIHdpZHRoICAkd10vMl0KLQlzZXQgeSBbZXhwciBbd2luZm8gc2NyZWVuaGVpZ2h0ICR3XS8yIC0gW3dpbmZvIGhlaWdodCAkd10vMl0KLQotCWlmIHskaXNfd2luZG93c30gewotCQlzZXQgeSBbZXhwciAiJHkgLSAzMCJdIAotCQlpZiB7JHkgPD0gMH0gewotCQkJc2V0IHkgMQotCQl9Ci0JfQotCXdtIGdlb21ldHJ5ICR3ICskeCskeQotCXdtIGRlaWNvbmlmeSAkdwotCXVwZGF0ZQotfQotCi1wcm9jIHNtYWxsX2hlaWdodCB7fSB7Ci0Jc2V0IEggW3dpbmZvIHNjcmVlbmhlaWdodCAuXQotCWlmIHskSCA8IDcwMH0gewotCQlyZXR1cm4gMQotCX0gZWxzZSB7Ci0JCXJldHVybiAwCi0JfQotfQotCi1wcm9jIG1hY19yYWlzZSB7fSB7Ci0JZ2xvYmFsIHVuYW1lCi0JaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQljYXRjaCB7ZXhlYyAvYmluL3NoIC1jIHtvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gIldpc2ggU2hlbGwiIHRvIGFjdGl2YXRlJyA+L2Rldi9udWxsIDI+JjEgJn19Ci0JCWFmdGVyIDE1MAotCQl1cGRhdGUKLQkJdXBkYXRlIGlkbGV0YXNrcwotCX0KLX0KLQotcHJvYyB0b3BsZXYge3d9IHsKLQljYXRjaCB7ZGVzdHJveSAkd30KLQl0b3BsZXZlbCAkdwotCWNhdGNoIHt3bSB3aXRoZHJhdyAkd30KLX0KLQotcHJvYyBhcHBseV9iZyB7d30gewotCWdsb2JhbCBpc193aW5kb3dzIHN5c3RlbV9idXR0b25fZmFjZQotCWlmIHskaXNfd2luZG93cyAmJiAkc3lzdGVtX2J1dHRvbl9mYWNlICE9ICIifSB7Ci0JCWNhdGNoIHskdyBjb25maWd1cmUgLWJnICIkc3lzdGVtX2J1dHRvbl9mYWNlIn0KLQl9Ci19Ci0KLXByb2MgbGluZV9jb3VudCB7e3N0ciAiIn0ge3BhZCAwfX0gewotCXNldCBuICRwYWQKLQlmb3JlYWNoIGwgW3NwbGl0ICRzdHIgIlxuIl0gewotCQlpbmNyIG4KLQl9Ci0JcmV0dXJuICRuCi19Ci0KLXByb2Mgc2Nyb2xsX3RleHQge2ZyIHt3IDgwfSB7aCAzNX19IHsKLQlnbG9iYWwgaGVscF9mb250IGlzX3dpbmRvd3Mgc2Nyb2xsX3RleHRfZm9jdXMKLQotCWlmIHskaCA9PSAzNSAmJiBbc21hbGxfaGVpZ2h0XX0gewotCQlzZXQgaCAyOAotCX0KLQljYXRjaCB7ZGVzdHJveSAkZnJ9Ci0JCi0JZnJhbWUgJGZyIC1iZCAwCi0KLQlldmFsIHRleHQgJGZyLnQgLXdpZHRoICR3IC1oZWlnaHQgJGggJGhlbHBfZm9udCBcCi0JCSAtc2V0Z3JpZCAxIC1iZCAyIC15c2Nyb2xsY29tbWFuZCB7IiRmci55IHNldCJ9IC1yZWxpZWYgcmlkZ2UgCi0KLQlhcHBseV9iZyAkZnIudAotCi0Jc2Nyb2xsYmFyICRmci55IC1vcmllbnQgdiAtcmVsaWVmIHN1bmtlbiAtY29tbWFuZCAiJGZyLnQgeXZpZXciCi0JcGFjayAkZnIueSAtc2lkZSByaWdodCAtZmlsbCB5Ci0JcGFjayAkZnIudCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWlmIHskc2Nyb2xsX3RleHRfZm9jdXN9IHsKLQkJZm9jdXMgJGZyLnQKLQl9Ci19Ci0KLXByb2Mgc2Nyb2xsX3RleHRfZGlzbWlzcyB7ZnIge3cgODB9IHtoIDM1fX0gewotCWdsb2JhbCBoZWxwX2ZvbnQKLQotCWlmIHskaCA9PSAzNSAmJiBbc21hbGxfaGVpZ2h0XX0gewotCQlzZXQgaCAyOAotCX0KLQlzY3JvbGxfdGV4dCAkZnIgJHcgJGgKLQotCXNldCB1cCAkZnIKLQlyZWdzdWIge1wuW14uXSokfSAkdXAgIiIgdXAKLQotCWJ1dHRvbiAkdXAuZCAtdGV4dCAiRGlzbWlzcyIgLWNvbW1hbmQgImRlc3Ryb3kgJHVwIgotCWJpbmQgJHVwIDxFc2NhcGU+ICJkZXN0cm95ICR1cCIKLQlwYWNrICR1cC5kIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JcGFjayAkZnIgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi19Ci0KLXByb2MgamlnZ2xlX3RleHQge3d9IHsKLQlnbG9iYWwgdW5hbWUKLQlpZiB7JHVuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCSR3IHl2aWV3IHNjcm9sbCAxIHBhZ2VzCi0JCXVwZGF0ZSBpZGxldGFza3MKLQkJJHcgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzCi0JCXVwZGF0ZSBpZGxldGFza3MKLQl9Ci19Ci0KLXByb2MgdHNfaGVscCB7fSB7Ci0JdG9wbGV2IC5oCi0KLQlzY3JvbGxfdGV4dF9kaXNtaXNzIC5oLmYKLQotCWNlbnRlcl93aW4gLmgKLQl3bSB0aXRsZSAuaCAiVGVybWluYWwgU2VydmljZXMgVk5DIFZpZXdlciBIZWxwIgotCi0Jc2V0IG1zZyB7Ci0gVGVybWluYWwgU2VydmljZXM6Ci0KLSAgICBUaGUgVGVybWluYWwgU2VydmljZXMgVk5DIFZpZXdlciB1c2VzIFNTSCB0byBlc3RhYmxpc2ggYW4gZW5jcnlwdGVkCi0gICAgYW5kIGF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIHNlcnZlci4KLQotICAgIFRocm91Z2ggdGhlIFNTSCBjaGFubmVsLCBpdCBhdXRvbWF0aWNhbGx5IHN0YXJ0cyB4MTF2bmMgaW4gdGVybWluYWwKLSAgICBzZXJ2aWNlcyBtb2RlIG9uIHRoZSByZW1vdGUgc2VydmVyIHRvIGZpbmQgb3IgY3JlYXRlIHlvdXIgZGVza3RvcAotICAgIHNlc3Npb24uICB4MTF2bmMgaXMgdXNlZCBmb3IgYm90aCB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCB0aGUKLSAgICBWTkMgdHJhbnNwb3J0LgotCi0gICAgWW91IE1VU1QgYmUgYWJsZSB0byBsb2cgaW4gdmlhIFNTSCB0byB0aGUgcmVtb3RlIHRlcm1pbmFsIHNlcnZlci4KLSAgICBBc2sgeW91ciBhZG1pbmlzdHJhdG9yIHRvIHNldCB0aGlzIHVwIGZvciB5b3UgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KLSAgICB4MTF2bmMgbXVzdCBhbHNvIGJlIGluc3RhbGxlZCBvbiB0aGUgcmVtb3RlIHNlcnZlciBtYWNoaW5lLgotICAgIFNlZSAiUmVxdWlyZW1lbnRzIiBiZWxvdy4KLQotICAgIFRoaXMgbW9kZSBpcyBzdGFydGVkIGJ5IHRoZSBjb21tYW5kcyAndHN2bmMnIG9yICdzc3ZuYyAtdHMnIG9yCi0gICAgdG9nZ2xlZCBieSBwcmVzc2luZyBDdHJsLXQuICAiU1NWTkMgTW9kZSIgdW5kZXIgT3B0aW9ucyAtPiBBZHZhbmNlZAotICAgIHdpbGwgYWxzbyByZXR1cm4gdG8gdGhlIGZ1bGwgU1NWTkMuCi0KLSAgICBPciBpbiB5b3VyIH4vLnNzdm5jcmMgKG9yIH4vc3N2bmNfcmMgb24gV2luZG93cykgcHV0ICJtb2RlPXRzdm5jIgotICAgIHRvIGhhdmUgdGhlIHRvb2wgYWx3YXlzIHN0YXJ0IHVwIGluIHRoYXQgbW9kZS4gIFRvIGNvbnN0cmFpbiB0aGUgVUksCi0gICAgcnVuIHdpdGggLXRzbyBvciBTU1ZOQ19UU19BTFdBWVMgc2V0IHRvIHByZXZlbnQgbGVhdmluZyB0aGUgVGVybWluYWwKLSAgICBTZXJ2aWNlcyBtb2RlLgotCi0KLSBIb3N0cyBhbmQgRGlzcGxheXM6Ci0KLSAgICBFbnRlciB0aGUgcmVtb3RlIFZOQyBUZXJtaW5hbCBTZXJ2aWNlcyBob3N0bmFtZSBpbiB0aGUKLSAgICAnVk5DIFRlcm1pbmFsIFNlcnZlcicgZW50cnkuCi0KLSAgICBFeGFtcGxlczoKLQotICAgICAgICAgICAyNC42Ny4xMzIuMjcKLSAgICAgICAgICAgZmFyLWF3YXkuZWFzdAotICAgICAgICAgICBmcmVkQHNvbWVwbGFjZS5ubwotICAgIAotICAgIFRoZW4gY2xpY2sgb24gIkNvbm5lY3QiLgotCi0gICAgT25jZSB0aGUgU1NIIGlzIHJ1bm5pbmcgKHlvdSBtYXkgbmVlZCB0byB0eXBlIGEgcGFzc3dvcmQgb3IgYWNjZXB0Ci0gICAgYSBuZXcgc3NoIGtleSBpbiB0aGUgdGVybWluYWwgd2luZG93IHRoYXQgcG9wcyB1cCksIHRoZSBWTkMgVmlld2VyCi0gICAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgZGlyZWN0ZWQgdG8gdGhlIGxvY2FsIHBvcnQgb2YgdGhlIFNTSAotICAgIHR1bm5lbCB3aGljaCwgaW4gdHVybiwgZW5jcnlwdHMgYW5kIHJlZGlyZWN0cyB0aGUgY29ubmVjdGlvbiB0byB0aGUKLSAgICByZW1vdGUgVk5DIHNlcnZlci4KLQotICAgIHgxMXZuYyBpcyBydW4gcmVtb3RlbHkgdG8gZmluZCBvciBjcmVhdGUgeW91ciB0ZXJtaW5hbCBzZXJ2aWNlcyBkZXNrdG9wCi0gICAgc2Vzc2lvbi4gIEl0IG11c3QgYmUgaW5zdGFsbGVkIGFuZCBhY2Nlc3NpYmxlIG9uIHRoZSByZW1vdGUgc3lzdGVtLgotCi0gICAgRW50ZXIgInVzZXJAaG9zdG5hbWUuY29tIiBpbiAnVk5DIFRlcm1pbmFsIFNlcnZlcicgaWYgdGhlIHJlbW90ZQotICAgIHVzZXJuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB5b3VycyBvbiB0aGlzIG1hY2hpbmUuICBPbiBXaW5kb3dzCi0gICAgeW91ICpNVVNUKiBzdXBwbHkgdGhlIHJlbW90ZSB1c2VybmFtZSBkdWUgdG8gYSBkZWZpY2llbmN5IGluIFBsaW5rLgotICAgIFRoaXMgZW50cnkgaXMgcGFzc2VkIHRvIFNTSDsgaXQgY291bGQgYWxzbyBiZSBhbiBTU0ggYWxpYXMgeW91IGhhdmUKLSAgICBjcmVhdGVkIChpbiB+Ly5zc2gvY29uZmlnKS4KLQotICAgIElmIHRoZSByZW1vdGUgU1NIIHNlcnZlciBpcyBydW4gb24gYSBub24tc3RhbmRhcmQgcG9ydCwgZS5nLiAyMjIyLCB1c2UKLSAgICBzb21ldGhpbmcgbGlrZSBvbmUgb2YgdGhlc2U6Ci0KLSAgICAgICAgICAgZmFyLWF3YXkuZWFzdDoyMjIyCi0gICAgICAgICAgIGZyZWRAc29tZXBsYWNlLm5vOjIyMjIKLQotICAgICh1bmxpa2UgU1NWTkMgbW9kZSwgdGhlIG51bWJlciBpcyB0aGUgU1NIIHBvcnQsIG5vdCB0aGUgVk5DIGRpc3BsYXkpCi0KLSAgICBJZiB5b3UgZmluZCB5b3Vyc2VsZiBpbiB0aGUgdW5mb3J0dW5hdGUgY2lyY3Vtc3RhbmNlIHRoYXQgeW91ciBzc2ggCi0gICAgdXNlcm5hbWUgaGFzIGEgc3BhY2UgaW4gaXQsIHVzZSAlU1BBQ0UgKG9yICVUQUIpIGxpa2UgdGhpczoKLQotICAgICAgICAgICBmcmVkJVNQQUNFZmxpbnRzdG9uZUB4eXp6eS5uZXQKLQotCi0gWmVyb2NvbmYvQm9uam91cjoKLQotICAgIE9uIFVuaXggb3IgTWFjIE9TIFgsIGlmIHRoZSAnYXZhaGktYnJvd3NlJyBvciAnZG5zLXNkJyBjb21tYW5kIGlzCi0gICAgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gYW5kIGluIHlvdXIgUEFUSCwgYSAnRmluZCcgYnV0dG9uIGlzIHBsYWNlZCBieQotICAgICdWTkMgSG9zdDpEaXNwbGF5Jy4gIENsaWNraW5nIG9uIEZpbmQgd2lsbCB0cnkgdG8gZmluZCBWTkMgU2VydmVycwotICAgIG9uIHlvdXIgTG9jYWwgTmV0d29yayB0aGF0IGFkdmVydGl6ZSB2aWEgdGhlIFplcm9jb25mIHByb3RvY29sLgotICAgIEEgbWVudSBvZiBmb3VuZCBob3N0cyBpcyBwcmVzZW50ZWQgZm9yIHlvdSB0byBzZWxlY3QgZnJvbS4KLQotCi0gUHJvZmlsZXM6Ci0KLSAgICBVc2UgIlNhdmUiIHRvIHNhdmUgYSBwcm9maWxlIChpLmUuIGEgaG9zdDpkaXNwbGF5IGFuZCBpdHMgc3BlY2lmaWMKLSAgICBzZXR0aW5ncykgd2l0aCBhIG5hbWUuICBUaGUgIlRTLSIgcHJlZml4IHdpbGwgYmUgc3VnZ2VzdGVkIHRvIGhlbHAKLSAgICB5b3UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBUZXJtaW5hbCBTZXJ2aWNlcyBhbmQgcmVndWxhciBwcm9maWxlcy4KLQotICAgIFRvIGxvYWQgaW4gYSBzYXZlZCBPcHRpb25zIHByb2ZpbGUsIGNsaWNrIG9uIHRoZSAiTG9hZCIgYnV0dG9uLAotICAgIGFuZCBjaG9vc2Ugd2hpY2ggb25lIHlvdSB3YW50LgotCi0gICAgVG8gbGlzdCB5b3VyIHByb2ZpbGVzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB1c2U6Ci0KLSAgICAgICAgIHRzdm5jIC1wcm9maWxlcyAgICAob3IgLWxpc3QpCi0KLSAgICBUbyBsYXVuY2ggcHJvZmlsZTEgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZC1saW5lLCBvciB0byBhIHNlcnZlcgotICAgIHVzZSB0aGluZ3MgbGlrZTogCi0KLSAgICAgICAgIHRzdm5jIHByb2ZpbGUxCi0gICAgICAgICB0c3ZuYyAvcGF0aC90by9wcm9maWxlMS52bmMKLSAgICAgICAgIHRzdm5jIGhvc3RuYW1lCi0gICAgICAgICB0c3ZuYyB1c2VyQGhvc3RuYW1lCi0KLSAgICBOb3RlIHRoYXQgdGhlICdWZXJpZnkgQWxsIENlcnRzJyBzZXR0aW5nIGlzIE5PVCBzYXZlZCBpbiBwcm9maWxlcy4KLQotCi0gUHJveGllcy9HYXRld2F5czoKLQotICAgIFByb3h5L0dhdGV3YXkgaXMgdXN1YWxseSBhIGdhdGV3YXkgbWFjaGluZSB0byBsb2cgaW50byB2aWEgU1NIIHRoYXQgaXMKLSAgICBub3QgdGhlIG1hY2hpbmUgcnVubmluZyB0aGUgVk5DIHRlcm1pbmFsIHNlcnZpY2VzLiAgSG93ZXZlciwgV2ViIGFuZAotICAgIFNPQ0tTIHByb3hpZXMgY2FuIGFsc28gYmUgdXNlZCAoc2VlIGJlbG93KS4KLQotICAgIEZvciBleGFtcGxlIGlmIGEgY29tcGFueSBoYWQgYSBjZW50cmFsIGxvZ2luIHNlcnZlcjogInNzaC5jb21wYW55LmNvbSIKLSAgICAoYWNjZXNzaWJsZSBmcm9tIHRoZSBpbnRlcm5ldCkgYW5kIHRoZSBpbnRlcm5hbCBzZXJ2ZXIgbmFtZSB3YXMKLSAgICAidHMtc2VydmVyIiwgb25lIGNvdWxkIHB1dCBpbgotCi0gICAgICAgICAgIFZOQyBUZXJtaW5hbCBTZXJ2ZXI6ICAgdHMtc2VydmVyCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgICAgc3NoLmNvbXBhbnkuY29tCi0KLSAgICBJdCBpcyBPSyBpZiB0aGUgaG9zdG5hbWUgInRzLXNlcnZlciIgb25seSByZXNvbHZlcyBpbnNpZGUgdGhlIGZpcmV3YWxsLgotCi0gICAgVGhlIDJuZCBob3N0LCB0cy1zZXJ2ZXIgaW4gdGhpcyBleGFtcGxlLCBNVVNUIGFsc28gYmUgcnVubmluZyBhbiBTU0gKLSAgICBzZXJ2ZXIgYW5kIHlvdSBtdXN0IGJlIGFibGUgdG8gbG9nIGludG8gaXQuICBZb3UgbWF5IG5lZWQgdG8gc3VwcGx5Ci0gICAgYSAybmQgcGFzc3dvcmQgdG8gaXQgdG8gbG9naW4uCi0KLSAgICBVc2UgdXNlcm5hbWVAaG9zdCAoZS5nLiBqb2VAdHMtc2VydmVyIG9yIGpzbWl0aEBzc2guY29tcGFueS5jb20pCi0gICAgaWYgdGhlIHVzZXIgbmFtZSBkaWZmZXJzIGJldHdlZW4gbWFjaGluZXMuCi0KLSAgICBOT1RFOiBPbiBXaW5kb3dzIHlvdSBNVVNUIGFsd2F5cyBzdXBwbHkgdGhlIHVzZXJuYW1lQCBiZWNhdXNlIHB1dHR5J3MKLSAgICBwbGluayByZXF1aXJlcyBpdC4KLQotCi0gICAgTk9OLVNUQU5EQVJEIFNTSCBQT1JUOiBUbyB1c2UgYSBub24tc3RhbmRhcmQgc3NoIHBvcnQgKGkuZS4gYSBwb3J0IG90aGVyCi0gICAgdGhhbiAyMikgeW91IG5lZWQgdG8gdXNlIHRoZSBQcm94eS9HYXRld2F5cyBhcyB3ZWxsLiAgRS5nLiBzb21ldGhpbmcKLSAgICBsaWtlIHRoaXMgZm9yIHBvcnQgMjIyMjoKLSAgICAKLSAgICAgICAgICAgVk5DIFRlcm1pbmFsIFNlcnZlcjogIHRzLXNlcnZlcgotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgICAganNtaXRoQHNzaC5jb21wYW55LmNvbToyMjIyCi0KLSAgICBPbiBVbml4L01hY09TWCB0aGUgdXNlcm5hbWVAIGlzIG5vdCBuZWVkZWQgaWYgaXQgaXMgdGhlIHNhbWUgYXMgb24gdGhpcwotICAgIG1hY2hpbmUuCi0KLQotICAgIEEgV2ViIG9yIFNPQ0tTIHByb3h5IGNhbiBhbHNvIGJlIHVzZWQuICBVc2UgdGhpcyBpZiB5b3UgYXJlIGluc2lkZSBhCi0gICAgZmlyZXdhbGwgdGhhdCBwcm9oaWJpdHMgZGlyZWN0IGNvbm5lY3Rpb25zIHRvIHJlbW90ZSBTU0ggc2VydmVycy4KLSAgICBJbiBUZXJtaW5hbCBTZXJ2aWNlcyBTU0ggbW9kZSwgdGhlICJodHRwOi8vIiBwcmVmaXggaXMgcmVxdWlyZWQgZm9yCi0gICAgd2ViIHByb3hpZXMuCi0KLSAgICAgICAgICAgVk5DIFRlcm1pbmFsIFNlcnZlcjogIGZyZWRAc29tZXBsYWNlLm5vCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgICBodHRwOi8vbXlwcm94eS53ZXN0OjgwODAKLQotICAgIG9yIGZvciBTT0NLUzoKLQotICAgICAgICAgICBWTkMgVGVybWluYWwgU2VydmVyOiAgZnJlZEBzb21lcGxhY2Uubm8KLSAgICAgICAgICAgUHJveHkvR2F0ZXdheTogICAgICAgIHNvY2tzOi8vbXlzb2Nrcy53ZXN0OjEwODAKLQotICAgIHVzZSBzb2NrczU6Ly8uLi4gdG8gZm9yY2UgdGhlIFNPQ0tTNSB2ZXJzaW9uLiAgRm9yIGEgbm9uLXN0YW5kYXJkCi0gICAgcG9ydCB0aGUgYWJvdmUgd291bGQgYmUsIGUuZy4sIGZyZWRAc29tZXBsYWNlLm5vOjIyMjIKLQotICAgIEFzIHdpdGggYSB1c2VybmFtZSB0aGF0IGNvbnRhaW5zIGEgc3BhY2UsIHVzZSAlU1BBQ0UgKG9yICVUQUIpIHRvCi0gICAgaW5kaWNhdGUgaXQgaW4gdGhlIFNTSCBwcm94aWVzLCBlLmcuIGpvaG4lU1BBQ0VzbWl0aEBzc2guY29tcGFueS5jb20KLQotICAgIE9uZSBjYW4gYWxzbyBjaGFpbiBwcm94aWVzIGFuZCBvdGhlciB0aGluZ3MuICBTZWUgdGhlIHNlY3Rpb24KLSAgICAiU1NIIFByb3hpZXMvR2F0ZXdheXMiIGluIHRoZSBNYWluIFNTVk5DIEhlbHAgZm9yIGZ1bGwgZGV0YWlscy4KLQotCi0gT3B0aW9uczoKLQotICAgIENsaWNrIG9uIE9wdGlvbnMgdG8gZ2V0IHRvIGRpYWxvZyBib3hlcyB0bzoKLQotICAgICAgICAgICAtIERlc2t0b3AgVHlwZSAgICAgICAgKGtkZSwgZ25vbWUsIGZhaWxzYWZlLCB0d20uLi4pIAotICAgICAgICAgICAtIERlc2t0b3AgU2l6ZSAgICAgICAgKEdlb21ldHJ5IFd4SCBhbmQgcGl4ZWwgZGVwdGgpIAotICAgICAgICAgICAtIFggU2VydmVyIFR5cGUgICAgICAgKFh2ZmIsIFhkdW1teSwgWHZuYykgCi0gICAgICAgICAgIC0gRW5hYmxlIFByaW50aW5nICAgICAoQ1VQUyBhbmQvb3IgU01CL1dpbmRvd3MpCi0gICAgICAgICAgIC0gRW5hYmxlIFNvdW5kICAgICAgICAoVEJELCBFU0QgcGFydGlhbGx5IHdvcmtpbmcpCi0gICAgICAgICAgIC0gRmlsZSBUcmFuc2ZlciAgICAgICAoVWx0cmEgb3IgVGlnaHRWTkMgZmlsZXhmZXIpCi0gICAgICAgICAgIC0gVmlldyBPbmx5ICAgICAgICAgICAoVmlldyBvbmx5IGNsaWVudCkKLSAgICAgICAgICAgLSBDaGFuZ2UgVk5DIFZpZXdlciAgIChSZWFsdm5jLCB1bHRyYSwgZXRjLi4uKQotICAgICAgICAgICAtIFgxMSB2aWV3ZXIgTWFjT1NYICAgKHVzZSBidW5kbGVkIFgxMSB2bmN2aWV3ZXIpCi0gICAgICAgICAgIC0gRGVsZXRlIFByb2ZpbGUuLi4gICAoRGVsZXRlIGEgc2F2ZWQgcHJvZmlsZSkKLQotICAgICAgICAgICAtIEFkdmFuY2VkIE9wdGlvbnM6Ci0KLSAgICAgICAgICAgLSBWTkMgU2hhcmVkICAgICAgICAgIChvcHRpb25hbCB0cmFkaXRpb25hbCBWTkMgc2hhcmluZykKLSAgICAgICAgICAgLSBNdWx0aXBsZSBTZXNzaW9ucyAgIChtb3JlIHRoYW4gMSBzZXNzaW9uIHBlciBzZXJ2ZXIpCi0gICAgICAgICAgIC0gWCBMb2dpbiBHcmVldGVyICAgICAoQ29ubmVjdCB0byBMb2dpbi9HcmVldGVyIERpc3BsYXkpCi0gICAgICAgICAgIC0gT3RoZXIgVk5DIFNlcnZlciAgICAocmVkaXJlY3QgdG8gM3JkIHBhcnR5IFZOQyBTZXJ2ZXIpCi0gICAgICAgICAgIC0gVXNlIHVuaXhwdyAgICAgICAgICAob3B0aW9uYWwgeDExdm5jIGxvZ2luIG1vZGUpCi0gICAgICAgICAgIC0gQ2xpZW50IDhiaXQgQ29sb3IgICAoVk5DIFZpZXdlciByZXF1ZXN0cyBsb3cgY29sb3IgbW9kZSkKLSAgICAgICAgICAgLSBDbGllbnQtU2lkZSBDYWNoaW5nIChleHBlcmltZW50YWwgeDExdm5jIHNwZWVkdXApCi0gICAgICAgICAgIC0gWDExVk5DIE9wdGlvbnMgICAgICAoc2V0IGFueSBleHRyYSB4MTF2bmMgb3B0aW9ucykKLSAgICAgICAgICAgLSBFeHRyYSBTbGVlcCAgICAgICAgIChkZWxheSBhIGJpdCBiZWZvcmUgc3RhcnRpbmcgdmlld2VyKQotICAgICAgICAgICAtIFB1dHR5IEFyZ3MgICAgICAgICAgKFdpbmRvd3M6IHN0cmluZyBmb3IgcGxpbmsvcHV0dHkgY21kKQotICAgICAgICAgICAtIFB1dHR5IEFnZW50ICAgICAgICAgKFdpbmRvd3M6IGxhdW5jaCBwYWdlYW50KQotICAgICAgICAgICAtIFB1dHR5IEtleS1HZW4gICAgICAgKFdpbmRvd3M6IGxhdW5jaCBwdXR0eWdlbikKLSAgICAgICAgICAgLSBTU0ggTG9jYWwgUHJvdGVjdGlvbnMgIChhIGJpdCBvZiBzYWZldHkgb24gbG9jYWwgc2lkZSkKLSAgICAgICAgICAgLSBTU0ggS25vd25Ib3N0cyBmaWxlICh0byBhdm9pZCBTU0ggJ2xvY2FsaG9zdCcgY29sbGlzaW9ucykKLSAgICAgICAgICAgLSBTU1ZOQyBNb2RlICAgICAgICAgIChSZXR1cm4gdG8gZnVsbCBTU1ZOQyBtb2RlKQotCi0gICAgICAgICAgIC0gVW5peCBzc3ZuY3ZpZXdlciAgICAoc2V0IG9wdGlvbnMgZm9yIHN1cHBsaWVkIFVuaXggdmlld2VyKQotCi0KLSBSZXF1aXJlbWVudHM6Ci0KLSAgICBXaGVuIHJ1bm5pbmcgdGhpcyBhcHBsaWNhdGlvbiBvbiBVbml4L01hY09TWCB0aGUgc3NoKDEpIHByb2dyYW0gbXVzdAotICAgIGJlIGluc3RhbGxlZCBsb2NhbGx5LiAgT24gV2luZG93cyBhIHBsaW5rL3B1dHR5IGJpbmFyeSBpcyBpbmNsdWRlZC4KLQotICAgIE9uIHRoZSByZW1vdGUgVk5DIFRlcm1pbmFsIFNlcnZpY2VzIGhvc3QsIHgxMXZuYyBtdXN0IGJlIGluc3RhbGxlZAotICAgICgwLjkuMyBvciBoaWdoZXIpLCBhbmQgYXQgbGVhc3Qgb25lIHZpcnR1YWwgWCBzZXJ2ZXI6IFh2ZmIsIFhkdW1teSwKLSAgICBvciBYdm5jIG11c3QgYmUgYXZhaWxhYmxlLiAgWHZmYiBpcyB0aGUgbW9zdCBvZnRlbiB1c2VkIG9uZS4gIEFsbCBvZgotICAgIHRoZXNlIHByb2dyYW1zIG11c3QgYmUgYXZhaWxhYmxlIGluICRQQVRIIG9uIHRoZSByZW1vdGUgc2VydmVyIHdoZW4KLSAgICBsb2dnZWQgaW4gdmlhIFNTSC4KLQotICAgIFRoZSBWTkMgdGVybWluYWwgc2VydmljZXMgYWRtaW5pc3RyYXRvciBjYW4gbWFrZSAieDExdm5jIiBiZSBhIHdyYXBwZXIKLSAgICBzY3JpcHQgdGhhdCBzZXRzIGV2ZXJ5dGhpbmcgdXAgY29ycmVjdGx5IGFuZCB0aGVuIHJ1bnMgdGhlIHJlYWwgeDExdm5jLiAKLQotCi0gUmVhbCBYIHNlcnZlcnM6Ci0KLSAgICBBcyBhICpCT05VUyosIGlmIG9uIHRoZSByZW1vdGUgaG9zdCwgc2F5IGEgd29ya3N0YXRpb24sIHlvdSBoYXZlIGEKLSAgICByZWd1bGFyIFggc2Vzc2lvbiBydW5uaW5nIG9uIHRoZSBwaHlzaWNhbCBoYXJkd2FyZSB0aGF0IHlvdSBhcmUKLSAgICBBTFJFQURZIGxvZ2dlZCBpbnRvIHlvdSBjYW4gYWNjZXNzIHRvIHRoYXQgZGlzcGxheSBhcyB3ZWxsICh4MTF2bmMKLSAgICB3aWxsIGZpbmQgaXQpLgotCi0gICAgU28gdGhpcyB0b29sIGNhbiBiZSB1c2VkIGFzIGEgc2ltcGxlIHdheSB0byBsYXVuY2ggeDExdm5jIHRvIGZpbmQKLSAgICB5b3VyIHJlYWwgWCBkaXNwbGF5IG9uIHlvdXIgd29ya3N0YXRpb24gYW5kIGNvbm5lY3QgdG8gaXQuCi0KLSAgICBUaGUgUHJpbnRpbmcgYW5kIFNvdW5kIHJlZGlyZWN0aW9uIHdvbid0IHdvcmsgZm9yIHRoaXMgbW9kZSBob3dldmVyLgotICAgIFlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBmdWxsIFNTVk5DIGFwcGxpY2F0aW9uIHRvIGF0dGVtcHQgdGhhdC4KLQotICAgIElmIHlvdSAobWlzdGFrZW5seSkgaGF2ZSBub3QgbG9nZ2VkIGludG8gYW4gWCBzZXNzaW9uIG9uIHRoZSByZWFsCi0gICAgWCBzZXJ2ZXIgb24gdGhlIHdvcmtzdGF0aW9uLCBhIFZJUlRVQUwgKFh2ZmIsIGV0Yy4pIHNlcnZlciB3aWxsIGJlCi0gICAgY3JlYXRlZCBmb3IgeW91ICh0aGF0IG1heSBvciBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQpLgotCi0gICAgVGhlIFggTG9naW4gQWR2YW5jZWQgc2V0dGluZyBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIGEgWCBEaXNwbGF5Ci0gICAgTWFuZ2VyIEdyZWV0ZXIgbG9naW4gcGFuZWwgKG5vIG9uZSBpcyBsb2dnZWQgaW4geWV0KS4gIFRoaXMgcmVxdWlyZXMKLSAgICBzdWRvKDEpIHByaXZpbGVnZXMgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgotCi0gTW9yZSBJbmZvOgotCi0gICAgU2VlIHRoZXNlIGxpbmtzIGZvciBtb3JlIGluZm9ybWF0aW9uOgotCi0gICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI3R1bm5lbGxpbmcKLX0KLQotCWdsb2JhbCB2ZXJzaW9uCi0Jc2V0IG1zZyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1ZOQyB2ZXJzaW9uOiAkdmVyc2lvblxuJG1zZyIKLQotCS5oLmYudCBpbnNlcnQgZW5kICRtc2cKLQlqaWdnbGVfdGV4dCAuaC5mLnQKLX0KLQotcHJvYyBoZWxwIHt9IHsKLQlnbG9iYWwgdHNfb25seQotCWlmIHskdHNfb25seX0gewotCQl0c19oZWxwCi0JCXJldHVybgotCX0KLQl0b3BsZXYgLmgKLQotCXNldCBoIDM3Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyNgotCX0KLQlzY3JvbGxfdGV4dF9kaXNtaXNzIC5oLmYgODIgJGgKLQotCWNlbnRlcl93aW4gLmgKLQl3bSB0aXRsZSAuaCAiU1NML1NTSCBWTkMgVmlld2VyIEhlbHAiCi0KLQlnbG9iYWwgaGVscF9tYWluIGhlbHBfcHJveCBoZWxwX21pc2MgaGVscF90aXBzCi0JCi0Jc2V0IGhlbHBfbWFpbiB7Ci0gSG9zdHMgYW5kIERpc3BsYXlzOgotCi0gICAgRW50ZXIgdGhlIFZOQyBob3N0IGFuZCBkaXNwbGF5IGluIHRoZSAgJ1ZOQyBIb3N0OkRpc3BsYXknICBlbnRyeSBib3guCi0gICAgCi0gICAgSXQgaXMgb2YgdGhlIGZvcm0gImhvc3Q6bnVtYmVyIiwgd2hlcmUgImhvc3QiIGlzIHRoZSBob3N0bmFtZSBvZiB0aGUKLSAgICBtYWNoaW5lIHJ1bm5pbmcgdGhlIFZOQyBTZXJ2ZXIgYW5kICJudW1iZXIiIGlzIHRoZSBWTkMgZGlzcGxheSBudW1iZXI7Ci0gICAgaXQgaXMgb2Z0ZW4gIjAiLiAgU29tZSBFeGFtcGxlczoKLQotICAgICAgICAgICBzbm9vcHk6MAotCi0gICAgICAgICAgIGZhci1hd2F5LmVhc3Q6MAotCi0gICAgICAgICAgIHN1bnJheS1zcnYxLndlc3Q6MTcKLQotICAgICAgICAgICAyNC42Ny4xMzIuMjc6MAotICAgIAotICAgIFRoZW4gY2xpY2sgb24gIkNvbm5lY3QiLiAgV2hlbiB5b3UgZG8gdGhlIFNUVU5ORUwgcHJvZ3JhbSB3aWxsIGJlIHN0YXJ0ZWQKLSAgICBsb2NhbGx5IHRvIHByb3ZpZGUgeW91IHdpdGggYW4gb3V0Z29pbmcgU1NMIHR1bm5lbC4KLQotICAgIE9uY2UgdGhlIFNUVU5ORUwgaXMgcnVubmluZywgdGhlIFRpZ2h0Vk5DIFZpZXdlciAoT3IgcGVyaGFwcyBDaGlja2VuIG9mCi0gICAgdGhlIFZOQyBvbiBNYWMgT1MgWCwgb3Igb25lIHlvdSBzZXQgdW5kZXIgT3B0aW9ucykgd2lsbCBiZSBhdXRvbWF0aWNhbGx5Ci0gICAgc3RhcnRlZCBhbmQgZGlyZWN0ZWQgdG8gdGhlIGxvY2FsIHBvcnQgb2YgdGhlIFNTTCB0dW5uZWwgd2hpY2gsIGluIHR1cm4sCi0gICAgZW5jcnlwdHMgYW5kIHJlZGlyZWN0cyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIFZOQyBzZXJ2ZXIuCi0KLSAgICBUaGUgcmVtb3RlIFZOQyBzZXJ2ZXIgKipNVVNUKiogc3VwcG9ydCBhbiBpbml0aWFsIFNTTC9UTFMgaGFuZHNoYWtlIGJlZm9yZQotICAgIHVzaW5nIHRoZSBWTkMgcHJvdG9jb2wgKGkuZS4gVk5DIGlzIHR1bm5lbGxlZCB0aHJvdWdoIHRoZSBTU0wgY2hhbm5lbAotICAgIGFmdGVyIGl0IGlzIGVzdGFibGlzaGVkKS4gICJ4MTF2bmMgLXNzbCAuLi4iICBkb2VzIHRoaXMsIGFuZCBhbnkgVk5DIHNlcnZlcgotICAgIGNhbiBiZSBtYWRlIHRvIGRvIHRoaXMgYnkgdXNpbmcsIGUuZy4sIFNUVU5ORUwgb3Igc29jYXQgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIFNTVk5DIGFsc28gc3VwcG9ydHMgVmVOQ3J5cHQgYW5kIEFOT05UTFMgU1NML1RMUyBWTkMgc2VydmVycyAoc2VlIGJlbG93LikKLQotICAgICogQXV0b21hdGljIFNTSCBUdW5uZWxzIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0KLSAgICAqIFRoZSAnTm8gRW5jcnlwdGlvbicgLyAnTm9uZScgb3B0aW9uIHByb3ZpZGVzIGEgZGlyZWN0IGNvbm5lY3Rpb24gd2l0aG91dAotICAgICAgZW5jcnlwdGlvbiAoZGlzYWJsZSB0aGUgYnV0dG9uIHdpdGggdGhlIC1lbmMgb3B0aW9uLCBvciBPcHRpb25zIG1lbnUuKQotICAgICAgTW9yZSBpbmZvIGluIFRpcCA1LgotCi0gUG9ydCBudW1iZXJzOgotCi0gICAgSWYgeW91IGFyZSB1c2luZyBhIHBvcnQgbGVzcyB0aGFuIHRoZSBkZWZhdWx0IFZOQyBwb3J0IDU5MDAgKHVzdWFsbHkKLSAgICB0aGUgVk5DIGRpc3BsYXkgPSBwb3J0IC0gNTkwMCksIHVzZSB0aGUgZnVsbCBwb3J0IG51bWJlciBpdHNlbGYsIGUuZy46Ci0gICAgCi0gICAgICAgICAyNC42Ny4xMzIuMjc6NDQzCi0gICAgCi0gICAgTm90ZSwgaG93ZXZlciwgaWYgdGhlIG51bWJlciBuIGFmdGVyIHRoZSBjb2xvbiBpcyA8IDIwMCwgdGhlbiBhCi0gICAgcG9ydCBudW1iZXIgNTkwMCArIG4gaXMgYXNzdW1lZDsgaS5lLiBuIGlzIHRoZSBWTkMgZGlzcGxheSBudW1iZXIuCi0gICAgSWYgeW91IG11c3QgdXNlIGEgVENQIHBvcnQgbGVzcyB0aGFuIDIwMCwgc3BlY2lmeSBhIG5lZ2F0aXZlIHZhbHVlLAotICAgIGUuZy46ICAyNC42Ny4xMzIuMjc6LTgwCi0gCi0gICAgRm9yIFJldmVyc2UgVk5DIGNvbm5lY3Rpb25zIChsaXN0ZW5pbmcgdmlld2VyLCBTZWUgVGlwIDIgYW5kCi0gICAgT3B0aW9ucyAtPiBIZWxwKSwgdGhlIHBvcnQgbWFwcGluZyBpcyBzaW1pbGFyLCBleGNlcHQgImxpc3RlbmluZwotICAgIGRpc3BsYXkgOjAiIGNvcnJlc3BvbmRzIHRvIHBvcnQgNTUwMCwgOjEgdG8gNTUwMSwgZXRjLgotICAgIFNwZWNpZnkgYSBzcGVjaWZpYyBpbnRlcmZhY2UsIGUuZy4gMTkyLjE2OC4xLjE6MCB0byBoYXZlIHN0dW5uZWwKLSAgICBsaXN0ZW4gb24gdGhhdCBpbnRlcmZhY2Ugb25seS4gIExpc3RlbmluZyBvbiBJUHY2IGNhbiBhbHNvIGJlIGRvbmUsIHVzZQotICAgIGUuZy4gOjo6MCBvciA6OjE6MCAgVGhpcyBsaXN0ZW5pbmcgb24gSVB2NiAoOjo6MCkgd29ya3MgZm9yIFVOLWVuY3J5cHRlZAotICAgIHJldmVyc2UgY29ubmVjdGlvbnMgYXMgd2VsbCAobW9kZSAnTm9uZScpLgotCi0KLSBaZXJvY29uZi9Cb25qb3VyOgotCi0gICAgT24gVW5peCBvciBNYWMgT1MgWCwgaWYgdGhlICdhdmFoaS1icm93c2UnIG9yICdkbnMtc2QnIGNvbW1hbmQgaXMKLSAgICBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSBhbmQgaW4geW91ciBQQVRILCBhICdGaW5kJyBidXR0b24gaXMgcGxhY2VkIGJ5Ci0gICAgJ1ZOQyBIb3N0OkRpc3BsYXknLiAgQ2xpY2tpbmcgb24gRmluZCB3aWxsIHRyeSB0byBmaW5kIFZOQyBTZXJ2ZXJzIG9uCi0gICAgeW91ciBMb2NhbCBOZXR3b3JrIHRoYXQgYWR2ZXJ0aXplIHZpYSB0aGUgWmVyb2NvbmYgcHJvdG9jb2wuICBBIG1lbnUgb2YKLSAgICBmb3VuZCBob3N0cyBpcyBwcmVzZW50ZWQgZm9yIHlvdSB0byBzZWxlY3QgZnJvbS4KLQotCi0gVk5DIFBhc3N3b3JkOgotCi0gICAgT24gVW5peCBvciBNYWNPU1ggSUYgdGhlcmUgaXMgYSBWTkMgcGFzc3dvcmQgZm9yIHRoZSBzZXJ2ZXIgeW91IGNhbgotICAgIGVudGVyIGl0IGluIHRoZSAiVk5DIFBhc3N3b3JkOiIgZW50cnkgYm94LgotCi0gICAgVGhpcyBpcyAqUkVRVUlSRUQqIG9uIE1hY09TWCB3aGVuIENoaWNrZW4gb2YgdGhlIFZOQyBpcyB1c2VkLCBiZWNhdXNlCi0gICAgdGhhdCB2aWV3ZXIgZG9lcyBub3QgcHV0IHVwIGEgdXNlciBwYXNzd29yZCBwcm9tcHQgd2hlbiBpdCBsZWFybnMKLSAgICB0aGF0IGEgcGFzc3dvcmQgaXMgbmVlZGVkLgotCi0gICAgT24gVW5peCAoaW5jbHVkaW5nIE1hY09TWCB1c2luZyB0aGUgWDExIHZpZXdlcikgaWYgeW91IGNob29zZSBub3QgdG8KLSAgICBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHdpbGwgc2ltcGx5IGJlIHByb21wdGVkIGZvciBpdCBpbiB0aGUgdGVybWluYWwKLSAgICB3aW5kb3cgcnVubmluZyBUaWdodFZOQyB2aWV3ZXIgaWYgb25lIGlzIHJlcXVpcmVkLgotCi0gICAgT24gV2luZG93cyBUaWdodFZOQyB2aWV3ZXIgd2lsbCBwcm9tcHQgeW91IGlmIGEgcGFzc3dvcmQgaXMgcmVxdWlyZWQuCi0KLSAgICBOT1RFOiB3aGVuIHlvdSBTYXZlIGEgVk5DIHByb2ZpbGUsIHRoZSBwYXNzd29yZCBpcyBOT1Qgc2F2ZWQgKHlvdSBuZWVkCi0gICAgdG8gZW50ZXIgaXQgZWFjaCB0aW1lKS4gIE5vciBpcyB0aGUgJ1ZlcmlmeSBBbGwgQ2VydHMnIHNldHRpbmcuCi0KLQotIFByb2ZpbGVzOgotCi0gICAgVXNlICJTYXZlIiB0byBzYXZlIGEgcHJvZmlsZSAoaS5lLiBhIGhvc3Q6ZGlzcGxheSBhbmQgaXRzIHNwZWNpZmljCi0gICAgc2V0dGluZ3MpIHdpdGggYSBuYW1lLgotCi0gICAgVG8gbG9hZCBpbiBhIHNhdmVkIE9wdGlvbnMgcHJvZmlsZSwgY2xpY2sgb24gdGhlICJMb2FkIiBidXR0b24uCi0KLSAgICBUbyBsaXN0IHlvdXIgcHJvZmlsZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHVzZTogCi0KLSAgICAgICAgc3N2bmMgLXByb2ZpbGVzICAgIChvciAtbGlzdCkKLQotICAgIFlvdSBjYW4gbGF1bmNoIHNzdm5jIGFuZCBoYXZlIGl0IGltbWVkaWF0ZWx5IGNvbm5lY3QgdG8gdGhlIHNlcnZlcgotICAgIGJ5IGludm9raW5nIGl0IHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLSAgICAgICAgc3N2bmMgcHJvZmlsZTEgICAgICAgICAgICAgIChsYXVuY2hlcyBwcm9maWxlIG5hbWVkICJwcm9maWxlMSIpCi0gICAgICAgIHNzdm5jIC9wYXRoL3RvL3Byb2ZpbGUudm5jICAobG9hZHMgdGhlIHByb2ZpbGUgZmlsZSwgbm8gbGF1bmNoaW5nKQotICAgICAgICBzc3ZuYyBob3N0bmFtZTowICAgICAgICAgICAgKGNvbm5lY3QgdG8gaG9zdG5hbWUgVk5DIGRpc3AgMCB2aWEgU1NMKQotICAgICAgICBzc3ZuYyB2bmMrc3NsOi8vaG9zdG5hbWU6MCAgKHNhbWUpCi0gICAgICAgIHNzdm5jIHZuYytzc2g6Ly9ob3N0bmFtZTowICAoY29ubmVjdCB0byBob3N0bmFtZSBWTkMgZGlzcCAwIHZpYSBTU0gpCi0KLSAgICBzZWUgdGhlIFRpcHMgNSBhbmQgNyBmb3IgbW9yZSBhYm91dCB0aGUgVVJMLWxpa2Ugc3ludGF4LgotCi0gICAgSWYgeW91IGRvbid0IHdhbnQgInNzdm5jIHByb2ZpbGUxIiB0byBpbW1lZGlhdGVseSBsYXVuY2ggdGhlIGNvbm5lY3Rpb24KLSAgICB0byB0aGUgVk5DIHNlcnZlciBzZXQgdGhlIFNTVk5DX1BST0ZJTEVfTE9BRE9OTFkgZW52LiB2YXIuIHRvIDEuCi0gICAgKG9yIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byB0aGUgcHJvZmlsZS52bmMgYXMgc2hvd24gYWJvdmUuKQotCi0KLSBTU0wgQ2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uOgotCi0gICAgKioqIElNUE9SVEFOVCAqKio6IElmIHlvdSBkbyBub3QgdGFrZSB0aGUgc3RlcHMgdG8gVkVSSUZZIHRoZSBWTkMgU2VydmVyJ3MKLSAgICBTU0wgQ2VydGlmaWNhdGUsIHlvdSBhcmUgaW4gcHJpbmNpcGxlIHZ1bG5lcmFibGUgdG8gYSBNYW4tSW4tVGhlLU1pZGRsZQotICAgIGF0dGFjay4gIFdpdGhvdXQgU1NMIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiwgb25seSBwYXNzaXZlIG5ldHdvcmsKLSAgICBzbmlmZmluZyBhdHRhY2tzIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBwcmV2ZW50ZWQuICBUaGVyZSBhcmUgaGFja2VyCi0gICAgdG9vbHMgbGlrZSBkc25pZmYvd2VibWl0bSBhbmQgY2FpbiB0aGF0IGltcGxlbWVudCBTU0wgTWFuLUluLVRoZS1NaWRkbGUKLSAgICBhdHRhY2tzLiAgVGhleSByZWx5IG9uIHRoZSBjbGllbnQgdXNlciBub3QgYm90aGVyaW5nIHRvIGNoZWNrIHRoZSBjZXJ0LgotCi0gICAgU29tZSBwZW9wbGUgbWF5IGJlIGNvbmZ1c2VkIGJ5IHRoZSBhYm92ZSBiZWNhdXNlIHRoZXkgYXJlIGZhbWlsaWFyIHdpdGgKLSAgICB0aGVpciBXZWIgQnJvd3NlciB1c2luZyBTU0wgKGkuZS4gaHR0cHM6Ly8uLi4gd2Vic2l0ZXMpIGFuZCB0aG9zZSBzaXRlcwotICAgIGFyZSBhdXRoZW50aWNhdGVkIHNlY3VyZWx5IHdpdGhvdXQgdGhlIHVzZXIncyBuZWVkIHRvIHZlcmlmeSBhbnl0aGluZwotICAgIG1hbnVhbGx5LiAgVGhlIHJlYXNvbiB3aHkgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaXMgYmVjYXVzZSAxKSB0aGVpcgotICAgIHdlYiBicm93c2VyIGNvbWVzIHdpdGggYSBidW5kbGUgb2YgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNlcnRpZmljYXRlcwotICAgIGFuZCAyKSB0aGUgaHR0cHMgc2l0ZXMgaGF2ZSBwYWlkIG1vbmV5IHRvIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyB0bwotICAgIGhhdmUgdGhlaXIgd2Vic2l0ZSBjZXJ0aWZpY2F0ZSBzaWduZWQgYnkgdGhlbS4gIFdoZW4gdXNpbmcgU1NMIGluIFZOQyB3ZQotICAgIG5vcm1hbGx5IGRvIG5vdCBkbyBzb21ldGhpbmcgdGhpcyBzb3BoaXN0aWNhdGVkLCBhbmQgc28gd2UgaGF2ZSB0byB2ZXJpZnkKLSAgICB0aGUgY2VydGlmaWNhdGVzIG1hbnVhbGx5LiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gdXNlIENlcnRpZmljYXRlCi0gICAgQXV0aG9yaXRpZXMgd2l0aCBTU1ZOQzsgdGhhdCBtZXRob2QgaXMgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgWW91IGNhbiB1c2UgdGhlICJGZXRjaCBDZXJ0IiBidXR0b24gdG8gcmV0cmlldmUgdGhlIENlcnQgYW5kIHRoZW4KLSAgICBhZnRlciB5b3UgY2hlY2sgaXQgaXMgT0sgKHNheSwgdmlhIGNvbXBhcmluZyB0aGUgTUQ1IG9yIG90aGVyIGluZm8pCi0gICAgeW91IGNhbiAiU2F2ZSIgaXQgYW5kIHVzZSBpdCB0byB2ZXJpZnkgZnV0dXJlIGNvbm5lY3Rpb25zIHRvIHNlcnZlcnMuCi0gICAgKEhvd2V2ZXIsIHNlZSB0aGUgbm90ZSBhdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiBhYm91dCBDQSBjZXJ0aWZpY2F0ZXMuKQotCi0gICAgV2hlbiAiVmVyaWZ5IEFsbCBDZXJ0cyIgaXMgY2hlY2tlZCwgdGhpcyBjaGVjayBpcyBhbHdheXMgZW5mb3JjZWQsCi0gICAgYW5kIHNvIHRoZSBmaXJzdCB0aW1lIHlvdSBjb25uZWN0IHRvIGEgbmV3IHNlcnZlciB5b3UgbWF5IG5lZWQgdG8KLSAgICBmb2xsb3cgYSBmZXcgZGlhbG9ncyB0byBpbnNwZWN0IGFuZCBzYXZlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCi0gICAgU2VlIHRoZSAiQ2VydHMuLi4gLT4gSGVscCIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBtYW5hZ2UgY2VydGlmaWNhdGVzLgotCi0gICAgIlZlcmlmeSBBbGwgQ2VydHMiIGlzIG9uIGJ5IGRlZmF1bHQuCi0KLSAgICBOb3RlLCBob3dldmVyLCAiRmV0Y2ggQ2VydCIgYW5kICJWZXJpZnkgQWxsIENlcnRzIiBhcmUgY3VycmVudGx5IGRpc2FibGVkCi0gICAgaW4gdGhlIHZlcnkgcmFyZSAiU1NIICsgU1NMIiB1c2FnZSBtb2RlIHRvIGF2b2lkIFNTSGluZyBpbiB0d2ljZS4KLSAgICBZb3UgY2FuIG1hbnVhbGx5IHNldCBhIFNlcnZlckNlcnQgb3IgQ2VydHNEaXIgaW4gdGhpcyBjYXNlIGlmIHlvdSBsaWtlLgotCi0KLSAgICBBZHZhbmNlZCBNZXRob2Q6IENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpOgotCi0gICAgSWYgeW91LCBvciB5b3VyIHNpdGUgYWRtaW5pc3RyYXRvciwgZ29lcyB0aG91Z2ggdGhlIHN0ZXBzIG9mIHNldHRpbmcgdXAKLSAgICBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIHRvIHNpZ24gdGhlIFZOQyBzZXJ2ZXIgYW5kL29yIFZOQyBjbGllbnQKLSAgICBDZXJ0cywgdGhhdCBjYW4gYmUgdXNlZCBpbnN0ZWFkIGFuZCBhdm9pZHMgdGhlIG5lZWQgdG8gbWFudWFsbHkgdmVyaWZ5Ci0gICAgZXZlcnkgY2VydCB3aGlsZSBzdGlsbCBhdXRoZW50aWNhdGluZyBldmVyeSBjb25uZWN0aW9uLiAgTW9yZSBpbmZvOgotICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC1jYQotCi0gICAgU2VlIHRoZSBjbWRsaW5lIG9wdGlvbiAtY2FjZXJ0IGZpbGUgYmVsb3cgaW4gJ1NTTCBDZXJ0aWZpY2F0ZXMnCi0gICAgZm9yIHNldHRpbmcgYSBkZWZhdWx0IFNlcnZlckNlcnQvQ0EgQ2VydC4KLQotICAgIFlvdSBtYXkgYWxzbyBJbXBvcnQgdGhlIENBIENlcnQgYW5kIHNhdmUgaXQgdG8gdGhlICdBY2NlcHRlZCBDZXJ0cycKLSAgICBkaXJlY3Rvcnkgc28gdGhlICJWZXJpZnkgQWxsIENlcnRzIiBhdXRvbWF0aWMgY2hlY2tpbmcgd2lsbCBmaW5kIGl0LgotCi0gICAgTm90ZSB0aGF0IGlmIGEgU2VydmVyIGlzIHVzaW5nIGEgQ0Egc2lnbmVkIGNlcnRpZmljYXRlIGluc3RlYWQgb2YKLSAgICBpdHMgb3duIFNlbGYtU2lnbmVkIG9uZSwgdGhlbiB0aGUgZGVmYXVsdCAiVmVyaWZ5IEFsbCBDZXJ0cy9GZXRjaCBDZXJ0IgotICAgIHNhdmluZyBtZWNoYW5pc20gd2lsbCBOT1Qgc3VjY2VlZC4gIFlvdSBtdXN0IG9idGFpbiB0aGUgQ0EgY2VydGlmaWNhdGUKLSAgICBhbmQgZXhwbGljaXRseSBzZXQgaXQgYXMgdGhlIFNlcnZlckNlcnQgb3IgSW1wb3J0IGl0IHRvIEFjY2VwdGVkIENlcnRzLgotCi0KLSBTU0wvVExTIFZhcmlhbnRzOyBWZU5DcnlwdCBhbmQgQU5PTlRMUzoKLQotICAgIFNTVk5DIGNhbiBhbHNvIGNvbm5lY3QgdG8gVk5DIFNTTC9UTFMgdmFyaWFudHM7IG5hbWVseSB0aGUgVmVOQ3J5cHQgYW5kCi0gICAgIlRMUyIgVk5DIFNlY3VyaXR5IHR5cGVzLiAgVmlubyB1c2VzIHRoZSBsYXR0ZXIgKHdlIGNhbGwgaXQgIkFOT05UTFMiKTsKLSAgICBhbmQgYSBncm93aW5nIG51bWJlciB1c2UgVmVOQ3J5cHQgKFFFTVUsIGdnaSwgdmlydC1tYW5hZ2VyLCBWZU5DcnlwdCwgWGVuLikKLQotICAgIFZpYSB0aGUgVmVOQ3J5cHQgYnJpZGdlIHRoYXQgU1NWTkMgcHJvdmlkZXMsIHRoZSBWZU5DcnlwdC9BTk9OVExTCi0gICAgc3VwcG9ydCBBTFNPIHdvcmtzIHdpdGggQU5ZIDNyZCBwYXJ0eSBWTkMgVmlld2VycyB5b3Ugc3BlY2lmeSB2aWEKLSAgICAnQ2hhbmdlIFZOQyBWaWV3ZXInIChlLmcuIFJlYWxWTkMsIFRpZ2h0Vk5DLCBVbHRyYVZOQywgZXRjLikgdGhhdCBkbwotICAgIG5vdCBkaXJlY3RseSBzdXBwb3J0IFZlTkNyeXB0IG9yIEFOT05UTFMuICBUaGlzIHdvcmtzIG9uIGFsbCBwbGF0Zm9ybXM6Ci0gICAgVW5peCwgTWFjT1NYLCBhbmQgV2luZG93cy4KLQotCi0gICAgTm90ZXMgb24gVmVOQ3J5cHQvQU5PTlRMUyBBdXRvLWRldGVjdGlvbjoKLQotICAgIElNUE9SVEFOVDogVmVOQ3J5cHQgU2VydmVyIEF1dG8tZGV0ZWN0aW9uICpPTkxZKiBvY2N1cnMgaW4gU1NMIG1vZGUKLSAgICBhbmQgd2hlbiBhbiBpbml0aWFsIGZldGNoLWNlcnQgYWN0aW9uIHRha2VzIHBsYWNlLgotCi0gICAgV2hpbGUgdGhlIGluaXRpYWwgY2VydGlmaWNhdGUgZmV0Y2ggaXMgdGFraW5nIHBsYWNlIFNTVk5DIGFwcGxpZXMKLSAgICBoZXVyaXN0aWNzIHRvIHRyeSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgVmVOQ3J5cHQgb3IgQU5PTlRMUwotICAgIHByb3RvY29sIHVzZSBieSB0aGUgVk5DIHNlcnZlci4gIFRoaXMgd2F5IGl0IGxlYXJucyB0aGF0IHRoZSBzZXJ2ZXIKLSAgICBpcyB1c2luZyBpdCBhbmQgdGhlbiBrbm93cyB0byBzd2l0Y2ggdG8gVmVOQ3J5cHQgZW5jcnlwdGVkIFNTTC9UTFMgYXQKLSAgICB0aGUgcmlnaHQgcG9pbnQuICBUaGVuIFNTVk5DIG1ha2VzIGEgc2Vjb25kICh0aGUgcmVhbCkgY29ubmVjdGlvbiB0byAKLSAgICBWTkMgc2VydmVyIGFuZCBjb25uZWN0cyB0aGUgVk5DIHZpZXdlciB0byBpdC4KLQotICAgIEluIHRoZSBkZWZhdWx0ICJWZXJpZnkgQWxsIENlcnRzIiBtb2RlLCBhIGZldGNoIGNlcnQgYWN0aW9uIGFsd2F5cwotICAgIHRha2VzIHBsYWNlLCBhbmQgc28gVmVOQ3J5cHQvQU5PTlRMUyB3aWxsIGJlIGF1dG9kZWN0ZWQuCi0KLSAgICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYW4gZXhwbGljaXQgU2VydmVyQ2VydCBvciBkaXNhYmxlZAotICAgICJWZXJpZnkgQWxsIENlcnRzIiB0aGVuIGV2ZW4gdGhvdWdoIHRoZSBpbml0aWFsIGZldGNoIGNlcnQgYWN0aW9uIGlzIG5vCi0gICAgbG9uZ2VyIG5lZWRlZCwgaXQgaXMgcGVyZm9ybWVkIGFueXdheSBiZWNhdXNlIGl0IGFsbG93cyBWZU5DcnlwdC9BTk9OVExTCi0gICAgYXV0by1kZXRlY3Rpb24uCi0KLSAgICBUbyBkaXNhYmxlZCB0aGlzIGluaXRpYWwgZmV0Y2ggKGUuZy4geW91IGtub3cgdGhlIFZOQyBzZXJ2ZXIgaXMgbm9ybWFsCi0gICAgU1NMIGFuZCBub3QgVmVOQ3J5cHQvQU5PTlRMUyBhbmQgd2FudCB0byBjb25uZWN0IG1vcmUgcXVpY2tseSkgdGhlbgotICAgIHNlbGVjdCAiRG8gbm90IFByb2JlIGZvciBWZU5DcnlwdCIgaW4gdGhlIEFkdmFuY2VkIE9wdGlvbnMgbWVudS4KLQotICAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3Uga25vdyB0aGUgVk5DIHNlcnZlciBPTkxZIHN1cHBvcnRzIFZlTkNyeXB0IG9yCi0gICAgQU5PTlRMUywgdG8gaW1wcm92ZSB0aGUgYWNjdXJhY3kgYW5kIHNwZWVkIHdpdGggd2hpY2ggdGhlIGNvbm5lY3Rpb24KLSAgICB0YWtlcyBwbGFjZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBvbmUgb3IgYm90aCBvZiB0aGUgJ1NlcnZlciB1c2VzCi0gICAgVmVOQ3J5cHQgU1NMIGVuY3J5cHRpb24nIGFuZCAnU2VydmVyIHVzZXMgQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuJwotICAgIGluIHRoZSAnQWR2YW5jZWQnIG9wdGlvbnMgcGFuZWwuICBUaGF0IHdheSBndWVzc2luZyB2aWEgYW4gaW5pdGlhbAotICAgIHByb2JlIGlzIG5vdCBuZWVkZWQgb3IgcGVyZm9ybWVkLiAgU2VlIGVhY2ggb3B0aW9ucydzIEFkdmFuY2VkIE9wdGlvbnMKLSAgICBIZWxwIGZvciBtb3JlIGluZm8uCi0KLSAgICBOb3RlIHRoYXQgaWYgeW91IGFyZSB1c2luZyBWZU5DcnlwdCBvciBBTk9OVExTIGZvciBSRVZFUlNFIGNvbm5lY3Rpb25zCi0gICAgKExpc3RlbikgdGhlbiB5b3UgKk1VU1QqIHNldCB0aGUgJ1NlcnZlciB1c2VzIFZlTkNyeXB0IFNTTCBlbmNyeXB0aW9uJwotICAgIChhbmQgdGhlIEFOT04tREggaWYgaXQgYXBwbGllcykgb3B0aW9uIGluIEFkdmFuY2VkLiAgTm90ZSBhbHNvIHRoYXQKLSAgICBSRVZFUlNFIFZlTkNyeXB0IGFuZCBBTk9OVExTIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBkbyBub3Qgd29yayBvbgotICAgIFdpbmRvd3MuCi0KLSAgICBBbHNvLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSAiVXNlIFNTSCtTU0wiIGRvdWJsZSB0dW5uZWwsIHlvdSBNVVNUIHNldAotICAgICdTZXJ2ZXIgdXNlcyBWZU5DcnlwdCBTU0wgZW5jcnlwdGlvbicgKGFuZCB0aGUgQU5PTi1ESCBpZiBpdCBhcHBsaWVzKQotICAgIGJlY2F1c2UgdGhlIGluaXRpYWwgZmV0Y2ggY2VydCBpcyBkaXNhYmxlZCBpbiBTU0grU1NMIG1vZGUuCi0KLQotIERlY2lwaGVyaW5nIFNTTCBOZWdvdGlhdGlvbiBTdWNjZXNzIG9yIEZhaWx1cmU6Ci0KLSAgICBTaW5jZSBTU1ZOQyBpcyBhICJnbHVlIHByb2dyYW0iLCBpbiB0aGlzIGNhc2UgZ2x1aW5nIFZOQ1ZpZXdlciBhbmQgc3R1bm5lbAotICAgIHRvZ2V0aGVyICh3aXRoIHBvc3NpYmx5IGEgcHJveHkgaGVscGVyKSByZXBvcnRpbmcgaXMgY2x1bXN5IGF0IGJlc3QuCi0gICAgKEluIFNTSCBlbmNyeXB0aW9uIG1vZGUsIGl0IGdsdWVzIHRvIHNzaCBpbnN0ZWFkIG9mIHN0dW5uZWwuKSAgSW4gbW9zdAotICAgIGNhc2VzIHRoZSBwcm9ncmFtcyBiZWluZyAiZ2x1ZWQiIGFyZSBydW4gaW4gYSB0ZXJtaW5hbCB3aW5kb3cgd2hlcmUgeW91Ci0gICAgY2FuIHNlZSB0aGUgcHJvZ3JhbSdzIG91dHB1dC4gIE9uIFdpbmRvd3MgeW91IHdpbGwgbmVlZCB0byBkb3VibGUgY2xpY2sKLSAgICBvbiB0aGUgc3R1bm5lbCB0cmF5IGljb24gdG8gdmlldyBpdHMgbG9nLgotCi0gICAgQWx0aG91Z2ggdGhlIG91dHB1dCBpcyBxdWl0ZSBjcnlwdGljLCB5b3UgYXJlIGVuY291cmFnZWQgdG8gbGVhcm4gdG8KLSAgICByZWNvZ25pemUgc29tZSBvZiB0aGUgZXJyb3JzIHJlcG9ydGVkIGluIGl0LgotCi0gICAgSGVyZSBpcyBzdHVubmVsIG91dHB1dCBmb3IgYSBjYXNlIG9mIHN1Y2Nlc3NmdWxseSB2ZXJpZnlpbmcgdGhlIFZOQwotICAgIFNlcnZlcidzIENlcnRpZmljYXRlOgotCi0gICAgICAyMDA4LjExLjIwIDA4OjA5OjM5IExPRzVbMTQ3Ml06IFZFUklGWSBPSzogZGVwdGg9MCwgL0M9QVUvTD0uLi4KLSAgICAgIDIwMDguMTEuMjAgMDg6MDk6MzkgTE9HNlsxNDcyXTogU1NMIGNvbm5lY3RlZDogbmV3IHNlc3Npb24gbmVnb3RpYXRlZAotICAgICAgMjAwOC4xMS4yMCAwODowOTozOSBMT0c2WzE0NzJdOiBOZWdvdGlhdGVkIGNpcGhlcnM6IEFFUzI1Ni1TSEEgU1NMdjMgLi4uCi0KLSAgICBIZXJlIGlzIGEgY2FzZSB3aGVyZSB0aGUgU2VydmVyJ3MgQ2VydCBkaWQgbm90IG1hdGNoIHRoZSBTZXJ2ZXJDZXJ0Ci0gICAgd2Ugc2V0OgotCi0gICAgICAyMDA4LjExLjIwIDA4OjEyOjMxIExPRzRbMTY2Ml06IFZFUklGWSBFUlJPUjogZGVwdGg9MCwgZXJyb3I9c2VsZiAuLi4KLSAgICAgIDIwMDguMTEuMjAgMDg6MTI6MzEgTE9HM1sxNjYyXTogU1NMX2Nvbm5lY3Q6IDE0MDkwMDg2OiBlcnJvcjoxNDA5MDA4NjpTU0wKLSAgICAgICAgICAgcm91dGluZXM6U1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFOmNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQKLQotICAgIEhlcmUgaXMgYSBjYXNlIHdoZXJlIHRoZSBTZXJ2ZXIncyBDZXJ0IGhhcyBleHBpcmVkOgotCi0gICAgICAyMDA5LjEyLjI3IDEyOjIwOjI1IExPRzRbMjU1MDBdOiBWRVJJRlkgRVJST1I6IGRlcHRoPTAsIGVycm9yPWNlcnRpZmljYXRlCi0gICAgICAgICAgIGhhcyBleHBpcmVkOiAvQz1BVS9MPS4uLgotICAgICAgMjAwOS4xMi4yNyAxMjoyMDoyNSBMT0czWzI1NTAwXTogU1NMX2Nvbm5lY3Q6IDE0MDkwMDg2OiBlcnJvcjoxNDA5MDA4NjpTU0wKLSAgICAgICAgICAgcm91dGluZXM6U1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFOmNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQKLQotCi0gICAgSWYgeW91IGRpc2FibGUgIlZlcmlmeSBBbGwgQ2VydHMiIGFuZCBkbyBub3Qgc3VwcGx5IGEgU2VydmVyQ2VydCwKLSAgICB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gJ1ZFUklGWSAuLi4nIGluIHRoZSBvdXRwdXQgYmVjYXVzZSB0aGUgU1NWTkMKLSAgICBzdHVubmVsIGFjY2VwdHMgdGhlIHNlcnZlcidzIGNlcnQgd2l0aG91dCBxdWVzdGlvbiAodGhpcyBpcyBpbnNlY3VyZS4pCi0KLSAgICBBbHNvIGluIHRoZSBvdXRwdXQgd2lsbCBiZSBtZXNzYWdlcyBhYm91dCB3aGV0aGVyIHRoZSBTU0wgVk5DIHNlcnZlcgotICAgIHJlamVjdGVkIHlvdXIgY29ubmVjdGlvbiBiZWNhdXNlIGl0IHJlcXVpcmVzIHlvdSB0byBhdXRoZW50aWNhdGUKLSAgICB5b3Vyc2VsZiB3aXRoIGEgY2VydGlmaWNhdGUgKE15Q2VydCkuICBIZXJlIGlzIHRoZSBjYXNlIHdoZW4geW91Ci0gICAgc3VwcGxpZWQgbm8gTXlDZXJ0OgotCi0gICAgICAyMDA4LjExLjIwIDA4OjE2OjI5IExPRzNbMTc0Nl06IFNTTF9jb25uZWN0OiAxNDA5NDQxMDogZXJyb3I6MTQwOTQ0MTA6Ci0gICAgICAgICAgU1NMIHJvdXRpbmVzOlNTTDNfUkVBRF9CWVRFUzpzc2x2MyBhbGVydCBoYW5kc2hha2UgZmFpbHVyZQotCi0gICAgb3IgeW91IHVzZWQgYSBjZXJ0aWZpY2F0ZSB0aGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplOgotCi0gICAgICAyMDA4LjExLjIwIDA4OjE4OjQ2IExPRzNbMTc4Ml06IFNTTF9jb25uZWN0OiAxNDA5NDQxMjogZXJyb3I6MTQwOTQ0MTI6Ci0gICAgICAgICAgU1NMIHJvdXRpbmVzOlNTTDNfUkVBRF9CWVRFUzpzc2x2MyBhbGVydCBiYWQgY2VydGlmaWNhdGUKLQotICAgIG9yIHlvdXIgY2VydGlmaWNhdGUgaGFzIGJlZW4gcmV2b2tlZDoKLQotICAgICAyMDA4LjExLjIwIDA4OjIwOjA4IExPRzNbMTkxM106IFNTTF9jb25uZWN0OiAxNDA5NDQxNDogZXJyb3I6MTQwOTQ0MTQ6Ci0gICAgICAgICBTU0wgcm91dGluZXM6U1NMM19SRUFEX0JZVEVTOnNzbHYzIGFsZXJ0IGNlcnRpZmljYXRlIHJldm9rZWQKLQotCi0gU1NIOgotCi0gICAgQ2xpY2sgb24gIlVzZSBTU0giIGlmIHlvdSB3YW50IHRvIHVzZSBhbiAqU1NIKiB0dW5uZWwgaW5zdGVhZCBvZiBTU0wKLSAgICAodGhlbiB0aGUgVk5DIFNlcnZlciBkb2VzIG5vdCBuZWVkIHRvIHNwZWFrIFNTTCBvciB1c2UgU1RVTk5FTCBvciBzb2NhdCkuCi0KLSAgICBZb3Ugd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gbG9naW4gdG8geW91ciBhY2NvdW50IG9uIHRoZSByZW1vdGUgaG9zdAotICAgIHZpYSBTU0ggKGUuZy4gdmlhIHBhc3N3b3JkLCBzc2gga2V5cywgb3Igc3NoLWFnZW50KS4KLQotICAgIFNwZWNpZnkgdGhlIFNTSCBob3N0bmFtZSBhbmQgVk5DIGRpc3BsYXkgaW4gdGhlIFZOQyBIb3N0OkRpc3BsYXkgZW50cnkuCi0gICAgVXNlIHNvbWV0aGluZyBsaWtlOgotCi0gICAgICAgICAgIHVzZXJuYW1lQGZhci1hd2F5LmVhc3Q6MAotCi0gICAgaWYgeW91ciByZW1vdGUgdXNlcm5hbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBvbiB0aGUgbG9jYWwgdmlld2VyCi0gICAgbWFjaGluZS4KLQotICAgIE9uIFdpbmRvd3MgeW91ICpNVVNUKiBzdXBwbHkgdGhlICJ1c2VybmFtZUAiIHBhcnQgYmVjYXVzZSBQdXR0eS9QbGluawotICAgIG5lZWRzIGl0IHRvIHdvcmsgY29ycmVjdGx5LgotCi0gICAgIlNTSCArIFNTTCIgaXMgc2ltaWxhciBidXQgaXRzIHVzZSBpcyBtb3JlIHJhcmUgYmVjYXVzZSBpdCByZXF1aXJlcyAyCi0gICAgZW5jcnlwdGVkIHR1bm5lbHMgdG8gcmVhY2ggdGhlIFZOQyBzZXJ2ZXIuIFNlZSB0aGUgSGVscCB1bmRlciBPcHRpb25zCi0gICAgZm9yIG1vcmUgaW5mby4KLQotICAgIFRvIGNvbm5lY3QgdG8gYSBub24tc3RhbmRhcmQgU1NIIHBvcnQsIHNlZSBTU0ggUHJveGllcy9HYXRld2F5cyBzZWN0aW9uLgotCi0gICAgU2VlIFRpcCA4KSBmb3IgaG93IHRvIG1ha2UgdGhpcyBhcHBsaWNhdGlvbiBiZSBTU0gtb25seSB3aXRoIHRoZSAtc3NoCi0gICAgY29tbWFuZCBsaW5lIG9wdGlvbiBvciAic3Nodm5jIi4KLQotICAgIElmIHlvdSBmaW5kIHlvdXJzZWxmIGluIHRoZSB1bmZvcnR1bmF0ZSBjaXJjdW1zdGFuY2UgdGhhdCB5b3VyIHNzaCAKLSAgICB1c2VybmFtZSBoYXMgYSBzcGFjZSBpbiBpdCwgdXNlICVTUEFDRSAob3IgJVRBQikgbGlrZSB0aGlzOgotCi0gICAgICAgICAgIGZyZWQlU1BBQ0VmbGludHN0b25lQHh5enp5Lm5ldDowCi0KLSBSZW1vdGUgU1NIIENvbW1hbmQ6Ci0KLSAgICBJbiBTU0ggb3IgU1NIICsgU1NMIG1vZGUgeW91IGNhbiBhbHNvIHNwZWNpZnkgYSByZW1vdGUgY29tbWFuZCB0byBydW4KLSAgICBvbiB0aGUgcmVtb3RlIHNzaCBob3N0IGluIHRoZSAiUmVtb3RlIFNTSCBDb21tYW5kIiBlbnRyeS4gIFRoZSBkZWZhdWx0Ci0gICAgaXMganVzdCB0byBzbGVlcCBhIGJpdCAoZS5nLiBzbGVlcCAxNSkgdG8gbWFrZSBzdXJlIHRoZSB0dW5uZWwgcG9ydHMKLSAgICBhcmUgZXN0YWJsaXNoZWQuICBBbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCBoYXZlIHRoZSByZW1vdGUgY29tbWFuZCBzdGFydAotICAgIHRoZSBWTkMgc2VydmVyLCBlLmcuCi0KLSAgICAgICAgIHgxMXZuYyAtZGlzcGxheSA6MCAtcmZicG9ydCA1OTAwIC1sb2NhbGhvc3QgLW5vcHcKLQotICAgIFdoZW4gc3RhcnRpbmcgdGhlIFZOQyBzZXJ2ZXIgdGhpcyB3YXksIG5vdGUgdGhhdCBzb21ldGltZXMgeW91IHdpbGwgbmVlZAotICAgIHRvIGNvcnJlbGF0ZSB0aGUgVk5DIERpc3BsYXkgbnVtYmVyIHdpdGggdGhlICItcmZicG9ydCIgKG9yIHNpbWlsYXIpCi0gICAgb3B0aW9uIG9mIHRoZSBzZXJ2ZXIuICBFLmcuIGZvciBWTkMgZGlzcGxheSA6MgotCi0gICAgICAgICBWTkMgSG9zdDpEaXNwbGF5ICAgICAgIHVzZXJuYW1lQHNvbWVob3N0LmNvbToyCi0gICAgICAgICBSZW1vdGUgU1NIIENvbW1hbmQ6ICAgIHgxMXZuYyAtZmluZCAtcmZicG9ydCA1OTAyIC1ub3B3Ci0KLSAgICBTZWUgdGhlIFRpcCAxOCkgZm9yIHVzaW5nIHgxMXZuYyBQT1JUPU5OTk4gZmVhdHVyZSAob3Igdm5jc2VydmVyKDEpCi0gICAgb3V0cHV0KSB0byBub3QgbmVlZCB0byBzcGVjaWZ5IHRoZSBWTkMgZGlzcGxheSBudW1iZXIgb3IgdGhlIHgxMXZuYwotICAgIC1yZmJwb3J0IG9wdGlvbi4KLQotICAgIFdpbmRvd3MgU1NIIFNFUlZFUjogaWYgeW91IGFyZSBzc2gnaW5nIElOVE8gV2luZG93cyAoZS5nLiBDWUdXSU4gU1NIRAotICAgIHNlcnZlcikgdGhlcmUgbWF5IGJlIG5vICJzbGVlcCIgY29tbWFuZCBzbyBwdXQgaW4gc29tZXRoaW5nIGxpa2UKLSAgICAicGluZyBsb2NhbGhvc3QiIG9yICJwaW5nIC1uIDEwIC13IDEwMDAgbG9jYWxob3N0IiB0byBzZXQgYSBzaG9ydAotICAgIGRlbGF5IHRvIGxldCB0aGUgdHVubmVsIHBvcnRzIGdldCBlc3RhYmxpc2hlZC4KLQotCi0gU1NMIENlcnRpZmljYXRlczoKLQotICAgIElmIHlvdSB3YW50IHRvIHVzZSBhIFNTTCBDZXJ0aWZpY2F0ZSAoUEVNKSBmaWxlIHRvIGF1dGhlbnRpY2F0ZSBZT1VSU0VMRiB0bwotICAgIHRoZSBWTkMgc2VydmVyICgiTXlDZXJ0IikgYW5kL29yIHRvIHZlcmlmeSB0aGUgaWRlbnRpdHkgb2YgdGhlIFZOQyBTZXJ2ZXIKLSAgICAoIlNlcnZlckNlcnQiIG9yICJDZXJ0c0RpciIpIHNlbGVjdCB0aGUgY2VydGlmaWNhdGUgZmlsZSBieSBjbGlja2luZyB0aGUKLSAgICAiQ2VydHMgLi4uIiBidXR0b24gYmVmb3JlIGNvbm5lY3RpbmcuCi0KLSAgICBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgbmVlZGVkIHRvIHByZXZlbnQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrczsKLSAgICBpZiBpdCBpcyBub3QgZG9uZSB0aGVuIG9ubHkgcGFzc2l2ZSBuZXR3b3JrIHNuaWZmaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZC4KLSAgICBUaGVyZSBhcmUgaGFja2VyIHRvb2xzIGxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4gdGhhdCBpbXBsZW1lbnQgU1NMCi0gICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIFRoZXkgcmVseSBvbiB0aGUgY2xpZW50IHVzZXIgbm90IGJvdGhlcmluZyB0bwotICAgIGNoZWNrIHRoZSBjZXJ0LgotCi0KLSAgICBTZWUgdGhlIHgxMXZuYyBkb2N1bWVudGF0aW9uOgotCi0gICAgICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3NsLmh0bWwKLQotICAgIGZvciBob3cgdG8gY3JlYXRlIGFuZCB1c2UgUEVNIFNTTCBjZXJ0aWZpY2F0ZSBmaWxlcy4gIEFuIGVhc3kgd2F5IGlzOgotCi0gICAgICAgICAgIHgxMXZuYyAtc3NsIFNBVkUgLi4uCi0KLSAgICB3aGVyZSBpdCB3aWxsIHByaW50IG91dCBpdHMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgY2VydGlmaWNhdGUgdG8gdGhlCi0gICAgc2NyZWVuIGFuZCB0aGF0IGNhbiBiZSBjb3BpZWQgc2FmZWx5IHRvIHRoZSB2aWV3ZXIgc2lkZS4KLQotICAgIFlvdSBjYW4gYWxzbyB1c2UgdGhlICJDcmVhdGUgQ2VydGlmaWNhdGUiIGZlYXR1cmUgb2YgdGhpcyBwcm9ncmFtIHVuZGVyCi0gICAgIkNlcnRzIC4uLiIuICBKdXN0IGNsaWNrIG9uIGl0IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgZGlhbG9nLgotICAgIFRoZW4gY29weSB0aGUgY2VydCBmaWxlIHRvIHRoZSBWTkMgU2VydmVyIGFuZCBzcGVjaWZ5IHRoZSBvdGhlciBvbmUgaW4KLSAgICB0aGUgIkNlcnRzIC4uLiIgZGlhbG9nLgotCi0gICAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSB0aGUgIkltcG9ydCBDZXJ0aWZpY2F0ZSIgYWN0aW9uIHRvIHBhc3RlIGluIGEKLSAgICBjZXJ0aWZpY2F0ZSBvciByZWFkIG9uZSBpbiBmcm9tIGEgZmlsZS4gIE9yIHlvdSBjYW4gdXNlIHRoZSAiRmV0Y2ggQ2VydCIKLSAgICBidXR0b24gb24gdGhlIG1haW4gcGFuZWwuICBJZiAiVmVyaWZ5IEFsbCBDZXJ0cyIgaXMgY2hlY2tlZCwgeW91IHdpbGwKLSAgICBiZSBmb3JjZWQgdG8gY2hlY2sgQ2VydHMgb2YgYW55IG5ldyBzZXJ2ZXJzIHRoZSBmaXJzdCB0aW1lIHlvdSBjb25uZWN0LgotCi0gICAgTm90ZSB0aGF0ICJWZXJpZnkgQWxsIENlcnRzIiBpcyBvbiBieSBkZWZhdWx0IHNvIHRoYXQgdXNlcnMgd2hvIGRvIG5vdAotICAgIHVuZGVyc3RhbmQgdGhlIFNTTCBNYW4tSW4tVGhlLU1pZGRsZSBwcm9ibGVtIHdpbGwgbm90IGJlIGxlZnQgY29tcGxldGVseQotICAgIHZ1bG5lcmFibGUgdG8gaXQgKGV2ZXJ5b25lIHN0aWxsIG11c3QgbWFrZSB0aGUgZWZmb3J0IHRvIHZlcmlmeSBuZXcKLSAgICBjZXJ0aWZpY2F0ZXMgYnkgYW4gZXh0ZXJuYWwgbWV0aG9kIHRvIGJlIGNvbXBsZXRlbHkgc2FmZSkuCi0KLSAgICBUbyBoYXZlICJWZXJpZnkgQWxsIENlcnRzIiB0b2dnbGVkIG9mZiBhdCBzdGFydHVwLCB1c2UgInNzdm5jIC1udiIgb3IKLSAgICBzZXQgU1NWTkNfTk9fVkVSSUZZX0FMTD0xIGJlZm9yZSBzdGFydGluZy4gIElmIHlvdSBkbyBub3QgZXZlbiB3YW50IHRvCi0gICAgc2VlIHRoZSBidXR0b24sIHVzZSAic3N2bmMgLW52YiIgb3IgU1NWTkNfTk9fVkVSSUZZX0FMTF9CVVRUT049MS4KLQotICAgIFVzZSB0aGUgIi1teWNlcnQgZmlsZSIgb3B0aW9uIChzYW1lIGFzICItY2VydCBmaWxlIikgdG8gc2V0IGEgZGVmYXVsdAotICAgIE15Q2VydC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgIm15Y2VydD1maWxlIiAoYWxzbyAiY2VydD1maWxlIikgaW4gdGhlCi0gICAgfi8uc3N2bmNyYyBmaWxlLiAgU2VlIENlcnRzIC0+IEhlbHAgZm9yIG1vcmUgaW5mby4KLQotICAgIFVzZSB0aGUgIi1jYWNlcnQgZmlsZSIgb3B0aW9uIChzYW1lIGFzICItY2EgZmlsZSIpIHRvIHNldCBhIGRlZmF1bHQKLSAgICBTZXJ2ZXJDZXJ0IChvciBDQSkuICBUaGlzIGlzIHRoZSBzYW1lIGFzICJjYWNlcnQ9ZmlsZSIgKGFsc28gImNhPWZpbGUiKQotICAgIGluIHRoZSB+Ly5zc3ZuY3JjIGZpbGUuICBTZWUgQ2VydHMgLT4gSGVscCBmb3IgbW9yZSBpbmZvLgotCi0gICAgVXNlIHRoZSAiLWNybCBmaWxlIiBvcHRpb24gdG8gc2V0IGEgZGVmYXVsdCBDUkwgRmlsZS4gIFRoaXMgaXMgdGhlIHNhbWUKLSAgICBhcyAiY3JsPWZpbGUiIGluIHRoZSB+Ly5zc3ZuY3JjIGZpbGUuICBTZWUgQ2VydHMgLT4gSGVscCBmb3IgbW9yZSBpbmZvLgotCi0gICAgUHJlZml4IGFueSBvZiB0aGVzZSBmaWxlcyB3aXRoICJGT1JDRToiIHRvIG1ha2UgdGhlbSBpbW11dGFibGUuCi0KLQotCi0gTW9yZSBPcHRpb25zOgotCi0gICAgVG8gc2V0IG90aGVyIE9wdGlvbnMsIGUuZy4gZm9yIFZpZXctT25seSB1c2FnZSBvciB0byBsaW1pdCB0aGUgbnVtYmVyCi0gICAgb2YgY29sb3JzIHVzZWQsIGNsaWNrIG9uIHRoZSAiT3B0aW9ucyAuLi4iIGJ1dHRvbiBhbmQgcmVhZCB0aGUgSGVscCB0aGVyZS4KLQotIE1vcmUgSW5mbzoKLQotICAgIFByZXNzIHRoZSAnUHJveGllcycsICdNaXNjJywgYW5kICdUaXBzJyBidXR0b25zIGJlbG93LgotCi0gICAgU2VlIGFsc28gdGhlc2UgbGlua3MgZm9yIG1vcmUgaW5mb3JtYXRpb246Ci0KLSAgICAgICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc3NsLXR1bm5lbC1leHQKLSAgICAgICAgaHR0cDovL3N0dW5uZWwubWlydC5uZXQKLSAgICAgICAgaHR0cDovL3d3dy50aWdodHZuYy5jb20KLX0KLQotCXNldCBoZWxwX21pc2MgewotIFdpbmRvd3MgU1RVTk5FTCBwcm9ibGVtczoKLQotICAgIE5vdGUgdGhhdCBvbiBXaW5kb3dzIHdoZW4gdGhlIFZpZXdlciBjb25uZWN0aW9uIGlzIGZpbmlzaGVkIGJ5IGRlZmF1bHQKLSAgICBTU1ZOQyB3aWxsIHRyeSB0byBraWxsIHRoZSBTVFVOTkVMIHByb2Nlc3MgZm9yIHlvdS4KLQotICAgIElmIE9wdGlvbnMgLT4gS2lsbCBTdHVubmVsIEF1dG9tYXRpY2FsbHkgaXMgbm90IHNldCB5b3Ugd2lsbCBiZQotICAgIHByb21wdGVkIGlmIHlvdSB3YW50IFNTVk5DIHRvIHRyeSB0byBraWxsIHRoZSBTVFVOTkVMIHByb2Nlc3MgZm9yIHlvdS4KLSAgICBVc3VhbGx5IHlvdSB3aWxsIHNheSBZZXMsIGhvd2V2ZXIgaWYgdGhlcmUgYXJlIHByb2JsZW1zIGNvbm5lY3RpbmcKLSAgICB5b3UgbWF5IHdhbnQgdG8gbG9vayBhdCB0aGUgU1RVTk5FTCBMb2cgZmlyc3QuCi0KLSAgICBCZWZvcmUgaXQgaXMga2lsbGVkLCBkb3VibGUgY2xpY2tpbmcgdGhlIFNUVU5ORUwgdHJheSBpY29uIChkYXJrIGdyZWVuKQotICAgIHdpbGwgc2hvdyB5b3UgaXRzIExvZyBmaWxlICh1c2VmdWwgZm9yIGRlYnVnZ2luZyBjb25uZWN0aW9uIHByb2JsZW1zKS4KLQotICAgIEV2ZW4gdGhvdWdoIFNTVk5DIHdpbGwga2lsbCB0aGUgU1RVTk5FTCBwcm9jZXNzIGZvciB5b3UsIHlvdSB3aWxsCi0gICAgc3RpbGwgbmVlZCB0byBtb3ZlIHRoZSBtb3VzZSBvdmVyIHRoZSBpY29uIHRvIG1ha2UgdGhlIGxpdHRsZSBwaWN0dXJlCi0gICAgZ28gYXdheSEhISAgVGhpcyBpcyB1bmZvcnR1bmF0ZSBidXQgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHdheQotICAgIHRvIGF2b2lkIGl0LgotCi0gICAgSW4gc29tZSBjYXNlcyB5b3UgbWF5IG5lZWQgdG8gdGVybWluYXRlIFNUVU5ORUwgbWFudWFsbHkgZnJvbSB0aGUgU3lzdGVtCi0gICAgVHJheSAocmlnaHQgY2xpY2sgb24gZGFyayBncmVlbiBpY29uKSBhbmQgc2VsZWN0aW5nICJFeGl0Ii4KLQotICAgIFVzZSAtbm9raWxsc3R1bm5lbCBvciBraWxsc3R1bm5lbD0wIGluIH4vLnNzdm5jcmMgdG8gaGF2ZSBTU1ZOQwotICAgIHN0YXJ0IHVwIHdpdGggc3R1bm5lbCBraWxsaW5nIGRpc2FibGVkLgotCi0gVW50cnVzdGVkIExvY2FsIFVzZXJzOgotCi0gICAgKklNUE9SVEFOVCBXQVJOSU5HKjogIElmIHlvdSBydW4gU1NWTkMgb24gYSB3b3Jrc3RhdGlvbiBvciBjb21wdXRlcgotICAgIHRoYXQgb3RoZXIgdXNlcnMgY2FuIGxvZyBpbnRvIGFuZCB5b3UgRE8gTk9UIFRSVVNUIHRoZXNlIHVzZXJzCi0gICAgKGl0IGlzIGEgc2hhbWUgYnV0IHNvbWV0aW1lcyBvbmUgaGFzIHRvIHdvcmsgaW4gYW4gZW52aXJvbm1lbnQgbGlrZQotICAgIHRoaXMpLCB0aGVuIHBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgd2FybmluZy4KLQotICAgIEJ5ICdkbyBub3QgdHJ1c3QnIHdlIG1lYW4gdGhleSBtaWdodCB0cnkgdG8gZ2FpbiBhY2Nlc3MgdG8gcmVtb3RlCi0gICAgbWFjaGluZXMgeW91IGNvbm5lY3QgdG8gdmlhIFNTVk5DLiAgTm90ZSB0aGF0IGFuIHVudHJ1c3RlZCBsb2NhbAotICAgIHVzZXIgY2FuIG9mdGVuIG9idGFpbiByb290IGFjY2VzcyBpbiBhIHNob3J0IGFtb3VudCBvZiB0aW1lOyBpZiBhCi0gICAgdXNlciBoYXMgYWNoaWV2ZWQgdGhhdCwgdGhlbiBhbGwgYmV0cyBhcmUgb2ZmIGZvciBBTllUSElORyB0aGF0IHlvdQotICAgIGRvIG9uIHRoZSB3b3Jrc3RhdGlvbi4gIEl0IGlzIGJlc3QgdG8gZ2V0IHJpZCBvZiBVbnRydXN0ZWQgTG9jYWwKLSAgICBVc2VycyBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi0gICAgQm90aCB0aGUgU1NMIGFuZCBTU0ggdHVubmVscyBzZXQgdXAgYnkgU1NWTkMgbGlzdGVuIG9uIGNlcnRhaW4gcG9ydHMKLSAgICBvbiB0aGUgJ2xvY2FsaG9zdCcgYWRkcmVzcyBhbmQgcmVkaXJlY3QgVENQIGNvbm5lY3Rpb25zIHRvIHRoZSByZW1vdGUKLSAgICBtYWNoaW5lOyB1c3VhbGx5IHRoZSBWTkMgc2VydmVyIHJ1bm5pbmcgdGhlcmUgKGJ1dCBpdCBjb3VsZCBhbHNvIGJlCi0gICAgYW5vdGhlciBzZXJ2aWNlLCBlLmcuIENVUFMgcHJpbnRpbmcpLiAgVGhlc2UgYXJlIHRoZSBzdHVubmVsKDgpIFNTTAotICAgIHJlZGlyZWN0aW9uIGFuZCB0aGUgc3NoKDEpICctTCcgcG9ydCByZWRpcmVjdGlvbi4gIEJlY2F1c2UgJ2xvY2FsaG9zdCcKLSAgICBpcyB1c2VkIG9ubHkgdXNlcnMgb3IgcHJvZ3JhbXMgb24gdGhlIHNhbWUgd29ya3N0YXRpb24gdGhhdCBpcwotICAgIHJ1bm5pbmcgU1NWTkMgY2FuIGNvbm5lY3QgdG8gdGhlc2UgcG9ydHMsIGhvd2V2ZXIgdGhpcyBpbmNsdWRlcyBhbnkKLSAgICBsb2NhbCB1c2VycyAobm90IGp1c3QgdGhlIHVzZXIgcnVubmluZyBTU1ZOQy4pCi0KLSAgICBJZiB0aGUgdW50cnVzdGVkIGxvY2FsIHVzZXIgdHJpZXMgdG8gY29ubmVjdCB0byB0aGVzZSBwb3J0cywgaGUgbWF5Ci0gICAgc3VjY2VlZCBieSB2YXJ5aW5nIGRlZ3JlZXMgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLgotICAgIFdlIG5vdyBsaXN0IHNvbWUgc2FmZWd1YXJkcyBvbmUgY2FuIHB1dCBpbiBwbGFjZSB0byB0cnkgdG8gbWFrZSB0aGlzCi0gICAgbW9yZSBkaWZmaWN1bHQgdG8gYWNoaWV2ZS4KLQotICAgIEl0IHByb2JhYmx5IHBheXMgdG8gaGF2ZSB0aGUgVk5DIHNlcnZlciByZXF1aXJlIGEgcGFzc3dvcmQsIGV2ZW4KLSAgICB0aG91Z2ggdGhlcmUgaGFzIGFscmVhZHkgYmVlbiBTU0wgb3IgU1NIIGF1dGhlbnRpY2F0aW9uICh2aWEKLSAgICBjZXJ0aWZpY2F0ZXMgb3IgcGFzc3dvcmRzKS4gIEluIGdlbmVyYWwgaWYgdGhlIFZOQyBTZXJ2ZXIgcmVxdWlyZXMKLSAgICBTU0wgYXV0aGVudGljYXRpb24gb2YgdGhlIHZpZXdlciB0aGF0IGhlbHBzLCB1bmxlc3MgdGhlIHVudHJ1c3RlZAotICAgIGxvY2FsIHVzZXIgaGFzIGdhaW5lZCBhY2Nlc3MgdG8geW91ciBTU1ZOQyBjZXJ0aWZpY2F0ZSBrZXlzLgotCi0gICAgSWYgdGhlIFZOQyBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBvbmx5IGFsbG93IG9uZSB2aWV3ZXIgY29ubmVjdGlvbgotICAgIGF0IGEgdGltZSwgdGhlbiB0aGUgd2luZG93IG9mIG9wcG9ydHVuaXR5IHRoYXQgdGhlIHVudHJ1c3RlZCBsb2NhbAotICAgIHVzZXIgY2FuIHVzZSBpcyBncmVhdGx5IHJlZHVjZWQ6IGhlIG1pZ2h0IG9ubHkgaGF2ZSBhIHNlY29uZCBvciB0d28KLSAgICBiZXR3ZWVuIHRoZSB0dW5uZWwgYmVpbmcgc2V0IHVwIGFuZCB0aGUgU1NWTkMgdm5jdmlld2VyIGNvbm5lY3RpbmcKLSAgICB0byBpdCAoaS5lLiBpZiB0aGUgVk5DIHNlcnZlciBvbmx5IGFsbG93cyBhIHNpbmdsZSBjb25uZWN0aW9uLCB0aGUKLSAgICB1bnRydXN0ZWQgbG9jYWwgdXNlciBjYW5ub3QgY29ubmVjdCBvbmNlIHlvdXIgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCkuCi0gICAgU2ltaWxhcmx5LCB3aGVuIHlvdSBkaXNjb25uZWN0IHRoZSB0dW5uZWwgaXMgdG9ybiBkb3duIHF1aWNrbHkgYW5kCi0gICAgdGhlcmUgaXMgbGl0dGxlIG9yIG5vIHdpbmRvdyBvZiBvcHBvcnR1bml0eSB0byBjb25uZWN0IChlLmcuIHgxMXZuYwotICAgIGluIGl0cyBkZWZhdWx0IG1vZGUgZXhpdHMgYWZ0ZXIgdGhlIGZpcnN0IGNsaWVudCBkaXNjb25uZWN0cykuCi0KLSAgICBBbHNvIGZvciBTU0wgdHVubmVsbGluZyB3aXRoIHN0dW5uZWwoOCkgb24gVW5peCB1c2luZyBvbmUgb2YgdGhlIFNTVk5DCi0gICAgcHJlYnVpbHQgJ2J1bmRsZXMnLCBhIHBhdGNoZWQgc3R1bm5lbCBpcyBwcm92aWRlZCB0aGF0IGRlbmllcyBhbGwKLSAgICBjb25uZWN0aW9ucyBhZnRlciB0aGUgZmlyc3Qgb25lLCBhbmQgZXhpdHMgd2hlbiB0aGUgZmlyc3Qgb25lIGNsb3Nlcy4KLSAgICBUaGlzIGlzIG5vdCB0cnVlIGlmIHRoZSBzeXN0ZW0gaW5zdGFsbGVkIHN0dW5uZWwoOCkgaXMgdXNlZCBhbmQgaXMKLSAgICBub3QgdHJ1ZSB3aGVuIHVzaW5nIFNTVk5DIG9uIFdpbmRvd3MuCi0KLSAgICBUaGUgZm9sbG93aW5nIGFyZSBleHBlcmltZW50YWwgZmVhdHVyZXMgdGhhdCBhcmUgYWRkZWQgdG8gU1NWTkMgdG8KLSAgICBpbXByb3ZlIHRoZSBzaXR1YXRpb24gZm9yIHRoZSBTU0wvc3R1bm5lbCBhbmQgU1NIIGNhc2VzLiAgU2V0IHRoZW0KLSAgICB2aWEgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiAiU1RVTk5FTCBMb2NhbCBQb3J0IFByb3RlY3Rpb25zIiBvcgotICAgICJTU0ggTG9jYWwgUG9ydCBQcm90ZWN0aW9ucyIuCi0KLSAgICBTVFVOTkVMOgotCi0gICAgMSkgRm9yIFNTTCB0dW5uZWxsaW5nIHdpdGggc3R1bm5lbCg4KSBvbiBVbml4IHRoZXJlIGlzIGEgc2V0dGluZwotICAgICAgICdVc2Ugc3R1bm5lbCBFWEVDIG1vZGUnIHRoYXQgd2lsbCB0cnkgdG8gZXhlYygyKSBzdHVubmVsCi0gICAgICAgaW5zdGVhZCBvZiB1c2luZyBhIGxpc3RlbmluZyBzb2NrZXQuICBUaGlzIHdpbGwgcmVxdWlyZSB1c2luZwotICAgICAgIHRoZSBzcGVjaWFsbHkgbW9kaWZpZWQgdm5jdmlld2VyIHVuaXggdmlld2VyIHByb3ZpZGVkIGJ5IFNTVk5DLgotICAgICAgIFRoZSBtb2RlIHdvcmtzIHdlbGwgYW5kIGlzIGN1cnJlbnRseSBzZXQgYXMgdGhlIGRlZmF1bHQuCi0gICAgICAgRGlzYWJsZSBpdCBpZiBpdCBjYXVzZXMgcHJvYmxlbXMgb3IgY29uZmxpY3RzLgotCi0gICAgMikgRm9yIFNTTCB0dW5uZWxsaW5nIHdpdGggc3R1bm5lbCg4KSBvbiBVbml4IHRoZXJlIGlzIGEgc2V0dGluZwotICAgICAgICdVc2Ugc3R1bm5lbCBJREVOVCBjaGVjaycgKGV4cGVyaW1lbnRhbCkgdG8gbGltaXQgc29ja2V0Ci0gICAgICAgY29ubmVjdGlvbnMgdG8gYmUgZnJvbSB5b3UgKHRoaXMgYXNzdW1lcyB0aGUgdW50cnVzdGVkIGxvY2FsCi0gICAgICAgdXNlciBoYXMgbm90IGJlY29tZSByb290IG9uIHlvdXIgd29ya3N0YXRpb24gYW5kIGhhcyBtb2RpZmllZAotICAgICAgIHlvdXIgbG9jYWwgSURFTlQgY2hlY2sgc2VydmljZTsgaWYgaGUgaGFzIHlvdSBoYXZlIG11Y2ggYmlnZ2VyCi0gICAgICAgcHJvYmxlbXMgdG8gd29ycnkgYWJvdXQuLi4pCi0KLSAgICAgICBOZWl0aGVyIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFyZSBhdmFpbGFibGUgb24gV2luZG93cy4KLQotICAgIFNTSDoKLQotICAgIDEpIFRoZXJlIGlzIGFsc28gYSBzaW1wbGUgTERfUFJFTE9BRCB0cmljayBmb3IgU1NIIHRvIGxpbWl0IHRoZQotICAgICAgIG51bWJlciBvZiBhY2NlcHRlZCBwb3J0IHJlZGlyZWN0aW9uIGNvbm5lY3Rpb25zLiAgVGhpcyBtYWtlcyB0aGUKLSAgICAgICB3aW5kb3cgb2YgdGltZSB0aGUgdW50cnVzdGVkIGxvY2FsIHVzZXIgY2FuIGNvbm5lY3QgdG8gdGhlIHR1bm5lbAotICAgICAgIG11Y2ggc21hbGxlci4gIEVuYWJsZSBpdCB2aWEgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiAiU1NIIExvY2FsCi0gICAgICAgUG9ydCBQcm90ZWN0aW9ucyIuICBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIGxpbV9hY2NlcHQuc28gZmlsZQotICAgICAgIGluIHlvdXIgU1NWTkMgcGFja2FnZS4gIFRoZSBtb2RlIHdvcmtzIHdlbGwgYW5kIGlzIGN1cnJlbnRseSBzZXQKLSAgICAgICBhcyB0aGUgZGVmYXVsdC4gIERpc2FibGUgaXQgaWYgaXQgY2F1c2VzIHByb2JsZW1zIG9yIGNvbmZsaWN0cy4KLQotICAgICAgIFRoZSBhYm92ZSBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgotCi0gICAgVGhlIG1haW4gbWVzc2FnZSBpcyB0byAnV2F0Y2ggeW91ciBCYWNrJyB3aGVuIHlvdSBjb25uZWN0IHZpYSB0aGUKLSAgICBTU1ZOQyB0dW5uZWxzIGFuZCB0aGVyZSBhcmUgdXNlcnMgeW91IGRvbid0IHRydXN0IG9uIHlvdXIgd29ya3N0YXRpb24uCi0gICAgVGhlIHNhbWUgYXBwbGllcyB0byBBTlkgdXNlIG9mIFNTSCAnLUwnIHBvcnQgcmVkaXJlY3Rpb25zIG9yIG91dGdvaW5nCi0gICAgc3R1bm5lbCBTU0wgcmVkaXJlY3Rpb24gc2VydmljZXMuCi19Ci0KLQlzZXQgaGVscF9wcm94IHsKLSBIZXJlIGFyZSBhIG51bWJlciBvZiBsb25nIHNlY3Rpb25zIG9uIGFsbCBzb3J0cyBvZiBwcm94aWVzLCBXZWIsIFNPQ0tTLAotIFNTSCB0dW5uZWxzL2dhdGV3YXlzLCBVbHRyYVZOQywgU2luZ2xlIENsaWNrLCBldGMuLCBldGMuCi0KLQotIFByb3hpZXMvR2F0ZXdheXM6Ci0KLSAgICBJZiBhbiBpbnRlcm1lZGlhdGUgcHJveHkgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIFNTTCBjb25uZWN0aW9uCi0gICAgKGUuZy4gYSB3ZWIgZ2F0ZXdheSBvdXQgb2YgYSBmaXJld2FsbCkgZW50ZXIgaXQgaW4gdGhlICJQcm94eS9HYXRld2F5IgotICAgIGVudHJ5IGJveDoKLQotICAgICAgICAgICBWTkMgSG9zdC1EaXNwbGF5OiAgIGhvc3Q6bnVtYmVyCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgcHJveHktaG9zdDpwb3J0Ci0gICAgZS5nLjoKLSAgICAgICAgICAgVk5DIEhvc3QtRGlzcGxheTogICBmYXItYXdheS5lYXN0OjAKLSAgICAgICAgICAgUHJveHkvR2F0ZXdheTogICAgICBteXByb3h5Lndlc3Q6ODA4MAotCi0KLSAgICBJZiB0aGUgImRvdWJsZSBwcm94eSIgY2FzZSBpcyByZXF1aXJlZCAoZS5nLiBjb21pbmcgb3V0IG9mIGEgd2ViCi0gICAgcHJveGllZCBmaXJld2FsbCBlbnZpcm9ubWVudCBhbmQgdGhlbiBJTlRPIGEgMm5kIHByb3h5IHRvIHVsdGltYXRlbHkKLSAgICByZWFjaCB0aGUgVk5DIHNlcnZlciksIHNlcGFyYXRlIHRoZW0gdmlhIGEgY29tbWEsIGUuZy46Ci0KLSAgICAgICAgICAgVk5DIEhvc3QtRGlzcGxheTogICBmYXItYXdheTowCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgbXlwcm94eS53ZXN0OjgwODAsbXlob21lLm5ldDo0NDMKLQotICAgIFNvIGl0IGdvZXM6IHZpZXdlciAtPiBteXByb3h5Lndlc3QgLT4gbXlob21lLm5ldCAtPiBmYXItYXdheSAoVk5DKQotCi0gICAgVGhlIHByb3hpZXMgYXJlIGFzc3VtZWQgdG8gYmUgV2ViIHByb3hpZXMuICBUbyB1c2UgU09DS1MgcHJveGllczoKLQotICAgICAgICAgICBWTkMgSG9zdC1EaXNwbGF5OiAgIGZhci1hd2F5LmVhc3Q6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIHNvY2tzOi8vbXlzb2Nrcy53ZXN0OjEwODAKLQotICAgIFVzZSBzb2NrczU6Ly8gdG8gZm9yY2UgdGhlIFNPQ0tTNSBwcm94eSBwcm90b2NvbCAoZS5nLiBmb3Igc3NoIC1EKS4KLQotICAgIFlvdSBjYW4gcHJlZml4IHdlYiBwcm94aWVzIHdpdGggaHR0cDovLyBpbiBTU0wgbW9kZSBidXQgaXQgZG9lc24ndCBtYXR0ZXIKLSAgICBzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0IGZvciBhIHByb3h5LiAgKE5PVEUgdGhhdCBpbiBTU0ggb3IgU1NIK1NTTAotICAgIG1vZGUgeW91IE1VU1Qgc3VwcGx5IHRoZSBodHRwOi8vIHByZWZpeCBmb3Igd2ViIHByb3hpZXMgYmVjYXVzZSBpbiB0aG9zZQotICAgIG1vZGVzIGFuIFNTSCB0dW5uZWwgaXMgdGhlIGRlZmF1bHQgcHJveHkgdHlwZTogc2VlIHRoZSBuZXh0IHNlY3Rpb24uKQotCi0gICAgTm90ZSB0aGF0IFdlYiBwcm94aWVzIGFyZSBvZnRlbiBjb25maWd1cmVkIHRvIE9OTFkgYWxsb3cgb3V0Z29pbmcKLSAgICBjb25uZWN0aW9ucyB0byBwb3J0cyA0NDMgKEhUVFBTKSBhbmQgNTYzIChTTkVXUyksIHNvIHlvdSBtaWdodAotICAgIGhhdmUgcnVuIHRoZSBWTkMgc2VydmVyIChvciByb3V0ZXIgcG9ydCByZWRpcmVjdG9yKSBvbiB0aG9zZSBwb3J0cy4KLSAgICBTT0NLUyBwcm94aWVzIHVzdWFsbHkgaGF2ZSBubyByZXN0cmljdGlvbnMgb24gcG9ydCBudW1iZXIuCi0KLSAgICBZb3UgY2FuIGNoYWluIHVwIHRvIDMgcHJveGllcyAoYW55IGNvbWJpbmF0aW9uIG9mIHdlYiAoaHR0cDovLykgYW5kCi0gICAgc29ja3M6Ly8pIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcyAoaS5lLiBmaXJzdCxzZWNvbmQsdGhpcmQpLgotCi0gICAgUHJveGllcyBhbHNvIHdvcmsgZm9yIHVuLWVuY3J5cHRlZCBjb25uZWN0aW9ucyAoIk5vbmUiIG9yIHZuYzovLywgVGlwIDUpCi0KLSAgICBTZWUgdGhlIHNzX3ZuY3ZpZXdlciBkZXNjcmlwdGlvbiBhbmQgeDExdm5jIEZBUSBmb3IgaW5mbyBvbiBwcm94aWVzOgotCi0gICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjc3Nfdm5jdmlld2VyCi0gICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC1qYXZhLXZpZXdlci1wcm94eQotCi0KLSBTU0ggUHJveGllcy9HYXRld2F5czoKLQotICAgIFByb3h5L0dhdGV3YXkgYWxzbyBhcHBsaWVzIHRvIFNTSCBtb2RlLCBpdCBpcyBhIHVzdWFsbHkgYSBnYXRld2F5IFNTSAotICAgIG1hY2hpbmUgdG8gbG9nIGludG8gdmlhIHNzaCB0aGF0IGlzIG5vdCB0aGUgd29ya3N0YXRpb24gcnVubmluZyB0aGUKLSAgICBWTkMgc2VydmVyLiAgSG93ZXZlciwgV2ViIGFuZCBTT0NLUyBwcm94aWVzIGNhbiBhbHNvIGJlIHVzZWQgKHNlZSBiZWxvdykuCi0KLSAgICBGb3IgZXhhbXBsZSBpZiBhIGNvbXBhbnkgaGFkIGEgY2VudHJhbCBsb2dpbiBzZXJ2ZXI6ICJzc2guY29tcGFueS5jb20iCi0gICAgKGFjY2Vzc2libGUgZnJvbSB0aGUgaW50ZXJuZXQpIGFuZCB0aGUgaW50ZXJuYWwgd29ya3N0YXRpb24gd2l0aCBWTkMgd2FzCi0gICAgbmFtZWQgImpvZXMtcGMiLCB0aGVuIHRvIGNyZWF0ZSBhbiBTU0ggdHVubmVsIG9uZSBjb3VsZCBwdXQgdGhpcyBpbjoKLQotICAgICAgICAgICBWTkMgSG9zdDpEaXNwbGF5OiAgIGpvZXMtcGM6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIHNzaC5jb21wYW55LmNvbQotCi0gICAgSXQgaXMgT0sgaWYgdGhlIGhvc3RuYW1lICJqb2VzLXBjIiBvbmx5IHJlc29sdmVzIGluc2lkZSB0aGUgZmlyZXdhbGwuCi0KLSAgICBUaGUgMm5kIGxlZywgZnJvbSBzc2guY29tcGFueS5jb20gLT4gam9lcy1wYyBpcyBkb25lIGJ5IGEgc3NoIC1MCi0gICAgcmVkaXIgYW5kIGlzIG5vdCBlbmNyeXB0ZWQgKGJ1dCB0aGUgdmlld2VyIC0+IHNzaC5jb21wYW55LmNvbSAxc3QgbGVnIGlzCi0gICAgYW4gZW5jcnlwdGVkIHR1bm5lbCkuIAotCi0gICAgVG8gU1NIIGVuY3J5cHQgQk9USCBsZWdzLCB0cnkgdGhlICJkb3VibGUgU1NIIGdhdGV3YXkiIG1ldGhvZCB1c2luZwotICAgIHRoZSAiY29tbWEiIG5vdGF0aW9uOgotCi0gICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6ICAgbG9jYWxob3N0OjAKLSAgICAgICAgICAgUHJveHkvR2F0ZXdheTogICAgICBzc2guY29tcGFueS5jb20sam9lcy1wYwotCi0gICAgdGhpcyByZXF1aXJlcyBhbiBTU0ggc2VydmVyIGFsc28gcnVubmluZyBvbiBqb2VzLXBjLiAgU28gYW4gaW5pdGlhbCBTU0gKLSAgICBsb2dpbiBpcyBkb25lIHRvIHNzaC5jb21wYW55LmNvbSwgdGhlbiBhIDJuZCBTU0ggaXMgcGVyZm9ybWVkICh0aHJvdWdoCi0gICAgcG9ydCBhIHJlZGlyZWN0aW9uIG9mIHRoZSBmaXJzdCkgdG8gbG9naW4gc3RyYWlnaHQgdG8gam9lcy1wYyB3aGVyZQotICAgIHRoZSBWTkMgc2VydmVyIGlzIHJ1bm5pbmcuCi0KLSAgICBVc2UgdXNlcm5hbWVAaG9zdCAoZS5nLiBqb2VAam9lcy1wYyAganNtaXRoQHNzaC5jb21wYW55LmNvbSkgaWYgdGhlCi0gICAgdXNlciBuYW1lcyBkaWZmZXIgYmV0d2VlbiB0aGUgdmFyaW91cyBtYWNoaW5lcy4gIAotCi0gICAgTk9URTogT24gV2luZG93cyB5b3UgTVVTVCBhbHdheXMgc3VwcGx5IHRoZSB1c2VybmFtZUAgYmVjYXVzZSBwdXR0eSdzCi0gICAgcGxpbmsgcmVxdWlyZXMgaXQuCi0KLQotICAgIE5PTi1TVEFOREFSRCBTU0ggUE9SVDogVG8gdXNlIGEgbm9uLXN0YW5kYXJkIHNzaCBwb3J0IChpLmUuIGEgcG9ydCBvdGhlcgotICAgIHRoYW4gMjIpIHlvdSBuZWVkIHRvIHVzZSB0aGUgUHJveHkvR2F0ZXdheXMgYXMgd2VsbC4gIEUuZy4gc29tZXRoaW5nCi0gICAgbGlrZSB0aGlzIGZvciBwb3J0IDIyMjI6Ci0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICBsb2NhbGhvc3Q6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIGpvZUBmYXItYXdheS5lYXN0OjIyMjIKLQotICAgIE9uIFVuaXgvTWFjT1NYIHRoZSB1c2VybmFtZUAgaXMgbm90IG5lZWRlZCBpZiBpdCBpcyB0aGUgc2FtZSBhcyBvbgotICAgIHRoZSBjbGllbnQuICBUaGlzIHdpbGwgYWxzbyB3b3JrIGdvaW5nIHRvIGEgZGlmZmVyZW50IGludGVybmFsIG1hY2hpbmUsCi0gICAgZS5nLiAiam9lcy1wYzowIiBpbnN0ZWFkIG9mICJsb2NhbGhvc3Q6MCIsIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlLgotCi0KLSAgICBBIFdlYiBvciBTT0NLUyBwcm94eSBjYW4gYWxzbyBiZSB1c2VkIHdpdGggU1NILiAgVXNlIHRoaXMgaWYgeW91IGFyZQotICAgIGluc2lkZSBhIGZpcmV3YWxsIHRoYXQgcHJvaGliaXRzIGRpcmVjdCBjb25uZWN0aW9ucyB0byByZW1vdGUgU1NIIHNlcnZlcnMuCi0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICBqb2VAZmFyLWF3YXkuZWFzdDowCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgaHR0cDovL215cHJveHkud2VzdDo4MDgwCi0KLSAgICBvciBmb3IgU09DS1M6Ci0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICBqb2VAZmFyLWF3YXkuZWFzdDowCi0gICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgc29ja3M6Ly9teXNvY2tzLndlc3Q6MTA4MAotCi0gICAgVXNlIHNvY2tzNTovLy4uLiB0byBmb3JjZSB0aGUgU09DS1M1IHZlcnNpb24uICBOb3RlIHRoYXQgdGhlIGh0dHA6Ly8KLSAgICBwcmVmaXggaXMgUkVRVUlSRUQgZm9yIHdlYiBwcm94aWVzIGluIFNTSCBvciBTU0grU1NMIG1vZGVzIChidXQgaXQgaXMKLSAgICB0aGUgZGVmYXVsdCBwcm94eSB0eXBlIGluIFNTTCBtb2RlLikKLQotICAgIFlvdSBjYW4gY2hhaW4gdXAgdG8gMyBwcm94aWVzIChhbnkgY29tYmluYXRpb24gb2YgaHR0cDovLywgc29ja3M6Ly8KLSAgICBhbmQgc3NoKSBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBjb21tYXMgKGkuZS4gZmlyc3Qsc2Vjb25kLHRoaXJkKS4KLQotICAgIE5vdGU6IHRoZSBXZWIgYW5kL29yIFNPQ0tTIHByb3hpZXMgbXVzdCBjb21lIGJlZm9yZSBhbnkgU1NIIGdhdGV3YXlzLgotCi0gICAgRm9yIGEgbm9uLXN0YW5kYXJkIFNTSCBwb3J0IGFuZCBhIFdlYiBvciBTT0NLUyBwcm94eSB0cnk6Ci0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICBsb2NhbGhvc3Q6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIGh0dHA6Ly9teXByb3h5Lndlc3Q6ODA4MCxqb2VAZmFyLWF3YXkuZWFzdDoyMjIyCi0KLSAgICBFdmVuIHRoZSAiZG91YmxlIFNTSCBnYXRld2F5IiBtZXRob2QgKDIgU1NIIGVuY3J5cHRlZCBsZWdzKSBkZXNjcmliZWQKLSAgICBhYm92ZSB3b3JrcyB3aXRoIGFuIGluaXRpYWwgV2ViIG9yIFNPQ0tTIHByb3h5LCBlLmcuOgotCi0gICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6ICAgbG9jYWxob3N0OjAKLSAgICAgICAgICAgUHJveHkvR2F0ZXdheTogICAgICBzb2NrczovL215c29ja3Mud2VzdDoxMDgwLHNzaC5jb21wYW55LmNvbSxqb2VzLXBjCi0KLQotCi0gICAgU29tZSBOb3RlcyBvbiBTU0ggbG9jYWxob3N0IHR1bm5lbGxpbmcgd2l0aCBTU0ggb3B0aW9ucwotICAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3Q9eWVzIGFuZCBVc2VyS25vd25Ib3N0c0ZpbGU9ZmlsZToKLQotICAgIFdhcm5pbmc6ICBOb3RlIHRoYXQgZm9yIHByb3h5IHVzZSB3aXRoIHNzaCgxKSwgdHVubmVscyBnb2luZyB0aHJvdWdoCi0gICAgJ2xvY2FsaG9zdCcgYXJlIHVzZWQuICBUaGlzIG1lYW5zIHNzaCgxKSB0aGlua3MgdGhlIHJlbW90ZSBob3N0bmFtZSBpcwotICAgICdsb2NhbGhvc3QnLCB3aGljaCBtYXkgY2F1c2UgY29sbGlzaW9ucyBhbmQgY29uZnVzaW9uIHdoZW4gc3RvcmluZwotICAgIGFuZCBjaGVja2luZyBTU0gga2V5cy4KLQotICAgIEJ5IGRlZmF1bHQgb24gVW5peCB3aGVuIGEgJ2xvY2FsaG9zdCcgc3NoIGhvc3QgaXMgaW52b2x2ZWQgdGhlCi0gICAgc3NoIG9wdGlvbiAtbyBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdD15ZXMgaXMgYXBwbGllZCAoc2VlCi0gICAgc3NoX2NvbmZpZygxKSBmb3IgZGV0YWlscy4pICBUaGlzIGF2b2lkcyB0aGUgd2FybmluZ3MgYW5kIHNzaCByZWZ1c2luZwotICAgIHRvIGNvbm5lY3QsIGJ1dCBpdCByZWR1Y2VzIHNlY3VyaXR5LiAgQSBtYW4gaW4gdGhlIG1pZGRsZSBhdHRhY2sgbWF5Ci0gICAgYmUgcG9zc2libGUuICBTU1ZOQyBwcmludHMgb3V0IGEgd2FybmluZyBpbiB0aGUgdGVybWluYWwgZXZlcnkgdGltZQotICAgIHRoZSBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdCBvcHRpb24gaXMgdXNlZC4KLQotICAgIE9uIFVuaXggdG8gZGlzYWJsZSB0aGUgdXNlIG9mIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0IHNldCB0aGUgZW52LgotICAgIHZhcmlhYmxlIFNTVk5DX1NTSF9MT0NBTEhPU1RfQVVUSD0xLiBUaGlzIG1heSBpbmR1Y2UgZXh0cmEgc3NoKDEpIGRpYWxvZ3MuCi0KLSAgICBPbiBVbml4IGEgTVVDSCBTQUZFUiBhbmQgbW9yZSBjb252ZW5pZW50IHdheSB0byBwcm9jZWVkIGlzIHRvIHNldCB0aGUKLSAgICBrbm93biBob3N0cyBvcHRpb24gaW4gT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiAnUHJpdmF0ZSBTU0ggS25vd25Ib3N0cyBmaWxlJwotICAgIFRoZW4sIG9ubHkgZm9yIHRoZSBob3N0IGluIHRoZSBjdXJyZW50IHByb2ZpbGUsIGEgcHJpdmF0ZSBrbm93bl9ob3N0cwotICAgIGZpbGUgd2lsbCBiZSB1c2VkIGFuZCBzbyB0aGVyZSB3aWxsIGJlIG5vICdsb2NhbGhvc3QnIGNvbGxpc2lvbnMuCi0gICAgVGhpcyBtZXRob2QgaXMgc2VjdXJlIChhc3N1bWluZyB5b3UgdmVyaWZ5IHRoZSBTU0gga2V5IGZpbmdlcnByaW50KQotICAgIGFuZCBhdm9pZHMgdGhlIG1hbiBpbiB0aGUgbWlkZGxlIGF0dGFjay4KLQotICAgIE9uIFdpbmRvd3MsIFB1dHR5L1BsaW5rIGlzIHVzZWQgYW5kIGRvZXMgbm90IGhhdmUgdGhlIFVzZXJLbm93bkhvc3RzCi0gICAgb3IgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QgZmVhdHVyZXMuICBLZXlzIGFyZSBzdG9yZWQgaW4KLSAgICB0aGUgcmVnaXN0cnkgYXMgbG9jYWxob3N0OnBvcnQgcGFpcnMgYW5kIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUKLSAgICAnUG9ydCBTbG90JyBvcHRpb24gdG8ga2VlcCB0aGUga2V5cyBzZXBhcmF0ZSB0byBhdm9pZCB0aGUgZGlhbG9ncyBhbmQKLSAgICBhbHNvIG1haW50YWluIGdvb2Qgc2VjdXJpdHkuCi0KLSAgICBOb3RlIHRoYXQgZm9yIHRoZSAiZG91YmxlIFNTSCBnYXRld2F5IiBtZXRob2QgdGhlIHJpc2sgZnJvbSB1c2luZwotICAgIE5vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0IGlzIHNpZ25pZmljYW50bHkgbGVzcyBiZWNhdXNlIHRoZSBmaXJzdAotICAgIHNzaCBjb25uZWN0aW9uIGRvZXMgbm90IHVzZSB0aGUgb3B0aW9uIChpdCBjb25uZWN0cyBkaXJlY3RseSB0byB0aGUgcmVtb3RlCi0gICAgaG9zdCkgYW5kIHRoZSBzZWNvbmQgb25lIGlzIG9ubHkgZXhwb3NlZCBmb3IgdGhlIGxlZyBpbnNpZGUgdGhlIGZpcnN0Ci0gICAgZ2F0ZXdheSAoYnV0IGlzIHN0aWxsIHZ1bG5lcmFibGUgdGhlcmUgd2hlbiBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdAotICAgIGlzIHVzZWQuKQotCi0gICAgQXMgd2l0aCBhIHVzZXJuYW1lIHRoYXQgY29udGFpbnMgYSBzcGFjZSwgdXNlICVTUEFDRSAob3IgJVRBQikgdG8KLSAgICBpbmRpY2F0ZSBpdCBpbiB0aGUgU1NIIHByb3hpZXMsIGUuZy4gam9obiVTUEFDRXNtaXRoQHNzaC5jb21wYW55LmNvbQotCi0gVWx0cmFWTkMgUHJveGllcy9HYXRld2F5czoKLQotICAgIFVsdHJhVk5DIGhhcyBhICJyZXBlYXRlciIgdG9vbCAoaHR0cDovL3d3dy51dm5jLmNvbS9hZGRvbnMvcmVwZWF0ZXIuaHRtbAotICAgIGFuZCBodHRwOi8va290aS5tYm5ldC5maS9qdGtvLykgdGhhdCBhY3RzIGFzIGEgVk5DIHByb3h5LiAgU1NWTkMgY2FuCi0gICAgd29yayB3aXRoIGJvdGggbW9kZSBJIGFuZCBtb2RlIElJIHNjaGVtZXMgb2YgdGhpcyByZXBlYXRlci4KLQotICAgIEZvciBVbml4IGFuZCBNYWNPUyBYIHRoZXJlIGlzIGFub3RoZXIgcmUtaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgVWx0cmFWTkMgcmVwZWF0ZXI6Ci0KLSAgICAgICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy91bHRyYXZuY19yZXBlYXRlci5wbAotCi0gICAgU28gb25lIGRvZXMgbm90IG5lZWQgdG8gcnVuIHRoZSByZXBlYXRlciBvbiBhIFdpbmRvd3MgbWFjaGluZS4KLQotICAgIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIgdG9vbCBpcyBOT1QgU1NMIGVuYWJsZWQsCi0gICAgaXQgY2FuIG5ldmVydGhlbGVzcyBhY3QgYXMgYSBwcm94eSBmb3IgU1NWTkMgU1NMIGNvbm5lY3Rpb25zLgotICAgIFRoaXMgaXMgYmVjYXVzZSwganVzdCBhcyB3aXRoIGEgV2ViIHByb3h5LCB0aGUgcHJveHkgbmVnb3RpYXRpb25zCi0gICAgb2NjdXIgYmVmb3JlIHRoZSBTU0wgdHJhZmZpYyBzdGFydHMuICAoVGhlcmUgaXMgYSBzZXBhcmF0ZSBVbHRyYVZOQwotICAgIHRvb2wsIHJlcGVhdGVyX1NTTC5leGUsIHRoYXQgaXMgU1NMIGVuYWJsZWQgYW5kIGlzIGRpc2N1c3NlZCBiZWxvdy4pCi0KLSAgICBOb3RlOiBpdCBzZWVtcyBvbmx5IFNTTCBTU1ZOQyBjb25uZWN0aW9ucyBtYWtlIHNlbnNlIHdpdGggdGhlCi0gICAgVWx0cmFWTkMgcmVwZWF0ZXIuICBTU0ggY29ubmVjdGlvbnMgKHByZXZpb3VzIHNlY3Rpb24pIGRvIG5vdCBzZWVtIHRvCi0gICAgYW5kIHNvIGFyZSBub3QgZW5hYmxlZCB0byAobGV0IHVzIGtub3cgaWYgeW91IGZpbmQgYSB3YXkgdG8gdXNlIGl0LikKLQotICAgIFVuZW5jcnlwdGVkIChha2EgRGlyZWN0KSBTU1ZOQyBWTkMgY29ubmVjdGlvbnMgKFZuYzovLyBwcmVmaXggaW4KLSAgICAnVk5DIEhvc3Q6RGlzcGxheSc7IHNlZSBUaXAgNSkgYWxzbyB3b3JrIHdpdGggdGhlIFVsdHJhVk5DIHJlcGVhdGVyLgotCi0gICAgTU9ERSBJIFJFUEVBVEVSOgotCi0gICAgRm9yIHRoZSBtb2RlIEkgVWx0cmFWTkMgcmVwZWF0ZXIgdGhlIFZpZXdlciBpbml0aWF0ZXMgdGhlIGNvbm5lY3Rpb24KLSAgICBhbmQgcGFzc2VzIGEgc3RyaW5nIHRoYXQgaXMgdGhlIFZOQyBzZXJ2ZXIncyBJUCBhZGRyZXNzIChvciBob3N0bmFtZSkKLSAgICBhbmQgcG9ydCBvciBkaXNwbGF5IHRvIHRoZSByZXBlYXRlciAodGhlIHJlcGVhdGVyIHRoZW4gbWFrZXMgdGhlCi0gICAgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGhvc3QgYW5kIHRoZW4gZXhjaGFuZ2VzIGRhdGEgYmFjayBhbmQgZm9ydGguKQotICAgIFRvIGRvIHRoaXMgaW4gU1NWTkM6Ci0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICA6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIHJlcGVhdGVyOi8vbXl1dm5jcmVwLndlc3Q6NTkwMCtqb2VzLXBjOjEKLQotICAgIFdoZXJlICJteXV2bmNyZXAud2VzdCIgaXMgcnVubmluZyB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIgYW5kIAotICAgICJqb2VzLXBjOjEiIGlzIHRoZSBWTkMgc2VydmVyIHRoZSByZXBlYXRlciB3aWxsIGNvbm5lY3QgdXMgdG8uCi0KLSAgICBOb3RlIGhlcmUgdGhhdCB0aGUgVk5DIEhvc3Q6RGlzcGxheSBjYW4gYmUgYW55dGhpbmcgYmVjYXVzZSBpdCBpcwotICAgIG5vdCB1c2VkOyB3ZSBjaG9vc2UgOjAuICBZb3UgY2Fubm90IGxlYXZlIFZOQyBIb3N0OkRpc3BsYXkgZW1wdHkuCi0KLSAgICBUaGUgUHJveHkvR2F0ZXdheSBmb3JtYXQgaXMgcmVwZWF0ZXI6Ly9wcm94eTpwb3J0K3ZuY3NlcnZlcjpkaXNwbGF5LgotICAgIFRoZSBzdHJpbmcgYWZ0ZXIgdGhlICIrIiBzaWduIGlzIHBhc3NlZCB0byB0aGUgcmVwZWF0ZXIgc2VydmVyIGZvcgotICAgIGl0IHRvIGludGVycHJldCAoYW5kIHNvIGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIFVsdHJhVk5DIHJlcGVhdGVyOwotICAgIHlvdSBjb3VsZCBjcmVhdGUgeW91ciBvd24gaWYgeW91IHdhbnRlZCB0by4pICBGb3IgdGhpcyBleGFtcGxlLAotICAgIGluc3RlYWQgb2Ygam9lcy1wYzoxIGl0IGNvdWxkIGJlIGpvZXMtcGM6NTkwMSBvciAxOTIuMTY4LjEuNDoxLAotICAgIDE5Mi4xNjguMS40OjU5MDEsIGV0Yy4KLQotICAgIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgcHJveHkgcG9ydCwgdGhlbiB0aGUgZGVmYXVsdCA1OTAwIGlzIGFzc3VtZWQsCi0gICAgZS5nLiB1c2UgcmVwZWF0ZXI6Ly9teXV2bmNyZXAud2VzdCtqb2VzLXBjOjEgZm9yIHBvcnQgNTkwMCBvbgotICAgIG15dXZuY3JlcC53ZXN0IHRoZW4gY29ubmVjdGluZyB0byBwb3J0IDU5MDEgb24gam9lcy1wYy4KLQotICAgIFgxMVZOQzogRm9yIG1vZGUgSSBvcGVyYXRpb24gdGhlIFZOQyBzZXJ2ZXIgeDExdm5jIHNpbXBseSBydW5zIGFzCi0gICAgYSBub3JtYWwgU1NML1ZOQyBzZXJ2ZXI6Ci0KLSAgICAgICB4MTF2bmMgLXNzbCBTQVZFCi0KLSAgICBiZWNhdXNlIHRoZSByZXBlYXRlciB3aWxsIGNvbm5lY3QgdG8gaXQgYXMgYSBWTkMgY2xpZW50IHdvdWxkLgotICAgIEZvciBtb2RlIElJIG9wZXJhdGlvbiBhZGRpdGlvbmFsIG9wdGlvbnMgYXJlIG5lZWRlZCAoc2VlIGJlbG93LikKLQotCi0gICAgTU9ERSBJSSBSRVBFQVRFUjoKLQotICAgIEZvciB0aGUgbW9kZSBJSSByZXBlYXRlciBib3RoIHRoZSBWTkMgdmlld2VyIGFuZCBWTkMgc2VydmVyIGluaXRpYXRlCi0gICAgVENQIGNvbm5lY3Rpb25zIHRvIHRoZSByZXBlYXRlciBwcm94eS4gIEluIHRoaXMgY2FzZSB0aGV5IHBhc3MgYSBzdHJpbmcKLSAgICB0aGF0IGlkZW50aWZpZXMgdGhlaXIgbXV0dWFsIGNvbm5lY3Rpb24gdmlhICJJRDpOTk5OIiwgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICA6MAotICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgIHJlcGVhdGVyOi8vbXl1dm5jcmVwLndlc3Q6NTkwMCtJRDoyMzQ1Ci0KLSAgICBhZ2FpbiwgdGhlIGRlZmF1bHQgcHJveHkgcG9ydCBpcyA1OTAwIGlmIG5vdCBzdXBwbGllZC4gIEFuZCB3ZSBuZWVkCi0gICAgdG8gc3VwcGx5IGEgcGxhY2Vob2xkZXIgZGlzcGxheSAiOjAiLgotCi0gICAgVGhlIGZhY3QgdGhhdCBCT1RIIHRoZSBWTkMgdmlld2VyIGFuZCBWTkMgc2VydmVyIGluaXRpYXRlIG91dGdvaW5nCi0gICAgVENQIGNvbm5lY3Rpb25zIHRvIHRoZSByZXBlYXRlciBtYWtlcyBzb21lIHRoaW5ncyB0cmlja3ksIGVzcGVjaWFsbHkKLSAgICBmb3IgdGhlIFNTTCBhc3BlY3QuICBJbiBTU0wgb25lIHNpZGUgdGFrZXMgdGhlICdjbGllbnQnIHJvbGUgYW5kCi0gICAgdGhlIG90aGVyIHNpZGUgbXVzdCB0YWtlIHRoZSAnc2VydmVyJyByb2xlLiAgVGhlc2Ugcm9sZXMgbXVzdCBiZQotICAgIGNvb3JkaW5hdGVkIGNvcnJlY3RseSBvciBvdGhlcndpc2UgdGhlIFNTTCBoYW5kc2hha2Ugd2lsbCBmYWlsLgotCi0gICAgV2Ugbm93IGRlc2NyaWJlIHR3byBzY2VuYXJpb3M6IDEpIFNTVk5DIGluIExpc3RlbmluZyBtb2RlIHdpdGggU1RVTk5FTAotICAgIGluICdTU0wgc2VydmVyJyByb2xlOyBhbmQgMikgU1NWTkMgaW4gRm9yd2FyZCBtb2RlIHdpdGggU1RVTk5FTCBpbgotICAgICdTU0wgY2xpZW50JyByb2xlLiAgRm9yIGJvdGggY2FzZXMgd2Ugc2hvdyBob3cgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICBWTkMgc2VydmVyIHgxMXZuYyB3b3VsZCBiZSBydW4uCi0KLSAgICBTU1ZOQyBMaXN0ZW5pbmcgbW9kZSAvIFNUVU5ORUwgJ1NTTCBzZXJ2ZXInIHJvbGU6Ci0KLSAgICAgIEJ5IGRlZmF1bHQsIHdoZW4gdXNpbmcgU1NMIG92ZXIgYSByZXZlcnNlIGNvbm5lY3Rpb24gdGhlIHgxMXZuYyBWTkMKLSAgICAgIHNlcnZlciB3aWxsIHRha2UgdGhlICdTU0wgY2xpZW50JyByb2xlLiAgVGhpcyB3YXkgaXQgY2FuIGNvbm5lY3QgdG8gYQotICAgICAgc3RhbmRhcmQgU1RVTk5FTCAoU1NMIHNlcnZlcikgcmVkaXJlY3RpbmcgY29ubmVjdGlvbnMgdG8gYSBWTkMgdmlld2VyCi0gICAgICBpbiBMaXN0ZW4gbW9kZS4gIFRoaXMgaXMgaG93IFNTVk5DIHdpdGggU1NMIGlzIG5vcm1hbGx5IGludGVuZGVkIHRvCi0gICAgICBiZSB1c2VkIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zIChpLmUuIHdpdGhvdXQgdGhlIFVsdHJhVk5DIFJlcGVhdGVyLikKLQotICAgICAgVG8gZG8gaXQgdGhpcyB3YXkgd2l0aCB0aGUgbW9kZSBJSSBVbHRyYVZOQyBSZXBlYXRlcjsgeW91IHNldAotICAgICAgT3B0aW9ucyAtPiBSZXZlcnNlIFZOQyBDb25uZWN0aW9uLCBpLmUuIGEgIkxpc3RlbmluZyBDb25uZWN0aW9uIi4KLSAgICAgIFlvdSBzaG91bGQgZGlzYWJsZSAnVmVyaWZ5IEFsbCBDZXJ0cycgdW5sZXNzIHlvdSBoYXZlIGFscmVhZHkKLSAgICAgIHNhdmVkIHRoZSBWTkMgU2VydmVyJ3MgY2VydGlmaWNhdGUgdG8gQWNjZXB0ZWQgQ2VydHMuICBPciB5b3UgY2FuCi0gICAgICBzZXQgU2VydmVyQ2VydCB0byB0aGUgc2F2ZWQgY2VydGlmaWNhdGUuICBUaGVuIGNsaWNrICdMaXN0ZW4nLgotICAgICAgSW4gdGhpcyBjYXNlIGFuIG91dGdvaW5nIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGUgVWx0cmFWTkMKLSAgICAgIHJlcGVhdGVyLCBidXQgZXZlcnl0aGluZyBlbHNlIGlzIGFzIGZvciBhIFJldmVyc2UgY29ubmVjdGlvbi4KLQotICAgICAgTm90ZSB0aGF0IGluIExpc3RlbmluZyBTU0wgbW9kZSB5b3UgbXVzdCBzdXBwbHkgYSBNeUNlcnQgb3IgdXNlIHRoZQotICAgICAgImxpc3Rlbi5wZW0iIG9uZSB5b3UgYXJlIHByb21wdGVkIGJ5IFNTVk5DIHRvIGNyZWF0ZS4KLQotICAgICAgWDExVk5DIGNvbW1hbmQ6Ci0KLSAgICAgICAgeDExdm5jIC1zc2wgLWNvbm5lY3Rfb3JfZXhpdCByZXBlYXRlcjovL215dXZuY3JlcC53ZXN0K0lEOjIzNDUKLQotCi0gICAgU1NWTkMgRm9yd2FyZCBtb2RlIC8gU1RVTk5FTCAnU1NMIGNsaWVudCcgcm9sZToKLQotICAgICAgeDExdm5jIDAuOS4xMCBhbmQgbGF0ZXIgY2FuIGFjdCBpbiB0aGUgJ1NTTCBzZXJ2ZXInIHJvbGUgZm9yIFJldmVyc2UKLSAgICAgIGNvbm5lY3Rpb25zIChpLmUuIGFzIGl0IGRvZXMgZm9yIGZvcndhcmQgY29ubmVjdGlvbnMuKSAgU2V0IHRoZXNlCi0gICAgICB4MTF2bmMgb3B0aW9uczogJy1lbnYgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEgLXNzbG9ubHknCi0KLSAgICAgIFRoZSAtc3Nsb25seSBvcHRpb24gaXMgdG8gcHJldmVudCB4MTF2bmMgZnJvbSB0aGlua2luZyB0aGUgZGVsYXkgaW4KLSAgICAgIGNvbm5lY3Rpb24gaW1wbGllcyBWZU5DcnlwdCBpbnN0ZWFkIG9mIFZOQyBvdmVyIFNTTC4gIFdpdGggeDExdm5jCi0gICAgICBpbiBYMTFWTkNfRElTQUJMRV9TU0xfQ0xJRU5UX01PREUgbW9kZSwgeW91IGNhbiB0aGVuIGhhdmUgU1NWTkMgbWFrZQotICAgICAgYSByZWd1bGFyIGZvcndhcmQgY29ubmVjdGlvbiB0byB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIuCi0KLSAgICAgIE5vdGUgdGhhdCBTU1ZOQyBtYXkgYXR0ZW1wdCB0byBkbyBhICdGZXRjaCBDZXJ0JyBhY3Rpb24gaW4gZm9yd2FyZAotICAgICAgY29ubmVjdGlvbiBtb2RlIHRvIGVpdGhlciByZXRyaWV2ZSB0aGUgY2VydGlmaWNhdGUgb3IgcHJvYmUgZm9yCi0gICAgICBWZU5DcnlwdCBhbmQvb3IgQU5PTkRILiAgQWZ0ZXIgdGhhdCAnRmV0Y2ggQ2VydCcgaXMgZG9uZSB0aGUKLSAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIFVsdHJhVk5DIHJlcGVhdGVyIHdpbGwgYmUgZHJvcHBlZC4gIFRoaXMgaXMgYQotICAgICAgcHJvYmxlbSBmb3IgdGhlIHN1YnNlcXVlbnQgcmVhbCBWTkMgY29ubmVjdGlvbi4gIFlvdSBjYW4gZGlzYWJsZQotICAgICAgJ1ZlcmlmeSBBbGwgQ2VydHMnIEFORCBhbHNvIHNldCAnRG8gbm90IFByb2JlIGZvciBWZU5DcnlwdCcKLSAgICAgIHRvIGF2b2lkIHRoZSAnRmV0Y2ggQ2VydCcgYWN0aW9uLiAgT3IsIHBlcmhhcHMgYmV0dGVyLCBhZGQgdG8KLSAgICAgIHgxMXZuYyBjb21tYW5kIGxpbmUgJy1jb25uZWN0X29yX2V4aXQgcmVwZWF0ZXI6Ly8uLi4gLWxvb3AzMDAsMicKLSAgICAgIChpbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBocy4pICBUaGF0IHdheQotICAgICAgeDExdm5jIHdpbGwgcmVjb25uZWN0IG9uY2UgdG8gdGhlIFJlcGVhdGVyIGFmdGVyIHRoZSAnRmV0Y2ggQ2VydCcKLSAgICAgIGFjdGlvbi4gIFRoZW4gdGhpbmdzIHNob3VsZCBhY3QgcHJldHR5IG11Y2ggYXMgYSBub3JtYWwgZm9yd2FyZAotICAgICAgU1NMIGNvbm5lY3Rpb24uCi0KLSAgICAgIFgxMVZOQyAwLjkuMTAgY29tbWFuZCAoc3BsaXQgaW50byB0d28gbGluZXMpOgotCi0gICAgICAgIHgxMXZuYyAtc3NsIC1jb25uZWN0X29yX2V4aXQgcmVwZWF0ZXI6Ly9teXV2bmNyZXAud2VzdCtJRDoyMzQ1IFwgCi0gICAgICAgICAgICAgLWVudiBYMTFWTkNfRElTQUJMRV9TU0xfQ0xJRU5UX01PREU9MSAtbG9vcDMwMCwyIC1zc2xvbmx5Ci0KLSAgICBXZSByZWNvbW1lbmQgdXNpbmcgIlNTVk5DIEZvcndhcmQgbW9kZSAvIFNUVU5ORUwgJ1NTTCBjbGllbnQnIHJvbGUiCi0gICAgaWYgeW91IGFyZSBjb25uZWN0aW5nIHRvIHgxMXZuYyAwLjkuMTAgb3IgbGF0ZXIuICBTaW5jZSB0aGlzIGRvZXMKLSAgICBub3QgdXNlIExpc3RlbiBtb2RlIGl0IHNob3VsZCBiZSBsZXNzIGVycm9yIHByb25lIGFuZCBsZXNzIGNvbmZ1c2luZwotICAgIGFuZCBtb3JlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBmZWF0dXJlcy4gIEJlIHN1cmUgdG8gdXNlIGFsbCBvZgotICAgIHRoZSB4MTF2bmMgb3B0aW9ucyBpbiB0aGUgYWJvdmUgY29tbWFuZCBsaW5lLiAgVG8gZW5hYmxlIFZlTkNyeXB0LAotICAgIHJlcGxhY2UgJy1zc2xvbmx5JyB3aXRoICctdmVuY3J5cHQgZm9yY2UnLiAgSWYgeW91IGRvIG5vdCBpbmRpY2F0ZQotICAgIHRoZW0gZXhwbGljaXRseSB0byBTU1ZOQywgU1NWTkMgbWF5IGhhdmUgdG8gcHJvYmUgbXVsdGlwbGUgdGltZXMgZm9yCi0gICAgVmVOQ3J5cHQgYW5kL29yIEFOT05ESC4gIFNvIHlvdSBtYXkgbmVlZCAnLWxvb3AzMDAsNCcgb24gdGhlIHgxMXZuYwotICAgIGNtZGxpbmUgc28gaXQgd2lsbCByZWNvbm5lY3QgdG8gdGhlIFVsdHJhVk5DIHJlcGVhdGVyIDMgdGltZXMuCi0KLQotICAgIE5vdGUgdGhhdCBmb3IgVU5FTkNSWVBURUQgKGkuZS4gZGlyZWN0KSBTU1ZOQyBjb25uZWN0aW9ucyAoc2VlIHZuYzovLwotICAgIGluIFRpcCA1KSB1c2luZyB0aGUgVWx0cmFWTkMgUmVwZWF0ZXIgbW9kZSBJSSB0aGVyZSBpcyBubyBuZWVkIHRvCi0gICAgdXNlIGEgcmV2ZXJzZSAiTGlzdGVuaW5nIGNvbm5lY3Rpb24iIGFuZCBzbyB5b3UgbWlnaHQgYXMgd2VsbCB1c2UKLSAgICBhIGZvcndhcmQgY29ubmVjdGlvbi4KLQotICAgIEZvciBMaXN0ZW5pbmcgY29ubmVjdGlvbnMsIG9uIFdpbmRvd3MgYWZ0ZXIgdGhlIFZOQyBjb25uZWN0aW9uIHlvdQotICAgIE1VU1QgbWFudWFsbHkgdGVybWluYXRlIHRoZSBsaXN0ZW5pbmcgVk5DIFZpZXdlciAoYW5kIGNvbm5lY3QgYWdhaW4KLSAgICBpZiBkZXNpcmVkLikgIERvIHRoaXMgYnkgZ29pbmcgdG8gdGhlIFN5c3RlbSBUcmF5IGFuZCB0ZXJtaW5hdGluZwotICAgIHRoZSBMaXN0ZW5pbmcgVk5DIFZpZXdlci4gIFN1YnNlcXVlbnQgY29ubmVjdGlvbiBhdHRlbXB0cyB1c2luZyB0aGUKLSAgICByZXBlYXRlciB3aWxsIGZhaWwgdW5sZXNzIHlvdSBkbyB0aGlzIGFuZCByZXN0YXJ0IHRoZSBMaXN0ZW4uCi0KLSAgICBPbiBVbml4IGFuZCBNYWNPUyBYIGFmdGVyIHRoZSBWTkMgY29ubmVjdGlvbiB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIKLSAgICBwcm94eSBzY3JpcHQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgYW5kIHJlY29ubmVjdCB0byB0aGUgcmVwZWF0ZXIKLSAgICBmb3IgYW5vdGhlciBjb25uZWN0aW9uLiAgU28geW91IGRvIG5vdCBuZWVkIHRvIG1hbnVhbGx5IHJlc3RhcnQgaXQuCi0gICAgVG8gc3RvcCB0aGUgbGlzdGVuaW5nLCBraWxsIHRoZSBsaXN0ZW5pbmcgVk5DIFZpZXdlciB3aXRoIEN0cmwtQy4KLQotICAgIEluIHRoZSBwcmV2aW91cyBzZWN0aW9ucyBpdCB3YXMgbWVudGlvbmVkIG9uZSBjYW4gY2hhaW4gdXAgdG8gMwotICAgIHByb3hpZXMgdG9nZXRoZXIgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzOiBwcm94eTEscHJveHkyLHByb3h5My4KLSAgICBFeGNlcHQgd2hlcmUgZXhwbGljaXRseSBub3RlZCBiZWxvdyB0aGlzIHNob3VsZCB3b3JrIGZvciAicmVwZWF0ZXI6Ly8uLi4iCi0gICAgYXMgdGhlIGZpbmFsIHByb3h5LiAgRS5nLiB5b3UgY291bGQgdXNlIGEgd2ViIHByb3h5IHRvIGdldCBvdXQgb2YgYQotICAgIGZpcmV3YWxsLCBhbmQgdGhlbiBjb25uZWN0IHRvIGEgcmVtb3RlIHJlcGVhdGVyLgotCi0gICAgVGhlIFVsdHJhVk5DIFNTTCBlbmFibGVkIHJlcGVhdGVyX1NTTC5leGUgaXMgZGlzY3Vzc2VkIGJlbG93LgotCi0KLSBVbHRyYVZOQyBTaW5nbGUgQ2xpY2s6Ci0KLSAgICBVbHRyYVZOQyBoYXMgU2luZ2xlIENsaWNrIChTQykgV2luZG93cyBWTkMgc2VydmVycyB0aGF0IGFsbG93IG5haXZlCi0gICAgdXNlcnMgdG8gZ2V0IHRoZW0gcnVubmluZyB2ZXJ5IGVhc2lseSAoYSBFWEUgZG93bmxvYWQgYW5kIGEgZmV3Ci0gICAgbW91c2UgY2xpY2tzKS4gIFNlZSBodHRwOi8vc2MudXZuYy5jb20vIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjcmVhdGUKLSAgICB0aGVzZSBiaW5hcmllcy4gIEFsc28gdGhlcmUgaXMgYSBob3ctdG8gaGVyZToKLSAgICBodHRwOi8vd3d3LnNpbXBseS1wb3N0Y29kZS1sb29rdXAuY29tL1NpbmdsZUNsaWNrVWx0cmFWTkMvU2luZ2xlQ2xpY2tWTkMuaHRtCi0KLSAgICBUaGUgU0MgRVhFIGlzIGEgVk5DICpzZXJ2ZXIqIHRoYXQgc3RhcnRzIHVwIGEgUmV2ZXJzZSBWTkMgY29ubmVjdGlvbgotICAgIHRvIGEgTGlzdGVuaW5nIFZpZXdlciAoZS5nLiB0aGUgdmlld2VyIGFkZHJlc3MvcG9ydC9JRCBpcyBoYXJkd2lyZWQKLSAgICBpbnRvIHRoZSBTQyBFWEUpLiAgU28gU0MgaXMgbm90IHJlYWxseSBhIHByb3h5LCBidXQgaXQgY2FuIGJlIHVzZWQKLSAgICB3aXRoIFVsdHJhVk5DIHJlcGVhdGVyIHByb3hpZXMgYW5kIHNvIHdlIGRlc2NyaWJlIGl0IGhlcmUuCi0KLSAgICBPbmUgaW1wb3J0YW50IHBvaW50IGZvciBTQyBJSUkgYmluYXJ5IGNyZWF0aW9uOiBkbyBOT1QgaW5jbHVkZSAKLSAgICAiLWlkIE4iIGluIHRoZSBoZWxwZGVzay50eHQgY29uZmlnIGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHdpdGgKLSAgICBTU1ZOQyB0aGUgVWx0cmEgVk5DIHJlcGVhdGVyIElTIE5PVCBVU0VEIChzZWUgYmVsb3cgZm9yIGhvdyB0bwotICAgIHVzZSBpdCkuICBVc2Ugc29tZXRoaW5nIGxpa2UgZm9yIGhlbHBkZXNrLnR4dDoKLQotICAgICAgIFtUSVRMRV0KLSAgICAgICBNeSBVbHRyYVZOQyBTQyBJSUkKLQotICAgICAgIFtIT1NUXQotICAgICAgIEludGVybmV0IFN1cHBvcnQgWFlaCi0gICAgICAgLXNzbHByb3h5IC1jb25uZWN0IHh4Lnh4Lnh4Lnh4OjU1MDAgLW5vcmVnaXN0cnkKLQotICAgIChyZXBsYWNlIHh4Lnh4Lnh4Lnh4IHdpdGggSVAgYWRkcmVzcyBvciBob3N0bmFtZSBvZiB0aGUgU1NWTkMgbWFjaGluZS4pCi0KLSAgICBUaGUgVW5peCBTU1ZOQyB2bmN2aWV3ZXIgc3VwcG9ydHMgdGhlIGJvdGggdGhlIHVuZW5jcnlwdGVkICJTQyBJIgotICAgIG1vZGUgYW5kIHRoZSBTU0wgZW5jcnlwdGVkICJTQyBJSUkiIG1vZGUuICBGb3IgYm90aCBjYXNlcyBTU1ZOQwotICAgIG11c3QgYmUgcnVuIGluIExpc3RlbmluZyBtb2RlIChPcHRpb25zIC0+IFJldmVyc2UgVk5DIENvbm5lY3Rpb24pCi0KLSAgICBGb3IgU0MgSSwgZW5hYmxlIFJldmVyc2UgVk5DIENvbm5lY3Rpb24gYW5kIHB1dCBWbmM6Ly8wIChzZWUgVGlwIDUKLSAgICBiZWxvdykgaW4gdGhlIFZOQyBIb3N0OkRpc3BsYXkgdG8gZGlzYWJsZSBlbmNyeXB0aW9uICh1c2UgYSBkaWZmZXJlbnQKLSAgICBudW1iZXIgaWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIGRlZmF1bHQgbGlzdGVuaW5nIHBvcnQgNTUwMCkuCi0gICAgVGhlbiBjbGljayBvbiB0aGUgIkxpc3RlbiIgYnV0dG9uIGFuZCBmaW5hbGx5IGhhdmUgdGhlIHVzZXIgcnVuIHlvdXIKLSAgICBTaW5nbGUgQ2xpY2sgSSBFWEUuCi0KLSAgICBCVFcsIHdlIHVzZWQgdGhpcyBmb3IgYSBTQyBJIGhlbHBkZXNrLnR4dDoKLQotICAgICAgIFtUSVRMRV0KLSAgICAgICBNeSBVbHRyYVZOQyBTQyBJCi0KLSAgICAgICBbSE9TVF0KLSAgICAgICBJbnRlcm5ldCBTdXBwb3J0IFhZWgotICAgICAgIC1jb25uZWN0IHh4Lnh4Lnh4Lnh4OjU1MDAgLW5vcmVnaXN0cnkKLQotICAgIEZvciBTQyBJSUkgKFNTTCksIGVuYWJsZSBSZXZlcnNlIFZOQyBDb25uZWN0aW9uIGFuZCB0aGVuIFVOU0VUICJWZXJpZnkKLSAgICBBbGwgQ2VydHMiICh0aGlzIGlzIHJlcXVpcmVkKS4gIExldCB0aGUgVk5DIEhvc3Q6RGlzcGxheSBiZSAiOjAiCi0gICAgKHVzZSBhIGRpZmZlcmVudCBudW1iZXIgaWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIGRlZmF1bHQgbGlzdGVuaW5nCi0gICAgcG9ydCA1NTAwKS4gIFRoZW4gY2xpY2sgb24gdGhlICJMaXN0ZW4iIGJ1dHRvbiBhbmQgZmluYWxseSBoYXZlIHRoZQotICAgIHVzZXIgcnVuIHlvdXIgU2luZ2xlIENsaWNrIElJSSBFWEUuCi0KLSAgICBOb3RlIHRoYXQgaW4gTGlzdGVuaW5nIFNTTCBtb2RlIHlvdSBNVVNUIHN1cHBseSBhIE15Q2VydCBvciB1c2UgdGhlIAotICAgICJsaXN0ZW4ucGVtIiBvbmUgeW91IGFyZSBwcm9tcHRlZCBieSBTU1ZOQyB0byBjcmVhdGUuCi0KLQotIFVsdHJhVk5DIHJlcGVhdGVyX1NTTC5leGUgcHJveHk6Ci0KLSAgICBGb3IgcmVwZWF0ZXJfU1NMLmV4ZSBTU0wgdXNhZ2UsIHdpdGggU2luZ2xlIENsaWNrIElJSSBvciBvdGhlcndpc2UKLSAgICAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cudXZuYy5jb20vcGNoZWxwd2FyZS9TQ0lJSS9pbmRleC5odG1sKQotICAgIGl0IGhlbHBzIHRvIHJlYWxpemUgdGhhdCB0aGUgRU5USVJFIGNvbm5lY3Rpb24gaXMgU1NMIGVuY3J5cHRlZCwKLSAgICBldmVuIHRoZSBwcm94eSBob3N0OnBvcnQvSUQ6Tk5OTiBuZWdvdGlhdGlvbiwgYW5kIHNvIGEgZGlmZmVyZW50Ci0gICAgYXBwcm9hY2ggbmVlZHMgdG8gYmUgdGFrZW4gZnJvbSB0aGF0IGRlc2NyaWJlZCBhYm92ZSBpbiAnVWx0cmFWTkMKLSAgICBQcm94aWVzL0dhdGV3YXlzJy4gIEluIHRoaXMgY2FzZSBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6ICAgOjAKLSAgICAgICAgICAgUHJveHkvR2F0ZXdheTogICAgICBzc2xyZXBlYXRlcjovL215dXZuY3JlcC53ZXN0OjQ0MytJRDoyMzQ1Ci0KLSAgICBUaGUgc3NscmVwZWF0ZXI6Ly8gcGFydCBpbmRpY2F0ZXMgdGhlIGVudGlyZSBJRDpYWVogbmVnb3RpYXRpb24gbXVzdAotICAgIG9jY3VyIGluc2lkZSB0aGUgU1NMIHR1bm5lbC4gIExpc3RlbmluZyBtb2RlIGlzIG5vdCByZXF1aXJlZCBpbiB0aGlzCi0gICAgY2FzZTogYSBmb3J3YXJkIFZOQyBjb25uZWN0aW9uIHdvcmtzIGZpbmUgKGFuZCBpcyByZWNvbW1lbmRlZCkuCi0gICAgQXMgYmVmb3JlLCB0aGUgIjowIiBpcyBzaW1wbHkgYSBwbGFjZWhvbGRlciBhbmQgaXMgbm90IHVzZWQuCi0gICAgTm90ZSB0aGF0IHRoZSBVbHRyYVZOQyByZXBlYXRlcl9TU0wuZXhlIGxpc3RlbnMgb24gcG9ydCA0NDMgKEhUVFBTKSwKLSAgICAoaXQgaXMgbm90IGNsZWFyIHRoYXQgaXQgY2FuIGJlIG1vZGlmaWVkIHRvIHVzZSBhbm90aGVyIHBvcnQuKQotCi0gICAgTm9uLUlEIGNvbm5lY3Rpb25zIHNzbHJlcGVhdGVyOi8vbXl1dm5jcmVwLndlc3Q6NDQzK2hvc3Q6ZGlzcCBhbHNvCi0gICAgd29yaywgYnV0IHRoZSAybmQgbGVnIHJlcGVhdGVyIDwtPiBob3N0OmRpc3AgbXVzdCBiZSB1bmVuY3J5cHRlZC4KLSAgICBUaGUgZmlyc3QgbGVnIFNTVk5DIDwtPiByZXBlYXRlciBpcywgaG93ZXZlciwgU1NMIGVuY3J5cHRlZC4KLQotICAgIHNzbHJlcGVhdGVyOi8vIG9ubHkgd29ya3Mgb24gVW5peCBvciBNYWNPU1ggdXNpbmcgdGhlIHByb3ZpZGVkCi0gICAgU1NWTkMgdm5jdmlld2VyLiAgVGhlIG1vZGlmaWVkIHZpZXdlciBpcyBuZWVkZWQ7IHN0b2NrIFZOQyB2aWV3ZXJzCi0gICAgd2lsbCBub3Qgd29yay4gIEFsc28sIHByb3h5IGNoYWluaW5nIChib3VuY2luZyBvZmYgb2YgbW9yZSB0aGFuIG9uZQotICAgIHByb3h5KSBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBmb3IgcmVwZWF0ZXJfU1NMLmV4ZS4KLQotCi0gVmVOQ3J5cHQgaXMgdHJlYXRlZCBhcyBhIHByb3h5OgotCi0gICAgU1NWTkMgc3VwcG9ydHMgdGhlIFZlTkNyeXB0IFZOQyBzZWN1cml0eSB0eXBlLiAgWW91IHdpbGwgZmluZCBvdXQgbW9yZQotICAgIGFib3V0IHRoaXMgc2VjdXJpdHkgdHlwZSBpbiB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIEhlbHAgZG9jdW1lbnRhdGlvbi4KLSAgICBJbiBzaG9ydCwgaXQgZG9lcyBhIGJpdCBvZiBwbGFpbi10ZXh0IFZOQyBwcm90b2NvbCBuZWdvdGlhdGlvbiBiZWZvcmUKLSAgICBzd2l0Y2hpbmcgdG8gU1NML1RMUyBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbi4KLQotICAgIFNTVk5DIGltcGxlbWVudHMgaXRzIFZlTkNyeXB0IHN1cHBvcnQgYXMgZmluYWwgcHJveHkgaW4gYSBjaGFpbgotICAgIG9mIHByb3hpZXMuICBZb3UgZG9uJ3QgbmVlZCB0byBrbm93IHRoaXMgb3Igc3BlY2lmeSBhbnl0aGluZywgYnV0Ci0gICAgaXQgaXMgZ29vZCB0byBrbm93IHNpbmNlIGl0IHVzZXMgdXAgb25lIG9mIHRoZSAzIHByb3hpZXMgeW91IGFyZQotICAgIGFsbG93ZWQgdG8gY2hhaW4gdG9nZXRoZXIuICBJZiB5b3Ugd2F0Y2ggdGhlIGNvbW1hbmQgb3V0cHV0IHlvdSB3aWxsCi0gICAgc2VlIHRoZSB2ZW5jcnlwdDovLyBwcm94eSBpdGVtLgotCi0gICAgWW91IGNhbiBzcGVjaWZ5IHRoYXQgYSBWTkMgc2VydmVyIHVzZXMgVmVOQ3J5cHQgKE9wdGlvbnMgLT4gQWR2YW5jZWQpCi0gICAgb3IgeW91IGNhbiBsZXQgU1NWTkMgdHJ5IHRvIGF1dG9kZXRlY3QgVmVOQ3J5cHQuCi0KLQotIElQdjYgY2FuIGJlIHRyZWF0ZWQgYXMgYSBwcm94eSBmb3IgVU4tRU5DUllQVEVEIGNvbm5lY3Rpb25zOgotCi0gICAgUmVhZCBUaXAgMjAgYWJvdXQgU1NWTkMncyBJUHY2ICgxMjggYml0IElQIGFkZHJlc3Nlcykgc3VwcG9ydC4KLSAgICBJbiBzaG9ydCwgYmVjYXVzZSBzdHVubmVsIGFuZCBzc2ggc3VwcG9ydCBJUHY2IGhvc3RuYW1lcyBhbmQKLSAgICBhZGRyZXNzZXMsIFNTVk5DIGRvZXMgdG9vIHdpdGhvdXQgeW91IG5lZWRpbmcgdG8gZG8gYW55dGhpbmcuCi0KLSAgICBIb3dldmVyLCBpbiBzb21lIHJhcmUgdXNhZ2UgbW9kZXMgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSBJUHY2Ci0gICAgc2VydmVyIGRlc3RpbmF0aW9uIGluIHRoZSBQcm94eS9HYXRld2F5IGVudHJ5IGJveC4gIFRoZSBvbmx5IGNhc2UKLSAgICB0aGlzIGFwcGVhcnMgdG8gYmUgbmVlZGVkIGlzIHdoZW4gbWFraW5nIGFuIHVuLWVuY3J5cHRlZCBjb25uZWN0aW9uCi0gICAgdG8gYW4gSVB2NiBWTkMgc2VydmVyLiAgSW4gdGhpcyBjYXNlIG5laXRoZXIgc3R1bm5lbCBub3Igc3NoIGFyZQotICAgIHVzZWQgYW5kIHlvdSBuZWVkIHRvIHNwZWNpZnkgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICAgICAgICAgICAgICBWTkMgSG9zdDpEaXNwbGF5OiAgICAgICBsb2NhbGhvc3Q6MAotICAgICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgICAgICBpcHY2Oi8vMjAwMTo0ODYwOmIwMDk6OjY4OjU5MDAKLQotICAgIGFuZCB0aGVuIHNlbGVjdCAnTm9uZScgYXMgdGhlIGVuY3J5cHRpb24gdHlwZS4gIE5vdGUgdGhhdCB0aGUgYWJvdmUKLSAgICAnbG9jYWxob3N0OjAnIHNldHRpbmcgY2FuIGJlIGFueXRoaW5nOyBpdCBpcyBiYXNpY2FsbHkgaWdub3JlZC4KLQotICAgIE5vdGUgdGhhdCBvbiBVbml4LCBNYWNPU1gsIGFuZCBXaW5kb3dzIHVuLWVuY3J5cHRlZCBpcHY2IGNvbm5lY3Rpb25zCi0gICAgYXJlIEFVVE9ERVRFQ1RFRCBhbmQgc28geW91IGxpa2VseSBORVZFUiBuZWVkIHRvIHN1cHBseSBpcHY2Oi8vCi0gICAgT25seSB0cnkgaXQgaWYgeW91IGVuY291bnRlciBwcm9ibGVtcy4gIEFsc28gbm90ZSB0aGF0IHRoZSBpcHY2Oi8vCi0gICAgcHJveHkgdHlwZSBkb2VzIG5vdCB3b3JrIG9uIFdpbmRvd3MsIHNvIG9ubHkgdGhlIGF1dG9kZXRlY3Rpb24gaXMKLSAgICBhdmFpbGFibGUgdGhlcmUuCi0KLSAgICBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgc29tZSBvdGhlciBwcm94eSwgZS5nLiBTT0NLUyBvciBIVFRQIGFuZCB0aGF0Ci0gICAgcHJveHkgc2VydmVyIGlzIGFuIElQdjYgaG9zdCAob3Igd2lsbCBjb25uZWN0IHlvdSB0byBvbmUpIHRoZW4gYW55Ci0gICAgc29ydCBvZiBjb25uZWN0aW9uIHRocm91Z2ggdGhhdCBwcm94eSB3aWxsIHdvcmsgT0s6IHVuLWVuY3J5cHRlZCBhcwotICAgIHdlbGwgYXMgU1NMIG9yIFNTSCBjb25uZWN0aW9ucywgZXRjLgotCi0gICAgVW5lbmNyeXB0ZWQgY29ubmVjdGlvbiBpcyB0aGUgb25seSBzcGVjaWFsIGNhc2Ugd2hlcmUgeW91IG1heSBuZWVkCi0gICAgdG8gc3BlY2lmeSBhbiBpcHY2Oi8vIHByb3h5LiAgSWYgeW91IGZpbmQgYW5vdGhlciB1c2UgbGV0IHVzIGtub3cuCi0KLSAgICBTZWUgVGlwIDIwIGZvciBtb3JlIGluZm8uCi19Ci0KLQlzZXQgaGVscF90aXBzIHsKLSBUaXBzIGFuZCBUcmlja3M6Ci0KLSAgICAgVGFibGUgb2YgQ29udGVudHM6Ci0KLSAgICAgIDEpIENvbm5lY3QgdG8gTm9uLVN0YW5kYXJkIFNTSCBwb3J0LgotICAgICAgMikgUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgKExpc3RlbmluZykKLSAgICAgIDMpIEdsb2JhbCBvcHRpb25zIGluIH4vLnNzdm5jcmMKLSAgICAgIDQpIEZvbnRzCi0gICAgICA1KSB2bmM6Ly9ob3N0IGZvciB1bi1lbmNyeXB0ZWQgY29ubmVjdGlvbgotICAgICAgNikgSG9tZSBkaXJlY3RvcnkgZm9yIG1lbW9yeSBzdGljayB1c2FnZSwgZXRjLgotICAgICAgNykgdm5jczovLyB2bmNzc2w6Ly8gdm5jK3NzbDovLyB2bmMrc3NoOi8vIFVSTC1saWtlIHByZWZpeGVzCi0gICAgICA4KSBzc2h2bmMgLyAtc3NoIFNTSCBvbmx5IEdVSQotICAgICAgOSkgdHN2bmMgLyAtdHMgVGVybWluYWwgc2VydmljZXMgb25seSBHVUkgKFNTSCt4MTF2bmMpCi0gICAgIDEwKSAybmQgR1VJIHdpbmRvdyBvbiBVbml4L01hY09TWAotICAgICAxMSkgQ3RybC1MIG9yIEJ1dHRvbjMgdG8gTG9hZCBwcm9maWxlCi0gICAgIDEyKSBTSEVMTCBjb21tYW5kIG9yIEN0cmwtUyBmb3IgU1NIIHRlcm1pbmFsIHcvbyBWTkMKLSAgICAgMTMpIEtOT0NLIGNvbW1hbmQgZm9yIHBvcnQta25vY2sgc2VxdWVuY2UKLSAgICAgMTQpIFVuaXgvTWFjT1NYIGdlbmVyYWwgU1NMIHJlZGlyZWN0b3IgKG5vdCBqdXN0IFZOQykKLSAgICAgMTUpIEVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAxNikgQmlnZ2VyICJPcGVuIEZpbGUiIGRpYWxvZyB3aW5kb3cKLSAgICAgMTcpIFVuaXgvTWFjT1NYIGV4dHJhIGRlYnVnZ2luZyBvdXRwdXQKLSAgICAgMTgpIER5bmFtaWMgVk5DIFNlcnZlciBQb3J0IGRldGVybWluYXRpb24gd2l0aCBTU0gKLSAgICAgMTkpIE5vIC10IHNzaCBjbWRsaW5lIG9wdGlvbiBmb3Igb2xkZXIgc3NoZAotICAgICAyMCkgSVB2NiBzdXBwb3J0LgotCi0gICAgIDEpIFRvIGNvbm5lY3QgaW4gU1NILU1vZGUgdG8gYSBzZXJ2ZXIgcnVubmluZyBTU0ggb24gYSBub24tc3RhbmRhcmQKLSAgICAgICAgcG9ydCAoMjIgaXMgdGhlIHN0YW5kYXJkIHBvcnQpIHlvdSBuZWVkIHRvIHVzZSB0aGUgUHJveHkvR2F0ZXdheQotICAgICAgICBzZXR0aW5nLiAgVGhlIGZvbGxvd2luZyBpcyBmcm9tIHRoZSBQcm94aWVzIEhlbHAgcGFuZWw6Ci0KLSAgICAgICAgTk9OLVNUQU5EQVJEIFNTSCBQT1JUOiBUbyB1c2UgYSBub24tc3RhbmRhcmQgc3NoIHBvcnQgKGkuZS4gYSBwb3J0IG90aGVyCi0gICAgICAgIHRoYW4gMjIpIHlvdSBuZWVkIHRvIHVzZSB0aGUgUHJveHkvR2F0ZXdheXMgYXMgd2VsbC4gIEUuZy4gc29tZXRoaW5nCi0gICAgICAgIGxpa2UgdGhpcyBmb3IgcG9ydCAyMjIyOiAKLSAgICAKLSAgICAgICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6ICAgbG9jYWxob3N0OjAKLSAgICAgICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgICAgam9lQGZhci1hd2F5LmVhc3Q6MjIyMgotICAgIAotICAgICAgICBUaGUgdXNlcm5hbWVAIGlzIG5vdCBuZWVkZWQgaWYgaXQgaXMgdGhlIHNhbWUgYXMgb24gdGhlIGNsaWVudC4gIFRoaXMKLSAgICAgICAgd2lsbCBhbHNvIHdvcmsgZ29pbmcgdG8gYSBkaWZmZXJlbnQgaW50ZXJuYWwgbWFjaGluZSwgZS5nLiAiam9lcy1wYzowIgotICAgICAgICBpbnN0ZWFkIG9mICJsb2NhbGhvc3Q6MCIsIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlLgotICAgIAotICAgICAyKSBSZXZlcnNlIFZOQyBjb25uZWN0aW9ucyAoTGlzdGVuaW5nKSBhcmUgcG9zc2libGUgYXMgd2VsbC4KLSAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBWTkMgU2VydmVyIGluaXRpYXRlcyB0aGUgY29ubmVjdGlvbiB0byB5b3VyCi0gICAgICAgIHdhaXRpbmcgKGkuZS4gbGlzdGVuaW5nKSBTU1ZOQyB2aWV3ZXIuCi0KLSAgICAgICAgR28gdG8gT3B0aW9ucyBhbmQgc2VsZWN0ICJSZXZlcnNlIFZOQyBjb25uZWN0aW9uIi4gIEluIHRoZSAnVk5DCi0gICAgICAgIEhvc3Q6RGlzcGxheScgZW50cnkgYm94IHB1dCBpbiB0aGUgbnVtYmVyIChlLmcuICIwIiBvciAiOjAiLCBvcgotICAgICAgICAiOjEiLCBldGMpIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIExpc3RlbmluZyBkaXNwbGF5ICgwIC0+IHBvcnQKLSAgICAgICAgNTUwMCwgMSAtPiBwb3J0IDU1MDEsIGV0Yy4pIHlvdSB3YW50IHRvIHVzZS4gIFRoZW4gY2xpY2tpbmcgb24KLSAgICAgICAgJ0xpc3RlbicgcHV0cyB5b3VyIFNTVk5DIHZpZXdlciBpbiBhICJsaXN0ZW5pbmciIHN0YXRlIG9uIHRoYXQKLSAgICAgICAgcG9ydCBudW1iZXIsIHdhaXRpbmcgZm9yIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBWTkMgU2VydmVyLgotCi0gICAgICAgIE9uIFdpbmRvd3Mgb3IgdXNpbmcgYSAzcmQgcGFydHkgVk5DIFZpZXdlciBtdWx0aXBsZSwgc2ltdWx0YW5lb3VzCi0gICAgICAgIHJldmVyc2UgY29ubmVjdGlvbnMgYXJlIGFsd2F5cyBlbmFibGVkLiAgT24gVW5peC9NYWNPU1ggd2l0aCB0aGUKLSAgICAgICAgcHJvdmlkZWQgc3N2bmN2aWV3ZXIgdGhleSBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtOgotICAgICAgICBPcHRpb25zIC0+IEFkdmFuY2VkIC0+IFVuaXggc3N2bmN2aWV3ZXIgLT4gTXVsdGlwbGUgTElTVEVOIENvbm5lY3Rpb25zCi0KLSAgICAgICAgU3BlY2lmeSBhIHNwZWNpZmljIGludGVyZmFjZSwgZS5nLiAxOTIuMTY4LjEuMTowIHRvIGhhdmUgc3R1bm5lbAotICAgICAgICBvbmx5IGxpc3RlbiBvbiB0aGF0IGludGVyZmFjZS4gIElQdjYgd29ya3MgdG9vLCBlLmcuIDo6OjAgb3IgOjoxOjAKLSAgICAgICAgVGhpcyBhbHNvIHdvcmtzIGZvciBVTi1lbmNyeXB0ZWQgcmV2ZXJzZSBjb25uZWN0aW9ucyBhcyB3ZWxsICgnTm9uZScpLgotCi0gICAgICAgIFNlZSB0aGUgT3B0aW9ucyBIZWxwIGZvciBtb3JlIGluZm8uCi0KLSAgICAgMykgWW91IGNhbiBwdXQgZ2xvYmFsIG9wdGlvbnMgaW4geW91ciB+Ly5zc3ZuY3JjIGZpbGUgKHNzdm5jX3JjIG9uCi0gICAgICAgIFdpbmRvd3MpLiBDdXJyZW50bHkgdGhleSBhcmU6Ci0KLQlQdXQgIm1vZGU9dHN2bmMiIG9yICJtb2RlPXNzaHZuYyIgaW4gdGhlIH4vLnNzdm5jcmMgZmlsZSB0byBoYXZlCi0JdGhlIGFwcGxpY2F0aW9uIHN0YXJ0IHVwIGluIHRoZSBnaXZlbiBtb2RlLgotCi0gICAgICAgIGRlc2t0b3BfdHlwZT13bWFrZXIgICAgKGUuZy4pIHRvIHN3aXRjaCB0aGUgZGVmYXVsdCBEZXNrdG9wIFR5cGUuCi0KLSAgICAgICAgZGVza3RvcF9zaXplPTEyODB4MTAyNCAoZS5nLikgdG8gc3dpdGNoIHRoZSBkZWZhdWx0IERlc2t0b3AgU2l6ZS4KLQotICAgICAgICBkZXNrdG9wX2RlcHRoPTI0ICAgICAgIChlLmcuKSB0byBzd2l0Y2ggdGhlIGRlZmF1bHQgRGVza3RvcCBDb2xvciBEZXB0aAotCi0gICAgICAgIHhzZXJ2ZXJfdHlwZT1YZHVtbXkgICAgKGUuZy4pIHRvIHN3aXRjaCB0aGUgZGVmYXVsdCBYIFNlcnZlciBUeXBlLgotCi0gICAgICAgIChUaGUgYWJvdmUgNCBzZXR0aW5ncyBhcHBseSBvbmx5IHRvIHRoZSBUZXJtaW5hbCBTZXJ2aWNlcyBNb2RlLikKLQotICAgICAgICBub2VuYz0xICAoc2FtZSBhcyB0aGUgLW5vZW5jIG9wdGlvbiBmb3IgYSAnTm8gRW5jcnlwdGlvbicgb3B0aW9uKQotICAgICAgICBub2VuYz0wICAoZG8gbm90IHNob3cgdGhlICdObyBFbmNyeXB0aW9uJyBvcHRpb24pCi0KLSAgICAgICAga2lsbHN0dW5uZWw9MSAoc2FtZSBhcyAta2lsbHN0dW5uZWwpLCBvbiBXaW5kb3dzIGF1dG9tYXRpY2FsbHkga2lsbHMKLSAgICAgICAgdGhlIFNUVU5ORUwgcHJvY2VzcyB3aGVuIHRoZSB2aWV3ZXIgZXhpdHMuICBEaXNhYmxlIHZpYSBraWxsc3R1bm5lbD0wCi0gICAgICAgIGFuZCAtbm9raWxsc3R1bm5lbC4KLQotICAgICAgICBpcHY2PTAgICBhY3QgYXMgdGhvdWdoIElQdjYgd2FzIG5vdCBkZXRlY3RlZC4KLSAgICAgICAgaXB2Nj0xICAgYWN0IGFzIHRob3VnaCBJUHY2IHdhcyBkZXRlY3RlZC4KLQotICAgICAgICBjb3R2bmM9MSBoYXZlIHRoZSBkZWZhdWx0IHZuY3ZpZXdlciBvbiBNYWMgT1MgWCBiZSB0aGUgQ2hpY2tlbiBvZgotICAgICAgICB0aGUgVk5DLiAgQnkgZGVmYXVsdCB0aGUgaW5jbHVkZWQgc3N2bmMgWDExIHZuY3ZpZXdlciBpcyB1c2VkCi0gICAgICAgIChyZXF1aXJlcyBNYWMgT1MgWCBYMTEgc2VydmVyIHRvIGJlIHJ1bm5pbmcuKQotCi0gICAgICAgIG15Y2VydD1maWxlIChzYW1lIGFzIC1teWNlcnQgZmlsZSBvcHRpb24pLiAgU2V0IHlvdXIgZGVmYXVsdCBNeUNlcnQKLSAgICAgICAgdG8gImZpbGUiLiAgSWYgZmlsZSBkb2VzIG5vdCBleGlzdCB+Ly52bmMvY2VydHMvZmlsZSBpcyB1c2VkLgotCi0gICAgICAgIGNhY2VydD1maWxlIChzYW1lIGFzIC1jYWNlcnQgZmlsZSBvcHRpb24pLiAgU2V0IHlvdXIgZGVmYXVsdCBTZXJ2ZXJDZXJ0Ci0gICAgICAgIHRvICJmaWxlIi4gIElmIGZpbGUgZG9lcyBub3QgZXhpc3Qgfi8udm5jL2NlcnRzL2ZpbGUgaXMgdXNlZC4gIElmCi0gICAgICAgIGZpbGUgaXMgIkNBIiB0aGVuIH4vLnZuYy9jZXJ0cy9DQS9jYWNlcnQucGVtIGlzIHVzZWQuCi0KLSAgICAgICAgY3JsPWZpbGUgKHNhbWUgYXMgLWNybCBmaWxlIG9wdGlvbikuICBTZXQgeW91ciBkZWZhdWx0IENSTCBGaWxlCi0gICAgICAgIHRvICJmaWxlIi4gIElmIGZpbGUgZG9lcyBub3QgZXhpc3Qgfi8udm5jL2NlcnRzL2ZpbGUgaXMgdXNlZC4KLQotICAgICAgICBQcmVmaXggYW55IG9mIHRoZXNlIGNlcnQva2V5IGZpbGVzIHdpdGggIkZPUkNFOiIgdG8gbWFrZSB0aGVtCi0gICAgICAgIGltbXV0YWJsZSwgZS5nLiAgImNhY2VydD1GT1JDRTpDQSIuCi0KLSAgICAgICAgWW91IGNhbiBzZXQgYW55IGVudmlyb25tZW50IHZhcmlhYmxlIGluIH4vLnNzdm5jcmMgYnkgdXNpbmcgYSBsaW5lCi0gICAgICAgIGxpa2UgZW52PVZBUj12YWx1ZSwgZm9yIGV4YW1wbGU6ICBlbnY9U1NWTkNfRklOSVNIX1NMRUVQPTIKLQotICAgICAgICBUbyBjaGFuZ2UgdGhlIGZvbnRzIChzZWUgVGlwIDQgYmVsb3cgZm9yIGV4YW1wbGVzKToKLQotICAgICAgICBmb250X2RlZmF1bHQ9dGstZm9udC1uYW1lICAgICAoc2V0cyB0aGUgZm9udCBmb3IgbWVudXMgYW5kIGJ1dHRvbnMpCi0gICAgICAgIGZvbnRfZml4ZWQ9dGstZm9udC1uYW1lICAgICAgIChzZXRzIHRoZSBmb250IGZvciBoZWxwIHRleHQpCi0KLSAgICAgNCkgRm9udHM6IFRvIGNoYW5nZSB0aGUgdGsgZm9udHMsIHNldCB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHVwIHNzdm5jOiBTU1ZOQ19GT05UX0RFRkFVTFQgYW5kIFNTVk5DX0ZPTlRfRklYRUQuCi0gICAgICAgIEZvciBleGFtcGxlOgotCi0gICAgICAgICAgICAlIGVudiBTU1ZOQ19GT05UX0RFRkFVTFQ9J2hlbHZldGljYSAtMjAgYm9sZCcgc3N2bmMKLSAgICAgICAgICAgICUgZW52IFNTVk5DX0ZPTlRfRklYRUQ9J2NvdXJpZXIgLTE0JyBzc3ZuYwotCi0gICAgICAgIG9yIHNldCBib3RoIG9mIHRoZW0gYXQgb25jZS4gIFlvdSBjYW4gYWxzbyBzZXQgJ2ZvbnRfZGVmYXVsdCcgYW5kCi0gICAgICAgICdmb250X2ZpeGVkJyBpbiB5b3VyIH4vLnNzdm5jcmMuICBFLmcuOgotCi0gICAgICAgIGZvbnRfZGVmYXVsdD1oZWx2ZXRpY2EgLTE2IGJvbGQKLSAgICAgICAgZm9udF9maXhlZD1jb3VyaWVyIC0xMgotCi0gICAgIDUpIElmIHlvdSB3YW50IHRvIG1ha2UgYSBEaXJlY3QgVk5DIGNvbm5lY3Rpb24sIFdJVEggKk5PKiBTU0wgT1IKLSAgICAgICAgU1NIIEVOQ1JZUFRJT04gb3IgYXV0aGVudGljYXRpb24sIHVzZSB0aGUgInZuYzovLyIgcHJlZml4IGluIHRoZQotICAgICAgICBWTkMgSG9zdDpEaXNwbGF5IGVudHJ5IGJveCwgZS5nLiAidm5jOi8vZmFyLWF3YXkuZWFzdDowIiAgVGhpcwotICAgICAgICBhbHNvIHdvcmtzIGZvciByZXZlcnNlIGNvbm5lY3Rpb25zLCBlLmcuIHZuYzovLzAKLQotICAgICAgICBVc2UgVm5jOi8vIChpLmUuIGNhcGl0YWwgJ1YnKSB0byBhdm9pZCBiZWluZyBwcm9tcHRlZCBpZiB5b3UgYXJlCi0gICAgICAgIHN1cmUgeW91IHdhbnQgbm8gZW5jcnlwdGlvbi4gIEZvciBleGFtcGxlLCAiVm5jOi8vZmFyLWF3YXkuZWFzdDowIgotICAgICAgICBTaGlmdCtDdHJsLUUgaW4gdGhlIGVudHJ5IGJveCBpcyBhIHNob3J0LWN1dCB0byBhZGQgb3IgcmVtb3ZlCi0gICAgICAgIHRoZSBwcmVmaXggIlZuYzovLyIgZnJvbSB0aGUgaG9zdDpkaXNwIHN0cmluZy4KLQotICAgICAgICBZb3UgY2FuIGFsc28gcnVuIHNzdm5jIHdpdGggdGhlICctbm9lbmMnIGNtZGxpbmUgb3B0aW9uIChub3cKLSAgICAgICAgdGhlIGRlZmF1bHQpIHRvIGhhdmUgYSBjaGVjayBvcHRpb24gJ05vbmUnIHRoYXQgbGV0cyB5b3UgdHVybiBvZmYKLSAgICAgICAgRW5jcnlwdGlvbiAoYW5kIHByb2ZpbGVzIHdpbGwgc3RvcmUgdGhpcyBzZXR0aW5nKS4gIFByZXNzaW5nIEN0cmwtRQotICAgICAgICBvbiB0aGUgbWFpbiBwYW5lbCBpcyBhIHNob3J0LWN1dCB0byB0b2dnbGUgYmV0d2VlbiB0aGUgLW5vZW5jICdObwotICAgICAgICBFbmNyeXB0aW9uJyBtb2RlIGFuZCBub3JtYWwgbW9kZS4gIFRoZSBvcHRpb24gIlNob3cgJ05vIEVuY3J5cHRpb24nCi0gICAgICAgIE9wdGlvbiIgdW5kZXIgT3B0aW9ucyBhbHNvIHRvZ2dsZXMgaXQuCi0KLSAgICAgICAgVGhlICctZW5jJyBvcHRpb24gZGlzYWJsZXMgdGhlIGJ1dHRvbiAoYW5kIHNvIG1ha2VzIGl0IGxlc3Mgb2J2aW91cwotICAgICAgICB0byBuYWl2ZSB1c2VycyBob3cgdG8gZGlzYWJsZSBlbmNyeXB0aW9uLikKLQotICAgICAgICBOb3RlIGFzIG9mIFNTVk5DIDEuMC4yNSB0aGUgJy1ub2VuYycgbW9kZSBpcyBub3cgdGhlIGRlZmF1bHQuIEkuZS4KLSAgICAgICAgdGhlICdObyBFbmNyeXB0aW9uJyBvcHRpb24gKCdOb25lJykgaXMgc2hvd24gYnkgZGVmYXVsdC4gIFdoZW4KLSAgICAgICAgeW91IHNlbGVjdCAnTm9uZScgeW91IGRvIG5vdCBuZWVkIHRvIHN1cHBseSB0aGUgInZuYzovLyIgcHJlZml4LgotICAgICAgICBUbyBkaXNhYmxlIHRoZSBidXR0b24gc3VwcGx5IHRoZSAnLWVuYycgY21kbGluZSBvcHRpb24uCi0KLSAgICAgICAgU2V0dGluZyBTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OPTEgaW4geW91ciBlbnZpcm9ubWVudCBpcwotICAgICAgICB0aGUgc2FtZSBhcyAtbm9lbmMuICBZb3UgY2FuIGFsc28gcHV0IG5vZW5jPTEgaW4geW91ciB+Ly5zc3ZuY3JjIGZpbGUuCi0KLSAgICAgICAgU2V0dGluZyBTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OPTAgaW4geW91ciBlbnZpcm9ubWVudCBpcwotICAgICAgICB0aGUgc2FtZSBhcyAtZW5jLiAgWW91IGNhbiBhbHNvIHB1dCBub2VuYz0wIGluIHlvdXIgfi8uc3N2bmNyYyBmaWxlLgotCi0gICAgICAgIFBsZWFzZSBiZSBjYXV0aW91cy90aG91Z2h0ZnVsIHdoZW4geW91IG1ha2UgYSBWTkMgY29ubmVjdGlvbiB3aXRoCi0gICAgICAgIGVuY3J5cHRpb24gZGlzYWJsZWQuICBZb3UgbWF5IHNlbmQgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChlLmcuIGEKLSAgICAgICAgcGFzc3dvcmQpIG92ZXIgdGhlIG5ldHdvcmsgdGhhdCBjYW4gYmUgc25pZmZlZC4KLQotICAgICAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIChhbHRob3VnaCBkaWZmaWN1bHQpIGZvciBzb21lb25lIHRvIGhpamFjayBhbgotICAgICAgICBleGlzdGluZyB1bmVuY3J5cHRlZCBWTkMgc2Vzc2lvbi4KLQotICAgICAgICBPZnRlbiBTU1ZOQyBpcyB1c2VkIHRvIGNvbm5lY3QgdG8geDExdm5jIHdoZXJlIHRoZSBVbml4IHVzZXJuYW1lIGFuZAotICAgICAgICBwYXNzd29yZCBpcyBzZW50IG92ZXIgdGhlIGNoYW5uZWwuICBJdCB3b3VsZCBiZSBhIHZlcnkgYmFkIGlkZWEgdG8KLSAgICAgICAgbGV0IHRoYXQgZGF0YSBiZSBzZW50IG92ZXIgYW4gdW5lbmNyeXB0ZWQgY29ubmVjdGlvbiEgIEluIGdlbmVyYWwsCi0gICAgICAgIGl0IGlzIG5vdCB3aXNlIHRvIGhhdmUgYSBwbGFpbnRleHQgVk5DIGNvbm5lY3Rpb24uCi0KLSAgICAgICAgTm90ZSB0aGF0IGV2ZW4gdGhlIFZOQyBQYXNzd29yZCBjaGFsbGVuZ2UtcmVzcG9uc2UgbWV0aG9kICh0aGUgcGFzc3dvcmQKLSAgICAgICAgaXMgbm90IHNlbnQgaW4gcGxhaW50ZXh0KSBsZWF2ZXMgeW91ciBWTkMgcGFzc3dvcmQgc3VzY2VwdGlibGUgdG8gYQotICAgICAgICBkaWN0aW9uYXJ5IGF0dGFjayB1bmxlc3MgZW5jcnlwdGlvbiBpcyB1c2VkIHRvIGhpZGUgaXQuCi0KLSAgICAgICAgU28gKHdlbGwsIGJlZm9yZSB3ZSBtYWRlIHRoZSBidXR0b24gdmlzaWJsZSBieSBkZWZhdWx0ISkgd2UgZm9yY2VkCi0gICAgICAgIHlvdSB0byBsZWFybiBhYm91dCBhbmQgc3VwcGx5IHRoZSAidm5jOi8vIiBvciAiVm5jOi8vIiBwcmVmaXggdG8KLSAgICAgICAgdGhlIGhvc3Q6cG9ydCBvciB1c2UgLW5vZW5jIG9yIHRoZSAiU2hvdyAnTm8gRW5jcnlwdGlvbicgT3B0aW9uIgotICAgICAgICB0byBkaXNhYmxlIGVuY3J5cHRpb24uICBUaGlzIGlzIGEgc21hbGwgaHVyZGxlLCBidXQgbWF5YmUgc29tZW9uZQotICAgICAgICB3aWxsIHRoaW5rIHR3aWNlLiAgSXQgaXMgYSBzaGFtZSB0aGF0IFZOQyBoYXMgYmVlbiBhcm91bmQgZm9yCi0gICAgICAgIG92ZXIgMTAgeWVhcnMgYW5kIHN0aWxsIGRvZXMgbm90IGhhdmUgYnVpbHQtaW4gc3Ryb25nIGVuY3J5cHRpb24uCi0KLSAgICAgICAgTm90ZSB0aGUgVm5jOi8vIG9yIHZuYzovLyBwcmVmaXggd2lsbCBiZSBzdG9yZWQgaW4gYW55IHByb2ZpbGUgdGhhdAotICAgICAgICB5b3Ugc2F2ZSBzbyB5b3UgZG8gbm90IGhhdmUgdG8gZW50ZXIgaXQgZXZlcnkgdGltZS4KLQotICAgICAgICBTZXQgdGhlIGVudiB2YXIgU1NWTkNfTk9fRU5DX1dBUk49MSB0byBza2lwIHRoZSB3YXJuaW5nIHByb21wdHMgdGhlCi0gICAgICAgIHNhbWUgYXMgdGhlIGNhcGl0YWxpemVkIFZuYzovLyBkb2VzLgotCi0gICAgIDYpIE1vYmlsZSBVU0IgbWVtb3J5IHN0aWNrIC8gZmxhc2ggZHJpdmUgdXNhZ2U6ICBZb3UgY2FuIHVucGFjawotICAgICAgICBzc3ZuYyB0byBhIGZsYXNoIGRyaXZlIGZvciBpbXByb21wdHUgdXNhZ2UgKGUuZy4gZnJvbSBhIGZyaWVuZHMKLSAgICAgICAgY29tcHV0ZXIpLiAKLQotICAgICAgICBJZiB5b3UgY3JlYXRlIGEgZGlyZWN0b3J5ICJIb21lIiBpbiB0aGUgdG9wbGV2ZWwgc3N2bmMgZGlyZWN0b3J5LAotICAgICAgICB0aGVuIHRoYXQgd2lsbCBiZSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgeW91ciBWTkMgcHJvZmlsZXMKLSAgICAgICAgYW5kIGNlcnRzLiAgU28gdGhleSBmb2xsb3cgdGhlIGRyaXZlIHRoaXMgd2F5LiAgSWYgeW91IHJ1biBsaWtlCi0gICAgICAgIHRoaXM6ICJzc3ZuYyAuIiBvciAic3N2bmMuZXhlIC4iIHRoZSAiSG9tZSIgZGlyZWN0b3J5IHdpbGwgYmUKLSAgICAgICAgY3JlYXRlZCBmb3IgeW91LgotCi0gICAgICAgIFdBUk5JTkc6IGlmIHlvdSB1c2Ugc3N2bmMgZnJvbSBhbiAiSW50ZXJuZXQgQ2FmZSIsIGkuZS4gYW4KLSAgICAgICAgdW50cnVzdGVkIGNvbXB1dGVyLCBhbiB1bnNjcnVwdWxvdXMgcGVyc29uIG1heSBiZSBjYXB0dXJpbmcKLSAgICAgICAga2V5c3Ryb2tlcywgZXRjLiEKLQotCVlvdSBjYW4gYWxzbyBzZXQgdGhlIFNTVk5DX0hPTUUgZW52LiB2YXIuIHRvIHBvaW50IHRvIGFueQotCWRpcmVjdG9yeSB5b3Ugd2FudC4gSXQgY2FuIGJlIHNldCBhZnRlciBzdGFydGluZyBzc3ZuYyBieSBwdXR0aW5nCi0JSE9NRT0vcGF0aC90by9kaXIgaW4gdGhlIEhvc3Q6RGlzcGxheSBib3ggYW5kIGNsaWNraW5nICJDb25uZWN0Ii4KLQotICAgICAgICBGb3IgYSBXaW5kb3dzIEJBVCBmaWxlIHRvIGdldCB0aGUgIkhvbWUiIGRpcmVjdG9yeSBjb3JyZWN0Ci0gICAgICAgIHNvbWV0aGluZyBsaWtlIHRoaXMgbWlnaHQgYmUgbmVlZGVkOgotCi0gICAgICAgICBjZCBcc3N2bmNcV2luZG93cwotICAgICAgICAgc3RhcnQgXHNzdm5jXFdpbmRvd3Ncc3N2bmMuZXhlIAotCi0gICAgIDcpIEluIHRoZSBWTkMgSG9zdDpEaXNwbGF5IGVudHJ5IHlvdSBjYW4gYWxzbyB1c2UgdGhlc2UgIlVSTC1saWtlIgotICAgICAgICBwcmVmaXhlczoKLQotICAgICAgICAgICB2bmNzOi8vaG9zdDowLCB2bmNzc2w6Ly9ob3N0OjAsIHZuYytzc2w6Ly9ob3N0OjAgIGZvciBTU0wKLQotICAgICAgICBhbmQKLQotICAgICAgICAgICB2bmNzc2g6Ly9ob3N0OjAsIHZuYytzc2g6Ly9ob3N0OjAgICAgICAgICAgICAgICAgIGZvciBTU0gKLQotICAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIHRvZ2dsZSB0aGUgU1NML1NTSCBzZXR0aW5nLiAgVGhlc2UgYWxzbyB3b3JrCi0gICAgICAgIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgZS5nLjogIHNzdm5jIHZuYytzc2g6Ly9teW1hY2hpbmU6MTAKLQotICAgICA4KSBJZiB5b3Ugd2FudCB0aGlzIGFwcGxpY2F0aW9uIHRvIGJlIFNTSCBvbmx5LCB0aGVuIHN1cHBseSB0aGUKLSAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXNzaCIgb3Igc2V0IHRoZSBlbnYuIHZhciBTU1ZOQ19TU0hfT05MWT0xLgotCi0gICAgICAgIFRoZW4gbm8gR1VJIGVsZW1lbnRzIHNwZWNpZmljIHRvIFNTTCB3aWxsIGFwcGVhciAodGhlCi0gICAgICAgIGRvY3VtZW50YXRpb24gd2lsbHMgc3RpbGwgcmVmZXIgdG8gdGhlIFNTTCBtb2RlLCBob3dldmVyKS4KLSAgICAgICAgVG8gY29udmVydCBhIHJ1bm5pbmcgYXBwIHRvIHNzaC1vbmx5IHNlbGVjdCAiTW9kZTogU1NILU9ubHkiCi0gICAgICAgIGluIE9wdGlvbnMuCi0KLSAgICAgICAgVGhlIHdyYXBwZXIgc2NyaXB0cyAic3Nodm5jIiBhbmQgInNzaHZuYy5iYXQiIHdpbGwgc3RhcnQgaXQgdXAKLSAgICAgICAgYXV0b21hdGljYWxseSB0aGlzIHdheS4KLQotICAgICAgICBPciBpbiB5b3VyIH4vLnNzdm5jcmMgKG9yIH4vc3N2bmNfcmMgb24gV2luZG93cykgcHV0ICJtb2RlPXNzaHZuYyIKLSAgICAgICAgdG8gaGF2ZSB0aGUgdG9vbCBhbHdheXMgc3RhcnQgdXAgaW4gdGhhdCBtb2RlLgotCi0gICAgIDkpIEZvciBhbiBldmVuIHNpbXBsZXIgIlRlcm1pbmFsIFNlcnZpY2VzIiBtb2RlIHVzZSAidHN2bmMiIG9yCi0gICAgICAgICJ0c3ZuYy5iYXQiIChvciAiLXRzIiBvcHRpb24pLiAgVGhpcyBtb2RlIGF1dG9tYXRpY2FsbHkgbGF1bmNoZXMKLSAgICAgICAgeDExdm5jIG9uIHRoZSByZW1vdGUgc2lkZSB0byBmaW5kIG9yIGNyZWF0ZSB5b3VyIERlc2t0b3Agc2Vzc2lvbgotICAgICAgICAodXN1YWxseSB0aGUgWHZmYiBYIHNlcnZlcikuICBTbyB4MTF2bmMgbXVzdCBiZSBhdmFpbGFibGUgb24gdGhlCi0gICAgICAgIHJlbW90ZSBzZXJ2ZXIgbWFjaGluZXMgdW5kZXIgIlRlcm1pbmFsIFNlcnZpY2VzIiBtb2RlLgotCi0gICAgICAgIEZyb20gYSBmdWxsIHNzdm5jIHlvdSBjYW4gcHJlc3MgQ3RybC1oIHRvIGdvIGludG8gc3NoLW9ubHkgbW9kZQotICAgICAgICBhbmQgQ3RybC10IHRvIHRvZ2dsZSBiZXR3ZWVuICJ0c3ZuYyIgYW5kICJzc3ZuYyIgbW9kZXMuICBUaGUKLSAgICAgICAgT3B0aW9ucyBNb2RlIG1lbnUgYWxzbyBsZXQgeW91IHN3aXRjaC4KLQotICAgICAgICBPciBpbiB5b3VyIH4vLnNzdm5jcmMgKG9yIH4vc3N2bmNfcmMgb24gV2luZG93cykgcHV0ICJtb2RlPXRzdm5jIgotICAgICAgICB0byBoYXZlIHRoZSB0b29sIGFsd2F5cyBzdGFydCB1cCBpbiB0aGF0IG1vZGUuCi0KLSAgICAxMCkgT24gVW5peCB0byBnZXQgYSAybmQgR1VJIChlLmcuIGZvciBhIDJuZCBjb25uZWN0aW9uKSBwcmVzcyBDdHJsLU4KLSAgICAgICAgb24gdGhlIEdVSS4gIElmIG9ubHkgdGhlIHh0ZXJtIHdpbmRvdyBpcyB2aXNpYmxlIHlvdSBjYW4gcHJlc3MKLSAgICAgICAgQ3RybC1OIG9yIHRyeSBDdHJsLUxlZnRCdXR0b24gLT4gTmV3IFNTVk5DX0dVSS4gIE9uIFdpbmRvd3MgeW91Ci0gICAgICAgIHdpbGwgaGF2ZSB0byBtYW51YWxseSBTdGFydCBhIG5ldyBvbmU6IFN0YXJ0IC0+IFJ1biAuLi4sIGV0Yy4KLQotICAgIDExKSBQcmVzc2luZyB0aGUgIkxvYWQiIGJ1dHRvbiBvciBwcmVzc2luZyBDdHJsLUwgb3IgQ2xpY2tpbmcgdGhlIFJpZ2h0Ci0gICAgICAgIG1vdXNlIGJ1dHRvbiBvbiB0aGUgbWFpbiBHVUkgd2lsbCBpbnZva2UgdGhlIExvYWQgZGlhbG9nLgotCi0gICAgICAgIFByZXNzaW5nIEN0cmwtTyBvbiB0aGUgbWFpbiBHVUkgd2lsbCBicmluZyB1cCB0aGUgT3B0aW9ucyBQYW5lbC4KLSAgICAgICAgUHJlc3NpbmcgQ3RybC1BIG9uIHRoZSBtYWluIEdVSSB3aWxsIGJyaW5nIHVwIHRoZSBBZHZhbmNlZCBPcHRpb25zLgotCi0gICAgMTIpIElmIHlvdSB1c2UgIlNIRUxMIiBmb3IgdGhlICJSZW1vdGUgU1NIIENvbW1hbmQiIChvciBpbiB0aGUgZGlzcGxheQotICAgICAgICBsaW5lOiAidXNlckBob3N0bmFtZSBjbWQ9U0hFTEwiKSB0aGVuIHlvdSBnZXQgYW4gU1NIIHNoZWxsIG9ubHk6Ci0gICAgICAgIG5vIFZOQyB2aWV3ZXIgd2lsbCBiZSBsYXVuY2hlZC4gIE9uIFdpbmRvd3MgIlBVVFRZIiB3aWxsIHRyeQotICAgICAgICB0byB1c2UgcHV0dHkuZXhlIChiZXR0ZXIgdGVybWluYWwgZW11bGF0aW9uIHRoYW4gcGxpbmsuZXhlKS4KLQotICAgICAgICBBIFNob3J0Q3V0IGZvciB0aGlzIGlzIEN0cmwtUyB3aXRoIHVzZXJAaG9zdG5hbWUgaW4gdGhlIGVudHJ5IGJveC4KLQotICAgIDEzKSBJZiB5b3UgdXNlICJLTk9DSyIgZm9yIHRoZSAiUmVtb3RlIFNTSCBDb21tYW5kIiAob3IgaW4gdGhlIGRpc3BsYXkKLSAgICAgICAgbGluZSAidXNlckBob3N0bmFtZSBjbWQ9S05PQ0siKSB0aGVuIG9ubHkgdGhlIHBvcnQta25vY2tpbmcgaXMgZG9uZS4KLQotICAgICAgICBBIFNob3J0Q3V0IGZvciB0aGlzIGlzIEN0cmwtUCB3aXRoIGhvc3RuYW1lIHRoZSBlbnRyeSBib3guCi0KLSAgICAgICAgSWYgaXQgaXMgS05PQ0tGLCBpLmUuIGFuIGV4dHJhICJGIiwgdGhlbiB0aGUgcG9ydC1rbm9ja2luZwotICAgICAgICAiRklOSVNIIiBzZXF1ZW5jZSBpcyBzZW50LCBpZiBhbnkuICBBIFNob3J0Q3V0IGZvciB0aGlzCi0gICAgICAgIFNoaWZ0LUN0cmwtUCBhcyBsb25nIGFzIGhvc3RuYW1lIGlzIHByZXNlbnQuCi0KLSAgICAxNCkgT24gVW5peCB0byBoYXZlIFNTVk5DIGFjdCBhcyBhIGdlbmVyYWwgU1RVTk5FTCByZWRpcmVjdG9yIChpLmUuIG5vCi0gICAgICAgIFZOQyksIHB1dCB0aGUgZGVzaXJlZCBob3N0OnBvcnQgaW4gVk5DIEhvc3Q6RGlzcGxheSAodXNlIGEKLSAgICAgICAgbmVnYXRpdmUgcG9ydCB2YWx1ZSBpZiBpdCBpcyB0byBiZSBsZXNzIHRoYW4gMjAwKSwgdGhlbiBnbyB0bwotICAgICAgICBPcHRpb25zIC0+IEFkdmFuY2VkIC0+IENoYW5nZSBWTkMgVmlld2VyLiAgQ2hhbmdlIHRoZSAidmlld2VyIgotICAgICAgICBjb21tYW5kIHRvIGJlICJ4bWVzc2FnZSBPSyIgb3IgInhtZXNzYWdlIDxwb3J0PiIgKG9yIHNsZWVwKSB3aGVyZQotICAgICAgICBwb3J0IGlzIHRoZSBkZXNpcmVkIGxvY2FsIGxpc3RlbmluZyBwb3J0LiAgVGhlbiBjbGljayBDb25uZWN0LgotICAgICAgICBJZiB5b3UgZGlkbid0IHNldCB0aGUgbG9jYWwgcG9ydCBsb29rIGZvciBpdCBpbiB0aGUgdGVybWluYWwgb3V0cHV0LgotCi0gICAgICAgIE9uIFdpbmRvd3Mgc2V0ICd2aWV3ZXInIHRvICJOT1RFUEFEIiBvciBzaW1pbGFyOyB5b3UgY2FuJ3QKLSAgICAgICAgY29udHJvbCB0aGUgcG9ydCB0aG91Z2guICBJdCBpcyB1c3VhbGx5IDU5MzAsIDU5MzEsIC4uLiBXYXRjaAotICAgICAgICB0aGUgbWVzc2FnZXMgb3IgbG9vayBhdCB0aGUgc3R1bm5lbCBsb2cuCi0KLSAgICAxNSkgVHJpY2tzIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzOgotCi0gICAgICAgIFlvdSBjYW4gY2hhbmdlIHRoZSBYIERJU1BMQVkgdmFyaWFibGUgYnkgdHlwaW5nIERJU1BMQVk9Li4uIGludG8KLSAgICAgICAgVk5DIEhvc3Q6RGlzcGxheSBhbmQgaGl0dGluZyBSZXR1cm4gb3IgY2xpY2tpbmcgQ29ubmVjdC4gU2FtZQotICAgICAgICBmb3IgSE9NRT0uICBPbiBNYWMsIHlvdSBjYW4gc2V0IERZTERfTElCUkFSWV9QQVRIPS4uLiB0b28uCi0gICAgICAgIEl0IHNob3VsZCBwcm9wYWdhdGUgZG93biB0aGUgdmlld2VyLgotCi0gICAgICAgIFNldHRpbmcgU0xFRVA9biBpbmNyZWFzZXMgdGhlIGFtb3VudCBvZiB0aW1lIHdhaXRlZCBiZWZvcmUKLSAgICAgICAgc3RhcnRpbmcgdGhlIHZpZXdlci4gIFRoZSBlbnYuIHZhci4gU1NWTkNfRVhUUkFfU0xFRVAgYWxzbyBkb2VzCi0gICAgICAgIHRoaXMgKGFuZCBhbHNvIFNsZWVwOiBPcHRpb24gc2V0dGluZykgU2V0dGluZyBGSU5JU0g9biBzZXRzIHRoZQotICAgICAgICBhbW91bnQgb2YgdGltZSBzbGVwdCBiZWZvcmUgdGhlIFRlcm1pbmFsIHdpbmRvdyBleGl0cyBvbiBVbml4Ci0gICAgICAgIGFuZCBNYWNPUyBYLiAgKHNhbWUgYXMgU1NWTkNfRklOSVNIX1NMRUVQIGVudi4gdmFyLikKLQotICAgICAgICBGdWxsIGxpc3Qgb2YgcGFyYW1ldGVycyBIT01FL1NTVk5DX0hPTUUsIERJU1BMQVkvU1NWTkNfRElTUExBWQotICAgICAgICBEWUxEX0xJQlJBUllfUEFUSC9TU1ZOQ19EWUxEX0xJQlJBUllfUEFUSCwgU0xFRVAvU1NWTkNfRVhUUkFfU0xFRVAKLSAgICAgICAgRklOSVNIL1NTVk5DX0ZJTklTSF9TTEVFUCwgREVCVUdfTkVUU1RBVCwgUkVQRUFURVJfRk9SQ0UsCi0gICAgICAgIFNTSF9PTkxZLCBUU19PTkxZLCBOT19ERUxFVEUsIEJBVF9TTEVFUCwgSVBWNi9TU1ZOQ19JUFY2PTAgb3IgMS4KLSAgICAgICAgU2VlIGJlbG93IGZvciBtb3JlIGluZm8uICAodGhlIG9uZXMgam9pbmVkIGJ5ICIvIiBhcmUgZXF1aXZhbGVudAotICAgICAgICBuYW1lcywgYW5kIHRoZSBsYXR0ZXIgY2FuIGJlIHNldCBhcyBhbiBlbnYuIHZhci4gYXMgd2VsbC4pCi0KLSAgICAgICAgQWZ0ZXIgeW91IHNldCB0aGUgcGFyYW1ldGVyLCBjbGVhciBvdXQgdGhlICdWTkMgSG9zdDpEaXNwbGF5JwotICAgICAgICBlbnRyeSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3R1YWwgaG9zdCBhbmQgZGlzcGxheSBudW1iZXIuCi0KLSAgICAgICAgVG8gcmVwbGFjZSB0aGUgeHRlcm0gdGVybWluYWwgd2hlcmUgbW9zdCBvZiB0aGUgZXh0ZXJuYWwgY29tbWFuZHMKLSAgICAgICAgYXJlIHJ1biBzZXQgU1NWTkNfWFRFUk1fUkVQTEFDRU1FTlQgdG8gYSBjb21tYW5kIHRoYXQgd2lsbCBydW4KLSAgICAgICAgYSBjb21tYW5kIGluIGEgdGVybWluYWwuICBJLmUuOiAgIiRTU1ZOQ19YVEVSTV9SRVBMQUNFTUVOVCBjbWQiCi0gICAgICAgIHdpbGwgcnVuIGNtZC4gIElmIHByZXNlbnQsICVHRU9NRVRSWSBpcyBleHBhbmRlZCB0byBhIGRlc2lyZWQKLSAgICAgICAgK1grWSBnZW9tZXRyeS4gIElmIHByZXNlbnQsICVUSVRMRSBpcyBleHBhbmRlZCB0byBhIGRlc2lyZWQgdGl0bGUuCi0gICAgICAgIEV4YW1wbGVzOiBTU1ZOQ19YVEVSTV9SRVBMQUNFTUVOVD0nZ25vbWUtdGVybWluYWwgLWUnCi0gICAgICAgICAgICAgICAgICBTU1ZOQ19YVEVSTV9SRVBMQUNFTUVOVD0nZ25vbWUtdGVybWluYWwgLXQgIiVUSVRMRSIgLWUnCi0gICAgICAgICAgICAgICAgICBTU1ZOQ19YVEVSTV9SRVBMQUNFTUVOVD0na29uc29sZSAtZScKLQotICAgICAgICBNb3JlIGluZm86IEVYVFJBX1NMRUVQOiBzZWNvbmRzIG9mIGV4dHJhIHNsZWVwIGluIHNjcmlwdHM7IAotICAgICAgICBGSU5JU0hfU0xFRVA6IGZpbmFsIGV4dHJhIHNsZWVwIGF0IGVuZDsgREVCVUdfTkVUU1RBVCBwdXQgdXAgYQotICAgICAgICB3aW5kb3cgc2hvd2luZyB3aGF0IG5ldHN0YXQgcmVwb3J0czsgTk9fREVMRVRFOiBkbyBub3QgZGVsZXRlIHRtcAotICAgICAgICBiYXQgZmlsZXMgb24gV2luZG93cyAoZm9yIGRlYnVnZ2luZyk7IEJBVF9TTEVFUDogc2xlZXAgdGhpcyBtYW55Ci0gICAgICAgIHNlY29uZHMgYXQgdGhlIGVuZCBvZiBlYWNoIFdpbmRvd3MgYmF0IGZpbGUgKGZvciBkZWJ1Z2dpbmcuKSAKLQotICAgICAgICBZb3UgY2FuIGFsc28gc2V0IGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSBlbnRlcmluZyBpbiBzb21ldGhpbmcKLSAgICAgICAgbGlrZSBFTlY9VkFSPVZBTCAgZS5nLiBFTlY9U1NIX0FVVEhfU09DSz0vdG1wL3NzaC1CRjIyOTcvYWdlbnQuMjI5NwotICAgICAgICBVc2UgYW4gZW1wdHkgVkFMIHRvIHVuc2V0IHRoZSB2YXJpYWJsZS4KLQotICAgICAgICBUaGVyZSBhcmUgYWxzbyBhIEhVR0UgbnVtYmVyIG9mIGVudi4gdmFycy4gdGhhdCBhcHBseSB0byB0aGUgVW5peAotICAgICAgICBhbmQgTWFjT1MgWCB3cmFwcGVyIHNjcmlwdCAnc3Nfdm5jdmlld2VyJyBhbmQvb3IgdGhlIHNzdm5jdmlld2VyCi0gICAgICAgIGJpbmFyeS4gIFNlZSBPcHRpb25zIC0+IEFkdmFuY2VkIC0+IFVuaXggc3N2bmN2aWV3ZXIgLT4gSGVscCBmb3IKLSAgICAgICAgYWxsIG9mIHRoZW0uCi0KLSAgICAxNikgT24gVW5peCB5b3UgY2FuIG1ha2UgdGhlICJPcGVuIEZpbGUiIGFuZCAiU2F2ZSBGaWxlIiBkaWFsb2dzCi0gICAgICAgIGJpZ2dlciBieSBzZXR0aW5nIHRoZSBlbnYuIHZhci4gU1NWTkNfQklHR0VSX0RJQUxPRz0xIG9yCi0gICAgICAgIHN1cHBseWluZyB0aGUgLWJpZ2dlciBvcHRpb24uICBJZiB5b3Ugc2V0IGl0IHRvIGEgV2lkdGggeCBIZWlnaHQsCi0gICAgICAgIGUuZy4gU1NWTkNfQklHR0VSX0RJQUxPRz01MDB4MjAwLCB0aGF0IHNpemUgd2lsbCBiZSB1c2VkLgotCi0gICAgMTcpIE9uIFVuaXggLyBNYWNPU1ggdG8gZW5hYmxlIGRlYnVnIG91dHB1dCB5b3UgY2FuIHNldCB0aGVzZSBlbnYuCi0gICAgICAgIHZhcnMgdG8gMTogU1NWTkNfU1RVTk5FTF9ERUJVRywgU1NWTkNfVkVOQ1JZUFRfREVCVUcsIGFuZAotICAgICAgICBTU19ERUJVRyAodmVyeSB2ZXJib3NlKQotCi0gICAgMTgpIER5bmFtaWMgVk5DIFNlcnZlciBQb3J0IGRldGVybWluYXRpb24gYW5kIHJlZGlyZWN0aW9uOiAgSWYgeW91Ci0gICAgICAgIGFyZSBydW5uaW5nIFNTVk5DIG9uIFVuaXggYW5kIGFyZSB1c2luZyBTU0ggdG8gc3RhcnQgdGhlIHJlbW90ZQotICAgICAgICBWTkMgc2VydmVyIGFuZCB0aGUgVk5DIHNlcnZlciBwcmludHMgb3V0IHRoZSBsaW5lICJQT1JUPU5OTk4iCi0gICAgICAgIHRvIGluZGljYXRlIHdoaWNoIGR5bmFtaWMgcG9ydCBpdCBpcyB1c2luZyAoeDExdm5jIGRvZXMgdGhpcyksCi0gICAgICAgIHRoZW4gaWYgeW91IHByZWZpeCB0aGUgU1NIIGNvbW1hbmQgd2l0aCAiUE9SVD0iIFNTVk5DIHdpbGwgd2F0Y2gKLSAgICAgICAgZm9yIHRoZSBQT1JUPU5OTk4gbGluZSBhbmQgdXNlcyBzc2gncyBidWlsdCBpbiBTT0NLUyBwcm94eQotICAgICAgICAoc3NoIC1EIC4uLikgdG8gY29ubmVjdCB0byB0aGUgZHluYW1pYyBWTkMgc2VydmVyIHBvcnQgdGhyb3VnaAotICAgICAgICB0aGUgU1NIIHR1bm5lbC4gIEZvciBleGFtcGxlOgotCi0gICAgICAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheSAgICAgdXNlckBzb21laG9zdC5jb20KLSAgICAgICAgICAgICAgICBSZW1vdGUgU1NIIENvbW1hbmQ6ICBQT1JUPSB4MTF2bmMgLWZpbmQgLW5vcHcKLQotICAgICAgICBvciAiUE9SVD0geDExdm5jIC1kaXNwbGF5IDowIC1sb2NhbGhvc3QiLCBldGMuICBPciB1c2UgIlA9IC4uLiIKLQotICAgICAgICBUaGVyZSBpcyBhbHNvIGNvZGUgdG8gZGV0ZWN0IHRoZSBkaXNwbGF5IG9mIHRoZSByZWd1bGFyIFVuaXgKLSAgICAgICAgdm5jc2VydmVyKDEpLiAgSXQgZXh0cmFjdHMgdGhlIGRpc3BsYXkgKGFuZCBoZW5jZSBwb3J0KSBmcm9tCi0gICAgICAgIHRoZSBsaW5lcyAiTmV3ICdYJyBkZXNrdG9wIGlzIGhvc3RuYW1lOjQiIGFuZCBhbHNvIAotICAgICAgICAiVk5DIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgYXMgOjQiLiAgU28geW91IGNhbiB1c2UKLSAgICAgICAgc29tZXRoaW5nIGxpa2U6Ci0KLSAgICAgICAgICAgICAgICBQT1JUPSB2bmNzZXJ2ZXI7IHNsZWVwIDE1IAotICAgICAgICBvcjogICAgIFBPUlQ9IHZuY3NlcnZlciA6NDsgc2xlZXAgMTUgCi0KLSAgICAgICAgdGhlIGxhdHRlciBpcyBwcmVmZXJyZWQgYmVjYXVzZSB3aGVuIHlvdSByZWNvbm5lY3Qgd2l0aCBpdCB3aWxsCi0gICAgICAgIGZpbmQgdGhlIGFscmVhZHkgcnVubmluZyBvbmUuICBUaGUgZm9ybWVyIG9uZSB3aWxsIGtlZXAgY3JlYXRpbmcKLSAgICAgICAgbmV3IFggc2Vzc2lvbnMgaWYgY2FsbGVkIHJlcGVhdGVkbHkuCi0KLSAgICAgICAgT24gV2luZG93cyBpZiBQT1JUPSBpcyBzdXBwbGllZCBTT0NLUyBwcm94eWluZyBpcyBub3QgdXNlZCwgYnV0Ci0gICAgICAgIHJhdGhlciBhIGhpZ2gsIHJhbmRvbSB2YWx1ZSBvZiB0aGUgVk5DIHBvcnQgaXMgY2hvc2VuIChlLmcuIDg0NTMpCi0gICAgICAgIGFuZCBhc3N1bWVkIHRvIGJlIGZyZWUsIGFuZCBpcyBwYXNzZWQgdG8geDExdm5jJ3MgLXJmYnBvcnQgb3B0aW9uLgotICAgICAgICBUaGlzIG9ubHkgd29ya3Mgd2l0aCB4MTF2bmMgKG5vdCB2bmNzZXJ2ZXIpLgotCi0gICAgMTkpIE9uIFVuaXggaWYgeW91IGFyZSBnb2luZyB0byBhbiBvbGRlciBTU0ggc2VydmVyIChlLmcuIFNvbGFyaXMgMTApLAotICAgICAgICB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGUgZW52LiB2YXIuIFNTX1ZOQ1ZJRVdFUl9OT19UPTEKLSAgICAgICAgdG8gZGlzYWJsZSB0aGUgc3NoICItdCIgb3B0aW9uIGJlaW5nIHVzZWQgKHRoYXQgY2FuIHByZXZlbnQgdGhlCi0gICAgICAgIGNvbW1hbmQgZnJvbSBiZWluZyBydW4pLgotCi0gICAgMjApIFNTVk5DIGlzIGJhc2ljYWxseSBhIHdyYXBwZXIgZm9yIHRoZSBzdHVubmVsIGFuZCBzc2ggcHJvZ3JhbXMsCi0gICAgICAgIGFuZCBiZWNhdXNlIHRob3NlIHR3byBwcm9ncmFtcyBoYXZlIGdvb2QgSVB2NiBzdXBwb3J0IFNTVk5DIHdpbGwKLSAgICAgICAgZm9yIG1vc3QgdXNhZ2UgbW9kZXMgc3VwcG9ydCBpdCBhcyB3ZWxsLiAgSVB2NiBpcyAxMjggYml0IGludGVybmV0Ci0gICAgICAgIGFkZHJlc3NlcyAoYXMgb3Bwb3NlZCB0byBJUHY0IHdpdGggaXRzIDMyIGJpdCB4eHgueXl5Lnp6ei5ubm4gSVBzLgotCi0gICAgICAgIFNvIGZvciBiYXNpYyBTU0wgYW5kIFNTSCBjb25uZWN0aW9ucyBpZiB5b3UgdHlwZSBpbiBhbiBJUHY2IElQCi0gICAgICAgIGFkZHJlc3MsIGUuZy4gJzIwMDE6NDg2MDpiMDA5Ojo2OCcsIG9yIGEgaG9zdG5hbWUgd2l0aCBvbmx5IGFuCi0gICAgICAgIElQdjYgbG9va3VwLCBlLmcuIGlwdjYubC5nb29nbGUuY29tLCB0aGUgY29ubmVjdGlvbiB3aWxsIHdvcmsKLSAgICAgICAgYmVjYXVzZSBzdHVubmVsIGFuZCBzc2ggaGFuZGxlIHRoZXNlIHByb3Blcmx5LgotCi0gICAgICAgIE5vdGUgdGhhdCB5b3Ugb2Z0ZW4gbmVlZCB0byBzdXBwbHkgYSBkaXNwbGF5IG51bWJlciBvciBwb3J0IGFmdGVyCi0gICAgICAgIHRoZSBhZGRyZXNzIHNvIHB1dCBpdCwgZS5nLiAnOjAnIGF0IHRoZSBlbmQ6IDIwMDE6NDg2MDpiMDA5Ojo2ODowCi0gICAgICAgIFlvdSBjYW4gYWxzbyB1c2UgdGhlIHN0YW5kYXJkIG5vdGF0aW9uIFsyMDAxOjQ4NjA6YjAwOTo6NjhdOjAKLSAgICAgICAgdGhhdCBpcyBtb3JlIGNsZWFyLiAgWW91IE1VU1Qgc3BlY2lmeSB0aGUgZGlzcGxheSBpZiB5b3UgdXNlCi0gICAgICAgIHRoZSBJUHY2IGFkZHJlc3Mgbm90YXRpb24gKGJ1dCA6MCBpcyBzdGlsbCB0aGUgZGVmYXVsdCBmb3IgYQotICAgICAgICBub24tbnVtZXJpYyBob3N0bmFtZSBzdHJpbmcuKQotCi0gICAgICAgIElQdjQgYWRkcmVzc2VzIGVuY29kZWQgaW4gSVB2NiBub3RhdGlvbiBhbHNvIHdvcmssIGUuZy4KLSAgICAgICAgOjpmZmZmOjE5Mi4xNjguMS4xMDAgc2hvdWxkIHdvcmsgZm9yIHRoZSBtb3N0IHBhcnQuCi0KLSAgICAgICAgU1NWTkMgb24gVW5peCBhbmQgTWFjT1NYIGFsc28gaGFzIGl0cyBvd24gUHJveHkgaGVscGVyIHRvb2wKLSAgICAgICAgKHBwcm94eSkgIFRoaXMgc2NyaXB0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGhhbmRsZSBJUHY2IGhvc3RuYW1lcwotICAgICAgICBhbmQgYWRkcmVzc2VzIGFzIGxvbmcgYXMgdGhlIElPOjpTb2NrZXQ6OklORVQ2IFBlcmwgbW9kdWxlCi0gICAgICAgIGlzIGF2YWlsYWJsZS4gIE9uIFdpbmRvd3MgdGhlIHJlbGF5Ni5leGUgdG9vbCBpcyB1c2VkLgotCi0gICAgICAgIFNvIGZvciB0aGUgbW9zdCBwYXJ0IElQdjYgc2hvdWxkIHdvcmsgd2l0aG91dCB5b3UgaGF2aW5nIHRvIGRvCi0gICAgICAgIGFueXRoaW5nIHNwZWNpYWwuICBIb3dldmVyLCBmb3IgcmFyZSB1c2FnZSwgdGhlIHByb3h5IGhlbHBlciB0b29sCi0gICAgICAgIGNhbiBhbHNvIHRyZWF0IGFuZCBJUHY2IGFkZHJlc3MgYXMgYSBzcGVjaWFsIHNvcnQgb2YgJ3Byb3h5Jy4KLSAgICAgICAgU28gaW4gdGhlIGVudHJ5IFByb3h5L0dhdGV3YXkgeW91IGNhbiBpbmNsdWRlIGlwdjY6Ly9ob3N0OnBvcnQKLSAgICAgICAgYW5kIHRoZSBJUHY2IGhvc3Qgd2lsbCBzaW1wbHkgYmUgY29ubmVjdGVkIHRvIGFuZCB0aGUgZGF0YQotICAgICAgICB0cmFuc2ZlcnJlZC4gIEluIHRoaXMgdXNhZ2UgbW9kZSwgc2V0IHRoZSBWTkMgSG9zdDpEaXNwbGF5Ci0gICAgICAgIHRvIGFueXRoaW5nLCBlLmcuICdsb2NhbGhvc3Q6MCc7IGl0IGlzIGlnbm9yZWQgaWYgdGhlIGlwdjY6Ly8KLSAgICAgICAgZW5kcG9pbnQgaXMgc3BlY2lmaWVkIGFzIGEgcHJveHkuICBOZWVkIGZvciBpcHY2Oi8vIHVzYWdlIHByb3h5Ci0gICAgICAgIHNob3VsZCBiZSByYXJlLgotCi0gICAgICAgIE5vdGUgdGhhdCBmb3IgbGluayBsb2NhbCAobm90IGdsb2JhbCkgSVB2NiBhZGRyZXNzZXMgeW91IG1heQotICAgICAgICBuZWVkIHRvIGluY2x1ZGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MsCi0gICAgICAgIGUuZy4gZmU4MDo6YTAwOjIwZmY6ZmVmZDo1M2Q0JWV0aDAKLQotICAgICAgICBOb3RlIHRoYXQgb25lIGNhbiB1c2UgYSAzcmQgcGFydHkgVk5DIFZpZXdlciB3aXRoIFNTVk5DIChzZWUKLSAgICAgICAgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBDaGFuZ2UgVk5DIFZpZXdlci4pICBJUHY2IHdpbGwgd29yayBmb3IKLSAgICAgICAgdGhlbSBhcyB3ZWxsIGV2ZW4gaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBJUHY2LgotCi0gICAgICAgIElQdjYgc3VwcG9ydCBvbiBVbml4LCBNYWNPU1gsIGFuZCBXaW5kb3dzIGlzIGVzc2VudGlhbGx5IGNvbXBsZXRlCi0gICAgICAgIGZvciBhbGwgdHlwZXMgb2YgY29ubmVjdGlvbnMgKGluY2x1ZGluZyBwcm94aWVkLCB1bmVuY3J5cHRlZCBhbmQKLSAgICAgICAgcmV2ZXJzZSBjb25uZWN0aW9ucy4pICBMZXQgdXMga25vdyBpZiB5b3UgZmluZCBhIHNjZW5hcmlvIHRoYXQKLSAgICAgICAgZG9lcyBub3Qgd29yayAoc2VlIHRoZSBrbm93biBleGNlcHRpb24gZm9yIHB1dHR5L3BsaW5rIGJlbG93LikKLQotICAgICAgICBZb3UgY2FuIHNldCBpcHY2PTAgaW4geW91ciBzc3ZuY3JjLCB0aGVuIG5vIHNwZWNpYWwgcmVsYXlpbmcgZm9yCi0gICAgICAgIElQdjYgd2lsbCBiZSBkb25lIChkbyB0aGlzIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBvciBzbG93bmVzcyBpbgotICAgICAgICB0cnlpbmcgdG8gcmVsYXkgaXB2NiBhbmQgeW91IGtub3cgeW91IHdpbGwgbm90IGNvbm5lY3QgdG8gYW55Ci0gICAgICAgIHN1Y2ggaG9zdHMuKSAgU2V0IGlwdjY9MSB0byBmb3JjZSB0aGUgc3BlY2lhbCBwcm9jZXNzaW5nIGV2ZW4gaWYKLSAgICAgICAgSVB2NiB3YXMgbm90IGF1dG9kZXRlY3RlZC4gIFRvIGNoYW5nZSB0aGlzIGR5bmFtaWNhbGx5LCB5b3UgYWxzbwotICAgICAgICBlbnRlciBJUFY2PS4uLiBpbiB0aGUgVk5DIEhvc3Q6RGlzcGxheSBlbnRyeSBib3ggYW5kIHByZXNzIEVudGVyLgotICAgICAgICBBbHNvIG9uIFVuaXggb3IgTWFjT1NYIHlvdSBjYW4gc2V0IHRoZSBlbnYuIHZhci4gU1NWTkNfSVBWNj0wCi0gICAgICAgIHRvIGRpc2FibGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZyb20gY2hlY2tpbmcgaWYgaG9zdHMgaGF2ZSBpcHY2Ci0gICAgICAgIGFkZHJlc3NlcyAodGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIGlwdjY9MCBpbiBzc3ZuY3JjIG9yIGJ5Ci0gICAgICAgIHRoZSBzZXR0aW5nIGlwdjYgaW4gdGhlIEVudHJ5IGJveC4pCi0KLSAgICAgICAgT24gV2luZG93cyBwbGluay5leGUgKFNTSCBjbGllbnQpIGN1cnJlbnRseSBkb2Vzbid0IHdvcmsgZm9yCi0gICAgICAgIElQdjYgYWRkcmVzcyBzdHJpbmdzIChlLmcuIDIwMDE6NDg2MDpiMDA5Ojo2OCkgYnV0IGl0IGRvZXMgd29yawotICAgICAgICBmb3IgaG9zdG5hbWUgc3RyaW5ncyB0aGF0IHJlc29sdmUgdG8gSVB2NiBhZGRyZXNzZXMuCi0KLSAgICAgICAgTm90ZSB0aGF0IG9uZSBjYW4gbWFrZSBhIGhvbWUtYnJldyBTT0NLUzUgaXB2NC10by1pcHY2IGdhdGV3YXkKLSAgICAgICAgcHJveHkgdXNpbmcgc3NoIGxpa2UgdGhpczoKLQotICAgICAgICAgIHNzaCAtRCAnKjoxMDgwJyBsb2NhbGhvc3QgInByaW50ZiAnUHJlc3MgRW50ZXIgdG8gRXhpdDogJzsgcmVhZCB4IgotICAKLSAgICAgICAgdGhlbiBzcGVjaWZ5IGEgcHJveHkgbGlrZSBzb2NrczU6Ly9ob3N0bmFtZToxMDgwIHdoZXJlIGhvc3RuYW1lCi0gICAgICAgIGlzIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIGFib3ZlIHNzaCBjb21tYW5kLiAgQWRkICctdicgdG8gdGhlCi0gICAgICAgIHNzaCBjbWRsaW5lIGZvciB2ZXJib3NlIG91dHB1dC4gIFNlZSBhbHNvIHRoZSB4MTF2bmMgaW5ldDZ0bzQgdG9vbAotICAgICAgICAoYSBkaXJlY3QgaXB2NC82IHJlbGF5LCBub3Qgc29ja3MuKQotfQotCi0JZ2xvYmFsIHZlcnNpb24KLQlzZXQgaGVscF9tYWluICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVk5DIHZlcnNpb246ICR2ZXJzaW9uXG4kaGVscF9tYWluIgotCXNldCBoZWxwX21pc2MgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NWTkMgdmVyc2lvbjogJHZlcnNpb25cbiRoZWxwX21pc2MiCi0Jc2V0IGhlbHBfcHJveCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1ZOQyB2ZXJzaW9uOiAkdmVyc2lvblxuJGhlbHBfcHJveCIKLQlzZXQgaGVscF90aXBzICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVk5DIHZlcnNpb246ICR2ZXJzaW9uXG4kaGVscF90aXBzIgotCi0JZnJhbWUgLmgudwotCWJ1dHRvbiAuaC53LmIxIC10ZXh0ICJNYWluIiAgICAtY29tbWFuZCB7aGVscF90ZXh0IG1haW59Ci0JYnV0dG9uIC5oLncuYjIgLXRleHQgIlByb3hpZXMiIC1jb21tYW5kIHtoZWxwX3RleHQgcHJveH0KLQlidXR0b24gLmgudy5iMyAtdGV4dCAiTWlzYyIgICAgLWNvbW1hbmQge2hlbHBfdGV4dCBtaXNjfQotCWJ1dHRvbiAuaC53LmI0IC10ZXh0ICJUaXBzIiAgICAtY29tbWFuZCB7aGVscF90ZXh0IHRpcHN9Ci0KLQlwYWNrIC5oLncuYjEgLmgudy5iMiAuaC53LmIzIC5oLncuYjQgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMQotCi0JcGFjayAuaC53IC1zaWRlIGJvdHRvbSAtYWZ0ZXIgLmguZCAtZmlsbCB4Ci0KLQkuaC5mLnQgaW5zZXJ0IGVuZCAkaGVscF9tYWluCi0JamlnZ2xlX3RleHQgLmguZi50Ci19Ci0KLXByb2MgaGVscF90ZXh0IHt3aGljaH0gewotCWdsb2JhbCBoZWxwX21haW4gaGVscF9taXNjIGhlbHBfcHJveCBoZWxwX3RpcHMKLQlzZXQgdHh0ICIiCi0JaWYgeyR3aGljaCA9PSAibWFpbiJ9IHsKLQkJc2V0IHR4dCAkaGVscF9tYWluCi0JfQotCWlmIHskd2hpY2ggPT0gIm1pc2MifSB7Ci0JCXNldCB0eHQgJGhlbHBfbWlzYwotCX0KLQlpZiB7JHdoaWNoID09ICJwcm94In0gewotCQlzZXQgdHh0ICRoZWxwX3Byb3gKLQl9Ci0JaWYgeyR3aGljaCA9PSAidGlwcyJ9IHsKLQkJc2V0IHR4dCAkaGVscF90aXBzCi0JfQotCWNhdGNoIHsuaC5mLnQgZGVsZXRlIDAuMCBlbmQ7IC5oLmYudCBpbnNlcnQgZW5kICR0eHQ7IGppZ2dsZV90ZXh0IC5oLmYudH0KLX0KLQotcHJvYyBzc3ZuY19lc2NhcGVfaGVscCB7fSB7Ci0JdG9wbGV2IC5la2gKLQotCXNjcm9sbF90ZXh0X2Rpc21pc3MgLmVraC5mCi0KLQljZW50ZXJfd2luIC5la2gKLQl3bSB0aXRsZSAuZWtoICJTU1ZOQyBFc2NhcGUgS2V5cyBIZWxwIgotCi0Jc2V0IG1zZyB7Ci0gU1NWTkMgRXNjYXBlIEtleXM6Ci0KLSAgIFRoZSBVbml4IFNTVk5DIFZOQyBWaWV3ZXIsIHNzdm5jdmlld2VyKDEpLCBoYXMgYW4gJ0VzY2FwZSBLZXlzJwotICAgbWVjaGFuaXNtIHRoYXQgZW5hYmxlcyB1c2luZyBrZXlzdHJva2VzIHRoYXQgYXJlIGJvdW5kIGFzICdIb3QgS2V5cycKLSAgIHRvIHNwZWNpZmljIGFjdGlvbnMuCi0KLSAgIFNvLCB3aGVuIHlvdSBoYXZlIGFsbCBvZiB0aGUgbW9kaWZpZXIga2V5cyAoJ2VzY2FwZSBrZXlzJykgcHJlc3NlZCBkb3duLAotICAgdGhlbiBzdWJzZXF1ZW50IGtleXN0cm9rZXMgYXJlIGludGVycHJldGVkIGFzIGxvY2FsIHNwZWNpYWwgYWN0aW9ucwotICAgaW5zdGVhZCBvZiBiZWluZyBzZW50IHRvIHRoZSByZW1vdGUgVk5DIHNlcnZlci4KLSAgIAotICAgVGhpcyBlbmFibGVzIHF1aWNrIHBhcmFtZXRlciBjaGFuZ2luZyBhbmQgYWxzbyBwYW5uaW5nIG9mIHRoZSB2aWV3cG9ydC4KLSAgIEUuZy4gdGhlIGtleXN0cm9rZSAncicgaXMgbWFwcGVkIHRvIHJlZnJlc2ggdGhlIHNjcmVlbi4KLSAgIAotICAgRW50ZXIgJ2RlZmF1bHQnIGluIHRoZSBlbnRyeSBib3ggdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSBhbmQgdG8gdXNlIHRoZQotICAgZGVmYXVsdCBtb2RpZmllciBsaXN0IChBbHRfTCxTdXBlcl9MIG9uIHVuaXggYW5kIENvbnRyb2xfTCxNZXRhX0wgb24KLSAgIG1hY29zeCkgb3Igc2V0IGl0IHRvIGEgbGlzdCBvZiBtb2RpZmllciBrZXlzLCBlLmcuIEFsdF9MLENvbnRyb2xfTC4KLSAgIE5vdGUgdGhhdCBfTCBtZWFucyBsZWZ0IHNpZGUgb2Yga2V5Ym9hcmQgYW5kIF9SIG1lYW5zIHJpZ2h0IHNpZGUuCi0KLSAgIEFsdF9MIGlzIHRoZSAnQWx0JyBrZXkgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUga2V5Ym9hcmQsIGFuZCBTdXBlcl9MCi0gICBpcyB1c3VhbGx5IHRoZSAnV2luZG93c0ZsYWdnaWUoVE0pJyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBrZXlib2FyZCwKLSAgIHNvIHdoZW4gYm90aCBvZiB0aG9zZSBhcmUgcHJlc3NlZCwgdGhlIGVzY2FwZSBrZXlzIG1hcHBpbmcgdGFrZSBlZmZlY3QuCi0KLQotICAgSGVyZSBpcyBpbmZvIGZyb20gdGhlIHNzdm5jdmlld2VyKDEpIG1hbnVhbCBwYWdlOgotCi0gICAgIC1lc2NhcGUgc3RyICAgIFRoaXMgc2V0cyB0aGUgJ0VzY2FwZSBLZXlzJyBtb2RpZmllciBzZXF1ZW5jZSBhbmQgZW5hYmxlcwotICAgICAgICAgICAgICAgICAgICBlc2NhcGUga2V5cyBtb2RlLiAgV2hlbiB0aGUgbW9kaWZpZXIga2V5cyBlc2NhcGUgc2VxdWVuY2UKLSAgICAgICAgICAgICAgICAgICAgaXMgaGVsZCBkb3duLCB0aGUgbmV4dCBrZXlzdHJva2UgaXMgaW50ZXJwcmV0ZWQgbG9jYWxseQotICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtIGEgc3BlY2lhbCBhY3Rpb24gaW5zdGVhZCBvZiBiZWluZyBzZW50IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICByZW1vdGUgVk5DIHNlcnZlci4KLQotICAgICAgICAgICAgICAgICAgICBVc2UgJy1lc2NhcGUgZGVmYXVsdCcgZm9yIHRoZSBkZWZhdWx0IG1vZGlmaWVyIHNlcXVlbmNlLgotICAgICAgICAgICAgICAgICAgICAoVW5peDogQWx0X0wsU3VwZXJfTCBhbmQgTWFjT1NYOiBDb250cm9sX0wsTWV0YV9MKQotCi0gICAgSGVyZSBhcmUgdGhlICdFc2NhcGUgS2V5czogSGVscCtTZXQnIGluc3RydWN0aW9ucyBmcm9tIHRoZSBQb3B1cCBNZW51OgotCi0gICAgRXNjYXBlIEtleXM6ICBFbnRlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZGlmaWVyIGtleXMgdG8gYmUgdGhlCi0gICAgJ2VzY2FwZSBzZXF1ZW5jZScuICBXaGVuIHRoZXNlIGtleXMgYXJlIGhlbGQgZG93biwgdGhlIG5leHQga2V5c3Ryb2tlIGlzCi0gICAgaW50ZXJwcmV0ZWQgbG9jYWxseSB0byBpbnZva2UgYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG8KLSAgICB0aGUgcmVtb3RlIFZOQyBzZXJ2ZXIuICBJbiBvdGhlciB3b3JkcywgYSBzZXQgb2YgJ0hvdCBLZXlzJy4KLSAgICAKLSAgICBUbyBlbmFibGUgb3IgZGlzYWJsZSB0aGlzLCBjbGljayBvbiAnRXNjYXBlIEtleXM6IFRvZ2dsZScgaW4gdGhlIFBvcHVwLgotICAgIAotICAgIEhlcmUgaXMgdGhlIGxpc3Qgb2YgaG90LWtleSBtYXBwaW5ncyB0byBzcGVjaWFsIGFjdGlvbnM6Ci0gICAgCi0gICAgICAgcjogcmVmcmVzaCBkZXNrdG9wICBiOiB0b2dnbGUgYmVsbCAgIGM6IHRvZ2dsZSBmdWxsLWNvbG9yCi0gICAgICAgZjogZmlsZSB0cmFuc2ZlciAgICB4OiB4MTFjdXJzb3IgICAgIHo6IHRvZ2dsZSBUaWdodC9aUkxFCi0gICAgICAgbDogZnVsbCBzY3JlZW4gICAgICBnOiBncmFiYWxsICAgICAgIGU6IGVzY2FwZSBrZXlzIGRpYWxvZwotICAgICAgIHM6IHNjYWxlIGRpYWxvZyAgICAgKzogc2NhbGUgdXAgKD0pICAtOiBzY2FsZSBkb3duIChfKQotICAgICAgIHQ6IHRleHQgY2hhdCAgICAgICAgICAgICAgICAgICAgICAgICBhOiBhbHBoYWJsZW5kIGN1cnNvcgotICAgICAgIFY6IHRvZ2dsZSB2aWV3b25seSAgUTogcXVpdCB2aWV3ZXIgICAxIDIgMyA0IDUgNjogVWx0cmFWTkMgc2NhbGUgMS9uCi0gICAgCi0gICAgICAgQXJyb3cga2V5czogICAgICAgICBwYW4gdGhlIHZpZXdwb3J0IGFib3V0IDEwJSBmb3IgZWFjaCBrZXlwcmVzcy4KLSAgICAgICBQYWdlVXAgLyBQYWdlRG93bjogIHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgdmVydGljYWxseS4KLSAgICAgICBIb21lICAgLyBFbmQ6ICAgICAgIHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgaG9yaXpvbnRhbGx5LgotICAgICAgIEtleVBhZCBBcnJvdyBrZXlzOiAgcGFuIHRoZSB2aWV3cG9ydCBieSAxIHBpeGVsIGZvciBlYWNoIGtleXByZXNzLgotICAgICAgIERyYWdnaW5nIHRoZSBNb3VzZSB3aXRoIEJ1dHRvbjEgcHJlc3NlZCBhbHNvIHBhbnMgdGhlIHZpZXdwb3J0LgotICAgICAgIENsaWNraW5nIE1vdXNlIEJ1dHRvbjMgYnJpbmdzIHVwIHRoZSBQb3B1cCBNZW51LgotICAgIAotICAgIFRoZSBhYm92ZSBtYXBwaW5ncyBhcmUgKmFsd2F5cyogYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0IHRoZQotICAgIEVzY2FwZSBLZXlzIHZhbHVlIHRvICduZXZlcicuCi0gICAgCi0gICAgSWYgdGhlIEVzY2FwZSBLZXlzIHZhbHVlIGJlbG93IGlzIHNldCB0byAnZGVmYXVsdCcgdGhlbiBhIGRlZmF1bHQgbGlzdCBvZgotICAgIG9mIG1vZGlmaWVyIGtleXMgaXMgdXNlZC4gIEZvciBVbml4IGl0IGlzOiBBbHRfTCxTdXBlcl9MIGFuZCBmb3IgTWFjT1NYIGl0Ci0gICAgaXMgQ29udHJvbF9MLE1ldGFfTC4gIE5vdGU6IHRoZSBTdXBlcl9MIGtleSB1c3VhbGx5IGhhcyBhIFdpbmRvd3MoVE0pIEZsYWcKLSAgICBvbiBpdC4gIEFsc28gbm90ZSB0aGUgX0wgYW5kIF9SIG1lYW4gdGhlIGtleSBpcyBvbiB0aGUgTEVGVCBvciBSSUdIVCBzaWRlCi0gICAgb2YgdGhlIGtleWJvYXJkLgotICAgIAotICAgIE9uIFVuaXggICB0aGUgZGVmYXVsdCBpcyBBbHQgYW5kIFdpbmRvd3Mga2V5cyBvbiBMZWZ0IHNpZGUgb2Yga2V5Ym9hcmQuCi0gICAgT24gTWFjT1NYIHRoZSBkZWZhdWx0IGlzIENvbnRyb2wgYW5kIENvbW1hbmQga2V5cyBvbiBMZWZ0IHNpZGUgb2Yga2V5Ym9hcmQuCi0gICAgCi0gICAgRXhhbXBsZTogUHJlc3MgYW5kIGhvbGQgdGhlIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIHRoZSBMRUZUIHNpZGUgb2YgdGhlCi0gICAga2V5Ym9hcmQgYW5kIHRoZW4gcHJlc3MgJ2MnIHRvIHRvZ2dsZSB0aGUgZnVsbC1jb2xvciBzdGF0ZS4gIE9yIHByZXNzICd0JwotICAgIHRvIHRvZ2dsZSB0aGUgdWx0cmF2bmMgVGV4dCBDaGF0IHdpbmRvdywgZXRjLgotICAgIAotICAgIFRvIHVzZSBzb21ldGhpbmcgYmVzaWRlcyB0aGUgZGVmYXVsdCwgc3VwcGx5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgKG9yIGEKLSAgICBzaW5nbGUgb25lKSBmcm9tOiBTaGlmdF9MIFNoaWZ0X1IgQ29udHJvbF9MIENvbnRyb2xfUiBBbHRfTCBBbHRfUiBNZXRhX0wKLSAgICBNZXRhX1IgU3VwZXJfTCBTdXBlcl9SIEh5cGVyX0wgSHlwZXJfUiBvciBNb2RlX3N3aXRjaC4KLX0KLQotCS5la2guZi50IGluc2VydCBlbmQgJG1zZwotCWppZ2dsZV90ZXh0IC5la2guZi50Ci19Ci0KLSMgICAgT3IgQWx0ZXJuYXRpdmVseSBvbmUgY2FuIHN1cHBseSBib3RoIGhvc3RzIHNlcGFyYXRlZCBieQotIyAgICBzcGFjZXMgKHdpdGggdGhlIHByb3h5IHNlY29uZCkgaW4gdGhlIFZOQyBIb3N0OkRpc3BsYXkgYm94OgotIwotIyAgICAgICAgICAgVk5DIEhvc3QtRGlzcGxheTogICBmYXItYXdheS5lYXN0OjAgICAgdGhlcHJveHkubmV0OjgwODAKLSMKLSMgICAgVGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlLCBidXQgaXQgYWN0dWFsbHkgaG93IFNTVk5DIHN0b3JlcyB0aGUKLSMgICAgaG9zdCBpbmZvIGludGVybmFsbHkuCi0KLSMgICAgWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIHJlbW90ZSBTU0ggY29tbWFuZCBieSBwdXR0aW5nIGEgc3RyaW5nIGxpa2UKLSMgICAgCi0jICAgICAgICAgY21kPXgxMXZuYyAtbm9wdyAtZGlzcGxheSA6MCAtcmZicG9ydCA1OTAwIC1sb2NhbGhvc3QKLSMKLSMgICAgKHVzZSBhbnkgY29tbWFuZCB5b3Ugd2lzaCB0byBydW4pIGF0IHRoZSBFTkQgb2YgdGhlIFZOQyBIb3N0OkRpc3BsYXkKLSMgICAgZW50cnkuICBJbiBnZW5lcmFsLCB5b3UgY2FuIGNyYW0gaXQgYWxsIGluIHRoZSBWTkMgSG9zdDpEaXNwbGF5IGlmCi0jICAgIHlvdSBsaWtlOiAgIGhvc3Q6ZGlzcCAgcHJveHk6cG9ydCAgY21kPS4uLiAgKHRoaXMgaXMgdGhlIHdheSBpdCBpcwotIyAgICBzdG9yZWQgaW50ZXJuYWxseSkuCi0KLXByb2MgaGVscF9jZXJ0cyB7fSB7Ci0JdG9wbGV2IC5jaAotCi0Jc2V0IGggMzMKLQlpZiBbc21hbGxfaGVpZ2h0XSB7Ci0JCXNldCBoIDI4Ci0JfQotCXNjcm9sbF90ZXh0X2Rpc21pc3MgLmNoLmYgODcgJGgKLQotCWNlbnRlcl93aW4gLmNoCi0Jd20gcmVzaXphYmxlIC5jaCAxIDAKLQotCXdtIHRpdGxlIC5jaCAiU1NMIENlcnRpZmljYXRlcyBIZWxwIgotCi0Jc2V0IG1zZyB7Ci0gRGVzY3JpcHRpb246Ci0KLSAgICAqKiogSU1QT1JUQU5UICoqKjogT25seSB3aXRoIFNTTCBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gKGVpdGhlciBtYW51YWxseQotICAgIG9yIHZpYSBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBjZXJ0aWZpY2F0ZSkgY2FuIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MgYmUKLSAgICBwcmV2ZW50ZWQuICBPdGhlcndpc2UsIG9ubHkgcGFzc2l2ZSBuZXR3b3JrIHNuaWZmaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZC4KLSAgICBUaGVyZSBhcmUgaGFja2VyIHRvb2xzIGxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4gdGhhdCBpbXBsZW1lbnQgU1NMCi0gICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIFRoZXkgcmVseSBvbiB0aGUgY2xpZW50IHVzZXIgbm90IGJvdGhlcmluZyB0bwotICAgIGNoZWNrIHRoZSBjZXJ0LgotCi0gICAgU29tZSBwZW9wbGUgbWF5IGJlIGNvbmZ1c2VkIGJ5IHRoZSBhYm92ZSBiZWNhdXNlIHRoZXkgYXJlIGZhbWlsaWFyIHdpdGgKLSAgICB0aGVpciBXZWIgQnJvd3NlciB1c2luZyBTU0wgKGkuZS4gaHR0cHM6Ly8uLi4gd2Vic2l0ZXMpIGFuZCB0aG9zZSBzaXRlcwotICAgIGFyZSBhdXRoZW50aWNhdGVkIHNlY3VyZWx5IHdpdGhvdXQgdGhlIHVzZXIncyBuZWVkIHRvIHZlcmlmeSBhbnl0aGluZwotICAgIG1hbnVhbGx5LiAgVGhlIHJlYXNvbiB3aHkgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaXMgYmVjYXVzZSAxKSB0aGVpcgotICAgIHdlYiBicm93c2VyIGNvbWVzIHdpdGggYSBidW5kbGUgb2YgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNlcnRpZmljYXRlcwotICAgIGFuZCAyKSB0aGUgaHR0cHMgc2l0ZXMgaGF2ZSBwYWlkIG1vbmV5IHRvIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyB0bwotICAgIGhhdmUgdGhlaXIgd2Vic2l0ZSBjZXJ0aWZpY2F0ZSBzaWduZWQgYnkgdGhlbS4gIFdoZW4gdXNpbmcgU1NMIGluIFZOQyB3ZQotICAgIG5vcm1hbGx5IGRvIG5vdCBkbyBzb21ldGhpbmcgdGhpcyBzb3BoaXN0aWNhdGVkLCBhbmQgc28gd2UgaGF2ZSB0byB2ZXJpZnkKLSAgICB0aGUgY2VydGlmaWNhdGVzIG1hbnVhbGx5LiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gdXNlIENlcnRpZmljYXRlCi0gICAgQXV0aG9yaXRpZXMgd2l0aCBTU1ZOQzsgdGhhdCBtZXRob2QgaXMgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgVGhlIFNTTCBDZXJ0aWZpY2F0ZSBmaWxlcyBkZXNjcmliZWQgYmVsb3cgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGV4dGVybmFsbHkKLSAgICAoZS5nLiBieSB4MTF2bmMgb3Igb3BlbnNzbCk6IHlvdSBjYW4gaW1wb3J0IHRoZW0gdmlhICJJbXBvcnQgQ2VydGlmaWNhdGUiLgotICAgIE9SIHlvdSBjYW4gY2xpY2sgb24gIkNyZWF0ZSBDZXJ0aWZpY2F0ZSAuLi4iIHRvIHVzZSBUSElTIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAgICBhIENlcnRpZmljYXRlICsgUHJpdmF0ZSBLZXkgcGFpciBmb3IgeW91IChpbiB0aGlzIGNhc2UgeW91IHdpbGwgbmVlZCB0bwotICAgIGRpc3RyaWJ1dGUgb25lIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8gdGhlIFZOQyBTZXJ2ZXIpLgotCi0gICAgVGhlbiB5b3UgYXNzb2NpYXRlIHRoZSBTYXZlZCBjZXJ0IHdpdGggdGhlIFZOQyBzZXJ2ZXIsIHNlZSB0aGUgcGFuZWwgZW50cnkKLSAgICBib3ggZGVzY3JpcHRpb24gYmVsb3cuICBUaGVuIGNsaWNrIENvbm5lY3QuICBZb3Ugd2lsbCB1c3VhbGx5IHdhbnQgdG8gU2F2ZQotICAgIHRoaXMgYXNzb2NpYXRpb24gaW4gYSBWTkMgU2VydmVyIHByb2ZpbGUgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGNvbm5lY3QuCi0KLSBFeHBpcmF0aW9uOgotCi0gICAgU1NMIENlcnRpZmljYXRlcyB3aWxsIEV4cGlyZSBhZnRlciBhIGNlcnRhaW4gcGVyaW9kICh1c3VhbGx5IDEtMiB5ZWFyczsKLSAgICBpZiB5b3UgY3JlYXRlIGEgY2VydCB3aXRoIHRoaXMgdG9vbCB5b3UgY2FuIHNldCBpdCB0byBhbnkgbGVuZ3RoIHlvdSB3YW50KS4KLSAgICBTbyBpZiBmb3IgYSBwYXJ0aWN1bGFyIENlcnQgeW91IGZpbmQgeW91IGNhbiBubyBsb25nZXIgY29ubmVjdCwgY2hlY2sgdGhlCi0gICAgU1RVTk5FTCBsb2cgb3V0cHV0IHRvIHNlZSBpZiB0aGUgY2VydCBoYXMgZXhwaXJlZC4gIFRoZW4gY3JlYXRlIGFuZCBkaXN0cmlidXRlCi0gICAgYSBuZXcgb25lLgotCi0gRmV0Y2ggQ2VydDoKLQotICAgIFlvdSBjYW4gYWxzbyByZXRyaWV2ZSBhbmQgdmlldyB0aGUgVk5DIFNlcnZlcidzIENlcnQgdmlhIHRoZSAiRmV0Y2ggQ2VydCIKLSAgICBidXR0b24gb24gdGhlIG1haW4gcGFuZWwuICBBZnRlciB5b3UgY2hlY2sgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCBDZXJ0IChlLmcuIGJ5Ci0gICAgY29tcGFyaW5nIE1ENSBoYXNoIG9yIG90aGVyIGluZm8pLCB5b3UgY2FuIHNhdmUgaXQuICBUaGUgZmlsZSBpdCB3YXMgc2F2ZWQKLSAgICBhcyB3aWxsIGJlIHNldCBhcyB0aGUgIlNlcnZlckNlcnQiIHRvIHZlcmlmeSBhZ2FpbnN0IGZvciB0aGUgbmV4dCBjb25uZWN0aW9uLgotICAgIFRvIG1ha2UgdGhpcyB2ZXJpZmljYXRpb24gY2hlY2sgcGVybWFuZW50LCB5b3Ugd2lsbCBuZWVkIHRvIHNhdmUgdGhlIHByb2ZpbGUKLSAgICB2aWEgJ1NhdmUnLgotCi0gICAgTk9URTogU2VlIHRoZSBDQSBzZWN0aW9uIGJlbG93IGZvciBob3cgIkZldGNoIENlcnQvVmVyaWZ5IEFsbCBDZXJ0cyIgV0lMTCBOT1QKLSAgICBXT1JLIHdoZW4gYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBpcyB1c2VkIChpLmUuIHlvdSBuZWVkIHRvIHNhdmUgdGhlIENBJ3MKLSAgICBjZXJ0IGluc3RlYWQuKSAgSXQgd2lsbCB3b3JrIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBTZWxmLVNpZ25lZC4KLQotIFZlcmlmeSBBbGwgQ2VydHM6Ci0KLSAgICBJZiAiVmVyaWZ5IEFsbCBDZXJ0cyIgaXMgY2hlY2tlZCBvbiB0aGUgbWFpbiBwYW5lbCwgeW91IGFyZSBhbHdheXMgZm9yY2VkCi0gICAgdG8gY2hlY2sgdW5yZWNvZ25pemVkIHNlcnZlciBjZXJ0cywgYW5kIHNvIHRoZSBmaXJzdCB0aW1lIHlvdSBjb25uZWN0IHRvCi0gICAgYSBuZXcgc2VydmVyIHlvdSBtYXkgbmVlZCB0byBmb2xsb3cgYSBmZXcgZGlhbG9ncyB0byBpbnNwZWN0IGFuZCBzYXZlIHRoZQotICAgIHNlcnZlciBjZXJ0aWZpY2F0ZS4KLQotICAgIFVuZGVyICJWZXJpZnkgQWxsIENlcnRzIiwgbmV3IGNlcnRpZmljYXRlcyBhcmUgc2F2ZWQgaW4gdGhlICdBY2NlcHRlZCBDZXJ0cycKLSAgICBkaXJlY3RvcnkuICBXaGVuIHRoZSBjaGVja2JveCBpcyBzZXQgYWxsIGhvc3QgcHJvZmlsZXMgd2l0aCAiQ2VydHNEaXIiIHNldCB0bwotICAgICJBQ0NFUFRFRF9DRVJUUyIgKGFuZCBhbiBlbXB0eSAiU2VydmVyQ2VydCIgc2V0dGluZykgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QKLSAgICB0aGUgcG9vbCBvZiBhY2NlcHRlZCBjZXJ0aWZpY2F0ZXMgaW4gdGhlICdBY2NlcHRlZCBDZXJ0cycgZGlyZWN0b3J5LgotCi0gICAgTm90ZSB0aGF0IHdlIGhhdmUgIlZlcmlmeSBBbGwgQ2VydHMiIG9uIGJ5IGRlZmF1bHQgc28gdGhhdCB1c2VycyB3aG8gZG8gbm90Ci0gICAgdW5kZXJzdGFuZCB0aGUgU1NMIE1hbi1Jbi1UaGUtTWlkZGxlIHByb2JsZW0gd2lsbCBub3QgYmUgbGVmdCBjb21wbGV0ZWx5Ci0gICAgdnVsbmVyYWJsZSB0byBpdC4gIEV2ZXJ5b25lIHN0aWxsIG11c3QgbWFrZSB0aGUgZWZmb3J0IHRvIHZlcmlmeSBuZXcKLSAgICBjZXJ0aWZpY2F0ZXMgYnkgYW4gZXh0ZXJuYWwgbWV0aG9kIHRvIGJlIGNvbXBsZXRlbHkgc2FmZS4KLQotICAgIFRvIGhhdmUgIlZlcmlmeSBBbGwgQ2VydHMiIHRvZ2dsZWQgb2ZmIGF0IHN0YXJ0dXAsIHVzZSAic3N2bmMgLW52IiBvciBzZXQKLSAgICBTU1ZOQ19OT19WRVJJRllfQUxMPTEgYmVmb3JlIHN0YXJ0aW5nLiAgSWYgeW91IGRvIG5vdCBldmVuIHdhbnQgdG8gc2VlIHRoZQotICAgIGJ1dHRvbiwgdXNlICJzc3ZuYyAtbnZiIiBvciBTU1ZOQ19OT19WRVJJRllfQUxMX0JVVFRPTj0xLgotCi0gICAgTm90ZTogIkZldGNoIENlcnQiIGFuZCAiVmVyaWZ5IEFsbCBDZXJ0cyIgYXJlIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgaW4KLSAgICAiU1NIICsgU1NMIiBtb2RlLiAgSW4gdGhpcyBjYXNlIHRvIGhhdmUgc2VydmVyIGF1dGhlbnRpY2F0aW9uICJTZXJ2ZXJDZXJ0IgotICAgIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkgdG8gYSBmaWxlIChvciAiQ2VydHNEaXIiIHRvIGEgZGlyZWN0b3J5KS4KLQotICAgIEFsc28gbm90ZSB0aGF0ICJGZXRjaCBDZXJ0IiBvbmx5IHdvcmtzIGluIGEgbGltaXRlZCBmYXNoaW9uIGluICJMaXN0ZW4iCi0gICAgbW9kZSAoaXQgaXMgdGhlIFZOQyBTZXJ2ZXIgdGhhdCBpbml0aWF0ZXMgdGhlIGNvbm5lY3Rpb24pLCBhbmQgc28geW91Ci0gICAgbWF5IG5lZWQgdG8gYmUgc2V0IHZpYSAiU2VydmVyQ2VydCIgYXMgd2VsbC4KLQotICAgIE5PVEU6IFNlZSB0aGUgQ0Egc2VjdGlvbiBiZWxvdyBmb3IgaG93ICJGZXRjaCBDZXJ0L1ZlcmlmeSBBbGwgQ2VydHMiCi0gICAgV0lMTCBOT1QgV09SSyB3aGVuIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgaXMgdXNlZCAoaS5lLiB5b3UgbmVlZAotICAgIHRvIHNhdmUgdGhlIENBJ3MgY2VydCBpbnN0ZWFkLikgIFRoZSAiRmV0Y2ggQ2VydCIgc2F2aW5nIG1ldGhvZCB3aWxsCi0gICAgd29yayBpZiB0aGUgY2VydGlmaWNhdGUgaXMgU2VsZi1TaWduZWQuCi0KLSBDQToKLQotICAgIE9uZSBjYW4gbWFrZSBTU0wgVk5DIHNlcnZlciBhdXRoZW50aWNhdGlvbiBtb3JlICJhdXRvbWF0aWMiIGFzIGl0IGlzIGluCi0gICAgV2ViIEJyb3dzZXJzIGdvaW5nIHRvIEhUVFBTIHNpdGVzLCBieSB1c2luZyBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpCi0gICAgY2VydCAoZS5nLiBhIHByb2Zlc3Npb25hbCBvbmUgbGlrZSBWZXJpc2lnbiBvciBUaGF3dGUsIG9yIG9uZSB5b3VyIGNvbXBhbnkKLSAgICBvciBvcmdhbml6YXRpb24gY3JlYXRlcykgZm9yIHRoZSAiU2VydmVyQ2VydCIuICBUaGlzIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwKLSAgICBoZXJlOiBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3NzbC5odG1sCi0KLSAgICBDQSdzIGFyZSBub3Qgb2Z0ZW4gdXNlZCwgYnV0IGlmIHRoZSBudW1iZXIgb2YgVk5DIFNlcnZlcnMgc2NhbGVzIHVwIGl0IGNhbgotICAgIGJlIHZlcnkgY29udmVuaWVudCBiZWNhdXNlIHRoZSB2aWV3ZXJzIChpLmUuIFNTVk5DKSBvbmx5IG5lZWQgdGhlIENBIGNlcnQsCi0gICAgbm90IGFsbCBvZiB0aGUgU2VydmVyIGNlcnRzLgotCi0gICAgSU1QT1JUQU5UIE5PVEU6IGlmIGEgVk5DIFNlcnZlciBpcyB1c2luZyBhIENBIHNpZ25lZCBjZXJ0aWZpY2F0ZSBpbnN0ZWFkCi0gICAgb2YgaXRzIG93biBTZWxmLVNpZ25lZCBvbmUsIHRoZW4gIkZldGNoIENlcnQiLCBldGMuIHNhdmluZyBtZWNoYW5pc20KLSAgICBXSUxMIE5PVCBXT1JLLiAgWW91IG11c3Qgb2J0YWluIHRoZSBDQSBjZXJ0aWZpY2F0ZSBhbmQgZXhwbGljaXRseSBzZXQKLSAgICBpdCBhcyB0aGUgU2VydmVyQ2VydCBvciBpbXBvcnQgaXQgdG8gJ0FjY2VwdGVkIENlcnRzJy4KLQotCi0gTm93IHdoYXQgZ29lcyBpbnRvIHRoZSBwYW5lbCdzIGVudHJ5IGJveGVzIGlzIGRlc2NyaWJlZC4KLQotCi0gWW91ciBDZXJ0aWZpY2F0ZSArIEtleSAoTXlDZXJ0KToKLQotICAgIFlvdSBjYW4gc3BlY2lmeSBZT1VSIG93biBTU0wgY2VydGlmaWNhdGUgKFBFTSkgZmlsZSBpbiAiTXlDZXJ0IiBpbiB3aGljaAotICAgIGNhc2UgaXQgaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgWU9VICh0aGUgdmlld2VyKSB0byB0aGUgcmVtb3RlIFZOQyBTZXJ2ZXIuCi0gICAgSWYgdGhpcyBmYWlscyB0aGUgcmVtb3RlIFZOQyBTZXJ2ZXIgd2lsbCBkcm9wIHRoZSBjb25uZWN0aW9uLgotCi0gICAgU28gdGhlIFNlcnZlciBjb3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gYXV0aGVudGljYXRlIFZpZXdlcnMgaW5zdGVhZCBvZiB0aGUKLSAgICBtb3JlIGNvbW1vbiBwcmFjdGljZSBvZiB1c2luZyBhIFZOQyBwYXNzd29yZCBvciB4MTF2bmMncyAtdW5peHB3IG1vZGUuCi0KLQotIFNlcnZlciBDZXJ0aWZpY2F0ZXMgKFNlcnZlckNlcnQvQ2VydHNEaXIpOgotICAgIAotICAgIFNlcnZlciBjZXJ0cyBjYW4gYmUgc3BlY2lmaWVkIGluIG9uZSBvZiB0d28gd2F5czoKLSAgICAKLSAgICAgICAgLSBBIHNpbmdsZSBjZXJ0aWZpY2F0ZSAoUEVNKSBmaWxlIGZvciBhIHNpbmdsZSBzZXJ2ZXIKLSAgICAgICAgICBvciBhIHNpbmdsZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKQotICAgIAotICAgICAgICAtIEEgZGlyZWN0b3J5IG9mIGNlcnRpZmljYXRlIChQRU0pIGZpbGVzIHN0b3JlZCBpbgotICAgICAgICAgIHRoZSBzcGVjaWFsIE9wZW5TU0wgaGFzaCBmYXNoaW9uLgotICAgIAotICAgIFRoZSBmb3JtZXIgaXMgc2V0IHZpYSAiU2VydmVyQ2VydCIgaW4gdGhpcyBndWkuCi0gICAgVGhlIGxhdHRlciBpcyBzZXQgdmlhICJDZXJ0c0RpciIgaW4gdGhpcyBndWkuCi0gICAgCi0gICAgVGhlIGZvcm1lciBjb3JyZXNwb25kcyB0byB0aGUgIkNBZmlsZSIgU1RVTk5FTCBwYXJhbWV0ZXIuCi0gICAgVGhlIGxhdHRlciBjb3JyZXNwb25kcyB0byB0aGUgIkNBcGF0aCIgU1RVTk5FTCBwYXJhbWV0ZXIuCi0KLSAgICBTZWUgc3R1bm5lbCg4KSBvciBzdHVubmVsLm1pcnQubmV0IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIAotICAgIElmIHRoZSByZW1vdGUgVk5DIFNlcnZlciBmYWlscyB0byBhdXRoZW50aWNhdGUgaXRzZWxmIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICBzcGVjaWZpZWQgY2VydGlmaWNhdGUocyksIHRoZW4gdGhlIFZOQyBWaWV3ZXIgKHlvdXIgc2lkZSkgd2lsbCBkcm9wIHRoZQotICAgIGNvbm5lY3Rpb24uCi0KLSAgICBTZWxlY3Qgd2hpY2ggZmlsZSBvciBkaXJlY3RvcnkgYnkgY2xpY2tpbmcgb24gdGhlIGFwcHJvcHJpYXRlICJCcm93c2UuLi4iCi0gICAgYnV0dG9uLiAgT25jZSBzZWxlY3RlZCwgaWYgeW91IGNsaWNrIEluZm8gb3IgdGhlIFJpZ2h0IE1vdXNlIGJ1dHRvbiBvbgotICAgICJCcm93c2UuLi4iICB0aGVuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGRpc3BsYXllZC4KLQotICAgIElmLCBhcyBpcyB0aGUgZGVmYXVsdCwgIkNlcnRzRGlyIiBpcyBzZXQgdG8gdGhlIHRva2VuICJBQ0NFUFRFRF9DRVJUUyIKLSAgICAoYW5kICJTZXJ2ZXJDZXJ0IiBpcyB1bnNldCkgdGhlbiB0aGUgY2VydGlmaWNhdGVzIGFjY3VtdWxhdGVkIGluIHRoZSBzcGVjaWFsCi0gICAgJ0FjY2VwdGVkIENlcnRzJyBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLiAgIkFDQ0VQVEVEX0NFUlRTIiBpcyB0aGUgZGVmYXVsdCBmb3IKLSAgICBldmVyeSBzZXJ2ZXIgKCJWZXJpZnkgQWxsIENlcnRzIikuICBOb3RlIHRoYXQgaWYgeW91IGV2ZXIgbmVlZCB0byBjbGVhbiB0aGlzCi0gICAgZGlyZWN0b3J5LCBlYWNoIGNlcnQgaXMgc2F2ZWQgaW4gdHdvIGZpbGVzLCBmb3IgZXhhbXBsZToKLQotICAgICAgICAgIGhvc3RuYW1lLTA9YmYtZDAtZDYtOWMtNjgtNWEtZmUtMjQtYzYtNjAtYmEtYjQtMTQtZTYtNjYtMTQuY3J0Ci0gICAgYW5kCi0gICAgICAgICAgOWViN2M4YmUuMAotCi0gICAgVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB3YXkgT3BlblNTTCBtdXN0IHVzZSBoYXNoLWJhc2VkIGZpbGVuYW1lcyBpbiBDZXJ0IGRpcnMuIAotICAgIFRoZSBmaWxlIHdpbGwgaGF2ZSBhICJmdWxsIGZpbGVuYW1lOiIgbGluZSBpbmRpY2F0aW5nIHRoZSBmaW5nZXJwcmludCBhbmQKLSAgICBob3N0bmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuICBCZSBzdXJlIHRvIHJlbW92ZSBib3RoIGZpbGVzLiAgVGhlIERlbGV0ZSBDZXJ0cwotICAgIGRpYWxvZyBzaG91bGQgYXV0b21hdGljYWxseSBmaW5kIHRoZSBtYXRjaGluZyBvbmUgZm9yIHlvdSBhbmQgcHJvbXB0IHlvdSB0bwotICAgIHJlbW92ZSBpdCBhcyB3ZWxsLgotCi0gQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwgRmlsZSk6Ci0KLSAgICBGb3IgbGFyZ2Ugc2NhbGUgZGVwbG95bWVudHMsIHVzdWFsbHkgaW52b2x2aW5nIGEgQ0EgQ2VydCwgaXQgaXMgd29ydGh3aGlsZQotICAgIHRvIGJlIGFibGUgdG8gcmV2b2tlIGluZGl2aWR1YWwgY2VydHMgKHNvIHRoYXQgYSBuZXcgQ0EgY2VydCBkb2VzIG5vdCBuZWVkIHRvCi0gICAgYmUgY3JlYXRlZCBhbmQgbmV3IGtleXMgZGlzdHJpYnV0ZWQpLiAgU2V0IENSTCBGaWxlIHRvIHRoZSBwYXRoIHRvIHRoZQotICAgIGZpbGUgY29udGFpbmluZyB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMgKG9yIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgCi0gICAgT3BlblNTTCBzdHlsZSBoYXNoLWJhc2VkIGZpbGVuYW1lcy4pICBTZWUgdGhlIHgxMXZuYyAtc3NsQ1JMIGRvY3VtZW50YXRpb24KLSAgICBmb3IgaG93IHRvIGNyZWF0ZSBDUkwncy4gIEluIHNob3J0LCB0aGUgY29tbWFuZHMgJ29wZW5zc2wgY2EgLXJldm9rZSAuLi4nCi0gICAgYW5kICdvcGVuc3NsIGNhIC1nZW5jcmwgLi4uJyBhcmUgdGhlIG9uZXMgdG8gbG9vayBmb3I7IFNlZSB0aGUgY2EoMSkgbWFucGFnZS4KLQotIENyZWF0ZSBDZXJ0aWZpY2F0ZToKLQotICAgIEEgc2ltcGxlIGRpYWxvZyB0byBjcmVhdGUgYSBTZWxmLVNpZ25lZCBDZXJ0aWZpY2F0ZS4gIFNlZSB0aGUgeDExdm5jCi0gICAgLXNzbEdlbkNBLCAtc3NsR2VuQ2VydCBvcHRpb25zIGZvciBjcmVhdGluZyBhIENBIENlcnQgYW5kIHNpZ25pbmcgd2l0aCBpdC4KLQotIEltcG9ydCBDZXJ0aWZpY2F0ZToKLQotICAgIFlvdSBjYW4gcGFzdGUgaW4gYSBDZXJ0aWZpY2F0ZSBvciByZWFkIG9uZSBpbiBmcm9tIGEgZmlsZSB0byBhZGQgdG8geW91cgotICAgIGxpc3Qgb2YgU2VydmVyIENlcnRpZmljYXRlcy4gIElmIChhbHNvKSBzYXZlZCBpbiB0aGUgJ0FjY2VwdGVkIENlcnRzJwotICAgIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVzZWQgdG8gdmVyaWZ5IGFueSBTZXJ2ZXIgd2hlbiBpbgotICAgICdWZXJpZnkgQWxsIENlcnRzJyBNb2RlLiAKLQotIERlbGV0aW5nIENlcnRpZmljYXRlczoKLQotICAgIFRvIGRlbGV0ZSBhIENlcnRpZmljYXRlK3ByaXZhdGVfa2V5IHBhaXIgY2xpY2sgb24gIkRlbGV0ZSBDZXJ0aWZpY2F0ZSIKLSAgICBhbmQgc2VsZWN0IG9uZSBpbiB0aGUgbWVudS4gIFlvdSB3aWxsIGJlIHByb21wdGVkIHRvIHJlbW92ZSBpdCwKLSAgICBhbmQgYWxzbyBhbnkgY29ycmVzcG9uZGluZyAucGVtIG9yIC5jcnQgZmlsZS4gIEZvciAiQUNDRVBURURfQ0VSVFMiCi0gICAgaXQgd2lsbCBmaW5kIHRoZSBtYXRjaGluZyAiSEFTSCIgZmlsZSBhbmQgcHJvbXB0IHlvdSB0byByZW1vdmUgdGhhdCB0b28uCi0KLQotIERlZmF1bHQgQ2VydHMgYW5kIEtleXM6Ci0KLSAgICBVc2UgdGhlICItbXljZXJ0IGZpbGUiIG9wdGlvbiAoc2FtZSBhcyAiLWNlcnQgZmlsZSIpIHRvIHNldCBhIGRlZmF1bHQKLSAgICBNeUNlcnQuICBUaGUgdXNlciB3aWxsIHRoZW4gaGF2ZSB0byBtYW51YWxseSBjbGVhciB0aGUgZmllbGQgdG8gbm90Ci0gICAgdXNlIGEgY2VydGlmaWNhdGUuICBUaGlzIGlzIHRoZSBzYW1lIGFzICJteWNlcnQ9ZmlsZSIgKGFsc28gImNlcnQ9ZmlsZSIpCi0gICAgaW4gdGhlIH4vLnNzdm5jcmMgZmlsZS4gIElmICJmaWxlIiBkb2VzIG5vdCBleGlzdCwgdGhlbiB+Ly52bmMvY2VydHMgaXMKLSAgICBwcmVwZW5kZWQgdG8gaXQuCi0KLSAgICBVc2UgdGhlICItY2FjZXJ0IGZpbGUiIG9wdGlvbiAoc2FtZSBhcyAiLWNhIGZpbGUiKSB0byBzZXQgYSBkZWZhdWx0Ci0gICAgU2VydmVyQ2VydC4gIFRoZSB1c2VyIHdpbGwgdGhlbiBoYXZlIHRvIG1hbnVhbGx5IGNsZWFyIHRoZSBmaWVsZCB0byBub3QKLSAgICBzZXQgYSBzZXJ2ZXIgY2VydC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgImNhY2VydD1maWxlIiAoYWxzbyAiY2E9ZmlsZSIpCi0gICAgaW4gdGhlIH4vLnNzdm5jcmMgZmlsZS4gIElmICJmaWxlIiBkb2VzIG5vdCBleGlzdCwgdGhlbiB+Ly52bmMvY2VydHMgaXMKLSAgICBwcmVwZW5kZWQgdG8gaXQuICBVc2UgIi1jYWNlcnQgQ0EiIHRvIHNldCBpdCB0byB+Ly52bmMvY2VydHMvQ0EvY2FjZXJ0LnBlbQotCi0gICAgVXNlIHRoZSAiLWNybCBmaWxlIiBvcHRpb24gdG8gc2V0IGEgZGVmYXVsdCBDUkwgRmlsZS4gIFRoZSB1c2VyIHdpbGwKLSAgICB0aGVuIGhhdmUgdG8gbWFudWFsbHkgY2xlYXIgdGhlIGZpZWxkIHRvIG5vdCB1c2UgYSBDUkwuICBUaGlzIGlzIHRoZQotICAgIHNhbWUgYXMgImNybD1maWxlIiBpbiB0aGUgfi8uc3N2bmNyYyBmaWxlLiAgSWYgImZpbGUiIGRvZXMgbm90IGV4aXN0LAotICAgIHRoZW4gfi8udm5jL2NlcnRzIGlzIHByZXBlbmRlZCB0byBpdC4KLQotICAgIEEgc3lzLWFkbWluIG1pZ2h0IHNldCB1cCBhbiBTU1ZOQyBkZXBsb3ltZW50IGZvciB1c2VyJ3Mgd29ya3N0YXRpb25zIG9yCi0gICAgbGFwdG9wcyB1c2luZyBvbmUgb3IgbW9yZSBvZiAtY2FjZXJ0IChhdXRoZW50aWNhdGUgVk5DIHNlcnZlciB0byB0aGUKLSAgICB1c2VyKSBvciAtbXljZXJ0IChhdXRoZW50aWNhdGUgdXNlciB0byBWTkMgc2VydmVyKSBvciAtY3JsIChzdXBwbHkgYQotICAgIGxpc3Qgb2YgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMpLiAgUHJlZml4IGVpdGhlciBvbmUgd2l0aCAiRk9SQ0U6IiB0byBtYWtlCi0gICAgdGhlIHNldHRpbmcgdW5jaGFuZ2FibGUuCi0KLQotIE5vdGVzOgotCi0gICAgSWYgIlVzZSBTU0giIGhhcyBiZWVuIHNlbGVjdGVkIHRoZW4gU1NMIGNlcnRzIGFyZSBkaXNhYmxlZC4KLQotICAgIFNlZSB0aGUgeDExdm5jIGFuZCBTVFVOTkVMIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBjcmVhdGUgYW5kIHVzZSBQRU0KLSAgICBjZXJ0aWZpY2F0ZSBmaWxlczoKLQotICAgICAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zc2wtdHVubmVsLWV4dAotICAgICAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3NzbC5odG1sCi0gICAgICAgIGh0dHA6Ly9zdHVubmVsLm1pcnQubmV0Ci0KLSAgICBBIGNvbW1vbiB3YXkgdG8gY3JlYXRlIGFuZCB1c2UgYSBWTkMgU2VydmVyIGNlcnRpZmljYXRlIGlzOgotCi0gICAgICAgIHgxMXZuYyAtc3NsIFNBVkUgLi4uCi0KLSAgICBhbmQgdGhlbiBjb3B5IHRoZSBTZXJ2ZXIgY2VydGlmaWNhdGUgdG8gdGhlIGxvY2FsICh2aWV3ZXItc2lkZSkgbWFjaGluZS4KLSAgICB4MTF2bmMgcHJpbnRzIG91dCB0byB0aGUgc2NyZWVuIHRoZSBTZXJ2ZXIgY2VydGlmaWNhdGUgaXQgZ2VuZXJhdGVzCi0gICAgKHN0b3JlZCBpbiB+Ly52bmMvY2VydHMvc2VydmVyLmNydCkuICBZb3UgY2FuIHNldCAiU2VydmVyQ2VydCIgdG8gaXQKLSAgICBkaXJlY3RseSBvciB1c2UgdGhlICJJbXBvcnQgQ2VydGlmaWNhdGUiIGFjdGlvbiB0byBzYXZlIGl0IHRvIGEgZmlsZS4KLSAgICBPciB1c2UgdGhlICJGZXRjaCBDZXJ0IiBtZXRob2QgdG8gcmV0cmlldmUgaXQgKGJlIHN1cmUgdG8gdmVyaWZ5IHRoZQotICAgIE1ENSBmaW5nZXJwcmludCwgZXRjKS4KLQotICAgIHgxMXZuYyBhbHNvIGhhcyBjb21tYW5kIGxpbmUgdXRpbGl0aWVzIHRvIGNyZWF0ZSBzZXJ2ZXIsIGNsaWVudCwgYW5kIENBCi0gICAgKENlcnRpZmljYXRlIEF1dGhvcml0eSkgY2VydGlmaWNhdGVzIGFuZCBzaWduIHdpdGggaXQuIFNlZSB0aGUgYWJvdmUgVVJMcy4KLX0KLQotCS5jaC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0JamlnZ2xlX3RleHQgLmNoLmYudAotfQotCi1wcm9jIGhlbHBfdHNfb3B0cyB7fSB7Ci0JdG9wbGV2IC5vaAotCi0Jc2Nyb2xsX3RleHRfZGlzbWlzcyAub2guZgotCi0JY2VudGVyX3dpbiAub2gKLQotCXdtIHRpdGxlIC5vaCAiVGVybWluYWwgU2VydmljZXMgVk5DIE9wdGlvbnMgSGVscCIKLQotc2V0IG1zZyB7Ci0gT3B0aW9uczogIENsaWNrIG9uIGEgY2hlY2tib3ggdG8gZW5hYmxlIGEgZmVhdHVyZSBhbmQgYnJpbmcgdXAgaXRzIERpYWxvZy4KLSBEZXNlbGVjdGluZyBhIGNoZWNrYm94IHdpbGwgZGlzYWJsZSB0aGUgZmVhdHVyZSAoYnV0IHNldHRpbmdzIGZyb20gdGhlCi0gRGlhbG9nIGFyZSByZW1lbWJlcmVkKS4gIENsaWNrIG9uIGl0IGFnYWluIHRvIHJlLWVuYWJsZS4KLQotCi0gRGVza3RvcCBUeXBlOgotCi0gICAgVGhlIGRlZmF1bHQgdHlwZSBvZiByZW1vdGUgRGVza3RvcCB0eXBlIGlzIHRoZSAia2RlIiAoVGhlIEsgRGVza3RvcAotICAgIEVudmlyb25tZW50KSBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCB0eXBlOiBnbm9tZSwgZmFpbHNhZmUsCi0gICAgdHdtLCBldGMuCi0KLSAgICBUaGlzIHNldHRpbmcgd2lsbCBPTkxZIGJlIHVzZWQgaWYgdGhlIGRlc2t0b3AgbmVlZHMgdG8gYmUgY3JlYXRlZC4KLSAgICBJZiBhbiBleGlzdGluZyBzZXNzaW9uIG9mIHlvdXJzIGlzIGZvdW5kIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkCi0gICAgKGxvZyBvdXQgb2YgdGhhdCBzZXNzaW9uIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBEZXNrdG9wIHR5cGUKLSAgICBvciBzZWUgdGhlIE11bHRpcGxlIFNlc3Npb25zIG9wdGlvbiB1bmRlciBBZHZhbmNlZCkuCi0KLSBEZXNrdG9wIFNpemU6Ci0KLSAgICBUaGUgZGVmYXVsdCBzaXplIG9mIHJlbW90ZSBEZXNrdG9wIHR5cGUgaXMgdGhlICIxMjgweDEwMjQiIHdpdGggYQotICAgIENvbG9yIGRlcHRoIG9mIDE2IGJpdHMgcGVyIHBpeGVsIChCUFApLiAgQ2hvb3NlIG9uZSBvZiB0aGUgc3RhbmRhcmQKLSAgICBXeEggdmFsdWVzIG9yIGVudGVyIGEgY3VzdG9tIG9uZSAoVEJEKS4KLQotICAgIFRoaXMgc2V0dGluZyB3aWxsIE9OTFkgYmUgdXNlZCBpZiB0aGUgZGVza3RvcCBuZWVkcyB0byBiZSBjcmVhdGVkLgotICAgIElmIGFuIGV4aXN0aW5nIHNlc3Npb24gb2YgeW91cnMgaXMgZm91bmQgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQKLSAgICAobG9nIG91dCBvZiB0aGF0IHNlc3Npb24gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IERlc2t0b3Agc2l6ZQotICAgIG9yIHNlZSB0aGUgTXVsdGlwbGUgU2Vzc2lvbnMgb3B0aW9uIHVuZGVyIEFkdmFuY2VkKS4KLQotICAgIFNvbWUgWCBzZXJ2ZXJzLCBYZHVtbXkgb3IgYSByZWFsIFggc2VydmVyLCB3aWxsIGFsbG93IGR5bmFtaWMgc2NyZWVuCi0gICAgc2l6ZSBjaGFuZ2luZyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgc3RhcnRlZCB2aWEgYSBHVUkgY29uZmlndXJhdGlvbgotICAgIHRvb2wgKG9yIHhyYW5kcigxKSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLgotCi0gWCBTZXJ2ZXIgVHlwZToKLQotICAgIFRoZSBkZWZhdWx0IHR5cGUgb2YgcmVtb3RlIFggc2Vzc2lvbiBpcyB0aGUgIlh2ZmIiIChYIHZpcnR1YWwgZnJhbWUKLSAgICBidWZmZXIpIFggc2VydmVyLiAgSXQgaXMgYXZhaWxhYmxlIG9uIG1vc3Qgc3lzdGVtcy4gIFRvIGNob29zZSBhCi0gICAgZGlmZmVyZW50IHR5cGUsIHNlbGVjdCAiWGR1bW15IiwgIlh2bmMiLCAiWHZuYy5yZWRpcmVjdCIuCi0KLSAgICBYZHVtbXkgaXMgcGFydCBvZiB0aGUgeDExdm5jIHByb2plY3QgYW5kIGlzIGEgdmlydHVhbCBYIHNlcnZlciB3aXRoCi0gICAgc29tZSBuaWNlIGZlYXR1cmVzLCBidXQgaXQgTGludXggb25seSBhbmQgcmVxdWlyZXMgcm9vdCBwZXJtaXNzaW9uCi0gICAgdG8gcnVuLiAgT25lIHVzZXIgcHV0ICdBTEwgQUxMID0gTk9QQVNTV0Q6IC91c3IvbG9jYWwvYmluL1hkdW1teSonCi0gICAgaW4gaGlzIHN1ZG8oMSkgY29uZmlndXJhdGlvbiAodmlhIHZpc3VkbykuCi0KLSAgICBGb3IgWHZuYyB0aGF0IHNlcnZlciBpcyBzdGFydGVkIHVwLCBhbmQgeDExdm5jIHBvbGxzIGl0IGluIGl0cwotICAgIG5vcm1hbCB3YXkuICBVc2UgWHZuYy5yZWRpcmVjdCBpZiB5b3Ugd2FudCB4MTF2bmMgdG8gZmluZCBhbmQvb3IKLSAgICBjcmVhdGUgdGhlIFh2bmMgc2Vzc2lvbiwgYnV0IGFmdGVyIHRoYXQgbWVyZWx5IHRyYW5zZmVyIHBhY2tldHMgYmFjawotICAgIGFuZCBmb3J0aCBiZXR3ZWVuIFZOQyB2aWV3ZXIgYW5kIFh2bmMgKEkuZS4geDExdm5jIGRvZXMgbm8gcG9sbGluZwotICAgIG9yIFZOQyBwcm90b2NvbCkuCi0KLQotIEVuYWJsZSBQcmludGluZzoKLQotICAgIFRoaXMgc2V0cyB1cCBhIFNTSCBwb3J0IHJlZGlyZWN0aW9uIGZvciB5b3UgZnJvbSB5b3VyIHJlbW90ZSBzZXNzaW9uCi0gICAgdG8geW91ciBsb2NhbCBwcmludCBzZXJ2ZXIuICBUaGUgQ1VQUyBtZWNoYW5pc20gaXMgdXNlZC4gIFRoZSBsb2NhbAotICAgIHByaW50IHNlcnZlciBjYW4gYWxzbyBiZSBTTUIvV2luZG93cy4KLQotIEVuYWJsZSBTb3VuZDoKLQotICAgIE5vdCBjb21wbGV0ZWx5IGltcGxlbWVudGVkIHlldC4gIEEgcGFydGlhbGx5IHdvcmtpbmcgRVNEIG1ldGhvZAotICAgIGlzIHByb3ZpZGVkLiAgSXQgbWF5IGNoYW5nZSBvdmVyIHRvIGh0dHA6Ly9uYXMuc291cmNlZm9yZ2UubmV0IGluCi0gICAgdGhlIGZ1dHVyZS4gIEFzIHdpdGggcHJpbnRpbmcsIGl0IHVzZXMgYSBTU0ggcG9ydCByZWRpcmVjdGlvbiB0byBhCi0gICAgc2VydmVyIHJ1bm5pbmcgbG9jYWxseS4KLQotIEZpbGUgVHJhbnNmZXI6Ci0KLSAgICB4MTF2bmMgc3VwcG9ydHMgYm90aCB0aGUgVWx0cmFWTkMgYW5kIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIKLSAgICBleHRlbnNpb25zLiAgT24gV2luZG93cyBib3RoIHZpZXdlcnMgc3VwcG9ydCB0aGVpciBmaWxlIHRyYW5zZmVyCi0gICAgcHJvdG9jb2wuICBPbiBVbml4IG9ubHkgdGhlIFNTVk5DIFZOQyBWaWV3ZXIgaGFzIGZpbGV4ZmVyIHN1cHBvcnQ7Ci0gICAgaXQgc3VwcG9ydHMgdGhlIFVsdHJhVk5DIGZsYXZvciB2aWEgYSBKYXZhIGhlbHBlciBwcm9ncmFtLgotCi0gICAgQ2hvb3NlIHRoZSBvbmUgeW91IHdhbnQgYmFzZWQgb24gVk5DIHZpZXdlciB5b3Ugd2lsbCB1c2UuCi0gICAgVGhlIGRlZmF1bHRzIGZvciB0aGUgU1NWTkMgdmlld2VyIHBhY2thZ2UgYXJlIFRpZ2h0Vk5DIG9uIFdpbmRvd3MKLSAgICBhbmQgVWx0cmFWTkMgb24gVW5peC4KLQotIFZpZXcgT25seToKLQotICAgIFN0YXJ0IHRoZSBWTkMgVmlld2VyIGluIFZpZXctT25seSBtb2RlIChpdCBtYXkgYmUgc3dpdGNoZWQgdG8gZnVsbAotICAgIGFjY2VzcyBsYXRlciBpbiB0aGUgc2Vzc2lvbikuCi0KLSBDaGFuZ2UgVk5DIFZpZXdlcjoKLQotICAgIElmIHlvdSBkbyBub3QgbGlrZSB0aGUgVk5DIFZpZXdlciBidW5kbGVkIGluIHRoZSBwYWNrYWdlLCB5b3UgY2FuCi0gICAgaW5kaWNhdGUgYW5vdGhlciBvbmUgaGVyZS4KLQotIFgxMSB2aWV3ZXIgTWFjT1NYOgotCi0gICAgT24gTWFjT1NYIHRyeSB0byB1c2UgdGhlIGJ1bmRsZWQgWDExIHZuY3ZpZXdlciBpbnN0ZWFkIG9mIHRoZQotICAgIENoaWNrZW4gb2YgdGhlIFZOQyB2aWV3ZXI7IHRoZSBYcXVhcnR6IFggc2VydmVyIG11c3QgYmUgaW5zdGFsbGVkCi0gICAgKGl0IGlzIGJ5IGRlZmF1bHQgb24gMTAuNS54KSBhbmQgdGhlIERJU1BMQVkgdmFyaWFibGUgbXVzdCBiZSBzZXQKLSAgICAoc2VlIFRpcCAxNSBvZiBTU1ZOQyBIZWxwIHRvIGRvIHRoaXMgbWFudWFsbHkuKQotCi0KLSBBZHZhbmNlZCBPcHRpb25zOgotCi0gVk5DIFNoYXJlZDoKLQotICAgIE5vcm1hbCB1c2Ugb2YgdGhpcyBwcm9ncmFtLCAndHN2bmMnLCAqQUxSRUFEWSogYWxsb3dzIHNpbXVsdGFuZW91cwotICAgIHNoYXJlZCBhY2Nlc3Mgb2YgdGhlIHJlbW90ZSBkZXNrdG9wOiAgIFlvdSBzaW1wbHkgbG9nIGluIGFzIG1hbnkKLSAgICB0aW1lcyBmcm9tIGFzIG1hbnkgZGlmZmVyZW50IGxvY2F0aW9ucyB3aXRoICd0c3ZuYycgYXMgeW91IGxpa2UuCi0KLSAgICBTZWxlY3QgdGhpcyBvcHRpb24gZm9yIHRoZSB0cmFkaXRpb25hbCBWTkMgc2VydmVyIHNoYXJlZCBtb2RlIG9mCi0gICAgb3BlcmF0aW9uIHVzaW5nIGEgc2luZ2xlIHgxMXZuYyBzZXJ2ZXIuICBTU0ggYWNjZXNzIGlzIHN0aWxsIHJlcXVpcmVkLgotCi0gTXVsdGlwbGUgU2Vzc2lvbnM6Ci0KLSAgICBUbyBlbmFibGUgb25lIHVzZXIgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIFRlcm1pbmFsIFNlcnZpY2VzIERlc2t0b3AKLSAgICBYIHNlc3Npb24gb24gYSBzaW5nbGUgbWFjaGluZSwgdGhpcyBvcHRpb24gbGV0cyB5b3UgY3JlYXRlIFRhZ3MgZm9yCi0gICAgbXVsdGlwbGUgb25lcyAoZS5nLiBLREVfQklHLCBUV01fODAweDYwMCkKLQotIFggTG9naW4gR3JlZXRlcjoKLQotICAgIElmIHlvdSBoYXZlIHJvb3QgKHN1ZG8oMSkpIHBlcm1pc3Npb24gb24gdGhlIHJlbW90ZSBtYWNoaW5lLAotICAgIHlvdSBjYW4gaGF2ZSB4MTF2bmMgdHJ5IHRvIGNvbm5lY3QgdG8gWCBkaXNwbGF5cyB0aGF0IGhhdmUgbm9ib2R5Ci0gICAgbG9nZ2VkIGluIHlldC4gIFRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGxvZ2luIGdyZWV0ZXIgcnVubmluZyBvbgotICAgIHRoZSBQaHlzaWNhbCBjb25zb2xlLiAgc3VkbygxKSBpcyB1c2VkIHRvIHJ1biB4MTF2bmMgd2l0aCBGRF9YRE09MS4KLQotICAgIEFuIGluaXRpYWwgc3NoIHJ1bm5pbmcgJ3N1ZG8gaWQnIGlzIHBlcmZvcm1lZCB0byB0cnkgdG8gJ3ByaW1lJwotICAgIHN1ZG8gc28gdGhlIDJuZCBvbmUgdGhhdCBzdGFydHMgeDExdm5jIGRvZXMgbm90IG5lZWQgYSBwYXNzd29yZC4KLQotICAgIE5vdGUgdGhhdCBpZiBzb21lb25lIGlzIGFscmVhZHkgbG9nZ2VkIGludG8gdGhlIGNvbnNvbGUgb2YgdGhlIFhETQotICAgIGRpc3BsYXkgeW91IHdpbGwgc2VlIHRoZWlyIFggc2Vzc2lvbi4KLQotIE90aGVyIFZOQyBTZXJ2ZXI6Ci0KLSAgICBUaGUgeDExdm5jIHByb2dyYW0gcnVubmluZyBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgY2FuIGJlIGluc3RydWN0ZWQgdG8KLSAgICBpbW1lZGlhdGVseSByZWRpcmVjdCB0byBzb21lIG90aGVyICgzcmQgcGFydHksIGUuZy4gWHZuYyBvciB2bmMuc28pCi0gICAgVk5DIHNlcnZlci4KLQotIFVzZSB1bml4cHc6Ci0KLSAgICBUaGlzIGVuYWJsZXMgdGhlIHgxMXZuYyB1bml4cHcgbW9kZS4gIEEgTG9naW46IGFuZCBQYXNzd29yZDogZGlhbG9nCi0gICAgd2lsbCBiZSBwcmVzZW50ZWQgaW4gdGhlIFZOQyBWaWV3ZXIgZm9yIHRoZSB1c2VyIHRvIHByb3ZpZGUgYW55IFVuaXgKLSAgICB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2hvc2Ugc2Vzc2lvbiBoZSB3YW50cyB0byBjb25uZWN0IHRvLgotCi0gICAgVGhpcyBtb2RlIGlzIHVzZWZ1bCBpZiBhIHNoYXJlZCB0ZXJtaW5hbCBzZXJ2aWNlcyB1c2VyIChlLmcuICd0c3VzZXInKQotICAgIGlzIHVzZWQgZm9yIHRoZSBTU0ggbG9naW4gcGFydCAoc2F5IHZpYSB0aGUgU1NIIGF1dGhvcml6ZWRfa2V5cwotICAgIG1lY2hhbmlzbSBhbmQgYWxsIHVzZXJzIHNoYXJlIHRoZSBzYW1lIHByaXZhdGUgU1NIIGtleSBmb3IgJ3RzdXNlcicpLgotCi0gICAgSW4gbm9ybWFsIHVzYWdlIHRoZSBwZXItdXNlciBTU0ggbG9naW4gc2hvdWxkIGJlIHRoZSBzaW1wbGVzdCBhbmQKLSAgICBzdWZmaWNpZW50LCBpbiB3aGljaCBjYXNlIHRoZSB1bml4cHcgb3B0aW9uIHNob3VsZCBOT1QgYmUgc2VsZWN0ZWQuCi0KLSBDbGllbnQgOGJpdCBDb2xvcjoKLQotICAgIEhhdmUgdGhlIFZOQyBWaWV3ZXIgcmVxdWVzdCBsb3cgY29sb3IgbW9kZSAoOCBiaXRzIHBlciBwaXhlbCkgZm9yCi0gICAgc2xvdyBsaW5rcy4gIFRoaXMgbWF5IGJlIGRpc2FibGVkIG9yIGZ1cnRoZXIgdHVuZWQgKGUuZy4gNjQgY29sb3IKLSAgICBtb2RlKSBpbiB0aGUgdmlld2VyIGR1cmluZyB0aGUgc2Vzc2lvbi4KLQotIENsaWVudC1TaWRlIENhY2hpbmc6Ci0KLSAgICB4MTF2bmMgaGFzIGFuIGV4cGVyaW1lbnQgQ2xpZW50LVNpZGUgY2FjaGluZyBzY2hlbWUgIi1uY2FjaGUgbiIKLSAgICB0aGF0IGNhbiBnaXZlIG5pY2Ugc3BlZWR1cHMuICBCdXQgdGhlcmUgYXJlIHNvbWUgZHJhd2JhY2tzCi0gICAgYmVjYXVzZSB0aGUgY2FjaGUtcmVnaW9uIGlzIHZpc2libGUgYW5kIHVzZXMgbXVjaCBSQU0uCi0gICAgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtY2xpZW50LWNhY2hpbmcKLQotIFgxMVZOQyBPcHRpb25zOgotCi0gICAgSWYgeW91IGFyZSBmYW1pbGlhciB3aXRoIHgxMXZuYywgeW91IGNhbiBzcGVjaWZ5IGFueSBvZiBpdHMgZmVhdHVyZXMKLSAgICB0aGF0IHlvdSB3b3VsZCBsaWtlIGVuYWJsZWQuCi0KLSBTU1ZOQyBNb2RlOgotCi0gICAgQ2xpY2tpbmcgb24gdGhpcyBidXR0b24gd2lsbCByZXR1cm4geW91IHRvIHRoZSBmdWxsIFNTVk5DIE1vZGUuCi0KLSBVbml4IHNzdm5jdmlld2VyOgotCi0gICAgQ2xpY2tpbmcgb24gdGhpcyBidXR0b24gd2lsbCBwb3B1cCBhIG1lbnUgZm9yIHNldHRpbmcgb3B0aW9ucwotICAgIG9mIHRoZSBVbml4IChhbmQgTWFjIE9TIFgpIHByb3ZpZGVkIFNTVk5DIHZuY3ZpZXdlci4KLQotCi0gfi8uc3N2bmNyYyBmaWxlOgotCi0gICAgWW91IGNhbiBwdXQgZ2xvYmFsIG9wdGlvbnMgaW4geW91ciB+Ly5zc3ZuY3JjIGZpbGUgKHNzdm5jX3JjIG9uCi0gICAgV2luZG93cykuIEN1cnJlbnRseSB0aGV5IGFyZToKLQotICAgIFB1dCAibW9kZT10c3ZuYyIgb3IgIm1vZGU9c3Nodm5jIiBpbiB0aGUgfi8uc3N2bmNyYyBmaWxlIHRvIGhhdmUKLSAgICB0aGUgYXBwbGljYXRpb24gc3RhcnQgdXAgaW4gdGhlIGdpdmVuIG1vZGUuCi0KLSAgICBkZXNrdG9wX3R5cGU9d21ha2VyICAoZS5nLikgdG8gc3dpdGNoIHRoZSBkZWZhdWx0IERlc2t0b3AgVHlwZS4KLQotICAgIGRlc2t0b3Bfc2l6ZT0xMjgweDEwMjQgIChlLmcuKSB0byBzd2l0Y2ggdGhlIGRlZmF1bHQgRGVza3RvcCBTaXplLgotCi0gICAgZGVza3RvcF9kZXB0aD0yNCAgKGUuZy4pIHRvIHN3aXRjaCB0aGUgZGVmYXVsdCBEZXNrdG9wIENvbG9yIERlcHRoLgotCi0gICAgeHNlcnZlcl90eXBlPVhkdW1teSAgKGUuZy4pIHRvIHN3aXRjaCB0aGUgZGVmYXVsdCBYIFNlcnZlciBUeXBlLgotCi0gICAgKFRoZSBhYm92ZSA0IHNldHRpbmdzIGFwcGx5IG9ubHkgdG8gdGhlIFRlcm1pbmFsIFNlcnZpY2VzIE1vZGUuKQotCi0gICAgbm9lbmM9MSAgKHNhbWUgYXMgdGhlIC1ub2VuYyBvcHRpb24gZm9yIGEgJ05vIEVuY3J5cHRpb24nIG9wdGlvbikKLSAgICBub2VuYz0wICAoZG8gbm90IHNob3cgdGhlICdObyBFbmNyeXB0aW9uJyBvcHRpb24pCi0KLSAgICBmb250X2RlZmF1bHQ9dGstZm9udC1uYW1lICAgICAoc2V0cyB0aGUgZm9udCBmb3IgbWVudXMgYW5kIGJ1dHRvbnMpCi0gICAgZm9udF9maXhlZD10ay1mb250LW5hbWUgICAgICAgKHNldHMgdGhlIGZvbnQgZm9yIGhlbHAgdGV4dCkKLX0KLQkub2guZi50IGluc2VydCBlbmQgJG1zZwotCWppZ2dsZV90ZXh0IC5vaC5mLnQKLX0KLQotcHJvYyBoZWxwX29wdHMge30gewotCXRvcGxldiAub2gKLQotCXNjcm9sbF90ZXh0X2Rpc21pc3MgLm9oLmYKLQotCWNlbnRlcl93aW4gLm9oCi0KLQl3bSB0aXRsZSAub2ggIlNTTC9TU0ggVmlld2VyIE9wdGlvbnMgSGVscCIKLQotc2V0IG1zZyB7Ci0gIFVzZSBTU0w6ICBUaGUgZGVmYXVsdCwgdXNlIFNTTCB2aWEgU1RVTk5FTCAodGhpcyByZXF1aXJlcyBTU0wgYXdhcmUgVk5DCi0gICAgICAgICAgICBzZXJ2ZXIsIGUuZy4geDExdm5jIC1zc2wgU0FWRSAuLi4pICBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZQotICAgICAgICAgICAgbWFpbiBIZWxwIHBhbmVsLgotCi0gIFVzZSBTU0g6ICBJbnN0ZWFkIG9mIHVzaW5nIFNUVU5ORUwgU1NMLCB1c2Ugc3NoKDEpIGZvciB0aGUgZW5jcnlwdGVkCi0gICAgICAgICAgICB0dW5uZWwuICBZb3UgbXVzdCBiZSBhYmxlIHRvIGxvZyBpbiB2aWEgc3NoIHRvIHRoZSByZW1vdGUgaG9zdC4KLQotICAgICAgICAgICAgT24gVW5peCB0aGUgY21kbGluZSBzc2goMSkgcHJvZ3JhbSAoaXQgbXVzdCBhbHJlYWR5IGJlIGluc3RhbGxlZCkKLSAgICAgICAgICAgIHdpbGwgYmUgcnVuIGluIGFuIHh0ZXJtIGZvciBwYXNzcGhyYXNlIGF1dGhlbnRpY2F0aW9uLCBwcm9tcHRzCi0gICAgICAgICAgICBhYm91dCBSU0Ega2V5cywgZXRjLiAgT24gV2luZG93cyB0aGUgY21kbGluZSBwbGluay5leGUgcHJvZ3JhbQotICAgICAgICAgICAgd2lsbCBiZSBsYXVuY2hlZCBpbiBhIFdpbmRvd3MgQ29uc29sZSB3aW5kb3cuIChBcG9sb2dpZXMgZm9yCi0gICAgICAgICAgICB0aGUga2x1bmtpbmVzcy4uKQotCi0gICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgIlZOQyBIb3N0OkRpc3BsYXkiIHRvICJ1c2VyQGhvc3Q6ZGlzcCIgdG8KLSAgICAgICAgICAgIGluZGljYXRlIHNzaCBzaG91bGQgbG9nIGluIGFzICJ1c2VyIiBvbiAiaG9zdCIuICBOT1RFOiBPbgotICAgICAgICAgICAgV2luZG93cyB5b3UgKk1VU1QqIGFsd2F5cyBzdXBwbHkgdGhlICJ1c2VyQCIgcGFydCAoZHVlIHRvIGEKLSAgICAgICAgICAgIHBsaW5rIGRlZmljaWVuY3kpLiBFLmcuOgotCi0gICAgICAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogICAgZnJlZEBmYXItYXdheS5lYXN0OjAKLQotCi0gICAgICAgICAgICBHYXRld2F5OiAgSWYgYW4gaW50ZXJtZWRpYXRlIGdhdGV3YXkgbWFjaGluZSBtdXN0IGJlIHVzZWQKLSAgICAgICAgICAgIChlLmcuIHRvIGVudGVyIGEgZmlyZXdhbGw7IHRoZSBWTkMgU2VydmVyIGlzIG5vdCBydW5uaW5nIG9uIGl0KSwKLSAgICAgICAgICAgIHB1dCBpdCBpbiB0aGUgUHJveHkvR2F0ZXdheSBlbnRyeSwgZS5nLjoKLQotICAgICAgICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6ICAgIHdvcmtzdGF0aW9uOjAKLSAgICAgICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICAgICB1c2VyQGdhdGV3YXktaG9zdDpwb3J0Ci0gIAotICAgICAgICAgICAgc3NoIGlzIHVzZWQgdG8gbG9naW4gdG8gdXNlckBnYXRld2F5LWhvc3QgYW5kIHRoZW4gYSAtTCBwb3J0Ci0gICAgICAgICAgICByZWRpcmVjdGlvbiBpcyBzZXQgdXAgdG8gZ28gdG8gd29ya3N0YXRpb246MCBmcm9tIGdhdGV3YXktaG9zdC4KLSAgICAgICAgICAgICI6cG9ydCIgaXMgb3B0aW9uYWwsIHVzZSBpdCBpZiB0aGUgZ2F0ZXdheS1ob3N0IFNTSCBwb3J0IGlzCi0gICAgICAgICAgICBub3QgdGhlIGRlZmF1bHQgdmFsdWUgMjIuCi0KLSAgICAgICAgICAgIENoYWluaW5nIDIgc3NoJ3M6ICBPbmUgY2FuIGFsc28gZG8gYSAiZG91YmxlIHNzaCIsIGkuZS4gYQotICAgICAgICAgICAgZmlyc3QgU1NIIHRvIHRoZSBnYXRld2F5IGxvZ2luIG1hY2hpbmUgdGhlbiBhIDJuZCBzc2ggdG8gdGhlCi0gICAgICAgICAgICBkZXN0aW5hdGlvbiBtYWNoaW5lIChwcmVzdW1hYmx5IGl0IGlzIHJ1bm5pbmcgdGhlIHZuYyBzZXJ2ZXIpLgotCi0gICAgICAgICAgICBVbmxpa2UgdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSAibGFzdCBsZWciIChnYXRld2F5LWhvc3QgLT4KLSAgICAgICAgICAgIHdvcmtzdGF0aW9uKSBpcyBhbHNvIGVuY3J5cHRlZCBieSBTU0ggdGhpcyB3YXkuICBEbyB0aGlzIGJ5Ci0gICAgICAgICAgICBzcGxpdHRpbmcgdGhlIGdhdGV3YXkgaW4gdHdvIHdpdGggYSBjb21tYSwgdGhlIHBhcnQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB0aGUgZmlyc3QgU1NIOgotCi0gICAgICAgICAgICAgICAgVk5DIEhvc3Q6RGlzcGxheTogbG9jYWxob3N0OjAKLSAgICAgICAgICAgICAgICBQcm94eS9HYXRld2F5OiAgICB1c2VyQGdhdGV3YXktaG9zdDpwb3J0LHVzZXJAd29ya3N0YXRpb246cG9ydAotCi0gICAgICAgICAgICBXZWIgYW5kIFNPQ0tTIHByb3hpZXMgY2FuIGFsc28gYmUgdXNlZCB3aXRoIFNTSDoKLQotICAgICAgICAgICAgICAgIFZOQyBIb3N0OkRpc3BsYXk6IHVzZXJAd29ya3N0YXRpb246MAotICAgICAgICAgICAgICAgIFByb3h5L0dhdGV3YXk6ICAgIHNvY2tzOi8vc29ja3Muc2VydmVyOjEwODAKLQotICAgICAgICAgICAgU2VlIHRoZSAiU1NIIFByb3hpZXMvR2F0ZXdheXMiIGluIHRoZSBNYWluIEhlbHAgZG9jdW1lbnQgZm9yIGZ1bGwKLSAgICAgICAgICAgIGRldGFpbHMuCi0KLQotICAgICAgICAgICAgUmVtb3RlIENvbW1hbmQ6ICBJbiB0aGUgIlJlbW90ZSBTU0ggQ29tbWFuZCIgZW50cnkgeW91IGNhbiB0bwotICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCBhIHJlbW90ZSBjb21tYW5kIHRvIGJlIHJ1bi4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAic2xlZXAgMTUiIHRvIG1ha2Ugc3VyZSBwb3J0IHJlZGlyZWN0aW9ucyBnZXQgZXN0YWJsaXNoZWQuIEJ1dCB5b3UKLSAgICAgICAgICAgIGNhbiBydW4gYW55dGhpbmcgZWxzZSwgZm9yIGV4YW1wbGUsIHRvIHJ1biB4MTF2bmMgb24geW91ciBYIDowCi0gICAgICAgICAgICB3b3Jrc3RhdGlvbiBkaXNwbGF5OgotCi0gICAgICAgICAgICAgICAgeDExdm5jIC1kaXNwbGF5IDowIC1ub3B3Ci0KLQotICAgICAgICAgICAgV2luZG93cyBTU0ggU0VSVkVSOiBpZiB5b3UgYXJlIHNzaCdpbmcgSU5UTyBXaW5kb3dzIChlLmcuIENZR1dJTgotICAgICAgICAgICAgU1NIRCBzZXJ2ZXIpIHRoZXJlIG1heSBiZSBubyAic2xlZXAiIGNvbW1hbmQgc28gcHV0IGluIHNvbWV0aGluZwotICAgICAgICAgICAgbGlrZSAicGluZyBsb2NhbGhvc3QiIG9yICJwaW5nIC1uIDEwIC13IDEwMDAgbG9jYWxob3N0IiB0byAKLSAgICAgICAgICAgIHNldCBhIHNob3J0IGRlbGF5IHRvIGxldCB0aGUgcG9ydCByZWRpciBnZXQgZXN0YWJsaXNoZWQuCi0KLQotICAgICAgICAgICAgVHJpY2s6ICBJZiB5b3UgdXNlICJTSEVMTCIgYXNsIHRoZSAiUmVtb3RlIFNTSCBDb21tYW5kIiB0aGVuCi0gICAgICAgICAgICB5b3UgZ2V0IGFuIFNTSCBzaGVsbCBvbmx5OiBubyBWTkMgdmlld2VyIHdpbGwgYmUgbGF1bmNoZWQuCi0gICAgICAgICAgICBPbiBXaW5kb3dzICJQVVRUWSIgd2lsbCB0cnkgdG8gdXNlIHB1dHR5LmV4ZSAoYmV0dGVyIHRlcm1pbmFsCi0gICAgICAgICAgICBlbXVsYXRpb24gdGhhbiBwbGluay5leGUpICBBIHNob3J0Y3V0IGZvciB0aGlzIGlzIEN0cmwtUyBhcwotICAgICAgICAgICAgbG9uZyBhcyB1c2VyQGhvc3RuYW1lIGlzIHByZXNlbnQgaW4gdGhlICJWTkMgSG9zdDpEaXNwbGF5IiBib3guCi0KLQotICBVc2UgU1NIICsgU1NMOgotCi0gICAgICAgICAgICBUdW5uZWwgdGhlIFNTTCBjb25uZWN0aW9uIHRocm91Z2ggYSBTU0ggdHVubmVsLiAgVXNlIHRoaXMKLSAgICAgICAgICAgIGlmIHlvdSB3YW50IGVuZC10by1lbmQgU1NMIGFuZCBtdXN0IHVzZSBhIFNTSCBnYXRld2F5IChlLmcuIHRvCi0gICAgICAgICAgICBlbnRlciBhIGZpcmV3YWxsKSBvciBpZiBhZGRpdGlvbmFsIFNTSCBwb3J0IHJlZGlycyBhcmUgcmVxdWlyZWQKLSAgICAgICAgICAgIChDVVBTLCBTb3VuZCwgU01CIHR1bm5lbGxpbmc6IFNlZSBBZHZhbmNlZCBPcHRpb25zKS4KLQotICAgICAgICAgICAgVGhpcyBpcyBhIFJBUkVMWSB1c2VkIG1vZGUsIGJ1dCBpbmNsdWRlZCBpbiBjYXNlIHRoZSBuZWVkIGFyaXNlcy4KLQotCi0gIE5vIEVuY3J5cHRpb246Ci0KLSAgICAgICAgICAgIEluICctbm9lbmMnIG1vZGUsIHdoaWNoIGlzIG5vdyB0aGUgZGVmYXVsdCwgKEN0cmwtRSBhbHNvIHRvZ2dsZXMKLSAgICAgICAgICAgIHRoaXMgbW9kZSksIHVzZSB0aGlzIHRvIG1ha2UgYSBEaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgVk5DIFNlcnZlcgotICAgICAgICAgICAgd2l0aCBubyBlbmNyeXB0aW9uIHdoYXRzb2V2ZXIuICAoQmUgY2FyZWZ1bCBhYm91dCBwYXNzd29yZHMsIGV0Yy4pCi0KLSAgICAgICAgICAgIFRoZSAtbm9lbmMgbW9kZSBpcyBub3cgdGhlIGRlZmF1bHQgc2luY2UgU1NWTkMgMS4wLjI1LCB1c2UKLSAgICAgICAgICAgIHRoZSAnLWVuYycgY21kbGluZSBvcHRpb24gdG8gZGlzYWJsZSB0aGUgYnV0dG9uLgotCi0KLSAgQXV0b21hdGljYWxseSBGaW5kIFggU2Vzc2lvbjoKLQotICAgICAgICAgICAgV2hlbiB1c2luZyBTU0ggbW9kZSB0byBjb25uZWN0LCB5b3UgY2FuIHNlbGVjdCB0aGlzIG9wdGlvbi4gIEl0Ci0gICAgICAgICAgICBzaW1wbHkgc2V0cyB0aGUgUmVtb3RlIFNTSCBDb21tYW5kIHRvOgotCi0gICAgICAgICAgICAgICAgIFBPUlQ9IHgxMXZuYyAtZmluZCAtbG9jYWxob3N0Ci0KLSAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgdGhhdCB4MTF2bmMgaXMgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgY29tcHV0ZXIKLSAgICAgICAgICAgIGFuZCBpcyBhdmFpbGFibGUgaW4gJFBBVEggZm9yIHRoZSBzc2ggbG9naW4uICBUaGUgY29tbWFuZAotICAgICAgICAgICAgIngxMXZuYyAtZmluZCAtbG9jYWxob3N0IiBjb21tYW5kIGlzIHJ1biBvbiB0aGUgcmVtb3RlCi0gICAgICAgICAgICBtYWNoaW5lLgotCi0gICAgICAgICAgICBUaGUgLWZpbmQgb3B0aW9uIGNhdXNlcyB4MTF2bmMgdG8gdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgWAotICAgICAgICAgICAgc2Vzc2lvbiBvd25lZCBieSB0aGUgdXNlciAoaS5lLiB3aG8geW91IHNzaCBpbiBhcykuICBJZiBpdAotICAgICAgICAgICAgZG9lcyBpdCBhdHRhY2hlcyB0byBpdDsgb3RoZXJ3aXNlIHRoZSB4MTF2bmMgVk5DIHNlcnZlciBleGl0cwotICAgICAgICAgICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgeW91ciBWTkMgVmlld2VyLgotCi0gICAgICAgICAgICBUaGUgUE9SVD0gb3B0aW9uIGp1c3QgbWVhbnMgdG8gbGV0IHgxMXZuYyBwaWNrIGl0cyBvd24KLSAgICAgICAgICAgIFZOQyBwb3J0IGFuZCB0aGVuIGNvbm5lY3QgdG8gd2hhdGV2ZXIgaXQgcGlja2VkLiAgVXNlIFA9Ci0gICAgICAgICAgICBmb3IgbW9yZSBkZWJ1Z2dpbmcgb3V0cHV0LgotCi0gICAgICAgICAgICBUaGUgaWRlYSBmb3IgdGhpcyBtb2RlIGlzIHlvdSBzaW1wbHkgdHlwZSAndXNlcm5hbWVAd29ya3N0YXRpb24nCi0gICAgICAgICAgICBpbiB0aGUgVk5DIEhvc3Q6RGlzcGxheSBib3gsIFNlbGVjdCAnT3B0aW9ucyAtPiBBdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICBGaW5kIFggU2Vzc2lvbicsIGFuZCB0aGVuIGNsaWNrIENvbm5lY3QuICBUaGUgdHN2bmMgbW9kZSBpcwotICAgICAgICAgICAgc2ltaWxhciAoaXQgcnVucyB4MTF2bmMgb24gdGhlIHJlbW90ZSBzaWRlIHdpdGggdGhlIGludGVudAotICAgICAgICAgICAgb2YgYXV0b21hdGljYWxseSBmaW5kaW5nLCBvciBjcmVhdGluZywgeW91ciBkZXNrdG9wKS4KLQotCi0gIFVuaXggVXNlcm5hbWUgJiBQYXNzd29yZDoKLQotICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBVbml4IGFuZCBNYWNPU1ggYW5kIHdoZW4gdXNpbmcKLSAgICAgICAgICAgIHRoZSBTU1ZOQyBlbmhhbmNlZCBUaWdodFZOQyB2aWV3ZXIgKGl0IGhhcyBiZWVuIG1vZGlmaWVkIHRvCi0gICAgICAgICAgICBkbyBVbml4IGxvZ2lucykuICBJdCBzdXBwb3J0cyBhIGxvZ2luIGRpYWxvZyB3aXRoIHNlcnZlcnMKLSAgICAgICAgICAgIGRvaW5nIHNvbWV0aGluZyBsaWtlIHgxMXZuYydzICItdW5peHB3IiBtb2RlLiAgQWZ0ZXIgYW55Ci0gICAgICAgICAgICByZWd1bGFyIFZOQyBhdXRoZW50aWNhdGlvbiB0YWtlcyBwbGFjZSAoVk5DIFBhc3N3b3JkKSwgdGhlbgotICAgICAgICAgICAgaXQgc2VuZHMgdGhlIFVuaXggVXNlcm5hbWUsIGEgUmV0dXJuLCB0aGUgVW5peCBQYXNzd29yZCBhbmQKLSAgICAgICAgICAgIGEgZmluYWwgUmV0dXJuLiAgVGhpcyBzYXZlcyB5b3UgZnJvbSB0eXBpbmcgdGhlbSBpbnRvIHRoZQotICAgICAgICAgICAgImxvZ2luOiIgYW5kICJQYXNzd29yZDoiIHByb21wdHMgaW4gdGhlIHZpZXdlciB3aW5kb3cuCi0KLSAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgeDExdm5jIC11bml4cHcgbG9naW4gbW9kZSBpcyBleHRlcm5hbCB0byB0aGUKLSAgICAgICAgICAgIFZOQyBwcm90b2NvbCwgc28geW91IG5lZWQgdG8gYmUgc3VyZSB0aGUgVk5DIHNlcnZlciBpcyBpbgotICAgICAgICAgICAgdGhpcyBtb2RlIGFuZCB3aWxsIGJlIHdhaXRpbmcgZm9yIHRoZSBkaWFsb2cuICBPdGhlcndpc2UgdGhlCi0gICAgICAgICAgICB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2lsbCBiZSB0eXBlZCBkaXJlY3RseSBpbnRvIHRoZSBkZXNrdG9wCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiB0aGF0IGhhcHBlbnMgdG8gaGF2ZSB0aGUgZm9jdXMhCi0KLSAgICAgICAgICAgIFdoZW4geW91IHNlbGVjdCB0aGlzIG9wdGlvbiAiVW5peCBVc2VybmFtZToiIGFuZCAiVW5peAotICAgICAgICAgICAgUGFzc3dvcmQ6IiBlbnRyeSBib3hlcyBhcHBlYXIgb24gdGhlIG1haW4gcGFuZWwgd2hlcmUgeW91IGNhbgotICAgICAgICAgICAgdHlwZSB0aGVtIGluLiAgeDExdm5jIGhhcyBzZXR0aW5ncyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYWZ0ZXIKLSAgICAgICAgICAgIGEgIjoiIGluIHRoZSBVbml4IHVzZXJuYW1lOyB0aGV5IG1heSBiZSB1c2VkIGhlcmUgYXMgd2VsbC4KLSAgICAgICAgICAgIChGb3IgZXhhbXBsZTogdXNlcm5hbWU6My80LG5jIGZvciBhIHNtYWxsZXIgc2NyZWVuIGFuZCAtbm9jYWNoZSkKLQotICAgICAgICAgICAgSWYgdGhlIFVuaXggVXNlcm5hbWUgaXMgbm90IHNldCB3aGVuIHlvdSBjbGljayBDb25uZWN0LCB0aGVuCi0gICAgICAgICAgICBhbnkgU1NIIHVzZXJuYW1lQGhvc3QgaXMgdXNlZC4gIE90aGVyd2lzZSB0aGUgZW52aXJvbm1lbnQKLSAgICAgICAgICAgIHZhcmlhYmxlICRVU0VSIG9yICRMT0dOQU1FIGFuZCBmaW5hbGx5IHdob2FtaSgxKSBpcyB1c2VkLgotCi0gICAgICAgICAgICBBbHNvIE5vdGUgdGhhdCB0aGUgVW5peCBQYXNzd29yZCBpcyBuZXZlciBzYXZlZCBpbiBhIFZOQwotICAgICAgICAgICAgcHJvZmlsZSAoc28geW91IGhhdmUgdG8gdHlwZSBpdCBlYWNoIHRpbWUpLiAgQWxzbywgdGhlIHJlbW90ZQotICAgICAgICAgICAgeDExdm5jIHNlcnZlciBpcyBpbnN0cnVjdGVkIHRvIG5vdCBlY2hvIHRoZSBVc2VybmFtZSBzdHJpbmcKLSAgICAgICAgICAgIGJ5IHNlbmRpbmcgYW4gaW5pdGlhbCBFc2NhcGUuICBTZXQgdGhlIFNTVk5DX1VOSVhQV19OT0VTQz0xCi0gICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycmlkZSB0aGlzLgotCi0gIFJldmVyc2UgVk5DIENvbm5lY3Rpb246Ci0KLSAgICAgICAgICAgIFJldmVyc2UgKGxpc3RlbmluZykgVk5DIGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZSBhcyB3ZWxsLgotICAgICAgICAgICAgRW5hYmxlIHdpdGggdGhpcyBidXR0b24gIlJldmVyc2UgVk5DIENvbm5lY3Rpb24gKC1MSVNURU4pIgotCi0gICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIFZOQyBTZXJ2ZXIgaW5pdGlhdGVzIHRoZSBjb25uZWN0aW9uIHRvIHlvdXIKLSAgICAgICAgICAgIHdhaXRpbmcgKGkuZS4gbGlzdGVuaW5nKSBTU1ZOQyB2aWV3ZXIuCi0KLSAgICAgICAgICAgIEZvciBTU0wgY29ubmVjdGlvbnMgaW4gdGhlICdWTkMgSG9zdDpEaXNwbGF5JyBlbnRyeSBib3ggcHV0IGluCi0gICAgICAgICAgICB0aGUgbnVtYmVyIChlLmcuICIwIiBvciAiOjAiIG9yICI6MSIsIGV0Yy4pIHRoYXQgY29ycmVzcG9uZHMgdG8KLSAgICAgICAgICAgIHRoZSBMaXN0ZW5pbmcgZGlzcGxheSAoMCAtPiBwb3J0IDU1MDAsIDEgLT4gcG9ydCA1NTAxLCBldGMuKSB5b3UKLSAgICAgICAgICAgIHdhbnQgdG8gdXNlLiAgRm9yIGV4YW1wbGUgeDExdm5jIGNhbiB0aGVuIGJlIHVzZWQgdmlhOgotICAgICAgICAgICAgIngxMXZuYyAuLi4gLXNzbCBTQVZFIC1jb25uZWN0IGhvc3RuYW1lOnBvcnQiIHVzaW5nIHRoZSAicG9ydCIKLSAgICAgICAgICAgIHdpdGggdGhlIG9uZSB5b3UgY2hvc2UuCi0KLSAgICAgICAgICAgIENsaWNraW5nIG9uIHRoZSAnTGlzdGVuJyBidXR0b24gcHV0cyB5b3VyIFNTVk5DIHZpZXdlcgotICAgICAgICAgICAgaW4gYSAibGlzdGVuaW5nIiBzdGF0ZSBvbiB0aGF0IHBvcnQgbnVtYmVyLCB3YWl0aW5nIGZvciBhCi0gICAgICAgICAgICBjb25uZWN0aW9uIGZyb20gdGhlIFZOQyBTZXJ2ZXIuCi0KLSAgICAgICAgICAgIFRoZW4gYSBWTkMgc2VydmVyIHNob3VsZCBlc3RhYmxpc2ggYSByZXZlcnNlIGNvbm5lY3Rpb24gdG8KLSAgICAgICAgICAgIHRoYXQgcG9ydCBvbiB0aGlzIG1hY2hpbmUgKGUuZy4gLWNvbm5lY3QgdGhpcy1tYWNoaW5lOjU1MDAKLSAgICAgICAgICAgIG9yIC1jb25uZWN0IHRoaXMtbWFjaGluZTo1NTAzLCBldGMuKQotCi0gICAgICAgICAgICBTZXJ2ZXIgU1NMIGNlcnRpZmljYXRlcyB3aWxsIGJlIHZlcmlmaWVkLCBob3dldmVyIHlvdSBXSUxMCi0gICAgICAgICAgICBOT1QgYmUgcHJvbXB0ZWQgYWJvdXQgdW5yZWNvZ25pemVkIG9uZXM7IHJhdGhlciwgeW91IE1VU1QKLSAgICAgICAgICAgIHNldCB1cCB0aGUgY29ycmVjdCBTZXJ2ZXIgY2VydGlmaWNhdGUgKGUuZy4gYnkgaW1wb3J0aW5nKS4KLSAgICAgICAgICAgIHByaW9yIHRvIGFueSBjb25uZWN0aW9ucy4KLQotICAgICAgICAgICAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgZmFpbGluZyBpbiBSZXZlcnNlIFZOQyAobGlzdGVuaW5nKSBtb2RlLAotICAgICAgICAgICAgY2hlY2sgdGhlIFNUVU5ORUwgbG9nIG91dHB1dCB0byBzZWUgaWYgU1RVTk5FTCBpcyB1bmFibGUgdG8KLSAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGUgVk5DIFNlcnZlci4gIElmIHlvdSB3YW50IHRvIGFsbG93IGluIGEKLSAgICAgICAgICAgIHJldmVyc2UgY29ubmVjdGlvbiB3aXRoIE5PIFNlcnZlciBhdXRoZW50aWNhdGlvbiwgdW5zZXQgdGhlCi0gICAgICAgICAgICAnVmVyaWZ5IEFsbCBDZXJ0cycgb3B0aW9uLiAKLQotICAgICAgICAgICAgV2hlbiBsaXN0ZW5pbmcgaW4gU1NMLCB5b3Ugd2lsbCBBTFNPIG5lZWQgdG8gc3BlY2lmeSBZT1VSCi0gICAgICAgICAgICBPV04gU1NMIGNlcnQsICJNeUNlcnQiLCBvciBvdGhlcndpc2UgbGV0IHRoZSBHVUkgcHJvbXB0IHlvdQotICAgICAgICAgICAgdG8gY3JlYXRlIGEgImxpc3Rlbi5wZW0iIGFuZCB1c2UgdGhhdC4KLQotICAgICAgICAgICAgVGhlICJsaXN0ZW4ucGVtIiB3aWxsIGJlIHJldXNlZCBpbiBsYXRlciBTU0wgTGlzdGVuaW5nCi0gICAgICAgICAgICBjb25uZWN0aW9ucyB1bmxlc3MgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgb25lIHdpdGggTXlDZXJ0LgotCi0gICAgICAgICAgICBPbiBXaW5kb3dzIG9yIHVzaW5nIGEgM3JkIHBhcnR5IFZOQyBWaWV3ZXIgbXVsdGlwbGUsCi0gICAgICAgICAgICBzaW11bHRhbmVvdXMgcmV2ZXJzZSBjb25uZWN0aW9ucyBhcmUgYWx3YXlzIGVuYWJsZWQuCi0gICAgICAgICAgICBPbiBVbml4L01hY09TWCB3aXRoIHRoZSBwcm92aWRlZCBzc3ZuY3ZpZXdlciB0aGV5IGFyZSBkaXNhYmxlZAotICAgICAgICAgICAgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtOgotICAgICAgICAgICAgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBVbml4IHNzdm5jdmlld2VyIC0+IE11bHRpcGxlIExJU1RFTiBDb25ucy4KLQotICAgICAgICAgICAgRm9yIHJldmVyc2UgY29ubmVjdGlvbnMgaW4gU1NIIG9yIFNTSCArIFNTTCBtb2RlcyBpdCBpcyBhCi0gICAgICAgICAgICBsaXR0bGUgdHJpY2tpZXIuICBUaGUgU1NIIHR1bm5lbCAod2l0aCAtUiB0dW5uZWwpIG11c3QgYmUKLSAgICAgICAgICAgIGVzdGFibGlzaGVkIGFuZCByZW1haW4gdXAgd2FpdGluZyBmb3IgcmV2ZXJzZSBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRpbWUgaXMgInNsZWVwIDE4MDAiLCBpLmUuIDMwIG1pbnMuICBZb3UgY2FuIHB1dAotICAgICAgICAgICAgYSBsb25nZXIgb3Igc2hvcnRlciBzbGVlcCBpbiAiUmVtb3RlIFNTSCBDb21tYW5kIiAocGVyaGFwcwotICAgICAgICAgICAgYWZ0ZXIgeW91ciBjb21tYW5kIHJ1bnM6ICBjbWQ7IHNsZWVwIDM2MDApLgotCi0gICAgICAgICAgICBGb3IgU1NIIHJldmVyc2UgY29ubmVjdGlvbnMgcHV0ICJob3N0bmFtZTpuIiBpbgotICAgICAgICAgICAgJ1ZOQyBIb3N0OkRpc3BsYXknIG9yICJ1c2VyQGhvc3RuYW1lOm4iLiAgVGhlICJuIiB3aWxsIGJlIHRoZQotICAgICAgICAgICAgbGlzdGVuaW5nIGRpc3BsYXkgb24gdGhlICpSRU1PVEUqIHNpZGUuICBTbyB0byBoYXZlIHRoZSByZW1vdGUKLSAgICAgICAgICAgIHgxMXZuYyBjb25uZWN0IHVzZTogIngxMXZuYyAuLi4gLWNvbm5lY3QgbG9jYWxob3N0Om4iIG9yCi0gICAgICAgICAgICAieDExdm5jIC1SIGNvbm5lY3Q6bG9jYWxob3N0Om4iICgtc3NsIHdpbGwgYmUgbmVlZGVkIGZvciBTU0grU1NMCi0gICAgICAgICAgICBtb2RlKS4gIElmIHRoZSAtUiBwb3J0IGNhbm5vdCBiZSBvcGVuZWQgYmVjYXVzZSBpdCBpcyBpbiB1c2UKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgcHJvZ3JhbSB5b3Ugd2lsbCBoYXZlIHRvIGtpbGwgZXZlcnl0aGluZyBhbmQgc3RhcnQKLSAgICAgICAgICAgIG92ZXIgdXNpbmcgYSBkaWZmZXJlbnQgcG9ydC4KLQotICAgICAgICAgICAgSW4gcmV2ZXJzZSBjb25uZWN0aW9ucyBtb2RlIGJlIGNhcmVmdWwgdG8gcHJvdGVjdCB0aGUgbGlzdGVuaW5nCi0gICAgICAgICAgICBWTkMgVmlld2VyIGZyb20gZGlyZWN0IGNvbm5lY3Rpb25zIChuZWl0aGVyIFNTTCBub3IgU1NIKQotICAgICAgICAgICAgY29ubmVjdGluZyBkaXJlY3RseSB0byBpdHMgbGlzdGVuaW5nIHBvcnQgdGhlcmVieSBieXBhc3NpbmcKLSAgICAgICAgICAgIHRoZSB0dW5uZWwuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGEgaG9zdC1sZXZlbCBmaXJld2FsbCB0aGF0Ci0gICAgICAgICAgICBvbmx5IGxldHMgaW4sIHNheSwgcG9ydCA1NTAwICh0aGUgZGVmYXVsdCBvbmUgIjowIiBmb3Igc3R1bm5lbAotICAgICAgICAgICAgdG8gbGlzdGVuIG9uKS4gIE9yIGZvciBTU0ggcmV2ZXJzZSBjb25uZWN0aW9ucyBhbGxvdyBOTyA1NTAwK24KLSAgICAgICAgICAgIHBvcnRzIGluLiAgRm9yIHJldmVyc2UgY29ubmVjdGlvbnMsIHRoZSBVbml4IGVuaGFuY2VkIHRpZ2h0dm5jCi0gICAgICAgICAgICB2aWV3ZXJzIHN1cHBsaWVkIGluIHRoZSBTU1ZOQyBwYWNrYWdlIHdpbGwgb25seSBsaXN0ZW4gb24KLSAgICAgICAgICAgIGxvY2FsaG9zdCBzbyB0aGVzZSBwcmVjYXV0aW9ucyBhcmUgbm90IG5lZWRlZC4KLQotICAgICAgICAgICAgU3BlY2lmeSBhIHNwZWNpZmljIGludGVyZmFjZSwgZS5nLiAxOTIuMTY4LjEuMTowIHRvIGhhdmUgc3R1bm5lbAotICAgICAgICAgICAgb25seSBsaXN0ZW4gb24gdGhhdCBpbnRlcmZhY2UuICBJUHY2IHdvcmtzIHRvbywgZS5nLiA6OjowIG9yIDo6MTowCi0gICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBVTi1lbmNyeXB0ZWQgcmV2ZXJzZSBjb25uZWN0aW9ucyBhcyB3ZWxsICgnTm9uZScpLgotCi0gICAgICAgICAgICBOb3RlIHRoYXQgZm9yIFNTTCBjb25uZWN0aW9ucyB1c2Ugb2YgIlByb3h5L0dhdGV3YXkiIGRvZXMgbm90Ci0gICAgICAgICAgICBtYWtlIHNlbnNlOiB0aGUgcmVtb3RlIHNpZGUgY2Fubm90IGluaXRpYXRlIGl0cyByZXZlcnNlIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIHZpYSB0aGUgUHJveHkuCi0KLSAgICAgICAgICAgIE5vdGUgdGhhdCBmb3IgU1NIIG9yIFNTSCtTU0wgY29ubmVjdGlvbnMgdXNlIG9mICJQcm94eS9HYXRld2F5IgotICAgICAgICAgICAgZG9lcyBub3QgbWFrZSBzZW5zZSAodGhlIHNzaCBjYW5ub3QgZG8gYSAtUiBvbiBhIHJlbW90ZSBob3N0OnBvcnQpLAotICAgICAgICAgICAgdW5sZXNzIGl0IGlzIGEgZG91YmxlIHByb3h5IHdoZXJlIHRoZSAybmQgaG9zdCBpcyB0aGUgbWFjaGluZSB3aXRoCi0gICAgICAgICAgICB0aGUgVk5DIHNlcnZlci4KLQotCi0gIFZpZXcgT25seTogICAgICAgICAgICAgICBIYXZlIFZOQyBWaWV3ZXIgaWdub3JlIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dC4KLSAgCi0gIEZ1bGxzY3JlZW46ICAgICAgICAgICAgICBTdGFydCB0aGUgVk5DIFZpZXdlciBpbiBmdWxsc2NyZWVuIG1vZGUuCi0gIAotICBSYWlzZSBPbiBCZWVwOiAgICAgICAgICAgRGVpY29uaWZ5IHZpZXdlciB3aGVuIGJlbGwgcmluZ3MuCi0gIAotICBVc2UgOGJpdCBjb2xvcjogICAgICAgICAgUmVxdWVzdCBhIHZlcnkgbG93LWNvbG9yIHBpeGVsIGZvcm1hdC4KLSAgCi0gIERvIG5vdCB1c2UgSlBFRzogICAgICAgICBEbyBub3QgdXNlIHRoZSBqcGVnIGFzcGVjdCBvZiB0aGUgdGlnaHQgZW5jb2RpbmcuCi0KLSAgVXNlIFgxMSB2bmN2aWV3ZXIgb24gTWFjT1NYOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gTWFjT1NYIHRyeSB0byB1c2UgdGhlIGJ1bmRsZWQgWDExIHZuY3ZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgQ2hpY2tlbiBvZiB0aGUgVk5DIHZpZXdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBYcXVhcnR6IFggc2VydmVyIG11c3QgYmUgaW5zdGFsbGVkIChpdCBpcyBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBvbiAxMC41LngpIGFuZCB0aGUgRElTUExBWSB2YXJpYWJsZSBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgKHNlZSBUaXAgMTUgb2YgSGVscCB0byBkbyB0aGlzIG1hbnVhbGx5LikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dCBjb3R2bmM9MSBpbiB+Ly5zc3ZuY3JjIHRvIHN3aXRjaCB0aGUgZGVmYXVsdC4KLQotICBLaWxsIFN0dW5uZWwgQXV0b21hdGljYWxseToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFdpbmRvd3MsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGtpbGwgdGhlIFNUVU5ORUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Mgd2hlbiB0aGUgVk5DIFZpZXdlciBleGl0cy4gIFRoaXMgaXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHNldHRpbmcgKG5vdCBwZXItcHJvZmlsZSk7IGl0IGNhbiBiZSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmlhIGVpdGhlciB0aGUgLWtpbGxzdHVubmVsIGNtZGxpbmUgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Iga2lsbHN0dW5uZWw9MSBpbiBzc3ZuY19yYy4gIFRvIGRpc2FibGUgaXQgc3VwcGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtbm9raWxsc3R1bm5lbCBvciBwdXQga2lsbHN0dW5uZWw9MCBpbiBzc3ZuY19yYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzIG9mIDEvMjAwOSB0aGlzIG9wdGlvbiBpcyBvbiBieSBkZWZhdWx0LgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWFpbiBkcmF3YmFjayB0byBoYXZpbmcgU1RVTk5FTCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsZWQgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB2aWV3IGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZS4gIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgY29ubmVjdGluZyB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTCwgZGlzYWJsZSB0aGlzIG9wdGlvbiBhbmQgZG91YmxlIGNsaWNrIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFyayBncmVlbiBTVFVOTkVMIGljb24gaW4gdGhlIHRyYXkgdG8gdmlldyB0aGUgbG9nLgotCi0KLSAgQ29tcHJlc3MgTGV2ZWwvUXVhbGl0eTogIFNldCBUaWdodFZOQyBlbmNvZGluZyBwYXJhbWV0ZXJzLgotCi0KLSAgUHV0dHkgUFc6ICBPbiBXaW5kb3dzIG9ubHk6IHVzZSB0aGUgc3VwcGxpZWQgcGFzc3dvcmQgZm9yIHBsaW5rIFNTSAotICAgICAgICAgICAgIGxvZ2lucy4gIFVubGlrZSB0aGUgb3RoZXIgb3B0aW9ucyB0aGUgdmFsdWUgaXMgbm90IHNhdmVkCi0gICAgICAgICAgICAgd2hlbiAnU2F2ZScgaXMgcGVyZm9ybWVkLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB3aGVuCi0gICAgICAgICAgICAgb3B0aW9ucyB1bmRlciAiQWR2YW5jZWQiIGFyZSBzZXQgdGhhdCByZXF1aXJlIFRXTyBTU0gnczoKLSAgICAgICAgICAgICB5b3UganVzdCBoYXZlIHRvIHR5cGUgdGhlIHBhc3N3b3JkIG9uY2UgaW4gdGhpcyBlbnRyeSBib3guCi0gICAgICAgICAgICAgVGhlIGJ1bmRsZWQgcGFnZWFudC5leGUgYW5kIHB1dHR5Z2VuLmV4ZSBwcm9ncmFtcyBjYW4gYWxzbwotICAgICAgICAgICAgIGJlIHVzZWQgdG8gYXZvaWQgcmVwZWF0ZWRseSBlbnRlcmluZyBwYXNzd29yZHMgKG5vdGUgdGhpcwotICAgICAgICAgICAgIHJlcXVpcmVzIHNldHRpbmcgdXAgYW5kIGRpc3RyaWJ1dGluZyBTU0gga2V5cykuICBTdGFydCB1cAotICAgICAgICAgICAgIHBhZ2VhbnQuZXhlIG9yIHB1dHR5Z2VuLmV4ZSBhbmQgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXJlLgotCi0gICAgICAgICAgICAgTm90ZSwgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIGV4cG9zdXJlIHRvIHNvbWVvbmUgc2VlaW5nIHRoZQotICAgICAgICAgICAgIHB1dHR5IHBhc3N3b3JkIG9uIHRoZSBwbGluayBjb21tYW5kIGxpbmUuCi0KLSAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIFB1dHR5IFBXIGlzIG5vdCBjbGVhcmVkIGlmIHlvdSBsb2FkIGluIGEKLSAgICAgICAgICAgICBuZXcgVk5DIHByb2ZpbGUuCi0KLQotICBQb3J0IFNsb3Q6IE9uIFdpbmRvd3MgcG9ydHMgY2Fubm90IGJlIHNlbGVjdGVkIG9yIGNoZWNrZWQgYXMgZWFzaWx5IGFzCi0gICAgICAgICAgICAgb24gVW5peC4gIFNvIGxpc3RlbmluZyBwb3J0cyBmb3Igc3NoIHJlZGlycywgcHJveHkgdHVubmVsbGluZywKLSAgICAgICAgICAgICBhbmQgZXRjLiB0aGluZ3MgYXJlIHBpY2tlZCB2aWEgZmluZGluZyBhIGZyZWUgInNsb3QiLgotICAgICAgICAgICAgIFRoZSBzbG90cyBydW4gZnJvbSAzMCB0byA5OSBhbmQgYXJlIGxvY2tlZCBiYXNlZCBvbiB0aGUKLSAgICAgICAgICAgICBleGlzdGVuY2Ugb2YgYSBmaWxlIHdpdGggdGhlIHNsb3QgbnVtYmVyIGluIGl0LiAgV2hlbiB0aGUKLSAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGFib3V0IHRvIGJlIG1hZGUsIGEgZnJlZSBzbG90IGlzIGZvdW5kIGFuZCB1c2VkCi0gICAgICAgICAgICAgdG8gd29yayBvdXQgc29tZSBwb3J0cyAoZS5nLiA1OTMwIGZvciB0aGUgbG9jYWwgVk5DIHBvcnQsCi0gICAgICAgICAgICAgZXRjLikgIFRoaXMgd2F5IHNpbXVsdGFuZW91cyBTU1ZOQyBjb25uZWN0aW9ucyBjYW4gdGFrZSBwbGFjZS4KLQotICAgICAgICAgICAgIE9uZSBkcmF3YmFjayBvZiB0aGlzIGlzIHRoYXQgUHV0dHkvUGxpbmsgc3RvcmVzIFNTSCBrZXlzIGJhc2VkCi0gICAgICAgICAgICAgb24gaG9zdG5hbWU6cG9ydCwgYW5kIHdpdGggYSBwcm94eSB0dW5uZWwgdGhlIGhvc3RuYW1lIGlzCi0gICAgICAgICAgICAgImxvY2FsaG9zdCIuICBTbyB0aGUgUHV0dHkga2V5IHN0b3JlIG1heSBoYXZlIGtleSBjb2xsaXNpb25zCi0gICAgICAgICAgICAgZm9yIHRoZSBsb2NhbGhvc3QgdHVubmVscywgYW5kIHBsaW5rIHdpbGwgcHJvbXB0IHlvdSB0bwotICAgICAgICAgICAgIHJlc29sdmUgdGhlIGNvbmZsaWN0IFdSVCBhIGRpZmZlcmVudCBTU0gga2V5IGJlaW5nIGRpc2NvdmVyZWQuCi0KLSAgICAgICAgICAgICBUbyB3b3JrIGFyb3VuZCB0aGlzIHRvIHNvbWUgZGVncmVlIHlvdSBjYW4gc2VsZWN0IGEgdW5pcXVlCi0gICAgICAgICAgICAgUG9ydCBTbG90IChpbiB0aGUgcmFuZ2UgNTAtOTkpIGZvciBhIHNwZWNpZmljIGhvc3QuICBUaGVuIHRoZQotICAgICAgICAgICAgIHNzaCByZWRpciBwb3J0IHRvIHRoaXMgaG9zdCB3aWxsIG5ldmVyIGNoYW5nZSBhbmQgc28gdGhlCi0gICAgICAgICAgICAgUHV0dHkgbG9jYWxob3N0OmZpeGVkLXBvcnQga2V5IHNob3VsZCByZW1haW4gdmFsaWQuCi0KLQotICBNb2RlOiAgICAgIFRvIGNoYW5nZSB0aGUgR1VJIE1vZGUsIHNlbGVjdCBiZXR3ZWVuIHRoZSBmdWxsIFNTVk5DCi0gICAgICAgICAgICAgKGkuZS4gU1NMIGFuZCBTU0gpLCBTU0hWTkMgKGkuZS4gU1NILU9ubHkpLCBhbmQgVGVybWluYWwKLSAgICAgICAgICAgICBTZXJ2aWNlcyBtb2RlIChUU1ZOQzsgdXNlcyB4MTF2bmMpCi0KLSAgICAgICAgICAgICBOb3RlOiBZb3UgY2FuIHB1dCAibW9kZT10c3ZuYyIgb3IgIm1vZGU9c3Nodm5jIiBpbiB5b3VyCi0gICAgICAgICAgICAgfi8uc3N2bmNyYyBmaWxlIChzc3ZuY19yYyBvbiBXaW5kb3dzKSB0byBoYXZlIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgIHN0YXJ0IHVwIGluIHRoZSBnaXZlbiBtb2RlLgotCi0KLSAgU2hvdyAnTm8gRW5jcnlwdGlvbicgT3B0aW9uOgotCi0gICAgICAgICAgICAgTm90ZTogc2luY2UgU1NWTkMgMS4wLjI1IHRoZSAnTm8gRW5jcnlwdGlvbicgT3B0aW9uIGlzCi0gICAgICAgICAgICAgZW5hYmxlZCBieSBkZWZhdWx0LgotCi0gICAgICAgICAgICAgU2VsZWN0IHRoaXMgdG8gZGlzcGxheSBhIGJ1dHRvbiB0aGF0IGRpc2FibGVzIGJvdGggU1NMIGFuZAotICAgICAgICAgICAgIFNTSCBlbmNyeXB0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBDdHJsK0UuICBUaGlzIHB1dHMKLSAgICAgICAgICAgICBhIGNoZWNrIGl0ZW0gIk5vbmUiIG9uIHRoZSBtYWluIHBhbmVsIGFuZCBhbHNvIGEgIk5vCi0gICAgICAgICAgICAgRW5jcnlwdGlvbiIgY2hlY2sgaXRlbSBpbiB0aGUgIk9wdGlvbnMiIHBhbmVsLiAgSWYgeW91Ci0gICAgICAgICAgICAgc2VsZWN0IHRoaXMgaXRlbSwgdGhlcmUgd2lsbCBiZSBOTyBlbmNyeXB0aW9uIGZvciB0aGUgVk5DCi0gICAgICAgICAgICAgY29ubmVjdGlvbiAodXNlIGNhdXRpb3VzbHkpIFNlZSBUaXAgNSkgdW5kZXIgSGVscCBmb3IgbW9yZQotICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IGRpc2FibGluZyBlbmNyeXB0aW9uLgotCi0KLSAgQnV0dG9uczoKLSAgICAgICAgICAgICAgICAKLSAgVXNlIERlZmF1bHRzOiAgICBTZXQgYWxsIG9wdGlvbnMgdG8gdGhlaXIgZGVmYXVsdHMgKGkuZS4gdW5zZXQpLgotCi0gIERlbGV0ZSBQcm9maWxlOiAgRGVsZXRlIGEgc2F2ZWQgcHJvZmlsZS4KLQotICBBZHZhbmNlZDogICAgICAgIEJyaW5nIHVwIHRoZSBBZHZhbmNlZCBPcHRpb25zIGRpYWxvZy4KLQotICBTYXZlIGFuZCBMb2FkOgotCi0gICAgICAgICAgICAgWW91IGNhbiBTYXZlIHRoZSBjdXJyZW50IHNldHRpbmdzIGJ5IGNsaWNraW5nIG9uIFNhdmUKLSAgICAgICAgICAgICAoLnZuYyBmaWxlKSBhbmQgeW91IGNhbiBhbHNvIHJlYWQgaW4gYSBzYXZlZCBvbmUgd2l0aCBMb2FkCi0gICAgICAgICAgICAgUHJvZmlsZS4gIFVzZSB0aGUgQnJvd3NlLi4uIGJ1dHRvbiB0byBzZWxlY3QgdGhlIGZpbGVuYW1lCi0gICAgICAgICAgICAgdmlhIHRoZSBHVUkuCi0KLSAgICAgICAgICAgICBQcmVzc2luZyBDdHJsLUwgb3IgQ2xpY2tpbmcgdGhlIFJpZ2h0IG1vdXNlIGJ1dHRvbiBvbiB0aGUKLSAgICAgICAgICAgICBtYWluIEdVSSB3aWxsIGludm9rZSB0aGUgTG9hZCBkaWFsb2cuCi0KLSAgICAgICAgICAgICBOb3RlOiBPbiBXaW5kb3dzIHNpbmNlIHRoZSBUaWdodFZOQyBWaWV3ZXIgd2lsbCBzYXZlIGl0cyBvd24KLSAgICAgICAgICAgICBzZXR0aW5ncyBpbiB0aGUgUmVnaXN0cnksIHNvbWUgdW5leHBlY3RlZCBiZWhhdmlvciBpcyBwb3NzaWJsZQotICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHZpZXdlciBpcyBuZWFybHkgYWx3YXlzIGRpcmVjdGVkIHRvIHRoZSBWTkMgaG9zdAotICAgICAgICAgICAgICJsb2NhbGhvc3Q6MzAiLiAgRS5nLiBpZiB5b3Ugc3BlY2lmeSAiVmlldyBPbmx5IiBpbiB0aGlzIGd1aQotICAgICAgICAgICAgIG9uY2UgYnV0IG5vdCBuZXh0IHRpbWUgdGhlIFdpbmRvd3MgVk5DIFZpZXdlciBtYXkgcmVtZW1iZXIKLSAgICAgICAgICAgICB0aGUgc2V0dGluZy4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm90IGEgL25vcmVnIG9wdGlvbiBmb3IKLSAgICAgICAgICAgICB0aGUgVmlld2VyLgotfQotCS5vaC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0JamlnZ2xlX3RleHQgLm9oLmYudAotfQotCi1wcm9jIGhlbHBfZmV0Y2hfY2VydCB7e3NlbGZzaWduZWQgMX19IHsKLQl0b3BsZXYgLmZoCi0KLQlzZXQgaCAzNQotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IGggMjgKLQl9Ci0Jc2Nyb2xsX3RleHRfZGlzbWlzcyAuZmguZiA4NSAkaAotCi0JY2VudGVyX3dpbiAuZmgKLQl3bSByZXNpemFibGUgLmZoIDEgMAotCi0Jd20gdGl0bGUgLmZoICJGZXRjaCBDZXJ0aWZpY2F0ZXMgSGVscCIKLQotCXNldCBtc2cgewotICBUaGUgZGlzcGxheWVkIFNTTCBDZXJ0aWZpY2F0ZSBoYXMgYmVlbiByZXRyaWV2ZWQgZnJvbSB0aGUgVk5DIFNlcnZlciB2aWEgdGhlCi0gICJGZXRjaCBDZXJ0IiBhY3Rpb24uCi0gIAotICBJdCBoYXMgbWVyZWx5IGJlZW4gZG93bmxvYWRlZCB2aWEgdGhlIFNTTCBQcm90b2NvbDoKLQotICAgICAgICAgKioqIElUIEhBUyBOT1QgQkVFTiBWRVJJRklFRCBPUiBBVVRIRU5USUNBVEVEIElOIEFOWSBXQVkgKioqCi0gIAotICBTbywgaW4gcHJpbmNpcGxlLCBpdCBjb3VsZCBiZSBhIGZha2UgY2VydGlmaWNhdGUgYmVpbmcgaW5zZXJ0ZWQgYnkgYSBiYWQKLSAgcGVyc29uIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjayBvbiB5b3VyIFNTTCBjb25uZWN0aW9uLgotICAKLSAgSWYsIGhvd2V2ZXIsIGJ5IHNvbWUgZXh0ZXJuYWwgbWVhbnMgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGlzIFNTTAotICBDZXJ0aWZpY2F0ZSB5b3UgY2FuIHVzZSBpdCBmb3IgeW91ciBWTkMgU1NMIGNvbm5lY3Rpb24gdG8gdGhlIFZOQyBzZXJ2ZXIgeW91Ci0gIHdpc2ggdG8gY29ubmVjdCB0by4gIEl0IHdpbGwgcHJvdmlkZSBhbiBhdXRoZW50aWNhdGVkIGFuZCBlbmNyeXB0ZWQgY29ubmVjdGlvbi4KLSAgCi0gIFlvdSBjYW4gdmVyaWZ5IHRoZSBTU0wgQ2VydGlmaWNhdGUgYnkgY29tcGFyaW5nIHRoZSBNRDUgb3IgU0hBMSBoYXNoIHZhbHVlCi0gIHZpYSBhIG1ldGhvZC9jaGFubmVsIHlvdSBrbm93IGlzIHNhZmUgKGkuZS4gbm90IGFsc28gdW5kZXIgY29udHJvbCBvZiBhCi0gIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja2VyKS4gIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSB0ZXh0IGJldHdlZW4gdGhlCi0gIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLSBhbmQgLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSB0YWdzLCBldGMuCi0gIAotICBPbmNlIHlvdSBhcmUgc3VyZSBpdCBpcyBjb3JyZWN0LCB5b3UgY2FuIHByZXNzIHRoZSBTYXZlIGJ1dHRvbiB0byBzYXZlIHRoZQotICBjZXJ0aWZpY2F0ZSB0byBhIGZpbGUgb24gdGhlIGxvY2FsIG1hY2hpbmUgZm9yIHVzZSB3aGVuIHlvdSBjb25uZWN0IHZpYSBWTkMKLSAgdHVubmVsZWQgdGhyb3VnaCBTU0wuICBJZiB5b3Ugc2F2ZSBpdCwgdGhlbiB0aGF0IGZpbGUgd2lsbCBiZSBzZXQgYXMgdGhlCi0gIENlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgVk5DIHNlcnZlciBhZ2FpbnN0LiAgWW91IGNhbiBzZWUgdGhpcyBpbiB0aGUgZGlhbG9nCi0gIHN0YXJ0ZWQgdmlhIHRoZSAiQ2VydHMuLi4iIGJ1dHRvbiBvbiB0aGUgbWFpbiBwYW5lbC4KLSAgCi0gIE5PVEU6IElmIHlvdSB3YW50IHRvIG1ha2UgUGVybWFuZW50IHRoZSBhc3NvY2lhdGlvbiBvZiB0aGUgc2F2ZWQgU1NMIGNlcnRpZmljYXRlCi0gIGZpbGUgd2l0aCB0aGUgVk5DIHNlcnZlciBob3N0LCB5b3UgTVVTVCBzYXZlIHRoZSBzZXR0aW5nIGFzIGEgcHJvZmlsZSBmb3IKLSAgbG9hZGluZyBsYXRlci4gVG8gU2F2ZSBhIFByb2ZpbGUsIGNsaWNrIG9uIE9wdGlvbnMgLT4gU2F2ZSBQcm9maWxlIC4uLiwKLSAgYW5kIGNob29zZSBhIG5hbWUgZm9yIHRoZSBwcm9maWxlIGFuZCB0aGVuIGNsaWNrIG9uIFNhdmUuCi0KLSAgSWYgIlZlcmlmeSBBbGwgQ2VydHMiIGlzIGNoZWNrZWQsIHRoZW4geW91IGFyZSBmb3JjZWQgdG8gY2hlY2sgYWxsIG5ldyBjZXJ0cy4KLSAgSW4gdGhpcyBjYXNlIHRoZSBjZXJ0cyBhcmUgc2F2ZWQgaW4gdGhlICdBY2NlcHRlZCBDZXJ0cycgZGlyZWN0b3J5IGFnYWluc3QKLSAgd2hpY2ggYWxsIHNlcnZlcnMgd2lsbCBiZSBjaGVja2VkIHVubGVzcyAiU2VydmVyQ2VydCIgb3IgIkNlcnRzRGlyIiBoYXMgYmVlbgotICBzZXQgdG8gc29tZXRoaW5nIGVsc2UuCi0KLSAgVG8gcmVsb2FkIHRoZSBwcm9maWxlIGF0IGEgbGF0ZXIgdGltZSwgY2xpY2sgb24gdGhlICJMb2FkIiBidXR0b24gb24gdGhlCi0gIG1haW4gcGFuZWwgYW5kIHRoZW4gc2VsZWN0IHRoZSBuYW1lIGFuZCBjbGljayAiT3BlbiIuICBJZiB5b3Ugd2FudCB0byBiZQotICBzdXJlIHRoZSBjZXJ0aWZpY2F0ZSBpcyBzdGlsbCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvYWRlZCBpbiBob3N0LCBjbGljayBvbgotICAiQ2VydHMuLi4iIGJ1dHRvbiBhbmQgbWFrZSBzdXJlIHRoZSAiU2VydmVyQ2VydCIgcG9pbnRzIHRvIHRoZSBkZXNpcmVkIFNTTAotICBmaWxlbmFtZS4KLQotICBTZWUgdGhlIENlcnRzLi4uIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBBIHNvcGhpc3RpY2F0ZWQgbWV0aG9kIGNhbiBiZSBzZXQKLSAgdXAgdXNpbmcgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkga2V5IHRvIHZlcmlmeSBuZXZlciBiZWZvcmUgc2VlbiBjZXJ0aWZpY2F0ZXMKLSAgKGkuZS4gbGlrZSB5b3VyIHdlYiBicm93c2VyIGRvZXMpLgotfQotCi0Jc2V0IG1zZzIgewotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBOT1RFOiBUaGUgY2VydGlmaWNhdGUgdGhhdCB3YXMganVzdCBkb3dubG9hZGVkIElTIE5PVCBhIFNlbGYtU2lnbmVkCi0gIGNlcnRpZmljYXRlLiAgSXQgd2FzIHNpZ25lZCBieSBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGluc3RlYWQuCi0gIFNvIHNhdmluZyBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGJlY2F1c2UgaXQgY2Fubm90IGJlIHVzZWQgdG8gYXV0aGVudGljYXRlCi0gIGFueXRoaW5nLgotCi0gIFlvdSBuZWVkIHRvIE9idGFpbiBhbmQgU2F2ZSB0aGUgQ0EncyBjZXJ0aWZpY2F0ZSBpbnN0ZWFkLgotCi0gIFRoZSByZW1haW5kZXIgb2YgdGhpcyBIZWxwIGRlc2NyaXB0aW9uIGFwcGxpZXMgT05MWSB0byBTZWxmLVNpZ25lZAotICBjZXJ0aWZpY2F0ZXMgKGkuZS4gTk9UIHRoZSBtb3N0IHJlY2VudGx5IGRvd25sb2FkZWQgb25lLikKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi19Ci0KLQlpZiB7ISRzZWxmc2lnbmVkfSB7Ci0JCXJlZ3N1YiB7ICBJZiwgaG93ZXZlcix9ICRtc2cgIiRtc2cyICBJZiwgaG93ZXZlciwiIG1zZwotCX0KLQotCS5maC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0JamlnZ2xlX3RleHQgLmZoLmYudAotfQotCi1wcm9jIHdpbl9ub2tpbGxfbXNnIHt9IHsKLQlnbG9iYWwgaGVscF9mb250IGlzX3dpbmRvd3Mgc3lzdGVtX2J1dHRvbl9mYWNlCi0JdG9wbGV2IC53Ci0KLQlldmFsIHRleHQgLncudCAtd2lkdGggNjAgLWhlaWdodCAxMSAkaGVscF9mb250Ci0JYnV0dG9uIC53LmQgLXRleHQgIkRpc21pc3MiIC1jb21tYW5kIHtkZXN0cm95IC53fQotCXBhY2sgLncudCAudy5kIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlhcHBseV9iZyAudy50Ci0KLQljZW50ZXJfd2luIC53Ci0Jd20gcmVzaXphYmxlIC53IDEgMAotCi0Jd20gdGl0bGUgLncgIlNTTC9TU0ggVmlld2VyOiBXYXJuaW5nIgotCi0Jc2V0IG1zZyB7Ci0gICAgVGhlIFZOQyBWaWV3ZXIgaGFzIGV4aXRlZC4KLSAgICAKLSAgICBZb3Ugd2lsbCBuZWVkIHRvIHRlcm1pbmF0ZSBTVFVOTkVMIG1hbnVhbGx5LgotICAgIAotICAgIFRvIGRvIHRoaXMgZ28gdG8gdGhlIFN5c3RlbSBUcmF5IGFuZCByaWdodC1jbGljayBvbiB0aGUgU1RVTk5FTAotICAgIGljb24gKGRhcmsgZ3JlZW4pLiAgVGhlbiBjbGljayAiRXhpdCIuCi0gICAgCi0gICAgWW91IGNhbiBhbHNvIGRvdWJsZSBjbGljayBvbiB0aGUgU1RVTk5FTCBpY29uIHRvIHZpZXcgdGhlIGxvZwotICAgIGZvciBlcnJvciBtZXNzYWdlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uCi19Ci0JLncudCBpbnNlcnQgZW5kICRtc2cKLX0KLQotcHJvYyB3aW5fa2lsbF9tc2cge3BpZHN9IHsKLQlnbG9iYWwgdGVybWluYXRlX3BpZHMKLQlnbG9iYWwgaGVscF9mb250Ci0KLQl0b3BsZXYgLncKLQotCWV2YWwgdGV4dCAudy50IC13aWR0aCA3MiAtaGVpZ2h0IDIxICRoZWxwX2ZvbnQKLQlidXR0b24gLncuZCAtdGV4dCAiRGlzbWlzcyIgLWNvbW1hbmQge2Rlc3Ryb3kgLnc7IHNldCB0ZXJtaW5hdGVfcGlkcyBub30KLQlidXR0b24gLncuayAtdGV4dCAiVGVybWluYXRlIFNUVU5ORUwiIC1jb21tYW5kIHtkZXN0cm95IC53OyBzZXQgdGVybWluYXRlX3BpZHMgeWVzfQotCXBhY2sgLncudCAudy5rIC53LmQgLXNpZGUgdG9wIC1maWxsIHgKLQotCWFwcGx5X2JnIC53LnQKLQotCWNlbnRlcl93aW4gLncKLQl3bSByZXNpemFibGUgLncgMSAwCi0KLQl3bSB0aXRsZSAudyAiU1NML1NTSCBWaWV3ZXI6IFdhcm5pbmciCi0KLQlzZXQgbXNnIHsKLSAgICBUaGUgVk5DIFZpZXdlciBoYXMgZXhpdGVkLgotICAgIAotICAgIFdlIGNhbiB0ZXJtaW5hdGUgdGhlIGZvbGxvd2luZyBzdGlsbCBydW5uaW5nIFNUVU5ORUwgcHJvY2Vzcyhlcyk6Ci0gICAgCi19Ci0JYXBwZW5kIG1zZyAiICAgICAgICAgJHBpZHNcbiIKLQotCWFwcGVuZCBtc2cgewotICAgIENsaWNrIG9uIHRoZSAiVGVybWluYXRlIFNUVU5ORUwiIGJ1dHRvbiBiZWxvdyB0byBkbyBzby4KLSAgICAKLSAgICBCZWZvcmUgdGVybWluYXRpbmcgU1RVTk5FTCB5b3UgY2FuIGRvdWJsZSBjbGljayBvbiB0aGUgU1RVTk5FTAotICAgIFRyYXkgaWNvbiB0byB2aWV3IGl0cyBsb2cgZm9yIGVycm9yIG1lc3NhZ2VzIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4KLQotICAgIE5vdGU6IFlvdSBtYXkgU1RJTEwgbmVlZCB0byB0ZXJtaW5hdGUgU1RVTk5FTCBtYW51YWxseSBpZiB3ZSBhcmUKLSAgICB1bmFibGUgdG8ga2lsbCBpdC4gIFRvIGRvIHRoaXMgZ28gdG8gdGhlIFN5c3RlbSBUcmF5IGFuZCByaWdodC1jbGljawotICAgIG9uIHRoZSBTVFVOTkVMIGljb24gKGRhcmsgZ3JlZW4pLiAgVGhlbiBjbGljayAiRXhpdCIuICBZb3Ugd2lsbAotICAgIHByb2JhYmx5IGFsc28gbmVlZCB0byBob3ZlciB0aGUgbW91c2Ugb3ZlciB0aGUgU1RVTk5FTCBUcmF5IEljb24gdG8KLSAgICBtYWtlIHRoZSBUcmF5IG5vdGljZSBTVFVOTkVMIGlzIGdvbmUuLi4KLQotICAgIFRvIGhhdmUgU1RVTk5FTCBhdXRvbWF0aWNhbGx5IGtpbGxlZCB3aGVuIHRoZSBWaWV3ZXIgZXhpdHMgdXNlIHRoZQotICAgIC1raWxsc3R1bm5lbCBjbWRsaW5lIG9wdGlvbiwgb3Igc2V0IGl0IHVuZGVyIE9wdGlvbnMgb3IgaW4gc3N2bmNfcmMuCi19Ci0JLncudCBpbnNlcnQgZW5kICRtc2cKLX0KLQotcHJvYyB3aW45eF9wbGlua19tc2cge2ZpbGV9IHsKLQlnbG9iYWwgaGVscF9mb250IHdpbjl4X3BsaW5rX21zZ19kb25lCi0JdG9wbGV2IC5wbAotCi0JZXZhbCB0ZXh0IC5wbC50IC13aWR0aCA5MCAtaGVpZ2h0IDI2ICRoZWxwX2ZvbnQKLQlidXR0b24gLnBsLmQgLXRleHQgIk9LIiAtY29tbWFuZCB7ZGVzdHJveSAucGw7IHNldCB3aW45eF9wbGlua19tc2dfZG9uZSAxfQotCXdtIHByb3RvY29sIC5wbCBXTV9ERUxFVEVfV0lORE9XIHtjYXRjaCB7ZGVzdHJveSAucGx9OyBzZXQgd2luOXhfcGxpbmtfbXNnX2RvbmUgMX0KLQlwYWNrIC5wbC50IC5wbC5kIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlhcHBseV9iZyAucGwudAotCi0JY2VudGVyX3dpbiAucGwKLQl3bSByZXNpemFibGUgLnBsIDEgMAotCi0Jd20gdGl0bGUgLnBsICJTU0wvU1NIIFZpZXdlcjogV2luOXggV2FybmluZyIKLQotCXNldCBtc2cgewotICAgIER1ZSB0byBsaW1pdGF0aW9ucyBvbiBXaW5kb3cgOXggeW91IHdpbGwgaGF2ZSB0byBtYW51YWxseSBzdGFydCB1cAotICAgIGEgQ09NTUFORC5DT00gdGVybWluYWwgYW5kIHBhc3RlIGluIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotfQotCXNldCBwd2QgW3B3ZF0KLQlyZWdzdWIgLWFsbCB7L30gJHB3ZCAiXFwiIHB3ZAotCWFwcGVuZCBtc2cgIiAgICAgICAgJHB3ZFxcJGZpbGVcbiIgIAotCi0JYXBwZW5kIG1zZyB7Ci0gICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBhIHBvb3IgQ29uc29sZSBhcHBsaWNhdGlvbiBpbXBsZW1lbnRhdGlvbiB0aGF0Ci0gICAgYWZmZWN0cyBtYW55IHRleHQgYmFzZWQgYXBwbGljYXRpb25zLgotICAgIAotICAgIFRvIHN0YXJ0IHVwIGEgQ09NTUFORC5DT00gdGVybWluYWwsIGNsaWNrIG9uIHRoZSBTdGFydCAtPiBSdW4sIGFuZCB0aGVuCi0gICAgdHlwZSBDT01NQU5EIGluIHRoZSBlbnRyeSBib3ggYW5kIGhpdCBSZXR1cm4gb3IgY2xpY2sgT0suCi0KLSAgICBUbyBzZWxlY3QgdGhlIGFib3ZlIGNvbW1hbmQsIGhpZ2hsaWdodCBpdCB3aXRoIHRoZSBtb3VzZSBhbmQgdGhlbiBwcmVzcwotICAgIEN0cmwtQy4gIFRoZW4gZ28gb3ZlciB0byB0aGUgQ09NTUFORC5DT00gd2luZG93IGFuZCBjbGljayBvbiB0aGUKLSAgICBDbGlwYm9hcmQgcGFzdGUgYnV0dG9uLiAgT25jZSBwYXN0ZWQgaW4sIHByZXNzIFJldHVybiB0byBydW4gdGhlIHNjcmlwdC4KLSAgICAKLSAgICBUaGlzIHdpbGwgc3RhcnQgdXAgYSBQTElOSy5FWEUgc3NoIGxvZ2luIHRvIHRoZSByZW1vdGUgY29tcHV0ZXIsCi0gICAgYW5kIGFmdGVyIHlvdSBsb2cgaW4gc3VjY2Vzc2Z1bGx5IGFuZCBpbmRpY2F0ZSAoUVVJQ0tMWSEhKSB0aGF0IHRoZQotICAgIGNvbm5lY3Rpb24gaXMgT0sgYnkgY2xpY2tpbmcgT0sgaW4gdGhpcyBkaWFsb2cuIElmIHRoZSBTU0ggY29ubmVjdGlvbgotICAgIGNhbm5vdCBiZSBhdXRvZGV0ZWN0ZWQgeW91IHdpbGwgQUxTTyBuZWVkIHRvIGNsaWNrICJTdWNjZXNzIiBpbiB0aGUKLSAgICAicGxpbmsgc3NoIHN0YXR1cz8iIGRpYWxvZywgdGhlIFZOQyBWaWV3ZXIgd2lsbCBiZSBzdGFydGVkIGdvaW5nCi0gICAgdGhyb3VnaCB0aGUgU1NIIHR1bm5lbC4KLX0KLQkucGwudCBpbnNlcnQgZW5kICRtc2cKLQl3bSBkZWljb25pZnkgLnBsCi19Ci0KLXByb2MgbWVzZyB7c3RyfSB7Ci0Jc2V0IG1heHggNjAKLQlpZiBbcmVnZXhwIHteSU5GTzogd2l0aG91dCBDZXJ0aWZpY2F0ZX0gJHN0cl0gewotCQlzZXQgbWF4eCA3MgotCX0KLQlpZiB7W3N0cmluZyBsZW5ndGggJHN0cl0gPiAkbWF4eH0gewotCQlzZXQgbGVuZCBbZXhwciAkbWF4eCAtIDFdCi0JCXNldCBzdHIgW3N0cmluZyByYW5nZSAkc3RyIDAgJGxlbmRdCi0JCWFwcGVuZCBzdHIgIiAuLi4iCi0JfQotCS5sIGNvbmZpZ3VyZSAtdGV4dCAkc3RyCi0JdXBkYXRlCi0JZ2xvYmFsIGVudgotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTUVTR19ERUxBWSldIHsKLQkJYWZ0ZXIgJGVudihTU1ZOQ19NRVNHX0RFTEFZKQotCX0KLX0KLQotcHJvYyBnZXRfc3NoX2hwIHtzdHJ9IHsKLQlyZWdzdWIge2NtZD0uKiR9ICRzdHIgIiIgc3RyCi0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlyZWdzdWIge1sgCV0uKiR9ICRzdHIgIiIgc3RyCi0JcmV0dXJuICRzdHIKLX0KLQotcHJvYyBnZXRfc3NoX2NtZCB7c3RyfSB7Ci0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlnbG9iYWwgdHNfb25seQotCWlmIHskdHNfb25seX0gewotCQlyZXR1cm4gW3RzX3gxMXZuY19jbWRdCQotCX0KLQlpZiBbcmVnZXhwIHtjbWQ9KC4qJCl9ICRzdHIgbSBjbWRdIHsKLQkJc2V0IGNtZCBbc3RyaW5nIHRyaW0gJGNtZF0KLQkJcmVnc3ViIC1ub2Nhc2Uge14leDExdm5jciR9ICRjbWQgIngxMXZuYyAtbm9wdyAtZGlzcGxheSBub25lIC1yYXdmYiByYW5kIiBjbWQKLQkJcmVnc3ViIC1ub2Nhc2Uge14leDExdm5jJH0gICRjbWQgIngxMXZuYyAtbm9wdyAtZGlzcGxheSBub25lIC1yYXdmYiBudWxsIiBjbWQKLQkJcmV0dXJuICRjbWQKLQl9IGVsc2UgewotCQlyZXR1cm4gIiIKLQl9Ci19Ci0KLXByb2MgZ2V0X3NzaF9wcm94eSB7c3RyfSB7Ci0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlyZWdzdWIge2NtZD0uKiR9ICRzdHIgIiIgc3RyCi0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlpZiB7ICFbcmVnZXhwIHtbIAldfSAkc3RyXX0gewotCQlyZXR1cm4gIiIKLQl9Ci0JcmVnc3ViIHteLipbIAldWyAJXSp9ICRzdHIgIiIgc3RyCi0JcmV0dXJuICRzdHIKLX0KLQotcHJvYyB0c194MTF2bmNfY21kIHt9IHsKLQlnbG9iYWwgaXNfd2luZG93cwotCWdsb2JhbCB0c194c2VydmVyX3R5cGUgY2hvb3NlX3hzZXJ2ZXIgdHNfZGVza3RvcF90eXBlIGNob29zZV9kZXNrdG9wIHRzX3VuaXhwdyB0c192bmNzaGFyZWQKLQlnbG9iYWwgdHNfZGVza3RvcF9zaXplIHRzX2Rlc2t0b3BfZGVwdGggY2hvb3NlX2Rlc2t0b3BfZ2VvbQotCWdsb2JhbCBjaG9vc2VfZmlsZXhmZXIgdHNfZmlsZXhmZXIKLQlnbG9iYWwgdHNfeDExdm5jX29wdHMgIHRzX3gxMXZuY19wYXRoIHRzX3gxMXZuY19hdXRvcG9ydCBjaG9vc2VfeDExdm5jX29wdHMKLQlnbG9iYWwgdHNfb3RoZXJ2bmMgY2hvb3NlX290aGVydm5jIHRzX3hsb2dpbgotCWdsb2JhbCBjaG9vc2Vfc2xlZXAgZXh0cmFfc2xlZXAKLQotCXNldCBjbWQgIiIKLQlpZiB7JGNob29zZV94MTF2bmNfb3B0cyAmJiAkdHNfeDExdm5jX3BhdGggIT0gIiJ9IHsKLQkJc2V0IGNtZCAkdHNfeDExdm5jX3BhdGgKLQl9IGVsc2UgewotCQlzZXQgY21kICJ4MTF2bmMiCi0JfQotCWlmIHshICRpc193aW5kb3dzfSB7Ci0JCXNldCBjbWQgIlBPUlQ9ICRjbWQiCi0JfSBlbHNlIHsKLQkJc2V0IGNtZCAiUE9SVD0gJGNtZCIKLQl9Ci0KLQlzZXQgdHlwZSAkdHNfeHNlcnZlcl90eXBlOwotCWlmIHshICRjaG9vc2VfeHNlcnZlcn0gewotCQlzZXQgdHlwZSAiIgotCX0KLQlpZiB7JGNob29zZV9vdGhlcnZuYyAmJiAkdHNfb3RoZXJ2bmMgPT0gImZpbmQifSB7Ci0JCXNldCB0eXBlICJYdm5jLnJlZGlyZWN0IgotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBjaG9vc2Vfc2xlZXBdIHsKLQkJaWYgeyEgJGNob29zZV9zbGVlcH0gewotCQkJc2V0IGV4dHJhX3NsZWVwICIiCi0JCX0KLQl9Ci0KLQlpZiB7JGNob29zZV9vdGhlcnZuYyAmJiAkdHNfb3RoZXJ2bmMgIT0gImZpbmQifSB7Ci0JCXNldCBjbWQgIiRjbWQgLXJlZGlyZWN0ICR0c19vdGhlcnZuYyIKLQl9IGVsc2VpZiB7JHR5cGUgPT0gIiJ9IHsKLQkJZ2xvYmFsIHRzX3hzZXJ2ZXJfdHlwZV9kZWYKLQkJaWYgeyR0c194c2VydmVyX3R5cGVfZGVmICE9ICIifSB7Ci0JCQlzZXQgY21kICIkY21kIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLSR0c194c2VydmVyX3R5cGVfZGVmIjsKLQkJfSBlbHNlIHsKLQkJCXNldCBjbWQgIiRjbWQgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYiI7Ci0JCX0KLQl9IGVsc2VpZiB7JHR5cGUgPT0gIlh2ZmIifSB7Ci0JCXNldCBjbWQgIiRjbWQgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYiI7Ci0JfSBlbHNlaWYgeyR0eXBlID09ICJYZHVtbXkifSB7Ci0JCXNldCBjbWQgIiRjbWQgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15IjsKLQl9IGVsc2VpZiB7JHR5cGUgPT0gIlh2bmMifSB7Ci0JCXNldCBjbWQgIiRjbWQgLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZuYyI7Ci0JfSBlbHNlaWYgeyR0eXBlID09ICJYdm5jLnJlZGlyZWN0In0gewotCQlzZXQgY21kICIkY21kIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2bmMucmVkaXJlY3QiOwotCX0KLQotCSMgVEJEOiBDdXBzICsgc291bmQKLQotCXNldCBjbWQgIiRjbWQgLWxvY2FsaG9zdCI7Ci0Jc2V0IGNtZCAiJGNtZCAtbm9wdyI7Ci0JZ2xvYmFsIHRzX25jYWNoZSBjaG9vc2VfbmNhY2hlCi0JaWYgeyRjaG9vc2VfbmNhY2hlICYmIFtyZWdleHAge15bMC05XVswLTldKiR9ICR0c19uY2FjaGVdfSB7Ci0JCXNldCBjbWQgIiRjbWQgLW5jYWNoZSAkdHNfbmNhY2hlIjsKLQl9IGVsc2UgewotCQkjc2V0IGNtZCAiJGNtZCAtbm9uYyI7Ci0JfQotCXNldCBjbWQgIiRjbWQgLXRpbWVvdXQgMTIwIjsKLQlnbG9iYWwgdHNfbXVsdGlzZXNzaW9uIGNob29zZV9tdWx0aXNlc3Npb24KLQlyZWdzdWIgLWFsbCB7W15BLXowLTlfLV19ICR0c19tdWx0aXNlc3Npb24gIiIgdHNfbXVsdGlzZXNzaW9uCi0JaWYgeyRjaG9vc2VfbXVsdGlzZXNzaW9uICYmICR0c19tdWx0aXNlc3Npb24gIT0gIiJ9IHsKLQkJc2V0IGNtZCAiJGNtZCAtZW52IEZEX1RBRz0nJHRzX211bHRpc2Vzc2lvbiciOwotCX0KLQlpZiB7JGNob29zZV9maWxleGZlciAmJiAkdHNfZmlsZXhmZXIgIT0gIiJ9IHsKLQkJaWYgeyR0c19maWxleGZlciA9PSAidGlnaHQifSB7Ci0JCQlzZXQgY21kICIkY21kIC10aWdodGZpbGV4ZmVyIjsKLQkJfSBlbHNlIHsKLQkJCXNldCBjbWQgIiRjbWQgLXVsdHJhZmlsZXhmZXIiOwotCQl9Ci0JfQotCWlmIHskdHNfdW5peHB3fSB7Ci0JCXNldCBjbWQgIiRjbWQgLXVuaXhwdyI7Ci0JfQotCWlmIHskdHNfdm5jc2hhcmVkfSB7Ci0JCXNldCBjbWQgIiRjbWQgLXNoYXJlZCI7Ci0JfQotCXNldCB1ICJ1bmtub3duIgotCWdsb2JhbCBlbnYKLQlpZiB7W2luZm8gZXhpc3RzIGVudihVU0VSKV19IHsKLQkJcmVnc3ViIC1hbGwge1teQS16XX0gJGVudihVU0VSKSAiXyIgdQotCX0KLQlzZXQgY21kICIkY21kIC1vIFwkSE9NRS8udHN2bmMubG9nLiR1IjsJIyBYWFggcGVybXMKLQotCXNldCBzZXNzICJrZGUiCi0JZ2xvYmFsIHRzX2Rlc2t0b3BfdHlwZV9kZWYKLQlpZiB7JHRzX2Rlc2t0b3BfdHlwZV9kZWYgIT0gIiJ9IHsKLQkJc2V0IHNlc3MgJHRzX2Rlc2t0b3BfdHlwZV9kZWYKLQl9Ci0JaWYgeyRjaG9vc2VfZGVza3RvcCAmJiAkdHNfZGVza3RvcF90eXBlICE9ICIifSB7Ci0JCXNldCBzZXNzICR0c19kZXNrdG9wX3R5cGUKLQl9Ci0Jc2V0IGNtZCAiJGNtZCAtZW52IEZEX1NFU1M9JHNlc3MiOwotCi0JaWYgeyRjaG9vc2VfZGVza3RvcF9nZW9tfSB7Ci0JCXNldCBnZW9tICIxMjgweDEwMjQiCi0JCXNldCBkZXAgMTYKLQkJZ2xvYmFsIHRzX2Rlc2t0b3Bfc2l6ZV9kZWYgdHNfZGVza3RvcF9kZXB0aF9kZWYKLQkJaWYgeyR0c19kZXNrdG9wX3NpemVfZGVmICE9ICIifSB7Ci0JCQlzZXQgZ2VvbSAkdHNfZGVza3RvcF9zaXplX2RlZgotCQl9Ci0JCWlmIHskdHNfZGVza3RvcF9kZXB0aF9kZWYgIT0gIiJ9IHsKLQkJCXNldCBkZXAgJHRzX2Rlc2t0b3BfZGVwdGhfZGVmCi0JCX0KLQkJaWYgeyR0c19kZXNrdG9wX3NpemUgIT0gIiJ9IHsKLQkJCWlmIFtyZWdleHAge15bMC05XVswLTldKnhbMC05XVswLTldKiR9ICR0c19kZXNrdG9wX3NpemVdIHsKLQkJCQlzZXQgZ2VvbSAkdHNfZGVza3RvcF9zaXplCi0JCQl9Ci0JCQlpZiB7JHRzX2Rlc2t0b3BfZGVwdGggIT0gIiJ9IHsKLQkJCQlzZXQgZ2VvbSAiJHtnZW9tfXgkdHNfZGVza3RvcF9kZXB0aCIKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IGdlb20gIiR7Z2VvbX14JGRlcCIKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldCBnZW9tICIke2dlb219eCRkZXAiCi0JCX0KLQkJc2V0IGNtZCAiJGNtZCAtZW52IEZEX0dFT009JGdlb20iOwotCX0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJOwotCX0gZWxzZWlmIHskY2hvb3NlX3gxMXZuY19vcHRzICYmICR0c194MTF2bmNfYXV0b3BvcnQgIT0gIiIgJiYgW3JlZ2V4cCB7XlswLTldWzAtOV0qJH0gJHRzX3gxMXZuY19hdXRvcG9ydF19IHsKLQkJc2V0IGNtZCAiJGNtZCAtYXV0b3BvcnQgJHRzX3gxMXZuY19hdXRvcG9ydCI7Ci0JfSBlbHNlIHsKLQkJc2V0IGNtZCAiJGNtZCAtZW52IEFVVE9fUE9SVD01OTUwIjsKLQl9Ci0JaWYgeyRjaG9vc2VfeDExdm5jX29wdHMgJiYgJHRzX3gxMXZuY19vcHRzICE9ICIifSB7Ci0JCXNldCBjbWQgIiRjbWQgJHRzX3gxMXZuY19vcHRzIjsKLQl9Ci0JaWYgeyR0c194bG9naW59IHsKLQkJcmVnc3ViIHtQT1JUPSB9ICRjbWQgIlBPUlQ9IHN1ZG8gIiBjbWQKLQkJcmVnc3ViIHtQPSB9ICRjbWQgIlA9IHN1ZG8gIiBjbWQKLQkJcmVnc3ViIHsgLW8gW14gXVteIF0qfSAkY21kICIiIGNtZAotCQkKLQkJc2V0IGNtZCAiJGNtZCAtZW52IEZEX1hETT0xIjsKLQl9Ci0KLQlyZXR1cm4gJGNtZAotfQotCi1wcm9jIHNldF9kZWZhdWx0cyB7fSB7Ci0JZ2xvYmFsIGRlZnMgZW52Ci0KLQlnbG9iYWwgbXljZXJ0IHN2Y2VydCBjcnRkaXIgY3JsZmlsCi0JZ2xvYmFsIHVzZV9hbHBoYSB1c2VfdHVyYm92bmMgZGlzYWJsZV9waXBlbGluZSB1c2VfZ3JhYiB1c2Vfc3NsIHVzZV9zc2ggdXNlX3NzaHNzbCB1c2Vfdmlld29ubHkgdXNlX2Z1bGxzY3JlZW4gdXNlX2JncjIzMwotCWdsb2JhbCB1c2Vfc2VuZF9jbGlwYm9hcmQgdXNlX3NlbmRfYWx3YXlzCi0JZ2xvYmFsIGRpc2FibGVfYWxsX2VuY3J5cHRpb24KLQlnbG9iYWwgdXNlX25vanBlZyB1c2VfcmFpc2Vfb25fYmVlcCB1c2VfY29tcHJlc3NsZXZlbCB1c2VfcXVhbGl0eSB1c2VfeDExX21hY29zeAotCWdsb2JhbCBjb21wcmVzc2xldmVsX3RleHQgcXVhbGl0eV90ZXh0Ci0JZ2xvYmFsIHVzZV9jdXBzIHVzZV9zb3VuZCB1c2Vfc21ibW50Ci0JZ2xvYmFsIGN1cHNfbG9jYWxfc2VydmVyIGN1cHNfcmVtb3RlX3BvcnQgY3Vwc19tYW5hZ2VfcmNmaWxlIHRzX2N1cHNfbWFuYWdlX3JjZmlsZSBjdXBzX3gxMXZuYwotCWdsb2JhbCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgY3Vwc19yZW1vdGVfc21iX3BvcnQKLQlnbG9iYWwgY2hhbmdlX3ZuY3ZpZXdlciBjaGFuZ2Vfdm5jdmlld2VyX3BhdGggdm5jdmlld2VyX3JlYWx2bmM0Ci0JZ2xvYmFsIGNob29zZV94c2VydmVyIHRzX3hzZXJ2ZXJfdHlwZSBjaG9vc2VfZGVza3RvcCB0c19kZXNrdG9wX3R5cGUgdHNfdW5peHB3IHRzX3ZuY3NoYXJlZAotCWdsb2JhbCBjaG9vc2VfZmlsZXhmZXIgdHNfZmlsZXhmZXIKLQlnbG9iYWwgdHNfeDExdm5jX29wdHMgY2hvb3NlX3gxMXZuY19vcHRzIHRzX3gxMXZuY19wYXRoIHRzX3gxMXZuY19hdXRvcG9ydCB0c194bG9naW4KLQlnbG9iYWwgdHNfb3RoZXJ2bmMgY2hvb3NlX290aGVydm5jIGNob29zZV9zbGVlcAotCWdsb2JhbCBjaG9vc2VfbmNhY2hlIHRzX25jYWNoZSBjaG9vc2VfbXVsdGlzZXNzaW9uIHRzX211bHRpc2Vzc2lvbgotCWdsb2JhbCB0c19tb2RlIHRzX2Rlc2t0b3Bfc2l6ZSB0c19kZXNrdG9wX2RlcHRoIGNob29zZV9kZXNrdG9wX2dlb20KLQlnbG9iYWwgYWRkaXRpb25hbF9wb3J0X3JlZGlycyBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzX2xpc3QKLQlnbG9iYWwgc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uIHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbl90eXBlIHNzaF9sb2NhbF9wcm90ZWN0aW9uIG11bHRpcGxlX2xpc3RlbiBsaXN0ZW5fb25jZSBsaXN0ZW5fYWNjZXB0X3BvcHVwIGxpc3Rlbl9hY2NlcHRfcG9wdXBfc2MKLQlnbG9iYWwgc3NoX2tub3duX2hvc3RzIHNzaF9rbm93bl9ob3N0c19maWxlbmFtZQotCWdsb2JhbCB1bHRyYV9kc20gdWx0cmFfZHNtX3R5cGUgdWx0cmFfZHNtX2ZpbGUgdWx0cmFfZHNtX25vdWx0cmEgdWx0cmFfZHNtX3NhbHQKLQlnbG9iYWwgc291bmRfZGFlbW9uX3JlbW90ZV9jbWQgc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0IHNvdW5kX2RhZW1vbl9raWxsIHNvdW5kX2RhZW1vbl9yZXN0YXJ0Ci0JZ2xvYmFsIHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX2tpbGwgc291bmRfZGFlbW9uX3gxMXZuYyBzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQgCi0JZ2xvYmFsIHNtYl9zdV9tb2RlIHNtYl9tb3VudF9saXN0Ci0JZ2xvYmFsIHVzZV9wb3J0X2tub2NraW5nIHBvcnRfa25vY2tpbmdfbGlzdCBwb3J0X3Nsb3QgcHV0dHlfYXJncwotCWdsb2JhbCB5Y3JvcF9zdHJpbmcgc3N2bmNfc2NhbGUgc3N2bmNfZXNjYXBlIHNid2lkX3N0cmluZyByZmJ2ZXJzaW9uIHNzdm5jX2VuY29kaW5ncyBzc3ZuY19leHRyYV9vcHRzIHVzZV94MTFjdXJzb3IgdXNlX25vYmVsbCB1c2VfcmF3bG9jYWwgdXNlX25vdHR5IHVzZV9wb3B1cGZpeCBleHRyYV9zbGVlcCB1c2VfbGlzdGVuIHVzZV91bml4cHcgdXNlX3gxMXZuY19maW5kIHVuaXhwd191c2VybmFtZQotCWdsb2JhbCBkaXNhYmxlX3NzbF93b3JrYXJvdW5kcyBkaXNhYmxlX3NzbF93b3JrYXJvdW5kc190eXBlCi0JZ2xvYmFsIG5vX3Byb2JlX3ZlbmNyeXB0IHNlcnZlcl92ZW5jcnlwdCBzZXJ2ZXJfYW5vbmRoCi0JZ2xvYmFsIGluY2x1ZGVfbGlzdAotCWdsb2JhbCBzdmNlcnRfZGVmYXVsdCBteWNlcnRfZGVmYXVsdCBjcmxmaWxfZGVmYXVsdAotCi0KLQlzZXQgZGVmcyh1c2Vfdmlld29ubHkpIDAKLQlzZXQgZGVmcyh1c2VfbGlzdGVuKSAwCi0Jc2V0IGRlZnMoZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMpIDAKLQlzZXQgZGVmcyhkaXNhYmxlX3NzbF93b3JrYXJvdW5kc190eXBlKSAibm9uZSIKLQlzZXQgZGVmcyh1c2VfdW5peHB3KSAwCi0Jc2V0IGRlZnModW5peHB3X3VzZXJuYW1lKSAiIgotCXNldCBkZWZzKHVzZV94MTF2bmNfZmluZCkgMAotCXNldCBkZWZzKHVzZV9mdWxsc2NyZWVuKSAwCi0Jc2V0IGRlZnModXNlX3JhaXNlX29uX2JlZXApIDAKLQlzZXQgZGVmcyh1c2VfYmdyMjMzKSAwCi0Jc2V0IGRlZnModXNlX2FscGhhKSAwCi0Jc2V0IGRlZnModXNlX3NlbmRfY2xpcGJvYXJkKSAwCi0Jc2V0IGRlZnModXNlX3NlbmRfYWx3YXlzKSAwCi0Jc2V0IGRlZnModXNlX3R1cmJvdm5jKSAwCi0Jc2V0IGRlZnMoZGlzYWJsZV9waXBlbGluZSkgMAotCXNldCBkZWZzKG5vX3Byb2JlX3ZlbmNyeXB0KSAwCi0Jc2V0IGRlZnMoc2VydmVyX3ZlbmNyeXB0KSAwCi0Jc2V0IGRlZnMoc2VydmVyX2Fub25kaCkgMAotCXNldCBkZWZzKHVzZV9ncmFiKSAwCi0Jc2V0IGRlZnModXNlX25vanBlZykgMAotCXNldCBkZWZzKHVzZV94MTFfbWFjb3N4KSAxCi0JaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19DT1RWTkMpXSB7Ci0JCWlmIHskZW52KFNTVk5DX0NPVFZOQykgIT0gMH0gewotCQkJc2V0IGRlZnModXNlX3gxMV9tYWNvc3gpIDAKLQkJfQotCX0gZWxzZWlmIHshW2luZm8gZXhpc3RzIGVudihESVNQTEFZKV19IHsKLQkJc2V0IGRlZnModXNlX3gxMV9tYWNvc3gpIDAKLQl9Ci0Jc2V0IGRlZnModXNlX2NvbXByZXNzbGV2ZWwpICJkZWZhdWx0IgotCXNldCBkZWZzKHVzZV9xdWFsaXR5KSAiZGVmYXVsdCIKLQlzZXQgZGVmcyhjb21wcmVzc2xldmVsX3RleHQpICJDb21wcmVzcyBMZXZlbDogZGVmYXVsdCIKLQlzZXQgZGVmcyhxdWFsaXR5X3RleHQpICJRdWFsaXR5OiBkZWZhdWx0IgotCi0Jc2V0IGRlZnMobXljZXJ0KSAkbXljZXJ0X2RlZmF1bHQKLQlzZXQgZGVmcyhzdmNlcnQpICRzdmNlcnRfZGVmYXVsdAotCXNldCBkZWZzKGNydGRpcikgIkFDQ0VQVEVEX0NFUlRTIgotCXNldCBkZWZzKGNybGZpbCkgJGNybGZpbF9kZWZhdWx0Ci0KLQlzZXQgZGVmcyh1c2VfY3VwcykgMAotCXNldCBkZWZzKHVzZV9zb3VuZCkgMAotCXNldCBkZWZzKHVzZV9zbWJtbnQpIDAKLQotCXNldCBkZWZzKGNob29zZV94c2VydmVyKSAwIAotCXNldCBkZWZzKHRzX3hzZXJ2ZXJfdHlwZSkgIiIgCi0Jc2V0IGRlZnMoY2hvb3NlX2Rlc2t0b3ApIDAgCi0Jc2V0IGRlZnModHNfZGVza3RvcF90eXBlKSAiIiAKLQlzZXQgZGVmcyh0c19kZXNrdG9wX3NpemUpICIiIAotCXNldCBkZWZzKHRzX2Rlc2t0b3BfZGVwdGgpICIiIAotCXNldCBkZWZzKGNob29zZV9kZXNrdG9wX2dlb20pIDAKLQlzZXQgZGVmcyh0c191bml4cHcpIDAgCi0Jc2V0IGRlZnModHNfdm5jc2hhcmVkKSAwIAotCXNldCBkZWZzKHRzX25jYWNoZSkgOAotCXNldCBkZWZzKGNob29zZV9uY2FjaGUpIDAKLQlzZXQgZGVmcyh0c19tdWx0aXNlc3Npb24pICIiIAotCXNldCBkZWZzKGNob29zZV9tdWx0aXNlc3Npb24pIDAKLQlzZXQgZGVmcyh0c19maWxleGZlcikgIiIgCi0Jc2V0IGRlZnMoY2hvb3NlX2ZpbGV4ZmVyKSAwCi0Jc2V0IGRlZnMoY2hvb3NlX3gxMXZuY19vcHRzKSAwCi0Jc2V0IGRlZnModHNfeDExdm5jX29wdHMpICIiIAotCXNldCBkZWZzKHRzX3gxMXZuY19wYXRoKSAiIiAKLQlzZXQgZGVmcyh0c194MTF2bmNfYXV0b3BvcnQpICIiIAotCXNldCBkZWZzKHRzX290aGVydm5jKSAiIiAKLQlzZXQgZGVmcyhjaG9vc2Vfb3RoZXJ2bmMpIDAKLQlzZXQgZGVmcyh0c194bG9naW4pIDAKLQlzZXQgZGVmcyh0c19tb2RlKSAwCi0KLQlzZXQgZGVmcyhjaGFuZ2Vfdm5jdmlld2VyKSAwIAotCXNldCBkZWZzKGNoYW5nZV92bmN2aWV3ZXJfcGF0aCkgIiIgCi0Jc2V0IGRlZnMoY3Vwc19tYW5hZ2VfcmNmaWxlKSAxCi0Jc2V0IGRlZnModHNfY3Vwc19tYW5hZ2VfcmNmaWxlKSAwCi0Jc2V0IGRlZnMoY3Vwc194MTF2bmMpIDAgCi0Jc2V0IGRlZnModm5jdmlld2VyX3JlYWx2bmM0KSAwCi0KLQlzZXQgZGVmcyhhZGRpdGlvbmFsX3BvcnRfcmVkaXJzKSAwCi0Jc2V0IGRlZnMoYWRkaXRpb25hbF9wb3J0X3JlZGlyc19saXN0KSAiIgotCi0Jc2V0IGRlZnMoc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uKSAxCi0Jc2V0IGRlZnMoc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uX3R5cGUpICJleGVjIgotCXNldCBkZWZzKHNzaF9sb2NhbF9wcm90ZWN0aW9uKSAxCi0Jc2V0IGRlZnMoc3NoX2tub3duX2hvc3RzKSAwCi0Jc2V0IGRlZnMoc3NoX2tub3duX2hvc3RzX2ZpbGVuYW1lKSAiIgotCXNldCBkZWZzKG11bHRpcGxlX2xpc3RlbikgMAotCXNldCBkZWZzKGxpc3Rlbl9vbmNlKSAwCi0Jc2V0IGRlZnMobGlzdGVuX2FjY2VwdF9wb3B1cCkgMAotCXNldCBkZWZzKGxpc3Rlbl9hY2NlcHRfcG9wdXBfc2MpIDAKLQotCXNldCBkZWZzKHVsdHJhX2RzbSkgMAotCXNldCBkZWZzKHVsdHJhX2RzbV9maWxlKSAiIgotCXNldCBkZWZzKHVsdHJhX2RzbV90eXBlKSAiZ3Vlc3MiCi0Jc2V0IGRlZnModWx0cmFfZHNtX25vdWx0cmEpIDAKLQlzZXQgZGVmcyh1bHRyYV9kc21fc2FsdCkgIiIKLQotCXNldCBkZWZzKHBvcnRfc2xvdCkgIiIKLQlzZXQgZGVmcyhwdXR0eV9hcmdzKSAiIgotCi0Jc2V0IGRlZnMoY3Vwc19sb2NhbF9zZXJ2ZXIpICIiCi0Jc2V0IGRlZnMoY3Vwc19yZW1vdGVfcG9ydCkgIiIKLQlzZXQgZGVmcyhjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIpICIiCi0Jc2V0IGRlZnMoY3Vwc19yZW1vdGVfc21iX3BvcnQpICIiCi0KLQlzZXQgZGVmcyhzbWJfc3VfbW9kZSkgInN1ZG8iCi0Jc2V0IGRlZnMoc21iX21vdW50X2xpc3QpICIiCi0KLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fcmVtb3RlX2NtZCkgIiIKLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQpICIiCi0Jc2V0IGRlZnMoc291bmRfZGFlbW9uX2tpbGwpIDAKLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fcmVzdGFydCkgMAotCi0Jc2V0IGRlZnMoc291bmRfZGFlbW9uX2xvY2FsX2NtZCkgIiIKLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fbG9jYWxfcG9ydCkgIiIKLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQpIDAKLQlzZXQgZGVmcyhzb3VuZF9kYWVtb25fbG9jYWxfa2lsbCkgMAotCXNldCBkZWZzKHNvdW5kX2RhZW1vbl94MTF2bmMpIDAKLQotCXNldCBkZWZzKHljcm9wX3N0cmluZykgIiIKLQlzZXQgZGVmcyhzc3ZuY19zY2FsZSkgIiIKLQlzZXQgZGVmcyhzc3ZuY19lc2NhcGUpICIiCi0Jc2V0IGRlZnMoc2J3aWRfc3RyaW5nKSAiIgotCXNldCBkZWZzKHJmYnZlcnNpb24pICIiCi0Jc2V0IGRlZnMoc3N2bmNfZW5jb2RpbmdzKSAiIgotCXNldCBkZWZzKHNzdm5jX2V4dHJhX29wdHMpICIiCi0Jc2V0IGRlZnModXNlX3gxMWN1cnNvcikgMAotCXNldCBkZWZzKHVzZV9ub2JlbGwpIDAKLQlzZXQgZGVmcyh1c2VfcmF3bG9jYWwpIDAKLQlzZXQgZGVmcyh1c2Vfbm90dHkpIDAKLQlzZXQgZGVmcyh1c2VfcG9wdXBmaXgpIDAKLQlzZXQgZGVmcyhleHRyYV9zbGVlcCkgIiIKLQlzZXQgZGVmcyh1c2VfcG9ydF9rbm9ja2luZykgMAotCXNldCBkZWZzKHBvcnRfa25vY2tpbmdfbGlzdCkgIiIKLQotCXNldCBkZWZzKGluY2x1ZGVfbGlzdCkgIiIKLQotCXNldCBkaXIgW2dldF9wcm9maWxlc19kaXJdCi0Jc2V0IGRlZmZpbGUgIiIKLQlpZiBbZmlsZSBleGlzdHMgIiRkaXIvZGVmYXVsdHMiXSB7Ci0JCXNldCBkZWZmaWxlICIkZGlyL2RlZmF1bHRzIgotCX0gZWxzZWlmIFtmaWxlIGV4aXN0cyAiJGRpci9kZWZhdWx0cy52bmMiXSB7Ci0JCXNldCBkZWZmaWxlICIkZGlyL2RlZmF1bHRzLnZuYyIKLQl9Ci0JaWYgeyRkZWZmaWxlICE9ICIifSB7Ci0JCXNldCBmaCAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICRkZWZmaWxlICJyIl19Ci0JCWlmIHskZmggIT0gIiJ9IHsKLQkJCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkJCQlpZiBbcmVnZXhwIHteI30gJGxpbmVdIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJaWYgW3JlZ2V4cCB7XihbXj1dKik9KC4qKSR9ICRsaW5lIG0gdmFyIHZhbF0gewotCQkJCQlpZiB7JHZhciA9PSAiZGlzcCJ9IHsKLQkJCQkJCWNvbnRpbnVlCi0JCQkJCX0KLQkJCQkJaWYgW2luZm8gZXhpc3RzIGRlZnMoJHZhcildIHsKLQkJCQkJCXNldCBwY3QgMAotCQkJCQkJaWYgeyR2YXIgPT0gInNtYl9tb3VudF9saXN0In0gewotCQkJCQkJCXNldCBwY3QgMQotCQkJCQkJfQotCQkJCQkJaWYgeyR2YXIgPT0gInBvcnRfa25vY2tpbmdfbGlzdCJ9IHsKLQkJCQkJCQlzZXQgcGN0IDEKLQkJCQkJCX0KLQkJCQkJCWlmIHskcGN0fSB7Ci0JCQkJCQkJcmVnc3ViIC1hbGwgeyUlJX0gJHZhbCAiXG4iIHZhbAotCQkJCQkJfQotCQkJCQkJc2V0IGRlZnMoJHZhcikgJHZhbAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2xvc2UgJGZoCi0JCX0KLQl9Ci0KLQlnbG9iYWwgc3NoX29ubHkgdHNfb25seQotCWlmIHskc3NoX29ubHkgfHwgJHRzX29ubHl9IHsKLQkJc2V0IGRlZnModXNlX3NzbCkgMAotCQlzZXQgZGVmcyh1c2Vfc3NoKSAxCi0JCXNldCBkZWZzKHVzZV9zc2hzc2wpIDAKLQl9IGVsc2UgewotCQlzZXQgZGVmcyh1c2Vfc3NsKSAxCi0JCXNldCBkZWZzKHVzZV9zc2gpIDAKLQkJc2V0IGRlZnModXNlX3NzaHNzbCkgMAotCX0KLQlzZXQgZGVmcyhkaXNhYmxlX2FsbF9lbmNyeXB0aW9uKSAwCi0KLQlmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgZGVmc10gewotCQlzZXQgJHZhciAkZGVmcygkdmFyKQkKLQl9Ci0KLQlnbG9iYWwgdm5jYXV0aF9wYXNzd2QgdW5peHB3X3Bhc3N3ZAotCXNldCB2bmNhdXRoX3Bhc3N3ZCAiIgotCXNldCB1bml4cHdfcGFzc3dkICIiCi0KLQlpZiB7JHNzaF9vbmx5IHx8ICR0c19vbmx5fSB7Ci0JCXNzbF9zc2hfYWRqdXN0IHNzaAotCX0gZWxzZSB7Ci0JCXNzbF9zc2hfYWRqdXN0IHNzbAotCX0KLQlsaXN0ZW5fYWRqdXN0Ci0JdW5peHB3X2FkanVzdAotCi0JZ2xvYmFsIGxhc3RfbG9hZAotCXNldCBsYXN0X2xvYWQgIiIKLX0KLQotcHJvYyB3aW5kb3dzX2xpc3RlbmluZ19tZXNzYWdlIHtufSB7Ci0JZ2xvYmFsIGRpZF9saXN0ZW5pbmdfbWVzc2FnZQotCi0JZ2xvYmFsIGV4dHJhX2NtZAotCXNldCBleHRyYV9jbWQgIiIKLQlzZXQgY21kIFtnZXRfY21kICRuXQotCQotCWlmIHskZGlkX2xpc3RlbmluZ19tZXNzYWdlIDwgMn0gewotCQlpbmNyIGRpZF9saXN0ZW5pbmdfbWVzc2FnZQotCQlnbG9iYWwgbGlzdGVuaW5nX25hbWUKLQotCQlzZXQgbG4gJGxpc3RlbmluZ19uYW1lCi0JCWlmIHskbG4gPT0gIiJ9IHsKLQkJCXNldCBsbiAidGhpcy1jb21wdXRlcjokbiIKLQkJfQotCi0JCXNldCBtc2cgIgotICAgQWJvdXQgdG8gc3RhcnQgdGhlIExpc3RlbmluZyBWTkMgVmlld2VyIChSZXZlcnNlIENvbm5lY3Rpb24pLgotCi0gICBUaGUgVk5DIFZpZXdlciBjb21tYW5kIHRvIGJlIHJ1biBpczoKLQotICAgICAgICRjbWQKLQotICAgQWZ0ZXIgdGhlIFZpZXdlciBzdGFydHMgbGlzdGVuaW5nLCB0aGUgVk5DIHNlcnZlciBzaG91bGQKLSAgIHRoZW4gUmV2ZXJzZSBjb25uZWN0IHRvOgotCi0gICAgICAgJGxuCi0KLSAgIFdoZW4gdGhlIFZOQyBDb25uZWN0aW9uIGhhcyBlbmRlZCAqKllPVSBNVVNUIE1BTlVBTExZIFNUT1AqKgotICAgdGhlIExpc3RlbmluZyBWTkMgVmlld2VyLgotCi0gICBUbyBzdG9wIHRoZSBMaXN0ZW5pbmcgVmlld2VyOiByaWdodCBjbGljayBvbiB0aGUgVk5DIEljb24gaW4KLSAgIHRoZSB0cmF5IGFuZCBzZWxlY3QgJ0Nsb3NlIGxpc3RlbmluZyBkYWVtb24nIChvciBzaW1pbGFyKS4KLQotICAgT05MWSBBRlRFUiBUSEFUIHdpbGwgeW91IHJldHVybiB0byB0aGUgU1NWTkMgR1VJLgotCi0gICBDbGljayBPSyBub3cgdG8gc3RhcnQgdGhlIExpc3RlbmluZyBWTkMgVmlld2VyLiRleHRyYV9jbWQKLSIKLQkJZ2xvYmFsIHVzZV9zc2ggdXNlX3NzaHNzbAotCQlpZiB7JHVzZV9zc2ggfHwgJHVzZV9zc2hzc2x9IHsKLQkJCXNldCBtc2cgIiR7bXNnfSAgIE5PVEU6IFlvdSB3aWxsIHByb2JhYmx5IGFsc28gbmVlZCB0byBraWxsIHRoZSBTU0ggaW4gdGhlXG4gICB0ZXJtaW5hbCB2aWEgQ3RybC1DIiAKLQkJfQotCi0JCWdsb2JhbCBoZWxwX2ZvbnQgaXNfd2luZG93cyBzeXN0ZW1fYnV0dG9uX2ZhY2UKLQkJdG9wbGV2IC53bGwKLQkJZ2xvYmFsIHdsbF9kb25lCi0KLQkJc2V0IHdsbF9kb25lIDAKLQotCQlldmFsIHRleHQgLndsbC50IC13aWR0aCA2NCAtaGVpZ2h0IDIyICRoZWxwX2ZvbnQKLQkJYnV0dG9uIC53bGwuZCAtdGV4dCAiT0siIC1jb21tYW5kIHtkZXN0cm95IC53bGw7IHNldCB3bGxfZG9uZSAxfQotCQlwYWNrIC53bGwudCAud2xsLmQgLXNpZGUgdG9wIC1maWxsIHgKLQotCQlhcHBseV9iZyAud2xsLnQKLQotCQljZW50ZXJfd2luIC53bGwKLQkJd20gcmVzaXphYmxlIC53bGwgMSAwCi0KLQkJd20gdGl0bGUgLndsbCAiU1NML1NTSCBWaWV3ZXI6IExpc3RlbmluZyBWTkMgSW5mbyIKLQotCQkud2xsLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQkJdndhaXQgd2xsX2RvbmUKLQl9Ci19Ci0KLXByb2MgZ2V0X2NtZCB7bn0gewotCWdsb2JhbCB1c2VfYWxwaGEgdXNlX2dyYWIgdXNlX3gxMWN1cnNvciB1c2Vfbm9iZWxsIHVzZV9zc2gKLQlnbG9iYWwgdXNlX3NzaHNzbCB1c2Vfdmlld29ubHkgdXNlX2Z1bGxzY3JlZW4gdXNlX2JncjIzMwotCWdsb2JhbCB1c2Vfbm9qcGVnIHVzZV9yYWlzZV9vbl9iZWVwIHVzZV9jb21wcmVzc2xldmVsIHVzZV9xdWFsaXR5Ci0JZ2xvYmFsIHVzZV9zZW5kX2NsaXBib2FyZCB1c2Vfc2VuZF9hbHdheXMgY2hhbmdlX3ZuY3ZpZXdlcgotCWdsb2JhbCBjaGFuZ2Vfdm5jdmlld2VyX3BhdGggdm5jdmlld2VyX3JlYWx2bmM0IHVzZV9saXN0ZW4KLQlnbG9iYWwgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfdHlwZSBlbnYKLQotCXNldCBjbWQgInZuY3ZpZXdlciIKLQlpZiB7JGNoYW5nZV92bmN2aWV3ZXIgJiYgJGNoYW5nZV92bmN2aWV3ZXJfcGF0aCAhPSAiIn0gewotCQlzZXQgY21kIFtzdHJpbmcgdHJpbSAkY2hhbmdlX3ZuY3ZpZXdlcl9wYXRoXQotCQlyZWdzdWIgLWFsbCB7XFx9ICRjbWQgey99IGNtZAotCQlpZiB7W3JlZ2V4cCB7WyBcdF19ICRjbWRdfSB7Ci0JCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtcLmV4ZSR9ICRjbWRdfSB7Ci0JCQkJaWYgeyEgW3JlZ2V4cCB7WyInXX0gJGNtZF19IHsgIyIKLQkJCQkJIyBobW1tLCBub3QgZm9sbG93aW5nIGluc3RydWN0aW9ucywgYXJlIHRoZXk/Ci0JCQkJCXNldCBjbWQgIlwiJGNtZFwiIgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiB7JHVzZV92aWV3b25seX0gewotCQlpZiB7JHZuY3ZpZXdlcl9yZWFsdm5jNH0gewotCQkJYXBwZW5kIGNtZCAiIHZpZXdvbmx5PTEiCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgY21kICIgL3ZpZXdvbmx5IgotCQl9Ci0JfQotCWlmIHskdXNlX2Z1bGxzY3JlZW59IHsKLQkJaWYgeyR2bmN2aWV3ZXJfcmVhbHZuYzR9IHsKLQkJCWFwcGVuZCBjbWQgIiBmdWxsc2NyZWVuPTEiCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgY21kICIgL2Z1bGxzY3JlZW4iCi0JCX0KLQl9Ci0JaWYgeyR1c2VfYmdyMjMzfSB7Ci0JCWlmIHskdm5jdmlld2VyX3JlYWx2bmM0fSB7Ci0JCQlhcHBlbmQgY21kICIgbG93Y29sb3VybGV2ZWw9MSIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBjbWQgIiAvOGJpdCIKLQkJfQotCX0KLQlpZiB7JHVzZV9ub2pwZWd9IHsKLQkJaWYgeyEgJHZuY3ZpZXdlcl9yZWFsdm5jNH0gewotCQkJYXBwZW5kIGNtZCAiIC9ub2pwZWciCi0JCX0KLQl9Ci0JaWYgeyR1c2VfcmFpc2Vfb25fYmVlcH0gewotCQlpZiB7ISAkdm5jdmlld2VyX3JlYWx2bmM0fSB7Ci0JCQlhcHBlbmQgY21kICIgL2JlbGxkZWljb25pZnkiCi0JCX0KLQl9Ci0JaWYgeyR1c2VfY29tcHJlc3NsZXZlbCAhPSAiIiAmJiAkdXNlX2NvbXByZXNzbGV2ZWwgIT0gImRlZmF1bHQifSB7Ci0JCWlmIHskdm5jdmlld2VyX3JlYWx2bmM0fSB7Ci0JCQlhcHBlbmQgY21kICIgemxpYmxldmVsPSR1c2VfY29tcHJlc3NsZXZlbCIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBjbWQgIiAvY29tcHJlc3NsZXZlbCAkdXNlX2NvbXByZXNzbGV2ZWwiCi0JCX0KLQl9Ci0JaWYgeyR1c2VfcXVhbGl0eSAhPSAiIiAmJiAkdXNlX3F1YWxpdHkgIT0gImRlZmF1bHQifSB7Ci0JCWlmIHshICR2bmN2aWV3ZXJfcmVhbHZuYzR9IHsKLQkJCWFwcGVuZCBjbWQgIiAvcXVhbGl0eSAkdXNlX3F1YWxpdHkiCi0JCX0KLQl9Ci0KLQlnbG9iYWwgZXh0cmFfY21kCi0Jc2V0IGV4dHJhX2NtZCAiIgotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlpZiB7JHZuY3ZpZXdlcl9yZWFsdm5jNH0gewotCQkJYXBwZW5kIGNtZCAiIGxpc3Rlbj0xIgotCQl9IGVsc2UgewotCQkJYXBwZW5kIGNtZCAiIC9saXN0ZW4iCi0JCX0KLQkJc2V0IG5uICRuCi0JCWlmIHskbm4gPCAxMDB9IHsKLQkJCXNldCBubiBbZXhwciAiJG5uICsgNTUwMCJdIAotCQl9Ci0JCWdsb2JhbCBkaXJlY3RfY29ubmVjdF9yZXZlcnNlX2hvc3Rfb3JpZyBpc193aW45eAotCQlpZiB7IVtpbmZvIGV4aXN0cyBkaXJlY3RfY29ubmVjdF9yZXZlcnNlX2hvc3Rfb3JpZ119IHsKLQkJCXNldCBkaXJlY3RfY29ubmVjdF9yZXZlcnNlX2hvc3Rfb3JpZyAiIgotCQl9Ci0JCWlmIHskZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcgIT0gIiIgJiYgISRpc193aW45eH0gewotCQkJc2V0IG5uMiBbZXhwciAkbm4gKyAxNV0KLQkJCXNldCBoMCAkZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcKLQkJCWdsb2JhbCB3aW5fbG9jYWxob3N0Ci0JCQlzZXQgZXh0cmFfY21kICJcblxucmVsYXk2LmV4ZSAkbm4gJHdpbl9sb2NhbGhvc3QgJG5uMiAvYjokaDAiCi0JCQlzZXQgbm4gJG5uMgotCQl9Ci0KLQkJYXBwZW5kIGNtZCAiICRubiIKLQotCX0gZWxzZSB7Ci0JCWlmIFtyZWdleHAge15bMC05XVswLTldKiR9ICRuXSB7Ci0JCQlnbG9iYWwgd2luX2xvY2FsaG9zdAotCQkJYXBwZW5kIGNtZCAiICR3aW5fbG9jYWxob3N0OiRuIgotCQl9IGVsc2UgewotCQkJYXBwZW5kIGNtZCAiICRuIgotCQl9Ci0JfQotCXJldHVybiAkY21kCi19Ci0KLXByb2MgZG9fdmlld2VyX3dpbmRvd3Mge259IHsKLQlnbG9iYWwgdXNlX2xpc3RlbiBlbnYKLQotCXNldCBjbWQgW2dldF9jbWQgJG5dCi0KLQlzZXQgaXB2Nl9waWQyICIiCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXNldCBubiAkbgotCQlpZiB7JG5uIDwgMTAwfSB7Ci0JCQlzZXQgbm4gW2V4cHIgIiRubiArIDU1MDAiXSAKLQkJfQotCQlnbG9iYWwgZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcgaXNfd2luOXgKLQkJaWYgeyFbaW5mbyBleGlzdHMgZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWddfSB7Ci0JCQlzZXQgZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcgIiIKLQkJfQotCQlpZiB7JGRpcmVjdF9jb25uZWN0X3JldmVyc2VfaG9zdF9vcmlnICE9ICIiICYmICEkaXNfd2luOXh9IHsKLQkJCXNldCBubjIgW2V4cHIgJG5uICsgMTVdCi0JCQlzZXQgaDAgJGRpcmVjdF9jb25uZWN0X3JldmVyc2VfaG9zdF9vcmlnCi0JCQlnbG9iYWwgd2luX2xvY2FsaG9zdAotCQkJc2V0IGlwdjZfcGlkMiBbZXhlYyByZWxheTYuZXhlICRubiAkd2luX2xvY2FsaG9zdCAkbm4yIC9iOiRoMCAmXQotCQkJc2V0IG5uICRubjIKLQkJfQotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfRVhUUkFfU0xFRVApXSB7Ci0JCXNldCB0ICRlbnYoU1NWTkNfRVhUUkFfU0xFRVApCi0JCW1lc2cgInNsZWVwaW5nIGFuIGV4dHJhICR0IHNlY29uZHMuLi4iCi0JCXNldCB0IFtleHByICIkdCAqIDEwMDAiXQotCQlhZnRlciAkdAotCX0KLQlnbG9iYWwgZXh0cmFfc2xlZXAKLQlpZiB7JGV4dHJhX3NsZWVwICE9ICIifSB7Ci0JCXNldCB0ICRleHRyYV9zbGVlcAotCQltZXNnICJzbGVlcGluZyBhbiBleHRyYSAkdCBzZWNvbmRzLi4uIgotCQlzZXQgdCBbZXhwciAiJHQgKiAxMDAwIl0KLQkJYWZ0ZXIgJHQKLQl9Ci0JCi0JbWVzZyAkY21kCi0Jc2V0IGVtZXNzICIiCi0Jc2V0IHJjIFtjYXRjaCB7ZXZhbCBleGVjICRjbWR9IGVtZXNzXQotCi0JaWYgeyRpcHY2X3BpZDIgIT0gIiJ9IHsKLQkJd2lua2lsbCAkaXB2Nl9waWQyCi0JfQotCi0JaWYgeyRyYyAhPSAwfSB7Ci0JCXJhaXNlIC4KLQkJdGtfbWVzc2FnZUJveCAtdHlwZSBvayAtaWNvbiBlcnJvciAtbWVzc2FnZSAkZW1lc3MgLXRpdGxlICJFcnJvcjogJGNtZCIKLQl9Ci19Ci0KLXByb2MgZ2V0X25ldHN0YXQge30gewotCXNldCBucyAiIgotCWNhdGNoIHtzZXQgbnMgW2V4ZWMgbmV0c3RhdCAtYW5dfQotCXJldHVybiAkbnMKLX0KLQotcHJvYyBnZXRfaXBjb25maWcge30gewotCWdsb2JhbCBpc193aW45eAotCXNldCBpcCAiIgotCWlmIHshICRpc193aW45eH0gewotCQljYXRjaCB7c2V0IGlwIFtleGVjIGlwY29uZmlnXX0KLQkJcmV0dXJuICRpcAotCX0KLQotCXNldCBmaWxlICJpcCIKLQlhcHBlbmQgZmlsZSBbcGlkXQotCWFwcGVuZCBmaWxlICIudHh0IgotCi0JIyBWRgotCWNhdGNoIHtbZXhlYyB3aW5pcGNmZyAvQmF0Y2ggJGZpbGVdfQotCi0JaWYgW2ZpbGUgZXhpc3RzICRmaWxlXSB7Ci0JCXNldCBmaCBbb3BlbiAkZmlsZSAiciJdCi0JCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJYXBwZW5kIGlwICIkbGluZVxuIgotCQl9Ci0JCWNsb3NlICRmaAotCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZpbGV9Ci0JfQotCXJldHVybiAkaXAKLX0KLQotcHJvYyByZWFkX2ZpbGUge2ZpbGV9IHsKLQlzZXQgc3RyICIiCi0JaWYgW2ZpbGUgZXhpc3RzICRmaWxlXSB7Ci0JCXNldCBmaCAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICRmaWxlICJyIl19Ci0JCWlmIHskZmggIT0gIiJ9IHsKLQkJCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJCWFwcGVuZCBzdHIgIiRsaW5lXG4iCi0JCQl9Ci0JCQljbG9zZSAkZmgKLQkJfQotCX0KLQlyZXR1cm4gJHN0cgotfQotCi1wcm9jIGd1ZXNzX25hdF9pcCB7fSB7Ci0JZ2xvYmFsIHNhdmVfbmF0IGxhc3Rfc2F2ZV9uYXQKLQlzZXQgcyAiIgotCi0JaWYgeyEgW2luZm8gZXhpc3RzIHNhdmVfbmF0XX0gewotCQlzZXQgc2F2ZV9uYXQgIiIKLQkJc2V0IGxhc3Rfc2F2ZV9uYXQgMAotCX0KLQlpZiB7JHNhdmVfbmF0ICE9ICIifSB7Ci0JCXNldCBub3cgW2Nsb2NrIHNlY29uZHNdCi0JCWlmIHskbm93IDwgJGxhc3Rfc2F2ZV9uYXQgKyA0NX0gewotCQkJcmV0dXJuICRzYXZlX25hdAotCQl9Ci0JfQotCXNldCBzICIiCi0JY2F0Y2gge3NldCBzIFtzb2NrZXQgInd3dy53aGF0aXNteWlwLmNvbSIgODBdfQotCXNldCBpcCAidW5rbm93biIKLQlpZiB7JHMgIT0gIiJ9IHsKLQkJZmNvbmZpZ3VyZSAkcyAtYnVmZmVyaW5nIG5vbmUKLQkJI3B1dHMgJHMgIkdFVCAvIEhUVFAvMS4xIgotCQlwdXRzICRzICJHRVQgL2F1dG9tYXRpb24vbjA5MjMwOTQ1LmFzcCBIVFRQLzEuMSIKLQkJcHV0cyAkcyAiSG9zdDogd3d3LndoYXRpc215aXAuY29tIgotCQlwdXRzICRzICJDb25uZWN0aW9uOiBjbG9zZSIKLQkJcHV0cyAkcyAiIgotCQlmbHVzaCAkcwotCQlzZXQgb24gMAotCQl3aGlsZSB7IFtnZXRzICRzIGxpbmVdID4gLTEgfSB7Ci0JCQlpZiB7ISAkb24gJiYgW3JlZ2V4cCB7PEhFQUQ+fSAgJGxpbmVdfSB7c2V0IG9uIDF9Ci0JCQlpZiB7ISAkb24gJiYgW3JlZ2V4cCB7PEhUTUw+fSAgJGxpbmVdfSB7c2V0IG9uIDF9Ci0JCQlpZiB7ISAkb24gJiYgW3JlZ2V4cCB7PFRJVExFPn0gJGxpbmVdfSB7c2V0IG9uIDF9Ci0JCQlpZiB7ISAkb24gJiYgW3JlZ2V4cCB7XlswLTldWzAtOV0qXC5bMC05XX0gJGxpbmVdfSB7c2V0IG9uIDF9Ci0JCQlpZiB7ISAkb259IHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIFtyZWdleHAgeyhbMC05XVswLTldKlwuWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKil9ICRsaW5lIGlwXSB7Ci0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCQljbG9zZSAkcwotCX0KLQlpZiB7JGlwICE9ICJ1bmtub3duIn0gewotCQlzZXQgc2F2ZV9uYXQgJGlwCi0JCXNldCBsYXN0X3NhdmVfbmF0IFtjbG9jayBzZWNvbmRzXQotCX0KLQlyZXR1cm4gJGlwCi19Ci0KLXByb2MgY2hlY2tfZm9yX2lwdjYge30gewotCWdsb2JhbCBpc193aW5kb3dzIGhhdmVfaXB2NgotCWlmIHskaGF2ZV9pcHY2ICE9ICIifSB7Ci0JCXJldHVybgotCX0KLQlpZiB7ISAkaXNfd2luZG93c30gewotCQlzZXQgb3V0ICIiCi0JCWNhdGNoIHtzZXQgb3V0IFtleGVjIG5ldHN0YXQgLWFuXX0KLQkJaWYgW3JlZ2V4cCB7dGNwNn0gJG91dF0gewotCQkJc2V0IGhhdmVfaXB2NiAxCi0JCX0gZWxzZWlmIFtyZWdleHAge3VkcDZ9ICRvdXRdIHsKLQkJCXNldCBoYXZlX2lwdjYgMQotCQl9IGVsc2VpZiBbcmVnZXhwIHs6Ojp9ICRvdXRdIHsKLQkJCXNldCBoYXZlX2lwdjYgMQotCQl9IGVsc2VpZiBbcmVnZXhwIHs6OjF9ICRvdXRdIHsKLQkJCXNldCBoYXZlX2lwdjYgMQotCQl9IGVsc2VpZiBbcmVnZXhwIHtUQ1A6IElQdjYuKkxJU1RFTn0gJG91dF0gewotCQkJc2V0IGhhdmVfaXB2NiAxCi0JCX0gZWxzZSB7Ci0JCQlzZXQgaGF2ZV9pcHY2IDAKLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBvdXQgW2dldF9pcGNvbmZpZ10KLQkJc2V0IG91dCBbc3RyaW5nIHRyaW0gJG91dF0KLQkJaWYgeyRvdXQgPT0gIiJ9IHsKLQkJCWNhdGNoIHtzZXQgb3V0IFtleGVjIHBpbmc2IC1uIDEgLXcgMjAwMCA6OjFdfQotCQkJaWYgW3JlZ2V4cCB7UmVwbHkgZnJvbS4qYnl0ZXN9ICRvdXRdIHsKLQkJCQlpZiBbcmVnZXhwIHtSZWNlaXZlZCA9IDF9ICRvdXRdIHsKLQkJCQkJc2V0IGhhdmVfaXB2NiAxCi0JCQkJCXJldHVybgotCQkJCX0KLQkJCX0KLQkJCXNldCBoYXZlX2lwdjYgMAotCQkJcmV0dXJuCi0JCX0KLQkJZm9yZWFjaCBsaW5lIFtzcGxpdCAkb3V0ICJcblxyIl0gewotCQkJaWYge1tyZWdleHAgLW5vY2FzZSB7SVAgQWRkcmVzcy4qOlsgXHRdKlthLWYwLTldKjpbYS1mMC05XSo6fSAkbGluZV19IHsKLQkJCQlzZXQgaGF2ZV9pcHY2IDEKLQkJCQlyZXR1cm4KLQkJCX0KLQkJfQotCQlzZXQgaGF2ZV9pcHY2IDAKLQl9Ci19Ci1wcm9jIGd1ZXNzX2lwIHt9IHsKLQlnbG9iYWwgaXNfd2luZG93cwotCWlmIHshICRpc193aW5kb3dzfSB7Ci0JCXNldCBvdXQgIiIKLQkJc2V0IG91dCBbZ2V0X2hvc3RuYW1lXQotCQlpZiB7JG91dCAhPSAiIn0gewotCQkJc2V0IGhvdXQgIiIKLQkJCWNhdGNoIHtzZXQgaG91dCBbZXhlYyBob3N0ICRvdXRdfQotCQkJaWYgeyRob3V0ICE9ICIifSB7Ci0JCQkJaWYgW3JlZ2V4cCB7aGFzIGFkZHJlc3MgKFsuMC05XVsuMC05XSopfSAkaG91dCBtdmFyIGlwXSB7Ci0JCQkJCXNldCBpcCBbc3RyaW5nIHRyaW0gJGlwXQotCQkJCQlyZXR1cm4gJGlwCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAiIgotCX0gZWxzZSB7Ci0JCXNldCBvdXQgW2dldF9pcGNvbmZpZ10KLQkJc2V0IG91dCBbc3RyaW5nIHRyaW0gJG91dF0KLQkJaWYgeyRvdXQgPT0gIiJ9IHsKLQkJCXJldHVybiAiIgotCQl9Ci0JCWZvcmVhY2ggbGluZSBbc3BsaXQgJG91dCAiXG5cciJdIHsKLQkJCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0lQIEFkZHJlc3MuKjpbIFx0XSooWy4wLTldWy4wLTldKil9ICRsaW5lIG12YXIgaXBdfSB7Ci0JCQkJc2V0IGlwIFtzdHJpbmcgdHJpbSAkaXBdCi0JCQkJaWYgW3JlZ2V4cCB7XlsuMF0qJH0gJGlwXSB7Ci0JCQkJCWNvbnRpbnVlCi0JCQkJfQotCQkJCWlmIFtyZWdleHAgezEyN1wuMFwuMFwuMX0gJGlwXSB7Ci0JCQkJCWNvbnRpbnVlCi0JCQkJfQotCQkJCWlmIHskaXAgIT0gIiJ9IHsKLQkJCQkJcmV0dXJuICRpcAotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3JlYWNoIGxpbmUgW3NwbGl0ICRvdXQgIlxuXHIiXSB7Ci0JCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtJUCBBZGRyZXNzLio6WyBcdF0qKFs6YS1mMC05XVslOmEtZjAtOV0qKX0gJGxpbmUgbXZhciBpcF19IHsKLQkJCQlzZXQgaXAgW3N0cmluZyB0cmltICRpcF0KLQkJCQlpZiBbcmVnZXhwIHteWy4wXSokfSAkaXBdIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJaWYgW3JlZ2V4cCB7MTI3XC4wXC4wXC4xfSAkaXBdIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJaWYgeyRpcCAhPSAiIn0gewotCQkJCQlyZXR1cm4gJGlwCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1wcm9jIGJhdF9zbGVlcCB7Zmh9IHsKLQlnbG9iYWwgZW52Ci0JaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19CQVRfU0xFRVApXSB7Ci0JCXB1dHMgJGZoICJAZWNobyAuIgotCQlwdXRzICRmaCAiQGVjaG8gLS0tLS0iCi0JCXB1dHMgJGZoICJAZWNobyBEZWJ1ZzogQkFUIFNMRUVQIGZvciAkZW52KFNTVk5DX0JBVF9TTEVFUCkgc2Vjb25kcyAuLi4iCi0JCXB1dHMgJGZoICJAcGluZyAtbiAkZW52KFNTVk5DX0JBVF9TTEVFUCkgLXcgMTAwMCAwLjAuMC4xID4gTlVMIgotCQlwdXRzICRmaCAiQGVjaG8gQkFUIFNMRUVQIGRvbmUuIgotCX0KLX0KLQotcHJvYyB3aW5kb3dzX3N0YXJ0X3NvdW5kX2RhZW1vbiB7ZmlsZX0gewotCWdsb2JhbCBlbnYKLQlnbG9iYWwgdXNlX3NvdW5kIHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgc291bmRfZGFlbW9uX2xvY2FsX3N0YXJ0Ci0KLQkjIFZGCi0JcmVnc3ViIHtcLmJhdH0gJGZpbGUgInNuZC5iYXQiIGZpbGUyCi0Jc2V0IGZoMiBbb3BlbiAkZmlsZTIgInciXQotCi0JcHV0cyAkZmgyICRzb3VuZF9kYWVtb25fbG9jYWxfY21kCi0JYmF0X3NsZWVwICRmaDIKLQlwdXRzICRmaDIgImRlbCAkZmlsZTIiCi0JY2xvc2UgJGZoMgotCi0JbWVzZyAiU3RhcnRpbmcgU09VTkQgZGFlbW9uLi4uIgotCWlmIFtpbmZvIGV4aXN0cyBlbnYoQ09NU1BFQyldIHsKLQkJaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19CQVRfU0xFRVApXSB7Ci0JCQlleGVjICRlbnYoQ09NU1BFQykgL2Mgc3RhcnQgJGVudihDT01TUEVDKSAvYyAkZmlsZTIgJgotCQl9IGVsc2UgewotCQkJZXhlYyAkZW52KENPTVNQRUMpIC9jICRmaWxlMiAmCi0JCX0KLQl9IGVsc2UgewotCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0JBVF9TTEVFUCldIHsKLQkJCWV4ZWMgY21kLmV4ZSAvYyBzdGFydCBjbWQuZXhlIC9jICRmaWxlMiAmCi0JCX0gZWxzZSB7Ci0JCQlleGVjIGNtZC5leGUgL2MgJGZpbGUyICYKLQkJfQotCX0KLQlhZnRlciAxNTAwCi19Ci0KLXByb2Mgd2lua2lsbCB7cGlkfSB7Ci0JZ2xvYmFsIGlzX3dpbjl4Ci0KLQlpZiB7JHBpZCA9PSAiIn0gewotCQlyZXR1cm4KLQl9Ci0JaWYgeyEgJGlzX3dpbjl4fSB7Ci0JCWNhdGNoIHtleGVjIHRza2lsbC5leGUgJHBpZH0KLQkJYWZ0ZXIgMTAwCi0JCWNhdGNoIHtleGVjIHRhc2traWxsLmV4ZSAvUElEICRwaWR9Ci0JCWFmdGVyIDEwMAotCX0KLQljYXRjaCB7ZXhlYyB3OTgva2lsbC5leGUgL2YgJHBpZH0KLX0KLQotcHJvYyB3aW5kb3dzX3N0b3Bfc291bmRfZGFlbW9uIHt9IHsKLQlnbG9iYWwgdXNlX3NvdW5kIHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgc291bmRfZGFlbW9uX2xvY2FsX3N0YXJ0Ci0KLQlzZXQgY21kIFtzdHJpbmcgdHJpbSAkc291bmRfZGFlbW9uX2xvY2FsX2NtZF0KLQotCXJlZ3N1YiB7WyBcdF0uKiR9ICRjbWQgIiIgY21kCi0JcmVnc3ViIHteLipcXH0gJGNtZCAiIiBjbWQKLQlyZWdzdWIge14uKi99ICRjbWQgIiIgY21kCi0KLQlpZiB7JGNtZCA9PSAiIn0gewotCQlyZXR1cm4KLQl9Ci0KLQlzZXQgb3V0cHV0IFtnZXRfdGFza19saXN0XQotCQotCWZvcmVhY2ggbGluZSBbc3BsaXQgJG91dHB1dCAiXG5cciJdIHsKLQkJaWYgW3JlZ2V4cCAiJGNtZCIgJGxpbmVdIHsKLQkJCWlmIFtyZWdleHAgeygtP1swLTldWzAtOV0qKX0gJGxpbmUgbSBwXSB7Ci0JCQkJc2V0IHBpZHMoJHApICRsaW5lCi0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXQgY291bnQgMAotCWZvcmVhY2ggcGlkIFthcnJheSBuYW1lcyBwaWRzXSB7Ci0JCW1lc2cgIlN0b3BwaW5nIFNPVU5EIHBpZDogJHBpZCIKLQkJd2lua2lsbCAkcGlkCi0JCWlmIHskY291bnQgPT0gMH0gewotCQkJYWZ0ZXIgMTIwMAotCQl9IGVsc2UgewotCQkJYWZ0ZXIgNTAwCi0JCX0KLQkJaW5jciBjb3VudAotCX0KLX0KLQotcHJvYyBjb250YWcge30gewotCWdsb2JhbCBjb25jb3VudAotCWlmIHshIFtpbmZvIGV4aXN0cyBjb25jb3VudF19IHsKLQkJc2V0IGNvbmNvdW50IDAKLQl9Ci0JaW5jciBjb25jb3VudAotCXNldCBzdHIgW3BpZF0KLQlzZXQgc3RyICItJHN0ci0kY29uY291bnQiCi19Ci0KLXByb2MgbWFrZV9wbGluayB7fSB7Ci0JdG9wbGV2IC5wbGluawotCSN3bSBnZW9tZXRyeSAucGxpbmsgKzcwMCs1MDAKLQl3bSBnZW9tZXRyeSAucGxpbmsgLTQwLTQwCi0Jd20gdGl0bGUgLnBsaW5rICJwbGluayBTU0ggc3RhdHVzPyIKLQlzZXQgd2QgMzcKLQlsYWJlbCAucGxpbmsubDEgLWFuY2hvciB3IC10ZXh0ICJMb2dpbiB2aWEgcGxpbmsvc3NoIHRvIHRoZSByZW1vdGUgc2VydmVyIiAtd2lkdGggJHdkCi0JbGFiZWwgLnBsaW5rLmwyIC1hbmNob3IgdyAtdGV4dCAiKHN1cHBseSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXMgbmVlZGVkKS4iIC13aWR0aCAkd2QKLQlsYWJlbCAucGxpbmsubDMgLWFuY2hvciB3IC10ZXh0ICIiIC13aWR0aCAkd2QKLQlsYWJlbCAucGxpbmsubDQgLWFuY2hvciB3IC10ZXh0ICJBZnRlciBzc2ggaXMgc2V0IHVwLCBBTkQgaWYgdGhlIGNvbm5lY3Rpb24iIC13aWR0aCAkd2QKLQlsYWJlbCAucGxpbmsubDUgLWFuY2hvciB3IC10ZXh0ICJzdWNjZXNzIGlzIG5vdCBhdXRvZGV0ZWN0ZWQsIHBsZWFzZSBjbGljayIgLXdpZHRoICR3ZAotCWxhYmVsIC5wbGluay5sNiAtYW5jaG9yIHcgLXRleHQgIm9uZSBvZiB0aGVzZSBidXR0b25zOiIgLXdpZHRoICR3ZAotCWdsb2JhbCBwbGlua19zdGF0dXMKLQlidXR0b24gLnBsaW5rLmZhaWwgLXRleHQgIkZhaWxlZCIgLWNvbW1hbmQge2Rlc3Ryb3kgLnBsaW5rOyBzZXQgcGxpbmtfc3RhdHVzIG5vfQotCWJ1dHRvbiAucGxpbmsub2sgICAtdGV4dCAiU3VjY2VzcyIgLWNvbW1hbmQge2Rlc3Ryb3kgLnBsaW5rOyBzZXQgcGxpbmtfc3RhdHVzIHllc30KLQlwYWNrIC5wbGluay5sMSAucGxpbmsubDIgLnBsaW5rLmwzIC5wbGluay5sNCAucGxpbmsubDUgLnBsaW5rLmw2IC5wbGluay5mYWlsIC5wbGluay5vayAtc2lkZSB0b3AgLWZpbGwgeAotCi0JdXBkYXRlCi19Ci0KLXByb2Mgc3NoX3NwbGl0IHtzdHJ9IHsKLQlyZWdzdWIgeyAuKiR9ICRzdHIgIiIgc3RyCi0JaWYgeyEgW3JlZ2V4cCB7OlswLTldWzAtOV0qJH0gJHN0cl19IHsKLQkJYXBwZW5kIHN0ciAiOjIyIgotCX0KLQlyZWdzdWIgezpbMC05XVswLTldKiR9ICRzdHIgIiIgc3NoX2hvc3QKLQlyZWdzdWIge14uKjp9ICRzdHIgIiIgc3NoX3BvcnQKLQlpZiB7JHNzaF9wb3J0ID09ICIifSB7Ci0JCXNldCBzc2hfcG9ydCAyMgotCX0KLQlpZiBbcmVnZXhwIHtAfSAkc3NoX2hvc3RdIHsKLQkJcmVnc3ViIHtALiokfSAkc3NoX2hvc3QgIiIgc3NoX3VzZXIKLQkJcmVnc3ViIHteLipAfSAkc3NoX2hvc3QgIiIgc3NoX2hvc3QKLQl9IGVsc2UgewotCQlzZXQgc3NoX3VzZXIgIiIKLQl9Ci0JcmV0dXJuIFtsaXN0ICRzc2hfdXNlciAkc3NoX2hvc3QgJHNzaF9wb3J0XQotfQotCi1wcm9jIGNoZWNrX2RlYnVnX25ldHN0YXQge3BvcnQgc3RyIHdufSB7Ci0JZ2xvYmFsIGRlYnVnX25ldHN0YXQKLQlpZiB7ISBbaW5mbyBleGlzdHMgZGVidWdfbmV0c3RhdF19IHsKLQkJcmV0dXJuCi0JfQotCWlmIHskZGVidWdfbmV0c3RhdCA9PSAiMCIgfHwgJGRlYnVnX25ldHN0YXQgPT0gIiJ9IHsKLQkJcmV0dXJuCi0JfQotCW1lc2cgIkRCRzogJHduIgotCi0JdG9wbGV2IC5kYm5zCi0KLQlzZXQgaCAzNQotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IGggMjgKLQl9Ci0Jc2Nyb2xsX3RleHRfZGlzbWlzcyAuZGJucy5mIDgyICRoCi0JY2VudGVyX3dpbiAuZGJucwotCS5kYm5zLmYudCBpbnNlcnQgZW5kICJMT09LSU5HIEZPUiBQT1JUOiAkcG9ydFxuXG4kc3RyIgotCWppZ2dsZV90ZXh0IC5kYm5zLmYudAotCXVwZGF0ZQotCWFmdGVyIDEwMDAKLX0KLQotcHJvYyBsYXVuY2hfd2luZG93c19zc2gge2hwIGZpbGUgbn0gewotCWdsb2JhbCBpc193aW45eCBlbnYKLQlnbG9iYWwgdXNlX3NzaHNzbCB1c2Vfc3NoIHB1dHR5X3B3IHB1dHR5X2FyZ3MKLQlnbG9iYWwgcG9ydF9rbm9ja2luZ19saXN0Ci0JZ2xvYmFsIHVzZV9saXN0ZW4gbGlzdGVuaW5nX25hbWUKLQlnbG9iYWwgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfdHlwZQotCWdsb2JhbCB0c19vbmx5Ci0JZ2xvYmFsIGRlYnVnX25ldHN0YXQKLQotCXNldCBocG5ldyAgW2dldF9zc2hfaHAgJGhwXQotCXNldCBwcm94eSAgW2dldF9zc2hfcHJveHkgJGhwXQotCXNldCBzc2hjbWQgW2dldF9zc2hfY21kICRocF0KLQotCWdsb2JhbCB3aW5fbG9jYWxob3N0Ci0KLQlzZXQgdm5jX2hvc3QgJHdpbl9sb2NhbGhvc3QKLQlzZXQgdm5jX2Rpc3AgJGhwbmV3Ci0JcmVnc3ViIHteLio6fSAkdm5jX2Rpc3AgIiIgdm5jX2Rpc3AKLQotCXJlZ3N1YiB7XC5iYXR9ICRmaWxlICIuZmxnIiBmbGFnCi0KLQlpZiB7JHRzX29ubHl9IHsKLQkJcmVnc3ViIHs6MCR9ICRocG5ldyAiIiBocG5ldyAKLQkJaWYgeyRwcm94eSA9PSAiIn0gewotCQkJaWYge1tyZWdleHAge14oLiopOihbMC05XVswLTldKikkfSAkaHBuZXcgbXYgc3NoaHN0IHNzaHB0XX0gewotCQkJCXNldCBwcm94eSAiJHNzaGhzdDokc3NocHQiCi0JCQkJc2V0IGhwbmV3ICR3aW5fbG9jYWxob3N0Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiB7IVtyZWdleHAgeyx9ICRwcm94eV19IHsKLQkJCQlpZiB7JGhwbmV3ICE9ICR3aW5fbG9jYWxob3N0fSB7Ci0JCQkJCXNldCBwcm94eSAiJHByb3h5LCRocG5ldyIKLQkJCQkJc2V0IGhwbmV3ICR3aW5fbG9jYWxob3N0Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlaWYgeyFbcmVnZXhwIHteLT9bMC05XVswLTldKiR9ICR2bmNfZGlzcF19IHsKLQkJaWYge1tyZWdleHAge2NtZD1TSEVMTH0gJGhwXX0gewotCQkJOwotCQl9IGVsc2VpZiB7W3JlZ2V4cCB7Y21kPVBVVFRZfSAkaHBdfSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQkjIFhYWCBhZGQgOjAgaW5zdGVhZD8KLQkJCWlmIHsxfSB7Ci0JCQkJc2V0IHZuY19kaXNwICJ2bmNfZGlzcDowIgotCQkJCW1lc2cgIkFkZGVkIDowIHRvICR2bmNfZGlzcCIKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzZyAiQmFkIHZuY2Rpc3AsIG1pc3NpbmcgOjAgPywgJHZuY19kaXNwIgotCQkJCWJlbGwKLQkJCQlyZXR1cm4gMAotCQkJfQotCQl9Ci0JfQotCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXNldCB2bmNfcG9ydCA1NTAwCi0JfSBlbHNlIHsKLQkJc2V0IHZuY19wb3J0IDU5MDAKLQl9Ci0KLQlpZiB7JHRzX29ubHkgfHwgW3JlZ2V4cCB7UE9SVD0gLip4MTF2bmN9ICRzc2hjbWRdIHx8IFtyZWdleHAge1A9IC4qeDExdm5jfSAkc3NoY21kXX0gewotCQlyZWdzdWIge1BPUlQ9IFsgCV0qfSAkc3NoY21kICIiIHNzaGNtZAotCQlyZWdzdWIge1A9IFsgCV0qfSAkc3NoY21kICIiIHNzaGNtZAotCQlzZXQgdm5jX3BvcnQgW2V4cHIgIjgxMDAgKyBpbnQoNDAwMCAqIHJhbmQoKSkiXQotCQlzZXQgc3NoY21kICIkc3NoY21kIC1yZmJwb3J0ICR2bmNfcG9ydCIKLQl9IGVsc2VpZiB7W3JlZ2V4cCB7Xi1bMC05XVswLTldKiR9ICR2bmNfZGlzcF19IHsKLQkJc2V0IHZuY19wb3J0IFtleHByICItICR2bmNfZGlzcCJdCi0JfSBlbHNlaWYgeyFbcmVnZXhwIHteWzAtOV1bMC05XSokfSAkdm5jX2Rpc3BdfSB7Ci0JCTsKLQl9IGVsc2VpZiB7JHZuY19kaXNwIDwgMjAwfSB7Ci0JCWlmIHskdXNlX2xpc3Rlbn0gewotCQkJc2V0IHZuY19wb3J0IFtleHByICR2bmNfZGlzcCArIDU1MDBdCi0JCX0gZWxzZSB7Ci0JCQlzZXQgdm5jX3BvcnQgW2V4cHIgJHZuY19kaXNwICsgNTkwMF0KLQkJfQotCX0gZWxzZSB7Ci0JCXNldCB2bmNfcG9ydCAkdm5jX2Rpc3AKLQl9Ci0KLQlnbG9iYWwgc3NoX2lwdjZfcGlkCi0Jc2V0IHNzaF9pcHY2X3BpZCAiIgotCi0Jc2V0IHNzaF9wb3J0IDIyCi0Jc2V0IHNzaF9ob3N0IFtob3N0X3BhcnQgJGhwbmV3XQotCi0Jc2V0IGRvdWJsZV9zc2ggIiIKLQlzZXQgcF9wb3J0ICIiCi0JaWYgeyRwcm94eSAhPSAiIn0gewotCQlpZiBbcmVnZXhwIC1ub2Nhc2UgeyhodHRwfGh0dHBzfHNvY2tzfHNvY2tzNHxzb2NrczV8cmVwZWF0ZXIpOi8vfSAkcHJveHldIHsKLQkJCXNldCBwcHJveHkgIiIKLQkJCXNldCBzcHJveHkxICIiCi0JCQlzZXQgc3Byb3h5X3Jlc3QgIiIKLQkJCXNldCBzcHJveHkxX2hvc3QgIiIKLQkJCXNldCBzcHJveHkxX3VzZXIgIiIKLQkJCXNldCBzcHJveHkxX3BvcnQgIiIKLQkJCWZvcmVhY2ggcGFydCBbc3BsaXQgJHByb3h5ICIsIl0gewotCQkJCWlmIHtbcmVnZXhwIHteWyAJXSokfSAkcGFydF19IHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHteKGh0dHB8aHR0cHN8c29ja3N8c29ja3M0fHNvY2tzNXxyZXBlYXRlcik6Ly99ICRwYXJ0XSB7Ci0JCQkJCWlmIHskcHByb3h5ID09ICIifSB7Ci0JCQkJCQlzZXQgcHByb3h5ICRwYXJ0Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXQgcHByb3h5ICIkcHByb3h5LCRwYXJ0IgotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgeyRzcHJveHkxID09ICIifSB7Ci0JCQkJCQlzZXQgc3Byb3h5MSAkcGFydAotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgeyRzcHJveHlfcmVzdCA9PSAiIn0gewotCQkJCQkJCXNldCBzcHJveHlfcmVzdCAkcGFydAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXQgc3Byb3h5X3Jlc3QgIiRzcHJveHlfcmVzdCwkcGFydCIKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotI21lc2cgInBwcm94eTogJHBwcm94eSI7IGFmdGVyIDIwMDAKLSNtZXNnICJzcHJveHkxOiAkc3Byb3h5MSI7IGFmdGVyIDIwMDAKLSNtZXNnICJzcHJveHlfcmVzdDogJHNwcm94eV9yZXN0IjsgYWZ0ZXIgMjAwMAotI21lc2cgInNzaF9ob3N0OiAkc3NoX2hvc3QiOyBhZnRlciAyMDAwCi0jbWVzZyAic3NoX3BvcnQ6ICRzc2hfcG9ydCI7IGFmdGVyIDIwMDAKLQotCQkJaWYgeyRzcHJveHkxICE9ICIifSB7Ci0JCQkJcmVnc3ViIHs6WzAtOV1bMC05XSokfSAkc3Byb3h5MSAiIiBzcHJveHkxX2hvc3QKLQkJCQlyZWdzdWIge14uKkB9ICRzcHJveHkxX2hvc3QgIiIgc3Byb3h5MV9ob3N0Ci0JCQkJcmVnc3ViIHtALiokfSAkc3Byb3h5MSAiIiBzcHJveHkxX3VzZXIKLQkJCQlyZWdzdWIge14uKjp9ICRzcHJveHkxICIiIHNwcm94eTFfcG9ydAotCQkJfSBlbHNlIHsKLQkJCQlyZWdzdWIgezpbMC05XVswLTldKiR9ICRzc2hfaG9zdCAiIiBzcHJveHkxX2hvc3QKLQkJCQlyZWdzdWIge14uKkB9ICRzcHJveHkxX2hvc3QgIiIgc3Byb3h5MV9ob3N0Ci0JCQkJcmVnc3ViIHtALiokfSAkc3NoX2hvc3QgIiIgc3Byb3h5MV91c2VyCi0JCQkJcmVnc3ViIHteLio6fSAkc3NoX2hvc3QgIiIgc3Byb3h5MV9wb3J0Ci0JCQl9Ci0JCQlpZiB7IVtyZWdleHAge15bMC05XVswLTldKiR9ICRzcHJveHkxX3BvcnRdfSB7Ci0JCQkJc2V0IHNwcm94eTFfcG9ydCAyMgotCQkJfQotCQkJaWYgeyRzcHJveHkxX3VzZXIgIT0gIiJ9IHsKLQkJCQlzZXQgc3Byb3h5MV91c2VyICIkc3Byb3h5MV91c2VyQCIKLQkJCX0KLQotI21lc2cgInNwcm94eTFfaG9zdDogJHNwcm94eTFfaG9zdCI7IGFmdGVyIDIwMDAKLSNtZXNnICJzcHJveHkxX3VzZXI6ICRzcHJveHkxX3VzZXIiOyBhZnRlciAyMDAwCi0jbWVzZyAic3Byb3h5MV9wb3J0OiAkc3Byb3h5MV9wb3J0IjsgYWZ0ZXIgMjAwMAotCi0JCQlzZXQgcG9ydDIgIiIKLQkJCWlmIFtyZWdleHAgLS0gey0oWzAtOV1bMC05XSopfSBbZmlsZSB0YWlsICRmaWxlXSBtdiBkcG9ydF0gewotCQkJCXNldCBwb3J0MiBbZXhwciAyMTAwMCArICRkcG9ydF0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IHBvcnQyIFtyYW5kX3BvcnRdCi0JCQl9Ci0KLQkJCWdsb2JhbCBoYXZlX2lwdjYKLQkJCWlmIHskaGF2ZV9pcHY2fSB7Ci0JCQkJc2V0IHJlcyBbaXB2Nl9wcm94eSAkcHByb3h5ICIiICIiXQotCQkJCXNldCBwcHJveHkgICAgW2xpbmRleCAkcmVzIDBdCi0JCQkJc2V0IHNzaF9pcHY2X3BpZCBbbGluZGV4ICRyZXMgM10KLQkJCX0KLQotCQkJc2V0IGVudihTU1ZOQ19QUk9YWSkgJHBwcm94eQotCQkJc2V0IGVudihTU1ZOQ19MSVNURU4pICRwb3J0MgotCQkJc2V0IGVudihTU1ZOQ19ERVNUKSAiJHNwcm94eTFfaG9zdDokc3Byb3h5MV9wb3J0IgotCi0JCQltZXNnICJTdGFydGluZyBQcm94eSBUQ1AgaGVscGVyIG9uIHBvcnQgJHBvcnQyIC4uLiIKLQkJCWFmdGVyIDMwMAotCQkJIyBzc2ggYnIgY2FzZToKLQkJCXNldCBwcm94eV9waWQgW2V4ZWMgImNvbm5lY3RfYnIuZXhlIiAmXQotCi0JCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19QUk9YWSkgIH0KLQkJCWNhdGNoIHsgdW5zZXQgZW52KFNTVk5DX0xJU1RFTikgfQotCQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfREVTVCkgICB9Ci0KLQkJCWlmIHskc3Byb3h5MSA9PSAiIn0gewotCQkJCXNldCBwcm94eSAiJHdpbl9sb2NhbGhvc3Q6JHBvcnQyIgotCQkJCWlmIFtyZWdleHAge14oLiopQH0gJHNzaF9ob3N0IG12IHVdIHsKLQkJCQkJc2V0IHByb3h5ICIkdUAkcHJveHkiCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZXQgcHJveHkgIiR7c3Byb3h5MV91c2VyfSR3aW5fbG9jYWxob3N0OiRwb3J0MiIKLQkJCX0KLQkJCWlmIHskc3Byb3h5X3Jlc3QgIT0gIiJ9IHsKLQkJCQlzZXQgcHJveHkgIiRwcm94eSwkc3Byb3h5X3Jlc3QiCi0JCQl9Ci0JCQltZXNnICJTZXQgcHJveHkgdG86ICRwcm94eSIKLQkJCWFmdGVyIDMwMAotCQl9Ci0JCWlmIFtyZWdleHAgeyx9ICRwcm94eV0gewotCQkJaWYgeyRpc193aW45eH0gewotCQkJCW1lc2cgIkRvdWJsZSBwcm94eSBkb2VzIG5vdCB3b3JrIG9uIFdpbjl4IgotCQkJCWJlbGwKLQkJCQl3aW5raWxsICRzc2hfaXB2Nl9waWQKLQkJCQlzZXQgc3NoX2lwdjZfcGlkICIiCi0JCQkJcmV0dXJuIDAKLQkJCX0KLQkJCSMgdXNlcjFAZ2F0ZXdheTpwb3J0MSx1c2VyMkB3b3Jrc3RhdGlvbjpwb3J0MgotCQkJc2V0IHByb3h5MSAiIgotCQkJc2V0IHByb3h5MiAiIgotCQkJc2V0IHMgW3NwbGl0ICRwcm94eSAiLCJdCi0JCQlzZXQgcHJveHkxIFtsaW5kZXggJHMgMF0KLQkJCXNldCBwcm94eTIgW2xpbmRleCAkcyAxXQotCi0JCQlzZXQgcF9wb3J0ICIiCi0JCQlpZiBbcmVnZXhwIC0tIHstKFswLTldWzAtOV0qKX0gW2ZpbGUgdGFpbCAkZmlsZV0gbXYgZHBvcnRdIHsKLQkJCQlzZXQgcF9wb3J0IFtleHByIDQwMDAgKyAkZHBvcnRdCi0JCQl9IGVsc2UgewotCQkJCXNldCBwX3BvcnQgW2V4cHIgMzAwMCArIDEwMDAgKiByYW5kKCldCQotCQkJCXNldCBwX3BvcnQgW2V4cHIgcm91bmQoJHBfcG9ydCldCi0JCQl9Ci0KLQkJCXNldCBzIFtzc2hfc3BsaXQgJHByb3h5MV0KLQkJCXNldCBzc2hfdXNlcjEgW2xpbmRleCAkcyAwXQotCQkJc2V0IHNzaF9ob3N0MSBbbGluZGV4ICRzIDFdCi0JCQlzZXQgc3NoX3BvcnQxIFtsaW5kZXggJHMgMl0KLQotCQkJc2V0IHMgW3NzaF9zcGxpdCAkcHJveHkyXQotCQkJc2V0IHNzaF91c2VyMiBbbGluZGV4ICRzIDBdCi0JCQlzZXQgc3NoX2hvc3QyIFtsaW5kZXggJHMgMV0KLQkJCXNldCBzc2hfcG9ydDIgW2xpbmRleCAkcyAyXQotCi0JCQlpZiB7ISBbcmVnZXhwIHteWzAtOV1bMC05XSokfSAkc3NoX3BvcnQxXX0gewotCQkJCXNldCBzc2hfcG9ydDEgMjIKLQkJCX0KLQkJCWlmIHshIFtyZWdleHAge15bMC05XVswLTldKiR9ICRzc2hfcG9ydDJdfSB7Ci0JCQkJc2V0IHNzaF9wb3J0MiAyMgotCQkJfQotCi0JCQlzZXQgdTEgIiIKLQkJCWlmIHskc3NoX3VzZXIxICE9ICIifSB7Ci0JCQkJc2V0IHUxICIke3NzaF91c2VyMX1AIgotCQkJfQotCQkJc2V0IHUyICIiCi0JCQlpZiB7JHNzaF91c2VyMiAhPSAiIn0gewotCQkJCXNldCB1MiAiJHtzc2hfdXNlcjJ9QCIKLQkJCX0KLQkJCi0JCQlzZXQgZG91YmxlX3NzaCAiLUwgJHBfcG9ydDokc3NoX2hvc3QyOiRzc2hfcG9ydDIgLVAgJHNzaF9wb3J0MSAkdTEkc3NoX2hvc3QxIgotCQkJc2V0IHByb3h5X3VzZSAiJHt1Mn0kd2luX2xvY2FsaG9zdDokcF9wb3J0IgotCi0JCX0gZWxzZSB7Ci0JCQkjIHVzZXIxQGdhdGV3YXk6cG9ydDEKLQkJCXNldCBwcm94eV91c2UgJHByb3h5Ci0JCX0KLQotCQlzZXQgc3NoX2hvc3QgW2hvc3RfcGFydCAkcHJveHlfdXNlXQotCi0JCXNldCBzc2hfcG9ydCBbcG9ydF9wYXJ0ICRwcm94eV91c2VdCi0JCWlmIHshIFtyZWdleHAge15bMC05XVswLTldKiR9ICRzc2hfcG9ydF19IHsKLQkJCXNldCBzc2hfcG9ydCAyMgotCQl9Ci0KLQkJc2V0IHZuY19ob3N0IFtob3N0X3BhcnQgJGhwbmV3XQotCQlpZiB7JHZuY19ob3N0ID09ICIifSB7Ci0JCQlzZXQgdm5jX2hvc3QgJHdpbl9sb2NhbGhvc3QKLQkJfQotCX0KLQotCWlmIHshW3JlZ2V4cCB7XlteIAldW14gCV0qQH0gJHNzaF9ob3N0XX0gewotCQltZXNnICJZb3UgbXVzdCBzdXBwbHkgYSB1c2VybmFtZTogdXNlckBob3N0Li4uIgotCQliZWxsCi0JCXdpbmtpbGwgJHNzaF9pcHY2X3BpZAotCQlzZXQgc3NoX2lwdjZfcGlkICIiCi0JCXJldHVybiAwCi0JfQotCi0Jc2V0IHZlcmIgIi12IgotCi0Jc2V0IHB3ZCAiIgotCWlmIHskaXNfd2luOXh9IHsKLQkJc2V0IHB3ZCBbcHdkXQotCQlyZWdzdWIgLWFsbCB7L30gJHB3ZCAiXFwiIHB3ZAotCX0KLQlpZiB7ISBbcmVnZXhwIHteWzAtOV1bMC05XSokfSAkbl19IHsKLQkJc2V0IG4gMAotCX0KLQotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlzZXQgdXNlIFtleHByICRuICsgNTUwMF0KLQl9IGVsc2UgewotCQlzZXQgdXNlIFtleHByICRuICsgNTkwMF0KLQl9Ci0KLQlzZXRfc21iX21vdW50cwotCQotCWdsb2JhbCB1c2Vfc21ibW50IHVzZV9zb3VuZCBzb3VuZF9kYWVtb25fa2lsbCAKLQlzZXQgZG9fcHJlIDAKLQlpZiB7JHVzZV9zbWJtbnR9ICB7Ci0JCXNldCBkb19wcmUgMQotCX0gZWxzZWlmIHskdXNlX3NvdW5kICYmICRzb3VuZF9kYWVtb25fa2lsbH0gewotCQlzZXQgZG9fcHJlIDEKLQl9Ci0KLQlnbG9iYWwgc2tpcF9wcmUKLQlpZiB7JHNraXBfcHJlfSB7Ci0JCXNldCBkb19wcmUgMAotCQlzZXQgc2tpcF9wcmUgMAotCX0KLQotCXNldCBwdyAiIgotCWlmIHskcHV0dHlfcHcgIT0gIiJ9IHsKLQkJaWYgeyEgW3JlZ2V4cCB7In0gJHB1dHR5X3B3XX0geyAgIyIKLQkJCXNldCBwdyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkcHV0dHlfcHdcIiIKLQkJfQotCX0KLQotCXNldCB0YWcgW2NvbnRhZ10KLQotCXNldCBmaWxlX2RvdWJsZSAiIgotCi0Jc2V0IGZpbGVfcHJlICIiCi0Jc2V0IGZpbGVfcHJlX2NtZCAiIgotCWlmIHskZG9fcHJlfSB7Ci0JCXNldCBzZXR1cF9jbWRzIFt1Z2x5X3NldHVwX3NjcmlwdHMgcHJlICR0YWddIAotCQkKLQkJaWYgeyRzZXR1cF9jbWRzICE9ICIifSB7Ci0JCQkjIFZGCi0JCQlyZWdzdWIge1wuYmF0fSAkZmlsZSAicHJlLmNtZCIgZmlsZV9wcmVfY21kCi0JCQlzZXQgZmggW29wZW4gJGZpbGVfcHJlX2NtZCAidyJdCi0JCQlwdXRzICRmaCAiJHNldHVwX2NtZHMgc2xlZXAgMTA7ICIKLQkJCWJhdF9zbGVlcCAkZmgKLQkJCWNsb3NlICRmaAotCi0JCQkjIFZGCi0JCQlyZWdzdWIge1wuYmF0fSAkZmlsZSAicHJlLmJhdCIgZmlsZV9wcmUKLQkJCXNldCBmaCBbb3BlbiAkZmlsZV9wcmUgInciXQotCQkJc2V0IHBsaW5rX3N0ciAicGxpbmsuZXhlIC1zc2ggLUMgLVAgJHNzaF9wb3J0IC1tICRmaWxlX3ByZV9jbWQgJHZlcmIgLXQiIAotCQkJaWYgeyRwdXR0eV9hcmdzICE9ICIifSB7Ci0JCQkJYXBwZW5kIHBsaW5rX3N0ciAiICRwdXR0eV9hcmdzIgotCQkJfQotCi0JCQlnbG9iYWwgc21iX3JlZGlyXzAKLQkJCWlmIHskc21iX3JlZGlyXzAgIT0gIiJ9IHsKLQkJCQlhcHBlbmQgcGxpbmtfc3RyICIgJHNtYl9yZWRpcl8wIgotCQkJfQotCi0JCQlpZiBbcmVnZXhwIHslfSAkc3NoX2hvc3RdIHsKLQkJCQlzZXQgdWF0aCAiIgotCQkJCXJlZ3N1YiAtYWxsIHslU1BBQ0V9ICRzc2hfaG9zdCAiICIgdWF0aAotCQkJCXJlZ3N1YiAtYWxsIHslVEFCfSAkdWF0aCAiCSIgdWF0aAotCQkJCWFwcGVuZCBwbGlua19zdHIgIiRwdyBcIiR1YXRoXCIiIAotCQkJfSBlbHNlIHsKLQkJCQlhcHBlbmQgcGxpbmtfc3RyICIkcHcgJHNzaF9ob3N0IiAKLQkJCX0KLQotCQkJaWYgeyRwdyAhPSAiIn0gewotCQkJCXB1dHMgJGZoICJlY2hvIG9mZiIKLQkJCX0KLQkJCXB1dHMgJGZoICRwbGlua19zdHIKLQotCQkJYmF0X3NsZWVwICRmaAotCQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX05PX0RFTEVURSldfSB7Ci0JCQkJaWYgeyRmaWxlX3ByZV9jbWQgIT0gIiJ9IHsKLQkJCQkJcHV0cyAkZmggImRlbCAkZmlsZV9wcmVfY21kIgotCQkJCX0KLQkJCQlwdXRzICRmaCAiZGVsICRmaWxlX3ByZSIKLQkJCX0KLQkJCWNsb3NlICRmaAotCQl9Ci0JfQotCi0JaWYgeyRpc193aW45eH0gewotCQlzZXQgc2xlZXAgMzUKLQl9IGVsc2UgewotCQlzZXQgc2xlZXAgMjAKLQl9Ci0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXNldCBzbGVlcCAxODAwCi0JfQotCi0Jc2V0IHNldHVwX2NtZHMgW3VnbHlfc2V0dXBfc2NyaXB0cyBwb3N0ICR0YWddIAotCi0Jc2V0IGRvX3NoZWxsIDAKLQlpZiB7JHNzaGNtZCA9PSAiU0hFTEwifSB7Ci0JCXNldCBzZXR1cF9jbWRzICIiCi0JCXNldCBzc2hjbWQgeyRTSEVMTH0KLQkJc2V0IGRvX3NoZWxsIDEKLQl9IGVsc2VpZiB7JHNzaGNtZCA9PSAiUFVUVFkifSB7Ci0JCXNldCBzZXR1cF9jbWRzICIiCi0JCXNldCBkb19zaGVsbCAxCi0JfQotCi0JaWYgeyRzc2hjbWQgIT0gIlNIRUxMIiAmJiBbcmVnZXhwIC1ub2Nhc2Uge3gxMXZuY30gJHNzaGNtZF19IHsKLQkJZ2xvYmFsIHVzZV9jdXBzIGN1cHNfeDExdm5jIGN1cHNfcmVtb3RlX3BvcnQKLQkJZ2xvYmFsIGN1cHNfcmVtb3RlX3NtYl9wb3J0Ci0JCWdsb2JhbCB1c2Vfc291bmQgc291bmRfZGFlbW9uX3gxMXZuYyBzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQgCi0JCWdsb2JhbCB0c19vbmx5Ci0JCWlmIHskdHNfb25seX0gewotCQkJc2V0IGN1cHNfeDExdm5jIDEKLQkJCXNldCBzb3VuZF9kYWVtb25feDExdm5jIDEKLQkJfQotCQlpZiB7JHVzZV9jdXBzICYmICRjdXBzX3gxMXZuYyAmJiAkY3Vwc19yZW1vdGVfcG9ydCAhPSAiIn0gewotCQkJc2V0IGNycCAkY3Vwc19yZW1vdGVfcG9ydAotCQkJaWYgeyR0c19vbmx5fSB7Ci0JCQkJc2V0IGN1cHNfcmVtb3RlX3BvcnQgW3JhbmRfcG9ydF0KLQkJCQlzZXQgY3JwICJEQUVNT04tJGN1cHNfcmVtb3RlX3BvcnQiCi0JCQl9Ci0JCQlzZXQgc3NoY21kICIkc3NoY21kIC1lbnYgRkRfQ1VQUz0kY3JwIgotCQl9Ci0JCWlmIHskdXNlX2N1cHMgJiYgJGN1cHNfeDExdm5jICYmICRjdXBzX3JlbW90ZV9zbWJfcG9ydCAhPSAiIn0gewotCQkJc2V0IGNzcCAkY3Vwc19yZW1vdGVfc21iX3BvcnQKLQkJCWlmIHskdHNfb25seX0gewotCQkJCXNldCBjdXBzX3JlbW90ZV9zbWJfcG9ydCBbcmFuZF9wb3J0XQotCQkJCXNldCBjc3AgIkRBRU1PTi0kY3Vwc19yZW1vdGVfc21iX3BvcnQiCi0JCQl9Ci0JCQlzZXQgc3NoY21kICIkc3NoY21kIC1lbnYgRkRfU01CPSRjc3AiCi0JCX0KLQkJaWYgeyR1c2Vfc291bmQgJiYgJHNvdW5kX2RhZW1vbl94MTF2bmMgJiYgJHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCAhPSAiIn0gewotCQkJc2V0IHNycCAkc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0Ci0JCQlpZiB7JHRzX29ubHl9IHsKLQkJCQlzZXQgc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0IFtyYW5kX3BvcnRdCi0JCQkJc2V0IHNycCAiREFFTU9OLSRzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQiCi0JCQl9Ci0JCQlzZXQgc3NoY21kICIkc3NoY21kIC1lbnYgRkRfRVNEPSRzcnAiCi0JCX0KLQl9Ci0KLQlzZXQgZmlsZV9jbWQgIiIKLQlpZiB7JHNldHVwX2NtZHMgIT0gIiJ9IHsKLQkJIyBWRgotCQlyZWdzdWIge1wuYmF0fSAkZmlsZSAiLmNtZCIgZmlsZV9jbWQKLQkJc2V0IGZoX2NtZCBbb3BlbiAkZmlsZV9jbWQgInciXQotCi0JCXNldCBzdHIgJHNldHVwX2NtZHMKLQkJaWYgeyRzc2hjbWQgIT0gIiJ9IHsKLQkJCWFwcGVuZCBzdHIgIiAkc3NoY21kOyAiCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgc3RyICIgc2xlZXAgJHNsZWVwOyAiCi0JCX0KLQkJcHV0cyAkZmhfY21kICRzdHIKLQkJYmF0X3NsZWVwICRmaF9jbWQKLQkJY2xvc2UgJGZoX2NtZAotCi0JCXNldCBzc2hjbWQgJHNldHVwX2NtZHMKLQl9Ci0KLQlpZiB7JHNzaGNtZCA9PSAiIn0gewotCQlzZXQgcGNtZCAiZWNobzsgZWNobyBTU0ggY29ubmVjdGVkIE9LLjsgZWNobyBJZiB0aGlzIHN0YXRlIGlzIG5vdCBhdXRvZGV0ZWN0ZWQsOyBlY2hvIEdvIENsaWNrIHRoZSBTdWNjZXNzIGJ1dHRvbi4iCi0JCXNldCBzc2hjbWQgIiRwY21kOyBzbGVlcCAkc2xlZXAiCi0JfQotCi0JZ2xvYmFsIHVzZV9zb3VuZCBzb3VuZF9kYWVtb25fbG9jYWxfY21kIHNvdW5kX2RhZW1vbl9sb2NhbF9zdGFydAotCWlmIHshICRkb19zaGVsbCAmJiAhICRpc193aW45eCAmJiAkdXNlX3NvdW5kICYmICRzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQgJiYgJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgIT0gIiJ9IHsKLQkJd2luZG93c19zdGFydF9zb3VuZF9kYWVtb24gJGZpbGUKLQl9Ci0KLQkjIFZGCi0Jc2V0IGZoIFtvcGVuICRmaWxlICJ3Il0KLQlpZiB7JGlzX3dpbjl4fSB7Ci0JCXB1dHMgJGZoICJjZCAkcHdkIgotCQlpZiB7JGZpbGVfcHJlICE9ICIifSB7Ci0JCQlwdXRzICRmaCAiZWNobyBQcmVzcyBDdHJsLUMgLS1IRVJFLS0gd2hlbiBkb25lIHdpdGggdGhlIFByZS1Db21tYW5kIHNoZWxsIHdvcmsuIgotCQkJcHV0cyAkZmggInN0YXJ0IC93IGNvbW1hbmQuY29tIC9jICRmaWxlX3ByZSIKLQkJfQotCX0KLQotCWdsb2JhbCB1c2VfY3VwcyB1c2Vfc21ibW50Ci0Jc2V0IGV4dHJhX3JlZGlycyAiIgotCWlmIHskdXNlX2N1cHN9IHsKLQkJYXBwZW5kIGV4dHJhX3JlZGlycyBbZ2V0X2N1cHNfcmVkaXJdCi0JfQotCWlmIHskdXNlX3NvdW5kfSB7Ci0JCWFwcGVuZCBleHRyYV9yZWRpcnMgW2dldF9zb3VuZF9yZWRpcl0KLQl9Ci0JZ2xvYmFsIGFkZGl0aW9uYWxfcG9ydF9yZWRpcnMKLQlpZiB7JGFkZGl0aW9uYWxfcG9ydF9yZWRpcnN9IHsKLQkJYXBwZW5kIGV4dHJhX3JlZGlycyBbZ2V0X2FkZGl0aW9uYWxfcmVkaXJdCi0JfQotCi0JaWYgeyR2bmNfaG9zdCA9PSAiIn0gewotCQlzZXQgdm5jX2hvc3QgJHdpbl9sb2NhbGhvc3QKLQl9Ci0JcmVnc3ViIHteLipAfSAkdm5jX2hvc3QgIiIgdm5jX2hvc3QKLQotCXNldCByZWRpciAiLUwgJHVzZTokdm5jX2hvc3Q6JHZuY19wb3J0IgotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlzZXQgcmVkaXIgIi1SICR2bmNfcG9ydDokdm5jX2hvc3Q6JHVzZSIKLQkJc2V0IGxpc3RlbmluZ19uYW1lICJsb2NhbGhvc3Q6JHZuY19wb3J0ICAob24gcmVtb3RlIFNTSCBzaWRlKSIKLQl9Ci0KLQlzZXQgcGxpbmtfc3RyICJwbGluay5leGUgLXNzaCAtUCAkc3NoX3BvcnQgJHZlcmIgJHJlZGlyICRleHRyYV9yZWRpcnMgLXQiIAotCWlmIHskcHV0dHlfYXJncyAhPSAiIn0gewotCQlhcHBlbmQgcGxpbmtfc3RyICIgJHB1dHR5X2FyZ3MiCi0JfQotCWlmIHskZXh0cmFfcmVkaXJzICE9ICIifSB7Ci0JCXJlZ3N1YiB7ZXhlfSAkcGxpbmtfc3RyICJleGUgLUMiIHBsaW5rX3N0cgotCX0gZWxzZSB7Ci0JCSMgaG1tIHdlIHVzZWQgdG8gaGF2ZSBpdCBvZmYuLi4gd2h5PwotCQkjIHNzaCB0eXBpbmcgcmVzcG9uc2U/Ci0JCXJlZ3N1YiB7ZXhlfSAkcGxpbmtfc3RyICJleGUgLUMiIHBsaW5rX3N0cgotCX0KLQlzZXQgdWF0aCAkc3NoX2hvc3QKLQlpZiBbcmVnZXhwIHslfSAkdWF0aF0gewotCQlyZWdzdWIgLWFsbCB7JVNQQUNFfSAkdWF0aCAiICIgdWF0aAotCQlyZWdzdWIgLWFsbCB7JVRBQn0gJHVhdGggIgkiIHVhdGgKLQkJc2V0IHVhdGggIlwiJHVhdGhcIiIKLQl9Ci0JaWYgeyRkb19zaGVsbH0gewotCQlpZiB7JHNzaGNtZCA9PSAiUFVUVFkifSB7Ci0JCSAgICBpZiBbcmVnZXhwIHteIi4qQH0gJHVhdGhdIHsgIyIKLQkJCSAgICByZWdzdWIge0B9ICR1YXRoIHsiICJ9IHVhdGgKLQkJCSAgICBzZXQgdWF0aCAiLWwgJHVhdGgiCi0JCSAgICB9Ci0JCSAgICBpZiB7JGlzX3dpbjl4fSB7Ci0JCQlzZXQgcGxpbmtfc3RyICJwdXR0eS5leGUgLXNzaCAtQyAtUCAkc3NoX3BvcnQgJGV4dHJhX3JlZGlycyAkcHV0dHlfYXJncyAtdCAkcHcgJHVhdGgiIAotCQkgICAgfSBlbHNlIHsKLQkJCXNldCBwbGlua19zdHIgInN0YXJ0IFwicHV0dHkgJHNzaF9ob3N0XCIgcHV0dHkuZXhlIC1zc2ggLUMgLVAgJHNzaF9wb3J0ICRleHRyYV9yZWRpcnMgJHB1dHR5X2FyZ3MgLXQgJHB3ICR1YXRoIiAKLQkJCWlmIFtyZWdleHAge0ZJTklTSH0gJHBvcnRfa25vY2tpbmdfbGlzdF0gewotCQkJCXJlZ3N1YiB7c3RhcnR9ICRwbGlua19zdHIgInN0YXJ0IC93YWl0IiBwbGlua19zdHIKLQkJCX0KLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJCXNldCBwbGlua19zdHIgInBsaW5rLmV4ZSAtc3NoIC1DIC1QICRzc2hfcG9ydCAkZXh0cmFfcmVkaXJzICRwdXR0eV9hcmdzIC10ICRwdyAkdWF0aCIgCi0JCQlhcHBlbmQgcGxpbmtfc3RyIHsgIiRTSEVMTCJ9Ci0JCX0KLQl9IGVsc2VpZiB7JGZpbGVfY21kICE9ICIifSB7Ci0JCWFwcGVuZCBwbGlua19zdHIgIiAtbSAkZmlsZV9jbWQkcHcgJHVhdGgiCi0JfSBlbHNlIHsKLQkJYXBwZW5kIHBsaW5rX3N0ciAiJHB3ICR1YXRoIFwiJHNzaGNtZFwiIgotCX0KLQotCWlmIHskcHcgIT0gIiJ9IHsKLQkJcHV0cyAkZmggImVjaG8gb2ZmIgotCX0KLQlpZiB7JHRzX29ubHkgJiYgW3JlZ2V4cCB7c3VkbyB9ICRzc2hjbWRdfSB7Ci0JCXB1dHMgJGZoICJlY2hvIFwiIFwiIgotCQlwdXRzICRmaCAiZWNobyBcIkRvaW5nIEluaXRpYWwgU1NIIHdpdGggc3VkbyBpZCB0byBwcmltZSBzdWRvLi4uXCIiCi0JCXB1dHMgJGZoICJlY2hvIFwiIFwiIgotCQlwdXRzICRmaCAicGxpbmsuZXhlIC1zc2ggJHB1dHR5X2FyZ3MgLXQgJHVhdGggXCJzdWRvIGlkOyB0dHlcIiIKLQkJcHV0cyAkZmggImVjaG8gXCIgXCIiCi0JfQotCXB1dHMgJGZoICRwbGlua19zdHIKLQliYXRfc2xlZXAgJGZoCi0JcHV0cyAkZmggImRlbCAkZmxhZyIKLQlpZiB7IVtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTk9fREVMRVRFKV19IHsKLQkJaWYgeyRmaWxlX2NtZCAhPSAiIn0gewotCQkJcHV0cyAkZmggImRlbCAkZmlsZV9jbWQiCi0JCX0KLQkJcHV0cyAkZmggImRlbCAkZmlsZSIKLQl9Ci0JY2xvc2UgJGZoCi0KLQljYXRjaCB7ZGVzdHJveSAub30KLQljYXRjaCB7ZGVzdHJveSAub2F9Ci0JY2F0Y2gge2Rlc3Ryb3kgLm9zfQotCi0JaWYgeyAhW2RvX3BvcnRfa25vY2sgJHNzaF9ob3N0IHN0YXJ0XX0gewotCQlpZiB7IVtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTk9fREVMRVRFKV19IHsKLQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZmlsZX0KLQkJCWlmIHskZmlsZV9jbWQgIT0gIiJ9IHsKLQkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZpbGVfY21kfQotCQkJfQotCQkJaWYgeyRmaWxlX3ByZSAhPSAiIn0gewotCQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZmlsZV9wcmV9Ci0JCQl9Ci0JCX0KLQkJd2lua2lsbCAkc3NoX2lwdjZfcGlkCi0JCXNldCBzc2hfaXB2Nl9waWQgIiIKLQkJcmV0dXJuIDAKLQl9Ci0KLQlpZiB7JGRvdWJsZV9zc2ggIT0gIiJ9IHsKLQkJc2V0IHBsaW5rX3N0cl9kb3VibGVfc3NoICJwbGluay5leGUgLXNzaCAkcHV0dHlfYXJncyAtdCAkcHcgJGRvdWJsZV9zc2ggXCJlY2hvIHNsZWVwIDYwIC4uLjsgc2xlZXAgNjA7IGVjaG8gZG9uZS5cIiIgCi0KLQkJIyBWRgotCQlyZWdzdWIge1wuYmF0fSAkZmlsZSAiZG9iLmJhdCIgZmlsZV9kb3VibGUKLQkJc2V0IGZoZG91YmxlIFtvcGVuICRmaWxlX2RvdWJsZSAidyJdCi0JCXB1dHMgJGZoZG91YmxlICRwbGlua19zdHJfZG91YmxlX3NzaAotCQliYXRfc2xlZXAgJGZoZG91YmxlCi0JCXB1dHMgJGZoZG91YmxlICJkZWwgJGZsYWciCi0JCWlmIHshW2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19ERUxFVEUpXX0gewotCQkJcHV0cyAkZmhkb3VibGUgImRlbCAkZmlsZV9kb3VibGUiCi0JCX0KLQkJY2xvc2UgJGZoZG91YmxlCi0KLQkJc2V0IGNvbSAiY21kLmV4ZSIKLQkJaWYgW2luZm8gZXhpc3RzIGVudihDT01TUEVDKV0gewotCQkJc2V0IGNvbSAkZW52KENPTVNQRUMpCi0JCX0KLQotCQlzZXQgZmYgW29wZW4gJGZsYWcgInciXQotCQlwdXRzICRmZiAiZmxhZyIKLQkJY2xvc2UgJGZmCi0KLQkJZ2xvYmFsIGVudgotCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0JBVF9TTEVFUCldIHsKLQkJCWV4ZWMgJGNvbSAvYyBzdGFydCAkY29tIC9jICRmaWxlX2RvdWJsZSAmCi0JCX0gZWxzZSB7Ci0JCQlleGVjICRjb20gL2MgJGZpbGVfZG91YmxlICYKLQkJfQotCi0JCXNldCB3YWl0ZWQgMAotCQlzZXQgZ290aXQgMAotCQl3aGlsZSB7JHdhaXRlZCA8IDMwMDAwfSB7Ci0JCQlhZnRlciA1MDAKLQkJCXVwZGF0ZQotCQkJaWYgeyR1c2VfbGlzdGVufSB7Ci0JCQkJc2V0IGdvdGl0IDEKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNldCBucyBbZ2V0X25ldHN0YXRdCi0JCQlzZXQgcmUgIjokcF9wb3J0IgotCQkJY2hlY2tfZGVidWdfbmV0c3RhdCAkcF9wb3J0ICRucyAkd2FpdGVkCi0JCQlhcHBlbmQgcmUge1sgCV1bIAldKlswOi5dWzA6Ll0qWyAJXVsgCV0qTElTVEVOfQotCQkJaWYgW3JlZ2V4cCAkcmUgJG5zXSB7Ci0JCQkJc2V0IGdvdGl0IDEKLQkJCQlicmVhawotCQkJfQotCQkJc2V0IHdhaXRlZCBbZXhwciAiJHdhaXRlZCArIDUwMCJdCi0JCQlpZiB7IVtmaWxlIGV4aXN0cyAkZmxhZ119IHsKLQkJCQlicmVhawotCQkJfQotCQl9Ci0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZmxhZ30JCi0JCWlmIHshICRnb3RpdH0gewotCQkJYWZ0ZXIgNTAwMAotCQl9Ci0JfQotCi0JdmVuY3J5cHRfdHV0b3JpYWxfbWVzZwotCi0Jc2V0IHdkcmF3IDEKLQkjc2V0IHdkcmF3IDAKLQlpZiBbaW5mbyBleGlzdHMgZGVidWdfbmV0c3RhdF0gewotCQlpZiB7JGRlYnVnX25ldHN0YXQgIT0gIiIgJiYgJGRlYnVnX25ldHN0YXQgIT0gIjAifSB7Ci0JCQlzZXQgd2RyYXcgMAotCQl9Ci0JfQotCi0Jc2V0IGZmIFtvcGVuICRmbGFnICJ3Il0KLQlwdXRzICRmZiAiZmxhZyIKLQljbG9zZSAkZmYKLQotCWlmIHskaXNfd2luOXh9IHsKLQkJaWYgeyR3ZHJhd30gewotCQkJd20gd2l0aGRyYXcgLgotCQl9Ci0JCXVwZGF0ZQotCQl3aW45eF9wbGlua19tc2cgJGZpbGUKLQkJZ2xvYmFsIHdpbjl4X3BsaW5rX21zZ19kb25lCi0JCXNldCB3aW45eF9wbGlua19tc2dfZG9uZSAwCi0JCXZ3YWl0IHdpbjl4X3BsaW5rX21zZ19kb25lCi0JfSBlbHNlIHsKLQkJc2V0IGNvbSAiY21kLmV4ZSIKLQkJaWYgW2luZm8gZXhpc3RzIGVudihDT01TUEVDKV0gewotCQkJc2V0IGNvbSAkZW52KENPTVNQRUMpCi0JCX0KLQotCQlpZiB7JGZpbGVfcHJlICE9ICIifSB7Ci0JCQlzZXQgc2wgMAotCQkJaWYgeyR1c2Vfc21ibW50fSAgewotCQkJCWdsb2JhbCBzbWJfc3VfbW9kZQotCQkJCWlmIHskc21iX3N1X21vZGUgPT0gInN1In0gewotCQkJCQlzZXQgc2wgW2V4cHIgJHNsICsgMTVdCi0JCQkJfSBlbHNlaWYgeyRzbWJfc3VfbW9kZSA9PSAic3VkbyJ9IHsKLQkJCQkJc2V0IHNsIFtleHByICRzbCArIDE1XQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBzbCBbZXhwciAkc2wgKyAzXQotCQkJCX0KLQkJCX0KLQkJCWlmIHskcHcgPT0gIiJ9IHsKLQkJCQlzZXQgc2wgW2V4cHIgJHNsICsgNV0KLQkJCX0KLQotCQkJc2V0IHNsIFtleHByICRzbCArIDVdCi0JCQlzZXQgc3QgW2Nsb2NrIHNlY29uZHNdCi0JCQlzZXQgZHQgMAotCQkJZ2xvYmFsIGVudGVyZWRfZ3VpX3RvcCBidXR0b25fZ3VpX3RvcAotCQkJc2V0IGVudGVyZWRfZ3VpX3RvcCAwCi0JCQlzZXQgYnV0dG9uX2d1aV90b3AgMAotCi0JCQljYXRjaCB7d20gZ2VvbWV0cnkgLiAiLTQwLTQwIn0KLQkJCWNhdGNoIHt3bSB3aXRoZHJhdyAuOyB1cGRhdGU7IHdtIGRlaWNvbmlmeSAuOyByYWlzZSAuOyB1cGRhdGV9Ci0JCQltZXNnICJDbGljayBvbiAqVGhpcyogTGFiZWwgd2hlbiBkb25lIHdpdGggMXN0IFNTSCAwLyRzbCIKLQkJCWFmdGVyIDYwMAotCi0JCQlnbG9iYWwgZW52Ci0JCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0JBVF9TTEVFUCldIHsKLQkJCQlleGVjICRjb20gL2Mgc3RhcnQgJGNvbSAvYyAkZmlsZV9wcmUgJgotCQkJfSBlbHNlIHsKLQkJCQlleGVjICRjb20gL2MgJGZpbGVfcHJlICYKLQkJCX0KLQotCQkJY2F0Y2gge2xvd2VyIC47IHVwZGF0ZTsgcmFpc2UgLjsgdXBkYXRlfQotCi0JCQl3aGlsZSB7JGR0IDwgJHNsfSB7Ci0JCQkJYWZ0ZXIgMTAwCi0JCQkJc2V0IGR0IFtjbG9jayBzZWNvbmRzXQotCQkJCXNldCBkdCBbZXhwciAkZHQgLSAkc3RdCi0JCQkJbWVzZyAiQ2xpY2sgb24gKlRoaXMqIExhYmVsIHdoZW4gZG9uZSB3aXRoIDFzdCBTU0ggJGR0LyRzbCIKLQkJCQl1cGRhdGUKLQkJCQl1cGRhdGUgaWRsZXRhc2tzCi0JCQkJaWYgeyRkdCA8PSAxfSB7Ci0JCQkJCXNldCBidXR0b25fZ3VpX3RvcCAwCi0JCQkJfQotCQkJCWlmIHskYnV0dG9uX2d1aV90b3AgIT0gMCAmJiAkZHQgPj0gM30gewotCQkJCQltZXNnICJSdW5uaW5nIDJuZCBTU0ggbm93IC4uLiIKLQkJCQkJYWZ0ZXIgMTAwMAotCQkJCQlicmVhawotCQkJCX0KLQkJCX0KLQkJCW1lc2cgIlJ1bm5pbmcgMm5kIFNTSCAuLi4iCi0JCX0KLQotCQlpZiB7ISAkZG9fc2hlbGx9IHsKLQkJCW1ha2VfcGxpbmsKLQkJfQotCQlpZiB7JHdkcmF3fSB7Ci0JCQl3bSB3aXRoZHJhdyAuCi0JCX0KLQotCQl1cGRhdGUKLQkJaWYgeyRkb19zaGVsbCAmJiBbcmVnZXhwIHtGSU5JU0h9ICRwb3J0X2tub2NraW5nX2xpc3RdfSB7Ci0JCQljYXRjaCB7ZXhlYyAkY29tIC9jICRmaWxlfQotCQl9IGVsc2UgewotCQkJZ2xvYmFsIGVudgotCQkJaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19CQVRfU0xFRVApXSB7Ci0JCQkJZXhlYyAkY29tIC9jIHN0YXJ0ICRjb20gL2MgJGZpbGUgJgotCQkJfSBlbHNlIHsKLQkJCQlleGVjICRjb20gL2MgJGZpbGUgJgotCQkJfQotCQl9Ci0JCWFmdGVyIDEwMDAKLQl9Ci0KLQlpZiB7JGRvX3NoZWxsfSB7Ci0JCXdtIGRlaWNvbmlmeSAuCi0JCXVwZGF0ZQotCQlpZiB7W3JlZ2V4cCB7RklOSVNIfSAkcG9ydF9rbm9ja2luZ19saXN0XX0gewotCQkJZG9fcG9ydF9rbm9jayAkc3NoX2hvc3QgZmluaXNoCi0JCX0KLQkJcmV0dXJuIDEKLQl9Ci0Jc2V0IG1hZGVfcGxpbmsgMAotCWlmIHskaXNfd2luOXh9IHsKLQkJbWFrZV9wbGluawotCQlzZXQgbWFkZV9wbGluayAxCi0JfQotCWdsb2JhbCBwbGlua19zdGF0dXMKLQlzZXQgcGxpbmtfc3RhdHVzICIiCi0Jc2V0IHdhaXRlZCAwCi0Jc2V0IGNudCAwCi0Jd2hpbGUgeyR3YWl0ZWQgPCAzMDAwMH0gewotCQlhZnRlciA1MDAKLQkJdXBkYXRlCi0JCWlmIHskdXNlX2xpc3Rlbn0gewotCQkJc2V0IHBsaW5rX3N0YXR1cyB5ZXMKLQkJCWJyZWFrOwotCQl9Ci0JCXNldCBucyBbZ2V0X25ldHN0YXRdCi0JCXNldCByZSAiOiR1c2UiCi0JCWNoZWNrX2RlYnVnX25ldHN0YXQgJHVzZSAkbnMgJHdhaXRlZAotCQlhcHBlbmQgcmUge1sgCV1bIAldKlswOi5dWzA6Ll0qWyAJXVsgCV0qTElTVEVOfQotCQlpZiBbcmVnZXhwICRyZSAkbnNdIHsKLQkJCXNldCBwbGlua19zdGF0dXMgeWVzCi0JCX0KLQkJaWYgeyRwbGlua19zdGF0dXMgIT0gIiJ9IHsKLQkJCWNhdGNoIHtkZXN0cm95IC5wbGlua30KLQkJCWJyZWFrCi0JCX0KLQotCQlpZiB7JHdhaXRlZCA9PSAwfSB7Ci0JCQkjd20gZGVpY29uaWZ5IC5wbGluawotCQl9Ci0JCXNldCB3YWl0ZWQgW2V4cHIgIiR3YWl0ZWQgKyA1MDAiXQotCi0JCWluY3IgY250Ci0JCWlmIHskY250ID49IDEyfSB7Ci0JCQlzZXQgY250IDAKLQkJfQotCQlpZiB7IVtmaWxlIGV4aXN0cyAkZmxhZ119IHsKLQkJCXNldCBwbGlua19zdGF0dXMgZmxhZ19nb25lCi0JCQlicmVhawotCQl9Ci0JfQotCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZmxhZ30JCi0JaWYgeyRwbGlua19zdGF0dXMgPT0gIiJ9IHsKLQkJaWYgeyEgJG1hZGVfcGxpbmt9IHsKLQkJCW1ha2VfcGxpbmsKLQkJCXNldCBtYWRlX3BsaW5rIDEKLQkJfQotCQl2d2FpdCBwbGlua19zdGF0dXMKLQl9Ci0KLQlpZiB7JHVzZV9zc2hzc2x9IHsKLQkJZ2xvYmFsIGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcyAKLQkJaWYgeyRmaWxlICE9ICIifSB7Ci0JCQlhcHBlbmQgbGF1bmNoX3dpbmRvd3Nfc3NoX2ZpbGVzICIkZmlsZSAiCi0JCX0KLQkJaWYgeyRmaWxlX3ByZSAhPSAiIn0gewotCQkJYXBwZW5kIGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcyAiJGZpbGVfcHJlICIKLQkJfQotCQlpZiB7JGZpbGVfcHJlX2NtZCAhPSAiIn0gewotCQkJYXBwZW5kIGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcyAiJGZpbGVfcHJlX2NtZCAiCi0JCX0KLQkJcmVnc3ViIHsgKiR9ICRsYXVuY2hfd2luZG93c19zc2hfZmlsZXMgIiIgbGF1bmNoX3dpbmRvd3Nfc3NoX2ZpbGVzCi0JCXJldHVybiAxCi0JfQotCi0JaWYgeyRwbGlua19zdGF0dXMgIT0gInllcyJ9IHsKLQkJc2V0IG0gInVua25vd24iCi0JCWlmIHskcGxpbmtfc3RhdHVzID09ICJmbGFnX2dvbmUifSB7Ci0JCQlzZXQgbSAicGxpbmsgc2NyaXB0IGZhaWxlZCIKLQkJfSBlbHNlaWYgeyRwbGlua19zdGF0dXMgPT0gIiJ9IHsKLQkJCXNldCBtICJ0aW1lb3V0IgotCQl9Ci0JCW1lc2cgIkVycm9yICgkbSkgdG8gJGhwIgotCQl3bSBkZWljb25pZnkgLgotCX0gZWxzZSB7Ci0JCWFmdGVyIDEwMDAKLQkJZG9fdmlld2VyX3dpbmRvd3MgJG4KLQkJd20gZGVpY29uaWZ5IC4KLQkJbWVzZyAiRGlzY29ubmVjdGVkIGZyb20gJGhwIgotCX0KLQl1cGRhdGUKLQlpZiBbcmVnZXhwIHtGSU5JU0h9ICRwb3J0X2tub2NraW5nX2xpc3RdIHsKLQkJZG9fcG9ydF9rbm9jayAkc3NoX2hvc3QgZmluaXNoCi0JfQotCi0JaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX05PX0RFTEVURSldfSB7Ci0JCWlmIHskZmlsZSAhPSAiIn0gewotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmaWxlfQkKLQkJfQotCQlpZiB7JGZpbGVfcHJlICE9ICIifSB7Ci0JCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZpbGVfcHJlfQkKLQkJfQotCQlpZiB7JGZpbGVfcHJlX2NtZCAhPSAiIn0gewotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmaWxlX3ByZV9jbWR9CQotCQl9Ci0JCWlmIHskZmlsZV9kb3VibGUgIT0gIiJ9IHsKLQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZmlsZV9kb3VibGV9CQotCQl9Ci0JfQotCi0Jd2lua2lsbCAkc3NoX2lwdjZfcGlkCi0Jc2V0IHNzaF9pcHY2X3BpZCAiIgotCi0JZ2xvYmFsIHNvdW5kX2RhZW1vbl9sb2NhbF9raWxsCi0JaWYgeyEgJGlzX3dpbjl4ICYmICR1c2Vfc291bmQgJiYgJHNvdW5kX2RhZW1vbl9sb2NhbF9raWxsICYmICRzb3VuZF9kYWVtb25fbG9jYWxfY21kICE9ICIifSB7Ci0JCXdpbmRvd3Nfc3RvcF9zb3VuZF9kYWVtb24KLQl9Ci0JcmV0dXJuIDEKLX0KLQotcHJvYyBjaGVja19zc2hfbmVlZGVkIHt9IHsKLQlnbG9iYWxpemUKLQkKLQlpZiB7JHVzZV9zc2ggfHwgJHVzZV9zc2hzc2x9IHsKLQkJcmV0dXJuCi0JfQotCXNldCBtdXN0X2N1cHMgMAotCXNldCBtdXN0X3NuZCAwCi0Jc2V0IG11c3Rfc21iIDAKLQlzZXQgbXVzdF9hZGRsIDAKLQlpZiB7JHVzZV9jdXBzfSB7Ci0JCWlmIHskY3Vwc19sb2NhbF9zZXJ2ZXIgIT0gIiJ9IHtzZXQgbXVzdF9jdXBzIDF9Ci0JCWlmIHskY3Vwc19yZW1vdGVfcG9ydCAhPSAiIn0ge3NldCBtdXN0X2N1cHMgMX0KLQkJaWYgeyRjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgIT0gIiJ9IHtzZXQgbXVzdF9jdXBzIDF9Ci0JCWlmIHskY3Vwc19yZW1vdGVfc21iX3BvcnQgIT0gIiJ9IHtzZXQgbXVzdF9jdXBzIDF9Ci0JCWlmIHskY3Vwc19tYW5hZ2VfcmNmaWxlICE9ICIifSB7c2V0IG11c3RfY3VwcyAxfQotCX0KLQlpZiB7JHVzZV9zb3VuZH0gewotCQlpZiB7JHNvdW5kX2RhZW1vbl9yZW1vdGVfY21kICE9ICIifSB7c2V0IG11c3Rfc25kIDF9Ci0JCWlmIHskc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0ICE9ICIifSB7c2V0IG11c3Rfc25kIDF9Ci0JCWlmIHskc291bmRfZGFlbW9uX2tpbGx9IHtzZXQgbXVzdF9zbmQgMX0KLQkJaWYgeyRzb3VuZF9kYWVtb25fcmVzdGFydH0ge3NldCBtdXN0X3NuZCAxfQotCQlpZiB7JHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgIT0gIiJ9IHtzZXQgbXVzdF9zbmQgMX0KLQkJaWYgeyRzb3VuZF9kYWVtb25fbG9jYWxfcG9ydCAhPSAiIn0ge3NldCBtdXN0X3NuZCAxfQotCQlpZiB7JHNvdW5kX2RhZW1vbl9sb2NhbF9raWxsfSB7c2V0IG11c3Rfc25kIDF9Ci0JCWlmIHskc291bmRfZGFlbW9uX2xvY2FsX3N0YXJ0fSB7c2V0IG11c3Rfc25kIDF9Ci0JfQotCWlmIHskdXNlX3NtYm1udH0gewotCQlpZiB7W3JlZ2V4cCB7Ly99ICRzbWJfbW91bnRfbGlzdF19IHtzZXQgbXVzdF9zbWIgMX0KLQl9Ci0JaWYgeyRhZGRpdGlvbmFsX3BvcnRfcmVkaXJzfSB7Ci0JCXNldCBtdXN0X2FkZGwgMQotCX0KLQlpZiB7JG11c3RfY3VwcyB8fCAkbXVzdF9zbmQgfHwgJG11c3Rfc21iIHx8ICRtdXN0X2FkZGx9IHsKLQkJbWVzZyAiQ2Fubm90IGRvIFBvcnQgcmVkaXJzIGluIG5vbi1TU0ggbW9kZSAoU1NMKSIKLQkJc2V0IG1zZyAiIgotCQlpZiB7JG11c3Rfc21ifSB7Ci0JCQlhcHBlbmQgbXNnICIgIC0gU01CIE1vdW50IFBvcnQgUmVkaXJlY3Rpb25cbiIKLQkJfQotCQlpZiB7JG11c3Rfc25kfSB7Ci0JCQlhcHBlbmQgbXNnICIgIC0gRVNEIFNvdW5kIFBvcnQgUmVkaXJlY3Rpb25cbiIKLQkJfQotCQlpZiB7JG11c3RfY3Vwc30gewotCQkJYXBwZW5kIG1zZyAiICAtIENVUFMgUG9ydCBSZWRpcmVjdGlvblxuIgotCQl9Ci0JCWlmIHskbXVzdF9hZGRsfSB7Ci0JCQlhcHBlbmQgbXNnICIgIC0gQWRkaXRpb25hbCBQb3J0IFJlZGlyZWN0aW9uc1xuIgotCQl9Ci0gICAgICAgICAgICAgICAgc2V0IG1zZyAiXCJVc2UgU1NMXCIgbW9kZSBzZWxlY3RlZCAobm8gU1NIKVxuVGhlIGZvbGxvd2luZyBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQ6XG5cbiRtc2ciCi0JCWJlbGwKLQkJdXBkYXRlCi0JCXJhaXNlIC4KLSAgICAgICAgICAgICAgICB0a19tZXNzYWdlQm94IC10eXBlIG9rIC1pY29uIGluZm8gLW1lc3NhZ2UgJG1zZwotCX0KLX0KLQotcHJvYyBzZXRfc21iX21vdW50cyB7fSB7Ci0JZ2xvYmFsIHNtYl9yZWRpcl8wIHNtYl9tb3VudHMgdXNlX3NtYm1udCAKLQkKLQlzZXQgc21iX3JlZGlyXzAgIiIKLQlzZXQgc21iX21vdW50cyAiIgotCWlmIHskdXNlX3NtYm1udH0gewotCQlzZXQgbDIgW2dldF9zbWJfcmVkaXJdCi0JCXNldCBzbWJfcmVkaXJfMCBbbGluZGV4ICRsMiAwXQotCQlzZXQgc21iX3JlZGlyXzAgW3N0cmluZyB0cmltICRzbWJfcmVkaXJfMF0KLQkJc2V0IHNtYl9tb3VudHMgIFtsaW5kZXggJGwyIDFdCi0JfQotfQotCi1wcm9jIG15dG1wIHt0bXB9IHsKLQlnbG9iYWwgaXNfd2luZG93cyBta3RlbXAgZW52Ci0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJcmV0dXJuICR0bXAKLQl9Ci0KLQlpZiB7ISBbaW5mbyBleGlzdHMgbWt0ZW1wXX0gewotCQlzZXQgbWt0ZW1wICIiCi0JCWZvcmVhY2ggZGlyIHsvYmluIC91c3IvYmluIC91c3IvbG9jYWwvYmlufSB7Ci0JCQlpZiBbZmlsZSBleGlzdHMgIiRkaXIvbWt0ZW1wIl0gewotCQkJCXNldCBta3RlbXAgIiRkaXIvbWt0ZW1wIgotCQkJCWJyZWFrCi0JCQl9Ci0JCX0KLQl9Ci0JaWYgeyRta3RlbXAgIT0gIiJ9IHsKLQkJc2V0IHRtcDIgIiIKLQkJY2F0Y2gge3NldCB0bXAyIFtleGVjICRta3RlbXAgIiR0bXAuWFhYWFhYIl19Ci0JCWlmIFtmaWxlIGV4aXN0cyAkdG1wMl0gewotCQkJaWYgW2luZm8gZXhpc3RzIGVudihERUJVR19NS1RFTVApXSB7Ci0JCQkJcHV0cyBzdGRlcnIgIm15dG1wOiAkdG1wMiIKLQkJCX0KLQkJCXJldHVybiAkdG1wMgotCQl9Ci0JfQotCWNhdGNoIHtleGVjIHJtIC1mICR0bXB9Ci0JY2F0Y2gge2ZpbGUgZGVsZXRlICR0bXB9Ci0JaWYgW2ZpbGUgZXhpc3RzICR0bXBdIHsKLQkJcHV0cyBzdGRlcnIgInRtcCBmaWxlIHN0aWxsIGV4aXN0czogJHRtcCIKLQkJZXhpdCAxCi0JfQotCWNhdGNoIHtleGVjIHRvdWNoICR0bXB9Ci0JY2F0Y2gge2V4ZWMgY2htb2QgNjAwICR0bXB9Ci0JaWYgW2luZm8gZXhpc3RzIGVudihERUJVR19NS1RFTVApXSB7Ci0JCXB1dHMgc3RkZXJyICJteXRtcDogJHRtcCIKLQl9Ci0JcmV0dXJuICR0bXAKLX0KLQotcHJvYyBkYXJ3aW5fdGVybWluYWxfY21kIHt7dGl0bGUgIiJ9IHtjbWQgIiJ9IHtiZyAwfX0gewotCWdsb2JhbCBkYXJ3aW5fdGVybWluYWwKLQotCXNldCB0cmllcyAiIgotCWxhcHBlbmQgdHJpZXMgIi9BcHBsaWNhdGlvbnMvVXRpbGl0aWVzL1Rlcm1pbmFsLmFwcC9Db250ZW50cy9NYWNPUy9UZXJtaW5hbCIKLQotCWlmIHshIFtpbmZvIGV4aXN0cyBkYXJ3aW5fdGVybWluYWxdfSB7Ci0JCWZvcmVhY2ggdHJ5ICR0cmllcyB7Ci0JCQlpZiBbZmlsZSBleGlzdHMgJHRyeV0gewotCQkJCWlmIFtmaWxlIGV4ZWN1dGFibGUgJHRyeV0gewotCQkJCQlzZXQgZGFyd2luX3Rlcm1pbmFsICR0cnkKLQkJCQkJYnJlYWsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgeyEgW2luZm8gZXhpc3RzIGRhcndpbl90ZXJtaW5hbF19IHsKLQkJCXNldCBmaCAiIgotCQkJY2F0Y2gge3NldCBmaCBbb3BlbiAifCBmaW5kIC9BcHBsaWNhdGlvbnMgLXR5cGUgZiAtbmFtZSBUZXJtaW5hbCIgInIiXX0KLQkJCWlmIHskZmggIT0gIiJ9IHsKLQkJCQl3aGlsZSB7W2dldHMgJGZoIGxpbmVdID4gLTF9IHsKLQkJCQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRsaW5lXX0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJGxpbmVdfSB7Ci0JCQkJCQljb250aW51ZQotCQkJCQl9Ci0JCQkJCWlmIHshIFtyZWdleHAgey9UZXJtaW5hbCR9ICRsaW5lXX0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlpZiB7ISBbZmlsZSBleGVjdXRhYmxlICRsaW5lXX0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlzZXQgZGFyd2luX3Rlcm1pbmFsICRsaW5lCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJCWNsb3NlICRmaAotCQkJfQotCQl9Ci0JfQotCWlmIHshIFtpbmZvIGV4aXN0cyBkYXJ3aW5fdGVybWluYWxdfSB7Ci0JCXJhaXNlIC4KLQkJdGtfbWVzc2FnZUJveCAtdHlwZSBvayAtaWNvbiBlcnJvciAtbWVzc2FnZSAiQ2Fubm90IGZpbmQgRGFyd2luIFRlcm1pbmFsIHByb2dyYW0uIiAtdGl0bGUgIkNhbm5vdCBmaW5kIFRlcm1pbmFsIHByb2dyYW0iCi0JCW1hY19yYWlzZQotCQlyZXR1cm4KLQl9Ci0KLQlnbG9iYWwgZGFyd2luX3Rlcm1pbmFsX2NudAotCXNldCB0bXAgL3RtcC9kYXJ3aW5fdGVybWluYWxfY21kLlt0cGlkXQotCWlmIHshIFtpbmZvIGV4aXN0cyBkYXJ3aW5fdGVybWluYWxfY250XX0gewotCQlzZXQgZGFyd2luX3Rlcm1pbmFsX2NudCAwCi0JfQotCWluY3IgZGFyd2luX3Rlcm1pbmFsX2NudAotCWFwcGVuZCB0bXAgIi4kZGFyd2luX3Rlcm1pbmFsX2NudCIKLQlzZXQgdG1wIFtteXRtcCAkdG1wXQotCQotCXNldCBmaCAiIgotCWNhdGNoIHtzZXQgZmggW29wZW4gJHRtcCB3IDA3NTVdfQotCWNhdGNoIHtbZXhlYyBjaG1vZCA3NTUgJHRtcF19Ci0JaWYgeyRmaCA9PSAiIn0gewotCQlyYWlzZSAuCi0JCXRrX21lc3NhZ2VCb3ggLXR5cGUgb2sgLWljb24gZXJyb3IgLW1lc3NhZ2UgIkNhbm5vdCBvcGVuIHRlbXBvcmFyeSBmaWxlOiAkdG1wIiAtdGl0bGUgIkNhbm5vdCBvcGVuIGZpbGUiCi0JCW1hY19yYWlzZQotCQlyZXR1cm4KLQl9Ci0JZ2xvYmFsIGVudgotCXB1dHMgJGZoICIjIS9iaW4vc2giCi0JcHV0cyAkZmggIlBBVEg9JGVudihQQVRIKSIKLQlwdXRzICRmaCAiZXhwb3J0IFBBVEgiCi0JcHV0cyAkZmggInRtcD0kdG1wIgotCXB1dHMgJGZoICJzbGVlcCAxIgotCXB1dHMgJGZoIHtpZiBbICJYJEREREJHIiAhPSAiWCIgXTsgdGhlbiBwcyB3d3c7IGZpfQotCXB1dHMgJGZoIHt0ZXJtcGlkPWBwcyB3d3cgfCBncmVwIC13IFRlcm1pbmFsIHwgZ3JlcCAkdG1wIHwgZ3JlcCAtdiBncmVwIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNvcnQgLW4gfCB0YWlsIC0xYH0KLQlwdXRzICRmaCB7ZWNobyB0cnktMTogdGVybXBpZD0kdGVybXBpZCBteXBpZD0kJH0KLQlwdXRzICRmaCB7aWYgWyAiWCR0ZXJtcGlkIiA9ICJYIiBdOyB0aGVufQotCXB1dHMgJGZoIHsJdGVybXBpZD1gcHMgd3d3IHwgZ3JlcCAtdyBUZXJtaW5hbCB8IGdyZXAgLXYgZ3JlcCB8IGF3ayAne3ByaW50ICQxfScgfCBzb3J0IC1uIHwgdGFpbCAtMWB9Ci0JcHV0cyAkZmggewllY2hvIHRyeS0yOiB0ZXJtcGlkPSR0ZXJtcGlkIG15cGlkPSQkfQotCXB1dHMgJGZoIHtmaX0KLQlwdXRzICRmaCB7aWYgWyAiWCR0ZXJtcGlkIiA9ICJYIiBdOyB0aGVufQotCXB1dHMgJGZoIHsJdGVybXBpZD1gcHMgd3d3d2F1eCB8IGdyZXAgLXcgVGVybWluYWwgfCBncmVwICR0bXAgfCBncmVwIC12IGdyZXAgfCBhd2sgJ3twcmludCAkMn0nIHwgc29ydCAtbiB8IHRhaWwgLTFgfQotCXB1dHMgJGZoIHsJZWNobyB0cnktMzogdGVybXBpZD0kdGVybXBpZCBteXBpZD0kJH0KLQlwdXRzICRmaCB7Zml9Ci0JcHV0cyAkZmgge2lmIFsgIlgkdGVybXBpZCIgPSAiWCIgXTsgdGhlbn0KLQlwdXRzICRmaCB7CXRlcm1waWQ9JCR9Ci0JcHV0cyAkZmggewllY2hvIHRlcm1waWQtZmluZC1mYWlsOiB0ZXJtcGlkPSR0ZXJtcGlkIG15cGlkPSQkfQotCXB1dHMgJGZoIHtmaX0KLQlwdXRzICRmaCB7dHJhcCAicm0gLWYgJHRtcDsga2lsbCAtVEVSTSAkdGVybXBpZDsga2lsbCAtVEVSTSAkbXlwaWQ7IGtpbGwgLUtJTEwgJG15cGlkOyBleGl0IDAiIDAgMiAxNX0KLQlwdXRzICRmaCB7b3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJUZXJtaW5hbCIgdG8gYWN0aXZhdGUnID4vZGV2L251bGwgMj4mMSAmfQotCXB1dHMgJGZoICIkY21kIgotCXB1dHMgJGZoICJzbGVlcCAxIgotCXB1dHMgJGZoIHtybSAtZiAkdG1wfQotCXB1dHMgJGZoIHtraWxsIC1URVJNICR0ZXJtcGlkfQotCXB1dHMgJGZoIHtraWxsIC1URVJNICRteXBpZH0KLQlwdXRzICRmaCB7a2lsbCAtS0lMTCAkbXlwaWR9Ci0JcHV0cyAkZmggImV4aXQgMCIKLQljbG9zZSAkZmgKLQlpZiB7JGJnfSB7Ci0JCWNhdGNoIHtleGVjICRkYXJ3aW5fdGVybWluYWwgJHRtcCAmfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHtleGVjICRkYXJ3aW5fdGVybWluYWwgJHRtcH0KLQl9Ci19Ci0KLXByb2MgdW5peF90ZXJtaW5hbF9jbWQge3tnZW9tZXRyeSAiKzEwMCsxMDAifSB7dGl0bGUgInh0ZXJtLWNvbW1hbmQifSB7Y21kICJlY2hvIHRlc3QifSB7YmcgMH0ge3hybTEgIiJ9IHt4cm0yICIifSB7eHJtMyAiIn19IHsKLQlnbG9iYWwgdW5hbWUgZW52Ci0JaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQlnbG9iYWwgZW52Ci0JCXNldCBkb1ggIDA7Ci0JCWlmIHshICRkb1h9IHsKLQkJCWRhcndpbl90ZXJtaW5hbF9jbWQgJHRpdGxlICRjbWQgJGJnCi0JCQlyZXR1cm4KLQkJfQotCX0KLQotCWdsb2JhbCBjaGVja2VkX2Zvcl94dGVybQotCWlmIHshW2luZm8gZXhpc3RzIGNoZWNrZWRfZm9yX3h0ZXJtXX0gewotCQlzZXQgcCAiIgotCQlzZXQgciBbY2F0Y2gge3NldCBwIFtleGVjIC9iaW4vc2ggLWMge3R5cGUgeHRlcm19XX1dCi0JCXNldCBjaGVja2VkX2Zvcl94dGVybSAxCi0JCWlmIHskciAhPSAwfSB7Ci0JCQlzZXQgcCBbZXhlYyAvYmluL3NoIC1jIHt0eXBlIHh0ZXJtIDI+JjE7IGV4aXQgMH1dCi0JCQlzZXQgdHh0ICJQcm9ibGVtIGZpbmRpbmcgdGhlICd4dGVybScgY29tbWFuZDpcblxuJHBcblxuIgotCQkJYXBwZW5kIHR4dCAiUGVyaGFwcyB5b3UgbmVlZCB0byBpbnN0YWxsIGEgcGFja2FnZSBjb250YWluaW5nICd4dGVybScgIChTaWdoLi4uKVxuXG4iCi0JCQlmZXRjaF9kaWFsb2cgJHR4dCAieHRlcm0iICJ4dGVybSIgMCBbbGluZV9jb3VudCAkdHh0XQotCQkJdXBkYXRlCi0JCQlhZnRlciAxMDAwCi0JCQljYXRjaCB7dGt3YWl0IHdpbmRvdyAuZmV0Y2h9Ci0JCQl1cGRhdGUKLQkJfQotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfWFRFUk1fUkVQTEFDRU1FTlQpXSB7Ci0JCXNldCB0Y21kICRlbnYoU1NWTkNfWFRFUk1fUkVQTEFDRU1FTlQpCi0JCWlmIHskdGNtZCAhPSAiIn0gewotCQkJcmVnc3ViIC1hbGwgeyVHRU9NRVRSWX0gJHRjbWQgJGdlb21ldHJ5IHRjbWQKLQkJCXJlZ3N1YiAtYWxsIHslVElUTEV9ICR0Y21kICR0aXRsZSB0Y21kCi0KLQkJCXNldCB0bXAxIC90bXAveHRlcm1fcmVwbGFjZW1lbnQxLlt0cGlkXQotCQkJc2V0IHRtcDEgW215dG1wICR0bXAxXQotCQkJc2V0IGZoMSAiIgotCQkJY2F0Y2gge3NldCBmaDEgW29wZW4gJHRtcDEgInciXX0KLQotCQkJc2V0IHRtcDIgL3RtcC94dGVybV9yZXBsYWNlbWVudDIuW3RwaWRdCi0JCQlzZXQgdG1wMiBbbXl0bXAgJHRtcDJdCi0JCQlzZXQgZmgyICIiCi0JCQljYXRjaCB7c2V0IGZoMiBbb3BlbiAkdG1wMiAidyJdfQotCQkJaWYgeyRmaDEgIT0gIiIgJiYgJGZoMiAhPSAiIn0gewotCQkJCXB1dHMgJGZoMSAiIyEvYmluL3NoIjsKLQkJCQlwdXRzICRmaDEgIiRjbWQiCi0JCQkJcHV0cyAkZmgxICJybSAtZiAkdG1wMSIKLQkJCQljbG9zZSAkZmgxCi0JCQkJY2F0Y2gge2V4ZWMgY2htb2QgNzU1ICR0bXAxfQotCQkJCXB1dHMgJGZoMiAiIyEvYmluL3NoIgotCQkJCXB1dHMgJGZoMiAiJHRjbWQgJHRtcDEiCi0JCQkJcHV0cyAkZmgyICJybSAtZiAkdG1wMiIKLQkJCQljbG9zZSAkZmgyCi0JCQkJY2F0Y2gge2V4ZWMgY2htb2QgNzU1ICR0bXAyfQotCQkJCWlmIHskYmd9IHsKLQkJCQkJZXhlYyAkdG1wMiAyPkBzdGRvdXQgJgotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4ZWMgJHRtcDIgMj5Ac3Rkb3V0Ci0JCQkJfQotCQkJCXJldHVybgotCQkJfQotCQkJY2F0Y2gge2Nsb3NlICRmaDF9Ci0JCQljYXRjaCB7Y2xvc2UgJGZoMn0KLQkJfQotCX0KLQotCWlmIHskYmd9IHsKLQkJaWYgeyR4cm0xID09ICIifSB7Ci0JCQlleGVjIHh0ZXJtIC1zYiAtc2wgMjAwMCAtZ2VvbWV0cnkgIiRnZW9tZXRyeSIgLXRpdGxlICIkdGl0bGUiIC1lIHNoIC1jICIkY21kIiAyPkBzdGRvdXQgJgotCQl9IGVsc2UgewotCQkJZXhlYyB4dGVybSAtc2IgLXNsIDIwMDAgLWdlb21ldHJ5ICIkZ2VvbWV0cnkiIC10aXRsZSAiJHRpdGxlIiAteHJtICIkeHJtMSIgLXhybSAiJHhybTIiIC14cm0gIiR4cm0zIiAtZSBzaCAtYyAiJGNtZCIgMj5Ac3Rkb3V0ICYKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIHskeHJtMSA9PSAiIn0gewotCQkJZXhlYyB4dGVybSAtc2IgLXNsIDIwMDAgLWdlb21ldHJ5ICIkZ2VvbWV0cnkiIC10aXRsZSAiJHRpdGxlIiAtZSBzaCAtYyAiJGNtZCIgMj5Ac3Rkb3V0Ci0JCX0gZWxzZSB7Ci0JCQlleGVjIHh0ZXJtIC1zYiAtc2wgMjAwMCAtZ2VvbWV0cnkgIiRnZW9tZXRyeSIgLXRpdGxlICIkdGl0bGUiIC14cm0gIiR4cm0xIiAteHJtICIkeHJtMiIgLXhybSAiJHhybTMiIC1lIHNoIC1jICIkY21kIiAyPkBzdGRvdXQKLQkJfQotCX0KLX0KLQotcHJvYyB4dGVybV9jZW50ZXJfZ2VvbWV0cnkge30gewotCXNldCBzaCBbd2luZm8gc2NyZWVuaGVpZ2h0IC5dCi0Jc2V0IHN3IFt3aW5mbyBzY3JlZW53aWR0aCAuXQotCXNldCBndyA1MDAKLQlzZXQgZ2ggMzAwCi0Jc2V0IHggW2V4cHIgJHN3LzIgLSAkZ3cvMl0KLQlzZXQgeSBbZXhwciAkc2gvMiAtICRnaC8yXQotCWlmIHskeCA8IDB9IHsKLQkJc2V0IHggMTAKLQl9Ci0JaWYgeyR5IDwgMH0gewotCQlzZXQgeSAxMAotCX0KLQotCXJldHVybiAiKyR4KyR5IgotfQotCi1wcm9jIHNtYm1udF93YWl0IHt0ZWV9IHsKLQlpZiB7JHRlZSAhPSAiIn0gewotCQlzZXQgc3RhcnQgW2Nsb2NrIHNlY29uZHNdCi0JCXNldCBjdXQgMzAKLQkJd2hpbGUgezF9IHsKLQkJCXNldCBub3cgW2Nsb2NrIHNlY29uZHNdCi0JCQlpZiB7JG5vdyA+ICRzdGFydCArICRjdXR9IHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIFtmaWxlIGV4aXN0cyAkdGVlXSB7Ci0JCQkJc2V0IHN6IDAKLQkJCQljYXRjaCB7c2V0IHN6IFtmaWxlIHNpemUgJHRlZV19Ci0JCQkJaWYgeyRzeiA+IDUwfSB7Ci0JCQkJCXNldCBjdXQgNTAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXQgZyAiIgotCQkJY2F0Y2gge3NldCBnIFtleGVjIGdyZXAgbWFpbi12bmMtaGVscGVyLWZpbmlzaGVkICR0ZWVdfQotCQkJaWYgW3JlZ2V4cCB7bWFpbi12bmMtaGVscGVyLWZpbmlzaGVkfSAkZ10gewotCQkJCWJyZWFrCi0JCQl9Ci0JCQlhZnRlciAxMDAwCi0JCX0KLQkJY2F0Y2gge2ZpbGUgZGVsZXRlICR0ZWV9Ci0JfSBlbHNlIHsKLQkJZ2xvYmFsIHNtYl9zdV9tb2RlCi0JCWlmIHskc21iX3N1X21vZGUgPT0gInN1In0gewotCQkJYWZ0ZXIgMTUwMDAKLQkJfSBlbHNlaWYgeyRzbWJfc3VfbW9kZSA9PSAic3VkbyJ9IHsKLQkJCWFmdGVyIDEwMDAwCi0JCX0KLQl9Ci19Ci0KLXByb2MgZG9fdW5peF9wcmUge3RhZyBwcm94eSBocCBwa19ocH0gIHsKLQlnbG9iYWwgZW52IHNtYl9yZWRpcl8wIHVzZV9zbWJtbnQKLQlnbG9iYWwgZGlkX3BvcnRfa25vY2sKLQkKLQlzZXQgc2V0dXBfY21kcyBbdWdseV9zZXR1cF9zY3JpcHRzIHByZSAkdGFnXSAKLQlzZXQgYyAic3Nfdm5jdmlld2VyIC1zc2giCi0KLQlpZiB7JHByb3h5ID09ICIifSB7Ci0JCXNldCBweHkgJGhwCi0JCXJlZ3N1YiB7OlswLTldWzAtOV0qJH0gJHB4eSAiIiBweHkKLQkJc2V0IGMgIiRjIC1wcm94eSAnJHB4eSciCi0JfSBlbHNlIHsKLQkJc2V0IGMgIiRjIC1wcm94eSAnJHByb3h5JyIKLQl9Ci0KLQlpZiB7JHNldHVwX2NtZHMgIT0gIiJ9IHsKLQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX0NNRCkgIiRzZXR1cF9jbWRzIHNsZWVwIDEwIgotCQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9TU0hfT05MWSkgMQotCQlpZiB7JHNtYl9yZWRpcl8wICE9ICIifSB7Ci0JCQlzZXQgYyAiJGMgLXNzaGFyZ3MgJyRzbWJfcmVkaXJfMCciCi0JCX0KLQotCQlpZiB7ISBbZG9fcG9ydF9rbm9jayAkcGtfaHAgc3RhcnRdfSB7Ci0JCQlyZXR1cm4KLQkJfQotCQlzZXQgZGlkX3BvcnRfa25vY2sgMQotCi0JCWlmIHskdXNlX3NtYm1udH0gewotCQkJc2V0IHRpdGxlICJTU0wvU1NIIFZOQyBWaWV3ZXIgJGhwIC0tIFNNQiBNT1VOVFMiCi0JCX0gZWxzZSB7Ci0JCQlzZXQgdGl0bGUgIlNTTC9TU0ggVk5DIFZpZXdlciAkaHAgLS0gUHJlIENvbW1hbmRzIgotCQl9Ci0KLQkJc2V0IHRlZSAiIgotCQlpZiB7JHVzZV9zbWJtbnR9IHsKLQkJCXNldCB0ZWUgJGVudihTU1ZOQ19IT01FKSAKLQkJCWFwcGVuZCB0ZWUgIi8udGVlLWV0diR0YWciCi0JCQlzZXQgZmggIiIKLQkJCWNhdGNoIHtzZXQgZmggW29wZW4gJHRlZSAidyJdfQotCQkJaWYgeyRmaCA9PSAiIn0gewotCQkJCXNldCB0ZWUgIiIKLQkJCX0gZWxzZSB7Ci0JCQkJY2xvc2UgJGZoCi0JCQkJc2V0IGMgIiRjIHwgdGVlICR0ZWUiCi0JCQl9Ci0JCX0KLQotCQl1bml4X3Rlcm1pbmFsX2NtZCAiODB4MjUrMTAwKzEwMCIgIiR0aXRsZSIgInNldCAteHY7ICRjIiAxCi0KLQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX0NNRCkgIiIKLQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX09OTFkpICIiCi0KLQkJaWYgeyR1c2Vfc21ibW50fSB7Ci0JCQlzbWJtbnRfd2FpdCAkdGVlCi0JCX0gZWxzZSB7Ci0JCQlhZnRlciAyMDAwCi0JCX0KLQl9Ci19Ci1wcm9jIGluaXRfdm5jZGlzcGxheSB7fSB7Ci0JZ2xvYmFsIHZuY2Rpc3BsYXkgdm5jcHJveHkgcmVtb3RlX3NzaF9jbWQKLQlzZXQgdm5jZGlzcGxheSBbc3RyaW5nIHRyaW0gJHZuY2Rpc3BsYXldIAotCi0JaWYgeyR2bmNkaXNwbGF5ID09ICIifSB7Ci0JCXNldCB2bmNwcm94eSAiIgotCQlzZXQgcmVtb3RlX3NzaF9jbWQgIiIKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IGhwbmV3ICBbZ2V0X3NzaF9ocCAkdm5jZGlzcGxheV0KLQlzZXQgcHJveHkgIFtnZXRfc3NoX3Byb3h5ICR2bmNkaXNwbGF5XQotCXNldCBzc2hjbWQgW2dldF9zc2hfY21kICR2bmNkaXNwbGF5XQotCi0Jc2V0IHZuY2Rpc3BsYXkgJGhwbmV3Ci0Jc2V0IHZuY3Byb3h5ICRwcm94eQotCXNldCByZW1vdGVfc3NoX2NtZCAkc3NoY21kCi0KLQlnbG9iYWwgc3NoX29ubHkgdHNfb25seQotCWlmIHskc3NoY21kICE9ICIiIHx8ICRzc2hfb25seSB8fCAkdHNfb25seX0gewotCQlnbG9iYWwgdXNlX3NzbCB1c2Vfc3NoIHVzZV9zc2hzc2wKLQkJc2V0IHVzZV9zc2wgMAotCQlpZiB7ISAkdXNlX3NzaCAmJiAhICR1c2Vfc3Noc3NsfSB7Ci0JCQlzZXQgdXNlX3NzaCAxCi0JCX0KLQl9Ci0JIyBzc2xfc3NoX2FkanVzdCB3aWxsIGJlIGNhbGxlZC4KLX0KLQotcHJvYyBnZXRfdm5jZGlzcGxheSB7fSB7Ci0JZ2xvYmFsIHZuY2Rpc3BsYXkgdm5jcHJveHkgcmVtb3RlX3NzaF9jbWQKLQlzZXQgdm5jZGlzcGxheSBbc3RyaW5nIHRyaW0gJHZuY2Rpc3BsYXldCi0KLQlzZXQgdCAkdm5jZGlzcGxheQotCXJlZ3N1YiB7WyBcdF0qY21kPS4qJH0gJHQgIiIgdAotCXNldCB0IFtzdHJpbmcgdHJpbSAkdF0KLQkKLQlzZXQgc3RyICIiCi0JaWYgW3JlZ2V4cCB7WyBcdF19ICR0XSB7Ci0JCXNldCBzdHIgJHQKLQl9IGVsc2UgewotCQlpZiB7JHZuY3Byb3h5ICE9ICIiICYmICR0ID09ICIifSB7Ci0JCQlzZXQgc3RyICItLW5vaG9zdC0tICR2bmNwcm94eSIKLQkJfSBlbHNlIHsKLQkJCXNldCBzdHIgIiR0ICR2bmNwcm94eSIKLQkJfQotCX0KLQlpZiBbcmVnZXhwIHtjbWQ9LiokfSAkdm5jZGlzcGxheSBtYXRjaF0gewotCQlpZiB7JHN0ciA9PSAiIn0gewotCQkJc2V0IHN0ciAiLS1ub2hvc3QtLSIKLQkJfQotCQlzZXQgc3RyICIkc3RyICRtYXRjaCIKLQl9IGVsc2UgewotCQlpZiB7JHJlbW90ZV9zc2hfY21kICE9ICIifSB7Ci0JCQlpZiB7JHN0ciA9PSAiIn0gewotCQkJCXNldCBzdHIgIi0tbm9ob3N0LS0iCi0JCQl9Ci0JCQlzZXQgc3RyICIkc3RyIGNtZD0kcmVtb3RlX3NzaF9jbWQiCi0JCX0KLQl9Ci0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlyZXR1cm4gJHN0cgotfQotCi1wcm9jIHBvcnRfa25vY2tfb25seSB7aHAge21vZGUgS05PQ0t9fSB7Ci0JaWYgeyRocCA9PSAiIn0gewotCQlzZXQgaHAgW2dldF92bmNkaXNwbGF5XQotCQlpZiB7JGhwID09ICIifSB7Ci0JCQltZXNnICJObyBob3N0IHBvcnQgZm91bmQiCi0JCQliZWxsCi0JCQlyZXR1cm4KLQkJfQotCX0KLQlzZXQgaHBuZXcgIFtnZXRfc3NoX2hwICRocF0KLQlzZXQgcHJveHkgIFtnZXRfc3NoX3Byb3h5ICRocF0KLQlzZXQgc3NoY21kIFtnZXRfc3NoX2NtZCAkaHBdCi0Jc2V0IGhwICRocG5ldwotCi0Jc2V0IHBrX2hwICIiCi0JaWYgeyRwcm94eSAhPSAiIn0gewotCQlzZXQgcGtfaHAgJHByb3h5Ci0JfQotCWlmIHskcGtfaHAgPT0gIiJ9IHsKLQkJc2V0IHBrX2hwICRocAotCX0KLQlpZiB7JG1vZGUgPT0gIktOT0NLIn0gewotCQlkb19wb3J0X2tub2NrICRwa19ocCBzdGFydAotCX0gZWxzZWlmIHskbW9kZSA9PSAiRklOSVNIIn0gewotCQlkb19wb3J0X2tub2NrICRwa19ocCBmaW5pc2gKLQl9Ci19Ci0KLXByb2MgZGlyZWN0X2Nvbm5lY3RfbXNnIHt9IHsKLQlzZXQgbXNnICIiCi0JZ2xvYmFsIGVudgotCWdsb2JhbGl6ZQotCWlmIHskdXNlX3NzaHNzbH0gewotCQlhcHBlbmQgbXNnICIgIC0gU1NIICsgU1NMIHR1bm5lbGxpbmdcbiIKLQl9IGVsc2VpZiB7JHVzZV9zc2h9IHsKLQkJYXBwZW5kIG1zZyAiICAtIFNTSCB0dW5uZWxsaW5nXG4iCi0JfSBlbHNlIHsKLQkJYXBwZW5kIG1zZyAiICAtIFNTTCB0dW5uZWxsaW5nXG4iCi0JfQotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTk9fRU5DX1dBUk4pXSB7Ci0JCXNldCBtc2cgIiIKLQl9Ci0JaWYgeyR1c2Vfc21ibW50fSB7Ci0JCWFwcGVuZCBtc2cgIiAgLSBTTUIgTW91bnQgUG9ydCBSZWRpcmVjdGlvblxuIgotCX0KLQlpZiB7JHVzZV9zb3VuZH0gewotCQlhcHBlbmQgbXNnICIgIC0gRVNEIFNvdW5kIFBvcnQgUmVkaXJlY3Rpb25cbiIKLQl9Ci0JaWYgeyR1c2VfY3Vwc30gewotCQlhcHBlbmQgbXNnICIgIC0gQ1VQUyBQb3J0IFJlZGlyZWN0aW9uXG4iCi0JfQotCWlmIHskYWRkaXRpb25hbF9wb3J0X3JlZGlyc30gewotCQlhcHBlbmQgbXNnICIgIC0gQWRkaXRpb25hbCBQb3J0IFJlZGlyZWN0aW9uc1xuIgotCX0KLQlpZiB7JG15Y2VydCAhPSAiIiB8fCAkc3ZjZXJ0ICE9ICIiIHx8ICRjcnRkaXIgIT0gIiJ9IHsKLQkJYXBwZW5kIG1zZyAiICAtIFNTTCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvblxuIgotCX0KLQlpZiB7JG1zZyAhPSAiIn0gewotCQlzZXQgbXNnICJEaXJlY3QgY29ubmVjdCB2aWEgdm5jOi8vaG9zdG5hbWVcblRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3aWxsIGJlIGRpc2FibGVkOlxuXG4kbXNnIgotCQlyYWlzZSAuCi0JCXRrX21lc3NhZ2VCb3ggLXR5cGUgb2sgLWljb24gaW5mbyAtbWVzc2FnZSAkbXNnCi0JfQotfQotCi1wcm9jIGZldGNoX2NlcnQge3NhdmV9IHsKLQlnbG9iYWwgZW52IHZuY2Rpc3BsYXkgaXNfd2luZG93cwotCXNldCBocCBbZ2V0X3ZuY2Rpc3BsYXldCi0KLQlnbG9iYWwgdmVuY3J5cHRfZGV0ZWN0ZWQKLQlzZXQgdmVuY3J5cHRfZGV0ZWN0ZWQgIiIKLQotCWdsb2JhbCB1c2VfbGlzdGVuCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCWlmIHskaXNfd2luZG93c30gewotCQkJbWVzZyAiRmV0Y2ggQ2VydCBub3QgZW5hYmxlZCBmb3IgUmV2ZXJzZSBDb25uZWN0aW9ucyIKLQkJCWJlbGwKLQkJCWNhdGNoIHtyYWlzZSAufQotCQkJbWFjX3JhaXNlCi0JCQlyZXR1cm4KLQkJfQotCQl0b3BsZXYgLmZjcgotCQlnbG9iYWwgaGVscF9mb250Ci0JCXdtIHRpdGxlIC5mY3IgIkZldGNoIENlcnQgZm9yIFJldmVyc2UgQ29ubmVjdGlvbnMiCi0JCWdsb2JhbCBmY3JfcmVzdWx0Ci0JCXNldCBmY3JfcmVzdWx0IDAKLQkJZXZhbCB0ZXh0IC5mY3IudCAtd2lkdGggNTUgLWhlaWdodCAxNyAkaGVscF9mb250Ci0JCS5mY3IudCBpbnNlcnQgZW5kIHsKLSAgIEluIFJldmVyc2UgVk5DIENvbm5lY3Rpb25zICgtTElTVEVOKSBtb2RlLCB0aGUKLSAgIEZldGNoIENlcnQgb3BlcmF0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIFJlbW90ZQotICAgVk5DIFNlcnZlciBtYWtlcyBhbiBpbml0aWFsIGNvbm5lY3Rpb24gTk9XIHNvCi0gICB3ZSBjYW4gY29sbGVjdCBpdHMgU1NMIENlcnRpZmljYXRlLiAgTm90ZSB0aGF0Ci0gICB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGZvciBWZU5DcnlwdCBzZXJ2ZXJzLgotICAgKElmIHRoZXJlIGFyZSBwcm9ibGVtcyBGZXRjaGluZywgb25lIGNhbiBhbHdheXMKLSAgIGNvcHkgYW5kIGltcG9ydCB0aGUgQ2VydCBmaWxlIG1hbnVhbGx5LikKLQotICAgRG8geW91IHdhbnQgdG8gQ29udGludWUgd2l0aCB0aGlzIG9wZXJhdGlvbj8KLSAgIElmIHNvLCBwcmVzcyAiQ29udGludWUiIGFuZCBUaGVuIGluc3RydWN0IHRoZQotICAgcmVtb3RlIFZOQyBTZXJ2ZXIgdG8gbWFrZSBhIFJldmVyc2UgQ29ubmVjdGlvbgotICAgdG8gdXMuCi0KLSAgIE90aGVyd2lzZSwgcHJlc3MgIkNhbmNlbCIgdG8gY2FuY2VsIHRoZSBGZXRjaAotICAgQ2VydCBvcGVyYXRpb24uICAKLX0KLQotCQlidXR0b24gLmZjci5jYW5jZWwgICAtdGV4dCBDYW5jZWwgICAtY29tbWFuZCB7c2V0IGZjcl9yZXN1bHQgMDsgZGVzdHJveSAuZmNyfQotCQlidXR0b24gLmZjci5jb250aW51ZSAtdGV4dCBDb250aW51ZSAtY29tbWFuZCB7c2V0IGZjcl9yZXN1bHQgMTsgZGVzdHJveSAuZmNyfQotCQlidXR0b24gLmZjci5jb250aW51MiAtdGV4dCBDb250aW51ZSAtY29tbWFuZCB7c2V0IGZjcl9yZXN1bHQgMTsgZGVzdHJveSAuZmNyfQotCQlnbG9iYWwgdW5hbWUKLQkJaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQkJcGFjayAuZmNyLnQgLmZjci5jb250aW51MiAuZmNyLmNvbnRpbnVlIC5mY3IuY2FuY2VsIC1zaWRlIHRvcCAtZmlsbCB4Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCXBhY2sgLmZjci50IC5mY3IuY29udGludWUgLmZjci5jYW5jZWwgLXNpZGUgdG9wIC1maWxsIHgKLQkJfQotCQljZW50ZXJfd2luIC5mY3IKLQotCQl0a3dhaXQgd2luZG93IC5mY3IKLQkJdXBkYXRlCi0JCWFmdGVyIDUwCi0KLQkJaWYgeyRmY3JfcmVzdWx0ICE9IDF9ICB7Ci0JCQlyZXR1cm4KLQkJfQotCQl1cGRhdGUgaWRsZXRhc2tzCi0JCWFmdGVyIDUwCi0JfQotCi0JcmVnc3ViIHtbIAldKmNtZD0uKiR9ICRocCAiIiB0dAotCWlmIHtbcmVnZXhwIHteWyAJXSokfSAkdHRdfSB7Ci0JCW1lc2cgIk5vIGhvc3Q6ZGlzcCBzdXBwbGllZC4iCi0JCWJlbGwKLQkJY2F0Y2gge3JhaXNlIC59Ci0JCW1hY19yYWlzZQotCQlyZXR1cm4KLQl9Ci0JaWYge1tyZWdleHAgLS0gey0tbm9ob3N0LS19ICR0dF19IHsKLQkJbWVzZyAiTm8gaG9zdDpkaXNwIHN1cHBsaWVkLiIKLQkJYmVsbAotCQljYXRjaCB7cmFpc2UgLn0KLQkJbWFjX3JhaXNlCi0JCXJldHVybgotCX0KLQlpZiB7ISBbcmVnZXhwICI6IiAkaHBdfSB7Ci0JCWlmIHshIFtyZWdleHAge2NtZD19ICRocF19IHsKLQkJCWFwcGVuZCBocCAiOjAiCi0JCX0KLQl9Ci0Jc2V0IGhwbmV3ICBbZ2V0X3NzaF9ocCAkaHBdCi0Jc2V0IHByb3h5ICBbZ2V0X3NzaF9wcm94eSAkaHBdCi0KLQotCXNldCBwc3RyIDEKLQltZXNnICJGZXRjaGluZyAkaHBuZXcgQ2VydC4uLiIKLQlnbG9iYWwgY2VydF90ZXh0Ci0Jc2V0IGNlcnRfdGV4dCAiIgotCS5mNC5nZXRjZXJ0IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQl1cGRhdGUKLQlpZiB7ISAkaXNfd2luZG93c30gewotCQljYXRjaCB7c2V0IGNlcnRfdGV4dCBbZmV0Y2hfY2VydF91bml4ICRocF19Ci0JfSBlbHNlIHsKLQkJc2V0IGNlcnRfdGV4dCBbZmV0Y2hfY2VydF93aW5kb3dzICRocF0KLQl9Ci0KLQlpZiBbaW5mbyBleGlzdHMgZW52KENFUlREQkcpXSB7cHV0cyAiXG5GZXRjaC0wLVxuJGNlcnRfdGV4dCJ9Ci0KLQlzZXQgdmVuY3J5cHQgMAotCXNldCBhbm9uZGggMAotCWlmIHshW3JlZ2V4cCB7QkVHSU4gQ0VSVElGSUNBVEV9ICRjZXJ0X3RleHRdfSB7Ci0JCWlmIFtyZWdleHAge0NPTk5FQ1RFRH0gJGNlcnRfdGV4dF0gewotCQkJc2V0IG0gMAotCQkJaWYgeyFbcmVnZXhwIC1ub2Nhc2Uge0dFVF9TRVJWRVJfSEVMTE99ICRjZXJ0X3RleHRdfSB7Ci0JCQkJc2V0IG0gMQotCQkJfQotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIC1saW5lIHtHRVRfU0VSVkVSX0hFTExPLip1bmtub3duIHByb3RvY29sfSAkY2VydF90ZXh0XSB7Ci0JCQkJc2V0IG0gMQotCQkJfQotCQkJaWYgeyFbcmVnZXhwIC1ub2Nhc2Uge3Nob3dfY2VydDogU1NMX2Nvbm5lY3QgZmFpbGVkfSAkY2VydF90ZXh0XX0gewotCQkJCXNldCBtIDEKLQkJCX0KLQkJCWlmIHshJG0gJiYgJGlzX3dpbmRvd3N9IHsKLQkJCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge3dyaXRlOmVycm5vfSAkY2VydF90ZXh0XSB7Ci0JCQkJCWlmIFtyZWdleHAgLW5vY2FzZSB7bm8gcGVlciBjZXJ0aWZpY2F0ZX0gJGNlcnRfdGV4dF0gewotCQkJCQkJc2V0IG0gMQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgeyRtfSB7Ci0JCQkJIyBzdXNwZWN0IFZlTkNyeXB0IG9yIEFOT05UTFMgcGxhaW50ZXh0IFJGQgotCQkJCXNldCBjZXJ0X3RleHQgIiIKLQkJCQlzZXQgdmVuY3J5cHQgMQotCQkJCWluY3IgcHN0cgotCQkJCW1lc2cgIiMke3BzdHJ9IEZldGNoaW5nICRocG5ldyBDZXJ0Li4uICR2ZW5jcnlwdC8kYW5vbmRoIgotCQkJCWlmIHshICRpc193aW5kb3dzfSB7Ci0JCQkJCWNhdGNoIHtzZXQgY2VydF90ZXh0IFtmZXRjaF9jZXJ0X3VuaXggICAgJGhwICR2ZW5jcnlwdCAkYW5vbmRoXX0KLQkJCQl9IGVsc2UgewotCQkJCQlhZnRlciA2MDAKLQkJCQkJY2F0Y2gge3NldCBjZXJ0X3RleHQgW2ZldGNoX2NlcnRfd2luZG93cyAkaHAgJHZlbmNyeXB0ICRhbm9uZGhdfQotCQkJCX0KLQlpZiBbaW5mbyBleGlzdHMgZW52KENFUlREQkcpXSB7cHV0cyAiXG5GZXRjaC0xLVxuJGNlcnRfdGV4dCJ9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgeyFbcmVnZXhwIHtCRUdJTiBDRVJUSUZJQ0FURX0gJGNlcnRfdGV4dF19IHsKLQkJaWYgW3JlZ2V4cCB7Q09OTkVDVEVEfSAkY2VydF90ZXh0XSB7Ci0JCQlzZXQgbSAwCi0JCQlpZiBbcmVnZXhwIC1ub2Nhc2UgLWxpbmUge2Vycm9yLipoYW5kc2hha2UgZmFpbHVyZX0gJGNlcnRfdGV4dF0gewotCQkJCXNldCBtIDEKLQkJCX0KLQkJCWlmIFtyZWdleHAgLW5vY2FzZSAtbGluZSB7ZXJyb3IuKnVua25vd24gcHJvdG9jb2x9ICRjZXJ0X3RleHRdIHsKLQkJCQlzZXQgbSAxCi0JCQl9Ci0JCQlpZiB7IVtyZWdleHAgLW5vY2FzZSB7c2hvd19jZXJ0OiBTU0xfY29ubmVjdCBmYWlsZWR9ICRjZXJ0X3RleHRdfSB7Ci0JCQkJc2V0IG0gMQotCQkJfQotCQkJaWYgeyEkbSAmJiAkaXNfd2luZG93c30gewotCQkJCWlmIFtyZWdleHAgLW5vY2FzZSB7bm8gcGVlciBjZXJ0aWZpY2F0ZX0gJGNlcnRfdGV4dF0gewotCQkJCQlzZXQgbSAxCi0JCQkJfQotCQkJfQotCQkJaWYgeyRtfSB7Ci0JCQkJIyBzdXNwZWN0IEFub255bW91cyBEaWZmaWUgSGVsbG1hbgotCQkJCXNldCBjZXJ0X3RleHQgIiIKLQkJCQlzZXQgYW5vbmRoIDEKLQkJCQlpbmNyIHBzdHIKLQkJCQltZXNnICIjJHtwc3RyfSBGZXRjaGluZyAkaHBuZXcgQ2VydC4uLiAkdmVuY3J5cHQvJGFub25kaCIKLQkJCQlpZiB7ISAkaXNfd2luZG93c30gewotCQkJCQljYXRjaCB7c2V0IGNlcnRfdGV4dCBbZmV0Y2hfY2VydF91bml4ICAgICRocCAkdmVuY3J5cHQgJGFub25kaF19Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWZ0ZXIgNjAwCi0JCQkJCWNhdGNoIHtzZXQgY2VydF90ZXh0IFtmZXRjaF9jZXJ0X3dpbmRvd3MgJGhwICR2ZW5jcnlwdCAkYW5vbmRoXX0KLQkJCQl9Ci0JaWYgW2luZm8gZXhpc3RzIGVudihDRVJUREJHKV0ge3B1dHMgIlxuRmV0Y2gtMi1cbiRjZXJ0X3RleHQifQotCQkJfQotCQl9Ci0JfQotCWlmIHshW3JlZ2V4cCB7QkVHSU4gQ0VSVElGSUNBVEV9ICRjZXJ0X3RleHRdfSB7Ci0JCWlmIFtyZWdleHAge0NPTk5FQ1RFRH0gJGNlcnRfdGV4dF0gewotCQkJaWYge1tyZWdleHAgLW5vY2FzZSAtbGluZSB7Y2lwaGVyLipBREh9ICRjZXJ0X3RleHRdfSB7Ci0JCQkJIyBpdCBpcyBBbm9ueW1vdXMgRGlmZmllIEhlbGxtYW4KLQkJCQltZXNnICJXQVJOSU5HOiBBbm9ueW1vdXMgRGlmZmllIEhlbGxtYW4gU2VydmVyIGRldGVjdGVkIChOTyBDRVJUKSIKLQkJCQlhZnRlciAzMDAKLQkJCQkuZjQuZ2V0Y2VydCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCQkJCXJldHVybiAkY2VydF90ZXh0Ci0JCQl9IGVsc2UgewotCQkJCWdsb2JhbCB2ZW5jcnlwdF9kZXRlY3RlZAotCQkJCXNldCB2ZW5jcnlwdF9kZXRlY3RlZCAiIgotCQkJfQotCQl9Ci0JfQotCi0JZ2xvYmFsIHZlbmNyeXB0X2RldGVjdGVkIHNlcnZlcl92ZW5jcnlwdAotCWlmIHskdmVuY3J5cHRfZGV0ZWN0ZWQgIT0gIiIgJiYgISRzZXJ2ZXJfdmVuY3J5cHR9IHsKLQkJbWVzZyAiVmVOQ3J5cHQgb3IgQU5PTlRMUyBzZXJ2ZXIgZGV0ZWN0ZWQuIgotCQlhZnRlciA2MDAKLQl9Ci0KLQkuZjQuZ2V0Y2VydCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCW1lc2cgIkZldGNoZWQgJGhwbmV3IENlcnQiCi0KLQlzZXQgbiA0NwotCXNldCBvayAxCi0JaWYgeyRjZXJ0X3RleHQgPT0gIiJ9IHsKLQkJc2V0IGNlcnRfdGV4dCAiQW4gRXJyb3Igb2NjdXJyZWQgaW4gZmV0Y2hpbmcgU1NMIENlcnRpZmljYXRlIGZyb20gJGhwIgotCQlzZXQgb2sgMAotCQlzZXQgbiA0Ci0JfSBlbHNlaWYgeyEgW3JlZ2V4cCB7QkVHSU4gQ0VSVElGSUNBVEV9ICRjZXJ0X3RleHRdfSB7Ci0JCXNldCBjZXJ0X3RleHQgIkFuIEVycm9yIG9jY3VycmVkIGluIGZldGNoaW5nICRocFxuXG4kY2VydF90ZXh0IgotCQlzZXQgbiBbbGluZV9jb3VudCAkY2VydF90ZXh0IDFdCi0JCXNldCBvayAwCi0JfSBlbHNlIHsKLQkJaWYgW3JlZ2V4cCAtLSB7LS0tLS1CRUdJTiBTU0wgU0VTU0lPTiBQQVJBTUVURVJTLS0tLS19ICRjZXJ0X3RleHRdIHsKLQkJCXNldCBuZXcgIiIKLQkJCXNldCBvZmYgMAotCQkJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY2VydF90ZXh0ICJcbiJdIHsKLQkJCQlpZiBbcmVnZXhwIC0tIHtSRkIgMDB9ICRsaW5lXSB7Ci0JCQkJCWNvbnRpbnVlCi0JCQkJfQotCQkJCWlmIFtyZWdleHAgLS0ge1VzaW5nIGRlZmF1bHQgdGVtcH0gJGxpbmVdIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJaWYgW3JlZ2V4cCAtLSB7LS0tLS1CRUdJTiBTU0wgU0VTU0lPTiBQQVJBTUVURVJTLS0tLS19ICRsaW5lXSB7Ci0JCQkJCXNldCBvZmYgMQotCQkJCX0KLQkJCQlpZiBbcmVnZXhwIC0tIHstLS0tLUVORCBTU0wgU0VTU0lPTiBQQVJBTUVURVJTLS0tLS19ICRsaW5lXSB7Ci0JCQkJCXNldCBvZmYgMAotCQkJCQljb250aW51ZQotCQkJCX0KLQkJCQlpZiB7JG9mZn0gewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYXBwZW5kIG5ldyAiJGxpbmVcbiIKLQkJCX0KLQkJCWlmIFtyZWdleHAgLS0gey0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLX0gJG5ld10gewotCQkJCXNldCBjZXJ0X3RleHQgJG5ldwotCQkJfQotCQl9Ci0JCXNldCB0ZXh0ICIiIAotCQlzZXQgb24gMAotCQlzZXQgc3ViamVjdCAiIgotCQlzZXQgY3Vycl9zdWJqZWN0ICIiCi0JCXNldCBjaGFpbl9uIC0xCi0JCXNldCBjaGFpbihfX2VtcHR5X18pICIiCi0JCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNlcnRfdGV4dCAiXG4iXSB7Ci0JCQlpZiBbcmVnZXhwIC0tIHstLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS19ICRsaW5lXSB7Ci0JCQkJaW5jciBvbgotCQkJfQotCQkJaWYgeyRjaGFpbl9uIDwgLTF9IHsKLQkJCQk7Ci0JCQl9IGVsc2VpZiBbcmVnZXhwIHteICooWzAtOV0pICpzOiguKi9bQS1aXVtBLVpdKj0uKiQpfSAkbGluZSBtIGNuIHNiXSB7Ci0JCQkJc2V0IGNuIFtzdHJpbmcgdHJpbSAkY25dCi0JCQkJc2V0IHNiIFtzdHJpbmcgdHJpbSAkc2JdCi0JCQkJI3B1dHMgY249JGNuCi0JCQkJI3B1dHMgc2I9JHNiCi0JCQkJaWYgeyRzdWJqZWN0ID09ICIifSB7Ci0JCQkJCXNldCBzdWJqZWN0ICRzYgotCQkJCX0KLQkJCQlpZiB7JGNuID4gJGNoYWluX259IHsKLQkJCQkJc2V0IGNoYWluX24gJGNuCi0JCQkJCXNldCBjdXJyX3N1YmplY3QgJHNiCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0IGNoYWluX24gLTIKLQkJCQl9Ci0JCQl9IGVsc2VpZiBbcmVnZXhwIHteICppOiguKi9bQS1aXVtBLVpdKj0uKiQpfSAkbGluZSBtIGlzXSB7Ci0JCQkJc2V0IGlzIFtzdHJpbmcgdHJpbSAkaXNdCi0JCQkJI3B1dHMgaXM9JGlzCi0JCQkJaWYgeyRjdXJyX3N1YmplY3QgIT0gIiJ9IHsKLQkJCQkJc2V0IGNoYWluKCRjdXJyX3N1YmplY3QpICRpcwotCQkJCX0KLQkJCX0KLQkJCWlmIHskb24gIT0gMX0gewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXBwZW5kIHRleHQgIiRsaW5lXG4iCi0JCQlpZiBbcmVnZXhwIC0tIHstLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tfSAkbGluZV0gewotCQkJCXNldCBvbiAyCi0JCQl9Ci0JCX0KLQkJc2V0IGNoYWluX3N0ciAic3ViamVjdDogbm90LWtub3duXG4iCi0JCXNldCBjdXJyX3N1YmplY3QgJHN1YmplY3QKLQkJc2V0IHNlbGZfc2lnbmVkIDAKLQkJc2V0IHRvcF9pc3N1ZXIgIiIKLQkJZm9yIHtzZXQgaSAwfSB7JGkgPCAxMH0ge2luY3IgaX0gewotCQkJaWYgeyRjdXJyX3N1YmplY3QgIT0gIiJ9IHsKLQkJCQlpZiB7JGkgPT0gMH0gewotCQkJCQlzZXQgY2hhaW5fc3RyICItIHN1YmplY3Q6ICRjdXJyX3N1YmplY3RcblxuIgotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfS0gaXNzdWVyJGk6ICRjdXJyX3N1YmplY3RcblxuIgotCQkJCQlzZXQgdG9wX2lzc3VlciAkY3Vycl9zdWJqZWN0OwotCQkJCX0KLQkJCQlpZiB7IVtpbmZvIGV4aXN0cyBjaGFpbigkY3Vycl9zdWJqZWN0KV19IHsKLQkJCQkJYnJlYWsKLQkJCQl9IGVsc2VpZiB7JGNoYWluKCRjdXJyX3N1YmplY3QpID09ICIifSB7Ci0JCQkJCWJyZWFrCi0JCQkJfSBlbHNlaWYgeyRjdXJyX3N1YmplY3QgPT0gJGNoYWluKCRjdXJyX3N1YmplY3QpfSB7Ci0JCQkJCXNldCBqIFtleHByICRpICsgMV0KLQkJCQkJc2V0IGNoYWluX3N0ciAiJHtjaGFpbl9zdHJ9LSBpc3N1ZXIkajogJGN1cnJfc3ViamVjdFxuXG4iCi0JCQkJCXNldCB0b3BfaXNzdWVyICRjdXJyX3N1YmplY3Q7Ci0JCQkJCWlmIHskaSA9PSAwfSB7Ci0JCQkJCQlzZXQgc2VsZl9zaWduZWQgMQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzZXQgY3Vycl9zdWJqZWN0ICRjaGFpbigkY3Vycl9zdWJqZWN0KQotCQkJfQotCQl9Ci0JCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfUlORk86IFNFTEZfU0lHTkVEPSRzZWxmX3NpZ25lZFxuXG4iCi0JCWlmIHskc2VsZl9zaWduZWR9IHsKLQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfUlORk86IENlcnRpZmljYXRlIGlzIFNlbGYtU2lnbmVkLlxuIgotCQkJc2V0IGNoYWluX3N0ciAiJHtjaGFpbl9zdHJ9SU5GTzogSXQgd2lsbCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlIHdoZW4gdXNlZCBhcyBhIFNlcnZlckNlcnQgb3IgQWNjZXB0ZWQtQ2VydC5cbiIKLQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfUlORk86IEJlIHN1cmUgdG8gY2hlY2sgY2FyZWZ1bGx5IHRoYXQgeW91IHRydXN0IHRoaXMgY2VydGlmaWNhdGUgYmVmb3JlIHNhdmluZyBpdC5cbiIKLQkJfSBlbHNlIHsKLQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfUlORk86IENlcnRpZmljYXRlIGlzIHNpZ25lZCBieSBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpLlxuIgotCQkJc2V0IGNoYWluX3N0ciAiJHtjaGFpbl9zdHJ9SU5GTzogSXQgKldJTEwgTk9UKiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlIHdoZW4gdXNlZCBhcyBhIFNlcnZlckNlcnQgb3IgQWNjZXB0ZWQtQ2VydC5cbiIKLQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfUlORk86IFlvdSBuZWVkIHRvIE9idGFpbiBhbmQgU2F2ZSB0aGUgQ0EncyBDZXJ0aWZpY2F0ZSAoaXNzdWVyKSBpbnN0ZWFkIgotCQkJaWYgeyR0b3BfaXNzdWVyICE9ICIifSB7Ci0JCQkJc2V0IGNoYWluX3N0ciAiJHtjaGFpbl9zdHJ9OlxuSU5GTzogQ0E6ICR0b3BfaXNzdWVyXG4iCi0JCQl9IGVsc2UgewotCQkJCXNldCBjaGFpbl9zdHIgIiR7Y2hhaW5fc3RyfS5cbiIKLQkJCX0KLQkJfQotCQkjcHV0cyAiXG4kY2hhaW5fc3RyXG4iCi0KLQkJZ2xvYmFsIGlzX3dpbmRvd3MKLQkJc2V0IHRtcCAiL3RtcC9jZXJ0LmhzaC5bdHBpZF0iCi0JCXNldCB0bXAgW215dG1wICR0bXBdCi0JCWlmIHskaXNfd2luZG93c30gewotCQkJIyBWRgotCQkJc2V0IHRtcCBjZXJ0LmhzaAotCQl9Ci0JCXNldCBmaCAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICR0bXAgInciXX0KLQkJaWYgeyRmaCAhPSAiIn0gewotCQkJcHV0cyAkZmggJHRleHQKLQkJCWNsb3NlICRmaAotCQkJc2V0IGluZm8gIiIKLQkJCWNhdGNoIHtzZXQgaW5mbyBbZ2V0X3g1MDlfaW5mbyAkdG1wXX0KLQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkdG1wfQotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtNRDUgRmluZ2VyW15cbl0qfSAkaW5mbyBtdmFyXSB7Ci0JCQkJc2V0IGNlcnRfdGV4dCAiJG12YXJcblxuJGNlcnRfdGV4dCIKLQkJCX0KLQkJCWlmIFtyZWdleHAgLW5vY2FzZSB7U0hBLiBGaW5nZXJbXlxuXSp9ICRpbmZvIG12YXJdIHsKLQkJCQlzZXQgY2VydF90ZXh0ICIkbXZhclxuXG4kY2VydF90ZXh0IgotCQkJfQotCQkJc2V0IGNlcnRfdGV4dCAiJGNlcnRfdGV4dFxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5PdXRwdXQgb2YgIG9wZW5zc2wgeDUwOSAtdGV4dCAtZmluZ2VycHJpbnQ6XG5cbiRpbmZvIgotCQl9Ci0JCXNldCBjZXJ0X3RleHQgIj09PT0gU1NMIENlcnRpZmljYXRlIGZyb20gJGhwID09PT1cblxuJGNoYWluX3N0clxuJGNlcnRfdGV4dCIKLQl9Ci0KLQlpZiB7ISAkc2F2ZX0gewotCQlyZXR1cm4gJGNlcnRfdGV4dAotCX0KLQotCWZldGNoX2RpYWxvZyAkY2VydF90ZXh0ICRocCAkaHBuZXcgJG9rICRuCi19Ci0KLXByb2Mgc2tpcF9ub25fc2VsZl9zaWduZWQge3cgaHB9IHsKLQlzZXQgbXNnICJDZXJ0aWZpY2F0ZSBmcm9tICRocCBpcyBub3QgU2VsZi1TaWduZWQsIGl0IHdhcyBzaWduZWQgYnkgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKS4gIFNhdmluZyBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGJlY2F1c2UgaXQgY2Fubm90IGJlIHVzZWQgdG8gYXV0aGVudGljYXRlIGFueXRoaW5nLiAgWW91IG5lZWQgdG8gT2J0YWluIGFuZCBTYXZlIHRoZSBDQSBDZXJ0aWZpY2F0ZSBpbnN0ZWFkLiAgU2F2ZSBpdCBhbnl3YXk/IgotCXNldCByZXBseSBbdGtfbWVzc2FnZUJveCAtdHlwZSBva2NhbmNlbCAtZGVmYXVsdCBjYW5jZWwgLXBhcmVudCAkdyAtaWNvbiB3YXJuaW5nIC1tZXNzYWdlICRtc2cgLXRpdGxlICJDQSBTaWduZWQgQ2VydGlmaWNhdGUiXQotCWlmIHskcmVwbHkgPT0gImNhbmNlbCJ9IHsKLQkJcmV0dXJuIDEKLQl9IGVsc2UgewotCQlyZXR1cm4gMAotCX0KLX0KLQkKLXByb2MgZmV0Y2hfZGlhbG9nIHtjZXJ0X3RleHQgaHAgaHBuZXcgb2sgbn0gewotCXRvcGxldiAuZmV0Y2gKLQotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IG4gMjgKLQl9Ci0KLQlzY3JvbGxfdGV4dF9kaXNtaXNzIC5mZXRjaC5mIDkwICRuCi0KLQlpZiB7JG9rfSB7Ci0JCXNldCBzcyAwCi0JCWlmIFtyZWdleHAge0lORk86IFNFTEZfU0lHTkVEPTF9ICRjZXJ0X3RleHRdIHsKLQkJCWJ1dHRvbiAuZmV0Y2guc2F2ZSAtdGV4dCBTYXZlIC1jb21tYW5kICJkZXN0cm95IC5mZXRjaDsgc2F2ZV9jZXJ0IHskaHBuZXd9IgotCQkJc2V0IHNzIDEKLQkJfSBlbHNlIHsKLQkJCWJ1dHRvbiAuZmV0Y2guc2F2ZSAtdGV4dCBTYXZlIC1jb21tYW5kICJpZiBcW3NraXBfbm9uX3NlbGZfc2lnbmVkIC5mZXRjaCB7JGhwbmV3fVxdIHtyZXR1cm59IGVsc2Uge2Rlc3Ryb3kgLmZldGNoOyBzYXZlX2NlcnQgeyRocG5ld319IgotCQkJc2V0IHNzIDAKLQkJfQotCQlidXR0b24gLmZldGNoLmhlbHAgLXRleHQgSGVscCAtY29tbWFuZCAiaGVscF9mZXRjaF9jZXJ0ICRzcyIKLQkJcGFjayAuZmV0Y2guaGVscCAuZmV0Y2guc2F2ZSAtc2lkZSBib3R0b20gLWZpbGwgeAotCQkuZmV0Y2guZCBjb25maWd1cmUgLXRleHQgIkNhbmNlbCIKLQl9Ci0KLQljZW50ZXJfd2luIC5mZXRjaAotCXdtIHRpdGxlIC5mZXRjaCAiJGhwIENlcnRpZmljYXRlIgotCi0JLmZldGNoLmYudCBpbnNlcnQgZW5kICRjZXJ0X3RleHQKLQlqaWdnbGVfdGV4dCAuZmV0Y2guZi50Ci19Ci0KLQotcHJvYyBob3N0X3BhcnQge2hwfSB7Ci0JcmVnc3ViIHteICp9ICAkaHAgIiIgaHAKLQlyZWdzdWIgeyAuKiR9ICRocCAiIiBocAotCWlmIFtyZWdleHAge15bMC05XVswLTldKiR9ICRocF0gewotCQlyZXR1cm4gIiIKLQl9Ci0Jc2V0IGggJGhwCi0JcmVnc3ViIHs6WzAtOV1bMC05XSokfSAkaHAgIiIgaAotCXJldHVybiAkaAotfQotCi1wcm9jIHBvcnRfcGFydCB7aHB9IHsKLQlyZWdzdWIgeyAuKiR9ICRocCAiIiBocAotCXNldCBwICIiCi0JaWYgW3JlZ2V4cCB7OihbMC05XVswLTldKikkfSAkaHAgbSB2YWxdIHsKLQkJc2V0IHAgJHZhbAotCX0KLQlyZXR1cm4gJHAKLX0KLQotcHJvYyBnZXRfdmVuY3J5cHRfcHJveHkge2hwbmV3fSB7Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHtedm5jOi8vfSAkaHBuZXddIHsKLQkJcmV0dXJuICIiCi0JfQotCXNldCBocG5ldyAgW2dldF9zc2hfaHAgJGhwbmV3XQotCXJlZ3N1YiAtbm9jYXNlIHteW2EtejAtOStdKjovL30gJGhwbmV3ICIiIGhwbmV3Ci0Jc2V0IGggW2hvc3RfcGFydCAkaHBuZXddCi0Jc2V0IHAgW3BvcnRfcGFydCAkaHBuZXddCi0KLQlpZiB7JHAgPT0gIiJ9IHsKLQkJIyBtaWdodCBub3QgbWF0dGVyLCBpLmUuIFNTSCtTU0wgb25seS4uLgotCQlzZXQgcCA1OTAwCi0JfQotCXNldCBocDIgJGgKLQlpZiB7JHAgPCAwfSB7Ci0JCXNldCBocDIgIiRocDI6W2V4cHIgLSAkcF0iCi0JfSBlbHNlaWYgeyRwIDwgMjAwfSB7Ci0JCXNldCBocDIgIiRocDI6W2V4cHIgJHAgKyA1OTAwXSIKLQl9IGVsc2UgewotCQlzZXQgaHAyICIkaHAyOiRwIgotCX0KLQlyZXR1cm4gInZlbmNyeXB0Oi8vJGhwMiIKLX0KLQotcHJvYyBmZXRjaF9jZXJ0X3VuaXgge2hwIHt2ZW5jcnlwdCAwfSB7YW5vbmRoIDB9fSB7Ci0JZ2xvYmFsIHVzZV9saXN0ZW4KLQotCXNldCBocG5ldyAgW2dldF9zc2hfaHAgJGhwXQotCXNldCBwcm94eSAgW2dldF9zc2hfcHJveHkgJGhwXQotCi0JaWYgeyR2ZW5jcnlwdH0gewotCQlnbG9iYWwgdmVuY3J5cHRfZGV0ZWN0ZWQKLQkJc2V0IHZlbmNyeXB0X2RldGVjdGVkIFtnZXRfdmVuY3J5cHRfcHJveHkgJGhwbmV3XQotCQlpZiB7JHByb3h5ICE9ICIifSB7Ci0JCQlzZXQgcHJveHkgIiRwcm94eSwkdmVuY3J5cHRfZGV0ZWN0ZWQiCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcHJveHkgJHZlbmNyeXB0X2RldGVjdGVkCi0JCX0KLQl9Ci0KLQlzZXQgY21kIFtsaXN0IHNzX3ZuY3ZpZXdlcl0KLQlpZiB7JGFub25kaH0gewotCQlsYXBwZW5kIGNtZCAiLWFub25kaCIKLQl9Ci0JaWYgeyRwcm94eSAhPSAiIn0gewotCQlsYXBwZW5kIGNtZCAiLXByb3h5IgotCQlsYXBwZW5kIGNtZCAkcHJveHkKLQl9Ci0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCWxhcHBlbmQgY21kICItbGlzdGVuIgotCX0KLQlsYXBwZW5kIGNtZCAiLXNob3djZXJ0IgotCWxhcHBlbmQgY21kICRocG5ldwotCi0JaWYgeyRwcm94eSAhPSAiIn0gewotCQlsYXBwZW5kIGNtZCAiMj4vZGV2L251bGwiCi0JfQotCWdsb2JhbCBlbnYKLQlpZiBbaW5mbyBleGlzdHMgZW52KENFUlREQkcpXSB7cHV0cyAiXG5GZXRjaC1jbWQ6ICRjbWQifQotCXNldCBlbnYoU1NWTkNfU0hPV0NFUlRfRVhJVF8wKSAxCi0KLQlyZXR1cm4gW2V2YWwgZXhlYyAkY21kXQotfQotCi1wcm9jIHdpbl9uc2xvb2t1cCB7aG9zdH0gewotCWdsb2JhbCB3aW5fbnNsb29rdXBfY2FjaGUKLQlpZiBbaW5mbyBleGlzdHMgd2luX25zbG9va3VwX2NhY2hlKCRob3N0KV0gewotCQlyZXR1cm4gJHdpbl9uc2xvb2t1cF9jYWNoZSgkaG9zdCkKLQl9Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHtbXmEtejAtOTouXy1dfSAkaG9zdF0gIHsKLQkJc2V0IHdpbl9uc2xvb2t1cF9jYWNoZSgkaG9zdCkgImludmFsaWQiCi0JCXJldHVybiAkd2luX25zbG9va3VwX2NhY2hlKCRob3N0KQotCX0KLQlpZiBbcmVnZXhwIHteWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKlwuWzAtOV1bMC05XSokfSAkaG9zdF0gewotCQlzZXQgd2luX25zbG9va3VwX2NhY2hlKCRob3N0KSAkaG9zdAotCQlyZXR1cm4gJHdpbl9uc2xvb2t1cF9jYWNoZSgkaG9zdCkKLQl9Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHteW2EtZjAtOV0qOlthLWYwLTk6XSo6W2EtZjAtOTpdKiR9ICRob3N0XSB7Ci0JCXNldCB3aW5fbnNsb29rdXBfY2FjaGUoJGhvc3QpICRob3N0Ci0JCXJldHVybiAkd2luX25zbG9va3VwX2NhY2hlKCRob3N0KQotCX0KLQlzZXQgbnNvdXQgIiIKLQljYXRjaCB7c2V0IG5zb3V0IFtleGVjIG5zbG9va3VwICRob3N0XX0KLQlpZiB7JG5zb3V0ID09ICIiIHx8IFtyZWdleHAgLW5vY2FzZSB7c2VydmVyIGZhaWxlZH0gJG5zb3V0XX0gewotCQlhZnRlciAyNTAKLQkJc2V0IG5zb3V0ICIiCi0JCWNhdGNoIHtzZXQgbnNvdXQgW2V4ZWMgbnNsb29rdXAgJGhvc3RdfQotCX0KLQlpZiB7JG5zb3V0ID09ICIiIHx8IFtyZWdleHAgLW5vY2FzZSB7c2VydmVyIGZhaWxlZH0gJG5zb3V0XX0gewotCQlzZXQgd2luX25zbG9va3VwX2NhY2hlKCRob3N0KSAidW5rbm93biIKLQkJcmV0dXJuICR3aW5fbnNsb29rdXBfY2FjaGUoJGhvc3QpCi0JfQotCXJlZ3N1YiAtYWxsIHtTZXJ2ZXI6W15cbl0qXG5BZGRyZXNzOlteXG5dKn0gJG5zb3V0ICIiIG5zb3V0Ci0JcmVnc3ViIHteLipOYW1lOn0gJG5zb3V0ICIiIG5zb3V0Ci0JaWYgW3JlZ2V4cCB7QWRkcmVzczpbIFx0XSooW15cbl0rKX0gJG5zb3V0IG12IGFkZHJdIHsKLQkJc2V0IGFkZHIgW3N0cmluZyB0cmltICRhZGRyXQotCQlpZiB7JGFkZHIgIT0gIiJ9IHsKLQkJCXNldCB3aW5fbnNsb29rdXBfY2FjaGUoJGhvc3QpICRhZGRyCi0JCQlyZXR1cm4gJHdpbl9uc2xvb2t1cF9jYWNoZSgkaG9zdCkKLQkJfQotCX0KLQlzZXQgd2luX25zbG9va3VwX2NhY2hlKCRob3N0KSAidW5rbm93biIKLQlyZXR1cm4gJHdpbl9uc2xvb2t1cF9jYWNoZSgkaG9zdCkKLX0KLQotcHJvYyB3aW5faXB2NCB7aG9zdH0gewotCWdsb2JhbCB3aW5fbG9jYWxob3N0Ci0Jc2V0IGlwIFt3aW5fbnNsb29rdXAgJGhvc3RdOwotCWlmIFtyZWdleHAge15bMC05XVswLTldKlwuWzAtOV1bMC05XSpcLlswLTldWzAtOV0qXC5bMC05XVswLTldKiR9ICRpcF0gewotCQlyZXR1cm4gMQotCX0KLQlyZXR1cm4gMAotfQotCi1wcm9jIGlwdjZfcHJveHkge3Byb3h5IGhvc3QgcG9ydH0gewotCWdsb2JhbCBpc193aW5kb3dzIHdpbl9sb2NhbGhvc3QgaGF2ZV9pcHY2Ci0KLQlpZiB7ISRoYXZlX2lwdjZ9IHsKLQkJcmV0dXJuIFtsaXN0ICRwcm94eSAkaG9zdCAkcG9ydCAiIl0KLQl9IGVsc2VpZiB7ISRpc193aW5kb3dzfSB7Ci0JCXJldHVybiBbbGlzdCAkcHJveHkgJGhvc3QgJHBvcnQgIiJdCi0JfSBlbHNlIHsKLQkJc2V0IGgwICIiCi0JCXNldCBwMCAiIgotCQlzZXQgcG9ydDMgIiIKLQkJc2V0IGlwdjZfcGlkICIiCi0JCXNldCBwcm94eTAgJHByb3h5Ci0JCWlmIHskcHJveHkgPT0gIiJ9IHsKLQkJCWlmIFt3aW5faXB2NCAkaG9zdF0gewotCQkJCXJldHVybiBbbGlzdCAkcHJveHkgJGhvc3QgJHBvcnQgIiJdCi0JCQl9Ci0JCQlzZXQgcG9ydDMgW3JhbmRfcG9ydF0gCi0JCQlzZXQgaDAgJGhvc3QKLQkJCXNldCBwMCAkcG9ydAotCQkJc2V0IGhvc3QgJHdpbl9sb2NhbGhvc3QKLQkJCXNldCBwb3J0ICRwb3J0MwotCQl9IGVsc2UgewotCQkJc2V0IHBhcnRzIFtzcGxpdCAkcHJveHkgIiwiXSAKLQkJCXNldCBuIFtsbGVuZ3RoICRwYXJ0c10KLQkJCWZvciB7c2V0IGkgMH0geyRpIDwgJG59IHtpbmNyIGl9IHsKLQkJCQlzZXQgcGFydCBbbGluZGV4ICRwYXJ0cyAkaV0KLQkJCQlzZXQgcHJlZml4ICIiCi0JCQkJc2V0IHJlcGVhdGVyIDAKLQkJCQlyZWdleHAgLW5vY2FzZSB7XlthLXowLTkrXSo6Ly99ICRwYXJ0IHByZWZpeAotCQkJCXJlZ3N1YiAtbm9jYXNlIHteW2EtejAtOStdKjovL30JJHBhcnQgIiIgcGFydAotCQkJCWlmIFtyZWdleHAge15yZXBlYXRlcjovL30gJHByZWZpeF0gewotCQkJCQlyZWdzdWIge1wrLiokfSAkcGFydCAiIiBwYXJ0Ci0JCQkJCWlmIHshW3JlZ2V4cCB7OihbMC05XVswLTldKikkfSAkcGFydF19IHsKLQkJCQkJCXNldCBwYXJ0ICIkcGFydDo1OTAwIgotCQkJCQl9Ci0JCQkJfQotCQkJCXNldCBtb2RpdCAwCi0JCQkJc2V0IGgxICIiCi0JCQkJc2V0IHAxICIiCi0JCQkJaWYgW3JlZ2V4cCB7XiguKik6KFswLTldWzAtOV0qKSR9ICRwYXJ0IG12YXIgaDEgcDFdIHsKLQkJCQkJaWYgeyRoMSA9PSAibG9jYWxob3N0IiB8fCAkaDEgPT0gJHdpbl9sb2NhbGhvc3R9IHsKLQkJCQkJCWNvbnRpbnVlCi0JCQkJCX0gZWxzZWlmIFt3aW5faXB2NCAkaDFdIHsKLQkJCQkJCWJyZWFrCi0JCQkJCX0KLQkJCQkJc2V0IG1vZGl0IDEKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhawotCQkJCX0KLQkJCQlpZiB7JG1vZGl0fSB7Ci0JCQkJCXNldCBwb3J0MyBbcmFuZF9wb3J0XSAKLQkJCQkJc2V0IGgwICRoMQotCQkJCQlzZXQgcDAgJHAxCi0JCQkJCWxzZXQgcGFydHMgJGkgIiRwcmVmaXgkd2luX2xvY2FsaG9zdDokcG9ydDMiCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJfQotCQkJaWYgeyRoMCAhPSAiIiAmJiAkcDAgIT0gIiIgJiYgJHBvcnQzICE9ICIifSB7Ci0JCQkJc2V0IHByb3h5IFtqb2luICRwYXJ0cyAiLCJdCi0JCQkJI21lc2cgIlJlc2V0IHByb3h5OiAkcHJveHkiOyBhZnRlciAzMDAwCi0JCQl9Ci0JCX0KLQkJaWYgeyRoMCAhPSAiIiAmJiAkcDAgIT0gIiIgJiYgJHBvcnQzICE9ICIifSB7Ci0JCQltZXNnICJTdGFydGluZyBJUFY2IGhlbHBlciBvbiBwb3J0ICRwb3J0MyAuLi4iCi0JCQlzZXQgaXB2Nl9waWQgW2V4ZWMgcmVsYXk2LmV4ZSAkcG9ydDMgIiRoMCIgIiRwMCIgL2I6JHdpbl9sb2NhbGhvc3QgJl0KLQkJCWFmdGVyIDQwMAotCQkJI21lc2cgInI2ICRwb3J0MyAkaDAgJHAwIjsgYWZ0ZXIgMzAwMAotCQl9Ci0JCXJldHVybiBbbGlzdCAkcHJveHkgJGhvc3QgJHBvcnQgJGlwdjZfcGlkXQotCX0KLX0KLQotcHJvYyBmZXRjaF9jZXJ0X3dpbmRvd3Mge2hwIHt2ZW5jcnlwdCAwfSB7YW5vbmRoIDB9fSB7Ci0JZ2xvYmFsIGhhdmVfaXB2NgotCi0JcmVnc3ViIHtedm5jLio6Ly99ICRocCAiIiBocAotCi0Jc2V0IGhwbmV3ICBbZ2V0X3NzaF9ocCAkaHBdCi0Jc2V0IHByb3h5ICBbZ2V0X3NzaF9wcm94eSAkaHBdCi0KLQlpZiB7JHZlbmNyeXB0fSB7Ci0JCWdsb2JhbCB2ZW5jcnlwdF9kZXRlY3RlZAotCQlzZXQgdmVuY3J5cHRfZGV0ZWN0ZWQgW2dldF92ZW5jcnlwdF9wcm94eSAkaHBuZXddCi0JCWlmIHskcHJveHkgIT0gIiJ9IHsKLQkJCXNldCBwcm94eSAiJHByb3h5LCR2ZW5jcnlwdF9kZXRlY3RlZCIKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm94eSAkdmVuY3J5cHRfZGV0ZWN0ZWQKLQkJfQotCX0KLQotCXNldCBob3N0IFtob3N0X3BhcnQgJGhwbmV3XQotCi0JZ2xvYmFsIHdpbl9sb2NhbGhvc3QKLQotCWlmIHskaG9zdCA9PSAiIn0gewotCQlzZXQgaG9zdCAkd2luX2xvY2FsaG9zdAotCX0KLQotCWlmIFtyZWdleHAge14uKkB9ICRob3N0IG1hdGNoXSB7Ci0JCW1lc2cgIlRyaW1taW5nIFwiJG1hdGNoXCIgZnJvbSBob3N0bmFtZSIKLQkJcmVnc3ViIHteLipAfSAkaG9zdCAiIiBob3N0Ci0JfQotCi0Jc2V0IGRpc3AgW3BvcnRfcGFydCAkaHBuZXddCi0KLQlpZiB7W3JlZ2V4cCB7Xi1bMC05XVswLTldKiR9ICRkaXNwXX0gewotCQk7Ci0JfSBlbHNlaWYgeyRkaXNwID09ICIiIHx8ICEgW3JlZ2V4cCB7XlswLTldWzAtOV0qJH0gJGRpc3BdfSB7Ci0JCXNldCBkaXNwIDAKLQl9Ci0JaWYgeyRkaXNwIDwgMH0gewotCQlzZXQgcG9ydCBbZXhwciAiLSAkZGlzcCJdCi0JfSBlbHNlaWYgeyRkaXNwIDwgMjAwfSB7Ci0JCXNldCBwb3J0IFtleHByICIkZGlzcCArIDU5MDAiXQotCX0gZWxzZSB7Ci0JCXNldCBwb3J0ICRkaXNwCi0JfQotCi0Jc2V0IGlwdjZfcGlkICIiCi0JaWYgeyRoYXZlX2lwdjZ9IHsKLQkJc2V0IHJlcyBbaXB2Nl9wcm94eSAkcHJveHkgJGhvc3QgJHBvcnRdCi0JCXNldCBwcm94eSAgICBbbGluZGV4ICRyZXMgMF0KLQkJc2V0IGhvc3QgICAgIFtsaW5kZXggJHJlcyAxXQotCQlzZXQgcG9ydCAgICAgW2xpbmRleCAkcmVzIDJdCi0JCXNldCBpcHY2X3BpZCBbbGluZGV4ICRyZXMgM10KLQl9Ci0KLQlpZiB7JHByb3h5ICE9ICIifSB7Ci0JCWdsb2JhbCBlbnYKLQotCQlzZXQgcG9ydDIgW3JhbmRfcG9ydF0gCi0KLQkJc2V0IHNwICIiCi0JCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfUFJPWFkpXSB7Ci0JCQlzZXQgc3AgJGVudihTU1ZOQ19QUk9YWSkKLQkJfQotCQlzZXQgc2wgIiIKLQkJaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19MSVNURU4pXSB7Ci0JCQlzZXQgc2wgJGVudihTU1ZOQ19MSVNURU4pCi0JCX0KLQkJc2V0IHNkICIiCi0JCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfREVTVCldIHsKLQkJCXNldCBzZCAkZW52KFNTVk5DX0RFU1QpCi0JCX0KLQotCQlzZXQgZW52KFNTVk5DX1BST1hZKSAkcHJveHkKLQkJc2V0IGVudihTU1ZOQ19MSVNURU4pICRwb3J0MgotCQlzZXQgZW52KFNTVk5DX0RFU1QpICIkaG9zdDokcG9ydCIKLQotCQlzZXQgaG9zdCAkd2luX2xvY2FsaG9zdAotCQlzZXQgcG9ydCAkcG9ydDIKLQotCQltZXNnICJTdGFydGluZyBQcm94eSBUQ1AgaGVscGVyIG9uIHBvcnQgJHBvcnQyIC4uLiIKLQkJYWZ0ZXIgMzAwCi0JCSMgZmV0Y2ggY2VydCBiciBjYXNlOgotCQlzZXQgcHJveHlfcGlkIFtleGVjICJjb25uZWN0X2JyLmV4ZSIgJl0KLQotCQlpZiB7JHNwID09ICIifSB7Ci0JCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19QUk9YWSkgfQotCQl9IGVsc2UgewotCQkJc2V0IGVudihTU1ZOQ19QUk9YWSkgJHNwCi0JCX0KLQkJaWYgeyRzbCA9PSAiIn0gewotCQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfTElTVEVOKSB9Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgZW52KFNTVk5DX0xJU1RFTikgJHNsCi0JCX0KLQkJaWYgeyRzZCA9PSAiIn0gewotCQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfREVTVCkgfQotCQl9IGVsc2UgewotCQkJc2V0IGVudihTU1ZOQ19ERVNUKSAkc2QKLQkJfQotCX0KLQotCXNldCBvc3NsIFtnZXRfb3BlbnNzbF0KLQl1cGRhdGUKLQkjIFZGCi0Jc2V0IHRpbiB0bXBpbi50eHQKLQlzZXQgdG91IHRtcG91dC50eHQKLQlzZXQgZmggIiIKLQljYXRjaCB7c2V0IGZoIFtvcGVuICR0aW4gInciXX0KLQlpZiB7JGZoICE9ICIifSB7Ci0JCXB1dHMgJGZoICJRIgotCQlwdXRzICRmaCAiR0VUIC9XT01CQVQgSFRUUC8xLjFcclxuSG9zdDogd29tYmF0LmNvbVxyXG5cclxuXHJcbiIKLQkJY2xvc2UgJGZoCi0JfQotCi0JaWYgezF9IHsKLQkJc2V0IHBoICIiCi0JCWlmIHskYW5vbmRofSB7Ci0JCQlzZXQgcGggW29wZW4gInwgJG9zc2wgc19jbGllbnQgLXByZXhpdCAtY29ubmVjdCAkaG9zdDokcG9ydCAtY2lwaGVyIEFMTDpSQzQrUlNBOitTU0x2MjpAU1RSRU5HVEggPCAkdGluIDI+TlVMIiAiciJdCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcGggW29wZW4gInwgJG9zc2wgc19jbGllbnQgLXByZXhpdCAtY29ubmVjdCAkaG9zdDokcG9ydCA8ICR0aW4gMj5OVUwiICJyIl0KLQkJfQotCi0JCXNldCB0ZXh0ICIiCi0JCWlmIHskcGggIT0gIiJ9IHsKLQkJCXNldCBwaWRzIFtwaWQgJHBoXQotCQkJc2V0IGdvdCAwCi0JCQl3aGlsZSB7W2dldHMgJHBoIGxpbmVdID4gLTF9IHsKLQkJCQlhcHBlbmQgdGV4dCAiJGxpbmVcbiIKLQkJCQlpZiBbcmVnZXhwIHtFTkQgQ0VSVH0gJGxpbmVdIHsKLQkJCQkJc2V0IGdvdCAxCi0JCQkJfQotCQkJCWlmIHskYW5vbmRoICYmIFtyZWdleHAgLW5vY2FzZSB7Y2lwaGVyLipBREh9ICRsaW5lXX0gewotCQkJCQlzZXQgZ290IDEKLQkJCQl9Ci0JCQkJaWYgeyRnb3QgJiYgW3JlZ2V4cCB7XiAqVmVyaWZ5IHJldHVybiBjb2RlfSAkbGluZV19IHsKLQkJCQkJYnJlYWsKLQkJCQl9Ci0JCQkJaWYgW3JlZ2V4cCB7XlJGQiB9ICRsaW5lXSB7Ci0JCQkJCWJyZWFrCi0JCQkJfQotCQkJCWlmIFtyZWdleHAge15ET05FfSAkbGluZV0gewotCQkJCQlicmVhawotCQkJCX0KLQkJCX0KLQkJCWZvcmVhY2ggcGlkICRwaWRzIHsKLQkJCQl3aW5raWxsICRwaWQKLQkJCX0KLQkJCWlmIHskaXB2Nl9waWQgIT0gIiJ9IHsKLQkJCQl3aW5raWxsICRpcHY2X3BpZAotCQkJfQotCi0JCQljYXRjaCB7Y2xvc2UgJHBofQotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICR0aW4gJHRvdX0KLQkJCXJldHVybiAkdGV4dAotCQl9Ci0JfSBlbHNlIHsKLQkJc2V0IHBpZHMgIiIKLQotCQlpZiB7MX0gewotCQkJaWYgeyRhbm9uZGh9IHsKLQkJCQlzZXQgcGgyIFtvcGVuICJ8ICRvc3NsIHNfY2xpZW50IC1wcmV4aXQgLWNvbm5lY3QgJGhvc3Q6JHBvcnQgLWNpcGhlciBBTEw6UkM0K1JTQTorU1NMdjI6QFNUUkVOR1RIID4gJHRvdSAyPk5VTCIgInciXQotCQkJfSBlbHNlIHsKLQkJCQlzZXQgcGgyIFtvcGVuICJ8ICRvc3NsIHNfY2xpZW50IC1wcmV4aXQgLWNvbm5lY3QgJGhvc3Q6JHBvcnQgPiAkdG91IDI+TlVMIiAidyJdCi0JCQl9Ci0JCQlzZXQgcGlkcyBbcGlkICRwaDJdCi0JCQlhZnRlciA1MDAKLQkJCWZvciB7c2V0IGkgMH0geyRpIDwgMTI4fSB7aW5jciBpfSB7Ci0JCQkJcHV0cyAkcGgyICJRIgotCQkJfQotCQkJY2F0Y2gge2Nsb3NlICRwaDJ9Ci0JCX0gZWxzZSB7Ci0JCQlpZiB7JGFub25kaH0gewotCQkJCXNldCBwaWRzIFtleGVjICRvc3NsIHNfY2xpZW50IC1wcmV4aXQgLWNvbm5lY3QgJGhvc3Q6JHBvcnQgLWNpcGhlciBBTEw6UkM0K1JTQTorU1NMdjI6QFNUUkVOR1RIIDwgJHRpbiA+JiAkdG91ICZdCi0JCQl9IGVsc2UgewotCQkJCXNldCBwaWRzIFtleGVjICRvc3NsIHNfY2xpZW50IC1wcmV4aXQgLWNvbm5lY3QgJGhvc3Q6JHBvcnQgPCAkdGluID4mICR0b3UgJl0KLQkJCX0KLQkJfQotCi0JCWZvciB7c2V0IGkgMH0geyRpIDwgMTB9IHtpbmNyIGl9IHsKLQkJCWFmdGVyIDUwMAotCQkJc2V0IGdvdCAwCi0JCQlzZXQgcGggIiIKLQkJCWNhdGNoIHtzZXQgcGggW29wZW4gJHRvdSAiciJdfQotCQkJaWYgeyRwaCAhPSAiIn0gewotCQkJCXdoaWxlIHtbZ2V0cyAkcGggbGluZV0gPiAtMX0gewotCQkJCQlpZiBbcmVnZXhwIHtFTkQgQ0VSVH0gJGxpbmVdIHsKLQkJCQkJCXNldCBnb3QgMQotCQkJCQkJYnJlYWsKLQkJCQkJfQotCQkJCX0KLQkJCQljbG9zZSAkcGgKLQkJCX0KLQkJCWlmIHskZ290fSB7Ci0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCQlmb3JlYWNoIHBpZCAkcGlkcyB7Ci0JCQl3aW5raWxsICRwaWQKLQkJfQotCQlhZnRlciA1MDAKLQkJc2V0IHBoICIiCi0JCWNhdGNoIHtzZXQgcGggW29wZW4gJHRvdSAiciJdfQotCX0KLQlzZXQgdGV4dCAiIgotCWlmIHskcGggIT0gIiJ9IHsKLQkJd2hpbGUge1tnZXRzICRwaCBsaW5lXSA+IC0xfSB7Ci0JCQlhcHBlbmQgdGV4dCAiJGxpbmVcbiIKLQkJfQotCQljbG9zZSAkcGgKLQl9Ci0JY2F0Y2gge2ZpbGUgZGVsZXRlICR0aW4gJHRvdX0KLQlpZiB7JGlwdjZfcGlkICE9ICIifSB7Ci0JCXdpbmtpbGwgJGlwdjZfcGlkCi0JfQotCXJldHVybiAkdGV4dAotfQotCi1wcm9jIGNoZWNrX2FjY2VwdGVkX2NlcnRzIHt7cHJvYmVfb25seSAwfX0gewotCWdsb2JhbCBjZXJ0X3RleHQgYWx3YXlzX3ZlcmlmeV9zc2wKLQlnbG9iYWwgc2tpcF92ZXJpZnlfYWNjZXB0ZWRfY2VydHMgdXNlX2xpc3RlbgotCWdsb2JhbCB1bHRyYV9kc20gZW52Ci0JZ2xvYmFsIHNlcnZlcl92ZW5jcnlwdCBzZXJ2ZXJfYW5vbmRoIG5vX3Byb2JlX3ZlbmNyeXB0Ci0KLQlpZiB7ISAkYWx3YXlzX3ZlcmlmeV9zc2x9IHsKLQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDEKLQkJaWYgeyRzZXJ2ZXJfdmVuY3J5cHR9IHsKLQkJCXJldHVybiAxCi0JCX0KLQkJaWYgeyRub19wcm9iZV92ZW5jcnlwdH0gewotCQkJcmV0dXJuIDEKLQkJfQotCX0KLQlpZiB7JHNlcnZlcl9hbm9uZGh9IHsKLQkJbWVzZyAiV0FSTklORzogQW5vbnltb3VzIERpZmZpZSBIZWxsbWFuIChTS0lQUElORyBDRVJUIENIRUNLKSIKLQkJYWZ0ZXIgMTAwMAotCQlzZXQgc2tpcF92ZXJpZnlfYWNjZXB0ZWRfY2VydHMgMQotCQlyZXR1cm4gMQotCX0KLQlpZiB7JHVsdHJhX2RzbX0gewotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXJldHVybiAxOwotCX0KLQotCWdsb2JhbCBhbm9uX2RoX2RldGVjdGVkCi0Jc2V0IGFub25fZGhfZGV0ZWN0ZWQgMAotCi0Jc2V0IGNlcnRfdGV4dCBbZmV0Y2hfY2VydCAwXQotCi0Jc2V0IG12YXIgIiIKLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIC1saW5lIHtjaXBoZXIuKkFESH0gJGNlcnRfdGV4dCBtdmFyXX0gewotCi0JCWlmIFtpbmZvIGV4aXN0cyBlbnYoQ0VSVERCRyldIHtwdXRzICJcbkZldGNoLU1TRy1cbiRjZXJ0X3RleHQifQotCQlpZiBbaW5mbyBleGlzdHMgZW52KENFUlREQkcpXSB7cHV0cyAiXG5CRUdJTl9NVkFSOiAkbXZhclxuRU5EX01WQVJcbiJ9Ci0KLQkJc2V0IG1zZyAiQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIHNlcnZlciBkZXRlY3RlZC4gIFRoZXJlIHdpbGwgYmUgZW5jcnlwdGlvbiwgYnV0IG5vIFNTTC9UTFMgYXV0aGVudGljYXRpb24uIENvbnRpbnVlPyIKLQkJc2V0IHJlcGx5IFt0a19tZXNzYWdlQm94IC10eXBlIG9rY2FuY2VsIC1kZWZhdWx0IG9rIC1pY29uIHdhcm5pbmcgLW1lc3NhZ2UgJG1zZyAtdGl0bGUgIkFub255bW91cyBEaWZmaWUtSGVsbG1hbiBEZXRlY3RlZCJdCi0JCXNldCBhbm9uX2RoX2RldGVjdGVkIDEKLQkJaWYgeyRyZXBseSA9PSAiY2FuY2VsIn0gewotCQkJcmV0dXJuIDAKLQkJfSBlbHNlIHsKLQkJCWdsb2JhbCBza2lwX3ZlcmlmeV9hY2NlcHRlZF9jZXJ0cwotCQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDEKLQkJCXJldHVybiAxCi0JCX0KLQl9Ci0KLQlpZiB7JHByb2JlX29ubHl9IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyEgJGFsd2F5c192ZXJpZnlfc3NsfSB7Ci0JCXJldHVybiAxCi0JfQotCi0Jc2V0IGZyb20gIiIKLQlzZXQgZmluZ2VycHJpbnQgIiIKLQlzZXQgZmluZ2VybGluZSAiIgotCXNldCBzZWxmX3NpZ25lZCAxCi0Jc2V0IHN1YmplY3RfaXNzdWVyICIiCi0Jc2V0IHN1YmplY3QgIiIKLQlzZXQgaXNzdWVyICIiCi0KLQlzZXQgaSAwCi0JZm9yZWFjaCBsaW5lIFtzcGxpdCAkY2VydF90ZXh0ICJcbiJdIHsKLQkJaW5jciBpCi0JCWlmIHskaSA+IDUwfSB7Ci0JCQlicmVhawotCQl9Ci0JCWlmIFtyZWdleHAge14tIHN1YmplY3Q6ICooLiopJH0gJGxpbmUgbSB2YWxdIHsKLQkJCXNldCB2YWwgW3N0cmluZyB0cmltICR2YWxdCi0JCQlzZXQgc3ViamVjdF9pc3N1ZXIgIiR7c3ViamVjdF9pc3N1ZXJ9c3ViamVjdDokdmFsXG4iCi0JCQlzZXQgc3ViamVjdCAkdmFsCi0JCX0KLQkJaWYgW3JlZ2V4cCB7Xi0gKGlzc3VlclswLTldWzAtOV0qKTogKiguKikkfSAkbGluZSBtIGlzIHZhbF0gewotCQkJc2V0IHZhbCBbc3RyaW5nIHRyaW0gJHZhbF0KLQkJCXNldCBzdWJqZWN0X2lzc3VlciAiJHtzdWJqZWN0X2lzc3Vlcn0kaXM6JHZhbFxuIgotCQkJc2V0IGlzc3VlciAkdmFsCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XklORk86IFNFTEZfU0lHTkVEPSguKikkfSAkbGluZSBtIHZhbF0gewotCQkJc2V0IHN1YmplY3RfaXNzdWVyICIke3N1YmplY3RfaXNzdWVyfVNFTEZfU0lHTkVEOiR2YWxcbiIKLQkJfQotCQlpZiBbcmVnZXhwIHteZGVwdGg9fSAkbGluZV0gewotCQkJYnJlYWsKLQkJfQotCQlpZiBbcmVnZXhwIHtedmVyaWZ5IH0gJGxpbmVdIHsKLQkJCWJyZWFrCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XkNPTk5FQ1RFRH0gJGxpbmVdIHsKLQkJCWJyZWFrCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XkNlcnRpZmljYXRlIGNoYWlufSAkbGluZV0gewotCQkJYnJlYWsKLQkJfQotCQlpZiBbcmVnZXhwIHtePT09PSBTU0wgQ2VydGlmaWNhdGUgZnJvbSAoLiopID09PT19ICRsaW5lIG12IHN0cl0gewotCQkJc2V0IGZyb20gW3N0cmluZyB0cmltICRzdHJdCi0JCX0KLQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtGaW5nZXJwcmludD0oLiopfSAkbGluZSBtdiBzdHJdIHsKLQkJCXNldCBmaW5nZXJsaW5lICRsaW5lCi0JCQlzZXQgZmluZ2VycHJpbnQgW3N0cmluZyB0cmltICRzdHJdCi0JCX0KLQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHteSU5GTzogU0VMRl9TSUdORUQ9KFswMV0pfSAkbGluZSBtdiBzdHJdIHsKLQkJCXNldCBzZWxmX3NpZ25lZCAkc3RyCi0JCX0KLQl9Ci0KLQlzZXQgZmluZ2VycHJpbnQgW3N0cmluZyB0b2xvd2VyICRmaW5nZXJwcmludF0KLQlyZWdzdWIgLWFsbCB7On0gJGZpbmdlcnByaW50ICItIiBmaW5nZXJwcmludAotCXJlZ3N1YiAtYWxsIHtbXFwvPV19ICRmaW5nZXJwcmludCAiXyIgZmluZ2VycHJpbnQKLQotCXNldCBmcm9tIFtzdHJpbmcgdG9sb3dlciAkZnJvbV0KLQlyZWdzdWIgLWFsbCB7W1xbXF1dfSAkZnJvbSAiIiBmcm9tCi0JcmVnc3ViIC1hbGwge15bK2Etel0qOi8vfSAkZnJvbSAiIiBmcm9tCi0JcmVnc3ViIC1hbGwgezp9ICRmcm9tICItIiBmcm9tCi0JcmVnc3ViIC1hbGwge1tcXC89XX0gJGZyb20gIl8iIGZyb20KLQlyZWdzdWIgLWFsbCB7WyAJXX0gJGZyb20gIl8iIGZyb20KLQotCWlmIHskZnJvbSA9PSAiIiB8fCAkZmluZ2VycHJpbnQgPT0gIiJ9IHsKLQkJYmVsbAotCQljYXRjaCB7cmFpc2UgLjsgdXBkYXRlfQotCQltZXNnICJXQVJOSU5HOiBFcnJvciBmZXRjaGluZyBTZXJ2ZXIgQ2VydCIKLQkJYWZ0ZXIgNTAwCi0JCXNldCBocCBbZ2V0X3ZuY2Rpc3BsYXldCi0JCXNldCBuIFtsaW5lX2NvdW50ICRjZXJ0X3RleHQgMV0KLQkJZmV0Y2hfZGlhbG9nICRjZXJ0X3RleHQgJGhwICRocCAwICRuCi0JCXVwZGF0ZQotCQlhZnRlciAyMDAwCi0JCXJldHVybiAwCi0JfQotCi0Jc2V0IGhwIFtnZXRfdm5jZGlzcGxheV0KLQotCXNldCBhZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQljYXRjaCB7ZmlsZSBta2RpciAkYWRpcn0KLQlzZXQgYWRpciAiJGFkaXIvYWNjZXB0ZWQiCi0JY2F0Y2gge2ZpbGUgbWtkaXIgJGFkaXJ9Ci0KLQlzZXQgY3J0ICIkYWRpci8kZnJvbT0kZmluZ2VycHJpbnQuY3J0IgotCi0JaWYgW2ZpbGUgZXhpc3RzICRjcnRdIHsKLQkJaWYgeyRzZWxmX3NpZ25lZH0gewotCQkJbWVzZyAiT0s6IENlcnRpZmljYXRlIGZvdW5kIGluIEFDQ0VQVEVEX0NFUlRTIgotCQkJYWZ0ZXIgNzUwCi0JCQlyZXR1cm4gMQotCQl9Ci0JfQotCi0Jc2V0IGNudCAwCi0JZm9yZWFjaCBmIFtnbG9iIC1ub2NvbXBsYWluIC1kaXJlY3RvcnkgJGFkaXIgIiokZmluZ2VycHJpbnQqLmNydCJdIHsKLQkJbWVzZyAiQ0VSVDogJGYiCi0JCWFmdGVyIDE1MAotCQlpZiB7JHNlbGZfc2lnbmVkfSB7Ci0JCQlpbmNyIGNudAotCQl9Ci0JfQotCi0Jc2V0IG90aCAwCi0Jc2V0IG90aGVycyBbbGlzdF0KLQlmb3JlYWNoIGYgW2dsb2IgLW5vY29tcGxhaW4gLWRpcmVjdG9yeSAkYWRpciAiKiRmcm9tKi5jcnQiXSB7Ci0JCWlmIHskZiA9PSAkY3J0fSAgewotCQkJY29udGludWUKLQkJfQotCQlzZXQgZmIgW2ZpbGUgdGFpbCAkZl0KLQkJbWVzZyAiT1RIRVIgQ0VSVDogJGZiIgotCQlpZiB7JGNudCA+IDB9IHsKLQkJCWFmdGVyIDQwMCAKLQkJfSBlbHNlIHsKLQkJCWJlbGwKLQkJCWFmdGVyIDgwMCAKLQkJfQotCQlsYXBwZW5kIG90aGVycyAkZgotCQlpbmNyIG90aAotCX0KLQotCWZvcmVhY2ggZiBbZ2xvYiAtbm9jb21wbGFpbiAtZGlyZWN0b3J5ICRhZGlyICIqLmNydCJdIHsKLQkJaWYgeyRmID09ICRjcnR9ICB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBzYXcgMAotCQlmb3JlYWNoIG8gJG90aGVycyB7Ci0JCQlpZiB7JGYgPT0gJG99IAl7Ci0JCQkJc2V0IHNhdyAxCi0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCQlpZiB7JHNhd30gewotCQkJY29udGludWUKLQkJfQotCQlzZXQgZmggW29wZW4gJGYgInIiXQotCQlpZiB7JGZoID09ICIifSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBzYW1lIDAKLQkJc2V0IHN1YiAiIgotCQlzZXQgaXNzICIiCi0JCXNldCBpc24gLTE7Ci0JCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJaWYgW3JlZ2V4cCB7Xkhvc3QtRGlzcGxheTogKC4qKSR9ICRsaW5lIG12IGhkXSB7Ci0JCQkJaWYgeyRoZCA9PSAkaHAgfHwgJGhkID09ICRmcm9tfSB7Ci0JCQkJCXNldCBzYW1lIDEKLQkJCQl9Ci0JCQl9Ci0JCQlpZiBbcmVnZXhwIHtec3ViamVjdDooLiopJH0gJGxpbmUgbXYgdmFsXSB7Ci0JCQkJc2V0IHN1YiAkdmFsCi0JCQl9Ci0JCQlpZiBbcmVnZXhwIHteaXNzdWUoWzAtOV1bMC05XSopOiguKikkfSAkbGluZSBtdiBpbiB2YWxdIHsKLQkJCQlpZiB7JGluID4gJGlzbn0gewotCQkJCQlzZXQgaXNuICRpbgotCQkJCQlzZXQgaXNzICR2YWwKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2xvc2UgJGZoOwotCi0JCWlmIHshJHNlbGZfc2lnbmVkfSB7Ci0JCQlpZiB7JHN1YiA9PSAiIn0gewotCQkJCXNldCBvc3NsIFtnZXRfb3BlbnNzbF0KLQkJCQlzZXQgc2lfdHh0IFtleGVjICRvc3NsIHg1MDkgLXN1YmplY3QgLWlzc3VlciAtbm9vdXQgLWluICRmXQotCQkJCWZvcmVhY2ggbGluZSBbc3BsaXQgJHNpX3R4dCAiXG4iXSB7Ci0JCQkJCWlmIFtyZWdleHAgLW5vY2FzZSB7XnN1YmplY3Q9ICooLiopJH0gJGxpbmUgbXYgc3RyXSB7Ci0JCQkJCQlzZXQgc3RyIFtzdHJpbmcgdHJpbSAkc3RyXQotCQkJCQkJaWYgeyRzdHIgIT0gIiJ9IHsKLQkJCQkJCQlzZXQgc3ViICRzdHIKLQkJCQkJCX0KLQkJCQkJfSBlbHNlaWYgW3JlZ2V4cCAtbm9jYXNlIHteaXNzdWVyPSAqKC4qKSR9ICRsaW5lIG12IHN0cl0gewotCQkJCQkJc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQkJCQkJCWlmIHskaXNzICE9ICIifSB7Ci0JCQkJCQkJc2V0IGlzcyAkc3RyCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiB7JGlzc3VlciAhPSAiIiAmJiAkc3ViICE9ICIifSB7Ci0JCQkJZ2xvYmFsIGVudgotCQkJCWlmIFtpbmZvIGV4aXN0cyBlbnYoQ0VSVERCRyldIHsKLQkJCQkJcHV0cyAiZjogJGYiCi0JCQkJCXB1dHMgInM6ICRzdWIiCi0JCQkJCXB1dHMgImk6ICRpc3N1ZXIiCi0JCQkJCXB1dHMgIj09PT09PT09PT09PT09PT09PT0iCi0JCQkJfQotCQkJCWlmIHskaXNzdWVyID09ICRzdWJ9IHsKLQkJCQkJc2V0IGZiIFtmaWxlIHRhaWwgJGZdCi0JCQkJCW1lc2cgIkNlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIENFUlQ6ICRmYiIKLQkJCQkJaW5jciBjbnQKLQkJCQkJYWZ0ZXIgNTAwIAotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlCi0JCX0KLQotCQlpZiB7ISAkc2FtZX0gewotCQkJY29udGludWUKLQkJfQotCi0JCXNldCBmYiBbZmlsZSB0YWlsICRmXQotCQltZXNnICJPVEhFUiBDRVJUOiAkZmIiCi0JCWlmIHskY250ID4gMH0gewotCQkJYWZ0ZXIgNDAwIAotCQl9IGVsc2UgewotCQkJYmVsbAotCQkJYWZ0ZXIgODAwIAotCQl9Ci0JCWxhcHBlbmQgb3RoZXJzICRmCi0JCWluY3Igb3RoCi0JfQotCi0JaWYgeyRjbnQgPiAwfSB7Ci0JCWlmIHskc2VsZl9zaWduZWR9IHsKLQkJCW1lc2cgIk9LOiBTZXJ2ZXIgQ2VydGlmaWNhdGUgZm91bmQgaW4gQUNDRVBURURfQ0VSVFMiCi0JCQlhZnRlciA0MDAKLQkJfSBlbHNlIHsKLQkJCW1lc2cgIk9LOiBDQSBDZXJ0aWZpY2F0ZSBmb3VuZCBpbiBBQ0NFUFRFRF9DRVJUUyIKLQkJCWFmdGVyIDgwMAotCQl9Ci0JCXJldHVybiAxCi0JfQotCi0Jc2V0IGhwMiBbZ2V0X3ZuY2Rpc3BsYXldCi0Jc2V0IG1zZyAiCi0gICAgVGhlIFNlbGYtU2lnbmVkIFNTTCBDZXJ0aWZpY2F0ZSBmcm9tIGhvc3Q6Ci0KLSAgICAgICAgJGhwMgotCi0gICAgRmluZ2VycHJpbnQ6ICRmaW5nZXJwcmludAotCi0gICAgU3ViamVjdDogJHN1YmplY3QKLQotICAgIGlzIG5vdCBwcmVzZW50IGluIHRoZSAnQWNjZXB0ZWQgQ2VydHMnIGRpcmVjdG9yeToKLQotICAgICAgICAkYWRpcgotJVdBUk4KLSAgICBZb3Ugd2lsbCBuZWVkIHRvIHZlcmlmeSBvbiB5b3VyIG93biB0aGF0IHRoaXMgaXMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEKLSAgICBWTkMgc2VydmVyIHRoYXQgeW91IHRydXN0IChlLmcuIGJ5IGNoZWNraW5nIHRoZSBmaW5nZXJwcmludCB3aXRoIHRoYXQKLSAgICBzZW50IHRvIHlvdSBieSB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IpLgotCi0KLSAgICBUSEUgUVVFU1RJT046IERvIHlvdSB3YW50IHRoaXMgY2VydGlmaWNhdGUgdG8gYmUgc2F2ZWQgaW4gdGhlIEFjY2VwdGVkIENlcnRzCi0gICAgZGlyZWN0b3J5IGFuZCB0aGVuIHVzZWQgdG8gU1NMIGF1dGhlbnRpY2F0ZSBWTkMgc2VydmVycz8KLQotCi0gICAgQnkgY2xpY2tpbmcgJ0luc3BlY3QgYW5kIG1heWJlIFNhdmUgQ2VydCcgeW91IHdpbGwgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5Ci0gICAgdG8gaW5zcGVjdCB0aGUgY2VydGlmaWNhdGUgYmVmb3JlIGRlY2lkaW5nIHRvIHNhdmUgaXQgb3Igbm90LgotIgotCi0Jc2V0IG1zZ19ib3R0b20gIgotICAgIENob29zZSAnSWdub3JlIENlcnQgZm9yIE9uZSBDb25uZWN0aW9uJyB0byBjb25uZWN0IGEgc2luZ2xlIHRpbWUgdG8gdGhlCi0gICAgc2VydmVyIHdpdGggKk5PKiBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi4gIFlvdSB3aWxsIHNlZSB0aGlzIGRpYWxvZyBhZ2FpbgotICAgIHRoZSBuZXh0IHRpbWUgeW91IGNvbm5lY3QgdG8gdGhlIHNhbWUgc2VydmVyLgotCi0gICAgQ2hvb3NlICdDb250aW51ZSBhcyB0aG91Z2ggSSBzYXZlZCBpdCcgdG8gbGF1bmNoIHN0dW5uZWwgYW5kIHRoZSBWTkMgdmlld2VyLgotICAgIERvIHRoaXMgaWYgeW91IGtub3cgdGhlIGNvcnJlY3QgQ2VydGlmaWNhdGUgaXMgaW4gdGhlICdBY2NlcHRlZCBDZXJ0cycKLSAgICBkaXJlY3RvcnkuICBJZiBpdCBpcyBub3QsIHN0dW5uZWwgd2lsbCBmYWlsIGFuZCByZXBvcnQgJ1ZFUklGWSBFUlJPUjouLi4nCi0KLSAgICBDaG9vc2UgJ0NhbmNlbCcgdG8gbm90IGNvbm5lY3QgdG8gdGhlIFZOQyBTZXJ2ZXIgYXQgYWxsLgotIgotCi0Jc2V0IG1zZ19jYSAiCi0gICAgVGhlIENBLXNpZ25lZCBTU0wgQ2VydGlmaWNhdGUgZnJvbSBob3N0OgotCi0gICAgICAgICRocDIKLQotICAgIEZpbmdlcnByaW50OiAkZmluZ2VycHJpbnQKLQotICAgIFN1YmplY3Q6ICRzdWJqZWN0Ci0KLSAgICBJc3N1ZXI6ICAkaXNzdWVyCi0KLSAgICBpcyBzaWduZWQgYnkgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSAodGhlICdJc3N1ZXInIGFib3ZlLikKLQotICAgIEhvd2V2ZXIsIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgQ0EgJ0lzc3VlcicgaXMgbm90IHByZXNlbnQgaW4gdGhlCi0gICAgJ0FjY2VwdGVkIENlcnRzJyBkaXJlY3Rvcnk6Ci0KLSAgICAgICAgJGFkaXIKLQotICAgIFlvdSB3aWxsIG5lZWQgdG8gb2J0YWluIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgQ0EgJ0lzc3VlcicgdmlhIHNvbWUgbWVhbnMKLSAgICAocGVyaGFwcyBhc2sgdGhlIFZOQyBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBmb3IgaXQuKSAgVGhlbiwgYWZ0ZXIgeW91IGhhdmUKLSAgICB2ZXJpZmllZCB0aGF0IHRoZSBDQSBjZXJ0aWZpY2F0ZSBpcyBvbmUgdGhhdCB5b3UgdHJ1c3QsIGltcG9ydCB0aGUgCi0gICAgY2VydGlmaWNhdGUgdmlhIENlcnRzIC0+IEltcG9ydCBDZXJ0aWZpY2F0ZS4gIEJlIHN1cmUgdG8gc2VsZWN0IHRvIGFsc28KLSAgICBzYXZlIGl0IHRvIHRoZSBBY2NlcHRlZCBDZXJ0cyBkaXJlY3Rvcnkgc28gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVzZWQuCi0iCi0Jc2V0IG1zZyAiJG1zZyRtc2dfYm90dG9tIgotCXNldCBtc2dfY2EgIiRtc2dfY2EkbXNnX2JvdHRvbSIKLQotCWlmIHshJHNlbGZfc2lnbmVkfSB7Ci0JCXNldCBtc2cgJG1zZ19jYQotCX0KLQotCWlmIHskb3RoID09IDB9IHsKLQkJcmVnc3ViIHslV0FSTn0gJG1zZyAiIiBtc2cKLQl9IGVsc2UgewotCQlzZXQgd2FybiAiIgotCQlzZXQgd2ZwICIiCi0JCWlmIHskb3RoID09IDF9IHsKLQkJCXNldCB3YXJuICIKLSoqV0FSTklORyoqIFRoZSBGb2xsb3dpbmcgQ2VydCB3YXMgcHJldmlvdXNseSBzYXZlZCBGT1IgVEhFIFNBTUUgSE9TVC1ESVNQTEFZOgotCi0iCi0JCQlzZXQgd2ZwICJCVVQgV0lUSCBBIERJRkZFUkVOVCBGSU5HRVJQUklOVC4iCi0JCQkKLQkJfSBlbHNlIHsKLQkJCXNldCB3YXJuICIKLSoqV0FSTklORyoqIFRoZSBGb2xsb3dpbmcgQ2VydHMgd2VyZSBwcmV2aW91c2x5IHNhdmVkIEZPUiBUSEUgU0FNRSBIT1NULURJU1BMQVk6Ci0KLSIKLQkJCXNldCB3ZnAgIkJVVCBXSVRIIERJRkZFUkVOVCBGSU5HRVJQUklOVFMuIgotCQl9Ci0KLQkJZm9yZWFjaCBvICRvdGhlcnMgewotCQkJc2V0IGZiIFtmaWxlIHRhaWwgJG9dCi0JCQlzZXQgd2FybiAiJHdhcm4gICAgICAgICRmYlxuIgotCQl9Ci0JCXNldCB3YXJuICIkd2FyblxuICAgICR3ZnBcbiIKLQkJc2V0IHdhcm4gIiR3YXJuXG4gICAgVGhpcyBjb3VsZCBiZSBhIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjaywgb3Igc2ltcGx5IHRoYXQgdGhlIFNlcnZlciBjaGFuZ2VkIgotCQlzZXQgd2FybiAiJHdhcm5cbiAgICBpdHMgQ2VydGlmaWNhdGUuICAqUExFQVNFIENIRUNLKiBiZWZvcmUgcHJvY2VlZGluZyFcbiIKLQkJcmVnc3ViIHslV0FSTn0gJG1zZyAkd2FybiBtc2cKLQkJYmVsbAotCX0KLQotCXNldCBuIDAKLQlmb3JlYWNoIGwgW3NwbGl0ICRtc2cgIlxuIl0gewotCQlpbmNyIG4KLQl9Ci0JaWYgeyEkc2VsZl9zaWduZWR9IHsKLQkJc2V0IG4gW2V4cHIgJG4gKyAyXQotCX0gZWxzZSB7Ci0JCXNldCBuIFtleHByICRuICsgMV0KLQl9Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlpZiB7JG4gPiAyNn0gewotCQkJc2V0IG4gMjYKLQkJfQotCX0KLQl0b3BsZXYgLmFjZXJ0Ci0Jc2Nyb2xsX3RleHQgLmFjZXJ0LmYgODMgJG4KLQotCWJ1dHRvbiAuYWNlcnQuaW5zcGVjdCAtdGV4dCAiSW5zcGVjdCBhbmQgbWF5YmUgU2F2ZSBDZXJ0IC4uLiIgLWNvbW1hbmQgImRlc3Ryb3kgLmFjZXJ0OyBzZXQgYWNjZXB0X2NlcnRfZGlhbG9nIDEiCi0JYnV0dG9uIC5hY2VydC5hY2NlcHQgIC10ZXh0ICJJZ25vcmUgQ2VydCBmb3IgT25lIENvbm5lY3Rpb24gICIgLWNvbW1hbmQgImRlc3Ryb3kgLmFjZXJ0OyBzZXQgYWNjZXB0X2NlcnRfZGlhbG9nIDIiCi0JYnV0dG9uIC5hY2VydC5jb250aW51ZSAtdGV4dCAiQ29udGludWUgYXMgdGhvdWdoIEkgc2F2ZWQgaXQgICAgICIgLWNvbW1hbmQgImRlc3Ryb3kgLmFjZXJ0OyBzZXQgYWNjZXB0X2NlcnRfZGlhbG9nIDMiCi0JYnV0dG9uIC5hY2VydC5jYW5jZWwgLXRleHQgIkNhbmNlbCIgICAtY29tbWFuZCAiZGVzdHJveSAuYWNlcnQ7IHNldCBhY2NlcHRfY2VydF9kaWFsb2cgMCIKLQotCXdtIHRpdGxlIC5hY2VydCAiVW5yZWNvZ25pemVkIFNTTCBDZXJ0ISIKLQotCS5hY2VydC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlwYWNrIC5hY2VydC5jYW5jZWwgLmFjZXJ0LmNvbnRpbnVlIC5hY2VydC5hY2NlcHQgLmFjZXJ0Lmluc3BlY3QgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5hY2VydC5mIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQotCi0JaWYgeyEgJHNlbGZfc2lnbmVkfSB7Ci0JCWNhdGNoIHsuYWNlcnQuaW5zcGVjdCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCX0KLQotCWNlbnRlcl93aW4gLmFjZXJ0Ci0KLQlnbG9iYWwgYWNjZXB0X2NlcnRfZGlhbG9nCi0Jc2V0IGFjY2VwdF9jZXJ0X2RpYWxvZyAiIgotCi0JamlnZ2xlX3RleHQgLmFjZXJ0LmYudAotCi0JdGt3YWl0IHdpbmRvdyAuYWNlcnQKLQotCWlmIHskYWNjZXB0X2NlcnRfZGlhbG9nID09IDJ9IHsKLQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDEKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyRhY2NlcHRfY2VydF9kaWFsb2cgPT0gM30gewotCQlyZXR1cm4gMQotCX0KLQlpZiB7JGFjY2VwdF9jZXJ0X2RpYWxvZyAhPSAxfSB7Ci0JCXJldHVybiAwCi0JfQotCi0JZ2xvYmFsIGFjY2VwdGVkX2NlcnRfZGlhbG9nX2luX3Byb2dyZXNzCi0Jc2V0IGFjY2VwdGVkX2NlcnRfZGlhbG9nX2luX3Byb2dyZXNzIDEKLQotCWdsb2JhbCBmZXRjaF9jZXJ0X2ZpbGVuYW1lCi0Jc2V0IGZldGNoX2NlcnRfZmlsZW5hbWUgJGNydAotCi0JZ2xvYmFsIGRvX3NhdmVfc2F2ZWRfaXQKLQlzZXQgZG9fc2F2ZV9zYXZlZF9pdCAwCi0JZ2xvYmFsIGRvX3NhdmVfc2F2ZWRfaGFzaF9pdAotCXNldCBkb19zYXZlX3NhdmVkX2hhc2hfaXQgMAotCi0JZmV0Y2hfZGlhbG9nICRjZXJ0X3RleHQgJGhwICRocCAxIDQ3IAotCXVwZGF0ZTsgYWZ0ZXIgMTUwCi0KLQljYXRjaCB7dGt3YWl0IHdpbmRvdyAuZmV0Y2h9Ci0JdXBkYXRlOyBhZnRlciAyNTAKLQljYXRjaCB7dGt3YWl0IHdpbmRvdyAuc2NydH0KLQl1cGRhdGU7IGFmdGVyIDI1MAotCWlmIFt3aW5mbyBleGlzdHMgLnNjcnRdIHsKLQkJY2F0Y2gge3Rrd2FpdCB3aW5kb3cgLnNjcnR9Ci0JfQotCi0Jc2V0IGZldGNoX2NlcnRfZmlsZW5hbWUgIiIKLQlzZXQgYWNjZXB0ZWRfY2VydF9kaWFsb2dfaW5fcHJvZ3Jlc3MgMAotCi0JaWYgeyEkZG9fc2F2ZV9zYXZlZF9oYXNoX2l0fSB7Ci0JCXNhdmVfaGFzaCAkY3J0ICRhZGlyICRocCAkZmluZ2VybGluZSAkZnJvbSAkZmluZ2VycHJpbnQgJHN1YmplY3RfaXNzdWVyCi0JfQotCi0JaWYgeyRkb19zYXZlX3NhdmVkX2l0fSB7Ci0JCXJldHVybiAxCi0JfSBlbHNlIHsKLQkJcmV0dXJuIDAKLQl9Ci19Ci0KLXByb2Mgc2F2ZV9oYXNoIHtjcnQgYWRpciBocCBmaW5nZXJsaW5lIGZyb20gZmluZ2VycHJpbnQge3N1YmplY3RfaXNzdWVyICIifX0gewotCWlmICFbZmlsZSBleGlzdHMgJGNydF0gewotCQlyZXR1cm4KLQl9Ci0Jc2V0IG9zc2wgW2dldF9vcGVuc3NsXQotCXNldCBoYXNoIFtleGVjICRvc3NsIHg1MDkgLWhhc2ggLW5vb3V0IC1pbiAkY3J0XQotCXNldCBoYXNoIFtzdHJpbmcgdHJpbSAkaGFzaF0KLQlpZiBbcmVnZXhwIHteKFswLTlhLWZdWzAtOWEtZl0qKX0gJGhhc2ggbXYgaF0gewotCQlzZXQgaGFzaGZpbGUgIiRhZGlyLyRoLjAiCi0JCXNldCBobiAiJGguMCIKLQkJaWYgW2ZpbGUgZXhpc3RzICRoYXNoZmlsZV0gewotCQkJc2V0IGhhc2hmaWxlICIkYWRpci8kaC4xIgotCQkJc2V0IGhuICIkaC4xIgotCQkJaWYgW2ZpbGUgZXhpc3RzICRoYXNoZmlsZV0gewotCQkJCXNldCBoYXNoZmlsZSAiJGFkaXIvJGguMiIKLQkJCQlzZXQgaG4gIiRoLjIiCi0JCQl9Ci0JCX0KLQkJc2V0IGZoIFtvcGVuICRjcnQgImEiXQotCQlpZiB7JGZoICE9ICIifSB7Ci0JCQlwdXRzICRmaCAiIgotCQkJcHV0cyAkZmggIlNTVk5DLWluZm86IgotCQkJcHV0cyAkZmggIkhvc3QtRGlzcGxheTogJGhwIgotCQkJcHV0cyAkZmggIiRmaW5nZXJsaW5lIgotCQkJcHV0cyAkZmggImhhc2gtZmlsZW5hbWU6ICRobiIKLQkJCXB1dHMgJGZoICJmdWxsLWZpbGVuYW1lOiAkZnJvbT0kZmluZ2VycHJpbnQuY3J0IgotCQkJcHV0cyAtbm9uZXdsaW5lICRmaCAkc3ViamVjdF9pc3N1ZXIKLQkJCWNsb3NlICRmaAotCQl9Ci0JCWNhdGNoIHtmaWxlIGNvcHkgLWZvcmNlICRjcnQgJGhhc2hmaWxlfQotCQlpZiBbZmlsZSBleGlzdHMgJGhhc2hmaWxlXSB7Ci0JCQlyZXR1cm4gMQotCQl9Ci0JfQotfQotCi1wcm9jIHRwaWQge30gewotCWdsb2JhbCBpc193aW5kb3dzCi0Jc2V0IHAgIiIKLQotCWlmIHshJGlzX3dpbmRvd3N9IHsKLQkJY2F0Y2gge3NldCBwIFtleGVjIHNoIC1jIHtlY2hvICQkfV19Ci0JfQotCWlmIHskcCA9PSAiIn0gewotCQlzZXQgcCBbcGlkXTsKLQl9Ci0JYXBwZW5kIHAgW2Nsb2NrIGNsaWNrc10KLQlyZXR1cm4gJHAKLX0KLQotcHJvYyByZXBlYXRlcl9wcm94eV9jaGVjayB7cHJveHl9IHsKLQlpZiBbcmVnZXhwIHtecmVwZWF0ZXI6Ly8uKlwrSUQ6WzAtOV19ICRwcm94eV0gewotCQlnbG9iYWwgZW52IHJwY19tMSBycGNfbTIgCi0JCWlmIHshW2luZm8gZXhpc3RzIHJwY19tMV19IHsKLQkJCXNldCBycGNfbTEgMAotCQkJc2V0IHJwY19tMiAwCi0JCX0KLQkJc2V0IGZvcmNlIDAKLQkJaWYgW2luZm8gZXhpc3RzIGVudihSRVBFQVRFUl9GT1JDRSldIHsKLQkJCWlmIHskZW52KFJFUEVBVEVSX0ZPUkNFKSAhPSAiIiAmJiAkZW52KFJFUEVBVEVSX0ZPUkNFKSAhPSAiMCJ9IHsKLQkJCQkjIG5vIGxvbmdlciBtYWtlcyBhIGRpZmZlcmVuY2UuCi0JCQkJc2V0IGZvcmNlIDEKLQkJCX0KLQkJfQotCQlnbG9iYWwgdXNlX2xpc3RlbiB1bHRyYV9kc20KLQkJaWYgeyEgJHVzZV9saXN0ZW59IHsKLQkJCWlmIHskdWx0cmFfZHNtfSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIHswfSB7Ci0JCQkJCW1lc2cgIldBUk5JTkc6IHJlcGVhdGVyOi8vIElEOm5ubiBwcm94eSBtaWdodCBuZWVkIExpc3RlbiBNb2RlIgotCQkJCQlpbmNyIHJwY19tMQotCQkJCQlpZiB7JHJwY19tMSA8PSAyfSB7Ci0JCQkJCQlhZnRlciAxMDAwCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZnRlciAyMDAKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiB7MH0gewotCQkJCQkjIG5vIGxvbmdlciByZXF1aXJlZCBieSB4MTF2bmMgKFgxMVZOQ19ESVNBQkxFX1NTTF9DTElFTlRfTU9ERSkKLQkJCQkJYmVsbAotCQkJCQltZXNnICJFUlJPUjogcmVwZWF0ZXI6Ly8gSUQ6bm5uIHByb3h5IG11c3QgdXNlIExpc3RlbiBNb2RlIgotCQkJCQlhZnRlciAxMDAwCi0JCQkJCXJldHVybiAwCi0JCQkJfQotCQkJfQotCQl9Ci0JCWdsb2JhbCBhbHdheXNfdmVyaWZ5X3NzbAotCQlpZiBbaW5mbyBleGlzdHMgYWx3YXlzX3ZlcmlmeV9zc2xdIHsKLQkJCWlmIHskYWx3YXlzX3ZlcmlmeV9zc2x9IHsKLQkJCQltZXNnICJXQVJOSU5HOiByZXBlYXRlcjovLyBJRDpubm4gVmVyaWZ5IEFsbCBDZXJ0cyBtYXkgZmFpbCIKLQkJCQlpbmNyIHJwY19tMgotCQkJCWlmIHskcnBjX20yID09IDF9IHsKLQkJCQkJYWZ0ZXIgMTUwMAotCQkJCX0gZWxzZWlmIHskcnBjX20yID09IDJ9IHsKLQkJCQkJYWZ0ZXIgNTAwCi0JCQkJfSBlbHNlIHsKLQkJCQkJYWZ0ZXIgMjAwCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiAxCi19Ci0KLXByb2MgZmluaV91bml4cHcge30gewotCWdsb2JhbCBuYW1lZF9waXBlX2ZoIHVuaXhwd190bXAKLQkKLQlpZiB7JG5hbWVkX3BpcGVfZmggIT0gIiJ9IHsKLQkJY2F0Y2gge2Nsb3NlICRuYW1lZF9waXBlX2ZofQotCX0KLQlpZiB7JHVuaXhwd190bXAgICE9ICIifSB7Ci0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkdW5peHB3X3RtcH0KLQl9Ci19Ci0KLXByb2MgaW5pdF91bml4cHcge2hwfSB7Ci0JZ2xvYmFsIHVzZV91bml4cHcgdW5peHB3X3VzZXJuYW1lIHVuaXhwd19wYXNzd2QKLQlnbG9iYWwgbmFtZWRfcGlwZV9maCB1bml4cHdfdG1wIGVudgotCQotCXNldCBuYW1lZF9waXBlX2ZoICIiCi0Jc2V0IHVuaXhwd190bXAgIiIKLQotCWlmIHskdXNlX3VuaXhwd30gewotCQlzZXQgbmFtZSAkdW5peHB3X3VzZXJuYW1lCi0JCXNldCBlbnYoU1NWTkNfVU5JWFBXKSAiIgotCQlpZiB7JG5hbWUgPT0gIiJ9IHsKLQkJCXJlZ3N1YiB7Xi4qOi8vfSAkaHAgIiIgaHAKLQkJCXNldCBocHRtcCBbZ2V0X3NzaF9ocCAkaHBdCi0JCQlpZiBbcmVnZXhwIHteKC4qKUB9ICRocHRtcCBtdiBtMV0gewotCQkJCXNldCBuYW1lICRtMQotCQkJfQotCQl9Ci0JCWlmIHskbmFtZSA9PSAiIn0gewotCQkJaWYgW2luZm8gZXhpc3RzIGVudihVU0VSKV0gewotCQkJCXNldCBuYW1lICRlbnYoVVNFUikKLQkJCX0KLQkJfQotCQlpZiB7JG5hbWUgPT0gIiJ9IHsKLQkJCWlmIFtpbmZvIGV4aXN0cyBlbnYoTE9HTkFNRSldIHsKLQkJCQlzZXQgbmFtZSAkZW52KExPR05BTUUpCi0JCQl9Ci0JCX0KLQkJaWYgeyRuYW1lID09ICIifSB7Ci0JCQlzZXQgbmFtZSBbZXhlYyB3aG9hbWldCi0JCX0KLQkJaWYgeyRuYW1lID09ICIifSB7Ci0JCQlzZXQgbmFtZSAidW5rbm93biIKLQkJfQotCi0JCXNldCB0bXAgIi90bXAvdW5peHBpcGUuW3RwaWRdIgotCQlzZXQgdG1wIFtteXRtcCAkdG1wXQotCQkjIG5lZWQgdG8gbWFrZSBpdCBhIHBpcGUKLQkJY2F0Y2gge2ZpbGUgZGVsZXRlICR0bXB9Ci0JCWlmIHtbZmlsZSBleGlzdHMgJHRtcF19IHsKLQkJCW1lc2cgImZpbGUgc3RpbGwgZXhpc3RzOiAkdG1wIgotCQkJYmVsbAotCQkJcmV0dXJuCi0JCX0KLQotCQljYXRjaCB7ZXhlYyBta25vZCAkdG1wIHB9Ci0JCXNldCBmaCAiIgotCQlpZiB7ISBbZmlsZSBleGlzdHMgJHRtcF19IHsKLQkJCWNhdGNoIHtzZXQgZmggW29wZW4gJHRtcCAidyJdfQotCQl9IGVsc2UgewotCQkJY2F0Y2gge3NldCBmaCBbb3BlbiAkdG1wICJyKyJdfQotCQkJc2V0IG5hbWVkX3BpcGVfZmggJGZoCi0JCX0KLQkJY2F0Y2gge2V4ZWMgY2htb2QgNjAwICR0bXB9Ci0JCWlmIHshIFtmaWxlIGV4aXN0cyAkdG1wXX0gewotCQkJbWVzZyAiY2Fubm90IGNyZWF0ZTogJHRtcCIKLQkJCWlmIHskbmFtZWRfcGlwZV9maCAhPSAiIn0ge2NhdGNoIGNsb3NlICRuYW1lZF9waXBlX2ZofQotCQkJYmVsbAotCQkJcmV0dXJuCi0JCX0KLQkJI3B1dHMgW2V4ZWMgbHMgLWwgJHRtcF0KLQkJc2V0IHVuaXhwd190bXAgJHRtcAotCQlwdXRzICRmaCAkbmFtZQotCQlwdXRzICRmaCAkdW5peHB3X3Bhc3N3ZAotCQlpZiB7JG5hbWVkX3BpcGVfZmggIT0gIiJ9IHsKLQkJCWZsdXNoICRmaAotCQl9IGVsc2UgewotCQkJY2xvc2UgJGZoCi0JCX0KLQkJZXhlYyBzaCAtYyAic2xlZXAgNjA7IC9iaW4vcm0gLWYgJHRtcCIgJgotCQlpZiB7JHVuaXhwd19wYXNzd2QgPT0gIiJ9IHsKLQkJCXNldCBlbnYoU1NWTkNfVU5JWFBXKSAiLiIKLQkJfSBlbHNlIHsKLQkJCXNldCBlbnYoU1NWTkNfVU5JWFBXKSAicm06JHRtcCIKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfVU5JWFBXKV0gewotCQkJc2V0IGVudihTU1ZOQ19VTklYUFcpICIiCi0JCX0KLQl9Ci19Ci0KLXByb2MgY2hlY2tfZm9yX2xpc3Rlbl9zc2xfY2VydCB7fSB7Ci0JZ2xvYmFsIG15Y2VydCB1c2VfbGlzdGVuIHVzZV9zc2ggdWx0cmFfZHNtCi0JaWYgeyEgJHVzZV9saXN0ZW59IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyR1c2Vfc3NofSB7Ci0JCXJldHVybiAxCi0JfQotCWlmIHskdWx0cmFfZHNtfSB7Ci0JCXJldHVybiAxCi0JfQotCWlmIHskbXljZXJ0ICE9ICIifSB7Ci0JCXJldHVybiAxCi0JfQotCi0Jc2V0IG5hbWUgW2dldF9pZGlyX2NlcnRzICIiXQotCXNldCBuYW1lICIkbmFtZS9saXN0ZW4ucGVtIgotCWlmIHtbZmlsZSBleGlzdHMgJG5hbWVdfSB7Ci0JCXNldCBteWNlcnQgJG5hbWUKLQkJbWVzZyAiVXNpbmcgTGlzdGVuIENlcnQ6ICRuYW1lIgotCQlhZnRlciA3MDAKLQkJcmV0dXJuIDEKLQl9Ci0KLQlzZXQgdGl0bGUgIlNTTCBMaXN0ZW4gcmVxdWlyZXMgTXlDZXJ0IjsKLQlzZXQgbXNnICJJbiBTU0wgTGlzdGVuIG1vZGUgYSBjZXJ0K2tleSBpcyByZXF1aXJlZCwgYnV0IHlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgICdNeUNlcnQnLlxuXG5DcmVhdGUgYSBjZXJ0K2tleSAnbGlzdGVuJyBub3c/IgotCXNldCByZXBseSBbdGtfbWVzc2FnZUJveCAtdHlwZSBva2NhbmNlbCAtZGVmYXVsdCBvayAtaWNvbiB3YXJuaW5nIC1tZXNzYWdlICRtc2cgLXRpdGxlICRtc2ddCi0JaWYgeyRyZXBseSA9PSAiY2FuY2VsIn0gewotCQlyZXR1cm4gMAotCX0KLQljcmVhdGVfY2VydCAkbmFtZQotCXRrd2FpdCB3aW5kb3cgLmNjcnQKLQlpZiB7W2ZpbGUgZXhpc3RzICRuYW1lXX0gewotCQlzZXQgbXljZXJ0ICRuYW1lCi0JCW1lc2cgIlVzaW5nIExpc3RlbiBDZXJ0OiAkbmFtZSIKLQkJYWZ0ZXIgNzAwCi0JCXJldHVybiAxCi0JfQotCXJldHVybiAwCi19Ci0KLXByb2MgbGlzdGVuX3ZlcmlmeV9hbGxfZGlhbG9nIHtocH0gewotCWdsb2JhbCB1c2VfbGlzdGVuIGFsd2F5c192ZXJpZnlfc3NsCi0JZ2xvYmFsIGRpZF9saXN0ZW5fdmVyaWZ5X2FsbF9kaWFsb2cKLQlnbG9iYWwgc3ZjZXJ0Ci0JZ2xvYmFsIHNzaHNzbF9zdyB1bHRyYV9kc20KLQotCWlmIHshJHVzZV9saXN0ZW59IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyEkYWx3YXlzX3ZlcmlmeV9zc2x9IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyRzdmNlcnQgIT0gIiJ9IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyR1bHRyYV9kc219IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHtedm5jOi8vfSAkaHBdIHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgW2luZm8gZXhpc3RzIHNzaHNzbF9zd10gewotCQlpZiB7JHNzaHNzbF9zdyA9PSAibm9uZSJ9IHsKLQkJCXJldHVybiAxCi0JCX0KLQkJaWYgeyRzc2hzc2xfc3cgPT0gInNzaCJ9IHsKLQkJCXJldHVybiAxCi0JCX0KLQl9Ci0JaWYgW2luZm8gZXhpc3RzIGRpZF9saXN0ZW5fdmVyaWZ5X2FsbF9kaWFsb2ddIHsKLQkJcmV0dXJuIDEKLQl9Ci0KLQl0b3BsZXYgLmx2ZAotCWdsb2JhbCBoZWxwX2ZvbnQKLQl3bSB0aXRsZSAubHZkICJWZXJpZnkgQWxsIENlcnRzIGZvciBSZXZlcnNlIENvbm5lY3Rpb25zIgotCWV2YWwgdGV4dCAubHZkLnQgLXdpZHRoIDU1IC1oZWlnaHQgMjIgJGhlbHBfZm9udAotCS5sdmQudCBpbnNlcnQgZW5kIHsKLSAgSW5mb3JtYXRpb246IAotCi0gICAgWW91IGhhdmUgdGhlICdWZXJpZnkgQWxsIENlcnRzJyBvcHRpb24gZW5hYmxlZAotICAgIGluIFJldmVyc2UgVk5DIENvbm5lY3Rpb25zICgtTElTVEVOKSBtb2RlLgotICAgCi0gICAgRm9yIHRoaXMgdG8gd29yaywgeW91IG11c3QgaGF2ZSBBTFJFQURZIHNhdmVkCi0gICAgdGhlIHJlbW90ZSBWTkMgU2VydmVyJ3MgQ2VydGlmaWNhdGUgdG8gdGhlCi0gICAgJ0FjY2VwdGVkIENlcnRzJyBkaXJlY3RvcnkuICBPdGhlcndpc2UgdGhlCi0gICAgaW5jb21pbmcgUmV2ZXJzZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVqZWN0ZWQuCi0gICAgCi0gICAgWW91IGNhbiBzYXZlIHRoZSBTZXJ2ZXIncyBDZXJ0aWZpY2F0ZSBieSB1c2luZwotICAgIHRoZSAnSW1wb3J0IENlcnRpZmljYXRlJyBkaWFsb2cgb3Igb24gVW5peAotICAgIGFuZCBNYWNPU1ggYnkgcHJlc3NpbmcgJ0ZldGNoIENlcnQnIGFuZCB0aGVuCi0gICAgaGF2ZSB0aGUgU2VydmVyIG1ha2UgYW4gaW5pdGlhbCBjb25uZWN0aW9uLgotCi0gICAgSWYgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgdGhlIGNlcnRpZmljYXRlIG9mCi0gICAgdGhlIFZOQyBTZXJ2ZXIgbWFraW5nIHRoZSBSZXZlcnNlIGNvbm5lY3Rpb24sCi0gICAgeW91IG11c3QgZGlzYWJsZSAnVmVyaWZ5IEFsbCBDZXJ0cycgKG5vdGUgdGhhdAotICAgIHRoaXMgbWVhbnMgdGhlIHNlcnZlciBhdXRoZW50aWNpdHkgd2lsbCBub3QgYmUKLSAgICBjaGVja2VkLikKLX0KLQotCWJ1dHRvbiAubHZkLm9rICAgLXRleHQgT0sgICAtY29tbWFuZCB7ZGVzdHJveSAubHZkfQotCWJ1dHRvbiAubHZkLm9rMiAgLXRleHQgT0sgICAtY29tbWFuZCB7ZGVzdHJveSAubHZkfQotCWJ1dHRvbiAubHZkLmRpc2FibGUgICAtdGV4dCAiRGlzYWJsZSAnVmVyaWZ5IEFsbCBDZXJ0cyciICAtY29tbWFuZCB7c2V0IGFsd2F5c192ZXJpZnlfc3NsIDA7IGRlc3Ryb3kgLmx2ZH0KLQlnbG9iYWwgdW5hbWUKLQlpZiB7JHVuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCXBhY2sgLmx2ZC50IC5sdmQub2syIC5sdmQuZGlzYWJsZSAubHZkLm9rIC1zaWRlIHRvcCAtZmlsbCB4Ci0JfSBlbHNlIHsKLQkJcGFjayAubHZkLnQgLmx2ZC5kaXNhYmxlIC5sdmQub2sgLXNpZGUgdG9wIC1maWxsIHgKLQl9Ci0JY2VudGVyX3dpbiAubHZkCi0JdXBkYXRlCi0KLQl0a3dhaXQgd2luZG93IC5sdmQKLQl1cGRhdGUKLQlhZnRlciA1MAotCXVwZGF0ZQotCi0Jc2V0IGRpZF9saXN0ZW5fdmVyaWZ5X2FsbF9kaWFsb2cgMQotCXJldHVybiAxCi19Ci0KLXByb2MgcmVzZXRfc3R1bm5lbF9leHRyYV9vcHRzIHt9IHsKLQlnbG9iYWwgc3R1bm5lbF9leHRyYV9vcHRzMCBzdHVubmVsX2V4dHJhX3N2Y19vcHRzMCBlbnYKLQlnbG9iYWwgc3N2bmNfbXVsdGlwbGVfbGlzdGVuMAotCWlmIHskc3R1bm5lbF9leHRyYV9vcHRzMCAhPSAibm9uZSJ9IHsKLQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX09QVFMpICRzdHVubmVsX2V4dHJhX29wdHMwCi0JfQotCWlmIHskc3R1bm5lbF9leHRyYV9zdmNfb3B0czAgIT0gIm5vbmUifSB7Ci0JCXNldCBlbnYoU1RVTk5FTF9FWFRSQV9TVkNfT1BUUykgJHN0dW5uZWxfZXh0cmFfc3ZjX29wdHMwCi0JfQotCXNldCBlbnYoU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEKSAiIgotCWlmIHskc3N2bmNfbXVsdGlwbGVfbGlzdGVuMCAhPSAibm9uZSJ9IHsKLQkJc2V0IGVudihTU1ZOQ19NVUxUSVBMRV9MSVNURU4pICRzc3ZuY19tdWx0aXBsZV9saXN0ZW4wCi0JfQotCXNldCBlbnYoU1NWTkNfVUxUUkFfRFNNKSAiIgotCXNldCBlbnYoU1NWTkNfVFVSQk9WTkMpICIiCi0JY2F0Y2ggeyB1bnNldCBlbnYoVk5DVklFV0VSX05PX1BJUEVMSU5FX1VQREFURVMpIH0KLQljYXRjaCB7IHVuc2V0IGVudihWTkNWSUVXRVJfTk9UVFkpIH0KLQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19BQ0NFUFRfUE9QVVApICAgIH0KLQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19BQ0NFUFRfUE9QVVBfU0MpIH0KLQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19LTk9XTl9IT1NUU19GSUxFKSAgICB9Ci19Ci0KLXByb2MgbWF5YmVfYWRkX3ZlbmNyeXB0IHtwcm94eSBocH0gewotCWdsb2JhbCB2ZW5jcnlwdF9kZXRlY3RlZCBzZXJ2ZXJfdmVuY3J5cHQKLQlzZXQgdnBkICIiCi0JaWYgeyR2ZW5jcnlwdF9kZXRlY3RlZCAhPSAiIn0gewotCQlzZXQgdnBkICR2ZW5jcnlwdF9kZXRlY3RlZAotCQlzZXQgdmVuY3J5cHRfZGV0ZWN0ZWQgIiIKLQl9IGVsc2VpZiB7JHNlcnZlcl92ZW5jcnlwdH0gewotCQlzZXQgdnBkIFtnZXRfdmVuY3J5cHRfcHJveHkgJGhwXQotCX0KLQlpZiB7JHZwZCAhPSAiIn0gewotCQltZXNnICJ2ZW5jcnlwdCBwcm94eTogJHZwZCIKLQkJaWYgeyRwcm94eSAhPSAiIn0gewotCQkJc2V0IHByb3h5ICIkcHJveHksJHZwZCIKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm94eSAiJHZwZCIKLQkJfQotCX0KLQlyZXR1cm4gJHByb3h5Ci19Ci0KLXByb2Mgbm9fY2VydHNfdHV0b3JpYWxfbWVzZyB7fSB7Ci0JZ2xvYmFsIHN2Y2VydCBjcnRkaXIKLQlnbG9iYWwgc2VydmVyX2Fub25kaCAKLQlnbG9iYWwgYWx3YXlzX3ZlcmlmeV9zc2wKLQotCXNldCBkb2l0IDAKLQlpZiB7ISRhbHdheXNfdmVyaWZ5X3NzbH0gewotCQlpZiB7JHN2Y2VydCA9PSAiIn0gewotCQkJaWYgeyRjcnRkaXIgPT0gIiIgfHwgJGNydGRpciA9PSAiQUNDRVBURURfQ0VSVFMifSB7Ci0JCQkJc2V0IGRvaXQgMQotCQkJfQotCQl9Ci0JfSBlbHNlaWYgeyRzZXJ2ZXJfYW5vbmRofSB7Ci0JCXNldCBkb2l0IDEKLQl9Ci0JaWYgeyRkb2l0fSB7Ci0JCW1lc2cgIklORk86IHdpdGhvdXQgQ2VydGlmaWNhdGUgY2hlY2tpbmcgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrIGlzIHBvc3NpYmxlLiIKLQl9IGVsc2UgewotCQlzZXQgc3RyICIiCi0JCWNhdGNoIHtzZXQgc3RyIFsubCBjZ2V0IC10ZXh0XX0KLQkJaWYgeyRzdHIgIT0gIiIgJiYgW3JlZ2V4cCB7XklORk86IHdpdGhvdXQgQ2VydGlmaWNhdGV9ICRzdHJdfSB7Ci0JCQltZXNnICIiCi0JCX0KLQl9Ci19Ci0KLXByb2MgdmVuY3J5cHRfdHV0b3JpYWxfbWVzZyB7fSB7Ci0JZ2xvYmFsIHVzZV9zc2ggdXNlX3NzaHNzbCB1c2VfbGlzdGVuCi0JZ2xvYmFsIHNlcnZlcl92ZW5jcnlwdCBub19wcm9iZV92ZW5jcnlwdAotCWdsb2JhbCB1bHRyYV9kc20gCi0KLQlzZXQgbSAiIgotCWlmIHskdXNlX3NzaH0gewotCQk7Ci0JfSBlbHNlaWYgeyRzZXJ2ZXJfdmVuY3J5cHR9IHsKLQkJOwotCX0gZWxzZWlmIHskdWx0cmFfZHNtfSB7Ci0JCTsKLQl9IGVsc2VpZiB7JHVzZV9saXN0ZW59IHsKLQkJc2V0IG0gIk5vIFZlTkNyeXB0IEF1dG8tRGV0ZWN0aW9uOiAgTGlzdGVuIG1vZGUuIgotCX0gZWxzZWlmIHskdXNlX3NzaHNzbH0gewotCQlzZXQgbSAiTm8gVmVOQ3J5cHQgQXV0by1EZXRlY3Rpb246ICBTU0grU1NMIG1vZGUuIgotCX0gZWxzZWlmIHskbm9fcHJvYmVfdmVuY3J5cHR9IHsKLQkJc2V0IG0gIk5vIFZlTkNyeXB0IEF1dG8tRGV0ZWN0aW9uOiAgRGlzYWJsZWQuIgotCX0KLQlpZiB7JG0gIT0gIiJ9IHsKLQkJbWVzZyAkbQotCQlhZnRlciAxMDAwCi0JfQotCXJldHVybiAkbQotCi0JI2dsb2JhbCBzdmNlcnQgYWx3YXlzX3ZlcmlmeV9zc2wKLQkjJHN2Y2VydCAhPSAiIiB8fCAhJGFsd2F5c192ZXJpZnlfc3NsCi0JIwlzZXQgbSAiTm8gVmVOQ3J5cHQgQXV0by1EZXRlY3Rpb246ICdWZXJpZnkgQWxsIENlcnRzJyBkaXNhYmxlZCIKLX0KLQotcHJvYyBsYXVuY2hfdW5peCB7aHB9IHsKLQlnbG9iYWwgc21iX3JlZGlyXzAgc21iX21vdW50cyBlbnYKLQlnbG9iYWwgdm5jYXV0aF9wYXNzd2QgdXNlX3VuaXhwdyB1bml4cHdfdXNlcm5hbWUgdW5peHB3X3Bhc3N3ZAotCWdsb2JhbCBzc2hfb25seSB0c19vbmx5IHVzZV94MTFjdXJzb3IgdXNlX25vYmVsbCB1c2VfcmF3bG9jYWwgdXNlX25vdHR5IHVzZV9wb3B1cGZpeCBzc3ZuY19zY2FsZSBzc3ZuY19lc2NhcGUKLQlnbG9iYWwgc3N2bmNfZW5jb2RpbmdzIHNzdm5jX2V4dHJhX29wdHMKLQotCWdsb2JhbGl6ZQotCi0Jc2V0IGNtZCAiIgotCi0JaWYge1tyZWdleHAge152bmNzc2g6Ly99ICRocF0gfHwgW3JlZ2V4cCB7XnZuY1wrc3NoOi8vfSAkaHBdfSB7Ci0JCXNldCB1c2Vfc3NsIDAKLQkJc2V0IHVzZV9zc2ggMQotCQlzeW5jX3VzZV9zc2xfc3NoCi0JfSBlbHNlaWYge1tyZWdleHAge152bmNzOi8vfSAkaHBdIHx8IFtyZWdleHAge152bmNzc2w6Ly99ICRocF0gfHwgW3JlZ2V4cCB7XnZuY1wrc3NsOi8vfSAkaHBdfSB7Ci0JCXNldCB1c2Vfc3NsIDEKLQkJc2V0IHVzZV9zc2ggMAotCQlzeW5jX3VzZV9zc2xfc3NoCi0JfQotCWlmIHtbcmVnZXhwIHtecnNoOi8/Lz99ICRocF19IHsKLQkJc2V0IHVzZV9zc2wgMAotCQlzZXQgdXNlX3NzaCAxCi0JCXN5bmNfdXNlX3NzbF9zc2gKLQl9Ci0KLQljaGVja19zc2hfbmVlZGVkCi0KLQlzZXRfc21iX21vdW50cwotCi0JZ2xvYmFsIGRpZF9wb3J0X2tub2NrCi0Jc2V0IGRpZF9wb3J0X2tub2NrIDAKLQlzZXQgcGtfaHAgIiIKLQotCXNldCBza2lwX3NzaCAwCi0Jc2V0IGRvX2RpcmVjdCAwCi0KLQlpZiBbcmVnZXhwIHt2bmM6Ly99ICRocF0gewotCQlzZXQgc2tpcF9zc2ggMQotCQlzZXQgZG9fZGlyZWN0IDEKLQkJaWYgeyEgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19FTkNfV0FSTildfSB7Ci0JCQlkaXJlY3RfY29ubmVjdF9tc2cKLQkJfQotCX0KLQotCWxpc3Rlbl92ZXJpZnlfYWxsX2RpYWxvZyAkaHAKLQotCWlmIHshICRkb19kaXJlY3R9IHsKLQkJaWYgeyEgW2NoZWNrX2Zvcl9saXN0ZW5fc3NsX2NlcnRdfSB7Ci0JCQlyZXR1cm4KLQkJfQotCX0KLQotCWdsb2JhbCBzdHVubmVsX2V4dHJhX29wdHMwIHN0dW5uZWxfZXh0cmFfc3ZjX29wdHMwCi0Jc2V0IHN0dW5uZWxfZXh0cmFfb3B0czAgIiIKLQlzZXQgc3R1bm5lbF9leHRyYV9zdmNfb3B0czAgIiIKLQlnbG9iYWwgc3N2bmNfbXVsdGlwbGVfbGlzdGVuMAotCXNldCBzc3ZuY19tdWx0aXBsZV9saXN0ZW4wICIiCi0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtzc2xyZXBlYXRlcjovL30gJGhwXX0gewotCQlpZiB7JGRpc2FibGVfc3NsX3dvcmthcm91bmRzfSB7Ci0JCQlzZXQgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMgMAotCQkJbWVzZyAiRGlzYWJsaW5nIFNTTCB3b3JrYXJvdW5kcyBmb3IgJ1VWTkMgU2luZ2xlIENsaWNrIElJSSBCdWcnIgotCQkJYWZ0ZXIgNDAwCi0JCX0KLQl9Ci0KLQlpZiBbaW5mbyBleGlzdHMgZW52KFNUVU5ORUxfRVhUUkFfT1BUUyldIHsKLQkJc2V0IHN0dW5uZWxfZXh0cmFfb3B0czAgJGVudihTVFVOTkVMX0VYVFJBX09QVFMpCi0JCWlmIHskZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHN9IHsKLQkJCWlmIHskZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfdHlwZSA9PSAibm9uZSJ9IHsKLQkJCQk7Ci0JCQl9IGVsc2VpZiB7JGRpc2FibGVfc3NsX3dvcmthcm91bmRzX3R5cGUgPT0gIm5vZW1wdHkifSB7Ci0JCQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX09QVFMpICIkZW52KFNUVU5ORUxfRVhUUkFfT1BUUylcbm9wdGlvbnMgPSBET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMiCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgZW52KFNUVU5ORUxfRVhUUkFfT1BUUykgIiRlbnYoU1RVTk5FTF9FWFRSQV9PUFRTKVxub3B0aW9ucyA9IEFMTCIKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIHskZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHN9IHsKLQkJCWlmIHskZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfdHlwZSA9PSAibm9uZSJ9IHsKLQkJCQk7Ci0JCQl9IGVsc2VpZiB7JGRpc2FibGVfc3NsX3dvcmthcm91bmRzX3R5cGUgPT0gIm5vZW1wdHkifSB7Ci0JCQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX09QVFMpICJvcHRpb25zID0gRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIgotCQkJfQotCQl9IGVsc2UgewotCQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX09QVFMpICJvcHRpb25zID0gQUxMIgotCQl9Ci0JfQotCWlmIHskc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uICYmICEgJHVzZV9saXN0ZW59IHsKLQkJaWYgeyRzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fdHlwZSA9PSAiaWRlbnQifSB7Ci0JCQlzZXQgdXNlciAiIgotCQkJaWYge1tpbmZvIGV4aXN0cyBlbnYoVVNFUildfSB7Ci0JCQkJc2V0IHVzZXIgJGVudihVU0VSKQotCQkJfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBlbnYoTE9HTkFNRSldfSB7Ci0JCQkJc2V0IHVzZXIgJGVudihVU0VSKQotCQkJfQotCQkJaWYgeyR1c2VyICE9ICIifSB7Ci0JCQkJaWYgW2luZm8gZXhpc3RzIGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKV0gewotCQkJCQlzZXQgc3R1bm5lbF9leHRyYV9zdmNfb3B0czAgJGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKQotCQkJCQlzZXQgZW52KFNUVU5ORUxfRVhUUkFfU1ZDX09QVFMpICIkZW52KFNUVU5ORUxfRVhUUkFfU1ZDX09QVFMpXG5pZGVudCA9ICR1c2VyIgotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBlbnYoU1RVTk5FTF9FWFRSQV9TVkNfT1BUUykgImlkZW50ID0gJHVzZXIiCi0JCQkJfQotCQkJfQotCQl9IGVsc2VpZiB7JHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbl90eXBlID09ICJleGVjIn0gewotCQkJaWYgW2luZm8gZXhpc3RzIGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKV0gewotCQkJCXNldCBzdHVubmVsX2V4dHJhX3N2Y19vcHRzMCAkZW52KFNUVU5ORUxfRVhUUkFfU1ZDX09QVFMpCi0JCQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKSAiJGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKVxuI3N0dW5uZWwtZXhlYyIKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IGVudihTVFVOTkVMX0VYVFJBX1NWQ19PUFRTKSAiI3N0dW5uZWwtZXhlYyIKLQkJCX0KLQkJfQotCX0KLQlpZiB7JHVsdHJhX2RzbX0gewotCQlpZiB7JHVsdHJhX2RzbV90eXBlID09ICJzZWN1cmV2bmMifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHshW2ZpbGUgZXhpc3RzICR1bHRyYV9kc21fZmlsZV0gJiYgIVtyZWdleHAge3B3PX0gJHVsdHJhX2RzbV9maWxlXX0gewotCQkJbWVzZyAiRFNNIGtleSBmaWxlIGRvZXMgZXhpc3Q6ICR1bHRyYV9kc21fZmlsZSIgCi0JCQliZWxsCi0JCQlhZnRlciAxMDAwCi0JCQlyZXR1cm4KLQkJfQotCQlnbG9iYWwgdm5jYXV0aF9wYXNzd2QKLQkJaWYgeyR1bHRyYV9kc21fZmlsZSA9PSAicHc9Vk5DUEFTU1dPUkQiIHx8ICR1bHRyYV9kc21fZmlsZSA9PSAicHc9Vk5DUEFTU1dEIn0gewotCQkJaWYgeyFbaW5mbyBleGlzdHMgdm5jYXV0aF9wYXNzd2RdIHx8ICR2bmNhdXRoX3Bhc3N3ZCA9PSAiIn0gewotCQkJCW1lc2cgIkZvciBEU00gcHc9Vk5DUEFTU1dEIHlvdSBtdXN0IHN1cHBseSB0aGUgVk5DIFBhc3N3b3JkIiAKLQkJCQliZWxsCi0JCQkJYWZ0ZXIgMTAwMAotCQkJCXJldHVybgotCQkJfQotCQkJaWYgW3JlZ2V4cCB7J30gJHZuY2F1dGhfcGFzc3dkXSB7Ci0JCQkJbWVzZyAiRm9yIERTTSBwdz1WTkNQQVNTV0QgcGFzc3dvcmQgbXVzdCBub3QgY29udGFpbiBzaW5nbGUgcXVvdGVzLiIgCi0JCQkJYmVsbAotCQkJCWFmdGVyIDEwMDAKLQkJCQlyZXR1cm4KLQkJCX0KLQkJfQotCQlzZXQgZHNtICJ1bHRyYXZuY19kc21faGVscGVyICIKLQkJaWYgeyR1bHRyYV9kc21fbm91bHRyYX0gewotCQkJYXBwZW5kIGRzbSAibm91bHRyYToiCi0JCX0KLQkJaWYgeyR1c2VfbGlzdGVufSB7Ci0JCQlhcHBlbmQgZHNtICJyZXY6IgotCQl9Ci0JCWlmIHskdWx0cmFfZHNtX3R5cGUgPT0gImd1ZXNzIn0gewotCQkJYXBwZW5kIGRzbSAiLiIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBkc20gJHVsdHJhX2RzbV90eXBlCi0JCX0KLQkJaWYgeyR1bHRyYV9kc21fbm91bHRyYX0gewotCQkJaWYgeyR1bHRyYV9kc21fc2FsdCAhPSAiIn0gewotCQkJCWFwcGVuZCBkc20gIkAkdWx0cmFfZHNtX3NhbHQiCi0JCQl9Ci0JCX0KLQkJaWYgeyR1bHRyYV9kc21fZmlsZSA9PSAicHc9Vk5DUEFTU1dPUkQiIHx8ICR1bHRyYV9kc21fZmlsZSA9PSAicHc9Vk5DUEFTU1dEIn0gewotCQkJYXBwZW5kIGRzbSAiIHB3PSckdm5jYXV0aF9wYXNzd2QnIgotCQl9IGVsc2UgewotCQkJaWYgeyR1bHRyYV9kc21fZmlsZSA9PSAiIiAmJiAkdWx0cmFfZHNtX3R5cGUgPT0gInNlY3VyZXZuYyJ9IHsKLQkJCQlhcHBlbmQgZHNtICIgbm9uZSIKLQkJCX0gZWxzZSB7Ci0JCQkJYXBwZW5kIGRzbSAiICR1bHRyYV9kc21fZmlsZSIKLQkJCX0KLQkJfQotCQlzZXQgZW52KFNTVk5DX1VMVFJBX0RTTSkgJGRzbQotCX0KLQlpZiB7JG11bHRpcGxlX2xpc3RlbiAmJiAkdXNlX2xpc3Rlbn0gewotCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX01VTFRJUExFX0xJU1RFTildIHsKLQkJCXNldCBzc3ZuY19tdWx0aXBsZV9saXN0ZW4wICRlbnYoU1NWTkNfTVVMVElQTEVfTElTVEVOKQotCQl9Ci0JCXNldCBlbnYoU1NWTkNfTVVMVElQTEVfTElTVEVOKSAiMSIKLQl9Ci0KLQlpZiB7JHVzZV9zc2h9IHsKLQkJOwotCX0gZWxzZWlmIHskdXNlX3NzaHNzbH0gewotCQk7Ci0JfSBlbHNlaWYgeyR1c2Vfc3NsfSB7Ci0JCXNldCBwcm94ICBbZ2V0X3NzaF9wcm94eSAkaHBdCi0JCWlmIHskcHJveCAhPSAiIiAmJiBbcmVnZXhwIHtAfSAkcHJveF19IHsKLQkJCW1lc2cgIkVycm9yOiBwcm94eSBjb250YWlucyAnQCcgIERpZCB5b3UgbWVhbiB0byB1c2UgU1NIIG1vZGU/IgotCQkJYmVsbAotCQkJcmV0dXJuCi0JCX0KLQkJaWYgW3JlZ2V4cCB7QH0gJGhwXSB7Ci0JCQltZXNnICJFcnJvcjogaG9zdCBjb250YWlucyAnQCcgIERpZCB5b3UgbWVhbiB0byB1c2UgU1NIIG1vZGU/IgotCQkJYmVsbAotCQkJcmV0dXJuCi0JCX0KLQl9Ci0KLQlpZiB7JHVzZV9zc2ggfHwgJHVzZV9zc2hzc2x9IHsKLQkJaWYgeyRzc2hfbG9jYWxfcHJvdGVjdGlvbn0gewotCQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KExJTV9BQ0NFUFQpXX0gewotCQkJCXNldCBlbnYoTElNX0FDQ0VQVCkgMQotCQkJfQotCQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KExJTV9BQ0NFUFRfVElNRSldfSB7Ci0JCQkJc2V0IGVudihMSU1fQUNDRVBUX1RJTUUpIDM1Ci0JCQl9Ci0JCQlzZXQgZW52KFNTVk5DX0xJTV9BQ0NFUFRfUFJFTE9BRCkgImxpbV9hY2NlcHQuc28iCi0JCQltZXNnICJTU0ggTElNX0FDQ0VQVCgkZW52KExJTV9BQ0NFUFQpLCRlbnYoTElNX0FDQ0VQVF9USU1FKSk6IGxpbV9hY2NlcHQuc28iCi0JCQlhZnRlciA3MDAKLQkJfQotCQlpZiB7JHNraXBfc3NoIHx8ICR1bHRyYV9kc219IHsKLQkJCXNldCBjbWQgInNzX3ZuY3ZpZXdlciIKLQkJfSBlbHNlaWYgeyR1c2Vfc3NofSB7Ci0JCQlzZXQgY21kICJzc192bmN2aWV3ZXIgLXNzaCIKLQkJfSBlbHNlIHsKLQkJCXNldCBjbWQgInNzX3ZuY3ZpZXdlciAtc3Noc3NsIgotCQkJaWYgeyRteWNlcnQgIT0gIiJ9IHsKLQkJCQlzZXQgY21kICIkY21kIC1teWNlcnQgJyRteWNlcnQnIgotCQkJfQotCQkJaWYgeyRjcmxmaWwgIT0gIiJ9IHsKLQkJCQlzZXQgY21kICIkY21kIC1jcmwgJyRjcmxmaWwnIgotCQkJfQotCQkJaWYgeyRzdmNlcnQgIT0gIiJ9IHsKLQkJCQlzZXQgY21kICIkY21kIC12ZXJpZnkgJyRzdmNlcnQnIgotCQkJfSBlbHNlaWYgeyRjcnRkaXIgIT0gIiIgJiYgJGNydGRpciAhPSAiQUNDRVBURURfQ0VSVFMifSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtdmVyaWZ5ICckY3J0ZGlyJyIKLQkJCX0KLQkJfQotCQlpZiB7JHVzZV9saXN0ZW59IHsKLQkJCXNldCBjbWQgIiRjbWQgLWxpc3RlbiIKLQkJfQotCQlpZiB7JHNzaF9sb2NhbF9wcm90ZWN0aW9ufSB7Ci0JCQlyZWdzdWIge3NzX3ZuY3ZpZXdlcn0gJGNtZCAic3N2bmNfY21kIiBjbWQKLQkJfQotCQlzZXQgaHBuZXcgIFtnZXRfc3NoX2hwICRocF0KLQkJc2V0IHByb3h5ICBbZ2V0X3NzaF9wcm94eSAkaHBdCi0JCXNldCBzc2hjbWQgW2dldF9zc2hfY21kICRocF0KLQotCQlpZiB7JHVzZV9zc2hzc2x9IHsKLQkJCWlmIHshJGRvX2RpcmVjdH0gewotCQkJCXNldCBwcm94eSBbbWF5YmVfYWRkX3ZlbmNyeXB0ICRwcm94eSAkaHBdCi0JCQl9Ci0JCX0KLQotCQlpZiB7JHRzX29ubHl9IHsKLQkJCXJlZ3N1YiB7OjAkfSAkaHBuZXcgIiIgaHBuZXcgCi0JCQlpZiB7JHByb3h5ID09ICIifSB7Ci0JCQkJIyBYWFggaG9zdF9wYXJ0Ci0JCQkJaWYge1tyZWdleHAge14oW146XSopOihbMC05XVswLTldKikkfSAkaHBuZXcgbXYgc3NoaHN0IHNzaHB0XX0gewotCQkJCQlzZXQgcHJveHkgIiRzc2hoc3Q6JHNzaHB0IgotCQkJCQlzZXQgaHBuZXcgImxvY2FsaG9zdCIKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIHshW3JlZ2V4cCB7LH0gJHByb3h5XX0gewotCQkJCQlpZiB7JGhwbmV3ICE9ICJsb2NhbGhvc3QifSB7Ci0JCQkJCQlzZXQgcHJveHkgIiRwcm94eSwkaHBuZXciCi0JCQkJCQlzZXQgaHBuZXcgImxvY2FsaG9zdCIKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0jcHV0cyBocD0kaHAKLSNwdXRzIGhwbj0kaHBuZXcKLSNwdXRzIHB4eT0kcHJveHkKLSNwdXRzIGNtZD0kc3NoY21kCi0KLQkJc2V0IGhwICRocG5ldwotCi0JCWlmIHskcHJveHkgIT0gIiJ9IHsKLQkJCXNldCBjbWQgIiRjbWQgLXByb3h5ICckcHJveHknIgotCQkJc2V0IHBrX2hwICRwcm94eQotCQl9Ci0JCWlmIHskcGtfaHAgPT0gIiJ9IHsKLQkJCXNldCBwa19ocCAkaHAKLQkJfQotCi0JCXNldCBkb19wcmUgMAotCQlpZiB7JHVzZV9zbWJtbnR9ICB7Ci0JCQlzZXQgZG9fcHJlIDEKLQkJfSBlbHNlaWYgeyR1c2Vfc291bmQgJiYgJHNvdW5kX2RhZW1vbl9raWxsfSB7Ci0JCQlzZXQgZG9fcHJlIDEKLQkJfQotCQlnbG9iYWwgc2tpcF9wcmUKLQkJaWYgeyRza2lwX3ByZSB8fCAkc2tpcF9zc2h9IHsKLQkJCXNldCBkb19wcmUgMAotCQkJc2V0IHNraXBfcHJlIDAKLQkJfQotCi0JCXNldCB0YWcgW2NvbnRhZ10KLQotCQlpZiB7JGRvX3ByZX0gewotCQkJZG9fdW5peF9wcmUgJHRhZyAkcHJveHkgJGhwICRwa19ocAotCQl9Ci0KLQotCQlzZXQgc2V0dXBfY21kcyBbdWdseV9zZXR1cF9zY3JpcHRzIHBvc3QgJHRhZ10gCi0KLQkJaWYgeyRza2lwX3NzaH0gewotCQkJc2V0IHNldHVwX2NtZHMgIiIKLQkJfQotCQlpZiB7JHNzaGNtZCAhPSAiU0hFTEwiICYmIFtyZWdleHAgLW5vY2FzZSB7eDExdm5jfSAkc3NoY21kXX0gewotCQkJZ2xvYmFsIHVzZV9jdXBzIGN1cHNfeDExdm5jIGN1cHNfcmVtb3RlX3BvcnQKLQkJCWdsb2JhbCBjdXBzX3JlbW90ZV9zbWJfcG9ydAotCQkJZ2xvYmFsIHVzZV9zb3VuZCBzb3VuZF9kYWVtb25feDExdm5jIHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCAKLQkJCWdsb2JhbCB0c19vbmx5Ci0JCQlpZiB7JHRzX29ubHl9IHsKLQkJCQlzZXQgY3Vwc194MTF2bmMgMQotCQkJCXNldCBzb3VuZF9kYWVtb25feDExdm5jIDEKLQkJCX0KLQkJCWlmIHskdXNlX2N1cHMgJiYgJGN1cHNfeDExdm5jICYmICRjdXBzX3JlbW90ZV9wb3J0ICE9ICIifSB7Ci0JCQkJc2V0IGNycCAkY3Vwc19yZW1vdGVfcG9ydAotCQkJCWlmIHskdHNfb25seX0gewotCQkJCQlzZXQgY3Vwc19yZW1vdGVfcG9ydCBbcmFuZF9wb3J0XQotCQkJCQlzZXQgY3JwICJEQUVNT04tJGN1cHNfcmVtb3RlX3BvcnQiCi0JCQkJfQotCQkJCXNldCBzc2hjbWQgIiRzc2hjbWQgLWVudiBGRF9DVVBTPSRjcnAiCi0JCQl9Ci0JCQlpZiB7JHVzZV9jdXBzICYmICRjdXBzX3gxMXZuYyAmJiAkY3Vwc19yZW1vdGVfc21iX3BvcnQgIT0gIiJ9IHsKLQkJCQlzZXQgY3NwICRjdXBzX3JlbW90ZV9zbWJfcG9ydAotCQkJCWlmIHskdHNfb25seX0gewotCQkJCQlzZXQgY3Vwc19yZW1vdGVfc21iX3BvcnQgW3JhbmRfcG9ydF0KLQkJCQkJc2V0IGNzcCAiREFFTU9OLSRjdXBzX3JlbW90ZV9zbWJfcG9ydCIKLQkJCQl9Ci0JCQkJc2V0IHNzaGNtZCAiJHNzaGNtZCAtZW52IEZEX1NNQj0kY3NwIgotCQkJfQotCQkJaWYgeyR1c2Vfc291bmQgJiYgJHNvdW5kX2RhZW1vbl94MTF2bmMgJiYgJHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCAhPSAiIn0gewotCQkJCXNldCBzcnAgJHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydAotCQkJCWlmIHskdHNfb25seX0gewotCQkJCQlzZXQgc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0IFtyYW5kX3BvcnRdCi0JCQkJCXNldCBzcnAgIkRBRU1PTi0kc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0IgotCQkJCX0KLQkJCQlzZXQgc3NoY21kICIkc3NoY21kIC1lbnYgRkRfRVNEPSRzcnAiCi0JCQl9Ci0JCX0KLQotCQlpZiB7JHNzaGNtZCA9PSAiU0hFTEwifSB7Ci0JCQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9TU0hfQ01EKSB7JFNIRUxMfQotCQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX09OTFkpIDEKLQkJfSBlbHNlaWYgeyRzZXR1cF9jbWRzICE9ICIifSB7Ci0JCQlpZiB7JHNzaGNtZCA9PSAiIn0gewotCQkJCXNldCBzc2hjbWQgInNsZWVwIDE1IgotCQkJfQotCQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX0NNRCkgIiRzZXR1cF9jbWRzJHNzaGNtZCIKLQkJfSBlbHNlIHsKLQkJCWlmIHskc3NoY21kICE9ICIifSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtc3NoY21kICckc3NoY21kJyIKLQkJCX0KLQkJfQotCQkKLQkJc2V0IHNzaGFyZ3MgIiIKLQkJaWYgeyR1c2VfY3Vwc30gewotCQkJYXBwZW5kIHNzaGFyZ3MgW2dldF9jdXBzX3JlZGlyXQotCQl9Ci0JCWlmIHskdXNlX3NvdW5kfSB7Ci0JCQlhcHBlbmQgc3NoYXJncyBbZ2V0X3NvdW5kX3JlZGlyXQotCQl9Ci0JCWlmIHskYWRkaXRpb25hbF9wb3J0X3JlZGlyc30gewotCQkJYXBwZW5kIHNzaGFyZ3MgW2dldF9hZGRpdGlvbmFsX3JlZGlyXQotCQl9Ci0KLQkJc2V0IHNzaGFyZ3MgW3N0cmluZyB0cmltICRzc2hhcmdzXQotCQlpZiB7JHNraXBfc3NofSB7Ci0JCQlzZXQgc3NoYXJncyAiIgotCQl9Ci0JCWlmIHskc3NoYXJncyAhPSAiIn0gewotCQkJc2V0IGNtZCAiJGNtZCAtc3NoYXJncyAnJHNzaGFyZ3MnIgotCQkJc2V0IGVudihTU19WTkNWSUVXRVJfVVNFX0MpIDEKLQkJfSBlbHNlIHsKLQkJCSMgaG1tIHdlIHVzZWQgdG8gaGF2ZSBpdCBvZmYuLi4gd2h5PwotCQkJIyBzc2ggdHlwaW5nIHJlc3BvbnNlPwotCQkJc2V0IGVudihTU19WTkNWSUVXRVJfVVNFX0MpIDEKLQkJfQotCQlpZiB7JHNzaGNtZCA9PSAiU0hFTEwifSB7Ci0JCQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9TU0hfT05MWSkgMQotCQkJaWYgeyRwcm94eSA9PSAiIn0gewotCQkJCXNldCBocHQgJGhwbmV3Ci0JCQkJIyBYWFggaG9zdF9wYXJ0Ci0JCQkJcmVnc3ViIHs6WzAtOV1bMC05XSokfSAkaHB0ICIiIGhwdAotCQkJCXNldCBjbWQgIiRjbWQgLXByb3h5ICckaHB0JyIKLQkJCX0KLQkJCXNldCBnZW9tZXRyeSBbeHRlcm1fY2VudGVyX2dlb21ldHJ5XQotCQkJaWYgeyRwa19ocCA9PSAiIn0gewotCQkJCXNldCBwa19ocCAkaHAKLQkJCX0KLQkJCWlmIHshICRkaWRfcG9ydF9rbm9ja30gewotCQkJCWlmIHshIFtkb19wb3J0X2tub2NrICRwa19ocCBzdGFydF19IHsKLQkJCQkJcmVzZXRfc3R1bm5lbF9leHRyYV9vcHRzCi0JCQkJCXJldHVybgotCQkJCX0KLQkJCQlzZXQgZGlkX3BvcnRfa25vY2sgMQotCQkJfQotCi0JCQlpZiB7W3JlZ2V4cCB7RklOSVNIfSAkcG9ydF9rbm9ja2luZ19saXN0XX0gewotCQkJCXdtIHdpdGhkcmF3IC4KLQkJCQl1cGRhdGUKLQkJCQl1bml4X3Rlcm1pbmFsX2NtZCAkZ2VvbWV0cnkgIlNIRUxMIHRvICRocCIgIiRjbWQiCi0JCQkJd20gZGVpY29uaWZ5IC4KLQkJCQl1cGRhdGUKLQkJCQlkb19wb3J0X2tub2NrICRwa19ocCBmaW5pc2gKLQkJCX0gZWxzZSB7Ci0JCQkJdW5peF90ZXJtaW5hbF9jbWQgJGdlb21ldHJ5ICJTSEVMTCB0byAkaHAiICIkY21kIiAxCi0JCQl9Ci0JCQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9TU0hfQ01EKSAiIgotCQkJc2V0IGVudihTU19WTkNWSUVXRVJfU1NIX09OTFkpICIiCi0JCQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9VU0VfQykgIiIKLQkJCXJlc2V0X3N0dW5uZWxfZXh0cmFfb3B0cwotCQkJcmV0dXJuCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgY21kICJzc3ZuY19jbWQiCi0JCXNldCBocG5ldyAgW2dldF9zc2hfaHAgJGhwXQotCQlzZXQgcHJveHkgIFtnZXRfc3NoX3Byb3h5ICRocF0KLQotCQlpZiB7ISRkb19kaXJlY3QgJiYgIVtyZXBlYXRlcl9wcm94eV9jaGVjayAkcHJveHldfSB7Ci0JCQlyZXNldF9zdHVubmVsX2V4dHJhX29wdHMKLQkJCXJldHVybgotCQl9Ci0KLQkJaWYgeyEgJGRvX2RpcmVjdCAmJiAhICR1bHRyYV9kc20gJiYgIVtyZWdleHAgLW5vY2FzZSB7c3NoOi8vfSAkaHBuZXddfSB7Ci0JCQlzZXQgZGlkX2NoZWNrIDAKLQkJCWlmIHskbXljZXJ0ICE9ICIifSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtbXljZXJ0ICckbXljZXJ0JyIKLQkJCX0KLQkJCWlmIHskY3JsZmlsICE9ICIifSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtY3JsICckY3JsZmlsJyIKLQkJCX0KLQkJCWlmIHskc3ZjZXJ0ICE9ICIifSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtdmVyaWZ5ICckc3ZjZXJ0JyIKLQkJCX0gZWxzZWlmIHskY3J0ZGlyICE9ICIifSB7Ci0JCQkJaWYgeyRjcnRkaXIgPT0gIkFDQ0VQVEVEX0NFUlRTIn0gewotCQkJCQlnbG9iYWwgc2tpcF92ZXJpZnlfYWNjZXB0ZWRfY2VydHMKLQkJCQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDAKLQotCQkJCQlzZXQgZGlkX2NoZWNrIDEKLQkJCQkJaWYgeyEgW2NoZWNrX2FjY2VwdGVkX2NlcnRzIDBdfSB7Ci0JCQkJCQlyZXNldF9zdHVubmVsX2V4dHJhX29wdHMKLQkJCQkJCXJldHVybgotCQkJCQl9Ci0JCQkJCWlmIHshICRza2lwX3ZlcmlmeV9hY2NlcHRlZF9jZXJ0c30gewotCQkJCQkJc2V0IGFkaXIgW2dldF9pZGlyX2NlcnRzICIiXQotCQkJCQkJc2V0IGFkaXIgIiRhZGlyL2FjY2VwdGVkIgotCQkJCQkJY2F0Y2gge2ZpbGUgbWtkaXIgJGFkaXJ9Ci0JCQkJCQlzZXQgY21kICIkY21kIC12ZXJpZnkgJyRhZGlyJyIKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0IGNtZCAiJGNtZCAtdmVyaWZ5ICckY3J0ZGlyJyIKLQkJCQl9Ci0JCQl9Ci0JCQlpZiB7ISAkZGlkX2NoZWNrfSB7Ci0JCQkJY2hlY2tfYWNjZXB0ZWRfY2VydHMgMQotCQkJfQotCQl9Ci0KLQkJaWYgeyEkZG9fZGlyZWN0fSB7Ci0JCQlzZXQgcHJveHkgW21heWJlX2FkZF92ZW5jcnlwdCAkcHJveHkgJGhwXQotCQl9Ci0KLQkJaWYgeyRwcm94eSAhPSAiIn0gewotCQkJc2V0IGNtZCAiJGNtZCAtcHJveHkgJyRwcm94eSciCi0JCX0KLQkJc2V0IGhwICRocG5ldwotCQlpZiBbcmVnZXhwIHteLipAfSAkaHAgbWF0Y2hdIHsKLQkJCWNhdGNoIHtyYWlzZSAuOyB1cGRhdGV9Ci0JCQltZXNnICJUcmltbWluZyBcIiRtYXRjaFwiIGZyb20gaG9zdG5hbWUiCi0JCQlhZnRlciA3MDAKLQkJCXJlZ3N1YiB7Xi4qQH0gJGhwICIiIGhwCi0JCX0KLQkJaWYgW3JlZ2V4cCB7QH0gJHByb3h5XSB7Ci0JCQliZWxsCi0JCQljYXRjaCB7cmFpc2UgLjsgdXBkYXRlfQotCQkJbWVzZyAiV0FSTklORzogU1NMIHByb3h5IGNvbnRhaW5zIFwiQFwiIHNpZ24iCi0JCQlhZnRlciAxNTAwCi0JCX0KLQl9Ci0KLQlnbG9iYWwgYW5vbl9kaF9kZXRlY3RlZAotCWlmIHskYW5vbl9kaF9kZXRlY3RlZCB8fCAkc2VydmVyX2Fub25kaH0gewotCQlpZiB7ISRkb19kaXJlY3R9IHsKLQkJCXNldCBjbWQgIiRjbWQgLWFub25kaCIKLQkJfQotCQlzZXQgYW5vbl9kaF9kZXRlY3RlZCAwCi0JfQotCWlmIHskdXNlX2FscGhhfSB7Ci0JCXNldCBjbWQgIiRjbWQgLWFscGhhIgotCX0KLQlpZiB7JHVzZV9zZW5kX2NsaXBib2FyZH0gewotCQlzZXQgY21kICIkY21kIC1zZW5kY2xpcGJvYXJkIgotCX0KLQlpZiB7JHVzZV9zZW5kX2Fsd2F5c30gewotCQlzZXQgY21kICIkY21kIC1zZW5kYWx3YXlzIgotCX0KLQlpZiB7JHVzZV90dXJib3ZuY30gewotCQlzZXQgZW52KFNTVk5DX1RVUkJPVk5DKSAxCi0JfQotCWlmIHskZGlzYWJsZV9waXBlbGluZX0gewotCQlzZXQgZW52KFZOQ1ZJRVdFUl9OT19QSVBFTElORV9VUERBVEVTKSAxCi0JfQotCWlmIHskc3NoX2tub3duX2hvc3RzX2ZpbGVuYW1lICE9ICIifSB7Ci0JCXNldCBlbnYoU1NWTkNfS05PV05fSE9TVFNfRklMRSkgJHNzaF9rbm93bl9ob3N0c19maWxlbmFtZQotCX0KLQlpZiB7JHVzZV9ncmFifSB7Ci0JCXNldCBjbWQgIiRjbWQgLWdyYWIiCi0JfQotCWlmIHskdXNlX3gxMWN1cnNvcn0gewotCQlzZXQgY21kICIkY21kIC14MTFjdXJzb3IiCi0JfQotCWlmIHskdXNlX25vYmVsbH0gewotCQlzZXQgY21kICIkY21kIC1ub2JlbGwiCi0JfQotCWlmIHskdXNlX3Jhd2xvY2FsfSB7Ci0JCXNldCBjbWQgIiRjbWQgLXJhd2xvY2FsIgotCX0KLQlpZiB7JHVzZV9ub3R0eX0gewotCQlzZXQgZW52KFZOQ1ZJRVdFUl9OT1RUWSkgMQotCX0KLQlpZiB7JHVzZV9wb3B1cGZpeH0gewotCQlzZXQgY21kICIkY21kIC1wb3B1cGZpeCIKLQl9Ci0JaWYgeyRzc3ZuY19zY2FsZSAhPSAiIn0gewotCQlzZXQgY21kICIkY21kIC1zY2FsZSAnJHNzdm5jX3NjYWxlJyIKLQl9Ci0JaWYgeyRzc3ZuY19lc2NhcGUgIT0gIiJ9IHsKLQkJc2V0IGNtZCAiJGNtZCAtZXNjYXBlICckc3N2bmNfZXNjYXBlJyIKLQl9Ci0JaWYgeyRzc3ZuY19lbmNvZGluZ3MgIT0gIiJ9IHsKLQkJc2V0IGNtZCAiJGNtZCAtc3N2bmNfZW5jb2RpbmdzICckc3N2bmNfZW5jb2RpbmdzJyIKLQl9Ci0JaWYgeyRzc3ZuY19leHRyYV9vcHRzICE9ICIifSB7Ci0JCXNldCBjbWQgIiRjbWQgLXNzdm5jX2V4dHJhX29wdHMgJyRzc3ZuY19leHRyYV9vcHRzJyIKLQl9Ci0JaWYgeyRyZmJ2ZXJzaW9uICE9ICIifSB7Ci0JCXNldCBjbWQgIiRjbWQgLXJmYnZlcnNpb24gJyRyZmJ2ZXJzaW9uJyIKLQl9Ci0JaWYgeyR2bmN2aWV3ZXJfcmVhbHZuYzR9IHsKLQkJc2V0IGNtZCAiJGNtZCAtcmVhbHZuYzQiCi0JfQotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlzZXQgY21kICIkY21kIC1saXN0ZW4iCi0JCWlmIHskbGlzdGVuX29uY2V9IHsKLQkJCXNldCBjbWQgIiRjbWQgLW9uZWxpc3RlbiIKLQkJfQotCQlpZiB7JGxpc3Rlbl9hY2NlcHRfcG9wdXB9IHsKLQkJCWlmIHskbGlzdGVuX2FjY2VwdF9wb3B1cF9zY30gewotCQkJCXNldCBlbnYoU1NWTkNfQUNDRVBUX1BPUFVQX1NDKSAxCi0JCQl9IGVsc2UgewotCQkJCXNldCBlbnYoU1NWTkNfQUNDRVBUX1BPUFVQKSAxCi0JCQl9Ci0JCX0KLQl9Ci0KLQlnbG9iYWwgZGFyd2luX2NvdHZuYwotCWlmIHskZGFyd2luX2NvdHZuY30gewotCQlzZXQgZW52KERBUldJTl9DT1RWTkMpIDEKLQl9IGVsc2UgewotCQlpZiBbaW5mbyBleGlzdHMgZW52KERJU1BMQVkpXSB7Ci0JCQlpZiB7JGVudihESVNQTEFZKSAhPSAiIn0gewotCQkJCXNldCBlbnYoREFSV0lOX0NPVFZOQykgMAotCQkJfSBlbHNlIHsKLQkJCQlzZXQgZW52KERBUldJTl9DT1RWTkMpIDEKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldCBlbnYoREFSV0lOX0NPVFZOQykgMQotCQl9Ci0JfQotCi0Jc2V0IGRvX3ZuY3NwYWNld3JhcHBlciAwCi0JaWYgeyRjaGFuZ2Vfdm5jdmlld2VyICYmICRjaGFuZ2Vfdm5jdmlld2VyX3BhdGggIT0gIiJ9IHsKLQkJc2V0IHBhdGggW3N0cmluZyB0cmltICRjaGFuZ2Vfdm5jdmlld2VyX3BhdGhdCi0JCWlmIFtyZWdleHAge15bIiddLn0gJHBhdGhdICB7CSMgIgotCQkJc2V0IHRtcCAiL3RtcC92bmNzcGFjZXdyYXBwZXIuW3RwaWRdIgotCQkJc2V0IHRtcCBbbXl0bXAgJHRtcF0KLQkJCXNldCBkb192bmNzcGFjZXdyYXBwZXIgMQotCQkJaWYgezB9IHsKLQkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJHRtcH0KLQkJCQlpZiB7W2ZpbGUgZXhpc3RzICR0bXBdfSB7Ci0JCQkJCWNhdGNoIHtkZXN0cm95IC5jfQotCQkJCQltZXNnICJmaWxlIHN0aWxsIGV4aXN0czogJHRtcCIKLQkJCQkJYmVsbAotCQkJCQlyZXNldF9zdHVubmVsX2V4dHJhX29wdHMKLQkJCQkJcmV0dXJuCi0JCQkJfQotCQkJfQotCQkJY2F0Y2gge3NldCBmaCBbb3BlbiAkdG1wICJ3Il19Ci0JCQljYXRjaCB7ZXhlYyBjaG1vZCA3MDAgJHRtcH0KLQkJCWlmIHshIFtmaWxlIGV4aXN0cyAkdG1wXX0gewotCQkJCWNhdGNoIHtkZXN0cm95IC5jfQotCQkJCW1lc2cgImNhbm5vdCBjcmVhdGU6ICR0bXAiCi0JCQkJYmVsbAotCQkJCXJlc2V0X3N0dW5uZWxfZXh0cmFfb3B0cwotCQkJCXJldHVybgotCQkJfQotCQkJcHV0cyAkZmggIiMhL2Jpbi9zaCIKLQkJCXB1dHMgJGZoICJlY2hvICR0bXA7IHNldCAteHYiCi0JCQlwdXRzICRmaCAiJHBhdGggXCJcJEBcIiIKLQkJCXB1dHMgJGZoICJzbGVlcCAxOyBybSAtZiAkdG1wIgotCQkJY2xvc2UgJGZoCi0JCQlzZXQgcGF0aCAkdG1wCi0JCX0KLQkJc2V0IGVudihWTkNWSUVXRVJDTUQpICRwYXRoCi0JfSBlbHNlIHsKLQkJaWYgW2luZm8gZXhpc3RzIGVudihWTkNWSUVXRVJDTURfT1ZFUlJJREUpXSB7Ci0JCQlzZXQgZW52KFZOQ1ZJRVdFUkNNRCkgJGVudihWTkNWSUVXRVJDTURfT1ZFUlJJREUpCi0JCX0gZWxzZSB7Ci0JCQlzZXQgZW52KFZOQ1ZJRVdFUkNNRCkgIiIKLQkJfQotCX0KLQotCXNldCByZWFsdm5jNCAkdm5jdmlld2VyX3JlYWx2bmM0Ci0Jc2V0IHJlYWx2bmMzIDAKLQlzZXQgZmxhdm9yICIiCi0JaWYgeyEgJGRhcndpbl9jb3R2bmN9IHsKLQkJc2V0IGRvbmUgMAotCQlpZiB7JGRvX3ZuY3NwYWNld3JhcHBlcn0gewotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHt1bHRyYX0gJGNoYW5nZV92bmN2aWV3ZXJfcGF0aF0gewotCQkJCXNldCBkb25lIDEKLQkJCQlzZXQgZmxhdm9yICJ1bHRyYXZuYyIKLQkJCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7Y2hpY2tlbi5vZn0gJGNoYW5nZV92bmN2aWV3ZXJfcGF0aF0gewotCQkJCXNldCBkb25lIDEKLQkJCQlzZXQgZmxhdm9yICJjb3R2bmMiCi0JCQl9Ci0JCX0KLQkJaWYgeyEgJGRvbmV9IHsKLQkJCWNhdGNoIHtzZXQgZmxhdm9yIFtleGVjIHNzX3ZuY3ZpZXdlciAtdmlld2VyZmxhdm9yIDI+L2Rldi9udWxsXX0KLQkJfQotCX0KLQlpZiBbcmVnZXhwIHtyZWFsdm5jNH0gJGZsYXZvcl0gewotCQlzZXQgcmVhbHZuYzQgMQotCX0KLQlpZiBbcmVnZXhwIHt0aWdodHZuY30gJGZsYXZvcl0gewotCQlzZXQgcmVhbHZuYzQgMAotCX0KLQlpZiBbcmVnZXhwIHtyZWFsdm5jM30gJGZsYXZvcl0gewotCQlzZXQgcmVhbHZuYzQgMAotCQlzZXQgcmVhbHZuYzMgMQotCX0KLQlpZiB7JHJlYWx2bmM0fSB7Ci0JCXNldCBjbWQgIiRjbWQgLXJlYWx2bmM0IgotCX0KLQotCXNldCBjbWQgIiRjbWQgJGhwIgotCi0Jc2V0IHBhc3N3ZGZpbGUgIiIKLQlpZiB7JHZuY2F1dGhfcGFzc3dkICE9ICIifSB7Ci0JCWdsb2JhbCB1c2VfbGlzdGVuCi0JCXNldCBmb290ZXN0IFtteXRtcCAvdG1wLy5jaGVjay5bdHBpZF1dCi0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZm9vdGVzdH0KLQkJZ2xvYmFsIG1rdGVtcAotCQlzZXQgcGFzc3dkZmlsZSAiL3RtcC8udm5jYXV0aF90bXAuW3RwaWRdIgotCQlpZiB7JG1rdGVtcCA9PSAiIn0gewotCQkJc2V0IHBhc3N3ZGZpbGUgIiRlbnYoU1NWTkNfSE9NRSkvLnZuY2F1dGhfdG1wLlt0cGlkXSIKLQkJfQotCQkKLQkJc2V0IHBhc3N3ZGZpbGUgW215dG1wICRwYXNzd2RmaWxlXQotCQljYXRjaCB7ZXhlYyB2bmNzdG9yZXB3ICR2bmNhdXRoX3Bhc3N3ZCAkcGFzc3dkZmlsZX0KLQkJY2F0Y2gge2V4ZWMgY2htb2QgNjAwICRwYXNzd2RmaWxlfQotCQlpZiB7JHVzZV9saXN0ZW59IHsKLQkJCWdsb2JhbCBlbnYKLQkJCXNldCBlbnYoU1NfVk5DVklFV0VSX1JNKSAkcGFzc3dkZmlsZQotCQl9IGVsc2UgewotCQkJaWYgeyRkYXJ3aW5fY290dm5jfSB7Ci0JCQkJY2F0Y2gge2V4ZWMgc2ggLWMgInNsZWVwIDYwOyBybSAkcGFzc3dkZmlsZSAyPi9kZXYvbnVsbCIgJn0KLQkJCX0gZWxzZSB7Ci0JCQkJY2F0Y2gge2V4ZWMgc2ggLWMgInNsZWVwIDIwOyBybSAkcGFzc3dkZmlsZSAyPi9kZXYvbnVsbCIgJn0KLQkJCX0KLQkJfQotCQlpZiB7JGRhcndpbl9jb3R2bmN9IHsKLQkJCXNldCBjbWQgIiRjbWQgLS1QYXNzd29yZEZpbGUgJHBhc3N3ZGZpbGUiCi0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bmtub3duIn0gewotCQkJOwotCQl9IGVsc2UgewotCQkJc2V0IGNtZCAiJGNtZCAtcGFzc3dkICRwYXNzd2RmaWxlIgotCQl9Ci0JfQotCi0JaWYgeyR1c2Vfdmlld29ubHl9IHsKLQkJaWYgeyRkYXJ3aW5fY290dm5jfSB7Ci0JCQlzZXQgY21kICIkY21kIC0tVmlld09ubHkiCi0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bmtub3duIn0gewotCQkJOwotCQl9IGVsc2VpZiB7JGZsYXZvciA9PSAidWx0cmF2bmMifSB7Ci0JCQlzZXQgY21kICIkY21kIC92aWV3b25seSIKLQkJfSBlbHNlIHsKLQkJCXNldCBjbWQgIiRjbWQgLXZpZXdvbmx5IgotCQl9Ci0JfQotCWlmIHskdXNlX2Z1bGxzY3JlZW59IHsKLQkJaWYgeyRkYXJ3aW5fY290dm5jfSB7Ci0JCQlzZXQgY21kICIkY21kIC0tRnVsbFNjcmVlbiIKLQkJfSBlbHNlaWYgeyRmbGF2b3IgPT0gInVsdHJhdm5jIn0gewotCQkJc2V0IGNtZCAiJGNtZCAvZnVsbHNjcmVlbiIKLQkJfSBlbHNlaWYgeyRmbGF2b3IgPT0gInVua25vd24ifSB7Ci0JCQlpZiBbcmVnZXhwIHt2aW5hZ3JlfSAkY2hhbmdlX3ZuY3ZpZXdlcl9wYXRoXSB7Ci0JCQkJc2V0IGNtZCAiJGNtZCAtZiIKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldCBjbWQgIiRjbWQgLWZ1bGxzY3JlZW4iCi0JCX0KLQl9Ci0JaWYgeyR1c2VfYmdyMjMzfSB7Ci0JCWlmIHskcmVhbHZuYzR9IHsKLQkJCXNldCBjbWQgIiRjbWQgLWxvd2NvbG91cmxldmVsIDEiCi0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bHRyYXZuYyJ9IHsKLQkJCXNldCBjbWQgIiRjbWQgLzhiaXQiCi0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bHRyYXZuYyJ9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyRmbGF2b3IgPT0gInVua25vd24ifSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgY21kICIkY21kIC1iZ3IyMzMiCi0JCX0KLQl9Ci0JaWYgeyR1c2Vfbm9qcGVnfSB7Ci0JCWlmIHskZGFyd2luX2NvdHZuY30gewotCQkJOwotCQl9IGVsc2VpZiB7JGZsYXZvciA9PSAidWx0cmF2bmMifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bmtub3duIn0gewotCQkJOwotCQl9IGVsc2VpZiB7ISAkcmVhbHZuYzQgJiYgISAkcmVhbHZuYzN9IHsKLQkJCXNldCBjbWQgIiRjbWQgLW5vanBlZyIKLQkJfQotCX0KLQlpZiB7ISAkdXNlX3JhaXNlX29uX2JlZXB9IHsKLQkJaWYgeyRkYXJ3aW5fY290dm5jfSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bHRyYXZuYyJ9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyRmbGF2b3IgPT0gInVua25vd24ifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHshICRyZWFsdm5jNCAmJiAhICRyZWFsdm5jM30gewotCQkJc2V0IGNtZCAiJGNtZCAtbm9yYWlzZW9uYmVlcCIKLQkJfQotCX0KLQlpZiB7JHVzZV9jb21wcmVzc2xldmVsICE9ICIiICYmICR1c2VfY29tcHJlc3NsZXZlbCAhPSAiZGVmYXVsdCJ9IHsKLQkJaWYgeyRyZWFsdm5jM30gewotCQkJOwotCQl9IGVsc2VpZiB7JGZsYXZvciA9PSAidWx0cmF2bmMifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bmtub3duIn0gewotCQkJOwotCQl9IGVsc2VpZiB7JHJlYWx2bmM0fSB7Ci0JCQlzZXQgY21kICIkY21kIC16bGlibGV2ZWwgJyR1c2VfY29tcHJlc3NsZXZlbCciCi0JCX0gZWxzZSB7Ci0JCQlzZXQgY21kICIkY21kIC1jb21wcmVzc2xldmVsICckdXNlX2NvbXByZXNzbGV2ZWwnIgotCQl9Ci0JfQotCWlmIHskdXNlX3F1YWxpdHkgIT0gIiIgJiYgJHVzZV9xdWFsaXR5ICE9ICJkZWZhdWx0In0gewotCQlpZiB7JGRhcndpbl9jb3R2bmN9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyRmbGF2b3IgPT0gInVsdHJhdm5jIn0gewotCQkJOwotCQl9IGVsc2VpZiB7JGZsYXZvciA9PSAidW5rbm93biJ9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyEgJHJlYWx2bmM0ICYmICEgJHJlYWx2bmMzfSB7Ci0JCQlzZXQgY21kICIkY21kIC1xdWFsaXR5ICckdXNlX3F1YWxpdHknIgotCQl9Ci0JfQotCWlmIHskdXNlX3NzaCB8fCAkdXNlX3NzaHNzbH0gewotCQkjIHJlYWx2bmM0IC1wcmVmZXJyZWRlbmNvZGluZyB6cmxlCi0JCWlmIHskZGFyd2luX2NvdHZuY30gewotCQkJOwotCQl9IGVsc2VpZiB7JGZsYXZvciA9PSAidWx0cmF2bmMifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHskZmxhdm9yID09ICJ1bmtub3duIn0gewotCQkJOwotCQl9IGVsc2VpZiB7JHJlYWx2bmM0fSB7Ci0JCQlzZXQgY21kICIkY21kIC1wcmVmZXJyZWRlbmNvZGluZyB6cmxlIgotCQl9IGVsc2UgewotCQkJc2V0IGNtZCAiJGNtZCAtZW5jb2RpbmdzICdjb3B5cmVjdCB0aWdodCB6cmxlIHpsaWIgaGV4dGlsZSciCi0JCX0KLQl9Ci0KLQlnbG9iYWwgeWNyb3Bfc3RyaW5nCi0JZ2xvYmFsIHNid2lkX3N0cmluZwotCWNhdGNoIHt1bnNldCBlbnYoVk5DVklFV0VSX1NCV0lEVEgpfQotCWNhdGNoIHt1bnNldCBlbnYoVk5DVklFV0VSX1lDUk9QKX0KLQlpZiB7W2luZm8gZXhpc3RzIHljcm9wX3N0cmluZ10gJiYgJHljcm9wX3N0cmluZyAhPSAiIn0gIHsKLQkJc2V0IHQgJHljcm9wX3N0cmluZwotCQlpZiBbcmVnZXhwIHssc2I9KFswLTldWzAtOV0qKX0gJHQgbSBtdjFdICB7Ci0JCQlzZXQgZW52KFZOQ1ZJRVdFUl9TQldJRFRIKSAkbXYxCi0JCX0KLQkJcmVnc3ViIHssc2I9KFswLTldWzAtOV0qKX0gJHQgIiIgdAotCQlpZiB7JHQgIT0gIiJ9IHsKLQkJCXNldCBlbnYoVk5DVklFV0VSX1lDUk9QKSAkdAotCQl9Ci0JfQotCWlmIHtbaW5mbyBleGlzdHMgc2J3aWRfc3RyaW5nXSAmJiAkc2J3aWRfc3RyaW5nICE9ICIifSAgewotCQlzZXQgdCAkc2J3aWRfc3RyaW5nCi0JCXNldCBlbnYoVk5DVklFV0VSX1NCV0lEVEgpICRzYndpZF9zdHJpbmcKLQkJaWYgeyR0ICE9ICIifSB7Ci0JCQlzZXQgZW52KFZOQ1ZJRVdFUl9TQldJRFRIKSAkdAotCQl9Ci0JfQotCi0JY2F0Y2gge2Rlc3Ryb3kgLm99Ci0JY2F0Y2gge2Rlc3Ryb3kgLm9hfQotCWNhdGNoIHtkZXN0cm95IC5vc30KLQl1cGRhdGUKLQotCWlmIHskdXNlX3NvdW5kICYmICRzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQgJiYgJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgIT0gIiJ9IHsKLQkJbWVzZyAicnVubmluZzogJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQiCi0JCWdsb2JhbCBzb3VuZF9kYWVtb25fbG9jYWxfcGlkCi0JCXNldCBzb3VuZF9kYWVtb25fbG9jYWxfcGlkICIiCi0JCSNleGVjIHNoIC1jICIkc291bmRfZGFlbW9uX2xvY2FsX2NtZCAiID4mIC9kZXYvbnVsbCA8L2Rldi9udWxsICYKLQkJc2V0IHNvdW5kX2RhZW1vbl9sb2NhbF9waWQgW2V4ZWMgc2ggLWMgImVjaG8gXCRcJDsgZXhlYyAkc291bmRfZGFlbW9uX2xvY2FsX2NtZCA8L2Rldi9udWxsIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsICYiXQotCQl1cGRhdGUKLQkJYWZ0ZXIgNTAwCi0JfQotCi0JaWYgeyRwa19ocCA9PSAiIn0gewotCQlzZXQgcGtfaHAgJGhwCi0JfQotCWlmIHshICRkaWRfcG9ydF9rbm9ja30gewotCQlpZiB7ISBbZG9fcG9ydF9rbm9jayAkcGtfaHAgc3RhcnRdfSB7Ci0JCQl3bSBkZWljb25pZnkgLgotCQkJdXBkYXRlCi0JCQlyZXNldF9zdHVubmVsX2V4dHJhX29wdHMKLQkJCXJldHVybgotCQl9Ci0JCXNldCBkaWRfcG9ydF9rbm9jayAxCi0JfQotCi0JaW5pdF91bml4cHcgJGhwCi0KLQlpZiB7ISAkZG9fZGlyZWN0fSB7Ci0JCXZlbmNyeXB0X3R1dG9yaWFsX21lc2cKLQl9Ci0KLQl3bSB3aXRoZHJhdyAuCi0JdXBkYXRlCi0KLQlzZXQgZ2VvbWV0cnkgW3h0ZXJtX2NlbnRlcl9nZW9tZXRyeV0KLQlzZXQgeHJtMSAiKi5zcmludGVyQ29tbWFuZDp0cnVlIgotCXNldCB4cm0yICR4cm0xCi0Jc2V0IHhybTMgJHhybTEKLQlpZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19HVUlfQ01EKV19IHsKLQkJc2V0IHhybTEgIioucHJpbnRlckNvbW1hbmQ6ZW52IFhURVJNX1BSSU5UPTEgJGVudihTU1ZOQ19HVUlfQ01EKSIKLQkJc2V0IHhybTIgIlhUZXJtKlZUMTAwKnRyYW5zbGF0aW9uczojb3ZlcnJpZGUgU2hpZnQ8QnRuM0Rvd24+OnByaW50KClcXG5DdHJsPEtleT5OOnByaW50KCkiCi0JCXNldCB4cm0zICIqbWFpbk1lbnUqcHJpbnQqTGFiZWw6ICBOZXcgU1NWTkNfR1VJIgotCX0KLQlzZXQgbSAiRG9uZS4gWW91IENhbiBYLW91dCBvciBDdHJsLUMgdGhpcyBUZXJtaW5hbCBpZiB5b3UgbGlrZS4gIFVzZSBDdHJsLVxcXFwgdG8gcGF1c2UuIgotCWdsb2JhbCB1bmFtZQotCWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJcmVnc3ViIHtYLW91dCBvciB9ICRtICIiIG0KLQl9Ci0Jc2V0IHRlICJzZXQgLXh2OyAiCi0JaWYgeyR0c19vbmx5fSB7Ci0JCXNldCB0ZSAiIgotCX0KLQotCWdsb2JhbCBleHRyYV9zbGVlcAotCXNldCBzc3ZuY19leHRyYV9zbGVlcF9zYXZlICIiCi0JaWYgeyRleHRyYV9zbGVlcCAhPSAiIn0gewotCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0VYVFJBX1NMRUVQKV0gewotCQkJc2V0IHNzdm5jX2V4dHJhX3NsZWVwX3NhdmUgJGVudihTU1ZOQ19FWFRSQV9TTEVFUCkKLQkJfQotCQlzZXQgZW52KFNTVk5DX0VYVFJBX1NMRUVQKSAkZXh0cmFfc2xlZXAKLQl9Ci0KLQlzZXQgc3N0eCAiU1NML1NTSCBWTkMgVmlld2VyIgotCXNldCBocHR4ICRocAotCWdsb2JhbCB1c2VfbGlzdGVuCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXNldCBzc3R4ICJTU1ZOQyIKLQkJc2V0IGhwdHggIiRocCAoUHJlc3MgQ3RybC1DIHRvIFN0b3AgTGlzdGVuaW5nKSIKLQl9Ci0KLQotCXNldCBzMSA1Ci0Jc2V0IHMyIDQKLQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0ZJTklTSF9TTEVFUCldIHsKLQkJc2V0IHMxICRlbnYoU1NWTkNfRklOSVNIX1NMRUVQKTsKLQkJc2V0IHMyICRzMQotCX0KLQotCXVuaXhfdGVybWluYWxfY21kICRnZW9tZXRyeSAiJHNzdHggJGhwdHgiIFwKLQkiJHRlJGNtZDsgc2V0ICt4djsgdWxpbWl0IC1jIDA7IHRyYXAgJ3ByaW50ZiBcIlBhdXNlZC4gUHJlc3MgRW50ZXIgdG8gZXhpdDpcIjsgcmVhZCB4JyBRVUlUOyBlY2hvOyBlY2hvICRtOyBlY2hvOyBlY2hvIHNsZWVwICRzMTsgZWNobzsgc2xlZXAgJHMyIiAwICR4cm0xICR4cm0yICR4cm0zCi0KLQlzZXQgZW52KFNTX1ZOQ1ZJRVdFUl9TU0hfQ01EKSAiIgotCXNldCBlbnYoU1NfVk5DVklFV0VSX1VTRV9DKSAiIgotCi0JaWYgeyRleHRyYV9zbGVlcCAhPSAiIn0gewotCQlpZiB7JHNzdm5jX2V4dHJhX3NsZWVwX3NhdmUgIT0gIiJ9IHsKLQkJCXNldCBlbnYoU1NWTkNfRVhUUkFfU0xFRVApICRzc3ZuY19leHRyYV9zbGVlcF9zYXZlCi0JCX0gZWxzZSB7Ci0JCQljYXRjaCB7dW5zZXQgZW52KFNTVk5DX0VYVFJBX1NMRUVQKX0KLQkJfQotCX0KLQotCWlmIHskdXNlX3NvdW5kICYmICRzb3VuZF9kYWVtb25fbG9jYWxfa2lsbCAmJiAkc291bmRfZGFlbW9uX2xvY2FsX2NtZCAhPSAiIn0gewotCQkjIFhYWCBuZWVkIHRvIGtpbGwganVzdCBvbmUuLi4KLQkJc2V0IGRhZW1vbiBbc3RyaW5nIHRyaW0gJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWRdCi0JCXJlZ3N1YiB7Xmd3WyBcdF0qfSAkZGFlbW9uICIiIGRhZW1vbgotCQlyZWdzdWIge1sgXHRdLiokfSAkZGFlbW9uICIiIGRhZW1vbgotCQlyZWdzdWIge14uKi99ICRkYWVtb24gIiIgZGFlbW9uCi0JCW1lc2cgImtpbGxpbmcgc291bmQgZGFlbW9uOiAkZGFlbW9uIgotCQlnbG9iYWwgc291bmRfZGFlbW9uX2xvY2FsX3BpZAotCQlpZiB7JHNvdW5kX2RhZW1vbl9sb2NhbF9waWQgIT0gIiJ9IHsKLSNwdXRzIHBpZD0kc291bmRfZGFlbW9uX2xvY2FsX3BpZAotCQkJY2F0Y2gge2V4ZWMgc2ggLWMgImtpbGwgJHNvdW5kX2RhZW1vbl9sb2NhbF9waWQiICA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwgJn0KLQkJCWluY3Igc291bmRfZGFlbW9uX2xvY2FsX3BpZAotCQkJY2F0Y2gge2V4ZWMgc2ggLWMgImtpbGwgJHNvdW5kX2RhZW1vbl9sb2NhbF9waWQiICA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwgJn0KLQkJCXNldCBzb3VuZF9kYWVtb25fbG9jYWxfcGlkICIiCi0JCX0gZWxzZWlmIHskZGFlbW9uICE9ICIifSB7Ci0JCQljYXRjaCB7ZXhlYyBzaCAtYyAia2lsbGFsbCAkZGFlbW9uIiAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA8L2Rldi9udWxsICZ9Ci0JCQljYXRjaCB7ZXhlYyBzaCAtYyAicGtpbGwgLXggJGRhZW1vbiIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA8L2Rldi9udWxsICZ9Ci0JCX0KLQl9Ci0JaWYgeyRwYXNzd2RmaWxlICE9ICIifSB7Ci0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkcGFzc3dkZmlsZX0KLQl9Ci0Jd20gZGVpY29uaWZ5IC4KLQltYWNfcmFpc2UKLQltZXNnICJEaXNjb25uZWN0ZWQgZnJvbSAkaHAiCi0JaWYge1tyZWdleHAge0ZJTklTSH0gJHBvcnRfa25vY2tpbmdfbGlzdF19IHsKLQkJZG9fcG9ydF9rbm9jayAkcGtfaHAgZmluaXNoCi0JfQotCi0JcmVzZXRfc3R1bm5lbF9leHRyYV9vcHRzCi0KLQlmaW5pX3VuaXhwdwotfQotCi1wcm9jIGtpbGxfc3R1bm5lbCB7cGlkc30gewotCXNldCBjb3VudCAwCi0JZm9yZWFjaCBwaWQgJHBpZHMgewotCQltZXNnICJraWxsaW5nIFNUVU5ORUwgcGlkOiAkcGlkIgotCQl3aW5raWxsICRwaWQKLQkJaWYgeyRjb3VudCA9PSAwfSB7Ci0JCQlhZnRlciA2MDAKLQkJfSBlbHNlIHsKLQkJCWFmdGVyIDMwMAotCQl9Ci0JCWluY3IgY291bnQKLQl9Ci19Ci0KLXByb2MgZ2V0X3Rhc2tfbGlzdCB7fSB7Ci0JZ2xvYmFsIGlzX3dpbjl4Ci0JCi0Jc2V0IG91dHB1dDEgIiIKLQlzZXQgb3V0cHV0MiAiIgotCWlmIHshICRpc193aW45eH0gewotCQkjIHRyeSBmb3IgdGFza2xpc3Qgb24gWFAgcHJvCi0JCWNhdGNoIHtzZXQgb3V0cHV0MSBbZXhlYyB0YXNrbGlzdC5leGVdfQotCX0KLQljYXRjaCB7c2V0IG91dHB1dDIgW2V4ZWMgdzk4L3RsaXN0LmV4ZV19Ci0KLQlzZXQgb3V0cHV0ICRvdXRwdXQxCi0JYXBwZW5kIG91dHB1dCAiXG4iCi0JYXBwZW5kIG91dHB1dCAkb3V0cHV0MgotCi0JcmV0dXJuICRvdXRwdXQKLX0KLQotcHJvYyBub3RlX3N0dW5uZWxfcGlkcyB7d2hlbn0gewotCWdsb2JhbCBpc193aW45eCBwaWRzX2JlZm9yZSBwaWRzX2FmdGVyIHBpZHNfbmV3Ci0KLQlpZiB7JHdoZW4gPT0gImJlZm9yZSJ9IHsKLQkJYXJyYXkgdW5zZXQgcGlkc19iZWZvcmUKLQkJYXJyYXkgdW5zZXQgcGlkc19hZnRlcgotCQlzZXQgcGlkc19uZXcge30KLQkJc2V0IHBpZHNfYmVmb3JlKG5vbmUpICJub25lIgotCQlzZXQgcGlkc19hZnRlcihub25lKSAgIm5vbmUiCi0JfQotCi0Jc2V0IG91dHB1dCBbZ2V0X3Rhc2tfbGlzdF0KLQkKLQlmb3JlYWNoIGxpbmUgW3NwbGl0ICRvdXRwdXQgIlxuXHIiXSB7Ci0JCXNldCBtIDAKLQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtzdHVubmVsfSAkbGluZV0gewotCQkJc2V0IG0gMQotCQl9IGVsc2VpZiBbcmVnZXhwIC1ub2Nhc2Uge2Nvbm5lY3RfYnJ9ICRsaW5lXSB7Ci0JCQlzZXQgbSAxCi0JCX0KLQkJaWYgeyRtfSB7Ci0JCQlpZiBbcmVnZXhwIHsoLT9bMC05XVswLTldKil9ICRsaW5lIG0gcF0gewotCQkJCWlmIHskd2hlbiA9PSAiYmVmb3JlIn0gewotCQkJCQlzZXQgcGlkc19iZWZvcmUoJHApICRsaW5lCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0IHBpZHNfYWZ0ZXIoJHApICRsaW5lCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmIHskd2hlbiA9PSAiYWZ0ZXIifSB7Ci0JCWZvcmVhY2ggbmV3IFthcnJheSBuYW1lcyBwaWRzX2FmdGVyXSB7Ci0JCQlpZiB7ISBbaW5mbyBleGlzdHMgcGlkc19iZWZvcmUoJG5ldyldfSB7Ci0JCQkJbGFwcGVuZCBwaWRzX25ldyAkbmV3Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXByb2MgZGVsX2xhdW5jaF93aW5kb3dzX3NzaF9maWxlcyB7fSB7Ci0JZ2xvYmFsIGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcwotCWdsb2JhbCBlbnYKLQotCWlmIHtbaW5mbyBleGlzdHMgZW52KFNTVk5DX05PX0RFTEVURSldfSB7Ci0JCXJldHVybgotCX0KLQkKLQlpZiB7JGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcyAhPSAiIn0gewotCQlmb3JlYWNoIHRmIFtzcGxpdCAkbGF1bmNoX3dpbmRvd3Nfc3NoX2ZpbGVzXSB7Ci0JCQlpZiB7JHRmID09ICIifSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkdGZ9Ci0JCX0KLQl9Ci19Ci0KLXByb2MgbGF1bmNoX3NoZWxsX29ubHkge30gewotCWdsb2JhbCBpc193aW5kb3dzCi0JZ2xvYmFsIHNraXBfcHJlCi0JZ2xvYmFsIHVzZV9zc2wgdXNlX3NzaCB1c2Vfc3Noc3NsCi0KLQlzZXQgaHAgW2dldF92bmNkaXNwbGF5XQotCXJlZ3N1YiB7Y21kPS4qJH0gJGhwICIiIGhwCi0Jc2V0IGhwIFtzdHJpbmcgdHJpbSAkaHBdCi0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCWFwcGVuZCBocCAiIGNtZD1QVVRUWSIKLQl9IGVsc2UgewotCQlhcHBlbmQgaHAgIiBjbWQ9U0hFTEwiCi0JfQotCXNldCB1c2Vfc3NsX3NhdmUgJHVzZV9zc2wKLQlzZXQgdXNlX3NzaF9zYXZlICR1c2Vfc3NoCi0Jc2V0IHVzZV9zc2hzc2xfc2F2ZSAkdXNlX3NzaHNzbAotCXNldCBza2lwX3ByZSAxCi0JaWYgeyEgJHVzZV9zc2ggJiYgISAkdXNlX3NzaHNzbH0gewotCQlzZXQgdXNlX3NzaCAxCi0JCXNldCB1c2Vfc3NsIDEKLQl9Ci0JbGF1bmNoICRocAotCi0Jc2V0IHVzZV9zc2wgJHVzZV9zc2xfc2F2ZQotCXNldCB1c2Vfc3NoICR1c2Vfc3NoX3NhdmUKLQlzZXQgdXNlX3NzaHNzbCAkdXNlX3NzaHNzbF9zYXZlCi19Ci0KLXByb2MgdG9fc3Nob25seSB7fSB7Ci0JZ2xvYmFsIHNzaF9vbmx5IHRzX29ubHkgZW52Ci0JZ2xvYmFsIHNob3dpbmdfbm9fZW5jcnlwdGlvbgotCSNpZiB7JHNob3dpbmdfbm9fZW5jcnlwdGlvbn0gewotCSMJdG9nZ2xlX25vX2VuY3J5cHRpb24KLQkjfQotCWlmIHskc3NoX29ubHkgJiYgISR0c19vbmx5fSB7Ci0JCXJldHVybgotCX0KLQlpZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19UU19BTFdBWVMpXX0gewotCQlyZXR1cm4KLQl9Ci0Jc2V0IHNzaF9vbmx5IDEKLQlzZXQgdHNfb25seSAwCi0JCi0Jc2V0IHQgIlNTSCBWTkMgVmlld2VyIgotCXdtIHRpdGxlIC4gJHQKLQljYXRjaCB7cGFjayBmb3JnZXQgLmY0fQotCWNhdGNoIHtwYWNrIGZvcmdldCAuYi5jZXJ0c30KLQljYXRjaCB7LmwgY29uZmlndXJlIC10ZXh0ICR0fQotCi0JZ2xvYmFsIHZuY2Rpc3BsYXkgdm5jYXV0aF9wYXNzd2QgdW5peHB3X3VzZXJuYW1lIHZuY3Byb3h5IHJlbW90ZV9zc2hfY21kCi0Jc2V0IHZuY2Rpc3BsYXkgIiIKLQlzZXQgdm5jYXV0aF9wYXNzd2QgIiIKLQlzZXQgdW5peHB3X3VzZXJuYW1lICIiCi0Jc2V0IHZuY3Byb3h5ICIiCi0Jc2V0IHJlbW90ZV9zc2hfY21kICIiCi0KLQlzZXRfZGVmYXVsdHMKLX0KLQotcHJvYyB0b2dnbGVfdHNvbmx5IHt9IHsKLQlnbG9iYWwgdHNfb25seSBlbnYKLQlpZiB7JHRzX29ubHl9IHsKLQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX1RTX0FMV0FZUyldfSB7Ci0JCQl0b19zc3ZuYwotCQl9Ci0JfSBlbHNlIHsKLQkJdG9fdHNvbmx5Ci0JfQotfQotCi1wcm9jIHRvZ2dsZV9zc2hvbmx5IHt9IHsKLQlnbG9iYWwgc3NoX29ubHkgZW52Ci0JaWYgeyRzc2hfb25seX0gewotCQl0b19zc3ZuYwotCX0gZWxzZSB7Ci0JCXRvX3NzaG9ubHkKLQl9Ci19Ci0KLXByb2MgdG9fdHNvbmx5IHt9IHsKLQlnbG9iYWwgdHNfb25seQotCWdsb2JhbCBzaG93aW5nX25vX2VuY3J5cHRpb24KLQkjaWYgeyRzaG93aW5nX25vX2VuY3J5cHRpb259IHsKLQkjCXRvZ2dsZV9ub19lbmNyeXB0aW9uCi0JI30KLQlpZiB7JHRzX29ubHl9IHsKLQkJcmV0dXJuCi0JfQotCXNldCB0c19vbmx5IDEKLQlzZXQgc3NoX29ubHkgMQotCQotCXNldCB0ICJUZXJtaW5hbCBTZXJ2aWNlcyBWTkMgVmlld2VyIgotCXdtIHRpdGxlIC4gJHQKLQljYXRjaCB7cGFjayBmb3JnZXQgLmY0fQotCWNhdGNoIHtwYWNrIGZvcmdldCAuZjN9Ci0JY2F0Y2gge3BhY2sgZm9yZ2V0IC5mMX0KLQljYXRjaCB7cGFjayBmb3JnZXQgLmIuY2VydHN9Ci0JY2F0Y2ggey5sIGNvbmZpZ3VyZSAtdGV4dCAkdH0KLQljYXRjaCB7LmYwLmwgY29uZmlndXJlIC10ZXh0ICJWTkMgVGVybWluYWwgU2VydmVyOiJ9Ci0KLQlnbG9iYWwgdm5jZGlzcGxheSB2bmNhdXRoX3Bhc3N3ZCB1bml4cHdfdXNlcm5hbWUgdm5jcHJveHkgcmVtb3RlX3NzaF9jbWQKLQlzZXQgdm5jZGlzcGxheSAiIgotCXNldCB2bmNhdXRoX3Bhc3N3ZCAiIgotCXNldCB1bml4cHdfdXNlcm5hbWUgIiIKLQlzZXQgdm5jcHJveHkgIiIKLQlzZXQgcmVtb3RlX3NzaF9jbWQgIiIKLQotCXNldF9kZWZhdWx0cwotfQotCi1wcm9jIHRvX3Nzdm5jIHt9IHsKLQlnbG9iYWwgdHNfb25seSBzc2hfb25seSBlbnYKLQotCWlmIHshJHRzX29ubHkgJiYgISRzc2hfb25seX0gewotCQlyZXR1cm47Ci0JfQotCWlmIHtbaW5mbyBleGlzdHMgZW52KFNTVk5DX1RTX0FMV0FZUyldfSB7Ci0JCXJldHVybgotCX0KLQlzZXQgdHNfb25seSAwCi0Jc2V0IHNzaF9vbmx5IDAKLQkKLQlzZXQgdCAiU1NML1NTSCBWTkMgVmlld2VyIgotCXdtIHRpdGxlIC4gJHQKLQljYXRjaCB7cGFjayBjb25maWd1cmUgLmYxIC1hZnRlciAuZjAgLXNpZGUgdG9wIC1maWxsIHh9Ci0JY2F0Y2gge3BhY2sgY29uZmlndXJlIC5mMyAtYWZ0ZXIgLmYyIC1zaWRlIHRvcCAtZmlsbCB4fQotCWNhdGNoIHtwYWNrIGNvbmZpZ3VyZSAuZjQgLWFmdGVyIC5mMyAtc2lkZSB0b3AgLWZpbGwgeH0KLQljYXRjaCB7cGFjayBjb25maWd1cmUgLmIuY2VydHMgLWJlZm9yZSAuYi5vcHRzIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHh9Ci0JY2F0Y2ggey5sIGNvbmZpZ3VyZSAtdGV4dCAkdH0KLQljYXRjaCB7LmYwLmwgY29uZmlndXJlIC10ZXh0ICJWTkMgSG9zdDpEaXNwbGF5In0KLQotCSNnbG9iYWwgc3RhcnRlZF93aXRoX25vZW5jCi0JI2lmIHskc3RhcnRlZF93aXRoX25vZW5jfSB7Ci0JIwl0b2dnbGVfbm9fZW5jcnlwdGlvbgotCSN9Ci0KLQlnbG9iYWwgdm5jZGlzcGxheSB2bmNhdXRoX3Bhc3N3ZCB1bml4cHdfdXNlcm5hbWUgdm5jcHJveHkgcmVtb3RlX3NzaF9jbWQKLQlzZXQgdm5jZGlzcGxheSAiIgotCXNldCB2bmNhdXRoX3Bhc3N3ZCAiIgotCXNldCB1bml4cHdfdXNlcm5hbWUgIiIKLQlzZXQgdm5jcHJveHkgIiIKLQlzZXQgcmVtb3RlX3NzaF9jbWQgIiIKLQotCXNldF9kZWZhdWx0cwotfQotCi1wcm9jIGxhdW5jaCB7e2hwICIifX0gewotCWdsb2JhbCB0Y2xfcGxhdGZvcm0gaXNfd2luZG93cwotCWdsb2JhbCBteWNlcnQgc3ZjZXJ0IGNydGRpciBjcmxmaWwKLQlnbG9iYWwgcGlkc19iZWZvcmUgcGlkc19hZnRlciBwaWRzX25ldwotCWdsb2JhbCBlbnYKLQlnbG9iYWwgdXNlX3NzbCB1c2Vfc3NoIHVzZV9zc2hzc2wgc3Noc3NsX3N3IHVzZV9saXN0ZW4gZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMKLQlnbG9iYWwgdm5jZGlzcGxheQotCi0Jc2V0IGRlYnVnIDAKLQlpZiB7JGhwID09ICIifSB7Ci0JCXNldCBocCBbZ2V0X3ZuY2Rpc3BsYXldCi0JfQotCi0Jc2V0IGhwdCBbc3RyaW5nIHRyaW0gJGhwXQotCXJlZ3N1YiB7WyAJXS4qJH0gJGhwdCAiIiBocHQKLQkKLQotCWlmIHtbcmVnZXhwIHteSE9NRT19ICRocHRdIHx8IFtyZWdleHAge15TU1ZOQ19IT01FPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKkhPTUU9fSAkdCAiIiB0Ci0JCXNldCB0IFtzdHJpbmcgdHJpbSAkdF0KLQkJc2V0IGVudihTU1ZOQ19IT01FKSAkdAotCQltZXNnICJTZXQgU1NWTkNfSE9NRSB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15ESVNQTEFZPX0gJGhwdF0gfHwgW3JlZ2V4cCB7XlNTVk5DX0RJU1BMQVk9fSAkaHB0XX0gewotCQlzZXQgdCAkaHB0Ci0JCXJlZ3N1YiB7Xi4qRElTUExBWT19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KERJU1BMQVkpICR0Ci0JCW1lc2cgIlNldCBESVNQTEFZIHRvICR0IgotCQlzZXQgdm5jZGlzcGxheSAiIgotCQlnbG9iYWwgdW5hbWUgZGFyd2luX2NvdHZuYwotCQlpZiB7JHVuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCQlpZiB7JHQgIT0gIiJ9IHsKLQkJCQlzZXQgZGFyd2luX2NvdHZuYyAwCi0JCQl9IGVsc2UgewotCQkJCXNldCBkYXJ3aW5fY290dm5jIDEKLQkJCX0KLQkJfQotCQlyZXR1cm4gMAotCX0KLQlpZiB7W3JlZ2V4cCB7XkRZTERfTElCUkFSWV9QQVRIPX0gJGhwdF0gfHwgW3JlZ2V4cCB7XlNTVk5DX0RZTERfTElCUkFSWV9QQVRIPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKkRZTERfTElCUkFSWV9QQVRIPX0gJHQgIiIgdAotCQlzZXQgdCBbc3RyaW5nIHRyaW0gJHRdCi0JCXNldCBlbnYoRFlMRF9MSUJSQVJZX1BBVEgpICR0Ci0JCXNldCBlbnYoU1NWTkNfRFlMRF9MSUJSQVJZX1BBVEgpICR0Ci0JCW1lc2cgIlNldCBEWUxEX0xJQlJBUllfUEFUSCB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15TTEVFUD19ICRocHRdIHx8IFtyZWdleHAge15TU1ZOQ19FWFRSQV9TTEVFUD19ICRocHRdfSB7Ci0JCXNldCB0ICRocHQKLQkJcmVnc3ViIHteLipTTEVFUD19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KFNTVk5DX0VYVFJBX1NMRUVQKSAkdAotCQltZXNnICJTZXQgU1NWTkNfRVhUUkFfU0xFRVAgdG8gJHQiCi0JCXNldCB2bmNkaXNwbGF5ICIiCi0JCXJldHVybiAwCi0JfQotCWlmIHtbcmVnZXhwIHteU1NIPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKlNTSD19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KFNTSCkgJHQKLQkJbWVzZyAiU2V0IFNTSCB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15GSU5JU0g9fSAkaHB0XSB8fCBbcmVnZXhwIHteU1NWTkNfRklOSVNIX1NMRUVQPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKj19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KFNTVk5DX0ZJTklTSF9TTEVFUCkgJHQKLQkJbWVzZyAiU2V0IFNTVk5DX0ZJTklTSF9TTEVFUCB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15OT19ERUxFVEU9fSAkaHB0XSB8fCBbcmVnZXhwIHteU1NWTkNfTk9fREVMRVRFPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKj19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KFNTVk5DX05PX0RFTEVURSkgJHQKLQkJbWVzZyAiU2V0IFNTVk5DX05PX0RFTEVURSB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15CQVRfU0xFRVA9fSAkaHB0XSB8fCBbcmVnZXhwIHteU1NWTkNfQkFUX1NMRUVQPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKj19ICR0ICIiIHQKLQkJc2V0IHQgW3N0cmluZyB0cmltICR0XQotCQlzZXQgZW52KFNTVk5DX0JBVF9TTEVFUCkgJHQKLQkJbWVzZyAiU2V0IFNTVk5DX0JBVF9TTEVFUCB0byAkdCIKLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAge15ERUJVR19ORVRTVEFUPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKkRFQlVHX05FVFNUQVQ9fSAkdCAiIiB0Ci0JCWdsb2JhbCBkZWJ1Z19uZXRzdGF0Ci0JCXNldCBkZWJ1Z19uZXRzdGF0ICR0Ci0JCW1lc2cgIlNldCBERUJVR19ORVRTVEFUIHRvICR0IgotCQlzZXQgdm5jZGlzcGxheSAiIgotCQlyZXR1cm4gMAotCX0KLQlpZiB7W3JlZ2V4cCB7XlJFUEVBVEVSX0ZPUkNFPX0gJGhwdF19IHsKLQkJc2V0IHQgJGhwdAotCQlyZWdzdWIge14uKlJFUEVBVEVSX0ZPUkNFPX0gJHQgIiIgdAotCQlzZXQgZW52KFJFUEVBVEVSX0ZPUkNFKSAkdAotCQltZXNnICJTZXQgUkVQRUFURVJfRk9SQ0UgdG8gJHQiCi0JCXNldCB2bmNkaXNwbGF5ICIiCi0JCXJldHVybiAwCi0JfQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge15TU0guP09OTFl9ICRocHRdfSB7Ci0JCWdsb2JhbCBzc2hfb25seQotCQlpZiB7JHNzaF9vbmx5fSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl0b19zc2hvbmx5Ci0KLQkJcmV0dXJuIDAKLQl9Ci0JaWYge1tyZWdleHAgLW5vY2FzZSB7XlRTLj9PTkxZfSAkaHB0XX0gewotCQlnbG9iYWwgdHNfb25seQotCQlpZiB7JHRzX29ubHl9IHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXRvX3Rzb25seQotCi0JCXJldHVybiAwCi0JfQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge15JUFY2PShbMDFdKX0gJGhwdCBtdiB2YWxdfSB7Ci0JCWdsb2JhbCBlbnYgaGF2ZV9pcHY2Ci0JCXNldCBoYXZlX2lwdjYgJHZhbAotCQlzZXQgZW52KFNTVk5DX0lQVjYpICR2YWwKLQkJbWVzZyAiU2V0IGhhdmVfaXB2NiB0byAkdmFsIgotCQlzZXQgdm5jZGlzcGxheSAiIgotCQlyZXR1cm4gMAotCX0KLQlpZiB7W3JlZ2V4cCB7XkVOVj0oW0EtejAtOV1bQS16MC05XSopPSguKikkfSAkaHB0IG12IHZhciB2YWxdfSB7Ci0JCWdsb2JhbCBlbnYKLQkJaWYgeyR2YWwgPT0gIiJ9IHsKLQkJCWNhdGNoIHt1bnNldCBlbnYoJHZhcil9Ci0JCQltZXNnICJVbnNldCAkdmFyIgotCQl9IGVsc2UgewotCQkJc2V0IGVudigkdmFyKSAiJHZhbCIKLQkJCW1lc2cgIlNldCAkdmFyIHRvICR2YWwiCi0JCX0KLQkJc2V0IHZuY2Rpc3BsYXkgIiIKLQkJcmV0dXJuIDAKLQl9Ci0KLQlyZWdzdWIge1sgCV0qY21kPS4qJH0gJGhwICIiIHR0Ci0KLQlpZiB7W3JlZ2V4cCB7XlsgCV0qJH0gJHR0XX0gewotCQltZXNnICJObyBob3N0OmRpc3Agc3VwcGxpZWQuIgotCQliZWxsCi0JCWNhdGNoIHtyYWlzZSAufQotCQltYWNfcmFpc2UKLQkJcmV0dXJuCi0JfQotCWlmIHtbcmVnZXhwIC0tIHstLW5vaG9zdC0tfSAkdHRdfSB7Ci0JCW1lc2cgIk5vIGhvc3Q6ZGlzcCBzdXBwbGllZC4iCi0JCWJlbGwKLQkJY2F0Y2gge3JhaXNlIC59Ci0JCW1hY19yYWlzZQotCQlyZXR1cm4KLQl9Ci0JIyBYWFggaG9zdF9wYXJ0Ci0JaWYgeyEgW3JlZ2V4cCAiOiIgJGhwXX0gewotCQlpZiB7ISBbcmVnZXhwIHtjbWQ9fSAkaHBdfSB7Ci0JCQlzZXQgcyBbc3RyaW5nIHRyaW0gJGhwXQotCQkJaWYgeyEgW3JlZ2V4cCB7IH0gJHNdfSB7Ci0JCQkJYXBwZW5kIGhwICI6MCIKLQkJCX0gZWxzZSB7Ci0JCQkJcmVnc3ViIHsgfSAkaHAgIjowICIgaHAKLQkJCX0KLQkJfQotCX0KLQotCWlmIHshJHVzZV9zc2wgJiYgISR1c2Vfc3NoICYmICEkdXNlX3NzaHNzbCAmJiAkc3Noc3NsX3N3ID09ICJub25lIn0gewotCQlyZWdzdWIgLW5vY2FzZSB7XlthLXowLTkrXSo6Ly99CSRocCAiIiBocAotCQlzZXQgaHAgIlZuYzovLyRocCIKLQl9Ci0KLQltZXNnICJVc2luZzogJGhwIgotCWFmdGVyIDYwMAotCi0Jc2V0IHNjIFtnZXRfc3NoX2NtZCAkaHBdCi0JaWYge1tyZWdleHAge15LTk9DS30gJHNjXX0gewotCQlpZiBbcmVnZXhwIHteS05PQ0tGfSAkc2NdIHsKLQkJCXBvcnRfa25vY2tfb25seSAkaHAgIkZJTklTSCIKLQkJfSBlbHNlIHsKLQkJCXBvcnRfa25vY2tfb25seSAkaHAgIktOT0NLIgotCQl9Ci0JCXJldHVybgotCX0KLQotCWlmIHskZGVidWd9IHsKLQkJbWVzZyAiXCIkdGNsX3BsYXRmb3JtKG9zKVwiIHwgXCIkdGNsX3BsYXRmb3JtKG9zVmVyc2lvbilcIiIKLQkJYWZ0ZXIgMTAwMAotCX0KLQotCWlmIFtyZWdleHAge1ZbTm5dW0NjXTovL30gJGhwXSB7Ci0JCXNldCBlbnYoU1NWTkNfTk9fRU5DX1dBUk4pIDEKLQkJcmVnc3ViIHtWW05uXVtDY106Ly99ICRocCAidm5jOi8vIiBocAotCX0KLQlyZWdzdWIgLW5vY2FzZSB7XnZuYzovL30JJGhwICJ2bmM6Ly8iIGhwCi0JcmVnc3ViIC1ub2Nhc2Uge152bmNzOi8vfQkkaHAgInZuY3M6Ly8iIGhwCi0JcmVnc3ViIC1ub2Nhc2Uge152bmNzc2w6Ly99CSRocCAidm5jc3NsOi8vIiBocAotCXJlZ3N1YiAtbm9jYXNlIHtedm5jXCtzc2w6Ly99CSRocCAidm5jK3NzbDovLyIgaHAKLQlyZWdzdWIgLW5vY2FzZSB7XnZuY3NzaDovL30JJGhwICJ2bmNzc2g6Ly8iIGhwCi0JcmVnc3ViIC1ub2Nhc2Uge152bmNcK3NzaDovL30JJGhwICJ2bmMrc3NoOi8vIiBocAotCi0JaWYgeyEgJGlzX3dpbmRvd3N9IHsKLQkJbGF1bmNoX3VuaXggJGhwCi0JCXJldHVybgotCX0KLQotCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0JIyBXSU5ET1dTIEJFTE9XOgotCi0JaWYgW3JlZ2V4cCB7XnZuYzovL30gJGhwXSB7Ci0JCWlmIHshIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfTk9fRU5DX1dBUk4pXX0gewotCQkJZGlyZWN0X2Nvbm5lY3RfbXNnCi0JCX0KLQkJcmVnc3ViIHtedm5jOi8vfSAkaHAgIiIgaHAKLQkJZGlyZWN0X2Nvbm5lY3Rfd2luZG93cyAkaHAKLQkJcmV0dXJuCi0JfSBlbHNlaWYgW3JlZ2V4cCB7XnZuY3M6Ly99ICRocF0gewotCQlzZXQgdXNlX3NzbCAxCi0JCXNldCB1c2Vfc3NoIDAKLQkJcmVnc3ViIHtedm5jczovL30gJGhwICIiIGhwCi0JCXN5bmNfdXNlX3NzbF9zc2gKLQl9IGVsc2VpZiBbcmVnZXhwIHtedm5jc3NsOi8vfSAkaHBdIHsKLQkJc2V0IHVzZV9zc2wgMQotCQlzZXQgdXNlX3NzaCAwCi0JCXJlZ3N1YiB7XnZuY3NzbDovL30gJGhwICIiIGhwCi0JCXN5bmNfdXNlX3NzbF9zc2gKLQl9IGVsc2VpZiBbcmVnZXhwIHtedm5jXCtzc2w6Ly99ICRocF0gewotCQlzZXQgdXNlX3NzbCAxCi0JCXNldCB1c2Vfc3NoIDAKLQkJcmVnc3ViIHtedm5jXCtzc2w6Ly99ICRocCAiIiBocAotCQlzeW5jX3VzZV9zc2xfc3NoCi0JfSBlbHNlaWYgW3JlZ2V4cCB7XnZuY3NzaDovL30gJGhwXSB7Ci0JCXNldCB1c2Vfc3NoIDEKLQkJc2V0IHVzZV9zc2wgMAotCQlyZWdzdWIge3ZuY3NzaDovL30gJGhwICIiIGhwCi0JCXN5bmNfdXNlX3NzbF9zc2gKLQl9IGVsc2VpZiBbcmVnZXhwIHtedm5jXCtzc2g6Ly99ICRocF0gewotCQlzZXQgdXNlX3NzaCAxCi0JCXNldCB1c2Vfc3NsIDAKLQkJcmVnc3ViIHtedm5jXCtzc2g6Ly99ICRocCAiIiBocAotCQlzeW5jX3VzZV9zc2xfc3NoCi0JfQotCi0JY2hlY2tfc3NoX25lZWRlZAotCi0JaWYgeyEgJHVzZV9zc2h9IHsKLQkJaWYgeyRteWNlcnQgIT0gIiJ9IHsKLQkJCWlmIHshIFtmaWxlIGV4aXN0cyAkbXljZXJ0XX0gewotCQkJCW1lc2cgIk15Q2VydCBkb2VzIG5vdCBleGlzdDogJG15Y2VydCIKLQkJCQliZWxsCi0JCQkJcmV0dXJuCi0JCQl9Ci0JCX0KLQkJaWYgeyRzdmNlcnQgIT0gIiJ9IHsKLQkJCWlmIHshIFtmaWxlIGV4aXN0cyAkc3ZjZXJ0XX0gewotCQkJCW1lc2cgIlNlcnZlckNlcnQgZG9lcyBub3QgZXhpc3Q6ICRzdmNlcnQiCi0JCQkJYmVsbAotCQkJCXJldHVybgotCQkJfQotCQl9IGVsc2VpZiB7JGNydGRpciAhPSAiIn0gewotCQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRjcnRkaXJdICYmICRjcnRkaXIgIT0gIkFDQ0VQVEVEX0NFUlRTIn0gewotCQkJCW1lc2cgIkNlcnRzRGlyIGRvZXMgbm90IGV4aXN0OiAkY3J0ZGlyIgotCQkJCWJlbGwKLQkJCQlyZXR1cm4KLQkJCX0KLQkJfQotCQlpZiB7JGNybGZpbCAhPSAiIn0gewotCQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRjcmxmaWxdfSB7Ci0JCQkJbWVzZyAiQ1JMIEZpbGUgZG9lcyBub3QgZXhpc3Q6ICRjcmxmaWwiCi0JCQkJYmVsbAotCQkJCXJldHVybgotCQkJfQotCQl9Ci0JfQotCi0JIyBWRgotCXNldCBwcmVmaXggInN0dW5uZWwtdm5jIgotCXNldCBzdWZmaXggImNvbmYiCi0JaWYgeyR1c2Vfc3NoIHx8ICR1c2Vfc3Noc3NsfSB7Ci0JCXNldCBwcmVmaXggInBsaW5rX3ZuYyIKLQkJc2V0IHN1ZmZpeCAiYmF0IgotCX0KLQotCXNldCBmaWxlMSAiIgotCXNldCBuMSAiIgotCXNldCBmaWxlMiAiIgotCXNldCBuMiAiIgotCXNldCBuMyAiIgotCXNldCBuNCAiIgotCXNldCBub3cgW2Nsb2NrIHNlY29uZHNdCi0KLQlzZXQgcHJveHkgW2dldF9zc2hfcHJveHkgJGhwXQotCWlmIHskdXNlX3NzaHNzbH0gewotCQlzZXQgcHJveHkgIiIKLQl9Ci0JaWYgeyEgW3JlcGVhdGVyX3Byb3h5X2NoZWNrICRwcm94eV19IHsKLQkJcmV0dXJuCi0JfQotCi0JZ2xvYmFsIHBvcnRfc2xvdAotCWlmIHskcG9ydF9zbG90ICE9ICIifSB7Ci0JCXNldCBmaWxlMSAiJHByZWZpeC0kcG9ydF9zbG90LiRzdWZmaXgiCi0JCXNldCBuMSAkcG9ydF9zbG90Ci0JCXNldCBwcyBbZXhwciAkcG9ydF9zbG90ICsgMjAwXQotCQlzZXQgZmlsZTIgIiRwcmVmaXgtJHBzLiRzdWZmaXgiCi0JCXNldCBuMiAkcHMKLQkJbWVzZyAiVXNpbmcgUG9ydCBTbG90OiAkcG9ydF9zbG90IgotCQlhZnRlciA3MDAKLQl9Ci0KLQlmb3Ige3NldCBpIDMwfSB7JGkgPD0gOTl9IHtpbmNyIGl9ICB7Ci0JCXNldCB0cnkgIiRwcmVmaXgtJGkuJHN1ZmZpeCIKLQkJaWYgeyRpID09ICRwb3J0X3Nsb3R9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYge1tmaWxlIGV4aXN0cyAkdHJ5XX0gIHsKLQkJCXNldCBtdCBbZmlsZSBtdGltZSAkdHJ5XQotCQkJc2V0IGFnZSBbZXhwciAiJG5vdyAtICRtdCJdCi0JCQlzZXQgd2VlayBbZXhwciAiNyAqIDM2MDAgKiAyNCJdCi0JCQlpZiB7JGFnZSA+ICR3ZWVrfSB7Ci0JCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICR0cnl9Ci0JCQl9Ci0JCX0KLQkJaWYgeyEgW2ZpbGUgZXhpc3RzICR0cnldfSAgewotCQkJaWYgeyRmaWxlMSA9PSAiIn0gewotCQkJCXNldCBmaWxlMSAkdHJ5Ci0JCQkJc2V0IG4xICRpCi0JCQl9IGVsc2VpZiB7JGZpbGUyID09ICIifSB7Ci0JCQkJc2V0IGZpbGUyICR0cnkKLQkJCQlzZXQgbjIgJGkKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCX0KLQotCWlmIHskZmlsZTEgPT0gIiJ9IHsKLQkJbWVzZyAiY291bGQgbm90IGZpbmQgZnJlZSBzdHVubmVsIGZpbGUiCi0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCi0JaWYgeyRuMSA9PSAiIn0gewotCQlzZXQgbjEgMTAKLQl9Ci0JaWYgeyRuMiA9PSAiIn0gewotCQlzZXQgbjIgMTEKLQl9Ci0Jc2V0IG4zIFtleHByICRuMSArIDEwMF0KLQlzZXQgbjQgW2V4cHIgJG4yICsgMTAwXQotCi0JZ2xvYmFsIGxhdW5jaF93aW5kb3dzX3NzaF9maWxlcyAKLQlzZXQgbGF1bmNoX3dpbmRvd3Nfc3NoX2ZpbGVzICIiCi0KLQlzZXQgZGlkX3BvcnRfa25vY2sgMAotCi0JZ2xvYmFsIGxpc3RlbmluZ19uYW1lCi0Jc2V0IGxpc3RlbmluZ19uYW1lICIiCi0KLQlpZiB7JHVzZV9zc2h9IHsKLQkJOwotCX0gZWxzZWlmIHskdXNlX3NzaHNzbH0gewotCQk7Ci0JfSBlbHNlaWYgeyR1c2Vfc3NsfSB7Ci0JCWlmIHskcHJveHkgIT0gIiIgJiYgW3JlZ2V4cCB7QH0gJHByb3h5XX0gewotCQkJbWVzZyAiRXJyb3I6IHByb3h5IGNvbnRhaW5zICdAJyAgRGlkIHlvdSBtZWFuIHRvIHVzZSBTU0ggbW9kZT8iCi0JCQliZWxsCi0JCQlyZXR1cm4KLQkJfQotCQlpZiBbcmVnZXhwIHtAfSAkaHBdIHsKLQkJCW1lc2cgIkVycm9yOiBob3N0IGNvbnRhaW5zICdAJyAgRGlkIHlvdSBtZWFuIHRvIHVzZSBTU0ggbW9kZT8iCi0JCQliZWxsCi0JCQlyZXR1cm4KLQkJfQotCX0KLQotCWdsb2JhbCBzc2hfaXB2Nl9waWQKLQlzZXQgc3NoX2lwdjZfcGlkICIiCi0KLQlpZiB7JHVzZV9zc2hzc2x9IHsKLQkJc2V0IHJjIFtsYXVuY2hfd2luZG93c19zc2ggJGhwICRmaWxlMiAkbjJdCi0JCWlmIHskcmMgPT0gMH0gewotCQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX05PX0RFTEVURSldfSB7Ci0JCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmaWxlMX0KLQkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZpbGUyfQotCQkJfQotCQkJZGVsX2xhdW5jaF93aW5kb3dzX3NzaF9maWxlcwotCQkJcmV0dXJuCi0JCX0KLQkJc2V0IGRpZF9wb3J0X2tub2NrIDEKLQl9IGVsc2VpZiB7JHVzZV9zc2h9IHsKLQkJbGF1bmNoX3dpbmRvd3Nfc3NoICRocCAkZmlsZTEgJG4xCi0JCSMgV0UgQVJFIERPTkUuCi0JCXJldHVybgotCX0KLQotCXNldCBob3N0IFtob3N0X3BhcnQgJGhwXTsKLQlzZXQgaG9zdF9vcmlnICRob3N0Ci0KLQlnbG9iYWwgd2luX2xvY2FsaG9zdAotCi0JaWYgeyRob3N0ID09ICIifSB7Ci0JCXNldCBob3N0ICR3aW5fbG9jYWxob3N0Ci0JfQotCi0JaWYgW3JlZ2V4cCB7Xi4qQH0gJGhvc3QgbWF0Y2hdIHsKLQkJY2F0Y2gge3JhaXNlIC47IHVwZGF0ZX0KLQkJbWVzZyAiVHJpbW1pbmcgXCIkbWF0Y2hcIiBmcm9tIGhvc3RuYW1lIgotCQlhZnRlciA3MDAKLQkJcmVnc3ViIHteLipAfSAkaG9zdCAiIiBob3N0Ci0JfQotCi0Jc2V0IGRpc3AgW3BvcnRfcGFydCAkaHBdCi0JaWYge1tyZWdleHAge14tWzAtOV1bMC05XSokfSAkZGlzcF19IHsKLQkJOwotCX0gZWxzZWlmIHskZGlzcCA9PSAiIiB8fCAhIFtyZWdleHAge15bMC05XVswLTldKiR9ICRkaXNwXX0gewotCQlzZXQgZGlzcCAwCi0JfQotCi0JaWYgeyRkaXNwIDwgMH0gewotCQlzZXQgcG9ydCBbZXhwciAiLSAkZGlzcCJdCi0JfSBlbHNlaWYgeyRkaXNwIDwgMjAwfSB7Ci0JCWlmIHskdXNlX2xpc3Rlbn0gewotCQkJc2V0IHBvcnQgW2V4cHIgIiRkaXNwICsgNTUwMCJdCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcG9ydCBbZXhwciAiJGRpc3AgKyA1OTAwIl0KLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBwb3J0ICRkaXNwCi0JfQotCi0JaWYgeyRkZWJ1Z30gewotCQltZXNnICJmaWxlOiAkZmlsZTEiCi0JCWFmdGVyIDEwMDAKLQl9Ci0KLQlsaXN0ZW5fdmVyaWZ5X2FsbF9kaWFsb2cgJGhwCi0KLQlpZiB7JHVzZV9saXN0ZW4gJiYgJG15Y2VydCA9PSAiIn0gewotCQlpZiB7ISBbY2hlY2tfZm9yX2xpc3Rlbl9zc2xfY2VydF19IHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXNldCBmYWlsIDAKLQotCXNldCBmaCBbb3BlbiAkZmlsZTEgInciXQotCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCXB1dHMgJGZoICJjbGllbnQgPSBubyIKLQl9IGVsc2UgewotCQlwdXRzICRmaCAiY2xpZW50ID0geWVzIgotCX0KLQlnbG9iYWwgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfdHlwZQotCWlmIHskZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHN9IHsKLQkJaWYgeyRkaXNhYmxlX3NzbF93b3JrYXJvdW5kc190eXBlID09ICJub2VtcHR5In0gewotCQkJcHV0cyAkZmggIm9wdGlvbnMgPSBET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMiCi0JCX0KLQl9IGVsc2UgewotCQlwdXRzICRmaCAib3B0aW9ucyA9IEFMTCIKLQl9Ci0KLQlwdXRzICRmaCAidGFza2JhciA9IHllcyIKLQlwdXRzICRmaCAiUk5EYnl0ZXMgPSAyMDQ4IgotCXB1dHMgJGZoICJSTkRmaWxlID0gYmFuYW5hcmFuZC5iaW4iCi0JcHV0cyAkZmggIlJORG92ZXJ3cml0ZSA9IHllcyIKLQlwdXRzICRmaCAiZGVidWcgPSA2IgotCi0JaWYgeyRteWNlcnQgIT0gIiJ9IHsKLQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRteWNlcnRdfSB7Ci0JCQltZXNnICJNeUNlcnQgZG9lcyBub3QgZXhpc3Q6ICRteWNlcnQiCi0JCQliZWxsCi0JCQlzZXQgZmFpbCAxCi0JCX0KLQkJcHV0cyAkZmggImNlcnQgPSAkbXljZXJ0IgotCX0gZWxzZWlmIHskdXNlX2xpc3Rlbn0gewotCQkjIHNlZSBhYm92ZSwgdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KLQkJcHV0cyAkZmggImNlcnQgPSBfbm9jZXJ0XyIKLQl9Ci0JaWYgeyRjcmxmaWwgIT0gIiJ9IHsKLQkJaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJGNybGZpbF0gewotCQkJcHV0cyAkZmggIkNSTHBhdGggPSAkY3JsZmlsIgotCQl9IGVsc2UgewotCQkJcHV0cyAkZmggIkNSTGZpbGUgPSAkY3JsZmlsIgotCQl9Ci0JfQotCi0Jc2V0IGRpZF9jaGVjayAwCi0KLQlpZiB7JHN2Y2VydCAhPSAiIn0gewotCQlpZiB7ISBbZmlsZSBleGlzdHMgJHN2Y2VydF19IHsKLQkJCW1lc2cgIlNlcnZlckNlcnQgZG9lcyBub3QgZXhpc3Q6ICRzdmNlcnQiCi0JCQliZWxsCi0JCQlzZXQgZmFpbCAxCi0JCX0KLQkJcHV0cyAkZmggIkNBZmlsZSA9ICRzdmNlcnQiCi0JCXB1dHMgJGZoICJ2ZXJpZnkgPSAyIgotCX0gZWxzZWlmIHskY3J0ZGlyICE9ICIifSB7Ci0JCWlmIHskY3J0ZGlyID09ICJBQ0NFUFRFRF9DRVJUUyJ9IHsKLQkJCWdsb2JhbCBza2lwX3ZlcmlmeV9hY2NlcHRlZF9jZXJ0cwotCQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDAKLQkJCXNldCBkaWRfY2hlY2sgMQotCQkJaWYgeyR1c2Vfc3Noc3NsfSB7Ci0JCQkJc2V0IHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzIDEKLQkJCQlzZXQgZGlkX2NoZWNrIDAKLQkJCX0gZWxzZWlmIHshIFtjaGVja19hY2NlcHRlZF9jZXJ0cyAwXX0gewotCQkJCXNldCBmYWlsIDEKLQkJCX0KLQkJCWlmIHshICRza2lwX3ZlcmlmeV9hY2NlcHRlZF9jZXJ0c30gewotCQkJCXNldCBhZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQkJCQlzZXQgYWRpciAiJGFkaXIvYWNjZXB0ZWQiCi0JCQkJY2F0Y2gge2ZpbGUgbWtkaXIgJGFkaXJ9Ci0JCQkJcHV0cyAkZmggIkNBcGF0aCA9ICRhZGlyIgotCQkJCXB1dHMgJGZoICJ2ZXJpZnkgPSAyIgotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRjcnRkaXJdfSB7Ci0JCQkJbWVzZyAiQ2VydHNEaXIgZG9lcyBub3QgZXhpc3Q6ICRjcnRkaXIiCi0JCQkJYmVsbAotCQkJCXNldCBmYWlsIDEKLQkJCX0KLQkJCXB1dHMgJGZoICJDQXBhdGggPSAkY3J0ZGlyIgotCQkJcHV0cyAkZmggInZlcmlmeSA9IDIiCi0JCX0KLQl9Ci0KLQlpZiB7ISRkaWRfY2hlY2t9IHsKLQkJY2hlY2tfYWNjZXB0ZWRfY2VydHMgMQotCX0KLQotCWlmIHskdXNlX3NzaHNzbH0gewotCQlzZXQgcCBbZXhwciAiJG4yICsgNTkwMCJdCi0JCXNldCBwcm94eSBbbWF5YmVfYWRkX3ZlbmNyeXB0ICRwcm94eSAiJHdpbl9sb2NhbGhvc3Q6JHAiXQotCX0gZWxzZSB7Ci0JCXNldCBwcm94eSBbbWF5YmVfYWRkX3ZlbmNyeXB0ICRwcm94eSAkaHBdCi0JfQotCi0Jc2V0IGlwdjZfcGlkICIiCi0JZ2xvYmFsIGhhdmVfaXB2NgotCWlmIHskaGF2ZV9pcHY2fSB7Ci0JCWlmIHskcHJveHkgPT0gIiIgJiYgJHVzZV9zc2x9IHsKLQkJCSMgc3R1bm5lbCBjYW4gaGFuZGxlIGlwdjYKLQkJfSBlbHNlIHsKLQkJCXNldCByZXMgW2lwdjZfcHJveHkgJHByb3h5ICRob3N0ICRwb3J0XQotCQkJc2V0IHByb3h5ICAgIFtsaW5kZXggJHJlcyAwXQotCQkJc2V0IGhvc3QgICAgIFtsaW5kZXggJHJlcyAxXQotCQkJc2V0IHBvcnQgICAgIFtsaW5kZXggJHJlcyAyXQotCQkJc2V0IGlwdjZfcGlkIFtsaW5kZXggJHJlcyAzXQotCQl9Ci0JfQotCi0Jc2V0IHBfcmV2ZXJzZSAwCi0KLQlpZiB7JHByb3h5ICE9ICIifSB7Ci0JCWlmIHskdXNlX3NzaHNzbH0gewotCQkJOwotCQl9IGVsc2VpZiBbcmVnZXhwIHtAfSAkcHJveHldIHsKLQkJCWJlbGwKLQkJCWNhdGNoIHtyYWlzZSAuOyB1cGRhdGV9Ci0JCQltZXNnICJXQVJOSU5HOiBTU0wgcHJveHkgY29udGFpbnMgXCJAXCIgc2lnbiIKLQkJCWFmdGVyIDE1MDAKLQkJfQotCQlzZXQgZW52KFNTVk5DX1BST1hZKSAkcHJveHkKLQkJc2V0IGVudihTU1ZOQ19ERVNUKSAiJGhvc3Q6JHBvcnQiCi0JCWlmIHskdXNlX2xpc3Rlbn0gewotCQkJc2V0IGVudihTU1ZOQ19SRVZFUlNFKSAiJHdpbl9sb2NhbGhvc3Q6JHBvcnQiCi0JCQlzZXQgZW52KENPTk5FQ1RfQlJfU0xFRVApIDMKLQkJCXNldCBwX3JldmVyc2UgMQotCQl9IGVsc2UgewotCQkJaWYgeyR1c2Vfc3Noc3NsICYmIFtyZWdleHAge3ZlbmNyeXB0On0gJHByb3h5XX0gewotCQkJCXNldCBlbnYoU1NWTkNfTElTVEVOKSBbZXhwciAiJG40ICsgNTkwMCJdCi0JCQl9IGVsc2UgewotCQkJCXNldCBlbnYoU1NWTkNfTElTVEVOKSBbZXhwciAiJG4yICsgNTkwMCJdCi0JCQl9Ci0JCX0KLQkJaWYge1tpbmZvIGV4aXN0cyBlbnYoUFJPWFlfREVCVUcpXX0gewotCQkJZm9yZWFjaCB2YXIgW2xpc3QgU1NWTkNfUFJPWFkgU1NWTkNfREVTVCBTU1ZOQ19SRVZFUlNFIENPTk5FQ1RfQlJfU0xFRVAgU1NWTkNfTElTVEVOXSB7Ci0JCQkJaWYgW2luZm8gZXhpc3RzIGVudigkdmFyKV0gewotCQkJCQltZXNnICIkdmFyICRlbnYoJHZhcikiOyBhZnRlciAyNTAwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWdsb2JhbCBhbm9uX2RoX2RldGVjdGVkIHNlcnZlcl9hbm9uZGgKLQlpZiB7JGFub25fZGhfZGV0ZWN0ZWQgfHwgJHNlcnZlcl9hbm9uZGh9IHsKLQkJcHV0cyAkZmggImNpcGhlcnMgPSBBTEw6UkM0K1JTQTorU1NMdjI6QFNUUkVOR1RIIgotCQlzZXQgYW5vbl9kaF9kZXRlY3RlZCAwCi0JfQotCi0KLQlwdXRzICRmaCAiXFt2bmMkbjFcXSIKLQlzZXQgcG9ydDIgIiIKLQlzZXQgcG9ydDMgIiIKLQlpZiB7ISAkdXNlX2xpc3Rlbn0gewotCQlzZXQgcG9ydDIgW2V4cHIgIiRuMSArIDU5MDAiXSAKLQkJaWYgW3JlZ2V4cCB7dmVuY3J5cHQ6fSAkcHJveHldIHsKLQkJCXNldCBwb3J0MyBbZXhwciAiJG4zICsgNTkwMCJdIAotCQkJc2V0IHBvcnQyICRwb3J0MwotCQkJcHV0cyAkZmggImFjY2VwdCA9ICR3aW5fbG9jYWxob3N0OiRwb3J0MyIKLQkJfSBlbHNlIHsKLQkJCXB1dHMgJGZoICJhY2NlcHQgPSAkd2luX2xvY2FsaG9zdDokcG9ydDIiCi0JCX0KLQotCQlpZiB7JHVzZV9zc2hzc2wgJiYgW3JlZ2V4cCB7dmVuY3J5cHQ6fSAkcHJveHldfSB7Ci0JCQlzZXQgcG9ydCBbZXhwciAiJG40ICsgNTkwMCJdCi0JCQlwdXRzICRmaCAiY29ubmVjdCA9ICR3aW5fbG9jYWxob3N0OiRwb3J0IgotCQl9IGVsc2VpZiB7JHVzZV9zc2hzc2wgfHwgJHByb3h5ICE9ICIifSB7Ci0JCQlzZXQgcG9ydCBbZXhwciAiJG4yICsgNTkwMCJdCi0JCQlwdXRzICRmaCAiY29ubmVjdCA9ICR3aW5fbG9jYWxob3N0OiRwb3J0IgotCQl9IGVsc2UgewotCQkJcHV0cyAkZmggImNvbm5lY3QgPSAkaG9zdDokcG9ydCIKLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBwb3J0MiBbZXhwciAiJG4xICsgNTUwMCJdIAotCQlzZXQgaGxvYyAiIgotCQlpZiB7JHVzZV9zc2h9IHsKLQkJCSMgbm90IHJlYWNoZWQ/Ci0JCQlzZXQgaGxvYyAiJHdpbl9sb2NhbGhvc3Q6IgotCQkJc2V0IGxpc3RlbmluZ19uYW1lICIkd2luX2xvY2FsaG9zdDokcG9ydCAgKG9uIHJlbW90ZSBTU0ggc2lkZSkiCi0JCX0gZWxzZSB7Ci0JCQlzZXQgaG4gW2dldF9ob3N0bmFtZV0KLQkJCWlmIHskaG4gPT0gIiJ9IHsKLQkJCQlzZXQgaG4gInRoaXMtY29tcHV0ZXIiCi0JCQl9Ci0JCQlzZXQgbGlzdGVuaW5nX25hbWUgIiRobjokcG9ydCAgKG9yIG5uLm5uLm5uLm5uOiRwb3J0LCBldGMuKSIKLQkJfQotCQlpZiB7JGhvc3Rfb3JpZyAhPSAiIiAmJiAkaGxvYyA9PSAiIn0gewotCQkJc2V0IGhsb2MgIiRob3N0X29yaWc6IgotCQl9Ci0JCXB1dHMgJGZoICJhY2NlcHQgPSAkaGxvYyRwb3J0IgotCQlwdXRzICRmaCAiY29ubmVjdCA9ICR3aW5fbG9jYWxob3N0OiRwb3J0MiIKLQl9Ci0KLQlwdXRzICRmaCAiZGVsYXkgPSBubyIKLQlwdXRzICRmaCAiIgotCWNsb3NlICRmaAotCi0JaWYgeyEgJGRpZF9wb3J0X2tub2NrfSB7Ci0JCWlmIHshIFtkb19wb3J0X2tub2NrICRob3N0IHN0YXJ0XX0gewotCQkJc2V0IGZhaWwgMQotCQl9Ci0JCXNldCBkaWRfcG9ydF9rbm9jayAxCi0JfQotCi0JaWYgeyRmYWlsfSB7Ci0JCWlmIHshW2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19ERUxFVEUpXX0gewotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmaWxlMX0KLQkJfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19QUk9YWSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19MSVNURU4pIH0KLQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfUkVWRVJTRSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19ERVNUKSB9Ci0JCWNhdGNoIHsgdW5zZXQgZW52KFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihDT05ORUNUX0JSX1NMRUVQKSB9Ci0JCXdpbmtpbGwgJGlwdjZfcGlkCi0JCXdpbmtpbGwgJHNzaF9pcHY2X3BpZAotCQlzZXQgc3NoX2lwdjZfcGlkICIiCi0JCXJldHVybgotCX0KLQotCW5vdGVfc3R1bm5lbF9waWRzICJiZWZvcmUiCi0KLQlzZXQgcHJveHlfcGlkICIiCi0Jc2V0IHByb3h5X3BpZDIgIiIKLQotCWlmIHskdXNlX2xpc3Rlbn0gewotCQl3aW5kb3dzX2xpc3RlbmluZ19tZXNzYWdlICRuMQotCX0KLQotCWlmIHskcHJveHkgIT0gIiJ9IHsKLQkJaWYgW3JlZ2V4cCB7dmVuY3J5cHQ6fSAkcHJveHldIHsKLQkJCXNldCB2cG9ydCBbZXhwciAiJG4xICsgNTkwMCJdCi0JCQltZXNnICJTdGFydGluZyBWZU5DcnlwdCBoZWxwZXIgb24gcG9ydCAkdnBvcnQsJHBvcnQzIC4uLiIKLQkJCWFmdGVyIDUwMAotCQkJaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX05PX0RFTEVURSldfSB7Ci0JCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICIkZmlsZTEucHJlIn0KLQkJCX0KLQkJCXNldCBlbnYoU1NWTkNfUFJFRElHRVNURURfSEFORFNIQUtFKSAiJGZpbGUxLnByZSIKLQkJCXNldCBlbnYoU1NWTkNfVkVOQ1JZUFRfVklFV0VSX0JSSURHRSkgIiR2cG9ydCwkcG9ydDMiCi0JCQlzZXQgcHJveHlfcGlkMiBbZXhlYyAiY29ubmVjdF9ici5leGUiICZdCi0JCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19WRU5DUllQVF9WSUVXRVJfQlJJREdFKSB9Ci0JCX0KLQkJbWVzZyAiU3RhcnRpbmcgVENQIGhlbHBlciBvbiBwb3J0ICRwb3J0IC4uLiIKLQkJYWZ0ZXIgNDAwCi0JCSMgc3NsIGJyIGNhc2U6Ci0JCXNldCBwcm94eV9waWQgW2V4ZWMgImNvbm5lY3RfYnIuZXhlIiAmXQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19QUk9YWSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19MSVNURU4pIH0KLQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfUkVWRVJTRSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19ERVNUKSB9Ci0JCWNhdGNoIHsgdW5zZXQgZW52KFNTVk5DX1BSRURJR0VTVEVEX0hBTkRTSEFLRSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihDT05ORUNUX0JSX1NMRUVQKSB9Ci0JfQotCi0JbWVzZyAiU3RhcnRpbmcgU1RVTk5FTCBvbiBwb3J0ICRwb3J0MiAuLi4iCi0JYWZ0ZXIgNTAwCi0KLQlzZXQgcGlkcyBbZXhlYyBzdHVubmVsICRmaWxlMSAmXQotCi0JaWYgeyEgJHBfcmV2ZXJzZX0gewotCQlhZnRlciAzMDAKLQkJc2V0IHZ0bSBbdmVuY3J5cHRfdHV0b3JpYWxfbWVzZ10KLQkJaWYgeyR2dG0gPT0gIiJ9IHsKLQkJCWFmdGVyIDMwMAotCQl9Ci0JfQotCi0Jbm90ZV9zdHVubmVsX3BpZHMgImFmdGVyIgotCi0JaWYgeyRkZWJ1Z30gewotCQlhZnRlciAxMDAwCi0JCW1lc2cgInBpZHMgJHBpZHMiCi0JCWFmdGVyIDEwMDAKLQl9IGVsc2UgewotCQljYXRjaCB7ZGVzdHJveSAub30KLQkJY2F0Y2gge2Rlc3Ryb3kgLm9hfQotCQljYXRjaCB7ZGVzdHJveSAub3N9Ci0JCXdtIHdpdGhkcmF3IC4KLQl9Ci0KLQlkb192aWV3ZXJfd2luZG93cyAkbjEKLQotCWRlbF9sYXVuY2hfd2luZG93c19zc2hfZmlsZXMKLQotCWlmIHshW2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19ERUxFVEUpXX0gewotCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZpbGUxfQotCX0KLQotCWlmIHskZGVidWd9IHsKLQkJOwotCX0gZWxzZSB7Ci0JCXdtIGRlaWNvbmlmeSAuCi0JfQotCW1lc2cgIkRpc2Nvbm5lY3RlZCBmcm9tICRocC4iCi0KLQlnbG9iYWwgcG9ydF9rbm9ja2luZ19saXN0Ci0JaWYgW3JlZ2V4cCB7RklOSVNIfSAkcG9ydF9rbm9ja2luZ19saXN0XSB7Ci0JCWRvX3BvcnRfa25vY2sgJGhvc3QgZmluaXNoCi0JfQotCi0JaWYge1tsbGVuZ3RoICRwaWRzX25ld10gPiAwfSB7Ci0JCXNldCBwbGlzdCBbam9pbiAkcGlkc19uZXcgIiwgIl0KLQkJZ2xvYmFsIHRlcm1pbmF0ZV9waWRzCi0JCXNldCB0ZXJtaW5hdGVfcGlkcyAiIgotCQlnbG9iYWwga2lsbF9zdHVubmVsCi0JCWlmIHska2lsbF9zdHVubmVsfSB7Ci0JCQlzZXQgdGVybWluYXRlX3BpZHMgeWVzCi0JCX0gZWxzZSB7Ci0JCQl3aW5fa2lsbF9tc2cgJHBsaXN0Ci0JCQl1cGRhdGUKLQkJCXZ3YWl0IHRlcm1pbmF0ZV9waWRzCi0JCX0KLQkJaWYgeyR0ZXJtaW5hdGVfcGlkcyA9PSAieWVzIn0gewotCQkJa2lsbF9zdHVubmVsICRwaWRzX25ldwotCQl9Ci0JfSBlbHNlIHsKLQkJd2luX25va2lsbF9tc2cKLQl9Ci0JbWVzZyAiRGlzY29ubmVjdGVkIGZyb20gJGhwLiIKLQl3aW5raWxsICRpcHY2X3BpZAotCXdpbmtpbGwgJHNzaF9pcHY2X3BpZAotCXNldCBzc2hfaXB2Nl9waWQgIiIKLQotCWdsb2JhbCBpc193aW45eCB1c2Vfc291bmQgc291bmRfZGFlbW9uX2xvY2FsX2tpbGwgc291bmRfZGFlbW9uX2xvY2FsX2NtZAotCWlmIHshICRpc193aW45eCAmJiAkdXNlX3NvdW5kICYmICRzb3VuZF9kYWVtb25fbG9jYWxfa2lsbCAmJiAkc291bmRfZGFlbW9uX2xvY2FsX2NtZCAhPSAiIn0gewotCQl3aW5kb3dzX3N0b3Bfc291bmRfZGFlbW9uCi0JfQotfQotCi1wcm9jIGRpcmVjdF9jb25uZWN0X3dpbmRvd3Mge3tocCAiIn19IHsKLQlnbG9iYWwgdGNsX3BsYXRmb3JtIGlzX3dpbmRvd3MKLQlnbG9iYWwgZW52IHVzZV9saXN0ZW4KLQotCXNldCBwcm94eSBbZ2V0X3NzaF9wcm94eSAkaHBdCi0KLQlzZXQgZGlkX3BvcnRfa25vY2sgMAotCi0JZ2xvYmFsIGxpc3RlbmluZ19uYW1lCi0Jc2V0IGxpc3RlbmluZ19uYW1lICIiCi0KLQlzZXQgaG9zdCBbaG9zdF9wYXJ0ICRocF0KLQotCXNldCBob3N0X29yaWcgJGhvc3QKLQotCWdsb2JhbCB3aW5fbG9jYWxob3N0Ci0JaWYgeyRob3N0ID09ICIifSB7Ci0JCXNldCBob3N0ICR3aW5fbG9jYWxob3N0Ci0JfQotCi0JaWYgW3JlZ2V4cCB7Xi4qQH0gJGhvc3QgbWF0Y2hdIHsKLQkJY2F0Y2gge3JhaXNlIC47IHVwZGF0ZX0KLQkJbWVzZyAiVHJpbW1pbmcgXCIkbWF0Y2hcIiBmcm9tIGhvc3RuYW1lIgotCQlhZnRlciA3MDAKLQkJcmVnc3ViIHteLipAfSAkaG9zdCAiIiBob3N0Ci0JfQotCi0Jc2V0IGRpc3AgW3BvcnRfcGFydCAkaHBdCi0JaWYge1tyZWdleHAge14tWzAtOV1bMC05XSokfSAkZGlzcF19IHsKLQkJOwotCX0gZWxzZWlmIHskZGlzcCA9PSAiIiB8fCAhIFtyZWdleHAge15bMC05XVswLTldKiR9ICRkaXNwXX0gewotCQlzZXQgZGlzcCAwCi0JfQotCi0JaWYgeyRkaXNwIDwgMH0gewotCQlzZXQgcG9ydCBbZXhwciAiLSAkZGlzcCJdCi0JfSBlbHNlaWYgeyRkaXNwIDwgMjAwfSB7Ci0JCWlmIHskdXNlX2xpc3Rlbn0gewotCQkJc2V0IHBvcnQgW2V4cHIgIiRkaXNwICsgNTUwMCJdCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcG9ydCBbZXhwciAiJGRpc3AgKyA1OTAwIl0KLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBwb3J0ICRkaXNwCi0JfQotCi0JZ2xvYmFsIGhhdmVfaXB2NgotCXNldCBpcHY2X3BpZCAiIgotCWlmIHskaGF2ZV9pcHY2ICYmICEkdXNlX2xpc3Rlbn0gewotCQlzZXQgcmVzIFtpcHY2X3Byb3h5ICRwcm94eSAkaG9zdCAkcG9ydF0KLQkJc2V0IHByb3h5ICAgIFtsaW5kZXggJHJlcyAwXQotCQlzZXQgaG9zdCAgICAgW2xpbmRleCAkcmVzIDFdCi0JCXNldCBwb3J0ICAgICBbbGluZGV4ICRyZXMgMl0KLQkJc2V0IGlwdjZfcGlkIFtsaW5kZXggJHJlcyAzXQotCX0KLQotCWlmIHskcHJveHkgIT0gIiJ9IHsKLQkJaWYgW3JlZ2V4cCB7QH0gJHByb3h5XSB7Ci0JCQliZWxsCi0JCQljYXRjaCB7cmFpc2UgLjsgdXBkYXRlfQotCQkJbWVzZyAiV0FSTklORzogU1NMIHByb3h5IGNvbnRhaW5zIFwiQFwiIHNpZ24iCi0JCQlhZnRlciAxNTAwCi0JCX0KLQkJc2V0IG4yIDQ1Ci0KLQkJc2V0IGVudihTU1ZOQ19QUk9YWSkgJHByb3h5Ci0JCXNldCBlbnYoU1NWTkNfTElTVEVOKSBbZXhwciAiJG4yICsgNTkwMCJdCi0JCXNldCBlbnYoU1NWTkNfREVTVCkgIiRob3N0OiRwb3J0IgotCi0JCXNldCBwb3J0IFtleHByICRuMiArIDU5MDBdCi0JCXNldCBob3N0ICR3aW5fbG9jYWxob3N0Ci0JfQotCi0Jc2V0IGZhaWwgMAotCWlmIHshICRkaWRfcG9ydF9rbm9ja30gewotCQlpZiB7ISBbZG9fcG9ydF9rbm9jayAkaG9zdCBzdGFydF19IHsKLQkJCXNldCBmYWlsIDEKLQkJfQotCQlzZXQgZGlkX3BvcnRfa25vY2sgMQotCX0KLQotCWlmIHskZmFpbH0gewotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19QUk9YWSkgfQotCQljYXRjaCB7IHVuc2V0IGVudihTU1ZOQ19MSVNURU4pIH0KLQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfREVTVCkgfQotCQl3aW5raWxsICRpcHY2X3BpZAotCQlyZXR1cm4KLQl9Ci0KLQlzZXQgcHJveHlfcGlkICIiCi0JaWYgeyRwcm94eSAhPSAiIn0gewotCQltZXNnICJTdGFydGluZyBQcm94eSBUQ1AgaGVscGVyIG9uIHBvcnQgJHBvcnQgLi4uIgotCQlhZnRlciA0MDAKLQkJIyB1bmVuY3J5cHRlZCBiciBjYXNlOgotCQlzZXQgcHJveHlfcGlkIFtleGVjICJjb25uZWN0X2JyLmV4ZSIgJl0KLQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfUFJPWFkpIH0KLQkJY2F0Y2ggeyB1bnNldCBlbnYoU1NWTkNfTElTVEVOKSB9Ci0JCWNhdGNoIHsgdW5zZXQgZW52KFNTVk5DX0RFU1QpIH0KLQl9Ci0KLQl2ZW5jcnlwdF90dXRvcmlhbF9tZXNnCi0KLQljYXRjaCB7ZGVzdHJveSAub30KLQljYXRjaCB7ZGVzdHJveSAub2F9Ci0JY2F0Y2gge2Rlc3Ryb3kgLm9zfQotCXdtIHdpdGhkcmF3IC4KLQotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlzZXQgbiAkcG9ydAotCQlpZiB7JG4gPj0gNTUwMH0gewotCQkJc2V0IG4gW2V4cHIgJG4gLSA1NTAwXQotCQl9Ci0JCWdsb2JhbCBkaXJlY3RfY29ubmVjdF9yZXZlcnNlX2hvc3Rfb3JpZwotCQlzZXQgZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcgJGhvc3Rfb3JpZwotCi0JCWRvX3ZpZXdlcl93aW5kb3dzICIkbiIKLQotCQlzZXQgZGlyZWN0X2Nvbm5lY3RfcmV2ZXJzZV9ob3N0X29yaWcgIiIKLQl9IGVsc2UgewotCQlpZiB7JHBvcnQgPj0gNTkwMCAmJiAkcG9ydCA8IDYxMDB9IHsKLQkJCXNldCBwb3J0IFtleHByICRwb3J0IC0gNTkwMF0KLQkJfQotCQlkb192aWV3ZXJfd2luZG93cyAiJGhvc3Q6JHBvcnQiCi0JfQotCi0Jd20gZGVpY29uaWZ5IC4KLQotCW1lc2cgIkRpc2Nvbm5lY3RlZCBmcm9tICRocC4iCi0KLQl3aW5raWxsICRpcHY2X3BpZAotCi0JZ2xvYmFsIHBvcnRfa25vY2tpbmdfbGlzdAotCWlmIFtyZWdleHAge0ZJTklTSH0gJHBvcnRfa25vY2tpbmdfbGlzdF0gewotCQlkb19wb3J0X2tub2NrICRob3N0IGZpbmlzaAotCX0KLQotCW1lc2cgIkRpc2Nvbm5lY3RlZCBmcm9tICRocC4iCi19Ci0KLXByb2MgZ2V0X2lkaXJfY2VydHMge3N0cn0gewotCWdsb2JhbCBpc193aW5kb3dzIGVudgotCXNldCBpZGlyICIiCi0JaWYgeyRzdHIgIT0gIiJ9IHsKLQkJaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHN0cl0gewotCQkJc2V0IGlkaXIgJHN0cgotCQl9IGVsc2UgewotCQkJc2V0IGlkaXIgW2ZpbGUgZGlybmFtZSAkc3RyXQotCQl9Ci0JCWlmIHskaXNfd2luZG93c30gewotCQkJcmVnc3ViIC1hbGwge1xcfSAkaWRpciAiLyIgaWRpcgotCQkJcmVnc3ViIC1hbGwgey8vKn0gJGlkaXIgIi8iIGlkaXIKLQkJfQotCX0KLQlpZiB7JGlkaXIgPT0gIiJ9IHsKLQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0hPTUUpXSB7Ci0JCQkJc2V0IHQgIiRlbnYoU1NWTkNfSE9NRSkvc3Nfdm5jIgkKLQkJCQlyZWdzdWIgLWFsbCB7XFx9ICR0ICIvIiB0Ci0JCQkJcmVnc3ViIC1hbGwgey8vKn0gJHQgIi8iIHQKLQkJCQlpZiB7ISBbZmlsZSBpc2RpcmVjdG9yeSAkdF19IHsKLQkJCQkJY2F0Y2gge2ZpbGUgbWtkaXIgJHR9Ci0JCQkJfQotCQkJCXNldCB0ICIkZW52KFNTVk5DX0hPTUUpL3NzX3ZuYy9jZXJ0cyIJCi0JCQkJcmVnc3ViIC1hbGwge1xcfSAkdCAiLyIgdAotCQkJCXJlZ3N1YiAtYWxsIHsvLyp9ICR0ICIvIiB0Ci0JCQkJaWYgeyEgW2ZpbGUgaXNkaXJlY3RvcnkgJHRdfSB7Ci0JCQkJCWNhdGNoIHtmaWxlIG1rZGlyICR0fQotCQkJCX0KLQkJCQlpZiBbZmlsZSBpc2RpcmVjdG9yeSAkdF0gewotCQkJCQlzZXQgaWRpciAkdAotCQkJCX0KLQkJCX0KLQkJCWlmIHskaWRpciA9PSAiIn0gewotCQkJCXNldCB0IFtmaWxlIGRpcm5hbWUgW3B3ZF1dCi0JCQkJc2V0IHQgIiR0L2NlcnRzIgotCQkJCWlmIFtmaWxlIGlzZGlyZWN0b3J5ICR0XSB7Ci0JCQkJCXNldCBpZGlyICR0Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIHskaWRpciA9PSAiIn0gewotCQkJaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19IT01FKV0gewotCQkJCXNldCB0ICIkZW52KFNTVk5DX0hPTUUpLy52bmMiCQotCQkJCWlmIHshIFtmaWxlIGlzZGlyZWN0b3J5ICR0XX0gewotCQkJCQljYXRjaCB7ZmlsZSBta2RpciAkdH0KLQkJCQl9Ci0JCQkJc2V0IHQgIiRlbnYoU1NWTkNfSE9NRSkvLnZuYy9jZXJ0cyIJCi0JCQkJaWYgeyEgW2ZpbGUgaXNkaXJlY3RvcnkgJHRdfSB7Ci0JCQkJCWNhdGNoIHtmaWxlIG1rZGlyICR0fQotCQkJCX0KLQkJCQlpZiBbZmlsZSBpc2RpcmVjdG9yeSAkdF0gewotCQkJCQlzZXQgaWRpciAkdAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiB7JGlkaXIgPT0gIiJ9IHsKLQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQlzZXQgaWRpciBbZ2V0X3Byb2ZpbGVzX2Rpcl0KLQkJfQotCQlpZiB7JGlkaXIgPT0gIiJ9IHsKLQkJCXNldCBpZGlyIFtwd2RdCi0JCX0KLQl9Ci0JcmV0dXJuICRpZGlyCi19Ci0KLXByb2MgZGVsZXRlX2NlcnQge3twYXJlbnQgIi4ifX0gewotCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQlzZXQgZiAiIgotCXVuaXhfZGlhbG9nX3Jlc2l6ZSAkcGFyZW50Ci0JaWYgeyRpZGlyICE9ICIifSB7Ci0JCXNldCBmIFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJlbnQgLWluaXRpYWxkaXIgJGlkaXJdCi0JfSBlbHNlIHsKLQkJc2V0IGYgW3RrX2dldE9wZW5GaWxlIC1wYXJlbnQgJHBhcmVudF0KLQl9Ci0JaWYgeyRmICE9ICIiICYmIFtmaWxlIGV4aXN0cyAkZl19IHsKLQkJc2V0IHJlcGx5IFt0a19tZXNzYWdlQm94IC1wYXJlbnQgJHBhcmVudCAtdHlwZSB5ZXNubyAtaWNvbiBxdWVzdGlvbiAtdGl0bGUgIkRlbGV0ZSBDZXJ0IiAtbWVzc2FnZSAiRGVsZXRlICRmIl0KLQkJaWYgeyRyZXBseSA9PSAieWVzIn0gewotCQkJZ2xvYmFsIG15Y2VydCBzdmNlcnQgY3JsZmlsCi0JCQlzZXQgZl90ZXh0IFtyZWFkX2ZpbGUgJGZdCi0JCQlzZXQgZjIgIiIgCi0JCQljYXRjaCB7ZmlsZSBkZWxldGUgJGZ9CQotCQkJaWYgeyRmID09ICRteWNlcnR9IHsgc2V0IG15Y2VydCAiIiB9Ci0JCQlpZiB7JGYgPT0gJHN2Y2VydH0geyBzZXQgc3ZjZXJ0ICIiIH0KLQkJCWlmIHskZiA9PSAkY3JsZmlsfSB7IHNldCBjcmxmaWwgIiIgfQotCQkJaWYgW3JlZ2V4cCB7XC5jcnQkfSAkZl0gewotCQkJCXJlZ3N1YiB7XC5jcnQkfSAkZiAiLnBlbSIgZjIKLQkJCX0gZWxzZWlmIFtyZWdleHAge1wucGVtJH0gJGZdIHsKLQkJCQlyZWdzdWIge1wucGVtJH0gJGYgIi5jcnQiIGYyCi0JCQl9Ci0JCQlpZiB7JGYyICE9ICIiICYmIFtmaWxlIGV4aXN0cyAkZjJdfSB7Ci0JCQkJc2V0IHJlcGx5IFt0a19tZXNzYWdlQm94IC1wYXJlbnQgJHBhcmVudCAtdHlwZSB5ZXNubyAtaWNvbiBxdWVzdGlvbiAtdGl0bGUgIkRlbGV0ZSBDZXJ0IiAtbWVzc2FnZSAiRGVsZXRlICRmMiJdCi0JCQkJaWYgeyRyZXBseSA9PSAieWVzIn0gewotCQkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJGYyfQkKLQkJCQkJaWYgeyRmMiA9PSAkbXljZXJ0fSB7IHNldCBteWNlcnQgIiIgfQotCQkJCQlpZiB7JGYyID09ICRzdmNlcnR9IHsgc2V0IHN2Y2VydCAiIiB9Ci0JCQkJCWlmIHskZjIgPT0gJGNybGZpbH0geyBzZXQgY3JsZmlsICIiIH0KLQkJCQl9Ci0JCQl9Ci0JCQlzZXQgZGlyIFtmaWxlIGRpcm5hbWUgJGZdCi0JCQlpZiB7JGZfdGV4dCAhPSAiIiAmJiBbcmVnZXhwIHthY2NlcHRlZCR9ICRkaXJdfSB7Ci0JCQkJZm9yZWFjaCBjcnQgW2dsb2IgLW5vY29tcGxhaW4gLWRpcmVjdG9yeSAkZGlyIHsqLmNydH0geyoucGVtfSB7Ki5bMC05XX1dIHsKLQkJCQkJI3B1dHMgInRyeSAkY3J0IgotCQkJCQlzZXQgY190ZXh0IFtyZWFkX2ZpbGUgJGNydF0KLQkJCQkJaWYgeyRjX3RleHQgPT0gIiJ9IHsKLQkJCQkJCWNvbnRpbnVlCi0JCQkJCX0KLQkJCQkJaWYgeyRjX3RleHQgIT0gJGZfdGV4dH0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlzZXQgcmVwbHkgW3RrX21lc3NhZ2VCb3ggLXBhcmVudCAkcGFyZW50IC10eXBlIHllc25vIC1pY29uIHF1ZXN0aW9uIC10aXRsZSAiRGVsZXRlIElkZW50aWNhbCBDZXJ0IiAtbWVzc2FnZSAiRGVsZXRlIElkZW50aWNhbCAkY3J0Il0KLQkJCQkJaWYgeyRyZXBseSA9PSAieWVzIn0gewotCQkJCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRjcnR9CQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWNhdGNoIHt3bSBkZWljb25pZnkgLmN9Ci0JdXBkYXRlCi19Ci0KLXByb2Mgc2V0X215Y2VydCB7e3BhcmVudCAiLiJ9fSB7Ci0JZ2xvYmFsIG15Y2VydAotCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAkbXljZXJ0XQotCXNldCB0ICIiCi0JdW5peF9kaWFsb2dfcmVzaXplICRwYXJlbnQKLQlpZiB7JGlkaXIgIT0gIiJ9IHsKLQkJc2V0IHQgW3RrX2dldE9wZW5GaWxlIC1wYXJlbnQgJHBhcmVudCAtaW5pdGlhbGRpciAkaWRpcl0KLQl9IGVsc2UgewotCQlzZXQgdCBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAkcGFyZW50XQotCX0KLQlpZiB7JHQgIT0gIiJ9IHsKLQkJc2V0IG15Y2VydCAkdAotCX0KLQljYXRjaCB7d20gZGVpY29uaWZ5IC5jfQotCXZfbXljZXJ0Ci0JdXBkYXRlIAotfQotCi1wcm9jIHNldF9jcmxmaWwge3twYXJlbnQgIi4ifX0gewotCWdsb2JhbCBjcmxmaWwKLQlzZXQgaWRpciBbZ2V0X2lkaXJfY2VydHMgJGNybGZpbF0KLQlzZXQgdCAiIgotCXVuaXhfZGlhbG9nX3Jlc2l6ZSAkcGFyZW50Ci0JaWYgeyRpZGlyICE9ICIifSB7Ci0JCXNldCB0IFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJlbnQgLWluaXRpYWxkaXIgJGlkaXJdCi0JfSBlbHNlIHsKLQkJc2V0IHQgW3RrX2dldE9wZW5GaWxlIC1wYXJlbnQgJHBhcmVudF0KLQl9Ci0JaWYgeyR0ICE9ICIifSB7Ci0JCXNldCBjcmxmaWwgJHQKLQl9Ci0JY2F0Y2gge3dtIGRlaWNvbmlmeSAuY30KLQl2X2NybGZpbAotCXVwZGF0ZSAKLX0KLQotcHJvYyBzZXRfdWx0cmFfZHNtX2ZpbGUge3twYXJlbnQgIi4ifX0gewotCWdsb2JhbCB1bHRyYV9kc21fZmlsZQotCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAkdWx0cmFfZHNtX2ZpbGVdCi0Jc2V0IHQgIiIKLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcmVudAotCWlmIHskaWRpciAhPSAiIn0gewotCQlzZXQgdCBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAkcGFyZW50IC1pbml0aWFsZGlyICRpZGlyXQotCX0gZWxzZSB7Ci0JCXNldCB0IFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJlbnRdCi0JfQotCWlmIHskdCAhPSAiIn0gewotCQlzZXQgdWx0cmFfZHNtX2ZpbGUgJHQKLQl9Ci0JdXBkYXRlIAotfQotCi1wcm9jIHNldF9zc2hfa25vd25faG9zdHNfZmlsZSB7e3BhcmVudCAiLiJ9fSB7Ci0JZ2xvYmFsIHNzaF9rbm93bl9ob3N0c19maWxlbmFtZSBpc193aW5kb3dzIHVuYW1lCi0KLQlpZiB7JHNzaF9rbm93bl9ob3N0c19maWxlbmFtZSA9PSAiIn0gewotCQlzZXQgcGRpciBbZ2V0X3Byb2ZpbGVzX2Rpcl0KLQkJc2V0IHBkaXIgIiRwZGlyL3NzaF9rbm93bl9ob3N0cyIKLQkJY2F0Y2gge2ZpbGUgbWtkaXIgJHBkaXJ9Ci0KLQkJZ2xvYmFsIGxhc3RfbG9hZAotCQlpZiB7IVtpbmZvIGV4aXN0cyBsYXN0X2xvYWRdfSB7Ci0JCQlzZXQgbGFzdF9sb2FkICIiCi0JCX0KLQkJaWYgeyRsYXN0X2xvYWQgIT0gIiJ9IHsKLQkJCXNldCBkaXNwZiBbc3RyaW5nIHRyaW0gJGxhc3RfbG9hZF0KLQkJCXNldCBkaXNwZiBbZmlsZSB0YWlsICRkaXNwZl0KLQkJCQotCQkJcmVnc3ViIHtcLnZuYyR9ICRkaXNwZiAiIiBkaXNwZgotCQkJaWYgeyFbcmVnZXhwIHtcLmtub3duJH0gJGRpc3BmXX0gewotCQkJCXNldCBkaXNwZiAiJGRpc3BmLmtub3duIgotCQkJfQotCQkJc2V0IGd1ZXNzICRkaXNwZgotCQl9IGVsc2UgewotCQkJc2V0IHZuY2Rpc3AgW2dldF92bmNkaXNwbGF5XQotCQkJc2V0IGRpc3BmIFtzdHJpbmcgdHJpbSAkdm5jZGlzcF0KLQkJCWlmIHskZGlzcGYgIT0gIiJ9IHsKLQkJCQlyZWdzdWIge1sgCV0uKiR9ICRkaXNwZiAiIiBkaXNwZgotCQkJCXJlZ3N1YiAtYWxsIHsvfSAkZGlzcGYgIiIgZGlzcGYKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IGRpc3BmICJ1bmlxdWUtbmFtZS1oZXJlIgotCQkJfQotCQkJaWYgeyRpc193aW5kb3dzIHx8ICR1bmFtZSA9PSAiRGFyd2luIn0gewotCQkJCXJlZ3N1YiAtYWxsIHs6fSAkZGlzcGYgIi0iIGRpc3BmCi0JCQl9IGVsc2UgewotCQkJCXJlZ3N1YiAtYWxsIHs6fSAkZGlzcGYgIi0iIGRpc3BmCi0JCQl9Ci0JCQlpZiB7IVtyZWdleHAge1wua25vd24kfSAkZGlzcGZdfSB7Ci0JCQkJc2V0IGRpc3BmICIkZGlzcGYua25vd24iCi0JCQl9Ci0JCQlzZXQgZ3Vlc3MgJGRpc3BmCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgcGRpciBbZmlsZSBkaXJuYW1lICRzc2hfa25vd25faG9zdHNfZmlsZW5hbWVdCi0JCXNldCBndWVzcyBbZmlsZSB0YWlsICRzc2hfa25vd25faG9zdHNfZmlsZW5hbWVdCi0JfQotCi0Jc2V0IHQgIiIKLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcmVudAotCWlmIHskcGRpciAhPSAiIn0gewotCQlzZXQgdCBbdGtfZ2V0U2F2ZUZpbGUgLXBhcmVudCAkcGFyZW50IC1pbml0aWFsZGlyICRwZGlyIC1pbml0aWFsZmlsZSAkZ3Vlc3NdCi0JfSBlbHNlIHsKLQkJc2V0IHQgW3RrX2dldFNhdmVGaWxlIC1wYXJlbnQgJHBhcmVudCAtaW5pdGlhbGZpbGUgJGd1ZXNzXQotCX0KLQlpZiB7JHQgIT0gIiJ9IHsKLQkJc2V0IHNzaF9rbm93bl9ob3N0c19maWxlbmFtZSAkdAotCX0KLQl1cGRhdGUgCi19Ci0KLXByb2Mgc2hvd19jZXJ0IHtjcnR9IHsKLQlpZiB7JGNydCA9PSAiIn0gewotCQliZWxsCi0JCXJldHVybgotCX0KLQlpZiB7ISBbZmlsZSBleGlzdHMgJGNydF19IHsKLQkJYmVsbAotCQlyZXR1cm4KLQl9Ci0Jc2V0IGluZm8gIiIKLQljYXRjaCB7c2V0IGluZm8gW2dldF94NTA5X2luZm8gJGNydF19Ci0JaWYgeyRpbmZvID09ICIifSB7Ci0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IHcgLnNob3dfY2VydGlmaWNhdGUKLQl0b3BsZXYgJHcKLQlzY3JvbGxfdGV4dCAkdy5mCi0JYnV0dG9uICR3LmIgLXRleHQgRGlzbWlzcyAtY29tbWFuZCAiZGVzdHJveSAkdyIKLQliaW5kICR3IDxFc2NhcGU+ICJkZXN0cm95ICR3IgotCSR3LmYudCBpbnNlcnQgZW5kICRpbmZvCi0KLQlwYWNrICR3LmIgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrICR3LmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0JY2VudGVyX3dpbiAkdwotCWNhdGNoIHtyYWlzZSAkd30KLX0KLQotcHJvYyBzaG93X2NybCB7Y3JsfSB7Ci0JaWYgeyRjcmwgPT0gIiJ9IHsKLQkJYmVsbAotCQlyZXR1cm4KLQl9Ci0JaWYgeyEgW2ZpbGUgZXhpc3RzICRjcmxdfSB7Ci0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IGZsaXN0IFtsaXN0XQotCi0JaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJGNybF0gewotCQlmb3JlYWNoIGNmaWxlIFtnbG9iIC1ub2NvbXBsYWluIC1kaXJlY3RvcnkgJGNybCAiKiJdIHsKLQkJCWlmIFtmaWxlIGlzZmlsZSAkY2ZpbGVdIHsKLQkJCQlsYXBwZW5kIGZsaXN0ICRjZmlsZQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJbGFwcGVuZCBmbGlzdCAkY3JsCi0JfQotCi0Jc2V0IG9zc2wgW2dldF9vcGVuc3NsXQotCXNldCBpbmZvICIiCi0KLQlmb3JlYWNoIGNmaWxlICRmbGlzdCB7Ci0JCWNhdGNoIHsKLQkJCXNldCBwaCBbb3BlbiAifCAkb3NzbCBjcmwgLWZpbmdlcnByaW50IC10ZXh0IC1ub291dCAtaW4gXCIkY2ZpbGVcIiIgInIiXQotCQkJd2hpbGUge1tnZXRzICRwaCBsaW5lXSA+IC0xfSB7Ci0JCQkJYXBwZW5kIGluZm8gIiRsaW5lXG4iCi0JCQl9Ci0JCQljbG9zZSAkcGgKLQkJCWFwcGVuZCBpbmZvICJcbiIKLQkJfQotCX0KLQotCXNldCB3IC5zaG93X2NybAotCXRvcGxldiAkdwotCXNjcm9sbF90ZXh0ICR3LmYKLQlidXR0b24gJHcuYiAtdGV4dCBEaXNtaXNzIC1jb21tYW5kICJkZXN0cm95ICR3IgotCWJpbmQgJHcgPEVzY2FwZT4gImRlc3Ryb3kgJHciCi0JJHcuZi50IGluc2VydCBlbmQgJGluZm8KLQotCXBhY2sgJHcuYiAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgJHcuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQljZW50ZXJfd2luICR3Ci0JY2F0Y2gge3JhaXNlICR3fQotfQotCi1wcm9jIHZfc3ZjZXJ0IHt9IHsKLQlnbG9iYWwgc3ZjZXJ0Ci0JaWYgeyRzdmNlcnQgPT0gIiIgfHwgISBbZmlsZSBleGlzdHMgJHN2Y2VydF19IHsKLQkJY2F0Y2ggey5jLnN2Y2VydC5pIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JfSBlbHNlIHsKLQkJY2F0Y2ggey5jLnN2Y2VydC5pIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCX0KLQlub19jZXJ0c190dXRvcmlhbF9tZXNnCi0JcmV0dXJuIDEKLX0KLQotcHJvYyB2X215Y2VydCB7fSB7Ci0JZ2xvYmFsIG15Y2VydAotCWlmIHskbXljZXJ0ID09ICIiIHx8ICEgW2ZpbGUgZXhpc3RzICRteWNlcnRdfSB7Ci0JCWNhdGNoIHsuYy5teWNlcnQuaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHsuYy5teWNlcnQuaSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQl9Ci0JcmV0dXJuIDEKLX0KLQotcHJvYyB2X2NybGZpbCB7fSB7Ci0JZ2xvYmFsIGNybGZpbAotCWlmIHskY3JsZmlsID09ICIiIHx8ICEgW2ZpbGUgZXhpc3RzICRjcmxmaWxdfSB7Ci0JCWNhdGNoIHsuYy5jcmxmaWwuaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHsuYy5jcmxmaWwuaSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQl9Ci0JcmV0dXJuIDEKLX0KLQotcHJvYyBzaG93X215Y2VydCB7fSB7Ci0JZ2xvYmFsIG15Y2VydAotCXNob3dfY2VydCAkbXljZXJ0Ci19Ci0KLXByb2Mgc2hvd19zdmNlcnQge30gewotCWdsb2JhbCBzdmNlcnQKLQlzaG93X2NlcnQgJHN2Y2VydAotfQotCi1wcm9jIHNob3dfY3JsZmlsIHt9IHsKLQlnbG9iYWwgY3JsZmlsCi0Jc2hvd19jcmwgJGNybGZpbAotfQotCi1wcm9jIHNldF9zdmNlcnQge3twYXJlbnQgIi4ifX0gewotCWdsb2JhbCBzdmNlcnQgY3J0ZGlyCi0Jc2V0IGlkaXIgW2dldF9pZGlyX2NlcnRzICRzdmNlcnRdCi0Jc2V0IHQgIiIKLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcmVudAotCWlmIHskaWRpciAhPSAiIn0gewotCQlzZXQgdCBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAkcGFyZW50IC1pbml0aWFsZGlyICRpZGlyXQotCX0gZWxzZSB7Ci0JCXNldCB0IFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJlbnRdCi0JfQotCWlmIHskdCAhPSAiIn0gewotCQlzZXQgY3J0ZGlyICIiCi0JCXNldCBzdmNlcnQgJHQKLQl9Ci0JY2F0Y2gge3dtIGRlaWNvbmlmeSAuY30KLQl2X3N2Y2VydAotCXVwZGF0ZQotfQotCi1wcm9jIHNldF9jcnRkaXIge3twYXJlbnQgIi4ifX0gewotCWdsb2JhbCBzdmNlcnQgY3J0ZGlyCi0Jc2V0IGlkaXIgIiIKLQlpZiB7JGNydGRpciA9PSAiQUNDRVBURURfQ0VSVFMifSB7Ci0JCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQl9IGVsc2UgewotCQlzZXQgaWRpciBbZ2V0X2lkaXJfY2VydHMgJGNydGRpcl0KLQl9Ci0Jc2V0IHQgIiIKLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcmVudAotCWlmIHskaWRpciAhPSAiIn0gewotCQlzZXQgdCBbdGtfY2hvb3NlRGlyZWN0b3J5IC1wYXJlbnQgJHBhcmVudCAtaW5pdGlhbGRpciAkaWRpcl0KLQl9IGVsc2UgewotCQlzZXQgdCBbdGtfY2hvb3NlRGlyZWN0b3J5IC1wYXJlbnQgJHBhcmVudF0KLQl9Ci0JaWYgeyR0ICE9ICIifSB7Ci0JCXNldCBzdmNlcnQgIiIKLQkJc2V0IGNydGRpciAkdAotCX0KLQljYXRjaCB7d20gZGVpY29uaWZ5IC5jfQotCXVwZGF0ZQotfQotCi1wcm9jIHNldF9jcmVhdGVjZXJ0X2ZpbGUge30gewotCWdsb2JhbCBjY2VydAotCWlmIHtbaW5mbyBleGlzdHMgY2NlcnQoRklMRSldfSB7Ci0JCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAkY2NlcnQoRklMRSldCi0JfQotCXVuaXhfZGlhbG9nX3Jlc2l6ZSAuY2NydCAKLQlpZiB7JGlkaXIgIT0gIiJ9IHsKLQkJc2V0IHQgW3RrX2dldFNhdmVGaWxlIC1wYXJlbnQgLmNjcnQgLWRlZmF1bHRleHRlbnNpb24gIi5wZW0iIC1pbml0aWFsZGlyICRpZGlyXQotCX0gZWxzZSB7Ci0JCXNldCB0IFt0a19nZXRTYXZlRmlsZSAtcGFyZW50IC5jY3J0IC1kZWZhdWx0ZXh0ZW5zaW9uICIucGVtIl0KLQl9Ci0JaWYgeyR0ICE9ICIifSB7Ci0JCXNldCBjY2VydChGSUxFKSAkdAotCX0KLQljYXRjaCB7cmFpc2UgLmNjcnR9Ci0JdXBkYXRlCi19Ci0KLXByb2MgY2hlY2tfcHAge30gewotCWdsb2JhbCBjY2VydAotCWlmIHskY2NlcnQoRU5DKX0gewotCQljYXRjaCB7LmNjcnQucGYuZSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJY2F0Y2gge2ZvY3VzIC5jY3J0LnBmLmV9Ci0JCWNhdGNoIHsuY2NydC5wZi5lIGljdXJzb3IgZW5kfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHsuY2NydC5wZi5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JfQotfQotCi1wcm9jIGdldF9vcGVuc3NsIHt9IHsKLQlnbG9iYWwgaXNfd2luZG93cwotCWlmIHskaXNfd2luZG93c30gewotCQlzZXQgb3NzbCAib3BlbnNzbC5leGUiCi0JfSBlbHNlIHsKLQkJc2V0IG9zc2wgIm9wZW5zc2wiCi0JfQotfQotCi1wcm9jIGdldF94NTA5X2luZm8ge2NydH0gewotCXNldCBvc3NsIFtnZXRfb3BlbnNzbF0KLQlzZXQgaW5mbyAiIgotCXVwZGF0ZQotCXNldCBwaCBbb3BlbiAifCAkb3NzbCB4NTA5IC10ZXh0IC1maW5nZXJwcmludCAtaW4gXCIkY3J0XCIiICJyIl0KLQl3aGlsZSB7W2dldHMgJHBoIGxpbmVdID4gLTF9IHsKLQkJYXBwZW5kIGluZm8gIiRsaW5lXG4iCi0JfQotCWNsb3NlICRwaAotCXJldHVybiAkaW5mbwotfQotCi1wcm9jIGRvX29zc19jcmVhdGUge30gewotCWdsb2JhbCBpc193aW5kb3dzIGlzX3dpbjl4Ci0KLQlzZXQgY2ZnIHsKLVsgcmVxIF0KLWRlZmF1bHRfYml0cyAgICAgICAgICAgID0gMjA0OAotZW5jcnlwdF9rZXkgICAgICAgICAgICAgPSB5ZXMKLWRpc3Rpbmd1aXNoZWRfbmFtZSAgICAgID0gcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZQotCi1bIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQotY291bnRyeU5hbWUgICAgICAgICAgICAgICAgICAgICA9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKLWNvdW50cnlOYW1lX2RlZmF1bHQgICAgICAgICAgICAgPSAlQ08KLWNvdW50cnlOYW1lX21pbiAgICAgICAgICAgICAgICAgPSAyCi1jb3VudHJ5TmFtZV9tYXggICAgICAgICAgICAgICAgID0gMgotCi1zdGF0ZU9yUHJvdmluY2VOYW1lICAgICAgICAgICAgID0gU3RhdGUgb3IgUHJvdmluY2UgTmFtZSAoZnVsbCBuYW1lKQotc3RhdGVPclByb3ZpbmNlTmFtZV9kZWZhdWx0ICAgICA9ICVTVAotCi1sb2NhbGl0eU5hbWUgICAgICAgICAgICAgICAgICAgID0gTG9jYWxpdHkgTmFtZSAoZWcsIGNpdHkpCi1sb2NhbGl0eU5hbWVfZGVmYXVsdCAgICAgICAgICAgID0gJUxPQwotCi0wLm9yZ2FuaXphdGlvbk5hbWUgICAgICAgICAgICAgID0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQotMC5vcmdhbml6YXRpb25OYW1lX2RlZmF1bHQgICAgICA9ICVPTgotCi1vcmdhbml6YXRpb25hbFVuaXROYW1lICAgICAgICAgID0gT3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikKLW9yZ2FuaXphdGlvbmFsVW5pdE5hbWVfZGVmYXVsdCAgPSAlT1VOCi0KLWNvbW1vbk5hbWUgICAgICAgICAgICAgICAgICAgICAgPSBDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSkKLWNvbW1vbk5hbWVfZGVmYXVsdCAgICAgICAgICAgICAgPSAlQ04KLWNvbW1vbk5hbWVfbWF4ICAgICAgICAgICAgICAgICAgPSA2NAotCi1lbWFpbEFkZHJlc3MgICAgICAgICAgICAgICAgICAgID0gRW1haWwgQWRkcmVzcwotZW1haWxBZGRyZXNzX2RlZmF1bHQgICAgICAgICAgICA9ICVFTQotZW1haWxBZGRyZXNzX21heCAgICAgICAgICAgICAgICA9IDY0Ci19Ci0KLQlnbG9iYWwgY2NlcnQKLQotCWlmIHskY2NlcnQoRklMRSkgPT0gIiJ9IHsKLQkJY2F0Y2gge2Rlc3Ryb3kgLmN9Ci0JCW1lc2cgIk5vIG91dHB1dCBjZXJ0IGZpbGUgc3VwcGxpZWQiCi0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCWlmIHshIFtyZWdleHAge1wucGVtJH0gJGNjZXJ0KEZJTEUpXX0gewotCQlhcHBlbmQgY2NlcnQoRklMRSkgIi5wZW0iCi0JfQotCXNldCBwZW0gJGNjZXJ0KEZJTEUpCi0JcmVnc3ViIHtcLnBlbSR9ICRjY2VydChGSUxFKSAiLmNydCIgY3J0Ci0KLQlpZiB7JGNjZXJ0KEVOQyl9IHsKLQkJaWYge1tzdHJpbmcgbGVuZ3RoICRjY2VydChQQVNTKV0gPCA0fSB7Ci0JCQljYXRjaCB7ZGVzdHJveSAuY30KLQkJCW1lc2cgIlBhc3NwaHJhc2UgbXVzdCBiZSBhdCBsZWFzdCA0IGNoYXJhY3RlcnMgbG9uZy4iCi0JCQliZWxsCi0JCQlyZXR1cm4KLQkJfQotCX0KLQlpZiB7W3N0cmluZyBsZW5ndGggJGNjZXJ0KENPKV0gIT0gMn0gewotCQljYXRjaCB7ZGVzdHJveSAuY30KLQkJbWVzZyAiQ291bnRyeSBOYW1lIG11c3QgYmUgYXQgZXhhY3RseSAyIGNoYXJhY3RlcnMgbG9uZy4iCi0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCWlmIHtbc3RyaW5nIGxlbmd0aCAkY2NlcnQoQ04pXSA+IDY0fSB7Ci0JCWNhdGNoIHtkZXN0cm95IC5jfQotCQltZXNnICJDb21tb24gTmFtZSBtdXN0IGJlIGxlc3MgdGhhbiA2NSBjaGFyYWN0ZXJzIGxvbmcuIgotCQliZWxsCi0JCXJldHVybgotCX0KLQlpZiB7W3N0cmluZyBsZW5ndGggJGNjZXJ0KEVNKV0gPiA2NH0gewotCQljYXRjaCB7ZGVzdHJveSAuY30KLQkJbWVzZyAiRW1haWwgQWRkcmVzcyBtdXN0IGJlIGxlc3MgdGhhbiA2NSBjaGFyYWN0ZXJzIGxvbmcuIgotCQliZWxsCi0JCXJldHVybgotCX0KLQkJCi0JZm9yZWFjaCB0IHtFTSBDTiBPVU4gT04gTE9DIFNUIENPfSB7Ci0KLQkJc2V0IHZhbCAkY2NlcnQoJHQpCi0JCWlmIHskdmFsID09ICIifSB7Ci0JCQlzZXQgdmFsICJub25lIgotCQl9Ci0JCXJlZ3N1YiAiJSR0IiAkY2ZnICIkdmFsIiBjZmcKLQl9Ci0KLQlnbG9iYWwgaXNfd2luZG93cwotCi0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCSMgVkYKLQkJc2V0IHRtcCAiY2VydC5jZmciCi0JfSBlbHNlIHsKLQkJc2V0IHRtcCAiL3RtcC9jZXJ0LmNmZy5bdHBpZF0iCi0JCXNldCB0bXAgW215dG1wICR0bXBdCi0JCWNhdGNoIHtzZXQgZmggW29wZW4gJHRtcCAidyJdfQotCQljYXRjaCB7ZXhlYyBjaG1vZCA2MDAgJHRtcH0KLQkJaWYgeyEgW2ZpbGUgZXhpc3RzICR0bXBdfSB7Ci0JCQljYXRjaCB7ZGVzdHJveSAuY30KLQkJCW1lc2cgImNhbm5vdCBjcmVhdGU6ICR0bXAiCi0JCQliZWxsCi0JCQlyZXR1cm4KLQkJfQotCX0KLQlzZXQgZmggIiIKLQljYXRjaCB7c2V0IGZoIFtvcGVuICR0bXAgInciXX0KLQlpZiB7JGZoID09ICIifSB7Ci0JCWNhdGNoIHtkZXN0cm95IC5jfQotCQltZXNnICJjYW5ub3QgY3JlYXRlOiAkdG1wIgotCQliZWxsCi0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkdG1wfQotCQlyZXR1cm4KLQl9Ci0KLQlwdXRzICRmaCAkY2ZnCi0JY2xvc2UgJGZoCi0KLQlzZXQgb3NzbCBbZ2V0X29wZW5zc2xdCi0KLQlzZXQgY21kICIkb3NzbCByZXEgLWNvbmZpZyAkdG1wIC1ub2RlcyAtbmV3IC1uZXdrZXkgcnNhOjIwNDggLXg1MDkgLWJhdGNoIgotCWlmIHskY2NlcnQoREFZUykgIT0gIiJ9IHsKLQkJc2V0IGNtZCAiJGNtZCAtZGF5cyAkY2NlcnQoREFZUykiCi0JfQotCWlmIHskaXNfd2luZG93c30gewotCQlzZXQgY21kICIkY21kIC1rZXlvdXQgeyRwZW19IC1vdXQgeyRjcnR9IgotCX0gZWxzZSB7Ci0JCXNldCBjbWQgIiRjbWQgLWtleW91dCBcIiRwZW1cIiAtb3V0IFwiJGNydFwiIgotCX0KLQotCWlmIHskaXNfd2luZG93c30gewotCQlzZXQgZW1lc3MgIiIKLQkJaWYgeyRpc193aW45eH0gewotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRwZW19Ci0JCQljYXRjaCB7ZmlsZSBkZWxldGUgJGNydH0KLQkJCXVwZGF0ZQotCQkJZXZhbCBleGVjICRjbWQgJgotCQkJY2F0Y2gge3JhaXNlIC59Ci0JCQlzZXQgc2wgMAotCQkJc2V0IG1heCAxMDAKLQkJCSNpZiB7JGNjZXJ0KEVOQyl9IHsKLQkJCSMJc2V0IG1heCAxMDAKLQkJCSN9Ci0JCQlzZXQgbWF4bXMgW2V4cHIgJG1heCAqIDEwMDBdCi0JCQl3aGlsZSB7JHNsIDwgJG1heG1zfSB7Ci0JCQkJc2V0IHMyIFtleHByICRzbCAvIDEwMDBdCi0JCQkJbWVzZyAicnVubmluZyBvcGVuc3NsIC4uLiAkczIvJG1heCIKLQkJCQlpZiB7W2ZpbGUgZXhpc3RzICRwZW1dICYmIFtmaWxlIGV4aXN0cyAkY3J0XX0gewotCQkJCQlhZnRlciAyMDAwCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJCWFmdGVyIDUwMAotCQkJCXNldCBzbCBbZXhwciAkc2wgKyA1MDBdCi0JCQl9Ci0JCQltZXNnICIiCi0JCX0gZWxzZSB7Ci0JCQl1cGRhdGUKLQkJCXNldCByYyBbY2F0Y2gge2V2YWwgZXhlYyAkY21kfSBlbWVzc10KLQkJCWlmIHskcmMgIT0gMCAmJiBbcmVnZXhwIC1ub2Nhc2Uge2Vycm9yOn0gJGVtZXNzXX0gewotCQkJCXJhaXNlIC4KLQkJCQl0a19tZXNzYWdlQm94IC10eXBlIG9rIC1pY29uIGVycm9yIC1tZXNzYWdlICRlbWVzcyAtdGl0bGUgIk9wZW5TU0wgcmVxIGNvbW1hbmQgZmFpbGVkIgotCQkJCXJldHVybgotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJc2V0IGdlb21ldHJ5IFt4dGVybV9jZW50ZXJfZ2VvbWV0cnldCi0JCXVwZGF0ZQotCQl1bml4X3Rlcm1pbmFsX2NtZCAkZ2VvbWV0cnkgIlJ1bm5pbmcgT3BlblNTTCIgIiRjbWQiCi0JCWNhdGNoIHtmaWxlIGF0dHJpYnV0ZXMgJHBlbSAtcGVybWlzc2lvbnMgZ28tcnd9Ci0JCWNhdGNoIHtmaWxlIGF0dHJpYnV0ZXMgJGNydCAtcGVybWlzc2lvbnMgZ28td30KLQl9Ci0JY2F0Y2gge2ZpbGUgZGVsZXRlICR0bXB9Ci0KLQlzZXQgYmFkICIiCi0JaWYgeyEgW2ZpbGUgZXhpc3RzICRwZW1dfSB7Ci0JCXNldCBiYWQgIiRwZW0gIgotCX0KLQlpZiB7ISBbZmlsZSBleGlzdHMgJGNydF19IHsKLQkJc2V0IGJhZCAiJGNydCIKLQl9Ci0JaWYgeyRiYWQgIT0gIiJ9IHsKLQkJcmFpc2UgLgotCQl0a19tZXNzYWdlQm94IC10eXBlIG9rIC1pY29uIGVycm9yIC1tZXNzYWdlICJOb3QgY3JlYXRlZDogJGJhZCIgLXRpdGxlICJPcGVuU1NMIGNvdWxkIG5vdCBjcmVhdGUgY2VydCIKLQkJY2F0Y2gge3JhaXNlIC5jfQotCQlyZXR1cm4KLQl9Ci0KLQlpZiB7JGNjZXJ0KEVOQykgJiYgJGNjZXJ0KFBBU1MpICE9ICIifSB7Ci0JCXNldCBjbWQgIiRvc3NsIHJzYSAtaW4gXCIkcGVtXCIgLWRlczMgLW91dCBcIiRwZW1cIiAtcGFzc291dCBzdGRpbiIKLQkJc2V0IHBoICIiCi0JCXNldCBlbWVzcyAiIgotCQl1cGRhdGUKLQkJc2V0IHJjIFtjYXRjaCB7c2V0IHBoIFtvcGVuICJ8ICRjbWQiICJ3Il19IGVtZXNzXQotCQlpZiB7JHJjICE9IDAgfHwgJHBoID09ICIifSB7Ci0JCQlyYWlzZSAuCi0JCQl0a19tZXNzYWdlQm94IC10eXBlIG9rIC1pY29uIGVycm9yIC1tZXNzYWdlICRlbWVzcyAtdGl0bGUgIkNvdWxkIG5vdCBlbmNyeXB0IHByaXZhdGUga2V5IgotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRwZW19Ci0JCQljYXRjaCB7ZmlsZSBkZWxldGUgJGNydH0KLQkJCXJldHVybgotCQl9Ci0JCXB1dHMgJHBoICRjY2VydChQQVNTKQotCQlzZXQgZW1lc3MgIiIKLQkJc2V0IHJjIFtjYXRjaCB7Y2xvc2UgJHBofSBlbWVzc10KLQkJI3B1dHMgJGVtZXNzCi0JCSNwdXRzICRyYwotCX0KLQotCXNldCBpbiAgW29wZW4gJGNydCAiciJdCi0Jc2V0IG91dCBbb3BlbiAkcGVtICJhIl0KLQl3aGlsZSB7W2dldHMgJGluIGxpbmVdID4gLTF9IHsKLQkJcHV0cyAkb3V0ICRsaW5lCi0JfQotCWNsb3NlICRpbgotCWNsb3NlICRvdXQKLQotCWNhdGNoIHtyYWlzZSAuY30KLQlzZXQgcCAuCi0JaWYgW3dpbmZvIGV4aXN0cyAuY10gewotCQlzZXQgcCAuYwotCX0KLQkKLQlzZXQgcmVwbHkgW3RrX21lc3NhZ2VCb3ggLXBhcmVudCAkcCAtdHlwZSB5ZXNubyAtdGl0bGUgIlZpZXcgQ2VydCIgLW1lc3NhZ2UgIlZpZXcgQ2VydGlmaWNhdGUgYW5kIEluZm8/Il0KLQljYXRjaCB7cmFpc2UgLmN9Ci0JaWYgeyRyZXBseSA9PSAieWVzIn0gewotCQlzZXQgdyAudmlld19jZXJ0Ci0JCXRvcGxldiAkdwotCQlzY3JvbGxfdGV4dCAkdy5mCi0JCXNldCBjZXJ0ICIiCi0JCXNldCBmaCAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICRjcnQgInIiXX0KLQkJaWYgeyRmaCAhPSAiIn0gewotCQkJd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7Ci0JCQkJYXBwZW5kIGNlcnQgIiRsaW5lXG4iCi0JCQl9Ci0JCQljYXRjaCB7Y2xvc2UgJGZofQotCQl9Ci0KLQkJZ2xvYmFsIHllZ2cKLQkJc2V0IHllZ2cgIiIKLQkJYnV0dG9uICR3LmIgLXRleHQgRGlzbWlzcyAtY29tbWFuZCAiZGVzdHJveSAkdzsgc2V0IHllZ2cgMSIKLQkJcGFjayAkdy5iIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JCWJpbmQgJHcgPEVzY2FwZT4gImRlc3Ryb3kgJHc7IHNldCB5ZWdnIDEiCi0JCQotCQkkdy5mLnQgaW5zZXJ0IGVuZCAiXG4iCi0JCSR3LmYudCBpbnNlcnQgZW5kICIkY3J0OlxuIgotCQkkdy5mLnQgaW5zZXJ0IGVuZCAiXG4iCi0JCSR3LmYudCBpbnNlcnQgZW5kICRjZXJ0Ci0JCSR3LmYudCBpbnNlcnQgZW5kICJcbiIKLQotCQlzZXQgaW5mbyBbZ2V0X3g1MDlfaW5mbyAkY3J0XQotCQkkdy5mLnQgaW5zZXJ0IGVuZCAkaW5mbwotCi0JCXBhY2sgJHcuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQkJY2VudGVyX3dpbiAkdwotCQljYXRjaCB7cmFpc2UgJHd9Ci0JCXZ3YWl0IHllZ2cKLQkJY2F0Y2gge3JhaXNlIC5jfQotCX0KLQotCXNldCBwIC4KLQlpZiBbd2luZm8gZXhpc3RzIC5jXSB7Ci0JCXNldCBwIC5jCi0JfQotCXNldCByZXBseSBbdGtfbWVzc2FnZUJveCAtcGFyZW50ICRwIC10eXBlIHllc25vIC10aXRsZSAiVmlldyBQcml2YXRlIEtleSIgLW1lc3NhZ2UgIlZpZXcgUHJpdmF0ZSBLZXk/Il0KLQljYXRjaCB7cmFpc2UgLmN9Ci0JaWYgeyRyZXBseSA9PSAieWVzIn0gewotCQlzZXQgdyAudmlld19rZXkKLQkJdG9wbGV2ICR3Ci0JCXNjcm9sbF90ZXh0ICR3LmYKLQkJc2V0IGtleSAiIgotCQlzZXQgZmggW29wZW4gJHBlbSAiciJdCi0JCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJYXBwZW5kIGtleSAiJGxpbmVcbiIKLQkJfQotCQljbG9zZSAkZmgKLQotCQlnbG9iYWwgeWVnZwotCQlzZXQgeWVnZyAiIgotCQlidXR0b24gJHcuYiAtdGV4dCBEaXNtaXNzIC1jb21tYW5kICJkZXN0cm95ICR3OyBzZXQgeWVnZyAxIgotCQlwYWNrICR3LmIgLXNpZGUgYm90dG9tIC1maWxsIHgKLQkJYmluZCAkdyA8RXNjYXBlPiAiZGVzdHJveSAkdzsgc2V0IHllZ2cgMSIKLQkJCi0JCSR3LmYudCBpbnNlcnQgZW5kICJcbiIKLQkJJHcuZi50IGluc2VydCBlbmQgIiRwZW06XG4iCi0JCSR3LmYudCBpbnNlcnQgZW5kICJcbiIKLQkJJHcuZi50IGluc2VydCBlbmQgJGtleQotCQkkdy5mLnQgaW5zZXJ0IGVuZCAiXG4iCi0KLQkJcGFjayAkdy5mIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQotCQljZW50ZXJfd2luICR3Ci0JCWNhdGNoIHtyYWlzZSAkd30KLQkJdndhaXQgeWVnZwotCQljYXRjaCB7cmFpc2UgLmN9Ci0JfQotfQotCQotcHJvYyBjcmVhdGVfY2VydCB7e25hbWUgIiJ9fSB7Ci0KLQl0b3BsZXYgLmNjcnQKLQl3bSB0aXRsZSAuY2NydCAiQ3JlYXRlIFNTTCBDZXJ0aWZpY2F0ZSIKLQotCWdsb2JhbCB1bmFtZQotCXNldCBoIDI3Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxNAotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMjAKLQl9Ci0Jc2Nyb2xsX3RleHQgLmNjcnQuZiA4MCAkaAotCi0Jc2V0IG1zZyB7Ci0gICAgVGhpcyBkaWFsb2cgaGVscHMgeW91IHRvIGNyZWF0ZSBhIHNpbXBsZSBTZWxmLVNpZ25lZCBTU0wgY2VydGlmaWNhdGUuICAKLQotICAgIE9uIFVuaXggdGhlIG9wZW5zc2woMSkgcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZCBhbmQgaW4gJFBBVEguCi0gICAgT24gV2luZG93cywgYSBjb3B5IG9mIHRoZSBvcGVuc3NsIHByb2dyYW0gaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLgotCi0gICAgVGhlIHJlc3VsdGluZyBjZXJ0aWZpY2F0ZSBmaWxlcyBjYW4gYmUgdXNlZCBmb3IgZWl0aGVyOgotCi0gICAgICAgMSkgYXV0aGVudGljYXRpbmcgeW91cnNlbGYgKFZOQyBWaWV3ZXIpIHRvIGEgVk5DIFNlcnZlcgotICAgIG9yIDIpIHlvdXIgdmVyaWZ5aW5nIHRoZSBpZGVudGl0eSBvZiBhIHJlbW90ZSBWTkMgU2VydmVyLgotCi0gICAgSW4gZWl0aGVyIGNhc2UgeW91IHdpbGwgbmVlZCB0byBzYWZlbHkgY29weSBvbmUgb2YgdGhlIGdlbmVyYXRlZCBrZXkgb3IKLSAgICBjZXJ0aWZpY2F0ZSBmaWxlcyB0byB0aGUgcmVtb3RlIFZOQyBTZXJ2ZXIgYW5kIGhhdmUgdGhlIFZOQyBTZXJ2ZXIgdXNlCi0gICAgaXQuICBPciB5b3UgY291bGQgc2VuZCBpdCB0byB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3Igb2YgdGhlIFZOQyBTZXJ2ZXIuCi0KLSAgICBGb3IgdGhlIHB1cnBvc2Ugb2YgZGVzY3JpcHRpb24sIGFzc3VtZSB0aGF0IHRoZSBmaWxlbmFtZSBzZWxlY3RlZCBpbiB0aGUKLSAgICAiU2F2ZSB0byBmaWxlIiBlbnRyeSBpcyAidm5jY2VydC5wZW0iLiAgVGhhdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkCi0gICAgYnkgdGhpcyBwcm9jZXNzIGFuZCBzbyB3aWxsIHRoZSAidm5jY2VydC5jcnQiIGZpbGUuICAidm5jY2VydC5wZW0iCi0gICAgY29udGFpbnMgYm90aCB0aGUgUHJpdmF0ZSBLZXkgYW5kIHRoZSBQdWJsaWMgQ2VydGlmaWNhdGUuICAidm5jY2VydC5jcnQiCi0gICAgb25seSBjb250YWlucyB0aGUgUHVibGljIENlcnRpZmljYXRlLgotCi0gICAgRm9yIGNhc2UgMSkgeW91IHdvdWxkIGNvcHkgInZuY2NlcnQuY3J0IiB0byB0aGUgVk5DIFNlcnZlciBzaWRlIGFuZCAKLSAgICBpbnN0cnVjdCB0aGUgc2VydmVyIHRvIHVzZSBpdC4gIEZvciB4MTF2bmMgaXQgd291bGQgYmUgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgeDExdm5jIC1zc2x2ZXJpZnkgL3BhdGgvdG8vdm5jY2VydC5jcnQgLXNzbCBTQVZFIC4uLgotCi0gICAgKGl0IGlzIGFsc28gcG9zc2libGUgdG8gaGFuZGxlIG1hbnkgY2xpZW50IGNlcnRzIGF0IG9uY2UgaW4gYSBkaXJlY3RvcnksCi0gICAgc2VlIHRoZSAtc3NsdmVyaWZ5IGRvY3VtZW50YXRpb24pLiAgVGhlbiB5b3Ugd291bGQgdXNlICJ2bmNjZXJ0LnBlbSIKLSAgICBhcyB0aGUgTXlDZXJ0IGVudHJ5IGluIHRoZSBTU0wgQ2VydGlmaWNhdGVzIGRpYWxvZy4KLQotICAgIEZvciBjYXNlIDIpIHlvdSB3b3VsZCBjb3B5ICJ2bmNjZXJ0LnBlbSIgdG8gdGhlIFZOQyBTZXJ2ZXIgc2lkZSBhbmQgCi0gICAgaW5zdHJ1Y3QgdGhlIHNlcnZlciB0byB1c2UgaXQuICBGb3IgeDExdm5jIGl0IHdvdWxkIGJlIGZvciBleGFtcGxlOgotCi0gICAgICAgIHgxMXZuYyAtc3NsIC9wYXRoL3RvL3ZuY2NlcnQucGVtCi0KLSAgICBUaGVuIHlvdSB3b3VsZCB1c2UgInZuY2NlcnQuY3J0IiBhcyB0aGUgYXMgdGhlIFNlcnZlckNlcnQgZW50cnkgaW4gdGhlCi0gICAgIlNTTCBDZXJ0aWZpY2F0ZXMiIGRpYWxvZy4KLQotCi0gICAgQ3JlYXRpbmcgdGhlIENlcnRpZmljYXRlOgotICAgIAotICAgIENob29zZSBhIG91dHB1dCBmaWxlbmFtZSAoZW5kaW5nIGluIC5wZW0pIGluIHRoZSAiU2F2ZSB0byBmaWxlIiBlbnRyeS4KLQotICAgIFRoZW4gZmlsbCBpbiB0aGUgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gKENvdW50cnksIFN0YXRlIG9yIFByb3ZpbmNlLAotICAgIGV0YykuCi0KLSAgICBUaGUgY2xpY2sgb24gIkNyZWF0ZSIgdG8gZ2VuZXJhdGUgdGhlIGNlcnRpZmljYXRlIGZpbGVzLgotCi0gICAgRW5jcnlwdGluZyB0aGUgUHJpdmF0ZSBLZXk6ICBJdCBpcyBhIHZlcnkgZ29vZCBpZGVhIHRvIGVuY3J5cHQgdGhlCi0gICAgUHJpdmF0ZSBLZXkgdGhhdCBnb2VzIGluIHRoZSAidm5jY2VydC5wZW0iLiAgVGhlIGRvd25zaWRlIGlzIHRoYXQKLSAgICB3aGVuZXZlciB0aGF0IGtleSBpcyB1c2VkIChlLmcuIHN0YXJ0aW5nIHVwIHgxMXZuYyB1c2luZyBpdCkgdGhlbgotICAgIHRoZSBwYXNzcGhyYXNlIHdpbGwgbmVlZCB0byBiZSBjcmVhdGVkLiAgSWYgeW91IGRvIG5vdCBlbmNyeXB0IGl0IGFuZAotICAgIHNvbWVib2R5IHN0ZWFscyBhIGNvcHkgb2YgdGhlICJ2bmNjZXJ0LnBlbSIgZmlsZSB0aGVuIHRoZXkgY2FuIHByZXRlbmQKLSAgICB0byBiZSB5b3UuCi0KLSAgICBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlcywgeW91IG11c3QgY29weSBhbmQgaW1wb3J0Ci0gICAgZWl0aGVyICJ2bmNjZXJ0LnBlbSIgb3IgInZuY2NlcnQucGVtIiB0byB0aGUgcmVtb3RlIFZOQyBTZXJ2ZXIgYW5kCi0gICAgYWxzbyBzZWxlY3QgdGhlIG90aGVyIGZpbGUgaW4gdGhlICJTU0wgQ2VydGlmaWNhdGVzIiBkaWFsb2cuCi0gICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBhYm92ZS4KLQotICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKLQotICAgICAgICAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3NzbC5odG1sCi0gICAgICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC10dW5uZWwtaW50Ci0KLSAgICBUaGUgZmlyc3Qgb25lIGRlc2NyaWJlcyBob3cgdG8gdXNlIHgxMXZuYyB0byBjcmVhdGUgQ2VydGlmaWNhdGUKLSAgICBBdXRob3JpdHkgKENBKSBjZXJ0aWZpY2F0ZXMgaW4gYWRkaXRpb24gdG8gU2VsZi1TaWduZWQgb25lcy4KLQotCi0gICAgVGlwOiBpZiB5b3UgY2hvb3NlIHRoZSAiQ29tbW9uIE5hbWUiIHRvIGJlIHRoZSBpbnRlcm5ldCBob3N0bmFtZQotICAgIChlLmcuIGdhdGV3YXkubXlkb21haW4uY29tKSB0aGF0IGNvbm5lY3Rpb25zIHdpbGwgYmUgbWFkZSB0byBvcgotICAgIGZyb20gdGhhdCB3aWxsIGF2b2lkIG1hbnkgZGlhbG9ncyB3aGVuIGNvbm5lY3RpbmcgbWVudGlvbmluZyB0aGF0Ci0gICAgdGhlIGhvc3RuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBDb21tb24gTmFtZS4KLX0KLQkuY2NydC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlnbG9iYWwgY2NlcnQgY2NlcnRfaW5pdCB0Y2VydAotCi0KLQlpZiB7ISBbaW5mbyBleGlzdHMgY2NlcnRfaW5pdF19IHsKLQkJc2V0IGNjZXJ0X2luaXQgMQotCQlzZXQgY2NlcnQoQ08pICJVUyIKLQkJc2V0IGNjZXJ0KFNUKSAiTWFzc2FjaHVzZXR0cyIKLQkJc2V0IGNjZXJ0KExPQykgIkJvc3RvbiIKLQkJc2V0IGNjZXJ0KE9OKSAiTXkgQ29tcGFueSIKLQkJc2V0IGNjZXJ0KE9VTikgIlByb2R1Y3QgRGV2ZWxvcG1lbnQiCi0JCXNldCBjY2VydChDTikgInd3dy5ub3doZXJlLm5vbmUiCi0JCXNldCBjY2VydChFTSkgImFkbWluQG5vd2hlcmUubm9uZSIKLQkJc2V0IGNjZXJ0KERBWVMpICI3MzAiCi0JCXNldCBjY2VydChGSUxFKSAiIgotCX0KLQotCXNldCBjY2VydChFTkMpIDAKLQlzZXQgY2NlcnQoUEFTUykgIiIKLQkJCi0Jc2V0IHRjZXJ0KENPKSAiQ291bnRyeSBOYW1lICgyIGxldHRlciBjb2RlKToiCi0Jc2V0IHRjZXJ0KFNUKSAiU3RhdGUgb3IgUHJvdmluY2UgTmFtZSAoZnVsbCBuYW1lKToiCi0Jc2V0IHRjZXJ0KExPQykgIkxvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KToiCi0Jc2V0IHRjZXJ0KE9OKSAiT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KToiCi0Jc2V0IHRjZXJ0KE9VTikgIk9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pOiIKLQlzZXQgdGNlcnQoQ04pICJDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSk6IgotCXNldCB0Y2VydChFTSkgIkVtYWlsIEFkZHJlc3M6IgotCXNldCB0Y2VydChEQVlTKSAiRGF5cyB1bnRpbCBleHBpcmF0aW9uOiIKLQotCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQlpZiB7JG5hbWUgIT0gIiJ9IHsKLQkJaWYge1tyZWdleHAgey99ICRuYW1lXSB8fCBbcmVnZXhwIHtcLnBlbSR9ICRuYW1lXSB8fCBbcmVnZXhwIHtcLmNydCR9ICRuYW1lXX0gewotCQkJc2V0IGNjZXJ0KEZJTEUpICRuYW1lCi0JCX0gZWxzZSB7Ci0JCQlzZXQgY2NlcnQoRklMRSkgIiRpZGlyLyRuYW1lLnBlbSIKLQkJfQotCX0gZWxzZWlmIHskY2NlcnQoRklMRSkgPT0gIiJ9IHsKLQkJc2V0IGNjZXJ0KEZJTEUpICIkaWRpci92bmNjZXJ0LnBlbSIKLQl9Ci0KLQlidXR0b24gLmNjcnQuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC5jY3J0OyBjYXRjaCB7cmFpc2UgLmN9fQotCWJpbmQgLmNjcnQgPEVzY2FwZT4ge2Rlc3Ryb3kgLmNjcnQ7IGNhdGNoIHtyYWlzZSAuY319Ci0Jd20gcHJvdG9jb2wgLmNjcnQgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAuY2NydDsgY2F0Y2gge3JhaXNlIC5jfX0KLQotCWJ1dHRvbiAuY2NydC5jcmVhdGUgLXRleHQgIkdlbmVyYXRlIENlcnQiIC1jb21tYW5kIHtkZXN0cm95IC5jY3J0OyBjYXRjaCB7cmFpc2UgLmN9OyBkb19vc3NfY3JlYXRlfQotCi0JcGFjayAuY2NydC5jcmVhdGUgLmNjcnQuY2FuY2VsIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0KLQlzZXQgZXcgNDAKLQotCXNldCB3IC5jY3J0LnBmCi0JZnJhbWUgJHcKLQljaGVja2J1dHRvbiAkdy5jaGVjayAtYW5jaG9yIHcgLXZhcmlhYmxlIGNjZXJ0KEVOQykgLXRleHQgXAotCQkiRW5jcnlwdCBLZXkgd2l0aCBQYXNzcGhyYXNlIiAtY29tbWFuZCB7Y2hlY2tfcHB9Ci0KLQllbnRyeSAkdy5lIC13aWR0aCAkZXcgLXRleHR2YXJpYWJsZSBjY2VydChQQVNTKSAtc3RhdGUgZGlzYWJsZWQgXAotCQktc2hvdyAqCi0KLQlwYWNrICR3LmUgLXNpZGUgcmlnaHQKLQlwYWNrICR3LmNoZWNrIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQlwYWNrICR3IC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0KLQlzZXQgdyAuY2NydC5mbAotCWZyYW1lICR3Ci0JbGFiZWwgJHcubCAtYW5jaG9yIHcgLXRleHQgIlNhdmUgdG8gZmlsZToiCi0KLQllbnRyeSAkdy5lIC13aWR0aCAkZXcgLXRleHR2YXJpYWJsZSBjY2VydChGSUxFKQotCWJ1dHRvbiAkdy5iIC10ZXh0ICJCcm93c2UuLi4iIC1jb21tYW5kIHtzZXRfY3JlYXRlY2VydF9maWxlOyBjYXRjaCB7cmFpc2UgLmNjcnR9fQotCWlmIHskbmFtZSAhPSAiIn0gewotCQkkdy5iIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQl9Ci0KLQlwYWNrICR3LmUgLXNpZGUgcmlnaHQKLQlwYWNrICR3LmIgLXNpZGUgcmlnaHQKLQlwYWNrICR3LmwgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCXBhY2sgJHcgLXNpZGUgYm90dG9tIC1maWxsIHgKLQotCXNldCBpIDAKLQlmb3JlYWNoIHQge0RBWVMgRU0gQ04gT1VOIE9OIExPQyBTVCBDT30gewotCQlzZXQgdyAuY2NydC5mJGkKLQkJZnJhbWUgJHcKLQkJbGFiZWwgJHcubCAtYW5jaG9yIHcgLXRleHQgIiR0Y2VydCgkdCkiCi0JCWVudHJ5ICR3LmUgLXdpZHRoICRldyAtdGV4dHZhcmlhYmxlIGNjZXJ0KCR0KQotCQlwYWNrICR3LmUgIC1zaWRlIHJpZ2h0Ci0JCXBhY2sgJHcubCAgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCQlwYWNrICR3IC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JCWluY3IgaQotCX0KLQotCXBhY2sgLmNjcnQuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLmNjcnQKLX0KLQotcHJvYyBpbXBvcnRfY2hlY2tfbW9kZSB7d30gewotCWdsb2JhbCBpbXBvcnRfbW9kZQotCWlmIHskaW1wb3J0X21vZGUgPT0gInBhc3RlIn0gewotCQkkdy5tZi5iIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJJHcubWYuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCSR3LnBsYWIgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKLQkJJHcucGFzdGUudCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCX0gZWxzZSB7Ci0JCSR3Lm1mLmIgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKLQkJJHcubWYuZSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCQkkdy5wbGFiIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJJHcucGFzdGUudCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JfQotfQotCQotcHJvYyBpbXBvcnRfYnJvd3NlIHtwYXJ9IHsKLQlnbG9iYWwgaW1wb3J0X2ZpbGUKLQotCXNldCBpZGlyICIiCi0JaWYgeyRpbXBvcnRfZmlsZSAhPSAiIn0gewotCQlzZXQgaWRpciBbZ2V0X2lkaXJfY2VydHMgJGltcG9ydF9maWxlXQotCX0KLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcgotCWlmIHskaWRpciAhPSAiIn0gewotCQlzZXQgdCBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAkcGFyIC1pbml0aWFsZGlyICRpZGlyXQotCX0gZWxzZSB7Ci0JCXNldCB0IFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJdCi0JfQotCWlmIHskdCAhPSAiIn0gewotCQlzZXQgaW1wb3J0X2ZpbGUgJHQKLQl9Ci0JY2F0Y2gge3JhaXNlICRwYXJ9Ci0JdXBkYXRlCi19Ci0KLXByb2MgaW1wb3J0X3NhdmVfYnJvd3NlIHt7cGFyICIuaWNydCJ9fSB7Ci0JZ2xvYmFsIGltcG9ydF9zYXZlX2ZpbGUKLQotCXNldCBpZGlyICIiCi0JaWYgeyRpbXBvcnRfc2F2ZV9maWxlICE9ICIifSB7Ci0JCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAkaW1wb3J0X3NhdmVfZmlsZV0KLQl9Ci0JaWYgeyRpZGlyID09ICIifSB7Ci0JCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQl9Ci0JdW5peF9kaWFsb2dfcmVzaXplICRwYXIKLQlpZiB7JGlkaXIgIT0gIiJ9IHsKLQkJc2V0IHQgW3RrX2dldFNhdmVGaWxlIC1wYXJlbnQgJHBhciAtZGVmYXVsdGV4dGVuc2lvbiAiLmNydCIgLWluaXRpYWxkaXIgJGlkaXJdCi0JfSBlbHNlIHsKLQkJc2V0IHQgW3RrX2dldFNhdmVGaWxlIC1wYXJlbnQgJHBhciAtZGVmYXVsdGV4dGVuc2lvbiAiLmNydCJdCi0JfQotCWlmIHskdCAhPSAiIn0gewotCQlzZXQgaW1wb3J0X3NhdmVfZmlsZSAkdAotCX0KLQljYXRjaCB7cmFpc2UgJHBhcn0KLQl1cGRhdGUKLX0KLQotcHJvYyBkb19zYXZlIHtwYXJ9IHsKLQlnbG9iYWwgaW1wb3J0X21vZGUgaW1wb3J0X2ZpbGUgaW1wb3J0X3NhdmVfZmlsZQotCWdsb2JhbCBhbHNvX3NhdmVfdG9fYWNjZXB0ZWRfY2VydHMKLQotCWlmIHshW2luZm8gZXhpc3RzIGFsc29fc2F2ZV90b19hY2NlcHRlZF9jZXJ0c119IHsKLQkJc2V0IGFsc29fc2F2ZV90b19hY2NlcHRlZF9jZXJ0cyAwCi0JfQotCQotCWlmIHskaW1wb3J0X3NhdmVfZmlsZSA9PSAiIiAmJiAhICRhbHNvX3NhdmVfdG9fYWNjZXB0ZWRfY2VydHN9IHsKLQkJdGtfbWVzc2FnZUJveCAtcGFyZW50ICRwYXIgLXR5cGUgb2sgLWljb24gZXJyb3IgXAotCQkJLW1lc3NhZ2UgIk5vIFNhdmUgRmlsZSBzdXBwbGllZCIgLXRpdGxlICJTYXZlIEZpbGUiCi0JCXJldHVybgotCX0KLQotCXNldCBzdHIgIiIKLQlzZXQgc3ViamVjdF9pc3N1ZXIgIiIKLQlpZiB7JGltcG9ydF9tb2RlID09ICJzYXZlX2NlcnRfdGV4dCJ9IHsKLQkJZ2xvYmFsIHNhdmVfY2VydF90ZXh0Ci0JCXNldCBzdHIgJHNhdmVfY2VydF90ZXh0Ci0JCXNldCBpIDAKLQkJZm9yZWFjaCBsaW5lIFtzcGxpdCAkc3RyICJcbiJdIHsKLQkJCWluY3IgaQotCQkJaWYgeyRpID4gNTB9IHsKLQkJCQlicmVhawotCQkJfQotCQkJaWYgW3JlZ2V4cCB7Xi0gc3ViamVjdDogKiguKikkfSAkbGluZSBtIHZhbF0gewotCQkJCXNldCBzdWJqZWN0X2lzc3VlciAiJHtzdWJqZWN0X2lzc3Vlcn1zdWJqZWN0OiR2YWxcbiIKLQkJCX0KLQkJCWlmIFtyZWdleHAge14tIChpc3N1ZXJbMC05XVswLTldKik6ICooLiopJH0gJGxpbmUgbSBpcyB2YWxdIHsKLQkJCQlzZXQgc3ViamVjdF9pc3N1ZXIgIiR7c3ViamVjdF9pc3N1ZXJ9JGlzOiR2YWxcbiIKLQkJCX0KLQkJCWlmIFtyZWdleHAge15JTkZPOiBTRUxGX1NJR05FRD0oLiopJH0gJGxpbmUgbSB2YWxdIHsKLQkJCQlzZXQgc3ViamVjdF9pc3N1ZXIgIiR7c3ViamVjdF9pc3N1ZXJ9U0VMRl9TSUdORUQ6JHZhbFxuIgotCQkJfQotCQl9Ci0JfSBlbHNlaWYgeyRpbXBvcnRfbW9kZSA9PSAicGFzdGUifSB7Ci0JCXNldCBzdHIgWyRwYXIucGFzdGUudCBnZXQgMS4wIGVuZF0KLQl9IGVsc2UgewotCQlpZiB7ISBbZmlsZSBleGlzdHMgJGltcG9ydF9maWxlXX0gewotCQkJdGtfbWVzc2FnZUJveCAtcGFyZW50ICRwYXIgLXR5cGUgb2sgLWljb24gZXJyb3IgXAotCQkJCS1tZXNzYWdlICJJbnB1dCBmaWxlIFwiJGltcG9ydF9maWxlXCIgZG9lcyBub3QgZXhpc3QuIiAtdGl0bGUgIkltcG9ydCBGaWxlIgotCQkJcmV0dXJuCi0JCX0KLQkJc2V0IGZoICIiCi0JCXNldCBlbWVzcyAiIgotCQlzZXQgcmMgW2NhdGNoIHtzZXQgZmggW29wZW4gJGltcG9ydF9maWxlICJyIl19IGVtZXNzXQotCQlpZiB7JHJjICE9IDAgfHwgJGZoID09ICIifSB7Ci0JCQl0a19tZXNzYWdlQm94IC1wYXJlbnQgJHBhciAtdHlwZSBvayAtaWNvbiBlcnJvciBcCi0JCQkJLW1lc3NhZ2UgJGVtZXNzIC10aXRsZSAiSW1wb3J0IEZpbGU6ICRpbXBvcnRfZmlsZSIKLQkJCXJldHVybgotCQl9Ci0JCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJYXBwZW5kIHN0ciAiJGxpbmVcbiIKLQkJfQotCQljbG9zZSAkZmgKLQl9Ci0KLQlpZiB7ISBbcmVnZXhwIHtCRUdJTiBDRVJUSUZJQ0FURX0gJHN0cl19IHsKLQkJdGtfbWVzc2FnZUJveCAtcGFyZW50ICRwYXIgLXR5cGUgb2sgLWljb24gZXJyb3IgXAotCQkJLW1lc3NhZ2UgIkltcG9ydCBUZXh0IGRvZXMgbm90IGNvbnRhaW4gXCJCRUdJTiBDRVJUSUZJQ0FURVwiIiAtdGl0bGUgIkltcG9ydGVkIFRleHQiCi0JCXJldHVybgotCX0KLQlpZiB7ISBbcmVnZXhwIHtFTkQgQ0VSVElGSUNBVEV9ICRzdHJdfSB7Ci0JCXRrX21lc3NhZ2VCb3ggLXBhcmVudCAkcGFyIC10eXBlIG9rIC1pY29uIGVycm9yIFwKLQkJCS1tZXNzYWdlICJJbXBvcnQgVGV4dCBkb2VzIG5vdCBjb250YWluIFwiRU5EIENFUlRJRklDQVRFXCIiIC10aXRsZSAiSW1wb3J0ZWQgVGV4dCIKLQkJcmV0dXJuCi0JfQotCi0JZ2xvYmFsIGlzX3dpbmRvd3MKLQlzZXQgZmggIiIKLQlzZXQgZW1lc3MgIiIKLQlzZXQgZGVsdG1wICIiCi0JaWYgeyRpbXBvcnRfc2F2ZV9maWxlID09ICIifSB7Ci0JCWlmIHshICRpc193aW5kb3dzfSB7Ci0JCQlzZXQgZGVsdG1wIC90bXAvaW1wb3J0Llt0cGlkXQotCQl9IGVsc2UgewotCQkJc2V0IGRlbHRtcCBpbXBvcnQuW3RwaWRdCi0JCX0KLQkJc2V0IGRlbHRtcCBbbXl0bXAgJGRlbHRtcF0KLQkJc2V0IGltcG9ydF9zYXZlX2ZpbGUgJGRlbHRtcAotCX0KLQlzZXQgcmMgW2NhdGNoIHtzZXQgZmggW29wZW4gJGltcG9ydF9zYXZlX2ZpbGUgInciXX0gZW1lc3NdCi0JaWYgeyRyYyAhPSAwIHx8ICRmaCA9PSAiIn0gewotCQl0a19tZXNzYWdlQm94IC1wYXJlbnQgJHBhciAtdHlwZSBvayAtaWNvbiBlcnJvciBcCi0JCQktbWVzc2FnZSAkZW1lc3MgLXRpdGxlICJTYXZlIEZpbGU6ICRpbXBvcnRfc2F2ZV9maWxlIgotCQlyZXR1cm4KLQl9Ci0JaWYgeyEgJGlzX3dpbmRvd3N9IHsKLQkJY2F0Y2gge2ZpbGUgYXR0cmlidXRlcyAkaW1wb3J0X3NhdmVfZmlsZSAtcGVybWlzc2lvbnMgZ28td30KLQkJaWYge1tyZWdleHAge1BSSVZBVEV9ICRzdHJdIHx8IFtyZWdleHAge1wucGVtJH0gJGltcG9ydF9zYXZlX2ZpbGVdfSB7Ci0JCQljYXRjaCB7ZmlsZSBhdHRyaWJ1dGVzICRpbXBvcnRfc2F2ZV9maWxlIC1wZXJtaXNzaW9ucyBnby1yd30KLQkJfQotCX0KLQotCXB1dHMgLW5vbmV3bGluZSAkZmggJHN0cgotCWNsb3NlICRmaAotCi0JZ2xvYmFsIGRvX3NhdmVfc2F2ZWRfaXQKLQlzZXQgZG9fc2F2ZV9zYXZlZF9pdCAxCi0KLQlpZiB7JGFsc29fc2F2ZV90b19hY2NlcHRlZF9jZXJ0c30gewotCQlzZXQgb3NzbCBbZ2V0X29wZW5zc2xdCi0JCXNldCBmcF90eHQgIiIKLQkJc2V0IGZwX3R4dCBbZXhlYyAkb3NzbCB4NTA5IC1maW5nZXJwcmludCAtbm9vdXQgLWluICRpbXBvcnRfc2F2ZV9maWxlXQotCi0JCXNldCBhZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQkJc2V0IGFkaXIgIiRhZGlyL2FjY2VwdGVkIgotCQljYXRjaCB7ZmlsZSBta2RpciAkYWRpcn0KLQotCQlzZXQgZmluZ2VycHJpbnQgIiIKLQkJc2V0IGZpbmdlcmxpbmUgIiIKLQotCQlzZXQgaSAwCi0JCWZvcmVhY2ggbGluZSBbc3BsaXQgJGZwX3R4dCAiXG4iXSB7Ci0JCQlpbmNyIGkKLQkJCWlmIHskaSA+IDV9IHsKLQkJCQlicmVhawotCQkJfQotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtGaW5nZXJwcmludD0oLiopfSAkbGluZSBtdiBzdHJdIHsKLQkJCQlzZXQgZmluZ2VybGluZSAkbGluZQotCQkJCXNldCBmaW5nZXJwcmludCBbc3RyaW5nIHRyaW0gJHN0cl0KLQkJCX0KLQkJfQotCi0JCXNldCBmaW5nZXJwcmludCBbc3RyaW5nIHRvbG93ZXIgJGZpbmdlcnByaW50XQotCQlyZWdzdWIgLWFsbCB7On0gJGZpbmdlcnByaW50ICItIiBmaW5nZXJwcmludAotCQlyZWdzdWIgLWFsbCB7W1xcLz1dfSAkZmluZ2VycHJpbnQgIl8iIGZpbmdlcnByaW50Ci0KLQkJaWYgeyRzdWJqZWN0X2lzc3VlciA9PSAiIn0gewotCQkJc2V0IHNpX3R4dCAiIgotCQkJc2V0IHNpX3R4dCBbZXhlYyAkb3NzbCB4NTA5IC1zdWJqZWN0IC1pc3N1ZXIgLW5vb3V0IC1pbiAkaW1wb3J0X3NhdmVfZmlsZV0KLQkJCXNldCBzdWIgIiIKLQkJCXNldCBpc3MgIiIKLQkJCWZvcmVhY2ggbGluZSBbc3BsaXQgJHNpX3R4dCAiXG4iXSB7Ci0JCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtec3ViamVjdD0gKiguKikkfSAkbGluZSBtdiBzdHJdIHsKLQkJCQkJc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQkJCQkJc2V0IHN1YiAkc3RyCi0JCQkJfSBlbHNlaWYgW3JlZ2V4cCAtbm9jYXNlIHteaXNzdWVyPSAqKC4qKSR9ICRsaW5lIG12IHN0cl0gewotCQkJCQlzZXQgc3RyIFtzdHJpbmcgdHJpbSAkc3RyXQotCQkJCQlzZXQgaXNzICRzdHIKLQkJCQl9Ci0JCQl9Ci0JCQlpZiB7JHN1YiAhPSAiIiAmJiAkaXNzICE9ICIifSB7Ci0JCQkJc2V0IHN1YmplY3RfaXNzdWVyICJzdWJqZWN0OiRzdWJcbmlzc3VlcjE6JGlzc1xuIgotCQkJCWlmIHskc3ViID09ICRpc3N9IHsKLQkJCQkJc2V0IHN1YmplY3RfaXNzdWVyICIke3N1YmplY3RfaXNzdWVyfVNFTEZfU0lHTkVEOjFcbiIKLQkJCQl9IGVsc2UgewotCQkJCQlzZXQgc3ViamVjdF9pc3N1ZXIgIiR7c3ViamVjdF9pc3N1ZXJ9U0VMRl9TSUdORUQ6MFxuIgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWdsb2JhbCB2bmNkaXNwbGF5Ci0JCXNldCBmcm9tIFtnZXRfc3NoX2hwICR2bmNkaXNwbGF5XQotCQlpZiB7JGZyb20gPT0gIiJ9IHsKLQkJCXNldCBmcm9tIFtmaWxlIHRhaWwgJGltcG9ydF9zYXZlX2ZpbGVdCi0JCQlyZWdzdWIge1wuLiokfSAkZnJvbSAiIiBmcm9tCi0JCX0KLQkJaWYgeyRmcm9tID09ICIifSB7Ci0JCQlzZXQgZnJvbSAiaW1wb3J0IgotCQl9Ci0JCWlmIFtyZWdleHAgLS0ge146WzAtOV1bMC05XSokfSAkZnJvbV0gewotCQkJc2V0IGZyb20gImxpc3RlbiRmcm9tIgotCQl9Ci0JCXNldCBocCAkZnJvbQotCi0JCXNldCBmcm9tIFtzdHJpbmcgdG9sb3dlciAkZnJvbV0KLQkJcmVnc3ViIC1hbGwge15bK2Etel0qOi8vfSAkZnJvbSAiIiBmcm9tCi0JCXJlZ3N1YiAtYWxsIHs6fSAkZnJvbSAiLSIgZnJvbQotCQlyZWdzdWIgLWFsbCB7W1xcLz1dfSAkZnJvbSAiXyIgZnJvbQotCQlyZWdzdWIgLWFsbCB7WyAJXX0gJGZyb20gIl8iIGZyb20KLQotCQlzZXQgY3J0ICIkYWRpci8kZnJvbT0kZmluZ2VycHJpbnQuY3J0IgotCQljYXRjaCB7ZmlsZSBjb3B5IC1mb3JjZSAkaW1wb3J0X3NhdmVfZmlsZSAkY3J0fQotCi0JCWdsb2JhbCBkb19zYXZlX3NhdmVkX2hhc2hfaXQKLQkJc2V0IGRvX3NhdmVfc2F2ZWRfaGFzaF9pdCAxCi0JCXNhdmVfaGFzaCAkY3J0ICRhZGlyICRocCAkZmluZ2VybGluZSAkZnJvbSAkZmluZ2VycHJpbnQgJHN1YmplY3RfaXNzdWVyCi0JfQotCi0JY2F0Y2gge2Rlc3Ryb3kgJHBhcn0KLQlzZXQgcCAuYwotCWlmIHshW3dpbmZvIGV4aXN0cyAuY119IHsKLQkJZ2xvYmFsIGFjY2VwdGVkX2NlcnRfZGlhbG9nX2luX3Byb2dyZXNzCi0JCWlmIHshICRhY2NlcHRlZF9jZXJ0X2RpYWxvZ19pbl9wcm9ncmVzc30gewotCQkJaWYgeyRkZWx0bXAgPT0gIiJ9IHsKLQkJCQlnZXRjZXJ0cwotCQkJCXVwZGF0ZQkKLQkJCX0KLQkJfQotCX0KLQlpZiB7IVt3aW5mbyBleGlzdHMgLmNdfSB7Ci0JCXNldCBwIC4KLQl9Ci0JY2F0Y2gge3JhaXNlIC5jfQotCWNhdGNoIHtkZXN0cm95IC5zY3J0fQotCWlmIHskZGVsdG1wICE9ICIifSB7Ci0JCWNhdGNoIHtmaWxlIGRlbGV0ZSAkZGVsdG1wfQotCQlzZXQgaW1wb3J0X3NhdmVfZmlsZSAiIgotCQlyZXR1cm47Ci0JfQotCXRrX21lc3NhZ2VCb3ggLXBhcmVudCAkcCAtdHlwZSBvayAtaWNvbiBpbmZvIFwKLQkJLW1lc3NhZ2UgIlNhdmVkIHRvIGZpbGU6ICRpbXBvcnRfc2F2ZV9maWxlIiAtdGl0bGUgIlNhdmUgRmlsZTogJGltcG9ydF9zYXZlX2ZpbGUiCi19Ci0KLXByb2MgaW1wb3J0X2NlcnQge30gewotCi0JdG9wbGV2IC5pY3J0Ci0Jd20gdGl0bGUgLmljcnQgIkltcG9ydCBTU0wgQ2VydGlmaWNhdGUiCi0KLQlnbG9iYWwgc2Nyb2xsX3RleHRfZm9jdXMKLQlzZXQgc2Nyb2xsX3RleHRfZm9jdXMgMAotCWdsb2JhbCB1bmFtZQotCXNldCBoIDE5Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxMgotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMTYKLQl9Ci0Jc2Nyb2xsX3RleHQgLmljcnQuZiA5MCAkaAotCXNldCBzY3JvbGxfdGV4dF9mb2N1cyAxCi0KLQlzZXQgbXNnIHsKLSAgICBUaGlzIGRpYWxvZyBsZXRzIHlvdSBpbXBvcnQgYSBTU0wgQ2VydGlmaWNhdGUgYnkgZWl0aGVyIHBhc3Rpbmcgb25lIGluIG9yIGJ5Ci0gICAgbG9hZGluZyBmcm9tIGFub3RoZXIgZmlsZS4gIENob29zZSB3aGljaCBpbnB1dCBtb2RlIHlvdSB3YW50IHRvIHVzZSBieSB0aGUgdG9nZ2xlCi0gICAgIlBhc3RlIC8gUmVhZCBmcm9tIEZpbGUiLgotCi0gICAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBmaWxlcyB3ZSB1c2UgMSkgQ2VydGlmaWNhdGUgb25seSwgYW5kIDIpIFByaXZhdGUgS2V5Ci0gICAgYW5kIENlcnRpZmljYXRlLgotCi0gICAgVHlwZSAxKSB3b3VsZCBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaWRlbnRpdHkgb2YgYSByZW1vdGUgVk5DIFNlcnZlciwgd2hlcmVhcwotICAgIHR5cGUgMikgd291bGQgYmUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHRvIHRoZSByZW1vdGUgVk5DIFNlcnZlci4KLQotICAgIEEgdHlwZSAxKSBieSBjb252ZW50aW9uIGVuZHMgd2l0aCBmaWxlIHN1ZmZpeCAiLmNydCIgYW5kIGxvb2tzIGxpa2U6Ci0KLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRDJqQ0NBc0tnQXdJQkFnSUpBTEt5cGZWOEJJdENNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR2dNUXN3Q1FZRAotKG1vcmUgbGluZXMpIC4uLgotVENRK3RiUS9ET2lUWEdLeDFubGNLb1Bka0crUVZRVkp0aGxRY3BhbQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotCi0gICAgQSB0eXBlIDIpIGJ5IGNvbnZlbnRpb24gZW5kcyB3aXRoIGZpbGUgc3VmZml4ICIucGVtIiBhbmQgbG9va3MgbGlrZToKLQotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJRXBBSUJBQUtDQVFFQTRzQXBkN1dhUEtRUlduRmU5VDA0RDRwZ2xRQjBUaTAvZENWSHhnOFdFVlE4T2RjVwotKG1vcmUgbGluZXMpIC4uLgotOWtCbU5vdFVpVHB2Uk0rZTdFL3pSZW1odlk5cXJhRm9vcU1Xemk5SnJnWWZlTGZTdnZGZkd3PT0KLS0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUQyakNDQXNLZ0F3SUJBZ0lKQUxLeXBmVjhCSXRDTUEwR0NTcUdTSWIzRFFFQkJBVUFNSUdnTVFzd0NRWUQKLShtb3JlIGxpbmVzKSAuLi4KLVRDUSt0YlEvRE9pVFhHS3gxbmxjS29QZGtHK1FWUVZKdGhsUWNwYW0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLQotICAgIFlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhlICIuY3J0IiBvciAiLnBlbSIgY29udmVudGlvbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8uCi0KLSAgICBGaXJzdCwgZWl0aGVyIHBhc3RlIGluIHRoZSB0ZXh0IG9yIHNldCB0aGUgIlJlYWQgZnJvbSBGaWxlIiBmaWxlbmFtZS4KLQotICAgIE5leHQsIHNldCB0aGUgIlNhdmUgdG8gRmlsZSIgbmFtZSB0byB0aGUgZmlsZSB3aGVyZSB0aGUgaW1wb3J0ZWQgY2VydGlmaWNhdGUKLSAgICB3aWxsIGJlIHNhdmVkLgotCi0gICAgVGhlbiwgY2xpY2sgb24gIlNhdmUiIHRvIHNhdmUgdGhlIGltcG9ydGVkIENlcnRpZmljYXRlLgotCi0gICAgQWZ0ZXIgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIENlcnRpZmljYXRlIChvciBLZXkgKyBDZXJ0aWZpY2F0ZSksIHNlbGVjdCBpdCB0bwotICAgIHVzZSBmb3IgYSBjb25uZWN0aW9uIHZpYSB0aGUgIk15Q2VydCIgb3IgIlNlcnZlckNlcnQiIGRpYWxvZy4KLX0KLQkuaWNydC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlnbG9iYWwgaWNlcnQgaW1wb3J0X21vZGUKLQotCXNldCBpbXBvcnRfbW9kZSAicGFzdGUiCi0KLQlzZXQgdyAuaWNydC5tZgotCWZyYW1lICR3Ci0KLQlyYWRpb2J1dHRvbiAkdy5wIC1wYWR5IDEgLWFuY2hvciB3IC12YXJpYWJsZSBpbXBvcnRfbW9kZSAtdmFsdWUgcGFzdGUgXAotCQktdGV4dCAiUGFzdGUiIC1jb21tYW5kICJpbXBvcnRfY2hlY2tfbW9kZSAuaWNydCIKLQotCXJhZGlvYnV0dG9uICR3LmYgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIGltcG9ydF9tb2RlIC12YWx1ZSBmaWxlIFwKLQkJLXRleHQgIlJlYWQgZnJvbSBGaWxlOiIgLWNvbW1hbmQgImltcG9ydF9jaGVja19tb2RlIC5pY3J0IgotCi0JZ2xvYmFsIGltcG9ydF9maWxlCi0Jc2V0IGltcG9ydF9maWxlICIiCi0JZW50cnkgJHcuZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBpbXBvcnRfZmlsZQotCi0JYnV0dG9uICR3LmIgLXBhZHkgMSAtYW5jaG9yIHcgLXRleHQgIkJyb3dzZS4uLiIgLWNvbW1hbmQge2ltcG9ydF9icm93c2UgLmljcnR9Ci0JcGFjayAkdy5iIC1zaWRlIHJpZ2h0Ci0JcGFjayAkdy5wICR3LmYgLXNpZGUgbGVmdAotCXBhY2sgJHcuZSAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQkkdy5iIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkkdy5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQotCWxhYmVsIC5pY3J0LnBsYWIgLWFuY2hvciB3IC10ZXh0ICJQYXN0ZSBDZXJ0aWZpY2F0ZSBoZXJlOiAgICAgKGV4dHJhIGJsYW5rIGxpbmVzIGFib3ZlIG9yIGJlbG93IGFyZSBPSykiIAotCXNldCBoIDIyCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxMQotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMTEKLQl9Ci0Jc2Nyb2xsX3RleHQgLmljcnQucGFzdGUgOTAgJGgKLQotCWJ1dHRvbiAuaWNydC5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLmljcnQ7IGNhdGNoIHtyYWlzZSAuY319Ci0JYmluZCAuaWNydCA8RXNjYXBlPiB7ZGVzdHJveSAuaWNydDsgY2F0Y2gge3JhaXNlIC5jfX0KLQl3bSBwcm90b2NvbCAuaWNydCBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5pY3J0OyBjYXRjaCB7cmFpc2UgLmN9fQotCi0JYnV0dG9uIC5pY3J0LnNhdmUgLXRleHQgIlNhdmUiIC1jb21tYW5kIHtkb19zYXZlIC5pY3J0fQotCi0Jc2V0IHcgLmljcnQuc2YKLQlmcmFtZSAkdwotCi0JbGFiZWwgJHcubCAtdGV4dCAiU2F2ZSB0byBGaWxlOiIgLWFuY2hvciB3Ci0JZ2xvYmFsIGltcG9ydF9zYXZlX2ZpbGUKLQlzZXQgaW1wb3J0X3NhdmVfZmlsZSAiIgotCWVudHJ5ICR3LmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgaW1wb3J0X3NhdmVfZmlsZQotCWJ1dHRvbiAkdy5iIC1wYWR5IDEgLWFuY2hvciB3IC10ZXh0ICJCcm93c2UuLi4iIC1jb21tYW5kIGltcG9ydF9zYXZlX2Jyb3dzZQotCi0JZ2xvYmFsIGFsc29fc2F2ZV90b19hY2NlcHRlZF9jZXJ0cwotCXNldCBhbHNvX3NhdmVfdG9fYWNjZXB0ZWRfY2VydHMgMAotCWNoZWNrYnV0dG9uIC5pY3J0LmFjIC1hbmNob3IgdyAtdmFyaWFibGUgYWxzb19zYXZlX3RvX2FjY2VwdGVkX2NlcnRzIC10ZXh0IFwKLQkgICAgIkFsc28gU2F2ZSB0byB0aGUgJ0FjY2VwdGVkIENlcnRzJyBkaXJlY3RvcnkiIC1yZWxpZWYgcmFpc2VkCi0KLQlwYWNrICR3LmIgLXNpZGUgcmlnaHQKLQlwYWNrICR3LmwgLXNpZGUgbGVmdAotCXBhY2sgJHcuZSAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlwYWNrIC5pY3J0LnNhdmUgLmljcnQuY2FuY2VsIC5pY3J0LmFjIC5pY3J0LnNmIC5pY3J0Lm1mIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JcGFjayAuaWNydC5wYXN0ZSAuaWNydC5wbGFiIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0KLQlwYWNrIC5pY3J0LmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQkuaWNydC5wYXN0ZS50IGluc2VydCBlbmQgIiIKLQotCWZvY3VzIC5pY3J0LnBhc3RlLnQKLQotCWNlbnRlcl93aW4gLmljcnQKLX0KLQotcHJvYyBzYXZlX2NlcnQge2hwfSB7Ci0KLQlnbG9iYWwgY2VydF90ZXh0Ci0KLQl0b3BsZXYgLnNjcnQKLQl3bSB0aXRsZSAuc2NydCAiSW1wb3J0L1NhdmUgU1NMIENlcnRpZmljYXRlIgotCi0JZ2xvYmFsIHNjcm9sbF90ZXh0X2ZvY3VzCi0Jc2V0IHNjcm9sbF90ZXh0X2ZvY3VzIDAKLQlnbG9iYWwgdW5hbWUKLQotCWdsb2JhbCBhY2NlcHRlZF9jZXJ0X2RpYWxvZ19pbl9wcm9ncmVzcwotCXNldCBoIDIwCi0JaWYgeyRhY2NlcHRlZF9jZXJ0X2RpYWxvZ19pbl9wcm9ncmVzc30gewotCQlzZXQgbW9kZSAiYWNjZXB0ZWQiCi0JCXNldCBoIDE1Ci0JCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJCXNldCBoIDExCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbW9kZSAibm9ybWFsIgotCQlzZXQgaCAyMAotCQlpZiBbc21hbGxfaGVpZ2h0XSB7Ci0JCQlzZXQgaCAxNgotCQl9Ci0JfQotCXNjcm9sbF90ZXh0IC5zY3J0LmYgOTAgJGgKLQotCXNldCBzY3JvbGxfdGV4dF9mb2N1cyAxCi0KLQlzZXQgbXNnMSB7Ci0gICAgVGhpcyBkaWFsb2cgbGV0cyB5b3UgaW1wb3J0IGEgU1NMIENlcnRpZmljYXRlIHJldHJpZXZlZCBmcm9tIGEgVk5DIHNlcnZlci4KLQotICAgIEJlIHN1cmUgdG8gaGF2ZSB2ZXJpZmllZCBpdHMgYXV0aGVudGljaXR5IHZpYSBhbiBleHRlcm5hbCBtZWFucyAoY2hlY2tpbmcKLSAgICB0aGUgTUQ1IGhhc2ggdmFsdWUgc2VudCB0byB5b3UgYnkgdGhlIGFkbWluaXN0cmF0b3IsIGV0YykKLQotICAgIFNldCAiU2F2ZSB0byBGaWxlIiB0byB0aGUgZmlsZW5hbWUgd2hlcmUgdGhlIGltcG9ydGVkIGNlcnQgd2lsbCBiZSBzYXZlZC4KLQotICAgIElmIHlvdSBhbHNvIHdhbnQgdGhlIENlcnRpZmljYXRlIHRvIGJlIHNhdmVkIHRvIHRoZSBwb29sIG9mIGNlcnRzIGluIHRoZQotICAgICdBY2NlcHRlZCBDZXJ0cycgZGlyZWN0b3J5LCBzZWxlY3QgdGhlIGNoZWNrYm94LiAgQnkgZGVmYXVsdCBhbGwgU2VydmVycyBhcmUKLSAgICB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBwb29sLgotCi0gICAgVGhlbiwgY2xpY2sgb24gIlNhdmUiIHRvIHNhdmUgdGhlIGltcG9ydGVkIENlcnRpZmljYXRlLgotCi0gICAgQWZ0ZXIgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIENlcnRpZmljYXRlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCBhcwotICAgIHRoZSAiU2VydmVyQ2VydCIgZm9yIHRoZSBuZXh0IGNvbm5lY3Rpb24gdG8gdGhpcyBob3N0OiAlSE9TVAotCi0gICAgVG8gbWFrZSB0aGUgU2VydmVyQ2VydCBzZXR0aW5nIHRvIHRoZSBpbXBvcnRlZCBjZXJ0IGZpbGUgUEVSTUFORU5ULCBzZWxlY3QKLSAgICAnU2F2ZScgdG8gc2F2ZSBpdCBpbiB0aGUgcHJvZmlsZSBmb3IgdGhpcyBob3N0LgotfQotCi0Jc2V0IG1zZzIgewotICAgIFRoaXMgZGlhbG9nIGxldHMgeW91IGltcG9ydCBhIFNTTCBDZXJ0aWZpY2F0ZSByZXRyaWV2ZWQgZnJvbSBhIFZOQyBzZXJ2ZXIuCi0KLSAgICBCZSBzdXJlIHRvIGhhdmUgdmVyaWZpZWQgaXRzIGF1dGhlbnRpY2l0eSB2aWEgYW4gZXh0ZXJuYWwgbWVhbnMgKGNoZWNraW5nCi0gICAgdGhlIE1ENSBoYXNoIHZhbHVlIHNlbnQgdG8geW91IGJ5IHRoZSBhZG1pbmlzdHJhdG9yLCBldGMpCi0KLSAgICBJdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSAnQWNjZXB0ZWQgQ2VydHMnIGRpcmVjdG9yeS4gIFRoZSAiU2F2ZSB0byBGaWxlIgotICAgIGJlbG93IGlzIGFscmVhZHkgc2V0IHRvIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBhbmQgZmlsZSBuYW1lLgotCi0gICAgQ2xpY2sgb24gIlNhdmUiIHRvIGFkZCBpdCB0byB0aGUgQWNjZXB0ZWQgQ2VydHMuCi0KLSAgICBJdCwgYW5kIHRoZSBvdGhlciBjZXJ0cyBpbiB0aGF0IGRpcmVjdG9yeSwgd2lsbCBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZQotICAgIGFueSBWTkMgU2VydmVyIHRoYXQgaGFzICJBQ0NFUFRFRF9DRVJUUyIgYXMgdGhlICJDZXJ0c0RpciIgdmFsdWUgaW4gdGhlCi0gICAgIkNlcnRzLi4uIiBkaWFsb2cuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGNoZWNraW5nIHBvbGljeS4KLX0KLQotCXNldCBtc2cgIiIKLQlpZiB7JG1vZGUgPT0gIm5vcm1hbCJ9IHsKLQkJc2V0IG1zZyAkbXNnMQotCX0gZWxzZSB7Ci0JCXNldCBtc2cgJG1zZzIKLQl9Ci0KLQlyZWdzdWIgeyVIT1NUfSAkbXNnICIkaHAiIG1zZwotCS5zY3J0LmYudCBpbnNlcnQgZW5kICRtc2cKLQotCXNldCB3IC5zY3J0Lm1mCi0JZnJhbWUgJHcKLQotCWdsb2JhbCBpbXBvcnRfZmlsZQotCXNldCBpbXBvcnRfZmlsZSAiIgotCWVudHJ5ICR3LmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgaW1wb3J0X2ZpbGUKLQotCXNldCBoIDIyCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxMAotCX0KLQlzY3JvbGxfdGV4dCAuc2NydC5wYXN0ZSA5MCAkaAotCi0JYnV0dG9uIC5zY3J0LmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAuc2NydDsgY2F0Y2gge3JhaXNlIC5jfX0KLQliaW5kIC5zY3J0IDxFc2NhcGU+IHtkZXN0cm95IC5zY3J0OyBjYXRjaCB7cmFpc2UgLmN9fQotCXdtIHByb3RvY29sIC5zY3J0IFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLnNjcnQ7IGNhdGNoIHtyYWlzZSAuY319Ci0KLQlnbG9iYWwgaW1wb3J0X3NhdmVfZmlsZQotCWlmIHskbW9kZSA9PSAibm9ybWFsIn0gewotCQlidXR0b24gLnNjcnQuc2F2ZSAtdGV4dCAiU2F2ZSIgLWNvbW1hbmQge2RvX3NhdmUgLnNjcnQ7IHNldCBzdmNlcnQgJGltcG9ydF9zYXZlX2ZpbGV9Ci0JfSBlbHNlIHsKLQkJYnV0dG9uIC5zY3J0LnNhdmUgLXRleHQgIlNhdmUiIC1jb21tYW5kIHtkb19zYXZlIC5zY3J0fQotCX0KLQotCWlmIFtyZWdleHAgLW5vY2FzZSAtLSB7QUNDRVBUfSAkY2VydF90ZXh0XSB7Ci0JCWlmIFtyZWdleHAgLW5vY2FzZSAtLSB7Q2xpZW50IGNlcnRpZmljYXRlfSAkY2VydF90ZXh0XSB7Ci0JCQlpZiBbcmVnZXhwIC0tIHteOlswLTldWzAtOV0qJH0gJGhwXSB7Ci0JCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtzdWJqZWN0PS4qQ049KFteL11bXi9dKikvfSAkY2VydF90ZXh0IG12MCBtdjFdIHsKLQkJCQkJcmVnc3ViIC1hbGwge1sgCV19ICRtdjEgIiIgbXYxCi0JCQkJCXNldCBocCAiJG12MSRocCIKLQkJCQl9IGVsc2UgewotCQkJCQlzZXQgaHAgImxpc3RlbiRocCIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXQgdyAuc2NydC5zZgotCWZyYW1lICR3Ci0KLQlsYWJlbCAkdy5sIC10ZXh0ICJTYXZlIHRvIEZpbGU6IiAtYW5jaG9yIHcKLQlzZXQgaW1wb3J0X3NhdmVfZmlsZSAic2VydmVyOiRocC5jcnQiCi0JZ2xvYmFsIGlzX3dpbmRvd3MKLQlyZWdzdWIgLWFsbCB7On0gJGltcG9ydF9zYXZlX2ZpbGUgIi0iIGltcG9ydF9zYXZlX2ZpbGUKLQotCXNldCBpbXBvcnRfc2F2ZV9maWxlIFtnZXRfaWRpcl9jZXJ0cyAiIl0vJGltcG9ydF9zYXZlX2ZpbGUKLQotCWdsb2JhbCBmZXRjaF9jZXJ0X2ZpbGVuYW1lCi0JaWYgeyRmZXRjaF9jZXJ0X2ZpbGVuYW1lICE9ICIifSB7Ci0JCXNldCBpbXBvcnRfc2F2ZV9maWxlICRmZXRjaF9jZXJ0X2ZpbGVuYW1lCi0JfQotCi0JZW50cnkgJHcuZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBpbXBvcnRfc2F2ZV9maWxlCi0JYnV0dG9uICR3LmIgLXBhZHkgMSAtYW5jaG9yIHcgLXRleHQgIkJyb3dzZS4uLiIgLWNvbW1hbmQge2ltcG9ydF9zYXZlX2Jyb3dzZSAuc2NydH0KLQotCXBhY2sgJHcuYiAtc2lkZSByaWdodAotCXBhY2sgJHcubCAtc2lkZSBsZWZ0Ci0JcGFjayAkdy5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWdsb2JhbCBhbHNvX3NhdmVfdG9fYWNjZXB0ZWRfY2VydHMKLQlzZXQgYWxzb19zYXZlX3RvX2FjY2VwdGVkX2NlcnRzIDAKLQlpZiBbcmVnZXhwIC1ub2Nhc2UgLS0ge0FDQ0VQVH0gJGNlcnRfdGV4dF0gewotCQlpZiBbcmVnZXhwIC1ub2Nhc2UgLS0ge0NsaWVudCBjZXJ0aWZpY2F0ZX0gJGNlcnRfdGV4dF0gewotCQkJc2V0IGFsc29fc2F2ZV90b19hY2NlcHRlZF9jZXJ0cyAxCi0JCX0KLQl9Ci0JY2hlY2tidXR0b24gLnNjcnQuYWMgLWFuY2hvciB3IC12YXJpYWJsZSBhbHNvX3NhdmVfdG9fYWNjZXB0ZWRfY2VydHMgLXRleHQgXAotCSAgICAiQWxzbyBTYXZlIHRvIHRoZSAnQWNjZXB0ZWQgQ2VydHMnIGRpcmVjdG9yeSIgLXJlbGllZiByYWlzZWQKLQotCWlmIHskbW9kZSA9PSAibm9ybWFsIn0gewotCQlwYWNrIC5zY3J0LmNhbmNlbCAuc2NydC5zYXZlIC5zY3J0LnNmIC5zY3J0LmFjIC5zY3J0Lm1mIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JfSBlbHNlIHsKLQkJcGFjayAuc2NydC5jYW5jZWwgLnNjcnQuc2F2ZSAuc2NydC5zZiAgICAgICAgICAuc2NydC5tZiAtc2lkZSBib3R0b20gLWZpbGwgeAotCX0KLQlwYWNrIC5zY3J0LnBhc3RlIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0KLQlwYWNrIC5zY3J0LmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQlzZXQgdGV4dCAiIiAKLQlzZXQgb24gMAotCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNlcnRfdGV4dCAiXG4iXSB7Ci0JCWlmIFtyZWdleHAgLS0gey0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLX0gJGxpbmVdIHsKLQkJCWluY3Igb24KLQkJfQotCQlpZiB7JG9uICE9IDF9IHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWFwcGVuZCB0ZXh0ICIkbGluZVxuIgotCQlpZiBbcmVnZXhwIC0tIHstLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tfSAkbGluZV0gewotCQkJc2V0IG9uIDIKLQkJfQotCX0KLQlnbG9iYWwgc2F2ZV9jZXJ0X3RleHQKLQlzZXQgc2F2ZV9jZXJ0X3RleHQgJHRleHQKLQkuc2NydC5wYXN0ZS50IGluc2VydCBlbmQgIiR0ZXh0IgotCWdsb2JhbCBpbXBvcnRfbW9kZQotCXNldCBpbXBvcnRfbW9kZSAic2F2ZV9jZXJ0X3RleHQiCi0KLQlmb2N1cyAuc2NydC5wYXN0ZS50Ci0KLQljZW50ZXJfd2luIC5zY3J0Ci19Ci0KLQotcHJvYyBnZXRjZXJ0cyB7fSB7Ci0JZ2xvYmFsIG15Y2VydCBzdmNlcnQgY3J0ZGlyIGNybGZpbAotCWdsb2JhbCB1c2Vfc3NoIHVzZV9zc2hzc2wKLQl0b3BsZXYgLmMKLQl3bSB0aXRsZSAuYyAiU1NMIENlcnRpZmljYXRlcyIKLQlmcmFtZSAuYy5teWNlcnQKLQlmcmFtZSAuYy5zdmNlcnQKLQlmcmFtZSAuYy5jcnRkaXIKLQlmcmFtZSAuYy5jcmxmaWwKLQlsYWJlbCAuYy5teWNlcnQubCAtYW5jaG9yIHcgLXdpZHRoIDEyIC10ZXh0ICJNeUNlcnQ6IgotCWxhYmVsIC5jLnN2Y2VydC5sIC1hbmNob3IgdyAtd2lkdGggMTIgLXRleHQgIlNlcnZlckNlcnQ6IgotCWxhYmVsIC5jLmNydGRpci5sIC1hbmNob3IgdyAtd2lkdGggMTIgLXRleHQgIkNlcnRzRGlyOiIKLQlsYWJlbCAuYy5jcmxmaWwubCAtYW5jaG9yIHcgLXdpZHRoIDEyIC10ZXh0ICJDUkwgRmlsZToiCi0JCi0JZW50cnkgLmMubXljZXJ0LmUgLXdpZHRoIDMyIC10ZXh0dmFyaWFibGUgbXljZXJ0IC12Y21kIHZfbXljZXJ0Ci0JZW50cnkgLmMuc3ZjZXJ0LmUgLXdpZHRoIDMyIC10ZXh0dmFyaWFibGUgc3ZjZXJ0IC12Y21kIHZfc3ZjZXJ0Ci0JZW50cnkgLmMuY3J0ZGlyLmUgLXdpZHRoIDMyIC10ZXh0dmFyaWFibGUgY3J0ZGlyCi0JZW50cnkgLmMuY3JsZmlsLmUgLXdpZHRoIDMyIC10ZXh0dmFyaWFibGUgY3JsZmlsIC12Y21kIHZfY3JsZmlsCi0KLQliaW5kIC5jLm15Y2VydC5lIDxFbnRlcj4gey5jLm15Y2VydC5lIHZhbGlkYXRlfQotCWJpbmQgLmMubXljZXJ0LmUgPExlYXZlPiB7LmMubXljZXJ0LmUgdmFsaWRhdGV9Ci0JYmluZCAuYy5zdmNlcnQuZSA8RW50ZXI+IHsuYy5zdmNlcnQuZSB2YWxpZGF0ZX0KLQliaW5kIC5jLnN2Y2VydC5lIDxMZWF2ZT4gey5jLnN2Y2VydC5lIHZhbGlkYXRlfQotCi0JYnV0dG9uIC5jLm15Y2VydC5iIC10ZXh0ICJCcm93c2UuLi4iIC1jb21tYW5kIHtzZXRfbXljZXJ0IC5jOyBjYXRjaCB7cmFpc2UgLmN9fQotCWJ1dHRvbiAuYy5zdmNlcnQuYiAtdGV4dCAiQnJvd3NlLi4uIiAtY29tbWFuZCB7c2V0X3N2Y2VydCAuYzsgY2F0Y2gge3JhaXNlIC5jfX0KLQlidXR0b24gLmMuY3J0ZGlyLmIgLXRleHQgIkJyb3dzZS4uLiIgLWNvbW1hbmQge3NldF9jcnRkaXIgLmM7IGNhdGNoIHtyYWlzZSAuY319Ci0JYnV0dG9uIC5jLmNybGZpbC5iIC10ZXh0ICJCcm93c2UuLi4iIC1jb21tYW5kIHtzZXRfY3JsZmlsIC5jOyBjYXRjaCB7cmFpc2UgLmN9fQotCi0JYnV0dG9uIC5jLm15Y2VydC5pIC10ZXh0ICJJbmZvIiAtY29tbWFuZCB7c2hvd19teWNlcnR9Ci0JYnV0dG9uIC5jLnN2Y2VydC5pIC10ZXh0ICJJbmZvIiAtY29tbWFuZCB7c2hvd19zdmNlcnR9Ci0JYnV0dG9uIC5jLmNydGRpci5pIC10ZXh0ICJJbmZvIiAtY29tbWFuZCB7fQotCWJ1dHRvbiAuYy5jcmxmaWwuaSAtdGV4dCAiSW5mbyIgLWNvbW1hbmQge3Nob3dfY3JsZmlsfQotCi0JYmluZCAuYy5teWNlcnQuYiA8RW50ZXI+ICJ2X215Y2VydCIKLQliaW5kIC5jLnN2Y2VydC5iIDxFbnRlcj4gInZfc3ZjZXJ0IgotCWJpbmQgLmMuY3JsZmlsLmIgPEVudGVyPiAidl9jcmxmaWwiCi0KLQkuYy5teWNlcnQuaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JLmMuc3ZjZXJ0LmkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCS5jLmNydGRpci5pIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkuYy5jcmxmaWwuaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0KLQliaW5kIC5jLm15Y2VydC5iIDxCMy1CdXR0b25SZWxlYXNlPiAgICJzaG93X215Y2VydCIKLQliaW5kIC5jLnN2Y2VydC5iIDxCMy1CdXR0b25SZWxlYXNlPiAgICJzaG93X3N2Y2VydCIKLQliaW5kIC5jLmNybGZpbC5iIDxCMy1CdXR0b25SZWxlYXNlPiAgICJzaG93X2NybGZpbCIKLQotCXNldCBkb19jcmwgMQotCXNldCBkb19yb3cgMQotCi0Jc2V0IGMgLmMKLQlpZiB7JGRvX3Jvd30gewotCQlmcmFtZSAuYy5iMAotCQlzZXQgYyAuYy5iMAotCX0KLQotCWJ1dHRvbiAkYy5jcmVhdGUgLXRleHQgIkNyZWF0ZSBDZXJ0aWZpY2F0ZSAuLi4iIC1jb21tYW5kIHtjcmVhdGVfY2VydH0KLQlidXR0b24gJGMuaW1wb3J0IC10ZXh0ICJJbXBvcnQgQ2VydGlmaWNhdGUgLi4uIiAtY29tbWFuZCB7aW1wb3J0X2NlcnR9Ci0JYnV0dG9uICRjLmRlbGV0ZSAtdGV4dCAiRGVsZXRlIENlcnRpZmljYXRlIC4uLiIgLWNvbW1hbmQge2RlbGV0ZV9jZXJ0IC5jfQotCi0JaWYgeyRjICE9ICIuYyJ9IHsKLQkJcGFjayAkYy5jcmVhdGUgJGMuaW1wb3J0ICRjLmRlbGV0ZSAgLWZpbGwgeCAtZXhwYW5kIDEgLXNpZGUgbGVmdAotCX0KLQotCWZyYW1lIC5jLmIKLQlidXR0b24gLmMuYi5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7Y2F0Y2gge2Rlc3Ryb3kgLmN9fQotCWJpbmQgLmMgPEVzY2FwZT4ge2Rlc3Ryb3kgLmN9Ci0JYnV0dG9uIC5jLmIuaGVscCAtdGV4dCAiSGVscCIgLWNvbW1hbmQgaGVscF9jZXJ0cwotCXBhY2sgLmMuYi5oZWxwIC5jLmIuZG9uZSAtZmlsbCB4IC1leHBhbmQgMSAtc2lkZSBsZWZ0Ci0KLQlzZXQgd2xpc3QgW2xpc3QgbXljZXJ0IHN2Y2VydCBjcnRkaXJdCi0JbGFwcGVuZCB3bGlzdCBjcmxmaWwKLQotCWZvcmVhY2ggdyAkd2xpc3QgewotCQlwYWNrIC5jLiR3LmwgLXNpZGUgbGVmdAotCQlwYWNrIC5jLiR3LmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCQlwYWNrIC5jLiR3LmIgLXNpZGUgbGVmdAotCQlwYWNrIC5jLiR3LmkgLXNpZGUgbGVmdAotCQliaW5kIC5jLiR3LmUgPFJldHVybj4gIi5jLiR3LmIgaW52b2tlIgotCQlpZiB7JHVzZV9zc2h9IHsKLQkJCS5jLiR3LmwgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAkKLQkJCS5jLiR3LmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAkKLQkJCS5jLiR3LmIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAkKLQkJfQkKLQl9Ci0KLQlnbG9iYWwgc3ZjZXJ0X2RlZmF1bHRfZm9yY2UgbXljZXJ0X2RlZmF1bHRfZm9yY2UgY3JsZmlsX2RlZmF1bHRfZm9yY2UKLQlpZiB7JG15Y2VydF9kZWZhdWx0X2ZvcmNlfSB7Ci0JCS5jLm15Y2VydC5lIGNvbmZpZ3VyZSAtc3RhdGUgcmVhZG9ubHkKLQkJLmMubXljZXJ0LmIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCX0KLQlpZiB7JHN2Y2VydF9kZWZhdWx0X2ZvcmNlfSB7Ci0JCS5jLnN2Y2VydC5lIGNvbmZpZ3VyZSAtc3RhdGUgcmVhZG9ubHkKLQkJLmMuc3ZjZXJ0LmIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQkuYy5jcnRkaXIuZSBjb25maWd1cmUgLXN0YXRlIHJlYWRvbmx5Ci0JCS5jLmNydGRpci5iIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQl9Ci0JaWYgeyRjcmxmaWxfZGVmYXVsdF9mb3JjZX0gewotCQkuYy5jcmxmaWwuZSBjb25maWd1cmUgLXN0YXRlIHJlYWRvbmx5Ci0JCS5jLmNybGZpbC5iIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQl9Ci0KLQlpZiB7JG15Y2VydCAhPSAiIn0gewotCQl2X215Y2VydAotCX0KLQlpZiB7JHN2Y2VydCAhPSAiIn0gewotCQl2X3N2Y2VydAotCX0KLQlpZiB7JGNybGZpbCAhPSAiIn0gewotCQl2X2NybGZpbAotCX0KLQotCXNldCB3bGlzdCBbbGlzdCAuYy5teWNlcnQgLmMuc3ZjZXJ0IC5jLmNydGRpcl0KLQlpZiB7JGRvX2NybH0gewotCQlsYXBwZW5kIHdsaXN0IC5jLmNybGZpbAotCX0KLQlpZiB7JGMgIT0gIi5jIn0gewotCQlsYXBwZW5kIHdsaXN0ICRjCi0JfSBlbHNlIHsKLQkJbGFwcGVuZCB3bGlzdCAuYy5jcmVhdGUgLmMuaW1wb3J0IC5jLmRlbGV0ZQotCX0KLQlsYXBwZW5kIHdsaXN0IC5jLmIKLQotCWV2YWwgcGFjayAkd2xpc3QgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLmMKLQl3bSByZXNpemFibGUgLmMgMSAwCi0KLQlmb2N1cyAuYwotfQotCi1wcm9jIGdldF9wcm9maWxlc19kaXIge30gewotCWdsb2JhbCBlbnYgaXNfd2luZG93cwotCQotCXNldCBkaXIgIiIKLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19IT01FKV0gewotCQkJc2V0IHQgIiRlbnYoU1NWTkNfSE9NRSkvc3Nfdm5jIgotCQkJcmVnc3ViIC1hbGwge1xcfSAkdCAiLyIgdAotCQkJcmVnc3ViIC1hbGwgey8vKn0gJHQgIi8iIHQKLQkJCWlmIHshIFtmaWxlIGlzZGlyZWN0b3J5ICR0XX0gewotCQkJCWNhdGNoIHtmaWxlIG1rZGlyICR0fQotCQkJfQotCQkJaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHRdIHsKLQkJCQlzZXQgZGlyICR0Ci0JCQkJc2V0IHMgIiR0L3Byb2ZpbGVzIgotCQkJCWlmIHshIFtmaWxlIGV4aXN0cyAkc119IHsKLQkJCQkJY2F0Y2gge2ZpbGUgbWtkaXIgJHN9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIHskZGlyID09ICIifSB7Ci0JCQlzZXQgdCBbZmlsZSBkaXJuYW1lIFtwd2RdXQotCQkJc2V0IHQgIiR0L3Byb2ZpbGVzIgotCQkJaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHRdIHsKLQkJCQlzZXQgZGlyICR0Ci0JCQl9Ci0JCX0KLQl9IGVsc2VpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0hPTUUpXSB7Ci0JCXNldCB0ICIkZW52KFNTVk5DX0hPTUUpLy52bmMiCi0JCWNhdGNoIHtmaWxlIG1rZGlyICR0fQotCQlpZiBbZmlsZSBpc2RpcmVjdG9yeSAkdF0gewotCQkJc2V0IGRpciAkdAotCQkJc2V0IHMgIiR0L3Byb2ZpbGVzIgotCQkJaWYgeyEgW2ZpbGUgZXhpc3RzICRzXX0gewotCQkJCWNhdGNoIHtmaWxlIG1rZGlyICRzfQotCQkJfQotCQl9Ci0JfQotCQotCWlmIHskZGlyICE9ICIifSB7Ci0JCQotCX0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfQkFTRURJUildIHsKLQkJc2V0IGRpciAkZW52KFNTVk5DX0JBU0VESVIpCi0JfSBlbHNlIHsKLQkJc2V0IGRpciBbcHdkXQotCX0KLQlpZiBbZmlsZSBpc2RpcmVjdG9yeSAiJGRpci9wcm9maWxlcyJdIHsKLQkJc2V0IGRpciAiJGRpci9wcm9maWxlcyIKLQl9Ci0JcmV0dXJuICRkaXIKLX0KLQotcHJvYyBnbG9iYWxpemUge30gewotCWdsb2JhbCBkZWZzCi0JZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIGRlZnNdIHsKLQkJdXBsZXZlbCBnbG9iYWwgJHZhcgotCX0KLX0KLQkKLXByb2MgbG9hZF9pbmNsdWRlIHtpbmNsdWRlIGRpcn0gewotCWdsb2JhbCBpbmNsdWRlX3ZhcnMgZGVmcwotCi0JaWYgW2luZm8gZXhpc3RzIGluY2x1ZGVfdmFyc10gewotCQl1bnNldCBpbmNsdWRlX3ZhcnMKLQl9Ci0JCi0JZm9yZWFjaCBpbmMgW3NwbGl0ICRpbmNsdWRlICIsICJdIHsKLQkJc2V0IGYgW3N0cmluZyB0cmltICRpbmNdCi0jcHV0cyAiZj0kZiI7Ci0JCWlmIHskZiA9PSAiIn0gewotCQkJY29udGludWUKLQkJfQotCQlzZXQgdHJ5ICIiCi0JCWlmIHtbcmVnZXhwIHsvfSAkZl0gfHwgW3JlZ2V4cCB7XFx9ICRmXX0gewotCQkJc2V0IHRyeSAkZjsKLQkJfSBlbHNlIHsKLQkJCXNldCB0cnkgIiRkaXIvJGYiCi0JCX0KLQkJaWYgeyEgW2ZpbGUgZXhpc3RzICR0cnldfSB7Ci0JCQlzZXQgdHJ5ICIkZGlyLyRmLnZuYyIKLQkJfQotI3B1dHMgInRyeTogJHRyeSIKLQkJaWYgW2ZpbGUgZXhpc3RzICR0cnldIHsKLQkJCXNldCBmaCAiIgotCQkJY2F0Y2gge3NldCBmaCBbb3BlbiAkdHJ5ICJyIl19Ci0JCQlpZiB7JGZoID09ICIifSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCW1lc2cgIkFwcGx5aW5nIHRlbXBsYXRlOiAkaW5jIgotCQkJYWZ0ZXIgMTAwCi0JCQl3aGlsZSB7W2dldHMgJGZoIGxpbmVdID4gLTF9IHsKLQkJCQlhcHBlbmQgaW5jX3N0ciAiJGxpbmVcbiIKLQkJCQlpZiBbcmVnZXhwIHteKFtePV0qKT0oLiopJH0gJGxpbmUgbSB2YXIgdmFsXSB7Ci0JCQkJCWlmIHshIFtpbmZvIGV4aXN0cyBkZWZzKCR2YXIpXX0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlpZiB7JHZhciA9PSAiaW5jbHVkZV9saXN0In0gewotCQkJCQkJY29udGludWUKLQkJCQkJfQotCQkJCQlzZXQgcGN0IDAKLQkJCQkJaWYgeyR2YXIgPT0gInNtYl9tb3VudF9saXN0In0gewotCQkJCQkJc2V0IHBjdCAxCi0JCQkJCX0KLQkJCQkJaWYgeyR2YXIgPT0gInBvcnRfa25vY2tpbmdfbGlzdCJ9IHsKLQkJCQkJCXNldCBwY3QgMQotCQkJCQl9Ci0JCQkJCWlmIHskcGN0fSB7Ci0JCQkJCQlyZWdzdWIgLWFsbCB7JSUlfSAkdmFsICJcbiIgdmFsCi0JCQkJCX0KLQkJCQkJaWYgeyR2YWwgIT0gJGRlZnMoJHZhcil9IHsKLSNwdXRzICJpbmNsdWRlX3ZhcnMgJHZhciAkdmFsIgotCQkJCQkJc2V0IGluY2x1ZGVfdmFycygkdmFyKSAkdmFsCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCB7Y2xvc2UgJGZofQotCQl9Ci0JfQotfQotCi1wcm9jIHVuaXhfZGlhbG9nX3Jlc2l6ZSB7e3cgLn19IHsKLQlnbG9iYWwgZW52IGlzX3dpbmRvd3MgdW5hbWUgdW5peF9kaWFsb2dfc2l6ZQotCXNldCBvayAwCi0Jc2V0IHdpZHRoIDYwMAotCXNldCBoZWlnaHQgMzAwCi0JaWYge1tpbmZvIGV4aXN0cyBlbnYoU1NWTkNfQklHR0VSX0RJQUxPRyldfSB7Ci0JCXNldCBvayAxCi0JCWlmIHtbcmVnZXhwIHsoWzAtOV1bMC05XSopeChbMC05XVswLTldKil9ICRlbnYoU1NWTkNfQklHR0VSX0RJQUxPRykgbSB3aSBoZV19IHsKLQkJCXNldCB3aWR0aCAkd2k7Ci0JCQlzZXQgaGVpZ2h0ICRoZTsKLQkJfQotCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZW52KFVTRVIpXSAmJiAkZW52KFVTRVIpID09ICJydW5nZSJ9IHsKLQkJc2V0IG9rIDEKLQl9Ci0JaWYgeyRva30gewotCQkjIHRoaXMgaXMgYSBwZXJzb25hbCBoYWNrIGJlY2F1c2UgdGtfZ2V0T3BlbkZpbGUgc2l6ZSBpcyBub3QgY29uZmlndXJhYmxlLgotCQlpZiB7ISRpc193aW5kb3dzICYmICR1bmFtZSAhPSAiRGFyd2luIn0gewotCQkJaWYgeyR3ID09ICIuIn0gewotCQkJCXNldCB3MiAuX190a19maWxlZGlhbG9nCi0JCQl9IGVsc2UgewotCQkJCXNldCB3MiAkdy5fX3RrX2ZpbGVkaWFsb2cKLQkJCX0KLQkJCXNldCB3MyAkdzIuaWNvbnMuY2FudmFzCi0JCQlnbG9iYWwgdWRyX3c0Ci0JCQlzZXQgdWRyX3c0ICR3Mi5mMi5jYW5jZWwKLQkJCWlmIHshIFtpbmZvIGV4aXN0cyB1bml4X2RpYWxvZ19zaXplKCR3KV19IHsKLQkJCQlhZnRlciA1MCB7Z2xvYmFsIHVkcl93NDsgY2F0Y2ggeyR1ZHJfdzQgaW52b2tlfX0KLQkJCQl0a19nZXRPcGVuRmlsZSAtcGFyZW50ICR3IC1pbml0aWFsZGlyIC8KLQkJCQlzZXQgdW5peF9kaWFsb2dfc2l6ZSgkdykgMQotCQkJfQotCQkJaWYgW3dpbmZvIGV4aXN0cyAkdzNdIHsKLQkJCQljYXRjaCB7JHczIGNvbmZpZ3VyZSAtd2lkdGggJHdpZHRofQotCQkJCWNhdGNoIHskdzMgY29uZmlndXJlIC1oZWlnaHQgJGhlaWdodH0KLQkJCX0KLQkJfQotCX0KLX0KLQotcHJvYyBkZWxldGVfcHJvZmlsZSB7e3BhcmVudCAiLiJ9fSB7Ci0KLQlnbG9iYWxpemUKLQotCXNldCBkaXIgW2dldF9wcm9maWxlc19kaXJdCi0KLQl1bml4X2RpYWxvZ19yZXNpemUgJHBhcmVudAotCXNldCBmaWxlIFt0a19nZXRPcGVuRmlsZSAtcGFyZW50ICRwYXJlbnQgLWluaXRpYWxkaXIgJGRpciAtdGl0bGUgIkRFTEVURSBWTkMgUHJvZmlsZSJdCi0KLQlpZiB7JGZpbGUgPT0gIiJ9IHsKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IHRhaWwgW2ZpbGUgdGFpbCAkZmlsZV0KLQotCXNldCBhbnMgW3RrX21lc3NhZ2VCb3ggLXR5cGUgb2tjYW5jZWwgLXRpdGxlICJEZWxldGUgJHRhaWwiIC1tZXNzYWdlICJSZWFsbHkgRGVsZXRlICRmaWxlPyIgLWljb24gd2FybmluZ10KLQotCWlmIHskYW5zID09ICJvayJ9IHsKLQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmaWxlfQotCQltZXNnICJEZWxldGVkICR0YWlsIgotCX0gZWxzZSB7Ci0JCW1lc2cgIkRlbGV0ZSBTa2lwcGVkLiIKLQl9Ci19Ci0KLXByb2MgbG9hZF9wcm9maWxlIHt7cGFyZW50ICIuIn0ge2luZmlsZSAiIn19IHsKLQlnbG9iYWwgcHJvZmRvbmUKLQlnbG9iYWwgdm5jZGlzcGxheQotCi0JZ2xvYmFsaXplCi0KLQlzZXQgZGlyIFtnZXRfcHJvZmlsZXNfZGlyXQotCi0JaWYgeyRpbmZpbGUgIT0gIiJ9IHsKLQkJc2V0IGZpbGUgJGluZmlsZQotCX0gZWxzZSB7Ci0JCXVuaXhfZGlhbG9nX3Jlc2l6ZQotCQlzZXQgZmlsZSBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAkcGFyZW50IC1kZWZhdWx0ZXh0ZW5zaW9uIFwKLQkJCSIudm5jIiAtaW5pdGlhbGRpciAkZGlyIC10aXRsZSAiTG9hZCBWTkMgUHJvZmlsZSJdCi0JfQotCi0JaWYgeyRmaWxlID09ICIifSB7Ci0JCXNldCBwcm9mZG9uZSAxCi0JCXJldHVybgotCX0KLQlzZXQgZmggW29wZW4gJGZpbGUgInIiXQotCWlmIHshIFtpbmZvIGV4aXN0cyBmaF19IHsKLQkJc2V0IHByb2Zkb25lIDEKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IGdvdG9fbW9kZSAiIjsKLQlzZXQgc3RyICIiCi0Jc2V0IGluY2x1ZGUgIiIKLQlzZXQgc3cgMQotCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQlhcHBlbmQgc3RyICIkbGluZVxuIgotCQlpZiBbcmVnZXhwIHteaW5jbHVkZV9saXN0PSguKikkfSAkbGluZSBtIHZhbF0gewotCQkJc2V0IGluY2x1ZGUgJHZhbAotCQl9Ci0JCWdsb2JhbCBzc2hfb25seSB0c19vbmx5Ci0JCWlmIHskc3NoX29ubHkgfHwgJHRzX29ubHl9IHsKLQkJCWlmIFtyZWdleHAge3VzZV9zc2g9MH0gJGxpbmVdIHsKLQkJCQlpZiB7JHN3fSB7Ci0JCQkJCW1lc2cgIlN3aXRjaGluZyB0byBTU1ZOQyBtb2RlLiIKLQkJCQkJc2V0IGdvdG9fbW9kZSAic3N2bmMiCi0JCQkJCXVwZGF0ZQotCQkJCQlhZnRlciAzMDAKLQkJCQl9IGVsc2UgewotCQkJCQliZWxsCi0JCQkJCW1lc2cgIkNhbm5vdCBMb2FkIGFuIFNTTCBwcm9maWxlIGluIFNTSC1PTkxZIG1vZGUuIgotCQkJCQlzZXQgcHJvZmRvbmUgMQotCQkJCQljbG9zZSAkZmgKLQkJCQkJcmV0dXJuCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIHshICR0c19vbmx5fSB7Ci0JCQlpZiBbcmVnZXhwIHt0c19tb2RlPTF9ICRsaW5lXSB7Ci0JCQkJaWYgeyRzd30gewotCQkJCQltZXNnICJTd2l0Y2hpbmcgdG8gVGVybWluYWwgU2VydmljZXMgbW9kZS4iCi0JCQkJCXNldCBnb3RvX21vZGUgInRzb25seSIKLQkJCQkJdXBkYXRlCi0JCQkJCWFmdGVyIDMwMAotCQkJCX0gZWxzZSB7Ci0JCQkJCWJlbGwKLQkJCQkJbWVzZyAiQ2Fubm90IExvYWQgYSBUZXJtaW5hbCBTdmNzIHByb2ZpbGUgU1NWTkMgbW9kZS4iCi0JCQkJCXNldCBwcm9mZG9uZSAxCi0JCQkJCWNsb3NlICRmaAotCQkJCQlyZXR1cm4KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiBbcmVnZXhwIHt0c19tb2RlPTB9ICRsaW5lXSB7Ci0JCQkJaWYgeyRzd30gewotCQkJCQltZXNnICJTd2l0Y2hpbmcgdG8gU1NWTkMgbW9kZS4iCi0JCQkJCXNldCBnb3RvX21vZGUgInNzdm5jIgotCQkJCQl1cGRhdGUKLQkJCQkJYWZ0ZXIgMzAwCi0JCQkJfSBlbHNlIHsKLQkJCQkJYmVsbAotCQkJCQltZXNnICJDYW5ub3QgTG9hZCBhIFRlcm1pbmFsIFN2Y3MgcHJvZmlsZSBTU1ZOQyBtb2RlLiIKLQkJCQkJc2V0IHByb2Zkb25lIDEKLQkJCQkJY2xvc2UgJGZoCi0JCQkJCXJldHVybgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQljbG9zZSAkZmgKLQotCWlmIHskaW5jbHVkZSAhPSAiIn0gewotCQlsb2FkX2luY2x1ZGUgJGluY2x1ZGUgJGRpcgotCX0KLQotCWlmIHskZ290b19tb2RlID09ICJ0c29ubHkifSB7Ci0JCXRvX3Rzb25seQotCX0gZWxzZWlmIHskZ290b19tb2RlID09ICJzc3ZuYyJ9IHsKLQkJdG9fc3N2bmMKLQl9IGVsc2VpZiB7JGdvdG9fbW9kZSA9PSAic3Nodm5jIn0gewotCQl0b19zc2h2bmMKLQl9Ci0Jc2V0X2RlZmF1bHRzCi0KLQlnbG9iYWwgaW5jbHVkZV92YXJzCi0JaWYgW2luZm8gZXhpc3RzIGluY2x1ZGVfdmFyc10gewotCQlmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgaW5jbHVkZV92YXJzXSB7Ci0JCQlzZXQgJHZhciAkaW5jbHVkZV92YXJzKCR2YXIpCi0JCX0KLQl9Ci0KLQotCWdsb2JhbCB1c2Vfc3NsIHVzZV9zc2ggdXNlX3NzaHNzbAotCXNldCB1c2Vfc3NsIDAKLQlzZXQgdXNlX3NzaCAwCi0Jc2V0IHVzZV9zc2hzc2wgMAotCi0JZ2xvYmFsIGRlZnMKLQlmb3JlYWNoIGxpbmUgW3NwbGl0ICRzdHIgIlxuIl0gewotCQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JCWlmIFtyZWdleHAge14jfSAkbGluZV0gewotCQkJY29udGludWUKLQkJfQotCQlpZiBbcmVnZXhwIHteKFtePV0qKT0oLiopJH0gJGxpbmUgbSB2YXIgdmFsXSB7Ci0JCQlpZiB7JHZhciA9PSAiZGlzcCJ9IHsKLQkJCQlzZXQgdm5jZGlzcGxheSAkdmFsCi0JCQkJY29udGludWUKLQkJCX0KLQkJCWlmIFtpbmZvIGV4aXN0cyBkZWZzKCR2YXIpXSB7Ci0JCQkJc2V0IHBjdCAwCi0JCQkJaWYgeyR2YXIgPT0gInNtYl9tb3VudF9saXN0In0gewotCQkJCQlzZXQgcGN0IDEKLQkJCQl9Ci0JCQkJaWYgeyR2YXIgPT0gInBvcnRfa25vY2tpbmdfbGlzdCJ9IHsKLQkJCQkJc2V0IHBjdCAxCi0JCQkJfQotCQkJCWlmIHskcGN0fSB7Ci0JCQkJCXJlZ3N1YiAtYWxsIHslJSV9ICR2YWwgIlxuIiB2YWwKLQkJCQl9Ci0JCQkJc2V0ICR2YXIgJHZhbAotCQkJfQotCQl9Ci0JfQotCi0JaW5pdF92bmNkaXNwbGF5Ci0JaWYgeyEgJHVzZV9zc2wgJiYgISAkdXNlX3NzaCAmJiAhICR1c2Vfc3Noc3NsfSB7Ci0JCWlmIHshICRkaXNhYmxlX2FsbF9lbmNyeXB0aW9ufSB7Ci0JCQlzZXQgdXNlX3NzbCAxCi0JCX0KLQl9Ci0JaWYgeyR1c2Vfc3NsfSB7Ci0JCXNldCB1c2Vfc3NoIDAKLQkJc2V0IHVzZV9zc2hzc2wgMAotCX0gZWxzZWlmIHskdXNlX3NzaCAmJiAkdXNlX3NzaHNzbH0gewotCQlzZXQgdXNlX3NzaCAwCi0JfQotCXN5bmNfdXNlX3NzbF9zc2gKLQotCXNldCBjb21wcmVzc2xldmVsX3RleHQgIkNvbXByZXNzIExldmVsOiAkdXNlX2NvbXByZXNzbGV2ZWwiCi0Jc2V0IHF1YWxpdHlfdGV4dCAiUXVhbGl0eTogJHVzZV9xdWFsaXR5IgotCi0Jc2V0IHByb2Zkb25lIDEKLQlwdXR0eV9wd19lbnRyeSBjaGVjawotCWxpc3Rlbl9hZGp1c3QKLQl1bml4cHdfYWRqdXN0Ci0KLQlnbG9iYWwgbGFzdF9sb2FkCi0Jc2V0IGxhc3RfbG9hZCBbZmlsZSB0YWlsICRmaWxlXQotCi0JZ2xvYmFsIHVuYW1lIGRhcndpbl9jb3R2bmMKLQlpZiB7JHVuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCWlmIHskdXNlX3gxMV9tYWNvc3h9IHsKLQkJCXNldCBkYXJ3aW5fY290dm5jIDA7Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgZGFyd2luX2NvdHZuYyAxOwotCQl9Ci0JfQotCi0JbWVzZyAiTG9hZGVkIFtmaWxlIHRhaWwgJGZpbGVdIgotfQotCi1wcm9jIHN5bmNfdXNlX3NzbF9zc2gge30gewotCWdsb2JhbCB1c2Vfc3NsIHVzZV9zc2ggdXNlX3NzaHNzbAotCWdsb2JhbCBkaXNhYmxlX2FsbF9lbmNyeXB0aW9uCi0JaWYgeyR1c2Vfc3NsfSB7Ci0JCXNzbF9zc2hfYWRqdXN0IHNzbAotCX0gZWxzZWlmIHskdXNlX3NzaH0gewotCQlzc2xfc3NoX2FkanVzdCBzc2gKLQl9IGVsc2VpZiB7JHVzZV9zc2hzc2x9IHsKLQkJc3NsX3NzaF9hZGp1c3Qgc3Noc3NsCi0JfSBlbHNlaWYgeyRkaXNhYmxlX2FsbF9lbmNyeXB0aW9ufSB7Ci0JCXNzbF9zc2hfYWRqdXN0IG5vbmUKLQl9IGVsc2UgewotCQlzc2xfc3NoX2FkanVzdCBzc2wKLQl9Ci19Ci0KLXByb2Mgc2F2ZV9wcm9maWxlIHt7cGFyZW50ICIuIn19IHsKLQlnbG9iYWwgaXNfd2luZG93cyB1bmFtZQotCWdsb2JhbCBwcm9mZG9uZQotCWdsb2JhbCBpbmNsdWRlX3ZhcnMgZGVmcwotCWdsb2JhbCB0c19vbmx5Ci0JZ2xvYmFsIGxhc3RfbG9hZAotCi0JZ2xvYmFsaXplCi0JCi0Jc2V0IGRpciBbZ2V0X3Byb2ZpbGVzX2Rpcl0KLQotCXNldCB2bmNkaXNwIFtnZXRfdm5jZGlzcGxheV0KLQotCXNldCBkaXNwZiBbc3RyaW5nIHRyaW0gJHZuY2Rpc3BdCi0JaWYgeyRkaXNwZiAhPSAiIn0gewotCQlyZWdzdWIge1sgCV0uKiR9ICRkaXNwZiAiIiBkaXNwZgotCQlyZWdzdWIgLWFsbCB7L30gJGRpc3BmICIiIGRpc3BmCi0JfSBlbHNlIHsKLQkJZ2xvYmFsIHRzX29ubHkKLQkJaWYgeyR0c19vbmx5fSB7Ci0JCQltZXNnICJObyBWTkMgVGVybWluYWwgU2VydmVyIHN1cHBsaWVkLiIKLQkJfSBlbHNlIHsKLQkJCW1lc2cgIk5vIFZOQyBIb3N0OkRpc3Agc3VwcGxpZWQuIgotCQl9Ci0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCWlmIHskaXNfd2luZG93cyB8fCAkdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJcmVnc3ViIC1hbGwgezp9ICRkaXNwZiAiLSIgZGlzcGYKLQl9IGVsc2UgewotCQlyZWdzdWIgLWFsbCB7On0gJGRpc3BmICItIiBkaXNwZgotCX0KLQlyZWdzdWIgLWFsbCB7W1xbXF1dfSAkZGlzcGYgIiIgZGlzcGYKLQlpZiB7JHRzX29ubHkgJiYgIVtyZWdleHAge15UUy19ICRkaXNwZl19IHsKLQkJc2V0IGRpc3BmICJUUy0kZGlzcGYiCi0JfQotCWlmIHshW3JlZ2V4cCB7XC52bmMkfSAkZGlzcGZdfSB7Ci0JCXNldCBkaXNwZiAiJGRpc3BmLnZuYyIKLQl9Ci0KLQlzZXQgZ3Vlc3MgJGRpc3BmCi0JaWYgeyRsYXN0X2xvYWQgIT0gIiJ9IHsKLQkJc2V0IGd1ZXNzICRsYXN0X2xvYWQKLQl9Ci0KLQl1bml4X2RpYWxvZ19yZXNpemUKLQlzZXQgZmlsZSBbdGtfZ2V0U2F2ZUZpbGUgLXBhcmVudCAkcGFyZW50IC1kZWZhdWx0ZXh0ZW5zaW9uICIudm5jIiBcCi0JCS1pbml0aWFsZGlyICRkaXIgLWluaXRpYWxmaWxlICIkZ3Vlc3MiIC10aXRsZSAiU2F2ZSBWTkMgUHJvZmlsZSJdCi0JaWYgeyRmaWxlID09ICIifSB7Ci0JCXNldCBwcm9mZG9uZSAxCi0JCXJldHVybgotCX0KLQlzZXQgZmggW29wZW4gJGZpbGUgInciXQotCWlmIHshIFtpbmZvIGV4aXN0cyBmaF19IHsKLQkJc2V0IHByb2Zkb25lIDEKLQkJcmV0dXJuCi0JfQotCXNldCBoIFtzdHJpbmcgdHJpbSAkdm5jZGlzcF0KLQlzZXQgcCAkaAotCSMgWFhYIGhvc3RfcGFydAotCXJlZ3N1YiB7OlswLTldWzAtOV0qJH0gJGggIiIgaAotCXNldCBob3N0ICRoCi0JcmVnc3ViIHtbIAldLiokfSAkcCAiIiBwCi0JcmVnc3ViIHteLio6fSAkcCAiIiBwCi0JcmVnc3ViIHsgLiokfSAkcCAiIiBwCi0JaWYgeyRwID09ICIifSB7Ci0JCXNldCBwIDAKLQl9IGVsc2VpZiB7IVtyZWdleHAge15bLTAtOV1bMC05XSokfSAkcF19IHsKLQkJc2V0IHAgMAotCX0KLQlpZiB7JHAgPCAwfSB7Ci0JCXNldCBwb3J0ICRwCi0JfSBlbHNlaWYgeyRwIDwgMjAwfSB7Ci0JCXNldCBwb3J0IFtleHByICRwICsgNTkwMF0KLQl9IGVsc2UgewotCQlzZXQgcG9ydCAkcAotCX0KLQotCXNldCBoIFtzdHJpbmcgdHJpbSAkdm5jZGlzcF0KLQlyZWdzdWIge2NtZD0uKiR9ICRoICIiIGgKLQlzZXQgaCBbc3RyaW5nIHRyaW0gJGhdCi0JaWYgeyEgW3JlZ2V4cCB7WyAJXX0gJGhdfSB7Ci0JCXNldCBoICIiCi0JfSBlbHNlIHsKLQkJcmVnc3ViIHteLipbIAldfSAkaCAiIiBoCi0JfQotCWlmIHskaCA9PSAiIn0gewotCQlzZXQgcHJveHkgIiIKLQkJc2V0IHByb3h5cG9ydCAiIgotCX0gZWxzZSB7Ci0JCXNldCBwICRoCi0JCXJlZ3N1YiB7OlswLTldWzAtOV0qJH0gJGggIiIgaAotCQlzZXQgcHJveHkgJGgKLQkJcmVnc3ViIHtbIAldLiokfSAkcCAiIiBwCi0JCXJlZ3N1YiB7Xi4qOn0gJHAgIiIgcAotCQlpZiB7JHAgPT0gIiJ9IHsKLQkJCXNldCBwcm94eXBvcnQgMAotCQl9IGVsc2UgewotCQkJc2V0IHByb3h5cG9ydCAkcAotCQl9Ci0JfQotCQotCXB1dHMgJGZoICJcW2Nvbm5lY3Rpb25cXSIKLQlwdXRzICRmaCAiaG9zdD0kaG9zdCIKLQlwdXRzICRmaCAicG9ydD0kcG9ydCIKLQlwdXRzICRmaCAicHJveHlob3N0PSRwcm94eSIKLQlwdXRzICRmaCAicHJveHlwb3J0PSRwcm94eXBvcnQiCi0JcHV0cyAkZmggImRpc3A9JHZuY2Rpc3AiCi0JcHV0cyAkZmggIlxuXFtvcHRpb25zXF0iCi0JcHV0cyAkZmggIiMgcGFyYW1ldGVycyBjb21tZW50ZWQgb3V0IHdpdGggJyMnIGluZGljYXRlIHRoZSBkZWZhdWx0IHNldHRpbmcuIgotCi0JaWYgeyRpbmNsdWRlX2xpc3QgIT0gIiJ9IHsKLQkJbG9hZF9pbmNsdWRlICRpbmNsdWRlX2xpc3QgW2dldF9wcm9maWxlc19kaXJdCi0JfQotCWdsb2JhbCBzc2hzc2xfc3cKLQlpZiB7ISAkdXNlX3NzbCAmJiAhICR1c2Vfc3NoICYmICEgJHVzZV9zc2hzc2x9IHsKLQkJaWYgeyRzc2hzc2xfc3cgPT0gIm5vbmUifSB7Ci0JCQlzZXQgZGlzYWJsZV9hbGxfZW5jcnlwdGlvbiAxCi0JCX0KLQl9Ci0KLQlnbG9iYWwgdHNfb25seSBzc2hfb25seQotCWlmIHskdHNfb25seX0gewotCQlzZXQgdHNfbW9kZSAxCi0JfSBlbHNlIHsKLQkJc2V0IHRzX21vZGUgMAotCX0KLQlmb3JlYWNoIHZhciBbbHNvcnQgW2FycmF5IG5hbWVzIGRlZnNdXSB7Ci0JCWV2YWwgc2V0IHZhbCBcJCR2YXIKLQkJc2V0IHByZSAiIgotCQlpZiB7JHZhbCA9PSAkZGVmcygkdmFyKX0gewotCQkJc2V0IHByZSAiIyIKLQkJfQotCQlpZiB7JHNzaF9vbmx5ICYmICR2YXIgPT0gInVzZV9zc2gifSB7Ci0JCQlzZXQgcHJlICIiCi0JCX0KLQkJc2V0IHBjdCAwCi0JCWlmIHskdmFyID09ICJzbWJfbW91bnRfbGlzdCJ9IHsKLQkJCXNldCBwY3QgMQotCQl9Ci0JCWlmIHskdmFyID09ICJwb3J0X2tub2NraW5nX2xpc3QifSB7Ci0JCQlzZXQgcGN0IDEKLQkJfQotCQlpZiB7JGluY2x1ZGVfbGlzdCAhPSAiIiAmJiBbaW5mbyBleGlzdHMgaW5jbHVkZV92YXJzKCR2YXIpXX0gewotCQkJaWYgeyR2YWwgPT0gJGluY2x1ZGVfdmFycygkdmFyKX0gewotCQkJCWlmIHskcGN0fSB7Ci0JCQkJCXJlZ3N1YiAtYWxsICJcbiIgJHZhbCAiJSUlIiB2YWwKLQkJCQl9Ci0JCQkJcHV0cyAkZmggIiNmcm9tIGluY2x1ZGU6ICR2YXI9JHZhbCIKLQkJCQljb250aW51ZQotCQkJfQotCQl9Ci0JCWlmIHskcGN0fSB7Ci0JCQlyZWdzdWIgLWFsbCAiXG4iICR2YWwgIiUlJSIgdmFsCi0JCX0KLQkJcHV0cyAkZmggIiRwcmUkdmFyPSR2YWwiCi0JfQotCi0JY2xvc2UgJGZoCi0KLQltZXNnICJTYXZlZCBQcm9maWxlOiBbZmlsZSB0YWlsICRmaWxlXSIKLQotCXNldCBsYXN0X2xvYWQgW2ZpbGUgdGFpbCAkZmlsZV0KLQotCXNldCBwcm9mZG9uZSAxCi19Ci0KLXByb2Mgc2V0X3NzaCB7fSB7Ci0JZ2xvYmFsIHVzZV9zc2wKLQlpZiB7JHVzZV9zc2x9IHsKLQkJc3NsX3NzaF9hZGp1c3Qgc3NoCi0JfQotfQotCi1wcm9jIGV4cGFuZF9JUCB7cmVkaXJ9IHsKLQlpZiB7ISBbcmVnZXhwIHs6SVA6fSAkcmVkaXJdfSB7Ci0JCXJldHVybiAkcmVkaXIKLQl9Ci0JaWYgeyEgW3JlZ2V4cCB7KC1SKS4qOklQOn0gJHJlZGlyXX0gewotCQlyZXR1cm4gJHJlZGlyCi0JfQotCi0Jc2V0IGlwIFtndWVzc19pcF0KLQlzZXQgaXAgW3N0cmluZyB0cmltICRpcF0KLQlpZiB7JGlwID09ICIifSB7Ci0JCXJldHVybiAkcmVkaXIKLQl9Ci0KLQlyZWdzdWIgLWFsbCB7OklQOn0gJHJlZGlyICI6JGlwOiIgcmVkaXIKLQlyZXR1cm4gJHJlZGlyCi19Ci0KLXByb2MgcmFuZF9wb3J0IHt9IHsKLQlnbG9iYWwgcmFuZF9wb3J0X2xpc3QKLQotCXNldCBwICIiCi0JZm9yIHtzZXQgaSAwfSB7JGkgPCAzMH0ge2luY3IgaX0gewotCQlzZXQgcCBbZXhwciAyNTAwMCArIDM1MDAwICogcmFuZCgpXQkKLQkJc2V0IHAgW2V4cHIgcm91bmQoJHApXQotCQlpZiB7IVtpbmZvIGV4aXN0cyByYW5kX3BvcnRfbGlzdCgkcCldfSB7Ci0JCQlicmVhawotCQl9Ci0JfQotCWlmIHskcCA9PSAiIn0gewotCQl1bnNldCByYW5kX3BvcnRfbGlzdAotCQlzZXQgcCBbZXhwciAyNTAwMCArIDM1MDAwICogcmFuZCgpXQkKLQkJc2V0IHAgW2V4cHIgcm91bmQoJHApXQotCX0KLQlzZXQgcmFuZF9wb3J0X2xpc3QoJHApIDEKLQlyZXR1cm4gJHAKLX0KLQotcHJvYyBnZXRfY3Vwc19yZWRpciB7fSB7Ci0JZ2xvYmFsIGN1cHNfbG9jYWxfc2VydmVyIGN1cHNfcmVtb3RlX3BvcnQKLQlnbG9iYWwgY3Vwc19sb2NhbF9zbWJfc2VydmVyIGN1cHNfcmVtb3RlX3NtYl9wb3J0Ci0KLQlyZWdzdWIgLWFsbCB7WyAJXX0gJGN1cHNfbG9jYWxfc2VydmVyICIiIGN1cHNfbG9jYWxfc2VydmVyCi0JcmVnc3ViIC1hbGwge1sgCV19ICRjdXBzX3JlbW90ZV9wb3J0ICIiIGN1cHNfcmVtb3RlX3BvcnQKLQlyZWdzdWIgLWFsbCB7WyAJXX0gJGN1cHNfbG9jYWxfc21iX3NlcnZlciAiIiBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIKLQlyZWdzdWIgLWFsbCB7WyAJXX0gJGN1cHNfcmVtb3RlX3NtYl9wb3J0ICIiIGN1cHNfcmVtb3RlX3NtYl9wb3J0Ci0KLQlzZXQgcmVkaXIgIiIKLQotCWlmIHskY3Vwc19sb2NhbF9zZXJ2ZXIgIT0gIiIgJiYgJGN1cHNfcmVtb3RlX3BvcnQgIT0gIiJ9IHsKLQkJc2V0IHJlZGlyICIkY3Vwc19yZW1vdGVfcG9ydDokY3Vwc19sb2NhbF9zZXJ2ZXIiCi0JCXJlZ3N1YiAtYWxsIHtbJyIgCV19ICRyZWRpciB7fSByZWRpcjsgIyIKLQkJc2V0IHJlZGlyICIgLVIgJHJlZGlyIgotCX0KLQlpZiB7JGN1cHNfbG9jYWxfc21iX3NlcnZlciAhPSAiIiAmJiAkY3Vwc19yZW1vdGVfc21iX3BvcnQgIT0gIiJ9IHsKLQkJc2V0IHJlZGlyMiAiJGN1cHNfcmVtb3RlX3NtYl9wb3J0OiRjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIiCi0JCXJlZ3N1YiAtYWxsIHtbJyIgCV19ICRyZWRpcjIge30gcmVkaXIyOyAjIgotCQlzZXQgcmVkaXIgIiRyZWRpciAtUiAkcmVkaXIyIgotCX0KLQlzZXQgcmVkaXIgW2V4cGFuZF9JUCAkcmVkaXJdCi0JcmV0dXJuICRyZWRpcgotfQotCi1wcm9jIGdldF9hZGRpdGlvbmFsX3JlZGlyIHt9IHsKLQlnbG9iYWwgYWRkaXRpb25hbF9wb3J0X3JlZGlycyBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzX2xpc3QKLQlnbG9iYWwgdHNfb25seSBjaG9vc2VfeDExdm5jX29wdHMKLQlpZiB7ISAkYWRkaXRpb25hbF9wb3J0X3JlZGlycyB8fCAkYWRkaXRpb25hbF9wb3J0X3JlZGlyc19saXN0ID09ICIifSB7Ci0JCXJldHVybiAiIgotCX0KLQlpZiB7JHRzX29ubHkgJiYgISRjaG9vc2VfeDExdm5jX29wdHN9IHsKLQkJcmV0dXJuICIiCi0JfQotCXNldCByZWRpciBbc3RyaW5nIHRyaW0gJGFkZGl0aW9uYWxfcG9ydF9yZWRpcnNfbGlzdF0KLQlyZWdzdWIgLWFsbCB7WyciXX0gJHJlZGlyIHt9IHJlZGlyOyAjIgotCXNldCByZWRpciAiICRyZWRpciIKLQlzZXQgcmVkaXIgW2V4cGFuZF9JUCAkcmVkaXJdCi0JcmV0dXJuICRyZWRpcgotfQotCi1wcm9jIGdldF9zb3VuZF9yZWRpciB7fSB7Ci0JZ2xvYmFsIHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCBzb3VuZF9kYWVtb25fbG9jYWxfcG9ydAotCWdsb2JhbCBzb3VuZF9kYWVtb25feDExdm5jCi0KLQlyZWdzdWIgLWFsbCB7WyAJXX0gJHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCAiIiBzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQKLQlyZWdzdWIgLWFsbCB7WyAJXX0gJHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0ICIiIHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0Ci0KLQlzZXQgcmVkaXIgIiIKLQlpZiB7JHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0ID09ICIiIHx8ICRzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQgPT0gIiJ9IHsKLQkJcmV0dXJuICRyZWRpcgotCX0KLQotCXNldCBsb2MgJHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0Ci0JaWYgeyEgW3JlZ2V4cCB7On0gJGxvY119IHsKLQkJZ2xvYmFsIHVuYW1lCi0JCWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJCXNldCBsb2MgIjEyNy4wLjAuMTokbG9jIgotCQl9IGVsc2UgewotCQkJZ2xvYmFsIGlzX3dpbmRvd3MKLQkJCWlmIHskaXNfd2luZG93c30gewotCQkJCWdsb2JhbCB3aW5fbG9jYWxob3N0Ci0JCQkJc2V0IGxvYyAiJHdpbl9sb2NhbGhvc3Q6JGxvYyIKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IGxvYyAibG9jYWxob3N0OiRsb2MiCi0JCQl9Ci0JCX0KLQl9Ci0Jc2V0IHJlZGlyICIkc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0OiRsb2MiCi0JcmVnc3ViIC1hbGwge1snIiAJXX0gJHJlZGlyIHt9IHJlZGlyOyAjIgotCXNldCByZWRpciAiIC1SICRyZWRpciIKLQlzZXQgcmVkaXIgW2V4cGFuZF9JUCAkcmVkaXJdCi0JcmV0dXJuICRyZWRpcgotfQotCi1wcm9jIGdldF9zbWJfcmVkaXIge30gewotCWdsb2JhbCBzbWJfbW91bnRfbGlzdAotCi0Jc2V0IHMgW3N0cmluZyB0cmltICRzbWJfbW91bnRfbGlzdF0KLQlpZiB7JHMgPT0gIiJ9IHsKLQkJcmV0dXJuICIiCi0JfQotCi0Jc2V0IGRpZCgwKSAxCi0Jc2V0IHJlZGlyICIiCi0Jc2V0IG1udGxpc3QgIiIKLQotCWZvcmVhY2ggbGluZSBbc3BsaXQgJHMgIlxyXG4iXSB7Ci0JCXNldCBzdHIgW3N0cmluZyB0cmltICRsaW5lXSAKLQkJaWYgeyRzdHIgPT0gIiJ9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYge1tyZWdleHAge14jfSAkc3RyXX0gewotCQkJY29udGludWUKLQkJfQotCi0JCXNldCBwb3J0ICIiCi0JCWlmIFtyZWdleHAge14oWzAtOV1bMC05XSopWyBcdF1bIFx0XSooLiopfSAkc3RyIG12YXIgcG9ydCByZXN0XSB7Ci0JCQkjIGxlYWRpbmcgcG9ydAotCQkJc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHJlc3RdCi0JCX0KLQotCQkjIGdyYWI6ICAvL3NoYXJlIC9kZXN0IFtob3N0Wzpwb3J0XV0KLQkJc2V0IHNoYXJlICIiCi0JCXNldCBkZXN0ICIiCi0JCXNldCBob3N0cG9ydCAiIgotCQlmb3JlYWNoIGl0ZW0gW3NwbGl0ICRzdHJdIHsKLQkJCWlmIHskaXRlbSA9PSAiIn0gewotCQkJCWNvbnRpbnVlCi0JCQl9Ci0JCQlpZiB7JHNoYXJlID09ICIifSB7Ci0JCQkJc2V0IHNoYXJlIFtzdHJpbmcgdHJpbSAkaXRlbV0KLQkJCX0gZWxzZWlmIHskZGVzdCA9PSAiIn0gewotCQkJCXNldCBkZXN0IFtzdHJpbmcgdHJpbSAkaXRlbV0KLQkJCX0gZWxzZWlmIHskaG9zdHBvcnQgPT0gIiJ9IHsKLQkJCQlzZXQgaG9zdHBvcnQgW3N0cmluZyB0cmltICRpdGVtXQotCQkJfQotCQl9Ci0KLQkJcmVnc3ViIHtefi99ICRkZXN0IHskSE9NRS99IGRlc3QKLQotCQkjIHdvcmsgb3V0IHRoZSBsb2NhbCBob3N0OnBvcnQKLQkJc2V0IGxob3N0ICIiCi0JCXNldCBscG9ydCAiIgotCQlpZiB7JGhvc3Rwb3J0ICE9ICIifSB7Ci0JCQlpZiBbcmVnZXhwIHsoLiopOihbMC05XVswLTldKil9ICRob3N0cG9ydCBtdmFyIGxob3N0IGxwb3J0XSB7Ci0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlzZXQgbGhvc3QgJGhvc3Rwb3J0Ci0JCQkJc2V0IGxwb3J0IDEzOQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgW3JlZ2V4cCB7Ly8oW14vXVteL10qKS99ICRzaGFyZSBtdmFyIGhdIHsKLQkJCQlpZiBbcmVnZXhwIHsoLiopOihbMC05XVswLTldKil9ICRoIG12YXIgbGhvc3QgbHBvcnRdIHsKLQkJCQkJOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBsaG9zdCAkaAotCQkJCQlzZXQgbHBvcnQgMTM5Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnbG9iYWwgaXNfd2luZG93cyB3aW5fbG9jYWxob3N0Ci0JCQkJc2V0IGxob3N0ICJsb2NhbGhvc3QiCi0JCQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQkJCXNldCBsaG9zdCAkd2luX2xvY2FsaG9zdAotCQkJCX0KLQkJCQlzZXQgbHBvcnQgMTM5Ci0JCQl9Ci0JCX0KLQotCQlpZiB7JHBvcnQgPT0gIiJ9IHsKLQkJCWlmIFtpbmZvIGV4aXN0cyBkaWQoIiRsaG9zdDokbHBvcnQiKV0gewotCQkJCSMgcmV1c2UgcHJldmlvdXMgb25lOgotCQkJCXNldCBwb3J0ICRkaWQoIiRsaG9zdDokbHBvcnQiKQotCQkJfSBlbHNlIHsKLQkJCQkjIGNob29zZSBvbmUgYXQgcmFuZG9tOgotCQkJCWZvciB7c2V0IGkgMH0geyRpIDwgM30ge2luY3IgaX0gewotCQkJCQlzZXQgcG9ydCBbZXhwciAyMDEwMCArIDkwMDAgKiByYW5kKCldCQotCQkJCQlzZXQgcG9ydCBbZXhwciByb3VuZCgkcG9ydCldCi0JCQkJCWlmIHsgISBbaW5mbyBleGlzdHMgZGlkKCRwb3J0KV0gfSB7Ci0JCQkJCQlicmVhawotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2V0IGRpZCgkcG9ydCkgMQotCQl9Ci0KLQkJaWYgeyRtbnRsaXN0ICE9ICIifSB7Ci0JCQlhcHBlbmQgbW50bGlzdCAiICIKLQkJfQotCQlhcHBlbmQgbW50bGlzdCAiJHNoYXJlLCRkZXN0LCRwb3J0IgotCi0JCWlmIHsgISBbaW5mbyBleGlzdHMgZGlkKCIkbGhvc3Q6JGxwb3J0IildIH0gewotCQkJYXBwZW5kIHJlZGlyICIgLVIgJHBvcnQ6JGxob3N0OiRscG9ydCIKLQkJCXNldCBkaWQoIiRsaG9zdDokbHBvcnQiKSAkcG9ydAotCQl9Ci0JfQotCi0JcmVnc3ViIC1hbGwge1snIl19ICRyZWRpciB7fSByZWRpcjsgIyIKLQlzZXQgcmVkaXIgW2V4cGFuZF9JUCAkcmVkaXJdCi0KLQlyZWdzdWIgLWFsbCB7WyciXX0gJG1udGxpc3Qge30gbW50bGlzdDsgIyIKLQotCXNldCBsIFtsaXN0XQotCWxhcHBlbmQgbCAkcmVkaXIKLQlsYXBwZW5kIGwgJG1udGxpc3QKLQlyZXR1cm4gJGwKLX0KLQotcHJvYyB1Z2x5X3NldHVwX3NjcmlwdHMge21vZGUgdGFnfSB7Ci0KLXNldCBjbWQoMSkgewotCVNTSERfUElEPSIiCi0JRkxBRz0kSE9NRS8udm5jLWhlbHBlci1mbGFnX19QSURfXwotCi0JaWYgWyAiWCRVU0VSIiA9ICJYIiBdOyB0aGVuCi0JCVVTRVI9JExPR05BTUUKLQlmaQotCi0JRE9fQ1VQUz0wCi0JY3Vwc19kaXI9JEhPTUUvLmN1cHMKLQljdXBzX2NmZz0kY3Vwc19kaXIvY2xpZW50LmNvbmYKLQljdXBzX2hvc3Q9bG9jYWxob3N0Ci0JY3Vwc19wb3J0PU5OTk4KLQotCURPX1NNQj0wCi0JRE9fU01CX1NVPTAKLQlET19TTUJfV0FJVD0wCi0Jc21iX21vdW50cz0KLQlET05FX1BPUlRfQ0hFQ0s9Tk5OTgotCXNtYl9zY3JpcHQ9JEhPTUUvLnNtYi1tb3VudHNfX1BJRF9fLnNoCi0KLQlET19TT1VORD0wCi0JRE9fU09VTkRfS0lMTD0wCi0JRE9fU09VTkRfUkVTVEFSVD0wCi0Jc291bmRfZGFlbW9uX3JlbW90ZV9wcm9nPQotCXNvdW5kX2RhZW1vbl9yZW1vdGVfYXJncz0KLQotCWZpbmRwaWQoKSB7Ci0JCWRiPTAKLQkJYmFjaz0zMAotCQl0b3VjaCAkRkxBRwotCQl0dHk9YHR0eSB8IHNlZCAtZSAicywvZGV2LywsImAKLQotCQlpZiBbICJYJFRPUFBJRCIgPSAiWCIgXTsgdGhlbgotCQkJVE9QUElEPSQkCi0JCQlpZiBbICRkYiA9IDEgXTsgdGhlbiBlY2hvICJzZXQgVE9QUElEIHRvICRUT1BQSUQiOyBmaQotCQkJYmFjaz03MAotCQlmaQotCQkjYmFjaz01Ci0JCWlmIFsgJGRiID0gMSBdOyB0aGVuIGVjaG8gIlRPUFBJRD0kVE9QUElEIFRISVNQSUQ9JCQgYmFjaz0kYmFjayI7IGZpCi0KLQkJaT0xCi0JCXdoaWxlIFsgJGkgLWx0ICRiYWNrIF0KLQkJZG8KLQkJCXRyeT1gZXhwciAkVE9QUElEIC0gJGlgCi0JCQlpZiBbICR0cnkgLWx0IDEgXTsgdGhlbgotCQkJCXRyeT1gZXhwciAzMjc2OCArICR0cnlgCi0JCQlmaQotCQkJaWYgWyAkZGIgPSAxIF07IHRoZW4gZWNobyB0cnktMT0kdHJ5OyBwcyAkdHJ5OyBmaQotCQkJaWYgcHMgJHRyeSAyPi9kZXYvbnVsbCB8IGdyZXAgInNzaGQuKiRVU0VSIiB8IGdyZXAgIiR0dHkiID4vZGV2L251bGw7IHRoZW4KLQkJCQlpZiBbICRkYiA9IDEgXTsgdGhlbiBlY2hvIEZvdW5kPSR0cnk7IGZpCi0JCQkJU1NIRF9QSUQ9IiR0cnkiCQotCQkJCWVjaG8KLQkJCQlwcyAkdHJ5Ci0JCQkJZWNobwotCQkJCWJyZWFrCi0JCQlmaQotCQkJaT1gZXhwciAkaSArIDFgCi0JCWRvbmUKLQotCQlpZiBbICJYJFNTSERfUElEIiA9ICJYIiBdOyB0aGVuCi0JCQliYWNrPWBleHByICRiYWNrICsgMjBgCi0JCQkjYmFjaz01Ci0KLQkJCWZvciBmYWxsYmFjayBpbiAyIDMKLQkJCWRvCi0JCQkJaT0xCi0JCQkJd2hpbGUgWyAkaSAtbHQgJGJhY2sgXQotCQkJCWRvCi0JCQkJCXRyeT1gZXhwciAkVE9QUElEIC0gJGlgCi0JCQkJCWlmIFsgJHRyeSAtbHQgMSBdOyB0aGVuCi0JCQkJCQl0cnk9YGV4cHIgMzI3NjggKyAkdHJ5YAotCQkJCQlmaQotCQkJCQltYXRjaD0ic3NoZC4qJFVTRVIiCi0JCQkJCWlmIFsgJGZhbGxiYWNrID0gMyBdOyB0aGVuCi0JCQkJCQltYXRjaD0ic3NoZCIKLQkJCQkJZmkKLQkJCQkJaWYgWyAkZGIgPSAxIF07IHRoZW4gZWNobyAidHJ5LSRmYWxsYmFjaz0kdHJ5IG1hdGNoPSRtYXRjaCI7IHBzICR0cnk7IGZpCi0JCQkJCWlmIHBzICR0cnkgMj4vZGV2L251bGwgfCBncmVwICIkbWF0Y2giID4vZGV2L251bGw7IHRoZW4KLQkJCQkJCWlmIFsgJGRiID0gMSBdOyB0aGVuIGVjaG8gRm91bmQ9JHRyeTsgZmkKLQkJCQkJCVNTSERfUElEPSIkdHJ5IgkKLQkJCQkJCWVjaG8KLQkJCQkJCXBzICR0cnkKLQkJCQkJCWVjaG8KLQkJCQkJCWJyZWFrCi0JCQkJCWZpCi0JCQkJCWk9YGV4cHIgJGkgKyAxYAotCQkJCWRvbmUKLQkJCQlpZiBbICJYJFNTSERfUElEIiAhPSAiWCIgXTsgdGhlbgotCQkJCQlicmVhawotCQkJCWZpCi0JCQlkb25lCi0JCWZpCi0JCSNjdXJsaWV9Ci19OwotCi1zZXQgY21kKDIpIHsKLQkJI2N1cmxpZXsKLQkJaWYgWyAiWCRTU0hEX1BJRCIgPSAiWCIgXTsgdGhlbgotCQkJaWYgWyAkZGIgPSAxIF07IHRoZW4KLQkJCQllY2hvIAotCQkJCXBzdHI9YHBzIC1lbGYgfCBncmVwICIkVVNFUiIgfCBncmVwICIkdHR5IiB8IGdyZXAgLXYgZ3JlcCB8IGdyZXAgLXYgUElEIHwgZ3JlcCAtdiAicHMgLWVsZiJgCi0JCQkJZWNobyAiJHBzdHIiCi0JCQlmaQotCQkJcGxpc3Q9YHBzIC1lbGYgfCBncmVwICIkVVNFUiIgfCBncmVwICIkdHR5IiB8IGdyZXAgLXYgZ3JlcCB8IGdyZXAgLXYgUElEIHwgZ3JlcCAtdiAicHMgLWVsZiIgfCBhd2sgIntwcmludCBcXFwkNH0iIHwgc29ydCAtbmAKLQkJCWlmIFsgJGRiID0gMSBdOyB0aGVuCi0JCQkJZWNobyAKLQkJCQllY2hvICIkcGxpc3QiCi0JCQlmaQotCQkJZm9yIHRyeSBpbiAkcGxpc3QKLQkJCWRvCi0JCQkJaWYgWyAkZGIgPSAxIF07IHRoZW4gZWNobyB0cnktZmluYWw9JHRyeTsgcHMgJHRyeTsgZmkKLQkJCQlpZiBlY2hvICIkdHJ5IiB8IGdyZXAgIl5bMC05XVswLTldKlxcXCQiID4gL2Rldi9udWxsOyB0aGVuCi0JCQkJCToKLQkJCQllbHNlCi0JCQkJCWNvbnRpbnVlCi0JCQkJZmkKLQkJCQlpZiBwcyAkdHJ5IHwgZWdyZXAgdm5jLWhlbHBlciA+IC9kZXYvbnVsbDsgdGhlbgotCQkJCQk6Ci0JCQkJZWxzZQotCQkJCQlpZiBbICRkYiA9IDEgXTsgdGhlbiBlY2hvIEZvdW5kPSR0cnk7IGZpCi0JCQkJCVNTSERfUElEPSR0cnkKLQkJCQkJZWNobwotCQkJCQlwcyAkdHJ5Ci0JCQkJCWVjaG8KLQkJCQkJYnJlYWsKLQkJCQlmaQotCQkJZG9uZQotCQlmaQotCQlpZiBbICJYJFNTSERfUElEIiA9ICJYIiBdOyB0aGVuCi0JCQkjdWdoCi0JCQlTU0hEX1BJRD0kJAotCQlmaQotCi0JCWVjaG8gInZuYy1oZWxwZXI6IFtmb3IgY3Vwcy9zbWIvZXNkXSAgICAgIFNTSERfUElEPSRTU0hEX1BJRCBNWV9QSUQ9JCQgVFRZPSR0dHkiCi0JCWVjaG8gInZuYy1oZWxwZXI6IFRvIGZvcmNlIG1lIHRvIGZpbmlzaDogIHJtICRGTEFHIiAKLQl9Ci0KLQl3YWl0X3RpbF9zc2hfZ29uZSgpIHsKLQkJdHJ5X3Blcmw9IiIKLQkJaWYgdHlwZSBwZXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJaWYgWyAtZCAvcHJvYyAtYSAtZSAvcHJvYy8kJCBdOyB0aGVuCi0JCQkJdHJ5X3Blcmw9IjEiCi0JCQlmaQotCQlmaQotCQlpZiBbICJYJHRyeV9wZXJsIiA9ICJYMSIgXTsgdGhlbgotCQkJIyB0cnkgdG8gYXZvaWQgd2FzdGluZyBwaWRzOgotCQkJcGVybCAtZSAid2hpbGUgKDEpIHtpZigtZCBcIi9wcm9jXCIgJiYgISAtZSBcIi9wcm9jLyRTU0hEX1BJRFwiKXtleGl0fSBpZighIC1mIFwiJEZMQUdcIil7ZXhpdH0gc2xlZXAgMTt9IgotCQllbHNlCi0JCQl3aGlsZSBbIDEgXQotCQkJZG8KLQkJCQlwcyAkU1NIRF9QSUQgPiAvZGV2L251bGwgMj4mMQotCQkJCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCQkJCWJyZWFrCi0JCQkJZmkKLQkJCQlpZiBbICEgLWYgJEZMQUcgXTsgdGhlbgotCQkJCQlicmVhawotCQkJCWZpCi0JCQkJc2xlZXAgMQotCQkJZG9uZQotCQlmaQotCQlybSAtZiAkRkxBRwotCQlpZiBbICJYJERPX1NNQl9XQUlUIiA9ICJYMSIgXTsgdGhlbgotCQkJcm0gLWYgJHNtYl9zY3JpcHQKLQkJZmkKLQl9Ci19OwotCi1zZXQgY21kKDMpIHsKLQl1cGRhdGVfY2xpZW50X2NvbmYoKSB7Ci0JCW1rZGlyIC1wICRjdXBzX2RpcgotCi0JCWlmIFsgISAtZiAkY3Vwc19jZmcuYmFjayBdOyB0aGVuCi0JCQl0b3VjaCAkY3Vwc19jZmcuYmFjawotCQlmaQotCQlpZiBbICEgLWYgJGN1cHNfY2ZnIF07IHRoZW4KLQkJCXRvdWNoICRjdXBzX2NmZwotCQlmaQotCi0JCWlmIGdyZXAgc3N2bmMtYXV0byAkY3Vwc19jZmcgPiAvZGV2L251bGw7IHRoZW4KLQkJCToKLQkJZWxzZQotCQkJY3AgLXAgJGN1cHNfY2ZnICRjdXBzX2NmZy5iYWNrCi0JCWZpCi0KLQkJZWNobyAiIy1zc3ZuYy1hdXRvOiIgPiAkY3Vwc19jZmcKLQkJc2VkIC1lICJzL15TZXJ2ZXJOYW1lLyMtc3N2bmMtYXV0by0jU2VydmVyTmFtZS8iICRjdXBzX2NmZy5iYWNrID4+ICRjdXBzX2NmZwotCQllY2hvICJTZXJ2ZXJOYW1lICRjdXBzX2hvc3Q6JGN1cHNfcG9ydCIgPj4gJGN1cHNfY2ZnCi0KLQkJZWNobwotCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLQkJZWNobyAiT24gYGhvc3RuYW1lYDoiCi0JCWVjaG8KLQkJZWNobyAiVGhlIENVUFMgJGN1cHNfY2ZnIGNvbmZpZyBmaWxlIGhhcyBiZWVuIHNldCB0bzoiCi0JCWVjaG8KLQkJY2F0ICRjdXBzX2NmZyB8IGdyZXAgLXYgIl4jLXNzdm5jLWF1dG86IiB8IHNlZCAtZSAicy9eLyAgLyIKLQkJZWNobwotCQllY2hvICJJZiB0aGVyZSBhcmUgcHJvYmxlbXMgYXV0b21hdGljYWxseSByZXN0b3JpbmcgaXQsIGVkaXQgb3IgcmVtb3ZlIgotCQllY2hvICJ0aGUgZmlsZSB0byBnbyBiYWNrIHRvIHRoZSBsb2NhbCBDVVBTIHNldHRpbmdzLiIKLQkJZWNobwotCQllY2hvICJBIGJhY2t1cCBoYXMgYmVlbiBwbGFjZWQgaW46ICRjdXBzX2NmZy5iYWNrIgotCQllY2hvCi0JCWVjaG8gIlNlZSB0aGUgU1NWTkMgQ1VQUyBkaWFsb2cgZm9yIG1vcmUgZGV0YWlscyBvbiBwcmludGluZy4iCi0JCWlmIHR5cGUgbHBzdGF0ID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJZWNobwotCQkJZWNobyAibHBzdGF0IC1hIG91dHB1dDoiCi0JCQllY2hvCi0JCQkobHBzdGF0IC1hIDI+JjEgfCBzZWQgLWUgInMvXi8gIC8iKSAmCi0JCQlzbGVlcCAwLjUgPi9kZXYvbnVsbCAyPiYxCi0JCWZpCi0JCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCQllY2hvCi0JfQotCi0JcmVzZXRfY2xpZW50X2NvbmYoKSB7Ci0JCWNwICRjdXBzX2NmZyAkY3Vwc19jZmcudG1wCi0JCWdyZXAgLXYgIl5TZXJ2ZXJOYW1lIiAkY3Vwc19jZmcudG1wIHwgZ3JlcCAtdiAiXiMtc3N2bmMtYXV0bzoiIHwgc2VkIC1lICJzL14jLXNzdm5jLWF1dG8tI1NlcnZlck5hbWUvU2VydmVyTmFtZS8iID4gJGN1cHNfY2ZnCi0JCXJtIC1mICRjdXBzX2NmZy50bXAKLQl9Ci0KLQljdXBzd2FpdCgpIHsKLQkJdHJhcCAiIiBJTlQgUVVJVCBIVVAKLQkJdHJhcCAicmVzZXRfY2xpZW50X2NvbmY7IHJtIC1mICRGTEFHOyBleGl0IiBURVJNCi0JCXdhaXRfdGlsX3NzaF9nb25lCi0JCXJlc2V0X2NsaWVudF9jb25mCi0JfQotfTsKLQotIwkJaWYgWyAiWCRET05FX1BPUlRfQ0hFQ0siICE9ICJYIiBdOyB0aGVuCi0jCQkJaWYgdHlwZSBwZXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgotIwkJCQlwZXJsIC1lICJ1c2UgSU86OlNvY2tldDo6SU5FVDsgXCRTSUd7SU5UfSA9IFwiSUdOT1JFXCI7IFwkU0lHe1FVSVR9ID0gXCJJR05PUkVcIjsgXCRTSUd7SFVQfSA9IFwiSU5HT1JFXCI7IG15IFwkY2xpZW50ID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KExpc3RlbiA9PiA1LCBMb2NhbEFkZHIgPT4gXCJsb2NhbGhvc3RcIiwgTG9jYWxQb3J0ID0+ICRET05FX1BPUlRfQ0hFQ0ssIFByb3RvID0+IFwidGNwXCIpLT5hY2NlcHQoKTsgXCRsaW5lID0gPFwkY2xpZW50PjsgY2xvc2UgXCRjbGllbnQ7IHVubGluayBcIiRzbWJfc2NyaXB0XCI7IiA8L2Rldi9udWxsID4vZGV2L251bGwgMj4vZGV2L251bGwgJgotIwkJCQlpZiBbICQ/ID0gMCBdOyB0aGVuCi0jCQkJCQloYXZlX3BlcmxfZG9uZT0iMSIKLSMJCQkJZmkKLSMJCQlmaQotIwkJZmkKLQotc2V0IGNtZCg0KSB7Ci0Jc21id2FpdCgpIHsKLQkJdHJhcCAiIiBJTlQgUVVJVCBIVVAKLQkJd2FpdF90aWxfc3NoX2dvbmUKLQl9Ci0JZG9fc21iX21vdW50cygpIHsKLQkJaWYgWyAiWCRzbWJfbW91bnRzIiA9ICJYIiBdOyB0aGVuCi0JCQlyZXR1cm4KLQkJZmkKLQkJZWNobyA+ICRzbWJfc2NyaXB0Ci0JCWhhdmVfcGVybF9kb25lPSIiCi0JCWVjaG8gImVjaG8iID4+ICRzbWJfc2NyaXB0IAotCQlkZXN0cz0iIgotCQlmb3IgbW50IGluICRzbWJfbW91bnRzCi0JCWRvCi0JCQlzbWZzPWBlY2hvICIkbW50IiB8IGF3ayAtRiwgIntwcmludCBcXFwkMX0iYAotCQkJZGVzdD1gZWNobyAiJG1udCIgfCBhd2sgLUYsICJ7cHJpbnQgXFxcJDJ9ImAKLQkJCXBvcnQ9YGVjaG8gIiRtbnQiIHwgYXdrIC1GLCAie3ByaW50IFxcXCQzfSJgCi0JCQlkZXN0PWBlY2hvICIkZGVzdCIgfCBzZWQgLWUgInMsX19VU0VSX18sJFVTRVIsZyIgLWUgInMsX19IT01FX18sJEhPTUUsZyJgCi0JCQlpZiBbICEgLWQgJGRlc3QgXTsgdGhlbgotCQkJCW1rZGlyIC1wICRkZXN0Ci0JCQlmaQotCQkJZWNobyAiZWNobyBTTUJNT1VOVDoiID4+ICRzbWJfc2NyaXB0Ci0JCQllY2hvICJlY2hvIHNtYm1vdW50ICRzbWZzICRkZXN0IC1vIHVpZD0kVVNFUixpcD0xMjcuMC4wLjEscG9ydD0kcG9ydCIgPj4gJHNtYl9zY3JpcHQKLQkJCWVjaG8gInNtYm1vdW50IFwiJHNtZnNcIiBcIiRkZXN0XCIgLW8gdWlkPSRVU0VSLGlwPTEyNy4wLjAuMSxwb3J0PSRwb3J0IiA+PiAkc21iX3NjcmlwdAotCQkJZWNobyAiZWNobzsgZGYgXCIkZGVzdFwiOyBlY2hvIiA+PiAkc21iX3NjcmlwdAotCQkJZGVzdHM9IiRkZXN0cyAkZGVzdCIKLQkJZG9uZQotCQkjY3VybGllfQotfTsKLQotc2V0IGNtZCg1KSB7Ci0JCWVjaG8gIigiID4+ICRzbWJfc2NyaXB0Ci0JCWVjaG8gInVuX21udCgpIHsiID4+ICRzbWJfc2NyaXB0Ci0JCWZvciBkZXN0IGluICRkZXN0cwotCQlkbwotCQkJZWNobyAiICBlY2hvIHNtYnVtb3VudCAkZGVzdCIgPj4gJHNtYl9zY3JpcHQKLQkJCWVjaG8gIiAgc21idW1vdW50IFwiJGRlc3RcIiIgPj4gJHNtYl9zY3JpcHQKLQkJZG9uZQotCQllY2hvICJ9IiA+PiAkc21iX3NjcmlwdAotCQllY2hvICJ0cmFwIFwiXCIgSU5UIFFVSVQgSFVQIiA+PiAkc21iX3NjcmlwdAotCQllY2hvICJ0cmFwIFwidW5fbW50OyBleGl0XCIgVEVSTSIgPj4gJHNtYl9zY3JpcHQKLQotCQl0cnlfcGVybD0iIgotCQlpZiB0eXBlIHBlcmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQl0cnlfcGVybD0xCi0JCWZpCi0JCXVuYW1lPWB1bmFtZWAKLQkJaWYgWyAiWCR1bmFtZSIgIT0gIlhMaW51eCIgLWEgIlgkdW5hbWUiICE9ICJYU3VuT1MiIC1hICJYJHVuYW1lIiAhPSAiWERhcndpbiIgXTsgdGhlbgotCQkJdHJ5X3Blcmw9IiIKLQkJZmkKLQotCQlpZiBbICJYJHRyeV9wZXJsIiA9ICJYIiBdOyB0aGVuCi0JCQllY2hvICJ3aGlsZSBbIC1mICRzbWJfc2NyaXB0IF0iID4+ICRzbWJfc2NyaXB0Ci0JCQllY2hvICJkbyIgPj4gJHNtYl9zY3JpcHQKLQkJCWVjaG8gIiAgICAgc2xlZXAgMSIgPj4gJHNtYl9zY3JpcHQKLQkJCWVjaG8gImRvbmUiID4+ICRzbWJfc2NyaXB0Ci0JCWVsc2UKLQkJCWVjaG8gInBlcmwgLWUgXCJ3aGlsZSAoLWYgXFxcIiRzbWJfc2NyaXB0XFxcIikge3NsZWVwIDE7fSBleGl0IDA7XCIiID4+ICRzbWJfc2NyaXB0Ci0JCWZpCi0JCWVjaG8gInVuX21udCIgPj4gJHNtYl9zY3JpcHQKLQkJZWNobyAiKSAmIiA+PiAkc21iX3NjcmlwdAotCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLQkJZWNobyAiT24gYGhvc3RuYW1lYDoiCi0JCWVjaG8KLQkJaWYgWyAiJERPX1NNQl9TVSIgPSAiMCIgXTsgdGhlbgotCQkJZWNobyAiV2Ugbm93IHJ1biB0aGUgc21ibW91bnQgc2NyaXB0IGFzIHVzZXIgJFVTRVIiCi0JCQllY2hvCi0JCQllY2hvIHNoICRzbWJfc2NyaXB0Ci0JCQlzaCAkc21iX3NjcmlwdAotCQkJcmM9MAotCQllbGlmIFsgIiRET19TTUJfU1UiID0gIjEiIF07IHRoZW4KLQkJCWVjaG8gIldlIG5vdyBydW4gdGhlIHNtYm1vdW50IHNjcmlwdCB2aWEgc3UoMSkiCi0JCQllY2hvCi0JCQllY2hvICJUaGUgZmlyc3QgXCJQYXNzd29yZDpcIiB3aWxsIGJlIGZvciB0aGF0IG9mIHJvb3QgdG8gcnVuIHRoZSBzbWJtb3VudCBzY3JpcHQuIgotCQkJZWNobwotCQkJZWNobyAiU3Vic2VxdWVudCBcIlBhc3N3b3JkOlwiIHdpbGwgYmUgZm9yIHRoZSBTTUIgc2hhcmUocykgKGhpdCBSZXR1cm4gaWYgbm8gcGFzc3dkKSIKLQkJCWVjaG8KLQkJCWVjaG8gU1U6Ci0JCQllY2hvICJzdSByb290IC1jIFwic2ggJHNtYl9zY3JpcHRcIiIKLQkJCXN1IHJvb3QgLWMgInNoICRzbWJfc2NyaXB0IgotCQkJcmM9JD8KLQkJZWxpZiBbICIkRE9fU01CX1NVIiA9ICIyIiBdOyB0aGVuCi0JCQllY2hvICJXZSBub3cgcnVuIHRoZSBzbWJtb3VudCBzY3JpcHQgdmlhIHN1ZG8oOCkiCi0JCQllY2hvCi0JCQllY2hvICJUaGUgZmlyc3QgXCJQYXNzd29yZDpcIiB3aWxsIGJlIGZvciB0aGF0IG9mIHRoZSBzdWRvKDgpIHBhc3N3b3JkLiIKLQkJCWVjaG8KLQkJCWVjaG8gIlN1YnNlcXVlbnQgXCJQYXNzd29yZDpcIiB3aWxsIGJlIGZvciB0aGUgU01CIHNoYXJlcyAoaGl0IGVudGVyIGlmIG5vIHBhc3N3ZCkiCi0JCQllY2hvCi0JCQllY2hvIFNVRE86Ci0JCQlzZD0ic3VkbyIKLQkJCWVjaG8gIiRzZCBzaCAkc21iX3NjcmlwdCIKLQkJCSRzZCBzaCAkc21iX3NjcmlwdAotCQkJcmM9JD8KLQkJZmkKLX07Ci0KLXNldCBjbWQoNikgewotCQkjY3VybGllewotCQllY2hvCi0JCWlmIFsgIiRyYyIgPSAwIF07IHRoZW4KLQkJCWlmIFsgIlgkaGF2ZV9wZXJsX2RvbmUiID0gIlgxIiAtbyAxID0gMSBdIDsgdGhlbgotCQkJCWVjaG8KLQkJCQllY2hvICJZb3VyIFNNQiBzaGFyZXMgd2lsbCBiZSB1bm1vdW50ZWQgd2hlbiB0aGUgVk5DIGNvbm5lY3Rpb24gY2xvc2VzLCIKLQkJCQllY2hvICIqQVMgTE9ORyBBUyogTm8gQXBwbGljYXRpb25zIGhhdmUgYW55IG9mIHRoZSBzaGFyZSBmaWxlcyBvcGVuZWQgb3IgYXJlIgotCQkJCWVjaG8gImNkLWVkIGludG8gYW55IG9mIHRoZSBzaGFyZSBkaXJlY3Rvcmllcy4iCi0JCQkJZWNobwotCQkJCWVjaG8gIlRyeSB0byBtYWtlIHN1cmUgbm90aGluZyBpcyBhY2Nlc3NpbmcgdGhlIFNNQiBzaGFyZXMgYmVmb3JlIGRpc2Nvbm5lY3RpbmciCi0JCQkJZWNobyAidGhlIFZOQyBzZXNzaW9uLiAgSWYgeW91IGZhaWwgdG8gZG8gdGhhdCBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zOiIKLQkJCWZpCi0JCQllY2hvCi0JCQllY2hvICJUbyB1bm1vdW50IHlvdXIgU01CIHNoYXJlcyBtYWtlIHN1cmUgbm8gYXBwbGljYXRpb25zIGFyZSBzdGlsbCB1c2luZyBhbnkgb2YiCi0JCQllY2hvICJ0aGUgZmlsZXMgYW5kIG5vIHNoZWxscyBhcmUgc3RpbGwgY2QtZWQgaW50byB0aGUgc2hhcmUgYXJlYSwgdGhlbiB0eXBlOiIKLQkJCWVjaG8gCi0JCQllY2hvICIgICBybSAtZiAkc21iX3NjcmlwdCIKLQkJCWVjaG8gCi0JCQllY2hvICJJbiB0aGUgd29yc3QgY2FzZSBydW46IHNtYnVtb3VudCAvcGF0aC90by9tb3VudC9wb2ludCBmb3IgZWFjaCBtb3VudCBhcyByb290IgotCQkJZWNobyAKLQkJCWVjaG8gIkV2ZW4gd2l0aCB0aGUgcmVtb3RlIHJlZGlyZWN0aW9uIGdvbmUgdGhlIGtlcm5lbCBzaG91bGQgdW1vdW50IGFmdGVyIGEgdGltZW91dC4iCi0JCWVsc2UKLQkJCWVjaG8gCi0JCQlpZiBbICIkRE9fU01CX1NVIiA9ICIxIiBdOyB0aGVuCi0JCQkJZWNobyAic3UoMSkgdG8gcnVuIHNtYm1vdW50KDgpIGZhaWxlZC4iCi0JCQllbGlmIFsgIiRET19TTUJfU1UiID0gIjIiIF07IHRoZW4KLQkJCQllY2hvICJzdWRvKDgpIHRvIHJ1biBzbWJtb3VudCg4KSBmYWlsZWQuIgotCQkJZmkKLQkJCXJtIC1mICRzbWJfc2NyaXB0Ci0JCWZpCi0JCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCQllY2hvCi0JfQotfTsKLQotc2V0IGNtZCg3KSB7Ci0KLQlzZXR1cF9zb3VuZCgpIHsKLQkJZHBpZD0iIgotCQlkPSRzb3VuZF9kYWVtb25fcmVtb3RlX3Byb2cKLQkJaWYgdHlwZSBwZ3JlcCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCQlkcGlkPWBwZ3JlcCAtVSAkVVNFUiAteCAkZCB8IGhlYWQgLTFgCi0JCWVsc2UKLQkJCWRwaWQ9YGVudiBQQVRIPS91c3IvdWNiOiRQQVRIIHBzIHd3d3dhdXggfCBncmVwIC13ICRVU0VSIHwgZ3JlcCAtdyAkZCB8IGdyZXAgLXYgZ3JlcCB8IGhlYWQgLTFgCi0JCWZpCi0JCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCQllY2hvICJPbiBgaG9zdG5hbWVgOiIKLQkJZWNobwotCQllY2hvICJTZXR0aW5nIHVwIFNvdW5kOiBwaWQ9JGRwaWQiCi0JCWlmIFsgIlgkZHBpZCIgIT0gIlgiIF07IHRoZW4KLQkJCWRjbWQ9YGVudiBQQVRIPS91c3IvdWNiOiRQQVRIIHBzIHd3d3dhdXggfCBncmVwIC13ICRVU0VSIHwgZ3JlcCAtdyAkZCB8IGdyZXAgLXcgJGRwaWQgfCBncmVwIC12IGdyZXAgfCBoZWFkIC0xIHwgc2VkIC1lICJzL14uKiRkLyRkLyJgCi0JCQlpZiBbICJYJERPX1NPVU5EX0tJTEwiID0gIlgxIiBdOyB0aGVuCi0JCQkJZWNobyAiU3RvcHBpbmcgc291bmQgZGFlbW9uOiAkc291bmRfZGFlbW9uX3JlbW90ZV9wcm9nICRkcGlkIgotCQkJCWVjaG8gInNvdW5kIGNtZDogJGRjbWQiCi0JCQkJa2lsbCAtVEVSTSAkZHBpZAotCQkJZmkKLQkJZmkKLQkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JCWVjaG8KLQl9Ci0KLQlyZXNldF9zb3VuZCgpIHsKLQkJaWYgWyAiWCRET19TT1VORF9SRVNUQVJUIiA9ICJYMSIgXTsgdGhlbgotCQkJZD0kc291bmRfZGFlbW9uX3JlbW90ZV9wcm9nCi0JCQlhPSRzb3VuZF9kYWVtb25fcmVtb3RlX2FyZ3MKLQkJCWVjaG8gIlJlc3RhcmluZyBzb3VuZCBkYWVtb246ICRkICRhIgotCQkJJGQgJGEgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJgotCQlmaQotCX0KLQotCXNvdW5kd2FpdCgpIHsKLQkJdHJhcCAiIiBJTlQgUVVJVCBIVVAKLQkJdHJhcCAicmVzZXRfc291bmQ7IHJtIC1mICRGTEFHOyBleGl0IiBURVJNCi0JCXdhaXRfdGlsX3NzaF9nb25lCi0JCXJlc2V0X3NvdW5kCi0JfQotCi0KLQlmaW5kcGlkCi0KLQlpZiBbICRET19TTUIgPSAxIF07IHRoZW4KLQkJZG9fc21iX21vdW50cwotCWZpCi0KLQl3YWl0ZXI9MAotCi0JaWYgWyAkRE9fQ1VQUyA9IDEgXTsgdGhlbgotCQl1cGRhdGVfY2xpZW50X2NvbmYKLQkJY3Vwc3dhaXQgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYKLQkJd2FpdGVyPTEKLQlmaQotCi0JaWYgWyAkRE9fU09VTkQgPSAxIF07IHRoZW4KLQkJc2V0dXBfc291bmQKLQkJc291bmR3YWl0IDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmCi0JCXdhaXRlcj0xCi0JZmkKLQlpZiBbICRET19TTUJfV0FJVCA9IDEgXTsgdGhlbgotCQlpZiBbICR3YWl0ZXIgIT0gMSBdOyB0aGVuCi0JCQlzbWJ3YWl0IDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmCi0JCQl3YWl0ZXI9MQotCQlmaQotCWZpCi0KLQotCSNGSU5NU0cKLQllY2hvICItLW1haW4tdm5jLWhlbHBlci1maW5pc2hlZC0tIgotCSNjYXQgJDAKLQlybSAtZiAkMAotCWV4aXQgMAotfTsKLQotCXNldCBjbWRhbGwgIiIKLQotCWZvciB7c2V0IGkgMX0geyRpIDw9IDd9IHtpbmNyIGl9IHsKLQkJc2V0IHYgJGNtZCgkaSk7Ci0JCXJlZ3N1YiAtYWxsICJcbiIgJHYgIiUiIHYKLQkJcmVnc3ViIC1hbGwgey5jdXJsaWUufSAkdiAiIiB2Ci0JCXNldCBjbWQoJGkpICR2Ci0JCWFwcGVuZCBjbWRhbGwgImVjaG8gIgotCQlpZiB7JGkgPT0gMX0gewotCQkJYXBwZW5kIGNtZGFsbCB7VE9QUElEPSQkICV9IAotCQl9Ci0JCWFwcGVuZCBjbWRhbGwgeyd9Ci0JCWFwcGVuZCBjbWRhbGwgJGNtZCgkaSkKLQkJYXBwZW5kIGNtZGFsbCB7JyB8IHRyICclJyAnXG4nfQotCQlpZiB7JGkgPT0gMX0gewotCQkJYXBwZW5kIGNtZGFsbCB7Pn0KLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBjbWRhbGwgez4+fQotCQl9Ci0JCWFwcGVuZCBjbWRhbGwgeyRIT01FLy52bmMtaGVscGVyLWNtZF9fUElEX187IH0KLQl9Ci0JYXBwZW5kIGNtZGFsbCB7c2ggJEhPTUUvLnZuYy1oZWxwZXItY21kX19QSURfXzsgfQotCi0JcmVnc3ViIC1hbGwge3ZuYy1oZWxwZXItY21kfSAkY21kYWxsICJ2bmMtaGVscGVyLWNtZC0kbW9kZSIgY21kYWxsCi0JaWYgeyR0YWcgPT0gIiJ9IHsKLQkJc2V0IHRhZyBbcGlkXQotCX0KLQlyZWdzdWIgLWFsbCB7X19QSURfX30gJGNtZGFsbCAiJHRhZyIgY21kYWxsCi0KLQlzZXQgb3JpZyAkY21kYWxsCi0KLQlnbG9iYWwgdXNlX2N1cHMgY3Vwc19sb2NhbF9zZXJ2ZXIgY3Vwc19yZW1vdGVfcG9ydCBjdXBzX21hbmFnZV9yY2ZpbGUgdHNfb25seSB0c19jdXBzX21hbmFnZV9yY2ZpbGUgY3Vwc194MTF2bmMKLQlyZWdzdWIgLWFsbCB7WyAJXX0gJGN1cHNfbG9jYWxfc2VydmVyICIiIGN1cHNfbG9jYWxfc2VydmVyCi0JcmVnc3ViIC1hbGwge1sgCV19ICRjdXBzX3JlbW90ZV9wb3J0ICIiIGN1cHNfcmVtb3RlX3BvcnQKLQlpZiB7JHVzZV9jdXBzfSB7Ci0JCXNldCBkb3JjIDAKLQkJaWYgeyR0c19vbmx5fSB7Ci0JCQlpZiB7JHRzX2N1cHNfbWFuYWdlX3JjZmlsZX0gewotCQkJCXNldCBkb3JjIDEKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIHskY3Vwc19tYW5hZ2VfcmNmaWxlfSB7Ci0JCQkJc2V0IGRvcmMgMQotCQkJfQotCQl9Ci0JCWlmIHskZG9yYyAmJiAkbW9kZSA9PSAicG9zdCJ9IHsKLQkJCWlmIHskY3Vwc19sb2NhbF9zZXJ2ZXIgIT0gIiIgJiYgJGN1cHNfcmVtb3RlX3BvcnQgIT0gIiJ9IHsKLQkJCQlyZWdzdWIge0RPX0NVUFM9MH0gJGNtZGFsbCB7RE9fQ1VQUz0xfSBjbWRhbGwKLQkJCQlyZWdzdWIge2N1cHNfcG9ydD1OTk5OfSAkY21kYWxsICJjdXBzX3BvcnQ9JGN1cHNfcmVtb3RlX3BvcnQiIGNtZGFsbAotCQkJfQotCQl9Ci0JfQotCQotCWdsb2JhbCB1c2Vfc21ibW50IHNtYl9zdV9tb2RlIHNtYl9tb3VudHMgCi0JaWYgeyR1c2Vfc21ibW50fSB7Ci0JCWlmIHskc21iX21vdW50cyAhPSAiIn0gewotCQkJc2V0IHNtYm0gJHNtYl9tb3VudHMKLQkJCXJlZ3N1YiAtYWxsIHslVVNFUn0gJHNtYm0gIl9fVVNFUl9fIiBzbWJtCi0JCQlyZWdzdWIgLWFsbCB7JUhPTUV9ICRzbWJtICJfX0hPTUVfXyIgc21ibQotCQkJaWYgeyRtb2RlID09ICJwcmUifSB7Ci0JCQkJcmVnc3ViIHtET19TTUI9MH0gJGNtZGFsbCB7RE9fU01CPTF9IGNtZGFsbAotCQkJCWlmIHskc21iX3N1X21vZGUgPT0gInN1In0gewotCQkJCQlyZWdzdWIge0RPX1NNQl9TVT0wfSAkY21kYWxsIHtET19TTUJfU1U9MX0gY21kYWxsCi0JCQkJfSBlbHNlaWYgeyRzbWJfc3VfbW9kZSA9PSAic3VkbyJ9IHsKLQkJCQkJcmVnc3ViIHtET19TTUJfU1U9MH0gJGNtZGFsbCB7RE9fU01CX1NVPTJ9IGNtZGFsbAotCQkJCX0gZWxzZWlmIHskc21iX3N1X21vZGUgPT0gIm5vbmUifSB7Ci0JCQkJCXJlZ3N1YiB7RE9fU01CX1NVPTB9ICRjbWRhbGwge0RPX1NNQl9TVT0wfSBjbWRhbGwKLQkJCQl9IGVsc2UgewotCQkJCQlyZWdzdWIge0RPX1NNQl9TVT0wfSAkY21kYWxsIHtET19TTUJfU1U9MX0gY21kYWxsCi0JCQkJfQotCQkJCXJlZ3N1YiB7c21iX21vdW50cz19ICRjbWRhbGwgInNtYl9tb3VudHM9XCIkc21ibVwiIiBjbWRhbGwKLQkJCX0gZWxzZWlmIHskbW9kZSA9PSAicG9zdCJ9IHsKLQkJCQlyZWdzdWIge0RPX1NNQl9XQUlUPTB9ICRjbWRhbGwge0RPX1NNQl9XQUlUPTF9IGNtZGFsbAotCQkJfQotCQl9Ci0JfQotCi0JZ2xvYmFsIHVzZV9zb3VuZAotCWlmIHskdXNlX3NvdW5kfSB7Ci0JCWlmIHskbW9kZSA9PSAicHJlIn0gewotCQkJZ2xvYmFsIHNvdW5kX2RhZW1vbl9yZW1vdGVfY21kIHNvdW5kX2RhZW1vbl9raWxsIHNvdW5kX2RhZW1vbl9yZXN0YXJ0Ci0JCQlpZiB7JHNvdW5kX2RhZW1vbl9raWxsfSB7Ci0JCQkJcmVnc3ViIHtET19TT1VORF9LSUxMPTB9ICRjbWRhbGwge0RPX1NPVU5EX0tJTEw9MX0gY21kYWxsCi0JCQkJcmVnc3ViIHtET19TT1VORD0wfSAkY21kYWxsIHtET19TT1VORD0xfSBjbWRhbGwKLQkJCX0KLQkJCWlmIHskc291bmRfZGFlbW9uX3Jlc3RhcnR9IHsKLQkJCQlyZWdzdWIge0RPX1NPVU5EX1JFU1RBUlQ9MH0gJGNtZGFsbCB7RE9fU09VTkRfUkVTVEFSVD0xfSBjbWRhbGwKLQkJCQlyZWdzdWIge0RPX1NPVU5EPTB9ICRjbWRhbGwge0RPX1NPVU5EPTF9IGNtZGFsbAotCQkJfQotCQkJc2V0IHNwIFtzdHJpbmcgdHJpbSAkc291bmRfZGFlbW9uX3JlbW90ZV9jbWRdCi0JCQlyZWdzdWIge1sgXHRdLiokfSAkc3AgIiIgc3AKLQkJCXNldCBzYSBbc3RyaW5nIHRyaW0gJHNvdW5kX2RhZW1vbl9yZW1vdGVfY21kXQotCQkJcmVnc3ViIHteW14gXHRdW14gXHRdKlsgXHRdWyBcdF0qfSAkc2EgIiIgc2EKLQkJCXJlZ3N1YiB7c291bmRfZGFlbW9uX3JlbW90ZV9wcm9nPX0gJGNtZGFsbCAic291bmRfZGFlbW9uX3JlbW90ZV9wcm9nPVwiJHNwXCIiIGNtZGFsbAotCQkJcmVnc3ViIHtzb3VuZF9kYWVtb25fcmVtb3RlX2FyZ3M9fSAkY21kYWxsICJzb3VuZF9kYWVtb25fcmVtb3RlX2FyZ3M9XCIkc2FcIiIgY21kYWxsCi0JCX0KLQl9Ci0JCi0JaWYgeyRtb2RlID09ICJwcmUifSB7Ci0JCXNldCBkb3ByZSAwCi0JCWlmIHskdXNlX3NtYm1udCAmJiAkc21iX21vdW50cyAhPSAiIn0gewotCQkJc2V0IGRvcHJlIDEKLQkJfQotCQlpZiB7JHVzZV9zb3VuZCAmJiAkc291bmRfZGFlbW9uX2tpbGx9IHsKLQkJCXNldCBkb3ByZSAxCi0JCX0KLQkJaWYgeyRkb3ByZX0gewotCQkJZ2xvYmFsIGlzX3dpbmRvd3MKLQkJCWlmIHskaXNfd2luZG93c30gewotCQkJCXJlZ3N1YiB7I0ZJTk1TR30gJGNtZGFsbCB7ZWNobyAiTm93IEdvIENsaWNrIG9uIHRoZSBMYWJlbCB0byBTdGFydCB0aGUgMm5kIFNTSCJ9IGNtZGFsbAotCQkJfSBlbHNlIHsKLQkJCQlyZWdzdWIgeyNGSU5NU0d9ICRjbWRhbGwge2VjaG8gIkZpbmlzaGVkIHdpdGggdGhlIDFzdCBTU0ggdGFza3MsIHRoZSAybmQgU1NIIHNob3VsZCBzdGFydCBzaG9ydGx5Li4uIn0gY21kYWxsCi0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXQgY21kc3RyICRjbWRhbGwKLQotCWlmIHsiJG9yaWciID09ICIkY21kYWxsIn0gewotCQlzZXQgY21kc3RyICIiCi0JfQotCWdsb2JhbCBlbnYKLQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0RFQlVHX0NVUFMpXSB7Ci0JCXJlZ3N1YiAtYWxsIHtkYj0wfSAkY21kc3RyICJkYj0xIiBjbWRzdHIKLQkJc2V0IHBvdXQgIiIKLQkJcmVnc3ViIC1hbGwgeyV9ICRjbWRzdHIgIlxuIiBwb3V0Ci0JCXB1dHMgc3RkZXJyICJcblNFUlZJQ0UgUkVESVIgQ09NTUFORDpcblxuJHBvdXRcbiIKLQl9Ci0JcmV0dXJuICRjbWRzdHIKLX0KLQotcHJvYyB0c191bml4cHdfZGlhbG9nIHt9IHsKLQotCXRvcGxldiAudXhwdwotCXdtIHRpdGxlIC51eHB3ICJVc2UgdW5peHB3IgotCi0Jc2Nyb2xsX3RleHQgLnV4cHcuZiA4MCAxNAotCi0JZ2xvYmFsIHRzX3VuaXhwdwotCi0Jc2V0IG1zZyB7Ci0gICAgVGhpcyBlbmFibGVzIHRoZSB4MTF2bmMgdW5peHB3IG1vZGUuICBBIExvZ2luOiBhbmQgUGFzc3dvcmQ6IGRpYWxvZwotICAgIHdpbGwgYmUgcHJlc2VudGVkIGluIHRoZSBWTkMgVmlld2VyIGZvciB0aGUgdXNlciB0byBwcm92aWRlIGFueSBVbml4Ci0gICAgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdob3NlIHNlc3Npb24gaGUgd2FudHMgdG8gY29ubmVjdCB0by4gIFNvIHRoaXMKLSAgICBtYXkgcmVxdWlyZSB0eXBpbmcgaW4gdGhlIHBhc3N3b3JkIGEgMm5kIHRpbWUgYWZ0ZXIgdGhlIG9uZSBmb3IgU1NILgotCi0gICAgVGhpcyBtb2RlIGlzIHVzZWZ1bCBpZiBhIHNoYXJlZCB0ZXJtaW5hbCBzZXJ2aWNlcyB1c2VyIChlLmcuICd0c3VzZXInKQotICAgIGlzIHVzZWQgZm9yIHRoZSBTU0ggbG9naW4gcGFydCAoc2F5IHZpYSB0aGUgU1NIIGF1dGhvcml6ZWRfa2V5cwotICAgIG1lY2hhbmlzbSBhbmQgYWxsIHVzZXJzIHNoYXJlIHRoZSBzYW1lIHByaXZhdGUgU1NIIGtleSBmb3IgJ3RzdXNlcicpLgotCi0gICAgTm90ZSwgSG93ZXZlciB0aGF0IHRoZSBkZWZhdWx0IHVzYWdlIG9mIGEgcGVyLXVzZXIgU1NIIGxvZ2luIHNob3VsZAotICAgIGJlIHRoZSBzaW1wbGVzdCBhbmQgYWxzbyBzdWZmaWNpZW50IGZvciBtb3N0IHNpdHVhdGlvbnMsIGluIHdoaWNoCi0gICAgY2FzZSB0aGlzICJVc2UgdW5peHB3IiBvcHRpb24gc2hvdWxkIE5PVCBiZSBzZWxlY3RlZC4KLX0KLQkudXhwdy5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlidXR0b24gLnV4cHcuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC51eHB3OyBzZXQgdHNfdW5peHB3IDB9Ci0JYmluZCAudXhwdyA8RXNjYXBlPiB7ZGVzdHJveSAudXhwdzsgc2V0IHRzX3VuaXhwdyAwfQotCXdtIHByb3RvY29sIC51eHB3IFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLnV4cHc7IHNldCB0c191bml4cHcgMH0KLQotCWJ1dHRvbiAudXhwdy5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAudXhwdzsgc2V0IHRzX3VuaXhwdyAxfQotCi0JcGFjayAudXhwdy5kb25lIC51eHB3LmNhbmNlbCAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLnV4cHcuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLnV4cHcKLX0KLQotcHJvYyB0c192bmNzaGFyZWRfZGlhbG9nIHt9IHsKLQotCXRvcGxldiAudm5jcwotCXdtIHRpdGxlIC52bmNzICJWTkMgU2hhcmVkIgotCi0Jc2Nyb2xsX3RleHQgLnZuY3MuZiA4MCAyMwotCi0JZ2xvYmFsIHRzX3ZuY3NoYXJlZAotCi0Jc2V0IG1zZyB7Ci0gICAgTm9ybWFsIHVzZSBvZiB0aGlzIHByb2dyYW0sICd0c3ZuYycsICpBTFJFQURZKiBhbGxvd3Mgc2ltdWx0YW5lb3VzCi0gICAgc2hhcmVkIGFjY2VzcyBvZiB0aGUgcmVtb3RlIGRlc2t0b3A6ICAgWW91IHNpbXBseSBsb2cgaW4gYXMgbWFueQotICAgIHRpbWVzIGZyb20gYXMgbWFueSBkaWZmZXJlbnQgbG9jYXRpb25zIHdpdGggJ3Rzdm5jJyBhcyB5b3UgbGlrZS4KLQotICAgIEhvd2V2ZXIsIGRvaW5nIGl0IHRoYXQgd2F5IHN0YXJ0cyB1cCBhIG5ldyB4MTF2bmMgZm9yIGVhY2ggY29ubmVjdGlvbi4KLSAgICBJbiBzb21lIGNpcmN1bXN0YW5jZXMgeW91IG1heSB3YW50IGEgc2luZ2xlIHgxMXZuYyBydW5uaW5nIGJ1dCBhbGxvdwotICAgIG11bHRpcGxlIFZOQyB2aWV3ZXJzIHRvIGFjY2VzcyBpdCBzaW11bHRhbmVvdXNseS4KLQotICAgIFRoaXMgb3B0aW9uIChWTkMgU2hhcmVkKSBlbmFibGVzIHRoYXQgcmFyZXIgdXNhZ2UgY2FzZSBieSBwYXNzaW5nCi0gICAgJy1zaGFyZWQnIHRvIHRoZSByZW1vdGUgeDExdm5jIGNvbW1hbmQuCi0KLSAgICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHRoZSBuZXcgc2hhcmVkIGNvbm5lY3Rpb25zIG11c3QKLSAgICBzdGlsbCBjb25uZWN0IHRvIHRoZSBUZXJtaW5hbCBTZXJ2ZXIgdmlhIFNTSCBmb3IgZW5jcnlwdGlvbiBhbmQKLSAgICBhdXRoZW50aWNhdGlvbi4gIFRoZXkgbXVzdCBhbHNvIGRvIHRoZSBub3JtYWwgU1NIIHBvcnQgcmVkaXJlY3Rpb24KLSAgICB0byBhY2Nlc3MgdGhlIHgxMXZuYyBwb3J0ICh1c3VhbGx5IDU5MDAsIGJ1dCBsb29rIGZvciB0aGUgUE9SVD0KLSAgICBvdXRwdXQgZm9yIHRoZSBhY3R1YWwgdmFsdWUpLgotCi0gICAgVGhleSBjb3VsZCB1c2UgU1NWTkMgZm9yIHRoYXQsIG9yIGRvIGl0IG1hbnVhbGx5IGluIHRlcm1pbmFsCi0gICAgd2luZG93cywgbW9yZSBpbmZvcm1hdGlvbjoKLQotICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI3R1bm5lbGxpbmcKLX0KLQkudm5jcy5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlidXR0b24gLnZuY3MuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC52bmNzOyBzZXQgdHNfdm5jc2hhcmVkIDB9Ci0JYmluZCAudm5jcyA8RXNjYXBlPiB7ZGVzdHJveSAudm5jczsgc2V0IHRzX3ZuY3NoYXJlZCAwfQotCXdtIHByb3RvY29sIC52bmNzIFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLnZuY3M7IHNldCB0c192bmNzaGFyZWQgMH0KLQlidXR0b24gLnZuY3MuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnZuY3M7IHNldCB0c192bmNzaGFyZWQgMX0KLQotCXBhY2sgLnZuY3MuZG9uZSAudm5jcy5jYW5jZWwgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC52bmNzLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC52bmNzCi19Ci0KLXByb2MgdHNfbXVsdGlfZGlhbG9nIHt9IHsKLQotCXRvcGxldiAubXVsdAotCXdtIHRpdGxlIC5tdWx0ICJNdWx0aXBsZSBTZXNzaW9ucyIKLQotCXNjcm9sbF90ZXh0IC5tdWx0LmYgODAgMjEKLQotCWdsb2JhbCB0c19tdWx0aXNlc3Npb24gY2hvb3NlX211bHRpc2Vzc2lvbgotCi0Jc2V0IG1zZyB7Ci0gICAgTm9ybWFsbHkgaW4gVGVybWluYWwgU2VydmljZXMgbW9kZSAodHN2bmMpIHlvdXIgdXNlciBhY2NvdW50ICh0aGUKLSAgICBvbmUgeW91IFNTSCBpbiBhcykgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBUZXJtaW5hbCBTZXJ2aWNlcyBYIHNlc3Npb24KLSAgICBydW5uaW5nIGF0IGEgdGltZSBvbiBvbmUgc2VydmVyIG1hY2hpbmUuICAKLQotICAgIFRoaXMgaXMgc2ltcGx5IGJlY2F1c2UgeDExdm5jIGNob29zZXMgdGhlIGZpcnN0IERlc2t0b3AgKFggc2Vzc2lvbikKLSAgICBvZiB5b3VycyB0aGF0IGl0IGNhbiBmaW5kLiAgSXQgd2lsbCBuZXZlciBjcmVhdGUgYSAybmQgWCBzZXNzaW9uCi0gICAgYmVjYXVzZSBpdCBrZWVwcyBmaW5kaW5nIHRoZSAxc3Qgb25lLgotCi0gICAgVG8gaGF2ZSBNdWx0aXBsZSBTZXNzaW9ucyBmb3Igb25lIHVzZXJuYW1lIG9uIGEgc2luZ2xlIG1hY2hpbmUsCi0gICAgY2hvb3NlIGEgdW5pcXVlIFNlc3Npb24gIlRhZyIsIHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFgKLSAgICBzZXNzaW9uIGFuZCB4MTF2bmMgd2lsbCBvbmx5IGNob29zZSB0aGUgb25lIHRoYXQgaGFzIHRoaXMgVGFnLiAKLQotICAgIEZvciB0aGlzIHRvIHdvcmsgQUxMIG9mIHlvdXIgc2Vzc2lvbnMgb24gdGhlIHNlcnZlciBtYWNoaW5lIG11c3QKLSAgICBoYXZlIGEgZGlmZmVyZW50IHRhZyAodGhhdCBpcywgaWYgeW91IGhhdmUgYW4gZXhpc3Rpbmcgc2Vzc2lvbiB3aXRoCi0gICAgbm8gdGFnLCB4MTF2bmMgbWlnaHQgZmluZCBhIHRhZ2dlZCBvbmUgZmlyc3QgaW5zdGVhZCBvZiBpdCkuCi0KLSAgICBUaGUgdGFnIG11c3QgYmUgbWFkZSBvZiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGRhc2gsIG9yIHVuZGVyc2NvcmUuCi0KLSAgICBFeGFtcGxlczogIEtERV9TTUFMTCwgIGdub21lLTIsICB0ZXN0MQotfQotCS5tdWx0LmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWZyYW1lIC5tdWx0LmMKLQlsYWJlbCAubXVsdC5jLmwgLWFuY2hvciB3IC10ZXh0ICJUYWc6IgotCWVudHJ5IC5tdWx0LmMuZSAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSB0c19tdWx0aXNlc3Npb24KLQlwYWNrIC5tdWx0LmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAubXVsdC5jLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC5tdWx0LmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAubXVsdDsgc2V0IGNob29zZV9tdWx0aXNlc3Npb24gMH0KLQliaW5kIC5tdWx0IDxFc2NhcGU+IHtkZXN0cm95IC5tdWx0OyBzZXQgY2hvb3NlX211bHRpc2Vzc2lvbiAwfQotCXdtIHByb3RvY29sIC5tdWx0IFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLm11bHQ7IHNldCBjaG9vc2VfbXVsdGlzZXNzaW9uIDB9Ci0KLQliaW5kIC5tdWx0LmMuZSA8UmV0dXJuPiB7ZGVzdHJveSAubXVsdDsgc2V0IGNob29zZV9tdWx0aXNlc3Npb24gMX0KLQlidXR0b24gLm11bHQuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLm11bHQ7IHNldCBjaG9vc2VfbXVsdGlzZXNzaW9uIDF9Ci0KLQlwYWNrIC5tdWx0LmRvbmUgLm11bHQuY2FuY2VsIC5tdWx0LmMgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5tdWx0LmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5tdWx0Ci0JZm9jdXMgLm11bHQuYy5lIAotfQotCi1wcm9jIHRzX3hsb2dpbl9kaWFsb2cge30gewotCi0JdG9wbGV2IC54bG9nCi0Jd20gdGl0bGUgLnhsb2cgIlggTG9naW4gR3JlZXRlciIKLQotCXNldCBoIDMzCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyOAotCX0KLQlzY3JvbGxfdGV4dCAueGxvZy5mIDgwICRoCi0KLQlnbG9iYWwgdHNfeGxvZ2luCi0KLQlzZXQgbXNnIHsKLSAgICBJZiB5b3UgaGF2ZSByb290IChzdWRvKDEpKSBwZXJtaXNzaW9uIG9uIHRoZSByZW1vdGUgbWFjaGluZSwgeW91Ci0gICAgY2FuIGhhdmUgeDExdm5jIHRyeSB0byBjb25uZWN0IHRvIGEgWCBkaXNwbGF5KHMpIHRoYXQgaGFzIE5vIE9uZQotICAgIExvZ2dlZCBJbiBZZXQuICBUaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBsb2dpbiBncmVldGVyIHJ1bm5pbmcgb24KLSAgICB0aGUgUGh5c2ljYWwgY29uc29sZS4gIHN1ZG8oMSkgaXMgdXNlZCB0byBydW4geDExdm5jIHdpdGggRkRfWERNPTEuCi0KLSAgICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRzdm5jJ3MgcmVndWxhciBUZXJtaW5hbCBTZXJ2aWNlcyBtb2RlIHdoZXJlCi0gICAgdXN1YWxseSBhIHZpcnR1YWwgKFJBTSBvbmx5LCBlLmcuIFh2ZmIpIFggc2VydmVyIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uCi0gICAgaXQgaXMgdGhlIHBoeXNpY2FsIGdyYXBoaWNzIGhhcmR3YXJlIHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQgdG8uCi0KLSAgICBOb3RlIHRoYXQgaWYgeW91ciB1c2VyIGlzIEFMUkVBRFkgbG9nZ2VkIGludG8gdGhlIHBoeXNpY2FsIGRpc3BsYXksCi0gICAgeW91IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgWCBMb2dpbiBvcHRpb24gYmVjYXVzZSB4MTF2bmMgc2hvdWxkIGZpbmQKLSAgICBpdCBpbiBpdHMgbm9ybWFsIGZpbmQtZGlzcGxheSBwcm9jZWR1cmUgYW5kIG5vdCBuZWVkIHN1ZG8oMSkuCi0KLSAgICBBbiBpbml0aWFsIHNzaCBydW5uaW5nICdzdWRvIGlkJyBpcyBwZXJmb3JtZWQgdG8gdHJ5IHRvICdwcmltZScgCi0gICAgc3VkbyBzbyB0aGUgMm5kIG9uZSB0aGF0IHJ1bnMgeDExdm5jIGRvZXMgbm90IG5lZWQgYSBwYXNzd29yZC4KLSAgICBUaGlzIG1heSBub3QgYWx3YXlzIHN1Y2NlZWQuLi4KLQotICAgIE5vdGUgdGhhdCBpZiBzb21lb25lIGlzIGFscmVhZHkgbG9nZ2VkIGludG8gdGhlIGRpc3BsYXkgY29uc29sZQotICAgIHZpYSBYRE0gKEdETSwgS0RNIGV0Yy4pIHlvdSB3aWxsIHNlZSBhbmQgY29udHJvbCB0aGVpciBYIHNlc3Npb24uCi0KLSAgICBPdGhlcndpc2UsIHlvdSB3aWxsIGdldCB0aGUgR3JlZXRlciBYIGxvZ2luIHNjcmVlbiB3aGVyZSB5b3UgY2FuCi0gICAgbG9nIGluIHZpYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuICBZb3VyIFNTVk5DICdUZXJtaW5hbCBTZXJ2aWNlcycKLSAgICBEZXNrdG9wIFR5cGUsIFNpemUsIFByaW50aW5nIGV0Yy4gc2V0dGluZ3Mgd2lsbCBiZSBpZ25vcmVkIGluIHRoaXMKLSAgICBjYXNlIG9mIGNvdXJzZSBiZWNhdXNlIFhETSwgR0RNLCBvciBLRE0gaXMgY3JlYXRpbmcgeW91ciBYIHNlc3Npb24sCi0gICAgbm90IHgxMXZuYy4KLQotICAgIE5vdGUgdGhhdCB0aGUgR0RNIGRpc3BsYXkgbWFuYWdlciBoYXMgYSBzZXR0aW5nIEtpbGxJbml0Q2xpZW50cyBpbgotICAgIGdkbS5jb25mIHRoYXQgd2lsbCBraWxsIHgxMXZuYyByaWdodCBhZnRlciB5b3UgbG9nIGluLCBhbmQgc28geW91IHdvdWxkCi0gICAgaGF2ZSB0byByZXBlYXQgdGhlIHdob2xlIHByb2Nlc3MgKCdDb25uZWN0JyBidXR0b24pIHRvIGF0dGFjaCB0byB5b3VyCi0gICAgc2Vzc2lvbi4gU2VlIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWRpc3BsYXktbWFuYWdlcgotICAgIGZvciBtb3JlIGluZm8uCi19Ci0JLnhsb2cuZi50IGluc2VydCBlbmQgJG1zZwotCi0JYnV0dG9uIC54bG9nLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAueGxvZzsgc2V0IHRzX3hsb2dpbiAwfQotCWJpbmQgLnhsb2cgPEVzY2FwZT4ge2Rlc3Ryb3kgLnhsb2c7IHNldCB0c194bG9naW4gMH0KLQl3bSBwcm90b2NvbCAueGxvZyBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC54bG9nOyBzZXQgdHNfeGxvZ2luIDB9Ci0KLQlidXR0b24gLnhsb2cuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnhsb2c7IHNldCB0c194bG9naW4gMX0KLQotCXBhY2sgLnhsb2cuZG9uZSAueGxvZy5jYW5jZWwgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC54bG9nLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC54bG9nCi19Ci0KLQotcHJvYyB0c19vdGhlcnZuY19kaWFsb2cge30gewotCi0JdG9wbGV2IC5vdm5jCi0Jd20gdGl0bGUgLm92bmMgIk90aGVyIFZOQyBTZXJ2ZXIiCi0KLQlzY3JvbGxfdGV4dCAub3ZuYy5mIDgwIDIxCi0KLQlnbG9iYWwgdHNfb3RoZXJ2bmMgY2hvb3NlX290aGVydm5jCi0KLQlzZXQgbXNnIHsKLSAgICBUaGUgeDExdm5jIHByb2dyYW0gcnVubmluZyBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgY2FuIGJlIGluc3RydWN0ZWQgdG8KLSAgICBpbW1lZGlhdGVseSByZWRpcmVjdCB0byBzb21lIG90aGVyICgzcmQgcGFydHksIGUuZy4gWHZuYyBvciB2bmMuc28pCi0gICAgVk5DIHNlcnZlci4KLQotICAgIEl0IHNob3VsZCBiZSBhIGxpdHRsZSBmYXN0ZXIgdG8gaGF2ZSB4MTF2bmMgZm9yd2FyZCB0aGUgVk5DIHByb3RvY29sCi0gICAgcmF0aGVyIHRoYW4gaGF2aW5nIGl0IHBvbGwgdGhlIGNvcnJlc3BvbmRpbmcgWCBzZXJ2ZXIgZm9yIGNoYW5nZXMKLSAgICBpbiB0aGUgd2F5IGl0IG5vcm1hbGx5IGRvZXMgYW5kIHRyYW5zbGF0ZSB0byBWTkMuCi0KLSAgICBUaGlzIG1vZGUgYWxzbyBlbmFibGVzIGEgc2ltcGxlIHdheSB0byBhZGQgU1NMIG9yIGZpbmQgWCBkaXNwbGF5Ci0gICAgc3VwcG9ydCB0byBhIDNyZCBwYXJ0eSBWTkMgU2VydmVyIGxhY2tpbmcgdGhlc2UgZmVhdHVyZXMuCi0KLSAgICBJbiB0aGUgZW50cnkgYm94IHB1dCB0aGUgb3RoZXIgdm5jIGRpc3BsYXksIGUuZy4gImxvY2FsaG9zdDowIiBvcgotICAgICJzb21laG9zdDo1Ii4KLQotICAgIFRoZSBzdHJpbmcgImZpbmQiIGluIHRoZSBlbnRyeSB3aWxsIGhhdmUgeDExdm5jIHRyeSB0byBmaW5kIGFuIFgKLSAgICBkaXNwbGF5IGluIGl0cyBub3JtYWwgd2F5LCBhbmQgdGhlbiByZWRpcmVjdCB0byB0aGUgY29ycmVzcG9uZGluZyBWTkMKLSAgICBzZXJ2ZXIgcG9ydC4gIFRoaXMgYXNzdW1lcyBpZiB0aGUgWCBkaXNwbGF5IGlzLCBzYXksIDoyIChpLmUuIHBvcnQKLSAgICA2MDAyKSB0aGVuIHRoZSBWTkMgZGlzcGxheSBpcyBhbHNvIDoyIChpLmUuIHBvcnQgNTkwMikuICBUaGlzIG1vZGUgaXMKLSAgICB0aGUgc2FtZSBhcyBhbiAiWCBTZXJ2ZXIgVHlwZSIgb2YgIlh2bmMucmVkaXJlY3QiIChhbmQgb3ZlcnJpZGVzIGl0KS4KLX0KLQkub3ZuYy5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlmcmFtZSAub3ZuYy5jCi0JbGFiZWwgLm92bmMuYy5sIC1hbmNob3IgdyAtdGV4dCAiT3RoZXIgVk5DIFNlcnZlcjoiCi0JZW50cnkgLm92bmMuYy5lIC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIHRzX290aGVydm5jCi0JcGFjayAub3ZuYy5jLmwgLXNpZGUgbGVmdAotCXBhY2sgLm92bmMuYy5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWJ1dHRvbiAub3ZuYy5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLm92bmM7IHNldCBjaG9vc2Vfb3RoZXJ2bmMgMH0KLQliaW5kIC5vdm5jIDxFc2NhcGU+IHtkZXN0cm95IC5vdm5jOyBzZXQgY2hvb3NlX290aGVydm5jIDB9Ci0Jd20gcHJvdG9jb2wgLm92bmMgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAub3ZuYzsgc2V0IGNob29zZV9vdGhlcnZuYyAwfQotCWJ1dHRvbiAub3ZuYy5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAub3ZuYzsgc2V0IGNob29zZV9vdGhlcnZuYyAxfQotCWJpbmQgLm92bmMuYy5lIDxSZXR1cm4+IHtkZXN0cm95IC5vdm5jOyBzZXQgY2hvb3NlX290aGVydm5jIDF9Ci0KLQlpZiB7JHRzX290aGVydm5jID09ICIifSB7Ci0JCXNldCB0c19vdGhlcnZuYyAiZmluZCIKLQl9Ci0KLQlwYWNrIC5vdm5jLmRvbmUgLm92bmMuY2FuY2VsIC5vdm5jLmMgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5vdm5jLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5vdm5jCi0JZm9jdXMgLm92bmMuYy5lIAotfQotCi1wcm9jIHRzX3NsZWVwX2RpYWxvZyB7fSB7Ci0KLQl0b3BsZXYgLmVzbHAKLQl3bSB0aXRsZSAuZXNscCAiRXh0cmEgU2xlZXAiCi0KLQlzY3JvbGxfdGV4dCAuZXNscC5mIDgwIDUKLQotCWdsb2JhbCBleHRyYV9zbGVlcAotCi0Jc2V0IG1zZyB7Ci0gICAgU2xlZXA6IEVudGVyIGEgbnVtYmVyIHRvIGluZGljYXRlIGhvdyBtYW55IGV4dHJhIHNlY29uZHMgdG8gc2xlZXAKLSAgICB3aGlsZSB3YWl0aW5nIGZvciB0aGUgVk5DIHZpZXdlciB0byBzdGFydCB1cC4gIE9uIFdpbmRvd3MgdGhpcwotICAgIGNhbiBnaXZlIGV4dHJhIHRpbWUgdG8gZW50ZXIgdGhlIFB1dHR5L1BsaW5rIHBhc3N3b3JkLCBldGMuCi19Ci0JLmVzbHAuZi50IGluc2VydCBlbmQgJG1zZwotCi0JZnJhbWUgLmVzbHAuYwotCWxhYmVsIC5lc2xwLmMubCAtYW5jaG9yIHcgLXRleHQgIkV4dHJhIFNsZWVwOiIKLQllbnRyeSAuZXNscC5jLmUgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZXh0cmFfc2xlZXAKLQlwYWNrIC5lc2xwLmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAuZXNscC5jLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC5lc2xwLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAuZXNscDsgc2V0IGNob29zZV9zbGVlcCAwfQotCWJpbmQgLmVzbHAgPEVzY2FwZT4ge2Rlc3Ryb3kgLmVzbHA7IHNldCBjaG9vc2Vfc2xlZXAgMH0KLQl3bSBwcm90b2NvbCAuZXNscCBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5lc2xwOyBzZXQgY2hvb3NlX3NsZWVwIDB9Ci0JYnV0dG9uIC5lc2xwLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5lc2xwOyBzZXQgY2hvb3NlX3NsZWVwIDF9Ci0JYmluZCAuZXNscC5jLmUgPFJldHVybj4ge2Rlc3Ryb3kgLmVzbHA7IHNldCBjaG9vc2Vfc2xlZXAgMX0KLQotCWdsb2JhbCBjaG9vc2Vfc2xlZXAKLQlpZiB7ISAkY2hvb3NlX3NsZWVwfSB7Ci0JCXNldCBleHRyYV9zbGVlcCAiIgotCX0KLQotCXBhY2sgLmVzbHAuZG9uZSAuZXNscC5jYW5jZWwgLmVzbHAuYyAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLmVzbHAuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLmVzbHAKLQlmb2N1cyAuZXNscC5jLmUgCi19Ci0KLXByb2MgdHNfcHV0dHlfYXJnc19kaWFsb2cge30gewotCi0JdG9wbGV2IC5wYXJnCi0Jd20gdGl0bGUgLnBhcmcgIlB1dHR5IEFyZ3MiCi0KLQlzY3JvbGxfdGV4dCAucGFyZy5mIDgwIDUKLQotCWdsb2JhbCBwdXR0eV9hcmdzCi0KLQlzZXQgbXNnIHsKLSAgICBQdXR0eSBBcmdzOiBFbnRlciBhIHN0cmluZyB0byBiZSBhZGRlZCB0byBldmVyeSBwbGluay5leGUgYW5kIHB1dHR5LmV4ZQotICAgIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOiAtaSBDOlxteWtleS5wcGsKLX0KLQkucGFyZy5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlmcmFtZSAucGFyZy5jCi0JbGFiZWwgLnBhcmcuYy5sIC1hbmNob3IgdyAtdGV4dCAiUHV0dHkgQXJnczoiCi0JZW50cnkgLnBhcmcuYy5lIC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIHB1dHR5X2FyZ3MKLQlwYWNrIC5wYXJnLmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAucGFyZy5jLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC5wYXJnLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAucGFyZzsgc2V0IGNob29zZV9wYXJnIDB9Ci0JYmluZCAucGFyZyA8RXNjYXBlPiB7ZGVzdHJveSAucGFyZzsgc2V0IGNob29zZV9wYXJnIDB9Ci0Jd20gcHJvdG9jb2wgLnBhcmcgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAucGFyZzsgc2V0IGNob29zZV9wYXJnIDB9Ci0JYnV0dG9uIC5wYXJnLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5wYXJnOyBzZXQgY2hvb3NlX3BhcmcgMX0KLQliaW5kIC5wYXJnLmMuZSA8UmV0dXJuPiB7ZGVzdHJveSAucGFyZzsgc2V0IGNob29zZV9wYXJnIDF9Ci0KLQlnbG9iYWwgY2hvb3NlX3BhcmcKLQlpZiB7ISAkY2hvb3NlX3Bhcmd9IHsKLQkJc2V0IHB1dHR5X2FyZ3MgIiIKLQl9Ci0KLQlwYWNrIC5wYXJnLmRvbmUgLnBhcmcuY2FuY2VsIC5wYXJnLmMgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5wYXJnLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5wYXJnCi0JZm9jdXMgLnBhcmcuYy5lIAotfQotCi1wcm9jIHRzX25jYWNoZV9kaWFsb2cge30gewotCi0JdG9wbGV2IC5uY2hlCi0Jd20gdGl0bGUgLm5jaGUgIkNsaWVudC1TaWRlIENhY2hpbmciCi0KLQlzY3JvbGxfdGV4dCAubmNoZS5mIDgwIDIyCi0KLQlnbG9iYWwgdHNfbmNhY2hlIGNob29zZV9uY2FjaGUKLQotCXNldCBtc2cgewotICAgIFRoaXMgZW5hYmxlcyB0aGUgKmV4cGVyaW1lbnRhbCogeDExdm5jIGNsaWVudC1zaWRlIGNhY2hpbmcgbW9kZS4KLSAgICBJdCBvZnRlbiBnaXZlcyBuaWNlIHNwZWVkdXBzLCBidXQgY2FuIHNvbWV0aW1lcyBsZWFkIHRvIHBhaW50aW5nCi0gICAgZXJyb3JzIG9yIHdpbmRvdyAiZmxhc2hpbmciLiAoeW91IGNhbiByZXBhaW50IHRoZSBzY3JlZW4gYnkgdGFwcGluZwotICAgIHRoZSBMZWZ0IEFsdCBrZXkgMyB0aW1lcyBpbiBhIHJvdykKLQotICAgIEl0IGlzIGEgdmVyeSBzaW1wbGUgYnV0IGhvZ2d5IG1ldGhvZDogdW5jb21wcmVzc2VkIGltYWdlIHBpeG1hcHMgYXJlCi0gICAgc3RvcmVkIGluIHRoZSB2aWV3ZXIgaW4gYSBsYXJnZSAoMjAtMTAwTUIpIGRpc3BsYXkgcmVnaW9uIGJlbmVhdGgKLSAgICB0aGUgYWN0dWFsIGRpc3BsYXkgc2NyZWVuLiAgWW91IG1heSBuZWVkIGFsc28gdG8gYWRqdXN0IHlvdXIgVk5DIFZpZXdlcgotICAgIHRvIG5vdCBzaG93IHRoaXMgcmVnaW9uICh0aGUgU1NWTkMgVW5peCB2aWV3ZXIgZG9lcyBpdCBhdXRvbWF0aWNhbGx5KS4KLQotICAgIFRoZSBzY2hlbWUgdXNlcyBhIGxvdCBvZiBSQU0sIGJ1dCBhdCBsZWFzdCBpdCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0Ci0gICAgaXQgd29ya3Mgd2l0aCBldmVyeSBWTkMgVmlld2VyLiAgT3RoZXJ3aXNlIHRoZSBWTkMgcHJvdG9jb2wgd291bGQKLSAgICBuZWVkIHRvIGJlIG1vZGlmaWVkLCBjaGFuZ2luZyBib3RoIHRoZSBzZXJ2ZXIgYW5kIHRoZSB2aWV3ZXIuCi0KLSAgICBTZXQgdGhlIHgxMXZuYyAiLW5jYWNoZSIgcGFyYW1ldGVyIHRvIGFuIGV2ZW4gaW50ZWdlciBiZXR3ZWVuIDIKLSAgICBhbmQgMjAuICBUaGlzIGlzIHRoZSBpbmNyZWFzZSBpbiBhcmVhIGZhY3RvciBvdmVyIHRoZSBub3JtYWwgc2NyZWVuCi0gICAgZm9yIHRoZSBjYWNoaW5nIHJlZ2lvbi4gIFNvIDEwIG1lYW5zIHVzZSAxMCB0aW1lcyB0aGUgUkFNIHRvIHN0b3JlCi0gICAgcGl4bWFwcy4gIFRoZSBkZWZhdWx0IGlzIDguCi0KLSAgICBNb3JlIGluZm86IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWNsaWVudC1jYWNoaW5nCi19Ci0JLm5jaGUuZi50IGluc2VydCBlbmQgJG1zZwotCi0JZnJhbWUgLm5jaGUuYwotCWxhYmVsIC5uY2hlLmMubCAtYW5jaG9yIHcgLXRleHQgIm5jYWNoZToiCi0JcmFkaW9idXR0b24gLm5jaGUuYy5yMiAgLXRleHQgIjIiICAtdmFyaWFibGUgdHNfbmNhY2hlIC12YWx1ZSAiMiIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnI0ICAtdGV4dCAiNCIgIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICI0IgotCXJhZGlvYnV0dG9uIC5uY2hlLmMucjYgIC10ZXh0ICI2IiAgLXZhcmlhYmxlIHRzX25jYWNoZSAtdmFsdWUgIjYiCi0JcmFkaW9idXR0b24gLm5jaGUuYy5yOCAgLXRleHQgIjgiICAtdmFyaWFibGUgdHNfbmNhY2hlIC12YWx1ZSAiOCIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIxMCAtdGV4dCAiMTAiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIxMCIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIxMiAtdGV4dCAiMTIiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIxMiIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIxNCAtdGV4dCAiMTQiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIxNCIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIxNiAtdGV4dCAiMTYiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIxNiIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIxOCAtdGV4dCAiMTgiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIxOCIKLQlyYWRpb2J1dHRvbiAubmNoZS5jLnIyMCAtdGV4dCAiMjAiIC12YXJpYWJsZSB0c19uY2FjaGUgLXZhbHVlICIyMCIKLQlwYWNrIC5uY2hlLmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAubmNoZS5jLnIyIC5uY2hlLmMucjQgLm5jaGUuYy5yNiAubmNoZS5jLnI4IC5uY2hlLmMucjEwIFwKLQkJLm5jaGUuYy5yMTIgLm5jaGUuYy5yMTQgLm5jaGUuYy5yMTYgLm5jaGUuYy5yMTggIC5uY2hlLmMucjIwIC1zaWRlIGxlZnQKLQlidXR0b24gLm5jaGUuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC5uY2hlOyBzZXQgY2hvb3NlX25jYWNoZSAwfQotCWJpbmQgLm5jaGUgPEVzY2FwZT4ge2Rlc3Ryb3kgLm5jaGU7IHNldCBjaG9vc2VfbmNhY2hlIDB9Ci0Jd20gcHJvdG9jb2wgLm5jaGUgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAubmNoZTsgc2V0IGNob29zZV9uY2FjaGUgMH0KLQlidXR0b24gLm5jaGUuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLm5jaGU7IHNldCBjaG9vc2VfbmNhY2hlIDF9Ci0KLQlwYWNrIC5uY2hlLmRvbmUgLm5jaGUuY2FuY2VsIC5uY2hlLmMgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5uY2hlLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5uY2hlCi19Ci0KLXByb2MgdHNfeDExdm5jX29wdHNfZGlhbG9nIHt9IHsKLQotCXRvcGxldiAueDExdgotCXdtIHRpdGxlIC54MTF2ICJ4MTF2bmMgT3B0aW9ucyIKLQotCXNldCBoIDIzCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyMQotCX0KLQlzY3JvbGxfdGV4dCAueDExdi5mIDgwICRoCi0KLQlnbG9iYWwgdHNfeDExdm5jX29wdHMgdHNfeDExdm5jX3BhdGggdHNfeDExdm5jX2F1dG9wb3J0IGNob29zZV94MTF2bmNfb3B0cwotCWdsb2JhbCBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzX2xpc3QKLQotCXNldCBtc2cgewotICAgIElmIHlvdSBhcmUgYW4gZXhwZXJ0IHdpdGggeDExdm5jJ3MgZW5kbGVzcyBvcHRpb25zIGFuZCB0d2Vha2luZwotICAgIHBhcmFtZXRlcnMgZmVlbCBmcmVlIHRvIHNwZWNpZnkgYW55IHlvdSB3YW50IGhlcmUgaW4gIk9wdGlvbnMiLgotCi0gICAgQWxzbywgaWYgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgeDExdm5jIHByb2dyYW0gb24gdGhlCi0gICAgcmVtb3RlIHNpZGUgYmVjYXVzZSBpdCB3aWxsIG5vdCBiZSBpbiAkUEFUSCwgcHV0IGl0IGluIHRoZSAiRnVsbAotICAgIFBhdGgiIGVudHJ5LgotCi0gICAgUG9ydCBSZWRpcnMgYXJlIGFkZGl0aW9uYWwgU1NIICItTCBwb3J0Omhvc3Q6cG9ydCIgb3IgIi1SIHBvcnQ6aG9zdDpwb3J0IgotICAgIChmb3J3YXJkIG9yIHJldmVyc2UsIHJlc3AuKSBwb3J0IHJlZGlyZWN0aW9ucyB5b3Ugd2FudC4gIEluIFNTVk5DIG1vZGUsCi0gICAgc2VlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiB1bmRlcjogT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBQb3J0IFJlZGlycy4KLQotICAgIFNvbWUgcG90ZW50aWFsbHkgdXNlZnVsIG9wdGlvbnM6Ci0KLQktc29saWQJCS1zY2FsZQkJLXNjYWxlX2N1cnNvcgotCS1wYXNzd2QJCS1yZmJhdXRoCS1odHRwCi0JLXhyYW5kcgkJLXJvdGF0ZQkJLW5veGRhbWFnZQotCS14a2IJCS1za2lwX2xvY2trZXlzCS1ub21vZHR3ZWFrCi0JLXJlcGVhdAkJLWN1cnNvcgkJLXdtZHQKLQktbm93aXJlZnJhbWUJLW5jYWNoZV9jcgktc3BlZWRzCi0KLSAgICBNb3JlIGluZm86IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWNtZGxpbmUtb3B0cwotfQotIyAgICBJbiBBdXRvIFBvcnQgcHV0IGEgc3RhcnRpbmcgcG9ydCBmb3IgeDExdm5jIHRvIHRyeSBhdXRvcHJvYmluZwotIyAgICBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDU5MDAuICBJdCBzdGFydHMgYXQgdGhlIHZhbHVlIHlvdSBzdXBwbHkgYW5kCi0jICAgIHdvcmtzIHVwd2FyZCB1bnRpbCBhIGZyZWUgb25lIGlzIGZvdW5kLiAoeDExdm5jIDAuOS4zIG9yIGxhdGVyKS4KLQotCS54MTF2LmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWZyYW1lIC54MTF2LmMKLQlsYWJlbCAueDExdi5jLmwgLXdpZHRoIDEwIC1hbmNob3IgdyAtdGV4dCAiT3B0aW9uczoiCi0JZW50cnkgLngxMXYuYy5lIC10ZXh0dmFyaWFibGUgdHNfeDExdm5jX29wdHMKLQlwYWNrIC54MTF2LmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAueDExdi5jLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JZnJhbWUgLngxMXYuYzIKLQlsYWJlbCAueDExdi5jMi5sIC13aWR0aCAxMCAtYW5jaG9yIHcgLXRleHQgIkZ1bGwgUGF0aDoiCi0JZW50cnkgLngxMXYuYzIuZSAtdGV4dHZhcmlhYmxlIHRzX3gxMXZuY19wYXRoCi0JcGFjayAueDExdi5jMi5sIC1zaWRlIGxlZnQKLQlwYWNrIC54MTF2LmMyLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0jCWZyYW1lIC54MTF2LmMzCi0jCWxhYmVsIC54MTF2LmMzLmwgLXdpZHRoIDEwIC1hbmNob3IgdyAtdGV4dCAiQXV0byBQb3J0OiIKLSMJZW50cnkgLngxMXYuYzMuZSAtdGV4dHZhcmlhYmxlIHRzX3gxMXZuY19hdXRvcG9ydAotIwlwYWNrIC54MTF2LmMzLmwgLXNpZGUgbGVmdAotIwlwYWNrIC54MTF2LmMzLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JZnJhbWUgLngxMXYuYzQKLQlsYWJlbCAueDExdi5jNC5sIC13aWR0aCAxMCAtYW5jaG9yIHcgLXRleHQgIlBvcnQgUmVkaXJzOiIKLQllbnRyeSAueDExdi5jNC5lIC10ZXh0dmFyaWFibGUgYWRkaXRpb25hbF9wb3J0X3JlZGlyc19saXN0Ci0JcGFjayAueDExdi5jNC5sIC1zaWRlIGxlZnQKLQlwYWNrIC54MTF2LmM0LmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC54MTF2LmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAueDExdjsgc2V0IGNob29zZV94MTF2bmNfb3B0cyAwfQotCWJpbmQgLngxMXYgPEVzY2FwZT4ge2Rlc3Ryb3kgLngxMXY7IHNldCBjaG9vc2VfeDExdm5jX29wdHMgMH0KLQl3bSBwcm90b2NvbCAueDExdiBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC54MTF2OyBzZXQgY2hvb3NlX3gxMXZuY19vcHRzIDB9Ci0JYnV0dG9uIC54MTF2LmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC54MTF2OyBzZXQgY2hvb3NlX3gxMXZuY19vcHRzIDE7Ci0JCQlpZiB7JGFkZGl0aW9uYWxfcG9ydF9yZWRpcnNfbGlzdCAhPSAiIn0ge3NldCBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzIDF9IGVsc2Uge3NldCBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzIDB9fQotCi0jCXBhY2sgLngxMXYuZG9uZSAueDExdi5jYW5jZWwgLngxMXYuYzQgLngxMXYuYzMgLngxMXYuYzIgLngxMXYuYyAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLngxMXYuZG9uZSAueDExdi5jYW5jZWwgLngxMXYuYzQgLngxMXYuYzIgLngxMXYuYyAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLngxMXYuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLngxMXYKLQlmb2N1cyAueDExdi5jLmUgCi19Ci0KLQotcHJvYyB0c19maWxleGZlcl9kaWFsb2cge30gewotCi0JdG9wbGV2IC54ZmVyCi0Jd20gdGl0bGUgLnhmZXIgIkZpbGUgVHJhbnNmZXIiCi0JZ2xvYmFsIGNob29zZV9maWxleGZlciB0c19maWxleGZlcgotCi0Jc2Nyb2xsX3RleHQgLnhmZXIuZiA3MCAxMwotCi0Jc2V0IG1zZyB7Ci0gICAgeDExdm5jIHN1cHBvcnRzIGJvdGggdGhlIFVsdHJhVk5DIGFuZCBUaWdodFZOQyBmaWxlIHRyYW5zZmVyCi0gICAgZXh0ZW5zaW9ucy4gIE9uIFdpbmRvd3MgYm90aCB2aWV3ZXJzIHN1cHBvcnQgdGhlaXIgZmlsZSB0cmFuc2ZlcgotICAgIHByb3RvY29sLiAgT24gVW5peCBvbmx5IHRoZSBTU1ZOQyBWTkMgVmlld2VyIGNhbiBkbyBmaWxleGZlcjsgaXQKLSAgICBzdXBwb3J0cyB0aGUgVWx0cmFWTkMgZmxhdm9yIHZpYSBhIEphdmEgaGVscGVyIHByb2dyYW0gKGFuZCBzbwotICAgIGphdmEoMSkgaXMgcmVxdWlyZWQgb24gdGhlIHZpZXdlci1zaWRlKS4KLQotICAgIENob29zZSB0aGUgb25lIHlvdSB3YW50IGJhc2VkIG9uIFZOQyB2aWV3ZXIgeW91IHdpbGwgdXNlLgotICAgIFRoZSBkZWZhdWx0cyBmb3IgdGhlIFNTVk5DIHZpZXdlciBwYWNrYWdlIGFyZSBUaWdodFZOQyBvbgotICAgIFdpbmRvd3MgYW5kIFVsdHJhVk5DIG9uIFVuaXguCi0KLSAgICBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtZmlsZXhmZXIKLX0KLQkueGZlci5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlnbG9iYWwgaXNfd2luZG93cwotCWlmIHskdHNfZmlsZXhmZXIgPT0gIiJ9IHsKLQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQlzZXQgdHNfZmlsZXhmZXIgInRpZ2h0IgotCQl9IGVsc2UgewotCQkJc2V0IHRzX2ZpbGV4ZmVyICJ1bHRyYSIKLQkJfQotCX0KLQotCWZyYW1lIC54ZmVyLmMKLQlyYWRpb2J1dHRvbiAueGZlci5jLnRpZ2h0ICAtdGV4dCAiVGlnaHRWTkMiICAtdmFyaWFibGUgdHNfZmlsZXhmZXIgLXZhbHVlICJ0aWdodCIgLXJlbGllZiByaWRnZQotCXJhZGlvYnV0dG9uIC54ZmVyLmMudWx0cmEgIC10ZXh0ICJVbHRyYVZOQyIgIC12YXJpYWJsZSB0c19maWxleGZlciAtdmFsdWUgInVsdHJhIiAtcmVsaWVmIHJpZGdlCi0KLQlwYWNrIC54ZmVyLmMudWx0cmEgLnhmZXIuYy50aWdodCAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxCi0KLQlidXR0b24gLnhmZXIuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC54ZmVyOyBzZXQgY2hvb3NlX2ZpbGV4ZmVyIDB9Ci0JYmluZCAueGZlciA8RXNjYXBlPiB7ZGVzdHJveSAueGZlcjsgc2V0IGNob29zZV9maWxleGZlciAwfQotCXdtIHByb3RvY29sIC54ZmVyIFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLnhmZXI7IHNldCBjaG9vc2VfZmlsZXhmZXIgMH0KLQlidXR0b24gLnhmZXIuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnhmZXI7IHNldCBjaG9vc2VfZmlsZXhmZXIgMX0KLQotCXBhY2sgLnhmZXIuZG9uZSAueGZlci5jYW5jZWwgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC54ZmVyLmMgLXNpZGUgYm90dG9tIC1maWxsIHggLWV4cGFuZCAxCi0JcGFjayAueGZlci5mIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQotCi0JY2VudGVyX3dpbiAueGZlcgotfQotCi1wcm9jIHRzX2N1cHNfZGlhbG9nIHt9IHsKLQotCXRvcGxldiAuY3VwcwotCXdtIHRpdGxlIC5jdXBzICJDVVBTIGFuZCBTTUIgUHJpbnRpbmciCi0JZ2xvYmFsIGN1cHNfbG9jYWxfc2VydmVyIGN1cHNfcmVtb3RlX3BvcnQgY3Vwc19tYW5hZ2VfcmNmaWxlIHRzX2N1cHNfbWFuYWdlX3JjZmlsZSBjdXBzX3gxMXZuYwotCWdsb2JhbCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgY3Vwc19yZW1vdGVfc21iX3BvcnQKLQotCXNldCBoIDMwCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyNAotCX0KLQlzY3JvbGxfdGV4dCAuY3Vwcy5mIDgwICRoCi0JCQotCi0Jc2V0IG1zZyB7Ci0gICAgVGhpcyBtZXRob2QgcmVxdWlyZXMgYSB3b3JraW5nIENVUFMgRGVza3RvcCBzZXR1cCBvbiB0aGUgcmVtb3RlIHNpZGUKLSAgICBvZiB0aGUgY29ubmVjdGlvbiBhbmQgd29ya2luZyBDVVBTIChvciBwb3NzaWJseSBXaW5kb3dzIFNNQiBvciBJUFApCi0gICAgcHJpbnRpbmcgb24gdGhlIGxvY2FsIHZpZXdlci1zaWRlIG9mIHRoZSBjb25uZWN0aW9uLgotCi0gICAgRm9yIENVUFMgcHJpbnRpbmcgcmVkaXJlY3Rpb24gdG8gd29yayBwcm9wZXJseSwgeW91IE1VU1QgZW5hYmxlIGl0IGZvcgotICAgIHRoZSBjb25uZWN0aW9uIHRoYXQgKmNyZWF0ZXMqIHlvdXIgdGVybWluYWwgc2VydmljZXMgWCBzZXNzaW9uIChpLmUuIHRoZQotICAgIGZpcnN0IGNvbm5lY3Rpb24uKSAgWW91IGNhbm5vdCByZXRyb2FjdGl2ZWx5IGVuYWJsZSBDVVBTIHJlZGlyZWN0aW9uCi0gICAgb24gYW4gYWxyZWFkeSBleGlzdGluZyB0ZXJtaW5hbCBzZXJ2aWNlcyBYIHNlc3Npb24uICAoU2VlIENVUFMgcHJpbnRpbmcKLSAgICBmb3Igbm9ybWFsIFNTVk5DIG1vZGUgZm9yIGhvdyB5b3UgbWlnaHQgZG8gdGhhdC4pCi0KLSAgICBFbnRlciB0aGUgVk5DIFZpZXdlciBzaWRlIChpLmUuIHdoZXJlIHlvdSBhcmUgc2l0dGluZykgQ1VQUyBzZXJ2ZXIKLSAgICB1bmRlciAiTG9jYWwgQ1VQUyBTZXJ2ZXIiLiAgVXNlICJsb2NhbGhvc3Q6NjMxIiBpZiB0aGVyZSBpcyBvbmUKLSAgICBvbiB5b3VyIHZpZXdlciBtYWNoaW5lIChub3JtYWxseSB0aGUgY2FzZSBpZiB5b3Ugc2V0IHVwIGEgcHJpbnRlcgotICAgIG9uIHlvdXIgdW5peCBvciBtYWNvc3ggc3lzdGVtKSwgb3IsIGUuZy4sICJteS1wcmludC1zcnY6NjMxIiBmb3IgYQotICAgIG5lYXJieSBDVVBTIHByaW50IHNlcnZlci4gIE5vdGUgdGhhdCA2MzEgaXMgdGhlIGRlZmF1bHQgQ1VQUyBwb3J0LgotCi0gICAgKE9uIE1hY09TWCBpdCBzZWVtcyBiZXR0ZXIgdG8gdXNlICIxMjcuMC4wLjEiIGluc3RlYWQgb2YgImxvY2FsaG9zdCIuKQotCi0gICAgVGhlIFNTVk5DIFRlcm1pbmFsIFNlcnZpY2VzIGNyZWF0ZWQgcmVtb3RlIERlc2t0b3Agc2Vzc2lvbiB3aWxsIGhhdmUKLSAgICB0aGUgdmFyaWFibGVzIENVUFNfU0VSVkVSIGFuZCBJUFBfUE9SVCBzZXQgc28gYWxsIHByaW50aW5nIGFwcGxpY2F0aW9ucwotICAgIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB5b3VyIGxvY2FsIENVUFMgc2VydmVyLiAgU28geW91ciBsb2NhbGx5IGF2YWlsYWJsZQotICAgIHByaW50ZXJzIHNob3VsZCBhcHBlYXIgaW4gdGhlIHJlbW90ZSBwcmludCBkaWFsb2dzLgotCi0KLSAgICBXaW5kb3dzL1NNQiBQcmludGVyczogIFVuZGVyICJMb2NhbCBTTUIgUHJpbnQgU2VydmVyIiB5b3UgY2FuIHNldCBhCi0gICAgcG9ydCByZWRpcmVjdGlvbiBmb3IgYSBXaW5kb3dzIChub24tQ1VQUykgU01CIHByaW50ZXIuICBJZiBsb2NhbGhvc3Q6MTM5Ci0gICAgZG9lcyBub3Qgd29yaywgdHJ5IHRoZSBsaXRlcmFsIHN0cmluZyAiSVA6MTM5Iiwgb3IgdXNlIHRoZSBrbm93biB2YWx1ZQotICAgIG9mIHRoZSBJUCBhZGRyZXNzIG1hbnVhbGx5LiAgMTM5IGlzIHRoZSBkZWZhdWx0IFNNQiBwb3J0OyBub3dhZGF5cyA0NDUKLSAgICBtaWdodCBiZSBhIGJldHRlciBwb3NzaWJpbGl0eS4KLQotICAgIEZvciBXaW5kb3dzL1NNQiBQcmludGVycyBpZiB0aGVyZSBpcyBubyBsb2NhbCBDVVBTIHByaW50IHNlcnZlciwgaXQgaXMKLSAgICB1c3VhbGx5IGEgdmVyeSBnb29kIGlkZWEgdG8gbWFrZSB0aGUgQ1VQUyBTZXJ2ZXIgc2V0dGluZyBFTVBUWSAodG8gYXZvaWQKLSAgICBkZXNrdG9wIGFwcHMgdHJ5aW5nIGluY2Vzc2FudGx5IHRvIHJlYWNoIHRoZSBub25leGlzdGVudCBDVVBTIHNlcnZlci4pCi0KLSAgICBPbiB0aGUgcmVtb3RlIHNpZGUsIGluIHRoZSBEZXNrdG9wIHNlc3Npb24gdGhlIHZhcmlhYmxlcyAkU01CX1NFUlZFUiwKLSAgICAkU01CX0hPU1QsIGFuZCAkU01CX1BPUlQgd2lsbCBiZSBzZXQgZm9yIHlvdSB0byB1c2UuCi0KLSAgICBVbmZvcnR1bmF0ZWx5LCBwcmludGluZyB0byBXaW5kb3dzIG1heSBvbmx5IHZlIHBhcnRpYWxseSBmdW5jdGlvbmFsIGR1ZQotICAgIHRvIHRoZSBnZW5lcmFsIGxhY2sgUG9zdFNjcmlwdCBzdXBwb3J0IG9uIFdpbmRvd3MuCi0KLSAgICBJZiB5b3UgaGF2ZSBwcmludCBhZG1pbiBwZXJtaXNzaW9uIG9uIHRoZSByZW1vdGUgbWFjaGluZSB5b3UgY2FuCi0gICAgY29uZmlndXJlIENVUFMgdG8ga25vdyBhYm91dCB5b3VyIFdpbmRvd3MgcHJpbnRlciB2aWEgbHBhZG1pbig4KSBvcgotICAgIGEgR1VJIHRvb2wuICBZb3UgZ2l2ZSBpdCB0aGUgVVJJOgotCi0gICAgICAgIHNtYjovL2xvY2FsaG9zdDpwb3J0L3ByaW50ZXJuYW1lCi0KLSAgICBvciBwb3NzaWJseToKLQotICAgICAgICBzbWI6Ly9sb2NhbGhvc3Q6cG9ydC9jb21wdXRlci9wcmludGVybmFtZQotCi0gICAgInBvcnQiIHdpbGwgYmUgZm91bmQgaW4gdGhlICRTTUJfUE9SVC4gIFlvdSBhbHNvIG5lZWQgdG8gaWRlbnRpZnkKLSAgICB0aGUgcHJpbnRlciB0eXBlLiAgTk9URTogWW91IHdpbGwgbGVhdmUgIkxvY2FsIENVUFMgU2VydmVyIiBibGFuayBpbgotICAgIHRoaXMgY2FzZS4gIFRoZSBzbWJzcG9vbCgxKSBjb21tYW5kIHNob3VsZCBhbHNvIHdvcmsgYXMgd2VsbCwgYXQgbGVhc3QKLSAgICBmb3IgUG9zdFNjcmlwdCBwcmludGVycy4KLQotICAgIEEgc2ltaWxhciB0aGluZyBjYW4gYmUgZG9uZSB3aXRoIENVUFMgcHJpbnRlcnMgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMKLSAgICB3aXRoIHRoZSBhYm92ZSBkZWZhdWx0IG1lY2hhbmlzbS4gIFVzZQotCi0gICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6cG9ydC9wcmludGVycy9wcmludGVybmFtZQotCi0gICAgRm9yIG1vcmUgaW5mbyBzZWU6IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWN1cHMKLX0KLQotIyAgICBUaGUgIk1hbmFnZSAnU2VydmVyTmFtZScgaW4gLmN1cHMvY2xpZW50LmNvbmYgZm9yIG1lIiBzZXR0aW5nIGlzIHVzdWFsbHkKLSMgICAgTk9UIG5lZWRlZCB1bmxlc3MgeW91IGFyZSB1c2luZyBUZXJtaW5hbCBTZXJ2aWNlcyB0byBjb25uZWN0IHRvIGFuCi0jICAgIGV4aXN0aW5nIFNlc3Npb24gdGhhdCBkaWQgTk9UIGhhdmUgQ1VQUyBwcmludCByZWRpcmVjdGlvbiBzZXQgYXQgc2Vzc2lvbgotIyAgICBzdGFydCB0aW1lIChpLmUuIElQUF9QT1JUIGFuZCBDVVBTX1NFUlZFUiB3ZXJlIG5vdCBzZXQgdXApLiAgSW4gdGhhdAotIyAgICBjYXNlLCBzZWxlY3QgdGhpcyBvcHRpb24gYXMgYSB3b3JrYXJvdW5kOiBOT1RFIHRoYXQgdGhlIGNsaWVudC5jb25mCi0jICAgIHNldHRpbmcgd2lsbCBSRURJUkVDVCBBTEwgUFJJTlRJTkcgZm9yIGFwcHMgd2l0aCB0aGUgc2FtZSAkSE9NRS8uY3VwcwotIyAgICBkaXJlY3RvcnkgKHdoaWNoIHlvdSBwcm9iYWJseSBkbyBub3Qgd2FudCksIGhvd2V2ZXIgaXQgd2lsbCBiZSByZXNldAotIyAgICB3aGVuIHRoZSBTU1ZOQyB2aWV3ZXIgZGlzY29ubmVjdHMuCi0KLQkuY3Vwcy5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlnbG9iYWwgdW5hbWUKLQlpZiB7JGN1cHNfbG9jYWxfc2VydmVyID09ICIifSB7Ci0JCWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJCXNldCBjdXBzX2xvY2FsX3NlcnZlciAiMTI3LjAuMC4xOjYzMSIKLQkJfSBlbHNlIHsKLQkJCXNldCBjdXBzX2xvY2FsX3NlcnZlciAibG9jYWxob3N0OjYzMSIKLQkJfQotCX0KLQlpZiB7JGN1cHNfcmVtb3RlX3BvcnQgPT0gIiJ9IHsKLQkJc2V0IGN1cHNfcmVtb3RlX3BvcnQgW2V4cHIgIjY3MzEgKyBpbnQoMTAwMCAqIHJhbmQoKSkiXQotCX0KLQlpZiB7JGN1cHNfbG9jYWxfc21iX3NlcnZlciA9PSAiIn0gewotCQlnbG9iYWwgaXNfd2luZG93cwotCQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJCXNldCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgIklQOjEzOSIKLQkJfSBlbHNlaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQkJc2V0IGN1cHNfbG9jYWxfc21iX3NlcnZlciAiMTI3LjAuMC4xOjEzOSIKLQkJfSBlbHNlIHsKLQkJCXNldCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgImxvY2FsaG9zdDoxMzkiCi0JCX0KLQl9Ci0JaWYgeyRjdXBzX3JlbW90ZV9zbWJfcG9ydCA9PSAiIn0gewotCQlzZXQgY3Vwc19yZW1vdGVfc21iX3BvcnQgW2V4cHIgIjc3MzEgKyBpbnQoMTAwMCAqIHJhbmQoKSkiXQotCX0KLQotCWZyYW1lIC5jdXBzLnNlcnYKLQlsYWJlbCAuY3Vwcy5zZXJ2LmwgLWFuY2hvciB3IC10ZXh0ICJMb2NhbCBDVVBTIFNlcnZlcjogICAgICAiCi0JZW50cnkgLmN1cHMuc2Vydi5lIC13aWR0aCA0MCAtdGV4dHZhcmlhYmxlIGN1cHNfbG9jYWxfc2VydmVyCi0JcGFjayAuY3Vwcy5zZXJ2LmUgLXNpZGUgcmlnaHQKLQlwYWNrIC5jdXBzLnNlcnYubCAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlmcmFtZSAuY3Vwcy5zbWJzCi0JbGFiZWwgLmN1cHMuc21icy5sIC1hbmNob3IgdyAtdGV4dCAiTG9jYWwgU01CIFByaW50IFNlcnZlcjogICAgICAiCi0JZW50cnkgLmN1cHMuc21icy5lIC13aWR0aCA0MCAtdGV4dHZhcmlhYmxlIGN1cHNfbG9jYWxfc21iX3NlcnZlcgotCXBhY2sgLmN1cHMuc21icy5lIC1zaWRlIHJpZ2h0Ci0JcGFjayAuY3Vwcy5zbWJzLmwgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JIyBub3Qgd29ya2luZyB3aXRoIHgxMXZuYzoKLQljaGVja2J1dHRvbiAuY3Vwcy5jdXBzcmMgLWFuY2hvciB3IC12YXJpYWJsZSB0c19jdXBzX21hbmFnZV9yY2ZpbGUgLXRleHQgXAotCQkiTWFuYWdlICdTZXJ2ZXJOYW1lJyBpbiB0aGUgcmVtb3RlIFwkSE9NRS8uY3Vwcy9jbGllbnQuY29uZiBmaWxlIGZvciBtZSIKLQotCWJ1dHRvbiAuY3Vwcy5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLmN1cHM7IHNldCB1c2VfY3VwcyAwfQotCWJpbmQgLmN1cHMgPEVzY2FwZT4ge2Rlc3Ryb3kgLmN1cHM7IHNldCB1c2VfY3VwcyAwfQotCXdtIHByb3RvY29sIC5jdXBzIFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLmN1cHM7IHNldCB1c2VfY3VwcyAwfQotCWJ1dHRvbiAuY3Vwcy5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAuY3VwczsgaWYgeyR1c2VfY3Vwc30ge3NldF9zc2h9fQotCi0JcGFjayAuY3Vwcy5kb25lIC5jdXBzLmNhbmNlbCAuY3Vwcy5zbWJzIC5jdXBzLnNlcnYgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5jdXBzLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5jdXBzCi0JZm9jdXMgLmN1cHMuc2Vydi5lCi19Ci0KLQotcHJvYyBjdXBzX2RpYWxvZyB7fSB7Ci0KLQl0b3BsZXYgLmN1cHMKLQl3bSB0aXRsZSAuY3VwcyAiQ1VQUyBUdW5uZWxsaW5nIgotCWdsb2JhbCBjdXBzX2xvY2FsX3NlcnZlciBjdXBzX3JlbW90ZV9wb3J0IGN1cHNfbWFuYWdlX3JjZmlsZSBjdXBzX3gxMXZuYwotCWdsb2JhbCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgY3Vwc19yZW1vdGVfc21iX3BvcnQKLQlnbG9iYWwgdHNfb25seQotCWlmIHskdHNfb25seX0gewotCQl0c19jdXBzX2RpYWxvZwotCQlyZXR1cm4KLQl9Ci0KLQlnbG9iYWwgdW5hbWUKLQlzZXQgaCAzMwotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IGggMTcKLQl9IGVsc2VpZiB7JHVuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCXNldCBoIDI0Ci0JfQotCXNjcm9sbF90ZXh0IC5jdXBzLmYgODAgJGgKLQkJCi0KLQlzZXQgbXNnIHsKLSAgICBDVVBTIFByaW50aW5nIHJlcXVpcmVzIFNTSCBiZSB1c2VkIHRvIHNldCB1cCB0aGUgQ1VQUyBQcmludCBzZXJ2aWNlIFRDUAotICAgIHBvcnQgcmVkaXJlY3Rpb24uICBUaGlzIHdpbGwgYmUgZWl0aGVyIG9mIHRoZSAiVXNlIFNTSCIgb3IgIlNTSCtTU0wiIG1vZGVzLgotICAgIE5PVEU6ICBGb3IgcHVyZSBTU0wgdHVubmVsbGluZyBpdCBjdXJyZW50bHkgd2lsbCBub3Qgd29yay4KLQotICAgIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHdvcmtpbmcgQ1VQUyBzb2Z0d2FyZSBzZXR1cHMgb24gQk9USCB0aGUgcmVtb3RlCi0gICAgYW5kIGxvY2FsIHNpZGVzIG9mIHRoZSBjb25uZWN0aW9uLgotCi0gICAgSWYgdGhlIHJlbW90ZSBWTkMgc2VydmVyIGlzIFdpbmRvd3MgeW91IHByb2JhYmx5IGNhbm5vdCBTU0ggaW50byBpdAotICAgIGFueXdheS4uLiAgSWYgeW91IGNhbiwgeW91IHdpbGwgc3RpbGwgbmVlZCB0byBzZXQgdXAgYSBzcGVjaWFsIHByaW50ZXIKLSAgICBUQ1AgcG9ydCByZWRpcmVjdGlvbiBvbiB5b3VyIG93bi4gIFBlcmhhcHMgYWRkaW5nIGFuZCBjb25maWd1cmluZyBhCi0gICAgIlVuaXggUHJpbnRlciIgdW5kZXIgV2luZG93cyAobGlrZSBNZXRob2QgIzIgYmVsb3cpIHdpbGwgd29yay4KLQotICAgIElmIHRoZSBsb2NhbCBtYWNoaW5lIChTU1ZOQyBzaWRlKSBpcyBXaW5kb3dzLCBzZWUgdGhlIGJvdHRvbSBvZiB0aGlzCi0gICAgaGVscCBmb3IgcmVkaXJlY3RpbmcgdG8gU01CIHByaW50ZXJzLgotCi0gICAgSWYgdGhlIHJlbW90ZSBWTkMgc2VydmVyIGlzIE1hYyBPUyBYIHRoaXMgbWV0aG9kIG1heSBvciBtYXkgbm90IHdvcmsuCi0gICAgU29tZXRpbWVzIGFwcGxpY2F0aW9ucyBuZWVkIHRvIGJlIHJlc3RhcnRlZCB0byBnZXQgdGhlbSB0byBub3RpY2UgdGhlCi0gICAgbmV3IHByaW50ZXJzLiAgQWRkaW5nIGFuZCBjb25maWd1cmluZyBhIHNwZWNpYWwgIlVuaXggUHJpbnRlciIsCi0gICAgKE1ldGhvZCAjMikgYmVsb3csIG1pZ2h0IHlpZWxkIG1vcmUgcmVsaWFibGUgcmVzdWx0cyBhdCB0aGUgY29zdCBvZgotICAgIGFkZGl0aW9uYWwgc2V0dXAgYW5kIHBlcm1pc3Npb25zLgotCi0gICAgRm9yIFVuaXgvTGludXggcmVtb3RlIFZOQyBzZXJ2ZXJzLCBhcHBsaWNhdGlvbnMgbWF5IGFsc28gbmVlZCB0byBiZQotICAgIHJlc3RhcnRlZCB0byBub3RpY2UgdGhlIG5ldyBwcmludGVycy4gIFRoZSBvbmx5IGNhc2Uga25vd24gdG8gd29yawotICAgIHdlbGwgaXMgdGhlIG9uZSB3aGVyZSB0aGUgcmVtb3RlIHNpZGUgaGFzIG5vIENVUFMgcHJpbnRlcnMgY29uZmlndXJlZC4KLSAgICBBcyBtZW50aW9uZWQgYWJvdmUsIHNlZSBNZXRob2QgIzIgZm9yIGFub3RoZXIgbWV0aG9kLgotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICoqKiBEaXJlY3Rpb25zOgotCi0gICAgWW91IGNob29zZSB5b3VyIG93biByZW1vdGUgQ1VQUyByZWRpciBwb3J0IGJlbG93IHVuZGVyICJVc2UgUmVtb3RlCi0gICAgQ1VQUyBQb3J0Ii4gIDY2MzEgaXMgb3VyIGRlZmF1bHQgYW5kIGlzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGJlbG93LgotICAgIFVzZSBpdCBvciBzb21lIHJhbmRvbSB2YWx1ZSBncmVhdGVyIHRoYW4gMTAyNC4gIE5vdGUgdGhhdCB0aGUgc3RhbmRhcmQKLSAgICBDVVBTIHNlcnZlciBwb3J0IGlzIDYzMS4KLQotICAgIFRoZSBwb3J0IHlvdSBjaG9vc2UgbXVzdCBiZSB1bnVzZWQgb24gdGhlIFZOQyBzZXJ2ZXIgbWFjaGluZSAoaXQgaXMgTk9UCi0gICAgY2hlY2tlZCBmb3IgeW91KS4gIFByaW50IHJlcXVlc3RzIGNvbm5lY3RpbmcgdG8gaXQgYXJlIHJlZGlyZWN0ZWQgdG8KLSAgICB5b3VyIGxvY2FsIFZOQyB2aWV3ZXItc2lkZSBDVVBTIHNlcnZlciB0aHJvdWdoIHRoZSBTU0ggdHVubmVsLgotCi0gICAgKE5vdGU6IHJvb3QgU1NIIGxvZ2luIHBlcm1pc3Npb24gaXMgbmVlZGVkIGZvciBwb3J0cyBsZXNzIHRoYW4gMTAyNCwKLSAgICBlLmcuIDYzMTsgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIHVzZSBzb21ldGhpbmcgYXJvdW5kIDY2MzEgaW5zdGVhZCkuCi0KLSAgICBUaGVuIGVudGVyIHRoZSBWTkMgVmlld2VyIHNpZGUgKGkuZS4gd2hlcmUgeW91IGFyZSBzaXR0aW5nKSBDVVBTIHNlcnZlcgotICAgIGludG8gIkxvY2FsIENVUFMgU2VydmVyIi4gIEEgZ29vZCBjaG9pY2UgaXMgdGhlIGRlZmF1bHQgImxvY2FsaG9zdDo2MzEiCi0gICAgaWYgdGhlcmUgaXMgYSBjdXBzIHNlcnZlciBvbiB5b3VyIHZpZXdlciBtYWNoaW5lICh0aGlzIGlzIHVzdWFsbHkgdGhlIGNhc2UKLSAgICBpZiB5b3UgaGF2ZSBzZXQgdXAgYSBwcmludGVyKS4gIE90aGVyd2lzZSBlbnRlciwgZS5nLiwgIm15LXByaW50LXNydjo2MzEiCi0gICAgZm9yIHlvdXIgbmVhcmJ5ICh2aWV3ZXItc2lkZSkgQ1VQUyBwcmludCBzZXJ2ZXIuCi0KLQotICAgIFRoZSAiTWFuYWdlICdTZXJ2ZXJOYW1lJyBpbiB0aGUgJEhPTUUvLmN1cHMvY2xpZW50LmNvbmYgZmlsZSBmb3IgbWUiCi0gICAgc2V0dGluZyBiZWxvdyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBJdCBzaG91bGQgaGFuZGxlIG1vc3Qgc2l0dWF0aW9ucy4KLQotICAgIFdoYXQgaXQgZG9lcyBpcyBtb2RpZnkgdGhlIC5jdXBzL2NsaWVudC5jb25mIGZpbGUgb24gdGhlIFZOQyBzZXJ2ZXItc2lkZQotICAgIHRvIHJlZGlyZWN0IHRoZSBwcmludCByZXF1ZXN0cyB3aGlsZSB0aGUgU1NWTkMgdmlld2VyIGlzIGNvbm5lY3RlZC4gIFdoZW4KLSAgICBTU1ZOQyBkaXNjb25uZWN0cyAuY3Vwcy9jbGllbnQuY29uZiBpcyByZXN0b3JlZCB0byBpdHMgcHJldmlvdXMgc2V0dGluZy4KLQotICAgIElmLCBmb3Igc29tZSByZWFzb24sIHRoZSBTU1ZOQyBDVVBTIHNjcmlwdCBmYWlscyB0byByZXN0b3JlIHRoaXMgZmlsZQotICAgIGFmdGVyIFNTVk5DIGRpc2Nvbm5lY3RzLCBydW4gdGhpcyBjb21tYW5kIG9uIHRoZSByZW1vdGUgbWFjaGluZToKLQotICAgICAgICBjcCAkSE9NRS8uY3Vwcy9jbGllbnQuY29uZi5iYWNrICRIT01FLy5jdXBzL2NsaWVudC5jb25mCi0KLSAgICB0byByZWdhaW4geW91ciBpbml0aWFsIHByaW50aW5nIGNvbmZpZ3VyYXRpb24uCi0KLQotICAgIFlvdSBjYW4gYWxzbyB1c2UgQ1VQUyBvbiB0aGUgVk5DIHNlcnZlci1zaWRlIHRvIHJlZGlyZWN0IHRvIFdpbmRvd3MKLSAgICAoU01CKSBwcmludGVycy4gIFNlZSB0aGUgYWRkaXRpb25hbCBpbmZvIGZvciBXaW5kb3dzIFByaW50aW5nIGF0IHRoZQotICAgIGJvdHRvbSBvZiB0aGlzIGhlbHAuCi0KLQotICAgIEluIGNhc2UgdGhlIGRlZmF1bHQgbWV0aG9kIChhdXRvbWF0aWMgLmN1cHMvY2xpZW50LmNvbmYgbW9kaWZpY2F0aW9uKQotICAgIGZhaWxzLCB3ZSBkZXNjcmliZSBiZWxvdyBhbGwgb2YgdGhlIHBvc3NpYmxlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdHJpZWQuCi0KLSAgICBBcyBub3RlZCBhYm92ZSwgeW91IG1heSBuZWVkIHRvIHJlc3RhcnQgYXBwbGljYXRpb25zIGZvciB0aGVtIHRvIG5vdGljZQotICAgIHRoZSBuZXcgcHJpbnRlcnMgb3IgZm9yIHRoZW0gdG8gcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBwcmludGVycy4gIElmIHRoaXMKLSAgICBpcyBub3QgYWNjZXB0YWJsZSwgY29uc2lkZXIgTWV0aG9kICMyIGJlbG93IGlmIHlvdSBoYXZlIHRoZSBwZXJtaXNzaW9uCi0gICAgYW5kIGFiaWxpdHkgdG8gYWx0ZXIgdGhlIHByaW50IHF1ZXVlcyBmb3IgdGhpcy4KLQotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICoqKiBNZXRob2QgIzE6ICBNYW51YWxseSBjcmVhdGUgb3IgZWRpdCB0aGUgZmlsZSAkSE9NRS8uY3Vwcy9jbGllbnQuY29uZgotICAgIG9uIHRoZSBWTkMgc2VydmVyIHNpZGUgYnkgcHV0dGluZyBpbiBzb21ldGhpbmcgbGlrZSB0aGlzIGluIGl0OgotCi0gICAgCVNlcnZlck5hbWUgbG9jYWxob3N0OjY2MzEKLQotICAgIGJhc2VkIG9uIHRoZSBwb3J0IHlvdSBzZXQgaW4gdGhpcyBkaWFsb2cncyBlbnRyeSBib3guCi0gICAgCi0gICAgQWZ0ZXIgdGhlIHJlbW90ZSBWTkMgQ29ubmVjdGlvbiBpcyBmaW5pc2hlZCwgdG8gZ28gYmFjayB0byB0aGUgbm9uLVNTSAotICAgIHR1bm5lbGxlZCBDVVBTIHNlcnZlciBhbmQgZWl0aGVyIHJlbW92ZSB0aGUgY2xpZW50LmNvbmYgZmlsZSBvciBjb21tZW50Ci0gICAgb3V0IHRoZSBTZXJ2ZXJOYW1lIGxpbmUuICBUaGlzIHJlc3RvcmVzIHRoZSBub3JtYWwgQ1VQUyBzZXJ2ZXIgZm9yCi0gICAgeW91IG9uIHRoZSByZW1vdGUgVk5DIHNlcnZlciBtYWNoaW5lLgotCi0gICAgU2VsZWN0ICJNYW5hZ2UgJ1NlcnZlck5hbWUnIGluIHRoZSAkSE9NRS8uY3Vwcy9jbGllbnQuY29uZiBmaWxlIGZvciBtZSIKLSAgICB0byBkbyB0aGlzIGVkaXRpbmcgb2YgdGhlIFZOQyBzZXJ2ZXItc2lkZSBDVVBTIGNvbmZpZyBmaWxlIGZvciB5b3UKLSAgICBhdXRvbWF0aWNhbGx5LiAgTk9URTogSXQgaXMgbm93IG9uIGJ5IGRlZmF1bHQgKGRlc2VsZWN0IGl0IGlmIHlvdSB3YW50Ci0gICAgdG8gbWFuYWdlIHRoZSBmaWxlIG1hbnVhbGx5OyBlLmcuIHlvdSBwcmludCB0aHJvdWdoIHRoZSB0dW5uZWwgb25seSB2ZXJ5Ci0gICAgcmFyZWx5LCBvciBvZnRlbiBwcmludCBsb2NhbGx5IHdoZW4gdGhlIHR1bm5lbCBpcyB1cCwgZXRjLikKLQotICAgIFNlbGVjdCAiUGFzcyAtZW52IEZEX0NVUFM9PFBvcnQ+IHRvIHgxMXZuYyBjb21tYW5kIGxpbmUiIGlmIHlvdSBhcmUKLSAgICBzdGFydGluZyB4MTF2bmMgYXMgdGhlIFJlbW90ZSBTU0ggQ29tbWFuZCwgYW5kIHgxMXZuYyBpcyBydW5uaW5nIGluCi0gICAgLWNyZWF0ZSBtb2RlIChpLmUuIEZJTkRDUkVBVEVESVNQTEFZKS4gIFRoYXQgd2F5LCB3aGVuIHlvdXIgWCBzZXNzaW9uCi0gICAgaXMgY3JlYXRlZCBJUFBfUE9SVCB3aWxsIGJlIHNldCBjb3JyZWN0bHkgZm9yIHRoZSBlbnRpcmUgc2Vzc2lvbi4KLSAgICBUaGlzIGlzIHRoZSBtb2RlIHVzZWQgZm9yICdUZXJtaW5hbCBTZXJ2aWNlcycgcHJpbnRpbmcuCi0KLSAgICBOT1RFOiBZb3UgcHJvYmFibHkgd291bGQgbmV2ZXIgc2VsZWN0IGJvdGggb2YgdGhlIGFib3ZlIHR3byBvcHRpb25zCi0gICAgYXQgdGhlIHNhbWUgdGltZSwgc2luY2UgdGhleSBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIgdG8gc29tZSBkZWdyZWUuCi0KLQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqKiogTWV0aG9kICMyOiAgSWYgeW91IGhhdmUgYWRtaW4gcGVybWlzc2lvbiBvbiB0aGUgVk5DIFNlcnZlciBtYWNoaW5lCi0gICAgeW91IGNhbiBsaWtlbHkgIkFkZCBhIFByaW50ZXIiIHZpYSBhIEdVSSBkaWFsb2csIGEgV2l6YXJkLCBDVVBTIFdlYgotICAgIGludGVyZmFjZSAoaS5lLiBodHRwOi8vbG9jYWxob3N0OjYzMS8pLCBscGFkbWluKDgpLCBldGMuCi0KLSAgICBZb3Ugd2lsbCBuZWVkIHRvIHRlbGwgdGhlIGRpYWxvZyB0aGF0IHRoZSBuZXR3b3JrIHByaW50ZXIgbG9jYXRlZAotICAgIGlzIGF0LCBlLmcuLCBsb2NhbGhvc3Q6NjYzMSwgYW5kIGFueXRoaW5nIGVsc2UgbmVlZGVkIHRvIGlkZW50aWZ5Ci0gICAgdGhlIHByaW50ZXIgKHR5cGUsIG1vZGVsLCBldGMpLiAgTk9URTogc29tZXRpbWVzIGl0IGlzIGJlc3QgdG8gc2V0Ci0gICAgdGhlIG1vZGVsL3R5cGUgYXMgIkdlbmVyaWMgLyBQb3N0c2NyaXB0IFByaW50ZXIiIHRvIGF2b2lkIHByb2JsZW1zCi0gICAgd2l0aCBnYXJiYWdlIGJlaW5nIHByaW50ZWQgb3V0LgotCi0gICAgRm9yIHRoZSBVUkkgdG8gdXNlLCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSB1c2VkIG9uZXMgbGlrZSB0aGlzIHdpdGggQ1VQUzoKLQotICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6NjYzMS9wcmludGVycy9EZXNramV0LTM4NDAKLSAgICAgICAgaXBwOi8vbG9jYWxob3N0OjY2MzEvcHJpbnRlcnMvRGVza2pldC0zODQwCi0KLSAgICBmb3IgYW4gSFAgRGVza2pldC0zODQwIHByaW50ZXIuICBTZWUgdGhlIENVUFMgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQotICAgIGFib3V0IHRoZSBVUkkgc3ludGF4IGFuZCBwYXRobmFtZS4KLQotICAgIFRoaXMgbW9kZSBtYWtlcyB0aGUgY2xpZW50LmNvbmYgU2VydmVyTmFtZSBwYXJhbWV0ZXIgdW5uZWNlc3NhcnkKLSAgICAoQkUgU1VSRSBUTyBESVNBQkxFIHRoZSAiTWFuYWdlICdTZXJ2ZXJOYW1lJyAuLi4gZm9yIG1lIiAgb3B0aW9uLikKLQotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICoqKiBNZXRob2QgIzM6ICBSZXN0YXJ0aW5nIGluZGl2aWR1YWwgYXBwbGljYXRpb25zIHdpdGggdGhlIElQUF9QT1JUCi0gICAgc2V0IHdpbGwgZW5hYmxlIHJlZGlyZWN0ZWQgcHJpbnRpbmcgZm9yIHRoZW0sIGUuZy46Ci0KLSAgICAgICBlbnYgSVBQX1BPUlQ9NjYzMSBmaXJlZm94Ci0KLSAgICBJZiB5b3UgY2FuIG9ubHkgZ2V0IHRoaXMgbWV0aG9kIHRvIHdvcmssIGFuIGV4dHJlbWUgYXBwbGljYXRpb24gd291bGQKLSAgICBiZSB0byBydW4gdGhlIHdob2xlIGRlc2t0b3AsIGUuZy4gImVudiBJUFBfUE9SVD02NjMxIGdub21lLXNlc3Npb24iLCBidXQKLSAgICB0aGVuIHlvdSB3b3VsZCBuZWVkIHNvbWUgc29ydCBvZiBUQ1AgcmVkaXJlY3RvciAoc3NoIC1MIGNvbWVzIHRvIG1pbmQpLAotICAgIHRvIGRpcmVjdCBpdCB0byA2MzEgd2hlbiBub3QgY29ubmVjdGVkIHJlbW90ZWx5LgotCi0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKioqIFdpbmRvd3MvU01CIFByaW50ZXJzOiAgVW5kZXIgIkxvY2FsIFNNQiBQcmludCBTZXJ2ZXIiIHlvdSBjYW4gc2V0Ci0gICAgYSBwb3J0IHJlZGlyZWN0aW9uIGZvciBhIFdpbmRvd3MgKG5vbi1DVVBTKSBTTUIgcHJpbnRlci4gIEUuZy4gcG9ydAotICAgIDY2MzIgLT4gbG9jYWxob3N0OjEzOS4KLQotICAgIElmIGxvY2FsaG9zdDoxMzkgZG9lcyBub3Qgd29yaywgdHJ5IHRoZSBsaXRlcmFsIHN0cmluZyAiSVA6MTM5Iiwgb3IKLSAgICBpbnNlcnQgdGhlIGFjdHVhbCBJUCBhZGRyZXNzIG1hbnVhbGx5LiAgTk9URTogTm93YWRheXMgb24gV2luZG93cyBwb3J0Ci0gICAgNDQ1IG1pZ2h0IGJlIGEgYmV0dGVyIGNob2ljZS4KLQotICAgIEZvciBXaW5kb3dzIHByaW50ZXJzLCBpZiB0aGVyZSBpcyBubyBsb2NhbCBDVVBTIHByaW50IHNlcnZlciwgc2V0IHRoZQotICAgICdMb2NhbCBDVVBTIFNlcnZlcicgYW5kICdVc2UgUmVtb3RlIENVUFMgUG9ydCcgdG8gYmUgRU1QVFkgKHRvIGF2b2lkCi0gICAgZGVza3RvcCBhcHBzIHRyeWluZyBpbmNlc3NhbnRseSB0byByZWFjaCB0aGUgbm9uZXhpc3RlbnQgQ1VQUyBzZXJ2ZXIuKQotCi0gICAgWW91IG11c3QgZW5hYmxlIFNoYXJpbmcgZm9yIHlvdXIgbG9jYWwgV2luZG93cyBQcmludGVyLiAgVXNlIFdpbmRvd3MKLSAgICBQcmludGVyIGNvbmZpZ3VyYXRpb24gZGlhbG9ncyB0byBkbyB0aGlzLgotCi0gICAgTmV4dCwgeW91IG5lZWQgdG8gaGF2ZSBzdWRvIG9yIHByaW50IGFkbWluIHBlcm1pc3Npb24gc28gdGhhdCB5b3UgY2FuCi0gICAgY29uZmlndXJlIHRoZSAqcmVtb3RlKiBDVVBTIHRvIGtub3cgYWJvdXQgdGhpcyBXaW5kb3dzIHByaW50ZXIgdmlhCi0gICAgbHBhZG1pbig4KSBvciBHVUkgUHJpbnRlciBDb25maWd1cmF0aW9uIGRpYWxvZywgZXRjIChNZXRob2QgIzIgYWJvdmUpLgotICAgIFlvdSBiYXNpY2FsbHkgZ2l2ZSBpdCB0aGUgVVJJOgotCi0gICAgICAgIHNtYjovL2xvY2FsaG9zdDo2NjMyL3ByaW50ZXJuYW1lCi0KLSAgICBGb3IgZXhhbXBsZSwgd2UgaGF2ZSBoYWQgc3VjY2VzcyB3aXRoIEdOT01FIENVUFMgcHJpbnRpbmcgY29uZmlndXJhdGlvbgotICAgIHVzaW5nOgotCi0Jc21iOi8vbG9jYWxob3N0OjY2MzIvSFBPZmZpY2UKLQlzbWI6Ly9sb2NhbGhvc3Q6NjYzMi9DT01QVVRFUk5BTUUvSFBPZmZpY2UKLQotICAgIHdoZXJlICJIUE9mZmljZSIgd2FzIHRoZSBuYW1lIFdpbmRvd3Mgc2hhcmVzIHRoZSBwcmludGVyIGFzLgotCi0gICAgQWxzbyB3aXRoIHRoaXMgU01CIHBvcnQgcmVkaXIgbW9kZSwgYXMgYSBsYXN0IHJlc29ydCB5b3UgY2FuIG9mdGVuIHByaW50Ci0gICAgdXNpbmcgdGhlIHNtYnNwb29sKDgpIHByb2dyYW0gbGlrZSB0aGlzOgotCi0gICAgICAgc21ic3Bvb2wgc21iOi8vbG9jYWxob3N0OjY2MzIvcHJpbnRlciBqb2IgdXNlciB0aXRsZSAxICIiIG15ZmlsZS5wcwotCi0gICAgWW91IGNvdWxkIHB1dCB0aGlzIGluIGEgc2NyaXB0LiAgRm9yIHRoaXMgVVJJLCBpdCBhcHBlYXJzIG9ubHkgdGhlIG51bWJlcgotICAgIG9mIGNvcGllcyAoIjEiIGFib3ZlKSBhbmQgdGhlIGZpbGUgaXRzZWxmIGFyZSBpbXBvcnRhbnQuCi0KLSAgICBJZiBvbiB0aGUgbG9jYWwgKFNTVk5DIHZpZXdlcikgc2lkZSB0aGVyZSBpcyBzb21lIG5lYXJieSBDVVBTIHByaW50IHNlcnZlcgotICAgIHRoYXQga25vd3MgYWJvdXQgeW91ciBXaW5kb3dzIHByaW50ZXIsIHlvdSBtaWdodCBoYXZlIGJldHRlciBsdWNrIHdpdGgKLSAgICB0aGF0IGluc3RlYWQgb2YgdXNpbmcgU01CLiAgU2V0ICdMb2NhbCBDVVBTIFNlcnZlcicgdG8gaXQuCi0KLSAgICBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtY3VwcwotfQotCS5jdXBzLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWdsb2JhbCB1bmFtZQotCXNldCBzb21ldGhpbmdfc2V0IDAKLQotCWlmIHskY3Vwc19sb2NhbF9zZXJ2ZXIgIT0gIiJ9IHsKLQkJc2V0IHNvbWV0aGluZ19zZXQgMQotCX0KLQlpZiB7JGN1cHNfbG9jYWxfc21iX3NlcnZlciAhPSAiIn0gewotCQlzZXQgc29tZXRoaW5nX3NldCAxCi0JfQotCi0JaWYgeyRjdXBzX2xvY2FsX3NlcnZlciA9PSAiIiAmJiAhICRzb21ldGhpbmdfc2V0fSB7Ci0JCWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJCXNldCBjdXBzX2xvY2FsX3NlcnZlciAiMTI3LjAuMC4xOjYzMSIKLQkJfSBlbHNlIHsKLQkJCXNldCBjdXBzX2xvY2FsX3NlcnZlciAibG9jYWxob3N0OjYzMSIKLQkJfQotCX0KLQlpZiB7JGN1cHNfcmVtb3RlX3BvcnQgPT0gIiIgJiYgISAkc29tZXRoaW5nX3NldH0gewotCQlzZXQgY3Vwc19yZW1vdGVfcG9ydCAiNjYzMSIKLQl9Ci0JaWYgeyRjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgPT0gIiIgJiYgISAkc29tZXRoaW5nX3NldH0gewotCQlnbG9iYWwgaXNfd2luZG93cwotCQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJCXNldCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgIklQOjEzOSIKLQkJfSBlbHNlaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQkJc2V0IGN1cHNfbG9jYWxfc21iX3NlcnZlciAiMTI3LjAuMC4xOjEzOSIKLQkJfSBlbHNlIHsKLQkJCXNldCBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIgImxvY2FsaG9zdDoxMzkiCi0JCX0KLQl9Ci0JaWYgeyRjdXBzX3JlbW90ZV9zbWJfcG9ydCA9PSAiIiAmJiAhICRzb21ldGhpbmdfc2V0fSB7Ci0JCXNldCBjdXBzX3JlbW90ZV9zbWJfcG9ydCAiNjYzMiIKLQl9Ci0KLQlmcmFtZSAuY3Vwcy5zZXJ2Ci0JbGFiZWwgLmN1cHMuc2Vydi5sIC1hbmNob3IgdyAtdGV4dCAiTG9jYWwgQ1VQUyBTZXJ2ZXI6ICAgICAgIgotCWVudHJ5IC5jdXBzLnNlcnYuZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBjdXBzX2xvY2FsX3NlcnZlcgotCXBhY2sgLmN1cHMuc2Vydi5lIC1zaWRlIHJpZ2h0Ci0JcGFjayAuY3Vwcy5zZXJ2LmwgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JZnJhbWUgLmN1cHMucG9ydAotCWxhYmVsIC5jdXBzLnBvcnQubCAtYW5jaG9yIHcgLXRleHQgIlVzZSBSZW1vdGUgQ1VQUyBQb3J0OiIKLQllbnRyeSAuY3Vwcy5wb3J0LmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgY3Vwc19yZW1vdGVfcG9ydAotCXBhY2sgLmN1cHMucG9ydC5lIC1zaWRlIHJpZ2h0Ci0JcGFjayAuY3Vwcy5wb3J0LmwgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JZnJhbWUgLmN1cHMuc21icwotCWxhYmVsIC5jdXBzLnNtYnMubCAtYW5jaG9yIHcgLXRleHQgIkxvY2FsIFNNQiBQcmludCBTZXJ2ZXI6ICAgICAgIgotCWVudHJ5IC5jdXBzLnNtYnMuZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBjdXBzX2xvY2FsX3NtYl9zZXJ2ZXIKLQlwYWNrIC5jdXBzLnNtYnMuZSAtc2lkZSByaWdodAotCXBhY2sgLmN1cHMuc21icy5sIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWZyYW1lIC5jdXBzLnNtYnAKLQlsYWJlbCAuY3Vwcy5zbWJwLmwgLWFuY2hvciB3IC10ZXh0ICJVc2UgUmVtb3RlIFNNQiBQcmludCBQb3J0OiIKLQllbnRyeSAuY3Vwcy5zbWJwLmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgY3Vwc19yZW1vdGVfc21iX3BvcnQKLQlwYWNrIC5jdXBzLnNtYnAuZSAtc2lkZSByaWdodAotCXBhY2sgLmN1cHMuc21icC5sIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWNoZWNrYnV0dG9uIC5jdXBzLmN1cHNyYyAtYW5jaG9yIHcgLXZhcmlhYmxlIGN1cHNfbWFuYWdlX3JjZmlsZSAtdGV4dCBcCi0JCSJNYW5hZ2UgJ1NlcnZlck5hbWUnIGluIHRoZSByZW1vdGUgXCRIT01FLy5jdXBzL2NsaWVudC5jb25mIGZpbGUgZm9yIG1lIgotCi0JY2hlY2tidXR0b24gLmN1cHMueDExdm5jIC1hbmNob3IgdyAtdmFyaWFibGUgY3Vwc194MTF2bmMgLXRleHQgXAotCQkiUGFzcyAtZW52IEZEX0NVUFM9PFBvcnQ+IHRvIHgxMXZuYyBjb21tYW5kIGxpbmUuIgotCi0JYnV0dG9uIC5jdXBzLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAuY3Vwczsgc2V0IHVzZV9jdXBzIDB9Ci0JYmluZCAuY3VwcyA8RXNjYXBlPiB7ZGVzdHJveSAuY3Vwczsgc2V0IHVzZV9jdXBzIDB9Ci0Jd20gcHJvdG9jb2wgLmN1cHMgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAuY3Vwczsgc2V0IHVzZV9jdXBzIDB9Ci0JYnV0dG9uIC5jdXBzLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5jdXBzOyBpZiB7JHVzZV9jdXBzfSB7c2V0X3NzaH19Ci0KLQlidXR0b24gLmN1cHMuZ3Vlc3MgLXRleHQgIkhlbHAgbWUgZGVjaWRlIC4uLiIgLWNvbW1hbmQge30KLQkuY3Vwcy5ndWVzcyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0KLQlwYWNrIC5jdXBzLmRvbmUgLmN1cHMuY2FuY2VsIC5jdXBzLmd1ZXNzIC5jdXBzLngxMXZuYyAuY3Vwcy5jdXBzcmMgLmN1cHMuc21icCAuY3Vwcy5zbWJzIC5jdXBzLnBvcnQgLmN1cHMuc2VydiAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLmN1cHMuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLmN1cHMKLQlmb2N1cyAuY3Vwcy5zZXJ2LmUKLX0KLQotcHJvYyB0c19zb3VuZF9kaWFsb2cge30gewotCi0JZ2xvYmFsIGlzX3dpbmRvd3MKLQlnbG9iYWwgdHNfb25seQotCi0JdG9wbGV2IC5zbmQKLQl3bSB0aXRsZSAuc25kICJTb3VuZCBUdW5uZWxsaW5nIgotCi0Jc2Nyb2xsX3RleHQgLnNuZC5mIDgwIDIxCi0KLQlzZXQgbXNnIHsKLSAgICBZb3VyIHJlbW90ZSBEZXNrdG9wIHdpbGwgYmUgc3RhcnRlZCBpbiBhbiBFbmxpZ2h0ZW5tZW50IFNvdW5kIERhZW1vbgotICAgIChFU0QpIGVudmlyb25tZW50IChlc2Rkc3AoMSksIHdoaWNoIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUKLSAgICBtYWNoaW5lKSwgYW5kIGEgbG9jYWwgRVNEIHNvdW5kIGRhZW1vbiAoZXNkKDEpKSB3aWxsIGJlIHN0YXJ0ZWQgdG8KLSAgICBwbGF5IHRoZSBzb3VuZHMgZm9yIHlvdSB0byBoZWFyLgotCi0gICAgSW4gdGhlIGVudHJ5IGJveCBiZWxvdyB5b3UgY2FuIGNob29zZSB0aGUgcG9ydCB0aGF0IHRoZSBsb2NhbCBlc2QKLSAgICB3aWxsIHVzZSB0byBsaXN0ZW4gb24uICBUaGUgZGVmYXVsdCBFU0QgcG9ydCBpcyAxNjAwMS4gIFlvdSB3aWxsCi0gICAgbmVlZCB0byBjaG9vc2UgZGlmZmVyZW50IHZhbHVlcyBpZiB5b3Ugd2lsbCBoYXZlIG1vcmUgdGhhbiBvbmUgZXNkCi0gICAgcnVubmluZyBsb2NhbGx5LgotCi0gICAgVGhlIGNvbW1hbmQgcnVuICh3aXRoIHBvcnQgcmVwbGFjZWQgYnkgeW91ciBjaG9pY2UpIHdpbGwgYmU6Ci0KLSAgICAgICVSQ01ECi0KLSAgICBOb3RlOiBVbmZvcnR1bmF0ZWx5IG5vdCBhbGwgYXBwbGljYXRpb25zIHdvcmsgd2l0aCBFU0QuCi0gICAgICAgICAgQW5kIGVzZCdzIExEX1BSRUxPQUQgaXMgYnJva2VuIG9uIDY0KzMyYml0IExpbnV4ICh4ODZfNjQpLgotICAgICAgICAgIEFuZCBzbyB0aGlzIG1vZGUgaXMgbm90IHdvcmtpbmcgd2VsbCBjdXJyZW50bHkuLi4gCi0gCi0gICAgRm9yIG1vcmUgaW5mbyBzZWU6IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNvdW5kCi19Ci0KLQotCWdsb2JhbCBzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX2NtZAotCWdsb2JhbCBzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQgc291bmRfZGFlbW9uX2xvY2FsX2tpbGwKLQotCXNldCBzb3VuZF9kYWVtb25fbG9jYWxfc3RhcnQgMQotCXNldCBzb3VuZF9kYWVtb25fbG9jYWxfa2lsbCAxCi0KLQlpZiB7JHNvdW5kX2RhZW1vbl9yZW1vdGVfcG9ydCA9PSAiIn0gewotCQlzZXQgc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0IDE2MDEwCi0JfQotCWlmIHskc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgPT0gIiJ9IHsKLQkJc2V0IHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0IDE2MDEwCi0JfQotCi0JaWYgeyRzb3VuZF9kYWVtb25fbG9jYWxfY21kID09ICIifSB7Ci0JCWdsb2JhbCBpc193aW5kb3dzCi0JCWlmIHskaXNfd2luZG93c30gewotCQkJc2V0IHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQge2Vzb3VuZFxlc2QgLXByb21pc2N1b3VzIC1hcyA1IC1wb3J0ICVQT1JUIC10Y3AgLWJpbmQgMTI3LjAuMC4xfQotCQl9IGVsc2UgewotCQkJc2V0IHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQge2VzZCAtcHJvbWlzY3VvdXMgLWFzIDUgLXBvcnQgJVBPUlQgLXRjcCAtYmluZCAxMjcuMC4wLjF9Ci0JCX0KLQl9Ci0JcmVnc3ViIHslUE9SVH0gJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgJHNvdW5kX2RhZW1vbl9sb2NhbF9wb3J0IHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQKLQotCXJlZ3N1YiB7JVJDTUR9ICRtc2cgJHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgbXNnCi0JLnNuZC5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlmcmFtZSAuc25kLmxwb3J0Ci0JbGFiZWwgLnNuZC5scG9ydC5sIC1hbmNob3IgdyAtdGV4dCAiTG9jYWwgU291bmQgUG9ydDogICAgICIKLQllbnRyeSAuc25kLmxwb3J0LmUgLXdpZHRoIDQ1IC10ZXh0dmFyaWFibGUgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQKLQlwYWNrIC5zbmQubHBvcnQuZSAtc2lkZSByaWdodAotCXBhY2sgLnNuZC5scG9ydC5sIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWJ1dHRvbiAuc25kLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAuc25kOyBzZXQgdXNlX3NvdW5kIDB9Ci0JYmluZCAuc25kIDxFc2NhcGU+IHtkZXN0cm95IC5zbmQ7IHNldCB1c2Vfc291bmQgMH0KLQl3bSBwcm90b2NvbCAuc25kIFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLnNuZDsgc2V0IHVzZV9zb3VuZCAwfQotCWJ1dHRvbiAuc25kLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5zbmQ7IGlmIHskdXNlX3NvdW5kfSB7c2V0X3NzaH19Ci0JYmluZCAuc25kLmxwb3J0LmUgPFJldHVybj4ge2Rlc3Ryb3kgLnNuZDsgaWYgeyR1c2Vfc291bmR9IHtzZXRfc3NofX0KLQotCXBhY2sgLnNuZC5kb25lIC5zbmQuY2FuY2VsIC5zbmQubHBvcnQgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5zbmQuZiAtc2lkZSBib3R0b20gLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLnNuZAotCWZvY3VzIC5zbmQubHBvcnQuZQotfQotCi1wcm9jIHNvdW5kX2RpYWxvZyB7fSB7Ci0KLQlnbG9iYWwgaXNfd2luZG93cwotCWdsb2JhbCB0c19vbmx5Ci0JaWYgeyR0c19vbmx5fSB7Ci0JCXRzX3NvdW5kX2RpYWxvZzsKLQkJcmV0dXJuCi0JfQotCi0JdG9wbGV2IC5zbmQKLQl3bSB0aXRsZSAuc25kICJFU0QvQVJUU0QgU291bmQgVHVubmVsbGluZyIKLQotCWdsb2JhbCB1bmFtZQotCXNldCBoIDI4Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxNAotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMjAKLQl9Ci0Jc2Nyb2xsX3RleHQgLnNuZC5mIDgwICRoCi0KLQlzZXQgbXNnIHsKLSAgICBTb3VuZCB0dW5uZWxsaW5nIHRvIGEgc291bmQgZGFlbW9uIHJlcXVpcmVzIFNTSCBiZSB1c2VkIHRvIHNldCB1cCB0aGUKLSAgICBzZXJ2aWNlIHBvcnQgcmVkaXJlY3Rpb24uICBUaGlzIHdpbGwgYmUgZWl0aGVyIG9mIHRoZSAiVXNlIFNTSCIgb3IKLSAgICAiU1NIK1NTTCIgbW9kZXMuIE5PVEU6IEZvciBwdXJlIFNTTCB0dW5uZWxsaW5nIGl0IGN1cnJlbnRseSB3aWxsIG5vdCB3b3JrLgotCi0gICAgVGhpcyBtZXRob2QgcmVxdWlyZXMgd29ya2luZyBTb3VuZCBkYWVtb24gKGUuZy4gRVNEIG9yIEFSVFNEKSBzb2Z0d2FyZQotICAgIHNldHVwcyBvbiBCT1RIIHRoZSByZW1vdGUgYW5kIGxvY2FsIHNpZGVzIG9mIHRoZSBjb25uZWN0aW9uLgotCi0gICAgT2Z0ZW4gdGhpcyBtZWFucyB5b3Ugd2FudCB0byBydW4geW91ciBFTlRJUkUgcmVtb3RlIGRlc2t0b3Agd2l0aCBBTEwKLSAgICBhcHBsaWNhdGlvbnMgaW5zdHJ1Y3RlZCB0byB1c2UgdGhlIHNvdW5kIGRhZW1vbidzIG5ldHdvcmsgcG9ydC4gIEUuZy4KLQotICAgICAgICBlc2Rkc3AgLXMgbG9jYWxob3N0OjE2MDAxICBzdGFydGtkZQotICAgICAgICBlc2Rkc3AgLXMgbG9jYWxob3N0OjE2MDAxICBnbm9tZS1zZXNzaW9uCi0KLSAgICBhbmQgc2ltaWxhcmx5IGZvciBhcnRzZHNwLCBldGMuICBZb3UgcHV0IHRoaXMgaW4geW91ciB+Ly54ZXNzaW9uLAotICAgIG9yIG90aGVyIHN0YXJ0dXAgZmlsZS4gIFRoaXMgaXMgbm9uIHN0YW5kYXJkLiAgSWYgeW91IGRvIG5vdCB3YW50IHRvCi0gICAgZG8gdGhpcyB5b3Ugc3RpbGwgY2FuIGRpcmVjdCAqaW5kaXZpZHVhbCogc291bmQgYXBwbGljYXRpb25zIHRocm91Z2gKLSAgICB0aGUgdHVubmVsLCBmb3IgZXhhbXBsZSAiZXNkZHNwIC1zIGxvY2FsaG9zdDoxNjAwMSBzb3VuZGFwcCIsIHdoZXJlCi0gICAgInNvdW5kYXBwIiBpcyBzb21lIGFwcGxpY2F0aW9uIHRoYXQgbWFrZXMgbm9pc2UgKHNheSB4bW1zIG9yIG1wZzEyMykuCi0KLSAgICBTZWxlY3QgIlBhc3MgLWVudiBGRF9FU0Q9PFBvcnQ+IHRvIHgxMXZuYyBjb21tYW5kIGxpbmUuIiAgaWYgeW91IGFyZQotICAgIHN0YXJ0aW5nIHgxMXZuYyBhcyB0aGUgUmVtb3RlIFNTSCBDb21tYW5kLCBhbmQgeDExdm5jIGlzIHJ1bm5pbmcgaW4KLSAgICAtY3JlYXRlIG1vZGUgKGkuZS4gRklORENSRUFURURJU1BMQVkpLiAgVGhhdCB3YXksIHlvdXIgWCBzZXNzaW9uIGlzCi0gICAgc3RhcnRlZCB2aWEgImVzZGRzcCAtcyAuLi4gPHNlc3Npb24+IiAgYW5kIHRoZSBFU0QgdmFyaWFibGVzIHdpbGwgYmUKLSAgICBzZXQgY29ycmVjdGx5IGZvciB0aGUgZW50aXJlIHNlc3Npb24uICAoVGhpcyBtb2RlIG1ha2UgbW9zdCBzZW5zZSBmb3IKLSAgICBhIHZpcnR1YWwsIGUuZy4gWHZmYiBvciBYZHVtbXkgc2Vzc2lvbiwgbm90IG9uZSBhIHBoeXNpY2FsIGRpc3BsYXkpLgotCi0gICAgQWxzbywgdXN1YWxseSB0aGUgcmVtb3RlIFNvdW5kIGRhZW1vbiBtdXN0IGJlIGtpbGxlZCBCRUZPUkUgdGhlIFNTSCBwb3J0Ci0gICAgcmVkaXIgaXMgZXN0YWJsaXNoZWQgKGJlY2F1c2UgaXQgaXMgbGlzdGVuaW5nIG9uIHRoZSBwb3J0IHdlIHdhbnQgdG8gdXNlCi0gICAgZm9yIHRoZSBTU0ggcmVkaXIpLCBhbmQsIHByZXN1bWFibHksIHJlc3RhcnRlZCB3aGVuIHRoZSBWTkMgY29ubmVjdGlvbgotICAgIGZpbmlzaGVkLgotCi0gICAgT25lIG1heSBhbHNvIHdhbnQgdG8gc3RhcnQgYW5kIGtpbGwgYSBsb2NhbCBzb3VuZCBkYWVtb24gdGhhdCB3aWxsCi0gICAgcGxheSB0aGUgc291bmQgcmVjZWl2ZWQgb3ZlciB0aGUgbmV0d29yayBvbiB0aGUgbG9jYWwgbWFjaGluZS4KLQotICAgIFlvdSBjYW4gaW5kaWNhdGUgdGhlIHJlbW90ZSBhbmQgbG9jYWwgU291bmQgZGFlbW9uIGNvbW1hbmRzIGJlbG93IGFuZAotICAgIGhvdyB0aGV5IHNob3VsZCBiZSBraWxsZWQgYW5kL29yIHJlc3RhcnQuICBTb21lIGV4YW1wbGVzOgotCi0gICAgICAgIGVzZCAtcHJvbWlzY3VvdXMgLWFzIDUgLXBvcnQgMTYwMDEgLXRjcCAtYmluZCAxMjcuMC4wLjEKLSAgICAgICAgYXJ0c2QgLW4gLXAgNzI2NSAtRiAxMCAtUyA0MDk2IC1uIC1zIDUgLW0gYXJ0c21lc3NhZ2UgLWwgMyAtZgotCi0gICAgb3IgeW91IGNhbiBsZWF2ZSBzb21lIG9yIGFsbCBibGFuayBhbmQga2lsbC9zdGFydCB0aGVtIG1hbnVhbGx5LgotCi0gICAgRm9yIGNvbnZlbmllbmNlLCBhIFdpbmRvd3MgcG9ydCBvZiBFU0QgaXMgcHJvdmlkZWQgaW4gdGhlIHV0aWwvZXNvdW5kCi0gICAgZGlyZWN0b3J5LCBhbmQgc28gdGhpcyBtaWdodCB3b3JrIGZvciBhIExvY2FsIGNvbW1hbmQ6Ci0KLSAgICAgICAgZXNvdW5kXGVzZCAtcHJvbWlzY3VvdXMgLWFzIDUgLXBvcnQgMTYwMDEgLXRjcCAtYmluZCAxMjcuMC4wLjEKLQotICAgIE5PVEU6IElmIHlvdSBpbmRpY2F0ZSAiUmVtb3RlIFNvdW5kIGRhZW1vbjogS2lsbCBhdCBzdGFydC4iIGJlbG93LAotICAgIHRoZW4gVEhFUkUgV0lMTCBCRSBUV08gU1NIJ1M6IFRIRSBGSVJTVCBPTkUgVE8gS0lMTCBUSEUgREFFTU9OLgotICAgIFNvIHlvdSBtYXkgbmVlZCB0byBzdXBwbHkgVFdPIFNTSCBQQVNTV09SRFMsIHVubGVzcyB5b3UgYXJlIHVzaW5nCi0gICAgc29tZXRoaW5nIGxpa2Ugc3NoLWFnZW50KDEpLCB0aGUgUHV0dHkgUFcgc2V0dGluZywgZXRjLgotCi0gICAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSB0aGUgcmVtb3RlIGFuZCBsb2NhbCBzb3VuZCBwb3J0cyBmb3IKLSAgICB0aGUgU1NIIHJlZGlycy4gIEZvciBlc2QgdGhlIGRlZmF1bHQgcG9ydCBpcyAxNjAwMSwgYnV0IHlvdSBjYW4gY2hvb3NlCi0gICAgYW5vdGhlciBvbmUgaWYgeW91IHByZWZlci4KLQotICAgIEZvciAiTG9jYWwgU291bmQgUG9ydCIgeW91IGNhbiBhbHNvIHN1cHBseSAiaG9zdDpwb3J0IiBpbnN0ZWFkIG9mIGp1c3QKLSAgICBhIG51bWVyaWNhbCBwb3J0IHRvIHNwZWNpZnkgbm9uLWxvY2FsaG9zdCBjb25uZWN0aW9ucywgZS5nLiB0byBhbm90aGVyCi0gICAgbmVhcmJ5IG1hY2hpbmUuCi0KLSAgICBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtc291bmQKLX0KLQkuc25kLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWdsb2JhbCBzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX2NtZAotCWlmIHskc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0ID09ICIifSB7Ci0JCXNldCBzb3VuZF9kYWVtb25fcmVtb3RlX3BvcnQgMTYwMDEKLQl9Ci0JaWYgeyRzb3VuZF9kYWVtb25fbG9jYWxfcG9ydCA9PSAiIn0gewotCQlzZXQgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgMTYwMDEKLQl9Ci0KLQlpZiB7JHNvdW5kX2RhZW1vbl9sb2NhbF9jbWQgPT0gIiJ9IHsKLQkJZ2xvYmFsIGlzX3dpbmRvd3MKLQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQlzZXQgc291bmRfZGFlbW9uX2xvY2FsX2NtZCB7ZXNvdW5kXGVzZCAtcHJvbWlzY3VvdXMgLWFzIDUgLXBvcnQgJVBPUlQgLXRjcCAtYmluZCAxMjcuMC4wLjF9Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgc291bmRfZGFlbW9uX2xvY2FsX2NtZCB7ZXNkIC1wcm9taXNjdW91cyAtYXMgNSAtcG9ydCAlUE9SVCAtdGNwIC1iaW5kIDEyNy4wLjAuMX0KLQkJfQotCQlyZWdzdWIgeyVQT1JUfSAkc291bmRfZGFlbW9uX2xvY2FsX2NtZCAkc291bmRfZGFlbW9uX2xvY2FsX3BvcnQgc291bmRfZGFlbW9uX2xvY2FsX2NtZAotCX0KLQotCi0JZnJhbWUgLnNuZC5yZW1vdGUKLQlsYWJlbCAuc25kLnJlbW90ZS5sIC1hbmNob3IgdyAtdGV4dCAiUmVtb3RlIFNvdW5kIGRhZW1vbiBjbWQ6ICIKLQllbnRyeSAuc25kLnJlbW90ZS5lIC13aWR0aCA0NSAtdGV4dHZhcmlhYmxlIHNvdW5kX2RhZW1vbl9yZW1vdGVfY21kCi0JcGFjayAuc25kLnJlbW90ZS5lIC1zaWRlIHJpZ2h0Ci0JcGFjayAuc25kLnJlbW90ZS5sIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCWZyYW1lIC5zbmQubG9jYWwKLQlsYWJlbCAuc25kLmxvY2FsLmwgLWFuY2hvciB3IC10ZXh0ICJMb2NhbCBTb3VuZCBkYWVtb24gY21kOiAgICAgIgotCWVudHJ5IC5zbmQubG9jYWwuZSAtd2lkdGggNDUgLXRleHR2YXJpYWJsZSBzb3VuZF9kYWVtb25fbG9jYWxfY21kCi0JcGFjayAuc25kLmxvY2FsLmUgLXNpZGUgcmlnaHQKLQlwYWNrIC5zbmQubG9jYWwubCAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlmcmFtZSAuc25kLnJwb3J0Ci0JbGFiZWwgLnNuZC5ycG9ydC5sIC1hbmNob3IgdyAtdGV4dCAiUmVtb3RlIFNvdW5kIFBvcnQ6ICIKLQllbnRyeSAuc25kLnJwb3J0LmUgLXdpZHRoIDQ1IC10ZXh0dmFyaWFibGUgc291bmRfZGFlbW9uX3JlbW90ZV9wb3J0Ci0JcGFjayAuc25kLnJwb3J0LmUgLXNpZGUgcmlnaHQKLQlwYWNrIC5zbmQucnBvcnQubCAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlmcmFtZSAuc25kLmxwb3J0Ci0JbGFiZWwgLnNuZC5scG9ydC5sIC1hbmNob3IgdyAtdGV4dCAiTG9jYWwgU291bmQgUG9ydDogICAgICIKLQllbnRyeSAuc25kLmxwb3J0LmUgLXdpZHRoIDQ1IC10ZXh0dmFyaWFibGUgc291bmRfZGFlbW9uX2xvY2FsX3BvcnQKLQlwYWNrIC5zbmQubHBvcnQuZSAtc2lkZSByaWdodAotCXBhY2sgLnNuZC5scG9ydC5sIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotCi0JY2hlY2tidXR0b24gLnNuZC5zZGsgLWFuY2hvciB3IC12YXJpYWJsZSBzb3VuZF9kYWVtb25fa2lsbCAtdGV4dCBcCi0JCSJSZW1vdGUgU291bmQgZGFlbW9uOiBLaWxsIGF0IHN0YXJ0LiIKLQotCWNoZWNrYnV0dG9uIC5zbmQuc2RyIC1hbmNob3IgdyAtdmFyaWFibGUgc291bmRfZGFlbW9uX3Jlc3RhcnQgLXRleHQgXAotCQkiUmVtb3RlIFNvdW5kIGRhZW1vbjogUmVzdGFydCBhdCBlbmQuIgotCi0JY2hlY2tidXR0b24gLnNuZC5zZHNsIC1hbmNob3IgdyAtdmFyaWFibGUgc291bmRfZGFlbW9uX2xvY2FsX3N0YXJ0IC10ZXh0IFwKLQkJIkxvY2FsIFNvdW5kIGRhZW1vbjogUnVuIGF0IHN0YXJ0LiIKLQotCWNoZWNrYnV0dG9uIC5zbmQuc2RrbCAtYW5jaG9yIHcgLXZhcmlhYmxlIHNvdW5kX2RhZW1vbl9sb2NhbF9raWxsIC10ZXh0IFwKLQkJIkxvY2FsIFNvdW5kIGRhZW1vbjogS2lsbCBhdCBlbmQuIgotCi0JY2hlY2tidXR0b24gLnNuZC54MTF2bmMgLWFuY2hvciB3IC12YXJpYWJsZSBzb3VuZF9kYWVtb25feDExdm5jIC10ZXh0IFwKLQkJIlBhc3MgLWVudiBGRF9FU0Q9PFBvcnQ+IHRvIHgxMXZuYyBjb21tYW5kIGxpbmUuIgotCi0JYnV0dG9uIC5zbmQuZ3Vlc3MgLXRleHQgIkhlbHAgbWUgZGVjaWRlIC4uLiIgLWNvbW1hbmQge30KLQkuc25kLmd1ZXNzIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQotCWdsb2JhbCBpc193aW45eCAKLQlpZiB7JGlzX3dpbjl4fSB7Ci0JCS5zbmQubG9jYWwuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCS5zbmQubG9jYWwubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCS5zbmQuc2RzbCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCS5zbmQuc2RrbCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JfQotCi0JYnV0dG9uIC5zbmQuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtkZXN0cm95IC5zbmQ7IHNldCB1c2Vfc291bmQgMH0KLQliaW5kIC5zbmQgPEVzY2FwZT4ge2Rlc3Ryb3kgLnNuZDsgc2V0IHVzZV9zb3VuZCAwfQotCXdtIHByb3RvY29sIC5zbmQgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAuc25kOyBzZXQgdXNlX3NvdW5kIDB9Ci0JYnV0dG9uIC5zbmQuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnNuZDsgaWYgeyR1c2Vfc291bmR9IHtzZXRfc3NofX0KLQotCXBhY2sgLnNuZC5kb25lIC5zbmQuY2FuY2VsIC5zbmQuZ3Vlc3MgLnNuZC54MTF2bmMgLnNuZC5zZGtsIC5zbmQuc2RzbCAuc25kLnNkciAuc25kLnNkayAuc25kLmxwb3J0IC5zbmQucnBvcnQgXAotCQkuc25kLmxvY2FsIC5zbmQucmVtb3RlIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JcGFjayAuc25kLmYgLXNpZGUgYm90dG9tIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5zbmQKLQlmb2N1cyAuc25kLnJlbW90ZS5lCi19Ci0KLSMgU2hhcmUgaWRlYXMuCi0jIAotIyBVbml4OgotIyAKLSMgaWYgdHlwZSBzbWJjbGllbnQKLSMgZmlyc3QgcGFyc2Ugc21iY2xpZW50IC1MIGxvY2FsaG9zdCAtTgotIyBhbmQvb3IgICAgICBzbWJjbGllbnQgLUwgYGhvc3RuYW1lYCAtTgotIyBHZXQgU2hhcmVuYW1lcyBhbmQgU2VydmVycyBhbmQgRG9tYWluLgotIyAKLSMgbG9vcCBvdmVyIHNlcnZlcnMsIGRvaW5nIHNtYmNsaWVudCAtTCBzZXJ2ZXIgLU4KLSMgcGlsZSB0aGlzIGludG8gYSBodWdlIGxpc3QsIHNlcCBieSBkaXNrIGFuZCBwcmludGVycy4KLSMgCi0jIFdpblhQOgotIyAKLSMgcGFyc2UgIk5FVCBWSUVXIiBvdXRwdXQgc2ltaWxhcmx5LgotIyAKLSMgSGF2ZSBjaGVja2JveCBmb3IgZWFjaCBkaXNrLiAgU2V0IGRlZmF1bHQgcm9vdCB0byAvdmFyL3RtcC8ke1VTRVJ9LW1udHMKLSMgTGV0IHRoZW0gY2hhbmdlIHRoYXQgYXQgb25jZSBhbmQgaGF2ZSBpdCBwb3B1bGF0ZS4gCi0jIAotIyB1c2UgICAvL2hvc3RuYW1lL3NoYXJlICAvdmFyL3RtcC9ydW5nZS1tbnRzL2hvc3RuYW1lL3NoYXJlCi0jIAotIyAKLSMgUHJpbnRlcnMsIGhtbW0uICBDYW4ndCBhZGQgdG8gcmVtb3RlIGN1cHMgbGlzdC4uLiAgSSBndWVzcyBoYXZlIHRoZSBsaXN0Ci0jIHJlYWR5IGZvciBDVVBTIGRpYWxvZyB0byBzdWdnZXN0IHdoaWNoIFNNQiBzZXJ2ZXJzIHRoZXkgd2FudCB0byByZWRpcmVjdAotIyB0by4uLgotCi1wcm9jIGdldF9ob3N0bmFtZSB7fSB7Ci0JZ2xvYmFsIGlzX3dpbmRvd3MgaXNfd2luOXgKLQlzZXQgc3RyICIiCi0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCWlmIHsxfSB7Ci0JCQljYXRjaCB7c2V0IHN0ciBbZXhlYyBob3N0bmFtZV19Ci0JCQlyZWdzdWIgLWFsbCB7W1xyXX0gJHN0ciAiIiBzdHIKLQkJfSBlbHNlIHsKLQkJCWNhdGNoIHtzZXQgc3RyIFtleGVjIG5ldCBjb25maWddfQotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtDb21wdXRlciBuYW1lWyBcdF0rXFxcXChbXiBcdF0rKX0gJHN0ciBtdiBzdHJdIHsKLQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCXNldCBzdHIgIiIKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHtzZXQgc3RyIFtleGVjIGhvc3RuYW1lXX0KLQl9Ci0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHN0cl0KLQlyZXR1cm4gJHN0cgotfQotCi1wcm9jIHNtYl9saXN0X3dpbmRvd3Mge3NtYmhvc3R9IHsKLQlnbG9iYWwgc21iX2xvY2FsIHNtYl9sb2NhbF9ob3N0cyBzbWJfdGhpc19ob3N0Ci0JZ2xvYmFsIGlzX3dpbjl4Ci0Jc2V0IGRiZyAwCi0KLQlzZXQgZG9tYWluICIiCi0KLQlpZiB7JGlzX3dpbjl4fSB7Ci0JCSMgZXhlYyBuZXQgdmlldyAuLi4gZG9lc24ndCB3b3JrLgotCQlzZXQgc21iX3RoaXNfaG9zdCAidW5rbm93biIKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IHRoaXNfaG9zdCBbZ2V0X2hvc3RuYW1lXQotCXNldCBUaGlzX2hvc3QgW3N0cmluZyB0b3VwcGVyICR0aGlzX2hvc3RdCi0Jc2V0IHNtYl90aGlzX2hvc3QgJFRoaXNfaG9zdAotCi0JaWYgeyRzbWJob3N0ID09ICRzbWJfdGhpc19ob3N0fSB7Ci0JCWNhdGNoIHtzZXQgb3V0MCBbZXhlYyBuZXQgdmlld119Ci0JCXJlZ3N1YiAtYWxsIHtbXHJdfSAkb3V0MCAiIiBvdXQwCi0JCWZvcmVhY2ggbGluZSBbc3BsaXQgJG91dDAgIlxuIl0gewotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtpbiB3b3JrZ3JvdXAgKFteIFx0XSspfSAkbGluZSBtdiB3Z10gewotCQkJCXJlZ3N1YiAtYWxsIHtbLl19ICR3ZyAiIiB3ZwotCQkJCXNldCBkb21haW4gJHdnCi0JCQl9IGVsc2VpZiBbcmVnZXhwIHteXFxcXChbXiBcdF0rKVsgXHRdKiguKil9ICRsaW5lIG12IGhvc3QgY29tbWVudF0gewotCQkJCXNldCBzbWJfbG9jYWwoJHNtYmhvc3Q6c2VydmVyOiRob3N0KSAkY29tbWVudAotCQkJfQotCQl9Ci0JfQotCi0Jc2V0IG91dDEgIiIKLQlzZXQgaCAiXFxcXCRzbWJob3N0IgotCWNhdGNoIHtzZXQgb3V0MSBbZXhlYyBuZXQgdmlldyAkaF19Ci0JcmVnc3ViIC1hbGwge1tccl19ICRvdXQxICIiIG91dDEKLQotCWlmIHskZGJnfSB7cHV0cyAiU01CSE9TVDogJHNtYmhvc3QifQotCi0Jc2V0IG1vZGUgIiIKLQlmb3JlYWNoIGxpbmUgW3NwbGl0ICRvdXQxICJcbiJdIHsKLQkJaWYgW3JlZ2V4cCB7XlsgXHRdKi0tLX0gJGxpbmVdIHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtUaGUgY29tbWFuZH0gJGxpbmVdIHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtTaGFyZWQgcmVzb3VyY2VzfSAkbGluZV0gewotCQkJY29udGludWUKLQkJfQotCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15bIFx0XSpTaGFyZVsgXHRdKm5hbWV9ICRsaW5lXSB7Ci0JCQlzZXQgbW9kZSAic2hhcmVzIgotCQkJY29udGludWUKLQkJfQotCQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JCWlmIHskbGluZSA9PSAiIn0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7JG1vZGUgPT0gInNoYXJlcyJ9IHsKLQkJCWlmIFtyZWdleHAge14oW14gXHRdKylbIFx0XSsoW14gXHRdKylbIFx0XSooLiopJH0gJGxpbmUgbXYgbmFtZSB0eXBlIGNvbW1lbnRdIHsKLQkJCQlpZiB7JGRiZ30gewotCQkJCQlwdXRzICJTSFI6ICRuYW1lIgotCQkJCQlwdXRzICItLS06ICR0eXBlIgotCQkJCQlwdXRzICItLS06ICRjb21tZW50IgotCQkJCX0KLQkJCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15EaXNrJH0gJHR5cGVdIHsKLQkJCQkJc2V0IHNtYl9sb2NhbCgkc21iaG9zdDpkaXNrOiRuYW1lKSAkY29tbWVudAotCQkJCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7XlByaW50fSAkdHlwZV0gewotCQkJCQlzZXQgc21iX2xvY2FsKCRzbWJob3N0OnByaW50ZXI6JG5hbWUpICRjb21tZW50Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc2V0IHNtYl9sb2NhbCgkc21iaG9zdDpkb21haW4pICRkb21haW4KLX0KLQotcHJvYyBzbWJfbGlzdF91bml4IHtzbWJob3N0fSB7Ci0JZ2xvYmFsIHNtYl9sb2NhbCBzbWJfbG9jYWxfaG9zdHMgc21iX3RoaXNfaG9zdAotCXNldCBzbWJjbGllbnQgW2luX3BhdGggc21iY2xpZW50XQotCWlmIHtbaW5fcGF0aCBzbWJjbGllbnRdID09ICIifSB7Ci0JCXJldHVybiAiIgotCX0KLQlzZXQgZGJnIDAKLQotCXNldCB0aGlzX2hvc3QgW2dldF9ob3N0bmFtZV0KLQlzZXQgVGhpc19ob3N0IFtzdHJpbmcgdG91cHBlciAkdGhpc19ob3N0XQotCXNldCBzbWJfdGhpc19ob3N0ICRUaGlzX2hvc3QKLQotCXNldCBvdXQxICIiCi0JY2F0Y2gge3NldCBvdXQxIFtleGVjIHNtYmNsaWVudCAtTiAtTCAkc21iaG9zdCAyPkAgc3Rkb3V0XX0KLQotCWlmIHskZGJnfSB7cHV0cyAiU01CSE9TVDogJHNtYmhvc3QifQotCWlmIHskc21iaG9zdCA9PSAkdGhpc19ob3N0IHx8ICRzbWJob3N0ID09ICRUaGlzX2hvc3R9IHsKLQkJaWYgeyRvdXQxID09ICIifSB7Ci0JCQljYXRjaCB7c2V0IG91dDEgW2V4ZWMgc21iY2xpZW50IC1OIC1MIGxvY2FsaG9zdCAyPkAgc3Rkb3V0XX0KLQkJfQotCX0KLQotCXNldCBkb21haW4gIiIKLQlzZXQgbW9kZSAiIgotCWZvcmVhY2ggbGluZSBbc3BsaXQgJG91dDEgIlxuIl0gewotCQlpZiBbcmVnZXhwIHteWyBcdF0qLS0tfSAkbGluZV0gewotCQkJY29udGludWUKLQkJfQotCQlpZiBbcmVnZXhwIHtBbm9ueW1vdXMgbG9naW59ICRsaW5lXSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCWlmIHskZG9tYWluID09ICIiICYmIFtyZWdleHAge0RvbWFpbj1cWyhbXlxdXSspXF19ICRsaW5lIG12IGRvbWFpbl19IHsKLQkJCWlmIHskZGJnfSB7cHV0cyAiRE9NOiAkZG9tYWluIn0KLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XlsgXHRdKlNoYXJlbmFtZX0gJGxpbmVdIHsKLQkJCXNldCBtb2RlICJzaGFyZXMiCi0JCQljb250aW51ZQotCQl9Ci0JCWlmIFtyZWdleHAge15bIFx0XSpTZXJ2ZXJ9ICRsaW5lXSB7Ci0JCQlzZXQgbW9kZSAic2VydmVyIgotCQkJY29udGludWUKLQkJfQotCQlpZiBbcmVnZXhwIHteWyBcdF0qV29ya2dyb3VwfSAkbGluZV0gewotCQkJc2V0IG1vZGUgIndvcmtncm91cCIKLQkJCWNvbnRpbnVlCi0JCX0KLQkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCQlpZiB7JG1vZGUgPT0gInNoYXJlcyJ9IHsKLQkJCWlmIFtyZWdleHAge14oW14gXHRdKylbIFx0XSsoW14gXHRdKylbIFx0XSooLiopJH0gJGxpbmUgbXYgbmFtZSB0eXBlIGNvbW1lbnRdIHsKLQkJCQlpZiB7JGRiZ30gewotCQkJCQlwdXRzICJTSFI6ICRuYW1lIgotCQkJCQlwdXRzICItLS06ICR0eXBlIgotCQkJCQlwdXRzICItLS06ICRjb21tZW50IgotCQkJCX0KLQkJCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15EaXNrJH0gJHR5cGVdIHsKLQkJCQkJc2V0IHNtYl9sb2NhbCgkc21iaG9zdDpkaXNrOiRuYW1lKSAkY29tbWVudAotCQkJCX0gZWxzZWlmIFtyZWdleHAgLW5vY2FzZSB7XlByaW50ZXIkfSAkdHlwZV0gewotCQkJCQlzZXQgc21iX2xvY2FsKCRzbWJob3N0OnByaW50ZXI6JG5hbWUpICRjb21tZW50Ci0JCQkJfQotCQkJfQotCQl9IGVsc2VpZiB7JG1vZGUgPT0gInNlcnZlciJ9IHsKLQkJCWlmIFtyZWdleHAge14oW14gXHRdKylbIFx0XSooLiopJH0gJGxpbmUgbXYgaG9zdCBjb21tZW50XSB7Ci0JCQkJaWYgeyRkYmd9IHsKLQkJCQkJcHV0cyAiU1ZSOiAkaG9zdCIKLQkJCQkJcHV0cyAiLS0tOiAkY29tbWVudCIKLQkJCQl9Ci0JCQkJc2V0IHNtYl9sb2NhbCgkc21iaG9zdDpzZXJ2ZXI6JGhvc3QpICRjb21tZW50Ci0JCQl9Ci0JCX0gZWxzZWlmIHskbW9kZSA9PSAid29ya2dyb3VwIn0gewotCQkJaWYgW3JlZ2V4cCB7XihbXiBcdF0rKVsgXHRdKyguKikkfSAkbGluZSBtdiB3b3JrIGhvc3RdIHsKLQkJCQlpZiB7JGRiZ30gewotCQkJCQlwdXRzICJXUks6ICR3b3JrIgotCQkJCQlwdXRzICItLS06ICRob3N0IgotCQkJCX0KLQkJCQlpZiB7JGhvc3QgIT0gIiJ9IHsKLQkJCQkJc2V0IHNtYl9sb2NhbCgkc21iaG9zdDptYXN0ZXI6JHdvcmspICRob3N0Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc2V0IHNtYl9sb2NhbCgkc21iaG9zdDpkb21haW4pICRkb21haW4KLX0KLQotcHJvYyBzbWJfbGlzdCB7fSB7Ci0JZ2xvYmFsIGlzX3dpbmRvd3Mgc21iX2xvY2FsIHNtYl9sb2NhbF9ob3N0cwotCWdsb2JhbCBzbWJfaG9zdF9saXN0Ci0KLQlzZXQgc21iX2xvY2FsKG51bGwpICIiCi0KLQlpZiB7ISBbaW5mbyBleGlzdHMgc21iX2hvc3RfbGlzdF19IHsKLQkJc2V0IHNtYl9ob3N0X2xpc3QgIiIKLQl9Ci0JaWYgW2luZm8gZXhpc3RzIHNtYl9sb2NhbF0gewotCQl1bnNldCBzbWJfbG9jYWwKLQl9Ci0JaWYgW2luZm8gZXhpc3RzIHNtYl9sb2NhbF9ob3N0c10gewotCQl1bnNldCBzbWJfbG9jYWxfaG9zdHMKLQl9Ci0JCQkKLQlzZXQgdGhpc19ob3N0IFtnZXRfaG9zdG5hbWVdCi0Jc2V0IHRoaXNfaG9zdCBbc3RyaW5nIHRvdXBwZXIgJHRoaXNfaG9zdF0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJc21iX2xpc3Rfd2luZG93cyAkdGhpc19ob3N0Ci0JfSBlbHNlIHsKLQkJc21iX2xpc3RfdW5peCAkdGhpc19ob3N0Ci0JfQotCXNldCBkaWQoJHRoaXNfaG9zdCkgMSAKLQlzZXQga2V5cyBbYXJyYXkgbmFtZXMgc21iX2xvY2FsXQotCWZvcmVhY2ggaXRlbSBbc3BsaXQgJHNtYl9ob3N0X2xpc3RdIHsKLQkJaWYgeyRpdGVtICE9ICIifSB7Ci0JCQlzZXQgaXRlbSBbc3RyaW5nIHRvdXBwZXIgJGl0ZW1dCi0JCQlsYXBwZW5kIGtleXMgIiR0aGlzX2hvc3Q6c2VydmVyOiRpdGVtIgotCQl9Ci0JfQotCWZvcmVhY2gga2V5ICRrZXlzIHsKLQkJaWYgW3JlZ2V4cCAiXiR0aGlzX2hvc3Q6c2VydmVyOiguKilcJCIgJGtleSBtdiBob3N0XSAgewotCQkJaWYgeyRob3N0ID09ICIifSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCXNldCBzbWJfbG9jYWxfaG9zdHMoJGhvc3QpIDEKLQkJCWlmIHshIFtpbmZvIGV4aXN0cyBkaWQoJGhvc3QpXX0gewotCQkJCWlmIHskaXNfd2luZG93c30gewotCQkJCQlzbWJfbGlzdF93aW5kb3dzICRob3N0Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc21iX2xpc3RfdW5peCAkaG9zdAotCQkJCX0KLQkJCQlzZXQgZGlkKCRob3N0KSAxIAotCQkJfQotCQl9Ci0JfQotfQotCi1wcm9jIHNtYl9jaGVja19zZWxlY3RlZCB7fSB7Ci0JZ2xvYmFsIHNtYm1vdW50X2V4aXN0cyBzbWJtb3VudF9zdW1vZGUKLQlnbG9iYWwgc21iX3NlbGVjdGVkIHNtYl9zZWxlY3RlZF9tbnQgc21iX3NlbGVjdGVkX2NiIHNtYl9zZWxlY3RlZF9lbgotCi0Jc2V0IG9rIDAKLQlpZiB7JHNtYm1vdW50X2V4aXN0cyAmJiAkc21ibW91bnRfc3Vtb2RlICE9ICJkb250a25vdyJ9IHsKLQkJc2V0IG9rIDEKLQl9Ci0Jc2V0IHN0YXRlIGRpc2FibGVkCi0JaWYgeyRva30gewotCQlzZXQgc3RhdGUgbm9ybWFsCi0JfQotCi0JZm9yZWFjaCBjYiBbYXJyYXkgbmFtZXMgc21iX3NlbGVjdGVkX2NiXSB7Ci0JCWNhdGNoIHskY2IgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGV9Ci0JfQotCWZvcmVhY2ggZW4gW2FycmF5IG5hbWVzIHNtYl9zZWxlY3RlZF9lbl0gewotCQljYXRjaCB7JGVuIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlfQotCX0KLX0KLQotcHJvYyBtYWtlX3NoYXJlX3dpZGdldHMge3d9IHsKLQkKLQlzZXQgc2hhcmVfbGFiZWwgJHcuZi5obAotCWNhdGNoIHskc2hhcmVfbGFiZWwgY29uZmlndXJlIC10ZXh0ICJTaGFyZSBOYW1lOiBQUk9CSU5HIC4uLiJ9Ci0JdXBkYXRlCi0KLQlzbWJfbGlzdAotCi0Jc2V0IHNhd19mIDAKLQlmb3JlYWNoIGNoaWxkIFt3aW5mbyBjaGlsZHJlbiAkd10gewotCQlpZiB7JGNoaWxkID09ICIkdy5mIn0gewotCQkJc2V0IHNhd19mIDEKLQkJCWNvbnRpbnVlCi0JCX0KLQkJY2F0Y2gge2Rlc3Ryb3kgJGNoaWxkfQotCX0KLQotCXNldCB3MSA0NwotCXNldCB3MiA0NAotCi0JaWYgeyEgJHNhd19mfSB7Ci0JCXNldCB3ZiAkdy5mCi0JCWZyYW1lICR3ZgotCQlsYWJlbCAkd2YuaGwgLXdpZHRoICR3MSAtdGV4dCAiU2hhcmUgTmFtZToiIC1hbmNob3IgdwotCQlsYWJlbCAkd2YuaHIgLXdpZHRoICR3MiAtdGV4dCAiICBNb3VudCBQb2ludDoiIC1hbmNob3IgdwotCi0JCXBhY2sgJHdmLmhsICR3Zi5ociAtc2lkZSBsZWZ0IC1leHBhbmQgMQotCQlwYWNrICR3ZiAtc2lkZSB0b3AgLWZpbGwgeAotCi0JCS5zbWJ3aXouZi50IHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJHcKLQl9Ci0KLQlnbG9iYWwgc21iX2xvY2FsIHNtYl9sb2NhbF9ob3N0cyBzbWJfdGhpc19ob3N0IHNtYl9zZWxlY3RlZCBzbWJfc2VsZWN0ZWRfbW50Ci0JZ2xvYmFsIHNtYl9zZWxlY3RlZF9ob3N0IHNtYl9zZWxlY3RlZF9uYW1lCi0JZ2xvYmFsIHNtYl9zZWxlY3RlZF9jYiBzbWJfc2VsZWN0ZWRfZW4KLQlnbG9iYWwgc21iX2hvc3RfbGlzdAotCWlmIFtpbmZvIGV4aXN0cyBzbWJfc2VsZWN0ZWRdICAgICAge2FycmF5IHVuc2V0IHNtYl9zZWxlY3RlZCB9Ci0JaWYgW2luZm8gZXhpc3RzIHNtYl9zZWxlY3RlZF9tbnRdICB7YXJyYXkgdW5zZXQgc21iX3NlbGVjdGVkX21udH0KLQlpZiBbaW5mbyBleGlzdHMgc21iX3NlbGVjdGVkX2NiXSAgIHthcnJheSB1bnNldCBzbWJfc2VsZWN0ZWRfY2J9Ci0JaWYgW2luZm8gZXhpc3RzIHNtYl9zZWxlY3RlZF9lbl0gICB7YXJyYXkgdW5zZXQgc21iX3NlbGVjdGVkX2VufQotCWlmIFtpbmZvIGV4aXN0cyBzbWJfc2VsZWN0ZWRfaG9zdF0ge2FycmF5IHVuc2V0IHNtYl9zZWxlY3RlZF9ob3N0fQotCWlmIFtpbmZvIGV4aXN0cyBzbWJfc2VsZWN0ZWRfbmFtZV0ge2FycmF5IHVuc2V0IHNtYl9zZWxlY3RlZF9uYW1lfQotCi0Jc2V0IGhvc3RzIFtsaXN0ICRzbWJfdGhpc19ob3N0XQotCWxhcHBlbmQgaG9zdHMgW2xzb3J0IFthcnJheSBuYW1lcyBzbWJfbG9jYWxfaG9zdHNdXQotCi0Jc2V0IHNtYl9ob3N0X2xpc3QgIiIKLQlzZXQgaSAwCi0KLQlnbG9iYWwgc21iX21vdW50X3ByZWZpeAotCXNldCBzbWJfbW91bnRfcHJlZml4ICIvdmFyL3RtcC8lVVNFUi1tbnRzIgotCi0JZm9yZWFjaCBob3N0IFtsc29ydCBbYXJyYXkgbmFtZXMgc21iX2xvY2FsX2hvc3RzXV0gewotCi0JCWlmIFtpbmZvIGV4aXN0cyBkaWQoJGhvc3QpXSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBkaWQoJGhvc3QpIDEKLQotCQlhcHBlbmQgc21iX2hvc3RfbGlzdCAiJGhvc3QgIgotCi0JCWZvcmVhY2gga2V5IFtsc29ydCBbYXJyYXkgbmFtZXMgc21iX2xvY2FsXV0gewotCQkJaWYgW3JlZ2V4cCB7XihbXjpdKyk6KFteOl0rKTooLiopJH0gJGtleSBtdiBob3N0MiB0eXBlIG5hbWVdIHsKLQkJCQlpZiB7JGhvc3QyICE9ICRob3N0fSAgewotCQkJCQljb250aW51ZQotCQkJCX0KLQkJCQlpZiB7JHR5cGUgIT0gImRpc2sifSB7Ci0JCQkJCWNvbnRpbnVlCi0JCQkJfQotCQkJCXNldCB3ZiAkdy5mJGkKLQkJCQlmcmFtZSAkd2YKLQkJCQljaGVja2J1dHRvbiAkd2YuYyAtYW5jaG9yIHcgLXdpZHRoICR3MSAtdmFyaWFibGUgc21iX3NlbGVjdGVkKCRpKSBcCi0JCQkJCS10ZXh0ICIvLyRob3N0LyRuYW1lIiAtcmVsaWVmIHJpZGdlIAotCQkJCWlmIHshIFtpbmZvIGV4aXN0cyBzbWJfc2VsZWN0ZWQoJGkpXX0gewotCQkJCQlzZXQgc21iX3NlbGVjdGVkKCRpKSAwCi0JCQkJfQotCi0JCQkJZW50cnkgJHdmLmUgLXdpZHRoICR3MiAtdGV4dHZhcmlhYmxlIHNtYl9zZWxlY3RlZF9tbnQoJGkpCi0JCQkJc2V0IHNtYl9zZWxlY3RlZF9tbnQoJGkpICIkc21iX21vdW50X3ByZWZpeC8kaG9zdC8kbmFtZSIKLQotCQkJCXNldCBzbWJfc2VsZWN0ZWRfaG9zdCgkaSkgJGhvc3QKLQkJCQlzZXQgc21iX3NlbGVjdGVkX25hbWUoJGkpICRuYW1lCi0KLQkJCQlzZXQgc21iX3NlbGVjdGVkX2NiKCR3Zi5jKSAkaQotCQkJCXNldCBzbWJfc2VsZWN0ZWRfZW4oJHdmLmUpICRpCi0JCQkJc2V0IGNvbW1lbnQgJHNtYl9sb2NhbCgka2V5KQotCi0JCQkJYmluZCAkd2YuYyA8RW50ZXI+ICIkc2hhcmVfbGFiZWwgY29uZmlndXJlIC10ZXh0IHtTaGFyZSBOYW1lOiAkY29tbWVudH0iCi0JCQkJYmluZCAkd2YuYyA8TGVhdmU+ICIkc2hhcmVfbGFiZWwgY29uZmlndXJlIC10ZXh0IHtTaGFyZSBOYW1lOn0iCi0KLQkJCQkkd2YuYyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCQkJJHdmLmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCi0JCQkJcGFjayAkd2YuYyAkd2YuZSAtc2lkZSBsZWZ0IC1leHBhbmQgMQotCQkJCXBhY2sgJHdmIC1zaWRlIHRvcCAtZmlsbCB4Ci0JCQkJaW5jciBpCi0JCQl9Ci0JCX0KLQl9Ci0JaWYgeyRpID09IDB9IHsKLQkJZ2xvYmFsIGlzX3dpbjl4Ci0JCSRzaGFyZV9sYWJlbCBjb25maWd1cmUgLXRleHQge1NoYXJlIE5hbWU6IE5vIFNNQiBTaGFyZSBIb3N0cyB3ZXJlIGZvdW5kIX0KLQkJaWYgeyRpc193aW45eH0gewotCQkJLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG4odGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgb24gV2luOXggeW91IGhhdmUgaGF2ZSB0byBlbnRlciB0aGVtIG1hbnVhbGx5OiAvL0hPU1Qvc2hhcmUgL3Zhci90bXAvbXltbnQpXG4iCi0JCX0KLQl9IGVsc2UgewotCQkkc2hhcmVfbGFiZWwgY29uZmlndXJlIC10ZXh0ICJTaGFyZSBOYW1lOiBGb3VuZCAkaSBTTUIgU2hhcmVzIgotCX0KLQlzbWJfY2hlY2tfc2VsZWN0ZWQKLX0KLQotcHJvYyBzbWJfaGVscF9tZV9kZWNpZGUge30gewotCWdsb2JhbCBpc193aW5kb3dzCi0JZ2xvYmFsIHNtYl9sb2NhbCBzbWJfbG9jYWxfaG9zdHMgc21iX3RoaXNfaG9zdCBzbWJfc2VsZWN0ZWQgc21iX3NlbGVjdGVkX21udAotCWdsb2JhbCBzbWJfc2VsZWN0ZWRfaG9zdCBzbWJfc2VsZWN0ZWRfbmFtZQotCWdsb2JhbCBzbWJfc2VsZWN0ZWRfY2Igc21iX3NlbGVjdGVkX2VuCi0JZ2xvYmFsIHNtYl9ob3N0X2xpc3QKLQotCXRvcGxldiAuc21id2l6Ci0Jc2V0IHRpdGxlICJTTUIgRmlsZXN5c3RlbSBUdW5uZWxsaW5nIC0tIEhlbHAgTWUgRGVjaWRlIgotCXdtIHRpdGxlIC5zbWJ3aXogJHRpdGxlCi0Jc2V0IGlkICIgICIKLQotCXNldCBoIDQwCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAzMAotCX0KLQlzY3JvbGxfdGV4dCAuc21id2l6LmYgMTAwICRoCi0KLQlzZXQgbXNnIHsKLUZvciBub3cgeW91IHdpbGwgaGF2ZSB0byB2ZXJpZnkgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBtYW51YWxseS4KLQotWW91IGNhbiBkbyB0aGlzIGJ5IGVpdGhlciBsb2dnaW5nIGludG8gdGhlIHJlbW90ZSBtYWNoaW5lIHRvIGZpbmQgdGhlIGluZm8gb3IgYXNraW5nIHRoZSBzeXNhZG1pbiBmb3IgaXQuICAKLQotfQotCi0JaWYgeyEgJGlzX3dpbmRvd3N9IHsKLQkJLnNtYndpei5mLnQgY29uZmlndXJlIC1mb250IHtIZWx2ZXRpY2EgLTEyIGJvbGR9Ci0JfQotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgJG1zZwotCi0Jc2V0IHcgLnNtYndpei5mLnQuZjEKLQlmcmFtZSAkdyAtYmQgMSAtcmVsaWVmIHJpZGdlIC1jdXJzb3Ige3RvcF9sZWZ0X2Fycm93fQotCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG4iCi0KLQkuc21id2l6LmYudCBpbnNlcnQgZW5kICIxKSBJbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSAnc21ibW91bnQnIGNvbW1hbmQgb24gdGhlIHJlbW90ZSBzeXN0ZW06XG4iCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG4kaWQiCi0JZ2xvYmFsIHNtYm1vdW50X2V4aXN0cwotCXNldCBzbWJtb3VudF9leGlzdHMgMAotCi0JY2hlY2tidXR0b24gJHcuc21ibW91bnRfZXhpc3RzIC1wYWR5IDEgLWFuY2hvciB3IC12YXJpYWJsZSBzbWJtb3VudF9leGlzdHMgXAotCQktdGV4dCAiWWVzLCB0aGUgJ3NtYm1vdW50JyBjb21tYW5kIGV4aXN0cyBvbiB0aGUgcmVtb3RlIHN5c3RlbS4iIFwKLQkJLWNvbW1hbmQgc21iX2NoZWNrX3NlbGVjdGVkCi0KLQlwYWNrICR3LnNtYm1vdW50X2V4aXN0cwotCS5zbWJ3aXouZi50IHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJHcKLQotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgIlxuXG5cbiIKLQotCXNldCB3IC5zbWJ3aXouZi50LmYyCi0JZnJhbWUgJHcgLWJkIDEgLXJlbGllZiByaWRnZSAtY3Vyc29yIHt0b3BfbGVmdF9hcnJvd30KLQotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgIjIpIEluZGljYXRlIHlvdXIgYXV0aG9yaXphdGlvbiB0byBydW4gJ3NtYm1vdW50JyBvbiB0aGUgcmVtb3RlIHN5c3RlbTpcbiIKLQkuc21id2l6LmYudCBpbnNlcnQgZW5kICJcbiRpZCIKLQlnbG9iYWwgc21ibW91bnRfc3Vtb2RlCi0Jc2V0IHNtYm1vdW50X3N1bW9kZSAiZG9udGtub3ciCi0KLQlyYWRpb2J1dHRvbiAkdy5kayAtcGFkeSAxIC1hbmNob3IgdyAtdmFyaWFibGUgc21ibW91bnRfc3Vtb2RlIC12YWx1ZSBkb250a25vdyBcCi0JCS10ZXh0ICJJIGRvIG5vdCBrbm93IGlmIEkgY2FuIG1vdW50IFNNQiBzaGFyZXMgb24gdGhlIHJlbW90ZSBzeXN0ZW0gdmlhICdzbWJtb3VudCciIFwKLQkJLWNvbW1hbmQgc21iX2NoZWNrX3NlbGVjdGVkCi0JcGFjayAkdy5kayAtc2lkZSB0b3AgLWZpbGwgeAotCi0JcmFkaW9idXR0b24gJHcuc3UgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNtYm1vdW50X3N1bW9kZSAtdmFsdWUgc3UgXAotCQktdGV4dCAiSSBrbm93IHRoZSBQYXNzd29yZCB0byBydW4gY29tbWFuZHMgYXMgcm9vdCBvbiB0aGUgcmVtb3RlIHN5c3RlbSB2aWEgJ3N1JyIgXAotCQktY29tbWFuZCBzbWJfY2hlY2tfc2VsZWN0ZWQKLQlwYWNrICR3LnN1IC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlyYWRpb2J1dHRvbiAkdy5zdWRvIC1wYWR5IDEgLWFuY2hvciB3IC12YXJpYWJsZSBzbWJtb3VudF9zdW1vZGUgLXZhbHVlIHN1ZG8gXAotCQktdGV4dCAiSSBrbm93IHRoZSBQYXNzd29yZCB0byBydW4gY29tbWFuZHMgYXMgcm9vdCBvbiB0aGUgcmVtb3RlIHN5c3RlbSB2aWEgJ3N1ZG8nIiBcCi0JCS1jb21tYW5kIHNtYl9jaGVja19zZWxlY3RlZAotCXBhY2sgJHcuc3VkbyAtc2lkZSB0b3AgLWZpbGwgeAotCi0JcmFkaW9idXR0b24gJHcucnUgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNtYm1vdW50X3N1bW9kZSAtdmFsdWUgbm9uZSBcCi0JCS10ZXh0ICJJIGRvIG5vdCBuZWVkIHRvIGJlIHJvb3Qgb24gdGhlIHJlbW90ZSBzeXN0ZW0gdG8gbW91bnQgU01CIHNoYXJlcyB2aWEgJ3NtYm1vdW50JyIgXAotCQktY29tbWFuZCBzbWJfY2hlY2tfc2VsZWN0ZWQKLQlwYWNrICR3LnJ1IC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQkuc21id2l6LmYudCB3aW5kb3cgY3JlYXRlIGVuZCAtd2luZG93ICR3Ci0KLQlnbG9iYWwgc21iX3dpel9kb25lCi0Jc2V0IHNtYl93aXpfZG9uZSAwCi0KLQlidXR0b24gLnNtYndpei5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge3NldCBzbWJfd2l6X2RvbmUgMX0KLQlidXR0b24gLnNtYndpei5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7c2V0IHNtYl93aXpfZG9uZSAxfQotCXBhY2sgLnNtYndpei5kb25lIC1zaWRlIGJvdHRvbSAtZmlsbCB4IAotCXBhY2sgLnNtYndpei5mIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQotCi0Jd20gcHJvdG9jb2wgLnNtYndpeiBXTV9ERUxFVEVfV0lORE9XIHtzZXQgc21iX3dpel9kb25lIDF9Ci0JY2VudGVyX3dpbiAuc21id2l6Ci0KLQl3bSB0aXRsZSAuc21id2l6ICJTZWFyY2hpbmcgZm9yIExvY2FsIFNNQiBzaGFyZXMuLi4iCi0JdXBkYXRlCi0Jd20gdGl0bGUgLnNtYndpeiAkdGl0bGUKLQotCWdsb2JhbCBzbWJfbG9jYWwgc21iX3RoaXNfaG9zdAotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgIlxuXG5cbiIKLQotCXNldCB3IC5zbWJ3aXouZi50LmYzCi0JY2F0Y2gge2Rlc3Ryb3kgJHd9Ci0JZnJhbWUgJHcgLWJkIDEgLXJlbGllZiByaWRnZSAtY3Vyc29yIHt0b3BfbGVmdF9hcnJvd30KLQotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgIjMpIFNlbGVjdCBTTUIgc2hhcmVzIHRvIG1vdW50IGFuZCB0aGVpciBtb3VudCBwb2ludCBvbiB0aGUgcmVtb3RlIHN5c3RlbTpcbiIKLQkuc21id2l6LmYudCBpbnNlcnQgZW5kICJcbiR7aWR9IgotCi0JbWFrZV9zaGFyZV93aWRnZXRzICR3Ci0KLQkuc21id2l6LmYudCBpbnNlcnQgZW5kICJcbiglVVNFUiB3aWxsIGJlIGV4cGFuZGVkIHRvIHRoZSB1c2VybmFtZSBvbiB0aGUgcmVtb3RlIHN5c3RlbSBhbmQgJUhPTUUgdGhlIGhvbWUgZGlyZWN0b3J5KVxuIgotCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG5cblxuIgotCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiWW91IGNhbiBjaGFuZ2UgdGhlIGxpc3Qgb2YgTG9jYWwgU01CIGhvc3RzIHRvIHByb2JlIGFuZCB0aGUgbW91bnQgcG9pbnQgcHJlZml4IGhlcmU6XG4iCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG4kaWQiCi0Jc2V0IHcgLnNtYndpei5mLnQuZjQKLQlmcmFtZSAkdyAtYmQgMSAtcmVsaWVmIHJpZGdlIC1jdXJzb3Ige3RvcF9sZWZ0X2Fycm93fQotCXNldCB3ZiAuc21id2l6LmYudC5mNC5mCi0JZnJhbWUgJHdmCi0JbGFiZWwgJHdmLmwgLXRleHQgIlNNQiBIb3N0czogICIgIC1hbmNob3IgdwotCWVudHJ5ICR3Zi5lIC10ZXh0dmFyaWFibGUgc21iX2hvc3RfbGlzdCAtd2lkdGggNjAKLQlidXR0b24gJHdmLmIgLXRleHQgIkFwcGx5IiAtY29tbWFuZCB7bWFrZV9zaGFyZV93aWRnZXRzIC5zbWJ3aXouZi50LmYzfQotCWJpbmQgJHdmLmUgPFJldHVybj4gIiR3Zi5iIGludm9rZSIKLQlwYWNrICR3Zi5sICR3Zi5lICR3Zi5iIC1zaWRlIGxlZnQKLQlwYWNrICR3ZgotCXBhY2sgJHcKLQotCS5zbWJ3aXouZi50IHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJHcKLQotCS5zbWJ3aXouZi50IGluc2VydCBlbmQgIlxuJGlkIgotCi0Jc2V0IHcgLnNtYndpei5mLnQuZjUKLQlmcmFtZSAkdyAtYmQgMSAtcmVsaWVmIHJpZGdlIC1jdXJzb3Ige3RvcF9sZWZ0X2Fycm93fQotCXNldCB3ZiAuc21id2l6LmYudC5mNS5mCi0JZnJhbWUgJHdmCi0JbGFiZWwgJHdmLmwgLXRleHQgIk1vdW50IFByZWZpeDoiICAtYW5jaG9yIHcKLQllbnRyeSAkd2YuZSAtdGV4dHZhcmlhYmxlIHNtYl9tb3VudF9wcmVmaXggLXdpZHRoIDYwCi0JYnV0dG9uICR3Zi5iIC10ZXh0ICJBcHBseSIgLWNvbW1hbmQge2FwcGx5X21vdW50X3BvaW50X3ByZWZpeCAuc21id2l6LmYudC5mNS5mLmV9Ci0JYmluZCAkd2YuZSA8UmV0dXJuPiAiJHdmLmIgaW52b2tlIgotCXBhY2sgJHdmLmwgJHdmLmUgJHdmLmIgLXNpZGUgbGVmdAotCXBhY2sgJHdmCi0JcGFjayAkdwotCi0JLnNtYndpei5mLnQgd2luZG93IGNyZWF0ZSBlbmQgLXdpbmRvdyAkdwotCi0JLnNtYndpei5mLnQgaW5zZXJ0IGVuZCAiXG5cblxuIgotCi0JLnNtYndpei5mLnQgc2VlIDEuMAotCS5zbWJ3aXouZi50IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQl1cGRhdGUKLQotCXZ3YWl0IHNtYl93aXpfZG9uZQotCWNhdGNoIHtkZXN0cm95IC5zbWJ3aXp9Ci0KLQlpZiB7ISAkc21ibW91bnRfZXhpc3RzIHx8ICRzbWJtb3VudF9zdW1vZGUgPT0gImRvbnRrbm93In0gewotCQl0a19tZXNzYWdlQm94IC10eXBlIG9rIC1wYXJlbnQgLm9hIC1pY29uIHdhcm5pbmcgLW1lc3NhZ2UgIlNvcnJ5IHdlIGNvdWxkbid0IGhlbHAgb3V0IVxuJ3NtYm1vdW50JyBpbmZvIG9uIHRoZSByZW1vdGUgc3lzdGVtIGlzIHJlcXVpcmVkIGZvciBTTUIgbW91bnRpbmciIC10aXRsZSAiU01CIG1vdW50aW5nIC0tIGFib3J0aW5nIgotCQlnbG9iYWwgdXNlX3NtYm1udAotCQlzZXQgdXNlX3NtYm1udCAwCi0JCWNhdGNoIHtyYWlzZSAub2F9Ci0JCXJldHVybgotCX0KLQlnbG9iYWwgc21iX3N1X21vZGUKLQlzZXQgc21iX3N1X21vZGUgJHNtYm1vdW50X3N1bW9kZQotCi0Jc2V0IG1heCAwCi0JZm9yZWFjaCBlbiBbYXJyYXkgbmFtZXMgc21iX3NlbGVjdGVkX2VuXSB7Ci0JCXNldCBpICRzbWJfc2VsZWN0ZWRfZW4oJGVuKQotCQlzZXQgaG9zdCAkc21iX3NlbGVjdGVkX2hvc3QoJGkpCi0JCXNldCBuYW1lICRzbWJfc2VsZWN0ZWRfbmFtZSgkaSkKLQotCQlzZXQgbGVuIFtzdHJpbmcgbGVuZ3RoICIvLyRob3N0LyRuYW1lIl0KLQkJaWYgeyRsZW4gPiAkbWF4fSB7Ci0JCQlzZXQgbWF4ICRsZW4KLQkJfQotCX0KLQotCXNldCBtYXggW2V4cHIgJG1heCArIDhdCi0KLQlzZXQgc3RycyAiIgotCWZvcmVhY2ggZW4gW2FycmF5IG5hbWVzIHNtYl9zZWxlY3RlZF9lbl0gewotCQlzZXQgaSAkc21iX3NlbGVjdGVkX2VuKCRlbikKLQkJaWYgeyEgJHNtYl9zZWxlY3RlZCgkaSl9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJc2V0IGhvc3QgJHNtYl9zZWxlY3RlZF9ob3N0KCRpKQotCQlzZXQgbmFtZSAkc21iX3NlbGVjdGVkX25hbWUoJGkpCi0JCXNldCBtbnQgJHNtYl9zZWxlY3RlZF9tbnQoJGkpCi0KLQkJc2V0IHNoYXJlICIvLyRob3N0LyRuYW1lIgotCQlzZXQgc2hhcmUgW2Zvcm1hdCAiJS0ke21heH1zIiAkc2hhcmVdCi0JCQotCQlsYXBwZW5kIHN0cnMgIiRzaGFyZSAkbW50IgotCX0KLQlzZXQgdGV4dCAiIgotCWZvcmVhY2ggc3RyIFtsc29ydCAkc3Ryc10gewotCQlhcHBlbmQgdGV4dCAiJHN0clxuIgotCX0KLQotCWdsb2JhbCBzbWJfbW91bnRfbGlzdAotCXNldCBzbWJfbW91bnRfbGlzdCAkdGV4dAotCi0Jc21iX2RpYWxvZwotfQotCi1wcm9jIGFwcGx5X21vdW50X3BvaW50X3ByZWZpeCB7d30gewotCWdsb2JhbCBzbWJfc2VsZWN0ZWRfaG9zdCBzbWJfc2VsZWN0ZWRfbmFtZQotCWdsb2JhbCBzbWJfc2VsZWN0ZWRfZW4gc21iX3NlbGVjdGVkX21udAotCi0Jc2V0IHByZWZpeCAiIgotCWNhdGNoIHtzZXQgcHJlZml4IFskdyBnZXRdfQotCWlmIHskcHJlZml4ID09ICIifSB7Ci0JCW1lc2cgIk5vIG1vdW50IHByZWZpeC4iCi0JCWJlbGwKLQkJcmV0dXJuCi0JfQotCi0JZm9yZWFjaCBlbiBbYXJyYXkgbmFtZXMgc21iX3NlbGVjdGVkX2VuXSB7Ci0JCXNldCBpICRzbWJfc2VsZWN0ZWRfZW4oJGVuKQotCQlzZXQgaG9zdCAkc21iX3NlbGVjdGVkX2hvc3QoJGkpCi0JCXNldCBuYW1lICRzbWJfc2VsZWN0ZWRfbmFtZSgkaSkKLQkJc2V0IHNtYl9zZWxlY3RlZF9tbnQoJGkpICIkcHJlZml4LyRob3N0LyRuYW1lIgotCX0KLX0KLQotcHJvYyBzbWJfZGlhbG9nIHt9IHsKLQl0b3BsZXYgLnNtYgotCXdtIHRpdGxlIC5zbWIgIlNNQiBGaWxlc3lzdGVtIFR1bm5lbGxpbmciCi0JZ2xvYmFsIHNtYl9zdV9tb2RlIHNtYl9tb3VudF9saXN0Ci0JZ2xvYmFsIHVzZV9zbWJtbnQKLQotCWdsb2JhbCBoZWxwX2ZvbnQKLQotCWdsb2JhbCB1bmFtZQotCXNldCBoIDMzCi0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAxNwotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMjQKLQl9Ci0Jc2Nyb2xsX3RleHQgLnNtYi5mIDgwICRoCi0KLQlzZXQgbXNnIHsKLSAgICBXaW5kb3dzL1NhbWJhIEZpbGVzeXN0ZW0gbW91bnRpbmcgcmVxdWlyZXMgU1NIIGJlIHVzZWQgdG8gc2V0IHVwIHRoZSBTTUIKLSAgICBzZXJ2aWNlIHBvcnQgcmVkaXJlY3Rpb24uICBUaGlzIHdpbGwgYmUgZWl0aGVyIG9mIHRoZSAiVXNlIFNTSCIgb3IKLSAgICAiU1NIK1NTTCIgbW9kZXMuIE5PVEU6IEZvciBwdXJlIFNTTCB0dW5uZWxsaW5nIGl0IGN1cnJlbnRseSB3aWxsIG5vdCB3b3JrLgotCi0gICAgVGhpcyBtZXRob2QgcmVxdWlyZXMgYSB3b3JraW5nIFNhbWJhIHNvZnR3YXJlIHNldHVwIG9uIHRoZSByZW1vdGUKLSAgICBzaWRlIG9mIHRoZSBjb25uZWN0aW9uIChWTkMgc2VydmVyKSBhbmQgZXhpc3RpbmcgU2FtYmEgb3IgV2luZG93cyBmaWxlCi0gICAgc2VydmVyKHMpIG9uIHRoZSBsb2NhbCBzaWRlIChWTkMgdmlld2VyKS4KLQotICAgIFRoZSBzbWJtb3VudCg4KSBwcm9ncmFtIE1VU1QgYmUgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgc2lkZS4gVGhpcwotICAgIGV2aWRlbnRseSBsaW1pdHMgdGhlIG1vdW50aW5nIHRvIExpbnV4IHN5c3RlbXMuICBMZXQgdXMga25vdyBvZiBzaW1pbGFyCi0gICAgdXRpbGl0aWVzIG9uIG90aGVyIFVuaXhlcy4gIE1vdW50aW5nIG9udG8gcmVtb3RlIFdpbmRvd3MgbWFjaGluZXMgaXMKLSAgICBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAob3VyIFNTSCBtb2RlIHdpdGggc2VydmljZXMgc2V0dXAgb25seSB3b3JrcwotICAgIHRvIFVuaXgpLiAgT24gRGViaWFuIGFuZCBVYnVudHUgdGhlIHNtYm1vdW50IHByb2dyYW0gaXMgY3VycmVudGx5IGluCi0gICAgdGhlIHBhY2thZ2UgbmFtZWQgJ3NtYmZzJy4KLQotICAgIERlcGVuZGluZyBvbiBob3cgc21ibW91bnQgaXMgY29uZmlndXJlZCB5b3UgbWF5IGJlIGFibGUgdG8gcnVuIGl0Ci0gICAgYXMgYSByZWd1bGFyIHVzZXIsIG9yIGl0IG1heSByZXF1aXJlIHJ1bm5pbmcgdW5kZXIgc3UoMSkgb3Igc3Vkbyg4KQotICAgIChyb290IHBhc3N3b3JkIG9yIHVzZXIgcGFzc3dvcmQgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSkuICBZb3Ugc2VsZWN0Ci0gICAgd2hpY2ggb25lIHlvdSB3YW50IHZpYSB0aGUgY2hlY2tidXR0b25zIGJlbG93LgotCi0gICAgSW4gYWRkaXRpb24gdG8gYSBwb3NzaWJsZSBzdSgxKSBvciBzdWRvKDgpIHBhc3N3b3JkLCB5b3UgbWF5IEFMU08KLSAgICBuZWVkIHRvIHN1cHBseSBwYXNzd29yZHMgdG8gbW91bnQgZWFjaCBTTUIgc2hhcmUuIFRoaXMgaXMgYW4gU01CIHBhc3N3ZC4KLSAgICBJZiBpdCBoYXMgbm8gcGFzc3dvcmQganVzdCBoaXQgZW50ZXIgYWZ0ZXIgdGhlICJQYXNzd29yZDoiIHByb21wdC4KLQotICAgIFRoZSBwYXNzd29yZHMgYXJlIHN1cHBsaWVkIHdoZW4gdGhlIDFzdCBTU0ggY29ubmVjdGlvbiBzdGFydHMgdXA7Ci0gICAgYmUgcHJlcGFyZWQgdG8gcmVzcG9uZCB0byB0aGVtLgotCi0gICAgTk9URTogVVNFIE9GIFNNQiBUVU5ORUxMSU5HIE1PREUgV0lMTCBSRVFVSVJFIFRXTyBTU0gnUywgQU5EIFNPIFlPVQotICAgIE1BWSBORUVEIFRPIFNVUFBMWSBUV08gTE9HSU4gUEFTU1dPUkRTIFVOTEVTUyBZT1UgQVJFIFVTSU5HIFNPTUVUSElORwotICAgIExJS0Ugc3NoLWFnZW50KDEpIG9yIHRoZSBQdXR0eSBQVyBzZXR0aW5nLgotICAgICVXSU4KLQotICAgIFRvIGluZGljYXRlIHRoZSBXaW5kb3dzL1NhbWJhIHNoYXJlcyB0byBtb3VudCBlbnRlciB0aGVtIG9uZSBwZXIgbGluZQotICAgIGluIG9uZSBvZiB0aGUgZm9ybXM6Ci0KLSAgICAgIC8vbWFjaGluZTEvc2hhcmUgICB+L0Rlc2t0b3AvbXktbW91bnQxCi0gICAgICAvL21hY2hpbmUyL2Z1YmFyICAgL3Zhci90bXAvbXktZm9vYmFyMiAgMTkyLjE2OC4xMDAuNTM6MzQ1NgotICAgICAgMTEzOSAgLy9tYWNoaW5lMy9iYXogIC92YXIvdG1wL2JheiAgICAgIFsuLi5dCi0KLSAgICBUaGUgZmlyc3QgcGFydCBpcyB0aGUgc3RhbmRhcmQgU01CIGhvc3QgYW5kIHNoYXJlIG5hbWUgLy9ob3N0bmFtZS9kaXIKLSAgICAobm90ZSB0aGlzIHNoYXJlIGlzIG9uIHRoZSBsb2NhbCB2aWV3ZXItc2lkZSBub3Qgb24gdGhlIHJlbW90ZSBlbmQpLgotICAgIEEgbGVhZGluZyAnIycgd2lsbCBjYXVzZSB0aGUgZW50aXJlIGxpbmUgdG8gYmUgc2tpcHBlZC4KLQotICAgIFRoZSBzZWNvbmQgcGFydCwgZS5nLiAvdmFyL3RtcC9teS1mb29iYXIyLCBpcyB0aGUgZGlyZWN0b3J5IHRvIG1vdW50Ci0gICAgdGhlIHNoYXJlIG9uIHRoZSByZW1vdGUgKFZOQyBTZXJ2ZXIpIHNpZGUuICBZb3UgbXVzdCBiZSBhYmxlIHRvCi0gICAgd3JpdGUgdG8gdGhpcyBkaXJlY3RvcnkuICBJdCB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAgQSBsZWFkaW5nIGNoYXJhY3RlciB+IHdpbGwgYmUgZXhwYW5kZWQgdG8gJEhPTUUuICBTbyB3aWxsIHRoZSBzdHJpbmcKLSAgICAlSE9NRS4gIFRoZSBzdHJpbmcgJVVTRVIgd2lsbCBnZXQgZXhwYW5kZWQgdG8gdGhlIHJlbW90ZSB1c2VybmFtZS4KLQotICAgIEFuIG9wdGlvbmFsIHBhcnQgbGlrZSAxOTIuMTY4LjEwMC41MzozNDU2IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVhbAotICAgIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MsIGFuZCBwb3NzaWJsZSBub24tc3RhbmRhcmQgcG9ydCwgb24gdGhlIGxvY2FsCi0gICAgc2lkZSBpZiBmb3Igc29tZSByZWFzb24gdGhlIC8vaG9zdG5hbWUgaXMgbm90IHN1ZmZpY2llbnQuCi0KLSAgICBBbiBvcHRpb25hbCBsZWFkaW5nIG51bWVyaWNhbCB2YWx1ZSwgMTEzOSBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgaW5kaWNhdGVzCi0gICAgd2hpY2ggcG9ydCB0byB1c2Ugb24gdGhlIFJlbW90ZSBzaWRlIHRvIFNTSCByZWRpcmVjdCB0byB0aGUgbG9jYWwgc2lkZS4KLSAgICBPdGhlcndpc2UgYSByYW5kb20gb25lIGlzIHRyaWVkIChhIHVuaXF1ZSBvbmUgaXMgbmVlZGVkIGZvciBlYWNoIFNNQgotICAgIHNlcnZlcjpwb3J0IGNvbWJpbmF0aW9uKS4gIEEgZml4ZWQgb25lIGlzIHByZWZlcnJlZDogY2hvb3NlIGEgZnJlZQotICAgIHJlbW90ZSBwb3J0LgotCi0gICAgVGhlIHN0YW5kYXJkIFNNQiBzZXJ2aWNlIHBvcnRzIChsb2NhbCBzaWRlKSBhcmUgNDQ1IGFuZCAxMzkuICAxMzkgaXMKLSAgICB1c2VkIGJ5IHRoaXMgYXBwbGljYXRpb24uCi0KLSAgICBTb21ldGltZXMgImxvY2FsaG9zdCIgd2lsbCBub3Qgd29yayBvbiBXaW5kb3dzIG1hY2hpbmVzIGZvciBhIHNoYXJlCi0gICAgaG9zdG5hbWUsIGFuZCB5b3Ugd2lsbCBoYXZlIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgbmV0d29yayBpbnRlcmZhY2UKLSAgICAoZS5nLiB0aGUgbWFjaGluZSdzIElQIGFkZHJlc3MpLiAgSWYgeW91IHVzZSB0aGUgbGl0ZXJhbCBzdHJpbmcgIklQIgotICAgIGl0IHdpbGwgYmUgYXR0ZW1wdGVkIHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUgbnVtZXJpY2FsIElQIGFkZHJlc3MsIGUuZy46Ci0KLSAgICAgIC8vbWFjaGluZTEvc2hhcmUgICB+L0Rlc2t0b3AvbXktbW91bnQxICAgSVAKLQotICAgIFZFUlkgSU1QT1JUQU5UOiBCZWZvcmUgdGVybWluYXRpbmcgdGhlIFZOQyBDb25uZWN0aW9uLCBtYWtlIHN1cmUgbm8KLSAgICBhcHBsaWNhdGlvbnMgYXJlIHVzaW5nIGFueSBvZiB0aGUgU01CIHNoYXJlcyAob3Igc2hlbGxzIGFyZSBjZC1lZAotICAgIGludG8gdGhlIHNoYXJlKS4gIFRoaXMgd2F5IHRoZSBzaGFyZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVubW91bnRlZC4KLSAgICBPdGhlcndpc2UgeW91IHdpbGwgbmVlZCB0byBsb2cgaW4gYWdhaW4sIHN0b3AgcHJvY2Vzc2VzIGZyb20gdXNpbmcKLSAgICB0aGUgc2hhcmUsIGJlY29tZSByb290IGFuZCB1bW91bnQgdGhlIHNoYXJlcyBtYW51YWxseSAoInNtYnVtb3VudAotICAgIC9wYXRoL3RvL3NoYXJlIiwgZXRjLikKLQotICAgIEZvciBtb3JlIGluZm8gc2VlOiBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zbWItc2hhcmVzCi19Ci0KLQlzZXQgbXNnMiB7Ci0gICAgVG8gc3BlZWQgdXAgbW92aW5nIHRvIHRoZSBuZXh0IHN0ZXAsIGljb25pZnkgdGhlIGZpcnN0IFNTSCBjb25zb2xlCi0gICAgd2hlbiB5b3UgYXJlIGRvbmUgZW50ZXJpbmcgcGFzc3dvcmRzLCBldGMuIGFuZCB0aGVuIGNsaWNrIG9uIHRoZQotICAgIG1haW4gcGFuZWwgJ1ZOQyBIb3N0OkRpc3BsYXknIGxhYmVsLgotfQotCi0JZ2xvYmFsIGlzX3dpbmRvd3MKLQlpZiB7ISAkaXNfd2luZG93c30gewotCQlyZWdzdWIgeyAqJVdJTn0gJG1zZyAiIiBtc2cKLQl9IGVsc2UgewotCQlzZXQgbXNnMiBbc3RyaW5nIHRyaW0gJG1zZzJdCi0JCXJlZ3N1YiB7IColV0lOfSAkbXNnICIgICAgJG1zZzIiIG1zZwotCX0KLQkuc21iLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWZyYW1lIC5zbWIucgotCWxhYmVsIC5zbWIuci5sIC10ZXh0ICJzbWJtb3VudCg4KSBhdXRoIG1vZGU6IiAtcmVsaWVmIHJpZGdlCi0JcmFkaW9idXR0b24gLnNtYi5yLm5vbmUgLXRleHQgIk5vbmUiIC12YXJpYWJsZSBzbWJfc3VfbW9kZSAtdmFsdWUgIm5vbmUiCi0JcmFkaW9idXR0b24gLnNtYi5yLnN1ICAgLXRleHQgInN1KDEpIiAtdmFyaWFibGUgc21iX3N1X21vZGUgLXZhbHVlICJzdSIKLQlyYWRpb2J1dHRvbiAuc21iLnIuc3VkbyAtdGV4dCAic3Vkbyg4KSIgLXZhcmlhYmxlIHNtYl9zdV9tb2RlIC12YWx1ZSAic3VkbyIKLQotCXBhY2sgLnNtYi5yLmwgLnNtYi5yLm5vbmUgLnNtYi5yLnN1ZG8gLnNtYi5yLnN1IC1zaWRlIGxlZnQgLWZpbGwgeAotCi0JbGFiZWwgLnNtYi5pbmZvIC10ZXh0ICJTdXBwbHkgdGhlIG1vdW50cyAob25lIHBlciBsaW5lKSBiZWxvdzoiIC1hbmNob3IgdyAtcmVsaWVmIHJpZGdlCi0KLQlldmFsIHRleHQgLnNtYi5tbnRzIC13aWR0aCA4MCAtaGVpZ2h0IDUgJGhlbHBfZm9udAotCS5zbWIubW50cyBpbnNlcnQgZW5kICRzbWJfbW91bnRfbGlzdAotCi0JYnV0dG9uIC5zbWIuZ3Vlc3MgLXRleHQgIkhlbHAgbWUgZGVjaWRlIC4uLiIgLWNvbW1hbmQge2Rlc3Ryb3kgLnNtYjsgc21iX2hlbHBfbWVfZGVjaWRlfQotCi0JYnV0dG9uIC5zbWIuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtzZXQgdXNlX3NtYm1udCAwOyBkZXN0cm95IC5zbWJ9Ci0JYmluZCAuc21iIDxFc2NhcGU+IHtzZXQgdXNlX3NtYm1udCAwOyBkZXN0cm95IC5zbWJ9Ci0Jd20gcHJvdG9jb2wgLnNtYiBXTV9ERUxFVEVfV0lORE9XIHtzZXQgdXNlX3NtYm1udCAwOyBkZXN0cm95IC5zbWJ9Ci0JYnV0dG9uIC5zbWIuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2lmIHskdXNlX3NtYm1udH0ge3NldF9zc2g7IHNldCBzbWJfbW91bnRfbGlzdCBbLnNtYi5tbnRzIGdldCAxLjAgZW5kXX07IGRlc3Ryb3kgLnNtYn0KLQotCXBhY2sgLnNtYi5kb25lIC5zbWIuY2FuY2VsIC5zbWIuZ3Vlc3MgLnNtYi5tbnRzIC5zbWIuaW5mbyAuc21iLnIgLXNpZGUgYm90dG9tIC1maWxsIHgKLQlwYWNrIC5zbWIuZiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCWNlbnRlcl93aW4gLnNtYgotfQotCi1wcm9jIGhlbHBfYWR2YW5jZWRfb3B0cyB7fSB7Ci0JdG9wbGV2IC5haAotCi0Jc2Nyb2xsX3RleHRfZGlzbWlzcyAuYWguZgotCi0JY2VudGVyX3dpbiAuYWgKLQotCXdtIHRpdGxlIC5haCAiQWR2YW5jZWQgT3B0aW9ucyBIZWxwIgotCi0Jc2V0IG1zZyB7Ci0gICAgVGhlc2UgQWR2YW5jZWQgT3B0aW9ucyB0aGF0IG1heSByZXF1aXJlIGV4dHJhIHNvZnR3YXJlIGluc3RhbGxlZCBvbgotICAgIHRoZSBWTkMgc2VydmVyLXNpZGUgKHRoZSByZW1vdGUgc2VydmVyIG1hY2hpbmUpIGFuZC9vciBvbiB0aGUgVk5DCi0gICAgY2xpZW50LXNpZGUgKHdoZXJlIHRoaXMgZ3VpIGlzIHJ1bm5pbmcpLgotCi0gICAgVGhlIFNlcnZpY2UgcmVkaXJlY3Rpb24gb3B0aW9ucywgQ1VQUywgRVNEL0FSVFNELCBhbmQgU01CIHdpbGwKLSAgICByZXF1aXJlIHRoYXQgeW91IHVzZSBTU0ggZm9yIHR1bm5lbGluZyBzbyB0aGF0IHRoZXkgY2FuIHVzZSB0aGUgLVIKLSAgICBwb3J0IHJlZGlyZWN0aW9uIHdpbGwgYmUgZW5hYmxlZCBmb3IgZWFjaCBzZXJ2aWNlLiAgSS5lLiAiVXNlIFNTSCIKLSAgICBvciAiU1NIICsgU1NMIiBtb2RlLgotCi0gICAgVGhlc2Ugb3B0aW9ucyBtYXkgYWxzbyByZXF1aXJlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byBnZXQgdGhlbQotICAgIHRvIHdvcmsgcHJvcGVybHkuICBQbGVhc2Ugc3VibWl0IGJ1ZyByZXBvcnRzIGlmIGl0IGFwcGVhcnMgaXQgc2hvdWxkCi0gICAgYmUgd29ya2luZyBmb3IgeW91ciBzZXR1cCBidXQgaXMgbm90LgotCi0gICAgQnJpZWYgKGFuZCBzb21lIG5vdCBzbyBicmllZikgZGVzY3JpcHRpb25zOgotCi0gICAgICBDVVBTIFByaW50IHR1bm5lbGxpbmc6Ci0KLSAgICAgICAgIFJlZGlyZWN0IGxvY2FsaG9zdDo2NjMxIChzYXkpIG9uIHRoZSBWTkMgc2VydmVyIHRvIHlvdXIgbG9jYWwKLSAgICAgICAgIENVUFMgc2VydmVyLiAgU1NIIG1vZGUgaXMgcmVxdWlyZWQuCi0KLSAgICAgIEVTRC9BUlRTRCBBdWRpbyB0dW5uZWxsaW5nOgotCi0gICAgICAgICBSZWRpcmVjdCBsb2NhbGhvc3Q6MTYwMDEgKHNheSkgb24gdGhlIFZOQyBzZXJ2ZXIgdG8geW91ciBsb2NhbAotICAgICAgICAgRVNELCBldGMuIHNvdW5kIHNlcnZlci4gIFNTSCBtb2RlIGlzIHJlcXVpcmVkLgotCi0gICAgICBTTUIgbW91bnQgdHVubmVsbGluZzoKLQotICAgICAgICAgUmVkaXJlY3QgbG9jYWxob3N0OjExMzkgKHNheSkgb24gdGhlIFZOQyBzZXJ2ZXIgYW5kIHRocm91Z2ggdGhhdAotICAgICAgICAgbW91bnQgU01CIGZpbGUgc2hhcmVzIGZyb20geW91ciBsb2NhbCBzZXJ2ZXIuICBUaGUgcmVtb3RlIG1hY2hpbmUKLSAgICAgICAgIG11c3QgYmUgTGludXggd2l0aCBzbWJtb3VudCBpbnN0YWxsZWQuIFNTSCBtb2RlIGlzIHJlcXVpcmVkLgotCi0gICAgICBBZGRpdGlvbmFsIFBvcnQgUmVkaXJzICh2aWEgU1NIKToKLQotICAgICAgICAgU3BlY2lmeSBhZGRpdGlvbmFsIC1MIHBvcnQ6aG9zdDpwb3J0IGFuZCAtUiBwb3J0Omhvc3Q6cG9ydAotICAgICAgICAgY21kbGluZSBvcHRpb25zIGZvciBTU0ggdG8gZW5hYmxlIGFkZGl0aW9uYWwgc2VydmljZXMuCi0gICAgICAgICBTU0ggbW9kZSBpcyByZXF1aXJlZC4KLQotICAgICAgQXV0b21hdGljYWxseSBGaW5kIFggTG9naW4vR3JlZXRlcjoKLQotICAgICAgICAgVGhpcyBtb2RlIGlzIHNpbWlsYXIgdG8gIkF1dG9tYXRpY2FsbHkgRmluZCBYIFNlc3Npb24iIGV4Y2VwdAotICAgICAgICAgdGhhdCBpdCB3aWxsIGF0dGFjaCB0byBhIFggTG9naW4vR3JlZXRlciBzY3JlZW4gdGhhdCBubyBvbmUKLSAgICAgICAgIGhhcyBsb2dnZWQgaW50byB5ZXQuICBJdCByZXF1aXJlcyByb290IHByaXZpbGVnZXMgdmlhIHN1ZG8oMSkKLSAgICAgICAgIG9uIHRoZSByZW1vdGUgbWFjaGluZS4gIFNTSCBtb2RlIGlzIHJlcXVpcmVkLgotCi0gICAgICAgICBBcyB3aXRoICJBdXRvbWF0aWNhbGx5IEZpbmQgWCBTZXNzaW9uIiBpdCB3b3JrcyBvbmx5IHdpdGggU1NICi0gICAgICAgICBtb2RlIGFuZCByZXF1aXJlcyB4MTF2bmMgYmUgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgY29tcHV0ZXIuCi0KLSAgICAgICAgIEl0IHNpbXBseSBzZXRzIHRoZSBSZW1vdGUgU1NIIENvbW1hbmQgdG86Ci0KLSAgICAgICAgICAgICAgUE9SVD0gc3VkbyB4MTF2bmMgLWZpbmQgLWxvY2FsaG9zdCAtZW52IEZEX1hETT0xCi0KLSAgICAgICAgIEFuIGluaXRpYWwgc3NoIHJ1bm5pbmcgJ3N1ZG8gaWQnIGlzIHBlcmZvcm1lZCB0byB0cnkgdG8KLSAgICAgICAgICdwcmltZScgc3VkbyBzbyB0aGUgMm5kIG9uZSB0aGF0IHJ1bnMgeDExdm5jIGRvZXMgbm90IG5lZWQKLSAgICAgICAgIGEgcGFzc3dvcmQuICBUaGlzIG1heSBub3QgYWx3YXlzIHN1Y2NlZWQuLi4gcGxlYXNlIG1haWwgdXMKLSAgICAgICAgIHRoZSBkZXRhaWxzIGlmIGl0IGRvZXNuJ3QuCi0KLSAgICAgICAgIFNlZSB0aGUgJ1ggTG9naW4nIGRlc2NyaXB0aW9uIGluICdUZXJtaW5hbCBTZXJ2aWNlcycgTW9kZQotICAgICAgICAgSGVscCBmb3IgbW9yZSBpbmZvLgotCi0gICAgICBQcml2YXRlIFNTSCBLbm93bkhvc3RzIGZpbGU6Ci0KLSAgICAgICAgIE9uIFVuaXggaW4gU1NIIG1vZGUsIGxldCB0aGUgdXNlciBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQKLSAgICAgICAgIHNzaCBrbm93bl9ob3N0cyBmaWxlIHRvIGJlIHVzZWQgb25seSBieSB0aGUgY3VycmVudCBwcm9maWxlLgotICAgICAgICAgVGhpcyBpcyB0aGUgVXNlcktub3duSG9zdHNGaWxlIHNzaCBvcHRpb24gYW5kIGlzIGRlc2NyaWJlZCBpbiB0aGUKLSAgICAgICAgIHNzaF9jb25maWcoMSkgbWFuIHBhZ2UuICBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBwcm94eSAnbG9jYWxob3N0JwotICAgICAgICAgU1NIIGtleSBjb2xsaXNpb25zLgotCi0gICAgICAgICBOb3JtYWxseSBvbmUgc2hvdWxkIHNpbXBseSBsZXQgc3NoIHVzZSBpdHMgZGVmYXVsdCBmaWxlCi0gICAgICAgICB+Ly5zc2gva25vd25faG9zdHMgZm9yIHRyYWNraW5nIFNTSCBrZXlzLiAgVGhlIG9ubHkgcHJvYmxlbSB0aGF0Ci0gICAgICAgICBoYXBwZW5zIGlzIHdoZW4gbXVsdGlwbGUgU1NWTkMgY29ubmVjdGlvbnMgdXNlIGxvY2FsaG9zdCB0dW5uZWwKLSAgICAgICAgIHBvcnQgcmVkaXJlY3Rpb25zLiAgVGhlc2UgbWFrZSBzc2ggY29ubmVjdCB0byAnbG9jYWxob3N0JyBvbiBzb21lCi0gICAgICAgICBwb3J0ICh3aGVyZSB0aGUgcHJveHkgaXMgbGlzdGVuaW5nLikgIFRoZW4gdGhlIGRpZmZlcmVudCBrZXlzCi0gICAgICAgICBmcm9tIHRoZSBtdWx0aXBsZSBzc2ggc2VydmVycyBjb2xsaWRlIHdoZW4gc3NoIHNhdmVzIHRoZW0gdW5kZXIKLSAgICAgICAgICdsb2NhbGhvc3QnIGluIH4vLnNzaC9rbm93bl9ob3N0cy4KLQotICAgICAgICAgU28gaWYgeW91IGFyZSB1c2luZyBhIHByb3h5IHdpdGggU1NWTkMgb3IgZG9pbmcgYSAiZG91YmxlIFNTSAotICAgICAgICAgZ2F0ZXdheSIgeW91ciBzc2ggd2lsbCBjb25uZWN0IHRvIGEgcHJveHkgcG9ydCBvbiBsb2NhbGhvc3QsIGFuZCB5b3UKLSAgICAgICAgIHNob3VsZCBzZXQgYSBwcml2YXRlIEtub3duSG9zdHMgZmlsZSBmb3IgdGhhdCBjb25uZWN0aW9uIHByb2ZpbGUuCi0gICAgICAgICBUaGlzIGlzIHNlY3VyZSBhbmQgYXZvaWRzIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFjayAoYXMgbG9uZyBhcwotICAgICAgICAgeW91IGFjdHVhbGx5IHZlcmlmeSB0aGUgaW5pdGlhbCBzYXZlIG9mIHRoZSBTU0gga2V5ISkKLQotICAgICAgICAgVGhlIGRlZmF1bHQgZmlsZSBsb2NhdGlvbiB3aWxsIGJlOgotCi0gICAgICAgICAgICAgICAgICB+Ly52bmMvc3NoX2tub3duX2hvc3RzL3Byb2ZpbGUtbmFtZS5rbm93bgotCi0gICAgICAgICBidXQgeW91IGNhbiBjaG9vc2UgYW55IHBsYWNlIHlvdSBsaWtlLiAgSXQgbXVzdCBvZiBjb3Vyc2UgYmUKLSAgICAgICAgIHVuaXF1ZSBhbmQgbm90IHNoYXJlZCB3aXRoIGFub3RoZXIgc3NoIGNvbm5lY3Rpb24gb3RoZXJ3aXNlIHRoZXkKLSAgICAgICAgIGJvdGggbWF5IGNvbXBsYWluIGFib3V0IHRoZSBrZXkgZm9yICdsb2NhbGhvc3QnIGNoYW5naW5nLCBldGMuCi0KLSAgICAgIFNTSCBMb2NhbCBQb3J0IFByb3RlY3Rpb25zOgotCi0gICAgICAgICBBbiBMRF9QUkVMT0FEIGhhY2sgdG8gbGltaXQgdGhlIG51bWJlciBvZiBTU0ggcG9ydCByZWRpcmVjdGlvbnMKLSAgICAgICAgIHRvIDEgYW5kIHdpdGhpbiB0aGUgZmlyc3QgMzUgc2Vjb25kcy4gIFNvIHRoZXJlIGlzIGEgc21hbGxlcgotICAgICAgICAgd2luZG93IHdoZW4gdGhlIHVzZXIgY2FuIHRyeSB0byB1c2UgeW91ciB0dW5uZWwgY29tcGFyZWQgdG8KLSAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiB5b3VyIHNlc3Npb24uICBTU0ggbW9kZSBpcyByZXF1aXJlZC4KLQotICAgICAgU1RVTk5FTCBMb2NhbCBQb3J0IFByb3RlY3Rpb25zOgotCi0gICAgICAgICBUcnkgdG8gcHJldmVudCBVbnRydXN0ZWQgTG9jYWwgVXNlcnMgKHNlZSB0aGUgbWFpbiBIZWxwIHBhbmVsKQotICAgICAgICAgZnJvbSB1c2luZyB5b3VyIFNUVU5ORUwgdHVubmVsIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBWTkMKLSAgICAgICAgIFNlcnZlci4KLQotICAgICAgQ2hhbmdlIFZOQyBWaWV3ZXI6Ci0KLSAgICAgICAgIFNwZWNpZnkgYSBub24tYnVuZGxlZCBWTkMgVmlld2VyIChlLmcuICBVbHRyYVZOQyBvciBSZWFsVk5DKQotICAgICAgICAgdG8gcnVuIGluc3RlYWQgb2YgdGhlIGJ1bmRsZWQgVGlnaHRWTkMgVmlld2VyLgotCi0gICAgICBQb3J0IEtub2NraW5nOgotCi0gICAgICAgICBGb3IgImNsb3NlZCBwb3J0IiBzZXJ2aWNlcywgZmlyc3QgImtub2NrIiBvbiB0aGUgZmlyZXdhbGwgcG9ydHMKLSAgICAgICAgIGluIGEgY2VydGFpbiB3YXkgdG8gb3BlbiB0aGUgZG9vciBmb3IgU1NIIG9yIFNTTC4gIFRoZSBwb3J0Ci0gICAgICAgICBjYW4gYWxzbyBiZSBjbG9zZWQgd2hlbiB0aGUgZW5jcnlwdGVkIFZOQyBjb25uZWN0aW9uIGZpbmlzaGVzLgotCi0gICAgICBVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW46Ci0KLSAgICAgICAgIE9uIFVuaXggb25seSwgYnkgdXNpbmcgdGhlIHN1cHBsaWVkIHRvb2wsIHVsdHJhdm5jX2RzbV9oZWxwZXIsCi0gICAgICAgICBlbmNyeXB0ZWQgY29ubmVjdGlvbnMgdG8gVWx0cmFWTkMgc2VydmVycyB1c2luZyB0aGVpciBwbHVnaW5zCi0gICAgICAgICBpcyBlbmFibGVkLiAgU3VwcG9ydCBmb3Igc2VjcmV0IGtleSBlbmNyeXB0aW9uIHRvIE5vbi1VbHRyYVZOQwotICAgICAgICAgRFNNIHNlcnZlcnMgaXMgYWxzbyBzdXBwb3J0ZWQsIGUuZy4geDExdm5jIC1lbmMgYmxvd2Zpc2g6bXkua2V5Ci0KLSAgICAgIERvIG5vdCBQcm9iZSBmb3IgVmVOQ3J5cHQ6Ci0KLSAgICAgICAgIERpc2FibGUgVmVOQ3J5cHQgYXV0by1kZXRlY3Rpb24gcHJvYmUgd2hlbiBub3QgbmVlZGVkLgotCi0gICAgICAgICBCeSBkZWZhdWx0IGluIFNTTCBtb2RlIGFuIGluaXRpYWwgcHJvYmUgZm9yIHRoZSB1c2Ugb2YgdGhlCi0gICAgICAgICBWZU5DcnlwdCBvciBBTk9OVExTIHByb3RvY29sIGlzIHBlcmZvcm1lZC4gIFRoaXMgaXMgZG9uZQotICAgICAgICAgZHVyaW5nIHRoZSBpbml0aWFsIGZldGNoLWNlcnQgYWN0aW9uLiAgT25jZSBhdXRvLWRldGVjdGVkIGluCi0gICAgICAgICB0aGUgaW5pdGlhbCBwcm9iZSwgdGhlIHJlYWwgY29ubmVjdGlvbiB0byB0aGUgVk5DIFNlcnZlciB3aWxsCi0gICAgICAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBzd2l0Y2ggdG8gU1NML1RMUyBhdCB0aGUgcmlnaHQgcG9pbnQgaW4KLSAgICAgICAgIHRoZSBWZU5DcnlwdC9BTk9OVExTIGhhbmRzaGFrZS4KLQotICAgICAgICAgSW4gIlZlcmlmeSBBbGwgQ2VydHMiIG1vZGUgaW5pdGlhbCB0aGUgZmV0Y2gtY2VydCBhY3Rpb24gaXMKLSAgICAgICAgIHJlcXVpcmVkIHNvIHRoZSBhdXRvbWF0aWMgcHJvYmluZyBmb3IgVmVOQ3J5cHQgaXMgYWx3YXlzIGRvbmUuCi0gICAgICAgICBUaGUgZmV0Y2gtY2VydCBpcyBub3QgbmVlZGVkIGlmIHlvdSBzcGVjaWZpZWQgYSBTZXJ2ZXJDZXJ0IG9yIGlmCi0gICAgICAgICB5b3UgZGlzYWJsZWQgIlZlcmlmeSBBbGwgQ2VydHMiLiAgQnV0IGJ5IGRlZmF1bHQgdGhlIGZldGNoLWNlcnQKLSAgICAgICAgIGlzIGRvbmUgYW55d2F5IHRvIHRyeSB0byBhdXRvLWRldGVjdCBWZU5DcnlwdC9BTk9OVExTLgotCi0gICAgICAgICBTZXQgJ0RvIG5vdCBQcm9iZSBmb3IgVmVOQ3J5cHQnIHRvIHNraXAgdGhpcyB1bm5lZWRlZCBmZXRjaC1jZXJ0Ci0gICAgICAgICBhY3Rpb24gKGFuZCBoZW5jZSBzcGVlZCB1cCBjb25uZWN0aW5nLikgIFVzZSB0aGlzIGlmIHlvdQotICAgICAgICAga25vdyB0aGUgVk5DIFNlcnZlciB1c2VzIG5vcm1hbCBTU0wgYW5kIG5vdCBWZU5DcnlwdC9BTk9OVExTLgotCi0gICAgICAgICBTZWUgYWxzbyB0aGUgbmV4dCBvcHRpb24sICdTZXJ2ZXIgdXNlcyBWZU5DcnlwdCBTU0wgZW5jcnlwdGlvbicKLSAgICAgICAgIHRvIGlmIHlvdSBrbm93IGl0IHVzZXMgVmVOQ3J5cHQvQU5PTlRMUyAodGhlIHByb2Jpbmcgd2lsbCBhbHNvCi0gICAgICAgICBiZSBza2lwcGVkIGlmIHRoYXQgb3B0aW9uIGlzIHNldC4pCi0gICAgICAgICAKLSAgICAgIFNlcnZlciB1c2VzIFZlTkNyeXB0IFNTTCBlbmNyeXB0aW9uOgotCi0gICAgICAgICBJbmRpY2F0ZSB0aGF0IHRoZSBWTkMgc2VydmVyIHVzZXMgdGhlIFZlTkNyeXB0IGV4dGVuc2lvbiB0byBWTkM7Ci0gICAgICAgICBpdCBzd2l0Y2hlcyB0byBhbiBTU0wvVExTIHR1bm5lbCBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGhlCi0gICAgICAgICBWTkMgSGFuZHNoYWtlLiAgVGhpcyBpcyBpbiBjb25zdHJhc3QgdG8gdGhlIGRlZmF1bHQgc3N2bmMveDExdm5jCi0gICAgICAgICBTU0wgdHVubmVsIGJlaGF2aW9yIHdoZXJlIHRoZSAqZW50aXJlKiBWTkMgdHJhZmZpYyBnb2VzIHRocm91Z2gKLSAgICAgICAgIFNTTCAoaS5lLiBpdCBpcyB2bmNzOi8vIGluIHRoZSB3YXkgaHR0cHM6Ly8gdXNlcyBTU0wpCi0KLSAgICAgICAgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Uga25vdyB0aGUgc2VydmVyIHN1cHBvcnRzIFZlTkNyeXB0LgotICAgICAgICAgQWxzbyB1c2UgdGhpcyBvcHRpb24gZm9yIHRoZSBvbGRlciBBTk9OVExTIGV4dGVuc2lvbiAodmlubykuCi0gICAgICAgICBEb2luZyBzbyB3aWxsIGdpdmUgdGhlIHF1aWNrZXN0IGFuZCBtb3N0IHJlbGlhYmxlIGNvbm5lY3Rpb24KLSAgICAgICAgIHRvIFZlTkNyeXB0L0FOT05UTFMgc2VydmVycy4gIElmIHNldCwgYW55IHByb2JpbmcgdG8gdHJ5IHRvCi0gICAgICAgICBhdXRvLWRldGVjdCBWZU5DcnlwdC9BTk9OVExTIHdpbGwgYmUgc2tpcHBlZC4KLQotICAgICAgICAgU29tZSBWTkMgc2VydmVycyBzdXBwb3J0aW5nIFZlTkNyeXB0OiBWZU5DcnlwdCwgUUVNVSwgZ2dpLAotICAgICAgICAgdmlydC1tYW5hZ2VyLCBhbmQgWGVuLiAgVmlubyBzdXBwb3J0cyBBTk9OVExTLgotCi0gICAgICAgICBUaGUgU1NWTkMgVmVOQ3J5cHQvQU5PTlRMUyBzdXBwb3J0IGV2ZW4gd29ya3Mgd2l0aCAzcmQgcGFydHkKLSAgICAgICAgIFZOQyBWaWV3ZXJzIHlvdSBzcGVjaWZ5IHZpYSAnQ2hhbmdlIFZOQyBWaWV3ZXInIChlLmcuIFJlYWxWTkMsCi0gICAgICAgICBUaWdodFZOQywgVWx0cmFWTkMgZXRjLikgdGhhdCBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpdC4KLQotICAgICAgICAgTm90ZTogbWFueSBWZU5DcnlwdCBzZXJ2ZXJzIG9ubHkgc3VwcG9ydCBBbm9ueW1vdXMgRGlmZmllIEhlbGxtYW4KLSAgICAgICAgIFRMUyB3aGljaCBoYXMgTk8gYnVpbHQgaW4gYXV0aGVudGljYXRpb24gYW5kIHlvdSB3aWxsIGFsc28gbmVlZAotICAgICAgICAgdG8gc2V0IHRoZSBvcHRpb24gZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCi0KLSAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgVmVOQ3J5cHQgb3IgQU5PTlRMUyBmb3IgUkVWRVJTRSBjb25uZWN0aW9ucwotICAgICAgICAgKExpc3RlbikgdGhlbiB5b3UgKk1VU1QqIHNldCB0aGlzICdTZXJ2ZXIgdXNlcyBWZU5DcnlwdCBTU0wKLSAgICAgICAgIGVuY3J5cHRpb24nIG9wdGlvbi4gICBOb3RlIGFsc28gdGhhdCBSRVZFUlNFIGNvbm5lY3Rpb25zIHVzaW5nCi0gICAgICAgICBWZU5DcnlwdC9BTk9OVExTIGN1cnJlbnRseSBkbyBub3Qgd29yayBvbiBXaW5kb3dzLgotCi0gICAgICAgICBBbHNvLCBpZiB5b3UgYXJlIHVzaW5nIHRoZSAiVXNlIFNTSCtTU0wiIGRvdWJsZSB0dW5uZWwgdG8gYQotICAgICAgICAgVmVOQ3J5cHQvQU5PTlRMUyBzZXJ2ZXIsIHlvdSBNVVNUIHNldCAnU2VydmVyIHVzZXMgVmVOQ3J5cHQKLSAgICAgICAgIFNTTCBlbmNyeXB0aW9uJyBiZWNhdXNlICJWZXJpZnkgQWxsIENlcnRzIiBpcyBkaXNhYmxlZCBpbgotICAgICAgICAgU1NIK1NTTCBtb2RlLgotCi0gICAgICBTZXJ2ZXIgdXNlcyBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4KLQotICAgICAgICAgQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIGNhbiBiZSB1c2VkIGZvciBTU0wvVExTIGNvbm5lY3Rpb25zIGJ1dAotICAgICAgICAgdGhlcmUgYXJlIG5vIENlcnRpZmljYXRlcyBmb3IgYXV0aGVudGljYXRpb24uICBUaGVyZWZvcmUgb25seQotICAgICAgICAgcGFzc2l2ZSBlYXZlc2Ryb3BwaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZCwgbm90IE1hbi1Jbi1UaGUtTWlkZGxlCi0gICAgICAgICBhdHRhY2tzLiAgTm90IHJlY29tbWVuZGVkOyB0cnkgdG8gdXNlIHZlcmlmaWVkIFg1MDkgY2VydHMgaW5zdGVhZC4KLQotICAgICAgICAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSBrbm93IHRoZSBzZXJ2ZXIgb25seSBzdXBwb3J0cyBBbm9uIERILgotICAgICAgICAgV2hlbiB5b3UgZG8gc28sIHJlbWVtYmVyIHRoYXQgQUxMIENlcnRpZmljYXRlIGNoZWNraW5nIHdpbGwgYmUKLSAgICAgICAgIHNraXBwZWQgKGV2ZW4gaWYgeW91IGhhdmUgJ1ZlcmlmeSBBbGwgQ2VydHMnIHNlbGVjdGVkIG9yIHNldAotICAgICAgICAgYSBTZXJ2ZXJDZXJ0LikKLQotICAgICAgICAgU1NWTkMgbWF5IGJlIGFibGUgdG8gYXV0b2RldGVjdCBBbm9uIERIIGV2ZW4gaWYgeW91IGhhdmVuJ3QKLSAgICAgICAgIHNlbGVjdGVkICdTZXJ2ZXIgdXNlcyBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4nLiBPbmNlIGRldGVjdGVkLCBpdAotICAgICAgICAgd2lsbCBwcm9tcHQgeW91IHdoZXRoZXIgaXQgc2hvdWxkIGNvbnRpbnVlLiAgU2V0IHRoZSAnU2VydmVyIHVzZXMKLSAgICAgICAgIEFub255bW91cyBEaWZmaWUtSGVsbG1hbicgb3B0aW9uIHRvIGF2b2lkIHRyeWluZyBhdXRvZGV0ZWN0aW9uCi0gICAgICAgICAoaS5lLiBmb3JjaW5nIHRoZSBpc3N1ZS4pCi0KLSAgICAgICAgIE5vdGUgdGhhdCBtb3N0IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBWTkMgU2VydmVycyBkbyBzbwotICAgICAgICAgdmlhIHRoZSBWZU5DcnlwdCBvciBBTk9OVExTIFZOQyBleHRlbnNpb25zIChzZWUgdGhlIHByZXZpb3VzCi0gICAgICAgICBzZWN0aW9uLikgIEZvciB0aGVzZSBzZXJ2ZXJzIGlmIHlvdSBzZWxlY3QgJ1NlcnZlciB1c2VzIEFub255bW91cwotICAgICAgICAgRGlmZmllLUhlbGxtYW4nIHlvdSAqTVVTVCogQUxTTyBzZWxlY3QgJ1NlcnZlciB1c2VzIFZlTkNyeXB0IFNTTAotICAgICAgICAgZW5jcnlwdGlvbicsIG90aGVyd2lzZSBTU1ZOQyBtYXkgaGF2ZSBubyBjaGFuY2UgdG8gYXV0by1kZXRlY3QKLSAgICAgICAgIHRoZSBWZU5DcnlwdC9BTk9OVExTIHByb3RvY29sLgotCi0gICAgICAgICBBbHNvIG5vdGUsIGlmIHlvdSBhcmUgdXNpbmcgdGhlICJVc2UgU1NIK1NTTCIgZG91YmxlIHR1bm5lbCB0bwotICAgICAgICAgYSBWZU5DcnlwdC9BTk9OVExTIHNlcnZlciB1c2luZyBBbm9uIERIIHlvdSBNVVNUIHNldCAnU2VydmVyCi0gICAgICAgICB1c2VzIEFub255bW91cyBEaWZmaWUtSGVsbG1hbicgYmVjYXVzZSAiVmVyaWZ5IEFsbCBDZXJ0cyIKLSAgICAgICAgIGlzIGRpc2FibGVkIGluIFNTSCtTU0wgbW9kZS4KLQotICAgICAgSW5jbHVkZToKLQotICAgICAgIERlZmF1bHQgc2V0dGluZ3MgYW5kIEluY2x1ZGUgVGVtcGxhdGVzOgotCi0gICAgICAgICBCZWZvcmUgZXhwbGFpbmluZyBob3cgSW5jbHVkZSB3b3JrcywgZmlyc3Qgbm90ZSB0aGF0IGlmIHlvdQotICAgICAgICAgZG8gbm90IHByZWZlciBzb21lIG9mIFNTVk5DJ3MgZGVmYXVsdCBzZXR0aW5ncyB5b3UgY2FuIHN0YXJ0Ci0gICAgICAgICB1cCBTU1ZOQyBhbmQgdGhlbiBjaGFuZ2UgdGhlIHNldHRpbmdzIGZvciB0aGUgb3B0aW9ucyB0aGF0IHlvdQotICAgICAgICAgd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWUuICBUaGVuIHR5cGUgImRlZmF1bHRzIgotICAgICAgICAgaW4gVk5DIEhvc3Q6RGlzcGxheSBlbnRyeSBib3ggYW5kIHByZXNzICJTYXZlIiB0byBzYXZlIHRoZW0gaW4KLSAgICAgICAgIHRoZSAiZGVmYXVsdHMudm5jIiBwcm9maWxlLiAgQWZ0ZXIgdGhpcywgU1NWTkMgd2lsbCBpbml0aWFsaXplCi0gICAgICAgICBhbGwgb2YgdGhlIGRlZmF1bHQgdmFsdWVzIGFuZCB0aGVuIGFwcGx5IHlvdXIgb3ZlcnJpZGUgdmFsdWVzCi0gICAgICAgICBpbiAiZGVmYXVsdHMiLgotCi0gICAgICAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgYWx3YXlzIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50LCAzcmQKLSAgICAgICAgIHBhcnR5IFZOQyBWaWV3ZXIuICBTZXQgT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBDaGFuZ2UgVk5DIFZpZXdlcgotICAgICAgICAgdG8gd2hhdCB5b3Ugd2FudCwgYW5kIHRoZW4gc2F2ZSBpdCBhcyB0aGUgImRlZmF1bHRzIiBwcm9maWxlLgotICAgICAgICAgTm93IHRoYXQgZGVmYXVsdCBzZXR0aW5nIHdpbGwgYXBwbHkgdG8gYWxsIHByb2ZpbGVzLCBhbmQgU1NWTkMKLSAgICAgICAgIGluIGl0cyBzdGFydHVwIHN0YXRlLgotCi0gICAgICAgICBUbyBlZGl0IHRoZSBkZWZhdWx0cyBMb2FkIGl0LCBtYWtlIGNoYW5nZXMsIGFuZCB0aGVuIFNhdmUgaXQuCi0gICAgICAgICBEZWxldGUgdGhlICJkZWZhdWx0cyIgcHJvZmlsZSB0byBnbyBiYWNrIHRvIG5vIG1vZGlmaWNhdGlvbnMuCi0gICAgICAgICBOb3RlIHRoYXQgZGVmYXVsdHMgY3JlYXRlZCBhbmQgc2F2ZWQgd2hpbGUgZGVmYXVsdHMudm5jIGV4aXN0ZWQKLSAgICAgICAgIHdpbGwgTk9UIGJlIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQuCi0KLSAgICAgICBJbmNsdWRlIFRlbXBsYXRlczoKLQotICAgICAgICAgTm93IHN1cHBvc2UgeW91IGhhdmUgYSBjZXJ0YWluIGNsYXNzIG9mIHNldHRpbmdzIHRoYXQgeW91IGRvCi0gICAgICAgICBub3Qgd2FudCB0byBhbHdheXMgYmUgYXBwbGllZCwgYnV0IHlvdSB3YW50IHRoZW0gdG8gYXBwbHkgdG8gYQotICAgICAgICAgZ3JvdXAgb2YgcHJvZmlsZXMuCi0KLSAgICAgICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIHNvbWUgc2V0dGluZ3MgZm9yIHZlcnkgbG93Ci0gICAgICAgICBiYW5kd2lkdGggY29ubmVjdGlvbnMgKGUuZy4gbG93IGNvbG9yIG1vZGVzIGFuZC9vciBhZ2dyZXNzaXZlCi0gICAgICAgICBjb21wcmVzc2lvbiBhbmQgcXVhbGl0eSBzZXR0aW5ncy4pICBTZXQgdGhlc2UgdmFsdWVzIGluIFNTVk5DCi0gICAgICAgICBhbmQgdGhlbiBpbiB0aGUgVk5DIEhvc3Q6RGlzcGxheSBlbnRyeSBib3ggdHlwZSBpbiwgc2F5LAotICAgICAgICAgInNsb3dsaW5rIiBhbmQgdGhlbiBwcmVzcyBTYXZlLiAgVGhpcyB3aWxsIHNhdmUgdGhvc2Ugc2V0dGluZ3MKLSAgICAgICAgIGluIHRoZSB0ZW1wbGF0ZSBwcm9maWxlIG5hbWVkICJzbG93bGluay52bmMiLgotCi0gICAgICAgICBOb3cgdG8gY3JlYXRlIGEgcmVhbCBwcm9maWxlIHRoYXQgdXNlcyB0aGlzIHRlbXBsYXRlIHR5cGUgdGhlCi0gICAgICAgICBob3N0OmRpc3AgaW4gIlZOQyBIb3N0OkRpc3BsYXkiIGFuZCBpbiBPcHRpb25zIC0+IEFkdmFuY2VkCi0gICAgICAgICAtPiBJbmNsdWRlcyB0eXBlIGluICJzbG93bGluayIuICBUaGVuIHByZXNzIFNhdmUgdG8gc2F2ZSB0aGUKLSAgICAgICAgIGhvc3QgcHJvZmlsZS4gIFRoZW4gcmUtTG9hZCBpdC4gIFRoZSAic2xvd2xpbmsiIHNldHRpbmdzIHdpbGwKLSAgICAgICAgIGJlIGFwcGxpZWQgYWZ0ZXIgdGhlIGRlZmF1bHRzLiAgTWFrZSBhbnkgb3RoZXIgY2hhbmdlcyB0byB0aGUKLSAgICAgICAgIHNldHRpbmcgZm9yIHRoaXMgcHJvZmlsZSBhbmQgU2F2ZSBpdCBhZ2Fpbi4gIE5leHQgdGltZSB5b3UgbG9hZAotICAgICAgICAgaXQgaW4sIHRoZSBJbmNsdWRlIHRlbXBsYXRlIHNldHRpbmdzIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCi0gICAgICAgICBhbmQgdGhlbiB0aGUgcHJvZmlsZSBpdHNlbGYgaXMgcmVhZCBpbi4KLQotICAgICAgICAgWW91IG1heSBzdXBwbHkgYSBjb21tYSBvciBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0ZW1wbGF0ZXMKLSAgICAgICAgIHRvIGluY2x1ZGUuICBUaGV5IGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQuICBUaGV5IGNhbiBiZQotICAgICAgICAgZnVsbCBwYXRoIG5hbWVzIG9yIGJhc2VuYW1lcyByZWxhdGl2ZSB0byB0aGUgcHJvZmlsZXMgZGlyZWN0b3J5LgotICAgICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIHN1cHBseSB0aGUgLnZuYyBzdWZmaXguICBUaGUgbm9uLWRlZmF1bHQKLSAgICAgICAgIHNldHRpbmdzIGluIHRoZW0gd2lsbCBiZSBhcHBsaWVkIGZpcnN0LCBhbmQgdGhlbiBhbnkgdmFsdWVzIGluCi0gICAgICAgICB0aGUgbG9hZGVkIFByb2ZpbGUgd2lsbCBvdmVycmlkZSB0aGVtLgotCi0gICAgICBTbGVlcDoKLQotICAgICAgICAgRW50ZXIgYSBudW1iZXIgdG8gaW5kaWNhdGUgaG93IG1hbnkgZXh0cmEgc2Vjb25kcyB0byBzbGVlcAotICAgICAgICAgd2hpbGUgd2FpdGluZyBmb3IgdGhlIFZOQyB2aWV3ZXIgdG8gc3RhcnQgdXAuICBPbiBXaW5kb3dzIHRoaXMKLSAgICAgICAgIGNhbiBnaXZlIGV4dHJhIHRpbWUgdG8gZW50ZXIgdGhlIFB1dHR5L1BsaW5rIHBhc3N3b3JkLCBldGMuCi0KLSAgICAgIFB1dHR5IEFyZ3M6Ci0KLSAgICAgICAgIFdpbmRvd3Mgb25seSwgc3VwcGx5IGEgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIGFsbCBwbGluay5leGUKLSAgICAgICAgIGFuZCBwdXR0eS5leGUgY29tbWFuZHMuICBFeGFtcGxlOiAtaSBDOlxteWtleS5wcGsKLQotICAgICAgTGF1bmNoIFB1dHR5IFBhZ2VudDoKLQotICAgICAgICAgV2luZG93cyBvbmx5LCBsYXVuY2ggdGhlIFB1dHR5IGtleSBhZ2VudCB0b29sIChwYWdlYW50KSB0byBob2xkCi0gICAgICAgICB5b3VyIFNTSCBwcml2YXRlIGtleXMgZm9yIGF1dG9tYXRpYyBsb2dnaW5nIGluIGJ5IHB1dHR5L3BsaW5rLgotCi0gICAgICBMYXVuY2ggUHV0dHkgS2V5LUdlbjoKLQotICAgICAgICAgV2luZG93cyBvbmx5LCBsYXVuY2ggdGhlIFB1dHR5IGtleSBnZW5lcmF0aW9uIHRvb2wgKHB1dHR5Z2VuKQotICAgICAgICAgdG8gY3JlYXRlIG5ldyBTU0ggcHJpdmF0ZSBrZXlzLgotCi0gICAgICBVbml4IHNzdm5jdmlld2VyOgotCi0gICAgICAgICBEaXNwbGF5IGEgcG9wdXAgbWVudSB3aXRoIG9wdGlvbnMgdGhhdCBhcHBseSB0byB0aGUgc3BlY2lhbCAKLSAgICAgICAgIFVuaXggU1NWTkMgVk5DIFZpZXdlciAocGVyaGFwcyBjYWxsZWQgJ3Nzdm5jdmlld2VyJykgcHJvdmlkZWQgYnkKLSAgICAgICAgIHRoaXMgU1NWTkMgcGFja2FnZS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIFVuaXggb3IgTWFjIE9TIFguCi0gICAgIAotICAgICAgVXNlIHNzaC1hZ2VudDoKLQotICAgICAgICAgT24gVW5peCBvbmx5OiByZXN0YXJ0IHRoZSBHVUkgaW4gdGhlIHByZXNlbmNlIG9mIHNzaC1hZ2VudCgxKQotICAgICAgICAgKGUuZy4gaW4gY2FzZSB5b3UgZm9yZ290IHRvIHN0YXJ0IHlvdXIgYWdlbnQgYmVmb3JlIHN0YXJ0aW5nCi0gICAgICAgICB0aGlzIEdVSSkuICBBbiB4dGVybSB3aWxsIGJlIHVzZWQgdG8gZW50ZXIgcGFzc3BocmFzZXMsIGV0Yy4KLSAgICAgICAgIFRoaXMgY2FuIGF2b2lkIHJlcGVhdGVkbHkgZW50ZXJpbmcgcGFzc3BocmFzZXMgZm9yIHRoZSBTU0ggbG9naW5zCi0gICAgICAgICAobm90ZSB0aGlzIHJlcXVpcmVzIHNldHRpbmcgdXAgYW5kIGRpc3RyaWJ1dGluZyBTU0gga2V5cykuCi0KLQotICAgIEFib3V0IHRoZSBDaGVja0J1dHRvbnM6Ci0KLSAgICAgICAgIEFoZW0sIFdlbGwuLi4uLCB5ZXMgcXVpdGUgYSBrbHVua3kgVUk6IHlvdSBoYXZlIHRvIHRvZ2dsZSB0aGUKLSAgICAgICAgIENoZWNrQnV0dG9uIHRvIHB1bGwgdXAgdGhlIERpYWxvZyBib3ggYSAybmQsIGV0Yy4gdGltZS4uLiBkb24ndAotICAgICAgICAgd29ycnkgeW91ciBzZXR0aW5ncyB3aWxsIHN0aWxsIGJlIHRoZXJlIQotfQotCi0JLmFoLmYudCBpbnNlcnQgZW5kICRtc2cKLQlqaWdnbGVfdGV4dCAuYWguZi50Ci19Ci0KLXByb2MgaGVscF9zc3ZuY3ZpZXdlcl9vcHRzIHt9IHsKLQl0b3BsZXYgLmF2Ci0KLQlzY3JvbGxfdGV4dF9kaXNtaXNzIC5hdi5mCi0KLQljZW50ZXJfd2luIC5hdgotCi0Jd20gdGl0bGUgLmF2ICJVbml4IFNTVk5DIHZpZXdlciBPcHRpb25zIEhlbHAiCi0KLQlzZXQgbXNnIHsKLSAgICBUaGVzZSBVbml4IFNTVk5DIFZOQyBWaWV3ZXIgT3B0aW9ucyBhcHBseSBvbmx5IG9uIFVuaXggb3IgTWFjIE9TIFgKLSAgICB3aGVuIHVzaW5nIHRoZSB2aWV3ZXIgKHNzdm5jdmlld2VyKSBzdXBwbGllZCBieSB0aGlzIFNTVk5DIHBhY2thZ2UuCi0KLSAgICBCcmllZiBkZXNjcmlwdGlvbnM6Ci0KLSAgICAgIE11bHRpcGxlIExJU1RFTiBDb25uZWN0aW9uczoKLQotICAgICAgICAgQWxsb3cgbXVsdGlwbGUgVk5DIHNlcnZlcnMgdG8gcmV2ZXJzZSBjb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgIGFuZCBzbyBkaXNwbGF5IGVhY2ggb2YgdGhlaXIgZGVza3RvcHMgb24geW91ciBzY3JlZW4gYXQgdGhlCi0gICAgICAgICBzYW1lIHRpbWUuCi0KLSAgICAgIExpc3RlbiBPbmNlOgotCi0gICAgICAgICBUcnkgdG8gaGF2ZSB0aGUgVk5DIFZpZXdlciBleGl0IGFmdGVyIHRoZSBmaXJzdCBsaXN0ZW5pbmcKLSAgICAgICAgIGNvbm5lY3Rpb24uIChJdCBtYXkgbm90IGFsd2F5cyBiZSBkZXRlY3RlZDsgdXNlIEN0cmwtQyB0byBleGl0KQotCi0gICAgICBMaXN0ZW4gQWNjZXB0IFBvcHVwIERpYWxvZzoKLQotICAgICAgICAgSW4gLWxpc3RlbiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgbW9kZSB3aGVuIGEgcmV2ZXJzZQotICAgICAgICAgVk5DIGNvbm5lY3Rpb24gY29tZXMgaW4gc2hvdyBhIHBvcHVwIGFza2luZyB3aGV0aGVyIHRvIEFjY2VwdAotICAgICAgICAgb3IgUmVqZWN0IHRoZSBjb25uZWN0aW9uLiAoLWFjY2VwdHBvcHVwIHZuY3ZpZXdlciBvcHRpb24uKQotCi0gICAgICBBY2NlcHQgUG9wdXAgVWx0cmFWTkMgU2luZ2xlIENsaWNrOgotCi0gICAgICAgICBBcyBpbiAnTGlzdGVuIEFjY2VwdCBQb3B1cCBEaWFsb2cnLCBleGNlcHQgYXNzdW1lIHRoZSByZW1vdGUKLSAgICAgICAgIFZOQyBzZXJ2ZXIgaXMgVWx0cmFWTkMgU2luZ2xlIENsaWNrIGFuZCBmb3JjZSB0aGUgZXhlY3V0aW9uIG9mCi0gICAgICAgICB0aGUgcHJvdG9jb2wgdG8gcmV0cmlldmUgdGhlIGV4dHJhIHJlbW90ZS1zaWRlIGluZm8gKFdpbmRvd3MKLSAgICAgICAgIFVzZXIsIENvbXB1dGVyTmFtZSwgZXRjKSB3aGljaCBpcyB0aGVuIGFsc28gZGlzcGxheWVkIGluIHRoZQotICAgICAgICAgUG9wdXAgd2luZG93LiAoLWFjY2VwdHBvcHVwc2Mgdm5jdmlld2VyIG9wdGlvbi4pCi0KLSAgICAgIFVzZSBYMTEgQ3Vyc29yOgotCi0gICAgICAgICBXaGVuIGRyYXdpbmcgdGhlIG1vdXNlIGN1cnNvciBzaGFwZSBsb2NhbGx5LCB1c2UgYW4gWDExIGN1cnNvcgotICAgICAgICAgaW5zdGVhZCBvZiBkcmF3aW5nIGl0IGRpcmVjdGx5IGludG8gdGhlIGZyYW1lYnVmZmVyLiAgVGhpcwotICAgICAgICAgY2FuIHNvbWV0aW1lcyBnaXZlIGJldHRlciByZXNwb25zZSwgYW5kIGF2b2lkIHByb2JsZW1zIHVuZGVyCi0gICAgICAgICAnU2NhbGluZycuIAotCi0gICAgICBEaXNhYmxlIEJlbGw6Ci0KLSAgICAgICAgIERpc2FibGUgYmVlcHMgY29taW5nIGZyb20gcmVtb3RlIHNpZGUuCi0KLSAgICAgIFVzZSBSYXcgTG9jYWw6Ci0KLSAgICAgICAgIFVzZSB0aGUgVk5DIFJhdyBlbmNvZGluZyBmb3IgJ2xvY2FsaG9zdCcgY29ubmVjdGlvbnMgKGluc3RlYWQKLSAgICAgICAgIG9mIGFzc3VtaW5nIHRoZXJlIGlzIGEgbG9jYWwgdHVubmVsLCBTU0wgb3IgU1NILCBnb2luZyB0byB0aGUKLSAgICAgICAgIHJlbW90ZSBtYWNoaW5lLgotCi0gICAgICBBdm9pZCBVc2luZyBUZXJtaW5hbDoKLQotICAgICAgICAgQnkgZGVmYXVsdCB0aGUgVW5peCBzc3ZuY3ZpZXdlciB3aWxsIHByb21wdCBmb3IgdXNlcm5hbWVzLAotICAgICAgICAgcGFzc3dvcmRzLCBldGMuIGluIHRoZSB0ZXJtaW5hbCBpdCBpcyBydW5uaW5nIGluc2lkZSBvZi4KLSAgICAgICAgIFNldCB0aGlzIG9wdGlvbiB0byB1c2Ugd2luZG93cyBmb3IgbWVzc2FnZXMgYW5kIHByb21wdGluZyBhcwotICAgICAgICAgbXVjaCBhcyBwb3NzaWJsZS4gIE1lc3NhZ2VzIHdpbGwgYWxzbyBnbyB0byB0aGUgdGVybWluYWwsIGJ1dAotICAgICAgICAgYWxsIHByb21wdHMgd2lsbCBiZSBkb25lIHZpYSBwb3B1cCB3aW5kb3cuCi0KLSAgICAgICAgIE5vdGUgdGhhdCBzdHVubmVsKDEpIG1heSBwcm9tcHQgZm9yIGEgcGFzc3BocmFzZSB0byB1bmxvY2sgYQotICAgICAgICAgcHJpdmF0ZSBTU0wga2V5LiAgVGhpcyBpcyBmYWlybHkgcmFyZSBiZWNhdXNlIGl0IGlzIHVzdWFsbHkKLSAgICAgICAgIGZvciBDbGllbnQtc2lkZSBTU0wgYXV0aGVudGljYXRpb24uICBzdHVubmVsIHdpbGwgcHJvbXB0IGZyb20KLSAgICAgICAgIHRoZSB0ZXJtaW5hbDsgdGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IGFyb3VuZCB0aGlzLgotCi0gICAgICAgICBBbHNvLCBub3RlIHRoYXQgc3NoKDEpIG1heSBwcm9tcHQgZm9yIGFuIHNzaCBrZXkgcGFzc3BocmFzZQotICAgICAgICAgb3IgVW5peCBwYXNzd29yZC4gIFRoaXMgY2FuIGJlIGF2b2lkZWQgaW4gYSBudW1iZXIgb2Ygd2F5cywKLSAgICAgICAgIHRoZSBzaW1wbGVzdCBvbmUgaXMgdG8gdXNlIHNzaC1hZ2VudCgxKSBhbmQgc3NoLWFkZCgxKS4KLSAgICAgICAgIEhvd2V2ZXIgc3NoKDEpIG1heSBhbHNvIHByb21wdCB5b3UgdG8gYWNjZXB0IGEgbmV3IHB1YmxpYyBrZXkKLSAgICAgICAgIGZvciBhIGhvc3Qgb3Igd2FybiB5b3UgaWYgdGhlIGtleSBoYXMgY2hhbmdlZCwgZXRjLiAKLQotICAgICAgVXNlIFBvcHVwIEZpeDoKLQotICAgICAgICAgRW5hYmxlIGEgZml4IHRoYXQgd2FycHMgdGhlIHBvcHVwIChGOCkgdG8gdGhlIG1vdXNlIHBvaW50ZXIuCi0KLSAgICAgIFVzZSBYR3JhYlNlcnZlciAoZm9yIGZ1bGxzY3JlZW4pOgotCi0gICAgICAgICBPbiBVbml4IG9ubHksIHVzZSB0aGUgWEdyYWJTZXJ2ZXIgd29ya2Fyb3VuZCBmb3Igb2xkZXIgd2luZG93Ci0gICAgICAgICBtYW5hZ2Vycy4gIFNvbWV0aW1lcyBhbHNvIG5lZWRlZCBvbiByZWNlbnQgKDIwMDgpIEdOT01FLiAgVGhpcwotICAgICAgICAgd29ya2Fyb3VuZCBjYW4gbWFrZSBnb2luZyBpbnRvL291dC1vZiBGdWxsc2NyZWVuIHdvcmsgYmV0dGVyLgotCi0gICAgICBDdXJzb3IgQWxwaGFibGVuZGluZzoKLQotICAgICAgICAgVXNlIHRoZSB4MTF2bmMgYWxwaGEgaGFjayBmb3IgdHJhbnNsdWNlbnQgY3Vyc29ycyAocmVxdWlyZXMgVW5peCwKLSAgICAgICAgIDMyYnBwIGFuZCBzYW1lIGVuZGlhbm5lc3MpCi0KLSAgICAgIFR1cmJvVk5DOgotCi0gICAgICAgICBJZiBhdmFpbGFibGUgb24geW91ciBwbGF0Zm9ybSwgdXNlIGEgc3N2bmN2aWV3ZXIgY29tcGlsZWQgd2l0aAotICAgICAgICAgVHVyYm9WTkMgc3VwcG9ydC4gIFRoaXMgaXMgYmFzZWQgb24gdGhlIFZpcnR1YWxHTCBwcm9qZWN0OgotICAgICAgICAgaHR0cDovL3d3dy5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdmlydHVhbGdsCVlvdSB3aWxsIG5lZWQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFZpcnR1YWxHTCdzIFR1cmJvSlBFRyBsaWJyYXJ5IHRvby4KLQotICAgICAgICAgQ3VycmVudGx5IChNYXkvMjAwOSkgb25seSBMaW51eC5pNjg2LCBMaW51eC54ODZfNjQsIGFuZAotICAgICAgICAgRGFyd2luLmkzODYgaGF2ZSB2bmN2aWV3ZXIudHVyYm92bmMgYmluYXJpZXMgc2hpcHBlZCBpbiB0aGUKLSAgICAgICAgIHNzdm5jIGJ1bmRsZXMuICBTZWUgdGhlIGJ1aWxkIGluc3RydWN0aW9ucyBmb3IgaG93IHlvdSBtaWdodAotICAgICAgICAgY29tcGlsZSB5b3VyIG93bi4KLQotICAgICAgRGlzYWJsZSBQaXBlbGluZWQgVXBkYXRlczoKLQotICAgICAgICAgRGlzYWJsZSB0aGUgVHVyYm9WTkMtbGlrZSBwaXBlbGluZWQgdXBkYXRlcyBtb2RlLiAgUGlwZWxpbmVkCi0gICAgICAgICB1cGRhdGVzIGlzIHRoZSBkZWZhdWx0IGV2ZW4gd2hlbiBub3QgVHVyYm9WTkMgZW5hYmxlZC4gIFRoZXkKLSAgICAgICAgIGFzayBmb3IgdGhlIG5leHQgc2NyZWVuIHVwZGF0ZSBiZWZvcmUgdGhlIGN1cnJlbnQgb25lIGhhcyAKLSAgICAgICAgIGZpbmlzaGVkIGRvd25sb2FkaW5nLCBhbmQgc28gdGhpcyBtaWdodCByZWR1Y2UgdGhlIHNsb3dkb3duCi0gICAgICAgICBkdWUgdG8gaGlnaCBsYXRlbmN5IG9yIGxvdyBiYW5kd2lkdGggYnkgMlggb3Igc28uICBEaXNhYmxlCi0gICAgICAgICB0aGVtIGlmIHRoZXkgY2F1c2UgcHJvYmxlbXMgd2l0aCB0aGUgcmVtb3RlIFZOQyBTZXJ2ZXIgb3IKLSAgICAgICAgIHVzZSB0b28gbXVjaCBiYW5kd2lkdGguCi0KLSAgICAgIFNlbmQgQ0xJUEJPQVJEIG5vdCBQUklNQVJZOgotCi0gICAgICAgICBXaGVuIHNlbmRpbmcgbG9jYWxseSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBWTkMgc2VydmVyIHNpZGUsCi0gICAgICAgICBzZW5kIHRoZSBDTElQQk9BUkQgc2VsZWN0aW9uIGluc3RlYWQgb2YgdGhlIFBSSU1BUlkgc2VsZWN0aW9uLgotCi0gICAgICBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lOgotCi0gICAgICAgICBTZW5kIHNlbGVjdGVkIHRleHQgdG8gdGhlIFZOQyBzZXJ2ZXIgc2lkZSBldmVyeSB0aW1lIHRoZSBtb3VzZQotICAgICAgICAgZm9jdXMgZW50ZXJzIHRoZSBtYWluIFZOQyBWaWV3ZXIgd2luZG93IGluc3RlYWQgb25seSB3aGVuIGl0Ci0gICAgICAgICBhcHBlYXJzIHRvIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBzZW5kLgotCi0gICAgICBTY2FsaW5nOgotCi0gICAgICAgICBVc2Ugdmlld2VyLXNpZGUgKGkuZS4gbG9jYWwpIHNjYWxpbmcgb2YgdGhlIFZOQyBzY3JlZW4uICBTdXBwbHkKLSAgICAgICAgIGEgZnJhY3Rpb24sIGUuZy4gMC43NSBvciAzLzQsIG9yIGEgV3hIIGdlb21ldHJ5LCBlLmcuIDEyODB4MTAyNCwKLSAgICAgICAgIG9yIHRoZSBzdHJpbmcgJ2ZpdCcgdG8gZmlsbCB0aGUgY3VycmVudCBzY3JlZW4uICBVc2UgJ2F1dG8nCi0gICAgICAgICB0byBzY2FsZSB0aGUgZGVza3RvcCB0byBtYXRjaCB0aGUgdmlld2VyIHdpbmRvdyBzaXplLgotCi0gICAgICAgICBJZiB5b3Ugb2JzZXJ2ZSBtb3VzZSB0cmFpbCBwYWludGluZyBlcnJvcnMgdHJ5IHVzaW5nIFgxMSBDdXJzb3IuCi0KLSAgICAgICAgIE5vdGUgdGhhdCBzaW5jZSB0aGUgbG9jYWwgc2NhbGluZyBpcyBkb25lIGluIHNvZnR3YXJlIGl0IGNhbgotICAgICAgICAgYmUgc2xvdy4gIFNpbmNlIFpSTEUgaXMgYmV0dGVyIHRoYW4gVGlnaHQgaW4gdGhpcyByZWdhcmQsIHdoZW4KLSAgICAgICAgIHNjYWxpbmcgaXMgZGV0ZWN0ZWQsIHRoZSBlbmNvZGluZyB3aWxsIGJlIHN3aXRjaGVkIHRvIFpSTEUuCi0gICAgICAgICBVc2UgdGhlIFBvcHVwIHRvIGdvIGJhY2sgdG8gVGlnaHQgaWYgeW91IHdhbnQgdG8sIG9yIHNldCB0aGUKLSAgICAgICAgIGVudi4gdmFyLiBTU1ZOQ19QUkVTRVJWRV9FTkNPRElORz0xIHRvIGRpc2FibGUgdGhlIHN3aXRjaC4KLQotICAgICAgICAgRm9yIGFkZGl0aW9uYWwgc3BlZWR1cHMgdW5kZXIgbG9jYWwgc2NhbGluZzogdHJ5IGhhdmluZyBhIHNvbGlkCi0gICAgICAgICBkZXNrdG9wIGJhY2tncm91bmQgb24gdGhlIHJlbW90ZSBzaWRlIChlaXRoZXIgbWFudWFsbHkgb3IgdXNpbmcKLSAgICAgICAgICd4MTF2bmMgLXNvbGlkIC4uLicpOyBhbmQgYWxzbyBjb25zaWRlciB1c2luZyBjbGllbnQgc2lkZSBjYWNoaW5nCi0gICAgICAgICAneDExdm5jIC1uY2FjaGUgMTAgLi4uJyBpZiB0aGUgcmVtb3RlIHNlcnZlciBpcyB4MTF2bmMuCi0KLSAgICAgIEVzY2FwZSBLZXlzOgotCi0gICAgICAgICBFbmFibGUgJ0VzY2FwZSBLZXlzJywgYSBzZXQgb2YgbW9kaWZpZXIga2V5cyB0aGF0LCBpZiBhbGwgYXJlCi0gICAgICAgICBwcmVzc2VkIGRvd24sIGVuYWJsZSBsb2NhbCBIb3QgS2V5IGFjdGlvbnMuICBTZXQgdG8gJ2RlZmF1bHQnCi0gICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgKEFsdF9MLFN1cGVyX0wgb24gdW5peCwgQ29udHJvbF9MLE1ldGFfTAotICAgICAgICAgb24gbWFjb3N4KSBvciBzZXQgdG8gYSBsaXN0IG9mIG1vZGlmaWVyIGtleXMuCi0KLSAgICAgIFkgQ3JvcDoKLQotICAgICAgICAgVGhpcyBpcyBmb3IgeDExdm5jJ3MgLW5jYWNoZSBjbGllbnQgc2lkZSBjYWNoaW5nIHNjaGVtZSB3aXRoIG91cgotICAgICAgICAgVW5peCBUaWdodFZOQyB2aWV3ZXIuICBTZXRzIHRoZSBZIHZhbHVlIHRvICJjcm9wIiB0aGUgdmlld2VyCi0gICAgICAgICBzaXplIGF0IChiZWxvdyB0aGUgY3V0IGlzIHRoZSBwaXhlbCBjYWNoZSByZWdpb24geW91IGRvIG5vdAotICAgICAgICAgd2FudCB0byBzZWUpLiAgSWYgdGhlIHNjcmVlbiBpcyB0YWxsIChIID4gMipXKSB5Y3JvcHBpbmcgd2lsbAotICAgICAgICAgYmUgYXV0b2RldGVjdGVkLCBvciB5b3UgY2FuIHNldCB0byAtMSB0byBmb3JjZSBhdXRvZGVjdGlvbi4KLSAgICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIHRoZSBkZXNpcmVkIFkgdmFsdWUuICBZb3UgY2FuIGFsc28gc2V0Ci0gICAgICAgICB0aGUgc2Nyb2xsYmFyIHdpZHRoICh2ZXJ5IHRoaW4gYnkgZGVmYXVsdCkgYnkgYXBwZW5kaW5nICIsc2I9TiIKLSAgICAgICAgIChvciB1c2UgIixzYj1OIiBieSBpdHNlbGYgdG8ganVzdCBzZXQgdGhlIHNjcm9sbGJhciB3aWR0aCkuCi0KLSAgICAgIFNjcm9sbEJhciBXaWR0aDoKLQotICAgICAgICAgVGhpcyBpcyBmb3IgeDExdm5jJ3MgLW5jYWNoZSBjbGllbnQgc2lkZSBjYWNoaW5nIHNjaGVtZSB3aXRoIG91cgotICAgICAgICAgVW5peCBUaWdodFZOQyB2aWV3ZXIuICBGb3IgWS1Dcm9wIG1vZGUsIHNldCB0aGUgc2l6ZSBvZiB0aGUKLSAgICAgICAgIHNjcm9sbGJhcnMgKG9mdGVuIG9uZSB3YW50IGl0IHRvIGJlIHZlcnkgbmFycm93LCBlLmcuIDIgcGl4ZWxzCi0gICAgICAgICB0byBiZSBsZXNzIGRpc3RyYWN0aW5nLgotCi0gICAgICBSRkIgVmVyc2lvbjoKLQotICAgICAgICAgU2V0IHRoZSBudW1lcmljYWwgdmVyc2lvbiBvZiBSRkIgKFZOQykgcHJvdG9jb2wgdG8gcHJldGVuZCB0bwotICAgICAgICAgYmUsIDMueC4gIFVzdWFsbHkgb25seSBuZWVkZWQgd2l0aCBVbHRyYVZOQyBzZXJ2ZXJzLgotCi0gICAgICBFbmNvZGluZ3M6Ci0KLSAgICAgICAgIExpc3QgZW5jb2RpbmdzIGluIHByZWZlcnJlZCBvcmRlciwgZm9yIGV4YW1wbGUKLSAgICAgICAgICdjb3B5cmVjdCB6cmxlIHRpZ2h0JyAgIFRoZSBsaXN0IG9mIGVuY29kaW5ncyBpczoKLSAgICAgICAgIGNvcHlyZWN0IHRpZ2h0IHpybGUgenl3cmxlIGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3Ci0KLSAgICAgIEV4dHJhIE9wdGlvbnM6Ci0KLSAgICAgICAgIFN0cmluZyBvZiBleHRyYSBVbml4IHNzdm5jdmlld2VyIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgSS5lLiBmb3IKLSAgICAgICAgIG9uZXMgbGlrZSAtMTZicHAgdGhhdCBjYW5ub3QgYmUgc2V0IGluc2lkZSB0aGlzIFNTVk5DIEdVSS4gIEZvciBhCi0gICAgICAgICBsaXN0IGNsaWNrIEhlbHAgdGhlbiAnU1NWTkMgdm5jdmlld2VyIC1oZWxwIE91dHB1dCcuIAotCi0KLSAgICBUaGVzZSBhcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uZSBtYXkgc2V0IHRvIGFmZmVjdCB0aGUgb3B0aW9ucwotICAgIG9mIHRoZSBTU1ZOQyB2bmN2aWV3ZXIgYW5kIGFsc28gdGhlIHNzX3ZuY3ZpZXdlciB3cmFwcGVyIHNjcmlwdAotICAgIChhbmQgaGVuY2UgbWF5IGFwcGx5IHRvIDNyZCBwYXJ0eSB2bmN2aWV3ZXJzIHRvbykKLQotICAgICAgICAgVk5DVklFV0VSX0FMUEhBQkxFTkQgICAgICgtYWxwaGEsIHNlZSBDdXJzb3IgQWxwaGFibGVuZGluZyBhYm92ZSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9QT1BVUF9GSVggICAgICAoLXBvcHVwZml4LCB3YXJwIHBvcHVwIHRvIG1vdXNlIGxvY2F0aW9uKQotICAgICAgICAgVk5DVklFV0VSX0dSQUJfU0VSVkVSICAgICgtZ3JhYmFsbCwgc2VlIFVzZSBYR3JhYlNlcnZlciBhYm92ZSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9ZQ1JPUCAgICAgICAgICAoLXljcm9wLCBzZWUgWSBDcm9wIGFib3ZlKQotICAgICAgICAgVk5DVklFV0VSX1NCV0lEVEggICAgICAgICgtc2J3aWR0aCwgc2VlIFNjcm9sbEJhciBXaWR0aCBhYm92ZSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9SRkJWRVJTSU9OICAgICAoLXJmYnZlcnNpb24sIGUuZy4gMy42KQotICAgICAgICAgVk5DVklFV0VSX0VOQ09ESU5HUyAgICAgICgtZW5jb2RpbmdzLCBlLmcuICJjb3B5cmVjdCB6cmxlIGhleHRpbGUiKQotICAgICAgICAgVk5DVklFV0VSX05PQkVMTCAgICAgICAgICgtbm9iZWxsKQotICAgICAgICAgVk5DVklFV0VSX1gxMUNVUlNPUiAgICAgICgteDExY3Vyc29yLCBzZWUgVXNlIFgxMSBDdXJzb3IgYWJvdmUpCi0gICAgICAgICBWTkNWSUVXRVJfUkFXTE9DQUwgICAgICAgKC1yYXdsb2NhbCwgc2VlIFVzZSBSYXcgTG9jYWwgYWJvdmUpCi0gICAgICAgICBWTkNWSUVXRVJfTk9UVFkgICAgICAgICAgKC1ub3R0eSwgc2VlIEF2b2lkIFVzaW5nIFRlcm1pbmFsIGFib3ZlKQotICAgICAgICAgVk5DVklFV0VSX0VTQ0FQRSAgICAgICAgICgtZXNjYXBlLCBzZWUgRXNjYXBlIEtleXMgYWJvdmUpCi0gICAgICAgICBWTkNWSUVXRVJfVUxUUkFEU00gICAgICAgKC11bHRyYWRzbSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9QSVBFTElORV9VUERBVEVTICgtcGlwZWxpbmUsIHNlZSBhYm92ZSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9TRU5EX0NMSVBCT0FSRCAoLXNlbmRjbGlwYm9hcmQpCi0gICAgICAgICBWTkNWSUVXRVJfU0VORF9BTFdBWVMgICAgKC1zZW5kYWx3YXlzKQotICAgICAgICAgVk5DVklFV0VSX1JFQ1ZfVEVYVCAgICAgICgtcmVjdnRleHQgY2xpcGJvYXJkL3ByaW1hcnkvYm90aCkKLSAgICAgICAgIFZOQ1ZJRVdFUl9OT19DVVRCVUZGRVIgICAoZG8gbm90IHNlbmQgQ1VUQlVGRkVSMCBhcyBmYWxsYmFjaykKLSAgICAgICAgIFZOQ1ZJRVdFUl9OT19QSVBFTElORV9VUERBVEVTICgtbm9waXBlbGluZSkKLSAgICAgICAgIFZOQ1ZJRVdFUl9BTFdBWVNfUkVDRU5URVIgKHNldCB0byBhdm9pZCg/KSByZWNlbnRlcmluZyBvbiByZXNpemUpCi0gICAgICAgICBWTkNWSUVXRVJfSVNfUkVBTFZOQzQgICAgKGluZGljYXRlIHZuY3ZpZXdlciBpcyByZWFsdm5jNCBmbGF2b3IuKQotICAgICAgICAgVk5DVklFV0VSX05PX0lQVjQgICAgICAgICgtbm9pcHY0KQotICAgICAgICAgVk5DVklFV0VSX05PX0lQVjYgICAgICAgICgtbm9pcHY2KQotICAgICAgICAgVk5DVklFV0VSX0ZPUkNFX1VQICAgICAgIChmb3JjZSByYWlzZSBvbiBmdWxsc2NyZWVuIGdyYWJhbGwpCi0gICAgICAgICBWTkNWSUVXRVJfUEFTU1dPUkQgICAgICAgKGRhbmdlcjogc2V0IHZuYyBwYXNzd2QgdmlhIGVudi4gdmFyLikKLSAgICAgICAgIFZOQ1ZJRVdFUl9NSU5fVElUTEUgICAgICAobWluaW11bSB3aW5kb3cgdGl0bGUgKGFwcHNoYXJlKSkKLQotICAgICAgICAgVk5DVklFV0VSQ01EICAgICAgICAgICAgICh1bml4IHZpZXdlciBjb21tYW5kLCBkZWZhdWx0IHZuY3ZpZXdlcikKLSAgICAgICAgIFZOQ1ZJRVdFUkNNRF9PVkVSUklERSAgICAoZm9yY2Ugb3ZlcnJpZGUgb2YgVk5DVklFV0VSQ01EKQotICAgICAgICAgVk5DVklFV0VSQ01EX0VYVFJBX09QVFMgIChleHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gVk5DVklFV0VSQ01EKQotICAgICAgICAgVk5DVklFV0VSX0xJU1RFTl9MT0NBTEhPU1QgKGZvcmNlIHNzdm5jdmlld2VyIHRvIC1saXN0ZW4gb24gbG9jYWxob3N0KQotICAgICAgICAgVk5DVklFV0VSX05PX1NFQ19UWVBFX1RJR0hUKGZvcmNlIHNzdm5jdmlld2VyIHRvIHNraXAgcmZiU2VjVHlwZVRpZ2h0KQotICAgICAgICAgSEVYVElMRV9ZQ1JPUF9UT08gICAgICAgICh0ZXN0aW5nOiBub3N5bmNfeWNyb3AgZm9yIGhleHRpbGUgdXBkYXRlcy4pCi0KLSAgICAgICAgIFNTX0RFQlVHICAgICAgICAgICAgICAgICAodmVyeSB2ZXJib3NlIGRlYnVnIHByaW50b3V0IGJ5IHNjcmlwdC4pCi0gICAgICAgICBTU19WTkNWSUVXRVJfTElTVEVOX1BPUlQgKGZvcmNlIGxpc3RlbiBwb3J0LikKLSAgICAgICAgIFNTX1ZOQ1ZJRVdFUl9OT19GICAgICAgICAobm8gLWYgZm9yIFNTSC4pCi0gICAgICAgICBTU19WTkNWSUVXRVJfTk9fVCAgICAgICAgKG5vIC10IGZvciBTU0guKQotICAgICAgICAgU1NfVk5DVklFV0VSX1VTRV9DICAgICAgIChmb3JjZSAtQyBjb21wcmVzc2lvbiBmb3IgU1NILikKLSAgICAgICAgIFNTX1ZOQ1ZJRVdFUl9TU0hfQ01EICAgICAob3ZlcnJpZGUgU1NIIGNvbW1hbmQgdG8gcnVuLikKLSAgICAgICAgIFNTX1ZOQ1ZJRVdFUl9OT19NQVhDT05OICAobm8gbWF4Y29ubiBmb3Igc3R1bm5lbCAob2Jzb2xldGUpKQotICAgICAgICAgU1NfVk5DVklFV0VSX1JNICAgICAgICAgIChmaWxlIGNvbnRhaW5pbmcgdm5jIHBhc3N3ZCB0byByZW1vdmUuKQotICAgICAgICAgU1NfVk5DVklFV0VSX1NTSF9PTkxZICAgIChydW4gdGhlIFNTSCBjb21tYW5kLCB0aGVuIGV4aXQuKQotCi0gICAgICAgICBTU1ZOQ19NVUxUSVBMRV9MSVNURU4gICAgKC1tdWx0aWxpc3Rlbiwgc2VlIE11bHRpcGxlIExJU1RFTiBhYm92ZSkKLSAgICAgICAgIFNTVk5DX0FDQ0VQVF9QT1BVUCAgICAgICAoLWFjY2VwdHBvcHVwLCBzZWUgQWNjZXB0IFBvcHVwIERpYWxvZykKLSAgICAgICAgIFNTVk5DX0FDQ0VQVF9QT1BVUF9TQyAgICAoLWFjY2VwdHBvcHVwc2MsIHNlZSBBY2NlcHQgUG9wdXAgRGlhbG9nKQotICAgICAgICAgU1NWTkNfVFVSQk9WTkMgICAgICAgICAgIChzZWUgVHVyYm9WTkMgYWJvdmUpCi0gICAgICAgICBTU1ZOQ19VTklYUFcgICAgICAgICAgICAgKC11bml4cHcpCi0gICAgICAgICBTU1ZOQ19VTklYUFdfTk9FU0MgICAgICAgKGRvIG5vdCBzZW5kIGVzY2FwZSBpbiAtdW5peHB3IG1vZGUpCi0gICAgICAgICBTU1ZOQ19TQ0FMRSAgICAgICAgICAgICAgKC1zY2FsZSwgc2VlIFNjYWxpbmcgYWJvdmUpCi0gICAgICAgICBTU1ZOQ19OT1NPTElEICAgICAgICAgICAgKGRvIG5vdCBkbyBzb2xpZCByZWdpb24gc3BlZWR1cCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nIG1vZGUuKQotICAgICAgICAgU1NWTkNfUFJFU0VSVkVfRU5DT0RJTkcgIChkbyBub3Qgc3dpdGNoIHRvIFpSTEUgd2hlbiBzY2FsaW5nKQotICAgICAgICAgU1NWTkNfRklOSVNIX1NMRUVQICAgICAgIChvbiB1bml4L21hY29zeCBzbGVlcCB0aGlzIG1hbnkgc2Vjb25kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgZXhpdGluZyB0aGUgdGVybWluYWwsIGRlZmF1bHQgNSkKLQotICAgICAgICAgTWlzYyAoc3BlY2lhbCB1c2FnZSBvciBkZWJ1Z2dpbmcgb3Igc3Nfdm5jdmlld2VyIHNldHRpbmdzKToKLQotICAgICAgICAgU1NWTkNfTUVTR19ERUxBWSAgICAgICAgIChzbGVlcCB0aGlzIG1hbnkgbWlsbGlzZWMgYmV0d2VlbiBtZXNzYWdlcykKLSAgICAgICAgIFNTVk5DX05PX0VOQ19XQVJOICAgICAgICAoZG8gbm90IHByaW50IG91dCBhIE5PIEVOQ1JZUFRJT04gd2FybmluZykKLSAgICAgICAgIFNTVk5DX0VYVFJBX1NMRUVQICAgICAgICAoc2FtZSBhcyBTbGVlcDogd2luZG93KQotICAgICAgICAgU1NWTkNfTk9fVUxUUkFfRFNNICAgICAgIChkaXNhYmxlIHVsdHJhdm5jIGRzbSBlbmNyeXB0aW9uKQotICAgICAgICAgU1NWTkNfVUxUUkFfRFNNICAgICAgICAgICh0aGUgdWx0cmF2bmNfZHNtX2hlbHBlciBjb21tYW5kKQotICAgICAgICAgU1NWTkNfVUxUUkFfRlRQX0pBUiAgICAgIChmaWxlIGxvY2F0aW9uIG9mIHVsdHJhZnRwLmphciBqYXIgZmlsZSkKLSAgICAgICAgIFNTVk5DX0tOT1dOX0hPU1RTX0ZJTEUgICAoZmlsZSBmb3IgcGVyLWNvbm5lY3Rpb24gc3NoIGtub3duIGhvc3RzKQotICAgICAgICAgU1NWTkNfU0NBTEVfU1RBVFMgICAgICAgIChwcmludCBzY2FsaW5nIHN0YXRzKQotICAgICAgICAgU1NWTkNfTk9TT0xJRCAgICAgICAgICAgIChkaXNhYmxlIHNvbGlkIHNwZWNpYWwgY2FzZSB3aGlsZSBzY2FsaW5nKQotICAgICAgICAgU1NWTkNfREVCVUdfUkVMRUFTRSAgICAgIChkZWJ1ZyBwcmludG91dCBmb3Iga2V5Ym9hcmQgbW9kaWZpZXJzLikKLSAgICAgICAgIFNTVk5DX0RFQlVHX0VTQ0FQRV9LRVlTICAoZGVidWcgcHJpbnRvdXQgZm9yIGVzY2FwZSBrZXlzKQotICAgICAgICAgU1NWTkNfTk9fTUFZQkVfU1lOQyAgICAgIChza2lwIFhTeW5jKCkgY2FsbHMgaW4gY2VydGFpbiBwYWludGluZykKLSAgICAgICAgIFNTVk5DX01BWF9MSVNURU4gICAgICAgICAobnVtYmVyIG9mIHRpbWUgdG8gbGlzdGVuIGZvciByZXZlcnNlIGNvbm4uKQotICAgICAgICAgU1NWTkNfTElTVEVOX09OQ0UgICAgICAgIChsaXN0ZW4gZm9yIHJldmVyc2UgY29ubi4gb25seSBvbmNlKQotICAgICAgICAgU1RVTk5FTF9MSVNURU4gICAgICAgICAgIChzdHVubmVsIGludGVyZmFjZSBmb3IgcmV2ZXJzZSBjb25uLgotICAgICAgICAgU1NWTkNfTk9fTUVTU0FHRV9QT1BVUCAgIChkbyBub3QgcGxhY2UgaW5mbyBtZXNzYWdlcyBpbiBwb3B1cC4pCi0gICAgICAgICBTU1ZOQ19TRVRfU0VDVVJJVFlfVFlQRSAgKGZvcmNlIFZlTkNyeXB0IHNlY3VyaXR5IHR5cGUpCi0gICAgICAgICBTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0UgKHN0cmluZyB1c2VkIGZvciBWZU5DcnlwdCwgZXRjLiBjb25uZWN0KQotICAgICAgICAgU1NWTkNfU0tJUF9SRkJfUFJPVE9DT0xfVkVSU0lPTiAoZm9yY2Ugdmlld2VyIHRvIGJlIFJGQiAzLjgpCi0gICAgICAgICBTU1ZOQ19ERUJVR19TRUNfVFlQRVMgICAgKGRlYnVnIHNlY3VyaXR5IHR5cGVzIGZvciBWZU5DcnlwdCkKLSAgICAgICAgIFNTVk5DX0RFQlVHX01TTE9HT04gICAgICAoZXh0cmEgcHJpbnRvdXQgZm9yIHVsdHJhdm5jIG1zbG9nb24gcHJvdG8pCi0gICAgICAgICBTU1ZOQ19ERUJVR19SRUNUUyAgICAgICAgKHByaW50b3V0IGRlYnVnIGZvciBSRkIgcmVjdGFuZ2xlcy4pCi0gICAgICAgICBTU1ZOQ19ERUJVR19DSEFUICAgICAgICAgKHByaW50b3V0IGRlYnVnIGluZm8gZm9yIGNoYXQgbW9kZS4pCi0gICAgICAgICBTU1ZOQ19ERUxBWV9TWU5DICAgICAgICAgKGZhc3RlciBsb2NhbCBkcmF3aW5nIGRlbGF5aW5nIFhTeW5jKQotICAgICAgICAgU1NWTkNfREVCVUdfU0VMRUNUSU9OICAgIChwcmludG91dCBkZWJ1ZyBmb3Igc2VsZWN0aW9uL2NsaXBib2FyZCkKLSAgICAgICAgIFNTVk5DX1JFUEVBVEVSICAgICAgICAgICAoVVJMLWlzaCBzc2xyZXBlYXRlcjovLyB0aGluZyBmb3IgVWx0cmFWTkMpCi0gICAgICAgICBTU1ZOQ19WRU5DUllQVF9ERUJVRyAgICAgKGRlYnVnIHByaW50b3V0IGZvciBWZU5DcnlwdCBtb2RlLikKLSAgICAgICAgIFNTVk5DX1ZFTkNSWVBUX1VTRVJQQVNTICAoZm9yY2UgVmVOQ3J5cHQgdXNlcjpwYXNzKQotICAgICAgICAgU1NWTkNfU1RVTk5FTF9ERUJVRyAgICAgIChpbmNyZWFzZSBzdHVubmVsIGRlYnVnZ2luZyBwcmludG91dCkKLSAgICAgICAgIFNTVk5DX1NUVU5ORUxfVkVSSUZZMyAgICAoaW5jcmVhc2Ugc3R1bm5lbCB2ZXJpZnkgZnJvbSAyIHRvIDMpCi0gICAgICAgICBTU1ZOQ19MSU1fQUNDRVBUX1BSRUxPQUQgKHByZWxvYWQgbGlicmFyeSB0byBsaW1pdCBhY2NlcHQoMikpCi0gICAgICAgICBTU1ZOQ19TT0NLUzUgICAgICAgICAgICAgKHNvY2tzNSBmb3IgeDExdm5jIFBPUlQ9IG1vZGUsIGRlZmF1bHQpCi0gICAgICAgICBTU1ZOQ19TT0NLUzQJCSAgKHNvY2tzNCBmb3IgeDExdm5jIFBPUlQ9IG1vZGUpCi0gICAgICAgICBTU1ZOQ19OT19JUFY2X1BST1hZICAgICAgKGRvIG5vdCBzZXR1cCBhIGlwdjY6Ly8gcHJveHkpCi0gICAgICAgICBTU1ZOQ19OT19JUFY2X1BST1hZX0RJUkVDVCAoZG8gbm90IHNldHVwIGEgaXB2NjovLyBwcm94eSB1bmVuY3J5cHRlZCkKLSAgICAgICAgIFNTVk5DX1BPUlRfSVBWNiAgICAgICAgICAoeDExdm5jIFBPUlQ9IG1vZGUgaXMgdG8gaXB2Ni1vbmx5KQotICAgICAgICAgU1NWTkNfSVBWNiAgICAgICAgICAgICAgICgwIHRvIGRpc2FibGUgc3Nfdm5jdmlld2VyIGlwdjYgY2hlY2spCi0gICAgICAgICBTU1ZOQ19GRVRDSF9USU1FT1VUICAgICAgKHNzX3ZuY3ZpZXdlciBjZXJ0IGZldGNoIHRpbWVvdXQpCi0gICAgICAgICBTU1ZOQ19VU0VfU19DTElFTlQgICAgICAgKGZvcmNlIGNlcnQgZmV0Y2ggdG8gYmUgJ29wZW5zc2wgc19jbGllbnQnKQotICAgICAgICAgU1NWTkNfU0hPV0NFUlRfRVhJVF8wICAgIChmb3JjZSBzaG93Y2VydCB0byBleGl0IHdpdGggc3VjY2VzcykKLSAgICAgICAgIFNTVk5DX1NTSF9MT0NBTEhPU1RfQVVUSCAoZm9yY2UgU1NIIGxvY2FsaG9zdCBhdXRoIGNoZWNrLikKLSAgICAgICAgIFNTVk5DX1RFU1RfU0VDX1RZUEUgICAgICAoZm9yY2UgUFBST1hZIFZlTkNyeXB0IHR5cGU7IHRlc3RpbmcpCi0gICAgICAgICBTU1ZOQ19URVNUX1NFQ19TVUJUWVBFICAgKGZvcmNlIFBQUk9YWSBWZU5DcnlwdCBzdWJ0eXBlOyB0ZXN0aW5nKQotICAgICAgICAgU1NWTkNfRVhJVF9ERUJVRyAgICAgICAgICh0ZXN0aW5nOiBwcm9tcHQgdG8gZXhpdCBhdCBlbmQuKQotICAgICAgICAgU1NWTkNfVVBfREVCVUcgICAgICAgICAgIChndWkgdXNlci9wYXNzd2QgZGVidWcgbW9kZS4pCi0gICAgICAgICBTU1ZOQ19VUF9GSUxFICAgICAgICAgICAgKGd1aSB1c2VyL3Bhc3N3ZCBmaWxlLikKLQotICAgICAgICAgU1RVTk5FTF9FWFRSQV9PUFRTICAgICAgIChleHRyYSBvcHRpb25zIGZvciBzdHVubmVsLikKLQotICAgICAgICAgWDExVk5DX0FQUFNIQVJFX0RFQlVHICAgIChmb3IgZGVidWdnaW5nIC1hcHBzaGFyZSBtb2RlLikKLSAgICAgICAgIE5PX1gxMVZOQ19BUFBTSEFSRSAgICAgICAoc2hpZnQgZG93biBmb3IgZXNjYXBlIGtleXMuKQotICAgICAgICAgREVCVUdfSGFuZGxlRmlsZVhmZXIgICAgICh1bHRyYXZuYyBmaWxleGZlcikKLSAgICAgICAgIERFQlVHX1JGQl9TTVNHICAgICAgICAgICAoUkZCIHNlcnZlciBtZXNzYWdlIGRlYnVnLikKLX0KLQotCS5hdi5mLnQgaW5zZXJ0IGVuZCAkbXNnCi0JYnV0dG9uIC5hdi5odGV4dCAtdGV4dCAiU1NWTkMgdm5jdmlld2VyIC1oZWxwIE91dHB1dCIgLWNvbW1hbmQgc2hvd192aWV3ZXJfaGVscAotCXBhY2sgLmF2Lmh0ZXh0IC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0JamlnZ2xlX3RleHQgLmF2LmYudAotfQotCi1wcm9jIHNob3dfdmlld2VyX2hlbHAge30gewotCXRvcGxldiAudmhscAotCi0Jc2V0IGggMzUKLQlpZiBbc21hbGxfaGVpZ2h0XSB7Ci0JCXNldCBoIDMwCi0JfQotCXNjcm9sbF90ZXh0X2Rpc21pc3MgLnZobHAuZiA4MyAkaAotCi0JY2VudGVyX3dpbiAudmhscAotCXdtIHJlc2l6YWJsZSAudmhscCAxIDAKLQotCXdtIHRpdGxlIC52aGxwICJTU1ZOQyB2bmN2aWV3ZXIgLWhlbHAgT3V0cHV0IgotCi0Jc2V0IG1zZyAiLS0gTm8gSGVscCBPdXRwdXQgLS0iCi0JY2F0Y2gge3NldCBtc2cgW2V4ZWMgc3Nfdm5jdmlld2VyIC12aWV3ZXJoZWxwIDI+L2Rldi9udWxsXX0KLQotCS52aGxwLmYudCBpbnNlcnQgZW5kICRtc2cKLQlqaWdnbGVfdGV4dCAudmhscC5mLnQKLX0KLQotcHJvYyBzZXRfdmlld2VyX3BhdGgge30gewotCWdsb2JhbCBjaGFuZ2Vfdm5jdmlld2VyX3BhdGgKLQl1bml4X2RpYWxvZ19yZXNpemUgLmNodmlld2VyCi0Jc2V0IGNoYW5nZV92bmN2aWV3ZXJfcGF0aCBbdGtfZ2V0T3BlbkZpbGUgLXBhcmVudCAuY2h2aWV3ZXJdCi0JY2F0Y2gge3JhaXNlIC5jaHZpZXdlcn0KLQl1cGRhdGUKLX0KLQotcHJvYyBjaGFuZ2Vfdm5jdmlld2VyX2RpYWxvZyB7fSB7Ci0JZ2xvYmFsIGNoYW5nZV92bmN2aWV3ZXIgY2hhbmdlX3ZuY3ZpZXdlcl9wYXRoIHZuY3ZpZXdlcl9yZWFsdm5jNAotCWdsb2JhbCB0c19vbmx5Ci0JCi0JdG9wbGV2IC5jaHZpZXdlcgotCXdtIHRpdGxlIC5jaHZpZXdlciAiQ2hhbmdlIFZOQyBWaWV3ZXIiCi0KLQlnbG9iYWwgaGVscF9mb250Ci0JaWYgeyR0c19vbmx5fSB7Ci0JCWV2YWwgdGV4dCAuY2h2aWV3ZXIudCAtd2lkdGggOTAgLWhlaWdodCAxNiAkaGVscF9mb250Ci0JfSBlbHNlIHsKLQkJZXZhbCB0ZXh0IC5jaHZpZXdlci50IC13aWR0aCA5MCAtaGVpZ2h0IDI3ICRoZWxwX2ZvbnQKLQl9Ci0JYXBwbHlfYmcgLmNodmlld2VyLnQKLQotCXNldCBtc2cgewotICAgIFRvIHVzZSB5b3VyIG93biBWTkMgVmlld2VyIChpLmUuIG9uZSBpbnN0YWxsZWQgYnkgeW91LCBub3QgaW5jbHVkZWQgaW4gdGhpcwotICAgIHBhY2thZ2UpLCBlLmcuIFVsdHJhVk5DIG9yIFJlYWxWTkMsIHR5cGUgaW4gdGhlIHByb2dyYW0gbmFtZSwgb3IgYnJvd3NlIGZvcgotICAgIHRoZSBmdWxsIHBhdGggdG8gaXQuICBZb3UgY2FuIHB1dCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFmdGVyIHRoZSBwcm9ncmFtLgotCi0gICAgTm90ZSB0aGF0IGR1ZSB0byBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAgICB0aGVyZSBtYXkgYmUgaXNzdWVzLCBlc3BlY2lhbGx5IGlmIG1hbnkgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIHN1cHBsaWVkLgotICAgIFlvdSBjYW4gc3BlY2lmeSB5b3VyIG93biBjb21tYW5kIGxpbmUgb3B0aW9ucyBiZWxvdyBpZiB5b3UgbGlrZSAoYW5kIHRyeSB0bwotICAgIGF2b2lkIHNldHRpbmcgYW55IG90aGVycyBpbiB0aGlzIEdVSSB1bmRlciAiT3B0aW9ucyIpLgotCi0gICAgSWYgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0gbmFtZSBoYXMgc3BhY2VzIGl0IGluLCBzdXJyb3VuZCBpdCB3aXRoIGRvdWJsZSBxdW90ZXM6Ci0KLSAgICAgICAgIkM6XFByb2dyYW0gRmlsZXNcTXkgVm5jIFZpZXdlclxWTkNWSUVXRVIuRVhFIgotCi0gICAgTWFrZSBzdXJlIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3RlciBpcyBhIHF1b3RlLiAgWW91IHNob3VsZCBxdW90ZSB0aGUgY29tbWFuZAotICAgIGV2ZW4gaWYgaXQgaXMgb25seSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0aGF0IG5lZWQgZXh0cmEgcHJvdGVjdGlvbjoKLQotICAgICAgICAid2luZSIgLS0gIi9ob21lL2ZyZWQvUHJvZ3JhbSBGbGllcy9VbHRyYVZOQy0xLjAuMi5leGUiIC82NGNvbG9ycwotCi0gICAgU2luY2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGRpZmZlciBiZXR3ZWVuIHRoZW0gZ3JlYXRseSwgaWYgeW91IGtub3cgaXQKLSAgICBpcyBvZiB0aGUgUmVhbFZOQyA0LnggZmxhdm9yLCBpbmRpY2F0ZSBvbiB0aGUgY2hlY2sgYm94LiBPdGhlcndpc2Ugd2UgZ3Vlc3MuCi0KLSAgICBUbyBoYXZlIFNTVk5DIGFjdCBhcyBhIGdlbmVyYWwgU1RVTk5FTCByZWRpcmVjdG9yIChubyBWTkMpIHNldCB0aGUgdmlld2VyIHRvIGJlCi0gICAgInhtZXNzYWdlIE9LIiBvciAieG1lc3NhZ2UgPHBvcnQ+IiBvciAic2xlZXAgbiIgb3IgInNsZWVwIG4gPHBvcnQ+IiAob3IgIk5PVEVQQUQiCi0gICAgb24gV2luZG93cykuICBUaGUgZGVmYXVsdCBsaXN0ZW4gcG9ydCBpcyA1OTMwLiAgVGhlIGRlc3RpbmF0aW9uIGlzIHNldCBpbiAiVk5DCi0gICAgSG9zdDpEaXNwbGF5IiAoZm9yIGEgcmVtb3RlIHBvcnQgbGVzcyB0aGFuIDIwMCB1c2UgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3J0IHZhbHVlKS4KLX0KLQotCWlmIHskdHNfb25seX0gewotCQlyZWdzdWIge05vdGUgdGhhdCBkdWUoLnxcbikqSWYgdGhlfSAkbXNnICJJZiB0aGUiIG1zZwotCQlyZWdzdWIge1RvIGhhdmUgU1NWTkMgYWN0KC58XG4pKn0gJG1zZyAiIiBtc2cKLQl9Ci0JLmNodmlld2VyLnQgaW5zZXJ0IGVuZCAkbXNnCi0KLQlmcmFtZSAuY2h2aWV3ZXIucGF0aAotCWxhYmVsIC5jaHZpZXdlci5wYXRoLmwgLXRleHQgIlZOQyBWaWV3ZXI6IgotCWVudHJ5IC5jaHZpZXdlci5wYXRoLmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgY2hhbmdlX3ZuY3ZpZXdlcl9wYXRoCi0JYnV0dG9uIC5jaHZpZXdlci5wYXRoLmIgLXRleHQgIkJyb3dzZS4uLiIgLWNvbW1hbmQgc2V0X3ZpZXdlcl9wYXRoCi0JY2hlY2tidXR0b24gLmNodmlld2VyLnBhdGguciAtYW5jaG9yIHcgLXZhcmlhYmxlIHZuY3ZpZXdlcl9yZWFsdm5jNCAtdGV4dCBcCi0JCSJSZWFsVk5DIDQueCIKLQotCXBhY2sgLmNodmlld2VyLnBhdGgubCAtc2lkZSBsZWZ0Ci0JcGFjayAuY2h2aWV3ZXIucGF0aC5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQlwYWNrIC5jaHZpZXdlci5wYXRoLmIgLXNpZGUgbGVmdAotCXBhY2sgLmNodmlld2VyLnBhdGguciAtc2lkZSBsZWZ0Ci0KLQlidXR0b24gLmNodmlld2VyLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAuY2h2aWV3ZXI7IHNldCBjaGFuZ2Vfdm5jdmlld2VyIDB9Ci0JYmluZCAuY2h2aWV3ZXIgPEVzY2FwZT4ge2Rlc3Ryb3kgLmNodmlld2VyOyBzZXQgY2hhbmdlX3ZuY3ZpZXdlciAwfQotCXdtIHByb3RvY29sIC5jaHZpZXdlciBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5jaHZpZXdlcjsgc2V0IGNoYW5nZV92bmN2aWV3ZXIgMH0KLQlidXR0b24gLmNodmlld2VyLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5jaHZpZXdlcjsgY2F0Y2gge3JhaXNlIC5vYX19Ci0JYmluZCAuY2h2aWV3ZXIucGF0aC5lIDxSZXR1cm4+IHtkZXN0cm95IC5jaHZpZXdlcjsgY2F0Y2gge3JhaXNlIC5vYX19Ci0KLQlwYWNrIC5jaHZpZXdlci50IC5jaHZpZXdlci5wYXRoIC5jaHZpZXdlci5jYW5jZWwgLmNodmlld2VyLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLmNodmlld2VyCi0Jd20gcmVzaXphYmxlIC5jaHZpZXdlciAxIDAKLQotCWZvY3VzIC5jaHZpZXdlci5wYXRoLmUgCi19Ci0KLXByb2MgcG9ydF9yZWRpcl9kaWFsb2cge30gewotCWdsb2JhbCBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzIGFkZGl0aW9uYWxfcG9ydF9yZWRpcnNfbGlzdAotCQotCXRvcGxldiAucmVkaXJzCi0Jd20gdGl0bGUgLnJlZGlycyAiQWRkaXRpb25hbCBQb3J0IFJlZGlyZWN0aW9ucyAodmlhIFNTSCkiCi0KLQlnbG9iYWwgaGVscF9mb250IHVuYW1lCi0Jc2V0IGggMzUKLQlpZiBbc21hbGxfaGVpZ2h0XSB7Ci0JCXNldCBoIDI3Ci0JfQotCWV2YWwgdGV4dCAucmVkaXJzLnQgLXdpZHRoIDgwIC1oZWlnaHQgJGggJGhlbHBfZm9udAotCWFwcGx5X2JnIC5yZWRpcnMudAotCi0Jc2V0IG1zZyB7Ci0gICAgU3BlY2lmeSBhbnkgYWRkaXRpb25hbCBTU0ggcG9ydCByZWRpcmVjdGlvbnMgeW91IGRlc2lyZSBmb3IgdGhlCi0gICAgY29ubmVjdGlvbi4gIFB1dCBhcyBtYW55IGFzIHlvdSB3YW50IHNlcGFyYXRlZCBieSBzcGFjZXMuICBUaGVzZSBvbmx5Ci0gICAgYXBwbHkgdG8gU1NIIGFuZCBTU0grU1NMIGNvbm5lY3Rpb25zLCB0aGV5IGRvIG5vdCBhcHBseSB0byBQdXJlIFNTTAotICAgIGNvbm5lY3Rpb25zLgotCi0gICAgLUwgcG9ydDE6aG9zdDpwb3J0MiAgd2lsbCBsaXN0ZW4gb24gcG9ydDEgb24gdGhlIGxvY2FsIG1hY2hpbmUgKHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgeW91IGFyZSBzaXR0aW5nKSBhbmQgcmVkaXJlY3QgdGhlbSB0byBwb3J0MiBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0Ii4gICJob3N0IiBpcyByZWxhdGl2ZSB0byB0aGUgcmVtb3RlIHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVk5DIFNlcnZlcikuICBVc2UgImxvY2FsaG9zdCIgZm9yIHRoZSByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lIGl0c2VsZi4KLQotICAgIC1SIHBvcnQxOmhvc3Q6cG9ydDIgIHdpbGwgbGlzdGVuIG9uIHBvcnQxIG9uIHRoZSByZW1vdGUgbWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVyZSB0aGUgVk5DIHNlcnZlciBpcyBydW5uaW5nKSBhbmQgcmVkaXJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtIHRvIHBvcnQyIG9uICJob3N0Ii4gICJob3N0IiBpcyByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBsb2NhbCBzaWRlICh3aGVyZSB5b3UgYXJlIHNpdHRpbmcpLgotICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAibG9jYWxob3N0IiBmb3IgdGhpcyBtYWNoaW5lLgotCi0gICAgUGVyaGFwcyB5b3Ugd2FudCBhIHJlZGlyIHRvIGEgd2ViIHNlcnZlciBpbnNpZGUgYW4gaW50cmFuZXQ6Ci0KLSAgICAgICAgLUwgODAwMTp3ZWItaW50OjgwCi0KLSAgICBPciB0byByZWRpciBhIHJlbW90ZSBwb3J0IHRvIHlvdXIgbG9jYWwgU1NIIGRhZW1vbjoKLQotICAgICAgICAtUiA1MDIyOmxvY2FsaG9zdDoyMgotCi0gICAgZXRjLiAgVGhlcmUgYXJlIG1hbnkgaW50ZXJlc3RpbmcgcG9zc2liaWxpdGllcy4KLQotICAgIFNvbWV0aW1lcywgZXNwZWNpYWxseSBmb3IgV2luZG93cyBTaGFyZXMsIHlvdSBjYW5ub3QgZG8gYSAtUiByZWRpciB0bwotICAgIGxvY2FsaG9zdCwgYnV0IG5lZWQgdG8gc3VwcGx5IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZQotICAgIChlLmcuIGJ5IGRlZmF1bHQgdGhlIFNoYXJlcyBkbyBub3QgbGlzdGVuIG9uIGxvY2FsaG9zdDoxMzkpLiAgQXMgYQotICAgIGNvbnZlbmllbmNlIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgLVIgMTEzOTpJUDoxMzkgKGZvciBhbnkgcG9ydAotICAgIG51bWJlcnMpIGFuZCB0aGUgSVAgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gYmUgZXhwYW5kZWQuICBJZiB0aGlzIGZhaWxzCi0gICAgZm9yIHNvbWUgcmVhc29uIHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRoZSBhY3R1YWwgbnVtZXJpY2FsIElQIGFkZHJlc3MuCi19Ci0JLnJlZGlycy50IGluc2VydCBlbmQgJG1zZwotCi0JZnJhbWUgLnJlZGlycy5wYXRoCi0JbGFiZWwgLnJlZGlycy5wYXRoLmwgLXRleHQgIlBvcnQgUmVkaXJzOiIKLQllbnRyeSAucmVkaXJzLnBhdGguZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBhZGRpdGlvbmFsX3BvcnRfcmVkaXJzX2xpc3QKLQotCXBhY2sgLnJlZGlycy5wYXRoLmwgLXNpZGUgbGVmdAotCXBhY2sgLnJlZGlycy5wYXRoLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JYnV0dG9uIC5yZWRpcnMuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtzZXQgYWRkaXRpb25hbF9wb3J0X3JlZGlycyAwOyBkZXN0cm95IC5yZWRpcnN9Ci0JYmluZCAucmVkaXJzIDxFc2NhcGU+IHtzZXQgYWRkaXRpb25hbF9wb3J0X3JlZGlycyAwOyBkZXN0cm95IC5yZWRpcnN9Ci0Jd20gcHJvdG9jb2wgLnJlZGlycyBXTV9ERUxFVEVfV0lORE9XIHtzZXQgYWRkaXRpb25hbF9wb3J0X3JlZGlycyAwOyBkZXN0cm95IC5yZWRpcnN9Ci0JYnV0dG9uIC5yZWRpcnMuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnJlZGlyc30KLQotCXBhY2sgLnJlZGlycy50IC5yZWRpcnMucGF0aCAucmVkaXJzLmNhbmNlbCAucmVkaXJzLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnJlZGlycwotCXdtIHJlc2l6YWJsZSAucmVkaXJzIDEgMAotCi0JZm9jdXMgLnJlZGlycy5wYXRoLmUKLX0KLQotcHJvYyBzdHVubmVsX3NlY19kaWFsb2cge30gewotCWdsb2JhbCBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb24KLQkKLQl0b3BsZXYgLnN0bHNlYwotCXdtIHRpdGxlIC5zdGxzZWMgIlNUVU5ORUwgTG9jYWwgUG9ydCBQcm90ZWN0aW9ucyIKLQotCWdsb2JhbCBoZWxwX2ZvbnQgdW5hbWUKLQkKLQlzZXQgaCAzNwotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IGggMjYKLQl9Ci0Jc2Nyb2xsX3RleHQgLnN0bHNlYy5mIDgyICRoCi0KLQlhcHBseV9iZyAuc3Rsc2VjLmYKLQotCXNldCBtc2cgewotICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiAiVW50cnVzdGVkIExvY2FsIFVzZXJzIiBpbiB0aGUgbWFpbiAnSGVscCcKLSAgICBwYW5lbCBmb3IgaW5mbyBhYm91dCB1c2VycyB3aG8gYXJlIGFibGUgdG8gbG9nIGludG8gdGhlIHdvcmtzdGF0aW9uCi0gICAgeW91IHJ1biBTU1ZOQyBvbiBhbmQgbWlnaHQgdHJ5IHRvIHVzZSB5b3VyIGVuY3J5cHRlZCB0dW5uZWwgdG8gZ2FpbgotICAgIGFjY2VzcyB0byB0aGUgcmVtb3RlIFZOQyBtYWNoaW5lLgotCi0gICAgT24gVW5peCwgZm9yIFNUVU5ORUwgU1NMIHR1bm5lbHMgd2UgcHJvdmlkZSB0d28gb3B0aW9ucyBhcyBleHRyYQotICAgIHNhZmVndWFyZHMgYWdhaW5zdCB1bnRydXN0ZWQgbG9jYWwgdXNlcnMuICBCb3RoIG9ubHkgYXBwbHkgdG8gVW5peC9NYWNPU1guCi0gICAgTm90ZSB0aGF0IEJvdGggb3B0aW9ucyBhcmUgKklHTk9SRUQqIGluIHJldmVyc2UgY29ubmVjdGlvbiAoTGlzdGVuKSBtb2RlLgotCi0gICAgMSkgVGhlIGZpcnN0IG9uZSAnVXNlIHN0dW5uZWwgRVhFQyBtb2RlJyAoaXQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGgKLSAgICAgICBvcHRpb24gMikuICBGb3IgdGhpcyBjYXNlIHRoZSBtb2RpZmllZCBTU1ZOQyBVbml4IHZpZXdlciBtdXN0IGJlCi0gICAgICAgdXNlZDogaXQgZXhlY3MgdGhlIHN0dW5uZWwgcHJvZ3JhbSBpbnN0ZWFkIG9mIGNvbm5lY3RpbmcgdG8gaXQgdmlhCi0gICAgICAgVENQL0lQLiAgVGh1cyB0aGVyZSBpcyBubyBsb2NhbGhvc3QgbGlzdGVuaW5nIHBvcnQgaW52b2x2ZWQgYXQgYWxsLgotCi0gICAgICAgVGhpcyBpcyB0aGUgYmVzdCBzb2x1dGlvbiBmb3IgU1NMIHN0dW5uZWwgdHVubmVscywgaXQgd29ya3Mgd2VsbCBhbmQKLSAgICAgICBpcyBjdXJyZW50bHkgZW5hYmxlZCBieSBkZWZhdWx0LiAgRGlzYWJsZSBpdCBpZiB0aGVyZSBhcmUgcHJvYmxlbXMuCi0KLSAgICAyKSBUaGUgc2Vjb25kIG9uZSAnVXNlIHN0dW5uZWwgSURFTlQgY2hlY2snLCB1c2VzIHRoZSBzdHVubmVsKDgpCi0gICAgICAgJ2lkZW50ID0gdXNlcm5hbWUnIHRvIHVzZSB0aGUgbG9jYWwgaWRlbnRkIGRhZW1vbiAoSURFTlQgUkZDIDE0MTMKLSAgICAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxNDEzLnR4dCkgdG8gY2hlY2sgdGhhdCB0aGUgbG9jYWxseQotICAgICAgIGNvbm5lY3RpbmcgcHJvZ3JhbSAodGhlIFNTVk5DIHZuY3ZpZXdlcikgaXMgYmVpbmcgcnVuIGJ5IHlvdXIgdXNlcmlkLgotICAgICAgIFNlZSB0aGUgc3R1bm5lbCg4KSBtYW4gcGFnZSBmb3IgZGV0YWlscy4KLQotICAgICAgIE5vcm1hbGx5IHRoZSBJREVOVCBjaGVjayBzZXJ2aWNlIGNhbm5vdCBiZSB0cnVzdGVkIG11Y2ggd2hlbiB1c2VkCi0gICAgICAgKnJlbW90ZWx5KiAodGhlIHJlbW90ZSBob3N0IG1heSBiZSBoYXZlIGluc3RhbGxlZCBhIG1vZGlmaWVkIGRhZW1vbikuCi0gICAgICAgSG93ZXZlciB3aGVuIHVzaW5nIHRoZSBJREVOVCBjaGVjayBzZXJ2aWNlICpsb2NhbGx5KiBpdCBzaG91bGQgYmUKLSAgICAgICByZWxpYWJsZS4gIElmIG5vdCwgaXQgbWVhbnMgdGhlIGxvY2FsIG1hY2hpbmUgKHdoZXJlIHlvdSBydW4gU1NWTkMpCi0gICAgICAgaGFzIGFscmVhZHkgYmVlbiByb290IGNvbXByb21pc2VkIGFuZCB5b3UgaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbS4KLQotICAgICAgIEVuYWJsaW5nICdVc2Ugc3R1bm5lbCBJREVOVCBjaGVjaycgcmVxdWlyZXMgYSB3b3JraW5nIGlkZW50ZCBvbiB0aGUKLSAgICAgICBsb2NhbCBtYWNoaW5lLiAgT2Z0ZW4gaXQgaXMgbm90IGluc3RhbGxlZCBvciBlbmFibGVkIChiZWNhdXNlIGl0IGlzIG5vdAotICAgICAgIGRlZW1lZCB0byBiZSB1c2VmdWwsIGV0YykuICBpZGVudGQgaXMgdXN1YWxseSBydW4gb3V0IG9mIHRoZSBpbmV0ZCg4KQotICAgICAgIHN1cGVyLXNlcnZlci4gIEV2ZW4gd2hlbiBpbnN0YWxsZWQgYW5kIHJ1bm5pbmcgaXQgaXMgb2Z0ZW4gY29uZmlndXJlZAotICAgICAgIGluY29ycmVjdGx5LiAgT24gYSBEZWJpYW4vbGVubnkgc3lzdGVtIHdlIGFjdHVhbGx5IGZvdW5kIHRoYXQgdGhlCi0gICAgICAga2VybmVsIG1vZHVsZSAndGNwX2RpYWcnIG5lZWRlZCB0byBiZSBsb2FkZWQhICgnbW9kcHJvYmUgdGNwX2RpYWcnKQotfQotCS5zdGxzZWMuZi50IGluc2VydCBlbmQgJG1zZwotCi0JcmFkaW9idXR0b24gLnN0bHNlYy5pZGVudCAtcmVsaWVmIHJpZGdlIC1hbmNob3IgdyAtdmFyaWFibGUgc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uX3R5cGUgLXZhbHVlICJpZGVudCIgLXRleHQgIlVzZSBzdHVubmVsIElERU5UIGNoZWNrIgotCXJhZGlvYnV0dG9uIC5zdGxzZWMuZXhlYyAgLXJlbGllZiByaWRnZSAtYW5jaG9yIHcgLXZhcmlhYmxlIHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbl90eXBlIC12YWx1ZSAiZXhlYyIgIC10ZXh0ICJVc2Ugc3R1bm5lbCBFWEVDIG1vZGUiCi0KLQlidXR0b24gLnN0bHNlYy5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge3NldCBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb24gMDsgZGVzdHJveSAuc3Rsc2VjfQotCWJpbmQgLnN0bHNlYyA8RXNjYXBlPiB7c2V0IHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbiAwOyBkZXN0cm95IC5zdGxzZWN9Ci0Jd20gcHJvdG9jb2wgLnN0bHNlYyBXTV9ERUxFVEVfV0lORE9XIHtzZXQgc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uIDA7IGRlc3Ryb3kgLnN0bHNlY30KLQlidXR0b24gLnN0bHNlYy5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7aWYgeyRzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fdHlwZSA9PSAibm9uZSJ9IHtzZXQgc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uIDB9OyBkZXN0cm95IC5zdGxzZWN9Ci0KLQlwYWNrIC5zdGxzZWMuZiAuc3Rsc2VjLmV4ZWMgLnN0bHNlYy5pZGVudCAuc3Rsc2VjLmNhbmNlbCAuc3Rsc2VjLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnN0bHNlYwotCXdtIHJlc2l6YWJsZSAuc3Rsc2VjIDEgMAotfQotCi1wcm9jIGRpc2FibGVfc3NsX3dvcmthcm91bmRzX2RpYWxvZyB7fSB7Ci0JZ2xvYmFsIGRpc2FibGVfc3NsX3dvcmthcm91bmRzIGRpc2FibGVfc3NsX3dvcmthcm91bmRzX3R5cGUKLQkKLQl0b3BsZXYgLnNzbHdyawotCXdtIHRpdGxlIC5zc2x3cmsgIkRpc2FibGUgU1NMIFdvcmthcm91bmRzIgotCi0JZ2xvYmFsIGhlbHBfZm9udCB1bmFtZQotCXNldCBoIDM2Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyNAotCX0KLQlzY3JvbGxfdGV4dCAuc3Nsd3JrLmYgODYgJGgKLQotCWFwcGx5X2JnIC5zc2x3cmsuZgotCi0Jc2V0IG1zZyB7Ci0gICAgU29tZSBTU0wgaW1wbGVtZW50YXRpb25zIGFyZSBpbmNvbXBsZXRlIG9yIGJ1Z2d5IG9yIGRvIG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMuICBTU1ZOQyB1c2VzIFNUVU5ORUwgZm9yIGl0cyBTU0wgZW5jcnlwdGlvbiwKLSAgICBhbmQgU1RVTk5FTCB1c2VzIHRoZSBPcGVuU1NMIFNTTCBpbXBsZW1lbnRhdGlvbi4KLQotICAgIFRoaXMgY2F1c2VzIHNvbWUgcHJvYmxlbXMgd2l0aCBub24tT3BlblNTTCBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIFZOQyBzZXJ2ZXIKLSAgICBzaWRlLiAgVGhlIG1vc3Qgbm90aWNhYmxlIG9uZSBpcyB0aGUgVWx0cmFWTkMgU2luZ2xlIENsaWNrIElJSSAoU1NMKSBzZXJ2ZXI6Ci0KLSAgICAgICBodHRwOi8vd3d3LnV2bmMuY29tL3BjaGVscHdhcmUvU0NJSUkvaW5kZXguaHRtbAotCi0gICAgSXQgY2FuIG1ha2UgYSByZXZlcnNlIGNvbm5lY3Rpb24gdG8gU1NWTkMgdmlhIGFuIGVuY3J5cHRlZCBTU0wgdHVubmVsLgotCi0gICAgVW5mb3J0dW5hdGVseSwgaW4gdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHdpdGggU1RVTk5FTCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlCi0gICAgZHJvcHBlZCBhZnRlciAyLTE1IG1pbnV0ZXMgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgcGFja2V0LgotCi0gICAgQmVjYXVzZSBvZiB0aGlzLCBieSBkZWZhdWx0IFNTVk5DIHdpbGwgZW5hYmxlIHNvbWUgU1NMIHdvcmthcm91bmRzIHRvIG1ha2UKLSAgICBjb25uZWN0aW9ucyBsaWtlIHRoZXNlIHdvcmsuICBUaGlzIGlzIHRoZSBTVFVOTkVMICdvcHRpb25zID0gQUxMJyBzZXR0aW5nOgotICAgIGl0IGVuYWJsZXMgYSBiYXNpYyBzZXQgb2YgU1NMIHdvcmthcm91bmRzLgotCi0gICAgWW91IGNhbiByZWFkIGFsbCBhYm91dCB0aGVzZSB3b3JrYXJvdW5kcyBpbiB0aGUgc3R1bm5lbCg4KSBtYW5wYWdlIGFuZCB0aGUKLSAgICBPcGVuU1NMIFNTTF9DVFhfc2V0X29wdGlvbnMoMykgbWFucGFnZS4KLQotICAgIFdoeSBhcmUgd2UgbWVudGlvbmluZyB0aGlzPyAgU1RVTk5FTFMncyAnb3B0aW9ucyA9IEFMTCcgbG93ZXJzIHRoZSBTU0wKLSAgICBzZWN1cml0eSBhIGxpdHRsZSBiaXQuICBJZiB5b3Uga25vdyB5b3UgZG8gbm90IGhhdmUgYW4gaW5jb21wYXRpYmxlIFNTTAotICAgIGltcGxlbWVudGF0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZSAoZS5nLiBhbnkgb25lIHVzaW5nIE9wZW5TU0wgaXMgY29tcGF0aWJsZSwKLSAgICB4MTF2bmMgaW4gcGFydGljdWxhciksIHRoZW4geW91IGNhbiByZWdhaW4gdGhhdCBsaXR0bGUgYml0IG9mIHNlY3VyaXR5IGJ5Ci0gICAgc2VsZWN0aW5nIHRoZSAiRGlzYWJsZSBTU0wgV29ya2Fyb3VuZHMiIG9wdGlvbi4KLQotICAgICJEaXNhYmxlIEFsbCBTU0wgV29ya2Fyb3VuZHMiIHNlbGVjdGVkIGJlbG93IHdpbGwgZG8gdGhhdC4gIE9uIHRoZSBvdGhlciBoYW5kLAotICAgIGNob29zZSAiS2VlcCB0aGUgRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIFdvcmthcm91bmQiIHRvIHJldGFpbiB0aGF0IG9uZSwKLSAgICBjb21tb25seSBuZWVkZWQgd29ya2Fyb3VuZC4KLQotICAgIEJUVywgeW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFNUVU5ORUxfRVhUUkFfT1BUU19VU0VSIHRvIGFkZAotICAgIGFueSBsaW5lcyB0byB0aGUgU1RVTk5FTCBnbG9iYWwgY29uZmlnIHRoYXQgeW91IHdhbnQgdG8uICBTZWUgdGhlIHN0dW5uZWwoOCkKLSAgICBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgotfQotCS5zc2x3cmsuZi50IGluc2VydCBlbmQgJG1zZwotCi0JcmFkaW9idXR0b24gLnNzbHdyay5ub25lICAgIC1yZWxpZWYgcmlkZ2UgLWFuY2hvciB3IC12YXJpYWJsZSBkaXNhYmxlX3NzbF93b3JrYXJvdW5kc190eXBlIC12YWx1ZSAibm9uZSIgLXRleHQgIkRpc2FibGUgQWxsIFdvcmthcm91bmRzIgotCXJhZGlvYnV0dG9uIC5zc2x3cmsubm9lbXB0eSAgLXJlbGllZiByaWRnZSAtYW5jaG9yIHcgLXZhcmlhYmxlIGRpc2FibGVfc3NsX3dvcmthcm91bmRzX3R5cGUgLXZhbHVlICJub2VtcHR5IiAgLXRleHQgIktlZXAgdGhlIERPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyBXb3JrYXJvdW5kIgotCi0JYnV0dG9uIC5zc2x3cmsuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtzZXQgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHMgMDsgZGVzdHJveSAuc3Nsd3JrfQotCWJpbmQgLnNzbHdyayA8RXNjYXBlPiB7c2V0IGRpc2FibGVfc3NsX3dvcmthcm91bmRzIDA7IGRlc3Ryb3kgLnNzbHdya30KLQl3bSBwcm90b2NvbCAuc3Nsd3JrIFdNX0RFTEVURV9XSU5ET1cge3NldCBkaXNhYmxlX3NzbF93b3JrYXJvdW5kcyAwOyBkZXN0cm95IC5zc2x3cmt9Ci0JYnV0dG9uIC5zc2x3cmsuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLnNzbHdya30KLQotCXBhY2sgLnNzbHdyay5mIC5zc2x3cmsubm9uZSAuc3Nsd3JrLm5vZW1wdHkgLnNzbHdyay5jYW5jZWwgLnNzbHdyay5kb25lIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQljZW50ZXJfd2luIC5zc2x3cmsKLQl3bSByZXNpemFibGUgLnNzbHdyayAxIDAKLX0KLQotcHJvYyB1cGRhdGVfbm9fdWx0cmFfZHNtIHt9IHsKLQlnbG9iYWwgdWx0cmFfZHNtX25vdWx0cmEKLQlnbG9iYWwgdWx0cmFfZHNtX3R5cGUKLQotCWZvcmVhY2ggYiB7YmYgZGVzMyBhZXMgYWVzMjU2IGwgZX0gewotCQlpZiB7ISAkdWx0cmFfZHNtX25vdWx0cmF9IHsKLQkJCS51bHRyYWRzbS5ub3UuJGIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQl9IGVsc2UgewotCQkJLnVsdHJhZHNtLm5vdS4kYiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCQl9Ci0JfQotCWlmIHshICR1bHRyYV9kc21fbm91bHRyYX0gewotCQlpZiB7JHVsdHJhX2RzbV90eXBlID09ICJhcmM0In0gewotCQkJOwotCQl9IGVsc2VpZiB7JHVsdHJhX2RzbV90eXBlID09ICJhZXN2MiJ9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyR1bHRyYV9kc21fdHlwZSA9PSAibXNyYzQifSB7Ci0JCQk7Ci0JCX0gZWxzZWlmIHskdWx0cmFfZHNtX3R5cGUgPT0gIm1zcmM0X3NjIn0gewotCQkJOwotCQl9IGVsc2VpZiB7JHVsdHJhX2RzbV90eXBlID09ICJzZWN1cmV2bmMifSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgdWx0cmFfZHNtX3R5cGUgZ3Vlc3MKLQkJfQotCQljYXRjaCB7LnVsdHJhZHNtLmtleS5zZWN1cmV2bmMgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWNhdGNoIHsudWx0cmFkc20ua2V5Lm1zcmM0X3NjICBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQl9IGVsc2UgewotCQljYXRjaCB7LnVsdHJhZHNtLmtleS5zZWN1cmV2bmMgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJY2F0Y2ggey51bHRyYWRzbS5rZXkubXNyYzRfc2MgIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JfQotfQotCi1wcm9jIHVsdHJhX2RzbV9kaWFsb2cge30gewotCWdsb2JhbCB1bHRyYV9kc20gdWx0cmFfZHNtX2ZpbGUgdWx0cmFfZHNtX3R5cGUKLQkKLQl0b3BsZXYgLnVsdHJhZHNtCi0Jd20gdGl0bGUgLnVsdHJhZHNtICJVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW4iCi0KLQlnbG9iYWwgaGVscF9mb250Ci0Jc2V0IGggNDAKLQlpZiBbc21hbGxfaGVpZ2h0XSB7Ci0JCXNldCBoIDIyCi0JfQotCXNjcm9sbF90ZXh0IC51bHRyYWRzbS5mIDg1ICRoCi0KLQlzZXQgbXNnIHsKLSAgICBPbiBVbml4IGFuZCBNYWNPU1ggd2l0aCB0aGUgcHJvdmlkZWQgU1NWTkMgdm5jdmlld2VyLCB5b3UgY2FuIGNvbm5lY3QgdG8gYW4KLSAgICBVbHRyYVZOQyBzZXJ2ZXIgdGhhdCBpcyB1c2luZyBvbmUgb2YgaXRzIERTTSBlbmNyeXB0aW9uIHBsdWdpbnM6IE1TUkM0LCBBUkM0LAotICAgIEFFU1YyLCBhbmQgU2VjdXJlVk5DLiBNb3JlIGluZm8gYXQ6IGh0dHA6Ly93d3cudXZuYy5jb20vZmVhdHVyZXMvZW5jcnlwdGlvbi5odG1sCi0KLSAgICBJTVBPUlRBTlQ6IFRoZSBVbHRyYVZOQyBEU00gTVNSQzQsIEFSQzQsIGFuZCBBRVNWMiBpbXBsZW1lbnRhdGlvbnMgY29udGFpbgotICAgIHVuZml4ZWQgZXJyb3JzIHRoYXQgY291bGQgYWxsb3cgYW4gZWF2ZXNkcm9wcGVyIHRvIHJlY292ZXIgdGhlIHNlc3Npb24KLSAgICBrZXkgb3IgdHJhZmZpYyBlYXNpbHkuICBUaGV5IG9mdGVuIGRvIG5vdCBwcm92aWRlIHN0cm9uZyBlbmNyeXB0aW9uLCBidXQKLSAgICBvbmx5IHByb3ZpZGUgYmFzaWMgb2JzY3VyaXR5IGluc3RlYWQuICBEbyBub3QgdXNlIHRoZW0gd2l0aCBjcml0aWNhbCBkYXRhLgotICAgIFRoZSBuZXdlciBTZWN1cmVWTkMgUGx1Z2luIGRvZXMgbm90IHN1ZmZlciBmcm9tIHRoZXNlIHByb2JsZW1zLgotCi0gICAgU2VlIHRoZSBib3R0b20gb2YgdGhpcyBoZWxwIHRleHQgZm9yIGhvdyB0byB1c2Ugc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0aAotICAgIE5vbi1VbHRyYVZOQyBzZXJ2ZXJzIChmb3IgZXhhbXBsZSwgeDExdm5jIDAuOS41IG9yIGxhdGVyKS4gIFRoaXMgbW9kZSBkb2VzIG5vdAotICAgIHN1ZmZlciB0aGUgc2hvcnRjb21pbmdzIG9mIHRoZSBVbHRyYVZOQyBNU1JDNCwgQVJDNCwgYW5kIEFFU1YyIGltcGxlbWVudGF0aW9ucy4KLQotICAgIFlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB0aGUgY29ycmVzcG9uZGluZyBVbHRyYVZOQyBlbmNyeXB0aW9uIGtleSAoY3JlYXRlZAotICAgIGJ5IHlvdSB1c2luZyBhbiBVbHRyYVZOQyBzZXJ2ZXIgb3Igdmlld2VyKS4gIEl0IGlzIHVzdWFsbHkgY2FsbGVkICdyYzQua2V5JwotICAgIChmb3IgTVNSQzQpLCAnYXJjNC5rZXknIChmb3IgQVJDNCksIGFuZCAnYWVzdjIua2V5JyAoZm9yIEFFU1YyKS4gIFNwZWNpZnkgdGhlCi0gICAgcGF0aCB0byBpdCBvciBCcm93c2UgZm9yIGl0LiAgQWxzbywgc3BlY2lmeSB3aGljaCB0eXBlIG9mIHBsdWdpbiBpdCBpcyAob3IgdXNlCi0gICAgJ2d1ZXNzJyB0byBoYXZlIGl0IGd1ZXNzIHZpYSB0aGUgYmVmb3JlIG1lbnRpb25lZCBmaWxlbmFtZXMpLgotCi0gICAgVGhlIGNob2ljZSAiVVZOQyBTQyIgZW5hYmxlcyBhIHNwZWNpYWwgd29ya2Fyb3VuZCBmb3IgdXNlIHdpdGggVWx0cmFWTkMgU2luZ2xlCi0gICAgQ2xpY2sgYW5kIHRoZSBNU1JDNCBwbHVnaW4uICBJdCBtYXkgbm90IGJlIG5lZWRlZCBvbiByZWNlbnQgU0MgKGUuZy4gZnJvbQotICAgIH4yMDA5IGFuZCBsYXRlcjsgc2VsZWN0ICJNU1JDNCIgZm9yIHRoZXNlIG5ld2VyIG9uZXMuKQotCi0gICAgWW91IGNhbiBhbHNvIHNwZWNpZnkgcHc9bXktcGFzc3dvcmQgaW5zdGVhZCBvZiBhIGtleWZpbGUuICBVc2Ugc2luZ2xlIHF1b3RlcwotICAgIHB3PScuLi4uJyBpZiB0aGUgcGFzc3dvcmQgY29udGFpbnMgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzIGAhJCYqKCl7fVtdfDs8Pj8KLQotICAgIFVzZSB0aGUgbGl0ZXJhbCBzdHJpbmcgJ3B3PVZOQ1BBU1NXRCcgdG8gaGF2ZSB0aGUgVk5DIHBhc3N3b3JkIHRoYXQgeW91Ci0gICAgZW50ZXJlZCBpbnRvIHRoZSAnVk5DIFBhc3N3b3JkOicgYmUgdXNlZCBmb3IgdGhlIHB3PS4uLgotCi0gICAgU1NMIGFuZCBTU0ggdHVubmVscyBkbyBub3QgYXBwbHkgaW4gdGhpcyBtb2RlIChhbnkgc2V0dGluZ3MgYXJlIGlnbm9yZWQuKQotCi0gICAgUHJveHlpbmcgd29ya3MgaW4gdGhpcyBtb2RlLCBhcyB3ZWxsIGFzIFJldmVyc2UgQ29ubmVjdGlvbnMgKExpc3RlbikKLQotICAgIFRoZSBjaG9pY2UgIlNlY3VyZVZOQyIgcmVmZXJzIHRvIHRoZSBTZWN1cmVWTkMgUGx1Z2luIHVzaW5nIDEyOCBiaXQgQUVTIG9yCi0gICAgQVJDNCB3aXRoIDIwNDggYml0IFJTQSBrZXkgZXhjaGFuZ2UgZGVzY3JpYmVkIGhlcmU6Ci0KLSAgICAgICAgICBodHRwOi8vYWRhbXdhbGxpbmcuY29tL1NlY3VyZVZOQwotCi0gICAgTm90ZSBpbiBpdHMgZGVmYXVsdCBtb2RlIFNlY3VyZVZOQyBpcyAqVnVsbmVyYWJsZSogdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcwotICAgIChlbmNyeXB0aW9uIGJ1dCBubyBzZXJ2ZXIgYXV0aGVudGljYXRpb24pIHNvIGRvIG5vdCB1c2UgaXQgd2l0aCBjcml0aWNhbCBkYXRhLgotICAgIEluIFNlY3VyZVZOQyBtb2RlIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgYSAnVWx0cmEgRFNNIEtleWZpbGUnLiAgSG93ZXZlciwKLSAgICBpZiB5b3UgRE8gc3VwcGx5IGEga2V5ZmlsZSBmaWxlbmFtZSAocmVjb21tZW5kZWQpIGlmIHRoYXQgZmlsZSBkb2VzIG5vdCBleGlzdAotICAgIHlvdSB3aWxsIGJlIHByb21wdGVkIGlmIHlvdSB3YW50IHRvIHNhdmUgdGhlIFVsdHJhVk5DIHNlcnZlcidzIFJTQSBrZXkgaW4gaXQuCi0gICAgVGhlIGtleSdzIE1ENSBjaGVja3N1bSBpcyBkaXNwbGF5ZWQgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGF0IHRoZSBrZXkgaXMKLSAgICB0cnVzdGVkLiAgT25lIHdheSB0byBwcmludCBvdXQgdGhlIFNlY3VyZVZOQyBwdWJsaWMga2V5IE1ENSBjaGVja3N1bSBpczoKLQotICAgIG9wZW5zc2wgcnNhIC1pbmZvcm0gREVSIC1vdXRmb3JtIERFUiAtcHVib3V0IC1pbiAuL1NlcnZlcl9TZWN1cmVWTkMucGtleSB8IGRkIGJzPTEgc2tpcD0yNCB8IG1kNXN1bQotCi0gICAgVGhlbiBvbiBzdWJzZXF1ZW50IGNvbm5lY3Rpb25zLCBpZiB5b3UgY29udGludWUgdG8gc3BlY2lmeSB0aGlzIGZpbGVuYW1lLCB0aGUKLSAgICBTZWN1cmVWTkNQbHVnaW4gc2VydmVyJ3MgUlNBIGtleSB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZmlsZSdzIGNvbnRlbnRzCi0gICAgYW5kIGlmIHRoZXkgZGlmZmVyIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZC4KLQotICAgIE5PVEUsIEhvd2V2ZXIsIGlmIHRoZSBTZWN1cmVWTkMga2V5ZmlsZSBlbmRzIGluIHRoZSBzdHJpbmcgJ0NsaWVudEF1dGgucGtleScKLSAgICB0aGVuIGl0cyBjb250ZW50cyBhcmUgdXNlZCBmb3IgU2VjdXJlVk5DJ3Mgbm9ybWFsIENsaWVudCBBdXRoZW50aWNhdGlvbiBkaWFsb2cKLSAgICAoeW91IG5lZWQgdG8gdXNlIFdpbmRvd3MgU2VjdXJlVk5DUGx1Z2luIHRvIGdlbmVyYXRlIHRoaXMgZmlsZSBvbiB0aGUgc2VydmVyCi0gICAgc2lkZSwgaXQgaXMgdXN1YWxseSBjYWxsZWQgIlZpZXdlcl9DbGllbnRBdXRoLnBrZXkiLCBhbmQgdGhlbiBzYWZlbHkgY29weSBpdAotICAgIHRvIHRoZSB2aWV3ZXIgc2lkZS4pICBJZiB5b3Ugd2FudCB0byBkbyBCT1RIIENsaWVudCBBdXRoIGFuZCBzZXJ2ZXIgUlNBIGtleQotICAgIHN0b3JpbmcgKHJlY29tbWVuZGVkKSwgaGF2ZSB0aGUga2V5ZmlsZSBlbmQgaW4gJ0NsaWVudEF1dGgucGtleS5yc2EnOyB0aGF0IHdheQotICAgIHRoZSBmaWxlIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB0aGUgc2VydmVyIFJTQSBrZXkgYW5kIHRoZW4gdGhlICcucnNhJyBpcwotICAgIHRyaW1tZWQgb2ZmIGFuZCB0aGUgcmVtYWluZGVyIHVzZWQgZm9yIHRoZSBTZWN1cmVWTkMgQ2xpZW50IEF1dGggZGF0YSBmaWxlbmFtZS4KLQotICAgIE5vdGUgdGhhdCBkZXNwaXRlIGl0cyBpbnRlbnRpb25zLCBDbGllbnQgQXV0aGVudGljYXRpb24gaW4gdGhlIEZJUlNUIHJlbGVhc2Ugb2YKLSAgICBTZWN1cmVWTkMgaXMgc3RpbGwgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIEV2ZW4gd2hlbiB0aGF0Ci0gICAgaXMgZml4ZWQsIFNlY3VyZVZOQyBDbGllbnQgQXV0aGVudGljYXRpb24gaXMgc3RpbGwgc3VzY2VwdGlibGUgdG8gInNwb29maW5nIgotICAgIGF0dGFja3Mgd2hlcmUgdGhlIHZpZXdlciB1c2VyIG1heSBiZSB0cmlja2VkIGludG8gcmV2ZWFsaW5nIGhpcyBWTkMgb3IgTVMtTG9nb24KLSAgICBwYXNzd29yZCBpZiBoaXMgY29ubmVjdGlvbiBpcyBpbnRlcmNlcHRlZC4gIEl0IGlzIHJlY29tbWVuZGVkIHlvdSB2ZXJpZnkgYW5kCi0gICAgc2F2ZSB0aGUgU2VydmVyIGtleSAoc2VlIGFib3ZlKSBpbiBhZGRpdGlvbiB0byB1c2luZyBDbGllbnQgQXV0aGVudGljYXRpb24uCi0KLSAgICBVbHRyYVZOQyBEU00gZW5jcnlwdGlvbiBtb2RlcyBhcmUgY3VycmVudGx5IGV4cGVyaW1lbnRhbCBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICB0aGUgVWx0cmFWTkMgRFNNIHBsdWdpbiBhbHNvIG1vZGlmaWVzIHRoZSBSRkIgcHJvdG9jb2woISksIGFuZCBzbyB0aGUgU1NWTkMKLSAgICB2bmN2aWV3ZXIgaGFkIHRvIGJlIG1vZGlmaWVkIHRvIHN1cHBvcnQgaXQuICBUaGUgdGlnaHQsIHpsaWIsIGFuZCBzb21lIG1pbm9yCi0gICAgZW5jb2RpbmdzIGN1cnJlbnRseSBkbyBub3Qgd29yayBpbiB0aGlzIG1vZGUgYW5kIGFyZSBkaXNhYmxlZC4KLQotICAgIE5vdGUgdGhhdCB0aGlzIG1vZGUgYWxzbyByZXF1aXJlcyB0aGUgdXRpbGl0eSB0b29sIG5hbWVkICd1bHRyYXZuY19kc21faGVscGVyJwotICAgIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgU1NWTkMga2l0LgotCi0gICAgU2VsZWN0ICdOb24tVWx0cmEgRFNNJyB0byB1c2Ugc3ltbWV0cmljIGVuY3J5cHRpb24gdG8gYSBOb24tVWx0cmFWTkMgc2VydmVyIHZpYQotICAgIGEgc3VwcG9ydGVkIHN5bW1ldHJpYyBrZXkgY2lwaGVyLiAgeDExdm5jIHN1cHBvcnRzIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHZpYSwKLSAgICBlLmcuLCAieDExdm5jIC1lbmMgYWVzdjI6Li9teS5rZXkiLiAgRXh0cmEgY2lwaGVycyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBtb2RlCi0gICAgKGUuZy4gYmxvd2Zpc2ggYW5kIDNkZXMpLiAgJ1VWTkMgU0MnIGFuZCBTZWN1cmVWTkMgZG8gbm90IGFwcGx5IGluIHRoaXMgbW9kZS4KLQotICAgIE5vdGUgZm9yIHRoZSBOb24tVWx0cmEgRFNNIGNhc2UgaXQgd2lsbCBhbHNvIHdvcmsgd2l0aCBhbnkgVk5DIFZpZXdlcgotICAgIChpLmUuIHNlbGVjdGVkIGJ5IE9wdGlvbnMgLT4gQWR2YW5jZWQgLT4gQ2hhbmdlIFZOQyBWaWV3ZXIpIG5vdCBvbmx5IHRoZQotICAgIHN1cHBsaWVkIFNTVk5DIHZuY3ZpZXdlci4KLQotICAgIEZvciBleHBlcnRzOiBZb3UgY2FuIGFsc28gc2V0IHRoZSByYW5kb20gc2FsdCBzaXplIGFuZCBpbml0aWFsaXphdGlvbiB2ZWN0b3IKLSAgICBzaXplIGluIFNhbHQsSVYgZm9yIGV4YW1wbGUgIjgsMTYiLiAgU2VlIHRoZSB4MTF2bmMgYW5kICd1bHRyYXZuY19kc21faGVscGVyCi0gICAgLWhlbHAnIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbyBvbiB0aGlzLgotfQotCi0JLnVsdHJhZHNtLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWZyYW1lIC51bHRyYWRzbS5wYXRoCi0JbGFiZWwgLnVsdHJhZHNtLnBhdGgubCAtdGV4dCAiVWx0cmEgRFNNIEtleWZpbGU6IgotCWVudHJ5IC51bHRyYWRzbS5wYXRoLmUgLXdpZHRoIDQwIC10ZXh0dmFyaWFibGUgdWx0cmFfZHNtX2ZpbGUKLQlidXR0b24gLnVsdHJhZHNtLnBhdGguYiAtdGV4dCAiQnJvd3NlLi4uIiAtY29tbWFuZCB7c2V0X3VsdHJhX2RzbV9maWxlIC51bHRyYWRzbX0KLQotCXBhY2sgLnVsdHJhZHNtLnBhdGgubCAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ucGF0aC5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQlwYWNrIC51bHRyYWRzbS5wYXRoLmIgLXNpZGUgbGVmdAotCi0JZnJhbWUgLnVsdHJhZHNtLmtleQotCWxhYmVsIC51bHRyYWRzbS5rZXkubCAtdGV4dCAiVHlwZSBvZiBLZXk6ICAgICAgICAiCi0JcmFkaW9idXR0b24gLnVsdHJhZHNtLmtleS5ndWVzcyAtcGFkeSAxIC1hbmNob3IgdyAtdmFyaWFibGUgdWx0cmFfZHNtX3R5cGUgLXZhbHVlIGd1ZXNzIFwKLQkJLXRleHQgIkd1ZXNzIgotCXJhZGlvYnV0dG9uIC51bHRyYWRzbS5rZXkuYXJjNCAtcGFkeSAxIC1hbmNob3IgdyAtdmFyaWFibGUgdWx0cmFfZHNtX3R5cGUgLXZhbHVlIGFyYzQgXAotCQktdGV4dCAiQVJDNCIKLQotCXJhZGlvYnV0dG9uIC51bHRyYWRzbS5rZXkuYWVzdjIgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbV90eXBlIC12YWx1ZSBhZXN2MiBcCi0JCS10ZXh0ICJBRVNWMiIKLQotCXJhZGlvYnV0dG9uIC51bHRyYWRzbS5rZXkubXNyYzQgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbV90eXBlIC12YWx1ZSBtc3JjNCBcCi0JCS10ZXh0ICJNU1JDNCIKLQotCXJhZGlvYnV0dG9uIC51bHRyYWRzbS5rZXkubXNyYzRfc2MgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbV90eXBlIC12YWx1ZSBtc3JjNF9zYyBcCi0JCS10ZXh0ICJVVk5DIFNDIgotCi0JcmFkaW9idXR0b24gLnVsdHJhZHNtLmtleS5zZWN1cmV2bmMgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbV90eXBlIC12YWx1ZSBzZWN1cmV2bmMgXAotCQktdGV4dCAiU2VjdXJlVk5DIgotCi0JcGFjayAudWx0cmFkc20ua2V5LmwgLXNpZGUgbGVmdAotCXBhY2sgLnVsdHJhZHNtLmtleS5ndWVzcyAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ua2V5LmFyYzQgLXNpZGUgbGVmdAotCXBhY2sgLnVsdHJhZHNtLmtleS5hZXN2MiAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ua2V5Lm1zcmM0IC1zaWRlIGxlZnQKLQlwYWNrIC51bHRyYWRzbS5rZXkubXNyYzRfc2MgLXNpZGUgbGVmdAotCXBhY2sgLnVsdHJhZHNtLmtleS5zZWN1cmV2bmMgLXNpZGUgbGVmdAotCi0JZnJhbWUgLnVsdHJhZHNtLm5vdQotCWNoZWNrYnV0dG9uIC51bHRyYWRzbS5ub3UuY2IgLXRleHQgIk5vbi1VbHRyYSBEU00iIC12YXJpYWJsZSB1bHRyYV9kc21fbm91bHRyYSAtY29tbWFuZCB1cGRhdGVfbm9fdWx0cmFfZHNtCi0JcmFkaW9idXR0b24gLnVsdHJhZHNtLm5vdS5iZiAtcGFkeSAxIC1hbmNob3IgdyAtdmFyaWFibGUgdWx0cmFfZHNtX3R5cGUgLXZhbHVlIGJsb3dmaXNoIFwKLQkJLXRleHQgIkJsb3dmaXNoIgotCi0JcmFkaW9idXR0b24gLnVsdHJhZHNtLm5vdS5kZXMzIC1wYWR5IDEgLWFuY2hvciB3IC12YXJpYWJsZSB1bHRyYV9kc21fdHlwZSAtdmFsdWUgM2RlcyBcCi0JCS10ZXh0ICIzREVTIgotCi0JcmFkaW9idXR0b24gLnVsdHJhZHNtLm5vdS5hZXMgLXBhZHkgMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbV90eXBlIC12YWx1ZSAiYWVzLWNmYiIgXAotCQktdGV4dCAiQUVTLUNGQiIKLQotCXJhZGlvYnV0dG9uIC51bHRyYWRzbS5ub3UuYWVzMjU2IC1wYWR5IDEgLWFuY2hvciB3IC12YXJpYWJsZSB1bHRyYV9kc21fdHlwZSAtdmFsdWUgImFlczI1NiIgXAotCQktdGV4dCAiQUVTLTI1NiIKLQotCWxhYmVsIC51bHRyYWRzbS5ub3UubCAtdGV4dCAiIFNhbHQsSVYiCi0JZW50cnkgLnVsdHJhZHNtLm5vdS5lIC13aWR0aCA2IC10ZXh0dmFyaWFibGUgdWx0cmFfZHNtX3NhbHQKLQotCXBhY2sgLnVsdHJhZHNtLm5vdS5jYiAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ubm91LmJmIC1zaWRlIGxlZnQKLQlwYWNrIC51bHRyYWRzbS5ub3UuZGVzMyAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ubm91LmFlcyAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ubm91LmFlczI1NiAtc2lkZSBsZWZ0Ci0JcGFjayAudWx0cmFkc20ubm91LmwgLXNpZGUgbGVmdAotCXBhY2sgLnVsdHJhZHNtLm5vdS5lIC1zaWRlIGxlZnQgLWV4cGFuZCAwCi0KLQl1cGRhdGVfbm9fdWx0cmFfZHNtCi0KLQlidXR0b24gLnVsdHJhZHNtLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7ZGVzdHJveSAudWx0cmFkc207IHNldCB1bHRyYV9kc20gMH0KLQliaW5kIC51bHRyYWRzbSA8RXNjYXBlPiB7ZGVzdHJveSAudWx0cmFkc207IHNldCB1bHRyYV9kc20gMH0KLQl3bSBwcm90b2NvbCAudWx0cmFkc20gV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAudWx0cmFkc207IHNldCB1bHRyYV9kc20gMH0KLQlidXR0b24gLnVsdHJhZHNtLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC51bHRyYWRzbTsgY2F0Y2gge3JhaXNlIC5vYX19Ci0JYmluZCAudWx0cmFkc20ucGF0aC5lIDxSZXR1cm4+IHtkZXN0cm95IC51bHRyYWRzbTsgY2F0Y2gge3JhaXNlIC5vYX19Ci0KLQlwYWNrIC51bHRyYWRzbS5mIC51bHRyYWRzbS5wYXRoIC51bHRyYWRzbS5rZXkgLnVsdHJhZHNtLm5vdSAudWx0cmFkc20uY2FuY2VsIC51bHRyYWRzbS5kb25lIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQljZW50ZXJfd2luIC51bHRyYWRzbQotCXdtIHJlc2l6YWJsZSAudWx0cmFkc20gMSAwCi0KLQlmb2N1cyAudWx0cmFkc20ucGF0aC5lIAotfQotCi1wcm9jIHNzaF9rbm93bl9ob3N0c19kaWFsb2cge30gewotCWdsb2JhbCBzc2hfa25vd25faG9zdHMgc3NoX2tub3duX2hvc3RzX2ZpbGVuYW1lCi0JCi0JdG9wbGV2IC5zc2hrbm93bmhvc3RzCi0Jd20gdGl0bGUgLnNzaGtub3duaG9zdHMgIlByaXZhdGUgU1NIIEtub3duSG9zdHMgZmlsZSIKLQotCWdsb2JhbCBoZWxwX2ZvbnQKLQlzZXQgaCAzMQotCWlmIFtzbWFsbF9oZWlnaHRdIHsKLQkJc2V0IGggMjMKLQl9Ci0Jc2Nyb2xsX3RleHQgLnNzaGtub3duaG9zdHMuZiA4MCAkaAotCi0Jc2V0IG1zZyB7Ci0gICAgICBQcml2YXRlIFNTSCBLbm93bkhvc3RzIGZpbGU6Ci0KLSAgICAgICAgIE9uIFVuaXggaW4gU1NIIG1vZGUsIGxldCB0aGUgdXNlciBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQKLSAgICAgICAgIHNzaCBrbm93bl9ob3N0cyBmaWxlIHRvIGJlIHVzZWQgb25seSBieSB0aGUgY3VycmVudCBwcm9maWxlLgotICAgICAgICAgVGhpcyBpcyB0aGUgVXNlcktub3duSG9zdHNGaWxlIHNzaCBvcHRpb24gYW5kIGlzIGRlc2NyaWJlZCBpbiB0aGUKLSAgICAgICAgIHNzaF9jb25maWcoMSkgbWFuIHBhZ2UuICBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBwcm94eSAnbG9jYWxob3N0JwotICAgICAgICAgU1NIIGtleSBjb2xsaXNpb25zLgotCi0gICAgICAgICBOb3JtYWxseSBvbmUgc2hvdWxkIHNpbXBseSBsZXQgc3NoIHVzZSBpdHMgZGVmYXVsdCBmaWxlCi0gICAgICAgICB+Ly5zc2gva25vd25faG9zdHMgZm9yIHRyYWNraW5nIFNTSCBrZXlzLiAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoCi0gICAgICAgICB0aGF0IGhhcHBlbnMgd2hlbiBtdWx0aXBsZSBTU1ZOQyBjb25uZWN0aW9ucyB1c2UgbG9jYWxob3N0IHR1bm5lbAotICAgICAgICAgcG9ydCByZWRpcmVjdGlvbnMuICBUaGVzZSBtYWtlIHNzaCBjb25uZWN0IHRvICdsb2NhbGhvc3QnIG9uIHNvbWUKLSAgICAgICAgIHBvcnQgKHdoZXJlIHRoZSBwcm94eSBpcyBsaXN0ZW5pbmcuKSAgVGhlbiB0aGUgZGlmZmVyZW50IGtleXMKLSAgICAgICAgIGZyb20gdGhlIG11bHRpcGxlIHNzaCBzZXJ2ZXJzIGNvbGxpZGUgd2hlbiBzc2ggc2F2ZXMgdGhlbSB1bmRlcgotICAgICAgICAgJ2xvY2FsaG9zdCcgaW4gfi8uc3NoL2tub3duX2hvc3RzLgotCi0gICAgICAgICBTbyBpZiB5b3UgYXJlIHVzaW5nIGEgcHJveHkgd2l0aCBTU1ZOQyBvciBkb2luZyBhICJkb3VibGUgU1NICi0gICAgICAgICBnYXRld2F5IiB5b3VyIHNzaCB3aWxsIGNvbm5lY3QgdG8gYSBwcm94eSBwb3J0IG9uIGxvY2FsaG9zdCwgYW5kIHlvdQotICAgICAgICAgc2hvdWxkIHNldCBhIHByaXZhdGUgS25vd25Ib3N0cyBmaWxlIGZvciB0aGF0IGNvbm5lY3Rpb24gcHJvZmlsZS4KLSAgICAgICAgIFRoaXMgaXMgc2VjdXJlIGFuZCBhdm9pZHMgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrIChhcyBsb25nIGFzCi0gICAgICAgICB5b3UgYWN0dWFsbHkgdmVyaWZ5IHRoZSBpbml0aWFsIHNhdmUgb2YgdGhlIFNTSCBrZXkhKQotCi0gICAgICAgICBUaGUgZGVmYXVsdCBmaWxlIGxvY2F0aW9uIHdpbGwgYmU6Ci0KLSAgICAgICAgICAgICAgICAgIH4vLnZuYy9zc2hfa25vd25faG9zdHMvcHJvZmlsZS1uYW1lLmtub3duCi0KLSAgICAgICAgIGJ1dCB5b3UgY2FuIGNob29zZSBhbnkgcGxhY2UgeW91IGxpa2UuICBJdCBtdXN0IG9mIGNvdXJzZSBiZQotICAgICAgICAgdW5pcXVlIGFuZCBub3Qgc2hhcmVkIHdpdGggYW5vdGhlciBzc2ggY29ubmVjdGlvbiBvdGhlcndpc2UgdGhleQotICAgICAgICAgYm90aCBtYXkgY29tcGxhaW4gYWJvdXQgdGhlIGtleSBmb3IgJ2xvY2FsaG9zdCcgY2hhbmdpbmcsIGV0Yy4KLX0KLQotCS5zc2hrbm93bmhvc3RzLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWZyYW1lIC5zc2hrbm93bmhvc3RzLnBhdGgKLQlsYWJlbCAuc3Noa25vd25ob3N0cy5wYXRoLmwgLXRleHQgIlNTSCBLbm93bkhvc3RzIGZpbGU6IgotCWVudHJ5IC5zc2hrbm93bmhvc3RzLnBhdGguZSAtd2lkdGggNDAgLXRleHR2YXJpYWJsZSBzc2hfa25vd25faG9zdHNfZmlsZW5hbWUKLQlidXR0b24gLnNzaGtub3duaG9zdHMucGF0aC5iIC10ZXh0ICJCcm93c2UuLi4iIC1jb21tYW5kIHtzZXRfc3NoX2tub3duX2hvc3RzX2ZpbGUgLnNzaGtub3duaG9zdHN9Ci0KLQlwYWNrIC5zc2hrbm93bmhvc3RzLnBhdGgubCAtc2lkZSBsZWZ0Ci0JcGFjayAuc3Noa25vd25ob3N0cy5wYXRoLmUgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotCXBhY2sgLnNzaGtub3duaG9zdHMucGF0aC5iIC1zaWRlIGxlZnQKLQotCWJ1dHRvbiAuc3Noa25vd25ob3N0cy5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLnNzaGtub3duaG9zdHM7IHNldCBzc2hfa25vd25faG9zdHMgMH0KLQliaW5kIC5zc2hrbm93bmhvc3RzIDxFc2NhcGU+IHtkZXN0cm95IC5zc2hrbm93bmhvc3RzOyBzZXQgc3NoX2tub3duX2hvc3RzIDB9Ci0Jd20gcHJvdG9jb2wgLnNzaGtub3duaG9zdHMgV01fREVMRVRFX1dJTkRPVyB7ZGVzdHJveSAuc3Noa25vd25ob3N0czsgc2V0IHNzaF9rbm93bl9ob3N0cyAwfQotCWJ1dHRvbiAuc3Noa25vd25ob3N0cy5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAuc3Noa25vd25ob3N0czsgY2F0Y2gge3JhaXNlIC5vYX19Ci0JYmluZCAuc3Noa25vd25ob3N0cy5wYXRoLmUgPFJldHVybj4ge2Rlc3Ryb3kgLnNzaGtub3duaG9zdHM7IGNhdGNoIHtyYWlzZSAub2F9fQotCi0JcGFjayAuc3Noa25vd25ob3N0cy5mIC5zc2hrbm93bmhvc3RzLnBhdGggLnNzaGtub3duaG9zdHMuY2FuY2VsIC5zc2hrbm93bmhvc3RzLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnNzaGtub3duaG9zdHMKLQl3bSByZXNpemFibGUgLnNzaGtub3duaG9zdHMgMSAwCi0KLQlmb2N1cyAuc3Noa25vd25ob3N0cy5wYXRoLmUgCi19Ci0KLXByb2Mgc3NoX3NlY19kaWFsb2cge30gewotCWdsb2JhbCBzc2hfbG9jYWxfcHJvdGVjdGlvbgotCQotCXRvcGxldiAuc3Noc2VjCi0Jd20gdGl0bGUgLnNzaHNlYyAiU1NIIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMiCi0KLQlnbG9iYWwgaGVscF9mb250Ci0JZXZhbCB0ZXh0IC5zc2hzZWMudCAtd2lkdGggODAgLWhlaWdodCAyOCAkaGVscF9mb250Ci0KLQlhcHBseV9iZyAuc3Noc2VjLnQKLQotCXNldCBtc2cgewotICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiAiVW50cnVzdGVkIExvY2FsIFVzZXJzIiBpbiB0aGUgbWFpbiAnSGVscCcKLSAgICBwYW5lbCBmb3IgaW5mbyBhYm91dCB1c2VycyB3aG8gYXJlIGFibGUgdG8gbG9nIGludG8gdGhlIHdvcmtzdGF0aW9uCi0gICAgeW91IHJ1biBTU1ZOQyBvbiBhbmQgbWlnaHQgdHJ5IHRvIHVzZSB5b3VyIGVuY3J5cHRlZCB0dW5uZWwgdG8gZ2FpbgotICAgIGFjY2VzcyB0byB0aGUgcmVtb3RlIFZOQyBtYWNoaW5lLgotCi0gICAgT24gVW5peCwgZm9yIFNTSCB0dW5uZWxzIHdlIGhhdmUgYW4gTERfUFJFTE9BRCBoYWNrIChsaW1fYWNjZXB0LnNvKQotICAgIHRoYXQgd2lsbCBsaW1pdCBzc2ggZnJvbSBhY2NlcHRpbmcgYW55IGxvY2FsIHJlZGlyZWN0aW9uIGNvbm5lY3Rpb25zCi0gICAgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBvciBhZnRlciAzNSBzZWNvbmRzLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gICAgVGhlIGZpcnN0IFNTSCBwb3J0IHJlZGlyZWN0aW9uIGNvbm5lY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG9uZQotICAgIHRoYXQgdHVubmVscyB5b3VyIFZOQyBWaWV3ZXIgdG8gcmVhY2ggdGhlIHJlbW90ZSBzZXJ2ZXIuCi0KLSAgICBZb3UgY2FuIGFkanVzdCB0aGVzZSBkZWZhdWx0cyBMSU1fQUNDRVBUPTEgTElNX0FDQ0VQVF9USU1FPTM1IGJ5Ci0gICAgc2V0dGluZyB0aG9zZSBlbnYuIHZhcnMuIHRvIGRpZmZlcmVudCB2YWx1ZXMuIAotCi0gICAgTm90ZSB0aGF0IHRoZXJlIGlzIHN0aWxsIGEgd2luZG93IG9mIGEgZmV3IHNlY29uZHMgdGhlIFVudHJ1c3RlZAotICAgIExvY2FsIFVzZXIgY2FuIHRyeSB0byBjb25uZWN0IGJlZm9yZSB5b3VyIFZOQyBWaWV3ZXIgZG9lcy4gIFNvIHRoaXMKLSAgICBtZXRob2QgaXMgZmFyIGZyb20gcGVyZmVjdC4gIEJ1dCBvbmNlIHlvdXIgVk5DIHNlc3Npb24gaXMgZXN0YWJsaXNoZWQsCi0gICAgaGUgc2hvdWxkIGJlIGJsb2NrZWQgb3V0LiAgVGVzdCB0byBtYWtlIHN1cmUgYmxvY2tpbmcgaXMgdGFraW5nIHBsYWNlLgotCi0gICAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGRvaW5nIFNTSCBTZXJ2aWNlIHJlZGlyZWN0aW9ucwotICAgICdBZGRpdGlvbmFsIFBvcnQgUmVkaXJlY3Rpb25zICh2aWEgU1NIKScgdGhhdCByZWRpcmVjdCBhIGxvY2FsIHBvcnQKLSAgICB0byB0aGUgcmVtb3RlIHNlcnZlciB2aWEgc3NoIC1MLgotCi0gICAgTm90ZSB0aGF0IGlmIHRoZSBzaGFyZWQgb2JqZWN0ICJsaW1fYWNjZXB0LnNvIiBjYW5ub3QgYmUgZm91bmQsCi0gICAgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gIFdhdGNoIHRoZSBvdXRwdXQgaW4gdGhlIHRlcm1pbmFsIGZvcgotICAgIHRoZSAiU1NWTkNfTElNX0FDQ0VQVF9QUkVMT0FEIiBzZXR0aW5nLgotfQotCS5zc2hzZWMudCBpbnNlcnQgZW5kICRtc2cKLQotCWJ1dHRvbiAuc3Noc2VjLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7c2V0IHNzaF9sb2NhbF9wcm90ZWN0aW9uIDA7IGRlc3Ryb3kgLnNzaHNlY30KLQliaW5kIC5zc2hzZWMgPEVzY2FwZT4ge3NldCBzc2hfbG9jYWxfcHJvdGVjdGlvbiAwOyBkZXN0cm95IC5zc2hzZWN9Ci0Jd20gcHJvdG9jb2wgLnNzaHNlYyBXTV9ERUxFVEVfV0lORE9XIHtzZXQgc3NoX2xvY2FsX3Byb3RlY3Rpb24gMDsgZGVzdHJveSAuc3Noc2VjfQotCWJ1dHRvbiAuc3Noc2VjLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5zc2hzZWN9Ci0KLQlwYWNrIC5zc2hzZWMudCAuc3Noc2VjLmNhbmNlbCAuc3Noc2VjLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnNzaHNlYwotCXdtIHJlc2l6YWJsZSAuc3Noc2VjIDEgMAotfQotCi1wcm9jIG11bHRpbGlzdGVuX2RpYWxvZyB7fSB7Ci0JZ2xvYmFsIG11bHRpcGxlX2xpc3RlbgotCQotCXRvcGxldiAubXVsdGlsCi0Jd20gdGl0bGUgLm11bHRpbCAiTXVsdGlwbGUgTElTVEVOIENvbm5lY3Rpb25zIgotCi0JZ2xvYmFsIGhlbHBfZm9udAotCXNldCBoIDM2Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAzMAotCX0KLQlldmFsIHRleHQgLm11bHRpbC50IC13aWR0aCA4NCAtaGVpZ2h0ICRoICRoZWxwX2ZvbnQKLQotCWFwcGx5X2JnIC5tdWx0aWwudAotCi0Jc2V0IG1zZyB7Ci0gICAgU2V0IHRoaXMgb3B0aW9uIHRvIGFsbG93IFNTVk5DICh3aGVuIGluIExJU1RFTiAvIFJldmVyc2UgY29ubmVjdGlvbnMKLSAgICBtb2RlKSB0byBhbGxvdyBtdWx0aXBsZSBWTkMgc2VydmVycyB0byBjb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUgYW5kCi0gICAgc28gZGlzcGxheSBlYWNoIG9mIHRoZWlyIGRlc2t0b3BzIG9uIHlvdXIgc2NyZWVuIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgb24gVW5peCBvciBNYU9TWCB3aGVuIHVzaW5nIHRoZSBzdXBwbGllZAotICAgIFNTVk5DIHZuY3ZpZXdlci4gIElmIHlvdSBzcGVjaWZ5IHlvdXIgb3duIFZOQyBWaWV3ZXIgaXQgaGFzIG5vIGVmZmVjdC4KLQotICAgIE9uIFdpbmRvd3MgKG9ubHkgdGhlIHN0b2NrIFRpZ2h0Vk5DIHZpZXdlciBpcyBwcm92aWRlZCkgaXQgaGFzIG5vIGVmZmVjdAotICAgIGJlY2F1c2UgdGhlIFdpbmRvd3MgU1NWTkMgY2FuIE9OTFkgZG8gIk11bHRpcGxlIExJU1RFTiBDb25uZWN0aW9ucyIuIAotICAgIFNpbWlsYXJseSBvbiBNYWNPU1ggaWYgdGhlIENPVFZOQyB2aWV3ZXIgaXMgdXNlZCB0aGVyZSBpcyBubyBlZmZlY3QuCi0KLSAgICBSYXRpb25hbGU6ICBUbyBwbGF5IGl0IHNhZmUsIHRoZSBVbml4IHZuY3ZpZXdlciBwcm92aWRlZCBieSBTU1ZOQwotICAgIChzc3ZuY3ZpZXdlcikgb25seSBhbGxvd3Mgb25lIExJU1RFTiByZXZlcnNlIGNvbm5lY3Rpb24gYXQgYSB0aW1lLgotICAgIFRoaXMgaXMgdG8gcHJvaGliaXQgbWFsaWNpb3VzIHBlb3BsZSBvbiB0aGUgbmV0d29yayBmcm9tIGRlcG9zaXRpbmcKLSAgICBhcyBtYW55IGRlc2t0b3BzIG9uIHlvdXIgc2NyZWVuIGFzIGhlIGxpa2VzLCBldmVuIGlmIHlvdSBhcmUgYWxyZWFkeQotICAgIGNvbm5lY3RlZCB0byBWTkMgc2VydmVyIHlvdSBkZXNpcmUuCi0KLSAgICBGb3IgZXhhbXBsZSwgcGVyaGFwcyB0aGUgbWFsaWNpb3VzIHVzZXIgY291bGQgdHJpY2sgeW91IGludG8gdHlwaW5nCi0gICAgYSBwYXNzd29yZCBpbnRvIHRoZSBkZXNrdG9wIGhlIGRpc3BsYXlzIG9uIHlvdXIgc2NyZWVuLgotCi0gICAgVGhpcyBwcm90ZWN0aW9uIGlzIG5vdCBwZXJmZWN0LCBiZWNhdXNlIHRoZSBtYWxpY2lvdXMgdXNlciBjb3VsZAotICAgIHRyeSB0byByZXZlcnNlIGNvbm5lY3QgdG8geW91IGJlZm9yZSB0aGUgY29ycmVjdCBWTkMgc2VydmVyIHJldmVyc2UKLSAgICBjb25uZWN0cyB0byB5b3UuICBUaGlzIGlzIGV2ZW4gbW9yZSBvZiBhIHByb2JsZW0gaWYgeW91IGtlZXAgeW91cgotICAgIFNTVk5DIHZpZXdlciBpbiBMSVNURU4gbW9kZSBidXQgdW5jb25uZWN0ZWQgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lLgotICAgIFBheSBjYXJlZnVsIGF0dGVudGlvbiBpbiB0aGlzIGNhc2UgaWYgeW91IGFyZSB0byBzdXBwbHlpbmcgc2Vuc2l0aXZlCi0gICAgaW5mb3JtYXRpb24gdG8gdGhlIHJlbW90ZSBkZXNrdG9wLgotCi0gICAgRW5hYmxlICdNdWx0aXBsZSBMSVNURU4gQ29ubmVjdGlvbnMnIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGRlZmF1bHQKLSAgICBwcm90ZWN0aW9uIGluIHRoZSBVbml4IFNTVk5DIHZuY3ZpZXdlcjsgaS5lLiBhbGxvdyBtdWx0aXBsZSByZXZlcnNlCi0gICAgY29ubmVjdGlvbnMgc2ltdWx0YW5lb3VzbHkgKGFsbCB2bmMgdmlld2VycyB3ZSBrbm93IG9mIGRvIHRoaXMgYnkgZGVmYXVsdCkKLQotICAgIEZvciBtb3JlIGNvbnRyb2wsIGRvIG5vdCBzZWxlY3QgJ011bHRpcGxlIExJU1RFTiBDb25uZWN0aW9ucycsIGJ1dAotICAgIHJhdGhlciBzZXQgdGhlIGVudi4gdmFyIFNTVk5DX01VTFRJUExFX0xJU1RFTj1NQVg6biB0byBsaW1pdCB0aGUgbnVtYmVyCi0gICAgb2Ygc2ltdWx0YW5lb3VzIHJldmVyc2UgY29ubmVjdGlvbnMgdG8gIm4iIAotfQotCS5tdWx0aWwudCBpbnNlcnQgZW5kICRtc2cKLQotCWJ1dHRvbiAubXVsdGlsLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7c2V0IG11bHRpcGxlX2xpc3RlbiAwOyBkZXN0cm95IC5tdWx0aWx9Ci0JYmluZCAubXVsdGlsIDxFc2NhcGU+IHtzZXQgbXVsdGlwbGVfbGlzdGVuIDA7IGRlc3Ryb3kgLm11bHRpbH0KLQl3bSBwcm90b2NvbCAubXVsdGlsIFdNX0RFTEVURV9XSU5ET1cge3NldCBtdWx0aXBsZV9saXN0ZW4gMDsgZGVzdHJveSAubXVsdGlsfQotCWJ1dHRvbiAubXVsdGlsLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5tdWx0aWx9Ci0KLQlwYWNrIC5tdWx0aWwudCAubXVsdGlsLmNhbmNlbCAubXVsdGlsLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLm11bHRpbAotCXdtIHJlc2l6YWJsZSAubXVsdGlsIDEgMAotfQotCi1wcm9jIHVzZV9ncmFiX2RpYWxvZyB7fSB7Ci0JZ2xvYmFsIHVzZ19ncmFiCi0JCi0JdG9wbGV2IC51c2VncmIKLQl3bSB0aXRsZSAudXNlZ3JiICJVc2UgWEdyYWJTZXJ2ZXIgKGZvciBmdWxsc2NyZWVuKSIKLQotCWdsb2JhbCBoZWxwX2ZvbnQKLQlldmFsIHRleHQgLnVzZWdyYi50IC13aWR0aCA4NSAtaGVpZ2h0IDI5ICRoZWxwX2ZvbnQKLQotCWFwcGx5X2JnIC51c2VncmIudAotCi0Jc2V0IG1zZyB7Ci0gICAgT24gVW5peCwgc29tZSBXaW5kb3cgbWFuYWdlcnMgYW5kIHNvbWUgRGVza3RvcHMgbWFrZSBpdCBkaWZmaWN1bHQgZm9yIHRoZQotICAgIFNTVk5DIFVuaXggVk5DIHZpZXdlciB0byBnbyBpbnRvIGZ1bGwgc2NyZWVuIG1vZGUgKEY5KSBhbmQvb3IgcmV0dXJuLgotCi0gICAgU29tZXRpbWVzIG9uZSBjYW4gZ28gaW50byBmdWxsIHNjcmVlbiBtb2RlLCBidXQgdGhlbiB5b3VyIGtleXN0cm9rZXMgb3IKLSAgICBNb3VzZSBhY3Rpb25zIGRvIG5vdCBnZXQgdGhyb3VnaC4gIFRoaXMgY2FuIGxlYXZlIHlvdSB0cmFwcGVkIGJlY2F1c2UgeW91Ci0gICAgY2Fubm90IGluamVjdCBpbnB1dCAoRjkgYWdhaW4pIHRvIGdldCBvdXQgb2YgZnVsbCBzY3JlZW4gbW9kZS4gIChUaXA6Ci0gICAgcHJlc3MgQ3RybC1BbHQtRjIgZm9yIGEgY29uc29sZSBsb2dpbiBzaGVsbDsgdGhlbiBraWxsIHlvdXIgdm5jdmlld2VyCi0gICAgcHJvY2VzcywgZS5nLiBwa2lsbCB2bmN2aWV3ZXI7IHRoZW4gQWx0LUY3IHRvIGdldCBiYWNrIHRvIHlvdXIgZGVza3RvcCkKLQotICAgIFdlIGhhdmUgc2VlbiB0aGlzIGluIHNvbWUgdmVyeSBvbGQgV2luZG93IG1hbmFnZXJzIChlLmcuIGZ2d20yIGNpcmNhCi0gICAgMTk5OCkgYW5kIHNvbWUgdmVyeSBuZXcgRGVza3RvcHMgKGUuZy4gR05PTUUgY2lyY2EgMjAwOCkuICBXZSB0cnkKLSAgICB0byB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSBvbiByZWNlbnQgZGVza3RvcHMgYnkgdXNpbmcgdGhlIE5FV19XTQotICAgIGludGVyZmFjZSwgYnV0IGlmIHlvdSB1c2UgRnVsbHNjcmVlbiwgeW91IG1heSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbi4KLQotICAgIFRoZSBkZWZhdWx0IGZvciB0aGUgU1NWTkMgVW5peCBWTkMgdmlld2VyIGlzICctZ3JhYmtiZCcgbW9kZSB3aGVyZSBpdCB3aWxsCi0gICAgdHJ5IHRvIGV4Y2x1c2l2ZWx5IGdyYWIgdGhlIGtleWJvYXJkLiAgVGhpcyBvZnRlbiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgICBIb3dldmVyIGlmIEZ1bGxzY3JlZW4gaXMgbm90IHdvcmtpbmcgcHJvcGVybHksIHRyeSBzZXR0aW5nIHRoaXMKLSAgICAnVXNlIFhHcmFiU2VydmVyJyBvcHRpb24gdG8gZW5hYmxlICctZ3JhYmFsbCcgbW9kZSB3aGVyZSBpdCB0cmllcyB0byBncmFiCi0gICAgdGhlIGVudGlyZSBYIHNlcnZlci4gIFRoaXMgdXN1YWxseSB3b3JrcywgYnV0IGNhbiBiZSBhIGJpdCBmbGFrZXkuCi0KLSAgICBTb21ldGltZXMgdG9nZ2xpbmcgRjkgYSBmZXcgdGltZXMgZ2V0cyBsZXRzIHRoZSB2bmN2aWV3ZXIgZmlsbCB0aGUgd2hvbGUKLSAgICBzY3JlZW4uICBTb21ldGltZXMgdGFwcGluZyBGOSB2ZXJ5IHF1aWNrbHkgZ2V0cyBpdCB0byBzbmFwIGluLiAgSWYgR05PTUUKLSAgICAob3Igd2hhdGV2ZXIgZGVza3RvcCkgaXMgc3RpbGwgc2hvd2luZyBpdHMgdGFza2JhcnMsIGl0IGlzIHJlY29tbWVuZGVkCi0gICAgeW91IHRvZ2dsZSBGOSB1bnRpbCBpdCBpc24ndC4gT3RoZXJ3aXNlLCBpdCBpcyBub3QgY2xlYXIgd2hvIGdldHMgdGhlIGlucHV0LgotCi0gICAgQmVzdCBvZiBsdWNrLgotfQotCS51c2VncmIudCBpbnNlcnQgZW5kICRtc2cKLQotCWJ1dHRvbiAudXNlZ3JiLmNhbmNlbCAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB7c2V0IHVzZV9ncmFiIDA7IGRlc3Ryb3kgLnVzZWdyYn0KLQliaW5kIC51c2VncmIgPEVzY2FwZT4ge3NldCB1c2VfZ3JhYiAwOyBkZXN0cm95IC51c2VncmJ9Ci0Jd20gcHJvdG9jb2wgLnVzZWdyYiBXTV9ERUxFVEVfV0lORE9XIHtzZXQgdXNlX2dyYWIgMDsgZGVzdHJveSAudXNlZ3JifQotCWJ1dHRvbiAudXNlZ3JiLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC51c2VncmJ9Ci0KLQlwYWNrIC51c2VncmIudCAudXNlZ3JiLmNhbmNlbCAudXNlZ3JiLmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnVzZWdyYgotCXdtIHJlc2l6YWJsZSAudXNlZ3JiIDEgMAotfQotCi0KLXByb2MgZmluZF9uZXRjYXQge30gewotCWdsb2JhbCBpc193aW5kb3dzCi0KLQlzZXQgbmMgIiIKLQotCWlmIHshICRpc193aW5kb3dzfSB7Ci0JCXNldCBuYyBbaW5fcGF0aCAibmV0Y2F0Il0KLQkJaWYgeyRuYyA9PSAiIn0gewotCQkJc2V0IG5jIFtpbl9wYXRoICJuYyJdCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgdHJ5ICJuZXRjYXQuZXhlIgotCQlpZiBbZmlsZSBleGlzdHMgJHRyeV0gewotCQkJc2V0IG5jICR0cnkKLQkJfQotCX0KLQlyZXR1cm4gJG5jCi19Ci0KLXByb2MgcGtfZXhwYW5kIHtjbWQgaG9zdH0gewotCWdsb2JhbCB0Y2xfcGxhdGZvcm0KLQlzZXQgc2VjcyBbY2xvY2sgc2Vjb25kc10KLQlzZXQgbXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQotCXNldCB1c2VyICR0Y2xfcGxhdGZvcm0odXNlcikKLQlpZiBbcmVnZXhwIHslSVB9ICRjbWRdIHsKLQkJc2V0IGlwIFtndWVzc19pcF0KLQkJaWYgeyRpcCA9PSAiIn0gewotCQkJc2V0IGlwICJ1bmtub3duIgotCQl9Ci0JCXJlZ3N1YiAtYWxsIHslSVB9ICRjbWQgJGlwIGNtZAotCX0KLQlpZiBbcmVnZXhwIHslTkFUfSAkY21kXSB7Ci0JCXNldCBpcCBbZ3Vlc3NfbmF0X2lwXQotCQlyZWdzdWIgLWFsbCB7JU5BVH0gJGNtZCAkaXAgY21kCi0JfQotCXJlZ3N1YiAtYWxsIHslSE9TVH0gJGNtZCAkaG9zdCBjbWQKLQlyZWdzdWIgLWFsbCB7JVVTRVJ9ICRjbWQgJHVzZXIgY21kCi0JcmVnc3ViIC1hbGwgeyVTRUNTfSAkY21kICRzZWNzIGNtZAotCXJlZ3N1YiAtYWxsIHslTVNFQ1N9ICRjbWQgJG1zZWNzIGNtZAotCi0JcmV0dXJuICRjbWQKLX0KLQotcHJvYyBiYWNrdGlja19leHBhbmQge3N0cn0gewotCXNldCBzdHIwICRzdHIKLQlzZXQgY29sbGVjdCAiIgotCXNldCBjb3VudCAwCi0Jd2hpbGUge1tyZWdleHAge14oLiopYChbXmBdKylgKC4qKSR9ICRzdHIgbXYgcDEgY21kIHAyXX0gewotCQlzZXQgb3V0IFtldmFsIGV4ZWMgJGNtZF0KLQkJc2V0IHN0ciAiJHAxJG91dCRwMiIKLQkJaW5jciBjb3VudAotCQlpZiB7JGNvdW50ID4gMTB9ICB7Ci0JCQlicmVhawotCQl9Ci0JfQotCXJldHVybiAkc3RyCi19Ci0KLXByb2MgcmVhZF9mcm9tX3BhZCB7ZmlsZX0gewotCXNldCBmaCAiIgotCWlmIHtbY2F0Y2gge3NldCBmaCBbb3BlbiAkZmlsZSAiciJdfV0gIT0gMH0gewotCQlyZXR1cm4gIkZBSUwiCi0JfQotCi0Jc2V0IGFjY3VtICIiCi0Jc2V0IG1hdGNoICIiCi0Jd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7Ci0JCWlmIFtyZWdleHAge15bIFx0XSojfSAkbGluZV0gewotCQkJYXBwZW5kIGFjY3VtICIkbGluZVxuIgotCQl9IGVsc2VpZiBbcmVnZXhwIHteWyBcdF0qJH0gJGxpbmVdIHsKLQkJCWFwcGVuZCBhY2N1bSAiJGxpbmVcbiIKLQkJfSBlbHNlaWYgeyRtYXRjaCA9PSAiIn0gewotCQkJc2V0IG1hdGNoICRsaW5lCi0JCQlhcHBlbmQgYWNjdW0gIiMgJGxpbmVcbiIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBhY2N1bSAiJGxpbmVcbiIKLQkJfQotCX0KLQotCWNsb3NlICRmaAotCi0JaWYgeyRtYXRjaCA9PSAiIn0gewotCQlyZXR1cm4gIkZBSUwiCi0JfQotCQotCWlmIHtbY2F0Y2gge3NldCBmaCBbb3BlbiAkZmlsZSAidyJdfV0gIT0gMH0gewotCQlyZXR1cm4gIkZBSUwiCi0JfQotCi0JcHV0cyAtbm9uZXdsaW5lICRmaCAkYWNjdW0KLQotCXJldHVybiAkbWF0Y2gKLX0KLQotcHJvYyBkb19wb3J0X2tub2NrIHtocCBtb2RlfSB7Ci0JZ2xvYmFsIHVzZV9wb3J0X2tub2NraW5nIHBvcnRfa25vY2tpbmdfbGlzdAotCWdsb2JhbCBpc193aW5kb3dzCi0KLQlpZiB7ISAkdXNlX3BvcnRfa25vY2tpbmd9IHsKLQkJcmV0dXJuIDEKLQl9Ci0JaWYgeyRwb3J0X2tub2NraW5nX2xpc3QgPT0gIiJ9IHsKLQkJcmV0dXJuIDEKLQl9Ci0Jc2V0IGxpc3QgJHBvcnRfa25vY2tpbmdfbGlzdAotCi0JaWYgeyRtb2RlID09ICJmaW5pc2gifSB7Ci0JCWlmIHshIFtyZWdleHAge0ZJTklTSH0gJGxpc3RdfSB7Ci0JCQltZXNnICJQb3J0S25vY2soZmluaXNoKTogZG9uZSIKLQkJCXJldHVybiAxCi0JCX0gZWxzZSB7Ci0JCQlyZWdzdWIge14uKkZJTklTSH0gJGxpc3QgIiIgbGlzdAotCQl9Ci0JfSBlbHNlaWYgeyRtb2RlID09ICJzdGFydCJ9IHsKLQkJaWYge1tyZWdleHAge0ZJTklTSH0gJGxpc3RdfSB7Ci0JCQlyZWdzdWIge0ZJTklTSC4qJH0gJGxpc3QgIiIgbGlzdAotCQl9Ci0JfQotCi0Jc2V0IGRlZmF1bHRfZGVsYXkgMTUwCi0KLQlzZXQgaG9zdCBbc3RyaW5nIHRyaW0gJGhwXQotCSMgWFhYIGhvc3RfcGFydAotCXJlZ3N1YiB7XnZuYzovL30gJGhvc3QgIiIgaG9zdAotCXJlZ3N1YiB7Xi4qQH0gJGhvc3QgIiIgaG9zdAotCXJlZ3N1YiB7OlswLTldWzAtOV0qJH0gJGhvc3QgIiIgaG9zdAotCXNldCBob3N0MCBbc3RyaW5nIHRyaW0gJGhvc3RdCi0KLQlpZiB7JGhvc3QwID09ICIifSB7Ci0JCWJlbGwKLQkJbWVzZyAiUG9ydEtub2NrOiBObyBob3N0OiAkaHAiCi0JCXJldHVybiAwCi0JfQotCi0Jc2V0IG0gIiIKLQkKLQlpZiBbcmVnZXhwIHtQQUQ9KFteXG5dKyl9ICRsaXN0IG12IHBhZGZpbGVdIHsKLQkJc2V0IHRsaXN0IFtyZWFkX2Zyb21fcGFkICRwYWRmaWxlXSAKLQkJc2V0IHRsaXN0IFtzdHJpbmcgdHJpbSAkdGxpc3RdCi0JCWlmIHskdGxpc3QgPT0gIiIgfHwgJHRsaXN0ID09ICJGQUlMIn0gewotCQkJcmFpc2UgLgotCQkJdGtfbWVzc2FnZUJveCAtdHlwZSBvayAtaWNvbiBlcnJvciBcCi0JCQkJLW1lc3NhZ2UgIkZhaWxlZCB0byByZWFkIGVudHJ5IGZyb20gJHBhZGZpbGUiIFwKLQkJCQktdGl0bGUgIkVycm9yOiBQYWRmaWxlICRwYWRmaWxlIgotCQkJcmV0dXJuIDAKLQkJfQotCQlyZWdzdWIgLWFsbCB7UEFEPShbXlxuXSspfSAkbGlzdCAkdGxpc3QgbGlzdAotCX0KLQotCXNldCBzcGwgIixcblxyIgotCWlmIFtyZWdleHAge0NNRD19ICAgJGxpc3RdIHtzZXQgc3BsICJcblxyIn0KLQlpZiBbcmVnZXhwIHtDTURYPX0gICRsaXN0XSB7c2V0IHNwbCAiXG5cciJ9Ci0JaWYgW3JlZ2V4cCB7U0VORD19ICAkbGlzdF0ge3NldCBzcGwgIlxuXHIifQotCWlmIFtyZWdleHAge1NFTkRYPX0gJGxpc3RdIHtzZXQgc3BsICJcblxyIn0KLQotCXNldCBpIDAKLQlzZXQgcGkgMAotCi0JZm9yZWFjaCBsaW5lIFtzcGxpdCAkbGlzdCAkc3BsXSB7Ci0JCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkJc2V0IGxpbmUwICRsaW5lCi0KLQkJaWYgeyRsaW5lID09ICIifSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCWlmIFtyZWdleHAge14jfSAkbGluZV0gewotCQkJY29udGludWUKLQkJfQotCi0JCWlmIFtyZWdleHAge15zbGVlcFsgXHRdWyBcdF0qKFswLTldWzAtOV0qKX0gJGxpbmUgbXYgc2xdIHsKLQkJCXNldCBtICJQb3J0S25vY2s6IHNsZWVwICRzbCIKLQkJCW1lc2cgJG0KLQkJCWFmdGVyICRzbAotCQkJY29udGludWUKLQkJfQotCQlpZiBbcmVnZXhwIHteZGVsYXlbIFx0XVsgXHRdKihbMC05XVswLTldKil9ICRsaW5lIG12IHNsXSB7Ci0JCQlzZXQgbSAiUG9ydEtub2NrOiBkZWxheT0kc2wiCi0JCQltZXNnICRtCi0JCQlzZXQgZGVmYXVsdF9kZWxheSAkc2wKLQkJCWNvbnRpbnVlCi0JCX0KLQotCQlpZiBbcmVnZXhwIHteQ01EPSguKil9ICRsaW5lIG12IGNtZF0gewotCQkJc2V0IG0gIlBvcnRLbm9jazogQ01EOiAkY21kIgotCQkJbWVzZyAkbQotCQkJZXZhbCBleGVjICRjbWQKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XkNNRFg9KC4qKX0gJGxpbmUgbXYgY21kXSB7Ci0JCQlzZXQgY21kIFtwa19leHBhbmQgJGNtZCAkaG9zdDBdCi0JCQlzZXQgbSAiUG9ydEtub2NrOiBDTURYOiAkY21kIgotCQkJbWVzZyAkbQotCQkJZXZhbCBleGVjICRjbWQKLQkJCWNvbnRpbnVlCi0JCX0KLQkKLQkJaWYgW3JlZ2V4cCB7YH0gJGxpbmVdIHsKLQkJCSNzZXQgbGluZSBbYmFja3RpY2tfZXhwYW5kICRsaW5lXQotCQl9Ci0KLQkJc2V0IHNuZCAiIgotCQlpZiBbcmVnZXhwIHteKC4qKVNFTkQ9KC4qKSR9ICRsaW5lIG12IGxpbmUgc25kXSAgewotCQkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCQkJc2V0IHNuZCBbc3RyaW5nIHRyaW0gJHNuZF0KLQkJCXJlZ3N1YiAtYWxsIHslTkVXTElORX0gJHNuZCAiXG4iIHNuZAotCQl9IGVsc2VpZiBbcmVnZXhwIHteKC4qKVNFTkRYPSguKikkfSAkbGluZSBtdiBsaW5lIHNuZF0gIHsKLQkJCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkJCXNldCBzbmQgW3N0cmluZyB0cmltICRzbmRdCi0JCQlzZXQgc25kIFtwa19leHBhbmQgJHNuZCAkaG9zdDBdCi0JCQlyZWdzdWIgLWFsbCB7JU5FV0xJTkV9ICRzbmQgIlxuIiBzbmQKLQkJfQotCi0JCXNldCB1ZHAgMAotCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge1svOl11ZHB9ICRsaW5lXSB7Ci0JCQlzZXQgdWRwIDEKLQkJCXJlZ3N1YiAtYWxsIC1ub2Nhc2Uge1svOl11ZHB9ICRsaW5lICIgIiBsaW5lCi0JCQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JCX0KLQkJcmVnc3ViIC1hbGwgLW5vY2FzZSB7Wy86XXRjcH0gJGxpbmUgIiAiIGxpbmUKLQkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCi0JCXNldCBkZWxheSAwCi0JCWlmIFtyZWdleHAge14oLiopWyBcdF1bIFx0XSooWzAtOV1bMC05XSopJH0gJGxpbmUgbXYgZmlyc3QgZGVsYXldIHsKLQkJCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkZmlyc3RdCi0JCX0KLQotCQlpZiB7W3JlZ2V4cCB7XiguKik6KFswLTldWzAtOV0qKSR9ICRsaW5lIG12IGhvc3QgcG9ydF19IHsKLQkJCTsKLQkJfSBlbHNlIHsKLQkJCXNldCBob3N0ICRob3N0MAotCQkJc2V0IHBvcnQgJGxpbmUKLQkJfQotCQlzZXQgaG9zdCBbc3RyaW5nIHRyaW0gJGhvc3RdCi0JCXNldCBwb3J0IFtzdHJpbmcgdHJpbSAkcG9ydF0KLQotCQlpZiB7JGhvc3QgPT0gIiJ9IHsKLQkJCXNldCBob3N0ICRob3N0MAotCQl9Ci0KLQkJaWYgeyRwb3J0ID09ICIifSB7Ci0JCQliZWxsCi0JCQlzZXQgbSAiUG9ydEtub2NrOiBObyBwb3J0IGZvdW5kOiBcIiRsaW5lMFwiIgotCQkJbWVzZyAkbQotCQkJcmV0dXJuIDAKLQkJfQotCQlpZiB7ISBbcmVnZXhwIHteWzAtOV1bMC05XSokfSAkcG9ydF19IHsKLQkJCWJlbGwKLQkJCXNldCBtICJQb3J0S25vY2s6IEludmFsaWQgcG9ydDogXCIkcG9ydFwiIgotCQkJbWVzZyAkbQotCQkJcmV0dXJuIDAKLQkJfQotCQlyZWdzdWIgeywuKiR9ICRob3N0ICIiIGhvc3QKLQkJaWYge1tyZWdleHAge1sgXHRdfSAkaG9zdF19IHsKLQkJCWJlbGwKLQkJCXNldCBtICJQb3J0S25vY2s6IEludmFsaWQgaG9zdDogXCIkaG9zdFwiIgotCQkJbWVzZyAkbQotCQkJcmV0dXJuIDAKLQkJfQotCQlpZiB7ISBbcmVnZXhwIHteWy1BLXowLTlfLl1bLUEtejAtOV8uXSokfSAkaG9zdF19IHsKLQkJCWJlbGwKLQkJCXNldCBtICJQb3J0S25vY2s6IEludmFsaWQgaG9zdDogXCIkaG9zdFwiIgotCQkJbWVzZyAkbQotCQkJcmV0dXJuIDAKLQkJfQotCi0JCXNldCBuYyAiIgotCQlpZiB7JHVkcCB8fCAkc25kICE9ICIifSB7Ci0JCQlzZXQgbmMgW2ZpbmRfbmV0Y2F0XQotCQkJaWYgeyRuYyA9PSAiIn0gewotCQkJCWJlbGwKLQkJCQlzZXQgbSAiUG9ydEtub2NrOiBVRFA6IG5ldGNhdCgxKSBub3QgZm91bmQiCi0JCQkJbWVzZyAkbQotCQkJCWFmdGVyIDEwMDAKLQkJCQljb250aW51ZQotCQkJfQotCQl9Ci0KLQkJaWYgeyRzbmQgIT0gIiJ9IHsKLQkJCWdsb2JhbCBlbnYKLQkJCXNldCBwZmlsZSAicGF5bG9hZCRwaS50eHQiIAotCQkJaWYgeyEgJGlzX3dpbmRvd3N9IHsKLQkJCQlzZXQgcGZpbGUgIiRlbnYoU1NWTkNfSE9NRSkvLiRwZmlsZSIKLQkJCX0KLQkJCXNldCBwZmlsZXMoJHBpKSAkcGZpbGUKLQkJCWluY3IgcGkKLQkJCXNldCBmaCBbb3BlbiAkcGZpbGUgInciXQotCQkJcHV0cyAtbm9uZXdsaW5lICRmaCAiJHNuZCIKLQkJCWNsb3NlICRmaAotCi0JCQlzZXQgbSAiUG9ydEtub2NrOiBTRU5EOiAkaG9zdCAkcG9ydCIKLQkJCW1lc2cgJG0KLQkJCWlmIHskaXNfd2luZG93c30gewotCQkJCWlmIHskdWRwfSB7Ci0JCQkJCWNhdGNoIHtleGVjICRuYyAtZCAtdSAtdyAxICIkaG9zdCIgIiRwb3J0IiA8ICRwZmlsZSAmfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhdGNoIHtleGVjICRuYyAtZCAgICAtdyAxICIkaG9zdCIgIiRwb3J0IiA8ICRwZmlsZSAmfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgeyR1ZHB9IHsKLQkJCQkJY2F0Y2gge2V4ZWMgJG5jICAgIC11IC13IDEgIiRob3N0IiAiJHBvcnQiIDwgJHBmaWxlICZ9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2F0Y2gge2V4ZWMgJG5jICAgICAgIC13IDEgIiRob3N0IiAiJHBvcnQiIDwgJHBmaWxlICZ9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2gge2FmdGVyIDUwOyBmaWxlIGRlbGV0ZSAkcGZpbGV9Ci0JCQkKLQkJfSBlbHNlaWYgeyR1ZHB9IHsKLQkJCXNldCBtICJQb3J0S25vY2s6IFVEUDogJGhvc3QgJHBvcnQiCi0JCQltZXNnICRtCi0JCQlpZiB7ISAkaXNfd2luZG93c30gewotCQkJCWNhdGNoIHtleGVjIGVjaG8gYSB8ICRuYyAtdSAtdyAxICIkaG9zdCIgIiRwb3J0IiAmfQotCQkJfSBlbHNlIHsKLQkJCQlzZXQgZmggW29wZW4gIm5jX2luLnR4dCIgInciXQotCQkJCXB1dHMgJGZoICJhIgotCQkJCWNsb3NlICRmaAotCQkJCWNhdGNoIHtleGVjICRuYyAtZCAtdSAtdyAxICIkaG9zdCIgIiRwb3J0IiA8ICJuY19pbi50eHQiICZ9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgbSAiUG9ydEtub2NrOiBUQ1A6ICRob3N0ICRwb3J0IgotCQkJbWVzZyAkbQotCQkJc2V0IHMgIiIKLQkJCXNldCBlbWVzcyAiIgotCQkJc2V0IHJjIFtjYXRjaCB7c2V0IHMgW3NvY2tldCAtYXN5bmMgJGhvc3QgJHBvcnRdfSBlbWVzc10KLQkJCWlmIHskcmMgIT0gMH0gewotCQkJCXJhaXNlIC4KLQkJCQl0a19tZXNzYWdlQm94IC10eXBlIG9rIC1pY29uIGVycm9yIC1tZXNzYWdlICRlbWVzcyAtdGl0bGUgIkVycm9yOiBzb2NrZXQgLWFzeW5jICRob3N0ICRwb3J0IgotCQkJfQotCQkJc2V0IHNvY2tldHMoJGkpICRzCi0JCQkjIHNlZW1zIHdlIGhhdmUgdG8gY2xvc2UgaXQgaW1tZWRpYXRlbHkgdG8gYXZvaWQgbXVsdGlwbGUgU1lOJ3MuCi0JCQkjIGRvZXMgbm90IGhlbHAgb24gV2luOXguCi0JCQljYXRjaCB7YWZ0ZXIgMzA7IGNsb3NlICRzfTsKLQkJCWluY3IgaQotCQl9Ci0KLQkJaWYgeyRkZWxheSA9PSAwfSB7Ci0JCQlpZiB7JGRlZmF1bHRfZGVsYXkgPiAwfSB7Ci0JCQkJYWZ0ZXIgJGRlZmF1bHRfZGVsYXkKLQkJCX0KLQkJfSBlbHNlaWYgeyRkZWxheSA+IDB9IHsKLQkJCWFmdGVyICRkZWxheQotCQl9Ci0JfQotCi0JaWYgezB9IHsKLQkJZm9yIHtzZXQgaiAwfSB7JGogPCAkaX0ge2luY3Igan0gewotCQkJc2V0ICRzICRzb2NrZXRzKCRqKQotCQkJaWYgeyRzICE9ICIifSB7Ci0JCQkJY2F0Y2gge2Nsb3NlICRzfQkKLQkJCX0KLQkJfQotCX0KLQlmb3Ige3NldCBqIDB9IHskaiA8ICRwaX0ge2luY3Igan0gewotCQlzZXQgZiAkcGZpbGVzKCRqKQotCQlpZiB7JGYgIT0gIiJ9IHsKLQkJCWlmIFtmaWxlIGV4aXN0cyAkZl0gewotCQkJCWFmdGVyIDEwMAotCQkJfQotCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRmfQkKLQkJfQotCX0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJY2F0Y2gge2ZpbGUgZGVsZXRlICJuY19pbi50eHQifQotCX0KLQlpZiB7JG0gIT0gIiJ9IHsKLQkJc2V0IG0gIiRtLCIKLQl9Ci0JaWYgeyRtb2RlID09ICJmaW5pc2gifSB7Ci0JCW1lc2cgIlBvcnRLbm9jayhmaW5pc2gpOiBkb25lIgotCX0gZWxzZSB7Ci0JCW1lc2cgIlBvcnRLbm9jazogZG9uZSIKLQl9Ci0JcmV0dXJuIDEKLX0KLQotcHJvYyBwb3J0X2tub2NraW5nX2RpYWxvZyB7fSB7Ci0JdG9wbGV2IC5wawotCXdtIHRpdGxlIC5wayAiUG9ydCBLbm9ja2luZyIKLQlnbG9iYWwgdXNlX3BvcnRfa25vY2tpbmcgcG9ydF9rbm9ja2luZ19saXN0Ci0KLQlnbG9iYWwgaGVscF9mb250Ci0KLQlnbG9iYWwgdW5hbWUKLQotCXNldCBoIDM1Ci0JaWYgW3NtYWxsX2hlaWdodF0gewotCQlzZXQgaCAyMgotCX0gZWxzZWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJc2V0IGggMjUKLQl9Ci0Jc2Nyb2xsX3RleHQgLnBrLmYgODUgJGgKLQotCXNldCBtc2cgewotIERlc2NyaXB0aW9uOgotCi0gICAgUG9ydCBLbm9ja2luZyBpcyB3aGVyZSBhIG5ldHdvcmsgY29ubmVjdGlvbiB0byBhIHNlcnZpY2UgaXMgbm90IHByb3ZpZGVkCi0gICAgdG8ganVzdCBhbnkgY2xpZW50LCBidXQgcmF0aGVyIG9ubHkgdG8gdGhvc2UgdGhhdCBpbW1lZGlhdGVseSBwcmlvciB0bwotICAgIGNvbm5lY3Rpbmcgc2VuZCBhIG1vcmUgb3IgbGVzcyBzZWNyZXQgcGF0dGVybiBvZiBjb25uZWN0aW9ucyB0byBvdGhlcgotICAgIHBvcnRzIG9uIHRoZSBmaXJld2FsbC4KLQotICAgIFNvbWV3aGF0IGxpa2UgImtub2NraW5nIiBvbiB0aGUgZG9vciB3aXRoIHRoZSBjb3JyZWN0IHNlcXVlbmNlIGJlZm9yZSBpdAotICAgIGJlaW5nIG9wZW5lZCAoYnV0IG5vdCBuZWNlc3NhcmlseSBsZXR0aW5nIHlvdSBpbiB5ZXQpLiAgSXQgaXMgYWxzbyBwb3NzaWJsZQotICAgIHRvIGhhdmUgYSBzaW5nbGUgZW5jcnlwdGVkIHBhY2tldCAoZS5nLiBVRFApIHBheWxvYWQgY29tbXVuaWNhdGUgd2l0aCB0aGUKLSAgICBmaXJld2FsbCBpbnN0ZWFkIG9mIGtub2NraW5nIG9uIGEgc2VxdWVuY2Ugb2YgcG9ydHMuCi0KLSAgICBPbmx5IGFmdGVyIHRoZSBjb3JyZWN0IHNlcXVlbmNlIG9mIHBvcnRzIGlzIG9ic2VydmVkIGJ5IHRoZSBmaXJld2FsbCBkb2VzCi0gICAgaXQgYWxsb3cgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0byBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZpY2UuCi0KLSAgICBTbywgZm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgYWxsb3dpbmcgYW55IGhvc3Qgb24gdGhlIGludGVybmV0IHRvIGNvbm5lY3QKLSAgICB0byB5b3VyIFNTSCBzZXJ2aWNlIGFuZCB0aGVuIHRyeSB0byBsb2dpbiB3aXRoIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB0aGUKLSAgICBjbGllbnQgZmlyc3QgbXVzdCAidGlja2xlIiB5b3VyIGZpcmV3YWxsIHdpdGggdGhlIGNvcnJlY3Qgc2VxdWVuY2Ugb2YgcG9ydHMuCi0gICAgT25seSB0aGVuIHdpbGwgaXQgYmUgYWxsb3dlZCB0byBjb25uZWN0IHRvIHlvdXIgU1NIIHNlcnZpY2UgYXQgYWxsLgotCi0gICAgVGhpcyBkb2VzIG5vdCByZXBsYWNlIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgc2VjdXJpdHkgb2YgU1NILCBpdCBtZXJlbHkKLSAgICBwdXRzIGFub3RoZXIgbGF5ZXIgb2YgcHJvdGVjdGlvbiBhcm91bmQgaXQuIEUuZy4sIHN1cHBvc2UgYW4gZXhwbG9pdCBmb3IKLSAgICBTU0ggd2FzIGRpc2NvdmVyZWQsIHlvdSB3b3VsZCBtb3N0IGxpa2VseSBoYXZlIG1vcmUgdGltZSB0byBmaXgvcGF0Y2gKLSAgICB0aGUgcHJvYmxlbSB0aGFuIGlmIGFueSBjbGllbnQgY291bGQgZGlyZWN0bHkgY29ubmVjdCB0byB5b3VyIFNTSCBzZXJ2ZXIuCi0KLSAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBodHRwOi8vd3d3LnBvcnRrbm9ja2luZy5vcmcvIGFuZAotICAgIGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLzY4MTEKLQotCi0gVGlwOgotCi0gICAgSWYgeW91IGp1c3Qgd2FudCB0byB1c2UgdGhlIFBvcnQgS25vY2tpbmcgZm9yIGFuIFNTSCBzaGVsbCBhbmQgbm90Ci0gICAgZm9yIGEgVk5DIHR1bm5lbCwgdGhlbiBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlICJ1c2VyQGhvc3RuYW1lIGNtZD1TSEVMTCIKLSAgICAob3IgInVzZXJAaG9zdG5hbWUgY21kPVBVVFRZIiBvbiBXaW5kb3dzKSBpbiB0aGUgVk5DIEhvc3Q6RGlzcGxheSBlbnRyeSBib3gKLSAgICBvbiB0aGUgbWFpbiBwYW5lbC4gIFRoaXMgd2lsbCBkbyBldmVyeXRoaW5nIHNob3J0IG9mIHN0YXJ0aW5nIHRoZSB2aWV3ZXIuCi0gICAgQSBzaG9ydGN1dCBmb3IgdGhpcyBpcyBDdHJsLVMgYXMgbG9uZyBhcyB1c2VyQGhvc3RuYW1lIGlzIHByZXNlbnQuCi0gICAgCi0KLSBTcGVjaWZ5aW5nIHRoZSBLbm9ja3M6Ci0KLSAgICBJbiB0aGUgdGV4dCBhcmVhIGJlbG93ICJTdXBwbHkgcG9ydCBrbm9ja2luZyBwYXR0ZXJuIiB5b3UgcHV0IGluIHRoZSBwYXR0ZXJuCi0gICAgb2YgImtub2NrcyIgbmVlZGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uICBZb3UgY2FuIHNlcGFyYXRlIHRoZSBrbm9ja3MgYnkKLSAgICBjb21tYXMgb3IgcHV0IHRoZW0gb25lIHBlciBsaW5lLgotCi0gICAgRWFjaCAia25vY2siIGlzIG9mIHRoaXMgZm9ybToKLQotICAgICAgICAgICBbaG9zdDpdcG9ydFsvdWRwXSBbZGVsYXldCi0KLSAgICBJbiB0aGUgc2ltcGxlc3QgZm9ybSBqdXN0IGEgbnVtZXJpY2FsIHBvcnQsIGUuZy4gNTQzMywgaXMgc3VwcGxpZWQuCi0gICAgSXRlbXMgaW5zaWRlIFsuLi5dIGFyZSBvcHRpb25hbCBhbmQgZGVzY3JpYmVkIGJlbG93LgotCi0gICAgVGhlIHBhY2tldCBpcyBzZW50IHRvIHRoZSBzYW1lIGhvc3QgdGhhdCB0aGUgVk5DIChvciBTU0gpIGNvbm5lY3Rpb24gd2lsbAotICAgIGJlIG1hZGUgdG8uICBJZiB5b3Ugd2FudCBpdCB0byBnbyB0byBhIGRpZmZlcmVudCBob3N0IG9yIElQIHVzZSB0aGUgW2hvc3Q6XQotICAgIHByZWZpeC4gIEl0IGNhbiBiZSBlaXRoZXIgYSBob3N0bmFtZSBvciBudW1lcmljYWwgSVAuCi0KLSAgICBBIFRDUCBwYWNrZXQgaXMgc2VudCBieSBkZWZhdWx0LgotCi0gICAgSWYgeW91IG5lZWQgdG8gc2VuZCBhIFVEUCBwYWNrZXQsIHRoZSBuZXRjYXQgKGFrYSAibmMiKSBwcm9ncmFtIG11c3QgYmUKLSAgICBpbnN0YWxsZWQgb24gVW5peCAodGNsL3RrIGRvZXMgbm90IHN1cHBvcnQgdWRwIGNvbm5lY3Rpb25zKS4gIEluZGljYXRlIHRoaXMKLSAgICB3aXRoICIvdWRwIiBmb2xsb3dpbmcgdGhlIHBvcnQgbnVtYmVyICh5b3UgY2FuIGFsc28gdXNlICIvdGNwIiwgYnV0IHNpbmNlCi0gICAgaXQgaXMgdGhlIGRlZmF1bHQgaXQgaXMgbm90IG5lY2Vzc2FyeSkuICAoWW91IGNhbiBhbHNvIHVzZSAiOnVkcCIgdG8gbWF0Y2gKLSAgICB0aGUga25vY2tkIHN5bnRheCkuICBTZWUgdGhlIGV4YW1wbGUgYmVsb3cuICBGb3IgY29udmVuaWVuY2UgYSBXaW5kb3dzIG5ldGNhdAotICAgIGJpbmFyeSBpcyBzdXBwbGllZC4KLQotICAgIFRoZSBsYXN0IGZpZWxkLCBbZGVsYXldLCBpcyBhbiBvcHRpb25hbCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5Ci0gICAgYmVmb3JlIGNvbnRpbnVpbmcgb24gdG8gdGhlIG5leHQga25vY2suCi0KLQotIEV4YW1wbGVzOgotCi0gICAgICAgICAgIDU0MzMsIDEyMzIxLCAxNjYxCi0KLSAgICAgICAgICAgZncuZXhhbXBsZS5jb206NTQzMywgMTIzMjEvdWRwIDMwMDAsIDE2NjEgMjAwMAotCi0gICAgICAgICAgIGZ3LmV4YW1wbGUuY29tOjU0MzMKLSAgICAgICAgICAgMTIzMjEvdWRwIDMwMDAKLSAgICAgICAgICAgMTY2MSAyMDAwCi0KLSAgICBOb3RlIGhvdyB0aGUgZmlyc3QgdHdvIGV4YW1wbGVzIHNlcGFyYXRlIHRoZWlyIGtub2NrcyB2aWEgY29tbWFzICIsIi4KLSAgICBUaGUgM3JkIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0byB0aGUgMm5kIGFuZCBzcGxpdHMgdGhlbSB1cCBieSBuZXcgbGluZXMuCi0KLSAgICBOb3RlIGZvciBlYWNoIGtub2NrIGFueSBzZWNvbmQgbnVtYmVyIChlLmcuIHRoZSAiMjAwMCIgaW4gIjE2NjEgMjAwMCIpIGlzCi0gICAgYSBERUxBWSBpbiBtaWxsaXNlY29uZHMsIG5vdCBhIHBvcnQgbnVtYmVyLiAgSWYgeW91IGhhZCBhIGNvbW1hIHNlcGFyYXRpbmcKLSAgICB0aGVtOiAiMTY2MSwgMjAwMCIgdGhhdCB3b3VsZCBtZWFuIHR3byBzZXBhcmF0ZSBrbm9ja3M6IG9uZSB0byBwb3J0IDE2NjEKLSAgICBmb2xsb3dlZCBieSBvbmUgdG8gMjAwMCAod2l0aCBiYXNpY2FsbHkgbm8gZGVsYXkgYmV0d2VlbiB0aGVtKS4KLQotICAgIEluIGV4YW1wbGVzIDIgYW5kIDMsICJmdy5leGFtcGxlLmNvbSIgcmVwcmVzZW50cyBzb21lIG1hY2hpbmUgb3RoZXIgdGhhbgotICAgIHRoZSBWTkMvU1NIIGhvc3QuICBCeSBkZWZhdWx0LCB0aGUgVk5DL1NTSCBob3N0IGlzIHRoZSBvbmUgdGhlIHBhY2tldCBpcwotICAgIHNlbnQgdG8uCi0KLSAgICBJZiBvbmUgb2YgdGhlIGl0ZW1zIGlzIHRoZSBzdHJpbmcgIkZJTklTSCIsIHRoZW4gdGhlIHBhcnQgYmVmb3JlIGl0IGlzCi0gICAgdXNlZCBwcmlvciB0byBjb25uZWN0aW5nIGFuZCB0aGUgcGFydCBhZnRlciBpcyB1c2VkIG9uY2UgdGhlIGNvbm5lY3Rpb24KLSAgICBpcyBmaW5pc2hlZC4gIFRoaXMgY2FuIGJlIHVzZWQsIHNheSwgdG8gY2xvc2UgdGhlIGZpcmV3YWxsIHBvcnQuICBFeGFtcGxlOgotCi0gICAgICAgICAgIDU0MzMsIDEyMzIxLCBGSU5JU0gsIDc2NTksIDIzMTQKLQotICAgIChvciBvbmUgY2FuIHNwbGl0IHRoZW0gdXAgdmlhIGxpbmVzIGFzIGFib3ZlLikKLQotCi0gQWR2YW5jZWQgcG9ydCBrbm9jayBhY3Rpb25zOgotCi0gICAgSWYgdGhlIHN0cmluZyBpbiB0aGUgdGV4dCBmaWVsZCBjb250YWlucyBhbnl3aGVyZSB0aGUgc3RyaW5ncyAiQ01EPSIsICJDTURYPSIsCi0gICAgb3IgIlNFTkQ9IiwgdGhlbiBzcGxpdHRpbmcgb24gY29tbWFzIGlzIG5vdCBkb25lOiBpdCBpcyBvbmx5IHNwbGl0IG9uIGxpbmVzLgotCi0gICAgVGhlbiwgaWYgYSBsaW5lIGJlZ2lucyBDTUQ9Li4uIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlID0gaXMgcnVuIGFzIGFuCi0gICAgZXh0ZXJuYWwgY29tbWFuZC4gIFRoZSBjb21tYW5kIGNvdWxkIGJlIGFueXRoaW5nIHlvdSB3YW50LCBlLmcuIGl0IGNvdWxkCi0gICAgYmUgYSBwb3J0LWtub2NraW5nIGNsaWVudCB0aGF0IGRvZXMgdGhlIGtub2NraW5nLCBwZXJoYXBzIGVuY3J5cHRpbmcgdGhlCi0gICAgImtub2NrcyIgcGF0dGVybiBzb21laG93IG9yIHVzaW5nIGEgU2luZ2xlIFBhY2tldCBBdXRob3JpemF0aW9uIG1ldGhvZCBzdWNoCi0gICAgYXMgaHR0cDovL3d3dy5jaXBoZXJkeW5lLmNvbS9md2tub3AvCi0KLSAgICBFeHRyYSBxdW90ZXMgKHNvbWV0aW1lcyAiJ2ZvbyBiYXInIikgbWF5IGJlIG5lZWRlZCB0byBwcmVzZXJ2ZSBzcGFjZXMgaW4KLSAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGJlY2F1c2UgdGhlIHRjbC90ayBldmFsKG4pIGNvbW1hbmQgaXMgdXNlZC4gIFlvdQotICAgIGNhbiBhbHNvIHVzZSB7Li4ufSBmb3IgcXVvdGluZyBzdHJpbmdzIHdpdGggc3BhY2VzLgotCi0gICAgSWYgYSBsaW5lIGJlZ2lucyBDTURYPS4uLiB0aGVuIGJlZm9yZSB0aGUgY29tbWFuZCBpcyBydW4gdGhlIGZvbGxvd2luZwotICAgIHRva2VucyBhcmUgZXhwYW5kZWQgdG8gc3RyaW5nczoKLQotICAgICAgJUlQICAgICAgIEN1cnJlbnQgbWFjaGluZSdzIElQIGFkZHJlc3MgKE5BVCBtYXkgbWFrZSB0aGlzIG5vdCB1c2VmdWwpLgotICAgICAgJU5BVCAgICAgIFRyeSB0byBnZXQgZWZmZWN0aXZlIElQIGJ5IGNvbnRhY3RpbmcgaHR0cDovL3d3dy53aGF0aXNteWlwLmNvbQotICAgICAgJUhPU1QgICAgIFRoZSByZW1vdGUgaG9zdCBvZiB0aGUgY29ubmVjdGlvbi4KLSAgICAgICVVU0VSICAgICBUaGUgY3VycmVudCB1c2VyLgotICAgICAgJVNFQ1MgICAgIFRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcyAocGxhdGZvcm0gZGVwZW5kZW50KS4KLSAgICAgICVNU0VDUyAgICBQbGF0Zm9ybSBkZXBlbmRlbnQgdGltZSBoYXZpbmcgYXQgbGVhc3QgbWlsbGlzZWNvbmQgZ3JhbnVsYXJpdHkuCi0KLSAgIExpbmVzIG5vdCBtYXRjaGluZyBDTUQ9IG9yIENNRFg9IGFyZSB0cmVhdGVkIGFzIG5vcm1hbCBwb3J0IGtub2NrcyBidXQgd2l0aAotICAgb25lIGV4Y2VwdGlvbi4gIElmIGEgbGluZSBlbmRzIGluIFNFTkQ9Li4uIChpLmUuIGFmdGVyIHRoZSBbaG9zdDpdcG9ydCwKLSAgIGV0Yy4sIHBhcnQpIHRoZW4gdGhlIHN0cmluZyBhZnRlciB0aGUgPSBpcyBzZW50IGFzIGEgcGF5bG9hZCBmb3IgdGhlIHRjcAotICAgb3IgdWRwIGNvbm5lY3Rpb24gdG8gW2hvc3Q6XXBvcnQuICBuZXRjYXQgaXMgdXNlZCBmb3IgdGhlc2UgU0VORCBjYXNlcwotICAgKGFuZCBtdXN0IGJlIGF2YWlsYWJsZSBvbiBVbml4KS4gIElmIG5ld2xpbmVzIChcbikgYXJlIG5lZWRlZCBpbiB0aGUKLSAgIFNFTkQgc3RyaW5nLCB1c2UgJU5FV0xJTkUuICBTZW5kaW5nIGJpbmFyeSBkYXRhIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOwotICAgdXNlIENNRD0gd2l0aCB5b3VyIG93biBwcm9ncmFtLgotCi0KLSBBZHZhbmNlZCBFeGFtcGxlczoKLQotICAgICAgQ01EPXBvcnRfa25vY2tfY2xpZW50IC1wYXNzd29yZCB3b21iYXQzMwotICAgICAgQ01EWD1wb3J0X2tub2NrX2NsaWVudCAtcGFzc3dvcmQgd29tYmF0MzMgLWhvc3QgJUhPU1QgLXNyYyAlTkFUCi0KLSAgICAgIGZ3LmV4YW1wbGUuY29tOjU0MzMvdWRwIFNFTkQ9QVNETEZLU0pERgotCi0KLSBNb3JlIHRyaWNrczoKLQotICAgICAgVG8gdGVtcG9yYXJpbHkgImNvbW1lbnQgb3V0IiBhIGtub2NrLCBpbnNlcnQgYSBsZWFkaW5nICIjIiBjaGFyYWN0ZXIuCi0KLSAgICAgIFVzZSAic2xlZXAgTiIgdG8gaW5zZXJ0IGEgcmF3IHNsZWVwIGZvciBOIG1pbGxpc2Vjb25kcyAoZS5nLiBiZXR3ZWVuCi0gICAgICBDTUQ9Li4uIGl0ZW1zIG9yIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUga25vY2tzIHRvIHdhaXQpLgotCi0gICAgICBJZiBhIGtub2NrIGVudHJ5IG1hdGNoZXMgImRlbGF5IE4iIHRoZSBkZWZhdWx0IGRlbGF5IGlzIHNldCB0bwotICAgICAgTiBtaWxsaXNlY29uZHMgKGl0IGlzIDE1MCBpbml0aWFsbHkpLgotCi0KLSBPbmUgVGltZSBQYWRzOgotCi0gICAgICBJZiB0aGUgdGV4dCBjb250YWlucyBhIChwcmVzdW1hYmx5IHNpbmdsZSkgbGluZSBvZiB0aGUgZm9ybToKLQotICAgICAgICAgICBQQUQ9L3BhdGgvdG8vYS9vbmUvdGltZS9wYWQvZmlsZQotCi0gICAgICB0aGVuIHRoYXQgZmlsZSBpcyBvcGVuZWQgYW5kIHRoZSBmaXJzdCBub24tYmxhbmsgbGluZSBub3QgYmVnaW5uaW5nCi0gICAgICB3aXRoICIjIiBpcyB1c2VkIGFzIHRoZSBrbm9jayBwYXR0ZXJuLiAgVGhlIHBhZCBmaWxlIGlzIHJld3JpdHRlbgotICAgICAgd2l0aCB0aGF0IGxpbmUgc3RhcnRpbmcgd2l0aCBhICIjIiAoc28gaXQgd2lsbCBiZSBza2lwcGVkIG5leHQgdGltZSkuCi0KLSAgICAgIFRoZSBQQUQ9Li4uIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIHRoZSByZWFkLWluIGtub2NrIHBhdHRlcm4gbGluZS4KLSAgICAgIFNvLCBpZiBuZWVkZWQsIG9uZSBjYW4gcHJlZmFjZSB0aGUgUEFEPS4uLiB3aXRoICJkZWxheSBOIiB0byBzZXQgdGhlCi0gICAgICBkZWZhdWx0IGRlbGF5LCBhbmQgb25lIGNhbiBhbHNvIHB1dCBhICJzbGVlcCBOIiBhZnRlciB0aGUgUEFEPS4uLgotICAgICAgbGluZSB0byBpbmRpY2F0ZSBhIGZpbmFsIHNsZWVwLiAgT25lIGNhbiBhbHNvIHN1cnJvdW5kIHRoZSBQQUQ9Ci0gICAgICBsaW5lIHdpdGggb3RoZXIga25vY2sgYW5kIENNRD0gQ01EWD0gbGluZXMsIGJ1dCB0aGF0IHVzYWdlIHNvdW5kcwotICAgICAgYSBiaXQgcmFyZS4gIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgZGVsYXkgMTAwMAotICAgICAgICAgICBQQUQ9QzpcTXkgUGFkc1x3b3JrLXBhZDEudHh0Ci0gICAgICAgICAgIHNsZWVwIDQwMDAKLQotCi0gUG9ydCBrbm9jayBvbmx5OgotCi0gICAgICBJZiwgaW4gdGhlICdWTkMgSG9zdDpEaXNwbGF5JyBlbnRyeSwgeW91IHVzZSAidXNlckBob3N0bmFtZSBjbWQ9S05PQ0siCi0gICAgICB0aGVuIG9ubHkgdGhlIHBvcnQta25vY2tpbmcgaXMgcGVyZm9ybWVkLiAgQSBzaG9ydGN1dCBmb3IgdGhpcyBpcwotICAgICAgQ3RybC1QIGFzIGxvbmcgYXMgaG9zdG5hbWUgaXMgcHJlc2VudCBpbiB0aGUgZW50cnkgYm94LiAgSWYgaXQKLSAgICAgIG1hdGNoZXMgY21kPUtOT0NLRiwgaS5lLiBhbiBleHRyYSAiRiIsIHRoZW4gdGhlIHBvcnQta25vY2tpbmcKLSAgICAgICJGSU5JU0giIHNlcXVlbmNlIGlzIHNlbnQsIGlmIGFueS4gIEEgc2hvcnRjdXQgZm9yIHRoaXMgU2hpZnQtQ3RybC1QCi0gICAgICBhcyBsb25nIGFzIGhvc3RuYW1lIGlzIHByZXNlbnQuCi19Ci0JLnBrLmYudCBpbnNlcnQgZW5kICRtc2cKLQotCWxhYmVsIC5way5pbmZvIC10ZXh0ICJTdXBwbHkgcG9ydCBrbm9ja2luZyBwYXR0ZXJuOiIgLWFuY2hvciB3IC1yZWxpZWYgcmlkZ2UKLQotCWV2YWwgdGV4dCAucGsucnVsZSAtd2lkdGggODAgLWhlaWdodCA1ICRoZWxwX2ZvbnQKLQkucGsucnVsZSBpbnNlcnQgZW5kICRwb3J0X2tub2NraW5nX2xpc3QKLQotCWJ1dHRvbiAucGsuY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHtzZXQgdXNlX3BvcnRfa25vY2tpbmcgMDsgZGVzdHJveSAucGt9Ci0JYmluZCAucGsgPEVzY2FwZT4ge3NldCB1c2VfcG9ydF9rbm9ja2luZyAwOyBkZXN0cm95IC5wa30KLQl3bSBwcm90b2NvbCAucGsgV01fREVMRVRFX1dJTkRPVyB7c2V0IHVzZV9wb3J0X2tub2NraW5nIDA7IGRlc3Ryb3kgLnBrfQotCWJ1dHRvbiAucGsuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2lmIHskdXNlX3BvcnRfa25vY2tpbmd9IHtzZXQgcG9ydF9rbm9ja2luZ19saXN0IFsucGsucnVsZSBnZXQgMS4wIGVuZF19OyBkZXN0cm95IC5wa30KLQotCXBhY2sgLnBrLmRvbmUgLnBrLmNhbmNlbCAucGsucnVsZSAucGsuaW5mbyAtc2lkZSBib3R0b20gLWZpbGwgeAotCXBhY2sgLnBrLmYgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCi0KLQljZW50ZXJfd2luIC5wawotfQotCi1wcm9jIGNob29zZV9kZXNrdG9wX2RpYWxvZyB7fSB7Ci0JdG9wbGV2IC5zZAotCXdtIHRpdGxlIC5zZCAiRGVza3RvcCBUeXBlIgotCWdsb2JhbCB0c19kZXNrdG9wX3R5cGUgY2hvb3NlX2Rlc2t0b3AKLQotCWdsb2JhbCB0c19kZXNrdG9wX3R5cGVfZGVmCi0Jc2V0IGRlZiAia2RlIgotCWlmIHskdHNfZGVza3RvcF90eXBlX2RlZiAhPSAiIn0gewotCQlzZXQgZGVmICR0c19kZXNrdG9wX3R5cGVfZGVmCi0JfQotCi0JaWYgeyR0c19kZXNrdG9wX3R5cGUgPT0gIiJ9IHsKLQkJc2V0IHRzX2Rlc2t0b3BfdHlwZSAkZGVmCi0JfQotCi0JbGFiZWwgLnNkLmwxIC1hbmNob3IgdyAtdGV4dCAiU2VsZWN0IHRoZSB0eXBlIG9mIHJlbW90ZSBEZXNrdG9wIgotCWxhYmVsIC5zZC5sMiAtYW5jaG9yIHcgLXRleHQgImZvciB5b3VyIHNlc3Npb24gKGRlZmF1bHQ6ICRkZWYpIgotCi0JcmFkaW9idXR0b24gLnNkLmIxIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF90eXBlIC12YWx1ZSBrZGUgICAgICAtdGV4dCBrZGUKLQlyYWRpb2J1dHRvbiAuc2QuYjIgLWFuY2hvciB3IC12YXJpYWJsZSB0c19kZXNrdG9wX3R5cGUgLXZhbHVlIGdub21lICAgIC10ZXh0IGdub21lCi0JcmFkaW9idXR0b24gLnNkLmIzIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF90eXBlIC12YWx1ZSBYc2Vzc2lvbiAtdGV4dCBjZGUKLQlyYWRpb2J1dHRvbiAuc2QuYjQgLWFuY2hvciB3IC12YXJpYWJsZSB0c19kZXNrdG9wX3R5cGUgLXZhbHVlIG13bSAgICAgIC10ZXh0IG13bQotCXJhZGlvYnV0dG9uIC5zZC5iNSAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3BfdHlwZSAtdmFsdWUgd21ha2VyICAgLXRleHQgd21ha2VyCi0JcmFkaW9idXR0b24gLnNkLmI2IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF90eXBlIC12YWx1ZSB4ZmNlICAgICAtdGV4dCB4ZmNlCi0JcmFkaW9idXR0b24gLnNkLmI3IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF90eXBlIC12YWx1ZSBlbmxpZ2h0ZW5tZW50ICAgLXRleHQgZW5saWdodGVubWVudAotCXJhZGlvYnV0dG9uIC5zZC5iOCAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3BfdHlwZSAtdmFsdWUgdHdtICAgICAgLXRleHQgdHdtCi0JcmFkaW9idXR0b24gLnNkLmI5IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF90eXBlIC12YWx1ZSBmYWlsc2FmZSAtdGV4dCBmYWlsc2FmZQotCi0JYnV0dG9uIC5zZC5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLnNkOyBzZXQgY2hvb3NlX2Rlc2t0b3AgMDsgc2V0IHRzX2Rlc2t0b3BfdHlwZSAiIn0KLQliaW5kIC5zZCA8RXNjYXBlPiB7ZGVzdHJveSAuc2Q7IHNldCBjaG9vc2VfZGVza3RvcCAwOyBzZXQgdHNfZGVza3RvcF90eXBlICIifQotCXdtIHByb3RvY29sIC5zZCBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5zZDsgc2V0IGNob29zZV9kZXNrdG9wIDA7IHNldCB0c19kZXNrdG9wX3R5cGUgIiJ9Ci0JYnV0dG9uIC5zZC5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAuc2R9Ci0KLQlwYWNrIC5zZC5sMSAuc2QubDIgLnNkLmIxIC5zZC5iMiAuc2QuYjMgLnNkLmI0IC5zZC5iNSAuc2QuYjYgLnNkLmI3IC5zZC5iOCAuc2QuYjkgLnNkLmNhbmNlbCAuc2QuZG9uZSAtc2lkZSB0b3AgLWZpbGwgeAotCi0JY2VudGVyX3dpbiAuc2QKLX0KLQotcHJvYyBjaG9vc2Vfc2l6ZV9kaWFsb2cge30gewotCXRvcGxldiAuc3oKLQl3bSB0aXRsZSAuc3ogIkRlc2t0b3AgU2l6ZSIKLQlnbG9iYWwgdHNfZGVza3RvcF9zaXplIHRzX2Rlc2t0b3BfZGVwdGggY2hvb3NlX2Rlc2t0b3BfZ2VvbQotCi0Jc2V0IGRlZjEgIjEyODB4MTAyNCIKLQlzZXQgZGVmMiAiMTYiCi0KLQlnbG9iYWwgdHNfZGVza3RvcF9zaXplX2RlZiB0c19kZXNrdG9wX2RlcHRoX2RlZgotCWlmIHskdHNfZGVza3RvcF9zaXplX2RlZiAhPSAiIn0gewotCQlzZXQgZGVmMSAkdHNfZGVza3RvcF9zaXplX2RlZgotCX0KLQlpZiB7JHRzX2Rlc2t0b3BfZGVwdGhfZGVmICE9ICIifSB7Ci0JCXNldCBkZWYyICR0c19kZXNrdG9wX2RlcHRoX2RlZgotCX0KLQotCWlmIHskdHNfZGVza3RvcF9zaXplID09ICIifSB7Ci0JCXNldCB0c19kZXNrdG9wX3NpemUgJGRlZjEKLQl9Ci0JaWYgeyR0c19kZXNrdG9wX2RlcHRoID09ICIifSB7Ci0JCXNldCB0c19kZXNrdG9wX2RlcHRoICRkZWYyCi0JfQotCi0JbGFiZWwgLnN6LmwxIC1hbmNob3IgdyAtdGV4dCAiU2VsZWN0IHRoZSBTaXplIGFuZCBDb2xvciBkZXB0aCIKLQlsYWJlbCAuc3oubDIgLWFuY2hvciB3IC10ZXh0ICJmb3IgeW91ciBEZXNrdG9wIHNlc3Npb24uIgotCWxhYmVsIC5zei5sMyAtYW5jaG9yIHcgLXRleHQgIkRlZmF1bHQ6ICRkZWYxIGFuZCAkZGVmMiBiaXRzL3BpeGVsLiIKLQotCWxhYmVsIC5zei5nMCAtYW5jaG9yIHcgLXRleHQgIldpZHRoIHggSGVpZ2h0OiIgLXJlbGllZiBncm9vdmUKLQotCXJhZGlvYnV0dG9uIC5zei5nMSAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3Bfc2l6ZSAtdmFsdWUgIjY0MHg0ODAiICAgLXRleHQgIiAgICA2NDB4NDgwIgotCXJhZGlvYnV0dG9uIC5zei5nMiAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3Bfc2l6ZSAtdmFsdWUgIjgwMHg2MDAiICAgLXRleHQgIiAgICA4MDB4NjAwIgotCXJhZGlvYnV0dG9uIC5zei5nMyAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3Bfc2l6ZSAtdmFsdWUgIjEwMjR4NzY4IiAgLXRleHQgIiAgMTAyNHg3NjgiCi0JcmFkaW9idXR0b24gLnN6Lmc0IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF9zaXplIC12YWx1ZSAiMTI4MHgxMDI0IiAtdGV4dCAiMTI4MHgxMDI0IgotCXJhZGlvYnV0dG9uIC5zei5nNSAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX2Rlc2t0b3Bfc2l6ZSAtdmFsdWUgIjE0MDB4MTA1MCIgLXRleHQgIjE0MDB4MTA1MCIKLQlyYWRpb2J1dHRvbiAuc3ouZzYgLWFuY2hvciB3IC12YXJpYWJsZSB0c19kZXNrdG9wX3NpemUgLXZhbHVlICIxNjAweDEyMDAiIC10ZXh0ICIxNjAweDEyMDAiCi0JcmFkaW9idXR0b24gLnN6Lmc3IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF9zaXplIC12YWx1ZSAiMTkyMHgxMjAwIiAtdGV4dCAiMTkyMHgxMjAwIgotCi0JZnJhbWUgLnN6LmMKLQlsYWJlbCAuc3ouYy5sIC1hbmNob3IgdyAtdGV4dCAiQ3VzdG9tOiIKLQllbnRyeSAuc3ouYy5lIC13aWR0aCAxMCAtdGV4dHZhcmlhYmxlIHRzX2Rlc2t0b3Bfc2l6ZQotCXBhY2sgLnN6LmMubCAtc2lkZSBsZWZ0Ci0JcGFjayAuc3ouYy5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQliaW5kIC5zei5jLmUgPFJldHVybj4ge2Rlc3Ryb3kgLnN6fQotCi0JbGFiZWwgLnN6LmQwIC1hbmNob3IgdyAtdGV4dCAiQ29sb3IgRGVwdGg6IiAtcmVsaWVmIGdyb292ZQotCi0JcmFkaW9idXR0b24gLnN6LmQxIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF9kZXB0aCAtdmFsdWUgIjgiIC10ZXh0ICAiICA4IGJpdHMvcGl4ZWwiCi0JcmFkaW9idXR0b24gLnN6LmQyIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfZGVza3RvcF9kZXB0aCAtdmFsdWUgIjE2IiAtdGV4dCAiMTYgYml0cy9waXhlbCIKLQlyYWRpb2J1dHRvbiAuc3ouZDMgLWFuY2hvciB3IC12YXJpYWJsZSB0c19kZXNrdG9wX2RlcHRoIC12YWx1ZSAiMjQiIC10ZXh0ICIyNCBiaXRzL3BpeGVsIgotCi0JYnV0dG9uIC5zei5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLnN6OyBzZXQgY2hvb3NlX2Rlc2t0b3BfZ2VvbSAwOyBzZXQgdHNfZGVza3RvcF9zaXplICIiOyBzZXQgdHNfZGVza3RvcF9kZXB0aCAiIn0KLQliaW5kIC5zeiA8RXNjYXBlPiB7ZGVzdHJveSAuc3o7IHNldCBjaG9vc2VfZGVza3RvcF9nZW9tIDA7IHNldCB0c19kZXNrdG9wX3NpemUgIiI7IHNldCB0c19kZXNrdG9wX2RlcHRoICIifQotCXdtIHByb3RvY29sIC5zeiBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5zejsgc2V0IGNob29zZV9kZXNrdG9wX2dlb20gMDsgc2V0IHRzX2Rlc2t0b3Bfc2l6ZSAiIjsgc2V0IHRzX2Rlc2t0b3BfZGVwdGggIiJ9Ci0JYnV0dG9uIC5zei5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAuc3p9Ci0KLQlwYWNrIC5zei5sMSAuc3oubDIgLnN6LmwzIFwKLQkJLnN6LmcwIC5zei5nMSAuc3ouZzIgLnN6LmczIC5zei5nNCAuc3ouZzUgLnN6Lmc2IC5zei5nNyBcCi0JCS5zei5jIFwKLQkJLnN6LmQwIC5zei5kMSAuc3ouZDIgLnN6LmQzIFwKLQkJLnN6LmNhbmNlbCAuc3ouZG9uZSAtc2lkZSB0b3AgLWZpbGwgeAotCi0JY2VudGVyX3dpbiAuc3oKLQlmb2N1cyAuc3ouYy5lCi19Ci0KLXByb2MgY2hvb3NlX3hzZXJ2ZXJfZGlhbG9nIHt9IHsKLQl0b3BsZXYgLnN0Ci0Jd20gdGl0bGUgLnN0ICJYIFNlcnZlciBUeXBlIgotCWdsb2JhbCB0c194c2VydmVyX3R5cGUgY2hvb3NlX3hzZXJ2ZXIKLQotCXNldCBkZWYgIlh2ZmIiCi0JZ2xvYmFsIHRzX3hzZXJ2ZXJfdHlwZV9kZWYKLQlpZiB7JHRzX3hzZXJ2ZXJfdHlwZV9kZWYgIT0gIiJ9IHsKLQkJc2V0IGRlZiAkdHNfeHNlcnZlcl90eXBlX2RlZgotCX0KLQotCWlmIHskdHNfeHNlcnZlcl90eXBlID09ICIifSB7Ci0JCXNldCB0c194c2VydmVyX3R5cGUgJGRlZgotCX0KLQotCWxhYmVsIC5zdC5sMSAtYW5jaG9yIHcgLXRleHQgIlNlbGVjdCB0aGUgdHlwZSBvZiByZW1vdGUgWCBzZXJ2ZXIiCi0JbGFiZWwgLnN0LmwyIC1hbmNob3IgdyAtdGV4dCAiZm9yIHlvdXIgc2Vzc2lvbiAoZGVmYXVsdDogJGRlZikiCi0KLQlyYWRpb2J1dHRvbiAuc3QuYjEgLWFuY2hvciB3IC12YXJpYWJsZSB0c194c2VydmVyX3R5cGUgLXZhbHVlIFh2ZmIgLXRleHQgIlh2ZmIiCi0KLQlyYWRpb2J1dHRvbiAuc3QuYjIgLWFuY2hvciB3IC12YXJpYWJsZSB0c194c2VydmVyX3R5cGUgLXZhbHVlIFhkdW1teSAtdGV4dCAiWGR1bW15IgotCi0JcmFkaW9idXR0b24gLnN0LmIzIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfeHNlcnZlcl90eXBlIC12YWx1ZSBYdm5jIC10ZXh0ICJYdm5jIgotCi0JcmFkaW9idXR0b24gLnN0LmI0IC1hbmNob3IgdyAtdmFyaWFibGUgdHNfeHNlcnZlcl90eXBlIC12YWx1ZSBYdm5jLnJlZGlyZWN0IC10ZXh0ICJYdm5jLnJlZGlyZWN0IgotCi0JYnV0dG9uIC5zdC5jYW5jZWwgLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQge2Rlc3Ryb3kgLnN0OyBzZXQgY2hvb3NlX3hzZXJ2ZXIgMDsgc2V0IHRzX3hzZXJ2ZXJfdHlwZSAiIn0KLQliaW5kIC5zdCA8RXNjYXBlPiB7ZGVzdHJveSAuc3Q7IHNldCBjaG9vc2VfeHNlcnZlciAwOyBzZXQgdHNfeHNlcnZlcl90eXBlICIifQotCXdtIHByb3RvY29sIC5zdCBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5zdDsgc2V0IGNob29zZV94c2VydmVyIDA7IHNldCB0c194c2VydmVyX3R5cGUgIiJ9Ci0JYnV0dG9uIC5zdC5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAuc3R9Ci0KLQlwYWNrIC5zdC5sMSAuc3QubDIgLnN0LmIxIC5zdC5iMiAuc3QuYjMgLnN0LmI0IC5zdC5jYW5jZWwgLnN0LmRvbmUgLXNpZGUgdG9wIC1maWxsIHgKLQotCWNlbnRlcl93aW4gLnN0Ci19Ci0KLXByb2Mgc2V0X3RzX29wdGlvbnMge30gewotCWdsb2JhbCB1c2VfY3VwcyB1c2Vfc291bmQgdXNlX3NtYm1udAotCWdsb2JhbCBjaGFuZ2Vfdm5jdmlld2VyIGNob29zZV94c2VydmVyCi0JZ2xvYmFsIHRzX29ubHkgaXNfd2luZG93cwotCWdsb2JhbCBkYXJ3aW5fY290dm5jIHVzZV94MTFfbWFjb3N4IHVuYW1lCi0JaWYgeyEgJHRzX29ubHl9IHsKLQkJcmV0dXJuCi0JfQotCWNhdGNoIHtkZXN0cm95IC5vfQotCXRvcGxldiAub3QKLQl3bSB0aXRsZSAub3QgIk9wdGlvbnMiCi0KLQlzZXQgaSAxCi0KLQljaGVja2J1dHRvbiAub3QuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgY2hvb3NlX2Rlc2t0b3AgLXRleHQgXAotCQkiRGVza3RvcCBUeXBlIiBcCi0JCS1jb21tYW5kIHtpZiB7JGNob29zZV9kZXNrdG9wfSB7Y2hvb3NlX2Rlc2t0b3BfZGlhbG9nfX0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBjaG9vc2VfZGVza3RvcF9nZW9tIC10ZXh0IFwKLQkJIkRlc2t0b3AgU2l6ZSIgXAotCQktY29tbWFuZCB7aWYgeyRjaG9vc2VfZGVza3RvcF9nZW9tfSB7Y2hvb3NlX3NpemVfZGlhbG9nfX0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBjaG9vc2VfeHNlcnZlciAtdGV4dCBcCi0JCSJYIFNlcnZlciBUeXBlIiBcCi0JCS1jb21tYW5kIHtpZiB7JGNob29zZV94c2VydmVyfSB7Y2hvb3NlX3hzZXJ2ZXJfZGlhbG9nfX0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfY3VwcyAtdGV4dCBcCi0JCSJFbmFibGUgUHJpbnRpbmciIFwKLQkJLWNvbW1hbmQge2lmIHskdXNlX2N1cHN9IHtjdXBzX2RpYWxvZ319Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX3NvdW5kIC10ZXh0IFwKLQkJIkVuYWJsZSBTb3VuZCIgXAotCQktY29tbWFuZCB7aWYgeyR1c2Vfc291bmR9IHtzb3VuZF9kaWFsb2d9fQotCWluY3IgaQotCi0jCWNoZWNrYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2Vfc21ibW50IC10ZXh0IFwKLSMJCSJFbmFibGUgU01CIG1vdW50IHR1bm5lbGxpbmciIFwKLSMJCS1jb21tYW5kIHtpZiB7JHVzZV9zbWJtbnR9IHtzbWJfZGlhbG9nfX0KLSMJaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgY2hvb3NlX2ZpbGV4ZmVyIC10ZXh0IFwKLQkJIkZpbGUgVHJhbnNmZXIiIFwKLQkJLWNvbW1hbmQge2lmIHskY2hvb3NlX2ZpbGV4ZmVyfSB7dHNfZmlsZXhmZXJfZGlhbG9nfX0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2Vfdmlld29ubHkgLXRleHQgXAotCQkiVmlldyBPbmx5IgotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm90LmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIGNoYW5nZV92bmN2aWV3ZXIgLXRleHQgXAotCQkiQ2hhbmdlIFZOQyBWaWV3ZXIiIFwKLQkJLWNvbW1hbmQgY2hhbmdlX3ZuY3ZpZXdlcl9kaWFsb2dfd3JhcAotCWluY3IgaQotCi0JaWYgeyEkaXNfd2luZG93cyAmJiAkdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJY2hlY2tidXR0b24gLm90LmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV94MTFfbWFjb3N4IC10ZXh0IFwKLQkJCSJYMTEgdmlld2VyIE1hY09TWCIgXAotCQkJLWNvbW1hbmQge2lmIHskdXNlX3gxMV9tYWNvc3h9IHtzZXQgZGFyd2luX2NvdHZuYyAwfSBlbHNlIHtzZXQgZGFyd2luX2NvdHZuYyAxfTsgc2V0X2Rhcndpbl9jb3R2bmNfYnV0dG9uc30KLQkJaW5jciBpCi0JfQotCi0JYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC10ZXh0ICIgICBEZWxldGUgUHJvZmlsZS4uLiIgXAotCQktY29tbWFuZCB7ZGVzdHJveSAub3Q7IGRlbGV0ZV9wcm9maWxlfQotCWluY3IgaQotCi0JYnV0dG9uIC5vdC5iJGkgLWFuY2hvciB3IC10ZXh0ICIgICBBZHZhbmNlZCAuLi4iIC1jb21tYW5kIHtzZXRfdHNfYWR2X29wdGlvbnN9Ci0JaW5jciBpCi0KLQlmb3Ige3NldCBqIDF9IHskaiA8ICRpfSB7aW5jciBqfSB7Ci0JCXBhY2sgLm90LmIkaiAtc2lkZSB0b3AgLWZpbGwgeAotCX0KLQotCWZyYW1lIC5vdC5iCi0JYnV0dG9uIC5vdC5iLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5vdH0KLQlidXR0b24gLm90LmIuaGVscCAtdGV4dCAiSGVscCIgLWNvbW1hbmQgaGVscF90c19vcHRzCi0JcGFjayAub3QuYi5oZWxwIC5vdC5iLmRvbmUgLWZpbGwgeCAtZXhwYW5kIDEgLXNpZGUgbGVmdAotCi0JYmluZCAub3QgPEVzY2FwZT4ge2Rlc3Ryb3kgLm90fQotCXdtIHByb3RvY29sIC5vdCBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5vdH0KLQotCXBhY2sgLm90LmIgLXNpZGUgdG9wIC1maWxsIHggCi0KLQljZW50ZXJfd2luIC5vdAotCXdtIHJlc2l6YWJsZSAub3QgMSAwCi0JZm9jdXMgLm90Ci19Ci0KLXByb2Mgc2V0X3RzX2Fkdl9vcHRpb25zIHt9IHsKLQlnbG9iYWwgdHNfb25seSB0c191bml4cHcgdHNfdm5jc2hhcmVkCi0JZ2xvYmFsIHRzX25jYWNoZSB0c19tdWx0aXNlc3Npb24KLQlnbG9iYWwgY2hvb3NlX290aGVydm5jIGRhcndpbl9jb3R2bmMgY2hvb3NlX3NsZWVwCi0JZ2xvYmFsIGlzX3dpbmRvd3MKLQotCWlmIHshICR0c19vbmx5fSB7Ci0JCXJldHVybgotCX0KLQljYXRjaCB7ZGVzdHJveSAub3R9Ci0JdG9wbGV2IC5vdDIKLQl3bSB0aXRsZSAub3QyICJBZHZhbmNlZCIKLQotCXNldCBpIDEKLQotCWNoZWNrYnV0dG9uIC5vdDIuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdHNfdm5jc2hhcmVkIC10ZXh0IFwKLQkJIlZOQyBTaGFyZWQiIFwKLQkJLWNvbW1hbmQge2lmIHskdHNfdm5jc2hhcmVkfSB7dHNfdm5jc2hhcmVkX2RpYWxvZ319Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIGNob29zZV9tdWx0aXNlc3Npb24gLXRleHQgXAotCQkiTXVsdGlwbGUgU2Vzc2lvbnMiIFwKLQkJLWNvbW1hbmQge2lmIHskY2hvb3NlX211bHRpc2Vzc2lvbn0ge3RzX211bHRpX2RpYWxvZ319Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX3hsb2dpbiAtdGV4dCBcCi0JCSJYIExvZ2luIEdyZWV0ZXIiIFwKLQkJLWNvbW1hbmQge2lmIHskdHNfeGxvZ2lufSB7dHNfeGxvZ2luX2RpYWxvZ319Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIGNob29zZV9vdGhlcnZuYyAtdGV4dCBcCi0JCSJPdGhlciBWTkMgU2VydmVyIiBcCi0JCS1jb21tYW5kIHtpZiB7JGNob29zZV9vdGhlcnZuY30ge3RzX290aGVydm5jX2RpYWxvZ319Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHRzX3VuaXhwdyAtdGV4dCBcCi0JCSJVc2UgdW5peHB3IiBcCi0JCS1jb21tYW5kIHtpZiB7JHRzX3VuaXhwd30ge3RzX3VuaXhwd19kaWFsb2d9fQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm90Mi5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfYmdyMjMzIC10ZXh0IFwKLQkJIkNsaWVudCA4Yml0IENvbG9yIgotCWlmIHskZGFyd2luX2NvdHZuY30gey5vdDIuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JZ2xvYmFsIGRhcndpbl9jb3R2bmNfYmxpc3QKLQlzZXQgZGFyd2luX2NvdHZuY19ibGlzdCgub3QyLmIkaSkgMQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm90Mi5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBjaG9vc2VfbmNhY2hlIC10ZXh0IFwKLQkJIkNsaWVudC1TaWRlIENhY2hpbmciIFwKLQkJLWNvbW1hbmQge2lmIHskY2hvb3NlX25jYWNoZX0ge3RzX25jYWNoZV9kaWFsb2d9fQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm90Mi5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBjaG9vc2VfeDExdm5jX29wdHMgLXRleHQgXAotCQkiWDExVk5DIE9wdGlvbnMiIFwKLQkJLWNvbW1hbmQge2lmIHskY2hvb3NlX3gxMXZuY19vcHRzfSB7dHNfeDExdm5jX29wdHNfZGlhbG9nfX0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vdDIuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgY2hvb3NlX3NsZWVwIC10ZXh0IFwKLQkJIkV4dHJhIFNsZWVwIiBcCi0JCS1jb21tYW5kIHtpZiB7JGNob29zZV9zbGVlcH0ge3RzX3NsZWVwX2RpYWxvZ319Ci0JaW5jciBpCi0KLSAgICAgICAgaWYgeyRpc193aW5kb3dzfSB7Ci0JCWNoZWNrYnV0dG9uIC5vdDIuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgY2hvb3NlX3BhcmcgLXRleHQgXAotCQkJIlB1dHR5IEFyZ3MiIFwKLQkJCS1jb21tYW5kIHtpZiB7JGNob29zZV9wYXJnfSB7dHNfcHV0dHlfYXJnc19kaWFsb2d9fQotCQlpbmNyIGkKLSAgICAgICAgfQotCi0JaWYgeyEkaXNfd2luZG93c30gewotCQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNzaF9sb2NhbF9wcm90ZWN0aW9uIC10ZXh0IFwKLQkJCSJTU0ggTG9jYWwgUHJvdGVjdGlvbnMiIFwKLQkJCS1jb21tYW5kIHtpZiB7JHNzaF9sb2NhbF9wcm90ZWN0aW9ufSB7c3NoX3NlY19kaWFsb2d9fQotCQlpZiB7JGlzX3dpbmRvd3N9IHsub3QyLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQlpbmNyIGkKLQotCQljaGVja2J1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNzaF9rbm93bl9ob3N0cyAtdGV4dCBcCi0JCQkiU1NIIEtub3duSG9zdHMgZmlsZSIgXAotCQkJLWNvbW1hbmQge2lmIHskc3NoX2tub3duX2hvc3RzfSB7c3NoX2tub3duX2hvc3RzX2RpYWxvZ319Ci0JCWlmIHskaXNfd2luZG93c30gey5vdDIuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWluY3IgaQotCX0KLQotCWlmIHskaXNfd2luZG93c30gewotCQlidXR0b24gLm90Mi5iJGkgLWFuY2hvciB3IC10ZXh0ICIgICBQdXR0eSBBZ2VudCIgXAotCQkJLWNvbW1hbmQge2NhdGNoIHtleGVjIHBhZ2VhbnQuZXhlICZ9fQotCQlpbmNyIGkKLQotCQlidXR0b24gLm90Mi5iJGkgLWFuY2hvciB3IC10ZXh0ICIgICBQdXR0eSBLZXktR2VuIiBcCi0JCQktY29tbWFuZCB7Y2F0Y2gge2V4ZWMgcHV0dHlnZW4uZXhlICZ9fQotCQlpbmNyIGkKLQl9Ci0KLQlnbG9iYWwgZW52Ci0JaWYgeyFbaW5mbyBleGlzdHMgZW52KFNTVk5DX1RTX0FMV0FZUyldfSB7Ci0JCWJ1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXRleHQgIiAgIFNTVk5DIE1vZGUiIFwKLQkJCS1jb21tYW5kIHtkZXN0cm95IC5vdDI7IHRvX3Nzdm5jfQotCQlpbmNyIGkKLQl9Ci0KLQlpZiB7ISRpc193aW5kb3dzfSB7Ci0JCWJ1dHRvbiAub3QyLmIkaSAtYW5jaG9yIHcgLXRleHQgIiAgIFVuaXggc3N2bmN2aWV3ZXIgLi4uIiBcCi0JCQktY29tbWFuZCB7c2V0X3Nzdm5jdmlld2VyX29wdGlvbnN9Ci0JCWlmIHskaXNfd2luZG93c30gewotCQkJLm90Mi5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQl9Ci0JCWdsb2JhbCBjaGFuZ2Vfdm5jdmlld2VyCi0JCWlmIHskY2hhbmdlX3ZuY3ZpZXdlcn0gewotCQkJLm90Mi5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQl9Ci0JCWdsb2JhbCB0c191c3NfYnV0dG9uCi0JCXNldCB0c191c3NfYnV0dG9uIC5vdDIuYiRpCi0JCWluY3IgaQotCX0KLQotCWZvciB7c2V0IGogMX0geyRqIDwgJGl9IHtpbmNyIGp9IHsKLQkJcGFjayAub3QyLmIkaiAtc2lkZSB0b3AgLWZpbGwgeAotCX0KLQotCWZyYW1lIC5vdDIuYgotCWJ1dHRvbiAub3QyLmIuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLm90Mn0KLQlidXR0b24gLm90Mi5iLmhlbHAgLXRleHQgIkhlbHAiIC1jb21tYW5kIGhlbHBfdHNfb3B0cwotCXBhY2sgLm90Mi5iLmhlbHAgLm90Mi5iLmRvbmUgLWZpbGwgeCAtZXhwYW5kIDEgLXNpZGUgbGVmdAotCi0JYmluZCAub3QyIDxFc2NhcGU+IHtkZXN0cm95IC5vdDJ9Ci0Jd20gcHJvdG9jb2wgLm90MiBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5vdDJ9Ci0KLQlwYWNrIC5vdDIuYiAtc2lkZSB0b3AgLWZpbGwgeCAKLQotCWNlbnRlcl93aW4gLm90MgotCXdtIHJlc2l6YWJsZSAub3QyIDEgMAotCWZvY3VzIC5vdDIKLX0KLQotcHJvYyBjaGFuZ2Vfdm5jdmlld2VyX2RpYWxvZ193cmFwIHt9IHsKLQlnbG9iYWwgY2hhbmdlX3ZuY3ZpZXdlciB0c191c3NfYnV0dG9uIGlzX3dpbmRvd3MKLQlpZiB7JGNoYW5nZV92bmN2aWV3ZXJ9IHsKLQkJY2hhbmdlX3ZuY3ZpZXdlcl9kaWFsb2cKLQkJY2F0Y2gge3Rrd2FpdCB3aW5kb3cgLmNodmlld2VyfQotCX0KLQlpZiB7JGNoYW5nZV92bmN2aWV3ZXIgfHwgJGlzX3dpbmRvd3N9IHsKLQkJY2F0Y2ggey5vYS5zcyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCX0gZWxzZSB7Ci0JCWNhdGNoIHsub2Euc3MgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JfQotCWlmIFtpbmZvIGV4aXN0cyB0c191c3NfYnV0dG9uXSB7Ci0JCWlmIHskY2hhbmdlX3ZuY3ZpZXdlciB8fCAkaXNfd2luZG93c30gewotCQkJY2F0Y2ggeyR0c191c3NfYnV0dG9uIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCX0gZWxzZSB7Ci0JCQljYXRjaCB7JHRzX3Vzc19idXR0b24gY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCX0KLQl9Ci19Ci0KLXByb2Mgc2V0X2FkdmFuY2VkX29wdGlvbnMge30gewotCWdsb2JhbCB1c2VfY3VwcyB1c2Vfc291bmQgdXNlX3NtYm1udAotCWdsb2JhbCBjaGFuZ2Vfdm5jdmlld2VyCi0JZ2xvYmFsIHVzZV9wb3J0X2tub2NraW5nIHBvcnRfa25vY2tpbmdfbGlzdAotCWdsb2JhbCBpc193aW5kb3dzIGRhcndpbl9jb3R2bmMKLQlnbG9iYWwgdXNlX3NzaCB1c2Vfc3Noc3NsCi0JZ2xvYmFsIHVzZV94MTFfbWFjb3N4Ci0JZ2xvYmFsIGFkdl9zc2gKLQlnbG9iYWwgc2hvd2luZ19ub19lbmNyeXB0aW9uCi0JZ2xvYmFsIHgxMXZuY194bG9naW5fd2lkZ2V0Ci0KLQljYXRjaCB7ZGVzdHJveSAub30KLQl0b3BsZXYgLm9hCi0Jd20gdGl0bGUgLm9hICJBZHZhbmNlZCBPcHRpb25zIgotCi0Jc2V0IGkgMQotCi0JY2hlY2tidXR0b24gLm9hLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9jdXBzIC10ZXh0IFwKLQkJIkVuYWJsZSBDVVBTIFByaW50IHR1bm5lbGxpbmciIFwKLQkJLWNvbW1hbmQge2lmIHskdXNlX2N1cHN9IHtjdXBzX2RpYWxvZ319Ci0JaWYgeyEkdXNlX3NzaCAmJiAhJHVzZV9zc2hzc2x9IHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0Jc2V0IGFkdl9zc2goY3VwcykgLm9hLmIkaQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm9hLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9zb3VuZCAtdGV4dCBcCi0JCSJFbmFibGUgRVNEL0FSVFNEIEF1ZGlvIHR1bm5lbGxpbmciIFwKLQkJLWNvbW1hbmQge2lmIHskdXNlX3NvdW5kfSB7c291bmRfZGlhbG9nfX0KLQlpZiB7ISR1c2Vfc3NoICYmICEkdXNlX3NzaHNzbH0gey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlzZXQgYWR2X3NzaChzbmQpIC5vYS5iJGkKLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2Vfc21ibW50IC10ZXh0IFwKLQkJIkVuYWJsZSBTTUIgbW91bnQgdHVubmVsbGluZyIgXAotCQktY29tbWFuZCB7aWYgeyR1c2Vfc21ibW50fSB7c21iX2RpYWxvZ319Ci0JaWYgeyEkdXNlX3NzaCAmJiAhJHVzZV9zc2hzc2x9IHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0Jc2V0IGFkdl9zc2goc21iKSAub2EuYiRpCi0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub2EuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX3gxMXZuY194bG9naW4gLXRleHQgXAotCQkiQXV0b21hdGljYWxseSBGaW5kIFggTG9naW4vR3JlZXRlciIgLWNvbW1hbmQge3gxMXZuY19maW5kX2FkanVzdCAieGxvZ2luIn0KLQlpZiB7ISR1c2Vfc3NoICYmICEkdXNlX3NzaHNzbH0gey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlzZXQgeDExdm5jX3hsb2dpbl93aWRnZXQgIi5vYS5iJGkiCi0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAub2EuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgYWRkaXRpb25hbF9wb3J0X3JlZGlycyAtdGV4dCBcCi0JCSJBZGRpdGlvbmFsIFBvcnQgUmVkaXJzICh2aWEgU1NIKSIgXAotCQktY29tbWFuZCB7aWYgeyRhZGRpdGlvbmFsX3BvcnRfcmVkaXJzfSB7cG9ydF9yZWRpcl9kaWFsb2d9fQotCWlmIHshJHVzZV9zc2ggJiYgISR1c2Vfc3Noc3NsfSB7Lm9hLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXNldCBhZHZfc3NoKHJlZGlycykgLm9hLmIkaQotCWluY3IgaQotCi0JZ2xvYmFsIHVzZV9zc2wgdXNlX3NzaCB1c2Vfc3Noc3NsCi0KLQlpZiB7ISRpc193aW5kb3dzfSB7Ci0JCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBzc2hfa25vd25faG9zdHMgLXRleHQgXAotCQkJIlByaXZhdGUgU1NIIEtub3duSG9zdHMgZmlsZSIgXAotCQkJLWNvbW1hbmQge2lmIHskc3NoX2tub3duX2hvc3RzfSB7c3NoX2tub3duX2hvc3RzX2RpYWxvZ319Ci0JCXNldCBhZHZfc3NoKGtub3duaG9zdHMpIC5vYS5iJGkKLQkJaWYgeyR1c2Vfc3NsfSAgICB7Lm9hLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQlpZiB7JGlzX3dpbmRvd3N9IHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWluY3IgaQotCi0JCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBzc2hfbG9jYWxfcHJvdGVjdGlvbiAtdGV4dCBcCi0JCQkiU1NIIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMiIFwKLQkJCS1jb21tYW5kIHtpZiB7JHNzaF9sb2NhbF9wcm90ZWN0aW9ufSB7c3NoX3NlY19kaWFsb2d9fQotCQlnbG9iYWwgc3NoX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uCi0JCXNldCBzc2hfbG9jYWxfcHJvdGVjdGlvbl9idXR0b24gLm9hLmIkaQotCQlpZiB7JHVzZV9zc2x9ICAgIHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWlmIHskaXNfd2luZG93c30gey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJaW5jciBpCi0JfQotCi0gICBnbG9iYWwgc3NoX29ubHkKLSAgIGlmIHshJHNzaF9vbmx5fSB7Ci0JaWYgeyEkaXNfd2luZG93c30gewotCQljaGVja2J1dHRvbiAub2EuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgc3R1bm5lbF9sb2NhbF9wcm90ZWN0aW9uIC10ZXh0IFwKLQkJCSJTVFVOTkVMIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMiIFwKLQkJCS1jb21tYW5kIHtpZiB7JHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbn0ge3N0dW5uZWxfc2VjX2RpYWxvZ319Ci0JCWdsb2JhbCBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uCi0JCXNldCBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uIC5vYS5iJGkKLQkJaWYgeyR1c2Vfc3NofSAgICB7Lm9hLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQlpZiB7JGlzX3dpbmRvd3N9IHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWluY3IgaQotCX0KLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBkaXNhYmxlX3NzbF93b3JrYXJvdW5kcyAtdGV4dCBcCi0JCSJEaXNhYmxlIFNTTCBXb3JrYXJvdW5kcyIgXAotCQktY29tbWFuZCB7aWYgeyRkaXNhYmxlX3NzbF93b3JrYXJvdW5kc30ge2Rpc2FibGVfc3NsX3dvcmthcm91bmRzX2RpYWxvZ319Ci0JZ2xvYmFsIGRpc2FibGVfc3NsX3dvcmthcm91bmRzX2J1dHRvbgotCXNldCBkaXNhYmxlX3NzbF93b3JrYXJvdW5kc19idXR0b24gLm9hLmIkaQotCWlmIHskdXNlX3NzaH0gICAgey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWlmIHshJGlzX3dpbmRvd3N9IHsKLQkJY2hlY2tidXR0b24gLm9hLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVsdHJhX2RzbSAtdGV4dCBcCi0JCQkiVWx0cmFWTkMgRFNNIEVuY3J5cHRpb24gUGx1Z2luIiBcCi0JCQktY29tbWFuZCB7aWYgeyR1bHRyYV9kc219IHt1bHRyYV9kc21fZGlhbG9nfX0KLQkJZ2xvYmFsIHVsdHJhX2RzbV9idXR0b24KLQkJc2V0IHVsdHJhX2RzbV9idXR0b24gLm9hLmIkaQotCQlpZiB7JGlzX3dpbmRvd3N9IHsub2EuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWlmIHskdXNlX3NzaH0gICAgey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJaW5jciBpCi0JfQotCi0JY2hlY2tidXR0b24gLm9hLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIG5vX3Byb2JlX3ZlbmNyeXB0IC10ZXh0IFwKLQkJIkRvIG5vdCBQcm9iZSBmb3IgVmVOQ3J5cHQiCi0JZ2xvYmFsIG5vX3Byb2JlX3ZlbmNyeXB0X2J1dHRvbgotCXNldCBub19wcm9iZV92ZW5jcnlwdF9idXR0b24gLm9hLmIkaQotCWlmIHskdXNlX3NzaH0gICAgey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBzZXJ2ZXJfdmVuY3J5cHQgLXRleHQgXAotCQkiU2VydmVyIHVzZXMgVmVOQ3J5cHQgU1NMIGVuY3J5cHRpb24iCi0JZ2xvYmFsIHZlbmNyeXB0X2J1dHRvbgotCXNldCB2ZW5jcnlwdF9idXR0b24gLm9hLmIkaQotCWlmIHskdXNlX3NzaH0gICAgey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBzZXJ2ZXJfYW5vbmRoIC10ZXh0IFwKLQkJIlNlcnZlciB1c2VzIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiIgLWNvbW1hbmQgbm9fY2VydHNfdHV0b3JpYWxfbWVzZwotCWdsb2JhbCBhbm9uZGhfYnV0dG9uCi0Jc2V0IGFub25kaF9idXR0b24gLm9hLmIkaQotCWlmIHskdXNlX3NzaH0gICAgey5vYS5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLSAgIH0KLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBjaGFuZ2Vfdm5jdmlld2VyIC10ZXh0IFwKLQkJIkNoYW5nZSBWTkMgVmlld2VyIiBcCi0JCS1jb21tYW5kIGNoYW5nZV92bmN2aWV3ZXJfZGlhbG9nX3dyYXAKLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vYS5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfcG9ydF9rbm9ja2luZyAtdGV4dCBcCi0JCSJQb3J0IEtub2NraW5nIiBcCi0JCS1jb21tYW5kIHtpZiB7JHVzZV9wb3J0X2tub2NraW5nfSB7cG9ydF9rbm9ja2luZ19kaWFsb2d9fQotCWluY3IgaQotCi0JZm9yIHtzZXQgaiAxfSB7JGogPCAkaX0ge2luY3Igan0gewotCQlwYWNrIC5vYS5iJGogLXNpZGUgdG9wIC1maWxsIHgKLQl9Ci0KLQlnbG9iYWwgaW5jbHVkZV9saXN0IGV4dHJhX3NsZWVwCi0JZnJhbWUgLm9hLmZpcwotCWZyYW1lIC5vYS5maXMuZkwKLQlmcmFtZSAub2EuZmlzLmZSCi0JbGFiZWwgLm9hLmZpcy5mTC5sYSAtYW5jaG9yIHcgLXRleHQgIkluY2x1ZGU6IgotCWxhYmVsIC5vYS5maXMuZkwubGIgLWFuY2hvciB3IC10ZXh0ICJTbGVlcDoiCi0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCWxhYmVsIC5vYS5maXMuZkwubGMgLWFuY2hvciB3IC10ZXh0ICJQdXR0eSBBcmdzOiIKLQkJcGFjayAub2EuZmlzLmZMLmxhIC5vYS5maXMuZkwubGIgLm9hLmZpcy5mTC5sYyAtc2lkZSB0b3AgLWZpbGwgeAotCX0gZWxzZSB7Ci0JCXBhY2sgLm9hLmZpcy5mTC5sYSAub2EuZmlzLmZMLmxiIC1zaWRlIHRvcCAtZmlsbCB4Ci0JfQotCi0JZW50cnkgLm9hLmZpcy5mUi5lYSAtd2lkdGggMTAgLXRleHR2YXJpYWJsZSBpbmNsdWRlX2xpc3QKLQllbnRyeSAub2EuZmlzLmZSLmViIC13aWR0aCAxMCAtdGV4dHZhcmlhYmxlIGV4dHJhX3NsZWVwCi0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCWVudHJ5IC5vYS5maXMuZlIuZWMgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgcHV0dHlfYXJncwotCQlwYWNrIC5vYS5maXMuZlIuZWEgLm9hLmZpcy5mUi5lYiAub2EuZmlzLmZSLmVjIC1zaWRlIHRvcCAtZmlsbCB4Ci0JfSBlbHNlIHsKLQkJcGFjayAub2EuZmlzLmZSLmVhIC5vYS5maXMuZlIuZWIgLXNpZGUgdG9wIC1maWxsIHgKLQl9Ci0KLQlwYWNrIC5vYS5maXMuZkwgLXNpZGUgbGVmdAotCXBhY2sgLm9hLmZpcy5mUiAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JcGFjayAub2EuZmlzIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQotCWlmIHshJGlzX3dpbmRvd3N9IHsKLQkJZ2xvYmFsIHVuYW1lCi0JCXNldCB0MSAiICAgICAgICAgVW5peCBzc3ZuY3ZpZXdlciAuLi4iCi0JCWlmIHskdW5hbWUgPT0gIkRhcndpbiIgfSB7IHJlZ3N1YiB7XiAqfSAkdDEgIiIgdDEgfQotCQlidXR0b24gLm9hLnNzIC1hbmNob3IgdyAtdGV4dCAkdDEgLWNvbW1hbmQgc2V0X3Nzdm5jdmlld2VyX29wdGlvbnMKLQkJcGFjayAgIC5vYS5zcyAtc2lkZSB0b3AgLWZpbGwgeAotCQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJCS5vYS5zcyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCX0KLQkJZ2xvYmFsIGNoYW5nZV92bmN2aWV3ZXIKLQkJaWYgeyRjaGFuZ2Vfdm5jdmlld2VyfSB7Ci0JCQkub2Euc3MgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQl9Ci0KLQkJc2V0IHQyICIgICAgICAgICBVc2Ugc3NoLWFnZW50IgotCQlpZiB7JHVuYW1lID09ICJEYXJ3aW4iIH0geyByZWdzdWIge14gKn0gJHQyICIiIHQyIH0KLQotCQlidXR0b24gLm9hLnNhIC1hbmNob3IgdyAtdGV4dCAkdDIgLWNvbW1hbmQgc3NoX2FnZW50X3Jlc3RhcnQKLQkJcGFjayAub2Euc2EgLXNpZGUgdG9wIC1maWxsIHgKLQkJaWYgeyRpc193aW5kb3dzfSB7Ci0JCQkub2Euc2EgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQl9Ci0JfSBlbHNlIHsKLQkJc2V0IHQxICIgICAgICAgICBMYXVuY2ggUHV0dHkgQWdlbnQiCi0JCWJ1dHRvbiAub2EucGEgLWFuY2hvciB3IC10ZXh0ICR0MSAtY29tbWFuZCB7Y2F0Y2gge2V4ZWMgcGFnZWFudC5leGUgJn19Ci0JCXBhY2sgICAub2EucGEgLXNpZGUgdG9wIC1maWxsIHgKLQotCQlzZXQgdDIgIiAgICAgICAgIExhdW5jaCBQdXR0eSBLZXktR2VuIgotCQlidXR0b24gLm9hLnBnIC1hbmNob3IgdyAtdGV4dCAkdDIgLWNvbW1hbmQge2NhdGNoIHtleGVjIHB1dHR5Z2VuLmV4ZSAmfX0KLQkJcGFjayAgIC5vYS5wZyAtc2lkZSB0b3AgLWZpbGwgeAotCX0KLQotCWZyYW1lIC5vYS5iCi0JYnV0dG9uIC5vYS5iLmRvbmUgLXRleHQgIkRvbmUiIC1jb21tYW5kIHtkZXN0cm95IC5vYX0KLQliaW5kIC5vYSA8RXNjYXBlPiB7ZGVzdHJveSAub2F9Ci0Jd20gcHJvdG9jb2wgLm9hIFdNX0RFTEVURV9XSU5ET1cge2Rlc3Ryb3kgLm9hfQotCWJ1dHRvbiAub2EuYi5oZWxwIC10ZXh0ICJIZWxwIiAtY29tbWFuZCBoZWxwX2FkdmFuY2VkX29wdHMKLQotCWdsb2JhbCB1c2VfbGlzdGVuCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCWJ1dHRvbiAub2EuYi5jb25uZWN0IC10ZXh0ICJMaXN0ZW4iIC1jb21tYW5kIGxhdW5jaAotCX0gZWxzZSB7Ci0JCWJ1dHRvbiAub2EuYi5jb25uZWN0IC10ZXh0ICJDb25uZWN0IiAtY29tbWFuZCBsYXVuY2gKLQl9Ci0KLQlwYWNrIC5vYS5iLmhlbHAgLm9hLmIuY29ubmVjdCAub2EuYi5kb25lIC1maWxsIHggLWV4cGFuZCAxIC1zaWRlIGxlZnQKLQotCXBhY2sgLm9hLmIgLXNpZGUgdG9wIC1maWxsIHggCi0KLQljZW50ZXJfd2luIC5vYQotCXdtIHJlc2l6YWJsZSAub2EgMSAwCi0JZm9jdXMgLm9hCi19Ci0KLXByb2Mgc2V0X3Nzdm5jdmlld2VyX29wdGlvbnMge30gewotCWdsb2JhbCBpc193aW5kb3dzIGRhcndpbl9jb3R2bmMKLQlnbG9iYWwgdXNlX3NzaCB1c2Vfc3Noc3NsIHVzZV94MTFjdXJzb3IgdXNlX3Jhd2xvY2FsIHVzZV9ub3R0eSB1c2VfcG9wdXBmaXggdXNlX2FscGhhIHVzZV90dXJib3ZuYyBkaXNhYmxlX3BpcGVsaW5lIHVzZV9ncmFiIHVzZV9ub2JlbGwKLQlnbG9iYWwgdXNlX3NlbmRfY2xpcGJvYXJkIHVzZV9zZW5kX2Fsd2F5cwotCWdsb2JhbCBzc3ZuY19zY2FsZSBzc3ZuY19lc2NhcGUKLQlnbG9iYWwgc2VydmVyX3ZlbmNyeXB0IHNlcnZlcl9hbm9uZGgKLQotCWlmIHskaXNfd2luZG93c30gewotCQlyZXR1cm4KLQl9Ci0KLQljYXRjaCB7ZGVzdHJveSAub2F9Ci0JdG9wbGV2IC5vcwotCXdtIHRpdGxlIC5vcyAiVW5peCBzc3ZuY3ZpZXdlciBPcHRpb25zIgotCi0Jc2V0IGRhcndpbmxpc3QgW2xpc3RdCi0KLQlzZXQgZjAgLm9zLmYKLQlmcmFtZSAkZjAKLQlzZXQgZmwgJGYwLmZsCi0JZnJhbWUgJGZsCi0Jc2V0IGZyICRmMC5mcgotCWZyYW1lICRmcgotCi0Jc2V0IGkgMQotCXNldCBqIDEKLQotCWNoZWNrYnV0dG9uICRmbC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBtdWx0aXBsZV9saXN0ZW4gLXRleHQgXAotCQkiTXVsdGlwbGUgTElTVEVOIENvbm5lY3Rpb25zIiBcCi0JCS1jb21tYW5kIHtpZiB7JG11bHRpcGxlX2xpc3Rlbn0ge211bHRpbGlzdGVuX2RpYWxvZ319Ci0JZ2xvYmFsIG11bHRpcGxlX2xpc3Rlbl9idXR0b24gdXNlX2xpc3RlbgotCXNldCBtdWx0aXBsZV9saXN0ZW5fYnV0dG9uICRmbC5iJGkKLQlpZiB7JGlzX3dpbmRvd3N9ICB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWlmIHshJHVzZV9saXN0ZW59IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmbC5iJGk7IGlmIHskZGFyd2luX2NvdHZuY30geyRmbC5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uICRmbC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBsaXN0ZW5fb25jZSAtdGV4dCBcCi0JCSJMaXN0ZW4gT25jZSIKLQlnbG9iYWwgbGlzdGVuX29uY2VfYnV0dG9uCi0Jc2V0IGxpc3Rlbl9vbmNlX2J1dHRvbiAkZmwuYiRpCi0JaWYgeyEkdXNlX2xpc3Rlbn0geyRmbC5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIGxpc3Rlbl9hY2NlcHRfcG9wdXAgLXRleHQgXAotCQkiTGlzdGVuIEFjY2VwdCBQb3B1cCBEaWFsb2ciIFwKLQkJLWNvbW1hbmQgeyBpZiB7JGxpc3Rlbl9hY2NlcHRfcG9wdXB9IHsgY2F0Y2ggeyRsaXN0ZW5fYWNjZXB0X3BvcHVwX2J1dHRvbl9zYyBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0gfSBlbHNlIHsgY2F0Y2ggeyRsaXN0ZW5fYWNjZXB0X3BvcHVwX2J1dHRvbl9zYyAgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0gfSB9Ci0JZ2xvYmFsIGxpc3Rlbl9hY2NlcHRfcG9wdXBfYnV0dG9uCi0Jc2V0IGxpc3Rlbl9hY2NlcHRfcG9wdXBfYnV0dG9uICRmbC5iJGkKLQlpZiB7ISR1c2VfbGlzdGVufSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWxhcHBlbmQgZGFyd2lubGlzdCAkZmwuYiRpOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JaW5jciBpCi0KLQlnbG9iYWwgbGlzdGVuX2FjY2VwdF9wb3B1cAotCWNoZWNrYnV0dG9uICRmbC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBsaXN0ZW5fYWNjZXB0X3BvcHVwX3NjIC10ZXh0IFwKLQkJIiAgIEFjY2VwdCBQb3B1cCBVbHRyYVZOQyBTaW5nbGUgQ2xpY2siCi0JZ2xvYmFsIGxpc3Rlbl9hY2NlcHRfcG9wdXBfYnV0dG9uX3NjCi0Jc2V0IGxpc3Rlbl9hY2NlcHRfcG9wdXBfYnV0dG9uX3NjICRmbC5iJGkKLQlpZiB7ISR1c2VfbGlzdGVufSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWlmIHshJGxpc3Rlbl9hY2NlcHRfcG9wdXB9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmbC5iJGk7IGlmIHskZGFyd2luX2NvdHZuY30geyRmbC5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uICRmbC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfeDExY3Vyc29yIC10ZXh0IFwKLQkJIlVzZSBYMTEgQ3Vyc29yIgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZmwuYiRpOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAkZmwuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX25vYmVsbCAtdGV4dCBcCi0JCSJEaXNhYmxlIEJlbGwiCi0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmbC5iJGk7IGlmIHskZGFyd2luX2NvdHZuY30geyRmbC5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uICRmbC5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfcmF3bG9jYWwgLXRleHQgXAotCQkiVXNlIFJhdyBMb2NhbCIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9ub3R0eSAtdGV4dCBcCi0JCSJBdm9pZCBVc2luZyBUZXJtaW5hbCIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9wb3B1cGZpeCAtdGV4dCBcCi0JCSJVc2UgUG9wdXAgRml4IgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZmwuYiRpOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAkZmwuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX2dyYWIgLXRleHQgXAotCQkiVXNlIFhHcmFiU2VydmVyIChmb3IgZnVsbHNjcmVlbikiIFwKLQkJLWNvbW1hbmQge2lmIHskdXNlX2dyYWJ9IHt1c2VfZ3JhYl9kaWFsb2d9fQotCWxhcHBlbmQgZGFyd2lubGlzdCAkZmwuYiRpOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAkZmwuYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX2FscGhhIC10ZXh0IFwKLQkJIkN1cnNvciBBbHBoYWJsZW5kaW5nICgzMmJwcCByZXF1aXJlZCkgICAgICIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV90dXJib3ZuYyAtdGV4dCBcCi0JCSJUdXJib1ZOQyAoaWYgYXZhaWxhYmxlIG9uIHBsYXRmb3JtKSIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIGRpc2FibGVfcGlwZWxpbmUgLXRleHQgXAotCQkiRGlzYWJsZSBQaXBlbGluZWQgVXBkYXRlcyIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9zZW5kX2NsaXBib2FyZCAtdGV4dCBcCi0JCSJTZW5kIENMSVBCT0FSRCBub3QgUFJJTUFSWSIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZsLmIkaTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZsLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWluY3IgaQotCi0JY2hlY2tidXR0b24gJGZsLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9zZW5kX2Fsd2F5cyAtdGV4dCBcCi0JCSJTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lIgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZmwuYiRpOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZmwuYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JaW5jciBpCi0KLQlzZXQgcmVsaWVmIHJpZGdlCi0KLQlmcmFtZSAkZnIuYiRqIC1oZWlnaHQgMjsgaW5jciBqCi0KLQlmcmFtZSAkZnIuYiRqIC1yZWxpZWYgJHJlbGllZiAtYm9yZGVyd2lkdGggMgotCi0JZ2xvYmFsIGZmb250Ci0JbGFiZWwgJGZyLmIkai5sIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXRleHQgIkV4YW1wbGVzOiAnMC43NScsICcxMDI0eDc2OCcsICdmaXQnIChmaWxsIHNjcmVlbiksIG9yICdhdXRvJyAiOwotCi0JZ2xvYmFsIHNzdm5jX3NjYWxlCi0JZnJhbWUgJGZyLmIkai5mCi0JbGFiZWwgJGZyLmIkai5mLmwgLXRleHQgIlNjYWxpbmc6ICIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmw7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JZW50cnkgJGZyLmIkai5mLmUgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgc3N2bmNfc2NhbGUKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmU7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JcGFjayAkZnIuYiRqLmYubCAtc2lkZSBsZWZ0Ci0JcGFjayAkZnIuYiRqLmYuZSAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JcGFjayAkZnIuYiRqLmYgJGZyLmIkai5sIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLWhlaWdodCAyOyBpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLXJlbGllZiAkcmVsaWVmIC1ib3JkZXJ3aWR0aCAyCi0KLQlsYWJlbCAkZnIuYiRqLmwgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdGV4dCAiRXhhbXBsZXM6ICdkZWZhdWx0JywgJ0NvbnRyb2xfTCxBbHRfTCcsICduZXZlciciOwotCi0JZ2xvYmFsIHNzdm5jX2VzY2FwZQotCWZyYW1lICRmci5iJGouZgotCWxhYmVsICRmci5iJGouZi5sIC10ZXh0ICJFc2NhcGUgS2V5czogIgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZnIuYiRqLmYubDsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZyLmIkai5mLmwgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQllbnRyeSAkZnIuYiRqLmYuZSAtd2lkdGggMTAgLXRleHR2YXJpYWJsZSBzc3ZuY19lc2NhcGUKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmU7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JYnV0dG9uICRmci5iJGouZi5iIC1yZWxpZWYgcmlkZ2UgLXRleHQgSGVscCAtY29tbWFuZCBzc3ZuY19lc2NhcGVfaGVscAotCWxhcHBlbmQgZGFyd2lubGlzdCAkZnIuYiRqLmYuYjsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZyLmIkai5mLmIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlwYWNrICRmci5iJGouZi5sIC1zaWRlIGxlZnQKLQlwYWNrICRmci5iJGouZi5iIC1zaWRlIHJpZ2h0Ci0JcGFjayAkZnIuYiRqLmYuZSAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgeAotCi0JcGFjayAkZnIuYiRqLmYgJGZyLmIkai5sIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLWhlaWdodCAyOyBpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLXJlbGllZiAkcmVsaWVmIC1ib3JkZXJ3aWR0aCAyCi0KLQlsYWJlbCAkZnIuYiRqLmwgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdGV4dCAiRW50ZXIgdGhlIG1heCBoZWlnaHQgaW4gcGl4ZWxzLCBlLmcuICc5MDAnIjsKLQotCWdsb2JhbCB5Y3JvcF9zdHJpbmcKLQlmcmFtZSAkZnIuYiRqLmYKLQlsYWJlbCAkZnIuYiRqLmYubCAtdGV4dCAiWSBDcm9wOiAiCi0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmci5iJGouZi5sOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZnIuYiRqLmYubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCWVudHJ5ICRmci5iJGouZi5lIC13aWR0aCAxMCAtdGV4dHZhcmlhYmxlIHljcm9wX3N0cmluZwotCWxhcHBlbmQgZGFyd2lubGlzdCAkZnIuYiRqLmYuZTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZyLmIkai5mLmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlwYWNrICRmci5iJGouZi5sIC1zaWRlIGxlZnQKLQlwYWNrICRmci5iJGouZi5lIC1zaWRlIHJpZ2h0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlwYWNrICRmci5iJGouZiAkZnIuYiRqLmwgLXNpZGUgdG9wIC1maWxsIHgKLQotCWluY3IgagotCi0JZnJhbWUgJGZyLmIkaiAtaGVpZ2h0IDI7IGluY3IgagotCi0JZnJhbWUgJGZyLmIkaiAtcmVsaWVmICRyZWxpZWYgLWJvcmRlcndpZHRoIDIKLQotCWxhYmVsICRmci5iJGoubCAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC10ZXh0ICJFbnRlciB0aGUgc2Nyb2xsYmFyIHdpZHRoIGluIHBpeGVscywgZS5nLiAnNCciOwotCi0JZ2xvYmFsIHNid2lkX3N0cmluZwotCWZyYW1lICRmci5iJGouZgotCWxhYmVsICRmci5iJGouZi5sIC10ZXh0ICJTY3JvbGxCYXIgV2lkdGg6ICIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmw7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JZW50cnkgJGZyLmIkai5mLmUgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgc2J3aWRfc3RyaW5nCi0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmci5iJGouZi5lOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZnIuYiRqLmYuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXBhY2sgJGZyLmIkai5mLmwgLXNpZGUgbGVmdAotCXBhY2sgJGZyLmIkai5mLmUgLXNpZGUgcmlnaHQgLWV4cGFuZCAxIC1maWxsIHgKLQotCXBhY2sgJGZyLmIkai5mICRmci5iJGoubCAtc2lkZSB0b3AgLWZpbGwgeAotCi0JaW5jciBqCi0KLQlmcmFtZSAkZnIuYiRqIC1oZWlnaHQgMjsgaW5jciBqCi0KLQlmcmFtZSAkZnIuYiRqIC1yZWxpZWYgJHJlbGllZiAtYm9yZGVyd2lkdGggMgotCi0JbGFiZWwgJGZyLmIkai5sICAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC10ZXh0ICJFbnRlciB0aGUgUkZCIHZlcnNpb24gdG8gcHJldGVuZCB0byBiZSB1c2luZywgZS5nLiAnMy40JyI7Ci0JbGFiZWwgJGZyLmIkai5sMiAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC10ZXh0ICJTb21ldGltZXMgbmVlZGVkIGZvciBVbHRyYVZOQzogMy40LCAzLjYsIDMuMTQsIDMuMTYiOwotCi0JZ2xvYmFsIHJmYnZlcnNpb24KLQlmcmFtZSAkZnIuYiRqLmYKLQlsYWJlbCAkZnIuYiRqLmYubCAtdGV4dCAiUkZCIFZlcnNpb246ICIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmw7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JZW50cnkgJGZyLmIkai5mLmUgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgcmZidmVyc2lvbgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZnIuYiRqLmYuZTsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZyLmIkai5mLmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlwYWNrICRmci5iJGouZi5sIC1zaWRlIGxlZnQKLQlwYWNrICRmci5iJGouZi5lIC1zaWRlIHJpZ2h0IC1leHBhbmQgMSAtZmlsbCB4Ci0KLQlwYWNrICRmci5iJGouZiAkZnIuYiRqLmwgJGZyLmIkai5sMiAgLXNpZGUgdG9wIC1maWxsIHgKLQotCWluY3IgagotCi0JZnJhbWUgJGZyLmIkaiAtaGVpZ2h0IDI7IGluY3IgagotCi0JZnJhbWUgJGZyLmIkaiAtcmVsaWVmICRyZWxpZWYgLWJvcmRlcndpZHRoIDIKLQotCWxhYmVsICRmci5iJGoubDEgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdGV4dCAiTGlzdCBlbmNvZGluZ3MgaW4gcHJlZmVycmVkIG9yZGVyLCBmb3IgZXhhbXBsZSI7Ci0JbGFiZWwgJGZyLmIkai5sMiAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC10ZXh0ICInY29weXJlY3QgenJsZSB0aWdodCcgICBUaGUgZnVsbCBsaXN0IG9mIGVuY29kaW5ncyBpczoiOwotCWxhYmVsICRmci5iJGoubDMgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdGV4dCAiY29weXJlY3QgdGlnaHQgenJsZSB6eXdybGUgaGV4dGlsZSB6bGliIGNvcnJlIHJyZSByYXciOwotCi0JZ2xvYmFsIHNzdm5jX2VuY29kaW5ncwotCWZyYW1lICRmci5iJGouZgotCWxhYmVsICRmci5iJGouZi5sIC10ZXh0ICJFbmNvZGluZ3M6ICIKLQlsYXBwZW5kIGRhcndpbmxpc3QgJGZyLmIkai5mLmw7IGlmIHskZGFyd2luX2NvdHZuY30geyRmci5iJGouZi5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JZW50cnkgJGZyLmIkai5mLmUgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgc3N2bmNfZW5jb2RpbmdzCi0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmci5iJGouZi5lOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZnIuYiRqLmYuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXBhY2sgJGZyLmIkai5mLmwgLXNpZGUgbGVmdAotCXBhY2sgJGZyLmIkai5mLmUgLXNpZGUgcmlnaHQgLWV4cGFuZCAxIC1maWxsIHgKLQotCXBhY2sgJGZyLmIkai5mICRmci5iJGoubDEgJGZyLmIkai5sMiAkZnIuYiRqLmwzIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQlpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLWhlaWdodCAyOyBpbmNyIGoKLQotCWZyYW1lICRmci5iJGogLXJlbGllZiAkcmVsaWVmIC1ib3JkZXJ3aWR0aCAyCi0KLQlsYWJlbCAkZnIuYiRqLmwxIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXRleHQgIkFkZCBhbnkgZXh0cmEgb3B0aW9ucyBmb3Igc3N2bmN2aWV3ZXIgdGhhdCB5b3Ugd2FudC4iOwotCWxhYmVsICRmci5iJGoubDIgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdGV4dCAiRm9yIGV4YW1wbGU6IC0xNmJwcCAtYXBwc2hhcmUgLW5vc2htIGV0Yy4gU2VlIEhlbHAgZm9yIGEgbGlzdC4iOwotCi0JZ2xvYmFsIHNzdm5jX2V4dHJhX29wdHMKLQlmcmFtZSAkZnIuYiRqLmYKLQlsYWJlbCAkZnIuYiRqLmYubCAtdGV4dCAiRXh0cmEgT3B0aW9uczogIgotCWxhcHBlbmQgZGFyd2lubGlzdCAkZnIuYiRqLmYubDsgaWYgeyRkYXJ3aW5fY290dm5jfSB7JGZyLmIkai5mLmwgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQllbnRyeSAkZnIuYiRqLmYuZSAtd2lkdGggMTAgLXRleHR2YXJpYWJsZSBzc3ZuY19leHRyYV9vcHRzCi0JbGFwcGVuZCBkYXJ3aW5saXN0ICRmci5iJGouZi5lOyBpZiB7JGRhcndpbl9jb3R2bmN9IHskZnIuYiRqLmYuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXBhY2sgJGZyLmIkai5mLmwgLXNpZGUgbGVmdAotCXBhY2sgJGZyLmIkai5mLmUgLXNpZGUgcmlnaHQgLWV4cGFuZCAxIC1maWxsIHgKLQotCXBhY2sgJGZyLmIkai5mICRmci5iJGoubDEgJGZyLmIkai5sMiAtc2lkZSB0b3AgLWZpbGwgeAotCi0JaW5jciBqCi0KLQlmcmFtZSAkZnIuYiRqIC1oZWlnaHQgMjsgaW5jciBqCi0KLQlmb3Ige3NldCBrIDF9IHskayA8ICRpfSB7aW5jciBrfSB7Ci0JCXBhY2sgJGZsLmIkayAtc2lkZSB0b3AgLWZpbGwgeAotCX0KLQlmb3Ige3NldCBrIDF9IHskayA8ICRqfSB7aW5jciBrfSB7Ci0JCXBhY2sgJGZyLmIkayAtc2lkZSB0b3AgLWZpbGwgeAotCX0KLQotCXBhY2sgJGZsIC1zaWRlIGxlZnQgLWZpbGwgYm90aAotCXBhY2sgJGZyIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKLQotCXBhY2sgJGYwIC1zaWRlIHRvcCAtZmlsbCBib3RoCi0KLQlmcmFtZSAub3MuYgotCWJ1dHRvbiAub3MuYi5kb25lIC10ZXh0ICJEb25lIiAtY29tbWFuZCB7ZGVzdHJveSAub3N9Ci0JYmluZCAub3MgPEVzY2FwZT4ge2Rlc3Ryb3kgLm9zfQotCXdtIHByb3RvY29sIC5vcyBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5vc30KLQlidXR0b24gLm9zLmIuaGVscCAtdGV4dCAiSGVscCIgLWNvbW1hbmQgaGVscF9zc3ZuY3ZpZXdlcl9vcHRzCi0KLQlnbG9iYWwgdXNlX2xpc3RlbgotCWlmIHskdXNlX2xpc3Rlbn0gewotCQlidXR0b24gLm9zLmIuY29ubmVjdCAtdGV4dCAiTGlzdGVuIiAtY29tbWFuZCBsYXVuY2gKLQl9IGVsc2UgewotCQlidXR0b24gLm9zLmIuY29ubmVjdCAtdGV4dCAiQ29ubmVjdCIgLWNvbW1hbmQgbGF1bmNoCi0JfQotCi0JcGFjayAub3MuYi5oZWxwIC5vcy5iLmNvbm5lY3QgLm9zLmIuZG9uZSAtZmlsbCB4IC1leHBhbmQgMSAtc2lkZSBsZWZ0Ci0KLQlwYWNrIC5vcy5iIC1zaWRlIHRvcCAtZmlsbCB4IAotCi0JZ2xvYmFsIGRhcndpbl9jb3R2bmNfYmxpc3QKLQlmb3JlYWNoIGIgJGRhcndpbmxpc3QgewotCQlzZXQgZGFyd2luX2NvdHZuY19ibGlzdCgkYikgMQotCX0KLQotCWNlbnRlcl93aW4gLm9zCi0Jd20gcmVzaXphYmxlIC5vcyAxIDAKLQl3bSBtaW5zaXplIC5vcyBbd2luZm8gcmVxd2lkdGggLm9zXSBbd2luZm8gcmVxaGVpZ2h0IC5vc10gCi0JZm9jdXMgLm9zCi19Ci0KLQotcHJvYyBpbl9wYXRoIHtjbWR9IHsKLQlnbG9iYWwgZW52Ci0Jc2V0IHAgJGVudihQQVRIKQotCWZvcmVhY2ggZGlyIFtzcGxpdCAkcCAiOiJdIHsKLQkJc2V0IHRyeSAiJGRpci8kY21kIgotCQlpZiBbZmlsZSBleGlzdHMgJHRyeV0gewotCQkJcmV0dXJuICIkdHJ5IgotCQl9Ci0JfQotCXJldHVybiAiIgotfQotCi1wcm9jIHNzaF9hZ2VudF9yZXN0YXJ0IHt9IHsKLQlnbG9iYWwgZW52IAotCi0Jc2V0IGdvdF9zc2hfYWdlbnQgMAotCXNldCBnb3Rfc3NoX2FkZCAwCi0Jc2V0IGdvdF9zc2hfYWdlbnQyIDAKLQlzZXQgZ290X3NzaF9hZGQyIDAKLQotCWlmIHtbaW5fcGF0aCAic3NoLWFnZW50Il0gICE9ICIifSB7c2V0IGdvdF9zc2hfYWdlbnQgMX0KLQlpZiB7W2luX3BhdGggInNzaC1hZ2VudDIiXSAhPSAiIn0ge3NldCBnb3Rfc3NoX2FnZW50MiAxfQotCWlmIHtbaW5fcGF0aCAic3NoLWFkZCJdICAgICE9ICIifSB7c2V0IGdvdF9zc2hfYWRkIDF9Ci0JaWYge1tpbl9wYXRoICJzc2gtYWRkMiJdICAgIT0gIiJ9IHtzZXQgZ290X3NzaF9hZGQyIDF9Ci0KLQlzZXQgc3NoX2FnZW50ICIiCi0Jc2V0IHNzaF9hZGQgIiIKLQlpZiB7W2luZm8gZXhpc3RzIGVudihVU0VSKV0gJiYgJGVudihVU0VSKSA9PSAicnVuZ2UifSB7Ci0JCWlmIHskZ290X3NzaF9hZ2VudDJ9IHsKLQkJCXNldCBzc2hfYWdlbnQgInNzaC1hZ2VudDIiCi0JCX0KLQkJaWYgeyRnb3Rfc3NoX2FkZDJ9IHsKLQkJCXNldCBzc2hfYWRkICJzc2gtYWRkMiIKLQkJfQotCX0KLQlpZiB7JHNzaF9hZ2VudCA9PSAiIiAmJiAkZ290X3NzaF9hZ2VudH0gewotCQlzZXQgc3NoX2FnZW50ICJzc2gtYWdlbnQiCi0JfQotCWlmIHskc3NoX2FkZCA9PSAiIiAmJiAkZ290X3NzaF9hZGR9IHsKLQkJc2V0IHNzaF9hZGQgInNzaC1hZGQiCi0JfQotCWlmIHskc3NoX2FnZW50ID09ICIifSB7Ci0JCWJlbGwKLQkJbWVzZyAiY291bGQgbm90IGZpbmQgc3NoLWFnZW50IGluIFBBVEgiCi0JCXJldHVybgotCX0KLQlpZiB7JHNzaF9hZGQgPT0gIiJ9IHsKLQkJYmVsbAotCQltZXNnICJjb3VsZCBub3QgZmluZCBzc2gtYWRkIGluIFBBVEgiCi0JCXJldHVybgotCX0KLQlzZXQgdG1wICRlbnYoU1NWTkNfSE9NRSkvLnZuYy1zYVt0cGlkXQotCXNldCB0bXAgW215dG1wICR0bXBdCi0Jc2V0IGZoICIiCi0JY2F0Y2gge3NldCBmaCBbb3BlbiAkdG1wICJ3Il19Ci0JaWYgeyRmaCA9PSAiIn0gewotCQliZWxsCi0JCW1lc2cgImNvdWxkIG5vdCBvcGVuIHRtcCBmaWxlICR0bXAiCi0JCXJldHVybgotCX0KLQotCXB1dHMgJGZoICIjIS9iaW4vc2giCi0JcHV0cyAkZmggImV2YWwgYCRzc2hfYWdlbnQgLXNgIgotCXB1dHMgJGZoICIkc3NoX2FkZCIKLQlwdXRzICRmaCAiU1NWTkNfR1VJX0NISUxEPVwiXCIiIAotCXB1dHMgJGZoICJleHBvcnQgU1NWTkNfR1VJX0NISUxEIiAKLQotCWdsb2JhbCBidWNrX3plcm8KLQlzZXQgY21kICRidWNrX3plcm8KLQkKLQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0dVSV9DTUQpXSB7Ci0JCXNldCBjbWQgJGVudihTU1ZOQ19HVUlfQ01EKSAKLQl9Ci0JI3B1dHMgJGZoICIkY21kIDwvZGV2L251bGwgMT4vZGV2L251bGwgMj4vZGV2L251bGwgJiIKLQlwdXRzICRmaCAibm9odXAgJGNtZCAmIgotCXB1dHMgJGZoICJzbGVlcCAxIgotCXB1dHMgJGZoICJybSAtZiAkdG1wIgotCWNsb3NlICRmaAotCi0Jd20gd2l0aGRyYXcgLgotCWNhdGNoIHt3bSB3aXRoZHJhdyAub30KLQljYXRjaCB7d20gd2l0aGRyYXcgLm9hfQotCi0JdW5peF90ZXJtaW5hbF9jbWQgIisyMDArMjAwIiAiUmVzdGFydGluZyB3aXRoIHNzaC1hZ2VudC9zc2gtYWRkIiAic2ggJHRtcCIgMQotCWFmdGVyIDEwMDAwCi0JZGVzdHJveSAuCi0JZXhpdAotfQotCi1wcm9jIHB1dHR5X3B3X2VudHJ5IHttb2RlfSB7Ci0JaWYgeyRtb2RlID09ICJjaGVjayJ9IHsKLQkJZ2xvYmFsIHVzZV9zc2hzc2wgdXNlX3NzaAotCQlpZiB7JHVzZV9zc2hzc2wgfHwgJHVzZV9zc2h9IHsKLQkJCXB1dHR5X3B3X2VudHJ5IGVuYWJsZQotCQl9IGVsc2UgewotCQkJcHV0dHlfcHdfZW50cnkgZGlzYWJsZQotCQl9Ci0JCXJldHVybgotCX0KLQlpZiB7JG1vZGUgPT0gImRpc2FibGUifSB7Ci0JCWNhdGNoIHsuby5wdy5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHsuby5wdy5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JfSBlbHNlIHsKLQkJY2F0Y2ggey5vLnB3LmwgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWNhdGNoIHsuby5wdy5lIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCX0KLX0KLXByb2MgYWR2X3NzaF90b2cge29ufSB7Ci0JZ2xvYmFsIGFkdl9zc2gKLQlmb3JlYWNoIGIge2N1cHMgc25kIHNtYiByZWRpcnMga25vd25ob3N0c30gewotCQlpZiBbaW5mbyBleGlzdHMgYWR2X3NzaCgkYildIHsKLQkJCWlmIHskb259IHsKLQkJCQljYXRjaCB7JGFkdl9zc2goJGIpIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCQkJfSBlbHNlIHsKLQkJCQljYXRjaCB7JGFkdl9zc2goJGIpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXByb2MgYWR2X2xpc3Rlbl9zc2xfdG9nIHtvbn0gewotCWdsb2JhbCBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uIGlzX3dpbmRvd3MKLQlnbG9iYWwgZGlzYWJsZV9zc2xfd29ya2Fyb3VuZHNfYnV0dG9uCi0JZ2xvYmFsIHZlbmNyeXB0X2J1dHRvbiBub19wcm9iZV92ZW5jcnlwdF9idXR0b24gYW5vbmRoX2J1dHRvbiB1bHRyYV9kc21fYnV0dG9uCi0KLQlzZXQgYmxpc3QgW2xpc3RdIAotCWlmIFtpbmZvIGV4aXN0cyBzdHVubmVsX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uXSB7Ci0JCWxhcHBlbmQgYmxpc3QgJHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbl9idXR0b24KLQl9Ci0JaWYgW2luZm8gZXhpc3RzIGRpc2FibGVfc3NsX3dvcmthcm91bmRzX2J1dHRvbl0gewotCQlsYXBwZW5kIGJsaXN0ICRkaXNhYmxlX3NzbF93b3JrYXJvdW5kc19idXR0b24KLQl9Ci0JaWYgW2luZm8gZXhpc3RzIHVsdHJhX2RzbV9idXR0b25dIHsKLQkJbGFwcGVuZCBibGlzdCAkdWx0cmFfZHNtX2J1dHRvbgotCX0KLQlpZiBbaW5mbyBleGlzdHMgbm9fcHJvYmVfdmVuY3J5cHRfYnV0dG9uXSB7Ci0JCWxhcHBlbmQgYmxpc3QgJG5vX3Byb2JlX3ZlbmNyeXB0X2J1dHRvbgotCX0KLQlpZiBbaW5mbyBleGlzdHMgdmVuY3J5cHRfYnV0dG9uXSB7Ci0JCWxhcHBlbmQgYmxpc3QgJHZlbmNyeXB0X2J1dHRvbgotCX0KLQlpZiBbaW5mbyBleGlzdHMgYW5vbmRoX2J1dHRvbl0gewotCQlsYXBwZW5kIGJsaXN0ICRhbm9uZGhfYnV0dG9uCi0JfQotCWZvcmVhY2ggYiAkYmxpc3QgewotCQlpZiB7JG9ufSB7Ci0JCQljYXRjaCB7JGIgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCX0gZWxzZSB7Ci0JCQljYXRjaCB7JGIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJfQotCX0KLQotCWlmIHskaXNfd2luZG93c30gewotCQljYXRjaCB7JHN0dW5uZWxfbG9jYWxfcHJvdGVjdGlvbl9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJY2F0Y2ggeyR1bHRyYV9kc21fYnV0dG9uICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JfQotfQotCi1wcm9jIGFkdl9saXN0ZW5fc3NoX3RvZyB7b259IHsKLQlnbG9iYWwgc3NoX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uIGlzX3dpbmRvd3MKLQlpZiBbaW5mbyBleGlzdHMgc3NoX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uXSB7Ci0JCWlmIHskb259IHsKLQkJCWNhdGNoIHskc3NoX2xvY2FsX3Byb3RlY3Rpb25fYnV0dG9uIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCQl9IGVsc2UgewotCQkJY2F0Y2ggeyRzc2hfbG9jYWxfcHJvdGVjdGlvbl9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJfQotCX0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJY2F0Y2ggeyRzc2hfbG9jYWxfcHJvdGVjdGlvbl9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQl9Ci19Ci0KLXByb2Mgc3NsX3NzaF9hZGp1c3Qge3doaWNofSB7Ci0JZ2xvYmFsIHVzZV9zc2wgdXNlX3NzaCB1c2Vfc3Noc3NsIHNzaHNzbF9zdwkKLQlnbG9iYWwgcmVtb3RlX3NzaF9jbWRfbGlzdAotCWdsb2JhbCB4MTF2bmNfZmluZF93aWRnZXQgeDExdm5jX3hsb2dpbl93aWRnZXQgdXZuY19idWdfd2lkZ2V0Ci0KLQlpZiB7JHdoaWNoID09ICJzc2wifSB7Ci0JCXNldCB1c2Vfc3NsIDEKLQkJc2V0IHVzZV9zc2ggMAotCQlzZXQgdXNlX3NzaHNzbCAwCi0JCXNldCBzc2hzc2xfc3cgInNzbCIKLQkJY2F0Y2ggey5mNC5nZXRjZXJ0IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCQljYXRjaCB7LmY0LmFsd2F5cyAgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWlmIFtpbmZvIGV4aXN0cyB4MTF2bmNfZmluZF93aWRnZXRdIHsKLQkJCWNhdGNoIHskeDExdm5jX2ZpbmRfd2lkZ2V0IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCX0KLQkJaWYgW2luZm8gZXhpc3RzIHgxMXZuY194bG9naW5fd2lkZ2V0XSB7Ci0JCQljYXRjaCB7JHgxMXZuY194bG9naW5fd2lkZ2V0IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCX0KLQkJaWYgW2luZm8gZXhpc3RzIHV2bmNfYnVnX3dpZGdldF0gewotCQkJY2F0Y2ggeyR1dm5jX2J1Z193aWRnZXQgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCX0KLQkJYWR2X3NzaF90b2cgMAotCQlhZHZfbGlzdGVuX3NzbF90b2cgMQotCQlhZHZfbGlzdGVuX3NzaF90b2cgMAotCX0gZWxzZWlmIHskd2hpY2ggPT0gIm5vbmUifSB7Ci0JCXNldCB1c2Vfc3NsIDAKLQkJc2V0IHVzZV9zc2ggMAotCQlzZXQgdXNlX3NzaHNzbCAwCi0JCXNldCBzc2hzc2xfc3cgIm5vbmUiCi0JCWNhdGNoIHsuZjQuZ2V0Y2VydCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7LmY0LmFsd2F5cyAgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJaWYgW2luZm8gZXhpc3RzIHgxMXZuY19maW5kX3dpZGdldF0gewotCQkJY2F0Y2ggeyR4MTF2bmNfZmluZF93aWRnZXQgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJfQotCQlpZiBbaW5mbyBleGlzdHMgeDExdm5jX3hsb2dpbl93aWRnZXRdIHsKLQkJCWNhdGNoIHskeDExdm5jX3hsb2dpbl93aWRnZXQgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJfQotCQlpZiBbaW5mbyBleGlzdHMgdXZuY19idWdfd2lkZ2V0XSB7Ci0JCQljYXRjaCB7JHV2bmNfYnVnX3dpZGdldCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJfQotCQlhZHZfc3NoX3RvZyAwCi0JCWFkdl9saXN0ZW5fc3NsX3RvZyAwCi0JCWFkdl9saXN0ZW5fc3NoX3RvZyAwCi0JfSBlbHNlaWYgeyR3aGljaCA9PSAic3NoIn0gewotCQlzZXQgdXNlX3NzbCAwCi0JCXNldCB1c2Vfc3NoIDEKLQkJc2V0IHVzZV9zc2hzc2wgMAotCQlzZXQgc3Noc3NsX3N3ICJzc2giCi0JCWNhdGNoIHsuZjQuZ2V0Y2VydCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7LmY0LmFsd2F5cyAgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJaWYgW2luZm8gZXhpc3RzIHgxMXZuY19maW5kX3dpZGdldF0gewotCQkJY2F0Y2ggeyR4MTF2bmNfZmluZF93aWRnZXQgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCX0KLQkJaWYgW2luZm8gZXhpc3RzIHgxMXZuY194bG9naW5fd2lkZ2V0XSB7Ci0JCQljYXRjaCB7JHgxMXZuY194bG9naW5fd2lkZ2V0IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCQl9Ci0JCWlmIFtpbmZvIGV4aXN0cyB1dm5jX2J1Z193aWRnZXRdIHsKLQkJCWNhdGNoIHskdXZuY19idWdfd2lkZ2V0IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCX0KLQkJYWR2X3NzaF90b2cgMQotCQlhZHZfbGlzdGVuX3NzbF90b2cgMAotCQlhZHZfbGlzdGVuX3NzaF90b2cgMQotCX0gZWxzZWlmIHskd2hpY2ggPT0gInNzaHNzbCJ9IHsKLQkJc2V0IHVzZV9zc2wgMAotCQlzZXQgdXNlX3NzaCAwCi0JCXNldCB1c2Vfc3Noc3NsIDEKLQkJc2V0IHNzaHNzbF9zdyAic3Noc3NsIgotCQljYXRjaCB7LmY0LmdldGNlcnQgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJY2F0Y2ggey5mNC5hbHdheXMgIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWlmIFtpbmZvIGV4aXN0cyB4MTF2bmNfZmluZF93aWRnZXRdIHsKLQkJCWNhdGNoIHskeDExdm5jX2ZpbmRfd2lkZ2V0IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsfQotCQl9Ci0JCWlmIFtpbmZvIGV4aXN0cyB4MTF2bmNfeGxvZ2luX3dpZGdldF0gewotCQkJY2F0Y2ggeyR4MTF2bmNfeGxvZ2luX3dpZGdldCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJfQotCQlpZiBbaW5mbyBleGlzdHMgdXZuY19idWdfd2lkZ2V0XSB7Ci0JCQljYXRjaCB7JHV2bmNfYnVnX3dpZGdldCBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJfQotCQlhZHZfc3NoX3RvZyAxCi0JCWFkdl9saXN0ZW5fc3NsX3RvZyAxCi0JCWFkdl9saXN0ZW5fc3NoX3RvZyAxCi0JfQotCi0JaWYgW2luZm8gZXhpc3RzIHJlbW90ZV9zc2hfY21kX2xpc3RdIHsKLQkJaWYgeyR1c2Vfc3NoIHx8ICR1c2Vfc3Noc3NsfSB7Ci0JCQlmb3JlYWNoIHcgJHJlbW90ZV9zc2hfY21kX2xpc3QgewotCQkJCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCi0JCQl9Ci0JCX0KLQkJaWYgeyR1c2Vfc3NsIHx8ICRzc2hzc2xfc3cgPT0gIm5vbmUifSB7Ci0JCQlmb3JlYWNoIHcgJHJlbW90ZV9zc2hfY21kX2xpc3QgewotCQkJCSR3IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJCX0KLQkJfQotCX0KLQotCWlmIHshICR1c2Vfc3NsICYmICEgJHVzZV9zc2ggJiYgISAkdXNlX3NzaHNzbH0gewotCQlpZiB7JHNzaHNzbF9zdyAhPSAibm9uZSJ9IHsKLQkJCXNldCB1c2Vfc3NsIDEKLQkJCXNldCBzc2hzc2xfc3cgInNzbCIKLQkJfQotCX0KLQlnbG9iYWwgc3NoX29ubHkgdHNfb25seQotCWlmIHskc3NoX29ubHkgfHwgJHRzX29ubHl9IHsKLQkJc2V0IHVzZV9zc2wgMAotCQlzZXQgdXNlX3NzaHNzbCAwCi0JCXNldCB1c2Vfc3NoIDEKLQkJc2V0IHNzaHNzbF9zdyAic3NoIgotCX0KLQkKLQlwdXR0eV9wd19lbnRyeSBjaGVjawotfQotCi1wcm9jIGxpc3Rlbl9hZGp1c3Qge30gewotCWdsb2JhbCB1c2VfbGlzdGVuIHJldnNfYnV0dG9uIG11bHRpcGxlX2xpc3Rlbl9idXR0b24gaXNfd2luZG93cwotCWdsb2JhbCBsaXN0ZW5fb25jZV9idXR0b24gbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b24gbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b25fc2MKLQlpZiB7IVtpbmZvIGV4aXN0cyBtdWx0aXBsZV9saXN0ZW5fYnV0dG9uXX0gewotCQlzZXQgbXVsdGlwbGVfbGlzdGVuX2J1dHRvbiAibm9uZSIKLQl9Ci0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCWNhdGNoIHsuYi5jb25uIGNvbmZpZ3VyZSAtdGV4dCAiTGlzdGVuIn0KLQkJY2F0Y2ggey5vLmIuY29ubmVjdCBjb25maWd1cmUgLXRleHQgIkxpc3RlbiJ9Ci0JCWNhdGNoIHskbXVsdGlwbGVfbGlzdGVuX2J1dHRvbiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJY2F0Y2ggeyRsaXN0ZW5fb25jZV9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWNhdGNoIHskbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWNhdGNoIHskbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b25fc2MgY29uZmlndXJlIC1zdGF0ZSBub3JtYWx9Ci0JCWNhdGNoIHttZXNnICJMaXN0ZW4gOk4gLT4gUG9ydCA1NTAwK04sIGkuZS4gOjAgLT4gNTUwMCwgOjEgLT4gNTUwMSwgOjIgLT4gNTUwMiAuLi4ifQotCX0gZWxzZSB7Ci0JCWNhdGNoIHsuYi5jb25uIGNvbmZpZ3VyZSAtdGV4dCAiQ29ubmVjdCJ9Ci0JCWNhdGNoIHsuby5iLmNvbm5lY3QgY29uZmlndXJlIC10ZXh0ICJDb25uZWN0In0KLQkJY2F0Y2ggeyRtdWx0aXBsZV9saXN0ZW5fYnV0dG9uIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHskbGlzdGVuX29uY2VfYnV0dG9uIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHskbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b24gY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJY2F0Y2ggeyRsaXN0ZW5fYWNjZXB0X3BvcHVwX2J1dHRvbl9zYyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7bWVzZyAiU3dpdGNoZWQgdG8gRm9yd2FyZCBDb25uZWN0aW9uIG1vZGUuIn0KLQl9Ci0JaWYgeyRpc193aW5kb3dzfSB7Ci0JCWNhdGNoIHskbXVsdGlwbGVfbGlzdGVuX2J1dHRvbiBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7JGxpc3Rlbl9vbmNlX2J1dHRvbiBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7JGxpc3Rlbl9hY2NlcHRfcG9wdXBfYnV0dG9uIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHskbGlzdGVuX2FjY2VwdF9wb3B1cF9idXR0b25fc2MgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQl9Ci19Ci0KLXByb2MgdW5peHB3X2FkanVzdCB7fSB7Ci0JZ2xvYmFsIGlzX3dpbmRvd3MgdXNlX3VuaXhwdyBkYXJ3aW5fY290dm5jCi0JaWYgeyRpc193aW5kb3dzIHx8ICRkYXJ3aW5fY290dm5jfSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgeyR1c2VfdW5peHB3fSB7Ci0JCXBhY2sgY29uZmlndXJlIC5mdSAtYWZ0ZXIgLmYxIC1maWxsIHgKLQkJY2F0Y2gge2ZvY3VzIC5mdS5lfQotCX0gZWxzZSB7Ci0JCXBhY2sgZm9yZ2V0IC5mdQotCX0KLX0KLQotcHJvYyB4MTF2bmNfZmluZF9hZGp1c3Qge3doaWNofSB7Ci0JZ2xvYmFsIHJlbW90ZV9zc2hfY21kCi0JZ2xvYmFsIHVzZV94MTF2bmNfZmluZCB4MTF2bmNfZmluZF93aWRnZXQKLQlnbG9iYWwgdXNlX3gxMXZuY194bG9naW4geDExdm5jX3hsb2dpbl93aWRnZXQKLQotCWlmIHskd2hpY2ggPT0gImZpbmQifSB7Ci0JCWlmIHskdXNlX3gxMXZuY19maW5kfSB7Ci0JCQlzZXQgdXNlX3gxMXZuY194bG9naW4gMAotCQl9Ci0JfSBlbHNlaWYgeyR3aGljaCA9PSAieGxvZ2luIn0gewotCQlpZiB7JHVzZV94MTF2bmNfeGxvZ2lufSB7Ci0JCQlzZXQgdXNlX3gxMXZuY19maW5kIDAKLQkJfQotCX0KLQlpZiB7ISAkdXNlX3gxMXZuY19maW5kICYmICEgJHVzZV94MTF2bmNfeGxvZ2lufSB7Ci0JCXNldCByZW1vdGVfc3NoX2NtZCAiIjsKLQkJcmV0dXJuCi0JfQotCWlmIHshW3JlZ2V4cCB7eDExdm5jfSAkcmVtb3RlX3NzaF9jbWRdfSB7Ci0JCXNldCByZW1vdGVfc3NoX2NtZCAiIjsKLQl9Ci0JcmVnc3ViIHteWyAJXSpQT1JUPSBbIAldKn0gJHJlbW90ZV9zc2hfY21kICIiIHJlbW90ZV9zc2hfY21kCi0JcmVnc3ViIHteWyAJXSpQPSBbIAldKn0gJHJlbW90ZV9zc2hfY21kICIiIHJlbW90ZV9zc2hfY21kCi0JcmVnc3ViIHteWyAJXSpzdWRvIHgxMXZuY1sgCV0qfSAkcmVtb3RlX3NzaF9jbWQgIiIgcmVtb3RlX3NzaF9jbWQKLQlyZWdzdWIge15bIAldKngxMXZuY1sgCV0qfSAkcmVtb3RlX3NzaF9jbWQgIiIgcmVtb3RlX3NzaF9jbWQKLQlyZWdzdWIgLWFsbCB7WyAJXSotZmluZFsgCV0qfSAkcmVtb3RlX3NzaF9jbWQgIiAiIHJlbW90ZV9zc2hfY21kCi0JcmVnc3ViIC1hbGwge1sgCV0qLWxvY2FsaG9zdFsgCV0qfSAkcmVtb3RlX3NzaF9jbWQgIiAiIHJlbW90ZV9zc2hfY21kCi0JcmVnc3ViIC1hbGwge1sgCV0qLWVudiBGRF9YRE09MVsgCV0qfSAkcmVtb3RlX3NzaF9jbWQgIiAiIHJlbW90ZV9zc2hfY21kCi0JaWYgeyR1c2VfeDExdm5jX2ZpbmR9IHsKLQkJc2V0IHJlbW90ZV9zc2hfY21kICJQT1JUPSB4MTF2bmMgLWZpbmQgLWxvY2FsaG9zdCAtbm9wdyAkcmVtb3RlX3NzaF9jbWQiCi0JfSBlbHNlIHsKLQkJc2V0IHJlbW90ZV9zc2hfY21kICJQT1JUPSBzdWRvIHgxMXZuYyAtZmluZCAtbG9jYWxob3N0IC1lbnYgRkRfWERNPTEgLW5vcHcgJHJlbW90ZV9zc2hfY21kIgotCX0KLQlyZWdzdWIge1sgCV0qJH0gJHJlbW90ZV9zc2hfY21kICIiIHJlbW90ZV9zc2hfY21kCi0JcmVnc3ViIHteWyAJXSp9ICRyZW1vdGVfc3NoX2NtZCAiIiByZW1vdGVfc3NoX2NtZAotCXJlZ3N1YiAtYWxsIHtbIAldWyAJXSp9ICRyZW1vdGVfc3NoX2NtZCAiICIgcmVtb3RlX3NzaF9jbWQKLX0KLQotcHJvYyBzZXRfZGFyd2luX2NvdHZuY19idXR0b25zIHt9IHsKLQlnbG9iYWwgZGFyd2luX2NvdHZuYyB1bmFtZSBkYXJ3aW5fY290dm5jX2JsaXN0IAotCQotCWlmIHskdW5hbWUgPT0gIkRhcndpbiIgJiYgW2luZm8gZXhpc3RzIGRhcndpbl9jb3R2bmNfYmxpc3RdfSB7Ci0JCWZvcmVhY2ggYiBbYXJyYXkgbmFtZXMgZGFyd2luX2NvdHZuY19ibGlzdF0gewotCQkJaWYgeyRkYXJ3aW5fY290dm5jfSB7Ci0JCQkJY2F0Y2ggeyRiIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCQl9IGVsc2UgewotCQkJCWNhdGNoIHskYiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbH0KLQkJCX0KLQkJfQotCX0KLX0KLQotcHJvYyBkaXNhYmxlX2VuY3J5cHRpb24ge30gewotCWdsb2JhbCBlbnYKLQlpZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OKV19IHsKLQkJc2V0IHMgJGVudihTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OKQotCQlpZiB7JHMgIT0gIiIgJiYgJHMgIT0gIjAifSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLXByb2Mgc2V0X29wdGlvbnMge30gewotCWdsb2JhbCB1c2VfYWxwaGEgdXNlX2dyYWIgdXNlX3NzaCB1c2Vfc3Noc3NsIHVzZV92aWV3b25seSB1c2VfZnVsbHNjcmVlbiB1c2VfYmdyMjMzCi0JZ2xvYmFsIHVzZV9ub2pwZWcgdXNlX3JhaXNlX29uX2JlZXAgdXNlX2NvbXByZXNzbGV2ZWwgdXNlX3F1YWxpdHkgdXNlX3gxMV9tYWNvc3gKLQlnbG9iYWwgdXNlX3NlbmRfY2xpcGJvYXJkIHVzZV9zZW5kX2Fsd2F5cwotCWdsb2JhbCBjb21wcmVzc2xldmVsX3RleHQgcXVhbGl0eV90ZXh0Ci0JZ2xvYmFsIGVudiBpc193aW5kb3dzIGRhcndpbl9jb3R2bmMgdW5hbWUKLQlnbG9iYWwgdXNlX2xpc3RlbgotCWdsb2JhbCB1c2VfeDExdm5jX2ZpbmQgeDExdm5jX2ZpbmRfd2lkZ2V0Ci0JZ2xvYmFsIHVzZV94MTF2bmNfeGxvZ2luIHgxMXZuY194bG9naW5fd2lkZ2V0IHV2bmNfYnVnX3dpZGdldAotCWdsb2JhbCB0c19vbmx5Ci0JZ2xvYmFsIGRhcndpbl9jb3R2bmNfYmxpc3QKLQlnbG9iYWwgc2hvd2luZ19ub19lbmNyeXB0aW9uIG5vX2VuY19idXR0b24gbm9fZW5jX3ByZXYKLQotCWlmIHskdHNfb25seX0gewotCQlzZXRfdHNfb3B0aW9ucwotCQlyZXR1cm4KLQl9Ci0KLQl0b3BsZXYgLm8KLQl3bSB0aXRsZSAubyAiU1NML1NTSCBWTkMgT3B0aW9ucyIKLQotCXNldCBpIDEKLQotCXJhZGlvYnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNzaHNzbF9zdyAtdmFsdWUgc3NsIC10ZXh0IFwKLQkJIlVzZSBTU0wiIC1jb21tYW5kIHtzc2xfc3NoX2FkanVzdCBzc2x9Ci0JaW5jciBpCi0KLQlyYWRpb2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBzc2hzc2xfc3cgLXZhbHVlIHNzaCAtdGV4dCBcCi0JCSJVc2UgU1NIIiAtY29tbWFuZCB7c3NsX3NzaF9hZGp1c3Qgc3NofQotCWluY3IgaQotCi0JcmFkaW9idXR0b24gLm8uYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgc3Noc3NsX3N3IC12YWx1ZSBzc2hzc2wgLXRleHQgXAotCQkiVXNlIFNTSCtTU0wiIC1jb21tYW5kIHtzc2xfc3NoX2FkanVzdCBzc2hzc2x9Ci0Jc2V0IGlzcyAkaQotCXNldCBub19lbmNfcHJldiAuby5iJGkKLQlpbmNyIGkKLQotCXJhZGlvYnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHNzaHNzbF9zdyAtdmFsdWUgbm9uZSAtdGV4dCBcCi0JCSJObyBFbmNyeXB0aW9uIiAtY29tbWFuZCB7c3NsX3NzaF9hZGp1c3Qgbm9uZX0KLQlzZXQgbm9fZW5jX2J1dHRvbiAuby5iJGkKLQlzZXQgaW5lICRpCi0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfeDExdm5jX2ZpbmQgLXRleHQgXAotCQkiQXV0b21hdGljYWxseSBGaW5kIFggU2Vzc2lvbiIgLWNvbW1hbmQge3gxMXZuY19maW5kX2FkanVzdCAiZmluZCJ9Ci0JaWYgeyEkdXNlX3NzaCAmJiAhJHVzZV9zc2hzc2x9IHsuby5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlzZXQgeDExdm5jX2ZpbmRfd2lkZ2V0ICIuby5iJGkiCi0JaW5jciBpCi0KLQlpZiB7ISAkaXNfd2luZG93c30gewotCQljaGVja2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfdW5peHB3IC10ZXh0IFwKLQkJCSJVbml4IFVzZXJuYW1lICYgUGFzc3dvcmQiIC1jb21tYW5kIHt1bml4cHdfYWRqdXN0fQotCQlpZiB7JGRhcndpbl9jb3R2bmN9IHsuby5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJc2V0IGRhcndpbl9jb3R2bmNfYmxpc3QoLm8uYiRpKSAxCi0JCWluY3IgaQotCX0KLQotCWNoZWNrYnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9saXN0ZW4gLXRleHQgXAotCQkiUmV2ZXJzZSBWTkMgQ29ubmVjdGlvbiAoLUxJU1RFTikiIC1jb21tYW5kIHtsaXN0ZW5fYWRqdXN0OyBpZiB7JHZuY2Rpc3BsYXkgPT0gIiJ9IHtzZXQgdm5jZGlzcGxheSAiOjAifSBlbHNlIHtzZXQgdm5jZGlzcGxheSAiIn07IGlmIHswICYmICR1c2VfbGlzdGVufSB7ZGVzdHJveSAub319Ci0JI2lmIHskaXNfd2luZG93c30gey5vLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCSNpZiB7JGRhcndpbl9jb3R2bmN9IHsuby5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkjc2V0IGRhcndpbl9jb3R2bmNfYmxpc3QoLm8uYiRpKSAxCi0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2Vfdmlld29ubHkgLXRleHQgXAotCQkiVmlldyBPbmx5IgotCWluY3IgaQotCi0JY2hlY2tidXR0b24gLm8uYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX2Z1bGxzY3JlZW4gLXRleHQgXAotCQkiRnVsbHNjcmVlbiIKLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9yYWlzZV9vbl9iZWVwIC10ZXh0IFwKLQkJIlJhaXNlIE9uIEJlZXAiCi0JaWYgeyRkYXJ3aW5fY290dm5jfSB7Lm8uYiRpIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0Jc2V0IGRhcndpbl9jb3R2bmNfYmxpc3QoLm8uYiRpKSAxCi0JaW5jciBpCi0KLQljaGVja2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSB1c2VfYmdyMjMzIC10ZXh0IFwKLQkJIlVzZSA4Yml0IGNvbG9yICgtYmdyMjMzKSIKLQlpZiB7JGRhcndpbl9jb3R2bmN9IHsuby5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlzZXQgZGFyd2luX2NvdHZuY19ibGlzdCguby5iJGkpIDEKLQlpbmNyIGkKLQotCWNoZWNrYnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLXZhcmlhYmxlIHVzZV9ub2pwZWcgLXRleHQgXAotCQkiRG8gbm90IHVzZSBKUEVHICgtbm9qcGVnKSIKLQlpZiB7JGRhcndpbl9jb3R2bmN9IHsuby5iJGkgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQlzZXQgZGFyd2luX2NvdHZuY19ibGlzdCguby5iJGkpIDEKLQlpbmNyIGkKLQotCWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQkJY2hlY2tidXR0b24gLm8uYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgdXNlX3gxMV9tYWNvc3ggLXRleHQgXAotCQkJIlVzZSBYMTEgdm5jdmlld2VyIG9uIE1hY09TWCIgXAotCQkJLWNvbW1hbmQge2lmIHskdXNlX3gxMV9tYWNvc3h9IHtzZXQgZGFyd2luX2NvdHZuYyAwfSBlbHNlIHtzZXQgZGFyd2luX2NvdHZuYyAxfTsgc2V0X2Rhcndpbl9jb3R2bmNfYnV0dG9uc30KLQkJaWYgeyR1bmFtZSAhPSAiRGFyd2luIn0gey5vLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQlpbmNyIGkKLQl9Ci0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJZ2xvYmFsIGtpbGxfc3R1bm5lbAotCQljaGVja2J1dHRvbiAuby5iJGkgLWFuY2hvciB3IC12YXJpYWJsZSBraWxsX3N0dW5uZWwgLXRleHQgXAotCQkJIktpbGwgU3R1bm5lbCBBdXRvbWF0aWNhbGx5IgotCQlpbmNyIGkKLQl9Ci0JCi0KLQltZW51YnV0dG9uIC5vLmIkaSAtYW5jaG9yIHcgLW1lbnUgLm8uYiRpLm0gLXRleHR2YXJpYWJsZSBjb21wcmVzc2xldmVsX3RleHQgLXJlbGllZiBncm9vdmUKLQlzZXQgY29tcHJlc3NsZXZlbF90ZXh0ICJDb21wcmVzcyBMZXZlbDogJHVzZV9jb21wcmVzc2xldmVsIgotCWlmIHskZGFyd2luX2NvdHZuY30gey5vLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXNldCBkYXJ3aW5fY290dm5jX2JsaXN0KC5vLmIkaSkgMQotCi0JbWVudSAuby5iJGkubSAtdGVhcm9mZiAwCi0JZm9yIHtzZXQgaiAtMX0geyRqIDwgMTB9IHtpbmNyIGp9IHsKLQkJc2V0IHYgJGoKLQkJc2V0IGwgJGoKLQkJaWYgeyRqID09IC0xfSB7Ci0JCQlzZXQgdiAiZGVmYXVsdCIKLQkJCXNldCBsICJkZWZhdWx0IgotCQl9Ci0JCS5vLmIkaS5tIGFkZCByYWRpb2J1dHRvbiAtdmFyaWFibGUgdXNlX2NvbXByZXNzbGV2ZWwgXAotCQkJLXZhbHVlICR2IC1sYWJlbCAkbCAtY29tbWFuZCBcCi0JCQl7c2V0IGNvbXByZXNzbGV2ZWxfdGV4dCAiQ29tcHJlc3MgTGV2ZWw6ICR1c2VfY29tcHJlc3NsZXZlbCJ9Ci0JfQotCWluY3IgaQotCi0JbWVudWJ1dHRvbiAuby5iJGkgLWFuY2hvciB3IC1tZW51IC5vLmIkaS5tIC10ZXh0dmFyaWFibGUgcXVhbGl0eV90ZXh0IC1yZWxpZWYgZ3Jvb3ZlCi0Jc2V0IHF1YWxpdHlfdGV4dCAiUXVhbGl0eTogJHVzZV9xdWFsaXR5IgotCWlmIHskZGFyd2luX2NvdHZuY30gey5vLmIkaSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCXNldCBkYXJ3aW5fY290dm5jX2JsaXN0KC5vLmIkaSkgMQotCi0JbWVudSAuby5iJGkubSAtdGVhcm9mZiAwIAotCWZvciB7c2V0IGogLTF9IHskaiA8IDEwfSB7aW5jciBqfSB7Ci0JCXNldCB2ICRqCi0JCXNldCBsICRqCi0JCWlmIHskaiA9PSAtMX0gewotCQkJc2V0IHYgImRlZmF1bHQiCi0JCQlzZXQgbCAiZGVmYXVsdCIKLQkJfQotCQkuby5iJGkubSBhZGQgcmFkaW9idXR0b24gLXZhcmlhYmxlIHVzZV9xdWFsaXR5IFwKLQkJCS12YWx1ZSAkdiAtbGFiZWwgJGwgLWNvbW1hbmQgXAotCQkJe3NldCBxdWFsaXR5X3RleHQgIlF1YWxpdHk6ICR1c2VfcXVhbGl0eSJ9Ci0JfQotCWluY3IgaQotCi0JZ2xvYmFsIHVzZV9tb2RlIHRzX29ubHkgc3NoX29ubHkKLQlpZiB7JHRzX29ubHl9IHsKLQkJc2V0IHVzZV9tb2RlICJUZXJtaW5hbCBTZXJ2aWNlcyAodHN2bmMpIgotCX0gZWxzZWlmIHskc3NoX29ubHl9IHsKLQkJc2V0IHVzZV9tb2RlICJTU0gtT25seSAoc3Nodm5jKSIKLQl9IGVsc2UgewotCQlzZXQgdXNlX21vZGUgIlNTVk5DIgotCX0KLQlnbG9iYWwgbW9kZV90ZXh0Ci0Jc2V0IG1vZGVfdGV4dCAiTW9kZTogJHVzZV9tb2RlIgotCi0JbWVudWJ1dHRvbiAuby5iJGkgLWFuY2hvciB3IC1tZW51IC5vLmIkaS5tIC10ZXh0dmFyaWFibGUgbW9kZV90ZXh0IC1yZWxpZWYgZ3Jvb3ZlCi0KLQltZW51IC5vLmIkaS5tIC10ZWFyb2ZmIDAKLQkuby5iJGkubSBhZGQgcmFkaW9idXR0b24gLXZhcmlhYmxlIHVzZV9tb2RlIC12YWx1ZSAiU1NWTkMiICBcCi0JCS1sYWJlbCAiU1NWTkMiIC1jb21tYW5kIHsgaWYgeyR0c19vbmx5IHx8ICRzc2hfb25seX0ge3RvX3Nzdm5jOyBzZXQgbW9kZV90ZXh0ICJNb2RlOiBTU1ZOQyI7IGRlc3Ryb3kgLm99fQotCS5vLmIkaS5tIGFkZCByYWRpb2J1dHRvbiAtdmFyaWFibGUgdXNlX21vZGUgLXZhbHVlICJTU0gtT25seSAoc3Nodm5jKSIgXAotCQktbGFiZWwgIlNTSC1Pbmx5IChzc2h2bmMpIiAtY29tbWFuZCB7IGlmIHskdHNfb25seSB8fCAhICRzc2hfb25seX0ge3RvX3NzaG9ubHk7IHNldCBtb2RlX3RleHQgIk1vZGU6IFNTSC1Pbmx5IChzc2h2bmMpIjsgZGVzdHJveSAub319Ci0JLm8uYiRpLm0gYWRkIHJhZGlvYnV0dG9uIC12YXJpYWJsZSB1c2VfbW9kZSAtdmFsdWUgIlRlcm1pbmFsIFNlcnZpY2VzICh0c3ZuYykiIFwKLQkJLWxhYmVsICJUZXJtaW5hbCBTZXJ2aWNlcyAodHN2bmMpIiAtY29tbWFuZCB7dG9fdHNvbmx5OyBzZXQgbW9kZV90ZXh0ICJNb2RlOiBUZXJtaW5hbCBTZXJ2aWNlcyAodHN2bmMpIjsgZGVzdHJveSAub30KLQlpbmNyIGkKLQotCWdsb2JhbCBzdGFydGVkX3dpdGhfbm9lbmMKLQotCWlmIHswICYmICRzdGFydGVkX3dpdGhfbm9lbmMgJiYgJHNob3dpbmdfbm9fZW5jcnlwdGlvbn0gewotCQk7Ci0JfSBlbHNlaWYgeyRzc2hfb25seX0gewotCQk7Ci0JfSBlbHNlIHsKLQkJY2hlY2tidXR0b24gLm8uYiRpIC1hbmNob3IgdyAtdmFyaWFibGUgc2hvd2luZ19ub19lbmNyeXB0aW9uIC10ZXh0IFwKLQkJCSJTaG93ICdObyBFbmNyeXB0aW9uJyBPcHRpb24iIC1wYWR5IDUgXAotCQkJLWNvbW1hbmQge3RvZ2dsZV9ub19lbmNyeXB0aW9uIDF9Ci0JCSMgLXJlbGllZiByYWlzZWQKLQkJaW5jciBpCi0JfQotCi0JZm9yIHtzZXQgaiAxfSB7JGogPCAkaX0ge2luY3Igan0gewotCQlnbG9iYWwgc3NoX29ubHkgdHNfb25seSAKLQkJaWYgeyRzc2hfb25seSAmJiAkaiA8PSAzfSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiB7JHRzX29ubHkgJiYgJGogPD0gM30gewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgeyEkc2hvd2luZ19ub19lbmNyeXB0aW9uICYmICRqID09ICRpbmV9IHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcGFjayAuby5iJGogLXNpZGUgdG9wIC1maWxsIHgKLQl9Ci0KLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJZ2xvYmFsIHBvcnRfc2xvdCBwdXR0eV9wdwotCi0JCWZyYW1lIC5vLnBwCQotCQlmcmFtZSAuby5wcC5mTAkKLQkJZnJhbWUgLm8ucHAuZlIJCi0JCWxhYmVsIC5vLnBwLmZMLmxhIC1hbmNob3IgdyAtdGV4dCAiUHV0dHkgUFc6IgotCQlsYWJlbCAuby5wcC5mTC5sYiAtYW5jaG9yIHcgLXRleHQgIlBvcnQgU2xvdDoiCi0JCXBhY2sgLm8ucHAuZkwubGEgLm8ucHAuZkwubGIgLXNpZGUgdG9wIC1maWxsIHgKLQkJCi0JCWVudHJ5IC5vLnBwLmZSLmVhIC13aWR0aCAxMCAtc2hvdyAqIC10ZXh0dmFyaWFibGUgcHV0dHlfcHcKLQkJZW50cnkgLm8ucHAuZlIuZWIgLXdpZHRoIDEwIC10ZXh0dmFyaWFibGUgcG9ydF9zbG90Ci0JCXBhY2sgLm8ucHAuZlIuZWEgLm8ucHAuZlIuZWIgIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQkJcGFjayAuby5wcC5mTCAtc2lkZSBsZWZ0Ci0JCXBhY2sgLm8ucHAuZlIgLXNpZGUgcmlnaHQgLWV4cGFuZCAxIC1maWxsIHgKLQotCQlwYWNrIC5vLnBwIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQkJcHV0dHlfcHdfZW50cnkgY2hlY2sKLQl9IAotCi0JZ2xvYmFsIHVuYW1lCi0Jc2V0IHQxICIgICAgICAgICAgICAgQWR2YW5jZWQgLi4uIgotCXNldCB0MiAiICAgICAgICAgICAgIFVzZSBEZWZhdWx0cyIKLQlzZXQgdDMgIiAgICAgICAgICAgICBEZWxldGUgUHJvZmlsZSAuLi4iCi0JaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCQlyZWdzdWIge14gKn0gJHQxICIiIHQxCi0JCXJlZ3N1YiB7XiAqfSAkdDIgIiIgdDIKLQkJcmVnc3ViIHteICp9ICR0MyAiIiB0MwotCX0KLQotCWJ1dHRvbiAuby5hZHZhbmNlZCAtYW5jaG9yIHcgLXRleHQgJHQxIC1jb21tYW5kIHNldF9hZHZhbmNlZF9vcHRpb25zCi0JYnV0dG9uIC5vLmNsZWFyICAgIC1hbmNob3IgdyAtdGV4dCAkdDIgLWNvbW1hbmQge3NldF9kZWZhdWx0czsgaW5pdF92bmNkaXNwbGF5fQotCWJ1dHRvbiAuby5kZWxldGUgICAtYW5jaG9yIHcgLXRleHQgJHQzIC1jb21tYW5kIHtkZXN0cm95IC5vOyBkZWxldGVfcHJvZmlsZX0KLQotCXBhY2sgLm8uY2xlYXIgLXNpZGUgdG9wIC1maWxsIHggCi0JcGFjayAuby5kZWxldGUgLXNpZGUgdG9wIC1maWxsIHggCi0JcGFjayAuby5hZHZhbmNlZCAtc2lkZSB0b3AgLWZpbGwgeCAKLQotIwlwYWNrIC5vLnNfcHJvZiAtc2lkZSB0b3AgLWZpbGwgeCAKLSMJcGFjayAuby5sX3Byb2YgLXNpZGUgdG9wIC1maWxsIHggCi0KLQlmcmFtZSAuby5iCi0JYnV0dG9uIC5vLmIuZG9uZSAtdGV4dCAiRG9uZSIgLWNvbW1hbmQge2Rlc3Ryb3kgLm99Ci0JYmluZCAubyA8RXNjYXBlPiB7ZGVzdHJveSAub30KLQl3bSBwcm90b2NvbCAubyBXTV9ERUxFVEVfV0lORE9XIHtkZXN0cm95IC5vfQotCWJ1dHRvbiAuby5iLmhlbHAgLXRleHQgIkhlbHAiIC1jb21tYW5kIGhlbHBfb3B0cwotCWdsb2JhbCB1c2VfbGlzdGVuCi0JaWYgeyR1c2VfbGlzdGVufSB7Ci0JCWJ1dHRvbiAuby5iLmNvbm5lY3QgLXRleHQgIkxpc3RlbiIgLWNvbW1hbmQgbGF1bmNoCi0JfSBlbHNlIHsKLQkJYnV0dG9uIC5vLmIuY29ubmVjdCAtdGV4dCAiQ29ubmVjdCIgLWNvbW1hbmQgbGF1bmNoCi0JfQotCi0JcGFjayAuby5iLmhlbHAgLm8uYi5jb25uZWN0IC5vLmIuZG9uZSAtZmlsbCB4IC1leHBhbmQgMSAtc2lkZSBsZWZ0Ci0KLQlwYWNrIC5vLmIgLXNpZGUgdG9wIC1maWxsIHggCi0KLQljZW50ZXJfd2luIC5vCi0Jd20gcmVzaXphYmxlIC5vIDEgMAotCWZvY3VzIC5vCi19Ci0KLXByb2MgY2hlY2tfd3JpdGFibGUge30gewotCXNldCB0ZXN0IHRlc3RbcGlkXS50eHQKLQljYXRjaCB7c2V0IGYgW29wZW4gJHRlc3QgInciXTsgcHV0cyAkZiAidGVzdCI7IGNsb3NlICRmfQotCi0JIyMjY2F0Y2gge2ZpbGUgZGVsZXRlIC1mb3JjZSAkdGVzdH0JIyB0ZXN0aW5nLgotCi0JaWYgIVtmaWxlIGV4aXN0cyAkdGVzdF0gewotCQlnbG9iYWwgZW52Ci0JCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfSE9NRSldIHsKLQkJCXNldCBkaXIgIiRlbnYoU1NWTkNfSE9NRSkvc3Nfdm5jL2NhY2hlIgkKLQkJCWNhdGNoIHtmaWxlIG1rZGlyICRkaXJ9Ci0JCQlpZiAhW2ZpbGUgZXhpc3RzICRkaXJdIHsKLQkJCQlyZXR1cm4KLQkJCX0KLQkJCWZvcmVhY2ggZiBbZ2xvYiAtdHlwZSBmICogKi8qICovKi8qXSB7Ci0JCQkJc2V0IGRlc3QgIiRkaXIvJGYiCi0JCQkJc2V0IGRpcm4gW2ZpbGUgZGlybmFtZSAkZGVzdF0KLQkJCQljYXRjaCB7ZmlsZSBta2RpciAkZGlybn0KLQkJCQljYXRjaCB7ZmlsZSBjb3B5IC1mb3JjZSAtLSAkZiAkZGVzdH0KLQkJCX0KLQkJCWNkICRkaXIKLQkJCSMjI2NhdGNoIHtzZXQgZiBbb3BlbiAkdGVzdCAidyJdOyBwdXRzICRmICJ0ZXN0IjsgY2xvc2UgJGZ9Ci0JCX0KLQl9IGVsc2UgewotCQljYXRjaCB7ZmlsZSBkZWxldGUgLWZvcmNlICR0ZXN0fQotCX0KLX0KLQotcHJvYyBwcmludF9oZWxwIHt9IHsKLQotCWdsb2JhbCBoZWxwX21haW4gaGVscF9wcm94IGhlbHBfbWlzYyBoZWxwX3RpcHMKLQlzZXQgYiAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JaGVscAotCSNzZXQgc3RyIFsuaC5mLnQgZ2V0IDEuMCBlbmRdCi0JI3B1dHMgIiR7Yn1IZWxwOlxuJHN0ciIKLQlwdXRzICIke2J9SGVscCBNYWluOlxuJGhlbHBfbWFpbiIKLQlwdXRzICIke2J9SGVscCBQcm94aWVzOlxuJGhlbHBfcHJveCIKLQlwdXRzICIke2J9SGVscCBNaXNjOlxuJGhlbHBfbWlzYyIKLQlwdXRzICIke2J9SGVscCBUaXBzOlxuJGhlbHBfdGlwcyIKLQlkZXN0cm95IC5oCi0KLQloZWxwX29wdHMKLQlzZXQgc3RyIFsub2guZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1TU0wvU1NIIFZpZXdlciBPcHRpb25zIEhlbHA6XG4kc3RyIgotCWRlc3Ryb3kgLm9oCi0KLQloZWxwX2FkdmFuY2VkX29wdHMKLQlzZXQgc3RyIFsuYWguZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1BZHZhbmNlZCBPcHRpb25zIEhlbHA6XG4kc3RyIgotCWRlc3Ryb3kgLmFoCi0KLQloZWxwX3Nzdm5jdmlld2VyX29wdHMKLQlzZXQgc3RyIFsuYXYuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1zc3ZuY3ZpZXdlciBPcHRpb25zIEhlbHA6XG4kc3RyIgotCWRlc3Ryb3kgLmF2Ci0KLQloZWxwX2NlcnRzCi0Jc2V0IHN0ciBbLmNoLmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9U1NMIENlcnRpZmljYXRlcyBIZWxwOlxuJHN0ciIKLQlkZXN0cm95IC5jaAotCi0JaGVscF9mZXRjaF9jZXJ0Ci0Jc2V0IHN0ciBbLmZoLmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9RmV0Y2ggQ2VydGlmaWNhdGVzIEhlbHA6XG4kc3RyIgotCWRlc3Ryb3kgLmZoCi0KLQljcmVhdGVfY2VydAotCXNldCBzdHIgWy5jY3J0LmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9Q3JlYXRlIFNTTCBDZXJ0aWZpY2F0ZSBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLmNjcnQKLQotCWltcG9ydF9jZXJ0Ci0Jc2V0IHN0ciBbLmljcnQuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1JbXBvcnQgU1NMIENlcnRpZmljYXRlIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAuaWNydAotCi0JZ2xvYmFsIGNlcnRfdGV4dAotCXNldCBjZXJ0X3RleHQgImVtcHR5IgotCXNhdmVfY2VydCAiaGVscDowIgotCXNldCBzdHIgWy5zY3J0LmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9U2F2ZSBTU0wgQ2VydGlmaWNhdGUgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5zY3J0Ci0KLQl0c19oZWxwCi0Jc2V0IHN0ciBbLmguZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBIZWxwOlxuJHN0ciIKLQlkZXN0cm95IC5oCi0KLQloZWxwX3RzX29wdHMJCi0Jc2V0IHN0ciBbLm9oLmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9VGVybWluYWwgU2VydmljZXMgVk5DIE9wdGlvbnMgSGVscDpcbiRzdHIiCi0JZGVzdHJveSAub2gKLQotCXRzX3VuaXhwd19kaWFsb2cJCi0Jc2V0IHN0ciBbLnV4cHcuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBVc2UgdW5peHB3IERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAudXhwdwotCi0JdHNfdm5jc2hhcmVkX2RpYWxvZwkKLQlzZXQgc3RyIFsudm5jcy5mLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifVRlcm1pbmFsIFNlcnZpY2VzIFZOQyBTaGFyZWQgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC52bmNzCi0KLQl0c19tdWx0aV9kaWFsb2cJCi0Jc2V0IHN0ciBbLm11bHQuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBNdWx0aXBsZSBTZXNzaW9ucyBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLm11bHQKLQotCXRzX3hsb2dpbl9kaWFsb2cJCi0Jc2V0IHN0ciBbLnhsb2cuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBYIExvZ2luIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAueGxvZwotCi0JdHNfb3RoZXJ2bmNfZGlhbG9nCQotCXNldCBzdHIgWy5vdm5jLmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9VGVybWluYWwgU2VydmljZXMgT3RoZXIgVk5DIFNlcnZlciBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLm92bmMKLQotCXRzX25jYWNoZV9kaWFsb2cJCi0Jc2V0IHN0ciBbLm5jaGUuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBDbGllbnQtU2lkZSBDYWNoaW5nIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAubmNoZQotCi0JdHNfeDExdm5jX29wdHNfZGlhbG9nCQotCXNldCBzdHIgWy54MTF2LmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9VGVybWluYWwgU2VydmljZXMgeDExdm5jIE9wdGlvbnMgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC54MTF2Ci0KLQl0c19maWxleGZlcl9kaWFsb2cJCi0Jc2V0IHN0ciBbLnhmZXIuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBGaWxlIFRyYW5zZmVyIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAueGZlcgotCi0JdHNfc291bmRfZGlhbG9nCQotCXNldCBzdHIgWy5zbmQuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1UZXJtaW5hbCBTZXJ2aWNlcyBTb3VuZCBUdW5uZWxsaW5nIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAuc25kCi0KLQl0c19jdXBzX2RpYWxvZwkKLQlzZXQgc3RyIFsuY3Vwcy5mLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifVRlcm1pbmFsIFNlcnZpY2VzIENVUFMgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5jdXBzCi0KLQloZWxwX3Nzdm5jdmlld2VyX29wdHMKLQlzZXQgc3RyIFsuYXYuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1Vbml4IFNTVk5DIHZpZXdlciBPcHRpb25zIEhlbHA6XG4kc3RyIgotCWRlc3Ryb3kgLmF2Ci0KLQljaGFuZ2Vfdm5jdmlld2VyX2RpYWxvZwotCXNldCBzdHIgWy5jaHZpZXdlci50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1Vbml4IENoYW5nZSBWTkMgVmlld2VyIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAuY2h2aWV3ZXIKLQotCWN1cHNfZGlhbG9nCi0Jc2V0IHN0ciBbLmN1cHMuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1DVVBTIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAuY3VwcwotCi0Jc291bmRfZGlhbG9nCi0Jc2V0IHN0ciBbLnNuZC5mLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifUVTRCBBdWRpbyBUdW5uZWxsaW5nIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAuc25kCi0KLQlzbWJfZGlhbG9nCi0Jc2V0IHN0ciBbLnNtYi5mLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifVNNQiBNb3VudGluZyBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLnNtYgotCi0JcG9ydF9yZWRpcl9kaWFsb2cKLQlzZXQgc3RyIFsucmVkaXJzLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifUFkZGl0aW9uYWwgUG9ydCBSZWRpcmVjdGlvbnMgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5yZWRpcnMKLQotCXBvcnRfa25vY2tpbmdfZGlhbG9nCi0Jc2V0IHN0ciBbLnBrLmYudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9UG9ydCBLbm9ja2luZyBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLnBrCi0KLQlzc3ZuY19lc2NhcGVfaGVscAotCXNldCBzdHIgWy5la2guZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1TU1ZOQyBFc2NhcGUgS2V5cyBIZWxwOlxuJHN0ciIKLQlkZXN0cm95IC5la2gKLQotCXN0dW5uZWxfc2VjX2RpYWxvZwotCXNldCBzdHIgWy5zdGxzZWMuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1TVFVOTkVMIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5zdGxzZWMKLQotCWRpc2FibGVfc3NsX3dvcmthcm91bmRzX2RpYWxvZwotCXNldCBzdHIgWy5zc2x3cmsuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1EaXNhYmxlIFNTTCBXb3JrYXJvdW5kcyBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLnNzbHdyawotCi0JdWx0cmFfZHNtX2RpYWxvZwotCXNldCBzdHIgWy51bHRyYWRzbS5mLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifVVsdHJhVk5DIERTTSBFbmNyeXB0aW9uIFBsdWdpbiBEaWFsb2c6XG4kc3RyIgotCWRlc3Ryb3kgLnVsdHJhZHNtCi0KLQlzc2hfa25vd25faG9zdHNfZGlhbG9nCi0Jc2V0IHN0ciBbLnNzaGtub3duaG9zdHMuZi50IGdldCAxLjAgZW5kXQotCXB1dHMgIiR7Yn1Qcml2YXRlIFNTSCBLbm93bkhvc3RzIGZpbGUgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5zc2hrbm93bmhvc3RzCi0KLQlzc2hfc2VjX2RpYWxvZwotCXNldCBzdHIgWy5zc2hzZWMudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9U1NIIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMgRGlhbG9nOlxuJHN0ciIKLQlkZXN0cm95IC5zc2hzZWMKLQotCW11bHRpbGlzdGVuX2RpYWxvZwotCXNldCBzdHIgWy5tdWx0aWwudCBnZXQgMS4wIGVuZF0KLQlwdXRzICIke2J9TXVsdGlwbGUgTElTVEVOIENvbm5lY3Rpb25zIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAubXVsdGlsCi0KLQl1c2VfZ3JhYl9kaWFsb2cKLQlzZXQgc3RyIFsudXNlZ3JiLnQgZ2V0IDEuMCBlbmRdCi0JcHV0cyAiJHtifVVzZSBYR3JhYlNlcnZlciAoZm9yIGZ1bGxzY3JlZW4pIERpYWxvZzpcbiRzdHIiCi0JZGVzdHJveSAudXNlZ3JiCi19Ci0KLXByb2MgemVyb2NvbmZfZmlsbCB7YiBtfSB7Ci0JZ2xvYmFsIGlzX3dpbmRvd3MgemVyb2NvbmZfY29tbWFuZCBsYXN0X3Bvc3QKLQotCWlmIHskaXNfd2luZG93c30gewotCQlyZXR1cm47Ci0JfQotCi0JaWYgeyFbaW5mbyBleGlzdHMgbGFzdF9wb3N0XX0gewotCQlzZXQgbGFzdF9wb3N0IDAKLQl9Ci0Jc2V0IG5vdyBbY2xvY2sgc2Vjb25kc10KLQlpZiB7JG5vdyA8IFtleHByICRsYXN0X3Bvc3QgKyAxMF19IHsKLQkJIyBjYWNoZSBtZW51IGZvciAxMCBzZWNzLgotCQlyZXR1cm4KLQl9Ci0KLQkuICBjb25maWcgLWN1cnNvciB7d2F0Y2h9Ci0JJGIgY29uZmlnIC1jdXJzb3Ige3dhdGNofQotCSRiIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQotCSRtIGRlbGV0ZSAwIGVuZAotCXVwZGF0ZQotCi0Jc2V0IGVtc2cgIiIKLQlzZXQgb3V0cHV0ICIiCi0Jc2V0IG5vbmUgIk5vIFZOQyBzZXJ2ZXJzIGRldGVjdGVkIgotCi0Jc2V0IHJjIDEKLQlzZXQgcmQgMAotCWlmIHskemVyb2NvbmZfY29tbWFuZCA9PSAiYXZhaGktYnJvd3NlIn0gewotCQlzZXQgcmMgW2NhdGNoIHtzZXQgb3V0cHV0IFtleGVjIGF2YWhpLWJyb3dzZSAtciAtdCAtcCAtayBfcmZiLl90Y3AgMj4vZGV2L251bGxdfSBlbXNnXQotCX0gZWxzZWlmIHskemVyb2NvbmZfY29tbWFuZCA9PSAiZG5zLXNkIn0gewotCQlzZXQgcmMgW2NhdGNoIHtzZXQgb3V0cHV0IFtleGVjIC9iaW4vc2ggLWMge3BpZD0kJDsgZXhwb3J0IHBpZDsgKHNsZWVwIDE7IGtpbGwgJHBpZCkgJiBleGVjIGRucy1zZCAtQiBfcmZiLl90Y3B9IDI+L2Rldi9udWxsXX0gZW1zZ10KLQkJc2V0IHJkIDEKLQl9IGVsc2VpZiB7JHplcm9jb25mX2NvbW1hbmQgPT0gIm1ETlMifSB7Ci0JCXNldCByYyBbY2F0Y2gge3NldCBvdXRwdXQgW2V4ZWMgL2Jpbi9zaCAtYyB7cGlkPSQkOyBleHBvcnQgcGlkOyAoc2xlZXAgMTsga2lsbCAkcGlkKSAmIGV4ZWMgbUROUyAgIC1CIF9yZmIuX3RjcH0gMj4vZGV2L251bGxdfSBlbXNnXQotCQlzZXQgcmQgMQotCX0KLQotCSNwdXRzICJyYz0kcmMgb3V0cHV0PSRvdXRwdXQiCi0JaWYgeyRyZCA9PSAxICYmICRyYyAhPSAwfSB7Ci0JCWlmIFtyZWdleHAge19yZmJ9ICRlbXNnXSB7Ci0JCQlzZXQgcmMgMAotCQkJc2V0IG91dHB1dCAkZW1zZwotCQl9Ci0JfQotCi0Jc2V0IGNvdW50IDAKLQotCWlmIHskcmMgIT0gMH0gewotCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgJG5vbmUKLQkJaW5jciBjb3VudAotCi0JfSBlbHNlaWYgeyRvdXRwdXQgPT0gIiIgfHwgW3JlZ2V4cCB7XlsgXHRcbl0qJH0gJG91dHB1dF19IHsKLQkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsICRub25lCi0JCWluY3IgY291bnQKLQotCX0gZWxzZWlmIHskemVyb2NvbmZfY29tbWFuZCA9PSAiYXZhaGktYnJvd3NlIn0gewotCQlzZXQgbGluZXMgW3NwbGl0ICRvdXRwdXQgIlxuIl0KLQkJc2V0IHNhdygiX19ub25lX18iKSAxCi0JCWZvcmVhY2ggbGluZSAkbGluZXMgewotCQkJc2V0IGl0ZW1zIFtzcGxpdCAkbGluZSAiOyJdCi0JCQlpZiB7W2xsZW5ndGggJGl0ZW1zXSAhPSAxMH0gewotCQkJCWNvbnRpbnVlCi0JCQl9Ci0JCQlpZiB7W2xpbmRleCAkaXRlbXMgMF0gIT0gIj0ifSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQotCQkJIyA9O2V0aDA7SVB2NDt0bXAyXDA1ODI7X3JmYi5fdGNwO2xvY2FsO3RtcDIubG9jYWw7MTAuMC4yLjI1Mjs1OTAyOwotCQkJc2V0IGV0aCAgW2xpbmRleCAkaXRlbXMgMV0KLQkJCXNldCBpcHYgIFtsaW5kZXggJGl0ZW1zIDJdCi0JCQlzZXQgbmFtZSBbbGluZGV4ICRpdGVtcyAzXQotCQkJc2V0IHR5cGUgW2xpbmRleCAkaXRlbXMgNF0KLQkJCXNldCBsb2MgIFtsaW5kZXggJGl0ZW1zIDVdCi0JCQlzZXQgaG9zdCBbbGluZGV4ICRpdGVtcyA2XQotCQkJc2V0IGlwICAgW2xpbmRleCAkaXRlbXMgN10KLQkJCXNldCBwb3J0IFtsaW5kZXggJGl0ZW1zIDhdCi0KLQkJCWlmIHshW3JlZ2V4cCAtbm9jYXNlIHtpcHY0fSAkaXB2XX0gewotCQkJCWNvbnRpbnVlCi0JCQl9Ci0KLQkJCXNldCBuYW1lMCAkbmFtZQotCQkJcmVnc3ViIC1hbGwge1xcXFx9ICRuYW1lICJfX2JvY2tzbG9zaF9fIiBuYW1lCi0JCQlyZWdzdWIgLWFsbCB7XFxcLn0gJG5hbWUgIi4iIG5hbWUKLQotCQkJc2V0IG4gMAotCQkJd2hpbGUgezF9IHsKLQkJCQlpbmNyIG4KLQkJCQlpZiB7JG4gPiAxMDB9IHsKLQkJCQkJYnJlYWsKLQkJCQl9Ci0JCQkJaWYge1tyZWdleHAge1xcWzAtOV1bMC05XVswLTldfSAkbmFtZSBtYXRjaF19IHsKLQkJCQkJI3B1dHMgIm1hdGNoMT0kbWF0Y2giCi0JCQkJCXJlZ3N1YiB7XFx9ICRtYXRjaCAiIiBtYXRjaAotCQkJCQlzZXQgZCAkbWF0Y2gKLQkJCQkJcmVnc3ViIHteMCp9ICRkICIiIGQKLQkJCQkJc2V0IGMgW2Zvcm1hdCAiJWMiICRkXQotCQkJCQlpZiB7IiRjIiA9PSAiJiJ9ICB7Ci0JCQkJCQlzZXQgYyAiXFwkYyIKLQkJCQkJfQotCQkJCQlyZWdzdWIgIlxcXFwkbWF0Y2giICRuYW1lICRjIG5hbWUKLQkJCQkJI3B1dHMgIm1hdGNoOiAkbWF0Y2ggIGM9JyRjJ1xubmFtZT0kbmFtZSIKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhawotCQkJCX0KLQkJCX0KLQotCQkJcmVnc3ViIC1hbGwge19fYm9ja3Nsb3NoX199ICRuYW1lICJcXCIgbmFtZQotCi0JCQlzZXQgaHAgJGhvc3QKLQkJCWlmIHskcG9ydCA+PSA1OTAwICYmICRwb3J0IDw9IDYxMDB9IHsKLQkJCQlzZXQgZCBbZXhwciAkcG9ydCAtIDU5MDBdIAotCQkJCXNldCBocCAiJGhvc3Q6JGQiCi0JCQl9IGVsc2UgewotCQkJCXNldCBocCAiJGhvc3Q6JHBvcnQiCi0JCQl9Ci0JCQlpZiB7IVtpbmZvIGV4aXN0cyBzYXcoJG5hbWUpXX0gewotCQkJCXJlZ3N1YiAtYWxsIHtbXls6YWxudW06XSwuLzpAJV89Ky1dfSAkaHAgIiIgaHAKLQkJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgIiRuYW1lIC0gJGhwIiAtY29tbWFuZCAic2V0IHZuY2Rpc3BsYXkgXCIkaHBcIiIKLQkJCQlpbmNyIGNvdW50Ci0JCQkJc2V0IHAgJHBvcnQKLQkJCQlpZiB7JHAgPD0gMjAwfSB7Ci0JCQkJCXNldCBwICItJHBvcnQiCi0JCQkJfQotCQkJCXJlZ3N1YiAtYWxsIHtbXls6YWxudW06XSwuLzpAJV89Ky1dfSAiJGlwOiRwIiAiIiBpcHAKLQkJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgIiRuYW1lIC0gJGlwcCIgLWNvbW1hbmQgInNldCB2bmNkaXNwbGF5IFwiJGlwcFwiIgotCQkJCWluY3IgY291bnQKLQkJCQlzZXQgc2F3KCRuYW1lKSAxCi0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlzZXQgbGluZXMgW3NwbGl0ICRvdXRwdXQgIlxuIl0KLQkJc2V0IHNhdygiX19ub25lX18iKSAxCi0JCWdsb2JhbCBkbnNfc2RfY2FjaGUgbGFzdF9kbnNfc2QKLQkJaWYgeyFbaW5mbyBleGlzdHMgbGFzdF9kbnNfc2RdfSB7Ci0JCQlzZXQgbGFzdF9kbnNfc2QgMAotCQl9Ci0JCWlmIHtbY2xvY2sgc2Vjb25kc10gPiBbZXhwciAkbGFzdF9kbnNfc2QgKyAxODAwXX0gewotCQkJY2F0Y2ggeyB1bnNldCBkbnNfc2RfY2FjaGUgfQotCQkJc2V0IGxhc3RfZG5zX3NkIFtjbG9jayBzZWNvbmRzXQotCQl9Ci0JCWZvcmVhY2ggbGluZSAkbGluZXMgewotCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHteQnJvd3Npbmd9ICRsaW5lXSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15UaW1lc3RhbXB9ICRsaW5lXSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiBbcmVnZXhwIC1ub2Nhc2Uge2tpbGxlZDp9ICRsaW5lXSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiB7IVtyZWdleHAge19yZmJcLl90Y3B9ICRsaW5lXX0gewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVnc3ViIHtbIFx0XG5dKiR9ICRsaW5lICIiIGxpbmUKLQkJCXJlZ3N1YiB7Xi4qX3JmYlwuX3RjcFteIF0qICAqfSAkbGluZSAiIiBuYW1lCi0KLQkJCWlmIHtbaW5mbyBleGlzdHMgc2F3KCRuYW1lKV19IHsKLQkJCQljb250aW51ZQotCQkJfQotCQkJc2V0IHNhdygkbmFtZSkgMQotCi0JCQlzZXQgaHAgIiRuYW1lIgotCQkJaWYge1tpbmZvIGV4aXN0cyBkbnNfc2RfY2FjaGUoJG5hbWUpXX0gewotCQkJCXNldCBocCAkZG5zX3NkX2NhY2hlKCRuYW1lKQotCQkJfSBlbHNlIHsKLQkJCQlnbG9iYWwgZW52Ci0JCQkJcmVnc3ViIC1hbGwgeyJ9ICRuYW1lICIiIG5hbWUyCi0JCQkJc2V0IGVudihETlNfU0RfTFUpICRuYW1lMgotCQkJCXNldCBlbXNnICIiCi0JCQkJaWYgeyR6ZXJvY29uZl9jb21tYW5kID09ICJkbnMtc2QifSB7Ci0JCQkJCXNldCByYyBbY2F0Y2gge3NldCBvdXRwdXQgW2V4ZWMgL2Jpbi9zaCAtYyB7cGlkPSQkOyBleHBvcnQgcGlkOyAoc2xlZXAgMTsga2lsbCAkcGlkKSAmIGV4ZWMgZG5zLXNkIC1MICIkRE5TX1NEX0xVIiBfcmZiLl90Y3AgLn0gMj4vZGV2L251bGxdfSBlbXNnXQotCQkJCX0gZWxzZWlmIHskemVyb2NvbmZfY29tbWFuZCA9PSAibUROUyJ9IHsKLQkJCQkJc2V0IHJjIFtjYXRjaCB7c2V0IG91dHB1dCBbZXhlYyAvYmluL3NoIC1jIHtwaWQ9JCQ7IGV4cG9ydCBwaWQ7IChzbGVlcCAxOyBraWxsICRwaWQpICYgZXhlYyBtRE5TICAgLUwgIiRETlNfU0RfTFUiIF9yZmIuX3RjcCAufSAyPi9kZXYvbnVsbF19IGVtc2ddCi0JCQkJCXJlZ3N1YiAtYWxsIHtbIFx0XVsgXHRdKjp9ICRlbXNnICI6IiBlbXNnCi0JCQkJfQotCQkJCXJlZ3N1YiAtYWxsIHsgICp9ICRlbXNnICIgIiBlbXNnCi0JCQkJaWYgW3JlZ2V4cCAtbm9jYXNlIHtiZSByZWFjaGVkIGF0ICAqKFteIFx0XG5dW14gXHRcbl0qKX0gJGVtc2cgbWF0Y2ggaHBtXSB7Ci0JCQkJCWlmIFtyZWdleHAge14oLiopOihbMC05XVswLTldKikkfSAkaHBtIG12IGhtIHBtXSB7Ci0JCQkJCQlpZiB7JHBtID49IDU5MDAgJiYgJHBtIDw9IDYxMDB9IHsKLQkJCQkJCQlzZXQgcG0gW2V4cHIgJHBtIC0gNTkwMF0gCi0JCQkJCQl9Ci0JCQkJCQlzZXQgaHAgIiRobTokcG0iCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXQgaHAgJGhwbQotCQkJCQl9Ci0JCQkJCXNldCBkbnNfc2RfY2FjaGUoJG5hbWUpICRocAotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBocCAiJG5hbWUiIAotCQkJCQlpZiB7IVtyZWdleHAgezpbMC05XVswLTldKiR9ICRocF19IHsKLQkJCQkJCXNldCBocCAiJG5hbWU6MCIgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZWdzdWIgLWFsbCB7W15bOmFsbnVtOl0sLi86QCVfPSstXX0gJGhwICIiIGhwCi0JCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgIiRuYW1lIC0gJGhwIiAtY29tbWFuZCAic2V0IHZuY2Rpc3BsYXkgXCIkaHBcIiIKLQkJCWluY3IgY291bnQKLQkJfQotCX0KLQkkYiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCS4gIGNvbmZpZyAtY3Vyc29yIHt9Ci0JJGIgY29uZmlnIC1jdXJzb3Ige30KLQlpZiB7JGNvdW50ID09IDB9ICB7Ci0JCSRtIGFkZCBjb21tYW5kIC1sYWJlbCAkbm9uZQotCX0KLQlzZXQgbGFzdF9wb3N0IFtjbG9jayBzZWNvbmRzXQotfQotCi1wcm9jIGNoZWNrX3plcm9jb25mX2Jyb3dzZSB7fSB7Ci0JZ2xvYmFsIGlzX3dpbmRvd3MgemVyb2NvbmZfY29tbWFuZAotCi0Jc2V0IHplcm9jb25mX2NvbW1hbmQgIiIKLQlpZiB7JGlzX3dpbmRvd3N9IHsKLQkJcmV0dXJuIDA7Ci0JfQotCXNldCBwICIiCi0Jc2V0IHIgW2NhdGNoIHtzZXQgcCBbZXhlYyAvYmluL3NoIC1jIHt0eXBlIGF2YWhpLWJyb3dzZX1dfV0KLQlpZiB7JHIgPT0gMH0gewotCQlyZWdzdWIge14uKiBpcyAgKn0gJHAgIiIgcAotCQlyZWdzdWIgLWFsbCB7WyBcdFxuXHJdfSAkcCAiIiBwCi0JCWlmIFtmaWxlIGV4aXN0cyAkcF0gewotCQkJc2V0IHplcm9jb25mX2NvbW1hbmQgImF2YWhpLWJyb3dzZSIKLQkJCXJldHVybiAxCi0JCX0KLQl9Ci0Jc2V0IHAgIiIKLQlzZXQgciBbY2F0Y2gge3NldCBwIFtleGVjIC9iaW4vc2ggLWMge3R5cGUgZG5zLXNkfV19XQotCWlmIHskciA9PSAwfSB7Ci0JCXJlZ3N1YiB7Xi4qIGlzICAqfSAkcCAiIiBwCi0JCXJlZ3N1YiAtYWxsIHtbIFx0XG5ccl19ICRwICIiIHAKLQkJaWYgW2ZpbGUgZXhpc3RzICRwXSB7Ci0JCQlzZXQgemVyb2NvbmZfY29tbWFuZCAiZG5zLXNkIgotCQkJZ2xvYmFsIGVudgotCQkJaWYgW2luZm8gZXhpc3RzIGVudihVU0VfTUROUyldIHsKLQkJCQkjIHRlc3RpbmcKLQkJCQlzZXQgemVyb2NvbmZfY29tbWFuZCAibUROUyIKLQkJCX0KLQkJCXJldHVybiAxCi0JCX0KLQl9Ci0Jc2V0IHAgIiIKLQlzZXQgciBbY2F0Y2gge3NldCBwIFtleGVjIC9iaW4vc2ggLWMge3R5cGUgbUROU31dfV0KLQlpZiB7JHIgPT0gMH0gewotCQlyZWdzdWIge14uKiBpcyAgKn0gJHAgIiIgcAotCQlyZWdzdWIgLWFsbCB7WyBcdFxuXHJdfSAkcCAiIiBwCi0JCWlmIFtmaWxlIGV4aXN0cyAkcF0gewotCQkJc2V0IHplcm9jb25mX2NvbW1hbmQgIm1ETlMiCi0JCQlyZXR1cm4gMQotCQl9Ci0JfQotCXJldHVybiAwCi19Ci0KLXByb2MgdG9nZ2xlX25vX2VuY3J5cHRpb24ge3tyZXYgMH19IHsKLQlnbG9iYWwgc2hvd2luZ19ub19lbmNyeXB0aW9uCi0JZ2xvYmFsIG5vX2VuY19idXR0b24gbm9fZW5jX3ByZXYKLQlnbG9iYWwgdHNfb25seSBzc2hfb25seQotCWdsb2JhbCB1c2Vfc3NsIHVzZV9zc2ggdXNlX3NzaHNzbAotCi0JaWYgeyRyZXZ9IHsKLQkJIyByZXZlcnNlIGl0IGZpcnN0Ci0JCWlmIHskc2hvd2luZ19ub19lbmNyeXB0aW9ufSB7Ci0JCQlzZXQgc2hvd2luZ19ub19lbmNyeXB0aW9uIDAKLQkJfSBlbHNlIHsKLQkJCXNldCBzaG93aW5nX25vX2VuY3J5cHRpb24gMQotCQl9Ci0JfQotCi0JaWYgeyRzaG93aW5nX25vX2VuY3J5cHRpb259IHsKLQkJY2F0Y2gge3BhY2sgZm9yZ2V0IC5mNC5ub25lfQotCQljYXRjaCB7cGFjayBmb3JnZXQgJG5vX2VuY19idXR0b259Ci0JCWlmIHshJHVzZV9zc2wgJiYgISR1c2Vfc3NoICYmICEkdXNlX3NzaHNzbH0gewotCQkJc2V0IHVzZV9zc2wgMQotCQkJc3luY191c2Vfc3NsX3NzaAotCQl9Ci0JCXNldCBzaG93aW5nX25vX2VuY3J5cHRpb24gMAotCX0gZWxzZSB7Ci0JCWlmIHskdHNfb25seSB8fCAkc3NoX29ubHl9IHsKLQkJCXJldHVybgotCQl9Ci0JCWNhdGNoIHtwYWNrIC5mNC5ub25lIC1zaWRlIGxlZnR9Ci0JCWlmIHshW2luZm8gZXhpc3RzIG5vX2VuY19idXR0b25dfSB7Ci0JCQljYXRjaCB7ZGVzdHJveSAub30KLQkJfSBlbHNlaWYgeyFbd2luZm8gZXhpc3RzICRub19lbmNfYnV0dG9uXX0gewotCQkJY2F0Y2gge2Rlc3Ryb3kgLm99Ci0JCX0gZWxzZSB7Ci0JCQljYXRjaCB7cGFjayAkbm9fZW5jX2J1dHRvbiAtYWZ0ZXIgJG5vX2VuY19wcmV2IC1maWxsIHh9Ci0JCX0KLQkJc2V0IHNob3dpbmdfbm9fZW5jcnlwdGlvbiAxCi0JfQotfQotCi1wcm9jIHRvZ2dsZV92bmNfcHJlZml4IHt9IHsKLQlnbG9iYWwgdm5jZGlzcGxheQotCWlmIFtyZWdleHAgLW5vY2FzZSB7XnZuYzovL30gJHZuY2Rpc3BsYXldIHsKLQkJcmVnc3ViIC1ub2Nhc2Uge152bmM6Ly99ICR2bmNkaXNwbGF5ICIiIHZuY2Rpc3BsYXkKLQl9IGVsc2UgewotCQlyZWdzdWIgLW5vY2FzZSB7XlthLXowLTkrXSo6Ly99ICR2bmNkaXNwbGF5ICIiIHZuY2Rpc3BsYXkKLQkJc2V0IHZuY2Rpc3BsYXkgIlZuYzovLyR2bmNkaXNwbGF5IgotCX0KLQljYXRjaCB7LmYwLmUgaWN1cnNvciBlbmR9Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWdsb2JhbCBlbnYKLQotaWYge1tyZWdleHAgLW5vY2FzZSB7V2luZG93cy45fSAkdGNsX3BsYXRmb3JtKG9zKV19IHsKLQlzZXQgaXNfd2luOXggMQotfSBlbHNlIHsKLQlzZXQgaXNfd2luOXggMAotfQotCi1zZXQgaXNfd2luZG93cyAwCi1pZiB7IFtyZWdleHAgLW5vY2FzZSB7V2luZG93c30gJHRjbF9wbGF0Zm9ybShvcyldfSB7Ci0Jc2V0IGlzX3dpbmRvd3MgMQotfQotCi1zZXQgdW5hbWUgIiIKLWlmIHshICRpc193aW5kb3dzfSB7Ci0JY2F0Y2gge3NldCB1bmFtZSBbZXhlYyB1bmFtZV19Ci19Ci0KLXNldCBmZm9udCAiZml4ZWQiCi0KLWdsb2JhbCBoYXZlX2lwdjYKLXNldCBoYXZlX2lwdjYgIiIKLWNoZWNrX2Zvcl9pcHY2Ci0KLSMgbmVlZCB0byBjaGVjayBpZiAiZml4ZWQiIGZvbnQgdW5kZXIgWEZUIG9uIHRrOC41IGlzIGFjdHVhbGx5IGZpeGVkIHdpZHRoISEKLWlmIHskdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSA9PSAidW5peCJ9IHsKLQlzZXQgbHMgIiIKLQljYXRjaCB7c2V0IGxzIFtmb250IG1ldHJpY3MgJGZmb250IC1saW5lc3BhY2VdfQotCXNldCBmcyAiIgotCWNhdGNoIHtzZXQgZnMgW2ZvbnQgbWV0cmljcyAkZmZvbnQgLWZpeGVkXX0KLQlzZXQgcmVkbyAwCi0JaWYgeyRmcyAhPSAiIiAmJiAkZnMgIT0gIjEifSB7Ci0JCXNldCByZWRvIDEKLQl9Ci0JaWYgeyRscyAhPSAiIiAmJiAkbHMgPiAxNH0gewotCQlzZXQgcmVkbyAxCi0JfQotCWlmIHskcmVkb30gewotCQlmb3JlYWNoIGZuIFtmb250IG5hbWVzXSB7Ci0JCQlpZiB7JGZuID09ICJUa0ZpeGVkRm9udCJ9IHsKLQkJCQlzZXQgZmZvbnQgJGZuCi0JCQkJYnJlYWsKLQkJCX0KLQkJfQotCX0KLQljYXRjaCB7b3B0aW9uIGFkZCAqRGlhbG9nLm1zZy5mb250IHtoZWx2ZXRpY2EgLTE0IGJvbGR9fQotCWNhdGNoIHtvcHRpb24gYWRkICpEaWFsb2cubXNnLndyYXBMZW5ndGggNGl9Ci19Ci0KLWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQlzZXQgZmZvbnQgIk1vbmFjbyAxMCIKLQotCSNvcHRpb24gYWRkICpCdXR0b24uZm9udCBIZWx2ZXRpY2Egd2lkZ2V0RGVmYXVsdAotCWNhdGNoIHtvcHRpb24gYWRkICpCdXR0b24uZm9udCB7U3lzdGVtIDEwfSB3aWRnZXREZWZhdWx0fQotfQotCi0jIHNldCBTU1ZOQ19IT01FIHRvIEhPTUUgaW4gY2FzZSB3ZSBtb2RpZnkgaXQgZm9yIG1vYmlsZSB1c2U6Ci1pZiBbaW5mbyBleGlzdHMgZW52KEhPTUUpXSB7Ci0JaWYgeyEgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19IT01FKV19IHsKLQkJc2V0IGVudihTU1ZOQ19IT01FKSAkZW52KEhPTUUpCi0JfQotfQotCi0jIEZvciBtb2JpbGUgdXNlLCBlLmcuIGZyb20gYSBVU0IgZmxhc2ggZHJpdmUsIHdlIGxvb2sgZm9yIGEgImhvbWUiIG9yICJIb21lIgotIyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhpcyBzY3JpcHQgd2hlcmUgdGhlIHByb2ZpbGVzIGFuZCBjZXJ0cyB3aWxsIGJlIGtlcHQKLSMgYnkgZGVmYXVsdC4KLWlmIFtmaWxlIGV4aXN0cyAkYnVja196ZXJvXSB7Ci0JI3B1dHMgIiRidWNrX3plcm8iCi0Jc2V0IHVwIFtmaWxlIGRpcm5hbWUgJGJ1Y2tfemVyb10KLQotCWlmIHskdXAgPT0gIi4ifSB7Ci0JCSMgdGhpcyBpcyBhY3R1YWxseSBiYWQgbmV3cyBvbiB3aW5kb3dzIGJlY2F1c2Ugd2UgY2QnZCB0byB1dGlsLgotCQlzZXQgdXAgIi4uIgotCX0gZWxzZSB7Ci0JCXNldCB1cCBbZmlsZSBkaXJuYW1lICR1cF0KLQl9Ci0Jc2V0IGRpcnMgW2xpc3QgJHVwXQotCi0JaWYgeyEgJGlzX3dpbmRvd3MgJiYgJHVwICE9ICIuLiJ9IHsKLQkJIyBnZXQgcmlkIG9mIGJpbgotCQlzZXQgdXAgW2ZpbGUgZGlybmFtZSAkdXBdCi0JCWxhcHBlbmQgZGlycyAkdXAKLQl9Ci0KLQlmb3Ige3NldCBpIDB9IHskaSA8ICRhcmdjfSB7aW5jciBpfSB7Ci0JCXNldCBpdDAgW2xpbmRleCAkYXJndiAkaV0KLQkJaWYgeyRpdDAgPT0gIi4ifSB7Ci0JCQlpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICIkdXAvaG9tZSJdICYmICFbZmlsZSBpc2RpcmVjdG9yeSAiJHVwL0hvbWUiXX0gewotCQkJCWNhdGNoIHtmaWxlIG1rZGlyICIkdXAvSG9tZSJ9Ci0JCQl9Ci0JCQlicmVhawotCQl9Ci0JfQotCi0Jc2V0IGdvdG9uZSAwCi0KLQlmb3JlYWNoIGQgJGRpcnMgewotCQlzZXQgdHJ5ICIkZC9ob21lIgotCQkjcHV0cyAiJHRyeSIKLQkJaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHRyeV0gewotCQkJc2V0IGVudihTU1ZOQ19IT01FKSAkdHJ5Ci0JCQlzZXQgZ290b25lIDEKLQkJCWJyZWFrCi0JCX0KLQkJc2V0IHRyeSAiJGQvSG9tZSIKLQkJI3B1dHMgIiR0cnkiCi0JCWlmIFtmaWxlIGlzZGlyZWN0b3J5ICR0cnldIHsKLQkJCXNldCBlbnYoU1NWTkNfSE9NRSkgJHRyeQotCQkJc2V0IGdvdG9uZSAxCi0JCQlicmVhawotCQl9Ci0JfQotCWlmIHskZ290b25lfSB7Ci0JCXNldCBiICIiCi0JCWlmIHskaXNfd2luZG93c30gewotCQkJc2V0IGIgIiRlbnYoU1NWTkNfSE9NRSkvc3Nfdm5jIgotCQl9IGVsc2UgewotCQkJc2V0IGIgIiRlbnYoU1NWTkNfSE9NRSkvLnZuYyIKLQkJfQotCQljYXRjaCB7ZmlsZSBta2RpciAkYn0KLQkJY2F0Y2gge2ZpbGUgbWtkaXIgIiRiL2NlcnRzIn0KLQkJY2F0Y2gge2ZpbGUgbWtkaXIgIiRiL3Byb2ZpbGVzIn0KLQl9Ci0JI3B1dHMgIkhPTUU6ICRlbnYoU1NWTkNfSE9NRSkiCi19Ci0KLWdsb2JhbCBzdmNlcnRfZGVmYXVsdCBteWNlcnRfZGVmYXVsdCBjcmxmaWxfZGVmYXVsdAotZ2xvYmFsIHN2Y2VydF9kZWZhdWx0X2ZvcmNlIG15Y2VydF9kZWZhdWx0X2ZvcmNlIGNybGZpbF9kZWZhdWx0X2ZvcmNlCi1zZXQgc3ZjZXJ0X2RlZmF1bHQgIiIKLXNldCBteWNlcnRfZGVmYXVsdCAiIgotc2V0IGNybGZpbF9kZWZhdWx0ICIiCi1zZXQgc3ZjZXJ0X2RlZmF1bHRfZm9yY2UgMAotc2V0IG15Y2VydF9kZWZhdWx0X2ZvcmNlIDAKLXNldCBjcmxmaWxfZGVmYXVsdF9mb3JjZSAwCi0KLXNldCBzYXdfdHNfb25seSAwCi1zZXQgc2F3X3NzaF9vbmx5IDAKLQotc2V0IHNzdm5jcmMgJGVudihTU1ZOQ19IT01FKS8uc3N2bmNyYwotaWYgeyRpc193aW5kb3dzfSB7Ci0Jc2V0IHNzdm5jcmMgJGVudihTU1ZOQ19IT01FKS9zc3ZuY19yYwotfQotCi1nbG9iYWwgdHNfZGVza3RvcF9zaXplX2RlZiB0c19kZXNrdG9wX2RlcHRoX2RlZiB0c19kZXNrdG9wX3R5cGVfZGVmIHRzX3hzZXJ2ZXJfdHlwZV9kZWYKLXNldCB0c19kZXNrdG9wX3NpemVfZGVmICIiCi1zZXQgdHNfZGVza3RvcF9kZXB0aF9kZWYgIiIKLXNldCB0c19kZXNrdG9wX3R5cGVfZGVmICIiCi1zZXQgdHNfeHNlcnZlcl90eXBlX2RlZiAiIgotCi1nbG9iYWwgd2luX2xvY2FsaG9zdAotc2V0IHdpbl9sb2NhbGhvc3QgIjEyNy4wLjAuMSIKLQotZ2xvYmFsIGtpbGxfc3R1bm5lbAotc2V0IGtpbGxfc3R1bm5lbCAxCi0KLWdsb2JhbCBzdGFydGVkX3dpdGhfbm9lbmMKLQotaWYgeyEgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OKV19IHsKLQlzZXQgZW52KFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT04pIDEKLQlzZXQgc3RhcnRlZF93aXRoX25vZW5jIDEKLX0gZWxzZSB7Ci0JaWYgeyRlbnYoU1NWTkNfRElTQUJMRV9FTkNSWVBUSU9OX0JVVFRPTikgPT0gIjAifSB7Ci0JCXNldCBzdGFydGVkX3dpdGhfbm9lbmMgMAotCX0gZWxzZWlmIHskZW52KFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT04pID09ICIxIn0gewotCQlzZXQgc3RhcnRlZF93aXRoX25vZW5jIDEKLQl9IGVsc2UgewotCQlzZXQgZW52KFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT04pIDEKLQkJc2V0IHN0YXJ0ZWRfd2l0aF9ub2VuYyAxCi0JfQotfQotCi1pZiBbZmlsZSBleGlzdHMgJHNzdm5jcmNdIHsKLQlzZXQgZmggIiIKLQljYXRjaCB7c2V0IGZoIFtvcGVuICRzc3ZuY3JjICJyIl19Ci0JaWYgeyRmaCAhPSAiIn0gewotCQl3aGlsZSB7W2dldHMgJGZoIGxpbmVdID4gLTF9IHsKLQkJCXNldCBzdHIgW3N0cmluZyB0cmltICRsaW5lXQotCQkJaWYgW3JlZ2V4cCB7XiN9ICRzdHJdIHsKLQkJCQljb250aW51ZQotCQkJfQotCQkJaWYgW3JlZ2V4cCB7Xm1vZGU9dHN2bmN9ICRzdHJdIHsKLQkJCQlzZXQgc2F3X3RzX29ubHkgMQotCQkJCXNldCBzYXdfc3NoX29ubHkgMAotCQkJfSBlbHNlaWYgW3JlZ2V4cCB7Xm1vZGU9c3Nodm5jfSAkc3RyXSB7Ci0JCQkJc2V0IHNhd190c19vbmx5IDAKLQkJCQlzZXQgc2F3X3NzaF9vbmx5IDEKLQkJCX0gZWxzZWlmIFtyZWdleHAge15tb2RlPXNzdm5jfSAkc3RyXSB7Ci0JCQkJc2V0IHNhd190c19vbmx5IDAKLQkJCQlzZXQgc2F3X3NzaF9vbmx5IDAKLQkJCX0KLQkJCWlmIFtyZWdleHAge15kZXNrdG9wX3R5cGU9KC4qKSR9ICRzdHIgbSB2YWxdIHsKLQkJCQlzZXQgdmFsIFtzdHJpbmcgdHJpbSAkdmFsXQotCQkJCXNldCB0c19kZXNrdG9wX3R5cGVfZGVmICR2YWwKLQkJCX0KLQkJCWlmIFtyZWdleHAge15kZXNrdG9wX3NpemU9KC4qKSR9ICRzdHIgbSB2YWxdIHsKLQkJCQlzZXQgdmFsIFtzdHJpbmcgdHJpbSAkdmFsXQotCQkJCXNldCB0c19kZXNrdG9wX3NpemVfZGVmICR2YWwKLQkJCX0KLQkJCWlmIFtyZWdleHAge15kZXNrdG9wX2RlcHRoPSguKikkfSAkc3RyIG0gdmFsXSB7Ci0JCQkJc2V0IHZhbCBbc3RyaW5nIHRyaW0gJHZhbF0KLQkJCQlzZXQgdHNfZGVza3RvcF9kZXB0aF9kZWYgJHZhbAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XnhzZXJ2ZXJfdHlwZT0oLiopJH0gJHN0ciBtIHZhbF0gewotCQkJCXNldCB2YWwgW3N0cmluZyB0cmltICR2YWxdCi0JCQkJc2V0IHRzX3hzZXJ2ZXJfdHlwZV9kZWYgJHZhbAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XmZvbnRfZGVmYXVsdD0oLiopJH0gJHN0ciBtIHZhbF0gewotCQkJCXNldCB2YWwgW3N0cmluZyB0cmltICR2YWxdCi0JCQkJY2F0Y2gge29wdGlvbiBhZGQgKmZvbnQgJHZhbH0KLQkJCQljYXRjaCB7b3B0aW9uIGFkZCAqRGlhbG9nLm1zZy5mb250ICR2YWx9Ci0JCQl9Ci0JCQlpZiBbcmVnZXhwIHteZm9udF9maXhlZD0oLiopJH0gJHN0ciBtIHZhbF0gewotCQkJCXNldCB2YWwgW3N0cmluZyB0cmltICR2YWxdCi0JCQkJc2V0IGZmb250ICR2YWwKLQkJCX0KLQkJCWlmIFtyZWdleHAge15ub2VuYz0xfSAkc3RyXSB7Ci0JCQkJZ2xvYmFsIGVudgotCQkJCXNldCBlbnYoU1NWTkNfRElTQUJMRV9FTkNSWVBUSU9OX0JVVFRPTikgMQotCQkJCXNldCBzdGFydGVkX3dpdGhfbm9lbmMgMQotCQkJfQotCQkJaWYgW3JlZ2V4cCB7Xm5vZW5jPTB9ICRzdHJdIHsKLQkJCQlnbG9iYWwgZW52Ci0JCQkJc2V0IGVudihTU1ZOQ19ESVNBQkxFX0VOQ1JZUFRJT05fQlVUVE9OKSAwCi0JCQkJc2V0IHN0YXJ0ZWRfd2l0aF9ub2VuYyAwCi0JCQl9Ci0JCQlpZiBbcmVnZXhwIHteY290dm5jPTF9ICRzdHJdIHsKLQkJCQlnbG9iYWwgZW52Ci0JCQkJc2V0IGVudihTU1ZOQ19DT1RWTkMpIDEKLQkJCX0KLQkJCWlmIFtyZWdleHAge15jb3R2bmM9MH0gJHN0cl0gewotCQkJCWdsb2JhbCBlbnYKLQkJCQlzZXQgZW52KFNTVk5DX0NPVFZOQykgMAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XmtpbGxzdHVubmVsPTF9ICRzdHJdIHsKLQkJCQlzZXQga2lsbF9zdHVubmVsIDEKLQkJCX0KLQkJCWlmIFtyZWdleHAge15raWxsc3R1bm5lbD0wfSAkc3RyXSB7Ci0JCQkJc2V0IGtpbGxfc3R1bm5lbCAwCi0JCQl9Ci0JCQlnbG9iYWwgaGF2ZV9pcHY2Ci0JCQlpZiBbcmVnZXhwIHteaXB2Nj0xfSAkc3RyXSB7Ci0JCQkJc2V0IGhhdmVfaXB2NiAxCi0JCQkJc2V0IGVudihTU1ZOQ19JUFY2KSAxCi0JCQl9Ci0JCQlpZiBbcmVnZXhwIHteaXB2Nj0wfSAkc3RyXSB7Ci0JCQkJc2V0IGhhdmVfaXB2NiAwCi0JCQkJc2V0IGVudihTU1ZOQ19JUFY2KSAwCi0JCQl9Ci0JCQlpZiBbcmVnZXhwIHtebXljZXJ0PSguKikkfSAkc3RyIG0gdmFsXSB7Ci0JCQkJc2V0IHZhbCBbc3RyaW5nIHRyaW0gJHZhbF0KLQkJCQlzZXQgbXljZXJ0X2RlZmF1bHQgJHZhbAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XmNlcnQ9KC4qKSR9ICRzdHIgbSB2YWxdIHsKLQkJCQlzZXQgdmFsIFtzdHJpbmcgdHJpbSAkdmFsXQotCQkJCXNldCBteWNlcnRfZGVmYXVsdCAkdmFsCi0JCQl9Ci0JCQlpZiBbcmVnZXhwIHteY2FjZXJ0PSguKikkfSAkc3RyIG0gdmFsXSB7Ci0JCQkJc2V0IHZhbCBbc3RyaW5nIHRyaW0gJHZhbF0KLQkJCQlzZXQgc3ZjZXJ0X2RlZmF1bHQgJHZhbAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XmNhPSguKikkfSAkc3RyIG0gdmFsXSB7Ci0JCQkJc2V0IHZhbCBbc3RyaW5nIHRyaW0gJHZhbF0KLQkJCQlzZXQgc3ZjZXJ0X2RlZmF1bHQgJHZhbAotCQkJfQotCQkJaWYgW3JlZ2V4cCB7XmNybD0oLiopJH0gJHN0ciBtIHZhbF0gewotCQkJCXNldCB2YWwgW3N0cmluZyB0cmltICR2YWxdCi0JCQkJc2V0IGNybGZpbF9kZWZhdWx0ICR2YWwKLQkJCX0KLQkJCWlmIFtyZWdleHAge15lbnY9KFtePV0qKT0oLiopJH0gJHN0ciBtIHZhciB2YWxdIHsKLQkJCQlnbG9iYWwgZW52Ci0JCQkJc2V0IGVudigkdmFyKSAkdmFsCi0JCQl9Ci0JCX0KLQkJY2xvc2UgJGZoCi0JfQotfQotCi1mb3Ige3NldCBpIDB9IHskaSA8ICRhcmdjfSB7aW5jciBpfSB7Ci0Jc2V0IGl0ZW0gW2xpbmRleCAkYXJndiAkaV0KLQlyZWdzdWIge14tLX0gJGl0ZW0gIi0iIGl0ZW0KLQlpZiB7JGl0ZW0gPT0gIi1wcm9maWxlcyIgfHwgJGl0ZW0gPT0gIi1saXN0In0gewotCQlzZXQgZGlyIFtnZXRfcHJvZmlsZXNfZGlyXQotCQkjcHV0cyBzdGRlcnIgIlZOQyBQcm9maWxlczoiCi0JCSNwdXRzIHN0ZGVyciAiICIKLQkJaWYge1tpbmZvIGV4aXN0cyBlbnYoU1NWTkNfVFNfT05MWSldfSB7Ci0JCQlzZXQgc2F3X3RzX29ubHkgMQotCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19TU0hfT05MWSldfSB7Ci0JCQlzZXQgc2F3X3NzaF9vbmx5IDEKLQkJfQotCQlzZXQgcHJvZnMgW2xpc3RdCi0JCWZvcmVhY2ggcHJvZiBbZ2xvYiAtbm9jb21wbGFpbiAtZGlyZWN0b3J5ICRkaXIgIioudm5jIl0gewotCQkJc2V0IHMgW2ZpbGUgdGFpbCAkcHJvZl0KLQkJCXJlZ3N1YiB7XC52bmMkfSAkcyAiIiBzCi0JCQlpZiB7JHNhd190c19vbmx5IHx8ICRzYXdfc3NoX29ubHl9IHsKLQkJCQlzZXQgb2sgMDsKLQkJCQlzZXQgdHNvayAwOwotCQkJCXNldCBmaCAiIgotCQkJCWNhdGNoIHtzZXQgZmggW29wZW4gJHByb2YgInIiXX0KLQkJCQlpZiB7JGZoICE9ICIifSB7Ci0JCQkJCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0gewotCQkJCQkJaWYge1tyZWdleHAge3VzZV9zc2g9MX0gJGxpbmVdfSB7Ci0JCQkJCQkJc2V0IG9rIDEKLQkJCQkJCX0KLQkJCQkJCWlmIHtbcmVnZXhwIHt0c19tb2RlPTF9ICRsaW5lXX0gewotCQkJCQkJCXNldCB0c29rIDEKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljbG9zZSAkZmgKLQkJCQl9Ci0JCQkJaWYgeyRzYXdfdHNfb25seSAmJiAhJHRzb2t9IHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlaWYgeyEgJG9rfSB7Ci0JCQkJCWNvbnRpbnVlCi0JCQkJfQotCQkJfQotCQkJbGFwcGVuZCBwcm9mcyAkcwotCQl9Ci0JCWZvcmVhY2ggcHJvZiBbbHNvcnQgJHByb2ZzXSB7Ci0JCQlwdXRzICIkcHJvZiIKLQkJfQotCQlleGl0Ci0JfSBlbHNlaWYgeyRpdGVtID09ICItbnZiIn0gewotCQlnbG9iYWwgZW52Ci0JCXNldCBlbnYoU1NWTkNfTk9fVkVSSUZZX0FMTF9CVVRUT04pIDEKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIi1ub2VuYyJ9IHsKLQkJZ2xvYmFsIGVudgotCQlzZXQgZW52KFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT04pIDEKLQkJc2V0IHN0YXJ0ZWRfd2l0aF9ub2VuYyAxCi0JfSBlbHNlaWYgeyRpdGVtID09ICItZW5jIn0gewotCQlnbG9iYWwgZW52Ci0JCXNldCBlbnYoU1NWTkNfRElTQUJMRV9FTkNSWVBUSU9OX0JVVFRPTikgMAotCX0gZWxzZWlmIHskaXRlbSA9PSAiLWJpZ2dlciJ9IHsKLQkJZ2xvYmFsIGVudgotCQlpZiB7IVtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfQklHR0VSX0RJQUxPRyldfSB7Ci0JCQlzZXQgZW52KFNTVk5DX0JJR0dFUl9ESUFMT0cpIDEKLQkJfQotCX0gZWxzZWlmIHskaXRlbSA9PSAiLXNzaCJ9IHsKLQkJc2V0IHNhd19zc2hfb25seSAxCi0JCXNldCBzYXdfdHNfb25seSAwCi0JfSBlbHNlaWYgeyRpdGVtID09ICItdHMifSB7Ci0JCXNldCBzYXdfdHNfb25seSAxCi0JCXNldCBzYXdfc3NoX29ubHkgMAotCX0gZWxzZWlmIHskaXRlbSA9PSAiLXNzbCIgfHwgJGl0ZW0gPT0gIi1zcyJ9IHsKLQkJc2V0IHNhd190c19vbmx5IDAKLQkJc2V0IHNhd19zc2hfb25seSAwCi0JfSBlbHNlaWYgeyRpdGVtID09ICItdHNvIn0gewotCQlnbG9iYWwgZW52Ci0JCXNldCBlbnYoU1NWTkNfVFNfQUxXQVlTKSAxCi0JCXNldCBzYXdfdHNfb25seSAxCi0JfSBlbHNlaWYgeyRpdGVtID09ICIta2lsbHN0dW5uZWwifSB7Ci0JCXNldCBraWxsX3N0dW5uZWwgMQotCX0gZWxzZWlmIHskaXRlbSA9PSAiLW5va2lsbHN0dW5uZWwifSB7Ci0JCXNldCBraWxsX3N0dW5uZWwgMAotCX0gZWxzZWlmIHskaXRlbSA9PSAiLW15Y2VydCIgfHwgJGl0ZW0gPT0gIi1jZXJ0In0gewotCQlpbmNyIGkKLQkJc2V0IG15Y2VydF9kZWZhdWx0IFtsaW5kZXggJGFyZ3YgJGldCi0JfSBlbHNlaWYgeyRpdGVtID09ICItY2FjZXJ0IiB8fCAkaXRlbSA9PSAiLWNhIn0gewotCQlpbmNyIGkKLQkJc2V0IHN2Y2VydF9kZWZhdWx0IFtsaW5kZXggJGFyZ3YgJGldCi0JfSBlbHNlaWYgeyRpdGVtID09ICItY3JsIn0gewotCQlpbmNyIGkKLQkJc2V0IGNybGZpbF9kZWZhdWx0IFtsaW5kZXggJGFyZ3YgJGldCi0JfQotfQotCi1pZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX0ZPTlRfRklYRUQpXSB7Ci0Jc2V0IGZmb250ICRlbnYoU1NWTkNfRk9OVF9GSVhFRCkKLX0KLQotaWYgW2luZm8gZXhpc3RzIGVudihTU1ZOQ19GT05UX0RFRkFVTFQpXSB7Ci0JY2F0Y2gge29wdGlvbiBhZGQgKmZvbnQgJGVudihTU1ZOQ19GT05UX0RFRkFVTFQpfQotCWNhdGNoIHtvcHRpb24gYWRkICpEaWFsb2cubXNnLmZvbnQgJGVudihTU1ZOQ19GT05UX0RFRkFVTFQpfQotfQotCi1pZiBbcmVnZXhwIHtbIAldfSAkZmZvbnRdIHsKLQlzZXQgaGVscF9mb250ICItZm9udCBcIiRmZm9udFwiIgotfSBlbHNlIHsKLQlzZXQgaGVscF9mb250ICItZm9udCAkZmZvbnQiCi19Ci0KLWlmIHsgW3JlZ2V4cCAtbm9jYXNlIHtXaW5kb3dzfSAkdGNsX3BsYXRmb3JtKG9zKV19IHsKLQljZCB1dGlsCi0JaWYgeyRoZWxwX2ZvbnQgPT0gIi1mb250IGZpeGVkIn0gewotCQlzZXQgaGVscF9mb250ICIiCi0JfQotfQotCi1pZiB7JHNhd190c19vbmx5ICYmICRzYXdfc3NoX29ubHl9IHsKLQlzZXQgc2F3X3NzaF9vbmx5IDAKLX0KLQotZ2xvYmFsIHNzaF9vbmx5Ci1zZXQgc3NoX29ubHkgMAotaWYge1tpbmZvIGV4aXN0cyBlbnYoU1NWTkNfU1NIX09OTFkpXSB8fCAkc2F3X3NzaF9vbmx5fSB7Ci0Jc2V0IHNzaF9vbmx5IDEKLX0KLQotZ2xvYmFsIHRzX29ubHkKLXNldCB0c19vbmx5IDAKLWlmIHtbaW5mbyBleGlzdHMgZW52KFNTVk5DX1RTX09OTFkpXSB8fCAkc2F3X3RzX29ubHl9IHsKLQlzZXQgdHNfb25seSAxCi19Ci0KLWlmIHskbXljZXJ0X2RlZmF1bHQgIT0gIiJ9IHsKLQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15GT1JDRTp9ICRteWNlcnRfZGVmYXVsdF0gewotCQlzZXQgbXljZXJ0X2RlZmF1bHRfZm9yY2UgMQotCQlyZWdzdWIgLW5vY2FzZSB7XkZPUkNFOn0gJG15Y2VydF9kZWZhdWx0ICIiIG15Y2VydF9kZWZhdWx0Ci0JfQotCWlmIHshW2ZpbGUgZXhpc3RzICRteWNlcnRfZGVmYXVsdF19IHsKLQkJc2V0IGlkaXIgW2dldF9pZGlyX2NlcnRzICIiXQotCQlzZXQgbXljZXJ0X2RlZmF1bHQgIiRpZGlyLyRteWNlcnRfZGVmYXVsdCIKLQl9Ci19Ci0KLWlmIHskc3ZjZXJ0X2RlZmF1bHQgIT0gIiJ9IHsKLQlpZiBbcmVnZXhwIC1ub2Nhc2Uge15GT1JDRTp9ICRzdmNlcnRfZGVmYXVsdF0gewotCQlzZXQgc3ZjZXJ0X2RlZmF1bHRfZm9yY2UgMQotCQlyZWdzdWIgLW5vY2FzZSB7XkZPUkNFOn0gJHN2Y2VydF9kZWZhdWx0ICIiIHN2Y2VydF9kZWZhdWx0Ci0JfQotCWlmIHshW2ZpbGUgZXhpc3RzICRzdmNlcnRfZGVmYXVsdF19IHsKLQkJc2V0IGlkaXIgW2dldF9pZGlyX2NlcnRzICIiXQotCQlpZiB7JHN2Y2VydF9kZWZhdWx0ID09ICJDQSJ9IHsKLQkJCXNldCBzdmNlcnRfZGVmYXVsdCAiJGlkaXIvQ0EvY2FjZXJ0LnBlbSIKLQkJfSBlbHNlIHsKLQkJCXNldCBzdmNlcnRfZGVmYXVsdCAiJGlkaXIvJHN2Y2VydF9kZWZhdWx0IgotCQl9Ci0JfQotfQotCi1pZiB7JGNybGZpbF9kZWZhdWx0ICE9ICIifSB7Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHteRk9SQ0U6fSAkY3JsZmlsX2RlZmF1bHRdIHsKLQkJc2V0IGNybGZpbF9kZWZhdWx0X2ZvcmNlIDEKLQkJcmVnc3ViIC1ub2Nhc2Uge15GT1JDRTp9ICRjcmxmaWxfZGVmYXVsdCAiIiBjcmxmaWxfZGVmYXVsdAotCX0KLQlpZiB7IVtmaWxlIGV4aXN0cyAkY3JsZmlsX2RlZmF1bHRdfSB7Ci0JCXNldCBpZGlyIFtnZXRfaWRpcl9jZXJ0cyAiIl0KLQkJc2V0IGNybGZpbF9kZWZhdWx0ICIkaWRpci8kY3JsZmlsX2RlZmF1bHQiCi0JfQotfQotCi1pZiB7JGlzX3dpbmRvd3N9IHsKLQljaGVja193cml0YWJsZQotfQotCi0KLXNldCBkYXJ3aW5fY290dm5jIDAKLWlmIHskdW5hbWUgPT0gIkRhcndpbiJ9IHsKLQlpZiB7ISBbaW5mbyBleGlzdHMgZW52KERJU1BMQVkpXX0gewotCQlzZXQgZGFyd2luX2NvdHZuYyAxCi0JfSBlbHNlaWYge1tyZWdleHAgey90bXAvfSAkZW52KERJU1BMQVkpXX0gewotCQlzZXQgZGFyd2luX2NvdHZuYyAxCi0JfQotCWlmIFtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfSE9NRSldIHsKLQkJc2V0IHQgIiRlbnYoU1NWTkNfSE9NRSkvLnZuYyIKLQkJaWYgeyEgW2ZpbGUgZXhpc3RzICR0XX0gewotCQkJY2F0Y2gge2ZpbGUgbWtkaXIgJHR9Ci0JCX0KLQl9Ci19Ci0KLSMjZm9yIHRlc3RpbmcgbWFjb3N4Ci1pZiBbaW5mbyBleGlzdHMgZW52KEZPUkNFX0RBUldJTildIHsKLQlzZXQgdW5hbWUgRGFyd2luCi0Jc2V0IGRhcndpbl9jb3R2bmMgMQotfQotCi1zZXQgcHV0dHlfcHcgIiIKLQotZ2xvYmFsIHNjcm9sbF90ZXh0X2ZvY3VzCi1zZXQgc2Nyb2xsX3RleHRfZm9jdXMgMQotCi1zZXQgbXVsdGllbnRyeSAxCi0KLXdtIHdpdGhkcmF3IC4KLWlmIHskc3NoX29ubHl9IHsKLQl3bSB0aXRsZSAuICJTU0ggVk5DIFZpZXdlciIKLX0gZWxzZWlmIHskdHNfb25seX0gewotCXdtIHRpdGxlIC4gIlRlcm1pbmFsIFNlcnZpY2VzIFZOQyBWaWV3ZXIiCi19IGVsc2UgewotCXdtIHRpdGxlIC4gIlNTTC9TU0ggVk5DIFZpZXdlciIKLX0KLQotd20gcmVzaXphYmxlIC4gMSAwCi0KLXNldF9kZWZhdWx0cwotaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCWlmIFtpbmZvIGV4aXN0cyB1c2VfeDExX21hY29zeF0gewotCQlpZiB7JHVzZV94MTFfbWFjb3N4fSB7Ci0JCQlzZXQgZGFyd2luX2NvdHZuYyAwCi0JCX0KLQl9Ci19Ci1zZXQgc2tpcF9wcmUgMAotCi1zZXQgdm5jZGlzcGxheSAiIgotc2V0IGxhc3RfbG9hZCAiIgotc2V0IHZuY3Byb3h5ICIiCi1zZXQgcmVtb3RlX3NzaF9jbWQgIiIKLXNldCB2bmNhdXRoX3Bhc3N3ZCAiIgotCi1nbG9iYWwgZGlkX2xpc3RlbmluZ19tZXNzYWdlCi1zZXQgZGlkX2xpc3RlbmluZ19tZXNzYWdlIDAKLQotZ2xvYmFsIGFjY2VwdGVkX2NlcnRfZGlhbG9nX2luX3Byb2dyZXNzCi1zZXQgYWNjZXB0ZWRfY2VydF9kaWFsb2dfaW5fcHJvZ3Jlc3MgMAotCi1nbG9iYWwgZmV0Y2hfY2VydF9maWxlbmFtZQotc2V0IGZldGNoX2NlcnRfZmlsZW5hbWUgIiIKLQotc2V0IHZoZCAiVk5DIEhvc3Q6RGlzcGxheSIKLWlmIHskc3NoX29ubHl9IHsKLQlsYWJlbCAubCAtdGV4dCAiU1NIIFZOQyBWaWV3ZXIiIC1yZWxpZWYgcmlkZ2UKLX0gZWxzZWlmIHskdHNfb25seX0gewotCWxhYmVsIC5sIC10ZXh0ICJUZXJtaW5hbCBTZXJ2aWNlcyBWTkMgVmlld2VyIiAtcmVsaWVmIHJpZGdlCi0Jc2V0IHZoZCAiVk5DIFRlcm1pbmFsIFNlcnZlcjoiCi19IGVsc2UgewotCWxhYmVsIC5sIC10ZXh0ICJTU0wvU1NIIFZOQyBWaWV3ZXIiIC1yZWxpZWYgcmlkZ2UKLX0KLQotc2V0IHdsIDIxCi1zZXQgd2UgNDAKLWZyYW1lIC5mMAotaWYgeyRtdWx0aWVudHJ5fSB7Ci0JbGFiZWwgLmYwLmwgLXdpZHRoICR3bCAtYW5jaG9yIHcgLXRleHQgIiR2aGQiIC1yZWxpZWYgcmlkZ2UKLX0gZWxzZSB7Ci0JbGFiZWwgLmYwLmwgLWFuY2hvciB3IC10ZXh0ICIkdmhkIiAtcmVsaWVmIHJpZGdlCi19Ci1lbnRyeSAuZjAuZSAtd2lkdGggJHdlIC10ZXh0dmFyaWFibGUgdm5jZGlzcGxheQotcGFjayAgLmYwLmwgLXNpZGUgbGVmdCAKLWJpbmQgIC5mMC5lIDxSZXR1cm4+IGxhdW5jaAotYmluZCAgLmYwLmUgPENvbnRyb2wtRT4ge3RvZ2dsZV92bmNfcHJlZml4fSAKLXBhY2sgIC5mMC5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLQotaWYge1tjaGVja196ZXJvY29uZl9icm93c2VdfSB7Ci0JbWVudWJ1dHRvbiAuZjAubWIgLXJlbGllZiByaWRnZSAtbWVudSAuZjAubWIubSAtdGV4dCAiRmluZCIKLQltZW51IC5mMC5tYi5tIC10ZWFyb2ZmIDAgLXBvc3Rjb21tYW5kIHt6ZXJvY29uZl9maWxsIC5mMC5tYiAuZjAubWIubX0KLQlwYWNrICAuZjAubWIgLXNpZGUgbGVmdCAKLX0KLQotZnJhbWUgLmYxCi1sYWJlbCAuZjEubCAtd2lkdGggJHdsIC1hbmNob3IgdyAtdGV4dCAiVk5DIFBhc3N3b3JkOiIgLXJlbGllZiByaWRnZQotZW50cnkgLmYxLmUgLXdpZHRoICR3ZSAtdGV4dHZhcmlhYmxlIHZuY2F1dGhfcGFzc3dkIC1zaG93ICoKLXBhY2sgIC5mMS5sIC1zaWRlIGxlZnQgCi1wYWNrICAuZjEuZSAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci1iaW5kICAuZjEuZSA8UmV0dXJuPiBsYXVuY2gKLQotZnJhbWUgLmZ1Ci1sYWJlbCAuZnUubCAtd2lkdGggJHdsIC1hbmNob3IgdyAtdGV4dCAiVW5peCBVc2VybmFtZToiIC1yZWxpZWYgcmlkZ2UKLWVudHJ5IC5mdS5lIC13aWR0aCAxNCAtdGV4dHZhcmlhYmxlIHVuaXhwd191c2VybmFtZQotbGFiZWwgLmZ1Lm0gLWFuY2hvciB3IC10ZXh0ICJVbml4IFBhc3N3b3JkOiIgLXJlbGllZiByaWRnZQotZW50cnkgLmZ1LmYgLXRleHR2YXJpYWJsZSB1bml4cHdfcGFzc3dkIC1zaG93ICoKLXBhY2sgIC5mdS5sIC1zaWRlIGxlZnQgCi1wYWNrICAuZnUuZSAuZnUubSAtc2lkZSBsZWZ0Ci1wYWNrICAuZnUuZiAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci1iaW5kICAuZnUuZiA8UmV0dXJuPiBsYXVuY2gKLQotZnJhbWUgLmYyCi1sYWJlbCAuZjIubCAtd2lkdGggJHdsIC1hbmNob3IgdyAtdGV4dCAiUHJveHkvR2F0ZXdheToiIC1yZWxpZWYgcmlkZ2UKLWVudHJ5IC5mMi5lIC13aWR0aCAkd2UgLXRleHR2YXJpYWJsZSB2bmNwcm94eQotcGFjayAgLmYyLmwgLXNpZGUgbGVmdCAKLXBhY2sgIC5mMi5lIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLWJpbmQgIC5mMi5lIDxSZXR1cm4+IGxhdW5jaAotCi1mcmFtZSAuZjMKLWxhYmVsIC5mMy5sIC13aWR0aCAkd2wgLWFuY2hvciB3IC10ZXh0ICJSZW1vdGUgU1NIIENvbW1hbmQ6IiAtcmVsaWVmIHJpZGdlCi1lbnRyeSAuZjMuZSAtd2lkdGggJHdlIC10ZXh0dmFyaWFibGUgcmVtb3RlX3NzaF9jbWQKLXBhY2sgIC5mMy5sIC1zaWRlIGxlZnQgCi1wYWNrICAuZjMuZSAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4Ci0uZjMubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0uZjMuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi1iaW5kICAuZjMuZSA8UmV0dXJuPiBsYXVuY2gKLQotc2V0IHJlbW90ZV9zc2hfY21kX2xpc3Qgey5mMy5lIC5mMy5sfSAKLQotZnJhbWUgLmY0Ci1yYWRpb2J1dHRvbiAuZjQuc3NsIC1hbmNob3IgdyAgICAtdmFyaWFibGUgc3Noc3NsX3N3IC12YWx1ZSBzc2wgICAgLWNvbW1hbmQge3NzbF9zc2hfYWRqdXN0IHNzbH0gICAgLXRleHQgIlVzZSBTU0wiCi1yYWRpb2J1dHRvbiAuZjQuc3NoIC1hbmNob3IgdyAgICAtdmFyaWFibGUgc3Noc3NsX3N3IC12YWx1ZSBzc2ggICAgLWNvbW1hbmQge3NzbF9zc2hfYWRqdXN0IHNzaH0gICAgLXRleHQgIlVzZSBTU0giCi1yYWRpb2J1dHRvbiAuZjQuc3Noc3NsIC1hbmNob3IgdyAtdmFyaWFibGUgc3Noc3NsX3N3IC12YWx1ZSBzc2hzc2wgLWNvbW1hbmQge3NzbF9zc2hfYWRqdXN0IHNzaHNzbH0gLXRleHQgIlNTSCtTU0wiCi1wYWNrIC5mNC5zc2wgLmY0LnNzaCAuZjQuc3Noc3NsIC1zaWRlIGxlZnQgLWZpbGwgeAotCi1zZXQgc2hvd2luZ19ub19lbmNyeXB0aW9uIDAKLXJhZGlvYnV0dG9uIC5mNC5ub25lICAgLWFuY2hvciB3IC12YXJpYWJsZSBzc2hzc2xfc3cgLXZhbHVlIG5vbmUgICAtY29tbWFuZCB7c3NsX3NzaF9hZGp1c3Qgbm9uZX0gICAtdGV4dCAiTm9uZSAgICIKLWlmIFtkaXNhYmxlX2VuY3J5cHRpb25dIHsKLQlwYWNrIC5mNC5ub25lIC1zaWRlIGxlZnQKLQlzZXQgc2hvd2luZ19ub19lbmNyeXB0aW9uIDEKLX0KLQotZ2xvYmFsIHNraXBfdmVyaWZ5X2FjY2VwdGVkX2NlcnRzCi1zZXQgc2tpcF92ZXJpZnlfYWNjZXB0ZWRfY2VydHMgMAotZ2xvYmFsIGFub25fZGhfZGV0ZWN0ZWQKLXNldCBhbm9uX2RoX2RldGVjdGVkIDAKLWdsb2JhbCB2ZW5jcnlwdF9kZXRlY3RlZAotc2V0IHZlbmNyeXB0X2RldGVjdGVkICIiCi0KLWdsb2JhbCBhbHdheXNfdmVyaWZ5X3NzbAotc2V0IGFsd2F5c192ZXJpZnlfc3NsIDE7Ci1pZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19WRVJJRllfQUxMKV19IHsKLQlzZXQgYWx3YXlzX3ZlcmlmeV9zc2wgMDsKLX0KLQotaWYgeyR1bmFtZSA9PSAiRGFyd2luIn0gewotCWJ1dHRvbiAuZjQuZ2V0Y2VydCAtY29tbWFuZCB7ZmV0Y2hfY2VydCAxfSAtdGV4dCAiRmV0Y2ggQ2VydCIKLX0gZWxzZSB7Ci0JYnV0dG9uIC5mNC5nZXRjZXJ0IC1jb21tYW5kIHtmZXRjaF9jZXJ0IDF9IC10ZXh0ICJGZXRjaCBDZXJ0IiAtcGFkeCAzCi19Ci1jaGVja2J1dHRvbiAuZjQuYWx3YXlzIC12YXJpYWJsZSBhbHdheXNfdmVyaWZ5X3NzbCAtdGV4dCAiVmVyaWZ5IEFsbCBDZXJ0cyIgLWNvbW1hbmQgbm9fY2VydHNfdHV0b3JpYWxfbWVzZwotcGFjayAuZjQuZ2V0Y2VydCAtc2lkZSByaWdodCAtZmlsbCB4Ci1pZiB7W2luZm8gZXhpc3RzIGVudihTU1ZOQ19OT19WRVJJRllfQUxMX0JVVFRPTildfSB7Ci0Jc2V0IGFsd2F5c192ZXJpZnlfc3NsIDA7Ci19IGVsc2UgewotCXBhY2sgLmY0LmFsd2F5cyAtc2lkZSByaWdodCAtZmlsbCB4Ci19Ci0KLWlmIHskc3NoX29ubHkgfHwgJHRzX29ubHl9IHsKLQlzc2xfc3NoX2FkanVzdCBzc2gKLX0gZWxzZSB7Ci0Jc3NsX3NzaF9hZGp1c3Qgc3NsCi19Ci0KLWZyYW1lIC5iCi1idXR0b24gLmIuaGVscCAgLXRleHQgIkhlbHAiIC1jb21tYW5kIGhlbHAKLWJ1dHRvbiAuYi5jZXJ0cyAtdGV4dCAiQ2VydHMgLi4uIiAtY29tbWFuZCBnZXRjZXJ0cwotYnV0dG9uIC5iLm9wdHMgIC10ZXh0ICJPcHRpb25zIC4uLiIgLWNvbW1hbmQgc2V0X29wdGlvbnMKLWJ1dHRvbiAuYi5sb2FkICAtdGV4dCAiTG9hZCIgLWNvbW1hbmQge2xvYWRfcHJvZmlsZX0KLWJ1dHRvbiAuYi5zYXZlICAtdGV4dCAiU2F2ZSIgLWNvbW1hbmQge3NhdmVfcHJvZmlsZX0KLWJ1dHRvbiAuYi5jb25uICAtdGV4dCAiQ29ubmVjdCIgLWNvbW1hbmQgbGF1bmNoCi1idXR0b24gLmIuZXhpdCAgLXRleHQgIkV4aXQiIC1jb21tYW5kIHtkZXN0cm95IC47IGV4aXR9Ci0KLQotaWYgeyRzc2hfb25seSB8fCAkdHNfb25seX0gewotCXBhY2sgICAgICAgICAgLmIub3B0cyAuYi5zYXZlIC5iLmxvYWQgLmIuY29ubiAuYi5oZWxwIC5iLmV4aXQgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAotfSBlbHNlIHsKLQlwYWNrIC5iLmNlcnRzIC5iLm9wdHMgLmIuc2F2ZSAuYi5sb2FkIC5iLmNvbm4gLmIuaGVscCAuYi5leGl0IC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKLX0KLQotaWYgeyRtdWx0aWVudHJ5fSB7Ci0JaWYgeyEgJGlzX3dpbmRvd3N9IHsKLQkJaWYgeyRzc2hfb25seX0gewotCQkJcGFjayAubCAuZjAgLmYxIC5mMiAuZjMgICAgIC5iIC1zaWRlIHRvcCAtZmlsbCB4Ci0JCX0gZWxzZWlmIHskdHNfb25seX0gewotCQkJcGFjayAubCAuZjAgICAgIC5mMiAgICAgICAgIC5iIC1zaWRlIHRvcCAtZmlsbCB4Ci0JCX0gZWxzZSB7Ci0JCQlwYWNrIC5sIC5mMCAuZjEgLmYyIC5mMyAuZjQgLmIgLXNpZGUgdG9wIC1maWxsIHgKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIHskc3NoX29ubHl9IHsKLQkJCXBhY2sgLmwgLmYwICAgICAuZjIgLmYzICAgICAuYiAtc2lkZSB0b3AgLWZpbGwgeAotCQl9IGVsc2VpZiB7JHRzX29ubHl9IHsKLQkJCXBhY2sgLmwgLmYwICAgICAuZjIgICAgICAgICAuYiAtc2lkZSB0b3AgLWZpbGwgeAotCQl9IGVsc2UgewotCQkJcGFjayAubCAuZjAgICAgIC5mMiAuZjMgLmY0IC5iIC1zaWRlIHRvcCAtZmlsbCB4Ci0JCX0KLQl9Ci19IGVsc2UgewotCXBhY2sgLmwgLmYwIC5iIC1zaWRlIHRvcCAtZmlsbCB4Ci19Ci1pZiB7IVtpbmZvIGV4aXN0cyBlbnYoU1NWTkNfR1VJX0NISUxEKV0gfHwgJGVudihTU1ZOQ19HVUlfQ0hJTEQpID09ICIifSB7Ci0JY2VudGVyX3dpbiAuCi19Ci1mb2N1cyAuZjAuZQotCi13bSBkZWljb25pZnkgLgotCi1nbG9iYWwgc3lzdGVtX2J1dHRvbl9mYWNlCi1zZXQgc3lzdGVtX2J1dHRvbl9mYWNlICIiCi1mb3JlYWNoIGl0ZW0gWy5iLmhlbHAgY29uZmlndXJlIC1iZ10gewotCXNldCBzeXN0ZW1fYnV0dG9uX2ZhY2UgJGl0ZW0KLX0KLQotaWYge1tpbmZvIGV4aXN0cyBlbnYoU1NWTkNfR1VJX0NNRCldfSB7Ci0Jc2V0IGVudihTU1ZOQ19HVUlfQ0hJTEQpIDEKLQliaW5kIC4gPENvbnRyb2wtbj4gImV4ZWMgJGVudihTU1ZOQ19HVUlfQ01EKSAmIgotfQotYmluZCAuIDxDb250cm9sLXE+ICJkZXN0cm95IC47IGV4aXQiCi1iaW5kIC4gPFNoaWZ0LUVzY2FwZT4gImRlc3Ryb3kgLjsgZXhpdCIKLWJpbmQgLiA8Q29udHJvbC1zPiAibGF1bmNoX3NoZWxsX29ubHkiCi1iaW5kIC4gPENvbnRyb2wtcD4ge3BvcnRfa25vY2tfb25seSAiIiAiS05PQ0sifQotYmluZCAuIDxDb250cm9sLVA+IHtwb3J0X2tub2NrX29ubHkgIiIgIkZJTklTSCJ9Ci1iaW5kIC4gPENvbnRyb2wtbD4ge2xvYWRfcHJvZmlsZX0KLWJpbmQgLiA8QjMtQnV0dG9uUmVsZWFzZT4ge2xvYWRfcHJvZmlsZX0KLQotYmluZCAuIDxDb250cm9sLXQ+IHt0b2dnbGVfdHNvbmx5fQotYmluZCAuIDxDb250cm9sLWQ+IHtkZWxldGVfcHJvZmlsZX0KLWJpbmQgLiA8U2hpZnQtQjMtQnV0dG9uUmVsZWFzZT4ge3RvZ2dsZV90c29ubHl9Ci1iaW5kIC4gPFNoaWZ0LUIyLUJ1dHRvblJlbGVhc2U+IHt0b2dnbGVfdHNvbmx5fQotYmluZCAubCA8U2hpZnQtQnV0dG9uUmVsZWFzZT4ge3RvZ2dsZV90c29ubHl9Ci1iaW5kIC4gPENvbnRyb2wtaD4ge3RvZ2dsZV9zc2hvbmx5fQotYmluZCAuIDxDb250cm9sLVQ+IHt0b19zc3ZuY30KLWJpbmQgLiA8Q29udHJvbC1hPiB7c2V0X2FkdmFuY2VkX29wdGlvbnN9Ci1iaW5kIC4gPENvbnRyb2wtbz4ge3NldF9vcHRpb25zfQotYmluZCAuIDxDb250cm9sLXU+IHtzZXRfc3N2bmN2aWV3ZXJfb3B0aW9uc30KLWJpbmQgLiA8Q29udHJvbC1lPiB7dG9nZ2xlX25vX2VuY3J5cHRpb259Ci0KLWdsb2JhbCBlbnRlcmVkX2d1aV90b3AgYnV0dG9uX2d1aV90b3AKLXNldCBlbnRlcmVkX2d1aV90b3AgMAotc2V0IGJ1dHRvbl9ndWlfdG9wIDAKLWJpbmQgLiA8RW50ZXI+IHtzZXQgZW50ZXJlZF9ndWlfdG9wIDF9Ci1iaW5kIC5sIDxCdXR0b25QcmVzcz4ge3NldCBidXR0b25fZ3VpX3RvcCAxfQotYmluZCAuZjAubCA8QnV0dG9uUHJlc3M+IHtzZXQgYnV0dG9uX2d1aV90b3AgMX0KLQotdXBkYXRlCi0KLW1hY19yYWlzZQotCi1zZXQgZGlkbG9hZCAwCi0KLWZvciB7c2V0IGkgMH0geyRpIDwgJGFyZ2N9IHtpbmNyIGl9IHsKLQlzZXQgaXRlbSBbbGluZGV4ICRhcmd2ICRpXQotCXJlZ3N1YiB7Xi0tfSAkaXRlbSAiLSIgaXRlbQotCWlmIHskaXRlbSA9PSAiLiJ9IHsKLQkJOwotCX0gZWxzZWlmIHskaXRlbSA9PSAiLW52In0gewotCQlzZXQgYWx3YXlzX3ZlcmlmeV9zc2wgMAotCX0gZWxzZWlmIHskaXRlbSA9PSAiLWhlbHAifSB7Ci0JCWhlbHAKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIi1zc2gifSB7Ci0JCTsKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIi1iaWdnZXIifSB7Ci0JCTsKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIi10cyJ9IHsKLQkJOwotCX0gZWxzZWlmIHskaXRlbSA9PSAiLXNzIn0gewotCQk7Ci0JfSBlbHNlaWYgeyRpdGVtID09ICItc3NsIn0gewotCQk7Ci0JfSBlbHNlaWYgeyRpdGVtID09ICItdHNvIn0gewotCQk7Ci0JfSBlbHNlaWYgeyRpdGVtID09ICItbXljZXJ0IiB8fCAkaXRlbSA9PSAiLWNlcnQifSB7Ci0JCWluY3IgaQotCX0gZWxzZWlmIHskaXRlbSA9PSAiLWNhY2VydCIgfHwgJGl0ZW0gPT0gIi1jYSJ9IHsKLQkJaW5jciBpCi0JfSBlbHNlaWYgeyRpdGVtID09ICItY3JsIn0gewotCQlpbmNyIGkKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIi1wcmludGhlbHAifSB7Ci0JCXByaW50X2hlbHAKLQkJZXhpdDsKLQl9IGVsc2VpZiB7JGl0ZW0gIT0gIiJ9IHsKLQkJaWYge1tmaWxlIGV4aXN0cyAkaXRlbV0gJiYgW2ZpbGUgaXNmaWxlICRpdGVtXX0gIHsKLQkJCXNldCBkaWRsb2FkIDEKLQkJCWxvYWRfcHJvZmlsZSAuICRpdGVtCi0JCX0gZWxzZSB7Ci0JCQlzZXQgb2sgMAotCQkJc2V0IGRpciBbZ2V0X3Byb2ZpbGVzX2Rpcl0KLQkJCXNldCB0cnkgIiRkaXIvJGl0ZW0iCi0JCQlmb3JlYWNoIHRyeSBbbGlzdCAkZGlyLyRpdGVtICRkaXIvJGl0ZW0udm5jXSB7Ci0JCQkJaWYge1tmaWxlIGV4aXN0cyAkdHJ5XSAmJiBbZmlsZSBpc2ZpbGUgJHRyeV19IHsKLQkJCQkJbG9hZF9wcm9maWxlIC4gJHRyeQotCQkJCQlzZXQgb2sgMQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiB7ISAkb2sgJiYgW3JlZ2V4cCB7OlswLTldWzAtOV0qJH0gJGl0ZW1dfSB7Ci0JCQkJZ2xvYmFsIHZuY2Rpc3BsYXkKLQkJCQlzZXQgdm5jZGlzcGxheSAkaXRlbQotCQkJCXNldCBvayAxCi0JCQl9Ci0JCQkKLQkJCWlmIHshICRva30gewotCQkJICAgIGlmIHskdHNfb25seSB8fCAkc3NoX29ubHl9IHsKLQkJCQlnbG9iYWwgdm5jZGlzcGxheQotCQkJCXNldCB2bmNkaXNwbGF5ICRpdGVtCi0JCQkJc2V0IG9rIDEKLQkJCSAgICB9Ci0JCQl9Ci0JCQlpZiB7JG9rfSB7Ci0JCQkJdXBkYXRlIAotCQkJCXNldCBkaWRsb2FkIDEKLQkJCQlpZiBbaW5mbyBleGlzdHMgZW52KFNTVk5DX1BST0ZJTEVfTE9BRE9OTFkpXSB7Ci0JCQkJCWlmIHskZW52KFNTVk5DX1BST0ZJTEVfTE9BRE9OTFkpID09ICIxIn0gewotCQkJCQkJc2V0IG9rIDAKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiB7JG9rfSB7Ci0JCQkJCWFmdGVyIDc1MAotCQkJCQlsYXVuY2gKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYmluL3V0aWwvc3R1bm5lbC1zZXJ2ZXIuY29uZiBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vdXRpbC9zdHVubmVsLXNlcnZlci5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjczMjdhLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9iaW4vdXRpbC9zdHVubmVsLXNlcnZlci5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIwotIyBFeGFtcGxlIFNTTCBzdHVubmVsIFNFUlZFUiBjb25maWd1cmF0aW9uIGZpbGUuICAoZS5nLiBmb3IgeW91ciBWTkMKLSMgc2VydmVyIG9uIHRoaXMgc2FtZSBtYWNoaW5lLikKLSMKLSMgVG8gdXNlIHRoaXMgZmlsZSB5b3UgbWF5IG5lZWQgdG8gZWRpdCBpdC4gIFRoZW4geW91IHdpbGwgbmVlZAotIyB0byBtYW51YWxseSBzdGFydCB1cCBzdHVubmVsIHVzaW5nIGl0LgotIyAoZS5nLiAvcGF0aC90by9zdHVubmVsIHN0dW5uZWwtc2VydmVyLmNvbmYpCi0jCi0jIE5PVEU6IFlvdSBNVVNUIHNwZWNpZnkgYSBjZXJ0ID0gUEVNIGZpbGUgbGluZSBmb3Igc2VydmVyIG1vZGUuCi0jIFNTVk5DIG9yIHgxMXZuYyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgb25lIGlmIHlvdSBsaWtlLgotIwotIyBUaGlzIGlzIGp1c3QgYW4gZXhhbXBsZSBhbmQgaXMgbm90IHVzZWQgYnkgdGhlIHRvb2xzIGluIHRoaXMgcGFja2FnZS4KLSMgSXQgaXMgaGVyZSBpbiBjYXNlIHlvdSB3YW50ZWQgdG8gc2VlIGhvdyB0byBhZGQgU1NMIHN1cHBvcnQgdG8gYW55Ci0jIFZOQyBzZXJ2ZXIgeW91IGhhdmUuCi0jCi1STkRieXRlcyA9IDIwNDgKLVJORGZpbGUgPSBiYW5hbmFyYW5kLmJpbgotUk5Eb3ZlcndyaXRlID0geWVzCi0jCi0jIFJlbW90ZSBjbGllbnQgY2VydHMgY291bGQgZ28gaGVyZToKLSMgIENBcGF0aCA9IC9wYXRoL3RvLy4uLi9jcnQtZGlyCi0jICBDQWZpbGUgPSAvcGF0aC90by8uLi4vZm9vLmNydAotIyAgdmVyaWZ5ID0gMgotIwotIyBUaGUgc2VydmVyIGNlcnQgZ29lcyBoZXJlICgqKklUIE1VU1QgQkUgU1BFQ0lGSUVEIElOIFNFUlZFUiBNT0RFKiopOgotIyAgY2VydCA9IC9wYXRoL3RvLy4uLi9teS5wZW0KLSMKLVt2bmNdCi0jCi0jIFNldCB0byBsb2NhbCBsaXN0ZW5pbmcgcG9ydCBudW1iZXIgKGUuZy4gNTkwMSBmb3Igdm5jIGRpc3BsYXkgMSk6Ci0jIHNvIHRoZSByZW1vdGUgdmlld2VycyB3b3VsZCBjb25uZWN0IHRvOiB5b3VybWFjaGluZToxCi0jCi1hY2NlcHQgPSA1OTAxCi0jCi0jIFNldCB0byBsb2NhbGhvc3Q6cG9ydCB0byBjb25uZWN0IHRvIFZOQyBzZXJ2ZXIgb24gdGhpcyBzYW1lIG1hY2hpbmU6Ci0jIChFLmcuIHlvdSBydW4gV2luVk5DIG9uIDowLCBwcmVmZXJhYmx5IGxpc3RlbmluZyBvbiBsb2NhbGhvc3QpLgotIwotY29ubmVjdCA9IGxvY2FsaG9zdDo1OTAwCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvYnVpbGQudW5peCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9idWlsZC51bml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODRlZjc4Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9idWlsZC51bml4CisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIFNlZSB0aGUgUkVBRE1FIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm8gb24gdXNpbmcgdGhpcyBzY3JpcHQKLSMgKGJ1aWxkLnVuaXgpLiAgU2VhcmNoIGZvciBTU1ZOQ19CVUlMRC4KLSMKLSMgTm90ZXM6IHRvIGN1c3RvbWl6ZSBsb2NhdGlvbnMsIGUuZy4gZm9yIGxpYmpwZWcsIHNldCBMREZMQUdTX09TIGFuZC9vcgotIyBDUFBGTEFHU19PUwotIwotIyBlLmcuIG9uIERhcndpbiB3ZSBkaWQ6Ci0jCi0jIGVudiBMREZMQUdTX09TPSItTC9Wb2x1bWVzL3NvbWVwbGFjZS9jb21tb24vbGliIiBDUFBGTEFHU19PUz0iLUkgL1ZvbHVtZXMvc29tZXBsYWNlL2NvbW1vbi9pbmNsdWRlIiAuL2J1aWxkLnVuaXgKLSMKLQotCi0jIEFkZCB1c2VmdWwgZGlyZWN0b3JpZXMgdG8gUEFUSDoKLSMKLVBBVEg9JFBBVEg6L3Vzci9iaW46L2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL1gxMVI2L2JpbjovdXNyL2Jpbi9YMTE6L3Vzci9vcGVud2luL2Jpbjovb3B0L1NVTldzcHJvL2JpbjovdXNyL3Nmdy9iaW46L3Vzci9jY3MvYmluCi1leHBvcnQgUEFUSAotCi0jIENoZWNrIGxvY2F0aW9uOgotIwotdGhpc2Rpcj1gZGlybmFtZSAiJDAiYAotaWYgWyAhIC1kIC4vYmluIC1vICEgLWQgc3JjL3BhdGNoZXMgLW8gISAtZiAuL2J1aWxkLnVuaXggXTsgdGhlbgotCWVjaG8gIiIKLQllY2hvICJZb3UgbXVzdCBydW4gdGhpcyBzY3JpcHQgZnJvbTogJHRoaXNkaXIiCi0JZWNobyAiIgotCWVjaG8gIk1heWJlOiIKLQllY2hvICIiCi0JZWNobyAiICBjZCAkdGhpc2RpciIKLQllY2hvICIgIC4vYnVpbGQudW5peCIKLQlpZiBbICJYJEJVSUxEX1VOSVgiICE9ICJYIiBdOyB0aGVuCi0JCXNsZWVwIDIKLQkJZXhpdCAxCi0JZmkKLQllY2hvICIiCi0Jc2xlZXAgMQotCXByaW50ZiAiRG8geW91IHdhbnQgbWUgdG8gcnVuIHRob3NlIGZvciB5b3U/ICB5L1tuXSAiCi0JcmVhZCB4Ci0JaWYgWyAiWCR4IiA9ICJYeSIgXTsgdGhlbgotCQlCVUlMRF9VTklYPTEKLQkJZXhwb3J0IEJVSUxEX1VOSVgKLQkJY2QgIiR0aGlzZGlyIiB8fCBleGl0IDEKLQkJZWNobyAicHdkOiIKLQkJcHdkCi0JCXNsZWVwIDEKLQkJLi9idWlsZC51bml4Ci0JZmkKLQkKLQlleGl0ICQ/Ci1maQotCi1wbGluZSgpIHsKLQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi19Ci0KLSMgVHJ5IHRvIGZpbmQgb3NuYW1lLmFyY2gKLSMKLW5hbWU9JFVOQU1FCi1pZiBbICJYJG5hbWUiID0gIlgiIF07IHRoZW4KLQluYW1lPWB1bmFtZSAtc20gfCBzZWQgLWUgJ3MvIC8uL2cnIC1lICdzL0xpbnV4XC5pLjg2L0xpbnV4Lmk2ODYvJ2AKLWZpCi1pZiBbICJYJG5hbWUiID0gIlgiIF07IHRoZW4KLQllY2hvICJjYW5ub3QgZGV0ZXJtaW5lIHBsYXRmb3JtOiBvcy5hcmNoLCBlLmcuIExpbnV4Lmk2ODYiCi0JZWNobyAic2V0IFwkVU5BTUUgbWFudWFsbHkgYW5kIHJldHJ5LiIKLQlleGl0IDEKLWZpCi0KLUxERD0ibGRkIgotaWYgWyBgdW5hbWVgID0gIkRhcndpbiIgXTsgdGhlbgotCUxERD0ib3Rvb2wgLUwiCi1maQotCi0jIENyZWF0ZSBhIHRtcCBkaXIgZm9yIHRoaXMgYnVpbGQ6Ci0jCi10bXA9Li9zcmMvdG1wLyRuYW1lLiQkCi1pZiBbICJYJFRNUERJUiIgIT0gIlgiIF07IHRoZW4KLQl0bXA9IiRUTVBESVIvJHRtcCIKLWZpCi1ta2RpciAtcCAkdG1wIHx8IGV4aXQgMQotCi0jIERvIHVsdHJhZnRwIEphdmEgdmlld2VyIChvbmx5KToKLSMKLWlmIFsgIlgkU1NWTkNfQlVJTERfVUxUUkFGVFAiICE9ICJYIiBdOyB0aGVuCi0JdWx0cmFmdHBfdGFyPWBscyAtdGQgLi9zcmMvemlwcy91bHRyYWZ0cC50YXIqIHwgaGVhZCAtMWAKLQlpZiBbICEgLWYgJHVsdHJhZnRwX3RhciBdOyB0aGVuCi0JCWVjaG8gImNvdWxkIG5vdCBsb2NhdGUgdWx0cmFmdHAgamF2YSB2bmMgdmlld2VyIHNvdXJjZSIKLQkJZXhpdCAxCi0JZmkKLQllY2hvICIiCi0JcGxpbmUKLQllY2hvICJCVUlMRElORyBUSEUgVUxUUkFGVFAgSEVMUEVSIEpBUiIKLQllY2hvICIiCi0Jc2xlZXAgMQotCi0JY2F0ICR1bHRyYWZ0cF90YXIgfCAoY2QgJHRtcDsgdGFyIHh2ZiAtKSB8fCBleGl0IDEKLQljZCAkdG1wL3VsdHJhZnRwIHx8IGV4aXQgMQotCXB3ZAotCWVjaG8KLQltYWtlIGluc3RhbGwKLQotCWV4aXQgMAkjIERPTkUKLWZpCi0KLSMgV29yayBvdXQgbWFpbiBkZXN0aW5hdGlvbjoKLSMKLWRlc3Q9Li9iaW4vJG5hbWUKLWlmIFsgLWQgJGRlc3QgXTsgdGhlbgotCWlmIFsgIlgkU1NWTkNfQlVJTERfRk9SQ0VfT1ZFUldSSVRFIiA9ICJYIiBdOyB0aGVuCi0JCXByaW50ZiAiJGRlc3QgZXhpc3RzLiAgb3ZlcndyaXRlIGluIGl0PyBbeV0vbiAiCi0JCXJlYWQgeAotCQlpZiBbICJYJHgiID0gIlhuIiBdOyB0aGVuCi0JCQlleGl0Ci0JCWZpCi0JZWxzZQotCQllY2hvICIkZGVzdCBleGlzdHMuICBvdmVyd3JpdGluZyBpbiBpdC4iCi0JZmkKLQlpZiBbICJYJFNTVk5DX0JVSUxEX1NLSVBfVklFV0VSIiA9ICJYIiBdOyB0aGVuCi0JCWlmIFsgYHVuYW1lYCA9ICJEYXJ3aW4iIF07IHRoZW4KLQkJCXJtIC1mICRkZXN0L3ZuY3ZpZXdlci54MTEqCi0JCWVsc2UKLQkJCXJtIC1mICRkZXN0L3ZuY3ZpZXdlcioKLQkJZmkKLQlmaQotCWlmIFsgIlgkU1NWTkNfQlVJTERfU0tJUF9TVFVOTkVMIiA9ICJYIiBdOyB0aGVuCi0JCXJtIC1mICRkZXN0L3N0dW5uZWwqCi0JZmkKLWZpCi1ta2RpciAtcCAkZGVzdCB8fCBleGl0IDEKLQotCi0jIFRyeSB0byBmaW5kIHNvbWUgc3RhdGljIGFyY2hpdmVzIG9mIHZhcmlvdXMgbGlicmFyaWVzOgotIwotbGlicz0iJHRtcC9saWJzIgotbWtkaXIgLXAgJGxpYnMgfHwgZXhpdCAxCi1mb3IgbGliYSBpbiBsaWJ6LmEgbGlianBlZy5hIGxpYnNzbC5hIGxpYmNyeXB0by5hCi1kbwotCWlmIFsgIlgkU1NWTkNfQlVJTERfU1RBVElDIiA9ICJYIiBdOyB0aGVuCi0JCWJyZWFrCi0JZmkKLQlmb3IgZGlyIGluICRTU1ZOQ19TVEFUSUNfRElSUyAvdXNyL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIC91c3IvcGtnL2xpYiAvdXNyL3Nmdy9saWIgL3Vzci9vcGVud2luL2xpYgotCWRvCi0JCWlmIFsgIlgkZGlyIiA9ICJYIiBdOyB0aGVuCi0JCQljb250aW51ZQotCQlmaQotCQlpZiBbICIkbmFtZSIgPSAiTGludXgueDg2XzY0IiAtbyAiJG5hbWUiID0gIkxpbnV4LnBwYzY0IiBdIDsgdGhlbgotCQkJZGlyNjQ9YGVjaG8gIiRkaXIiIHwgc2VkIC1lICdzLGxpYixsaWI2NCwnYAotCQkJaWYgWyAiWCRTU1ZOQ19CVUlMRF9OT19MSU5VWDY0IiAhPSAiWCIgXTsgdGhlbgotCQkJCToKLQkJCWVsaWYgWyAtZCAkZGlyNjQgXTsgdGhlbgotCQkJCWRpcj0kZGlyNjQKLQkJCWZpCi0JCWZpCi0JCXRyeT0iJGRpci8kbGliYSIKLQkJaWYgWyAtZiAkdHJ5IF07IHRoZW4KLQkJCWVjaG8gY3AgLXAgIiR0cnkiICRsaWJzCi0JCQkgICAgIGNwIC1wICIkdHJ5IiAkbGlicwotCQkJYnJlYWsKLQkJZmkKLQlkb25lCi1kb25lCi1pZiBbICJYJFNTVk5DX0JVSUxEX1NUQVRJQyIgIT0gIlgiIF07IHRoZW4KLQllY2hvICJGb3VuZCB0aGVzZSBzdGF0aWMgYXJjaGl2ZSBsaWJyYXJpZXMsIHdpbGwgdHJ5IHRvIHVzZSB0aGVtLi4uIgotCWxzIC1sZCAkbGlicwotCWxzIC1sICRsaWJzCi0JZWNobwotZmkKLQotaGF2ZV9nY2M9IiIKLWlmIHR5cGUgZ2NjID4gL2Rldi9udWxsOyB0aGVuCi0JaGF2ZV9nY2M9MQotZmkKLWhhdmVfY2M9IiIKLWlmIHR5cGUgY2MgPiAvZGV2L251bGw7IHRoZW4KLQloYXZlX2NjPTEKLWZpCi0KLWlmIFsgIlgkaGF2ZV9jYyIgPSAiWCIgXTsgdGhlbgotCWlmIFsgIlgkaGF2ZV9nY2MiID0gIlgxIiBdOyB0aGVuCi0JCWNhdCA+ICR0bXAvY2MgPDxFTkQKLSMhL2Jpbi9zaAotZ2NjICJcJEAiCi1FTkQKLQkJY2htb2QgNzU1ICR0bXAvY2MKLQkJUEFUSD0kUEFUSDpgcHdkYC8kdG1wCi0JCXR5cGUgY2MKLQkJdHlwZSBnY2MKLQlmaQotZmkKLQotaWYgWyAtZCAvdmFyL3RtcC9MSUJTIC1hICJYJFNTVk5DX0JVSUxEX1NUQVRJQyIgIT0gIlgiIF07IHRoZW4KLQlMREZMQUdTX09TPSIkTERGTEFHU19PUyAtTC92YXIvdG1wL0xJQlMiCi1maQotCi1pZiBbIGB1bmFtZWAgPSAiU3VuT1MiIF07IHRoZW4KLQlMREZMQUdTX09TPSIkTERGTEFHU19PUyAtTC91c3Ivc2Z3L2xpYiAtUi91c3Ivc2Z3L2xpYiIKLQlDUFBGTEFHU19PUz0iJENQUEZMQUdTX09TIC1JIC91c3Ivc2Z3L2luY2x1ZGUiCi1lbGlmIHVuYW1lIHwgZ3JlcCAtaSBic2QgPiAvZGV2L251bGw7IHRoZW4KLQlMREZMQUdTX09TPSIkTERGTEFHU19PUyAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wa2cvbGliIgotCUNQUEZMQUdTX09TPSIkQ1BQRkxBR1NfT1MgLUkgL3Vzci9sb2NhbC9pbmNsdWRlIC1JIC91c3IvcGtnL2luY2x1ZGUiCi1maQotCi1jbnQ9YGxzIC4vc3JjL3BhdGNoZXMvKi5wYXRjaCB8IHdjIC1jYAotaWYgWyAkY250IC1sdCAxIF07IHRoZW4KLQllY2hvICJDb3VsZCBub3QgZmluZCBhbnkgcGF0Y2hlcyBpbiAuL3NyYy9wYXRjaGVzLiAgSXMgeW91ciB0YXJiYWxsIG1pc3NpbmcgdGhlbT8iCi0JZXhpdCAxCi1maQotCi1wbGluZSgpIHsKLQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi19Ci0KLSMgRG8gdGlnaHR2bmMgdmlld2VyOgotIwotaWYgWyAiWCRTU1ZOQ19CVUlMRF9TS0lQX1ZJRVdFUiIgPSAiWCIgXTsgdGhlbgotCXRpZ2h0X3NyYz1gbHMgLXRkIC4vc3JjL3ZuY191bml4c3JjKiB8IGhlYWQgLTFgCi0JaWYgWyAhIC1kICR0aWdodF9zcmMgXTsgdGhlbgotCQllY2hvICJjb3VsZCBub3QgbG9jYXRlIHRpZ2h0IHZuYyB2aWV3ZXIgc291cmNlIgotCQlleGl0IDEKLQlmaQotCWVjaG8gIiIKLQlwbGluZQotCWVjaG8gIkJVSUxESU5HIFRIRSBWTkNWSUVXRVIiCi0JZWNobyAiIgotCXNsZWVwIDEKLQotCWNwIC1wUiAiJHRpZ2h0X3NyYyIgIiR0bXAvdm5jX3VuaXhzcmMiIHx8IGV4aXQgMQotCi0JZWNobyAiYXBwbHlpbmcgdGlnaHQgdm5jIHBhdGNoZXM6IgotCXN0YXJ0PWBwd2RgCi0JY2QgJHRtcDsKLQlmYWlsZWQ9MAotCWNvdW50PTAKLQlwYXRjaGVzPSIuLi8uLi9wYXRjaGVzL3RpZ2h0LXZuY3ZpZXdlci1mdWxsLnBhdGNoIgotCWlmIFsgISAtZiAiJHBhdGNoZXMiIF07IHRoZW4KLQkJcGF0Y2hlcz1gbHMgLi4vLi4vcGF0Y2hlcy90aWdodCogfCBncmVwIC12ICd0aWdodC12bmN2aWV3ZXItZnVsbC5wYXRjaCdgCi0JZmkKLQlmb3IgcGF0Y2ggaW4gJHBhdGNoZXMKLQlkbwotCQlpZiBbICEgLWYgIiRwYXRjaCIgXTsgdGhlbgotCQkJY29udGludWUKLQkJZmkKLQkJaWYgWyAiWCRQQVRDSF9GQUlMIiAhPSAiWCIgXTsgdGhlbgotCQkJZmFpbGVkPTEJCi0JCQlicmVhawotCQlmaQotCQllY2hvIFBBVENISU5HIFdJVEg6ICIkcGF0Y2giIAotCQlscyAtbCAiJHBhdGNoIgotCQlzbGVlcCAxCi0JCXBhdGNoIC1wMCA8ICIkcGF0Y2giCi0JCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCQlmYWlsZWQ9YGV4cHIgJGZhaWxlZCArIDFgCi0JCWVsc2UKLQkJCWNvdW50PWBleHByICRjb3VudCArIDFgCi0JCWZpCi0JZG9uZQotCXNsZWVwIDEKLQljZCAiJHN0YXJ0IgotCWlmIFsgJGZhaWxlZCAhPSAwIC1vICRjb3VudCA9IDAgXTsgdGhlbgotCQliYWxsPXNyYy96aXBzL3ZuY191bml4c3JjX3ZuY3ZpZXdlci5wYXRjaGVkLnRhcgotCQllY2hvICJwYXRjaGVzIGZhaWxlZCwgdHJ5aW5nIHRvIHVzZSBiYWNrdXAgdGFyYmFsbDoiCi0JCWxzIC1sICRiYWxsCi0JCXNsZWVwIDIKLQkJY2F0ICRiYWxsIHwgKGNkICR0bXA7IHRhciAteHZmIC0pCi0JZmkKLQllY2hvCi0KLQotCWNkICR0bXAvdm5jX3VuaXhzcmMKLQl4bWttZgotCW1ha2UgTWFrZWZpbGVzCi0JbXYgdm5jdmlld2VyL01ha2VmaWxlIHZuY3ZpZXdlci9NYWtlZmlsZS5vcmlnCi0Jc2VkIC1lICJzLEVYVFJBX0xET1BUSU9OUyA9LEVYVFJBX0xET1BUSU9OUyA9IC1MJHN0YXJ0LyRsaWJzICRMREZMQUdTX09TLCIgXAotCSAgICAtZSAicyxDQ09QVElPTlMgPSxDQ09QVElPTlMgPSAkQ1BQRkxBR1NfT1MsIiBcCi0JCXZuY3ZpZXdlci9NYWtlZmlsZS5vcmlnID4gdm5jdmlld2VyL01ha2VmaWxlCi0KLQlpZiBbIGB1bmFtZWAgPSAiU3VuT1MiIF07IHRoZW4KLQkJZm9yIGQgaW4gdm5jdmlld2VyIGxpYnZuY2F1dGggdm5jY29ubmVjdCB2bmNwYXNzd2QKLQkJZG8KLQkJCW12ICRkL01ha2VmaWxlICRkL01ha2VmaWxlLm9yaWcKLQkJCXNlZCAtZSAicyxDQ09QVElPTlMgPS4qXCQsQ0NPUFRJT05TID0gJENQUEZMQUdTX09TLCIgXAotCQkJCSRkL01ha2VmaWxlLm9yaWcgPiAkZC9NYWtlZmlsZQotCQlkb25lCi0JZmkKLQotCW1ha2UgZGVwZW5kCi0JZWNobyAkUEFUSAotCWlmIFsgIlgkVFVSQk9WTkMiID0gIlgiIF07IHRoZW4KLQkJbWFrZSBhbGwKLQllbHNlCi0JCW1ha2UgQ0NPUFRJT05TPSItRFRVUkJPVk5DICRDUFBGTEFHU19PUyIgRVhUUkFfTElCUkFSSUVTPSIkVFVSQk9WTkMiIGFsbAotCWZpCi0JbHMgLWwgdm5jdmlld2VyL3ZuY3ZpZXdlcgotCWNkICIkc3RhcnQiCi0Jc3JjPSR0bXAvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlcgotCXN5bmMKLQlzbGVlcCAyCi0Jc3luYwotCXN0cmlwICRzcmMKLQlzeW5jCi0Jc2xlZXAgMgotCXN5bmMKLQl3YyAgJHNyYwotCXN1bSAkc3JjCi0Jc2xlZXAgMgotCi0Jc3VmZj0iIgotCWlmIFsgYHVuYW1lYCA9ICJEYXJ3aW4iIF07IHRoZW4KLQkJc3VmZj0iLngxMSIKLQlmaQotCWlmIFsgIlgkVFVSQk9WTkMiICE9ICJYIiBdOyB0aGVuCi0JCXN1ZmY9IiRzdWZmLnR1cmJvdm5jIgotCWZpCi0JZWNobyBjcCAtcCAkc3JjICRkZXN0L3ZuY3ZpZXdlciRzdWZmCi0Jc2xlZXAgMQotCWNwIC1wICRzcmMgJGRlc3Qvdm5jdmlld2VyJHN1ZmYgfHwgZXhpdCAxCi0KLQllY2hvCi0JcGxpbmUKLQllY2hvICJMSVNUSU5HLCBIRUxQLCBhbmQgTEREIFRIRSBWTkNWSUVXRVI6IiAKLQllY2hvCi0Jc2xlZXAgMQotCi0JbHMgLWwgJHNyYyAkZGVzdC92bmN2aWV3ZXIkc3VmZgotCWVjaG8KLQllY2hvICRkZXN0L3ZuY3ZpZXdlciRzdWZmIC1oCi0JZWNobwotCSRkZXN0L3ZuY3ZpZXdlciRzdWZmIC1oCi0JZWNobwotCWVjaG8gJExERCAkZGVzdC92bmN2aWV3ZXIkc3VmZgotCWVjaG8KLQkkTEREICRkZXN0L3ZuY3ZpZXdlciRzdWZmCi0JZWNobyAiIgotZmkKLQotIyBEbyBzdHVubmVsOgotIwotaWYgWyAiWCRTU1ZOQ19CVUlMRF9TS0lQX1NUVU5ORUwiID0gIlgiIF07IHRoZW4KLQlzdHVubmVsX3NyYz1gbHMgLXRkIC4vc3JjL3N0dW5uZWwqIHwgaGVhZCAtMWAKLQlpZiBbICEgLWQgJHN0dW5uZWxfc3JjIF07IHRoZW4KLQkJZWNobyAiY291bGQgbm90IGxvY2F0ZSBzdHVubmVsIHNvdXJjZSIKLQkJZXhpdCAxCi0JZmkKLQllY2hvICIiCi0JcGxpbmUKLQllY2hvICJCVUlMRElORyBUSEUgU1RVTk5FTCIKLQllY2hvICIiCi0Jc2xlZXAgMQotCi0JY3AgLXBSICIkc3R1bm5lbF9zcmMiICIkdG1wL3N0dW5uZWwiIHx8IGV4aXQgMQotCi0JZWNobyAiYXBwbHlpbmcgc3R1bm5lbCBwYXRjaGVzOiIKLQlzdGFydD1gcHdkYAotCWNkICR0bXA7Ci0JZmFpbGVkPTAKLQljb3VudD0wCi0JZm9yIHBhdGNoIGluIC4uLy4uL3BhdGNoZXMvc3R1bm5lbCoKLQlkbwotCQlpZiBbICEgLWYgIiRwYXRjaCIgXTsgdGhlbgotCQkJY29udGludWUKLQkJZmkKLQkJaWYgWyAiWCRQQVRDSF9GQUlMIiAhPSAiWCIgXTsgdGhlbgotCQkJZmFpbGVkPTEJCi0JCQlicmVhawotCQlmaQotCQllY2hvIFBBVENISU5HIFdJVEg6ICIkcGF0Y2giIAotCQlscyAtbCAiJHBhdGNoIgotCQlzbGVlcCAxCi0JCXBhdGNoIC1wMCA8ICRwYXRjaAotCQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQkJZmFpbGVkPWBleHByICRmYWlsZWQgKyAxYAotCQllbHNlCi0JCQljb3VudD1gZXhwciAkY291bnQgKyAxYAotCQlmaQotCWRvbmUKLQlzbGVlcCAxCi0JY2QgIiRzdGFydCIKLQlpZiBbICRmYWlsZWQgIT0gMCAtbyAkY291bnQgPSAwIF07IHRoZW4KLQkJYmFsbD1zcmMvemlwcy9zdHVubmVsLnBhdGNoZWQudGFyCi0JCWVjaG8gInBhdGNoZXMgZmFpbGVkLCB0cnlpbmcgdG8gdXNlIGJhY2t1cCB0YXJiYWxsOiIKLQkJbHMgLWwgJGJhbGwKLQkJc2xlZXAgMgotCQljYXQgJGJhbGwgfCAoY2QgJHRtcDsgdGFyIC14dmYgLSkKLQlmaQotCWVjaG8KLQotCi0JY2QgJHRtcC9zdHVubmVsCi0JaWYgWyBgdW5hbWVgID0gIlN1bk9TIiBdOyB0aGVuCi0JCWNwIGNvbmZpZ3VyZSBjb25maWd1cmUub3JpZwotCQlzZWQgLWUgInMsbWFpbmRpciBpbixtYWluZGlyIGluIC91c3Ivc2Z3LCIgY29uZmlndXJlLm9yaWcgPiBjb25maWd1cmUKLQlmaQotCWVudiBMREZMQUdTPSItTCRzdGFydC8kbGlicyAkTERGTEFHU19PUyIgQ1BQRkxBR1M9IiRDUFBGTEFHU19PUyIgLi9jb25maWd1cmUgLS1kaXNhYmxlLWxpYndyYXAgLS1lbmFibGUtaXB2NgotCW1ha2UKLQlscyAtbCBzcmMvc3R1bm5lbAotCWNkICIkc3RhcnQiCi0Jc3JjPSR0bXAvc3R1bm5lbC9zcmMvc3R1bm5lbAotCXN5bmMKLQlzbGVlcCAyCi0Jc3luYwotCXN0cmlwICRzcmMKLQlzeW5jCi0Jc2xlZXAgMgotCXN5bmMKLQl3YyAgJHNyYwotCXN1bSAkc3JjCi0Jc2xlZXAgMgotCWVjaG8gY3AgLXAgJHNyYyAkZGVzdC9zdHVubmVsCi0JY3AgLXAgJHNyYyAkZGVzdC9zdHVubmVsIHx8IGV4aXQgMQotCXNsZWVwIDEKLQljcCAtcCAkc3JjICRkZXN0L3N0dW5uZWwgfHwgZXhpdCAxCi0KLQllY2hvCi0JcGxpbmUKLQllY2hvICJMSVNUSU5HLCBIRUxQLCBhbmQgTEREIFRIRSBTVFVOTkVMOiIgCi0JZWNobwotCXNsZWVwIDEKLQotCWxzIC1sICRzcmMgJGRlc3Qvc3R1bm5lbAotCWVjaG8KLQllY2hvICRkZXN0L3N0dW5uZWwgLWhlbHAKLQllY2hvCi0JJGRlc3Qvc3R1bm5lbCAtaGVscAotCWVjaG8KLQllY2hvICRMREQgJGRlc3Qvc3R1bm5lbAotCWVjaG8KLQkkTEREICRkZXN0L3N0dW5uZWwKLQllY2hvICIiCi1maQotCi0jIERvIHZuY3N0b3JlcHcgYW5kIGxkIHByZWxvYWQgZnJpZW5kczoKLSMKLWlmIFsgIlgkU1NWTkNfQlVJTERfU0tJUF9WTkNTVE9SRVBXIiA9ICJYIiBdOyB0aGVuCi0Jdm5jcHdfdGFyPWBscyAtdGQgLi9zcmMvemlwcy92bmNzdG9yZXB3KiB8IGhlYWQgLTFgCi0JaWYgWyAhIC1mICR2bmNwd190YXIgXTsgdGhlbgotCQllY2hvICJjb3VsZCBub3QgbG9jYXRlIHZuY3N0b3JlcHcgc291cmNlIgotCQlleGl0IDEKLQlmaQotCWVjaG8gIiIKLQlwbGluZQotCWVjaG8gIkJVSUxESU5HIFRIRSBWTkNTVE9SRVBXIEFORCBGUklFTkRTIgotCWVjaG8gIiIKLQlzbGVlcCAxCi0KLQljYXQgIiR2bmNwd190YXIiIHwgKGNkICR0bXA7IHRhciB4dmYgLSkKLQotCWNkICR0bXAvdm5jc3RvcmVwdwotCW1ha2UKLQotCWNkICIkc3RhcnQiCi0JY3AgLXAgJHRtcC92bmNzdG9yZXB3L3ZuY3N0b3JlcHcgJHRtcC92bmNzdG9yZXB3L2xpbV9hY2NlcHQuc28gJGRlc3QKLQllY2hvICIiCi0KLQljZCAkdG1wL3ZuY3N0b3JlcHcKLQltYWtlIGNsZWFuCi0KLQllbnYgTERfU1NMPSItTCRzdGFydC8kbGlicyAkTERGTEFHU19PUyAkTERfU1NMIiBDUFBfU1NMPSIkQ1BQRkxBR1NfT1MiIG1ha2UgdWx0cmF2bmNfZHNtX2hlbHBlcgotCi0JY2QgIiRzdGFydCIKLQljcCAtcCAkdG1wL3ZuY3N0b3JlcHcvdWx0cmF2bmNfZHNtX2hlbHBlciAkZGVzdAotCWVjaG8gIiIKLWZpCi0KLQotaWYgWyAiWCRTU1ZOQ19CVUlMRF9TS0lQX1ZJRVdFUiIgPSAiWCIgLWEgIlgkU1NWTkNfQlVJTERfU0tJUF9TVFVOTkVMIiA9ICJYIiBdOyB0aGVuCi0JIyBsaXN0IHRoZSB2aWV3ZXIgYWdhaW4uCi0KLQllY2hvCi0JcGxpbmUKLQllY2hvICJMSVNUSU5HLCBIRUxQLCBhbmQgTEREIFRIRSBWTkNWSUVXRVIgKGFnYWluKToiIAotCWVjaG8KLQlzbGVlcCAxCi0KLQlscyAtbCAkZGVzdC92bmN2aWV3ZXIkc3VmZgotCWVjaG8KLQllY2hvICRkZXN0L3ZuY3ZpZXdlciRzdWZmIC1oCi0JZWNobwotCSRkZXN0L3ZuY3ZpZXdlciRzdWZmIC1oCi0JZWNobwotCWVjaG8gJExERCAkZGVzdC92bmN2aWV3ZXIkc3VmZgotCWVjaG8KLQkkTEREICRkZXN0L3ZuY3ZpZXdlciRzdWZmCi1maQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2ZpbGVsaXN0LnR4dCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9maWxlbGlzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDRmMjUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL2ZpbGVsaXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0zMjc3NzAzICAgIDQgZHJ3eHIteHIteCAgIDYgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgU2VwIDEzIDIxOjI4IC4KLTMyNzc3MDQgICAgNCBkcnd4ci14ci14ICAgNyBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBBdWcgIDIgMTA6MDUgLi9zcmMKLTMyNzc3ODEgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBBdWcgIDIgMTA6MDkgLi9zcmMvemlwcwotMzI3Nzc4MiAgNDg0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgNDg4NTEyIEp1bCAyNSAxNTowOSAuL3NyYy96aXBzL3N0dW5uZWwtNC4xNC50YXIuZ3oKLTMyNzc3ODMgIDIxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgIDIwOTE0OSBKdWwgMjUgMTU6MTAgLi9zcmMvemlwcy90aWdodHZuYy0xLjNkZXY3X3g4Nl92aWV3ZXIuemlwCi0zMjc3Nzg0IDIxMzYgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgIDIxODIxMzQgSnVsIDI1IDE1OjExIC4vc3JjL3ppcHMvdGlnaHR2bmMtMS4zZGV2N191bml4c3JjLnRhci5negotMzI3Nzc5MiAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgNzUzIEF1ZyAgMiAxMDowOSAuL3NyYy96aXBzL1JFQURNRQotMzI3Nzc4NiAgMzY0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgMzY4NjQwIEp1bCAyNyAxOTowNiAuL3NyYy96aXBzL3ZuY191bml4c3JjX3ZuY3ZpZXdlci5wYXRjaGVkLnRhcgotMzI3Nzc4NyAxOTk2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAyMDM3NzYwIEp1bCAzMSAyMzo0MiAuL3NyYy96aXBzL3N0dW5uZWwucGF0Y2hlZC50YXIKLTI5ODI4NDkgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBTZXAgMTAgMTQ6MzcgLi9zcmMvcGF0Y2hlcwotMjk4Mjg1MiAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAzNzUwIEZlYiAgNSAgMjAwNSAuL3NyYy9wYXRjaGVzL3RpZ2h0LXZuY3ZpZXdlci1hbHBoYWhhY2sucGF0Y2gKLTI5ODI4NTQgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTE0MyBKdWwgMjUgMTU6MjUgLi9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItZnVsbHNjcmVlbi5wYXRjaAotMjk4Mjg2NSAgICA4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA3NjMzIEp1bCAyNyAxOTowMSAuL3NyYy9wYXRjaGVzL3RpZ2h0LXZuY3ZpZXdlci1uZXdmYnNpemUucGF0Y2gKLTI5ODI5NTUgICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTUyOSBTZXAgMTAgMTI6MDcgLi9zcmMvcGF0Y2hlcy9fYnVuZGxlCi0yOTgyODc3ICAgIDQgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNzggSnVsIDI3IDE0OjQxIC4vc3JjL3BhdGNoZXMvX2dldHBhdGNoZXMKLTI5ODMwMTIgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNDA3MiBKdWwgMzEgMjI6NTkgLi9zcmMvcGF0Y2hlcy9zdHVubmVsLW1heGNvbm4ucGF0Y2gKLTI5ODI4NzggICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDExNyBKdWwgMjcgMTk6MDYgLi9zcmMvcGF0Y2hlcy9fdm5jcGF0Y2hhcHBsaWVkCi0yOTgyODgwICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAyMjMgQXVnIDI0IDEwOjExIC4vc3JjL3BhdGNoZXMvUkVBRE1FCi0yOTgyODUwICAgIDQgZHJ3eHIteHIteCAgIDggcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgSnVsIDI1IDE1OjIxIC4vc3JjL3ZuY191bml4c3JjCi0yOTgyODg1ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAzNTYgQXByIDMwICAyMDAyIC4vc3JjL3ZuY191bml4c3JjL0ltYWtlZmlsZQotMjk4Mjg4NiAgIDIwIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE4MDAwIEp1biAxMSAgMjAwMCAuL3NyYy92bmNfdW5peHNyYy9MSUNFTkNFLlRYVAotMjk4Mjg4NyAgIDEyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA4MzQxIEp1bCAgNCAgMjAwNSAuL3NyYy92bmNfdW5peHNyYy9SRUFETUUKLTI5ODI4ODggICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgOTY4MiBKdWwgIDQgIDIwMDUgLi9zcmMvdm5jX3VuaXhzcmMvdGlnaHR2bmMuc3BlYwotMjk4Mjg4OSAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgNDg2IEF1ZyAzMCAgMjAwMiAuL3NyYy92bmNfdW5peHNyYy92bmMteGNsaWVudHMucGF0Y2gKLTI5ODI4OTAgICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjA0MiBNYXIgMTkgIDIwMDIgLi9zcmMvdm5jX3VuaXhzcmMvdm5jaW5zdGFsbAotMjk4Mjg5MSAgIDE2IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE1MjM5IEp1bCAgNCAgMjAwNSAuL3NyYy92bmNfdW5peHNyYy92bmNzZXJ2ZXIKLTI5ODI4OTIgICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTcyNiBBdWcgMzAgIDIwMDIgLi9zcmMvdm5jX3VuaXhzcmMvdm5jc2VydmVyLmluaXQKLTI5ODI4OTMgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMzA3MCBBdWcgIDcgIDIwMDIgLi9zcmMvdm5jX3VuaXhzcmMvdm5jc2VydmVyLm1hbgotNDM1OTEyNyAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAyNyAxNjoyNSAuL3NyYy92bmNfdW5peHNyYy9jbGFzc2VzCi0yODUxNDEzICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgSnVsICA1ICAyMDA1IC4vc3JjL3ZuY191bml4c3JjL2luY2x1ZGUKLTI4NTE0MTQgICA0NCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICA0MzI5NiBNYXkgMjcgIDIwMDQgLi9zcmMvdm5jX3VuaXhzcmMvaW5jbHVkZS9yZmJwcm90by5oCi0yODUxNDE1ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDExNjYgSnVuIDExICAyMDAwIC4vc3JjL3ZuY191bml4c3JjL2luY2x1ZGUvdm5jYXV0aC5oCi0yODUxNDE2ICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgSnVsICA1ICAyMDA1IC4vc3JjL3ZuY191bml4c3JjL2xpYnZuY2F1dGgKLTI4NTE0MTcgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDE5OSBBcHIgMzAgIDIwMDIgLi9zcmMvdm5jX3VuaXhzcmMvbGlidm5jYXV0aC9JbWFrZWZpbGUKLTI4NTE0MTggICAxNiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxNTQ4NyBKdW4gMTEgIDIwMDAgLi9zcmMvdm5jX3VuaXhzcmMvbGlidm5jYXV0aC9kM2Rlcy5jCi0yODUxNDE5ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDE2MTggSnVuIDExICAyMDAwIC4vc3JjL3ZuY191bml4c3JjL2xpYnZuY2F1dGgvZDNkZXMuaAotMjg1MTQyMCAgICA4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA1ODc5IE1hciAgMSAgMjAwMyAuL3NyYy92bmNfdW5peHNyYy9saWJ2bmNhdXRoL3ZuY2F1dGguYwotMjg1MTQyMSAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAgNSAgMjAwNSAuL3NyYy92bmNfdW5peHNyYy92bmNjb25uZWN0Ci0yODUxNDIyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAxNjMgQXByIDMwICAyMDAyIC4vc3JjL3ZuY191bml4c3JjL3ZuY2Nvbm5lY3QvSW1ha2VmaWxlCi0yODUxNDIzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDExNjcgTm92IDEwICAyMDAwIC4vc3JjL3ZuY191bml4c3JjL3ZuY2Nvbm5lY3Qvdm5jY29ubmVjdC5jCi0yODUxNDI0ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDEwODMgRmViICA1ICAyMDAzIC4vc3JjL3ZuY191bml4c3JjL3ZuY2Nvbm5lY3Qvdm5jY29ubmVjdC5tYW4KLTI4NTE0MjUgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBKdWwgIDUgIDIwMDUgLi9zcmMvdm5jX3VuaXhzcmMvdm5jcGFzc3dkCi0yODUxNDI2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAyNTYgQXByIDMwICAyMDAyIC4vc3JjL3ZuY191bml4c3JjL3ZuY3Bhc3N3ZC9JbWFrZWZpbGUKLTI4NTE0MjcgICAgOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNzY4MSBNYXIgIDEgIDIwMDMgLi9zcmMvdm5jX3VuaXhzcmMvdm5jcGFzc3dkL3ZuY3Bhc3N3ZC5jCi0yODUxNDI4ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDMyMjIgTWFyICAxICAyMDAzIC4vc3JjL3ZuY191bml4c3JjL3ZuY3Bhc3N3ZC92bmNwYXNzd2QubWFuCi0yODUxNDI5ICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgQXVnICAzIDE5OjEwIC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlcgotMjg1MTQzMCAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxMDU3IE1hciAxMiAgMjAwMyAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvSW1ha2VmaWxlCi0yODUxNDMxICAgMTYgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTIzNzUgSnVsICA0ICAyMDA1IC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9SRUFETUUKLTI4NTE0MzIgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMzE5OCBGZWIgIDcgIDIwMDMgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL1ZuY3ZpZXdlcgotMjg1MTQzMyAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE0MTU5IEp1bCAgNCAgMjAwNSAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvYXJnc3Jlc291cmNlcy5jCi0yODUxNDM0ICAgIDggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDUzNjIgQXByICAxICAyMDAzIC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9jYXBzLmMKLTI4NTE0MzUgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjA3NCBBcHIgIDEgIDIwMDMgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL2NhcHMuaAotMjg1MTQzNiAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE1NTY4IEFwciAzMCAgMjAwMiAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvY29sb3VyLmMKLTI4NTE0MzcgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjI5NSBKdW4gMTEgIDIwMDAgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL2NvcnJlLmMKLTI4NTE0MzggICAxNiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxNDUwNCBKYW4gMTUgIDIwMDMgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL2N1cnNvci5jCi0yODUxNDM5ICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTE4MzIgTWF5IDI4ICAyMDA0IC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9kZXNrdG9wLmMKLTI4NTE0NDAgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjYyMSBPY3QgMjYgIDIwMDAgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL2RpYWxvZ3MuYwotMjg1MTQ0MSAgIDEyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDExNjcxIE9jdCAgOSAgMjAwMyAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvZnVsbHNjcmVlbi5jCi0yODUxNDQyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDM2MzkgSnVuIDExICAyMDAwIC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9oZXh0aWxlLmMKLTI4NTE0NDMgICAgOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNzQ2MyBKYW4gMTYgIDIwMDEgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL2xpc3Rlbi5jCi0yODUxNDQ0ICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDkxMjAgSmFuIDE1ICAyMDAzIC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9taXNjLmMKLTI4NTE0NDUgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjc0OSBKdW4gMTEgIDIwMDAgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3BvcHVwLmMKLTI4NTE0NDYgICA0MCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAzODkyMyBNYXIgMTEgIDIwMDQgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3JmYnByb3RvLmMKLTI4NTE0NDcgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjQxMSBKdW4gMTEgIDIwMDAgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3JyZS5jCi0yODUxNDQ4ICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDk5ODUgTWFyICAzICAyMDA0IC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci9zZWxlY3Rpb24uYwotMjg1MTQ0OSAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAyNDM5IEp1biAxMSAgMjAwMCAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvc2htLmMKLTI4NTE0NTAgICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgOTI1MyBKYW4gMTQgIDIwMDEgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3NvY2tldHMuYwotMjg1MTQ1MSAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE2MDY5IEFwciAzMCAgMjAwMiAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvdGlnaHQuYwotMjg1MTQ1MiAgICA4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA2Njk1IEp1bCAzMSAgMjAwMyAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvdHVubmVsLmMKLTI4NTE0NTMgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNDA0MCBKYW4gMTMgIDIwMDQgLi9zcmMvdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5jCi0yODUxNDU0ICAgIDggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDcyMzYgTWFyIDExICAyMDA0IC4vc3JjL3ZuY191bml4c3JjL3ZuY3ZpZXdlci92bmN2aWV3ZXIuaAotMjg1MTQ1NSAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE0NDc4IE1hciAxMSAgMjAwNCAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvdm5jdmlld2VyLm1hbgotMjg1MTQ1NiAgICA4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0NDM3IEphbiAxNiAgMjAwMSAuL3NyYy92bmNfdW5peHNyYy92bmN2aWV3ZXIvemxpYi5jCi0yOTgyODk0ICAgMzYgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMzQzNjkgSnVsICA1ICAyMDA1IC4vc3JjL3ZuY191bml4c3JjL1doYXRzTmV3Ci0yOTgyODk1ICAgODQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgODAzNjYgSnVsICA1ICAyMDA1IC4vc3JjL3ZuY191bml4c3JjL0NoYW5nZUxvZwotMjY3MDkzMyAgICA0IGRyd3hyLXhyLXggICA2IHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEF1ZyAgMiAwOTowMyAuL3NyYy9zdHVubmVsLTQuMTQKLTM2MjE1NzUgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBOb3YgIDIgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L2F1dG8KLTM2MjE1NzYgICA0NCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA0MzYwOSBBdWcgMTAgIDIwMDQgLi9zcmMvc3R1bm5lbC00LjE0L2F1dG8vY29uZmlnLmd1ZXNzCi0zNjIxNTc3ICAgMzIgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMzExNjAgQXVnIDEwICAyMDA0IC4vc3JjL3N0dW5uZWwtNC4xNC9hdXRvL2NvbmZpZy5zdWIKLTM2MjE1NzggICAxNiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxMzg2NiBBdWcgMTAgIDIwMDQgLi9zcmMvc3R1bm5lbC00LjE0L2F1dG8vZGVwY29tcAotMzYyMTU3OSAgICA4IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA3MTIyIEF1ZyAxMCAgMjAwNCAuL3NyYy9zdHVubmVsLTQuMTQvYXV0by9pbnN0YWxsLXNoCi0zNjIxNTgwICAxODQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxODQwMTkgQXVnIDEwICAyMDA0IC4vc3JjL3N0dW5uZWwtNC4xNC9hdXRvL2x0bWFpbi5zaAotMzYyMTU4MSAgIDEyIC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDEwMjY2IEF1ZyAxMCAgMjAwNCAuL3NyYy9zdHVubmVsLTQuMTQvYXV0by9taXNzaW5nCi0zNjIxNTgyICAgIDQgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDE5ODggQXVnIDEwICAyMDA0IC4vc3JjL3N0dW5uZWwtNC4xNC9hdXRvL21raW5zdGFsbGRpcnMKLTU0NTY3MjIgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBKdWwgMzEgMjI6NDcgLi9zcmMvc3R1bm5lbC00LjE0L3NyYwotNTQ1NjcyMyAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxNTk0IE9jdCAxNSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL01ha2VmaWxlLmFtCi01NDU2NzI0ICAgMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTkzMTQgT2N0IDI1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvTWFrZWZpbGUuaW4KLTU0NTY3MjUgICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjk1NCBBcHIgMjAgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9zdHVubmVsMy5pbgotNTQ1NjcyNyAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAyMzc2IERlYyAzMSAgMjAwNCAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL2Vudi5jCi01NDU2NzI4ICAgIDggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDc4NzggT2N0IDIxICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvY29tbW9uLmgKLTU0NTY3NzUgICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxMDg5MyBPY3QgMjcgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9wcm90b3R5cGVzLmgKLTU0NTY3NzYgICA0MCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAzNjkxNyBPY3QgMjQgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9jbGllbnQuYwotNTQ1Njc3NyAgIDEyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA5ODI3IFNlcCAyOCAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL2xvZy5jCi01NDU2Nzc4ICAgNDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgNDM3MjggT2N0IDIwICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvb3B0aW9ucy5jCi01NDU2Nzc5ICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDkxMzcgQXByIDExICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvcHJvdG9jb2wuYwotNTQ1Njc4MCAgIDIwIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE5MzM1IE9jdCAzMCAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL25ldHdvcmsuYwotNTQ1Njc4MSAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDEyOTQ3IEZlYiAyOCAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL3Jlc29sdmVyLmMKLTU0NTY3ODIgICAyOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyNTIxNiBPY3QgMjcgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9zc2wuYwotNTQ1Njc4MyAgIDEyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA5OTM1IE9jdCAxOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL3N0aHJlYWRzLmMKLTU0NTY3ODQgICAxNiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxNDA3NCBOb3YgIDIgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9zdHVubmVsLmMKLTU0NTY3ODUgICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgODI1NCBKdW4gMTMgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9wdHkuYwotNTQ1Njc4NiAgIDMyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI4NjgyIFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL2d1aS5jCi01NDU2Nzg3ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAyMjcgTm92ICA1ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvcmVzb3VyY2VzLmgKLTU0NTY3ODggICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTQ0MSBPY3QgMjEgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9yZXNvdXJjZXMucmMKLTU0NTY3ODkgICAgOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNDcxMCBKdWwgMTggIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L3NyYy9zdHVubmVsLmljbwotNTQ1Njc5MSAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgIDc2IEp1bCAxOCAgMjAwMiAuL3NyYy9zdHVubmVsLTQuMTQvc3JjL21ha2UuYmF0Ci01NDU2NzkyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDEwMDEgT2N0IDE1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9zcmMvTWFrZWZpbGUudzMyCi0zNjcwOTg5ICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgTm92ICAyICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC90b29scwotMzY3MDk5MCAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxNDQ4IFNlcCAxNCAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvdG9vbHMvTWFrZWZpbGUuYW0KLTM2NzA5OTEgICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxMjE3OCBPY3QgMjUgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3Rvb2xzL01ha2VmaWxlLmluCi0zNjcwOTkyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDE0MzYgU2VwIDIyICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9zdHVubmVsLmNvbmYtc2FtcGxlLmluCi0zNjcwOTkzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICA5NjYgT2N0IDI1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9zdHVubmVsLmluaXQuaW4KLTM2NzA5OTQgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTEyMSBKdWwgMTggIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L3Rvb2xzL2NhLmh0bWwKLTM2NzA5OTUgICAgNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTc5MyBKdWwgMTggIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L3Rvb2xzL2NhLnBsCi0zNjcwOTk2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICA0MDkgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9pbXBvcnRDQS5odG1sCi0zNjcwOTk3ICAgIDQgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAxMDUgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9pbXBvcnRDQS5zaAotMzY3MDk5OCAgICA0IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgMjIzIEFwciAyMyAgMjAwNCAuL3NyYy9zdHVubmVsLTQuMTQvdG9vbHMvc2NyaXB0LnNoCi0zNjcwOTk5ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDI2MTggT2N0IDIxICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9zdHVubmVsLnNwZWMKLTM2NzEwMDAgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMjk4OSBKdWwgIDYgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3Rvb2xzL3N0dW5uZWwubWFrCi0zNjcxMDAxICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDExNzUgU2VwICAxICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC90b29scy9zdHVubmVsLmNuZgotMzY3MTAwMiAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAzMjg1IE9jdCAyMSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvdG9vbHMvc3R1bm5lbC5uc2kKLTM2NzEwMDMgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTE0OCBTZXAgMjIgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L3Rvb2xzL3N0dW5uZWwuY29uZgotMjY3MDkzNCAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgNzI1IEF1ZyAxMiAgMjAwMiAuL3NyYy9zdHVubmVsLTQuMTQvUkVBRE1FCi0yNjcwOTM1ICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDg4MjQgT2N0IDI1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9jb25maWd1cmUuYWMKLTI2NzA5MzYgIDI0MCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgIDIzOTM0NyBPY3QgMjUgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L2FjbG9jYWwubTQKLTI2NzA5MzcgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTI3MyBTZXAgMTQgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L01ha2VmaWxlLmFtCi0yNjcwOTM4ICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjA4NzYgT2N0IDI1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9NYWtlZmlsZS5pbgotMjY3MDkzOSAgNzY4IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgNzgwMTAzIE9jdCAyNSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvY29uZmlndXJlCi0yNjcwOTQwICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgOTkgQXVnIDEyICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9BVVRIT1JTCi0yNjcwOTQxICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICA3ODggU2VwIDEzICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9DT1BZSU5HCi0yNjcwOTQyICAgMjggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjU2ODIgTm92ICAyICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9DaGFuZ2VMb2cKLTI2NzA5NDMgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTA2NiBBdWcgMTAgIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L0lOU1RBTEwKLTI2NzA5NDQgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDk1NSBBdWcgMTIgIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L05FV1MKLTI2NzA5NDUgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTQ2MSBKdWwgMjcgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L1RPRE8KLTI2NzA5NDYgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDIyMiBKdWwgMTggIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L1BPUlRTCi0yNjcwOTQ3ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAyNzAgQXVnICA5ICAyMDA0IC4vc3JjL3N0dW5uZWwtNC4xNC9CVUdTCi0yNjcxNDkxICAgMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTc5ODIgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9DT1BZUklHSFQuR1BMCi0yNjcxNDkyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAxOTkgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9DUkVESVRTCi0yNjcxNDkzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICA2ODcgSnVsIDIxICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9JTlNUQUxMLlczMgotNTY1MzQ2MiAgICA0IGRyd3hyLXhyLXggICA0IHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMCAxNzo0NiAuL3NyYy9zdHVubmVsLTQuMTQvZG9jCi01NjUzNDYzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDEwMDkgSmFuIDE1ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9kb2MvTWFrZWZpbGUuYW0KLTU2NTM0NjQgICAxMiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxMjE1MiBPY3QgMjUgIDIwMDUgLi9zcmMvc3R1bm5lbC00LjE0L2RvYy9NYWtlZmlsZS5pbgotNTY1MzQ2NSAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE2MzQxIFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwucG9kCi01NjUzNDY2ICAgMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTg4MjkgU2VwIDI5ICAyMDA1IC4vc3JjL3N0dW5uZWwtNC4xNC9kb2Mvc3R1bm5lbC5wbC5wb2QKLTU2NTM0NjcgICAyMCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxNzc5OCBEZWMgMjUgIDIwMDQgLi9zcmMvc3R1bm5lbC00LjE0L2RvYy9zdHVubmVsLmZyLnBvZAotNTY1MzQ2OCAgIDI0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDIzODg1IFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwuOAotNTY1MzQ2OSAgIDI4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI2NTM2IFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwucGwuOAotNTY1MzQ3MCAgIDI4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI0ODY0IEphbiAxNSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwuZnIuOAotNTY1MzQ3MSAgIDI4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI2MTI4IFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwuaHRtbAotNTY1MzQ3MiAgIDMyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI4NzUzIFNlcCAyOSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwucGwuaHRtbAotNTY1MzQ3MyAgIDI4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDI3MjA1IEphbiAxNSAgMjAwNSAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3N0dW5uZWwuZnIuaHRtbAotNDM0Mjc0MiAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAxOCAgMjAwMiAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL2VuCi00MzQyNzQzICAgMTIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDg0MTQgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9kb2MvZW4vVk5DX1N0dW5uZWxIT1dUTy5odG1sCi00MzQyNzQ0ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwNDUgSnVsIDE4ICAyMDAyIC4vc3JjL3N0dW5uZWwtNC4xNC9kb2MvZW4vdHJhbnNwcm94eS50eHQKLTQzNDI3NDUgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBKdWwgMTggIDIwMDIgLi9zcmMvc3R1bm5lbC00LjE0L2RvYy9wbAotNDM0Mjc0NiAgIDM2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDM2MzYwIEp1bCAxOCAgMjAwMiAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3BsL3R3b3J6ZW5pZV9jZXJ0eWZpa2F0b3cuaHRtbAotNDM0Mjc0NyAgICA4IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICA1MDY4IEp1bCAxOCAgMjAwMiAuL3NyYy9zdHVubmVsLTQuMTQvZG9jL3BsL2ZhcS5zdHVubmVsLTIuaHRtbAotMzY1MzgzNiAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzo0NCAuL3NyYy90bXAKLTMyNzc3ODggICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDMwMSBBdWcgIDIgMTA6MDUgLi9zcmMvUkVBRE1FCi0yODUxNDU3ICAgIDQgZHJ3eHIteHIteCAgMTIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgQXVnIDI5IDE2OjMyIC4vYmluCi0yMjYxOTMwICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgSnVsIDMxIDIzOjAwIC4vYmluL0xpbnV4Lmk2ODYKLTIyNjE5NjcgIDE5NiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDE5MzA3NiBKdWwgMzEgMjI6NTkgLi9iaW4vTGludXguaTY4Ni92bmN2aWV3ZXIKLTIyNjE5OTkgICA4MCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA3NzE0OCBKdWwgMzEgMjM6MDAgLi9iaW4vTGludXguaTY4Ni9zdHVubmVsCi01NTM4NjIyICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgU2VwIDEyIDIxOjI0IC4vYmluL3V0aWwKLTU1Mzg3NTkgICAxMiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxMjE0OCBTZXAgMTIgMjE6MjQgLi9iaW4vdXRpbC9zc192bmN2aWV3ZXIKLTU1Mzg3NjAgIDEzNiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDEzMjg1MyBTZXAgMTIgMjE6MTcgLi9iaW4vdXRpbC9zc3ZuYy50Y2wKLTU1Mzg2NDEgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDk4MSBBdWcgIDQgMDk6MjcgLi9iaW4vdXRpbC9zdHVubmVsLXNlcnZlci5jb25mCi0yODUxNzk0ICAgIDQgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDM1ODEgSnVsIDMxIDIzOjAwIC4vYmluL3Nzdm5jX2NtZAotMjg1MTU5MiAgICA0IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAzNzUyIEp1bCAzMSAyMzowMSAuL2Jpbi90aWdodHZuY3ZpZXdlcgotMjQyNTU5MCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzozMCAuL2Jpbi9MaW51eC5hbHBoYQotMjQyNTU5NSAgMTAwIC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDk3NTA0IEp1bCAzMSAyMzozMCAuL2Jpbi9MaW51eC5hbHBoYS9zdHVubmVsCi0yNDI1NTk2ICAyNzIgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAyNzQzMTIgSnVsIDMxIDIzOjI0IC4vYmluL0xpbnV4LmFscGhhL3ZuY3ZpZXdlcgotMzg4MzgwOCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzoyNCAuL2Jpbi9MaW51eC54ODZfNjQKLTM4ODM4MDkgICA4NCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA3Nzg5NiBKdWwgMzEgMjM6MjQgLi9iaW4vTGludXgueDg2XzY0L3N0dW5uZWwKLTM4ODM4MTAgIDExMiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDEwOTY1NiBKdWwgMzEgMjM6MjMgLi9iaW4vTGludXgueDg2XzY0L3ZuY3ZpZXdlcgotMzg4MzgxMSAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzoyNyAuL2Jpbi9GcmVlQlNELmkzODYKLTM4ODM4MTIgICA2OCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA2NDY2MCBKdWwgMzEgMjM6MjcgLi9iaW4vRnJlZUJTRC5pMzg2L3N0dW5uZWwKLTM4ODM4MTMgIDE4MCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDE3Njc5NiBKdWwgMzEgMjM6MjQgLi9iaW4vRnJlZUJTRC5pMzg2L3ZuY3ZpZXdlcgotMzY4NzE2NyAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzoyNyAuL2Jpbi9PcGVuQlNELmkzODYKLTM2ODcxNjQgICA3NiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA3MjI2MCBKdWwgMzEgMjM6MjcgLi9iaW4vT3BlbkJTRC5pMzg2L3N0dW5uZWwKLTM2ODcxNjUgIDE4MCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDE3OTAzNiBKdWwgMzEgMjM6MjQgLi9iaW4vT3BlbkJTRC5pMzg2L3ZuY3ZpZXdlcgotNDM1OTEyOCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzoyNyAuL2Jpbi9OZXRCU0QuaTM4NgotNDM1OTEyOSAgIDcyIC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDY5MDY0IEp1bCAzMSAyMzoyNyAuL2Jpbi9OZXRCU0QuaTM4Ni9zdHVubmVsCi00MzU5MTMwICAxNzYgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxNzI2MjQgSnVsIDMxIDIzOjI0IC4vYmluL05ldEJTRC5pMzg2L3ZuY3ZpZXdlcgotMjg1MTQ1OCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzoyNSAuL2Jpbi9MaW51eC5wcGM2NAotMjg1MTQ1OSAgIDc2IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDcyODU2IEp1bCAzMSAyMzoyNSAuL2Jpbi9MaW51eC5wcGM2NC9zdHVubmVsCi0yODUxNDYwICAxOTYgLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxOTYxMTIgSnVsIDMxIDIzOjI0IC4vYmluL0xpbnV4LnBwYzY0L3ZuY3ZpZXdlcgotMzA2NDc5NCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEp1bCAzMSAyMzo0NyAuL2Jpbi9TdW5PUy5zdW40dQotMzA2NDc5NSAgMTA4IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgMTA2MjYwIEp1bCAzMSAyMzo0NSAuL2Jpbi9TdW5PUy5zdW40dS92bmN2aWV3ZXIKLTMwNjQ3OTYgICA3NiAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgICA3MTc0OCBKdWwgMzEgMjM6NDcgLi9iaW4vU3VuT1Muc3VuNHUvc3R1bm5lbAotMjg1MTcxMSAgICA0IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxMzEwIEF1ZyAyOSAxNjoyOSAuL2Jpbi9zc3ZuYwotMjg1MTc5MyAgICA0IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgNjQwIEp1bCAzMSAxNzoyMiAuL2Jpbi8ubGlua2luCi0zMjkzOTQyICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgQXVnICAxIDIyOjE0IC4vYmluL3Byb2ZpbGVzCi0zMjc3NzkxICAgIDggLXJ3eHIteHIteCAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQ4MTQgSnVsIDMwIDE3OjU0IC4vYnVpbGQudW5peAotMzI3Nzc4NSAgIDIwIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE4MDQzIEF1ZyAgMSAgMjAwMSAuL0NPUFlJTkcKLTMyNzc4MjcgICAgOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgNzIyMiBTZXAgMTAgMTY6MDQgLi9SRUFETUUKLTUwNjM1NTMgICAgNCBkcnd4ci14ci14ICAgMyBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBKdWwgMjcgMTY6MzIgLi9tYW4KLTUwNjM1NTQgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBKdWwgMjcgMTY6MzMgLi9tYW4vbWFuMQotNTA2MzU1NiAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE0NDc4IEp1bCAyNyAxNjozMiAuL21hbi9tYW4xL3ZuY3ZpZXdlci4xCi01MDYzNTU3ICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjM4ODUgSnVsIDI3IDE2OjMzIC4vbWFuL21hbjEvc3R1bm5lbC4xCi01NTM4NjI0ICAgIDQgZHJ3eHIteHIteCAgIDQgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgU2VwICA2IDE2OjMwIC4vV2luZG93cwotNTUzODYzMyAyMzEyIC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAyMzYxOTIyIFNlcCAxMiAyMjoyNyAuL1dpbmRvd3Mvc3N2bmMuZXhlCi01NTM4NTc2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDIxNDkgQXVnICAyIDA5OjQyIC4vV2luZG93cy9SRUFETUUudHh0Ci0zMjkzOTQzICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgQXVnICAxIDIyOjE0IC4vV2luZG93cy9wcm9maWxlcwotNDYyMTEzNiAgICA0IGRyd3hyLXhyLXggICA1IHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IFNlcCAgNiAxNjozMCAuL1dpbmRvd3MvdXRpbAotNTA5NjIzNyAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IFNlcCAgMiAxNjowNiAuL1dpbmRvd3MvdXRpbC9lc291bmQKLTUwOTYyMzggIDE0OCAtcnctcnctcnctICAgMSBydW5nZSAgICBydW5nZSAgICAgIDE0NjQzMiBKdW4gMjYgIDIwMDQgLi9XaW5kb3dzL3V0aWwvZXNvdW5kL2N5Z2F1ZGlvZmlsZS5kbGwKLTUwOTYyMzkgICA2MCAtcnctcnctcnctICAgMSBydW5nZSAgICBydW5nZSAgICAgICA1MzI3MCBGZWIgMTkgIDIwMDMgLi9XaW5kb3dzL3V0aWwvZXNvdW5kL2N5Z2VzZC5kbGwKLTUwOTYyNDEgMTEzMiAtcnctcnctcnctICAgMSBydW5nZSAgICBydW5nZSAgICAgMTE1MzQxNyBNYXkgMjYgIDIwMDQgLi9XaW5kb3dzL3V0aWwvZXNvdW5kL2N5Z3dpbjEuZGxsCi01MDk2MjQyICAgNjggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgNjUzODUgRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2QuZXhlCi01MDk2MjQ4ICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjEyODIgRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2RjYXQuZXhlCi01MDk2MjQ5ICAgMzIgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMzIzMzAgRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2RjdGwuZXhlCi01MDk2MjUxICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjE0MjggRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2RmaWx0LmV4ZQotNTA5NjI1MiAgIDI0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDIyNjQzIEZlYiAxOSAgMjAwMyAuL1dpbmRvd3MvdXRpbC9lc291bmQvZXNkbG9vcC5leGUKLTUwOTYyNTMgICAyNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyMTI2NCBGZWIgMTkgIDIwMDMgLi9XaW5kb3dzL3V0aWwvZXNvdW5kL2VzZG1vbi5leGUKLTUwOTYyNTQgICAyOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyNDgzNSBGZWIgMTkgIDIwMDMgLi9XaW5kb3dzL3V0aWwvZXNvdW5kL2VzZHBsYXkuZXhlCi01MDk2MjU1ICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjEyODggRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2RyZWMuZXhlCi01MDk2MjU2ICAgMjggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjUxNTEgRmViIDE5ICAyMDAzIC4vV2luZG93cy91dGlsL2Vzb3VuZC9lc2RzYW1wbGUuZXhlCi01MDk2MjU4ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNTEgU2VwICAyIDE2OjA1IC4vV2luZG93cy91dGlsL2Vzb3VuZC9leGFtcGxlLmJhdAotNDYyMTE0NCAxMTMyIC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAxMTUzMDI0IE1hciAyMyAgMjAwNSAuL1dpbmRvd3MvdXRpbC9vcGVuc3NsLmV4ZQotNTUzODYyNiAxNTQ4IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAxNTc4Nzg3IE1hciAyMyAgMjAwNSAuL1dpbmRvd3MvdXRpbC9saWJlYXkzMi5kbGwKLTU1Mzg2MjkgIDYyNCAtcnd4ci14ci14ICAgMSBydW5nZSAgICBydW5nZSAgICAgIDYzMjIyNiBNYXIgMjMgIDIwMDUgLi9XaW5kb3dzL3V0aWwvbGlic3NsMzIuZGxsCi00NjIxMzEwICAxMjggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxMjY5NzYgU2VwICA0IDEwOjU2IC4vV2luZG93cy91dGlsL3BhZ2VhbnQuZXhlCi00NjIxMzExICAxNjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxNjM4NDAgU2VwICA0IDEwOjU3IC4vV2luZG93cy91dGlsL3B1dHR5Z2VuLmV4ZQotNTUzODYzMSAgIDc2IC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDczNzI4IEZlYiAyNiAgMjAwNiAuL1dpbmRvd3MvdXRpbC9zdHVubmVsLmV4ZQotNTUzODYyNSAgMzYwIC1yd3hyLXhyLXggICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgMzY0NTQ0IEp1bCAgNSAgMjAwNSAuL1dpbmRvd3MvdXRpbC92bmN2aWV3ZXIuZXhlCi00NjIxMTQzICAyNjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAyNjIxNDQgU2VwICAyIDIxOjE5IC4vV2luZG93cy91dGlsL3BsaW5rLmV4ZQotMzI5Mzk0NCAgICA0IGRyd3hyLXhyLXggICA4IHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IFNlcCAgNSAyMDo1NyAuL1dpbmRvd3MvdXRpbC9pbmZvCi0zMjkzOTQ1ICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgQXVnICAyIDA5OjQwIC4vV2luZG93cy91dGlsL2luZm8vdm5jdmlld2VyCi01NTM4NjI3ICAgMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTgzNDAgSnVsICA2ICAyMDA1IC4vV2luZG93cy91dGlsL2luZm8vdm5jdmlld2VyL0xJQ0VOQ0UudHh0Ci01NTM4NjI4ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDEyMzggSnVsICA2ICAyMDA1IC4vV2luZG93cy91dGlsL2luZm8vdm5jdmlld2VyL1JFQURNRS50eHQKLTMyOTQwMTUgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgICAyNCBBdWcgIDIgMDk6MzkgLi9XaW5kb3dzL3V0aWwvaW5mby92bmN2aWV3ZXIvbG9jYXRpb24udXJsCi0zMjk0MDE2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgMzggQXVnICAyIDA5OjM5IC4vV2luZG93cy91dGlsL2luZm8vdm5jdmlld2VyL2Rvd25sb2FkLnVybAotMzI5Mzk0NyAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEF1ZyAgMiAwOTozOCAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwKLTMyOTM5NDggICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgICA5OSBBdWcgMTIgIDIwMDIgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0FVVEhPUlMKLTMyOTM5NDkgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDc4OCBTZXAgMTMgIDIwMDIgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0NPUFlJTkcKLTMyOTM5NTAgICAyMCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxNzk4MiBKdWwgMTggIDIwMDIgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0NPUFlSSUdIVC5HUEwKLTMyOTM5NTEgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDE5OSBKdWwgMTggIDIwMDIgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0NSRURJVFMKLTMyOTM5NTIgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDY4NyBKdWwgMjEgIDIwMDUgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0lOU1RBTEwuVzMyCi0zMjkzOTUzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICA3MjUgQXVnIDEyICAyMDAyIC4vV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9SRUFETUUKLTMyOTM5NTQgICAyOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyNTY4MiBOb3YgIDIgIDIwMDUgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL0NoYW5nZUxvZwotMzI5Mzk1NSAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxMDY2IEF1ZyAxMCAgMjAwMiAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvSU5TVEFMTAotMzI5Mzk1NiAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgOTU1IEF1ZyAxMiAgMjAwMiAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvTkVXUwotMzI5Mzk1OCAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgMjIyIEp1bCAxOCAgMjAwMiAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvUE9SVFMKLTMyOTM5NTkgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTQ2MSBKdWwgMjcgIDIwMDUgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL1RPRE8KLTMyOTM5NjAgICAyOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyNjEyOCBTZXAgMjkgIDIwMDUgLi9XaW5kb3dzL3V0aWwvaW5mby9zdHVubmVsL3N0dW5uZWwuaHRtbAotMzI5Mzk2OSAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE0NjM4IEF1ZyAgMiAwOTozNyAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvZG93bmxvYWQuaHRtbAotMzI5NDAxMSAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAgIDQ3IEF1ZyAgMiAwOToxNSAuL1dpbmRvd3MvdXRpbC9pbmZvL3N0dW5uZWwvZG93bmxvYWQudXJsCi0zMjk0MDEyICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjE4MTUgQXVnICAyIDA5OjEzIC4vV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9sb2NhdGlvbi5odG1sCi0zMjk0MDEzICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNDYgQXVnICAyIDA5OjEzIC4vV2luZG93cy91dGlsL2luZm8vc3R1bm5lbC9sb2NhdGlvbi51cmwKLTMyOTM5NjEgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBBdWcgIDIgMDk6MzcgLi9XaW5kb3dzL3V0aWwvaW5mby9vcGVuc3NsCi0zMjkzOTY1ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNDcgQXVnICAyIDA5OjE1IC4vV2luZG93cy91dGlsL2luZm8vb3BlbnNzbC9kb3dubG9hZC51cmwKLTMyOTM5NjMgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgICA0NiBBdWcgIDIgMDk6MTMgLi9XaW5kb3dzL3V0aWwvaW5mby9vcGVuc3NsL2xvY2F0aW9uLnVybAotMzI5Mzk2NCAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAzNDg5IE5vdiAyOCAgMjAwNSAuL1dpbmRvd3MvdXRpbC9pbmZvL29wZW5zc2wvQ09QWVJJR0hULlNTTGVheQotMzI5Mzk2NyAgIDE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDE0NjM4IEF1ZyAgMiAwOTozNyAuL1dpbmRvd3MvdXRpbC9pbmZvL29wZW5zc2wvZG93bmxvYWQuaHRtbAotMzI5Mzk2MiAgIDI0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgIDIxODE1IEF1ZyAgMiAwOToxMyAuL1dpbmRvd3MvdXRpbC9pbmZvL29wZW5zc2wvbG9jYXRpb24uaHRtbAotMjI2MTgyNCAgICA0IGRyd3hyLXhyLXggICAyIHJ1bmdlICAgIHJ1bmdlICAgICAgICA0MDk2IEF1ZyAgMiAwOTozNiAuL1dpbmRvd3MvdXRpbC9pbmZvL3BsaW5rCi0zMjkzOTY2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDM1NDkgQXVnICAyIDA5OjM1IC4vV2luZG93cy91dGlsL2luZm8vcGxpbmsvbGljZW5jZS5odG1sCi0zMjkzOTY4ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNjUgQXVnICAyIDA5OjM1IC4vV2luZG93cy91dGlsL2luZm8vcGxpbmsvbGljZW5jZS51cmwKLTIyNjE4MjUgICAyOCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAyNDc0NCBBdWcgIDIgMDk6MzUgLi9XaW5kb3dzL3V0aWwvaW5mby9wbGluay9kb3dubG9hZC5odG1sCi0yMjYxODI2ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNjYgQXVnICAyIDA5OjM1IC4vV2luZG93cy91dGlsL2luZm8vcGxpbmsvZG93bmxvYWQudXJsCi0yMjI5MTI2ICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgU2VwICAzIDEyOjA5IC4vV2luZG93cy91dGlsL2luZm8vZXNvdW5kCi0yMjI5MTI3ICAgMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMTc5OTIgU2VwICAzIDEyOjA5IC4vV2luZG93cy91dGlsL2luZm8vZXNvdW5kL0NPUFlJTkcKLTIyMjkxMjggICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgICA0MCBTZXAgIDMgMTI6MDcgLi9XaW5kb3dzL3V0aWwvaW5mby9lc291bmQvZG93bmxvYWQudXJsCi0yMjI5MTI5ICAgMjggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjUyNjUgU2VwICAzIDEyOjA5IC4vV2luZG93cy91dGlsL2luZm8vZXNvdW5kL0NPUFlJTkcuTElCCi0yMjI5MTMwICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDIxNTMgU2VwICAzIDEyOjA5IC4vV2luZG93cy91dGlsL2luZm8vZXNvdW5kL0FVVEhPUlMKLTIyMjkxMzEgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgMTkzNiBTZXAgIDMgMTI6MDkgLi9XaW5kb3dzL3V0aWwvaW5mby9lc291bmQvUkVBRE1FCi0yMjI5MTMyICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAxNzggU2VwICAzIDEyOjA5IC4vV2luZG93cy91dGlsL2luZm8vZXNvdW5kL01BSU5UQUlORVJTCi0zMTEzODAzICAgIDQgZHJ3eHIteHIteCAgIDIgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDQwOTYgU2VwICA1IDIwOjU4IC4vV2luZG93cy91dGlsL2luZm8vbmV0Y2F0Ci0zMTEzODA0ICAgIDggLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgIDY4MzMgRGVjIDI3ICAyMDA0IC4vV2luZG93cy91dGlsL2luZm8vbmV0Y2F0L3JlYWRtZS50eHQKLTMxMTM4MDUgICAyMCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAxODAwOSBEZWMgMjcgIDIwMDQgLi9XaW5kb3dzL3V0aWwvaW5mby9uZXRjYXQvbGljZW5zZS50eHQKLTMwNjQ3OTAgICAgNCBkcnd4ci14ci14ICAgMiBydW5nZSAgICBydW5nZSAgICAgICAgNDA5NiBBdWcgIDIgMDk6NDAgLi9XaW5kb3dzL3V0aWwvdzk4Ci00NjIxMTM3ICAxMjAgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAxMTg1MjQgRmViIDI2ICAxOTk3IC4vV2luZG93cy91dGlsL3c5OC9raWxsLmV4ZQotNDYyMTEzOCAgMTE2IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgMTE0MjQwIEZlYiAyNiAgMTk5NyAuL1dpbmRvd3MvdXRpbC93OTgvdGxpc3QuZXhlCi0zMDY0Nzk3ICAgMjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgMjQ1NzYgQXByIDMwICAxOTk4IC4vV2luZG93cy91dGlsL3c5OC9SRUFETUUuRE9DCi0zMDY0Nzk5ICAgIDQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgICAgNzUgQXVnICAyIDA4OjU2IC4vV2luZG93cy91dGlsL3c5OC9sb2NhdGlvbi51cmwKLTQ2MjExNDAgICAgNCAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgICAgIDk4MSBBdWcgIDQgMDk6MjcgLi9XaW5kb3dzL3V0aWwvc3R1bm5lbC1zZXJ2ZXIuY29uZgotNDYyMTE0MiAgICA0IC1ydy1yLS1yLS0gICAxIHJ1bmdlICAgIHJ1bmdlICAgICAgICAxMTczIEF1ZyAgNCAwOToyNyAuL1dpbmRvd3MvdXRpbC9zdHVubmVsLWNsaWVudC5jb25mCi00NjIxMzEyICAgNjQgLXJ3LXItLXItLSAgIDEgcnVuZ2UgICAgcnVuZ2UgICAgICAgNjE0NDAgRGVjIDI5ICAyMDA0IC4vV2luZG93cy91dGlsL25ldGNhdC5leGUKLTU1Mzg2MDcgIDQxNiAtcnctci0tci0tICAgMSBydW5nZSAgICBydW5nZSAgICAgIDQyMTg4OCBTZXAgIDYgMTQ6MTQgLi9XaW5kb3dzL3V0aWwvcHV0dHkuZXhlCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvbWFuL21hbjEvc3N2bmMuMSBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9tYW4vbWFuMS9zc3ZuYy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM2MGRlLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9tYW4vbWFuMS9zc3ZuYy4xCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLSdcIiB0Ci0uXCIgKiogVGhlIGFib3ZlIGxpbmUgc2hvdWxkIGZvcmNlIHRibCB0byBiZSBhIHByZXByb2Nlc3NvciAqKgotLlwiIE1hbiBwYWdlIGZvciB0aGUgU1NWTkMgdm5jdmlld2VyCi0uXCIKLS5cIiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotLlwiCi0uXCIgWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0uXCIgTGljZW5zZSBhcyBzcGVjaWZpZWQgaW4gdGhlIGZpbGUgTElDRU5DRS5UWFQgdGhhdCBjb21lcyB3aXRoIHRoZQotLlwiIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlRIIHNzdm5jIDEgIkRlY2VtYmVyIDIwMDkiICIiICJTU1ZOQyIKLS5TSCBOQU1FCi1zc3ZuYyBcLSBhIEdVSSB3cmFwcGVyIGZvciBTU0wgYW5kIFNTSCBWTkMgY29ubmVjdGlvbnMuCi0uU0ggU1lOT1BTSVMKLS5CIHNzdm5jCi0uYnIKLS5CIHNzdm5jCi0uUkkgW1x8IGhvc3QgXHxdW1x8IDpkaXNwbGF5IFx8XQotLmJyCi0uQiBzc3ZuYwotLlJJIFtcfCBzYXZlZC1wcm9maWxlLW5hbWUgXHxdCi0uYnIKLS5CIHNzdm5jCi0uUkkgW1x8IG9wdGlvbnMgXHxdXCBbXHwgaG9zdC1vci1wcm9maWxlIFxdCi0uYnIKLS5CIHNzdm5jCi0uSVIgXC1jbWQKLS5SSSBbXHwgc3N2bmNfY21kLWFyZ3MgXHxdCi0uYnIKLS5CIHNzdm5jCi0uSVIgXC0taGVscAotLmJyCi0uU0ggREVTQ1JJUFRJT04KLS5CIHNzdm5jCi1pcyBhIHRjbC90ayBndWkgd3JhcHBlciB0aGF0IHJ1bnMgb24gVW5peCwgTWFjT1NYLCBhbmQgV2luZG93cy4KLUl0IHNldHMgdXAgYW4gU1NMIG9yIFNTSCB0dW5uZWwgdG8gdGhlIHJlbW90ZSBWTkMgU2VydmVyIGFuZCB0aGVuIGxhdW5jaGVzCi10aGUgVk5DIHZpZXdlciAoZWl0aGVyIHRoZSBvbmUgcHJvdmlkZWQgb3IgYW5vdGhlciBvbmUgdGhhdCB5b3UgaGF2ZQotc3BlY2lmaWVkKSB0byB1c2UgdGhhdCBlbmNyeXB0ZWQgdHVubmVsIHRvIGNvbm5lY3QgdG8gdGhlIFZOQyBTZXJ2ZXIuCi1UaGUgdXNlIG9mIFByb3hpZXMgYW5kIEdhdGV3YXlzIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb25zIGlzIGltcGxlbWVudGVkLiAKLQotT25jZSB5b3UgaGF2ZSBzdGFydGVkIHRoZSBTU1ZOQyBndWksIHlvdSBjYW4gY2xpY2sgb24gdGhlIGJ1dHRvbnMKLSJIZWxwIiwgIk9wdGlvbnMgLT4gSGVscCIsICJDZXJ0cyAtPiBIZWxwIiwgZXRjLiBmb3IgbXVjaCBpbmZvcm1hdGlvbgotb24gaG93IHRvIHVzZSBhbmQgY29uZmlndXJlIHRoZSB0b29sLgotCi1JbiBzaG9ydCwgeW91IHN1cHBseSBhIFZOQyBzZXJ2ZXIgImhvc3RuYW1lOmRpc3BsYXkiIGluIHRoZQotIlZOQyBIb3N0OkRpc3BsYXkiIGVudHJ5IGJveCBhbmQgdGhlbiBwcmVzcyB0aGUgIkNvbm5lY3QiIGJ1dHRvbiB0bwotY29ubmVjdCB0byB0aGUgc2VydmVyIHZpYSBTU0wgKHN0dW5uZWwpLiAgRS5nLiAiZmFyLWF3YXkuZWFzdDowIi4KLVBvcnQgbnVtYmVycyBhcmUgYWxzbyBhbGxvd2VkLCBlLmcuIGZhci1hd2F5LmVhc3Q6NTkwNS4KLQotT3Igc3VwcGx5IHVzZXJAaG9zdG5hbWU6ZGlzcGxheSBhbmQgY2xpY2sgb24gdGhlICJVc2UgU1NIIiBvcHRpb24sIHRoZW4KLXByZXNzIHRoZSAiQ29ubmVjdCIgYnV0dG9uIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciB2aWEgYW4gU1NIIHR1bm5lbC4KLUUuZy4gImZyZWRAZmFyLWF3YXkuZWFzdDowIi4KLQotTm90ZSBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBTU0wvU1NIIAotZW5jcnlwdGlvbiB0dW5uZWxzIGJ5IHVzaW5nIGEgdm5jOi8vIG9yIFZuYzovLyBwcmVmaXggYmVmb3JlCi1ob3N0OmRpc3BsYXkuICBTaGlmdCtDdHJsLUUgaXMgYSBzaG9ydC1jdXQgdG8gYWRkL3JlbW92ZSBpdC4KLVNlZSBhbHNvIHRoZSBcZkItbm9lbmNcZlIgb3B0aW9uIGJlbG93IGZvciB0aGUgJ05vIEVuY3J5cHRpb24nIGJ1dHRvbi4KLQotTm9ybWFsbHkgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gIFlvdSBzaW1wbHkKLXJ1biBcZkJzc3ZuY1xmUiBhbmQgdXNlIHRoZSBHVUkgdGhhdCBzdGFydHMgdXAuCi0KLUhvd2V2ZXIsIGFzIHNob3J0Y3V0cyB5b3UgY2FuIHN1cHBseSBhIFZOQyBob3N0OmRpc3BsYXkgKG9yIGhvc3Q6cG9ydCkKLW9uIHRoZSBjb21tYW5kIGxpbmUgdG8gY29ubmVjdCB0byBpbW1lZGlhdGVseSAodGhlIEdVSSBpcyBzdGFydGVkCi1hbmQgdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkKS4gIEZvciBleGFtcGxlLCAiXGZCc3N2bmMgZmFyLWF3YXkuZWFzdDowXGZSIgotSW5zdGVhZCBvZiBhICBob3N0OmRpc3BsYXksIHlvdSBjYW4gc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHNhdmVkIHByb2ZpbGUgdG8KLWF1dG9tYXRpY2FsbHkgbG9hZCB0aGF0IHByb2ZpbGUgYW5kIHRoZW4gY29ubmVjdCB0byBpdHMgc2VydmVyLiAgCi1Gb3IgZXhhbXBsZSAiXGZCc3N2bmMgZmFyXGZSIiwgaWYgeW91IG5hbWVkIHRoZSBwcm9maWxlICJmYXIiLgotWW91IGNhbiB1c2UgdGhlIFxmQi1wcm9maWxlc1xmUiBvcHRpb24gdG8gbGlzdCB0aGUgcHJvZmlsZXMgeW91IGhhdmUgc2F2ZWQuCi0KLVRoZSByZWxhdGVkIGNvbW1hbmRzIFxmQnNzaHZuY1xmUiBhbmQgXGZCdHN2bmNcZlIgc3RhcnQgdXAgdGhlIEdVSSBpbgotc2ltcGxpZmllZCBtb2RlczogU1NIIE9ubHkgTW9kZSwgYW5kIFRlcm1pbmFsIFNlcnZpY2VzIE1vZGUsIHJlc3BlY3RpdmVseS4KLVNlZSBiZWxvdyBhbmQgdGhlIGFwcGxpY2F0aW9uIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVzLgotCi1Zb3UgY2FuIGFsc28gcGxhY2UgY2VydGFpbiBzZXR0aW5ncyBpbiB5b3VyIH4vLnNzdm5jcmMsIHNlZSB0aGUKLVNTVk5DIEhlbHAgcGFuZWwgKCdUaXBzJykgZm9yIG1vcmUgaW5mby4KLQotVGhlIFxmQi1jbWRcZlIgb3B0aW9uIGRvZXMgbm90IHN0YXJ0IHRoZSBHVUksIGl0IHJ1bnMgdGhlIGNvbW1hbmQKLWxpbmUgdXRpbGl0eSBcZkJzc3ZuY19jbWRcZlIgZGlyZWN0bHkgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotXGZCc3N2bmNfY21kXGZSIGNhbiBsYXVuY2ggdGhlIHZpZXdlciBkaXJlY3RseSAoXGZCLXZpZXdlciAuLi5cZlIpCi1vciwgYnkgZGVmYXVsdCwgdGhlIFxmQnNzX3ZuY3ZpZXdlclxmUiBTU0wvU1NIIHR1bm5lbCB3cmFwcGVyIHNjcmlwdC4KLVNlZSBpdHMgaGVscCBvdXRwdXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVRoZXJlIGFyZSBhbHNvIHNvbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMgZGVzY3JpYmVkIGFzIGZvbGxvd3MuCi0uU0ggT1BUSU9OUwotLlRQCi1cZkJcLWhlbHBcZlIsIFxmQlwtaFxmUgotUHJpbnRzIG91dCB0byB0aGUgdGVybWluYWwgYSBicmllZiBkZXNjcmlwdGlvbiBhbmQgdGhlIG9wdGlvbnMuCi0uVFAKLVxmQlwtLWhlbHBcZlIKLVN0YXJ0cyB1cCB0aGUgR1VJIGFzIHRob3VnaCB0aGUgJ0hlbHAnIGJ1dHRvbiB3YXMgcHJlc3NlZCB0byBzaG93IHRoZQotbWFpbiBIZWxwIHBhbmVsLgotLlRQCi1cZkJcLWNtZFxmUiBcZklbc3N2bmNfY21kLWFyZ3NdXGZSCi1MYXVuY2ggdGhlIHNzdm5jX2NtZCB1dGlsaXR5IGNvbW1hbmQgZGlyZWN0bHkgKG5vIEdVSSkgd2l0aCB0aGUgZ2l2ZW4KLWFyZ3VtZW50cyAoZm9yIHVzZSB3aGVuIHNzdm5jX2NtZCBpcyBub3QgaW4gb25lJ3MgUEFUSC4pIElmIG5laXRoZXIKLXNzdm5jX2NtZCBub3Igc3N2bmN2aWV3ZXIgaXMgaW4gUEFUSCwgb25lIGNhbiBsYXVuY2ggdGhlIHZpZXdlcgotZGlyZWN0bHkgdmlhOiBzc3ZuYyAtY21kIC12aWV3ZXIgW3ZpZXdlci1hcmdzXQotLlRQCi1cZkJcLXByb2ZpbGVzXGZSCi1MaXN0IHRoZSBzYXZlZCBTU1ZOQyBwcm9maWxlcyB5b3UgaGF2ZSBjcmVhdGVkLiAgQSBwcm9maWxlCi1pcyBhIGRlc3RpbmF0aW9uIGhvc3Qgd2l0aCBzcGVjaWZpYyBwYXJhbWV0ZXIgc2V0dGluZ3MuCi0uVFAKLVxmQlwtbGlzdFxmUgotU2FtZSBhcyBcZkJcLXByb2ZpbGVzXGZSCi0uVFAKLVxmQlwtc3NoXGZSCi1TdGFydCBpbiAiU1NIIE9ubHkgTW9kZSIuICBObyBTU0wgYXNwZWN0cyBhcmUgc2hvd24uCi1TYW1lIGFzIHJ1bm5pbmcgdGhlIGNvbW1hbmQgXGZCc3Nodm5jXGZSCi0uVFAKLVxmQlwtdHNcZlIKLVN0YXJ0IGluICJUZXJtaW5hbCBTZXJ2aWNlcyBNb2RlIi4gIFRoaXMgaXMgbGlrZSAiU1NIIE9ubHkgTW9kZSIsIGJ1dAotc2ltcGxlciBhbmQgYXNzdW1lcyBcZkJ4MTF2bmNcZlIgaXMgYXZhaWxhYmxlIG9uIHRoZSByZW1vdGUgc2lkZQotdG8gc3RhcnQgYW5kIG1hbmFnZSBYIGFuZCBWTkMgc2Vzc2lvbnMuCi1TYW1lIGFzIHJ1bm5pbmcgdGhlIGNvbW1hbmQgXGZCdHN2bmNcZlIKLS5UUAotXGZCXC10c29cZlIKLVNhbWUgYXMgXGZCLXRzXGZSICJUZXJtaW5hbCBTZXJ2aWNlcyBNb2RlIiwgaG93ZXZlciBuZXZlciBsZXQgdGhlCi11c2VyIGxlYXZlIHRoaXMgbW9kZSAobm8gYnV0dG9uIHRvIHN3aXRjaCBtb2RlcyBpcyBwcm92aWRlZC4pCi1TYW1lIGFzIFNTVk5DX1RTX0FMV0FZUz0xLgotLlRQCi1cZkJcLXNzbFxmUgotRm9yY2UgdGhlIGZ1bGwgR1VJIE1vZGU6IGJvdGggU1NMIGFuZCBTU0guICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotU2FtZSBhcyBcZkItc3NcZlIuCi0uVFAKLVxmQlwtbnZcZlIKLVRvZ2dsZSB0aGUgIlZlcmlmeSBBbGwgQ2VydHMiIGJ1dHRvbiB0byBiZSBvZmYgYXQgc3RhcnR1cC4KLS5UUAotXGZCXC1udmJcZlIKLU5ldmVyIHNob3cgdGhlICJWZXJpZnkgQWxsIENlcnRzIiBidXR0b24uCi1TYW1lIGFzIFNTVk5DX05PX1ZFUklGWV9BTExfQlVUVE9OPTEuCi0uVFAKLVxmQlwtYmlnZ2VyXGZSCi1NYWtlIHRoZSBQcm9maWxlIFNlbGVjdGlvbiBEaWFsb2cgd2luZG93IGJpZ2dlci4KLVNhbWUgYXMgU1NWTkNfQklHR0VSX0RJQUxPRz0xLgotLlRQCi1cZkJcLW5vZW5jXGZSCi1TdGFydCBvZmYgaW4gYSBtb2RlIHdoZXJlIGEgJ05vIEVuY3J5cHRpb24nIGNoZWNrIGJ1dHRvbiBpcyBwcmVzZW50LgotWW91IGNhbiB0b2dnbGUgdGhlIG1vZGUgd2l0aCBDdHJsLUUuCi1TYW1lIGFzIFNTVk5DX0RJU0FCTEVfRU5DUllQVElPTl9CVVRUT049MS4gT3IgXGZJbm9lbmM9MVxmUiBpbiB+Ly5zc3ZuY3JjLgotU2VsZWN0aW5nIG5vIGVuY3J5cHRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHZuYzovLyBhbmQgVm5jOi8vIHByZWZpeGVzCi1kZXNjcmliZWQgYmVsb3cuICBUaGUgXGZCXC1ub2VuY1xmUiBtb2RlIGlzIG5vdyB0aGUgZGVmYXVsdCwgdXNlIFxmQi1lbmNcZlIKLW9yIFxmSW5vZW5jPTBcZlIgZm9yIHRoZSBvcHBvc2l0ZSBiZWhhdmlvci4KLS5UUAotXGZCXC1raWxsc3R1bm5lbFxmUgotT24gV2luZG93cywgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdGhlIFNUVU5ORUwgcHJvY2VzcyB3aGVuIHRoZSB2aWV3ZXIKLWV4aXRzIGluc3RlYWQgb2YgcHJvbXB0aW5nIHlvdSAoc2FtZSBhcyBcZklraWxsc3R1bm5lbD0xXGZSIGluIHNzdm5jX3JjIG9yCi10b2dnbGUgaW4gT3B0aW9ucyBtZW51KQotLlRQCi1cZkJcLW5va2lsbHN0dW5uZWxcZlIKLU9uIFdpbmRvd3MsIGRpc2FibGUgXGZCLWtpbGxzdHVubmVsXGZSIG1vZGUuCi1TYW1lIGFzIFxmSWtpbGxzdHVubmVsPTBcZlIgaW4gc3N2bmNfcmMgb3IKLXRvZ2dsZSBpbiBPcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgXGZCLWtpbGxzdHVubmVsXGZSIG1vZGUgaXMgbm93IHRoZSBkZWZhdWx0LgotLlRQCi1cZkJcLW15Y2VydFxmUiBcZkkvcGF0aC90by9teWNlcnQucGVtXGZSCi1TZXQgdGhlIGRlZmF1bHQgIk15Q2VydCIgdG8gYmUgXGZJL3BhdGgvdG8vbXljZXJ0LnBlbVxmUi4KLVNhbWUgYXMgXGZCLWNlcnRcZlIuCi1JZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgfi8udm5jL2NlcnRzIGlzIHByZWZpeGVkIGFuZCB0cmllZC4KLVlvdSBjYW4gYWxzbyBzZXQgXGZJbXljZXJ0PS9wYXRoL3RvL215Y2VydC5wZW1cZlIgaW4gfi8uc3N2bmNyYy4KLS5UUAotXGZCXC1jYWNlcnRcZlIgXGZJL3BhdGgvdG8vY2FjZXJ0LmNydFxmUgotU2V0IHRoZSBkZWZhdWx0ICJTZXJ2ZXJDZXJ0IiB0byBiZSBcZkkvcGF0aC90by9jYWNlcnQuY3J0XGZSLgotU2FtZSBhcyBcZkItY2FcZlIuCi1JZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgfi8udm5jL2NlcnRzIGlzIHByZWZpeGVkIGFuZCB0cmllZC4KLVlvdSBjYW4gYWxzbyBzZXQgXGZJY2FjZXJ0PS9wYXRoL3RvL2NhY2VydC5jcnRcZlIgaW4gfi8uc3N2bmNyYy4KLS5UUAotXGZCXC1jcmxcZlIgXGZJL3BhdGgvdG8vbXljcmwucGVtXGZSCi1TZXQgdGhlIGRlZmF1bHQgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IHRvIGJlIFxmSS9wYXRoL3RvL215Y3JsLnBlbVxmUi4KLUlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB+Ly52bmMvY2VydHMgaXMgcHJlZml4ZWQgYW5kIHRyaWVkLgotWW91IGNhbiBhbHNvIHNldCBcZkljcmw9L3BhdGgvdG8vbXljcmwucGVtXGZSIGluIH4vLnNzdm5jcmMuCi0uU0ggVVJMIE5PVEFUSU9OCi1IZXJlIGFyZSBhbGwgb2Ygb3VyIFVSTC1saWtlIHByZWZpeGVzIHRoYXQgeW91IGNhbiBwdXQgaW4gZnJvbnQgb2YKLWhvc3Q6ZGlzcGxheSAob3IgaG9zdDpwb3J0KTogCi0KLUZvciBTU0w6ICB2bmNzOi8vIHZuY3NzbDovLyBhbmQgdm5jK3NzbDovLwotCi1Gb3IgU1NIOiAgdm5jc3NoOi8vIGFuZCB2bmMrc3NoOi8vCi0KLUZvciBObyBFbmNyeXB0aW9uOiAgdm5jOi8vIGFuZCBWbmM6Ly8KLQotRXhhbXBsZXM6Ci0KLVRvIHF1aWNrbHkgbWFrZSBhbiBTU0wgY29ubmVjdGlvbjogXGZCc3N2bmMgdm5jczovL3Nub29weS5jb206MFxmUgotCi1UbyBxdWlja2x5IG1ha2UgYW4gU1NIIGNvbm5lY3Rpb246IFxmQnNzdm5jIHZuYytzc2g6Ly9mcmVkQHNub29weS5jb206MFxmUgotCi1UbyBxdWlja2x5IG1ha2UgYSBkaXJlY3QgY29ubmVjdGlvbjogXGZCc3N2bmMgVm5jOi8vc25vb3B5LmNvbTowXGZSCi0KLVRoZSBhYm92ZSB3aWxsIGFsc28gd29yayBpbiB0aGUgIlZOQyBIb3N0OkRpc3BsYXkiIGVudHJ5IGJveCBpbiB0aGUgR1VJLgotUHJlc3MgdGhlICJDb25uZWN0IiBidXR0b24gYWZ0ZXIgZW50ZXJpbmcgdGhlbS4KLQotVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2bmM6Ly8gYW5kIFZuYzovLyBpcyB0aGF0IHRoZSBsYXR0ZXIgb25lIHdpbGwgbm90Ci1wcm9tcHQgeW91IHdoZXRoZXIgeW91IHJlYWxseSB3YW50IHRvIG1ha2UgYW4gdW5lbmNyeXB0ZWQgY29ubmVjdGlvbgotb3Igbm90LgotLlNIIEZJTEVTCi1Zb3VyIFNTVk5DIHZuYyBwcm9maWxlcyBhcmUgc3RvcmVkIGluIHRoZSBcZkIkSE9NRS8udm5jL3Byb2ZpbGVzXGZSCi1kaXJlY3RvcnkuICBUaGV5IGVuZCBpbiBzdWZmaXggXGZCLnZuY1xmUgotCi1Zb3VyIFNTVk5DIHZuYyBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYXJlIHN0b3JlZCBpbiB0aGUgXGZCJEhPTUUvLnZuYy9jZXJ0c1xmUgotZGlyZWN0b3J5LiAgVGhleSB0eXBpY2FsbHkgZW5kIGluIFxmQi5wZW1cZlIgKGJvdGggY2VydGlmaWNhdGUgYW5kCi1wcml2YXRlIGtleSkgb3IgXGZCLmNydFxmUiAoY2VydGlmaWNhdGUgb25seSkuCi0KLVlvdSBjYW4gcHV0IGEgZmV3IGdsb2JhbCBwYXJhbWV0ZXJzIChlLmcuIG1vZGU9c3Nodm5jKSBpbiB5b3VyCi1cZkIkSE9NRS8uc3N2bmNyY1xmUiBmaWxlIChcZkJzc3ZuY19yY1xmUiBvbiBXaW5kb3dzKTsgc2VlIHRoZQotYXBwbGljYXRpb24gSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotLlNIIEZPTlRTCi0KLVRoZSBmb2xsb3dpbmcgaXMgZnJvbSBUaXAgMTggaW4gdGhlIEhlbHAgcGFuZWwuCi0KLUZvbnRzOiBUbyBjaGFuZ2UgdGhlIHRrIGZvbnRzLCBzZXQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1iZWZvcmUgc3RhcnRpbmcgdXAgc3N2bmM6IFNTVk5DX0ZPTlRfREVGQVVMVCBhbmQgU1NWTkNfRk9OVF9GSVhFRC4KLUZvciBleGFtcGxlOgotCi0lIGVudiBTU1ZOQ19GT05UX0RFRkFVTFQ9J2hlbHZldGljYSAtMjAgYm9sZCcgc3N2bmMKLQotJSBlbnYgU1NWTkNfRk9OVF9GSVhFRD0nY291cmllciAtMTQnIHNzdm5jCi0KLW9yIHNldCBib3RoIG9mIHRoZW0gYXQgb25jZS4KLQotVG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QsIHlvdSBjYW4gYWxzbwotc2V0IHBhcmFtZXRlcnMgaW4geW91ciB+Ly5zc3ZuY3JjIGZpbGUsIGZvciBleGFtcGxlOgotCi1mb250X2RlZmF1bHQ9aGVsdmV0aWNhIC0yMCBib2xkCi0KLWZvbnRfZml4ZWQ9Y291cmllciAtMTQKLQotLlNIIFNFRSBBTFNPCi1cZkJzc3ZuY3ZpZXdlclxmQigxKSwgXGZCdm5jdmlld2VyXGZSKDEpLCBcZkJzdHVubmVsXGZSKDgpLCBcZkJzc2hcZlIoMSksIFxmQngxMXZuY1xmUigxKSwgXGZCdm5jc2VydmVyXGZSKDEpIAotaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYyBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3Nzdm5jLmh0bWwKLS5TSCBBVVRIT1JTCi1LYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiB3cm90ZSB0aGUgU1NWTkMgZ3VpICh0Y2wvdGspIGFuZAotYXNzb2NpYXRlZCB3cmFwcGVyIHNjcmlwdHMsIGFuZCBhZGRlZCBmZWF0dXJlcyB0byB0aGUgdW5peCB2bmN2aWV3ZXIKLXNvdXJjZSBjb2RlLiAKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9tYW4vbWFuMS9zc3ZuY3ZpZXdlci4xIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL21hbi9tYW4xL3Nzdm5jdmlld2VyLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZmM3YWUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL21hbi9tYW4xL3Nzdm5jdmlld2VyLjEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjkgKzAsMCBAQAotJ1wiIHQKLS5cIiAqKiBUaGUgYWJvdmUgbGluZSBzaG91bGQgZm9yY2UgdGJsIHRvIGJlIGEgcHJlcHJvY2Vzc29yICoqCi0uXCIgTWFuIHBhZ2UgZm9yIFggdm5jdmlld2VyCi0uXCIKLS5cIiBDb3B5cmlnaHQgKEMpIDE5OTggTWFyY3VzLkJyaW5rbWFubkBydWhyLXVuaS1ib2NodW0uZGUKLS5cIiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBSZWQgSGF0LCBJbmMuCi0uXCIgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQ29uc3RhbnRpbiBLYXBsaW5za3kgPGNvbnN0QGNlLmNjdHB1LmVkdS5ydT4KLS5cIiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotLlwiCi0uXCIgWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0uXCIgTGljZW5zZSBhcyBzcGVjaWZpZWQgaW4gdGhlIGZpbGUgTElDRU5DRS5UWFQgdGhhdCBjb21lcyB3aXRoIHRoZQotLlwiIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlRIIHNzdm5jdmlld2VyIDEgIkFwcmlsIDIwMTAiICIiICJTU1ZOQyIKLS5TSCBOQU1FCi1zc3ZuY3ZpZXdlciBcLSBhbiBYIHZpZXdlciBjbGllbnQgZm9yIFZOQwotLlNIIFNZTk9QU0lTCi0uQiBzc3ZuY3ZpZXdlcgotLlJJIFtcfCBvcHRpb25zIFx8XQotLlJJIFtcfCBob3N0IFx8XVtcfCA6ZGlzcGxheSBcfF0KLS5icgotLkIgc3N2bmN2aWV3ZXIKLS5SSSBbXHwgb3B0aW9ucyBcfF0KLS5SSSBbXHwgaG9zdCBcfF1bXHwgOjpwb3J0IFx8XQotLmJyCi0uQiBzc3ZuY3ZpZXdlcgotLlJJIFtcfCBvcHRpb25zIFx8XQotLlJJIGV4ZWM9W1x8IGNtZCthcmdzLi4uIFx8XQotLmJyCi0uQiBzc3ZuY3ZpZXdlcgotLlJJIFtcfCBvcHRpb25zIFx8XQotLlJJIGZkPW4KLS5icgotLkIgc3N2bmN2aWV3ZXIKLS5SSSBbXHwgb3B0aW9ucyBcfF0KLS5SSSAvcGF0aC90by91bml4L3NvY2tldAotLmJyCi0uQiBzc3ZuY3ZpZXdlcgotLlJJIFtcfCBvcHRpb25zIFx8XQotLklSIFwtbGlzdGVuCi0uUkkgW1x8IGRpc3BsYXkgXHxdCi0uYnIKLS5CIHNzdm5jdmlld2VyCi0uSVIgXC1oZWxwCi0uYnIKLS5TSCBERVNDUklQVElPTgotLkIgc3N2bmN2aWV3ZXIKLWlzIGFuIFh0XC1iYXNlZCBjbGllbnQgYXBwbGljYXRpb24gZm9yIHRoZSBWTkMgKFZpcnR1YWwgTmV0d29yawotQ29tcHV0aW5nKSBzeXN0ZW0uIEl0IGNhbiBjb25uZWN0IHRvIGFueSBWTkNcLWNvbXBhdGlibGUgc2VydmVyIHN1Y2gKLWFzIFxmQlh2bmNcZlIsIFdpblZOQywgb3IgXGZCeDExdm5jXGZSLCBhbGxvd2luZyB5b3UgdG8gY29udHJvbCBkZXNrdG9wIGVudmlyb25tZW50Ci1vZiBhIGRpZmZlcmVudCBtYWNoaW5lLgotCi1zc3ZuY3ZpZXdlciBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mIHRoZSB0aWdodHZuYyB1bml4IHZpZXdlciB0aGF0IGNhbgotdGFrZSBhZHZhbnRhZ2Ugb2YgZmVhdHVyZXMgaW4gdGhlIFxmQngxMXZuY1xmUiBhbmQgVWx0cmFWTkMgVk5DIHNlcnZlcnMuCi1TZWUgYmVsb3cgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmZWF0dXJlcy4KLQotWW91IGNhbiB1c2UgRjggdG8gZGlzcGxheSBhIHBvcFwtdXAgdXRpbGl0eSBtZW51LiBQcmVzcyBGOCB0d2ljZSB0bwotcGFzcyBzaW5nbGUgRjggdG8gdGhlIHJlbW90ZSBzaWRlLgotLlNIIE9QVElPTlMKLS5UUAotXGZCXC1oZWxwXGZSCi1QcmludHMgYSBzaG9ydCB1c2FnZSBub3RpY2UgdG8gc3RkZXJyLgotLlRQCi1cZkJcLWxpc3RlblxmUgotTWFrZSB0aGUgdmlld2VyIGxpc3RlbiBvbiBwb3J0IDU1MDArXGZJZGlzcGxheVxmUiBmb3IgcmV2ZXJzZQotY29ubmVjdGlvbnMgZnJvbSBhIHNlcnZlci4gV2luVk5DIHN1cHBvcnRzIHJldmVyc2UgY29ubmVjdGlvbnMgdXNpbmcKLXRoZSAiQWRkIE5ldyBDbGllbnQiIG1lbnUgb3B0aW9uLCBvciB0aGUgXC1jb25uZWN0IGNvbW1hbmQgbGluZQotb3B0aW9uLiBcZkJYdm5jXGZSIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIGhlbHBlciBwcm9ncmFtCi1cZkJ2bmNjb25uZWN0XGZSLgotLlRQCi1cZkJcLXZpYVxmUiBcZklnYXRld2F5XGZSCi1BdXRvbWF0aWNhbGx5IGNyZWF0ZSBlbmNyeXB0ZWQgVENQIHR1bm5lbCB0byB0aGUgXGZJZ2F0ZXdheVxmUiBtYWNoaW5lCi1iZWZvcmUgY29ubmVjdGlvbiwgY29ubmVjdCB0byB0aGUgXGZJaG9zdFxmUiB0aHJvdWdoIHRoYXQgdHVubmVsCi0oVGlnaHRWTkNcLXNwZWNpZmljKS4gQnkgZGVmYXVsdCwgdGhpcyBvcHRpb24gaW52b2tlcyBTU0ggbG9jYWwgcG9ydAotZm9yd2FyZGluZywgYXNzdW1pbmcgdGhhdCBTU0ggY2xpZW50IGJpbmFyeSBjYW4gYmUgYWNjZXNzZWQgYXMKLS91c3IvYmluL3NzaC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhlIFxmQlwtdmlhXGZSIG9wdGlvbiwgdGhlIGhvc3QKLW1hY2hpbmUgbmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIGtub3duIHRvIHRoZSBnYXRld2F5IG1hY2hpbmUsIGUuZy4gCi0ibG9jYWxob3N0IiBkZW5vdGVzIHRoZSBcZklnYXRld2F5XGZSLCBub3QgdGhlIG1hY2hpbmUgd2hlcmUgdm5jdmlld2VyCi13YXMgbGF1bmNoZWQuIFNlZSB0aGUgRU5WSVJPTk1FTlQgc2VjdGlvbiBiZWxvdyBmb3IgdGhlIGluZm9ybWF0aW9uIG9uCi1jb25maWd1cmluZyB0aGUgXGZCXC12aWFcZlIgb3B0aW9uLgotLlRQCi1cZkJcLXNoYXJlZFxmUgotV2hlbiBjb25uZWN0aW5nLCBzcGVjaWZ5IHRoYXQgYSBzaGFyZWQgY29ubmVjdGlvbiBpcyByZXF1ZXN0ZWQuIEluCi1UaWdodFZOQywgdGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlLCBhbGxvd2luZyB5b3UgdG8gc2hhcmUgdGhlIGRlc2t0b3AKLXdpdGggb3RoZXIgY2xpZW50cyBhbHJlYWR5IHVzaW5nIGl0LgotLlRQCi1cZkJcLW5vc2hhcmVkXGZSCi1XaGVuIGNvbm5lY3RpbmcsIHNwZWNpZnkgdGhhdCB0aGUgc2Vzc2lvbiBtYXkgbm90IGJlIHNoYXJlZC4gVGhpcwotd291bGQgZWl0aGVyIGRpc2Nvbm5lY3Qgb3RoZXIgY29ubmVjdGVkIGNsaWVudHMgb3IgcmVmdXNlIHlvdXIKLWNvbm5lY3Rpb24sIGRlcGVuZGluZyBvbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0uVFAKLVxmQlwtdmlld29ubHlcZlIKLURpc2FibGUgdHJhbnNmZXIgb2YgbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cyBmcm9tIHRoZSBjbGllbnQgdG8gdGhlCi1zZXJ2ZXIuCi0uVFAKLVxmQlwtZnVsbHNjcmVlblxmUgotU3RhcnQgaW4gZnVsbFwtc2NyZWVuIG1vZGUuIFBsZWFzZSBiZSBhd2FyZSB0aGF0IG9wZXJhdGluZyBpbgotZnVsbFwtc2NyZWVuIG1vZGUgbWF5IGNvbmZ1c2UgWCB3aW5kb3cgbWFuYWdlcnMuIFR5cGljYWxseSwgc3VjaAotY29uZmxpY3RzIGNhdXNlIGluY29ycmVjdCBoYW5kbGluZyBvZiBpbnB1dCBmb2N1cyBvciBtYWtlIHRoZSB2aWV3ZXIKLXdpbmRvdyBkaXNhcHBlYXIgbXlzdGVyaW91c2x5LiBTZWUgdGhlIGdyYWJLZXlib2FyZCBzZXR0aW5nIGluIHRoZQotUkVTT1VSQ0VTIHNlY3Rpb24gYmVsb3cgZm9yIGEgbWV0aG9kIHRvIHNvbHZlIGlucHV0IGZvY3VzIHByb2JsZW0uCi0uVFAKLVxmQlwtbm9yYWlzZW9uYmVlcFxmUgotQnkgZGVmYXVsdCwgdGhlIHZpZXdlciBzaG93cyBhbmQgcmFpc2VzIGl0cyB3aW5kb3cgb24gcmVtb3RlIGJlZXAKLShiZWxsKSBldmVudC4gVGhpcyBvcHRpb24gZGlzYWJsZXMgc3VjaCBiZWhhdmlvdXIKLShUaWdodFZOQ1wtc3BlY2lmaWMpLgotLlRQCi1cZkJcLXVzZXJcZlIgXGZJdXNlcm5hbWVcZlIKLVVzZXIgbmFtZSBmb3IgVW5peCBsb2dpbiBhdXRoZW50aWNhdGlvbi4gRGVmYXVsdCBpcyB0byB1c2UgY3VycmVudAotVW5peCB1c2VyIG5hbWUuIElmIHRoaXMgb3B0aW9uIHdhcyBnaXZlbiwgdGhlIHZpZXdlciB3aWxsIHByZWZlciBVbml4Ci1sb2dpbiBhdXRoZW50aWNhdGlvbiBvdmVyIHRoZSBzdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb24uCi0uVFAKLVxmQlwtcGFzc3dkXGZSIFxmSXBhc3N3ZFwtZmlsZVxmUgotRmlsZSBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFzc3dvcmQgKGFzIGdlbmVyYXRlZCBieSB0aGUKLVxmQnZuY3Bhc3N3ZFxmUigxKSBwcm9ncmFtKS4gVGhpcyBvcHRpb24gYWZmZWN0cyBvbmx5IHRoZSBzdGFuZGFyZCBWTkMKLWF1dGhlbnRpY2F0aW9uLgotLlRQCi1cZkJcLWVuY29kaW5nc1xmUiBcZkllbmNvZGluZ1wtbGlzdFxmUgotVGlnaHRWTkMgc3VwcG9ydHMgc2V2ZXJhbCBkaWZmZXJlbnQgY29tcHJlc3Npb24gbWV0aG9kcyB0byBlbmNvZGUKLXNjcmVlbiB1cGRhdGVzOyB0aGlzIG9wdGlvbiBzcGVjaWZpZXMgYSBzZXQgb2YgdGhlbSB0byB1c2UgaW4gb3JkZXIgb2YKLXByZWZlcmVuY2UuIEVuY29kaW5ncyBhcmUgc3BlY2lmaWVkIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgYW5kIG11c3QKLXRodXMgYmUgZW5jbG9zZWQgaW4gcXVvdGVzIGlmIG1vcmUgdGhhbiBvbmUgaXMgc3BlY2lmaWVkLiAgQ29tbWFzIG1heSBiZSB1c2VkIHRvIGF2b2lkIHNwYWNlcy4KLUF2YWlsYWJsZSBlbmNvZGluZ3MsIGluIGRlZmF1bHQgb3JkZXIgZm9yIGEgcmVtb3RlIGNvbm5lY3Rpb24sIGFyZQotImNvcHlyZWN0IHRpZ2h0IGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3Ii4gRm9yIGEgbG9jYWwgY29ubmVjdGlvbgotKHRvIHRoZSBzYW1lIG1hY2hpbmUpLCB0aGUgZGVmYXVsdCBvcmRlciB0byB0cnkgaXMgInJhdyBjb3B5cmVjdCB0aWdodAotaGV4dGlsZSB6bGliIGNvcnJlIHJyZSIuIFJhdyBlbmNvZGluZyBpcyBhbHdheXMgYXNzdW1lZCBhcyBhIGxhc3Qgb3B0aW9uCi1pZiBubyBvdGhlciBlbmNvZGluZyBjYW4gYmUgdXNlZCBmb3Igc29tZSByZWFzb24uIEZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBlbmNvZGluZ3MsIHNlZSB0aGUgc2VjdGlvbiBFTkNPRElOR1MgYmVsb3cuCi0uVFAKLVxmQlwtYmdyMjMzXGZSCi1BbHdheXMgdXNlIHRoZSBCR1IyMzMgZm9ybWF0IHRvIGVuY29kZSBwaXhlbCBkYXRhLiBUaGlzIHJlZHVjZXMKLW5ldHdvcmsgdHJhZmZpYywgYnV0IGNvbG9ycyBtYXkgYmUgcmVwcmVzZW50ZWQgaW5hY2N1cmF0ZWx5LiBUaGUKLWJncjIzMyBmb3JtYXQgaXMgYW4gOFwtYml0ICJ0cnVlIGNvbG9yIiBmb3JtYXQsIHdpdGggMiBiaXRzIGJsdWUsIDMKLWJpdHMgZ3JlZW4sIGFuZCAzIGJpdHMgcmVkLgotLlRQCi1cZkJcLW93bmNtYXBcZlIKLVRyeSB0byB1c2UgYSBQc2V1ZG9Db2xvciB2aXN1YWwgYW5kIGEgcHJpdmF0ZSBjb2xvcm1hcC4gVGhpcyBhbGxvd3MKLXRoZSBWTkMgc2VydmVyIHRvIGNvbnRyb2wgdGhlIGNvbG9ybWFwLgotLlRQCi1cZkJcLXRydWVjb2xvdXJcZlIsIFxmQlwtdHJ1ZWNvbG9yXGZSCi1UcnkgdG8gdXNlIGEgVHJ1ZUNvbG9yIHZpc3VhbC4KLS5UUAotXGZCXC1kZXB0aFxmUiBcZklkZXB0aFxmUgotT24gYW4gWCBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMgbXVsdGlwbGUgVHJ1ZUNvbG9yIHZpc3VhbHMgb2YgZGlmZmVyZW50Ci1kZXB0aHMsIGF0dGVtcHQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgb25lIChpbiBiaXRzIHBlciBwaXhlbCk7IGlmCi1zdWNjZXNzZnVsLCB0aGlzIGRlcHRoIHdpbGwgYmUgcmVxdWVzdGVkIGZyb20gdGhlIFZOQyBzZXJ2ZXIuCi0uVFAKLVxmQlwtY29tcHJlc3NsZXZlbCBcZklsZXZlbFxmUgotVXNlIHNwZWNpZmllZCBjb21wcmVzc2lvbiBcZklsZXZlbFxmUiAoMC4uOSkgZm9yICJ0aWdodCIgYW5kICJ6bGliIgotZW5jb2RpbmdzIChUaWdodFZOQ1wtc3BlY2lmaWMpLiBMZXZlbCAxIHVzZXMgbWluaW11bSBvZiBDUFUgdGltZSBhbmQKLWFjaGlldmVzIHdlYWsgY29tcHJlc3Npb24gcmF0aW9zLCB3aGlsZSBsZXZlbCA5IG9mZmVycyBiZXN0Ci1jb21wcmVzc2lvbiBidXQgaXMgc2xvdyBpbiB0ZXJtcyBvZiBDUFUgdGltZSBjb25zdW1wdGlvbiBvbiB0aGUgc2VydmVyCi1zaWRlLiBVc2UgaGlnaCBsZXZlbHMgd2l0aCB2ZXJ5IHNsb3cgbmV0d29yayBjb25uZWN0aW9ucywgYW5kIGxvdwotbGV2ZWxzIHdoZW4gd29ya2luZyBvdmVyIGhpZ2hcLXNwZWVkIExBTnMuIEl0J3Mgbm90IHJlY29tbWVuZGVkIHRvIHVzZQotY29tcHJlc3Npb24gbGV2ZWwgMCwgcmVhc29uYWJsZSBjaG9pY2VzIHN0YXJ0IGZyb20gdGhlIGxldmVsIDEuCi0uVFAKLVxmQlwtcXVhbGl0eSBcZklsZXZlbFxmUgotVXNlIHRoZSBzcGVjaWZpZWQgSlBFRyBxdWFsaXR5IFxmSWxldmVsXGZSICgwLi45KSBmb3IgdGhlICJ0aWdodCIKLWVuY29kaW5nIChUaWdodFZOQ1wtc3BlY2lmaWMpLiBRdWFsaXR5IGxldmVsIDAgZGVub3RlcyBiYWQgaW1hZ2UKLXF1YWxpdHkgYnV0IHZlcnkgaW1wcmVzc2l2ZSBjb21wcmVzc2lvbiByYXRpb3MsIHdoaWxlIGxldmVsIDkgb2ZmZXJzCi12ZXJ5IGdvb2QgaW1hZ2UgcXVhbGl0eSBhdCBsb3dlciBjb21wcmVzc2lvbiByYXRpb3MuIE5vdGUgdGhhdCB0aGUKLSJ0aWdodCIgZW5jb2RlciB1c2VzIEpQRUcgdG8gZW5jb2RlIG9ubHkgdGhvc2Ugc2NyZWVuIGFyZWFzIHRoYXQgbG9vawotc3VpdGFibGUgZm9yIGxvc3N5IGNvbXByZXNzaW9uLCBzbyBxdWFsaXR5IGxldmVsIDAgZG9lcyBub3QgYWx3YXlzCi1tZWFuIHVuYWNjZXB0YWJsZSBpbWFnZSBxdWFsaXR5LgotLlRQCi1cZkJcLW5vanBlZ1xmUgotRGlzYWJsZSBsb3NzeSBKUEVHIGNvbXByZXNzaW9uIGluIFRpZ2h0IGVuY29kaW5nIChUaWdodFZOQ1wtc3BlY2lmaWMpLiAKLURpc2FibGluZyBKUEVHIGNvbXByZXNzaW9uIGlzIG5vdCBhIGdvb2QgaWRlYSBpbiB0eXBpY2FsIGNhc2VzLCBhcwotdGhhdCBtYWtlcyB0aGUgVGlnaHQgZW5jb2RlciBsZXNzIGVmZmljaWVudC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlCi10aGlzIG9wdGlvbiBpZiBpdCdzIGFic29sdXRlbHkgbmVjZXNzYXJ5IHRvIGFjaGlldmUgcGVyZmVjdCBpbWFnZQotcXVhbGl0eSAoc2VlIGFsc28gdGhlIFxmQlwtcXVhbGl0eVxmUiBvcHRpb24pLgotLlRQCi1cZkJcLW5vY3Vyc29yc2hhcGVcZlIKLURpc2FibGUgY3Vyc29yIHNoYXBlIHVwZGF0ZXMsIHByb3RvY29sIGV4dGVuc2lvbnMgdXNlZCB0byBoYW5kbGUKLXJlbW90ZSBjdXJzb3IgbW92ZW1lbnRzIGxvY2FsbHkgb24gdGhlIGNsaWVudCBzaWRlCi0oVGlnaHRWTkNcLXNwZWNpZmljKS4gVXNpbmcgY3Vyc29yIHNoYXBlIHVwZGF0ZXMgZGVjcmVhc2VzIGRlbGF5cyB3aXRoCi1yZW1vdGUgY3Vyc29yIG1vdmVtZW50cywgYW5kIGNhbiBpbXByb3ZlIGJhbmR3aWR0aCB1c2FnZSBkcmFtYXRpY2FsbHkuIAotLlRQCi1cZkJcLXgxMWN1cnNvclxmUgotVXNlIGEgcmVhbCBYMTEgY3Vyc29yIHdpdGggWC1zdHlsZSBjdXJzb3Igc2hhcGUgdXBkYXRlcywgaW5zdGVhZCBvZgotZHJhd2luZyB0aGUgcmVtb3RlIGN1cnNvciBvbiB0aGUgZnJhbWVidWZmZXIuIFRoaXMgb3B0aW9uIGFsc28KLWRpc2FibGVzIHRoZSBkb3QgY3Vyc29yLCBhbmQgZGlzYWJsZXMgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZXMgaW4KLW5vbi1mdWxsc2NyZWVuIG1vZGUuCi0uVFAKLVxmQlwtYXV0b3Bhc3NcZlIKLVJlYWQgYSBwbGFpbi10ZXh0IHBhc3N3b3JkIGZyb20gc3RkaW4uIFRoaXMgb3B0aW9uIGFmZmVjdHMgb25seSB0aGUKLXN0YW5kYXJkIFZOQyBhdXRoZW50aWNhdGlvbi4KLQotLlNIIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIE9QVElPTlMKLS5UUAotRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgd2ViIHBhZ2UgaXMgbG9jYXRlZCBhdDoKLS5UUAotaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sCi0uVFAKLU5vdGU6IFpSTEUgYW5kIFpZV1JMRSBlbmNvZGluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCi0uVFAKLU5vdGU6IEY5IGlzIHNob3J0Y3V0IHRvIFRvZ2dsZSBGdWxsU2NyZWVuIG1vZGUuCi0uVFAKLU5vdGU6IEluIC1saXN0ZW4gbW9kZSBzZXQgdGhlIGVudiB2YXIuIFNTVk5DX01VTFRJUExFX0xJU1RFTj0xCi10byBhbGxvdyBtb3JlIHRoYW4gb25lIGluY29taW5nIFZOQyBzZXJ2ZXIgYXQgYSB0aW1lLgotVGhpcyBpcyB0aGUgc2FtZSBhcyAtbXVsdGlsaXN0ZW4gZGVzY3JpYmVkIGJlbG93LiAgU2V0Ci1TU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOm4gdG8gYWxsb3cgbm8gbW9yZSB0aGFuICJuIgotc2ltdWx0YW5lb3VzIHJldmVyc2UgY29ubmVjdGlvbnMuCi0KLUlmIHRoZSBob3N0OnBvcnQgaXMgc3BlY2lmaWVkIGFzICJleGVjPWNvbW1hbmQgYXJncy4uLiIKLXRoZW4gaW5zdGVhZCBvZiBtYWtpbmcgYSBUQ1AvSVAgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlCi1yZW1vdGUgVk5DIHNlcnZlciwgImNvbW1hbmQgYXJncy4uLiIgaXMgZXhlY3V0ZWQgYW5kIHRoZQotdmlld2VyIGlzIGF0dGFjaGVkIHRvIGl0cyBzdGRpby4gIFRoaXMgZW5hYmxlcyB0dW5uZWxsaW5nCi1lc3RhYmxpc2hlZCB2aWEgYW4gZXh0ZXJuYWwgY29tbWFuZCwgZS5nLiBhbiBzdHVubmVsKDgpCi10aGF0IGRvZXMgbm90IGludm9sdmUgYSBsaXN0ZW5pbmcgc29ja2V0LgotVGhpcyBtb2RlIGRvZXMgbm90IHdvcmsgZm9yIC1saXN0ZW4gcmV2ZXJzZSBjb25uZWN0aW9ucy4KLQotSWYgdGhlIGhvc3Q6cG9ydCBpcyBzcGVjaWZpZWQgYXMgImZkPW4iIHRoZW4gaXQgaXMgYXNzdW1lZAotbiBpcyBhbiBhbHJlYWR5IG9wZW5lZCBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHNvY2tldC4gKGkuZQotdGhlIHBhcmVudCBkaWQgZm9yaytleGVjKQotCi1JZiB0aGUgaG9zdDpwb3J0IGNvbnRhaW5zIGEgJy8nIGl0IGlzIGludGVycHJldGVkIGFzIGEKLXVuaXgtZG9tYWluIHNvY2tldCAoQUZfTE9DQUwgaW5zZWFkIG9mIEFGX0lORVQpCi0uVFAKLVxmQlwtbXVsdGlsaXN0ZW5cZlIKLUFzIGluIC1saXN0ZW4gKHJldmVyc2UgY29ubmVjdGlvbiBsaXN0ZW5pbmcpIGV4Y2VwdAotYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIHRvIGJlIGNvbm5lY3RlZAotYXQgYSB0aW1lLiAgVGhlIGRlZmF1bHQgZm9yIC1saXN0ZW4gb2Ygb25seSBvbmUgYXQgYQotdGltZSB0cmllcyB0byBwbGF5IGl0IHNhZmUgYnkgbm90IGFsbG93aW5nIGFueW9uZSBvbgotdGhlIG5ldHdvcmsgdG8gcHV0IChtYW55KSBkZXNrdG9wcyBvbiB5b3VyIHNjcmVlbiBvdmVyCi1hIGxvbmcgd2luZG93IG9mIHRpbWUuIFVzZSAtbXVsdGlsaXN0ZW4gZm9yIG5vIGxpbWl0LgotLlRQCi1cZkJcLWFjY2VwdHBvcHVwXGZSCi1JbiBcZkJcLWxpc3RlblxmUiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgbW9kZSB3aGVuCi1hIHJldmVyc2UgVk5DIGNvbm5lY3Rpb24gY29tZXMgaW4gc2hvdyBhIHBvcHVwIGFza2luZwotd2hldGhlciB0byBBY2NlcHQgb3IgUmVqZWN0IHRoZSBjb25uZWN0aW9uLiAgVGhlIElQCi1hZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nIGhvc3QgaXMgc2hvd24uICBTYW1lIGFzCi1zZXR0aW5nIHRoZSBlbnYuIHZhci4gU1NWTkNfQUNDRVBUX1BPUFVQPTEuCi0uVFAKLVxmQlwtYWNjZXB0cG9wdXBzY1xmUgotQXMgaW4gXGZCXC1hY2NlcHRwb3B1cFxmUiBleGNlcHQgYXNzdW1lIFVsdHJhVk5DIFNpbmdsZQotQ2xpY2sgKFNDKSBzZXJ2ZXIuICBSZXRyaWV2ZSBVc2VyIGFuZCBDb21wdXRlck5hbWUKLWluZm8gZnJvbSBVbHRyYVZOQyBTZXJ2ZXIgYW5kIGRpc3BsYXkgaW4gdGhlIFBvcHVwLgotLlRQCi1cZkJcLXVzZTY0XGZSCi1JbiBcZkJcLWJncjIzM1xmUiBtb2RlLCB1c2UgNjQgY29sb3JzIGluc3RlYWQgb2YgMjU2LgotLlRQCi1cZkJcLWJncjIyMlxmUgotU2FtZSBhcyBcZkJcLXVzZTY0XGZSLgotLlRQCi1cZkJcLXVzZThcZlIKLUluIFxmQlwtYmdyMjMzXGZSIG1vZGUsIHVzZSA4IGNvbG9ycyBpbnN0ZWFkIG9mIDI1Ni4KLS5UUAotXGZCXC1iZ3IxMTFcZlIKLVNhbWUgYXMgXGZCXC11c2U4XGZSLgotLlRQCi1cZkJcLTE2YnBwXGZSCi1JZiB0aGUgdm5jIHZpZXdlciBYIGRpc3BsYXkgaXMgZGVwdGggMjQgYXQgMzJicHAKLXJlcXVlc3QgYSAxNmJwcCBmb3JtYXQgZnJvbSB0aGUgVk5DIHNlcnZlciB0byBjdXQKLW5ldHdvcmsgdHJhZmZpYyBieSB1cCB0byAyWCwgdGhlbiB0cmFubGF0ZSB0aGUKLXBpeGVscyB0byAzMmJwcCBsb2NhbGx5LgotLlRQCi1cZkJcLWJncjU2NVxmUgotU2FtZSBhcyBcZkJcLTE2YnBwXGZSLgotLlRQCi1cZkJcLWdyZXlcZlIKLVVzZSBhIGdyZXkgc2NhbGUgZm9yIHRoZSAxNi0gYW5kIDhcZkJcLWJwcFxmUiBtb2Rlcy4KLS5UUAotXGZCXC1hbHBoYVxmUgotVXNlIGFscGhhYmxlbmRpbmcgdHJhbnNwYXJlbmN5IGZvciBsb2NhbCBjdXJzb3JzCi1yZXF1aXJlczogeDExdm5jIHNlcnZlciwgYm90aCBjbGllbnQgYW5kIHNlcnZlcgotbXVzdCBiZSAzMmJwcCBhbmQgc2FtZSBlbmRpYW5uZXNzLgotLlRQCi1cZkJcLXNjYWxlXGZSIFxmSXN0clxmUgotU2NhbGUgdGhlIGRlc2t0b3AgbG9jYWxseS4gIFRoZSBzdHJpbmcgInN0ciIgY2FuCi1hIGZsb2F0aW5nIHBvaW50IHJhdGlvLCBlLmcuICIwLjkiLCBvciBhIGZyYWN0aW9uLAotZS5nLiAiMy80Iiwgb3IgV3hILCBlLmcuIDEyODB4MTAyNC4gIFVzZSAiZml0IgotdG8gZml0IGluIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLiAgVXNlICJhdXRvIiB0bwotZml0IGluIHRoZSB3aW5kb3cgc2l6ZS4gICJzdHIiIGNhbiBhbHNvIGJlIHNldCBieQotdGhlIGVudi4gdmFyLiBTU1ZOQ19TQ0FMRS4KLQotSWYgeW91IG9ic2VydmUgbW91c2UgdHJhaWwgcGFpbnRpbmcgZXJyb3JzLCBlbmFibGUKLVgxMSBDdXJzb3IgbW9kZSAoZWl0aGVyIHZpYSBQb3B1cCBvciBcZkJcLXgxMWN1cnNvclxmUi4pCi0KLU5vdGUgdGhhdCBzY2FsaW5nIGlzIGRvbmUgaW4gc29mdHdhcmUgYW5kIHNvIGNhbiBiZQotc2xvdyBhbmQgcmVxdWlyZXMgbW9yZSBtZW1vcnkuICBTb21lIHNwZWVkdXAgVGlwczoKLQotWlJMRSBpcyBmYXN0ZXIgdGhhbiBUaWdodCBpbiB0aGlzIG1vZGUuICBXaGVuCi1zY2FsaW5nIGlzIGZpcnN0IGRldGVjdGVkLCB0aGUgZW5jb2Rpbmcgd2lsbAotYmUgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byBaUkxFLiAgVXNlIHRoZQotUG9wdXAgbWVudSBpZiB5b3Ugd2FudCB0byBnbyBiYWNrIHRvIFRpZ2h0LgotU2V0IFNTVk5DX1BSRVNFUlZFX0VOQ09ESU5HPTEgdG8gZGlzYWJsZSB0aGlzLgotCi1Vc2UgYSBzb2xpZCBiYWNrZ3JvdW5kIG9uIHRoZSByZW1vdGUgc2lkZS4KLShlLmcuIG1hbnVhbGx5IG9yIHZpYSB4MTF2bmMgXGZCXC1zb2xpZFxmUiAuLi4pCi0KLUlmIHRoZSByZW1vdGUgc2VydmVyIGlzIHgxMXZuYywgdHJ5IGNsaWVudAotc2lkZSBjYWNoaW5nOiB4MTF2bmMgXGZCXC1uY2FjaGVcZlIgMTAgLi4uCi0uVFAKLVxmQlwteWNyb3BcZlIgbgotT25seSBzaG93IHRoZSB0b3AgbiByb3dzIG9mIHRoZSBmcmFtZWJ1ZmZlci4gIEZvcgotdXNlIHdpdGggeDExdm5jIFxmQlwtbmNhY2hlXGZSIGNsaWVudCBjYWNoaW5nIG9wdGlvbgotdG8gaGVscCAiaGlkZSIgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4KLVVzZSBhIG5lZ2F0aXZlIHZhbHVlIChlLmcuIFxmQlwtMVxmUikgZm9yIGF1dG9kZXRlY3Rpb24uCi1BdXRvZGV0ZWN0aW9uIHdpbGwgYWx3YXlzIHRha2UgcGxhY2UgaWYgdGhlIHJlbW90ZQotZmIgaGVpZ2h0IGlzIG1vcmUgdGhhbiAyIHRpbWVzIHRoZSB3aWR0aC4KLS5UUAotXGZCXC1zYndpZHRoXGZSIG4KLVNjcm9sbGJhciB3aWR0aCBmb3IgeDExdm5jIFxmQlwtbmNhY2hlXGZSIG1vZGUgKFxmQlwteWNyb3BcZlIpLAotZGVmYXVsdCBpcyB2ZXJ5IG5hcnJvdzogMiBwaXhlbHMsIGl0IGlzIG5hcnJvdyB0bwotYXZvaWQgZGlzdHJhY3Rpb24gaW4gXGZCXC15Y3JvcFxmUiBtb2RlLgotLlRQCi1cZkJcLW5vYmVsbFxmUgotRGlzYWJsZSBiZWxsLgotLlRQCi1cZkJcLXJhd2xvY2FsXGZSCi1QcmVmZXIgcmF3IGVuY29kaW5nIGZvciBsb2NhbGhvc3QsIGRlZmF1bHQgaXMKLW5vLCBpLmUuIGFzc3VtZXMgeW91IGhhdmUgYSBTU0ggdHVubmVsIGluc3RlYWQuCi0uVFAKLVxmQlwtbm90dHlcZlIKLVRyeSB0byBhdm9pZCB1c2luZyB0aGUgdGVybWluYWwgZm9yIGludGVyYWN0aXZlCi1yZXNwb25zZXM6IHVzZSB3aW5kb3dzIGZvciBtZXNzYWdlcyBhbmQgcHJvbXB0aW5nCi1pbnN0ZWFkLiAgTWVzc2FnZXMgd2lsbCBhbHNvIGJlIHByaW50ZWQgdG8gdGVybWluYWwuCi0uVFAKLVxmQlwtc2VuZGNsaXBib2FyZFxmUgotU2VuZCB0aGUgWCBDTElQQk9BUkQgc2VsZWN0aW9uIChpLmUuIEN0cmwrQywKLUN0cmwrVikgaW5zdGVhZCBvZiB0aGUgWCBQUklNQVJZIHNlbGVjdGlvbiAobW91c2UKLXNlbGVjdCBhbmQgbWlkZGxlIGJ1dHRvbiBwYXN0ZS4pCi0uVFAKLVxmQlwtc2VuZGFsd2F5c1xmUgotV2hlbmV2ZXIgdGhlIG1vdXNlIGVudGVycyB0aGUgVk5DIHZpZXdlciBtYWluCi13aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmCi1pdCBoYXMgbm90IGNoYW5nZWQuICBUaGlzIGlzIGxpa2UgdGhlIFh0IHJlc291cmNlCi10cmFuc2xhdGlvbiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpCi0uVFAKLVxmQlwtcmVjdnRleHRcZlIKLXN0ciAgIFdoZW4gY3V0IHRleHQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVk5DIHNlcnZlciwKLXNzdm5jdmlld2VyIHdpbGwgc2V0IGJvdGggdGhlIFggUFJJTUFSWSBhbmQgdGhlCi1YIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaAotaXMgc2V0LCBzcGVjaWZ5ICdzdHInIGFzICdwcmltYXJ5JywgJ2NsaXBib2FyZCcsCi1vciAnYm90aCcgKHRoZSBkZWZhdWx0LikKLS5UUAotXGZCXC1ncmFiYWxsXGZSCi1HcmFiIHRoZSBlbnRpcmUgWCBzZXJ2ZXIgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCi1uZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCi0uVFAKLVxmQlwtcG9wdXBmaXhcZlIKLVdhcnAgdGhlIHBvcHVwIGJhY2sgdG8gdGhlIHBvaW50ZXIgcG9zaXRpb24sCi1uZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCi0uVFAKLVxmQlwtZ3JhYmtiZFxmUgotR3JhYiB0aGUgWCBrZXlib2FyZCB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSwKLW5lZWRlZCBieSBzb21lIHdpbmRvdyBtYW5hZ2Vycy4gU2FtZSBhcyBcZkJcLWdyYWJrZXlib2FyZFxmUi4KLVxmQlwtZ3JhYmtiZFxmUiBpcyB0aGUgZGVmYXVsdCwgdXNlIFxmQlwtbm9ncmFia2JkXGZSIHRvIGRpc2FibGUuCi0uVFAKLVxmQlwtYnNcZlIsIFxmQlwtbm9ic1xmUgotV2hldGhlciBvciBub3QgdG8gdXNlIFggc2VydmVyIEJhY2tpbmdzdG9yZSBmb3IgdGhlCi1tYWluIHZpZXdlciB3aW5kb3cuICBUaGUgZGVmYXVsdCBpcyB0byBub3QsIG1haW5seQotYmVjYXVzZSBtb3N0IExpbnV4LCBldGMsIHN5c3RlbXMgWCBzZXJ2ZXJzIGRpc2FibGUKLSphbGwqIEJhY2tpbmdzdG9yZSBieSBkZWZhdWx0LiAgVG8gcmVcZkJcLWVuYWJsZVxmUiBpdCBwdXQKLQotT3B0aW9uICJCYWNraW5nc3RvcmUiCi0KLWluIHRoZSBEZXZpY2Ugc2VjdGlvbiBvZiAvZXRjL1gxMS94b3JnLmNvbmYuCi1JbiBcZkJcLWJzXGZSIG1vZGUgd2l0aCBubyBYIHNlcnZlciBiYWNraW5nc3RvcmUsIHdoZW5ldmVyIGFuCi1hcmVhIG9mIHRoZSBzY3JlZW4gaXMgcmVcZkJcLWV4cG9zZWRcZlIgaXQgbXVzdCBnbyBvdXQgdG8gdGhlCi1WTkMgc2VydmVyIHRvIHJldHJpZXZlIHRoZSBwaXhlbHMuIFRoaXMgaXMgdG9vIHNsb3cuCi0KLUluIFxmQlwtbm9ic1xmUiBtb2RlLCBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ5IHRoZSB2aWV3ZXIgdG8KLXByb3ZpZGUgaXRzIG93biBiYWNraW5nIG9mIHRoZSBtYWluIHZpZXdlciB3aW5kb3cuIFRoaXMKLWFjdHVhbGx5IG1ha2VzIHNvbWUgYWN0aXZpdGllcyBmYXN0ZXIgKGNoYW5nZXMgaW4gbGFyZ2UKLXJlZ2lvbnMpIGJ1dCBjYW4gYXBwZWFyIHRvICJmbGFzaCIgdG9vIG11Y2guCi0uVFAKLVxmQlwtbm9zaG1cZlIKLURpc2FibGUgdXNlIG9mIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAobm90IHJlY29tbWVuZGVkKQotLlRQCi1cZkJcLXRlcm1jaGF0XGZSCi1EbyB0aGUgVWx0cmFWTkMgY2hhdCBpbiB0aGUgdGVybWluYWwgdm5jdmlld2VyIGlzIGluCi1pbnN0ZWFkIG9mIGluIGFuIGluZGVwZW5kZW50IHdpbmRvdy4KLS5UUAotXGZCXC11bml4cHdcZlIgXGZJc3RyXGZSCi1Vc2VmdWwgZm9yIGxvZ2dpbmcgaW50byB4MTF2bmMgaW4gXGZCXC11bml4cHdcZlIgbW9kZS4gInN0ciIgaXMgYQotc3RyaW5nIHRoYXQgYWxsb3dzIG1hbnkgd2F5cyB0byBlbnRlciB0aGUgVW5peCBVc2VybmFtZQotYW5kIFVuaXggUGFzc3dvcmQuICBUaGVzZSBjaGFyYWN0ZXJzOiB1c2VybmFtZSwgbmV3bGluZSwKLXBhc3N3b3JkLCBuZXdsaW5lIGFyZSBzZW50IHRvIHRoZSBWTkMgc2VydmVyIGFmdGVyIGFueSBWTkMKLWF1dGhlbnRpY2F0aW9uIGhhcyB0YWtlbiBwbGFjZS4gIFVuZGVyIHgxMXZuYyB0aGV5IGFyZQotdXNlZCBmb3IgdGhlIFxmQlwtdW5peHB3XGZSIGxvZ2luLiAgT3RoZXIgVk5DIHNlcnZlcnMgY291bGQgZG8KLXNvbWV0aGluZyBzaW1pbGFyLgotCi1Zb3UgY2FuIGFsc28gaW5kaWNhdGUgInN0ciIgdmlhIHRoZSBlbnZpcm9ubWVudAotdmFyaWFibGUgU1NWTkNfVU5JWFBXLgotCi1Ob3RlIHRoYXQgdGhlIEVzY2FwZSBrZXkgaXMgYWN0dWFsbHkgc2VudCBmaXJzdCB0byB0ZWxsCi14MTF2bmMgdG8gbm90IGVjaG8gdGhlIFVuaXggVXNlcm5hbWUgYmFjayB0byB0aGUgVk5DCi12aWV3ZXIuIFNldCBTU1ZOQ19VTklYUFdfTk9FU0M9MSB0byBvdmVycmlkZSB0aGlzLgotCi1JZiBzdHIgaXMgIi4iLCB0aGVuIHlvdSBhcmUgcHJvbXB0ZWQgYXQgdGhlIGNvbW1hbmQgbGluZQotZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIG5vcm1hbCB3YXkuICBJZiBzdHIgaXMKLSItIiB0aGUgc3RkaW4gaXMgcmVhZCB2aWEgZ2V0cGFzcygzKSBmb3IgdXNlcm5hbWVAcGFzc3dvcmQuCi1PdGhlcndpc2UgaWYgc3RyIGlzIGEgZmlsZSwgaXQgaXMgb3BlbmVkIGFuZCB0aGUgZmlyc3QgbGluZQotcmVhZCBpcyB0YWtlbiBhcyB0aGUgVW5peCB1c2VybmFtZSBhbmQgdGhlIDJuZCBhcyB0aGUKLXBhc3N3b3JkLiBJZiBzdHIgcHJlZml4ZWQgYnkgInJtOiIgdGhlIGZpbGUgaXMgcmVtb3ZlZAotYWZ0ZXIgcmVhZGluZy4gT3RoZXJ3aXNlLCBpZiBzdHIgaGFzIGEgIkAiIGNoYXJhY3RlciwKLWl0IGlzIHRha2VuIGFzIHVzZXJuYW1lQHBhc3N3b3JkLiBPdGhlcndpc2UsIHRoZSBwcm9ncmFtCi1leGl0cyB3aXRoIGFuIGVycm9yLiBHb3QgYWxsIHRoYXQ/Ci0uVFAKLVxmQi1yZXBlYXRlclxmUiBcZklzdHJcZlIKLVRoaXMgaXMgZm9yIHVzZSB3aXRoIFVsdHJhVk5DIHJlcGVhdGVyIHByb3h5IGRlc2NyaWJlZAotaGVyZTogaHR0cDovL3d3dy51dm5jLmNvbS9hZGRvbnMvcmVwZWF0ZXIuaHRtbC4gIFRoZSAic3RyIgotaXMgdGhlIElEIHN0cmluZyB0byBiZSBzZW50IHRvIHRoZSByZXBlYXRlci4gIEUuZy4gSUQ6MTIzNAotSXQgY2FuIGFsc28gYmUgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9yIGRpc3BsYXkgb2YgdGhlIFZOQwotc2VydmVyLCBlLmcuIDEyLjM0LjU2Ljc4OjAgb3Igc25vb3B5LmNvbToxLiAgTm90ZSB0aGF0IHdoZW4KLXVzaW5nIC1yZXBlYXRlciwgdGhlIGhvc3Q6ZHB5IG9uIHRoZSBjbWRsaW5lIGlzIHRoZSByZXBlYXRlcgotc2VydmVyLCBOT1QgdGhlIFZOQyBzZXJ2ZXIuICBUaGUgcmVwZWF0ZXIgd2lsbCBjb25uZWN0IHlvdS4KLQotRXhhbXBsZTogdm5jdmlld2VyIC4uLiAtcmVwZWF0ZXIgSUQ6MzMzMyByZXBlYXQuaG9zdDo1OTAwCi0KLUV4YW1wbGU6IHZuY3ZpZXdlciAuLi4gLXJlcGVhdGVyIHZob3N0OjAgcmVwZWF0Lmhvc3Q6NTkwMAotCi1Vc2UsIGUuZy4sICctcmVwZWF0ZXIgU0NJSUk9SUQ6MzIxMCcgaWYgdGhlIHJlcGVhdGVyIGlzIGEKLVNpbmdsZSBDbGljayBJSUkgKFNTTCkgcmVwZWF0ZXIgKHJlcGVhdGVyX1NTTC5leGUpIGFuZCB5b3UKLWFyZSBwYXNzaW5nIHRoZSBTU0wgcGFydCBvZiB0aGUgY29ubmVjdGlvbiB0aHJvdWdoIHN0dW5uZWwsIHNvY2F0LCBldGMuCi1UaGlzIHdheSB0aGUgbWFnaWMgVWx0cmFWTkMgc3RyaW5nICd0ZXN0QicgbmVlZGVkIHRvIHdvcmsgd2l0aCB0aGUKLXJlcGVhdGVyIGlzIHNlbnQgdG8gaXQuCi0uVFAKLVxmQi1yZmJ2ZXJzaW9uXGZSIFxmSXN0clxmUgotU2V0IHRoZSBhZHZlcnRpc2VkIFJGQiB2ZXJzaW9uLiAgRS5nLjogLXJmYnZlcnNpb24gMy42ICBGb3Igc29tZQotc2VydmVycywgZS5nLiBVbHRyYVZOQyB0aGlzIG5lZWRzIHRvIGJlIGRvbmUuCi0uVFAKLVxmQi11bHRyYWRzbVxmUgotVWx0cmFWTkMgaGFzIHN5bW1ldHJpYyBwcml2YXRlIGVuY3J5cHRpb24gRFNNIHBsdWdpbnMuICBTZWUKLWh0dHA6Ly93d3cudXZuYy5jb20vZmVhdHVyZXMvZW5jcnlwdGlvbi5odG1sLiAgSXQgaXMgYXNzdW1lZAoteW91IGFyZSB1c2luZyBhIHVuaXggcHJvZ3JhbSAoZS5nLiBvdXIgdWx0cmF2bmNfZHNtX2hlbHBlcikgdG8KLWVuY3J5cHQgYW5kIGRlY3J5cHQgdGhlIFVsdHJhVk5DIERTTSBzdHJlYW0uIElOIEFERElUSU9OIFRPCi1USEFUIHN1cHBseSAtdWx0cmFkc20gdG8gdGVsbCBUSElTIHZpZXdlciB0byBtb2RpZnkgdGhlIFJGQgotZGF0YSBzZW50IHNvIGFzIHRvIHdvcmsgd2l0aCB0aGUgVWx0cmFWTkMgU2VydmVyLiAgRm9yIHNvbWUKLXJlYXNvbiwgZWFjaCBSRkIgbXNnIHR5cGUgbXVzdCBiZSBzZW50IHR3aWNlIHVuZGVyIERTTS4KLS5UUAotXGZCXC1tc2xvZ29uXGZSIFxmSXVzZXJcZlIKLVVzZSBXaW5kb3dzIE1TIExvZ29uIHRvIGFuIFVsdHJhVk5DIHNlcnZlci4gIFN1cHBseSB0aGUKLXVzZXJuYW1lIG9yICIxIiB0byBiZSBwcm9tcHRlZC4gIFRoZSBkZWZhdWx0IGlzIHRvCi1hdXRvZGV0ZWN0IHRoZSBVbHRyYVZOQyBNUyBMb2dvbiBzZXJ2ZXIgYW5kIHByb21wdCBmb3IKLXRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCi0KLUlNUE9SVEFOVCBOT1RFOiBUaGUgVWx0cmFWTkMgTVMtTG9nb24gRGlmZmllLUhlbGxtYW4KLWV4Y2hhbmdlIGlzIHZlcnkgd2VhayBhbmQgY2FuIGJlIGJydXRlIGZvcmNlZCB0byByZWNvdmVyCi15b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiBhIGZldyBzZWNvbmRzIG9mIENQVQotdGltZS4gIFRvIGJlIHNhZmUsIGJlIHN1cmUgdG8gdXNlIGFuIGFkZGl0aW9uYWwgZW5jcnlwdGVkCi10dW5uZWwgKGUuZy4gU1NMIG9yIFNTSCkgZm9yIHRoZSBlbnRpcmUgVk5DIHNlc3Npb24uCi0uVFAKLVxmQlwtY2hhdG9ubHlcZlIKLVRyeSB0byBiZSBhIGNsaWVudCB0aGF0IG9ubHkgZG9lcyBVbHRyYVZOQyB0ZXh0IGNoYXQuIFRoaXMKLW1vZGUgaXMgdXNlZCBieSB4MTF2bmMgdG8gcHJlc2VudCBhIGNoYXQgd2luZG93IG9uIHRoZSBwaHlzaWNhbAotWDExIGNvbnNvbGUgKGkuZS4gdG8gY2hhdCB3aXRoIHRoZSBwZXJzb24gYXQgdGhlIGRpc3BsYXkpLgotLlRQCi1cZkItZW52XGZSIFxmSVZBUj1WQUxVRVxmUgotVG8gc2F2ZSB3cml0aW5nIGEgc2hlbGwgc2NyaXB0IHRvIHNldCBlbnZpcm9ubWVudAotdmFyaWFibGVzLCBzcGVjaWZ5IGFzIG1hbnkgYXMgeW91IG5lZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLAotLWVudiBTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOjUgLWVudiBFRElUT1I9dmkKLS5UUAotXGZCXC1ub2lwdjZcZlIKLURpc2FibGUgYWxsIElQdjYgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjY9MS4KLS5UUAotXGZCXC1ub2lwdjRcZlIKLURpc2FibGUgYWxsIElQdjQgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjQ9MS4KLS5UUAotXGZCXC1wcmludHJlc1xmUgotUHJpbnQgb3V0IHRoZSBTc3ZuYyBYIHJlc291cmNlcyAoYXBwZGVmYXVsdHMpIGFuZAotdGhlbiBleGl0LiBZb3UgY2FuIHNhdmUgdGhlbSB0byBhIGZpbGUgYW5kIGN1c3RvbWl6ZSB0aGVtIChlLmcuIHRoZQota2V5YmluZGluZ3MgYW5kIFBvcHVwIG1lbnUpICBUaGVuIHBvaW50IHRvIHRoZSBmaWxlIHZpYQotWEVOVklST05NRU5UIG9yIFhBUFBMUkVTRElSLgotLlRQCi1cZkJcLXBpcGVsaW5lXGZSCi1MaWtlIFR1cmJvVk5DLCByZXF1ZXN0IHRoZSBuZXh0IGZyYW1lYnVmZmVyIHVwZGF0ZSBhcyBzb29uCi1hcyBwb3NzaWJsZSBpbnN0ZWFkIG9mIHdhaXRpbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudAotZnJhbWVidWZmZXIgdXBkYXRlIGNvbWluZyBpbi4gIEhlbHBzICdwaXBlbGluZScgdGhlIHVwZGF0ZXMuCi1UaGlzIGlzIGN1cnJlbnRseSB0aGUgZGVmYXVsdCwgdXNlIFxmQi1ub3BpcGVsaW5lXGZSIHRvIGRpc2FibGUuCi0uVFAKLVxmQlwtYXBwc2hhcmVcZlIKLUVuYWJsZSBmZWF0dXJlcyBmb3IgdXNlIHdpdGggeDExdm5jJ3MgXGZCXC1hcHBzaGFyZVxmUiBtb2RlIHdoZXJlCi1pbnN0ZWFkIG9mIHNoYXJpbmcgdGhlIGZ1bGwgZGVza3RvcCBvbmx5IHRoZSBhcHBsaWNhdGlvbidzCi13aW5kb3dzIGFyZSBzaGFyZWQuICBWaWV3ZXIgbXVsdGlsaXN0ZW4gbW9kZSBpcyB1c2VkIHRvCi1jcmVhdGUgdGhlIG11bHRpcGxlIHdpbmRvd3M6IFxmQlwtbXVsdGlsaXN0ZW5cZlIgaXMgaW1wbGllZC4KLVNlZSAneDExdm5jIFxmQlwtYXBwc2hhcmVcZlIgXGZCXC1oZWxwXGZSJyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlLgotRmVhdHVyZXMgZW5hYmxlZCBpbiB0aGUgdmlld2VyIHVuZGVyIFxmQlwtYXBwc2hhcmVcZlIgYXJlOgotTWluaW11bSBleHRyYSB0ZXh0IGluIHRoZSB0aXRsZSwgYXV0byBcZkJcLXljcm9wXGZSIGlzIGRpc2FibGVkLAoteDExdm5jIFxmQlwtcmVtb3RlX3ByZWZpeFxmUiBYMTFWTkNfQVBQU0hBUkVfQ01EOiBtZXNzYWdlIGNoYW5uZWwsCi14MTF2bmMgaW5pdGlhbCB3aW5kb3cgcG9zaXRpb24gaGludHMuICBTZWUgYWxzbyBFc2NhcGUgS2V5cwotYmVsb3cgZm9yIGFkZGl0aW9uYWwga2V5IGFuZCBtb3VzZSBiaW5kaW5ncy4KLS5UUAotXGZCXC1lc2NhcGUgXGZSXGZJc3RyXGZSCi1UaGlzIHNldHMgdGhlICdFc2NhcGUgS2V5cycgbW9kaWZpZXIgc2VxdWVuY2UgYW5kIGVuYWJsZXMKLWVzY2FwZSBrZXlzIG1vZGUuICBXaGVuIHRoZSBtb2RpZmllciBrZXlzIGVzY2FwZSBzZXF1ZW5jZQotaXMgaGVsZCBkb3duLCB0aGUgbmV4dCBrZXlzdHJva2UgaXMgaW50ZXJwcmV0ZWQgbG9jYWxseQotdG8gcGVyZm9ybSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0byB0aGUKLXJlbW90ZSBWTkMgc2VydmVyLgotCi1Vc2UgJ1xmQlwtZXNjYXBlXGZSIGRlZmF1bHQnIGZvciB0aGUgZGVmYXVsdCBtb2RpZmllciBzZXF1ZW5jZS4KLShVbml4OiBBbHRfTCxTdXBlcl9MIGFuZCBNYWNPU1g6IENvbnRyb2xfTCxNZXRhX0wpCi0KLUhlcmUgYXJlIHRoZSAnRXNjYXBlIEtleXM6IEhlbHArU2V0JyBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgUG9wdXA6Ci0KLUVzY2FwZSBLZXlzOiAgRW50ZXIgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2RpZmllciBrZXlzIHRvIGJlIHRoZSAnZXNjYXBlCi1zZXF1ZW5jZScuICBXaGVuIHRoZXNlIGtleXMgYXJlIGhlbGQgZG93biwgdGhlIG5leHQga2V5c3Ryb2tlIGlzCi1pbnRlcnByZXRlZCBsb2NhbGx5IHRvIGludm9rZSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0bwotdGhlIHJlbW90ZSBWTkMgc2VydmVyLiAgSW4gb3RoZXIgd29yZHMsIGEgc2V0IG9mICdIb3QgS2V5cycuCi0KLUhlcmUgaXMgdGhlIGxpc3Qgb2YgbG9jYWwga2V5IG1hcHBpbmdzIHRvIHNwZWNpYWwgYWN0aW9uczoKLQotcjogcmVmcmVzaCBkZXNrdG9wICBiOiB0b2dnbGUgYmVsbCAgYzogdG9nZ2xlIGZ1bGwtY29sb3IKLQotZjogZmlsZSB0cmFuc2ZlciAgICB4OiB4MTFjdXJzb3IgICAgejogdG9nZ2xlIFRpZ2h0L1pSTEUKLQotbDogZnVsbCBzY3JlZW4gICAgICBnOiBncmFiYWxsICAgICAgZTogZXNjYXBlIGtleXMgZGlhbG9nCi0KLXM6IHNjYWxlIGRpYWxvZyAgICAgKzogc2NhbGUgdXAgKD0pIC06IHNjYWxlIGRvd24gKF8pCi0KLXQ6IHRleHQgY2hhdCAgICAgICAgICAgICAgICAgICAgICAgIGE6IGFscGhhYmxlbmQgY3Vyc29yCi0KLVY6IHRvZ2dsZSB2aWV3b25seSAgUTogcXVpdCB2aWV3ZXIgIDEyMzQ1NjogVWx0cmFWTkMgc2NhbGUgMS9uCi0KLUFycm93IGtleXM6IHBhbiB0aGUgdmlld3BvcnQgYWJvdXQgMTAlIGZvciBlYWNoIGtleXByZXNzLgotCi1QYWdlVXAvUGFnZURvd246IHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgdmVydGljYWxseS4KLQotSG9tZS9FbmQ6IHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgaG9yaXpvbnRhbGx5LgotCi1LZXlQYWQgQXJyb3dzOiBwYW4gdGhlIHZpZXdwb3J0IGJ5IDEgcGl4ZWwgZm9yIGVhY2gga2V5cHJlc3MuCi0KLURyYWdnaW5nIHRoZSBNb3VzZSB3aXRoIEJ1dHRvbjEgcHJlc3NlZCBhbHNvIHBhbnMgdGhlIHZpZXdwb3J0LgotCi1DbGlja2luZyBNb3VzZSBCdXR0b24zIGJyaW5ncyB1cCB0aGUgUG9wdXAgTWVudS4KLQotVGhlIGFib3ZlIG1hcHBpbmdzIGFyZSBcZkJhbHdheXNcZlIgYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0Ci10aGUgRXNjYXBlIEtleXMgdmFsdWUgdG8gJ25ldmVyJy4KLQoteDExdm5jIC1hcHBzaGFyZSBob3Qta2V5czogIHgxMXZuYyBoYXMgYSBzaW1wbGUgYXBwbGljYXRpb24gc2hhcmluZyBtb2RlCi10aGF0IGVuYWJsZXMgdGhlIHZpZXdlci1zaWRlIHRvIG1vdmUsIHJlc2l6ZSwgb3IgcmFpc2UgdGhlIHJlbW90ZSB0b3BsZXZlbAotd2luZG93cy4gIFRvIGVuYWJsZSBpdCwgaG9sZCBkb3duIFNoaWZ0ICsgdGhlIEVzY2FwZSBLZXlzIGFuZCBwcmVzcyB0aGVzZToKLQotQXJyb3cga2V5czogbW92ZSB0aGUgcmVtb3RlIHdpbmRvdyBhcm91bmQgaW4gaXRzIGRlc2t0b3AuCi0KLVBhZ2VVcC9QYWdlRG4vSG9tZS9FbmQ6ICByZXNpemUgdGhlIHJlbW90ZSB3aW5kb3cuCi0KLSsvLTogcmFpc2Ugb3IgbG93ZXIgdGhlIHJlbW90ZSB3aW5kb3cuCi0KLU0gb3IgQnV0dG9uMSBtb3ZlIHdpbiB0byBsb2NhbCBwb3NpdGlvbjsgIEQgb3IgQnV0dG9uMzogZGVsZXRlIHJlbW90ZSB3aW4uCi0KLUlmIHRoZSBFc2NhcGUgS2V5cyB2YWx1ZSBiZWxvdyBpcyBzZXQgdG8gJ2RlZmF1bHQnIHRoZW4gYSBkZWZhdWx0IGxpc3Qgb2YKLW9mIG1vZGlmaWVyIGtleXMgaXMgdXNlZC4gIEZvciBVbml4IGl0IGlzOiBBbHRfTCxTdXBlcl9MIGFuZCBmb3IgTWFjT1NYIGl0Ci1pcyBDb250cm9sX0wsTWV0YV9MLiAgTm90ZTogdGhlIFN1cGVyX0wga2V5IHVzdWFsbHkgaGFzIGEgV2luZG93cyhUTSkgRmxhZwotb24gaXQuICBBbHNvIG5vdGUgdGhlIF9MIGFuZCBfUiBtZWFuIHRoZSBrZXkgaXMgb24gdGhlIExFRlQgb3IgUklHSFQgc2lkZQotb2YgdGhlIGtleWJvYXJkLgotCi1PbiBVbml4ICAgdGhlIGRlZmF1bHQgaXMgQWx0IGFuZCBXaW5kb3dzIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgotT24gTWFjT1NYIHRoZSBkZWZhdWx0IGlzIENvbnRyb2wgYW5kIENvbW1hbmQga2V5cyBvbiBMZWZ0IHNpZGUgb2Yga2V5Ym9hcmQuCi0KLUV4YW1wbGU6IFByZXNzIGFuZCBob2xkIHRoZSBBbHQgYW5kIFdpbmRvd3Mga2V5cyBvbiB0aGUgTEVGVCBzaWRlIG9mIHRoZQota2V5Ym9hcmQgYW5kIHRoZW4gcHJlc3MgJ2MnIHRvIHRvZ2dsZSB0aGUgZnVsbC1jb2xvciBzdGF0ZS4gIE9yIHByZXNzICd0JwotdG8gdG9nZ2xlIHRoZSB1bHRyYXZuYyBUZXh0IENoYXQgd2luZG93LCBldGMuCi0KLVRvIHVzZSBzb21ldGhpbmcgYmVzaWRlcyB0aGUgZGVmYXVsdCwgc3VwcGx5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgKG9yIGEKLXNpbmdsZSBvbmUpIGZyb206IFNoaWZ0X0wgU2hpZnRfUiBDb250cm9sX0wgQ29udHJvbF9SIEFsdF9MIEFsdF9SIE1ldGFfTAotTWV0YV9SIFN1cGVyX0wgU3VwZXJfUiBIeXBlcl9MIEh5cGVyX1Igb3IgTW9kZV9zd2l0Y2guCi0uVFAKLVxmQiBOZXcgUG9wdXAgYWN0aW9uczpcZlIKLQotIFZpZXdPbmx5OiAgICAgICAgICAgICAgICB+IC12aWV3b25seQotIERpc2FibGUgQmVsbDogICAgICAgICAgICB+IC1ub2JlbGwKLSBDdXJzb3IgU2hhcGU6ICAgICAgICAgICAgfiAtbm9jdXJzb3JzaGFwZQotIFgxMSBDdXJzb3I6ICAgICAgICAgICAgICB+IC14MTFjdXJzb3IKLSBDdXJzb3IgQWxwaGFibGVuZDogICAgICAgfiAtYWxwaGEKLSBUb2dnbGUgVGlnaHQvSGV4dGlsZTogICAgfiAtZW5jb2RpbmdzIGhleHRpbGUuLi4KLSBUb2dnbGUgVGlnaHQvWlJMRTogICAgICAgfiAtZW5jb2RpbmdzIHpybGUuLi4KLSBUb2dnbGUgWlJMRS9aWVdSTEU6ICAgICAgfiAtZW5jb2RpbmdzIHp5d3JsZS4uLgotIFF1YWxpdHkgTGV2ZWwgICAgICAgICAgICB+IC1xdWFsaXR5IChib3RoIFRpZ2h0IGFuZCBaWVdSTEUpCi0gQ29tcHJlc3MgTGV2ZWwgICAgICAgICAgIH4gLWNvbXByZXNzbGV2ZWwKLSBEaXNhYmxlIEpQRUc6ICAgICAgICAgICAgfiAtbm9qcGVnICAoVGlnaHQpCi0gUGlwZWxpbmUgVXBkYXRlcyAgICAgICAgIH4gLXBpcGVsaW5lCi0KLSBGdWxsIENvbG9yICAgICAgICAgICAgICAgICBhcyBtYW55IGNvbG9ycyBhcyBsb2NhbCBzY3JlZW4gYWxsb3dzLgotIEdyZXkgc2NhbGUgKDE2ICYgOC1icHApICB+IC1ncmV5LCBmb3IgbG93IGNvbG9ycyAxNi84YnBwIG1vZGVzIG9ubHkuCi0gMTYgYml0IGNvbG9yIChCR1I1NjUpICAgIH4gLTE2YnBwIC8gLWJncjU2NQotIDggIGJpdCBjb2xvciAoQkdSMjMzKSAgICB+IC1iZ3IyMzMKLSAyNTYgY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMjMzIGRlZmF1bHQgIyBvZiBjb2xvcnMuCi0gIDY0IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjIyMiAvIC11c2U2NAotICAgOCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IxMTEgLyAtdXNlOAotIFNjYWxlIFZpZXdlciAgICAgICAgICAgICB+IC1zY2FsZQotIEVzY2FwZSBLZXlzOiBUb2dnbGUgICAgICB+IC1lc2NhcGUKLSBFc2NhcGUgS2V5czogSGVscCtTZXQgICAgfiAtZXNjYXBlCi0gU2V0IFkgQ3JvcCAoeS1tYXgpICAgICAgIH4gLXljcm9wCi0gU2V0IFNjcm9sbGJhciBXaWR0aCAgICAgIH4gLXNid2lkdGgKLSBYR3JhYlNlcnZlciAgICAgICAgICAgICAgfiAtZ3JhYmFsbAotCi0gVWx0cmFWTkMgRXh0ZW5zaW9uczoKLQotICAgU2V0IDEvbiBTZXJ2ZXIgU2NhbGUgICAgIFVsdHJhdm5jIGV4dC4gU2NhbGUgZGVza3RvcCBieSAxL24uCi0gICBUZXh0IENoYXQgICAgICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBEbyBUZXh0IENoYXQuCi0gICBGaWxlIFRyYW5zZmVyICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBGaWxlIHhmZXIgdmlhIEphdmEgaGVscGVyLgotICAgU2luZ2xlIFdpbmRvdyAgICAgICAgICAgIFVsdHJhdm5jIGV4dC4gR3JhYiBhbmQgdmlldyBhIHNpbmdsZSB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdCB0aGVuIGNsaWNrIG9uIHRoZSB3aW5kb3cgeW91IHdhbnQpLgotICAgRGlzYWJsZSBSZW1vdGUgSW5wdXQgICAgIFVsdHJhdm5jIGV4dC4gVHJ5IHRvIHByZXZlbnQgaW5wdXQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2luZyBvZiBtb25pdG9yIGF0IHBoeXNpY2FsIGRpc3BsYXkuCi0KLSBOb3RlOiB0aGUgVWx0cmF2bmMgZXh0ZW5zaW9ucyBvbmx5IGFwcGx5IHRvIHNlcnZlcnMgdGhhdCBzdXBwb3J0Ci0gICAgICAgdGhlbS4gIHgxMXZuYy9saWJ2bmNzZXJ2ZXIgc3VwcG9ydHMgc29tZSBvZiB0aGVtLgotCi0gU2VuZCBDbGlwYm9hcmQgbm90IFByaW1hcnkgIH4gLXNlbmRjbGlwYm9hcmQKLSBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lICAgfiAtc2VuZGFsd2F5cwotCi0uU0ggRU5DT0RJTkdTCi1UaGUgc2VydmVyIHN1cHBsaWVzIGluZm9ybWF0aW9uIGluIHdoYXRldmVyIGZvcm1hdCBpcyBkZXNpcmVkIGJ5IHRoZQotY2xpZW50LCBpbiBvcmRlciB0byBtYWtlIHRoZSBjbGllbnQgYXMgZWFzeSBhcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQuIAotSWYgdGhlIGNsaWVudCByZXByZXNlbnRzIGl0c2VsZiBhcyBhYmxlIHRvIHVzZSBtdWx0aXBsZSBmb3JtYXRzLCB0aGUKLXNlcnZlciB3aWxsIGNob29zZSBvbmUuCi0KLS5JIFBpeGVsIGZvcm1hdAotcmVmZXJzIHRvIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmRpdmlkdWFsIHBpeGVsLiBUaGUgbW9zdCBjb21tb24KLWZvcm1hdHMgYXJlIDI0IGFuZCAxNiBiaXQgInRydWVcLWNvbG9yIiB2YWx1ZXMsIGFuZCA4XC1iaXQgImNvbG9yIG1hcCIKLXJlcHJlc2VudGF0aW9ucywgd2hlcmUgYW4gYXJiaXRyYXJ5IG1hcCBjb252ZXJ0cyB0aGUgY29sb3IgbnVtYmVyIHRvCi1SR0IgdmFsdWVzLgotCi0uSSBFbmNvZGluZwotcmVmZXJzIHRvIGhvdyBhIHJlY3RhbmdsZSBvZiBwaXhlbHMgYXJlIHNlbnQgKGFsbCBwaXhlbCBpbmZvcm1hdGlvbiBpbgotVk5DIGlzIHNlbnQgYXMgcmVjdGFuZ2xlcykuIEFsbCByZWN0YW5nbGVzIGNvbWUgd2l0aCBhIGhlYWRlciBnaXZpbmcKLXRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlIGFuZCBhbiBlbmNvZGluZyB0eXBlIHVzZWQgYnkKLXRoZSBkYXRhIHdoaWNoIGZvbGxvd3MuIFRoZXNlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3cuCi0uVFAKLS5CIFJhdwotVGhlIHJhdyBlbmNvZGluZyBzaW1wbHkgc2VuZHMgd2lkdGgqaGVpZ2h0IHBpeGVsIHZhbHVlcy4gQWxsIGNsaWVudHMKLWFyZSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMgZW5jb2RpbmcgdHlwZS4gUmF3IGlzIGFsc28gdGhlIGZhc3Rlc3QKLXdoZW4gdGhlIHNlcnZlciBhbmQgdmlld2VyIGFyZSBvbiB0aGUgc2FtZSBtYWNoaW5lLCBhcyB0aGUgY29ubmVjdGlvbgotc3BlZWQgaXMgZXNzZW50aWFsbHkgaW5maW5pdGUgYW5kIHJhdyBlbmNvZGluZyBtaW5pbWl6ZXMgcHJvY2Vzc2luZwotdGltZS4KLS5UUAotLkIgQ29weVJlY3QKLVRoZSBDb3B5IFJlY3RhbmdsZSBlbmNvZGluZyBpcyBlZmZpY2llbnQgd2hlbiBzb21ldGhpbmcgaXMgYmVpbmcKLW1vdmVkOyB0aGUgb25seSBkYXRhIHNlbnQgaXMgdGhlIGxvY2F0aW9uIG9mIGEgcmVjdGFuZ2xlIGZyb20gd2hpY2gKLWRhdGEgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgY3VycmVudCBsb2NhdGlvbi4gQ29weXJlY3QgY291bGQgYWxzbyBiZQotdXNlZCB0byBlZmZpY2llbnRseSB0cmFuc21pdCBhIHJlcGVhdGVkIHBhdHRlcm4uCi0uVFAKLS5CIFJSRQotVGhlIFJpc2VcLWFuZFwtUnVuXC1sZW5ndGhcLUVuY29kaW5nIGlzIGJhc2ljYWxseSBhIDJEIHZlcnNpb24gb2YKLXJ1blwtbGVuZ3RoIGVuY29kaW5nIChSTEUpLiBJbiB0aGlzIGVuY29kaW5nLCBhIHNlcXVlbmNlIG9mIGlkZW50aWNhbAotcGl4ZWxzIGFyZSBjb21wcmVzc2VkIHRvIGEgc2luZ2xlIHZhbHVlIGFuZCByZXBlYXQgY291bnQuIEluIFZOQywgdGhpcwotaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGJhY2tncm91bmQgY29sb3IsIGFuZCB0aGVuIHNwZWNpZmljYXRpb25zIG9mIGFuCi1hcmJpdHJhcnkgbnVtYmVyIG9mIHN1YnJlY3RhbmdsZXMgYW5kIGNvbG9yIGZvciBlYWNoLiBUaGlzIGlzIGFuCi1lZmZpY2llbnQgZW5jb2RpbmcgZm9yIGxhcmdlIGJsb2NrcyBvZiBjb25zdGFudCBjb2xvci4KLS5UUAotLkIgQ29SUkUKLVRoaXMgaXMgYSBtaW5vciB2YXJpYXRpb24gb24gUlJFLCB1c2luZyBhIG1heGltdW0gb2YgMjU1eDI1NSBwaXhlbAotcmVjdGFuZ2xlcy4gVGhpcyBhbGxvd3MgZm9yIHNpbmdsZVwtYnl0ZSB2YWx1ZXMgdG8gYmUgdXNlZCwgcmVkdWNpbmcKLXBhY2tldCBzaXplLiBUaGlzIGlzIGluIGdlbmVyYWwgbW9yZSBlZmZpY2llbnQsIGJlY2F1c2UgdGhlIHNhdmluZ3MKLWZyb20gc2VuZGluZyAxXC1ieXRlIHZhbHVlcyBnZW5lcmFsbHkgb3V0d2VpZ2hzIHRoZSBsb3NzZXMgZnJvbSB0aGUKLShyZWxhdGl2ZWx5IHJhcmUpIGNhc2VzIHdoZXJlIHZlcnkgbGFyZ2UgcmVnaW9ucyBhcmUgcGFpbnRlZCB0aGUgc2FtZQotY29sb3IuCi0uVFAKLS5CIEhleHRpbGUKLUhlcmUsIHJlY3RhbmdsZXMgYXJlIHNwbGl0IHVwIGluIHRvIDE2eDE2IHRpbGVzLCB3aGljaCBhcmUgc2VudCBpbiBhCi1wcmVkZXRlcm1pbmVkIG9yZGVyLiBUaGUgZGF0YSB3aXRoaW4gdGhlIHRpbGVzIGlzIHNlbnQgZWl0aGVyIHJhdyBvcgotYXMgYSB2YXJpYW50IG9uIFJSRS4gSGV4dGlsZSBlbmNvZGluZyBpcyB1c3VhbGx5IHRoZSBiZXN0IGNob2ljZSBmb3IKLXVzaW5nIGluIGhpZ2hcLXNwZWVkIG5ldHdvcmsgZW52aXJvbm1lbnRzIChlLmcuIEV0aGVybmV0IGxvY2FsXC1hcmVhCi1uZXR3b3JrcykuCi0uVFAKLS5CIFpsaWIKLVpsaWIgaXMgYSB2ZXJ5IHNpbXBsZSBlbmNvZGluZyB0aGF0IHVzZXMgemxpYiBsaWJyYXJ5IHRvIGNvbXByZXNzIHJhdwotcGl4ZWwgZGF0YS4gVGhpcyBlbmNvZGluZyBhY2hpZXZlcyBnb29kIGNvbXByZXNzaW9uLCBidXQgY29uc3VtZXMgYQotbG90IG9mIENQVSB0aW1lLiBTdXBwb3J0IGZvciB0aGlzIGVuY29kaW5nIGlzIHByb3ZpZGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIFZOQyBzZXJ2ZXJzIHRoYXQgbWlnaHQgbm90IHVuZGVyc3RhbmQgVGlnaHQKLWVuY29kaW5nIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gWmxpYiBpbiBuZWFybHkgYWxsIHJlYWxcLWxpZmUKLXNpdHVhdGlvbnMuCi0uVFAKLS5CIFRpZ2h0Ci1MaWtlIFpsaWIgZW5jb2RpbmcsIFRpZ2h0IGVuY29kaW5nIHVzZXMgemxpYiBsaWJyYXJ5IHRvIGNvbXByZXNzIHRoZQotcGl4ZWwgZGF0YSwgYnV0IGl0IHByZVwtcHJvY2Vzc2VzIGRhdGEgdG8gbWF4aW1pemUgY29tcHJlc3Npb24gcmF0aW9zLAotYW5kIHRvIG1pbmltaXplIENQVSB1c2FnZSBvbiBjb21wcmVzc2lvbi4gQWxzbywgSlBFRyBjb21wcmVzc2lvbiBtYXkKLWJlIHVzZWQgdG8gZW5jb2RlIGNvbG9yXC1yaWNoIHNjcmVlbiBhcmVhcyAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotXC1xdWFsaXR5IGFuZCBcLW5vanBlZyBvcHRpb25zIGFib3ZlKS4gVGlnaHQgZW5jb2RpbmcgaXMgdXN1YWxseSB0aGUKLWJlc3QgY2hvaWNlIGZvciBsb3dcLWJhbmR3aWR0aCBuZXR3b3JrIGVudmlyb25tZW50cyAoZS5nLiBzbG93IG1vZGVtCi1jb25uZWN0aW9ucykuCi0uVFAKLS5CIFpSTEUKLVRoZSBTU1ZOQyB2aWV3ZXIgaGFzIHBvcnRlZCB0aGUgUmVhbFZOQyAod3d3LnJlYWx2bmMuY29tKSBaUkxFIGVuY29kaW5nCi10byB0aGUgdW5peCB0aWdodHZuYyB2aWV3ZXIuCi0uVFAKLS5CIFpZV1JMRQotVGhlIFNTVk5DIHZpZXdlciBoYXMgcG9ydGVkIHRoZSBIaXRhY2hpIGxvc3N5IHdhdmVsZXQgYmFzZWQgWlJMRQotZW5jb2RpbmcgZnJvbSBodHRwOi8vbW9iaWxlLmhpdGFjaGktc3lzdGVtLmNvLmpwL3B1YmxpY2F0aW9ucy9aWVdSTEUvIAotdG8gdGhlIHVuaXggdGlnaHR2bmMgdmlld2VyLgotLlNIIFJFU09VUkNFUwotWCByZXNvdXJjZXMgdGhhdCBcZkJ2bmN2aWV3ZXJcZlIga25vd3MgYWJvdXQsIGFzaWRlIGZyb20gdGhlCi1ub3JtYWwgWHQgcmVzb3VyY2VzLCBhcmUgYXMgZm9sbG93czoKLS5UUAotLkIgc2hhcmVEZXNrdG9wCi1FcXVpdmFsZW50IG9mIFxmQlwtc2hhcmVkXGZSL1xmQlwtbm9zaGFyZWRcZlIgb3B0aW9ucy4gRGVmYXVsdCB0cnVlLgotLlRQCi0uQiB2aWV3T25seQotRXF1aXZhbGVudCBvZiBcZkJcLXZpZXdvbmx5XGZSIG9wdGlvbi4gRGVmYXVsdCBmYWxzZS4KLS5UUAotLkIgZnVsbFNjcmVlbgotRXF1aXZhbGVudCBvZiBcZkJcLWZ1bGxzY3JlZW5cZlIgb3B0aW9uLiBEZWZhdWx0IGZhbHNlLgotLlRQCi0uQiBncmFiS2V5Ym9hcmQKLUdyYWIga2V5Ym9hcmQgaW4gZnVsbC1zY3JlZW4gbW9kZS4gVGhpcyBjYW4gaGVscCB0byBzb2x2ZSBwcm9ibGVtcwotd2l0aCBsb3Npbmcga2V5Ym9hcmQgZm9jdXMuIERlZmF1bHQgZmFsc2UuCi0uVFAKLS5CIHJhaXNlT25CZWVwCi1FcXVpdmFsZW50IG9mIFxmQlwtbm9yYWlzZW9uYmVlcFxmUiBvcHRpb24sIHdoZW4gc2V0IHRvIGZhbHNlLiBEZWZhdWx0Ci10cnVlLgotLlRQCi0uQiBwYXNzd29yZEZpbGUKLUVxdWl2YWxlbnQgb2YgXGZCXC1wYXNzd2RcZlIgb3B0aW9uLgotLlRQCi0uQiB1c2VyTG9naW4KLUVxdWl2YWxlbnQgb2YgXGZCXC11c2VyXGZSIG9wdGlvbi4KLS5UUAotLkIgcGFzc3dvcmREaWFsb2cKLVdoZXRoZXIgdG8gdXNlIGEgZGlhbG9nIGJveCB0byBnZXQgdGhlIHBhc3N3b3JkICh0cnVlKSBvciBnZXQgaXQgZnJvbQotdGhlIHR0eSAoZmFsc2UpLiBJcnJlbGV2YW50IGlmIFxmQnBhc3N3b3JkRmlsZVxmUiBpcyBzZXQuIERlZmF1bHQKLWZhbHNlLgotLlRQCi0uQiBlbmNvZGluZ3MKLUVxdWl2YWxlbnQgb2YgXGZCXC1lbmNvZGluZ3NcZlIgb3B0aW9uLgotLlRQCi0uQiBjb21wcmVzc0xldmVsCi1FcXVpdmFsZW50IG9mIFxmQlwtY29tcHJlc3NsZXZlbFxmUiBvcHRpb24gKFRpZ2h0Vk5DXC1zcGVjaWZpYykuCi0uVFAKLS5CIHF1YWxpdHlMZXZlbAotRXF1aXZhbGVudCBvZiBcZkJcLXF1YWxpdHlcZlIgb3B0aW9uIChUaWdodFZOQ1wtc3BlY2lmaWMpLgotLlRQCi0uQiBlbmFibGVKUEVHCi1FcXVpdmFsZW50IG9mIFxmQlwtbm9qcGVnXGZSIG9wdGlvbiwgd2hlbiBzZXQgdG8gZmFsc2UuIERlZmF1bHQgdHJ1ZS4KLS5UUAotLkIgdXNlUmVtb3RlQ3Vyc29yCi1FcXVpdmFsZW50IG9mIFxmQlwtbm9jdXJzb3JzaGFwZVxmUiBvcHRpb24sIHdoZW4gc2V0IHRvIGZhbHNlCi0oVGlnaHRWTkNcLXNwZWNpZmljKS4gRGVmYXVsdCB0cnVlLgotLlRQCi0uQiB1c2VCR1IyMzMKLUVxdWl2YWxlbnQgb2YgXGZCXC1iZ3IyMzNcZlIgb3B0aW9uLiBEZWZhdWx0IGZhbHNlLgotLlRQCi0uQiBuQ29sb3VycwotV2hlbiB1c2luZyBCR1IyMzMsIHRyeSB0byBhbGxvY2F0ZSB0aGlzIG1hbnkgImV4YWN0IiBjb2xvcnMgZnJvbSB0aGUKLUJHUjIzMyBjb2xvciBjdWJlLiBXaGVuIHVzaW5nIGEgc2hhcmVkIGNvbG9ybWFwLCBzZXR0aW5nIHRoaXMgcmVzb3VyY2UKLWxvd2VyIGxlYXZlcyBtb3JlIGNvbG9ycyBmb3Igb3RoZXIgWCBjbGllbnRzLiBJcnJlbGV2YW50IHdoZW4gdXNpbmcKLXRydWVjb2xvci4gRGVmYXVsdCBpcyAyNTYgKGkuZS4gYWxsIG9mIHRoZW0pLgotLlRQCi0uQiB1c2VTaGFyZWRDb2xvdXJzCi1JZiB0aGUgbnVtYmVyIG9mICJleGFjdCIgQkdSMjMzIGNvbG9ycyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkIGlzIGxlc3MKLXRoYW4gMjU2IHRoZW4gdGhlIHJlc3QgYXJlIGZpbGxlZCBpbiB1c2luZyB0aGUgIm5lYXJlc3QiIGNvbG9ycwotYXZhaWxhYmxlLiBUaGlzIHJlc291cmNlIHNheXMgd2hldGhlciB0byBvbmx5IHVzZSB0aGUgImV4YWN0IiBCR1IyMzMKLWNvbG9ycyBmb3IgdGhpcyBwdXJwb3NlLCBvciB3aGV0aGVyIHRvIHVzZSBvdGhlciBjbGllbnRzJyAic2hhcmVkIgotY29sb3JzIGFzIHdlbGwuIERlZmF1bHQgdHJ1ZSAoaS5lLiB1c2Ugb3RoZXIgY2xpZW50cycgY29sb3JzKS4KLS5UUAotLkIgZm9yY2VPd25DbWFwCi1FcXVpdmFsZW50IG9mIFxmQlwtb3duY21hcFxmUiBvcHRpb24uIERlZmF1bHQgZmFsc2UuCi0uVFAKLS5CIGZvcmNlVHJ1ZUNvbG91cgotRXF1aXZhbGVudCBvZiBcZkJcLXRydWVjb2xvdXJcZlIgb3B0aW9uLiBEZWZhdWx0IGZhbHNlLgotLlRQCi0uQiByZXF1ZXN0ZWREZXB0aAotRXF1aXZhbGVudCBvZiBcZkJcLWRlcHRoXGZSIG9wdGlvbi4KLS5UUAotLkIgdXNlU2hhcmVkTWVtb3J5Ci1Vc2UgTUlUIHNoYXJlZCBtZW1vcnkgZXh0ZW5zaW9uIGlmIG9uIHRoZSBzYW1lIG1hY2hpbmUgYXMgdGhlIFgKLXNlcnZlci4gRGVmYXVsdCB0cnVlLgotLlRQCi0uQiB3bURlY29yYXRpb25XaWR0aCwgd21EZWNvcmF0aW9uSGVpZ2h0Ci1UaGUgdG90YWwgd2lkdGggYW5kIGhlaWdodCB0YWtlbiB1cCBieSB3aW5kb3cgbWFuYWdlciBkZWNvcmF0aW9ucy4KLVRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgVk5DIHZpZXdlciB3aW5kb3cuIAotRGVmYXVsdCBpcyB3aWR0aCA0LCBoZWlnaHQgMjQuCi0uVFAKLS5CIGJ1bXBTY3JvbGxUaW1lLCBidW1wU2Nyb2xsUGl4ZWxzCi1XaGVuIGluIGZ1bGwgc2NyZWVuIG1vZGUgYW5kIHRoZSBWTkMgZGVza3RvcCBpcyBiaWdnZXIgdGhhbiB0aGUgWAotZGlzcGxheSwgc2Nyb2xsaW5nIGhhcHBlbnMgd2hlbmV2ZXIgdGhlIG1vdXNlIGhpdHMgdGhlIGVkZ2Ugb2YgdGhlCi1zY3JlZW4uIFRoZSBtYXhpbXVtIHNwZWVkIG9mIHNjcm9sbGluZyBpcyBidW1wU2Nyb2xsUGl4ZWxzIHBpeGVscwotZXZlcnkgYnVtcFNjcm9sbFRpbWUgbWlsbGlzZWNvbmRzLiBUaGUgYWN0dWFsIHNwZWVkIG9mIHNjcm9sbGluZyB3aWxsCi1iZSBzbG93ZXIgdGhhbiB0aGlzLCBvZiBjb3Vyc2UsIGRlcGVuZGluZyBvbiBob3cgZmFzdCB5b3VyIG1hY2hpbmUgaXMuIAotRGVmYXVsdCAyMCBwaXhlbHMgZXZlcnkgMjUgbWlsbGlzZWNvbmRzLgotLlRQCi0uQiBwb3B1cEJ1dHRvbkNvdW50Ci1UaGUgbnVtYmVyIG9mIGJ1dHRvbnMgaW4gdGhlIHBvcHVwIHdpbmRvdy4gU2VlIHRoZSBSRUFETUUgZmlsZSBmb3IKLW1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9ucy4KLS5UUAotLkIgZGVidWcKLUZvciBkZWJ1Z2dpbmcuIERlZmF1bHQgZmFsc2UuCi0uVFAKLS5CIHJhd0RlbGF5LCBjb3B5UmVjdERlbGF5Ci1Gb3IgZGVidWdnaW5nLCBzZWUgdGhlIFJFQURNRSBmaWxlIGZvciBkZXRhaWxzLiBEZWZhdWx0IDAgKG9mZikuCi0uU0ggRU5WSVJPTk1FTlQKLVdoZW4gc3RhcnRlZCB3aXRoIHRoZSBcZkJcLXZpYVxmUiBvcHRpb24sIHZuY3ZpZXdlciByZWFkcyB0aGUKLVxmQlZOQ19WSUFfQ01EXGZSIGVudmlyb25tZW50IHZhcmlhYmxlLCBleHBhbmRzIHBhdHRlcm5zIGJlZ2lubmluZwotd2l0aCB0aGUgIiUiIGNoYXJhY3RlciwgYW5kIGV4ZWN1dGVzIHJlc3VsdCBhcyBhIGNvbW1hbmQgYXNzdW1pbmcgdGhhdAotaXQgd291bGQgY3JlYXRlIFRDUCB0dW5uZWwgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgVk5DIGNvbm5lY3Rpb24uIElmCi1ub3Qgc2V0LCB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRlZmF1bHRzIHRvICIvdXNyL2Jpbi9zc2ggLWYgLUwKLSVMOiVIOiVSICVHIHNsZWVwIDIwIi4KLQotVGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgcmVjb2duaXplZCBpbiB0aGUgXGZCVk5DX1ZJQV9DTURcZlIgKG5vdGUKLXRoYXQgYWxsIHRoZSBwYXR0ZXJucyAlRywgJUgsICVMIGFuZCAlUiBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNvbW1hbmQKLXRlbXBsYXRlKToKLS5UUAotLkIgJSUKLUEgbGl0ZXJhbCAiJSI7Ci0uVFAKLS5CICVHCi1nYXRld2F5IGhvc3QgbmFtZTsKLS5UUAotLkIgJUgKLXJlbW90ZSBWTkMgaG9zdCBuYW1lLCBhcyBrbm93biB0byB0aGUgZ2F0ZXdheTsKLS5UUAotLkIgJUwKLWxvY2FsIFRDUCBwb3J0IG51bWJlcjsKLS5UUAotLkIgJVIKLXJlbW90ZSBUQ1AgcG9ydCBudW1iZXIuCi0uU0ggU0VFIEFMU08KLVxmQnZuY3NlcnZlclxmUigxKSwgXGZCeDExdm5jXGZSKDEpLCBcZkJzc3ZuY1xmUigxKSwgXGZCWHZuY1xmUigxKSwgXGZCdm5jcGFzc3dkXGZSKDEpLAotXGZCdm5jY29ubmVjdFxmUigxKSwgXGZCc3NoXGZSKDEpLCBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLCBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3Nzdm5jLmh0bWwKLS5TSCBBVVRIT1JTCi1PcmlnaW5hbCBWTkMgd2FzIGRldmVsb3BlZCBpbiBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuIFRpZ2h0Vk5DCi1hZGRpdGlvbnMgd2FzIGltcGxlbWVudGVkIGJ5IENvbnN0YW50aW4gS2FwbGluc2t5LiBNYW55IG90aGVyIHBlb3BsZQotcGFydGljaXBhdGVkIGluIGRldmVsb3BtZW50LCB0ZXN0aW5nIGFuZCBzdXBwb3J0LiAgS2FybCBKLiBSdW5nZSAKLWFkZGVkIGFsbCBvZiB0aGUgU1NWTkMgcmVsYXRlZCBmZWF0dXJlcyBhbmQgaW1wcm92ZW1lbnRzLgotCi1cZkJNYW4gcGFnZSBhdXRob3JzOlxmUgotLmJyCi1NYXJjdXMgQnJpbmttYW5uIDxNYXJjdXMuQnJpbmttYW5uQHJ1aHItdW5pLWJvY2h1bS5kZT4sCi0uYnIKLVRlcnJhbiBNZWxjb25pYW4gPHRlcnJhbkBjb25zaXN0ZW50Lm9yZz4sCi0uYnIKLVRpbSBXYXVnaCA8dHdhdWdoQHJlZGhhdC5jb20+LAotLmJyCi1Db25zdGFudGluIEthcGxpbnNreSA8Y29uc3RAY2UuY2N0cHUuZWR1LnJ1PgotLmJyCi1LYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9SRUFETUUgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzMGRiOS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi1JbiB0aGlzIGRpcmVjdG9yeSB3ZSBoYXZlIHNvdXJjZSB6aXAvdGd6IGZpbGVzIGluIHppcC8sIHRoZSBwYXRjaGVzCi13ZSBjcmVhdGVkIGluIHBhdGNoZXMvLCBhIHRlbXBvcmFyeSBidWlsZCBkaXIgKHVzZWQgYnkgYnVpbGQudW5peCkKLWluIHRtcC8sIGFuZCB1bnBhY2tlZCBzb3VyY2VzIGluIHZuY191bml4c3JjLyBhbmQgc3R1bm5lbC00LjE0LyAodXNlZAotYnkgdGhlIGJ1aWxkLnVuaXggc2NyaXB0KS4KLQotU2VlIHRoZSBSRUFETUUgaW4gdGhlIGRpcmVjdG9yeSBvbmUgbGV2ZWwgdXAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvUkVBRE1FIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1MWU3ZS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BbGwgb2YgdGhlIHBhdGNoIGZpbGVzIGFuZCBzY3JpcHRzIGluIHRoaXMgZGlyZWN0b3J5IGFyZQotCi0gIENvcHlyaWdodCAoYykgMjAwNiBieSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotCi1hbmQgYXJlIGxpY2Vuc2VkIGJ5IHRoZSBHUEwuICBTZWUgdGhlIFJFQURNRSBhbmQgQ09QWUlORyBmaWxlcyB0d28KLWRpcmVjdG9yaWVzIHVwIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL19idW5kbGUgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvX2J1bmRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjBmYzdjMy4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvX2J1bmRsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIS9iaW4vc2gKLQotcm0gLXJmIC4vc3JjL3RtcC8qIHx8IGV4aXQgMQotdmVycz0xLjAuMjgKLQotY2QgLi4gfHwgZXhpdCAxCi0KLWNwIC1wIHNzdm5jL2Jpbi9zc3ZuY19jbWQgc3N2bmMvYmluL3RpZ2h0dm5jdmlld2VyCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWRlc3Q9Li90LnVuaXhfb25seQotcm0gLXJmICRkZXN0Ci1ta2RpciAtcCAkZGVzdCB8fCBleGl0IDEKLQotdGFyIGN2ZiAtIHNzdm5jL3tSRUFETUUsQ09QWUlORyxzc3ZuYy5kZXNrdG9wfSBzc3ZuYy9iaW4gc3N2bmMvVW5peCB8IChjZCAkZGVzdDsgdGFyIHh2ZiAtKQotcm0gLWYgJGRlc3Qvc3N2bmMvYmluLy5saW5raW4KLQotdGFyPXNzdm5jX3VuaXhfb25seS0ke3ZlcnN9LnRhci5negotKGNkICRkZXN0OyB0YXIgY3p2ZiAuLi8kdGFyIHNzdm5jKQotbHMgLWwgJHRhcgotcm0gLXJmICRkZXN0Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWRlc3Q9Li90LnVuaXhfbWluaW1hbAotcm0gLXJmICRkZXN0Ci1ta2RpciAtcCAkZGVzdCB8fCBleGl0IDEKLQotdGFyIGN2ZiAtIHNzdm5jL3tSRUFETUUsQ09QWUlORyxzc3ZuYy5kZXNrdG9wfSBzc3ZuYy9iaW4ve3NzKix1dGlsL3NzKn0gfCAoY2QgJGRlc3Q7IHRhciB4dmYgLSkKLQotdGFyPXNzdm5jX3VuaXhfbWluaW1hbC0ke3ZlcnN9LnRhci5negotKGNkICRkZXN0OyB0YXIgY3p2ZiAuLi8kdGFyIHNzdm5jKQotbHMgLWwgJHRhcgotcm0gLXJmICRkZXN0Ci0KLXRvcD0nIyEvYmluL3NoCi1uPTExCi10bXA9YG1rdGVtcCAtZCAiL3RtcC9zc3ZuYy5YWFhYWFgiYCB8fCBleGl0IDEKLWlmIFsgIlgkdG1wIiA9ICJYIiAtbyAhIC1kICIkdG1wIiBdOyB0aGVuIGV4aXQgMTsgZmkKLXRyYXAgImNkIC90bXA7IHJtIC1yZiAkdG1wIiAwIDIgMTUKLQotdGFpbCArJG4gIiQwIiB8IChjZCAkdG1wOyB0YXIgeGYgLSkgfHwgZXhpdCAxCi0kdG1wL2Jpbi9zc3ZuYyAiJEAiCi1leGl0IDAKLWRhdGFfXygpIHsnCi0KLXNjcj0uL3Nzdm5jLnNoCi1lY2hvICIkdG9wIiA+ICRzY3IKLShjZCBzc3ZuYzsgdGFyIGN2ZiAtIFJFQURNRSBDT1BZSU5HIHNzdm5jLmRlc2t0b3AgYmluL3tzcyosdXRpbC9zcyp9KSA+PiAkc2NyCi1jaG1vZCA3NTUgJHNjcgotbHMgLWwgJHNjcgotCi1pZiBbICJYJDEiID0gIlhxdWljayIgXTsgdGhlbgotCWV4aXQgMAotZmkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcm0gLWYgc3N2bmNfYWxsLSR2ZXJzLnppcAotcm0gLWYgc3N2bmMtJHZlcnMuemlwCi16aXAgLTkgLXIgc3N2bmNfYWxsLSR2ZXJzLnppcCBzc3ZuYwotemlwIC05IC1yIHNzdm5jLSR2ZXJzLnppcCBzc3ZuYyAteCAnKi56aXAnICcqLnRhci5neicKLXRhciBjdmYgLSAtLWV4Y2x1ZGU9JyouemlwJyAtLWV4Y2x1ZGU9JyoudGFyLmd6JyBzc3ZuYyB8IGd6aXAgLTkgPiAgc3N2bmMtJHZlcnMudGFyLmd6Ci10YXIgY3ZmIC0gLS1leGNsdWRlPScqLnppcCcgLS1leGNsdWRlPScqLnRhci5neicgLS1leGNsdWRlPScqLmRsbCcgLS1leGNsdWRlPScqLmV4ZScgLS1leGNsdWRlIHNzdm5jL1dpbmRvd3MvdXRpbCBzc3ZuYyB8IGd6aXAgLTkgPiAgc3N2bmNfbm9fd2luZG93cy0kdmVycy50YXIuZ3oKLQotZWNobwotbHMgLWwgc3N2bmMqLSR2ZXJzLioKLWVjaG8KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1kZXN0PS4vdC53aW5kb3dzX29ubHkKLXJtIC1yZiAke2Rlc3R9Ci1ta2RpciAtcCAkZGVzdCB8fCBleGl0IDEKLQotY3AgLXBSIHNzdm5jICRkZXN0Ci1ybSAtcmYgJGRlc3Qvc3N2bmMve3NyYyxiaW4sbWFufQotcm0gLXJmICRkZXN0L3Nzdm5jL01hY09TWAotcm0gLXJmICRkZXN0L3Nzdm5jL1VuaXgKLXJtICAtZiAkZGVzdC9zc3ZuYy9idWlsZC51bml4Ci1ybSAgLWYgJGRlc3Qvc3N2bmMvZmlsZWxpc3QudHh0Ci1jcCAtcCBzc3ZuYy9iaW4vdXRpbC9zc3ZuYy50Y2wgICRkZXN0L3Nzdm5jL1dpbmRvd3MvdXRpbAotCi16aXA9c3N2bmNfd2luZG93c19vbmx5LSR7dmVyc30uemlwCi1ybSAtZiAkemlwCi0oY2QgJGRlc3Q7IHppcCAtOSAtciAuLi8kemlwIHNzdm5jKQotCi1scyAtbCAkemlwCi1ybSAtcmYgJGRlc3QKLQotCi1zeW5jCi1lY2hvCi1mb3IgZyBpbiBzc3ZuYyotJHZlcnMqLmd6Ci1kbwotCW1kNXN1bSAkZwotCWd6aXAgLXQgJGcgfHwgKHRwdXQgYmVsOyBzbGVlcCAyKQotZG9uZQotZm9yIGcgaW4gc3N2bmMqLSR2ZXJzKi56aXAKLWRvCi0JbWQ1c3VtICRnCi1kb25lCi0KLXNsZWVwIDMKLWVjaG8KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9fZ2V0cGF0Y2hlcyBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9fZ2V0cGF0Y2hlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDEyZTFkMS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvX2dldHBhdGNoZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLQotaWYgWyAhIC1mIC4vX2dldHBhdGNoZXMgXTsgdGhlbgotCWxzIC1sIC4vX2dldHBhdGNoZXMKLQlleGl0IDEKLWZpCi0KLWNwIC1wIC9kaXN0L3NyYy9hcHBzL1ZOQy90aWdodF92bmNfMS4zZGV2NS90aWdodC12bmN2aWV3ZXIqcGF0Y2ggLgotY3AgLXAgL2Rpc3Qvc3JjL2FwcHMvVk5DL3RpZ2h0X3ZuY18xLjNkZXY1L3ZuY191bml4c3JjX3ZuY3ZpZXdlci5wYXRjaGVkLnRhciAuLi96aXBzLwotCi1jcCAtcCAvZGlzdC9zcmMvYXBwcy9WTkMvZXRjL2xpYnZuY3NlcnZlcl9jdnMvZXhwdHMvamF2YV9zc2wvdWx0cmEvdWx0cmFmdHAudGFyIC4uL3ppcHMvCi1jcCAtcCAvZGlzdC9zcmMvYXBwcy9WTkMvZXRjL2xpYnZuY3NlcnZlcl9jdnMvZXhwdHMvdm5jc3RvcmVwdy50YXIgLi4vemlwcy8KLQotY3AgLXAgL2Rpc3Qvc3JjL2FwcHMvVk5DL3RpZ2h0X3ZuY18xLjNkZXY1L3ZuY191bml4c3JjL3ZuY3ZpZXdlci92bmN2aWV3ZXIubWFuIC4uLy4uL21hbi9tYW4xL3Nzdm5jdmlld2VyLjEKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9fdm5jcGF0Y2hhcHBsaWVkIGIveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL192bmNwYXRjaGFwcGxpZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZjE5MzEuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL192bmNwYXRjaGFwcGxpZWQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1tYWtlIGNsZWFuCi1ybSAtZiAqLm8KLWNkIC4uLy4uCi10YXIgLWN2ZiAuLi8uLi96aXBzL3ZuY191bml4c3JjX3ZuY3ZpZXdlci5wYXRjaGVkLnRhciB2bmNfdW5peHNyYy92bmN2aWV3ZXIKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9zdHVubmVsLW1heGNvbm4ucGF0Y2ggYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvc3R1bm5lbC1tYXhjb25uLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjY1N2Q4Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy9zdHVubmVsLW1heGNvbm4ucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1kaWZmIC1OYXVyIHN0dW5uZWwub3JpZy9zcmMvY2xpZW50LmMgc3R1bm5lbC9zcmMvY2xpZW50LmMKLS0tLSBzdHVubmVsLm9yaWcvc3JjL2NsaWVudC5jCTIwMTAtMDQtMDQgMTc6MDA6MjkuMDAwMDAwMDAwIC0wNDAwCi0rKysgc3R1bm5lbC9zcmMvY2xpZW50LmMJMjAxMC0wNC0xMiAxNzoxMjo0Ny4wMDAwMDAwMDAgLTA0MDAKLUBAIC0xODcsNiArMTg3LDcgQEAKLSAgICAgZW50ZXJfY3JpdGljYWxfc2VjdGlvbihDUklUX0NMSUVOVFMpOyAvKiBmb3IgbXVsdGktY3B1IG1hY2hpbmVzICovCi0gICAgIHNfbG9nKExPR19ERUJVRywgIlNlcnZpY2UgJXMgZmluaXNoZWQgKCVkIGxlZnQpIiwgYy0+b3B0LT5zZXJ2bmFtZSwKLSAgICAgICAgIC0tbnVtX2NsaWVudHMpOwotKyAgICBpZiAoZ2V0ZW52KCJTVFVOTkVMX09OQ0UiKSkge2ZwcmludGYoc3RkZXJyLCAic3R1bm5lbDogZXhpdGluZy5cbiIpOyBleGl0KDApO30KLSAgICAgbGVhdmVfY3JpdGljYWxfc2VjdGlvbihDUklUX0NMSUVOVFMpOwotICNlbmRpZgotIH0KLWRpZmYgLU5hdXIgc3R1bm5lbC5vcmlnL3NyYy9uZXR3b3JrLmMgc3R1bm5lbC9zcmMvbmV0d29yay5jCi0tLS0gc3R1bm5lbC5vcmlnL3NyYy9uZXR3b3JrLmMJMjAxMC0wMi0wNCAwNTozMTo0NS4wMDAwMDAwMDAgLTA1MDAKLSsrKyBzdHVubmVsL3NyYy9uZXR3b3JrLmMJMjAxMC0wNC0xMiAxNzoxMzo1My4wMDAwMDAwMDAgLTA0MDAKLUBAIC00MzcsNiArNDM3LDcgQEAKLSAgICAgaWYoKHBpZD13YWl0KCZzdGF0dXMpKT4wKSB7Ci0gICAgICAgICAtLW51bV9jbGllbnRzOyAvKiBvbmUgY2xpZW50IGxlc3MgKi8KLSAjZW5kaWYKLSsgICAgaWYgKGdldGVudigiU1RVTk5FTF9PTkNFIikpIGV4aXQoMCk7Ci0gI2lmZGVmIFdJRlNJR05BTEVECi0gICAgICAgICBpZihXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0gICAgICAgICAgICAgc19sb2coTE9HX0RFQlVHLCAiUHJvY2VzcyAlZCB0ZXJtaW5hdGVkIG9uIHNpZ25hbCAlZCAoJWQgbGVmdCkiLAotZGlmZiAtTmF1ciBzdHVubmVsLm9yaWcvc3JjL29wdGlvbnMuYyBzdHVubmVsL3NyYy9vcHRpb25zLmMKLS0tLSBzdHVubmVsLm9yaWcvc3JjL29wdGlvbnMuYwkyMDEwLTA0LTA1IDE0OjQ0OjQzLjAwMDAwMDAwMCAtMDQwMAotKysrIHN0dW5uZWwvc3JjL29wdGlvbnMuYwkyMDEwLTA0LTEyIDE3OjE5OjE4LjAwMDAwMDAwMCAtMDQwMAotQEAgLTQ3MCw2ICs0NzAsNyBAQAotICAgICBzd2l0Y2goY21kKSB7Ci0gICAgIGNhc2UgQ01EX0lOSVQ6Ci0gICAgICAgICBuZXdfZ2xvYmFsX29wdGlvbnMub3B0aW9uLnN5c2xvZz0xOwotKyAgICAgICAgaWYgKGdldGVudigiU1RVTk5FTF9OT19TWVNMT0ciKSkgbmV3X2dsb2JhbF9vcHRpb25zLm9wdGlvbi5zeXNsb2c9MDsKLSAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIENNRF9FWEVDOgotICAgICAgICAgaWYoc3RyY2FzZWNtcChvcHQsICJzeXNsb2ciKSkKLWRpZmYgLU5hdXIgc3R1bm5lbC5vcmlnL3NyYy9zdHVubmVsLmMgc3R1bm5lbC9zcmMvc3R1bm5lbC5jCi0tLS0gc3R1bm5lbC5vcmlnL3NyYy9zdHVubmVsLmMJMjAxMC0wMi0yNSAwNDo1NzoxMS4wMDAwMDAwMDAgLTA1MDAKLSsrKyBzdHVubmVsL3NyYy9zdHVubmVsLmMJMjAxMC0wNC0xMiAxNzoxNjozMy4wMDAwMDAwMDAgLTA0MDAKLUBAIC0zMDYsNiArMzA2LDcgQEAKLSAgICAgICAgIG1heF9jbGllbnRzPTA7Ci0gICAgICAgICBzX2xvZyhMT0dfTk9USUNFLCAiTm8gbGltaXQgZGV0ZWN0ZWQgZm9yIHRoZSBudW1iZXIgb2YgY2xpZW50cyIpOwotICAgICB9Ci0rICAgIGlmIChnZXRlbnYoIlNUVU5ORUxfTUFYX0NMSUVOVFMiKSkgbWF4X2NsaWVudHMgPSBhdG9pKGdldGVudigiU1RVTk5FTF9NQVhfQ0xJRU5UUyIpKTsKLSB9Ci0gCi0gI2lmZGVmIEhBVkVfQ0hST09UCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvdGlnaHQtdm5jdmlld2VyLWZ1bGwucGF0Y2ggYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvdGlnaHQtdm5jdmlld2VyLWZ1bGwucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2RkMzEuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvZW5oYW5jZWRfdGlnaHR2bmNfdmlld2VyL3NyYy9wYXRjaGVzL3RpZ2h0LXZuY3ZpZXdlci1mdWxsLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQzNzAgKzAsMCBAQAotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvVm5jdmlld2VyIHZuY191bml4c3JjL3ZuY3ZpZXdlci9WbmN2aWV3ZXIKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9WbmN2aWV3ZXIJMjAwMy0wMi0wNyAwNTozMDo1Ny4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvVm5jdmlld2VyCTIwMDgtMDgtMjQgMTY6MjY6MDEuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMSwyMCArMSwyMiBAQAotICEKLS0hIEFwcGxpY2F0aW9uIGRlZmF1bHRzIGZpbGUgZm9yIHZuY3ZpZXdlci4KLSshIEFwcGxpY2F0aW9uIGRlZmF1bHRzIGZpbGUgZm9yIFNTVk5DIHZuY3ZpZXdlci4KLSshCi0rISBOLkIuOiBZb3Ugd2lsbCBuZWVkIHRvIHJlbmFtZSB0aGlzIGZpbGUgdG8gYmUgIlNzdm5jIiBpbnN0ZWFkIG9mICJWbmN2aWV3ZXIiCi0gIQotIAotIAotICEKLSAhIFRoZSB0aXRsZSBvZiB0aGUgbWFpbiB3aW5kb3cuICAiJXMiIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGRlc2t0b3AgbmFtZS4KLS0hIAotKyEKLSAKLS1WbmN2aWV3ZXIudGl0bGU6IFRpZ2h0Vk5DOiAlcwotK1Nzdm5jLnRpdGxlOiBTU1ZOQzogJXMgUHJlc3MgRjggZm9yIE1lbnUKLSAKLSAKLSAhCi0gISBUcmFuc2xhdGlvbnMgb24gdGhlIG1haW4gd2luZG93LgotICEKLSAKLS1WbmN2aWV3ZXIudHJhbnNsYXRpb25zOlwKLStTc3ZuYy50cmFuc2xhdGlvbnM6XAotICAgPEVudGVyPjogU2VsZWN0aW9uVG9WTkMoKVxuXAotICAgPExlYXZlPjogU2VsZWN0aW9uRnJvbVZOQygpCi0gCi1AQCAtMjMsNyArMjUsNyBAQAotICEgVW5jb21tZW50IHRvIGdyYWIgdGhlIGtleWJvYXJkIGluIGZ1bGwtc2NyZWVuIG1vZGUuCi0gIQotIAotLSEgVm5jdmlld2VyLmdyYWJLZXlib2FyZDogVHJ1ZQotKyEgU3N2bmMuZ3JhYktleWJvYXJkOiBUcnVlCi0gCi0gCi0gIQotQEAgLTQzLDYgKzQ1LDkgQEAKLSAqdmlld3BvcnQudXNlUmlnaHQ6IFRydWUKLSAqdmlld3BvcnQqU2Nyb2xsYmFyKnRodW1iOiBOb25lCi0gCi0rKnZpZXdwb3J0Lmhvcml6b250YWwuaGVpZ2h0OiAgIDYKLSsqdmlld3BvcnQudmVydGljYWwud2lkdGg6ICAgNgotKwotIAotICEKLSAhIERlZmF1bHQgdHJhbnNsYXRpb25zIG9uIGRlc2t0b3Agd2luZG93LgotQEAgLTUwLDg5ICs1NSw1OTEgQEAKLSAKLSAqZGVza3RvcC5iYXNlVHJhbnNsYXRpb25zOlwKLSAgIDxLZXk+Rjg6IFNob3dQb3B1cCgpXG5cCi0rICA8S2V5PkY5OiBUb2dnbGVGdWxsU2NyZWVuKClcblwKLSAgIDxCdXR0b25QcmVzcz46IFNlbmRSRkJFdmVudCgpXG5cCi0gICA8QnV0dG9uUmVsZWFzZT46IFNlbmRSRkJFdmVudCgpXG5cCi0gICA8TW90aW9uPjogU2VuZFJGQkV2ZW50KClcblwKLSAgIDxLZXlQcmVzcz46IFNlbmRSRkJFdmVudCgpXG5cCi0gICA8S2V5UmVsZWFzZT46IFNlbmRSRkJFdmVudCgpCi0gCi0rKnZpZXdwb3J0Lmhvcml6b250YWwudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxLZXlQcmVzcz5SaWdodDogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5SaWdodDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPkxlZnQ6ICBTdGFydFNjcm9sbChCYWNrd2FyZClcblwKLSsgICAgIDxLZXlSZWxlYXNlPkxlZnQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5OZXh0OiAgU3RhcnRTY3JvbGwoRm9yd2FyZClcblwKLSsgICAgIDxLZXlSZWxlYXNlPk5leHQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5QcmlvcjogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+UHJpb3I6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz56OiAgU3RhcnRTY3JvbGwoRm9yd2FyZClcblwKLSsgICAgIDxLZXlSZWxlYXNlPno6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5hOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5hOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXG5cCi0rICAgICA8S2V5UHJlc3M+ZjogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5mOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXG5cCi0rICAgICA8S2V5UHJlc3M+YjogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+YjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPkRvd246ICBTdGFydFNjcm9sbChGb3J3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+RG93bjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPlVwOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5VcDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKQotKwotKyp2aWV3cG9ydC52ZXJ0aWNhbC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPEtleVByZXNzPkRvd246ICBTdGFydFNjcm9sbChGb3J3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+RG93bjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPlVwOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5VcDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPk5leHQ6ICBTdGFydFNjcm9sbChGb3J3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+TmV4dDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPlByaW9yOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5QcmlvcjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPno6ICBTdGFydFNjcm9sbChGb3J3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+ejogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxuXAotKyAgICAgPEtleVByZXNzPmE6ICBTdGFydFNjcm9sbChCYWNrd2FyZClcblwKLSsgICAgIDxLZXlSZWxlYXNlPmE6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5mOiAgU3RhcnRTY3JvbGwoRm9yd2FyZClcblwKLSsgICAgIDxLZXlSZWxlYXNlPmY6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5iOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5iOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXG5cCi0rICAgICA8S2V5UHJlc3M+UmlnaHQ6ICBTdGFydFNjcm9sbChGb3J3YXJkKVxuXAotKyAgICAgPEtleVJlbGVhc2U+UmlnaHQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcblwKLSsgICAgIDxLZXlQcmVzcz5MZWZ0OiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXG5cCi0rICAgICA8S2V5UmVsZWFzZT5MZWZ0OiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpCi0rCi0gCi0gIQotICEgRGlhbG9nIGJveGVzCi0gIQotIAotICpzZXJ2ZXJEaWFsb2cuZGlhbG9nLmxhYmVsOiBWTkMgc2VydmVyOgotKwotICpzZXJ2ZXJEaWFsb2cuZGlhbG9nLnZhbHVlOgotKwotICpzZXJ2ZXJEaWFsb2cuZGlhbG9nLnZhbHVlLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0tICA8S2V5PlJldHVybjogU2VydmVyRGlhbG9nRG9uZSgpCi0rICAgICA8S2V5PlJldHVybjogU2VydmVyRGlhbG9nRG9uZSgpCi0rCi0rKnljcm9wRGlhbG9nLmRpYWxvZy5sYWJlbDogWSBDcm9wIChtYXgtaGVpZ2h0IGluIHBpeGVscyk6Ci0rCi0rKnljcm9wRGlhbG9nLmRpYWxvZy52YWx1ZToKLSsKLSsqeWNyb3BEaWFsb2cuZGlhbG9nLnZhbHVlLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8S2V5PlJldHVybjogWUNyb3BEaWFsb2dEb25lKCkKLSsKLSsqc2NiYXJEaWFsb2cuZGlhbG9nLmxhYmVsOiBTY3JvbGwgQmFycyB3aWR0aDoKLSsKLSsqc2NiYXJEaWFsb2cuZGlhbG9nLnZhbHVlOgotKwotKypzY2JhckRpYWxvZy5kaWFsb2cudmFsdWUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxLZXk+UmV0dXJuOiBTY2JhckRpYWxvZ0RvbmUoKQotKwotKypzY2FsZURpYWxvZy5kaWFsb2cubGFiZWw6IEludGVnZXIgbiBmb3IgMS9uIHNlcnZlciBzY2FsaW5nOgotKwotKypzY2FsZURpYWxvZy5kaWFsb2cudmFsdWU6Ci0rCi0rKnNjYWxlRGlhbG9nLmRpYWxvZy52YWx1ZS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPEtleT5SZXR1cm46IFNjYWxlRGlhbG9nRG9uZSgpCi0gCi0gKnBhc3N3b3JkRGlhbG9nLmRpYWxvZy5sYWJlbDogUGFzc3dvcmQ6Ci0rCi0gKnBhc3N3b3JkRGlhbG9nLmRpYWxvZy52YWx1ZToKLSsKLSAqcGFzc3dvcmREaWFsb2cuZGlhbG9nLnZhbHVlLkFzY2lpU2luay5lY2hvOiBGYWxzZQotKwotICpwYXNzd29yZERpYWxvZy5kaWFsb2cudmFsdWUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLS0gIDxLZXk+UmV0dXJuOiBQYXNzd29yZERpYWxvZ0RvbmUoKQotKyAgICAgPEtleT5SZXR1cm46IFBhc3N3b3JkRGlhbG9nRG9uZSgpCi0gCi0gCi0gIQotICEgUG9wdXAgd2luZG93IGFwcGVhcmFuY2UKLSAhCi0gCi0tKnBvcHVwLnRpdGxlOiBUaWdodFZOQyBwb3B1cAotKypwb3B1cC50aXRsZTogU1NWTkMgcG9wdXAKLSsKLSAqcG9wdXAqYmFja2dyb3VuZDogZ3JleQotLSpwb3B1cCpmb250OiAtKi1oZWx2ZXRpY2EtYm9sZC1yLSotKi0xNi0qLSotKi0qLSotKi0qCi0tKnBvcHVwLmJ1dHRvbkZvcm0uQ29tbWFuZC5ib3JkZXJXaWR0aDogMAotLSpwb3B1cC5idXR0b25Gb3JtLlRvZ2dsZS5ib3JkZXJXaWR0aDogMAotKwotKypwb3B1cCpmb250X29sZDogLSotaGVsdmV0aWNhLWJvbGQtci0qLSotMTYtKi0qLSotKi0qLSotKgotKwotKypwb3B1cCpmb250OiAtKi1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLTEyLSotKi0qLSotKi0qLSoKLSsKLSsqcG9wdXAuYnV0dG9uRm9ybSouQ29tbWFuZC5ib3JkZXJXaWR0aDogMAotKwotKypwb3B1cC5idXR0b25Gb3JtKi5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAKLSsKLSsqc2NhbGVOLnRpdGxlOiAxL24gc2NhbGUKLSsKLSsqc2NhbGVOKmJhY2tncm91bmQ6IGdyZXkKLSsKLSsqc2NhbGVOKmZvbnQ6IC0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKgotKwotKypzY2FsZU4uYnV0dG9uRm9ybS5Db21tYW5kLmJvcmRlcldpZHRoOiAwCi0rCi0rKnNjYWxlTi5idXR0b25Gb3JtLlRvZ2dsZS5ib3JkZXJXaWR0aDogMAotKwotKypxdWFsaXR5LnRpdGxlOiBxdWFsaXR5Ci0rCi0rKnF1YWxpdHkqYmFja2dyb3VuZDogZ3JleQotKwotKypxdWFsaXR5KmZvbnQ6IC0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKgotKwotKypxdWFsaXR5LmJ1dHRvbkZvcm0uQ29tbWFuZC5ib3JkZXJXaWR0aDogMAotKwotKypxdWFsaXR5LmJ1dHRvbkZvcm0uVG9nZ2xlLmJvcmRlcldpZHRoOiAwCi0rCi0rKmNvbXByZXNzLnRpdGxlOiBjb21wcmVzcwotKwotKypjb21wcmVzcypiYWNrZ3JvdW5kOiBncmV5Ci0rCi0rKmNvbXByZXNzKmZvbnQ6IC0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKgotKwotKypjb21wcmVzcy5idXR0b25Gb3JtLkNvbW1hbmQuYm9yZGVyV2lkdGg6IDAKLSsKLSsqY29tcHJlc3MuYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAKLSsKLSAKLSAhCi0gISBUcmFuc2xhdGlvbnMgb24gcG9wdXAgd2luZG93IC0gc2VuZCBrZXkgcHJlc3NlcyB0aHJvdWdoCi0gIQotIAotICpwb3B1cC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZSA8TWVzc2FnZT5XTV9QUk9UT0NPTFM6IEhpZGVQb3B1cCgpCi0rCi0gKnBvcHVwLmJ1dHRvbkZvcm0udHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLS0gIDxLZXlQcmVzcz46IFNlbmRSRkJFdmVudCgpIEhpZGVQb3B1cCgpCi0rICAgICA8S2V5UHJlc3M+OiBTZW5kUkZCRXZlbnQoKSBIaWRlUG9wdXAoKQotIAotIAotICEKLSAhIFBvcHVwIGJ1dHRvbnMKLSAhCi0gCi0tKnBvcHVwQnV0dG9uQ291bnQ6IDgKLSsqcG9wdXBCdXR0b25Db3VudDogMzgKLSsKLSsqcG9wdXBCdXR0b25CcmVhazogMTkKLSAKLSAqcG9wdXAqYnV0dG9uMS5sYWJlbDogRGlzbWlzcyBwb3B1cAotKwotICpwb3B1cCpidXR0b24xLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0tICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlUG9wdXAoKQotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVBvcHVwKCkKLSAKLSAqcG9wdXAqYnV0dG9uMi5sYWJlbDogUXVpdCB2aWV3ZXIKLSsKLSAqcG9wdXAqYnV0dG9uMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotLSAgPEJ0bjFEb3duPiw8QnRuMVVwPjogUXVpdCgpCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBRdWl0KCkKLSsKLSsqcG9wdXAqYnV0dG9uMy5sYWJlbDogRnVsbCBzY3JlZW4gIChhbHNvIEY5KQotIAotLSpwb3B1cCpidXR0b24zLmxhYmVsOiBGdWxsIHNjcmVlbgotICpwb3B1cCpidXR0b24zLnR5cGU6IHRvZ2dsZQotKwotICpwb3B1cCpidXR0b24zLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0tICA8VmlzaWJsZT46IFNldEZ1bGxTY3JlZW5TdGF0ZSgpXG5cCi0tICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBIaWRlUG9wdXAoKSBUb2dnbGVGdWxsU2NyZWVuKCkKLSsgICAgIDxWaXNpYmxlPjogU2V0RnVsbFNjcmVlblN0YXRlKClcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZUZ1bGxTY3JlZW4oKSBIaWRlUG9wdXAoKQotIAotICpwb3B1cCpidXR0b240LmxhYmVsOiBDbGlwYm9hcmQ6IGxvY2FsIC0+IHJlbW90ZQotKwotICpwb3B1cCpidXR0b240LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0tICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpIEhpZGVQb3B1cCgpCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpIEhpZGVQb3B1cCgpCi0gCi0gKnBvcHVwKmJ1dHRvbjUubGFiZWw6IENsaXBib2FyZDogbG9jYWwgPC0gcmVtb3RlCi0rCi0gKnBvcHVwKmJ1dHRvbjUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLS0gIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNlbGVjdGlvbkZyb21WTkMoYWx3YXlzKSBIaWRlUG9wdXAoKQotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2VsZWN0aW9uRnJvbVZOQyhhbHdheXMpIEhpZGVQb3B1cCgpCi0gCi0gKnBvcHVwKmJ1dHRvbjYubGFiZWw6IFJlcXVlc3QgcmVmcmVzaAotKwotICpwb3B1cCpidXR0b242LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0tICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZW5kUkZCRXZlbnQoZmJ1cGRhdGUpIEhpZGVQb3B1cCgpCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZW5kUkZCRXZlbnQoZmJ1cGRhdGUpIEhpZGVQb3B1cCgpCi0gCi0gKnBvcHVwKmJ1dHRvbjcubGFiZWw6IFNlbmQgY3RybC1hbHQtZGVsCi0rCi0gKnBvcHVwKmJ1dHRvbjcudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLS0gIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNlbmRSRkJFdmVudChrZXlkb3duLENvbnRyb2xfTClcCi0tICAgICAgICAgICAgICAgICAgICAgICBTZW5kUkZCRXZlbnQoa2V5ZG93bixBbHRfTClcCi0tICAgICAgICAgICAgICAgICAgICAgICBTZW5kUkZCRXZlbnQoa2V5LERlbGV0ZSlcCi0tICAgICAgICAgICAgICAgICAgICAgICBTZW5kUkZCRXZlbnQoa2V5dXAsQWx0X0wpXAotLSAgICAgICAgICAgICAgICAgICAgICAgU2VuZFJGQkV2ZW50KGtleXVwLENvbnRyb2xfTClcCi0tICAgICAgICAgICAgICAgICAgICAgICBIaWRlUG9wdXAoKQotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2VuZFJGQkV2ZW50KGtleWRvd24sQ29udHJvbF9MKSAgICAgU2VuZFJGQkV2ZW50KGtleWRvd24sQWx0X0wpICAgICBTZW5kUkZCRXZlbnQoa2V5LERlbGV0ZSkgICAgIFNlbmRSRkJFdmVudChrZXl1cCxBbHRfTCkgICAgIFNlbmRSRkJFdmVudChrZXl1cCxDb250cm9sX0wpICAgICBIaWRlUG9wdXAoKQotIAotICpwb3B1cCpidXR0b244LmxhYmVsOiBTZW5kIEY4Ci0rCi0gKnBvcHVwKmJ1dHRvbjgudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLS0gIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNlbmRSRkJFdmVudChrZXksRjgpIEhpZGVQb3B1cCgpCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZW5kUkZCRXZlbnQoa2V5LEY4KSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b245LmxhYmVsOiBTZW5kIEY5Ci0rCi0rKnBvcHVwKmJ1dHRvbjkudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNlbmRSRkJFdmVudChrZXksRjkpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjEwLmxhYmVsOiBWaWV3T25seQotKwotKypwb3B1cCpidXR0b24xMC50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMTAudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Vmlld09ubHlTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVWaWV3T25seSgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjExLmxhYmVsOiBEaXNhYmxlIEJlbGwKLSsKLSsqcG9wdXAqYnV0dG9uMTEudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjExLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEJlbGxTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVCZWxsKCkgSGlkZVBvcHVwKCkKLSsKLSsqcG9wdXAqYnV0dG9uMTIubGFiZWw6IEN1cnNvciBTaGFwZQotKwotKypwb3B1cCpidXR0b24xMi50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMTIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q3Vyc29yU2hhcGVTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVDdXJzb3JTaGFwZSgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjEzLmxhYmVsOiBYMTEgQ3Vyc29yCi0rCi0rKnBvcHVwKmJ1dHRvbjEzLnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24xMy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRYMTFDdXJzb3JTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVYMTFDdXJzb3IoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24xNC5sYWJlbDogQ3Vyc29yIEFscGhhYmxlbmQKLSsKLSsqcG9wdXAqYnV0dG9uMTQudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjE0LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEN1cnNvckFscGhhU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlQ3Vyc29yQWxwaGEoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24xNS5sYWJlbDogVG9nZ2xlIFRpZ2h0L1pSTEUKLSsKLSsqcG9wdXAqYnV0dG9uMTUudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjE1LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFpSTEVTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVUaWdodFpSTEUoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24xNi5sYWJlbDogVG9nZ2xlIFpSTEUvWllXUkxFCi0rCi0rKnBvcHVwKmJ1dHRvbjE2LnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24xNi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRaWVdSTEVTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVaUkxFWllXUkxFKCkgSGlkZVBvcHVwKCkKLSsKLSsqcG9wdXAqYnV0dG9uMTcubGFiZWw6IFF1YWxpdHkgTGV2ZWwKLSsKLSsqcG9wdXAqYnV0dG9uMTcudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNob3dRdWFsaXR5KCkKLSsKLSsqcG9wdXAqYnV0dG9uMTgubGFiZWw6IENvbXByZXNzIExldmVsCi0rCi0rKnBvcHVwKmJ1dHRvbjE4LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlUG9wdXAoKSBTaG93Q29tcHJlc3MoKQotKwotKypwb3B1cCpidXR0b24xOS5sYWJlbDogRGlzYWJsZSBKUEVHCi0rCi0rKnBvcHVwKmJ1dHRvbjE5LnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24xOS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXROT0pQRUdTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVKUEVHKCkgSGlkZVBvcHVwKCkKLSsKLSsqcG9wdXAqYnV0dG9uMjAubGFiZWw6IEZ1bGwgQ29sb3IKLSsKLSsqcG9wdXAqYnV0dG9uMjAudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjIwLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEZ1bGxDb2xvclN0YXRlKClcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZUZ1bGxDb2xvcigpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjIxLmxhYmVsOiBHcmV5IFNjYWxlICgxNiAmIDgtYnBwKQotKwotKypwb3B1cCpidXR0b24yMS50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMjEudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0R3JleVNjYWxlU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlR3JleVNjYWxlKCkgSGlkZVBvcHVwKCkKLSsKLSsqcG9wdXAqYnV0dG9uMjIubGFiZWw6IDE2IGJpdCBjb2xvciAoQkdSNTY1KQotKwotKypwb3B1cCpidXR0b24yMi50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMjIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0MTZicHBTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGUxNmJwcCgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjIzLmxhYmVsOiA4ICAgYml0IGNvbG9yIChCR1IyMzMpCi0rCi0rKnBvcHVwKmJ1dHRvbjIzLnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24yMy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXQ4YnBwU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlOGJwcCgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjI0LmxhYmVsOiAtICAgICAyNTYgY29sb3JzCi0rCi0rKnBvcHVwKmJ1dHRvbjI0LnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24yNC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXQyNTZDb2xvcnNTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGUyNTZDb2xvcnMoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24yNS5sYWJlbDogLSAgICAgICA2NCBjb2xvcnMKLSsKLSsqcG9wdXAqYnV0dG9uMjUudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjI1LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldDY0Q29sb3JzU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlNjRDb2xvcnMoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24yNi5sYWJlbDogLSAgICAgICAgIDggY29sb3JzCi0rCi0rKnBvcHVwKmJ1dHRvbjI2LnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24yNi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXQ4Q29sb3JzU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlOENvbG9ycygpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjI3LmxhYmVsOiBTZXQgWSBDcm9wICh5LW1heCkKLSsKLSsqcG9wdXAqYnV0dG9uMjcudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNldFlDcm9wKCkKLSsKLSsqcG9wdXAqYnV0dG9uMjgubGFiZWw6IFNldCBTY3JvbGxiYXIgV2lkdGgKLSsKLSsqcG9wdXAqYnV0dG9uMjgudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNldFNjYmFyKCkKLSsKLSsqcG9wdXAqYnV0dG9uMjkubGFiZWw6IFVsdHJhVk5DIEV4dGVuc2lvbnM6Ci0rCi0rKnBvcHVwKmJ1dHRvbjI5LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24zMC5sYWJlbDogLSBTZXQgMS9uIFNlcnZlciBTY2FsZQotKwotKypwb3B1cCpidXR0b24zMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVBvcHVwKCkgU2hvd1NjYWxlTigpCi0rCi0rKnBvcHVwKmJ1dHRvbjMxLmxhYmVsOiAtIFRleHQgQ2hhdAotKwotKypwb3B1cCpidXR0b24zMS50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMzEudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0VGV4dENoYXRTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVUZXh0Q2hhdCgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjMyLmxhYmVsOiAtIEZpbGUgVHJhbnNmZXIKLSsKLSsqcG9wdXAqYnV0dG9uMzIudHlwZTogdG9nZ2xlCi0rCi0rKnBvcHVwKmJ1dHRvbjMyLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEZpbGVYZmVyU3RhdGUoKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlRmlsZVhmZXIoKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24zMy5sYWJlbDogLSBTaW5nbGUgV2luZG93Ci0rCi0rKnBvcHVwKmJ1dHRvbjMzLnR5cGU6IHRvZ2dsZQotKwotKypwb3B1cCpidXR0b24zMy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTaW5nbGVXaW5kb3dTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVTaW5nbGVXaW5kb3coKSBIaWRlUG9wdXAoKQotKwotKypwb3B1cCpidXR0b24zNC5sYWJlbDogLSBEaXNhYmxlIFJlbW90ZSBJbnB1dAotKwotKypwb3B1cCpidXR0b24zNC50eXBlOiB0b2dnbGUKLSsKLSsqcG9wdXAqYnV0dG9uMzQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0U2VydmVySW5wdXRTdGF0ZSgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVTZXJ2ZXJJbnB1dCgpIEhpZGVQb3B1cCgpCi0rCi0rKnBvcHVwKmJ1dHRvbjM1LmxhYmVsOgotKwotKypwb3B1cCpidXR0b24zNi5sYWJlbDoKLSsKLSsqcG9wdXAqYnV0dG9uMzcubGFiZWw6Ci0rCi0rKnBvcHVwKmJ1dHRvbjM4LmxhYmVsOgotKwotKypzY2FsZU4qYnV0dG9uMC5sYWJlbDogRGlzbWlzcwotKwotKypzY2FsZU4qYnV0dG9uMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVNjYWxlTigpCi0rCi0rKnNjYWxlTipidXR0b24xLmxhYmVsOiAxLzEKLSsKLSsqc2NhbGVOKmJ1dHRvbjEudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0U2NhbGVOU3RhdGUoMSlcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFNjYWxlTigxKSBIaWRlU2NhbGVOKCkKLSsKLSsqc2NhbGVOKmJ1dHRvbjIubGFiZWw6IDEvMgotKwotKypzY2FsZU4qYnV0dG9uMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTY2FsZU5TdGF0ZSgyKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0U2NhbGVOKDIpIEhpZGVTY2FsZU4oKQotKwotKypzY2FsZU4qYnV0dG9uMy5sYWJlbDogMS8zCi0rCi0rKnNjYWxlTipidXR0b24zLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFNjYWxlTlN0YXRlKDMpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRTY2FsZU4oMykgSGlkZVNjYWxlTigpCi0rCi0rKnNjYWxlTipidXR0b240LmxhYmVsOiAxLzQKLSsKLSsqc2NhbGVOKmJ1dHRvbjQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0U2NhbGVOU3RhdGUoNClcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFNjYWxlTig0KSBIaWRlU2NhbGVOKCkKLSsKLSsqc2NhbGVOKmJ1dHRvbjUubGFiZWw6IDEvNQotKwotKypzY2FsZU4qYnV0dG9uNS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTY2FsZU5TdGF0ZSg1KVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0U2NhbGVOKDUpIEhpZGVTY2FsZU4oKQotKwotKypzY2FsZU4qYnV0dG9uNi5sYWJlbDogT3RoZXIKLSsKLSsqc2NhbGVOKmJ1dHRvbjYudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0U2NhbGVOU3RhdGUoNilcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVTY2FsZU4oKSBEb1NlcnZlclNjYWxlKCkKLSsKLSsqcXVhbGl0eSpidXR0b25ELmxhYmVsOiBEaXNtaXNzCi0rCi0rKnF1YWxpdHkqYnV0dG9uRC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVF1YWxpdHkoKQotKwotKypxdWFsaXR5KmJ1dHRvbjAubGFiZWw6IDAKLSsKLSsqcXVhbGl0eSpidXR0b24wLnR5cGU6IHRvZ2dsZQotKwotKypxdWFsaXR5KmJ1dHRvbjAudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDApXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRRdWFsaXR5KDApIEhpZGVRdWFsaXR5KCkKLSsKLSsqcXVhbGl0eSpidXR0b24xLmxhYmVsOiAxCi0rCi0rKnF1YWxpdHkqYnV0dG9uMS50eXBlOiB0b2dnbGUKLSsKLSsqcXVhbGl0eSpidXR0b24xLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFF1YWxpdHlTdGF0ZSgxKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSgxKSBIaWRlUXVhbGl0eSgpCi0rCi0rKnF1YWxpdHkqYnV0dG9uMi5sYWJlbDogMgotKwotKypxdWFsaXR5KmJ1dHRvbjIudHlwZTogdG9nZ2xlCi0rCi0rKnF1YWxpdHkqYnV0dG9uMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRRdWFsaXR5U3RhdGUoMilcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFF1YWxpdHkoMikgSGlkZVF1YWxpdHkoKQotKwotKypxdWFsaXR5KmJ1dHRvbjMubGFiZWw6IDMKLSsKLSsqcXVhbGl0eSpidXR0b24zLnR5cGU6IHRvZ2dsZQotKwotKypxdWFsaXR5KmJ1dHRvbjMudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDMpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRRdWFsaXR5KDMpIEhpZGVRdWFsaXR5KCkKLSsKLSsqcXVhbGl0eSpidXR0b240LmxhYmVsOiA0Ci0rCi0rKnF1YWxpdHkqYnV0dG9uNC50eXBlOiB0b2dnbGUKLSsKLSsqcXVhbGl0eSpidXR0b240LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFF1YWxpdHlTdGF0ZSg0KVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg0KSBIaWRlUXVhbGl0eSgpCi0rCi0rKnF1YWxpdHkqYnV0dG9uNS5sYWJlbDogNQotKwotKypxdWFsaXR5KmJ1dHRvbjUudHlwZTogdG9nZ2xlCi0rCi0rKnF1YWxpdHkqYnV0dG9uNS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRRdWFsaXR5U3RhdGUoNSlcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFF1YWxpdHkoNSkgSGlkZVF1YWxpdHkoKQotKwotKypxdWFsaXR5KmJ1dHRvbjYubGFiZWw6IDYKLSsKLSsqcXVhbGl0eSpidXR0b242LnR5cGU6IHRvZ2dsZQotKwotKypxdWFsaXR5KmJ1dHRvbjYudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDYpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRRdWFsaXR5KDYpIEhpZGVRdWFsaXR5KCkKLSsKLSsqcXVhbGl0eSpidXR0b243LmxhYmVsOiA3Ci0rCi0rKnF1YWxpdHkqYnV0dG9uNy50eXBlOiB0b2dnbGUKLSsKLSsqcXVhbGl0eSpidXR0b243LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFF1YWxpdHlTdGF0ZSg3KVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg3KSBIaWRlUXVhbGl0eSgpCi0rCi0rKnF1YWxpdHkqYnV0dG9uOC5sYWJlbDogOAotKwotKypxdWFsaXR5KmJ1dHRvbjgudHlwZTogdG9nZ2xlCi0rCi0rKnF1YWxpdHkqYnV0dG9uOC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRRdWFsaXR5U3RhdGUoOClcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFF1YWxpdHkoOCkgSGlkZVF1YWxpdHkoKQotKwotKypxdWFsaXR5KmJ1dHRvbjkubGFiZWw6IDkKLSsKLSsqcXVhbGl0eSpidXR0b245LnR5cGU6IHRvZ2dsZQotKwotKypxdWFsaXR5KmJ1dHRvbjkudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDkpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRRdWFsaXR5KDkpIEhpZGVRdWFsaXR5KCkKLSsKLSsqY29tcHJlc3MqYnV0dG9uRC5sYWJlbDogRGlzbWlzcwotKwotKypjb21wcmVzcypidXR0b25ELnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlQ29tcHJlc3MoKQotKwotKypjb21wcmVzcypidXR0b24wLmxhYmVsOiAwCi0rCi0rKmNvbXByZXNzKmJ1dHRvbjAudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSgwKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoMCkgSGlkZUNvbXByZXNzKCkKLSsKLSsqY29tcHJlc3MqYnV0dG9uMS5sYWJlbDogMQotKwotKypjb21wcmVzcypidXR0b24xLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoMSlcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDEpIEhpZGVDb21wcmVzcygpCi0rCi0rKmNvbXByZXNzKmJ1dHRvbjIubGFiZWw6IDIKLSsKLSsqY29tcHJlc3MqYnV0dG9uMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDIpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcygyKSBIaWRlQ29tcHJlc3MoKQotKwotKypjb21wcmVzcypidXR0b24zLmxhYmVsOiAzCi0rCi0rKmNvbXByZXNzKmJ1dHRvbjMudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSgzKVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoMykgSGlkZUNvbXByZXNzKCkKLSsKLSsqY29tcHJlc3MqYnV0dG9uNC5sYWJlbDogNAotKwotKypjb21wcmVzcypidXR0b240LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoNClcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDQpIEhpZGVDb21wcmVzcygpCi0rCi0rKmNvbXByZXNzKmJ1dHRvbjUubGFiZWw6IDUKLSsKLSsqY29tcHJlc3MqYnV0dG9uNS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDUpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcyg1KSBIaWRlQ29tcHJlc3MoKQotKwotKypjb21wcmVzcypidXR0b242LmxhYmVsOiA2Ci0rCi0rKmNvbXByZXNzKmJ1dHRvbjYudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSg2KVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoNikgSGlkZUNvbXByZXNzKCkKLSsKLSsqY29tcHJlc3MqYnV0dG9uNy5sYWJlbDogNwotKwotKypjb21wcmVzcypidXR0b243LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoNylcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDcpIEhpZGVDb21wcmVzcygpCi0rCi0rKmNvbXByZXNzKmJ1dHRvbjgubGFiZWw6IDgKLSsKLSsqY29tcHJlc3MqYnV0dG9uOC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDgpXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcyg4KSBIaWRlQ29tcHJlc3MoKQotKwotKypjb21wcmVzcypidXR0b245LmxhYmVsOiA5Ci0rCi0rKmNvbXByZXNzKmJ1dHRvbjkudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSg5KVxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoOSkgSGlkZUNvbXByZXNzKCkKLSsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2FyZ3NyZXNvdXJjZXMuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvYXJnc3Jlc291cmNlcy5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvYXJnc3Jlc291cmNlcy5jCTIwMDctMDItMDQgMTc6MTA6MzEuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2FyZ3NyZXNvdXJjZXMuYwkyMDEwLTA0LTE4IDEyOjM5OjU1LjAwMDAwMDAwMCAtMDQwMAotQEAgLTMxLDkgKzMxLDkgQEAKLSAKLSBjaGFyICpmYWxsYmFja19yZXNvdXJjZXNbXSA9IHsKLSAKLS0gICJWbmN2aWV3ZXIudGl0bGU6IFRpZ2h0Vk5DOiAlcyIsCi0rICAiU3N2bmMudGl0bGU6IFNTVk5DOiAlcyAtIFByZXNzIEY4IGZvciBNZW51IiwKLSAKLS0gICJWbmN2aWV3ZXIudHJhbnNsYXRpb25zOlwKLSsgICJTc3ZuYy50cmFuc2xhdGlvbnM6XAotICAgICA8RW50ZXI+OiBTZWxlY3Rpb25Ub1ZOQygpXFxuXAotICAgICA8TGVhdmU+OiBTZWxlY3Rpb25Gcm9tVk5DKCkiLAotIAotQEAgLTQ1LDggKzQ1LDYwIEBACi0gICAiKnZpZXdwb3J0LnVzZVJpZ2h0OiBUcnVlIiwKLSAgICIqdmlld3BvcnQqU2Nyb2xsYmFyKnRodW1iOiBOb25lIiwKLSAKLSsgICAgICAgICAgICIqdmlld3BvcnQuaG9yaXpvbnRhbC5oZWlnaHQ6ICAgNiAiLAotKyAgICAgICAgICAgICAgIip2aWV3cG9ydC52ZXJ0aWNhbC53aWR0aDogICA2ICIsCi0rICAic3N2bmMqdmlld3BvcnQuaG9yaXpvbnRhbC5oZWlnaHQ6ICAgNiAiLAotKyAgICAgInNzdm5jKnZpZXdwb3J0LnZlcnRpY2FsLndpZHRoOiAgIDYgIiwKLSsKLSsgICIqdmlld3BvcnQuaG9yaXpvbnRhbC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxLZXlQcmVzcz5SaWdodDogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+UmlnaHQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+TGVmdDogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPkxlZnQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+TmV4dDogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+TmV4dDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5QcmlvcjogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPlByaW9yOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXFxuXAotKyAgICAgPEtleVByZXNzPno6ICBTdGFydFNjcm9sbChGb3J3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPno6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+YTogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPmE6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+ZjogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+ZjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5iOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+YjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5Eb3duOiAgU3RhcnRTY3JvbGwoRm9yd2FyZClcXG5cCi0rICAgICA8S2V5UmVsZWFzZT5Eb3duOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXFxuXAotKyAgICAgPEtleVByZXNzPlVwOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+VXA6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKCkiLAotKwotKyAgIip2aWV3cG9ydC52ZXJ0aWNhbC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxLZXlQcmVzcz5Eb3duOiAgU3RhcnRTY3JvbGwoRm9yd2FyZClcXG5cCi0rICAgICA8S2V5UmVsZWFzZT5Eb3duOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXFxuXAotKyAgICAgPEtleVByZXNzPlVwOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+VXA6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+TmV4dDogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+TmV4dDogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5QcmlvcjogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPlByaW9yOiAgTm90aWZ5U2Nyb2xsKEZ1bGxMZW5ndGgpIEVuZFNjcm9sbCgpXFxuXAotKyAgICAgPEtleVByZXNzPno6ICBTdGFydFNjcm9sbChGb3J3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPno6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+YTogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPmE6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+ZjogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+ZjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5iOiAgU3RhcnRTY3JvbGwoQmFja3dhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+YjogIE5vdGlmeVNjcm9sbChGdWxsTGVuZ3RoKSBFbmRTY3JvbGwoKVxcblwKLSsgICAgIDxLZXlQcmVzcz5SaWdodDogIFN0YXJ0U2Nyb2xsKEZvcndhcmQpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+UmlnaHQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKClcXG5cCi0rICAgICA8S2V5UHJlc3M+TGVmdDogIFN0YXJ0U2Nyb2xsKEJhY2t3YXJkKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPkxlZnQ6ICBOb3RpZnlTY3JvbGwoRnVsbExlbmd0aCkgRW5kU2Nyb2xsKCkiLAotKwotICAgIipkZXNrdG9wLmJhc2VUcmFuc2xhdGlvbnM6XAotLSAgICAgPEtleT5GODogU2hvd1BvcHVwKClcXG5cCi0rICAgICA8S2V5UHJlc3M+Rjg6ICBTaG93UG9wdXAoKVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPkY4OiAgTm9vcCgpXFxuXAotKyAgICAgPEtleVByZXNzPkY5OiAgVG9nZ2xlRnVsbFNjcmVlbigpXFxuXAotKyAgICAgPEtleVJlbGVhc2U+Rjk6ICBOb29wKClcXG5cCi0gICAgICA8QnV0dG9uUHJlc3M+OiBTZW5kUkZCRXZlbnQoKVxcblwKLSAgICAgIDxCdXR0b25SZWxlYXNlPjogU2VuZFJGQkV2ZW50KClcXG5cCi0gICAgICA8TW90aW9uPjogU2VuZFJGQkV2ZW50KClcXG5cCi1AQCAtNTUsMjYgKzEwNywxMzcgQEAKLSAKLSAgICIqc2VydmVyRGlhbG9nLmRpYWxvZy5sYWJlbDogVk5DIHNlcnZlcjoiLAotICAgIipzZXJ2ZXJEaWFsb2cuZGlhbG9nLnZhbHVlOiIsCi0rICAiKnNlcnZlckRpYWxvZy5kaWFsb2cudmFsdWUud2lkdGg6IDE1MCIsCi0gICAiKnNlcnZlckRpYWxvZy5kaWFsb2cudmFsdWUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0gICAgICA8S2V5PlJldHVybjogU2VydmVyRGlhbG9nRG9uZSgpIiwKLSAKLS0gICIqcGFzc3dvcmREaWFsb2cuZGlhbG9nLmxhYmVsOiBQYXNzd29yZDoiLAotKyAgIip1c2VyRGlhbG9nLmRpYWxvZy5sYWJlbDogU1NWTkM6IEVudGVyIFVzZXJuYW1lIiwKLSsgICIqdXNlckRpYWxvZy5kaWFsb2cudmFsdWU6IiwKLSsgICIqdXNlckRpYWxvZy5kaWFsb2cudmFsdWUud2lkdGg6IDE1MCIsCi0rICAiKnVzZXJEaWFsb2cuZGlhbG9nLnZhbHVlLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEtleT5SZXR1cm46IFVzZXJEaWFsb2dEb25lKCkiLAotKwotKyAgIipzY2FsZURpYWxvZy5kaWFsb2cubGFiZWw6IFNjYWxlOiBFbnRlciAnbm9uZScgKHNhbWUgYXMgJzEnIG9yICcxLjAnKSxcXG5hIGdlb21ldHJ5IFd4SCAoZS5nLiAxMjgweDEwMjQpLCBvclxcbmEgZnJhY3Rpb24gKGUuZy4gMC43NSBvciAzLzQpLlxcblVzZSAnZml0JyBmb3IgZnVsbCBzY3JlZW4gc2l6ZS5cXG5Vc2UgJ2F1dG8nIHRvIG1hdGNoIHdpbmRvdyBzaXplLlxcbkN1cnJlbnQgdmFsdWU6IiwKLSsgICIqc2NhbGVEaWFsb2cuZGlhbG9nLnZhbHVlOiIsCi0rICAiKnNjYWxlRGlhbG9nLmRpYWxvZy52YWx1ZS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPlJldHVybjogU2NhbGVEaWFsb2dEb25lKCkiLAotKwotKyAgIiplc2NhcGVEaWFsb2cuZGlhbG9nLmxhYmVsOiBFc2NhcGUgS2V5czogIEVudGVyIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kaWZpZXIga2V5cyB0byBiZSB0aGVcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidlc2NhcGUgc2VxdWVuY2UnLiAgV2hlbiB0aGVzZSBrZXlzIGFyZSBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpc1xcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZWQgbG9jYWxseSB0byBpbnZva2UgYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG9cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSByZW1vdGUgVk5DIHNlcnZlci4gIEluIG90aGVyIHdvcmRzLCBhIHNldCBvZiAnSG90IEtleXMnLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUbyBlbmFibGUgb3IgZGlzYWJsZSB0aGlzLCBjbGljayBvbiAnRXNjYXBlIEtleXM6IFRvZ2dsZScgaW4gdGhlIFBvcHVwLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXJlIGlzIHRoZSBsaXN0IG9mIGhvdC1rZXkgbWFwcGluZ3MgdG8gc3BlY2lhbCBhY3Rpb25zOlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICByOiByZWZyZXNoIGRlc2t0b3AgIGI6IHRvZ2dsZSBiZWxsICAgYzogdG9nZ2xlIGZ1bGwtY29sb3JcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGY6IGZpbGUgdHJhbnNmZXIgICAgeDogeDExY3Vyc29yICAgICB6OiB0b2dnbGUgVGlnaHQvWlJMRVxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbDogZnVsbCBzY3JlZW4gICAgICBnOiBncmFiYWxsICAgICAgIGU6IGVzY2FwZSBrZXlzIGRpYWxvZ1xcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgczogc2NhbGUgZGlhbG9nICAgICArOiBzY2FsZSB1cCAoPSkgIC06IHNjYWxlIGRvd24gKF8pXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICB0OiB0ZXh0IGNoYXQgICAgICAgICAgICAgICAgICAgICAgICAgYTogYWxwaGFibGVuZCBjdXJzb3JcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIFY6IHRvZ2dsZSB2aWV3b25seSAgUTogcXVpdCB2aWV3ZXIgICAxIDIgMyA0IDUgNjogVWx0cmFWTkMgc2NhbGUgMS9uXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIEFycm93IGtleXM6ICAgICAgICAgcGFuIHRoZSB2aWV3cG9ydCBhYm91dCAxMCUgZm9yIGVhY2gga2V5cHJlc3MuXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBQYWdlVXAgLyBQYWdlRG93bjogIHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgdmVydGljYWxseS5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIEhvbWUgICAvIEVuZDogICAgICAgcGFuIHRoZSB2aWV3cG9ydCBieSBhIHNjcmVlbmZ1bCBob3Jpem9udGFsbHkuXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBLZXlQYWQgQXJyb3cga2V5czogIHBhbiB0aGUgdmlld3BvcnQgYnkgMSBwaXhlbCBmb3IgZWFjaCBrZXlwcmVzcy5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIERyYWdnaW5nIHRoZSBNb3VzZSB3aXRoIEJ1dHRvbjEgcHJlc3NlZCBhbHNvIHBhbnMgdGhlIHZpZXdwb3J0LlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgQ2xpY2tpbmcgTW91c2UgQnV0dG9uMyBicmluZ3MgdXAgdGhlIFBvcHVwIE1lbnUuXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBhYm92ZSBtYXBwaW5ncyBhcmUgKmFsd2F5cyogYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0IHRoZVxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXNjYXBlIEtleXMgdmFsdWUgdG8gJ25ldmVyJy5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1hcHBzaGFyZSBob3Qta2V5czogIHgxMXZuYyBoYXMgYSBzaW1wbGUgYXBwbGljYXRpb24gc2hhcmluZyBtb2RlXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IGVuYWJsZXMgdGhlIHZpZXdlci1zaWRlIHRvIG1vdmUsIHJlc2l6ZSwgb3IgcmFpc2UgdGhlIHJlbW90ZSB0b3BsZXZlbFxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2luZG93cy4gIFRvIGVuYWJsZSBpdCwgaG9sZCBkb3duIFNoaWZ0ICsgdGhlIEVzY2FwZSBLZXlzIGFuZCBwcmVzcyB0aGVzZTpcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgQXJyb3cga2V5czogICAgICAgICAgICAgIG1vdmUgdGhlIHJlbW90ZSB3aW5kb3cgYXJvdW5kIGluIGl0cyBkZXNrdG9wLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgUGFnZVVwL1BhZ2VEbi9Ib21lL0VuZDogIHJlc2l6ZSB0aGUgcmVtb3RlIHdpbmRvdy5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICsvLSAgICAgICAgICAgICAgICAgICAgICByYWlzZSBvciBsb3dlciB0aGUgcmVtb3RlIHdpbmRvdy5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIE0gb3IgQnV0dG9uMSBtb3ZlIHdpbiB0byBsb2NhbCBwb3NpdGlvbjsgIEQgb3IgQnV0dG9uMzogZGVsZXRlIHJlbW90ZSB3aW4uXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklmIHRoZSBFc2NhcGUgS2V5cyB2YWx1ZSBiZWxvdyBpcyBzZXQgdG8gJ2RlZmF1bHQnIHRoZW4gYSBmaXhlZCBsaXN0IG9mXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RpZmllciBrZXlzIGlzIHVzZWQuICBGb3IgVW5peCBpdCBpczogQWx0X0wsU3VwZXJfTCBhbmQgZm9yIE1hY09TWCBpdCBpc1xcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJvbF9MLE1ldGFfTC4gIE5vdGU6IHRoZSBTdXBlcl9MIGtleSB1c3VhbGx5IGhhcyBhIFdpbmRvd3MoVE0pIEZsYWcuXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHNvIG5vdGUgdGhlIF9MIGFuZCBfUiBtZWFuIHRoZSBrZXkgaXMgb24gdGhlIExFRlQgb3IgUklHSFQgc2lkZSBvZiBrZXlib2FyZC5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT24gVW5peCAgIHRoZSBkZWZhdWx0IGlzIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIExlZnQgc2lkZSBvZiBrZXlib2FyZC5cXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uIE1hY09TWCB0aGUgZGVmYXVsdCBpcyBDb250cm9sIGFuZCBDb21tYW5kIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGFtcGxlOiBQcmVzcyBhbmQgaG9sZCB0aGUgQWx0IGFuZCBXaW5kb3dzIGtleXMgb24gdGhlIExFRlQgc2lkZSBvZiB0aGVcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleWJvYXJkIGFuZCB0aGVuIHByZXNzICdjJyB0byB0b2dnbGUgdGhlIGZ1bGwtY29sb3Igc3RhdGUuICBPciBwcmVzcyAndCdcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHRvZ2dsZSB0aGUgdWx0cmF2bmMgVGV4dCBDaGF0IHdpbmRvdywgZXRjLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUbyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgdGhlIGRlZmF1bHQsIHN1cHBseSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IChvciBhXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgb25lKSBmcm9tOiBTaGlmdF9MIFNoaWZ0X1IgQ29udHJvbF9MIENvbnRyb2xfUiBBbHRfTCBBbHRfUiBNZXRhX0xcXG4iCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGFfUiBTdXBlcl9MIFN1cGVyX1IgSHlwZXJfTCBIeXBlcl9SIG9yIE1vZGVfc3dpdGNoLlxcbiIKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxuIgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDdXJyZW50IEVzY2FwZSBLZXlzIFZhbHVlOiIsCi0rICAiKmVzY2FwZURpYWxvZy5kaWFsb2cudmFsdWU6IiwKLSsgICIqZXNjYXBlRGlhbG9nLmRpYWxvZy52YWx1ZS53aWR0aDogMjgwIiwKLSsgICIqZXNjYXBlRGlhbG9nLmRpYWxvZy52YWx1ZS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPlJldHVybjogRXNjYXBlRGlhbG9nRG9uZSgpIiwKLSsKLSsgICIqeWNyb3BEaWFsb2cuZGlhbG9nLmxhYmVsOiBZIENyb3AgKG1heC1oZWlnaHQgaW4gcGl4ZWxzKToiLAotKyAgIip5Y3JvcERpYWxvZy5kaWFsb2cudmFsdWU6IiwKLSsgICIqeWNyb3BEaWFsb2cuZGlhbG9nLnZhbHVlLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEtleVJlbGVhc2U+UmV0dXJuOiBZQ3JvcERpYWxvZ0RvbmUoKSIsCi0rCi0rICAiKnNjYmFyRGlhbG9nLmRpYWxvZy5sYWJlbDogU2Nyb2xsIEJhcnMgd2lkdGg6IiwKLSsgICIqc2NiYXJEaWFsb2cuZGlhbG9nLnZhbHVlOiIsCi0rICAiKnNjYmFyRGlhbG9nLmRpYWxvZy52YWx1ZS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxLZXlSZWxlYXNlPlJldHVybjogU2NiYXJEaWFsb2dEb25lKCkiLAotKwotKyAgIipzY2FsZU5EaWFsb2cuZGlhbG9nLmxhYmVsOiBJbnRlZ2VyIG4gZm9yIDEvbiBzZXJ2ZXIgc2NhbGluZzoiLAotKyAgIipzY2FsZU5EaWFsb2cuZGlhbG9nLnZhbHVlOiIsCi0rICAiKnNjYWxlTkRpYWxvZy5kaWFsb2cudmFsdWUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8S2V5UmVsZWFzZT5SZXR1cm46IFNjYWxlTkRpYWxvZ0RvbmUoKSIsCi0rCi0rICAiKnBhc3N3b3JkRGlhbG9nLmRpYWxvZy5sYWJlbDogU1NWTkM6IEVudGVyIFBhc3N3b3JkIiwKLSAgICIqcGFzc3dvcmREaWFsb2cuZGlhbG9nLnZhbHVlOiIsCi0rICAiKnBhc3N3b3JkRGlhbG9nLmRpYWxvZy52YWx1ZS53aWR0aDogMTUwIiwKLSAgICIqcGFzc3dvcmREaWFsb2cuZGlhbG9nLnZhbHVlLkFzY2lpU2luay5lY2hvOiBGYWxzZSIsCi0gICAiKnBhc3N3b3JkRGlhbG9nLmRpYWxvZy52YWx1ZS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSAgICAgIDxLZXk+UmV0dXJuOiBQYXNzd29yZERpYWxvZ0RvbmUoKSIsCi0gCi0tICAiKnBvcHVwLnRpdGxlOiBUaWdodFZOQyBwb3B1cCIsCi0rICAiKnBvcHVwLnRpdGxlOiBTU1ZOQyBwb3B1cCIsCi0gICAiKnBvcHVwKmJhY2tncm91bmQ6IGdyZXkiLAotLSAgIipwb3B1cCpmb250OiAtKi1oZWx2ZXRpY2EtYm9sZC1yLSotKi0xNi0qLSotKi0qLSotKi0qIiwKLS0gICIqcG9wdXAuYnV0dG9uRm9ybS5Db21tYW5kLmJvcmRlcldpZHRoOiAwIiwKLS0gICIqcG9wdXAuYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotKyAgIipwb3B1cCpmb250X29sZDogLSotaGVsdmV0aWNhLWJvbGQtci0qLSotMTYtKi0qLSotKi0qLSotKiIsCi0rICAiKnBvcHVwKmZvbnQ6IC0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKiIsCi0rICAiKnBvcHVwLmJ1dHRvbkZvcm0qLkNvbW1hbmQuYm9yZGVyV2lkdGg6IDAiLAotKyAgIipwb3B1cC5idXR0b25Gb3JtKi5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotKwotKyAgIipzY2FsZU4udGl0bGU6IDEvbiBzY2FsZSIsCi0rICAiKnNjYWxlTipiYWNrZ3JvdW5kOiBncmV5IiwKLSsgICIqc2NhbGVOKmZvbnQ6IC0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKiIsCi0rICAiKnNjYWxlTi5idXR0b25Gb3JtLkNvbW1hbmQuYm9yZGVyV2lkdGg6IDAiLAotKyAgIipzY2FsZU4uYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotKwotKyAgIip0dXJib1ZOQy50aXRsZTogVHVyYm9WTkMiLAotKyAgIip0dXJib1ZOQypiYWNrZ3JvdW5kOiBncmV5IiwKLSsgICIqdHVyYm9WTkMqZm9udDogLSotaGVsdmV0aWNhLW1lZGl1bS1yLSotKi0xMi0qLSotKi0qLSotKi0qIiwKLSsgICIqdHVyYm9WTkMuYnV0dG9uRm9ybS5Db21tYW5kLmJvcmRlcldpZHRoOiAwIiwKLSsgICIqdHVyYm9WTkMuYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotKwotKyAgIipxdWFsaXR5LnRpdGxlOiBxdWFsaXR5IiwKLSsgICIqcXVhbGl0eSpiYWNrZ3JvdW5kOiBncmV5IiwKLSsgICIqcXVhbGl0eSpmb250OiAtKi1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLTEyLSotKi0qLSotKi0qLSoiLAotKyAgIipxdWFsaXR5LmJ1dHRvbkZvcm0uQ29tbWFuZC5ib3JkZXJXaWR0aDogMCIsCi0rICAiKnF1YWxpdHkuYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotKwotKyAgIipjb21wcmVzcy50aXRsZTogY29tcHJlc3MiLAotKyAgIipjb21wcmVzcypiYWNrZ3JvdW5kOiBncmV5IiwKLSsgICIqY29tcHJlc3MqZm9udDogLSotaGVsdmV0aWNhLW1lZGl1bS1yLSotKi0xMi0qLSotKi0qLSotKi0qIiwKLSsgICIqY29tcHJlc3MuYnV0dG9uRm9ybS5Db21tYW5kLmJvcmRlcldpZHRoOiAwIiwKLSsgICIqY29tcHJlc3MuYnV0dG9uRm9ybS5Ub2dnbGUuYm9yZGVyV2lkdGg6IDAiLAotIAotICAgIipwb3B1cC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZSA8TWVzc2FnZT5XTV9QUk9UT0NPTFM6IEhpZGVQb3B1cCgpIiwKLSAgICIqcG9wdXAuYnV0dG9uRm9ybS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSAgICAgIDxLZXlQcmVzcz46IFNlbmRSRkJFdmVudCgpIEhpZGVQb3B1cCgpIiwKLSAKLS0gICIqcG9wdXBCdXR0b25Db3VudDogOCIsCi0rICAiKnBvcHVwQnV0dG9uQ291bnQ6IDQ0IiwKLSsgICIqcG9wdXBCdXR0b25CcmVhazogMjIiLAotIAotICAgIipwb3B1cCpidXR0b24xLmxhYmVsOiBEaXNtaXNzIHBvcHVwIiwKLSAgICIqcG9wdXAqYnV0dG9uMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLUBAIC04NCw3ICsyNDcsNyBAQAotICAgIipwb3B1cCpidXR0b24yLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotICAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogUXVpdCgpIiwKLSAKLS0gICIqcG9wdXAqYnV0dG9uMy5sYWJlbDogRnVsbCBzY3JlZW4iLAotKyAgIipwb3B1cCpidXR0b24zLmxhYmVsOiBGdWxsIHNjcmVlbiAgKGFsc28gRjkpIiwKLSAgICIqcG9wdXAqYnV0dG9uMy50eXBlOiB0b2dnbGUiLAotICAgIipwb3B1cCpidXR0b24zLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotICAgICAgPFZpc2libGU+OiBTZXRGdWxsU2NyZWVuU3RhdGUoKVxcblwKLUBAIC0xMDUsMTYgKzI2OCw0MjYgQEAKLSAgICIqcG9wdXAqYnV0dG9uNy5sYWJlbDogU2VuZCBjdHJsLWFsdC1kZWwiLAotICAgIipwb3B1cCpidXR0b243LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotICAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2VuZFJGQkV2ZW50KGtleWRvd24sQ29udHJvbF9MKVwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRSRkJFdmVudChrZXlkb3duLEFsdF9MKVwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRSRkJFdmVudChrZXksRGVsZXRlKVwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRSRkJFdmVudChrZXl1cCxBbHRfTClcCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kUkZCRXZlbnQoa2V5dXAsQ29udHJvbF9MKVwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGVQb3B1cCgpIiwKLSsgICAgIFNlbmRSRkJFdmVudChrZXlkb3duLEFsdF9MKVwKLSsgICAgIFNlbmRSRkJFdmVudChrZXksRGVsZXRlKVwKLSsgICAgIFNlbmRSRkJFdmVudChrZXl1cCxBbHRfTClcCi0rICAgICBTZW5kUkZCRXZlbnQoa2V5dXAsQ29udHJvbF9MKVwKLSsgICAgIEhpZGVQb3B1cCgpIiwKLSAKLSAgICIqcG9wdXAqYnV0dG9uOC5sYWJlbDogU2VuZCBGOCIsCi0gICAiKnBvcHVwKmJ1dHRvbjgudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0gICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZW5kUkZCRXZlbnQoa2V5LEY4KSBIaWRlUG9wdXAoKSIsCi0gCi0rICAiKnBvcHVwKmJ1dHRvbjkubGFiZWw6IFNlbmQgRjkiLAotKyAgIipwb3B1cCpidXR0b245LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2VuZFJGQkV2ZW50KGtleSxGOSkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xMC5sYWJlbDogVmlld09ubHkiLAotKyAgIipwb3B1cCpidXR0b24xMC50eXBlOiB0b2dnbGUiLAotKyAgIipwb3B1cCpidXR0b24xMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Vmlld09ubHlTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlVmlld09ubHkoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjExLmxhYmVsOiBEaXNhYmxlIEJlbGwiLAotKyAgIipwb3B1cCpidXR0b24xMS50eXBlOiB0b2dnbGUiLAotKyAgIipwb3B1cCpidXR0b24xMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0QmVsbFN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVCZWxsKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xMi5sYWJlbDogQ3Vyc29yIFNoYXBlIiwKLSsgICIqcG9wdXAqYnV0dG9uMTIudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMTIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEN1cnNvclNoYXBlU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZUN1cnNvclNoYXBlKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xMy5sYWJlbDogWDExIEN1cnNvciIsCi0rICAiKnBvcHVwKmJ1dHRvbjEzLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjEzLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRYMTFDdXJzb3JTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlWDExQ3Vyc29yKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xNC5sYWJlbDogQ3Vyc29yIEFscGhhYmxlbmQiLAotKyAgIipwb3B1cCpidXR0b24xNC50eXBlOiB0b2dnbGUiLAotKyAgIipwb3B1cCpidXR0b24xNC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q3Vyc29yQWxwaGFTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlQ3Vyc29yQWxwaGEoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjE1LmxhYmVsOiBUb2dnbGUgVGlnaHQvSGV4dGlsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjE1LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjE1LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRIZXh0aWxlU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZVRpZ2h0SGV4dGlsZSgpIEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMTYubGFiZWw6IFRvZ2dsZSBUaWdodC9aUkxFIiwKLSsgICIqcG9wdXAqYnV0dG9uMTYudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMTYudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFpSTEVTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlVGlnaHRaUkxFKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xNy5sYWJlbDogVG9nZ2xlIFpSTEUvWllXUkxFIiwKLSsgICIqcG9wdXAqYnV0dG9uMTcudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMTcudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFpZV1JMRVN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVaUkxFWllXUkxFKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24xOC5sYWJlbDogUXVhbGl0eSBMZXZlbCIsCi0rICAiKnBvcHVwKmJ1dHRvbjE4LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVBvcHVwKCkgU2hvd1F1YWxpdHkoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjE5LmxhYmVsOiBDb21wcmVzcyBMZXZlbCIsCi0rICAiKnBvcHVwKmJ1dHRvbjE5LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVBvcHVwKCkgU2hvd0NvbXByZXNzKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24yMC5sYWJlbDogRGlzYWJsZSBKUEVHIiwKLSsgICIqcG9wdXAqYnV0dG9uMjAudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMjAudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldE5PSlBFR1N0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVKUEVHKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24yMS5sYWJlbDogVHVyYm9WTkMgU2V0dGluZ3MiLAotKyAgIipwb3B1cCpidXR0b24yMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNob3dUdXJib1ZOQygpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMjIubGFiZWw6IFBpcGVsaW5lIFVwZGF0ZXMiLAotKyAgIipwb3B1cCpidXR0b24yMi50eXBlOiB0b2dnbGUiLAotKyAgIipwb3B1cCpidXR0b24yMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UGlwZWxpbmVVcGRhdGVzKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVQaXBlbGluZVVwZGF0ZXMoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjIzLmxhYmVsOiBGdWxsIENvbG9yIiwKLSsgICIqcG9wdXAqYnV0dG9uMjMudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMjMudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldEZ1bGxDb2xvclN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVGdWxsQ29sb3IoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjI0LmxhYmVsOiBHcmV5IFNjYWxlICgxNiAmIDgtYnBwKSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI0LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI0LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRHcmV5U2NhbGVTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlR3JleVNjYWxlKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24yNS5sYWJlbDogMTYgYml0IGNvbG9yIChCR1I1NjUpIiwKLSsgICIqcG9wdXAqYnV0dG9uMjUudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMjUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldDE2YnBwU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZTE2YnBwKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24yNi5sYWJlbDogOCAgIGJpdCBjb2xvciAoQkdSMjMzKSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI2LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI2LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXQ4YnBwU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZThicHAoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjI3LmxhYmVsOiAtICAgICAyNTYgY29sb3JzIiwKLSsgICIqcG9wdXAqYnV0dG9uMjcudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMjcudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldDI1NkNvbG9yc1N0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGUyNTZDb2xvcnMoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjI4LmxhYmVsOiAtICAgICAgIDY0IGNvbG9ycyIsCi0rICAiKnBvcHVwKmJ1dHRvbjI4LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI4LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXQ2NENvbG9yc1N0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGU2NENvbG9ycygpIEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMjkubGFiZWw6IC0gICAgICAgICA4IGNvbG9ycyIsCi0rICAiKnBvcHVwKmJ1dHRvbjI5LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjI5LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXQ4Q29sb3JzU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZThDb2xvcnMoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjMwLmxhYmVsOiBTY2FsZSBWaWV3ZXIiLAotKyAgIipwb3B1cCpidXR0b24zMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNldFNjYWxlKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24zMS5sYWJlbDogRXNjYXBlIEtleXM6IFRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjMxLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjMxLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRFc2NhcGVLZXlzU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sIDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVFc2NhcGVBY3RpdmUoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjMyLmxhYmVsOiBFc2NhcGUgS2V5czogSGVscCtTZXQiLAotKyAgIipwb3B1cCpidXR0b24zMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgICA8QnRuMURvd24+LCA8QnRuMVVwPjogSGlkZVBvcHVwKCkgU2V0RXNjYXBlS2V5cygpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMzMubGFiZWw6IFNldCBZIENyb3AgKHktbWF4KSIsCi0rICAiKnBvcHVwKmJ1dHRvbjMzLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVBvcHVwKCkgU2V0WUNyb3AoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjM0LmxhYmVsOiBTZXQgU2Nyb2xsYmFyIFdpZHRoIiwKLSsgICIqcG9wdXAqYnV0dG9uMzQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlUG9wdXAoKSBTZXRTY2JhcigpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMzUubGFiZWw6IFhHcmFiU2VydmVyIiwKLSsgICIqcG9wdXAqYnV0dG9uMzUudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uMzUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFhHcmFiU3RhdGUoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZVhHcmFiKCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b24zNi5sYWJlbDogVWx0cmFWTkMgRXh0ZW5zaW9uczoiLAotKyAgIipwb3B1cCpidXR0b24zNi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMzcubGFiZWw6IC0gU2V0IDEvbiBTZXJ2ZXIgU2NhbGUiLAotKyAgIipwb3B1cCpidXR0b24zNy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVQb3B1cCgpIFNob3dTY2FsZU4oKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjM4LmxhYmVsOiAtIFRleHQgQ2hhdCIsCi0rICAiKnBvcHVwKmJ1dHRvbjM4LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjM4LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRUZXh0Q2hhdFN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVUZXh0Q2hhdCgpIEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uMzkubGFiZWw6IC0gRmlsZSBUcmFuc2ZlciIsCi0rICAiKnBvcHVwKmJ1dHRvbjM5LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjM5LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRGaWxlWGZlclN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVGaWxlWGZlcigpIEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uNDAubGFiZWw6IC0gU2luZ2xlIFdpbmRvdyIsCi0rICAiKnBvcHVwKmJ1dHRvbjQwLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjQwLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTaW5nbGVXaW5kb3dTdGF0ZSgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogdG9nZ2xlKCkgVG9nZ2xlU2luZ2xlV2luZG93KCkgSGlkZVBvcHVwKCkiLAotKwotKyAgIipwb3B1cCpidXR0b240MS5sYWJlbDogLSBEaXNhYmxlIFJlbW90ZSBJbnB1dCIsCi0rICAiKnBvcHVwKmJ1dHRvbjQxLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnBvcHVwKmJ1dHRvbjQxLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTZXJ2ZXJJbnB1dFN0YXRlKClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiB0b2dnbGUoKSBUb2dnbGVTZXJ2ZXJJbnB1dCgpIEhpZGVQb3B1cCgpIiwKLSsKLSsgICIqcG9wdXAqYnV0dG9uNDIubGFiZWw6IFNlbmQgQ2xpcGJvYXJkIG5vdCBQcmltYXJ5IiwKLSsgICIqcG9wdXAqYnV0dG9uNDIudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uNDIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFNlbmRDbGlwYm9hcmQoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZVNlbmRDbGlwYm9hcmQoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjQzLmxhYmVsOiBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lIiwKLSsgICIqcG9wdXAqYnV0dG9uNDMudHlwZTogdG9nZ2xlIiwKLSsgICIqcG9wdXAqYnV0dG9uNDMudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFNlbmRBbHdheXMoKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IHRvZ2dsZSgpIFRvZ2dsZVNlbmRBbHdheXMoKSBIaWRlUG9wdXAoKSIsCi0rCi0rICAiKnBvcHVwKmJ1dHRvbjQ0LmxhYmVsOiAiLAotKwotKyAgIip0dXJib1ZOQypidXR0b24wLmxhYmVsOiBEaXNtaXNzIiwKLSsgICIqdHVyYm9WTkMqYnV0dG9uMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVUdXJib1ZOQygpIiwKLSsKLSsgICIqdHVyYm9WTkMqYnV0dG9uMS5sYWJlbDogSGlnaCBRdWFsaXR5IChMQU4pIiwKLSsgICIqdHVyYm9WTkMqYnV0dG9uMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFR1cmJvVk5DKDEpIiwKLSsKLSsgICIqdHVyYm9WTkMqYnV0dG9uMi5sYWJlbDogTWVkaXVtIFF1YWxpdHkiLAotKyAgIip0dXJib1ZOQypidXR0b24yLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0VHVyYm9WTkMoMikiLAotKwotKyAgIip0dXJib1ZOQypidXR0b24zLmxhYmVsOiBMb3cgUXVhbGl0eSAoV0FOKSIsCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjMudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRUdXJib1ZOQygzKSIsCi0rCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjQubGFiZWw6IExvc3NsZXNzIChHaWdhYml0KSIsCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRUdXJib1ZOQyg0KSIsCi0rCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjUubGFiZWw6IExvc3NsZXNzIFpsaWIgKFdBTikiLAotKyAgIip0dXJib1ZOQypidXR0b241LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0VHVyYm9WTkMoNSkiLAotKwotKyAgIip0dXJib1ZOQypidXR0b242LmxhYmVsOiBTdWJzYW1wbGluZzoiLAotKwotKyAgIip0dXJib1ZOQypidXR0b243LmxhYmVsOiAtICAgICAgICAgICBOb25lIiwKLSsgICIqdHVyYm9WTkMqYnV0dG9uNy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFR1cmJvVk5DKDYpIiwKLSsKLSsgICIqdHVyYm9WTkMqYnV0dG9uOC5sYWJlbDogLSAgICAgICAgICAgMlgiLAotKyAgIip0dXJib1ZOQypidXR0b244LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0VHVyYm9WTkMoNykiLAotKwotKyAgIip0dXJib1ZOQypidXR0b245LmxhYmVsOiAtICAgICAgICAgICA0WCIsCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjkudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRUdXJib1ZOQyg4KSIsCi0rCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjEwLmxhYmVsOiAtICAgICAgICAgIEdyYXkiLAotKyAgIip0dXJib1ZOQypidXR0b24xMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFR1cmJvVk5DKDkpIiwKLSsKLSsgICIqdHVyYm9WTkMqYnV0dG9uMTEubGFiZWw6IExvc3NsZXNzIFJlZnJlc2giLAotKyAgIip0dXJib1ZOQypidXR0b24xMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFR1cmJvVk5DKDEwKSIsCi0rCi0rICAiKnR1cmJvVk5DKmJ1dHRvbjEyLmxhYmVsOiBMb3NzeSBSZWZyZXNoIiwKLSsgICIqdHVyYm9WTkMqYnV0dG9uMTIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZW5kUkZCRXZlbnQoZmJ1cGRhdGUpIiwKLSsKLSsgICIqdHVyYm9WTkMqYnV0dG9uTm9uZS5sYWJlbDogTm90IENvbXBpbGVkIHdpdGhcXG5UdXJib1ZOQyBTdXBwb3J0LiIsCi0rICAiKnR1cmJvVk5DKmJ1dHRvbk5vbmUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlVHVyYm9WTkMoKSIsCi0rCi0rICAiKnF1YWxMYWJlbC5sYWJlbDogSlBFRyBJbWFnZSBRdWFsaXR5OiIsCi0rICAiKnF1YWxCYXIubGVuZ3RoOiAxMDAiLAotKyAgIipxdWFsQmFyLndpZHRoOiAxMzAiLAotKyAgIipxdWFsQmFyLm9yaWVudGF0aW9uOiBob3Jpem9udGFsIiwKLSsgICIqcXVhbEJhci50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxCdG4xRG93bj46IFN0YXJ0U2Nyb2xsKENvbnRpbnVvdXMpIE1vdmVUaHVtYigpIE5vdGlmeVRodW1iKClcXG5cCi0rICAgICA8QnRuMU1vdGlvbj46IE1vdmVUaHVtYigpIE5vdGlmeVRodW1iKClcXG5cCi0rICAgICA8QnRuM0Rvd24+OiBTdGFydFNjcm9sbChDb250aW51b3VzKSBNb3ZlVGh1bWIoKSBOb3RpZnlUaHVtYigpXFxuXAotKyAgICAgPEJ0bjNNb3Rpb24+OiBNb3ZlVGh1bWIoKSBOb3RpZnlUaHVtYigpIiwKLSsgICAgCi0rICAiKnF1YWxUZXh0LmxhYmVsOiAwMDAiLAotKwotKyAgIipzY2FsZU4qYnV0dG9uMC5sYWJlbDogRGlzbWlzcyIsCi0rICAiKnNjYWxlTipidXR0b24wLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogSGlkZVNjYWxlTigpIiwKLSsKLSsgICIqc2NhbGVOKmJ1dHRvbjEubGFiZWw6IDEvMSIsCi0rICAiKnNjYWxlTipidXR0b24xLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTY2FsZU5TdGF0ZSgxKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFNjYWxlTigxKSBIaWRlU2NhbGVOKCkiLAotKwotKyAgIipzY2FsZU4qYnV0dG9uMi5sYWJlbDogMS8yIiwKLSsgICIqc2NhbGVOKmJ1dHRvbjIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFNjYWxlTlN0YXRlKDIpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0U2NhbGVOKDIpIEhpZGVTY2FsZU4oKSIsCi0rCi0rICAiKnNjYWxlTipidXR0b24zLmxhYmVsOiAxLzMiLAotKyAgIipzY2FsZU4qYnV0dG9uMy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0U2NhbGVOU3RhdGUoMylcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRTY2FsZU4oMykgSGlkZVNjYWxlTigpIiwKLSsKLSsgICIqc2NhbGVOKmJ1dHRvbjQubGFiZWw6IDEvNCIsCi0rICAiKnNjYWxlTipidXR0b240LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTY2FsZU5TdGF0ZSg0KVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldFNjYWxlTig0KSBIaWRlU2NhbGVOKCkiLAotKwotKyAgIipzY2FsZU4qYnV0dG9uNS5sYWJlbDogMS81IiwKLSsgICIqc2NhbGVOKmJ1dHRvbjUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldFNjYWxlTlN0YXRlKDUpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0U2NhbGVOKDUpIEhpZGVTY2FsZU4oKSIsCi0rCi0rICAiKnNjYWxlTipidXR0b242LmxhYmVsOiBPdGhlciIsCi0rICAiKnNjYWxlTipidXR0b242LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRTY2FsZU5TdGF0ZSg2KVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IEhpZGVTY2FsZU4oKSBEb1NlcnZlclNjYWxlKCkiLAotKwotKyAgIipxdWFsaXR5KmJ1dHRvbkQubGFiZWw6IERpc21pc3MiLAotKyAgIipxdWFsaXR5KmJ1dHRvbkQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b24wLmxhYmVsOiAwIiwKLSsgICIqcXVhbGl0eSpidXR0b24wLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uMC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDApXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSgwKSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b24xLmxhYmVsOiAxIiwKLSsgICIqcXVhbGl0eSpidXR0b24xLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDEpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSgxKSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b24yLmxhYmVsOiAyIiwKLSsgICIqcXVhbGl0eSpidXR0b24yLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uMi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDIpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSgyKSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b24zLmxhYmVsOiAzIiwKLSsgICIqcXVhbGl0eSpidXR0b24zLnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uMy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDMpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSgzKSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b240LmxhYmVsOiA0IiwKLSsgICIqcXVhbGl0eSpidXR0b240LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uNC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDQpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg0KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b241LmxhYmVsOiA1IiwKLSsgICIqcXVhbGl0eSpidXR0b241LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uNS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDUpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg1KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b242LmxhYmVsOiA2IiwKLSsgICIqcXVhbGl0eSpidXR0b242LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uNi50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDYpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg2KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b243LmxhYmVsOiA3IiwKLSsgICIqcXVhbGl0eSpidXR0b243LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uNy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDcpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg3KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b244LmxhYmVsOiA4IiwKLSsgICIqcXVhbGl0eSpidXR0b244LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uOC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDgpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg4KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqcXVhbGl0eSpidXR0b245LmxhYmVsOiA5IiwKLSsgICIqcXVhbGl0eSpidXR0b245LnR5cGU6IHRvZ2dsZSIsCi0rICAiKnF1YWxpdHkqYnV0dG9uOS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0UXVhbGl0eVN0YXRlKDkpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0UXVhbGl0eSg5KSBIaWRlUXVhbGl0eSgpIiwKLSsKLSsgICIqY29tcHJlc3MqYnV0dG9uRC5sYWJlbDogRGlzbWlzcyIsCi0rICAiKmNvbXByZXNzKmJ1dHRvbkQudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBIaWRlQ29tcHJlc3MoKSIsCi0rCi0rICAiKmNvbXByZXNzKmJ1dHRvbjAubGFiZWw6IDAiLAotKyAgIipjb21wcmVzcypidXR0b24wLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDApXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoMCkgSGlkZUNvbXByZXNzKCkiLAotKwotKyAgIipjb21wcmVzcypidXR0b24xLmxhYmVsOiAxIiwKLSsgICIqY29tcHJlc3MqYnV0dG9uMS50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSgxKVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDEpIEhpZGVDb21wcmVzcygpIiwKLSsKLSsgICIqY29tcHJlc3MqYnV0dG9uMi5sYWJlbDogMiIsCi0rICAiKmNvbXByZXNzKmJ1dHRvbjIudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoMilcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcygyKSBIaWRlQ29tcHJlc3MoKSIsCi0rCi0rICAiKmNvbXByZXNzKmJ1dHRvbjMubGFiZWw6IDMiLAotKyAgIipjb21wcmVzcypidXR0b24zLnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDMpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoMykgSGlkZUNvbXByZXNzKCkiLAotKwotKyAgIipjb21wcmVzcypidXR0b240LmxhYmVsOiA0IiwKLSsgICIqY29tcHJlc3MqYnV0dG9uNC50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSg0KVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDQpIEhpZGVDb21wcmVzcygpIiwKLSsKLSsgICIqY29tcHJlc3MqYnV0dG9uNS5sYWJlbDogNSIsCi0rICAiKmNvbXByZXNzKmJ1dHRvbjUudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoNSlcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcyg1KSBIaWRlQ29tcHJlc3MoKSIsCi0rCi0rICAiKmNvbXByZXNzKmJ1dHRvbjYubGFiZWw6IDYiLAotKyAgIipjb21wcmVzcypidXR0b242LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDYpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoNikgSGlkZUNvbXByZXNzKCkiLAotKwotKyAgIipjb21wcmVzcypidXR0b243LmxhYmVsOiA3IiwKLSsgICIqY29tcHJlc3MqYnV0dG9uNy50cmFuc2xhdGlvbnM6ICNvdmVycmlkZVxcblwKLSsgICAgIDxWaXNpYmxlPjogU2V0Q29tcHJlc3NTdGF0ZSg3KVxcblwKLSsgICAgIDxCdG4xRG93bj4sPEJ0bjFVcD46IFNldENvbXByZXNzKDcpIEhpZGVDb21wcmVzcygpIiwKLSsKLSsgICIqY29tcHJlc3MqYnV0dG9uOC5sYWJlbDogOCIsCi0rICAiKmNvbXByZXNzKmJ1dHRvbjgudHJhbnNsYXRpb25zOiAjb3ZlcnJpZGVcXG5cCi0rICAgICA8VmlzaWJsZT46IFNldENvbXByZXNzU3RhdGUoOClcXG5cCi0rICAgICA8QnRuMURvd24+LDxCdG4xVXA+OiBTZXRDb21wcmVzcyg4KSBIaWRlQ29tcHJlc3MoKSIsCi0rCi0rICAiKmNvbXByZXNzKmJ1dHRvbjkubGFiZWw6IDkiLAotKyAgIipjb21wcmVzcypidXR0b245LnRyYW5zbGF0aW9uczogI292ZXJyaWRlXFxuXAotKyAgICAgPFZpc2libGU+OiBTZXRDb21wcmVzc1N0YXRlKDkpXFxuXAotKyAgICAgPEJ0bjFEb3duPiw8QnRuMVVwPjogU2V0Q29tcHJlc3MoOSkgSGlkZUNvbXByZXNzKCkiLAotKwotICAgTlVMTAotIH07Ci0gCi1AQCAtMTI0LDcgKzY5Nyw3IEBACi0gICogZnJvbSBhIGRpYWxvZyBib3guCi0gICovCi0gCi0tY2hhciB2bmNTZXJ2ZXJIb3N0WzI1Nl07Ci0rY2hhciB2bmNTZXJ2ZXJIb3N0WzEwMjRdOwotIGludCB2bmNTZXJ2ZXJQb3J0ID0gMDsKLSAKLSAKLUBAIC0xMzUsNiArNzA4LDcgQEAKLSAgKi8KLSAKLSBBcHBEYXRhIGFwcERhdGE7Ci0rQXBwRGF0YSBhcHBEYXRhTmV3OwotIAotIHN0YXRpYyBYdFJlc291cmNlIGFwcERhdGFSZXNvdXJjZUxpc3RbXSA9IHsKLSAgIHsic2hhcmVEZXNrdG9wIiwgIlNoYXJlRGVza3RvcCIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLUBAIC0xNTUsMTQgKzcyOSw0NCBAQAotICAgeyJ1c2VyTG9naW4iLCAiVXNlckxvZ2luIiwgWHRSU3RyaW5nLCBzaXplb2YoU3RyaW5nKSwKLSAgICBYdE9mZnNldE9mKEFwcERhdGEsIHVzZXJMb2dpbiksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMH0sCi0gCi0rICB7InVuaXhQVyIsICJVbml4UFciLCBYdFJTdHJpbmcsIHNpemVvZihTdHJpbmcpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdW5peFBXKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAwfSwKLSsKLSsgIHsibXNMb2dvbiIsICJNU0xvZ29uIiwgWHRSU3RyaW5nLCBzaXplb2YoU3RyaW5nKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIG1zTG9nb24pLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDB9LAotKwotKyAgeyJyZXBlYXRlclVsdHJhIiwgIlJlcGVhdGVyVWx0cmEiLCBYdFJTdHJpbmcsIHNpemVvZihTdHJpbmcpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcmVwZWF0ZXJVbHRyYSksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMH0sCi0rCi0rICB7InVsdHJhRFNNIiwgIlVsdHJhRFNNIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdWx0cmFEU00pLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsiYWNjZXB0UG9wdXAiLCAiQWNjZXB0UG9wdXAiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBhY2NlcHRQb3B1cCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJyZmJWZXJzaW9uIiwgIlJmYlZlcnNpb24iLCBYdFJTdHJpbmcsIHNpemVvZihTdHJpbmcpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcmZiVmVyc2lvbiksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMH0sCi0rCi0gICB7InBhc3N3b3JkRGlhbG9nIiwgIlBhc3N3b3JkRGlhbG9nIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotICAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcGFzc3dvcmREaWFsb2cpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSAKLSAgIHsiZW5jb2RpbmdzIiwgIkVuY29kaW5ncyIsIFh0UlN0cmluZywgc2l6ZW9mKFN0cmluZyksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCBlbmNvZGluZ3NTdHJpbmcpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDB9LAotIAotLSAgeyJ1c2VCR1IyMzMiLCAiVXNlQkdSMjMzIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotLSAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdXNlQkdSMjMzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rICB7InVzZUJHUjIzMyIsICJVc2VCR1IyMzMiLCBYdFJJbnQsIHNpemVvZihpbnQpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdXNlQkdSMjMzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAwfSwKLSsKLSsgIHsidXNlQkdSNTY1IiwgIlVzZUJHUjU2NSIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHVzZUJHUjU2NSksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJ1c2VHcmV5U2NhbGUiLCAiVXNlR3JleVNjYWxlIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdXNlR3JleVNjYWxlKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rCi0rICB7InlDcm9wIiwgInlDcm9wIiwgWHRSSW50LCBzaXplb2YoaW50KSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHlDcm9wKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAwfSwKLSsKLSsgIHsic2JXaWR0aCIsICJzYldpZHRoIiwgWHRSSW50LCBzaXplb2YoaW50KSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHNiV2lkdGgpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDJ9LAotIAotICAgeyJuQ29sb3VycyIsICJOQ29sb3VycyIsIFh0UkludCwgc2l6ZW9mKGludCksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCBuQ29sb3VycyksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMjU2fSwKLUBAIC0xNzksOSArNzgzLDEyIEBACi0gICB7InJlcXVlc3RlZERlcHRoIiwgIlJlcXVlc3RlZERlcHRoIiwgWHRSSW50LCBzaXplb2YoaW50KSwKLSAgICBYdE9mZnNldE9mKEFwcERhdGEsIHJlcXVlc3RlZERlcHRoKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAwfSwKLSAKLS0gIHsidXNlU2hhcmVkTWVtb3J5IiwgIlVzZVNoYXJlZE1lbW9yeSIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgIHsidXNlU2htIiwgIlVzZVNobSIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSAgICBYdE9mZnNldE9mKEFwcERhdGEsIHVzZVNobSksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgVHJ1ZX0sCi0gCi0rICB7InRlcm1DaGF0IiwgIlRlcm1DaGF0IiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdGVybUNoYXQpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSAgIHsid21EZWNvcmF0aW9uV2lkdGgiLCAiV21EZWNvcmF0aW9uV2lkdGgiLCBYdFJJbnQsIHNpemVvZihpbnQpLAotICAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgd21EZWNvcmF0aW9uV2lkdGgpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDR9LAotIAotQEAgLTE5MSw2ICs3OTgsOSBAQAotICAgeyJwb3B1cEJ1dHRvbkNvdW50IiwgIlBvcHVwQnV0dG9uQ291bnQiLCBYdFJJbnQsIHNpemVvZihpbnQpLAotICAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcG9wdXBCdXR0b25Db3VudCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMH0sCi0gCi0rICB7InBvcHVwQnV0dG9uQnJlYWsiLCAiUG9wdXBCdXR0b25CcmVhayIsIFh0UkludCwgc2l6ZW9mKGludCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBwb3B1cEJ1dHRvbkJyZWFrKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAwfSwKLSsKLSAgIHsiZGVidWciLCAiRGVidWciLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCBkZWJ1ZyksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotIAotQEAgLTIwNiwxMSArODE2LDEzIEBACi0gICB7ImJ1bXBTY3JvbGxQaXhlbHMiLCAiQnVtcFNjcm9sbFBpeGVscyIsIFh0UkludCwgc2l6ZW9mKGludCksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCBidW1wU2Nyb2xsUGl4ZWxzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAyMH0sCi0gCi0rICAvKiBoYXJkd2lyZWQgY29tcHJlc3MgLTEgdnMgLiA3ICovCi0gICB7ImNvbXByZXNzTGV2ZWwiLCAiQ29tcHJlc3Npb25MZXZlbCIsIFh0UkludCwgc2l6ZW9mKGludCksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCBjb21wcmVzc0xldmVsKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAtMX0sCi0gCi0rICAvKiBoYXJkd2lyZWQgcXVhbGl0eSB3YXMgNiAqLwotICAgeyJxdWFsaXR5TGV2ZWwiLCAiUXVhbGl0eUxldmVsIiwgWHRSSW50LCBzaXplb2YoaW50KSwKLS0gICBYdE9mZnNldE9mKEFwcERhdGEsIHF1YWxpdHlMZXZlbCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgNn0sCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBxdWFsaXR5TGV2ZWwpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIC0xfSwKLSAKLSAgIHsiZW5hYmxlSlBFRyIsICJFbmFibGVKUEVHIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotICAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgZW5hYmxlSlBFRyksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgVHJ1ZX0sCi1AQCAtMjE4LDE0ICs4MzAsOTcgQEAKLSAgIHsidXNlUmVtb3RlQ3Vyc29yIiwgIlVzZVJlbW90ZUN1cnNvciIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSAgICBYdE9mZnNldE9mKEFwcERhdGEsIHVzZVJlbW90ZUN1cnNvciksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgVHJ1ZX0sCi0gCi0rICB7InVzZUN1cnNvckFscGhhIiwgIlVzZUN1cnNvckFscGhhIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdXNlQ3Vyc29yQWxwaGEpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsidXNlUmF3TG9jYWwiLCAiVXNlUmF3TG9jYWwiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCB1c2VSYXdMb2NhbCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJub3R0eSIsICJOb1R0eSIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIG5vdHR5KSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rCi0gICB7InVzZVgxMUN1cnNvciIsICJVc2VYMTFDdXJzb3IiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0gICAgWHRPZmZzZXRPZihBcHBEYXRhLCB1c2VYMTFDdXJzb3IpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSAKLSsgIHsidXNlQmVsbCIsICJVc2VCZWxsIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgdXNlQmVsbCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgVHJ1ZX0sCi0rCi0gICB7ImdyYWJLZXlib2FyZCIsICJHcmFiS2V5Ym9hcmQiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0tICAgWHRPZmZzZXRPZihBcHBEYXRhLCBncmFiS2V5Ym9hcmQpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIGdyYWJLZXlib2FyZCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgVHJ1ZX0sCi0gCi0gICB7ImF1dG9QYXNzIiwgIkF1dG9QYXNzIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotLSAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgYXV0b1Bhc3MpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfQotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgYXV0b1Bhc3MpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsiZ3JhYkFsbCIsICJHcmFiQWxsIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgZ3JhYkFsbCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJ1c2VYc2VydmVyQmFja2luZ1N0b3JlIiwgIlVzZVhzZXJ2ZXJCYWNraW5nU3RvcmUiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCB1c2VYc2VydmVyQmFja2luZ1N0b3JlKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rCi0rICB7Im92ZXJyaWRlUmVkaXIiLCAiT3ZlcnJpZGVSZWRpciIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIG92ZXJyaWRlUmVkaXIpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIFRydWV9LAotKwotKyAgeyJzZXJ2ZXJJbnB1dCIsICJTZXJ2ZXJJbnB1dCIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHNlcnZlcklucHV0KSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBUcnVlfSwKLSsKLSsgIHsic2luZ2xlV2luZG93IiwgIlNpbmdsZVdpbmRvdyIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHNpbmdsZVdpbmRvdyksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJzZXJ2ZXJTY2FsZSIsICJTZXJ2ZXJTY2FsZSIsIFh0UkludCwgc2l6ZW9mKGludCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBzZXJ2ZXJTY2FsZSksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMX0sCi0rCi0rICB7ImNoYXRBY3RpdmUiLCAiQ2hhdEFjdGl2ZSIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIGNoYXRBY3RpdmUpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsiY2hhdE9ubHkiLCAiQ2hhdE9ubHkiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBjaGF0T25seSksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJmaWxlQWN0aXZlIiwgIkZpbGVBY3RpdmUiLCBYdFJCb29sLCBzaXplb2YoQm9vbCksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCBmaWxlQWN0aXZlKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rCi0rICB7InBvcHVwRml4IiwgIlBvcHVwRml4IiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcG9wdXBGaXgpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsic2NhbGUiLCAiU2NhbGUiLCBYdFJTdHJpbmcsIHNpemVvZihTdHJpbmcpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgc2NhbGUpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDB9LAotKwotKyAgeyJwaXBlbGluZVVwZGF0ZXMiLCAiUGlwZWxpbmVVcGRhdGVzIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgcGlwZWxpbmVVcGRhdGVzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKQotKyNpZmRlZiBUVVJCT1ZOQwotKyBUcnVlfSwKLSsjZWxzZQotKyNpZiAwCi0rIEZhbHNlfSwKLSsjZWxzZQotKyBUcnVlfSwKLSsjZW5kaWYKLSsjZW5kaWYKLSsKLSsgIHsibm9pcHY0IiwgIm5vaXB2NCIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIG5vaXB2NCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJub2lwdjYiLCAibm9pcHY2IiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgbm9pcHY2KSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0sCi0rCi0rICB7InNlbmRDbGlwYm9hcmQiLCAiU2VuZENsaXBib2FyZCIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIHNlbmRDbGlwYm9hcmQpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsic2VuZEFsd2F5cyIsICJTZW5kQWx3YXlzIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgc2VuZEFsd2F5cyksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgRmFsc2V9LAotKwotKyAgeyJyZWN2VGV4dCIsICJSZWN2VGV4dCIsIFh0UlN0cmluZywgc2l6ZW9mKFN0cmluZyksCi0rICAgWHRPZmZzZXRPZihBcHBEYXRhLCByZWN2VGV4dCksIFh0UkltbWVkaWF0ZSwgKFh0UG9pbnRlcikgMH0sCi0rCi0rICB7ImFwcFNoYXJlIiwgIkFwcFNoYXJlIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgYXBwU2hhcmUpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEZhbHNlfSwKLSsKLSsgIHsiZXNjYXBlS2V5cyIsICJFc2NhcGVLZXlzIiwgWHRSU3RyaW5nLCBzaXplb2YoU3RyaW5nKSwKLSsgICBYdE9mZnNldE9mKEFwcERhdGEsIGVzY2FwZUtleXMpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDB9LAotKwotKyAgeyJlc2NhcGVBY3RpdmUiLCAiRXNjYXBlQWN0aXZlIiwgWHRSQm9vbCwgc2l6ZW9mKEJvb2wpLAotKyAgIFh0T2Zmc2V0T2YoQXBwRGF0YSwgZXNjYXBlQWN0aXZlKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBGYWxzZX0KLSsKLSsgIC8qIGNoZWNrIGNvbW1hcyAqLwotIH07Ci0gCi0gCi1AQCAtMjQyLDggKzkzNywyOSBAQAotICAgeyItbm9yYWlzZW9uYmVlcCIsICIqcmFpc2VPbkJlZXAiLCAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiRmFsc2UifSwKLSAgIHsiLXBhc3N3ZCIsICAgICAgICAiKnBhc3N3b3JkRmlsZSIsICAgICAgIFhybW9wdGlvblNlcEFyZywgMH0sCi0gICB7Ii11c2VyIiwgICAgICAgICAgIip1c2VyTG9naW4iLCAgICAgICAgICBYcm1vcHRpb25TZXBBcmcsIDB9LAotKyAgeyItdW5peHB3IiwgICAgICAgICIqdW5peFBXIiwgICAgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAwfSwKLSsgIHsiLW1zbG9nb24iLCAgICAgICAiKm1zTG9nb24iLCAgICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgMH0sCi0rICB7Ii1yZXBlYXRlciIsICAgICAgIipyZXBlYXRlclVsdHJhIiwgICAgICBYcm1vcHRpb25TZXBBcmcsIDB9LAotKyAgeyItdWx0cmFkc20iLCAgICAgICIqdWx0cmFEU00iLCAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItYWNjZXB0cG9wdXAiLCAgICIqYWNjZXB0UG9wdXAiLCAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItYWNjZXB0cG9wdXBzYyIsICIqYWNjZXB0UG9wdXAiLCAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItcmZidmVyc2lvbiIsICAgICIqcmZiVmVyc2lvbiIsICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAwfSwKLSAgIHsiLWVuY29kaW5ncyIsICAgICAiKmVuY29kaW5ncyIsICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgMH0sCi0tICB7Ii1iZ3IyMzMiLCAgICAgICAgIip1c2VCR1IyMzMiLCAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICJUcnVlIn0sCi0rICB7Ii1iZ3IyMzMiLCAgICAgICAgIip1c2VCR1IyMzMiLCAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICIyNTYifSwKLSsgIHsiLXVzZTY0IiwgICAgICAgICAiKnVzZUJHUjIzMyIsICAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgICI2NCJ9LAotKyAgeyItYmdyMjIyIiwgICAgICAgICIqdXNlQkdSMjMzIiwgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAgIjY0In0sCi0rICB7Ii11c2U4IiwgICAgICAgICAgIip1c2VCR1IyMzMiLCAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICAgIjgifSwKLSsgIHsiLWJncjExMSIsICAgICAgICAiKnVzZUJHUjIzMyIsICAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgICAiOCJ9LAotKyAgeyItMTZicHAiLCAgICAgICAgICIqdXNlQkdSNTY1IiwgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItYmdyNTY1IiwgICAgICAgICIqdXNlQkdSNTY1IiwgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItZ3JleSIsICAgICAgICAgICIqdXNlR3JleVNjYWxlIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItZ3JheSIsICAgICAgICAgICIqdXNlR3JleVNjYWxlIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItc2J3aWR0aCIsICAgICAgICIqc2J3aWR0aCIsICAgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAwfSwKLSsgIHsiLWVudiIsICAgICAgICAgICAiKmVudkR1bW15IiwgICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgMH0sCi0rICB7Ii15Y3JvcCIsICAgICAgICAgIip5Q3JvcCIsICAgICAgICAgICAgICBYcm1vcHRpb25TZXBBcmcsIDB9LAotKyAgeyItcmF3bG9jYWwiLCAgICAgICIqdXNlUmF3TG9jYWwiLCAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItbm90dHkiLCAgICAgICAgICIqbm90dHkiLCAgICAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItYWxwaGEiLCAgICAgICAgICIqdXNlQ3Vyc29yQWxwaGEiLCAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotICAgeyItb3duY21hcCIsICAgICAgICIqZm9yY2VPd25DbWFwIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotICAgeyItdHJ1ZWNvbG9yIiwgICAgICIqZm9yY2VUcnVlQ29sb3VyIiwgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotICAgeyItdHJ1ZWNvbG91ciIsICAgICIqZm9yY2VUcnVlQ29sb3VyIiwgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotQEAgLTI1Myw4ICs5NjksMzAgQEAKLSAgIHsiLW5vanBlZyIsICAgICAgICAiKmVuYWJsZUpQRUciLCAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgIkZhbHNlIn0sCi0gICB7Ii1ub2N1cnNvcnNoYXBlIiwgIip1c2VSZW1vdGVDdXJzb3IiLCAgICBYcm1vcHRpb25Ob0FyZywgICJGYWxzZSJ9LAotICAgeyIteDExY3Vyc29yIiwgICAgICIqdXNlWDExQ3Vyc29yIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotLSAgeyItYXV0b3Bhc3MiLCAgICAgICIqYXV0b1Bhc3MiLCAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9Ci0tCi0rICB7Ii1ub2JlbGwiLCAgICAgICAgIip1c2VCZWxsIiwgICAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICJGYWxzZSJ9LAotKyAgeyItYXV0b3Bhc3MiLCAgICAgICIqYXV0b1Bhc3MiLCAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItZ3JhYmFsbCIsICAgICAgICIqZ3JhYkFsbCIsICAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItZ3JhYmtiZCIsICAgICAgICIqZ3JhYktleWJvYXJkIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItbm9ncmFia2JkIiwgICAgICIqZ3JhYktleWJvYXJkIiwgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiRmFsc2UifSwKLSsgIHsiLWdyYWJrZXlib2FyZCIsICAiKmdyYWJLZXlib2FyZCIsICAgICAgIFhybW9wdGlvbk5vQXJnLCAgIlRydWUifSwKLSsgIHsiLW5vZ3JhYmtleWJvYXJkIiwiKmdyYWJLZXlib2FyZCIsICAgICAgIFhybW9wdGlvbk5vQXJnLCAgIkZhbHNlIn0sCi0rICB7Ii1ub292ZXJyaWRlIiwgICAgIipvdmVycmlkZVJlZGlyIiwgICAgICBYcm1vcHRpb25Ob0FyZywgICJGYWxzZSJ9LAotKyAgeyItYnMiLCAgICAgICAgICAgICIqdXNlWHNlcnZlckJhY2tpbmdTdG9yZSIsICAgIFhybW9wdGlvbk5vQXJnLCAgIlRydWUifSwKLSsgIHsiLW5vYnMiLCAgICAgICAgICAiKnVzZVhzZXJ2ZXJCYWNraW5nU3RvcmUiLCAgICBYcm1vcHRpb25Ob0FyZywgICJGYWxzZSJ9LAotKyAgeyItcG9wdXBmaXgiLCAgICAgICIqcG9wdXBGaXgiLCAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItbm9zaG0iLCAgICAgICAgICIqdXNlU2htIiwgICAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiRmFsc2UifSwKLSsgIHsiLXRlcm1jaGF0IiwgICAgICAiKnRlcm1DaGF0IiwgICAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgIlRydWUifSwKLSsgIHsiLWNoYXRvbmx5IiwgICAgICAiKmNoYXRPbmx5IiwgICAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgIlRydWUifSwKLSsgIHsiLXNjYWxlIiwgICAgICAgICAiKnNjYWxlIiwgICAgICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgMH0sCi0rICB7Ii1hcHBzaGFyZSIsICAgICAgIiphcHBTaGFyZSIsICAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICJUcnVlIn0sCi0rICB7Ii1lc2NhcGUiLCAgICAgICAgIiplc2NhcGVLZXlzIiwgICAgICAgICBYcm1vcHRpb25TZXBBcmcsIDB9LAotKyAgeyItc2VuZGNsaXBib2FyZCIsICIqc2VuZENsaXBib2FyZCIsICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItc2VuZGFsd2F5cyIsICAgICIqc2VuZEFsd2F5cyIsICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAiVHJ1ZSJ9LAotKyAgeyItcmVjdnRleHQiLCAgICAgICIqcmVjdlRleHQiLCAgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAwfSwKLSsgIHsiLXBpcGVsaW5lIiwgICAgICAiKnBpcGVsaW5lVXBkYXRlcyIsICAgIFhybW9wdGlvbk5vQXJnLCAgIlRydWUifSwKLSsgIHsiLW5vcGlwZWxpbmUiLCAgICAiKnBpcGVsaW5lVXBkYXRlcyIsICAgIFhybW9wdGlvbk5vQXJnLCAgIkZhbHNlIn0sCi0rICB7Ii1ub2lwdjQiLCAgICAgICAgIipub2lwdjQiLCAgICAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICJUcnVlIn0sCi0rICB7Ii1ub2lwdjYiLCAgICAgICAgIipub2lwdjYiLCAgICAgICAgICAgICBYcm1vcHRpb25Ob0FyZywgICJUcnVlIn0KLSB9OwotIAotIGludCBudW1DbWRMaW5lT3B0aW9ucyA9IFh0TnVtYmVyKGNtZExpbmVPcHRpb25zKTsKLUBAIC0yNjcsMTYgKzEwMDUsMTAwIEBACi0gc3RhdGljIFh0QWN0aW9uc1JlYyBhY3Rpb25zW10gPSB7Ci0gICAgIHsiU2VuZFJGQkV2ZW50IiwgU2VuZFJGQkV2ZW50fSwKLSAgICAgeyJTaG93UG9wdXAiLCBTaG93UG9wdXB9LAotKyAgICB7Ik5vb3AiLCBOb29wfSwKLSAgICAgeyJIaWRlUG9wdXAiLCBIaWRlUG9wdXB9LAotKyAgICB7IkhpZGVTY2FsZU4iLCBIaWRlU2NhbGVOfSwKLSsgICAgeyJIaWRlVHVyYm9WTkMiLCBIaWRlVHVyYm9WTkN9LAotKyAgICB7IkhpZGVRdWFsaXR5IiwgSGlkZVF1YWxpdHl9LAotKyAgICB7IkhpZGVDb21wcmVzcyIsIEhpZGVDb21wcmVzc30sCi0gICAgIHsiVG9nZ2xlRnVsbFNjcmVlbiIsIFRvZ2dsZUZ1bGxTY3JlZW59LAotKyAgICB7Ikp1bXBMZWZ0IiwgSnVtcExlZnR9LAotKyAgICB7Ikp1bXBSaWdodCIsIEp1bXBSaWdodH0sCi0rICAgIHsiSnVtcFVwIiwgSnVtcFVwfSwKLSsgICAgeyJKdW1wRG93biIsIEp1bXBEb3dufSwKLSAgICAgeyJTZXRGdWxsU2NyZWVuU3RhdGUiLCBTZXRGdWxsU2NyZWVuU3RhdGV9LAotICAgICB7IlNlbGVjdGlvbkZyb21WTkMiLCBTZWxlY3Rpb25Gcm9tVk5DfSwKLSAgICAgeyJTZWxlY3Rpb25Ub1ZOQyIsIFNlbGVjdGlvblRvVk5DfSwKLSAgICAgeyJTZXJ2ZXJEaWFsb2dEb25lIiwgU2VydmVyRGlhbG9nRG9uZX0sCi0rICAgIHsiVXNlckRpYWxvZ0RvbmUiLCBVc2VyRGlhbG9nRG9uZX0sCi0rICAgIHsiWUNyb3BEaWFsb2dEb25lIiwgWUNyb3BEaWFsb2dEb25lfSwKLSsgICAgeyJTY2JhckRpYWxvZ0RvbmUiLCBTY2JhckRpYWxvZ0RvbmV9LAotKyAgICB7IlNjYWxlTkRpYWxvZ0RvbmUiLCBTY2FsZU5EaWFsb2dEb25lfSwKLSsgICAgeyJTY2FsZURpYWxvZ0RvbmUiLCBTY2FsZURpYWxvZ0RvbmV9LAotICAgICB7IlBhc3N3b3JkRGlhbG9nRG9uZSIsIFBhc3N3b3JkRGlhbG9nRG9uZX0sCi0gICAgIHsiUGF1c2UiLCBQYXVzZX0sCi0gICAgIHsiUnVuQ29tbWFuZCIsIFJ1bkNvbW1hbmR9LAotICAgICB7IlF1aXQiLCBRdWl0fSwKLSsgICAgeyJIaWRlQ2hhdCIsIEhpZGVDaGF0fSwKLSsgICAgeyJUb2dnbGU4YnBwIiwgVG9nZ2xlOGJwcH0sCi0rICAgIHsiVG9nZ2xlMTZicHAiLCBUb2dnbGUxNmJwcH0sCi0rICAgIHsiVG9nZ2xlRnVsbENvbG9yIiwgVG9nZ2xlRnVsbENvbG9yfSwKLSsgICAgeyJUb2dnbGUyNTZDb2xvcnMiLCBUb2dnbGUyNTZDb2xvcnN9LAotKyAgICB7IlRvZ2dsZTY0Q29sb3JzIiwgVG9nZ2xlNjRDb2xvcnN9LAotKyAgICB7IlRvZ2dsZThDb2xvcnMiLCBUb2dnbGU4Q29sb3JzfSwKLSsgICAgeyJUb2dnbGVHcmV5U2NhbGUiLCBUb2dnbGVHcmV5U2NhbGV9LAotKyAgICB7IlRvZ2dsZVRpZ2h0WlJMRSIsIFRvZ2dsZVRpZ2h0WlJMRX0sCi0rICAgIHsiVG9nZ2xlVGlnaHRIZXh0aWxlIiwgVG9nZ2xlVGlnaHRIZXh0aWxlfSwKLSsgICAgeyJUb2dnbGVaUkxFWllXUkxFIiwgVG9nZ2xlWlJMRVpZV1JMRX0sCi0rICAgIHsiVG9nZ2xlVmlld09ubHkiLCBUb2dnbGVWaWV3T25seX0sCi0rICAgIHsiVG9nZ2xlSlBFRyIsIFRvZ2dsZUpQRUd9LAotKyAgICB7IlRvZ2dsZUN1cnNvclNoYXBlIiwgVG9nZ2xlQ3Vyc29yU2hhcGV9LAotKyAgICB7IlRvZ2dsZUN1cnNvckFscGhhIiwgVG9nZ2xlQ3Vyc29yQWxwaGF9LAotKyAgICB7IlRvZ2dsZVgxMUN1cnNvciIsIFRvZ2dsZVgxMUN1cnNvcn0sCi0rICAgIHsiVG9nZ2xlQmVsbCIsIFRvZ2dsZUJlbGx9LAotKyAgICB7IlRvZ2dsZVJhd0xvY2FsIiwgVG9nZ2xlUmF3TG9jYWx9LAotKyAgICB7IlRvZ2dsZVNlcnZlcklucHV0IiwgVG9nZ2xlU2VydmVySW5wdXR9LAotKyAgICB7IlRvZ2dsZVBpcGVsaW5lVXBkYXRlcyIsIFRvZ2dsZVBpcGVsaW5lVXBkYXRlc30sCi0rICAgIHsiVG9nZ2xlU2VuZENsaXBib2FyZCIsIFRvZ2dsZVNlbmRDbGlwYm9hcmR9LAotKyAgICB7IlRvZ2dsZVNlbmRBbHdheXMiLCBUb2dnbGVTZW5kQWx3YXlzfSwKLSsgICAgeyJUb2dnbGVTaW5nbGVXaW5kb3ciLCBUb2dnbGVTaW5nbGVXaW5kb3d9LAotKyAgICB7IlRvZ2dsZVRleHRDaGF0IiwgVG9nZ2xlVGV4dENoYXR9LAotKyAgICB7IlRvZ2dsZUZpbGVYZmVyIiwgVG9nZ2xlRmlsZVhmZXJ9LAotKyAgICB7IlRvZ2dsZVhHcmFiIiwgVG9nZ2xlWEdyYWJ9LAotKyAgICB7IkRvU2VydmVyU2NhbGUiLCBEb1NlcnZlclNjYWxlfSwKLSsgICAgeyJTZXRTY2FsZSIsIFNldFNjYWxlfSwKLSsgICAgeyJTZXRZQ3JvcCIsIFNldFlDcm9wfSwKLSsgICAgeyJTZXRTY2JhciIsIFNldFNjYmFyfSwKLSsgICAgeyJTaG93U2NhbGVOIiwgU2hvd1NjYWxlTn0sCi0rICAgIHsiU2hvd1R1cmJvVk5DIiwgU2hvd1R1cmJvVk5DfSwKLSsgICAgeyJTaG93UXVhbGl0eSIsIFNob3dRdWFsaXR5fSwKLSsgICAgeyJTaG93Q29tcHJlc3MiLCBTaG93Q29tcHJlc3N9LAotKyAgICB7IlNldFNjYWxlTiIsIFNldFNjYWxlTn0sCi0rICAgIHsiU2V0VHVyYm9WTkMiLCBTZXRUdXJib1ZOQ30sCi0rICAgIHsiU2V0UXVhbGl0eSIsIFNldFF1YWxpdHl9LAotKyAgICB7IlNldENvbXByZXNzIiwgU2V0Q29tcHJlc3N9LAotKyAgICB7IlNldDhicHBTdGF0ZSIsIFNldDhicHBTdGF0ZX0sCi0rICAgIHsiU2V0MTZicHBTdGF0ZSIsIFNldDE2YnBwU3RhdGV9LAotKyAgICB7IlNldEZ1bGxDb2xvclN0YXRlIiwgU2V0RnVsbENvbG9yU3RhdGV9LAotKyAgICB7IlNldDI1NkNvbG9yc1N0YXRlIiwgU2V0MjU2Q29sb3JzU3RhdGV9LAotKyAgICB7IlNldDY0Q29sb3JzU3RhdGUiLCBTZXQ2NENvbG9yc1N0YXRlfSwKLSsgICAgeyJTZXQ4Q29sb3JzU3RhdGUiLCBTZXQ4Q29sb3JzU3RhdGV9LAotKyAgICB7IlNldEdyZXlTY2FsZVN0YXRlIiwgU2V0R3JleVNjYWxlU3RhdGV9LAotKyAgICB7IlNldFpSTEVTdGF0ZSIsIFNldFpSTEVTdGF0ZX0sCi0rICAgIHsiU2V0SGV4dGlsZVN0YXRlIiwgU2V0SGV4dGlsZVN0YXRlfSwKLSsgICAgeyJTZXRaWVdSTEVTdGF0ZSIsIFNldFpZV1JMRVN0YXRlfSwKLSsgICAgeyJTZXROT0pQRUdTdGF0ZSIsIFNldE5PSlBFR1N0YXRlfSwKLSsgICAgeyJTZXRTY2FsZU5TdGF0ZSIsIFNldFNjYWxlTlN0YXRlfSwKLSsgICAgeyJTZXRRdWFsaXR5U3RhdGUiLCBTZXRRdWFsaXR5U3RhdGV9LAotKyAgICB7IlNldENvbXByZXNzU3RhdGUiLCBTZXRDb21wcmVzc1N0YXRlfSwKLSsgICAgeyJTZXRWaWV3T25seVN0YXRlIiwgU2V0Vmlld09ubHlTdGF0ZX0sCi0rICAgIHsiU2V0Q3Vyc29yU2hhcGVTdGF0ZSIsIFNldEN1cnNvclNoYXBlU3RhdGV9LAotKyAgICB7IlNldEN1cnNvckFscGhhU3RhdGUiLCBTZXRDdXJzb3JBbHBoYVN0YXRlfSwKLSsgICAgeyJTZXRYMTFDdXJzb3JTdGF0ZSIsIFNldFgxMUN1cnNvclN0YXRlfSwKLSsgICAgeyJTZXRCZWxsU3RhdGUiLCBTZXRCZWxsU3RhdGV9LAotKyAgICB7IlNldFJhd0xvY2FsU3RhdGUiLCBTZXRSYXdMb2NhbFN0YXRlfSwKLSsgICAgeyJTZXRTZXJ2ZXJJbnB1dFN0YXRlIiwgU2V0U2VydmVySW5wdXRTdGF0ZX0sCi0rICAgIHsiU2V0UGlwZWxpbmVVcGRhdGVzIiwgU2V0UGlwZWxpbmVVcGRhdGVzfSwKLSsgICAgeyJTZXRTZW5kQ2xpcGJvYXJkIiwgU2V0U2VuZENsaXBib2FyZH0sCi0rICAgIHsiU2V0U2VuZEFsd2F5cyIsIFNldFNlbmRBbHdheXN9LAotKyAgICB7IlNldFNpbmdsZVdpbmRvd1N0YXRlIiwgU2V0U2luZ2xlV2luZG93U3RhdGV9LAotKyAgICB7IlNldFRleHRDaGF0U3RhdGUiLCBTZXRUZXh0Q2hhdFN0YXRlfSwKLSsgICAgeyJTZXRGaWxlWGZlclN0YXRlIiwgU2V0RmlsZVhmZXJTdGF0ZX0sCi0rICAgIHsiU2V0WEdyYWJTdGF0ZSIsIFNldFhHcmFiU3RhdGV9LAotKyAgICB7IlNldEVzY2FwZUtleXNTdGF0ZSIsIFNldEVzY2FwZUtleXNTdGF0ZX0sCi0rICAgIHsiVG9nZ2xlRXNjYXBlQWN0aXZlIiwgVG9nZ2xlRXNjYXBlQWN0aXZlfSwKLSsgICAgeyJFc2NhcGVEaWFsb2dEb25lIiwgRXNjYXBlRGlhbG9nRG9uZX0sCi0rICAgIHsiU2V0RXNjYXBlS2V5cyIsIFNldEVzY2FwZUtleXN9Ci0gfTsKLSAKLSAKLUBAIC0zMDIsMTEgKzExMjQsMTQgQEAKLSB2b2lkCi0gdXNhZ2Uodm9pZCkKLSB7Ci0tICBmcHJpbnRmKHN0ZGVyciwKLS0JICAiVGlnaHRWTkMgdmlld2VyIHZlcnNpb24gMS4zZGV2N1xuIgotKyAgZnByaW50ZihzdGRvdXQsCi0rCSAgIlNTVk5DIFZpZXdlciAoYmFzZWQgb24gVGlnaHRWTkMgdmlld2VyIHZlcnNpb24gMS4zLjkpXG4iCi0gCSAgIlxuIgotIAkgICJVc2FnZTogJXMgWzxPUFRJT05TPl0gWzxIT1NUPl1bOjxESVNQTEFZIz5dXG4iCi0gCSAgIiAgICAgICAlcyBbPE9QVElPTlM+XSBbPEhPU1Q+XVs6OjxQT1JUIz5dXG4iCi0rCSAgIiAgICAgICAlcyBbPE9QVElPTlM+XSBleGVjPVtDTUQgQVJHUy4uLl1cbiIKLSsJICAiICAgICAgICVzIFs8T1BUSU9OUz5dIGZkPW5cbiIKLSsJICAiICAgICAgICVzIFs8T1BUSU9OUz5dIC9wYXRoL3RvL3VuaXgvc29ja2V0XG4iCi0gCSAgIiAgICAgICAlcyBbPE9QVElPTlM+XSAtbGlzdGVuIFs8RElTUExBWSM+XVxuIgotIAkgICIgICAgICAgJXMgLWhlbHBcbiIKLSAJICAiXG4iCi1AQCAtMzE5LDcgKzExNDQsNyBAQAotIAkgICIgICAgICAgIC1ub3JhaXNlb25iZWVwXG4iCi0gCSAgIiAgICAgICAgLXBhc3N3ZCA8UEFTU1dELUZJTEVOQU1FPiAoc3RhbmRhcmQgVk5DIGF1dGhlbnRpY2F0aW9uKVxuIgotIAkgICIgICAgICAgIC11c2VyIDxVU0VSTkFNRT4gKFVuaXggbG9naW4gYXV0aGVudGljYXRpb24pXG4iCi0tCSAgIiAgICAgICAgLWVuY29kaW5ncyA8RU5DT0RJTkctTElTVD4gKGUuZy4gXCJ0aWdodCBjb3B5cmVjdFwiKVxuIgotKwkgICIgICAgICAgIC1lbmNvZGluZ3MgPEVOQ09ESU5HLUxJU1Q+IChlLmcuIFwidGlnaHQsY29weXJlY3RcIilcbiIKLSAJICAiICAgICAgICAtYmdyMjMzXG4iCi0gCSAgIiAgICAgICAgLW93bmNtYXBcbiIKLSAJICAiICAgICAgICAtdHJ1ZWNvbG91clxuIgotQEAgLTMzMiwxMCArMTE1NywzOTAgQEAKLSAJICAiICAgICAgICAtYXV0b3Bhc3NcbiIKLSAJICAiXG4iCi0gCSAgIk9wdGlvbiBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGUuZy4gLWJnciBpbnN0ZWFkIG9mIC1iZ3IyMzMuXG4iCi0tCSAgIlNlZSB0aGUgbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotLQkgICJcbiIsIHByb2dyYW1OYW1lLCBwcm9ncmFtTmFtZSwgcHJvZ3JhbU5hbWUsIHByb2dyYW1OYW1lKTsKLSsJICAiU2VlIHRoZSBtYW51YWwgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIKLSsJICAiXG4iCi0rCSAgIlxuIgotKwkgICJFbmhhbmNlZCBUaWdodFZOQyB2aWV3ZXIgKFNTVk5DKSBvcHRpb25zOlxuIgotKwkgICJcbiIKLSsJICAiICAgVVJMIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3N2bmMuaHRtbFxuIgotKwkgICJcbiIKLSsJICAiICAgTm90ZTogWlJMRSBhbmQgWllXUkxFIGVuY29kaW5ncyBhcmUgbm93IHN1cHBvcnRlZC5cbiIKLSsJICAiXG4iCi0rCSAgIiAgIE5vdGU6IEY5IGlzIHNob3J0Y3V0IHRvIFRvZ2dsZSBGdWxsU2NyZWVuIG1vZGUuXG4iCi0rCSAgIlxuIgotKwkgICIgICBOb3RlOiBJbiAtbGlzdGVuIG1vZGUgc2V0IHRoZSBlbnYgdmFyLiBTU1ZOQ19NVUxUSVBMRV9MSVNURU49MVxuIgotKwkgICIgICAgICAgICB0byBhbGxvdyBtb3JlIHRoYW4gb25lIGluY29taW5nIFZOQyBzZXJ2ZXIgYXQgYSB0aW1lLlxuIgotKwkgICIgICAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIC1tdWx0aWxpc3RlbiBkZXNjcmliZWQgYmVsb3cuICBTZXRcbiIKLSsJICAiICAgICAgICAgU1NWTkNfTVVMVElQTEVfTElTVEVOPU1BWDpuIHRvIGFsbG93IG5vIG1vcmUgdGhhbiBcIm5cIlxuIgotKwkgICIgICAgICAgICBzaW11bHRhbmVvdXMgcmV2ZXJzZSBjb25uZWN0aW9ucy5cbiIKLSsJICAiXG4iCi0rCSAgIiAgIE5vdGU6IElmIHRoZSBob3N0OnBvcnQgaXMgc3BlY2lmaWVkIGFzIFwiZXhlYz1jb21tYW5kIGFyZ3MuLi5cIlxuIgotKwkgICIgICAgICAgICB0aGVuIGluc3RlYWQgb2YgbWFraW5nIGEgVENQL0lQIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZVxuIgotKwkgICIgICAgICAgICByZW1vdGUgVk5DIHNlcnZlciwgXCJjb21tYW5kIGFyZ3MuLi5cIiBpcyBleGVjdXRlZCBhbmQgdGhlXG4iCi0rCSAgIiAgICAgICAgIHZpZXdlciBpcyBhdHRhY2hlZCB0byBpdHMgc3RkaW8uICBUaGlzIGVuYWJsZXMgdHVubmVsbGluZ1xuIgotKwkgICIgICAgICAgICBlc3RhYmxpc2hlZCB2aWEgYW4gZXh0ZXJuYWwgY29tbWFuZCwgZS5nLiBhbiBzdHVubmVsKDgpXG4iCi0rCSAgIiAgICAgICAgIHRoYXQgZG9lcyBub3QgaW52b2x2ZSBhIGxpc3RlbmluZyBzb2NrZXQuICBUaGlzIG1vZGUgZG9lc1xuIgotKwkgICIgICAgICAgICBub3Qgd29yayBmb3IgLWxpc3RlbiByZXZlcnNlIGNvbm5lY3Rpb25zLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAgSWYgdGhlIGhvc3Q6cG9ydCBpcyBzcGVjaWZpZWQgYXMgXCJmZD1uXCIgdGhlbiBpdCBpcyBhc3N1bWVkXG4iCi0rCSAgIiAgICAgICAgIG4gaXMgYW4gYWxyZWFkeSBvcGVuZWQgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBzb2NrZXQuIChpLmVcbiIKLSsJICAiICAgICAgICAgdGhlIHBhcmVudCBkaWQgZm9yaytleGVjKVxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAgSWYgdGhlIGhvc3Q6cG9ydCBjb250YWlucyBhICcvJyBpdCBpcyBpbnRlcnByZXRlZCBhcyBhXG4iCi0rCSAgIiAgICAgICAgIHVuaXgtZG9tYWluIHNvY2tldCAoQUZfTE9DQUwgaW5zZWFkIG9mIEFGX0lORVQpXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1tdWx0aWxpc3RlbiAgQXMgaW4gLWxpc3RlbiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgZXhjZXB0XG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIHRvIGJlIGNvbm5lY3RlZFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGF0IGEgdGltZS4gIFRoZSBkZWZhdWx0IGZvciAtbGlzdGVuIG9mIG9ubHkgb25lIGF0IGFcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB0aW1lIHRyaWVzIHRvIHBsYXkgaXQgc2FmZSBieSBub3QgYWxsb3dpbmcgYW55b25lIG9uXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgdG8gcHV0IChtYW55KSBkZXNrdG9wcyBvbiB5b3VyIHNjcmVlbiBvdmVyXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgYSBsb25nIHdpbmRvdyBvZiB0aW1lLiBVc2UgLW11bHRpbGlzdGVuIGZvciBubyBsaW1pdC5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLWFjY2VwdHBvcHVwICBJbiAtbGlzdGVuIChyZXZlcnNlIGNvbm5lY3Rpb24gbGlzdGVuaW5nKSBtb2RlIHdoZW5cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBhIHJldmVyc2UgVk5DIGNvbm5lY3Rpb24gY29tZXMgaW4gc2hvdyBhIHBvcHVwIGFza2luZ1xuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gQWNjZXB0IG9yIFJlamVjdCB0aGUgY29ubmVjdGlvbi4gIFRoZSBJUFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3RpbmcgaG9zdCBpcyBzaG93bi4gIFNhbWUgYXNcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSBlbnYuIHZhci4gU1NWTkNfQUNDRVBUX1BPUFVQPTEuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1hY2NlcHRwb3B1cHNjICBBcyBpbiAtYWNjZXB0cG9wdXAgZXhjZXB0IGFzc3VtZSBVbHRyYVZOQyBTaW5nbGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBDbGljayAoU0MpIHNlcnZlci4gIFJldHJpZXZlIFVzZXIgYW5kIENvbXB1dGVyTmFtZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGluZm8gZnJvbSBVbHRyYVZOQyBTZXJ2ZXIgYW5kIGRpc3BsYXkgaW4gdGhlIFBvcHVwLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtdXNlNjQgICAgICBJbiAtYmdyMjMzIG1vZGUsIHVzZSA2NCBjb2xvcnMgaW5zdGVhZCBvZiAyNTYuXG4iCi0rCSAgIiAgICAgICAgLWJncjIyMiAgICAgU2FtZSBhcyAtdXNlNjQuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC11c2U4ICAgICAgIEluIC1iZ3IyMzMgbW9kZSwgdXNlIDggY29sb3JzIGluc3RlYWQgb2YgMjU2LlxuIgotKwkgICIgICAgICAgIC1iZ3IxMTEgICAgIFNhbWUgYXMgLXVzZTguXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC0xNmJwcCAgICAgIElmIHRoZSB2bmMgdmlld2VyIFggZGlzcGxheSBpcyBkZXB0aCAyNCBhdCAzMmJwcFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgYSAxNmJwcCBmb3JtYXQgZnJvbSB0aGUgVk5DIHNlcnZlciB0byBjdXRcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIHRyYWZmaWMgYnkgdXAgdG8gMlgsIHRoZW4gdHJhbmxhdGUgdGhlXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIDMyYnBwIGxvY2FsbHkuXG4iCi0rCSAgIiAgICAgICAgLWJncjU2NSAgICAgU2FtZSBhcyAtMTZicHAuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1ncmV5ICAgICAgIFVzZSBhIGdyZXkgc2NhbGUgZm9yIHRoZSAxNi0gYW5kIDgtYnBwIG1vZGVzLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtYWxwaGEgICAgICBVc2UgYWxwaGFibGVuZGluZyB0cmFuc3BhcmVuY3kgZm9yIGxvY2FsIGN1cnNvcnNcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICByZXF1aXJlczogeDExdm5jIHNlcnZlciwgYm90aCBjbGllbnQgYW5kIHNlcnZlclxuIgotKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIDMyYnBwIGFuZCBzYW1lIGVuZGlhbm5lc3MuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1zY2FsZSBzdHIgIFNjYWxlIHRoZSBkZXNrdG9wIGxvY2FsbHkuICBUaGUgc3RyaW5nIFwic3RyXCIgY2FuXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgYSBmbG9hdGluZyBwb2ludCByYXRpbywgZS5nLiBcIjAuOVwiLCBvciBhIGZyYWN0aW9uLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGUuZy4gXCIzLzRcIiwgb3IgV3hILCBlLmcuIDEyODB4MTAyNC4gIFVzZSBcImZpdFwiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgdG8gZml0IGluIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLiAgVXNlIFwiYXV0b1wiIHRvXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgZml0IGluIHRoZSB3aW5kb3cgc2l6ZS4gIFwic3RyXCIgY2FuIGFsc28gYmUgc2V0IGJ5XG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgdGhlIGVudi4gdmFyLiBTU1ZOQ19TQ0FMRS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgSWYgeW91IG9ic2VydmUgbW91c2UgdHJhaWwgcGFpbnRpbmcgZXJyb3JzLCBlbmFibGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBYMTEgQ3Vyc29yIG1vZGUgKGVpdGhlciB2aWEgUG9wdXAgb3IgLXgxMWN1cnNvci4pXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBzY2FsaW5nIGlzIGRvbmUgaW4gc29mdHdhcmUgYW5kIHNvIGNhbiBiZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHNsb3cgYW5kIHJlcXVpcmVzIG1vcmUgbWVtb3J5LiAgU29tZSBzcGVlZHVwIFRpcHM6XG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBaUkxFIGlzIGZhc3RlciB0aGFuIFRpZ2h0IGluIHRoaXMgbW9kZS4gIFdoZW5cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZyBpcyBmaXJzdCBkZXRlY3RlZCwgdGhlIGVuY29kaW5nIHdpbGxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byBaUkxFLiAgVXNlIHRoZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBQb3B1cCBtZW51IGlmIHlvdSB3YW50IHRvIGdvIGJhY2sgdG8gVGlnaHQuXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIFNldCBTU1ZOQ19QUkVTRVJWRV9FTkNPRElORz0xIHRvIGRpc2FibGUgdGhpcy5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHNvbGlkIGJhY2tncm91bmQgb24gdGhlIHJlbW90ZSBzaWRlLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBtYW51YWxseSBvciB2aWEgeDExdm5jIC1zb2xpZCAuLi4pXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmVtb3RlIHNlcnZlciBpcyB4MTF2bmMsIHRyeSBjbGllbnRcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSBjYWNoaW5nOiB4MTF2bmMgLW5jYWNoZSAxMCAuLi5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLXljcm9wIG4gICAgT25seSBzaG93IHRoZSB0b3AgbiByb3dzIG9mIHRoZSBmcmFtZWJ1ZmZlci4gIEZvclxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHVzZSB3aXRoIHgxMXZuYyAtbmNhY2hlIGNsaWVudCBjYWNoaW5nIG9wdGlvblxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHRvIGhlbHAgXCJoaWRlXCIgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi5cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBVc2UgYSBuZWdhdGl2ZSB2YWx1ZSAoZS5nLiAtMSkgZm9yIGF1dG9kZXRlY3Rpb24uXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgQXV0b2RldGVjdGlvbiB3aWxsIGFsd2F5cyB0YWtlIHBsYWNlIGlmIHRoZSByZW1vdGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBmYiBoZWlnaHQgaXMgbW9yZSB0aGFuIDIgdGltZXMgdGhlIHdpZHRoLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtc2J3aWR0aCBuICBTY3JvbGxiYXIgd2lkdGggZm9yIHgxMXZuYyAtbmNhY2hlIG1vZGUgKC15Y3JvcCksXG4iCi0rICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdmVyeSBuYXJyb3c6IDIgcGl4ZWxzLCBpdCBpcyBuYXJyb3cgdG9cbiIKLSsgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGlzdHJhY3Rpb24gaW4gLXljcm9wIG1vZGUuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1ub2JlbGwgICAgIERpc2FibGUgYmVsbC5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLXJhd2xvY2FsICAgUHJlZmVyIHJhdyBlbmNvZGluZyBmb3IgbG9jYWxob3N0LCBkZWZhdWx0IGlzXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgbm8sIGkuZS4gYXNzdW1lcyB5b3UgaGF2ZSBhIFNTSCB0dW5uZWwgaW5zdGVhZC5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLW5vdHR5ICAgICAgVHJ5IHRvIGF2b2lkIHVzaW5nIHRoZSB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICByZXNwb25zZXM6IHVzZSB3aW5kb3dzIGZvciBtZXNzYWdlcyBhbmQgcHJvbXB0aW5nXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgaW5zdGVhZC4gIE1lc3NhZ2VzIHdpbGwgYWxzbyBiZSBwcmludGVkIHRvIHRlcm1pbmFsLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtc2VuZGNsaXBib2FyZCAgU2VuZCB0aGUgWCBDTElQQk9BUkQgc2VsZWN0aW9uIChpLmUuIEN0cmwrQyxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgQ3RybCtWKSBpbnN0ZWFkIG9mIHRoZSBYIFBSSU1BUlkgc2VsZWN0aW9uIChtb3VzZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgYW5kIG1pZGRsZSBidXR0b24gcGFzdGUuKVxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtc2VuZGFsd2F5cyAgICAgV2hlbmV2ZXIgdGhlIG1vdXNlIGVudGVycyB0aGUgVk5DIHZpZXdlciBtYWluXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgc2VuZCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBWTkMgc2VydmVyIGV2ZW4gaWZcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgaXQgaGFzIG5vdCBjaGFuZ2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBYdCByZXNvdXJjZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXMpXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1yZWN2dGV4dCBzdHIgICBXaGVuIGN1dCB0ZXh0IGlzIHJlY2VpdmVkIGZyb20gdGhlIFZOQyBzZXJ2ZXIsXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIHNzdm5jdmlld2VyIHdpbGwgc2V0IGJvdGggdGhlIFggUFJJTUFSWSBhbmQgdGhlXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIFggQ0xJUEJPQVJEIGxvY2FsIHNlbGVjdGlvbnMuICBUbyBjb250cm9sIHdoaWNoXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIGlzIHNldCwgc3BlY2lmeSAnc3RyJyBhcyAncHJpbWFyeScsICdjbGlwYm9hcmQnLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBvciAnYm90aCcgKHRoZSBkZWZhdWx0LilcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLWdyYWJhbGwgICAgR3JhYiB0aGUgZW50aXJlIFggc2VydmVyIHdoZW4gaW4gZnVsbHNjcmVlbiBtb2RlLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBieSBzb21lIG9sZCB3aW5kb3cgbWFuYWdlcnMgbGlrZSBmdndtMi5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLXBvcHVwZml4ICAgV2FycCB0aGUgcG9wdXAgYmFjayB0byB0aGUgcG9pbnRlciBwb3NpdGlvbixcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuXG4iCi0rCSAgIiAgICAgICAgLXNlbmRjbGlwYm9hcmQgIFNlbmQgdGhlIFggQ0xJUEJPQVJEIHNlbGVjdGlvbiAoaS5lLiBDdHJsK0MsXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIEN0cmwrVikgaW5zdGVhZCBvZiB0aGUgWCBQUklNQVJZIHNlbGVjdGlvbiAobW91c2VcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGFuZCBtaWRkbGUgYnV0dG9uIHBhc3RlLilcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgLXNlbmRhbHdheXMgICAgIFdoZW5ldmVyIHRoZSBtb3VzZSBlbnRlcnMgdGhlIFZOQyB2aWV3ZXIgbWFpblxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgICAgIGl0IGhhcyBub3QgY2hhbmdlZC4gIFRoaXMgaXMgbGlrZSB0aGUgWHQgcmVzb3VyY2VcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gU2VsZWN0aW9uVG9WTkMoYWx3YXlzKVxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtcmVjdnRleHQgc3RyICAgV2hlbiBjdXQgdGV4dCBpcyByZWNlaXZlZCBmcm9tIHRoZSBWTkMgc2VydmVyLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBzc3ZuY3ZpZXdlciB3aWxsIHNldCBib3RoIHRoZSBYIFBSSU1BUlkgYW5kIHRoZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBYIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQsIHNwZWNpZnkgJ3N0cicgYXMgJ3ByaW1hcnknLCAnY2xpcGJvYXJkJyxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ2JvdGgnICh0aGUgZGVmYXVsdC4pXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1ncmFiYWxsICAgIEdyYWIgdGhlIGVudGlyZSBYIHNlcnZlciB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1wb3B1cGZpeCAgIFdhcnAgdGhlIHBvcHVwIGJhY2sgdG8gdGhlIHBvaW50ZXIgcG9zaXRpb24sXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJ5IHNvbWUgb2xkIHdpbmRvdyBtYW5hZ2VycyBsaWtlIGZ2d20yLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtZ3JhYmtiZCAgICBHcmFiIHRoZSBYIGtleWJvYXJkIHdoZW4gaW4gZnVsbHNjcmVlbiBtb2RlLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBieSBzb21lIHdpbmRvdyBtYW5hZ2Vycy4gU2FtZSBhcyAtZ3JhYmtleWJvYXJkLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIC1ncmFia2JkIGlzIHRoZSBkZWZhdWx0LCB1c2UgLW5vZ3JhYmtiZCB0byBkaXNhYmxlLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtYnMsIC1ub2JzICBXaGV0aGVyIG9yIG5vdCB0byB1c2UgWCBzZXJ2ZXIgQmFja2luZ3N0b3JlIGZvciB0aGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBtYWluIHZpZXdlciB3aW5kb3cuICBUaGUgZGVmYXVsdCBpcyB0byBub3QsIG1haW5seVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgbW9zdCBMaW51eCwgZXRjLCBzeXN0ZW1zIFggc2VydmVycyBkaXNhYmxlXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgKmFsbCogQmFja2luZ3N0b3JlIGJ5IGRlZmF1bHQuICBUbyByZS1lbmFibGUgaXQgcHV0XG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb24gXCJCYWNraW5nc3RvcmVcIlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBpbiB0aGUgRGV2aWNlIHNlY3Rpb24gb2YgL2V0Yy9YMTEveG9yZy5jb25mLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIEluIC1icyBtb2RlIHdpdGggbm8gWCBzZXJ2ZXIgYmFja2luZ3N0b3JlLCB3aGVuZXZlciBhblxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGFyZWEgb2YgdGhlIHNjcmVlbiBpcyByZS1leHBvc2VkIGl0IG11c3QgZ28gb3V0IHRvIHRoZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIFZOQyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIHBpeGVscy4gVGhpcyBpcyB0b28gc2xvdy5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgSW4gLW5vYnMgbW9kZSwgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSB0aGUgdmlld2VyIHRvXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBpdHMgb3duIGJhY2tpbmcgb2YgdGhlIG1haW4gdmlld2VyIHdpbmRvdy4gVGhpc1xuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IG1ha2VzIHNvbWUgYWN0aXZpdGllcyBmYXN0ZXIgKGNoYW5nZXMgaW4gbGFyZ2VcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICByZWdpb25zKSBidXQgY2FuIGFwcGVhciB0byBcImZsYXNoXCIgdG9vIG11Y2guXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC1ub3NobSAgICAgIERpc2FibGUgdXNlIG9mIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAobm90IHJlY29tbWVuZGVkKVxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAtdGVybWNoYXQgICBEbyB0aGUgVWx0cmFWTkMgY2hhdCBpbiB0aGUgdGVybWluYWwgdm5jdmlld2VyIGlzIGluXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbiBhbiBpbmRlcGVuZGVudCB3aW5kb3cuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgIC11bml4cHcgc3RyIFVzZWZ1bCBmb3IgbG9nZ2luZyBpbnRvIHgxMXZuYyBpbiAtdW5peHB3IG1vZGUuIFwic3RyXCIgaXMgYVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGF0IGFsbG93cyBtYW55IHdheXMgdG8gZW50ZXIgdGhlIFVuaXggVXNlcm5hbWVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBhbmQgVW5peCBQYXNzd29yZC4gIFRoZXNlIGNoYXJhY3RlcnM6IHVzZXJuYW1lLCBuZXdsaW5lLFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLCBuZXdsaW5lIGFyZSBzZW50IHRvIHRoZSBWTkMgc2VydmVyIGFmdGVyIGFueSBWTkNcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBoYXMgdGFrZW4gcGxhY2UuICBVbmRlciB4MTF2bmMgdGhleSBhcmVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgLXVuaXhwdyBsb2dpbi4gIE90aGVyIFZOQyBzZXJ2ZXJzIGNvdWxkIGRvXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHNpbWlsYXIuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBpbmRpY2F0ZSBcInN0clwiIHZpYSB0aGUgZW52aXJvbm1lbnRcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBTU1ZOQ19VTklYUFcuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgRXNjYXBlIGtleSBpcyBhY3R1YWxseSBzZW50IGZpcnN0IHRvIHRlbGxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB4MTF2bmMgdG8gbm90IGVjaG8gdGhlIFVuaXggVXNlcm5hbWUgYmFjayB0byB0aGUgVk5DXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgdmlld2VyLiBTZXQgU1NWTkNfVU5JWFBXX05PRVNDPTEgdG8gb3ZlcnJpZGUgdGhpcy5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgSWYgc3RyIGlzIFwiLlwiLCB0aGVuIHlvdSBhcmUgcHJvbXB0ZWQgYXQgdGhlIGNvbW1hbmQgbGluZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBub3JtYWwgd2F5LiAgSWYgc3RyIGlzXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgXCItXCIgdGhlIHN0ZGluIGlzIHJlYWQgdmlhIGdldHBhc3MoMykgZm9yIHVzZXJuYW1lQHBhc3N3b3JkLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSBpZiBzdHIgaXMgYSBmaWxlLCBpdCBpcyBvcGVuZWQgYW5kIHRoZSBmaXJzdCBsaW5lXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgcmVhZCBpcyB0YWtlbiBhcyB0aGUgVW5peCB1c2VybmFtZSBhbmQgdGhlIDJuZCBhcyB0aGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBwYXNzd29yZC4gSWYgc3RyIHByZWZpeGVkIGJ5IFwicm06XCIgdGhlIGZpbGUgaXMgcmVtb3ZlZFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGFmdGVyIHJlYWRpbmcuIE90aGVyd2lzZSwgaWYgc3RyIGhhcyBhIFwiQFwiIGNoYXJhY3RlcixcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBpdCBpcyB0YWtlbiBhcyB1c2VybmFtZUBwYXNzd29yZC4gT3RoZXJ3aXNlLCB0aGUgcHJvZ3JhbVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGV4aXRzIHdpdGggYW4gZXJyb3IuIEdvdCBhbGwgdGhhdD9cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgLXJlcGVhdGVyIHN0ciAgVGhpcyBpcyBmb3IgdXNlIHdpdGggVWx0cmFWTkMgcmVwZWF0ZXIgcHJveHkgZGVzY3JpYmVkXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBoZXJlOiBodHRwOi8vd3d3LnV2bmMuY29tL2FkZG9ucy9yZXBlYXRlci5odG1sLiAgVGhlIFwic3RyXCJcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBJRCBzdHJpbmcgdG8gYmUgc2VudCB0byB0aGUgcmVwZWF0ZXIuICBFLmcuIElEOjEyMzRcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBhbHNvIGJlIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBvciBkaXNwbGF5IG9mIHRoZSBWTkNcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIHNlcnZlciwgZS5nLiAxMi4zNC41Ni43ODowIG9yIHNub29weS5jb206MS4gIE5vdGUgdGhhdCB3aGVuXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICB1c2luZyAtcmVwZWF0ZXIsIHRoZSBob3N0OmRweSBvbiB0aGUgY21kbGluZSBpcyB0aGUgcmVwZWF0ZXJcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIHNlcnZlciwgTk9UIHRoZSBWTkMgc2VydmVyLiAgVGhlIHJlcGVhdGVyIHdpbGwgY29ubmVjdCB5b3UuXG4iICAKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogdm5jdmlld2VyIC4uLiAtcmVwZWF0ZXIgSUQ6MzMzMyByZXBlYXQuaG9zdDo1OTAwXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiB2bmN2aWV3ZXIgLi4uIC1yZXBlYXRlciB2aG9zdDowIHJlcGVhdC5ob3N0OjU5MDBcbiIgIAotKwkgICJcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBVc2UsIGUuZy4sICctcmVwZWF0ZXIgU0NJSUk9SUQ6MzIxMCcgaWYgdGhlIHJlcGVhdGVyIGlzIGFcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBTaW5nbGUgQ2xpY2sgSUlJIChTU0wpIHJlcGVhdGVyIChyZXBlYXRlcl9TU0wuZXhlKSBhbmQgeW91XG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgYXJlIHBhc3NpbmcgdGhlIFNTTCBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHRocm91Z2ggc3R1bm5lbCxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBzb2NhdCwgZXRjLiBUaGlzIHdheSB0aGUgbWFnaWMgVWx0cmFWTkMgc3RyaW5nICd0ZXN0QidcbiIKLSsgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHdvcmsgd2l0aCB0aGUgcmVwZWF0ZXIgaXMgc2VudCB0byBpdC5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgLXJmYnZlcnNpb24gc3RyIFNldCB0aGUgYWR2ZXJ0aXNlZCBSRkIgdmVyc2lvbi4gIEUuZy46IC1yZmJ2ZXJzaW9uIDMuNlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIEZvciBzb21lIHNlcnZlcnMsIGUuZy4gVWx0cmFWTkMgdGhpcyBuZWVkcyB0byBiZSBkb25lLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAtdWx0cmFkc20gICAgICBVbHRyYVZOQyBoYXMgc3ltbWV0cmljIHByaXZhdGUga2V5IGVuY3J5cHRpb24gRFNNIHBsdWdpbnM6XG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnV2bmMuY29tL2ZlYXR1cmVzL2VuY3J5cHRpb24uaHRtbC4gSXQgaXMgYXNzdW1lZFxuIiAgCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgeW91IGFyZSB1c2luZyBhIHVuaXggcHJvZ3JhbSAoZS5nLiBvdXIgdWx0cmF2bmNfZHNtX2hlbHBlcilcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIHRvIGVuY3J5cHQgYW5kIGRlY3J5cHQgdGhlIFVsdHJhVk5DIERTTSBzdHJlYW0uIElOIEFERElUSU9OXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBUTyBUSEFUIHN1cHBseSAtdWx0cmFkc20gdG8gdGVsbCBUSElTIHZpZXdlciB0byBtb2RpZnkgdGhlXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBSRkIgZGF0YSBzZW50IHNvIGFzIHRvIHdvcmsgd2l0aCB0aGUgVWx0cmFWTkMgU2VydmVyLiBGb3JcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhc29uLCBlYWNoIFJGQiBtc2cgdHlwZSBtdXN0IGJlIHNlbnQgdHdpY2UgdW5kZXIgRFNNLlxuIiAgCi0rCSAgIlxuIgotKwkgICIgICAgIC1tc2xvZ29uIHVzZXIgIFVzZSBXaW5kb3dzIE1TIExvZ29uIHRvIGFuIFVsdHJhVk5DIHNlcnZlci4gIFN1cHBseSB0aGVcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIG9yIFwiMVwiIHRvIGJlIHByb21wdGVkLiAgVGhlIGRlZmF1bHQgaXMgdG9cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBhdXRvZGV0ZWN0IHRoZSBVbHRyYVZOQyBNUyBMb2dvbiBzZXJ2ZXIgYW5kIHByb21wdCBmb3JcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQgTk9URTogVGhlIFVsdHJhVk5DIE1TLUxvZ29uIERpZmZpZS1IZWxsbWFuXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgZXhjaGFuZ2UgaXMgdmVyeSB3ZWFrIGFuZCBjYW4gYmUgYnJ1dGUgZm9yY2VkIHRvIHJlY292ZXJcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiBhIGZldyBzZWNvbmRzIG9mIENQVSB0aW1lLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIFRvIGJlIHNhZmUsIGJlIHN1cmUgdG8gdXNlIGFuIGFkZGl0aW9uYWwgZW5jcnlwdGVkIHR1bm5lbFxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIChlLmcuIFNTTCBvciBTU0gpIGZvciB0aGUgZW50aXJlIFZOQyBzZXNzaW9uLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAtY2hhdG9ubHkgICAgICBUcnkgdG8gYmUgYSBjbGllbnQgdGhhdCBvbmx5IGRvZXMgVWx0cmFWTkMgdGV4dCBjaGF0LiBUaGlzXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBtb2RlIGlzIHVzZWQgYnkgeDExdm5jIHRvIHByZXNlbnQgYSBjaGF0IHdpbmRvdyBvbiB0aGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBYMTEgY29uc29sZSAoaS5lLiBjaGF0IHdpdGggdGhlIHBlcnNvbiBhdCB0aGVcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBkaXNwbGF5KS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgLWVudiBWQVI9VkFMVUUgVG8gc2F2ZSB3cml0aW5nIGEgc2hlbGwgc2NyaXB0IHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBhcyBtYW55IGFzIHlvdSBuZWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3JcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBleGFtcGxlLCAtZW52IFNTVk5DX01VTFRJUExFX0xJU1RFTj1NQVg6NSAtZW52IEVESVRPUj12aVxuIgotKwkgICJcbiIKLSsJICAiICAgICAtbm9pcHY2ICAgICAgICBEaXNhYmxlIGFsbCBJUHY2IHNvY2tldHMuICBTYW1lIGFzIFZOQ1ZJRVdFUl9OT19JUFY2PTEuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgIC1ub2lwdjQgICAgICAgIERpc2FibGUgYWxsIElQdjQgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjQ9MS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgLXByaW50cmVzICAgICAgUHJpbnQgb3V0IHRoZSBTc3ZuYyBYIHJlc291cmNlcyAoYXBwZGVmYXVsdHMpIGFuZCB0aGVuIGV4aXRcbiIgIAotKwkgICIgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2F2ZSB0aGVtIHRvIGEgZmlsZSBhbmQgY3VzdG9taXplIHRoZW0gKGUuZy4gdGhlXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBrZXliaW5kaW5ncyBhbmQgUG9wdXAgbWVudSkgIFRoZW4gcG9pbnQgdG8gdGhlIGZpbGUgdmlhXG4iICAKLSsJICAiICAgICAgICAgICAgICAgICAgICBYRU5WSVJPTk1FTlQgb3IgWEFQUExSRVNESVIuXG4iICAKLSsJICAiXG4iCi0rCSAgIiAgICAgLXBpcGVsaW5lICAgICAgTGlrZSBUdXJib1ZOQywgcmVxdWVzdCB0aGUgbmV4dCBmcmFtZWJ1ZmZlciB1cGRhdGUgYXMgc29vblxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlIGluc3RlYWQgb2Ygd2FpdGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50XG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgdXBkYXRlIGNvbWluZyBpbi4gIEhlbHBzICdwaXBlbGluZScgdGhlIHVwZGF0ZXMuXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBjdXJyZW50bHkgdGhlIGRlZmF1bHQsIHVzZSAtbm9waXBlbGluZSB0byBkaXNhYmxlLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAtYXBwc2hhcmUgICAgICBFbmFibGUgZmVhdHVyZXMgZm9yIHVzZSB3aXRoIHgxMXZuYydzIC1hcHBzaGFyZSBtb2RlIHdoZXJlXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBzaGFyaW5nIHRoZSBmdWxsIGRlc2t0b3Agb25seSB0aGUgYXBwbGljYXRpb24nc1xuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MgYXJlIHNoYXJlZC4gIFZpZXdlciBtdWx0aWxpc3RlbiBtb2RlIGlzIHVzZWQgdG9cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBjcmVhdGUgdGhlIG11bHRpcGxlIHdpbmRvd3M6IC1tdWx0aWxpc3RlbiBpcyBpbXBsaWVkLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIFNlZSAneDExdm5jIC1hcHBzaGFyZSAtaGVscCcgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXMgZW5hYmxlZCBpbiB0aGUgdmlld2VyIHVuZGVyIC1hcHBzaGFyZSBhcmU6XG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgTWluaW11bSBleHRyYSB0ZXh0IGluIHRoZSB0aXRsZSwgYXV0byAteWNyb3AgaXMgZGlzYWJsZWQsXG4iCi0rCSAgIiAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1yZW1vdGVfcHJlZml4IFgxMVZOQ19BUFBTSEFSRV9DTUQ6IG1lc3NhZ2UgY2hhbm5lbCxcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaW5pdGlhbCB3aW5kb3cgcG9zaXRpb24gaGludHMuICBTZWUgYWxzbyBFc2NhcGUgS2V5c1xuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGJlbG93IGZvciBhZGRpdGlvbmFsIGtleSBhbmQgbW91c2UgYmluZGluZ3MuXG4iCi0rCSAgIlxuIgotKwkgICIgICAgIC1lc2NhcGUgc3RyICAgIFRoaXMgc2V0cyB0aGUgJ0VzY2FwZSBLZXlzJyBtb2RpZmllciBzZXF1ZW5jZSBhbmQgZW5hYmxlc1xuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBrZXlzIG1vZGUuICBXaGVuIHRoZSBtb2RpZmllciBrZXlzIGVzY2FwZSBzZXF1ZW5jZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIGlzIGhlbGQgZG93biwgdGhlIG5leHQga2V5c3Ryb2tlIGlzIGludGVycHJldGVkIGxvY2FsbHlcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtIGEgc3BlY2lhbCBhY3Rpb24gaW5zdGVhZCBvZiBiZWluZyBzZW50IHRvIHRoZVxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIHJlbW90ZSBWTkMgc2VydmVyLlxuIgotKwkgICJcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICBVc2UgJy1lc2NhcGUgZGVmYXVsdCcgZm9yIHRoZSBkZWZhdWx0IG1vZGlmaWVyIHNlcXVlbmNlLlxuIgotKwkgICIgICAgICAgICAgICAgICAgICAgIChVbml4OiBBbHRfTCxTdXBlcl9MIGFuZCBNYWNPU1g6IENvbnRyb2xfTCxNZXRhX0wpXG4iCi0rCSAgIlxuIgotKwkgICIgICAgSGVyZSBhcmUgdGhlICdFc2NhcGUgS2V5czogSGVscCtTZXQnIGluc3RydWN0aW9ucyBmcm9tIHRoZSBQb3B1cCBNZW51OlxuIgotKwkgICJcbiIKLSsgICAgICAgICAgIiAgICBFc2NhcGUgS2V5czogIEVudGVyIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kaWZpZXIga2V5cyB0byBiZSB0aGVcbiIKLSsgICAgICAgICAgIiAgICAnZXNjYXBlIHNlcXVlbmNlJy4gIFdoZW4gdGhlc2Uga2V5cyBhcmUgaGVsZCBkb3duLCB0aGUgbmV4dCBrZXlzdHJva2UgaXNcbiIKLSsgICAgICAgICAgIiAgICBpbnRlcnByZXRlZCBsb2NhbGx5IHRvIGludm9rZSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0b1xuIgotKyAgICAgICAgICAiICAgIHRoZSByZW1vdGUgVk5DIHNlcnZlci4gIEluIG90aGVyIHdvcmRzLCBhIHNldCBvZiAnSG90IEtleXMnLlxuIgotKyAgICAgICAgICAiICAgIFxuIgotKyAgICAgICAgICAiICAgIFRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMsIGNsaWNrIG9uICdFc2NhcGUgS2V5czogVG9nZ2xlJyBpbiB0aGUgUG9wdXAuXG4iCi0rICAgICAgICAgICIgICAgXG4iCi0rICAgICAgICAgICIgICAgSGVyZSBpcyB0aGUgbGlzdCBvZiBob3Qta2V5IG1hcHBpbmdzIHRvIHNwZWNpYWwgYWN0aW9uczpcbiIKLSsgICAgICAgICAgIiAgICBcbiIKLSsgICAgICAgICAgIiAgICAgICByOiByZWZyZXNoIGRlc2t0b3AgIGI6IHRvZ2dsZSBiZWxsICAgYzogdG9nZ2xlIGZ1bGwtY29sb3JcbiIKLSsgICAgICAgICAgIiAgICAgICBmOiBmaWxlIHRyYW5zZmVyICAgIHg6IHgxMWN1cnNvciAgICAgejogdG9nZ2xlIFRpZ2h0L1pSTEVcbiIKLSsgICAgICAgICAgIiAgICAgICBsOiBmdWxsIHNjcmVlbiAgICAgIGc6IGdyYWJhbGwgICAgICAgZTogZXNjYXBlIGtleXMgZGlhbG9nXG4iCi0rICAgICAgICAgICIgICAgICAgczogc2NhbGUgZGlhbG9nICAgICArOiBzY2FsZSB1cCAoPSkgIC06IHNjYWxlIGRvd24gKF8pXG4iCi0rICAgICAgICAgICIgICAgICAgdDogdGV4dCBjaGF0ICAgICAgICAgICAgICAgICAgICAgICAgIGE6IGFscGhhYmxlbmQgY3Vyc29yXG4iCi0rICAgICAgICAgICIgICAgICAgVjogdG9nZ2xlIHZpZXdvbmx5ICBROiBxdWl0IHZpZXdlciAgIDEgMiAzIDQgNSA2OiBVbHRyYVZOQyBzY2FsZSAxL25cbiIKLSsgICAgICAgICAgIiAgICBcbiIKLSsgICAgICAgICAgIiAgICAgICBBcnJvdyBrZXlzOiAgICAgICAgIHBhbiB0aGUgdmlld3BvcnQgYWJvdXQgMTAlJSBmb3IgZWFjaCBrZXlwcmVzcy5cbiIKLSsgICAgICAgICAgIiAgICAgICBQYWdlVXAgLyBQYWdlRG93bjogIHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgdmVydGljYWxseS5cbiIKLSsgICAgICAgICAgIiAgICAgICBIb21lICAgLyBFbmQ6ICAgICAgIHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgaG9yaXpvbnRhbGx5LlxuIgotKyAgICAgICAgICAiICAgICAgIEtleVBhZCBBcnJvdyBrZXlzOiAgcGFuIHRoZSB2aWV3cG9ydCBieSAxIHBpeGVsIGZvciBlYWNoIGtleXByZXNzLlxuIgotKyAgICAgICAgICAiICAgICAgIERyYWdnaW5nIHRoZSBNb3VzZSB3aXRoIEJ1dHRvbjEgcHJlc3NlZCBhbHNvIHBhbnMgdGhlIHZpZXdwb3J0LlxuIgotKyAgICAgICAgICAiICAgICAgIENsaWNraW5nIE1vdXNlIEJ1dHRvbjMgYnJpbmdzIHVwIHRoZSBQb3B1cCBNZW51LlxuIgotKyAgICAgICAgICAiICAgIFxuIgotKyAgICAgICAgICAiICAgIFRoZSBhYm92ZSBtYXBwaW5ncyBhcmUgKmFsd2F5cyogYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0IHRoZVxuIgotKyAgICAgICAgICAiICAgIEVzY2FwZSBLZXlzIHZhbHVlIHRvICduZXZlcicuXG4iCi0rICAgICAgICAgICIgICAgXG4iCi0rICAgICAgICAgICIgICAgSWYgdGhlIEVzY2FwZSBLZXlzIHZhbHVlIGJlbG93IGlzIHNldCB0byAnZGVmYXVsdCcgdGhlbiBhIGRlZmF1bHQgbGlzdCBvZlxuIgotKyAgICAgICAgICAiICAgIG9mIG1vZGlmaWVyIGtleXMgaXMgdXNlZC4gIEZvciBVbml4IGl0IGlzOiBBbHRfTCxTdXBlcl9MIGFuZCBmb3IgTWFjT1NYIGl0XG4iCi0rICAgICAgICAgICIgICAgaXMgQ29udHJvbF9MLE1ldGFfTC4gIE5vdGU6IHRoZSBTdXBlcl9MIGtleSB1c3VhbGx5IGhhcyBhIFdpbmRvd3MoVE0pIEZsYWdcbiIKLSsgICAgICAgICAgIiAgICBvbiBpdC4gIEFsc28gbm90ZSB0aGUgX0wgYW5kIF9SIG1lYW4gdGhlIGtleSBpcyBvbiB0aGUgTEVGVCBvciBSSUdIVCBzaWRlXG4iCi0rICAgICAgICAgICIgICAgb2YgdGhlIGtleWJvYXJkLlxuIgotKyAgICAgICAgICAiICAgIFxuIgotKyAgICAgICAgICAiICAgIE9uIFVuaXggICB0aGUgZGVmYXVsdCBpcyBBbHQgYW5kIFdpbmRvd3Mga2V5cyBvbiBMZWZ0IHNpZGUgb2Yga2V5Ym9hcmQuXG4iCi0rICAgICAgICAgICIgICAgT24gTWFjT1NYIHRoZSBkZWZhdWx0IGlzIENvbnRyb2wgYW5kIENvbW1hbmQga2V5cyBvbiBMZWZ0IHNpZGUgb2Yga2V5Ym9hcmQuXG4iCi0rICAgICAgICAgICIgICAgXG4iCi0rICAgICAgICAgICIgICAgRXhhbXBsZTogUHJlc3MgYW5kIGhvbGQgdGhlIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIHRoZSBMRUZUIHNpZGUgb2YgdGhlXG4iCi0rICAgICAgICAgICIgICAga2V5Ym9hcmQgYW5kIHRoZW4gcHJlc3MgJ2MnIHRvIHRvZ2dsZSB0aGUgZnVsbC1jb2xvciBzdGF0ZS4gIE9yIHByZXNzICd0J1xuIgotKyAgICAgICAgICAiICAgIHRvIHRvZ2dsZSB0aGUgdWx0cmF2bmMgVGV4dCBDaGF0IHdpbmRvdywgZXRjLlxuIgotKyAgICAgICAgICAiICAgIFxuIgotKyAgICAgICAgICAiICAgIFRvIHVzZSBzb21ldGhpbmcgYmVzaWRlcyB0aGUgZGVmYXVsdCwgc3VwcGx5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgKG9yIGFcbiIKLSsgICAgICAgICAgIiAgICBzaW5nbGUgb25lKSBmcm9tOiBTaGlmdF9MIFNoaWZ0X1IgQ29udHJvbF9MIENvbnRyb2xfUiBBbHRfTCBBbHRfUiBNZXRhX0xcbiIKLSsgICAgICAgICAgIiAgICBNZXRhX1IgU3VwZXJfTCBTdXBlcl9SIEh5cGVyX0wgSHlwZXJfUiBvciBNb2RlX3N3aXRjaC5cbiIKLSsJICAiXG4iCi0rCSAgIlxuIgotKwkgICIgICBOZXcgUG9wdXAgYWN0aW9uczpcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgVmlld09ubHk6ICAgICAgICAgICAgICAgIH4gLXZpZXdvbmx5XG4iCi0rCSAgIiAgICAgICAgRGlzYWJsZSBCZWxsOiAgICAgICAgICAgIH4gLW5vYmVsbFxuIgotKwkgICIgICAgICAgIEN1cnNvciBTaGFwZTogICAgICAgICAgICB+IC1ub2N1cnNvcnNoYXBlXG4iCi0rCSAgIiAgICAgICAgWDExIEN1cnNvcjogICAgICAgICAgICAgIH4gLXgxMWN1cnNvclxuIgotKwkgICIgICAgICAgIEN1cnNvciBBbHBoYWJsZW5kOiAgICAgICB+IC1hbHBoYVxuIgotKwkgICIgICAgICAgIFRvZ2dsZSBUaWdodC9IZXh0aWxlOiAgICB+IC1lbmNvZGluZ3MgaGV4dGlsZS4uLlxuIgotKwkgICIgICAgICAgIFRvZ2dsZSBUaWdodC9aUkxFOiAgICAgICB+IC1lbmNvZGluZ3MgenJsZS4uLlxuIgotKwkgICIgICAgICAgIFRvZ2dsZSBaUkxFL1pZV1JMRTogICAgICB+IC1lbmNvZGluZ3Mgenl3cmxlLi4uXG4iCi0rCSAgIiAgICAgICAgUXVhbGl0eSBMZXZlbCAgICAgICAgICAgIH4gLXF1YWxpdHkgKGJvdGggVGlnaHQgYW5kIFpZV1JMRSlcbiIKLSsJICAiICAgICAgICBDb21wcmVzcyBMZXZlbCAgICAgICAgICAgfiAtY29tcHJlc3NsZXZlbFxuIgotKwkgICIgICAgICAgIERpc2FibGUgSlBFRzogICAgICAgICAgICB+IC1ub2pwZWcgIChUaWdodClcbiIKLSsJICAiICAgICAgICBQaXBlbGluZSBVcGRhdGVzICAgICAgICAgfiAtcGlwZWxpbmVcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgRnVsbCBDb2xvciAgICAgICAgICAgICAgICAgYXMgbWFueSBjb2xvcnMgYXMgbG9jYWwgc2NyZWVuIGFsbG93cy5cbiIKLSsJICAiICAgICAgICBHcmV5IHNjYWxlICgxNiAmIDgtYnBwKSAgfiAtZ3JleSwgZm9yIGxvdyBjb2xvcnMgMTYvOGJwcCBtb2RlcyBvbmx5LlxuIgotKwkgICIgICAgICAgIDE2IGJpdCBjb2xvciAoQkdSNTY1KSAgICB+IC0xNmJwcCAvIC1iZ3I1NjVcbiIKLSsJICAiICAgICAgICA4ICBiaXQgY29sb3IgKEJHUjIzMykgICAgfiAtYmdyMjMzXG4iCi0rCSAgIiAgICAgICAgMjU2IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjIzMyBkZWZhdWx0ICMgb2YgY29sb3JzLlxuIgotKwkgICIgICAgICAgICA2NCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IyMjIgLyAtdXNlNjRcbiIKLSsJICAiICAgICAgICAgIDggY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMTExIC8gLXVzZThcbiIKLSsJICAiICAgICAgICBTY2FsZSBWaWV3ZXIgICAgICAgICAgICAgfiAtc2NhbGVcbiIKLSsJICAiICAgICAgICBFc2NhcGUgS2V5czogVG9nZ2xlICAgICAgfiAtZXNjYXBlXG4iCi0rCSAgIiAgICAgICAgRXNjYXBlIEtleXM6IEhlbHArU2V0ICAgIH4gLWVzY2FwZVxuIgotKwkgICIgICAgICAgIFNldCBZIENyb3AgKHktbWF4KSAgICAgICB+IC15Y3JvcFxuIgotKwkgICIgICAgICAgIFNldCBTY3JvbGxiYXIgV2lkdGggICAgICB+IC1zYndpZHRoXG4iCi0rCSAgIiAgICAgICAgWEdyYWJTZXJ2ZXIgICAgICAgICAgICAgIH4gLWdyYWJhbGxcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgVWx0cmFWTkMgRXh0ZW5zaW9uczpcbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgICBTZXQgMS9uIFNlcnZlciBTY2FsZSAgICAgVWx0cmF2bmMgZXh0LiBTY2FsZSBkZXNrdG9wIGJ5IDEvbi5cbiIKLSsJICAiICAgICAgICAgIFRleHQgQ2hhdCAgICAgICAgICAgICAgICBVbHRyYXZuYyBleHQuIERvIFRleHQgQ2hhdC5cbiIKLSsJICAiICAgICAgICAgIEZpbGUgVHJhbnNmZXIgICAgICAgICAgICBVbHRyYXZuYyBleHQuIEZpbGUgeGZlciB2aWEgSmF2YSBoZWxwZXIuXG4iCi0rCSAgIiAgICAgICAgICBTaW5nbGUgV2luZG93ICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBHcmFiIGFuZCB2aWV3IGEgc2luZ2xlIHdpbmRvdy5cbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0IHRoZW4gY2xpY2sgb24gdGhlIHdpbmRvdyB5b3Ugd2FudCkuXG4iCi0rCSAgIiAgICAgICAgICBEaXNhYmxlIFJlbW90ZSBJbnB1dCAgICAgVWx0cmF2bmMgZXh0LiBUcnkgdG8gcHJldmVudCBpbnB1dCBhbmRcbiIKLSsJICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3aW5nIG9mIG1vbml0b3IgYXQgcGh5c2ljYWwgZGlzcGxheS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgTm90ZTogdGhlIFVsdHJhdm5jIGV4dGVuc2lvbnMgb25seSBhcHBseSB0byBzZXJ2ZXJzIHRoYXQgc3VwcG9ydFxuIgotKwkgICIgICAgICAgICAgICAgIHRoZW0uICB4MTF2bmMvbGlidm5jc2VydmVyIHN1cHBvcnRzIHNvbWUgb2YgdGhlbS5cbiIKLSsJICAiXG4iCi0rCSAgIiAgICAgICAgU2VuZCBDbGlwYm9hcmQgbm90IFByaW1hcnkgIH4gLXNlbmRjbGlwYm9hcmRcbiIKLSsJICAiICAgICAgICBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lICAgfiAtc2VuZGFsd2F5c1xuIgotKwkgICJcbiIKLSsJICAiXG4iLCBwcm9ncmFtTmFtZSwgcHJvZ3JhbU5hbWUsIHByb2dyYW1OYW1lLCBwcm9ncmFtTmFtZSwgcHJvZ3JhbU5hbWUsIHByb2dyYW1OYW1lLCBwcm9ncmFtTmFtZSk7Ci0gICBleGl0KDEpOwotIH0KLSsjaWYgMAotKwkgICIgICAgICAgIC1ub292ZXJyaWRlIERvIG5vdCBhcHBseSBPdmVycmlkZVJlZGlyZWN0IGluIGZ1bGxzY3JlZW4gbW9kZS5cbiIKLSsjZW5kaWYKLSAKLSAKLSAvKgotQEAgLTM0Myw3NyArMTU0OCwyNDcgQEAKLSAgKiBub3QgYWxyZWFkeSBwcm9jZXNzZWQgYnkgWHRWYUFwcEluaXRpYWxpemUoKS4gIEl0IHNldHMgdm5jU2VydmVySG9zdCBhbmQKLSAgKiB2bmNTZXJ2ZXJQb3J0IGFuZCBhbGwgdGhlIGZpZWxkcyBpbiBhcHBEYXRhLgotICAqLwotK2V4dGVybiBpbnQgc2F3X2FwcHNoYXJlOwotIAotIHZvaWQKLSBHZXRBcmdzQW5kUmVzb3VyY2VzKGludCBhcmdjLCBjaGFyICoqYXJndikKLSB7Ci0tICBpbnQgaTsKLS0gIGNoYXIgKnZuY1NlcnZlck5hbWUsICpjb2xvblBvczsKLS0gIGludCBsZW4sIHBvcnRPZmZzZXQ7Ci0rCWNoYXIgKnZuY1NlcnZlck5hbWUgPSBOVUxMLCAqY29sb25Qb3MsICpicmFja2V0UG9zOwotKwlpbnQgbGVuLCBwb3J0T2Zmc2V0OwotKwlpbnQgZGlzcDsKLSAKLSAgIC8qIFR1cm4gYXBwIHJlc291cmNlIHNwZWNzIGludG8gb3VyIGFwcERhdGEgc3RydWN0dXJlIGZvciB0aGUgcmVzdCBvZiB0aGUKLSAgICAgIHByb2dyYW0gdG8gdXNlICovCi0gCi0tICBYdEdldEFwcGxpY2F0aW9uUmVzb3VyY2VzKHRvcGxldmVsLCAmYXBwRGF0YSwgYXBwRGF0YVJlc291cmNlTGlzdCwKLS0JCQkgICAgWHROdW1iZXIoYXBwRGF0YVJlc291cmNlTGlzdCksIDAsIDApOwotKwlYdEdldEFwcGxpY2F0aW9uUmVzb3VyY2VzKHRvcGxldmVsLCAmYXBwRGF0YSwgYXBwRGF0YVJlc291cmNlTGlzdCwKLSsJICAgIFh0TnVtYmVyKGFwcERhdGFSZXNvdXJjZUxpc3QpLCAwLCAwKTsKLSsKLSsJLyoKLSsJICogd2UgYWxsb3cgc2V0dGluZyBvZiBzb21lIGJ5IGVudiwgdG8gYXZvaWQgY2xhc2ggd2l0aCBvdGhlcgotKwkgKiB2aWV3ZXIncyBjbWRsaW5lcyAoZS5nLiBjaGFuZ2Ugdmlld2VyIGluIFNTVk5DKS4KLSsJICovCi0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9BTFBIQUJMRU5EIikpIHsKLSsJCWFwcERhdGEudXNlQ3Vyc29yQWxwaGEgPSBUcnVlOwotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9QT1BVUF9GSVgiKSkgewotKwkJaWYgKGdldGVudigiTk9QT1BVUEZJWCIpKSB7Ci0rCQkJOwotKwkJfSBlbHNlIGlmICghc3RyY21wKGdldGVudigiVk5DVklFV0VSX1BPUFVQX0ZJWCIpLCAiMCIpKSB7Ci0rCQkJOwotKwkJfSBlbHNlIHsKLSsJCQlhcHBEYXRhLnBvcHVwRml4ID0gVHJ1ZTsKLSsJCX0KLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfR1JBQl9TRVJWRVIiKSkgewotKwkJYXBwRGF0YS5ncmFiQWxsID0gVHJ1ZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfWUNST1AiKSkgewotKwkJaW50IG4gPSBhdG9pKGdldGVudigiVk5DVklFV0VSX1lDUk9QIikpOwotKwkJaWYgKG4gIT0gMCkgewotKwkJCWFwcERhdGEueUNyb3AgPSBuOwotKwkJfQotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9SRkJWRVJTSU9OIikgJiYgc3RyY21wKGdldGVudigiVk5DVklFV0VSX1JGQlZFUlNJT04iKSwgIiIpKSB7Ci0rCQlhcHBEYXRhLnJmYlZlcnNpb24gPSBzdHJkdXAoZ2V0ZW52KCJWTkNWSUVXRVJfUkZCVkVSU0lPTiIpKTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfRU5DT0RJTkdTIikgJiYgc3RyY21wKGdldGVudigiVk5DVklFV0VSX0VOQ09ESU5HUyIpLCAiIikpIHsKLSsJCWFwcERhdGEuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKGdldGVudigiVk5DVklFV0VSX0VOQ09ESU5HUyIpKTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfTk9CRUxMIikpIHsKLSsJCWFwcERhdGEudXNlQmVsbCA9IEZhbHNlOwotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9YMTFDVVJTT1IiKSkgewotKwkJYXBwRGF0YS51c2VYMTFDdXJzb3IgPSBUcnVlOwotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9SQVdMT0NBTCIpKSB7Ci0rCQlhcHBEYXRhLnVzZVJhd0xvY2FsID0gVHJ1ZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfTk9UVFkiKSB8fCBnZXRlbnYoIlNTVk5DX1ZOQ1ZJRVdFUl9OT1RUWSIpKSB7Ci0rCQlhcHBEYXRhLm5vdHR5ID0gVHJ1ZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfU0JXSURUSCIpKSB7Ci0rCQlpbnQgbiA9IGF0b2koZ2V0ZW52KCJWTkNWSUVXRVJfU0JXSURUSCIpKTsKLSsJCWlmIChuICE9IDApIHsKLSsJCQlhcHBEYXRhLnNiV2lkdGggPSBuOwotKwkJfQotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9VTFRSQURTTSIpKSB7Ci0rCQlhcHBEYXRhLnVsdHJhRFNNID0gVHJ1ZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJTU1ZOQ19VTFRSQV9EU00iKSAmJiBzdHJjbXAoZ2V0ZW52KCJTU1ZOQ19VTFRSQV9EU00iKSwgIiIpKSB7Ci0rCQlhcHBEYXRhLnVsdHJhRFNNID0gVHJ1ZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJTU1ZOQ19OT19VTFRSQV9EU00iKSkgewotKwkJYXBwRGF0YS51bHRyYURTTSA9IEZhbHNlOwotKwl9Ci0rCWlmIChnZXRlbnYoIlNTVk5DX1NDQUxFIikgJiYgc3RyY21wKGdldGVudigiU1NWTkNfU0NBTEUiKSwgIiIpKSB7Ci0rCQlpZiAoYXBwRGF0YS5zY2FsZSA9PSBOVUxMKSB7Ci0rCQkJYXBwRGF0YS5zY2FsZSA9IHN0cmR1cChnZXRlbnYoIlNTVk5DX1NDQUxFIikpOwotKwkJfQotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9FU0NBUEUiKSAmJiBzdHJjbXAoZ2V0ZW52KCJWTkNWSUVXRVJfRVNDQVBFIiksICIiKSkgewotKwkJaWYgKGFwcERhdGEuZXNjYXBlS2V5cyA9PSBOVUxMKSB7Ci0rCQkJYXBwRGF0YS5lc2NhcGVLZXlzID0gc3RyZHVwKGdldGVudigiVk5DVklFV0VSX0VTQ0FQRSIpKTsKLSsJCX0KLSsJfQotKwlpZiAoc2F3X2FwcHNoYXJlKSB7Ci0rCQlhcHBEYXRhLmFwcFNoYXJlID0gVHJ1ZTsKLSsJfQotKwlpZiAoYXBwRGF0YS5hcHBTaGFyZSAmJiBhcHBEYXRhLmVzY2FwZUtleXMgPT0gTlVMTCkgewotKwkJYXBwRGF0YS5lc2NhcGVLZXlzID0gc3RyZHVwKCJkZWZhdWx0Iik7Ci0rCX0KLSsJaWYgKGFwcERhdGEuZXNjYXBlS2V5cyAhPSBOVUxMKSB7Ci0rCQlhcHBEYXRhLmVzY2FwZUFjdGl2ZSA9IFRydWU7Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX1NFTkRfQ0xJUEJPQVJEIikpIHsKLSsJCWFwcERhdGEuc2VuZENsaXBib2FyZCA9IFRydWU7Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX1NFTkRfQUxXQVlTIikpIHsKLSsJCWFwcERhdGEuc2VuZEFsd2F5cyA9IFRydWU7Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX1JFQ1ZfVEVYVCIpKSB7Ci0rCQljaGFyICpzID0gZ2V0ZW52KCJWTkNWSUVXRVJfUkVDVl9URVhUIik7Ci0rCQlpZiAoIXN0cmNhc2VjbXAocywgImNsaXBib2FyZCIpKSB7Ci0rCQkJYXBwRGF0YS5yZWN2VGV4dCA9IHN0cmR1cCgiY2xpcGJvYXJkIik7Ci0rCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHMsICJwcmltYXJ5IikpIHsKLSsJCQlhcHBEYXRhLnJlY3ZUZXh0ID0gc3RyZHVwKCJwcmltYXJ5Iik7Ci0rCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHMsICJib3RoIikpIHsKLSsJCQlhcHBEYXRhLnJlY3ZUZXh0ID0gc3RyZHVwKCJib3RoIik7Ci0rCQl9Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX1BJUEVMSU5FX1VQREFURVMiKSkgewotKwkJYXBwRGF0YS5waXBlbGluZVVwZGF0ZXMgPSBUcnVlOwotKwl9IGVsc2UgaWYgKGdldGVudigiVk5DVklFV0VSX05PX1BJUEVMSU5FX1VQREFURVMiKSkgewotKwkJYXBwRGF0YS5waXBlbGluZVVwZGF0ZXMgPSBGYWxzZTsKLSsJfQotKwotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfTk9fSVBWNCIpKSB7Ci0rCQlhcHBEYXRhLm5vaXB2NCA9IFRydWU7Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX05PX0lQVjYiKSkgewotKwkJYXBwRGF0YS5ub2lwdjYgPSBUcnVlOwotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMyAmJiBhcHBEYXRhLnVzZUJHUjU2NSkgewotKwkJYXBwRGF0YS51c2VCR1IyMzMgPSAwOwotKwl9Ci0rCi0rCWlmIChnZXRlbnYoIlNTVk5DX1VMVFJBX0ZUUF9KQVIiKSA9PSBOVUxMICYmIHByb2dyYW1OYW1lICE9IE5VTEwpIHsKLSsJCWludCBsZW4gPSBzdHJsZW4ocHJvZ3JhbU5hbWUpICsgMjAwOwotKwkJY2hhciAqcSwgKmphciA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotKwkJCi0rCQlzcHJpbnRmKGphciwgIiVzIiwgcHJvZ3JhbU5hbWUpOwotKwkJcSA9IHN0cnJjaHIoamFyLCAnLycpOwotKwkJaWYgKHEpIHsKLSsJCQlzdHJ1Y3Qgc3RhdCBzYjsKLSsJCQkqKHErMSkgPSAnXDAnOwotKwkJCXN0cmNhdChqYXIsICIuLi9saWIvc3N2bmMvdXRpbC91bHRyYWZ0cC5qYXIiKTsKLSsJCQlpZiAoc3RhdChqYXIsICZzYikgPT0gMCkgewotKwkJCQljaGFyICpwdXQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLSsJCQkJc3ByaW50ZihwdXQsICJTU1ZOQ19VTFRSQV9GVFBfSkFSPSVzIiwgamFyKTsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJTZXR0aW5nOiAlc1xuXG4iLCBwdXQpOwotKwkJCQlwdXRlbnYocHV0KTsKLSsJCQl9IGVsc2UgewotKwkJCQlzcHJpbnRmKGphciwgIiVzIiwgcHJvZ3JhbU5hbWUpOwotKwkJCQlxID0gc3RycmNocihqYXIsICcvJyk7Ci0rCQkJCSoocSsxKSA9ICdcMCc7Ci0rCQkJCXN0cmNhdChqYXIsICJ1dGlsL3VsdHJhZnRwLmphciIpOwotKwkJCQlpZiAoc3RhdChqYXIsICZzYikgPT0gMCkgewotKwkJCQkJY2hhciAqcHV0ID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0rCQkJCQlzcHJpbnRmKHB1dCwgIlNTVk5DX1VMVFJBX0ZUUF9KQVI9JXMiLCBqYXIpOwotKwkJCQkJZnByaW50ZihzdGRlcnIsICJTZXR0aW5nOiAlc1xuXG4iLCBwdXQpOwotKwkJCQkJcHV0ZW52KHB1dCk7Ci0rCQkJCX0KLSsJCQl9Ci0rCQl9Ci0rCQlmcmVlKGphcik7Ci0rCX0KLSsKLSAKLSAgIC8qIEFkZCBvdXIgYWN0aW9ucyB0byB0aGUgYWN0aW9ucyB0YWJsZSBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIHdpZGdldAotICAgICAgcmVzb3VyY2Ugc3BlY3MgKi8KLSAKLS0gIFh0QXBwQWRkQWN0aW9ucyhhcHBDb250ZXh0LCBhY3Rpb25zLCBYdE51bWJlcihhY3Rpb25zKSk7Ci0rCVh0QXBwQWRkQWN0aW9ucyhhcHBDb250ZXh0LCBhY3Rpb25zLCBYdE51bWJlcihhY3Rpb25zKSk7Ci0gCi0gICAvKiBDaGVjayBhbnkgcmVtYWluaW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBJZiAtbGlzdGVuIHdhcyBzcGVjaWZpZWQKLSAgICAgIHRoZXJlIHNob3VsZCBiZSBub25lLiAgT3RoZXJ3aXNlIHRoZSBvbmx5IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgVk5DCi0gICAgICBzZXJ2ZXIgbmFtZS4gIElmIG5vdCBnaXZlbiB0aGVuIHBvcCB1cCBhIGRpYWxvZyBib3ggYW5kIHdhaXQgZm9yIHRoZQotICAgICAgc2VydmVyIG5hbWUgdG8gYmUgZW50ZXJlZC4gKi8KLSAKLS0gIGlmIChsaXN0ZW5TcGVjaWZpZWQpIHsKLS0gICAgaWYgKGFyZ2MgIT0gMSkgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCJcbiVzIC1saXN0ZW46IGludmFsaWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50OiAlc1xuIiwKLS0JICAgICAgcHJvZ3JhbU5hbWUsIGFyZ3ZbMV0pOwotLSAgICAgIHVzYWdlKCk7Ci0tICAgIH0KLS0gICAgcmV0dXJuOwotLSAgfQotLQotLSAgaWYgKGFyZ2MgPT0gMSkgewotLSAgICB2bmNTZXJ2ZXJOYW1lID0gRG9TZXJ2ZXJEaWFsb2coKTsKLS0gICAgYXBwRGF0YS5wYXNzd29yZERpYWxvZyA9IFRydWU7Ci0tICB9IGVsc2UgaWYgKGFyZ2MgIT0gMikgewotLSAgICB1c2FnZSgpOwotLSAgfSBlbHNlIHsKLS0gICAgdm5jU2VydmVyTmFtZSA9IGFyZ3ZbMV07Ci0tCi0tICAgIGlmICghaXNhdHR5KDApKQotLSAgICAgIGFwcERhdGEucGFzc3dvcmREaWFsb2cgPSBUcnVlOwotLSAgICBpZiAodm5jU2VydmVyTmFtZVswXSA9PSAnLScpCi0tICAgICAgdXNhZ2UoKTsKLS0gIH0KLS0KLS0gIGlmIChzdHJsZW4odm5jU2VydmVyTmFtZSkgPiAyNTUpIHsKLS0gICAgZnByaW50ZihzdGRlcnIsIlZOQyBzZXJ2ZXIgbmFtZSB0b28gbG9uZ1xuIik7Ci0tICAgIGV4aXQoMSk7Ci0tICB9Ci0tCi0tICBjb2xvblBvcyA9IHN0cmNocih2bmNTZXJ2ZXJOYW1lLCAnOicpOwotLSAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLS0gICAgLyogTm8gY29sb24gLS0gdXNlIGRlZmF1bHQgcG9ydCBudW1iZXIgKi8KLS0gICAgc3RyY3B5KHZuY1NlcnZlckhvc3QsIHZuY1NlcnZlck5hbWUpOwotLSAgICB2bmNTZXJ2ZXJQb3J0ID0gU0VSVkVSX1BPUlRfT0ZGU0VUOwotLSAgfSBlbHNlIHsKLS0gICAgbWVtY3B5KHZuY1NlcnZlckhvc3QsIHZuY1NlcnZlck5hbWUsIGNvbG9uUG9zIC0gdm5jU2VydmVyTmFtZSk7Ci0tICAgIHZuY1NlcnZlckhvc3RbY29sb25Qb3MgLSB2bmNTZXJ2ZXJOYW1lXSA9ICdcMCc7Ci0tICAgIGxlbiA9IHN0cmxlbihjb2xvblBvcyArIDEpOwotLSAgICBwb3J0T2Zmc2V0ID0gU0VSVkVSX1BPUlRfT0ZGU0VUOwotLSAgICBpZiAoY29sb25Qb3NbMV0gPT0gJzonKSB7Ci0tICAgICAgLyogVHdvIGNvbG9ucyAtLSBpbnRlcnByZXQgYXMgYSBwb3J0IG51bWJlciAqLwotLSAgICAgIGNvbG9uUG9zKys7Ci0tICAgICAgbGVuLS07Ci0tICAgICAgcG9ydE9mZnNldCA9IDA7Ci0tICAgIH0KLS0gICAgaWYgKCFsZW4gfHwgc3Ryc3BuKGNvbG9uUG9zICsgMSwgIjAxMjM0NTY3ODkiKSAhPSBsZW4pIHsKLS0gICAgICB1c2FnZSgpOwotLSAgICB9Ci0tICAgIHZuY1NlcnZlclBvcnQgPSBhdG9pKGNvbG9uUG9zICsgMSkgKyBwb3J0T2Zmc2V0OwotLSAgfQotKwlpZiAobGlzdGVuU3BlY2lmaWVkKSB7Ci0rCQlpZiAoYXJnYyAhPSAxKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsIlxuJXMgLWxpc3RlbjogaW52YWxpZCBjb21tYW5kIGxpbmUgYXJndW1lbnQ6ICVzXG4iLAotKwkJCXByb2dyYW1OYW1lLCBhcmd2WzFdKTsKLSsJCQl1c2FnZSgpOwotKwkJfQotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCWlmIChhcmdjID09IDEpIHsKLSsJCXZuY1NlcnZlck5hbWUgPSBEb1NlcnZlckRpYWxvZygpOwotKwkJaWYgKCF1c2VfdHR5KCkpIHsKLSsJCQlhcHBEYXRhLnBhc3N3b3JkRGlhbG9nID0gVHJ1ZTsKLSsJCX0KLSsJfSBlbHNlIGlmIChhcmdjICE9IDIpIHsKLSsJCXVzYWdlKCk7Ci0rCX0gZWxzZSB7Ci0rCQl2bmNTZXJ2ZXJOYW1lID0gYXJndlsxXTsKLSsKLSsJCWlmICghdXNlX3R0eSgpKSB7Ci0rCQkJYXBwRGF0YS5wYXNzd29yZERpYWxvZyA9IFRydWU7Ci0rCQl9Ci0rCQlpZiAodm5jU2VydmVyTmFtZVswXSA9PSAnLScpIHsKLSsJCQl1c2FnZSgpOwotKwkJfQotKwl9Ci0rCi0rCWlmIChzdHJsZW4odm5jU2VydmVyTmFtZSkgPiAyNTUpIHsKLSsJCWZwcmludGYoc3RkZXJyLCJWTkMgc2VydmVyIG5hbWUgdG9vIGxvbmdcbiIpOwotKwkJZXhpdCgxKTsKLSsJfQotKwotKwljb2xvblBvcyA9IHN0cnJjaHIodm5jU2VydmVyTmFtZSwgJzonKTsKLSsJYnJhY2tldFBvcyA9IHN0cnJjaHIodm5jU2VydmVyTmFtZSwgJ10nKTsKLSsJaWYgKHN0cnN0cih2bmNTZXJ2ZXJOYW1lLCAiZXhlYz0iKSA9PSB2bmNTZXJ2ZXJOYW1lKSB7Ci0rCQkvKiBzcGVjaWFsIGV4ZWMtZXh0ZXJuYWwtY29tbWFuZCBjYXNlICovCi0rCQlzdHJjcHkodm5jU2VydmVySG9zdCwgdm5jU2VydmVyTmFtZSk7Ci0rCQl2bmNTZXJ2ZXJQb3J0ID0gU0VSVkVSX1BPUlRfT0ZGU0VUOwotKwl9IGVsc2UgaWYgKHN0cnN0cih2bmNTZXJ2ZXJOYW1lLCAiZmQ9IikgPT0gdm5jU2VydmVyTmFtZSkgewotKwkJLyogc3BlY2lhbCBleGVjLWV4dGVybmFsLWNvbW1hbmQgY2FzZSAqLwotKwkJc3RyY3B5KHZuY1NlcnZlckhvc3QsIHZuY1NlcnZlck5hbWUpOwotKwkJdm5jU2VydmVyUG9ydCA9IFNFUlZFUl9QT1JUX09GRlNFVDsKLSsJfSBlbHNlIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7Ci0rCQkvKiBObyBjb2xvbiAtLSB1c2UgZGVmYXVsdCBwb3J0IG51bWJlciAqLwotKwkJc3RyY3B5KHZuY1NlcnZlckhvc3QsIHZuY1NlcnZlck5hbWUpOwotKwkJdm5jU2VydmVyUG9ydCA9IFNFUlZFUl9QT1JUX09GRlNFVDsKLSsJfSBlbHNlIGlmIChicmFja2V0UG9zICE9IE5VTEwgJiYgY29sb25Qb3MgPCBicmFja2V0UG9zKSB7Ci0rCQlzdHJjcHkodm5jU2VydmVySG9zdCwgdm5jU2VydmVyTmFtZSk7Ci0rCQl2bmNTZXJ2ZXJQb3J0ID0gU0VSVkVSX1BPUlRfT0ZGU0VUOwotKwl9IGVsc2UgewotKwkJaWYgKGNvbG9uUG9zID4gdm5jU2VydmVyTmFtZSAmJiAqKGNvbG9uUG9zIC0gMSkgPT0gJzonKSB7Ci0rCQkJY29sb25Qb3MtLTsKLSsJCX0KLSsJCW1lbWNweSh2bmNTZXJ2ZXJIb3N0LCB2bmNTZXJ2ZXJOYW1lLCBjb2xvblBvcyAtIHZuY1NlcnZlck5hbWUpOwotKwkJdm5jU2VydmVySG9zdFtjb2xvblBvcyAtIHZuY1NlcnZlck5hbWVdID0gJ1wwJzsKLSsJCWxlbiA9IHN0cmxlbihjb2xvblBvcyArIDEpOwotKwkJcG9ydE9mZnNldCA9IFNFUlZFUl9QT1JUX09GRlNFVDsKLSsJCWlmIChjb2xvblBvc1sxXSA9PSAnOicpIHsKLSsJCQkvKiBUd28gY29sb25zIC0tIGludGVycHJldCBhcyBhIHBvcnQgbnVtYmVyICovCi0rCQkJY29sb25Qb3MrKzsKLSsJCQlsZW4tLTsKLSsJCQlwb3J0T2Zmc2V0ID0gMDsKLSsJCX0KLSsJCWlmICghbGVuIHx8IHN0cnNwbihjb2xvblBvcyArIDEsICIwMTIzNDU2Nzg5IikgIT0gKHNpemVfdCkgbGVuKSB7Ci0rCQkJdXNhZ2UoKTsKLSsJCX0KLSsjaWYgMAotKwkJdm5jU2VydmVyUG9ydCA9IGF0b2koY29sb25Qb3MgKyAxKSArIHBvcnRPZmZzZXQ7Ci0rI2Vsc2UKLSsJCWRpc3AgPSBhdG9pKGNvbG9uUG9zICsgMSk7Ci0rCQlpZiAocG9ydE9mZnNldCAhPSAwICYmIGRpc3AgPj0gMTAwKSB7Ci0rCQkJcG9ydE9mZnNldCA9IDA7Ci0rCQl9Ci0rCQl2bmNTZXJ2ZXJQb3J0ID0gZGlzcCArIHBvcnRPZmZzZXQ7Ci0rI2VuZGlmCi0rCX0KLSB9Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9jb2xvdXIuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvY29sb3VyLmMKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9jb2xvdXIuYwkyMDAyLTA0LTMwIDA5OjA3OjMxLjAwMDAwMDAwMCAtMDQwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9jb2xvdXIuYwkyMDEwLTAyLTI1IDIyOjAyOjE5LjAwMDAwMDAwMCAtMDUwMAotQEAgLTMxLDkgKzMxLDEyIEBACi0gI2RlZmluZSBCR1IyMzNfU0laRSAyNTYKLSB1bnNpZ25lZCBsb25nIEJHUjIzM1RvUGl4ZWxbQkdSMjMzX1NJWkVdOwotIAotKyNkZWZpbmUgQkdSNTY1X1NJWkUgNjU1MzYKLSt1bnNpZ25lZCBsb25nIEJHUjU2NVRvUGl4ZWxbQkdSNTY1X1NJWkVdOwotKwotIENvbG9ybWFwIGNtYXA7Ci0gVmlzdWFsICp2aXM7Ci0tdW5zaWduZWQgaW50IHZpc2RlcHRoLCB2aXNicHA7Ci0rdW5zaWduZWQgaW50IHZpc2RlcHRoLCB2aXNicHAsIGlzTFNCOwotIEJvb2wgYWxsb2NDb2xvckZhaWxlZCA9IEZhbHNlOwotIAotIHN0YXRpYyBpbnQgbkJHUjIzM0NvbG91cnNBbGxvY2F0ZWQ7Ci1AQCAtNDUsNiArNDgsOCBAQAotIHN0YXRpYyB2b2lkIEFsbG9jYXRlRXhhY3RCR1IyMzNDb2xvdXJzKCk7Ci0gc3RhdGljIEJvb2wgQWxsb2NhdGVCR1IyMzNDb2xvdXIoaW50IHIsIGludCBnLCBpbnQgYik7Ci0gCi0rc3RhdGljIHZvaWQgU2V0dXBCR1I1NjVNYXAodW5zaWduZWQgbG9uZyByZWRfbWFzaywgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrLCB1bnNpZ25lZCBsb25nIGJsdWVfbWFzayk7Ci0rCi0gCi0gLyoKLSAgKiBTZXRWaXN1YWxBbmRDbWFwKCkgZGVhbHMgd2l0aCB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIFggInZpc3VhbHMiICh3aGljaCBhcmUKLUBAIC05Nyw2ICsxMDIsNDQgQEAKLSAgIHZpc2JwcCA9IEdldEJQUEZvckRlcHRoKHZpc2RlcHRoKTsKLSAgIGNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSk7Ci0gCi0rICBpZiAoSW1hZ2VCeXRlT3JkZXIoZHB5KSA9PSBMU0JGaXJzdCkgewotKyAgCWlzTFNCID0gMTsKLSsgIH0gZWxzZSB7Ci0rICAJaXNMU0IgPSAwOwotKyAgfQotKyAgaWYgKHZpc2JwcCA9PSAyNCkgewotKyAgCWlmICghYXBwRGF0YS51c2VCR1IyMzMpIHsKLSsgIAkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBmb3IgMjRicHAgZW5hYmxpbmcgLWJncjU2NSAtLSBEb24ndCB1c2UgRnVsbENvbG9yIVxuIik7IAotKyAgCQlhcHBEYXRhLnVzZUJHUjU2NSA9IFRydWU7Ci0rICAJfSBlbHNlIHsKLSsgIAkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBmb3IgMjRicHAgdXNpbmcgLWJncjIzMyAtLSBEb24ndCB1c2UgRnVsbENvbG9yIVxuIik7IAotKyAgCX0KLSsgIH0KLSsKLSsgIGlmIChhcHBEYXRhLnVzZUJHUjU2NSkgewotKyAgCWlmICh2aXNkZXB0aCA8IDI0IHx8IHZpc2JwcCA8IDI0IHx8IHZpcy0+Y2xhc3MgIT0gVHJ1ZUNvbG9yKSB7Ci0rICAJCWZwcmludGYoc3RkZXJyLCAiZGlzYWJsaW5nIC0xNmJwcCBCR1I1NjUgb24gbm9uLWRlcHRoIDI0IG1hY2hpbmVcbiIpOyAKLSsJCWFwcERhdGEudXNlQkdSNTY1ID0gRmFsc2U7Ci0rICAJfSBlbHNlIHsKLSsJCW15Rm9ybWF0LmJpdHNQZXJQaXhlbCA9IDE2OwotKwkJbXlGb3JtYXQuZGVwdGggPSAxNjsKLSsJCW15Rm9ybWF0LnRydWVDb2xvdXIgPSAxOwotKwkJbXlGb3JtYXQuYmlnRW5kaWFuID0gMDsKLSsJCW15Rm9ybWF0LnJlZE1heCAgID0gMzE7Ci0rCQlteUZvcm1hdC5ncmVlbk1heCA9IDYzOwotKwkJbXlGb3JtYXQuYmx1ZU1heCAgPSAzMTsKLSsJCW15Rm9ybWF0LnJlZFNoaWZ0ICAgPSAxMTsKLSsJCW15Rm9ybWF0LmdyZWVuU2hpZnQgPSA1OwotKwkJbXlGb3JtYXQuYmx1ZVNoaWZ0ICA9IDA7Ci0rCi0rCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgY29sb3JtYXAgYW5kIHRyYW5zbGF0aW5nIGZyb20gQkdSNTY1ICg2NTUzNiBjb2xvcnMpLiAgUGl4ZWwgZm9ybWF0OlxuIik7Ci0rCQlQcmludFBpeGVsRm9ybWF0KCZteUZvcm1hdCk7Ci0rCi0rCQlTZXR1cEJHUjU2NU1hcCh2aXMtPnJlZF9tYXNrLCB2aXMtPmdyZWVuX21hc2ssIHZpcy0+Ymx1ZV9tYXNrKTsKLSsJCXJldHVybjsKLSsgIAl9Ci0rICB9Ci0rCi0gICBpZiAoIWFwcERhdGEudXNlQkdSMjMzICYmICh2aXMtPmNsYXNzID09IFRydWVDb2xvcikpIHsKLSAKLSAgICAgbXlGb3JtYXQuYml0c1BlclBpeGVsID0gdmlzYnBwOwotQEAgLTExNiwyMSArMTU5LDQyIEBACi0gICAgIHJldHVybjsKLSAgIH0KLSAKLS0gIGFwcERhdGEudXNlQkdSMjMzID0gVHJ1ZTsKLSsgIGlmIChhcHBEYXRhLnVzZUJHUjIzMyA9PSAwKSB7Ci0rCWFwcERhdGEudXNlQkdSMjMzID0gMjU2OwotKyAgfQotIAotICAgbXlGb3JtYXQuYml0c1BlclBpeGVsID0gODsKLSAgIG15Rm9ybWF0LmRlcHRoID0gODsKLSAgIG15Rm9ybWF0LnRydWVDb2xvdXIgPSAxOwotICAgbXlGb3JtYXQuYmlnRW5kaWFuID0gMDsKLS0gIG15Rm9ybWF0LnJlZE1heCA9IDc7Ci0rICBteUZvcm1hdC5yZWRNYXggICA9IDc7Ci0gICBteUZvcm1hdC5ncmVlbk1heCA9IDc7Ci0tICBteUZvcm1hdC5ibHVlTWF4ID0gMzsKLS0gIG15Rm9ybWF0LnJlZFNoaWZ0ID0gMDsKLSsgIG15Rm9ybWF0LmJsdWVNYXggID0gMzsKLSsgIG15Rm9ybWF0LnJlZFNoaWZ0ICAgPSAwOwotICAgbXlGb3JtYXQuZ3JlZW5TaGlmdCA9IDM7Ci0tICBteUZvcm1hdC5ibHVlU2hpZnQgPSA2OwotKyAgbXlGb3JtYXQuYmx1ZVNoaWZ0ICA9IDY7Ci0rCi0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMyA9PSA2NCkgewotKwkJLyogQkdSMjIyICovCi0rCQlteUZvcm1hdC5yZWRNYXggICA9IDM7Ci0rCQlteUZvcm1hdC5ncmVlbk1heCA9IDM7Ci0rCQlteUZvcm1hdC5ibHVlTWF4ICA9IDM7Ci0rCQlteUZvcm1hdC5yZWRTaGlmdCAgID0gMDsKLSsJCW15Rm9ybWF0LmdyZWVuU2hpZnQgPSAyOwotKwkJbXlGb3JtYXQuYmx1ZVNoaWZ0ICA9IDQ7Ci0rCX0KLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDgpIHsKLSsJCS8qIEJHUjExMSAqLwotKwkJbXlGb3JtYXQucmVkTWF4ICAgPSAyOwotKwkJbXlGb3JtYXQuZ3JlZW5NYXggPSAyOwotKwkJbXlGb3JtYXQuYmx1ZU1heCAgPSAyOwotKwkJbXlGb3JtYXQucmVkU2hpZnQgICA9IDA7Ci0rCQlteUZvcm1hdC5ncmVlblNoaWZ0ID0gMTsKLSsJCW15Rm9ybWF0LmJsdWVTaGlmdCAgPSAyOwotKwl9Ci0gCi0gICBmcHJpbnRmKHN0ZGVyciwKLS0gICAgICAgIlVzaW5nIGRlZmF1bHQgY29sb3JtYXAgYW5kIHRyYW5zbGF0aW5nIGZyb20gQkdSMjMzLiAgUGl4ZWwgZm9ybWF0OlxuIik7Ci0rICAgICAgICJVc2luZyBkZWZhdWx0IGNvbG9ybWFwIGFuZCB0cmFuc2xhdGluZyBmcm9tIEJHUjIzMyAoJWQgY29sb3JzKS4gIFBpeGVsIGZvcm1hdDpcbiIsIGFwcERhdGEudXNlQkdSMjMzKTsKLSAgIFByaW50UGl4ZWxGb3JtYXQoJm15Rm9ybWF0KTsKLSAKLSAgIFNldHVwQkdSMjMzTWFwKCk7Ci1AQCAtMjgyLDggKzM0NiwxMiBAQAotICAgWEZyZWUoZm9ybWF0KTsKLSAKLSAgIGlmIChicHAgIT0gMSAmJiBicHAgIT0gOCAmJiBicHAgIT0gMTYgJiYgYnBwICE9IDMyKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBjb3BlIHdpdGggJWQgYml0cy1wZXItcGl4ZWwuICBTb3JyeS5cbiIsIGJwcCk7Ci0tICAgIGV4aXQoMSk7Ci0rCWlmIChicHAgPT0gMjQpIHsKLSsJCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiAyNCBiaXRzLXBlci1waXhlbCBtYXkgaGF2ZSBwcm9ibGVtcy4uLlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiQ2FuJ3QgY29wZSB3aXRoICVkIGJpdHMtcGVyLXBpeGVsLiAgU29ycnkuXG4iLCBicHApOwotKwkJZXhpdCgxKTsKLSsJfQotICAgfQotIAotICAgcmV0dXJuIGJwcDsKLUBAIC0zNzQsNyArNDQyLDcgQEAKLSAJaWYgKCFleGFjdEJHUjIzM1tpXSAmJgotIAkgICAgWEFsbG9jQ29sb3IoZHB5LCBjbWFwLCAmY21hcEVudHJ5W2ldKSkgewotIAotLQkgIGlmIChjbWFwRW50cnlbaV0ucGl4ZWwgPT0gaSkgewotKwkgIGlmICgobG9uZykgY21hcEVudHJ5W2ldLnBpeGVsID09IGkpIHsKLSAKLSAJICAgIHNoYXJlZFtpXSA9IFRydWU7IC8qIHByb2JhYmx5IHNoYXJlZCAqLwotIAotQEAgLTM5NCwxNiArNDYyLDQzIEBACi0gICAgIGZvciAociA9IDA7IHIgPCA4OyByKyspIHsKLSAgICAgICBmb3IgKGcgPSAwOyBnIDwgODsgZysrKSB7Ci0gCWZvciAoYiA9IDA7IGIgPCA0OyBiKyspIHsKLS0JICBpZiAoQkdSMjMzVG9QaXhlbFsoYjw8NikgfCAoZzw8MykgfCByXSA9PSBJTlZBTElEX1BJWEVMKSB7Ci0rCQlpbnQgYnMgPSA2LCBncyA9IDMsIHJzID0gMDsKLSsJCWludCBibSA9IDMsIGdtID0gNywgcm0gPSA3OwotKwkJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDY0KSB7Ci0rCQkJYnMgPSA0OyBncyA9IDI7IHJzID0gMDsKLSsJCQlibSA9IDM7IGdtID0gMzsgcm0gPSAzOwotKwkJfQotKwkJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDgpIHsKLSsJCQlicyA9IDI7IGdzID0gMTsgcnMgPSAwOwotKwkJCWJtID0gMTsgZ20gPSAxOyBybSA9IDE7Ci0rCQl9Ci0rCQlpZiAoKGIgPiBibSB8fCBnID4gZ20gfHwgciA+IHJtKSkgewotKwkJCWNvbnRpbnVlOwotKwkJfQotKwkgIGlmIChCR1IyMzNUb1BpeGVsWyhiPDxicykgfCAoZzw8Z3MpIHwgKHI8PHJzKV0gPT0gSU5WQUxJRF9QSVhFTCkgewotIAotIAkgICAgdW5zaWduZWQgbG9uZyBtaW5EaXN0YW5jZSA9IFVMT05HX01BWDsKLSAKLSAJICAgIGZvciAoaSA9IDA7IGkgPCBjbWFwU2l6ZTsgaSsrKSB7Ci0gCSAgICAgIGlmIChleGFjdEJHUjIzM1tpXSB8fCBzaGFyZWRbaV0pIHsKLS0JCXVuc2lnbmVkIGxvbmcgZGlzdGFuY2UKLS0JCSAgPSAoYWJzKGNtYXBFbnRyeVtpXS5yZWQgLSByICogNjU1MzUgLyA3KQotLQkJICAgICArIGFicyhjbWFwRW50cnlbaV0uZ3JlZW4gLSBnICogNjU1MzUgLyA3KQotLQkJICAgICArIGFicyhjbWFwRW50cnlbaV0uYmx1ZSAtIGIgKiA2NTUzNSAvIDMpKTsKLSsJCXVuc2lnbmVkIGxvbmcgZGlzdGFuY2U7Ci0rCQlpbnQgcjEsIGcxLCBiMTsKLSsJCWlmIChhcHBEYXRhLnVzZUdyZXlTY2FsZSkgewotKwkJCWludCBhdmU7Ci0rCQkJYXZlID0gKHIgKyBnICsgMipiKS8zOwotKwkJCXIxID0gYXZlOwotKwkJCWcxID0gYXZlOwotKwkJCWIxID0gYXZlLzI7Ci0rCQl9IGVsc2UgewotKwkJCXIxID0gcjsKLSsJCQlnMSA9IGc7Ci0rCQkJYjEgPSBiOwotKwkJfQotKwkJZGlzdGFuY2UKLSsJCSAgPSAoICBhYnMoY21hcEVudHJ5W2ldLnJlZCAgIC0gcjEgKiA2NTUzNSAvIHJtKQotKwkJICAgICArIGFicyhjbWFwRW50cnlbaV0uZ3JlZW4gLSBnMSAqIDY1NTM1IC8gZ20pCi0rCQkgICAgICsgYWJzKGNtYXBFbnRyeVtpXS5ibHVlICAtIGIxICogNjU1MzUgLyBibSkpOwotKwotIAotIAkJaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHsKLSAJCSAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKLUBAIC00MTIsNyArNTA3LDcgQEAKLSAJICAgICAgfQotIAkgICAgfQotIAotLQkgICAgQkdSMjMzVG9QaXhlbFsoYjw8NikgfCAoZzw8MykgfCByXSA9IG5lYXJlc3RQaXhlbDsKLSsJICAgIEJHUjIzM1RvUGl4ZWxbKGI8PGJzKSB8IChnPDxncykgfCAocjw8cnMpXSA9IG5lYXJlc3RQaXhlbDsKLSAJICAgIGlmIChzaGFyZWRbbmVhcmVzdFBpeGVsXSAmJiAhdXNlZEFzTmVhcmVzdFtuZWFyZXN0UGl4ZWxdKQotIAkgICAgICBuU2hhcmVkVXNlZCsrOwotIAkgICAgdXNlZEFzTmVhcmVzdFtuZWFyZXN0UGl4ZWxdID0gVHJ1ZTsKLUBAIC00MzMsNiArNTI4LDU5IEBACi0gICB9Ci0gfQotIAotK3N0YXRpYyB2b2lkCi0rU2V0dXBCR1I1NjVNYXAodW5zaWduZWQgbG9uZyByZWRfbWFzaywgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrLCB1bnNpZ25lZCBsb25nIGJsdWVfbWFzaykKLSt7Ci0rICBpbnQgciwgZywgYjsKLSsgIGludCByMiwgZzIsIGIyOwotKyAgbG9uZyBpZHg7Ci0rICBpbnQgY250ID0gMDsKLSsgIHVuc2lnbmVkIGxvbmcgcGl4ZWwgPSAwOwotKwotKyAgICBmb3IgKHIgPSAwOyByIDwgMzI7IHIrKykgewotKyAgICAgIGZvciAoZyA9IDA7IGcgPCA2NDsgZysrKSB7Ci0rCWZvciAoYiA9IDA7IGIgPCAzMjsgYisrKSB7Ci0rCQlpbnQgYnMgPSAwLCBncyA9IDUsIHJzID0gMTE7Ci0rCQlpbnQgYm0gPSAzMSwgZ20gPSA2Mywgcm0gPSAzMTsKLSsJCWlmICgoYiA+IGJtIHx8IGcgPiBnbSB8fCByID4gcm0pKSB7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCQlyMiA9ICgyNTUgKiByKSAvIHJtOwotKwkJZzIgPSAoMjU1ICogZykgLyBnbTsKLSsJCWIyID0gKDI1NSAqIGIpIC8gYm07Ci0rCi0rCQlwaXhlbCA9IChyMiA8PCAxNikgfCAoZzIgPDwgOCkgfCAoYjIgPDwgMCk7Ci0rCQlpZiAoYXBwRGF0YS51c2VHcmV5U2NhbGUpIHsKLSsJCQlpbnQgYXZlOwotKwkJCWludCByMSwgZzEsIGIxOwotKwkJCWF2ZSA9ICgyKnIgKyBnICsgMipiKS8zOwotKwkJCXIxID0gYXZlLzI7Ci0rCQkJZzEgPSBhdmU7Ci0rCQkJYjEgPSBhdmUvMjsKLSsKLSsJCQlyMiA9ICgyNTUgKiByMSkgLyBybTsKLSsJCQlnMiA9ICgyNTUgKiBnMSkgLyBnbTsKLSsJCQliMiA9ICgyNTUgKiBiMSkgLyBibTsKLSsKLSsJCQlwaXhlbCA9IChyMiA8PCAxNikgfCAoZzIgPDwgOCkgfCAoYjIgPDwgMCk7Ci0rCQl9Ci0rCi0rCQlpZiAocmVkX21hc2sgPT0gMHhmZikgewotKwkJCWlkeCA9IChyPDxicykgfCAoZzw8Z3MpIHwgKGI8PHJzKTsKLSsJCX0gZWxzZSB7Ci0rCQkJaWR4ID0gKGI8PGJzKSB8IChnPDxncykgfCAocjw8cnMpOwotKwkJfQotKwkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiY250OiAlNWQgaWR4OiAlbHUgcGl4ZWw6IDB4JTA4eFxuIiwgY250LCBpZHgsICh1bnNpZ25lZCBpbnQpIHBpeGVsKTsKLSsJCUJHUjU2NVRvUGl4ZWxbaWR4XSA9IHBpeGVsOwotKwkJY250Kys7Ci0rCX0KLSsgICAgICB9Ci0rICAgIH0KLSsJZ3JlZW5fbWFzayA9IDA7Ci0rCWJsdWVfbWFzayA9IDA7Ci0rfQotKwotKwotIAotIC8qCi0gICogQWxsb2NhdGVFeGFjdEJHUjIzM0NvbG91cnMoKSBhdHRlbXB0cyB0byBhbGxvY2F0ZSBlYWNoIG9mIHRoZSBjb2xvdXJzIGluIHRoZQotQEAgLTQ4NCw4ICs2MzIsMTMgQEAKLSAgICAgcmkgPSBybjsKLSAgICAgZm9yIChnaSA9IDA7IGdpIDwgZ247IGdpKyspIHsKLSAgICAgICBmb3IgKGJpID0gMDsgYmkgPCBibjsgYmkrKykgewotLQlpZiAoIUFsbG9jYXRlQkdSMjMzQ29sb3VyKHJ2W3JpXSwgZ3ZbZ2ldLCBidltiaV0pKQotLQkgIHJldHVybjsKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDY0ICYmIChidltiaV0gPiAzIHx8IGd2W2dpXSA+IDMgfHwgcnZbcmldID4gMykpIHsKLSsJCW5CR1IyMzNDb2xvdXJzQWxsb2NhdGVkKys7Ci0rCX0gZWxzZSBpZiAoYXBwRGF0YS51c2VCR1IyMzMgPT0gOCAmJiAoYnZbYmldID4gMSB8fCBndltnaV0gPiAxIHx8IHJ2W3JpXSA+IDEpKSB7Ci0rCQluQkdSMjMzQ29sb3Vyc0FsbG9jYXRlZCsrOwotKwl9IGVsc2UgaWYgKCFBbGxvY2F0ZUJHUjIzM0NvbG91cihydltyaV0sIGd2W2dpXSwgYnZbYmldKSkgewotKwkJcmV0dXJuOwotKwl9Ci0gICAgICAgfQotICAgICB9Ci0gICAgIHJuKys7Ci1AQCAtNDk2LDggKzY0OSwxMyBAQAotICAgICBnaSA9IGduOwotICAgICBmb3IgKHJpID0gMDsgcmkgPCBybjsgcmkrKykgewotICAgICAgIGZvciAoYmkgPSAwOyBiaSA8IGJuOyBiaSsrKSB7Ci0tCWlmICghQWxsb2NhdGVCR1IyMzNDb2xvdXIocnZbcmldLCBndltnaV0sIGJ2W2JpXSkpCi0tCSAgcmV0dXJuOwotKwlpZiAoYXBwRGF0YS51c2VCR1IyMzMgPT0gNjQgJiYgKGJ2W2JpXSA+IDMgfHwgZ3ZbZ2ldID4gMyB8fCBydltyaV0gPiAzKSkgewotKwkJbkJHUjIzM0NvbG91cnNBbGxvY2F0ZWQrKzsKLSsJfSBlbHNlIGlmIChhcHBEYXRhLnVzZUJHUjIzMyA9PSA4ICYmIChidltiaV0gPiAxIHx8IGd2W2dpXSA+IDEgfHwgcnZbcmldID4gMSkpIHsKLSsJCW5CR1IyMzNDb2xvdXJzQWxsb2NhdGVkKys7Ci0rCX0gZWxzZSBpZiAoIUFsbG9jYXRlQkdSMjMzQ29sb3VyKHJ2W3JpXSwgZ3ZbZ2ldLCBidltiaV0pKSB7Ci0rCSAgCXJldHVybjsKLSsJfQotICAgICAgIH0KLSAgICAgfQotICAgICBnbisrOwotQEAgLTUwNyw4ICs2NjUsMTMgQEAKLSAgICAgICBiaSA9IGJuOwotICAgICAgIGZvciAocmkgPSAwOyByaSA8IHJuOyByaSsrKSB7Ci0gCWZvciAoZ2kgPSAwOyBnaSA8IGduOyBnaSsrKSB7Ci0tCSAgaWYgKCFBbGxvY2F0ZUJHUjIzM0NvbG91cihydltyaV0sIGd2W2dpXSwgYnZbYmldKSkKLS0JICAgIHJldHVybjsKLSsJICBpZiAoYXBwRGF0YS51c2VCR1IyMzMgPT0gNjQgJiYgKGJ2W2JpXSA+IDMgfHwgZ3ZbZ2ldID4gMyB8fCBydltyaV0gPiAzKSkgewotKwkJbkJHUjIzM0NvbG91cnNBbGxvY2F0ZWQrKzsKLSsJICB9IGVsc2UgaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDggJiYgKGJ2W2JpXSA+IDEgfHwgZ3ZbZ2ldID4gMSB8fCBydltyaV0gPiAxKSkgewotKwkJbkJHUjIzM0NvbG91cnNBbGxvY2F0ZWQrKzsKLSsJICB9IGVsc2UgaWYgKCFBbGxvY2F0ZUJHUjIzM0NvbG91cihydltyaV0sIGd2W2dpXSwgYnZbYmldKSkgewotKwkgICAgCXJldHVybjsKLSsJICB9Ci0gCX0KLSAgICAgICB9Ci0gICAgICAgYm4rKzsKLUBAIC01MjksMTggKzY5MiwzNiBAQAotIEFsbG9jYXRlQkdSMjMzQ29sb3VyKGludCByLCBpbnQgZywgaW50IGIpCi0gewotICAgWENvbG9yIGM7Ci0rCWludCBicyA9IDYsIGdzID0gMywgcnMgPSAwOwotKwlpbnQgYm0gPSAzLCBnbSA9IDcsIHJtID0gNzsKLSAKLSAgIGlmIChuQkdSMjMzQ29sb3Vyc0FsbG9jYXRlZCA+PSBhcHBEYXRhLm5Db2xvdXJzKQotICAgICByZXR1cm4gRmFsc2U7Ci0gCi0tICBjLnJlZCA9IHIgKiA2NTUzNSAvIDc7Ci0tICBjLmdyZWVuID0gZyAqIDY1NTM1IC8gNzsKLS0gIGMuYmx1ZSA9IGIgKiA2NTUzNSAvIDM7Ci0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMyA9PSA2NCkgewotKwkJYnMgPSA0OyBncyA9IDIsIHJzID0gMDsKLSsJCWJtID0gMzsgZ20gPSAzOyBybSA9IDM7Ci0rCX0KLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDgpIHsKLSsJCWJzID0gMjsgZ3MgPSAxLCBycyA9IDA7Ci0rCQlibSA9IDE7IGdtID0gMTsgcm0gPSAxOwotKwl9Ci0rCi0rCWMucmVkID0gICByICogNjU1MzUgLyBybTsKLSsJYy5ncmVlbiA9IGcgKiA2NTUzNSAvIGdtOwotKwljLmJsdWUgPSAgYiAqIDY1NTM1IC8gYm07Ci0rCWlmIChhcHBEYXRhLnVzZUdyZXlTY2FsZSkgewotKwkJaW50IGF2ZTsKLSsJCWF2ZSA9IChjLnJlZCArIGMuZ3JlZW4gKyBjLmJsdWUpLzM7Ci0rCQljLnJlZCAgID0gYXZlOwotKwkJYy5ncmVlbiA9IGF2ZTsKLSsJCWMuYmx1ZSAgPSBhdmU7Ci0rCX0KLSAKLSAgIGlmICghWEFsbG9jQ29sb3IoZHB5LCBjbWFwLCAmYykpCi0gICAgIHJldHVybiBGYWxzZTsKLSAKLS0gIEJHUjIzM1RvUGl4ZWxbKGI8PDYpIHwgKGc8PDMpIHwgcl0gPSBjLnBpeGVsOwotKyAgQkdSMjMzVG9QaXhlbFsoYjw8YnMpIHwgKGc8PGdzKSB8IHJdID0gYy5waXhlbDsKLSAKLSAgIG5CR1IyMzNDb2xvdXJzQWxsb2NhdGVkKys7Ci0gCi1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9jb3JyZS5jIHZuY191bml4c3JjL3ZuY3ZpZXdlci9jb3JyZS5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvY29ycmUuYwkyMDAwLTA2LTExIDA4OjAwOjUzLjAwMDAwMDAwMCAtMDQwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9jb3JyZS5jCTIwMDgtMTAtMDUgMTU6MTY6MDEuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMjksNiArMjksMTggQEAKLSAjZGVmaW5lIEhhbmRsZUNvUlJFQlBQIENPTkNBVDJFKEhhbmRsZUNvUlJFLEJQUCkKLSAjZGVmaW5lIENBUkRCUFAgQ09OQ0FUMkUoQ0FSRCxCUFApCi0gCi0rI2RlZmluZSBGaWxsUmVjdGFuZ2xlKHgsIHksIHcsIGgsIGNvbG9yKSAgXAotKwl7IFwKLSsJCVhHQ1ZhbHVlcyBfZ2N2OyBcCi0rCQlfZ2N2LmZvcmVncm91bmQgPSBjb2xvcjsgXAotKwkJaWYgKCFhcHBEYXRhLnVzZVhzZXJ2ZXJCYWNraW5nU3RvcmUpIHsgXAotKwkJCUZpbGxTY3JlZW4oeCwgeSwgdywgaCwgX2djdi5mb3JlZ3JvdW5kKTsgXAotKwkJfSBlbHNlIHsgXAotKwkJCVhDaGFuZ2VHQyhkcHksIGdjLCBHQ0ZvcmVncm91bmQsICZfZ2N2KTsgXAotKwkJCVhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHgsIHksIHcsIGgpOyBcCi0rCQl9IFwKLSsJfQotKwotIHN0YXRpYyBCb29sCi0gSGFuZGxlQ29SUkVCUFAgKGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCkKLSB7Ci1AQCAtNTAsMTEgKzYyLDE5IEBACi0gI2lmIChCUFAgPT0gOCkKLSAgICAgZ2N2LmZvcmVncm91bmQgPSAoYXBwRGF0YS51c2VCR1IyMzMgPyBCR1IyMzNUb1BpeGVsW3BpeF0gOiBwaXgpOwotICNlbHNlCi0rI2lmIChCUFAgPT0gMTYpCi0rICAgIGdjdi5mb3JlZ3JvdW5kID0gKGFwcERhdGEudXNlQkdSNTY1ID8gQkdSNTY1VG9QaXhlbFtwaXhdIDogcGl4KTsKLSsjZWxzZQotICAgICBnY3YuZm9yZWdyb3VuZCA9IHBpeDsKLSAjZW5kaWYKLSsjZW5kaWYKLSAKLSsjaWYgMAotICAgICBYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmZ2N2KTsKLSAgICAgWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBnYywgcngsIHJ5LCBydywgcmgpOwotKyNlbHNlCi0rICAgIEZpbGxSZWN0YW5nbGUocngsIHJ5LCBydywgcmgsIGdjdi5mb3JlZ3JvdW5kKTsKLSsjZW5kaWYKLSAKLSAgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihidWZmZXIsIGhkci5uU3VicmVjdHMgKiAoNCArIChCUFAgLyA4KSkpKQotIAlyZXR1cm4gRmFsc2U7Ci1AQCAtNzIsMTIgKzkyLDIyIEBACi0gI2lmIChCUFAgPT0gOCkKLSAJZ2N2LmZvcmVncm91bmQgPSAoYXBwRGF0YS51c2VCR1IyMzMgPyBCR1IyMzNUb1BpeGVsW3BpeF0gOiBwaXgpOwotICNlbHNlCi0rI2lmIChCUFAgPT0gMTYpCi0rCWdjdi5mb3JlZ3JvdW5kID0gKGFwcERhdGEudXNlQkdSNTY1ID8gQkdSNTY1VG9QaXhlbFtwaXhdIDogcGl4KTsKLSsjZWxzZQotIAlnY3YuZm9yZWdyb3VuZCA9IHBpeDsKLSAjZW5kaWYKLSsjZW5kaWYKLSAKLSsjaWYgMAotIAlYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmZ2N2KTsKLSAJWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBnYywgcnggKyB4LCByeSArIHksIHcsIGgpOwotKyNlbHNlCi0rCUZpbGxSZWN0YW5nbGUocnggKyB4LCByeSArIHksIHcsIGgsIGdjdi5mb3JlZ3JvdW5kKTsKLSsjZW5kaWYKLSAgICAgfQotIAotICAgICByZXR1cm4gVHJ1ZTsKLSB9Ci0rCi0rI3VuZGVmIEZpbGxSZWN0YW5nbGUKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2NwX2l0IHZuY191bml4c3JjL3ZuY3ZpZXdlci9jcF9pdAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2NwX2l0CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2NwX2l0CTIwMDktMDMtMDYgMjA6MDI6MDUuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMCwwICsxLDE4IEBACi0rIyEvYmluL3NoCi0rCi0rZGVzdD0vZGlzdC9iaW4vdm5jdmlld2Vyei0xLjNkZXY1LXJlc2l6ZQotK3N1YyAiY3AgLXAgJGRlc3QgJGRlc3QuYmFjazsgbXYgJGRlc3QgJGRlc3QudW5saW5rOyBtdiAkZGVzdC5iYWNrICRkZXN0OyBybSAkZGVzdC51bmxpbmsiCi0rc3RyaXAgLi92bmN2aWV3ZXIKLStjYXQgICAuL3ZuY3ZpZXdlciA+ICRkZXN0Ci0rdG91Y2ggLXIgLi92bmN2aWV3ZXIgJGRlc3QgCi0reXk9L2Rpc3Qvc3JjL2FwcHMvVk5DL2V0Yy9saWJ2bmNzZXJ2ZXJfY3ZzL2V4cHRzL2V0di9zc3ZuYy9iaW4vTGludXguaTY4Ni92bmN2aWV3ZXIKLSttdiAkeXkgJHl5LnVubGluawotK2NwIC1wIC4vdm5jdmlld2VyICR5eQotK212ICR5eS50dXJib3ZuYyAkeXkudW5saW5rLnR1cmJvdm5jCi0rY3AgLXAgLi92bmN2aWV3ZXIgJEhPTUUvZXR2X2NvbC9MaW51eC5pNjg2Ci0rY3AgLXAgLi92bmN2aWV3ZXIudHVyYm92bmMgJHl5LnR1cmJvdm5jCi0rY3AgLXAgLi92bmN2aWV3ZXIudHVyYm92bmMgJEhPTUUvZXR2X2NvbC9MaW51eC5pNjg2L3ZuY3ZpZXdlci50dXJib3ZuYwotK2NobW9kIDc1NSAkeXkqCi0rCi0rcm0gLWYgJHl5LnVubGluayoKLStscyAtbCAuL3ZuY3ZpZXdlciogJGRlc3QgJHl5KiAkSE9NRS9ldHZfY29sL0xpbnV4Lmk2ODYvdm5jdmlld2VyKgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvY3Vyc29yLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2N1cnNvci5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvY3Vyc29yLmMJMjAwMy0wMS0xNSAwNDo0Njo1Mi4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvY3Vyc29yLmMJMjAxMC0wMi0yNSAyMjowNDoyOC4wMDAwMDAwMDAgLTA1MDAKLUBAIC0zOCw4ICszOCwxMSBAQAotIAotIAotIHN0YXRpYyBCb29sIHByZXZTb2Z0Q3Vyc29yU2V0ID0gRmFsc2U7Ci0tc3RhdGljIFBpeG1hcCByY1NhdmVkQXJlYTsKLS1zdGF0aWMgQ0FSRDggKnJjU291cmNlLCAqcmNNYXNrOwotK3N0YXRpYyBQaXhtYXAgcmNTYXZlZEFyZWEsIHJjU2F2ZWRBcmVhXzA7Ci0rc3RhdGljIGludCByY1NhdmVkQXJlYV93ID0gLTEsIHJjU2F2ZWRBcmVhX2ggPSAtMTsKLStzdGF0aWMgY2hhciAqcmNTYXZlZFNjYWxlID0gTlVMTDsKLStzdGF0aWMgaW50IHJjU2F2ZWRTY2FsZV9sZW4gPSAwOwotK3N0YXRpYyBDQVJEOCAqcmNTb3VyY2UgPSBOVUxMLCAqcmNNYXNrOwotIHN0YXRpYyBpbnQgcmNIb3RYLCByY0hvdFksIHJjV2lkdGgsIHJjSGVpZ2h0OwotIHN0YXRpYyBpbnQgcmNDdXJzb3JYID0gMCwgcmNDdXJzb3JZID0gMDsKLSBzdGF0aWMgaW50IHJjTG9ja1gsIHJjTG9ja1ksIHJjTG9ja1dpZHRoLCByY0xvY2tIZWlnaHQ7Ci1AQCAtNDgsOCArNTEsMTMgQEAKLSBzdGF0aWMgQm9vbCBTb2Z0Q3Vyc29ySW5Mb2NrZWRBcmVhKHZvaWQpOwotIHN0YXRpYyB2b2lkIFNvZnRDdXJzb3JDb3B5QXJlYShpbnQgb3Blcik7Ci0gc3RhdGljIHZvaWQgU29mdEN1cnNvckRyYXcodm9pZCk7Ci0tc3RhdGljIHZvaWQgRnJlZVNvZnRDdXJzb3Iodm9pZCk7Ci0tc3RhdGljIHZvaWQgRnJlZVgxMUN1cnNvcigpOwotK3ZvaWQgRnJlZVNvZnRDdXJzb3Iodm9pZCk7Ci0rdm9pZCBGcmVlWDExQ3Vyc29yKCk7Ci0rCi0rZXh0ZXJuIFhJbWFnZSAqaW1hZ2U7Ci0rZXh0ZXJuIFhJbWFnZSAqaW1hZ2Vfc2NhbGU7Ci0rZXh0ZXJuIGludCBzY2FsZV94LCBzY2FsZV95OwotK2ludCBzY2FsZV9yb3VuZChpbnQgbiwgZG91YmxlIGZhY3Rvcik7Ci0gCi0gLyogQ29waWVkIGZyb20gWHZuYy9saWIvZm9udC91dGlsL3V0aWxiaXRtYXAuYyAqLwotIHN0YXRpYyB1bnNpZ25lZCBjaGFyIF9yZXZlcnNlX2J5dGVbMHgxMDBdID0gewotQEAgLTkxLDYgKzk5LDggQEAKLSBzdGF0aWMgQm9vbCBwcmV2WEN1cnNvclNldCA9IEZhbHNlOwotIHN0YXRpYyBDdXJzb3IgcHJldlhDdXJzb3I7Ci0gCi0rZXh0ZXJuIGRvdWJsZSBzY2FsZV9mYWN0b3JfeDsKLStleHRlcm4gZG91YmxlIHNjYWxlX2ZhY3Rvcl95OwotIAotIEJvb2wgSGFuZGxlWEN1cnNvcihpbnQgeGhvdCwgaW50IHlob3QsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSB7Ci1AQCAtMTI0LDcgKzEzNCw3IEBACi0gICAgIFhRdWVyeUJlc3RDdXJzb3IoZHB5LCBkciwgd2lkdGgsIGhlaWdodCwgJndyZXQsICZocmV0KTsKLSAgIH0KLSAKLS0gIGlmICh3aWR0aCAqIGhlaWdodCA9PSAwIHx8IHdyZXQgPCB3aWR0aCB8fCBocmV0IDwgaGVpZ2h0KSB7Ci0rICBpZiAod2lkdGggKiBoZWlnaHQgPT0gMCB8fCAoaW50KSB3cmV0IDwgd2lkdGggfHwgKGludCkgaHJldCA8IGhlaWdodCkgewotICAgICAvKiBGcmVlIHJlc291cmNlcyAqLwotICAgICBpZiAoYnVmICE9IE5VTEwpCi0gICAgICAgZnJlZShidWYpOwotQEAgLTEzOSw3ICsxNDksNyBAQAotICAgZmcuZ3JlZW4gPSAodW5zaWduZWQgc2hvcnQpY29sb3JzLmZvcmVHcmVlbiA8PCA4IHwgY29sb3JzLmZvcmVHcmVlbjsKLSAgIGZnLmJsdWUgID0gKHVuc2lnbmVkIHNob3J0KWNvbG9ycy5mb3JlQmx1ZSAgPDwgOCB8IGNvbG9ycy5mb3JlQmx1ZTsKLSAKLS0gIGZvciAoaSA9IDA7IGkgPCBieXRlc0RhdGEgKiAyOyBpKyspCi0rICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgYnl0ZXNEYXRhICogMjsgaSsrKQotICAgICBidWZbaV0gPSAoY2hhcilfcmV2ZXJzZV9ieXRlWyhpbnQpYnVmW2ldICYgMHhGRl07Ci0gCi0gICBzb3VyY2UgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBkciwgYnVmLCB3aWR0aCwgaGVpZ2h0KTsKLUBAIC0xNjcsMTQ4ICsxNzcsMTc5IEBACi0gCi0gQm9vbCBIYW5kbGVDdXJzb3JTaGFwZShpbnQgeGhvdCwgaW50IHlob3QsIGludCB3aWR0aCwgaW50IGhlaWdodCwgQ0FSRDMyIGVuYykKLSB7Ci0tICBpbnQgYnl0ZXNQZXJQaXhlbDsKLS0gIHNpemVfdCBieXRlc1BlclJvdywgYnl0ZXNNYXNrRGF0YTsKLS0gIERyYXdhYmxlIGRyOwotLSAgcmZiWEN1cnNvckNvbG9ycyByZ2I7Ci0tICBDQVJEMzIgY29sb3JzWzJdOwotLSAgY2hhciAqYnVmOwotLSAgQ0FSRDggKnB0cjsKLS0gIGludCB4LCB5LCBiOwotLQotLSAgYnl0ZXNQZXJQaXhlbCA9IG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0tICBieXRlc1BlclJvdyA9ICh3aWR0aCArIDcpIC8gODsKLS0gIGJ5dGVzTWFza0RhdGEgPSBieXRlc1BlclJvdyAqIGhlaWdodDsKLS0gIGRyID0gRGVmYXVsdFJvb3RXaW5kb3coZHB5KTsKLS0KLS0gIEZyZWVTb2Z0Q3Vyc29yKCk7Ci0rCWludCBieXRlc1BlclBpeGVsOwotKwlzaXplX3QgYnl0ZXNQZXJSb3csIGJ5dGVzTWFza0RhdGE7Ci0rCURyYXdhYmxlIGRyOwotKwlyZmJYQ3Vyc29yQ29sb3JzIHJnYjsKLSsJQ0FSRDMyIGNvbG9yc1syXTsKLSsJY2hhciAqYnVmOwotKwlDQVJEOCAqcHRyOwotKwlpbnQgeCwgeSwgYjsKLSsKLSsJYnl0ZXNQZXJQaXhlbCA9IG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0rCWJ5dGVzUGVyUm93ID0gKHdpZHRoICsgNykgLyA4OwotKwlieXRlc01hc2tEYXRhID0gYnl0ZXNQZXJSb3cgKiBoZWlnaHQ7Ci0rCWRyID0gRGVmYXVsdFJvb3RXaW5kb3coZHB5KTsKLSAKLS0gIGlmICh3aWR0aCAqIGhlaWdodCA9PSAwKQotLSAgICByZXR1cm4gVHJ1ZTsKLS0KLS0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcGl4ZWwgZGF0YSBhbmQgdGVtcG9yYXJ5IG1hc2sgZGF0YS4gKi8KLSsJRnJlZVNvZnRDdXJzb3IoKTsKLSAKLS0gIHJjU291cmNlID0gbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbCk7Ci0tICBpZiAocmNTb3VyY2UgPT0gTlVMTCkKLS0gICAgcmV0dXJuIEZhbHNlOwotLQotLSAgYnVmID0gbWFsbG9jKGJ5dGVzTWFza0RhdGEpOwotLSAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0tICAgIGZyZWUocmNTb3VyY2UpOwotLSAgICByZXR1cm4gRmFsc2U7Ci0tICB9Ci0rCWlmICh3aWR0aCAqIGhlaWdodCA9PSAwKSB7Ci0rCQlyZXR1cm4gVHJ1ZTsKLSsJfQotIAotLSAgLyogUmVhZCBhbmQgZGVjb2RlIGN1cnNvciBwaXhlbCBkYXRhLCBkZXBlbmRpbmcgb24gdGhlIGVuY29kaW5nIHR5cGUuICovCi0rCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcGl4ZWwgZGF0YSBhbmQgdGVtcG9yYXJ5IG1hc2sgZGF0YS4gKi8KLSAKLS0gIGlmIChlbmMgPT0gcmZiRW5jb2RpbmdYQ3Vyc29yKSB7Ci0tICAgIGlmIChhcHBEYXRhLnVzZVgxMUN1cnNvcikgewotLSAgICAgIEhhbmRsZVhDdXJzb3IoeGhvdCwgeWhvdCwgd2lkdGgsIGhlaWdodCk7Ci0tICAgICAgcmV0dXJuIFRydWU7Ci0tICAgIH0KLSsJcmNTb3VyY2UgPSBtYWxsb2Mod2lkdGggKiBoZWlnaHQgKiBieXRlc1BlclBpeGVsKTsKLSsJaWYgKHJjU291cmNlID09IE5VTEwpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotIAotLSAgICAvKiBSZWFkIGFuZCBjb252ZXJ0IGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29sb3JzLiAqLwotLSAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnJnYiwgc3pfcmZiWEN1cnNvckNvbG9ycykpIHsKLS0gICAgICBmcmVlKHJjU291cmNlKTsKLS0gICAgICBmcmVlKGJ1Zik7Ci0tICAgICAgcmV0dXJuIEZhbHNlOwotLSAgICB9Ci0tICAgIGNvbG9yc1swXSA9IFJHQjI0X1RPX1BJWEVMKDMyLCByZ2IuYmFja1JlZCwgcmdiLmJhY2tHcmVlbiwgcmdiLmJhY2tCbHVlKTsKLS0gICAgY29sb3JzWzFdID0gUkdCMjRfVE9fUElYRUwoMzIsIHJnYi5mb3JlUmVkLCByZ2IuZm9yZUdyZWVuLCByZ2IuZm9yZUJsdWUpOwotKwlidWYgPSBtYWxsb2MoYnl0ZXNNYXNrRGF0YSk7Ci0rCWlmIChidWYgPT0gTlVMTCkgewotKwkJZnJlZShyY1NvdXJjZSk7Ci0rCQlyY1NvdXJjZSA9IE5VTEw7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gICAgLyogUmVhZCAxYnBwIHBpeGVsIGRhdGEgaW50byBhIHRlbXBvcmFyeSBidWZmZXIuICovCi0tICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoYnVmLCBieXRlc01hc2tEYXRhKSkgewotLSAgICAgIGZyZWUocmNTb3VyY2UpOwotLSAgICAgIGZyZWUoYnVmKTsKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0tICAgIH0KLSsJLyogUmVhZCBhbmQgZGVjb2RlIGN1cnNvciBwaXhlbCBkYXRhLCBkZXBlbmRpbmcgb24gdGhlIGVuY29kaW5nIHR5cGUuICovCi0gCi0tICAgIC8qIENvbnZlcnQgMWJwcCBkYXRhIHRvIGJ5dGUtd2lkZSBjb2xvciBpbmRpY2VzLiAqLwotLSAgICBwdHIgPSByY1NvdXJjZTsKLS0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0tICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoIC8gODsgeCsrKSB7Ci0tCWZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7Ci0tCSAgKnB0ciA9IGJ1Zlt5ICogYnl0ZXNQZXJSb3cgKyB4XSA+PiBiICYgMTsKLS0JICBwdHIgKz0gYnl0ZXNQZXJQaXhlbDsKLS0JfQotLSAgICAgIH0KLS0gICAgICBmb3IgKGIgPSA3OyBiID4gNyAtIHdpZHRoICUgODsgYi0tKSB7Ci0tCSpwdHIgPSBidWZbeSAqIGJ5dGVzUGVyUm93ICsgeF0gPj4gYiAmIDE7Ci0tCXB0ciArPSBieXRlc1BlclBpeGVsOwotLSAgICAgIH0KLS0gICAgfQotKwlpZiAoZW5jID09IHJmYkVuY29kaW5nWEN1cnNvcikgewotKwkJaWYgKGFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQkJSGFuZGxlWEN1cnNvcih4aG90LCB5aG90LCB3aWR0aCwgaGVpZ2h0KTsKLSsJCQlyZXR1cm4gVHJ1ZTsKLSsJCX0KLSsKLSsJCS8qIFJlYWQgYW5kIGNvbnZlcnQgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCBjb2xvcnMuICovCi0rCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnJnYiwgc3pfcmZiWEN1cnNvckNvbG9ycykpIHsKLSsJCQlmcmVlKHJjU291cmNlKTsKLSsJCQlyY1NvdXJjZSA9IE5VTEw7Ci0rCQkJZnJlZShidWYpOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCWNvbG9yc1swXSA9IFJHQjI0X1RPX1BJWEVMKDMyLCByZ2IuYmFja1JlZCwgcmdiLmJhY2tHcmVlbiwgcmdiLmJhY2tCbHVlKTsKLSsJCWNvbG9yc1sxXSA9IFJHQjI0X1RPX1BJWEVMKDMyLCByZ2IuZm9yZVJlZCwgcmdiLmZvcmVHcmVlbiwgcmdiLmZvcmVCbHVlKTsKLSsKLSsJCS8qIFJlYWQgMWJwcCBwaXhlbCBkYXRhIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiAqLwotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihidWYsIGJ5dGVzTWFza0RhdGEpKSB7Ci0rCQkJZnJlZShyY1NvdXJjZSk7Ci0rCQkJcmNTb3VyY2UgPSBOVUxMOwotKwkJCWZyZWUoYnVmKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCi0rCQkvKiBDb252ZXJ0IDFicHAgZGF0YSB0byBieXRlLXdpZGUgY29sb3IgaW5kaWNlcy4gKi8KLSsJCXB0ciA9IHJjU291cmNlOwotKwkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0rCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoIC8gODsgeCsrKSB7Ci0rCQkJCWZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7Ci0rCQkJCQkqcHRyID0gYnVmW3kgKiBieXRlc1BlclJvdyArIHhdID4+IGIgJiAxOwotKwkJCQkJcHRyICs9IGJ5dGVzUGVyUGl4ZWw7Ci0rCQkJCX0KLSsJCQl9Ci0rCQkJZm9yIChiID0gNzsgYiA+IDcgLSB3aWR0aCAlIDg7IGItLSkgewotKwkJCQkqcHRyID0gYnVmW3kgKiBieXRlc1BlclJvdyArIHhdID4+IGIgJiAxOwotKwkJCQlwdHIgKz0gYnl0ZXNQZXJQaXhlbDsKLSsJCQl9Ci0rCQl9Ci0rCi0rCQkvKiBDb252ZXJ0IGluZGljZXMgaW50byB0aGUgYWN0dWFsIHBpeGVsIHZhbHVlcy4gKi8KLSsJCXN3aXRjaCAoYnl0ZXNQZXJQaXhlbCkgewotKwkJY2FzZSAxOgotKwkJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAqIGhlaWdodDsgeCsrKSB7Ci0rCQkJCXJjU291cmNlW3hdID0gKENBUkQ4KWNvbG9yc1tyY1NvdXJjZVt4XV07Ci0rCQkJfQotKwkJCWJyZWFrOwotKwkJY2FzZSAyOgotKwkJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAqIGhlaWdodDsgeCsrKSB7Ci0rCQkJCSgoQ0FSRDE2ICopcmNTb3VyY2UpW3hdID0gKENBUkQxNiljb2xvcnNbcmNTb3VyY2VbeCAqIDJdXTsKLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQljYXNlIDQ6Ci0rCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoICogaGVpZ2h0OyB4KyspIHsKLSsJCQkJKChDQVJEMzIgKilyY1NvdXJjZSlbeF0gPSBjb2xvcnNbcmNTb3VyY2VbeCAqIDRdXTsKLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCX0gZWxzZSB7CS8qIGVuYyA9PSByZmJFbmNvZGluZ1JpY2hDdXJzb3IgKi8KLSsJCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKilyY1NvdXJjZSwgd2lkdGggKiBoZWlnaHQgKiBieXRlc1BlclBpeGVsKSkgewotKwkJCWZyZWUocmNTb3VyY2UpOwotKwkJCXJjU291cmNlID0gTlVMTDsKLSsJCQlmcmVlKGJ1Zik7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwl9Ci0gCi0tICAgIC8qIENvbnZlcnQgaW5kaWNlcyBpbnRvIHRoZSBhY3R1YWwgcGl4ZWwgdmFsdWVzLiAqLwotLSAgICBzd2l0Y2ggKGJ5dGVzUGVyUGl4ZWwpIHsKLS0gICAgY2FzZSAxOgotLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAqIGhlaWdodDsgeCsrKQotLQlyY1NvdXJjZVt4XSA9IChDQVJEOCljb2xvcnNbcmNTb3VyY2VbeF1dOwotLSAgICAgIGJyZWFrOwotLSAgICBjYXNlIDI6Ci0tICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICogaGVpZ2h0OyB4KyspCi0tCSgoQ0FSRDE2ICopcmNTb3VyY2UpW3hdID0gKENBUkQxNiljb2xvcnNbcmNTb3VyY2VbeCAqIDJdXTsKLS0gICAgICBicmVhazsKLS0gICAgY2FzZSA0OgotLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAqIGhlaWdodDsgeCsrKQotLQkoKENBUkQzMiAqKXJjU291cmNlKVt4XSA9IGNvbG9yc1tyY1NvdXJjZVt4ICogNF1dOwotLSAgICAgIGJyZWFrOwotLSAgICB9Ci0rCS8qIFJlYWQgYW5kIGRlY29kZSBtYXNrIGRhdGEuICovCi0gCi0tICB9IGVsc2UgewkJCS8qIGVuYyA9PSByZmJFbmNvZGluZ1JpY2hDdXJzb3IgKi8KLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihidWYsIGJ5dGVzTWFza0RhdGEpKSB7Ci0rCQlmcmVlKHJjU291cmNlKTsKLSsJCXJjU291cmNlID0gTlVMTDsKLSsJCWZyZWUoYnVmKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotIAotLSAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopcmNTb3VyY2UsIHdpZHRoICogaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbCkpIHsKLS0gICAgICBmcmVlKHJjU291cmNlKTsKLS0gICAgICBmcmVlKGJ1Zik7Ci0tICAgICAgcmV0dXJuIEZhbHNlOwotLSAgICB9Ci0rCXJjTWFzayA9IG1hbGxvYyh3aWR0aCAqIGhlaWdodCk7Ci0rCWlmIChyY01hc2sgPT0gTlVMTCkgewotKwkJZnJlZShyY1NvdXJjZSk7Ci0rCQlyY1NvdXJjZSA9IE5VTEw7Ci0rCQlmcmVlKGJ1Zik7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIH0KLSsJcHRyID0gcmNNYXNrOwotKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLSsJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAvIDg7IHgrKykgewotKwkJCWZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7Ci0rCQkJCSpwdHIrKyA9IGJ1Zlt5ICogYnl0ZXNQZXJSb3cgKyB4XSA+PiBiICYgMTsKLSsJCQl9Ci0rCQl9Ci0rCQlmb3IgKGIgPSA3OyBiID4gNyAtIHdpZHRoICUgODsgYi0tKSB7Ci0rCQkJKnB0cisrID0gYnVmW3kgKiBieXRlc1BlclJvdyArIHhdID4+IGIgJiAxOwotKwkJfQotKwl9Ci0gCi0tICAvKiBSZWFkIGFuZCBkZWNvZGUgbWFzayBkYXRhLiAqLwotKwlmcmVlKGJ1Zik7Ci0gCi0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZiwgYnl0ZXNNYXNrRGF0YSkpIHsKLS0gICAgZnJlZShyY1NvdXJjZSk7Ci0tICAgIGZyZWUoYnVmKTsKLS0gICAgcmV0dXJuIEZhbHNlOwotLSAgfQotKwkvKiBTZXQgcmVtYWluaW5nIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGN1cnNvci4gKi8KLSAKLS0gIHJjTWFzayA9IG1hbGxvYyh3aWR0aCAqIGhlaWdodCk7Ci0tICBpZiAocmNNYXNrID09IE5VTEwpIHsKLS0gICAgZnJlZShyY1NvdXJjZSk7Ci0tICAgIGZyZWUoYnVmKTsKLS0gICAgcmV0dXJuIEZhbHNlOwotLSAgfQotKwlkciA9IERlZmF1bHRSb290V2luZG93KGRweSk7Ci0gCi0tICBwdHIgPSByY01hc2s7Ci0tICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLS0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoIC8gODsgeCsrKSB7Ci0tICAgICAgZm9yIChiID0gNzsgYiA+PSAwOyBiLS0pIHsKLS0JKnB0cisrID0gYnVmW3kgKiBieXRlc1BlclJvdyArIHhdID4+IGIgJiAxOwotLSAgICAgIH0KLS0gICAgfQotLSAgICBmb3IgKGIgPSA3OyBiID4gNyAtIHdpZHRoICUgODsgYi0tKSB7Ci0tICAgICAgKnB0cisrID0gYnVmW3kgKiBieXRlc1BlclJvdyArIHhdID4+IGIgJiAxOwotLSAgICB9Ci0tICB9Ci0rCWlmIChzY2FsZV94ID4gMCkgewotKwkJaW50IHcgPSBzY2FsZV9yb3VuZCh3aWR0aCwgIHNjYWxlX2ZhY3Rvcl94KSArIDI7Ci0rCQlpbnQgaCA9IHNjYWxlX3JvdW5kKGhlaWdodCwgc2NhbGVfZmFjdG9yX3kpICsgMjsKLSsJCXJjU2F2ZWRBcmVhID0gWENyZWF0ZVBpeG1hcChkcHksIGRyLCB3LCBoLCB2aXNkZXB0aCk7Ci0rCQlyY1NhdmVkQXJlYV93ID0gdzsKLSsJCXJjU2F2ZWRBcmVhX2ggPSBoOwotKwl9IGVsc2UgewotKwkJcmNTYXZlZEFyZWEgPSBYQ3JlYXRlUGl4bWFwKGRweSwgZHIsIHdpZHRoLCBoZWlnaHQsIHZpc2RlcHRoKTsKLSsJCXJjU2F2ZWRBcmVhX3cgPSB3aWR0aDsKLSsJCXJjU2F2ZWRBcmVhX2ggPSBoZWlnaHQ7Ci0rCX0KLSsJcmNTYXZlZEFyZWFfMCA9IFhDcmVhdGVQaXhtYXAoZHB5LCBkciwgd2lkdGgsIGhlaWdodCwgdmlzZGVwdGgpOwotIAotLSAgZnJlZShidWYpOwotK2lmICgwKSBmcHJpbnRmKHN0ZGVyciwgInJjU2F2ZWRBcmVhX3doOiAlZCAlZCBzY2FsZV94OiAlZFxuIiwgcmNTYXZlZEFyZWFfdywgcmNTYXZlZEFyZWFfaCwgc2NhbGVfeCk7IAotIAotLSAgLyogU2V0IHJlbWFpbmluZyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBjdXJzb3IuICovCi0rCWlmIChyY1NhdmVkU2NhbGVfbGVuIDwgNCAqIHdpZHRoICogaGVpZ2h0ICsgNDA5NikgIHsKLSsJCWlmIChyY1NhdmVkU2NhbGUpIHsKLSsJCQlmcmVlKHJjU2F2ZWRTY2FsZSk7Ci0rCQl9Ci0rCQlyY1NhdmVkU2NhbGUgPSAoY2hhciAqKSBtYWxsb2MoMiAqIDQgKiB3aWR0aCAqIGhlaWdodCArIDQwOTYpOwotKwl9Ci0gCi0tICBkciA9IERlZmF1bHRSb290V2luZG93KGRweSk7Ci0tICByY1NhdmVkQXJlYSA9IFhDcmVhdGVQaXhtYXAoZHB5LCBkciwgd2lkdGgsIGhlaWdodCwgdmlzZGVwdGgpOwotLSAgcmNIb3RYID0geGhvdDsKLS0gIHJjSG90WSA9IHlob3Q7Ci0tICByY1dpZHRoID0gd2lkdGg7Ci0tICByY0hlaWdodCA9IGhlaWdodDsKLSsJcmNIb3RYID0geGhvdDsKLSsJcmNIb3RZID0geWhvdDsKLSsJcmNXaWR0aCA9IHdpZHRoOwotKwlyY0hlaWdodCA9IGhlaWdodDsKLSAKLS0gIFNvZnRDdXJzb3JDb3B5QXJlYShPUEVSX1NBVkUpOwotLSAgU29mdEN1cnNvckRyYXcoKTsKLSsJU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfU0FWRSk7Ci0rCVNvZnRDdXJzb3JEcmF3KCk7Ci0gCi0tICByY0N1cnNvckhpZGRlbiA9IEZhbHNlOwotLSAgcmNMb2NrU2V0ID0gRmFsc2U7Ci0rCXJjQ3Vyc29ySGlkZGVuID0gRmFsc2U7Ci0rCXJjTG9ja1NldCA9IEZhbHNlOwotIAotLSAgcHJldlNvZnRDdXJzb3JTZXQgPSBUcnVlOwotLSAgcmV0dXJuIFRydWU7Ci0rCXByZXZTb2Z0Q3Vyc29yU2V0ID0gVHJ1ZTsKLSsJcmV0dXJuIFRydWU7Ci0gfQotIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUBAIC0zMTksMjAgKzM2MCwyNyBAQAotIAotIEJvb2wgSGFuZGxlQ3Vyc29yUG9zKGludCB4LCBpbnQgeSkKLSB7Ci0tICBpZiAoYXBwRGF0YS51c2VYMTFDdXJzb3IpIHsKLS0gICAgaWYgKGFwcERhdGEuZnVsbFNjcmVlbikKLS0gICAgICBYV2FycFBvaW50ZXIoZHB5LCBOb25lLCBkZXNrdG9wV2luLCAwLCAwLCAwLCAwLCB4LCB5KTsKLS0gICAgCi0tICAgIHJldHVybiBUcnVlOyAKLS0gIH0KLSsJaWYgKHggPCAwKSB4ID0gMDsKLSsJaWYgKHkgPCAwKSB5ID0gMDsKLSAKLS0gIGlmICh4ID49IHNpLmZyYW1lYnVmZmVyV2lkdGgpCi0tICAgIHggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0gMTsKLS0gIGlmICh5ID49IHNpLmZyYW1lYnVmZmVySGVpZ2h0KQotLSAgICB5ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQgLSAxOwotKwkvKiBmcHJpbnRmKHN0ZGVyciwgInh5OiAlZCAlZFxuIiwgeCwgeSk7ICovCi0gCi0tICBTb2Z0Q3Vyc29yTW92ZSh4LCB5KTsKLS0gIHJldHVybiBUcnVlOwotKwlpZiAoeCA+PSBzaS5mcmFtZWJ1ZmZlcldpZHRoKSB7Ci0rCQl4ID0gc2kuZnJhbWVidWZmZXJXaWR0aCAtIDE7Ci0rCX0KLSsJaWYgKHkgPj0gc2kuZnJhbWVidWZmZXJIZWlnaHQpIHsKLSsJCXkgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIDE7Ci0rCX0KLSsKLSsJaWYgKGFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQkJWFdhcnBQb2ludGVyKGRweSwgTm9uZSwgZGVza3RvcFdpbiwgMCwgMCwgMCwgMCwgeCwgeSk7Ci0rCQl9Ci0rCQlyZXR1cm4gVHJ1ZTsgCi0rCX0KLSsKLSsJU29mdEN1cnNvck1vdmUoeCwgeSk7Ci0rCXJldHVybiBUcnVlOwotIH0KLSAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1AQCAtMzQ4LDMwICszOTYsMzEgQEAKLSB7Ci0gICBpbnQgbmV3WCwgbmV3WTsKLSAKLS0gIGlmICghcHJldlNvZnRDdXJzb3JTZXQpCi0tICAgIHJldHVybjsKLSsJaWYgKCFwcmV2U29mdEN1cnNvclNldCkgewotKwkJcmV0dXJuOwotKwl9Ci0gCi0tICBpZiAoIXJjTG9ja1NldCkgewotLSAgICByY0xvY2tYID0geDsKLS0gICAgcmNMb2NrWSA9IHk7Ci0tICAgIHJjTG9ja1dpZHRoID0gdzsKLS0gICAgcmNMb2NrSGVpZ2h0ID0gaDsKLS0gICAgcmNMb2NrU2V0ID0gVHJ1ZTsKLS0gIH0gZWxzZSB7Ci0tICAgIG5ld1ggPSAoeCA8IHJjTG9ja1gpID8geCA6IHJjTG9ja1g7Ci0tICAgIG5ld1kgPSAoeSA8IHJjTG9ja1kpID8geSA6IHJjTG9ja1k7Ci0tICAgIHJjTG9ja1dpZHRoID0gKHggKyB3ID4gcmNMb2NrWCArIHJjTG9ja1dpZHRoKSA/Ci0tICAgICAgKHggKyB3IC0gbmV3WCkgOiAocmNMb2NrWCArIHJjTG9ja1dpZHRoIC0gbmV3WCk7Ci0tICAgIHJjTG9ja0hlaWdodCA9ICh5ICsgaCA+IHJjTG9ja1kgKyByY0xvY2tIZWlnaHQpID8KLS0gICAgICAoeSArIGggLSBuZXdZKSA6IChyY0xvY2tZICsgcmNMb2NrSGVpZ2h0IC0gbmV3WSk7Ci0tICAgIHJjTG9ja1ggPSBuZXdYOwotLSAgICByY0xvY2tZID0gbmV3WTsKLS0gIH0KLSsJaWYgKCFyY0xvY2tTZXQpIHsKLSsJCXJjTG9ja1ggPSB4OwotKwkJcmNMb2NrWSA9IHk7Ci0rCQlyY0xvY2tXaWR0aCA9IHc7Ci0rCQlyY0xvY2tIZWlnaHQgPSBoOwotKwkJcmNMb2NrU2V0ID0gVHJ1ZTsKLSsJfSBlbHNlIHsKLSsJCW5ld1ggPSAoeCA8IHJjTG9ja1gpID8geCA6IHJjTG9ja1g7Ci0rCQluZXdZID0gKHkgPCByY0xvY2tZKSA/IHkgOiByY0xvY2tZOwotKwkJcmNMb2NrV2lkdGggPSAoeCArIHcgPiByY0xvY2tYICsgcmNMb2NrV2lkdGgpID8KLSsJCSAgICAoeCArIHcgLSBuZXdYKSA6IChyY0xvY2tYICsgcmNMb2NrV2lkdGggLSBuZXdYKTsKLSsJCXJjTG9ja0hlaWdodCA9ICh5ICsgaCA+IHJjTG9ja1kgKyByY0xvY2tIZWlnaHQpID8KLSsJCSAgICAoeSArIGggLSBuZXdZKSA6IChyY0xvY2tZICsgcmNMb2NrSGVpZ2h0IC0gbmV3WSk7Ci0rCQlyY0xvY2tYID0gbmV3WDsKLSsJCXJjTG9ja1kgPSBuZXdZOwotKwl9Ci0gCi0tICBpZiAoIXJjQ3Vyc29ySGlkZGVuICYmIFNvZnRDdXJzb3JJbkxvY2tlZEFyZWEoKSkgewotLSAgICBTb2Z0Q3Vyc29yQ29weUFyZWEoT1BFUl9SRVNUT1JFKTsKLS0gICAgcmNDdXJzb3JIaWRkZW4gPSBUcnVlOwotLSAgfQotKwlpZiAoIXJjQ3Vyc29ySGlkZGVuICYmIFNvZnRDdXJzb3JJbkxvY2tlZEFyZWEoKSkgewotKwkJU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfUkVTVE9SRSk7Ci0rCQlyY0N1cnNvckhpZGRlbiA9IFRydWU7Ci0rCX0KLSB9Ci0gCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQEAgLTM4MSwxNSArNDMwLDE2IEBACi0gCi0gdm9pZCBTb2Z0Q3Vyc29yVW5sb2NrU2NyZWVuKHZvaWQpCi0gewotLSAgaWYgKCFwcmV2U29mdEN1cnNvclNldCkKLS0gICAgcmV0dXJuOwotKwlpZiAoIXByZXZTb2Z0Q3Vyc29yU2V0KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSAKLS0gIGlmIChyY0N1cnNvckhpZGRlbikgewotLSAgICBTb2Z0Q3Vyc29yQ29weUFyZWEoT1BFUl9TQVZFKTsKLS0gICAgU29mdEN1cnNvckRyYXcoKTsKLS0gICAgcmNDdXJzb3JIaWRkZW4gPSBGYWxzZTsKLS0gIH0KLS0gIHJjTG9ja1NldCA9IEZhbHNlOwotKwlpZiAocmNDdXJzb3JIaWRkZW4pIHsKLSsJCVNvZnRDdXJzb3JDb3B5QXJlYShPUEVSX1NBVkUpOwotKwkJU29mdEN1cnNvckRyYXcoKTsKLSsJCXJjQ3Vyc29ySGlkZGVuID0gRmFsc2U7Ci0rCX0KLSsJcmNMb2NrU2V0ID0gRmFsc2U7Ci0gfQotIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUBAIC00MDEsMTkgKzQ1MSwxOSBAQAotIAotIHZvaWQgU29mdEN1cnNvck1vdmUoaW50IHgsIGludCB5KQotIHsKLS0gIGlmIChwcmV2U29mdEN1cnNvclNldCAmJiAhcmNDdXJzb3JIaWRkZW4pIHsKLS0gICAgU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfUkVTVE9SRSk7Ci0tICAgIHJjQ3Vyc29ySGlkZGVuID0gVHJ1ZTsKLS0gIH0KLSsJaWYgKHByZXZTb2Z0Q3Vyc29yU2V0ICYmICFyY0N1cnNvckhpZGRlbikgewotKwkJU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfUkVTVE9SRSk7Ci0rCQlyY0N1cnNvckhpZGRlbiA9IFRydWU7Ci0rCX0KLSAKLS0gIHJjQ3Vyc29yWCA9IHg7Ci0tICByY0N1cnNvclkgPSB5OwotKwlyY0N1cnNvclggPSB4OwotKwlyY0N1cnNvclkgPSB5OwotIAotLSAgaWYgKHByZXZTb2Z0Q3Vyc29yU2V0ICYmICEocmNMb2NrU2V0ICYmIFNvZnRDdXJzb3JJbkxvY2tlZEFyZWEoKSkpIHsKLS0gICAgU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfU0FWRSk7Ci0tICAgIFNvZnRDdXJzb3JEcmF3KCk7Ci0tICAgIHJjQ3Vyc29ySGlkZGVuID0gRmFsc2U7Ci0tICB9Ci0rCWlmIChwcmV2U29mdEN1cnNvclNldCAmJiAhKHJjTG9ja1NldCAmJiBTb2Z0Q3Vyc29ySW5Mb2NrZWRBcmVhKCkpKSB7Ci0rCQlTb2Z0Q3Vyc29yQ29weUFyZWEoT1BFUl9TQVZFKTsKLSsJCVNvZnRDdXJzb3JEcmF3KCk7Ci0rCQlyY0N1cnNvckhpZGRlbiA9IEZhbHNlOwotKwl9Ci0gfQotIAotIAotQEAgLTQyOSw0MSArNDc5LDE2OSBAQAotIAkgIHJjTG9ja1kgKyByY0xvY2tIZWlnaHQgPiByY0N1cnNvclkgLSByY0hvdFkpOwotIH0KLSAKLS1zdGF0aWMgdm9pZCBTb2Z0Q3Vyc29yQ29weUFyZWEoaW50IG9wZXIpCi0tewotLSAgaW50IHgsIHksIHcsIGg7Ci0rdm9pZCBuZXdfcGl4bWFwKGludCB3LCBpbnQgaCkgewotIAotLSAgeCA9IHJjQ3Vyc29yWCAtIHJjSG90WDsKLS0gIHkgPSByY0N1cnNvclkgLSByY0hvdFk7Ci0tICBpZiAoeCA+PSBzaS5mcmFtZWJ1ZmZlcldpZHRoIHx8IHkgPj0gc2kuZnJhbWVidWZmZXJIZWlnaHQpCi0tICAgIHJldHVybjsKLS0KLS0gIHcgPSByY1dpZHRoOwotLSAgaCA9IHJjSGVpZ2h0OwotLSAgaWYgKHggPCAwKSB7Ci0tICAgIHcgKz0geDsKLS0gICAgeCA9IDA7Ci0tICB9IGVsc2UgaWYgKHggKyB3ID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgewotLSAgICB3ID0gc2kuZnJhbWVidWZmZXJXaWR0aCAtIHg7Ci0tICB9Ci0tICBpZiAoeSA8IDApIHsKLS0gICAgaCArPSB5OwotLSAgICB5ID0gMDsKLS0gIH0gZWxzZSBpZiAoeSArIGggPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotLSAgICBoID0gc2kuZnJhbWVidWZmZXJIZWlnaHQgLSB5OwotLSAgfQotKwlYRnJlZVBpeG1hcChkcHksIHJjU2F2ZWRBcmVhKTsKLSAKLS0gIGlmIChvcGVyID09IE9QRVJfU0FWRSkgewotLSAgICAvKiBTYXZlIHNjcmVlbiBhcmVhIGluIG1lbW9yeS4gKi8KLS0jaWZkZWYgTUlUU0hNCi0tICAgIGlmIChhcHBEYXRhLnVzZVNobSkKLS0gICAgICBYU3luYyhkcHksIEZhbHNlKTsKLS0jZW5kaWYKLS0gICAgWENvcHlBcmVhKGRweSwgZGVza3RvcFdpbiwgcmNTYXZlZEFyZWEsIGdjLCB4LCB5LCB3LCBoLCAwLCAwKTsKLS0gIH0gZWxzZSB7Ci0tICAgIC8qIFJlc3RvcmUgc2NyZWVuIGFyZWEuICovCi0tICAgIFhDb3B5QXJlYShkcHksIHJjU2F2ZWRBcmVhLCBkZXNrdG9wV2luLCBnYywgMCwgMCwgdywgaCwgeCwgeSk7Ci0tICB9Ci0rCWlmICh3ID4gMCAmJiBoID4gMCkgewotKwkJcmNTYXZlZEFyZWEgPSBYQ3JlYXRlUGl4bWFwKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgdywgaCwgdmlzZGVwdGgpOwotKwkJcmNTYXZlZEFyZWFfdyA9IHc7Ci0rCQlyY1NhdmVkQXJlYV9oID0gaDsKLSsJCQotKwl9IGVsc2UgaWYgKGltYWdlX3NjYWxlICE9IE5VTEwgJiYgc2NhbGVfeCA+IDApIHsKLSsJCWludCB3MiA9IHNjYWxlX3JvdW5kKHJjV2lkdGgsICBzY2FsZV9mYWN0b3JfeCkgKyAyOwotKwkJaW50IGgyID0gc2NhbGVfcm91bmQocmNIZWlnaHQsIHNjYWxlX2ZhY3Rvcl95KSArIDI7Ci0rCQlyY1NhdmVkQXJlYSA9IFhDcmVhdGVQaXhtYXAoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCB3MiwgaDIsIHZpc2RlcHRoKTsKLSsJCXJjU2F2ZWRBcmVhX3cgPSB3MjsKLSsJCXJjU2F2ZWRBcmVhX2ggPSBoMjsKLSsJfSBlbHNlIHsKLSsJCXJjU2F2ZWRBcmVhID0gWENyZWF0ZVBpeG1hcChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIHJjV2lkdGgsIHJjSGVpZ2h0LCB2aXNkZXB0aCk7Ci0rCQlyY1NhdmVkQXJlYV93ID0gcmNXaWR0aDsKLSsJCXJjU2F2ZWRBcmVhX2ggPSByY0hlaWdodDsKLSsJfQotK30KLSsKLStleHRlcm4gaW50IFhFcnJvcl9pZ247Ci0rCi0rc3RhdGljIHZvaWQgU29mdEN1cnNvckNvcHlBcmVhKGludCBvcGVyKSB7Ci0rCWludCB4LCB5LCB3LCBoOwotKwlpbnQgeHMgPSAwLCB5cyA9IDAsIHdzID0gMCwgaHMgPSAwOwotKwlzdGF0aWMgaW50IHNjYWxlX3NhdmVkID0gMCwgc3Nfdywgc3NfaDsKLSsJaW50IGRiID0gMDsKLSsKLSsJeCA9IHJjQ3Vyc29yWCAtIHJjSG90WDsKLSsJeSA9IHJjQ3Vyc29yWSAtIHJjSG90WTsKLSsJaWYgKHggPj0gc2kuZnJhbWVidWZmZXJXaWR0aCB8fCB5ID49IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJdyA9IHJjV2lkdGg7Ci0rCWggPSByY0hlaWdodDsKLSsJaWYgKHggPCAwKSB7Ci0rCQl3ICs9IHg7Ci0rCQl4ID0gMDsKLSsJfSBlbHNlIGlmICh4ICsgdyA+IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCXcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0geDsKLSsJfQotKwlpZiAoeSA8IDApIHsKLSsJCWggKz0geTsKLSsJCXkgPSAwOwotKwl9IGVsc2UgaWYgKHkgKyBoID4gc2kuZnJhbWVidWZmZXJIZWlnaHQpIHsKLSsJCWggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIHk7Ci0rCX0KLSsKLSsJaWYgKGltYWdlX3NjYWxlICE9IE5VTEwgJiYgc2NhbGVfeCA+IDApIHsKLSsJCXhzID0gKGludCkgKHggKiBzY2FsZV9mYWN0b3JfeCk7Ci0rCQl5cyA9IChpbnQpICh5ICogc2NhbGVfZmFjdG9yX3kpOwotKwkJd3MgPSBzY2FsZV9yb3VuZCh3LCBzY2FsZV9mYWN0b3JfeCk7Ci0rCQlocyA9IHNjYWxlX3JvdW5kKGgsIHNjYWxlX2ZhY3Rvcl95KTsKLSsKLSsJCWlmICh4cyA+IDApIHhzIC09IDE7Ci0rCQlpZiAoeXMgPiAwKSB5cyAtPSAxOwotKwkJd3MgKz0gMjsKLSsJCWhzICs9IDI7Ci0rCX0KLSsKLSsJWEVycm9yX2lnbiA9IDE7Ci0rCi0rCWlmIChvcGVyID09IE9QRVJfU0FWRSkgewotKwkJLyogU2F2ZSBzY3JlZW4gYXJlYSBpbiBtZW1vcnkuICovCi0rCQlzY2FsZV9zYXZlZCA9IDA7Ci0rCQlpZiAoYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7Ci0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQkJWENvcHlBcmVhKGRweSwgZGVza3RvcFdpbiwgcmNTYXZlZEFyZWEsIGdjLCB4LCB5LCB3LCBoLCAwLCAwKTsKLSsJCX0gZWxzZSB7Ci0rCQkJaWYgKGltYWdlX3NjYWxlICE9IE5VTEwgJiYgc2NhbGVfeCA+IDApIHsKLSsJCQkJaW50IEJwcCA9IGltYWdlX3NjYWxlLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0rCQkJCWludCBCcGwgPSBpbWFnZV9zY2FsZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0rCQkJCWludCBpOwotKwkJCQljaGFyICpzcmMgPSBpbWFnZV9zY2FsZS0+ZGF0YSArIHkgKiBCcGwgKyB4ICogQnBwOwotKwkJCQljaGFyICpkc3QgPSByY1NhdmVkU2NhbGU7Ci0rCi0rCQkJCWlmICh3cyA+IHJjU2F2ZWRBcmVhX3cgfHwgaHMgPiByY1NhdmVkQXJlYV9oKSB7Ci0rCQkJCQluZXdfcGl4bWFwKDAsIDApOwotKwkJCQl9Ci0rCi0raWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNhdmU6ICVkeCVkKyVkKyVkXG4iLCB3cywgaHMsIHhzLCB5cyk7Ci0rCi0rCQkJCVhQdXRJbWFnZShkcHksIHJjU2F2ZWRBcmVhLCBnYywgaW1hZ2UsIHhzLCB5cywgMCwgMCwgd3MsIGhzKTsKLSsKLSsJCQkJWFB1dEltYWdlKGRweSwgcmNTYXZlZEFyZWFfMCwgZ2MsIGltYWdlX3NjYWxlLCB4LCB5LCAwLCAwLCB3LCBoKTsKLSsKLSsJCQkJc2NhbGVfc2F2ZWQgPSAxOwotKwkJCQlzc193ID0gd3M7Ci0rCQkJCXNzX2ggPSBoczsKLSsKLSsJCQkJZm9yIChpPTA7IGkgPCBoOyBpKyspIHsKLSsJCQkJCW1lbWNweShkc3QsIHNyYywgQnBwICogdyk7Ci0rCQkJCQlzcmMgKz0gQnBsOwotKwkJCQkJZHN0ICs9IEJwcCAqIHc7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgewotK2lmIChkYikgZnByaW50ZihzdGRlcnIsICJTQVZFOiAlZHglZCslZCslZFxuIiwgdywgaCwgeCwgeSk7Ci0rCQkJCWlmICh3ID4gcmNTYXZlZEFyZWFfdyB8fCBoID4gcmNTYXZlZEFyZWFfaCkgewotKwkJCQkJbmV3X3BpeG1hcCgwLCAwKTsKLSsJCQkJfQotKwotKwkJCQlYUHV0SW1hZ2UoZHB5LCByY1NhdmVkQXJlYSwgZ2MsIGltYWdlLCB4LCB5LCAwLCAwLCB3LCBoKTsKLSsJCQl9Ci0rCQl9Ci0rCX0gZWxzZSB7Ci0rCi0rI2RlZmluZSBYRShzKSBpZiAoWEVycm9yX2lnbiA+IDEpIHtmcHJpbnRmKHN0ZGVyciwgIlgtJWRcbiIsIChzKSk7IGRiID0gMTt9Ci0rCi0rCQkvKiBSZXN0b3JlIHNjcmVlbiBhcmVhLiAqLwotKwkJaWYgKGFwcERhdGEudXNlWHNlcnZlckJhY2tpbmdTdG9yZSkgewotKwkJCVhDb3B5QXJlYShkcHksIHJjU2F2ZWRBcmVhLCBkZXNrdG9wV2luLCBnYywgMCwgMCwgdywgaCwgeCwgeSk7Ci0rWEUoMSkKLSsJCQlYR2V0U3ViSW1hZ2UoZHB5LCByY1NhdmVkQXJlYSwgMCwgMCwgdywgaCwgQWxsUGxhbmVzLCBaUGl4bWFwLCBpbWFnZSwgeCwgeSk7Ci0rWEUoMikKLSsKLSsJCX0gZWxzZSB7Ci0rCQkJaWYgKGltYWdlX3NjYWxlICE9IE5VTEwgJiYgc2NhbGVfeCA+IDApIHsKLSsJCQkJaW50IEJwcCA9IGltYWdlX3NjYWxlLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0rCQkJCWludCBCcGwgPSBpbWFnZV9zY2FsZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0rCQkJCWludCBpOwotKwkJCQljaGFyICpkc3QgPSBpbWFnZV9zY2FsZS0+ZGF0YSArIHkgKiBCcGwgKyB4ICogQnBwOwotKwkJCQljaGFyICpzcmMgPSByY1NhdmVkU2NhbGU7Ci0rCi0rCQkJCVhDb3B5QXJlYShkcHksIHJjU2F2ZWRBcmVhLCBkZXNrdG9wV2luLCBnYywgMCwgMCwgd3MsIGhzLCB4cywgeXMpOwotK1hFKDMpCi0rCQkJCVhHZXRTdWJJbWFnZShkcHksIHJjU2F2ZWRBcmVhLCAwLCAwLCB3cywgaHMsIEFsbFBsYW5lcywgWlBpeG1hcCwgaW1hZ2UsIHhzLCB5cyk7Ci0rWEUoNCkKLStpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicnN0cjogJWR4JWQrJWQrJWRcbiIsIHdzLCBocywgeHMsIHlzKTsKLSsKLSsJCQkJZm9yIChpPTA7IGkgPCBoOyBpKyspIHsKLSsJCQkJCW1lbWNweShkc3QsIHNyYywgQnBwICogdyk7Ci0rCQkJCQlzcmMgKz0gQnBwICogdzsKLSsJCQkJCWRzdCArPSBCcGw7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgewotKwotKwkJCQlpZiAoc2NhbGVfc2F2ZWQpIHsKLSsJCQkJCVhDb3B5QXJlYShkcHksIHJjU2F2ZWRBcmVhLCBkZXNrdG9wV2luLCBnYywgMCwgMCwgc3Nfdywgc3NfaCwgeCwgeSk7Ci0rWEUoNSkKLSsJCQkJCVhHZXRTdWJJbWFnZShkcHksIHJjU2F2ZWRBcmVhLCAwLCAwLCBzc193LCBzc19oLCBBbGxQbGFuZXMsIFpQaXhtYXAsIGltYWdlLCB4LCB5KTsKLStYRSg2KQotKwkJCQkJbmV3X3BpeG1hcCh3LCBoKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCVhDb3B5QXJlYShkcHksIHJjU2F2ZWRBcmVhLCBkZXNrdG9wV2luLCBnYywgMCwgMCwgdywgaCwgeCwgeSk7Ci0rWEUoNykKLSsJCQkJCVhHZXRTdWJJbWFnZShkcHksIHJjU2F2ZWRBcmVhLCAwLCAwLCB3LCBoLCBBbGxQbGFuZXMsIFpQaXhtYXAsIGltYWdlLCB4LCB5KTsKLStYRSg4KQotKwkJCQl9Ci0rCi0raWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlJTVFI6ICVkeCVkKyVkKyVkXG4iLCB3LCBoLCB4LCB5KTsKLSsKLSsJCQl9Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKFhFcnJvcl9pZ24gPiAxKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlhFcnJvcl9pZ246ICVkLCBvcGVyOiAlc1xuIiwgWEVycm9yX2lnbiwgb3BlciA/ICJyZXN0b3JlIiA6ICJzYXZlIik7Ci0rCX0KLSsKLSsJWEVycm9yX2lnbiA9IDA7Ci0gfQotIAotIHN0YXRpYyB2b2lkIFNvZnRDdXJzb3JEcmF3KHZvaWQpCi1AQCAtNDcyLDQzICs2NTAsMTgyIEBACi0gICBpbnQgb2Zmc2V0LCBieXRlc1BlclBpeGVsOwotICAgY2hhciAqcG9zOwotIAotKyNkZWZpbmUgYWxwaGFoYWNrCi0rI2lmZGVmIGFscGhhaGFjawotKyAgLyogaGFjayB0byBoYXZlIGN1cnNvciB0cmFuc3BhcmVuY3kgYXQgMzJicHAgPHJ1bmdlQGthcmxydW5nZS5jb20+ICovCi0rICBpbnQgYWxwaGFibGVuZCA9IDA7Ci0rCi0rICBpZiAoIXJjU291cmNlKSB7Ci0rICAJcmV0dXJuOwotKyAgfQotKwotKyAgaWYgKGFwcERhdGEudXNlQ3Vyc29yQWxwaGEpIHsKLSsgIAlhbHBoYWJsZW5kID0gMTsKLSsgIH0KLSsKLSAgIGJ5dGVzUGVyUGl4ZWwgPSBteUZvcm1hdC5iaXRzUGVyUGl4ZWwgLyA4OwotIAotLSAgLyogRklYTUU6IFNwZWVkIG9wdGltaXphdGlvbiBpcyBwb3NzaWJsZS4gKi8KLS0gIGZvciAoeSA9IDA7IHkgPCByY0hlaWdodDsgeSsrKSB7Ci0tICAgIHkwID0gcmNDdXJzb3JZIC0gcmNIb3RZICsgeTsKLS0gICAgaWYgKHkwID49IDAgJiYgeTAgPCBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotLSAgICAgIGZvciAoeCA9IDA7IHggPCByY1dpZHRoOyB4KyspIHsKLS0JeDAgPSByY0N1cnNvclggLSByY0hvdFggKyB4OwotLQlpZiAoeDAgPj0gMCAmJiB4MCA8IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLS0JICBvZmZzZXQgPSB5ICogcmNXaWR0aCArIHg7Ci0tCSAgaWYgKHJjTWFza1tvZmZzZXRdKSB7Ci0tCSAgICBwb3MgPSAoY2hhciAqKSZyY1NvdXJjZVtvZmZzZXQgKiBieXRlc1BlclBpeGVsXTsKLS0JICAgIENvcHlEYXRhVG9TY3JlZW4ocG9zLCB4MCwgeTAsIDEsIDEpOwotLQkgIH0KLSsgIGlmIChhbHBoYWJsZW5kICYmIGJ5dGVzUGVyUGl4ZWwgPT0gNCkgewotKwl1bnNpZ25lZCBsb25nIHBpeGVsLCBwdXQsICp1cG9zLCAqdXBpeDsKLSsJaW50IGdvdF9hbHBoYSA9IDAsIHJzWCwgcnNZLCByc1csIHJzSDsKLSsJc3RhdGljIFhJbWFnZSAqYWxwaGFfaW1hZ2UgPSBOVUxMOwotKwlzdGF0aWMgaW50IGl3aWR0aCA9IDE5MjsKLSsKLSsJaWYgKCEgYWxwaGFfaW1hZ2UpIHsKLSsJCS8qIHdhdGNoIG91dCBmb3IgdGlueSBmYiAocmFyZSkgKi8KLSsJCWlmIChpd2lkdGggPiBzaS5mcmFtZWJ1ZmZlcldpZHRoKSB7Ci0rCQkJaXdpZHRoID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCX0KLSsJCWlmIChpd2lkdGggPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJCWl3aWR0aCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJfQotKwotKwkJLyogaW5pdGlhbGl6ZSBhbiBYSW1hZ2Ugd2l0aCBhIGNodW5rIG9mIGRlc2t0b3BXaW4gKi8KLSsJCWFscGhhX2ltYWdlID0gWEdldEltYWdlKGRweSwgZGVza3RvcFdpbiwgMCwgMCwgaXdpZHRoLCBpd2lkdGgsCi0rCQkgICAgQWxsUGxhbmVzLCBaUGl4bWFwKTsKLSAJfQotLSAgICAgIH0KLS0gICAgfQotKwotKwkvKiBmaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhbnkgbm9uLXplcm8gYWxwaGEgY2hhbm5lbCBkYXRhIGF0IGFsbDogKi8KLSsJZm9yICh5ID0gMDsgeSA8IHJjSGVpZ2h0OyB5KyspIHsKLSsJCWZvciAoeCA9IDA7IHggPCByY1dpZHRoOyB4KyspIHsKLSsJCQlpbnQgYWxwaGE7Ci0rCi0rCQkJb2Zmc2V0ID0geSAqIHJjV2lkdGggKyB4OwotKwkJCXBvcyA9IChjaGFyICopJnJjU291cmNlW29mZnNldCAqIGJ5dGVzUGVyUGl4ZWxdOwotKwotKwkJCXVwb3MgPSAodW5zaWduZWQgbG9uZyAqKSBwb3M7Ci0rCQkJYWxwaGEgPSAoKnVwb3MgJiAweGZmMDAwMDAwKSA+PiAyNDsKLSsJCQlpZiAoYWxwaGEpIHsKLSsJCQkJZ290X2FscGhhID0gMTsKLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJfQotKwkJaWYgKGdvdF9hbHBoYSkgewotKwkJCWJyZWFrOwotKwkJfQotKwl9Ci0rCi0rCWlmICghZ290X2FscGhhKSB7Ci0rCQkvKiBubyBhbHBoYSBjaGFubmVsIGRhdGEsIGZhbGxiYWNrIHRvIHRoZSBvbGQgd2F5ICovCi0rCQlnb3RvIG9sZHdheTsKLSsJfQotKwotKwkvKiBsb2FkIHRoZSBzYXZlZCBmYiBwYXRjaCBpbiB0byBhbHBoYV9pbWFnZSAoZmFzdGVyIHdheT8pICovCi0rCWlmIChpbWFnZV9zY2FsZSAhPSBOVUxMICYmIHNjYWxlX3ggPiAwKSB7Ci0rCQlYR2V0U3ViSW1hZ2UoZHB5LCByY1NhdmVkQXJlYV8wLCAwLCAwLCByY1dpZHRoLCByY0hlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwLCBhbHBoYV9pbWFnZSwgMCwgMCk7Ci0rCX0gZWxzZSB7Ci0rCQlYR2V0U3ViSW1hZ2UoZHB5LCByY1NhdmVkQXJlYSwgICAwLCAwLCByY1dpZHRoLCByY0hlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwLCBhbHBoYV9pbWFnZSwgMCwgMCk7Ci0rCX0KLSsKLSsJdXBpeCA9ICh1bnNpZ25lZCBsb25nICopYWxwaGFfaW1hZ2UtPmRhdGE7Ci0rCi0rCS8qIGlmIHRoZSByaWNoY3Vyc29yIGlzIGNsaXBwZWQsIHRoZSBmYiBwYXRjaCB3aWxsIGJlIHNtYWxsZXIgKi8KLSsJcnNXID0gcmNXaWR0aDsKLSsJcnNYID0gMDsJLyogdXNlZCB0byBkZW5vdGUgYSBzaGlmdCBmcm9tIHRoZSBsZWZ0IHNpZGUgKi8KLSsJeCA9IHJjQ3Vyc29yWCAtIHJjSG90WDsKLSsJaWYgKHggPCAwKSB7Ci0rCQlyc1cgKz0geDsKLSsJCXJzWCA9IC14OwotKwl9IGVsc2UgaWYgKHggKyByc1cgPiBzaS5mcmFtZWJ1ZmZlcldpZHRoKSB7Ci0rCQlyc1cgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0geDsKLSsJfQotKwlyc0ggPSByY0hlaWdodDsKLSsJcnNZID0gMDsJLyogdXNlZCB0byBkZW5vdGUgYSBzaGlmdCBmcm9tIHRoZSB0b3Agc2lkZSAqLwotKwl5ID0gcmNDdXJzb3JZIC0gcmNIb3RZOwotKwlpZiAoeSA8IDApIHsKLSsJCXJzSCArPSB5OwotKwkJcnNZID0gLXk7Ci0rCX0gZWxzZSBpZiAoeSArIHJzSCA+IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSB7Ci0rCQlyc0ggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIHk7Ci0rCX0KLSsKLSsJLyoKLSsJICogbm93IGxvb3Agb3ZlciB0aGUgY3Vyc29yIGRhdGEsIGJsZW5kIGluIHRoZSBmYiB2YWx1ZXMsCi0rCSAqIGFuZCB0aGVuIG92ZXJ3cml0ZSB0aGUgZmIgKENvcHlEYXRhVG9TY3JlZW4oKSkKLSsJICovCi0rCWZvciAoeSA9IDA7IHkgPCByY0hlaWdodDsgeSsrKSB7Ci0rCQl5MCA9IHJjQ3Vyc29yWSAtIHJjSG90WSArIHk7Ci0rCQlpZiAoeTAgPCAwIHx8IHkwID49IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSB7Ci0rCQkJY29udGludWU7CS8qIGNsaXBwZWQgKi8KLSsJCX0KLSsJCWZvciAoeCA9IDA7IHggPCByY1dpZHRoOyB4KyspIHsKLSsJCQlpbnQgYWxwaGEsIGNvbG9yX2N1cnMsIGNvbG9yX2ZiLCBpOwotKwotKwkJCXgwID0gcmNDdXJzb3JYIC0gcmNIb3RYICsgeDsKLSsJCQlpZiAoeDAgPCAwIHx8IHgwID49IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCQkJY29udGludWU7CS8qIGNsaXBwZWQgKi8KLSsJCQl9Ci0rCi0rCQkJb2Zmc2V0ID0geSAqIHJjV2lkdGggKyB4OwotKwkJCXBvcyA9IChjaGFyICopJnJjU291cmNlW29mZnNldCAqIGJ5dGVzUGVyUGl4ZWxdOwotKwotKwkJCS8qIGV4dHJhY3Qgc2VjcmV0IGFscGhhIGJ5dGUgZnJvbSByaWNoIGN1cnNvcjogKi8KLSsJCQl1cG9zID0gKHVuc2lnbmVkIGxvbmcgKikgcG9zOwotKwkJCWFscGhhID0gKCp1cG9zICYgMHhmZjAwMDAwMCkgPj4gMjQ7CS8qIFhYWCBNU0I/ICovCi0rCi0rCQkJLyogZXh0cmFjdCB0aGUgcGl4ZWwgZnJvbSB0aGUgZmI6ICovCi0rCQkJcGl4ZWwgPSAqKHVwaXggKyAoeS1yc1kpKml3aWR0aCArICh4LXJzWCkpOwotKwotKwkJCXB1dCA9IDA7Ci0rCQkJLyogZm9yIHNpbXBsaWNpdHksIGJsZW5kIGFsbCA0IGJ5dGVzICovCi0rCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotKwkJCQlpbnQgc2ggPSBpKjg7Ci0rCQkJCWNvbG9yX2N1cnMgPSAoKDB4ZmYgPDwgc2gpICYgKnVwb3MpID4+IHNoOwotKwkJCQljb2xvcl9mYiAgID0gKCgweGZmIDw8IHNoKSAmIHBpeGVsKSA+PiBzaDsKLSsKLSsJCQkJLyogWFhYIGFzc3VtZXMgcHJlLW11bHRpcGxlZCBjb2xvcl9jdXJzICovCi0rCQkJCWNvbG9yX2ZiID0gY29sb3JfY3VycwotKwkJCQkgICAgKyAoKDB4ZmYgLSBhbHBoYSkgKiBjb2xvcl9mYikvMHhmZjsKLSsJCQkJcHV0IHw9IGNvbG9yX2ZiIDw8IHNoOwotKwkJCX0KLSsJCQkvKiBwbGFjZSBpbiB0aGUgZmI6ICovCi0rCSAgICAJCUNvcHlEYXRhVG9TY3JlZW4oKGNoYXIgKikmcHV0LCB4MCwgeTAsIDEsIDEpOwotKwkJfQotKwl9Ci0rCXJldHVybjsKLSAgIH0KLStvbGR3YXk6Ci0rI2VuZGlmCi0rCi0rCWJ5dGVzUGVyUGl4ZWwgPSBteUZvcm1hdC5iaXRzUGVyUGl4ZWwgLyA4OwotKwotKwkvKiBGSVhNRTogU3BlZWQgb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlLiAqLwotKwlmb3IgKHkgPSAwOyB5IDwgcmNIZWlnaHQ7IHkrKykgewotKwkJeTAgPSByY0N1cnNvclkgLSByY0hvdFkgKyB5OwotKwkJaWYgKHkwID49IDAgJiYgeTAgPCBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJCWZvciAoeCA9IDA7IHggPCByY1dpZHRoOyB4KyspIHsKLSsJCQkJeDAgPSByY0N1cnNvclggLSByY0hvdFggKyB4OwotKwkJCQlpZiAoeDAgPj0gMCAmJiB4MCA8IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCQkJCW9mZnNldCA9IHkgKiByY1dpZHRoICsgeDsKLSsJCQkJCWlmIChyY01hc2tbb2Zmc2V0XSkgewotKwkJCQkJCXBvcyA9IChjaGFyICopJnJjU291cmNlW29mZnNldCAqIGJ5dGVzUGVyUGl4ZWxdOwotKwkJCQkJCUNvcHlEYXRhVG9TY3JlZW4ocG9zLCB4MCwgeTAsIDEsIDEpOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJfQotKwkJfQotKwl9Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotIH0KLSAKLS1zdGF0aWMgdm9pZCBGcmVlU29mdEN1cnNvcih2b2lkKQotK3ZvaWQgRnJlZVNvZnRDdXJzb3Iodm9pZCkKLSB7Ci0tICBpZiAocHJldlNvZnRDdXJzb3JTZXQpIHsKLS0gICAgU29mdEN1cnNvckNvcHlBcmVhKE9QRVJfUkVTVE9SRSk7Ci0tICAgIFhGcmVlUGl4bWFwKGRweSwgcmNTYXZlZEFyZWEpOwotLSAgICBmcmVlKHJjU291cmNlKTsKLS0gICAgZnJlZShyY01hc2spOwotLSAgICBwcmV2U29mdEN1cnNvclNldCA9IEZhbHNlOwotLSAgfQotKwlpZiAocHJldlNvZnRDdXJzb3JTZXQpIHsKLSsJCVNvZnRDdXJzb3JDb3B5QXJlYShPUEVSX1JFU1RPUkUpOwotKwkJWEZyZWVQaXhtYXAoZHB5LCByY1NhdmVkQXJlYSk7Ci0rCQlYRnJlZVBpeG1hcChkcHksIHJjU2F2ZWRBcmVhXzApOwotKwkJZnJlZShyY1NvdXJjZSk7Ci0rCQlyY1NvdXJjZSA9IE5VTEw7Ci0rCQlmcmVlKHJjTWFzayk7Ci0rCQlwcmV2U29mdEN1cnNvclNldCA9IEZhbHNlOwotKwl9Ci0gfQotIAotIAotLXN0YXRpYyB2b2lkIEZyZWVYMTFDdXJzb3IoKQotK3ZvaWQgRnJlZVgxMUN1cnNvcigpCi0gewotLSAgaWYgKHByZXZYQ3Vyc29yU2V0KSB7Ci0tICAgIFhGcmVlQ3Vyc29yKGRweSwgcHJldlhDdXJzb3IpOwotLSAgICBwcmV2WEN1cnNvclNldCA9IEZhbHNlOwotLSAgfQotKwlpZiAocHJldlhDdXJzb3JTZXQpIHsKLSsJCVhGcmVlQ3Vyc29yKGRweSwgcHJldlhDdXJzb3IpOwotKwkJcHJldlhDdXJzb3JTZXQgPSBGYWxzZTsKLSsJfQotIH0KLS0KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2Rlc2t0b3AuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvZGVza3RvcC5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvZGVza3RvcC5jCTIwMDQtMDUtMjggMTM6Mjk6MjkuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2Rlc2t0b3AuYwkyMDEwLTAyLTI1IDIyOjMyOjQ5LjAwMDAwMDAwMCAtMDUwMAotQEAgLTI4LDI4ICsyOCw0OTcgQEAKLSAjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgotICNlbmRpZgotIAotKyNpbmNsdWRlIDxYMTEvY3Vyc29yZm9udC5oPgotKwotIEdDIGdjOwotIEdDIHNyY0dDLCBkc3RHQzsgLyogdXNlZCBmb3IgZGVidWdnaW5nIGNvcHlyZWN0ICovCi0gV2luZG93IGRlc2t0b3BXaW47Ci0tQ3Vyc29yIGRvdEN1cnNvcjsKLStDdXJzb3IgZG90Q3Vyc29yMyA9IE5vbmU7Ci0rQ3Vyc29yIGRvdEN1cnNvcjQgPSBOb25lOwotK0N1cnNvciBib2dvQ3Vyc29yID0gTm9uZTsKLStDdXJzb3Igd2FpdEN1cnNvciA9IE5vbmU7Ci0gV2lkZ2V0IGZvcm0sIHZpZXdwb3J0LCBkZXNrdG9wOwotIAotK2ludCBhcHBzaGFyZV8wX2hpbnQgPSAtMTAwMDA7Ci0raW50IGFwcHNoYXJlX3hfaGludCA9IC0xMDAwMDsKLStpbnQgYXBwc2hhcmVfeV9oaW50ID0gLTEwMDAwOwotKwotIHN0YXRpYyBCb29sIG1vZGlmaWVyUHJlc3NlZFsyNTZdOwotIAotLXN0YXRpYyBYSW1hZ2UgKmltYWdlID0gTlVMTDsKLStYSW1hZ2UgKmltYWdlID0gTlVMTDsKLStYSW1hZ2UgKmltYWdlX3ljcm9wID0gTlVMTDsKLStYSW1hZ2UgKmltYWdlX3NjYWxlID0gTlVMTDsKLSsKLStpbnQgaW1hZ2VfaXNfc2htID0gMDsKLSAKLSBzdGF0aWMgQ3Vyc29yIENyZWF0ZURvdEN1cnNvcigpOwotIHN0YXRpYyB2b2lkIENvcHlCR1IyMzNUb1NjcmVlbihDQVJEOCAqYnVmLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCxpbnQgaGVpZ2h0KTsKLSBzdGF0aWMgdm9pZCBIYW5kbGVCYXNpY0Rlc2t0b3BFdmVudChXaWRnZXQgdywgWHRQb2ludGVyIHB0ciwgWEV2ZW50ICpldiwKLSAJCQkJICAgIEJvb2xlYW4gKmNvbnQpOwotIAotK3N0YXRpYyB2b2lkIENvcHlCR1I1NjVUb1NjcmVlbihDQVJEMTYgKmJ1ZiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsaW50IGhlaWdodCk7Ci0rCi0gc3RhdGljIFh0UmVzb3VyY2UgZGVza3RvcEJhY2tpbmdTdG9yZVJlc291cmNlc1tdID0gewotICAgewotLSAgICBYdE5iYWNraW5nU3RvcmUsIFh0Q0JhY2tpbmdTdG9yZSwgWHRSQmFja2luZ1N0b3JlLCBzaXplb2YoaW50KSwgMCwKLS0gICAgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBBbHdheXMsCi0rCVh0TmJhY2tpbmdTdG9yZSwgWHRDQmFja2luZ1N0b3JlLCBYdFJCYWNraW5nU3RvcmUsIHNpemVvZihpbnQpLCAwLAotKwlYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIEFsd2F5cywKLSAgIH0sCi0gfTsKLSAKLStkb3VibGUgc2NhbGVfZmFjdG9yX3ggPSAwLjA7Ci0rZG91YmxlIHNjYWxlX2ZhY3Rvcl95ID0gMC4wOwotK2ludCBzY2FsZV94ID0gMCwgc2NhbGVfeSA9IDA7Ci0raW50IHNjYWxlX3JvdW5kKGludCBsZW4sIGRvdWJsZSBmYWMpOwotKwotK2RvdWJsZSBsYXN0X3Jlc2NhbGUgPSAwLjA7Ci0rZG91YmxlIGxhc3RfZnVsbHNjcmVlbiA9IDAuMDsKLStkb3VibGUgc3RhcnRfdGltZSA9IDAuMDsKLSsKLStpbnQgcHJldl9mYl93aWR0aCA9IC0xOwotK2ludCBwcmV2X2ZiX2hlaWdodCA9IC0xOwotKwotK3ZvaWQgZ2V0X3NjYWxlX3ZhbHVlcyhkb3VibGUgKmZ4LCBkb3VibGUgKmZ5KSB7Ci0rCWNoYXIgKnMgPSBhcHBEYXRhLnNjYWxlOwotKwlkb3VibGUgZiwgZnJhY194ID0gLTEuMCwgZnJhY195ID0gLTEuMDsKLSsJaW50IG4sIG07Ci0rCWludCB4bWF4ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJaW50IHltYXggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJaWYgKGFwcERhdGEueUNyb3AgPiAwKSB7Ci0rCQl5bWF4ID0gYXBwRGF0YS55Q3JvcDsKLSsJfQotKwotKwlpZiAoc3NjYW5mKHMsICIlZC8lZCIsICZuLCAmbSkgPT0gMikgewotKwkJaWYgKG0gPT0gMCkgewotKwkJCWZyYWNfeCA9IDEuMDsKLSsJCX0gZWxzZSB7Ci0rCQkJZnJhY194ID0gKChkb3VibGUpIG4pIC8gKChkb3VibGUpIG0pOwotKwkJfQotKwl9Ci0rCWlmIChzc2NhbmYocywgIiVkeCVkIiwgJm4sICZtKSA9PSAyKSB7Ci0rCQlmcmFjX3ggPSAoKGRvdWJsZSkgbikgLyAoKGRvdWJsZSkgeG1heCk7Ci0rCQlmcmFjX3kgPSAoKGRvdWJsZSkgbSkgLyAoKGRvdWJsZSkgeW1heCk7Ci0rCX0KLSsJaWYgKCFzdHJjYXNlY21wKHMsICJmaXQiKSkgewotKwkJZnJhY194ID0gKChkb3VibGUpIGRweVdpZHRoKSAgLyAoKGRvdWJsZSkgeG1heCk7Ci0rCQlmcmFjX3kgPSAoKGRvdWJsZSkgZHB5SGVpZ2h0KSAvICgoZG91YmxlKSB5bWF4KTsKLSsJfQotKwlpZiAoIXN0cmNhc2VjbXAocywgImF1dG8iKSkgewotKwkJRGltZW5zaW9uIHcsIGg7Ci0rCQlYdFZhR2V0VmFsdWVzKHRvcGxldmVsLCBYdE5oZWlnaHQsICZoLCBYdE53aWR0aCwgJncsIE5VTEwpOwotKwkJZnByaW50ZihzdGRlcnIsICJhdXRvOiAlZHglZFxuIiwgdywgaCk7Ci0rCQlpZiAodyA+IDMyICYmIGggPiAzMikgewotKwkJCWZyYWNfeCA9ICgoZG91YmxlKSB3KSAvICgoZG91YmxlKSB4bWF4KTsKLSsJCQlmcmFjX3kgPSAoKGRvdWJsZSkgaCkgLyAoKGRvdWJsZSkgeW1heCk7Ci0rCQl9Ci0rCX0KLSsJaWYgKGZyYWNfeCA8IDAuMCAmJiBzc2NhbmYocywgIiVsZiIsICZmKSA9PSAxKSB7Ci0rCQlpZiAoZiA+IDAuMCkgewotKwkJCWZyYWNfeCA9IGY7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKGZyYWNfeSA8IDAuMCkgewotKwkJZnJhY195ID0gZnJhY194OwotKwl9Ci0rCi0rCWlmIChmcmFjX3kgPiAwLjAgJiYgZnJhY194ID4gMC4wKSB7Ci0rCQlpZiAoZnggIT0gTlVMTCkgewotKwkJCSpmeCA9IGZyYWNfeDsKLSsJCX0KLSsJCWlmIChmeSAhPSBOVUxMKSB7Ci0rCQkJKmZ5ID0gZnJhY195OwotKwkJfQotKwl9IGVsc2UgewotKwkJaWYgKGFwcERhdGEuc2NhbGUpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2NhbGUgc3RyaW5nOiAnJXMnXG4iLCBhcHBEYXRhLnNjYWxlKTsgCi0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBzY2FsZSBzdHJpbmcuXG4iKTsgCi0rCQl9Ci0rCQlhcHBEYXRhLnNjYWxlID0gTlVMTDsKLSsJfQotK30KLSsKLSt2b2lkIHRyeV9jcmVhdGVfaW1hZ2Uodm9pZCk7Ci0rdm9pZCBwdXRfaW1hZ2UoaW50IHNyY194LCBpbnQgc3JjX3ksIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzb2xpZCk7Ci0rdm9pZCBjcmVhdGVfaW1hZ2UoKTsKLSsKLSsvKiB0b3BsZXZlbCAtPiBmb3JtIC0+IHZpZXdwb3J0IC0+IGRlc2t0b3AgKi8KLSsKLSt2b2lkIGFkanVzdF9YdF93aW4oaW50IHcsIGludCBoKSB7Ci0rCWludCB4LCB5LCBkdywgZGgsIGgwID0gaDsKLSsJaW50IG13ID0gdywgbWggPSBoOwotKwlpbnQgYXV0b3NjYWxlID0gMDsKLSsKLSsJaWYgKCFhcHBEYXRhLmZ1bGxTY3JlZW4gJiYgYXBwRGF0YS5zY2FsZSAhPSBOVUxMICYmICFzdHJjbXAoYXBwRGF0YS5zY2FsZSwgImF1dG8iKSkgewotKwkJYXV0b3NjYWxlID0gMTsKLSsJCW13ID0gZHB5V2lkdGg7Ci0rCQltaCA9IGRweUhlaWdodDsKLSsJfQotKwotKwlpZiAoYXBwRGF0YS55Q3JvcCA+IDApIHsKLSsJCWludCB5Y3JvcCA9IGFwcERhdGEueUNyb3A7IAotKwkJaWYgKGltYWdlX3NjYWxlICYmIHNjYWxlX2ZhY3Rvcl95ID4gMC4wKSB7Ci0rCQkJeWNyb3AgPSBzY2FsZV9yb3VuZCh5Y3JvcCwgc2NhbGVfZmFjdG9yX3kpOwotKwkJCWlmICghYXV0b3NjYWxlKSB7Ci0rCQkJCW1oID0geWNyb3A7Ci0rCQkJfQotKwkJfQotKwkJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHRObWF4V2lkdGgsIG13LCBYdE5tYXhIZWlnaHQsIG1oLCBYdE53aWR0aCwgdywgWHROaGVpZ2h0LCB5Y3JvcCwgTlVMTCk7Ci0rCQlYdFZhU2V0VmFsdWVzKGZvcm0sICAgICBYdE5tYXhXaWR0aCwgbXcsIFh0Tm1heEhlaWdodCwgbWgsIFh0TndpZHRoLCB3LCBYdE5oZWlnaHQsIHljcm9wLCBOVUxMKTsKLSsJCWgwID0geWNyb3A7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHRvcGxldmVsLCBYdE5tYXhXaWR0aCwgbXcsIFh0Tm1heEhlaWdodCwgbWgsIFh0TndpZHRoLCB3LCBYdE5oZWlnaHQsIGgsIE5VTEwpOwotKwl9Ci0rCi0rCWZwcmludGYoc3RkZXJyLCAiYWRqdXN0X1h0X3dpbjogJWR4JWQgJiAlZHglZFxuIiwgdywgaCwgdywgaDApOwotKwotKwlYdFZhU2V0VmFsdWVzKGRlc2t0b3AsICBYdE53aWR0aCwgdywgWHROaGVpZ2h0LCBoLCBOVUxMKTsKLSsKLSsJWHRSZXNpemVXaWRnZXQoZGVza3RvcCwgdywgaCwgMCk7Ci0rCi0rCWlmICghYXV0b3NjYWxlKSB7Ci0rCQlkdyA9IGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGg7Ci0rCQlkaCA9IGFwcERhdGEud21EZWNvcmF0aW9uSGVpZ2h0OwotKwotKwkJeCA9IChkcHlXaWR0aCAgLSB3ICAtIGR3KS8yOwotKwkJeSA9IChkcHlIZWlnaHQgLSBoMCAtIGRoKS8yOwotKwotKwkJWHRDb25maWd1cmVXaWRnZXQodG9wbGV2ZWwsIHggKyBkdywgeSArIGRoLCB3LCBoMCwgMCk7Ci0rCX0KLSt9Ci0rCi0rdm9pZCByZXNjYWxlX2ltYWdlKHZvaWQpIHsKLSsJZG91YmxlIGZyYWNfeCwgZnJhY195OyAKLSsJaW50IHcsIGg7Ci0rCi0rCWlmIChpbWFnZSA9PSBOVUxMKSB7Ci0rCQljcmVhdGVfaW1hZ2UoKTsKLSsJCXJldHVybjsKLSsJfQotKwotKwlpZiAoYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7Ci0rCQljcmVhdGVfaW1hZ2UoKTsKLSsJCXJldHVybjsKLSsJfQotKwotKwlpZiAoaW1hZ2UgPT0gTlVMTCAmJiBpbWFnZV9zY2FsZSA9PSBOVUxMKSB7Ci0rCQljcmVhdGVfaW1hZ2UoKTsKLSsJCXJldHVybjsKLSsJfQotKwotKwlpZiAoYXBwRGF0YS5zY2FsZSA9PSBOVUxMKSB7Ci0rCQkvKiBzd2l0Y2hpbmcgdG8gbm90IHNjYWxlZCAqLwotKwkJZnJhY194ID0gZnJhY195ID0gMS4wOwotKwl9IGVsc2UgewotKwkJZ2V0X3NjYWxlX3ZhbHVlcygmZnJhY194LCAmZnJhY195KTsKLSsJCWlmIChmcmFjX3ggPCAwLjAgfHwgZnJhY195IDwgMC4wKSB7Ci0rCQkJY3JlYXRlX2ltYWdlKCk7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0rCi0rCWxhc3RfcmVzY2FsZSA9IGRub3coKTsKLSsKLSsJU29mdEN1cnNvckxvY2tBcmVhKDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0KTsKLSsKLSsJaWYgKGltYWdlX3NjYWxlID09IE5VTEwpIHsKLSsJCS8qIHN3aXRjaGluZyBmcm9tIG5vdCBzY2FsZWQgKi8KLSsJCWludCBpOwotKwkJaW50IEJwbCA9IGltYWdlLT5ieXRlc19wZXJfbGluZTsKLSsJCWNoYXIgKmRzdCwgKnNyYyA9IGltYWdlLT5kYXRhOwotKwotKwkJaW1hZ2Vfc2NhbGUgPSBYQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIHZpc2RlcHRoLCBaUGl4bWFwLCAwLCBOVUxMLAotKwkJICAgIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBCaXRtYXBQYWQoZHB5KSwgMCk7Ci0rCi0rCQlpbWFnZV9zY2FsZS0+ZGF0YSA9IChjaGFyICopIG1hbGxvYyhpbWFnZV9zY2FsZS0+Ynl0ZXNfcGVyX2xpbmUgKiBpbWFnZV9zY2FsZS0+aGVpZ2h0KTsKLSsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzY2FsZV9pbWFnZTogc3dpdGNoaW5nIGZyb20gbm90IHNjYWxlZC4gY3JlYXRlZCBpbWFnZV9zY2FsZSAlZHglZFxuIiwgaW1hZ2Vfc2NhbGUtPndpZHRoLCBpbWFnZV9zY2FsZS0+aGVpZ2h0KTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzY2FsZV9pbWFnZTogY29weWluZyBpbWFnZSAtPiBpbWFnZV9zY2FsZSAlZHglZCAtPiAlZHglZFxuIiwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0LCBpbWFnZV9zY2FsZS0+d2lkdGgsIGltYWdlX3NjYWxlLT5oZWlnaHQpOwotKwotKwkJZHN0ID0gaW1hZ2Vfc2NhbGUtPmRhdGE7Ci0rCi0rCQkvKiBjb3B5IGZyb20gaW1hZ2UtPmRhdGEgKi8KLSsJCWZvciAoaT0wOyBpIDwgaW1hZ2UtPmhlaWdodDsgaSsrKSB7Ci0rCQkJbWVtY3B5KGRzdCwgc3JjLCBCcGwpOwotKwkJCWRzdCArPSBCcGw7Ci0rCQkJc3JjICs9IEJwbDsKLSsJCX0KLSsJfQotKwotKwkvKiBub3cgZGVzdHJveSBpbWFnZSAqLwotKwlpZiAoaW1hZ2UgJiYgaW1hZ2UtPmRhdGEpIHsKLSsJCWlmIChVc2luZ1NobSgpKSB7Ci0rCQkJU2htRGV0YWNoKCk7Ci0rCQl9Ci0rCQlYRGVzdHJveUltYWdlKGltYWdlKTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzY2FsZV9pbWFnZTogZGVzdHJveWVkICdpbWFnZSdcbiIpOwotKwkJaWYgKFVzaW5nU2htKCkpIHsKLSsJCQlTaG1DbGVhbnVwKCk7Ci0rCQl9Ci0rCQlpbWFnZSA9IE5VTEw7Ci0rCX0KLSsJaWYgKGltYWdlX3ljcm9wICYmIGltYWdlX3ljcm9wLT5kYXRhKSB7Ci0rCQlYRGVzdHJveUltYWdlKGltYWdlX3ljcm9wKTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzY2FsZV9pbWFnZTogZGVzdHJveWVkICdpbWFnZV95Y3JvcCdcbiIpOwotKwkJaW1hZ2VfeWNyb3AgPSBOVUxMOwotKwl9Ci0rCi0rCWlmIChmcmFjX3ggPT0gMS4wICYmIGZyYWNfeSA9PSAxLjApIHsKLSsJCS8qIHN3aXRjaGluZyB0byBub3Qgc2NhbGVkICovCi0rCQlmcHJpbnRmKHN0ZGVyciwgInJlc2NhbGVfaW1hZ2U6IHN3aXRjaGluZyB0byBub3Qgc2NhbGVkLlxuIik7Ci0rCQl3ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCWggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJCXNjYWxlX2ZhY3Rvcl94ID0gMC4wOwotKwkJc2NhbGVfZmFjdG9yX3kgPSAwLjA7Ci0rCQlzY2FsZV94ID0gMDsKLSsJCXNjYWxlX3kgPSAwOwotKwl9IGVsc2UgewotKwkJdyA9IHNjYWxlX3JvdW5kKHNpLmZyYW1lYnVmZmVyV2lkdGgsICBmcmFjX3gpOwotKwkJaCA9IHNjYWxlX3JvdW5kKHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBmcmFjX3kpOwotKwotKwkJc2NhbGVfZmFjdG9yX3ggPSBmcmFjX3g7Ci0rCQlzY2FsZV9mYWN0b3JfeSA9IGZyYWNfeTsKLSsJCXNjYWxlX3ggPSB3OwotKwkJc2NhbGVfeSA9IGg7Ci0rCX0KLSsKLSsJYWRqdXN0X1h0X3dpbih3LCBoKTsKLSsKLSsJZnByaW50ZihzdGRlcnIsICJyZXNjYWxlOiAlZHglZCAgJS40ZiAlLjRmXG4iLCB3LCBoLCBzY2FsZV9mYWN0b3JfeCwgc2NhbGVfZmFjdG9yX3kpOwotKwotKwl0cnlfY3JlYXRlX2ltYWdlKCk7Ci0rCi0rCWlmIChpbWFnZSAmJiBpbWFnZS0+ZGF0YSAmJiBpbWFnZV9zY2FsZSAmJiBmcmFjX3ggPT0gMS4wICYmIGZyYWNfeSA9PSAxLjApIHsKLSsJCS8qIHN3aXRjaGVkIHRvIG5vdCBzY2FsZWQgKi8KLSsJCWludCBpOwotKwkJaW50IEJwbCA9IGltYWdlLT5ieXRlc19wZXJfbGluZTsKLSsJCWNoYXIgKmRzdCA9IGltYWdlLT5kYXRhOwotKwkJY2hhciAqc3JjID0gaW1hZ2Vfc2NhbGUtPmRhdGE7Ci0rCi0rCQlmcHJpbnRmKHN0ZGVyciwgInJlc2NhbGVfaW1hZ2U6IHN3aXRjaGluZyB0byBub3Qgc2NhbGVkLlxuIik7Ci0rCi0rCQlmb3IgKGk9MDsgaSA8IGltYWdlLT5oZWlnaHQ7IGkrKykgewotKwkJCW1lbWNweShkc3QsIHNyYywgQnBsKTsKLSsJCQlkc3QgKz0gQnBsOwotKwkJCXNyYyArPSBCcGw7Ci0rCQl9Ci0rCQlYRGVzdHJveUltYWdlKGltYWdlX3NjYWxlKTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzY2FsZV9pbWFnZTogZGVzdHJveWVkICdpbWFnZV9zY2FsZSdcbiIpOwotKwkJaW1hZ2Vfc2NhbGUgPSBOVUxMOwotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJaW50IHljcm9wID0gYXBwRGF0YS55Q3JvcDsKLSsJCS8qIGRvIHRoZSB0b3AgcGFydCBmaXJzdCBzbyB0aGV5IGNhbiBzZWUgaXQgZWFybGllciAqLwotKwkJcHV0X2ltYWdlKDAsIDAsIDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHljcm9wLCAwKTsKLSsJCWlmIChzaS5mcmFtZWJ1ZmZlckhlaWdodCA+IHljcm9wKSB7Ci0rCQkJLyogdGhpcyBpcyBhIGJpZyBmYiBhbmQgc28gd2lsbCB0YWtlIGEgbG9uZyB0aW1lICovCi0rCQkJaWYgKHdhaXRDdXJzb3IgIT0gTm9uZSkgewotKwkJCQlYRGVmaW5lQ3Vyc29yKGRweSwgZGVza3RvcFdpbiwgd2FpdEN1cnNvcik7Ci0rCQkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJCX0KLSsJCQlwdXRfaW1hZ2UoMCwgMCwgMCwgMCwgc2kuZnJhbWVidWZmZXJXaWR0aCwgc2kuZnJhbWVidWZmZXJIZWlnaHQgLSB5Y3JvcCwgMCk7Ci0rCQkJaWYgKHdhaXRDdXJzb3IgIT0gTm9uZSkgewotKwkJCQlYY3Vyc29ycygxKTsKLSsJCQkJaWYgKGFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQkJCQlYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwotKwkJCQkJdW5zaWduZWQgbG9uZyB2YWx1ZW1hc2sgPSAwOwotKwkJCQkJaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCQkJCQlhdHRyLmN1cnNvciA9IGRvdEN1cnNvcjQ7ICAgIAotKwkJCQkJfSBlbHNlIHsKLSsJCQkJCQlhdHRyLmN1cnNvciA9IGRvdEN1cnNvcjM7ICAgIAotKwkJCQkJfQotKwkJCQkJdmFsdWVtYXNrIHw9IENXQ3Vyc29yOwotKwkJCQkJWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoZHB5LCBkZXNrdG9wV2luLCB2YWx1ZW1hc2ssICZhdHRyKTsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJfSBlbHNlIHsKLSsJCXB1dF9pbWFnZSgwLCAwLCAwLCAwLCBzaS5mcmFtZWJ1ZmZlcldpZHRoLCBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgMCk7Ci0rCX0KLSsKLSsJU29mdEN1cnNvclVubG9ja1NjcmVlbigpOwotKwotKwlmcHJpbnRmKHN0ZGVyciwgInJlc2NhbGU6IGltYWdlX3NjYWxlPSVwIGltYWdlPSVwIGltYWdlX3ljcm9wPSVwXG4iLCAodm9pZCAqKSBpbWFnZV9zY2FsZSwgKHZvaWQgKikgaW1hZ2UsICh2b2lkICopIGltYWdlX3ljcm9wKTsKLSsJbGFzdF9yZXNjYWxlID0gZG5vdygpOwotKwotK30KLSsKLSt2b2lkIHRyeV9jcmVhdGVfaW1hZ2Uodm9pZCkgewotKwkKLSsJaW1hZ2VfaXNfc2htID0gMDsKLSsJaWYgKGFwcERhdGEudXNlU2htKSB7Ci0rI2lmZGVmIE1JVFNITQotKwkJaW1hZ2UgPSBDcmVhdGVTaG1JbWFnZSgwKTsKLSsJCWlmICghaW1hZ2UpIHsKLSsJCQlpZiAoYXBwRGF0YS55Q3JvcCA+IDApIHsKLSsJCQkJaWYgKGFwcERhdGEuc2NhbGUgIT0gTlVMTCAmJiBzY2FsZV94ID4gMCkgewotKwkJCQkJOwotKwkJCQl9IGVsc2UgewotKwkJCQkJaW1hZ2VfeWNyb3AgPSBDcmVhdGVTaG1JbWFnZSgxKTsKLSsJCQkJCWlmICghaW1hZ2VfeWNyb3ApIHsKLSsJCQkJCQlhcHBEYXRhLnVzZVNobSA9IEZhbHNlOwotKwkJCQkJfSBlbHNlIHsKLSsJCQkJCQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZWQgc21hbGxlciBpbWFnZV95Y3JvcCBzaG0gaW1hZ2U6ICVkeCVkXG4iLAotKwkJCQkJCSAgICBpbWFnZV95Y3JvcC0+d2lkdGgsIGltYWdlX3ljcm9wLT5oZWlnaHQpOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJfSBlbHNlIHsKLSsJCQkJYXBwRGF0YS51c2VTaG0gPSBGYWxzZTsKLSsJCQl9Ci0rCQl9IGVsc2UgewotKwkJCWltYWdlX2lzX3NobSA9IDE7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJjcmVhdGVkIHNobSBpbWFnZTogJWR4JWRcbiIsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7Ci0rCQl9Ci0rI2VuZGlmCi0rCX0KLSsKLSsJaWYgKCFpbWFnZSkgewotKwkJZnByaW50ZihzdGRlcnIsICJ0cnlfY3JlYXRlX2ltYWdlOiBzaG0gaW1hZ2UgY3JlYXRlIGZhaWw6IGltYWdlID09IE5VTExcbiIpOwotKwkJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQkJaW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIHZpc2RlcHRoLCBaUGl4bWFwLCAwLCBOVUxMLAotKwkJCSAgICBzY2FsZV94LCBzY2FsZV95LCBCaXRtYXBQYWQoZHB5KSwgMCk7Ci0rCQl9IGVsc2UgewotKwkJCWltYWdlID0gWENyZWF0ZUltYWdlKGRweSwgdmlzLCB2aXNkZXB0aCwgWlBpeG1hcCwgMCwgTlVMTCwKLSsJCQkgICAgc2kuZnJhbWVidWZmZXJXaWR0aCwgc2kuZnJhbWVidWZmZXJIZWlnaHQsIEJpdG1hcFBhZChkcHkpLCAwKTsKLSsJCX0KLSsKLSsJCWltYWdlLT5kYXRhID0gbWFsbG9jKGltYWdlLT5ieXRlc19wZXJfbGluZSAqIGltYWdlLT5oZWlnaHQpOwotKwotKwkJaWYgKCFpbWFnZS0+ZGF0YSkgewotKwkJCWZwcmludGYoc3RkZXJyLCAidHJ5X2NyZWF0ZV9pbWFnZTogbWFsbG9jIGZhaWxlZFxuIik7Ci0rCQkJZXhpdCgxKTsKLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJ0cnlfY3JlYXRlX2ltYWdlOiBjcmVhdGVkICpub24tc2htKiBpbWFnZTogJWR4JWRcbiIsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7Ci0rCQl9Ci0rCX0KLSsJZnByaW50ZihzdGRlcnIsICJ0cnlfY3JlYXRlX2ltYWdlOiBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU6ICVkXG4iLCBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpOwotK30KLSsKLSt2b2lkIGNyZWF0ZV9pbWFnZSgpIHsKLSsJaW1hZ2UgPSBOVUxMOwotKwlpbWFnZV95Y3JvcCA9IE5VTEw7Ci0rCWltYWdlX3NjYWxlID0gTlVMTDsKLSsKLSsJZnByaW50ZihzdGRlcnIsICJjcmVhdGVfaW1hZ2UoKVxuIik7Ci0rCi0rCWlmIChDcmVhdGVTaG1JbWFnZSgtMSkgPT0gTlVMTCkgewotKwkJYXBwRGF0YS51c2VTaG0gPSBGYWxzZTsKLSsJfQotKwlpZiAoYXBwRGF0YS5zY2FsZSAhPSBOVUxMKSB7Ci0rCQlpZiAoYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2NhbGUgd2hlbiB1c2luZyBYMTEgYmFja2luZ3N0b3JlLlxuIik7Ci0rCQl9IGVsc2UgewotKwkJCWRvdWJsZSBmcmFjX3ggPSAtMS4wLCBmcmFjX3kgPSAtMS4wOwotKwotKwkJCWdldF9zY2FsZV92YWx1ZXMoJmZyYWNfeCwgJmZyYWNfeSk7Ci0rCi0rCQkJaWYgKGZyYWNfeCA8IDAuMCB8fCBmcmFjX3kgPCAwLjApIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmlndXJlIG91dCBzY2FsZSBmYWN0b3IhXG4iKTsKLSsJCQkJZ290byBib3JrOwotKwkJCX0KLSsKLSsJCQlzY2FsZV9mYWN0b3JfeCA9IDAuMDsKLSsJCQlzY2FsZV9mYWN0b3JfeSA9IDAuMDsKLSsJCQlzY2FsZV94ID0gMDsKLSsJCQlzY2FsZV95ID0gMDsKLSsKLSsKLSsJCQlpZiAoMSkgewotKwkJCQlpbnQgdywgaCwgaHljOwotKwotKwkJCQl3ID0gc2NhbGVfcm91bmQoc2kuZnJhbWVidWZmZXJXaWR0aCwgIGZyYWNfeCk7Ci0rCQkJCWggPSBzY2FsZV9yb3VuZChzaS5mcmFtZWJ1ZmZlckhlaWdodCwgZnJhY195KTsKLSsJCQkJaHljID0gaDsKLSsJCQkJaWYgKGFwcERhdGEueUNyb3AgPiAwKSB7Ci0rCQkJCQloeWMgPSBzY2FsZV9yb3VuZChhcHBEYXRhLnlDcm9wLCBmcmFjX3kpOwotKwkJCQl9Ci0rCi0rCQkJCS8qIGltYWdlIHNjYWxlIGlzIGZ1bGwgZnJhbWVidWZmZXIgKi8KLSsJCQkJaW1hZ2Vfc2NhbGUgPSBYQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIHZpc2RlcHRoLCBaUGl4bWFwLCAwLCBOVUxMLAotKwkJCQkgICAgc2kuZnJhbWVidWZmZXJXaWR0aCwgc2kuZnJhbWVidWZmZXJIZWlnaHQsIEJpdG1hcFBhZChkcHkpLCAwKTsKLSsKLSsJCQkJaW1hZ2Vfc2NhbGUtPmRhdGEgPSAoY2hhciAqKSBtYWxsb2MoaW1hZ2Vfc2NhbGUtPmJ5dGVzX3Blcl9saW5lICogaW1hZ2Vfc2NhbGUtPmhlaWdodCk7Ci0rCi0rCQkJCWZwcmludGYoc3RkZXJyLCAiY3JlYXRlX2ltYWdlOiBjcmVhdGVkIGltYWdlX3NjYWxlICVkeCVkXG4iLCBpbWFnZV9zY2FsZS0+d2lkdGgsIGltYWdlX3NjYWxlLT5oZWlnaHQpOwotKwotKwkJCQlpZiAoIWltYWdlX3NjYWxlLT5kYXRhKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZV9pbWFnZTogbWFsbG9jIGZhaWxlZFxuIik7Ci0rCQkJCQlYRGVzdHJveUltYWdlKGltYWdlX3NjYWxlKTsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiY3JlYXRlX2ltYWdlOiBkZXN0cm95ZWQgJ2ltYWdlX3NjYWxlJ1xuIik7Ci0rCQkJCQlpbWFnZV9zY2FsZSA9IE5VTEw7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlpbnQgaDI7Ci0rCQkJCQlzY2FsZV9mYWN0b3JfeCA9IGZyYWNfeDsKLSsJCQkJCXNjYWxlX2ZhY3Rvcl95ID0gZnJhY195OwotKwkJCQkJc2NhbGVfeCA9IHc7Ci0rCQkJCQlzY2FsZV95ID0gaDsKLSsKLSsJCQkJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm1heFdpZHRoLCB3LCBYdE5tYXhIZWlnaHQsIGh5YywgTlVMTCk7Ci0rCi0rCQkJCQloMiA9IHNjYWxlX3JvdW5kKHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBmcmFjX3kpOwotKwkJCQkJWHRWYVNldFZhbHVlcyhkZXNrdG9wLCAgWHROd2lkdGgsIHcsIFh0TmhlaWdodCwgaDIsIE5VTEwpOwotKwotKwkJCQl9Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiY3JlYXRlX2ltYWdlOiBzY2FsZTogJWR4JWQgICUuNGYgJS40ZlxuIiwgdywgaCwKLSsJCQkJICAgIHNjYWxlX2ZhY3Rvcl94LCBzY2FsZV9mYWN0b3JfeSk7Ci0rCQkJfQotKwkJfQotKwl9Ci0rCWJvcms6Ci0rCXRyeV9jcmVhdGVfaW1hZ2UoKTsKLSt9Ci0rCi0raW50IG9sZF93aWR0aCA9IDA7Ci0raW50IG9sZF9oZWlnaHQgPSAwOwotKwotK2ludCBndWVzc0Nyb3Aodm9pZCkgewotKwlpbnQgdyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCi0rCWlmICh3ID09IDMyMCkgewotKwkJcmV0dXJuIDI0MDsKLSsJfSBlbHNlIGlmICh3ID09IDQwMCkgewotKwkJcmV0dXJuIDMwMDsKLSsJfSBlbHNlIGlmICh3ID09IDY0MCkgewotKwkJcmV0dXJuIDQ4MDsKLSsJfSBlbHNlIGlmICh3ID09IDgwMCkgewotKwkJcmV0dXJuIDYwMDsKLSsJfSBlbHNlIGlmICh3ID09IDEwMjQpIHsKLSsJCXJldHVybiA3Njg7Ci0rCX0gZWxzZSBpZiAodyA9PSAxMTUyKSB7Ci0rCQlyZXR1cm4gODY0OwotKwl9IGVsc2UgaWYgKHcgPT0gMTI4MCkgewotKwkJcmV0dXJuIDEwMjQ7Ci0rCX0gZWxzZSBpZiAodyA9PSAxNDQwKSB7Ci0rCQlyZXR1cm4gOTAwOwotKwl9IGVsc2UgaWYgKHcgPT0gMTYwMCkgewotKwkJcmV0dXJuIDEyMDA7Ci0rCX0gZWxzZSBpZiAodyA9PSAxNjgwKSB7Ci0rCQlyZXR1cm4gMTA1MDsKLSsJfSBlbHNlIGlmICh3ID09IDE5MjApIHsKLSsJCXJldHVybiAxMjAwOwotKwl9IGVsc2UgewotKwkJaW50IGggPSAoMyAqIHcpIC8gNDsKLSsJCXJldHVybiBoOwotKwl9Ci0rfQotKwotK3ZvaWQgY2hlY2tfdGFsbCh2b2lkKSB7Ci0rCWlmIChhcHBEYXRhLmFwcFNoYXJlKSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsJaWYgKCEgYXBwRGF0YS55Q3JvcCkgewotKwkJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJaW50IGggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsJCWlmIChoID4gMiAqIHcpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlRhbGwgZGlzcGxheSAoJWR4JWQpIHN1c3BlY3QgJ3gxMXZuYyAtbmNhY2hlJyBtb2RlLFxuIiwgdywgaCk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICIgIHNldHRpbmcgYXV0byAteWNyb3AgZGV0ZWN0aW9uLlxuIik7Ci0rCQkJYXBwRGF0YS55Q3JvcCA9IC0xOwotKwkJfQotKwl9Ci0rfQotIAotIC8qCi0gICogRGVza3RvcEluaXRCZWZvcmVSZWFsaXphdGlvbiBjcmVhdGVzIHRoZSAiZGVza3RvcCIgd2lkZ2V0IGFuZCB0aGUgdmlld3BvcnQKLUBAIC01OSw5MSArNTI4LDEwMjMgQEAKLSB2b2lkCi0gRGVza3RvcEluaXRCZWZvcmVSZWFsaXphdGlvbigpCi0gewotLSAgaW50IGk7Ci0rCWludCBpOwotKwlpbnQgaCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwlpbnQgdyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCWRvdWJsZSBmcmFjX3ggPSAxLjAsIGZyYWNfeSA9IDEuMDsKLSsKLSsJc3RhcnRfdGltZSA9IGRub3coKTsKLSsKLSsJcHJldl9mYl93aWR0aCA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCXByZXZfZmJfaGVpZ2h0ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCi0rCWlmIChhcHBEYXRhLnNjYWxlICE9IE5VTEwpIHsKLSsJCWdldF9zY2FsZV92YWx1ZXMoJmZyYWNfeCwgJmZyYWNfeSk7Ci0rCQlpZiAoZnJhY194ID4gMC4wICYmIGZyYWNfeSA+IDAuMCkgewotKwkJCXcgPSBzY2FsZV9yb3VuZCh3LCAgZnJhY194KTsKLSsJCQloID0gc2NhbGVfcm91bmQoaCwgIGZyYWNfeSk7Ci0rCQl9IGVsc2UgewotKwkJCWFwcERhdGEuc2NhbGUgPSBOVUxMOwotKwkJfQotKwl9Ci0gCi0tICBmb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImZvcm0iLCBmb3JtV2lkZ2V0Q2xhc3MsIHRvcGxldmVsLAotLQkJCQkgWHROYm9yZGVyV2lkdGgsIDAsCi0tCQkJCSBYdE5kZWZhdWx0RGlzdGFuY2UsIDAsIE5VTEwpOwotKwlmb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImZvcm0iLCBmb3JtV2lkZ2V0Q2xhc3MsIHRvcGxldmVsLAotKwkgICAgWHROYm9yZGVyV2lkdGgsIDAsIFh0TmRlZmF1bHREaXN0YW5jZSwgMCwgTlVMTCk7Ci0gCi0tICB2aWV3cG9ydCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ2aWV3cG9ydCIsIHZpZXdwb3J0V2lkZ2V0Q2xhc3MsIGZvcm0sCi0tCQkJCSAgICAgWHROYm9yZGVyV2lkdGgsIDAsCi0tCQkJCSAgICAgTlVMTCk7Ci0rCXZpZXdwb3J0ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInZpZXdwb3J0Iiwgdmlld3BvcnRXaWRnZXRDbGFzcywgZm9ybSwKLSsJICAgIFh0TmJvcmRlcldpZHRoLCAwLCBOVUxMKTsKLSAKLS0gIGRlc2t0b3AgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGVza3RvcCIsIGNvcmVXaWRnZXRDbGFzcywgdmlld3BvcnQsCi0tCQkJCSAgICBYdE5ib3JkZXJXaWR0aCwgMCwKLS0JCQkJICAgIE5VTEwpOwotKwlkZXNrdG9wID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRlc2t0b3AiLCBjb3JlV2lkZ2V0Q2xhc3MsIHZpZXdwb3J0LAotKwkgICAgWHROYm9yZGVyV2lkdGgsIDAsIE5VTEwpOwotIAotLSAgWHRWYVNldFZhbHVlcyhkZXNrdG9wLCBYdE53aWR0aCwgc2kuZnJhbWVidWZmZXJXaWR0aCwKLS0JCVh0TmhlaWdodCwgc2kuZnJhbWVidWZmZXJIZWlnaHQsIE5VTEwpOwotKwlYdFZhU2V0VmFsdWVzKGRlc2t0b3AsIFh0TndpZHRoLCB3LCBYdE5oZWlnaHQsIGgsIE5VTEwpOwotIAotLSAgWHRBZGRFdmVudEhhbmRsZXIoZGVza3RvcCwgTGVhdmVXaW5kb3dNYXNrfEV4cG9zdXJlTWFzaywKLS0JCSAgICBUcnVlLCBIYW5kbGVCYXNpY0Rlc2t0b3BFdmVudCwgTlVMTCk7Ci0rCVh0QWRkRXZlbnRIYW5kbGVyKGRlc2t0b3AsIExlYXZlV2luZG93TWFza3xFbnRlcldpbmRvd01hc2t8RXhwb3N1cmVNYXNrLAotKwkgICAgVHJ1ZSwgSGFuZGxlQmFzaWNEZXNrdG9wRXZlbnQsIE5VTEwpOwotIAotLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotLSAgICBtb2RpZmllclByZXNzZWRbaV0gPSBGYWxzZTsKLSsJaWYgKGFwcERhdGEueUNyb3ApIHsKLSsJCWludCBobTsKLSsJCWlmIChhcHBEYXRhLnlDcm9wIDwgMCkgewotKwkJCWFwcERhdGEueUNyb3AgPSBndWVzc0Nyb3AoKTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlNldCAteWNyb3AgdG86ICVkXG4iLCBhcHBEYXRhLnlDcm9wKTsKLSsJCX0KLSsJCWhtID0gYXBwRGF0YS55Q3JvcDsKLSAKLS0gIGltYWdlID0gTlVMTDsKLSsJCWZwcmludGYoc3RkZXJyLCAieWNyb3AgaDogJWQgLT4gJWRcbiIsIGhtLCAoaW50KSAoaG0qZnJhY195KSk7Ci0gCi0tI2lmZGVmIE1JVFNITQotLSAgaWYgKGFwcERhdGEudXNlU2htKSB7Ci0tICAgIGltYWdlID0gQ3JlYXRlU2htSW1hZ2UoKTsKLS0gICAgaWYgKCFpbWFnZSkKLS0gICAgICBhcHBEYXRhLnVzZVNobSA9IEZhbHNlOwotLSAgfQotKwkJaG0gKj0gZnJhY195OwotKwotKwkJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHRObWF4SGVpZ2h0LCBobSwgWHROaGVpZ2h0LCBobSwgTlVMTCk7Ci0rCQlYdFZhU2V0VmFsdWVzKGZvcm0sICAgICBYdE5tYXhIZWlnaHQsIGhtLCBYdE5oZWlnaHQsIGhtLCBOVUxMKTsKLSsJCVh0VmFTZXRWYWx1ZXModmlld3BvcnQsIFh0TmZvcmNlQmFycywgRmFsc2UsIE5VTEwpOwotKwkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCX0KLSsKLSsJb2xkX3dpZHRoICA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCW9sZF9oZWlnaHQgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0rCQltb2RpZmllclByZXNzZWRbaV0gPSBGYWxzZTsKLSsJfQotKwotKwljcmVhdGVfaW1hZ2UoKTsKLSt9Ci0rCi0rI2lmIDAKLStzdGF0aWMgV2lkZ2V0IHNjcm9sbGJhcl95ID0gTlVMTDsKLStzdGF0aWMgaW50IHhzc3QgPSAyOwotICNlbmRpZgotIAotLSAgaWYgKCFpbWFnZSkgewotLSAgICBpbWFnZSA9IFhDcmVhdGVJbWFnZShkcHksIHZpcywgdmlzZGVwdGgsIFpQaXhtYXAsIDAsIE5VTEwsCi0tCQkJIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LAotLQkJCSBCaXRtYXBQYWQoZHB5KSwgMCk7Ci0tCi0tICAgIGltYWdlLT5kYXRhID0gbWFsbG9jKGltYWdlLT5ieXRlc19wZXJfbGluZSAqIGltYWdlLT5oZWlnaHQpOwotLSAgICBpZiAoIWltYWdlLT5kYXRhKSB7Ci0tICAgICAgZnByaW50ZihzdGRlcnIsIm1hbGxvYyBmYWlsZWRcbiIpOwotLSAgICAgIGV4aXQoMSk7Ci0tICAgIH0KLS0gIH0KLSsjaW5jbHVkZSA8WDExL1hhdy9TY3JvbGxiYXIuaD4KLSsKLSsjaWYgMAotK3N0YXRpYyBYdENhbGxiYWNrUHJvYyBTY3JvbGxlZChXaWRnZXQgdywgWHRQb2ludGVyIGNsb3N1cmUsIFh0UG9pbnRlciBjYWxsX2RhdGEpIHsKLSsJUG9zaXRpb24geCwgeTsKLSsJWHRWYUdldFZhbHVlcyhkZXNrdG9wLCBYdE54LCAmeCwgWHROeSwgJnksIE5VTEwpOwotKwlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJzY3JvbGxlZCBieSAlZCBwaXhlbHMgeD0lZCB5PSVkXG4iLCAoaW50KSBjYWxsX2RhdGEsIHgsIHkpOwotKwlpZiAoeHNzdCA9PSAyKSB7Ci0rCQl4ID0gMDsKLSsJCXkgPSAwOwotKwkJWHRWYVNldFZhbHVlcyhkZXNrdG9wLCBYdE54LCB4LCBYdE55LCB5LCBOVUxMKTsKLSsJfSBlbHNlIGlmICh4c3N0KSB7Ci0rCQlYYXdTY3JvbGxiYXJTZXRUaHVtYih3LCAwLjAsIDAuMCk7Ci0rCX0gZWxzZSB7Ci0rCQlmbG9hdCB0ID0gMC4wOwotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE50b3BPZlRodW1iLCAmdCwgTlVMTCk7Ci0rCX0KLSsJaWYgKGNsb3N1cmUpIHt9Ci0gfQotIAotK3N0YXRpYyBYdENhbGxiYWNrUHJvYyBKdW1wZWQoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbG9zdXJlLCBYdFBvaW50ZXIgY2FsbF9kYXRhKSB7Ci0rCWZsb2F0IHRvcCA9ICooKGZsb2F0ICopIGNhbGxfZGF0YSk7Ci0rCVBvc2l0aW9uIHgsIHk7Ci0rCVh0VmFHZXRWYWx1ZXMoZGVza3RvcCwgWHROeCwgJngsIFh0TnksICZ5LCBOVUxMKTsKLSsJaWYgKDApIGZwcmludGYoc3RkZXJyLCAidGh1bWIgdmFsdWU6ICUuNGYgeD0lZCB5PSVkXG4iLCB0b3AsIHgsIHkpOwotKwlpZiAodG9wID4gMC4wMSkgewotKwkJaWYgKHhzc3QgPT0gMikgewotKwkJCXggPSAwOwotKwkJCXkgPSAwOwotKwkJCVh0VmFTZXRWYWx1ZXMoZGVza3RvcCwgWHROeCwgeCwgWHROeSwgeSwgTlVMTCk7Ci0rCQl9IGVsc2UgaWYgKHhzc3QpIHsKLSsJCQlYYXdTY3JvbGxiYXJTZXRUaHVtYih3LCAwLjAsIDAuMCk7Ci0rCQl9IGVsc2UgewotKwkJCWZsb2F0IHQgPSAwLjAsIHMgPSAxLjA7Ci0rCQkJWHRWYVNldFZhbHVlcyh3LCBYdE50b3BPZlRodW1iLCAqKFh0QXJnVmFsKikmdCwgWHROc2hvd24sICooWHRBcmdWYWwqKSZzLCBOVUxMKTsKLSsJCX0KLSsJfQotKwlpZiAoY2xvc3VyZSkge30KLSt9Ci0rI2VuZGlmCi0rCi0rZXh0ZXJuIGRvdWJsZSBkbm93KHZvaWQpOwotKwotK3ZvaWQgY2hlY2tfdGhpbmdzKCkgewotKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLSsJc3RhdGljIGRvdWJsZSBsYXN0X3Njcm9sbGJhciA9IDAuMDsKLSsJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwlpbnQgaCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwlkb3VibGUgbm93ID0gZG5vdygpOwotKwlzdGF0aWMgZG91YmxlIGxhc3QgPSAwOwotKwlkb3VibGUgZmFjID0gaW1hZ2Vfc2NhbGUgPyBzY2FsZV9mYWN0b3JfeSA6IDEuMDsKLSsKLSsJaWYgKGZpcnN0KSB7Ci0rCQlmaXJzdCA9IDA7Ci0rCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBGYWxzZSk7Ci0rCX0KLSsJaWYgKGFwcERhdGEueUNyb3AgPiAwICYmIGFwcERhdGEueUNyb3AgKiBmYWMgPCBkcHlIZWlnaHQgJiYgaCA+IDIqdyAmJiBub3cgPiBsYXN0X3Njcm9sbGJhciArIDAuMjUpIHsKLSsJCVdpZGdldCB3diwgd2gsIHdjOwotKwkJUG9zaXRpb24geDAsIHkwOwotKwkJUG9zaXRpb24geDEsIHkxOwotKwkJRGltZW5zaW9uIHcwLCBoMCwgYjA7Ci0rCQlEaW1lbnNpb24gdzEsIGgxLCBiMTsKLSsJCURpbWVuc2lvbiB3MiwgaDIsIGIyOwotKwkJCi0rCQl3YyA9IFh0TmFtZVRvV2lkZ2V0KHZpZXdwb3J0LCAiY2xpcCIpOwotKwkJd3YgPSBYdE5hbWVUb1dpZGdldCh2aWV3cG9ydCwgInZlcnRpY2FsIik7Ci0rCQl3aCA9IFh0TmFtZVRvV2lkZ2V0KHZpZXdwb3J0LCAiaG9yaXpvbnRhbCIpOwotKwkJaWYgKHdjICYmIHd2ICYmIHdoKSB7Ci0rCQkJaW50IHNiID0gYXBwRGF0YS5zYldpZHRoOwotKwkJCVh0VmFHZXRWYWx1ZXMod3YsIFh0TndpZHRoLCAmdzAsIFh0TmhlaWdodCwgJmgwLCBYdE5ib3JkZXJXaWR0aCwgJmIwLCBYdE54LCAmeDAsIFh0TnksICZ5MCwgTlVMTCk7Ci0rCQkJWHRWYUdldFZhbHVlcyh3aCwgWHROd2lkdGgsICZ3MSwgWHROaGVpZ2h0LCAmaDEsIFh0TmJvcmRlcldpZHRoLCAmYjEsIFh0TngsICZ4MSwgWHROeSwgJnkxLCBOVUxMKTsKLSsJCQlYdFZhR2V0VmFsdWVzKHdjLCBYdE53aWR0aCwgJncyLCBYdE5oZWlnaHQsICZoMiwgWHROYm9yZGVyV2lkdGgsICZiMiwgTlVMTCk7Ci0rCQkJaWYgKCFzYikgewotKwkJCQlzYiA9IDI7Ci0rCQkJfQotKwkJCWlmICh3MCAhPSBzYiB8fCBoMSAhPSBzYikgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlZlcnkgdGFsbCAoLW5jYWNoZSkgZmIsIHNldHRpbmcgc2Nyb2xsYmFyIHRoaWNrbmVzcyB0bzogJWQgcGl4ZWxzICglZC8lZClcblxuIiwgc2IsIHcwLCBoMSk7Ci0rCQkJCQotKwkJCQlYdFVubWFuYWdlQ2hpbGQod3YpOwotKwkJCQlYdFVubWFuYWdlQ2hpbGQod2gpOwotKwkJCQlYdFVubWFuYWdlQ2hpbGQod2MpOwotKwotKwkJCQlYdFZhU2V0VmFsdWVzKHd2LCBYdE53aWR0aCwgIHNiLCBYdE54LCB4MCArICh3MCAtIHNiKSwgTlVMTCk7Ci0rCQkJCVh0VmFTZXRWYWx1ZXMod2gsIFh0TmhlaWdodCwgc2IsIFh0TnksIHkxICsgKGgxIC0gc2IpLCBOVUxMKTsKLSsJCQkJdzIgPSB3MiArICh3MCAtIHNiKTsKLSsJCQkJaDIgPSBoMiArIChoMSAtIHNiKTsKLSsJCQkJaWYgKHcyID4gMTAgJiYgaDIgPiAxMCkgewotKwkJCQkJWHRWYVNldFZhbHVlcyh3YywgWHROd2lkdGgsIHcyLCBYdE5oZWlnaHQsIGgyLCBOVUxMKTsKLSsJCQkJfQotKwotKwkJCQlYdE1hbmFnZUNoaWxkKHd2KTsKLSsJCQkJWHRNYW5hZ2VDaGlsZCh3aCk7Ci0rCQkJCVh0TWFuYWdlQ2hpbGQod2MpOwotKwotKwkJCQlhcHBEYXRhLnNiV2lkdGggPSBzYjsKLSsJCQl9Ci0rCQl9Ci0rCQlsYXN0X3Njcm9sbGJhciA9IGRub3coKTsKLSsJfQotKwkKLSsJaWYgKG5vdyA8PSBsYXN0ICsgMC4yNSkgewotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCWlmIChpbWFnZV9zY2FsZSkgewotKwkJc2NhbGVfY2hlY2tfenJsZSgpOwotKwl9Ci0rCi0rCS8qIGUuZy4geHJhbmRyIHJlc2l6ZSAqLwotKwlkcHlXaWR0aCAgPSBXaWR0aE9mU2NyZWVuKERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSk7Ci0rCWRweUhlaWdodCA9IEhlaWdodE9mU2NyZWVuKERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSk7Ci0rCi0rCWlmIChhcHBEYXRhLnNjYWxlICE9IE5VTEwpIHsKLSsJCXN0YXRpYyBEaW1lbnNpb24gbGFzdF93ID0gMCwgbGFzdF9oID0gMDsKLSsJCXN0YXRpYyBkb3VibGUgbGFzdF9yZXNpemUgPSAwLjA7Ci0rCQlEaW1lbnNpb24gdywgaDsKLSsJCWlmIChsYXN0X3cgPT0gMCkgewotKwkJCVh0VmFHZXRWYWx1ZXModG9wbGV2ZWwsIFh0TndpZHRoLCAmbGFzdF93LCBYdE5oZWlnaHQsICZsYXN0X2gsIE5VTEwpOwotKwkJCWxhc3RfcmVzaXplID0gbm93OwotKwkJfQotKwkJaWYgKG5vdyA8IGxhc3RfcmVzaXplICsgMC41KSB7Ci0rCQkJOwotKwkJfSBlbHNlIGlmIChhcHBEYXRhLmZ1bGxTY3JlZW4pIHsKLSsJCQk7Ci0rCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXBwRGF0YS5zY2FsZSwgImF1dG8iKSkgewotKwkJCVh0VmFHZXRWYWx1ZXModG9wbGV2ZWwsIFh0TndpZHRoLCAmdywgWHROaGVpZ2h0LCAmaCwgTlVMTCk7Ci0rCQkJaWYgKHcgPCAzMiB8fCBoIDwgMzIpICB7Ci0rCQkJCTsKLSsJCQl9IGVsc2UgaWYgKGxhc3RfdyAhPSB3IHx8IGxhc3RfaCAhPSBoKSB7Ci0rCQkJCVdpbmRvdyByciwgY3IsIHIgPSBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpOwotKwkJCQlpbnQgcngsIHJ5LCB3eCwgd3k7Ci0rCQkJCXVuc2lnbmVkIGludCBtYXNrOwotKwkJCQkvKiBtYWtlIHN1cmUgbW91c2UgYnV0dG9ucyBub3QgcHJlc3NlZCAqLwotKwkJCQlpZiAoWFF1ZXJ5UG9pbnRlcihkcHksIHIsICZyciwgJmNyLCAmcngsICZyeSwgJnd4LCAmd3ksICZtYXNrKSkgewotKwkJCQkJaWYgKG1hc2sgPT0gMCkgewotKwkJCQkJCXJlc2NhbGVfaW1hZ2UoKTsKLSsJCQkJCQlsYXN0X3cgPSB3OwotKwkJCQkJCWxhc3RfaCA9IGg7Ci0rCQkJCQkJbGFzdF9yZXNpemUgPSBkbm93KCk7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsJCQl9Ci0rCQl9Ci0rCX0KLSsKLSsJbGFzdCA9IGRub3coKTsKLSt9Ci0gCi0gLyoKLSAgKiBEZXNrdG9wSW5pdEFmdGVyUmVhbGl6YXRpb24gZG9lcyB0aGluZ3Mgd2hpY2ggcmVxdWlyZSB0aGUgWCB3aW5kb3dzIHRvCi0gICogZXhpc3QuICBJdCBjcmVhdGVzIHNvbWUgR0NzIGFuZCBzZXRzIHRoZSBkb3QgY3Vyc29yLgotICAqLwotIAotK3ZvaWQgWGN1cnNvcnMoaW50IHNldCkgewotKwlpZiAoZG90Q3Vyc29yMyA9PSBOb25lKSB7Ci0rCQlkb3RDdXJzb3IzID0gQ3JlYXRlRG90Q3Vyc29yKDMpOwotKwl9Ci0rCWlmIChkb3RDdXJzb3I0ID09IE5vbmUpIHsKLSsJCWRvdEN1cnNvcjQgPSBDcmVhdGVEb3RDdXJzb3IoNCk7Ci0rCX0KLSsJaWYgKHNldCkgewotKwkJWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLSsJCXVuc2lnbmVkIGxvbmcgdmFsdWVtYXNrID0gMDsKLSsKLSsJCWlmICghYXBwRGF0YS51c2VYMTFDdXJzb3IpIHsKLSsJCQlpZiAoYXBwRGF0YS52aWV3T25seSkgewotKwkJCQlhdHRyLmN1cnNvciA9IGRvdEN1cnNvcjQ7ICAgIAotKwkJCX0gZWxzZSB7Ci0rCQkJCWF0dHIuY3Vyc29yID0gZG90Q3Vyc29yMzsgICAgCi0rCQkJfQotKwkJCXZhbHVlbWFzayB8PSBDV0N1cnNvcjsKLSsJCQlYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhkcHksIGRlc2t0b3BXaW4sIHZhbHVlbWFzaywgJmF0dHIpOwotKwkJfQotKwl9Ci0rfQotKwotIHZvaWQKLSBEZXNrdG9wSW5pdEFmdGVyUmVhbGl6YXRpb24oKQotIHsKLS0gIFhHQ1ZhbHVlcyBnY3Y7Ci0tICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwotLSAgdW5zaWduZWQgbG9uZyB2YWx1ZW1hc2s7Ci0tCi0tICBkZXNrdG9wV2luID0gWHRXaW5kb3coZGVza3RvcCk7Ci0tCi0tICBnYyA9IFhDcmVhdGVHQyhkcHksZGVza3RvcFdpbiwwLE5VTEwpOwotLQotLSAgZ2N2LmZ1bmN0aW9uID0gR1h4b3I7Ci0tICBnY3YuZm9yZWdyb3VuZCA9IDB4MGYwZjBmMGY7Ci0tICBzcmNHQyA9IFhDcmVhdGVHQyhkcHksZGVza3RvcFdpbixHQ0Z1bmN0aW9ufEdDRm9yZWdyb3VuZCwmZ2N2KTsKLS0gIGdjdi5mb3JlZ3JvdW5kID0gMHhmMGYwZjBmMDsKLS0gIGRzdEdDID0gWENyZWF0ZUdDKGRweSxkZXNrdG9wV2luLEdDRnVuY3Rpb258R0NGb3JlZ3JvdW5kLCZnY3YpOwotLQotLSAgWHRBZGRDb252ZXJ0ZXIoWHRSU3RyaW5nLCBYdFJCYWNraW5nU3RvcmUsIFhtdUN2dFN0cmluZ1RvQmFja2luZ1N0b3JlLAotLQkJIE5VTEwsIDApOwotLQotLSAgWHRWYUdldEFwcGxpY2F0aW9uUmVzb3VyY2VzKGRlc2t0b3AsIChYdFBvaW50ZXIpJmF0dHIuYmFja2luZ19zdG9yZSwKLS0JCQkgICAgICBkZXNrdG9wQmFja2luZ1N0b3JlUmVzb3VyY2VzLCAxLCBOVUxMKTsKLS0gIHZhbHVlbWFzayA9IENXQmFja2luZ1N0b3JlOwotLQotLSAgaWYgKCFhcHBEYXRhLnVzZVgxMUN1cnNvcikgewotLSAgICBkb3RDdXJzb3IgPSBDcmVhdGVEb3RDdXJzb3IoKTsKLS0gICAgYXR0ci5jdXJzb3IgPSBkb3RDdXJzb3I7ICAgIAotLSAgICB2YWx1ZW1hc2sgfD0gQ1dDdXJzb3I7Ci0tICB9Ci0rCVhHQ1ZhbHVlcyBnY3Y7Ci0rCVhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0rCVhXaW5kb3dBdHRyaWJ1dGVzIGdhdHRyOwotKwl1bnNpZ25lZCBsb25nIHZhbHVlbWFzayA9IDA7Ci0rCi0rCWRlc2t0b3BXaW4gPSBYdFdpbmRvdyhkZXNrdG9wKTsKLSsKLSsJZ2MgPSBYQ3JlYXRlR0MoZHB5LGRlc2t0b3BXaW4sMCxOVUxMKTsKLSsKLSsJZ2N2LmZ1bmN0aW9uID0gR1h4b3I7Ci0rCWdjdi5mb3JlZ3JvdW5kID0gMHgwZjBmMGYwZjsKLSsJc3JjR0MgPSBYQ3JlYXRlR0MoZHB5LGRlc2t0b3BXaW4sR0NGdW5jdGlvbnxHQ0ZvcmVncm91bmQsJmdjdik7Ci0rCWdjdi5mb3JlZ3JvdW5kID0gMHhmMGYwZjBmMDsKLSsJZHN0R0MgPSBYQ3JlYXRlR0MoZHB5LGRlc2t0b3BXaW4sR0NGdW5jdGlvbnxHQ0ZvcmVncm91bmQsJmdjdik7Ci0rCi0rCVh0QWRkQ29udmVydGVyKFh0UlN0cmluZywgWHRSQmFja2luZ1N0b3JlLCBYbXVDdnRTdHJpbmdUb0JhY2tpbmdTdG9yZSwKLSsJICAgIE5VTEwsIDApOwotKwotKwlpZiAoYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7Ci0rCQlTY3JlZW4gKnMgPSBEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KGRweSk7Ci0rCQlpZiAoRG9lc0JhY2tpbmdTdG9yZShzKSAhPSBBbHdheXMpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlggc2VydmVyIGRvZXMgbm90IGRvIGJhY2tpbmdzdG9yZSwgZGlzYWJsaW5nIGl0LlxuIik7Ci0rCQkJYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlID0gRmFsc2U7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKGFwcERhdGEudXNlWHNlcnZlckJhY2tpbmdTdG9yZSkgewotKwkJWHRWYUdldEFwcGxpY2F0aW9uUmVzb3VyY2VzKGRlc2t0b3AsIChYdFBvaW50ZXIpJmF0dHIuYmFja2luZ19zdG9yZSwKLSsJCSAgICBkZXNrdG9wQmFja2luZ1N0b3JlUmVzb3VyY2VzLCAxLCBOVUxMKTsKLSsJCXZhbHVlbWFzayB8PSBDV0JhY2tpbmdTdG9yZTsKLSsJfSBlbHNlIHsKLSsJCWF0dHIuYmFja2dyb3VuZF9waXhlbCA9IEJsYWNrUGl4ZWwoZHB5LCBEZWZhdWx0U2NyZWVuKGRweSkpOwotKwkJdmFsdWVtYXNrIHw9IENXQmFja1BpeGVsOwotKwl9Ci0rCi0rCVhjdXJzb3JzKDApOwotKwlpZiAoIWFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQlpZiAoYXBwRGF0YS52aWV3T25seSkgewotKwkJCWF0dHIuY3Vyc29yID0gZG90Q3Vyc29yNDsgICAgCi0rCQl9IGVsc2UgewotKwkJCWF0dHIuY3Vyc29yID0gZG90Q3Vyc29yMzsgICAgCi0rCQl9Ci0rCQl2YWx1ZW1hc2sgfD0gQ1dDdXJzb3I7Ci0rCX0KLSsJYm9nb0N1cnNvciA9IFhDcmVhdGVGb250Q3Vyc29yKGRweSwgWENfYm9nb3NpdHkpOwotKwl3YWl0Q3Vyc29yID0gWENyZWF0ZUZvbnRDdXJzb3IoZHB5LCBYQ193YXRjaCk7Ci0rCi0rCVhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKGRweSwgZGVza3RvcFdpbiwgdmFsdWVtYXNrLCAmYXR0cik7Ci0rCi0rCWlmIChYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIGRlc2t0b3BXaW4sICZnYXR0cikpIHsKLSsjaWYgMAotKwkJZnByaW50ZihzdGRlcnIsICJkZXNrdG9wV2luIGJhY2tpbmdzdG9yZTogJWQgc2F2ZV91bmRlcjogJWRcbiIsIGdhdHRyLmJhY2tpbmdfc3RvcmUsIGdhdHRyLnNhdmVfdW5kZXIpOwotKyNlbmRpZgotKwl9Ci0rCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSt9Ci0rCi0rZXh0ZXJuIHZvaWQgRnJlZVgxMUN1cnNvcih2b2lkKTsKLStleHRlcm4gdm9pZCBGcmVlU29mdEN1cnNvcih2b2lkKTsKLSAKLS0gIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKGRweSwgZGVza3RvcFdpbiwgdmFsdWVtYXNrLCAmYXR0cik7Ci0rdm9pZAotK0Rlc2t0b3BDdXJzb3JPZmYoKQotK3sKLSsJaWYgKGRvdEN1cnNvcjMgPT0gTm9uZSkgewotKwkJZG90Q3Vyc29yMyA9IENyZWF0ZURvdEN1cnNvcigzKTsKLSsJCWRvdEN1cnNvcjQgPSBDcmVhdGVEb3RDdXJzb3IoNCk7Ci0rCX0KLSsJaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCVhEZWZpbmVDdXJzb3IoZHB5LCBkZXNrdG9wV2luLCBkb3RDdXJzb3I0KTsKLSsJfSBlbHNlIHsKLSsJCVhEZWZpbmVDdXJzb3IoZHB5LCBkZXNrdG9wV2luLCBkb3RDdXJzb3IzKTsKLSsJfQotKwlGcmVlWDExQ3Vyc29yKCk7Ci0rCUZyZWVTb2Z0Q3Vyc29yKCk7Ci0rfQotKwotKwotKyNkZWZpbmUgQ0VJTCh4KSAgKCAoZG91YmxlKSAoKGludCkgKHgpKSA9PSAoeCkgPyBcCi0rCShkb3VibGUpICgoaW50KSAoeCkpIDogKGRvdWJsZSkgKChpbnQpICh4KSArIDEpICkKLSsjZGVmaW5lIEZMT09SKHgpICggKGRvdWJsZSkgKChpbnQpICh4KSkgKQotKwotKyNpZiAwCi0rc3RhdGljIGludCBuZml4KGludCBpLCBpbnQgbikgewotKwlpZiAoaSA8IDApIHsKLSsJCWkgPSAwOwotKwl9IGVsc2UgaWYgKGkgPj0gbikgewotKwkJaSA9IG4gLSAxOwotKwl9Ci0rCXJldHVybiBpOwotIH0KLSsjZWxzZQotKyNkZWZpbmUgbmZpeChpLCBuKSAoIGkgPCAwID8gMCA6ICggKGkgPj0gbikgPyAobiAtIDEpIDogaSAgKSApCi0rI2VuZGlmCi0rCi0raW50IHNjYWxlX3JvdW5kKGludCBsZW4sIGRvdWJsZSBmYWMpIHsKLSsgICAgICAgIGRvdWJsZSBlcHMgPSAwLjAwMDAwMTsKLSsKLSsgICAgICAgIGxlbiA9IChpbnQpIChsZW4gKiBmYWMgKyBlcHMpOwotKyAgICAgICAgaWYgKGxlbiA8IDEpIHsKLSsgICAgICAgICAgICAgICAgbGVuID0gMTsKLSsgICAgICAgIH0KLSsgICAgICAgIHJldHVybiBsZW47Ci0rfQotKwotK3N0YXRpYyB2b2lkIHNjYWxlX3JlY3QoZG91YmxlIGZhY3Rvcl94LCBkb3VibGUgZmFjdG9yX3ksIGludCBibGVuZCwgaW50IGludGVycG9sYXRlLAotKyAgICBpbnQgKnB4LCBpbnQgKnB5LCBpbnQgKnB3LCBpbnQgKnBoLCBpbnQgc29saWQpIHsKLSsKLSsJaW50IGksIGosIGkxLCBpMiwgajEsIGoyOyAgICAgICAvKiBpbmRpY2VzIGZvciBzY2FsZWQgZmIgKGRlc3QpICovCi0rCWludCBJLCBKLCBJMSwgSTIsIEoxLCBKMjsgICAgICAgLyogaW5kaWNlcyBmb3IgbWFpbiBmYiAgIChzb3VyY2UpICovCi0rCi0rCWRvdWJsZSB3LCB3eCwgd3ksIHd0b3Q7IC8qIHBpeGVsIHdlaWdodHMgKi8KLSsKLSsJZG91YmxlIHgxID0gMCwgeTEsIHgyID0gMCwgeTI7ICAvKiB4LXkgY29vcmRzIGZvciBkZXN0aW5hdGlvbiBwaXhlbHMgZWRnZXMgKi8KLSsJZG91YmxlIGR4LCBkeTsgICAgICAgICAgLyogc2l6ZSBvZiBkZXN0aW5hdGlvbiBwaXhlbCAqLwotKwlkb3VibGUgZGR4PTAsIGRkeT0wOyAgICAvKiBmb3IgaW50ZXJwb2xhdGlvbiBleHBhbnNpb24gKi8KLSsKLSsJY2hhciAqc3JjLCAqZGVzdDsgICAgICAgLyogcG9pbnRlcnMgdG8gdGhlIHR3byBmcmFtZWJ1ZmZlcnMgKi8KLSsKLSsJdW5zaWduZWQgc2hvcnQgdXMgPSAwOwotKwl1bnNpZ25lZCBjaGFyICB1YyA9IDA7Ci0rCXVuc2lnbmVkIGludCAgIHVpID0gMDsKLSsKLSsJaW50IHVzZV9ub2JsZW5kX3Nob3J0Y3V0ID0gMTsKLSsJaW50IHNocmluazsgICAgICAgICAgICAgLyogd2hldGhlciBzaHJpbmtpbmcgb3IgZXhwYW5kaW5nICovCi0rCXN0YXRpYyBpbnQgY29uc3RhbnRfd2VpZ2h0cyA9IC0xLCBtYWdfaW50ID0gLTE7Ci0rCXN0YXRpYyBpbnQgbGFzdF9OeCA9IC0xLCBsYXN0X055ID0gLTEsIGNudCA9IDA7Ci0rCXN0YXRpYyBkb3VibGUgbGFzdF9mYWN0b3IgPSAtMS4wOwotKwlpbnQgYiwgazsKLSsJZG91YmxlIHBpeGF2ZVs0XTsgICAgICAgLyogZm9yIGF2ZXJhZ2luZyBwaXhlbCB2YWx1ZXMgKi8KLSsKLSsJLyogaW50ZXJuYWwgKi8KLSsKLSsJaW50IFgxLCBYMiwgWTEsIFkyOwotIAotKwlpbnQgTnggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwlpbnQgTnkgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJaW50IG54ID0gc2NhbGVfcm91bmQoTngsIGZhY3Rvcl94KTsKLSsJaW50IG55ID0gc2NhbGVfcm91bmQoTnksIGZhY3Rvcl95KTsKLSsKLSsJaW50IEJwcCA9IGltYWdlLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0rCWludCBkc3RfYnl0ZXNfcGVyX2xpbmUgPSBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0rCWludCBzcmNfYnl0ZXNfcGVyX2xpbmUgPSBpbWFnZV9zY2FsZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0rCi0rCXVuc2lnbmVkIGxvbmcgbWFpbl9yZWRfbWFzayA9IGltYWdlLT5yZWRfbWFzazsKLSsJdW5zaWduZWQgbG9uZyBtYWluX2dyZWVuX21hc2sgPSBpbWFnZS0+Z3JlZW5fbWFzazsKLSsJdW5zaWduZWQgbG9uZyBtYWluX2JsdWVfbWFzayA9IGltYWdlLT5ibHVlX21hc2s7Ci0rCWludCBtYXJrID0gMTsKLSsKLSsJY2hhciAqc3JjX2ZiID0gaW1hZ2Vfc2NhbGUtPmRhdGE7Ci0rCWNoYXIgKmRzdF9mYiA9IGltYWdlLT5kYXRhOwotKwotKwlzdGF0aWMgaW50IG5vc29saWQgPSAtMTsKLSsJaW50IHNiZHkgPSAzOwotKwlkb3VibGUgZm1heCA9IGZhY3Rvcl94ID4gZmFjdG9yX3kgPyBmYWN0b3JfeCA6IGZhY3Rvcl95OwotKyNpZiAwCi0rCWRvdWJsZSBmbWluID0gZmFjdG9yX3ggPCBmYWN0b3JfeSA/IGZhY3Rvcl94IDogZmFjdG9yX3k7Ci0rI2VuZGlmCi0rCi0rCVgxID0gKnB4OwotKwlYMiA9ICpweCArICpwdzsKLSsJWTEgPSAqcHk7Ci0rCVkyID0gKnB5ICsgKnBoOwotKwotKwlpZiAoZm1heCA+IDEuMCkgewotKwkJLyogdHJ5IHRvIGF2b2lkIHByb2JsZW1zIHdpdGggYmxlZWRpbmcuLi4gKi8KLSsJCXNiZHkgPSAoaW50KSAoMi4wICogZm1heCAqIHNiZHkpOwotKwl9Ci0rCi0rCS8qIGZwcmludGYoc3RkZXJyLCAic2NhbGVfcmVjdDogJWR4JWQrJWQrJWRcbiIsICpwdywgKnBoLCAqcHgsICpweSk7ICovCi0rCi0rCSpweCA9IChpbnQpICgqcHggKiBmYWN0b3JfeCk7Ci0rCSpweSA9IChpbnQpICgqcHkgKiBmYWN0b3JfeSk7Ci0rCSpwdyA9IHNjYWxlX3JvdW5kKCpwdywgZmFjdG9yX3gpOwotKwkqcGggPSBzY2FsZV9yb3VuZCgqcGgsIGZhY3Rvcl95KTsKLSsKLSsJaWYgKG5vc29saWQgPCAwKSB7Ci0rCQlpZiAoZ2V0ZW52KCJTU1ZOQ19OT1NPTElEIikpIHsKLSsJCQlub3NvbGlkID0gMTsKLSsJCX0gZWxzZSB7Ci0rCQkJbm9zb2xpZCA9IDA7Ci0rCQl9Ci0rCX0KLSsJaWYgKG5vc29saWQpIHNvbGlkID0gMDsKLSsKLSsjZGVmaW5lIHJmYkxvZyBwcmludGYKLSsvKiBCZWdpbiB0YWtlbiBmcm9tIHgxMXZuYyBzY2FsZTogKi8KLSsKLSsJaWYgKGZhY3Rvcl94IDw9IDEuMCB8fCBmYWN0b3JfeSA8PSAxLjApIHsKLSsJCXNocmluayA9IDE7Ci0rCX0gZWxzZSB7Ci0rCQlzaHJpbmsgPSAwOwotKwkJaW50ZXJwb2xhdGUgPSAxOwotKwl9Ci0rCi0rCS8qCi0rCSAqIE4uQi4gd2lkdGggYW5kIGhlaWdodCAocmVhbCBudW1iZXJzKSBvZiBhIHNjYWxlZCBwaXhlbC4KLSsJICogYm90aCBhcmUgPiAxICAgKGUuZy4gMS4zMzMgZm9yIC1zY2FsZSAzLzQpCi0rCSAqIHRoZXkgc2hvdWxkIGFsc28gYmUgZXF1YWwgYnV0IHdlIGRvbid0IGFzc3VtZSBpdC4KLSsJICoKLSsJICogVGhpcyBuZXcgd2F5IGlzIHByb2JhYmx5IHRoZSBiZXN0IHdlIGNhbiBkbywgdGFrZSB0aGUgaW52ZXJzZQotKwkgKiBvZiB0aGUgc2NhbGluZyBmYWN0b3IgdG8gZG91YmxlIHByZWNpc2lvbi4KLSsJICovCi0rCWR4ID0gMS4wL2ZhY3Rvcl94OwotKwlkeSA9IDEuMC9mYWN0b3JfeTsKLSsKLSsJLyoKLSsJICogVGhlcmUgaXMgc29tZSBzcGVlZHVwIGlmIHRoZSBwaXhlbCB3ZWlnaHRzIGFyZSBjb25zdGFudCwgc28KLSsJICogbGV0J3Mgc3BlY2lhbCBjYXNlIHRoZXNlLgotKwkgKgotKwkgKiBJZiBzY2FsZSA9IDEvbiBhbmQgbiBkaXZpZGVzIE54IGFuZCBOeSwgdGhlIHBpeGVsIHdlaWdodHMKLSsJICogYXJlIGNvbnN0YW50IChlLmcuIDEvMiA9PiBlcXVhbCBvbiAyeDIgc3F1YXJlKS4KLSsJICovCi0rCWlmIChmYWN0b3JfeCAhPSBsYXN0X2ZhY3RvciB8fCBOeCAhPSBsYXN0X054IHx8IE55ICE9IGxhc3RfTnkpIHsKLSsJCWNvbnN0YW50X3dlaWdodHMgPSAtMTsKLSsJCW1hZ19pbnQgPSAtMTsKLSsJCWxhc3RfTnggPSBOeDsKLSsJCWxhc3RfTnkgPSBOeTsKLSsJCWxhc3RfZmFjdG9yID0gZmFjdG9yX3g7Ci0rCX0KLSsKLSsJaWYgKGNvbnN0YW50X3dlaWdodHMgPCAwICYmIGZhY3Rvcl94ICE9IGZhY3Rvcl95KSB7Ci0rCQljb25zdGFudF93ZWlnaHRzID0gMDsKLSsJCW1hZ19pbnQgPSAwOwotKwl9IGVsc2UgaWYgKGNvbnN0YW50X3dlaWdodHMgPCAwKSB7Ci0rCQlpbnQgbiA9IDA7Ci0rCQlkb3VibGUgZmFjdG9yID0gZmFjdG9yX3g7Ci0rCi0rCQljb25zdGFudF93ZWlnaHRzID0gMDsKLSsJCW1hZ19pbnQgPSAwOwotKwotKwkJZm9yIChpID0gMjsgaTw9MTI4OyBpKyspIHsKLSsJCQlkb3VibGUgdGVzdCA9ICgoZG91YmxlKSAxKS8gaTsKLSsJCQlkb3VibGUgZGlmZiwgZXBzID0gMS4wZS03OwotKwkJCWRpZmYgPSBmYWN0b3IgLSB0ZXN0OwotKwkJCWlmICgtZXBzIDwgZGlmZiAmJiBkaWZmIDwgZXBzKSB7Ci0rCQkJCW4gPSBpOwotKwkJCQlicmVhazsKLSsJCQl9Ci0rCQl9Ci0rCQlpZiAoISBibGVuZCB8fCAhIHNocmluayB8fCBpbnRlcnBvbGF0ZSkgewotKwkJCTsKLSsJCX0gZWxzZSBpZiAobiAhPSAwKSB7Ci0rCQkJaWYgKE54ICUgbiA9PSAwICYmIE55ICUgbiA9PSAwKSB7Ci0rCQkJCXN0YXRpYyBpbnQgZGlkbXNnID0gMDsKLSsJCQkJaWYgKG1hcmsgJiYgISBkaWRtc2cpIHsKLSsJCQkJCWRpZG1zZyA9IDE7Ci0rCQkJCQlyZmJMb2coInNjYWxlX2FuZF9tYXJrX3JlY3Q6IHVzaW5nICIKLSsJCQkJCSAgICAiY29uc3RhbnQgcGl4ZWwgd2VpZ2h0IHNwZWVkdXAgIgotKwkJCQkJICAgICJmb3IgMS8lZFxuIiwgbik7Ci0rCQkJCX0KLSsJCQkJY29uc3RhbnRfd2VpZ2h0cyA9IDE7Ci0rCQkJfQotKwkJfQotKwotKwkJbiA9IDA7Ci0rCQlmb3IgKGkgPSAyOyBpPD0zMjsgaSsrKSB7Ci0rCQkJZG91YmxlIHRlc3QgPSAoZG91YmxlKSBpOwotKwkJCWRvdWJsZSBkaWZmLCBlcHMgPSAxLjBlLTc7Ci0rCQkJZGlmZiA9IGZhY3RvciAtIHRlc3Q7Ci0rCQkJaWYgKC1lcHMgPCBkaWZmICYmIGRpZmYgPCBlcHMpIHsKLSsJCQkJbiA9IGk7Ci0rCQkJCWJyZWFrOwotKwkJCX0KLSsJCX0KLSsJCWlmICghIGJsZW5kICYmIGZhY3RvciA+IDEuMCAmJiBuKSB7Ci0rCQkJbWFnX2ludCA9IG47Ci0rCQl9Ci0rCX0KLStpZiAoMCkgZnByaW50ZihzdGRlcnIsICJYMTogJWQgWTE6ICVkIFgyOiAlZCBZMjogJWRcbiIsIFgxLCBZMSwgWDIsIFkyKTsKLSsKLSsJaWYgKG1hcmsgJiYgIXNocmluayAmJiBibGVuZCkgewotKwkJLyoKLSsJCSAqIGtsdWRnZTogY29ycmVjdCBmb3IgaW50ZXJwb2xhdGluZyBibHVycmluZyBsZWFraW5nCi0rCQkgKiB1cCBvciBsZWZ0IDEgZGVzdGluYXRpb24gcGl4ZWwuCi0rCQkgKi8KLSsJCWlmIChYMSA+IDApIFgxLS07Ci0rCQlpZiAoWTEgPiAwKSBZMS0tOwotKwl9Ci0rCi0rCS8qCi0rCSAqIGZpbmQgdGhlIGV4dGVudCBvZiB0aGUgY2hhbmdlIHRoZSBpbnB1dCByZWN0YW5nbGUgaW5kdWNlcyBpbgotKwkgKiB0aGUgc2NhbGVkIGZyYW1lYnVmZmVyLgotKwkgKi8KLSsKLSsJLyogTGVmdCBlZGdlczogZmluZCBsYXJnZXN0IGkgc3VjaCB0aGF0IGkgKiBkeCA8PSBYMSAgKi8KLSsJaTEgPSBGTE9PUihYMS9keCk7Ci0rCi0rCS8qIFJpZ2h0IGVkZ2VzOiBmaW5kIHNtYWxsZXN0IGkgc3VjaCB0aGF0IChpKzEpICogZHggPj0gWDIrMSAgKi8KLSsJaTIgPSBDRUlMKCAoWDIrMSkvZHggKSAtIDE7Ci0rCi0rCS8qIFRvIGJlIHNhZmUsIGNvcnJlY3QgYW55IG92ZXJmbG93czogKi8KLSsJaTEgPSBuZml4KGkxLCBueCk7Ci0rCWkyID0gbmZpeChpMiwgbngpICsgMTsJLyogYWRkIDEgdG8gbWFrZSBhIHJlY3RhbmdsZSB1cHBlciBib3VuZGFyeSAqLwotKwotKwkvKiBSZXBlYXQgYWJvdmUgZm9yIHkgZGlyZWN0aW9uOiAqLwotKwlqMSA9IEZMT09SKFkxL2R5KTsKLSsJajIgPSBDRUlMKCAoWTIrMSkvZHkgKSAtIDE7Ci0rCi0rCWoxID0gbmZpeChqMSwgbnkpOwotKwlqMiA9IG5maXgoajIsIG55KSArIDE7Ci0rCi0rCS8qCi0rCSAqIHNwZWNpYWwgY2FzZSBpbnRlZ2VyIG1hZ25pZmljYXRpb24gd2l0aCBubyBibGVuZGluZy4KLSsJICogdmlzaW9uIGltcGFpcmVkIG1hZ25pZmljYXRpb24gdXNhZ2UgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIGNhc2UuCi0rCSAqLwotKwlpZiAobWFyayAmJiAhIGJsZW5kICYmIG1hZ19pbnQgJiYgQnBwICE9IDMpIHsKLSsJCWludCBqbWluLCBqbWF4LCBpbWluLCBpbWF4OwotKwotKwkJLyogb3V0ZXIgbG9vcCBvdmVyICpzb3VyY2UqIHBpeGVscyAqLwotKwkJZm9yIChKPVkxOyBKIDwgWTI7IEorKykgewotKwkJICAgIGptaW4gPSBKICogbWFnX2ludDsKLSsJCSAgICBqbWF4ID0gam1pbiArIG1hZ19pbnQ7Ci0rCQkgICAgZm9yIChJPVgxOyBJIDwgWDI7IEkrKykgewotKwkJCS8qIGV4dHJhY3QgdmFsdWUgKi8KLSsJCQlzcmMgPSBzcmNfZmIgKyBKKnNyY19ieXRlc19wZXJfbGluZSArIEkqQnBwOwotKwkJCWlmIChCcHAgPT0gNCkgewotKwkJCQl1aSA9ICooKHVuc2lnbmVkIGludCAqKXNyYyk7Ci0rCQkJfSBlbHNlIGlmIChCcHAgPT0gMikgewotKwkJCQl1cyA9ICooKHVuc2lnbmVkIHNob3J0ICopc3JjKTsKLSsJCQl9IGVsc2UgaWYgKEJwcCA9PSAxKSB7Ci0rCQkJCXVjID0gKigodW5zaWduZWQgY2hhciAqKXNyYyk7Ci0rCQkJfQotKwkJCWltaW4gPSBJICogbWFnX2ludDsKLSsJCQlpbWF4ID0gaW1pbiArIG1hZ19pbnQ7Ci0rCQkJLyogaW5uZXIgbG9vcCBvdmVyICpkZXN0KiBwaXhlbHMgKi8KLSsJCQlmb3IgKGo9am1pbjsgajxqbWF4OyBqKyspIHsKLSsJCQkgICAgZGVzdCA9IGRzdF9mYiArIGoqZHN0X2J5dGVzX3Blcl9saW5lICsgaW1pbipCcHA7Ci0rCQkJICAgIGZvciAoaT1pbWluOyBpPGltYXg7IGkrKykgewotKwkJCQlpZiAoQnBwID09IDQpIHsKLSsJCQkJCSooKHVuc2lnbmVkIGludCAqKWRlc3QpID0gdWk7Ci0rCQkJCX0gZWxzZSBpZiAoQnBwID09IDIpIHsKLSsJCQkJCSooKHVuc2lnbmVkIHNob3J0ICopZGVzdCkgPSB1czsKLSsJCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotKwkJCQkJKigodW5zaWduZWQgY2hhciAqKWRlc3QpID0gdWM7Ci0rCQkJCX0KLSsJCQkJZGVzdCArPSBCcHA7Ci0rCQkJICAgIH0KLSsJCQl9Ci0rCQkgICAgfQotKwkJfQotKwkJZ290byBtYXJraXQ7Ci0rCX0KLSsKLSsJLyogc2V0IHRoZXNlIGFsbCB0byAxLjAgdG8gYmVnaW4gd2l0aCAqLwotKwl3eCA9IDEuMDsKLSsJd3kgPSAxLjA7Ci0rCXcgID0gMS4wOwotKwotKwkvKgotKwkgKiBMb29wIG92ZXIgZGVzdGluYXRpb24gcGl4ZWxzIGluIHNjYWxlZCBmYjoKLSsJICovCi0rCWZvciAoaj1qMTsgajxqMjsgaisrKSB7Ci0rCQlpbnQgamJkeSA9IDEsIEkxX3NvbGlkID0gMDsKLSsKLSsJCXkxID0gIGogKiBkeTsJLyogdG9wIGVkZ2UgKi8KLSsJCWlmICh5MSA+IE55IC0gMSkgewotKwkJCS8qIGNhbiBnbyBvdmVyIHdpdGggZHkgPSAxL3NjYWxlX2ZhYyAqLwotKwkJCXkxID0gTnkgLSAxOwotKwkJfQotKwkJeTIgPSB5MSArIGR5OwkvKiBib3R0b20gZWRnZSAqLwotKwotKwkJLyogRmluZCBtYWluIGZiIGluZGljZXMgY292ZXJlZCBieSB0aGlzIGRlc3QgcGl4ZWw6ICovCi0rCQlKMSA9IChpbnQpIEZMT09SKHkxKTsKLSsJCUoxID0gbmZpeChKMSwgTnkpOwotKwotKwkJaWYgKHNocmluayAmJiAhIGludGVycG9sYXRlKSB7Ci0rCQkJSjIgPSAoaW50KSBDRUlMKHkyKSAtIDE7Ci0rCQkJSjIgPSBuZml4KEoyLCBOeSk7Ci0rCQl9IGVsc2UgewotKwkJCUoyID0gSjEgKyAxOwkvKiBzaW1wbGUgaW50ZXJwb2xhdGlvbiAqLwotKwkJCWRkeSA9IHkxIC0gSjE7Ci0rCQl9Ci0rCi0rCQkvKiBkZXN0aW5hdGlvbiBjaGFyKiBwb2ludGVyOiAqLwotKwkJZGVzdCA9IGRzdF9mYiArIGoqZHN0X2J5dGVzX3Blcl9saW5lICsgaTEqQnBwOwotKwotKwkJaWYgKHNvbGlkKSB7Ci0rCQkJaWYgKGoxK3NiZHkgPD0gaiAmJiBqIDwgajItc2JkeSkgewotKwkJCQlqYmR5ID0gMDsKLSsJCQkJeDEgPSAoaTErc2JkeSkgKiBkeDsKLSsJCQkJaWYgKHgxID4gTnggLSAxKSB7Ci0rCQkJCQl4MSA9IE54IC0gMTsKLSsJCQkJfQotKwkJCQlJMV9zb2xpZCA9IChpbnQpIEZMT09SKHgxKTsKLSsJCQkJaWYgKEkxX3NvbGlkID49IE54KSBJMV9zb2xpZCA9IE54IC0gMTsKLSsJCQl9Ci0rCQl9Ci0rCQkKLSsJCWZvciAoaT1pMTsgaTxpMjsgaSsrKSB7Ci0rCQkJaW50IHNvbGlkX3NraXAgPSAwOwotKwotKwkJCWlmIChzb2xpZCkgewotKwkJCQkvKiBpZiB0aGUgcmVnaW9uIGlzIHNvbGlkLCB3ZSBjYW4gdXNlIHRoZSBub2JsZW5kIHNwZWVkdXAgKi8KLSsJCQkJaWYgKCFqYmR5ICYmIGkxK3NiZHkgPD0gaSAmJiBpIDwgaTItc2JkeSkgewotKwkJCQkJc29saWRfc2tpcCA9IDE7Ci0rCQkJCQkvKiBwaXhlbHMgYWxsIHRoZSBzYW1lIHNvIHVzZSBYMTogKi8KLSsJCQkJCUkxID0gSTFfc29saWQ7Ci0rCQkJCQlnb3RvIGpzb2xpZDsKLSsJCQkJfQotKwkJCX0KLSsKLSsJCQl4MSA9ICBpICogZHg7CS8qIGxlZnQgZWRnZSAqLwotKwkJCWlmICh4MSA+IE54IC0gMSkgewotKwkJCQkvKiBjYW4gZ28gb3ZlciB3aXRoIGR4ID0gMS9zY2FsZV9mYWMgKi8KLSsJCQkJeDEgPSBOeCAtIDE7Ci0rCQkJfQotKwkJCXgyID0geDEgKyBkeDsJLyogcmlnaHQgZWRnZSAqLwotKwotKwkJCS8qIEZpbmQgbWFpbiBmYiBpbmRpY2VzIGNvdmVyZWQgYnkgdGhpcyBkZXN0IHBpeGVsOiAqLwotKwkJCUkxID0gKGludCkgRkxPT1IoeDEpOwotKwkJCWlmIChJMSA+PSBOeCkgSTEgPSBOeCAtIDE7Ci0rCi0rCQkJanNvbGlkOgotKwkJCWNudCsrOwotKwotKwkJCWlmICgoIWJsZW5kICYmIHVzZV9ub2JsZW5kX3Nob3J0Y3V0KSB8fCBzb2xpZF9za2lwKSB7Ci0rCQkJCS8qCi0rCQkJCSAqIFRoZSBub2JsZW5kIGNhc2UgaW52b2x2ZXMgbm8gd2VpZ2h0cywKLSsJCQkJICogYW5kIDEgcGl4ZWwsIHNvIGp1c3QgY29weSB0aGUgdmFsdWUKLSsJCQkJICogZGlyZWN0bHkuCi0rCQkJCSAqLwotKwkJCQlzcmMgPSBzcmNfZmIgKyBKMSpzcmNfYnl0ZXNfcGVyX2xpbmUgKyBJMSpCcHA7Ci0rCQkJCWlmIChCcHAgPT0gNCkgewotKwkJCQkJKigodW5zaWduZWQgaW50ICopZGVzdCkKLSsJCQkJCSAgICA9ICooKHVuc2lnbmVkIGludCAqKXNyYyk7Ci0rCQkJCX0gZWxzZSBpZiAoQnBwID09IDIpIHsKLSsJCQkJCSooKHVuc2lnbmVkIHNob3J0ICopZGVzdCkKLSsJCQkJCSAgICA9ICooKHVuc2lnbmVkIHNob3J0ICopc3JjKTsKLSsJCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotKwkJCQkJKihkZXN0KSA9ICooc3JjKTsKLSsJCQkJfSBlbHNlIGlmIChCcHAgPT0gMykgewotKwkJCQkJLyogcmFyZSBjYXNlICovCi0rCQkJCQlmb3IgKGs9MDsgazw9MjsgaysrKSB7Ci0rCQkJCQkJKihkZXN0K2spID0gKihzcmMrayk7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsJCQkJZGVzdCArPSBCcHA7Ci0rCQkJCWNvbnRpbnVlOwotKwkJCX0KLSsJCQkKLSsJCQlpZiAoc2hyaW5rICYmICEgaW50ZXJwb2xhdGUpIHsKLSsJCQkJSTIgPSAoaW50KSBDRUlMKHgyKSAtIDE7Ci0rCQkJCWlmIChJMiA+PSBOeCkgSTIgPSBOeCAtIDE7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJSTIgPSBJMSArIDE7CS8qIHNpbXBsZSBpbnRlcnBvbGF0aW9uICovCi0rCQkJCWRkeCA9IHgxIC0gSTE7Ci0rCQkJfQotKyNpZiAwCi0raWYgKGZpcnN0KSBmcHJpbnRmKHN0ZGVyciwgIiAgSTE9JWQgSTI9JWQgSjE9JWQgSjI9JWRcbiIsIEkxLCBJMiwgSjEsIEoyKTsKLSsjZW5kaWYKLSsKLSsJCQkvKiBaZXJvIG91dCBhY2N1bXVsYXRvcnMgZm9yIG5leHQgcGl4ZWwgYXZlcmFnZTogKi8KLSsJCQlmb3IgKGI9MDsgYjw0OyBiKyspIHsKLSsJCQkJcGl4YXZlW2JdID0gMC4wOyAvKiBmb3IgUkdCIHdlaWdodGVkIHN1bXMgKi8KLSsJCQl9Ci0rCi0rCQkJLyoKLSsJCQkgKiB3dG90IGlzIGZvciBhY2N1bXVsYXRpbmcgdGhlIHRvdGFsIHdlaWdodC4KLSsJCQkgKiBJdCBzaG91bGQgYWx3YXlzIHN1bSB0byAxLyhzY2FsZV9mYWMgKiBzY2FsZV9mYWMpLgotKwkJCSAqLwotKwkJCXd0b3QgPSAwLjA7Ci0rCi0rCQkJLyoKLSsJCQkgKiBMb29wIG92ZXIgc291cmNlIHBpeGVscyBjb3ZlcmVkIGJ5IHRoaXMgZGVzdCBwaXhlbC4KLSsJCQkgKiAKLSsJCQkgKiBUaGVzZSAiZXh0cmEiIGxvb3BzIG92ZXIgIkoiIGFuZCAiSSIgbWFrZQotKwkJCSAqIHRoZSBjYWNoZS9jYWNoZWxpbmUgcGVyZm9ybWFuY2UgdW5jbGVhci4KLSsJCQkgKiBGb3IgZXhhbXBsZSwgd2lsbCB0aGUgZGF0YSBicm91Z2h0IGluIGZyb20KLSsJCQkgKiBzcmMgZm9yIGosIGksIGFuZCBKPTAgc3RpbGwgYmUgaW4gdGhlIGNhY2hlCi0rCQkJICogYWZ0ZXIgdGhlIEogPiAwIGRhdGEgaGF2ZSBiZWVuIGFjY2Vzc2VkIGFuZAotKwkJCSAqIHdlIGFyZSBhdCBqLCBpKzEsIEo9MD8gIFRoZSBzdHJpZGUgaW4gSiBpcwotKwkJCSAqIG1haW5fYnl0ZXNfcGVyX2xpbmUsIGFuZCBzbyB+NCBLQi4KLSsJCQkgKgotKwkJCSAqIFR5cGljYWwgY2FzZSB3aGVuIHNocmlua2luZyBhcmUgMngyIGxvb3AsIHNvCi0rCQkJICoganVzdCB0d28gbGluZXMgdG8gd29ycnkgYWJvdXQuCi0rCQkJICovCi0rCQkJZm9yIChKPUoxOyBKPD1KMjsgSisrKSB7Ci0rCQkJICAgIC8qIHNlZSBjb21tZW50cyBmb3IgSSwgeDEsIHgyLCBldGMuIGJlbG93ICovCi0rCQkJICAgIGlmIChjb25zdGFudF93ZWlnaHRzKSB7Ci0rCQkJCTsKLSsJCQkgICAgfSBlbHNlIGlmICghIGJsZW5kKSB7Ci0rCQkJCWlmIChKICE9IEoxKSB7Ci0rCQkJCQljb250aW51ZTsKLSsJCQkJfQotKwkJCQl3eSA9IDEuMDsKLSsKLSsJCQkJLyogaW50ZXJwb2xhdGlvbiBzY2hlbWU6ICovCi0rCQkJICAgIH0gZWxzZSBpZiAoISBzaHJpbmsgfHwgaW50ZXJwb2xhdGUpIHsKLSsJCQkJaWYgKEogPj0gTnkpIHsKLSsJCQkJCWNvbnRpbnVlOwotKwkJCQl9IGVsc2UgaWYgKEogPT0gSjEpIHsKLSsJCQkJCXd5ID0gMS4wIC0gZGR5OwotKwkJCQl9IGVsc2UgaWYgKEogIT0gSjEpIHsKLSsJCQkJCXd5ID0gZGR5OwotKwkJCQl9Ci0rCi0rCQkJCS8qIGludGVncmF0aW9uIHNjaGVtZTogKi8KLSsJCQkgICAgfSBlbHNlIGlmIChKIDwgeTEpIHsKLSsJCQkJd3kgPSBKKzEgLSB5MTsKLSsJCQkgICAgfSBlbHNlIGlmIChKKzEgPiB5MikgewotKwkJCQl3eSA9IHkyIC0gSjsKLSsJCQkgICAgfSBlbHNlIHsKLSsJCQkJd3kgPSAxLjA7Ci0rCQkJICAgIH0KLSsKLSsJCQkgICAgc3JjID0gc3JjX2ZiICsgSipzcmNfYnl0ZXNfcGVyX2xpbmUgKyBJMSpCcHA7Ci0rCi0rCQkJICAgIGZvciAoST1JMTsgSTw9STI7IEkrKykgewotKwotKwkJCQkvKiBXb3JrIG91dCB0aGUgd2VpZ2h0OiAqLwotKwotKwkJCQlpZiAoY29uc3RhbnRfd2VpZ2h0cykgewotKwkJCQkJOwotKwkJCQl9IGVsc2UgaWYgKCEgYmxlbmQpIHsKLSsJCQkJCS8qCi0rCQkJCQkgKiBVZ2gsIFBzZXVkb0NvbG9yIGNvbG9ybWFwIGlzCi0rCQkJCQkgKiBiYWQgbmV3cywgdG8gYXZvaWQgcmFuZG9tCi0rCQkJCQkgKiBjb2xvcnMganVzdCB0YWtlIHRoZSBmaXJzdAotKwkJCQkJICogcGl4ZWwuICBPciB1c2VyIG1heSBoYXZlCi0rCQkJCQkgKiBzcGVjaWZpZWQgOm5iIHRvIGZyYWN0aW9uLgotKwkJCQkJICogVGhlIDpmYiB3aWxsIGZvcmNlIGJsZW5kaW5nCi0rCQkJCQkgKiBmb3IgdGhpcyBjYXNlLgotKwkJCQkJICovCi0rCQkJCQlpZiAoSSAhPSBJMSkgewotKwkJCQkJCWNvbnRpbnVlOwotKwkJCQkJfQotKwkJCQkJd3ggPSAxLjA7Ci0rCi0rCQkJCQkvKiBpbnRlcnBvbGF0aW9uIHNjaGVtZTogKi8KLSsJCQkJfSBlbHNlIGlmICghIHNocmluayB8fCBpbnRlcnBvbGF0ZSkgewotKwkJCQkJaWYgKEkgPj0gTngpIHsKLSsJCQkJCQljb250aW51ZTsJLyogb2ZmIGVkZ2UgKi8KLSsJCQkJCX0gZWxzZSBpZiAoSSA9PSBJMSkgewotKwkJCQkJCXd4ID0gMS4wIC0gZGR4OwotKwkJCQkJfSBlbHNlIGlmIChJICE9IEkxKSB7Ci0rCQkJCQkJd3ggPSBkZHg7Ci0rCQkJCQl9Ci0rCi0rCQkJCQkvKiBpbnRlZ3JhdGlvbiBzY2hlbWU6ICovCi0rCQkJCX0gZWxzZSBpZiAoSSA8IHgxKSB7Ci0rCQkJCQkvKiAKLSsJCQkJCSAqIHNvdXJjZSBsZWZ0IGVkZ2UgKEkpIHRvIHRoZQotKwkJCQkJICogbGVmdCBvZiBkZXN0IGxlZnQgZWRnZSAoeDEpOgotKwkJCQkJICogZnJhY3Rpb25hbCB3ZWlnaHQKLSsJCQkJCSAqLwotKwkJCQkJd3ggPSBJKzEgLSB4MTsKLSsJCQkJfSBlbHNlIGlmIChJKzEgPiB4MikgewotKwkJCQkJLyogCi0rCQkJCQkgKiBzb3VyY2UgcmlnaHQgZWRnZSAoSSsxKSB0byB0aGUKLSsJCQkJCSAqIHJpZ2h0IG9mIGRlc3QgcmlnaHQgZWRnZSAoeDIpOgotKwkJCQkJICogZnJhY3Rpb25hbCB3ZWlnaHQKLSsJCQkJCSAqLwotKwkJCQkJd3ggPSB4MiAtIEk7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQkvKiAKLSsJCQkJCSAqIHNvdXJjZSBlZGdlcyAoSSBhbmQgSSsxKSBjb21wbGV0ZWx5Ci0rCQkJCQkgKiBpbnNpZGUgZGVzdCBlZGdlcyAoeDEgYW5kIHgyKToKLSsJCQkJCSAqIGZ1bGwgd2VpZ2h0Ci0rCQkJCQkgKi8KLSsJCQkJCXd4ID0gMS4wOwotKwkJCQl9Ci0rCi0rCQkJCXcgPSB3eCAqIHd5OwotKwkJCQl3dG90ICs9IHc7Ci0rCi0rCQkJCS8qIAotKwkJCQkgKiBXZSBhdmVyYWdlIHRoZSB1bnNpZ25lZCBjaGFyIHZhbHVlCi0rCQkJCSAqIGluc3RlYWQgb2YgY2hhciB2YWx1ZTogb3RoZXJ3aXNlCi0rCQkJCSAqIHRoZSBtaW5pbXVtIChjaGFyIDApIGlzIHJpZ2h0IG5leHQKLSsJCQkJICogdG8gdGhlIG1heGltdW0gKGNoYXIgLTEpISAgVGhpcyB3YXkKLSsJCQkJICogdGhleSBhcmUgc3ByZWFkIGJldHdlZW4gMCBhbmQgMjU1LgotKwkJCQkgKi8KLSsJCQkJaWYgKEJwcCA9PSA0KSB7Ci0rCQkJCQkvKiB1bnJvbGwgdGhlIGxvb3BzLCBjYW4gZ2l2ZSAyMCUgKi8KLSsJCQkJCXBpeGF2ZVswXSArPSB3ICogKCh1bnNpZ25lZCBjaGFyKSAqKHNyYyAgKSk7Ci0rCQkJCQlwaXhhdmVbMV0gKz0gdyAqICgodW5zaWduZWQgY2hhcikgKihzcmMrMSkpOwotKwkJCQkJcGl4YXZlWzJdICs9IHcgKiAoKHVuc2lnbmVkIGNoYXIpICooc3JjKzIpKTsKLSsJCQkJCXBpeGF2ZVszXSArPSB3ICogKCh1bnNpZ25lZCBjaGFyKSAqKHNyYyszKSk7Ci0rCQkJCX0gZWxzZSBpZiAoQnBwID09IDIpIHsKLSsJCQkJCS8qCi0rCQkJCQkgKiAxNmJwcDogdHJpY2tpZXIgd2l0aCBncmVlbgotKwkJCQkJICogc3BsaXQgb3ZlciB0d28gYnl0ZXMsIHNvIHdlCi0rCQkJCQkgKiB1c2UgdGhlIG1hc2tzOgotKwkJCQkJICovCi0rCQkJCQl1cyA9ICooKHVuc2lnbmVkIHNob3J0ICopIHNyYyk7Ci0rCQkJCQlwaXhhdmVbMF0gKz0gdyoodXMgJiBtYWluX3JlZF9tYXNrKTsKLSsJCQkJCXBpeGF2ZVsxXSArPSB3Kih1cyAmIG1haW5fZ3JlZW5fbWFzayk7Ci0rCQkJCQlwaXhhdmVbMl0gKz0gdyoodXMgJiBtYWluX2JsdWVfbWFzayk7Ci0rCQkJCX0gZWxzZSBpZiAoQnBwID09IDEpIHsKLSsJCQkJCXBpeGF2ZVswXSArPSB3ICoKLSsJCQkJCSAgICAoKHVuc2lnbmVkIGNoYXIpICooc3JjKSk7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlmb3IgKGI9MDsgYjxCcHA7IGIrKykgewotKwkJCQkJCXBpeGF2ZVtiXSArPSB3ICoKLSsJCQkJCQkgICAgKCh1bnNpZ25lZCBjaGFyKSAqKHNyYytiKSk7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsJCQkJc3JjICs9IEJwcDsKLSsJCQkgICAgfQotKwkJCX0KLSsKLSsJCQlpZiAod3RvdCA8PSAwLjApIHsKLSsJCQkJd3RvdCA9IDEuMDsKLSsJCQl9Ci0rCQkJd3RvdCA9IDEuMC93dG90OwkvKiBub3JtYWxpemF0aW9uIGZhY3RvciAqLwotKwotKwkJCS8qIHBsYWNlIHdlaWdodGVkIGF2ZXJhZ2UgcGl4ZWwgaW4gdGhlIHNjYWxlZCBmYjogKi8KLSsJCQlpZiAoQnBwID09IDQpIHsKLSsJCQkJKihkZXN0ICApID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzBdKTsKLSsJCQkJKihkZXN0KzEpID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzFdKTsKLSsJCQkJKihkZXN0KzIpID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzJdKTsKLSsJCQkJKihkZXN0KzMpID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzNdKTsKLSsJCQl9IGVsc2UgaWYgKEJwcCA9PSAyKSB7Ci0rCQkJCS8qIDE2YnBwIC8gNTY1IGNhc2U6ICovCi0rCQkJCXBpeGF2ZVswXSAqPSB3dG90OwotKwkJCQlwaXhhdmVbMV0gKj0gd3RvdDsKLSsJCQkJcGl4YXZlWzJdICo9IHd0b3Q7Ci0rCQkJCXVzID0gIChtYWluX3JlZF9tYXNrICAgJiAoaW50KSBwaXhhdmVbMF0pCi0rCQkJCSAgICB8IChtYWluX2dyZWVuX21hc2sgJiAoaW50KSBwaXhhdmVbMV0pCi0rCQkJCSAgICB8IChtYWluX2JsdWVfbWFzayAgJiAoaW50KSBwaXhhdmVbMl0pOwotKwkJCQkqKCAodW5zaWduZWQgc2hvcnQgKikgZGVzdCApID0gdXM7Ci0rCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotKwkJCQkqKGRlc3QpID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzBdKTsKLSsJCQl9IGVsc2UgewotKwkJCQlmb3IgKGI9MDsgYjxCcHA7IGIrKykgewotKwkJCQkJKihkZXN0K2IpID0gKGNoYXIpICh3dG90ICogcGl4YXZlW2JdKTsKLSsJCQkJfQotKwkJCX0KLSsJCQlkZXN0ICs9IEJwcDsKLSsJCX0KLSsJfQotKwltYXJraXQ6Ci0rLyogRW5kIHRha2VuIGZyb20geDExdm5jIHNjYWxlOiAqLwotKwlpZiAoMCkge30KLSt9Ci0rCi0rdm9pZCBkb19zY2FsZV9zdGF0cyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSsJc3RhdGljIGRvdWJsZSBjYWxscyA9IDAuMCwgc3VtID0gMC4wLCB2YXIgPSAwLjAsIGxhc3QgPSAwLjA7Ci0rCWRvdWJsZSBBID0gd2lkdGggKiBoZWlnaHQ7Ci0rCi0rCWlmIChsYXN0ID09IDAuMCkgewotKwkJbGFzdCA9IGRub3coKTsKLSsJfQotKwotKwljYWxscyArPSAxLjA7Ci0rCXN1bSArPSBBOwotKwl2YXIgKz0gQSpBOwotKwotKwlpZiAoZG5vdygpID4gbGFzdCArIDQuMCkgewotKwkJZG91YmxlIGNudCA9IGNhbGxzOwotKwkJaWYgKGNudCA8PSAwLjApIGNudCA9IDEuMDsKLSsJCXZhciAvPSBjbnQ7Ci0rCQlzdW0gLz0gY250OwotKwkJdmFyID0gdmFyIC0gc3VtICogc3VtOwotKwkJaWYgKHN1bSA+IDAuMCkgewotKwkJCXZhciA9IHZhciAvIChzdW0qc3VtKTsKLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAic2NhbGVfcmVjdCBzdGF0czogJTEwZCAlMTAuMWYgYXZlOiAlMTAuM2YgdmFyLXJhdDogJTEwLjNmXG4iLCAoaW50KSBjYWxscywgc3VtICogY250LCBzdW0sIHZhcik7IAotKwotKwkJY2FsbHMgPSAwLjA7Ci0rCQlzdW0gPSAwLjA7Ci0rCQl2YXIgPSAwLjA7Ci0rCQlsYXN0ID0gZG5vdygpOwotKwl9Ci0rfQotKwotK3ZvaWQgcHV0X2ltYWdlKGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgZHN0X3gsIGludCBkc3RfeSwgaW50IHdpZHRoLAotKyAgICBpbnQgaGVpZ2h0LCBpbnQgc29saWQpIHsKLSsJaW50IGRiID0gMDsKLSsJaW50IHhtYXggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwlpbnQgeW1heCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwotK2lmIChkYiB8fCAwKSBmcHJpbnRmKHN0ZGVyciwgInB1dF9pbWFnZSglZCAlZCAlZCAlZCAlZCAlZClcbiIsIHNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LCB3aWR0aCwgaGVpZ2h0KTsKLSsKLSsJaWYgKGltYWdlX3NjYWxlKSB7Ci0rCQlpbnQgaTsKLSsJCXN0YXRpYyBpbnQgc2NhbGVfc3RhdHMgPSAtMTsKLSsKLSsJCWZvciAoaT0wOyBpIDwgMjsgaSsrKSB7Ci0rCQkJaWYgKHNyY194ID4gMCkgc3JjX3gtLTsKLSsJCQlpZiAoc3JjX3kgPiAwKSBzcmNfeS0tOwotKwkJfQotKwkJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKLSsJCQlpZiAoc3JjX3ggKyB3aWR0aCAgPCB4bWF4KSB3aWR0aCsrOwotKwkJCWlmIChzcmNfeSArIGhlaWdodCA8IHltYXgpIGhlaWdodCsrOwotKwkJfQotKwotKwkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInB1dF9pbWFnZSglZCAlZCAlZCAlZCAlZCAlZClcbiIsIHNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LCB3aWR0aCwgaGVpZ2h0KTsKLSsJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzY2FsZV9yZWN0KCVkICVkICVkICVkKVxuIiwgc3JjX3gsIHNyY195LCB3aWR0aCwgaGVpZ2h0KTsKLSsKLSsJCWlmIChzY2FsZV9zdGF0cyA8IDApIHsKLSsJCQlpZiAoZ2V0ZW52KCJTU1ZOQ19TQ0FMRV9TVEFUUyIpKSB7Ci0rCQkJCXNjYWxlX3N0YXRzID0gMTsKLSsJCQl9IGVsc2UgewotKwkJCQlzY2FsZV9zdGF0cyA9IDA7Ci0rCQkJfQotKwkJfQotKwkJaWYgKHNjYWxlX3N0YXRzKSB7Ci0rCQkJZG9fc2NhbGVfc3RhdHMod2lkdGgsIGhlaWdodCk7Ci0rCQl9Ci0rCi0rCQlzY2FsZV9yZWN0KHNjYWxlX2ZhY3Rvcl94LCBzY2FsZV9mYWN0b3JfeSwgMSwgMCwgJnNyY194LCAmc3JjX3ksICZ3aWR0aCwgJmhlaWdodCwgc29saWQpOwotKwkJZHN0X3ggPSBzcmNfeDsKLSsJCWRzdF95ID0gc3JjX3k7Ci0rCX0KLSsJCi0rI2lmZGVmIE1JVFNITQotKwlpZiAoYXBwRGF0YS51c2VTaG0pIHsKLSsJCWRvdWJsZSBmYWMgPSBpbWFnZV9zY2FsZSA/IHNjYWxlX2ZhY3Rvcl95IDogMS4wOwotKwkJaWYgKGltYWdlX3ljcm9wID09IE5VTEwpIHsKLSsJCQlpZiAoaW1hZ2VfaXNfc2htKSB7Ci0rCQkJCVhTaG1QdXRJbWFnZShkcHksIGRlc2t0b3BXaW4sIGdjLCBpbWFnZSwgc3JjX3gsIHNyY195LAotKwkJCQkgICAgZHN0X3gsIGRzdF95LCB3aWR0aCwgaGVpZ2h0LCBGYWxzZSk7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJWFB1dEltYWdlKGRweSwgZGVza3RvcFdpbiwgZ2MsIGltYWdlLCBzcmNfeCwgc3JjX3ksCi0rCQkJCSAgICBkc3RfeCwgZHN0X3ksIHdpZHRoLCBoZWlnaHQpOwotKwkJCX0KLSsJCX0gZWxzZSBpZiAoKHdpZHRoIDwgMzIgJiYgaGVpZ2h0IDwgMzIpIHx8IGhlaWdodCA+IGFwcERhdGEueUNyb3AgKiBmYWMpIHsKLSsJCQlYUHV0SW1hZ2UoZHB5LCBkZXNrdG9wV2luLCBnYywgaW1hZ2UsIHNyY194LCBzcmNfeSwKLSsJCQkgICAgZHN0X3gsIGRzdF95LCB3aWR0aCwgaGVpZ2h0KTsKLSsJCX0gZWxzZSB7Ci0rCQkJY2hhciAqc3JjLCAqZHN0OwotKwkJCWludCBCcHAgPSBpbWFnZS0+Yml0c19wZXJfcGl4ZWwgLyA4OwotKwkJCWludCBCcGwgID0gaW1hZ2UtPmJ5dGVzX3Blcl9saW5lLCBoOwotKwkJCWludCBCcGwyID0gaW1hZ2VfeWNyb3AtPmJ5dGVzX3Blcl9saW5lOwotKwkJCXNyYyA9IGltYWdlLT5kYXRhICsgc3JjX3kgKiBCcGwgKyBzcmNfeCAqIEJwcDsKLSsJCQlkc3QgPSBpbWFnZV95Y3JvcC0+ZGF0YTsKLSsJCQlmb3IgKGggPSAwOyBoIDwgaGVpZ2h0OyBoKyspIHsKLSsJCQkJbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAqIEJwcCk7Ci0rCQkJCXNyYyArPSBCcGw7Ci0rCQkJCWRzdCArPSBCcGwyOwotKwkJCX0KLSsJCQlYU2htUHV0SW1hZ2UoZHB5LCBkZXNrdG9wV2luLCBnYywgaW1hZ2VfeWNyb3AsIDAsIDAsCi0rCQkJICAgIGRzdF94LCBkc3RfeSwgd2lkdGgsIGhlaWdodCwgRmFsc2UpOwotKwkJfQotKwl9IGVsc2UKLSsjZW5kaWYKLSsJewotKwkJWFB1dEltYWdlKGRweSwgZGVza3RvcFdpbiwgZ2MsIGltYWdlLCBzcmNfeCwgc3JjX3ksCi0rCQkgICBkc3RfeCwgZHN0X3ksIHdpZHRoLCBoZWlnaHQpOwotKwl9Ci0rfQotKwotKyNpZiAwCi0rZnByaW50ZihzdGRlcnIsICJub24tc2htQiBpbWFnZSAlZCAlZCAlZCAlZCAlZCAlZFxuIiwgc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIHdpZHRoLCBoZWlnaHQpOwotK2ZwcmludGYoc3RkZXJyLCAic2htIGltYWdlX3ljcm9wICVkICVkICVkICVkICVkICVkXG4iLCAwLCAwLCBkc3RfeCwgZHN0X3ksIHdpZHRoLCBoZWlnaHQpOwotK2ZwcmludGYoc3RkZXJyLCAibm9uLXNobUEgaW1hZ2UgJWQgJWQgJWQgJWQgJWQgJWRcbiIsIHNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LCB3aWR0aCwgaGVpZ2h0KTsKLSsjZW5kaWYKLSsKLSt2b2lkIHJlbGVhc2VBbGxQcmVzc2VkTW9kaWZpZXJzKHZvaWQpIHsKLSsJaW50IGk7Ci0rCXN0YXRpYyBpbnQgZGVidWdfcmVsZWFzZSA9IC0xOwotKwlpZiAoZGVidWdfcmVsZWFzZSA8IDApIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX0RFQlVHX1JFTEVBU0UiKSkgewotKwkJCWRlYnVnX3JlbGVhc2UgPSAxOwotKwkJfSBlbHNlIHsKLSsJCQlkZWJ1Z19yZWxlYXNlID0gMDsKLSsJCX0KLSsJfQotKwlpZiAoZGVidWdfcmVsZWFzZSkgZnByaW50ZihzdGRlcnIsICJpbnRvIHJlbGVhc2VBbGxQcmVzc2VkTW9kaWZpZXJzKClcbiIpOwotKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSsJCWlmIChtb2RpZmllclByZXNzZWRbaV0pIHsKLSsJCQlTZW5kS2V5RXZlbnQoWEtleWNvZGVUb0tleXN5bShkcHksIGksIDApLCBGYWxzZSk7Ci0rCQkJbW9kaWZpZXJQcmVzc2VkW2ldID0gRmFsc2U7Ci0rCQkJaWYgKGRlYnVnX3JlbGVhc2UpIGZwcmludGYoc3RkZXJyLCAicmVsZWFzaW5nWyVkXSAlc1xuIiwgaSwgWEtleXN5bVRvU3RyaW5nKFhLZXljb2RlVG9LZXlzeW0oZHB5LCBpLCAwKSkpOwotKwkJfQotKwl9Ci0rfQotKwotKyNkZWZpbmUgUFJfRVhQT1NFIGZwcmludGYoc3RkZXJyLCAiRXhwb3NlOiAlMDRkeCUwNGQrJTA0ZCslMDRkICUwNGQvJTA0ZC8lMDRkIG5vdzogJTguNGYgcmVzY2FsZTogJTguNGYgZnVsbHNjcmVlbjogJTguNGZcbiIsIHdpZHRoLCBoZWlnaHQsIHgsIHksIHNpLmZyYW1lYnVmZmVyV2lkdGgsIGFwcERhdGEueUNyb3AsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBub3cgLSBzdGFydF90aW1lLCBub3cgLSBsYXN0X3Jlc2NhbGUsIG5vdyAtIGxhc3RfZnVsbHNjcmVlbik7Ci0gCi0gLyoKLSAgKiBIYW5kbGVCYXNpY0Rlc2t0b3BFdmVudCAtIGRlYWwgd2l0aCBleHBvc2UgYW5kIGxlYXZlIGV2ZW50cy4KLUBAIC0xNTIsNDIgKzE1NTMsNTI5IEBACi0gc3RhdGljIHZvaWQKLSBIYW5kbGVCYXNpY0Rlc2t0b3BFdmVudChXaWRnZXQgdywgWHRQb2ludGVyIHB0ciwgWEV2ZW50ICpldiwgQm9vbGVhbiAqY29udCkKLSB7Ci0tICBpbnQgaTsKLSsJaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7Ci0rCWRvdWJsZSBub3cgPSBkbm93KCk7Ci0gCi0tICBzd2l0Y2ggKGV2LT50eXBlKSB7Ci0rCWlmICh3IHx8IHB0ciB8fCBjb250KSB7fQotKwotKwlpZiAoMCkgewotKwkJUFJfRVhQT1NFOwotKwl9Ci0gCi0rCi0rICBzd2l0Y2ggKGV2LT50eXBlKSB7Ci0gICBjYXNlIEV4cG9zZToKLSAgIGNhc2UgR3JhcGhpY3NFeHBvc2U6Ci0gICAgIC8qIHNvbWV0aW1lcyBkdWUgdG8gc2Nyb2xsYmFycyBiZWluZyBhZGRlZC9yZW1vdmVkIHdlIGdldCBhbiBleHBvc2Ugb3V0c2lkZQotICAgICAgICB0aGUgYWN0dWFsIGRlc2t0b3AgYXJlYS4gIE1ha2Ugc3VyZSB3ZSBkb24ndCBwYXNzIGl0IG9uIHRvIHRoZSBSRkIKLSAgICAgICAgc2VydmVyLiAqLwotKwl4ID0gZXYtPnhleHBvc2UueDsKLSsJeSA9IGV2LT54ZXhwb3NlLnk7Ci0rCXdpZHRoICA9IGV2LT54ZXhwb3NlLndpZHRoOwotKwloZWlnaHQgPSBldi0+eGV4cG9zZS5oZWlnaHQ7Ci0rCi0rCWlmIChpbWFnZV9zY2FsZSkgewotKwkJaW50IGk7Ci0rCQl4IC89IHNjYWxlX2ZhY3Rvcl94OwotKwkJeSAvPSBzY2FsZV9mYWN0b3JfeTsKLSsJCXdpZHRoICAvPSBzY2FsZV9mYWN0b3JfeDsKLSsJCWhlaWdodCAvPSBzY2FsZV9mYWN0b3JfeTsKLSsJCS8qIG1ha2UgdGhlbSBhIGxpdHRsZSB3aWRlciB0byBhdm9pZCBwYWludGluZyBlcnJvcnMgKi8KLSsJCWZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0rCQkJaWYgKHggPiAwKSB4LS07Ci0rCQkJaWYgKHkgPiAwKSB5LS07Ci0rCQl9Ci0rCQlmb3IgKGk9MDsgaSA8IDY7IGkrKykgewotKwkJCWlmICh4ICsgd2lkdGggIDwgc2kuZnJhbWVidWZmZXJXaWR0aCkgICB3aWR0aCsrOwotKwkJCWlmICh5ICsgaGVpZ2h0IDwgc2kuZnJhbWVidWZmZXJIZWlnaHQpICBoZWlnaHQrKzsKLSsJCX0KLSsJfQotIAotLSAgICBpZiAoZXYtPnhleHBvc2UueCArIGV2LT54ZXhwb3NlLndpZHRoID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgewotLSAgICAgIGV2LT54ZXhwb3NlLndpZHRoID0gc2kuZnJhbWVidWZmZXJXaWR0aCAtIGV2LT54ZXhwb3NlLng7Ci0tICAgICAgaWYgKGV2LT54ZXhwb3NlLndpZHRoIDw9IDApIGJyZWFrOwotLSAgICB9Ci0tCi0tICAgIGlmIChldi0+eGV4cG9zZS55ICsgZXYtPnhleHBvc2UuaGVpZ2h0ID4gc2kuZnJhbWVidWZmZXJIZWlnaHQpIHsKLS0gICAgICBldi0+eGV4cG9zZS5oZWlnaHQgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIGV2LT54ZXhwb3NlLnk7Ci0tICAgICAgaWYgKGV2LT54ZXhwb3NlLmhlaWdodCA8PSAwKSBicmVhazsKLS0gICAgfQotLQotLSAgICBTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KGV2LT54ZXhwb3NlLngsIGV2LT54ZXhwb3NlLnksCi0tCQkJCSBldi0+eGV4cG9zZS53aWR0aCwgZXYtPnhleHBvc2UuaGVpZ2h0LCBGYWxzZSk7Ci0tICAgIGJyZWFrOwotKwlpZiAoeCArIHdpZHRoID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgewotKwkJd2lkdGggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0geDsKLSsJCWlmICh3aWR0aCA8PSAwKSB7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKHkgKyBoZWlnaHQgPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJaGVpZ2h0ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQgLSB5OwotKwkJaWYgKGhlaWdodCA8PSAwKSB7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKGFwcERhdGEudXNlWHNlcnZlckJhY2tpbmdTdG9yZSkgewotKwkJU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBGYWxzZSk7Ci0rCX0gZWxzZSB7Ci0rCQlpbnQgb2sgPSAxOwotKwkJZG91YmxlIGRlbGF5ID0gMi41OwotKwkJaWYgKGFwcERhdGEuZnVsbFNjcmVlbiAmJiBub3cgPCBsYXN0X2Z1bGxzY3JlZW4gKyBkZWxheSkgewotKwkJCWludCB4bWF4ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCQlpbnQgeW1heCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJCWlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJCQl5bWF4ID0gYXBwRGF0YS55Q3JvcDsKLSsJCQl9Ci0rCQkJeG1heCA9IHNjYWxlX3JvdW5kKHhtYXgsIHNjYWxlX2ZhY3Rvcl94KTsKLSsJCQl5bWF4ID0gc2NhbGVfcm91bmQoeW1heCwgc2NhbGVfZmFjdG9yX3kpOwotKwkJCWlmIChkcHlXaWR0aCA8IHhtYXgpIHsKLSsJCQkJeG1heCA9IGRweVdpZHRoOwotKwkJCX0KLSsJCQlpZiAoZHB5SGVpZ2h0IDwgeW1heCkgewotKwkJCQl5bWF4ID0gZHB5SGVpZ2h0OwotKwkJCX0KLSsJCQlpZiAoeCAhPSAwICYmIHkgIT0gMCkgewotKwkJCQlvayA9IDA7Ci0rCQkJfQotKwkJCWlmICh3aWR0aCA8IDAuOSAqIHhtYXgpIHsKLSsJCQkJb2sgPSAwOwotKwkJCX0KLSsJCQlpZiAoaGVpZ2h0IDwgMC45ICogeW1heCkgewotKwkJCQlvayA9IDA7Ci0rCQkJfQotKwkJfQotKwkJaWYgKGFwcERhdGEueUNyb3AgPiAwKSB7Ci0rCQkJaWYgKG5vdyA8IGxhc3RfZnVsbHNjcmVlbiArIGRlbGF5IHx8IG5vdyA8IGxhc3RfcmVzY2FsZSArIGRlbGF5KSB7Ci0rCQkJCWlmICh5ICsgaGVpZ2h0ID4gYXBwRGF0YS55Q3JvcCkgewotKwkJCQkJaGVpZ2h0ID0gYXBwRGF0YS55Q3JvcCAtIHk7Ci0rCQkJCX0KLSsJCQl9Ci0rCQl9Ci0rCQlpZiAob2spIHsKLSsJCQlwdXRfaW1hZ2UoeCwgeSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMCk7Ci0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCAiU2tpcCAiKTsKLSsJCQlQUl9FWFBPU0U7Ci0rCQl9Ci0rCX0KLSsJYnJlYWs7Ci0gCi0gICBjYXNlIExlYXZlTm90aWZ5OgotLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLS0gICAgICBpZiAobW9kaWZpZXJQcmVzc2VkW2ldKSB7Ci0tCVNlbmRLZXlFdmVudChYS2V5Y29kZVRvS2V5c3ltKGRweSwgaSwgMCksIEZhbHNlKTsKLS0JbW9kaWZpZXJQcmVzc2VkW2ldID0gRmFsc2U7Ci0tICAgICAgfQotLSAgICB9Ci0tICAgIGJyZWFrOwotKwlyZWxlYXNlQWxsUHJlc3NlZE1vZGlmaWVycygpOwotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlmc191bmdyYWIoMSk7Ci0rCX0KLSsJYnJlYWs7Ci0rICBjYXNlIEVudGVyTm90aWZ5OgotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlmc19ncmFiKDEpOwotKwl9Ci0rCWJyZWFrOwotKyAgY2FzZSBDbGllbnRNZXNzYWdlOgotKwlpZiAoZXYtPnhjbGllbnQud2luZG93ID09IFh0V2luZG93KGRlc2t0b3ApICYmIGV2LT54Y2xpZW50Lm1lc3NhZ2VfdHlwZSA9PSBYQV9JTlRFR0VSICYmCi0rCSAgICBldi0+eGNsaWVudC5mb3JtYXQgPT0gOCAmJiAhc3RyY21wKGV2LT54Y2xpZW50LmRhdGEuYiwgIlNlbmRSRkJVcGRhdGUiKSkgewotKwkJU2VuZEluY3JlbWVudGFsRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KCk7Ci0rCX0KLSsJYnJlYWs7Ci0gICB9Ci0rCWNoZWNrX3RoaW5ncygpOwotK30KLSsKLStleHRlcm4gUG9zaXRpb24gZGVza3RvcFgsIGRlc2t0b3BZOwotKwotK3ZvaWQgeDExdm5jX2FwcHNoYXJlKGNoYXIgKmNtZCkgewotKwljaGFyIHNlbmRbMjAwXSwgc3RyWzEwMF07Ci0rCWNoYXIgKmlkID0gImNtZD1pZF9jbWQiOwotKwlpbnQgbV9iaWcgPSA4MCwgbV9maW5lID0gMTU7Ci0rCWludCByZXNpemUgPSAxMDAsIGRiID0gMDsKLSsKLSsJaWYgKGdldGVudigiWDExVk5DX0FQUFNIQVJFX0RFQlVHIikpIHsKLSsJCWRiID0gYXRvaShnZXRlbnYoIlgxMVZOQ19BUFBTSEFSRV9ERUJVRyIpKTsKLSsJfQotKwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAieDExdm5jX2FwcHNoYXJlOiBjbWQ9JXNcbiIsIGNtZCk7Ci0rCi0rCXN0clswXSA9ICdcMCc7Ci0rCi0rCWlmICghc3RyY21wKGNtZCwgImxlZnQiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczptb3ZlOi0lZCswIiwgaWQsIG1fYmlnKTsKLSsJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInJpZ2h0IikpIHsKLSsJCXNwcmludGYoc3RyLCAiJXM6bW92ZTorJWQrMCIsIGlkLCBtX2JpZyk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJ1cCIpKSB7Ci0rCQlzcHJpbnRmKHN0ciwgIiVzOm1vdmU6KzAtJWQiLCBpZCwgbV9iaWcpOwotKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiZG93biIpKSB7Ci0rCQlzcHJpbnRmKHN0ciwgIiVzOm1vdmU6KzArJWQiLCBpZCwgbV9iaWcpOwotKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAibGVmdC1maW5lIikpIHsKLSsJCXNwcmludGYoc3RyLCAiJXM6bW92ZTotJWQrMCIsIGlkLCBtX2ZpbmUpOwotKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicmlnaHQtZmluZSIpKSB7Ci0rCQlzcHJpbnRmKHN0ciwgIiVzOm1vdmU6KyVkKzAiLCBpZCwgbV9maW5lKTsKLSsJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInVwLWZpbmUiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczptb3ZlOiswLSVkIiwgaWQsIG1fZmluZSk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJkb3duLWZpbmUiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczptb3ZlOiswKyVkIiwgaWQsIG1fZmluZSk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJ0YWxsZXIiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczpyZXNpemU6KzArJWQiLCBpZCwgcmVzaXplKTsKLSsJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInNob3J0ZXIiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczpyZXNpemU6KzAtJWQiLCBpZCwgcmVzaXplKTsKLSsJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIndpZGVyIikpIHsKLSsJCXNwcmludGYoc3RyLCAiJXM6cmVzaXplOislZCswIiwgaWQsIHJlc2l6ZSk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJuYXJyb3dlciIpKSB7Ci0rCQlzcHJpbnRmKHN0ciwgIiVzOnJlc2l6ZTotJWQrMCIsIGlkLCByZXNpemUpOwotKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAibG93ZXIiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczpsb3dlciIsIGlkKTsKLSsJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInJhaXNlIikpIHsKLSsJCXNwcmludGYoc3RyLCAiJXM6cmFpc2UiLCBpZCk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJkZWxldGUiKSkgewotKwkJc3ByaW50ZihzdHIsICIlczp3bV9kZWxldGUiLCBpZCk7Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJwb3NpdGlvbiIpKSB7Ci0rCQlQb3NpdGlvbiB4LCB5OwotKwkJaW50IHhpLCB5aTsKLSsKLSsJCVh0VmFHZXRWYWx1ZXModG9wbGV2ZWwsIFh0TngsICZ4LCBYdE55LCAmeSwgTlVMTCk7Ci0rCQl4aSA9IChpbnQpIHg7Ci0rCQl5aSA9IChpbnQpIHk7Ci0rCQlpZiAoYXBwRGF0YS5zY2FsZSkgewotKwkJCWRvdWJsZSBmeCA9IDEuMCwgZnkgPSAxLjA7Ci0rCQkJZ2V0X3NjYWxlX3ZhbHVlcygmZngsICZmeSk7Ci0rCQkJaWYgKGZ4ID4gMC4wICYmIGZ5ID4gMC4wKSB7Ci0rCQkJCXhpIC89IGZ4OwotKwkJCQl5aSAvPSBmeDsKLSsJCQl9Ci0rCQl9Ci0rCQlzcHJpbnRmKHN0ciwgIiVzOmdlb206MHgwKyVkKyVkIiwgaWQsIHhpLCB5aSk7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInN0cj0lc1xuIiwgc3RyKTsKLSsJfQotKwlpZiAoc3RyY21wKHN0ciwgIiIpKSB7Ci0rCQlCb29sIHZvID0gYXBwRGF0YS52aWV3T25seTsKLSsJCXN0cmNweShzZW5kLCAiWDExVk5DX0FQUFNIQVJFX0NNRDoiKTsKLSsJCXN0cmNhdChzZW5kLCBzdHIpOwotKwkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIngxMXZuY19hcHBzaGFyZTogc2VuZD0lc1xuIiwgc2VuZCk7Ci0rCQlpZiAodm8pIGFwcERhdGEudmlld09ubHkgPSBGYWxzZTsKLSsJCVNlbmRDbGllbnRDdXRUZXh0KHNlbmQsIHN0cmxlbihzZW5kKSk7Ci0rCQlpZiAodm8pIGFwcERhdGEudmlld09ubHkgPSBUcnVlOwotKwl9Ci0rfQotKwotK3ZvaWQgc2Nyb2xsX2Rlc2t0b3AoaW50IGhvcml6LCBpbnQgdmVydCwgZG91YmxlIGFtb3VudCkgewotKwlEaW1lbnNpb24gaCwgdzsKLSsJUG9zaXRpb24geCwgeTsKLSsJUG9zaXRpb24geDIsIHkyOwotKwlzdGF0aWMgaW50IGRiID0gLTE7Ci0rCi0rCWlmIChkYiA8IDApIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX0RFQlVHX0VTQ0FQRV9LRVlTIikpIHsKLSsJCQlkYiA9IDE7Ci0rCQl9IGVsc2UgewotKwkJCWRiID0gMDsKLSsJCX0KLSsJfQotKwotKwlYdFZhR2V0VmFsdWVzKGZvcm0sIFh0TmhlaWdodCwgJmgsIFh0TndpZHRoLCAmdywgTlVMTCk7Ci0rCVh0VmFHZXRWYWx1ZXMoZGVza3RvcCwgWHROeCwgJngsIFh0TnksICZ5LCBOVUxMKTsKLSsKLSsJeDIgPSAteDsKLSsJeTIgPSAteTsKLSsKLSsJaWYgKGFtb3VudCA9PSAtMS4wKSB7Ci0rCQlpbnQgZHggPSBob3JpejsKLSsJCWludCBkeSA9IHZlcnQ7Ci0rCQlpZiAoZHggPT0gMCAmJiBkeSA9PSAwKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwkJeDIgLT0gZHg7Ci0rCQl5MiAtPSBkeTsKLSsJfSBlbHNlIHsKLSsJCWlmIChob3JpeikgewotKwkJCWludCBkeCA9IChpbnQpIChhbW91bnQgKiB3KTsKLSsJCQlpZiAoZHggPCAwKSBkeCA9IC1keDsKLSsJCQlpZiAoYW1vdW50ID09IDAuMCkgZHggPSAxOwotKwkJCWlmIChob3JpeiA+IDApIHsKLSsJCQkJeDIgKz0gZHg7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJeDIgLT0gZHg7Ci0rCQkJfQotKwkJCWlmICh4MiA8IDApIHgyID0gMDsKLSsJCX0KLSsJCWlmICh2ZXJ0KSB7Ci0rCQkJaW50IGR5ID0gKGludCkgKGFtb3VudCAqIGgpOwotKwkJCWlmIChhbW91bnQgPT0gMC4wKSBkeSA9IDE7Ci0rCQkJaWYgKGR5IDwgMCkgZHkgPSAtZHk7Ci0rCQkJaWYgKHZlcnQgPCAwKSB7Ci0rCQkJCXkyICs9IGR5OwotKwkJCX0gZWxzZSB7Ci0rCQkJCXkyIC09IGR5OwotKwkJCX0KLSsJCQlpZiAoeTIgPCAwKSB5MiA9IDA7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiVkICVkICVmIHZpZXdwb3J0KCVkeCVkKTogJWQgJWQgLT4gJWQgJWRcbiIsIGhvcml6LCB2ZXJ0LCBhbW91bnQsIHcsIGgsIC14LCAteSwgeDIsIHkyKTsgCi0rCVhhd1ZpZXdwb3J0U2V0Q29vcmRpbmF0ZXModmlld3BvcnQsIHgyLCB5Mik7Ci0rCi0rCWlmIChhcHBEYXRhLmZ1bGxTY3JlZW4pIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJWHRWYUdldFZhbHVlcyhkZXNrdG9wLCBYdE54LCAmeCwgWHROeSwgJnksIE5VTEwpOwotKwkJZGVza3RvcFggPSAteDsKLSsJCWRlc2t0b3BZID0gLXk7Ci0rCX0gZWxzZSBpZiAoYW1vdW50ID09IC0xLjApIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwl9Ci0gfQotIAotK3ZvaWQgc2NhbGVfZGVza3RvcChpbnQgYmlnZ2VyLCBkb3VibGUgZnJhYykgewotKwlkb3VibGUgY3VycmVudCwgbmV3OwotKwljaGFyIHRtcFsxMDBdOwotKwljaGFyICpzOwotKwlpbnQgZnM7Ci0rCi0rCWlmIChhcHBEYXRhLnNjYWxlID09IE5VTEwpIHsKLSsJCXMgPSAiMS4wIjsKLSsJfSBlbHNlIHsKLSsJCXMgPSBhcHBEYXRhLnNjYWxlOwotKwl9Ci0rCWlmICghc3RyY21wKHMsICJhdXRvIikpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAic2NhbGVfZGVza3RvcDogc2tpcHBpbmcgc2NhbGUgbW9kZSAnJXMnXG4iLCBzKTsKLSsJCXJldHVybjsKLSsJfSBlbHNlIGlmICghc3RyY21wKHMsICJmaXQiKSkgewotKwkJZnByaW50ZihzdGRlcnIsICJzY2FsZV9kZXNrdG9wOiBza2lwcGluZyBzY2FsZSBtb2RlICclcydcbiIsIHMpOwotKwkJcmV0dXJuOwotKwl9IGVsc2UgaWYgKHN0cnN0cihzLCAieCIpKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInNjYWxlX2Rlc2t0b3A6IHNraXBwaW5nIHNjYWxlIG1vZGUgJyVzJ1xuIiwgcyk7Ci0rCQlyZXR1cm47Ci0rCX0gZWxzZSBpZiAoIXN0cmNtcChzLCAibm9uZSIpKSB7Ci0rCQlzID0gIjEuMCI7Ci0rCX0KLSsKLSsJaWYgKHNzY2FuZihzLCAiJWxmIiwgJmN1cnJlbnQpICE9IDEpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAic2NhbGVfZGVza3RvcDogc2tpcHBpbmcgc2NhbGUgbW9kZSAnJXMnXG4iLCBzKTsKLSsJCXJldHVybjsKLSsJfQotKwlpZiAoYmlnZ2VyKSB7Ci0rCQluZXcgPSBjdXJyZW50ICogKDEuMCArIGZyYWMpOwotKwl9IGVsc2UgewotKwkJbmV3ID0gY3VycmVudCAvICgxLjAgKyBmcmFjKTsKLSsJfQotKwlpZiAoMC45OSA8IG5ldyAmJiBuZXcgPCAxLjAxKSB7Ci0rCQluZXcgPSAxLjA7Ci0rCX0KLSAKLSsJaWYgKG5ldyA+IDUuMCkgewotKwkJZnByaW50ZihzdGRlcnIsICJzY2FsZV9kZXNrdG9wOiBub3Qgc2NhbGluZyA+IDUuMDogJWZcbiIsIG5ldyk7Ci0rCQlyZXR1cm47Ci0rCX0gZWxzZSBpZiAobmV3IDwgMC4wNSkgewotKwkJZnByaW50ZihzdGRlcnIsICJzY2FsZV9kZXNrdG9wOiBub3Qgc2NhbGluZyA8IDAuMDU6ICVmXG4iLCBuZXcpOwotKwkJcmV0dXJuOwotKwl9Ci0rCXNwcmludGYodG1wLCAiJS4xNmYiLCBuZXcpOwotKwlhcHBEYXRhLnNjYWxlID0gc3RyZHVwKHRtcCk7Ci0rCi0rCWZzID0gMDsKLSsJaWYgKGFwcERhdGEuZnVsbFNjcmVlbikgewotKwkJZnMgPSAxOwotKwkJRnVsbFNjcmVlbk9mZigpOwotKwl9Ci0rCWlmICgxKSB7Ci0rCQlkb3VibGUgZngsIGZ5OwotKwkJZ2V0X3NjYWxlX3ZhbHVlcygmZngsICZmeSk7Ci0rCQlpZiAoZnggPiAwLjAgJiYgZnkgPiAwLjApIHsKLSsJCQlyZXNjYWxlX2ltYWdlKCk7Ci0rCQl9Ci0rCX0KLSsJaWYgKGZzKSB7Ci0rCQlGdWxsU2NyZWVuT24oKTsKLSsJfQotK30KLSsKLStzdGF0aWMgaW50IGVzY2FwZV9tb2RzWzhdOwotK3N0YXRpYyBpbnQgZXNjYXBlX2RyYWdfaW5fcHJvZ3Jlc3MgPSAwLCBsYXN0X3ggPSAwLCBsYXN0X3kgPSAwOwotK3N0YXRpYyBkb3VibGUgbGFzdF9kcmFnID0gMC4wOwotK3N0YXRpYyBkb3VibGUgbGFzdF9rZXkgID0gMC4wOwotKwotK3N0YXRpYyBpbnQgZXNjYXBlX3NlcXVlbmNlX3ByZXNzZWQodm9pZCkgewotKwlzdGF0aWMgY2hhciAqcHJldiA9IE5VTEw7Ci0rCWNoYXIgKnN0ciA9ICJkZWZhdWx0IjsKLSsJaW50IHN1bSwgaSwgaW5pdCA9IDAsIHByZXNzZWQ7Ci0rCXN0YXRpYyBpbnQgZGIgPSAtMTsKLSsKLSsJaWYgKGRiIDwgMCkgewotKwkJaWYgKGdldGVudigiU1NWTkNfREVCVUdfRVNDQVBFX0tFWVMiKSkgewotKwkJCWRiID0gMTsKLSsJCX0gZWxzZSB7Ci0rCQkJZGIgPSAwOwotKwkJfQotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLmVzY2FwZUtleXMgIT0gTlVMTCkgewotKwkJc3RyID0gYXBwRGF0YS5lc2NhcGVLZXlzOwotKwl9Ci0rCWlmIChwcmV2ID09IE5VTEwpIHsKLSsJCWluaXQgPSAxOwotKwkJcHJldiA9IHN0cmR1cChzdHIpOwotKwl9IGVsc2UgewotKwkJaWYgKHN0cmNtcChwcmV2LCBzdHIpKSAJewotKwkJCWluaXQgPSAxOwotKwkJCWZyZWUocHJldik7Ci0rCQkJcHJldiA9IHN0cmR1cChzdHIpOwotKwkJfQotKwl9Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzdHI6ICVzXG4iLCBzdHIpOwotKwotKwlpZiAoaW5pdCkgewotKwkJY2hhciAqcCwgKnM7Ci0rCQlLZXlTeW0ga3M7Ci0rCQlpbnQgayA9IDAsIGZhaWxlZCA9IDA7Ci0rCi0rCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0rCQkJZXNjYXBlX21vZHNbaV0gPSAtMTsKLSsJCX0KLSsKLSsJCWlmICghc3RyY2FzZWNtcChzdHIsICJkZWZhdWx0IikpIHsKLSsjaWYgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKLSsJCQlzID0gc3RyZHVwKCJDb250cm9sX0wsTWV0YV9MIik7Ci0rI2Vsc2UKLSsJCQlzID0gc3RyZHVwKCJBbHRfTCxTdXBlcl9MIik7Ci0rI2VuZGlmCi0rCQl9IGVsc2UgewotKwkJCXMgPSBzdHJkdXAoc3RyKTsKLSsJCX0KLSsJCQotKwkJcCA9IHN0cnRvayhzLCAiLCsgIik7Ci0rCQl3aGlsZSAocCkgewotKwkJCWtzID0gWFN0cmluZ1RvS2V5c3ltKHApOwotKwkJCWlmIChrcyA9PSBYS19TaGlmdF9MIHx8IGtzID09IFhLX1NoaWZ0X1IpIHsKLSsJCQkJcHV0ZW52KCJOT19YMTFWTkNfQVBQU0hBUkU9MSIpOwotKwkJCX0KLSsJCQlpZiAoayA+PSA4KSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiRXNjYXBlS2V5czogbW9yZSB0aGFuIDggbW9kaWZpZXIga2V5cy5cbiIpOwotKwkJCQlmYWlsZWQgPSAxOwotKwkJCQlicmVhazsKLSsJCQl9Ci0rCQkJaWYgKGtzID09IE5vU3ltYm9sKSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiRXNjYXBlS2V5czogZmFpbGVkIGxvb2t1cCBmb3IgJyVzJ1xuIiwgcCk7Ci0rCQkJCWZhaWxlZCA9IDE7Ci0rCQkJCWJyZWFrOwotKwkJCX0gZWxzZSBpZiAoIUlzTW9kaWZpZXJLZXkoa3MpKSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiRXNjYXBlS2V5czogbm90IGEgbW9kaWZpZXIga2V5ICclcydcbiIsIHApOwotKwkJCQlmYWlsZWQgPSAxOwotKwkJCQlicmVhazsKLSsJCQl9IGVsc2UgewotKwkJCQlLZXlDb2RlIGtjID0gWEtleXN5bVRvS2V5Y29kZShkcHksIGtzKTsKLSsJCQkJaWYgKGtjID09IE5vU3ltYm9sKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVzY2FwZUtleXM6IG5vIGtleWNvZGUgZm9yIG1vZGlmaWVyIGtleSAnJXMnXG4iLCBwKTsKLSsJCQkJCWZhaWxlZCA9IDE7Ci0rCQkJCQlicmVhazsKLSsJCQkJfQotKwkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic2V0OiAlZCAlZFxuIiwgaywga2MpOwotKwkJCQllc2NhcGVfbW9kc1trKytdID0ga2M7IAotKwkJCX0KLSsJCQkKLSsJCQlwID0gc3RydG9rKE5VTEwsICIsKyAiKTsKLSsJCX0KLSsJCWZyZWUocyk7Ci0rCi0rCQlpZiAoZmFpbGVkKSB7Ci0rCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotKwkJCQllc2NhcGVfbW9kc1tpXSA9IC0xOwotKwkJCX0KLSsJCX0KLSsJfQotKwotKwlwcmVzc2VkID0gMTsKLSsJc3VtID0gMDsKLSsJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotKwkJaW50IGtjID0gZXNjYXBlX21vZHNbaV07Ci0rCQlpZiAoa2MgIT0gLTEgJiYga2MgPCAyNTYpIHsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidHJ5MTogJWQgJWQgPSAlZFxuIiwgaSwga2MsIG1vZGlmaWVyUHJlc3NlZFtrY10pOwotKwkJCWlmICghbW9kaWZpZXJQcmVzc2VkW2tjXSkgewotKwkJCQlwcmVzc2VkID0gMDsKLSsJCQkJYnJlYWs7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJc3VtKys7Ci0rCQkJfQotKwkJfQotKwl9Ci0rCWlmIChzdW0gPT0gMCkgcHJlc3NlZCA9IDA7Ci0rCi0rCWlmICghcHJlc3NlZCkgewotKwkJLyogdXNlciBtYXkgaGF2ZSBkcmFnZ2VkIG1vdXNlIG91dHNpZGUgb2YgdG9wbGV2ZWwgd2luZG93ICovCi0rCQlpbnQgaSwgazsKLSsJCWludCBrZXlzdGF0ZVsyNTZdOwotKwkJY2hhciBrZXlzWzMyXTsKLSsKLSsJCS8qIHNvIHF1ZXJ5IHNlcnZlciBpbnN0ZWFkIG9mIG1vZGlmaWVyUHJlc3NlZFtdICovCi0rCQlYUXVlcnlLZXltYXAoZHB5LCBrZXlzKTsKLSsJCWZvciAoaT0wOyBpPDMyOyBpKyspIHsKLSsJCQljaGFyIGMgPSBrZXlzW2ldOwotKwotKwkJCWZvciAoaz0wOyBrIDwgODsgaysrKSB7Ci0rCQkJCWlmIChjICYgMHgxKSB7Ci0rCQkJCQlrZXlzdGF0ZVs4KmkgKyBrXSA9IDE7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlrZXlzdGF0ZVs4KmkgKyBrXSA9IDA7Ci0rCQkJCX0KLSsJCQkJYyA9IGMgPj4gMTsKLSsJCQl9Ci0rCQl9Ci0rCi0rCQkvKiBjaGVjayBhZ2FpbiB1c2luZyBrZXlzdGF0ZVtdICovCi0rCQlwcmVzc2VkID0gMjsKLSsJCXN1bSA9IDA7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0rCQkJaW50IGtjID0gZXNjYXBlX21vZHNbaV07Ci0rCQkJaWYgKGtjICE9IC0xICYmIGtjIDwgMjU2KSB7Ci0rCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ0cnkyOiAlZCAlZCA9ICVkXG4iLCBpLCBrYywga2V5c3RhdGVba2NdKTsKLSsJCQkJaWYgKCFrZXlzdGF0ZVtrY10pIHsKLSsJCQkJCXByZXNzZWQgPSAwOwotKwkJCQkJYnJlYWs7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzdW0rKzsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJCWlmIChzdW0gPT0gMCkgcHJlc3NlZCA9IDA7Ci0rCX0KLSsKLSsJcmV0dXJuIHByZXNzZWQ7Ci0rfQotKwotK3N0YXRpYyBpbnQgc2hpZnRfaXNfZG93bih2b2lkKSB7Ci0rCWludCBzaGlmdF9kb3duID0gMDsKLSsJS2V5Q29kZSBrYzsKLSsKLSsJaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCWludCBpLCBrOwotKwkJY2hhciBrZXlzWzMyXTsKLSsJCWludCBrZXlzdGF0ZVsyNTZdOwotKwotKwkJWFF1ZXJ5S2V5bWFwKGRweSwga2V5cyk7Ci0rCQlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7Ci0rCQkJY2hhciBjID0ga2V5c1tpXTsKLSsKLSsJCQlmb3IgKGs9MDsgayA8IDg7IGsrKykgewotKwkJCQlpZiAoYyAmIDB4MSkgewotKwkJCQkJa2V5c3RhdGVbOCppICsga10gPSAxOwotKwkJCQl9IGVsc2UgewotKwkJCQkJa2V5c3RhdGVbOCppICsga10gPSAwOwotKwkJCQl9Ci0rCQkJCWMgPSBjID4+IDE7Ci0rCQkJfQotKwkJfQotKwotKwkJa2MgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfU2hpZnRfTCk7Ci0rCQlpZiAoa2MgIT0gTm9TeW1ib2wgJiYga2V5c3RhdGVba2NdKSB7Ci0rCQkJc2hpZnRfZG93biA9IDE7Ci0rCQl9IGVsc2UgewotKwkJCWtjID0gWEtleXN5bVRvS2V5Y29kZShkcHksIFhLX1NoaWZ0X1IpOwotKwkJCWlmIChrYyAhPSBOb1N5bWJvbCAmJiBrZXlzdGF0ZVtrY10pIHsKLSsJCQkJc2hpZnRfZG93biA9IDE7Ci0rCQkJfQotKwkJfQotKwkJcmV0dXJuIHNoaWZ0X2Rvd247Ci0rCX0gZWxzZSB7Ci0rCQlrYyA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBYS19TaGlmdF9MKTsKLSsJCWlmIChrYyAhPSBOb1N5bWJvbCAmJiBtb2RpZmllclByZXNzZWRba2NdKSB7Ci0rCQkJc2hpZnRfZG93biA9IDE7Ci0rCQl9IGVsc2UgewotKwkJCWtjID0gWEtleXN5bVRvS2V5Y29kZShkcHksIFhLX1NoaWZ0X1IpOwotKwkJCWlmIChrYyAhPSBOb1N5bWJvbCAmJiBtb2RpZmllclByZXNzZWRba2NdKSB7Ci0rCQkJCXNoaWZ0X2Rvd24gPSAxOwotKwkJCX0KLSsJCX0KLSsJCXJldHVybiBzaGlmdF9kb3duOwotKwl9Ci0rfQotKwkJCQotIC8qCi0gICogU2VuZFJGQkV2ZW50IGlzIGFuIGFjdGlvbiB3aGljaCBzZW5kcyBhbiBSRkIgZXZlbnQuICBJdCBjYW4gYmUgdXNlZCBpbiB0d28KLSAgKiB3YXlzLiAgV2l0aG91dCBhbnkgcGFyYW1ldGVycyBpdCBzaW1wbHkgc2VuZHMgYW4gUkZCIGV2ZW50IGNvcnJlc3BvbmRpbmcgdG8KLUBAIC0yMDEsMTI3ICsyMDg5LDQwNiBAQAotICAqIGJ1dHRvbjIgZG93biwgMyBmb3IgYm90aCwgZXRjKS4KLSAgKi8KLSAKLStleHRlcm4gQm9vbCBzZWxlY3RpbmdTaW5nbGVXaW5kb3c7Ci0rCi0rZXh0ZXJuIEN1cnNvciBkb3RDdXJzb3IzOwotK2V4dGVybiBDdXJzb3IgZG90Q3Vyc29yNDsKLSsKLStleHRlcm4gdm9pZCBzZXRfc2VydmVyX3NjYWxlKGludCk7Ci0rCi0gdm9pZAotIFNlbmRSRkJFdmVudChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotIHsKLS0gIEtleVN5bSBrczsKLS0gIGNoYXIga2V5bmFtZVsyNTZdOwotLSAgaW50IGJ1dHRvbk1hc2ssIHgsIHk7Ci0tCi0tICBpZiAoYXBwRGF0YS5mdWxsU2NyZWVuICYmIGV2LT50eXBlID09IE1vdGlvbk5vdGlmeSkgewotLSAgICBpZiAoQnVtcFNjcm9sbChldikpCi0tICAgICAgcmV0dXJuOwotLSAgfQotKwlLZXlTeW0ga3M7Ci0rCWNoYXIga2V5bmFtZVsyNTZdOwotKwlpbnQgYnV0dG9uTWFzaywgeCwgeTsKLSsJaW50IGRvX2VzY2FwZTsKLSsJc3RhdGljIGludCBkYiA9IC0xOwotKwljaGFyICplayA9IGFwcERhdGEuZXNjYXBlS2V5czsKLSsKLSsJaWYgKGRiIDwgMCkgewotKwkJaWYgKGdldGVudigiU1NWTkNfREVCVUdfRVNDQVBFX0tFWVMiKSkgewotKwkJCWRiID0gMTsKLSsJCX0gZWxzZSB7Ci0rCQkJZGIgPSAwOwotKwkJfQotKwl9Ci0rCi0rCWlmIChldi0+dHlwZSA9PSBNb3Rpb25Ob3RpZnkgfHwgZXYtPnR5cGUgPT0gS2V5UmVsZWFzZSkgewotKwkJc3RhdGljIGRvdWJsZSBsYXN0ID0gMC4wOwotKwkJZG91YmxlIG5vdyA9IGRub3coKTsKLSsJCWlmIChub3cgPiBsYXN0ICsgMC4yNSkgewotKwkJCWNoZWNrX3RoaW5ncygpOwotKwkJCWxhc3QgPSBub3c7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKHNlbGVjdGluZ1NpbmdsZVdpbmRvdyAmJiBldi0+dHlwZSA9PSBCdXR0b25QcmVzcykgewotKwkJc2VsZWN0aW5nU2luZ2xlV2luZG93ID0gRmFsc2U7Ci0rCQlTZW5kU2luZ2xlV2luZG93KGV2LT54YnV0dG9uLngsIGV2LT54YnV0dG9uLnkpOwotKwkJaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCQlYRGVmaW5lQ3Vyc29yKGRweSwgZGVza3RvcFdpbiwgZG90Q3Vyc29yNCk7Ci0rCQl9IGVsc2UgewotKwkJCVhEZWZpbmVDdXJzb3IoZHB5LCBkZXNrdG9wV2luLCBkb3RDdXJzb3IzKTsKLSsJCX0KLSsJCXJldHVybjsKLSsJfQotIAotLSAgaWYgKGFwcERhdGEudmlld09ubHkpIHJldHVybjsKLSsJaWYgKGFwcERhdGEuZnVsbFNjcmVlbiAmJiBldi0+dHlwZSA9PSBNb3Rpb25Ob3RpZnkgJiYgIWVzY2FwZV9kcmFnX2luX3Byb2dyZXNzKSB7Ci0rCQlpZiAoQnVtcFNjcm9sbChldikpIHsKLSsJCQlyZXR1cm47Ci0rCQl9Ci0rCX0KLSsKLSsJZG9fZXNjYXBlID0gMDsKLSsJaWYgKGVrICE9IE5VTEwgJiYgKGVrWzBdID09ICduJyB8fCBla1swXSA9PSAnTicpICYmICFzdHJjYXNlY21wKGVrLCAibmV2ZXIiKSkgewotKwkJOwotKwl9IGVsc2UgaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCWRvX2VzY2FwZSA9IDE7Ci0rCX0gZWxzZSBpZiAoYXBwRGF0YS5lc2NhcGVBY3RpdmUpIHsKLSsJCWludCBza2lwID0gMCwgaXNfa2V5ID0gMDsKLSsKLSsJCWlmIChldi0+dHlwZSA9PSBLZXlQcmVzcyB8fCBldi0+dHlwZSA9PSBLZXlSZWxlYXNlKSB7Ci0rCQkJaXNfa2V5ID0gMTsKLSsJCQlYTG9va3VwU3RyaW5nKCZldi0+eGtleSwga2V5bmFtZSwgMjU2LCAma3MsIE5VTEwpOwotKwkJCWlmIChJc01vZGlmaWVyS2V5KGtzKSkgewotKwkJCQlza2lwID0gMTsKLSsJCQl9Ci0rCQl9Ci0rCQlpZiAoIXNraXApIHsKLSsJCQlpbnQgZXMgPSBlc2NhcGVfc2VxdWVuY2VfcHJlc3NlZCgpOwotKwkJCWlmIChlcyA9PSAxKSB7Ci0rCQkJCWRvX2VzY2FwZSA9IDE7Ci0rCQkJfSBlbHNlIGlmIChlcyA9PSAyKSB7Ci0rCQkJCWlmIChpc19rZXkpIHsKLSsJCQkJCWlmIChkbm93KCkgPCBsYXN0X2tleSArIDUuMCkgewotKwkJCQkJCWRvX2VzY2FwZSA9IDE7Ci0rCQkJCQl9Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlpZiAoZG5vdygpIDwgbGFzdF9kcmFnICsgNS4wKSB7Ci0rCQkJCQkJZG9fZXNjYXBlID0gMTsKLSsJCQkJCX0KLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJfQotKwlpZiAoIWRvX2VzY2FwZSkgewotKwkJZXNjYXBlX2RyYWdfaW5fcHJvZ3Jlc3MgPSAwOwotKwl9Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJkb19lc2NhcGU6ICVkXG4iLCBkb19lc2NhcGUpOwotKwotKwlpZiAoZG9fZXNjYXBlKSB7Ci0rCQlpbnQgVyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCQlpbnQgSCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJaW50IHNoaWZ0X2Rvd24gPSAwOwotKwotKwkJaWYgKCFnZXRlbnYoIk5PX1gxMVZOQ19BUFBTSEFSRSIpKSB7Ci0rCQkJc2hpZnRfZG93biA9IHNoaWZ0X2lzX2Rvd24oKTsKLSsJCX0KLSsJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzaGlmdF9kb3duOiAlZFxuIiwgc2hpZnRfZG93bik7Ci0rCi0rCQlpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotKwkJCWlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwiZmJ1cGRhdGUiKSA9PSAwKSB7Ci0rCQkJCVNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoMCwgMCwgVywgSCwgRmFsc2UpOwotKwkJCX0KLSsJCX0KLSsJCWlmIChldi0+dHlwZSA9PSBCdXR0b25SZWxlYXNlKSB7Ci0rCQkJWEJ1dHRvbkV2ZW50ICpiID0gKFhCdXR0b25FdmVudCAqKSBldjsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiQnV0dG9uUmVsZWFzZTogJWQgJWQgJWRcbiIsIGItPnhfcm9vdCwgYi0+eV9yb290LCBiLT5zdGF0ZSk7IAotKwkJCWlmIChiLT5idXR0b24gPT0gMykgewotKwkJCQlpZiAoc2hpZnRfZG93bikgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJkZWxldGUiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCVNob3dQb3B1cCh3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoZXNjYXBlX2RyYWdfaW5fcHJvZ3Jlc3MgJiYgYi0+YnV0dG9uID09IDEpIHsKLSsJCQkJZXNjYXBlX2RyYWdfaW5fcHJvZ3Jlc3MgPSAwOwotKwkJCX0KLSsJCX0gZWxzZSBpZiAoZXYtPnR5cGUgPT0gQnV0dG9uUHJlc3MpIHsKLSsJCQlYQnV0dG9uRXZlbnQgKmIgPSAoWEJ1dHRvbkV2ZW50ICopIGV2OwotKwkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJCdXR0b25QcmVzczogICAlZCAlZCAlZFxuIiwgYi0+eF9yb290LCBiLT55X3Jvb3QsIGItPnN0YXRlKTsgCi0rCQkJaWYgKGItPmJ1dHRvbiA9PSAxKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoInBvc2l0aW9uIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQllc2NhcGVfZHJhZ19pbl9wcm9ncmVzcyA9IDE7Ci0rCQkJCQlsYXN0X3ggPSBiLT54X3Jvb3Q7Ci0rCQkJCQlsYXN0X3kgPSBiLT55X3Jvb3Q7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgewotKwkJCQllc2NhcGVfZHJhZ19pbl9wcm9ncmVzcyA9IDA7Ci0rCQkJfQotKwkJfSBlbHNlIGlmIChldi0+dHlwZSA9PSBNb3Rpb25Ob3RpZnkpIHsKLSsJCQlYTW90aW9uRXZlbnQgKm0gPSAoWE1vdGlvbkV2ZW50ICopIGV2OwotKwkJCWlmIChlc2NhcGVfZHJhZ19pbl9wcm9ncmVzcykgewotKwkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiTW90aW9uTm90aWZ5OiAgICVkICVkICVkXG4iLCBtLT54X3Jvb3QsIG0tPnlfcm9vdCwgbS0+c3RhdGUpOyAKLSsJCQkJc2Nyb2xsX2Rlc2t0b3AobS0+eF9yb290IC0gbGFzdF94LCBtLT55X3Jvb3QgLSBsYXN0X3ksIC0xLjApOwotKwkJCQlsYXN0X3ggPSBtLT54X3Jvb3Q7Ci0rCQkJCWxhc3RfeSA9IG0tPnlfcm9vdDsKLSsJCQl9Ci0rCQl9IGVsc2UgaWYgKGV2LT50eXBlID09IEtleVJlbGVhc2UpIHsKLSsJCQlpbnQgZGlkID0gMTsKLSsKLSsJCQlYTG9va3VwU3RyaW5nKCZldi0+eGtleSwga2V5bmFtZSwgMjU2LCAma3MsIE5VTEwpOwotKwkJCWlmIChrcyA9PSBYS18xIHx8IGtzID09IFhLX0tQXzEpIHsKLSsJCQkJc2V0X3NlcnZlcl9zY2FsZSgxKTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLXzIgfHwga3MgPT0gWEtfS1BfMikgewotKwkJCQlzZXRfc2VydmVyX3NjYWxlKDIpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfMyB8fCBrcyA9PSBYS19LUF8zKSB7Ci0rCQkJCXNldF9zZXJ2ZXJfc2NhbGUoMyk7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS180IHx8IGtzID09IFhLX0tQXzQpIHsKLSsJCQkJc2V0X3NlcnZlcl9zY2FsZSg0KTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLXzUgfHwga3MgPT0gWEtfS1BfNSkgewotKwkJCQlzZXRfc2VydmVyX3NjYWxlKDUpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfNiB8fCBrcyA9PSBYS19LUF82KSB7Ci0rCQkJCXNldF9zZXJ2ZXJfc2NhbGUoNik7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19yIHx8IGtzID09IFhLX1IpIHsKLSsJCQkJU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgwLCAwLCBXLCBILCBGYWxzZSk7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19iIHx8IGtzID09IFhLX0IpIHsKLSsJCQkJVG9nZ2xlQmVsbCh3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX2MgfHwga3MgPT0gWEtfQykgewotKwkJCQlUb2dnbGU4YnBwKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfeCB8fCBrcyA9PSBYS19YKSB7Ci0rCQkJCVRvZ2dsZVgxMUN1cnNvcih3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX3ogfHwga3MgPT0gWEtfWikgewotKwkJCQlUb2dnbGVUaWdodFpSTEUodywgZXYsIHBhcmFtcywgbnVtX3BhcmFtcyk7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19oIHx8IGtzID09IFhLX0gpIHsKLSsJCQkJVG9nZ2xlVGlnaHRIZXh0aWxlKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfZiB8fCBrcyA9PSBYS19GKSB7Ci0rCQkJCVRvZ2dsZUZpbGVYZmVyKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfVikgewotKwkJCQlUb2dnbGVWaWV3T25seSh3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX1EpIHsKLSsJCQkJUXVpdCh3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX2wgfHwga3MgPT0gWEtfTCkgewotKwkJCQlUb2dnbGVGdWxsU2NyZWVuKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfYSB8fCBrcyA9PSBYS19BKSB7Ci0rCQkJCVRvZ2dsZUN1cnNvckFscGhhKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfcyB8fCBrcyA9PSBYS19TKSB7Ci0rCQkJCVNldFNjYWxlKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfdCB8fCBrcyA9PSBYS19UKSB7Ci0rCQkJCVRvZ2dsZVRleHRDaGF0KHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfZSB8fCBrcyA9PSBYS19FKSB7Ci0rCQkJCVNldEVzY2FwZUtleXModywgZXYsIHBhcmFtcywgbnVtX3BhcmFtcyk7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19nIHx8IGtzID09IFhLX0cpIHsKLSsJCQkJVG9nZ2xlWEdyYWIodywgZXYsIHBhcmFtcywgbnVtX3BhcmFtcyk7Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19EKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duIHx8IGFwcERhdGEuYXBwU2hhcmUpIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgiZGVsZXRlIik7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX00pIHsKLSsJCQkJaWYgKHNoaWZ0X2Rvd24gfHwgYXBwRGF0YS5hcHBTaGFyZSkgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJwb3NpdGlvbiIpOwotKwkJCQl9Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19MZWZ0KSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoImxlZnQiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCXNjcm9sbF9kZXNrdG9wKC0xLCAwLCAwLjEpOwotKwkJCQl9Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19SaWdodCkgewotKwkJCQlpZiAoc2hpZnRfZG93bikgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJyaWdodCIpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJc2Nyb2xsX2Rlc2t0b3AoKzEsIDAsIDAuMSk7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX1VwKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoInVwIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY3JvbGxfZGVza3RvcCgwLCArMSwgMC4xKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfRG93bikgewotKwkJCQlpZiAoc2hpZnRfZG93bikgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJkb3duIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY3JvbGxfZGVza3RvcCgwLCAtMSwgMC4xKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfS1BfTGVmdCkgewotKwkJCQlpZiAoc2hpZnRfZG93bikgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJsZWZ0LWZpbmUiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCXNjcm9sbF9kZXNrdG9wKC0xLCAwLCAwLjApOwotKwkJCQl9Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19LUF9SaWdodCkgewotKwkJCQlpZiAoc2hpZnRfZG93bikgewotKwkJCQkJeDExdm5jX2FwcHNoYXJlKCJyaWdodC1maW5lIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY3JvbGxfZGVza3RvcCgrMSwgMCwgMC4wKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfS1BfVXApIHsKLSsJCQkJaWYgKHNoaWZ0X2Rvd24pIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgidXAtZmluZSIpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJc2Nyb2xsX2Rlc2t0b3AoMCwgKzEsIDAuMCk7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX0tQX0Rvd24pIHsKLSsJCQkJaWYgKHNoaWZ0X2Rvd24pIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgiZG93bi1maW5lIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY3JvbGxfZGVza3RvcCgwLCAtMSwgMC4wKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfTmV4dCB8fCBrcyA9PSBYS19LUF9OZXh0KSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duICYmIGtzID09IFhLX05leHQpIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgic2hvcnRlciIpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJc2Nyb2xsX2Rlc2t0b3AoMCwgLTEsIDEuMCk7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX1ByaW9yIHx8IGtzID09IFhLX0tQX1ByaW9yKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duICYmIGtzID09IFhLX1ByaW9yKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoInRhbGxlciIpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJc2Nyb2xsX2Rlc2t0b3AoMCwgKzEsIDEuMCk7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX0VuZCB8fCBrcyA9PSBYS19LUF9FbmQpIHsKLSsJCQkJaWYgKHNoaWZ0X2Rvd24gJiYga3MgPT0gWEtfRW5kKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoIm5hcnJvd2VyIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY3JvbGxfZGVza3RvcCgrMSwgMCwgMS4wKTsKLSsJCQkJfQotKwkJCX0gZWxzZSBpZiAoa3MgPT0gWEtfSG9tZSB8fCBrcyA9PSBYS19LUF9Ib21lKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duICYmIGtzID09IFhLX0hvbWUpIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgid2lkZXIiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCXNjcm9sbF9kZXNrdG9wKC0xLCAwLCAxLjApOwotKwkJCQl9Ci0rCQkJfSBlbHNlIGlmIChrcyA9PSBYS19lcXVhbCB8fCBrcyA9PSBYS19wbHVzKSB7Ci0rCQkJCWlmIChzaGlmdF9kb3duKSB7Ci0rCQkJCQl4MTF2bmNfYXBwc2hhcmUoInJhaXNlIik7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlzY2FsZV9kZXNrdG9wKDEsIDAuMSk7Ci0rCQkJCX0KLSsJCQl9IGVsc2UgaWYgKGtzID09IFhLX3VuZGVyc2NvcmUgfHwga3MgPT0gWEtfbWludXMpIHsKLSsJCQkJaWYgKHNoaWZ0X2Rvd24pIHsKLSsJCQkJCXgxMXZuY19hcHBzaGFyZSgibG93ZXIiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCXNjYWxlX2Rlc2t0b3AoMCwgMC4xKTsKLSsJCQkJfQotKwkJCX0gZWxzZSB7Ci0rCQkJCWRpZCA9IDA7Ci0rCQkJfQotKwkJCWlmIChkaWQpIHsKLSsJCQkJbGFzdF9rZXkgPSBkbm93KCk7Ci0rCQkJfQotKwkJfQotKwkJaWYgKGVzY2FwZV9kcmFnX2luX3Byb2dyZXNzKSB7Ci0rCQkJbGFzdF9kcmFnID0gZG5vdygpOwotKwkJfQotKwkJcmV0dXJuOwotKwl9Ci0rCWlmIChhcHBEYXRhLnZpZXdPbmx5KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJaWYgKCpudW1fcGFyYW1zICE9IDApIHsKLSsJCWlmIChzdHJuY2FzZWNtcChwYXJhbXNbMF0sImtleSIsMykgPT0gMCkgewotKwkJCWlmICgqbnVtX3BhcmFtcyAhPSAyKSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXJhbXM6ICIKLSsJCQkJICAgICJTZW5kUkZCRXZlbnQoa2V5fGtleWRvd258a2V5dXAsPGtleXN5bT4pXG4iKTsKLSsJCQkJcmV0dXJuOwotKwkJCX0KLSsJCQlrcyA9IFhTdHJpbmdUb0tleXN5bShwYXJhbXNbMV0pOwotKwkJCWlmIChrcyA9PSBOb1N5bWJvbCkgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBrZXlzeW0gJyVzJyBwYXNzZWQgdG8gIgotKwkJCQkgICAgIlNlbmRSRkJFdmVudFxuIiwgcGFyYW1zWzFdKTsKLSsJCQkJcmV0dXJuOwotKwkJCX0KLSsJCQlpZiAoc3RyY2FzZWNtcChwYXJhbXNbMF0sImtleWRvd24iKSA9PSAwKSB7Ci0rCQkJCVNlbmRLZXlFdmVudChrcywgMSk7Ci0rCQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwia2V5dXAiKSA9PSAwKSB7Ci0rCQkJCVNlbmRLZXlFdmVudChrcywgMCk7Ci0rCQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwia2V5IikgPT0gMCkgewotKwkJCQlTZW5kS2V5RXZlbnQoa3MsIDEpOwotKwkJCQlTZW5kS2V5RXZlbnQoa3MsIDApOwotKwkJCX0gZWxzZSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGV2ZW50ICclcycgcGFzc2VkIHRvICIKLSsJCQkJICAgICJTZW5kUkZCRXZlbnRcbiIsIHBhcmFtc1swXSk7Ci0rCQkJCXJldHVybjsKLSsJCQl9Ci0rCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAocGFyYW1zWzBdLCJmYnVwZGF0ZSIpID09IDApIHsKLSsJCQlpZiAoKm51bV9wYXJhbXMgIT0gMSkgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGFyYW1zOiAiCi0rCQkJCSAgICAiU2VuZFJGQkV2ZW50KGZidXBkYXRlKVxuIik7Ci0rCQkJCXJldHVybjsKLSsJCQl9Ci0rCQkJU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgwLCAwLCBzaS5mcmFtZWJ1ZmZlcldpZHRoLAotKwkJCSAgICBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgRmFsc2UpOwotKwotKwkJfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwicHRyIikgPT0gMCkgewotKwkJCWlmICgqbnVtX3BhcmFtcyA9PSA0KSB7Ci0rCQkJCXggPSBhdG9pKHBhcmFtc1sxXSk7Ci0rCQkJCXkgPSBhdG9pKHBhcmFtc1syXSk7Ci0rCQkJCWJ1dHRvbk1hc2sgPSBhdG9pKHBhcmFtc1szXSk7Ci0rCQkJCVNlbmRQb2ludGVyRXZlbnQoeCwgeSwgYnV0dG9uTWFzayk7Ci0rCQkJfSBlbHNlIGlmICgqbnVtX3BhcmFtcyA9PSAyKSB7Ci0rCQkJCXN3aXRjaCAoZXYtPnR5cGUpIHsKLSsJCQkJY2FzZSBCdXR0b25QcmVzczoKLSsJCQkJY2FzZSBCdXR0b25SZWxlYXNlOgotKwkJCQkJeCA9IGV2LT54YnV0dG9uLng7Ci0rCQkJCQl5ID0gZXYtPnhidXR0b24ueTsKLSsJCQkJCWJyZWFrOwotKwkJCQljYXNlIEtleVByZXNzOgotKwkJCQljYXNlIEtleVJlbGVhc2U6Ci0rCQkJCQl4ID0gZXYtPnhrZXkueDsKLSsJCQkJCXkgPSBldi0+eGtleS55OwotKwkJCQkJYnJlYWs7Ci0rCQkJCWRlZmF1bHQ6Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZXZlbnQgY2F1c2VkICIKLSsJCQkJCSAgICAiU2VuZFJGQkV2ZW50KHB0ciw8YnV0dG9uTWFzaz4pXG4iKTsKLSsJCQkJCXJldHVybjsKLSsJCQkJfQotKwkJCQlidXR0b25NYXNrID0gYXRvaShwYXJhbXNbMV0pOwotKwkJCQlTZW5kUG9pbnRlckV2ZW50KHgsIHksIGJ1dHRvbk1hc2spOwotKwkJCX0gZWxzZSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXJhbXM6ICIKLSsJCQkJICAgICJTZW5kUkZCRXZlbnQocHRyLDx4Piw8eT4sPGJ1dHRvbk1hc2s+KVxuIgotKwkJCQkgICAgIiAgICAgICAgICAgICBvciBTZW5kUkZCRXZlbnQocHRyLDxidXR0b25NYXNrPilcbiIpOwotKwkJCQlyZXR1cm47Ci0rCQkJfQotKwkJfSBlbHNlIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBldmVudCAnJXMnIHBhc3NlZCB0byAiCi0rCQkJICAgICJTZW5kUkZCRXZlbnRcbiIsIHBhcmFtc1swXSk7Ci0rCQl9Ci0rCQlyZXR1cm47Ci0rCX0KLSAKLS0gIGlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0tICAgIGlmIChzdHJuY2FzZWNtcChwYXJhbXNbMF0sImtleSIsMykgPT0gMCkgewotLSAgICAgIGlmICgqbnVtX3BhcmFtcyAhPSAyKSB7Ci0tCWZwcmludGYoc3RkZXJyLAotLQkJIkludmFsaWQgcGFyYW1zOiBTZW5kUkZCRXZlbnQoa2V5fGtleWRvd258a2V5dXAsPGtleXN5bT4pXG4iKTsKLS0JcmV0dXJuOwotLSAgICAgIH0KLS0gICAgICBrcyA9IFhTdHJpbmdUb0tleXN5bShwYXJhbXNbMV0pOwotLSAgICAgIGlmIChrcyA9PSBOb1N5bWJvbCkgewotLQlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBrZXlzeW0gJyVzJyBwYXNzZWQgdG8gU2VuZFJGQkV2ZW50XG4iLAotLQkJcGFyYW1zWzFdKTsKLS0JcmV0dXJuOwotLSAgICAgIH0KLS0gICAgICBpZiAoc3RyY2FzZWNtcChwYXJhbXNbMF0sImtleWRvd24iKSA9PSAwKSB7Ci0tCVNlbmRLZXlFdmVudChrcywgMSk7Ci0tICAgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwia2V5dXAiKSA9PSAwKSB7Ci0tCVNlbmRLZXlFdmVudChrcywgMCk7Ci0tICAgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwia2V5IikgPT0gMCkgewotLQlTZW5kS2V5RXZlbnQoa3MsIDEpOwotLQlTZW5kS2V5RXZlbnQoa3MsIDApOwotLSAgICAgIH0gZWxzZSB7Ci0tCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGV2ZW50ICclcycgcGFzc2VkIHRvIFNlbmRSRkJFdmVudFxuIiwKLS0JCXBhcmFtc1swXSk7Ci0tCXJldHVybjsKLS0gICAgICB9Ci0tICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChwYXJhbXNbMF0sImZidXBkYXRlIikgPT0gMCkgewotLSAgICAgIGlmICgqbnVtX3BhcmFtcyAhPSAxKSB7Ci0tCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXJhbXM6IFNlbmRSRkJFdmVudChmYnVwZGF0ZSlcbiIpOwotLQlyZXR1cm47Ci0tICAgICAgfQotLSAgICAgIFNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoMCwgMCwgc2kuZnJhbWVidWZmZXJXaWR0aCwKLS0JCQkJICAgc2kuZnJhbWVidWZmZXJIZWlnaHQsIEZhbHNlKTsKLS0gICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKHBhcmFtc1swXSwicHRyIikgPT0gMCkgewotLSAgICAgIGlmICgqbnVtX3BhcmFtcyA9PSA0KSB7Ci0tCXggPSBhdG9pKHBhcmFtc1sxXSk7Ci0tCXkgPSBhdG9pKHBhcmFtc1syXSk7Ci0tCWJ1dHRvbk1hc2sgPSBhdG9pKHBhcmFtc1szXSk7Ci0tCVNlbmRQb2ludGVyRXZlbnQoeCwgeSwgYnV0dG9uTWFzayk7Ci0tICAgICAgfSBlbHNlIGlmICgqbnVtX3BhcmFtcyA9PSAyKSB7Ci0gCXN3aXRjaCAoZXYtPnR5cGUpIHsKLSsJY2FzZSBNb3Rpb25Ob3RpZnk6Ci0rCQl3aGlsZSAoWENoZWNrVHlwZWRXaW5kb3dFdmVudChkcHksIGRlc2t0b3BXaW4sIE1vdGlvbk5vdGlmeSwgZXYpKSB7Ci0rCQkJOwkvKiBkaXNjYXJkIGFsbCBxdWV1ZWQgbW90aW9uIG5vdGlmeSBldmVudHMgKi8KLSsJCX0KLSsKLSsJCVNlbmRQb2ludGVyRXZlbnQoZXYtPnhtb3Rpb24ueCwgZXYtPnhtb3Rpb24ueSwKLSsJCQkgICAgIChldi0+eG1vdGlvbi5zdGF0ZSAmIDB4MWYwMCkgPj4gOCk7Ci0rCQlyZXR1cm47Ci0rCi0gCWNhc2UgQnV0dG9uUHJlc3M6Ci0rCQlTZW5kUG9pbnRlckV2ZW50KGV2LT54YnV0dG9uLngsIGV2LT54YnV0dG9uLnksCi0rCQkJICAgICAoKChldi0+eGJ1dHRvbi5zdGF0ZSAmIDB4MWYwMCkgPj4gOCkgfAotKwkJCSAgICAgICgxIDw8IChldi0+eGJ1dHRvbi5idXR0b24gLSAxKSkpKTsKLSsJCXJldHVybjsKLSsKLSAJY2FzZSBCdXR0b25SZWxlYXNlOgotLQkgIHggPSBldi0+eGJ1dHRvbi54OwotLQkgIHkgPSBldi0+eGJ1dHRvbi55OwotLQkgIGJyZWFrOwotKwkJU2VuZFBvaW50ZXJFdmVudChldi0+eGJ1dHRvbi54LCBldi0+eGJ1dHRvbi55LAotKwkJCSAgICAgKCgoZXYtPnhidXR0b24uc3RhdGUgJiAweDFmMDApID4+IDgpICYKLSsJCQkgICAgICB+KDEgPDwgKGV2LT54YnV0dG9uLmJ1dHRvbiAtIDEpKSkpOwotKwkJcmV0dXJuOwotKwotIAljYXNlIEtleVByZXNzOgotIAljYXNlIEtleVJlbGVhc2U6Ci0tCSAgeCA9IGV2LT54a2V5Lng7Ci0tCSAgeSA9IGV2LT54a2V5Lnk7Ci0tCSAgYnJlYWs7Ci0tCWRlZmF1bHQ6Ci0tCSAgZnByaW50ZihzdGRlcnIsCi0tCQkgICJJbnZhbGlkIGV2ZW50IGNhdXNlZCBTZW5kUkZCRXZlbnQocHRyLDxidXR0b25NYXNrPilcbiIpOwotLQkgIHJldHVybjsKLS0JfQotLQlidXR0b25NYXNrID0gYXRvaShwYXJhbXNbMV0pOwotLQlTZW5kUG9pbnRlckV2ZW50KHgsIHksIGJ1dHRvbk1hc2spOwotLSAgICAgIH0gZWxzZSB7Ci0tCWZwcmludGYoc3RkZXJyLAotLQkJIkludmFsaWQgcGFyYW1zOiBTZW5kUkZCRXZlbnQocHRyLDx4Piw8eT4sPGJ1dHRvbk1hc2s+KVxuIgotLQkJIiAgICAgICAgICAgICBvciBTZW5kUkZCRXZlbnQocHRyLDxidXR0b25NYXNrPilcbiIpOwotLQlyZXR1cm47Ci0tICAgICAgfQotLQotLSAgICB9IGVsc2UgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGV2ZW50ICclcycgcGFzc2VkIHRvIFNlbmRSRkJFdmVudFxuIiwgcGFyYW1zWzBdKTsKLS0gICAgfQotLSAgICByZXR1cm47Ci0tICB9Ci0tCi0tICBzd2l0Y2ggKGV2LT50eXBlKSB7Ci0rCQlYTG9va3VwU3RyaW5nKCZldi0+eGtleSwga2V5bmFtZSwgMjU2LCAma3MsIE5VTEwpOwotIAotLSAgY2FzZSBNb3Rpb25Ob3RpZnk6Ci0tICAgIHdoaWxlIChYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50KGRweSwgZGVza3RvcFdpbiwgTW90aW9uTm90aWZ5LCBldikpCi0tICAgICAgOwkvKiBkaXNjYXJkIGFsbCBxdWV1ZWQgbW90aW9uIG5vdGlmeSBldmVudHMgKi8KLS0KLS0gICAgU2VuZFBvaW50ZXJFdmVudChldi0+eG1vdGlvbi54LCBldi0+eG1vdGlvbi55LAotLQkJICAgICAoZXYtPnhtb3Rpb24uc3RhdGUgJiAweDFmMDApID4+IDgpOwotLSAgICByZXR1cm47Ci0tCi0tICBjYXNlIEJ1dHRvblByZXNzOgotLSAgICBTZW5kUG9pbnRlckV2ZW50KGV2LT54YnV0dG9uLngsIGV2LT54YnV0dG9uLnksCi0tCQkgICAgICgoKGV2LT54YnV0dG9uLnN0YXRlICYgMHgxZjAwKSA+PiA4KSB8Ci0tCQkgICAgICAoMSA8PCAoZXYtPnhidXR0b24uYnV0dG9uIC0gMSkpKSk7Ci0tICAgIHJldHVybjsKLS0KLS0gIGNhc2UgQnV0dG9uUmVsZWFzZToKLS0gICAgU2VuZFBvaW50ZXJFdmVudChldi0+eGJ1dHRvbi54LCBldi0+eGJ1dHRvbi55LAotLQkJICAgICAoKChldi0+eGJ1dHRvbi5zdGF0ZSAmIDB4MWYwMCkgPj4gOCkgJgotLQkJICAgICAgfigxIDw8IChldi0+eGJ1dHRvbi5idXR0b24gLSAxKSkpKTsKLS0gICAgcmV0dXJuOwotLQotLSAgY2FzZSBLZXlQcmVzczoKLS0gIGNhc2UgS2V5UmVsZWFzZToKLS0gICAgWExvb2t1cFN0cmluZygmZXYtPnhrZXksIGtleW5hbWUsIDI1NiwgJmtzLCBOVUxMKTsKLS0KLS0gICAgaWYgKElzTW9kaWZpZXJLZXkoa3MpKSB7Ci0tICAgICAga3MgPSBYS2V5Y29kZVRvS2V5c3ltKGRweSwgZXYtPnhrZXkua2V5Y29kZSwgMCk7Ci0tICAgICAgbW9kaWZpZXJQcmVzc2VkW2V2LT54a2V5LmtleWNvZGVdID0gKGV2LT50eXBlID09IEtleVByZXNzKTsKLS0gICAgfQotKwkJaWYgKElzTW9kaWZpZXJLZXkoa3MpKSB7Ci0rCQkJa3MgPSBYS2V5Y29kZVRvS2V5c3ltKGRweSwgZXYtPnhrZXkua2V5Y29kZSwgMCk7Ci0rCQkJbW9kaWZpZXJQcmVzc2VkW2V2LT54a2V5LmtleWNvZGVdID0gKGV2LT50eXBlID09IEtleVByZXNzKTsKLSsJCX0KLSAKLS0gICAgU2VuZEtleUV2ZW50KGtzLCAoZXYtPnR5cGUgPT0gS2V5UHJlc3MpKTsKLS0gICAgcmV0dXJuOwotKwkJU2VuZEtleUV2ZW50KGtzLCAoZXYtPnR5cGUgPT0gS2V5UHJlc3MpKTsKLSsJCXJldHVybjsKLSAKLS0gIGRlZmF1bHQ6Ci0tICAgIGZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGV2ZW50IHBhc3NlZCB0byBTZW5kUkZCRXZlbnRcbiIpOwotLSAgfQotKwlkZWZhdWx0OgotKwkJZnByaW50ZihzdGRlcnIsIkludmFsaWQgZXZlbnQgcGFzc2VkIHRvIFNlbmRSRkJFdmVudFxuIik7Ci0rCX0KLSB9Ci0gCi0gCi1AQCAtMzI5LDY4ICsyNDk2LDI1NSBAQAotICAqIENyZWF0ZURvdEN1cnNvci4KLSAgKi8KLSAKLSsjaWZuZGVmIHZlcnlfc21hbGxfZG90X2N1cnNvcgotIHN0YXRpYyBDdXJzb3IKLS1DcmVhdGVEb3RDdXJzb3IoKQotK0NyZWF0ZURvdEN1cnNvcihpbnQgd2hpY2gpCi0gewotLSAgQ3Vyc29yIGN1cnNvcjsKLS0gIFBpeG1hcCBzcmMsIG1zazsKLS0gIHN0YXRpYyBjaGFyIHNyY0JpdHNbXSA9IHsgMCwgMTQsMTQsMTQsIDAgfTsKLS0gIHN0YXRpYyBjaGFyIG1za0JpdHNbXSA9IHsgMTQsMzEsMzEsMzEsMTQgfTsKLS0gIFhDb2xvciBmZywgYmc7Ci0tCi0tICBzcmMgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBzcmNCaXRzLCA1LCA1KTsKLS0gIG1zayA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIG1za0JpdHMsIDUsIDUpOwotLSAgWEFsbG9jTmFtZWRDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgImJsYWNrIiwKLS0JCSAgICZmZywgJmZnKTsKLS0gIFhBbGxvY05hbWVkQ29sb3IoZHB5LCBEZWZhdWx0Q29sb3JtYXAoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSksICJ3aGl0ZSIsCi0tCQkgICAmYmcsICZiZyk7Ci0tICBjdXJzb3IgPSBYQ3JlYXRlUGl4bWFwQ3Vyc29yKGRweSwgc3JjLCBtc2ssICZmZywgJmJnLCAyLCAyKTsKLS0gIFhGcmVlUGl4bWFwKGRweSwgc3JjKTsKLS0gIFhGcmVlUGl4bWFwKGRweSwgbXNrKTsKLSsJQ3Vyc29yIGN1cnNvcjsKLSsJUGl4bWFwIHNyYywgbXNrOwotKwlzdGF0aWMgY2hhciBzcmNCaXRzM1tdID0geyAweDAwLCAweDAyLCAweDAwIH07Ci0rCXN0YXRpYyBjaGFyIG1za0JpdHMzW10gPSB7IDB4MDIsIDB4MDcsIDB4MDIgfTsKLSsJc3RhdGljIGNoYXIgc3JjQml0czRbXSA9IHsgMHgwMCwgMHgwNiwgMHgwNiwgMHgwMCB9OwotKwlzdGF0aWMgY2hhciBtc2tCaXRzNFtdID0geyAweDA2LCAweDBmLCAweDBmLCAweDA2IH07Ci0rCVhDb2xvciBmZywgYmc7Ci0rCi0rCWlmICh3aGljaCA9PSAzKSB7Ci0rCQlzcmMgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBzcmNCaXRzMywgMywgMyk7Ci0rCQltc2sgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBtc2tCaXRzMywgMywgMyk7Ci0rCX0gZWxzZSB7Ci0rCQlzcmMgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBzcmNCaXRzNCwgNCwgNCk7Ci0rCQltc2sgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBtc2tCaXRzNCwgNCwgNCk7Ci0rCX0KLSsJWEFsbG9jTmFtZWRDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgImJsYWNrIiwKLSsJICAgICZmZywgJmZnKTsKLSsJWEFsbG9jTmFtZWRDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgIndoaXRlIiwKLSsJICAgICZiZywgJmJnKTsKLSsJY3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihkcHksIHNyYywgbXNrLCAmZmcsICZiZywgMSwgMSk7Ci0rCVhGcmVlUGl4bWFwKGRweSwgc3JjKTsKLSsJWEZyZWVQaXhtYXAoZHB5LCBtc2spOwotIAotLSAgcmV0dXJuIGN1cnNvcjsKLSsJcmV0dXJuIGN1cnNvcjsKLSB9Ci0rI2Vsc2UKLStzdGF0aWMgQ3Vyc29yCi0rQ3JlYXRlRG90Q3Vyc29yKCkKLSt7Ci0rCUN1cnNvciBjdXJzb3I7Ci0rCVBpeG1hcCBzcmMsIG1zazsKLSsJc3RhdGljIGNoYXIgc3JjQml0c1tdID0geyAwLCAxNCwgMCB9OwotKwlzdGF0aWMgY2hhciBtc2tCaXRzW10gPSB7IDE0LDMxLDE0IH07Ci0rCVhDb2xvciBmZywgYmc7Ci0rCi0rCXNyYyA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIHNyY0JpdHMsIDMsIDMpOwotKwltc2sgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBtc2tCaXRzLCAzLCAzKTsKLSsJWEFsbG9jTmFtZWRDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgImJsYWNrIiwKLSsJICAgICZmZywgJmZnKTsKLSsJWEFsbG9jTmFtZWRDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgIndoaXRlIiwKLSsJICAgICZiZywgJmJnKTsKLSsJY3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihkcHksIHNyYywgbXNrLCAmZmcsICZiZywgMSwgMSk7Ci0rCVhGcmVlUGl4bWFwKGRweSwgc3JjKTsKLSsJWEZyZWVQaXhtYXAoZHB5LCBtc2spOwotIAotKwlyZXR1cm4gY3Vyc29yOwotK30KLSsjZW5kaWYKLSAKLStpbnQgc2tpcF9tYXliZV9zeW5jID0gMDsKLSt2b2lkIG1heWJlX3N5bmMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0rCXN0YXRpYyBpbnQgc2luZ2xlcyA9IDAsIGFsd2F5c19za2lwID0gLTE7Ci0rCWludCBzaW5nbGVzX21heCA9IDY0OwotKwotKwlpZiAoYWx3YXlzX3NraXAgPCAwKSB7Ci0rCQlpZiAoZ2V0ZW52KCJTU1ZOQ19OT19NQVlCRV9TWU5DIikpIHsKLSsJCQlhbHdheXNfc2tpcCA9IDE7Ci0rCQl9IGVsc2UgewotKwkJCWFsd2F5c19za2lwID0gMDsKLSsJCX0KLSsJfQotKwlpZiAoc2tpcF9tYXliZV9zeW5jIHx8IGFsd2F5c19za2lwKSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsjaWYgMAotKwlpZiAod2lkdGggPiAxIHx8IGhlaWdodCA+IDEpIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJc2luZ2xlcyA9IDA7Ci0rCX0gZWxzZSB7Ci0rCQlpZiAoKytzaW5nbGVzID49IHNpbmdsZXNfbWF4KSB7Ci0rCQkJc2luZ2xlcyA9IDA7Ci0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQl9Ci0rCX0KLSsjZWxzZQotKwlpZiAod2lkdGggKiBoZWlnaHQgPj0gc2luZ2xlc19tYXgpIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJc2luZ2xlcyA9IDA7Ci0rCX0gZWxzZSB7Ci0rCQlzaW5nbGVzICs9IHdpZHRoICogaGVpZ2h0OwotKwkJaWYgKHNpbmdsZXMgPj0gc2luZ2xlc19tYXgpIHsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQlzaW5nbGVzID0gMDsKLSsJCX0KLSsJfQotKyNlbmRpZgotK30KLSAvKgotLSAqIENvcHlEYXRhVG9TY3JlZW4uCi0rICogRmlsbEltYWdlLgotICAqLwotIAotIHZvaWQKLS1Db3B5RGF0YVRvU2NyZWVuKGNoYXIgKmJ1ZiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0rRmlsbFNjcmVlbihpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgdW5zaWduZWQgbG9uZyBmaWxsKQotIHsKLS0gIGlmIChhcHBEYXRhLnJhd0RlbGF5ICE9IDApIHsKLS0gICAgWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBnYywgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0rCVhJbWFnZSAqaW0gPSBpbWFnZV9zY2FsZSA/IGltYWdlX3NjYWxlIDogaW1hZ2U7Ci0rCWludCBicHAgPSBpbS0+Yml0c19wZXJfcGl4ZWw7Ci0rCWludCBCcHAgPSBpbS0+Yml0c19wZXJfcGl4ZWwgLyA4OwotKwlpbnQgQnBsID0gaW0tPmJ5dGVzX3Blcl9saW5lOwotKwlpbnQgaCwgd2lkdGhJbkJ5dGVzID0gd2lkdGggKiBCcHA7Ci0rCXN0YXRpYyBjaGFyICpidWYgPSBOVUxMOwotKwlzdGF0aWMgaW50IGJ1ZmxlbiA9IDA7Ci0rCXVuc2lnbmVkIGNoYXIgICp1Y3A7Ci0rCXVuc2lnbmVkIHNob3J0ICp1c3A7Ci0rCXVuc2lnbmVkIGludCAgICp1aXA7Ci0rCWNoYXIgKnNjcjsKLSsJaW50IGIwLCBiMSwgYjI7Ci0gCi0tICAgIFhTeW5jKGRweSxGYWxzZSk7Ci0rI2lmIDAKLStmcHJpbnRmKHN0ZGVyciwgIkZpbGxJbWFnZSBicHA9JWQgJTA0ZHglMDRkKyUwNGQrJTA0ZCAtLSAweCV4XG4iLCBicHAsIHdpZHRoLCBoZWlnaHQsIHgsIHksIGZpbGwpOwotKyNlbmRpZgotKwlpZiAoYXBwRGF0YS5jaGF0T25seSkgewotKwkJcmV0dXJuOwotKwl9Ci0gCi0tICAgIHVzbGVlcChhcHBEYXRhLnJhd0RlbGF5ICogMTAwMCk7Ci0tICB9Ci0rCWlmICh3aWR0aEluQnl0ZXMgPiBidWZsZW4gfHwgIWJ1ZikgIHsKLSsJCWlmIChidWYpIHsKLSsJCQlmcmVlKGJ1Zik7Ci0rCQl9Ci0rCQlidWZsZW4gPSB3aWR0aEluQnl0ZXMgKiAyOwotKwkJYnVmID0gKGNoYXIgKiltYWxsb2MoYnVmbGVuKTsgCi0rCX0KLSsJdWNwID0gKHVuc2lnbmVkIGNoYXIqKSBidWY7Ci0rCXVzcCA9ICh1bnNpZ25lZCBzaG9ydCopIGJ1ZjsKLSsJdWlwID0gKHVuc2lnbmVkIGludCopIGJ1ZjsKLSsKLSsJaWYgKGlzTFNCKSB7Ci0rCQliMCA9IDA7IGIxID0gMTsgYjIgPSAyOwotKwl9IGVsc2UgewotKwkJYjAgPSAyOyBiMSA9IDE7IGIyID0gMDsKLSsJfQotIAotLSAgaWYgKCFhcHBEYXRhLnVzZUJHUjIzMykgewotLSAgICBpbnQgaDsKLS0gICAgaW50IHdpZHRoSW5CeXRlcyA9IHdpZHRoICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLS0gICAgaW50IHNjcldpZHRoSW5CeXRlcyA9IHNpLmZyYW1lYnVmZmVyV2lkdGggKiBteUZvcm1hdC5iaXRzUGVyUGl4ZWwgLyA4OwotLQotLSAgICBjaGFyICpzY3IgPSAoaW1hZ2UtPmRhdGEgKyB5ICogc2NyV2lkdGhJbkJ5dGVzCi0tCQkgKyB4ICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gOCk7Ci0tCi0tICAgIGZvciAoaCA9IDA7IGggPCBoZWlnaHQ7IGgrKykgewotLSAgICAgIG1lbWNweShzY3IsIGJ1Ziwgd2lkdGhJbkJ5dGVzKTsKLS0gICAgICBidWYgKz0gd2lkdGhJbkJ5dGVzOwotLSAgICAgIHNjciArPSBzY3JXaWR0aEluQnl0ZXM7Ci0tICAgIH0KLS0gIH0gZWxzZSB7Ci0tICAgIENvcHlCR1IyMzNUb1NjcmVlbigoQ0FSRDggKilidWYsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotLSAgfQotKwlmb3IgKGggPSAwOyBoIDwgd2lkdGg7IGgrKykgewotKwkJaWYgKGJwcCA9PSA4KSB7Ci0rCQkJKih1Y3AraCkgPSAodW5zaWduZWQgY2hhcikgIGZpbGw7Ci0rCQl9IGVsc2UgaWYgKGJwcCA9PSAxNikgewotKwkJCSoodXNwK2gpID0gKHVuc2lnbmVkIHNob3J0KSBmaWxsOwotKwkJfSBlbHNlIGlmIChicHAgPT0gMjQpIHsKLSsJCQkqKHVjcCArIDMqaCArIGIwKSA9ICh1bnNpZ25lZCBjaGFyKSAoKGZpbGwgJiAweDAwMDBmZikgPj4gMCk7Ci0rCQkJKih1Y3AgKyAzKmggKyBiMSkgPSAodW5zaWduZWQgY2hhcikgKChmaWxsICYgMHgwMGZmMDApID4+IDgpOwotKwkJCSoodWNwICsgMypoICsgYjIpID0gKHVuc2lnbmVkIGNoYXIpICgoZmlsbCAmIDB4ZmYwMDAwKSA+PiAxNik7Ci0rCQl9IGVsc2UgaWYgKGJwcCA9PSAzMikgewotKwkJCSoodWlwK2gpID0gKHVuc2lnbmVkIGludCkgICBmaWxsOwotKwkJfQotKwl9Ci0gCi0tI2lmZGVmIE1JVFNITQotLSAgaWYgKGFwcERhdGEudXNlU2htKSB7Ci0tICAgIFhTaG1QdXRJbWFnZShkcHksIGRlc2t0b3BXaW4sIGdjLCBpbWFnZSwgeCwgeSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgRmFsc2UpOwotLSAgICByZXR1cm47Ci0tICB9Ci0rCXNjciA9IGltLT5kYXRhICsgeSAqIEJwbCArIHggKiBCcHA7Ci0rCi0rCWZvciAoaCA9IDA7IGggPCBoZWlnaHQ7IGgrKykgewotKwkJbWVtY3B5KHNjciwgYnVmLCB3aWR0aEluQnl0ZXMpOwotKwkJc2NyICs9IEJwbDsKLSsJfQotKwlwdXRfaW1hZ2UoeCwgeSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMSk7Ci0rCW1heWJlX3N5bmMod2lkdGgsIGhlaWdodCk7Ci0rfQotKwotK3ZvaWQgY29weV9yZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3JjX3gsIGludCBzcmNfeSkgewotKwljaGFyICpzcmMsICpkc3Q7Ci0rCWludCBpOwotKwlYSW1hZ2UgKmltID0gaW1hZ2Vfc2NhbGUgPyBpbWFnZV9zY2FsZSA6IGltYWdlOwotKwlpbnQgQnBwID0gaW0tPmJpdHNfcGVyX3BpeGVsIC8gODsKLSsJaW50IEJwbCA9IGltLT5ieXRlc19wZXJfbGluZTsKLSsJaW50IGRpZDIgPSAwOwotKwotKyNpZiAwCi0rZnByaW50ZihzdGRlcnIsICJjb3B5X3JlY3Q6ICUwNGR4JTA0ZCslMDRkKyUwNGQgLS0gJTA0ZCAlMDRkIEJwcD0lZCBCcGw9JWRcbiIsIHdpZHRoLCBoZWlnaHQsIHgsIHksIHNyY194LCBzcmNfeSwgQnBwLCBCcGwpOwotICNlbmRpZgotLSAgWFB1dEltYWdlKGRweSwgZGVza3RvcFdpbiwgZ2MsIGltYWdlLCB4LCB5LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSsJY29weXJlY3QyOgotKwotKwlpZiAoeSA8IHNyY195KSB7Ci0rCQlzcmMgPSBpbS0+ZGF0YSArIHNyY195ICogQnBsICsgc3JjX3ggKiBCcHA7Ci0rCQlkc3QgPSBpbS0+ZGF0YSArICAgICB5ICogQnBsICsgICAgIHggKiBCcHA7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspICB7Ci0rCQkJbWVtbW92ZShkc3QsIHNyYywgQnBwICogd2lkdGgpOyAKLSsJCQlzcmMgKz0gQnBsOwotKwkJCWRzdCArPSBCcGw7Ci0rCQl9Ci0rCX0gZWxzZSB7Ci0rCQlzcmMgPSBpbS0+ZGF0YSArIChzcmNfeSArIGhlaWdodCAtIDEpICogQnBsICsgc3JjX3ggKiBCcHA7Ci0rCQlkc3QgPSBpbS0+ZGF0YSArICh5ICAgICArIGhlaWdodCAtIDEpICogQnBsICsgICAgIHggKiBCcHA7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspICB7Ci0rCQkJbWVtbW92ZShkc3QsIHNyYywgQnBwICogd2lkdGgpOyAKLSsJCQlzcmMgLT0gQnBsOwotKwkJCWRzdCAtPSBCcGw7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKGltYWdlX3NjYWxlICYmICFkaWQyKSB7Ci0rCQlpbSA9IGltYWdlOwotKwkJQnBwID0gaW0tPmJpdHNfcGVyX3BpeGVsIC8gODsKLSsJCUJwbCA9IGltLT5ieXRlc19wZXJfbGluZTsKLSsKLSsJCXggKj0gc2NhbGVfZmFjdG9yX3g7Ci0rCQl5ICo9IHNjYWxlX2ZhY3Rvcl95OwotKwkJc3JjX3ggKj0gc2NhbGVfZmFjdG9yX3g7Ci0rCQlzcmNfeSAqPSBzY2FsZV9mYWN0b3JfeTsKLSsJCXdpZHRoICA9IHNjYWxlX3JvdW5kKHdpZHRoLCAgc2NhbGVfZmFjdG9yX3gpOwotKwkJaGVpZ2h0ID0gc2NhbGVfcm91bmQoaGVpZ2h0LCBzY2FsZV9mYWN0b3JfeSk7Ci0rCi0rCQlkaWQyID0gMTsKLSsJCWdvdG8gY29weXJlY3QyOwotKwl9Ci0rfQotKwotKwotKy8qCi0rICogQ29weURhdGFUb1NjcmVlbi4KLSsgKi8KLSsKLSt2b2lkCi0rQ29weURhdGFUb1NjcmVlbihjaGFyICpidWYsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotK3sKLSsJaWYgKGFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCXJldHVybjsKLSsJfQotKwlpZiAoYXBwRGF0YS5yYXdEZWxheSAhPSAwKSB7Ci0rCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSsJCVhTeW5jKGRweSxGYWxzZSk7Ci0rCQl1c2xlZXAoYXBwRGF0YS5yYXdEZWxheSAqIDEwMDApOwotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotKwkJQ29weUJHUjIzM1RvU2NyZWVuKChDQVJEOCAqKWJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0rCX0gZWxzZSBpZiAoYXBwRGF0YS51c2VCR1I1NjUpIHsKLSsJCUNvcHlCR1I1NjVUb1NjcmVlbigoQ0FSRDE2ICopYnVmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSsJfSBlbHNlIHsKLSsJCWludCBoOwotKwkJaW50IHdpZHRoSW5CeXRlcyA9IHdpZHRoICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLSsJCWludCBzY3JXaWR0aEluQnl0ZXMgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLSsJCWNoYXIgKnNjcjsKLSsJCVhJbWFnZSAqaW0gPSBpbWFnZV9zY2FsZSA/IGltYWdlX3NjYWxlIDogaW1hZ2U7Ci0rCi0rCQlpZiAoc2NyV2lkdGhJbkJ5dGVzICE9IGltLT5ieXRlc19wZXJfbGluZSkgc2NyV2lkdGhJbkJ5dGVzID0gaW0tPmJ5dGVzX3Blcl9saW5lOwotKwotKwkJc2NyID0gKGltLT5kYXRhICsgeSAqIHNjcldpZHRoSW5CeXRlcwotKwkJICAgICsgeCAqIG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDgpOwotKwotKwkJZm9yIChoID0gMDsgaCA8IGhlaWdodDsgaCsrKSB7Ci0rCQkJbWVtY3B5KHNjciwgYnVmLCB3aWR0aEluQnl0ZXMpOwotKwkJCWJ1ZiArPSB3aWR0aEluQnl0ZXM7Ci0rCQkJc2NyICs9IHNjcldpZHRoSW5CeXRlczsKLSsJCX0KLSsJfQotKwotKwlwdXRfaW1hZ2UoeCwgeSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMCk7Ci0rCW1heWJlX3N5bmMod2lkdGgsIGhlaWdodCk7Ci0gfQotIAotIAotQEAgLTQwMSw2MiArMjc1NSwzMzggQEAKLSBzdGF0aWMgdm9pZAotIENvcHlCR1IyMzNUb1NjcmVlbihDQVJEOCAqYnVmLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSB7Ci0tICBpbnQgcCwgcTsKLS0gIGludCB4b2ZmID0gNyAtICh4ICYgNyk7Ci0tICBpbnQgeGN1cjsKLS0gIGludCBmYndiID0gc2kuZnJhbWVidWZmZXJXaWR0aCAvIDg7Ci0tICBDQVJEOCAqc2NyMSA9ICgoQ0FSRDggKilpbWFnZS0+ZGF0YSkgKyB5ICogZmJ3YiArIHggLyA4OwotLSAgQ0FSRDggKnNjcnQ7Ci0tICBDQVJEOCAqc2NyOCA9ICgoQ0FSRDggKilpbWFnZS0+ZGF0YSkgKyB5ICogc2kuZnJhbWVidWZmZXJXaWR0aCArIHg7Ci0tICBDQVJEMTYgKnNjcjE2ID0gKChDQVJEMTYgKilpbWFnZS0+ZGF0YSkgKyB5ICogc2kuZnJhbWVidWZmZXJXaWR0aCArIHg7Ci0tICBDQVJEMzIgKnNjcjMyID0gKChDQVJEMzIgKilpbWFnZS0+ZGF0YSkgKyB5ICogc2kuZnJhbWVidWZmZXJXaWR0aCArIHg7Ci0rCVhJbWFnZSAqaW0gPSBpbWFnZV9zY2FsZSA/IGltYWdlX3NjYWxlIDogaW1hZ2U7Ci0rCWludCBwLCBxOwotKwlpbnQgeG9mZiA9IDcgLSAoeCAmIDcpOwotKwlpbnQgeGN1cjsKLSsJaW50IGZid2IgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC8gODsKLSsJaW50IHNyY193aWR0aDggID0gaW0tPmJ5dGVzX3Blcl9saW5lLzE7Ci0rCWludCBzcmNfd2lkdGgxNiA9IGltLT5ieXRlc19wZXJfbGluZS8yOwotKwlpbnQgc3JjX3dpZHRoMzIgPSBpbS0+Ynl0ZXNfcGVyX2xpbmUvNDsKLSsJQ0FSRDggKnNyYzEgPSAoKENBUkQ4ICopaW0tPmRhdGEpICsgeSAqIGZid2IgKyB4IC8gODsKLSsJQ0FSRDggKnNyY3Q7Ci0rCUNBUkQ4ICAqc3JjOCAgPSAoIChDQVJEOCAqKWltLT5kYXRhKSArIHkgKiBzcmNfd2lkdGg4ICArIHg7Ci0rCUNBUkQxNiAqc3JjMTYgPSAoKENBUkQxNiAqKWltLT5kYXRhKSArIHkgKiBzcmNfd2lkdGgxNiArIHg7Ci0rCUNBUkQzMiAqc3JjMzIgPSAoKENBUkQzMiAqKWltLT5kYXRhKSArIHkgKiBzcmNfd2lkdGgzMiArIHg7Ci0rCWludCBiMCwgYjEsIGIyOwotIAotLSAgc3dpdGNoICh2aXNicHApIHsKLSsJc3dpdGNoICh2aXNicHApIHsKLSAKLSAgICAgLyogdGhhbmtzIHRvIENocmlzIEhvb3BlciBmb3Igc2luZ2xlIGJwcCBzdXBwb3J0ICovCi0gCi0tICBjYXNlIDE6Ci0tICAgIGZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotLSAgICAgIHhjdXIgPSB4b2ZmOwotLSAgICAgIHNjcnQgPSBzY3IxOwotLSAgICAgIGZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0tCSpzY3J0ID0gKCgqc2NydCAmIH4oMSA8PCB4Y3VyKSkKLS0JCSB8IChCR1IyMzNUb1BpeGVsWyooYnVmKyspXSA8PCB4Y3VyKSk7Ci0tCi0tCWlmICh4Y3VyLS0gPT0gMCkgewotLQkgIHhjdXIgPSA3OwotLQkgIHNjcnQrKzsKLS0JfQotLSAgICAgIH0KLS0gICAgICBzY3IxICs9IGZid2I7Ci0tICAgIH0KLS0gICAgYnJlYWs7Ci0tCi0tICBjYXNlIDg6Ci0tICAgIGZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotLSAgICAgIGZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0tCSooc2NyOCsrKSA9IEJHUjIzM1RvUGl4ZWxbKihidWYrKyldOwotLSAgICAgIH0KLS0gICAgICBzY3I4ICs9IHNpLmZyYW1lYnVmZmVyV2lkdGggLSB3aWR0aDsKLS0gICAgfQotLSAgICBicmVhazsKLS0KLS0gIGNhc2UgMTY6Ci0tICAgIGZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotLSAgICAgIGZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0tCSooc2NyMTYrKykgPSBCR1IyMzNUb1BpeGVsWyooYnVmKyspXTsKLS0gICAgICB9Ci0tICAgICAgc2NyMTYgKz0gc2kuZnJhbWVidWZmZXJXaWR0aCAtIHdpZHRoOwotLSAgICB9Ci0tICAgIGJyZWFrOwotLQotLSAgY2FzZSAzMjoKLS0gICAgZm9yIChxID0gMDsgcSA8IGhlaWdodDsgcSsrKSB7Ci0tICAgICAgZm9yIChwID0gMDsgcCA8IHdpZHRoOyBwKyspIHsKLS0JKihzY3IzMisrKSA9IEJHUjIzM1RvUGl4ZWxbKihidWYrKyldOwotLSAgICAgIH0KLS0gICAgICBzY3IzMiArPSBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0gd2lkdGg7Ci0tICAgIH0KLS0gICAgYnJlYWs7Ci0tICB9Ci0rCWNhc2UgMToKLSsJCWZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotKwkJCXhjdXIgPSB4b2ZmOwotKwkJCXNyY3QgPSBzcmMxOwotKwkJCWZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0rCQkJCSpzcmN0ID0gKCgqc3JjdCAmIH4oMSA8PCB4Y3VyKSkKLSsJCQkJCSB8IChCR1IyMzNUb1BpeGVsWyooYnVmKyspXSA8PCB4Y3VyKSk7Ci0rCi0rCQkJCWlmICh4Y3VyLS0gPT0gMCkgewotKwkJCQkJeGN1ciA9IDc7Ci0rCQkJCQlzcmN0Kys7Ci0rCQkJCX0KLSsJCQl9Ci0rCQkJc3JjMSArPSBmYndiOwotKwkJfQotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgODoKLSsJCWZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotKwkJCWZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0rCQkJCSooc3JjOCsrKSA9IEJHUjIzM1RvUGl4ZWxbKihidWYrKyldOwotKwkJCX0KLSsJCQlzcmM4ICs9IHNyY193aWR0aDggLSB3aWR0aDsKLSsJCX0KLSsJCWJyZWFrOwotKwotKwljYXNlIDE2OgotKwkJZm9yIChxID0gMDsgcSA8IGhlaWdodDsgcSsrKSB7Ci0rCQkJZm9yIChwID0gMDsgcCA8IHdpZHRoOyBwKyspIHsKLSsJCQkJKihzcmMxNisrKSA9IEJHUjIzM1RvUGl4ZWxbKihidWYrKyldOwotKwkJCX0KLSsJCQlzcmMxNiArPSBzcmNfd2lkdGgxNiAtIHdpZHRoOwotKwkJfQotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgMjQ6Ci0rCQlpZiAoaXNMU0IpIHsKLSsJCQliMCA9IDA7IGIxID0gMTsgYjIgPSAyOwotKwkJfSBlbHNlIHsKLSsJCQliMCA9IDI7IGIxID0gMTsgYjIgPSAwOwotKwkJfQotKwkJc3JjOCAgPSAoKENBUkQ4ICopaW0tPmRhdGEpICsgKHkgKiBzaS5mcmFtZWJ1ZmZlcldpZHRoICsgeCkgKiAzOwotKwkJZm9yIChxID0gMDsgcSA8IGhlaWdodDsgcSsrKSB7Ci0rCQkJZm9yIChwID0gMDsgcCA8IHdpZHRoOyBwKyspIHsKLSsJCQkJQ0FSRDMyIHYgPSBCR1IyMzNUb1BpeGVsWyooYnVmKyspXTsKLSsJCQkJKihzcmM4ICsgYjApID0gKHVuc2lnbmVkIGNoYXIpICgodiAmIDB4MDAwMGZmKSA+PiAwKTsKLSsJCQkJKihzcmM4ICsgYjEpID0gKHVuc2lnbmVkIGNoYXIpICgodiAmIDB4MDBmZjAwKSA+PiA4KTsKLSsJCQkJKihzcmM4ICsgYjIpID0gKHVuc2lnbmVkIGNoYXIpICgodiAmIDB4ZmYwMDAwKSA+PiAxNik7Ci0rCQkJCXNyYzggKz0gMzsKLSsJCQl9Ci0rCQkJc3JjOCArPSAoc2kuZnJhbWVidWZmZXJXaWR0aCAtIHdpZHRoKSAqIDM7Ci0rCQl9Ci0rCQlicmVhazsKLSsKLSsJY2FzZSAzMjoKLSsJCWZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotKwkJCWZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0rCQkJCSooc3JjMzIrKykgPSBCR1IyMzNUb1BpeGVsWyooYnVmKyspXTsKLSsJCQl9Ci0rCQkJc3JjMzIgKz0gc3JjX3dpZHRoMzIgLSB3aWR0aDsKLSsJCX0KLSsJCWJyZWFrOwotKwl9Ci0rfQotKwotK3N0YXRpYyB2b2lkCi0rQkdSNTY1XzI0YnBwKENBUkQxNiAqYnVmLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSt7Ci0rCWludCBwLCBxOwotKwlpbnQgYjAsIGIxLCBiMjsKLSsJWEltYWdlICppbSA9IGltYWdlX3NjYWxlID8gaW1hZ2Vfc2NhbGUgOiBpbWFnZTsKLSsJdW5zaWduZWQgY2hhciAqc3JjPSAodW5zaWduZWQgY2hhciAqKWltLT5kYXRhICsgKHkgKiBzaS5mcmFtZWJ1ZmZlcldpZHRoICsgeCkgKiAzOwotKwotKwlpZiAoaXNMU0IpIHsKLSsJCWIwID0gMDsgYjEgPSAxOyBiMiA9IDI7Ci0rCX0gZWxzZSB7Ci0rCQliMCA9IDI7IGIxID0gMTsgYjIgPSAwOwotKwl9Ci0rCi0rCS8qICBjYXNlIDI0OiAqLwotKwlmb3IgKHEgPSAwOyBxIDwgaGVpZ2h0OyBxKyspIHsKLSsJCWZvciAocCA9IDA7IHAgPCB3aWR0aDsgcCsrKSB7Ci0rCQkJQ0FSRDMyIHYgPSBCR1I1NjVUb1BpeGVsWyooYnVmKyspXTsKLSsJCQkqKHNyYyArIGIwKSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgJiAweDAwMDBmZikgPj4gMCk7Ci0rCQkJKihzcmMgKyBiMSkgPSAodW5zaWduZWQgY2hhcikgKCh2ICYgMHgwMGZmMDApID4+IDgpOwotKwkJCSooc3JjICsgYjIpID0gKHVuc2lnbmVkIGNoYXIpICgodiAmIDB4ZmYwMDAwKSA+PiAxNik7Ci0rCQkJc3JjICs9IDM7Ci0rCQl9Ci0rCQlzcmMgKz0gKHNpLmZyYW1lYnVmZmVyV2lkdGggLSB3aWR0aCkgKiAzOwotKwl9Ci0rfQotKwotK3N0YXRpYyB2b2lkCi0rQ29weUJHUjU2NVRvU2NyZWVuKENBUkQxNiAqYnVmLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSt7Ci0rCWludCBwLCBxOwotKwlYSW1hZ2UgKmltID0gaW1hZ2Vfc2NhbGUgPyBpbWFnZV9zY2FsZSA6IGltYWdlOwotKwlpbnQgc3JjX3dpZHRoMzIgPSBpbS0+Ynl0ZXNfcGVyX2xpbmUvNDsKLSsJQ0FSRDMyICpzcmMzMiA9ICgoQ0FSRDMyICopaW0tPmRhdGEpICsgeSAqIHNyY193aWR0aDMyICsgeDsKLSsKLSsJaWYgKHZpc2JwcCA9PSAyNCkgewotKwkJQkdSNTY1XzI0YnBwKGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJLyogIGNhc2UgMzI6ICovCi0rCWZvciAocSA9IDA7IHEgPCBoZWlnaHQ7IHErKykgewotKwkJZm9yIChwID0gMDsgcCA8IHdpZHRoOyBwKyspIHsKLSsJCQkqKHNyYzMyKyspID0gQkdSNTY1VG9QaXhlbFsqKGJ1ZisrKV07Ci0rCQl9Ci0rCQlzcmMzMiArPSBzcmNfd2lkdGgzMiAtIHdpZHRoOwotKwl9Ci0rfQotKwotK3N0YXRpYyB2b2lkIHJlc2V0X2ltYWdlKHZvaWQpIHsKLSsJaWYgKFVzaW5nU2htKCkpIHsKLSsJCVNobURldGFjaCgpOwotKwl9Ci0rCWlmIChpbWFnZSAmJiBpbWFnZS0+ZGF0YSkgewotKwkJWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInJlc2V0X2ltYWdlOiBkZXN0cm95ZWQgJ2ltYWdlJ1xuIik7Ci0rCX0KLSsJaW1hZ2UgPSBOVUxMOwotKwlpZiAoaW1hZ2VfeWNyb3AgJiYgaW1hZ2VfeWNyb3AtPmRhdGEpIHsKLSsJCVhEZXN0cm95SW1hZ2UoaW1hZ2VfeWNyb3ApOwotKwkJZnByaW50ZihzdGRlcnIsICJyZXNldF9pbWFnZTogZGVzdHJveWVkICdpbWFnZV95Y3JvcCdcbiIpOwotKwl9Ci0rCWltYWdlX3ljcm9wID0gTlVMTDsKLSsJaWYgKGltYWdlX3NjYWxlICYmIGltYWdlX3NjYWxlLT5kYXRhKSB7Ci0rCQlYRGVzdHJveUltYWdlKGltYWdlX3NjYWxlKTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVzZXRfaW1hZ2U6IGRlc3Ryb3llZCAnaW1hZ2Vfc2NhbGUnXG4iKTsKLSsJfQotKwlpbWFnZV9zY2FsZSA9IE5VTEw7Ci0rCi0rCWlmIChVc2luZ1NobSgpKSB7Ci0rCQlTaG1DbGVhbnVwKCk7Ci0rCX0KLSsJY3JlYXRlX2ltYWdlKCk7Ci0rCVhGbHVzaChkcHkpOwotK30KLSsKLSt2b2lkIFJlRG9EZXNrdG9wKHZvaWQpIHsKLSsJaW50IHcsIHcwLCBoLCBoMCwgeCwgeSwgZHcsIGRoOwotKwlpbnQgZnMgPSAwOwotKwlpbnQgYXV0b3NjYWxlID0gMDsKLSsJUG9zaXRpb24geF9vcmlnLCB5X29yaWc7Ci0rCURpbWVuc2lvbiB3X29yaWcsIGhfb3JpZzsKLSsKLSsJaWYgKCFhcHBEYXRhLmZ1bGxTY3JlZW4gJiYgYXBwRGF0YS5zY2FsZSAhPSBOVUxMICYmICFzdHJjbXAoYXBwRGF0YS5zY2FsZSwgImF1dG8iKSkgewotKwkJYXV0b3NjYWxlID0gMTsKLSsJfQotKwotKwlmcHJpbnRmKHN0ZGVyciwgIlJlRG9EZXNrdG9wOiB5Y3JvcDogJWRcbiIsIGFwcERhdGEueUNyb3ApOwotKwotKwlYdFZhR2V0VmFsdWVzKHRvcGxldmVsLCBYdE54LCAmeF9vcmlnLCBYdE55LCAmeV9vcmlnLCBOVUxMKTsKLSsJWHRWYUdldFZhbHVlcyh0b3BsZXZlbCwgWHROaGVpZ2h0LCAmaF9vcmlnLCBYdE53aWR0aCwgJndfb3JpZywgTlVMTCk7Ci0rCi0rCWNoZWNrX3RhbGwoKTsKLSsKLSsJaWYgKGFwcERhdGEueUNyb3ApIHsKLSsJCWlmIChhcHBEYXRhLnlDcm9wIDwgMCB8fCBvbGRfd2lkdGggPD0gMCkgewotKwkJCWFwcERhdGEueUNyb3AgPSBndWVzc0Nyb3AoKTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlNldCAteWNyb3AgdG86ICVkXG4iLCBhcHBEYXRhLnlDcm9wKTsKLSsJCX0gZWxzZSB7Ci0rCQkJaW50IHcxID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCQlhcHBEYXRhLnlDcm9wID0gKHcxICogYXBwRGF0YS55Q3JvcCkgLyBvbGRfd2lkdGg7Ci0rCQkJaWYgKGFwcERhdGEueUNyb3AgPD0gMTAwKSAgewotKwkJCQlhcHBEYXRhLnlDcm9wID0gZ3Vlc3NDcm9wKCk7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiU2V0IHNtYWxsIC15Y3JvcCB0bzogJWRcbiIsIGFwcERhdGEueUNyb3ApOwotKwkJCX0KLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgLXljcm9wOiAlZFxuIiwgYXBwRGF0YS55Q3JvcCk7Ci0rCX0KLSsKLSsJb2xkX3dpZHRoICA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCW9sZF9oZWlnaHQgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJaWYgKGFwcERhdGEuZnVsbFNjcmVlbikgewotKwkJaWYgKHByZXZfZmJfd2lkdGggIT0gc2kuZnJhbWVidWZmZXJXaWR0aCB8fCBwcmV2X2ZiX2hlaWdodCAhPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCkgewotKwkJCWludCB4bWF4ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCQlpbnQgeW1heCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJCWlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJCQl5bWF4ID0gYXBwRGF0YS55Q3JvcDsKLSsJCQl9Ci0rCQkJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQkJCXhtYXggPSBzY2FsZV9yb3VuZCh4bWF4LCBzY2FsZV9mYWN0b3JfeCk7Ci0rCQkJCXltYXggPSBzY2FsZV9yb3VuZCh5bWF4LCBzY2FsZV9mYWN0b3JfeSk7Ci0rCQkJfQotKwkJCWlmICh4bWF4IDwgZHB5V2lkdGggfHwgeW1heCA8IGRweUhlaWdodCkgewotKwkJCQlGdWxsU2NyZWVuT2ZmKCk7Ci0rCQkJCWZzID0gMTsKLSsJCQl9Ci0rCQl9Ci0rCX0KLSsKLSsJcHJldl9mYl93aWR0aCAgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwlwcmV2X2ZiX2hlaWdodCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCi0rCQlpbnQgeG1heCA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCQlpbnQgeW1heCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQkJeG1heCA9IHNjYWxlX3JvdW5kKHhtYXgsIHNjYWxlX2ZhY3Rvcl94KTsKLSsJCQl5bWF4ID0gc2NhbGVfcm91bmQoeW1heCwgc2NhbGVfZmFjdG9yX3kpOwotKwkJfQotKwotKwkJaWYgKGltYWdlICYmIGltYWdlLT5kYXRhKSB7Ci0rCQkJaW50IGxlbjsKLSsJCQlpbnQgaCA9IGltYWdlLT5oZWlnaHQ7Ci0rCQkJaW50IHcgPSBpbWFnZS0+d2lkdGg7Ci0rCQkJbGVuID0gaW1hZ2UtPmJ5dGVzX3Blcl9saW5lICogaW1hZ2UtPmhlaWdodDsKLSsJCQkvKiBibGFjayBvdXQgd2luZG93IGZpcnN0OiAqLwotKwkJCW1lbXNldChpbWFnZS0+ZGF0YSwgMCwgbGVuKTsKLSsgIAkJCVhQdXRJbWFnZShkcHksIFh0V2luZG93KGRlc2t0b3ApLCBnYywgaW1hZ2UsIDAsIDAsIDAsIDAsIHcsIGgpOwotKwkJCVhGbHVzaChkcHkpOwotKwkJfQotKwotKwkJLyogWFhYIHNjYWxpbmc/PyAqLwotKwkJWHRSZXNpemVXaWRnZXQoZGVza3RvcCwgeG1heCwgeW1heCwgMCk7Ci0rCi0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCXVzbGVlcCgxMDAqMTAwMCk7Ci0rCQlGdWxsU2NyZWVuT24oKTsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJdXNsZWVwKDEwMCoxMDAwKTsKLSsJCXJlc2V0X2ltYWdlKCk7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJZHcgPSBhcHBEYXRhLndtRGVjb3JhdGlvbldpZHRoOwotKwlkaCA9IGFwcERhdGEud21EZWNvcmF0aW9uSGVpZ2h0OwotKwotKwl3ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJaCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwl3MCA9IHc7Ci0rCWgwID0gaDsKLSsJaWYgKGFwcERhdGEueUNyb3AgPiAwKSB7Ci0rCQloID0gYXBwRGF0YS55Q3JvcDsKLSsJfQotKwlpZiAoaW1hZ2Vfc2NhbGUpIHsKLSsJCXcgPSBzY2FsZV9yb3VuZCh3LCBzY2FsZV9mYWN0b3JfeCk7Ci0rCQloID0gc2NhbGVfcm91bmQoaCwgc2NhbGVfZmFjdG9yX3kpOwotKwkJdzAgPSBzY2FsZV9yb3VuZCh3MCwgc2NhbGVfZmFjdG9yX3gpOwotKwkJaDAgPSBzY2FsZV9yb3VuZChoMCwgc2NhbGVfZmFjdG9yX3kpOwotKwl9Ci0rCi0rCWlmICh3ICsgZHcgPj0gZHB5V2lkdGgpIHsKLSsJCXcgPSBkcHlXaWR0aCAtIGR3OwotKwl9Ci0rCWlmIChoICsgZGggPj0gZHB5SGVpZ2h0KSB7Ci0rCQloID0gZHB5SGVpZ2h0IC0gZGg7Ci0rCX0KLSsKLSsJaWYgKCFhdXRvc2NhbGUpIHsKLSsJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm1heFdpZHRoLCB3LCBYdE5tYXhIZWlnaHQsIGgsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHRObWF4V2lkdGgsIGRweVdpZHRoLCBYdE5tYXhIZWlnaHQsIGRweUhlaWdodCwgTlVMTCk7Ci0rCX0KLSsKLSsJWHRWYVNldFZhbHVlcyhkZXNrdG9wLCBYdE53aWR0aCwgdzAsIFh0TmhlaWdodCwgaDAsIE5VTEwpOwotKwotKwlYdFJlc2l6ZVdpZGdldChkZXNrdG9wLCB3MCwgaDAsIDApOwotKwotKwlpZiAoYXBwRGF0YS55Q3JvcCA+IDApIHsKLSsJCWludCB5Y3JvcCA9IGFwcERhdGEueUNyb3A7Ci0rCQlpZiAoaW1hZ2Vfc2NhbGUpIHsKLSsJCQl5Y3JvcCAqPSBzY2FsZV9mYWN0b3JfeTsKLSsJCX0KLSsJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm1heEhlaWdodCwgeWNyb3AsIE5VTEwpOwotKwkJWHRWYVNldFZhbHVlcyhmb3JtLCAgICAgWHRObWF4SGVpZ2h0LCB5Y3JvcCwgTlVMTCk7Ci0rCX0KLSsKLSsJeCA9IChkcHlXaWR0aCAgLSB3IC0gZHcpLzI7Ci0rCXkgPSAoZHB5SGVpZ2h0IC0gaCAtIGRoKS8yOwotKwotKwlpZiAoIWF1dG9zY2FsZSkgewotKwotKwkJaWYgKCFnZXRlbnYoIlZOQ1ZJRVdFUl9BTFdBWVNfUkVDRU5URVIiKSkgewotKwkJCWludCB4X2NtX29sZCwgeV9jbV9vbGQ7Ci0rCQkJaW50IHhfY21fbmV3LCB5X2NtX25ldzsKLSsJCQlpbnQgeF90cnksIHlfdHJ5OwotKwotKwkJCXhfY21fb2xkID0gKGludCkgeF9vcmlnICsgKChpbnQpIHdfb3JpZykvMjsKLSsJCQl5X2NtX29sZCA9IChpbnQpIHlfb3JpZyArICgoaW50KSBoX29yaWcpLzI7Ci0rCi0rCQkJeF9jbV9uZXcgPSBkcHlXaWR0aC8yOwotKwkJCXlfY21fbmV3ID0gZHB5SGVpZ2h0LzI7Ci0rCi0rCQkJeF90cnkgPSB4ICsgKHhfY21fb2xkIC0geF9jbV9uZXcpOwotKwkJCXlfdHJ5ID0geSArICh5X2NtX29sZCAtIHlfY21fbmV3KTsKLSsJCQlpZiAoeF90cnkgPCAwKSB7Ci0rCQkJCXhfdHJ5ID0gMDsKLSsJCQl9Ci0rCQkJaWYgKHlfdHJ5IDwgMCkgewotKwkJCQl5X3RyeSA9IDA7Ci0rCQkJfQotKwkJCWlmICh4X3RyeSArIHcgKyBkdyA+IGRweVdpZHRoKSB7Ci0rCQkJCXhfdHJ5ID0gZHB5V2lkdGggLSB3IC0gZHc7Ci0rCQkJfQotKwkJCWlmICh5X3RyeSArIGggKyBkaCA+IGRweUhlaWdodCkgewotKwkJCQl5X3RyeSA9IGRweUhlaWdodCAtIGggLSBkaDsKLSsJCQl9Ci0rCQkJeCA9IHhfdHJ5OwotKwkJCXkgPSB5X3RyeTsKLSsJCX0KLSsKLSsJCVh0Q29uZmlndXJlV2lkZ2V0KHRvcGxldmVsLCB4ICsgZHcsIHkgKyBkaCwgdywgaCwgMCk7Ci0rCX0KLSsKLSsJcmVzZXRfaW1hZ2UoKTsKLSsKLSsJaWYgKGZzKSB7Ci0rCQlGdWxsU2NyZWVuT24oKTsKLSsJfQotIH0KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2RpYWxvZ3MuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvZGlhbG9ncy5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvZGlhbG9ncy5jCTIwMDAtMTAtMjYgMTU6MTk6MTkuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2RpYWxvZ3MuYwkyMDEwLTAyLTI1IDIyOjMzOjA2LjAwMDAwMDAwMCAtMDUwMAotQEAgLTI1LDc1ICsyNSw1NjQgQEAKLSAjaW5jbHVkZSA8WDExL1hhdy9EaWFsb2cuaD4KLSAKLSBzdGF0aWMgQm9vbCBzZXJ2ZXJEaWFsb2dEb25lID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgdXNlckRpYWxvZ0RvbmUgPSBGYWxzZTsKLSBzdGF0aWMgQm9vbCBwYXNzd29yZERpYWxvZ0RvbmUgPSBGYWxzZTsKLStzdGF0aWMgQm9vbCB5Y3JvcERpYWxvZ0RvbmUgPSBGYWxzZTsKLStzdGF0aWMgQm9vbCBzY2FsZURpYWxvZ0RvbmUgPSBGYWxzZTsKLStzdGF0aWMgQm9vbCBlc2NhcGVEaWFsb2dEb25lID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgc2NiYXJEaWFsb2dEb25lID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgc2NhbGVORGlhbG9nRG9uZSA9IEZhbHNlOwotK3N0YXRpYyBCb29sIHF1YWxpdHlEaWFsb2dEb25lID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgY29tcHJlc3NEaWFsb2dEb25lID0gRmFsc2U7Ci0rCi0rZXh0ZXJuIHZvaWQgcG9wdXBGaXhlcihXaWRnZXQgd2lkKTsKLSsKLStpbnQgdXNlX3R0eSh2b2lkKSB7Ci0rCWlmIChhcHBEYXRhLm5vdHR5KSB7Ci0rCQlyZXR1cm4gMDsKLSsJfSBlbHNlIGlmICghaXNhdHR5KDApKSB7Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwlyZXR1cm4gMTsKLSt9Ci0rCi0rdm9pZAotK1NjYWxlRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJc2NhbGVEaWFsb2dEb25lID0gVHJ1ZTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStFc2NhcGVEaWFsb2dEb25lKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwllc2NhcGVEaWFsb2dEb25lID0gVHJ1ZTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQgZGlhbG9nX292ZXIoV2lkZ2V0IHdpZCkgewotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlpZiAoIW5ldF93bV9zdXBwb3J0ZWQoKSkgewotKwkJCVh0VmFTZXRWYWx1ZXMod2lkLCBYdE5vdmVycmlkZVJlZGlyZWN0LCBUcnVlLCBOVUxMKTsKLSsJCQlYU3luYyhkcHksIFRydWUpOwotKwkJfQotKwl9CQotK30KLSsKLStleHRlcm4gaW50IFhFcnJvcl9pZ247Ci0rCi0rdm9pZCBkaWFsb2dfaW5wdXQoV2lkZ2V0IHdpZCkgewotKwlYRXJyb3JfaWduID0gMTsKLSsJWFNldElucHV0Rm9jdXMoZHB5LCBYdFdpbmRvdyh3aWQpLCBSZXZlcnRUb1BhcmVudCwgQ3VycmVudFRpbWUpOwotKwlYU3luYyhkcHksIEZhbHNlKTsKLSsJdXNsZWVwKDMwICogMTAwMCk7Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotKwl1c2xlZXAoMjAgKiAxMDAwKTsKLSsJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCVhFcnJvcl9pZ24gPSAwOwotK30KLSsKLStzdGF0aWMgdm9pZCBybU5MKGNoYXIgKnMpIHsKLSsJaW50IGxlbjsKLSsJaWYgKHMgPT0gTlVMTCkgewotKwkJcmV0dXJuOwotKwl9Ci0rCWxlbiA9IHN0cmxlbihzKTsKLSsJaWYgKGxlbiA+IDAgJiYgc1tsZW4tMV0gPT0gJ1xuJykgewotKwkJc1tsZW4tMV0gPSAnXDAnOwotKwl9Ci0rfQotKwotK3N0YXRpYyB2b2lkIHdtX2RlbGV0ZShXaWRnZXQgdywgY2hhciAqZnVuYykgewotKwljaGFyIHN0clsxMDI0XTsKLSsJQXRvbSB3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKGRweSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Ci0rCVhTZXRXTVByb3RvY29scyhkcHksIFh0V2luZG93KHcpLCAmd21EZWxldGVXaW5kb3csIDEpOwotKwlpZiAoZnVuYykgewotKwkJc3ByaW50ZihzdHIsICI8TWVzc2FnZT5XTV9QUk9UT0NPTFM6ICVzIiwgZnVuYyk7Ci0rCQlYdE92ZXJyaWRlVHJhbnNsYXRpb25zKHcsIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlIChzdHIpKTsKLSsJfQotK30KLSsKLStzdGF0aWMgdm9pZCB4dG1vdmUoV2lkZ2V0IHcpIHsKLSsJWHRNb3ZlV2lkZ2V0KHcsIFdpZHRoT2ZTY3JlZW4oWHRTY3JlZW4odykpKjIvNSwgSGVpZ2h0T2ZTY3JlZW4oWHRTY3JlZW4odykpKjIvNSk7Ci0rfQotKwotK2NoYXIgKgotK0RvU2NhbGVEaWFsb2coKQotK3sKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICpzY2FsZVZhbHVlOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSsKLSsJcHNoZWxsID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInNjYWxlRGlhbG9nIiwgdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywKLSsJCQkJdG9wbGV2ZWwsIE5VTEwpOwotKwlkaWFsb2cgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlhbG9nIiwgZGlhbG9nV2lkZ2V0Q2xhc3MsIHBzaGVsbCwgTlVMTCk7Ci0rCi0rCWRpYWxvZ19vdmVyKHBzaGVsbCk7Ci0rCi0rCWlmICgwKSBYdE1vdmVXaWRnZXQocHNoZWxsLCBXaWR0aE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSwgSGVpZ2h0T2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81KTsKLSsJWHRQb3B1cChwc2hlbGwsIFh0R3JhYk5vbmV4Y2x1c2l2ZSk7Ci0rCVh0UmVhbGl6ZVdpZGdldChwc2hlbGwpOwotKwotKwlpZiAoYXBwRGF0YS5zY2FsZSAhPSBOVUxMKSB7Ci0rCQlTdHJpbmcgbGFiZWw7Ci0rCQljaGFyIHRtcFs0MTBdOwotKwkJWHRWYUdldFZhbHVlcyhkaWFsb2csIFh0TmxhYmVsLCAmbGFiZWwsIE5VTEwpOwotKwkJaWYgKHN0cmxlbihsYWJlbCkgKyBzdHJsZW4oYXBwRGF0YS5zY2FsZSkgPCA0MDApIHsKLSsJCQlzcHJpbnRmKHRtcCwgIiVzICVzIiwgbGFiZWwsIGFwcERhdGEuc2NhbGUpOwotKwkJCVh0VmFTZXRWYWx1ZXMoZGlhbG9nLCBYdE5sYWJlbCwgdG1wLCBOVUxMKTsKLSsJCX0KLSsJfQotKwotKwotKwlpZiAoMSAmJiBhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCQlwb3B1cEZpeGVyKHBzaGVsbCk7Ci0rCX0gZWxzZSB7Ci0rCQl4dG1vdmUocHNoZWxsKTsKLSsJfQotKwlkaWFsb2dfaW5wdXQocHNoZWxsKTsKLSsJd21fZGVsZXRlKHBzaGVsbCwgIlNjYWxlRGlhbG9nRG9uZSgpIik7Ci0rCi0rCXNjYWxlRGlhbG9nRG9uZSA9IEZhbHNlOwotKwotKwl3aGlsZSAoIXNjYWxlRGlhbG9nRG9uZSkgewotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsKLSsJdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotKwlybU5MKHZhbHVlU3RyaW5nKTsKLSsJc2NhbGVWYWx1ZSA9IFh0TmV3U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSsKLSsJWHRQb3Bkb3duKHBzaGVsbCk7Ci0rCXJldHVybiBzY2FsZVZhbHVlOwotK30KLSsKLStjaGFyICoKLStEb0VzY2FwZUtleXNEaWFsb2coKQotK3sKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICplc2NhcGVWYWx1ZTsKLSsJY2hhciAqdmFsdWVTdHJpbmc7Ci0rCWNoYXIgKmN1cnIgPSBhcHBEYXRhLmVzY2FwZUtleXMgPyBhcHBEYXRhLmVzY2FwZUtleXMgOiAiZGVmYXVsdCI7Ci0rCi0rCXBzaGVsbCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJlc2NhcGVEaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotKwkJCQl0b3BsZXZlbCwgTlVMTCk7Ci0rCWRpYWxvZyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2ciLCBkaWFsb2dXaWRnZXRDbGFzcywgcHNoZWxsLCBOVUxMKTsKLSsKLSsJZGlhbG9nX292ZXIocHNoZWxsKTsKLSsKLSsJaWYoMCkgWHRNb3ZlV2lkZ2V0KHBzaGVsbCwgV2lkdGhPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUsIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0rCVh0UG9wdXAocHNoZWxsLCBYdEdyYWJOb25leGNsdXNpdmUpOwotKwlYdFJlYWxpemVXaWRnZXQocHNoZWxsKTsKLSsKLSsJaWYgKGN1cnIgIT0gTlVMTCkgewotKwkJU3RyaW5nIGxhYmVsOwotKwkJY2hhciB0bXBbMzAxMF07Ci0rCQlYdFZhR2V0VmFsdWVzKGRpYWxvZywgWHRObGFiZWwsICZsYWJlbCwgTlVMTCk7Ci0rCQlpZiAoc3RybGVuKGxhYmVsKSArIHN0cmxlbihjdXJyKSA8IDMwMDApIHsKLSsJCQlzcHJpbnRmKHRtcCwgIiVzICVzIiwgbGFiZWwsIGN1cnIpOwotKwkJCVh0VmFTZXRWYWx1ZXMoZGlhbG9nLCBYdE5sYWJlbCwgdG1wLCBOVUxMKTsKLSsJCX0KLSsJfQotKwotKwlpZiAoYXBwRGF0YS5wb3B1cEZpeCkgewotKwkJcG9wdXBGaXhlcihwc2hlbGwpOwotKwl9IGVsc2UgewotKwkJLyogdG9vIGJpZyAqLwotKwkJaWYgKDApIHh0bW92ZShwc2hlbGwpOwotKwl9Ci0rCWRpYWxvZ19pbnB1dChwc2hlbGwpOwotKwl3bV9kZWxldGUocHNoZWxsLCAiRXNjYXBlRGlhbG9nRG9uZSgpIik7Ci0rCi0rCWVzY2FwZURpYWxvZ0RvbmUgPSBGYWxzZTsKLSsKLSsJd2hpbGUgKCFlc2NhcGVEaWFsb2dEb25lKSB7Ci0rCQlYdEFwcFByb2Nlc3NFdmVudChhcHBDb250ZXh0LCBYdElNQWxsKTsKLSsJfQotKwotKwl2YWx1ZVN0cmluZyA9IFhhd0RpYWxvZ0dldFZhbHVlU3RyaW5nKGRpYWxvZyk7Ci0rCXJtTkwodmFsdWVTdHJpbmcpOwotKwllc2NhcGVWYWx1ZSA9IFh0TmV3U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSsKLSsJWHRQb3Bkb3duKHBzaGVsbCk7Ci0rCXJldHVybiBlc2NhcGVWYWx1ZTsKLSt9Ci0rCi0rdm9pZAotK1lDcm9wRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJeWNyb3BEaWFsb2dEb25lID0gVHJ1ZTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK2NoYXIgKgotK0RvWUNyb3BEaWFsb2coKQotK3sKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICp5Y3JvcFZhbHVlOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSsKLSsJcHNoZWxsID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInljcm9wRGlhbG9nIiwgdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywKLSsJCQkJdG9wbGV2ZWwsIE5VTEwpOwotKwlkaWFsb2cgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlhbG9nIiwgZGlhbG9nV2lkZ2V0Q2xhc3MsIHBzaGVsbCwgTlVMTCk7Ci0rCi0rCWRpYWxvZ19vdmVyKHBzaGVsbCk7Ci0rCi0rCWlmKDApIFh0TW92ZVdpZGdldChwc2hlbGwsIFdpZHRoT2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81LCBIZWlnaHRPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUpOwotKwlYdFBvcHVwKHBzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKLSsJWHRSZWFsaXplV2lkZ2V0KHBzaGVsbCk7Ci0rCi0rCWlmICgxICYmIGFwcERhdGEucG9wdXBGaXgpIHsKLSsJCXBvcHVwRml4ZXIocHNoZWxsKTsKLSsJfSBlbHNlIHsKLSsJCXh0bW92ZShwc2hlbGwpOwotKwl9Ci0rCWRpYWxvZ19pbnB1dChwc2hlbGwpOwotKwl3bV9kZWxldGUocHNoZWxsLCAiWUNyb3BEaWFsb2dEb25lKCkiKTsKLSsKLSsJeWNyb3BEaWFsb2dEb25lID0gRmFsc2U7Ci0rCi0rCXdoaWxlICgheWNyb3BEaWFsb2dEb25lKSB7Ci0rCQlYdEFwcFByb2Nlc3NFdmVudChhcHBDb250ZXh0LCBYdElNQWxsKTsKLSsJfQotKwotKwl2YWx1ZVN0cmluZyA9IFhhd0RpYWxvZ0dldFZhbHVlU3RyaW5nKGRpYWxvZyk7Ci0rCXJtTkwodmFsdWVTdHJpbmcpOwotKwl5Y3JvcFZhbHVlID0gWHROZXdTdHJpbmcodmFsdWVTdHJpbmcpOwotKwotKwlYdFBvcGRvd24ocHNoZWxsKTsKLSsJcmV0dXJuIHljcm9wVmFsdWU7Ci0rfQotKwotK3ZvaWQKLStTY2JhckRpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCXNjYmFyRGlhbG9nRG9uZSA9IFRydWU7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLStjaGFyICoKLStEb1NjYmFyRGlhbG9nKCkKLSt7Ci0rCVdpZGdldCBwc2hlbGwsIGRpYWxvZzsKLSsJY2hhciAqc2NiYXJWYWx1ZTsKLSsJY2hhciAqdmFsdWVTdHJpbmc7Ci0rCi0rCXBzaGVsbCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJzY2JhckRpYWxvZyIsIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsCi0rCQkJCXRvcGxldmVsLCBOVUxMKTsKLSsJZGlhbG9nID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZyIsIGRpYWxvZ1dpZGdldENsYXNzLCBwc2hlbGwsIE5VTEwpOwotKwotKwlkaWFsb2dfb3Zlcihwc2hlbGwpOwotKwotKwlpZigwKSBYdE1vdmVXaWRnZXQocHNoZWxsLCBXaWR0aE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSwgSGVpZ2h0T2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81KTsKLSsJWHRQb3B1cChwc2hlbGwsIFh0R3JhYk5vbmV4Y2x1c2l2ZSk7Ci0rCVh0UmVhbGl6ZVdpZGdldChwc2hlbGwpOwotKwotKwlpZiAoMSAmJiBhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCQlwb3B1cEZpeGVyKHBzaGVsbCk7Ci0rCX0gZWxzZSB7Ci0rCQl4dG1vdmUocHNoZWxsKTsKLSsJfQotKwlkaWFsb2dfaW5wdXQocHNoZWxsKTsKLSsJd21fZGVsZXRlKHBzaGVsbCwgIlNjYmFyRGlhbG9nRG9uZSgpIik7Ci0rCi0rCXNjYmFyRGlhbG9nRG9uZSA9IEZhbHNlOwotKwotKwl3aGlsZSAoIXNjYmFyRGlhbG9nRG9uZSkgewotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsKLSsJdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotKwlybU5MKHZhbHVlU3RyaW5nKTsKLSsJc2NiYXJWYWx1ZSA9IFh0TmV3U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSsKLSsJWHRQb3Bkb3duKHBzaGVsbCk7Ci0rCXJldHVybiBzY2JhclZhbHVlOwotK30KLSsKLSt2b2lkCi0rU2NhbGVORGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJc2NhbGVORGlhbG9nRG9uZSA9IFRydWU7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLStjaGFyICoKLStEb1NjYWxlTkRpYWxvZygpCi0rewotKwlXaWRnZXQgcHNoZWxsLCBkaWFsb2c7Ci0rCWNoYXIgKnNjYWxlTlZhbHVlOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSsKLSsJcHNoZWxsID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInNjYWxlTkRpYWxvZyIsIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsCi0rCQkJCXRvcGxldmVsLCBOVUxMKTsKLSsJZGlhbG9nID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZyIsIGRpYWxvZ1dpZGdldENsYXNzLCBwc2hlbGwsIE5VTEwpOwotKwotKwlkaWFsb2dfb3Zlcihwc2hlbGwpOwotKwl3bV9kZWxldGUocHNoZWxsLCAiU2NhbGVORGlhbG9nRG9uZSgpIik7Ci0rCi0rCWlmKDApIFh0TW92ZVdpZGdldChwc2hlbGwsIFdpZHRoT2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81LCBIZWlnaHRPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUpOwotKwlYdFBvcHVwKHBzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKLSsJWHRSZWFsaXplV2lkZ2V0KHBzaGVsbCk7Ci0rCi0rCWlmIChhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCQlwb3B1cEZpeGVyKHBzaGVsbCk7Ci0rCX0gZWxzZSB7Ci0rCQl4dG1vdmUocHNoZWxsKTsKLSsJfQotKwlkaWFsb2dfaW5wdXQocHNoZWxsKTsKLSsJd21fZGVsZXRlKHBzaGVsbCwgIlNjYWxlTkRpYWxvZ0RvbmUoKSIpOwotKwotKwlzY2FsZU5EaWFsb2dEb25lID0gRmFsc2U7Ci0rCi0rCXdoaWxlICghc2NhbGVORGlhbG9nRG9uZSkgewotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsKLSsJdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotKwlybU5MKHZhbHVlU3RyaW5nKTsKLSsJc2NhbGVOVmFsdWUgPSBYdE5ld1N0cmluZyh2YWx1ZVN0cmluZyk7Ci0rCi0rCVh0UG9wZG93bihwc2hlbGwpOwotKwlyZXR1cm4gc2NhbGVOVmFsdWU7Ci0rfQotKwotK3ZvaWQKLStRdWFsaXR5RGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJcXVhbGl0eURpYWxvZ0RvbmUgPSBUcnVlOwotKwlpZiAodyB8fCBldmVudCB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rY2hhciAqCi0rRG9RdWFsaXR5RGlhbG9nKCkKLSt7Ci0rCVdpZGdldCBwc2hlbGwsIGRpYWxvZzsKLSsJY2hhciAqcXVhbGl0eVZhbHVlOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSsKLSsJcHNoZWxsID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInF1YWxpdHlEaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotKwkJCQl0b3BsZXZlbCwgTlVMTCk7Ci0rCWRpYWxvZyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2ciLCBkaWFsb2dXaWRnZXRDbGFzcywgcHNoZWxsLCBOVUxMKTsKLSsKLSsJZGlhbG9nX292ZXIocHNoZWxsKTsKLSsKLSsJaWYoMCkgWHRNb3ZlV2lkZ2V0KHBzaGVsbCwgV2lkdGhPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUsIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0rCVh0UG9wdXAocHNoZWxsLCBYdEdyYWJOb25leGNsdXNpdmUpOwotKwlYdFJlYWxpemVXaWRnZXQocHNoZWxsKTsKLSsKLSsJaWYgKDEgJiYgYXBwRGF0YS5wb3B1cEZpeCkgewotKwkJcG9wdXBGaXhlcihwc2hlbGwpOwotKwl9IGVsc2UgewotKwkJeHRtb3ZlKHBzaGVsbCk7Ci0rCX0KLSsJZGlhbG9nX2lucHV0KHBzaGVsbCk7Ci0rCXdtX2RlbGV0ZShwc2hlbGwsICJRdWFsaXR5RGlhbG9nRG9uZSgpIEhpZGVRdWFsaXR5KCkiKTsKLSsKLSsJcXVhbGl0eURpYWxvZ0RvbmUgPSBGYWxzZTsKLSsKLSsJd2hpbGUgKCFxdWFsaXR5RGlhbG9nRG9uZSkgewotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsKLSsJdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotKwlybU5MKHZhbHVlU3RyaW5nKTsKLSsJcXVhbGl0eVZhbHVlID0gWHROZXdTdHJpbmcodmFsdWVTdHJpbmcpOwotKwotKwlYdFBvcGRvd24ocHNoZWxsKTsKLSsJcmV0dXJuIHF1YWxpdHlWYWx1ZTsKLSt9Ci0rCi0rdm9pZAotK0NvbXByZXNzRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJY29tcHJlc3NEaWFsb2dEb25lID0gVHJ1ZTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK2NoYXIgKgotK0RvQ29tcHJlc3NEaWFsb2coKQotK3sKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICpjb21wcmVzc1ZhbHVlOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSsKLSsJZnByaW50ZihzdGRlcnIsICJjb21wcmVzcyBzdGFydDpcbiIpOwotKwotKwlwc2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgiY29tcHJlc3NEaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotKwkJCQl0b3BsZXZlbCwgTlVMTCk7Ci0rCWRpYWxvZyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2ciLCBkaWFsb2dXaWRnZXRDbGFzcywgcHNoZWxsLCBOVUxMKTsKLSsKLSsJZGlhbG9nX292ZXIocHNoZWxsKTsKLSsKLSsJaWYoMCkgWHRNb3ZlV2lkZ2V0KHBzaGVsbCwgV2lkdGhPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUsIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0rCVh0UG9wdXAocHNoZWxsLCBYdEdyYWJOb25leGNsdXNpdmUpOwotKwlYdFJlYWxpemVXaWRnZXQocHNoZWxsKTsKLSsKLSsJaWYgKDEgJiYgYXBwRGF0YS5wb3B1cEZpeCkgewotKwkJcG9wdXBGaXhlcihwc2hlbGwpOwotKwl9IGVsc2UgewotKwkJeHRtb3ZlKHBzaGVsbCk7Ci0rCX0KLSsJZGlhbG9nX2lucHV0KHBzaGVsbCk7Ci0rCXdtX2RlbGV0ZShwc2hlbGwsICJDb21wcmVzc0RpYWxvZ0RvbmUoKSBIaWRlQ29tcHJlc3MoKSIpOwotKwotKwljb21wcmVzc0RpYWxvZ0RvbmUgPSBGYWxzZTsKLSsKLSsJd2hpbGUgKCFjb21wcmVzc0RpYWxvZ0RvbmUpIHsKLSsJCVh0QXBwUHJvY2Vzc0V2ZW50KGFwcENvbnRleHQsIFh0SU1BbGwpOwotKwl9Ci0rCi0rCXZhbHVlU3RyaW5nID0gWGF3RGlhbG9nR2V0VmFsdWVTdHJpbmcoZGlhbG9nKTsKLSsJcm1OTCh2YWx1ZVN0cmluZyk7Ci0rCWNvbXByZXNzVmFsdWUgPSBYdE5ld1N0cmluZyh2YWx1ZVN0cmluZyk7Ci0rCi0rCWZwcmludGYoc3RkZXJyLCAiY29tcHJlc3MgZG9uZTogJXNcbiIsIGNvbXByZXNzVmFsdWUpOwotKwotKwlYdFBvcGRvd24ocHNoZWxsKTsKLSsJcmV0dXJuIGNvbXByZXNzVmFsdWU7Ci0rfQotIAotIHZvaWQKLSBTZXJ2ZXJEaWFsb2dEb25lKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0gewotLSAgc2VydmVyRGlhbG9nRG9uZSA9IFRydWU7Ci0rCXNlcnZlckRpYWxvZ0RvbmUgPSBUcnVlOwotKwlpZiAodyB8fCBldmVudCB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci0gCi0gY2hhciAqCi0gRG9TZXJ2ZXJEaWFsb2coKQotIHsKLS0gIFdpZGdldCBwc2hlbGwsIGRpYWxvZzsKLS0gIGNoYXIgKnZuY1NlcnZlck5hbWU7Ci0tICBjaGFyICp2YWx1ZVN0cmluZzsKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICp2bmNTZXJ2ZXJOYW1lOwotKwljaGFyICp2YWx1ZVN0cmluZzsKLSAKLS0gIHBzaGVsbCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJzZXJ2ZXJEaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotKwlwc2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgic2VydmVyRGlhbG9nIiwgdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywKLSAJCQkJdG9wbGV2ZWwsIE5VTEwpOwotLSAgZGlhbG9nID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZyIsIGRpYWxvZ1dpZGdldENsYXNzLCBwc2hlbGwsIE5VTEwpOwotKwlkaWFsb2cgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlhbG9nIiwgZGlhbG9nV2lkZ2V0Q2xhc3MsIHBzaGVsbCwgTlVMTCk7Ci0gCi0tICBYdE1vdmVXaWRnZXQocHNoZWxsLCBXaWR0aE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSwKLS0JICAgICAgIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0tICBYdFBvcHVwKHBzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKLS0gIFh0UmVhbGl6ZVdpZGdldChwc2hlbGwpOwotKwlkaWFsb2dfb3Zlcihwc2hlbGwpOwotIAotLSAgc2VydmVyRGlhbG9nRG9uZSA9IEZhbHNlOwotKwlpZiAoMCkgWHRNb3ZlV2lkZ2V0KHBzaGVsbCwgV2lkdGhPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUsIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0rCVh0UG9wdXAocHNoZWxsLCBYdEdyYWJOb25leGNsdXNpdmUpOwotKwlYdFJlYWxpemVXaWRnZXQocHNoZWxsKTsKLSsKLSsJaWYgKDAgJiYgYXBwRGF0YS5wb3B1cEZpeCkgewotKwkJcG9wdXBGaXhlcihwc2hlbGwpOwotKwl9IGVsc2UgewotKwkJeHRtb3ZlKHBzaGVsbCk7Ci0rCX0KLSsjaWYgMAotKwlkaWFsb2dfaW5wdXQocHNoZWxsKTsKLSsjZW5kaWYKLSsJd21fZGVsZXRlKHBzaGVsbCwgIlNlcnZlckRpYWxvZ0RvbmUoKSIpOwotKwotKwlzZXJ2ZXJEaWFsb2dEb25lID0gRmFsc2U7Ci0rCi0rCXdoaWxlICghc2VydmVyRGlhbG9nRG9uZSkgewotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsKLSsJdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotKwlybU5MKHZhbHVlU3RyaW5nKTsKLSsJdm5jU2VydmVyTmFtZSA9IFh0TmV3U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSAKLS0gIHdoaWxlICghc2VydmVyRGlhbG9nRG9uZSkgewotLSAgICBYdEFwcFByb2Nlc3NFdmVudChhcHBDb250ZXh0LCBYdElNQWxsKTsKLS0gIH0KLSsJWHRQb3Bkb3duKHBzaGVsbCk7Ci0rCXJldHVybiB2bmNTZXJ2ZXJOYW1lOwotK30KLSAKLS0gIHZhbHVlU3RyaW5nID0gWGF3RGlhbG9nR2V0VmFsdWVTdHJpbmcoZGlhbG9nKTsKLS0gIHZuY1NlcnZlck5hbWUgPSBYdE5ld1N0cmluZyh2YWx1ZVN0cmluZyk7Ci0rdm9pZAotK1VzZXJEaWFsb2dEb25lKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwl1c2VyRGlhbG9nRG9uZSA9IFRydWU7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSAKLS0gIFh0UG9wZG93bihwc2hlbGwpOwotLSAgcmV0dXJuIHZuY1NlcnZlck5hbWU7Ci0rY2hhciAqCi0rRG9Vc2VyRGlhbG9nKCkKLSt7Ci0rCVdpZGdldCBwc2hlbGwsIGRpYWxvZzsKLSsJY2hhciAqdXNlck5hbWU7Ci0rCWNoYXIgKnZhbHVlU3RyaW5nOwotKwotKwlwc2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgidXNlckRpYWxvZyIsIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsCi0rCQkJCXRvcGxldmVsLCBOVUxMKTsKLSsJZGlhbG9nID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZyIsIGRpYWxvZ1dpZGdldENsYXNzLCBwc2hlbGwsIE5VTEwpOwotKwotKwlkaWFsb2dfb3Zlcihwc2hlbGwpOwotKwotKwlpZigwKSBYdE1vdmVXaWRnZXQocHNoZWxsLCBXaWR0aE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSwgSGVpZ2h0T2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81KTsKLSsJWHRQb3B1cChwc2hlbGwsIFh0R3JhYk5vbmV4Y2x1c2l2ZSk7Ci0rCVh0UmVhbGl6ZVdpZGdldChwc2hlbGwpOwotKwotKwlpZiAoMCAmJiBhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCQlwb3B1cEZpeGVyKHBzaGVsbCk7Ci0rCX0gZWxzZSB7Ci0rCQl4dG1vdmUocHNoZWxsKTsKLSsJfQotKyNpZiAwCi0rCWRpYWxvZ19pbnB1dChwc2hlbGwpOwotKyNlbmRpZgotKwl3bV9kZWxldGUocHNoZWxsLCAiVXNlckRpYWxvZ0RvbmUoKSIpOwotKwotKwl1c2VyRGlhbG9nRG9uZSA9IEZhbHNlOwotKwotKwl3aGlsZSAoIXVzZXJEaWFsb2dEb25lKSB7Ci0rCQlYdEFwcFByb2Nlc3NFdmVudChhcHBDb250ZXh0LCBYdElNQWxsKTsKLSsJfQotKwotKwl2YWx1ZVN0cmluZyA9IFhhd0RpYWxvZ0dldFZhbHVlU3RyaW5nKGRpYWxvZyk7Ci0rCXJtTkwodmFsdWVTdHJpbmcpOwotKwl1c2VyTmFtZSA9IFh0TmV3U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSsKLSsJWHRQb3Bkb3duKHBzaGVsbCk7Ci0rCXJldHVybiB1c2VyTmFtZTsKLSB9Ci0gCi0gdm9pZAotLVBhc3N3b3JkRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0tCQkgICBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLStQYXNzd29yZERpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSB7Ci0tICBwYXNzd29yZERpYWxvZ0RvbmUgPSBUcnVlOwotKwlwYXNzd29yZERpYWxvZ0RvbmUgPSBUcnVlOwotKwlpZiAodyB8fCBldmVudCB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci0gCi0gY2hhciAqCi0gRG9QYXNzd29yZERpYWxvZygpCi0gewotLSAgV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotLSAgY2hhciAqcGFzc3dvcmQ7Ci0tICBjaGFyICp2YWx1ZVN0cmluZzsKLSsJV2lkZ2V0IHBzaGVsbCwgZGlhbG9nOwotKwljaGFyICpwYXNzd29yZDsKLSsJY2hhciAqdmFsdWVTdHJpbmc7Ci0gCi0tICBwc2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgicGFzc3dvcmREaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotKwlwc2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgicGFzc3dvcmREaWFsb2ciLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLAotIAkJCQl0b3BsZXZlbCwgTlVMTCk7Ci0tICBkaWFsb2cgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlhbG9nIiwgZGlhbG9nV2lkZ2V0Q2xhc3MsIHBzaGVsbCwgTlVMTCk7Ci0tCi0tICBYdE1vdmVXaWRnZXQocHNoZWxsLCBXaWR0aE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSwKLS0JICAgICAgIEhlaWdodE9mU2NyZWVuKFh0U2NyZWVuKHBzaGVsbCkpKjIvNSk7Ci0tICBYdFBvcHVwKHBzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKLS0gIFh0UmVhbGl6ZVdpZGdldChwc2hlbGwpOwotLQotLSAgcGFzc3dvcmREaWFsb2dEb25lID0gRmFsc2U7Ci0rCWRpYWxvZyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2ciLCBkaWFsb2dXaWRnZXRDbGFzcywgcHNoZWxsLCBOVUxMKTsKLSAKLS0gIHdoaWxlICghcGFzc3dvcmREaWFsb2dEb25lKSB7Ci0tICAgIFh0QXBwUHJvY2Vzc0V2ZW50KGFwcENvbnRleHQsIFh0SU1BbGwpOwotLSAgfQotKwlkaWFsb2dfb3Zlcihwc2hlbGwpOwotIAotLSAgdmFsdWVTdHJpbmcgPSBYYXdEaWFsb2dHZXRWYWx1ZVN0cmluZyhkaWFsb2cpOwotLSAgcGFzc3dvcmQgPSBYdE5ld1N0cmluZyh2YWx1ZVN0cmluZyk7Ci0rCWlmKDApIFh0TW92ZVdpZGdldChwc2hlbGwsIFdpZHRoT2ZTY3JlZW4oWHRTY3JlZW4ocHNoZWxsKSkqMi81LCBIZWlnaHRPZlNjcmVlbihYdFNjcmVlbihwc2hlbGwpKSoyLzUpOwotKwlYdFBvcHVwKHBzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKLSsJWHRSZWFsaXplV2lkZ2V0KHBzaGVsbCk7Ci0rCi0rCWlmICgwICYmIGFwcERhdGEucG9wdXBGaXgpIHsKLSsJCXBvcHVwRml4ZXIocHNoZWxsKTsKLSsJfSBlbHNlIHsKLSsJCXh0bW92ZShwc2hlbGwpOwotKwl9Ci0rI2lmIDAKLSsJZGlhbG9nX2lucHV0KHBzaGVsbCk7Ci0rI2VuZGlmCi0rCXdtX2RlbGV0ZShwc2hlbGwsICJQYXNzd29yZERpYWxvZ0RvbmUoKSIpOwotKwotKwlwYXNzd29yZERpYWxvZ0RvbmUgPSBGYWxzZTsKLSsKLSsJd2hpbGUgKCFwYXNzd29yZERpYWxvZ0RvbmUpIHsKLSsJCVh0QXBwUHJvY2Vzc0V2ZW50KGFwcENvbnRleHQsIFh0SU1BbGwpOwotKwl9Ci0rCi0rCXZhbHVlU3RyaW5nID0gWGF3RGlhbG9nR2V0VmFsdWVTdHJpbmcoZGlhbG9nKTsKLSsJcm1OTCh2YWx1ZVN0cmluZyk7Ci0rCXBhc3N3b3JkID0gWHROZXdTdHJpbmcodmFsdWVTdHJpbmcpOwotIAotLSAgWHRQb3Bkb3duKHBzaGVsbCk7Ci0tICByZXR1cm4gcGFzc3dvcmQ7Ci0rCVh0UG9wZG93bihwc2hlbGwpOwotKwlyZXR1cm4gcGFzc3dvcmQ7Ci0gfQotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvZnVsbHNjcmVlbi5jIHZuY191bml4c3JjL3ZuY3ZpZXdlci9mdWxsc2NyZWVuLmMKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9mdWxsc2NyZWVuLmMJMjAwMy0xMC0wOSAwNToyMzo0OS4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvZnVsbHNjcmVlbi5jCTIwMTAtMDItMjUgMjI6Mzc6NDkuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMjIsMjAgKzIyLDI0IEBACi0gICovCi0gCi0gI2luY2x1ZGUgPHZuY3ZpZXdlci5oPgotKyNpbmNsdWRlIDx0aW1lLmg+Ci0gI2luY2x1ZGUgPFgxMS9YYXcvRm9ybS5oPgotICNpbmNsdWRlIDxYMTEvWGF3L1ZpZXdwb3J0Lmg+Ci0gI2luY2x1ZGUgPFgxMS9YYXcvVG9nZ2xlLmg+Ci0gCi0gc3RhdGljIEJvb2wgRG9CdW1wU2Nyb2xsKCk7Ci0rc3RhdGljIEJvb2wgRG9KdW1wU2Nyb2xsKCk7Ci0gc3RhdGljIHZvaWQgQnVtcFNjcm9sbFRpbWVyQ2FsbGJhY2soWHRQb2ludGVyIGNsaWVudERhdGEsIFh0SW50ZXJ2YWxJZCAqaWQpOwotK3N0YXRpYyB2b2lkIEp1bXBTY3JvbGxUaW1lckNhbGxiYWNrKFh0UG9pbnRlciBjbGllbnREYXRhLCBYdEludGVydmFsSWQgKmlkKTsKLSBzdGF0aWMgWHRJbnRlcnZhbElkIHRpbWVyOwotIHN0YXRpYyBCb29sIHRpbWVyU2V0ID0gRmFsc2U7Ci0gc3RhdGljIEJvb2wgc2Nyb2xsTGVmdCwgc2Nyb2xsUmlnaHQsIHNjcm9sbFVwLCBzY3JvbGxEb3duOwotLXN0YXRpYyBQb3NpdGlvbiBkZXNrdG9wWCwgZGVza3RvcFk7Ci0rUG9zaXRpb24gZGVza3RvcFgsIGRlc2t0b3BZOwotIHN0YXRpYyBEaW1lbnNpb24gdmlld3BvcnRXaWR0aCwgdmlld3BvcnRIZWlnaHQ7Ci0gc3RhdGljIERpbWVuc2lvbiBzY3JvbGxiYXJXaWR0aCwgc2Nyb2xsYmFySGVpZ2h0OwotIAotIAotK2ludCBzY2FsZV9yb3VuZChpbnQgbGVuLCBkb3VibGUgZmFjKTsKLSAKLSAvKgotICAqIEZ1bGxTY3JlZW5PbiBnb2VzIGludG8gZnVsbC1zY3JlZW4gbW9kZS4gIEl0IG1ha2VzIHRoZSB0b3BsZXZlbCB3aW5kb3cKLUBAIC03OCwxMTIgKzgyLDQ1NiBAQAotICAqIHZhcmlhYmxlcyBzbyB0aGF0IEZ1bGxTY3JlZW5PZmYgY2FuIHVzZSB0aGVtLgotICAqLwotIAotLXZvaWQKLS1GdWxsU2NyZWVuT24oKQotLXsKLS0gIERpbWVuc2lvbiB0b3BsZXZlbFdpZHRoLCB0b3BsZXZlbEhlaWdodDsKLS0gIERpbWVuc2lvbiBvbGRWaWV3cG9ydFdpZHRoLCBvbGRWaWV3cG9ydEhlaWdodCwgY2xpcFdpZHRoLCBjbGlwSGVpZ2h0OwotLSAgUG9zaXRpb24gdmlld3BvcnRYLCB2aWV3cG9ydFk7Ci0tCi0tICBhcHBEYXRhLmZ1bGxTY3JlZW4gPSBUcnVlOwotLQotLSAgaWYgKHNpLmZyYW1lYnVmZmVyV2lkdGggPiBkcHlXaWR0aCB8fCBzaS5mcmFtZWJ1ZmZlckhlaWdodCA+IGRweUhlaWdodCkgewotLQotLSAgICBYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LCBYdE5mb3JjZUJhcnMsIFRydWUsIE5VTEwpOwotLSAgICBYdFZhR2V0VmFsdWVzKHZpZXdwb3J0LCBYdE53aWR0aCwgJm9sZFZpZXdwb3J0V2lkdGgsCi0tCQkgIFh0TmhlaWdodCwgJm9sZFZpZXdwb3J0SGVpZ2h0LCBOVUxMKTsKLS0gICAgWHRWYUdldFZhbHVlcyhYdE5hbWVUb1dpZGdldCh2aWV3cG9ydCwgImNsaXAiKSwKLS0JCSAgWHROd2lkdGgsICZjbGlwV2lkdGgsIFh0TmhlaWdodCwgJmNsaXBIZWlnaHQsIE5VTEwpOwotLQotLSAgICBzY3JvbGxiYXJXaWR0aCA9IG9sZFZpZXdwb3J0V2lkdGggLSBjbGlwV2lkdGg7Ci0tICAgIHNjcm9sbGJhckhlaWdodCA9IG9sZFZpZXdwb3J0SGVpZ2h0IC0gY2xpcEhlaWdodDsKLS0KLS0gICAgaWYgKHNpLmZyYW1lYnVmZmVyV2lkdGggPiBkcHlXaWR0aCkgewotLSAgICAgIHZpZXdwb3J0V2lkdGggPSB0b3BsZXZlbFdpZHRoID0gZHB5V2lkdGggKyBzY3JvbGxiYXJXaWR0aDsKLS0gICAgfSBlbHNlIHsKLS0gICAgICB2aWV3cG9ydFdpZHRoID0gc2kuZnJhbWVidWZmZXJXaWR0aCArIHNjcm9sbGJhcldpZHRoOwotLSAgICAgIHRvcGxldmVsV2lkdGggPSBkcHlXaWR0aDsKLS0gICAgfQotLQotLSAgICBpZiAoc2kuZnJhbWVidWZmZXJIZWlnaHQgPiBkcHlIZWlnaHQpIHsKLS0gICAgICB2aWV3cG9ydEhlaWdodCA9IHRvcGxldmVsSGVpZ2h0ID0gZHB5SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0OwotLSAgICB9IGVsc2UgewotLSAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQ7Ci0tICAgICAgdG9wbGV2ZWxIZWlnaHQgPSBkcHlIZWlnaHQ7Ci0tICAgIH0KLS0KLS0gIH0gZWxzZSB7Ci0tICAgIHZpZXdwb3J0V2lkdGggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotLSAgICB2aWV3cG9ydEhlaWdodCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotLSAgICB0b3BsZXZlbFdpZHRoID0gZHB5V2lkdGg7Ci0tICAgIHRvcGxldmVsSGVpZ2h0ID0gZHB5SGVpZ2h0OwotLSAgfQotK2ludCBuZXRfd21fc3VwcG9ydGVkKHZvaWQpIHsKLSsJdW5zaWduZWQgY2hhciAqZGF0YTsKLSsJdW5zaWduZWQgbG9uZyBpdGVtc19yZWFkLCBpdGVtc19sZWZ0LCBpOwotKwlpbnQgcmV0LCBmb3JtYXQ7IAotKwlXaW5kb3cgd207Ci0rCUF0b20gdHlwZTsKLSsJQXRvbSBfTkVUX1NVUFBPUlRJTkdfV01fQ0hFQ0s7Ci0rCUF0b20gX05FVF9TVVBQT1JURUQ7Ci0rCUF0b20gX05FVF9XTV9TVEFURTsKLSsJQXRvbSBfTkVUX1dNX1NUQVRFX0ZVTExTQ1JFRU47Ci0rCi0rCXN0YXRpYyB0aW1lX3QgbGFzdF9jaGVjayA9IDA7Ci0rCXN0YXRpYyBpbnQgZnNfc3VwcG9ydGVkID0gLTE7Ci0rCi0rCWlmIChmc19zdXBwb3J0ZWQgPj0gMCAmJiB0aW1lKE5VTEwpIDwgbGFzdF9jaGVjayArIDYwMCkgewotKwkJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0rCQlpZiAoZmlyc3QpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImZzX3N1cHBvcnRlZDogJWRcbiIsIGZzX3N1cHBvcnRlZCk7Ci0rCQl9Ci0rCQlmaXJzdCA9IDA7Ci0rCQlyZXR1cm4gZnNfc3VwcG9ydGVkOwotKwl9Ci0rCWxhc3RfY2hlY2sgPSB0aW1lKE5VTEwpOwotKwotKwlmc19zdXBwb3J0ZWQgPSAwOwotKwotKwlfTkVUX1NVUFBPUlRJTkdfV01fQ0hFQ0sgPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX1NVUFBPUlRJTkdfV01fQ0hFQ0siLCBGYWxzZSk7Ci0rCV9ORVRfU1VQUE9SVEVEID0gWEludGVybkF0b20oZHB5LCAiX05FVF9TVVBQT1JURUQiLCBGYWxzZSk7Ci0rCV9ORVRfV01fU1RBVEUgPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX1dNX1NUQVRFIiwgRmFsc2UpOwotKwlfTkVUX1dNX1NUQVRFX0ZVTExTQ1JFRU4gPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX1dNX1NUQVRFX0ZVTExTQ1JFRU4iLCBGYWxzZSk7Ci0rCi0rCXJldCA9IFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIF9ORVRfU1VQUE9SVElOR19XTV9DSEVDSywKLSsJICAgIDBMLCAxTCwgRmFsc2UsIFhBX1dJTkRPVywgJnR5cGUsICZmb3JtYXQsICZpdGVtc19yZWFkLCAmaXRlbXNfbGVmdCwgJmRhdGEpOyAKLSsKLSsJaWYgKHJldCAhPSBTdWNjZXNzIHx8ICFpdGVtc19yZWFkKSB7Ci0rCQlpZiAocmV0ID09IFN1Y2Nlc3MpIHsKLSsJCQlYRnJlZShkYXRhKTsKLSsJCX0KLSsJCXJldHVybiBmc19zdXBwb3J0ZWQ7Ci0rCX0KLSsKLSsJd20gPSAoKFdpbmRvdyopIGRhdGEpWzBdOwotKwlYRnJlZShkYXRhKTsKLSsKLSsJcmV0ID0gWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgd20sIF9ORVRfU1VQUE9SVElOR19XTV9DSEVDSywKLSsJICAgIDBMLCAxTCwgRmFsc2UsIFhBX1dJTkRPVywgJnR5cGUsICZmb3JtYXQsICZpdGVtc19yZWFkLCAmaXRlbXNfbGVmdCwgJmRhdGEpOyAKLSsKLSsJaWYgKHJldCAhPSBTdWNjZXNzIHx8ICFpdGVtc19yZWFkKSB7Ci0rCQlpZiAocmV0ID09IFN1Y2Nlc3MpIHsKLSsJCQlYRnJlZShkYXRhKTsKLSsJCX0KLSsJCXJldHVybiBmc19zdXBwb3J0ZWQ7Ci0rCX0KLSsKLSsJaWYgKHdtICE9ICgoV2luZG93KikgZGF0YSlbMF0pIHsKLSsJCVhGcmVlKGRhdGEpOwotKwkJcmV0dXJuIGZzX3N1cHBvcnRlZDsKLSsJfQotKwotKwlyZXQgPSBYR2V0V2luZG93UHJvcGVydHkoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBfTkVUX1NVUFBPUlRFRCwKLSsJICAgIDBMLCA4MTkyTCwgRmFsc2UsIFhBX0FUT00sICZ0eXBlLCAmZm9ybWF0LCAmaXRlbXNfcmVhZCwgJml0ZW1zX2xlZnQsICZkYXRhKTsgCi0rCi0rCWlmIChyZXQgIT0gU3VjY2VzcyB8fCAhaXRlbXNfcmVhZCkgewotKwkJaWYgKHJldCA9PSBTdWNjZXNzKSB7Ci0rCQkJWEZyZWUoZGF0YSk7Ci0rCQl9Ci0rCQlyZXR1cm4gZnNfc3VwcG9ydGVkOwotKwl9Ci0rCi0rCWZvciAoaT0wOyBpIDwgaXRlbXNfcmVhZDsgaSsrKSB7Ci0rCQlpZiAoICgoQXRvbSopIGRhdGEpW2ldID09IF9ORVRfV01fU1RBVEVfRlVMTFNDUkVFTikgewotKwkJCWZzX3N1cHBvcnRlZCA9IDE7Ci0rCQl9Ci0rCX0KLSsJWEZyZWUoZGF0YSk7Ci0gCi0tICB2aWV3cG9ydFggPSAodG9wbGV2ZWxXaWR0aCAtIHZpZXdwb3J0V2lkdGgpIC8gMjsKLS0gIHZpZXdwb3J0WSA9ICh0b3BsZXZlbEhlaWdodCAtIHZpZXdwb3J0SGVpZ2h0KSAvIDI7Ci0rCXJldHVybiBmc19zdXBwb3J0ZWQ7Ci0rfQotIAotK3N0YXRpYyB2b2lkIG5ldF93bV9mdWxsc2NyZWVuKGludCB0b19mcykgewotKwkKLSsJaW50IF9ORVRfV01fU1RBVEVfUkVNT1ZFID0gMDsKLSsJaW50IF9ORVRfV01fU1RBVEVfQUREID0gMTsKLSsjaWYgMAotKwlpbnQgX05FVF9XTV9TVEFURV9UT0dHTEUgPSAyOwotKyNlbmRpZgotKwlBdG9tIF9ORVRfV01fU1RBVEUgPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX1dNX1NUQVRFIiwgRmFsc2UpOwotKwlBdG9tIF9ORVRfV01fU1RBVEVfRlVMTFNDUkVFTiA9IFhJbnRlcm5BdG9tKGRweSwgIl9ORVRfV01fU1RBVEVfRlVMTFNDUkVFTiIsIEZhbHNlKTsKLSsJWEV2ZW50IHhldjsJCi0rCi0rCWlmICh0b19mcyA9PSAyKSB7Ci0rCQlYQ2hhbmdlUHJvcGVydHkoZHB5LCBYdFdpbmRvdyh0b3BsZXZlbCksIF9ORVRfV01fU1RBVEUsIFhBX0FUT00sIDMyLCBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyKikmX05FVF9XTV9TVEFURV9GVUxMU0NSRUVOLCAxKTsKLSsJfSBlbHNlIHsKLSsJCXhldi54Y2xpZW50LnR5cGUgPSBDbGllbnRNZXNzYWdlOwotKwkJeGV2LnhjbGllbnQud2luZG93ID0gWHRXaW5kb3codG9wbGV2ZWwpOwotKwkJeGV2LnhjbGllbnQubWVzc2FnZV90eXBlID0gX05FVF9XTV9TVEFURTsKLSsJCXhldi54Y2xpZW50LnNlcmlhbCA9IDA7Ci0rCQl4ZXYueGNsaWVudC5kaXNwbGF5ID0gZHB5OwotKwkJeGV2LnhjbGllbnQuc2VuZF9ldmVudCA9IFRydWU7Ci0rCQl4ZXYueGNsaWVudC5mb3JtYXQgPSAzMjsKLSsJCXhldi54Y2xpZW50LmRhdGEubFswXSA9IHRvX2ZzID8gX05FVF9XTV9TVEFURV9BREQgOiBfTkVUX1dNX1NUQVRFX1JFTU9WRTsKLSsJCXhldi54Y2xpZW50LmRhdGEubFsxXSA9IF9ORVRfV01fU1RBVEVfRlVMTFNDUkVFTjsKLSsJCXhldi54Y2xpZW50LmRhdGEubFsyXSA9IDA7Ci0rCQl4ZXYueGNsaWVudC5kYXRhLmxbM10gPSAwOwotKwkJeGV2LnhjbGllbnQuZGF0YS5sWzRdID0gMDsKLSsJCVhTZW5kRXZlbnQoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCBGYWxzZSwgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrIHwgU3Vic3RydWN0dXJlTm90aWZ5TWFzaywgJnhldik7Ci0rCX0KLSAKLS0gIC8qIFdlIHdhbnQgdG8gc3RvcCB0aGUgd2luZG93IG1hbmFnZXIgZnJvbSBtYW5hZ2luZyBvdXIgdG9wbGV2ZWwgd2luZG93LgotLSAgICAgVGhpcyBpcyBub3QgcmVhbGx5IGEgbmljZSB0aGluZyB0byBkbywgc28gbWF5IG5vdCB3b3JrIHByb3Blcmx5IHdpdGggZXZlcnkKLS0gICAgIHdpbmRvdyBtYW5hZ2VyLiAgV2UgZG8gdGhpcyBzaW1wbHkgYnkgc2V0dGluZyBvdmVycmlkZVJlZGlyZWN0IGFuZAotLSAgICAgcmVwYXJlbnRpbmcgb3VyIHdpbmRvdyB0byB0aGUgcm9vdC4gIFRoZSB3aW5kb3cgbWFuYWdlciB3aWxsIGdldCBhCi0tICAgICBSZXBhcmVudE5vdGlmeSBhbmQgaG9wZWZ1bGx5IGNsZWFuIHVwIGl0cyBmcmFtZSB3aW5kb3cuICovCi0rCVhTeW5jKGRweSwgRmFsc2UpOwotK30KLSAKLS0gIFh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsIE5VTEwpOwotK3RpbWVfdCBtYWluX2dyYWIgPSAwOwotIAotLSAgWFJlcGFyZW50V2luZG93KGRweSwgWHRXaW5kb3codG9wbGV2ZWwpLCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCAwLCAwKTsKLSt2b2lkIGZzX3VuZ3JhYihpbnQgY2hlY2spIHsKLSsJaWYgKGNoZWNrKSB7Ci0rCQlpZiAodGltZShOVUxMKSA8PSBtYWluX2dyYWIgKyAyKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwkJaWYgKG5ldF93bV9zdXBwb3J0ZWQoKSkgewotKwkJCXJldHVybjsKLSsJCX0KLSsJfQotKwlmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgZnNfdW5ncmFiKClcbiIpOwotKwlpZiAoYXBwRGF0YS5ncmFiQWxsKSB7IC8qIHJ1bmdlIHRvcCBvZiBGdWxsU2NyZWVuT2ZmICovCi0rCQlmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgWFVuZ3JhYlNlcnZlcihkcHkpXG4iKTsKLSsJCVhVbmdyYWJTZXJ2ZXIoZHB5KTsgICAgIAotKwl9Ci0rCWlmIChhcHBEYXRhLmdyYWJLZXlib2FyZCkgewotKwkJZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIFhVbmdyYWJLZXlib2FyZChkcHkpXG4iKTsKLSsJCVh0VW5ncmFiS2V5Ym9hcmQoZGVza3RvcCwgQ3VycmVudFRpbWUpOwotKwl9Ci0rfQotIAotLSAgLyogU29tZSBXTXMgZG9lcyBub3Qgb2JleSB4LHkgdmFsdWVzIG9mIFhSZXBhcmVudFdpbmRvdzsgdGhlIHdpbmRvdwotLSAgICAgaXMgbm90IHBsYWNlZCBpbiB0aGUgdXBwZXIsIGxlZnQgY29ybmVyLiBUaGUgY29kZSBiZWxvdyBmaXhlcwotLSAgICAgdGhpczogSXQgbWFudWFsbHkgbW92ZXMgdGhlIHdpbmRvdywgYWZ0ZXIgdGhlIFhzZXJ2ZXIgaXMgZG9uZQotLSAgICAgd2l0aCBYUmVwYXJlbnRXaW5kb3cuIFRoZSBsYXN0IFhTeW5jIHNlZW1zIHRvIHByZXZlbnQgbG9zaW5nCi0tICAgICBmb2N1cywgYnV0IEkgZG9uJ3Qga25vdyB3aHkuICovCi0tICBYU3luYyhkcHksIEZhbHNlKTsKLS0gIFhNb3ZlV2luZG93KGRweSwgWHRXaW5kb3codG9wbGV2ZWwpLCAwLCAwKTsKLS0gIFhTeW5jKGRweSwgRmFsc2UpOwotLQotLSAgLyogTm93IHdlIHdhbnQgdG8gZml4IHRoZSBzaXplIG9mICJ2aWV3cG9ydCIuICBXZSBzaG91bGRuJ3QganVzdCBjaGFuZ2UgaXQKLS0gICAgIGRpcmVjdGx5LiAgSW5zdGVhZCB3ZSBzZXQgInRvcGxldmVsIiB0byB0aGUgcmVxdWlyZWQgc2l6ZSAod2hpY2ggc2hvdWxkCi0tICAgICBwcm9wYWdhdGUgdGhyb3VnaCAiZm9ybSIgdG8gInZpZXdwb3J0IikuICBUaGVuIHdlIHJlbW92ZSAidmlld3BvcnQiIGZyb20KLS0gICAgIGJlaW5nIG1hbmFnZWQgYnkgImZvcm0iLCBjaGFuZ2UgaXRzIHJlc291cmNlcyB0byBwb3NpdGlvbiBpdCBhbmQgbWFrZSBzdXJlCi0tICAgICB0aGF0ICJmb3JtIiB3b24ndCBhdHRlbXB0IHRvIHJlc2l6ZSBpdCwgdGhlbiBhc2sgImZvcm0iIHRvIG1hbmFnZSBpdAotLSAgICAgYWdhaW4uICovCi0tCi0tICBYdFJlc2l6ZVdpZGdldCh0b3BsZXZlbCwgdmlld3BvcnRXaWR0aCwgdmlld3BvcnRIZWlnaHQsIDApOwotLQotLSAgWHRVbm1hbmFnZUNoaWxkKHZpZXdwb3J0KTsKLS0KLS0gIFh0VmFTZXRWYWx1ZXModmlld3BvcnQsCi0tCQlYdE5ob3JpekRpc3RhbmNlLCB2aWV3cG9ydFgsCi0tCQlYdE52ZXJ0RGlzdGFuY2UsIHZpZXdwb3J0WSwKLS0JCVh0TmxlZnQsIFh0Q2hhaW5MZWZ0LAotLQkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAotLQkJWHROdG9wLCBYdENoYWluVG9wLAotLQkJWHROYm90dG9tLCBYdENoYWluVG9wLAotLQkJTlVMTCk7Ci0rdm9pZCBmc19ncmFiKGludCBjaGVjaykgewotKwlpZiAoY2hlY2spIHsKLSsJCWlmICh0aW1lKE5VTEwpIDw9IG1haW5fZ3JhYiArIDIpIHsKLSsJCQlyZXR1cm47Ci0rCQl9Ci0rCQlpZiAobmV0X3dtX3N1cHBvcnRlZCgpKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0rCi0rCW1haW5fZ3JhYiA9IHRpbWUoTlVMTCk7Ci0rCi0rCWZwcmludGYoc3RkZXJyLCAiY2FsbGluZyBmc19ncmFiKClcbiIpOwotKwkKLSsjZGVmaW5lIEZPUkNFX1VQIFwKLSsJWFN5bmMoZHB5LCBGYWxzZSk7IFwKLSsJWFVubWFwV2luZG93KGRweSwgWHRXaW5kb3codG9wbGV2ZWwpKTsgXAotKwlYU3luYyhkcHksIEZhbHNlKTsgXAotKwlYTWFwV2luZG93KGRweSwgWHRXaW5kb3codG9wbGV2ZWwpKTsgXAotKwlYUmFpc2VXaW5kb3coZHB5LCBYdFdpbmRvdyh0b3BsZXZlbCkpOyBcCi0rCVhTeW5jKGRweSwgRmFsc2UpOwotKwotKwlpZiAoYXBwRGF0YS5ncmFiS2V5Ym9hcmQgJiYgWHRHcmFiS2V5Ym9hcmQoZGVza3RvcCwgVHJ1ZSwgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywgQ3VycmVudFRpbWUpICE9IEdyYWJTdWNjZXNzKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlh0R3JhYktleWJvYXJkKCkgZmFpbGVkLlxuIik7Ci0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCXVzbGVlcCgxMDAgKiAxMDAwKTsKLSsJCUZPUkNFX1VQCi0rCi0rCQlpZiAoWHRHcmFiS2V5Ym9hcmQoZGVza3RvcCwgVHJ1ZSwgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywgQ3VycmVudFRpbWUpICE9IEdyYWJTdWNjZXNzKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJYdEdyYWJLZXlib2FyZCgpIGZhaWxlZCBhZ2Fpbi5cbiIpOwotKwkJCXVzbGVlcCgyMDAgKiAxMDAwKTsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQlpZiAoWHRHcmFiS2V5Ym9hcmQoZGVza3RvcCwgVHJ1ZSwgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywgQ3VycmVudFRpbWUpICE9IEdyYWJTdWNjZXNzKSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiWHRHcmFiS2V5Ym9hcmQoKSBmYWlsZWQgM3JkIHRpbWUuXG4iKTsKLSsJCQl9IGVsc2UgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlh0R3JhYktleWJvYXJkKCkgT0sgM3JkIHRyeS5cbiIpOwotKwkJCX0KLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJYdEdyYWJLZXlib2FyZCgpIE9LIDJuZCB0cnkuXG4iKTsKLSsJCX0KLSsJCVhSYWlzZVdpbmRvdyhkcHksIFh0V2luZG93KHRvcGxldmVsKSk7Ci0rCX0gCi0rCi0rCWlmIChhcHBEYXRhLmdyYWJBbGwpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiY2FsbGluZyBYR3JhYlNlcnZlcihkcHkpXG4iKTsKLSsJCWlmICghIFhHcmFiU2VydmVyKGRweSkpIHsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQl1c2xlZXAoMTAwICogMTAwMCk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIFhHcmFiU2VydmVyKGRweSkgMm5kIHRpbWVcbiIpOwotKwkJCWlmICghWEdyYWJTZXJ2ZXIoZHB5KSkgewotKwkJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQkJdXNsZWVwKDIwMCAqIDEwMDApOwotKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgWEdyYWJTZXJ2ZXIoZHB5KSAzcmQgdGltZVxuIik7Ci0rCQkJCWlmIChYR3JhYlNlcnZlcihkcHkpKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlhHcmFiU2VydmVyKGRweSkgT0sgM3JkIHRpbWVcbiIpOwotKwkJCQl9Ci0rCQkJfSBlbHNlIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJYR3JhYlNlcnZlcihkcHkpIE9LIDJuZCB0aW1lXG4iKTsKLSsJCQl9Ci0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQl9Ci0rCQlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfRk9SQ0VfVVAiKSkgewotKwkJCWZwcmludGYoc3RkZXJyLCAiRk9SQ0VfVVBcbiIpOwotKwkJCUZPUkNFX1VQCi0rCQl9Ci0rCX0KLSt9Ci0rCi0rZXh0ZXJuIGludCBmdWxsc2NyZWVuX3N0YXJ0dXA7Ci0rZXh0ZXJuIGRvdWJsZSBsYXN0X2Z1bGxzY3JlZW47Ci0rCi0rI2RlZmluZSBzZXRfc2l6ZV9oaW50cygpIFwKLSt7IFwKLSsJbG9uZyBzdXBwbGllZDsgXAotKwlYU2l6ZUhpbnRzICpzaXplaGludHMgPSBYQWxsb2NTaXplSGludHMoKTsgXAotKwlYR2V0V01TaXplSGludHMoZHB5LCB0b3B3aW4sIHNpemVoaW50cywgJnN1cHBsaWVkLCBYQV9XTV9OT1JNQUxfSElOVFMpOyBcCi0rCWlmIChzaXplaGludHMtPmJhc2Vfd2lkdGggPCB0b3BsZXZlbFdpZHRoKSB7IFwKLSsJCXNpemVoaW50cy0+YmFzZV93aWR0aCA9IHRvcGxldmVsV2lkdGg7IFwKLSsJfSBcCi0rCWlmIChzaXplaGludHMtPmJhc2VfaGVpZ2h0IDwgdG9wbGV2ZWxIZWlnaHQpIHsgXAotKwkJc2l6ZWhpbnRzLT5iYXNlX2hlaWdodCA9IHRvcGxldmVsSGVpZ2h0OyBcCi0rCX0gXAotKwlpZiAoc2l6ZWhpbnRzLT5tYXhfd2lkdGggPCB0b3BsZXZlbFdpZHRoKSB7IFwKLSsJCXNpemVoaW50cy0+bWF4X3dpZHRoID0gdG9wbGV2ZWxXaWR0aDsgXAotKwl9IFwKLSsJaWYgKHNpemVoaW50cy0+bWF4X2hlaWdodCA8IHRvcGxldmVsSGVpZ2h0KSB7IFwKLSsJCXNpemVoaW50cy0+bWF4X2hlaWdodCA9IHRvcGxldmVsSGVpZ2h0OyBcCi0rCX0gXAotKwlYU2V0V01TaXplSGludHMoZHB5LCB0b3B3aW4sIHNpemVoaW50cywgWEFfV01fTk9STUFMX0hJTlRTKTsgXAotKwlYRnJlZShzaXplaGludHMpOyBcCi0rfQotIAotLSAgWHRNYW5hZ2VDaGlsZCh2aWV3cG9ydCk7Ci0rZXh0ZXJuIGludCBzY2FsZV94LCBzY2FsZV95OwotK2V4dGVybiBkb3VibGUgc2NhbGVfZmFjdG9yX3k7Ci0rCi0rdm9pZAotK0Z1bGxTY3JlZW5PbigpCi0rewotKwlEaW1lbnNpb24gdG9wbGV2ZWxXaWR0aCwgdG9wbGV2ZWxIZWlnaHQ7Ci0rCURpbWVuc2lvbiBvbGRWaWV3cG9ydFdpZHRoLCBvbGRWaWV3cG9ydEhlaWdodCwgY2xpcFdpZHRoLCBjbGlwSGVpZ2h0OwotKwlQb3NpdGlvbiB2aWV3cG9ydFgsIHZpZXdwb3J0WTsKLSsJaW50IGRvX25ldF93bSA9IG5ldF93bV9zdXBwb3J0ZWQoKTsKLSsJaW50IGZiVyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCWludCBmYkggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsJaW50IGVmZl9oZWlnaHQ7Ci0rCi0rCUJvb2wgZnNBbHJlYWR5ID0gYXBwRGF0YS5mdWxsU2NyZWVuLCB0b29iaWcgPSBGYWxzZTsKLSsJV2luZG93IHRvcHdpbiA9IFh0V2luZG93KHRvcGxldmVsKTsKLSsKLSsJYXBwRGF0YS5mdWxsU2NyZWVuID0gVHJ1ZTsKLSsKLSsJbGFzdF9mdWxsc2NyZWVuID0gZG5vdygpOwotKwotKwlpZiAoc2NhbGVfeCA+IDApIHsKLSsJCWZiVyA9IHNjYWxlX3g7Ci0rCQlmYkggPSBzY2FsZV95OwotKwl9Ci0rCi0rCWVmZl9oZWlnaHQgPSBmYkg7Ci0rCWlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJZWZmX2hlaWdodCA9IGFwcERhdGEueUNyb3A7Ci0rCQlpZiAoc2NhbGVfeSA+IDApIHsKLSsJCQllZmZfaGVpZ2h0ID0gc2NhbGVfcm91bmQoZWZmX2hlaWdodCwgc2NhbGVfZmFjdG9yX3kpOwotKwkJfQotKwl9Ci0rCi0rCWlmIChmYlcgPiBkcHlXaWR0aCB8fCBlZmZfaGVpZ2h0ID4gZHB5SGVpZ2h0KSB7Ci0rCi0rCQl0b29iaWcgPSBUcnVlOwotKwotKwkJLyoKLSsJCSAqIFRoaXMgaXMgYSBjcmF6eSB0aGluZyB0byBoYXZlIHRoZSBzY3JvbGxiYXJzIGhhbmcKLSsJCSAqIGp1c3QgYSBiaXQgb2Zmc2NyZWVuIHRvIHRoZSByaWdodCBhbmQgYmVsb3cuICB0aGUgdXNlcgotKwkJICogd2lsbCBub3Qgc2VlIHRoZW0gYW5kIGJ1bXBzY3JvbGwgd2lsbCB3b3JrLgotKwkJICovCi0rCQotKwkJWHRWYVNldFZhbHVlcyh2aWV3cG9ydCwgWHROZm9yY2VCYXJzLCBUcnVlLCBOVUxMKTsKLSsJCVh0VmFHZXRWYWx1ZXModmlld3BvcnQsIFh0TndpZHRoLCAmb2xkVmlld3BvcnRXaWR0aCwgWHROaGVpZ2h0LCAmb2xkVmlld3BvcnRIZWlnaHQsIE5VTEwpOwotKwkJWHRWYUdldFZhbHVlcyhYdE5hbWVUb1dpZGdldCh2aWV3cG9ydCwgImNsaXAiKSwgWHROd2lkdGgsICZjbGlwV2lkdGgsIFh0TmhlaWdodCwgJmNsaXBIZWlnaHQsIE5VTEwpOwotKwotKwkJc2Nyb2xsYmFyV2lkdGggID0gb2xkVmlld3BvcnRXaWR0aCAgLSBjbGlwV2lkdGg7Ci0rCQlzY3JvbGxiYXJIZWlnaHQgPSBvbGRWaWV3cG9ydEhlaWdodCAtIGNsaXBIZWlnaHQ7Ci0rCi0rCQlpZiAoZmJXID4gZHB5V2lkdGgpIHsKLSsJCQl2aWV3cG9ydFdpZHRoID0gdG9wbGV2ZWxXaWR0aCA9IGRweVdpZHRoICsgc2Nyb2xsYmFyV2lkdGg7Ci0rCQl9IGVsc2UgewotKwkJCXZpZXdwb3J0V2lkdGggPSBmYlcgKyBzY3JvbGxiYXJXaWR0aDsKLSsJCQl0b3BsZXZlbFdpZHRoID0gZHB5V2lkdGg7Ci0rCQl9Ci0rCi0rCQlpZiAoZWZmX2hlaWdodCA+IGRweUhlaWdodCkgewotKwkJCXZpZXdwb3J0SGVpZ2h0ID0gdG9wbGV2ZWxIZWlnaHQgPSBkcHlIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQ7Ci0rCQl9IGVsc2UgewotKwkJCXZpZXdwb3J0SGVpZ2h0ID0gZWZmX2hlaWdodCArIHNjcm9sbGJhckhlaWdodDsKLSsJCQl0b3BsZXZlbEhlaWdodCA9IGRweUhlaWdodDsKLSsJCX0KLSsJCWlmIChkb19uZXRfd20pIHsKLSsJCQkvKiBidXQgZm9yIF9ORVRfV00gd2UgbWFrZSB0b3BsZXZlbCBiZSBjb3JyZWN0IGRweSBzaXplICovCi0rCQkJdG9wbGV2ZWxXaWR0aCAgPSBkcHlXaWR0aDsKLSsJCQl0b3BsZXZlbEhlaWdodCA9IGRweUhlaWdodDsKLSsJCX0KLSsKLSsJfSBlbHNlIHsKLSsJCXZpZXdwb3J0V2lkdGggPSBmYlc7Ci0rCQl2aWV3cG9ydEhlaWdodCA9IGVmZl9oZWlnaHQ7Ci0rCQl0b3BsZXZlbFdpZHRoICA9IGRweVdpZHRoOwotKwkJdG9wbGV2ZWxIZWlnaHQgPSBkcHlIZWlnaHQ7Ci0rCX0KLSAKLS0gIC8qIE5vdyB3ZSBjYW4gc2V0ICJ0b3BsZXZlbCIgdG8gaXRzIHByb3BlciBzaXplLiAqLwotKwl2aWV3cG9ydFggPSAodG9wbGV2ZWxXaWR0aCAtIHZpZXdwb3J0V2lkdGgpIC8gMjsKLSsJdmlld3BvcnRZID0gKHRvcGxldmVsSGVpZ2h0IC0gdmlld3BvcnRIZWlnaHQpIC8gMjsKLSAKLS0gIFh0UmVzaXplV2lkZ2V0KHRvcGxldmVsLCB0b3BsZXZlbFdpZHRoLCB0b3BsZXZlbEhlaWdodCwgMCk7Ci0rCWlmICh2aWV3cG9ydFggPCAwKSB2aWV3cG9ydFggPSAwOwotKwlpZiAodmlld3BvcnRZIDwgMCkgdmlld3BvcnRZID0gMDsKLSAKLS0gIC8qIFNldCB0aGUgcG9wdXAgdG8gb3ZlcnJpZGVSZWRpcmVjdCB0b28gKi8KLSAKLS0gIFh0VmFTZXRWYWx1ZXMocG9wdXAsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsIE5VTEwpOwotKyAgLyogV2Ugd2FudCB0byBzdG9wIHRoZSB3aW5kb3cgbWFuYWdlciBmcm9tIG1hbmFnaW5nIG91ciB0b3BsZXZlbCB3aW5kb3cuCi0rICAgICBUaGlzIGlzIG5vdCByZWFsbHkgYSBuaWNlIHRoaW5nIHRvIGRvLCBzbyBtYXkgbm90IHdvcmsgcHJvcGVybHkgd2l0aCBldmVyeQotKyAgICAgd2luZG93IG1hbmFnZXIuICBXZSBkbyB0aGlzIHNpbXBseSBieSBzZXR0aW5nIG92ZXJyaWRlUmVkaXJlY3QgYW5kCi0rICAgICByZXBhcmVudGluZyBvdXIgd2luZG93IHRvIHRoZSByb290LiAgVGhlIHdpbmRvdyBtYW5hZ2VyIHdpbGwgZ2V0IGEKLSsgICAgIFJlcGFyZW50Tm90aWZ5IGFuZCBob3BlZnVsbHkgY2xlYW4gdXAgaXRzIGZyYW1lIHdpbmRvdy4gKi8KLSAKLS0gIC8qIFRyeSB0byBnZXQgdGhlIGlucHV0IGZvY3VzLiAqLwotKwlpZiAoISBmc0FscmVhZHkpIHsKLSsJCWlmICghZG9fbmV0X3dtKSB7Ci0rCQkJLyogYWRkZWQgdG8gdHJ5IHRvIHJhaXNlIGl0IG9uIHRvcCBmb3Igc29tZSBjaXJ1bXN0YW5jZXMgKi8KLSsJCQlYVW5tYXBXaW5kb3coZHB5LCB0b3B3aW4pOwotKwotKwkJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsIE5VTEwpOwotKyNpZiAwCi0rCQkJWHRWYVNldFZhbHVlcyh2aWV3cG9ydCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgVHJ1ZSwgTlVMTCk7Ci0rCQkJWHRWYVNldFZhbHVlcyhkZXNrdG9wLCAgWHROb3ZlcnJpZGVSZWRpcmVjdCwgVHJ1ZSwgTlVMTCk7Ci0rI2VuZGlmCi0rCQkJWHRWYVNldFZhbHVlcyhwb3B1cCwgICAgWHROb3ZlcnJpZGVSZWRpcmVjdCwgVHJ1ZSwgTlVMTCk7Ci0rCi0rCQkJWFJlcGFyZW50V2luZG93KGRweSwgdG9wd2luLCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCAwLCAwKTsKLSsKLSsJCSAgLyogU29tZSBXTXMgZG9lcyBub3Qgb2JleSB4LHkgdmFsdWVzIG9mIFhSZXBhcmVudFdpbmRvdzsgdGhlIHdpbmRvdwotKwkJICAgICBpcyBub3QgcGxhY2VkIGluIHRoZSB1cHBlciwgbGVmdCBjb3JuZXIuIFRoZSBjb2RlIGJlbG93IGZpeGVzCi0rCQkgICAgIHRoaXM6IEl0IG1hbnVhbGx5IG1vdmVzIHRoZSB3aW5kb3csIGFmdGVyIHRoZSBYc2VydmVyIGlzIGRvbmUKLSsJCSAgICAgd2l0aCBYUmVwYXJlbnRXaW5kb3cuIFRoZSBsYXN0IFhTeW5jIHNlZW1zIHRvIHByZXZlbnQgbG9zaW5nCi0rCQkgICAgIGZvY3VzLCBidXQgSSBkb24ndCBrbm93IHdoeS4gKi8KLSsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsKLSsJCQkvKiBhZGRlZCB0byB0cnkgdG8gcmFpc2UgaXQgb24gdG9wIGZvciBzb21lIGNpcnVtc3RhbmNlcyAqLwotKwkJCVhNYXBSYWlzZWQoZHB5LCB0b3B3aW4pOwotKwotKwkJCVhNb3ZlV2luZG93KGRweSwgdG9wd2luLCAwLCAwKTsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCX0KLSsKLSsJCSAgLyogTm93IHdlIHdhbnQgdG8gZml4IHRoZSBzaXplIG9mICJ2aWV3cG9ydCIuICBXZSBzaG91bGRuJ3QganVzdCBjaGFuZ2UgaXQKLSsJCSAgICAgZGlyZWN0bHkuICBJbnN0ZWFkIHdlIHNldCAidG9wbGV2ZWwiIHRvIHRoZSByZXF1aXJlZCBzaXplICh3aGljaCBzaG91bGQKLSsJCSAgICAgcHJvcGFnYXRlIHRocm91Z2ggImZvcm0iIHRvICJ2aWV3cG9ydCIpLiAgVGhlbiB3ZSByZW1vdmUgInZpZXdwb3J0IiBmcm9tCi0rCQkgICAgIGJlaW5nIG1hbmFnZWQgYnkgImZvcm0iLCBjaGFuZ2UgaXRzIHJlc291cmNlcyB0byBwb3NpdGlvbiBpdCBhbmQgbWFrZSBzdXJlCi0rCQkgICAgIHRoYXQgImZvcm0iIHdvbid0IGF0dGVtcHQgdG8gcmVzaXplIGl0LCB0aGVuIGFzayAiZm9ybSIgdG8gbWFuYWdlIGl0Ci0rCQkgICAgIGFnYWluLiAqLwotKwotKwkJWHRSZXNpemVXaWRnZXQodG9wbGV2ZWwsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0LCAwKTsKLSsKLSsJCVh0VW5tYW5hZ2VDaGlsZCh2aWV3cG9ydCk7Ci0rCi0rCQlYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LAotKwkJCVh0Tmhvcml6RGlzdGFuY2UsIHZpZXdwb3J0WCwKLSsJCQlYdE52ZXJ0RGlzdGFuY2UsIHZpZXdwb3J0WSwKLSsJCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKLSsJCQlYdE5yaWdodCwgWHRDaGFpbkxlZnQsCi0rCQkJWHROdG9wLCBYdENoYWluVG9wLAotKwkJCVh0TmJvdHRvbSwgWHRDaGFpblRvcCwKLSsJCQlOVUxMKTsKLSsKLSsJCVh0TWFuYWdlQ2hpbGQodmlld3BvcnQpOwotKwkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCX0gZWxzZSB7Ci0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJfQotKwotKwkvKiBOb3cgd2UgY2FuIHNldCAidG9wbGV2ZWwiIHRvIGl0cyBwcm9wZXIgc2l6ZS4gKi8KLSsKLSsjaWYgMAotKwlYdFZhU2V0VmFsdWVzKHRvcGxldmVsLCBYdE53aWR0aCwgdG9wbGV2ZWxXaWR0aCwgWHROaGVpZ2h0LCB0b3BsZXZlbEhlaWdodCwgTlVMTCk7Ci0rCVh0UmVzaXplV2lkZ2V0KHRvcGxldmVsLCB0b3BsZXZlbFdpZHRoLCB0b3BsZXZlbEhlaWdodCwgMCk7Ci0rI2VuZGlmCi0rCVhSZXNpemVXaW5kb3coZHB5LCB0b3B3aW4sIHRvcGxldmVsV2lkdGgsIHRvcGxldmVsSGVpZ2h0KTsKLSsKLSsJaWYgKGRvX25ldF93bSkgewotKwkJWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLSsJCWludCBvayA9IDAsIGksIGRlbGF5ID0gMjA7Ci0rCi0rCQl1c2xlZXAoZGVsYXkgKiAxMDAwKTsKLSsKLSsjZGVmaW5lIEdTSVpFKCkgXAotKwlYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIHRvcHdpbiwgJmF0dHIpOwotKwotKyNkZWZpbmUgUFNJWkUocykgXAotKwlYU3luYyhkcHksIEZhbHNlKTsgXAotKwlYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIHRvcHdpbiwgJmF0dHIpOyBcCi0rCWZwcmludGYoc3RkZXJyLCAiJXMgJWR4JWQrJWQrJWRcbiIsIHMsIGF0dHIud2lkdGgsIGF0dHIuaGVpZ2h0LCBhdHRyLngsIGF0dHIueSk7Ci0rCi0rCQlQU0laRSgic2l6ZS1BOiIpOwotKwotKwkJc2V0X3NpemVfaGludHMoKTsKLSsKLSsJCW5ldF93bV9mdWxsc2NyZWVuKDEpOwotKwotKwkJUFNJWkUoInNpemUtQjoiKTsKLSsKLSsJCWZvciAoaT0wOyBpIDwgMzA7IGkrKykgewotKwkJCXVzbGVlcChkZWxheSAqIDEwMDApOwotKwkJCUdTSVpFKCk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJzaXplWyVkXSAlZHglZCslZCslZFxuIiwgaSwgYXR0ci53aWR0aCwgYXR0ci5oZWlnaHQsIGF0dHIueCwgYXR0ci55KTsKLSsJCQlpZiAoYXR0ci53aWR0aCA9PSB0b3BsZXZlbFdpZHRoICYmIGF0dHIuaGVpZ2h0ID09IHRvcGxldmVsSGVpZ2h0KSB7Ci0rCQkJCW9rID0gMTsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJzaXplIG9rLlxuIik7Ci0rCQkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJCQlicmVhazsKLSsJCQl9Ci0rCQkJc2V0X3NpemVfaGludHMoKTsKLSsJCQlYUmVzaXplV2luZG93KGRweSwgdG9wd2luLCB0b3BsZXZlbFdpZHRoLCB0b3BsZXZlbEhlaWdodCk7Ci0rCQkJWE1vdmVXaW5kb3coZHB5LCB0b3B3aW4sIDAsIDApOwotKwkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJfQotKwotKwkJUFNJWkUoInNpemUtQzoiKTsKLSsJfQotKwotKwlmcHJpbnRmKHN0ZGVyciwgIlxudG9wbGV2ZWw6ICVkeCVkIHZpZXdwb3J0OiAlZHglZFxuIiwgdG9wbGV2ZWxXaWR0aCwgdG9wbGV2ZWxIZWlnaHQsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0KTsKLSsKLSsjaWYgZGVmaW5lZCAoX19TVlI0KSAmJiBkZWZpbmVkIChfX3N1bikKLSsJaWYgKCFkb19uZXRfd20pIHsKLSsJCS8qIENERSAqLwotKwkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQl1c2xlZXAoMjAwICogMTAwMCk7Ci0rCQlYTW92ZVdpbmRvdyhkcHksIHRvcHdpbiwgMCwgMCk7Ci0rCQlYTWFwUmFpc2VkKGRweSwgdG9wd2luKTsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwl9Ci0rI2VuZGlmCi0rCi0rCWlmIChmc0FscmVhZHkpIHsKLSsJCVh0UmVzaXplV2lkZ2V0KHZpZXdwb3J0LCB2aWV3cG9ydFdpZHRoLCB2aWV3cG9ydEhlaWdodCwgMCk7Ci0rCQlpZiAoISB0b29iaWcpIHsKLSsJCQlYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LCBYdE5mb3JjZUJhcnMsIEZhbHNlLCBOVUxMKTsKLSsJCX0KLSsJCVhNb3ZlV2luZG93KGRweSwgdG9wd2luLCB2aWV3cG9ydFgsIHZpZXdwb3J0WSk7Ci0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJfQotKwotKwkvKiBUcnkgdG8gZ2V0IHRoZSBpbnB1dCBmb2N1cy4gKi8KLSAKLS0gIFhTZXRJbnB1dEZvY3VzKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgUmV2ZXJ0VG9Qb2ludGVyUm9vdCwKLS0JCSBDdXJyZW50VGltZSk7Ci0rCS8qIG9yaWdpbmFsIHZuYzogRGVmYXVsdFJvb3RXaW5kb3coZHB5KSBpbnN0ZWFkIG9mIFBvaW50ZXJSb290ICovCi0rCVhTZXRJbnB1dEZvY3VzKGRweSwgUG9pbnRlclJvb3QsIFJldmVydFRvUG9pbnRlclJvb3QsIEN1cnJlbnRUaW1lKTsKLSAKLS0gIC8qIE9wdGlvbmFsbHksIGdyYWIgdGhlIGtleWJvYXJkLiAqLwotKwkvKiBPcHRpb25hbGx5LCBncmFiIHRoZSBrZXlib2FyZC4gKi8KLSsJZnNfZ3JhYigwKTsKLSAKLS0gIGlmIChhcHBEYXRhLmdyYWJLZXlib2FyZCAmJgotLSAgICAgIFh0R3JhYktleWJvYXJkKGRlc2t0b3AsIFRydWUsIEdyYWJNb2RlQXN5bmMsCi0tCQkgICAgIEdyYWJNb2RlQXN5bmMsIEN1cnJlbnRUaW1lKSAhPSBHcmFiU3VjY2VzcykgewotLSAgICBmcHJpbnRmKHN0ZGVyciwgIlh0R3JhYktleWJvYXJkKCkgZmFpbGVkLlxuIik7Ci0tICB9Ci0rCS8qIGZpbmFsbHkgZG9uZS4gKi8KLSB9Ci0gCi0gCi1AQCAtMjA1LDI4ICs1NTMsNTIgQEAKLSB2b2lkCi0gRnVsbFNjcmVlbk9mZigpCi0gewotLSAgaW50IHRvcGxldmVsV2lkdGggPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotLSAgaW50IHRvcGxldmVsSGVpZ2h0ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0tCi0tICBhcHBEYXRhLmZ1bGxTY3JlZW4gPSBGYWxzZTsKLSsJaW50IHRvcGxldmVsV2lkdGgsIHRvcGxldmVsSGVpZ2h0OwotKwlpbnQgZG9fbmV0X3dtID0gbmV0X3dtX3N1cHBvcnRlZCgpOwotKwlpbnQgZmJXID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJaW50IGZiSCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwlpbnQgZWZmX2hlaWdodDsKLSsKLSsJYXBwRGF0YS5mdWxsU2NyZWVuID0gRmFsc2U7Ci0rCi0rCWxhc3RfZnVsbHNjcmVlbiA9IGRub3coKTsKLSsKLSsJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQlmYlcgPSBzY2FsZV94OwotKwkJZmJIID0gc2NhbGVfeTsKLSsJfQotKwotKwllZmZfaGVpZ2h0ID0gZmJIOwotKwlpZiAoYXBwRGF0YS55Q3JvcCA+IDApIHsKLSsJCWVmZl9oZWlnaHQgPSBhcHBEYXRhLnlDcm9wOwotKwkJaWYgKHNjYWxlX3kgPiAwKSB7Ci0rCQkJZWZmX2hlaWdodCA9IHNjYWxlX3JvdW5kKGVmZl9oZWlnaHQsIHNjYWxlX2ZhY3Rvcl95KTsKLSsJCX0KLSsJfQotKwotKwl0b3BsZXZlbFdpZHRoID0gZmJXOwotKwl0b3BsZXZlbEhlaWdodCA9IGVmZl9oZWlnaHQ7Ci0rCi0rCWZzX3VuZ3JhYigwKTsKLSsKLSsJaWYgKGRvX25ldF93bSkgewotKwkJbmV0X3dtX2Z1bGxzY3JlZW4oMCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFVubWFwV2lkZ2V0KHRvcGxldmVsKTsKLSsJfQotIAotLSAgaWYgKGFwcERhdGEuZ3JhYktleWJvYXJkKQotLSAgICBYdFVuZ3JhYktleWJvYXJkKGRlc2t0b3AsIEN1cnJlbnRUaW1lKTsKLS0KLS0gIFh0VW5tYXBXaWRnZXQodG9wbGV2ZWwpOwotLQotLSAgWHRSZXNpemVXaWRnZXQodG9wbGV2ZWwsCi0rCVh0UmVzaXplV2lkZ2V0KHRvcGxldmVsLAotIAkJIHZpZXdwb3J0V2lkdGggLSBzY3JvbGxiYXJXaWR0aCwKLSAJCSB2aWV3cG9ydEhlaWdodCAtIHNjcm9sbGJhckhlaWdodCwgMCk7Ci0tICBYdFJlc2l6ZVdpZGdldCh2aWV3cG9ydCwKLSsJWHRSZXNpemVXaWRnZXQodmlld3BvcnQsCi0gCQkgdmlld3BvcnRXaWR0aCAtIHNjcm9sbGJhcldpZHRoLAotIAkJIHZpZXdwb3J0SGVpZ2h0IC0gc2Nyb2xsYmFySGVpZ2h0LCAwKTsKLSAKLS0gIFh0VmFTZXRWYWx1ZXModmlld3BvcnQsIFh0TmZvcmNlQmFycywgRmFsc2UsIE5VTEwpOwotKwlYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LCBYdE5mb3JjZUJhcnMsIEZhbHNlLCBOVUxMKTsKLSAKLS0gIFh0VW5tYW5hZ2VDaGlsZCh2aWV3cG9ydCk7Ci0rCVh0VW5tYW5hZ2VDaGlsZCh2aWV3cG9ydCk7Ci0gCi0tICBYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LAotKwlYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LAotIAkJWHROaG9yaXpEaXN0YW5jZSwgMCwKLSAJCVh0TnZlcnREaXN0YW5jZSwgMCwKLSAJCVh0TmxlZnQsIFh0Q2hhaW5MZWZ0LAotQEAgLTIzNSwyNCArNjA3LDQyIEBACi0gCQlYdE5ib3R0b20sIFh0Q2hhaW5Cb3R0b20sCi0gCQlOVUxMKTsKLSAKLS0gIFh0TWFuYWdlQ2hpbGQodmlld3BvcnQpOwotLQotLSAgWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgRmFsc2UsIE5VTEwpOwotLQotLSAgaWYgKCh0b3BsZXZlbFdpZHRoICsgYXBwRGF0YS53bURlY29yYXRpb25XaWR0aCkgPj0gZHB5V2lkdGgpCi0tICAgIHRvcGxldmVsV2lkdGggPSBkcHlXaWR0aCAtIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGg7Ci0tCi0tICBpZiAoKHRvcGxldmVsSGVpZ2h0ICsgYXBwRGF0YS53bURlY29yYXRpb25IZWlnaHQpID49IGRweUhlaWdodCkKLS0gICAgdG9wbGV2ZWxIZWlnaHQgPSBkcHlIZWlnaHQgLSBhcHBEYXRhLndtRGVjb3JhdGlvbkhlaWdodDsKLS0KLS0gIFh0UmVzaXplV2lkZ2V0KHRvcGxldmVsLCB0b3BsZXZlbFdpZHRoLCB0b3BsZXZlbEhlaWdodCwgMCk7Ci0tCi0tICBYdE1hcFdpZGdldCh0b3BsZXZlbCk7Ci0tICBYU3luYyhkcHksIEZhbHNlKTsKLSsJWHRNYW5hZ2VDaGlsZCh2aWV3cG9ydCk7Ci0gCi0tICAvKiBTZXQgdGhlIHBvcHVwIGJhY2sgdG8gbm9uLW92ZXJyaWRlUmVkaXJlY3QgKi8KLS0KLS0gIFh0VmFTZXRWYWx1ZXMocG9wdXAsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIEZhbHNlLCBOVUxMKTsKLSsJaWYgKCFkb19uZXRfd20pIHsKLSsJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIEZhbHNlLCBOVUxMKTsKLSsjaWYgMAotKwkJWHRWYVNldFZhbHVlcyh2aWV3cG9ydCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgRmFsc2UsIE5VTEwpOwotKwkJWHRWYVNldFZhbHVlcyhkZXNrdG9wLCAgWHROb3ZlcnJpZGVSZWRpcmVjdCwgRmFsc2UsIE5VTEwpOwotKyNlbmRpZgotKwkJWHRWYVNldFZhbHVlcyhwb3B1cCwgICAgWHROb3ZlcnJpZGVSZWRpcmVjdCwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCi0rCWlmICgodG9wbGV2ZWxXaWR0aCArIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGgpID49IGRweVdpZHRoKQotKwkJdG9wbGV2ZWxXaWR0aCA9IGRweVdpZHRoIC0gYXBwRGF0YS53bURlY29yYXRpb25XaWR0aDsKLSsKLSsJaWYgKCh0b3BsZXZlbEhlaWdodCArIGFwcERhdGEud21EZWNvcmF0aW9uSGVpZ2h0KSA+PSBkcHlIZWlnaHQpCi0rCQl0b3BsZXZlbEhlaWdodCA9IGRweUhlaWdodCAtIGFwcERhdGEud21EZWNvcmF0aW9uSGVpZ2h0OwotKwotKwlYdFJlc2l6ZVdpZGdldCh0b3BsZXZlbCwgdG9wbGV2ZWxXaWR0aCwgdG9wbGV2ZWxIZWlnaHQsIDApOwotKwotKwlpZiAoIWRvX25ldF93bSkgewotKwkJWHRNYXBXaWRnZXQodG9wbGV2ZWwpOwotKwl9Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotKwotKwkvKiBTZXQgdGhlIHBvcHVwIGJhY2sgdG8gbm9uLW92ZXJyaWRlUmVkaXJlY3QgKi8KLSsKLSsJWHRWYVNldFZhbHVlcyhwb3B1cCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgRmFsc2UsIE5VTEwpOwotKwotKwlpZiAoIWRvX25ldF93bSkgewotKwkJaW50IHggPSAoZHB5V2lkdGggIC0gdG9wbGV2ZWxXaWR0aCkgIC8gMjsKLSsJCWludCB5ID0gKGRweUhlaWdodCAtIHRvcGxldmVsSGVpZ2h0KSAvIDI7Ci0rCQlpZiAoeCA+IDAgJiYgeSA+IDApIHsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQlYTW92ZVdpbmRvdyhkcHksIFh0V2luZG93KHRvcGxldmVsKSwgeCwgeSk7Ci0rCQl9Ci0rCX0KLSB9Ci0gCi0gCi1AQCAtMjY0LDEwICs2NTQsMTIgQEAKLSB2b2lkCi0gU2V0RnVsbFNjcmVlblN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0gewotLSAgaWYgKGFwcERhdGEuZnVsbFNjcmVlbikKLS0gICAgWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0tICBlbHNlCi0tICAgIFh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJaWYgKGFwcERhdGEuZnVsbFNjcmVlbikgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0gfQotIAotIAotQEAgLTI3OCwxMSArNjcwLDEyIEBACi0gdm9pZAotIFRvZ2dsZUZ1bGxTY3JlZW4oV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSB7Ci0tICBpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0tICAgIEZ1bGxTY3JlZW5PZmYoKTsKLS0gIH0gZWxzZSB7Ci0tICAgIEZ1bGxTY3JlZW5PbigpOwotLSAgfQotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlGdWxsU2NyZWVuT2ZmKCk7Ci0rCX0gZWxzZSB7Ci0rCQlGdWxsU2NyZWVuT24oKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci0gCi0gCi1AQCAtMjk0LDg0ICs2ODcsMjI2IEBACi0gQm9vbAotIEJ1bXBTY3JvbGwoWEV2ZW50ICpldikKLSB7Ci0tICBzY3JvbGxMZWZ0ID0gc2Nyb2xsUmlnaHQgPSBzY3JvbGxVcCA9IHNjcm9sbERvd24gPSBGYWxzZTsKLSsJc2Nyb2xsTGVmdCA9IHNjcm9sbFJpZ2h0ID0gc2Nyb2xsVXAgPSBzY3JvbGxEb3duID0gRmFsc2U7Ci0gCi0tICBpZiAoZXYtPnhtb3Rpb24ueF9yb290ID49IGRweVdpZHRoIC0gMykKLS0gICAgc2Nyb2xsUmlnaHQgPSBUcnVlOwotLSAgZWxzZSBpZiAoZXYtPnhtb3Rpb24ueF9yb290IDw9IDIpCi0tICAgIHNjcm9sbExlZnQgPSBUcnVlOwotLQotLSAgaWYgKGV2LT54bW90aW9uLnlfcm9vdCA+PSBkcHlIZWlnaHQgLSAzKQotLSAgICBzY3JvbGxEb3duID0gVHJ1ZTsKLS0gIGVsc2UgaWYgKGV2LT54bW90aW9uLnlfcm9vdCA8PSAyKQotLSAgICBzY3JvbGxVcCA9IFRydWU7Ci0tCi0tICBpZiAoc2Nyb2xsTGVmdCB8fCBzY3JvbGxSaWdodCB8fCBzY3JvbGxVcCB8fCBzY3JvbGxEb3duKSB7Ci0tICAgIGlmICh0aW1lclNldCkKLS0gICAgICByZXR1cm4gVHJ1ZTsKLS0KLS0gICAgWHRWYUdldFZhbHVlcyhkZXNrdG9wLCBYdE54LCAmZGVza3RvcFgsIFh0TnksICZkZXNrdG9wWSwgTlVMTCk7Ci0tICAgIGRlc2t0b3BYID0gLWRlc2t0b3BYOwotLSAgICBkZXNrdG9wWSA9IC1kZXNrdG9wWTsKLS0KLS0gICAgcmV0dXJuIERvQnVtcFNjcm9sbCgpOwotLSAgfQotLQotLSAgaWYgKHRpbWVyU2V0KSB7Ci0tICAgIFh0UmVtb3ZlVGltZU91dCh0aW1lcik7Ci0tICAgIHRpbWVyU2V0ID0gRmFsc2U7Ci0tICB9Ci0rCWlmIChldi0+eG1vdGlvbi54X3Jvb3QgPj0gZHB5V2lkdGggLSAzKQotKwkJc2Nyb2xsUmlnaHQgPSBUcnVlOwotKwllbHNlIGlmIChldi0+eG1vdGlvbi54X3Jvb3QgPD0gMikKLSsJCXNjcm9sbExlZnQgPSBUcnVlOwotKwotKwlpZiAoZXYtPnhtb3Rpb24ueV9yb290ID49IGRweUhlaWdodCAtIDMpCi0rCQlzY3JvbGxEb3duID0gVHJ1ZTsKLSsJZWxzZSBpZiAoZXYtPnhtb3Rpb24ueV9yb290IDw9IDIpCi0rCQlzY3JvbGxVcCA9IFRydWU7Ci0rCi0rCWlmIChzY3JvbGxMZWZ0IHx8IHNjcm9sbFJpZ2h0IHx8IHNjcm9sbFVwIHx8IHNjcm9sbERvd24pIHsKLSsJCWlmICh0aW1lclNldCkKLSsJCQlyZXR1cm4gVHJ1ZTsKLSsKLSsJCVh0VmFHZXRWYWx1ZXMoZGVza3RvcCwgWHROeCwgJmRlc2t0b3BYLCBYdE55LCAmZGVza3RvcFksIE5VTEwpOwotKwkJZGVza3RvcFggPSAtZGVza3RvcFg7Ci0rCQlkZXNrdG9wWSA9IC1kZXNrdG9wWTsKLSsKLSsJCXJldHVybiBEb0J1bXBTY3JvbGwoKTsKLSsJfQotKwotKwlpZiAodGltZXJTZXQpIHsKLSsJCVh0UmVtb3ZlVGltZU91dCh0aW1lcik7Ci0rCQl0aW1lclNldCA9IEZhbHNlOwotKwl9Ci0gCi0tICByZXR1cm4gRmFsc2U7Ci0rCXJldHVybiBGYWxzZTsKLSB9Ci0gCi0gc3RhdGljIEJvb2wKLSBEb0J1bXBTY3JvbGwoKQotIHsKLS0gIGludCBvbGR4ID0gZGVza3RvcFgsIG9sZHkgPSBkZXNrdG9wWTsKLS0KLS0gIGlmIChzY3JvbGxSaWdodCkgewotLSAgICBpZiAoZGVza3RvcFggPCBzaS5mcmFtZWJ1ZmZlcldpZHRoIC0gZHB5V2lkdGgpIHsKLS0gICAgICBkZXNrdG9wWCArPSBhcHBEYXRhLmJ1bXBTY3JvbGxQaXhlbHM7Ci0tICAgICAgaWYgKGRlc2t0b3BYID4gc2kuZnJhbWVidWZmZXJXaWR0aCAtIGRweVdpZHRoKQotLQlkZXNrdG9wWCA9IHNpLmZyYW1lYnVmZmVyV2lkdGggLSBkcHlXaWR0aDsKLS0gICAgfQotLSAgfSBlbHNlIGlmIChzY3JvbGxMZWZ0KSB7Ci0tICAgIGlmIChkZXNrdG9wWCA+IDApIHsKLS0gICAgICBkZXNrdG9wWCAtPSBhcHBEYXRhLmJ1bXBTY3JvbGxQaXhlbHM7Ci0tICAgICAgaWYgKGRlc2t0b3BYIDwgMCkKLS0JZGVza3RvcFggPSAwOwotLSAgICB9Ci0tICB9Ci0tCi0tICBpZiAoc2Nyb2xsRG93bikgewotLSAgICBpZiAoZGVza3RvcFkgPCBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIGRweUhlaWdodCkgewotLSAgICAgIGRlc2t0b3BZICs9IGFwcERhdGEuYnVtcFNjcm9sbFBpeGVsczsKLS0gICAgICBpZiAoZGVza3RvcFkgPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIGRweUhlaWdodCkKLS0JZGVza3RvcFkgPSBzaS5mcmFtZWJ1ZmZlckhlaWdodCAtIGRweUhlaWdodDsKLS0gICAgfQotLSAgfSBlbHNlIGlmIChzY3JvbGxVcCkgewotLSAgICBpZiAoZGVza3RvcFkgPiAwKSB7Ci0tICAgICAgZGVza3RvcFkgLT0gYXBwRGF0YS5idW1wU2Nyb2xsUGl4ZWxzOwotLSAgICAgIGlmIChkZXNrdG9wWSA8IDApCi0tCWRlc2t0b3BZID0gMDsKLS0gICAgfQotLSAgfQotLQotLSAgaWYgKG9sZHggIT0gZGVza3RvcFggfHwgb2xkeSAhPSBkZXNrdG9wWSkgewotLSAgICBYYXdWaWV3cG9ydFNldENvb3JkaW5hdGVzKHZpZXdwb3J0LCBkZXNrdG9wWCwgZGVza3RvcFkpOwotLSAgICB0aW1lciA9IFh0QXBwQWRkVGltZU91dChhcHBDb250ZXh0LCBhcHBEYXRhLmJ1bXBTY3JvbGxUaW1lLAotLQkJCSAgICBCdW1wU2Nyb2xsVGltZXJDYWxsYmFjaywgTlVMTCk7Ci0tICAgIHRpbWVyU2V0ID0gVHJ1ZTsKLS0gICAgcmV0dXJuIFRydWU7Ci0tICB9Ci0rCWludCBvbGR4ID0gZGVza3RvcFgsIG9sZHkgPSBkZXNrdG9wWTsKLSsJaW50IGZiVyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCWludCBmYkggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsKLSsJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQlmYlcgPSBzY2FsZV94OwotKwkJZmJIID0gc2NhbGVfeTsKLSsJfQotKwotKwlpZiAoc2Nyb2xsUmlnaHQpIHsKLSsJCWlmIChkZXNrdG9wWCA8IGZiVyAtIGRweVdpZHRoKSB7Ci0rCQkJZGVza3RvcFggKz0gYXBwRGF0YS5idW1wU2Nyb2xsUGl4ZWxzOwotKwkJCWlmIChkZXNrdG9wWCA+IGZiVyAtIGRweVdpZHRoKSB7Ci0rCQkJCWRlc2t0b3BYID0gZmJXIC0gZHB5V2lkdGg7Ci0rCQkJfQotKwkJfQotKwl9IGVsc2UgaWYgKHNjcm9sbExlZnQpIHsKLSsJCWlmIChkZXNrdG9wWCA+IDApIHsKLSsJCQlkZXNrdG9wWCAtPSBhcHBEYXRhLmJ1bXBTY3JvbGxQaXhlbHM7Ci0rCQkJaWYgKGRlc2t0b3BYIDwgMCkgewotKwkJCQlkZXNrdG9wWCA9IDA7Ci0rCQkJfQotKwkJfQotKwl9Ci0rCi0rCWlmIChzY3JvbGxEb3duKSB7Ci0rCQlpbnQgeWNyb3AgPSBhcHBEYXRhLnlDcm9wOwotKwkJaWYgKHNjYWxlX3kgPiAwKSAgewotKwkJCXljcm9wID0gc2NhbGVfcm91bmQoeWNyb3AsIHNjYWxlX2ZhY3Rvcl95KTsKLSsJCX0KLSsJCWlmICh5Y3JvcCA+IDAgJiYgZGVza3RvcFkgKyBkcHlIZWlnaHQgPj0geWNyb3ApIHsKLSsJCQk7Ci0rCQl9IGVsc2UgaWYgKGRlc2t0b3BZIDwgZmJIIC0gZHB5SGVpZ2h0KSB7Ci0rCQkJZGVza3RvcFkgKz0gYXBwRGF0YS5idW1wU2Nyb2xsUGl4ZWxzOwotKwkJCWlmIChkZXNrdG9wWSA+IGZiSCAtIGRweUhlaWdodCkgewotKwkJCQlkZXNrdG9wWSA9IGZiSCAtIGRweUhlaWdodDsKLSsJCQl9Ci0rCQl9Ci0rCX0gZWxzZSBpZiAoc2Nyb2xsVXApIHsKLSsJCWlmIChkZXNrdG9wWSA+IDApIHsKLSsJCQlkZXNrdG9wWSAtPSBhcHBEYXRhLmJ1bXBTY3JvbGxQaXhlbHM7Ci0rCQkJaWYgKGRlc2t0b3BZIDwgMCkgewotKwkJCQlkZXNrdG9wWSA9IDA7Ci0rCQkJfQotKwkJfQotKwl9Ci0rCi0rCWlmIChvbGR4ICE9IGRlc2t0b3BYIHx8IG9sZHkgIT0gZGVza3RvcFkpIHsKLSsJCVhhd1ZpZXdwb3J0U2V0Q29vcmRpbmF0ZXModmlld3BvcnQsIGRlc2t0b3BYLCBkZXNrdG9wWSk7Ci0rCQl0aW1lciA9IFh0QXBwQWRkVGltZU91dChhcHBDb250ZXh0LCBhcHBEYXRhLmJ1bXBTY3JvbGxUaW1lLCBCdW1wU2Nyb2xsVGltZXJDYWxsYmFjaywgTlVMTCk7Ci0rCQl0aW1lclNldCA9IFRydWU7Ci0rCQlyZXR1cm4gVHJ1ZTsKLSsJfQotIAotLSAgdGltZXJTZXQgPSBGYWxzZTsKLS0gIHJldHVybiBGYWxzZTsKLSsJdGltZXJTZXQgPSBGYWxzZTsKLSsJcmV0dXJuIEZhbHNlOwotIH0KLSAKLSBzdGF0aWMgdm9pZAotIEJ1bXBTY3JvbGxUaW1lckNhbGxiYWNrKFh0UG9pbnRlciBjbGllbnREYXRhLCBYdEludGVydmFsSWQgKmlkKQotIHsKLS0gIERvQnVtcFNjcm9sbCgpOwotKwlEb0J1bXBTY3JvbGwoKTsKLSsJaWYgKGNsaWVudERhdGEgfHwgaWQpIHt9Ci0rfQotKwotKy8qIG5vdCB3b3JraW5nOiAqLwotKwotK0Jvb2wKLStKdW1wU2Nyb2xsKGludCB1cCwgaW50IHZlcnQpIHsKLSsJc2Nyb2xsTGVmdCA9IHNjcm9sbFJpZ2h0ID0gc2Nyb2xsVXAgPSBzY3JvbGxEb3duID0gRmFsc2U7Ci0rCi0rCQotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlyZXR1cm4gVHJ1ZTsKLSsJfQotKwlmcHJpbnRmKHN0ZGVyciwgIkp1bXBTY3JvbGwoJWQsICVkKVxuIiwgdXAsIHZlcnQpOwotKwotKwlpZiAodmVydCkgewotKwkJaWYgKHVwKSB7Ci0rCQkJc2Nyb2xsVXAgPSBUcnVlOwotKwkJfSBlbHNlIHsKLSsJCQlzY3JvbGxEb3duID0gVHJ1ZTsKLSsJCX0KLSsJfSBlbHNlIHsKLSsJCWlmICh1cCkgewotKwkJCXNjcm9sbFJpZ2h0ID0gVHJ1ZTsKLSsJCX0gZWxzZSB7Ci0rCQkJc2Nyb2xsTGVmdCA9IFRydWU7Ci0rCQl9Ci0rCX0KLSsKLSsJaWYgKHNjcm9sbExlZnQgfHwgc2Nyb2xsUmlnaHQgfHwgc2Nyb2xsVXAgfHwgc2Nyb2xsRG93bikgewotKwkJaWYgKHRpbWVyU2V0KSB7Ci0rCQkJcmV0dXJuIFRydWU7Ci0rCQl9Ci0rCi0rCQlYdFZhR2V0VmFsdWVzKGRlc2t0b3AsIFh0TngsICZkZXNrdG9wWCwgWHROeSwgJmRlc2t0b3BZLCBOVUxMKTsKLSsJCWRlc2t0b3BYID0gLWRlc2t0b3BYOwotKwkJZGVza3RvcFkgPSAtZGVza3RvcFk7Ci0rCQlyZXR1cm4gRG9KdW1wU2Nyb2xsKCk7Ci0rCX0KLSsKLSsJaWYgKHRpbWVyU2V0KSB7Ci0rCQlYdFJlbW92ZVRpbWVPdXQodGltZXIpOwotKwkJdGltZXJTZXQgPSBGYWxzZTsKLSsJfQotKwotKwlyZXR1cm4gRmFsc2U7Ci0rfQotKwotK3N0YXRpYyBCb29sCi0rRG9KdW1wU2Nyb2xsKCkgewotKwlpbnQgb2xkeCA9IGRlc2t0b3BYLCBvbGR5ID0gZGVza3RvcFk7Ci0rCWludCBqdW1wSCwganVtcFY7IAotKwlpbnQgZmJXID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJaW50IGZiSCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwotKwlpZiAoc2NhbGVfeCA+IDApIHsKLSsJCWZiVyA9IHNjYWxlX3g7Ci0rCQlmYkggPSBzY2FsZV95OwotKwl9Ci0rCWp1bXBIID0gZmJXIC8gNDsKLSsJanVtcFYgPSBmYkggLyA0OwotKwotKwlpZiAoc2Nyb2xsUmlnaHQpIHsKLSsJCWlmIChkZXNrdG9wWCA8IGZiVyAtIGRweVdpZHRoKSB7Ci0rCQkJZGVza3RvcFggKz0ganVtcEg7Ci0rCQkJaWYgKGRlc2t0b3BYID4gZmJXIC0gZHB5V2lkdGgpCi0rCQkJCWRlc2t0b3BYID0gZmJXIC0gZHB5V2lkdGg7Ci0rCQl9Ci0rCX0gZWxzZSBpZiAoc2Nyb2xsTGVmdCkgewotKwkJaWYgKGRlc2t0b3BYID4gMCkgewotKwkJCWRlc2t0b3BYIC09IGp1bXBIOwotKwkJCWlmIChkZXNrdG9wWCA8IDApCi0rCQkJCWRlc2t0b3BYID0gMDsKLSsJCX0KLSsJfQotKwotKwlpZiAoc2Nyb2xsRG93bikgewotKwkJaWYgKGFwcERhdGEueUNyb3AgPiAwICYmIGRlc2t0b3BZICsgZHB5SGVpZ2h0ID49IGFwcERhdGEueUNyb3ApIHsKLSsJCQk7Ci0rCQl9IGVsc2UgaWYgKGRlc2t0b3BZIDwgZmJIIC0gZHB5SGVpZ2h0KSB7Ci0rCQkJZGVza3RvcFkgKz0ganVtcFY7Ci0rCQkJaWYgKGRlc2t0b3BZID4gZmJIIC0gZHB5SGVpZ2h0KQotKwkJCQlkZXNrdG9wWSA9IGZiSCAtIGRweUhlaWdodDsKLSsJCX0KLSsJfSBlbHNlIGlmIChzY3JvbGxVcCkgewotKwkJaWYgKGRlc2t0b3BZID4gMCkgewotKwkJCWRlc2t0b3BZIC09IGp1bXBWOwotKwkJCWlmIChkZXNrdG9wWSA8IDApCi0rCQkJCWRlc2t0b3BZID0gMDsKLSsJCX0KLSsJfQotKwotKwlpZiAob2xkeCAhPSBkZXNrdG9wWCB8fCBvbGR5ICE9IGRlc2t0b3BZKSB7Ci0rCQlYYXdWaWV3cG9ydFNldENvb3JkaW5hdGVzKHZpZXdwb3J0LCBkZXNrdG9wWCwgZGVza3RvcFkpOwotKwkJdGltZXIgPSBYdEFwcEFkZFRpbWVPdXQoYXBwQ29udGV4dCwgYXBwRGF0YS5idW1wU2Nyb2xsVGltZSwKLSsJCQkJICAgIEp1bXBTY3JvbGxUaW1lckNhbGxiYWNrLCBOVUxMKTsKLSsJCXRpbWVyU2V0ID0gVHJ1ZTsKLSsJCXJldHVybiBUcnVlOwotKwl9Ci0rCi0rCXRpbWVyU2V0ID0gRmFsc2U7Ci0rCXJldHVybiBGYWxzZTsKLSt9Ci0rCi0rc3RhdGljIHZvaWQKLStKdW1wU2Nyb2xsVGltZXJDYWxsYmFjayhYdFBvaW50ZXIgY2xpZW50RGF0YSwgWHRJbnRlcnZhbElkICppZCkgewotKwlEb0p1bXBTY3JvbGwoKTsKLSsJaWYgKGNsaWVudERhdGEgfHwgaWQpIHt9Ci0rfQotK3ZvaWQgSnVtcFJpZ2h0KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpIHsKLSsJSnVtcFNjcm9sbCgxLCAwKTsgCi0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSt2b2lkIEp1bXBMZWZ0KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpIHsKLSsJSnVtcFNjcm9sbCgwLCAwKTsgCi0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSt2b2lkIEp1bXBVcChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKSB7Ci0rCUp1bXBTY3JvbGwoMSwgMSk7IAotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci0rdm9pZCBKdW1wRG93bihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKSB7Ci0rCUp1bXBTY3JvbGwoMCwgMSk7IAotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rCi1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9oMmh0bWwucGwgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2gyaHRtbC5wbAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2gyaHRtbC5wbAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9oMmh0bWwucGwJMjAwOC0wOC0zMCAyMDozNDo0NS4wMDAwMDAwMDAgLTA0MDAKLUBAIC0wLDAgKzEsMTAgQEAKLSsjIS91c3IvYmluL3BlcmwKLSsKLStvcGVuKEhFTFAsICIuL3ZuY3ZpZXdlciAtaGVscHwiKTsKLSsKLSt3aGlsZSAoPEhFTFA+KSB7Ci0rCSRfID1+IHMvJi8mYW1wOy9nOwotKwkkXyA9fiBzLzwvJmx0Oy9nOwotKwkkXyA9fiBzLz4vJmd0Oy9nOwotKwlwcmludDsKLSt9Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9oZXh0aWxlLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2hleHRpbGUuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2hleHRpbGUuYwkyMDA3LTAyLTE3IDIyOjMzOjQ2LjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9oZXh0aWxlLmMJMjAwOS0xMC0xNiAyMjo1NDo0MC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0zMCw2ICszMCwyMSBAQAotICNkZWZpbmUgQ0FSREJQUCBDT05DQVQyRShDQVJELEJQUCkKLSAjZGVmaW5lIEdFVF9QSVhFTCBDT05DQVQyRShHRVRfUElYRUwsQlBQKQotIAotKyNkZWZpbmUgRmlsbFJlY3RhbmdsZSh4LCB5LCB3LCBoLCBjb2xvcikgIFwKLSsJeyBcCi0rCQlYR0NWYWx1ZXMgX2djdjsgXAotKwkJX2djdi5mb3JlZ3JvdW5kID0gY29sb3I7IFwKLSsJCWlmICghYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7IFwKLSsJCQlGaWxsU2NyZWVuKHgsIHksIHcsIGgsIF9nY3YuZm9yZWdyb3VuZCk7IFwKLSsJCX0gZWxzZSB7IFwKLSsJCQlYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmX2djdik7IFwKLSsJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCB4LCB5LCB3LCBoKTsgXAotKwkJfSBcCi0rCX0KLSsKLStleHRlcm4gaW50IHNraXBfbWF5YmVfc3luYzsKLStleHRlcm4gdm9pZCBtYXliZV9zeW5jKGludCB3LCBpbnQgaCk7Ci0rCi0gc3RhdGljIEJvb2wKLSBIYW5kbGVIZXh0aWxlQlBQIChpbnQgcngsIGludCByeSwgaW50IHJ3LCBpbnQgcmgpCi0gewotQEAgLTQxLDIxICs1Niw0MyBAQAotICAgaW50IHN4LCBzeSwgc3csIHNoOwotICAgQ0FSRDggc3ViZW5jb2Rpbmc7Ci0gICBDQVJEOCBuU3VicmVjdHM7Ci0rICBpbnQgaXJlY3QgPSAwLCBucmVjdHMgPSAocncgKiByaCkgLyAoMTYgKiAxNik7Ci0rICBzdGF0aWMgaW50IG5vc3luY195Y3JvcCA9IC0xOwotKwotKwlpZiAobm9zeW5jX3ljcm9wIDwgMCkgewotKwkJbm9zeW5jX3ljcm9wID0gMDsKLSsJCWlmIChnZXRlbnYoIkhFWFRJTEVfWUNST1BfVE9PIikpIHsKLSsJCQlub3N5bmNfeWNyb3AgPSAxOwotKwkJfQotKwl9Ci0gCi0gICBmb3IgKHkgPSByeTsgeSA8IHJ5K3JoOyB5ICs9IDE2KSB7Ci0gICAgIGZvciAoeCA9IHJ4OyB4IDwgcngrcnc7IHggKz0gMTYpIHsKLSAgICAgICB3ID0gaCA9IDE2OwotLSAgICAgIGlmIChyeCtydyAtIHggPCAxNikKLSsgICAgICBpZiAocngrcncgLSB4IDwgMTYpIHsKLSAJdyA9IHJ4K3J3IC0geDsKLS0gICAgICBpZiAocnkrcmggLSB5IDwgMTYpCi0rICAgICAgfQotKyAgICAgIGlmIChyeStyaCAtIHkgPCAxNikgewotIAloID0gcnkrcmggLSB5OwotKyAgICAgIH0KLSsKLSsJaWYgKG5yZWN0cyA+IDQwMCAmJiAoYXBwRGF0YS55Q3JvcCA9PSAwIHx8IG5vc3luY195Y3JvcCkpIHsKLSsJCXNraXBfbWF5YmVfc3luYyA9IDA7CQotKwkJaWYgKGlyZWN0KysgJSAyMDAwICE9IDApIHsKLSsJCQlpZiAoeCA8IHJ4K3J3LTE2IHx8IHkgPCByeStyaC0xNikgewotKwkJCQlza2lwX21heWJlX3N5bmMJPSAxOwotKwkJCX0KLSsJCX0KLSsJfQotIAotLSAgICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmc3ViZW5jb2RpbmcsIDEpKQotKyAgICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmc3ViZW5jb2RpbmcsIDEpKSB7Ci0gCXJldHVybiBGYWxzZTsKLSsgICAgICB9Ci0gCi0gICAgICAgaWYgKHN1YmVuY29kaW5nICYgcmZiSGV4dGlsZVJhdykgewotLQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZmZlciwgdyAqIGggKiAoQlBQIC8gOCkpKQotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZmZlciwgdyAqIGggKiAoQlBQIC8gOCkpKSB7Ci0gCSAgcmV0dXJuIEZhbHNlOwotKyAgICAgICAgfQotIAotIAlDb3B5RGF0YVRvU2NyZWVuKGJ1ZmZlciwgeCwgeSwgdywgaCk7Ci0gCWNvbnRpbnVlOwotQEAgLTY2LDE0ICsxMDMsMjUgQEAKLSAJICByZXR1cm4gRmFsc2U7Ci0gCi0gI2lmIChCUFAgPT0gOCkKLS0gICAgICBpZiAoYXBwRGF0YS51c2VCR1IyMzMpCi0rICAgICAgaWYgKGFwcERhdGEudXNlQkdSMjMzKSB7Ci0gCWdjdi5mb3JlZ3JvdW5kID0gQkdSMjMzVG9QaXhlbFtiZ107Ci0tICAgICAgZWxzZQotKyAgICAgIH0gZWxzZQotKyNlbmRpZgotKyNpZiAoQlBQID09IDE2KQotKyAgICAgIGlmIChhcHBEYXRhLnVzZUJHUjU2NSkgewotKwlnY3YuZm9yZWdyb3VuZCA9IEJHUjU2NVRvUGl4ZWxbYmddOwotKyAgICAgIH0gZWxzZQotICNlbmRpZgotKyAgICAgIHsKLSAJZ2N2LmZvcmVncm91bmQgPSBiZzsKLSsgICAgICB9Ci0gCi0tICAgICAgWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0tICAgICAgWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBnYywgeCwgeSwgdywgaCk7Ci0rI2lmIDAKLSsJWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0rCVhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHgsIHksIHcsIGgpOwotKyNlbHNlCi0rCUZpbGxSZWN0YW5nbGUoeCwgeSwgdywgaCwgZ2N2LmZvcmVncm91bmQpOwotKyNlbmRpZgotIAotICAgICAgIGlmIChzdWJlbmNvZGluZyAmIHJmYkhleHRpbGVGb3JlZ3JvdW5kU3BlY2lmaWVkKQotIAlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJmZnLCBzaXplb2YoZmcpKSkKLUBAIC0xMDEsMTQgKzE0OSwyNSBAQAotIAkgIHNoID0gcmZiSGV4dGlsZUV4dHJhY3RIKCpwdHIpOwotIAkgIHB0cisrOwotICNpZiAoQlBQID09IDgpCi0tCSAgaWYgKGFwcERhdGEudXNlQkdSMjMzKQotKwkgIGlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotIAkgICAgZ2N2LmZvcmVncm91bmQgPSBCR1IyMzNUb1BpeGVsW2ZnXTsKLS0JICBlbHNlCi0rCSAgfSBlbHNlCi0gI2VuZGlmCi0rI2lmIChCUFAgPT0gMTYpCi0rCSAgaWYgKGFwcERhdGEudXNlQkdSNTY1KSB7Ci0rCSAgICBnY3YuZm9yZWdyb3VuZCA9IEJHUjU2NVRvUGl4ZWxbZmddOwotKwkgIH0gZWxzZQotKyNlbmRpZgotKwkgIHsKLSAJICAgIGdjdi5mb3JlZ3JvdW5kID0gZmc7Ci0rCSAgfQotIAotLQkgIFhDaGFuZ2VHQyhkcHksIGdjLCBHQ0ZvcmVncm91bmQsICZnY3YpOwotLQkgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHgrc3gsIHkrc3ksIHN3LCBzaCk7Ci0rI2lmIDAKLSsgICAgICAgICAgWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0rICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHgrc3gsIHkrc3ksIHN3LCBzaCk7Ci0rI2Vsc2UKLSsJICBGaWxsUmVjdGFuZ2xlKHgrc3gsIHkrc3ksIHN3LCBzaCwgZ2N2LmZvcmVncm91bmQpOwotKyNlbmRpZgotIAl9Ci0gCi0gICAgICAgfSBlbHNlIHsKLUBAIC0xMTYsMTMgKzE3NSwyMiBAQAotIAkgIHJldHVybiBGYWxzZTsKLSAKLSAjaWYgKEJQUCA9PSA4KQotLQlpZiAoYXBwRGF0YS51c2VCR1IyMzMpCi0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotIAkgIGdjdi5mb3JlZ3JvdW5kID0gQkdSMjMzVG9QaXhlbFtmZ107Ci0tCWVsc2UKLSsJfSBlbHNlCi0gI2VuZGlmCi0rI2lmIChCUFAgPT0gMTYpCi0rICAgICAgICBpZiAoYXBwRGF0YS51c2VCR1I1NjUpIHsKLSsgICAgICAgICAgZ2N2LmZvcmVncm91bmQgPSBCR1I1NjVUb1BpeGVsW2ZnXTsKLSsJfSBlbHNlCi0rI2VuZGlmCi0rCXsKLSAJICBnY3YuZm9yZWdyb3VuZCA9IGZnOwotKwl9Ci0gCi0rI2lmIDAKLSAJWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0rI2VuZGlmCi0gCi0gCWZvciAoaSA9IDA7IGkgPCBuU3VicmVjdHM7IGkrKykgewotIAkgIHN4ID0gcmZiSGV4dGlsZUV4dHJhY3RYKCpwdHIpOwotQEAgLTEzMSw3ICsxOTksMTEgQEAKLSAJICBzdyA9IHJmYkhleHRpbGVFeHRyYWN0VygqcHRyKTsKLSAJICBzaCA9IHJmYkhleHRpbGVFeHRyYWN0SCgqcHRyKTsKLSAJICBwdHIrKzsKLSsjaWYgMAotIAkgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHgrc3gsIHkrc3ksIHN3LCBzaCk7Ci0rI2Vsc2UKLSsJICBGaWxsUmVjdGFuZ2xlKHgrc3gsIHkrc3ksIHN3LCBzaCwgZ2N2LmZvcmVncm91bmQpOwotKyNlbmRpZgotIAl9Ci0gICAgICAgfQotICAgICB9Ci1AQCAtMTM5LDMgKzIxMSw1IEBACi0gCi0gICByZXR1cm4gVHJ1ZTsKLSB9Ci0rCi0rI3VuZGVmIEZpbGxSZWN0YW5nbGUKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2xpc3Rlbi5jIHZuY191bml4c3JjL3ZuY3ZpZXdlci9saXN0ZW4uYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2xpc3Rlbi5jCTIwMDEtMDEtMTYgMDM6MDc6NTcuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2xpc3Rlbi5jCTIwMTAtMDQtMTEgMjM6MTQ6MjEuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMzIsMTQgKzMyLDg4IEBACi0gI2RlZmluZSBGTEFTSERFTEFZIDEJLyogc2Vjb25kcyAqLwotIAotIEJvb2wgbGlzdGVuU3BlY2lmaWVkID0gRmFsc2U7Ci0rcGlkX3QgbGlzdGVuUGFyZW50ID0gMDsKLSBpbnQgbGlzdGVuUG9ydCA9IDAsIGZsYXNoUG9ydCA9IDA7Ci0gCi0rI2lmIDAKLSBzdGF0aWMgRm9udCBmbGFzaEZvbnQ7Ci0tCi0gc3RhdGljIHZvaWQgZ2V0Rmxhc2hGb250KERpc3BsYXkgKmQpOwotIHN0YXRpYyB2b2lkIGZsYXNoRGlzcGxheShEaXNwbGF5ICpkLCBjaGFyICp1c2VyKTsKLSsjZW5kaWYKLSsKLSBzdGF0aWMgQm9vbCBBbGxYRXZlbnRzUHJlZGljYXRlKERpc3BsYXkgKmQsIFhFdmVudCAqZXYsIGNoYXIgKmFyZyk7Ci0gCi0rdm9pZCByYWlzZW1lKGludCBmb3JjZSk7Ci0rCi0rc3RhdGljIGludCBhY2NlcHRfcG9wdXBfY2hlY2soaW50ICphcmdjLCBjaGFyICoqYXJndiwgY2hhciAqc2lwLCBjaGFyICpzaWgpIHsKLSsJY2hhciBsaW5lWzE2XTsKLSsJY2hhciBtc2dbMTAwMF07Ci0rCWludCBkb3BvcHVwID0gMTsKLSsKLSsJaWYgKCFnZXRlbnYoIlNTVk5DX0FDQ0VQVF9QT1BVUCIpKSB7Ci0rCQlyZXR1cm4gMTsKLSsJfQotKwkKLSsJaWYgKCFkb3BvcHVwICYmIHVzZV90dHkoKSkgewotKwkJcmFpc2VtZSgxKTsKLSsJCWZwcmludGYoc3RkZXJyLCAiQWNjZXB0IFZOQyBjb25uZWN0aW9uPyB5L1tuXSAiKTsKLSsJCWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pOwotKwkJaWYgKCFzdHJjaHIobGluZSwgJ3knKSAmJiAhc3RyY2hyKGxpbmUsICdZJykpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlJlZnVzaW5nIGNvbm5lY3Rpb24uXG4iKTsKLSsJCQlyZXR1cm4gMDsKLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJBY2NlcHRpbmcgY29ubmVjdGlvbi5cbiIpOwotKwkJCXJldHVybiAxOwotKwkJfQotKwl9IGVsc2UgewotKwkJaW50IHBpZCwgcGlkMiwgYWNjZXB0X2l0ID0gMDsKLSsKLSsJCXBpZCA9IGZvcmsoKTsKLSsJCWlmIChwaWQgPT0gLTEpIHsKLSsJCQlwZXJyb3IoImZvcmsiKTsgCi0rCQkJZXhpdCgxKTsKLSsJCX0KLSsJCWlmIChwaWQgPT0gMCkgewotKwkJCWNoYXIgKmdlb21ldHJ5ID0gIjJ4MiswKzAiOwotKwkJCVN0cmluZyBmYltdID0geyAiKm1lc3NhZ2UuU2Nyb2xsOiB3aGVuTmVlZGVkIiwgTlVMTH07Ci0rCQkJY2xvc2UocmZic29jayk7Ci0rCi0rCQkJdG9wbGV2ZWwgPSBYdEFwcEluaXRpYWxpemUoJmFwcENvbnRleHQsICJTc3ZuYyIsIGNtZExpbmVPcHRpb25zLCBudW1DbWRMaW5lT3B0aW9ucywKLSsJCQkgICAgYXJnYywgYXJndiwgZmIsIE5VTEwsIDApOwotKwkJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm1heFdpZHRoLCAyLCBYdE5tYXhIZWlnaHQsIDIsIE5VTEwpOwotKwkJCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tmdlb21ldHJ5LCBnZW9tZXRyeSwgTlVMTCk7Ci0rCQkJWHRSZWFsaXplV2lkZ2V0KHRvcGxldmVsKTsKLSsJCQlkcHkgPSBYdERpc3BsYXkodG9wbGV2ZWwpOwotKwkJCXNwcmludGYobXNnLCAiXG4oTElTVEVOKSBSZXZlcnNlIFZOQyBjb25uZWN0aW9uIGZyb20gSVA6ICVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdG5hbWU6ICVzXG5cbiIsIHNpcCwgc2loKTsKLSsJCQlzdHJjYXQobXNnLCAiQWNjZXB0IG9yIFJlamVjdCBWTkMgY29ubmVjdGlvbj8iKTsKLSsJCQlpZiAoQ3JlYXRlTXNnKG1zZywgMikpIHsKLSsJCQkJWENsb3NlRGlzcGxheShkcHkpOwotKwkJCQlleGl0KDApOwotKwkJCX0gZWxzZSB7Ci0rCQkJCVhDbG9zZURpc3BsYXkoZHB5KTsKLSsJCQkJZXhpdCgxKTsKLSsJCQl9Ci0rCQl9IGVsc2UgewotKwkJCWludCBzdGF0dXM7Ci0rCQkJcGlkMiA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIndhaXRwaWQ6ICVkLyVkIHN0YXR1czogJWRcbiIsIHBpZCwgcGlkMiwgc3RhdHVzKTsKLSsJCQlpZiAocGlkMiA9PSBwaWQpIHsKLSsJCQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgewotKwkJCQkJYWNjZXB0X2l0ID0gMTsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJCWlmIChhY2NlcHRfaXQpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIkFjY2VwdGluZyBjb25uZWN0aW9uLlxuIik7Ci0rCQkJcmV0dXJuIDE7Ci0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCAiUmVmdXNpbmcgY29ubmVjdGlvbi5cbiIpOwotKwkJCXJldHVybiAwOwotKwkJfQotKwl9Ci0rCXJldHVybiAwOwotK30KLSsKLSAvKgotICAqIGxpc3RlbkZvckluY29taW5nQ29ubmVjdGlvbnMoKSAtIGxpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbQotICAqIHNlcnZlcnMsIGFuZCBmb3JrIGEgbmV3IHByb2Nlc3MgdG8gZGVhbCB3aXRoIGVhY2ggY29ubmVjdGlvbi4gIFdlIG11c3QgZG8KLUBAIC00NywxNDUgKzEyMSwyOTEgQEAKLSAgKiBjb3BlIHdpdGggZm9ya2luZyB2ZXJ5IHdlbGwuCi0gICovCi0gCi0rZXh0ZXJuIGNoYXIgKmFjY2VwdDZfaG9zdG5hbWU7Ci0rZXh0ZXJuIGNoYXIgKmFjY2VwdDZfaXBhZGRyOwotKwotIHZvaWQKLSBsaXN0ZW5Gb3JJbmNvbWluZ0Nvbm5lY3Rpb25zKGludCAqYXJnYywgY2hhciAqKmFyZ3YsIGludCBsaXN0ZW5BcmdJbmRleCkKLSB7Ci0tICBEaXNwbGF5ICpkOwotLSAgWEV2ZW50IGV2OwotLSAgaW50IGxpc3RlblNvY2tldCwgZmxhc2hTb2NrZXQsIHNvY2s7Ci0tICBmZF9zZXQgZmRzOwotLSAgY2hhciBmbGFzaFVzZXJbMjU2XTsKLS0gIGludCBuOwotLSAgaW50IGk7Ci0tICBjaGFyICpkaXNwbGF5bmFtZSA9IE5VTEw7Ci0tCi0tICBsaXN0ZW5TcGVjaWZpZWQgPSBUcnVlOwotLQotLSAgZm9yIChpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKLS0gICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWRpc3BsYXkiKSA9PSAwICYmIGkrMSA8ICphcmdjKSB7Ci0tICAgICAgZGlzcGxheW5hbWUgPSBhcmd2W2krMV07Ci0tICAgIH0KLS0gIH0KLSsJRGlzcGxheSAqZDsKLSsJWEV2ZW50IGV2OwotKwlpbnQgbGlzdGVuU29ja2V0LCBsaXN0ZW5Tb2NrZXQ2LCBmbGFzaFNvY2tldCwgc29jazsKLSsJZmRfc2V0IGZkczsKLSsJY2hhciBmbGFzaFVzZXJbMjU2XTsKLSsJaW50IG47Ci0rCWludCBpOwotKwljaGFyICpkaXNwbGF5bmFtZSA9IE5VTEw7Ci0rCWludCBjaGlsZHJlbiA9IDA7Ci0rCWludCB0b3RhbGNvbm4gPSAwLCBtYXhjb25uID0gMDsKLSsKLSsJbGlzdGVuU3BlY2lmaWVkID0gVHJ1ZTsKLSsJbGlzdGVuUGFyZW50ID0gZ2V0cGlkKCk7Ci0rCi0rCWZvciAoaSA9IDE7IGkgPCAqYXJnYzsgaSsrKSB7Ci0rCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItZGlzcGxheSIpID09IDAgJiYgaSsxIDwgKmFyZ2MpIHsKLSsJCQlkaXNwbGF5bmFtZSA9IGFyZ3ZbaSsxXTsKLSsJCX0KLSsJfQotKwlpZiAoc29jayB8fCBmbGFzaFVzZXIgfHwgbikge30KLSAKLS0gIGlmIChsaXN0ZW5BcmdJbmRleCsxIDwgKmFyZ2MgJiYgYXJndltsaXN0ZW5BcmdJbmRleCsxXVswXSA+PSAnMCcgJiYKLSsJaWYgKGxpc3RlbkFyZ0luZGV4KzEgPCAqYXJnYyAmJiBhcmd2W2xpc3RlbkFyZ0luZGV4KzFdWzBdID49ICcwJyAmJgotIAkJCQkJICAgIGFyZ3ZbbGlzdGVuQXJnSW5kZXgrMV1bMF0gPD0gJzknKSB7Ci0gCi0tICAgIGxpc3RlblBvcnQgPSBMSVNURU5fUE9SVF9PRkZTRVQgKyBhdG9pKGFyZ3ZbbGlzdGVuQXJnSW5kZXgrMV0pOwotLSAgICBmbGFzaFBvcnQgPSBGTEFTSF9QT1JUX09GRlNFVCArIGF0b2koYXJndltsaXN0ZW5BcmdJbmRleCsxXSk7Ci0tICAgIHJlbW92ZUFyZ3MoYXJnYywgYXJndiwgbGlzdGVuQXJnSW5kZXgsIDIpOwotKwkJbGlzdGVuUG9ydCA9IExJU1RFTl9QT1JUX09GRlNFVCArIGF0b2koYXJndltsaXN0ZW5BcmdJbmRleCsxXSk7Ci0rCQlmbGFzaFBvcnQgPSBGTEFTSF9QT1JUX09GRlNFVCArIGF0b2koYXJndltsaXN0ZW5BcmdJbmRleCsxXSk7Ci0rCQlyZW1vdmVBcmdzKGFyZ2MsIGFyZ3YsIGxpc3RlbkFyZ0luZGV4LCAyKTsKLSAKLS0gIH0gZWxzZSB7Ci0rCX0gZWxzZSB7Ci0gCi0tICAgIGNoYXIgKmRpc3BsYXk7Ci0tICAgIGNoYXIgKmNvbG9uUG9zOwotLSAgICBzdHJ1Y3QgdXRzbmFtZSBob3N0aW5mbzsKLSsJCWNoYXIgKmRpc3BsYXk7Ci0rCQljaGFyICpjb2xvblBvczsKLSsJCXN0cnVjdCB1dHNuYW1lIGhvc3RpbmZvOwotIAotLSAgICByZW1vdmVBcmdzKGFyZ2MsIGFyZ3YsIGxpc3RlbkFyZ0luZGV4LCAxKTsKLSsJCXJlbW92ZUFyZ3MoYXJnYywgYXJndiwgbGlzdGVuQXJnSW5kZXgsIDEpOwotIAotLSAgICBkaXNwbGF5ID0gWERpc3BsYXlOYW1lKGRpc3BsYXluYW1lKTsKLS0gICAgY29sb25Qb3MgPSBzdHJjaHIoZGlzcGxheSwgJzonKTsKLSsJCWRpc3BsYXkgPSBYRGlzcGxheU5hbWUoZGlzcGxheW5hbWUpOwotKwkJY29sb25Qb3MgPSBzdHJjaHIoZGlzcGxheSwgJzonKTsKLSAKLS0gICAgdW5hbWUoJmhvc3RpbmZvKTsKLSsJCXVuYW1lKCZob3N0aW5mbyk7Ci0gCi0tICAgIGlmIChjb2xvblBvcyAmJiAoKGNvbG9uUG9zID09IGRpc3BsYXkpIHx8Ci0tCQkgICAgIChzdHJuY21wKGhvc3RpbmZvLm5vZGVuYW1lLCBkaXNwbGF5LAotLQkJCSAgICAgIHN0cmxlbihob3N0aW5mby5ub2RlbmFtZSkpID09IDApKSkgewotKwkJaWYgKGNvbG9uUG9zICYmICgoY29sb25Qb3MgPT0gZGlzcGxheSkgfHwKLSsJCQkgICAgIChzdHJuY21wKGhvc3RpbmZvLm5vZGVuYW1lLCBkaXNwbGF5LAotKwkJCQkgICAgICBzdHJsZW4oaG9zdGluZm8ubm9kZW5hbWUpKSA9PSAwKSkpIHsKLSAKLS0gICAgICBsaXN0ZW5Qb3J0ID0gTElTVEVOX1BPUlRfT0ZGU0VUICsgYXRvaShjb2xvblBvcysxKTsKLS0gICAgICBmbGFzaFBvcnQgPSBGTEFTSF9QT1JUX09GRlNFVCArIGF0b2koY29sb25Qb3MrMSk7Ci0rCQkJbGlzdGVuUG9ydCA9IExJU1RFTl9QT1JUX09GRlNFVCArIGF0b2koY29sb25Qb3MrMSk7Ci0rCQkJZmxhc2hQb3J0ID0gRkxBU0hfUE9SVF9PRkZTRVQgKyBhdG9pKGNvbG9uUG9zKzEpOwotIAotLSAgICB9IGVsc2UgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCIlczogY2Fubm90IHdvcmsgb3V0IHdoaWNoIGRpc3BsYXkgbnVtYmVyIHRvICIKLS0JICAgICAgImxpc3RlbiBvbi5cbiIsIHByb2dyYW1OYW1lKTsKLS0gICAgICBmcHJpbnRmKHN0ZGVyciwiUGxlYXNlIHNwZWNpZnkgZXhwbGljaXRseSB3aXRoIC1saXN0ZW4gPG51bT5cbiIpOwotLSAgICAgIGV4aXQoMSk7Ci0tICAgIH0KLS0gIH0KLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsIiVzOiBjYW5ub3Qgd29yayBvdXQgd2hpY2ggZGlzcGxheSBudW1iZXIgdG8gIgotKwkJCSAgICAgICJsaXN0ZW4gb24uXG4iLCBwcm9ncmFtTmFtZSk7Ci0rCQkJZnByaW50ZihzdGRlcnIsIlBsZWFzZSBzcGVjaWZ5IGV4cGxpY2l0bHkgd2l0aCAtbGlzdGVuIDxudW0+XG4iKTsKLSsJCQlleGl0KDEpOwotKwkJfQotIAotLSAgaWYgKCEoZCA9IFhPcGVuRGlzcGxheShkaXNwbGF5bmFtZSkpKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCIlczogdW5hYmxlIHRvIG9wZW4gZGlzcGxheSAlc1xuIiwKLS0JICAgIHByb2dyYW1OYW1lLCBYRGlzcGxheU5hbWUoZGlzcGxheW5hbWUpKTsKLS0gICAgZXhpdCgxKTsKLS0gIH0KLSsJfQotIAotLSAgZ2V0Rmxhc2hGb250KGQpOwotKwlpZiAoIShkID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKSkpIHsKLSsJCWZwcmludGYoc3RkZXJyLCIlczogdW5hYmxlIHRvIG9wZW4gZGlzcGxheSAlc1xuIiwKLSsJCSAgICBwcm9ncmFtTmFtZSwgWERpc3BsYXlOYW1lKGRpc3BsYXluYW1lKSk7Ci0rCQlleGl0KDEpOwotKwl9Ci0gCi0tICBsaXN0ZW5Tb2NrZXQgPSBMaXN0ZW5BdFRjcFBvcnQobGlzdGVuUG9ydCk7Ci0tICBmbGFzaFNvY2tldCA9IExpc3RlbkF0VGNwUG9ydChmbGFzaFBvcnQpOwotKyNpZiAwCi0rCWdldEZsYXNoRm9udChkKTsKLSsjZW5kaWYKLSAKLS0gIGlmICgobGlzdGVuU29ja2V0IDwgMCkgfHwgKGZsYXNoU29ja2V0IDwgMCkpIGV4aXQoMSk7Ci0rCWxpc3RlblNvY2tldCAgPSBMaXN0ZW5BdFRjcFBvcnQobGlzdGVuUG9ydCk7Ci0rCWxpc3RlblNvY2tldDYgPSBMaXN0ZW5BdFRjcFBvcnQ2KGxpc3RlblBvcnQpOwotKwotKyNpZiAwCi0rCWZsYXNoU29ja2V0ID0gTGlzdGVuQXRUY3BQb3J0KGZsYXNoUG9ydCk7Ci0rI2VuZGlmCi0rCWZsYXNoU29ja2V0ID0gMTIzNDsKLSsKLSsJaWYgKGxpc3RlblNvY2tldCA8IDAgJiYgbGlzdGVuU29ja2V0NiA8IDApIHsKLSsJCWZwcmludGYoc3RkZXJyLCIlcyAtbGlzdGVuOiBjb3VsZCBub3Qgb2J0YWluIGEgbGlzdGVuaW5nIHNvY2tldCBvbiBwb3J0ICVkXG4iLAotKwkJICAgIHByb2dyYW1OYW1lLCBsaXN0ZW5Qb3J0KTsKLSsJCWV4aXQoMSk7Ci0rCX0KLSAKLS0gIGZwcmludGYoc3RkZXJyLCIlcyAtbGlzdGVuOiBMaXN0ZW5pbmcgb24gcG9ydCAlZCAoZmxhc2ggcG9ydCAlZClcbiIsCi0tCSAgcHJvZ3JhbU5hbWUsbGlzdGVuUG9ydCxmbGFzaFBvcnQpOwotLSAgZnByaW50ZihzdGRlcnIsIiVzIC1saXN0ZW46IENvbW1hbmQgbGluZSBlcnJvcnMgYXJlIG5vdCByZXBvcnRlZCB1bnRpbCAiCi0rCWZwcmludGYoc3RkZXJyLCIlcyAtbGlzdGVuOiBMaXN0ZW5pbmcgb24gcG9ydCAlZCAgaXB2NF9mZDogJWQgaXB2Nl9mZDogJWRcbiIsCi0rCSAgcHJvZ3JhbU5hbWUsIGxpc3RlblBvcnQsIGxpc3RlblNvY2tldCwgbGlzdGVuU29ja2V0Nik7Ci0rCWZwcmludGYoc3RkZXJyLCIlcyAtbGlzdGVuOiBDbWRsaW5lIGVycm9ycyBhcmUgbm90IHJlcG9ydGVkIHVudGlsICIKLSAJICAiYSBjb25uZWN0aW9uIGNvbWVzIGluLlxuIiwgcHJvZ3JhbU5hbWUpOwotIAotLSAgd2hpbGUgKFRydWUpIHsKLSsJLyogdGhpcyB3aWxsIG9ubHkgd29yayBpZiBYIGV2ZW50cyBkcml2ZXMgdGhpcyBsb29wIC0tIHRoZXkgZG9uJ3QgKi8KLSsJaWYgKGdldGVudigiU1NWTkNfTUFYX0xJU1RFTiIpKSB7Ci0rCQltYXhjb25uID0gYXRvaShnZXRlbnYoIlNTVk5DX01BWF9MSVNURU4iKSk7Ci0rCX0KLSAKLS0gICAgLyogcmVhcCBhbnkgem9tYmllcyAqLwotLSAgICBpbnQgc3RhdHVzLCBwaWQ7Ci0tICAgIHdoaWxlICgocGlkPSB3YWl0Mygmc3RhdHVzLCBXTk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKTApKT4wKTsKLS0KLS0gICAgLyogZGlzY2FyZCBhbnkgWCBldmVudHMgKi8KLS0gICAgd2hpbGUgKFhDaGVja0lmRXZlbnQoZCwgJmV2LCBBbGxYRXZlbnRzUHJlZGljYXRlLCBOVUxMKSkKLS0gICAgICA7Ci0tCi0tICAgIEZEX1pFUk8oJmZkcyk7IAotLQotLSAgICBGRF9TRVQoZmxhc2hTb2NrZXQsICZmZHMpOwotLSAgICBGRF9TRVQobGlzdGVuU29ja2V0LCAmZmRzKTsKLS0gICAgRkRfU0VUKENvbm5lY3Rpb25OdW1iZXIoZCksICZmZHMpOwotLQotLSAgICBzZWxlY3QoRkRfU0VUU0laRSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0tCi0tICAgIGlmIChGRF9JU1NFVChmbGFzaFNvY2tldCwgJmZkcykpIHsKLS0KLS0gICAgICBzb2NrID0gQWNjZXB0VGNwQ29ubmVjdGlvbihmbGFzaFNvY2tldCk7Ci0tICAgICAgaWYgKHNvY2sgPCAwKSBleGl0KDEpOwotLSAgICAgIG4gPSByZWFkKHNvY2ssIGZsYXNoVXNlciwgMjU1KTsKLS0gICAgICBpZiAobiA+IDApIHsKLS0JZmxhc2hVc2VyW25dID0gMDsKLS0JZmxhc2hEaXNwbGF5KGQsIGZsYXNoVXNlcik7Ci0tICAgICAgfSBlbHNlIHsKLS0JZmxhc2hEaXNwbGF5KGQsIE5VTEwpOwotLSAgICAgIH0KLS0gICAgICBjbG9zZShzb2NrKTsKLS0gICAgfQotKyAgICB3aGlsZSAoVHJ1ZSkgewotKwlpbnQgbHNvY2sgPSAtMTsKLSAKLS0gICAgaWYgKEZEX0lTU0VUKGxpc3RlblNvY2tldCwgJmZkcykpIHsKLS0gICAgICByZmJzb2NrID0gQWNjZXB0VGNwQ29ubmVjdGlvbihsaXN0ZW5Tb2NrZXQpOwotLSAgICAgIGlmIChyZmJzb2NrIDwgMCkgZXhpdCgxKTsKLS0gICAgICBpZiAoIVNldE5vbkJsb2NraW5nKHJmYnNvY2spKSBleGl0KDEpOwotKwkvKiByZWFwIGFueSB6b21iaWVzICovCi0rCWludCBzdGF0dXMsIHBpZDsKLSsJd2hpbGUgKChwaWQgPSB3YWl0Mygmc3RhdHVzLCBXTk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKTApKT4wKSB7Ci0rCQlpZiAocGlkID4gMCAmJiBjaGlsZHJlbiA+IDApIHsKLSsJCQljaGlsZHJlbi0tOwkKLSsJCQkvKiB0aGlzIHdpbGwgb25seSB3b3JrIGlmIFggZXZlbnRzIGRyaXZlcyB0aGlzIGxvb3AgLS0gdGhleSBkb24ndCAqLwotKwkJCWlmIChtYXhjb25uID4gMCAmJiB0b3RhbGNvbm4gPj0gbWF4Y29ubikgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwiJXMgLWxpc3RlbjogRmluaXNoZWQgZmluYWwgY29ubmVjdGlvbiAlZFxuIiwKLSsJCQkJICAgIHByb2dyYW1OYW1lLCBtYXhjb25uKTsKLSsJCQkJZXhpdCgwKTsKLSsJCQl9Ci0rCQl9Ci0rCX0KLSAKLS0gICAgICBYQ2xvc2VEaXNwbGF5KGQpOwotKwkvKiBkaXNjYXJkIGFueSBYIGV2ZW50cyAqLwotKwl3aGlsZSAoWENoZWNrSWZFdmVudChkLCAmZXYsIEFsbFhFdmVudHNQcmVkaWNhdGUsIE5VTEwpKSB7Ci0rCQk7Ci0rCX0KLSAKLS0gICAgICAvKiBOb3cgZm9yayBvZmYgYSBuZXcgcHJvY2VzcyB0byBkZWFsIHdpdGggaXQuLi4gKi8KLSsJRkRfWkVSTygmZmRzKTsgCi0gCi0tICAgICAgc3dpdGNoIChmb3JrKCkpIHsKLSsjaWYgMAotKwlGRF9TRVQoZmxhc2hTb2NrZXQsICZmZHMpOwotKyNlbmRpZgotKwlpZiAobGlzdGVuU29ja2V0ID49IDApIHsKLSsgICAgCQlGRF9TRVQobGlzdGVuU29ja2V0LCAmZmRzKTsKLSsJfQotKwlpZiAobGlzdGVuU29ja2V0NiA+PSAwKSB7Ci0rICAgIAkJRkRfU0VUKGxpc3RlblNvY2tldDYsICZmZHMpOwotKwl9Ci0rCUZEX1NFVChDb25uZWN0aW9uTnVtYmVyKGQpLCAmZmRzKTsKLSAKLS0gICAgICBjYXNlIC0xOiAKLS0JcGVycm9yKCJmb3JrIik7IAotLQlleGl0KDEpOwotKwlzZWxlY3QoRkRfU0VUU0laRSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gCi0tICAgICAgY2FzZSAwOgotLQkvKiBjaGlsZCAtIHJldHVybiB0byBjYWxsZXIgKi8KLS0JY2xvc2UobGlzdGVuU29ja2V0KTsKLS0JY2xvc2UoZmxhc2hTb2NrZXQpOwotLQlyZXR1cm47Ci0rCXdoaWxlICgocGlkID0gd2FpdDMoJnN0YXR1cywgV05PSEFORywgKHN0cnVjdCBydXNhZ2UgKikwKSk+MCkgewotKwkJaWYgKHBpZCA+IDAgJiYgY2hpbGRyZW4gPiAwKSB7Ci0rCQkJY2hpbGRyZW4tLTsJCi0rCQkJaWYgKG1heGNvbm4gPiAwICYmIHRvdGFsY29ubiA+PSBtYXhjb25uKSB7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCIlcyAtbGlzdGVuOiBGaW5pc2hlZCBmaW5hbCBjb25uZWN0aW9uICVkXG4iLAotKwkJCQlwcm9ncmFtTmFtZSwgbWF4Y29ubik7Ci0rCQkJCWV4aXQoMCk7Ci0rCQkJfQotKwkJfQotKwl9Ci0gCi0tICAgICAgZGVmYXVsdDoKLS0JLyogcGFyZW50IC0gZ28gcm91bmQgYW5kIGxpc3RlbiBhZ2FpbiAqLwotLQljbG9zZShyZmJzb2NrKTsgCi0tCWlmICghKGQgPSBYT3BlbkRpc3BsYXkoZGlzcGxheW5hbWUpKSkgewotLQkgIGZwcmludGYoc3RkZXJyLCIlczogdW5hYmxlIHRvIG9wZW4gZGlzcGxheSAlc1xuIiwKLS0JCSAgcHJvZ3JhbU5hbWUsIFhEaXNwbGF5TmFtZShkaXNwbGF5bmFtZSkpOwotLQkgIGV4aXQoMSk7Ci0rI2lmIDAKLSsJaWYgKEZEX0lTU0VUKGZsYXNoU29ja2V0LCAmZmRzKSkgewotKwkJc29jayA9IEFjY2VwdFRjcENvbm5lY3Rpb24oZmxhc2hTb2NrZXQpOwotKwkJaWYgKHNvY2sgPCAwKSBleGl0KDEpOwotKwkJbiA9IHJlYWQoc29jaywgZmxhc2hVc2VyLCAyNTUpOwotKwkJaWYgKG4gPiAwKSB7Ci0rCQkJZmxhc2hVc2VyW25dID0gMDsKLSsJCQlmbGFzaERpc3BsYXkoZCwgZmxhc2hVc2VyKTsKLSsJCX0gZWxzZSB7Ci0rCQkJZmxhc2hEaXNwbGF5KGQsIE5VTEwpOwotKwkJfQotKwkJY2xvc2Uoc29jayk7Ci0rCX0KLSsjZW5kaWYKLSsKLSsJbHNvY2sgPSAtMTsKLSsJaWYgKGxpc3RlblNvY2tldCA+PSAwICYmIEZEX0lTU0VUKGxpc3RlblNvY2tldCwgJmZkcykpIHsKLSsJCWxzb2NrID0gbGlzdGVuU29ja2V0OwotKwl9IGVsc2UgaWYgKGxpc3RlblNvY2tldDYgPj0gMCAmJiBGRF9JU1NFVChsaXN0ZW5Tb2NrZXQ2LCAmZmRzKSkgewotKwkJbHNvY2sgPSBsaXN0ZW5Tb2NrZXQ2OwotKwl9Ci0rCi0rCWlmIChsc29jayA+PSAwKSB7Ci0rCQlpbnQgbXVsdGlfb2sgPSAwOwotKwkJY2hhciAqc21sID0gZ2V0ZW52KCJTU1ZOQ19NVUxUSVBMRV9MSVNURU4iKTsKLSsJCWNoYXIgKnNpcCA9IE5VTEw7Ci0rCQljaGFyICpzaWggPSBOVUxMOwotKwotKwkJaWYgKGxzb2NrID09IGxpc3RlblNvY2tldCkgewotKwkJCXJmYnNvY2sgPSBBY2NlcHRUY3BDb25uZWN0aW9uKGxzb2NrKTsKLSsJCX0gZWxzZSB7Ci0rCQkJcmZic29jayA9IEFjY2VwdFRjcENvbm5lY3Rpb242KGxzb2NrKTsKLSsJCX0KLSsKLSsJCWlmIChzbWwgIT0gTlVMTCkgewotKwkJCWlmIChzdHJzdHIoc21sLCAiTUFYOiIpID09IHNtbCB8fCBzdHJzdHIoc21sLCAibWF4OiIpID09IHNtbCkgewotKwkJCQljaGFyICpxID0gc3RyY2hyKHNtbCwgJzonKTsKLSsJCQkJaW50IG1heGMgPSBhdG9pKHErMSk7Ci0rCQkJCWlmIChtYXhjID09IDAgJiYgc3RyY21wKHErMSwgIjAiKSkgewotKwkJCQkJbWF4YyA9IC05OTsKLSsJCQkJfQotKwkJCQlpZiAobWF4YyA8IDApIHsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOm4sICVzLCBtdXN0IGJlIDAgb3IgcG9zaXRpdmUsIHVzaW5nIDFcbiIsIHNtbCk7IAotKwkJCQl9IGVsc2UgaWYgKG1heGMgPT0gMCkgewotKwkJCQkJbXVsdGlfb2sgPSAxOwotKwkJCQl9IGVsc2UgaWYgKGNoaWxkcmVuIDwgbWF4YykgewotKwkJCQkJbXVsdGlfb2sgPSAxOwotKwkJCQl9Ci0rCQkJfSBlbHNlIGlmIChzdHJjbXAoc21sLCAiIikgJiYgc3RyY21wKHNtbCwgIjAiKSkgewotKwkJCQltdWx0aV9vayA9IDE7Ci0rCQkJfQotKwkJfQotKwotKwkJaWYgKHJmYnNvY2sgPCAwKSBleGl0KDEpOwotKwkJaWYgKCFTZXROb25CbG9ja2luZyhyZmJzb2NrKSkgZXhpdCgxKTsKLSsKLSsJCWlmIChjaGlsZHJlbiA+IDAgJiYgIW11bHRpX29rKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsIlxuIik7Ci0rCQkJZnByaW50ZihzdGRlcnIsIiVzOiBkZW55aW5nIGV4dHJhIGluY29taW5nIGNvbm5lY3Rpb24gKCVkIGFscmVhZHkpXG4iLAotKwkJCSAgICBwcm9ncmFtTmFtZSwgY2hpbGRyZW4pOwotKwkJCWZwcmludGYoc3RkZXJyLCIlczogdG8gb3ZlcnJpZGU6IHVzZSAnLW11bHRpbGlzdGVuJyBvciBzZXQgU1NWTkNfTVVMVElQTEVfTElTVEVOPTFcbiIsCi0rCQkJICAgIHByb2dyYW1OYW1lKTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSsJCQljbG9zZShyZmJzb2NrKTsKLSsJCQlyZmJzb2NrID0gLTE7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlpZiAobHNvY2sgPT0gbGlzdGVuU29ja2V0KSB7Ci0rCQkJc2lwID0gZ2V0X3BlZXJfaXAocmZic29jayk7Ci0rCQkJaWYgKHN0cmxlbihzaXApID4gMTAwKSBzaXAgPSAiMC4wLjAuMCI7Ci0rCQkJc2loID0gaXAyaG9zdChzaXApOwotKwkJCWlmIChzdHJsZW4oc2loKSA+IDMwMCkgc2loID0gInVua25vd24iOwotKwkJfSBlbHNlIHsKLSsJCQlpZiAoYWNjZXB0Nl9ob3N0bmFtZSAhPSBOVUxMKSB7Ci0rCQkJCXNpcCA9IGFjY2VwdDZfaXBhZGRyOwotKwkJCQlhY2NlcHQ2X2lwYWRkciA9IE5VTEw7Ci0rCQkJCXNpaCA9IGFjY2VwdDZfaG9zdG5hbWU7Ci0rCQkJCWFjY2VwdDZfaG9zdG5hbWUgPSBOVUxMOwotKwkJCX0gZWxzZSB7Ci0rCQkJCXNpcCA9ICJ1bmtub3duIjsKLSsJCQkJc2loID0gInVua25vd24iOwotKwkJCX0KLSsJCX0KLSsKLSsJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCWZwcmludGYoc3RkZXJyLCAiKExJU1RFTikgUmV2ZXJzZSBWTkMgY29ubmVjdGlvbiBmcm9tIElQOiAlc1xuIiwgc2lwKTsKLSsJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RuYW1lOiAlc1xuXG4iLCBzaWgpOwotKwotKwkJaWYgKHNtbCA9PSBOVUxMICYmICFhY2NlcHRfcG9wdXBfY2hlY2soYXJnYywgYXJndiwgc2lwLCBzaWgpKSB7Ci0rCQkJY2xvc2UocmZic29jayk7Ci0rCQkJcmZic29jayA9IC0xOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJdG90YWxjb25uKys7Ci0rCi0rCQlYQ2xvc2VEaXNwbGF5KGQpOwotKwotKwkJLyogTm93IGZvcmsgb2ZmIGEgbmV3IHByb2Nlc3MgdG8gZGVhbCB3aXRoIGl0Li4uICovCi0rCi0rCQlzd2l0Y2ggKGZvcmsoKSkgewotKwotKwkJY2FzZSAtMTogCi0rCQkJcGVycm9yKCJmb3JrIik7IAotKwkJCWV4aXQoMSk7Ci0rCi0rCQljYXNlIDA6Ci0rCQkJLyogY2hpbGQgLSByZXR1cm4gdG8gY2FsbGVyICovCi0rCQkJY2xvc2UobGlzdGVuU29ja2V0KTsKLSsjaWYgMAotKwkJCWNsb3NlKGZsYXNoU29ja2V0KTsKLSsjZW5kaWYKLSsJCQlpZiAoc21sICE9IE5VTEwgJiYgIWFjY2VwdF9wb3B1cF9jaGVjayhhcmdjLCBhcmd2LCBzaXAsIHNpaCkpIHsKLSsJCQkJY2xvc2UocmZic29jayk7Ci0rCQkJCXJmYnNvY2sgPSAtMTsKLSsJCQkJZXhpdCgwKTsKLSsJCQl9Ci0rCQkJcmV0dXJuOwotKwotKwkJZGVmYXVsdDoKLSsJCQkvKiBwYXJlbnQgLSBnbyByb3VuZCBhbmQgbGlzdGVuIGFnYWluICovCi0rCQkJY2hpbGRyZW4rKzsKLSsJCQljbG9zZShyZmJzb2NrKTsKLSsJCQlpZiAoIShkID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKSkpIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsIiVzOiB1bmFibGUgdG8gb3BlbiBkaXNwbGF5ICVzXG4iLAotKwkJCQkgICAgcHJvZ3JhbU5hbWUsIFhEaXNwbGF5TmFtZShkaXNwbGF5bmFtZSkpOwotKwkJCQlleGl0KDEpOwotKwkJCX0KLSsjaWYgMAotKwkJCWdldEZsYXNoRm9udChkKTsKLSsjZW5kaWYKLSsJCQlmcHJpbnRmKHN0ZGVyciwiXG5cbiVzIC1saXN0ZW46IExpc3RlbmluZyBvbiBwb3J0ICVkXG4iLAotKwkJCSAgICBwcm9ncmFtTmFtZSxsaXN0ZW5Qb3J0KTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwiJXMgLWxpc3RlbjogQ21kbGluZSBlcnJvcnMgYXJlIG5vdCByZXBvcnRlZCB1bnRpbCAiCi0rCQkJICAgICJhIGNvbm5lY3Rpb24gY29tZXMgaW4uXG5cbiIsIHByb2dyYW1OYW1lKTsKLSsJCQlicmVhazsKLSsJCX0KLSAJfQotLQlnZXRGbGFzaEZvbnQoZCk7Ci0tCWJyZWFrOwotLSAgICAgIH0KLSAgICAgfQotLSAgfQotIH0KLSAKLSAKLUBAIC0xOTMsOSArNDEzLDE2IEBACi0gICogZ2V0Rmxhc2hGb250Ci0gICovCi0gCi0rI2lmIDAKLSBzdGF0aWMgdm9pZAotIGdldEZsYXNoRm9udChEaXNwbGF5ICpkKQotIHsKLSsKLSsjaWYgMQotKwkvKiBubyBsb25nZXIgdXNlZCAqLwotKwlpZiAoZCkge30KLSsJcmV0dXJuOwotKyNlbHNlCi0gICBjaGFyIGZvbnROYW1lWzI1Nl07Ci0gICBjaGFyICoqZm9udE5hbWVzOwotICAgaW50IG5Gb250TmFtZXM7Ci1AQCAtMjA5LDYgKzQzNiw5IEBACi0gICAgIHNwcmludGYoZm9udE5hbWUsImZpeGVkIik7Ci0gICB9Ci0gICBmbGFzaEZvbnQgPSBYTG9hZEZvbnQoZCwgZm9udE5hbWUpOwotKwotKyNlbmRpZgotKwotIH0KLSAKLSAKLUBAIC0yMTksNiArNDQ5LDExIEBACi0gc3RhdGljIHZvaWQKLSBmbGFzaERpc3BsYXkoRGlzcGxheSAqZCwgY2hhciAqdXNlcikKLSB7Ci0rI2lmIDEKLSsJLyogbm8gbG9uZ2VyIHVzZWQgKi8KLSsJaWYgKGQgfHwgdXNlcikge30KLSsJcmV0dXJuOwotKyNlbHNlCi0gICBXaW5kb3cgdzEsIHcyLCB3MywgdzQ7Ci0gICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwotIAotQEAgLTI4NCw3ICs1MTksMTEgQEAKLSAgIFhEZXN0cm95V2luZG93KGQsIHczKTsKLSAgIFhEZXN0cm95V2luZG93KGQsIHc0KTsKLSAgIFhGbHVzaChkKTsKLSsKLSsjZW5kaWYKLSsKLSB9Ci0rI2VuZGlmCi0gCi0gLyoKLSAgKiBBbGxYRXZlbnRzUHJlZGljYXRlIGlzIG5lZWRlZCB0byBtYWtlIFhDaGVja0lmRXZlbnQgcmV0dXJuIGFsbCBldmVudHMuCi1AQCAtMjkzLDUgKzUzMiw2IEBACi0gc3RhdGljIEJvb2wKLSBBbGxYRXZlbnRzUHJlZGljYXRlKERpc3BsYXkgKmQsIFhFdmVudCAqZXYsIGNoYXIgKmFyZykKLSB7Ci0tICByZXR1cm4gVHJ1ZTsKLSsJaWYgKGQgfHwgZXYgfHwgYXJnKSB7fQotKwlyZXR1cm4gVHJ1ZTsKLSB9Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9taXNjLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL21pc2MuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL21pc2MuYwkyMDAzLTAxLTE1IDAyOjU4OjMyLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9taXNjLmMJMjAxMC0wMi0yNSAyMjo0NDowOS4wMDAwMDAwMDAgLTA1MDAKLUBAIC0yMyw2ICsyMyw3IEBACi0gCi0gI2luY2x1ZGUgPHZuY3ZpZXdlci5oPgotICNpbmNsdWRlIDxzaWduYWwuaD4KLSsjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSAjaW5jbHVkZSA8ZmNudGwuaD4KLSAKLSBzdGF0aWMgdm9pZCBDbGVhbnVwU2lnbmFsSGFuZGxlcihpbnQgc2lnKTsKLUBAIC0zMywxMiArMzQsMjAgQEAKLSAKLSBEaW1lbnNpb24gZHB5V2lkdGgsIGRweUhlaWdodDsKLSBBdG9tIHdtRGVsZXRlV2luZG93LCB3bVN0YXRlOwotK2ludCBmdWxsc2NyZWVuX3N0YXJ0dXAgPSAwOwotIAotIHN0YXRpYyBCb29sIHhsb2dpbkljb25pZmllZCA9IEZhbHNlOwotIHN0YXRpYyBYRXJyb3JIYW5kbGVyIGRlZmF1bHRYRXJyb3JIYW5kbGVyOwotIHN0YXRpYyBYSU9FcnJvckhhbmRsZXIgZGVmYXVsdFhJT0Vycm9ySGFuZGxlcjsKLSBzdGF0aWMgWHRFcnJvckhhbmRsZXIgZGVmYXVsdFh0RXJyb3JIYW5kbGVyOwotIAotK2ludCBYRXJyb3JfaWduID0gMDsKLSsKLSt2b2lkIGNoZWNrX3RhbGwodm9pZCk7Ci0raW50IGd1ZXNzQ3JvcCh2b2lkKTsKLSt2b2lkIGdldF9zY2FsZV92YWx1ZXMoZG91YmxlICpmeCwgZG91YmxlICpmeSk7Ci0raW50IHNjYWxlX3JvdW5kKGludCBuLCBkb3VibGUgZmFjdG9yKTsKLStCb29sIFNlbmRUZXh0Q2hhdEZpbmlzaGVkKHZvaWQpOwotIAotIC8qCi0gICogVG9wbGV2ZWxJbml0QmVmb3JlUmVhbGl6YXRpb24gc2V0cyB0aGUgdGl0bGUsIGdlb21ldHJ5IGFuZCBvdGhlciByZXNvdXJjZXMKLUBAIC00OCw4NyArNTcsMTIyIEBACi0gdm9pZAotIFRvcGxldmVsSW5pdEJlZm9yZVJlYWxpemF0aW9uKCkKLSB7Ci0tICBjaGFyICp0aXRsZUZvcm1hdDsKLS0gIGNoYXIgKnRpdGxlOwotLSAgY2hhciAqZ2VvbWV0cnk7Ci0tCi0tICBYdFZhR2V0VmFsdWVzKHRvcGxldmVsLCBYdE50aXRsZSwgJnRpdGxlRm9ybWF0LCBOVUxMKTsKLS0gIHRpdGxlID0gWHRNYWxsb2Moc3RybGVuKHRpdGxlRm9ybWF0KSArIHN0cmxlbihkZXNrdG9wTmFtZSkgKyAxKTsKLS0gIHNwcmludGYodGl0bGUsIHRpdGxlRm9ybWF0LCBkZXNrdG9wTmFtZSk7Ci0tICBYdFZhU2V0VmFsdWVzKHRvcGxldmVsLCBYdE50aXRsZSwgdGl0bGUsIFh0Tmljb25OYW1lLCB0aXRsZSwgTlVMTCk7Ci0tCi0tICBYdFZhU2V0VmFsdWVzKHRvcGxldmVsLCBYdE5tYXhXaWR0aCwgc2kuZnJhbWVidWZmZXJXaWR0aCwKLS0JCVh0Tm1heEhlaWdodCwgc2kuZnJhbWVidWZmZXJIZWlnaHQsIE5VTEwpOwotLQotLSAgZHB5V2lkdGggPSBXaWR0aE9mU2NyZWVuKERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSk7Ci0tICBkcHlIZWlnaHQgPSBIZWlnaHRPZlNjcmVlbihEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KGRweSkpOwotLQotLSAgaWYgKGFwcERhdGEuZnVsbFNjcmVlbikgewotLQotLSAgICAvKiBmdWxsIHNjcmVlbiAtIHNldCBwb3NpdGlvbiB0byAwLDAsIGJ1dCBkZWZlciBzaXplIGNhbGN1bGF0aW9uIHVudGlsCi0tICAgICAgIHdpZGdldHMgYXJlIHJlYWxpemVkICovCi0tCi0tICAgIFh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsCi0tCQkgIFh0Tmdlb21ldHJ5LCAiKzArMCIsIE5VTEwpOwotLQotLSAgfSBlbHNlIHsKLS0KLS0gICAgLyogbm90IGZ1bGwgc2NyZWVuIC0gd29yayBvdXQgZ2VvbWV0cnkgZm9yIG1pZGRsZSBvZiBzY3JlZW4gdW5sZXNzCi0tICAgICAgIHNwZWNpZmllZCBieSB1c2VyICovCi0tCi0tICAgIFh0VmFHZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tmdlb21ldHJ5LCAmZ2VvbWV0cnksIE5VTEwpOwotLQotLSAgICBpZiAoZ2VvbWV0cnkgPT0gTlVMTCkgewotLSAgICAgIERpbWVuc2lvbiB0b3BsZXZlbFgsIHRvcGxldmVsWTsKLS0gICAgICBEaW1lbnNpb24gdG9wbGV2ZWxXaWR0aCA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0tICAgICAgRGltZW5zaW9uIHRvcGxldmVsSGVpZ2h0ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0tCi0tICAgICAgaWYgKCh0b3BsZXZlbFdpZHRoICsgYXBwRGF0YS53bURlY29yYXRpb25XaWR0aCkgPj0gZHB5V2lkdGgpCi0tCXRvcGxldmVsV2lkdGggPSBkcHlXaWR0aCAtIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGg7Ci0tCi0tICAgICAgaWYgKCh0b3BsZXZlbEhlaWdodCArIGFwcERhdGEud21EZWNvcmF0aW9uSGVpZ2h0KSA+PSBkcHlIZWlnaHQpCi0tCXRvcGxldmVsSGVpZ2h0ID0gZHB5SGVpZ2h0IC0gYXBwRGF0YS53bURlY29yYXRpb25IZWlnaHQ7Ci0tCi0tICAgICAgdG9wbGV2ZWxYID0gKGRweVdpZHRoIC0gdG9wbGV2ZWxXaWR0aCAtIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGgpIC8gMjsKLS0KLS0gICAgICB0b3BsZXZlbFkgPSAoZHB5SGVpZ2h0IC0gdG9wbGV2ZWxIZWlnaHQgLSBhcHBEYXRhLndtRGVjb3JhdGlvbkhlaWdodCkgLzI7Ci0tCi0tICAgICAgLyogc2V0IHBvc2l0aW9uIHZpYSAiZ2VvbWV0cnkiIHNvIHRoYXQgd2luZG93IG1hbmFnZXIgdGhpbmtzIGl0J3MgYQotLQkgdXNlci1zcGVjaWZpZWQgcG9zaXRpb24gYW5kIHRoZXJlZm9yZSBob25vdXJzIGl0ICovCi0tCi0tICAgICAgZ2VvbWV0cnkgPSBYdE1hbGxvYygyNTYpOwotLQotLSAgICAgIHNwcmludGYoZ2VvbWV0cnksICIlZHglZCslZCslZCIsCi0tCSAgICAgIHRvcGxldmVsV2lkdGgsIHRvcGxldmVsSGVpZ2h0LCB0b3BsZXZlbFgsIHRvcGxldmVsWSk7Ci0tICAgICAgWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHROZ2VvbWV0cnksIGdlb21ldHJ5LCBOVUxMKTsKLS0gICAgfQotLSAgfQotKwljaGFyICp0aXRsZUZvcm1hdDsKLSsJY2hhciAqdGl0bGU7Ci0rCWNoYXIgKmdlb21ldHJ5OwotKwlpbnQgaCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwlpbnQgdyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCi0rCWNoZWNrX3RhbGwoKTsKLSsJaWYgKGFwcERhdGEueUNyb3AgPCAwKSB7Ci0rCQlhcHBEYXRhLnlDcm9wID0gZ3Vlc3NDcm9wKCk7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlNldCAteWNyb3AgdG86ICVkXG4iLCBhcHBEYXRhLnlDcm9wKTsKLSsJCWlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJCWggPSBhcHBEYXRhLnlDcm9wOwotKwkJfQotKwl9Ci0rCQotKwlYdFZhR2V0VmFsdWVzKHRvcGxldmVsLCBYdE50aXRsZSwgJnRpdGxlRm9ybWF0LCBOVUxMKTsKLSsJdGl0bGUgPSBYdE1hbGxvYyhzdHJsZW4odGl0bGVGb3JtYXQpICsgc3RybGVuKGRlc2t0b3BOYW1lKSArIDEpOwotKwlzcHJpbnRmKHRpdGxlLCB0aXRsZUZvcm1hdCwgZGVza3RvcE5hbWUpOwotKwlYdFZhU2V0VmFsdWVzKHRvcGxldmVsLCBYdE50aXRsZSwgdGl0bGUsIFh0Tmljb25OYW1lLCB0aXRsZSwgTlVMTCk7Ci0rCi0rCWlmIChhcHBEYXRhLnNjYWxlICE9IE5VTEwpIHsKLSsJCS8qIHN3aXRjaGVkIHRvIG5vdCBzY2FsZWQgKi8KLSsJCWRvdWJsZSBmcmFjX3gsIGZyYWNfeTsKLSsJCWdldF9zY2FsZV92YWx1ZXMoJmZyYWNfeCwgJmZyYWNfeSk7Ci0rCQlpZiAoZnJhY194ID4gMC4wICYmIGZyYWNfeSA+IDAuMCkgewotKwkJCXcgPSBzY2FsZV9yb3VuZCh3LCBmcmFjX3gpOwotKwkJCWggPSBzY2FsZV9yb3VuZChoLCBmcmFjX3kpOwotKwkJfQotKwl9Ci0rCVh0VmFTZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tm1heFdpZHRoLCB3LCBYdE5tYXhIZWlnaHQsIGgsIE5VTEwpOwotKwotKwlkcHlXaWR0aCAgPSBXaWR0aE9mU2NyZWVuKERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSk7Ci0rCWRweUhlaWdodCA9IEhlaWdodE9mU2NyZWVuKERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSk7Ci0rCi0rCWlmIChhcHBEYXRhLmZ1bGxTY3JlZW4pIHsKLSsJCS8qIGZ1bGwgc2NyZWVuIC0gc2V0IHBvc2l0aW9uIHRvIDAsMCwgYnV0IGRlZmVyIHNpemUgY2FsY3VsYXRpb24gdW50aWwgd2lkZ2V0cyBhcmUgcmVhbGl6ZWQgKi8KLSsKLSsJCWlmICghbmV0X3dtX3N1cHBvcnRlZCgpKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgVHJ1ZSwgWHROZ2VvbWV0cnksICIrMCswIiwgTlVMTCk7Ci0rCQl9IGVsc2UgewotKwkJCWZ1bGxzY3JlZW5fc3RhcnR1cCA9IDE7Ci0rCQl9Ci0rCi0rCX0gZWxzZSB7Ci0rCi0rCQkvKiBub3QgZnVsbCBzY3JlZW4gLSB3b3JrIG91dCBnZW9tZXRyeSBmb3IgbWlkZGxlIG9mIHNjcmVlbiB1bmxlc3Mgc3BlY2lmaWVkIGJ5IHVzZXIgKi8KLSsKLSsJCVh0VmFHZXRWYWx1ZXModG9wbGV2ZWwsIFh0Tmdlb21ldHJ5LCAmZ2VvbWV0cnksIE5VTEwpOwotKwotKwkJaWYgKGdlb21ldHJ5ID09IE5VTEwpIHsKLSsJCQlEaW1lbnNpb24gdG9wbGV2ZWxYLCB0b3BsZXZlbFk7Ci0rCQkJRGltZW5zaW9uIHRvcGxldmVsV2lkdGggID0gdzsKLSsJCQlEaW1lbnNpb24gdG9wbGV2ZWxIZWlnaHQgPSBoOwotKwotKwkJCWlmICgodG9wbGV2ZWxXaWR0aCArIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGgpID49IGRweVdpZHRoKSB7Ci0rCQkJCXRvcGxldmVsV2lkdGggPSBkcHlXaWR0aCAtIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGg7Ci0rCQkJfQotKwotKwkJCWlmICgodG9wbGV2ZWxIZWlnaHQgKyBhcHBEYXRhLndtRGVjb3JhdGlvbkhlaWdodCkgPj0gZHB5SGVpZ2h0KSB7Ci0rCQkJCXRvcGxldmVsSGVpZ2h0ID0gZHB5SGVpZ2h0IC0gYXBwRGF0YS53bURlY29yYXRpb25IZWlnaHQ7Ci0rCQkJfQotKwotKwkJCXRvcGxldmVsWCA9IChkcHlXaWR0aCAgLSB0b3BsZXZlbFdpZHRoICAtIGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGgpIC8gMjsKLSsJCQl0b3BsZXZlbFkgPSAoZHB5SGVpZ2h0IC0gdG9wbGV2ZWxIZWlnaHQgLSBhcHBEYXRhLndtRGVjb3JhdGlvbkhlaWdodCkgLzI7Ci0rCi0rCQkJaWYgKGFwcERhdGEuYXBwU2hhcmUpIHsKLSsJCQkJaW50IFggPSBhcHBzaGFyZV94X2hpbnQ7Ci0rCQkJCWludCBZID0gYXBwc2hhcmVfeV9oaW50OwotKwkJCQlpZiAoYXBwRGF0YS5zY2FsZSkgewotKwkJCQkJZG91YmxlIGZ4ID0gMS4wLCBmeSA9IDEuMDsKLSsJCQkJCWdldF9zY2FsZV92YWx1ZXMoJmZ4LCAmZnkpOwotKwkJCQkJaWYgKGZ4ID4gMC4wICYmIGZ5ID4gMC4wKSB7Ci0rCQkJCQkJWCAqPSBmeDsKLSsJCQkJCQlZICo9IGZ5OwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJCWlmIChhcHBzaGFyZV94X2hpbnQgIT0gYXBwc2hhcmVfMF9oaW50KSB7Ci0rCQkJCQl0b3BsZXZlbFggPSBYOwotKwkJCQl9Ci0rCQkJCWlmIChhcHBzaGFyZV95X2hpbnQgIT0gYXBwc2hhcmVfMF9oaW50KSB7Ci0rCQkJCQl0b3BsZXZlbFkgPSBZOwotKwkJCQl9Ci0rCQkJfQotKwotKwkJCS8qIHNldCBwb3NpdGlvbiB2aWEgImdlb21ldHJ5IiBzbyB0aGF0IHdpbmRvdyBtYW5hZ2VyIHRoaW5rcyBpdCdzIGEKLSsJCQkgdXNlci1zcGVjaWZpZWQgcG9zaXRpb24gYW5kIHRoZXJlZm9yZSBob25vdXJzIGl0ICovCi0rCi0rCQkJZ2VvbWV0cnkgPSBYdE1hbGxvYygyNTYpOwotKwotKwkJCXNwcmludGYoZ2VvbWV0cnksICIlZHglZCslZCslZCIsIHRvcGxldmVsV2lkdGgsIHRvcGxldmVsSGVpZ2h0LCB0b3BsZXZlbFgsIHRvcGxldmVsWSk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJnZW9tZXRyeTogJXMgeWNyb3A6ICVkXG4iLCBnZW9tZXRyeSwgYXBwRGF0YS55Q3JvcCk7Ci0rCQkJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHROZ2VvbWV0cnksIGdlb21ldHJ5LCBOVUxMKTsKLSsJCX0KLSsJfQotIAotICAgLyogVGVzdCBpZiB0aGUga2V5Ym9hcmQgaXMgZ3JhYmJlZC4gIElmIHNvLCBpdCdzIHByb2JhYmx5IGJlY2F1c2UgdGhlCi0gICAgICBYRE0gbG9naW4gd2luZG93IGlzIHVwLCBzbyB0cnkgaWNvbmlmeWluZyBpdCB0byByZWxlYXNlIHRoZSBncmFiICovCi0gCi0tICBpZiAoWEdyYWJLZXlib2FyZChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIEZhbHNlLCBHcmFiTW9kZVN5bmMsCi0tCQkgICAgR3JhYk1vZGVTeW5jLCBDdXJyZW50VGltZSkgPT0gR3JhYlN1Y2Nlc3MpIHsKLS0gICAgWFVuZ3JhYktleWJvYXJkKGRweSwgQ3VycmVudFRpbWUpOwotLSAgfSBlbHNlIHsKLS0gICAgd21TdGF0ZSA9IFhJbnRlcm5BdG9tKGRweSwgIldNX1NUQVRFIiwgRmFsc2UpOwotLQotLSAgICBpZiAoSWNvbmlmeU5hbWVkV2luZG93KERlZmF1bHRSb290V2luZG93KGRweSksICJ4bG9naW4iLCBGYWxzZSkpIHsKLS0gICAgICB4bG9naW5JY29uaWZpZWQgPSBUcnVlOwotLSAgICAgIFhTeW5jKGRweSwgRmFsc2UpOwotLSAgICAgIHNsZWVwKDEpOwotLSAgICB9Ci0tICB9Ci0tCi0tICAvKiBTZXQgaGFuZGxlcnMgZm9yIHNpZ25hbHMgYW5kIFggZXJyb3JzIHRvIHBlcmZvcm0gY2xlYW51cCAqLwotLQotLSAgc2lnbmFsKFNJR0hVUCwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOwotLSAgc2lnbmFsKFNJR0lOVCwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOwotLSAgc2lnbmFsKFNJR1RFUk0sIENsZWFudXBTaWduYWxIYW5kbGVyKTsKLS0gIGRlZmF1bHRYRXJyb3JIYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihDbGVhbnVwWEVycm9ySGFuZGxlcik7Ci0tICBkZWZhdWx0WElPRXJyb3JIYW5kbGVyID0gWFNldElPRXJyb3JIYW5kbGVyKENsZWFudXBYSU9FcnJvckhhbmRsZXIpOwotLSAgZGVmYXVsdFh0RXJyb3JIYW5kbGVyID0gWHRBcHBTZXRFcnJvckhhbmRsZXIoYXBwQ29udGV4dCwKLS0JCQkJCSAgICAgICBDbGVhbnVwWHRFcnJvckhhbmRsZXIpOwotKwlpZiAoWEdyYWJLZXlib2FyZChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIEZhbHNlLCBHcmFiTW9kZVN5bmMsIEdyYWJNb2RlU3luYywgQ3VycmVudFRpbWUpID09IEdyYWJTdWNjZXNzKSB7Ci0rCQlYVW5ncmFiS2V5Ym9hcmQoZHB5LCBDdXJyZW50VGltZSk7Ci0rCX0gZWxzZSB7Ci0rCQl3bVN0YXRlID0gWEludGVybkF0b20oZHB5LCAiV01fU1RBVEUiLCBGYWxzZSk7Ci0rCQlpZiAoSWNvbmlmeU5hbWVkV2luZG93KERlZmF1bHRSb290V2luZG93KGRweSksICJ4bG9naW4iLCBGYWxzZSkpIHsKLSsJCQl4bG9naW5JY29uaWZpZWQgPSBUcnVlOwotKwkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJCXNsZWVwKDEpOwotKwkJfQotKwl9Ci0rCi0rCS8qIFNldCBoYW5kbGVycyBmb3Igc2lnbmFscyBhbmQgWCBlcnJvcnMgdG8gcGVyZm9ybSBjbGVhbnVwICovCi0rCXNpZ25hbChTSUdIVVAsICBDbGVhbnVwU2lnbmFsSGFuZGxlcik7Ci0rCXNpZ25hbChTSUdJTlQsICBDbGVhbnVwU2lnbmFsSGFuZGxlcik7Ci0rCXNpZ25hbChTSUdURVJNLCBDbGVhbnVwU2lnbmFsSGFuZGxlcik7Ci0rCWRlZmF1bHRYRXJyb3JIYW5kbGVyICAgPSBYU2V0RXJyb3JIYW5kbGVyKENsZWFudXBYRXJyb3JIYW5kbGVyKTsKLSsJZGVmYXVsdFhJT0Vycm9ySGFuZGxlciA9IFhTZXRJT0Vycm9ySGFuZGxlcihDbGVhbnVwWElPRXJyb3JIYW5kbGVyKTsKLSsJZGVmYXVsdFh0RXJyb3JIYW5kbGVyICA9IFh0QXBwU2V0RXJyb3JIYW5kbGVyKGFwcENvbnRleHQsIENsZWFudXBYdEVycm9ySGFuZGxlcik7Ci0gfQotIAotIAotQEAgLTE0MSwxNCArMTg1LDIyIEBACi0gdm9pZAotIFRvcGxldmVsSW5pdEFmdGVyUmVhbGl6YXRpb24oKQotIHsKLS0gIGlmIChhcHBEYXRhLmZ1bGxTY3JlZW4pIHsKLS0gICAgRnVsbFNjcmVlbk9uKCk7Ci0tICB9Ci0tCi0tICB3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKGRweSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Ci0tICBYU2V0V01Qcm90b2NvbHMoZHB5LCBYdFdpbmRvdyh0b3BsZXZlbCksICZ3bURlbGV0ZVdpbmRvdywgMSk7Ci0tICBYdE92ZXJyaWRlVHJhbnNsYXRpb25zCi0tICAgICAgKHRvcGxldmVsLCBYdFBhcnNlVHJhbnNsYXRpb25UYWJsZSAoIjxNZXNzYWdlPldNX1BST1RPQ09MUzogUXVpdCgpIikpOwotKwlpZiAoYXBwRGF0YS5mdWxsU2NyZWVuKSB7Ci0rCQlGdWxsU2NyZWVuT24oKTsKLSsJCWlmIChuZXRfd21fc3VwcG9ydGVkKCkpIHsKLSsJCQkvKiBwcm9ibGVtIHdpdGggc2Nyb2xsIGJhcnMgc3RpY2tpbmc6ICovCi0rICAgICAgCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rICAJCQl1c2xlZXAoNTAgKiAxMDAwKTsKLSsJCQlGdWxsU2NyZWVuT2ZmKCk7Ci0rICAgICAgCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rICAJCQl1c2xlZXAoNTAgKiAxMDAwKTsKLSsJCQlGdWxsU2NyZWVuT24oKTsKLSsJCX0KLSsJfQotKwotKwl3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKGRweSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Ci0rCVhTZXRXTVByb3RvY29scyhkcHksIFh0V2luZG93KHRvcGxldmVsKSwgJndtRGVsZXRlV2luZG93LCAxKTsKLSsJWHRPdmVycmlkZVRyYW5zbGF0aW9ucyh0b3BsZXZlbCwgWHRQYXJzZVRyYW5zbGF0aW9uVGFibGUgKCI8TWVzc2FnZT5XTV9QUk9UT0NPTFM6IFF1aXQoKSIpKTsKLSB9Ci0gCi0gCi1AQCAtMTU3LDkgKzIwOSw3IEBACi0gICogQ3VycmVudFRpbWUgaWYgdGhlIGV2ZW50IGhhcyBubyB0aW1lIGZpZWxkLgotICAqLwotIAotLVRpbWUKLS1UaW1lRnJvbUV2ZW50KFhFdmVudCAqZXYpCi0tewotK1RpbWUgVGltZUZyb21FdmVudChYRXZlbnQgKmV2KSB7Ci0gICBzd2l0Y2ggKGV2LT50eXBlKSB7Ci0gICBjYXNlIEtleVByZXNzOgotICAgY2FzZSBLZXlSZWxlYXNlOgotQEAgLTE5MiwxOCArMjQyLDE2IEBACi0gICogZ2VuZXJhdGVkIGJ5IFNlbmRSRkJFdmVudC4KLSAgKi8KLSAKLS12b2lkCi0tUGF1c2UoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLS17Ci0tICBpbnQgbXNlYzsKLSt2b2lkIFBhdXNlKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpIHsKLSsJaW50IG1zZWM7Ci0gCi0tICBpZiAoKm51bV9wYXJhbXMgPT0gMCkgewotLSAgICBtc2VjID0gMTAwOwotLSAgfSBlbHNlIHsKLS0gICAgbXNlYyA9IGF0b2kocGFyYW1zWzBdKTsKLS0gIH0KLS0KLS0gIHVzbGVlcChtc2VjICogMTAwMCk7Ci0rCWlmICgqbnVtX3BhcmFtcyA9PSAwKSB7Ci0rCQltc2VjID0gMTAwOwotKwl9IGVsc2UgewotKwkJbXNlYyA9IGF0b2kocGFyYW1zWzBdKTsKLSsJfQotKwl1c2xlZXAobXNlYyAqIDEwMDApOwotKwlpZiAodyB8fCBldmVudCB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci0gCi0gCi1AQCAtMjU2LDYgKzMwNCw3IEBACi0gICAvKiBXYWl0IGZvciBDaGlsZCAxIHRvIGRpZSAqLwotICAgd2FpdCgmY2hpbGRzdGF0dXMpOwotICAgCi0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotICAgcmV0dXJuOwotIH0KLSAKLUBAIC0yNjQsMTEgKzMxMywxMCBAQAotICAqIFF1aXQgYWN0aW9uIC0gY2FsbGVkIHdoZW4gd2UgZ2V0IGEgImRlbGV0ZSB3aW5kb3ciIG1lc3NhZ2UuCi0gICovCi0gCi0tdm9pZAotLVF1aXQoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLS17Ci0tICBDbGVhbnVwKCk7Ci0tICBleGl0KDApOwotK3ZvaWQgUXVpdChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKSB7Ci0rCUNsZWFudXAoKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rCWV4aXQoMCk7Ci0gfQotIAotIAotQEAgLTI3Niw0OSArMzI0LDk0IEBACi0gICogQ2xlYW51cCAtIHBlcmZvcm0gYW55IGNsZWFudXAgb3BlcmF0aW9ucyBwcmlvciB0byBleGl0aW5nLgotICAqLwotIAotLXZvaWQKLS1DbGVhbnVwKCkKLS17Ci0tICBpZiAoeGxvZ2luSWNvbmlmaWVkKSB7Ci0tICAgIEljb25pZnlOYW1lZFdpbmRvdyhEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCAieGxvZ2luIiwgVHJ1ZSk7Ci0tICAgIFhGbHVzaChkcHkpOwotLSAgfQotK3ZvaWQgQ2xlYW51cCgpIHsKLSsKLSsJaWYgKGFwcERhdGEuY2hhdEFjdGl2ZSkgewotKwkJYXBwRGF0YS5jaGF0QWN0aXZlID0gRmFsc2U7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiU2VuZGluZyBTZW5kVGV4dENoYXRDbG9zZSgpXG4iKTsKLSsJCVNlbmRUZXh0Q2hhdENsb3NlKCk7Ci0rCQlTZW5kVGV4dENoYXRGaW5pc2hlZCgpOwotKwl9Ci0rCi0rCWlmICh4bG9naW5JY29uaWZpZWQpIHsKLSsJCUljb25pZnlOYW1lZFdpbmRvdyhEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCAieGxvZ2luIiwgVHJ1ZSk7Ci0rCQlYRmx1c2goZHB5KTsKLSsJfQotICNpZmRlZiBNSVRTSE0KLS0gIGlmIChhcHBEYXRhLnVzZVNobSkKLS0gICAgU2htQ2xlYW51cCgpOwotKwlpZiAoYXBwRGF0YS51c2VTaG0pIHsKLSsJCWlmIChVc2luZ1NobSgpKSB7Ci0rCQkJU2htRGV0YWNoKCk7Ci0rCQl9Ci0rCQlTaG1DbGVhbnVwKCk7Ci0rCX0KLSAjZW5kaWYKLSsKLSsJcmVsZWFzZUFsbFByZXNzZWRNb2RpZmllcnMoKTsKLSsKLSsJZnByaW50ZihzdGRlcnIsIlxuVk5DIFZpZXdlciBleGl0aW5nLlxuXG4iKTsKLSsJaWYgKGxpc3RlblNwZWNpZmllZCkgewotKwkJaWYgKGxpc3RlblBhcmVudCAhPSAwICYmIGdldGVudigiU1NWTkNfTElTVEVOX09OQ0UiKSAmJiBsaXN0ZW5QYXJlbnQgIT0gZ2V0cGlkKCkpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlNTVk5DX0xJU1RFTl9PTkNFOiBUcnlpbmcgdG8ga2lsbCBMaXN0ZW5pbmcgUGFyZW50OiAlZFxuIiwgKGludCkgbGlzdGVuUGFyZW50KTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlNTVk5DX0xJU1RFTl9PTkNFOiBQcmVzcyBDdHJsLUMgaWYgaXQgY29udGludWVzIHRvIExpc3Rlbi5cblxuIik7Ci0rCQkJa2lsbChsaXN0ZW5QYXJlbnQsIFNJR1RFUk0pOwotKwkJfSBlbHNlIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwiKE5PVEU6IFlvdSBtYXkgbmVlZCB0byBQcmVzcyBDdHJsLUMgdG8gbWFrZSB0aGUgVmlld2VyIFN0b3AgTGlzdGVuaW5nLilcblxuIik7Ci0rCQl9Ci0rCX0KLSt9Ci0rCi0rc3RhdGljIHZvaWQgY2hlY2tfZGJnKHZvaWQpIHsKLSsJaWYgKGdldGVudigiU1NWTkNfRVhJVF9ERUJVRyIpKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlByZXNzIGFueSBrZXkgdG8gY29udGludWU6ICIpOwotKwkJZ2V0YyhzdGRpbik7Ci0rCX0KLSB9Ci0gCi0gc3RhdGljIGludAotIENsZWFudXBYRXJyb3JIYW5kbGVyKERpc3BsYXkgKmRweSwgWEVycm9yRXZlbnQgKmVycm9yKQotIHsKLS0gIGZwcmludGYoc3RkZXJyLCJDbGVhbnVwWEVycm9ySGFuZGxlciBjYWxsZWRcbiIpOwotLSAgQ2xlYW51cCgpOwotLSAgcmV0dXJuICgqZGVmYXVsdFhFcnJvckhhbmRsZXIpKGRweSwgZXJyb3IpOwotKwlpZiAoWEVycm9yX2lnbikgewotKwkJY2hhciBzdHJbNDA5Nl07Ci0rCQlYRXJyb3JfaWduKys7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiWEVycm9yX2lnbiBjYWxsZWQuXG4iKTsKLSsJCXN0clswXSA9ICdcMCc7Ci0rCQlpZiAoWEdldEVycm9yVGV4dChkcHksIGVycm9yLT5lcnJvcl9jb2RlLCBzdHIsIDQwOTYpKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cik7Ci0rCQl9Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwlmcHJpbnRmKHN0ZGVyciwiQ2xlYW51cFhFcnJvckhhbmRsZXIgY2FsbGVkXG4iKTsKLSsJY2hlY2tfZGJnKCk7Ci0rCUNsZWFudXAoKTsKLSsJcmV0dXJuICgqZGVmYXVsdFhFcnJvckhhbmRsZXIpKGRweSwgZXJyb3IpOwotIH0KLSAKLSBzdGF0aWMgaW50Ci0gQ2xlYW51cFhJT0Vycm9ySGFuZGxlcihEaXNwbGF5ICpkcHkpCi0gewotLSAgZnByaW50ZihzdGRlcnIsIkNsZWFudXBYSU9FcnJvckhhbmRsZXIgY2FsbGVkXG4iKTsKLS0gIENsZWFudXAoKTsKLS0gIHJldHVybiAoKmRlZmF1bHRYSU9FcnJvckhhbmRsZXIpKGRweSk7Ci0rCWZwcmludGYoc3RkZXJyLCJDbGVhbnVwWElPRXJyb3JIYW5kbGVyIGNhbGxlZFxuIik7Ci0rCWNoZWNrX2RiZygpOwotKwlDbGVhbnVwKCk7Ci0rCXJldHVybiAoKmRlZmF1bHRYSU9FcnJvckhhbmRsZXIpKGRweSk7Ci0gfQotIAotIHN0YXRpYyB2b2lkCi0gQ2xlYW51cFh0RXJyb3JIYW5kbGVyKFN0cmluZyBtZXNzYWdlKQotIHsKLS0gIGZwcmludGYoc3RkZXJyLCJDbGVhbnVwWHRFcnJvckhhbmRsZXIgY2FsbGVkXG4iKTsKLS0gIENsZWFudXAoKTsKLS0gICgqZGVmYXVsdFh0RXJyb3JIYW5kbGVyKShtZXNzYWdlKTsKLSsJZnByaW50ZihzdGRlcnIsIkNsZWFudXBYdEVycm9ySGFuZGxlciBjYWxsZWRcbiIpOwotKwljaGVja19kYmcoKTsKLSsJQ2xlYW51cCgpOwotKwkoKmRlZmF1bHRYdEVycm9ySGFuZGxlcikobWVzc2FnZSk7Ci0gfQotIAotIHN0YXRpYyB2b2lkCi0gQ2xlYW51cFNpZ25hbEhhbmRsZXIoaW50IHNpZykKLSB7Ci0tICBmcHJpbnRmKHN0ZGVyciwiQ2xlYW51cFNpZ25hbEhhbmRsZXIgY2FsbGVkXG4iKTsKLS0gIENsZWFudXAoKTsKLS0gIGV4aXQoMSk7Ci0rCWZwcmludGYoc3RkZXJyLCJDbGVhbnVwU2lnbmFsSGFuZGxlciBjYWxsZWRcbiIpOwotKwljaGVja19kYmcoKTsKLSsJQ2xlYW51cCgpOwotKwlpZiAoc2lnKSB7fQotKwlleGl0KDEpOwotIH0KLSAKLSAKLUBAIC0zNjIsNyArNDU1LDcgQEAKLSAgIGlmICghWFF1ZXJ5VHJlZShkcHksIHcsICZkdW1teSwgJmR1bW15LCAmY2hpbGRyZW4sICZuY2hpbGRyZW4pKQotICAgICByZXR1cm4gRmFsc2U7Ci0gCi0tICBmb3IgKGkgPSAwOyBpIDwgbmNoaWxkcmVuOyBpKyspIHsKLSsgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBuY2hpbGRyZW47IGkrKykgewotICAgICBpZiAoSWNvbmlmeU5hbWVkV2luZG93KGNoaWxkcmVuW2ldLCBuYW1lLCB1bmRvKSkgewotICAgICAgIFhGcmVlICgoY2hhciAqKWNoaWxkcmVuKTsKLSAgICAgICByZXR1cm4gVHJ1ZTsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3BvcHVwLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3BvcHVwLmMKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9wb3B1cC5jCTIwMDAtMDYtMTEgMDg6MDA6NTMuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3BvcHVwLmMJMjAxMC0wNC0xMSAyMjowMzozMi4wMDAwMDAwMDAgLTA0MDAKLUBAIC0yMiwyNSArMjIsNjkgQEAKLSAgKi8KLSAKLSAjaW5jbHVkZSAidm5jdmlld2VyLmgiCi0rI2luY2x1ZGUgPHRpbWUuaD4KLSsjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSAKLSAjaW5jbHVkZSA8WDExL1hhdy9Gb3JtLmg+Ci0gI2luY2x1ZGUgPFgxMS9YYXcvQ29tbWFuZC5oPgotKyNpbmNsdWRlIDxYMTEvWGF3L0FzY2lpVGV4dC5oPgotICNpbmNsdWRlIDxYMTEvWGF3L1RvZ2dsZS5oPgotIAotKyNpbmNsdWRlIDxYMTEvWGF3L0JveC5oPgotKyNpbmNsdWRlIDxYMTEvWGF3L1Njcm9sbGJhci5oPgotKwotIFdpZGdldCBwb3B1cCwgZnVsbFNjcmVlblRvZ2dsZTsKLSAKLStCb29sIFNlbmRUZXh0Q2hhdEZpbmlzaGVkKHZvaWQpOwotKwotK3ZvaWQgcG9wdXBGaXhlcihXaWRnZXQgd2lkKSB7Ci0rCVdpbmRvdyByciwgY3I7IAotKwl1bnNpZ25lZCBpbnQgbTsKLSsgIAlpbnQgeDAgPSA1MDAsIHkwID0gNTAwOwotKwlpbnQgeHIsIHlyLCB3eHIsIHd5cjsKLSsJRGltZW5zaW9uIHBoOwotKwlpZiAoWFF1ZXJ5UG9pbnRlcihkcHksIERlZmF1bHRSb290V2luZG93KGRweSksICZyciwgJmNyLCAmeHIsICZ5ciwgJnd4ciwgJnd5ciwgJm0pKSB7Ci0rCQl4MCA9IHhyOwotKwkJeTAgPSB5cjsKLSsJfQotKyAgCVh0UG9wdXAod2lkLCBYdEdyYWJOb25lKTsKLSsJWHRWYUdldFZhbHVlcyh3aWQsIFh0TmhlaWdodCwgJnBoLCBOVUxMKTsKLSsJaWYgKHkwICsgKGludCkgcGggPiBkcHlIZWlnaHQpIHsKLSsJCXkwID0gZHB5SGVpZ2h0IC0gKGludCkgcGg7Ci0rCQlpZiAoeTAgPCAwKSB7Ci0rCQkJeTAgPSAwOwotKwkJfQotKwl9Ci0rCVh0TW92ZVdpZGdldCh3aWQsIHgwLCB5MCk7Ci0rfQotKwotK3ZvaWQgTm9vcChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKSB7Ci0rCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIk5vLW9wXG4iKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotIHZvaWQKLSBTaG93UG9wdXAoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSB7Ci0tICBYdE1vdmVXaWRnZXQocG9wdXAsIGV2ZW50LT54YnV0dG9uLnhfcm9vdCwgZXZlbnQtPnhidXR0b24ueV9yb290KTsKLS0gIFh0UG9wdXAocG9wdXAsIFh0R3JhYk5vbmUpOwotLSAgWFNldFdNUHJvdG9jb2xzKGRweSwgWHRXaW5kb3cocG9wdXApLCAmd21EZWxldGVXaW5kb3csIDEpOwotKwlpZiAoYXBwRGF0YS5wb3B1cEZpeCkgewotKwkJcG9wdXBGaXhlcihwb3B1cCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdE1vdmVXaWRnZXQocG9wdXAsIGV2ZW50LT54YnV0dG9uLnhfcm9vdCwgZXZlbnQtPnhidXR0b24ueV9yb290KTsKLSsJCVh0UG9wdXAocG9wdXAsIFh0R3JhYk5vbmUpOwotKwl9Ci0rCWlmIChhcHBEYXRhLmdyYWJBbGwpIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJWFJhaXNlV2luZG93KGRweSwgWHRXaW5kb3cocG9wdXApKTsKLSsJfQotKwlYU2V0V01Qcm90b2NvbHMoZHB5LCBYdFdpbmRvdyhwb3B1cCksICZ3bURlbGV0ZVdpbmRvdywgMSk7Ci0rCVh0T3ZlcnJpZGVUcmFuc2xhdGlvbnMocG9wdXAsIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlICgiPE1lc3NhZ2U+V01fUFJPVE9DT0xTOiBIaWRlUG9wdXAoKSIpKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0gfQotIAotIHZvaWQKLS1IaWRlUG9wdXAoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLS17Ci0tICBYdFBvcGRvd24ocG9wdXApOwotK0hpZGVQb3B1cChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKSB7Ci0rCVh0UG9wZG93bihwb3B1cCk7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotIH0KLSAKLSAKLUBAIC01Miw0MiArOTYsODA4IEBACi0gfTsKLSAKLSB2b2lkCi0tQ3JlYXRlUG9wdXAoKQotK0NyZWF0ZVBvcHVwKCkgewotKwlXaWRnZXQgYnV0dG9uRm9ybTEsIGJ1dHRvbkZvcm0yLCB0d29Gb3JtLCBidXR0b24gPSAwLCBwcmV2QnV0dG9uID0gTlVMTDsKLSsJaW50IGk7Ci0rCWNoYXIgYnV0dG9uTmFtZVsxMl07Ci0rCVN0cmluZyBidXR0b25UeXBlOwotKwotKwlwb3B1cCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJwb3B1cCIsIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsIHRvcGxldmVsLCBOVUxMKTsKLSsKLSsJdHdvRm9ybSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJidXR0b25Gb3JtIiwgZm9ybVdpZGdldENsYXNzLCBwb3B1cCwgTlVMTCk7Ci0rCWJ1dHRvbkZvcm0xID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImJ1dHRvbkZvcm0iLCBmb3JtV2lkZ2V0Q2xhc3MsIHR3b0Zvcm0sIE5VTEwpOwotKwlidXR0b25Gb3JtMiA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJidXR0b25Gb3JtIiwgZm9ybVdpZGdldENsYXNzLCB0d29Gb3JtLCBYdE5mcm9tSG9yaXosIChYdEFyZ1ZhbCkgYnV0dG9uRm9ybTEsIE5VTEwpOwotKwotKwlpZiAoYXBwRGF0YS5wb3B1cEJ1dHRvbkNvdW50ID4gMTAwKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiVG9vIG1hbnkgcG9wdXAgYnV0dG9uc1xuIik7Ci0rCQlleGl0KDEpOwotKwl9Ci0rCi0rCWZvciAoaSA9IDE7IGkgPD0gYXBwRGF0YS5wb3B1cEJ1dHRvbkNvdW50OyBpKyspIHsKLSsJCVdpZGdldCBiZm9ybTsKLSsJCXNwcmludGYoYnV0dG9uTmFtZSwgImJ1dHRvbiVkIiwgaSk7Ci0rCi0rCQlpZiAoaSA8PSBhcHBEYXRhLnBvcHVwQnV0dG9uQnJlYWspIHsKLSsJCQliZm9ybSA9IGJ1dHRvbkZvcm0xOwotKwkJfSBlbHNlIHsKLSsJCQlpZiAoaSA9PSBhcHBEYXRhLnBvcHVwQnV0dG9uQnJlYWsrMSkgewotKwkJCQlwcmV2QnV0dG9uID0gTlVMTDsKLSsJCQl9Ci0rCQkJYmZvcm0gPSBidXR0b25Gb3JtMjsKLSsJCX0KLSsJCVh0VmFHZXRTdWJyZXNvdXJjZXMoYmZvcm0sIChYdFBvaW50ZXIpJmJ1dHRvblR5cGUsIGJ1dHRvbk5hbWUsICJCdXR0b24iLCByZXNvdXJjZXMsIDEsIE5VTEwpOwotKwotKwkJaWYgKHN0cmNtcChidXR0b25UeXBlLCAiY29tbWFuZCIpID09IDApIHsKLSsJCQlidXR0b24gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChidXR0b25OYW1lLCBjb21tYW5kV2lkZ2V0Q2xhc3MsIGJmb3JtLCBOVUxMKTsKLSsJCQlYdFZhU2V0VmFsdWVzKGJ1dHRvbiwgWHROZnJvbVZlcnQsIHByZXZCdXR0b24sIFh0TmxlZnQsIFhhd0NoYWluTGVmdCwgWHROcmlnaHQsIFhhd0NoYWluUmlnaHQsIE5VTEwpOwotKwkJfSBlbHNlIGlmIChzdHJjbXAoYnV0dG9uVHlwZSwgInRvZ2dsZSIpID09IDApIHsKLSsJCQlidXR0b24gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChidXR0b25OYW1lLCB0b2dnbGVXaWRnZXRDbGFzcywgYmZvcm0sIE5VTEwpOwotKwkJCVh0VmFTZXRWYWx1ZXMoYnV0dG9uLCBYdE5mcm9tVmVydCwgcHJldkJ1dHRvbiwgWHRObGVmdCwgWGF3Q2hhaW5MZWZ0LCBYdE5yaWdodCwgWGF3Q2hhaW5SaWdodCwgTlVMTCk7Ci0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCJ1bmtub3duIGJ1dHRvbiB0eXBlICclcydcbiIsIGJ1dHRvblR5cGUpOwotKwkJfQotKwkJcHJldkJ1dHRvbiA9IGJ1dHRvbjsKLSsJfQotK30KLSsKLSsKLStXaWRnZXQgc2NhbGVOOwotKwotK3ZvaWQKLStTaG93U2NhbGVOKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKyAgaWYgKGFwcERhdGEucG9wdXBGaXgpIHsKLSsJcG9wdXBGaXhlcihzY2FsZU4pOwotKyAgfSBlbHNlIHsKLSsJWHRNb3ZlV2lkZ2V0KHNjYWxlTiwgZXZlbnQtPnhidXR0b24ueF9yb290LCBldmVudC0+eGJ1dHRvbi55X3Jvb3QpOwotKyAgCVh0UG9wdXAoc2NhbGVOLCBYdEdyYWJOb25lKTsKLSsgIH0KLSsgIGlmIChhcHBEYXRhLmdyYWJBbGwpIHsKLSsgIAlYUmFpc2VXaW5kb3coZHB5LCBYdFdpbmRvdyhzY2FsZU4pKTsKLSsgIH0KLSsgIFhTZXRXTVByb3RvY29scyhkcHksIFh0V2luZG93KHNjYWxlTiksICZ3bURlbGV0ZVdpbmRvdywgMSk7Ci0rICBYdE92ZXJyaWRlVHJhbnNsYXRpb25zKHNjYWxlTiwgWHRQYXJzZVRyYW5zbGF0aW9uVGFibGUgKCI8TWVzc2FnZT5XTV9QUk9UT0NPTFM6IEhpZGVTY2FsZU4oKSIpKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStIaWRlU2NhbGVOKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKyAgWHRQb3Bkb3duKHNjYWxlTik7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSsKLSt2b2lkCi0rQ3JlYXRlU2NhbGVOKCkKLSB7Ci0gICBXaWRnZXQgYnV0dG9uRm9ybSwgYnV0dG9uLCBwcmV2QnV0dG9uID0gTlVMTDsKLSAgIGludCBpOwotLSAgY2hhciBidXR0b25OYW1lWzEyXTsKLSsgIGNoYXIgYnV0dG9uTmFtZVszMl07Ci0gICBTdHJpbmcgYnV0dG9uVHlwZTsKLSAKLS0gIHBvcHVwID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInBvcHVwIiwgdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywgdG9wbGV2ZWwsCi0rICBzY2FsZU4gPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgic2NhbGVOIiwgdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywgdG9wbGV2ZWwsCi0gCQkJICAgICAgIE5VTEwpOwotIAotLSAgYnV0dG9uRm9ybSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJidXR0b25Gb3JtIiwgZm9ybVdpZGdldENsYXNzLCBwb3B1cCwKLSsgIGJ1dHRvbkZvcm0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiYnV0dG9uRm9ybSIsIGZvcm1XaWRnZXRDbGFzcywgc2NhbGVOLAotIAkJCQkgICAgICAgTlVMTCk7Ci0gCi0tICBpZiAoYXBwRGF0YS5wb3B1cEJ1dHRvbkNvdW50ID4gMTAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCJUb28gbWFueSBwb3B1cCBidXR0b25zXG4iKTsKLS0gICAgZXhpdCgxKTsKLS0gIH0KLS0KLS0gIGZvciAoaSA9IDE7IGkgPD0gYXBwRGF0YS5wb3B1cEJ1dHRvbkNvdW50OyBpKyspIHsKLSsgIGZvciAoaSA9IDA7IGkgPD0gNjsgaSsrKSB7Ci0gICAgIHNwcmludGYoYnV0dG9uTmFtZSwgImJ1dHRvbiVkIiwgaSk7Ci0gICAgIFh0VmFHZXRTdWJyZXNvdXJjZXMoYnV0dG9uRm9ybSwgKFh0UG9pbnRlcikmYnV0dG9uVHlwZSwgYnV0dG9uTmFtZSwKLSAJCQkiQnV0dG9uIiwgcmVzb3VyY2VzLCAxLCBOVUxMKTsKLSAKLS0gICAgaWYgKHN0cmNtcChidXR0b25UeXBlLCAiY29tbWFuZCIpID09IDApIHsKLS0gICAgICBidXR0b24gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChidXR0b25OYW1lLCBjb21tYW5kV2lkZ2V0Q2xhc3MsCi0rICAgIGJ1dHRvbiA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGJ1dHRvbk5hbWUsIHRvZ2dsZVdpZGdldENsYXNzLAotIAkJCQkgICAgICAgYnV0dG9uRm9ybSwgTlVMTCk7Ci0tICAgICAgWHRWYVNldFZhbHVlcyhidXR0b24sIFh0TmZyb21WZXJ0LCBwcmV2QnV0dG9uLAotKyAgICBYdFZhU2V0VmFsdWVzKGJ1dHRvbiwgWHROZnJvbVZlcnQsIHByZXZCdXR0b24sCi0gCQkgICAgWHRObGVmdCwgWGF3Q2hhaW5MZWZ0LCBYdE5yaWdodCwgWGF3Q2hhaW5SaWdodCwgTlVMTCk7Ci0tICAgIH0gZWxzZSBpZiAoc3RyY21wKGJ1dHRvblR5cGUsICJ0b2dnbGUiKSA9PSAwKSB7Ci0tICAgICAgYnV0dG9uID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoYnV0dG9uTmFtZSwgdG9nZ2xlV2lkZ2V0Q2xhc3MsCi0rICAgIHByZXZCdXR0b24gPSBidXR0b247Ci0rICB9Ci0rfQotKwotK1dpZGdldCB0dXJib3ZuY1c7Ci0rCi0rc3RhdGljIFdpZGdldCB0dXJib0J1dHRvbnNbMzJdOwotKwotK1dpZGdldCBxdWFsdGV4dCwgcXVhbHNsaWRlcjsKLSsKLSt2b2lkIFVwZGF0ZVF1YWxTbGlkZXIodm9pZCkgewotKyNpZmRlZiBUVVJCT1ZOQwotKwljaGFyIHRleHRbMTZdOwotKwlYYXdTY3JvbGxiYXJTZXRUaHVtYihxdWFsc2xpZGVyLCAoZmxvYXQpYXBwRGF0YS5xdWFsaXR5TGV2ZWwvMTAwLiwgMC4pOwotKwlzcHJpbnRmKHRleHQsICIlM2QiLCBhcHBEYXRhLnF1YWxpdHlMZXZlbCk7Ci0rCVh0VmFTZXRWYWx1ZXMocXVhbHRleHQsIFh0TmxhYmVsLCB0ZXh0LCBOVUxMKTsKLSsjZW5kaWYKLSt9Ci0rCi0rdm9pZCBxdWFsU2Nyb2xsUHJvYyhXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudCwgWHRQb2ludGVyIHApIHsKLSsjaWZkZWYgVFVSQk9WTkMKLSsJZmxvYXQgc2l6ZSwgdmFsOyAgaW50IHF1YWwsIHBvcz0oaW50KXA7Ci0rCVh0VmFHZXRWYWx1ZXModywgWHROc2hvd24sICZzaXplLCBYdE50b3BPZlRodW1iLCAmdmFsLCAwKTsKLSsJaWYocG9zPDApIHZhbC09LjE7ICBlbHNlIHZhbCs9LjE7Ci0rCXF1YWw9KGludCkodmFsKjEwMC4pOyAgaWYocXVhbDwxKSBxdWFsPTE7ICBpZihxdWFsPjEwMCkgcXVhbD0xMDA7Ci0rCVhhd1Njcm9sbGJhclNldFRodW1iKHcsIHZhbCwgMC4pOwotKwlhcHBEYXRhLnF1YWxpdHlMZXZlbD1xdWFsOwotKwlVcGRhdGVRdWFsKCk7Ci0rI2VuZGlmCi0rCWlmICh3IHx8IGNsaWVudCB8fCBwKSB7fQotK30KLSsKLSt2b2lkIHF1YWxKdW1wUHJvYyhXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudCwgWHRQb2ludGVyIHApIHsKLSsjaWZkZWYgVFVSQk9WTkMKLSsJZmxvYXQgdmFsPSooZmxvYXQgKilwOyAgaW50IHF1YWw7Ci0rCXF1YWw9KGludCkodmFsKjEwMC4pOyAgaWYocXVhbDwxKSBxdWFsPTE7ICBpZihxdWFsPjEwMCkgcXVhbD0xMDA7Ci0rCWFwcERhdGEucXVhbGl0eUxldmVsPXF1YWw7Ci0rCVVwZGF0ZVF1YWwoKTsKLSsjZW5kaWYKLSsJaWYgKHcgfHwgY2xpZW50IHx8IHApIHt9Ci0rfQotKwotK3ZvaWQgVXBkYXRlU3Vic2FtcEJ1dHRvbnModm9pZCkgewotKyNpZmRlZiBUVVJCT1ZOQwotKwlpbnQgaTsKLSsJZm9yIChpPTc7IGkgPD0gMTA7IGkrKykgewotKwkJWHRWYVNldFZhbHVlcyh0dXJib0J1dHRvbnNbaV0sIFh0TnN0YXRlLCAwLCBOVUxMKTsKLSsJfQotKwlpZiAoYXBwRGF0YS5zdWJzYW1wTGV2ZWw9PVRWTkNfMVgpIHsKLSsJCWkgPSA3OwotKwl9IGVsc2UgaWYgKGFwcERhdGEuc3Vic2FtcExldmVsPT1UVk5DXzJYKSB7Ci0rCQlpID0gODsKLSsJfSBlbHNlIGlmIChhcHBEYXRhLnN1YnNhbXBMZXZlbD09VFZOQ180WCkgewotKwkJaSA9IDk7Ci0rCX0gZWxzZSBpZiAoYXBwRGF0YS5zdWJzYW1wTGV2ZWw9PVRWTkNfR1JBWSkgewotKwkJaSA9IDEwOwotKwl9IGVsc2UgewotKwkJcmV0dXJuOwotKwl9Ci0rCVh0VmFTZXRWYWx1ZXModHVyYm9CdXR0b25zW2ldLCBYdE5zdGF0ZSwgMSwgTlVMTCk7Ci0rI2VuZGlmCi0rfQotKwotK3ZvaWQKLStTaG93VHVyYm9WTkMoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCVVwZGF0ZVN1YnNhbXBCdXR0b25zKCk7IAotKwlVcGRhdGVRdWFsU2xpZGVyKCk7Ci0rCWlmIChhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCQlwb3B1cEZpeGVyKHR1cmJvdm5jVyk7Ci0rCX0gZWxzZSB7Ci0rCQlYdE1vdmVXaWRnZXQodHVyYm92bmNXLCBldmVudC0+eGJ1dHRvbi54X3Jvb3QsIGV2ZW50LT54YnV0dG9uLnlfcm9vdCk7Ci0rCQlYdFBvcHVwKHR1cmJvdm5jVywgWHRHcmFiTm9uZSk7Ci0rCX0KLSsJaWYgKGFwcERhdGEuZ3JhYkFsbCkgewotKwkJWFJhaXNlV2luZG93KGRweSwgWHRXaW5kb3codHVyYm92bmNXKSk7Ci0rCX0KLSsJWFNldFdNUHJvdG9jb2xzKGRweSwgWHRXaW5kb3codHVyYm92bmNXKSwgJndtRGVsZXRlV2luZG93LCAxKTsKLSsJWHRPdmVycmlkZVRyYW5zbGF0aW9ucyh0dXJib3ZuY1csIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlICgiPE1lc3NhZ2U+V01fUFJPVE9DT0xTOiBIaWRlVHVyYm9WTkMoKSIpKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStIaWRlVHVyYm9WTkMoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rICBYdFBvcGRvd24odHVyYm92bmNXKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStDcmVhdGVUdXJib1ZOQygpIHsKLSsJV2lkZ2V0IGJ1dHRvbkZvcm0sIGJ1dHRvbiwgcHJldkJ1dHRvbiA9IE5VTEw7Ci0rCVdpZGdldCBsYWJlbDsKLSsJaW50IGk7Ci0rCWNoYXIgYnV0dG9uTmFtZVszMl07Ci0rCVN0cmluZyBidXR0b25UeXBlOwotKwotKwl0dXJib3ZuY1cgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgidHVyYm9WTkMiLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLCB0b3BsZXZlbCwgTlVMTCk7Ci0rCi0rCWJ1dHRvbkZvcm0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiYnV0dG9uRm9ybSIsIGZvcm1XaWRnZXRDbGFzcywgdHVyYm92bmNXLCBOVUxMKTsKLSsKLSsJZm9yIChpID0gMDsgaSA8PSAxMjsgaSsrKSB7Ci0rCQlzcHJpbnRmKGJ1dHRvbk5hbWUsICJidXR0b24lZCIsIGkpOwotKyNpZm5kZWYgVFVSQk9WTkMKLSsJCWlmIChpID09IDApIHsKLSsJCQlzcHJpbnRmKGJ1dHRvbk5hbWUsICJidXR0b25Ob25lIik7Ci0rCQl9IGVsc2UgaWYgKGkgPiAwKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKyNlbmRpZgotKwkJWHRWYUdldFN1YnJlc291cmNlcyhidXR0b25Gb3JtLCAoWHRQb2ludGVyKSZidXR0b25UeXBlLCBidXR0b25OYW1lLAotKwkJCQkiQnV0dG9uIiwgcmVzb3VyY2VzLCAxLCBOVUxMKTsKLSsKLSsJCWJ1dHRvbiA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGJ1dHRvbk5hbWUsIHRvZ2dsZVdpZGdldENsYXNzLAotKwkJCQkJICAgICAgIGJ1dHRvbkZvcm0sIE5VTEwpOwotKwkJdHVyYm9CdXR0b25zW2ldID0gYnV0dG9uOwotKwkJWHRWYVNldFZhbHVlcyhidXR0b24sIFh0TmZyb21WZXJ0LCBwcmV2QnV0dG9uLAotKwkJCSAgICBYdE5sZWZ0LCBYYXdDaGFpbkxlZnQsIFh0TnJpZ2h0LCBYYXdDaGFpblJpZ2h0LCBOVUxMKTsKLSsJCXByZXZCdXR0b24gPSBidXR0b247Ci0rCX0KLSsKLSsJbGFiZWwgPSBYdENyZWF0ZU1hbmFnZWRXaWRnZXQoInF1YWxMYWJlbCIsIHRvZ2dsZVdpZGdldENsYXNzLCBidXR0b25Gb3JtLCBOVUxMLCAwKTsKLSsJWHRWYVNldFZhbHVlcyhsYWJlbCwgWHROZnJvbVZlcnQsIHByZXZCdXR0b24sIFh0TmxlZnQsIFhhd0NoYWluTGVmdCwgWHROcmlnaHQsIFhhd0NoYWluUmlnaHQsIE5VTEwpOwotKwotKwlxdWFsc2xpZGVyID0gWHRDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJxdWFsQmFyIiwgc2Nyb2xsYmFyV2lkZ2V0Q2xhc3MsIGJ1dHRvbkZvcm0sIE5VTEwsIDApOwotKwlYdFZhU2V0VmFsdWVzKHF1YWxzbGlkZXIsIFh0TmZyb21WZXJ0LCBsYWJlbCwgWHRObGVmdCwgWGF3Q2hhaW5MZWZ0LCBOVUxMKTsKLSsJWHRBZGRDYWxsYmFjayhxdWFsc2xpZGVyLCBYdE5zY3JvbGxQcm9jLCBxdWFsU2Nyb2xsUHJvYywgTlVMTCkgOwotKwlYdEFkZENhbGxiYWNrKHF1YWxzbGlkZXIsIFh0Tmp1bXBQcm9jLCBxdWFsSnVtcFByb2MsIE5VTEwpIDsKLSsKLSsJcXVhbHRleHQgPSBYdENyZWF0ZU1hbmFnZWRXaWRnZXQoInF1YWxUZXh0IiwgbGFiZWxXaWRnZXRDbGFzcywgYnV0dG9uRm9ybSwgTlVMTCwgMCk7Ci0rCVh0VmFTZXRWYWx1ZXMocXVhbHRleHQsIFh0TmZyb21WZXJ0LCBsYWJlbCwgWHROZnJvbUhvcml6LCBxdWFsc2xpZGVyLCBYdE5yaWdodCwgWGF3Q2hhaW5SaWdodCwgTlVMTCk7Ci0rfQotKwotK1dpZGdldCBxdWFsaXR5VzsKLSsKLSt2b2lkCi0rU2hvd1F1YWxpdHkoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rICBpZiAoYXBwRGF0YS5wb3B1cEZpeCkgewotKwlwb3B1cEZpeGVyKHF1YWxpdHlXKTsKLSsgIH0gZWxzZSB7Ci0rCVh0TW92ZVdpZGdldChxdWFsaXR5VywgZXZlbnQtPnhidXR0b24ueF9yb290LCBldmVudC0+eGJ1dHRvbi55X3Jvb3QpOwotKyAgCVh0UG9wdXAocXVhbGl0eVcsIFh0R3JhYk5vbmUpOwotKyAgfQotKyAgaWYgKGFwcERhdGEuZ3JhYkFsbCkgewotKyAgCVhSYWlzZVdpbmRvdyhkcHksIFh0V2luZG93KHF1YWxpdHlXKSk7Ci0rICB9Ci0rICBYU2V0V01Qcm90b2NvbHMoZHB5LCBYdFdpbmRvdyhxdWFsaXR5VyksICZ3bURlbGV0ZVdpbmRvdywgMSk7Ci0rICBYdE92ZXJyaWRlVHJhbnNsYXRpb25zKHF1YWxpdHlXLCBYdFBhcnNlVHJhbnNsYXRpb25UYWJsZSAoIjxNZXNzYWdlPldNX1BST1RPQ09MUzogSGlkZVF1YWxpdHkoKSIpKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStIaWRlUXVhbGl0eShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsgIFh0UG9wZG93bihxdWFsaXR5Vyk7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSsKLSt2b2lkCi0rQ3JlYXRlUXVhbGl0eSgpCi0rewotKyAgV2lkZ2V0IGJ1dHRvbkZvcm0sIGJ1dHRvbiwgcHJldkJ1dHRvbiA9IE5VTEw7Ci0rICBpbnQgaTsKLSsgIGNoYXIgYnV0dG9uTmFtZVszMl07Ci0rICBTdHJpbmcgYnV0dG9uVHlwZTsKLSsKLSsgIHF1YWxpdHlXID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoInF1YWxpdHkiLCB0cmFuc2llbnRTaGVsbFdpZGdldENsYXNzLCB0b3BsZXZlbCwKLSsJCQkgICAgICAgTlVMTCk7Ci0rCi0rICBidXR0b25Gb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImJ1dHRvbkZvcm0iLCBmb3JtV2lkZ2V0Q2xhc3MsIHF1YWxpdHlXLAotKwkJCQkgICAgICAgTlVMTCk7Ci0rCi0rICBmb3IgKGkgPSAtMTsgaSA8PSA5OyBpKyspIHsKLSsgICAgaWYgKGkgPCAwKSB7Ci0rCXNwcmludGYoYnV0dG9uTmFtZSwgImJ1dHRvbkQiKTsKLSsgICAgfSBlbHNlIHsKLSsJc3ByaW50ZihidXR0b25OYW1lLCAiYnV0dG9uJWQiLCBpKTsKLSsgICAgfQotKyAgICBYdFZhR2V0U3VicmVzb3VyY2VzKGJ1dHRvbkZvcm0sIChYdFBvaW50ZXIpJmJ1dHRvblR5cGUsIGJ1dHRvbk5hbWUsCi0rCQkJIkJ1dHRvbiIsIHJlc291cmNlcywgMSwgTlVMTCk7Ci0rCi0rICAgIGJ1dHRvbiA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGJ1dHRvbk5hbWUsIHRvZ2dsZVdpZGdldENsYXNzLAotIAkJCQkgICAgICAgYnV0dG9uRm9ybSwgTlVMTCk7Ci0tICAgICAgWHRWYVNldFZhbHVlcyhidXR0b24sIFh0TmZyb21WZXJ0LCBwcmV2QnV0dG9uLAotKyAgICBYdFZhU2V0VmFsdWVzKGJ1dHRvbiwgWHROZnJvbVZlcnQsIHByZXZCdXR0b24sCi0gCQkgICAgWHRObGVmdCwgWGF3Q2hhaW5MZWZ0LCBYdE5yaWdodCwgWGF3Q2hhaW5SaWdodCwgTlVMTCk7Ci0rICAgIHByZXZCdXR0b24gPSBidXR0b247Ci0rICB9Ci0rfQotKwotK1dpZGdldCBjb21wcmVzc1c7Ci0rCi0rdm9pZAotK1Nob3dDb21wcmVzcyhXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsgIGlmIChhcHBEYXRhLnBvcHVwRml4KSB7Ci0rCXBvcHVwRml4ZXIoY29tcHJlc3NXKTsKLSsgIH0gZWxzZSB7Ci0rCVh0TW92ZVdpZGdldChjb21wcmVzc1csIGV2ZW50LT54YnV0dG9uLnhfcm9vdCwgZXZlbnQtPnhidXR0b24ueV9yb290KTsKLSsgIAlYdFBvcHVwKGNvbXByZXNzVywgWHRHcmFiTm9uZSk7Ci0rICB9Ci0rICBpZiAoYXBwRGF0YS5ncmFiQWxsKSB7Ci0rICAJWFJhaXNlV2luZG93KGRweSwgWHRXaW5kb3coY29tcHJlc3NXKSk7Ci0rICB9Ci0rICBYU2V0V01Qcm90b2NvbHMoZHB5LCBYdFdpbmRvdyhjb21wcmVzc1cpLCAmd21EZWxldGVXaW5kb3csIDEpOwotKyAgWHRPdmVycmlkZVRyYW5zbGF0aW9ucyhjb21wcmVzc1csIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlICgiPE1lc3NhZ2U+V01fUFJPVE9DT0xTOiBIaWRlQ29tcHJlc3MoKSIpKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStIaWRlQ29tcHJlc3MoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rICBYdFBvcGRvd24oY29tcHJlc3NXKTsKLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotKwotK3ZvaWQKLStDcmVhdGVDb21wcmVzcygpCi0rewotKyAgV2lkZ2V0IGJ1dHRvbkZvcm0sIGJ1dHRvbiwgcHJldkJ1dHRvbiA9IE5VTEw7Ci0rICBpbnQgaTsKLSsgIGNoYXIgYnV0dG9uTmFtZVszMl07Ci0rICBTdHJpbmcgYnV0dG9uVHlwZTsKLSsKLSsgIGNvbXByZXNzVyA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJjb21wcmVzcyIsIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsIHRvcGxldmVsLAotKwkJCSAgICAgICBOVUxMKTsKLSsKLSsgIGJ1dHRvbkZvcm0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiYnV0dG9uRm9ybSIsIGZvcm1XaWRnZXRDbGFzcywgY29tcHJlc3NXLAotKwkJCQkgICAgICAgTlVMTCk7Ci0rCi0rICBmb3IgKGkgPSAtMTsgaSA8PSA5OyBpKyspIHsKLSsgICAgaWYgKGkgPCAwKSB7Ci0rCXNwcmludGYoYnV0dG9uTmFtZSwgImJ1dHRvbkQiKTsKLSAgICAgfSBlbHNlIHsKLS0gICAgICBmcHJpbnRmKHN0ZGVyciwidW5rbm93biBidXR0b24gdHlwZSAnJXMnXG4iLGJ1dHRvblR5cGUpOwotKwlzcHJpbnRmKGJ1dHRvbk5hbWUsICJidXR0b24lZCIsIGkpOwotICAgICB9Ci0rICAgIFh0VmFHZXRTdWJyZXNvdXJjZXMoYnV0dG9uRm9ybSwgKFh0UG9pbnRlcikmYnV0dG9uVHlwZSwgYnV0dG9uTmFtZSwKLSsJCQkiQnV0dG9uIiwgcmVzb3VyY2VzLCAxLCBOVUxMKTsKLSsKLSsgICAgYnV0dG9uID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoYnV0dG9uTmFtZSwgdG9nZ2xlV2lkZ2V0Q2xhc3MsCi0rCQkJCSAgICAgICBidXR0b25Gb3JtLCBOVUxMKTsKLSsgICAgWHRWYVNldFZhbHVlcyhidXR0b24sIFh0TmZyb21WZXJ0LCBwcmV2QnV0dG9uLAotKwkJICAgIFh0TmxlZnQsIFhhd0NoYWluTGVmdCwgWHROcmlnaHQsIFhhd0NoYWluUmlnaHQsIE5VTEwpOwotICAgICBwcmV2QnV0dG9uID0gYnV0dG9uOwotICAgfQotIH0KLSsKLSsKLStpbnQgZmlsZXhmZXJfc29jayA9IC0xOwotK2ludCBmaWxleGZlcl9saXN0ZW4gPSAtMTsKLSsKLSt2b2lkIEhpZGVGaWxlKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpIHsKLSsJaWYgKGZpbGV4ZmVyX3NvY2sgPj0gMCkgewotKwkJY2xvc2UoZmlsZXhmZXJfc29jayk7Ci0rCQlmaWxleGZlcl9zb2NrID0gLTE7Ci0rCX0KLSsJaWYgKGZpbGV4ZmVyX2xpc3RlbiA+PSAwKSB7Ci0rCQljbG9zZShmaWxleGZlcl9saXN0ZW4pOwotKwkJZmlsZXhmZXJfbGlzdGVuID0gLTE7Ci0rCX0KLSsJaWYgKHcgfHwgZXZlbnQgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK2V4dGVybiBpbnQgdXNlX2xvb3BiYWNrOwotK3RpbWVfdCBzdGFydF9saXN0ZW4gPSAwOwotK3BpZF90IGphdmFfaGVscGVyID0gMDsKLSsKLSt2b2lkIFNob3dGaWxlKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpIHsKLSsJaW50IGksIHBvcnQwID0gNzIwMCwgcG9ydCwgc29jayA9IC0xOwotKwljaGFyICpjbWQsICpqYXI7Ci0rCWNoYXIgZm10W10gPSAiamF2YSAtY3AgJyVzJyBWbmNWaWV3ZXIgSE9TVCBsb2NhbGhvc3QgUE9SVCAlZCBkZWxheUF1dGhQYW5lbCB5ZXMgaWdub3JlTVNMb2dvbkNoZWNrIHllcyBkaXNhYmxlU1NMIHllcyBmdHBPbmx5IHllcyBncmFmdEZ0cCB5ZXMgZHNtQWN0aXZlIG5vICAmIjsKLSsKLSsJaWYgKGdldGVudigiU1NWTkNfVUxUUkFfRlRQX0pBUiIpKSB7Ci0rCQlqYXIgPSBnZXRlbnYoIlNTVk5DX1VMVFJBX0ZUUF9KQVIiKTsKLSsJCWNtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oZm10KSArIHN0cmxlbihqYXIpICsgMTAwKTsKLSsJfSBlbHNlIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgVWx0cmFWTkMgRlRQIGphciBmaWxlLlxuIik7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJdXNlX2xvb3BiYWNrID0gMTsKLSsJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0rCQlwb3J0ID0gcG9ydDAgKyBpOwotKwkJc29jayA9IExpc3RlbkF0VGNwUG9ydChwb3J0KTsKLSsJCWlmIChzb2NrIDwgMCkgewotKwkJCXNvY2sgPSBMaXN0ZW5BdFRjcFBvcnQ2KHBvcnQpOwotKwkJfQotKwkJaWYgKHNvY2sgPj0gMCkgewotKwkJCWZwcmludGYoc3RkZXJyLCAibGlzdGVuaW5nIGZvciBmaWxleGZlciBvbiBwb3J0OiAlZCBzb2NrOiAlZFxuIiwgcG9ydCwgc29jayk7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsJdXNlX2xvb3BiYWNrID0gMDsKLSsKLSsJaWYgKHNvY2sgPj0gMCkgewotKwkJaW50IHN0OwotKwkJcGlkX3QgcGlkID0gZm9yaygpOwotKwkJaWYgKHBpZCA8IDApIHsKLSsJCQlmcmVlKGNtZCk7Ci0rCQkJcmV0dXJuOwotKwkJfSBlbHNlIGlmIChwaWQgPT0gMCkgewotKwkJCWludCBpOwotKwkJCXNwcmludGYoY21kLCBmbXQsIGphciwgcG9ydCk7Ci0rCQkJaWYgKGFwcERhdGEudWx0cmFEU00pIHsKLSsJCQkJY2hhciAqcSA9IHN0cnN0cihjbWQsICJkc21BY3RpdmUiKTsKLSsJCQkJaWYgKHEpIHsKLSsJCQkJCXEgPSBzdHJzdHIocSwgIm5vICIpOwotKwkJCQkJaWYgKHEpIHsKLSsJCQkJCQlxWzBdID0gJ3knOwotKwkJCQkJCXFbMV0gPSAnZSc7Ci0rCQkJCQkJcVsyXSA9ICdzJzsKLSsJCQkJCX0KLSsJCQkJfQotKwkJCX0KLSsJCQlmb3IgKGkgPSAzOyBpIDwgMTAwOyBpKyspIHsKLSsJCQkJY2xvc2UoaSk7Ci0rCQkJfQotKwkJCWZwcmludGYoc3RkZXJyLCAiXG4tLSBFeHBlcmltZW50YWwgVWx0cmFWTkMgRmlsZSBUcmFuc2ZlciAtLVxuXG5SdW5uaW5nIGNtZDpcblxuICAlc1xuXG4iLCBjbWQpOwotKwkJCXN5c3RlbShjbWQpOwotKwkJCWV4aXQoMCk7Ci0rCQl9Ci0rCQlmcHJpbnRmKHN0ZGVyciwgImphdmEgaGVscGVyIHBpZCBpczogJWRcbiIsIChpbnQpIHBpZCk7Ci0rCQl3YWl0cGlkKHBpZCwgJnN0LCAwKTsKLSsJCWphdmFfaGVscGVyID0gcGlkOwotKwkJc3RhcnRfbGlzdGVuID0gdGltZShOVUxMKTsKLSsJfQotKwlmcmVlKGNtZCk7Ci0rCWZpbGV4ZmVyX2xpc3RlbiA9IHNvY2s7Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLStXaWRnZXQgY2hhdCwgZW50cnksIHRleHQ7Ci0rCi0rc3RhdGljIGludCBjaGF0X3Zpc2libGUgPSAwOwotKwotK3ZvaWQKLStTaG93Q2hhdChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudGVybUNoYXQpIHsKLSsJCXJldHVybjsKLSsJfQotKwlpZiAoISBjaGF0X3Zpc2libGUpIHsKLSsJCVh0UG9wdXAoY2hhdCwgWHRHcmFiTm9uZSk7Ci0rCQljaGF0X3Zpc2libGUgPSAxOwotKwkJd21EZWxldGVXaW5kb3cgPSBYSW50ZXJuQXRvbShkcHksICJXTV9ERUxFVEVfV0lORE9XIiwgRmFsc2UpOwotKwkJWFNldFdNUHJvdG9jb2xzKGRweSwgWHRXaW5kb3coY2hhdCksICZ3bURlbGV0ZVdpbmRvdywgMSk7Ci0rCQlpZiAoYXBwRGF0YS5jaGF0T25seSkgewotKwkJCVh0T3ZlcnJpZGVUcmFuc2xhdGlvbnMoY2hhdCwgWHRQYXJzZVRyYW5zbGF0aW9uVGFibGUgKCI8TWVzc2FnZT5XTV9QUk9UT0NPTFM6IFF1aXQoKSIpKTsKLSsJCX0gZWxzZSB7Ci0rCQkJWHRPdmVycmlkZVRyYW5zbGF0aW9ucyhjaGF0LCBYdFBhcnNlVHJhbnNsYXRpb25UYWJsZSAoIjxNZXNzYWdlPldNX1BST1RPQ09MUzogSGlkZUNoYXQoKSIpKTsKLSsJCX0KLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJdXNsZWVwKDIwMCAqIDEwMDApOwotKwl9Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkIGhpZGVjaGF0KHZvaWQpIHsKLSsJYXBwRGF0YS5jaGF0QWN0aXZlID0gRmFsc2U7Ci0rCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsJaWYgKGNoYXRfdmlzaWJsZSkgewotKwkJWHRQb3Bkb3duKGNoYXQpOwotKwkJY2hhdF92aXNpYmxlID0gMDsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJdXNsZWVwKDIwMCAqIDEwMDApOwotKwl9Ci0rCWlmIChhcHBEYXRhLmNoYXRPbmx5KSB7Ci0rCQlRdWl0KDAsIE5VTEwsIE5VTEwsIE5VTEwpOwotKwl9Ci0rfQotKwotK3ZvaWQgSGlkZUNoYXQoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykgewotKwlTZW5kVGV4dENoYXRDbG9zZSgpOwotKwlTZW5kVGV4dENoYXRGaW5pc2hlZCgpOwotKwloaWRlY2hhdCgpOwotKwlpZiAodyB8fCBldmVudCB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZCBkaXNtaXNzX3Byb2MoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWHRQb2ludGVyIGNhbGxfZGF0YSkgewotKwlTZW5kVGV4dENoYXRDbG9zZSgpOwotKwlTZW5kVGV4dENoYXRGaW5pc2hlZCgpOwotKwloaWRlY2hhdCgpOwotKwlpZiAodyB8fCBjbGllbnRfZGF0YSB8fCBjYWxsX2RhdGEpIHt9Ci0rfQotKwotK2V4dGVybiB2b2lkIHByaW50Q2hhdChjaGFyICosIEJvb2wpOwotKwotK3N0YXRpYyB2b2lkIENoYXRUZXh0Q2FsbGJhY2soWHRQb2ludGVyIGNsaWVudERhdGEsIFh0SW50ZXJ2YWxJZCAqaWQpOwotK3N0YXRpYyBYdEludGVydmFsSWQgdGltZXI7Ci0rc3RhdGljIEJvb2wgdGltZXJTZXQgPSBGYWxzZTsKLSsKLSt2b2lkIENoZWNrVGV4dElucHV0KHZvaWQpOwotK2V4dGVybiBkb3VibGUgc3RhcnRfdGltZTsKLSsKLStzdGF0aWMgdm9pZCBDaGF0VGV4dENhbGxiYWNrKFh0UG9pbnRlciBjbGllbnREYXRhLCBYdEludGVydmFsSWQgKmlkKSB7Ci0rCXN0YXRpYyBpbnQgZGIgPSAtMTsKLSsJaWYgKGRiIDwgMCkgewotKwkJaWYgKGdldGVudigiU1NWTkNfREVCVUdfQ0hBVCIpKSB7Ci0rCQkJZGIgPSAxOwotKwkJfSBlbHNlIHsKLSsJCQlkYiA9IDA7Ci0rCQl9Ci0rCX0KLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkNoYXRUZXh0Q2FsbGJhY2s6ICUuNGZcbiIsIGRub3coKSAtIHN0YXJ0X3RpbWUpOwotKwlDaGVja1RleHRJbnB1dCgpOwotKwlpZiAoY2xpZW50RGF0YSB8fCBpZCkge30KLSt9Ci0rCi0rdm9pZCBDaGVja1RleHRJbnB1dCh2b2lkKSB7Ci0rCUFyZyBhcmdzWzJdOwotKwlTdHJpbmcgc3RyOwotKwlpbnQgbGVuOwotKwlzdGF0aWMgaW50IGRiID0gLTE7Ci0rCi0rCWlmICh0aW1lclNldCkgewotKwkJWHRSZW1vdmVUaW1lT3V0KHRpbWVyKTsKLSsJCXRpbWVyU2V0ID0gRmFsc2U7Ci0rCX0KLSsJaWYgKGFwcERhdGEuY2hhdEFjdGl2ZSkgewotKwkJdGltZXIgPSBYdEFwcEFkZFRpbWVPdXQoYXBwQ29udGV4dCwgMzMzLCBDaGF0VGV4dENhbGxiYWNrLCBOVUxMKTsKLSsJCXRpbWVyU2V0ID0gVHJ1ZTsKLSsJfQotKwlpZiAoYXBwRGF0YS5jaGF0T25seSAmJiAhYXBwRGF0YS5jaGF0QWN0aXZlKSB7Ci0rCQlRdWl0KDAsIE5VTEwsIE5VTEwsIE5VTEwpOwotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsjaWYgMAotKwlpZiAoIWFwcERhdGEuY2hhdEFjdGl2ZSkgewotKwkJcmV0dXJuOwotKwl9Ci0rI2VuZGlmCi0rCi0rCWlmIChkYiA8IDApIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX0RFQlVHX0NIQVQiKSkgewotKwkJCWRiID0gMTsKLSsJCX0gZWxzZSB7Ci0rCQkJZGIgPSAwOwotKwkJfQotKwl9Ci0rCi0rCVh0U2V0QXJnKGFyZ3NbMF0sIFh0TnN0cmluZywgJnN0cik7Ci0rCVh0R2V0VmFsdWVzKGVudHJ5LCBhcmdzLCAxKTsKLSsKLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkNoZWNrVGV4dElucHV0XG4iKTsKLSsKLSsJaWYgKHN0ciA9PSBOVUxMIHx8IHN0clswXSA9PSAnXDAnKSB7Ci0rCQlyZXR1cm47Ci0rCX0gZWxzZSB7Ci0rCQljaGFyICpxOwotKwkJbGVuID0gc3RybGVuKHN0cik7Ci0rCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tUZXh0SW5wdXQ6IGxlbjogJWQgICclcydcbiIsIGxlbiwgc3RyKTsKLSsJCWlmIChsZW4gPD0gMCkgewotKwkJCXJldHVybjsKLSsJCX0KLSsJCXEgPSBzdHJyY2hyKHN0ciwgJ1xuJyk7IAotKwkJaWYgKHEpIHsKLSsJCQljaGFyICpzZW5kLCBzYXZlWzJdOwotKwkJCXNhdmVbMF0gPSAqKHErMSk7Ci0rCQkJKihxKzEpID0gJ1wwJzsKLSsJCQlzZW5kID0gc3RyZHVwKHN0cik7Ci0rCQkJKihxKzEpID0gc2F2ZVswXTsKLSsJCQlpZiAoc2VuZCkgewotKwkJCQlTZW5kVGV4dENoYXQoc2VuZCk7Ci0rCQkJCXByaW50Q2hhdCgiU2VuZDogIiwgVHJ1ZSk7Ci0rCQkJCXByaW50Q2hhdChzZW5kLCBUcnVlKTsKLSsJCQkJZnJlZShzZW5kKTsKLSsJCQkJaWYgKHNhdmVbMF0gPT0gJ1wwJykgewotKwkJCQkJWHRWYVNldFZhbHVlcyhlbnRyeSwgWHROdHlwZSwgWGF3QXNjaWlTdHJpbmcsIFh0TnN0cmluZywgIiIsIE5VTEwpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJY2hhciAqbGVhayA9IHN0cmR1cChxKzEpOwotKwkJCQkJWHRWYVNldFZhbHVlcyhlbnRyeSwgWHROdHlwZSwgWGF3QXNjaWlTdHJpbmcsIFh0TnN0cmluZywgbGVhaywgTlVMTCk7Ci0rCQkJCQlpZiAoc3RybGVuKGxlYWspID4gMCkgewotKwkJCQkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJCQkJCVh0VmFTZXRWYWx1ZXMoZW50cnksIFh0Tmluc2VydFBvc2l0aW9uLCBzdHJsZW4obGVhayksIE5VTEwpOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJfQotKwkJfQotKwl9Ci0rfQotKwotK3ZvaWQgQXBwZW5kQ2hhdElucHV0MChjaGFyICppbikgewotKwlBcmcgYXJnc1sxMF07Ci0rCWludCBuOwotKwlTdHJpbmcgc3RyOwotKwlpbnQgbGVuOwotKwlzdGF0aWMgY2hhciAqcyA9IE5VTEw7Ci0rCXN0YXRpYyBpbnQgc2xlbiA9IC0xOwotKwlYYXdUZXh0UG9zaXRpb24gcG9zOwotKwotKwlmcHJpbnRmKHN0ZGVyciwgIkFwcGVuZENoYXRJbnB1dDogaW49ICclcydcbiIsIGluKTsKLSsKLSsJWHRTZXRBcmcoYXJnc1swXSwgWHROc3RyaW5nLCAmc3RyKTsKLSsJWHRHZXRWYWx1ZXModGV4dCwgYXJncywgMSk7Ci0rCWZwcmludGYoc3RkZXJyLCAiQXBwZW5kQ2hhdElucHV0OiBzdHI9JyVzJ1xuIiwgc3RyKTsKLSsJCi0rCWxlbiA9IHN0cmxlbihzdHIpICsgc3RybGVuKGluKTsKLSsKLSsJaWYgKHNsZW4gPD0gbGVuKSB7Ci0rCQlzbGVuID0gMiAqIChsZW4gKyAxMCk7Ci0rCQlpZiAocykgZnJlZShzKTsKLSsJCXMgPSAoY2hhciAqKSBtYWxsb2Moc2xlbisxKTsKLSsJfQotKwkKLSsJc1swXSA9ICdcMCc7Ci0rCXN0cmNhdChzLCBzdHIpOwotKwlzdHJjYXQocywgaW4pOwotKwlmcHJpbnRmKHN0ZGVyciwgIkFwcGVuZENoYXRJbnB1dCBzPSAgJyVzJ1xuIiwgcyk7Ci0rCXBvcyA9IChYYXdUZXh0UG9zaXRpb24pIChsZW4tMSk7Ci0rCW4gPSAwOwotKwlYdFNldEFyZyhhcmdzW25dLCBYdE50eXBlLCBYYXdBc2NpaVN0cmluZyk7CW4rKzsKLSsJWHRTZXRBcmcoYXJnc1tuXSwgWHROc3RyaW5nLCBzKTsJCW4rKzsKLSsJWHRTZXRBcmcoYXJnc1tuXSwgWHROZGlzcGxheVBvc2l0aW9uLCBwb3MpOwluKys7Ci0rCVh0U2V0QXJnKGFyZ3Nbbl0sIFh0Tmluc2VydFBvc2l0aW9uLCBwb3MpOwluKys7Ci0rCVh0U2V0VmFsdWVzKHRleHQsIGFyZ3MsIG4pOwotKwlmcHJpbnRmKHN0ZGVyciwgIkFwcGVuZENoYXRJbnB1dCBkb25lXG4iKTsKLSt9Ci0rCi0rdm9pZCBBcHBlbmRDaGF0SW5wdXQoY2hhciAqaW4pIHsKLSsJWGF3VGV4dFBvc2l0aW9uIGJlZywgZW5kOwotKwlzdGF0aWMgWGF3VGV4dFBvc2l0aW9uIHBvcyA9IDA7Ci0rCVhhd1RleHRCbG9jayB0eHQ7Ci0rCi0rCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQlyZXR1cm47Ci0rCX0KLSsKLSsJWGF3VGV4dFNldEluc2VydGlvblBvaW50KHRleHQsIHBvcyk7Ci0rCWJlZyA9IFhhd1RleHRHZXRJbnNlcnRpb25Qb2ludCh0ZXh0KTsKLSsJZW5kID0gYmVnOwotKyNpZiAwCi0rCWZwcmludGYoc3RkZXJyLCAiQXBwZW5kQ2hhdElucHV0OiBwb3M9JWQgaW49ICclcydcbiIsIGJlZywgaW4pOwotKyNlbmRpZgotKwotKwl0eHQuZmlyc3RQb3MgPSAwOwotKwl0eHQubGVuZ3RoID0gc3RybGVuKGluKTsKLSsJdHh0LnB0ciA9IGluOwotKwl0eHQuZm9ybWF0ID0gRk1UOEJJVDsKLSsKLSsJWGF3VGV4dFJlcGxhY2UodGV4dCwgYmVnLCBlbmQsICZ0eHQpOwotKwlYYXdUZXh0U2V0SW5zZXJ0aW9uUG9pbnQodGV4dCwgYmVnICsgdHh0Lmxlbmd0aCk7Ci0rCi0rCXBvcyA9IFhhd1RleHRHZXRJbnNlcnRpb25Qb2ludCh0ZXh0KTsKLSsjaWYgMAotKwlmcHJpbnRmKHN0ZGVyciwgIkFwcGVuZENoYXRJbnB1dCBkb25lIHBvcz0lZFxuIiwgcG9zKTsKLSsjZW5kaWYKLSt9Ci0rCi0rI2lmIDAKLStzdGF0aWMgY2hhciBlcnJvcmJ1ZlsxXSA9IHswfTsKLSsjZW5kaWYKLSsKLSt2b2lkIENyZWF0ZUNoYXQodm9pZCkgewotKwotKwlXaWRnZXQgbXlmb3JtLCBkaXNtaXNzOwotKwlEaW1lbnNpb24gdyA9IDQwMCwgaCA9IDMwMDsKLSsKLSsJY2hhdCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJjaGF0IiwgdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzLCB0b3BsZXZlbCwgWHRObWFwcGVkV2hlbk1hbmFnZWQsIEZhbHNlLCBOVUxMKTsKLSsKLSsJbXlmb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoIm15Zm9ybSIsIGZvcm1XaWRnZXRDbGFzcywgY2hhdCwgTlVMTCk7Ci0rCi0rCXRleHQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgidGV4dCIsIGFzY2lpVGV4dFdpZGdldENsYXNzLCBteWZvcm0sCi0rCSAgICBYdE5yZXNpemUsIFhhd3RleHRSZXNpemVCb3RoLCBYdE5yZXNpemFibGUsIFRydWUsIFh0TndyYXAsIFhhd3RleHRXcmFwV29yZCwKLSsJICAgIFh0TnNjcm9sbEhvcml6b250YWwsIFhhd3RleHRTY3JvbGxOZXZlciwgWHROc2Nyb2xsVmVydGljYWwsIFhhd3RleHRTY3JvbGxBbHdheXMsCi0rCSAgICBYdE53aWR0aCwgdywgWHROaGVpZ2h0LCBoLCBYdE5kaXNwbGF5Q2FyZXQsIEZhbHNlLAotKwkgICAgWHROZWRpdFR5cGUsIFhhd3RleHRBcHBlbmQsIFh0TnR5cGUsIFhhd0FzY2lpU3RyaW5nLAotKwkgICAgWHROdXNlU3RyaW5nSW5QbGFjZSwgRmFsc2UsIE5VTEwpOwotKwotKwllbnRyeSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJlbnRyeSIsIGFzY2lpVGV4dFdpZGdldENsYXNzLCBteWZvcm0sCi0rCSAgICBYdE5yZXNpemUsIFhhd3RleHRSZXNpemVXaWR0aCwgWHROcmVzaXphYmxlLCBUcnVlLCBYdE53cmFwLCBYYXd0ZXh0V3JhcE5ldmVyLAotKwkgICAgWHROc2Nyb2xsSG9yaXpvbnRhbCwgWGF3dGV4dFNjcm9sbE5ldmVyLCBYdE5zY3JvbGxWZXJ0aWNhbCwgWGF3dGV4dFNjcm9sbE5ldmVyLAotKwkgICAgWHROaGVpZ2h0LCAyMCwgWHROd2lkdGgsIDQwMCwgWHROZnJvbVZlcnQsIHRleHQsIFh0TmVkaXRUeXBlLCBYYXd0ZXh0RWRpdCwKLSsJICAgIFh0TmRpc3BsYXlDYXJldCwgVHJ1ZSwgWHROZWRpdFR5cGUsIFhhd3RleHRFZGl0LCBOVUxMKTsKLSsKLSsJZGlzbWlzcyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaXNtaXNzIiwgY29tbWFuZFdpZGdldENsYXNzLCBteWZvcm0sIFh0TmxhYmVsLCAiQ2xvc2UgQ2hhdCIsIFh0TmZyb21WZXJ0LCBlbnRyeSwgTlVMTCk7Ci0rCi0rCUFwcGVuZENoYXRJbnB1dCgiIik7Ci0rCi0rCVh0QWRkQ2FsbGJhY2soZGlzbWlzcywgWHROY2FsbGJhY2ssIGRpc21pc3NfcHJvYywgTlVMTCk7Ci0rCi0rCVh0UmVhbGl6ZVdpZGdldChjaGF0KTsKLSsKLSsJWHRTZXRLZXlib2FyZEZvY3VzKGNoYXQsIGVudHJ5KTsgCi0rfQotKwotK1dpZGdldCBtc2d3aW4sIG1zZ3RleHQ7Ci0rCi0rdm9pZCBBcHBlbmRNc2coY2hhciAqaW4pIHsKLSsJWGF3VGV4dFBvc2l0aW9uIGJlZywgZW5kOwotKwlzdGF0aWMgWGF3VGV4dFBvc2l0aW9uIHBvcyA9IDA7Ci0rCVhhd1RleHRCbG9jayB0eHQ7Ci0rCi0rCVhhd1RleHRTZXRJbnNlcnRpb25Qb2ludChtc2d0ZXh0LCBwb3MpOwotKwliZWcgPSBYYXdUZXh0R2V0SW5zZXJ0aW9uUG9pbnQobXNndGV4dCk7Ci0rCWVuZCA9IGJlZzsKLSsKLSsJdHh0LmZpcnN0UG9zID0gMDsKLSsJdHh0Lmxlbmd0aCA9IHN0cmxlbihpbik7Ci0rCXR4dC5wdHIgPSBpbjsKLSsJdHh0LmZvcm1hdCA9IEZNVDhCSVQ7Ci0rCi0rCVhhd1RleHRSZXBsYWNlKG1zZ3RleHQsIGJlZywgZW5kLCAmdHh0KTsKLSsJWGF3VGV4dFNldEluc2VydGlvblBvaW50KG1zZ3RleHQsIGJlZyArIHR4dC5sZW5ndGgpOwotKwotKwlwb3MgPSBYYXdUZXh0R2V0SW5zZXJ0aW9uUG9pbnQobXNndGV4dCk7Ci0rfQotKwotK3N0YXRpYyBpbnQgbXNnX3Zpc2libGUgPSAwOwotK3N0YXRpYyBpbnQgbXNnX05PX2NsaWNrZWQgPSAwOwotKwotK3ZvaWQgbXNnX2Rpc21pc3NfcHJvYyhXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYdFBvaW50ZXIgY2FsbF9kYXRhKSB7Ci0rCVh0UG9wZG93bihtc2d3aW4pOwotKwltc2dfdmlzaWJsZSA9IDA7Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotKwl1c2xlZXAoMjAwICogMTAwMCk7Ci0rCWlmICh3IHx8IGNsaWVudF9kYXRhIHx8IGNhbGxfZGF0YSkge30KLSt9Ci0rCi0rdm9pZCBtc2dfTk9fcHJvYyhXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYdFBvaW50ZXIgY2FsbF9kYXRhKSB7Ci0rCVh0UG9wZG93bihtc2d3aW4pOwotKwltc2dfdmlzaWJsZSA9IDA7Ci0rCW1zZ19OT19jbGlja2VkID0gMTsKLSsJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCXVzbGVlcCgyMDAgKiAxMDAwKTsKLSsJaWYgKHcgfHwgY2xpZW50X2RhdGEgfHwgY2FsbF9kYXRhKSB7fQotK30KLSsKLStpbnQgQ3JlYXRlTXNnKGNoYXIgKm1zZywgaW50IHdhaXQpIHsKLSsKLSsJV2lkZ2V0IG15Zm9ybSwgZGlzbWlzcywgcmVqZWN0OwotKwljaGFyICpwOwotKwlpbnQgbiwgcnVuLCB3bWF4ID0gMDsKLSsJaW50IHJldCA9IDE7Ci0rCURpbWVuc2lvbiB3LCBoOwotKwotKwotKwluID0gMDsKLSsJcnVuID0gMDsKLSsJcCA9IG1zZzsKLSsJd2hpbGUgKCpwICE9ICdcMCcpIHsKLSsJCWlmICgqcCA9PSAnXG4nKSB7Ci0rCQkJcnVuID0gMDsKLSsJCQluKys7Ci0rCQl9Ci0rCQlydW4rKzsKLSsJCWlmIChydW4gPiB3bWF4KSB3bWF4ID0gcnVuOwotKwkJcCsrOwotKwl9Ci0rCWlmICh3bWF4ID4gODApIHsKLSsJCWlmICh3bWF4ID4gMTIwKSBuKys7Ci0rCQlpZiAod21heCA+IDgwKSBuKys7Ci0rCQl3bWF4ID0gODA7Ci0rCX0KLSsJaCA9IChEaW1lbnNpb24pIChuKzIpICogMTQ7Ci0rCXcgPSAoRGltZW5zaW9uKSAod21heCsxMCkgKiA4OwotKwotKwltc2d3aW4gPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgiTWVzc2FnZSIsIHRvcExldmVsU2hlbGxXaWRnZXRDbGFzcywgdG9wbGV2ZWwsIFh0Tm1hcHBlZFdoZW5NYW5hZ2VkLCBGYWxzZSwgTlVMTCk7Ci0rCi0rCW15Zm9ybSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJteWZvcm0iLCBmb3JtV2lkZ2V0Q2xhc3MsIG1zZ3dpbiwgTlVMTCk7Ci0rCi0rCW1zZ3RleHQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgibXNndGV4dCIsIGFzY2lpVGV4dFdpZGdldENsYXNzLCBteWZvcm0sCi0rCSAgICBYdE5yZXNpemUsIFhhd3RleHRSZXNpemVCb3RoLCBYdE5yZXNpemFibGUsIFRydWUsIFh0TndyYXAsIFhhd3RleHRXcmFwV29yZCwKLSsJICAgIFh0TnNjcm9sbEhvcml6b250YWwsIFhhd3RleHRTY3JvbGxOZXZlciwgWHROc2Nyb2xsVmVydGljYWwsIFhhd3RleHRTY3JvbGxBbHdheXMsCi0rCSAgICBYdE53aWR0aCwgdywgWHROaGVpZ2h0LCBoLCBYdE5kaXNwbGF5Q2FyZXQsIEZhbHNlLAotKwkgICAgWHROZWRpdFR5cGUsIFhhd3RleHRBcHBlbmQsIFh0TnR5cGUsIFhhd0FzY2lpU3RyaW5nLAotKwkgICAgWHROdXNlU3RyaW5nSW5QbGFjZSwgRmFsc2UsIE5VTEwpOwotKwotKwlpZiAod2FpdCA9PSAyKSB7Ci0rCQltc2dfTk9fY2xpY2tlZCA9IDA7Ci0rCi0rCQlkaXNtaXNzID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpc21pc3MiLCBjb21tYW5kV2lkZ2V0Q2xhc3MsIG15Zm9ybSwgWHRObGFiZWwsICJBY2NlcHQiLCBYdE5mcm9tVmVydCwgbXNndGV4dCwgTlVMTCk7Ci0rCQlYdEFkZENhbGxiYWNrKGRpc21pc3MsIFh0TmNhbGxiYWNrLCBtc2dfZGlzbWlzc19wcm9jLCBOVUxMKTsKLSsKLSsJCXJlamVjdCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJyZWplY3QiLCBjb21tYW5kV2lkZ2V0Q2xhc3MsIG15Zm9ybSwgWHRObGFiZWwsICJSZWplY3QiLCBYdE5mcm9tVmVydCwgZGlzbWlzcywgTlVMTCk7Ci0rCQlYdEFkZENhbGxiYWNrKHJlamVjdCwgWHROY2FsbGJhY2ssIG1zZ19OT19wcm9jLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCWRpc21pc3MgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlzbWlzcyIsIGNvbW1hbmRXaWRnZXRDbGFzcywgbXlmb3JtLCBYdE5sYWJlbCwgIk9LIiwgWHROZnJvbVZlcnQsIG1zZ3RleHQsIE5VTEwpOwotKwkJWHRBZGRDYWxsYmFjayhkaXNtaXNzLCBYdE5jYWxsYmFjaywgbXNnX2Rpc21pc3NfcHJvYywgTlVMTCk7Ci0rCQkKLSsJfQotKwotKwlBcHBlbmRNc2coIiIpOwotKwlBcHBlbmRNc2cobXNnKTsKLSsKLSsJWHRSZWFsaXplV2lkZ2V0KG1zZ3dpbik7Ci0rCi0rCVh0UG9wdXAobXNnd2luLCBYdEdyYWJOb25lKTsKLSsKLSsJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCW1zZ192aXNpYmxlID0gMTsKLSsJd2hpbGUgKHdhaXQgJiYgbXNnX3Zpc2libGUpIHsKLSsJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIm12OiAlZFxuIiwgbXNnX3Zpc2libGUpOwotKwkJWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0rCX0KLSsJaWYgKHdhaXQgPT0gMikgewotKwkJaWYgKG1zZ19OT19jbGlja2VkKSB7Ci0rCQkJcmV0ID0gMDsKLSsJCX0gZWxzZSB7Ci0rCQkJcmV0ID0gMTsKLSsJCX0KLSsJfQotKwlyZXR1cm4gcmV0OwotK30KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3BvcHVwX2FkIHZuY191bml4c3JjL3ZuY3ZpZXdlci9wb3B1cF9hZAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3BvcHVwX2FkCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3BvcHVwX2FkCTIwMDgtMDItMTcgMTM6MzI6MzQuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMCwwICsxLDIwIEBACi0rIyEvdXNyL2Jpbi9wZXJsCi0rCi0rJG9rID0gMDsKLSsKLStvcGVuKEEsICI8YXJnc3Jlc291cmNlcy5jIikgfHwgZGllOwotKwotK3doaWxlICg8QT4pIHsKLSsJaWYgKC9wb3B1cEJ1dHRvbkNvdW50Oi8pIHsKLSsJCSRvbiA9IDE7Ci0rCX0gZWxzaWYgKC9eXHMqTlVMTC8pIHsKLSsJCSRvbiA9IDA7Ci0rCX0KLSsJbmV4dCB1bmxlc3MgJG9uOwotKwljaG9tcDsKLSsJbGFzdCBpZiAvTlVMTC87Ci0rCSRfID1+IHMvXlxzKiIvLzsKLSsJJF8gPX4gcy8iLC8vOwotKwkkXyAuPSAiXG4iIHVubGVzcyAkXyA9fiAvXG4vOwotKwlwcmludDsKLSt9Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9yZmJwcm90by5jIHZuY191bml4c3JjL3ZuY3ZpZXdlci9yZmJwcm90by5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvcmZicHJvdG8uYwkyMDA4LTA5LTA1IDE5OjUxOjI0LjAwMDAwMDAwMCAtMDQwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9yZmJwcm90by5jCTIwMTAtMDQtMTcgMjI6MzQ6MzguMDAwMDAwMDAwIC0wNDAwCi1AQCAtMjMsNyArMjMsMTAgQEAKLSAgKiByZmJwcm90by5jIC0gZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBjbGllbnQgc2lkZSBvZiBSRkIgcHJvdG9jb2wuCi0gICovCi0gCi0rI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0gI2luY2x1ZGUgPHVuaXN0ZC5oPgotKyNpbmNsdWRlIDx0aW1lLmg+Ci0rI2luY2x1ZGUgPGN0eXBlLmg+Ci0gI2luY2x1ZGUgPGVycm5vLmg+Ci0gI2luY2x1ZGUgPHB3ZC5oPgotICNpbmNsdWRlIDx2bmN2aWV3ZXIuaD4KLUBAIC0zMSw2ICszNCw5IEBACi0gI2luY2x1ZGUgPHpsaWIuaD4KLSAjaW5jbHVkZSA8anBlZ2xpYi5oPgotIAotK2ludCBzZXJ2ZXJfbWFqb3IgPSAwLCBzZXJ2ZXJfbWlub3IgPSAwOwotK2ludCB2aWV3ZXJfbWFqb3IgPSAwLCB2aWV3ZXJfbWlub3IgPSAwOwotKwotIHN0YXRpYyB2b2lkIEluaXRDYXBhYmlsaXRpZXModm9pZCk7Ci0gc3RhdGljIEJvb2wgU2V0dXBUdW5uZWxpbmcodm9pZCk7Ci0gc3RhdGljIGludCBSZWFkU2VjdXJpdHlUeXBlKHZvaWQpOwotQEAgLTU3LDYgKzYzLDQ3IEBACi0gc3RhdGljIEJvb2wgSGFuZGxlVGlnaHQxNihpbnQgcngsIGludCByeSwgaW50IHJ3LCBpbnQgcmgpOwotIHN0YXRpYyBCb29sIEhhbmRsZVRpZ2h0MzIoaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKTsKLSAKLSsvKiBydW5nZSBhZGQgenJsZSAqLwotK3N0YXRpYyBCb29sIEhhbmRsZVpSTEU4KGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIEJvb2wgSGFuZGxlWlJMRTE1KGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIEJvb2wgSGFuZGxlWlJMRTE2KGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIEJvb2wgSGFuZGxlWlJMRTI0KGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIEJvb2wgSGFuZGxlWlJMRTI0VXAoaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKTsKLStzdGF0aWMgQm9vbCBIYW5kbGVaUkxFMjREb3duKGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIEJvb2wgSGFuZGxlWlJMRTMyKGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCk7Ci0rCi0rZXh0ZXJuIEJvb2wgSGFuZGxlQ3Vyc29yUG9zKGludCB4LCBpbnQgeSk7Ci0rZXh0ZXJuIHZvaWQgcHJpbnRDaGF0KGNoYXIgKiwgQm9vbCk7Ci0rCi0rdHlwZWRlZiBzdHJ1Y3QgewotKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSt9IHJmYlpSTEVIZWFkZXI7Ci0rCi0rI2RlZmluZSBzel9yZmJaUkxFSGVhZGVyIDQKLSsKLSsjZGVmaW5lIHJmYlpSTEVUaWxlV2lkdGggNjQKLSsjZGVmaW5lIHJmYlpSTEVUaWxlSGVpZ2h0IDY0Ci0rCi0rI2RlZmluZSBET19aWVdSTEUgMQotKwotKyNpZiBET19aWVdSTEUKLSsKLSsjaWZuZGVmIFpSTEVfT05DRQotKyNkZWZpbmUgWlJMRV9PTkNFCi0rCi0rc3RhdGljIGNvbnN0IGludCBiaXRzUGVyUGFja2VkUGl4ZWxbXSA9IHsKLSsgIDAsIDEsIDIsIDIsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQKLSt9OwotKwotK2ludCB6eXdybGVfbGV2ZWw7Ci0raW50IHp5d3JsZUJ1ZltyZmJaUkxFVGlsZVdpZHRoKnJmYlpSTEVUaWxlSGVpZ2h0XTsKLSsKLSsjaW5jbHVkZSAienJsZXBhbGV0dGVoZWxwZXIuaCIKLStzdGF0aWMgenJsZVBhbGV0dGVIZWxwZXIgcGFsZXR0ZUhlbHBlcjsKLSsKLSsjZW5kaWYgLyogWlJMRV9PTkNFICovCi0rI2VuZGlmIC8qIERPX1pZV1JMRSAqLwotKwotIHN0YXRpYyB2b2lkIFJlYWRDb25uRmFpbGVkUmVhc29uKHZvaWQpOwotIHN0YXRpYyBsb25nIFJlYWRDb21wYWN0TGVuICh2b2lkKTsKLSAKLUBAIC02Nyw2ICsxMTQsMjUgQEAKLSBzdGF0aWMgdm9pZCBKcGVnU2V0U3JjTWFuYWdlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBDQVJEOCAqY29tcHJlc3NlZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXByZXNzZWRMZW4pOwotIAotK2V4dGVybiB2b2lkIGRlc2tleSh1bnNpZ25lZCBjaGFyICosIGludCk7Ci0rZXh0ZXJuIHZvaWQgZGVzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKLSsKLStleHRlcm4gaW50IGN1cnJlbnRNc2c7Ci0rZXh0ZXJuIGRvdWJsZSBzY2FsZV9mYWN0b3JfeDsKLStleHRlcm4gZG91YmxlIHNjYWxlX2ZhY3Rvcl95OwotKwotK2V4dGVybiBpbnQgc2tpcF9tYXliZV9zeW5jOwotKwotK2ludCBzZW50X0ZCVSA9IDA7Ci0raW50IHNraXBfWHRVcGRhdGUgPSAwOwotK2ludCBza2lwX1h0VXBkYXRlQWxsID0gMDsKLSsKLStzdGF0aWMgZG91YmxlIGR0X291dCA9IDAuMDsKLStzdGF0aWMgZG91YmxlIGR0X291dF9zYyA9IDAuMDsKLStkb3VibGUgbGF0ZW5jeSA9IDAuMDsKLStkb3VibGUgY29ubmVjdF90aW1lID0gMC4wOwotKwotK3ZvaWQgcmFpc2VtZShpbnQgZm9yY2UpOwotIAotIGludCByZmJzb2NrOwotIGNoYXIgKmRlc2t0b3BOYW1lOwotQEAgLTc1LDYgKzE0MSwxNCBAQAotIGNoYXIgKnNlcnZlckN1dFRleHQgPSBOVUxMOwotIEJvb2wgbmV3U2VydmVyQ3V0VGV4dCA9IEZhbHNlOwotIAotKy8qIHVsdHJhdm5jIG1zbG9nb24gKi8KLSsjZGVmaW5lIHJmYlVsdHJhVm5jTXNMb2dvbiAweGZmZmZmZmZhCi0rc3RhdGljIEJvb2wgQXV0aFVsdHJhVm5jTXNMb2dvbih2b2lkKTsKLStleHRlcm4gdm9pZCBVdm5jRW5jcnlwdFBhc3N3ZF9NU0xPR09OKHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZFBhc3N3ZCwgY2hhciAqcGFzc3dkKTsKLStleHRlcm4gdm9pZCBVdm5jRW5jcnlwdEJ5dGVzMih1bnNpZ25lZCBjaGFyICp3aGVyZSwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqa2V5KTsKLStleHRlcm4gdm9pZCBVdm5jRGVjcnlwdEJ5dGVzMih1bnNpZ25lZCBjaGFyICp3aGVyZSwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqa2V5KTsKLStleHRlcm4gdW5zaWduZWQgaW50IHVyYW5kb20odm9pZCk7Ci0rCi0gaW50IGVuZGlhblRlc3QgPSAxOwotIAotIHN0YXRpYyBCb29sIHRpZ2h0Vm5jUHJvdG9jb2wgPSBGYWxzZTsKLUBAIC0xNzcsOCArMjUxLDI2IEBACi0gCSAgc2lnX3JmYkVuY29kaW5nUG9pbnRlclBvcywgIlBvaW50ZXIgcG9zaXRpb24gdXBkYXRlIik7Ci0gICBDYXBzQWRkKGVuY29kaW5nQ2FwcywgcmZiRW5jb2RpbmdMYXN0UmVjdCwgcmZiVGlnaHRWbmNWZW5kb3IsCi0gCSAgc2lnX3JmYkVuY29kaW5nTGFzdFJlY3QsICJMYXN0UmVjdCBwcm90b2NvbCBleHRlbnNpb24iKTsKLSsKLSsgIENhcHNBZGQoZW5jb2RpbmdDYXBzLCByZmJFbmNvZGluZ05ld0ZCU2l6ZSwgcmZiVGlnaHRWbmNWZW5kb3IsCi0rCSAgc2lnX3JmYkVuY29kaW5nTmV3RkJTaXplLCAiTmV3IEZCIHNpemUgcHJvdG9jb2wgZXh0ZW5zaW9uIik7Ci0rCi0rI2lmZGVmIFRVUkJPVk5DCi0rICBDYXBzQWRkKGVuY29kaW5nQ2FwcywgcmZiSnBlZ1F1YWxpdHlMZXZlbDEsIHJmYlR1cmJvVm5jVmVuZG9yLAotKwkgIHNpZ19yZmJFbmNvZGluZ05ld0ZCU2l6ZSwgIlR1cmJvSlBFRyBxdWFsaXR5IGxldmVsIik7Ci0rICBDYXBzQWRkKGVuY29kaW5nQ2FwcywgcmZiSnBlZ1N1YnNhbXAxWCwgcmZiVHVyYm9WbmNWZW5kb3IsCi0rCSAgc2lnX3JmYkVuY29kaW5nTmV3RkJTaXplLCAiVHVyYm9KUEVHIHN1YnNhbXBsaW5nIGxldmVsIik7Ci0rI2VuZGlmCi0gfQotIAotK3N0YXRpYyBjaGFyIG1zZ2J1ZlsxMDAwMF07Ci0rCi0rc3RhdGljIHZvaWQgd21zZyhjaGFyICptc2csIGludCB3YWl0KSB7Ci0rCWZwcmludGYoc3RkZXJyLCAiJXMiLCBtc2cpOwotKwlpZiAoIXVzZV90dHkoKSAmJiAhZ2V0ZW52KCJTU1ZOQ19OT19NRVNTQUdFX1BPUFVQIikpIHsKLSsJCUNyZWF0ZU1zZyhtc2csIHdhaXQpOwotKwl9Ci0rfQotIAotIC8qCi0gICogQ29ubmVjdFRvUkZCU2VydmVyLgotQEAgLTE4NywyNCArMjc5LDE3OSBAQAotIEJvb2wKLSBDb25uZWN0VG9SRkJTZXJ2ZXIoY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBwb3J0KQotIHsKLS0gIHVuc2lnbmVkIGludCBob3N0OwotLQotLSAgaWYgKCFTdHJpbmdUb0lQQWRkcihob3N0bmFtZSwgJmhvc3QpKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCJDb3VsZG4ndCBjb252ZXJ0ICclcycgdG8gaG9zdCBhZGRyZXNzXG4iLCBob3N0bmFtZSk7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJY2hhciAqcSwgKmNtZCA9IE5VTEw7Ci0rCUJvb2wgc2V0bmI7Ci0rCXN0cnVjdCBzdGF0IHNiOwotKwotKwlpZiAoc3Ryc3RyKGhvc3RuYW1lLCAiZXhlYz0iKSA9PSBob3N0bmFtZSkgewotKwkJY21kID0gc3RyZHVwKGhvc3RuYW1lKTsKLSsJCXEgPSBzdHJjaHIoY21kLCAnPScpOwotKwkJKnEgPSAnICc7Ci0rCQlpZiAoZ2V0ZW52KCJTU1ZOQ19CQVNFRElSIikpIHsKLSsJCQljaGFyICpiYXNlID0gZ2V0ZW52KCJTU1ZOQ19CQVNFRElSIik7Ci0rCQkJY2hhciAqbmV3Y21kID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGJhc2UpICsgc3RybGVuKGNtZCkgKyAxMDAwKTsJCi0rCQkJc3ByaW50ZihuZXdjbWQsICIlcy91bndyYXAuc28iLCBiYXNlKTsKLSsJCQlpZiAoc3RhdChuZXdjbWQsICZzYikgPT0gMCkgewotKyNpZiAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotKwkJCQlzcHJpbnRmKG5ld2NtZCwgIkRZTERfRk9SQ0VfRkxBVF9OQU1FU1BBQ0U9MTsgZXhwb3J0IERZTERfRk9SQ0VfRkxBVF9OQU1FU1BBQ0U7IERZTERfSU5TRVJUX0xJQlJBUklFUz0nJXMvdW53cmFwLnNvJzsgZXhwb3J0IERZTERfSU5TRVJUX0xJQlJBUklFUzsgJXMiLCBiYXNlLCBjbWQpOwotKyNlbHNlCi0rCQkJCXNwcmludGYobmV3Y21kLCAiTERfUFJFTE9BRD0nJXMvdW53cmFwLnNvJzsgZXhwb3J0IExEX1BSRUxPQUQ7ICVzIiwgYmFzZSwgY21kKTsKLSsjZW5kaWYKLSsJCQkJY21kID0gbmV3Y21kOwotKwkJCX0KLSsJCX0KLSsJfQotIAotLSAgcmZic29jayA9IENvbm5lY3RUb1RjcEFkZHIoaG9zdCwgcG9ydCk7Ci0rCWlmIChjbWQgIT0gTlVMTCkgewotKwkJaW50IHNmZFsyXTsKLSsJCWNoYXIgKnEsICpjbWQyID0gc3RyZHVwKGNtZCk7Ci0rCQlwaWRfdCBwaWQ7Ci0rCi0rCQlxID0gc3Ryc3RyKGNtZDIsICJwdz0iKTsKLSsJCWlmIChxICYmICFnZXRlbnYoIlNTVk5DX1NIT1dfVUxUUkFWTkNfRFNNX1BBU1NXT1JEIikpIHsKLSsJCQlxICs9IHN0cmxlbigicHc9Iik7Ci0rCQkJd2hpbGUgKCpxICE9ICdcMCcgJiYgIWlzc3BhY2UoKnEpKSB7Ci0rCQkJCSpxID0gJyonOwotKwkJCQlxKys7Ci0rCQkJfQotKwkJfQotKwotKwkJZnByaW50ZihzdGRlcnIsICJleGVjLWNtZDogJXNcblxuIiwgY21kMik7Ci0rCQlmcmVlKGNtZDIpOwotKwotKwkJaWYgKCEgU29ja2V0UGFpcihzZmQpKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwkJaWYgKDApIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgInNmZDogJWQgJWRcbiIsIHNmZFswXSwgc2ZkWzFdKTsKLSsJCQlmZmx1c2goc3RkZXJyKTsKLSsJCX0KLSsKLSsJCXBpZCA9IGZvcmsoKTsKLSsJCWlmIChwaWQgPT0gLTEpIHsKLSsJCQlwZXJyb3IoImZvcmsiKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQlpZiAocGlkID09IDApIHsKLSsJCQljaGFyICphcmdzWzRdOwotKwkJCWludCBkOwotKwkJCWFyZ3NbMF0gPSAiL2Jpbi9zaCI7Ci0rCQkJYXJnc1sxXSA9ICItYyI7Ci0rCQkJYXJnc1syXSA9IGNtZDsKLSsJCQlhcmdzWzNdID0gTlVMTDsKLSsKLSsJCQljbG9zZShzZmRbMV0pOwotKwkJCWR1cDIoc2ZkWzBdLCAwKTsKLSsJCQlkdXAyKHNmZFswXSwgMSk7Ci0rCQkJZm9yIChkPTM7IGQgPCAyNTY7IGQrKykgewotKwkJCQlpZiAoZCAhPSBzZmRbMF0pIHsKLSsJCQkJCWNsb3NlKGQpOwotKwkJCQl9Ci0rCQkJfQotKwkJCWV4ZWN2cChhcmdzWzBdLCBhcmdzKTsKLSsJCQlwZXJyb3IoImV4ZWMiKTsKLSsJCQlleGl0KDEpOwotKwkJfSBlbHNlIHsKLSsJCQljbG9zZShzZmRbMF0pOwotKwkJCXJmYnNvY2sgPSBzZmRbMV07Ci0rCQl9Ci0rCQlpZiAocmZic29jayA8IDApIHsKLSsJCQlzcHJpbnRmKG1zZ2J1ZiwiVW5hYmxlIHRvIGNvbm5lY3QgdG8gZXhlYydkIGNvbW1hbmQ6ICVzXG4iLCBjbWQpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCX0gZWxzZSBpZiAoc3Ryc3RyKGhvc3RuYW1lLCAiZmQ9IikgPT0gaG9zdG5hbWUpIHsKLSsJCXJmYnNvY2sgPSBhdG9pKGhvc3RuYW1lICsgc3RybGVuKCJmZD0iKSk7Ci0rCX0gZWxzZSBpZiAoc3RyY2hyKGhvc3RuYW1lLCAnLycpICYmIHN0YXQoaG9zdG5hbWUsICZzYikgPT0gMCkgewotKwkJLyogYXNzdW1lIHVuaXggZG9tYWluIHNvY2tldCAqLwotKwkJY2hhciAqdGhvc3QgPSBzdHJkdXAoaG9zdG5hbWUpOyAKLSsKLSsJCXJmYnNvY2sgPSBDb25uZWN0VG9Vbml4U29ja2V0KHRob3N0KTsKLSsJCWZyZWUodGhvc3QpOwotKwotKwkJaWYgKHJmYnNvY2sgPCAwKSB7Ci0rCQkJc3ByaW50Zihtc2didWYsIlVuYWJsZSB0byBjb25uZWN0IHRvIFZOQyBzZXJ2ZXIgKHVuaXgtZG9tYWluIHNvY2tldDogJXMpXG4iLCBob3N0bmFtZSk7Ci0rCQkJd21zZyhtc2didWYsIDEpOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCQotKwl9IGVsc2UgewotKwkJcmZic29jayA9IENvbm5lY3RUb1RjcEFkZHIoaG9zdG5hbWUsIHBvcnQpOwotKwotKwkJaWYgKHJmYnNvY2sgPCAwICYmICFhcHBEYXRhLm5vaXB2NCkgewotKwkJCWNoYXIgKnEsICpob3N0dG1wOwotKwkJCWlmIChob3N0bmFtZVswXSA9PSAnWycpIHsKLSsJCQkJaG9zdHRtcCA9IHN0cmR1cChob3N0bmFtZSsxKTsKLSsJCQl9IGVsc2UgewotKwkJCQlob3N0dG1wID0gc3RyZHVwKGhvc3RuYW1lKTsKLSsJCQl9Ci0rCQkJcSA9IHN0cnJjaHIoaG9zdHRtcCwgJ10nKTsKLSsJCQlpZiAocSkgKnEgPSAnXDAnOwotKwkJCWlmIChzdHJzdHIoaG9zdHRtcCwgIjo6ZmZmZjoiKSA9PSBob3N0dG1wIHx8IHN0cnN0cihob3N0dG1wLCAiOjpGRkZGOiIpID09IGhvc3R0bXApIHsKLSsJCQkJY2hhciAqaG9zdCA9IGhvc3R0bXAgKyBzdHJsZW4oIjo6ZmZmZjoiKTsKLSsJCQkJaWYgKGRvdHRlZF9pcChob3N0LCAwKSkgIHsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiQ29ubmVjdFRvVGNwQWRkcltpcHY0XTogcmUtdHJ5aW5nIGNvbm5lY3Rpb24gdXNpbmcgJyVzJ1xuIiwgaG9zdCk7Ci0rCQkJCQlyZmJzb2NrID0gQ29ubmVjdFRvVGNwQWRkcihob3N0LCBwb3J0KTsKLSsJCQkJfQotKwkJCX0KLSsJCQlmcmVlKGhvc3R0bXApOwotKwkJfQotKwotKwkJaWYgKHJmYnNvY2sgPCAwKSB7Ci0rCQkJc3ByaW50Zihtc2didWYsIlVuYWJsZSB0byBjb25uZWN0IHRvIFZOQyBzZXJ2ZXIgKCVzOiVkKVxuIiwgaG9zdG5hbWUsIHBvcnQpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCX0KLSAKLS0gIGlmIChyZmJzb2NrIDwgMCkgewotLSAgICBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGNvbm5lY3QgdG8gVk5DIHNlcnZlclxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJc2V0bmIgPSBTZXROb25CbG9ja2luZyhyZmJzb2NrKTsKLSsJcmV0dXJuIHNldG5iOwotK30KLSAKLS0gIHJldHVybiBTZXROb25CbG9ja2luZyhyZmJzb2NrKTsKLStzdGF0aWMgdm9pZCBwcmludEZhaWx1cmVSZWFzb24odm9pZCkgewotKwlDQVJEMzIgcmVhc29uTGVuOwotKwlSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZyZWFzb25MZW4sIDQpOwotKwlyZWFzb25MZW4gPSBTd2FwMzJJZkxFKHJlYXNvbkxlbik7Ci0rCWlmIChyZWFzb25MZW4gPCA0MDk2KSB7Ci0rCQljaGFyICpyZWFzb24gPSAoY2hhciAqKSBtYWxsb2MocmVhc29uTGVuKzEpOwotKwkJbWVtc2V0KHJlYXNvbiwgMCwgcmVhc29uTGVuKzEpOwotKwkJUmVhZEZyb21SRkJTZXJ2ZXIocmVhc29uLCByZWFzb25MZW4pOwotKwkJc3ByaW50Zihtc2didWYsICJSZWFzb246ICVzXG4iLCByZWFzb24pOwotKwkJd21zZyhtc2didWYsIDEpOwotKwkJZnJlZShyZWFzb24pOwotKwl9Ci0gfQotIAotK3N0YXRpYyBjaGFyICpwcl9zZWNfdHlwZShpbnQgdHlwZSkgewotKwljaGFyICpzdHIgPSAidW5rbm93biI7Ci0rCWlmICh0eXBlID09IHJmYlNlY1R5cGVJbnZhbGlkKSBzdHIgPSAicmZiU2VjVHlwZUludmFsaWQiOwotKwlpZiAodHlwZSA9PSByZmJTZWNUeXBlTm9uZSkgc3RyID0gInJmYlNlY1R5cGVOb25lIjsKLSsJaWYgKHR5cGUgPT0gcmZiU2VjVHlwZVZuY0F1dGgpIHN0ciA9ICJyZmJTZWNUeXBlVm5jQXV0aCI7Ci0rCWlmICh0eXBlID09IHJmYlNlY1R5cGVSQTIpIHN0ciA9ICJyZmJTZWNUeXBlUkEyIjsKLSsJaWYgKHR5cGUgPT0gcmZiU2VjVHlwZVJBMm5lKSBzdHIgPSAicmZiU2VjVHlwZVJBMm5lIjsKLSsJaWYgKHR5cGUgPT0gcmZiU2VjVHlwZVRpZ2h0KSBzdHIgPSAicmZiU2VjVHlwZVRpZ2h0IjsKLSsJaWYgKHR5cGUgPT0gcmZiU2VjVHlwZVVsdHJhKSBzdHIgPSAicmZiU2VjVHlwZVVsdHJhIjsKLSsKLSsJaWYgKHR5cGUgPT0gcmZiU2VjVHlwZUFub25UbHMpIHN0ciA9ICJyZmJTZWNUeXBlQW5vblRscyI7Ci0rCWlmICh0eXBlID09IHJmYlNlY1R5cGVWZW5jcnlwdCkgc3RyID0gInJmYlNlY1R5cGVWZW5jcnlwdCI7Ci0rCi0rCWlmICh0eXBlID09IChpbnQpIHJmYlVsdHJhVm5jTXNMb2dvbikgc3RyID0gInJmYlVsdHJhVm5jTXNMb2dvbiI7Ci0rCXJldHVybiBzdHI7Ci0rfQotKwotK3N0YXRpYyBjaGFyICpwcl9zZWNfc3VidHlwZShpbnQgdHlwZSkgewotKwljaGFyICpzdHIgPSAidW5rbm93biI7Ci0rCWlmICh0eXBlID09IHJmYlZlbmNyeXB0UGxhaW4pIHN0ciA9ICJyZmJWZW5jcnlwdFBsYWluIjsKLSsJaWYgKHR5cGUgPT0gcmZiVmVuY3J5cHRUbHNOb25lKSBzdHIgPSAicmZiVmVuY3J5cHRUbHNOb25lIjsKLSsJaWYgKHR5cGUgPT0gcmZiVmVuY3J5cHRUbHNWbmMpIHN0ciA9ICJyZmJWZW5jcnlwdFRsc1ZuYyI7Ci0rCWlmICh0eXBlID09IHJmYlZlbmNyeXB0VGxzUGxhaW4pIHN0ciA9ICJyZmJWZW5jcnlwdFRsc1BsYWluIjsKLSsJaWYgKHR5cGUgPT0gcmZiVmVuY3J5cHRYNTA5Tm9uZSkgc3RyID0gInJmYlZlbmNyeXB0WDUwOU5vbmUiOwotKwlpZiAodHlwZSA9PSByZmJWZW5jcnlwdFg1MDlWbmMpIHN0ciA9ICJyZmJWZW5jcnlwdFg1MDlWbmMiOwotKwlpZiAodHlwZSA9PSByZmJWZW5jcnlwdFg1MDlQbGFpbikgc3RyID0gInJmYlZlbmNyeXB0WDUwOVBsYWluIjsKLSsJcmV0dXJuIHN0cjsKLSt9Ci0gCi0rZXh0ZXJuIHZvaWQgUHJvY2Vzc1h0RXZlbnRzKHZvaWQpOwotIC8qCi0gICogSW5pdGlhbGlzZVJGQkNvbm5lY3Rpb24uCi0gICovCi1AQCAtMjEyLDIxMSArNDU5LDY1NCBAQAotIEJvb2wKLSBJbml0aWFsaXNlUkZCQ29ubmVjdGlvbih2b2lkKQotIHsKLS0gIHJmYlByb3RvY29sVmVyc2lvbk1zZyBwdjsKLS0gIGludCBzZXJ2ZXJfbWFqb3IsIHNlcnZlcl9taW5vcjsKLS0gIGludCB2aWV3ZXJfbWFqb3IsIHZpZXdlcl9taW5vcjsKLS0gIHJmYkNsaWVudEluaXRNc2cgY2k7Ci0tICBpbnQgc2VjVHlwZTsKLSsJcmZiUHJvdG9jb2xWZXJzaW9uTXNnIHB2OwotKwlyZmJDbGllbnRJbml0TXNnIGNpOwotKwlpbnQgaSwgc2VjVHlwZSwgYW5vbl9kaCA9IDAsIGFjY2VwdF91dm5jID0gMDsKLSsJRklMRSAqcGQ7Ci0rCWNoYXIgKmhzZmlsZSA9IE5VTEw7Ci0rCWNoYXIgKmhzcGFyYW1bMTI4XTsKLSsJY2hhciAqZW52c2V0c2VjID0gZ2V0ZW52KCJTU1ZOQ19TRVRfU0VDVVJJVFlfVFlQRSIpOwotKwljaGFyIGxpbmVbMTI4XTsKLSsJZG91YmxlIGR0ID0gMC4wOwotIAotLSAgLyogaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW1tZWRpYXRlbHkgY2xvc2VkLCBkb24ndCByZXBvcnQgYW55dGhpbmcsIHNvCi0tICAgICAgIHRoYXQgcG13J3MgbW9uaXRvciBjYW4gbWFrZSB0ZXN0IGNvbm5lY3Rpb25zICovCi0rCS8qIGlmIHRoZSBjb25uZWN0aW9uIGlzIGltbWVkaWF0ZWx5IGNsb3NlZCwgZG9uJ3QgcmVwb3J0IGFueXRoaW5nLCBzbwotKwkgICB0aGF0IHBtdydzIG1vbml0b3IgY2FuIG1ha2UgdGVzdCBjb25uZWN0aW9ucyAqLwotIAotLSAgaWYgKGxpc3RlblNwZWNpZmllZCkKLS0gICAgZXJyb3JNZXNzYWdlT25SZWFkRmFpbHVyZSA9IEZhbHNlOwotKwlpZiAobGlzdGVuU3BlY2lmaWVkKSB7Ci0rCQllcnJvck1lc3NhZ2VPblJlYWRGYWlsdXJlID0gRmFsc2U7Ci0rCX0KLSAKLS0gIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIocHYsIHN6X3JmYlByb3RvY29sVmVyc2lvbk1zZykpCi0tICAgIHJldHVybiBGYWxzZTsKLSsJZm9yIChpPTA7IGkgPCAxMjg7IGkrKykgewotKwkJaHNwYXJhbVtpXSA9IE5VTEw7Ci0rCX0KLSAKLS0gIGVycm9yTWVzc2FnZU9uUmVhZEZhaWx1cmUgPSBUcnVlOwotKwlza2lwX1h0VXBkYXRlQWxsID0gMTsKLSsJUHJvY2Vzc1h0RXZlbnRzKCk7Ci0rCXNraXBfWHRVcGRhdGVBbGwgPSAwOwotKwotKwlpZiAoZ2V0ZW52KCJTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0UiKSkgewotKwkJZG91YmxlIHN0YXJ0ID0gZG5vdygpOwotKwkJaHNmaWxlID0gZ2V0ZW52KCJTU1ZOQ19QUkVESUdFU1RFRF9IQU5EU0hBS0UiKTsKLSsJCXdoaWxlIChkbm93KCkgPCBzdGFydCArIDEwLjApIHsKLSsJCQlpbnQgZG9uZSA9IDA7Ci0rCQkJdXNsZWVwKDEwMCAqIDEwMDApOwotKwkJCWlmICgocGQgPSBmb3Blbihoc2ZpbGUsICJyIikpICE9IE5VTEwpIHsKLSsJCQkJd2hpbGUgKGZnZXRzKGxpbmUsIDEyOCwgcGQpICE9IE5VTEwpIHsKLSsJCQkJCWlmIChzdHJzdHIobGluZSwgImRvbmUiKSA9PSBsaW5lKSB7Ci0rCQkJCQkJZG9uZSA9IDE7Ci0rCQkJCQkJdXNsZWVwKDEwMCAqIDEwMDApOwotKwkJCQkJCWJyZWFrOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJCWZjbG9zZShwZCk7Ci0rCQkJfQotKwkJCWlmIChkb25lKSB7Ci0rCQkJCWJyZWFrOwotKwkJCX0KLSsJCX0KLSsJCWlmICgocGQgPSBmb3Blbihoc2ZpbGUsICJyIikpICE9IE5VTEwpIHsKLSsJCQlpID0gMDsKLSsJCQl3aGlsZSAoZmdldHMobGluZSwgMTI4LCBwZCkgIT0gTlVMTCkgewotKwkJCQloc3BhcmFtW2ldID0gc3RyZHVwKGxpbmUpOwotKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbGluZSk7Ci0rCQkJCWlmIChpKysgPiAxMDApIGJyZWFrOyAKLSsJCQl9Ci0rCQkJZmNsb3NlKHBkKTsKLSsJCX0KLSsJCXVubGluayhoc2ZpbGUpOwotKwl9Ci0gCi0tICBwdltzel9yZmJQcm90b2NvbFZlcnNpb25Nc2ddID0gMDsKLSsJaWYgKGdldGVudigiU1NWTkNfU0tJUF9SRkJfUFJPVE9DT0xfVkVSU0lPTiIpKSB7Ci0rCQl2aWV3ZXJfbWFqb3IgPSAzOwotKwkJdmlld2VyX21pbm9yID0gODsKLSsJCWdvdG8gZW5kX29mX3Byb3RvX21zZzsKLSsJfSBlbHNlIGlmIChoc2ZpbGUpIHsKLSsJCWludCBrID0gMDsKLSsJCXdoaWxlIChoc3BhcmFtW2tdICE9IE5VTEwpIHsKLSsJCQljaGFyICpzdHIgPSBoc3BhcmFtW2srK107Ci0rCQkJaWYgKHN0cnN0cihzdHIsICJzZXJ2ZXI9IikgPT0gc3RyKSB7Ci0rCQkJCXNwcmludGYocHYsICIlcyIsIHN0ciArIHN0cmxlbigic2VydmVyPSIpKTsKLSsJCQkJZ290byByZWFkZWRfcHY7Ci0rCQkJfQotKwkJfQotKwl9Ci0gCi0tICBpZiAoc3NjYW5mKHB2LCByZmJQcm90b2NvbFZlcnNpb25Gb3JtYXQsCi0tCSAgICAgJnNlcnZlcl9tYWpvciwgJnNlcnZlcl9taW5vcikgIT0gMikgewotLSAgICBmcHJpbnRmKHN0ZGVyciwiTm90IGEgdmFsaWQgVk5DIHNlcnZlclxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJZHQgPSBkbm93KCk7Ci0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIocHYsIHN6X3JmYlByb3RvY29sVmVyc2lvbk1zZykpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlpZiAoZ2V0ZW52KCJQUklOVF9ERUxBWTEiKSkgZnByaW50ZihzdGRlcnIsICJkZWxheTE6ICUuM2YgbXNcbiIsIChkbm93KCkgLSBkdCkgKiAxMDAwKTsKLSsJZHQgPSAwLjA7Ci0gCi0tICB2aWV3ZXJfbWFqb3IgPSByZmJQcm90b2NvbE1ham9yVmVyc2lvbjsKLS0gIGlmIChzZXJ2ZXJfbWFqb3IgPT0gMyAmJiBzZXJ2ZXJfbWlub3IgPj0gcmZiUHJvdG9jb2xNaW5vclZlcnNpb24pIHsKLS0gICAgLyogdGhlIHNlcnZlciBzdXBwb3J0cyBhdCBsZWFzdCB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgMy43ICovCi0tICAgIHZpZXdlcl9taW5vciA9IHJmYlByb3RvY29sTWlub3JWZXJzaW9uOwotLSAgfSBlbHNlIHsKLS0gICAgLyogYW55IG90aGVyIHNlcnZlciB2ZXJzaW9uLCByZXF1ZXN0IHRoZSBzdGFuZGFyZCAzLjMgKi8KLS0gICAgdmlld2VyX21pbm9yID0gcmZiUHJvdG9jb2xGYWxsYmFja01pbm9yVmVyc2lvbjsKLS0gIH0KLSsJcmVhZGVkX3B2OgotIAotLSAgZnByaW50ZihzdGRlcnIsICJDb25uZWN0ZWQgdG8gUkZCIHNlcnZlciwgdXNpbmcgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZFxuIiwKLS0JICB2aWV3ZXJfbWFqb3IsIHZpZXdlcl9taW5vcik7Ci0rCWVycm9yTWVzc2FnZU9uUmVhZEZhaWx1cmUgPSBUcnVlOwotIAotLSAgc3ByaW50ZihwdiwgcmZiUHJvdG9jb2xWZXJzaW9uRm9ybWF0LCB2aWV3ZXJfbWFqb3IsIHZpZXdlcl9taW5vcik7Ci0rCXB2W3N6X3JmYlByb3RvY29sVmVyc2lvbk1zZ10gPSAwOwotIAotLSAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIHB2LCBzel9yZmJQcm90b2NvbFZlcnNpb25Nc2cpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCWlmIChzdHJzdHIocHYsICJJRDoiKSA9PSBwdikgewotKwkJOwotKwl9IGVsc2UgaWYgKHNzY2FuZihwdiwgcmZiUHJvdG9jb2xWZXJzaW9uRm9ybWF0LCAmc2VydmVyX21ham9yLCAmc2VydmVyX21pbm9yKSAhPSAyKSB7Ci0rCQlpZiAoc3Ryc3RyKHB2LCAidGVzdCIpID09IHB2KSB7Ci0rCQkJLyogbm93IHNvbWUgaGFja3MgZm9yIHVsdHJhVk5DIFNDIElJSSAoU1NMKSAuLi4gdGVzdEEsIGV0YyAqLwotKwkJCWludCBpOwotKwkJCWNoYXIgKnNlID0gTlVMTDsKLSsKLSsJCQlmcHJpbnRmKHN0ZGVyciwiVHJ5aW5nIFVsdHJhVk5DIFNpbmdsZSBDbGljayBJSUkgd29ya2Fyb3VuZDogJXNcbiIsIHB2KTsKLSsJCQlmb3IgKGk9MDsgaSA8IDcgOyBpKyspIHsKLSsJCQkJcHZbaV0gPSBwdltpKzVdOwotKwkJCX0KLSsJCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKHB2KzcsIDUpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCi0rCQkJc2UgPSBnZXRlbnYoIlNUVU5ORUxfRVhUUkFfT1BUUyIpOwotKwkJCWlmIChzZSA9PSBOVUxMKSB7Ci0rCQkJCXNlID0gZ2V0ZW52KCJTVFVOTkVMX0VYVFJBX09QVFNfVVNFUiIpOwotKwkJCX0KLSsJCQlpZiAoc2UgIT0gTlVMTCkgewotKwkJCQlpZiAoc3Ryc3RyKHNlLCAib3B0aW9ucyIpKSB7Ci0rCQkJCQlpZiAoc3Ryc3RyKHNlLCAiQUxMIikgfHwgc3Ryc3RyKHNlLCAiRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIikpIHsKLSsJCQkJCQk7CS8qIGdvb2QgKi8KLSsJCQkJCX0gZWxzZSB7Ci0rCQkJCQkJc2UgPSBOVUxMOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgewotKwkJCQkJc2UgPSBOVUxMOwotKwkJCQl9Ci0rCQkJfQotKwkJCWlmIChzZSA9PSBOVUxMKSB7Ci0rCQkJCW1zZ2J1ZlswXSA9ICdcMCc7Ci0rCQkJCXN0cmNhdChtc2didWYsICJcbiIpOwotKwkJCQlzdHJjYXQobXNnYnVmLCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLSsJCQkJc3RyY2F0KG1zZ2J1ZiwgIlRvIHdvcmsgYXJvdW5kIFVsdHJhVk5DIFNDIElJSSBTU0wgZHJvcHBpbmcgYWZ0ZXIgYSBmZXcgbWludXRlc1xuIik7Ci0rCQkJCXN0cmNhdChtc2didWYsICJ5b3UgbWF5IG5lZWQgdG8gc2V0IFNUVU5ORUxfRVhUUkFfT1BUU19VU0VSPSdvcHRpb25zID0gQUxMJy5cbiIpOwotKwkJCQlzdHJjYXQobXNnYnVmLCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLSsJCQkJc3RyY2F0KG1zZ2J1ZiwgIlxuIik7Ci0rCQkJCXdtc2cobXNnYnVmLCAwKTsKLSsJCQl9Ci0rCQkJaWYgKHN0cnN0cihwdiwgIklEOiIpID09IHB2KSB7Ci0rCQkJCWdvdG8gY2hlY2tfSURfc3RyaW5nOwotKwkJCX0KLSsJCQlpZiAoc3NjYW5mKHB2LCByZmJQcm90b2NvbFZlcnNpb25Gb3JtYXQsICZzZXJ2ZXJfbWFqb3IsICZzZXJ2ZXJfbWlub3IpID09IDIpIHsKLSsJCQkJZ290byB1bHRyYV92bmNfbm9uc2Vuc2U7Ci0rCQkJfQotKwkJfQotKwkJc3ByaW50Zihtc2didWYsICJOb3QgYSB2YWxpZCBWTkMgc2VydmVyOiAnJXMnXG4iLCBwdik7Ci0rCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIC8qIFJlYWQgb3Igc2VsZWN0IHRoZSBzZWN1cml0eSB0eXBlLiAqLwotLSAgaWYgKHZpZXdlcl9taW5vciA9PSByZmJQcm90b2NvbE1pbm9yVmVyc2lvbikgewotLSAgICBzZWNUeXBlID0gU2VsZWN0U2VjdXJpdHlUeXBlKCk7Ci0tICB9IGVsc2UgewotLSAgICBzZWNUeXBlID0gUmVhZFNlY3VyaXR5VHlwZSgpOwotLSAgfQotLSAgaWYgKHNlY1R5cGUgPT0gcmZiU2VjVHlwZUludmFsaWQpCi0tICAgIHJldHVybiBGYWxzZTsKLSsJY2hlY2tfSURfc3RyaW5nOgotKwlpZiAoc3Ryc3RyKHB2LCAiSUQ6IikgPT0gcHYpIHsKLSsJCWNoYXIgdG1wWzI1Nl07Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlVsdHJhVk5DIFJlcGVhdGVyIHN0cmluZyBkZXRlY3RlZDogJXNcbiIsIHB2KTsKLSsJCWZwcmludGYoc3RkZXJyLCAiUHJldGVuZGluZyB0byBiZSBVbHRyYVZOQyByZXBlYXRlcjogcmVhZGluZyAyNTAgYnl0ZXMuLi5cblxuIik7Ci0rCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKHRtcCwgMjUwIC0gMTIpKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihwdiwgMTIpKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwkJaWYgKHNzY2FuZihwdiwgcmZiUHJvdG9jb2xWZXJzaW9uRm9ybWF0LCAmc2VydmVyX21ham9yLCAmc2VydmVyX21pbm9yKSAhPSAyKSB7Ci0rCQkJc3ByaW50Zihtc2didWYsIk5vdCBhIHZhbGlkIFZOQyBzZXJ2ZXI6ICclcydcbiIsIHB2KTsKLSsJCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwl9Ci0gCi0tICBzd2l0Y2ggKHNlY1R5cGUpIHsKLS0gIGNhc2UgcmZiU2VjVHlwZU5vbmU6Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiTm8gYXV0aGVudGljYXRpb24gbmVlZGVkXG4iKTsKLS0gICAgYnJlYWs7Ci0tICBjYXNlIHJmYlNlY1R5cGVWbmNBdXRoOgotLSAgICBpZiAoIUF1dGhlbnRpY2F0ZVZOQygpKQotLSAgICAgIHJldHVybiBGYWxzZTsKLS0gICAgYnJlYWs7Ci0tICBjYXNlIHJmYlNlY1R5cGVUaWdodDoKLS0gICAgdGlnaHRWbmNQcm90b2NvbCA9IFRydWU7Ci0tICAgIEluaXRDYXBhYmlsaXRpZXMoKTsKLS0gICAgaWYgKCFTZXR1cFR1bm5lbGluZygpKQotLSAgICAgIHJldHVybiBGYWxzZTsKLS0gICAgaWYgKCFQZXJmb3JtQXV0aGVudGljYXRpb25UaWdodCgpKQotLSAgICAgIHJldHVybiBGYWxzZTsKLS0gICAgYnJlYWs7Ci0tICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0tICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3I6IEludmFsaWQgc2VjdXJpdHkgdHlwZVxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJdWx0cmFfdm5jX25vbnNlbnNlOgotKwlmcHJpbnRmKHN0ZGVyciwiXG5Qcm90bzogJXNcbiIsIHB2KTsKLSAKLS0gIGNpLnNoYXJlZCA9IChhcHBEYXRhLnNoYXJlRGVza3RvcCA/IDEgOiAwKTsKLSsJdmlld2VyX21ham9yID0gMzsKLSAKLS0gIGlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjaSwgc3pfcmZiQ2xpZW50SW5pdE1zZykpCi0tICAgIHJldHVybiBGYWxzZTsKLSsJaWYgKGFwcERhdGEucmZiVmVyc2lvbiAhPSBOVUxMICYmIHNzY2FuZihhcHBEYXRhLnJmYlZlcnNpb24sICIlZC4lZCIsICZ2aWV3ZXJfbWFqb3IsICZ2aWV3ZXJfbWlub3IpID09IDIpIHsKLSsJCWZwcmludGYoc3RkZXJyLCJTZXR0aW5nIFJGQiB2ZXJzaW9uIHRvICVkLiVkIGZyb20gLXJmYnZlcnNpb24uXG5cbiIsIHZpZXdlcl9tYWpvciwgdmlld2VyX21pbm9yKTsKLSAKLS0gIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmc2ksIHN6X3JmYlNlcnZlckluaXRNc2cpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCX0gZWxzZSBpZiAoZ2V0ZW52KCJTU1ZOQ19SRkJfVkVSU0lPTiIpICE9IE5VTEwgJiYgc3NjYW5mKGdldGVudigiU1NWTkNfUkZCX1ZFUlNJT04iKSwgIiVkLiVkIiwgJnZpZXdlcl9tYWpvciwgJnZpZXdlcl9taW5vcikgPT0gMikgewotKwkJZnByaW50ZihzdGRlcnIsIlNldHRpbmcgUkZCIHZlcnNpb24gdG8gJWQuJWQgZnJvbSBTU1ZOQ19SRkJfVkVSU0lPTi5cblxuIiwgdmlld2VyX21ham9yLCB2aWV3ZXJfbWlub3IpOwotKwotKwl9IGVsc2UgaWYgKHNlcnZlcl9tYWpvciA+IDMpIHsKLSsJCXZpZXdlcl9taW5vciA9IDg7Ci0rCX0gZWxzZSBpZiAoc2VydmVyX21ham9yID09IDMgJiYgKHNlcnZlcl9taW5vciA9PSAxNCB8fCBzZXJ2ZXJfbWlub3IgPT0gMTYpKSB7Ci0rCQkvKiBoYWNrIGZvciBVbHRyYVZOQyBTaW5nbGUgQ2xpY2suIFRoZXkgbWlzdXNlIHJmYiBwcm90byB2ZXJzaW9uICovCi0rCQlmcHJpbnRmKHN0ZGVyciwiU2V0dGluZyBSRkIgdmVyc2lvbiB0byAzLjMgZm9yIFVsdHJhVk5DIFNpbmdsZSBDbGljay5cblxuIik7Ci0rCQl2aWV3ZXJfbWlub3IgPSAzOwotKwotKwl9IGVsc2UgaWYgKHNlcnZlcl9tYWpvciA9PSAzICYmIHNlcnZlcl9taW5vciA+PSA4KSB7Ci0rCQkvKiB0aGUgc2VydmVyIHN1cHBvcnRzIGF0IGxlYXN0IHRoZSBzdGFuZGFyZCBwcm90b2NvbCAzLjggKi8KLSsJCXZpZXdlcl9taW5vciA9IDg7Ci0rCi0rCX0gZWxzZSBpZiAoc2VydmVyX21ham9yID09IDMgJiYgc2VydmVyX21pbm9yID09IDcpIHsKLSsJCS8qIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgYXQgbGVhc3QgdGhlIHN0YW5kYXJkIHByb3RvY29sIDMuNyAqLwotKwkJdmlld2VyX21pbm9yID0gNzsKLSsKLSsJfSBlbHNlIHsKLSsJCS8qIGFueSBvdGhlciBzZXJ2ZXIgdmVyc2lvbiwgcmVxdWVzdCB0aGUgc3RhbmRhcmQgMy4zICovCi0rCQl2aWV3ZXJfbWlub3IgPSAzOwotKwl9Ci0rCS8qIG4uYi4gQXBwbGUgUmVtb3RlIERlc2t0b3AgdXNlcyAwMDMuODg5LCBidXQgd2Ugc2hvdWxkIGJlIE9LIHdpdGggMy44ICovCi0gCi0tICBzaS5mcmFtZWJ1ZmZlcldpZHRoID0gU3dhcDE2SWZMRShzaS5mcmFtZWJ1ZmZlcldpZHRoKTsKLS0gIHNpLmZyYW1lYnVmZmVySGVpZ2h0ID0gU3dhcDE2SWZMRShzaS5mcmFtZWJ1ZmZlckhlaWdodCk7Ci0tICBzaS5mb3JtYXQucmVkTWF4ID0gU3dhcDE2SWZMRShzaS5mb3JtYXQucmVkTWF4KTsKLS0gIHNpLmZvcm1hdC5ncmVlbk1heCA9IFN3YXAxNklmTEUoc2kuZm9ybWF0LmdyZWVuTWF4KTsKLS0gIHNpLmZvcm1hdC5ibHVlTWF4ID0gU3dhcDE2SWZMRShzaS5mb3JtYXQuYmx1ZU1heCk7Ci0tICBzaS5uYW1lTGVuZ3RoID0gU3dhcDMySWZMRShzaS5uYW1lTGVuZ3RoKTsKLS0KLS0gIC8qIEZJWE1FOiBDaGVjayBhcmd1bWVudHMgdG8gbWFsbG9jKCkgY2FsbHMuICovCi0tICBkZXNrdG9wTmFtZSA9IG1hbGxvYyhzaS5uYW1lTGVuZ3RoICsgMSk7Ci0tICBpZiAoIWRlc2t0b3BOYW1lKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGRlc2t0b3AgbmFtZSwgJWx1IGJ5dGVzXG4iLAotLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNpLm5hbWVMZW5ndGgpOwotLSAgICByZXR1cm4gRmFsc2U7Ci0tICB9Ci0rCWlmIChhcHBEYXRhLm1zTG9nb24pIHsKLSsJCWlmIChzZXJ2ZXJfbWlub3IgPT0gNCkgewotKwkJCWZwcmludGYoc3RkZXJyLCJTZXR0aW5nIFJGQiB2ZXJzaW9uIHRvIDMuNCBmb3IgVWx0cmFWTkMgTVMgTG9nb24uXG5cbiIpOwotKwkJCXZpZXdlcl9taW5vciA9IDQ7Ci0rCQl9Ci0rCX0KLSsJaWYgKGdldGVudigiU1NWTkNfQUNDRVBUX1BPUFVQX1NDIikpIHsKLSsJCWlmIChzZXJ2ZXJfbWlub3IgPT0gLTQgfHwgc2VydmVyX21pbm9yID09IC02IHx8IHNlcnZlcl9taW5vciA9PSAxNCB8fCBzZXJ2ZXJfbWlub3IgPT0gMTYpIHsKLSsJCQkvKiA0IGFuZCA2IHdvcmsgdG9vPyAqLwotKwkJCXZpZXdlcl9taW5vciA9IHNlcnZlcl9taW5vcjsKLSsJCQlhY2NlcHRfdXZuYyA9IDE7Ci0rCQkJZnByaW50ZihzdGRlcnIsIlJlc2V0IFJGQiB2ZXJzaW9uIHRvIDMuJWQgZm9yIFVsdHJhVk5DIFNTVk5DX0FDQ0VQVF9QT1BVUF9TQy5cblxuIiwgdmlld2VyX21pbm9yKTsKLSsJCX0KLSsJfQotIAotLSAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihkZXNrdG9wTmFtZSwgc2kubmFtZUxlbmd0aCkpIHJldHVybiBGYWxzZTsKLSsJZnByaW50ZihzdGRlcnIsICJDb25uZWN0ZWQgdG8gUkZCIHNlcnZlciwgdXNpbmcgcHJvdG9jb2wgdmVyc2lvbiAlZC4lZFxuIiwgdmlld2VyX21ham9yLCB2aWV3ZXJfbWlub3IpOwotIAotLSAgZGVza3RvcE5hbWVbc2kubmFtZUxlbmd0aF0gPSAwOwotKwlpZiAoaHNmaWxlKSB7Ci0rCQlpbnQgayA9IDA7Ci0rCQl3aGlsZSAoaHNwYXJhbVtrXSAhPSBOVUxMKSB7Ci0rCQkJY2hhciAqc3RyID0gaHNwYXJhbVtrKytdOwotKwkJCWlmIChzdHJzdHIoc3RyLCAibGF0ZW5jeT0iKSA9PSBzdHIpIHsKLSsJCQkJbGF0ZW5jeSA9IDEwMDAuICogYXRvZihzdHIgKyBzdHJsZW4oImxhdGVuY3k9IikpOwotKwkJCX0KLSsJCX0KLSsJCWsgPSAwOwotKwkJd2hpbGUgKGhzcGFyYW1ba10gIT0gTlVMTCkgewotKwkJCWNoYXIgKnN0ciA9IGhzcGFyYW1baysrXTsKLSsJCQlpbnQgdjEsIHYyOwotKwkJCWlmIChzc2NhbmYoc3RyLCAidmlld2VyPVJGQiAlZC4lZFxuIiwgJnYxLCAmdjIpID09IDIpIHsKLSsJCQkJdmlld2VyX21ham9yID0gdjE7Ci0rCQkJCXZpZXdlcl9taW5vciA9IHYyOwotKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuUHJlLUhhbmRzaGFrZSBzZXQgcHJvdG9jb2wgdmVyc2lvbiB0bzogJWQuJWQgIExhdGVuY3k6ICUuMmYgbXNcbiIsIHZpZXdlcl9tYWpvciwgdmlld2VyX21pbm9yLCBsYXRlbmN5KTsKLSsJCQkJZ290byBlbmRfb2ZfcHJvdG9fbXNnOwotKwkJCX0KLSsJCX0KLSsJfQotKwlzcHJpbnRmKHB2LCByZmJQcm90b2NvbFZlcnNpb25Gb3JtYXQsIHZpZXdlcl9tYWpvciwgdmlld2VyX21pbm9yKTsKLSAKLS0gIGZwcmludGYoc3RkZXJyLCJEZXNrdG9wIG5hbWUgXCIlc1wiXG4iLGRlc2t0b3BOYW1lKTsKLSsJaWYgKCFhcHBEYXRhLmFwcFNoYXJlKSB7Ci0rCQl1c2xlZXAoMTAwKjEwMDApOwotKwl9Ci0rCWR0ID0gZG5vdygpOwotKwlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgcHYsIHN6X3JmYlByb3RvY29sVmVyc2lvbk1zZykpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotIAotLSAgZnByaW50ZihzdGRlcnIsIlZOQyBzZXJ2ZXIgZGVmYXVsdCBmb3JtYXQ6XG4iKTsKLS0gIFByaW50UGl4ZWxGb3JtYXQoJnNpLmZvcm1hdCk7Ci0rCWVuZF9vZl9wcm90b19tc2c6Ci0gCi0tICBpZiAodGlnaHRWbmNQcm90b2NvbCkgewotLSAgICAvKiBSZWFkIGludGVyYWN0aW9uIGNhcGFiaWxpdGllcyAocHJvdG9jb2wgMy43dCkgKi8KLS0gICAgaWYgKCFSZWFkSW50ZXJhY3Rpb25DYXBzKCkpCi0tICAgICAgcmV0dXJuIEZhbHNlOwotLSAgfQotKwlpZiAoZW52c2V0c2VjKSB7Ci0rCQlzZWNUeXBlID0gYXRvaShnZXRlbnYoIlNTVk5DX1NFVF9TRUNVUklUWV9UWVBFIikpOwotKwkJZ290byBzZWNfdHlwZTsKLSsJfQotKwlpZiAoaHNmaWxlKSB7Ci0rCQlpbnQgayA9IDA7Ci0rCQl3aGlsZSAoaHNwYXJhbVtrXSAhPSBOVUxMKSB7Ci0rCQkJY2hhciAqc3RyID0gaHNwYXJhbVtrKytdOwotKwkJCWludCBzdDsKLSsJCQlpZiAoc3NjYW5mKHN0ciwgInNlY3R5cGU9JWRcbiIsICZzdCkgPT0gMSkgewotKwkJCQlzZWNUeXBlID0gc3Q7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiUHJlLUhhbmRzaGFrZSBzZXQgU2VjdXJpdHktVHlwZSB0bzogJWQgKCVzKVxuIiwgc3QsIHByX3NlY190eXBlKHN0KSk7Ci0rCQkJCWlmIChzZWNUeXBlID09IHJmYlNlY1R5cGVWZW5jcnlwdCkgewotKwkJCQkJZ290byBzZWNfdHlwZTsKLSsJCQkJfSBlbHNlIGlmIChzZWNUeXBlID09IHJmYlNlY1R5cGVBbm9uVGxzKSB7Ci0rCQkJCQlicmVhazsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJfQotIAotLSAgcmV0dXJuIFRydWU7Ci0rCWlmIChhY2NlcHRfdXZuYykgewotKwkJdW5zaWduZWQgaW50IG1zZ19zeiA9IDA7Ci0rCQl1bnNpZ25lZCBpbnQgbmltbWVyID0gMDsKLSsJCWNoYXIgbXNnWzMwMDBdOwotKwkJY2hhciAqbXNnX2J1ZiwgKnNpcCA9IE5VTEwsICpzaWggPSBOVUxMOwotKwotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSAmbXNnX3N6LCA0KSkgewotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCWR0X291dF9zYyA9IGRub3coKTsKLSsJCW1zZ19zeiA9IFN3YXAzMklmQkUobXNnX3N6KTsKLSsJCWlmIChtc2dfc3ogPiAxMDI0KSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJVVk5DIG1zZyBzaXplIHRvbyBiaWc6ICVkXG4iLCBtc2dfc3opOwotKwkJCWV4aXQoMSk7Ci0rCQl9Ci0rCQltc2dfYnVmID0gKGNoYXIgKiljYWxsb2MobXNnX3N6ICsgMTAwLCAxKTsKLSsJCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIobXNnX2J1ZiwgbXNnX3N6KSkgewotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsKLSsJCWlmICgwKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJtc2dfYnVmOiAiKTsKLSsJCQl3cml0ZSgyLCBtc2dfYnVmLCBtc2dfc3opOwotKwkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCX0KLSsKLSsJCXNpcCA9IGdldF9wZWVyX2lwKHJmYnNvY2spOwotKwkJaWYgKHN0cmxlbihzaXApID4gMTAwKSBzaXAgPSAiMC4wLjAuMCI7Ci0rCQlzaWggPSBpcDJob3N0KHNpcCk7Ci0rCQlpZiAoc3RybGVuKHNpaCkgPiAzMDApIHNpaCA9ICJ1bmtub3duIjsKLSsKLSsJCXNwcmludGYobXNnLCAiXG4oTElTVEVOKSBSZXZlcnNlIFZOQyBjb25uZWN0aW9uIGZyb20gSVA6ICVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdG5hbWU6ICVzXG5cbiIsIHNpcCwgc2loKTsKLSsJCXN0cmNhdChtc2csICJVbHRyYVZOQyBTZXJ2ZXIgTWVzc2FnZTpcbiIpOwotKwkJc3RyY2F0KG1zZywgbXNnX2J1Zik7Ci0rCQlmcmVlKG1zZ19idWYpOwotKwkJc3RyY2F0KG1zZywgIlxuXG4iKTsKLSsJCXN0cmNhdChtc2csICJBY2NlcHQgb3IgUmVqZWN0IFZOQyBjb25uZWN0aW9uPyIpOwotKwkJaWYgKENyZWF0ZU1zZyhtc2csIDIpKSB7Ci0rCQkJbmltbWVyID0gMTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIkFjY2VwdGluZyBjb25uZWN0aW9uLlxuXG4iKTsKLSsJCX0gZWxzZSB7Ci0rCQkJbmltbWVyID0gMDsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlJlZnVzaW5nIGNvbm5lY3Rpb24uXG5cbiIpOwotKwkJfQotKwkJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopICZuaW1tZXIsIDQpKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwl9Ci0rCi0rCS8qIFJlYWQgb3Igc2VsZWN0IHRoZSBzZWN1cml0eSB0eXBlLiAqLwotKwlkdF9vdXQgPSAwLjA7Ci0rCi0rCXNraXBfWHRVcGRhdGVBbGwgPSAxOwotKwlpZiAodmlld2VyX21pbm9yID49IDcgJiYgIWFjY2VwdF91dm5jKSB7Ci0rCQlzZWNUeXBlID0gU2VsZWN0U2VjdXJpdHlUeXBlKCk7Ci0rCX0gZWxzZSB7Ci0rCQlzZWNUeXBlID0gUmVhZFNlY3VyaXR5VHlwZSgpOwotKwl9Ci0rCXNraXBfWHRVcGRhdGVBbGwgPSAwOwotKwotKwlpZiAoYWNjZXB0X3V2bmMpIHsKLSsJCWR0X291dCA9IGR0X291dF9zYzsKLSsJfQotKwotKwlpZiAoZHQgPiAwLjAgJiYgZHRfb3V0ID4gZHQpIHsKLSsJCWxhdGVuY3kgPSAoZHRfb3V0IC0gZHQpICogMTAwMDsKLSsJfQotKwkKLSsJZnByaW50ZihzdGRlcnIsICJTZWN1cml0eS1UeXBlOiAlZCAoJXMpICBMYXRlbmN5OiAlLjJmIG1zXG4iLCAoaW50KSBzZWNUeXBlLCBwcl9zZWNfdHlwZShzZWNUeXBlKSwgbGF0ZW5jeSk7Ci0rCWlmIChzZWNUeXBlID09IHJmYlNlY1R5cGVJbnZhbGlkKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsKLSsJc2VjX3R5cGU6Ci0rCi0rCWlmIChoc2ZpbGUpIHsKLSsJCWludCBzdWJzZWN0eXBlID0gMDsKLSsJCWludCBrID0gMDsKLSsJCXdoaWxlIChoc3BhcmFtW2tdICE9IE5VTEwpIHsKLSsJCQljaGFyICpzdHIgPSBoc3BhcmFtW2srK107Ci0rCQkJaW50IHN0OwotKwkJCWlmIChzc2NhbmYoc3RyLCAic3VidHlwZT0lZFxuIiwgJnN0KSA9PSAxKSB7Ci0rCQkJCXN1YnNlY3R5cGUgPSBzdDsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJQcmUtSGFuZHNoYWtlIHNldCBTdWItU2VjdXJpdHktVHlwZSB0bzogJWQgKCVzKVxuXG4iLCBzdCwgcHJfc2VjX3N1YnR5cGUoc3QpKTsKLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJfQotKwotKwkJaWYgKCFzdWJzZWN0eXBlKSB7Ci0rCQkJOwotKwkJfSBlbHNlIGlmIChzZWNUeXBlID09IHJmYlNlY1R5cGVWZW5jcnlwdCkgewotKwkJCWlmIChzdWJzZWN0eXBlID09IHJmYlZlbmNyeXB0VGxzTm9uZSkgewotKwkJCQlhbm9uX2RoID0gMTsKLSsJCQkJc2VjVHlwZSA9IHJmYlNlY1R5cGVOb25lOwotKwkJCX0gZWxzZSBpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFRsc1ZuYykgewotKwkJCQlhbm9uX2RoID0gMTsKLSsJCQkJc2VjVHlwZSA9IHJmYlNlY1R5cGVWbmNBdXRoOwotKwkJCX0gZWxzZSBpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFRsc1BsYWluKSB7Ci0rCQkJCWFub25fZGggPSAxOwotKwkJCQlzZWNUeXBlID0gcmZiU2VjVHlwZU5vbmU7Ci0rCQkJfSBlbHNlIGlmIChzdWJzZWN0eXBlID09IHJmYlZlbmNyeXB0WDUwOU5vbmUpIHsKLSsJCQkJc2VjVHlwZSA9IHJmYlNlY1R5cGVOb25lOwotKwkJCX0gZWxzZSBpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFg1MDlWbmMpIHsKLSsJCQkJc2VjVHlwZSA9IHJmYlNlY1R5cGVWbmNBdXRoOwotKwkJCX0gZWxzZSBpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFg1MDlQbGFpbikgewotKwkJCQlzZWNUeXBlID0gcmZiU2VjVHlwZU5vbmU7Ci0rCQkJfQotKwkJCWlmIChzdWJzZWN0eXBlID09IHJmYlZlbmNyeXB0VGxzUGxhaW4gfHwgc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFg1MDlQbGFpbikgewotKwkJCQl1c2xlZXAoMzAwKjEwMDApOwotKwkJCX0KLSsJCQlpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFRsc05vbmUgfHwgc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFRsc1ZuYyB8fCBzdWJzZWN0eXBlID09IHJmYlZlbmNyeXB0VGxzUGxhaW4pIHsKLSsJCQkJY2hhciB0bXBbMTAwMF0sIGxpbmVbMTAwXTsKLSsJCQkJdG1wWzBdID0gJ1wwJzsKLSsJCQkJc3RyY2F0KHRtcCwgIlxuIik7Ci0rCQkJCXNwcmludGYobGluZSwgIldBUk5JTkc6IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBUTFMgdXNlZCAoJXMpLFxuIiwgcHJfc2VjX3N1YnR5cGUoc3Vic2VjdHlwZSkpOwotKwkJCQlzdHJjYXQodG1wLCBsaW5lKTsKLSsJCQkJc3RyY2F0KHRtcCwgIldBUk5JTkc6IHRoZXJlIHdpbGwgYmUgKk5PKiBBdXRoZW50aWNhdGlvbiBvZiB0aGUgVk5DIFNlcnZlci5cbiIpOwotKwkJCQlzdHJjYXQodG1wLCAiV0FSTklORzogSS5lLiBhIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjayBpcyBwb3NzaWJsZS5cbiIpOwotKwkJCQlzdHJjYXQodG1wLCAiV0FSTklORzogQ29uZmlndXJlIHRoZSBzZXJ2ZXIgdG8gdXNlIFg1MDkgY2VydHMgYW5kIHZlcmlmeSB0aGVtLlxuXG4iKTsKLSsJCQkJd21zZyh0bXAsIDEpOwotKwkJCX0KLSsJCQlpZiAoc3Vic2VjdHlwZSA9PSByZmJWZW5jcnlwdFRsc1BsYWluIHx8IHN1YnNlY3R5cGUgPT0gcmZiVmVuY3J5cHRYNTA5UGxhaW4pIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJcblZlTkNyeXB0IFBsYWluICh1c2VybmFtZSArIHBhc3N3ZCkgc2VsZWN0ZWQuXG5cbiIpOwotKwkJCQlpZiAoYXBwRGF0YS51bml4UFcgIT0gTlVMTCkgewotKwkJCQkJdW5peHB3KGFwcERhdGEudW5peFBXLCAxKTsKLSsJCQkJfSBlbHNlIGlmIChnZXRlbnYoIlNTVk5DX1VOSVhQVyIpKSB7Ci0rCQkJCQl1bml4cHcoZ2V0ZW52KCJTU1ZOQ19VTklYUFciKSwgMSk7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQl1bml4cHcoIi4iLCAxKTsKLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsJfQotKwotKwlzd2l0Y2ggKHNlY1R5cGUpIHsKLSsJCWNhc2UgcmZiU2VjVHlwZU5vbmU6Ci0rCQkJZnByaW50ZihzdGRlcnIsICJObyBWTkMgYXV0aGVudGljYXRpb24gbmVlZGVkXG4iKTsKLSsJCQlpZiAodmlld2VyX21pbm9yID49IDgpIHsKLSsJCQkJQ0FSRDMyIGF1dGhSZXN1bHQ7Ci0rCi0rCQkJCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmYXV0aFJlc3VsdCwgNCkpIHsKLSsJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJfQotKwotKwkJCQlhdXRoUmVzdWx0ID0gU3dhcDMySWZMRShhdXRoUmVzdWx0KTsKLSsKLSsJCQkJaWYgKGF1dGhSZXN1bHQgPT0gcmZiVm5jQXV0aE9LKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlZOQyBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQgKCVkKSBmb3IgcmZiU2VjVHlwZU5vbmUgKFJGQiAzLjgpXG4iLCAoaW50KSBhdXRoUmVzdWx0KTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCXNwcmludGYobXNnYnVmLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAoJWQpIGZvciByZmJTZWNUeXBlTm9uZSAoUkZCIDMuOClcblxuIiwgKGludCkgYXV0aFJlc3VsdCk7Ci0rCQkJCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQl9Ci0rCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotKwkJCWJyZWFrOwotKwkJY2FzZSByZmJTZWNUeXBlVm5jQXV0aDoKLSsJCQlpZiAoIUF1dGhlbnRpY2F0ZVZOQygpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQljYXNlIHJmYlNlY1R5cGVUaWdodDoKLSsJCQl0aWdodFZuY1Byb3RvY29sID0gVHJ1ZTsKLSsJCQlJbml0Q2FwYWJpbGl0aWVzKCk7Ci0rCQkJaWYgKCFTZXR1cFR1bm5lbGluZygpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCQkJaWYgKCFQZXJmb3JtQXV0aGVudGljYXRpb25UaWdodCgpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQljYXNlIHJmYlVsdHJhVm5jTXNMb2dvbjoKLSsJCQlpZiAoIUF1dGhVbHRyYVZuY01zTG9nb24oKSkgewotKwkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJfQotKwkJCWJyZWFrOwotKwkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotKwkJCXNwcmludGYobXNnYnVmLCAiSW50ZXJuYWwgZXJyb3I6IEludmFsaWQgc2VjdXJpdHkgdHlwZTogJWRcbiIsIHNlY1R5cGUpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsKLSsJY29ubmVjdF90aW1lID0gZG5vdygpOwotKwotKwljaS5zaGFyZWQgPSAoYXBwRGF0YS5zaGFyZURlc2t0b3AgPyAxIDogMCk7Ci0rCi0rCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjaSwgc3pfcmZiQ2xpZW50SW5pdE1zZykpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnNpLCBzel9yZmJTZXJ2ZXJJbml0TXNnKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCi0rCXNpLmZyYW1lYnVmZmVyV2lkdGggPSBTd2FwMTZJZkxFKHNpLmZyYW1lYnVmZmVyV2lkdGgpOwotKwlzaS5mcmFtZWJ1ZmZlckhlaWdodCA9IFN3YXAxNklmTEUoc2kuZnJhbWVidWZmZXJIZWlnaHQpOwotKwlzaS5mb3JtYXQucmVkTWF4ID0gU3dhcDE2SWZMRShzaS5mb3JtYXQucmVkTWF4KTsKLSsJc2kuZm9ybWF0LmdyZWVuTWF4ID0gU3dhcDE2SWZMRShzaS5mb3JtYXQuZ3JlZW5NYXgpOwotKwlzaS5mb3JtYXQuYmx1ZU1heCA9IFN3YXAxNklmTEUoc2kuZm9ybWF0LmJsdWVNYXgpOwotKwlzaS5uYW1lTGVuZ3RoID0gU3dhcDMySWZMRShzaS5uYW1lTGVuZ3RoKTsKLSsKLSsJaWYgKGFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCXNpLmZyYW1lYnVmZmVyV2lkdGggPSAzMjsKLSsJCXNpLmZyYW1lYnVmZmVySGVpZ2h0ID0gMzI7Ci0rCX0KLSsKLSsJLyogRklYTUU6IENoZWNrIGFyZ3VtZW50cyB0byBtYWxsb2MoKSBjYWxscy4gKi8KLSsJZGVza3RvcE5hbWUgPSBtYWxsb2Moc2kubmFtZUxlbmd0aCArIDEpOwotKwltZW1zZXQoZGVza3RvcE5hbWUsIDAsIHNpLm5hbWVMZW5ndGggKyAxKTsKLSsJaWYgKCFkZXNrdG9wTmFtZSkgewotKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgZGVza3RvcCBuYW1lLCAlbHUgYnl0ZXNcbiIsCi0rCQkgICAgKHVuc2lnbmVkIGxvbmcpc2kubmFtZUxlbmd0aCk7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihkZXNrdG9wTmFtZSwgc2kubmFtZUxlbmd0aCkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwotKwlkZXNrdG9wTmFtZVtzaS5uYW1lTGVuZ3RoXSA9IDA7Ci0rCi0rCWlmIChhcHBEYXRhLmFwcFNoYXJlKSB7Ci0rCQlpbnQgeF9oaW50LCB5X2hpbnQ7Ci0rCQljaGFyICpwLCAqcSA9IE5VTEw7Ci0rCQlwID0gZGVza3RvcE5hbWU7Ci0rCQl3aGlsZSAoKnAgIT0gJ1wwJykgewotKyAJCQljaGFyICp0ID0gc3Ryc3RyKHAsICIgWFk9Iik7Ci0rCQkJaWYgKHQpIHEgPSB0OwotKwkJCXArKzsKLSsJCX0KLSsJCWlmIChxKSB7Ci0rCQkJaW50IG9rID0gMTsKLSsJCQlwID0gcSArIHN0cmxlbigiIFhZPSIpOwotKwkJCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0rCQkJCWlmICghc3RycGJyayhwLCAiMDEyMzQ1Njc4OSwrLSIpKSB7Ci0rCQkJCQlvayA9IDA7Ci0rCQkJCX0KLSsJCQkJcCsrOwotKwkJCX0KLSsJCQlpZiAob2sgJiYgc3NjYW5mKHErMSwgIlhZPSVkLCVkIiwgJnhfaGludCwgJnlfaGludCkgPT0gMikgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwiVXNpbmcgeDExdm5jIGFwcHNoYXJlIHBvc2l0aW9uOiAlc1xuXG4iLCBxKTsKLSsJCQkJKnEgPSAnXDAnOwotKwkJCQlhcHBzaGFyZV94X2hpbnQgPSB4X2hpbnQ7Ci0rCQkJCWFwcHNoYXJlX3lfaGludCA9IHlfaGludDsKLSsJCQl9Ci0rCQl9Ci0rCX0KLSsKLSsJZnByaW50ZihzdGRlcnIsIkRlc2t0b3AgbmFtZSBcIiVzXCJcblxuIiwgZGVza3RvcE5hbWUpOwotKwotKwlmcHJpbnRmKHN0ZGVyciwiVk5DIHNlcnZlciBkZWZhdWx0IGZvcm1hdDpcbiIpOwotKwlQcmludFBpeGVsRm9ybWF0KCZzaS5mb3JtYXQpOwotKwotKwlpZiAodGlnaHRWbmNQcm90b2NvbCkgewotKwkJLyogUmVhZCBpbnRlcmFjdGlvbiBjYXBhYmlsaXRpZXMgKHByb3RvY29sIDMuN3QpICovCi0rCQlpZiAoIVJlYWRJbnRlcmFjdGlvbkNhcHMoKSkgewotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJfQotKwotKwlyZXR1cm4gVHJ1ZTsKLSB9Ci0gCi0gCi0gLyoKLS0gKiBSZWFkIHNlY3VyaXR5IHR5cGUgZnJvbSB0aGUgc2VydmVyIChwcm90b2NvbCB2ZXJzaW9uIDMuMykKLSsgKiBSZWFkIHNlY3VyaXR5IHR5cGUgZnJvbSB0aGUgc2VydmVyIChwcm90b2NvbCAzLjMpCi0gICovCi0gCi0gc3RhdGljIGludAotIFJlYWRTZWN1cml0eVR5cGUodm9pZCkKLSB7Ci0tICBDQVJEMzIgc2VjVHlwZTsKLSsJQ0FSRDMyIHNlY1R5cGU7Ci0gCi0tICAvKiBSZWFkIHRoZSBzZWN1cml0eSB0eXBlICovCi0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnNlY1R5cGUsIHNpemVvZihzZWNUeXBlKSkpCi0tICAgIHJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLSsJLyogUmVhZCB0aGUgc2VjdXJpdHkgdHlwZSAqLwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnNlY1R5cGUsIHNpemVvZihzZWNUeXBlKSkpIHsKLSsJCXJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLSsJfQotKwlkdF9vdXQgPSBkbm93KCk7Ci0gCi0tICBzZWNUeXBlID0gU3dhcDMySWZMRShzZWNUeXBlKTsKLSsJc2VjVHlwZSA9IFN3YXAzMklmTEUoc2VjVHlwZSk7Ci0gCi0tICBpZiAoc2VjVHlwZSA9PSByZmJTZWNUeXBlSW52YWxpZCkgewotLSAgICBSZWFkQ29ubkZhaWxlZFJlYXNvbigpOwotLSAgICByZXR1cm4gcmZiU2VjVHlwZUludmFsaWQ7Ci0tICB9Ci0rCWlmIChzZWNUeXBlID09IHJmYlNlY1R5cGVJbnZhbGlkKSB7Ci0rCQlSZWFkQ29ubkZhaWxlZFJlYXNvbigpOwotKwkJcmV0dXJuIHJmYlNlY1R5cGVJbnZhbGlkOwotKwl9Ci0gCi0tICBpZiAoc2VjVHlwZSAhPSByZmJTZWNUeXBlTm9uZSAmJiBzZWNUeXBlICE9IHJmYlNlY1R5cGVWbmNBdXRoKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBzZWN1cml0eSB0eXBlIGZyb20gUkZCIHNlcnZlcjogJWRcbiIsCi0tICAgICAgICAgICAgKGludClzZWNUeXBlKTsKLS0gICAgcmV0dXJuIHJmYlNlY1R5cGVJbnZhbGlkOwotLSAgfQotKwlpZiAoc2VjVHlwZSA9PSByZmJTZWNUeXBlTm9uZSkgewotKwkJOwkvKiBPSyAqLwotKwl9IGVsc2UgaWYgKHNlY1R5cGUgPT0gcmZiU2VjVHlwZVZuY0F1dGgpIHsKLSsJCTsJLyogT0sgKi8KLSsJfSBlbHNlIGlmIChzZWNUeXBlID09IHJmYlVsdHJhVm5jTXNMb2dvbikgewotKwkJOwkvKiBPSyAqLwotKwl9IGVsc2UgewotKwkJc3ByaW50Zihtc2didWYsICJVbmtub3duIHNlY3VyaXR5IHR5cGUgZnJvbSBSRkIgc2VydmVyOiAlZFxuIiwgKGludClzZWNUeXBlKTsKLSsJCXdtc2cobXNnYnVmLCAxKTsKLSsJCXJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLSsJfQotIAotLSAgcmV0dXJuIChpbnQpc2VjVHlwZTsKLSsJcmV0dXJuIChpbnQpc2VjVHlwZTsKLSB9Ci0gCi0gCi0gLyoKLS0gKiBTZWxlY3Qgc2VjdXJpdHkgdHlwZSBmcm9tIHRoZSBzZXJ2ZXIncyBsaXN0IChwcm90b2NvbCB2ZXJzaW9uIDMuNykKLSsgKiBTZWxlY3Qgc2VjdXJpdHkgdHlwZSBmcm9tIHRoZSBzZXJ2ZXIncyBsaXN0IChwcm90b2NvbCAzLjcpCi0gICovCi0gCi0gc3RhdGljIGludAotIFNlbGVjdFNlY3VyaXR5VHlwZSh2b2lkKQotIHsKLS0gIENBUkQ4IG5TZWNUeXBlczsKLS0gIGNoYXIgKnNlY1R5cGVOYW1lc1tdID0geyJOb25lIiwgIlZuY0F1dGgifTsKLS0gIENBUkQ4IGtub3duU2VjVHlwZXNbXSA9IHtyZmJTZWNUeXBlTm9uZSwgcmZiU2VjVHlwZVZuY0F1dGh9OwotLSAgaW50IG5Lbm93blNlY1R5cGVzID0gc2l6ZW9mKGtub3duU2VjVHlwZXMpOwotLSAgQ0FSRDggKnNlY1R5cGVzOwotLSAgQ0FSRDggc2VjVHlwZSA9IHJmYlNlY1R5cGVJbnZhbGlkOwotLSAgaW50IGksIGo7Ci0tCi0tICAvKiBSZWFkIHRoZSBsaXN0IG9mIHNlY3V0aXJ5IHR5cGVzLiAqLwotLSAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZuU2VjVHlwZXMsIHNpemVvZihuU2VjVHlwZXMpKSkKLS0gICAgcmV0dXJuIHJmYlNlY1R5cGVJbnZhbGlkOwotLQotLSAgaWYgKG5TZWNUeXBlcyA9PSAwKSB7Ci0tICAgIFJlYWRDb25uRmFpbGVkUmVhc29uKCk7Ci0tICAgIHJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLS0gIH0KLSsJQ0FSRDggblNlY1R5cGVzOwotKwljaGFyICpzZWNUeXBlTmFtZXNbXSA9IHsiTm9uZSIsICJWbmNBdXRoIn07Ci0rCUNBUkQ4IGtub3duU2VjVHlwZXNbXSA9IHtyZmJTZWNUeXBlTm9uZSwgcmZiU2VjVHlwZVZuY0F1dGh9OwotKwlpbnQgbktub3duU2VjVHlwZXMgPSBzaXplb2Yoa25vd25TZWNUeXBlcyk7Ci0rCUNBUkQ4ICpzZWNUeXBlczsKLSsJQ0FSRDggc2VjVHlwZSA9IHJmYlNlY1R5cGVJbnZhbGlkOwotKwlpbnQgaSwgajsKLSsKLSsJaWYgKHNlY1R5cGVOYW1lcykge30KLSsKLSsJLyogUmVhZCB0aGUgbGlzdCBvZiBzZWN1cml0eSB0eXBlcy4gKi8KLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZuU2VjVHlwZXMsIHNpemVvZihuU2VjVHlwZXMpKSkgewotKwkJcmV0dXJuIHJmYlNlY1R5cGVJbnZhbGlkOwotKwl9Ci0rCWR0X291dCA9IGRub3coKTsKLSAKLS0gIHNlY1R5cGVzID0gbWFsbG9jKG5TZWNUeXBlcyk7Ci0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopc2VjVHlwZXMsIG5TZWNUeXBlcykpCi0tICAgIHJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLS0KLS0gIC8qIEZpbmQgb3V0IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgVGlnaHRWTkMgcHJvdG9jb2wgZXh0ZW5zaW9ucyAqLwotLSAgZm9yIChqID0gMDsgaiA8IChpbnQpblNlY1R5cGVzOyBqKyspIHsKLS0gICAgaWYgKHNlY1R5cGVzW2pdID09IHJmYlNlY1R5cGVUaWdodCkgewotLSAgICAgIGZyZWUoc2VjVHlwZXMpOwotLSAgICAgIHNlY1R5cGUgPSByZmJTZWNUeXBlVGlnaHQ7Ci0tICAgICAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnNlY1R5cGUsIHNpemVvZihzZWNUeXBlKSkpCi0tICAgICAgICByZXR1cm4gcmZiU2VjVHlwZUludmFsaWQ7Ci0tICAgICAgZnByaW50ZihzdGRlcnIsICJFbmFibGluZyBUaWdodFZOQyBwcm90b2NvbCBleHRlbnNpb25zXG4iKTsKLS0gICAgICByZXR1cm4gcmZiU2VjVHlwZVRpZ2h0OwotLSAgICB9Ci0tICB9Ci0rCWlmIChuU2VjVHlwZXMgPT0gMCkgewotKwkJUmVhZENvbm5GYWlsZWRSZWFzb24oKTsKLSsJCXJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLSsJfQotIAotLSAgLyogRmluZCBmaXJzdCBzdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZSAqLwotLSAgZm9yIChqID0gMDsgaiA8IChpbnQpblNlY1R5cGVzOyBqKyspIHsKLS0gICAgZm9yIChpID0gMDsgaSA8IG5Lbm93blNlY1R5cGVzOyBpKyspIHsKLS0gICAgICBpZiAoc2VjVHlwZXNbal0gPT0ga25vd25TZWNUeXBlc1tpXSkgewotLSAgICAgICAgc2VjVHlwZSA9IHNlY1R5cGVzW2pdOwotLSAgICAgICAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnNlY1R5cGUsIHNpemVvZihzZWNUeXBlKSkpIHsKLS0gICAgICAgICAgZnJlZShzZWNUeXBlcyk7Ci0tICAgICAgICAgIHJldHVybiByZmJTZWNUeXBlSW52YWxpZDsKLS0gICAgICAgIH0KLS0gICAgICAgIGJyZWFrOwotLSAgICAgIH0KLS0gICAgfQotLSAgICBpZiAoc2VjVHlwZSAhPSByZmJTZWNUeXBlSW52YWxpZCkgYnJlYWs7Ci0tICB9Ci0rCXNlY1R5cGVzID0gbWFsbG9jKG5TZWNUeXBlcyk7Ci0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKilzZWNUeXBlcywgblNlY1R5cGVzKSkgewotKwkJcmV0dXJuIHJmYlNlY1R5cGVJbnZhbGlkOwotKwl9Ci0rCi0rCWlmIChnZXRlbnYoIlNTVk5DX0RFQlVHX1NFQ19UWVBFUyIpKSB7Ci0rCQlmb3IgKGogPSAwOyBqIDwgKGludCluU2VjVHlwZXM7IGorKykgewotKwkJCWZwcmludGYoc3RkZXJyLCAic2VjLXR5cGVbJWRdICVkXG4iLCBqLCAoaW50KSBzZWNUeXBlc1tqXSk7Ci0rCQl9Ci0rCX0KLSsKLSsJLyogRmluZCBvdXQgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBUaWdodFZOQyBwcm90b2NvbCBleHRlbnNpb25zICovCi0rCWZvciAoaiA9IDA7IGogPCAoaW50KW5TZWNUeXBlczsgaisrKSB7Ci0rCQlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfTk9fU0VDX1RZUEVfVElHSFQiKSkgewotKwkJCWJyZWFrOwotKwkJfQotKwkJaWYgKGdldGVudigiU1NWTkNfTk9fU0VDX1RZUEVfVElHSFQiKSkgewotKwkJCWJyZWFrOwotKwkJfQotKyNpZmRlZiBUVVJCT1ZOQwotKwkJYnJlYWs7Ci0rI2VuZGlmCi0rCQlpZiAoc2VjVHlwZXNbal0gPT0gcmZiU2VjVHlwZVRpZ2h0KSB7Ci0rCQkJZnJlZShzZWNUeXBlcyk7Ci0rCQkJc2VjVHlwZSA9IHJmYlNlY1R5cGVUaWdodDsKLSsJCQlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmc2VjVHlwZSwgc2l6ZW9mKHNlY1R5cGUpKSkgewotKwkJCQlyZXR1cm4gcmZiU2VjVHlwZUludmFsaWQ7Ci0rCQkJfQotKwkJCWZwcmludGYoc3RkZXJyLCAiRW5hYmxpbmcgVGlnaHRWTkMgcHJvdG9jb2wgZXh0ZW5zaW9uc1xuIik7Ci0rCQkJcmV0dXJuIHJmYlNlY1R5cGVUaWdodDsKLSsJCX0KLSsJfQotKwotKwkvKiBGaW5kIGZpcnN0IHN1cHBvcnRlZCBzZWN1cml0eSB0eXBlICovCi0rCWZvciAoaiA9IDA7IGogPCAoaW50KW5TZWNUeXBlczsgaisrKSB7Ci0rCQlmb3IgKGkgPSAwOyBpIDwgbktub3duU2VjVHlwZXM7IGkrKykgewotKwkJCWlmIChzZWNUeXBlc1tqXSA9PSBrbm93blNlY1R5cGVzW2ldKSB7Ci0rCQkJCXNlY1R5cGUgPSBzZWNUeXBlc1tqXTsKLSsJCQkJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnNlY1R5cGUsIHNpemVvZihzZWNUeXBlKSkpIHsKLSsJCQkJICBmcmVlKHNlY1R5cGVzKTsKLSsJCQkJICByZXR1cm4gcmZiU2VjVHlwZUludmFsaWQ7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJCX0KLSsJCX0KLSsJCWlmIChzZWNUeXBlICE9IHJmYlNlY1R5cGVJbnZhbGlkKSB7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSAKLS0gIGZyZWUoc2VjVHlwZXMpOwotKwlpZiAoc2VjVHlwZSA9PSByZmJTZWNUeXBlSW52YWxpZCkgewotKwkJZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgZGlkIG5vdCBvZmZlciBzdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZTpcbiIpOwotKwkJZm9yIChqID0gMDsgaiA8IChpbnQpblNlY1R5cGVzOyBqKyspIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIiAgc2VjdHlwZVslZF0gJWRcbiIsIGosIChpbnQpIHNlY1R5cGVzW2pdKTsKLSsJCX0KLSsJfQotIAotLSAgaWYgKHNlY1R5cGUgPT0gcmZiU2VjVHlwZUludmFsaWQpCi0tICAgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyIGRpZCBub3Qgb2ZmZXIgc3VwcG9ydGVkIHNlY3VyaXR5IHR5cGVcbiIpOwotKwlmcmVlKHNlY1R5cGVzKTsKLSAKLS0gIHJldHVybiAoaW50KXNlY1R5cGU7Ci0rCXJldHVybiAoaW50KXNlY1R5cGU7Ci0gfQotIAotIAotQEAgLTQ1MSw2ICsxMTQxLDkgQEAKLSAgIHJldHVybiBUcnVlOwotIH0KLSAKLStzdGF0aWMgY2hhciAqcmVzdGFydF9zZXNzaW9uX3B3ID0gTlVMTDsKLStzdGF0aWMgaW50IHJlc3RhcnRfc2Vzc2lvbl9sZW4gPSAwOwotKwotIAotIC8qCi0gICogTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSAocHJvdG9jb2wgdmVyc2lvbiAzLjd0KQotQEAgLTQ1OSw1OCArMTE1Miw0MDYgQEAKLSBzdGF0aWMgQm9vbAotIFBlcmZvcm1BdXRoZW50aWNhdGlvblRpZ2h0KHZvaWQpCi0gewotLSAgcmZiQXV0aGVudGljYXRpb25DYXBzTXNnIGNhcHM7Ci0tICBDQVJEMzIgYXV0aFNjaGVtZTsKLS0gIGludCBpOwotKwlyZmJBdXRoZW50aWNhdGlvbkNhcHNNc2cgY2FwczsKLSsJQ0FSRDMyIGF1dGhTY2hlbWU7Ci0rCWludCBpOwotIAotLSAgLyogSW4gdGhlIHByb3RvY29sIHZlcnNpb24gMy43dCwgdGhlIHNlcnZlciBpbmZvcm1zIHVzIGFib3V0IHN1cHBvcnRlZAotLSAgICAgYXV0aGVudGljYXRpb24gc2NoZW1lcy4gSGVyZSB3ZSByZWFkIHRoaXMgaW5mb3JtYXRpb24uICovCi0rCS8qIEluIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDMuN3QsIHRoZSBzZXJ2ZXIgaW5mb3JtcyB1cyBhYm91dCBzdXBwb3J0ZWQKLSsJYXV0aGVudGljYXRpb24gc2NoZW1lcy4gSGVyZSB3ZSByZWFkIHRoaXMgaW5mb3JtYXRpb24uICovCi0gCi0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJmNhcHMsIHN6X3JmYkF1dGhlbnRpY2F0aW9uQ2Fwc01zZykpCi0tICAgIHJldHVybiBGYWxzZTsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZjYXBzLCBzel9yZmJBdXRoZW50aWNhdGlvbkNhcHNNc2cpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIGNhcHMubkF1dGhUeXBlcyA9IFN3YXAzMklmTEUoY2Fwcy5uQXV0aFR5cGVzKTsKLSsJY2Fwcy5uQXV0aFR5cGVzID0gU3dhcDMySWZMRShjYXBzLm5BdXRoVHlwZXMpOwotIAotLSAgaWYgKCFjYXBzLm5BdXRoVHlwZXMpIHsKLS0gICAgZnByaW50ZihzdGRlcnIsICJObyBhdXRoZW50aWNhdGlvbiBuZWVkZWRcbiIpOwotLSAgICByZXR1cm4gVHJ1ZTsKLS0gIH0KLSsJaWYgKCFjYXBzLm5BdXRoVHlwZXMpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiTm8gVk5DIGF1dGhlbnRpY2F0aW9uIG5lZWRlZFxuXG4iKTsKLSsJCWlmICh2aWV3ZXJfbWlub3IgPj0gOCkgewotKwkJCUNBUkQzMiBhdXRoUmVzdWx0OwotKwotKwkJCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmYXV0aFJlc3VsdCwgNCkpIHsKLSsJCQkJcmV0dXJuIEZhbHNlOwotKwkJCX0KLSsKLSsJCQlhdXRoUmVzdWx0ID0gU3dhcDMySWZMRShhdXRoUmVzdWx0KTsKLSsKLSsJCQlpZiAoYXV0aFJlc3VsdCA9PSByZmJWbmNBdXRoT0spIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJWTkMgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkICglZCkgZm9yIFBlcmZvcm1BdXRoZW50aWNhdGlvblRpZ2h0IHJmYlNlY1R5cGVOb25lIChSRkIgMy44KVxuIiwgKGludCkgYXV0aFJlc3VsdCk7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJc3ByaW50Zihtc2didWYsICJWTkMgYXV0aGVudGljYXRpb24gZmFpbGVkICglZCkgZm9yIFBlcmZvcm1BdXRoZW50aWNhdGlvblRpZ2h0IHJmYlNlY1R5cGVOb25lIChSRkIgMy44KVxuXG4iLCAoaW50KSBhdXRoUmVzdWx0KTsKLSsJCQkJd21zZyhtc2didWYsIDEpOwotKwkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJfQotKwkJfQotKwkJcmV0dXJuIFRydWU7Ci0rCX0KLSAKLS0gIGlmICghUmVhZENhcGFiaWxpdHlMaXN0KGF1dGhDYXBzLCBjYXBzLm5BdXRoVHlwZXMpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCWlmICghUmVhZENhcGFiaWxpdHlMaXN0KGF1dGhDYXBzLCBjYXBzLm5BdXRoVHlwZXMpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIC8qIFByZWZlciBVbml4IGxvZ2luIGF1dGhlbnRpY2F0aW9uIGlmIGEgdXNlciBuYW1lIHdhcyBnaXZlbi4gKi8KLS0gIGlmIChhcHBEYXRhLnVzZXJMb2dpbiAmJiBDYXBzSXNFbmFibGVkKGF1dGhDYXBzLCByZmJBdXRoVW5peExvZ2luKSkgewotLSAgICBhdXRoU2NoZW1lID0gU3dhcDMySWZMRShyZmJBdXRoVW5peExvZ2luKTsKLS0gICAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJmF1dGhTY2hlbWUsIHNpemVvZihhdXRoU2NoZW1lKSkpCi0tICAgICAgcmV0dXJuIEZhbHNlOwotLSAgICByZXR1cm4gQXV0aGVudGljYXRlVW5peExvZ2luKCk7Ci0tICB9Ci0rCS8qIFByZWZlciBVbml4IGxvZ2luIGF1dGhlbnRpY2F0aW9uIGlmIGEgdXNlciBuYW1lIHdhcyBnaXZlbi4gKi8KLSsJaWYgKGFwcERhdGEudXNlckxvZ2luICYmIENhcHNJc0VuYWJsZWQoYXV0aENhcHMsIHJmYkF1dGhVbml4TG9naW4pKSB7Ci0rCQlhdXRoU2NoZW1lID0gU3dhcDMySWZMRShyZmJBdXRoVW5peExvZ2luKTsKLSsJCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZhdXRoU2NoZW1lLCBzaXplb2YoYXV0aFNjaGVtZSkpKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwkJcmV0dXJuIEF1dGhlbnRpY2F0ZVVuaXhMb2dpbigpOwotKwl9Ci0gCi0tICAvKiBPdGhlcndpc2UsIHRyeSBzZXJ2ZXIncyBwcmVmZXJyZWQgYXV0aGVudGljYXRpb24gc2NoZW1lLiAqLwotLSAgZm9yIChpID0gMDsgaSA8IENhcHNOdW1FbmFibGVkKGF1dGhDYXBzKTsgaSsrKSB7Ci0tICAgIGF1dGhTY2hlbWUgPSBDYXBzR2V0QnlPcmRlcihhdXRoQ2FwcywgaSk7Ci0tICAgIGlmIChhdXRoU2NoZW1lICE9IHJmYkF1dGhVbml4TG9naW4gJiYgYXV0aFNjaGVtZSAhPSByZmJBdXRoVk5DKQotLSAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgLyogdW5rbm93biBzY2hlbWUgLSBjYW5ub3QgdXNlIGl0ICovCi0tICAgIGF1dGhTY2hlbWUgPSBTd2FwMzJJZkxFKGF1dGhTY2hlbWUpOwotLSAgICBpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmYXV0aFNjaGVtZSwgc2l6ZW9mKGF1dGhTY2hlbWUpKSkKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0tICAgIGF1dGhTY2hlbWUgPSBTd2FwMzJJZkxFKGF1dGhTY2hlbWUpOyAvKiBjb252ZXJ0IGl0IGJhY2sgKi8KLS0gICAgaWYgKGF1dGhTY2hlbWUgPT0gcmZiQXV0aFVuaXhMb2dpbikgewotLSAgICAgIHJldHVybiBBdXRoZW50aWNhdGVVbml4TG9naW4oKTsKLS0gICAgfSBlbHNlIGlmIChhdXRoU2NoZW1lID09IHJmYkF1dGhWTkMpIHsKLS0gICAgICByZXR1cm4gQXV0aGVudGljYXRlVk5DKCk7Ci0tICAgIH0gZWxzZSB7Ci0tICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KLS0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkFzc2VydGlvbiBmYWlsZWQ6IHVua25vd24gYXV0aGVudGljYXRpb24gc2NoZW1lXG4iKTsKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0tICAgIH0KLS0gIH0KLSsJLyogT3RoZXJ3aXNlLCB0cnkgc2VydmVyJ3MgcHJlZmVycmVkIGF1dGhlbnRpY2F0aW9uIHNjaGVtZS4gKi8KLSsJZm9yIChpID0gMDsgaSA8IENhcHNOdW1FbmFibGVkKGF1dGhDYXBzKTsgaSsrKSB7Ci0rCQlhdXRoU2NoZW1lID0gQ2Fwc0dldEJ5T3JkZXIoYXV0aENhcHMsIGkpOwotKwkJaWYgKGF1dGhTY2hlbWUgIT0gcmZiQXV0aFVuaXhMb2dpbiAmJiBhdXRoU2NoZW1lICE9IHJmYkF1dGhWTkMpIHsKLSsJCQljb250aW51ZTsgICAgICAgICAgICAgICAgIC8qIHVua25vd24gc2NoZW1lIC0gY2Fubm90IHVzZSBpdCAqLwotKwkJfQotKwkJYXV0aFNjaGVtZSA9IFN3YXAzMklmTEUoYXV0aFNjaGVtZSk7Ci0rCQlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmYXV0aFNjaGVtZSwgc2l6ZW9mKGF1dGhTY2hlbWUpKSkgewotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCWF1dGhTY2hlbWUgPSBTd2FwMzJJZkxFKGF1dGhTY2hlbWUpOyAvKiBjb252ZXJ0IGl0IGJhY2sgKi8KLSsJCWlmIChhdXRoU2NoZW1lID09IHJmYkF1dGhVbml4TG9naW4pIHsKLSsJCQlyZXR1cm4gQXV0aGVudGljYXRlVW5peExvZ2luKCk7Ci0rCQl9IGVsc2UgaWYgKGF1dGhTY2hlbWUgPT0gcmZiQXV0aFZOQykgewotKwkJCXJldHVybiBBdXRoZW50aWNhdGVWTkMoKTsKLSsJCX0gZWxzZSB7Ci0rCQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KLSsJCQlmcHJpbnRmKHN0ZGVyciwgIkFzc2VydGlvbiBmYWlsZWQ6IHVua25vd24gYXV0aGVudGljYXRpb24gc2NoZW1lXG4iKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCX0KLSAKLS0gIGZwcmludGYoc3RkZXJyLCAiTm8gc3VpdGFibGUgYXV0aGVudGljYXRpb24gc2NoZW1lcyBvZmZlcmVkIGJ5IHNlcnZlclxuIik7Ci0tICByZXR1cm4gRmFsc2U7Ci0rCXNwcmludGYobXNnYnVmLCAiTm8gc3VpdGFibGUgYXV0aGVudGljYXRpb24gc2NoZW1lcyBvZmZlcmVkIGJ5IHNlcnZlclxuIik7Ci0rCXdtc2cobXNnYnVmLCAxKTsKLSsJcmV0dXJuIEZhbHNlOwotK30KLSsKLSsjaWYgMAotK3Vuc2lnbmVkIGNoYXIgZW5jUGFzc3dkWzhdOwotK3Vuc2lnbmVkIGNoYXIgZW5jUGFzc3dkX01TTE9HT05bMzJdOwotK2NoYXIgY2xlYXJQYXNzd2RfTVNMT0dJTlsyNTZdOwotK3N0YXRpYyBCb29sIG9sZF91bHRyYXZuY19tc2xvZ29uX2NvZGUodm9pZCkgewotKwljaGFyICpwYXNzd2QgPSBOVUxMOwotKwlDQVJEOCBjaGFsbGVuZ2VfbXNsb2dvbltDSEFMTEVOR0VTSVpFX01TTE9HT05dOwotKwotKwkvKiBjb2RlIGZyb20gdGhlIG9sZCB1dm5jIHdheSAoMS4wLjI/KSB0aGF0IHdvdWxkIGdvIGludG8gQXV0aGVudGljYXRlVk5DKCkgdGVtcGxhdGUgKi8KLSsJCi0rCWlmIChhcHBEYXRhLm1zTG9nb24gIT0gTlVMTCkgewotKwkJcmFpc2VtZSgxKTsKLSsJCWlmICghc3RyY21wKGFwcERhdGEubXNMb2dvbiwgIjEiKSkgewotKwkJCWNoYXIgdG1wWzI1Nl07Ci0rCQkJZnByaW50ZihzdGRlcnIsICJcblVsdHJhVk5DIE1TIExvZ29uIFVzZXJuYW1lW0BEb21haW5dOiAiKTsKLSsJCQlpZiAoZmdldHModG1wLCAyNTYsIHN0ZGluKSA9PSBOVUxMKSB7Ci0rCQkJCWV4aXQoMSk7Ci0rCQkJfQotKwkJCWFwcERhdGEubXNMb2dvbiA9IHN0cmR1cCh0bXApOwotKwkJfQotKwkJcGFzc3dkID0gZ2V0cGFzcygiVWx0cmFWTkMgTVMgTG9nb24gUGFzc3dvcmQ6ICIpOwotKwkJaWYgKCEgcGFzc3dkKSB7Ci0rCQkJZXhpdCgxKTsKLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsKLSsJCVV2bmNFbmNyeXB0UGFzc3dkX01TTE9HT04oZW5jUGFzc3dkX01TTE9HT04sIHBhc3N3ZCk7Ci0rCX0KLSsJaWYgKGFwcERhdGEubXNMb2dvbikgewotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKWNoYWxsZW5nZV9tc2xvZ29uLCBDSEFMTEVOR0VTSVpFX01TTE9HT04pKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwl9Ci0rCWlmIChhcHBEYXRhLm1zTG9nb24pIHsKLSsJCWludCBpOwotKwkJY2hhciB0bXBbMjU2XTsKLSsJCWNoYXIgKnEsICpkb21haW4gPSAiLiI7Ci0rCQlmb3IgKGk9MDsgaSA8IDMyOyBpKyspIHsKLSsJCQljaGFsbGVuZ2VfbXNsb2dvbltpXSA9IGVuY1Bhc3N3ZF9NU0xPR09OW2ldIF4gY2hhbGxlbmdlX21zbG9nb25baV07Ci0rCQl9Ci0rCQlxID0gc3RyY2hyKGFwcERhdGEubXNMb2dvbiwgJ0AnKTsKLSsJCWlmIChxKSB7Ci0rCQkJKnEgPSAnXDAnOwotKwkJCWRvbWFpbiA9IHN0cmR1cChxKzEpOwotKwkJfQotKwkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotKwkJc3RyY2F0KHRtcCwgYXBwRGF0YS5tc0xvZ29uKTsKLSsJCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCB0bXAsIDI1NikpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7Ci0rCQlzdHJjYXQodG1wLCBkb21haW4pOwotKwkJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIHRtcCwgMjU2KSkgewotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCW1lbXNldCh0bXAsIDAsIHNpemVvZih0bXApKTsKLSsJCXN0cmNhdCh0bXAsIHBhc3N3ZCk7Ci0rCQlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgdG1wLCBDSEFMTEVOR0VTSVpFX01TTE9HT04pKSB7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwl9Ci0gfQotKyNlbmRpZgotIAotK3N0YXRpYyB2b2lkIGhleHByaW50KGNoYXIgKmxhYmVsLCBjaGFyICpkYXRhLCBpbnQgbGVuKSB7Ci0rCWludCBpOwotKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBsYWJlbCk7Ci0rCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLSsJCXVuc2lnbmVkIGNoYXIgYyA9ICh1bnNpZ25lZCBjaGFyKSBkYXRhW2ldOwotKwkJZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsIChpbnQpIGMpOwotKwkJaWYgKChpKzEpICUgMjAgPT0gMCkgewotKwkJCWZwcmludGYoc3RkZXJyLCAiXG4lczogIiwgbGFiZWwpOwotKwkJfQotKwl9Ci0rCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSt9Ci0rCi0rI2RlZmluZSBESF9NQVhfQklUUyAzMQotK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X2RoID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIDEpIDw8IERIX01BWF9CSVRTOwotKwotK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNfdG9fdWludDY0KGNoYXIgKmJ5dGVzKSB7Ci0rCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQgPSAwOwotKwlpbnQgaTsKLSsKLSsJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLSsJCXJlc3VsdCA8PD0gODsKLSsJCXJlc3VsdCArPSAodW5zaWduZWQgY2hhcikgYnl0ZXNbaV07Ci0rCX0KLSsJcmV0dXJuIHJlc3VsdDsKLSt9Ci0rCi0rc3RhdGljIHZvaWQgdWludDY0X3RvX2J5dGVzKHVuc2lnbmVkIGxvbmcgbG9uZyBuLCBjaGFyICpieXRlcykgewotKwlpbnQgaTsKLSsKLSsJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLSsJCWJ5dGVzW2ldID0gKHVuc2lnbmVkIGNoYXIpIChuID4+ICg4ICogKDcgLSBpKSkpOwotKwl9Ci0rfQotKwotK3N0YXRpYyB2b2lkIHRyeV9pbnZlcnQoY2hhciAqd2lyZXVzZXIsIGNoYXIgKndpcmVwYXNzLCB1bnNpZ25lZCBsb25nIGxvbmcgYWN0dWFsX2tleSkgewotKwlpZiAod2lyZXVzZXIgfHwgd2lyZXBhc3MgfHwgYWN0dWFsX2tleSkge30KLSsJcmV0dXJuOwotK30KLSsKLSsKLStzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIFhwb3dZbW9kTih1bnNpZ25lZCBsb25nIGxvbmcgeCwgdW5zaWduZWQgbG9uZyBsb25nIHksIHVuc2lnbmVkIGxvbmcgbG9uZyBOKSB7Ci0rCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQgPSAxOwotKwl1bnNpZ25lZCBsb25nIGxvbmcgb25lU2hpZnQ2MyA9ICgodW5zaWduZWQgbG9uZyBsb25nKSAxKSA8PCA2MzsKLSsJaW50IGk7Ci0rCi0rCWZvciAoaSA9IDA7IGkgPCA2NDsgeSA8PD0gMSwgaSsrKSB7Ci0rCQlyZXN1bHQgPSByZXN1bHQgKiByZXN1bHQgJSBOOwotKwkJaWYgKHkgJiBvbmVTaGlmdDYzKSB7Ci0rCQkJcmVzdWx0ID0gcmVzdWx0ICogeCAlIE47Ci0rCQl9Ci0rCX0KLSsJcmV0dXJuIHJlc3VsdDsKLSt9Ci0rCi0rLyoKLSsgKiBVbHRyYVZOQyBNUy1Mb2dvbiBhdXRoZW50aWNhdGlvbiAoZm9yIHYxLjAuNSBhbmQgbGF0ZXIuKQotKyAqLwotKwotKy8qCi0rICogTk9URTogVGhlIFVsdHJhVk5DIE1TLUxvZ29uIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBleGNoYW5nZSBpcwotKyAqICAgICAgIFZFUlkgaW5zZWN1cmUuICBJdCBjYW4gYmUgYnJ1dGUgZm9yY2VkIGluIH4yZSs5IG9wZXJhdGlvbnMuCi0rICogICAgICAgSXQncyBub3QgY2xlYXIgd2Ugc2hvdWxkIHN1cHBvcnQgaXQuLi4gIEl0IGlzIG9ubHkgd29ydGggdXNpbmcKLSsgKiAgICAgICBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBubyBvbmUgaXMgc25pZmZpbmcgdGhlIG5ldHdvcmssIGluIHdoaWNoCi0rICogICAgICAgY2FzZSBhbGwgb2YgdGhpcyBESCBleGNoYW5nZSBzZWNyZWN5IGlzIHVubmVjZXNzYXJ5Li4uCi0rICovCi0rCi0rc3RhdGljIEJvb2wgQXV0aFVsdHJhVm5jTXNMb2dvbih2b2lkKSB7Ci0rCUNBUkQzMiBhdXRoUmVzdWx0OwotKwljaGFyIGdlbls4XSwgbW9kWzhdLCBwdWJbOF0sIHJzcFs4XTsKLSsJY2hhciB1c2VyWzI1Nl0sIHBhc3N3ZFs2NF0sICpncHc7Ci0rCXVuc2lnbmVkIGNoYXIga2V5WzhdOwotKwl1bnNpZ25lZCBsb25nIGxvbmcgdWdlbiwgdW1vZCwgdXJzcCwgdXB1YiwgdXBydiwgdWtleTsKLSsJZG91YmxlIG5vdyA9IGRub3coKTsKLSsJaW50IGRiID0gMDsKLSsKLSsJaWYgKGdldGVudigiU1NWTkNfREVCVUdfTVNMT0dPTiIpKSB7Ci0rCQlkYiA9IGF0b2koZ2V0ZW52KCJTU1ZOQ19ERUJVR19NU0xPR09OIikpOwotKwl9Ci0rCi0rCWZwcmludGYoc3RkZXJyLCAiXG5BdXRoVWx0cmFWbmNNc0xvZ29uKClcbiIpOwotKwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGdlbiwgc2l6ZW9mKGdlbikpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJaWYgKGRiKSBoZXhwcmludCgiZ2VuIiwgZ2VuLCBzaXplb2YoZ2VuKSk7Ci0rCi0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIobW9kLCBzaXplb2YobW9kKSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlpZiAoZGIpIGhleHByaW50KCJtb2QiLCBtb2QsIHNpemVvZihtb2QpKTsKLSsJCi0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIocnNwLCBzaXplb2YocnNwKSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlpZiAoZGIpIGhleHByaW50KCJyc3AiLCByc3AsIHNpemVvZihyc3ApKTsKLSsKLSsJdWdlbiA9IGJ5dGVzX3RvX3VpbnQ2NChnZW4pOwotKwl1bW9kID0gYnl0ZXNfdG9fdWludDY0KG1vZCk7Ci0rCXVyc3AgPSBieXRlc190b191aW50NjQocnNwKTsKLSsKLSsJaWYgKGRiKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInVnZW46IDB4JTAxNmxseCAlMTJsbHVcbiIsIHVnZW4sIHVnZW4pOwotKwkJZnByaW50ZihzdGRlcnIsICJ1bW9kOiAweCUwMTZsbHggJTEybGx1XG4iLCB1bW9kLCB1bW9kKTsKLSsJCWZwcmludGYoc3RkZXJyLCAidXJzcDogMHglMDE2bGx4ICUxMmxsdVxuIiwgdXJzcCwgdXJzcCk7Ci0rCX0KLSsKLSsJaWYgKHVnZW4gPiBtYXhfZGgpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAidWdlbjogdG9vIGJpZzogMHglMDE2bGx4XG4iLCB1Z2VuKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwotKwlpZiAodW1vZCA+IG1heF9kaCkgewotKwkJZnByaW50ZihzdGRlcnIsICJ1bW9kOiB0b28gYmlnOiAweCUwMTZsbHhcbiIsIHVtb2QpOwotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCi0rCS8qIG1ha2UgYSByYW5kb20gbG9uZyBsb25nOiAqLwotKwl1cHJ2ID0gMHhmZmZmZmZmZiAqIChub3cgLSAodW5zaWduZWQgaW50KSBub3cpOwotKwl1cHJ2ID0gdXBydiA8PCAzMjsKLSsJdXBydiB8PSAodW5zaWduZWQgbG9uZyBsb25nKSB1cmFuZG9tKCk7Ci0rCXVwcnYgPSB1cHJ2ICUgbWF4X2RoOwotKwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidXBydjogMHglMDE2bGx4ICUxMmxsdVxuIiwgdXBydiwgdXBydik7Ci0rCi0rCXVwdWIgPSBYcG93WW1vZE4odWdlbiwgdXBydiwgdW1vZCk7Ci0rCi0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ1cHViOiAweCUwMTZsbHggJTEybGx1XG4iLCB1cHViLCB1cHViKTsKLSsKLSsJdWludDY0X3RvX2J5dGVzKHVwdWIsIHB1Yik7Ci0rCi0rCWlmIChkYikgaGV4cHJpbnQoInB1YiIsIHB1Yiwgc2l6ZW9mKHB1YikpOwotKwotKwlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKilwdWIsIHNpemVvZihwdWIpKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ3cm90ZSBwdWIuXG4iKTsKLSsKLSsJaWYgKHVyc3AgPiBtYXhfZGgpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAidXJzcDogdG9vIGJpZzogMHglMDE2bGx4XG4iLCB1cnNwKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwotKwl1a2V5ID0gWHBvd1ltb2ROKHVyc3AsIHVwcnYsIHVtb2QpOwotKwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidWtleTogMHglMDE2bGx4ICUxMmxsdVxuIiwgdWtleSwgdWtleSk7Ci0rCi0rCWlmICgxKSAgewotKwkJY2hhciB0bXBbMTAwMDBdOwotKwkJdG1wWzBdID0gJ1wwJzsKLSsJCXN0cmNhdCh0bXAsICJcbiIpOwotKwkJc3RyY2F0KHRtcCwgIldBUk5JTkc6IFRoZSBVbHRyYVZOQyBEaWZmaWUtSGVsbG1hbiBLZXkgaXMgd2VhayAoa2V5IDwgMmUrOSwgaS5lLiAzMSBiaXRzKVxuIik7Ci0rCQlzdHJjYXQodG1wLCAiV0FSTklORzogYW5kIHNvIGFuIGVhdmVzZHJvcHBlciBjb3VsZCByZWNvdmVyIHlvdXIgTVMtTG9nb24gdXNlcm5hbWUgYW5kXG4iKTsKLSsJCXN0cmNhdCh0bXAsICJXQVJOSU5HOiBwYXNzd29yZCB2aWEgYnJ1dGUgZm9yY2UgaW4gYSBmZXcgc2Vjb25kcyBvZiBDUFUgdGltZS4gXG4iKTsKLSsJCXN0cmNhdCh0bXAsICJXQVJOSU5HOiBJZiB0aGlzIGNvbm5lY3Rpb24gaXMgTk9UIGJlaW5nIHR1bm5lbGxlZCB0aHJvdWdoIGEgc2VwYXJhdGUgU1NMIG9yXG4iKTsKLSsJCXN0cmNhdCh0bXAsICJXQVJOSU5HOiBTU0ggZW5jcnlwdGVkIHR1bm5lbCwgY29uc2lkZXIgdGhpbmdzIGNhcmVmdWxseSBiZWZvcmUgcHJvY2VlZGluZy4uLlxuIik7Ci0rCQlzdHJjYXQodG1wLCAiV0FSTklORzogRG8gbm90IGVudGVyIGFuIGltcG9ydGFudCB1c2VybmFtZStwYXNzd29yZCB3aGVuIHByb21wdGVkIGJlbG93IGlmXG4iKTsKLSsJCXN0cmNhdCh0bXAsICJXQVJOSU5HOiB0aGVyZSBpcyBhIHJpc2sgb2YgYW4gZWF2ZXNkcm9wcGVyIHNuaWZmaW5nIHRoaXMgY29ubmVjdGlvbi5cbiIpOwotKwkJc3RyY2F0KHRtcCwgIldBUk5JTkc6IFVsdHJhVk5DIE1TTG9nb24gZW5jcnlwdGlvbiBpcyBWRVJZIHdlYWsuICBZb3UndmUgYmVlbiB3YXJuZWQhXG4iKTsKLSsJCXdtc2codG1wLCAxKTsKLSsJfQotKwotKwl1aW50NjRfdG9fYnl0ZXModWtleSwgKGNoYXIgKikga2V5KTsKLSsKLSsJaWYgKGFwcERhdGEubXNMb2dvbiA9PSBOVUxMIHx8ICFzdHJjbXAoYXBwRGF0YS5tc0xvZ29uLCAiMSIpKSB7Ci0rCQljaGFyIHRtcFsyNTZdLCAqcSwgKnM7Ci0rCQlpZiAoIXVzZV90dHkoKSkgewotKwkJCWZwcmludGYoc3RkZXJyLCAiXG5FbnRlciBVbHRyYVZOQyBNUy1Mb2dvbiBVc2VybmFtZVtARG9tYWluXSBpbiB0aGUgcG9wdXAuXG4iKTsKLSsJCQlzID0gRG9Vc2VyRGlhbG9nKCk7IAotKwkJfSBlbHNlIHsKLSsJCQlyYWlzZW1lKDEpOwotKwkJCWZwcmludGYoc3RkZXJyLCAiXG5VbHRyYVZOQyBNUy1Mb2dvbiBVc2VybmFtZVtARG9tYWluXTogIik7Ci0rCQkJaWYgKGZnZXRzKHRtcCwgMjU2LCBzdGRpbikgPT0gTlVMTCkgewotKwkJCQlleGl0KDEpOwotKwkJCX0KLSsJCQlzID0gc3RyZHVwKHRtcCk7Ci0rCQl9Ci0rCQlxID0gc3RyY2hyKHMsICdcbicpOwotKwkJaWYgKHEpICpxID0gJ1wwJzsKLSsJCWFwcERhdGEubXNMb2dvbiA9IHN0cmR1cChzKTsKLSsJfQotKwotKwlpZiAoIXVzZV90dHkoKSkgewotKwkJZ3B3ID0gRG9QYXNzd29yZERpYWxvZygpOyAKLSsJfSBlbHNlIHsKLSsJCXJhaXNlbWUoMSk7Ci0rCQlncHcgPSBnZXRwYXNzKCJVbHRyYVZOQyBNUy1Mb2dvbiBQYXNzd29yZDogIik7Ci0rCX0KLSsJaWYgKCEgZ3B3KSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJZnByaW50ZihzdGRlcnIsICJcbiIpOwotKwotKwltZW1zZXQodXNlciwgMCwgc2l6ZW9mKHVzZXIpKTsKLSsJc3RybmNweSh1c2VyLCBhcHBEYXRhLm1zTG9nb24sIDI1NSk7Ci0rCi0rCW1lbXNldChwYXNzd2QsIDAsIHNpemVvZihwYXNzd2QpKTsKLSsJc3RybmNweShwYXNzd2QsIGdwdywgNjMpOwotKwotKwlpZiAoZGIgPiAxKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInVzZXI9JyVzJ1xuIiwgdXNlcik7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInBhc3M9JyVzJ1xuIiwgcGFzc3dkKTsKLSsJfQotKwotKwlVdm5jRW5jcnlwdEJ5dGVzMigodW5zaWduZWQgY2hhciAqKSB1c2VyLCAgIHNpemVvZih1c2VyKSwgICBrZXkpOwotKwlVdm5jRW5jcnlwdEJ5dGVzMigodW5zaWduZWQgY2hhciAqKSBwYXNzd2QsIHNpemVvZihwYXNzd2QpLCBrZXkpOwotKwotKwlpZiAoZ2V0ZW52KCJUUllfSU5WRVJUIikpIHsKLSsJCXRyeV9pbnZlcnQodXNlciwgcGFzc3dkLCB1a2V5KTsKLSsJCWV4aXQoMCk7Ci0rCX0KLSsKLSsJaWYgKGRiKSB7Ci0rCQloZXhwcmludCgidXNlciIsIHVzZXIsIHNpemVvZih1c2VyKSk7Ci0rCQloZXhwcmludCgicGFzcyIsIHBhc3N3ZCwgc2l6ZW9mKHBhc3N3ZCkpOwotKwl9Ci0rCi0rCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCB1c2VyLCBzaXplb2YodXNlcikpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndyb3RlIHVzZXIuXG4iKTsKLSsKLSsJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIHBhc3N3ZCwgc2l6ZW9mKHBhc3N3ZCkpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndyb3RlIHBhc3N3ZC5cbiIpOwotKwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopICZhdXRoUmVzdWx0LCA0KSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCWF1dGhSZXN1bHQgPSBTd2FwMzJJZkxFKGF1dGhSZXN1bHQpOwotKwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYXV0aFJlc3VsdDogJWRcbiIsIChpbnQpIGF1dGhSZXN1bHQpOwotKwotKwlzd2l0Y2ggKGF1dGhSZXN1bHQpIHsKLSsJY2FzZSByZmJWbmNBdXRoT0s6Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlVWTkMgTVMtTG9nb24gYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLlxuXG4iKTsKLSsJCWJyZWFrOwotKwljYXNlIHJmYlZuY0F1dGhGYWlsZWQ6Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlVWTkMgTVMtTG9nb24gYXV0aGVudGljYXRpb24gZmFpbGVkLlxuIik7Ci0rCQlpZiAodmlld2VyX21pbm9yID49IDgpIHsKLSsJCQlwcmludEZhaWx1cmVSZWFzb24oKTsKLSsJCX0gZWxzZSB7Ci0rCQkJc3ByaW50Zihtc2didWYsICJVVk5DIE1TLUxvZ29uIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC5cbiIpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJY2FzZSByZmJWbmNBdXRoVG9vTWFueToKLSsJCXNwcmludGYobXNnYnVmLCAiVVZOQyBNUy1Mb2dvbiBhdXRoZW50aWNhdGlvbiBmYWlsZWQgLSB0b28gbWFueSB0cmllcy5cblxuIik7Ci0rCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCWRlZmF1bHQ6Ci0rCQlzcHJpbnRmKG1zZ2J1ZiwgIlVua25vd24gVVZOQyBNUy1Mb2dvbiBhdXRoZW50aWNhdGlvbiByZXN1bHQ6ICVkXG5cbiIsCi0rCQkgICAgKGludClhdXRoUmVzdWx0KTsKLSsJCXdtc2cobXNnYnVmLCAxKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwotKwlyZXR1cm4gVHJ1ZTsKLSt9Ci0gCi0gLyoKLSAgKiBTdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb24uCi1AQCAtNTE5LDgwICsxNTYwLDExOSBAQAotIHN0YXRpYyBCb29sCi0gQXV0aGVudGljYXRlVk5DKHZvaWQpCi0gewotLSAgQ0FSRDMyIGF1dGhTY2hlbWUsIGF1dGhSZXN1bHQ7Ci0tICBDQVJEOCBjaGFsbGVuZ2VbQ0hBTExFTkdFU0laRV07Ci0tICBjaGFyICpwYXNzd2Q7Ci0tICBjaGFyICBidWZmZXJbNjRdOwotLSAgY2hhciogY3N0YXR1czsKLS0gIGludCAgIGxlbjsKLSsJQ0FSRDMyIGF1dGhTY2hlbWUsIGF1dGhSZXN1bHQ7Ci0rCUNBUkQ4IGNoYWxsZW5nZVtDSEFMTEVOR0VTSVpFXTsKLSsJY2hhciAqcGFzc3dkID0gTlVMTDsKLSsJY2hhciAgYnVmZmVyWzY0XTsKLSsJY2hhciogY3N0YXR1czsKLSsJaW50ICAgbGVuOwotKwlpbnQgcmVzdGFydCA9IDA7Ci0gCi0tICBmcHJpbnRmKHN0ZGVyciwgIlBlcmZvcm1pbmcgc3RhbmRhcmQgVk5DIGF1dGhlbnRpY2F0aW9uXG4iKTsKLSsJaWYgKGF1dGhTY2hlbWUpIHt9Ci0gCi0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopY2hhbGxlbmdlLCBDSEFMTEVOR0VTSVpFKSkKLS0gICAgcmV0dXJuIEZhbHNlOwotKwlmcHJpbnRmKHN0ZGVyciwgIlxuUGVyZm9ybWluZyBzdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb25cbiIpOwotIAotLSAgaWYgKGFwcERhdGEucGFzc3dvcmRGaWxlKSB7Ci0tICAgIHBhc3N3ZCA9IHZuY0RlY3J5cHRQYXNzd2RGcm9tRmlsZShhcHBEYXRhLnBhc3N3b3JkRmlsZSk7Ci0tICAgIGlmICghcGFzc3dkKSB7Ci0tICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVhZCB2YWxpZCBwYXNzd29yZCBmcm9tIGZpbGUgXCIlc1wiXG4iLAotLQkgICAgICBhcHBEYXRhLnBhc3N3b3JkRmlsZSk7Ci0tICAgICAgcmV0dXJuIEZhbHNlOwotLSAgICB9Ci0tICB9IGVsc2UgaWYgKGFwcERhdGEuYXV0b1Bhc3MpIHsKLS0gICAgcGFzc3dkID0gYnVmZmVyOwotLSAgICBjc3RhdHVzID0gZmdldHMoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBzdGRpbik7Ci0tICAgIGlmIChjc3RhdHVzID09IE5VTEwpCi0tICAgICAgIGJ1ZmZlclswXSA9ICdcMCc7Ci0tICAgIGVsc2UKLS0gICAgewotLSAgICAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLS0gICAgICAgaWYgKGxlbiA+IDAgJiYgYnVmZmVyW2xlbiAtIDFdID09ICdcbicpCi0tCSAgYnVmZmVyW2xlbiAtIDFdID0gJ1wwJzsKLS0gICAgfQotLSAgfSBlbHNlIGlmIChhcHBEYXRhLnBhc3N3b3JkRGlhbG9nKSB7Ci0tICAgIHBhc3N3ZCA9IERvUGFzc3dvcmREaWFsb2coKTsKLS0gIH0gZWxzZSB7Ci0tICAgIHBhc3N3ZCA9IGdldHBhc3MoIlBhc3N3b3JkOiAiKTsKLS0gIH0KLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKWNoYWxsZW5nZSwgQ0hBTExFTkdFU0laRSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwkJCi0rCWlmIChyZXN0YXJ0X3Nlc3Npb25fcHcgIT0gTlVMTCkgewotKwkJcGFzc3dkID0gcmVzdGFydF9zZXNzaW9uX3B3OwkKLSsJCXJlc3RhcnRfc2Vzc2lvbl9wdyA9IE5VTEw7Ci0rCQlyZXN0YXJ0ID0gMTsKLSsJfSBlbHNlIGlmIChhcHBEYXRhLnBhc3N3b3JkRmlsZSkgewotKwkJcGFzc3dkID0gdm5jRGVjcnlwdFBhc3N3ZEZyb21GaWxlKGFwcERhdGEucGFzc3dvcmRGaWxlKTsKLSsJCWlmICghcGFzc3dkKSB7Ci0rCQkJc3ByaW50Zihtc2didWYsICJDYW5ub3QgcmVhZCB2YWxpZCBwYXNzd29yZCBmcm9tIGZpbGUgXCIlc1wiXG4iLCBhcHBEYXRhLnBhc3N3b3JkRmlsZSk7Ci0rCQkJd21zZyhtc2didWYsIDEpOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJfSBlbHNlIGlmIChhcHBEYXRhLmF1dG9QYXNzKSB7Ci0rCQlwYXNzd2QgPSBidWZmZXI7Ci0rCQlyYWlzZW1lKDEpOwotKwkJY3N0YXR1cyA9IGZnZXRzKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgc3RkaW4pOwotKwkJaWYgKGNzdGF0dXMgPT0gTlVMTCkgewotKwkJCWJ1ZmZlclswXSA9ICdcMCc7Ci0rCQl9IGVsc2UgewotKwkJCWxlbiA9IHN0cmxlbihidWZmZXIpOwotKwkJCWlmIChsZW4gPiAwICYmIGJ1ZmZlcltsZW4gLSAxXSA9PSAnXG4nKSB7Ci0rCQkJCWJ1ZmZlcltsZW4gLSAxXSA9ICdcMCc7Ci0rCQkJfQotKwkJfQotKwl9IGVsc2UgaWYgKGdldGVudigiVk5DVklFV0VSX1BBU1NXT1JEIikpIHsKLSsJCXBhc3N3ZCA9IHN0cmR1cChnZXRlbnYoIlZOQ1ZJRVdFUl9QQVNTV09SRCIpKTsKLSsJfSBlbHNlIGlmIChhcHBEYXRhLnBhc3N3b3JkRGlhbG9nIHx8ICF1c2VfdHR5KCkpIHsKLSsJCXBhc3N3ZCA9IERvUGFzc3dvcmREaWFsb2coKTsKLSsJfSBlbHNlIHsKLSsJCXJhaXNlbWUoMSk7Ci0rCQlwYXNzd2QgPSBnZXRwYXNzKCJWTkMgUGFzc3dvcmQ6ICIpOwotKwl9Ci0gCi0tICBpZiAoIXBhc3N3ZCB8fCBzdHJsZW4ocGFzc3dkKSA9PSAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBwYXNzd29yZCBmYWlsZWRcbiIpOwotLSAgICByZXR1cm4gRmFsc2U7Ci0tICB9Ci0tICBpZiAoc3RybGVuKHBhc3N3ZCkgPiA4KSB7Ci0tICAgIHBhc3N3ZFs4XSA9ICdcMCc7Ci0tICB9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9QQVNTV09SRCIpKSB7Ci0rCQlwdXRlbnYoIlZOQ1ZJRVdFUl9QQVNTV09SRD1ub25lIik7Ci0rCX0KLSAKLS0gIHZuY0VuY3J5cHRCeXRlcyhjaGFsbGVuZ2UsIHBhc3N3ZCk7Ci0rCWlmIChyZXN0YXJ0KSB7Ci0rI2RlZmluZSBFTjAgMAotKyNkZWZpbmUgREUxIDEKLSsJCXVuc2lnbmVkIGNoYXIgc19maXhlZGtleVs4XSA9IHsyMyw4MiwxMDcsNiwzNSw3OCw4OCw3fTsKLSsJCWRlc2tleShzX2ZpeGVka2V5LCBERTEpOwotKwkJZGVzKHBhc3N3ZCwgcGFzc3dkKTsKLSsJfSBlbHNlIHsKLSsJCWlmICghcGFzc3dkIHx8IHN0cmxlbihwYXNzd2QpID09IDApIHsKLSsJCQlzcHJpbnRmKG1zZ2J1ZiwgIlJlYWRpbmcgcGFzc3dvcmQgZmFpbGVkXG5cbiIpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQlpZiAoc3RybGVuKHBhc3N3ZCkgPiA4KSB7Ci0rCQkJcGFzc3dkWzhdID0gJ1wwJzsKLSsJCX0KLSsJfQotIAotLSAgLyogTG9zZSB0aGUgcGFzc3dvcmQgZnJvbSBtZW1vcnkgKi8KLS0gIG1lbXNldChwYXNzd2QsICdcMCcsIHN0cmxlbihwYXNzd2QpKTsKLSsJdm5jRW5jcnlwdEJ5dGVzKGNoYWxsZW5nZSwgcGFzc3dkKTsKLSsJCi0gCi0tICBpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKiljaGFsbGVuZ2UsIENIQUxMRU5HRVNJWkUpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0gCi0tICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJmF1dGhSZXN1bHQsIDQpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rI2lmIDAKLSsJLyogTG9zZSB0aGUgcGFzc3dvcmQgZnJvbSBtZW1vcnkgKi8KLSsJbWVtc2V0KHBhc3N3ZCwgJ1wwJywgc3RybGVuKHBhc3N3ZCkpOwotKyNlbmRpZgotIAotLSAgYXV0aFJlc3VsdCA9IFN3YXAzMklmTEUoYXV0aFJlc3VsdCk7Ci0rCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKWNoYWxsZW5nZSwgQ0hBTExFTkdFU0laRSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotIAotLSAgc3dpdGNoIChhdXRoUmVzdWx0KSB7Ci0tICBjYXNlIHJmYlZuY0F1dGhPSzoKLS0gICAgZnByaW50ZihzdGRlcnIsICJWTkMgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkXG4iKTsKLS0gICAgYnJlYWs7Ci0tICBjYXNlIHJmYlZuY0F1dGhGYWlsZWQ6Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIGNhc2UgcmZiVm5jQXV0aFRvb01hbnk6Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAtIHRvbyBtYW55IHRyaWVzXG4iKTsKLS0gICAgcmV0dXJuIEZhbHNlOwotLSAgZGVmYXVsdDoKLS0gICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIFZOQyBhdXRoZW50aWNhdGlvbiByZXN1bHQ6ICVkXG4iLAotLQkgICAgKGludClhdXRoUmVzdWx0KTsKLS0gICAgcmV0dXJuIEZhbHNlOwotLSAgfQotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJmF1dGhSZXN1bHQsIDQpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIHJldHVybiBUcnVlOwotKwlhdXRoUmVzdWx0ID0gU3dhcDMySWZMRShhdXRoUmVzdWx0KTsKLSsKLSsJc3dpdGNoIChhdXRoUmVzdWx0KSB7Ci0rCWNhc2UgcmZiVm5jQXV0aE9LOgotKwkJZnByaW50ZihzdGRlcnIsICJWTkMgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkXG5cbiIpOwotKwkJYnJlYWs7Ci0rCWNhc2UgcmZiVm5jQXV0aEZhaWxlZDoKLSsJCWZwcmludGYoc3RkZXJyLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC5cbiIpOwotKwkJaWYgKHZpZXdlcl9taW5vciA+PSA4KSB7Ci0rCQkJcHJpbnRGYWlsdXJlUmVhc29uKCk7Ci0rCQl9IGVsc2UgewotKwkJCXNwcmludGYobXNnYnVmLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC5cbiIpOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJY2FzZSByZmJWbmNBdXRoVG9vTWFueToKLSsJCXNwcmludGYobXNnYnVmLCAiVk5DIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAtIHRvbyBtYW55IHRyaWVzXG5cbiIpOwotKwkJd21zZyhtc2didWYsIDEpOwotKwkJcmV0dXJuIEZhbHNlOwotKwlkZWZhdWx0OgotKwkJc3ByaW50Zihtc2didWYsICJVbmtub3duIFZOQyBhdXRoZW50aWNhdGlvbiByZXN1bHQ6ICVkXG5cbiIsIChpbnQpYXV0aFJlc3VsdCk7Ci0rCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsKLSsJcmV0dXJuIFRydWU7Ci0gfQotIAotIC8qCi1AQCAtNjAyLDY4ICsxNjgyLDc3IEBACi0gc3RhdGljIEJvb2wKLSBBdXRoZW50aWNhdGVVbml4TG9naW4odm9pZCkKLSB7Ci0tICBDQVJEMzIgbG9naW5MZW4sIHBhc3N3ZExlbiwgYXV0aFJlc3VsdDsKLS0gIGNoYXIgKmxvZ2luOwotLSAgY2hhciAqcGFzc3dkOwotLSAgc3RydWN0IHBhc3N3ZCAqcHM7Ci0tCi0tICBmcHJpbnRmKHN0ZGVyciwgIlBlcmZvcm1pbmcgVW5peCBsb2dpbi1zdHlsZSBhdXRoZW50aWNhdGlvblxuIik7Ci0tCi0tICBpZiAoYXBwRGF0YS51c2VyTG9naW4pIHsKLS0gICAgbG9naW4gPSBhcHBEYXRhLnVzZXJMb2dpbjsKLS0gIH0gZWxzZSB7Ci0tICAgIHBzID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOwotLSAgICBsb2dpbiA9IHBzLT5wd19uYW1lOwotLSAgfQotKwlDQVJEMzIgbG9naW5MZW4sIHBhc3N3ZExlbiwgYXV0aFJlc3VsdDsKLSsJY2hhciAqbG9naW47Ci0rCWNoYXIgKnBhc3N3ZDsKLSsJc3RydWN0IHBhc3N3ZCAqcHM7Ci0rCi0rCWZwcmludGYoc3RkZXJyLCAiXG5QZXJmb3JtaW5nIFVuaXggbG9naW4tc3R5bGUgYXV0aGVudGljYXRpb25cbiIpOwotKwotKwlpZiAoYXBwRGF0YS51c2VyTG9naW4pIHsKLSsJCWxvZ2luID0gYXBwRGF0YS51c2VyTG9naW47Ci0rCX0gZWxzZSB7Ci0rCQlwcyA9IGdldHB3dWlkKGdldHVpZCgpKTsKLSsJCWxvZ2luID0gcHMtPnB3X25hbWU7Ci0rCX0KLSAKLS0gIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgdXNlciBuYW1lIFwiJXNcIlxuIiwgbG9naW4pOwotKwlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIHVzZXIgbmFtZSBcIiVzXCJcbiIsIGxvZ2luKTsKLSAKLS0gIGlmIChhcHBEYXRhLnBhc3N3b3JkRGlhbG9nKSB7Ci0tICAgIHBhc3N3ZCA9IERvUGFzc3dvcmREaWFsb2coKTsKLS0gIH0gZWxzZSB7Ci0tICAgIHBhc3N3ZCA9IGdldHBhc3MoIlBhc3N3b3JkOiAiKTsKLS0gIH0KLS0gIGlmICghcGFzc3dkIHx8IHN0cmxlbihwYXNzd2QpID09IDApIHsKLS0gICAgZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIHBhc3N3b3JkIGZhaWxlZFxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJaWYgKGFwcERhdGEucGFzc3dvcmREaWFsb2cgfHwgIXVzZV90dHkoKSkgewotKwkJcGFzc3dkID0gRG9QYXNzd29yZERpYWxvZygpOwotKwl9IGVsc2UgewotKwkJcmFpc2VtZSgxKTsKLSsJCXBhc3N3ZCA9IGdldHBhc3MoIlZOQyBQYXNzd29yZDogIik7Ci0rCX0KLSsJaWYgKCFwYXNzd2QgfHwgc3RybGVuKHBhc3N3ZCkgPT0gMCkgewotKwkJZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIHBhc3N3b3JkIGZhaWxlZFxuIik7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIGxvZ2luTGVuID0gU3dhcDMySWZMRSgoQ0FSRDMyKXN0cmxlbihsb2dpbikpOwotLSAgcGFzc3dkTGVuID0gU3dhcDMySWZMRSgoQ0FSRDMyKXN0cmxlbihwYXNzd2QpKTsKLSsJbG9naW5MZW4gPSBTd2FwMzJJZkxFKChDQVJEMzIpc3RybGVuKGxvZ2luKSk7Ci0rCXBhc3N3ZExlbiA9IFN3YXAzMklmTEUoKENBUkQzMilzdHJsZW4ocGFzc3dkKSk7Ci0gCi0tICBpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmbG9naW5MZW4sIHNpemVvZihsb2dpbkxlbikpIHx8Ci0tICAgICAgIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmcGFzc3dkTGVuLCBzaXplb2YocGFzc3dkTGVuKSkpCi0tICAgIHJldHVybiBGYWxzZTsKLSsJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJmxvZ2luTGVuLCBzaXplb2YobG9naW5MZW4pKSB8fAotKwkgICAgIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmcGFzc3dkTGVuLCBzaXplb2YocGFzc3dkTGVuKSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotIAotLSAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIGxvZ2luLCBzdHJsZW4obG9naW4pKSB8fAotLSAgICAgICFXcml0ZUV4YWN0KHJmYnNvY2ssIHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCkpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCBsb2dpbiwgc3RybGVuKGxvZ2luKSkgfHwKLSsJICAgICFXcml0ZUV4YWN0KHJmYnNvY2ssIHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCkpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gIC8qIExvc2UgdGhlIHBhc3N3b3JkIGZyb20gbWVtb3J5ICovCi0tICBtZW1zZXQocGFzc3dkLCAnXDAnLCBzdHJsZW4ocGFzc3dkKSk7Ci0rI2lmIDAKLSsJLyogTG9zZSB0aGUgcGFzc3dvcmQgZnJvbSBtZW1vcnkgKi8KLSsJbWVtc2V0KHBhc3N3ZCwgJ1wwJywgc3RybGVuKHBhc3N3ZCkpOwotKyNlbmRpZgotIAotLSAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZhdXRoUmVzdWx0LCBzaXplb2YoYXV0aFJlc3VsdCkpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmYXV0aFJlc3VsdCwgc2l6ZW9mKGF1dGhSZXN1bHQpKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0gCi0tICBhdXRoUmVzdWx0ID0gU3dhcDMySWZMRShhdXRoUmVzdWx0KTsKLSsJYXV0aFJlc3VsdCA9IFN3YXAzMklmTEUoYXV0aFJlc3VsdCk7Ci0gCi0tICBzd2l0Y2ggKGF1dGhSZXN1bHQpIHsKLS0gIGNhc2UgcmZiVm5jQXV0aE9LOgotLSAgICBmcHJpbnRmKHN0ZGVyciwgIkF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZFxuIik7Ci0tICAgIGJyZWFrOwotLSAgY2FzZSByZmJWbmNBdXRoRmFpbGVkOgotLSAgICBmcHJpbnRmKHN0ZGVyciwgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIGNhc2UgcmZiVm5jQXV0aFRvb01hbnk6Ci0tICAgIGZwcmludGYoc3RkZXJyLCAiQXV0aGVudGljYXRpb24gZmFpbGVkIC0gdG9vIG1hbnkgdHJpZXNcbiIpOwotLSAgICByZXR1cm4gRmFsc2U7Ci0tICBkZWZhdWx0OgotLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gYXV0aGVudGljYXRpb24gcmVzdWx0OiAlZFxuIiwKLS0JICAgIChpbnQpYXV0aFJlc3VsdCk7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsJc3dpdGNoIChhdXRoUmVzdWx0KSB7Ci0rCWNhc2UgcmZiVm5jQXV0aE9LOgotKwkJZnByaW50ZihzdGRlcnIsICJBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWRcblxuIik7Ci0rCQlicmVhazsKLSsJY2FzZSByZmJWbmNBdXRoRmFpbGVkOgotKwkJc3ByaW50Zihtc2didWYsICJBdXRoZW50aWNhdGlvbiBmYWlsZWRcblxuIik7Ci0rCQl3bXNnKG1zZ2J1ZiwgMSk7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCWNhc2UgcmZiVm5jQXV0aFRvb01hbnk6Ci0rCQlzcHJpbnRmKG1zZ2J1ZiwgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCAtIHRvbyBtYW55IHRyaWVzXG5cbiIpOwotKwkJd21zZyhtc2didWYsIDEpOwotKwkJcmV0dXJuIEZhbHNlOwotKwlkZWZhdWx0OgotKwkJc3ByaW50Zihtc2didWYsICJVbmtub3duIGF1dGhlbnRpY2F0aW9uIHJlc3VsdDogJWRcblxuIiwKLSsJCSAgICAoaW50KWF1dGhSZXN1bHQpOwotKwkJd21zZyhtc2didWYsIDEpOwotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0gCi0tICByZXR1cm4gVHJ1ZTsKLSsJcmV0dXJuIFRydWU7Ci0gfQotIAotIAotQEAgLTY3NSwxOSArMTc2NCwyMCBAQAotIHN0YXRpYyBCb29sCi0gUmVhZEludGVyYWN0aW9uQ2Fwcyh2b2lkKQotIHsKLS0gIHJmYkludGVyYWN0aW9uQ2Fwc01zZyBpbnRyX2NhcHM7Ci0rCXJmYkludGVyYWN0aW9uQ2Fwc01zZyBpbnRyX2NhcHM7Ci0gCi0tICAvKiBSZWFkIHRoZSBjb3VudHMgb2YgbGlzdCBpdGVtcyBmb2xsb3dpbmcgKi8KLS0gIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmaW50cl9jYXBzLCBzel9yZmJJbnRlcmFjdGlvbkNhcHNNc2cpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0tICBpbnRyX2NhcHMublNlcnZlck1lc3NhZ2VUeXBlcyA9IFN3YXAxNklmTEUoaW50cl9jYXBzLm5TZXJ2ZXJNZXNzYWdlVHlwZXMpOwotLSAgaW50cl9jYXBzLm5DbGllbnRNZXNzYWdlVHlwZXMgPSBTd2FwMTZJZkxFKGludHJfY2Fwcy5uQ2xpZW50TWVzc2FnZVR5cGVzKTsKLS0gIGludHJfY2Fwcy5uRW5jb2RpbmdUeXBlcyA9IFN3YXAxNklmTEUoaW50cl9jYXBzLm5FbmNvZGluZ1R5cGVzKTsKLS0KLS0gIC8qIFJlYWQgdGhlIGxpc3RzIG9mIHNlcnZlci0gYW5kIGNsaWVudC1pbml0aWF0ZWQgbWVzc2FnZXMgKi8KLS0gIHJldHVybiAoUmVhZENhcGFiaWxpdHlMaXN0KHNlcnZlck1zZ0NhcHMsIGludHJfY2Fwcy5uU2VydmVyTWVzc2FnZVR5cGVzKSAmJgotLQkgIFJlYWRDYXBhYmlsaXR5TGlzdChjbGllbnRNc2dDYXBzLCBpbnRyX2NhcHMubkNsaWVudE1lc3NhZ2VUeXBlcykgJiYKLS0JICBSZWFkQ2FwYWJpbGl0eUxpc3QoZW5jb2RpbmdDYXBzLCBpbnRyX2NhcHMubkVuY29kaW5nVHlwZXMpKTsKLSsJLyogUmVhZCB0aGUgY291bnRzIG9mIGxpc3QgaXRlbXMgZm9sbG93aW5nICovCi0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmaW50cl9jYXBzLCBzel9yZmJJbnRlcmFjdGlvbkNhcHNNc2cpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJaW50cl9jYXBzLm5TZXJ2ZXJNZXNzYWdlVHlwZXMgPSBTd2FwMTZJZkxFKGludHJfY2Fwcy5uU2VydmVyTWVzc2FnZVR5cGVzKTsKLSsJaW50cl9jYXBzLm5DbGllbnRNZXNzYWdlVHlwZXMgPSBTd2FwMTZJZkxFKGludHJfY2Fwcy5uQ2xpZW50TWVzc2FnZVR5cGVzKTsKLSsJaW50cl9jYXBzLm5FbmNvZGluZ1R5cGVzID0gU3dhcDE2SWZMRShpbnRyX2NhcHMubkVuY29kaW5nVHlwZXMpOwotKwotKwkvKiBSZWFkIHRoZSBsaXN0cyBvZiBzZXJ2ZXItIGFuZCBjbGllbnQtaW5pdGlhdGVkIG1lc3NhZ2VzICovCi0rCXJldHVybiAoUmVhZENhcGFiaWxpdHlMaXN0KHNlcnZlck1zZ0NhcHMsIGludHJfY2Fwcy5uU2VydmVyTWVzc2FnZVR5cGVzKSAmJgotKwkJUmVhZENhcGFiaWxpdHlMaXN0KGNsaWVudE1zZ0NhcHMsIGludHJfY2Fwcy5uQ2xpZW50TWVzc2FnZVR5cGVzKSAmJgotKwkJUmVhZENhcGFiaWxpdHlMaXN0KGVuY29kaW5nQ2FwcywgaW50cl9jYXBzLm5FbmNvZGluZ1R5cGVzKSk7Ci0gfQotIAotIAotQEAgLTY5NywyMiArMTc4Nyw3MCBAQAotICAqIG1hbnkgcmVjb3JkcyB0byByZWFkIGZyb20gdGhlIHNvY2tldC4KLSAgKi8KLSAKLS1zdGF0aWMgQm9vbAotLVJlYWRDYXBhYmlsaXR5TGlzdChDYXBzQ29udGFpbmVyICpjYXBzLCBpbnQgY291bnQpCi0tewotLSAgcmZiQ2FwYWJpbGl0eUluZm8gbXNnaW5mbzsKLS0gIGludCBpOwotK3N0YXRpYyBCb29sCi0rUmVhZENhcGFiaWxpdHlMaXN0KENhcHNDb250YWluZXIgKmNhcHMsIGludCBjb3VudCkKLSt7Ci0rCXJmYkNhcGFiaWxpdHlJbmZvIG1zZ2luZm87Ci0rCWludCBpOwotKwotKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZtc2dpbmZvLCBzel9yZmJDYXBhYmlsaXR5SW5mbykpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQltc2dpbmZvLmNvZGUgPSBTd2FwMzJJZkxFKG1zZ2luZm8uY29kZSk7Ci0rCQlDYXBzRW5hYmxlKGNhcHMsICZtc2dpbmZvKTsKLSsJfQotKwotKwlyZXR1cm4gVHJ1ZTsKLSt9Ci0rCi0gCi0tICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotLSAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJm1zZ2luZm8sIHN6X3JmYkNhcGFiaWxpdHlJbmZvKSkKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0tICAgIG1zZ2luZm8uY29kZSA9IFN3YXAzMklmTEUobXNnaW5mby5jb2RlKTsKLS0gICAgQ2Fwc0VuYWJsZShjYXBzLCAmbXNnaW5mbyk7Ci0tICB9Ci0rLyogdXNlZCB0byBoYXZlICF0dW5uZWxTcGVjaWZpZWQgKi8KLSAKLS0gIHJldHVybiBUcnVlOwotK3N0YXRpYyBpbnQgZ3Vlc3NfY29tcHJlc3NsZXZlbCh2b2lkKSB7Ci0rCWludCBuOwotKwlpZiAobGF0ZW5jeSA+IDIwMC4wKSB7Ci0rCQluID0gODsKLSsJfSBlbHNlIGlmIChsYXRlbmN5ID4gMTAwLjApIHsKLSsJCW4gPSA3OwotKwl9IGVsc2UgaWYgKGxhdGVuY3kgPiA2MC4wKSB7Ci0rCQluID0gNjsKLSsJfSBlbHNlIGlmIChsYXRlbmN5ID4gMTUuMCkgewotKwkJbiA9IDQ7Ci0rCX0gZWxzZSBpZiAobGF0ZW5jeSA+IDguMCkgewotKwkJbiA9IDI7Ci0rCX0gZWxzZSBpZiAobGF0ZW5jeSA+IDAuMCkgewotKwkJbiA9IDE7Ci0rCX0gZWxzZSB7Ci0rCQkvKiBubyBsYXRlbmN5IG1lYXN1cmVtZW50ICovCi0rCQluID0gMzsKLSsJfQotKwlyZXR1cm4gbjsKLSB9Ci0gCi0rc3RhdGljIGludCBndWVzc19xdWFsaXR5bGV2ZWwodm9pZCkgewotKwlpbnQgbjsKLSsJaWYgKGxhdGVuY3kgPiAyMDAuMCkgewotKwkJbiA9IDQ7Ci0rCX0gZWxzZSBpZiAobGF0ZW5jeSA+IDEwMC4wKSB7Ci0rCQluID0gNTsKLSsJfSBlbHNlIGlmIChsYXRlbmN5ID4gNjAuMCkgewotKwkJbiA9IDY7Ci0rCX0gZWxzZSBpZiAobGF0ZW5jeSA+IDE1LjApIHsKLSsJCW4gPSA3OwotKwl9IGVsc2UgaWYgKGxhdGVuY3kgPiA4LjApIHsKLSsJCW4gPSA4OwotKwl9IGVsc2UgaWYgKGxhdGVuY3kgPiAwLjApIHsKLSsJCW4gPSA5OwotKwl9IGVsc2UgewotKwkJLyogbm8gbGF0ZW5jeSBtZWFzdXJlbWVudCAqLwotKwkJbiA9IDY7Ci0rCX0KLSsjaWZkZWYgVFVSQk9WTkMKLSsJbiAqPSAxMDsKLSsjZW5kaWYKLSsJcmV0dXJuIG47Ci0rfQotIAotIC8qCi0gICogU2V0Rm9ybWF0QW5kRW5jb2RpbmdzLgotQEAgLTcyOSw2ICsxODY3LDIxIEBACi0gICBCb29sIHJlcXVlc3RDb21wcmVzc0xldmVsID0gRmFsc2U7Ci0gICBCb29sIHJlcXVlc3RRdWFsaXR5TGV2ZWwgPSBGYWxzZTsKLSAgIEJvb2wgcmVxdWVzdExhc3RSZWN0RW5jb2RpbmcgPSBGYWxzZTsKLSsgIEJvb2wgcmVxdWVzdE5ld0ZCU2l6ZUVuY29kaW5nID0gVHJ1ZTsKLSsgIEJvb2wgcmVxdWVzdFRleHRDaGF0RW5jb2RpbmcgPSBUcnVlOwotKyAgQm9vbCByZXF1ZXN0U3Vic2FtcExldmVsID0gRmFsc2U7Ci0rICBpbnQgZHNtID0gMDsKLSsgIGludCB0UUwsIHRRTG1heCA9IDk7Ci0rICBzdGF0aWMgaW50IHFsbXNnID0gMCwgY2xtc2cgPSAwOwotKyNpZmRlZiBUVVJCT1ZOQwotKwl0UUxtYXggPSAxMDA7Ci0rI2VuZGlmCi0rCi0rCWlmIChyZXF1ZXN0VGV4dENoYXRFbmNvZGluZyB8fCByZXF1ZXN0U3Vic2FtcExldmVsIHx8IHRRTCkge30KLSsKLSsjaWYgMAotKyAgZnByaW50ZihzdGRlcnIsICJTZXRGb3JtYXRBbmRFbmNvZGluZ3M6IHNlbnRfRkJVIHN0YXRlOiAlMmRcbiIsIHNlbnRfRkJVKTsKLSsjZW5kaWYKLSAKLSAgIHNwZi50eXBlID0gcmZiU2V0UGl4ZWxGb3JtYXQ7Ci0gICBzcGYuZm9ybWF0ID0gbXlGb3JtYXQ7Ci1AQCAtNzM2LDE1ICsxODg5LDMyIEBACi0gICBzcGYuZm9ybWF0LmdyZWVuTWF4ID0gU3dhcDE2SWZMRShzcGYuZm9ybWF0LmdyZWVuTWF4KTsKLSAgIHNwZi5mb3JtYXQuYmx1ZU1heCA9IFN3YXAxNklmTEUoc3BmLmZvcm1hdC5ibHVlTWF4KTsKLSAKLSsKLSsgIGN1cnJlbnRNc2cgPSByZmJTZXRQaXhlbEZvcm1hdDsKLSAgIGlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZzcGYsIHN6X3JmYlNldFBpeGVsRm9ybWF0TXNnKSkKLSAgICAgcmV0dXJuIEZhbHNlOwotIAotICAgc2UtPnR5cGUgPSByZmJTZXRFbmNvZGluZ3M7Ci0gICBzZS0+bkVuY29kaW5ncyA9IDA7Ci0gCi0rICBpZiAoYXBwRGF0YS51bHRyYURTTSkgewotKyAgCWRzbSA9IDE7Ci0rICB9Ci0rCi0gICBpZiAoYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcpIHsKLSAgICAgY2hhciAqZW5jU3RyID0gYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmc7Ci0gICAgIGludCBlbmNTdHJMZW47Ci0rCWlmIChzdHJjaHIoZW5jU3RyLCAnLCcpKSAgewotKwkJY2hhciAqcDsKLSsJCWVuY1N0ciA9IHN0cmR1cChlbmNTdHIpOwotKwkJcCA9IGVuY1N0cjsKLSsJCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0rCQkJaWYgKCpwID09ICcsJykgewotKwkJCQkqcCA9ICcgJzsKLSsJCQl9Ci0rCQkJcCsrOwotKwkJfQotKwl9Ci0gICAgIGRvIHsKLSAgICAgICBjaGFyICpuZXh0RW5jU3RyID0gc3RyY2hyKGVuY1N0ciwgJyAnKTsKLSAgICAgICBpZiAobmV4dEVuY1N0cikgewotQEAgLTc1NCw1MCArMTkyNCwxMDIgQEAKLSAJZW5jU3RyTGVuID0gc3RybGVuKGVuY1N0cik7Ci0gICAgICAgfQotIAotK2lmIChnZXRlbnYoIkRFQlVHX1NFVEZPUk1BVCIpKSB7Ci0rCWZwcmludGYoc3RkZXJyLCAiZW5jczogIik7Ci0rCXdyaXRlKDIsIGVuY1N0ciwgZW5jU3RyTGVuKTsKLSsJZnByaW50ZihzdGRlcnIsICJcbiIpOwotK30KLSsKLSAgICAgICBpZiAoc3RybmNhc2VjbXAoZW5jU3RyLCJyYXciLGVuY1N0ckxlbikgPT0gMCkgewotIAllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1Jhdyk7Ci0gICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcChlbmNTdHIsImNvcHlyZWN0IixlbmNTdHJMZW4pID09IDApIHsKLSAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdDb3B5UmVjdCk7Ci0tICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcChlbmNTdHIsInRpZ2h0IixlbmNTdHJMZW4pID09IDApIHsKLSsgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGVuY1N0ciwidGlnaHQiLGVuY1N0ckxlbikgPT0gMCAmJiAhZHNtKSB7Ci0gCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nVGlnaHQpOwotIAlyZXF1ZXN0TGFzdFJlY3RFbmNvZGluZyA9IFRydWU7Ci0tCWlmIChhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPj0gMCAmJiBhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPD0gOSkKLS0JICByZXF1ZXN0Q29tcHJlc3NMZXZlbCA9IFRydWU7Ci0tCWlmIChhcHBEYXRhLmVuYWJsZUpQRUcpCi0tCSAgcmVxdWVzdFF1YWxpdHlMZXZlbCA9IFRydWU7Ci0rCWlmIChhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPj0gMCAmJiBhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPD0gOSkgewotKwkJcmVxdWVzdENvbXByZXNzTGV2ZWwgPSBUcnVlOwotKyAgICAgICAgfQotKwlpZiAoYXBwRGF0YS5lbmFibGVKUEVHKSB7Ci0rCQlyZXF1ZXN0UXVhbGl0eUxldmVsID0gVHJ1ZTsKLSsgICAgICAgIH0KLSsjaWZkZWYgVFVSQk9WTkMKLSsJcmVxdWVzdFN1YnNhbXBMZXZlbCA9IFRydWU7Ci0rI2VuZGlmCi0gICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcChlbmNTdHIsImhleHRpbGUiLGVuY1N0ckxlbikgPT0gMCkgewotIAllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ0hleHRpbGUpOwotLSAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAoZW5jU3RyLCJ6bGliIixlbmNTdHJMZW4pID09IDApIHsKLSsgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGVuY1N0ciwiemxpYiIsZW5jU3RyTGVuKSA9PSAwICYmICFkc20pIHsKLSAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdabGliKTsKLS0JaWYgKGFwcERhdGEuY29tcHJlc3NMZXZlbCA+PSAwICYmIGFwcERhdGEuY29tcHJlc3NMZXZlbCA8PSA5KQotLQkgIHJlcXVlc3RDb21wcmVzc0xldmVsID0gVHJ1ZTsKLS0gICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGVuY1N0ciwiY29ycmUiLGVuY1N0ckxlbikgPT0gMCkgewotKwlpZiAoYXBwRGF0YS5jb21wcmVzc0xldmVsID49IDAgJiYgYXBwRGF0YS5jb21wcmVzc0xldmVsIDw9IDkpIHsKLSsJCXJlcXVlc3RDb21wcmVzc0xldmVsID0gVHJ1ZTsKLSsJfQotKyAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAoZW5jU3RyLCJjb3JyZSIsZW5jU3RyTGVuKSA9PSAwICYmICFkc20pIHsKLSAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdDb1JSRSk7Ci0gICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcChlbmNTdHIsInJyZSIsZW5jU3RyTGVuKSA9PSAwKSB7Ci0gCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nUlJFKTsKLSsgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGVuY1N0ciwienJsZSIsZW5jU3RyTGVuKSA9PSAwKSB7Ci0rCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nWlJMRSk7Ci0rI2lmIERPX1pZV1JMRQotKyAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAoZW5jU3RyLCJ6eXdybGUiLGVuY1N0ckxlbikgPT0gMCkgewotKwkJaW50IHFsZXZlbCA9IGFwcERhdGEucXVhbGl0eUxldmVsOwotKwkJaWYgKHFsZXZlbCA8IDAgfHwgcWxldmVsID4gdFFMbWF4KSBxbGV2ZWwgPSBndWVzc19xdWFsaXR5bGV2ZWwoKTsKLSsJCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nWllXUkxFKTsKLSsJCXJlcXVlc3RRdWFsaXR5TGV2ZWwgPSBUcnVlOwotKwkJaWYgKHFsZXZlbCA8IDMpIHsKLSsJCQl6eXdybGVfbGV2ZWwgPSAzOwotKwkJfSBlbHNlIGlmIChxbGV2ZWwgPCA2KSB7Ci0rCQkJenl3cmxlX2xldmVsID0gMjsKLSsJCX0gZWxzZSB7Ci0rCQkJenl3cmxlX2xldmVsID0gMTsKLSsJCX0KLSsjZW5kaWYKLSAgICAgICB9IGVsc2UgewotIAlmcHJpbnRmKHN0ZGVyciwiVW5rbm93biBlbmNvZGluZyAnJS4qcydcbiIsZW5jU3RyTGVuLGVuY1N0cik7Ci0rICAgICAgICBpZiAoZHNtICYmIHN0cnN0cihlbmNTdHIsICJ0aWdodCIpID09IGVuY1N0cikgZnByaW50ZihzdGRlcnIsICJ0aWdodCBlbmNvZGluZyBkb2VzIG5vdCB5ZXQgd29yayB3aXRoIHVsdHJhRFNNLCBza2lwcGluZyBpdC5cbiIpOwotKyAgICAgICAgaWYgKGRzbSAmJiBzdHJzdHIoZW5jU3RyLCAiY29ycmUiKSA9PSBlbmNTdHIpIGZwcmludGYoc3RkZXJyLCAiY29ycmUgZW5jb2RpbmcgZG9lcyBub3QgeWV0IHdvcmsgd2l0aCB1bHRyYURTTSwgc2tpcHBpbmcgaXQuXG4iKTsKLSsgICAgICAgIGlmIChkc20gJiYgc3Ryc3RyKGVuY1N0ciwgInpsaWIiICkgPT0gZW5jU3RyKSBmcHJpbnRmKHN0ZGVyciwgInpsaWIgIGVuY29kaW5nIGRvZXMgbm90IHlldCB3b3JrIHdpdGggdWx0cmFEU00sIHNraXBwaW5nIGl0LlxuIik7Ci0gICAgICAgfQotIAotICAgICAgIGVuY1N0ciA9IG5leHRFbmNTdHI7Ci0gICAgIH0gd2hpbGUgKGVuY1N0ciAmJiBzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MpOwotIAotICAgICBpZiAoc2UtPm5FbmNvZGluZ3MgPCBNQVhfRU5DT0RJTkdTICYmIHJlcXVlc3RDb21wcmVzc0xldmVsKSB7Ci0tICAgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUoYXBwRGF0YS5jb21wcmVzc0xldmVsICsKLS0JCQkJCSAgcmZiRW5jb2RpbmdDb21wcmVzc0xldmVsMCk7Ci0rCTsKLSsgICAgfSBlbHNlIGlmIChzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MpIHsKLSsJYXBwRGF0YS5jb21wcmVzc0xldmVsID0gZ3Vlc3NfY29tcHJlc3NsZXZlbCgpOwotKwlpZiAoY2xtc2crKyA9PSAwKSBmcHJpbnRmKHN0ZGVyciwgImd1ZXNzZWQ6IC1jb21wcmVzc2xldmVsICVkXG4iLCBhcHBEYXRhLmNvbXByZXNzTGV2ZWwpOwotICAgICB9Ci0rICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKGFwcERhdGEuY29tcHJlc3NMZXZlbCArIHJmYkVuY29kaW5nQ29tcHJlc3NMZXZlbDApOwotIAotICAgICBpZiAoc2UtPm5FbmNvZGluZ3MgPCBNQVhfRU5DT0RJTkdTICYmIHJlcXVlc3RRdWFsaXR5TGV2ZWwpIHsKLS0gICAgICBpZiAoYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPCAwIHx8IGFwcERhdGEucXVhbGl0eUxldmVsID4gOSkKLS0gICAgICAgIGFwcERhdGEucXVhbGl0eUxldmVsID0gNTsKLS0gICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLnF1YWxpdHlMZXZlbCArCi0tCQkJCQkgIHJmYkVuY29kaW5nUXVhbGl0eUxldmVsMCk7Ci0rCWlmIChhcHBEYXRhLnF1YWxpdHlMZXZlbCA8IDAgfHwgYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPiB0UUxtYXgpIHsKLSsJCWFwcERhdGEucXVhbGl0eUxldmVsID0gZ3Vlc3NfcXVhbGl0eWxldmVsKCk7Ci0rCQlpZiAocWxtc2crKyA9PSAwKSBmcHJpbnRmKHN0ZGVyciwgImd1ZXNzZWQ6IC1xdWFsaXR5bGV2ZWwgICVkXG4iLCBhcHBEYXRhLnF1YWxpdHlMZXZlbCk7Ci0rCX0KLSsgICAgfSBlbHNlIGlmIChzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MpIHsKLSsJYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPSBndWVzc19xdWFsaXR5bGV2ZWwoKTsKLSsJaWYgKHFsbXNnKysgPT0gMCkgZnByaW50ZihzdGRlcnIsICJndWVzc2VkOiAtcXVhbGl0eWxldmVsICAlZFxuIiwgYXBwRGF0YS5xdWFsaXR5TGV2ZWwpOwotKyAgICB9Ci0rI2lmZGVmIFRVUkJPVk5DCi0rICAgIHRRTCA9IGFwcERhdGEucXVhbGl0eUxldmVsIC8gMTA7Ci0rICAgIGlmICh0UUwgPCAwKSB0UUwgPSAxOwotKyAgICBpZiAodFFMID4gOSkgdFFMID0gOTsKLSsgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUodFFMICsgcmZiRW5jb2RpbmdRdWFsaXR5TGV2ZWwwKTsKLSsgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUoYXBwRGF0YS5xdWFsaXR5TGV2ZWwgKyByZmJKcGVnUXVhbGl0eUxldmVsMSAtIDEpOwotKyAgICBpZiAoc2UtPm5FbmNvZGluZ3MgPCBNQVhfRU5DT0RJTkdTICYmIHJlcXVlc3RTdWJzYW1wTGV2ZWwpIHsKLSsJaWYgKGFwcERhdGEuc3Vic2FtcExldmVsIDwgMCB8fCBhcHBEYXRhLnN1YnNhbXBMZXZlbCA+IFRWTkNfU0FNUE9QVCAtIDEpIHsKLSsJCWFwcERhdGEuc3Vic2FtcExldmVsID0gVFZOQ18xWDsKLSsJfQotKwllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLnN1YnNhbXBMZXZlbCArIHJmYkpwZWdTdWJzYW1wMVgpOwotICAgICB9Ci0rI2Vsc2UKLSsgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUoYXBwRGF0YS5xdWFsaXR5TGV2ZWwgKyByZmJFbmNvZGluZ1F1YWxpdHlMZXZlbDApOwotKyNlbmRpZgotIAotICAgICBpZiAoYXBwRGF0YS51c2VSZW1vdGVDdXJzb3IpIHsKLSAgICAgICBpZiAoc2UtPm5FbmNvZGluZ3MgPCBNQVhfRU5DT0RJTkdTKQotIAllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1hDdXJzb3IpOwotLSAgICAgIGlmIChzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MpCi0rICAgICAgaWYgKHNlLT5uRW5jb2RpbmdzIDwgTUFYX0VOQ09ESU5HUyAmJiAhYXBwRGF0YS51c2VYMTFDdXJzb3IpCi0gCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nUmljaEN1cnNvcik7Ci0gICAgICAgaWYgKHNlLT5uRW5jb2RpbmdzIDwgTUFYX0VOQ09ESU5HUykKLSAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdQb2ludGVyUG9zKTsKLUBAIC04MDYsMTAgKzIwMjgsMTYgQEAKLSAgICAgaWYgKHNlLT5uRW5jb2RpbmdzIDwgTUFYX0VOQ09ESU5HUyAmJiByZXF1ZXN0TGFzdFJlY3RFbmNvZGluZykgewotICAgICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nTGFzdFJlY3QpOwotICAgICB9Ci0tICB9Ci0tICBlbHNlIHsKLSsKLSsgICAgaWYgKHNlLT5uRW5jb2RpbmdzIDwgTUFYX0VOQ09ESU5HUyAmJiByZXF1ZXN0TmV3RkJTaXplRW5jb2RpbmcpIHsKLSsgICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ05ld0ZCU2l6ZSk7Ci0rICAgIH0KLSsKLSsgIH0gZWxzZSB7Ci0rCS8qIERJRkZFUkVOVCBDQVNFICovCi0rCi0gICAgIGlmIChTYW1lTWFjaGluZShyZmJzb2NrKSkgewotLSAgICAgIGlmICghdHVubmVsU3BlY2lmaWVkKSB7Ci0rICAgICAgaWYgKCF0dW5uZWxTcGVjaWZpZWQgJiYgYXBwRGF0YS51c2VSYXdMb2NhbCkgewotIAlmcHJpbnRmKHN0ZGVyciwiU2FtZSBtYWNoaW5lOiBwcmVmZXJyaW5nIHJhdyBlbmNvZGluZ1xuIik7Ci0gCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nUmF3KTsKLSAgICAgICB9IGVsc2UgewotQEAgLTgxOCw0NCArMjA0Niw4NCBAQAotICAgICB9Ci0gCi0gICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nQ29weVJlY3QpOwotLSAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1RpZ2h0KTsKLSsgICAgaWYgKCFkc20pIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nVGlnaHQpOwotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1pSTEUpOwotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1pZV1JMRSk7Ci0gICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nSGV4dGlsZSk7Ci0tICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nWmxpYik7Ci0tICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nQ29SUkUpOwotKyAgICBpZiAoIWRzbSkgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdabGliKTsKLSsgICAgaWYgKCFkc20pIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nQ29SUkUpOwotICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1JSRSk7Ci0gCi0tICAgIGlmIChhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPj0gMCAmJiBhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPD0gOSkgewotLSAgICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKGFwcERhdGEuY29tcHJlc3NMZXZlbCArCi0tCQkJCQkgIHJmYkVuY29kaW5nQ29tcHJlc3NMZXZlbDApOwotLSAgICB9IGVsc2UgaWYgKCF0dW5uZWxTcGVjaWZpZWQpIHsKLS0gICAgICAvKiBJZiAtdHVubmVsIG9wdGlvbiB3YXMgcHJvdmlkZWQsIHdlIGFzc3VtZSB0aGF0IHNlcnZlciBtYWNoaW5lIGlzCi0tCSBub3QgaW4gdGhlIGxvY2FsIG5ldHdvcmsgc28gd2UgdXNlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgZm9yCi0tCSB0aWdodCBlbmNvZGluZyBpbnN0ZWFkIG9mIGZhc3QgY29tcHJlc3Npb24uIFRodXMgd2UgYXJlCi0tCSByZXF1ZXN0aW5nIGxldmVsIDEgY29tcHJlc3Npb24gb25seSBpZiB0dW5uZWxpbmcgaXMgbm90IHVzZWQuICovCi0tICAgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdDb21wcmVzc0xldmVsMSk7Ci0tICAgIH0KLS0KLS0gICAgaWYgKGFwcERhdGEuZW5hYmxlSlBFRykgewotLSAgICAgIGlmIChhcHBEYXRhLnF1YWxpdHlMZXZlbCA8IDAgfHwgYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPiA5KQotLQlhcHBEYXRhLnF1YWxpdHlMZXZlbCA9IDU7Ci0tICAgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUoYXBwRGF0YS5xdWFsaXR5TGV2ZWwgKwotLQkJCQkJICByZmJFbmNvZGluZ1F1YWxpdHlMZXZlbDApOwotKyAgICBpZiAoIWRzbSAmJiBhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPj0gMCAmJiBhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPD0gOSkgewotKwllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLmNvbXByZXNzTGV2ZWwgKyByZmJFbmNvZGluZ0NvbXByZXNzTGV2ZWwwKTsKLSsgICAgfSBlbHNlIHsKLSsJLyoKLSsgICAgICAgICAqIE9VVCBPRiBEQVRFOiBJZiAtdHVubmVsIG9wdGlvbiB3YXMgcHJvdmlkZWQsIHdlIGFzc3VtZSB0aGF0IHNlcnZlciBtYWNoaW5lIGlzCi0rCSAqIG5vdCBpbiB0aGUgbG9jYWwgbmV0d29yayBzbyB3ZSB1c2UgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCBmb3IKLSsJICogdGlnaHQgZW5jb2RpbmcgaW5zdGVhZCBvZiBmYXN0IGNvbXByZXNzaW9uLiBUaHVzIHdlIGFyZQotKwkgKiByZXF1ZXN0aW5nIGxldmVsIDEgY29tcHJlc3Npb24gb25seSBpZiB0dW5uZWxpbmcgaXMgbm90IHVzZWQuCi0rICAgICAgICAgKi8KLSsJYXBwRGF0YS5jb21wcmVzc0xldmVsID0gZ3Vlc3NfY29tcHJlc3NsZXZlbCgpOwotKwlpZiAoY2xtc2crKyA9PSAwKSBmcHJpbnRmKHN0ZGVyciwgImd1ZXNzZWQ6IC1jb21wcmVzc2xldmVsICVkXG4iLCBhcHBEYXRhLmNvbXByZXNzTGV2ZWwpOwotKwllbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLmNvbXByZXNzTGV2ZWwgKyByZmJFbmNvZGluZ0NvbXByZXNzTGV2ZWwwKTsKLSsgICAgfQotKwotKyAgICBpZiAoIWRzbSAmJiBhcHBEYXRhLmVuYWJsZUpQRUcpIHsKLSsJaWYgKGFwcERhdGEucXVhbGl0eUxldmVsIDwgMCB8fCBhcHBEYXRhLnF1YWxpdHlMZXZlbCA+IHRRTG1heCkgewotKwkJYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPSBndWVzc19xdWFsaXR5bGV2ZWwoKTsKLSsJCWlmIChxbG1zZysrID09IDApIGZwcmludGYoc3RkZXJyLCAiZ3Vlc3NlZDogLXF1YWxpdHlsZXZlbCAgJWRcbiIsIGFwcERhdGEucXVhbGl0eUxldmVsKTsKLSsJfQotKwotKyNpZmRlZiBUVVJCT1ZOQwotKyAgICByZXF1ZXN0U3Vic2FtcExldmVsID0gVHJ1ZTsKLSsgICAgdFFMID0gYXBwRGF0YS5xdWFsaXR5TGV2ZWwgLyAxMDsKLSsgICAgaWYgKHRRTCA8IDApIHRRTCA9IDE7Ci0rICAgIGlmICh0UUwgPiA5KSB0UUwgPSA5OwotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRSh0UUwgKyByZmJFbmNvZGluZ1F1YWxpdHlMZXZlbDApOwotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLnF1YWxpdHlMZXZlbCArIHJmYkpwZWdRdWFsaXR5TGV2ZWwxIC0gMSk7Ci0rICAgIGlmIChzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MgJiYgcmVxdWVzdFN1YnNhbXBMZXZlbCkgewotKwlpZiAoYXBwRGF0YS5zdWJzYW1wTGV2ZWwgPCAwIHx8IGFwcERhdGEuc3Vic2FtcExldmVsID4gVFZOQ19TQU1QT1BUIC0gMSkgewotKwkJYXBwRGF0YS5zdWJzYW1wTGV2ZWwgPSBUVk5DXzFYOwotKwl9Ci0rCWVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKGFwcERhdGEuc3Vic2FtcExldmVsICsgcmZiSnBlZ1N1YnNhbXAxWCk7Ci0rICAgIH0KLSsjZWxzZQotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShhcHBEYXRhLnF1YWxpdHlMZXZlbCArIHJmYkVuY29kaW5nUXVhbGl0eUxldmVsMCk7Ci0rI2VuZGlmCi0rCi0gICAgIH0KLSAKLSAgICAgaWYgKGFwcERhdGEudXNlUmVtb3RlQ3Vyc29yKSB7Ci0gICAgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdYQ3Vyc29yKTsKLS0gICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ1JpY2hDdXJzb3IpOwotKyAgICAgIGlmICghYXBwRGF0YS51c2VYMTFDdXJzb3IpIHsKLSsgICAgICAJZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdSaWNoQ3Vyc29yKTsKLSsgICAgICB9Ci0gICAgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdQb2ludGVyUG9zKTsKLSAgICAgfQotIAotICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ0xhc3RSZWN0KTsKLSsgICAgZW5jc1tzZS0+bkVuY29kaW5ncysrXSA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdOZXdGQlNpemUpOwotICAgfQotIAotICAgbGVuID0gc3pfcmZiU2V0RW5jb2RpbmdzTXNnICsgc2UtPm5FbmNvZGluZ3MgKiA0OwotIAotLSAgc2UtPm5FbmNvZGluZ3MgPSBTd2FwMTZJZkxFKHNlLT5uRW5jb2RpbmdzKTsKLSsJaWYgKCFhcHBEYXRhLnVsdHJhRFNNKSB7Ci0rCQlzZS0+bkVuY29kaW5ncyA9IFN3YXAxNklmTEUoc2UtPm5FbmNvZGluZ3MpOwotIAotLSAgaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIGJ1ZiwgbGVuKSkgcmV0dXJuIEZhbHNlOwotKwkJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIGJ1ZiwgbGVuKSkgcmV0dXJuIEZhbHNlOwotKwl9IGVsc2UgewotKwkJLyogZm9yIFVsdHJhVk5DIGVuY3J5cHRpb24gRFNNIHdlIGhhdmUgdG8gc2VuZCBlYWNoIGVuY29kaW5nIHNlcGFyYXRlbHkgKHdoeT8pICovCi0rCQlpbnQgaSwgZXJycyA9IDAsIG5lbmMgPSBzZS0+bkVuY29kaW5nczsKLSsJCQotKwkJc2UtPm5FbmNvZGluZ3MgPSBTd2FwMTZJZkxFKHNlLT5uRW5jb2RpbmdzKTsKLSsKLSsJCWN1cnJlbnRNc2cgPSByZmJTZXRFbmNvZGluZ3M7Ci0rCQlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgYnVmLCBzel9yZmJTZXRFbmNvZGluZ3NNc2cpKSBlcnJzKys7Ci0rCQlmb3IgKGk9MDsgaSA8IG5lbmM7IGkrKykgewotKwkJCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZlbmNzW2ldLCBzaXplb2YoQ0FSRDMyKSkpIGVycnMrKzsKLSsJCX0KLSsJCWlmIChlcnJzKSByZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLSAgIHJldHVybiBUcnVlOwotIH0KLUBAIC04NjgsMzEgKzIxMzYsODYgQEAKLSBCb29sCi0gU2VuZEluY3JlbWVudGFsRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KCkKLSB7Ci0tICByZXR1cm4gU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgwLCAwLCBzaS5mcmFtZWJ1ZmZlcldpZHRoLAotLQkJCQkgICAgICBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgVHJ1ZSk7Ci0rCXJldHVybiBTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsCi0rCSAgICBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgVHJ1ZSk7Ci0gfQotIAotK3RpbWVfdCBsYXN0X2ZpbGV4ZmVyID0gMDsKLStpbnQgZGVsYXlfZmlsZXhmZXIgPSAzOwotK2V4dGVybiB2b2lkIENoZWNrRmlsZVhmZXIodm9pZCk7Ci0rZXh0ZXJuIGludCByZmJzb2NrX2lzX3JlYWR5KHZvaWQpOwotKwotKwotK3N0YXRpYyBpbnQgZHluID0gLTE7Ci0rZXh0ZXJuIGludCBmaWxleGZlcl9zb2NrOwotK2V4dGVybiBpbnQgZmlsZXhmZXJfbGlzdGVuOwotIAotIC8qCi0gICogU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdC4KLSAgKi8KLS0KLSBCb29sCi0gU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQm9vbCBpbmNyZW1lbnRhbCkKLSB7Ci0tICByZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3RNc2cgZnVyOwotKwlyZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3RNc2cgZnVyOwotKwlzdGF0aWMgaW50IGRiID0gLTE7Ci0gCi0tICBmdXIudHlwZSA9IHJmYkZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdDsKLS0gIGZ1ci5pbmNyZW1lbnRhbCA9IGluY3JlbWVudGFsID8gMSA6IDA7Ci0tICBmdXIueCA9IFN3YXAxNklmTEUoeCk7Ci0tICBmdXIueSA9IFN3YXAxNklmTEUoeSk7Ci0tICBmdXIudyA9IFN3YXAxNklmTEUodyk7Ci0tICBmdXIuaCA9IFN3YXAxNklmTEUoaCk7Ci0rCWlmIChkYiA8IDApIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX0RFQlVHX1JFQ1RTIikpIHsKLSsJCQlkYiA9IGF0b2koZ2V0ZW52KCJTU1ZOQ19ERUJVR19SRUNUUyIpKTsKLSsJCX0gZWxzZSB7Ci0rCQkJZGIgPSAwOwotKwkJfQotKwl9Ci0gCi0tICBpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmZnVyLCBzel9yZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3RNc2cpKQotLSAgICByZXR1cm4gRmFsc2U7Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KCVkLCAlZCwgJWQsICVkLCBpbmNyZW1lbnRhbD0lZClcbiIsIHgsIHksIHcsIGgsIChpbnQpIGluY3JlbWVudGFsKTsKLSAKLS0gIHJldHVybiBUcnVlOwotKwlpZiAoZHluIDwgMCkgewotKwkJc3RydWN0IHN0YXQgc2I7Ci0rCQlpZiAoZ2V0ZW52KCJVU0VSIikgJiYgIXN0cmNtcChnZXRlbnYoIlVTRVIiKSwgInJ1bmdlIikpIHsKLSsJCQlpZiAoc3RhdCgiL3RtcC9ub2R5biIsICZzYikgPT0gMCkgewotKwkJCQlwdXRlbnYoIk5PRlRGQlVQREFURVM9MSIpOwotKwkJCQl1bmxpbmsoIi90bXAvbm9keW4iKTsKLSsJCQl9Ci0rCQl9Ci0rCQlpZiAoZ2V0ZW52KCJOT0ZURkJVUERBVEVTIikpIHsKLSsJCQlkeW4gPSAwOwotKwkJfSBlbHNlIHsKLSsJCQlkeW4gPSAxOwotKwkJfQotKwl9Ci0rCi0rCWlmIChhcHBEYXRhLmZpbGVBY3RpdmUgJiYgZmlsZXhmZXJfc29jayA+PSAwKSB7Ci0rCQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLSsJCWlmIChmaXJzdCkgewotKwkJCWZwcmludGYoc3RkZXJyLCAiU0ZVOiBkeW5hbWljIGZiIHVwZGF0ZXMgZHVyaW5nIGZpbGV4ZmVyOiAlZFxuIiwgZHluKTsKLSsJCQlmaXJzdCA9IDA7Ci0rCQl9Ci0raWYgKGRiID4gMiB8fCAwKSBmcHJpbnRmKHN0ZGVyciwgIkEgc2Z1cjogJWQgJWQgJWQgJWQgZF9sYXN0OiAlZFxuIiwgeCwgeSwgdywgaCwgKGludCkgKHRpbWUoTlVMTCkgLSBsYXN0X2ZpbGV4ZmVyKSk7Ci0rCQlpZiAoIWR5biB8fCB0aW1lKE5VTEwpIDwgbGFzdF9maWxleGZlciArIGRlbGF5X2ZpbGV4ZmVyKSB7Ci0rCQkJcmV0dXJuIFRydWU7Ci0rCQl9Ci0rCX0KLStpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIkIgc2Z1cjogJWQgJWQgJWQgJWRcbiIsIHgsIHksIHcsIGgpOwotKwotKwlmdXIudHlwZSA9IHJmYkZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdDsKLSsJZnVyLmluY3JlbWVudGFsID0gaW5jcmVtZW50YWwgPyAxIDogMDsKLSsJZnVyLnggPSBTd2FwMTZJZkxFKHgpOwotKwlmdXIueSA9IFN3YXAxNklmTEUoeSk7Ci0rCWZ1ci53ID0gU3dhcDE2SWZMRSh3KTsKLSsJZnVyLmggPSBTd2FwMTZJZkxFKGgpOwotKwotKwlpZiAoaW5jcmVtZW50YWwpIHsKLSsJCXNlbnRfRkJVID0gMTsKLSsJfSBlbHNlIHsKLSsJCXNlbnRfRkJVID0gMjsKLSsJfQotKwotKwljdXJyZW50TXNnID0gcmZiRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0OwotKwlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmZnVyLCBzel9yZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3RNc2cpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsKLSsJcmV0dXJuIFRydWU7Ci0gfQotIAotIAotQEAgLTkwMywxOSArMjIyNiwzOCBAQAotIEJvb2wKLSBTZW5kUG9pbnRlckV2ZW50KGludCB4LCBpbnQgeSwgaW50IGJ1dHRvbk1hc2spCi0gewotLSAgcmZiUG9pbnRlckV2ZW50TXNnIHBlOwotKwlyZmJQb2ludGVyRXZlbnRNc2cgcGU7Ci0rCi0rCWlmIChhcHBEYXRhLmZpbGVBY3RpdmUpIHsKLSsJCWlmICghZHluIHx8IHRpbWUoTlVMTCkgPCBsYXN0X2ZpbGV4ZmVyICsgZGVsYXlfZmlsZXhmZXIpIHsKLSsjaWYgMAotKwkJCWZwcmludGYoc3RkZXJyLCAic2tpcCBTZW5kUG9pbnRlckV2ZW50OiAlZCAtICVkXG4iLCBsYXN0X2ZpbGV4ZmVyLCB0aW1lKE5VTEwpKTsKLSsjZW5kaWYKLSsJCQlyZXR1cm4gVHJ1ZTsKLSsJCX0KLSsJfQotIAotLSAgcGUudHlwZSA9IHJmYlBvaW50ZXJFdmVudDsKLS0gIHBlLmJ1dHRvbk1hc2sgPSBidXR0b25NYXNrOwotLSAgaWYgKHggPCAwKSB4ID0gMDsKLS0gIGlmICh5IDwgMCkgeSA9IDA7Ci0tCi0tICBpZiAoIWFwcERhdGEudXNlWDExQ3Vyc29yKQotLSAgICBTb2Z0Q3Vyc29yTW92ZSh4LCB5KTsKLS0KLS0gIHBlLnggPSBTd2FwMTZJZkxFKHgpOwotLSAgcGUueSA9IFN3YXAxNklmTEUoeSk7Ci0tICByZXR1cm4gV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZwZSwgc3pfcmZiUG9pbnRlckV2ZW50TXNnKTsKLSsJcGUudHlwZSA9IHJmYlBvaW50ZXJFdmVudDsKLSsJcGUuYnV0dG9uTWFzayA9IGJ1dHRvbk1hc2s7Ci0rCi0rCWlmIChzY2FsZV9mYWN0b3JfeCA+IDAuMCAmJiBzY2FsZV9mYWN0b3JfeCAhPSAxLjApIHsKLSsJCXggLz0gc2NhbGVfZmFjdG9yX3g7Ci0rCX0KLSsJaWYgKHNjYWxlX2ZhY3Rvcl95ID4gMC4wICYmIHNjYWxlX2ZhY3Rvcl95ICE9IDEuMCkgewotKwkJeSAvPSBzY2FsZV9mYWN0b3JfeTsKLSsJfQotKwotKwlpZiAoeCA8IDApIHggPSAwOwotKwlpZiAoeSA8IDApIHkgPSAwOwotKwotKwlpZiAoIWFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQlTb2Z0Q3Vyc29yTW92ZSh4LCB5KTsKLSsJfQotKwotKwlwZS54ID0gU3dhcDE2SWZMRSh4KTsKLSsJcGUueSA9IFN3YXAxNklmTEUoeSk7Ci0rCWN1cnJlbnRNc2cgPSByZmJQb2ludGVyRXZlbnQ7Ci0rCXJldHVybiBXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnBlLCBzel9yZmJQb2ludGVyRXZlbnRNc2cpOwotIH0KLSAKLSAKLUBAIC05MjYsMTIgKzIyNjgsMjIgQEAKLSBCb29sCi0gU2VuZEtleUV2ZW50KENBUkQzMiBrZXksIEJvb2wgZG93bikKLSB7Ci0tICByZmJLZXlFdmVudE1zZyBrZTsKLSsJcmZiS2V5RXZlbnRNc2cga2U7Ci0rCi0rCWlmIChhcHBEYXRhLmZpbGVBY3RpdmUpIHsKLSsJCWlmICghZHluIHx8IHRpbWUoTlVMTCkgPCBsYXN0X2ZpbGV4ZmVyICsgZGVsYXlfZmlsZXhmZXIpIHsKLSsjaWYgMAotKwkJCWZwcmludGYoc3RkZXJyLCAic2tpcCBTZW5kUG9pbnRlckV2ZW50OiAlZCAtICVkXG4iLCBsYXN0X2ZpbGV4ZmVyLCB0aW1lKE5VTEwpKTsKLSsjZW5kaWYKLSsJCQlyZXR1cm4gVHJ1ZTsKLSsJCX0KLSsJfQotIAotLSAga2UudHlwZSA9IHJmYktleUV2ZW50OwotLSAga2UuZG93biA9IGRvd24gPyAxIDogMDsKLS0gIGtlLmtleSA9IFN3YXAzMklmTEUoa2V5KTsKLS0gIHJldHVybiBXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJmtlLCBzel9yZmJLZXlFdmVudE1zZyk7Ci0rCWtlLnR5cGUgPSByZmJLZXlFdmVudDsKLSsJa2UuZG93biA9IGRvd24gPyAxIDogMDsKLSsJa2Uua2V5ID0gU3dhcDMySWZMRShrZXkpOwotKwljdXJyZW50TXNnID0gcmZiS2V5RXZlbnQ7Ci0rCXJldHVybiBXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJmtlLCBzel9yZmJLZXlFdmVudE1zZyk7Ci0gfQotIAotIAotQEAgLTk0MiwyODEgKzIyOTQsMTAyNSBAQAotIEJvb2wKLSBTZW5kQ2xpZW50Q3V0VGV4dChjaGFyICpzdHIsIGludCBsZW4pCi0gewotLSAgcmZiQ2xpZW50Q3V0VGV4dE1zZyBjY3Q7Ci0rCXJmYkNsaWVudEN1dFRleHRNc2cgY2N0OwotKwotKwlpZiAoc2VydmVyQ3V0VGV4dCkgewotKwkJZnJlZShzZXJ2ZXJDdXRUZXh0KTsKLSsJfQotKwlzZXJ2ZXJDdXRUZXh0ID0gTlVMTDsKLSsKLSsJaWYgKGFwcERhdGEuZmlsZUFjdGl2ZSkgewotKwkJaWYgKCFkeW4gfHwgdGltZShOVUxMKSA8IGxhc3RfZmlsZXhmZXIgKyBkZWxheV9maWxleGZlcikgewotKwkJCS8qIHVsdHJhdm5jIGphdmEgdmlld2VyIGxldHMgdGhpcyBvbmUgdGhyb3VnaC4gKi8KLSsJCQlyZXR1cm4gVHJ1ZTsKLSsJCX0KLSsJfQotKwotKwlpZiAoYXBwRGF0YS52aWV3T25seSkgewotKwkJcmV0dXJuIFRydWU7Ci0rCX0KLSAKLS0gIGlmIChzZXJ2ZXJDdXRUZXh0KQotLSAgICBmcmVlKHNlcnZlckN1dFRleHQpOwotLSAgc2VydmVyQ3V0VGV4dCA9IE5VTEw7Ci0tCi0tICBjY3QudHlwZSA9IHJmYkNsaWVudEN1dFRleHQ7Ci0tICBjY3QubGVuZ3RoID0gU3dhcDMySWZMRShsZW4pOwotLSAgcmV0dXJuICAoV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjY3QsIHN6X3JmYkNsaWVudEN1dFRleHRNc2cpICYmCi0tCSAgIFdyaXRlRXhhY3QocmZic29jaywgc3RyLCBsZW4pKTsKLSsJY2N0LnR5cGUgPSByZmJDbGllbnRDdXRUZXh0OwotKwljY3QubGVuZ3RoID0gU3dhcDMySWZMRSgodW5zaWduZWQgaW50KSBsZW4pOwotKwljdXJyZW50TXNnID0gcmZiQ2xpZW50Q3V0VGV4dDsKLSsJcmV0dXJuICAoV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjY3QsIHN6X3JmYkNsaWVudEN1dFRleHRNc2cpICYmCi0rCSAgICBXcml0ZUV4YWN0KHJmYnNvY2ssIHN0ciwgbGVuKSk7Ci0gfQotIAotK3N0YXRpYyBpbnQgdWx0cmFfc2NhbGUgPSAwOwotIAotLS8qCi0tICogSGFuZGxlUkZCU2VydmVyTWVzc2FnZS4KLS0gKi8KLStCb29sCi0rU2VuZFNlcnZlclNjYWxlKGludCBuZmFjKQotK3sKLSsJcmZiU2V0U2NhbGVNc2cgc3NjOwotKwlpZiAobmZhYyA8IDAgfHwgbmZhYyA+IDEwMCkgewotKwkJcmV0dXJuIFRydWU7Ci0rCX0KLSsKLSsJdWx0cmFfc2NhbGUgPSBuZmFjOwotKwlzc2MudHlwZSA9IHJmYlNldFNjYWxlOwotKwlzc2Muc2NhbGUgPSBuZmFjOwotKwljdXJyZW50TXNnID0gcmZiU2V0U2NhbGU7Ci0rCXJldHVybiBXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnNzYywgc3pfcmZiU2V0U2NhbGVNc2cpOwotK30KLSAKLSBCb29sCi0tSGFuZGxlUkZCU2VydmVyTWVzc2FnZSgpCi0rU2VuZFNlcnZlcklucHV0KEJvb2wgZW5hYmxlZCkKLSB7Ci0tICByZmJTZXJ2ZXJUb0NsaWVudE1zZyBtc2c7Ci0rCXJmYlNldFNlcnZlcklucHV0TXNnIHNpbTsKLSAKLS0gIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmbXNnLCAxKSkKLS0gICAgcmV0dXJuIEZhbHNlOwotKwlzaW0udHlwZSA9IHJmYlNldFNlcnZlcklucHV0OwotKwlzaW0uc3RhdHVzID0gZW5hYmxlZDsKLSsJY3VycmVudE1zZyA9IHJmYlNldFNlcnZlcklucHV0OwotKwlyZXR1cm4gV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZzaW0sIHN6X3JmYlNldFNlcnZlcklucHV0TXNnKTsKLSt9Ci0gCi0tICBzd2l0Y2ggKG1zZy50eXBlKSB7Ci0rQm9vbAotK1NlbmRTaW5nbGVXaW5kb3coaW50IHgsIGludCB5KQotK3sKLSsJc3RhdGljIGludCB3X29sZCA9IC0xLCBoX29sZCA9IC0xOwotKwlyZmJTZXRTV01zZyBzdzsKLSAKLS0gIGNhc2UgcmZiU2V0Q29sb3VyTWFwRW50cmllczoKLS0gIHsKLS0gICAgaW50IGk7Ci0tICAgIENBUkQxNiByZ2JbM107Ci0tICAgIFhDb2xvciB4YzsKLSsJZnByaW50ZihzdGRlcnIsICJTZW5kU2luZ2xlV2luZG93OiAlZCAlZFxuIiwgeCwgeSk7Ci0gCi0tICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKChjaGFyICopJm1zZykgKyAxLAotLQkJCSAgIHN6X3JmYlNldENvbG91ck1hcEVudHJpZXNNc2cgLSAxKSkKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0rCWlmICh4ID09IC0xICYmIHkgPT0gLTEpICB7Ci0rCQlzdy50eXBlID0gcmZiU2V0U1c7Ci0rCQlzdy54ID0gU3dhcDE2SWZMRSgxKTsKLSsJCXN3LnkgPSBTd2FwMTZJZkxFKDEpOwotKwkJaWYgKHdfb2xkID4gMCkgewotKwkJCXNpLmZyYW1lYnVmZmVyV2lkdGggID0gd19vbGQ7Ci0rCQkJc2kuZnJhbWVidWZmZXJIZWlnaHQgPSBoX29sZDsKLSsJCQlSZURvRGVza3RvcCgpOwotKwkJfQotKwkJd19vbGQgPSBoX29sZCA9IC0xOwotKwl9IGVsc2UgewotKwkJc3cudHlwZSA9IHJmYlNldFNXOwotKwkJc3cueCA9IFN3YXAxNklmTEUoeCk7Ci0rCQlzdy55ID0gU3dhcDE2SWZMRSh5KTsKLSsJCXdfb2xkID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCWhfb2xkID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCQkKLSsJfQotKwlzdy5zdGF0dXMgPSBUcnVlOwotKwljdXJyZW50TXNnID0gcmZiU2V0U1c7Ci0rCXJldHVybiBXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnN3LCBzel9yZmJTZXRTV01zZyk7Ci0rfQotIAotLSAgICBtc2cuc2NtZS5maXJzdENvbG91ciA9IFN3YXAxNklmTEUobXNnLnNjbWUuZmlyc3RDb2xvdXIpOwotLSAgICBtc2cuc2NtZS5uQ29sb3VycyA9IFN3YXAxNklmTEUobXNnLnNjbWUubkNvbG91cnMpOwotK0Jvb2wKLStTZW5kVGV4dENoYXQoY2hhciAqc3RyKQotK3sKLSsJc3RhdGljIGludCBkYiA9IC0xOwotKwlyZmJUZXh0Q2hhdE1zZyBjaGF0OwotIAotLSAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLnNjbWUubkNvbG91cnM7IGkrKykgewotLSAgICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKilyZ2IsIDYpKQotLQlyZXR1cm4gRmFsc2U7Ci0tICAgICAgeGMucGl4ZWwgPSBtc2cuc2NtZS5maXJzdENvbG91ciArIGk7Ci0tICAgICAgeGMucmVkID0gU3dhcDE2SWZMRShyZ2JbMF0pOwotLSAgICAgIHhjLmdyZWVuID0gU3dhcDE2SWZMRShyZ2JbMV0pOwotLSAgICAgIHhjLmJsdWUgPSBTd2FwMTZJZkxFKHJnYlsyXSk7Ci0tICAgICAgeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsKLS0gICAgICBYU3RvcmVDb2xvcihkcHksIGNtYXAsICZ4Yyk7Ci0tICAgIH0KLSsJaWYgKGRiIDwgMCkgewotKwkJaWYgKGdldGVudigiU1NWTkNfREVCVUdfQ0hBVCIpKSB7Ci0rCQkJZGIgPSAxOwotKwkJfSBlbHNlIHsKLSsJCQlkYiA9IDA7Ci0rCQl9Ci0rCX0KLSsJaWYgKCFhcHBEYXRhLmNoYXRBY3RpdmUpIHsKLSsJCVNlbmRUZXh0Q2hhdE9wZW4oKTsKLSsJCWFwcERhdGEuY2hhdEFjdGl2ZSA9IFRydWU7Ci0rCX0KLSAKLS0gICAgYnJlYWs7Ci0tICB9Ci0rCWNoYXQudHlwZSA9IHJmYlRleHRDaGF0OwotKwljaGF0LnBhZDEgPSAwOwotKwljaGF0LnBhZDIgPSAwOwotKwljaGF0Lmxlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihzdHIpOwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiU2VuZFRleHRDaGF0OiAlZCAnJXMnXG4iLCAoaW50KSBjaGF0Lmxlbmd0aCwgc3RyKTsKLSsJY2hhdC5sZW5ndGggPSBTd2FwMzJJZkxFKGNoYXQubGVuZ3RoKTsKLSsJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJmNoYXQsIHN6X3JmYlRleHRDaGF0TXNnKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCWN1cnJlbnRNc2cgPSByZmJUZXh0Q2hhdDsKLSsJcmV0dXJuIFdyaXRlRXhhY3QocmZic29jaywgc3RyLCBzdHJsZW4oc3RyKSk7Ci0rfQotIAotLSAgY2FzZSByZmJGcmFtZWJ1ZmZlclVwZGF0ZToKLS0gIHsKLS0gICAgcmZiRnJhbWVidWZmZXJVcGRhdGVSZWN0SGVhZGVyIHJlY3Q7Ci0tICAgIGludCBsaW5lc1RvUmVhZDsKLS0gICAgaW50IGJ5dGVzUGVyTGluZTsKLS0gICAgaW50IGk7Ci0tICAgIGludCB1c2VjczsKLStleHRlcm4gdm9pZCByYWlzZW1lKGludCBmb3JjZSk7Ci0gCi0tICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKChjaGFyICopJm1zZy5mdSkgKyAxLAotLQkJCSAgIHN6X3JmYkZyYW1lYnVmZmVyVXBkYXRlTXNnIC0gMSkpCi0tICAgICAgcmV0dXJuIEZhbHNlOwotK0Jvb2wKLStTZW5kVGV4dENoYXRPcGVuKHZvaWQpCi0rewotKwlyZmJUZXh0Q2hhdE1zZyBjaGF0OwotIAotLSAgICBtc2cuZnUublJlY3RzID0gU3dhcDE2SWZMRShtc2cuZnUublJlY3RzKTsKLSsJcmFpc2VtZSgwKTsKLSsJY2hhdC50eXBlID0gcmZiVGV4dENoYXQ7Ci0rCWNoYXQucGFkMSA9IDA7Ci0rCWNoYXQucGFkMiA9IDA7Ci0rCWNoYXQubGVuZ3RoID0gU3dhcDMySWZMRShyZmJUZXh0Q2hhdE9wZW4pOwotKwlyZXR1cm4gV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjaGF0LCBzel9yZmJUZXh0Q2hhdE1zZyk7Ci0rfQotIAotLSAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmZ1Lm5SZWN0czsgaSsrKSB7Ci0tICAgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZyZWN0LCBzel9yZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlY3RIZWFkZXIpKQotLQlyZXR1cm4gRmFsc2U7Ci0rQm9vbAotK1NlbmRUZXh0Q2hhdENsb3NlKHZvaWQpCi0rewotKwlyZmJUZXh0Q2hhdE1zZyBjaGF0OwotKwljaGF0LnR5cGUgPSByZmJUZXh0Q2hhdDsKLSsJY2hhdC5wYWQxID0gMDsKLSsJY2hhdC5wYWQyID0gMDsKLSsJY2hhdC5sZW5ndGggPSBTd2FwMzJJZkxFKHJmYlRleHRDaGF0Q2xvc2UpOwotKwlhcHBEYXRhLmNoYXRBY3RpdmUgPSBGYWxzZTsKLSsJcmV0dXJuIFdyaXRlRXhhY3QocmZic29jaywgKGNoYXIgKikmY2hhdCwgc3pfcmZiVGV4dENoYXRNc2cpOwotK30KLSAKLS0gICAgICByZWN0LmVuY29kaW5nID0gU3dhcDMySWZMRShyZWN0LmVuY29kaW5nKTsKLS0gICAgICBpZiAocmVjdC5lbmNvZGluZyA9PSByZmJFbmNvZGluZ0xhc3RSZWN0KQotLQlicmVhazsKLStCb29sCi0rU2VuZFRleHRDaGF0RmluaXNoZWQodm9pZCkKLSt7Ci0rCXJmYlRleHRDaGF0TXNnIGNoYXQ7Ci0rCWNoYXQudHlwZSA9IHJmYlRleHRDaGF0OwotKwljaGF0LnBhZDEgPSAwOwotKwljaGF0LnBhZDIgPSAwOwotKwljaGF0Lmxlbmd0aCA9IFN3YXAzMklmTEUocmZiVGV4dENoYXRGaW5pc2hlZCk7Ci0rCWFwcERhdGEuY2hhdEFjdGl2ZSA9IEZhbHNlOwotKwlyZXR1cm4gV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZjaGF0LCBzel9yZmJUZXh0Q2hhdE1zZyk7Ci0rfQotKwotK2V4dGVybiBpbnQgZG9fZm9ybWF0X2NoYW5nZTsKLStleHRlcm4gaW50IGRvX2N1cnNvcl9jaGFuZ2U7Ci0rZXh0ZXJuIGRvdWJsZSBkb19mYl91cGRhdGU7Ci0rZXh0ZXJuIHZvaWQgY3V0b3Zlcl9mb3JtYXRfY2hhbmdlKHZvaWQpOwotKwotK2RvdWJsZSBkdGltZShkb3VibGUgKnRfb2xkKSB7Ci0rICAgICAgICAvKiAKLSsgICAgICAgICAqIHVzYWdlOiBjYWxsIHdpdGggMC4wIHRvIGluaXRpYWxpemUsIHN1YnNlcXVlbnQgY2FsbHMgZ2l2ZQotKyAgICAgICAgICogdGhlIHRpbWUgZGlmZmVyZW5jZSBzaW5jZSBsYXN0IGNhbGwuCi0rICAgICAgICAgKi8KLSsgICAgICAgIGRvdWJsZSB0X25vdywgZHQ7Ci0rICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0rCi0rICAgICAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0rICAgICAgICB0X25vdyA9IG5vdy50dl9zZWMgKyAoIChkb3VibGUpIG5vdy50dl91c2VjLzEwMDAwMDAuICk7Ci0rICAgICAgICBpZiAoKnRfb2xkID09IDAuMCkgewotKyAgICAgICAgICAgICAgICAqdF9vbGQgPSB0X25vdzsKLSsgICAgICAgICAgICAgICAgcmV0dXJuIHRfbm93OwotKyAgICAgICAgfQotKyAgICAgICAgZHQgPSB0X25vdyAtICp0X29sZDsKLSsgICAgICAgICp0X29sZCA9IHRfbm93OwotKyAgICAgICAgcmV0dXJuKGR0KTsKLSt9Ci0rCi0rLyogY29tbW9uIGR0aW1lKCkgYWN0aXZpdGllczogKi8KLStkb3VibGUgZHRpbWUwKGRvdWJsZSAqdF9vbGQpIHsKLSsgICAgICAgICp0X29sZCA9IDAuMDsKLSsgICAgICAgIHJldHVybiBkdGltZSh0X29sZCk7Ci0rfQotKwotK2RvdWJsZSBkbm93KHZvaWQpIHsKLSsgICAgICAgIGRvdWJsZSB0OwotKyAgICAgICAgcmV0dXJuIGR0aW1lMCgmdCk7Ci0rfQotKwotK3N0YXRpYyBjaGFyIGZ4ZmVyWzY1NTM2XTsKLSsKLStCb29sIEhhbmRsZUZpbGVYZmVyKHZvaWQpIHsKLSsJdW5zaWduZWQgY2hhciBoZHJbMTJdOwotKwl1bnNpZ25lZCBpbnQgbGVuOwotKwotKyAgICAgICAgaW50IHJmYkRpckNvbnRlbnRSZXF1ZXN0ID0gMTsKLSsgICAgICAgIGludCByZmJEaXJQYWNrZXQgPSAyOyAvKiBGdWxsIGRpcmVjdG9yeSBuYW1lIG9yIGZ1bGwgZmlsZSBuYW1lLiAqLwotKyAgICAgICAgaW50IHJmYkZpbGVUcmFuc2ZlclJlcXVlc3QgPSAzOwotKyAgICAgICAgaW50IHJmYkZpbGVIZWFkZXIgPSA0OwotKyAgICAgICAgaW50IHJmYkZpbGVQYWNrZXQgPSA1OyAvKiBPbmUgc2xpY2Ugb2YgdGhlIGZpbGUgKi8KLSsgICAgICAgIGludCByZmJFbmRPZkZpbGUgPSA2OwotKyAgICAgICAgaW50IHJmYkFib3J0RmlsZVRyYW5zZmVyID0gNzsKLSsgICAgICAgIGludCByZmJGaWxlVHJhbnNmZXJPZmZlciA9IDg7Ci0rICAgICAgICBpbnQgcmZiRmlsZUFjY2VwdEhlYWRlciA9IDk7IC8qIFRoZSBzZXJ2ZXIgYWNjZXB0cyBvciByZWplY3RzIHRoZSBmaWxlICovCi0rICAgICAgICBpbnQgcmZiQ29tbWFuZCA9IDEwOwotKyAgICAgICAgaW50IHJmYkNvbW1hbmRSZXR1cm4gPSAxMTsKLSsgICAgICAgIGludCByZmJGaWxlQ2hlY2tzdW1zID0gMTI7Ci0rCi0rICAgICAgICBpbnQgcmZiUkRpckNvbnRlbnQgPSAxOyAvKiBSZXF1ZXN0IGEgU2VydmVyIERpcmVjdG9yeSBjb250ZW50cyAqLwotKyAgICAgICAgaW50IHJmYlJEcml2ZXNMaXN0ID0gMjsgLyogUmVxdWVzdCB0aGUgc2VydmVyJ3MgZHJpdmVzIGxpc3QgKi8KLSsKLSsgICAgICAgIGludCByZmJBRGlyZWN0b3J5ID0gMTsgLyogUmVjZXB0aW9uIG9mIGEgZGlyZWN0b3J5IG5hbWUgKi8KLSsgICAgICAgIGludCByZmJBRmlsZSA9IDI7IC8qIFJlY2VwdGlvbiBvZiBhIGZpbGUgbmFtZSAgKi8KLSsgICAgICAgIGludCByZmJBRHJpdmVzTGlzdCA9IDM7IC8qIFJlY2VwdGlvbiBvZiBhIGxpc3Qgb2YgZHJpdmVzICovCi0rICAgICAgICBpbnQgcmZiQURpckNyZWF0ZSA9IDQ7IC8qIFJlc3BvbnNlIHRvIGEgY3JlYXRlIGRpciBjb21tYW5kICAqLwotKyAgICAgICAgaW50IHJmYkFEaXJEZWxldGUgPSA1OyAvKiBSZXNwb25zZSB0byBhIGRlbGV0ZSBkaXIgY29tbWFuZCAgKi8KLSsgICAgICAgIGludCByZmJBRmlsZUNyZWF0ZSA9IDY7IC8qIFJlc3BvbnNlIHRvIGEgY3JlYXRlIGZpbGUgY29tbWFuZCAgKi8KLSsgICAgICAgIGludCByZmJBRmlsZURlbGV0ZSA9IDc7IC8qIFJlc3BvbnNlIHRvIGEgZGVsZXRlIGZpbGUgY29tbWFuZCAqLwotKwotKyAgICAgICAgaW50IHJmYkNEaXJDcmVhdGUgPSAxOyAvKiBSZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gY3JlYXRlIHRoZSBnaXZlbiBkaXJlY3RvcnkgKi8KLSsgICAgICAgIGludCByZmJDRGlyRGVsZXRlID0gMjsgLyogUmVxdWVzdCB0aGUgc2VydmVyIHRvIGRlbGV0ZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5ICovCi0rICAgICAgICBpbnQgcmZiQ0ZpbGVDcmVhdGUgPSAzOyAvKiBSZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gY3JlYXRlIHRoZSBnaXZlbiBmaWxlICovCi0rICAgICAgICBpbnQgcmZiQ0ZpbGVEZWxldGUgPSA0OyAvKiBSZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBnaXZlbiBmaWxlICovCi0rCi0rICAgICAgICBpbnQgcmZiUkVycm9yVW5rbm93bkNtZCA9IDE7IC8qIFVua25vd24gRmlsZVRyYW5zZmVyIGNvbW1hbmQuICovCi0rI2RlZmluZSByZmJSRXJyb3JDbWQgMHhGRkZGRkZGRgotKwotKwlzdGF0aWMgaW50IGRiID0gLTE7Ci0rCXN0YXRpYyBpbnQgZ3Vlc3NfeDExdm5jID0gMDsKLSsKLSsjaWYgMAotKwlpZiAoZmlsZXhmZXJfc29jayA8IDApIHsKLSsJCXJldHVybiBUcnVlOwotKwl9Ci0rCS8qIGluc3RlYWQsIHdlIHJlYWQgYW5kIGRpc2NhcmQgdGhlIGZ0IG1zZyBkYXRhLiAqLwotKyNlbmRpZgotKwotKy8qZnByaW50ZihzdGRlcnIsICJJbiAgSGFuZGxlRmlsZVhmZXJcbiIpOyAqLwotIAotLSAgICAgIHJlY3Quci54ID0gU3dhcDE2SWZMRShyZWN0LnIueCk7Ci0tICAgICAgcmVjdC5yLnkgPSBTd2FwMTZJZkxFKHJlY3Quci55KTsKLS0gICAgICByZWN0LnIudyA9IFN3YXAxNklmTEUocmVjdC5yLncpOwotLSAgICAgIHJlY3Quci5oID0gU3dhcDE2SWZMRShyZWN0LnIuaCk7Ci0tCi0tICAgICAgaWYgKHJlY3QuZW5jb2RpbmcgPT0gcmZiRW5jb2RpbmdYQ3Vyc29yIHx8Ci0tCSAgcmVjdC5lbmNvZGluZyA9PSByZmJFbmNvZGluZ1JpY2hDdXJzb3IpIHsKLS0JaWYgKCFIYW5kbGVDdXJzb3JTaGFwZShyZWN0LnIueCwgcmVjdC5yLnksIHJlY3Quci53LCByZWN0LnIuaCwKLS0JCQkgICAgICByZWN0LmVuY29kaW5nKSkgewotLQkgIHJldHVybiBGYWxzZTsKLSsJaWYgKGRiIDwgMCkgewotKwkJaWYgKGdldGVudigiREVCVUdfSGFuZGxlRmlsZVhmZXIiKSkgewotKwkJCWRiID0gMTsKLSsJCX0gZWxzZSB7Ci0rCQkJZGIgPSAwOwotKwkJfQotIAl9Ci0tCWNvbnRpbnVlOwotLSAgICAgIH0KLSAKLS0gICAgICBpZiAocmVjdC5lbmNvZGluZyA9PSByZmJFbmNvZGluZ1BvaW50ZXJQb3MpIHsKLS0JaWYgKCFIYW5kbGVDdXJzb3JQb3MocmVjdC5yLngsIHJlY3Quci55KSkgewotLQkgIHJldHVybiBGYWxzZTsKLSsJbGFzdF9maWxleGZlciA9IHRpbWUoTlVMTCk7Ci0rCS8qZnByaW50ZihzdGRlcnIsICJsYXN0X2ZpbGV4ZmVyLTE6ICVkXG4iLCBsYXN0X2ZpbGV4ZmVyKTsgKi8KLSsKLSsJLyogbG9hZCBmaXJzdCBieXRlIHRvIHNlbmQgdG8gSmF2YSBiZSB0aGUgRlQgbXNnIG51bWJlcjogKi8KLSsJaGRyWzBdID0gcmZiRmlsZVRyYW5zZmVyOwotKwotKwkvKiB0aGlzIGlzIHRvIGF2b2lkIFh0QXBwUHJvY2Vzc0V2ZW50KCkgY2FsbHMgaW5kdWNlIGJ5IG91ciBSZWFkRnJvbVJGQlNlcnZlciBjYWxscyBiZWxvdzogKi8KLSsJc2tpcF9YdFVwZGF0ZUFsbCA9IDE7Ci0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoJmhkclsxXSwgMTEpKSB7Ci0rCQlza2lwX1h0VXBkYXRlQWxsID0gMDsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlpZiAoZmlsZXhmZXJfc29jayA+PSAwKSB7Ci0rCQl3cml0ZShmaWxleGZlcl9zb2NrLCBoZHIsIDEyKTsKLSsJfSBlbHNlIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXJfc29jayBjbG9zZWQsIGRpc2NhcmRpbmcgMTIgYnl0ZXNcbiIpOwotKwl9Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJcbiIpOwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiR290IHJmYkZpbGVUcmFuc2ZlciBoZHJcbiIpOwotKwlpZiAoZGIgPiAxKSB3cml0ZSgyLCBoZHIsIDEyKTsKLSsKLSsJaWYgKGRiKSB7Ci0rCQlpbnQgaTsKLSsJCWZwcmludGYoc3RkZXJyLCAiSEZYIEhEUjoiKTsKLSsJCWZvciAoaT0wOyBpIDwgMTI7IGkrKykgewotKwkJCWZwcmludGYoc3RkZXJyLCAiICVkIiwgKGludCkgaGRyW2ldKTsKLSsJCX0KLSsJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAJfQotLQljb250aW51ZTsKLS0gICAgICB9Ci0gCi0tICAgICAgaWYgKChyZWN0LnIueCArIHJlY3Quci53ID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgfHwKLS0JICAocmVjdC5yLnkgKyByZWN0LnIuaCA+IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSkKLS0JewotLQkgIGZwcmludGYoc3RkZXJyLCJSZWN0IHRvbyBsYXJnZTogJWR4JWQgYXQgKCVkLCAlZClcbiIsCi0tCQkgIHJlY3Quci53LCByZWN0LnIuaCwgcmVjdC5yLngsIHJlY3Quci55KTsKLS0JICByZXR1cm4gRmFsc2U7Ci0rCWlmIChoZHJbMV0gPT0gcmZiRW5kT2ZGaWxlKSB7Ci0rCQlnb3RvIHJlYWRfbm9fbW9yZTsKLSsJfSBlbHNlIGlmIChoZHJbMV0gPT0gcmZiQWJvcnRGaWxlVHJhbnNmZXIpIHsKLSsJCWdvdG8gcmVhZF9ub19tb3JlOwotIAl9Ci0gCi0tICAgICAgaWYgKHJlY3Quci5oICogcmVjdC5yLncgPT0gMCkgewotLQlmcHJpbnRmKHN0ZGVyciwiWmVybyBzaXplIHJlY3QgLSBpZ25vcmluZ1xuIik7Ci0tCWNvbnRpbnVlOwotLSAgICAgIH0KLSsJaWYgKGhkclsxXSA9PSByZmJEaXJQYWNrZXQgJiYgaGRyWzNdID09IHJmYkFEaXJlY3RvcnkpIHsKLSsJCQotKwl9Ci0rCi0rCWxlbiA9IChoZHJbOF0gPDwgMjQpIHwgKGhkcls5XSA8PCAxNikgfCAoaGRyWzEwXSA8PCA4KSB8IGhkclsxMV07Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJHb3QgcmZiRmlsZVRyYW5zZmVyOiBsZW4xICV1XG4iLCBsZW4pOwotKwlpZiAobGVuID4gMCkgewotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihmeGZlciwgbGVuKSkgewotKwkJCXNraXBfWHRVcGRhdGVBbGwgPSAwOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCWlmIChkYiA+IDEpIHdyaXRlKDIsIGZ4ZmVyLCBsZW4pOwotKwkJaWYgKGxlbiA+PSAxMiAmJiBoZHJbMV0gPT0gcmZiRGlyUGFja2V0KSB7Ci0rCQkJLyogdHJ5IHRvIGd1ZXNzIGlmIHgxMXZuYyBvciBub3QuLi4gKi8KLSsJCQlpZiAoZGIpIHsKLSsJCQkJaW50IGk7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiSEZYIERJUiBQS1QgKGF0dHIsIHRpbWVMLCB0aW1lSCk6Iik7Ci0rCQkJCWZvciAoaT0wOyBpIDwgMTI7IGkrKykgewotKwkJCQkJZnByaW50ZihzdGRlcnIsICIgJWQiLCAodW5zaWduZWQgY2hhcikgZnhmZXJbaV0pOwotKwkJCQl9Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCQl9Ci0rCQkJaWYgKGhkclsyXSA9PSAxKSB7Ci0rCQkJCWludCBkYXR0ciAgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbMF07Ci0rCQkJCWludCB0aW1lTDEgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbNF07Ci0rCQkJCWludCB0aW1lTDIgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbNV07Ci0rCQkJCWludCB0aW1lTDMgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbNl07Ci0rCQkJCWludCB0aW1lTDQgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbN107Ci0rCQkJCWludCB0aW1lSDEgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbOF07Ci0rCQkJCWludCB0aW1lSDIgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbOV07Ci0rCQkJCWludCB0aW1lSDMgPSAodW5zaWduZWQgY2hhcikgZnhmZXJbMTBdOwotKwkJCQlpbnQgdGltZUg0ID0gKHVuc2lnbmVkIGNoYXIpIGZ4ZmVyWzExXTsKLSsJCQkJaWYgKGRhdHRyICE9IDApIHsKLSsJCQkJCWlmICh0aW1lSDEgPT0gMCAmJiB0aW1lSDIgPT0gMCAmJiB0aW1lSDMgPT0gMCAmJiB0aW1lSDQgPT0gMCkgewotKwkJCQkJCWlmICgodGltZUwxICE9IDAgfHwgdGltZUwyICE9IDApICYmIHRpbWVMMyAhPSAwICYmIHRpbWVMNCAhPSAwKSB7Ci0rCQkJCQkJCWlmICghZ3Vlc3NfeDExdm5jKSBmcHJpbnRmKHN0ZGVyciwgImd1ZXNzZWQgeDExdm5jIHNlcnZlclxuIik7Ci0rCQkJCQkJCWd1ZXNzX3gxMXZuYyA9IDE7Ci0rCQkJCQkJfQotKwkJCQkJfQotKwkJCQl9Ci0rCQkJfQotKwkJfQotKwkJaWYgKGRiICYmIDApIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCWlmIChmaWxleGZlcl9zb2NrID49IDApIHsKLSsJCQl3cml0ZShmaWxleGZlcl9zb2NrLCBmeGZlciwgbGVuKTsKLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJmaWxleGZlcl9zb2NrIGNsb3NlZCwgZGlzY2FyZGluZyAlZCBieXRlc1xuIiwgbGVuKTsKLSsJCX0KLSsJfQotKwotKwlsZW4gPSAoaGRyWzRdIDw8IDI0KSB8IChoZHJbNV0gPDwgMTYpIHwgKGhkcls2XSA8PCA4KSB8IGhkcls3XTsKLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkdvdCByZmJGaWxlVHJhbnNmZXI6IGxlbjIgJXVcbiIsIGxlbik7Ci0rCi0rI2lmIDAKLSsJaWYgKGhkclsxXSA9PSByZmJGaWxlSGVhZGVyICYmIGxlbiAhPSByZmJSRXJyb3JDbWQpCi0rI2Vsc2UKLSsJLyogdGhlIGV4dHJhIDQgYnl0ZXMgZ2V0IHNlbmQgb24gcmZiUkVycm9yQ21kIGFzIHdlbGwuICovCi0rCWlmIChoZHJbMV0gPT0gcmZiRmlsZUhlYWRlcikgewotKyNlbmRpZgotKwkJaW50IGlzX2VyciA9IDA7Ci0rCQlpZiAobGVuID09IHJmYlJFcnJvckNtZCkgewotKwkJCWlzX2VyciA9IDE7Ci0rCQl9Ci0rCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiR290IHJmYkZpbGVUcmFuc2ZlcjogcmZiRmlsZUhlYWRlclxuIik7Ci0rCQlpZiAoaXNfZXJyICYmIGd1ZXNzX3gxMXZuYykgewotKwkJCWZwcmludGYoc3RkZXJyLCAicmZiUkVycm9yQ21kIHgxMXZuYyBza2lwIHJlYWQgNCBieXRlcy5cbiIpOwotKwkJCWdvdG8gcmVhZF9ub19tb3JlOwotKwkJfQotKwkJbGVuID0gNDsKLSsJCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoZnhmZXIsIGxlbikpIHsKLSsJCQlza2lwX1h0VXBkYXRlQWxsID0gMDsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQlpZiAoZGIgPiAxKSB3cml0ZSgyLCBmeGZlciwgbGVuKTsKLSsJCWlmIChkYiAmJiAwKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0rCQlpZiAoaXNfZXJyKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJyZmJSRXJyb3JDbWQgc2tpcCB3cml0ZSA0IGJ5dGVzLlxuIik7Ci0rCQkJZ290byByZWFkX25vX21vcmU7Ci0rCQl9Ci0rCQlpZiAoZmlsZXhmZXJfc29jayA+PSAwKSB7Ci0rCQkJd3JpdGUoZmlsZXhmZXJfc29jaywgZnhmZXIsIGxlbik7Ci0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXJfc29jayBjbG9zZWQsIGRpc2NhcmRpbmcgJWQgYnl0ZXNcbiIsIGxlbik7Ci0rCQl9Ci0rCX0KLSAKLS0gICAgICAvKiBJZiBSaWNoQ3Vyc29yIGVuY29kaW5nIGlzIHVzZWQsIHdlIHNob3VsZCBwcmV2ZW50IGNvbGxpc2lvbnMKLS0JIGJldHdlZW4gZnJhbWVidWZmZXIgdXBkYXRlcyBhbmQgY3Vyc29yIGRyYXdpbmcgb3BlcmF0aW9ucy4gKi8KLS0gICAgICBTb2Z0Q3Vyc29yTG9ja0FyZWEocmVjdC5yLngsIHJlY3Quci55LCByZWN0LnIudywgcmVjdC5yLmgpOwotKwlyZWFkX25vX21vcmU6Ci0gCi0tICAgICAgc3dpdGNoIChyZWN0LmVuY29kaW5nKSB7Ci0rCWlmIChmaWxleGZlcl9zb2NrIDwgMCkgewotKwkJaW50IHN0b3AgPSAwOwotKwkJc3RhdGljIHRpbWVfdCBsYXN0X3N0b3AgPSAwOwotKyNpZiAwCi0rCQkvKiB0aGlzIGlzbid0IHdvcmtpbmcgKi8KLSsJCWlmIChoZHJbMV0gPT0gcmZiRmlsZVBhY2tldCB8fCBoZHJbMV0gPT0gcmZiRmlsZUhlYWRlcikgewotKwkJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXJfc29jayBjbG9zZWQsIHRyeWluZyB0byBhYm9ydCByZWNlaXZlXG4iKTsKLSsJCQlzdG9wID0gMTsKLSsJCX0KLSsjZW5kaWYKLSsJCWlmIChzdG9wICYmIHRpbWUoTlVMTCkgPiBsYXN0X3N0b3ArMSkgewotKwkJCXVuc2lnbmVkIGNoYXIgcnBsWzEyXTsKLSsJCQlpbnQgazsKLSsJCQlycGxbMF0gPSByZmJGaWxlVHJhbnNmZXI7Ci0rCQkJcnBsWzFdID0gcmZiQWJvcnRGaWxlVHJhbnNmZXI7Ci0rCQkJZm9yIChrPTI7IGsgPCAxMjsgaysrKSB7Ci0rCQkJCXJwbFtrXSA9IDA7Ci0rCQkJfQotKwkJCVdyaXRlRXhhY3QocmZic29jaywgcnBsLCAxMik7Ci0rCQkJbGFzdF9zdG9wID0gdGltZShOVUxMKTsKLSsJCX0KLSsJfQotIAotLSAgICAgIGNhc2UgcmZiRW5jb2RpbmdSYXc6Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJHb3QgcmZiRmlsZVRyYW5zZmVyIGRvbmUuXG4iKTsKLSsJc2tpcF9YdFVwZGF0ZUFsbCA9IDA7Ci0gCi0tCWJ5dGVzUGVyTGluZSA9IHJlY3Quci53ICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLS0JbGluZXNUb1JlYWQgPSBCVUZGRVJfU0laRSAvIGJ5dGVzUGVyTGluZTsKLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkNGWDogQlxuIik7Ci0rCUNoZWNrRmlsZVhmZXIoKTsKLSsvKmZwcmludGYoc3RkZXJyLCAiT3V0IEhhbmRsZUZpbGVYZmVyXG4iKTsgKi8KLSsJcmV0dXJuIFRydWU7Ci0rfQotIAotLQl3aGlsZSAocmVjdC5yLmggPiAwKSB7Ci0tCSAgaWYgKGxpbmVzVG9SZWFkID4gcmVjdC5yLmgpCi0tCSAgICBsaW5lc1RvUmVhZCA9IHJlY3Quci5oOwotKy8qCi0rICogSGFuZGxlUkZCU2VydmVyTWVzc2FnZS4KLSsgKi8KLSAKLS0JICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZmZlcixieXRlc1BlckxpbmUgKiBsaW5lc1RvUmVhZCkpCi0tCSAgICByZXR1cm4gRmFsc2U7Ci0gCi0tCSAgQ29weURhdGFUb1NjcmVlbihidWZmZXIsIHJlY3Quci54LCByZWN0LnIueSwgcmVjdC5yLncsCi0tCQkJICAgbGluZXNUb1JlYWQpOwotK0Jvb2wKLStIYW5kbGVSRkJTZXJ2ZXJNZXNzYWdlKCkKLSt7Ci0rCXN0YXRpYyBpbnQgZGIgPSAtMTsKLSsJcmZiU2VydmVyVG9DbGllbnRNc2cgbXNnOwotIAotLQkgIHJlY3Quci5oIC09IGxpbmVzVG9SZWFkOwotLQkgIHJlY3Quci55ICs9IGxpbmVzVG9SZWFkOwotKwlpZiAoZGIgPCAwKSB7Ci0rCQlpZiAoZ2V0ZW52KCJERUJVR19SRkJfU01TRyIpKSB7Ci0rCQkJZGIgPSAxOwotKwkJfSBlbHNlIHsKLSsJCQlkYiA9IDA7Ci0rCQl9Ci0rCX0KLSAKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZtc2csIDEpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0gCX0KLS0JYnJlYWs7Ci0rCWlmIChhcHBEYXRhLnVsdHJhRFNNKSB7Ci0rCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJm1zZywgMSkpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCX0KLSsKLSsvKmZwcmludGYoc3RkZXJyLCAibXNnLnR5cGU6ICVkXG4iLCBtc2cudHlwZSk7ICovCi0gCi0tICAgICAgY2FzZSByZmJFbmNvZGluZ0NvcHlSZWN0OgotLSAgICAgIHsKLS0JcmZiQ29weVJlY3QgY3I7Ci0tCi0tCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmY3IsIHN6X3JmYkNvcHlSZWN0KSkKLS0JICByZXR1cm4gRmFsc2U7Ci0tCi0tCWNyLnNyY1ggPSBTd2FwMTZJZkxFKGNyLnNyY1gpOwotLQljci5zcmNZID0gU3dhcDE2SWZMRShjci5zcmNZKTsKLS0KLS0JLyogSWYgUmljaEN1cnNvciBlbmNvZGluZyBpcyB1c2VkLCB3ZSBzaG91bGQgZXh0ZW5kIG91cgotLQkgICAiY3Vyc29yIGxvY2sgYXJlYSIgKHByZXZpb3VzbHkgc2V0IHRvIGRlc3RpbmF0aW9uCi0tCSAgIHJlY3RhbmdsZSkgdG8gdGhlIHNvdXJjZSByZWN0YW5nbGUgYXMgd2VsbC4gKi8KLS0JU29mdEN1cnNvckxvY2tBcmVhKGNyLnNyY1gsIGNyLnNyY1ksIHJlY3Quci53LCByZWN0LnIuaCk7Ci0tCi0tCWlmIChhcHBEYXRhLmNvcHlSZWN0RGVsYXkgIT0gMCkgewotLQkgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgc3JjR0MsIGNyLnNyY1gsIGNyLnNyY1ksCi0tCQkJIHJlY3Quci53LCByZWN0LnIuaCk7Ci0tCSAgWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBkc3RHQywgcmVjdC5yLngsIHJlY3Quci55LAotLQkJCSByZWN0LnIudywgcmVjdC5yLmgpOwotLQkgIFhTeW5jKGRweSxGYWxzZSk7Ci0tCSAgdXNsZWVwKGFwcERhdGEuY29weVJlY3REZWxheSAqIDEwMDApOwotLQkgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZHN0R0MsIHJlY3Quci54LCByZWN0LnIueSwKLS0JCQkgcmVjdC5yLncsIHJlY3Quci5oKTsKLS0JICBYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIHNyY0dDLCBjci5zcmNYLCBjci5zcmNZLAotLQkJCSByZWN0LnIudywgcmVjdC5yLmgpOwotKwlpZiAobXNnLnR5cGUgPT0gcmZiRmlsZVRyYW5zZmVyKSB7Ci0rCQlyZXR1cm4gSGFuZGxlRmlsZVhmZXIoKTsKLSAJfQotIAotLQlYQ29weUFyZWEoZHB5LCBkZXNrdG9wV2luLCBkZXNrdG9wV2luLCBnYywgY3Iuc3JjWCwgY3Iuc3JjWSwKLS0JCSAgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOwotKyAgICBzd2l0Y2ggKG1zZy50eXBlKSB7Ci0gCi0tCWJyZWFrOwotLSAgICAgIH0KLSsgICAgY2FzZSByZmJTZXRDb2xvdXJNYXBFbnRyaWVzOgotKyAgICB7Ci0rCWludCBpOwotKwlDQVJEMTYgcmdiWzNdOwotKwlYQ29sb3IgeGM7Ci0gCi0tICAgICAgY2FzZSByZmJFbmNvZGluZ1JSRToKLS0gICAgICB7Ci0tCXN3aXRjaCAobXlGb3JtYXQuYml0c1BlclBpeGVsKSB7Ci0tCWNhc2UgODoKLS0JICBpZiAoIUhhbmRsZVJSRTgocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotLQljYXNlIDE2OgotLQkgIGlmICghSGFuZGxlUlJFMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotLQljYXNlIDMyOgotLQkgIGlmICghSGFuZGxlUlJFMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKCgoY2hhciAqKSZtc2cpICsgMSwgc3pfcmZiU2V0Q29sb3VyTWFwRW50cmllc01zZyAtIDEpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0gCX0KLS0JYnJlYWs7Ci0tICAgICAgfQotIAotLSAgICAgIGNhc2UgcmZiRW5jb2RpbmdDb1JSRToKLS0gICAgICB7Ci0tCXN3aXRjaCAobXlGb3JtYXQuYml0c1BlclBpeGVsKSB7Ci0tCWNhc2UgODoKLS0JICBpZiAoIUhhbmRsZUNvUlJFOChyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpCi0tCSAgICByZXR1cm4gRmFsc2U7Ci0tCSAgYnJlYWs7Ci0tCWNhc2UgMTY6Ci0tCSAgaWYgKCFIYW5kbGVDb1JSRTE2KHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkKLS0JICAgIHJldHVybiBGYWxzZTsKLS0JICBicmVhazsKLS0JY2FzZSAzMjoKLS0JICBpZiAoIUhhbmRsZUNvUlJFMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotKwltc2cuc2NtZS5maXJzdENvbG91ciA9IFN3YXAxNklmTEUobXNnLnNjbWUuZmlyc3RDb2xvdXIpOwotKwltc2cuc2NtZS5uQ29sb3VycyA9IFN3YXAxNklmTEUobXNnLnNjbWUubkNvbG91cnMpOwotKwotKwlmb3IgKGkgPSAwOyBpIDwgbXNnLnNjbWUubkNvbG91cnM7IGkrKykgewotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKXJnYiwgNikpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQl4Yy5waXhlbCA9IG1zZy5zY21lLmZpcnN0Q29sb3VyICsgaTsKLSsJCXhjLnJlZCA9IFN3YXAxNklmTEUocmdiWzBdKTsKLSsJCXhjLmdyZWVuID0gU3dhcDE2SWZMRShyZ2JbMV0pOwotKwkJeGMuYmx1ZSA9IFN3YXAxNklmTEUocmdiWzJdKTsKLSsJCWlmIChhcHBEYXRhLnVzZUdyZXlTY2FsZSkgewotKwkJCWludCBhdmUgPSAoeGMucmVkICsgeGMuZ3JlZW4gKyB4Yy5ibHVlKS8zOwotKwkJCXhjLnJlZCAgID0gYXZlOwotKwkJCXhjLmdyZWVuID0gYXZlOwotKwkJCXhjLmJsdWUgID0gYXZlOwotKwkJfQotKwkJeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsKLSsJCVhTdG9yZUNvbG9yKGRweSwgY21hcCwgJnhjKTsKLSAJfQotKwotIAlicmVhazsKLS0gICAgICB9Ci0rICAgIH0KLSsKLSsgICAgY2FzZSByZmJGcmFtZWJ1ZmZlclVwZGF0ZToKLSsgICAgewotKwlyZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlY3RIZWFkZXIgcmVjdDsKLSsJaW50IGxpbmVzVG9SZWFkOwotKwlpbnQgYnl0ZXNQZXJMaW5lOwotKwlpbnQgaTsKLSsKLSsJaW50IGFyZWFfY29weXJlY3QgPSAwOwotKwlpbnQgYXJlYV90aWdodCA9IDA7Ci0rCWludCBhcmVhX3pybGUgPSAwOwotKwlpbnQgYXJlYV9yYXcgPSAwOwotKwlzdGF0aWMgaW50IHJkYiA9IC0xOwotKwlzdGF0aWMgaW50IGRlbGF5X3N5bmMgPSAtMTsKLSsJc3RhdGljIGludCBkZWxheV9zeW5jX2VudiA9IC0xOwotKwlpbnQgdHJ5X2RlbGF5X3N5bmMgPSAwOwotKwlpbnQgY250X3BzZXVkbyA9IDA7Ci0rCWludCBjbnRfaW1hZ2UgID0gMDsKLSsKLSsJaW50IHNraXBfaW5jRkJVID0gMDsKLSsKLSsJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS0wOiAgICAlLjZmXG4iLCBkbm93KCkpOwotKwlpZiAocmRiIDwgMCkgewotKwkJaWYgKGdldGVudigiU1NWTkNfREVCVUdfUkVDVFMiKSkgewotKwkJCXJkYiA9IGF0b2koZ2V0ZW52KCJTU1ZOQ19ERUJVR19SRUNUUyIpKTsKLSsJCX0gZWxzZSB7Ci0rCQkJcmRiID0gMDsKLSsJCX0KLSsJfQotKwlpZiAoZGVsYXlfc3luYyA8IDApIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX0RFTEFZX1NZTkMiKSkgewotKwkJCWRlbGF5X3N5bmMgPSBhdG9pKGdldGVudigiU1NWTkNfREVMQVlfU1lOQyIpKTsKLSsJCQlkZWxheV9zeW5jX2VudiA9IGRlbGF5X3N5bmM7Ci0rCQl9IGVsc2UgewotKwkJCWRlbGF5X3N5bmMgPSAwOwotKwkJfQotKwl9Ci0rCi0rCXNlbnRfRkJVID0gLTE7Ci0gCi0tICAgICAgY2FzZSByZmJFbmNvZGluZ0hleHRpbGU6Ci0tICAgICAgewotLQlzd2l0Y2ggKG15Rm9ybWF0LmJpdHNQZXJQaXhlbCkgewotLQljYXNlIDg6Ci0tCSAgaWYgKCFIYW5kbGVIZXh0aWxlOChyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpCi0tCSAgICByZXR1cm4gRmFsc2U7Ci0tCSAgYnJlYWs7Ci0tCWNhc2UgMTY6Ci0tCSAgaWYgKCFIYW5kbGVIZXh0aWxlMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotLQljYXNlIDMyOgotLQkgIGlmICghSGFuZGxlSGV4dGlsZTMyKHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkKLS0JICAgIHJldHVybiBGYWxzZTsKLS0JICBicmVhazsKLSsJaWYgKGFwcERhdGEucGlwZWxpbmVVcGRhdGVzKSB7Ci0rCQkvKiB0dXJib3ZuYyBzcGVlZCBpZGVhICovCi0rCQlYRXZlbnQgZXY7Ci0rCQltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKLSsJCWV2LnhjbGllbnQudHlwZSA9IENsaWVudE1lc3NhZ2U7Ci0rCQlldi54Y2xpZW50LndpbmRvdyA9IFh0V2luZG93KGRlc2t0b3ApOwotKwkJZXYueGNsaWVudC5tZXNzYWdlX3R5cGUgPSBYQV9JTlRFR0VSOwotKwkJZXYueGNsaWVudC5mb3JtYXQgPSA4OwotKwkJc3RyY3B5KGV2LnhjbGllbnQuZGF0YS5iLCAiU2VuZFJGQlVwZGF0ZSIpOwotKwkJWFNlbmRFdmVudChkcHksIFh0V2luZG93KGRlc2t0b3ApLCBGYWxzZSwgMCwgJmV2KTsKLSAJfQotLQlicmVhazsKLS0gICAgICB9Ci0gCi0tICAgICAgY2FzZSByZmJFbmNvZGluZ1psaWI6Ci0tICAgICAgewotLQlzd2l0Y2ggKG15Rm9ybWF0LmJpdHNQZXJQaXhlbCkgewotLQljYXNlIDg6Ci0tCSAgaWYgKCFIYW5kbGVabGliOChyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpCi0tCSAgICByZXR1cm4gRmFsc2U7Ci0tCSAgYnJlYWs7Ci0tCWNhc2UgMTY6Ci0tCSAgaWYgKCFIYW5kbGVabGliMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotLQljYXNlIDMyOgotLQkgIGlmICghSGFuZGxlWmxpYjMyKHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkKLS0JICAgIHJldHVybiBGYWxzZTsKLS0JICBicmVhazsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoKGNoYXIgKikmbXNnLmZ1KSArIDEsIHN6X3JmYkZyYW1lYnVmZmVyVXBkYXRlTXNnIC0gMSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSAJfQotLQlicmVhazsKLS0gICAgIH0KLSAKLS0gICAgICBjYXNlIHJmYkVuY29kaW5nVGlnaHQ6Ci0tICAgICAgewotLQlzd2l0Y2ggKG15Rm9ybWF0LmJpdHNQZXJQaXhlbCkgewotLQljYXNlIDg6Ci0tCSAgaWYgKCFIYW5kbGVUaWdodDgocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKQotLQkgICAgcmV0dXJuIEZhbHNlOwotLQkgIGJyZWFrOwotLQljYXNlIDE2OgotLQkgIGlmICghSGFuZGxlVGlnaHQxNihyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpCi0tCSAgICByZXR1cm4gRmFsc2U7Ci0tCSAgYnJlYWs7Ci0tCWNhc2UgMzI6Ci0tCSAgaWYgKCFIYW5kbGVUaWdodDMyKHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkKLS0JICAgIHJldHVybiBGYWxzZTsKLS0JICBicmVhazsKLSsJbXNnLmZ1Lm5SZWN0cyA9IFN3YXAxNklmTEUobXNnLmZ1Lm5SZWN0cyk7Ci0rCi0rCWlmIChyZGIpIGZwcmludGYoc3RkZXJyLCAiQmVnaW4gcmVjdCBsb29wICVkXG4iLCBtc2cuZnUublJlY3RzKTsKLSsKLSsJaWYgKGRlbGF5X3N5bmMpIHsKLSsJCXRyeV9kZWxheV9zeW5jID0gMTsKLSsJfSBlbHNlIHsKLSsJCWlmIChkZWxheV9zeW5jX2VudiAhPSAtMSAmJiBkZWxheV9zeW5jX2VudiA9PSAwKSB7Ci0rCQkJOwotKwkJfSBlbHNlIGlmIChhcHBEYXRhLnlDcm9wID4gMCkgewotKwkJCTsKLSsJCX0gZWxzZSBpZiAoc2NhbGVfZmFjdG9yX3ggPiAwLjAgJiYgc2NhbGVfZmFjdG9yX3ggIT0gMS4wKSB7Ci0rCQkJOwotKwkJfSBlbHNlIGlmIChzY2FsZV9mYWN0b3JfeSA+IDAuMCAmJiBzY2FsZV9mYWN0b3JfeSAhPSAxLjApIHsKLSsJCQk7Ci0rCQl9IGVsc2UgewotKwkJCXN0YXRpYyBpbnQgbXNnID0gMDsKLSsJCQkvKiBmdWxsU2NyZWVuPyAqLwotKwkJCS8qIHVzZVhzZXJ2ZXJCYWNraW5nU3RvcmU/ICovCi0rCQkJLyogdXNlWDExQ3Vyc29yICYgZXRjPyAqLwotKwkJCS8qIHNjcm9sbGJhcnM/ICovCi0rCQkJaWYgKCFtc2cpIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJlbmFibGluZyAnZGVsYXlfc3luYycgbW9kZSBmb3IgZmFzdGVyIGxvY2FsIGRyYXdpbmcsXG5kaXNhYmxlIHZpYSBlbnYgU1NWTkNfREVMQVlfU1lOQz0wIGlmIHRoZXJlIGFyZSBwYWludGluZyBlcnJvcnMuXG4iKTsgCi0rCQkJCW1zZyA9IDE7Ci0rCQkJfQotKwkJCXRyeV9kZWxheV9zeW5jID0gMTsKLSsJCX0KLSsJfQotKwlpZiAodHJ5X2RlbGF5X3N5bmMpIHsKLSsJCXNraXBfbWF5YmVfc3luYyA9IDE7Ci0rCX0KLSsjZGVmaW5lIFNUT1BfREVMQVlfU1lOQyBcCi0rCWlmICh0cnlfZGVsYXlfc3luYykgeyBcCi0rCQlpZiAoY250X2ltYWdlICYmIHNraXBfbWF5YmVfc3luYykgeyBcCi0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7IFwKLSsJCX0gXAotKwkJdHJ5X2RlbGF5X3N5bmMgPSAwOyBcCi0rCQlza2lwX21heWJlX3N5bmMgPSAwOyBcCi0gCX0KLS0JYnJlYWs7Ci0tICAgICAgfQotIAotLSAgICAgIGRlZmF1bHQ6Ci0tCWZwcmludGYoc3RkZXJyLCJVbmtub3duIHJlY3QgZW5jb2RpbmcgJWRcbiIsCi0tCQkoaW50KXJlY3QuZW5jb2RpbmcpOwotLQlyZXR1cm4gRmFsc2U7Ci0tICAgICAgfQotKwlmb3IgKGkgPSAwOyBpIDwgbXNnLmZ1Lm5SZWN0czsgaSsrKSB7Ci0rCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnJlY3QsIHN6X3JmYkZyYW1lYnVmZmVyVXBkYXRlUmVjdEhlYWRlcikpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCi0rCQlyZWN0LmVuY29kaW5nID0gU3dhcDMySWZMRShyZWN0LmVuY29kaW5nKTsKLSsJCWlmIChyZWN0LmVuY29kaW5nID09IHJmYkVuY29kaW5nTGFzdFJlY3QpIHsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCXJlY3Quci54ID0gU3dhcDE2SWZMRShyZWN0LnIueCk7Ci0rCQlyZWN0LnIueSA9IFN3YXAxNklmTEUocmVjdC5yLnkpOwotKwkJcmVjdC5yLncgPSBTd2FwMTZJZkxFKHJlY3Quci53KTsKLSsJCXJlY3Quci5oID0gU3dhcDE2SWZMRShyZWN0LnIuaCk7Ci0rCi0rCQlpZiAocmRiID4gMSkgZnByaW50ZihzdGRlcnIsICJuUmVjdHM6ICVkICBpPSVkIGVuYzogJWQgICAlZHglZCslZCslZFxuIiwgbXNnLmZ1Lm5SZWN0cywgaSwgKGludCkgcmVjdC5lbmNvZGluZywgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOyAKLSsJCQkKLSsJCWlmIChyZWN0LmVuY29kaW5nID09IHJmYkVuY29kaW5nWEN1cnNvciB8fCByZWN0LmVuY29kaW5nID09IHJmYkVuY29kaW5nUmljaEN1cnNvcikgewotKwkJCWNudF9wc2V1ZG8rKzsKLSsJCQlTVE9QX0RFTEFZX1NZTkMJCi0rCQkJCi0rCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1DdXIxICAlLjZmXG4iLCBkbm93KCkpOwotKwkJCWlmICghSGFuZGxlQ3Vyc29yU2hhcGUocmVjdC5yLngsIHJlY3Quci55LCByZWN0LnIudywgcmVjdC5yLmgsIHJlY3QuZW5jb2RpbmcpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1DdXIyICAlLjZmXG4iLCBkbm93KCkpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwotKwkJaWYgKHJlY3QuZW5jb2RpbmcgPT0gcmZiRW5jb2RpbmdQb2ludGVyUG9zKSB7Ci0rCQkJY250X3BzZXVkbysrOwotKwkJCVNUT1BfREVMQVlfU1lOQwkKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJVLVBvczEgICUuNmZcbiIsIGRub3coKSk7Ci0rCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiQ3Vyc29yUG9zOiAlZCAlZCAvICVkICVkXG4iLCByZWN0LnIueCwgcmVjdC5yLnksIHJlY3Quci53LCByZWN0LnIuaCk7Ci0rCQkJaWYgKHVsdHJhX3NjYWxlID4gMCkgewotKwkJCQlpbnQgZiA9IHVsdHJhX3NjYWxlOwotKwkJCQlpZiAoIUhhbmRsZUN1cnNvclBvcyhyZWN0LnIueC9mLCByZWN0LnIueS9mKSkgewotKwkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQl9Ci0rCQkJfSBlbHNlIHsKLSsJCQkJaWYgKCFIYW5kbGVDdXJzb3JQb3MocmVjdC5yLngsIHJlY3Quci55KSkgewotKwkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQl9Ci0rCQkJfQotKwkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGQlUtUG9zMiAgJS42ZlxuIiwgZG5vdygpKTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsJCWlmIChyZWN0LmVuY29kaW5nID09IHJmYkVuY29kaW5nTmV3RkJTaXplKSB7Ci0rCQkJY250X3BzZXVkbysrOwotKwkJCVNUT1BfREVMQVlfU1lOQwkKLSsJCQlpZiAoYXBwRGF0YS5jaGF0T25seSkgewotKwkJCQljb250aW51ZTsKLSsJCQl9Ci0rCQkJZnByaW50ZihzdGRlcnIsIk5ldyBTaXplOiAlZHglZCBhdCAoJWQsICVkKVxuIiwgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOwotKwkJCXNpLmZyYW1lYnVmZmVyV2lkdGggPSByZWN0LnIudzsKLSsJCQlzaS5mcmFtZWJ1ZmZlckhlaWdodCA9IHJlY3Quci5oOwotKwkJCS8qZnByaW50ZihzdGRlcnIsICJzaTogJWQgJWRcbiIsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0KTsgKi8KLSsJCQlSZURvRGVza3RvcCgpOwotKwkJCWNvbnRpbnVlOwotKwkJfQotKwkJaWYgKHJkYikgZnByaW50ZihzdGRlcnIsIlJlY3Q6ICVkeCVkIGF0ICglZCwgJWQpXG4iLCByZWN0LnIudywgcmVjdC5yLmgsIHJlY3Quci54LCByZWN0LnIueSk7Ci0rCQljbnRfaW1hZ2UrKzsKLSsKLSsJCWlmIChhcHBEYXRhLnVsdHJhRFNNKSB7Ci0rCQkJLyoKLSsJCQkgKiBXaGF0IGEgaHVnZSBtZXNzIHRoZSBVbHRyYVZOQyBEU00gcGx1Z2luIGlzISEhCi0rCQkJICogV2UgcmVhZCBhbmQgaWdub3JlIHRoZWlyIGxpdHRsZSAidGhpcyBtdWNoIGRhdGEiIGhpbnQuLi4KLSsJCQkgKi8KLSsJCQlzd2l0Y2ggKHJlY3QuZW5jb2RpbmcpCi0rCQkJewotKwkJCWNhc2UgcmZiRW5jb2RpbmdSYXc6Ci0rCQkJY2FzZSByZmJFbmNvZGluZ1JSRToKLSsJCQljYXNlIHJmYkVuY29kaW5nQ29SUkU6Ci0rCQkJY2FzZSByZmJFbmNvZGluZ0hleHRpbGU6Ci0rCQkJLypjYXNlIHJmYkVuY29kaW5nVWx0cmE6ICovCi0rLyoJCQljYXNlIHJmYkVuY29kaW5nWmxpYjogKi8KLSsJCQkvKmNhc2UgcmZiRW5jb2RpbmdYT1JfWmxpYjogKi8KLSsJCQkvKmNhc2UgcmZiRW5jb2RpbmdYT1JNdWx0aUNvbG9yX1psaWI6ICovCi0rCQkJLypjYXNlIHJmYkVuY29kaW5nWE9STW9ub0NvbG9yX1psaWI6ICovCi0rCQkJLypjYXNlIHJmYkVuY29kaW5nU29saWRDb2xvcjogKi8KLSsJCQljYXNlIHJmYkVuY29kaW5nVGlnaHQ6Ci0rCQkJY2FzZSByZmJFbmNvZGluZ1psaWJIZXg6Ci0rCQkJY2FzZSByZmJFbmNvZGluZ1pSTEU6Ci0rCQkJY2FzZSByZmJFbmNvZGluZ1pZV1JMRToKLSsJCQkgICAgewotKwkJCQlDQVJEMzIgZGlzY2FyZDsKLSsJCQkJUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmZGlzY2FyZCwgc2l6ZW9mKENBUkQzMikpOwotKwkJCSAgICB9Ci0rCQkJICAgIGJyZWFrOwotKwkJCX0KLSsJCX0KLSsKLSsJCWlmICgocmVjdC5yLnggKyByZWN0LnIudyA+IHNpLmZyYW1lYnVmZmVyV2lkdGgpIHx8Ci0rCQkgICAgKHJlY3Quci55ICsgcmVjdC5yLmggPiBzaS5mcmFtZWJ1ZmZlckhlaWdodCkpIHsKLSsJCQlpZiAoIWFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsIlJlY3QgdG9vIGxhcmdlOiAlZHglZCBhdCAoJWQsICVkKSBlbmNvZGluZz0lZFxuIiwKLSsJCQkJcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnksIChpbnQpIHJlY3QuZW5jb2RpbmcpOwotKwkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJfQotKwkJfQotKwotKwkJaWYgKHJlY3Quci5oICogcmVjdC5yLncgPT0gMCkgewotKwkJCWZwcmludGYoc3RkZXJyLCIqKiogV2FybmluZyAqKiogWmVybyBzaXplIHJlY3Q6ICVkeCVkKyVkKyVkICBlbmNvZGluZz0lZFxuIiwKLSsJCQkgICAgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnksIChpbnQpIHJlY3QuZW5jb2RpbmcpOwotKwkJCWlmICgwKSBjb250aW51ZTsKLSsJCX0KLSsKLSsJCS8qIElmIFJpY2hDdXJzb3IgZW5jb2RpbmcgaXMgdXNlZCwgd2Ugc2hvdWxkIHByZXZlbnQgY29sbGlzaW9ucwotKwkJICAgYmV0d2VlbiBmcmFtZWJ1ZmZlciB1cGRhdGVzIGFuZCBjdXJzb3IgZHJhd2luZyBvcGVyYXRpb25zLiAqLwotKwkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1TQ0wxICAlLjZmXG4iLCBkbm93KCkpOwotKwotKwkJU29mdEN1cnNvckxvY2tBcmVhKHJlY3Quci54LCByZWN0LnIueSwgcmVjdC5yLncsIHJlY3Quci5oKTsKLSsKLSsJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGQlUtU0NMMiAgJS42ZlxuIiwgZG5vdygpKTsKLSsKLSsKLSsJCXN3aXRjaCAocmVjdC5lbmNvZGluZykgewotKwotKwkJY2FzZSByZmJFbmNvZGluZ1JhdzoKLSsKLSsJCQlieXRlc1BlckxpbmUgPSByZWN0LnIudyAqIG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0rCQkJbGluZXNUb1JlYWQgPSBCVUZGRVJfU0laRSAvIGJ5dGVzUGVyTGluZTsKLSsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiUmF3OiAgICAgJWR4JWQrJWQrJWRcbiIsIHJlY3Quci53LCByZWN0LnIuaCwgcmVjdC5yLngsIHJlY3Quci55KTsKLSsJCQlhcmVhX3JhdyArPSByZWN0LnIudyAqIHJlY3Quci5oOwotKwotKwkJCXdoaWxlIChyZWN0LnIuaCA+IDApIHsKLSsJCQkJaWYgKGxpbmVzVG9SZWFkID4gcmVjdC5yLmgpIHsKLSsJCQkJCWxpbmVzVG9SZWFkID0gcmVjdC5yLmg7Ci0rCQkJCX0KLSsKLSsJCQkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihidWZmZXIsYnl0ZXNQZXJMaW5lICogbGluZXNUb1JlYWQpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsKLSsJCQkJQ29weURhdGFUb1NjcmVlbihidWZmZXIsIHJlY3Quci54LCByZWN0LnIueSwgcmVjdC5yLncsIGxpbmVzVG9SZWFkKTsKLSsKLSsJCQkJcmVjdC5yLmggLT0gbGluZXNUb1JlYWQ7Ci0rCQkJCXJlY3Quci55ICs9IGxpbmVzVG9SZWFkOwotKwkJCX0KLSsJCQlicmVhazsKLSsKLSsJCWNhc2UgcmZiRW5jb2RpbmdDb3B5UmVjdDoKLSsJCXsKLSsJCQlyZmJDb3B5UmVjdCBjcjsKLSsKLSsJCQlTVE9QX0RFTEFZX1NZTkMJCi0rCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCi0rCQkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZjciwgc3pfcmZiQ29weVJlY3QpKSB7Ci0rCQkJCXJldHVybiBGYWxzZTsKLSsJCQl9Ci0rCQkJaWYgKGFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwotKwkJCWNyLnNyY1ggPSBTd2FwMTZJZkxFKGNyLnNyY1gpOwotKwkJCWNyLnNyY1kgPSBTd2FwMTZJZkxFKGNyLnNyY1kpOwotKwotKwkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJDb3B5OiAgICAlZHglZCslZCslZFxuIiwgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOwotKwkJCWFyZWFfY29weXJlY3QgKz0gcmVjdC5yLncgKiByZWN0LnIuaDsKLSsKLSsJCQkvKiBJZiBSaWNoQ3Vyc29yIGVuY29kaW5nIGlzIHVzZWQsIHdlIHNob3VsZCBleHRlbmQgb3VyCi0rCQkJICAgImN1cnNvciBsb2NrIGFyZWEiIChwcmV2aW91c2x5IHNldCB0byBkZXN0aW5hdGlvbgotKwkJCSAgIHJlY3RhbmdsZSkgdG8gdGhlIHNvdXJjZSByZWN0YW5nbGUgYXMgd2VsbC4gKi8KLSsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJVLVNDTDMgICUuNmZcbiIsIGRub3coKSk7Ci0rCi0rCQkJU29mdEN1cnNvckxvY2tBcmVhKGNyLnNyY1gsIGNyLnNyY1ksIHJlY3Quci53LCByZWN0LnIuaCk7Ci0rCi0rCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1TQ0w0ICAlLjZmXG4iLCBkbm93KCkpOwotKwotKwkJCWlmIChhcHBEYXRhLmNvcHlSZWN0RGVsYXkgIT0gMCkgewotKwkJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIHNyY0dDLCBjci5zcmNYLCBjci5zcmNZLCByZWN0LnIudywgcmVjdC5yLmgpOwotKwkJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGRzdEdDLCByZWN0LnIueCwgcmVjdC5yLnksIHJlY3Quci53LCByZWN0LnIuaCk7Ci0rCQkJCVhTeW5jKGRweSxGYWxzZSk7Ci0rCQkJCXVzbGVlcChhcHBEYXRhLmNvcHlSZWN0RGVsYXkgKiAxMDAwKTsKLSsJCQkJWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBkc3RHQywgcmVjdC5yLngsIHJlY3Quci55LCByZWN0LnIudywgcmVjdC5yLmgpOwotKwkJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIHNyY0dDLCBjci5zcmNYLCBjci5zcmNZLCByZWN0LnIudywgcmVjdC5yLmgpOwotKwkJCX0KLSsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJVLUNQQTEgICUuNmZcbiIsIGRub3coKSk7Ci0rCQkJaWYgKCFhcHBEYXRhLnVzZVhzZXJ2ZXJCYWNraW5nU3RvcmUpIHsKLSsJCQkJY29weV9yZWN0KHJlY3Quci54LCByZWN0LnIueSwgcmVjdC5yLncsIHJlY3Quci5oLCBjci5zcmNYLCBjci5zcmNZKTsKLSsJCQkJcHV0X2ltYWdlKHJlY3Quci54LCByZWN0LnIueSwgcmVjdC5yLngsIHJlY3Quci55LCByZWN0LnIudywgcmVjdC5yLmgsIDApOwotKwkJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQl9IGVsc2UgewotKwkJCQlYQ29weUFyZWEoZHB5LCBkZXNrdG9wV2luLCBkZXNrdG9wV2luLCBnYywgY3Iuc3JjWCwgY3Iuc3JjWSwKLSsJCQkJICAgIHJlY3Quci53LCByZWN0LnIuaCwgcmVjdC5yLngsIHJlY3Quci55KTsKLSsJCQl9Ci0rCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1DUEEyICAlLjZmXG4iLCBkbm93KCkpOwotKwotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJY2FzZSByZmJFbmNvZGluZ1JSRToKLSsJCXsKLSsJCQlzd2l0Y2ggKG15Rm9ybWF0LmJpdHNQZXJQaXhlbCkgewotKwkJCWNhc2UgODoKLSsJCQkJaWYgKCFIYW5kbGVSUkU4KHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkgewotKwkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQl9Ci0rCQkJCWJyZWFrOwotKwkJCWNhc2UgMTY6Ci0rCQkJCWlmICghSGFuZGxlUlJFMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAzMjoKLSsJCQkJaWYgKCFIYW5kbGVSUkUzMihyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpIHsKLSsJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJfQotKwkJCQlicmVhazsKLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQljYXNlIHJmYkVuY29kaW5nQ29SUkU6Ci0rCQl7Ci0rCQkJc3dpdGNoIChteUZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSsJCQljYXNlIDg6Ci0rCQkJCWlmICghSGFuZGxlQ29SUkU4KHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkgewotKwkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQl9Ci0rCQkJCWJyZWFrOwotKwkJCWNhc2UgMTY6Ci0rCQkJCWlmICghSGFuZGxlQ29SUkUxNihyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpIHsKLSsJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJfQotKwkJCQlicmVhazsKLSsJCQljYXNlIDMyOgotKwkJCQlpZiAoIUhhbmRsZUNvUlJFMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJY2FzZSByZmJFbmNvZGluZ0hleHRpbGU6Ci0rCQl7Ci0rCQkJc3dpdGNoIChteUZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSsJCQljYXNlIDg6Ci0rCQkJCWlmICghSGFuZGxlSGV4dGlsZTgocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAxNjoKLSsJCQkJaWYgKCFIYW5kbGVIZXh0aWxlMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAzMjoKLSsJCQkJaWYgKCFIYW5kbGVIZXh0aWxlMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJY2FzZSByZmJFbmNvZGluZ1psaWI6Ci0rCQl7Ci0rCQkJc3dpdGNoIChteUZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSsJCQljYXNlIDg6Ci0rCQkJCWlmICghSGFuZGxlWmxpYjgocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAxNjoKLSsJCQkJaWYgKCFIYW5kbGVabGliMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAzMjoKLSsJCQkJaWYgKCFIYW5kbGVabGliMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJY2FzZSByZmJFbmNvZGluZ1RpZ2h0OgotKwkJewotKwkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJUaWdodDogICAlZHglZCslZCslZFxuIiwgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOwotKwkJCWFyZWFfdGlnaHQgKz0gcmVjdC5yLncgKiByZWN0LnIuaDsKLSsJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJVLVRHSDEgICUuNmZcbiIsIGRub3coKSk7Ci0rCi0rCQkJc3dpdGNoIChteUZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSsJCQljYXNlIDg6Ci0rCQkJCWlmICghSGFuZGxlVGlnaHQ4KHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkgewotKwkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQl9Ci0rCQkJCWJyZWFrOwotKwkJCWNhc2UgMTY6Ci0rCQkJCWlmICghSGFuZGxlVGlnaHQxNihyZWN0LnIueCxyZWN0LnIueSxyZWN0LnIudyxyZWN0LnIuaCkpIHsKLSsJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJfQotKwkJCQlicmVhazsKLSsJCQljYXNlIDMyOgotKwkJCQlpZiAoIUhhbmRsZVRpZ2h0MzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGQlUtVEdIMiAgJS42ZlxuIiwgZG5vdygpKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qIHJ1bmdlIGFkZHMgenJsZSBhbmQgenl3cmxlOiAqLwotKwkJY2FzZSByZmJFbmNvZGluZ1pSTEU6Ci0rI2lmIERPX1pZV1JMRQotKwkJenl3cmxlX2xldmVsID0gMDsKLSsJCWNhc2UgcmZiRW5jb2RpbmdaWVdSTEU6Ci0rI2VuZGlmCi0rCQl7Ci0rCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlpSTEU6ICAgICVkeCVkKyVkKyVkXG4iLCByZWN0LnIudywgcmVjdC5yLmgsIHJlY3Quci54LCByZWN0LnIueSk7Ci0rCQkJYXJlYV96cmxlICs9IHJlY3Quci53ICogcmVjdC5yLmg7Ci0rCQkJc3dpdGNoIChteUZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSsJCQljYXNlIDg6Ci0rCQkJCWlmICghSGFuZGxlWlJMRTgocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJY2FzZSAxNjoKLSsJCQkJaWYgKG15Rm9ybWF0LmdyZWVuTWF4ID4gMHgxZikgewotKwkJCQkJaWYgKCFIYW5kbGVaUkxFMTYocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgewotKwkJCQkJaWYgKCFIYW5kbGVaUkxFMTUocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJCWJyZWFrOwotKwkJCWNhc2UgMzI6Ci0rCQkJICAgIHsKLSsJCQkJdW5zaWduZWQgaW50IG1heENvbG9yPShteUZvcm1hdC5yZWRNYXg8PG15Rm9ybWF0LnJlZFNoaWZ0KXwKLSsJCQkJICAgIChteUZvcm1hdC5ncmVlbk1heDw8bXlGb3JtYXQuZ3JlZW5TaGlmdCl8Ci0rCQkJCSAgICAobXlGb3JtYXQuYmx1ZU1heDw8bXlGb3JtYXQuYmx1ZVNoaWZ0KTsKLSsJCQkJc3RhdGljIGludCBaUkxFMzIgPSAtMTsKLSsKLSsJCQkJaWYgKFpSTEUzMiA8IDApIHsKLSsJCQkJCS8qIGZvciBkZWJ1Z2dpbmcgb3Igd29ya2Fyb3VuZCBlLmcuIEJFIGRpc3BsYXkgdG8gTEUgKi8KLSsJCQkJCWlmIChnZXRlbnYoIlpSTEUzMiIpKSB7Ci0rCQkJCQkJaWYgKHN0cnN0cihnZXRlbnYoIlpSTEUzMiIpLCAiMjRVcCIpKSB7Ci0rCQkJCQkJCVpSTEUzMiA9IDM7Ci0rCQkJCQkJfSBlbHNlIGlmIChzdHJzdHIoZ2V0ZW52KCJaUkxFMzIiKSwgIjI0RG93biIpKSB7Ci0rCQkJCQkJCVpSTEUzMiA9IDI7Ci0rCQkJCQkJfSBlbHNlIHsKLSsJCQkJCQkJWlJMRTMyID0gMTsKLSsJCQkJCQl9Ci0rCQkJCQl9IGVsc2UgewotKwkJCQkJCVpSTEUzMiA9IDA7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsKLStpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAibWF4Q29sb3I6IDB4JXggIG1mYmlnRW5kaW5nOiAlZFxuIiwgbWF4Q29sb3IsIG15Rm9ybWF0LmJpZ0VuZGlhbik7Ci0rCi0rCQkJCWlmIChaUkxFMzIgPT0gMSkgewotK2lmIChkYikgZnByaW50ZihzdGRlcnIsICJIYW5kbGVaUkxFMzJcbiIpOwotKwkJCQkJaWYgKCFIYW5kbGVaUkxFMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgaWYgKFpSTEUzMiA9PSAyKSB7Ci0raWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkhhbmRsZVpSTEUyNERvd25cbiIpOwotKwkJCQkJaWYgKCFIYW5kbGVaUkxFMjREb3duKHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkgewotKwkJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJCX0KLSsJCQkJfSBlbHNlIGlmIChaUkxFMzIgPT0gMykgewotK2lmIChkYikgZnByaW50ZihzdGRlcnIsICJIYW5kbGVaUkxFMjRVcFxuIik7Ci0rCQkJCQlpZiAoIUhhbmRsZVpSTEUyNFVwKHJlY3Quci54LHJlY3Quci55LHJlY3Quci53LHJlY3Quci5oKSkgewotKwkJCQkJCXJldHVybiBGYWxzZTsKLSsJCQkJCX0KLSsJCQkJfSBlbHNlIGlmICgobXlGb3JtYXQuYmlnRW5kaWFuICYmIChtYXhDb2xvciYweGZmKT09MCkgfHwgKCFteUZvcm1hdC5iaWdFbmRpYW4gJiYgKG1heENvbG9yJjB4ZmYwMDAwMDApPT0wKSkgewotK2lmIChkYikgZnByaW50ZihzdGRlcnIsICJIYW5kbGVaUkxFMjRcbiIpOwotKwkJCQkJaWYgKCFIYW5kbGVaUkxFMjQocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgaWYgKCFteUZvcm1hdC5iaWdFbmRpYW4gJiYgKG1heENvbG9yJjB4ZmYpPT0wKSB7Ci0raWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkhhbmRsZVpSTEUyNFVwXG4iKTsKLSsJCQkJCWlmICghSGFuZGxlWlJMRTI0VXAocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgaWYgKG15Rm9ybWF0LmJpZ0VuZGlhbiAmJiAobWF4Q29sb3ImMHhmZjAwMDAwMCk9PTApIHsKLStpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiSGFuZGxlWlJMRTI0RG93blxuIik7Ci0rCQkJCQlpZiAoIUhhbmRsZVpSTEUyNERvd24ocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQkJcmV0dXJuIEZhbHNlOwotKwkJCQkJfQotKwkJCQl9IGVsc2UgaWYgKCFIYW5kbGVaUkxFMzIocmVjdC5yLngscmVjdC5yLnkscmVjdC5yLncscmVjdC5yLmgpKSB7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJYnJlYWs7Ci0rCQkJICAgIH0KLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQlkZWZhdWx0OgotKwkJZnByaW50ZihzdGRlcnIsIlVua25vd24gcmVjdCBlbmNvZGluZyAlZFxuIiwgKGludClyZWN0LmVuY29kaW5nKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJCX0KLSAKLS0gICAgICAvKiBOb3cgd2UgbWF5IGRpc2NhcmQgInNvZnQgY3Vyc29yIGxvY2tzIi4gKi8KLS0gICAgICBTb2Z0Q3Vyc29yVW5sb2NrU2NyZWVuKCk7Ci0tICAgIH0KLSsJCS8qIE5vdyB3ZSBtYXkgZGlzY2FyZCAic29mdCBjdXJzb3IgbG9ja3MiLiAqLwotKwkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1TVUwxICAlLjZmXG4iLCBkbm93KCkpOwotKwotKwkJU29mdEN1cnNvclVubG9ja1NjcmVlbigpOwotKwotKwkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCVS1TVUwyICAlLjZmXG4iLCBkbm93KCkpOwotKwl9Ci0rCi0rCWlmICh0cnlfZGVsYXlfc3luYykgewotKwkJc2tpcF9tYXliZV9zeW5jID0gMDsKLSsJfQotKwotKwlpZiAoMSB8fCBhcmVhX2NvcHlyZWN0KSB7Ci0rCQkvKiB3ZSBhbHdheXMgZG8gdGhpcyBub3cgZm9yIHNvbWUgcmVhc29uLi4uICovCi0rCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJVLVhTTjEgICUuNmZcbiIsIGRub3coKSk7Ci0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGQlUtWFNOMiAgJS42ZlxuIiwgZG5vdygpKTsKLSsJfQotKwlzZW50X0ZCVSA9IDA7Ci0rCS8qCi0rCSAqIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBzaW5jZSBYdCBldmVudHMgYXJlIHByb2Nlc3NlZAotKwkgKiB1c3VhbGx5IGluIHRoZSBtaWRkbGUgb2YgRkJVLiAgU28gd2UgZG8gYW55IHNjaGVkdWxlZCBvbmVzIG5vdwotKwkgKiB3aGljaCBpcyBwcmV0dHkgc2FmZSBidXQgbm90IGFic29sdXRlbHkgc2FmZS4KLSsgICAgICAgICAqLwotKwlpZiAoZG9fZm9ybWF0X2NoYW5nZSkgewotKwkJY3V0b3Zlcl9mb3JtYXRfY2hhbmdlKCk7Ci0rCQlkb19mb3JtYXRfY2hhbmdlID0gMDsKLSsJCVNldFZpc3VhbEFuZENtYXAoKTsKLSsJCVNldEZvcm1hdEFuZEVuY29kaW5ncygpOwotKwkJaWYgKGRvX2N1cnNvcl9jaGFuZ2UpIHsKLSsJCQlpZiAoZG9fY3Vyc29yX2NoYW5nZSA9PSAxKSB7Ci0rCQkJCURlc2t0b3BDdXJzb3JPZmYoKTsKLSsJCQl9Ci0rCQkJZG9fY3Vyc29yX2NoYW5nZSA9IDA7Ci0rCQl9IGVsc2UgewotKwkJCVNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoMCwgMCwgc2kuZnJhbWVidWZmZXJXaWR0aCwKLSsJCQkgICAgc2kuZnJhbWVidWZmZXJIZWlnaHQsIEZhbHNlKTsKLSsJCQlza2lwX2luY0ZCVSA9IDE7Ci0rCQl9Ci0rCX0KLSsJaWYgKGRvX2ZiX3VwZGF0ZSAhPSAwLjApIHsKLSsJCWlmIChkbm93KCkgPiBkb19mYl91cGRhdGUgKyAxLjEpIHsKLSsJCQlkb19mYl91cGRhdGUgPSAwLjA7Ci0rCQkJU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgwLCAwLCBzaS5mcmFtZWJ1ZmZlcldpZHRoLAotKwkJCSAgICBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgRmFsc2UpOwotKwkJfQotKwl9Ci0gCi0gI2lmZGVmIE1JVFNITQotICAgICAvKiBpZiB1c2luZyBzaGFyZWQgbWVtb3J5IFB1dEltYWdlLCBtYWtlIHN1cmUgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzCi1AQCAtMTIyNCw1OSArMzMyMCwxNjggQEAKLSAgICAgICAgbWFpbmx5IHRvIGF2b2lkIGNvcHlyZWN0IHVzaW5nIGludmFsaWQgc2NyZWVuIGNvbnRlbnRzIC0gbm90IHN1cmUKLSAgICAgICAgaWYgd2UnZCBuZWVkIGl0IG90aGVyd2lzZS4gKi8KLSAKLS0gICAgaWYgKGFwcERhdGEudXNlU2htKQotLSAgICAgIFhTeW5jKGRweSwgRmFsc2UpOwotKwlpZiAoYXBwRGF0YS51c2VTaG0pIHsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwl9IGVsc2UKLSAjZW5kaWYKLSsJewotKwkJLyogd2UgZG8gaXQgYWx3YXlzIG5vdy4gKi8KLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwl9Ci0rCQotKwlpZiAoc2tpcF9YdFVwZGF0ZSB8fCBza2lwX2luY0ZCVSkgewotKwkJOwotKwl9IGVsc2UgaWYgKGFwcERhdGEucGlwZWxpbmVVcGRhdGVzKSB7Ci0rCQk7Ci0rCX0gZWxzZSBpZiAoIVNlbmRJbmNyZW1lbnRhbEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gICAgaWYgKCFTZW5kSW5jcmVtZW50YWxGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoKSkKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0tCi0tICAgIGJyZWFrOwotKwlicmVhazsKLSAgIH0KLSAKLSAgIGNhc2UgcmZiQmVsbDoKLSAgIHsKLS0gICAgV2luZG93IHRvcGxldmVsV2luOwotKwlXaW5kb3cgdG9wbGV2ZWxXaW47Ci0gCi0tICAgIFhCZWxsKGRweSwgMCk7Ci0rCWlmIChhcHBEYXRhLnVzZUJlbGwpIHsKLSsJCVhCZWxsKGRweSwgMCk7Ci0rCX0KLSsKLSsJaWYgKGFwcERhdGEucmFpc2VPbkJlZXApIHsKLSsJCXRvcGxldmVsV2luID0gWHRXaW5kb3codG9wbGV2ZWwpOwotKwkJWE1hcFJhaXNlZChkcHksIHRvcGxldmVsV2luKTsKLSsJfQotIAotLSAgICBpZiAoYXBwRGF0YS5yYWlzZU9uQmVlcCkgewotLSAgICAgIHRvcGxldmVsV2luID0gWHRXaW5kb3codG9wbGV2ZWwpOwotLSAgICAgIFhNYXBSYWlzZWQoZHB5LCB0b3BsZXZlbFdpbik7Ci0rCWJyZWFrOwotICAgICB9Ci0gCi0tICAgIGJyZWFrOwotLSAgfQotKyAgICBjYXNlIHJmYlNlcnZlckN1dFRleHQ6Ci0rICAgIHsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoKGNoYXIgKikmbXNnKSArIDEsIHN6X3JmYlNlcnZlckN1dFRleHRNc2cgLSAxKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0gCi0tICBjYXNlIHJmYlNlcnZlckN1dFRleHQ6Ci0tICB7Ci0tICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKChjaGFyICopJm1zZykgKyAxLAotLQkJCSAgIHN6X3JmYlNlcnZlckN1dFRleHRNc2cgLSAxKSkKLS0gICAgICByZXR1cm4gRmFsc2U7Ci0rCW1zZy5zY3QubGVuZ3RoID0gU3dhcDMySWZMRShtc2cuc2N0Lmxlbmd0aCk7Ci0gCi0tICAgIG1zZy5zY3QubGVuZ3RoID0gU3dhcDMySWZMRShtc2cuc2N0Lmxlbmd0aCk7Ci0rCWlmIChzZXJ2ZXJDdXRUZXh0KSB7Ci0rCQlmcmVlKHNlcnZlckN1dFRleHQpOwotKwl9Ci0gCi0tICAgIGlmIChzZXJ2ZXJDdXRUZXh0KQotLSAgICAgIGZyZWUoc2VydmVyQ3V0VGV4dCk7Ci0rCXNlcnZlckN1dFRleHQgPSBtYWxsb2MobXNnLnNjdC5sZW5ndGgrMSk7Ci0gCi0tICAgIHNlcnZlckN1dFRleHQgPSBtYWxsb2MobXNnLnNjdC5sZW5ndGgrMSk7Ci0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoc2VydmVyQ3V0VGV4dCwgbXNnLnNjdC5sZW5ndGgpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSAKLS0gICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihzZXJ2ZXJDdXRUZXh0LCBtc2cuc2N0Lmxlbmd0aCkpCi0tICAgICAgcmV0dXJuIEZhbHNlOwotKwlzZXJ2ZXJDdXRUZXh0W21zZy5zY3QubGVuZ3RoXSA9IDA7Ci0gCi0tICAgIHNlcnZlckN1dFRleHRbbXNnLnNjdC5sZW5ndGhdID0gMDsKLSsJbmV3U2VydmVyQ3V0VGV4dCA9IFRydWU7Ci0gCi0tICAgIG5ld1NlcnZlckN1dFRleHQgPSBUcnVlOwotKwlicmVhazsKLSsgICAgfQotIAotLSAgICBicmVhazsKLS0gIH0KLSsgICAgY2FzZSByZmJUZXh0Q2hhdDoKLSsgICAgewotKwljaGFyICpidWZmZXIgPSBOVUxMOwotKwlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKCgoY2hhciAqKSZtc2cpICsgMSwgc3pfcmZiVGV4dENoYXRNc2cgLSAxKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCW1zZy50Yy5sZW5ndGggPSBTd2FwMzJJZkxFKG1zZy50Yy5sZW5ndGgpOwotKwlzd2l0Y2gobXNnLnRjLmxlbmd0aCkgewotKwljYXNlIHJmYlRleHRDaGF0T3BlbjoKLSsJCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQkJcHJpbnRDaGF0KCJcbipDaGF0T3BlbipcblxuU2VuZDogIiwgVHJ1ZSk7Ci0rCQl9IGVsc2UgewotKwkJCXByaW50Q2hhdCgiXG4qQ2hhdE9wZW4qXG4iLCBUcnVlKTsKLSsJCX0KLSsJCWFwcERhdGEuY2hhdEFjdGl2ZSA9IFRydWU7Ci0rCQlicmVhazsKLSsJY2FzZSByZmJUZXh0Q2hhdENsb3NlOgotKwkJcHJpbnRDaGF0KCJcbipDaGF0Q2xvc2UqXG4iLCBGYWxzZSk7Ci0rCQlhcHBEYXRhLmNoYXRBY3RpdmUgPSBGYWxzZTsKLSsJCWJyZWFrOwotKwljYXNlIHJmYlRleHRDaGF0RmluaXNoZWQ6Ci0rCQlwcmludENoYXQoIlxuKkNoYXRGaW5pc2hlZCpcbiIsIEZhbHNlKTsKLSsJCWFwcERhdGEuY2hhdEFjdGl2ZSA9IEZhbHNlOwotKwkJYnJlYWs7Ci0rCWRlZmF1bHQ6Ci0rCQlidWZmZXIgPSAoY2hhciAqKW1hbGxvYyhtc2cudGMubGVuZ3RoKzEpOwotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihidWZmZXIsIG1zZy50Yy5sZW5ndGgpKSB7Ci0rCQkJZnJlZShidWZmZXIpOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsJCWJ1ZmZlclttc2cudGMubGVuZ3RoXSA9ICdcMCc7Ci0rCQlhcHBEYXRhLmNoYXRBY3RpdmUgPSBUcnVlOwotKwkJR290Q2hhdFRleHQoYnVmZmVyLCBtc2cudGMubGVuZ3RoKTsKLSsJCWZyZWUoYnVmZmVyKTsKLSsJfQotKwlicmVhazsKLSsgICAgfQotIAotLSAgZGVmYXVsdDoKLS0gICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gbWVzc2FnZSB0eXBlICVkIGZyb20gVk5DIHNlcnZlclxuIixtc2cudHlwZSk7Ci0tICAgIHJldHVybiBGYWxzZTsKLS0gIH0KLSsgICAgY2FzZSByZmJSZXNpemVGcmFtZUJ1ZmZlcjoKLSsgICAgewotKwlyZmJSZXNpemVGcmFtZUJ1ZmZlck1zZyByc21zZzsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoKGNoYXIgKikmcnNtc2cpICsgMSwgc3pfcmZiUmVzaXplRnJhbWVCdWZmZXJNc2cgLSAxKSkgewotKwkJcmV0dXJuIEZhbHNlOwotKwl9Ci0rCXNpLmZyYW1lYnVmZmVyV2lkdGggID0gU3dhcDE2SWZMRShyc21zZy5mcmFtZWJ1ZmZlcldpZHRoKTsKLSsJc2kuZnJhbWVidWZmZXJIZWlnaHQgPSBTd2FwMTZJZkxFKHJzbXNnLmZyYW1lYnVmZmVySGVpZ2h0KTsKLSsJZnByaW50ZihzdGRlcnIsIlVsdHJhVk5DIFJlU2l6ZTogJWR4JWRcbiIsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0KTsKLSsJUmVEb0Rlc2t0b3AoKTsKLSsJYnJlYWs7Ci0rICAgIH0KLSAKLS0gIHJldHVybiBUcnVlOwotKyAgICBjYXNlIHJmYlJlc3RhcnRDb25uZWN0aW9uOgotKyAgICB7Ci0rCXJmYlJlc3RhcnRDb25uZWN0aW9uTXNnIHJjOwotKwlpbnQgbGVuOwotKwljaGFyICpyc19zdHI7Ci0rCWNoYXIgYnVmWzVdID0gIlx4ZmZceGZmXHhmZlx4ZmYiOwotKwlmcHJpbnRmKHN0ZGVyciwgInJmYlJlc3RhcnRDb25uZWN0aW9uLiB0eXBlPSVkXG4iLCAoaW50KSByYy50eXBlKTsKLSsJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciAqKSZyYyArIDEsIHN6X3JmYlJlc3RhcnRDb25uZWN0aW9uTXNnIC0gMSkpIHsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlsZW4gPSBTd2FwMzJJZkxFKHJjLmxlbmd0aCk7Ci0rCWZwcmludGYoc3RkZXJyLCAicmZiUmVzdGFydENvbm5lY3Rpb24uIHBhZDE9JWRcbiIsIChpbnQpIHJjLnBhZDEpOwotKwlmcHJpbnRmKHN0ZGVyciwgInJmYlJlc3RhcnRDb25uZWN0aW9uLiBwYWQyPSVkXG4iLCAoaW50KSByYy5wYWQyKTsKLSsJZnByaW50ZihzdGRlcnIsICJyZmJSZXN0YXJ0Q29ubmVjdGlvbi4gbGVuPSVkXG4iLCBsZW4pOwotKwlpZiAobGVuKSB7Ci0rCQlyc19zdHIgPSAoY2hhciAqKW1hbGxvYygyKmxlbik7CQotKwkJaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihyc19zdHIsIGxlbikpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCQlyZXN0YXJ0X3Nlc3Npb25fcHcgPSByc19zdHI7Ci0rCQlyZXN0YXJ0X3Nlc3Npb25fbGVuID0gbGVuOwotKwl9Ci0rCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCBidWYsIDQpKSB7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJSW5pdGlhbGlzZVJGQkNvbm5lY3Rpb24oKTsKLSsJU2V0VmlzdWFsQW5kQ21hcCgpOwotKwlTZXRGb3JtYXRBbmRFbmNvZGluZ3MoKTsKLSsJRGVza3RvcEN1cnNvck9mZigpOwotKwlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBGYWxzZSk7Ci0rCi0rCWJyZWFrOwotKyAgICB9Ci0rCi0rICAgIGRlZmF1bHQ6Ci0rCWZwcmludGYoc3RkZXJyLCJVbmtub3duIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIFZOQyBzZXJ2ZXJcbiIsbXNnLnR5cGUpOwotKwlyZXR1cm4gRmFsc2U7Ci0rICAgIH0KLSsKLSsJaWYgKGFwcERhdGEuZmlsZUFjdGl2ZSkgewotKwkJaWYgKGZpbGV4ZmVyX3NvY2sgPCAwICYmIGZpbGV4ZmVyX2xpc3RlbiA8IDApIHsKLSsJCQlhcHBEYXRhLmZpbGVBY3RpdmUgPSBGYWxzZTsKLSsJCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIDEsIDEsIEZhbHNlKTsKLSsJCX0gZWxzZSB7Ci0rLypmcHJpbnRmKHN0ZGVyciwgIkNGWDogQVxuIik7ICovCi0rCQkJQ2hlY2tGaWxlWGZlcigpOwotKwkJfQotKwl9Ci0rCi0rICAgIHJldHVybiBUcnVlOwotIH0KLSAKLSAKLUBAIC0xMjk2LDI2ICszNTAxLDkzIEBACi0gI2RlZmluZSBDT05DQVQyKGEsYikgYSMjYgotICNkZWZpbmUgQ09OQ0FUMkUoYSxiKSBDT05DQVQyKGEsYikKLSAKLSsjZGVmaW5lIENPTkNBVDMoYSxiLGMpIGEjI2IjI2MKLSsjZGVmaW5lIENPTkNBVDNFKGEsYixjKSBDT05DQVQzKGEsYixjKQotKwotK3N0YXRpYyB1bnNpZ25lZCBjaGFyKiBmcmFtZUJ1ZmZlciA9IE5VTEw7Ci0rc3RhdGljIGludCBmcmFtZUJ1ZmZlckxlbiA9IDA7Ci0rCi0rI2lmZGVmIFRVUkJPVk5DCi0rI2luY2x1ZGUgInR1cmJvdm5jL3R1cmJvanBlZy5oIgotK3RqaGFuZGxlIHRqaG5kPU5VTEw7Ci0rc3RhdGljIGNoYXIgKmNvbXByZXNzZWREYXRhID0gTlVMTDsKLStzdGF0aWMgY2hhciAqdW5jb21wcmVzc2VkRGF0YSA9IE5VTEw7Ci0rI2RlZmluZSBDb3B5RGF0YVRvSW1hZ2UgQ29weURhdGFUb1NjcmVlbgotK3N0YXRpYyB2b2lkIHR1cmJvdm5jX0ZpbGxSZWN0YW5nbGUoWEdDVmFsdWVzICpnY3YsIGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCkgewotKwlpZiAoIWFwcERhdGEudXNlWHNlcnZlckJhY2tpbmdTdG9yZSkgewotKwkJRmlsbFNjcmVlbihyeCwgcnksIHJ3LCByaCwgZ2N2LT5mb3JlZ3JvdW5kKTsKLSsJfSBlbHNlIHsKLSsJCVhDaGFuZ2VHQyhkcHksIGdjLCBHQ0ZvcmVncm91bmQsIGdjdik7Ci0rCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCByeCwgcnksIHJ3LCByaCk7Ci0rCX0KLSt9Ci0rc3RhdGljIHZvaWQgQ29weUltYWdlVG9TY3JlZW4oaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKLSsJcHV0X2ltYWdlKHgsIHksIHgsIHksIHcsIGgsIDApOwotK30KLSsjZW5kaWYKLSsKLSAjZGVmaW5lIEJQUCA4Ci0gI2luY2x1ZGUgInJyZS5jIgotICNpbmNsdWRlICJjb3JyZS5jIgotICNpbmNsdWRlICJoZXh0aWxlLmMiCi0gI2luY2x1ZGUgInpsaWIuYyIKLSsKLSsjaWZkZWYgVFVSQk9WTkMKLSsjdW5kZWYgRmlsbFJlY3RhbmdsZQotKyNkZWZpbmUgRmlsbFJlY3RhbmdsZSB0dXJib3ZuY19GaWxsUmVjdGFuZ2xlCi0rI2luY2x1ZGUgInR1cmJvdm5jL3RpZ2h0LmMiCi0rI3VuZGVmIEZpbGxSZWN0YW5nbGUKLSsjZWxzZQotICNpbmNsdWRlICJ0aWdodC5jIgotKyNlbmRpZgotKwotKyNpbmNsdWRlICJ6cmxlLmMiCi0gI3VuZGVmIEJQUAotKwotICNkZWZpbmUgQlBQIDE2Ci0gI2luY2x1ZGUgInJyZS5jIgotICNpbmNsdWRlICJjb3JyZS5jIgotICNpbmNsdWRlICJoZXh0aWxlLmMiCi0gI2luY2x1ZGUgInpsaWIuYyIKLSsKLSsjaWZkZWYgVFVSQk9WTkMKLSsjdW5kZWYgRmlsbFJlY3RhbmdsZQotKyNkZWZpbmUgRmlsbFJlY3RhbmdsZSB0dXJib3ZuY19GaWxsUmVjdGFuZ2xlCi0rI2luY2x1ZGUgInR1cmJvdm5jL3RpZ2h0LmMiCi0rI3VuZGVmIEZpbGxSZWN0YW5nbGUKLSsjZWxzZQotICNpbmNsdWRlICJ0aWdodC5jIgotKyNlbmRpZgotKwotKyNpbmNsdWRlICJ6cmxlLmMiCi0rI2RlZmluZSBSRUFMQlBQIDE1Ci0rI2luY2x1ZGUgInpybGUuYyIKLSAjdW5kZWYgQlBQCi0rCi0gI2RlZmluZSBCUFAgMzIKLSAjaW5jbHVkZSAicnJlLmMiCi0gI2luY2x1ZGUgImNvcnJlLmMiCi0gI2luY2x1ZGUgImhleHRpbGUuYyIKLSAjaW5jbHVkZSAiemxpYi5jIgotKwotKyNpZmRlZiBUVVJCT1ZOQwotKyN1bmRlZiBGaWxsUmVjdGFuZ2xlCi0rI2RlZmluZSBGaWxsUmVjdGFuZ2xlIHR1cmJvdm5jX0ZpbGxSZWN0YW5nbGUKLSsjaW5jbHVkZSAidHVyYm92bmMvdGlnaHQuYyIKLSsjdW5kZWYgRmlsbFJlY3RhbmdsZQotKyNlbHNlCi0gI2luY2x1ZGUgInRpZ2h0LmMiCi0rI2VuZGlmCi0rCi0rI2luY2x1ZGUgInpybGUuYyIKLSsjZGVmaW5lIFJFQUxCUFAgMjQKLSsjaW5jbHVkZSAienJsZS5jIgotKyNkZWZpbmUgUkVBTEJQUCAyNAotKyNkZWZpbmUgVU5DT01QIDgKLSsjaW5jbHVkZSAienJsZS5jIgotKyNkZWZpbmUgUkVBTEJQUCAyNAotKyNkZWZpbmUgVU5DT01QIC04Ci0rI2luY2x1ZGUgInpybGUuYyIKLSAjdW5kZWYgQlBQCi0gCi0gLyoKLUBAIC0xMzI1LDIzICszNTk3LDI3IEBACi0gc3RhdGljIHZvaWQKLSBSZWFkQ29ubkZhaWxlZFJlYXNvbih2b2lkKQotIHsKLS0gIENBUkQzMiByZWFzb25MZW47Ci0tICBjaGFyICpyZWFzb24gPSBOVUxMOwotKwlDQVJEMzIgcmVhc29uTGVuOwotKwljaGFyICpyZWFzb24gPSBOVUxMOwotIAotLSAgaWYgKFJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnJlYXNvbkxlbiwgc2l6ZW9mKHJlYXNvbkxlbikpKSB7Ci0tICAgIHJlYXNvbkxlbiA9IFN3YXAzMklmTEUocmVhc29uTGVuKTsKLS0gICAgaWYgKChyZWFzb24gPSBtYWxsb2MocmVhc29uTGVuKSkgIT0gTlVMTCAmJgotLSAgICAgICAgUmVhZEZyb21SRkJTZXJ2ZXIocmVhc29uLCByZWFzb25MZW4pKSB7Ci0tICAgICAgZnByaW50ZihzdGRlcnIsIlZOQyBjb25uZWN0aW9uIGZhaWxlZDogJS4qc1xuIiwgKGludClyZWFzb25MZW4sIHJlYXNvbik7Ci0tICAgICAgZnJlZShyZWFzb24pOwotLSAgICAgIHJldHVybjsKLS0gICAgfQotLSAgfQotKwlpZiAoUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmcmVhc29uTGVuLCBzaXplb2YocmVhc29uTGVuKSkpIHsKLSsJCXJlYXNvbkxlbiA9IFN3YXAzMklmTEUocmVhc29uTGVuKTsKLSsJCWlmICgocmVhc29uID0gbWFsbG9jKHJlYXNvbkxlbikpICE9IE5VTEwgJiYKLSsJCSAgICBSZWFkRnJvbVJGQlNlcnZlcihyZWFzb24sIHJlYXNvbkxlbikpIHsKLSsJCQlpbnQgbGVuID0gKGludCkgcmVhc29uTGVuIDwgc2l6ZW9mKG1zZ2J1ZikgLSAxMCA/IChpbnQpIHJlYXNvbkxlbiA6IHNpemVvZihtc2didWYpIC0gMTA7Ci0rCQkJc3ByaW50Zihtc2didWYsIlZOQyBjb25uZWN0aW9uIGZhaWxlZDogJS4qc1xuIiwgbGVuLCByZWFzb24pOwotKwkJCXdtc2cobXNnYnVmLCAxKTsKLSsJCQlmcmVlKHJlYXNvbik7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0gCi0tICBmcHJpbnRmKHN0ZGVyciwgIlZOQyBjb25uZWN0aW9uIGZhaWxlZFxuIik7Ci0rCXNwcmludGYobXNnYnVmLCAiVk5DIGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKLSsJd21zZyhtc2didWYsIDEpOwotIAotLSAgaWYgKHJlYXNvbiAhPSBOVUxMKQotLSAgICBmcmVlKHJlYXNvbik7Ci0rCWlmIChyZWFzb24gIT0gTlVMTCkgewotKwkJZnJlZShyZWFzb24pOwotKwl9Ci0gfQotIAotIC8qCi1AQCAtMTM1OCw5ICszNjM0LDkgQEAKLSAJICAgICIgICVzIHNpZ25pZmljYW50IGJpdCBpbiBlYWNoIGJ5dGUgaXMgbGVmdG1vc3Qgb24gdGhlIHNjcmVlbi5cbiIsCi0gCSAgICAoZm9ybWF0LT5iaWdFbmRpYW4gPyAiTW9zdCIgOiAiTGVhc3QiKSk7Ci0gICB9IGVsc2UgewotLSAgICBmcHJpbnRmKHN0ZGVyciwiICAlZCBiaXRzIHBlciBwaXhlbC5cbiIsZm9ybWF0LT5iaXRzUGVyUGl4ZWwpOwotKyAgICBmcHJpbnRmKHN0ZGVyciwiICAlZCBiaXRzIHBlciBwaXhlbC4gICIsZm9ybWF0LT5iaXRzUGVyUGl4ZWwpOwotICAgICBpZiAoZm9ybWF0LT5iaXRzUGVyUGl4ZWwgIT0gOCkgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCIgICVzIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgaW4gZWFjaCBwaXhlbC5cbiIsCi0rICAgICAgZnByaW50ZihzdGRlcnIsIiVzIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgaW4gZWFjaCBwaXhlbC5cbiIsCi0gCSAgICAgIChmb3JtYXQtPmJpZ0VuZGlhbiA/ICJNb3N0IiA6ICJMZWFzdCIpKTsKLSAgICAgfQotICAgICBpZiAoZm9ybWF0LT50cnVlQ29sb3VyKSB7Ci1AQCAtMTQ2Miw0ICszNzM4LDMgQEAKLSAKLSAgIGNpbmZvLT5zcmMgPSAmanBlZ1NyY01hbmFnZXI7Ci0gfQotLQotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvcnJlLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3JyZS5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvcnJlLmMJMjAwMC0wNi0xMSAwODowMDo1My4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvcnJlLmMJMjAwOC0xMC0wNSAxNToxNjozMC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0yOSw2ICsyOSwxOCBAQAotICNkZWZpbmUgSGFuZGxlUlJFQlBQIENPTkNBVDJFKEhhbmRsZVJSRSxCUFApCi0gI2RlZmluZSBDQVJEQlBQIENPTkNBVDJFKENBUkQsQlBQKQotIAotKyNkZWZpbmUgRmlsbFJlY3RhbmdsZSh4LCB5LCB3LCBoLCBjb2xvcikgIFwKLSsJeyBcCi0rCQlYR0NWYWx1ZXMgX2djdjsgXAotKwkJX2djdi5mb3JlZ3JvdW5kID0gY29sb3I7IFwKLSsJCWlmICghYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7IFwKLSsJCQlGaWxsU2NyZWVuKHgsIHksIHcsIGgsIF9nY3YuZm9yZWdyb3VuZCk7IFwKLSsJCX0gZWxzZSB7IFwKLSsJCQlYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmX2djdik7IFwKLSsJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCB4LCB5LCB3LCBoKTsgXAotKwkJfSBcCi0rCX0KLSsKLSBzdGF0aWMgQm9vbAotIEhhbmRsZVJSRUJQUCAoaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKQotIHsKLUBAIC00OSwxMSArNjEsMTkgQEAKLSAjaWYgKEJQUCA9PSA4KQotICAgZ2N2LmZvcmVncm91bmQgPSAoYXBwRGF0YS51c2VCR1IyMzMgPyBCR1IyMzNUb1BpeGVsW3BpeF0gOiBwaXgpOwotICNlbHNlCi0rI2lmIChCUFAgPT0gMTYpCi0rICBnY3YuZm9yZWdyb3VuZCA9IChhcHBEYXRhLnVzZUJHUjU2NSA/IEJHUjU2NVRvUGl4ZWxbcGl4XSA6IHBpeCk7Ci0rI2Vsc2UKLSAgIGdjdi5mb3JlZ3JvdW5kID0gcGl4OwotICNlbmRpZgotKyNlbmRpZgotIAotKyNpZiAwCi0gICBYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmZ2N2KTsKLSAgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHJ4LCByeSwgcncsIHJoKTsKLSsjZWxzZQotKyAgRmlsbFJlY3RhbmdsZShyeCwgcnksIHJ3LCByaCwgZ2N2LmZvcmVncm91bmQpOwotKyNlbmRpZgotIAotICAgZm9yIChpID0gMDsgaSA8IGhkci5uU3VicmVjdHM7IGkrKykgewotICAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJnBpeCwgc2l6ZW9mKHBpeCkpKQotQEAgLTcwLDEzICs5MCwyMyBAQAotICNpZiAoQlBQID09IDgpCi0gICAgIGdjdi5mb3JlZ3JvdW5kID0gKGFwcERhdGEudXNlQkdSMjMzID8gQkdSMjMzVG9QaXhlbFtwaXhdIDogcGl4KTsKLSAjZWxzZQotKyNpZiAoQlBQID09IDE2KQotKyAgICBnY3YuZm9yZWdyb3VuZCA9IChhcHBEYXRhLnVzZUJHUjU2NSA/IEJHUjU2NVRvUGl4ZWxbcGl4XSA6IHBpeCk7Ci0rI2Vsc2UKLSAgICAgZ2N2LmZvcmVncm91bmQgPSBwaXg7Ci0gI2VuZGlmCi0rI2VuZGlmCi0gCi0rI2lmIDAKLSAgICAgWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0gICAgIFhGaWxsUmVjdGFuZ2xlKGRweSwgZGVza3RvcFdpbiwgZ2MsIHJ4ICsgc3VicmVjdC54LCByeSArIHN1YnJlY3QueSwKLSAJCSAgIHN1YnJlY3Qudywgc3VicmVjdC5oKTsKLSsjZWxzZQotKyAgICBGaWxsUmVjdGFuZ2xlKHJ4ICsgc3VicmVjdC54LCByeSArIHN1YnJlY3QueSwgc3VicmVjdC53LCBzdWJyZWN0LmgsIGdjdi5mb3JlZ3JvdW5kKTsKLSsjZW5kaWYKLSAgIH0KLSAKLSAgIHJldHVybiBUcnVlOwotIH0KLSsKLSsjdW5kZWYgRmlsbFJlY3RhbmdsZQotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvc2VsZWN0aW9uLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3NlbGVjdGlvbi5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvc2VsZWN0aW9uLmMJMjAwNC0wMy0wMyAwNDoxMTo1Mi4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvc2VsZWN0aW9uLmMJMjAxMC0wMi0yNSAyMzoyODo0OC4wMDAwMDAwMDAgLTA1MDAKLUBAIC00MywxMyArNDMsMTYgQEAKLSAJCQkJdW5zaWduZWQgbG9uZyogbGVuZ3RoLCBpbnQqIGZvcm1hdCk7Ci0gc3RhdGljIHZvaWQgTG9zZVNlbGVjdGlvbihXaWRnZXQgdywgQXRvbSAqc2VsZWN0aW9uKTsKLSAKLS1zdGF0aWMgQm9vbCBpQW1TZWxlY3Rpb25Pd25lciA9IEZhbHNlOwotK3N0YXRpYyBCb29sIFByaW1hcnlTZWxlY3Rpb25Pd25lciA9IEZhbHNlOwotK3N0YXRpYyBCb29sIENsaXBib2FyZFNlbGVjdGlvbk93bmVyID0gRmFsc2U7Ci0gc3RhdGljIFRpbWUgcHJldlNlbGVjdGlvblRpbWUgPSAwTDsKLSBzdGF0aWMgVGltZSBjdXRCdWZmZXJUaW1lID0gMEw7Ci0gCi0gI2RlZmluZSBUSU1FX0xBVEVSKGEsIGIpICgoYSkgIT0gMCAmJiAoKGIpID09IDAgfHwgKElOVDMyKSgoYSkgLSAoYikpID4gMCkpCi0gCi0gCi0rc3RhdGljIEF0b20gY2xpcGJvYXJkX2F0b20gPSBOb25lOwotKwotIC8qCi0gICogSW5pdGlhbGlzZVNlbGVjdGlvbigpIG11c3QgYmUgY2FsbGVkIGFmdGVyIHJlYWxpemluZyB3aWRnZXRzIChiZWNhdXNlCi0gICogb3RoZXJ3aXNlIFh0R2V0U2VsZWN0aW9uVmFsdWUoKSBmYWlscykuICBXZSByZWdpc3RlciBldmVudHMgb24gdGhlIHJvb3QKLUBAIC02MiwyMiArNjUsMjggQEAKLSAgKiBhdmFpbGFibGUuCi0gICovCi0gCi0tdm9pZAotLUluaXRpYWxpc2VTZWxlY3Rpb24oKQotLXsKLStzdGF0aWMgaW50IGRiZ19zZWwgPSAtMTsKLSsKLSt2b2lkIEluaXRpYWxpc2VTZWxlY3Rpb24oKSB7Ci0gI2lmIFh0U3BlY2lmaWNhdGlvblJlbGVhc2UgPj0gNgotLSAgWHRSZWdpc3RlckRyYXdhYmxlKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgdG9wbGV2ZWwpOwotKwlYdFJlZ2lzdGVyRHJhd2FibGUoZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCB0b3BsZXZlbCk7Ci0gI2Vsc2UKLS0gIF9YdFJlZ2lzdGVyV2luZG93KERlZmF1bHRSb290V2luZG93KGRweSksIHRvcGxldmVsKTsKLSsJX1h0UmVnaXN0ZXJXaW5kb3coRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgdG9wbGV2ZWwpOwotICNlbmRpZgotLSAgWFNlbGVjdElucHV0KGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgUHJvcGVydHlDaGFuZ2VNYXNrKTsKLSsJWFNlbGVjdElucHV0KGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgUHJvcGVydHlDaGFuZ2VNYXNrKTsKLSAKLS0gIFh0QWRkUmF3RXZlbnRIYW5kbGVyKHRvcGxldmVsLCBQcm9wZXJ0eUNoYW5nZU1hc2ssIEZhbHNlLCBDdXRCdWZmZXJDaGFuZ2UsCi0tCQkgICAgICAgTlVMTCk7Ci0rCVh0QWRkUmF3RXZlbnRIYW5kbGVyKHRvcGxldmVsLCBQcm9wZXJ0eUNoYW5nZU1hc2ssIEZhbHNlLCBDdXRCdWZmZXJDaGFuZ2UsIE5VTEwpOwotIAotLSAgWHRHZXRTZWxlY3Rpb25WYWx1ZSh0b3BsZXZlbCwgWEFfUFJJTUFSWSwKLSsJY2xpcGJvYXJkX2F0b20gPSBYSW50ZXJuQXRvbShkcHksICJDTElQQk9BUkQiLCBGYWxzZSk7Ci0rCi0rCVh0R2V0U2VsZWN0aW9uVmFsdWUodG9wbGV2ZWwsIFhBX1BSSU1BUlksCi0gCQkgICAgICBYSW50ZXJuQXRvbShkcHksICJUSU1FU1RBTVAiLCBGYWxzZSksCi0gCQkgICAgICBHZXRJbml0aWFsU2VsZWN0aW9uVGltZUNhbGxiYWNrLCBOVUxMLCBDdXJyZW50VGltZSk7Ci0rCi0rCWlmIChkYmdfc2VsIDwgMCkgewotKwkJZGJnX3NlbCA9IDA7Ci0rCQlpZiAoZ2V0ZW52KCJTU1ZOQ19ERUJVR19TRUxFQ1RJT04iKSkgZGJnX3NlbCA9IDE7Ci0rCX0KLSB9Ci0gCi0gCi1AQCAtOTMsMTMgKzEwMiwxNiBAQAotIAkJCQlBdG9tKiBzZWxlY3Rpb24sIEF0b20qIHR5cGUsIFh0UG9pbnRlciB2YWx1ZSwKLSAJCQkJdW5zaWduZWQgbG9uZyogbGVuZ3RoLCBpbnQqIGZvcm1hdCkKLSB7Ci0tICBpZiAodmFsdWUgJiYgKmZvcm1hdCA9PSAzMiAmJiAqbGVuZ3RoID09IDEpCi0tICAgIHByZXZTZWxlY3Rpb25UaW1lID0gKihDQVJEMzIgKil2YWx1ZTsKLS0gIGVsc2UKLS0gICAgcHJldlNlbGVjdGlvblRpbWUgPSAwTDsKLS0KLS0gIGlmICh2YWx1ZSkKLS0gICAgWHRGcmVlKHZhbHVlKTsKLSsJaWYgKHZhbHVlICYmICpmb3JtYXQgPT0gMzIgJiYgKmxlbmd0aCA9PSAxKSB7Ci0rCQlwcmV2U2VsZWN0aW9uVGltZSA9ICooQ0FSRDMyICopdmFsdWU7Ci0rCX0gZWxzZSB7Ci0rCQlwcmV2U2VsZWN0aW9uVGltZSA9IDBMOwotKwl9Ci0rCi0rCWlmICh2YWx1ZSkgewotKwkJWHRGcmVlKHZhbHVlKTsKLSsJfQotKwlpZiAodyB8fCBjbGllbnREYXRhIHx8IHNlbGVjdGlvbiB8fCB0eXBlIHx8IHZhbHVlIHx8IGxlbmd0aCB8fCBmb3JtYXQpIHt9Ci0gfQotIAotIAotQEAgLTEyMSwyNiArMTMzLDMwIEBACi0gdm9pZAotIFNlbGVjdGlvblRvVk5DKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0gewotLSAgQm9vbCBhbHdheXMgPSBGYWxzZTsKLSsJQm9vbCBhbHdheXMgPSBhcHBEYXRhLnNlbmRBbHdheXM7Ci0rCUF0b20gc2VuZHNlbCA9IFhBX1BSSU1BUlk7Ci0gCi0tICBpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotLSAgICBpZiAoc3RyY21wKHBhcmFtc1swXSwiYWx3YXlzIikgPT0gMCkgewotLSAgICAgIGFsd2F5cyA9IFRydWU7Ci0tICAgIH0gZWxzZSBpZiAoc3RyY21wKHBhcmFtc1swXSwibmV3IikgPT0gMCkgewotLSAgICAgIGFsd2F5cyA9IEZhbHNlOwotLSAgICB9IGVsc2UgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCJJbnZhbGlkIHBhcmFtczogU2VsZWN0aW9uVG9WTkMoYWx3YXlzfG5ldylcbiIpOwotLSAgICAgIHJldHVybjsKLS0gICAgfQotLSAgfQotLQotLSAgaWYgKGFsd2F5cykgewotLSAgICBYdEdldFNlbGVjdGlvblZhbHVlKHcsIFhBX1BSSU1BUlksIFhBX1NUUklORywgR2V0U2VsZWN0aW9uQ2FsbGJhY2ssIE5VTEwsCi0tCQkJVGltZUZyb21FdmVudChldmVudCkpOwotLSAgfSBlbHNlIHsKLS0gICAgWHRHZXRTZWxlY3Rpb25WYWx1ZSh3LCBYQV9QUklNQVJZLCBYSW50ZXJuQXRvbShkcHksICJUSU1FU1RBTVAiLCBGYWxzZSksCi0tCQkJR2V0U2VsZWN0aW9uVGltZUNhbGxiYWNrLCBOVUxMLCBUaW1lRnJvbUV2ZW50KGV2ZW50KSk7Ci0tICB9Ci0rCWlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0rCQlpZiAoc3RyY21wKHBhcmFtc1swXSwiYWx3YXlzIikgPT0gMCkgewotKwkJCWFsd2F5cyA9IFRydWU7Ci0rCQl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbXNbMF0sIm5ldyIpID09IDApIHsKLSsJCQlhbHdheXMgPSBGYWxzZTsKLSsJCX0gZWxzZSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsIkludmFsaWQgcGFyYW1zOiBTZWxlY3Rpb25Ub1ZOQyhhbHdheXN8bmV3KVxuIik7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0rCWlmIChhcHBEYXRhLnNlbmRDbGlwYm9hcmQgJiYgY2xpcGJvYXJkX2F0b20gIT0gTm9uZSkgewotKwkJc2VuZHNlbCA9IGNsaXBib2FyZF9hdG9tOwotKwl9Ci0rCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgIlNlbGVjdGlvblRvVk5DICVzXG4iLCBzZW5kc2VsID09IFhBX1BSSU1BUlkgPyAiUFJJTUFSWSIgOiAiQ0xJUEJPQVJEIik7Ci0rCi0rCWlmIChhbHdheXMpIHsKLSsJCVh0R2V0U2VsZWN0aW9uVmFsdWUodywgc2VuZHNlbCwgWEFfU1RSSU5HLCBHZXRTZWxlY3Rpb25DYWxsYmFjaywgTlVMTCwgVGltZUZyb21FdmVudChldmVudCkpOwotKwl9IGVsc2UgewotKwkJWHRHZXRTZWxlY3Rpb25WYWx1ZSh3LCBzZW5kc2VsLCBYSW50ZXJuQXRvbShkcHksICJUSU1FU1RBTVAiLCBGYWxzZSksIEdldFNlbGVjdGlvblRpbWVDYWxsYmFjaywgTlVMTCwgVGltZUZyb21FdmVudChldmVudCkpOwotKwl9Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotIH0KLSAKLSAKLUBAIC0xNTgsMTAgKzE3NCwxMyBAQAotICAgaW50IGxlbiA9ICpsZW5ndGg7Ci0gICBjaGFyICpzdHIgPSAoY2hhciAqKXZhbHVlOwotIAotLSAgaWYgKHN0cikKLS0gICAgU2VuZENsaWVudEN1dFRleHQoc3RyLCBsZW4pOwotLSAgZWxzZQotLSAgICBTZW5kQ3V0QnVmZmVyKCk7Ci0rCWlmIChzdHIpIHsKLSsJCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgIlNlbmRDbGllbnRDdXRUZXh0IGxlbjogJWRcbiIsIGxlbik7Ci0rCQlTZW5kQ2xpZW50Q3V0VGV4dChzdHIsIGxlbik7Ci0rCX0gZWxzZSBpZiAoIWdldGVudigiVk5DVklFV0VSX05PX0NVVEJVRkZFUiIpKSB7Ci0rCQlTZW5kQ3V0QnVmZmVyKCk7Ci0rCX0KLSsJaWYgKHcgfHwgY2xpZW50RGF0YSB8fCBzZWxlY3Rpb24gfHwgdHlwZSB8fCB2YWx1ZSB8fCBsZW5ndGggfHwgZm9ybWF0KSB7fQotIH0KLSAKLSAKLUBAIC0xODAsMjYgKzE5OSwyNCBAQAotIAkJCSBBdG9tKiB0eXBlLCBYdFBvaW50ZXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcqIGxlbmd0aCwKLSAJCQkgaW50KiBmb3JtYXQpCi0gewotLSAgaWYgKHZhbHVlICYmICpmb3JtYXQgPT0gMzIgJiYgKmxlbmd0aCA9PSAxKSB7Ci0rCWlmICh2YWx1ZSAmJiAqZm9ybWF0ID09IDMyICYmICpsZW5ndGggPT0gMSkgewotKwkJVGltZSB0ID0gKihDQVJEMzIgKil2YWx1ZTsKLSAKLS0gICAgVGltZSB0ID0gKihDQVJEMzIgKil2YWx1ZTsKLS0KLS0gICAgaWYgKFRJTUVfTEFURVIodCwgcHJldlNlbGVjdGlvblRpbWUpKSB7Ci0tICAgICAgcHJldlNlbGVjdGlvblRpbWUgPSB0OwotLSAgICAgIFh0R2V0U2VsZWN0aW9uVmFsdWUodywgWEFfUFJJTUFSWSwgWEFfU1RSSU5HLCBHZXRTZWxlY3Rpb25DYWxsYmFjaywgTlVMTCwKLS0JCQkgIEN1cnJlbnRUaW1lKTsKLS0gICAgfQotLQotLSAgfSBlbHNlIHsKLS0KLS0gICAgaWYgKFRJTUVfTEFURVIoY3V0QnVmZmVyVGltZSwgcHJldlNlbGVjdGlvblRpbWUpKSB7Ci0tICAgICAgcHJldlNlbGVjdGlvblRpbWUgPSBjdXRCdWZmZXJUaW1lOwotLSAgICAgIFNlbmRDdXRCdWZmZXIoKTsKLS0gICAgfQotLSAgfQotLQotLSAgaWYgKHZhbHVlKQotLSAgICBYdEZyZWUodmFsdWUpOwotKwkJaWYgKFRJTUVfTEFURVIodCwgcHJldlNlbGVjdGlvblRpbWUpKSB7Ci0rCQkJcHJldlNlbGVjdGlvblRpbWUgPSB0OwotKwkJCVh0R2V0U2VsZWN0aW9uVmFsdWUodywgWEFfUFJJTUFSWSwgWEFfU1RSSU5HLCBHZXRTZWxlY3Rpb25DYWxsYmFjaywgTlVMTCwgQ3VycmVudFRpbWUpOwotKwkJfQotKwl9IGVsc2UgaWYgKCFnZXRlbnYoIlZOQ1ZJRVdFUl9OT19DVVRCVUZGRVIiKSkgewotKwkJaWYgKFRJTUVfTEFURVIoY3V0QnVmZmVyVGltZSwgcHJldlNlbGVjdGlvblRpbWUpKSB7Ci0rCQkJcHJldlNlbGVjdGlvblRpbWUgPSBjdXRCdWZmZXJUaW1lOwotKwkJCVNlbmRDdXRCdWZmZXIoKTsKLSsJCX0KLSsJfQotKwotKwlpZiAodmFsdWUpIHsKLSsJCVh0RnJlZSh2YWx1ZSk7Ci0rCX0KLSsJaWYgKHcgfHwgY2xpZW50RGF0YSB8fCBzZWxlY3Rpb24gfHwgdHlwZSB8fCB2YWx1ZSB8fCBsZW5ndGggfHwgZm9ybWF0KSB7fQotIH0KLSAKLSAKLUBAIC0yMDksMTYgKzIyNiwxNyBAQAotICAqLwotIAotIHN0YXRpYyB2b2lkCi0tU2VuZEN1dEJ1ZmZlcigpCi0tewotLSAgY2hhciAqc3RyOwotLSAgaW50IGxlbjsKLStTZW5kQ3V0QnVmZmVyKCkgewotKwljaGFyICpzdHI7Ci0rCWludCBsZW47Ci0gCi0tICBzdHIgPSBYRmV0Y2hCeXRlcyhkcHksICZsZW4pOwotLSAgaWYgKCFzdHIpIHJldHVybjsKLSsJaWYgKGRiZ19zZWwpIGZwcmludGYoc3RkZXJyLCAiU2VuZEN1dEJ1ZmZlciBsZW46ICVkXG4iLCBsZW4pOwotIAotLSAgU2VuZENsaWVudEN1dFRleHQoc3RyLCBsZW4pOwotLSAgWEZyZWUoc3RyKTsKLSsJc3RyID0gWEZldGNoQnl0ZXMoZHB5LCAmbGVuKTsKLSsJaWYgKCFzdHIpIHJldHVybjsKLSsKLSsJU2VuZENsaWVudEN1dFRleHQoc3RyLCBsZW4pOwotKwlYRnJlZShzdHIpOwotIH0KLSAKLSAKLUBAIC0yMzAsMTAgKzI0OCwxMiBAQAotIHN0YXRpYyB2b2lkCi0gQ3V0QnVmZmVyQ2hhbmdlKFdpZGdldCB3LCBYdFBvaW50ZXIgcHRyLCBYRXZlbnQgKmV2LCBCb29sZWFuICpjb250KQotIHsKLS0gIGlmIChldi0+dHlwZSAhPSBQcm9wZXJ0eU5vdGlmeSB8fCBldi0+eHByb3BlcnR5LmF0b20gIT0gWEFfQ1VUX0JVRkZFUjApCi0tICAgIHJldHVybjsKLSsJaWYgKGV2LT50eXBlICE9IFByb3BlcnR5Tm90aWZ5IHx8IGV2LT54cHJvcGVydHkuYXRvbSAhPSBYQV9DVVRfQlVGRkVSMCkgewotKwkJcmV0dXJuOwotKwl9Ci0gCi0tICBjdXRCdWZmZXJUaW1lID0gZXYtPnhwcm9wZXJ0eS50aW1lOwotKwljdXRCdWZmZXJUaW1lID0gZXYtPnhwcm9wZXJ0eS50aW1lOwotKwlpZiAodyB8fCBwdHIgfHwgY29udCkge30KLSB9Ci0gCi0gCi1AQCAtMjQ5LDM2ICsyNjksNjkgQEAKLSB2b2lkCi0gU2VsZWN0aW9uRnJvbVZOQyhXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotIHsKLS0gIEJvb2wgYWx3YXlzID0gRmFsc2U7Ci0tICBUaW1lIHQgPSBUaW1lRnJvbUV2ZW50KGV2ZW50KTsKLS0KLS0gIGlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0tICAgIGlmIChzdHJjbXAocGFyYW1zWzBdLCJhbHdheXMiKSA9PSAwKSB7Ci0tICAgICAgYWx3YXlzID0gVHJ1ZTsKLS0gICAgfSBlbHNlIGlmIChzdHJjbXAocGFyYW1zWzBdLCJuZXciKSA9PSAwKSB7Ci0tICAgICAgYWx3YXlzID0gRmFsc2U7Ci0tICAgIH0gZWxzZSB7Ci0tICAgICAgZnByaW50ZihzdGRlcnIsIkludmFsaWQgcGFyYW1zOiBTZWxlY3Rpb25Gcm9tVk5DKGFsd2F5c3xuZXcpXG4iKTsKLS0gICAgICByZXR1cm47Ci0tICAgIH0KLS0gIH0KLS0KLS0gIGlmICh0ID09IEN1cnJlbnRUaW1lKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiB0cmFuc2xhdGlvbnM6IFNlbGVjdGlvbkZyb21WTkMoKSBtdXN0IGFjdCBvbiAiCi0tCSAgICAiZXZlbnQgd2l0aCB0aW1lIGZpZWxkXG4iKTsKLS0gICAgcmV0dXJuOwotLSAgfQotLQotLSAgaWYgKCFzZXJ2ZXJDdXRUZXh0IHx8ICghYWx3YXlzICYmICFuZXdTZXJ2ZXJDdXRUZXh0KSkKLS0gICAgcmV0dXJuOwotLQotLSAgbmV3U2VydmVyQ3V0VGV4dCA9IEZhbHNlOwotLQotLSAgWFN0b3JlQnl0ZXMoZHB5LCBzZXJ2ZXJDdXRUZXh0LCBzdHJsZW4oc2VydmVyQ3V0VGV4dCkpOwotLSAgaWYgKFh0T3duU2VsZWN0aW9uKGRlc2t0b3AsIFhBX1BSSU1BUlksIHQsIENvbnZlcnRTZWxlY3Rpb24sIExvc2VTZWxlY3Rpb24sCi0tCQkgICAgIE5VTEwpKSB7Ci0tICAgIGlBbVNlbGVjdGlvbk93bmVyID0gVHJ1ZTsKLS0gIH0KLSsJQm9vbCBhbHdheXMgPSBGYWxzZTsKLSsJVGltZSB0ID0gVGltZUZyb21FdmVudChldmVudCk7Ci0rCWludCBob2xkX3ByaW1hcnkgICA9IDA7Ci0rCWludCBob2xkX2NsaXBib2FyZCA9IDA7Ci0rCi0rCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgIlNlbGVjdGlvbkZyb21WTkNcbiIpOwotKwotKwlpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotKwkJaWYgKHN0cmNtcChwYXJhbXNbMF0sImFsd2F5cyIpID09IDApIHsKLSsJCQlhbHdheXMgPSBUcnVlOwotKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW1zWzBdLCJuZXciKSA9PSAwKSB7Ci0rCQkJYWx3YXlzID0gRmFsc2U7Ci0rCQl9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIHBhcmFtczogU2VsZWN0aW9uRnJvbVZOQyhhbHdheXN8bmV3KVxuIik7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0rCi0rCWlmICh0ID09IEN1cnJlbnRUaW1lKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gdHJhbnNsYXRpb25zOiBTZWxlY3Rpb25Gcm9tVk5DKCkgbXVzdCBhY3Qgb24gIgotKwkJICAgICJldmVudCB3aXRoIHRpbWUgZmllbGRcbiIpOwotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCWlmICghc2VydmVyQ3V0VGV4dCB8fCAoIWFsd2F5cyAmJiAhbmV3U2VydmVyQ3V0VGV4dCkpIHsKLSsJCXJldHVybjsKLSsJfQotKwotKwluZXdTZXJ2ZXJDdXRUZXh0ID0gRmFsc2U7Ci0rCi0rCWlmIChhcHBEYXRhLmFwcFNoYXJlKSB7Ci0rCQlpZiAoc3Ryc3RyKHNlcnZlckN1dFRleHQsICJYMTFWTkNfQVBQU0hBUkVfQ01EOiIpID09IHNlcnZlckN1dFRleHQpIHsKLSsJCQkvKiBkbyBzb21ldGhpbmcgd2l0aCBpdD8gKi8KLSsJCQlyZXR1cm47Ci0rCQl9Ci0rCX0KLSsKLSsJWFN0b3JlQnl0ZXMoZHB5LCBzZXJ2ZXJDdXRUZXh0LCBzdHJsZW4oc2VydmVyQ3V0VGV4dCkpOwotKwotKwlpZiAoYXBwRGF0YS5yZWN2VGV4dCA9PSBOVUxMKSB7Ci0rCQlhcHBEYXRhLnJlY3ZUZXh0ID0gc3RyZHVwKCJib3RoIik7Ci0rCX0KLSsJaWYgKCFzdHJjYXNlY21wKGFwcERhdGEucmVjdlRleHQsICJwcmltYXJ5IikpIHsKLSsJCWhvbGRfcHJpbWFyeSA9IDE7Ci0rCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXBwRGF0YS5yZWN2VGV4dCwgImNsaXBib2FyZCIpKSB7Ci0rCQlob2xkX2NsaXBib2FyZCA9IDE7Ci0rCX0gZWxzZSB7Ci0rCQlob2xkX3ByaW1hcnkgPSBob2xkX2NsaXBib2FyZCA9IDE7Ci0rCX0KLSsKLSsJaWYgKCFob2xkX3ByaW1hcnkpIHsKLSsJCTsKLSsJfSBlbHNlIGlmIChYdE93blNlbGVjdGlvbihkZXNrdG9wLCBYQV9QUklNQVJZLCB0LCBDb252ZXJ0U2VsZWN0aW9uLCBMb3NlU2VsZWN0aW9uLCBOVUxMKSkgewotKwkJUHJpbWFyeVNlbGVjdGlvbk93bmVyID0gVHJ1ZTsKLSsJCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgIk93biBQUklNQVJZXG4iKTsKLSsJfQotKwlpZiAoIWhvbGRfY2xpcGJvYXJkIHx8IGNsaXBib2FyZF9hdG9tID09IE5vbmUpIHsKLSsJCTsKLSsJfSBlbHNlIGlmIChYdE93blNlbGVjdGlvbihkZXNrdG9wLCBjbGlwYm9hcmRfYXRvbSwgdCwgQ29udmVydFNlbGVjdGlvbiwgTG9zZVNlbGVjdGlvbiwgTlVMTCkpIHsKLSsJCUNsaXBib2FyZFNlbGVjdGlvbk93bmVyID0gVHJ1ZTsKLSsJCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgIk93biBDTElQQk9BUkRcbiIpOwotKwl9Ci0rCWlmICh3IHx8IGV2ZW50IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotIH0KLSAKLSAKLUBAIC0yOTMsMzcgKzM0NiwzNiBAQAotIAkJIFh0UG9pbnRlciogdmFsdWUsIHVuc2lnbmVkIGxvbmcqIGxlbmd0aCwgaW50KiBmb3JtYXQpCi0gewotIAotLSAgaWYgKCp0YXJnZXQgPT0gWEFfU1RSSU5HICYmIHNlcnZlckN1dFRleHQgIT0gTlVMTCkgewotLSAgICAqdHlwZSA9IFhBX1NUUklORzsKLS0gICAgKmxlbmd0aCA9IHN0cmxlbihzZXJ2ZXJDdXRUZXh0KTsKLS0gICAgKnZhbHVlID0gKFh0UG9pbnRlcilYdE1hbGxvYygqbGVuZ3RoKTsKLS0gICAgbWVtY3B5KChjaGFyKikqdmFsdWUsIHNlcnZlckN1dFRleHQsICpsZW5ndGgpOwotLSAgICAqZm9ybWF0ID0gODsKLS0gICAgcmV0dXJuIFRydWU7Ci0tICB9Ci0rCWlmICgqdGFyZ2V0ID09IFhBX1NUUklORyAmJiBzZXJ2ZXJDdXRUZXh0ICE9IE5VTEwpIHsKLSsJCSp0eXBlID0gWEFfU1RSSU5HOwotKwkJKmxlbmd0aCA9IHN0cmxlbihzZXJ2ZXJDdXRUZXh0KTsKLSsJCSp2YWx1ZSA9IChYdFBvaW50ZXIpWHRNYWxsb2MoKmxlbmd0aCk7Ci0rCQltZW1jcHkoKGNoYXIqKSp2YWx1ZSwgc2VydmVyQ3V0VGV4dCwgKmxlbmd0aCk7Ci0rCQkqZm9ybWF0ID0gODsKLSsJCXJldHVybiBUcnVlOwotKwl9Ci0gCi0tICBpZiAoWG11Q29udmVydFN0YW5kYXJkU2VsZWN0aW9uKHcsIEN1cnJlbnRUaW1lLCBzZWxlY3Rpb24sIHRhcmdldCwgdHlwZSwKLSsJaWYgKFhtdUNvbnZlcnRTdGFuZGFyZFNlbGVjdGlvbih3LCBDdXJyZW50VGltZSwgc2VsZWN0aW9uLCB0YXJnZXQsIHR5cGUsCi0gCQkJCSAgKFhQb2ludGVyKil2YWx1ZSwgbGVuZ3RoLCBmb3JtYXQpKSB7Ci0tICAgIGlmICgqdGFyZ2V0ID09IFhJbnRlcm5BdG9tKGRweSwgIlRBUkdFVFMiLCBGYWxzZSkpIHsKLS0gICAgICAvKiBhZGQgU1RSSU5HIHRvIGxpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cyAqLwotLSAgICAgIEF0b20qIHRhcmdldFA7Ci0tICAgICAgQXRvbSogc3RkX3RhcmdldHMgPSAoQXRvbSopKnZhbHVlOwotLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RkX2xlbmd0aCA9ICpsZW5ndGg7Ci0tCi0tICAgICAgKmxlbmd0aCA9IHN0ZF9sZW5ndGggKyAxOwotLSAgICAgICp2YWx1ZSA9IChYdFBvaW50ZXIpWHRNYWxsb2Moc2l6ZW9mKEF0b20pKigqbGVuZ3RoKSk7Ci0tICAgICAgdGFyZ2V0UCA9ICooQXRvbSoqKXZhbHVlOwotLSAgICAgICp0YXJnZXRQKysgPSBYQV9TVFJJTkc7Ci0tICAgICAgbWVtbW92ZSgoY2hhciopdGFyZ2V0UCwgKGNoYXIqKXN0ZF90YXJnZXRzLCBzaXplb2YoQXRvbSkqc3RkX2xlbmd0aCk7Ci0tICAgICAgWHRGcmVlKChjaGFyKilzdGRfdGFyZ2V0cyk7Ci0tICAgICAgKnR5cGUgPSBYQV9BVE9NOwotLSAgICAgICpmb3JtYXQgPSAzMjsKLS0gICAgICByZXR1cm4gVHJ1ZTsKLS0gICAgfQotLQotLSAgICByZXR1cm4gVHJ1ZTsKLS0gIH0KLS0gIHJldHVybiBGYWxzZTsKLSsJCWlmICgqdGFyZ2V0ID09IFhJbnRlcm5BdG9tKGRweSwgIlRBUkdFVFMiLCBGYWxzZSkpIHsKLSsJCQkvKiBhZGQgU1RSSU5HIHRvIGxpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cyAqLwotKwkJCUF0b20qIHRhcmdldFA7Ci0rCQkJQXRvbSogc3RkX3RhcmdldHMgPSAoQXRvbSopKnZhbHVlOwotKwkJCXVuc2lnbmVkIGxvbmcgc3RkX2xlbmd0aCA9ICpsZW5ndGg7Ci0rCi0rCQkJKmxlbmd0aCA9IHN0ZF9sZW5ndGggKyAxOwotKwkJCSp2YWx1ZSA9IChYdFBvaW50ZXIpWHRNYWxsb2Moc2l6ZW9mKEF0b20pKigqbGVuZ3RoKSk7Ci0rCQkJdGFyZ2V0UCA9ICooQXRvbSoqKXZhbHVlOwotKwkJCSp0YXJnZXRQKysgPSBYQV9TVFJJTkc7Ci0rCQkJbWVtbW92ZSgoY2hhciopdGFyZ2V0UCwgKGNoYXIqKXN0ZF90YXJnZXRzLCBzaXplb2YoQXRvbSkqc3RkX2xlbmd0aCk7Ci0rCQkJWHRGcmVlKChjaGFyKilzdGRfdGFyZ2V0cyk7Ci0rCQkJKnR5cGUgPSBYQV9BVE9NOwotKwkJCSpmb3JtYXQgPSAzMjsKLSsJCQlyZXR1cm4gVHJ1ZTsKLSsJCX0KLSsJCXJldHVybiBUcnVlOwotKwl9Ci0rCXJldHVybiBGYWxzZTsKLSB9Ci0gCi0gCi1AQCAtMzMyLDcgKzM4NCwxMyBAQAotICAqLwotIAotIHN0YXRpYyB2b2lkCi0tTG9zZVNlbGVjdGlvbihXaWRnZXQgdywgQXRvbSAqc2VsZWN0aW9uKQotLXsKLS0gIGlBbVNlbGVjdGlvbk93bmVyID0gRmFsc2U7Ci0rTG9zZVNlbGVjdGlvbihXaWRnZXQgdywgQXRvbSAqc2VsZWN0aW9uKSB7Ci0rCWlmICgqc2VsZWN0aW9uID09IFhBX1BSSU1BUlkpIHsKLSsJCWlmIChkYmdfc2VsKSBmcHJpbnRmKHN0ZGVyciwgImxvc3QgUFJJTUFSWVxuIik7Ci0rICAJCVByaW1hcnlTZWxlY3Rpb25Pd25lciA9IEZhbHNlOwotKwl9IGVsc2UgaWYgKGNsaXBib2FyZF9hdG9tICE9IE5vbmUgJiYgKnNlbGVjdGlvbiA9PSBjbGlwYm9hcmRfYXRvbSkgewotKwkJaWYgKGRiZ19zZWwpIGZwcmludGYoc3RkZXJyLCAibG9zdCBDTElQQk9BUkRcbiIpOwotKyAgCQlDbGlwYm9hcmRTZWxlY3Rpb25Pd25lciA9IEZhbHNlOwotKwl9Ci0rCWlmICh3KSB7fQotIH0KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3NobS5jIHZuY191bml4c3JjL3ZuY3ZpZXdlci9zaG0uYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3NobS5jCTIwMDAtMDYtMTEgMDg6MDA6NTMuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3NobS5jCTIwMTAtMDItMjUgMjM6NDA6NTguMDAwMDAwMDAwIC0wNTAwCi1AQCAtMzAsNzEgKzMwLDExMyBAQAotIHN0YXRpYyBCb29sIGNhdWdodFNobUVycm9yID0gRmFsc2U7Ci0gc3RhdGljIEJvb2wgbmVlZFNobUNsZWFudXAgPSBGYWxzZTsKLSAKLS12b2lkCi0tU2htQ2xlYW51cCgpCi0tewotLSAgZnByaW50ZihzdGRlcnIsIlNobUNsZWFudXAgY2FsbGVkXG4iKTsKLS0gIGlmIChuZWVkU2htQ2xlYW51cCkgewotLSAgICBzaG1kdChzaG1pbmZvLnNobWFkZHIpOwotLSAgICBzaG1jdGwoc2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotLSAgICBuZWVkU2htQ2xlYW51cCA9IEZhbHNlOwotLSAgfQotK3N0YXRpYyBpbnQgU2htQ3JlYXRpb25YRXJyb3JIYW5kbGVyKERpc3BsYXkgKmRweSwgWEVycm9yRXZlbnQgKmVycm9yKSB7Ci0rCWNhdWdodFNobUVycm9yID0gVHJ1ZTsKLSsJaWYgKGRweSB8fCBlcnJvcikge30KLSsJcmV0dXJuIDA7Ci0gfQotIAotLXN0YXRpYyBpbnQKLS1TaG1DcmVhdGlvblhFcnJvckhhbmRsZXIoRGlzcGxheSAqZHB5LCBYRXJyb3JFdmVudCAqZXJyb3IpCi0tewotLSAgY2F1Z2h0U2htRXJyb3IgPSBUcnVlOwotLSAgcmV0dXJuIDA7Ci0rdm9pZCBTaG1EZXRhY2goKSB7Ci0rCWlmIChuZWVkU2htQ2xlYW51cCkgewotKwkJWEVycm9ySGFuZGxlciBvbGRYRXJyb3JIYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihTaG1DcmVhdGlvblhFcnJvckhhbmRsZXIpOwotKwkJZnByaW50ZihzdGRlcnIsIlNobURldGFjaCBjYWxsZWQuXG4iKTsKLSsJCVhTaG1EZXRhY2goZHB5LCAmc2htaW5mbyk7Ci0rCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCVhTZXRFcnJvckhhbmRsZXIob2xkWEVycm9ySGFuZGxlcik7Ci0rCX0KLSB9Ci0gCi0tWEltYWdlICoKLS1DcmVhdGVTaG1JbWFnZSgpCi0tewotLSAgWEltYWdlICppbWFnZTsKLS0gIFhFcnJvckhhbmRsZXIgb2xkWEVycm9ySGFuZGxlcjsKLS0KLS0gIGlmICghWFNobVF1ZXJ5RXh0ZW5zaW9uKGRweSkpCi0tICAgIHJldHVybiBOVUxMOwotLQotLSAgaW1hZ2UgPSBYU2htQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIHZpc2RlcHRoLCBaUGl4bWFwLCBOVUxMLCAmc2htaW5mbywKLS0JCQkgIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0KTsKLS0gIGlmICghaW1hZ2UpIHJldHVybiBOVUxMOwotLQotLSAgc2htaW5mby5zaG1pZCA9IHNobWdldChJUENfUFJJVkFURSwKLS0JCQkgaW1hZ2UtPmJ5dGVzX3Blcl9saW5lICogaW1hZ2UtPmhlaWdodCwKLS0JCQkgSVBDX0NSRUFUfDA3NzcpOwotK3ZvaWQgU2htQ2xlYW51cCgpIHsKLSsJaWYgKG5lZWRTaG1DbGVhbnVwKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwiU2htQ2xlYW51cCBjYWxsZWQuXG4iKTsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJc2htZHQoc2htaW5mby5zaG1hZGRyKTsKLSsJCXNobWN0bChzaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7Ci0gCi0tICBpZiAoc2htaW5mby5zaG1pZCA9PSAtMSkgewotLSAgICBYRGVzdHJveUltYWdlKGltYWdlKTsKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICB9Ci0tCi0tICBzaG1pbmZvLnNobWFkZHIgPSBpbWFnZS0+ZGF0YSA9IHNobWF0KHNobWluZm8uc2htaWQsIDAsIDApOwotLQotLSAgaWYgKHNobWluZm8uc2htYWRkciA9PSAoY2hhciAqKS0xKSB7Ci0tICAgIFhEZXN0cm95SW1hZ2UoaW1hZ2UpOwotLSAgICBzaG1jdGwoc2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotLSAgICByZXR1cm4gTlVMTDsKLS0gIH0KLSsJCW5lZWRTaG1DbGVhbnVwID0gRmFsc2U7Ci0rCX0KLSt9Ci0gCi0tICBzaG1pbmZvLnJlYWRPbmx5ID0gVHJ1ZTsKLStCb29sIFVzaW5nU2htKCkgewotKwlyZXR1cm4gbmVlZFNobUNsZWFudXA7Ci0rfQotIAotLSAgb2xkWEVycm9ySGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoU2htQ3JlYXRpb25YRXJyb3JIYW5kbGVyKTsKLS0gIFhTaG1BdHRhY2goZHB5LCAmc2htaW5mbyk7Ci0tICBYU3luYyhkcHksIEZhbHNlKTsKLS0gIFhTZXRFcnJvckhhbmRsZXIob2xkWEVycm9ySGFuZGxlcik7Ci0raW50IHNjYWxlX3JvdW5kKGludCBsZW4sIGRvdWJsZSBmYWMpOwotK2V4dGVybiBpbnQgc2NhbGVfeCwgc2NhbGVfeTsKLStleHRlcm4gZG91YmxlIHNjYWxlX2ZhY3Rvcl94LCBzY2FsZV9mYWN0b3JfeTsKLSAKLS0gIGlmIChjYXVnaHRTaG1FcnJvcikgewotLSAgICBYRGVzdHJveUltYWdlKGltYWdlKTsKLS0gICAgc2htZHQoc2htaW5mby5zaG1hZGRyKTsKLS0gICAgc2htY3RsKHNobWluZm8uc2htaWQsIElQQ19STUlELCAwKTsKLS0gICAgcmV0dXJuIE5VTEw7Ci0tICB9Ci0rWEltYWdlICoKLStDcmVhdGVTaG1JbWFnZShpbnQgZG9feWNyb3ApCi0rewotKwlYSW1hZ2UgKmltYWdlOwotKwlYRXJyb3JIYW5kbGVyIG9sZFhFcnJvckhhbmRsZXI7Ci0rCWludCB5bWF4ID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCWludCB4bWF4ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsKLSsJaWYgKCFYU2htUXVlcnlFeHRlbnNpb24oZHB5KSkgewotKwkJcmV0dXJuIE5VTEw7Ci0rCX0KLSsJaWYgKCFhcHBEYXRhLnVzZVNobSkgewotKwkJcmV0dXJuIE5VTEw7Ci0rCX0KLSsJaWYgKGRvX3ljcm9wID09IC0xKSB7Ci0rCQkvKiBrbHVkZ2UgdG8gdGVzdCBmb3Igc2htIHByZXNjZW5jZSAqLwotKwkJcmV0dXJuIChYSW1hZ2UgKikgMHgxOwotKwl9Ci0rCi0rCWlmIChkb195Y3JvcCkgewotKwkJeW1heCA9IGFwcERhdGEueUNyb3A7Ci0rCX0KLSsKLSsJaWYgKHNjYWxlX3ggPiAwKSB7Ci0rCQl4bWF4ID0gc2NhbGVfcm91bmQoeG1heCwgc2NhbGVfZmFjdG9yX3gpOwotKwkJeW1heCA9IHNjYWxlX3JvdW5kKHltYXgsIHNjYWxlX2ZhY3Rvcl95KTsKLSsJfQotKwotKwlpbWFnZSA9IFhTaG1DcmVhdGVJbWFnZShkcHksIHZpcywgdmlzZGVwdGgsIFpQaXhtYXAsIE5VTEwsICZzaG1pbmZvLCB4bWF4LCB5bWF4KTsKLSsJaWYgKCFpbWFnZSkgewotKwkJcmV0dXJuIE5VTEw7Ci0rCX0KLSsKLSsJc2htaW5mby5zaG1pZCA9IHNobWdldChJUENfUFJJVkFURSwgaW1hZ2UtPmJ5dGVzX3Blcl9saW5lICogaW1hZ2UtPmhlaWdodCwgSVBDX0NSRUFUfDA3NzcpOwotKwotKwlpZiAoc2htaW5mby5zaG1pZCA9PSAtMSkgewotKwkJWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0rCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJDcmVhdGVTaG1JbWFnZTogZGVzdHJveWVkICdpbWFnZScgKDEpXG4iKTsKLSsJCXJldHVybiBOVUxMOwotKwl9Ci0rCi0rCXNobWluZm8uc2htYWRkciA9IGltYWdlLT5kYXRhID0gc2htYXQoc2htaW5mby5zaG1pZCwgMCwgMCk7Ci0rCi0rCWlmIChzaG1pbmZvLnNobWFkZHIgPT0gKGNoYXIgKiktMSkgewotKwkJWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0rI2lmIDAKLSsJCWZwcmludGYoc3RkZXJyLCAiQ3JlYXRlU2htSW1hZ2U6IGRlc3Ryb3llZCAnaW1hZ2UnICgyKVxuIik7Ci0rI2VuZGlmCi0rCQlzaG1jdGwoc2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotKwkJcmV0dXJuIE5VTEw7Ci0rCX0KLSsKLSsJc2htaW5mby5yZWFkT25seSA9IFRydWU7Ci0rCi0rCW9sZFhFcnJvckhhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKFNobUNyZWF0aW9uWEVycm9ySGFuZGxlcik7Ci0rCVhTaG1BdHRhY2goZHB5LCAmc2htaW5mbyk7Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotKwlYU2V0RXJyb3JIYW5kbGVyKG9sZFhFcnJvckhhbmRsZXIpOwotKwotKwlpZiAoY2F1Z2h0U2htRXJyb3IpIHsKLSsJCVhEZXN0cm95SW1hZ2UoaW1hZ2UpOwotKyNpZiAwCi0rCQlmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVNobUltYWdlOiBkZXN0cm95ZWQgJ2ltYWdlJyAoMylcbiIpOwotKyNlbmRpZgotKwkJc2htZHQoc2htaW5mby5zaG1hZGRyKTsKLSsJCXNobWN0bChzaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7Ci0rCQlyZXR1cm4gTlVMTDsKLSsJfQotIAotLSAgbmVlZFNobUNsZWFudXAgPSBUcnVlOwotKwluZWVkU2htQ2xlYW51cCA9IFRydWU7Ci0gCi0tICBmcHJpbnRmKHN0ZGVyciwiVXNpbmcgc2hhcmVkIG1lbW9yeSBQdXRJbWFnZVxuIik7Ci0rCWZwcmludGYoc3RkZXJyLCJVc2luZyBzaGFyZWQgbWVtb3J5IChQdXRJbWFnZSB5Y3JvcD0lZCwgU2l6ZSAlZHglZClcbiIsIGRvX3ljcm9wLCB4bWF4LCB5bWF4KTsKLSAKLS0gIHJldHVybiBpbWFnZTsKLSsJcmV0dXJuIGltYWdlOwotIH0KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3NtYWtlIHZuY191bml4c3JjL3ZuY3ZpZXdlci9zbWFrZQotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3NtYWtlCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3NtYWtlCTIwMDctMDItMTkgMTI6Mjg6MDUuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMCwwICsxLDExIEBACi0rIyEvYmluL3NoCi0rCi0rUEFUSD1gcHdkYC8uLi8uLjovdXNyL3Nmdy9iaW46L3Vzci9jY3MvYmluOiRQQVRICi0rZXhwb3J0IFBBVEgKLStpZiBbICJYJDEiICE9ICJYIiBdOyB0aGVuCi0rCSIkQCIKLStlbHNlCi0rCW1ha2UKLSsJc3RyaXAgdm5jdmlld2VyCi0rCWxzIC1sIHZuY3ZpZXdlcgotK2ZpCi1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9zb2NrZXRzLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3NvY2tldHMuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3NvY2tldHMuYwkyMDAxLTAxLTE0IDIyOjU0OjE4LjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9zb2NrZXRzLmMJMjAxMC0wNC0xOCAxMTo0MTowNy4wMDAwMDAwMDAgLTA0MDAKLUBAIC0yMiwxNyArMjIsMzEgQEAKLSAgKi8KLSAKLSAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0rI2luY2x1ZGUgPHRpbWUuaD4KLSAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0gI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0gI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotKyNpbmNsdWRlIDxzeXMvdW4uaD4KLSAjaW5jbHVkZSA8bmV0ZGIuaD4KLSAjaW5jbHVkZSA8ZmNudGwuaD4KLSAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gI2luY2x1ZGUgPHZuY3ZpZXdlci5oPgotIAotKyNpZm5kZWYgU09MX0lQVjYKLSsjaWZkZWYgIElQUFJPVE9fSVBWNgotKyNkZWZpbmUgU09MX0lQVjYgSVBQUk9UT19JUFY2Ci0rI2VuZGlmCi0rI2VuZGlmCi0rCi0rLyogU29sYXJpcyAoc3lzdj8pIG5lZWRzIElOQUREUl9OT05FICovCi0rI2lmbmRlZiBJTkFERFJfTk9ORQotKyNkZWZpbmUgSU5BRERSX05PTkUgKChpbl9hZGRyX3QpIDB4ZmZmZmZmZmYpCi0rI2VuZGlmCi0rCi0gdm9pZCBQcmludEluSGV4KGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0rZXh0ZXJuIHZvaWQgcHJpbnRDaGF0KGNoYXIgKiwgQm9vbCk7Ci0gCi0gQm9vbCBlcnJvck1lc3NhZ2VPblJlYWRGYWlsdXJlID0gVHJ1ZTsKLSAKLUBAIC01NiwzMSArNzAsMzk2IEBACi0gICovCi0gCi0gc3RhdGljIEJvb2wgcmZic29ja1JlYWR5ID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgeGZyc29ja1JlYWR5ID0gRmFsc2U7Ci0rc3RhdGljIFh0SW5wdXRJZCByZmJzb2NrSWQgPSAwOwotK3N0YXRpYyBYdElucHV0SWQgeGZyc29ja0lkID0gMDsKLStzdGF0aWMgaW50IGRvX3JmYnNvY2tJZCA9IDA7Ci0rc3RhdGljIGludCBkb194ZnJzb2NrSWQgPSAwOwotKwotIHN0YXRpYyB2b2lkCi0gcmZic29ja1JlYWR5Q2FsbGJhY2soWHRQb2ludGVyIGNsaWVudERhdGEsIGludCAqZmQsIFh0SW5wdXRJZCAqaWQpCi0gewotLSAgcmZic29ja1JlYWR5ID0gVHJ1ZTsKLS0gIFh0UmVtb3ZlSW5wdXQoKmlkKTsKLSsJcmZic29ja1JlYWR5ID0gVHJ1ZTsKLSsjaWYgMAotKwlYdFJlbW92ZUlucHV0KCppZCk7Ci0rI2VuZGlmCi0rCVh0UmVtb3ZlSW5wdXQocmZic29ja0lkKTsKLSsJaWYgKGRvX3hmcnNvY2tJZCkgewotKwkJWHRSZW1vdmVJbnB1dCh4ZnJzb2NrSWQpOwotKwl9Ci0rCWlmIChjbGllbnREYXRhIHx8IGZkIHx8IGlkKSB7fQotIH0KLSAKLSBzdGF0aWMgdm9pZAotLVByb2Nlc3NYdEV2ZW50cygpCi0reGZyc29ja1JlYWR5Q2FsbGJhY2soWHRQb2ludGVyIGNsaWVudERhdGEsIGludCAqZmQsIFh0SW5wdXRJZCAqaWQpCi0gewotLSAgcmZic29ja1JlYWR5ID0gRmFsc2U7Ci0tICBYdEFwcEFkZElucHV0KGFwcENvbnRleHQsIHJmYnNvY2ssIChYdFBvaW50ZXIpWHRJbnB1dFJlYWRNYXNrLAotLQkJcmZic29ja1JlYWR5Q2FsbGJhY2ssIE5VTEwpOwotLSAgd2hpbGUgKCFyZmJzb2NrUmVhZHkpIHsKLS0gICAgWHRBcHBQcm9jZXNzRXZlbnQoYXBwQ29udGV4dCwgWHRJTUFsbCk7Ci0tICB9Ci0rCXhmcnNvY2tSZWFkeSA9IFRydWU7Ci0rCVh0UmVtb3ZlSW5wdXQoeGZyc29ja0lkKTsKLSsJaWYgKGRvX3JmYnNvY2tJZCkgewotKwkJWHRSZW1vdmVJbnB1dChyZmJzb2NrSWQpOwotKwl9Ci0rCWlmIChjbGllbnREYXRhIHx8IGZkIHx8IGlkKSB7fQotK30KLSsKLSsKLStleHRlcm4gaW50IHNraXBfWHRVcGRhdGU7Ci0rZXh0ZXJuIGludCBza2lwX1h0VXBkYXRlQWxsOwotK2V4dGVybiBpbnQgZmlsZXhmZXJfc29jaywgZmlsZXhmZXJfbGlzdGVuOwotK2V4dGVybiB0aW1lX3Qgc3RhcnRfbGlzdGVuOwotK2V4dGVybiB2b2lkIENoZWNrVGV4dElucHV0KHZvaWQpOwotK2V4dGVybiB0aW1lX3QgbGFzdF9maWxleGZlcjsKLSsKLStzdGF0aWMgY2hhciBmeGZlcls2NTUzNl07Ci0raW50IGZ4ZmVyX3NpemUgPSA2NTUzNjsKLSsKLStpbnQgcmZic29ja19pc19yZWFkeSh2b2lkKSB7Ci0rCWZkX3NldCBmZHM7Ci0rCXN0cnVjdCB0aW1ldmFsIHR2OwotKwotKwlpZiAocmZic29jayA8IDApICB7Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwlGRF9aRVJPKCZmZHMpOwotKwlGRF9TRVQocmZic29jaywmZmRzKTsKLSsJdHYudHZfc2VjID0gMDsKLSsJdHYudHZfdXNlYyA9IDA7Ci0rCWlmIChzZWxlY3QocmZic29jaysxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgewotKwkJaWYgKEZEX0lTU0VUKHJmYnNvY2ssICZmZHMpKSB7Ci0rCQkJcmV0dXJuIDE7Ci0rCQl9Ci0rCX0KLSsJcmV0dXJuIDA7Ci0rfQotKwotK3RpbWVfdCBmaWxleGZlcl9zdGFydCA9IDA7Ci0rCi0rdm9pZCBDaGVja0ZpbGVYZmVyKCkgewotKwlmZF9zZXQgZmRzOwotKwlzdHJ1Y3QgdGltZXZhbCB0djsKLSsJaW50IGksIGljbnQgPSAwLCBpZ290ID0gMCwgYnl0ZXMwID0gMCwgYnl0ZXMgPSAwLCBncmFjZSA9IDAsIG4sIGxpc3QgPSAwOwotKwlpbnQgZGIgPSAwOwotKwotKwlpZiAoIWFwcERhdGEuZmlsZUFjdGl2ZSB8fCAoZmlsZXhmZXJfc29jayA8IDAgJiYgZmlsZXhmZXJfbGlzdGVuIDwgMCkpIHsKLSsJCXJldHVybjsKLSsJfQotKwotKwlpZiAoZmlsZXhmZXJfbGlzdGVuID49IDAgJiYgdGltZShOVUxMKSA+IHN0YXJ0X2xpc3RlbiArIDMwKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgImZpbGV4ZmVyIGNsb3NpbmcgYWdpbmcgbGlzdGVuIHNvY2tldC5cbiIpOwotKwkJY2xvc2UoZmlsZXhmZXJfbGlzdGVuKTsKLSsJCWZpbGV4ZmVyX2xpc3RlbiA9IC0xOwotKwkJcmV0dXJuOwotKwl9Ci0raWYgKDApIGZwcmludGYoc3RkZXJyLCAiSW4gIENoZWNrRmlsZVhmZXJcbiIpOwotKwotKwlpZiAoZmlsZXhmZXJfbGlzdGVuID49MCkgewotKwkJbiA9IGZpbGV4ZmVyX2xpc3RlbjsKLSsJCWxpc3QgPSAxOwotKwl9IGVsc2UgewotKwkJbiA9IGZpbGV4ZmVyX3NvY2s7Ci0rCX0KLSsKLSsJd2hpbGUgKDEpIHsKLSsJCWljbnQrKzsKLSsJCUZEX1pFUk8oJmZkcyk7Ci0rCQlGRF9TRVQobiwmZmRzKTsKLSsJCXR2LnR2X3NlYyA9IDA7Ci0rCQl0di50dl91c2VjID0gMDsKLSsJCWlmIChzZWxlY3QobisxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgewotKwkJICAgIGlmIChGRF9JU1NFVChuLCAmZmRzKSkgewotKwkJCWlmIChsaXN0KSB7Ci0rCQkJCWlmIChmaWxleGZlcl9zb2NrID49IDApIHsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXIgY2xvc2Ugc3RhbGUoPykgZmlsZXhmZXJfc29jay5cbiIpOwotKwkJCQkJY2xvc2UoZmlsZXhmZXJfc29jayk7Ci0rCQkJCQlmaWxleGZlcl9zb2NrID0gLTE7Ci0rCQkJCX0KLSsJCQkJZmlsZXhmZXJfc29jayA9IEFjY2VwdFRjcENvbm5lY3Rpb24oZmlsZXhmZXJfbGlzdGVuKTsKLSsJCQkJaWYgKGZpbGV4ZmVyX3NvY2sgPj0gMCkgewotKwkJCQkJZnByaW50ZihzdGRlcnIsICJmaWxleGZlciBhY2NlcHQgT0suXG4iKTsKLSsJCQkJCWNsb3NlKGZpbGV4ZmVyX2xpc3Rlbik7Ci0rCQkJCQlmaWxleGZlcl9saXN0ZW4gPSAtMTsKLSsJCQkJCWZpbGV4ZmVyX3N0YXJ0ID0gbGFzdF9maWxleGZlciA9IHRpbWUoTlVMTCk7Ci0rCQkJCX0gZWxzZSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgImZpbGV4ZmVyIGFjY2VwdCBmYWlsZWQuXG4iKTsKLSsJCQkJfQotKwkJCQlicmVhazsKLSsJCQl9IGVsc2UgewotKwkJCQlzc2l6ZV90IHJuOwotKwkJCQl1bnNpZ25lZCBjaGFyIGhkclsxMl07Ci0rCQkJCXVuc2lnbmVkIGludCBsZW47Ci0rCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ0cnkgcmVhZCBmaWxleGZlci4uLlxuIik7Ci0rCQkJCWlmIChoZHIgfHwgbGVuIHx8IGkpIHt9Ci0rI2lmIDEKLSsJCQkJcm4gPSByZWFkKG4sIGZ4ZmVyLCAxKjgxOTIpOwotK2lmIChkYikgewotKwlpbnQgaTsKLSsJZnByaW50ZihzdGRlcnIsICJDRlggSERSOiIpOwotKwlmb3IgKGk9MDsgaSA8IDEyOyBpKyspIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiICVkIiwgKGludCkgZnhmZXJbaV0pOwotKwl9Ci0rCWZwcmludGYoc3RkZXJyLCAiID9cbiIpOwotK30KLSsJCQkJaWYgKDAgfHwgZGIpIGZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXIgcmVhZFslZF0gJWQuXG4iLCBpY250LCBybik7Ci0rCQkJCWlmIChybiA8IDApIHsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXIgYmFkIHJlYWQ6ICVkXG4iLCBlcnJubyk7Ci0rCQkJCQlicmVhazsKLSsJCQkJfSBlbHNlIGlmIChybiA9PSAwKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgImZpbGV4ZmVyIGdvbmUuXG4iKTsKLSsJCQkJCWNsb3NlKG4pOwotKwkJCQkJZmlsZXhmZXJfc29jayA9IC0xOwotKwkJCQkJbGFzdF9maWxleGZlciA9IHRpbWUoTlVMTCk7Ci0rI2lmIDAKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAibGFzdF9maWxleGZlci0yYTogJWRcbiIsIGxhc3RfZmlsZXhmZXIpOwotKyNlbmRpZgotKwkJCQkJYXBwRGF0YS5maWxlQWN0aXZlID0gRmFsc2U7Ci0rCQkJCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIDEsIDEsIEZhbHNlKTsKLSsJCQkJCXJldHVybjsKLSsJCQkJfSBlbHNlIGlmIChybiA+IDApIHsKLSsJCQkJCWlmIChkYiA+IDEpIHdyaXRlKDIsIGZ4ZmVyLCBybik7Ci0rCQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCQkJCWJ5dGVzICs9IHJuOwotKwkJCQkJbGFzdF9maWxleGZlciA9IHRpbWUoTlVMTCk7Ci0rI2lmIDAKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAibGFzdF9maWxleGZlci0yYjogJWRcbiIsIGxhc3RfZmlsZXhmZXIpOwotKyNlbmRpZgotKwotKwkJCQkJaWYgKDApIHsKLSsJCQkJCQkvKiBXRSBUUlkgVE8gRklYIFRISVMgSU4gVEhFIEpBVkEgTk9XICovCi0rCQkJCQkJaWYgKGFwcERhdGEudWx0cmFEU00pIHsKLSsJCQkJCQkJdW5zaWduZWQgY2hhciBtc2cgPSByZmJGaWxlVHJhbnNmZXI7Ci0rCQkJCQkJCXVuc2lnbmVkIGNoYXIgaGRjID0gKHVuc2lnbmVkIGNoYXIpIGZ4ZmVyWzBdOwotKwkJCQkJCQlpZiAobXNnID09IGhkYykgewotKwkJCQkJCQkJLyogY3Jvc3MgeW91ciBmaW5nZXJzLi4uICovCi0rCQkJCQkJCQlXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJm1zZywgMSk7Ci0rCQkJCQkJCX0KLSsJCQkJCQl9Ci0rCQkJCQl9Ci0rCQkJCQlpZiAoIVdyaXRlRXhhY3QocmZic29jaywgZnhmZXIsIHJuKSkgewotKwkJCQkJCXJldHVybjsKLSsJCQkJCX0KLSsJCQkJCWlnb3QgPSAxOwotKwkJCQl9Ci0rI2Vsc2UKLSsJCQkJLyogbm90IHdvcmtpbmcsIG5vdCBhbHdheXMgNyBtc2cgdHlwZS4JKi8KLSsJCQkJcm4gPSByZWFkKG4sIGhkciwgMTIpOwotKwkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXIgcmVhZCAlZC5cbiIsIHJuKTsKLSsJCQkJaWYgKHJuID09IDApIHsKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiZmlsZXhmZXIgZ29uZS5cbiIpOwotKwkJCQkJY2xvc2Uobik7Ci0rCQkJCQlmaWxleGZlcl9zb2NrID0gLTE7Ci0rCQkJCQlsYXN0X2ZpbGV4ZmVyID0gdGltZShOVUxMKTsKLSsJCQkJCXJldHVybjsKLSsJCQkJfQotKwkJCQlpZiAocm4gPT0gMTIpIHsKLSsJCQkJCWxlbiA9IChoZHJbOF0gPDwgMjQpIHwgKGhkcls5XSA8PCAxNikgfCAoaGRyWzEwXSA8PCA4KSB8IGhkclsxMV07Ci0rCQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAibj0lZCBsZW49JWRcbiIsIHJuLCBsZW4pOwotKwkJCQkJaWYgKGRiID4gMSkgd3JpdGUoMiwgaGRyLCBybik7Ci0rCQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSsJCQkJCVdyaXRlRXhhY3QocmZic29jaywgaGRyLCBybik7Ci0rCQkJCQlpZiAobGVuID4gMCkgewotKwkJCQkJCXJuID0gcmVhZChsZW4sIGZ4ZmVyLCBsZW4pOwotKwkJCQkJCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCBmeGZlciwgbGVuKSkgewotKwkJCQkJCQlsYXN0X2ZpbGV4ZmVyID0gdGltZShOVUxMKTsKLSsJCQkJCQkJcmV0dXJuOwotKwkJCQkJCX0KLSsJCQkJCQlpZiAoZGIgPiAxKSB3cml0ZSgyLCBmeGZlciwgbGVuKTsKLSsJCQkJCX0KLSsJCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJcbiIpOwotKwkJCQl9IGVsc2UgewotKwkJCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImJhZCBybjogJWRcbiIsIHJuKTsKLSsJCQkJfQotKwkJCQlpZ290ID0gMTsKLSsjZW5kaWYKLSsJCQl9Ci0rCQkgICAgfQotKwkJfSBlbHNlIHsKLSsJCQlpZiAoYnl0ZXMgPj0gODE5MikgewotKwkJCQlpbnQgb2sgPSAwOwotKwkJCQlpZiAoYnl0ZXMwID09IDApIHsKLSsJCQkJCW9rID0gMTsKLSsJCQkJfSBlbHNlIGlmIChieXRlcyA+PSBieXRlczAgKyAxMikgewotKwkJCQkJb2sgPSAxOwotKwkJCQl9IGVsc2UgaWYgKGdyYWNlIDwgMjApIHsKLSsJCQkJCW9rID0gMTsKLSsJCQkJfQotKwkJCQlpZiAob2spIHsKLSsJCQkJCWdyYWNlKys7Ci0rCQkJCQlieXRlczAgPSBieXRlczsKLSsjaWYgMAotKwkJCQkJZnByaW50ZihzdGRlcnIsICJncmFjZTogJWRcbiIsIGdyYWNlKTsKLSsJCQkJCS8qIGZvcmdvdCB0aGF0IHRoaXMgaXMgYWJvdXQuLi4gKi8KLSsjZW5kaWYKLSsJCQkJCXVzbGVlcCgxMCAqIDEwMDApOwotKwkJCQkJY29udGludWU7Ci0rCQkJCX0KLSsJCQl9Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsJaWYgKGlnb3QpIHsKLSsJCWxhc3RfZmlsZXhmZXIgPSB0aW1lKE5VTEwpOwotKyNpZiAwCi0rCQlmcHJpbnRmKHN0ZGVyciwgImxhc3RfZmlsZXhmZXItMmM6ICVkXG4iLCBsYXN0X2ZpbGV4ZmVyKTsKLSsjZW5kaWYKLSsJfQotKyNpZiAwCi0rZnByaW50ZihzdGRlcnIsICJPdXQgQ2hlY2tGaWxlWGZlclxuIik7Ci0rI2VuZGlmCi0rCXJldHVybjsKLSt9Ci0rCi0rc3RhdGljIHZvaWQgY2hlY2tfdGVybV9jaGF0KHZvaWQpIHsKLSsJZmRfc2V0IGZkczsKLSsJc3RydWN0IHRpbWV2YWwgdHY7Ci0rCWludCBpLCBpZ290ID0gLTEsIG4gPSBmaWxlbm8oc3RkaW4pOwotKwljaGFyIHN0cnNbMTAwXVs1MTJdOwotKwljaGFyIGJ1ZltyZmJUZXh0TWF4U2l6ZV07Ci0rCi0rCWZvciAoaT0wOyBpIDwgMTAwOyBpKyspIHsKLSsJCUZEX1pFUk8oJmZkcyk7Ci0rCQlGRF9TRVQobiwmZmRzKTsKLSsJCXR2LnR2X3NlYyA9IDA7Ci0rCQl0di50dl91c2VjID0gMDsKLSsJCWlmIChzZWxlY3QobisxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgewotKwkJCWlmIChGRF9JU1NFVChuLCAmZmRzKSkgewotKwkJCQlmZ2V0cyhzdHJzW2ldLCA1MTIsIHN0ZGluKTsKLSsJCQkJaWdvdCA9IGk7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwkJfSBlbHNlIHsKLSsJCQlicmVhazsKLSsJCX0KLSsJfQotKwlidWZbMF0gPSAnXDAnOwotKwlmb3IgKGk9MDsgaSA8PSBpZ290OyBpKyspIHsKLSsJCWlmIChzdHJsZW4oYnVmKSArIHN0cmxlbihzdHJzW2ldKSA8IHJmYlRleHRNYXhTaXplKSB7Ci0rCQkJc3RyY2F0KGJ1Ziwgc3Ryc1tpXSk7Ci0rCQl9IGVsc2UgewotKwkJCVNlbmRUZXh0Q2hhdChidWYpOwotKwkJCWJ1ZlswXSA9ICcwJzsKLSsJCX0KLSsJfQotKwlpZiAoYnVmWzBdICE9ICdcMCcpIHsKLSsJCVNlbmRUZXh0Q2hhdChidWYpOwotKwl9Ci0rCWlmIChpZ290ID49IDApIHByaW50Q2hhdCgiU2VuZDogIiwgRmFsc2UpOwotK30KLSsKLStzdGF0aWMgdGltZV90IHRpbWVfbWFyazsKLStleHRlcm4gaW50IGRlbGF5X2ZpbGV4ZmVyOwotKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgotKwotK2V4dGVybiBkb3VibGUgc3RhcnRfdGltZTsKLSsKLSt2b2lkIFByb2Nlc3NYdEV2ZW50cygpCi0rewotKwlpbnQgZGIgPSAwOwotKwlzdGF0aWMgaW50IGR5biA9IC0xOwotKwlzdGF0aWMgaW50IGNoYXRfd2FzX2FjdGl2ZSA9IDA7Ci0rCWludCBjaGVja19jaGF0ID0gMDsKLSsKLSsJaWYgKGR5biA8IDApIHsKLSsJCXN0cnVjdCBzdGF0IHNiOwotKwkJaWYgKGdldGVudigiVVNFUiIpICYmICFzdHJjbXAoZ2V0ZW52KCJVU0VSIiksICJydW5nZSIpKSB7Ci0rCQkJaWYgKHN0YXQoIi90bXAvbm9keW4iLCAmc2IpID09IDApIHsKLSsJCQkJcHV0ZW52KCJOT0ZURkJVUERBVEVTPTEiKTsKLSsJCQkJdW5saW5rKCIvdG1wL25vZHluIik7Ci0rCQkJfQotKwkJfQotKwkJaWYgKGdldGVudigiTk9GVEZCVVBEQVRFUyIpKSB7Ci0rCQkJZHluID0gMDsKLSsJCX0gZWxzZSB7Ci0rCQkJZHluID0gMTsKLSsJCX0KLSsJfQotKwotKyNpZiAwCi0rCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlByb2Nlc3NYdEV2ZW50czogJWQgICUuNGZcbiIsIHNraXBfWHRVcGRhdGVBbGwsIGRub3coKSAtIHN0YXJ0X3RpbWUpOwotKyNlbmRpZgotKwotKwlpZiAoc2tpcF9YdFVwZGF0ZUFsbCkgewotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCS8qIHRleHQgY2hhdCAqLwotKwlpZiAoYXBwRGF0YS5jaGF0QWN0aXZlICkgewotKwkJY2hlY2tfY2hhdCA9IDE7Ci0rCX0gZWxzZSBpZiAoY2hhdF93YXNfYWN0aXZlKSB7Ci0rCQlzdGF0aWMgZG91YmxlIGxhc3RfY2hlY2sgPSAwLjA7Ci0rCQlkb3VibGUgbm93ID0gZG5vdygpOwotKwkJaWYgKG5vdyA+IGxhc3RfY2hlY2sgKyAwLjc1KSB7Ci0rCQkJY2hlY2tfY2hhdCA9IDE7Ci0rCQkJbGFzdF9jaGVjayA9IG5vdzsKLSsJCX0KLSsJfQotKwlpZiAoY2hlY2tfY2hhdCkgewotKwkJaWYgKGFwcERhdGEuY2hhdEFjdGl2ZSkgewotKwkJCWNoYXRfd2FzX2FjdGl2ZSA9IDE7Ci0rCQl9Ci0rCQlpZiAoIWFwcERhdGEudGVybUNoYXQpIHsKLSsJCQlDaGVja1RleHRJbnB1dCgpOwotKwkJfSBlbHNlIHsKLSsJCQljaGVja190ZXJtX2NoYXQoKTsKLSsJCX0KLSsJfQotKwotKwlpZiAoc2tpcF9YdFVwZGF0ZSkgewotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCXJmYnNvY2tSZWFkeSA9IEZhbHNlOwotKwl4ZnJzb2NrUmVhZHkgPSBGYWxzZTsKLSsJZG9fcmZic29ja0lkID0gMTsKLSsJcmZic29ja0lkID0gWHRBcHBBZGRJbnB1dChhcHBDb250ZXh0LCByZmJzb2NrLCAoWHRQb2ludGVyKVh0SW5wdXRSZWFkTWFzaywKLSsJICAgIHJmYnNvY2tSZWFkeUNhbGxiYWNrLCBOVUxMKTsKLSsKLSsJZG9feGZyc29ja0lkID0gMDsKLSsJaWYgKGZpbGV4ZmVyX3NvY2sgPj0gMCkgewotKwkJZG9feGZyc29ja0lkID0gMTsKLSsJCXhmcnNvY2tJZCA9IFh0QXBwQWRkSW5wdXQoYXBwQ29udGV4dCwgZmlsZXhmZXJfc29jaywgKFh0UG9pbnRlcilYdElucHV0UmVhZE1hc2ssCi0rCQkgICAgeGZyc29ja1JlYWR5Q2FsbGJhY2ssIE5VTEwpOwotKwl9Ci0rCi0rCXRpbWVfbWFyayA9IHRpbWUoTlVMTCk7Ci0rCi0rCWlmIChhcHBEYXRhLmZpbGVBY3RpdmUpIHsKLSsJCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotKwkJaWYgKGZpcnN0KSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJQWFQ6IGR5bmFtaWMgZmIgdXBkYXRlcyBkdXJpbmcgZmlsZXhmZXI6ICVkXG4iLCBkeW4pOwotKwkJCWZpcnN0ID0gMDsKLSsJCX0KLSsJfQotKwotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiWHRBcHBBZGRJbnB1dDogIik7Ci0rCXdoaWxlICghcmZic29ja1JlYWR5ICYmICF4ZnJzb2NrUmVhZHkpIHsKLSsJCWludCB3ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCWludCBoID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiLiIpOwotKwkJaWYgKGR5biAmJiBmaWxleGZlcl9zb2NrID49IDAgJiYgdGltZShOVUxMKSA+IHRpbWVfbWFyayArIGRlbGF5X2ZpbGV4ZmVyKSB7Ci0rCQkJU2VuZEZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdCgwLCAwLCB3LCBoLCBGYWxzZSk7Ci0rCQl9Ci0rCQlYdEFwcFByb2Nlc3NFdmVudChhcHBDb250ZXh0LCBYdElNQWxsKTsKLSsJfQotKwlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiIGRvbmUuIHI6ICVkICB4OiAlZFxuIiwgcmZic29ja1JlYWR5LCB4ZnJzb2NrUmVhZHkpOwotKwotKwlpZiAoeGZyc29ja1JlYWR5KSB7Ci0rCQlDaGVja0ZpbGVYZmVyKCk7Ci0rCX0KLSB9Ci0gCi0gQm9vbAotIFJlYWRGcm9tUkZCU2VydmVyKGNoYXIgKm91dCwgdW5zaWduZWQgaW50IG4pCi0gewotKyNpZiAwCi0rCWRvdWJsZSBzdGFydCA9IGRub3coKSwgZG4gPSBuOwotKyNlbmRpZgotICAgaWYgKG4gPD0gYnVmZmVyZWQpIHsKLSAgICAgbWVtY3B5KG91dCwgYnVmb3V0cHRyLCBuKTsKLSAgICAgYnVmb3V0cHRyICs9IG47Ci0gICAgIGJ1ZmZlcmVkIC09IG47Ci0rI2lmIDAKLStmcHJpbnRmKHN0ZGVyciwgIlIwOiAlMDZkXG4iLCAoaW50KSBkbik7Ci0rI2VuZGlmCi0gICAgIHJldHVybiBUcnVlOwotICAgfQotIAotQEAgLTExOSw2ICs0OTgsOSBAQAotICAgICBtZW1jcHkob3V0LCBidWZvdXRwdHIsIG4pOwotICAgICBidWZvdXRwdHIgKz0gbjsKLSAgICAgYnVmZmVyZWQgLT0gbjsKLSsjaWYgMAotK2ZwcmludGYoc3RkZXJyLCAiUjE6ICUwNmQgJTA2ZCAlMTAuMmYgS0Ivc2VjXG4iLCAoaW50KSBkbiwgYnVmZmVyZWQrbiwgMWUtMyAqIChidWZmZXJlZCtuKS8oZG5vdygpIC0gc3RhcnQpKTsKLSsjZW5kaWYKLSAgICAgcmV0dXJuIFRydWU7Ci0gCi0gICB9IGVsc2UgewotQEAgLTE0NiwxMSArNTI4LDE2IEBACi0gICAgICAgbiAtPSBpOwotICAgICB9Ci0gCi0rI2lmIDAKLStmcHJpbnRmKHN0ZGVyciwgIlIyOiAlMDZkICUwNmQgJTEwLjJmIEtCL3NlY1xuIiwgKGludCkgZG4sIChpbnQpIGRuLCAxZS0zICogKGRuKS8oZG5vdygpIC0gc3RhcnQpKTsKLSsjZW5kaWYKLSAgICAgcmV0dXJuIFRydWU7Ci0gICB9Ci0gfQotIAotIAotK2ludCBjdXJyZW50TXNnID0gLTE7Ci0rCi0gLyoKLSAgKiBXcml0ZSBhbiBleGFjdCBudW1iZXIgb2YgYnl0ZXMsIGFuZCBkb24ndCByZXR1cm4gdW50aWwgeW91J3ZlIHNlbnQgdGhlbS4KLSAgKi8KLUBAIC0xNTgsODEgKzU0NSwzMjEgQEAKLSBCb29sCi0gV3JpdGVFeGFjdChpbnQgc29jaywgY2hhciAqYnVmLCBpbnQgbikKLSB7Ci0tICBmZF9zZXQgZmRzOwotLSAgaW50IGkgPSAwOwotLSAgaW50IGo7Ci0tCi0tICB3aGlsZSAoaSA8IG4pIHsKLS0gICAgaiA9IHdyaXRlKHNvY2ssIGJ1ZiArIGksIChuIC0gaSkpOwotLSAgICBpZiAoaiA8PSAwKSB7Ci0tICAgICAgaWYgKGogPCAwKSB7Ci0tCWlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pIHsKLS0JICBGRF9aRVJPKCZmZHMpOwotLQkgIEZEX1NFVChyZmJzb2NrLCZmZHMpOwotKwlmZF9zZXQgZmRzOwotKwlpbnQgaSA9IDA7Ci0rCWludCBqOwotKwotKwlpZiAoYXBwRGF0YS51bHRyYURTTSAmJiBjdXJyZW50TXNnID49IDApIHsKLSsJCS8qIHRoaXMgaXMgZm9yIGdvb2Z5IFVsdHJhVk5DIERTTSBzZW5kIFJGQiBtc2cgY2hhciB0d2ljZTogKi8KLSsJCXVuc2lnbmVkIGNoYXIgbXNnID0gKHVuc2lnbmVkIGNoYXIpIGN1cnJlbnRNc2c7Ci0rCQljdXJyZW50TXNnID0gLTE7Ci0rCQlpZiAoIVdyaXRlRXhhY3Qoc29jaywgKGNoYXIgKikmbXNnLCBzaXplb2YobXNnKSkpIHsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCX0KLSsJY3VycmVudE1zZyA9IC0xOwotIAotLQkgIGlmIChzZWxlY3QocmZic29jaysxLCBOVUxMLCAmZmRzLCBOVUxMLCBOVUxMKSA8PSAwKSB7Ci0tCSAgICBmcHJpbnRmKHN0ZGVycixwcm9ncmFtTmFtZSk7Ci0tCSAgICBwZXJyb3IoIjogc2VsZWN0Iik7Ci0tCSAgICByZXR1cm4gRmFsc2U7Ci0tCSAgfQotLQkgIGogPSAwOwotLQl9IGVsc2UgewotLQkgIGZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLS0JICBwZXJyb3IoIjogd3JpdGUiKTsKLS0JICByZXR1cm4gRmFsc2U7Ci0rCXdoaWxlIChpIDwgbikgewotKwkJaiA9IHdyaXRlKHNvY2ssIGJ1ZiArIGksIChuIC0gaSkpOwotKwkJaWYgKGogPD0gMCkgewotKwkJICAgIGlmIChqIDwgMCkgewotKwkJCWlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pIHsKLSsJCQkJRkRfWkVSTygmZmRzKTsKLSsJCQkJRkRfU0VUKHJmYnNvY2ssJmZkcyk7Ci0rCi0rCQkJCWlmIChzZWxlY3QocmZic29jaysxLCBOVUxMLCAmZmRzLCBOVUxMLCBOVUxMKSA8PSAwKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVycixwcm9ncmFtTmFtZSk7Ci0rCQkJCQlwZXJyb3IoIjogc2VsZWN0Iik7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsJCQkJaiA9IDA7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJZnByaW50ZihzdGRlcnIscHJvZ3JhbU5hbWUpOwotKwkJCQlwZXJyb3IoIjogd3JpdGUiKTsKLSsJCQkJcmV0dXJuIEZhbHNlOwotKwkJCX0KLSsJCSAgICB9IGVsc2UgewotKwkJCWZwcmludGYoc3RkZXJyLCIlczogd3JpdGUgZmFpbGVkXG4iLHByb2dyYW1OYW1lKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQkgICAgfQotKwkJfQotKwkJaSArPSBqOwotIAl9Ci0tICAgICAgfSBlbHNlIHsKLS0JZnByaW50ZihzdGRlcnIsIiVzOiB3cml0ZSBmYWlsZWRcbiIscHJvZ3JhbU5hbWUpOwotLQlyZXR1cm4gRmFsc2U7Ci0tICAgICAgfQotLSAgICB9Ci0tICAgIGkgKz0gajsKLS0gIH0KLS0gIHJldHVybiBUcnVlOwotKwlyZXR1cm4gVHJ1ZTsKLSB9Ci0gCi0raW50Ci0rQ29ubmVjdFRvVW5peFNvY2tldChjaGFyICpmaWxlKSB7Ci0rCWludCBzb2NrOwotKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKLSsJaW50IGk7Ci0rCi0rCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpOwotKwotKwlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotKwotKwlmb3IgKGk9MDsgaSA8IDEwODsgaSsrKSB7Ci0rCQlhZGRyLnN1bl9wYXRoW2ldID0gZmlsZVtpXTsKLSsJCWlmIChmaWxlW2ldID09ICdcMCcpIHsKLSsJCQlicmVhazsKLSsJCX0KLSsJfQotKwotKwlzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKLSsJaWYgKHNvY2sgPCAwKSB7Ci0rCQlmcHJpbnRmKHN0ZGVycixwcm9ncmFtTmFtZSk7Ci0rCQlwZXJyb3IoIjogQ29ubmVjdFRvVW5peFNvY2tldDogc29ja2V0Iik7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsJaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotKwkJZnByaW50ZihzdGRlcnIsIHByb2dyYW1OYW1lKTsKLSsJCXBlcnJvcigiOiBDb25uZWN0VG9Vbml4U29ja2V0OiBjb25uZWN0Iik7Ci0rCQljbG9zZShzb2NrKTsKLSsJCXJldHVybiAtMTsKLSsJfQotKwotKwlyZXR1cm4gc29jazsKLSt9Ci0rCi0rY2hhciAqaXB2Nl9nZXRpcGFkZHIoc3RydWN0IHNvY2thZGRyICpwYWRkciwgaW50IGFkZHJsZW4pIHsKLSsjaWYgZGVmaW5lZChBRl9JTkVUNikgJiYgZGVmaW5lZChOSV9OVU1FUklDSE9TVCkKLSsgICAgICAgIGNoYXIgbmFtZVsyMDBdOwotKwlpZiAoYXBwRGF0YS5ub2lwdjYpIHsKLSsgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotKyAgICAgICAgfQotKyAgICAgICAgaWYgKGdldG5hbWVpbmZvKHBhZGRyLCBhZGRybGVuLCBuYW1lLCBzaXplb2YobmFtZSksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSA9PSAwKSB7Ci0rICAgICAgICAgICAgICAgIHJldHVybiBzdHJkdXAobmFtZSk7Ci0rICAgICAgICB9Ci0rI2VuZGlmCi0rCWlmIChwYWRkciB8fCBhZGRybGVuKSB7fQotKyAgICAgICAgcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotK30KLSsKLStjaGFyICppcHY2X2dldG5hbWVpbmZvKHN0cnVjdCBzb2NrYWRkciAqcGFkZHIsIGludCBhZGRybGVuKSB7Ci0rI2lmIGRlZmluZWQoQUZfSU5FVDYpCi0rICAgICAgICBjaGFyIG5hbWVbMjAwXTsKLSsJaWYgKGFwcERhdGEubm9pcHY2KSB7Ci0rICAgICAgICAgICAgICAgIHJldHVybiBzdHJkdXAoInVua25vd24iKTsKLSsgICAgICAgIH0KLSsgICAgICAgIGlmIChnZXRuYW1laW5mbyhwYWRkciwgYWRkcmxlbiwgbmFtZSwgc2l6ZW9mKG5hbWUpLCBOVUxMLCAwLCAwKSA9PSAwKSB7Ci0rICAgICAgICAgICAgICAgIHJldHVybiBzdHJkdXAobmFtZSk7Ci0rICAgICAgICB9Ci0rI2VuZGlmCi0rCWlmIChwYWRkciB8fCBhZGRybGVuKSB7fQotKyAgICAgICAgcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotK30KLSsKLStpbnQgZG90dGVkX2lwKGNoYXIgKmhvc3QsIGludCBwYXJ0aWFsKSB7Ci0rCWludCBsZW4sIGRvdHMgPSAwOwotKwljaGFyICpwID0gaG9zdDsKLSsKLSsJaWYgKCFob3N0KSB7Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwotKwlpZiAoIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGhvc3RbMF0pKSB7Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwotKwlsZW4gPSBzdHJsZW4oaG9zdCk7Ci0rCWlmICghcGFydGlhbCAmJiAhaXNkaWdpdCgodW5zaWduZWQgY2hhcikgaG9zdFtsZW4tMV0pKSB7Ci0rCQlyZXR1cm4gMDsKLSsJfQotKwotKwl3aGlsZSAoKnAgIT0gJ1wwJykgewotKwkJaWYgKCpwID09ICcuJykgZG90cysrOwotKwkJaWYgKCpwID09ICcuJyB8fCBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAoKnApKSkgewotKwkJCXArKzsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsJCXJldHVybiAwOwotKwl9Ci0rCWlmICghcGFydGlhbCAmJiBkb3RzICE9IDMpIHsKLSsJCXJldHVybiAwOwotKwl9Ci0rCXJldHVybiAxOwotK30KLSAKLSAvKgotICAqIENvbm5lY3RUb1RjcEFkZHIgY29ubmVjdHMgdG8gdGhlIGdpdmVuIFRDUCBwb3J0LgotICAqLwotIAotLWludAotLUNvbm5lY3RUb1RjcEFkZHIodW5zaWduZWQgaW50IGhvc3QsIGludCBwb3J0KQotLXsKLS0gIGludCBzb2NrOwotLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0tICBpbnQgb25lID0gMTsKLS0KLS0gIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0tICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0tICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGhvc3Q7Ci0raW50IENvbm5lY3RUb1RjcEFkZHIoY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBwb3J0KSB7Ci0rCWludCBzb2NrID0gLTEsIG9uZSA9IDE7Ci0rCXVuc2lnbmVkIGludCBob3N0OwotKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSsKLSsJaWYgKGFwcERhdGEubm9pcHY0KSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgImlwdjQgaXMgZGlzYWJsZWQgdmlhIFZOQ1ZJRVdFUl9OT19JUFY0Ly1ub2lwdjQuXG4iKTsKLSsJCWdvdG8gdHJ5NjsKLSsJfQotIAotLSAgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0tICBpZiAoc29jayA8IDApIHsKLS0gICAgZnByaW50ZihzdGRlcnIscHJvZ3JhbU5hbWUpOwotLSAgICBwZXJyb3IoIjogQ29ubmVjdFRvVGNwQWRkcjogc29ja2V0Iik7Ci0tICAgIHJldHVybiAtMTsKLS0gIH0KLSsJaWYgKCFTdHJpbmdUb0lQQWRkcihob3N0bmFtZSwgJmhvc3QpKSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjb252ZXJ0ICclcycgdG8gaXB2NCBob3N0IGFkZHJlc3MuXG4iLCBob3N0bmFtZSk7Ci0rCQlnb3RvIHRyeTY7Ci0rCX0KLSAKLS0gIGlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLS0gICAgZnByaW50ZihzdGRlcnIscHJvZ3JhbU5hbWUpOwotLSAgICBwZXJyb3IoIjogQ29ubmVjdFRvVGNwQWRkcjogY29ubmVjdCIpOwotLSAgICBjbG9zZShzb2NrKTsKLS0gICAgcmV0dXJuIC0xOwotLSAgfQotKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLSAKLS0gIGlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwKLS0JCSAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLS0gICAgZnByaW50ZihzdGRlcnIscHJvZ3JhbU5hbWUpOwotLSAgICBwZXJyb3IoIjogQ29ubmVjdFRvVGNwQWRkcjogc2V0c29ja29wdCIpOwotLSAgICBjbG9zZShzb2NrKTsKLS0gICAgcmV0dXJuIC0xOwotLSAgfQotKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0rCWFkZHIuc2luX2FkZHIuc19hZGRyID0gaG9zdDsKLSsKLSsJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0rCWlmIChzb2NrIDwgMCkgewotKwkJcGVycm9yKCJDb25uZWN0VG9UY3BBZGRyW2lwdjRdOiBzb2NrZXQiKTsKLSsJCXNvY2sgPSAtMTsKLSsJCWdvdG8gdHJ5NjsKLSsJfQotKwotKwlpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0rCQlwZXJyb3IoIkNvbm5lY3RUb1RjcEFkZHJbaXB2NF06IGNvbm5lY3QiKTsKLSsJCWNsb3NlKHNvY2spOwotKwkJc29jayA9IC0xOwotKwkJZ290byB0cnk2OwotKwl9Ci0rCi0rCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7Ci0rCQlwZXJyb3IoIkNvbm5lY3RUb1RjcEFkZHJbaXB2NF06IHNldHNvY2tvcHQiKTsKLSsJCWNsb3NlKHNvY2spOwotKwkJc29jayA9IC0xOwotKwkJZ290byB0cnk2OwotKwl9Ci0gCi0tICByZXR1cm4gc29jazsKLSsJaWYgKHNvY2sgPj0gMCkgewotKwkJcmV0dXJuIHNvY2s7Ci0rCX0KLSsKLSsJdHJ5NjoKLSsKLSsjaWZkZWYgQUZfSU5FVDYKLSsJaWYgKCFhcHBEYXRhLm5vaXB2NikgewotKwkJaW50IGVycjsKLSsJCXN0cnVjdCBhZGRyaW5mbyAqYWk7Ci0rCQlzdHJ1Y3QgYWRkcmluZm8gaGludHM7Ci0rCQljaGFyIHNlcnZpY2VbMzJdLCAqaG9zdDIsICpxOwotKwotKwkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgaXB2NiBjb25uZWN0aW9uIHRvICclcydcbiIsIGhvc3RuYW1lKTsKLSsKLSsJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotKwkJc3ByaW50ZihzZXJ2aWNlLCAiJWQiLCBwb3J0KTsKLSsKLSsJCWhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKLSsJCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0rI2lmZGVmIEFJX0FERFJDT05GSUcKLSsJCWhpbnRzLmFpX2ZsYWdzIHw9IEFJX0FERFJDT05GSUc7Ci0rI2VuZGlmCi0rI2lmZGVmIEFJX05VTUVSSUNTRVJWCi0rCQloaW50cy5haV9mbGFncyB8PSBBSV9OVU1FUklDU0VSVjsKLSsjZW5kaWYKLSsJCWlmICghc3RyY21wKGhvc3RuYW1lLCAibG9jYWxob3N0IikpIHsKLSsJCQlob3N0MiA9IHN0cmR1cCgiOjoxIik7Ci0rCQl9IGVsc2UgaWYgKCFzdHJjbXAoaG9zdG5hbWUsICIxMjcuMC4wLjEiKSkgewotKwkJCWhvc3QyID0gc3RyZHVwKCI6OjEiKTsKLSsJCX0gZWxzZSBpZiAoaG9zdG5hbWVbMF0gPT0gJ1snKSB7Ci0rCQkJaG9zdDIgPSBzdHJkdXAoaG9zdG5hbWUrMSk7Ci0rCQl9IGVsc2UgewotKwkJCWhvc3QyID0gc3RyZHVwKGhvc3RuYW1lKTsKLSsJCX0KLSsJCXEgPSBzdHJyY2hyKGhvc3QyLCAnXScpOwotKwkJaWYgKHEpIHsKLSsJCQkqcSA9ICdcMCc7Ci0rCQl9Ci0rCi0rCQllcnIgPSBnZXRhZGRyaW5mbyhob3N0Miwgc2VydmljZSwgJmhpbnRzLCAmYWkpOwotKwkJaWYgKGVyciAhPSAwKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0VG9UY3BBZGRyW2lwdjZdOiBnZXRhZGRyaW5mb1slZF06ICVzXG4iLCBlcnIsIGdhaV9zdHJlcnJvcihlcnIpKTsKLSsJCQl1c2xlZXAoMTAwICogMTAwMCk7Ci0rCQkJZXJyID0gZ2V0YWRkcmluZm8oaG9zdDIsIHNlcnZpY2UsICZoaW50cywgJmFpKTsKLSsJCX0KLSsJCWZyZWUoaG9zdDIpOwotKwotKwkJaWYgKGVyciAhPSAwKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0VG9UY3BBZGRyW2lwdjZdOiBnZXRhZGRyaW5mb1slZF06ICVzICgybmQgdHJ5KVxuIiwgZXJyLCBnYWlfc3RyZXJyb3IoZXJyKSk7Ci0rCQl9IGVsc2UgewotKwkJCXN0cnVjdCBhZGRyaW5mbyAqYXAgPSBhaTsKLSsJCQl3aGlsZSAoYXAgIT0gTlVMTCkgewotKwkJCQlpbnQgZmQgPSAtMTsKLSsJCQkJY2hhciAqcyA9IGlwdjZfZ2V0aXBhZGRyKGFwLT5haV9hZGRyLCBhcC0+YWlfYWRkcmxlbik7Ci0rCQkJCWlmIChzKSB7Ci0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RUb1RjcEFkZHJbaXB2Nl06IHRyeWluZyBpcC1hZGRyOiAnJXMnXG4iLCBzKTsKLSsJCQkJCWZyZWUocyk7Ci0rCQkJCX0KLSsJCQkJaWYgKGFwcERhdGEubm9pcHY0KSB7Ci0rCQkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzNnB0cjsKLSsJCQkJCWlmIChhcC0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KSB7Ci0rCQkJCQkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0VG9UY3BBZGRyW2lwdjZdOiBza2lwcGluZyBBRl9JTkVUIGFkZHJlc3MgdW5kZXIgVk5DVklFV0VSX05PX0lQVjQvLW5vaXB2NFxuIik7Ci0rCQkJCQkJYXAgPSBhcC0+YWlfbmV4dDsKLSsJCQkJCQljb250aW51ZTsKLSsJCQkJCX0KLSsjaWZkZWYgSU42X0lTX0FERFJfVjRNQVBQRUQKLSsJCQkJCXM2cHRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYXAtPmFpX2FkZHI7Ci0rCQkJCQlpZiAoSU42X0lTX0FERFJfVjRNQVBQRUQoJihzNnB0ci0+c2luNl9hZGRyKSkpIHsKLSsJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RUb1RjcEFkZHJbaXB2Nl06IHNraXBwaW5nIFY0TUFQUEVEIGFkZHJlc3MgdW5kZXIgVk5DVklFV0VSX05PX0lQVjQvLW5vaXB2NFxuIik7Ci0rCQkJCQkJYXAgPSBhcC0+YWlfbmV4dDsKLSsJCQkJCQljb250aW51ZTsKLSsJCQkJCX0KLSsjZW5kaWYKLSsJCQkJfQotKwotKwkJCQlmZCA9IHNvY2tldChhcC0+YWlfZmFtaWx5LCBhcC0+YWlfc29ja3R5cGUsIGFwLT5haV9wcm90b2NvbCk7Ci0rCQkJCWlmIChmZCA9PSAtMSkgewotKwkJCQkJcGVycm9yKCJDb25uZWN0VG9UY3BBZGRyW2lwdjZdOiBzb2NrZXQiKTsKLSsJCQkJfSBlbHNlIHsKLSsJCQkJCWludCBkbXNnID0gMDsKLSsJCQkJCWludCByZXMgPSBjb25uZWN0KGZkLCBhcC0+YWlfYWRkciwgYXAtPmFpX2FkZHJsZW4pOwotKyNpZiBkZWZpbmVkKFNPTF9JUFY2KSAmJiBkZWZpbmVkKElQVjZfVjZPTkxZKQotKwkJCQkJaWYgKHJlcyAhPSAwKSB7Ci0rCQkJCQkJaW50IHplcm8gPSAwOwotKwkJCQkJCXBlcnJvcigiQ29ubmVjdFRvVGNwQWRkcltpcHY2XTogY29ubmVjdCIpOwotKwkJCQkJCWRtc2cgPSAxOwotKwkJCQkJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVBWNiwgSVBWNl9WNk9OTFksIChjaGFyICopJnplcm8sIHNpemVvZih6ZXJvKSkgPT0gMCkgewotKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RUb1RjcEFkZHJbaXB2Nl06IHRyeWluZyBhZ2FpbiB3aXRoIElQVjZfVjZPTkxZPTBcbiIpOwotKwkJCQkJCQlyZXMgPSBjb25uZWN0KGZkLCBhcC0+YWlfYWRkciwgYXAtPmFpX2FkZHJsZW4pOwotKwkJCQkJCQlkbXNnID0gMDsKLSsJCQkJCQl9Ci0rCQkJCQl9Ci0rI2VuZGlmCi0rCQkJCQlpZiAocmVzID09IDApIHsKLSsJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RUb1RjcEFkZHJbaXB2Nl06IGNvbm5lY3QgT0tcbiIpOwotKwkJCQkJCXNvY2sgPSBmZDsKLSsJCQkJCQlicmVhazsKLSsJCQkJCX0gZWxzZSB7Ci0rCQkJCQkJaWYgKCFkbXNnKSBwZXJyb3IoIkNvbm5lY3RUb1RjcEFkZHJbaXB2Nl06IGNvbm5lY3QiKTsKLSsJCQkJCQljbG9zZShmZCk7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsJCQkJYXAgPSBhcC0+YWlfbmV4dDsKLSsJCQl9Ci0rCQkJZnJlZWFkZHJpbmZvKGFpKTsKLSsJCX0KLSsJCWlmIChzb2NrID49IDAgJiYgc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpIDwgMCkgewotKwkJCXBlcnJvcigiQ29ubmVjdFRvVGNwQWRkcjogc2V0c29ja29wdCIpOwotKwkJCWNsb3NlKHNvY2spOwotKwkJCXNvY2sgPSAtMTsKLSsJCX0KLSsJfQotKyNlbmRpZgotKwlyZXR1cm4gc29jazsKLSB9Ci0gCi0rQm9vbCBTb2NrZXRQYWlyKGludCBmZFsyXSkgewotKwlpZiAoc29ja2V0cGFpcihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmQpID09IC0xKSB7Ci0rCQlwZXJyb3IoInNvY2tldHBhaXIiKTsKLSsJCXJldHVybiBGYWxzZTsKLSsJfQotKwlyZXR1cm4gVHJ1ZTsKLSt9Ci0gCi0rQm9vbCBTZXROb0RlbGF5KGludCBzb2NrKSB7Ci0rCWNvbnN0IGludCBvbmUgPSAxOwotKwlpZiAoc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpIDwgMCkgewotKwkJcGVycm9yKCJzZXRzb2Nrb3B0Iik7Ci0rCQlyZXR1cm4gRmFsc2U7Ci0rCX0KLSsJcmV0dXJuIFRydWU7Ci0rfQotIAotIC8qCi0gICogRmluZEZyZWVUY3BQb3J0IHRyaWVzIHRvIGZpbmQgdW51c2VkIFRDUCBwb3J0IGluIHRoZSByYW5nZQotQEAgLTI0MiwyOSArODY5LDMxIEBACi0gaW50Ci0gRmluZEZyZWVUY3BQb3J0KHZvaWQpCi0gewotLSAgaW50IHNvY2ssIHBvcnQ7Ci0tICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSsJaW50IHNvY2ssIHBvcnQ7Ci0rCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotIAotLSAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLS0gIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLSsJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0gCi0tICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLS0gIGlmIChzb2NrIDwgMCkgewotLSAgICBmcHJpbnRmKHN0ZGVycixwcm9ncmFtTmFtZSk7Ci0tICAgIHBlcnJvcigiOiBGaW5kRnJlZVRjcFBvcnQ6IHNvY2tldCIpOwotLSAgICByZXR1cm4gMDsKLS0gIH0KLSsJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSsJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotIAotLSAgZm9yIChwb3J0ID0gVFVOTkVMX1BPUlRfT0ZGU0VUICsgOTk7IHBvcnQgPiBUVU5ORUxfUE9SVF9PRkZTRVQ7IHBvcnQtLSkgewotLSAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KXBvcnQpOwotLSAgICBpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gMCkgewotLSAgICAgIGNsb3NlKHNvY2spOwotLSAgICAgIHJldHVybiBwb3J0OwotLSAgICB9Ci0tICB9Ci0rCXNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotKwlpZiAoc29jayA8IDApIHsKLSsJCWZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLSsJCXBlcnJvcigiOiBGaW5kRnJlZVRjcFBvcnQ6IHNvY2tldCIpOwotKwkJcmV0dXJuIDA7Ci0rCX0KLSsKLSsJZm9yIChwb3J0ID0gVFVOTkVMX1BPUlRfT0ZGU0VUICsgOTk7IHBvcnQgPiBUVU5ORUxfUE9SVF9PRkZTRVQ7IHBvcnQtLSkgewotKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydClwb3J0KTsKLSsJCWlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKSB7Ci0rCQkJY2xvc2Uoc29jayk7Ci0rCQkJcmV0dXJuIHBvcnQ7Ci0rCQl9Ci0rCX0KLSAKLS0gIGNsb3NlKHNvY2spOwotLSAgcmV0dXJuIDA7Ci0rCWNsb3NlKHNvY2spOwotKwlyZXR1cm4gMDsKLSB9Ci0gCi0gCi1AQCAtMjcyLDQ3ICs5MDEsMTEwIEBACi0gICogTGlzdGVuQXRUY3BQb3J0IHN0YXJ0cyBsaXN0ZW5pbmcgYXQgdGhlIGdpdmVuIFRDUCBwb3J0LgotICAqLwotIAotLWludAotLUxpc3RlbkF0VGNwUG9ydChpbnQgcG9ydCkKLS17Ci0tICBpbnQgc29jazsKLS0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotLSAgaW50IG9uZSA9IDE7Ci0tCi0tICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotLSAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotLSAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotK2ludCB1c2VfbG9vcGJhY2sgPSAwOwotIAotLSAgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0tICBpZiAoc29jayA8IDApIHsKLS0gICAgZnByaW50ZihzdGRlcnIscHJvZ3JhbU5hbWUpOwotLSAgICBwZXJyb3IoIjogTGlzdGVuQXRUY3BQb3J0OiBzb2NrZXQiKTsKLS0gICAgcmV0dXJuIC0xOwotLSAgfQotK2ludCBMaXN0ZW5BdFRjcFBvcnQoaW50IHBvcnQpIHsKLSsJaW50IHNvY2s7Ci0rCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotKwlpbnQgb25lID0gMTsKLSsKLSsJaWYgKGFwcERhdGEubm9pcHY0KSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgImlwdjQgaXMgZGlzYWJsZWQgdmlhIFZOQ1ZJRVdFUl9OT19JUFY0Ly1ub2lwdjQuXG4iKTsKLSsJCXJldHVybiAtMTsKLSsJfQotIAotLSAgaWYgKHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAotLQkJIChjb25zdCBjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpIDwgMCkgewotLSAgICBmcHJpbnRmKHN0ZGVycixwcm9ncmFtTmFtZSk7Ci0tICAgIHBlcnJvcigiOiBMaXN0ZW5BdFRjcFBvcnQ6IHNldHNvY2tvcHQiKTsKLS0gICAgY2xvc2Uoc29jayk7Ci0tICAgIHJldHVybiAtMTsKLS0gIH0KLSsJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0gCi0tICBpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLS0gICAgcGVycm9yKCI6IExpc3RlbkF0VGNwUG9ydDogYmluZCIpOwotLSAgICBjbG9zZShzb2NrKTsKLS0gICAgcmV0dXJuIC0xOwotLSAgfQotKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0rCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLSAKLS0gIGlmIChsaXN0ZW4oc29jaywgNSkgPCAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLS0gICAgcGVycm9yKCI6IExpc3RlbkF0VGNwUG9ydDogbGlzdGVuIik7Ci0tICAgIGNsb3NlKHNvY2spOwotLSAgICByZXR1cm4gLTE7Ci0tICB9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9MSVNURU5fTE9DQUxIT1NUIikgfHwgdXNlX2xvb3BiYWNrKSB7Ci0rCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0rCX0KLSsKLSsJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0rCWlmIChzb2NrIDwgMCkgewotKwkJcGVycm9yKCJMaXN0ZW5BdFRjcFBvcnQ6IHNvY2tldCIpOwotKwkJcmV0dXJuIC0xOwotKwl9Ci0gCi0tICByZXR1cm4gc29jazsKLSsJaWYgKHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY29uc3QgY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLSsJCXBlcnJvcigiTGlzdGVuQXRUY3BQb3J0OiBzZXRzb2Nrb3B0Iik7Ci0rCQljbG9zZShzb2NrKTsKLSsJCXJldHVybiAtMTsKLSsJfQotKwotKwlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0rCQlwZXJyb3IoIkxpc3RlbkF0VGNwUG9ydDogYmluZCIpOwotKwkJY2xvc2Uoc29jayk7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsJaWYgKGxpc3Rlbihzb2NrLCAzMikgPCAwKSB7Ci0rCQlwZXJyb3IoIkxpc3RlbkF0VGNwUG9ydDogbGlzdGVuIik7Ci0rCQljbG9zZShzb2NrKTsKLSsJCXJldHVybiAtMTsKLSsJfQotKwotKwlyZXR1cm4gc29jazsKLSt9Ci0rCi0raW50IExpc3RlbkF0VGNwUG9ydDYoaW50IHBvcnQpIHsKLSsJaW50IHNvY2sgPSAtMTsKLSsjaWZkZWYgQUZfSU5FVDYKLSsJc3RydWN0IHNvY2thZGRyX2luNiBzaW47Ci0rCWludCBvbmUgPSAxOwotKwotKwlpZiAoYXBwRGF0YS5ub2lwdjYpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiaXB2NiBpcyBkaXNhYmxlZCB2aWEgVk5DVklFV0VSX05PX0lQVjYvLW5vaXB2Ni5cbiIpOwotKwkJcmV0dXJuIC0xOwotKwl9Ci0rCi0rCXNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKLSsJaWYgKHNvY2sgPCAwKSB7Ci0rCQlwZXJyb3IoIkxpc3RlbkF0VGNwUG9ydFtpcHY2XTogc29ja2V0Iik7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsJaWYgKHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLSsJCXBlcnJvcigiTGlzdGVuQXRUY3BQb3J0W2lwdjZdOiBzZXRzb2Nrb3B0MSIpOwotKwkJY2xvc2Uoc29jayk7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsjaWYgZGVmaW5lZChTT0xfSVBWNikgJiYgZGVmaW5lZChJUFY2X1Y2T05MWSkKLSsJaWYgKHNldHNvY2tvcHQoc29jaywgU09MX0lQVjYsIElQVjZfVjZPTkxZLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLSsJCXBlcnJvcigiTGlzdGVuQXRUY3BQb3J0W2lwdjZdOiBzZXRzb2Nrb3B0MiIpOwotKwkJY2xvc2Uoc29jayk7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsjZW5kaWYKLSsKLSsJbWVtc2V0KChjaGFyICopJnNpbiwgMCwgc2l6ZW9mKHNpbikpOwotKwlzaW4uc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLSsJc2luLnNpbjZfcG9ydCAgID0gaHRvbnMocG9ydCk7Ci0rCXNpbi5zaW42X2FkZHIgICA9IGluNmFkZHJfYW55OwotKwotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfTElTVEVOX0xPQ0FMSE9TVCIpIHx8IHVzZV9sb29wYmFjaykgewotKwkJc2luLnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7Ci0rCX0KLSsKLSsJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCBzaXplb2Yoc2luKSkgPCAwKSB7Ci0rCQlwZXJyb3IoIkxpc3RlbkF0VGNwUG9ydFtpcHY2XTogYmluZCIpOwotKwkJY2xvc2Uoc29jayk7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsJaWYgKGxpc3Rlbihzb2NrLCAzMikgPCAwKSB7Ci0rCQlwZXJyb3IoIkxpc3RlbkF0VGNwUG9ydFtpcHY2XTogbGlzdGVuIik7Ci0rCQljbG9zZShzb2NrKTsKLSsJCXJldHVybiAtMTsKLSsJfQotKwotKyNlbmRpZgotKwlpZiAocG9ydCkge30KLSsJcmV0dXJuIHNvY2s7Ci0gfQotIAotIAotQEAgLTMyMCwzMyArMTAxMiw2OSBAQAotICAqIEFjY2VwdFRjcENvbm5lY3Rpb24gYWNjZXB0cyBhIFRDUCBjb25uZWN0aW9uLgotICAqLwotIAotLWludAotLUFjY2VwdFRjcENvbm5lY3Rpb24oaW50IGxpc3RlblNvY2spCi0tewotLSAgaW50IHNvY2s7Ci0tICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLS0gIGludCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotLSAgaW50IG9uZSA9IDE7Ci0raW50IEFjY2VwdFRjcENvbm5lY3Rpb24oaW50IGxpc3RlblNvY2spIHsKLSsJaW50IHNvY2s7Ci0rCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotKwlpbnQgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLSsJaW50IG9uZSA9IDE7Ci0rCi0rCXNvY2sgPSBhY2NlcHQobGlzdGVuU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFkZHJsZW4pOwotKwlpZiAoc29jayA8IDApIHsKLSsJCXBlcnJvcigiQWNjZXB0VGNwQ29ubmVjdGlvbjogYWNjZXB0Iik7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSAKLS0gIHNvY2sgPSBhY2NlcHQobGlzdGVuU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFkZHJsZW4pOwotLSAgaWYgKHNvY2sgPCAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLS0gICAgcGVycm9yKCI6IEFjY2VwdFRjcENvbm5lY3Rpb246IGFjY2VwdCIpOwotLSAgICByZXR1cm4gLTE7Ci0tICB9Ci0rCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7Ci0rCQlwZXJyb3IoIkFjY2VwdFRjcENvbm5lY3Rpb246IHNldHNvY2tvcHQiKTsKLSsJCWNsb3NlKHNvY2spOwotKwkJcmV0dXJuIC0xOwotKwl9Ci0gCi0tICBpZiAoc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0tCQkgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSkgPCAwKSB7Ci0tICAgIGZwcmludGYoc3RkZXJyLHByb2dyYW1OYW1lKTsKLS0gICAgcGVycm9yKCI6IEFjY2VwdFRjcENvbm5lY3Rpb246IHNldHNvY2tvcHQiKTsKLS0gICAgY2xvc2Uoc29jayk7Ci0tICAgIHJldHVybiAtMTsKLS0gIH0KLSsJcmV0dXJuIHNvY2s7Ci0rfQotKwotK2NoYXIgKmFjY2VwdDZfaXBhZGRyID0gTlVMTDsKLStjaGFyICphY2NlcHQ2X2hvc3RuYW1lID0gTlVMTDsKLSsKLStpbnQgQWNjZXB0VGNwQ29ubmVjdGlvbjYoaW50IGxpc3RlblNvY2spIHsKLSsJaW50IHNvY2sgPSAtMTsKLSsjaWZkZWYgQUZfSU5FVDYKLSsJc3RydWN0IHNvY2thZGRyX2luNiBhZGRyOwotKwlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLSsJaW50IG9uZSA9IDE7Ci0rCWNoYXIgKm5hbWU7Ci0rCi0rCWlmIChhcHBEYXRhLm5vaXB2NikgewotKwkJcmV0dXJuIC0xOwotKwl9Ci0rCi0rCXNvY2sgPSBhY2NlcHQobGlzdGVuU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFkZHJsZW4pOwotKwlpZiAoc29jayA8IDApIHsKLSsJCXBlcnJvcigiQWNjZXB0VGNwQ29ubmVjdGlvbltpcHY2XTogYWNjZXB0Iik7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSsKLSsJaWYgKHNldHNvY2tvcHQoc29jaywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKSA8IDApIHsKLSsJCXBlcnJvcigiQWNjZXB0VGNwQ29ubmVjdGlvbltpcHY2XTogc2V0c29ja29wdCIpOwotKwkJY2xvc2Uoc29jayk7Ci0rCQlyZXR1cm4gLTE7Ci0rCX0KLSAKLS0gIHJldHVybiBzb2NrOwotKwluYW1lID0gaXB2Nl9nZXRpcGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgYWRkcmxlbik7Ci0rCWlmICghbmFtZSkgbmFtZSA9IHN0cmR1cCgidW5rbm93biIpOwotKwlhY2NlcHQ2X2lwYWRkciA9IG5hbWU7Ci0rCWZwcmludGYoc3RkZXJyLCAiQWNjZXB0VGNwQ29ubmVjdGlvbjY6IGlwdjYgY29ubmVjdGlvbiBmcm9tOiAnJXMnXG4iLCBuYW1lKTsKLSsKLSsJbmFtZSA9IGlwdjZfZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgYWRkcmxlbik7Ci0rCWlmICghbmFtZSkgbmFtZSA9IHN0cmR1cCgidW5rbm93biIpOwotKwlhY2NlcHQ2X2hvc3RuYW1lID0gbmFtZTsKLSsjZW5kaWYKLSsJaWYgKGxpc3RlblNvY2spIHt9Ci0rCXJldHVybiBzb2NrOwotIH0KLSAKLSAKLSsKLSAvKgotICAqIFNldE5vbkJsb2NraW5nIHNldHMgYSBzb2NrZXQgaW50byBub24tYmxvY2tpbmcgbW9kZS4KLSAgKi8KLUBAIC0zNzksNyArMTEwNyw3IEBACi0gCi0gICAqYWRkciA9IGluZXRfYWRkcihzdHIpOwotIAotLSAgaWYgKCphZGRyICE9IC0xKQotKyAgaWYgKCphZGRyICE9ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgICByZXR1cm4gVHJ1ZTsKLSAKLSAgIGhwID0gZ2V0aG9zdGJ5bmFtZShzdHIpOwotQEAgLTM5Miw2ICsxMTIwLDQyIEBACi0gICByZXR1cm4gRmFsc2U7Ci0gfQotIAotK2NoYXIgKmdldF9wZWVyX2lwKGludCBzb2NrKSB7Ci0rCXN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKLSsJdW5zaWduZWQgaW50IHNhZGRyX2xlbjsKLSsJaW50IHNhZGRyX3BvcnQ7Ci0rCWNoYXIgKnNhZGRyX2lwX3N0ciA9IE5VTEw7Ci0rCi0rCXNhZGRyX2xlbiA9IHNpemVvZihzYWRkcik7Ci0rCW1lbXNldCgmc2FkZHIsIDAsIHNpemVvZihzYWRkcikpOwotKwlzYWRkcl9wb3J0ID0gLTE7Ci0rCWlmICghZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgJnNhZGRyX2xlbikpIHsKLSsJCXNhZGRyX2lwX3N0ciA9IGluZXRfbnRvYShzYWRkci5zaW5fYWRkcik7Ci0rCX0KLSsJaWYgKCEgc2FkZHJfaXBfc3RyKSB7Ci0rCQlzYWRkcl9pcF9zdHIgPSAidW5rbm93biI7Ci0rCX0KLSsJcmV0dXJuIHN0cmR1cChzYWRkcl9pcF9zdHIpOwotK30KLSsKLStjaGFyICppcDJob3N0KGNoYXIgKmlwKSB7Ci0rCWNoYXIgKnN0cjsKLSsJc3RydWN0IGhvc3RlbnQgKmhwOwotKwlpbl9hZGRyX3QgaWFkZHI7Ci0rCi0rCWlhZGRyID0gaW5ldF9hZGRyKGlwKTsKLSsJaWYgKGlhZGRyID09IGh0b25sKElOQUREUl9OT05FKSkgewotKwkJcmV0dXJuIHN0cmR1cCgidW5rbm93biIpOwotKwl9Ci0rCi0rCWhwID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZpYWRkciwgc2l6ZW9mKGluX2FkZHJfdCksIEFGX0lORVQpOwotKwlpZiAoIWhwKSB7Ci0rCQlyZXR1cm4gc3RyZHVwKCJ1bmtub3duIik7Ci0rCX0KLSsJc3RyID0gc3RyZHVwKGhwLT5oX25hbWUpOwotKwlyZXR1cm4gc3RyOwotK30KLSsKLSAKLSAvKgotICAqIFRlc3QgaWYgdGhlIG90aGVyIGVuZCBvZiBhIHNvY2tldCBpcyBvbiB0aGUgc2FtZSBtYWNoaW5lLgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdGlnaHQuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdGlnaHQuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3RpZ2h0LmMJMjAwMi0wNC0zMCAwOTowNzozMS4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdGlnaHQuYwkyMDA4LTEwLTA1IDE1OjE2OjM1LjAwMDAwMDAwMCAtMDQwMAotQEAgLTEyOSwxNCArMTI5LDIxIEBACi0gI2VuZGlmCi0gCi0gI2lmIChCUFAgPT0gOCkKLS0gICAgZ2N2LmZvcmVncm91bmQgPSAoYXBwRGF0YS51c2VCR1IyMzMpID8KLS0gICAgICBCR1IyMzNUb1BpeGVsW2ZpbGxfY29sb3VyXSA6IGZpbGxfY29sb3VyOwotKyAgICBnY3YuZm9yZWdyb3VuZCA9IChhcHBEYXRhLnVzZUJHUjIzMykgPyAgQkdSMjMzVG9QaXhlbFtmaWxsX2NvbG91cl0gOiBmaWxsX2NvbG91cjsKLSsjZWxzZQotKyNpZiAoQlBQID09IDE2KQotKyAgICBnY3YuZm9yZWdyb3VuZCA9IChhcHBEYXRhLnVzZUJHUjU2NSkgPyAgQkdSNTY1VG9QaXhlbFtmaWxsX2NvbG91cl0gOiBmaWxsX2NvbG91cjsKLSAjZWxzZQotICAgICBnY3YuZm9yZWdyb3VuZCA9IGZpbGxfY29sb3VyOwotICNlbmRpZgotKyNlbmRpZgotIAotLSAgICBYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmZ2N2KTsKLS0gICAgWEZpbGxSZWN0YW5nbGUoZHB5LCBkZXNrdG9wV2luLCBnYywgcngsIHJ5LCBydywgcmgpOwotKwlpZiAoIWFwcERhdGEudXNlWHNlcnZlckJhY2tpbmdTdG9yZSkgewotKwkJRmlsbFNjcmVlbihyeCwgcnksIHJ3LCByaCwgZ2N2LmZvcmVncm91bmQpOwotKwl9IGVsc2UgewotKwkJWENoYW5nZUdDKGRweSwgZ2MsIEdDRm9yZWdyb3VuZCwgJmdjdik7Ci0rCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCByeCwgcnksIHJ3LCByaCk7Ci0rCX0KLSAgICAgcmV0dXJuIFRydWU7Ci0gICB9Ci0gCi1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci90bWFrZSB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdG1ha2UKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci90bWFrZQkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci90bWFrZQkyMDA5LTEwLTI1IDEwOjMxOjIyLjAwMDAwMDAwMCAtMDQwMAotQEAgLTAsMCArMSwxNyBAQAotKyMhL2Jpbi9zaAotK1RVUkJPVk5DX0RJUj0vaG9tZS9ydW5nZS90dXJib2pwZWcKLSttYWtlIGNsZWFuCi0rKGNkIC4uL2xpYnZuY2F1dGggfHwgZXhpdCAxOyBtYWtlKQotK2lmIFsgIlgkMSIgPSAiWC1hIiBdOyB0aGVuCi0rCWV4aXQKLStmaQotK21ha2UgQ0NPUFRJT05TPS1EVFVSQk9WTkMgRVhUUkFfTElCUkFSSUVTPSItTCRUVVJCT1ZOQ19ESVIgLVhsaW5rZXIgLS1ycGF0aD0kVFVSQk9WTkNfRElSIC1YbGlua2VyIC0tcnBhdGg9L3Vzci9sb2NhbC9saWIgLWx0dXJib2pwZWciCi0rY3AgLXAgdm5jdmlld2VyIHZuY3ZpZXdlci50dXJib3ZuYwotK3N0cmlwIHZuY3ZpZXdlci50dXJib3ZuYwotK2xzIC1sIHZuY3ZpZXdlci50dXJib3ZuYwotK2xkZCAgIHZuY3ZpZXdlci50dXJib3ZuYwotKwotK2VjaG8KLSttYWtlIGNsZWFuIGFsbAotK2xzIC1sIHZuY3ZpZXdlcgotK2xkZCAgIHZuY3ZpZXdlcgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdHVubmVsLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3R1bm5lbC5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdHVubmVsLmMJMjAwMy0wNy0zMSAwNDowMzo0OS4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdHVubmVsLmMJMjAxMC0wMi0yNSAyMzozOToyNC4wMDAwMDAwMDAgLTA1MDAKLUBAIC0xMDAsNyArMTAwLDYgQEAKLSAJCSAgaW50ICpwYXJnYywgY2hhciAqKmFyZ3YsIGludCB0dW5uZWxBcmdJbmRleCkKLSB7Ci0gICBjaGFyICpwZGlzcGxheTsKLS0gIGludCBwb3J0OwotIAotICAgaWYgKHR1bm5lbEFyZ0luZGV4ID49ICpwYXJnYyAtIDEpCi0gICAgIHVzYWdlKCk7Ci1AQCAtMTMyLDYgKzEzMSw3IEBACi0gewotICAgY2hhciAqY29sb25Qb3M7Ci0gICBpbnQgbGVuLCBwb3J0T2Zmc2V0OwotKyAgaW50IGRpc3A7Ci0gCi0gICBpZiAodHVubmVsQXJnSW5kZXggPj0gKnBhcmdjIC0gMikKLSAgICAgdXNhZ2UoKTsKLUBAIC0xNTAsMTAgKzE1MCwxNyBAQAotICAgICAgIGxlbi0tOwotICAgICAgIHBvcnRPZmZzZXQgPSAwOwotICAgICB9Ci0tICAgIGlmICghbGVuIHx8IHN0cnNwbihjb2xvblBvcywgIi0wMTIzNDU2Nzg5IikgIT0gbGVuKSB7Ci0rICAgIGlmICghbGVuIHx8IChpbnQpIHN0cnNwbihjb2xvblBvcywgIi0wMTIzNDU2Nzg5IikgIT0gbGVuKSB7Ci0gICAgICAgdXNhZ2UoKTsKLSAgICAgfQotKyNpZiAwCi0gICAgICpyZW1vdGVQb3J0ID0gYXRvaShjb2xvblBvcykgKyBwb3J0T2Zmc2V0OwotKyNlbHNlCi0rICAgIGRpc3AgPSBhdG9pKGNvbG9uUG9zKTsKLSsgICAgaWYgKHBvcnRPZmZzZXQgIT0gMCAmJiBkaXNwID49IDEwMCkKLSsgICAgICBwb3J0T2Zmc2V0ID0gMDsKLSsgICAgKnJlbW90ZVBvcnQgPSBkaXNwICsgcG9ydE9mZnNldDsKLSsjZW5kaWYKLSAgIH0KLSAKLSAgIHNwcmludGYobGFzdEFyZ3YsICJsb2NhbGhvc3Q6OiVkIiwgbG9jYWxQb3J0KTsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3R1cmJvdm5jL3RpZ2h0LmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3R1cmJvdm5jL3RpZ2h0LmMKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci90dXJib3ZuYy90aWdodC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3R1cmJvdm5jL3RpZ2h0LmMJMjAwOC0wOC0yMCAxMzozNTo1OC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0wLDAgKzEsNjEzIEBACi0rLyoKLSsgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSsgKiAgQ29weXJpZ2h0IChDKSAyMDA0IExhbmRtYXJrIEdyYXBoaWNzIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSsgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIENvbnN0IEthcGxpbnNreS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0rICoKLSsgKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0rICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0rICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rICoKLSsgKiAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0rICoKLSsgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSsgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKLSsgKiAgVVNBLgotKyAqLwotKwotKy8qCi0rICogdGlnaHQuYyAtIGhhbmRsZSBgYHRpZ2h0JycgZW5jb2RpbmcuCi0rICoKLSsgKiBUaGlzIGZpbGUgc2hvdWxkbid0IGJlIGNvbXBpbGVkIGRpcmVjdGx5LiBJdCBpcyBpbmNsdWRlZCBtdWx0aXBsZQotKyAqIHRpbWVzIGJ5IHJmYnByb3RvLmMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50IGRlZmluaXRpb24gb2YgdGhlCi0rICogbWFjcm8gQlBQLiBGb3IgZWFjaCB2YWx1ZSBvZiBCUFAsIHRoaXMgZmlsZSBkZWZpbmVzIGEgZnVuY3Rpb24KLSsgKiB3aGljaCBoYW5kbGVzIGEgdGlnaHQtZW5jb2RlZCByZWN0YW5nbGUgd2l0aCBCUFAgYml0cyBwZXIgcGl4ZWwuCi0rICoKLSsgKi8KLSsKLSsjZGVmaW5lIFRJR0hUX01JTl9UT19DT01QUkVTUyAxMgotKwotKyNkZWZpbmUgQ0FSREJQUCBDT05DQVQyRShDQVJELEJQUCkKLSsjZGVmaW5lIGZpbHRlclB0ckJQUCBDT05DQVQyRShmaWx0ZXJQdHIsQlBQKQotKwotKyNkZWZpbmUgSGFuZGxlVGlnaHRCUFAgQ09OQ0FUMkUoSGFuZGxlVGlnaHQsQlBQKQotKyNkZWZpbmUgSW5pdEZpbHRlckNvcHlCUFAgQ09OQ0FUMkUoSW5pdEZpbHRlckNvcHksQlBQKQotKyNkZWZpbmUgSW5pdEZpbHRlclBhbGV0dGVCUFAgQ09OQ0FUMkUoSW5pdEZpbHRlclBhbGV0dGUsQlBQKQotKyNkZWZpbmUgSW5pdEZpbHRlckdyYWRpZW50QlBQIENPTkNBVDJFKEluaXRGaWx0ZXJHcmFkaWVudCxCUFApCi0rI2RlZmluZSBGaWx0ZXJDb3B5QlBQIENPTkNBVDJFKEZpbHRlckNvcHksQlBQKQotKyNkZWZpbmUgRmlsdGVyUGFsZXR0ZUJQUCBDT05DQVQyRShGaWx0ZXJQYWxldHRlLEJQUCkKLSsjZGVmaW5lIEZpbHRlckdyYWRpZW50QlBQIENPTkNBVDJFKEZpbHRlckdyYWRpZW50LEJQUCkKLSsKLSsjaWYgQlBQICE9IDgKLSsjZGVmaW5lIERlY29tcHJlc3NKcGVnUmVjdEJQUCBDT05DQVQyRShEZWNvbXByZXNzSnBlZ1JlY3QsQlBQKQotKyNlbmRpZgotKwotKyNpZm5kZWYgUkdCX1RPX1BJWEVMCi0rCi0rI2RlZmluZSBSR0JfVE9fUElYRUwoYnBwLHIsZyxiKQkJCQkJCVwKLSsgICgoKENBUkQjI2JwcCkocikgJiBteUZvcm1hdC5yZWRNYXgpIDw8IG15Rm9ybWF0LnJlZFNoaWZ0IHwJCVwKLSsgICAoKENBUkQjI2JwcCkoZykgJiBteUZvcm1hdC5ncmVlbk1heCkgPDwgbXlGb3JtYXQuZ3JlZW5TaGlmdCB8CVwKLSsgICAoKENBUkQjI2JwcCkoYikgJiBteUZvcm1hdC5ibHVlTWF4KSA8PCBteUZvcm1hdC5ibHVlU2hpZnQpCi0rCi0rI2RlZmluZSBSR0IyNF9UT19QSVhFTChicHAscixnLGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKyAgICgoKChDQVJEIyNicHApKHIpICYgMHhGRikgKiBteUZvcm1hdC5yZWRNYXggKyAxMjcpIC8gMjU1ICAgICAgICAgICAgIFwKLSsgICAgPDwgbXlGb3JtYXQucmVkU2hpZnQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0rICAgICgoKENBUkQjI2JwcCkoZykgJiAweEZGKSAqIG15Rm9ybWF0LmdyZWVuTWF4ICsgMTI3KSAvIDI1NSAgICAgICAgICAgXAotKyAgICA8PCBteUZvcm1hdC5ncmVlblNoaWZ0IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSsgICAgKCgoQ0FSRCMjYnBwKShiKSAmIDB4RkYpICogbXlGb3JtYXQuYmx1ZU1heCArIDEyNykgLyAyNTUgICAgICAgICAgICBcCi0rICAgIDw8IG15Rm9ybWF0LmJsdWVTaGlmdCkKLSsKLSsjZGVmaW5lIFJHQjI0X1RPX1BJWEVMMzIocixnLGIpCQkJCQkJXAotKyAgKCgoQ0FSRDMyKShyKSAmIDB4RkYpIDw8IG15Rm9ybWF0LnJlZFNoaWZ0IHwJCQkJXAotKyAgICgoQ0FSRDMyKShnKSAmIDB4RkYpIDw8IG15Rm9ybWF0LmdyZWVuU2hpZnQgfAkJCVwKLSsgICAoKENBUkQzMikoYikgJiAweEZGKSA8PCBteUZvcm1hdC5ibHVlU2hpZnQpCi0rCi0rI2VuZGlmCi0rCi0rZXh0ZXJuIFhJbWFnZSAqaW1hZ2U7Ci0rCi0rLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KLSsKLSt0eXBlZGVmIHZvaWQgKCpmaWx0ZXJQdHJCUFApKGludCwgaW50LCBpbnQpOwotKwotKy8qIFByb3RvdHlwZXMgKi8KLSsKLStzdGF0aWMgaW50IEluaXRGaWx0ZXJDb3B5QlBQIChpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIGludCBJbml0RmlsdGVyUGFsZXR0ZUJQUCAoaW50IHJ3LCBpbnQgcmgpOwotK3N0YXRpYyBpbnQgSW5pdEZpbHRlckdyYWRpZW50QlBQIChpbnQgcncsIGludCByaCk7Ci0rc3RhdGljIHZvaWQgRmlsdGVyQ29weUJQUCAoaW50IHNyY3gsIGludCBzcmN5LCBpbnQgbnVtUm93cyk7Ci0rc3RhdGljIHZvaWQgRmlsdGVyUGFsZXR0ZUJQUCAoaW50IHNyY3gsIGludCBzcmN5LCBpbnQgbnVtUm93cyk7Ci0rc3RhdGljIHZvaWQgRmlsdGVyR3JhZGllbnRCUFAgKGludCBzcmN4LCBpbnQgc3JjeSwgaW50IG51bVJvd3MpOwotKwotK3N0YXRpYyBCb29sIERlY29tcHJlc3NKcGVnUmVjdEJQUChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Ci0rCi0rLyogRGVmaW5pdGlvbnMgKi8KLSsKLStzdGF0aWMgQm9vbAotK0hhbmRsZVRpZ2h0QlBQIChpbnQgcngsIGludCByeSwgaW50IHJ3LCBpbnQgcmgpCi0rewotKyAgQ0FSREJQUCBmaWxsX2NvbG91cjsKLSsgIFhHQ1ZhbHVlcyBnY3Y7Ci0rICBDQVJEOCBjb21wX2N0bDsKLSsgIENBUkQ4IGZpbHRlcl9pZDsKLSsgIGZpbHRlclB0ckJQUCBmaWx0ZXJGbjsKLSsgIHpfc3RyZWFtcCB6czsKLSsgIGludCBlcnIsIHN0cmVhbV9pZCwgY29tcHJlc3NlZExlbiwgYml0c1BpeGVsOwotKyAgaW50IGJ1ZmZlclNpemUsIHJvd1NpemUsIG51bVJvd3M7Ci0rICBCb29sIHJlYWRVbmNvbXByZXNzZWQgPSBGYWxzZTsKLSsgIENBUkRCUFAgKnJhd0RhdGE7Ci0rCi0rICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyICopJmNvbXBfY3RsLCAxKSkKLSsgICAgcmV0dXJuIEZhbHNlOwotKwotKyAgLyogRmx1c2ggemxpYiBzdHJlYW1zIGlmIHdlIGFyZSB0b2xkIGJ5IHRoZSBzZXJ2ZXIgdG8gZG8gc28uICovCi0rICBmb3IgKHN0cmVhbV9pZCA9IDA7IHN0cmVhbV9pZCA8IDQ7IHN0cmVhbV9pZCsrKSB7Ci0rICAgIGlmICgoY29tcF9jdGwgJiAxKSAmJiB6bGliU3RyZWFtQWN0aXZlW3N0cmVhbV9pZF0pIHsKLSsgICAgICBpZiAoaW5mbGF0ZUVuZCAoJnpsaWJTdHJlYW1bc3RyZWFtX2lkXSkgIT0gWl9PSyAmJgotKwkgIHpsaWJTdHJlYW1bc3RyZWFtX2lkXS5tc2cgIT0gTlVMTCkKLSsJZnByaW50ZihzdGRlcnIsICJpbmZsYXRlRW5kOiAlc1xuIiwgemxpYlN0cmVhbVtzdHJlYW1faWRdLm1zZyk7Ci0rICAgICAgemxpYlN0cmVhbUFjdGl2ZVtzdHJlYW1faWRdID0gRmFsc2U7Ci0rICAgIH0KLSsgICAgY29tcF9jdGwgPj49IDE7Ci0rICB9Ci0rCi0rICBpZiAoKGNvbXBfY3RsICYgcmZiVGlnaHROb1psaWIpID09IHJmYlRpZ2h0Tm9abGliKSB7Ci0rICAgICBjb21wX2N0bCAmPSB+KHJmYlRpZ2h0Tm9abGliKTsKLSsgICAgIHJlYWRVbmNvbXByZXNzZWQgPSBUcnVlOwotKyAgfQotKwotKyAgLyogSGFuZGxlIHNvbGlkIHJlY3RhbmdsZXMuICovCi0rICBpZiAoY29tcF9jdGwgPT0gcmZiVGlnaHRGaWxsKSB7Ci0rI2lmIEJQUCA9PSAzMgotKyAgICBpZiAobXlGb3JtYXQuZGVwdGggPT0gMjQgJiYgbXlGb3JtYXQucmVkTWF4ID09IDB4RkYgJiYKLSsJbXlGb3JtYXQuZ3JlZW5NYXggPT0gMHhGRiAmJiBteUZvcm1hdC5ibHVlTWF4ID09IDB4RkYpIHsKLSsgICAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZmZlciwgMykpCi0rCXJldHVybiBGYWxzZTsKLSsgICAgICBmaWxsX2NvbG91ciA9IFJHQjI0X1RPX1BJWEVMMzIoYnVmZmVyWzBdLCBidWZmZXJbMV0sIGJ1ZmZlclsyXSk7Ci0rICAgIH0gZWxzZSB7Ci0rICAgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciopJmZpbGxfY29sb3VyLCBzaXplb2YoZmlsbF9jb2xvdXIpKSkKLSsJcmV0dXJuIEZhbHNlOwotKyAgICB9Ci0rI2Vsc2UKLSsgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciopJmZpbGxfY29sb3VyLCBzaXplb2YoZmlsbF9jb2xvdXIpKSkKLSsJcmV0dXJuIEZhbHNlOwotKyNlbmRpZgotKwotKyNpZiAoQlBQID09IDgpCi0rICAgIGdjdi5mb3JlZ3JvdW5kID0gKGFwcERhdGEudXNlQkdSMjMzKSA/Ci0rICAgICAgQkdSMjMzVG9QaXhlbFtmaWxsX2NvbG91cl0gOiBmaWxsX2NvbG91cjsKLSsjZWxzZQotKyAgICBnY3YuZm9yZWdyb3VuZCA9IGZpbGxfY29sb3VyOwotKyNlbmRpZgotKwotKyAgICBGaWxsUmVjdGFuZ2xlKCZnY3YsIHJ4LCByeSwgcncsIHJoKTsKLSsgICAgcmV0dXJuIFRydWU7Ci0rICB9Ci0rCi0rI2lmIEJQUCA9PSA4Ci0rICBpZiAoY29tcF9jdGwgPT0gcmZiVGlnaHRKcGVnKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiVGlnaHQgZW5jb2Rpbmc6IEpQRUcgaXMgbm90IHN1cHBvcnRlZCBpbiA4IGJwcCBtb2RlLlxuIik7Ci0rICAgIHJldHVybiBGYWxzZTsKLSsgIH0KLSsjZWxzZQotKyAgaWYgKGNvbXBfY3RsID09IHJmYlRpZ2h0SnBlZykgewotKyAgICByZXR1cm4gRGVjb21wcmVzc0pwZWdSZWN0QlBQKHJ4LCByeSwgcncsIHJoKTsKLSsgIH0KLSsjZW5kaWYKLSsKLSsgIC8qIFF1aXQgb24gdW5zdXBwb3J0ZWQgc3ViZW5jb2RpbmcgdmFsdWUuICovCi0rICBpZiAoY29tcF9jdGwgPiByZmJUaWdodE1heFN1YmVuY29kaW5nKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiVGlnaHQgZW5jb2Rpbmc6IGJhZCBzdWJlbmNvZGluZyB2YWx1ZSByZWNlaXZlZC5cbiIpOwotKyAgICByZXR1cm4gRmFsc2U7Ci0rICB9Ci0rCi0rICAvKgotKyAgICogSGVyZSBwcmltYXJ5IGNvbXByZXNzaW9uIG1vZGUgaGFuZGxpbmcgYmVnaW5zLgotKyAgICogRGF0YSB3YXMgcHJvY2Vzc2VkIHdpdGggb3B0aW9uYWwgZmlsdGVyICsgemxpYiBjb21wcmVzc2lvbi4KLSsgICAqLwotKwotKyAgLyogRmlyc3QsIHdlIHNob3VsZCBpZGVudGlmeSBhIGZpbHRlciB0byB1c2UuICovCi0rICBpZiAoKGNvbXBfY3RsICYgcmZiVGlnaHRFeHBsaWNpdEZpbHRlcikgIT0gMCkgewotKyAgICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyKikmZmlsdGVyX2lkLCAxKSkKLSsgICAgICByZXR1cm4gRmFsc2U7Ci0rCi0rICAgIHN3aXRjaCAoZmlsdGVyX2lkKSB7Ci0rICAgIGNhc2UgcmZiVGlnaHRGaWx0ZXJDb3B5OgotKyAgICAgIGZpbHRlckZuID0gRmlsdGVyQ29weUJQUDsKLSsgICAgICBiaXRzUGl4ZWwgPSBJbml0RmlsdGVyQ29weUJQUChydywgcmgpOwotKyAgICAgIGJyZWFrOwotKyAgICBjYXNlIHJmYlRpZ2h0RmlsdGVyUGFsZXR0ZToKLSsgICAgICBmaWx0ZXJGbiA9IEZpbHRlclBhbGV0dGVCUFA7Ci0rICAgICAgYml0c1BpeGVsID0gSW5pdEZpbHRlclBhbGV0dGVCUFAocncsIHJoKTsKLSsgICAgICBicmVhazsKLSsgICAgY2FzZSByZmJUaWdodEZpbHRlckdyYWRpZW50OgotKyAgICAgIGZpbHRlckZuID0gRmlsdGVyR3JhZGllbnRCUFA7Ci0rICAgICAgYml0c1BpeGVsID0gSW5pdEZpbHRlckdyYWRpZW50QlBQKHJ3LCByaCk7Ci0rICAgICAgYnJlYWs7Ci0rICAgIGRlZmF1bHQ6Ci0rICAgICAgZnByaW50ZihzdGRlcnIsICJUaWdodCBlbmNvZGluZzogdW5rbm93biBmaWx0ZXIgY29kZSByZWNlaXZlZC5cbiIpOwotKyAgICAgIHJldHVybiBGYWxzZTsKLSsgICAgfQotKyAgfSBlbHNlIHsKLSsgICAgZmlsdGVyRm4gPSBGaWx0ZXJDb3B5QlBQOwotKyAgICBiaXRzUGl4ZWwgPSBJbml0RmlsdGVyQ29weUJQUChydywgcmgpOwotKyAgfQotKyAgaWYgKGJpdHNQaXhlbCA9PSAwKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiVGlnaHQgZW5jb2Rpbmc6IGVycm9yIHJlY2VpdmluZyBwYWxldHRlLlxuIik7Ci0rICAgIHJldHVybiBGYWxzZTsKLSsgIH0KLSsKLSsgIC8qIERldGVybWluZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgZGVjb21wcmVzc2VkIG9yIGp1c3QgY29waWVkLiAqLwotKyAgcm93U2l6ZSA9IChydyAqIGJpdHNQaXhlbCArIDcpIC8gODsKLSsgIGJ1ZmZlclNpemUgPSAtMTsKLSsgIGlmIChyaCAqIHJvd1NpemUgPCBUSUdIVF9NSU5fVE9fQ09NUFJFU1MpCi0rICAgIGJ1ZmZlclNpemUgPSByaCAqIHJvd1NpemU7Ci0rICBlbHNlIGlmIChyZWFkVW5jb21wcmVzc2VkKSB7Ci0rICAgIGJ1ZmZlclNpemUgPSAoaW50KVJlYWRDb21wYWN0TGVuKCk7Ci0rICB9Ci0rICBpZiAoYnVmZmVyU2l6ZSAhPSAtMSkgewotKyAgICB1bmNvbXByZXNzZWREYXRhID0gKGNoYXIgKilyZWFsbG9jKHVuY29tcHJlc3NlZERhdGEsIGJ1ZmZlclNpemUpOwotKyAgICBpZiAoIXVuY29tcHJlc3NlZERhdGEpIHsKLSsgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKLSsgICAgICByZXR1cm4gRmFsc2U7Ci0rICAgIH0KLSsgICAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcih1bmNvbXByZXNzZWREYXRhLCBidWZmZXJTaXplKSkKLSsgICAgICByZXR1cm4gRmFsc2U7Ci0rICAgIGZpbHRlckZuKHJ4LCByeSwgcmgpOwotKyAgICBpZiAoYXBwRGF0YS51c2VCR1IyMzMpIENvcHlEYXRhVG9JbWFnZShidWZmZXIsIHJ4LCByeSwgcncsIHJoKTsKLSsgICAgaWYgKCFhcHBEYXRhLmRvdWJsZUJ1ZmZlcikgQ29weUltYWdlVG9TY3JlZW4ocngsIHJ5LCBydywgcmgpOwotKwotKyAgICByZXR1cm4gVHJ1ZTsKLSsgIH0KLSsKLSsgIC8qIFJlYWQgdGhlIGxlbmd0aCAoMS4uMyBieXRlcykgb2YgY29tcHJlc3NlZCBkYXRhIGZvbGxvd2luZy4gKi8KLSsgIGNvbXByZXNzZWRMZW4gPSAoaW50KVJlYWRDb21wYWN0TGVuKCk7Ci0rICBpZiAoY29tcHJlc3NlZExlbiA8PSAwKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiSW5jb3JyZWN0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLlxuIik7Ci0rICAgIHJldHVybiBGYWxzZTsKLSsgIH0KLSsKLSsgIC8qIE5vdyBsZXQncyBpbml0aWFsaXplIGNvbXByZXNzaW9uIHN0cmVhbSBpZiBuZWVkZWQuICovCi0rICBzdHJlYW1faWQgPSBjb21wX2N0bCAmIDB4MDM7Ci0rICB6cyA9ICZ6bGliU3RyZWFtW3N0cmVhbV9pZF07Ci0rICBpZiAoIXpsaWJTdHJlYW1BY3RpdmVbc3RyZWFtX2lkXSkgewotKyAgICB6cy0+emFsbG9jID0gWl9OVUxMOwotKyAgICB6cy0+emZyZWUgPSBaX05VTEw7Ci0rICAgIHpzLT5vcGFxdWUgPSBaX05VTEw7Ci0rICAgIGVyciA9IGluZmxhdGVJbml0KHpzKTsKLSsgICAgaWYgKGVyciAhPSBaX09LKSB7Ci0rICAgICAgaWYgKHpzLT5tc2cgIT0gTlVMTCkKLSsJZnByaW50ZihzdGRlcnIsICJJbmZsYXRlSW5pdCBlcnJvcjogJXMuXG4iLCB6cy0+bXNnKTsKLSsgICAgICByZXR1cm4gRmFsc2U7Ci0rICAgIH0KLSsgICAgemxpYlN0cmVhbUFjdGl2ZVtzdHJlYW1faWRdID0gVHJ1ZTsKLSsgIH0KLSsKLSsgIC8qIFJlYWQsIGRlY29kZSBhbmQgZHJhdyBhY3R1YWwgcGl4ZWwgZGF0YSBpbiBhIGxvb3AuICovCi0rCi0rICBjb21wcmVzc2VkRGF0YSA9IChjaGFyICopcmVhbGxvYyhjb21wcmVzc2VkRGF0YSwgY29tcHJlc3NlZExlbik7Ci0rICBpZiAoIWNvbXByZXNzZWREYXRhKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOwotKyAgICByZXR1cm4gRmFsc2U7Ci0rICB9Ci0rICB1bmNvbXByZXNzZWREYXRhID0gKGNoYXIgKilyZWFsbG9jKHVuY29tcHJlc3NlZERhdGEsIHJoICogcm93U2l6ZSk7Ci0rICBpZiAoIXVuY29tcHJlc3NlZERhdGEpIHsKLSsgICAgZnByaW50ZihzdGRlcnIsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7Ci0rICAgIHJldHVybiBGYWxzZTsKLSsgIH0KLSsKLSsgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoY29tcHJlc3NlZERhdGEsIGNvbXByZXNzZWRMZW4pKQotKyAgICByZXR1cm4gRmFsc2U7Ci0rICB6cy0+bmV4dF9pbiA9IChCeXRlZiAqKWNvbXByZXNzZWREYXRhOwotKyAgenMtPmF2YWlsX2luID0gY29tcHJlc3NlZExlbjsKLSsgIHpzLT5uZXh0X291dCA9IChCeXRlZiAqKXVuY29tcHJlc3NlZERhdGE7Ci0rICB6cy0+YXZhaWxfb3V0ID0gcmggKiByb3dTaXplOwotKwotKyAgZXJyID0gaW5mbGF0ZSh6cywgWl9TWU5DX0ZMVVNIKTsKLSsgIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0rICAgIGlmICh6cy0+bXNnICE9IE5VTEwpIHsKLSsgICAgICBmcHJpbnRmKHN0ZGVyciwgIkluZmxhdGUgZXJyb3I6ICVzLlxuIiwgenMtPm1zZyk7Ci0rICAgIH0gZWxzZSB7Ci0rICAgICAgZnByaW50ZihzdGRlcnIsICJJbmZsYXRlIGVycm9yOiAlZC5cbiIsIGVycik7Ci0rICAgIH0KLSsgICAgcmV0dXJuIEZhbHNlOwotKyAgfQotKwotKyAgZmlsdGVyRm4ocngsIHJ5LCByaCk7Ci0rICBpZiAoYXBwRGF0YS51c2VCR1IyMzMpIENvcHlEYXRhVG9JbWFnZShidWZmZXIsIHJ4LCByeSwgcncsIHJoKTsKLSsgIGlmICghYXBwRGF0YS5kb3VibGVCdWZmZXIpIENvcHlJbWFnZVRvU2NyZWVuKHJ4LCByeSwgcncsIHJoKTsKLSsKLSsgIHJldHVybiBUcnVlOwotK30KLSsKLSsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSsgKgotKyAqIEZpbHRlciBzdHVmZi4KLSsgKgotKyAqLwotKwotKy8qCi0rICAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gcmZicHJvdG8uYzoKLSsgICAgIHN0YXRpYyBCb29sIGN1dFplcm9zOwotKyAgICAgc3RhdGljIGludCByZWN0V2lkdGgsIHJlY3RDb2xvcnM7Ci0rICAgICBzdGF0aWMgQ0FSRDggdGlnaHRQYWxldHRlWzI1Nio0XTsKLSsgICAgIHN0YXRpYyBDQVJEOCB0aWdodFByZXZSb3dbMjA0OCozKnNpemVvZihDQVJEMTYpXTsKLSsqLwotKwotK3N0YXRpYyBpbnQKLStJbml0RmlsdGVyQ29weUJQUCAoaW50IHJ3LCBpbnQgcmgpCi0rewotKyAgcmVjdFdpZHRoID0gcnc7Ci0rCi0rI2lmIEJQUCA9PSAzMgotKyAgaWYgKG15Rm9ybWF0LmRlcHRoID09IDI0ICYmIG15Rm9ybWF0LnJlZE1heCA9PSAweEZGICYmCi0rICAgICAgbXlGb3JtYXQuZ3JlZW5NYXggPT0gMHhGRiAmJiBteUZvcm1hdC5ibHVlTWF4ID09IDB4RkYpIHsKLSsgICAgY3V0WmVyb3MgPSBUcnVlOwotKyAgICByZXR1cm4gMjQ7Ci0rICB9IGVsc2UgewotKyAgICBjdXRaZXJvcyA9IEZhbHNlOwotKyAgfQotKyNlbmRpZgotKwotKyAgcmV0dXJuIEJQUDsKLSt9Ci0rCi0rc3RhdGljIHZvaWQKLStGaWx0ZXJDb3B5QlBQIChpbnQgc3JjeCwgaW50IHNyY3ksIGludCBudW1Sb3dzKQotK3sKLSsgIENBUkRCUFAgKmRzdCA9IChDQVJEQlBQICopJmltYWdlLT5kYXRhW3NyY3kgKiBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjeCAqIGltYWdlLT5iaXRzX3Blcl9waXhlbC84XTsKLSsgIGludCBkc3R3ID0gaW1hZ2UtPmJ5dGVzX3Blcl9saW5lIC8gKGltYWdlLT5iaXRzX3Blcl9waXhlbCAvIDgpOwotKyAgaW50IHk7Ci0rI2lmIEJQUCA9PSAzMgotKyAgaW50IHg7Ci0rI2VuZGlmCi0rCi0rICBpZiAoYXBwRGF0YS51c2VCR1IyMzMpIHsKLSsgICAgZHN0ID0gKENBUkRCUFAgKilidWZmZXI7Ci0rICAgIGRzdHcgPSByZWN0V2lkdGg7Ci0rICB9Ci0rCi0rI2lmIEJQUCA9PSAzMgotKyAgaWYgKGN1dFplcm9zKSB7Ci0rICAgIGZvciAoeSA9IDA7IHkgPCBudW1Sb3dzOyB5KyspIHsKLSsgICAgICBmb3IgKHggPSAwOyB4IDwgcmVjdFdpZHRoOyB4KyspIHsKLSsJZHN0W3kqZHN0dyt4XSA9Ci0rCSAgUkdCMjRfVE9fUElYRUwzMih1bmNvbXByZXNzZWREYXRhWyh5KnJlY3RXaWR0aCt4KSozXSwKLSsJCQkgICB1bmNvbXByZXNzZWREYXRhWyh5KnJlY3RXaWR0aCt4KSozKzFdLAotKwkJCSAgIHVuY29tcHJlc3NlZERhdGFbKHkqcmVjdFdpZHRoK3gpKjMrMl0pOwotKyAgICAgIH0KLSsgICAgfQotKyAgICByZXR1cm47Ci0rICB9Ci0rI2VuZGlmCi0rCi0rICBmb3IgKHkgPSAwOyB5IDwgbnVtUm93czsgeSsrKQotKyAgICBtZW1jcHkgKCZkc3RbeSpkc3R3XSwgJnVuY29tcHJlc3NlZERhdGFbeSpyZWN0V2lkdGhdLCByZWN0V2lkdGggKiAoQlBQIC8gOCkpOwotK30KLSsKLStzdGF0aWMgaW50Ci0rSW5pdEZpbHRlckdyYWRpZW50QlBQIChpbnQgcncsIGludCByaCkKLSt7Ci0rICBpbnQgYml0czsKLSsKLSsgIGJpdHMgPSBJbml0RmlsdGVyQ29weUJQUChydywgcmgpOwotKyAgaWYgKGN1dFplcm9zKQotKyAgICBtZW1zZXQodGlnaHRQcmV2Um93LCAwLCBydyAqIDMpOwotKyAgZWxzZQotKyAgICBtZW1zZXQodGlnaHRQcmV2Um93LCAwLCBydyAqIDMgKiBzaXplb2YoQ0FSRDE2KSk7Ci0rCi0rICByZXR1cm4gYml0czsKLSt9Ci0rCi0rI2lmIEJQUCA9PSAzMgotKwotK3N0YXRpYyB2b2lkCi0rRmlsdGVyR3JhZGllbnQyNCAoaW50IHNyY3gsIGludCBzcmN5LCBpbnQgbnVtUm93cykKLSt7Ci0rICBDQVJEQlBQICpkc3QgPSAoQ0FSREJQUCAqKSZpbWFnZS0+ZGF0YVtzcmN5ICogaW1hZ2UtPmJ5dGVzX3Blcl9saW5lCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNyY3ggKiBpbWFnZS0+Yml0c19wZXJfcGl4ZWwvOF07Ci0rICBpbnQgZHN0dyA9IGltYWdlLT5ieXRlc19wZXJfbGluZSAvIChpbWFnZS0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKLSsgIGludCB4LCB5LCBjOwotKyAgQ0FSRDggdGhpc1Jvd1syMDQ4KjNdOwotKyAgQ0FSRDggcGl4WzNdOwotKyAgaW50IGVzdFszXTsKLSsKLSsgIGlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotKyAgICBkc3QgPSAoQ0FSREJQUCAqKWJ1ZmZlcjsKLSsgICAgZHN0dyA9IHJlY3RXaWR0aDsKLSsgIH0KLSsKLSsgIGZvciAoeSA9IDA7IHkgPCBudW1Sb3dzOyB5KyspIHsKLSsKLSsgICAgLyogRmlyc3QgcGl4ZWwgaW4gYSByb3cgKi8KLSsgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgewotKyAgICAgIHBpeFtjXSA9IHRpZ2h0UHJldlJvd1tjXSArIHVuY29tcHJlc3NlZERhdGFbeSpyZWN0V2lkdGgqMytjXTsKLSsgICAgICB0aGlzUm93W2NdID0gcGl4W2NdOwotKyAgICB9Ci0rICAgIGRzdFt5KmRzdHddID0gUkdCMjRfVE9fUElYRUwzMihwaXhbMF0sIHBpeFsxXSwgcGl4WzJdKTsKLSsKLSsgICAgLyogUmVtYWluaW5nIHBpeGVscyBvZiBhIHJvdyAqLwotKyAgICBmb3IgKHggPSAxOyB4IDwgcmVjdFdpZHRoOyB4KyspIHsKLSsgICAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7Ci0rCWVzdFtjXSA9IChpbnQpdGlnaHRQcmV2Um93W3gqMytjXSArIChpbnQpcGl4W2NdIC0KLSsJCSAoaW50KXRpZ2h0UHJldlJvd1soeC0xKSozK2NdOwotKwlpZiAoZXN0W2NdID4gMHhGRikgewotKwkgIGVzdFtjXSA9IDB4RkY7Ci0rCX0gZWxzZSBpZiAoZXN0W2NdIDwgMHgwMCkgewotKwkgIGVzdFtjXSA9IDB4MDA7Ci0rCX0KLSsJcGl4W2NdID0gKENBUkQ4KWVzdFtjXSArIGJ1ZmZlclsoeSpyZWN0V2lkdGgreCkqMytjXTsKLSsJdGhpc1Jvd1t4KjMrY10gPSBwaXhbY107Ci0rICAgICAgfQotKyAgICAgIGRzdFt5KmRzdHcreF0gPSBSR0IyNF9UT19QSVhFTDMyKHBpeFswXSwgcGl4WzFdLCBwaXhbMl0pOwotKyAgICB9Ci0rCi0rICAgIG1lbWNweSh0aWdodFByZXZSb3csIHRoaXNSb3csIHJlY3RXaWR0aCAqIDMpOwotKyAgfQotK30KLSsKLSsjZW5kaWYKLSsKLStzdGF0aWMgdm9pZAotK0ZpbHRlckdyYWRpZW50QlBQIChpbnQgc3JjeCwgaW50IHNyY3ksIGludCBudW1Sb3dzKQotK3sKLSsgIGludCB4LCB5LCBjOwotKyAgQ0FSREJQUCAqZHN0ID0gKENBUkRCUFAgKikmaW1hZ2UtPmRhdGFbc3JjeSAqIGltYWdlLT5ieXRlc19wZXJfbGluZQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcmN4ICogaW1hZ2UtPmJpdHNfcGVyX3BpeGVsLzhdOwotKyAgaW50IGRzdHcgPSBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUgLyAoaW1hZ2UtPmJpdHNfcGVyX3BpeGVsIC8gOCk7Ci0rICBDQVJEQlBQICpzcmMgPSAoQ0FSREJQUCAqKXVuY29tcHJlc3NlZERhdGE7Ci0rICBDQVJEMTYgKnRoYXRSb3cgPSAoQ0FSRDE2ICopdGlnaHRQcmV2Um93OwotKyAgQ0FSRDE2IHRoaXNSb3dbMjA0OCozXTsKLSsgIENBUkQxNiBwaXhbM107Ci0rICBDQVJEMTYgbWF4WzNdOwotKyAgaW50IHNoaWZ0WzNdOwotKyAgaW50IGVzdFszXTsKLSsKLSsgIGlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotKyAgICBkc3QgPSAoQ0FSREJQUCAqKWJ1ZmZlcjsKLSsgICAgZHN0dyA9IHJlY3RXaWR0aDsKLSsgIH0KLSsKLSsjaWYgQlBQID09IDMyCi0rICBpZiAoY3V0WmVyb3MpIHsKLSsgICAgRmlsdGVyR3JhZGllbnQyNChzcmN4LCBzcmN5LCBudW1Sb3dzKTsKLSsgICAgcmV0dXJuOwotKyAgfQotKyNlbmRpZgotKwotKyAgbWF4WzBdID0gbXlGb3JtYXQucmVkTWF4OwotKyAgbWF4WzFdID0gbXlGb3JtYXQuZ3JlZW5NYXg7Ci0rICBtYXhbMl0gPSBteUZvcm1hdC5ibHVlTWF4OwotKwotKyAgc2hpZnRbMF0gPSBteUZvcm1hdC5yZWRTaGlmdDsKLSsgIHNoaWZ0WzFdID0gbXlGb3JtYXQuZ3JlZW5TaGlmdDsKLSsgIHNoaWZ0WzJdID0gbXlGb3JtYXQuYmx1ZVNoaWZ0OwotKwotKyAgZm9yICh5ID0gMDsgeSA8IG51bVJvd3M7IHkrKykgewotKwotKyAgICAvKiBGaXJzdCBwaXhlbCBpbiBhIHJvdyAqLwotKyAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7Ci0rICAgICAgcGl4W2NdID0gKENBUkQxNikoKHNyY1t5KnJlY3RXaWR0aF0gPj4gc2hpZnRbY10pICsgdGhhdFJvd1tjXSAmIG1heFtjXSk7Ci0rICAgICAgdGhpc1Jvd1tjXSA9IHBpeFtjXTsKLSsgICAgfQotKyAgICBkc3RbeSpkc3R3XSA9IFJHQl9UT19QSVhFTChCUFAsIHBpeFswXSwgcGl4WzFdLCBwaXhbMl0pOwotKwotKyAgICAvKiBSZW1haW5pbmcgcGl4ZWxzIG9mIGEgcm93ICovCi0rICAgIGZvciAoeCA9IDE7IHggPCByZWN0V2lkdGg7IHgrKykgewotKyAgICAgIGZvciAoYyA9IDA7IGMgPCAzOyBjKyspIHsKLSsJZXN0W2NdID0gKGludCl0aGF0Um93W3gqMytjXSArIChpbnQpcGl4W2NdIC0gKGludCl0aGF0Um93Wyh4LTEpKjMrY107Ci0rCWlmIChlc3RbY10gPiAoaW50KW1heFtjXSkgewotKwkgIGVzdFtjXSA9IChpbnQpbWF4W2NdOwotKwl9IGVsc2UgaWYgKGVzdFtjXSA8IDApIHsKLSsJICBlc3RbY10gPSAwOwotKwl9Ci0rCXBpeFtjXSA9IChDQVJEMTYpKChzcmNbeSpyZWN0V2lkdGgreF0gPj4gc2hpZnRbY10pICsgZXN0W2NdICYgbWF4W2NdKTsKLSsJdGhpc1Jvd1t4KjMrY10gPSBwaXhbY107Ci0rICAgICAgfQotKyAgICAgIGRzdFt5KmRzdHcreF0gPSBSR0JfVE9fUElYRUwoQlBQLCBwaXhbMF0sIHBpeFsxXSwgcGl4WzJdKTsKLSsgICAgfQotKyAgICBtZW1jcHkodGhhdFJvdywgdGhpc1JvdywgcmVjdFdpZHRoICogMyAqIHNpemVvZihDQVJEMTYpKTsKLSsgIH0KLSt9Ci0rCi0rc3RhdGljIGludAotK0luaXRGaWx0ZXJQYWxldHRlQlBQIChpbnQgcncsIGludCByaCkKLSt7Ci0rICBpbnQgaTsKLSsgIENBUkQ4IG51bUNvbG9yczsKLSsgIENBUkRCUFAgKnBhbGV0dGUgPSAoQ0FSREJQUCAqKXRpZ2h0UGFsZXR0ZTsKLSsKLSsgIHJlY3RXaWR0aCA9IHJ3OwotKwotKyAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcigoY2hhciopJm51bUNvbG9ycywgMSkpCi0rICAgIHJldHVybiAwOwotKwotKyAgcmVjdENvbG9ycyA9IChpbnQpbnVtQ29sb3JzOwotKyAgaWYgKCsrcmVjdENvbG9ycyA8IDIpCi0rICAgIHJldHVybiAwOwotKwotKyNpZiBCUFAgPT0gMzIKLSsgIGlmIChteUZvcm1hdC5kZXB0aCA9PSAyNCAmJiBteUZvcm1hdC5yZWRNYXggPT0gMHhGRiAmJgotKyAgICAgIG15Rm9ybWF0LmdyZWVuTWF4ID09IDB4RkYgJiYgbXlGb3JtYXQuYmx1ZU1heCA9PSAweEZGKSB7Ci0rICAgIGlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIqKSZ0aWdodFBhbGV0dGUsIHJlY3RDb2xvcnMgKiAzKSkKLSsgICAgICByZXR1cm4gMDsKLSsgICAgZm9yIChpID0gcmVjdENvbG9ycyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0rICAgICAgcGFsZXR0ZVtpXSA9IFJHQjI0X1RPX1BJWEVMMzIodGlnaHRQYWxldHRlW2kqM10sCi0rCQkJCSAgICB0aWdodFBhbGV0dGVbaSozKzFdLAotKwkJCQkgICAgdGlnaHRQYWxldHRlW2kqMysyXSk7Ci0rICAgIH0KLSsgICAgcmV0dXJuIChyZWN0Q29sb3JzID09IDIpID8gMSA6IDg7Ci0rICB9Ci0rI2VuZGlmCi0rCi0rICBpZiAoIVJlYWRGcm9tUkZCU2VydmVyKChjaGFyKikmdGlnaHRQYWxldHRlLCByZWN0Q29sb3JzICogKEJQUCAvIDgpKSkKLSsgICAgcmV0dXJuIDA7Ci0rCi0rICByZXR1cm4gKHJlY3RDb2xvcnMgPT0gMikgPyAxIDogODsKLSt9Ci0rCi0rc3RhdGljIHZvaWQKLStGaWx0ZXJQYWxldHRlQlBQIChpbnQgc3JjeCwgaW50IHNyY3ksIGludCBudW1Sb3dzKQotK3sKLSsgIGludCB4LCB5LCBiLCB3OwotKyAgQ0FSREJQUCAqZHN0ID0gKENBUkRCUFAgKikmaW1hZ2UtPmRhdGFbc3JjeSAqIGltYWdlLT5ieXRlc19wZXJfbGluZQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcmN4ICogaW1hZ2UtPmJpdHNfcGVyX3BpeGVsLzhdOwotKyAgaW50IGRzdHcgPSBpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUgLyAoaW1hZ2UtPmJpdHNfcGVyX3BpeGVsIC8gOCk7Ci0rICBDQVJEOCAqc3JjID0gKENBUkQ4ICopdW5jb21wcmVzc2VkRGF0YTsKLSsgIENBUkRCUFAgKnBhbGV0dGUgPSAoQ0FSREJQUCAqKXRpZ2h0UGFsZXR0ZTsKLSsKLSsgIGlmIChhcHBEYXRhLnVzZUJHUjIzMykgewotKyAgICBkc3QgPSAoQ0FSREJQUCAqKWJ1ZmZlcjsKLSsgICAgZHN0dyA9IHJlY3RXaWR0aDsKLSsgIH0KLSsKLSsgIGlmIChyZWN0Q29sb3JzID09IDIpIHsKLSsgICAgdyA9IChyZWN0V2lkdGggKyA3KSAvIDg7Ci0rICAgIGZvciAoeSA9IDA7IHkgPCBudW1Sb3dzOyB5KyspIHsKLSsgICAgICBmb3IgKHggPSAwOyB4IDwgcmVjdFdpZHRoIC8gODsgeCsrKSB7Ci0rCWZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKQotKwkgIGRzdFt5KmRzdHcreCo4KzctYl0gPSBwYWxldHRlW3NyY1t5KncreF0gPj4gYiAmIDFdOwotKyAgICAgIH0KLSsgICAgICBmb3IgKGIgPSA3OyBiID49IDggLSByZWN0V2lkdGggJSA4OyBiLS0pIHsKLSsJZHN0W3kqZHN0dyt4KjgrNy1iXSA9IHBhbGV0dGVbc3JjW3kqdyt4XSA+PiBiICYgMV07Ci0rICAgICAgfQotKyAgICB9Ci0rICB9IGVsc2UgewotKyAgICBmb3IgKHkgPSAwOyB5IDwgbnVtUm93czsgeSsrKQotKyAgICAgIGZvciAoeCA9IDA7IHggPCByZWN0V2lkdGg7IHgrKykKLSsJZHN0W3kqZHN0dyt4XSA9IHBhbGV0dGVbKGludClzcmNbeSpyZWN0V2lkdGgreF1dOwotKyAgfQotK30KLSsKLSsjaWYgQlBQICE9IDgKLSsKLSsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSsgKgotKyAqIEpQRUcgZGVjb21wcmVzc2lvbi4KLSsgKgotKyAqLwotKwotKy8qCi0rICAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gcmZicHJvdG8uYzoKLSsgICAgIHN0YXRpYyBCb29sIGpwZWdFcnJvcjsKLSsgICAgIHN0YXRpYyBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpwZWdTcmNNYW5hZ2VyOwotKyAgICAgc3RhdGljIEpPQ1RFVCAqanBlZ0J1ZmZlclB0cjsKLSsgICAgIHN0YXRpYyBzaXplX3QgKmpwZWdCdWZmZXJMZW47Ci0rKi8KLSsKLStzdGF0aWMgQm9vbAotK0RlY29tcHJlc3NKcGVnUmVjdEJQUChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKLSt7Ci0rICBpbnQgY29tcHJlc3NlZExlbjsKLSsgIGNoYXIgKmRzdHB0cjsKLSsgIGludCBwcywgZmxhZ3M9MDsKLSsKLSsgIGNvbXByZXNzZWRMZW4gPSAoaW50KVJlYWRDb21wYWN0TGVuKCk7Ci0rICBpZiAoY29tcHJlc3NlZExlbiA8PSAwKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiSW5jb3JyZWN0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLlxuIik7Ci0rICAgIHJldHVybiBGYWxzZTsKLSsgIH0KLSsKLSsgIGNvbXByZXNzZWREYXRhID0gKGNoYXIgKilyZWFsbG9jKGNvbXByZXNzZWREYXRhLCBjb21wcmVzc2VkTGVuKTsKLSsgIGlmIChjb21wcmVzc2VkRGF0YSA9PSBOVUxMKSB7Ci0rICAgIGZwcmludGYoc3RkZXJyLCAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKLSsgICAgcmV0dXJuIEZhbHNlOwotKyAgfQotKwotKyAgaWYgKCFSZWFkRnJvbVJGQlNlcnZlcihjb21wcmVzc2VkRGF0YSwgY29tcHJlc3NlZExlbikpIHsKLSsgICAgcmV0dXJuIEZhbHNlOwotKyAgfQotKwotKyAgaWYoIXRqaG5kKSB7Ci0rICAgIGlmKCh0amhuZD10akluaXREZWNvbXByZXNzKCkpPT1OVUxMKSB7Ci0rICAgICAgZnByaW50ZihzdGRlcnIsICJUdXJib0pQRUcgZXJyb3I6ICVzXG4iLCB0akdldEVycm9yU3RyKCkpOwotKyAgICAgIHJldHVybiBGYWxzZTsKLSsgICAgfQotKyAgfSAgICAgCi0rCi0rICBwcz1pbWFnZS0+Yml0c19wZXJfcGl4ZWwvODsKLSsgIGlmKG15Rm9ybWF0LmJpZ0VuZGlhbiAmJiBwcz09NCkgZmxhZ3N8PVRKX0FMUEhBRklSU1Q7Ci0rICBpZihteUZvcm1hdC5yZWRTaGlmdD09MTYgJiYgbXlGb3JtYXQuYmx1ZVNoaWZ0PT0wKQotKyAgICBmbGFnc3w9VEpfQkdSOwotKyAgaWYobXlGb3JtYXQuYmlnRW5kaWFuKSBmbGFnc149VEpfQkdSOwotKwotKyAgZHN0cHRyPSZpbWFnZS0+ZGF0YVtpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUqeSt4KnBzXTsKLSsgIGlmKHRqRGVjb21wcmVzcyh0amhuZCwgKHVuc2lnbmVkIGNoYXIgKiljb21wcmVzc2VkRGF0YSwgKHVuc2lnbmVkIGxvbmcpY29tcHJlc3NlZExlbiwKLSsgICAgKHVuc2lnbmVkIGNoYXIgKilkc3RwdHIsIHcsIGltYWdlLT5ieXRlc19wZXJfbGluZSwgaCwgcHMsIGZsYWdzKT09LTEpIHsKLSsgICAgZnByaW50ZihzdGRlcnIsICJUdXJib0pQRUcgZXJyb3I6ICVzXG4iLCB0akdldEVycm9yU3RyKCkpOwotKyAgICByZXR1cm4gRmFsc2U7Ci0rICB9Ci0rCi0rICBpZiAoIWFwcERhdGEuZG91YmxlQnVmZmVyKQotKyAgICBDb3B5SW1hZ2VUb1NjcmVlbih4LCB5LCB3LCBoKTsKLSsKLSsgIHJldHVybiBUcnVlOwotK30KLSsKLSsjZW5kaWYKLSsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3R1cmJvdm5jL3R1cmJvanBlZy5oIHZuY191bml4c3JjL3ZuY3ZpZXdlci90dXJib3ZuYy90dXJib2pwZWcuaAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3R1cmJvdm5jL3R1cmJvanBlZy5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3R1cmJvdm5jL3R1cmJvanBlZy5oCTIwMDgtMDQtMDMgMDQ6Mjg6NTYuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMCwwICsxLDIyOSBAQAotKy8qIENvcHlyaWdodCAoQykyMDA0IExhbmRtYXJrIEdyYXBoaWNzCi0rICogQ29weXJpZ2h0IChDKTIwMDUsIDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotKyAqCi0rICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmUgYW5kIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlcgotKyAqIHRoZSB0ZXJtcyBvZiB0aGUgd3hXaW5kb3dzIExpYnJhcnkgTGljZW5zZSwgVmVyc2lvbiAzLjEgb3IgKGF0IHlvdXIgb3B0aW9uKQotKyAqIGFueSBsYXRlciB2ZXJzaW9uLiAgVGhlIGZ1bGwgbGljZW5zZSBpcyBpbiB0aGUgTElDRU5TRS50eHQgZmlsZSBpbmNsdWRlZAotKyAqIHdpdGggdGhpcyBkaXN0cmlidXRpb24uCi0rICoKLSsgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSsgKiB3eFdpbmRvd3MgTGlicmFyeSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0rICovCi0rCi0rI2lmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChETExERUZJTkUpCi0rI2RlZmluZSBETExFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0rI2Vsc2UKLSsjZGVmaW5lIERMTEVYUE9SVAotKyNlbmRpZgotKwotKyNkZWZpbmUgRExMQ0FMTAotKwotKy8qIFN1YnNhbXBsaW5nICovCi0rI2RlZmluZSBOVU1TVUJPUFQgNAotKwotK2VudW0ge1RKXzQ0ND0wLCBUSl80MjIsIFRKXzQxMSwgVEpfR1JBWVNDQUxFfTsKLSsKLSsvKiBGbGFncyAqLwotKyNkZWZpbmUgVEpfQkdSICAgICAgIDEKLSsjZGVmaW5lIFRKX0JPVFRPTVVQICAyCi0rI2RlZmluZSBUSl9GT1JDRU1NWCAgOCAgIC8qIEZvcmNlIElQUCB0byB1c2UgTU1YIGNvZGUgZXZlbiBpZiBTU0UgYXZhaWxhYmxlICovCi0rI2RlZmluZSBUSl9GT1JDRVNTRSAgMTYgIC8qIEZvcmNlIElQUCB0byB1c2UgU1NFMSBjb2RlIGV2ZW4gaWYgU1NFMiBhdmFpbGFibGUgKi8KLSsjZGVmaW5lIFRKX0ZPUkNFU1NFMiAzMiAgLyogRm9yY2UgSVBQIHRvIHVzZSBTU0UyIGNvZGUgKHVzZWZ1bCBpZiBhdXRvLWRldGVjdCBpcyBub3Qgd29ya2luZyBwcm9wZXJseSkgKi8KLSsjZGVmaW5lIFRKX0FMUEhBRklSU1QgNjQgLyogQkdSIGJ1ZmZlciBpcyBBQkdSIGFuZCBSR0IgYnVmZmVyIGlzIEFSR0IgKi8KLSsjZGVmaW5lIFRKX0ZPUkNFU1NFMyAxMjggLyogRm9yY2UgSVBQIHRvIHVzZSBTU0UzIGNvZGUgKHVzZWZ1bCBpZiBhdXRvLWRldGVjdCBpcyBub3Qgd29ya2luZyBwcm9wZXJseSkgKi8KLSsKLSt0eXBlZGVmIHZvaWQqIHRqaGFuZGxlOwotKwotKyNkZWZpbmUgVEpQQUQocCkgKCgocCkrMykmKH4zKSkKLSsjaWZuZGVmIG1heAotKyAjZGVmaW5lIG1heChhLGIpICgoYSk+KGIpPyhhKTooYikpCi0rI2VuZGlmCi0rCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIiB7Ci0rI2VuZGlmCi0rCi0rLyogQVBJIGZvbGxvd3MgKi8KLSsKLSsKLSsvKgotKyAgdGpoYW5kbGUgdGpJbml0Q29tcHJlc3Modm9pZCkKLSsKLSsgIENyZWF0ZXMgYSBuZXcgSlBFRyBjb21wcmVzc29yIGluc3RhbmNlLCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgc3RydWN0dXJlcywKLSsgIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBpbnN0YW5jZS4gIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgb25seQotKyAgbmVlZCB0byBjYWxsIHRoaXMgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIG9yIG9uY2UgZm9yIGVhY2gKLSsgIGNvbmN1cnJlbnQgdGhyZWFkLiAgRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBldmVyeSB0aW1lIHlvdQotKyAgY29tcHJlc3MgYW4gaW1hZ2UsIGJlY2F1c2UgdGhpcyB3aWxsIGNhdXNlIHBlcmZvcm1hbmNlIHRvIHN1ZmZlci4KLSsKLSsgIFJFVFVSTlM6IE5VTEwgb24gZXJyb3IKLSsqLwotK0RMTEVYUE9SVCB0amhhbmRsZSBETExDQUxMIHRqSW5pdENvbXByZXNzKHZvaWQpOwotKwotKwotKy8qCi0rICBpbnQgdGpDb21wcmVzcyh0amhhbmRsZSBqLAotKyAgICAgdW5zaWduZWQgY2hhciAqc3JjYnVmLCBpbnQgd2lkdGgsIGludCBwaXRjaCwgaW50IGhlaWdodCwgaW50IHBpeGVsc2l6ZSwKLSsgICAgIHVuc2lnbmVkIGNoYXIgKmRzdGJ1ZiwgdW5zaWduZWQgbG9uZyAqc2l6ZSwKLSsgICAgIGludCBqcGVnc3Vic2FtcCwgaW50IGpwZWdxdWFsLCBpbnQgZmxhZ3MpCi0rCi0rICBbSU5QVVRdIGogPSBpbnN0YW5jZSBoYW5kbGUgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0bwotKyAgICAgdGpJbml0Q29tcHJlc3MoKQotKyAgW0lOUFVUXSBzcmNidWYgPSBwb2ludGVyIHRvIHVzZXItYWxsb2NhdGVkIGltYWdlIGJ1ZmZlciBjb250YWluaW5nIHBpeGVscyBpbgotKyAgICAgUkdCKEEpIG9yIEJHUihBKSBmb3JtCi0rICBbSU5QVVRdIHdpZHRoID0gIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBzb3VyY2UgaW1hZ2UKLSsgIFtJTlBVVF0gcGl0Y2ggPSBieXRlcyBwZXIgbGluZSBvZiB0aGUgc291cmNlIGltYWdlICh3aWR0aCpwaXhlbHNpemUgaWYgdGhlCi0rICAgICBiaXRtYXAgaXMgdW5wYWRkZWQsIGVsc2UgVEpQQUQod2lkdGgqcGl4ZWxzaXplKSBpZiBlYWNoIGxpbmUgb2YgdGhlIGJpdG1hcAotKyAgICAgaXMgcGFkZGVkIHRvIHRoZSBuZWFyZXN0IDMyLWJpdCBib3VuZGFyeSwgc3VjaCBhcyBpcyB0aGUgY2FzZSBmb3IgV2luZG93cwotKyAgICAgYml0bWFwcy4gIFlvdSBjYW4gYWxzbyBiZSBjbGV2ZXIgYW5kIHVzZSB0aGlzIHBhcmFtZXRlciB0byBza2lwIGxpbmVzLCBldGMuLAotKyAgICAgYXMgbG9uZyBhcyB0aGUgcGl0Y2ggaXMgZ3JlYXRlciB0aGFuIDAuKQotKyAgW0lOUFVUXSBoZWlnaHQgPSBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIHNvdXJjZSBpbWFnZQotKyAgW0lOUFVUXSBwaXhlbHNpemUgPSBzaXplIChpbiBieXRlcykgb2YgZWFjaCBwaXhlbCBpbiB0aGUgc291cmNlIGltYWdlCi0rICAgICBSR0JBIGFuZCBCR1JBOiA0LCBSR0IgYW5kIEJHUjogMwotKyAgW0lOUFVUXSBkc3RidWYgPSBwb2ludGVyIHRvIHVzZXItYWxsb2NhdGVkIGltYWdlIGJ1ZmZlciB3aGljaCB3aWxsIHJlY2VpdmUKLSsgICAgIHRoZSBKUEVHIGltYWdlLiAgVXNlIHRoZSBtYWNybyBUSkJVRlNJWkUod2lkdGgsIGhlaWdodCkgdG8gZGV0ZXJtaW5lCi0rICAgICB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBmb3IgdGhpcyBidWZmZXIgYmFzZWQgb24gdGhlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQuCi0rICBbT1VUUFVUXSBzaXplID0gcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIHdoaWNoIHJlY2VpdmVzIHRoZSBzaXplIChpbiBieXRlcykKLSsgICAgIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlCi0rICBbSU5QVVRdIGpwZWdzdWJzYW1wID0gU3BlY2lmaWVzIGVpdGhlciA0OjE6MSwgNDoyOjIsIG9yIDQ6NDo0IHN1YnNhbXBsaW5nLgotKyAgICAgV2hlbiB0aGUgaW1hZ2UgaXMgY29udmVydGVkIGZyb20gdGhlIFJHQiB0byBZQ2JDciBjb2xvcnNwYWNlIGFzIHBhcnQgb2YgdGhlCi0rICAgICBKUEVHIGNvbXByZXNzaW9uIHByb2Nlc3MsIGV2ZXJ5IG90aGVyIENiIGFuZCBDciAoY2hyb21pbmFuY2UpIHBpeGVsIGNhbiBiZQotKyAgICAgZGlzY2FyZGVkIHRvIHByb2R1Y2UgYSBzbWFsbGVyIGltYWdlIHdpdGggbGl0dGxlIHBlcmNlcHRpYmxlIGxvc3Mgb2YKLSsgICAgIGltYWdlIGNsYXJpdHkgKHRoZSBodW1hbiBleWUgaXMgbW9yZSBzZW5zaXRpdmUgdG8gc21hbGwgY2hhbmdlcyBpbgotKyAgICAgYnJpZ2h0bmVzcyB0aGFuIHNtYWxsIGNoYW5nZXMgaW4gY29sb3IuKQotKwotKyAgICAgVEpfNDExOiA0OjE6MSBzdWJzYW1wbGluZy4gIERpc2NhcmRzIGV2ZXJ5IG90aGVyIENiLCBDciBwaXhlbCBpbiBib3RoCi0rICAgICAgICBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaXJlY3Rpb25zLgotKyAgICAgVEpfNDIyOiA0OjI6MiBzdWJzYW1wbGluZy4gIERpc2NhcmRzIGV2ZXJ5IG90aGVyIENiLCBDciBwaXhlbCBvbmx5IGluCi0rICAgICAgICB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24uCi0rICAgICBUSl80NDQ6IG5vIHN1YnNhbXBsaW5nLgotKyAgICAgVEpfR1JBWVNDQUxFOiBHZW5lcmF0ZSBncmF5c2NhbGUgSlBFRyBpbWFnZQotKwotKyAgW0lOUFVUXSBqcGVncXVhbCA9IEpQRUcgcXVhbGl0eSAoYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCBpbmNsdXNpdmUuKQotKyAgW0lOUFVUXSBmbGFncyA9IHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKLSsKLSsgICAgIFRKX0JHUjogVGhlIGNvbXBvbmVudHMgb2YgZWFjaCBwaXhlbCBpbiB0aGUgc291cmNlIGltYWdlIGFyZSBzdG9yZWQgaW4KLSsgICAgICAgIEIsRyxSIG9yZGVyLCBub3QgUixHLEIKLSsgICAgIFRKX0JPVFRPTVVQOiBUaGUgc291cmNlIGltYWdlIGlzIHN0b3JlZCBpbiBib3R0b20tdXAgKFdpbmRvd3MpIG9yZGVyLAotKyAgICAgICAgbm90IHRvcC1kb3duCi0rICAgICBUSl9GT1JDRU1NWDogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSsgICAgICAgIG9mIHRoaXMgY29kZWMtLSBmb3JjZSBJUFAgdG8gdXNlIE1NWCBjb2RlIChieXBhc3MgQ1BVIGF1dG8tZGV0ZWN0aW9uKQotKyAgICAgVEpfRk9SQ0VTU0U6IFZhbGlkIG9ubHkgZm9yIHRoZSBJbnRlbCBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGltcGxlbWVudGF0aW9uCi0rICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UgY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSsgICAgIFRKX0ZPUkNFU1NFMjogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSsgICAgICAgIG9mIHRoaXMgY29kZWMtLSBmb3JjZSBJUFAgdG8gdXNlIFNTRTIgY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSsgICAgIFRKX0ZPUkNFU1NFMzogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSsgICAgICAgIG9mIHRoaXMgY29kZWMtLSBmb3JjZSBJUFAgdG8gdXNlIFNTRTMgY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSsKLSsgIFJFVFVSTlM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSsqLwotK0RMTEVYUE9SVCBpbnQgRExMQ0FMTCB0akNvbXByZXNzKHRqaGFuZGxlIGosCi0rCXVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgaW50IHdpZHRoLCBpbnQgcGl0Y2gsIGludCBoZWlnaHQsIGludCBwaXhlbHNpemUsCi0rCXVuc2lnbmVkIGNoYXIgKmRzdGJ1ZiwgdW5zaWduZWQgbG9uZyAqc2l6ZSwKLSsJaW50IGpwZWdzdWJzYW1wLCBpbnQganBlZ3F1YWwsIGludCBmbGFncyk7Ci0rCi0rRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgRExMQ0FMTCBUSkJVRlNJWkUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSsKLSsvKgotKyAgdGpoYW5kbGUgdGpJbml0RGVjb21wcmVzcyh2b2lkKQotKwotKyAgQ3JlYXRlcyBhIG5ldyBKUEVHIGRlY29tcHJlc3NvciBpbnN0YW5jZSwgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlCi0rICBzdHJ1Y3R1cmVzLCBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgaW5zdGFuY2UuICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsCi0rICBvbmx5IG5lZWQgdG8gY2FsbCB0aGlzIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvZ3JhbSBvciBvbmNlIGZvciBlYWNoCi0rICBjb25jdXJyZW50IHRocmVhZC4gIERvbid0IHRyeSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSB5b3UKLSsgIGRlY29tcHJlc3MgYW4gaW1hZ2UsIGJlY2F1c2UgdGhpcyB3aWxsIGNhdXNlIHBlcmZvcm1hbmNlIHRvIHN1ZmZlci4KLSsKLSsgIFJFVFVSTlM6IE5VTEwgb24gZXJyb3IKLSsqLwotK0RMTEVYUE9SVCB0amhhbmRsZSBETExDQUxMIHRqSW5pdERlY29tcHJlc3Modm9pZCk7Ci0rCi0rCi0rLyoKLSsgIGludCB0akRlY29tcHJlc3NIZWFkZXIodGpoYW5kbGUgaiwKLSsgICAgIHVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotKyAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpCi0rCi0rICBbSU5QVVRdIGogPSBpbnN0YW5jZSBoYW5kbGUgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0bwotKyAgICAgdGpJbml0RGVjb21wcmVzcygpCi0rICBbSU5QVVRdIHNyY2J1ZiA9IHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyB0aGUgSlBFRyBpbWFnZQotKyAgICAgdG8gZGVjb21wcmVzcwotKyAgW0lOUFVUXSBzaXplID0gc2l6ZSBvZiB0aGUgSlBFRyBpbWFnZSBidWZmZXIgKGluIGJ5dGVzKQotKyAgW09VVFBVVF0gd2lkdGggPSB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgSlBFRyBpbWFnZQotKyAgW09VVFBVVF0gaGVpZ2h0ID0gaGVpZ2h0IChpbiBwaXhlbHMpIG9mIHRoZSBKUEVHIGltYWdlCi0rCi0rICBSRVRVUk5TOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0rKi8KLStETExFWFBPUlQgaW50IERMTENBTEwgdGpEZWNvbXByZXNzSGVhZGVyKHRqaGFuZGxlIGosCi0rCXVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotKwlpbnQgKndpZHRoLCBpbnQgKmhlaWdodCk7Ci0rCi0rCi0rLyoKLSsgIGludCB0akRlY29tcHJlc3ModGpoYW5kbGUgaiwKLSsgICAgIHVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotKyAgICAgdW5zaWduZWQgY2hhciAqZHN0YnVmLCBpbnQgd2lkdGgsIGludCBwaXRjaCwgaW50IGhlaWdodCwgaW50IHBpeGVsc2l6ZSwKLSsgICAgIGludCBmbGFncykKLSsKLSsgIFtJTlBVVF0gaiA9IGluc3RhbmNlIGhhbmRsZSBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gYSBjYWxsIHRvCi0rICAgICB0akluaXREZWNvbXByZXNzKCkKLSsgIFtJTlBVVF0gc3JjYnVmID0gcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBKUEVHIGltYWdlCi0rICAgICB0byBkZWNvbXByZXNzCi0rICBbSU5QVVRdIHNpemUgPSBzaXplIG9mIHRoZSBKUEVHIGltYWdlIGJ1ZmZlciAoaW4gYnl0ZXMpCi0rICBbSU5QVVRdIGRzdGJ1ZiA9IHBvaW50ZXIgdG8gdXNlci1hbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIHdoaWNoIHdpbGwgcmVjZWl2ZQotKyAgICAgdGhlIGJpdG1hcCBpbWFnZS4gIFRoaXMgYnVmZmVyIHNob3VsZCBub3JtYWxseSBiZSBwaXRjaCpoZWlnaHQKLSsgICAgIGJ5dGVzIGluIHNpemUsIGFsdGhvdWdoIHRoaXMgcG9pbnRlciBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlY29tcHJlc3MgaW50bwotKyAgICAgYSBzcGVjaWZpYyByZWdpb24gb2YgYSBsYXJnZXIgYnVmZmVyLgotKyAgW0lOUFVUXSB3aWR0aCA9ICB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKLSsgIFtJTlBVVF0gcGl0Y2ggPSBieXRlcyBwZXIgbGluZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UgKHdpZHRoKnBpeGVsc2l6ZSBpZiB0aGUKLSsgICAgIGJpdG1hcCBpcyB1bnBhZGRlZCwgZWxzZSBUSlBBRCh3aWR0aCpwaXhlbHNpemUpIGlmIGVhY2ggbGluZSBvZiB0aGUgYml0bWFwCi0rICAgICBpcyBwYWRkZWQgdG8gdGhlIG5lYXJlc3QgMzItYml0IGJvdW5kYXJ5LCBzdWNoIGFzIGlzIHRoZSBjYXNlIGZvciBXaW5kb3dzCi0rICAgICBiaXRtYXBzLiAgWW91IGNhbiBhbHNvIGJlIGNsZXZlciBhbmQgdXNlIHRoaXMgcGFyYW1ldGVyIHRvIHNraXAgbGluZXMsIGV0Yy4sCi0rICAgICBhcyBsb25nIGFzIHRoZSBwaXRjaCBpcyBncmVhdGVyIHRoYW4gMC4pCi0rICBbSU5QVVRdIGhlaWdodCA9IGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UKLSsgIFtJTlBVVF0gcGl4ZWxzaXplID0gc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggcGl4ZWwgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlCi0rICAgICBSR0JBL1JHQnggYW5kIEJHUkEvQkdSeDogNCwgUkdCIGFuZCBCR1I6IDMKLSsgIFtJTlBVVF0gZmxhZ3MgPSB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nCi0rCi0rICAgICBUSl9CR1I6IFRoZSBjb21wb25lbnRzIG9mIGVhY2ggcGl4ZWwgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHNob3VsZCBiZQotKyAgICAgICAgd3JpdHRlbiBpbiBCLEcsUiBvcmRlciwgbm90IFIsRyxCCi0rICAgICBUSl9CT1RUT01VUDogVGhlIGRlc3RpbmF0aW9uIGltYWdlIHNob3VsZCBiZSBzdG9yZWQgaW4gYm90dG9tLXVwCi0rICAgICAgICAoV2luZG93cykgb3JkZXIsIG5vdCB0b3AtZG93bgotKyAgICAgVEpfRk9SQ0VNTVg6IFZhbGlkIG9ubHkgZm9yIHRoZSBJbnRlbCBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGltcGxlbWVudGF0aW9uCi0rICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBNTVggY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSsgICAgIFRKX0ZPUkNFU1NFOiBWYWxpZCBvbmx5IGZvciB0aGUgSW50ZWwgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBpbXBsZW1lbnRhdGlvbgotKyAgICAgICAgb2YgdGhpcyBjb2RlYy0tIGZvcmNlIElQUCB0byB1c2UgU1NFIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0rICAgICBUSl9GT1JDRVNTRTI6IFZhbGlkIG9ubHkgZm9yIHRoZSBJbnRlbCBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIGltcGxlbWVudGF0aW9uCi0rICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UyIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0rCi0rICBSRVRVUk5TOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0rKi8KLStETExFWFBPUlQgaW50IERMTENBTEwgdGpEZWNvbXByZXNzKHRqaGFuZGxlIGosCi0rCXVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotKwl1bnNpZ25lZCBjaGFyICpkc3RidWYsIGludCB3aWR0aCwgaW50IHBpdGNoLCBpbnQgaGVpZ2h0LCBpbnQgcGl4ZWxzaXplLAotKwlpbnQgZmxhZ3MpOwotKwotKwotKy8qCi0rICBpbnQgdGpEZXN0cm95KHRqaGFuZGxlIGgpCi0rCi0rICBGcmVlcyBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gaW5zdGFuY2UKLSsgIAotKyAgW0lOUFVUXSBoID0gaW5zdGFuY2UgaGFuZGxlIChyZXR1cm5lZCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bwotKyAgICAgdGpJbml0Q29tcHJlc3MoKSBvciB0akluaXREZWNvbXByZXNzKCkKLSsKLSsgIFJFVFVSTlM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSsqLwotK0RMTEVYUE9SVCBpbnQgRExMQ0FMTCB0akRlc3Ryb3kodGpoYW5kbGUgaCk7Ci0rCi0rCi0rLyoKLSsgIGNoYXIgKnRqR2V0RXJyb3JTdHIodm9pZCkKLSsgIAotKyAgUmV0dXJucyBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aHkgdGhlIGxhc3QgY29tbWFuZCBmYWlsZWQKLSsqLwotK0RMTEVYUE9SVCBjaGFyKiBETExDQUxMIHRqR2V0RXJyb3JTdHIodm9pZCk7Ci0rCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rfQotKyNlbmRpZgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdm5jdmlld2VyLl9tYW4gdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5fbWFuCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdm5jdmlld2VyLl9tYW4JMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdm5jdmlld2VyLl9tYW4JMjAxMC0wNC0xMSAyMzozMDoyNC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0wLDAgKzEsODI5IEBACi0rJ1wiIHQKLSsuXCIgKiogVGhlIGFib3ZlIGxpbmUgc2hvdWxkIGZvcmNlIHRibCB0byBiZSBhIHByZXByb2Nlc3NvciAqKgotKy5cIiBNYW4gcGFnZSBmb3IgWCB2bmN2aWV3ZXIKLSsuXCIKLSsuXCIgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmN1cy5Ccmlua21hbm5AcnVoci11bmktYm9jaHVtLmRlCi0rLlwiIENvcHlyaWdodCAoQykgMjAwMCwyMDAxIFJlZCBIYXQsIEluYy4KLSsuXCIgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQ29uc3RhbnRpbiBLYXBsaW5za3kgPGNvbnN0QGNlLmNjdHB1LmVkdS5ydT4KLSsuXCIgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSsuXCIKLSsuXCIgWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0rLlwiIExpY2Vuc2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmaWxlIExJQ0VOQ0UuVFhUIHRoYXQgY29tZXMgd2l0aCB0aGUKLSsuXCIgVGlnaHRWTkMgZGlzdHJpYnV0aW9uLgotKy5cIgotKy5USCBzc3ZuY3ZpZXdlciAxICJBcHJpbCAyMDEwIiAiIiAiU1NWTkMiCi0rLlNIIE5BTUUKLStzc3ZuY3ZpZXdlciBcLSBhbiBYIHZpZXdlciBjbGllbnQgZm9yIFZOQwotKy5TSCBTWU5PUFNJUwotKy5CIHNzdm5jdmlld2VyCi0rLlJJIFtcfCBvcHRpb25zIFx8XQotKy5SSSBbXHwgaG9zdCBcfF1bXHwgOmRpc3BsYXkgXHxdCi0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLlJJIFtcfCBob3N0IFx8XVtcfCA6OnBvcnQgXHxdCi0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLlJJIGV4ZWM9W1x8IGNtZCthcmdzLi4uIFx8XQotKy5icgotKy5CIHNzdm5jdmlld2VyCi0rLlJJIFtcfCBvcHRpb25zIFx8XQotKy5SSSBmZD1uCi0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLlJJIC9wYXRoL3RvL3VuaXgvc29ja2V0Ci0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLklSIFwtbGlzdGVuCi0rLlJJIFtcfCBkaXNwbGF5IFx8XQotKy5icgotKy5CIHNzdm5jdmlld2VyCi0rLklSIFwtaGVscAotKy5icgotKy5TSCBERVNDUklQVElPTgotKy5CIHNzdm5jdmlld2VyCi0raXMgYW4gWHRcLWJhc2VkIGNsaWVudCBhcHBsaWNhdGlvbiBmb3IgdGhlIFZOQyAoVmlydHVhbCBOZXR3b3JrCi0rQ29tcHV0aW5nKSBzeXN0ZW0uIEl0IGNhbiBjb25uZWN0IHRvIGFueSBWTkNcLWNvbXBhdGlibGUgc2VydmVyIHN1Y2gKLSthcyBcZkJYdm5jXGZSLCBXaW5WTkMsIG9yIFxmQngxMXZuY1xmUiwgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgZGVza3RvcCBlbnZpcm9ubWVudAotK29mIGEgZGlmZmVyZW50IG1hY2hpbmUuCi0rCi0rc3N2bmN2aWV3ZXIgaXMgYW4gZW5oYW5jZWQgdmVyc2lvbiBvZiB0aGUgdGlnaHR2bmMgdW5peCB2aWV3ZXIgdGhhdCBjYW4KLSt0YWtlIGFkdmFudGFnZSBvZiBmZWF0dXJlcyBpbiB0aGUgXGZCeDExdm5jXGZSIGFuZCBVbHRyYVZOQyBWTkMgc2VydmVycy4KLStTZWUgYmVsb3cgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmZWF0dXJlcy4KLSsKLStZb3UgY2FuIHVzZSBGOCB0byBkaXNwbGF5IGEgcG9wXC11cCB1dGlsaXR5IG1lbnUuIFByZXNzIEY4IHR3aWNlIHRvCi0rcGFzcyBzaW5nbGUgRjggdG8gdGhlIHJlbW90ZSBzaWRlLgotKy5TSCBPUFRJT05TCi0rLlRQCi0rXGZCXC1oZWxwXGZSCi0rUHJpbnRzIGEgc2hvcnQgdXNhZ2Ugbm90aWNlIHRvIHN0ZGVyci4KLSsuVFAKLStcZkJcLWxpc3RlblxmUgotK01ha2UgdGhlIHZpZXdlciBsaXN0ZW4gb24gcG9ydCA1NTAwK1xmSWRpc3BsYXlcZlIgZm9yIHJldmVyc2UKLStjb25uZWN0aW9ucyBmcm9tIGEgc2VydmVyLiBXaW5WTkMgc3VwcG9ydHMgcmV2ZXJzZSBjb25uZWN0aW9ucyB1c2luZwotK3RoZSAiQWRkIE5ldyBDbGllbnQiIG1lbnUgb3B0aW9uLCBvciB0aGUgXC1jb25uZWN0IGNvbW1hbmQgbGluZQotK29wdGlvbi4gXGZCWHZuY1xmUiByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBoZWxwZXIgcHJvZ3JhbQotK1xmQnZuY2Nvbm5lY3RcZlIuCi0rLlRQCi0rXGZCXC12aWFcZlIgXGZJZ2F0ZXdheVxmUgotK0F1dG9tYXRpY2FsbHkgY3JlYXRlIGVuY3J5cHRlZCBUQ1AgdHVubmVsIHRvIHRoZSBcZklnYXRld2F5XGZSIG1hY2hpbmUKLStiZWZvcmUgY29ubmVjdGlvbiwgY29ubmVjdCB0byB0aGUgXGZJaG9zdFxmUiB0aHJvdWdoIHRoYXQgdHVubmVsCi0rKFRpZ2h0Vk5DXC1zcGVjaWZpYykuIEJ5IGRlZmF1bHQsIHRoaXMgb3B0aW9uIGludm9rZXMgU1NIIGxvY2FsIHBvcnQKLStmb3J3YXJkaW5nLCBhc3N1bWluZyB0aGF0IFNTSCBjbGllbnQgYmluYXJ5IGNhbiBiZSBhY2Nlc3NlZCBhcwotKy91c3IvYmluL3NzaC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhlIFxmQlwtdmlhXGZSIG9wdGlvbiwgdGhlIGhvc3QKLSttYWNoaW5lIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBrbm93biB0byB0aGUgZ2F0ZXdheSBtYWNoaW5lLCBlLmcuIAotKyJsb2NhbGhvc3QiIGRlbm90ZXMgdGhlIFxmSWdhdGV3YXlcZlIsIG5vdCB0aGUgbWFjaGluZSB3aGVyZSB2bmN2aWV3ZXIKLSt3YXMgbGF1bmNoZWQuIFNlZSB0aGUgRU5WSVJPTk1FTlQgc2VjdGlvbiBiZWxvdyBmb3IgdGhlIGluZm9ybWF0aW9uIG9uCi0rY29uZmlndXJpbmcgdGhlIFxmQlwtdmlhXGZSIG9wdGlvbi4KLSsuVFAKLStcZkJcLXNoYXJlZFxmUgotK1doZW4gY29ubmVjdGluZywgc3BlY2lmeSB0aGF0IGEgc2hhcmVkIGNvbm5lY3Rpb24gaXMgcmVxdWVzdGVkLiBJbgotK1RpZ2h0Vk5DLCB0aGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUsIGFsbG93aW5nIHlvdSB0byBzaGFyZSB0aGUgZGVza3RvcAotK3dpdGggb3RoZXIgY2xpZW50cyBhbHJlYWR5IHVzaW5nIGl0LgotKy5UUAotK1xmQlwtbm9zaGFyZWRcZlIKLStXaGVuIGNvbm5lY3RpbmcsIHNwZWNpZnkgdGhhdCB0aGUgc2Vzc2lvbiBtYXkgbm90IGJlIHNoYXJlZC4gVGhpcwotK3dvdWxkIGVpdGhlciBkaXNjb25uZWN0IG90aGVyIGNvbm5lY3RlZCBjbGllbnRzIG9yIHJlZnVzZSB5b3VyCi0rY29ubmVjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSsuVFAKLStcZkJcLXZpZXdvbmx5XGZSCi0rRGlzYWJsZSB0cmFuc2ZlciBvZiBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzIGZyb20gdGhlIGNsaWVudCB0byB0aGUKLStzZXJ2ZXIuCi0rLlRQCi0rXGZCXC1mdWxsc2NyZWVuXGZSCi0rU3RhcnQgaW4gZnVsbFwtc2NyZWVuIG1vZGUuIFBsZWFzZSBiZSBhd2FyZSB0aGF0IG9wZXJhdGluZyBpbgotK2Z1bGxcLXNjcmVlbiBtb2RlIG1heSBjb25mdXNlIFggd2luZG93IG1hbmFnZXJzLiBUeXBpY2FsbHksIHN1Y2gKLStjb25mbGljdHMgY2F1c2UgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIGlucHV0IGZvY3VzIG9yIG1ha2UgdGhlIHZpZXdlcgotK3dpbmRvdyBkaXNhcHBlYXIgbXlzdGVyaW91c2x5LiBTZWUgdGhlIGdyYWJLZXlib2FyZCBzZXR0aW5nIGluIHRoZQotK1JFU09VUkNFUyBzZWN0aW9uIGJlbG93IGZvciBhIG1ldGhvZCB0byBzb2x2ZSBpbnB1dCBmb2N1cyBwcm9ibGVtLgotKy5UUAotK1xmQlwtbm9yYWlzZW9uYmVlcFxmUgotK0J5IGRlZmF1bHQsIHRoZSB2aWV3ZXIgc2hvd3MgYW5kIHJhaXNlcyBpdHMgd2luZG93IG9uIHJlbW90ZSBiZWVwCi0rKGJlbGwpIGV2ZW50LiBUaGlzIG9wdGlvbiBkaXNhYmxlcyBzdWNoIGJlaGF2aW91cgotKyhUaWdodFZOQ1wtc3BlY2lmaWMpLgotKy5UUAotK1xmQlwtdXNlclxmUiBcZkl1c2VybmFtZVxmUgotK1VzZXIgbmFtZSBmb3IgVW5peCBsb2dpbiBhdXRoZW50aWNhdGlvbi4gRGVmYXVsdCBpcyB0byB1c2UgY3VycmVudAotK1VuaXggdXNlciBuYW1lLiBJZiB0aGlzIG9wdGlvbiB3YXMgZ2l2ZW4sIHRoZSB2aWV3ZXIgd2lsbCBwcmVmZXIgVW5peAotK2xvZ2luIGF1dGhlbnRpY2F0aW9uIG92ZXIgdGhlIHN0YW5kYXJkIFZOQyBhdXRoZW50aWNhdGlvbi4KLSsuVFAKLStcZkJcLXBhc3N3ZFxmUiBcZklwYXNzd2RcLWZpbGVcZlIKLStGaWxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBwYXNzd29yZCAoYXMgZ2VuZXJhdGVkIGJ5IHRoZQotK1xmQnZuY3Bhc3N3ZFxmUigxKSBwcm9ncmFtKS4gVGhpcyBvcHRpb24gYWZmZWN0cyBvbmx5IHRoZSBzdGFuZGFyZCBWTkMKLSthdXRoZW50aWNhdGlvbi4KLSsuVFAKLStcZkJcLWVuY29kaW5nc1xmUiBcZkllbmNvZGluZ1wtbGlzdFxmUgotK1RpZ2h0Vk5DIHN1cHBvcnRzIHNldmVyYWwgZGlmZmVyZW50IGNvbXByZXNzaW9uIG1ldGhvZHMgdG8gZW5jb2RlCi0rc2NyZWVuIHVwZGF0ZXM7IHRoaXMgb3B0aW9uIHNwZWNpZmllcyBhIHNldCBvZiB0aGVtIHRvIHVzZSBpbiBvcmRlciBvZgotK3ByZWZlcmVuY2UuIEVuY29kaW5ncyBhcmUgc3BlY2lmaWVkIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgYW5kIG11c3QKLSt0aHVzIGJlIGVuY2xvc2VkIGluIHF1b3RlcyBpZiBtb3JlIHRoYW4gb25lIGlzIHNwZWNpZmllZC4gIENvbW1hcyBtYXkgYmUgdXNlZCB0byBhdm9pZCBzcGFjZXMuCi0rQXZhaWxhYmxlIGVuY29kaW5ncywgaW4gZGVmYXVsdCBvcmRlciBmb3IgYSByZW1vdGUgY29ubmVjdGlvbiwgYXJlCi0rImNvcHlyZWN0IHRpZ2h0IGhleHRpbGUgemxpYiBjb3JyZSBycmUgcmF3Ii4gRm9yIGEgbG9jYWwgY29ubmVjdGlvbgotKyh0byB0aGUgc2FtZSBtYWNoaW5lKSwgdGhlIGRlZmF1bHQgb3JkZXIgdG8gdHJ5IGlzICJyYXcgY29weXJlY3QgdGlnaHQKLStoZXh0aWxlIHpsaWIgY29ycmUgcnJlIi4gUmF3IGVuY29kaW5nIGlzIGFsd2F5cyBhc3N1bWVkIGFzIGEgbGFzdCBvcHRpb24KLStpZiBubyBvdGhlciBlbmNvZGluZyBjYW4gYmUgdXNlZCBmb3Igc29tZSByZWFzb24uIEZvciBtb3JlIGluZm9ybWF0aW9uCi0rb24gZW5jb2RpbmdzLCBzZWUgdGhlIHNlY3Rpb24gRU5DT0RJTkdTIGJlbG93LgotKy5UUAotK1xmQlwtYmdyMjMzXGZSCi0rQWx3YXlzIHVzZSB0aGUgQkdSMjMzIGZvcm1hdCB0byBlbmNvZGUgcGl4ZWwgZGF0YS4gVGhpcyByZWR1Y2VzCi0rbmV0d29yayB0cmFmZmljLCBidXQgY29sb3JzIG1heSBiZSByZXByZXNlbnRlZCBpbmFjY3VyYXRlbHkuIFRoZQotK2JncjIzMyBmb3JtYXQgaXMgYW4gOFwtYml0ICJ0cnVlIGNvbG9yIiBmb3JtYXQsIHdpdGggMiBiaXRzIGJsdWUsIDMKLStiaXRzIGdyZWVuLCBhbmQgMyBiaXRzIHJlZC4KLSsuVFAKLStcZkJcLW93bmNtYXBcZlIKLStUcnkgdG8gdXNlIGEgUHNldWRvQ29sb3IgdmlzdWFsIGFuZCBhIHByaXZhdGUgY29sb3JtYXAuIFRoaXMgYWxsb3dzCi0rdGhlIFZOQyBzZXJ2ZXIgdG8gY29udHJvbCB0aGUgY29sb3JtYXAuCi0rLlRQCi0rXGZCXC10cnVlY29sb3VyXGZSLCBcZkJcLXRydWVjb2xvclxmUgotK1RyeSB0byB1c2UgYSBUcnVlQ29sb3IgdmlzdWFsLgotKy5UUAotK1xmQlwtZGVwdGhcZlIgXGZJZGVwdGhcZlIKLStPbiBhbiBYIHNlcnZlciB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZSBUcnVlQ29sb3IgdmlzdWFscyBvZiBkaWZmZXJlbnQKLStkZXB0aHMsIGF0dGVtcHQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgb25lIChpbiBiaXRzIHBlciBwaXhlbCk7IGlmCi0rc3VjY2Vzc2Z1bCwgdGhpcyBkZXB0aCB3aWxsIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBWTkMgc2VydmVyLgotKy5UUAotK1xmQlwtY29tcHJlc3NsZXZlbCBcZklsZXZlbFxmUgotK1VzZSBzcGVjaWZpZWQgY29tcHJlc3Npb24gXGZJbGV2ZWxcZlIgKDAuLjkpIGZvciAidGlnaHQiIGFuZCAiemxpYiIKLStlbmNvZGluZ3MgKFRpZ2h0Vk5DXC1zcGVjaWZpYykuIExldmVsIDEgdXNlcyBtaW5pbXVtIG9mIENQVSB0aW1lIGFuZAotK2FjaGlldmVzIHdlYWsgY29tcHJlc3Npb24gcmF0aW9zLCB3aGlsZSBsZXZlbCA5IG9mZmVycyBiZXN0Ci0rY29tcHJlc3Npb24gYnV0IGlzIHNsb3cgaW4gdGVybXMgb2YgQ1BVIHRpbWUgY29uc3VtcHRpb24gb24gdGhlIHNlcnZlcgotK3NpZGUuIFVzZSBoaWdoIGxldmVscyB3aXRoIHZlcnkgc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zLCBhbmQgbG93Ci0rbGV2ZWxzIHdoZW4gd29ya2luZyBvdmVyIGhpZ2hcLXNwZWVkIExBTnMuIEl0J3Mgbm90IHJlY29tbWVuZGVkIHRvIHVzZQotK2NvbXByZXNzaW9uIGxldmVsIDAsIHJlYXNvbmFibGUgY2hvaWNlcyBzdGFydCBmcm9tIHRoZSBsZXZlbCAxLgotKy5UUAotK1xmQlwtcXVhbGl0eSBcZklsZXZlbFxmUgotK1VzZSB0aGUgc3BlY2lmaWVkIEpQRUcgcXVhbGl0eSBcZklsZXZlbFxmUiAoMC4uOSkgZm9yIHRoZSAidGlnaHQiCi0rZW5jb2RpbmcgKFRpZ2h0Vk5DXC1zcGVjaWZpYykuIFF1YWxpdHkgbGV2ZWwgMCBkZW5vdGVzIGJhZCBpbWFnZQotK3F1YWxpdHkgYnV0IHZlcnkgaW1wcmVzc2l2ZSBjb21wcmVzc2lvbiByYXRpb3MsIHdoaWxlIGxldmVsIDkgb2ZmZXJzCi0rdmVyeSBnb29kIGltYWdlIHF1YWxpdHkgYXQgbG93ZXIgY29tcHJlc3Npb24gcmF0aW9zLiBOb3RlIHRoYXQgdGhlCi0rInRpZ2h0IiBlbmNvZGVyIHVzZXMgSlBFRyB0byBlbmNvZGUgb25seSB0aG9zZSBzY3JlZW4gYXJlYXMgdGhhdCBsb29rCi0rc3VpdGFibGUgZm9yIGxvc3N5IGNvbXByZXNzaW9uLCBzbyBxdWFsaXR5IGxldmVsIDAgZG9lcyBub3QgYWx3YXlzCi0rbWVhbiB1bmFjY2VwdGFibGUgaW1hZ2UgcXVhbGl0eS4KLSsuVFAKLStcZkJcLW5vanBlZ1xmUgotK0Rpc2FibGUgbG9zc3kgSlBFRyBjb21wcmVzc2lvbiBpbiBUaWdodCBlbmNvZGluZyAoVGlnaHRWTkNcLXNwZWNpZmljKS4gCi0rRGlzYWJsaW5nIEpQRUcgY29tcHJlc3Npb24gaXMgbm90IGEgZ29vZCBpZGVhIGluIHR5cGljYWwgY2FzZXMsIGFzCi0rdGhhdCBtYWtlcyB0aGUgVGlnaHQgZW5jb2RlciBsZXNzIGVmZmljaWVudC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlCi0rdGhpcyBvcHRpb24gaWYgaXQncyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSB0byBhY2hpZXZlIHBlcmZlY3QgaW1hZ2UKLStxdWFsaXR5IChzZWUgYWxzbyB0aGUgXGZCXC1xdWFsaXR5XGZSIG9wdGlvbikuCi0rLlRQCi0rXGZCXC1ub2N1cnNvcnNoYXBlXGZSCi0rRGlzYWJsZSBjdXJzb3Igc2hhcGUgdXBkYXRlcywgcHJvdG9jb2wgZXh0ZW5zaW9ucyB1c2VkIHRvIGhhbmRsZQotK3JlbW90ZSBjdXJzb3IgbW92ZW1lbnRzIGxvY2FsbHkgb24gdGhlIGNsaWVudCBzaWRlCi0rKFRpZ2h0Vk5DXC1zcGVjaWZpYykuIFVzaW5nIGN1cnNvciBzaGFwZSB1cGRhdGVzIGRlY3JlYXNlcyBkZWxheXMgd2l0aAotK3JlbW90ZSBjdXJzb3IgbW92ZW1lbnRzLCBhbmQgY2FuIGltcHJvdmUgYmFuZHdpZHRoIHVzYWdlIGRyYW1hdGljYWxseS4gCi0rLlRQCi0rXGZCXC14MTFjdXJzb3JcZlIKLStVc2UgYSByZWFsIFgxMSBjdXJzb3Igd2l0aCBYLXN0eWxlIGN1cnNvciBzaGFwZSB1cGRhdGVzLCBpbnN0ZWFkIG9mCi0rZHJhd2luZyB0aGUgcmVtb3RlIGN1cnNvciBvbiB0aGUgZnJhbWVidWZmZXIuIFRoaXMgb3B0aW9uIGFsc28KLStkaXNhYmxlcyB0aGUgZG90IGN1cnNvciwgYW5kIGRpc2FibGVzIGN1cnNvciBwb3NpdGlvbiB1cGRhdGVzIGluCi0rbm9uLWZ1bGxzY3JlZW4gbW9kZS4KLSsuVFAKLStcZkJcLWF1dG9wYXNzXGZSCi0rUmVhZCBhIHBsYWluLXRleHQgcGFzc3dvcmQgZnJvbSBzdGRpbi4gVGhpcyBvcHRpb24gYWZmZWN0cyBvbmx5IHRoZQotK3N0YW5kYXJkIFZOQyBhdXRoZW50aWNhdGlvbi4KLSsKLSsuU0ggRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgT1BUSU9OUwotKy5UUAotK0VuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIHdlYiBwYWdlIGlzIGxvY2F0ZWQgYXQ6Ci0rLlRQCi0raHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sCi0rLlRQCi0rTm90ZTogWlJMRSBhbmQgWllXUkxFIGVuY29kaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KLSsuVFAKLStOb3RlOiBGOSBpcyBzaG9ydGN1dCB0byBUb2dnbGUgRnVsbFNjcmVlbiBtb2RlLgotKy5UUAotK05vdGU6IEluIC1saXN0ZW4gbW9kZSBzZXQgdGhlIGVudiB2YXIuIFNTVk5DX01VTFRJUExFX0xJU1RFTj0xCi0rdG8gYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIGF0IGEgdGltZS4KLStUaGlzIGlzIHRoZSBzYW1lIGFzIC1tdWx0aWxpc3RlbiBkZXNjcmliZWQgYmVsb3cuICBTZXQKLStTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOm4gdG8gYWxsb3cgbm8gbW9yZSB0aGFuICJuIgotK3NpbXVsdGFuZW91cyByZXZlcnNlIGNvbm5lY3Rpb25zLgotKwotK0lmIHRoZSBob3N0OnBvcnQgaXMgc3BlY2lmaWVkIGFzICJleGVjPWNvbW1hbmQgYXJncy4uLiIKLSt0aGVuIGluc3RlYWQgb2YgbWFraW5nIGEgVENQL0lQIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZQotK3JlbW90ZSBWTkMgc2VydmVyLCAiY29tbWFuZCBhcmdzLi4uIiBpcyBleGVjdXRlZCBhbmQgdGhlCi0rdmlld2VyIGlzIGF0dGFjaGVkIHRvIGl0cyBzdGRpby4gIFRoaXMgZW5hYmxlcyB0dW5uZWxsaW5nCi0rZXN0YWJsaXNoZWQgdmlhIGFuIGV4dGVybmFsIGNvbW1hbmQsIGUuZy4gYW4gc3R1bm5lbCg4KQotK3RoYXQgZG9lcyBub3QgaW52b2x2ZSBhIGxpc3RlbmluZyBzb2NrZXQuCi0rVGhpcyBtb2RlIGRvZXMgbm90IHdvcmsgZm9yIC1saXN0ZW4gcmV2ZXJzZSBjb25uZWN0aW9ucy4KLSsKLStJZiB0aGUgaG9zdDpwb3J0IGlzIHNwZWNpZmllZCBhcyAiZmQ9biIgdGhlbiBpdCBpcyBhc3N1bWVkCi0rbiBpcyBhbiBhbHJlYWR5IG9wZW5lZCBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHNvY2tldC4gKGkuZQotK3RoZSBwYXJlbnQgZGlkIGZvcmsrZXhlYykKLSsKLStJZiB0aGUgaG9zdDpwb3J0IGNvbnRhaW5zIGEgJy8nIGl0IGlzIGludGVycHJldGVkIGFzIGEKLSt1bml4LWRvbWFpbiBzb2NrZXQgKEFGX0xPQ0FMIGluc2VhZCBvZiBBRl9JTkVUKQotKy5UUAotK1xmQlwtbXVsdGlsaXN0ZW5cZlIKLStBcyBpbiAtbGlzdGVuIChyZXZlcnNlIGNvbm5lY3Rpb24gbGlzdGVuaW5nKSBleGNlcHQKLSthbGxvdyBtb3JlIHRoYW4gb25lIGluY29taW5nIFZOQyBzZXJ2ZXIgdG8gYmUgY29ubmVjdGVkCi0rYXQgYSB0aW1lLiAgVGhlIGRlZmF1bHQgZm9yIC1saXN0ZW4gb2Ygb25seSBvbmUgYXQgYQotK3RpbWUgdHJpZXMgdG8gcGxheSBpdCBzYWZlIGJ5IG5vdCBhbGxvd2luZyBhbnlvbmUgb24KLSt0aGUgbmV0d29yayB0byBwdXQgKG1hbnkpIGRlc2t0b3BzIG9uIHlvdXIgc2NyZWVuIG92ZXIKLSthIGxvbmcgd2luZG93IG9mIHRpbWUuIFVzZSAtbXVsdGlsaXN0ZW4gZm9yIG5vIGxpbWl0LgotKy5UUAotK1xmQlwtYWNjZXB0cG9wdXBcZlIKLStJbiBcZkJcLWxpc3RlblxmUiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgbW9kZSB3aGVuCi0rYSByZXZlcnNlIFZOQyBjb25uZWN0aW9uIGNvbWVzIGluIHNob3cgYSBwb3B1cCBhc2tpbmcKLSt3aGV0aGVyIHRvIEFjY2VwdCBvciBSZWplY3QgdGhlIGNvbm5lY3Rpb24uICBUaGUgSVAKLSthZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nIGhvc3QgaXMgc2hvd24uICBTYW1lIGFzCi0rc2V0dGluZyB0aGUgZW52LiB2YXIuIFNTVk5DX0FDQ0VQVF9QT1BVUD0xLgotKy5UUAotK1xmQlwtYWNjZXB0cG9wdXBzY1xmUgotK0FzIGluIFxmQlwtYWNjZXB0cG9wdXBcZlIgZXhjZXB0IGFzc3VtZSBVbHRyYVZOQyBTaW5nbGUKLStDbGljayAoU0MpIHNlcnZlci4gIFJldHJpZXZlIFVzZXIgYW5kIENvbXB1dGVyTmFtZQotK2luZm8gZnJvbSBVbHRyYVZOQyBTZXJ2ZXIgYW5kIGRpc3BsYXkgaW4gdGhlIFBvcHVwLgotKy5UUAotK1xmQlwtdXNlNjRcZlIKLStJbiBcZkJcLWJncjIzM1xmUiBtb2RlLCB1c2UgNjQgY29sb3JzIGluc3RlYWQgb2YgMjU2LgotKy5UUAotK1xmQlwtYmdyMjIyXGZSCi0rU2FtZSBhcyBcZkJcLXVzZTY0XGZSLgotKy5UUAotK1xmQlwtdXNlOFxmUgotK0luIFxmQlwtYmdyMjMzXGZSIG1vZGUsIHVzZSA4IGNvbG9ycyBpbnN0ZWFkIG9mIDI1Ni4KLSsuVFAKLStcZkJcLWJncjExMVxmUgotK1NhbWUgYXMgXGZCXC11c2U4XGZSLgotKy5UUAotK1xmQlwtMTZicHBcZlIKLStJZiB0aGUgdm5jIHZpZXdlciBYIGRpc3BsYXkgaXMgZGVwdGggMjQgYXQgMzJicHAKLStyZXF1ZXN0IGEgMTZicHAgZm9ybWF0IGZyb20gdGhlIFZOQyBzZXJ2ZXIgdG8gY3V0Ci0rbmV0d29yayB0cmFmZmljIGJ5IHVwIHRvIDJYLCB0aGVuIHRyYW5sYXRlIHRoZQotK3BpeGVscyB0byAzMmJwcCBsb2NhbGx5LgotKy5UUAotK1xmQlwtYmdyNTY1XGZSCi0rU2FtZSBhcyBcZkJcLTE2YnBwXGZSLgotKy5UUAotK1xmQlwtZ3JleVxmUgotK1VzZSBhIGdyZXkgc2NhbGUgZm9yIHRoZSAxNi0gYW5kIDhcZkJcLWJwcFxmUiBtb2Rlcy4KLSsuVFAKLStcZkJcLWFscGhhXGZSCi0rVXNlIGFscGhhYmxlbmRpbmcgdHJhbnNwYXJlbmN5IGZvciBsb2NhbCBjdXJzb3JzCi0rcmVxdWlyZXM6IHgxMXZuYyBzZXJ2ZXIsIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIKLSttdXN0IGJlIDMyYnBwIGFuZCBzYW1lIGVuZGlhbm5lc3MuCi0rLlRQCi0rXGZCXC1zY2FsZVxmUiBcZklzdHJcZlIKLStTY2FsZSB0aGUgZGVza3RvcCBsb2NhbGx5LiAgVGhlIHN0cmluZyAic3RyIiBjYW4KLSthIGZsb2F0aW5nIHBvaW50IHJhdGlvLCBlLmcuICIwLjkiLCBvciBhIGZyYWN0aW9uLAotK2UuZy4gIjMvNCIsIG9yIFd4SCwgZS5nLiAxMjgweDEwMjQuICBVc2UgImZpdCIKLSt0byBmaXQgaW4gdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuICBVc2UgImF1dG8iIHRvCi0rZml0IGluIHRoZSB3aW5kb3cgc2l6ZS4gICJzdHIiIGNhbiBhbHNvIGJlIHNldCBieQotK3RoZSBlbnYuIHZhci4gU1NWTkNfU0NBTEUuCi0rCi0rSWYgeW91IG9ic2VydmUgbW91c2UgdHJhaWwgcGFpbnRpbmcgZXJyb3JzLCBlbmFibGUKLStYMTEgQ3Vyc29yIG1vZGUgKGVpdGhlciB2aWEgUG9wdXAgb3IgXGZCXC14MTFjdXJzb3JcZlIuKQotKwotK05vdGUgdGhhdCBzY2FsaW5nIGlzIGRvbmUgaW4gc29mdHdhcmUgYW5kIHNvIGNhbiBiZQotK3Nsb3cgYW5kIHJlcXVpcmVzIG1vcmUgbWVtb3J5LiAgU29tZSBzcGVlZHVwIFRpcHM6Ci0rCi0rWlJMRSBpcyBmYXN0ZXIgdGhhbiBUaWdodCBpbiB0aGlzIG1vZGUuICBXaGVuCi0rc2NhbGluZyBpcyBmaXJzdCBkZXRlY3RlZCwgdGhlIGVuY29kaW5nIHdpbGwKLStiZSBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIFpSTEUuICBVc2UgdGhlCi0rUG9wdXAgbWVudSBpZiB5b3Ugd2FudCB0byBnbyBiYWNrIHRvIFRpZ2h0LgotK1NldCBTU1ZOQ19QUkVTRVJWRV9FTkNPRElORz0xIHRvIGRpc2FibGUgdGhpcy4KLSsKLStVc2UgYSBzb2xpZCBiYWNrZ3JvdW5kIG9uIHRoZSByZW1vdGUgc2lkZS4KLSsoZS5nLiBtYW51YWxseSBvciB2aWEgeDExdm5jIFxmQlwtc29saWRcZlIgLi4uKQotKwotK0lmIHRoZSByZW1vdGUgc2VydmVyIGlzIHgxMXZuYywgdHJ5IGNsaWVudAotK3NpZGUgY2FjaGluZzogeDExdm5jIFxmQlwtbmNhY2hlXGZSIDEwIC4uLgotKy5UUAotK1xmQlwteWNyb3BcZlIgbgotK09ubHkgc2hvdyB0aGUgdG9wIG4gcm93cyBvZiB0aGUgZnJhbWVidWZmZXIuICBGb3IKLSt1c2Ugd2l0aCB4MTF2bmMgXGZCXC1uY2FjaGVcZlIgY2xpZW50IGNhY2hpbmcgb3B0aW9uCi0rdG8gaGVscCAiaGlkZSIgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4KLStVc2UgYSBuZWdhdGl2ZSB2YWx1ZSAoZS5nLiBcZkJcLTFcZlIpIGZvciBhdXRvZGV0ZWN0aW9uLgotK0F1dG9kZXRlY3Rpb24gd2lsbCBhbHdheXMgdGFrZSBwbGFjZSBpZiB0aGUgcmVtb3RlCi0rZmIgaGVpZ2h0IGlzIG1vcmUgdGhhbiAyIHRpbWVzIHRoZSB3aWR0aC4KLSsuVFAKLStcZkJcLXNid2lkdGhcZlIgbgotK1Njcm9sbGJhciB3aWR0aCBmb3IgeDExdm5jIFxmQlwtbmNhY2hlXGZSIG1vZGUgKFxmQlwteWNyb3BcZlIpLAotK2RlZmF1bHQgaXMgdmVyeSBuYXJyb3c6IDIgcGl4ZWxzLCBpdCBpcyBuYXJyb3cgdG8KLSthdm9pZCBkaXN0cmFjdGlvbiBpbiBcZkJcLXljcm9wXGZSIG1vZGUuCi0rLlRQCi0rXGZCXC1ub2JlbGxcZlIKLStEaXNhYmxlIGJlbGwuCi0rLlRQCi0rXGZCXC1yYXdsb2NhbFxmUgotK1ByZWZlciByYXcgZW5jb2RpbmcgZm9yIGxvY2FsaG9zdCwgZGVmYXVsdCBpcwotK25vLCBpLmUuIGFzc3VtZXMgeW91IGhhdmUgYSBTU0ggdHVubmVsIGluc3RlYWQuCi0rLlRQCi0rXGZCXC1ub3R0eVxmUgotK1RyeSB0byBhdm9pZCB1c2luZyB0aGUgdGVybWluYWwgZm9yIGludGVyYWN0aXZlCi0rcmVzcG9uc2VzOiB1c2Ugd2luZG93cyBmb3IgbWVzc2FnZXMgYW5kIHByb21wdGluZwotK2luc3RlYWQuICBNZXNzYWdlcyB3aWxsIGFsc28gYmUgcHJpbnRlZCB0byB0ZXJtaW5hbC4KLSsuVFAKLStcZkJcLXNlbmRjbGlwYm9hcmRcZlIKLStTZW5kIHRoZSBYIENMSVBCT0FSRCBzZWxlY3Rpb24gKGkuZS4gQ3RybCtDLAotK0N0cmwrVikgaW5zdGVhZCBvZiB0aGUgWCBQUklNQVJZIHNlbGVjdGlvbiAobW91c2UKLStzZWxlY3QgYW5kIG1pZGRsZSBidXR0b24gcGFzdGUuKQotKy5UUAotK1xmQlwtc2VuZGFsd2F5c1xmUgotK1doZW5ldmVyIHRoZSBtb3VzZSBlbnRlcnMgdGhlIFZOQyB2aWV3ZXIgbWFpbgotK3dpbmRvdywgc2VuZCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBWTkMgc2VydmVyIGV2ZW4gaWYKLStpdCBoYXMgbm90IGNoYW5nZWQuICBUaGlzIGlzIGxpa2UgdGhlIFh0IHJlc291cmNlCi0rdHJhbnNsYXRpb24gU2VsZWN0aW9uVG9WTkMoYWx3YXlzKQotKy5UUAotK1xmQlwtcmVjdnRleHRcZlIKLStzdHIgICBXaGVuIGN1dCB0ZXh0IGlzIHJlY2VpdmVkIGZyb20gdGhlIFZOQyBzZXJ2ZXIsCi0rc3N2bmN2aWV3ZXIgd2lsbCBzZXQgYm90aCB0aGUgWCBQUklNQVJZIGFuZCB0aGUKLStYIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaAotK2lzIHNldCwgc3BlY2lmeSAnc3RyJyBhcyAncHJpbWFyeScsICdjbGlwYm9hcmQnLAotK29yICdib3RoJyAodGhlIGRlZmF1bHQuKQotKy5UUAotK1xmQlwtZ3JhYmFsbFxmUgotK0dyYWIgdGhlIGVudGlyZSBYIHNlcnZlciB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSwKLStuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCi0rLlRQCi0rXGZCXC1wb3B1cGZpeFxmUgotK1dhcnAgdGhlIHBvcHVwIGJhY2sgdG8gdGhlIHBvaW50ZXIgcG9zaXRpb24sCi0rbmVlZGVkIGJ5IHNvbWUgb2xkIHdpbmRvdyBtYW5hZ2VycyBsaWtlIGZ2d20yLgotKy5UUAotK1xmQlwtZ3JhYmtiZFxmUgotK0dyYWIgdGhlIFgga2V5Ym9hcmQgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCi0rbmVlZGVkIGJ5IHNvbWUgd2luZG93IG1hbmFnZXJzLiBTYW1lIGFzIFxmQlwtZ3JhYmtleWJvYXJkXGZSLgotK1xmQlwtZ3JhYmtiZFxmUiBpcyB0aGUgZGVmYXVsdCwgdXNlIFxmQlwtbm9ncmFia2JkXGZSIHRvIGRpc2FibGUuCi0rLlRQCi0rXGZCXC1ic1xmUiwgXGZCXC1ub2JzXGZSCi0rV2hldGhlciBvciBub3QgdG8gdXNlIFggc2VydmVyIEJhY2tpbmdzdG9yZSBmb3IgdGhlCi0rbWFpbiB2aWV3ZXIgd2luZG93LiAgVGhlIGRlZmF1bHQgaXMgdG8gbm90LCBtYWlubHkKLStiZWNhdXNlIG1vc3QgTGludXgsIGV0Yywgc3lzdGVtcyBYIHNlcnZlcnMgZGlzYWJsZQotKyphbGwqIEJhY2tpbmdzdG9yZSBieSBkZWZhdWx0LiAgVG8gcmVcZkJcLWVuYWJsZVxmUiBpdCBwdXQKLSsKLStPcHRpb24gIkJhY2tpbmdzdG9yZSIKLSsKLStpbiB0aGUgRGV2aWNlIHNlY3Rpb24gb2YgL2V0Yy9YMTEveG9yZy5jb25mLgotK0luIFxmQlwtYnNcZlIgbW9kZSB3aXRoIG5vIFggc2VydmVyIGJhY2tpbmdzdG9yZSwgd2hlbmV2ZXIgYW4KLSthcmVhIG9mIHRoZSBzY3JlZW4gaXMgcmVcZkJcLWV4cG9zZWRcZlIgaXQgbXVzdCBnbyBvdXQgdG8gdGhlCi0rVk5DIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgcGl4ZWxzLiBUaGlzIGlzIHRvbyBzbG93LgotKwotK0luIFxmQlwtbm9ic1xmUiBtb2RlLCBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ5IHRoZSB2aWV3ZXIgdG8KLStwcm92aWRlIGl0cyBvd24gYmFja2luZyBvZiB0aGUgbWFpbiB2aWV3ZXIgd2luZG93LiBUaGlzCi0rYWN0dWFsbHkgbWFrZXMgc29tZSBhY3Rpdml0aWVzIGZhc3RlciAoY2hhbmdlcyBpbiBsYXJnZQotK3JlZ2lvbnMpIGJ1dCBjYW4gYXBwZWFyIHRvICJmbGFzaCIgdG9vIG11Y2guCi0rLlRQCi0rXGZCXC1ub3NobVxmUgotK0Rpc2FibGUgdXNlIG9mIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAobm90IHJlY29tbWVuZGVkKQotKy5UUAotK1xmQlwtdGVybWNoYXRcZlIKLStEbyB0aGUgVWx0cmFWTkMgY2hhdCBpbiB0aGUgdGVybWluYWwgdm5jdmlld2VyIGlzIGluCi0raW5zdGVhZCBvZiBpbiBhbiBpbmRlcGVuZGVudCB3aW5kb3cuCi0rLlRQCi0rXGZCXC11bml4cHdcZlIgXGZJc3RyXGZSCi0rVXNlZnVsIGZvciBsb2dnaW5nIGludG8geDExdm5jIGluIFxmQlwtdW5peHB3XGZSIG1vZGUuICJzdHIiIGlzIGEKLStzdHJpbmcgdGhhdCBhbGxvd3MgbWFueSB3YXlzIHRvIGVudGVyIHRoZSBVbml4IFVzZXJuYW1lCi0rYW5kIFVuaXggUGFzc3dvcmQuICBUaGVzZSBjaGFyYWN0ZXJzOiB1c2VybmFtZSwgbmV3bGluZSwKLStwYXNzd29yZCwgbmV3bGluZSBhcmUgc2VudCB0byB0aGUgVk5DIHNlcnZlciBhZnRlciBhbnkgVk5DCi0rYXV0aGVudGljYXRpb24gaGFzIHRha2VuIHBsYWNlLiAgVW5kZXIgeDExdm5jIHRoZXkgYXJlCi0rdXNlZCBmb3IgdGhlIFxmQlwtdW5peHB3XGZSIGxvZ2luLiAgT3RoZXIgVk5DIHNlcnZlcnMgY291bGQgZG8KLStzb21ldGhpbmcgc2ltaWxhci4KLSsKLStZb3UgY2FuIGFsc28gaW5kaWNhdGUgInN0ciIgdmlhIHRoZSBlbnZpcm9ubWVudAotK3ZhcmlhYmxlIFNTVk5DX1VOSVhQVy4KLSsKLStOb3RlIHRoYXQgdGhlIEVzY2FwZSBrZXkgaXMgYWN0dWFsbHkgc2VudCBmaXJzdCB0byB0ZWxsCi0reDExdm5jIHRvIG5vdCBlY2hvIHRoZSBVbml4IFVzZXJuYW1lIGJhY2sgdG8gdGhlIFZOQwotK3ZpZXdlci4gU2V0IFNTVk5DX1VOSVhQV19OT0VTQz0xIHRvIG92ZXJyaWRlIHRoaXMuCi0rCi0rSWYgc3RyIGlzICIuIiwgdGhlbiB5b3UgYXJlIHByb21wdGVkIGF0IHRoZSBjb21tYW5kIGxpbmUKLStmb3IgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgbm9ybWFsIHdheS4gIElmIHN0ciBpcwotKyItIiB0aGUgc3RkaW4gaXMgcmVhZCB2aWEgZ2V0cGFzcygzKSBmb3IgdXNlcm5hbWVAcGFzc3dvcmQuCi0rT3RoZXJ3aXNlIGlmIHN0ciBpcyBhIGZpbGUsIGl0IGlzIG9wZW5lZCBhbmQgdGhlIGZpcnN0IGxpbmUKLStyZWFkIGlzIHRha2VuIGFzIHRoZSBVbml4IHVzZXJuYW1lIGFuZCB0aGUgMm5kIGFzIHRoZQotK3Bhc3N3b3JkLiBJZiBzdHIgcHJlZml4ZWQgYnkgInJtOiIgdGhlIGZpbGUgaXMgcmVtb3ZlZAotK2FmdGVyIHJlYWRpbmcuIE90aGVyd2lzZSwgaWYgc3RyIGhhcyBhICJAIiBjaGFyYWN0ZXIsCi0raXQgaXMgdGFrZW4gYXMgdXNlcm5hbWVAcGFzc3dvcmQuIE90aGVyd2lzZSwgdGhlIHByb2dyYW0KLStleGl0cyB3aXRoIGFuIGVycm9yLiBHb3QgYWxsIHRoYXQ/Ci0rLlRQCi0rXGZCLXJlcGVhdGVyXGZSIFxmSXN0clxmUgotK1RoaXMgaXMgZm9yIHVzZSB3aXRoIFVsdHJhVk5DIHJlcGVhdGVyIHByb3h5IGRlc2NyaWJlZAotK2hlcmU6IGh0dHA6Ly93d3cudXZuYy5jb20vYWRkb25zL3JlcGVhdGVyLmh0bWwuICBUaGUgInN0ciIKLStpcyB0aGUgSUQgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHJlcGVhdGVyLiAgRS5nLiBJRDoxMjM0Ci0rSXQgY2FuIGFsc28gYmUgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9yIGRpc3BsYXkgb2YgdGhlIFZOQwotK3NlcnZlciwgZS5nLiAxMi4zNC41Ni43ODowIG9yIHNub29weS5jb206MS4gIE5vdGUgdGhhdCB3aGVuCi0rdXNpbmcgLXJlcGVhdGVyLCB0aGUgaG9zdDpkcHkgb24gdGhlIGNtZGxpbmUgaXMgdGhlIHJlcGVhdGVyCi0rc2VydmVyLCBOT1QgdGhlIFZOQyBzZXJ2ZXIuICBUaGUgcmVwZWF0ZXIgd2lsbCBjb25uZWN0IHlvdS4KLSsKLStFeGFtcGxlOiB2bmN2aWV3ZXIgLi4uIC1yZXBlYXRlciBJRDozMzMzIHJlcGVhdC5ob3N0OjU5MDAKLSsKLStFeGFtcGxlOiB2bmN2aWV3ZXIgLi4uIC1yZXBlYXRlciB2aG9zdDowIHJlcGVhdC5ob3N0OjU5MDAKLSsKLStVc2UsIGUuZy4sICctcmVwZWF0ZXIgU0NJSUk9SUQ6MzIxMCcgaWYgdGhlIHJlcGVhdGVyIGlzIGEKLStTaW5nbGUgQ2xpY2sgSUlJIChTU0wpIHJlcGVhdGVyIChyZXBlYXRlcl9TU0wuZXhlKSBhbmQgeW91Ci0rYXJlIHBhc3NpbmcgdGhlIFNTTCBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHRocm91Z2ggc3R1bm5lbCwgc29jYXQsIGV0Yy4KLStUaGlzIHdheSB0aGUgbWFnaWMgVWx0cmFWTkMgc3RyaW5nICd0ZXN0QicgbmVlZGVkIHRvIHdvcmsgd2l0aCB0aGUKLStyZXBlYXRlciBpcyBzZW50IHRvIGl0LgotKy5UUAotK1xmQi1yZmJ2ZXJzaW9uXGZSIFxmSXN0clxmUgotK1NldCB0aGUgYWR2ZXJ0aXNlZCBSRkIgdmVyc2lvbi4gIEUuZy46IC1yZmJ2ZXJzaW9uIDMuNiAgRm9yIHNvbWUKLStzZXJ2ZXJzLCBlLmcuIFVsdHJhVk5DIHRoaXMgbmVlZHMgdG8gYmUgZG9uZS4KLSsuVFAKLStcZkItdWx0cmFkc21cZlIKLStVbHRyYVZOQyBoYXMgc3ltbWV0cmljIHByaXZhdGUgZW5jcnlwdGlvbiBEU00gcGx1Z2lucy4gIFNlZQotK2h0dHA6Ly93d3cudXZuYy5jb20vZmVhdHVyZXMvZW5jcnlwdGlvbi5odG1sLiAgSXQgaXMgYXNzdW1lZAotK3lvdSBhcmUgdXNpbmcgYSB1bml4IHByb2dyYW0gKGUuZy4gb3VyIHVsdHJhdm5jX2RzbV9oZWxwZXIpIHRvCi0rZW5jcnlwdCBhbmQgZGVjcnlwdCB0aGUgVWx0cmFWTkMgRFNNIHN0cmVhbS4gSU4gQURESVRJT04gVE8KLStUSEFUIHN1cHBseSAtdWx0cmFkc20gdG8gdGVsbCBUSElTIHZpZXdlciB0byBtb2RpZnkgdGhlIFJGQgotK2RhdGEgc2VudCBzbyBhcyB0byB3b3JrIHdpdGggdGhlIFVsdHJhVk5DIFNlcnZlci4gIEZvciBzb21lCi0rcmVhc29uLCBlYWNoIFJGQiBtc2cgdHlwZSBtdXN0IGJlIHNlbnQgdHdpY2UgdW5kZXIgRFNNLgotKy5UUAotK1xmQlwtbXNsb2dvblxmUiBcZkl1c2VyXGZSCi0rVXNlIFdpbmRvd3MgTVMgTG9nb24gdG8gYW4gVWx0cmFWTkMgc2VydmVyLiAgU3VwcGx5IHRoZQotK3VzZXJuYW1lIG9yICIxIiB0byBiZSBwcm9tcHRlZC4gIFRoZSBkZWZhdWx0IGlzIHRvCi0rYXV0b2RldGVjdCB0aGUgVWx0cmFWTkMgTVMgTG9nb24gc2VydmVyIGFuZCBwcm9tcHQgZm9yCi0rdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KLSsKLStJTVBPUlRBTlQgTk9URTogVGhlIFVsdHJhVk5DIE1TLUxvZ29uIERpZmZpZS1IZWxsbWFuCi0rZXhjaGFuZ2UgaXMgdmVyeSB3ZWFrIGFuZCBjYW4gYmUgYnJ1dGUgZm9yY2VkIHRvIHJlY292ZXIKLSt5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiBhIGZldyBzZWNvbmRzIG9mIENQVQotK3RpbWUuICBUbyBiZSBzYWZlLCBiZSBzdXJlIHRvIHVzZSBhbiBhZGRpdGlvbmFsIGVuY3J5cHRlZAotK3R1bm5lbCAoZS5nLiBTU0wgb3IgU1NIKSBmb3IgdGhlIGVudGlyZSBWTkMgc2Vzc2lvbi4KLSsuVFAKLStcZkJcLWNoYXRvbmx5XGZSCi0rVHJ5IHRvIGJlIGEgY2xpZW50IHRoYXQgb25seSBkb2VzIFVsdHJhVk5DIHRleHQgY2hhdC4gVGhpcwotK21vZGUgaXMgdXNlZCBieSB4MTF2bmMgdG8gcHJlc2VudCBhIGNoYXQgd2luZG93IG9uIHRoZSBwaHlzaWNhbAotK1gxMSBjb25zb2xlIChpLmUuIHRvIGNoYXQgd2l0aCB0aGUgcGVyc29uIGF0IHRoZSBkaXNwbGF5KS4KLSsuVFAKLStcZkItZW52XGZSIFxmSVZBUj1WQUxVRVxmUgotK1RvIHNhdmUgd3JpdGluZyBhIHNoZWxsIHNjcmlwdCB0byBzZXQgZW52aXJvbm1lbnQKLSt2YXJpYWJsZXMsIHNwZWNpZnkgYXMgbWFueSBhcyB5b3UgbmVlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGUsCi0rLWVudiBTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOjUgLWVudiBFRElUT1I9dmkKLSsuVFAKLStcZkJcLW5vaXB2NlxmUgotK0Rpc2FibGUgYWxsIElQdjYgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjY9MS4KLSsuVFAKLStcZkJcLW5vaXB2NFxmUgotK0Rpc2FibGUgYWxsIElQdjQgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjQ9MS4KLSsuVFAKLStcZkJcLXByaW50cmVzXGZSCi0rUHJpbnQgb3V0IHRoZSBTc3ZuYyBYIHJlc291cmNlcyAoYXBwZGVmYXVsdHMpIGFuZAotK3RoZW4gZXhpdC4gWW91IGNhbiBzYXZlIHRoZW0gdG8gYSBmaWxlIGFuZCBjdXN0b21pemUgdGhlbSAoZS5nLiB0aGUKLStrZXliaW5kaW5ncyBhbmQgUG9wdXAgbWVudSkgIFRoZW4gcG9pbnQgdG8gdGhlIGZpbGUgdmlhCi0rWEVOVklST05NRU5UIG9yIFhBUFBMUkVTRElSLgotKy5UUAotK1xmQlwtcGlwZWxpbmVcZlIKLStMaWtlIFR1cmJvVk5DLCByZXF1ZXN0IHRoZSBuZXh0IGZyYW1lYnVmZmVyIHVwZGF0ZSBhcyBzb29uCi0rYXMgcG9zc2libGUgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKLStmcmFtZWJ1ZmZlciB1cGRhdGUgY29taW5nIGluLiAgSGVscHMgJ3BpcGVsaW5lJyB0aGUgdXBkYXRlcy4KLStUaGlzIGlzIGN1cnJlbnRseSB0aGUgZGVmYXVsdCwgdXNlIFxmQi1ub3BpcGVsaW5lXGZSIHRvIGRpc2FibGUuCi0rLlRQCi0rXGZCXC1hcHBzaGFyZVxmUgotK0VuYWJsZSBmZWF0dXJlcyBmb3IgdXNlIHdpdGggeDExdm5jJ3MgXGZCXC1hcHBzaGFyZVxmUiBtb2RlIHdoZXJlCi0raW5zdGVhZCBvZiBzaGFyaW5nIHRoZSBmdWxsIGRlc2t0b3Agb25seSB0aGUgYXBwbGljYXRpb24ncwotK3dpbmRvd3MgYXJlIHNoYXJlZC4gIFZpZXdlciBtdWx0aWxpc3RlbiBtb2RlIGlzIHVzZWQgdG8KLStjcmVhdGUgdGhlIG11bHRpcGxlIHdpbmRvd3M6IFxmQlwtbXVsdGlsaXN0ZW5cZlIgaXMgaW1wbGllZC4KLStTZWUgJ3gxMXZuYyBcZkJcLWFwcHNoYXJlXGZSIFxmQlwtaGVscFxmUicgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZS4KLStGZWF0dXJlcyBlbmFibGVkIGluIHRoZSB2aWV3ZXIgdW5kZXIgXGZCXC1hcHBzaGFyZVxmUiBhcmU6Ci0rTWluaW11bSBleHRyYSB0ZXh0IGluIHRoZSB0aXRsZSwgYXV0byBcZkJcLXljcm9wXGZSIGlzIGRpc2FibGVkLAotK3gxMXZuYyBcZkJcLXJlbW90ZV9wcmVmaXhcZlIgWDExVk5DX0FQUFNIQVJFX0NNRDogbWVzc2FnZSBjaGFubmVsLAotK3gxMXZuYyBpbml0aWFsIHdpbmRvdyBwb3NpdGlvbiBoaW50cy4gIFNlZSBhbHNvIEVzY2FwZSBLZXlzCi0rYmVsb3cgZm9yIGFkZGl0aW9uYWwga2V5IGFuZCBtb3VzZSBiaW5kaW5ncy4KLSsuVFAKLStcZkJcLWVzY2FwZSBcZlJcZklzdHJcZlIKLStUaGlzIHNldHMgdGhlICdFc2NhcGUgS2V5cycgbW9kaWZpZXIgc2VxdWVuY2UgYW5kIGVuYWJsZXMKLStlc2NhcGUga2V5cyBtb2RlLiAgV2hlbiB0aGUgbW9kaWZpZXIga2V5cyBlc2NhcGUgc2VxdWVuY2UKLStpcyBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpcyBpbnRlcnByZXRlZCBsb2NhbGx5Ci0rdG8gcGVyZm9ybSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0byB0aGUKLStyZW1vdGUgVk5DIHNlcnZlci4KLSsKLStVc2UgJ1xmQlwtZXNjYXBlXGZSIGRlZmF1bHQnIGZvciB0aGUgZGVmYXVsdCBtb2RpZmllciBzZXF1ZW5jZS4KLSsoVW5peDogQWx0X0wsU3VwZXJfTCBhbmQgTWFjT1NYOiBDb250cm9sX0wsTWV0YV9MKQotKwotK0hlcmUgYXJlIHRoZSAnRXNjYXBlIEtleXM6IEhlbHArU2V0JyBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgUG9wdXA6Ci0rCi0rRXNjYXBlIEtleXM6ICBFbnRlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZGlmaWVyIGtleXMgdG8gYmUgdGhlICdlc2NhcGUKLStzZXF1ZW5jZScuICBXaGVuIHRoZXNlIGtleXMgYXJlIGhlbGQgZG93biwgdGhlIG5leHQga2V5c3Ryb2tlIGlzCi0raW50ZXJwcmV0ZWQgbG9jYWxseSB0byBpbnZva2UgYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG8KLSt0aGUgcmVtb3RlIFZOQyBzZXJ2ZXIuICBJbiBvdGhlciB3b3JkcywgYSBzZXQgb2YgJ0hvdCBLZXlzJy4KLSsKLStIZXJlIGlzIHRoZSBsaXN0IG9mIGxvY2FsIGtleSBtYXBwaW5ncyB0byBzcGVjaWFsIGFjdGlvbnM6Ci0rCi0rcjogcmVmcmVzaCBkZXNrdG9wICBiOiB0b2dnbGUgYmVsbCAgYzogdG9nZ2xlIGZ1bGwtY29sb3IKLSsKLStmOiBmaWxlIHRyYW5zZmVyICAgIHg6IHgxMWN1cnNvciAgICB6OiB0b2dnbGUgVGlnaHQvWlJMRQotKwotK2w6IGZ1bGwgc2NyZWVuICAgICAgZzogZ3JhYmFsbCAgICAgIGU6IGVzY2FwZSBrZXlzIGRpYWxvZwotKwotK3M6IHNjYWxlIGRpYWxvZyAgICAgKzogc2NhbGUgdXAgKD0pIC06IHNjYWxlIGRvd24gKF8pCi0rCi0rdDogdGV4dCBjaGF0ICAgICAgICAgICAgICAgICAgICAgICAgYTogYWxwaGFibGVuZCBjdXJzb3IKLSsKLStWOiB0b2dnbGUgdmlld29ubHkgIFE6IHF1aXQgdmlld2VyICAxMjM0NTY6IFVsdHJhVk5DIHNjYWxlIDEvbgotKwotK0Fycm93IGtleXM6IHBhbiB0aGUgdmlld3BvcnQgYWJvdXQgMTAlIGZvciBlYWNoIGtleXByZXNzLgotKwotK1BhZ2VVcC9QYWdlRG93bjogcGFuIHRoZSB2aWV3cG9ydCBieSBhIHNjcmVlbmZ1bCB2ZXJ0aWNhbGx5LgotKwotK0hvbWUvRW5kOiBwYW4gdGhlIHZpZXdwb3J0IGJ5IGEgc2NyZWVuZnVsIGhvcml6b250YWxseS4KLSsKLStLZXlQYWQgQXJyb3dzOiBwYW4gdGhlIHZpZXdwb3J0IGJ5IDEgcGl4ZWwgZm9yIGVhY2gga2V5cHJlc3MuCi0rCi0rRHJhZ2dpbmcgdGhlIE1vdXNlIHdpdGggQnV0dG9uMSBwcmVzc2VkIGFsc28gcGFucyB0aGUgdmlld3BvcnQuCi0rCi0rQ2xpY2tpbmcgTW91c2UgQnV0dG9uMyBicmluZ3MgdXAgdGhlIFBvcHVwIE1lbnUuCi0rCi0rVGhlIGFib3ZlIG1hcHBpbmdzIGFyZSBcZkJhbHdheXNcZlIgYWN0aXZlIGluIFZpZXdPbmx5IG1vZGUsIHVubGVzcyB5b3Ugc2V0Ci0rdGhlIEVzY2FwZSBLZXlzIHZhbHVlIHRvICduZXZlcicuCi0rCi0reDExdm5jIC1hcHBzaGFyZSBob3Qta2V5czogIHgxMXZuYyBoYXMgYSBzaW1wbGUgYXBwbGljYXRpb24gc2hhcmluZyBtb2RlCi0rdGhhdCBlbmFibGVzIHRoZSB2aWV3ZXItc2lkZSB0byBtb3ZlLCByZXNpemUsIG9yIHJhaXNlIHRoZSByZW1vdGUgdG9wbGV2ZWwKLSt3aW5kb3dzLiAgVG8gZW5hYmxlIGl0LCBob2xkIGRvd24gU2hpZnQgKyB0aGUgRXNjYXBlIEtleXMgYW5kIHByZXNzIHRoZXNlOgotKwotK0Fycm93IGtleXM6IG1vdmUgdGhlIHJlbW90ZSB3aW5kb3cgYXJvdW5kIGluIGl0cyBkZXNrdG9wLgotKwotK1BhZ2VVcC9QYWdlRG4vSG9tZS9FbmQ6ICByZXNpemUgdGhlIHJlbW90ZSB3aW5kb3cuCi0rCi0rKy8tOiByYWlzZSBvciBsb3dlciB0aGUgcmVtb3RlIHdpbmRvdy4KLSsKLStNIG9yIEJ1dHRvbjEgbW92ZSB3aW4gdG8gbG9jYWwgcG9zaXRpb247ICBEIG9yIEJ1dHRvbjM6IGRlbGV0ZSByZW1vdGUgd2luLgotKwotK0lmIHRoZSBFc2NhcGUgS2V5cyB2YWx1ZSBiZWxvdyBpcyBzZXQgdG8gJ2RlZmF1bHQnIHRoZW4gYSBkZWZhdWx0IGxpc3Qgb2YKLStvZiBtb2RpZmllciBrZXlzIGlzIHVzZWQuICBGb3IgVW5peCBpdCBpczogQWx0X0wsU3VwZXJfTCBhbmQgZm9yIE1hY09TWCBpdAotK2lzIENvbnRyb2xfTCxNZXRhX0wuICBOb3RlOiB0aGUgU3VwZXJfTCBrZXkgdXN1YWxseSBoYXMgYSBXaW5kb3dzKFRNKSBGbGFnCi0rb24gaXQuICBBbHNvIG5vdGUgdGhlIF9MIGFuZCBfUiBtZWFuIHRoZSBrZXkgaXMgb24gdGhlIExFRlQgb3IgUklHSFQgc2lkZQotK29mIHRoZSBrZXlib2FyZC4KLSsKLStPbiBVbml4ICAgdGhlIGRlZmF1bHQgaXMgQWx0IGFuZCBXaW5kb3dzIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgotK09uIE1hY09TWCB0aGUgZGVmYXVsdCBpcyBDb250cm9sIGFuZCBDb21tYW5kIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgotKwotK0V4YW1wbGU6IFByZXNzIGFuZCBob2xkIHRoZSBBbHQgYW5kIFdpbmRvd3Mga2V5cyBvbiB0aGUgTEVGVCBzaWRlIG9mIHRoZQotK2tleWJvYXJkIGFuZCB0aGVuIHByZXNzICdjJyB0byB0b2dnbGUgdGhlIGZ1bGwtY29sb3Igc3RhdGUuICBPciBwcmVzcyAndCcKLSt0byB0b2dnbGUgdGhlIHVsdHJhdm5jIFRleHQgQ2hhdCB3aW5kb3csIGV0Yy4KLSsKLStUbyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgdGhlIGRlZmF1bHQsIHN1cHBseSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IChvciBhCi0rc2luZ2xlIG9uZSkgZnJvbTogU2hpZnRfTCBTaGlmdF9SIENvbnRyb2xfTCBDb250cm9sX1IgQWx0X0wgQWx0X1IgTWV0YV9MCi0rTWV0YV9SIFN1cGVyX0wgU3VwZXJfUiBIeXBlcl9MIEh5cGVyX1Igb3IgTW9kZV9zd2l0Y2guCi0rLlRQCi0rXGZCIE5ldyBQb3B1cCBhY3Rpb25zOlxmUgotKwotKyBWaWV3T25seTogICAgICAgICAgICAgICAgfiAtdmlld29ubHkKLSsgRGlzYWJsZSBCZWxsOiAgICAgICAgICAgIH4gLW5vYmVsbAotKyBDdXJzb3IgU2hhcGU6ICAgICAgICAgICAgfiAtbm9jdXJzb3JzaGFwZQotKyBYMTEgQ3Vyc29yOiAgICAgICAgICAgICAgfiAteDExY3Vyc29yCi0rIEN1cnNvciBBbHBoYWJsZW5kOiAgICAgICB+IC1hbHBoYQotKyBUb2dnbGUgVGlnaHQvSGV4dGlsZTogICAgfiAtZW5jb2RpbmdzIGhleHRpbGUuLi4KLSsgVG9nZ2xlIFRpZ2h0L1pSTEU6ICAgICAgIH4gLWVuY29kaW5ncyB6cmxlLi4uCi0rIFRvZ2dsZSBaUkxFL1pZV1JMRTogICAgICB+IC1lbmNvZGluZ3Mgenl3cmxlLi4uCi0rIFF1YWxpdHkgTGV2ZWwgICAgICAgICAgICB+IC1xdWFsaXR5IChib3RoIFRpZ2h0IGFuZCBaWVdSTEUpCi0rIENvbXByZXNzIExldmVsICAgICAgICAgICB+IC1jb21wcmVzc2xldmVsCi0rIERpc2FibGUgSlBFRzogICAgICAgICAgICB+IC1ub2pwZWcgIChUaWdodCkKLSsgUGlwZWxpbmUgVXBkYXRlcyAgICAgICAgIH4gLXBpcGVsaW5lCi0rCi0rIEZ1bGwgQ29sb3IgICAgICAgICAgICAgICAgIGFzIG1hbnkgY29sb3JzIGFzIGxvY2FsIHNjcmVlbiBhbGxvd3MuCi0rIEdyZXkgc2NhbGUgKDE2ICYgOC1icHApICB+IC1ncmV5LCBmb3IgbG93IGNvbG9ycyAxNi84YnBwIG1vZGVzIG9ubHkuCi0rIDE2IGJpdCBjb2xvciAoQkdSNTY1KSAgICB+IC0xNmJwcCAvIC1iZ3I1NjUKLSsgOCAgYml0IGNvbG9yIChCR1IyMzMpICAgIH4gLWJncjIzMwotKyAyNTYgY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMjMzIGRlZmF1bHQgIyBvZiBjb2xvcnMuCi0rICA2NCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IyMjIgLyAtdXNlNjQKLSsgICA4IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjExMSAvIC11c2U4Ci0rIFNjYWxlIFZpZXdlciAgICAgICAgICAgICB+IC1zY2FsZQotKyBFc2NhcGUgS2V5czogVG9nZ2xlICAgICAgfiAtZXNjYXBlCi0rIEVzY2FwZSBLZXlzOiBIZWxwK1NldCAgICB+IC1lc2NhcGUKLSsgU2V0IFkgQ3JvcCAoeS1tYXgpICAgICAgIH4gLXljcm9wCi0rIFNldCBTY3JvbGxiYXIgV2lkdGggICAgICB+IC1zYndpZHRoCi0rIFhHcmFiU2VydmVyICAgICAgICAgICAgICB+IC1ncmFiYWxsCi0rCi0rIFVsdHJhVk5DIEV4dGVuc2lvbnM6Ci0rCi0rICAgU2V0IDEvbiBTZXJ2ZXIgU2NhbGUgICAgIFVsdHJhdm5jIGV4dC4gU2NhbGUgZGVza3RvcCBieSAxL24uCi0rICAgVGV4dCBDaGF0ICAgICAgICAgICAgICAgIFVsdHJhdm5jIGV4dC4gRG8gVGV4dCBDaGF0LgotKyAgIEZpbGUgVHJhbnNmZXIgICAgICAgICAgICBVbHRyYXZuYyBleHQuIEZpbGUgeGZlciB2aWEgSmF2YSBoZWxwZXIuCi0rICAgU2luZ2xlIFdpbmRvdyAgICAgICAgICAgIFVsdHJhdm5jIGV4dC4gR3JhYiBhbmQgdmlldyBhIHNpbmdsZSB3aW5kb3cuCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QgdGhlbiBjbGljayBvbiB0aGUgd2luZG93IHlvdSB3YW50KS4KLSsgICBEaXNhYmxlIFJlbW90ZSBJbnB1dCAgICAgVWx0cmF2bmMgZXh0LiBUcnkgdG8gcHJldmVudCBpbnB1dCBhbmQKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2luZyBvZiBtb25pdG9yIGF0IHBoeXNpY2FsIGRpc3BsYXkuCi0rCi0rIE5vdGU6IHRoZSBVbHRyYXZuYyBleHRlbnNpb25zIG9ubHkgYXBwbHkgdG8gc2VydmVycyB0aGF0IHN1cHBvcnQKLSsgICAgICAgdGhlbS4gIHgxMXZuYy9saWJ2bmNzZXJ2ZXIgc3VwcG9ydHMgc29tZSBvZiB0aGVtLgotKwotKyBTZW5kIENsaXBib2FyZCBub3QgUHJpbWFyeSAgfiAtc2VuZGNsaXBib2FyZAotKyBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lICAgfiAtc2VuZGFsd2F5cwotKwotKy5TSCBFTkNPRElOR1MKLStUaGUgc2VydmVyIHN1cHBsaWVzIGluZm9ybWF0aW9uIGluIHdoYXRldmVyIGZvcm1hdCBpcyBkZXNpcmVkIGJ5IHRoZQotK2NsaWVudCwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgY2xpZW50IGFzIGVhc3kgYXMgcG9zc2libGUgdG8gaW1wbGVtZW50LiAKLStJZiB0aGUgY2xpZW50IHJlcHJlc2VudHMgaXRzZWxmIGFzIGFibGUgdG8gdXNlIG11bHRpcGxlIGZvcm1hdHMsIHRoZQotK3NlcnZlciB3aWxsIGNob29zZSBvbmUuCi0rCi0rLkkgUGl4ZWwgZm9ybWF0Ci0rcmVmZXJzIHRvIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmRpdmlkdWFsIHBpeGVsLiBUaGUgbW9zdCBjb21tb24KLStmb3JtYXRzIGFyZSAyNCBhbmQgMTYgYml0ICJ0cnVlXC1jb2xvciIgdmFsdWVzLCBhbmQgOFwtYml0ICJjb2xvciBtYXAiCi0rcmVwcmVzZW50YXRpb25zLCB3aGVyZSBhbiBhcmJpdHJhcnkgbWFwIGNvbnZlcnRzIHRoZSBjb2xvciBudW1iZXIgdG8KLStSR0IgdmFsdWVzLgotKwotKy5JIEVuY29kaW5nCi0rcmVmZXJzIHRvIGhvdyBhIHJlY3RhbmdsZSBvZiBwaXhlbHMgYXJlIHNlbnQgKGFsbCBwaXhlbCBpbmZvcm1hdGlvbiBpbgotK1ZOQyBpcyBzZW50IGFzIHJlY3RhbmdsZXMpLiBBbGwgcmVjdGFuZ2xlcyBjb21lIHdpdGggYSBoZWFkZXIgZ2l2aW5nCi0rdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSByZWN0YW5nbGUgYW5kIGFuIGVuY29kaW5nIHR5cGUgdXNlZCBieQotK3RoZSBkYXRhIHdoaWNoIGZvbGxvd3MuIFRoZXNlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3cuCi0rLlRQCi0rLkIgUmF3Ci0rVGhlIHJhdyBlbmNvZGluZyBzaW1wbHkgc2VuZHMgd2lkdGgqaGVpZ2h0IHBpeGVsIHZhbHVlcy4gQWxsIGNsaWVudHMKLSthcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzIGVuY29kaW5nIHR5cGUuIFJhdyBpcyBhbHNvIHRoZSBmYXN0ZXN0Ci0rd2hlbiB0aGUgc2VydmVyIGFuZCB2aWV3ZXIgYXJlIG9uIHRoZSBzYW1lIG1hY2hpbmUsIGFzIHRoZSBjb25uZWN0aW9uCi0rc3BlZWQgaXMgZXNzZW50aWFsbHkgaW5maW5pdGUgYW5kIHJhdyBlbmNvZGluZyBtaW5pbWl6ZXMgcHJvY2Vzc2luZwotK3RpbWUuCi0rLlRQCi0rLkIgQ29weVJlY3QKLStUaGUgQ29weSBSZWN0YW5nbGUgZW5jb2RpbmcgaXMgZWZmaWNpZW50IHdoZW4gc29tZXRoaW5nIGlzIGJlaW5nCi0rbW92ZWQ7IHRoZSBvbmx5IGRhdGEgc2VudCBpcyB0aGUgbG9jYXRpb24gb2YgYSByZWN0YW5nbGUgZnJvbSB3aGljaAotK2RhdGEgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgY3VycmVudCBsb2NhdGlvbi4gQ29weXJlY3QgY291bGQgYWxzbyBiZQotK3VzZWQgdG8gZWZmaWNpZW50bHkgdHJhbnNtaXQgYSByZXBlYXRlZCBwYXR0ZXJuLgotKy5UUAotKy5CIFJSRQotK1RoZSBSaXNlXC1hbmRcLVJ1blwtbGVuZ3RoXC1FbmNvZGluZyBpcyBiYXNpY2FsbHkgYSAyRCB2ZXJzaW9uIG9mCi0rcnVuXC1sZW5ndGggZW5jb2RpbmcgKFJMRSkuIEluIHRoaXMgZW5jb2RpbmcsIGEgc2VxdWVuY2Ugb2YgaWRlbnRpY2FsCi0rcGl4ZWxzIGFyZSBjb21wcmVzc2VkIHRvIGEgc2luZ2xlIHZhbHVlIGFuZCByZXBlYXQgY291bnQuIEluIFZOQywgdGhpcwotK2lzIGltcGxlbWVudGVkIHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgdGhlbiBzcGVjaWZpY2F0aW9ucyBvZiBhbgotK2FyYml0cmFyeSBudW1iZXIgb2Ygc3VicmVjdGFuZ2xlcyBhbmQgY29sb3IgZm9yIGVhY2guIFRoaXMgaXMgYW4KLStlZmZpY2llbnQgZW5jb2RpbmcgZm9yIGxhcmdlIGJsb2NrcyBvZiBjb25zdGFudCBjb2xvci4KLSsuVFAKLSsuQiBDb1JSRQotK1RoaXMgaXMgYSBtaW5vciB2YXJpYXRpb24gb24gUlJFLCB1c2luZyBhIG1heGltdW0gb2YgMjU1eDI1NSBwaXhlbAotK3JlY3RhbmdsZXMuIFRoaXMgYWxsb3dzIGZvciBzaW5nbGVcLWJ5dGUgdmFsdWVzIHRvIGJlIHVzZWQsIHJlZHVjaW5nCi0rcGFja2V0IHNpemUuIFRoaXMgaXMgaW4gZ2VuZXJhbCBtb3JlIGVmZmljaWVudCwgYmVjYXVzZSB0aGUgc2F2aW5ncwotK2Zyb20gc2VuZGluZyAxXC1ieXRlIHZhbHVlcyBnZW5lcmFsbHkgb3V0d2VpZ2hzIHRoZSBsb3NzZXMgZnJvbSB0aGUKLSsocmVsYXRpdmVseSByYXJlKSBjYXNlcyB3aGVyZSB2ZXJ5IGxhcmdlIHJlZ2lvbnMgYXJlIHBhaW50ZWQgdGhlIHNhbWUKLStjb2xvci4KLSsuVFAKLSsuQiBIZXh0aWxlCi0rSGVyZSwgcmVjdGFuZ2xlcyBhcmUgc3BsaXQgdXAgaW4gdG8gMTZ4MTYgdGlsZXMsIHdoaWNoIGFyZSBzZW50IGluIGEKLStwcmVkZXRlcm1pbmVkIG9yZGVyLiBUaGUgZGF0YSB3aXRoaW4gdGhlIHRpbGVzIGlzIHNlbnQgZWl0aGVyIHJhdyBvcgotK2FzIGEgdmFyaWFudCBvbiBSUkUuIEhleHRpbGUgZW5jb2RpbmcgaXMgdXN1YWxseSB0aGUgYmVzdCBjaG9pY2UgZm9yCi0rdXNpbmcgaW4gaGlnaFwtc3BlZWQgbmV0d29yayBlbnZpcm9ubWVudHMgKGUuZy4gRXRoZXJuZXQgbG9jYWxcLWFyZWEKLStuZXR3b3JrcykuCi0rLlRQCi0rLkIgWmxpYgotK1psaWIgaXMgYSB2ZXJ5IHNpbXBsZSBlbmNvZGluZyB0aGF0IHVzZXMgemxpYiBsaWJyYXJ5IHRvIGNvbXByZXNzIHJhdwotK3BpeGVsIGRhdGEuIFRoaXMgZW5jb2RpbmcgYWNoaWV2ZXMgZ29vZCBjb21wcmVzc2lvbiwgYnV0IGNvbnN1bWVzIGEKLStsb3Qgb2YgQ1BVIHRpbWUuIFN1cHBvcnQgZm9yIHRoaXMgZW5jb2RpbmcgaXMgcHJvdmlkZWQgZm9yCi0rY29tcGF0aWJpbGl0eSB3aXRoIFZOQyBzZXJ2ZXJzIHRoYXQgbWlnaHQgbm90IHVuZGVyc3RhbmQgVGlnaHQKLStlbmNvZGluZyB3aGljaCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIFpsaWIgaW4gbmVhcmx5IGFsbCByZWFsXC1saWZlCi0rc2l0dWF0aW9ucy4KLSsuVFAKLSsuQiBUaWdodAotK0xpa2UgWmxpYiBlbmNvZGluZywgVGlnaHQgZW5jb2RpbmcgdXNlcyB6bGliIGxpYnJhcnkgdG8gY29tcHJlc3MgdGhlCi0rcGl4ZWwgZGF0YSwgYnV0IGl0IHByZVwtcHJvY2Vzc2VzIGRhdGEgdG8gbWF4aW1pemUgY29tcHJlc3Npb24gcmF0aW9zLAotK2FuZCB0byBtaW5pbWl6ZSBDUFUgdXNhZ2Ugb24gY29tcHJlc3Npb24uIEFsc28sIEpQRUcgY29tcHJlc3Npb24gbWF5Ci0rYmUgdXNlZCB0byBlbmNvZGUgY29sb3JcLXJpY2ggc2NyZWVuIGFyZWFzIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mCi0rXC1xdWFsaXR5IGFuZCBcLW5vanBlZyBvcHRpb25zIGFib3ZlKS4gVGlnaHQgZW5jb2RpbmcgaXMgdXN1YWxseSB0aGUKLStiZXN0IGNob2ljZSBmb3IgbG93XC1iYW5kd2lkdGggbmV0d29yayBlbnZpcm9ubWVudHMgKGUuZy4gc2xvdyBtb2RlbQotK2Nvbm5lY3Rpb25zKS4KLSsuVFAKLSsuQiBaUkxFCi0rVGhlIFNTVk5DIHZpZXdlciBoYXMgcG9ydGVkIHRoZSBSZWFsVk5DICh3d3cucmVhbHZuYy5jb20pIFpSTEUgZW5jb2RpbmcKLSt0byB0aGUgdW5peCB0aWdodHZuYyB2aWV3ZXIuCi0rLlRQCi0rLkIgWllXUkxFCi0rVGhlIFNTVk5DIHZpZXdlciBoYXMgcG9ydGVkIHRoZSBIaXRhY2hpIGxvc3N5IHdhdmVsZXQgYmFzZWQgWlJMRQotK2VuY29kaW5nIGZyb20gaHR0cDovL21vYmlsZS5oaXRhY2hpLXN5c3RlbS5jby5qcC9wdWJsaWNhdGlvbnMvWllXUkxFLyAKLSt0byB0aGUgdW5peCB0aWdodHZuYyB2aWV3ZXIuCi0rLlNIIFJFU09VUkNFUwotK1ggcmVzb3VyY2VzIHRoYXQgXGZCdm5jdmlld2VyXGZSIGtub3dzIGFib3V0LCBhc2lkZSBmcm9tIHRoZQotK25vcm1hbCBYdCByZXNvdXJjZXMsIGFyZSBhcyBmb2xsb3dzOgotKy5UUAotKy5CIHNoYXJlRGVza3RvcAotK0VxdWl2YWxlbnQgb2YgXGZCXC1zaGFyZWRcZlIvXGZCXC1ub3NoYXJlZFxmUiBvcHRpb25zLiBEZWZhdWx0IHRydWUuCi0rLlRQCi0rLkIgdmlld09ubHkKLStFcXVpdmFsZW50IG9mIFxmQlwtdmlld29ubHlcZlIgb3B0aW9uLiBEZWZhdWx0IGZhbHNlLgotKy5UUAotKy5CIGZ1bGxTY3JlZW4KLStFcXVpdmFsZW50IG9mIFxmQlwtZnVsbHNjcmVlblxmUiBvcHRpb24uIERlZmF1bHQgZmFsc2UuCi0rLlRQCi0rLkIgZ3JhYktleWJvYXJkCi0rR3JhYiBrZXlib2FyZCBpbiBmdWxsLXNjcmVlbiBtb2RlLiBUaGlzIGNhbiBoZWxwIHRvIHNvbHZlIHByb2JsZW1zCi0rd2l0aCBsb3Npbmcga2V5Ym9hcmQgZm9jdXMuIERlZmF1bHQgZmFsc2UuCi0rLlRQCi0rLkIgcmFpc2VPbkJlZXAKLStFcXVpdmFsZW50IG9mIFxmQlwtbm9yYWlzZW9uYmVlcFxmUiBvcHRpb24sIHdoZW4gc2V0IHRvIGZhbHNlLiBEZWZhdWx0Ci0rdHJ1ZS4KLSsuVFAKLSsuQiBwYXNzd29yZEZpbGUKLStFcXVpdmFsZW50IG9mIFxmQlwtcGFzc3dkXGZSIG9wdGlvbi4KLSsuVFAKLSsuQiB1c2VyTG9naW4KLStFcXVpdmFsZW50IG9mIFxmQlwtdXNlclxmUiBvcHRpb24uCi0rLlRQCi0rLkIgcGFzc3dvcmREaWFsb2cKLStXaGV0aGVyIHRvIHVzZSBhIGRpYWxvZyBib3ggdG8gZ2V0IHRoZSBwYXNzd29yZCAodHJ1ZSkgb3IgZ2V0IGl0IGZyb20KLSt0aGUgdHR5IChmYWxzZSkuIElycmVsZXZhbnQgaWYgXGZCcGFzc3dvcmRGaWxlXGZSIGlzIHNldC4gRGVmYXVsdAotK2ZhbHNlLgotKy5UUAotKy5CIGVuY29kaW5ncwotK0VxdWl2YWxlbnQgb2YgXGZCXC1lbmNvZGluZ3NcZlIgb3B0aW9uLgotKy5UUAotKy5CIGNvbXByZXNzTGV2ZWwKLStFcXVpdmFsZW50IG9mIFxmQlwtY29tcHJlc3NsZXZlbFxmUiBvcHRpb24gKFRpZ2h0Vk5DXC1zcGVjaWZpYykuCi0rLlRQCi0rLkIgcXVhbGl0eUxldmVsCi0rRXF1aXZhbGVudCBvZiBcZkJcLXF1YWxpdHlcZlIgb3B0aW9uIChUaWdodFZOQ1wtc3BlY2lmaWMpLgotKy5UUAotKy5CIGVuYWJsZUpQRUcKLStFcXVpdmFsZW50IG9mIFxmQlwtbm9qcGVnXGZSIG9wdGlvbiwgd2hlbiBzZXQgdG8gZmFsc2UuIERlZmF1bHQgdHJ1ZS4KLSsuVFAKLSsuQiB1c2VSZW1vdGVDdXJzb3IKLStFcXVpdmFsZW50IG9mIFxmQlwtbm9jdXJzb3JzaGFwZVxmUiBvcHRpb24sIHdoZW4gc2V0IHRvIGZhbHNlCi0rKFRpZ2h0Vk5DXC1zcGVjaWZpYykuIERlZmF1bHQgdHJ1ZS4KLSsuVFAKLSsuQiB1c2VCR1IyMzMKLStFcXVpdmFsZW50IG9mIFxmQlwtYmdyMjMzXGZSIG9wdGlvbi4gRGVmYXVsdCBmYWxzZS4KLSsuVFAKLSsuQiBuQ29sb3VycwotK1doZW4gdXNpbmcgQkdSMjMzLCB0cnkgdG8gYWxsb2NhdGUgdGhpcyBtYW55ICJleGFjdCIgY29sb3JzIGZyb20gdGhlCi0rQkdSMjMzIGNvbG9yIGN1YmUuIFdoZW4gdXNpbmcgYSBzaGFyZWQgY29sb3JtYXAsIHNldHRpbmcgdGhpcyByZXNvdXJjZQotK2xvd2VyIGxlYXZlcyBtb3JlIGNvbG9ycyBmb3Igb3RoZXIgWCBjbGllbnRzLiBJcnJlbGV2YW50IHdoZW4gdXNpbmcKLSt0cnVlY29sb3IuIERlZmF1bHQgaXMgMjU2IChpLmUuIGFsbCBvZiB0aGVtKS4KLSsuVFAKLSsuQiB1c2VTaGFyZWRDb2xvdXJzCi0rSWYgdGhlIG51bWJlciBvZiAiZXhhY3QiIEJHUjIzMyBjb2xvcnMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBpcyBsZXNzCi0rdGhhbiAyNTYgdGhlbiB0aGUgcmVzdCBhcmUgZmlsbGVkIGluIHVzaW5nIHRoZSAibmVhcmVzdCIgY29sb3JzCi0rYXZhaWxhYmxlLiBUaGlzIHJlc291cmNlIHNheXMgd2hldGhlciB0byBvbmx5IHVzZSB0aGUgImV4YWN0IiBCR1IyMzMKLStjb2xvcnMgZm9yIHRoaXMgcHVycG9zZSwgb3Igd2hldGhlciB0byB1c2Ugb3RoZXIgY2xpZW50cycgInNoYXJlZCIKLStjb2xvcnMgYXMgd2VsbC4gRGVmYXVsdCB0cnVlIChpLmUuIHVzZSBvdGhlciBjbGllbnRzJyBjb2xvcnMpLgotKy5UUAotKy5CIGZvcmNlT3duQ21hcAotK0VxdWl2YWxlbnQgb2YgXGZCXC1vd25jbWFwXGZSIG9wdGlvbi4gRGVmYXVsdCBmYWxzZS4KLSsuVFAKLSsuQiBmb3JjZVRydWVDb2xvdXIKLStFcXVpdmFsZW50IG9mIFxmQlwtdHJ1ZWNvbG91clxmUiBvcHRpb24uIERlZmF1bHQgZmFsc2UuCi0rLlRQCi0rLkIgcmVxdWVzdGVkRGVwdGgKLStFcXVpdmFsZW50IG9mIFxmQlwtZGVwdGhcZlIgb3B0aW9uLgotKy5UUAotKy5CIHVzZVNoYXJlZE1lbW9yeQotK1VzZSBNSVQgc2hhcmVkIG1lbW9yeSBleHRlbnNpb24gaWYgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB0aGUgWAotK3NlcnZlci4gRGVmYXVsdCB0cnVlLgotKy5UUAotKy5CIHdtRGVjb3JhdGlvbldpZHRoLCB3bURlY29yYXRpb25IZWlnaHQKLStUaGUgdG90YWwgd2lkdGggYW5kIGhlaWdodCB0YWtlbiB1cCBieSB3aW5kb3cgbWFuYWdlciBkZWNvcmF0aW9ucy4KLStUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIFZOQyB2aWV3ZXIgd2luZG93LiAKLStEZWZhdWx0IGlzIHdpZHRoIDQsIGhlaWdodCAyNC4KLSsuVFAKLSsuQiBidW1wU2Nyb2xsVGltZSwgYnVtcFNjcm9sbFBpeGVscwotK1doZW4gaW4gZnVsbCBzY3JlZW4gbW9kZSBhbmQgdGhlIFZOQyBkZXNrdG9wIGlzIGJpZ2dlciB0aGFuIHRoZSBYCi0rZGlzcGxheSwgc2Nyb2xsaW5nIGhhcHBlbnMgd2hlbmV2ZXIgdGhlIG1vdXNlIGhpdHMgdGhlIGVkZ2Ugb2YgdGhlCi0rc2NyZWVuLiBUaGUgbWF4aW11bSBzcGVlZCBvZiBzY3JvbGxpbmcgaXMgYnVtcFNjcm9sbFBpeGVscyBwaXhlbHMKLStldmVyeSBidW1wU2Nyb2xsVGltZSBtaWxsaXNlY29uZHMuIFRoZSBhY3R1YWwgc3BlZWQgb2Ygc2Nyb2xsaW5nIHdpbGwKLStiZSBzbG93ZXIgdGhhbiB0aGlzLCBvZiBjb3Vyc2UsIGRlcGVuZGluZyBvbiBob3cgZmFzdCB5b3VyIG1hY2hpbmUgaXMuIAotK0RlZmF1bHQgMjAgcGl4ZWxzIGV2ZXJ5IDI1IG1pbGxpc2Vjb25kcy4KLSsuVFAKLSsuQiBwb3B1cEJ1dHRvbkNvdW50Ci0rVGhlIG51bWJlciBvZiBidXR0b25zIGluIHRoZSBwb3B1cCB3aW5kb3cuIFNlZSB0aGUgUkVBRE1FIGZpbGUgZm9yCi0rbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3VzdG9taXplIHRoZSBidXR0b25zLgotKy5UUAotKy5CIGRlYnVnCi0rRm9yIGRlYnVnZ2luZy4gRGVmYXVsdCBmYWxzZS4KLSsuVFAKLSsuQiByYXdEZWxheSwgY29weVJlY3REZWxheQotK0ZvciBkZWJ1Z2dpbmcsIHNlZSB0aGUgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuIERlZmF1bHQgMCAob2ZmKS4KLSsuU0ggRU5WSVJPTk1FTlQKLStXaGVuIHN0YXJ0ZWQgd2l0aCB0aGUgXGZCXC12aWFcZlIgb3B0aW9uLCB2bmN2aWV3ZXIgcmVhZHMgdGhlCi0rXGZCVk5DX1ZJQV9DTURcZlIgZW52aXJvbm1lbnQgdmFyaWFibGUsIGV4cGFuZHMgcGF0dGVybnMgYmVnaW5uaW5nCi0rd2l0aCB0aGUgIiUiIGNoYXJhY3RlciwgYW5kIGV4ZWN1dGVzIHJlc3VsdCBhcyBhIGNvbW1hbmQgYXNzdW1pbmcgdGhhdAotK2l0IHdvdWxkIGNyZWF0ZSBUQ1AgdHVubmVsIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIFZOQyBjb25uZWN0aW9uLiBJZgotK25vdCBzZXQsIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGVmYXVsdHMgdG8gIi91c3IvYmluL3NzaCAtZiAtTAotKyVMOiVIOiVSICVHIHNsZWVwIDIwIi4KLSsKLStUaGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSByZWNvZ25pemVkIGluIHRoZSBcZkJWTkNfVklBX0NNRFxmUiAobm90ZQotK3RoYXQgYWxsIHRoZSBwYXR0ZXJucyAlRywgJUgsICVMIGFuZCAlUiBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNvbW1hbmQKLSt0ZW1wbGF0ZSk6Ci0rLlRQCi0rLkIgJSUKLStBIGxpdGVyYWwgIiUiOwotKy5UUAotKy5CICVHCi0rZ2F0ZXdheSBob3N0IG5hbWU7Ci0rLlRQCi0rLkIgJUgKLStyZW1vdGUgVk5DIGhvc3QgbmFtZSwgYXMga25vd24gdG8gdGhlIGdhdGV3YXk7Ci0rLlRQCi0rLkIgJUwKLStsb2NhbCBUQ1AgcG9ydCBudW1iZXI7Ci0rLlRQCi0rLkIgJVIKLStyZW1vdGUgVENQIHBvcnQgbnVtYmVyLgotKy5TSCBTRUUgQUxTTwotK1xmQnZuY3NlcnZlclxmUigxKSwgXGZCeDExdm5jXGZSKDEpLCBcZkJzc3ZuY1xmUigxKSwgXGZCWHZuY1xmUigxKSwgXGZCdm5jcGFzc3dkXGZSKDEpLAotK1xmQnZuY2Nvbm5lY3RcZlIoMSksIFxmQnNzaFxmUigxKSwgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYywgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sCi0rLlNIIEFVVEhPUlMKLStPcmlnaW5hbCBWTkMgd2FzIGRldmVsb3BlZCBpbiBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuIFRpZ2h0Vk5DCi0rYWRkaXRpb25zIHdhcyBpbXBsZW1lbnRlZCBieSBDb25zdGFudGluIEthcGxpbnNreS4gTWFueSBvdGhlciBwZW9wbGUKLStwYXJ0aWNpcGF0ZWQgaW4gZGV2ZWxvcG1lbnQsIHRlc3RpbmcgYW5kIHN1cHBvcnQuICBLYXJsIEouIFJ1bmdlIAotK2FkZGVkIGFsbCBvZiB0aGUgU1NWTkMgcmVsYXRlZCBmZWF0dXJlcyBhbmQgaW1wcm92ZW1lbnRzLgotKwotK1xmQk1hbiBwYWdlIGF1dGhvcnM6XGZSCi0rLmJyCi0rTWFyY3VzIEJyaW5rbWFubiA8TWFyY3VzLkJyaW5rbWFubkBydWhyLXVuaS1ib2NodW0uZGU+LAotKy5icgotK1RlcnJhbiBNZWxjb25pYW4gPHRlcnJhbkBjb25zaXN0ZW50Lm9yZz4sCi0rLmJyCi0rVGltIFdhdWdoIDx0d2F1Z2hAcmVkaGF0LmNvbT4sCi0rLmJyCi0rQ29uc3RhbnRpbiBLYXBsaW5za3kgPGNvbnN0QGNlLmNjdHB1LmVkdS5ydT4KLSsuYnIKLStLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdm5jdmlld2VyLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdm5jdmlld2VyLmMJMjAwNC0wMS0xMyAwOToyMjowNS4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdm5jdmlld2VyLmMJMjAxMC0wNC0xOCAxMjo0Mzo0Ny4wMDAwMDAwMDAgLTA0MDAKLUBAIC0yMiw2ICsyMiw4IEBACi0gICovCi0gCi0gI2luY2x1ZGUgInZuY3ZpZXdlci5oIgotKyNpbmNsdWRlIDxjdHlwZS5oPgotKyNpbmNsdWRlIDxYMTEvWGF3L1RvZ2dsZS5oPgotIAotIGNoYXIgKnByb2dyYW1OYW1lOwotIFh0QXBwQ29udGV4dCBhcHBDb250ZXh0OwotQEAgLTI5LDExICszMSwyNzQgQEAKLSAKLSBXaWRnZXQgdG9wbGV2ZWw7Ci0gCi0rZXh0ZXJuIHZvaWQgcmFpc2VtZShpbnQgZm9yY2UpOwotK2V4dGVybiB2b2lkIENyZWF0ZUNoYXQodm9pZCk7Ci0rCi0rdm9pZCBzZXRfc2J3aWR0aChpbnQgc2J3KSB7Ci0rCWNoYXIgKnEsICpwLCB0WzVdOwotKwlpbnQgaSwgaywgTiA9IDQ7Ci0rCWludCBkYiA9IDA7Ci0rCi0rCWlmIChzYncgPCAxKSB7Ci0rCQlzYncgPSAyOwotKwl9IGVsc2UgaWYgKHNidyA+IDEwMCkgewotKwkJc2J3ID0gMTAwOwotKwl9Ci0rCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzYnc6ICVkXG4iLCBzYncpOwotKwotKwlzcHJpbnRmKHQsICIlNGQiLCBzYncpOwotKwlrID0gMDsKLSsJd2hpbGUgKGZhbGxiYWNrX3Jlc291cmNlc1trXSAhPSBOVUxMKSB7Ci0rCQlxID0gc3Ryc3RyKGZhbGxiYWNrX3Jlc291cmNlc1trXSwgImhvcml6b250YWwuaGVpZ2h0OiAiKTsKLSsJCWlmICghcSkgewotKwkJCXEgPSBzdHJzdHIoZmFsbGJhY2tfcmVzb3VyY2VzW2tdLCAidmVydGljYWwud2lkdGg6ICIpOwotKwkJfQotKwkJaWYgKHEpIHsKLSsJCQlwID0gc3RyZHVwKGZhbGxiYWNrX3Jlc291cmNlc1trXSk7Ci0rCQkJcSA9IHN0cnN0cihwLCAiOiAgICIpOwotKwkJCWlmIChxKSB7Ci0rCQkJCXErKzsKLSsJCQkJcSsrOwotKwkJCQlmb3IgKGk9MDsgaSA8IE47IGkrKykgewotKwkJCQkJKihxK2kpID0gdFtpXTsKLSsJCQkJfQotKwkJCQlmYWxsYmFja19yZXNvdXJjZXNba10gPSBwOwotKwkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicmVzOiAlc1xuXG4iLCBwKTsKLSsJCQl9Ci0rCQl9Ci0rCQlrKys7Ci0rCX0KLSt9Ci0rCi0rdm9pZCBtaW5fdGl0bGUodm9pZCkgewotKwljaGFyICpxOwotKwlpbnQgazsKLSsKLSsJayA9IDA7Ci0rCXdoaWxlIChmYWxsYmFja19yZXNvdXJjZXNba10gIT0gTlVMTCkgewotKwkJcSA9IHN0cnN0cihmYWxsYmFja19yZXNvdXJjZXNba10sICJTc3ZuYy50aXRsZTogIik7Ci0rCQlpZiAocSkgewotKwkJCWZhbGxiYWNrX3Jlc291cmNlc1trXSA9IHN0cmR1cCgiU3N2bmMudGl0bGU6ICVzIik7Ci0rCQl9Ci0rCQlrKys7Ci0rCX0KLSt9Ci0rCi0rI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgotKyNpbmNsdWRlIDx1bmlzdGQuaD4KLSsKLSt2b2lkIHVuaXhwdyhjaGFyICppbnN0ciwgaW50IHZlbmNyeXB0X3BsYWluKSB7Ci0rCWNoYXIgKnN0ciwgKnEsICppbmZpbGUgPSBOVUxMOwotKwlGSUxFICppbjsKLSsJaW50IGksIHJtZmlsZSA9IDA7Ci0rCXN0cnVjdCBzdGF0IHNiOwotKwlpbnQgTiA9IDk5OwotKwljaGFyIHVzZXJuYW1lWzEwMF0sIHBhc3N3ZFsxMDBdOwotKwlzdGF0aWMgaW50IGRpZCA9IDA7Ci0rCi0rCWlmIChkaWQpIHsKLSsJCXJldHVybjsKLSsJfQotKwlkaWQgPSAxOwotKwotKwlmb3IgKGk9MDsgaTwxMDA7IGkrKykgewotKwkJdXNlcm5hbWVbaV0gPSAnXDAnOwotKwkJcGFzc3dkW2ldID0gJ1wwJzsKLSsJfQotKwotKwlpZiAoaW5zdHIgPT0gTlVMTCkgewotKwkJcmV0dXJuOwotKwl9IGVsc2UgaWYgKCFzdHJjbXAoaW5zdHIsICIiKSkgewotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCXN0ciA9IHN0cmR1cChpbnN0cik7Ci0rCQotKwlpZiAoc3Ryc3RyKHN0ciwgInJtOiIpID09IHN0cikgewotKwkJcm1maWxlID0gMTsKLSsJCWluZmlsZSA9IHN0ciArIHN0cmxlbigicm06Iik7Ci0rCX0gZWxzZSBpZiAoc3RhdChzdHIsICZzYikgPT0gMCkgewotKwkJaW5maWxlID0gc3RyOwotKwl9Ci0rCWlmICghc3RyY21wKHN0ciwgIi4iKSkgewotKwkJY2hhciAqcDsKLSsJCWlmICghdXNlX3R0eSgpKSB7Ci0rCQkJY2hhciAqdTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRW50ZXIgVW5peCBVc2VybmFtZSBhbmQgUGFzc3dvcmQgaW4gdGhlIHBvcHVwcy5cbiIpOwotKwkJCXUgPSBEb1VzZXJEaWFsb2coKTsKLSsJCQlpZiAoc3RybGVuKHUpID49IDEwMCkgewotKwkJCQlleGl0KDEpOwotKwkJCX0KLSsJCQlzcHJpbnRmKHVzZXJuYW1lLCB1KTsKLSsJCQlwID0gRG9QYXNzd29yZERpYWxvZygpOwotKwkJfSBlbHNlIHsKLSsJCQlyYWlzZW1lKDEpOwotKwkJCWZwcmludGYoc3RkZXJyLCAiXG5Vbml4IFVzZXJuYW1lOiAiKTsKLSsJCQlpZiAoZmdldHModXNlcm5hbWUsIE4sIHN0ZGluKSA9PSBOVUxMKSB7Ci0rCQkJCWV4aXQoMSk7Ci0rCQkJfQotKwkJCXAgPSBnZXRwYXNzKCJVbml4IFBhc3N3b3JkOiAiKTsKLSsJCX0KLSsJCWlmICghIHApIHsKLSsJCQlleGl0KDEpOwotKwkJfQotKwkJc3RybmNweShwYXNzd2QsIHAsIE4pOwotKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotKwkJCi0rCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICItIikpIHsKLSsJCWNoYXIgKnAsICpxOwotKwkJaWYgKCF1c2VfdHR5KCkpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRW50ZXIgdW5peHVzZXJAdW5peHBhc3N3ZCBpbiB0aGUgcG9wdXAuXG4iKTsKLSsJCQlwID0gRG9QYXNzd29yZERpYWxvZygpOwotKwkJfSBlbHNlIHsKLSsJCQlyYWlzZW1lKDEpOwotKwkJCXAgPSBnZXRwYXNzKCJ1bml4dXNlckB1bml4cGFzc3dkOiAiKTsKLSsJCX0KLSsJCWlmICghIHApIHsKLSsJCQlleGl0KDEpOwotKwkJfQotKwkJcSA9IHN0cmNocihwLCAnQCcpOwotKwkJaWYgKCEgcSkgewotKwkJCWV4aXQoMSk7Ci0rCQl9Ci0rCQkqcSA9ICdcMCc7Ci0rCQlzdHJuY3B5KHVzZXJuYW1lLCBwLCBOKTsKLSsJCXN0cm5jcHkocGFzc3dkLCBxKzEsIE4pOwotKwkJCi0rCX0gZWxzZSBpZiAoaW5maWxlKSB7Ci0rCQlpbiA9IGZvcGVuKGluZmlsZSwgInIiKTsJCi0rCQlpZiAoaW4gPT0gTlVMTCkgewotKwkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gLXVuaXhwdyBmaWxlLlxuIik7Ci0rCQkJZXhpdCgxKTsKLSsJCX0KLSsJCWlmIChmZ2V0cyh1c2VybmFtZSwgTiwgaW4pID09IE5VTEwpIHsKLSsJCQlleGl0KDEpOwotKwkJfQotKwkJaWYgKGZnZXRzKHBhc3N3ZCwgTiwgaW4pID09IE5VTEwpIHsKLSsJCQlleGl0KDEpOwotKwkJfQotKwkJZmNsb3NlKGluKTsKLSsJCWZwcmludGYoc3RkZXJyLCAicmVhZCB1c2VybmFtZUBwYXNzd2QgZnJvbSBmaWxlOiAlc1xuIiwgaW5maWxlKTsKLSsJCWlmIChybWZpbGUpIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImRlbGV0aW5nIHVzZXJuYW1lQHBhc3N3ZCBmaWxlOiAgJXNcbiIsIGluZmlsZSk7Ci0rCQkJdW5saW5rKGluZmlsZSk7Ci0rCQl9Ci0rCX0gZWxzZSBpZiAoc3RyY2hyKHN0ciwgJ0AnKSkgIHsKLSsJCWNoYXIgKnEgPSBzdHJjaHIoc3RyLCAnQCcpOwotKwkJKnEgPSAnXDAnOwotKwkJc3RybmNweSh1c2VybmFtZSwgc3RyLCBOKTsKLSsJCXN0cm5jcHkocGFzc3dkLCBxKzEsIE4pOwotKwl9IGVsc2UgewotKwkJZXhpdCgxKTsKLSsJfQotKwotKwlmcmVlKHN0cik7Ci0rCQotKwlpZiAodmVuY3J5cHRfcGxhaW4pIHsKLSsJCUNBUkQzMiB1bGVuLCBwbGVuOwotKwkJY2hhciAqcTsKLSsKLSsJCXEgPSBzdHJyY2hyKHVzZXJuYW1lLCAnXG4nKTsKLSsJCWlmIChxKSAqcSA9ICdcMCc7Ci0rCQlxID0gc3RycmNocihwYXNzd2QsICdcbicpOwotKwkJaWYgKHEpICpxID0gJ1wwJzsKLSsKLSsJCXVsZW4gPSBTd2FwMzJJZkxFKChDQVJEMzIpc3RybGVuKHVzZXJuYW1lKSk7Ci0rCQlwbGVuID0gU3dhcDMySWZMRSgoQ0FSRDMyKXN0cmxlbihwYXNzd2QpKTsKLSsKLSsJCWlmICghV3JpdGVFeGFjdChyZmJzb2NrLCAoY2hhciAqKSZ1bGVuLCA0KSB8fAotKwkJICAgICFXcml0ZUV4YWN0KHJmYnNvY2ssIChjaGFyICopJnBsZW4sIDQpKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwotKwkJaWYgKCFXcml0ZUV4YWN0KHJmYnNvY2ssIHVzZXJuYW1lLCBzdHJsZW4odXNlcm5hbWUpKSB8fAotKwkJICAgICFXcml0ZUV4YWN0KHJmYnNvY2ssIHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCkpKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwkJcmV0dXJuOwotKwl9Ci0rCi0rCi0rCWlmICghIGdldGVudigiU1NWTkNfVU5JWFBXX05PRVNDIikpIHsKLSsJCVNlbmRLZXlFdmVudChYS19Fc2NhcGUsIDEpOwotKwkJU2VuZEtleUV2ZW50KFhLX0VzY2FwZSwgMCk7Ci0rCX0KLSsKLSsJcSA9IHVzZXJuYW1lOwotKwl3aGlsZSAoKnEgIT0gJ1wwJyAmJiAqcSAhPSAnXG4nKSB7Ci0rCQljaGFyIGMgPSAqcTsKLSsJCWlmIChjID49IDB4MjAgJiYgYyA8PSAweDA3ZSkgewotKwkJCUtleVN5bSBrcyA9IChLZXlTeW0pIGM7Ci0rCQkJU2VuZEtleUV2ZW50KGtzLCAxKTsKLSsJCQlTZW5kS2V5RXZlbnQoa3MsIDApOwotKwkJfQotKwkJcSsrOwotKwl9Ci0rCi0rCVNlbmRLZXlFdmVudChYS19SZXR1cm4sIDEpOwotKwlTZW5kS2V5RXZlbnQoWEtfUmV0dXJuLCAwKTsKLSsJCi0rCXEgPSBwYXNzd2Q7Ci0rCXdoaWxlICgqcSAhPSAnXDAnICYmICpxICE9ICdcbicpIHsKLSsJCWNoYXIgYyA9ICpxOwotKwkJaWYgKGMgPj0gMHgyMCAmJiBjIDw9IDB4MDdlKSB7Ci0rCQkJS2V5U3ltIGtzID0gKEtleVN5bSkgYzsKLSsJCQlTZW5kS2V5RXZlbnQoa3MsIDEpOwotKwkJCVNlbmRLZXlFdmVudChrcywgMCk7Ci0rCQl9Ci0rCQlxKys7Ci0rCX0KLSsKLSsJU2VuZEtleUV2ZW50KFhLX1JldHVybiwgMSk7Ci0rCVNlbmRLZXlFdmVudChYS19SZXR1cm4sIDApOwotK30KLSsKLStzdGF0aWMgdm9pZCBjaGF0X3dpbmRvd19vbmx5KHZvaWQpIHsKLSsJaWYgKGFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCXN0YXRpYyBkb3VibGUgbGFzdF90aW1lID0gMC4wOwotKwkJaWYgKGRub3coKSA+IGxhc3RfdGltZSArIDEuNSkgewotKwkJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJCVhVbm1hcFdpbmRvdyhkcHksIFh0V2luZG93KHRvcGxldmVsKSk7Ci0rCQl9Ci0rCX0KLSt9Ci0rCi0raW50IHNhd19hcHBzaGFyZSA9IDA7Ci0rCi0gaW50Ci0gbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0gewotLSAgaW50IGk7Ci0tICBwcm9ncmFtTmFtZSA9IGFyZ3ZbMF07Ci0rCWludCBpLCBzYXZlX3Nidywgc2F3X2xpc3RlbiA9IDA7Ci0rCWNoYXIgKnB3X2xvYyA9IE5VTEw7Ci0rCXByb2dyYW1OYW1lID0gYXJndlswXTsKLSsKLSsJaWYgKHN0cnJjaHIocHJvZ3JhbU5hbWUsICcvJykgIT0gTlVMTCkgewotKwkJcHJvZ3JhbU5hbWUgPSBzdHJyY2hyKHByb2dyYW1OYW1lLCAnLycpICsgMTsKLSsJfQotKwotKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVudiIpKSB7Ci0rCQkJaWYgKGkrMSA8IGFyZ2MpIHsKLSsJCQkJY2hhciAqZXN0ciA9IGFyZ3ZbaSsxXTsKLSsJCQkJaWYgKHN0cmNocihlc3RyLCAnPScpKSB7Ci0rCQkJCQlwdXRlbnYoZXN0cik7Ci0rCQkJCX0KLSsJCQl9Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW5vaXB2NCIpKSB7Ci0rCQkJcHV0ZW52KCJWTkNWSUVXRVJfTk9fSVBWND0xIik7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW5vaXB2NiIpKSB7Ci0rCQkJcHV0ZW52KCJWTkNWSUVXRVJfTk9fSVBWNj0xIik7Ci0rCQl9Ci0rCX0KLSsJaWYgKGdldGVudigiVk5DVklFV0VSX05PX0lQVjQiKSkgewotKwkJYXBwRGF0YS5ub2lwdjQgPSBUcnVlOwotKwl9Ci0rCWlmIChnZXRlbnYoIlZOQ1ZJRVdFUl9OT19JUFY2IikpIHsKLSsJCWFwcERhdGEubm9pcHY2ID0gVHJ1ZTsKLSsJfQotIAotICAgLyogVGhlIC1saXN0ZW4gb3B0aW9uIGlzIHVzZWQgdG8gbWFrZSB1cyBhIGRhZW1vbiBwcm9jZXNzIHdoaWNoIGxpc3RlbnMgZm9yCi0gICAgICBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHNlcnZlcnMsIHJhdGhlciB0aGFuIGFjdGl2ZWx5IGNvbm5lY3RpbmcgdG8gYQotQEAgLTQ1LDg5ICszMTAsMTc0NCBAQAotICAgICAgbGlzdGVuRm9ySW5jb21pbmdDb25uZWN0aW9ucygpIHJldHVybnMsIHNldHRpbmcgdGhlIGxpc3RlblNwZWNpZmllZAotICAgICAgZmxhZy4gKi8KLSAKLS0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLS0gICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWxpc3RlbiIpID09IDApIHsKLS0gICAgICBsaXN0ZW5Gb3JJbmNvbWluZ0Nvbm5lY3Rpb25zKCZhcmdjLCBhcmd2LCBpKTsKLS0gICAgICBicmVhazsKLS0gICAgfQotLSAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItdHVubmVsIikgPT0gMCB8fCBzdHJjbXAoYXJndltpXSwgIi12aWEiKSA9PSAwKSB7Ci0tICAgICAgaWYgKCFjcmVhdGVUdW5uZWwoJmFyZ2MsIGFyZ3YsIGkpKQotLQlleGl0KDEpOwotLSAgICAgIGJyZWFrOwotLSAgICB9Ci0tICB9Ci0rCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSsJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItYXBwc2hhcmUiKSkgewotKwkJCXB1dGVudigiU1NWTkNfTVVMVElQTEVfTElTVEVOPTEiKTsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgIkVuYWJsaW5nIC1tdWx0aWxpc3RlbiBtb2RlIGZvciAneDExdm5jIC1hcHBzaGFyZScgdXNhZ2UuXG5cbiIpOwotKwkJCXNhd19hcHBzaGFyZSA9IDE7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW11bHRpbGlzdGVuIikpIHsKLSsJCQlwdXRlbnYoIlNTVk5DX01VTFRJUExFX0xJU1RFTj0xIik7Ci0rCQkJc2F3X2xpc3RlbiA9IDI7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWxpc3RlbiIpKSB7Ci0rCQkJc2F3X2xpc3RlbiA9IDE7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWFjY2VwdHBvcHVwIikpIHsKLSsJCQlwdXRlbnYoIlNTVk5DX0FDQ0VQVF9QT1BVUD0xIik7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWFjY2VwdHBvcHVwc2MiKSkgewotKwkJCXB1dGVudigiU1NWTkNfQUNDRVBUX1BPUFVQX1NDPTEiKTsKLSsJCX0KLSsJCWlmIChzdHJzdHIoYXJndltpXSwgIiBwdz0iKSAhPSBOVUxMKSB7Ci0rCQkJcHdfbG9jID0gc3Ryc3RyKGFyZ3ZbaV0sICIgcHc9IikgKyAxOwotKwkJfQotKwl9Ci0rCi0rCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSsJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItYXBwc2hhcmUiKSAmJiAhc2F3X2xpc3RlbikgewotKwkJCWxpc3RlbkZvckluY29taW5nQ29ubmVjdGlvbnMoJmFyZ2MsIGFyZ3YsIGkpOwotKwkJCWJyZWFrOwotKwkJfQotKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1tdWx0aWxpc3RlbiIpKSB7Ci0rCQkJbGlzdGVuRm9ySW5jb21pbmdDb25uZWN0aW9ucygmYXJnYywgYXJndiwgaSk7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWxpc3RlbiIpKSB7Ci0rCQkJbGlzdGVuRm9ySW5jb21pbmdDb25uZWN0aW9ucygmYXJnYywgYXJndiwgaSk7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXR1bm5lbCIpIHx8ICFzdHJjbXAoYXJndltpXSwgIi12aWEiKSkgewotKwkJCWlmICghY3JlYXRlVHVubmVsKCZhcmdjLCBhcmd2LCBpKSkgewotKwkJCQlleGl0KDEpOwotKwkJCX0KLSsJCQlicmVhazsKLSsJCX0KLSsJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItcHJpbnRyZXMiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICItcmVzIikpIHsKLSsJCQlpbnQgaiA9IDA7Ci0rCQkJZnByaW50ZihzdGRvdXQsICJcbiEgU3N2bmMgZmFsbGJhY2sgWCByZXNvdXJjZXM6XG5cbiIpOwotKwkJCXdoaWxlICgxKSB7Ci0rCQkJCWNoYXIgKnAgPSBmYWxsYmFja19yZXNvdXJjZXNbaisrXTsKLSsJCQkJaW50IGsgPSAwOwotKwkJCQlpZiAocCA9PSBOVUxMKSBicmVhazsKLSsJCQkJd2hpbGUgKCpwICE9ICdcMCcpIHsKLSsJCQkJCWZwcmludGYoc3Rkb3V0LCAiJWMiLCAqcCk7Ci0rCQkJCQlpZiAoayA+IDAgJiYgKnAgPT0gJ24nICYmICoocC0xKSA9PSAnXFwnKSB7Ci0rCQkJCQkJZnByaW50ZihzdGRvdXQsICJcXFxuIik7Ci0rCQkJCQl9Ci0rCQkJCQlwKys7IGsrKzsKLSsJCQkJfQotKwkJCQlmcHJpbnRmKHN0ZG91dCwgIlxuXG4iKTsKLSsJCQl9Ci0rCQkJZXhpdCgwKTsJCi0rCQl9Ci0rCX0KLSsKLSsKLSsJaWYgKGFyZ2MgPiAxICYmIHN0cnN0cihhcmd2WzFdLCAiLWgiKSA9PSBhcmd2WzFdKSB7Ci0rCQl1c2FnZSgpOwotKwkJcmV0dXJuIDA7Ci0rCX0KLSAKLSAgIC8qIENhbGwgdGhlIG1haW4gWHQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24uICBJdCBwYXJzZXMgY29tbWFuZC1saW5lIG9wdGlvbnMsCi0gICAgICBnZW5lcmF0aW5nIGFwcHJvcHJpYXRlIHJlc291cmNlIHNwZWNzLCBhbmQgbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBYCi0gICAgICBkaXNwbGF5LiAqLwotIAotLSAgdG9wbGV2ZWwgPSBYdFZhQXBwSW5pdGlhbGl6ZSgmYXBwQ29udGV4dCwgIlZuY3ZpZXdlciIsCi0tCQkJICAgICAgIGNtZExpbmVPcHRpb25zLCBudW1DbWRMaW5lT3B0aW9ucywKLS0JCQkgICAgICAgJmFyZ2MsIGFyZ3YsIGZhbGxiYWNrX3Jlc291cmNlcywKLS0JCQkgICAgICAgWHROYm9yZGVyV2lkdGgsIDAsIE5VTEwpOwotKwlpZiAoc2F3X2FwcHNoYXJlIHx8IGdldGVudigiVk5DVklFV0VSX01JTl9USVRMRSIpKSB7Ci0rCQltaW5fdGl0bGUoKTsKLSsJfQotKwlhcHBEYXRhLnNiV2lkdGggPSAwOwotKwlpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfU0JXSURUSCIpKSB7Ci0rCQlpbnQgc2J3ID0gYXRvaShnZXRlbnYoIlZOQ1ZJRVdFUl9TQldJRFRIIikpOwotKwkJaWYgKHNidyA+IDApIHsKLSsJCQlhcHBEYXRhLnNiV2lkdGggPSBzYnc7Ci0rCQl9Ci0rCX0KLSsJaWYgKGFwcERhdGEuc2JXaWR0aCA9PSAwKSB7Ci0rCQlpbnQgaSwgc2J3ID0gMDsKLSsJCWZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7Ci0rCQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1zYndpZHRoIikpIHsKLSsJCQkJc2J3ID0gYXRvaShhcmd2W2krMV0pOwotKwkJCX0KLSsJCX0KLSsJCWlmIChzYncgPiAwKSB7Ci0rCQkJYXBwRGF0YS5zYldpZHRoID0gc2J3OwotKwkJfQotKwl9Ci0rCXNhdmVfc2J3ID0gYXBwRGF0YS5zYldpZHRoOwotKwlpZiAoc2F2ZV9zYncgPiAwKSB7Ci0rCQlzZXRfc2J3aWR0aChzYXZlX3Nidyk7Ci0rCX0gZWxzZSB7Ci0rCQlzZXRfc2J3aWR0aCg2KTsKLSsJfQotKwotKwl0b3BsZXZlbCA9IFh0VmFBcHBJbml0aWFsaXplKCZhcHBDb250ZXh0LCAiU3N2bmMiLCBjbWRMaW5lT3B0aW9ucywKLSsJICAgIG51bUNtZExpbmVPcHRpb25zLCAmYXJnYywgYXJndiwgZmFsbGJhY2tfcmVzb3VyY2VzLAotKwkgICAgWHROYm9yZGVyV2lkdGgsIDAsIE5VTEwpOwotIAotLSAgZHB5ID0gWHREaXNwbGF5KHRvcGxldmVsKTsKLSsJZHB5ID0gWHREaXNwbGF5KHRvcGxldmVsKTsKLSAKLSAgIC8qIEludGVycHJldCByZXNvdXJjZSBzcGVjcyBhbmQgcHJvY2VzcyBhbnkgcmVtYWluaW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgIChpLmUuIHRoZSBWTkMgc2VydmVyIG5hbWUpLiAgSWYgdGhlIHNlcnZlciBuYW1lIGlzbid0IHNwZWNpZmllZCBvbiB0aGUKLSAgICAgIGNvbW1hbmQgbGluZSwgZ2V0QXJnc0FuZFJlc291cmNlcygpIHdpbGwgcG9wIHVwIGEgZGlhbG9nIGJveCBhbmQgd2FpdAotICAgICAgZm9yIG9uZSB0byBiZSBlbnRlcmVkLiAqLwotIAotLSAgR2V0QXJnc0FuZFJlc291cmNlcyhhcmdjLCBhcmd2KTsKLSsJR2V0QXJnc0FuZFJlc291cmNlcyhhcmdjLCBhcmd2KTsKLSsKLSsJaWYgKHNhd19hcHBzaGFyZSkgewotKwkJYXBwRGF0YS5hcHBTaGFyZSA9IFRydWU7Ci0rCX0KLSsKLSsJaWYgKHNhdmVfc2J3KSB7Ci0rCQlhcHBEYXRhLnNiV2lkdGggPSBzYXZlX3NidzsKLSsJfQotKwotKwlpZiAoYXBwRGF0YS5jaGF0T25seSkgewotKwkJYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcgPSAicmF3IGhleHRpbGUiOwotKwl9Ci0rCi0rCWlmIChwd19sb2MgIT0gTlVMTCkgewotKwkJY2hhciAqcSA9IHB3X2xvYzsKLSsJCXdoaWxlICgqcSAhPSAnXDAnICYmICFpc3NwYWNlKCpxKSkgewotKwkJCSpxID0gJyAnOwotKwkJCXErKzsKLSsJCX0KLSsJfQotIAotICAgLyogVW5sZXNzIHdlIGFjY2VwdGVkIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIG1ha2UgYSBUQ1AgY29ubmVjdGlvbiB0byB0aGUKLSAgICAgIGdpdmVuIFZOQyBzZXJ2ZXIgKi8KLSAKLS0gIGlmICghbGlzdGVuU3BlY2lmaWVkKSB7Ci0tICAgIGlmICghQ29ubmVjdFRvUkZCU2VydmVyKHZuY1NlcnZlckhvc3QsIHZuY1NlcnZlclBvcnQpKSBleGl0KDEpOwotLSAgfQotKwlpZiAoYXBwRGF0YS5yZXBlYXRlclVsdHJhID09IE5VTEwpIHsKLSsJCWlmIChnZXRlbnYoIlNTVk5DX1JFUEVBVEVSIikgIT0gTlVMTCkgewotKwkJCWFwcERhdGEucmVwZWF0ZXJVbHRyYSA9IHN0cmR1cChnZXRlbnYoIlNTVk5DX1JFUEVBVEVSIikpOwotKwkJfQotKwl9Ci0rCi0rCWlmICghbGlzdGVuU3BlY2lmaWVkKSB7Ci0rCQlpZiAoIUNvbm5lY3RUb1JGQlNlcnZlcih2bmNTZXJ2ZXJIb3N0LCB2bmNTZXJ2ZXJQb3J0KSkgewotKwkJCWV4aXQoMSk7Ci0rCQl9Ci0rCQlpZiAoYXBwRGF0YS5yZXBlYXRlclVsdHJhICE9IE5VTEwpIHsKLSsJCQljaGFyIHRtcFsyNTZdOwotKwkJCWlmIChzdHJzdHIoYXBwRGF0YS5yZXBlYXRlclVsdHJhLCAiU0NJSUk9IikgPT0gYXBwRGF0YS5yZXBlYXRlclVsdHJhKSB7Ci0rCQkJCWFwcERhdGEucmVwZWF0ZXJVbHRyYSA9IHN0cmR1cChhcHBEYXRhLnJlcGVhdGVyVWx0cmEgKyBzdHJsZW4oIlNDSUlJPSIpKTsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJzZW5kaW5nICd0ZXN0QicgdG8gdWx0cmF2bmMgU0MgSUlJIFNTTCByZXBlYXRlci4uLlxuIik7Ci0rCQkJCVdyaXRlRXhhY3QocmZic29jaywgInRlc3RCIiAsIDUpOyAKLSsJCQl9Ci0rCQkJaWYgKFJlYWRGcm9tUkZCU2VydmVyKHRtcCwgMTIpKSB7Ci0rCQkJCXRtcFsxMl0gPSAnXDAnOwotKwkJCQlmcHJpbnRmKHN0ZGVyciwgInJlcGVhdGVyIDFzdCBwcm90byBsaW5lOiAnJXMnXG4iLCB0bXApOwotKwkJCQlpZiAoc3Ryc3RyKHRtcCwgIlJGQiAwMDAuMDAwIikgPT0gdG1wKSB7Ci0rCQkJCQlpbnQgaTsKLSsJCQkJCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0rCQkJCQkJdG1wW2ldID0gJ1wwJzsKLSsJCQkJCX0KLSsJCQkJCWZvciAoaT0wOyBpPDI1MDsgaSsrKSB7Ci0rCQkJCQkJaWYgKGkgPj0gKGludCkgc3RybGVuKGFwcERhdGEucmVwZWF0ZXJVbHRyYSkpIHsKLSsJCQkJCQkJYnJlYWs7Ci0rCQkJCQkJfQotKwkJCQkJCXRtcFtpXSA9IGFwcERhdGEucmVwZWF0ZXJVbHRyYVtpXTsKLSsJCQkJCX0KLSsJCQkJCWZwcmludGYoc3RkZXJyLCAic2VuZGluZyAnJXMnIHRvIHJlcGVhdGVyLi4uXG4iLCB0bXApOwotKwkJCQkJV3JpdGVFeGFjdChyZmJzb2NrLCB0bXAsIDI1MCk7IAotKwkJCQl9Ci0rCQkJfSBlbHNlIHsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJyZXBlYXRlciBOTyBwcm90byBsaW5lIVxuIik7Ci0rCQkJfQotKwkJfQotKwl9Ci0gCi0gICAvKiBJbml0aWFsaXNlIHRoZSBWTkMgY29ubmVjdGlvbiwgaW5jbHVkaW5nIHJlYWRpbmcgdGhlIHBhc3N3b3JkICovCi0gCi0tICBpZiAoIUluaXRpYWxpc2VSRkJDb25uZWN0aW9uKCkpIGV4aXQoMSk7Ci0rCWlmICghSW5pdGlhbGlzZVJGQkNvbm5lY3Rpb24oKSkgewotKwkJQ2xlYW51cCgpOwotKwkJZXhpdCgxKTsKLSsJfQotKwlpZiAoYXBwRGF0YS51bml4UFcgIT0gTlVMTCkgewotKwkJdW5peHB3KGFwcERhdGEudW5peFBXLCAwKTsKLSsJfSBlbHNlIGlmIChnZXRlbnYoIlNTVk5DX1VOSVhQVyIpKSB7Ci0rCQl1bml4cHcoZ2V0ZW52KCJTU1ZOQ19VTklYUFciKSwgMCk7Ci0rCX0KLSAKLSAgIC8qIENyZWF0ZSB0aGUgInBvcHVwIiB3aWRnZXQgLSB0aGlzIHdvbid0IGFjdHVhbGx5IGFwcGVhciBvbiB0aGUgc2NyZWVuIHVudGlsCi0gICAgICBzb21lIHVzZXItZGVmaW5lZCBldmVudCBjYXVzZXMgdGhlICJTaG93UG9wdXAiIGFjdGlvbiB0byBiZSBpbnZva2VkICovCi0gCi0tICBDcmVhdGVQb3B1cCgpOwotKwlDcmVhdGVQb3B1cCgpOwotKwlDcmVhdGVTY2FsZU4oKTsKLSsJQ3JlYXRlVHVyYm9WTkMoKTsKLSsJQ3JlYXRlUXVhbGl0eSgpOwotKwlDcmVhdGVDb21wcmVzcygpOwotKwlDcmVhdGVDaGF0KCk7Ci0gCi0gICAvKiBGaW5kIHRoZSBiZXN0IHBpeGVsIGZvcm1hdCBhbmQgWCB2aXN1YWwvY29sb3JtYXAgdG8gdXNlICovCi0gCi0tICBTZXRWaXN1YWxBbmRDbWFwKCk7Ci0rCVNldFZpc3VhbEFuZENtYXAoKTsKLSAKLSAgIC8qIENyZWF0ZSB0aGUgImRlc2t0b3AiIHdpZGdldCwgYW5kIHBlcmZvcm0gaW5pdGlhbGlzYXRpb24gd2hpY2ggbmVlZHMgZG9pbmcKLSAgICAgIGJlZm9yZSB0aGUgd2lkZ2V0cyBhcmUgcmVhbGl6ZWQgKi8KLSAKLS0gIFRvcGxldmVsSW5pdEJlZm9yZVJlYWxpemF0aW9uKCk7Ci0rCVRvcGxldmVsSW5pdEJlZm9yZVJlYWxpemF0aW9uKCk7Ci0gCi0tICBEZXNrdG9wSW5pdEJlZm9yZVJlYWxpemF0aW9uKCk7Ci0rCURlc2t0b3BJbml0QmVmb3JlUmVhbGl6YXRpb24oKTsKLSAKLSAgIC8qICJSZWFsaXplIiBhbGwgdGhlIHdpZGdldHMsIGkuZS4gYWN0dWFsbHkgY3JlYXRlIGFuZCBtYXAgdGhlaXIgWCB3aW5kb3dzICovCi0gCi0tICBYdFJlYWxpemVXaWRnZXQodG9wbGV2ZWwpOwotKwlYdFJlYWxpemVXaWRnZXQodG9wbGV2ZWwpOwotIAotICAgLyogUGVyZm9ybSBpbml0aWFsaXNhdGlvbiB0aGF0IG5lZWRzIGRvaW5nIGFmdGVyIHJlYWxpemF0aW9uLCBub3cgdGhhdCB0aGUgWAotICAgICAgd2luZG93cyBleGlzdCAqLwotIAotLSAgSW5pdGlhbGlzZVNlbGVjdGlvbigpOwotKwlJbml0aWFsaXNlU2VsZWN0aW9uKCk7Ci0gCi0tICBUb3BsZXZlbEluaXRBZnRlclJlYWxpemF0aW9uKCk7Ci0rCVRvcGxldmVsSW5pdEFmdGVyUmVhbGl6YXRpb24oKTsKLSAKLS0gIERlc2t0b3BJbml0QWZ0ZXJSZWFsaXphdGlvbigpOwotKwlEZXNrdG9wSW5pdEFmdGVyUmVhbGl6YXRpb24oKTsKLSAKLSAgIC8qIFRlbGwgdGhlIFZOQyBzZXJ2ZXIgd2hpY2ggcGl4ZWwgZm9ybWF0IGFuZCBlbmNvZGluZ3Mgd2Ugd2FudCB0byB1c2UgKi8KLSAKLS0gIFNldEZvcm1hdEFuZEVuY29kaW5ncygpOwotKwlTZXRGb3JtYXRBbmRFbmNvZGluZ3MoKTsKLSsKLSsJaWYgKGFwcERhdGEuY2hhdE9ubHkpIHsKLSsJCWNoYXRfd2luZG93X29ubHkoKTsKLSsJCVRvZ2dsZVRleHRDaGF0KDAsIE5VTEwsIE5VTEwsIE5VTEwpOwotKwl9Ci0gCi0gICAvKiBOb3cgZW50ZXIgdGhlIG1haW4gbG9vcCwgcHJvY2Vzc2luZyBWTkMgbWVzc2FnZXMuICBYIGV2ZW50cyB3aWxsCi0gICAgICBhdXRvbWF0aWNhbGx5IGJlIHByb2Nlc3NlZCB3aGVuZXZlciB0aGUgVk5DIGNvbm5lY3Rpb24gaXMgaWRsZS4gKi8KLSAKLS0gIHdoaWxlICgxKSB7Ci0tICAgIGlmICghSGFuZGxlUkZCU2VydmVyTWVzc2FnZSgpKQotLSAgICAgIGJyZWFrOwotLSAgfQotKwl3aGlsZSAoMSkgewotKwkJaWYgKCFIYW5kbGVSRkJTZXJ2ZXJNZXNzYWdlKCkpIHsKLSsJCQlicmVhazsKLSsJCX0KLSsJCWlmIChhcHBEYXRhLmNoYXRPbmx5KSB7Ci0rCQkJY2hhdF93aW5kb3dfb25seSgpOwotKwkJfQotKwl9Ci0rCi0rCUNsZWFudXAoKTsKLSsKLSsJcmV0dXJuIDA7Ci0rfQotKwotKy8qCi0rICogVG9nZ2xlOGJwcAotKyAqLwotKwotK3N0YXRpYyBpbnQgbGFzdF9uY29sb3JzID0gMDsKLStzdGF0aWMgaW50IHNhdmVfdXNlQkdSMjMzID0gMDsKLStzdGF0aWMgQm9vbCBzYXZlX3VzZUJHUjU2NSA9IEZhbHNlOwotKwotK3N0YXRpYyBXaWRnZXQgYjggICAgPSBOVUxMOwotK3N0YXRpYyBXaWRnZXQgYjE2ICAgPSBOVUxMOwotK3N0YXRpYyBXaWRnZXQgYmZ1bGwgPSBOVUxMOwotKwotK2ludCBkb19mb3JtYXRfY2hhbmdlID0gMDsKLStpbnQgZG9fY3Vyc29yX2NoYW5nZSA9IDA7Ci0rZG91YmxlIGRvX2ZiX3VwZGF0ZSA9IDAuMDsKLStzdGF0aWMgdm9pZCBzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKHZvaWQpIHsKLSsJZG9fZm9ybWF0X2NoYW5nZSA9IDE7Ci0rCWRvX2N1cnNvcl9jaGFuZ2UgPSAwOwotK30KLStleHRlcm4gZG91YmxlIGRub3codm9pZCk7Ci0rc3RhdGljIHZvaWQgc2NoZWR1bGVfZmJfdXBkYXRlKHZvaWQpIHsKLSsJZG9fZmJfdXBkYXRlID0gZG5vdygpOwotK30KLStzdGF0aWMgdm9pZCBpbml0X2Zvcm1hdF9jaGFuZ2Uodm9pZCkgewotKwlhcHBEYXRhTmV3LnVzZUJHUjIzMyAgICAgICA9IGFwcERhdGEudXNlQkdSMjMzOwotKwlhcHBEYXRhTmV3LnVzZUJHUjU2NSAgICAgICA9IGFwcERhdGEudXNlQkdSNTY1OwotKwlhcHBEYXRhTmV3LnVzZUdyZXlTY2FsZSAgICA9IGFwcERhdGEudXNlR3JleVNjYWxlOwotKwlhcHBEYXRhTmV3LmVuYWJsZUpQRUcgICAgICA9IGFwcERhdGEuZW5hYmxlSlBFRzsKLSsJYXBwRGF0YU5ldy5lbmNvZGluZ3NTdHJpbmcgPSBhcHBEYXRhLmVuY29kaW5nc1N0cmluZzsKLSsJYXBwRGF0YU5ldy51c2VSZW1vdGVDdXJzb3IgPSBhcHBEYXRhLnVzZVJlbW90ZUN1cnNvcjsKLSsJYXBwRGF0YU5ldy51c2VYMTFDdXJzb3IgICAgPSBhcHBEYXRhLnVzZVgxMUN1cnNvcjsKLSsJYXBwRGF0YU5ldy51c2VSYXdMb2NhbCAgICAgPSBhcHBEYXRhLnVzZVJhd0xvY2FsOwotKwlhcHBEYXRhTmV3LnF1YWxpdHlMZXZlbCAgICA9IGFwcERhdGEucXVhbGl0eUxldmVsOwotKwlhcHBEYXRhTmV3LmNvbXByZXNzTGV2ZWwgICA9IGFwcERhdGEuY29tcHJlc3NMZXZlbDsKLSt9Ci0rdm9pZCBjdXRvdmVyX2Zvcm1hdF9jaGFuZ2Uodm9pZCkgewotKwlhcHBEYXRhLnVzZUJHUjIzMyAgICAgICA9IGFwcERhdGFOZXcudXNlQkdSMjMzOwotKwlhcHBEYXRhLnVzZUJHUjU2NSAgICAgICA9IGFwcERhdGFOZXcudXNlQkdSNTY1OwotKwlhcHBEYXRhLnVzZUdyZXlTY2FsZSAgICA9IGFwcERhdGFOZXcudXNlR3JleVNjYWxlOwotKwlhcHBEYXRhLmVuYWJsZUpQRUcgICAgICA9IGFwcERhdGFOZXcuZW5hYmxlSlBFRzsKLSsJYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcgPSBhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZzsKLSsJYXBwRGF0YS51c2VSZW1vdGVDdXJzb3IgPSBhcHBEYXRhTmV3LnVzZVJlbW90ZUN1cnNvcjsKLSsJYXBwRGF0YS51c2VYMTFDdXJzb3IgICAgPSBhcHBEYXRhTmV3LnVzZVgxMUN1cnNvcjsKLSsJYXBwRGF0YS51c2VSYXdMb2NhbCAgICAgPSBhcHBEYXRhTmV3LnVzZVJhd0xvY2FsOwotKwlhcHBEYXRhLnF1YWxpdHlMZXZlbCAgICA9IGFwcERhdGFOZXcucXVhbGl0eUxldmVsOwotKwlhcHBEYXRhLmNvbXByZXNzTGV2ZWwgICA9IGFwcERhdGFOZXcuY29tcHJlc3NMZXZlbDsKLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZThicHAoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWZwcmludGYoc3RkZXJyLCAiVG9nZ2xlOGJwcDogJWRcbiIsIGFwcERhdGEudXNlQkdSMjMzKTsKLSsJYjggPSB3OwotKwlpbml0X2Zvcm1hdF9jaGFuZ2UoKTsKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzKSB7Ci0rCQlsYXN0X25jb2xvcnMgPSBhcHBEYXRhLnVzZUJHUjIzMzsKLSsJCWFwcERhdGFOZXcudXNlQkdSMjMzID0gMDsKLSsJCWFwcERhdGFOZXcudXNlQkdSNTY1ID0gc2F2ZV91c2VCR1I1NjU7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIjhicHA6IG9mZlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlpZiAoIWxhc3RfbmNvbG9ycykgbGFzdF9uY29sb3JzID0gMjU2OwotKwkJYXBwRGF0YU5ldy51c2VCR1IyMzMgPSBsYXN0X25jb2xvcnM7Ci0rCQlzYXZlX3VzZUJHUjU2NSA9IGFwcERhdGEudXNlQkdSNTY1OwotKwkJYXBwRGF0YU5ldy51c2VCR1I1NjUgPSBGYWxzZTsKLSsJCWZwcmludGYoc3RkZXJyLCAiOGJwcDogb24gKCVkIGNvbG9ycylcbiIsIGFwcERhdGFOZXcudXNlQkdSMjMzKTsKLSsJfQotKwlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSsKLSt2b2lkCi0rVG9nZ2xlMTZicHAoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWZwcmludGYoc3RkZXJyLCAiVG9nZ2xlMTZicHA6ICVkXG4iLCBhcHBEYXRhLnVzZUJHUjU2NSk7Ci0rCWIxNiA9IHc7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAoYXBwRGF0YS51c2VCR1I1NjUpIHsKLSsJCWFwcERhdGFOZXcudXNlQkdSNTY1ID0gRmFsc2U7Ci0rCQlhcHBEYXRhTmV3LnVzZUJHUjIzMyA9IHNhdmVfdXNlQkdSMjMzOwotKwkJZnByaW50ZihzdGRlcnIsICIxNmJwcDogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGFOZXcudXNlQkdSNTY1ID0gVHJ1ZTsKLSsJCXNhdmVfdXNlQkdSMjMzID0gYXBwRGF0YS51c2VCR1IyMzM7Ci0rCQlhcHBEYXRhTmV3LnVzZUJHUjIzMyA9IDA7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIjE2YnBwOiBvblxuIik7Ci0rCX0KLSsJc2NoZWR1bGVfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZUZ1bGxDb2xvcihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJZnByaW50ZihzdGRlcnIsICJUb2dnbGVGdWxsQ29sb3JcbiIpOwotKwliZnVsbCA9IHc7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAoYXBwRGF0YS51c2VCR1I1NjUgfHwgYXBwRGF0YS51c2VCR1IyMzMpIHsKLSsJCXNhdmVfdXNlQkdSNTY1ID0gYXBwRGF0YS51c2VCR1I1NjU7Ci0rCQlhcHBEYXRhTmV3LnVzZUJHUjU2NSA9IEZhbHNlOwotKwkJc2F2ZV91c2VCR1IyMzMgPSBhcHBEYXRhLnVzZUJHUjIzMzsKLSsJCWFwcERhdGFOZXcudXNlQkdSMjMzID0gMDsKLSsJCWZwcmludGYoc3RkZXJyLCAiRnVsbENvbG9yOiBvblxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlpZiAoc2F2ZV91c2VCR1I1NjUpIHsKLSsJCQlhcHBEYXRhTmV3LnVzZUJHUjU2NSA9IFRydWU7Ci0rCQkJYXBwRGF0YU5ldy51c2VCR1IyMzMgPSAwOwotKwkJCWZwcmludGYoc3RkZXJyLCAiRnVsbENvbG9yIG9mZiAtPiAxNmJwcC5cbiIpOwotKwkJfSBlbHNlIHsKLSsJCQlhcHBEYXRhTmV3LnVzZUJHUjU2NSA9IEZhbHNlOwotKwkJCWlmICghc2F2ZV91c2VCR1IyMzMpIHNhdmVfdXNlQkdSMjMzID0gMjU2OwotKwkJCWFwcERhdGFOZXcudXNlQkdSMjMzID0gc2F2ZV91c2VCR1IyMzM7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJGdWxsQ29sb3Igb2ZmIC0+IDhicHAuXG4iKTsKLSsJCX0KLSsJfQotKwlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rVG9nZ2xlWEdyYWIoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmIChhcHBEYXRhLmdyYWJBbGwpIHsKLSsJCWFwcERhdGEuZ3JhYkFsbCA9IEZhbHNlOwotKwl9IGVsc2UgewotKwkJYXBwRGF0YS5ncmFiQWxsID0gVHJ1ZTsKLSsJfQotKwlmcHJpbnRmKHN0ZGVyciwgIlRvZ2dsZVhHcmFiLCBjdXJyZW50PSVkXG4iLCBhcHBEYXRhLmdyYWJBbGwpOwotKwkvKiBhbHdheXMgdW5ncmFiIHRvIGJlIHN1cmUsIGZ1bGxzY3JlZW4gd2lsbCBoYW5kbGUgdGhlIHJlc3QgKi8KLSsJWFVuZ3JhYlNlcnZlcihkcHkpOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZUVzY2FwZUFjdGl2ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuZXNjYXBlQWN0aXZlKSB7Ci0rCQlhcHBEYXRhLmVzY2FwZUFjdGl2ZSA9IEZhbHNlOwotKwl9IGVsc2UgewotKwkJYXBwRGF0YS5lc2NhcGVBY3RpdmUgPSBUcnVlOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSsvKgotKyAqIFRvZ2dsZU5Db2xvcnMKLSsgKi8KLSsKLStzdGF0aWMgV2lkZ2V0IHcyNTYgPSBOVUxMOwotK3N0YXRpYyBXaWRnZXQgdzY0ICA9IE5VTEw7Ci0rc3RhdGljIFdpZGdldCB3OCAgID0gTlVMTDsKLSsKLSt2b2lkCi0rVG9nZ2xlMjU2Q29sb3JzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwl3MjU2ID0gdzsKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzICE9IDI1NikgewotKwkJZnByaW50ZihzdGRlcnIsICIyNTYgY29sb3JzOiBvblxuIik7Ci0rCQlpbml0X2Zvcm1hdF9jaGFuZ2UoKTsKLSsJCWxhc3RfbmNvbG9ycyA9IGFwcERhdGFOZXcudXNlQkdSMjMzID0gMjU2OwotKwkJc2F2ZV91c2VCR1I1NjUgPSBhcHBEYXRhLnVzZUJHUjU2NTsKLSsJCWFwcERhdGFOZXcudXNlQkdSNTY1ID0gRmFsc2U7Ci0rCQlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGU2NENvbG9ycyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJdzY0ID0gdzsKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzICE9IDY0KSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIjY0IGNvbG9yczogb25cbiIpOwotKwkJaW5pdF9mb3JtYXRfY2hhbmdlKCk7Ci0rCQlsYXN0X25jb2xvcnMgPSBhcHBEYXRhTmV3LnVzZUJHUjIzMyA9IDY0OwotKwkJc2F2ZV91c2VCR1I1NjUgPSBhcHBEYXRhLnVzZUJHUjU2NTsKLSsJCWFwcERhdGFOZXcudXNlQkdSNTY1ID0gRmFsc2U7Ci0rCQlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGU4Q29sb3JzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwl3OCA9IHc7Ci0rCWlmIChhcHBEYXRhLnVzZUJHUjIzMyAhPSA4KSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIjggY29sb3JzOiBvblxuIik7Ci0rCQlpbml0X2Zvcm1hdF9jaGFuZ2UoKTsKLSsJCWxhc3RfbmNvbG9ycyA9IGFwcERhdGFOZXcudXNlQkdSMjMzID0gODsKLSsJCXNhdmVfdXNlQkdSNTY1ID0gYXBwRGF0YS51c2VCR1I1NjU7Ci0rCQlhcHBEYXRhTmV3LnVzZUJHUjU2NSA9IEZhbHNlOwotKwkJc2NoZWR1bGVfZm9ybWF0X2NoYW5nZSgpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rVG9nZ2xlR3JleVNjYWxlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlmcHJpbnRmKHN0ZGVyciwgIlRvZ2dsZUdyZXlTY2FsZVxuIik7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAoYXBwRGF0YS51c2VHcmV5U2NhbGUpIHsKLSsJCWFwcERhdGFOZXcudXNlR3JleVNjYWxlID0gRmFsc2U7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgImdyZXlzY2FsZTogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGFOZXcudXNlR3JleVNjYWxlID0gVHJ1ZTsKLSsJCWZwcmludGYoc3RkZXJyLCAiZ3JleXNjYWxlOiBvblxuIik7Ci0rCX0KLSsJc2NoZWR1bGVfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rLyoKLSsgKiBUb2dnbGVKUEVHCi0rICovCi0rCi0rdm9pZAotK1RvZ2dsZUpQRUcoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAoYXBwRGF0YS5lbmFibGVKUEVHKSB7Ci0rCQlhcHBEYXRhTmV3LmVuYWJsZUpQRUcgPSBGYWxzZTsKLSsJCWZwcmludGYoc3RkZXJyLCAiSlBFRzogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGFOZXcuZW5hYmxlSlBFRyA9IFRydWU7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIkpQRUc6IG9uXG4iKTsKLSsJfQotKwlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSsvKgotKyAqIFRvZ2dsZVRpZ2h0WlJMRQotKyAqLwotKwotK3N0YXRpYyBCb29sIHVzaW5nWlJMRSA9IEZhbHNlOwotK3N0YXRpYyBCb29sIHVzaW5nWllXUkxFID0gRmFsc2U7Ci0rc3RhdGljIEJvb2wgdXNpbmdIZXh0aWxlID0gRmFsc2U7Ci0rZXh0ZXJuIGludCBza2lwX21heWJlX3N5bmM7Ci0rCi0rdm9pZAotK1RvZ2dsZVRpZ2h0WlJMRShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJY2hhciBwcmVmVGlnaHRbXSA9ICJjb3B5cmVjdCB0aWdodCB6cmxlIHp5d3JsZSB6bGliIGhleHRpbGUgY29ycmUgcnJlIHJhdyI7Ci0rCWNoYXIgcHJlZlpSTEVbXSAgPSAiY29weXJlY3QgenJsZSB6eXdybGUgdGlnaHQgemxpYiBoZXh0aWxlIGNvcnJlIHJyZSByYXciOwotKwlpbml0X2Zvcm1hdF9jaGFuZ2UoKTsKLSsJdXNpbmdIZXh0aWxlID0gRmFsc2U7Ci0rCWlmICghIGFwcERhdGEuZW5jb2RpbmdzU3RyaW5nKSB7Ci0rCQlhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZyA9IHN0cmR1cChwcmVmWlJMRSk7Ci0rCQl1c2luZ1pSTEUgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFpSTEVcbiIpOwotKwl9IGVsc2UgewotKwkJY2hhciAqdCwgKno7Ci0rCQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLSsJCXQgPSBzdHJzdHIoYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcsICJ0aWdodCIpOwotKwkJeiA9IHN0cnN0cihhcHBEYXRhLmVuY29kaW5nc1N0cmluZywgInpybGUiKTsKLSsJCWlmIChmaXJzdCAmJiB1c2luZ1pSTEUpIHsKLSsJCQlhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZyA9IHN0cmR1cChwcmVmVGlnaHQpOwotKwkJCXVzaW5nWlJMRSA9IEZhbHNlOwotKwkJCXVzaW5nWllXUkxFID0gRmFsc2U7Ci0rCQl9IGVsc2UgaWYgKCEgdCkgewotKwkJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZaUkxFKTsKLSsJCQl1c2luZ1pSTEUgPSBUcnVlOwotKwkJCWZwcmludGYoc3RkZXJyLCAicHJlZmVyOiBaUkxFXG4iKTsKLSsJCX0gZWxzZSBpZiAoISB6KSB7Ci0rCQkJYXBwRGF0YU5ldy5lbmNvZGluZ3NTdHJpbmcgPSBzdHJkdXAocHJlZlRpZ2h0KTsKLSsJCQl1c2luZ1pSTEUgPSBGYWxzZTsKLSsJCQl1c2luZ1pZV1JMRSA9IEZhbHNlOwotKwkJCXNraXBfbWF5YmVfc3luYyA9IDA7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFRpZ2h0XG4iKTsKLSsJCX0gZWxzZSB7Ci0rCQkJaWYgKHQgPCB6KSB7Ci0rCQkJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZaUkxFKTsKLSsJCQkJdXNpbmdaUkxFID0gVHJ1ZTsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFpSTEVcbiIpOwotKwkJCX0gZWxzZSB7Ci0rCQkJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZUaWdodCk7Ci0rCQkJCXVzaW5nWlJMRSA9IEZhbHNlOwotKwkJCQl1c2luZ1pZV1JMRSA9IEZhbHNlOwotKwkJCQlza2lwX21heWJlX3N5bmMgPSAwOwotKwkJCQlmcHJpbnRmKHN0ZGVyciwgInByZWZlcjogVGlnaHRcbiIpOwotKwkJCX0KLSsJCX0KLSsJCWZpcnN0ID0gMDsKLSsJfQotKwlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rVG9nZ2xlWlJMRVpZV1JMRShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJY2hhciBwcmVmWllXUkxFW10gPSAiY29weXJlY3Qgenl3cmxlIHpybGUgdGlnaHQgemxpYiBoZXh0aWxlIGNvcnJlIHJyZSByYXciOwotKwljaGFyIHByZWZaUkxFW10gICA9ICJjb3B5cmVjdCB6cmxlIHp5d3JsZSB0aWdodCB6bGliIGhleHRpbGUgY29ycmUgcnJlIHJhdyI7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwl1c2luZ1pSTEUgPSBUcnVlOwotKwl1c2luZ0hleHRpbGUgPSBGYWxzZTsKLSsJaWYgKCEgYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcpIHsKLSsJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZaWVdSTEUpOwotKwkJdXNpbmdaWVdSTEUgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFpZV1JMRVxuIik7Ci0rCX0gZWxzZSB7Ci0rCQljaGFyICp6LCAqdzsKLSsJCXcgPSBzdHJzdHIoYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcsICJ6eXdybGUiKTsKLSsJCXogPSBzdHJzdHIoYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcsICJ6cmxlIik7Ci0rCQlpZiAodXNpbmdaWVdSTEUpIHsKLSsJCQlhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZyA9IHN0cmR1cChwcmVmWlJMRSk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFpSTEVcbiIpOwotKwkJCXVzaW5nWllXUkxFID0gRmFsc2U7Ci0rCQkJc2tpcF9tYXliZV9zeW5jID0gMDsKLSsJCX0gZWxzZSB7Ci0rCQkJYXBwRGF0YU5ldy5lbmNvZGluZ3NTdHJpbmcgPSBzdHJkdXAocHJlZlpZV1JMRSk7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFpZV1JMRVxuIik7Ci0rCQkJdXNpbmdaWVdSTEUgPSBUcnVlOwotKwkJfQotKwl9Ci0rCXNjaGVkdWxlX2Zvcm1hdF9jaGFuZ2UoKTsKLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGVUaWdodEhleHRpbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWNoYXIgcHJlZlRpZ2h0W10gICA9ICJjb3B5cmVjdCB0aWdodCB6cmxlIHp5d3JsZSB6bGliIGhleHRpbGUgY29ycmUgcnJlIHJhdyI7Ci0rCWNoYXIgcHJlZkhleHRpbGVbXSA9ICJjb3B5cmVjdCBoZXh0aWxlIHRpZ2h0IHpybGUgenl3cmxlIHpsaWIgY29ycmUgcnJlIHJhdyI7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwl1c2luZ1pSTEUgPSBGYWxzZTsKLSsJdXNpbmdaWVdSTEUgPSBGYWxzZTsKLSsJaWYgKCEgYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcpIHsKLSsJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZIZXh0aWxlKTsKLSsJCXVzaW5nSGV4dGlsZSA9IFRydWU7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInByZWZlcjogSGV4dGlsZVxuIik7Ci0rCX0gZWxzZSB7Ci0rCQljaGFyICp0LCAqejsKLSsJCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotKwkJdCA9IHN0cnN0cihhcHBEYXRhLmVuY29kaW5nc1N0cmluZywgInRpZ2h0Iik7Ci0rCQl6ID0gc3Ryc3RyKGFwcERhdGEuZW5jb2RpbmdzU3RyaW5nLCAiaGV4dGlsZSIpOwotKwkJaWYgKGZpcnN0ICYmIHVzaW5nSGV4dGlsZSkgewotKwkJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZUaWdodCk7Ci0rCQkJdXNpbmdIZXh0aWxlID0gRmFsc2U7Ci0rCQl9IGVsc2UgaWYgKCEgdCkgewotKwkJCWFwcERhdGFOZXcuZW5jb2RpbmdzU3RyaW5nID0gc3RyZHVwKHByZWZIZXh0aWxlKTsKLSsJCQl1c2luZ0hleHRpbGUgPSBUcnVlOwotKwkJCWZwcmludGYoc3RkZXJyLCAicHJlZmVyOiBIZXh0aWxlXG4iKTsKLSsJCX0gZWxzZSBpZiAoISB6KSB7Ci0rCQkJYXBwRGF0YU5ldy5lbmNvZGluZ3NTdHJpbmcgPSBzdHJkdXAocHJlZlRpZ2h0KTsKLSsJCQl1c2luZ0hleHRpbGUgPSBGYWxzZTsKLSsJCQlza2lwX21heWJlX3N5bmMgPSAwOwotKwkJCWZwcmludGYoc3RkZXJyLCAicHJlZmVyOiBUaWdodFxuIik7Ci0rCQl9IGVsc2UgewotKwkJCWlmICh0IDwgeikgewotKwkJCQlhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZyA9IHN0cmR1cChwcmVmSGV4dGlsZSk7Ci0rCQkJCXVzaW5nSGV4dGlsZSA9IFRydWU7Ci0rCQkJCWZwcmludGYoc3RkZXJyLCAicHJlZmVyOiBIZXh0aWxlXG4iKTsKLSsJCQl9IGVsc2UgewotKwkJCQlhcHBEYXRhTmV3LmVuY29kaW5nc1N0cmluZyA9IHN0cmR1cChwcmVmVGlnaHQpOwotKwkJCQl1c2luZ0hleHRpbGUgPSBGYWxzZTsKLSsJCQkJc2tpcF9tYXliZV9zeW5jID0gMDsKLSsJCQkJZnByaW50ZihzdGRlcnIsICJwcmVmZXI6IFRpZ2h0XG4iKTsKLSsJCQl9Ci0rCQl9Ci0rCQlmaXJzdCA9IDA7Ci0rCX0KLSsJc2NoZWR1bGVfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZCBzY2FsZV9jaGVja196cmxlKHZvaWQpIHsKLSsJc3RhdGljIGludCBkaWRpdCA9IDA7Ci0rCWlmIChkaWRpdCkgewotKwkJcmV0dXJuOwotKwl9Ci0rCWRpZGl0ID0gMTsKLSsJaWYgKGdldGVudigiU1NWTkNfUFJFU0VSVkVfRU5DT0RJTkciKSkgewotKwkJcmV0dXJuOwotKwl9Ci0rCWlmICghdXNpbmdaUkxFICYmICF1c2luZ0hleHRpbGUpIHsKLSsJCVdpZGdldCB3ID0gMDsKLSsJCWZwcmludGYoc3RkZXJyLCAiXG5Td2l0Y2hpbmcgdG8gZmFzdGVyIFpSTEUgZW5jb2RpbmcgaW4gY2xpZW50LXNpZGUgc2NhbGluZyBtb2RlLlxuIik7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaCBiYWNrIHRvIFRpZ2h0IHZpYSB0aGUgUG9wdXAgbWVudSBpZiB5b3UgcHJlZmVyIGl0LlxuXG4iKTsKLSsJCVRvZ2dsZVRpZ2h0WlJMRSh3LCBOVUxMLCBOVUxMLCBOVUxMKTsKLSsJfQotK30KLSsKLSsvKgotKyAqIFRvZ2dsZVZpZXdPbmx5Ci0rICovCi0rCi0rdm9pZAotK1RvZ2dsZVZpZXdPbmx5KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS52aWV3T25seSkgewotKwkJYXBwRGF0YS52aWV3T25seSA9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJ2aWV3b25seTogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGEudmlld09ubHkgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJ2aWV3b25seTogb25cbiIpOwotKwl9Ci0rCVhjdXJzb3JzKDEpOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZUN1cnNvclNoYXBlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpbml0X2Zvcm1hdF9jaGFuZ2UoKTsKLSsJaWYgKGFwcERhdGEudXNlUmVtb3RlQ3Vyc29yKSB7Ci0rCQlhcHBEYXRhTmV3LnVzZVJlbW90ZUN1cnNvciA9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJ1c2VSZW1vdGVDdXJzb3I6IG9mZlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlhcHBEYXRhTmV3LnVzZVJlbW90ZUN1cnNvciA9IFRydWU7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInVzZVJlbW90ZUN1cnNvcjogb25cbiIpOwotKwl9Ci0rCXNjaGVkdWxlX2Zvcm1hdF9jaGFuZ2UoKTsKLSsJaWYgKCFhcHBEYXRhTmV3LnVzZVJlbW90ZUN1cnNvcikgewotKwkJZG9fY3Vyc29yX2NoYW5nZSA9IDE7Ci0rCX0gZWxzZSB7Ci0rCQlkb19jdXJzb3JfY2hhbmdlID0gLTE7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGVDdXJzb3JBbHBoYShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlQ3Vyc29yQWxwaGEpIHsKLSsJCWFwcERhdGEudXNlQ3Vyc29yQWxwaGEgPSBGYWxzZTsKLSsJCWZwcmludGYoc3RkZXJyLCAidXNlQ3Vyc29yQWxwaGE6IG9mZlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlhcHBEYXRhLnVzZUN1cnNvckFscGhhID0gVHJ1ZTsKLSsJCWZwcmludGYoc3RkZXJyLCAidXNlQ3Vyc29yQWxwaGE6IG9uXG4iKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZVgxMUN1cnNvcihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaW5pdF9mb3JtYXRfY2hhbmdlKCk7Ci0rCWlmIChhcHBEYXRhLnVzZVgxMUN1cnNvcikgewotKwkJYXBwRGF0YU5ldy51c2VYMTFDdXJzb3IgPSBGYWxzZTsKLSsJCWZwcmludGYoc3RkZXJyLCAidXNlWDExQ3Vyc29yOiBvZmZcbiIpOwotKwl9IGVsc2UgewotKwkJYXBwRGF0YU5ldy51c2VYMTFDdXJzb3IgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJ1c2VYMTFDdXJzb3I6IG9uXG4iKTsKLSsJfQotKwlzY2hlZHVsZV9mb3JtYXRfY2hhbmdlKCk7Ci0rCWRvX2N1cnNvcl9jaGFuZ2UgPSAxOwotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZUJlbGwoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmIChhcHBEYXRhLnVzZUJlbGwpIHsKLSsJCWFwcERhdGEudXNlQmVsbCA9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJ1c2VCZWxsOiBvZmZcbiIpOwotKwl9IGVsc2UgewotKwkJYXBwRGF0YS51c2VCZWxsID0gVHJ1ZTsKLSsJCWZwcmludGYoc3RkZXJyLCAidXNlQmVsbDogb25cbiIpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rVG9nZ2xlUmF3TG9jYWwoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwlpZiAoYXBwRGF0YS51c2VSYXdMb2NhbCkgewotKwkJYXBwRGF0YU5ldy51c2VSYXdMb2NhbCA9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJ1c2VSYXdMb2NhbDogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGFOZXcudXNlUmF3TG9jYWwgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJ1c2VSYXdMb2NhbDogb25cbiIpOwotKwl9Ci0rCXNjaGVkdWxlX2Zvcm1hdF9jaGFuZ2UoKTsKLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGVTZXJ2ZXJJbnB1dChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuc2VydmVySW5wdXQpIHsKLSsJCWFwcERhdGEuc2VydmVySW5wdXQ9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJzZXJ2ZXJJbnB1dDogb2ZmXG4iKTsKLSsJCVNlbmRTZXJ2ZXJJbnB1dChUcnVlKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGEuc2VydmVySW5wdXQgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJzZXJ2ZXJJbnB1dDogb25cbiIpOwotKwkJU2VuZFNlcnZlcklucHV0KEZhbHNlKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZVBpcGVsaW5lVXBkYXRlcyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEucGlwZWxpbmVVcGRhdGVzKSB7Ci0rCQlhcHBEYXRhLnBpcGVsaW5lVXBkYXRlcz0gRmFsc2U7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInBpcGVsaW5lLXVwZGF0ZTogb2ZmXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGEucGlwZWxpbmVVcGRhdGVzID0gVHJ1ZTsKLSsJCWZwcmludGYoc3RkZXJyLCAicGlwZWxpbmUtdXBkYXRlOiBvblxuIik7Ci0rCX0KLSsJLyogWFhYIHJlcXVlc3Qgb25lIHRvIGJlIHN1cmU/ICovCi0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rVG9nZ2xlU2VuZENsaXBib2FyZChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuc2VuZENsaXBib2FyZCkgewotKwkJYXBwRGF0YS5zZW5kQ2xpcGJvYXJkPSBGYWxzZTsKLSsJCWZwcmludGYoc3RkZXJyLCAiU2VuZCBDTElQQk9BUkQgU2VsZWN0aW9uOiBvZmYgKHNlbmQgUFJJTUFSWSBpbnN0ZWFkKVxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlhcHBEYXRhLnNlbmRDbGlwYm9hcmQgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJTZW5kIENMSVBCT0FSRCBTZWxlY3Rpb246IG9uIChkbyBub3Qgc2VuZCBQUklNQVJZKVxuIik7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStUb2dnbGVTZW5kQWx3YXlzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS5zZW5kQWx3YXlzKSB7Ci0rCQlhcHBEYXRhLnNlbmRBbHdheXM9IEZhbHNlOwotKwkJZnByaW50ZihzdGRlcnIsICJTZW5kIFNlbGVjdGlvbiBBbHdheXM6IG9mZlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlhcHBEYXRhLnNlbmRBbHdheXMgPSBUcnVlOwotKwkJZnByaW50ZihzdGRlcnIsICJTZW5kIFNlbGVjdGlvbiBBbHdheXM6IG9uXG4iKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rCi0rQm9vbCBfc3cxXyA9IEZhbHNlOwkvKiBYWFggdGhpcyBpcyBhIHdlaXJkIGJ1Zy4uLiAqLwotK0Jvb2wgX3N3Ml8gPSBGYWxzZTsKLStCb29sIF9zdzNfID0gRmFsc2U7Ci0rQm9vbCBzZWxlY3RpbmdTaW5nbGVXaW5kb3cgPSBGYWxzZTsKLSsKLStleHRlcm4gQ3Vyc29yIGJvZ29DdXJzb3I7Ci0rCi0rdm9pZAotK1RvZ2dsZVNpbmdsZVdpbmRvdyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuc2luZ2xlV2luZG93KSB7Ci0rCQlhcHBEYXRhLnNpbmdsZVdpbmRvdz0gRmFsc2U7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInNpbmdsZVdpbmRvdzogb2ZmXG4iKTsKLSsJCVNlbmRTaW5nbGVXaW5kb3coLTEsIC0xKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGEuc2luZ2xlV2luZG93ID0gVHJ1ZTsKLSsJCXNlbGVjdGluZ1NpbmdsZVdpbmRvdyA9IFRydWU7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgInNpbmdsZVdpbmRvdzogb25cbiIpOwotKwkJaWYgKGJvZ29DdXJzb3IgIT0gTm9uZSkgewotKwkJCVhEZWZpbmVDdXJzb3IoZHB5LCBkZXNrdG9wV2luLCBib2dvQ3Vyc29yKTsKLSsJCX0KLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZCByYWlzZW1lKGludCBmb3JjZSk7Ci0rdm9pZCBBcHBlbmRDaGF0SW5wdXQoY2hhciAqKTsKLSsKLStleHRlcm4gdm9pZCBTaG93Q2hhdChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTaG93RmlsZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gQm9vbCBTZW5kVGV4dENoYXRGaW5pc2hlZCh2b2lkKTsKLSsKLSsKLSt2b2lkIHByaW50Q2hhdChjaGFyICpzdHIsIEJvb2wgcmFpc2UpIHsKLSsJaWYgKGFwcERhdGEudGVybUNoYXQpIHsKLSsJCWlmIChyYWlzZSkgewotKwkJCXJhaXNlbWUoMCk7Ci0rCQl9Ci0rCQlmcHJpbnRmKHN0ZGVyciwgc3RyKTsKLSsJfSBlbHNlIHsKLSsJCWlmIChyYWlzZSkgewotKwkJCVNob3dDaGF0KDAsIDAsIDAsIDApOwotKwkJfQotKwkJQXBwZW5kQ2hhdElucHV0KHN0cik7Ci0rCX0KLSt9Ci0rCi0rdm9pZAotK1RvZ2dsZVRleHRDaGF0KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS5jaGF0QWN0aXZlKSB7Ci0rCQlwcmludENoYXQoIlxuKlNlbnRDbG9zZSpcblxuIiwgRmFsc2UpOwotKwkJU2VuZFRleHRDaGF0Q2xvc2UoKTsKLSsJCVNlbmRUZXh0Q2hhdEZpbmlzaGVkKCk7Ci0rCQlIaWRlQ2hhdCgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSsJCWFwcERhdGEuY2hhdEFjdGl2ZT0gRmFsc2U7Ci0rCX0gZWxzZSB7Ci0rCQlTaG93Q2hhdCgwLCAwLCAwLCAwKTsKLSsJCVNlbmRUZXh0Q2hhdE9wZW4oKTsKLSsJCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQkJcHJpbnRDaGF0KCJcbipTZW50T3BlbipcblxuU2VuZDogIiwgVHJ1ZSk7Ci0rCQl9IGVsc2UgewotKwkJCXByaW50Q2hhdCgiXG4qU2VudE9wZW4qXG4iLCBUcnVlKTsKLSsJCX0KLSsJCWFwcERhdGEuY2hhdEFjdGl2ZSA9IFRydWU7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK2V4dGVybiBpbnQgZmlsZXhmZXJfc29jazsKLStleHRlcm4gcGlkX3QgamF2YV9oZWxwZXI7Ci0rI2RlZmluZSBLSUxMSkFWQQotKyNpZmRlZiBLSUxMSkFWQQotKyNpbmNsdWRlIDxzaWduYWwuaD4KLSsjZW5kaWYKLSsKLSt2b2lkCi0rVG9nZ2xlRmlsZVhmZXIoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCXN0YXRpYyBkb3VibGUgbGFzdF9zdGFydCA9IDAuMDsKLSsJaWYgKGFwcERhdGEuZmlsZUFjdGl2ZSkgewotKyNpZiAwCi0rCQlIaWRlRmlsZSh3LCBldiwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLSsJCWFwcERhdGEuZmlsZUFjdGl2ZSA9IEZhbHNlOwotKyNlbmRpZgotKyNpZm5kZWYgS0lMTEpBVkEKLSsJCWlmIChmaWxleGZlcl9zb2NrID49IDApIHsKLSsJCQljbG9zZShmaWxleGZlcl9zb2NrKTsKLSsJCX0KLSsjZWxzZQotKwkJaWYgKGphdmFfaGVscGVyICE9IDApIHsKLSsJCQlpbnQgaTsKLSsJCQlpZiAoZG5vdygpIDwgbGFzdF9zdGFydCArIDYuMCkgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwgInNraXBwaW5nIGVhcmx5IGtpbGwgb2YgamF2YSBoZWxwZXIgKGxlc3MgdGhhbiA1IHNlY3MpXG4iKTsKLSsJCQl9IGVsc2UgewotKwkJCQlmb3IgKGk9MTsgaTw9NTsgaSsrKSB7Ci0rCQkJCQlwaWRfdCBwID0gamF2YV9oZWxwZXIgKyBpOwotKwkJCQkJZnByaW50ZihzdGRlcnIsICJ0cnlpbmcgdG8ga2lsbCBqYXZhIGhlbHBlcjogJWRcbiIsIHApOwotKwkJCQkJaWYgKGtpbGwocCwgU0lHVEVSTSkgPT0gMCkgewotKwkJCQkJCWphdmFfaGVscGVyID0gMDsKLSsJCQkJCQlicmVhazsKLSsJCQkJCX0KLSsJCQkJfQotKwkJCX0KLSsJCX0KLSsjZW5kaWYKLSsJfSBlbHNlIHsKLSsJCVNob3dGaWxlKHcsIGV2LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotKwkJYXBwRGF0YS5maWxlQWN0aXZlID0gVHJ1ZTsKLSsJCWxhc3Rfc3RhcnQgPSBkbm93KCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3N0YXRpYyBpbnQgZm9vSGFuZGxlcihEaXNwbGF5ICpkcHksIFhFcnJvckV2ZW50ICplcnJvcikgewotKwlpZiAoZHB5IHx8IGVycm9yKSB7fQotKwlyZXR1cm4gMDsKLSt9Ci0rCi0rdm9pZCByYWlzZW1lKGludCBmb3JjZSkgewotKwlpZiAoKGZvcmNlIHx8IGFwcERhdGEudGVybUNoYXQpICYmIGdldGVudigiV0lORE9XSUQiKSkgewotKwkJdW5zaWduZWQgbG9uZyB3OwotKwkJaWYgKHNzY2FuZihnZXRlbnYoIldJTkRPV0lEIiksICIlbHUiLCAmdykgPT0gMSkgIHsKLSsJCQk7Ci0rCQl9IGVsc2UgaWYgKHNzY2FuZihnZXRlbnYoIldJTkRPV0lEIiksICIweCVseCIsICZ3KSA9PSAxKSAgewotKwkJCTsKLSsJCX0gZWxzZSB7Ci0rCQkJdyA9IDA7Ci0rCQl9Ci0rCQlpZiAodyAhPSAwKSB7Ci0rCQkJWEVycm9ySGFuZGxlciBvbGQgPSBYU2V0RXJyb3JIYW5kbGVyKGZvb0hhbmRsZXIpOwotKwkJCVhNYXBSYWlzZWQoZHB5LCAoV2luZG93KSB3KTsKLSsJCQlYU3luYyhkcHksIEZhbHNlKTsKLSsJCQlYU2V0RXJyb3JIYW5kbGVyKG9sZCk7Ci0rCQl9Ci0rCX0KLSt9Ci0rCi0rdm9pZCBzZXRfc2VydmVyX3NjYWxlKGludCBuKSB7Ci0rCWlmIChuID49IDEgJiYgbiA8IDEwMCkgewotKwkJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJaW50IGggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsJCWFwcERhdGEuc2VydmVyU2NhbGUgPSBuOwotKwkJU2VuZFNlcnZlclNjYWxlKG4pOwotKwkJaWYgKDApIFNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoMCwgMCwgdywgaCwgRmFsc2UpOwotKwkJc2NoZWR1bGVfZmJfdXBkYXRlKCk7Ci0rCX0KLSt9Ci0rCi0rdm9pZAotK0RvU2VydmVyU2NhbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWNoYXIgc3RyWzEwMF0sICpzLCAqcTsKLSsJaW50IG47Ci0rCWlmICgxKSB7Ci0rCQlzID0gRG9TY2FsZU5EaWFsb2coKTsKLSsJfSBlbHNlIHsKLSsJCXJhaXNlbWUoMSk7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cYVxuRW50ZXIgaW50ZWdlciBuIGZvciAxL24gc2VydmVyIHNjYWxpbmc6ICIpOwotKwkJc3RyWzBdID0gJ1wwJzsKLSsJCWZnZXRzKHN0ciwgMTAwLCBzdGRpbik7IAotKwkJcyA9IHN0cjsKLSsJCXEgPSBzdHJzdHIoc3RyLCAiXG4iKTsKLSsJCWlmIChxKSAqcSA9ICdcMCc7Ci0rCX0KLSsJaWYgKHNbMF0gIT0gJ1wwJykgewotKwkJbiA9IGF0b2kocyk7Ci0rCQlzZXRfc2VydmVyX3NjYWxlKG4pOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkIHNldF9zZXJ2ZXJfcXVhbGl0eShpbnQgbikgewotKwlmcHJpbnRmKHN0ZGVyciwgInNldF9xdWFsaXR5OiAlZFxuIiwgbik7Ci0rCWlmIChuID49IDAgJiYgbiA8PSA5KSB7Ci0rCQlpbnQgdyA9IHNpLmZyYW1lYnVmZmVyV2lkdGg7Ci0rCQlpbnQgaCA9IHNpLmZyYW1lYnVmZmVySGVpZ2h0OwotKwkJaW5pdF9mb3JtYXRfY2hhbmdlKCk7Ci0rCQlhcHBEYXRhTmV3LnF1YWxpdHlMZXZlbCA9IG47Ci0rCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHcsIGgsIEZhbHNlKTsKLSsJCXNjaGVkdWxlX2Zvcm1hdF9jaGFuZ2UoKTsKLSsJfQotK30KLSsKLSt2b2lkCi0rRG9TZXJ2ZXJRdWFsaXR5KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwljaGFyIHN0clsxMDBdLCAqcywgKnE7Ci0rCWludCBuOwotKwlpZiAoMSkgewotKwkJcyA9IERvUXVhbGl0eURpYWxvZygpOwotKwl9IGVsc2UgewotKwkJcmFpc2VtZSgxKTsKLSsJCWZwcmludGYoc3RkZXJyLCAiXG5cblxhXG5FbnRlciBpbnRlZ2VyIDEgPD0gbiA8PSA5IGZvciBxdWFsaXR5IHNldHRpbmc6ICIpOwotKwkJc3RyWzBdID0gJ1wwJzsKLSsJCWZnZXRzKHN0ciwgMTAwLCBzdGRpbik7IAotKwkJcyA9IHN0cjsKLSsJCXEgPSBzdHJzdHIoc3RyLCAiXG4iKTsKLSsJCWlmIChxKSAqcSA9ICdcMCc7Ci0rCX0KLSsJaWYgKHNbMF0gIT0gJ1wwJykgewotKwkJbiA9IGF0b2kocyk7Ci0rCQlzZXRfc2VydmVyX3F1YWxpdHkobik7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQgc2V0X3NlcnZlcl9jb21wcmVzcyhpbnQgbikgewotKwlmcHJpbnRmKHN0ZGVyciwgInNldF9jb21wcmVzczogJWRcbiIsIG4pOwotKwlpZiAobiA+PSAwICYmIG4gPD0gOSkgewotKwkJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJaW50IGggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsJCWluaXRfZm9ybWF0X2NoYW5nZSgpOwotKwkJYXBwRGF0YU5ldy5jb21wcmVzc0xldmVsID0gbjsKLSsJCVNlbmRGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoMCwgMCwgdywgaCwgRmFsc2UpOwotKwkJc2NoZWR1bGVfZm9ybWF0X2NoYW5nZSgpOwotKwl9Ci0rfQotKwotK3ZvaWQKLStEb1NlcnZlckNvbXByZXNzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwljaGFyIHN0clsxMDBdLCAqcywgKnE7Ci0rCWludCBuOwotKwlpZiAoMSkgewotKwkJcyA9IERvQ29tcHJlc3NEaWFsb2coKTsKLSsJfSBlbHNlIHsKLSsJCXJhaXNlbWUoMSk7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cYVxuRW50ZXIgaW50ZWdlciAxIDw9IG4gPD0gOSBmb3IgY29tcHJlc3MgbGV2ZWwgc2V0dGluZzogIik7Ci0rCQlzdHJbMF0gPSAnXDAnOwotKwkJZmdldHMoc3RyLCAxMDAsIHN0ZGluKTsgCi0rCQlzID0gc3RyOwotKwkJcSA9IHN0cnN0cihzdHIsICJcbiIpOwotKwkJaWYgKHEpICpxID0gJ1wwJzsKLSsJfQotKwlpZiAoc1swXSAhPSAnXDAnKSB7Ci0rCQluID0gYXRvaShzKTsKLSsJCXNldF9zZXJ2ZXJfY29tcHJlc3Mobik7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK2V4dGVybiB2b2lkIHJlc2NhbGVfaW1hZ2Uodm9pZCk7Ci0rZXh0ZXJuIHZvaWQgZ2V0X3NjYWxlX3ZhbHVlcyhkb3VibGUgKmZ4LCBkb3VibGUgKmZ5KTsKLSsKLSt2b2lkCi0rU2V0U2NhbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWNoYXIgKnM7Ci0rCXMgPSBEb1NjYWxlRGlhbG9nKCk7Ci0rCWlmIChzWzBdICE9ICdcMCcpIHsKLSsjaWYgMAotKwkJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJaW50IGggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLSsjZW5kaWYKLSsJCWRvdWJsZSBmeCwgZnk7Ci0rCQlpbnQgZnMgPSAwOwotKwkJaWYgKGFwcERhdGEuc2NhbGUgIT0gTlVMTCAmJiAhc3RyY21wKHMsIGFwcERhdGEuc2NhbGUpKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwkJCi0rCQlpZiAoIXN0cmNhc2VjbXAocywgIm5vbmUiKSkgewotKwkJCWFwcERhdGEuc2NhbGUgPSBOVUxMOwotKwkJfSBlbHNlIGlmICghc3RyY21wKHMsICIxLjAiKSkgewotKwkJCWFwcERhdGEuc2NhbGUgPSBOVUxMOwotKwkJfSBlbHNlIGlmICghc3RyY21wKHMsICIxIikpIHsKLSsJCQlhcHBEYXRhLnNjYWxlID0gTlVMTDsKLSsJCX0gZWxzZSB7Ci0rCQkJYXBwRGF0YS5zY2FsZSA9IHN0cmR1cChzKTsKLSsJCX0KLSsJCWlmIChhcHBEYXRhLnNjYWxlICE9IE5VTEwpIHsKLSsJCQlnZXRfc2NhbGVfdmFsdWVzKCZmeCwgJmZ5KTsKLSsJCQlpZiAoZnggPD0gMC4wIHx8IGZ5IDw9IDAuMCkgewotKwkJCQlhcHBEYXRhLnNjYWxlID0gTlVMTDsKLSsJCQkJcmV0dXJuOwotKwkJCX0KLSsJCX0KLSsJCQotKwkJaWYgKGFwcERhdGEuZnVsbFNjcmVlbikgewotKwkJCWZzID0gMTsKLSsJCQlGdWxsU2NyZWVuT2ZmKCk7Ci0rCQl9Ci0rCQlyZXNjYWxlX2ltYWdlKCk7Ci0rCQlpZiAoZnMpIHsKLSsJCQlGdWxsU2NyZWVuT24oKTsKLSsJCX0KLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldEVzY2FwZUtleXMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWNoYXIgKnM7Ci0rCXMgPSBEb0VzY2FwZUtleXNEaWFsb2coKTsKLSsJZnByaW50ZihzdGRlcnIsICJzZXQgZXNjYXBlIGtleXM6ICclcydcbiIsIHMpOwotKwlpZiAoc1swXSAhPSAnXDAnKSB7Ci0rCQlhcHBEYXRhLmVzY2FwZUtleXMgPSBzdHJkdXAocyk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQgc2V0X3ljcm9wKGludCBuKSB7Ci0rCWlmIChuID49IDEpIHsKLSsJCWludCB3ID0gc2kuZnJhbWVidWZmZXJXaWR0aDsKLSsJCWludCBoID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCQlhcHBEYXRhLnlDcm9wID0gbjsKLSsJCVJlRG9EZXNrdG9wKCk7Ci0rCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHcsIGgsIEZhbHNlKTsKLSsJCXNjaGVkdWxlX2ZiX3VwZGF0ZSgpOwotKwl9Ci0rfQotIAotLSAgQ2xlYW51cCgpOwotK3ZvaWQKLStTZXRZQ3JvcChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJY2hhciBzdHJbMTAwXSwgKnEsICpzOwotKwlpbnQgbjsKLSsJaWYgKDEpIHsKLSsJCXMgPSBEb1lDcm9wRGlhbG9nKCk7Ci0rCX0gZWxzZSB7Ci0rCQlyYWlzZW1lKDEpOwotKwkJZnByaW50ZihzdGRlcnIsICJcblxuXGFcbkVudGVyIHBpeGVsIHNpemUgbiAteWNyb3AgbWF4aW11bSB5LWhlaWdodDogIik7Ci0rCQlzdHJbMF0gPSAnXDAnOwotKwkJZmdldHMoc3RyLCAxMDAsIHN0ZGluKTsgCi0rCQlzID0gc3RyOwotKwkJcSA9IHN0cnN0cihzdHIsICJcbiIpOwotKwkJaWYgKHEpICpxID0gJ1wwJzsKLSsJfQotKwlpZiAoc1swXSAhPSAnXDAnKSB7Ci0rCQluID0gYXRvaShzKTsKLSsJCXNldF95Y3JvcChuKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZCBzZXRfc2NiYXIoaW50IG4pIHsKLSsJaWYgKG4gPj0gMSkgewotKwkJaW50IHcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwkJaW50IGggPSBzaS5mcmFtZWJ1ZmZlckhlaWdodDsKLStmcHJpbnRmKHN0ZGVyciwgInNldF9zY2JhdDogJWRcbiIsIG4pOwotKwkJYXBwRGF0YS5zYldpZHRoID0gbjsKLSsJCVJlRG9EZXNrdG9wKCk7Ci0rCQlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHcsIGgsIEZhbHNlKTsKLSsJCXNjaGVkdWxlX2ZiX3VwZGF0ZSgpOwotKwl9Ci0rfQotKwotK3ZvaWQKLStTZXRTY2JhcihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJY2hhciBzdHJbMTAwXSwgKnEsICpzOwotKwlpbnQgbjsKLSsJaWYgKDEpIHsKLSsJCXMgPSBEb1NjYmFyRGlhbG9nKCk7Ci0rCX0gZWxzZSB7Ci0rCQlyYWlzZW1lKDEpOwotKwkJZnByaW50ZihzdGRlcnIsICJcblxuXGFcbkVudGVyIHBpeGVsIHNpemUgbiBzY3JvbGxiYXIgd2lkdGg6ICIpOwotKwkJc3RyWzBdID0gJ1wwJzsKLSsJCWZnZXRzKHN0ciwgMTAwLCBzdGRpbik7IAotKwkJcyA9IHN0cjsKLSsJCXEgPSBzdHJzdHIoc3RyLCAiXG4iKTsKLSsJCWlmIChxKSAqcSA9ICdcMCc7Ci0rCX0KLSsJaWYgKHNbMF0gIT0gJ1wwJykgewotKwkJbiA9IGF0b2kocyk7Ci0rCQlzZXRfc2NiYXIobik7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRTY2FsZU4oV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0rCQlpbnQgbiA9IGF0b2kocGFyYW1zWzBdKTsKLSsJCXNldF9zZXJ2ZXJfc2NhbGUobik7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQgVXBkYXRlUXVhbCh2b2lkKSB7Ci0rCVNldEZvcm1hdEFuZEVuY29kaW5ncygpOwotKwlVcGRhdGVTdWJzYW1wQnV0dG9ucygpOwotKwlVcGRhdGVRdWFsU2xpZGVyKCk7Ci0rfQotKwotK2V4dGVybiBkb3VibGUgbGF0ZW5jeTsKLSsKLStzdGF0aWMgdm9pZCBMb3NzbGVzc1JlZnJlc2godm9pZCkgewotKwlTdHJpbmcgZW5jb2RpbmdzID0gYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmc7Ci0rCWludCBjb21wcmVzc0xldmVsID0gYXBwRGF0YS5jb21wcmVzc0xldmVsOwotKwlpbnQgcXVhbCA9IGFwcERhdGEucXVhbGl0eUxldmVsOwotKwlCb29sIGVuYWJsZUpQRUcgPSBhcHBEYXRhLmVuYWJsZUpQRUc7Ci0rCWFwcERhdGEucXVhbGl0eUxldmVsID0gLTE7Ci0rCWFwcERhdGEuZW5hYmxlSlBFRyA9IEZhbHNlOwotKwlhcHBEYXRhLmVuY29kaW5nc1N0cmluZyA9ICJ0aWdodCBjb3B5cmVjdCI7Ci0rCWFwcERhdGEuY29tcHJlc3NMZXZlbCA9IDE7Ci0rCVNldEZvcm1hdEFuZEVuY29kaW5ncygpOwotKwlTZW5kRnJhbWVidWZmZXJVcGRhdGVSZXF1ZXN0KDAsIDAsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBGYWxzZSk7Ci0rCWlmIChsYXRlbmN5ID4gMC4wKSB7Ci0rCQlpZiAoMCkgdXNsZWVwKChpbnQpIGxhdGVuY3kgKiAxMDAwKTsKLSsJfQotKwlhcHBEYXRhLnF1YWxpdHlMZXZlbCA9IHF1YWw7Ci0rCWFwcERhdGEuZW5hYmxlSlBFRyA9IGVuYWJsZUpQRUc7Ci0rCWFwcERhdGEuZW5jb2RpbmdzU3RyaW5nID0gZW5jb2RpbmdzOwotKwlhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPSBjb21wcmVzc0xldmVsOwotKwlTZXRGb3JtYXRBbmRFbmNvZGluZ3MoKTsKLSt9Ci0rCi0rc3RhdGljIHZvaWQgUXVhbEhpZ2godm9pZCkgewotKwlhcHBEYXRhLmVuY29kaW5nc1N0cmluZyA9ICJ0aWdodCBjb3B5cmVjdCI7Ci0rCWlmKGFwcERhdGEudXNlQkdSMjMzIHx8IGFwcERhdGFOZXcudXNlQkdSNTY1KSB7Ci0rCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IENhbm5vdCBlbmFibGUgSlBFRyBiZWNhdXNlIEJHUjIzMy9CR1I1NjUgaXMgZW5hYmxlZC5cbiIpOwotKwl9IGVsc2UgewotKwkJYXBwRGF0YS5lbmFibGVKUEVHID0gVHJ1ZTsKLSsJfQotKwlhcHBEYXRhLnN1YnNhbXBMZXZlbCA9IFRWTkNfMVg7Ci0rCWFwcERhdGEucXVhbGl0eUxldmVsID0gOTU7Ci0rCVVwZGF0ZVF1YWwoKTsKLSt9Ci0rCi0rc3RhdGljIHZvaWQgUXVhbE1lZCh2b2lkKSB7Ci0rCWFwcERhdGEuZW5jb2RpbmdzU3RyaW5nID0gInRpZ2h0IGNvcHlyZWN0IjsKLSsJaWYoYXBwRGF0YS51c2VCR1IyMzMgfHwgYXBwRGF0YU5ldy51c2VCR1I1NjUpIHsKLSsJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogQ2Fubm90IGVuYWJsZSBKUEVHIGJlY2F1c2UgQkdSMjMzL0JHUjU2NSBpcyBlbmFibGVkLlxuIik7Ci0rCX0gZWxzZSB7Ci0rCQlhcHBEYXRhLmVuYWJsZUpQRUcgPSBUcnVlOwotKwl9Ci0rCWFwcERhdGEuc3Vic2FtcExldmVsID0gVFZOQ18yWDsKLSsJYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPSA4MDsKLSsJVXBkYXRlUXVhbCgpOwotK30KLSsKLStzdGF0aWMgdm9pZCBRdWFsTG93KHZvaWQpIHsKLSsJYXBwRGF0YS5lbmNvZGluZ3NTdHJpbmcgPSAidGlnaHQgY29weXJlY3QiOwotKwlpZihhcHBEYXRhLnVzZUJHUjIzMyB8fCBhcHBEYXRhTmV3LnVzZUJHUjU2NSkgewotKwkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBDYW5ub3QgZW5hYmxlIEpQRUcgYmVjYXVzZSBCR1IyMzMvQkdSNTY1IGlzIGVuYWJsZWQuXG4iKTsKLSsJfSBlbHNlIHsKLSsJCWFwcERhdGEuZW5hYmxlSlBFRyA9IFRydWU7Ci0rCX0KLSsJYXBwRGF0YS5zdWJzYW1wTGV2ZWwgPSBUVk5DXzRYOwotKwlhcHBEYXRhLnF1YWxpdHlMZXZlbCA9IDMwOwotKwlVcGRhdGVRdWFsKCk7Ci0rfQotKwotK3N0YXRpYyB2b2lkIFF1YWxMb3NzbGVzcyh2b2lkKSB7Ci0rCWFwcERhdGEuZW5jb2RpbmdzU3RyaW5nID0gInRpZ2h0IGNvcHlyZWN0IjsKLSsJYXBwRGF0YS5lbmFibGVKUEVHID0gRmFsc2U7Ci0rCWFwcERhdGEuY29tcHJlc3NMZXZlbCA9IDA7Ci0rCVVwZGF0ZVF1YWwoKTsKLSt9Ci0gCi0tICByZXR1cm4gMDsKLStzdGF0aWMgdm9pZCBRdWFsTG9zc2xlc3NXQU4odm9pZCkgewotKwlhcHBEYXRhLmVuY29kaW5nc1N0cmluZyA9ICJ0aWdodCBjb3B5cmVjdCI7Ci0rCWFwcERhdGEuZW5hYmxlSlBFRyA9IEZhbHNlOwotKwlhcHBEYXRhLmNvbXByZXNzTGV2ZWwgPSAxOwotKwlVcGRhdGVRdWFsKCk7Ci0rfQotKwotK3ZvaWQKLStTZXRUdXJib1ZOQyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKCpudW1fcGFyYW1zICE9IDApIHsKLSsJCWludCBuID0gYXRvaShwYXJhbXNbMF0pOwotKwkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiU2V0VHVyYm9WTkM6ICVkXG4iLCBuKTsKLSsJCWlmIChuID09IDEpIHsKLSsJCQlRdWFsSGlnaCgpOwotKwkJfSBlbHNlIGlmIChuID09IDIpIHsKLSsJCQlRdWFsTWVkKCk7Ci0rCQl9IGVsc2UgaWYgKG4gPT0gMykgewotKwkJCVF1YWxMb3coKTsKLSsJCX0gZWxzZSBpZiAobiA9PSA0KSB7Ci0rCQkJUXVhbExvc3NsZXNzKCk7Ci0rCQl9IGVsc2UgaWYgKG4gPT0gNSkgewotKwkJCVF1YWxMb3NzbGVzc1dBTigpOwotKwkJfSBlbHNlIGlmIChuID09IDYpIHsKLSsJCQlhcHBEYXRhLnN1YnNhbXBMZXZlbCA9IFRWTkNfMVg7Ci0rCQkJVXBkYXRlUXVhbCgpOwotKwkJfSBlbHNlIGlmIChuID09IDcpIHsKLSsJCQlhcHBEYXRhLnN1YnNhbXBMZXZlbCA9IFRWTkNfMlg7Ci0rCQkJVXBkYXRlUXVhbCgpOwotKwkJfSBlbHNlIGlmIChuID09IDgpIHsKLSsJCQlhcHBEYXRhLnN1YnNhbXBMZXZlbCA9IFRWTkNfNFg7Ci0rCQkJVXBkYXRlUXVhbCgpOwotKwkJfSBlbHNlIGlmIChuID09IDkpIHsKLSsJCQlhcHBEYXRhLnN1YnNhbXBMZXZlbCA9IFRWTkNfR1JBWTsKLSsJCQlVcGRhdGVRdWFsKCk7Ci0rCQl9IGVsc2UgaWYgKG4gPT0gMTApIHsKLSsJCQlMb3NzbGVzc1JlZnJlc2goKTsKLSsJCX0KLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldFF1YWxpdHkoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0rCQlpbnQgbiA9IGF0b2kocGFyYW1zWzBdKTsKLSsJCXNldF9zZXJ2ZXJfcXVhbGl0eShuKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldENvbXByZXNzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotKwkJaW50IG4gPSBhdG9pKHBhcmFtc1swXSk7Ci0rCQlzZXRfc2VydmVyX2NvbXByZXNzKG4pOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rR290Q2hhdFRleHQoY2hhciAqc3RyLCBpbnQgbGVuKQotK3sKLSsJc3RhdGljIGNoYXIgKmIgPSBOVUxMOwotKwlzdGF0aWMgaW50IGJsZW4gPSAtMTsKLSsJaW50IGksIGs7Ci0rCWlmIChhcHBEYXRhLnRlcm1DaGF0KSB7Ci0rCQlwcmludENoYXQoIlxuQ2hhdDogIiwgVHJ1ZSk7Ci0rCX0gZWxzZSB7Ci0rCQlwcmludENoYXQoIkNoYXQ6ICIsIFRydWUpOwotKwl9Ci0rCi0rCWlmIChsZW4gPCAwKSBsZW4gPSAwOwotKwotKwlpZiAoYmxlbiA8IGxlbisxKSB7Ci0rCQlpZiAoYikgZnJlZShiKTsKLSsJCWJsZW4gPSAyICogKGxlbiArIDEwKTsKLSsJCWIgPSAoY2hhciAqKSBtYWxsb2MoYmxlbik7Ci0rCX0KLSsKLSsJayA9IDA7Ci0rCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLSsJCWlmIChzdHJbaV0gIT0gJ1xyJykgewotKwkJCWJbaysrXSA9IHN0cltpXTsKLSsJCX0KLSsJfQotKwliW2tdID0gJ1wwJzsKLSsJYltsZW5dID0gJ1wwJzsKLSsJcHJpbnRDaGF0KGIsIFRydWUpOwotKwkKLSsJaWYgKGFwcERhdGEudGVybUNoYXQpIHsKLSsJCWlmIChzdHJzdHIoc3RyLCAiXG4iKSkgewotKwkJCXByaW50Q2hhdCgiU2VuZDogIiwgVHJ1ZSk7Ci0rCQl9IGVsc2UgewotKwkJCXByaW50Q2hhdCgiXG5TZW5kOiAiLCBUcnVlKTsKLSsJCX0KLSsJfQotK30KLSsKLSt2b2lkCi0rU2V0Vmlld09ubHlTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudmlld09ubHkpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0Tk9KUEVHU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmIChhcHBEYXRhLmVuYWJsZUpQRUcpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0UXVhbGl0eVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotKwkJaW50IG4gPSBhdG9pKHBhcmFtc1swXSk7Ci0rCQlpZiAoYXBwRGF0YS5xdWFsaXR5TGV2ZWwgPT0gbikgewotKwkJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwkJfSBlbHNlIHsKLSsJCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRDb21wcmVzc1N0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoKm51bV9wYXJhbXMgIT0gMCkgewotKwkJaW50IG4gPSBhdG9pKHBhcmFtc1swXSk7Ci0rCQlpZiAoYXBwRGF0YS5jb21wcmVzc0xldmVsID09IG4pIHsKLSsJCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJCX0gZWxzZSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwkJfQotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0U2NhbGVOU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmICgqbnVtX3BhcmFtcyAhPSAwKSB7Ci0rCQlpbnQgbiA9IGF0b2kocGFyYW1zWzBdKTsKLSsJCWlmIChhcHBEYXRhLnNlcnZlclNjYWxlID09IG4gfHwgKGFwcERhdGEuc2VydmVyU2NhbGUgPj0gNiAmJiBuID49IDYpKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCQl9IGVsc2UgewotKwkJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJCX0KLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldDhicHBTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJCWlmIChiMTYgICAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyhiMTYsICAgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJCX0KLSsJCWlmIChiZnVsbCAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyhiZnVsbCwgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJCX0KLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldDE2YnBwU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmIChhcHBEYXRhLnVzZUJHUjU2NSkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCQlpZiAoYjggICAgIT0gTlVMTCkgewotKwkJCVh0VmFTZXRWYWx1ZXMoYjgsICAgIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCQlpZiAoYmZ1bGwgIT0gTlVMTCkgewotKwkJCVh0VmFTZXRWYWx1ZXMoYmZ1bGwsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRGdWxsQ29sb3JTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlQkdSNTY1IHx8IGFwcERhdGEudXNlQkdSMjMzKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJCWlmIChiOCAgIT0gTlVMTCkgewotKwkJCVh0VmFTZXRWYWx1ZXMoYjgsICBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwkJfQotKwkJaWYgKGIxNiAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyhiMTYsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRYR3JhYlN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS5ncmFiQWxsKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldEVzY2FwZUtleXNTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuZXNjYXBlQWN0aXZlKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldDI1NkNvbG9yc1N0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS51c2VCR1IyMzMgPT0gMjU2KSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJCWlmICh3NjQgICE9IE5VTEwpIHsKLSsJCQlYdFZhU2V0VmFsdWVzKHc2NCAsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCQlpZiAodzggICAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh3OCAgLCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwkJfQotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0NjRDb2xvcnNTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlQkdSMjMzID09IDY0KSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJCWlmICh3MjU2ICE9IE5VTEwpIHsKLSsJCQlYdFZhU2V0VmFsdWVzKHcyNTYsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCQl9Ci0rCQlpZiAodzggICAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh3OCAgLCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwkJfQotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0OENvbG9yc1N0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS51c2VCR1IyMzMgPT0gOCkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCQlpZiAodzI1NiAhPSBOVUxMKSB7Ci0rCQkJWHRWYVNldFZhbHVlcyh3MjU2LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwkJfQotKwkJaWYgKHc2NCAgIT0gTlVMTCkgewotKwkJCVh0VmFTZXRWYWx1ZXModzY0ICwgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJCX0KLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldEdyZXlTY2FsZVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS51c2VHcmV5U2NhbGUpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLStzdGF0aWMgdm9pZCBpbml0X3N0YXRlKHZvaWQpIHsKLSsJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0rCWlmIChmaXJzdCAmJiBhcHBEYXRhLmVuY29kaW5nc1N0cmluZykgewotKwkJY2hhciAqdCwgKnosICp5LCAqaDsKLSsJCWNoYXIgKnN0ciA9IGFwcERhdGEuZW5jb2RpbmdzU3RyaW5nOwotKwkJaW50IGxlbiA9IHN0cmxlbihzdHIpOwotKwotKwkJdCA9IHN0cnN0cihzdHIsICJ0aWdodCIpOwotKwkJeiA9IHN0cnN0cihzdHIsICJ6cmxlIik7Ci0rCQl5ID0gc3Ryc3RyKHN0ciwgInp5d3JsZSIpOwotKwkJaCA9IHN0cnN0cihzdHIsICJoZXh0aWxlIik7Ci0rCi0rCQlpZiAoIXQpIHQgPSBzdHIgKyBsZW47Ci0rCQlpZiAoIXopIHogPSBzdHIgKyBsZW47Ci0rCQlpZiAoIXkpIHkgPSBzdHIgKyBsZW47Ci0rCQlpZiAoIWgpIGggPSBzdHIgKyBsZW47Ci0rCi0rCQl1c2luZ1pSTEUgPSBGYWxzZTsKLSsJCXVzaW5nWllXUkxFID0gRmFsc2U7Ci0rCQl1c2luZ0hleHRpbGUgPSBGYWxzZTsKLSsKLSsJCWlmICh0IDwgeiAmJiB0IDwgeSAmJiB0IDwgaCkgewotKwkJCTsKLSsJCX0gZWxzZSBpZiAoeiA8IHQgJiYgeiA8IHkgJiYgeiA8IGgpIHsKLSsJCQl1c2luZ1pSTEUgPSBUcnVlOwotKwkJfSBlbHNlIGlmICh5IDwgdCAmJiB5IDwgeiAmJiB5IDwgaCkgewotKwkJCXVzaW5nWllXUkxFID0gVHJ1ZTsKLSsJCQl1c2luZ1pSTEUgPSBUcnVlOwotKwkJfSBlbHNlIGlmIChoIDwgdCAmJiBoIDwgeiAmJiBoIDwgeSkgewotKwkJCXVzaW5nSGV4dGlsZSA9IFRydWU7Ci0rCQl9Ci0rCX0KLSsJZmlyc3QgPSAwOwotKwotK30KLSsKLSt2b2lkCi0rU2V0WlJMRVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpbml0X3N0YXRlKCk7Ci0rCWlmICh1c2luZ1pSTEUpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0SGV4dGlsZVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpbml0X3N0YXRlKCk7Ci0rCWlmICh1c2luZ0hleHRpbGUpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0WllXUkxFU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWluaXRfc3RhdGUoKTsKLSsJaWYgKHVzaW5nWllXUkxFKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldEN1cnNvclNoYXBlU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmIChhcHBEYXRhLnVzZVJlbW90ZUN1cnNvcikgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRDdXJzb3JBbHBoYVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS51c2VDdXJzb3JBbHBoYSkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRYMTFDdXJzb3JTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlWDExQ3Vyc29yKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldEJlbGxTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEudXNlQmVsbCkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRSYXdMb2NhbFN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS51c2VSYXdMb2NhbCkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRTZXJ2ZXJJbnB1dFN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoIWFwcERhdGEuc2VydmVySW5wdXQpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0UGlwZWxpbmVVcGRhdGVzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoIWFwcERhdGEucGlwZWxpbmVVcGRhdGVzKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldFNlbmRDbGlwYm9hcmQoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmICghYXBwRGF0YS5zZW5kQ2xpcGJvYXJkKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldFNlbmRBbHdheXMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcykKLSt7Ci0rCWlmICghYXBwRGF0YS5zZW5kQWx3YXlzKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSt9Ci0rCi0rdm9pZAotK1NldFNpbmdsZVdpbmRvd1N0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS5zaW5nbGVXaW5kb3cpIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIFRydWUsIE5VTEwpOwotKwl9IGVsc2UgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgRmFsc2UsIE5VTEwpOwotKwl9Ci0rCWlmICh3IHx8IGV2IHx8IHBhcmFtcyB8fCBudW1fcGFyYW1zKSB7fQotK30KLSsKLSt2b2lkCi0rU2V0VGV4dENoYXRTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKQotK3sKLSsJaWYgKGFwcERhdGEuY2hhdEFjdGl2ZSkgewotKwkJWHRWYVNldFZhbHVlcyh3LCBYdE5zdGF0ZSwgVHJ1ZSwgTlVMTCk7Ci0rCX0gZWxzZSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBGYWxzZSwgTlVMTCk7Ci0rCX0KLSsJaWYgKHcgfHwgZXYgfHwgcGFyYW1zIHx8IG51bV9wYXJhbXMpIHt9Ci0rfQotKwotK3ZvaWQKLStTZXRGaWxlWGZlclN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpCi0rewotKwlpZiAoYXBwRGF0YS5maWxlQWN0aXZlKSB7Ci0rCQlYdFZhU2V0VmFsdWVzKHcsIFh0TnN0YXRlLCBUcnVlLCBOVUxMKTsKLSsJfSBlbHNlIHsKLSsJCVh0VmFTZXRWYWx1ZXModywgWHROc3RhdGUsIEZhbHNlLCBOVUxMKTsKLSsJfQotKwlpZiAodyB8fCBldiB8fCBwYXJhbXMgfHwgbnVtX3BhcmFtcykge30KLSB9Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci92bmN2aWV3ZXIuaCB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdm5jdmlld2VyLmgKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci92bmN2aWV3ZXIuaAkyMDA0LTAzLTExIDEzOjE0OjQwLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci92bmN2aWV3ZXIuaAkyMDEwLTA0LTE3IDIyOjI5OjQyLjAwMDAwMDAwMCAtMDQwMAotQEAgLTI4LDYgKzI4LDcgQEAKLSAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjaW5jbHVkZSA8cHdkLmg+Ci0gI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWNQLmg+Ci1AQCAtNTEsNyArNTIsMTMgQEAKLSAJCQkgICAgICgoKGwpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAotIAkJCSAgICAgKCgobCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpICA6IChsKSkKLSAKLS0jZGVmaW5lIE1BWF9FTkNPRElOR1MgMjAKLSsjZGVmaW5lIFN3YXAzMklmQkUobCkgXAotKyAgICAoKihjaGFyICopJmVuZGlhblRlc3QgPyAobCkgOiAoKCgobCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCBcCi0rCQkJICAgICAoKChsKSAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKLSsJCQkgICAgICgoKGwpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAotKwkJCSAgICAgKCgobCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpICkKLSsKLSsjZGVmaW5lIE1BWF9FTkNPRElOR1MgMjQKLSAKLSAjZGVmaW5lIEZMQVNIX1BPUlRfT0ZGU0VUIDU0MDAKLSAjZGVmaW5lIExJU1RFTl9QT1JUX09GRlNFVCA1NTAwCi1AQCAtNjQsNjAgKzcxLDEzMyBAQAotICNkZWZpbmUgREVGQVVMVF9WSUFfQ01EICAgICBcCi0gICAoREVGQVVMVF9TU0hfQ01EICIgLWYgLUwgJUw6JUg6JVIgJUcgc2xlZXAgMjAiKQotIAotKyNkZWZpbmUgVFZOQ19TQU1QT1BUIDQKLStlbnVtIHtUVk5DXzFYPTAsIFRWTkNfNFgsIFRWTkNfMlgsIFRWTkNfR1JBWX07Ci0gCi0tLyogYXJnc3Jlc291cmNlcy5jICovCi0tCi0tdHlwZWRlZiBzdHJ1Y3QgewotLSAgQm9vbCBzaGFyZURlc2t0b3A7Ci0tICBCb29sIHZpZXdPbmx5OwotLSAgQm9vbCBmdWxsU2NyZWVuOwotLSAgQm9vbCBncmFiS2V5Ym9hcmQ7Ci0tICBCb29sIHJhaXNlT25CZWVwOwotLQotLSAgU3RyaW5nIGVuY29kaW5nc1N0cmluZzsKLS0KLS0gIEJvb2wgdXNlQkdSMjMzOwotLSAgaW50IG5Db2xvdXJzOwotLSAgQm9vbCB1c2VTaGFyZWRDb2xvdXJzOwotLSAgQm9vbCBmb3JjZU93bkNtYXA7Ci0tICBCb29sIGZvcmNlVHJ1ZUNvbG91cjsKLS0gIGludCByZXF1ZXN0ZWREZXB0aDsKLS0KLS0gIEJvb2wgdXNlU2htOwotLQotLSAgaW50IHdtRGVjb3JhdGlvbldpZHRoOwotLSAgaW50IHdtRGVjb3JhdGlvbkhlaWdodDsKLS0KLS0gIGNoYXIgKnVzZXJMb2dpbjsKLS0KLS0gIGNoYXIgKnBhc3N3b3JkRmlsZTsKLS0gIEJvb2wgcGFzc3dvcmREaWFsb2c7Ci0tCi0tICBpbnQgcmF3RGVsYXk7Ci0tICBpbnQgY29weVJlY3REZWxheTsKLSsjaWYgMAotK3N0YXRpYyBjb25zdCBjaGFyICpzdWJzYW1wTGV2ZWwyc3RyW1RWTkNfU0FNUE9QVF0gPSB7Ci0rICAiMVgiLCAiNFgiLCAiMlgiLCAiR3JheSIKLSt9OwotKyNlbmRpZgotKyNpZmRlZiBUVVJCT1ZOQwotKyNkZWZpbmUgcmZiVGlnaHROb1psaWIgMHgwQQotKyNkZWZpbmUgcmZiVHVyYm9WbmNWZW5kb3IgIlRSQk8iCi0rI2RlZmluZSByZmJKcGVnUXVhbGl0eUxldmVsMSAgICAgICAweEZGRkZGRTAxCi0rI2RlZmluZSByZmJKcGVnUXVhbGl0eUxldmVsMTAwICAgICAweEZGRkZGRTY0Ci0rI2RlZmluZSByZmJKcGVnU3Vic2FtcDFYICAgICAgICAgICAweEZGRkZGRDAwCi0rI2RlZmluZSByZmJKcGVnU3Vic2FtcDRYICAgICAgICAgICAweEZGRkZGRDAxCi0rI2RlZmluZSByZmJKcGVnU3Vic2FtcDJYICAgICAgICAgICAweEZGRkZGRDAyCi0rI2RlZmluZSByZmJKcGVnU3Vic2FtcEdyYXkgICAgICAgICAweEZGRkZGRDAzCi0rI2VuZGlmCi0rCi0rLyogZm9yIGRlYnVnZ2luZyB3aWR0aCwgaGVpZ2h0LCBldGMgKi8KLSsjaWYgMAotKyNkZWZpbmUgWHRWYVNldFZhbHVlcyBwcmludGYoIiVzOiVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBYdFZhU2V0VmFsdWVzCi0rI2VuZGlmCi0gCi0tICBCb29sIGRlYnVnOwotIAotLSAgaW50IHBvcHVwQnV0dG9uQ291bnQ7Ci0rLyogYXJnc3Jlc291cmNlcy5jICovCi0gCi0tICBpbnQgYnVtcFNjcm9sbFRpbWU7Ci0tICBpbnQgYnVtcFNjcm9sbFBpeGVsczsKLSt0eXBlZGVmIHN0cnVjdCB7Ci0rCUJvb2wgc2hhcmVEZXNrdG9wOwotKwlCb29sIHZpZXdPbmx5OwotKwlCb29sIGZ1bGxTY3JlZW47Ci0rCUJvb2wgZ3JhYktleWJvYXJkOwotKwlCb29sIHJhaXNlT25CZWVwOwotKwotKwlTdHJpbmcgZW5jb2RpbmdzU3RyaW5nOwotKwotKwlpbnQgdXNlQkdSMjMzOwotKwlpbnQgbkNvbG91cnM7Ci0rCUJvb2wgdXNlU2hhcmVkQ29sb3VyczsKLSsJQm9vbCBmb3JjZU93bkNtYXA7Ci0rCUJvb2wgZm9yY2VUcnVlQ29sb3VyOwotKwlpbnQgcmVxdWVzdGVkRGVwdGg7Ci0rCUJvb2wgdXNlQkdSNTY1OwotKwlCb29sIHVzZUdyZXlTY2FsZTsKLSsKLSsJQm9vbCBncmFiQWxsOwotKwlCb29sIHVzZVhzZXJ2ZXJCYWNraW5nU3RvcmU7Ci0rCUJvb2wgb3ZlcnJpZGVSZWRpcjsKLSsJQm9vbCBwb3B1cEZpeDsKLSsKLSsJQm9vbCB1c2VTaG07Ci0rCUJvb2wgdGVybUNoYXQ7Ci0rCi0rCWludCB3bURlY29yYXRpb25XaWR0aDsKLSsJaW50IHdtRGVjb3JhdGlvbkhlaWdodDsKLSsKLSsJY2hhciAqdXNlckxvZ2luOwotKwljaGFyICp1bml4UFc7Ci0rCWNoYXIgKm1zTG9nb247Ci0rCWNoYXIgKnJlcGVhdGVyVWx0cmE7Ci0rCUJvb2wgdWx0cmFEU007Ci0rCUJvb2wgYWNjZXB0UG9wdXA7Ci0rCWNoYXIgKnJmYlZlcnNpb247Ci0rCi0rCWNoYXIgKnBhc3N3b3JkRmlsZTsKLSsJQm9vbCBwYXNzd29yZERpYWxvZzsKLSsJQm9vbCBub3R0eTsKLSsKLSsJaW50IHJhd0RlbGF5OwotKwlpbnQgY29weVJlY3REZWxheTsKLSsKLSsJaW50IHlDcm9wOwotKwlpbnQgc2JXaWR0aDsKLSsJQm9vbCB1c2VDdXJzb3JBbHBoYTsKLSsJQm9vbCB1c2VSYXdMb2NhbDsKLSsKLSsJQm9vbCBkZWJ1ZzsKLSsKLSsJaW50IHBvcHVwQnV0dG9uQ291bnQ7Ci0rCWludCBwb3B1cEJ1dHRvbkJyZWFrOwotKwotKwlpbnQgYnVtcFNjcm9sbFRpbWU7Ci0rCWludCBidW1wU2Nyb2xsUGl4ZWxzOwotKwotKwlpbnQgY29tcHJlc3NMZXZlbDsKLSsJaW50IHF1YWxpdHlMZXZlbDsKLSsJQm9vbCBlbmFibGVKUEVHOwotKwlCb29sIHVzZVJlbW90ZUN1cnNvcjsKLSsJQm9vbCB1c2VYMTFDdXJzb3I7Ci0rCUJvb2wgdXNlQmVsbDsKLSsJQm9vbCBhdXRvUGFzczsKLSsKLSsJQm9vbCBzZXJ2ZXJJbnB1dDsKLSsJQm9vbCBzaW5nbGVXaW5kb3c7Ci0rCWludCBzZXJ2ZXJTY2FsZTsKLSsJQm9vbCBjaGF0QWN0aXZlOwotKwlCb29sIGNoYXRPbmx5OwotKwlCb29sIGZpbGVBY3RpdmU7Ci0rCi0rCWNoYXIgKnNjYWxlOwotKwljaGFyICplc2NhcGVLZXlzOwotKwlCb29sIGFwcFNoYXJlOwotKwlCb29sIGVzY2FwZUFjdGl2ZTsKLSsJQm9vbCBwaXBlbGluZVVwZGF0ZXM7Ci0rCi0rCUJvb2wgc2VuZENsaXBib2FyZDsKLSsJQm9vbCBzZW5kQWx3YXlzOwotKwljaGFyICpyZWN2VGV4dDsKLSsKLSsJLyogb25seSBmb3IgdHVyYm92bmMgbW9kZSAqLwotKwlTdHJpbmcgc3Vic2FtcFN0cmluZzsKLSsJaW50IHN1YnNhbXBMZXZlbDsKLSsJQm9vbCBkb3VibGVCdWZmZXI7Ci0gCi0tICBpbnQgY29tcHJlc3NMZXZlbDsKLS0gIGludCBxdWFsaXR5TGV2ZWw7Ci0tICBCb29sIGVuYWJsZUpQRUc7Ci0tICBCb29sIHVzZVJlbW90ZUN1cnNvcjsKLS0gIEJvb2wgdXNlWDExQ3Vyc29yOwotLSAgQm9vbCBhdXRvUGFzczsKLSsJQm9vbCBub2lwdjQ7Ci0rCUJvb2wgbm9pcHY2OwotIAotIH0gQXBwRGF0YTsKLSAKLSBleHRlcm4gQXBwRGF0YSBhcHBEYXRhOwotK2V4dGVybiBBcHBEYXRhIGFwcERhdGFOZXc7Ci0gCi0gZXh0ZXJuIGNoYXIgKmZhbGxiYWNrX3Jlc291cmNlc1tdOwotIGV4dGVybiBjaGFyIHZuY1NlcnZlckhvc3RbXTsKLSBleHRlcm4gaW50IHZuY1NlcnZlclBvcnQ7Ci0gZXh0ZXJuIEJvb2wgbGlzdGVuU3BlY2lmaWVkOwotK2V4dGVybiBwaWRfdCBsaXN0ZW5QYXJlbnQ7Ci0gZXh0ZXJuIGludCBsaXN0ZW5Qb3J0LCBmbGFzaFBvcnQ7Ci0gCi0gZXh0ZXJuIFhybU9wdGlvbkRlc2NSZWMgY21kTGluZU9wdGlvbnNbXTsKLUBAIC0xMzAsMTAgKzIxMCwxMSBAQAotIC8qIGNvbG91ci5jICovCi0gCi0gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgQkdSMjMzVG9QaXhlbFtdOwotK2V4dGVybiB1bnNpZ25lZCBsb25nIEJHUjU2NVRvUGl4ZWxbXTsKLSAKLSBleHRlcm4gQ29sb3JtYXAgY21hcDsKLSBleHRlcm4gVmlzdWFsICp2aXM7Ci0tZXh0ZXJuIHVuc2lnbmVkIGludCB2aXNkZXB0aCwgdmlzYnBwOwotK2V4dGVybiB1bnNpZ25lZCBpbnQgdmlzZGVwdGgsIHZpc2JwcCwgaXNMU0I7Ci0gCi0gZXh0ZXJuIHZvaWQgU2V0VmlzdWFsQW5kQ21hcCgpOwotIAotQEAgLTE1NSwxNSArMjM2LDYwIEBACi0gZXh0ZXJuIEdDIHNyY0dDLCBkc3RHQzsKLSBleHRlcm4gRGltZW5zaW9uIGRweVdpZHRoLCBkcHlIZWlnaHQ7Ci0gCi0rZXh0ZXJuIGludCBhcHBzaGFyZV8wX2hpbnQ7Ci0rZXh0ZXJuIGludCBhcHBzaGFyZV94X2hpbnQ7Ci0rZXh0ZXJuIGludCBhcHBzaGFyZV95X2hpbnQ7Ci0rCi0gZXh0ZXJuIHZvaWQgRGVza3RvcEluaXRCZWZvcmVSZWFsaXphdGlvbigpOwotIGV4dGVybiB2b2lkIERlc2t0b3BJbml0QWZ0ZXJSZWFsaXphdGlvbigpOwotK2V4dGVybiB2b2lkIFhjdXJzb3JzKGludCBzZXQpOwotIGV4dGVybiB2b2lkIFNlbmRSRkJFdmVudChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0gCQkJIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLSBleHRlcm4gdm9pZCBDb3B5RGF0YVRvU2NyZWVuKGNoYXIgKmJ1ZiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotK2V4dGVybiB2b2lkIEZpbGxTY3JlZW4oaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZmlsbCk7Ci0gZXh0ZXJuIHZvaWQgU3luY2hyb25pc2VTY3JlZW4oKTsKLSAKLStleHRlcm4gdm9pZCBSZURvRGVza3RvcCgpOwotK2V4dGVybiB2b2lkIERlc2t0b3BDdXJzb3JPZmYoKTsKLStleHRlcm4gdm9pZCBwdXRfaW1hZ2UoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzb2xpZCk7Ci0rZXh0ZXJuIHZvaWQgY29weV9yZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3JjX3gsIGludCBzcmNfeSk7Ci0rCi0rZXh0ZXJuIHZvaWQgcmVsZWFzZUFsbFByZXNzZWRNb2RpZmllcnModm9pZCk7Ci0rZXh0ZXJuIHZvaWQgZnNfZ3JhYihpbnQgY2hlY2spOwotK2V4dGVybiB2b2lkIGZzX3VuZ3JhYihpbnQgY2hlY2spOwotKwotIC8qIGRpYWxvZ3MuYyAqLwotIAotK2V4dGVybiBpbnQgdXNlX3R0eSh2b2lkKTsKLSsKLStleHRlcm4gdm9pZCBTY2FsZURpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiBjaGFyICpEb1NjYWxlRGlhbG9nKCk7Ci0rCi0rZXh0ZXJuIHZvaWQgRXNjYXBlRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0rCQkJICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIGNoYXIgKkRvRXNjYXBlS2V5c0RpYWxvZygpOwotKwotK2V4dGVybiB2b2lkIFlDcm9wRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0rCQkJICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIGNoYXIgKkRvWUNyb3BEaWFsb2coKTsKLSsKLStleHRlcm4gdm9pZCBTY2JhckRpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiBjaGFyICpEb1NjYmFyRGlhbG9nKCk7Ci0rCi0rZXh0ZXJuIHZvaWQgU2NhbGVORGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0rCQkJICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIGNoYXIgKkRvU2NhbGVORGlhbG9nKCk7Ci0rCi0rZXh0ZXJuIHZvaWQgUXVhbGl0eURpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiBjaGFyICpEb1F1YWxpdHlEaWFsb2coKTsKLSsKLStleHRlcm4gdm9pZCBDb21wcmVzc0RpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiBjaGFyICpEb0NvbXByZXNzRGlhbG9nKCk7Ci0rCi0gZXh0ZXJuIHZvaWQgU2VydmVyRGlhbG9nRG9uZShXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0gCQkJICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0gZXh0ZXJuIGNoYXIgKkRvU2VydmVyRGlhbG9nKCk7Ci1AQCAtMTcxLDYgKzI5NywxMCBAQAotIAkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotIGV4dGVybiBjaGFyICpEb1Bhc3N3b3JkRGlhbG9nKCk7Ci0gCi0rZXh0ZXJuIHZvaWQgVXNlckRpYWxvZ0RvbmUoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJCSAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiBjaGFyICpEb1VzZXJEaWFsb2coKTsKLSsKLSAvKiBmdWxsc2NyZWVuLmMgKi8KLSAKLSBleHRlcm4gdm9pZCBUb2dnbGVGdWxsU2NyZWVuKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywKLUBAIC0xODEsNiArMzExLDEzIEBACi0gZXh0ZXJuIHZvaWQgRnVsbFNjcmVlbk9uKCk7Ci0gZXh0ZXJuIHZvaWQgRnVsbFNjcmVlbk9mZigpOwotIAotK2V4dGVybiBpbnQgbmV0X3dtX3N1cHBvcnRlZCh2b2lkKTsKLSsKLStleHRlcm4gdm9pZCBKdW1wTGVmdChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBKdW1wUmlnaHQoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgSnVtcFVwKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIEp1bXBEb3duKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotKwotIC8qIGxpc3Rlbi5jICovCi0gCi0gZXh0ZXJuIHZvaWQgbGlzdGVuRm9ySW5jb21pbmdDb25uZWN0aW9ucygpOwotQEAgLTE5Niw2ICszMzMsOCBAQAotIAkJICAgICAgIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLSBleHRlcm4gdm9pZCBRdWl0KFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywKLSAJCSBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgSGlkZUNoYXQoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLSBleHRlcm4gdm9pZCBDbGVhbnVwKCk7Ci0gCi0gLyogcG9wdXAuYyAqLwotQEAgLTIwNyw2ICszNDYsMjkgQEAKLSAJCSAgICAgIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLSBleHRlcm4gdm9pZCBDcmVhdGVQb3B1cCgpOwotIAotK2V4dGVybiB2b2lkIEhpZGVTY2FsZU4oV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJICAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIENyZWF0ZVNjYWxlTigpOwotKwotK2V4dGVybiB2b2lkIEhpZGVUdXJib1ZOQyhXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0rCQkgICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgQ3JlYXRlVHVyYm9WTkMoKTsKLStleHRlcm4gdm9pZCBVcGRhdGVTdWJzYW1wQnV0dG9ucygpOwotK2V4dGVybiB2b2lkIFVwZGF0ZVF1YWxTbGlkZXIoKTsKLStleHRlcm4gdm9pZCBVcGRhdGVRdWFsKCk7Ci0rCi0rZXh0ZXJuIHZvaWQgSGlkZVF1YWxpdHkoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJICAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIENyZWF0ZVF1YWxpdHkoKTsKLSsKLStleHRlcm4gdm9pZCBIaWRlQ29tcHJlc3MoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIFN0cmluZyAqcGFyYW1zLAotKwkJICAgICAgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIENyZWF0ZUNvbXByZXNzKCk7Ci0rCi0rZXh0ZXJuIHZvaWQgTm9vcChXaWRnZXQgdywgWEV2ZW50ICpldmVudCwgU3RyaW5nICpwYXJhbXMsCi0rCQkgICAgICBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rCi0rZXh0ZXJuIGludCBDcmVhdGVNc2coY2hhciAqbXNnLCBpbnQgd2FpdCk7Ci0gLyogcmZicHJvdG8uYyAqLwotIAotIGV4dGVybiBpbnQgcmZic29jazsKLUBAIC0yMjksOCArMzkxLDE5IEBACi0gZXh0ZXJuIEJvb2wgU2VuZENsaWVudEN1dFRleHQoY2hhciAqc3RyLCBpbnQgbGVuKTsKLSBleHRlcm4gQm9vbCBIYW5kbGVSRkJTZXJ2ZXJNZXNzYWdlKCk7Ci0gCi0rZXh0ZXJuIEJvb2wgU2VuZFNlcnZlcklucHV0KEJvb2wgZW5hYmxlZCk7Ci0rZXh0ZXJuIEJvb2wgU2VuZFNpbmdsZVdpbmRvdyhpbnQgeCwgaW50IHkpOwotK2V4dGVybiBCb29sIFNlbmRTZXJ2ZXJTY2FsZShpbnQgbik7Ci0rCi0rZXh0ZXJuIEJvb2wgU2VuZFRleHRDaGF0KGNoYXIgKnN0cik7Ci0rZXh0ZXJuIEJvb2wgU2VuZFRleHRDaGF0T3Blbih2b2lkKTsKLStleHRlcm4gQm9vbCBTZW5kVGV4dENoYXRDbG9zZSh2b2lkKTsKLStleHRlcm4gQm9vbCBTZW5kVGV4dENoYXRGaW5pc2godm9pZCk7Ci0rCi0gZXh0ZXJuIHZvaWQgUHJpbnRQaXhlbEZvcm1hdChyZmJQaXhlbEZvcm1hdCAqZm9ybWF0KTsKLSAKLStleHRlcm4gZG91YmxlIGRub3codm9pZCk7Ci0rCi0gLyogc2VsZWN0aW9uLmMgKi8KLSAKLSBleHRlcm4gdm9pZCBJbml0aWFsaXNlU2VsZWN0aW9uKCk7Ci1AQCAtMjQxLDggKzQxNCwxMCBAQAotIAotIC8qIHNobS5jICovCi0gCi0tZXh0ZXJuIFhJbWFnZSAqQ3JlYXRlU2htSW1hZ2UoKTsKLStleHRlcm4gWEltYWdlICpDcmVhdGVTaG1JbWFnZShpbnQgZG9feWNyb3ApOwotIGV4dGVybiB2b2lkIFNobUNsZWFudXAoKTsKLStleHRlcm4gdm9pZCBTaG1EZXRhY2goKTsKLStleHRlcm4gQm9vbCBVc2luZ1NobSgpOwotIAotIC8qIHNvY2tldHMuYyAqLwotIAotQEAgLTI1MiwxMSArNDI3LDE5IEBACi0gZXh0ZXJuIEJvb2wgV3JpdGVFeGFjdChpbnQgc29jaywgY2hhciAqYnVmLCBpbnQgbik7Ci0gZXh0ZXJuIGludCBGaW5kRnJlZVRjcFBvcnQodm9pZCk7Ci0gZXh0ZXJuIGludCBMaXN0ZW5BdFRjcFBvcnQoaW50IHBvcnQpOwotLWV4dGVybiBpbnQgQ29ubmVjdFRvVGNwQWRkcih1bnNpZ25lZCBpbnQgaG9zdCwgaW50IHBvcnQpOwotK2V4dGVybiBpbnQgTGlzdGVuQXRUY3BQb3J0NihpbnQgcG9ydCk7Ci0rZXh0ZXJuIGludCBkb3R0ZWRfaXAoY2hhciAqaG9zdCwgaW50IHBhcnRpYWwpOwotK2V4dGVybiBpbnQgQ29ubmVjdFRvVGNwQWRkcihjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQpOwotK2V4dGVybiBpbnQgQ29ubmVjdFRvVW5peFNvY2tldChjaGFyICpmaWxlKTsKLSBleHRlcm4gaW50IEFjY2VwdFRjcENvbm5lY3Rpb24oaW50IGxpc3RlblNvY2spOwotK2V4dGVybiBpbnQgQWNjZXB0VGNwQ29ubmVjdGlvbjYoaW50IGxpc3RlblNvY2spOwotIGV4dGVybiBCb29sIFNldE5vbkJsb2NraW5nKGludCBzb2NrKTsKLStleHRlcm4gQm9vbCBTZXROb0RlbGF5KGludCBzb2NrKTsKLStleHRlcm4gQm9vbCBTb2NrZXRQYWlyKGludCBmZFsyXSk7Ci0gCi0gZXh0ZXJuIGludCBTdHJpbmdUb0lQQWRkcihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCAqYWRkcik7Ci0rZXh0ZXJuIGNoYXIgKmdldF9wZWVyX2lwKGludCBzb2NrKTsKLStleHRlcm4gY2hhciAqaXAyaG9zdChjaGFyICppcCk7Ci0gZXh0ZXJuIEJvb2wgU2FtZU1hY2hpbmUoaW50IHNvY2spOwotIAotIC8qIHR1bm5lbC5jICovCi1AQCAtMjcxLDMgKzQ1NCw4MiBAQAotIGV4dGVybiBYdEFwcENvbnRleHQgYXBwQ29udGV4dDsKLSBleHRlcm4gRGlzcGxheSogZHB5OwotIGV4dGVybiBXaWRnZXQgdG9wbGV2ZWw7Ci0rCi0rZXh0ZXJuIHZvaWQgR290Q2hhdFRleHQoY2hhciAqc3RyLCBpbnQgbGVuKTsKLStleHRlcm4gdm9pZCB1bml4cHcoY2hhciAqaW5zdHIsIGludCB2ZW5jcnlwdF9wbGFpbik7Ci0rCi0rZXh0ZXJuIHZvaWQgVG9nZ2xlOGJwcChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGUxNmJwcChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVGdWxsQ29sb3IoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgVG9nZ2xlMjU2Q29sb3JzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZTY0Q29sb3JzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZThDb2xvcnMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgVG9nZ2xlR3JleVNjYWxlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVRpZ2h0WlJMRShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVUaWdodEhleHRpbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgVG9nZ2xlWlJMRVpZV1JMRShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVWaWV3T25seShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVKUEVHKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZUN1cnNvclNoYXBlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZUN1cnNvckFscGhhKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVgxMUN1cnNvcihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVCZWxsKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVJhd0xvY2FsKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVNlcnZlcklucHV0KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVBpcGVsaW5lVXBkYXRlcyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBUb2dnbGVTZW5kQ2xpcGJvYXJkKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVNlbmRBbHdheXMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgVG9nZ2xlU2luZ2xlV2luZG93KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVhHcmFiKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZUVzY2FwZUFjdGl2ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRFc2NhcGVLZXlzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIERvU2VydmVyU2NhbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgRG9TZXJ2ZXJRdWFsaXR5KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIERvU2VydmVyQ29tcHJlc3MoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0U2NhbGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0WUNyb3AoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0U2NiYXIoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2hvd1NjYWxlTihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTaG93VHVyYm9WTkMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2hvd1F1YWxpdHkoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2hvd0NvbXByZXNzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldFNjYWxlTihXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRUdXJib1ZOQyhXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRRdWFsaXR5KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldENvbXByZXNzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVRleHRDaGF0KFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZUZpbGVYZmVyKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFRvZ2dsZVRlcm1UZXh0Q2hhdChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLSsKLStleHRlcm4gdm9pZCBzY2FsZV9jaGVja196cmxlKHZvaWQpOwotKwotK2V4dGVybiB2b2lkIFNldFZpZXdPbmx5U3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0Tk9KUEVHU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0U2NhbGVOU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0UXVhbGl0eVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldENvbXByZXNzU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0OGJwcFN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldDE2YnBwU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0RnVsbENvbG9yU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0MjU2Q29sb3JzU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0NjRDb2xvcnNTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXQ4Q29sb3JzU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0R3JleVNjYWxlU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0WlJMRVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldEhleHRpbGVTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRaWVdSTEVTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRDdXJzb3JTaGFwZVN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldEN1cnNvckFscGhhU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0WDExQ3Vyc29yU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0QmVsbFN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldFJhd0xvY2FsU3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0U2VydmVySW5wdXRTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRQaXBlbGluZVVwZGF0ZXMoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0U2VuZENsaXBib2FyZChXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRTZW5kQWx3YXlzKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldFNpbmdsZVdpbmRvd1N0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldFRleHRDaGF0U3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0VGVybVRleHRDaGF0U3RhdGUoV2lkZ2V0IHcsIFhFdmVudCAqZXYsIFN0cmluZyAqcGFyYW1zLCBDYXJkaW5hbCAqbnVtX3BhcmFtcyk7Ci0rZXh0ZXJuIHZvaWQgU2V0RmlsZVhmZXJTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLStleHRlcm4gdm9pZCBTZXRYR3JhYlN0YXRlKFdpZGdldCB3LCBYRXZlbnQgKmV2LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpOwotK2V4dGVybiB2b2lkIFNldEVzY2FwZUtleXNTdGF0ZShXaWRnZXQgdywgWEV2ZW50ICpldiwgU3RyaW5nICpwYXJhbXMsIENhcmRpbmFsICpudW1fcGFyYW1zKTsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3ZuY3ZpZXdlci5tYW4gdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5tYW4KLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci92bmN2aWV3ZXIubWFuCTIwMDQtMDMtMTEgMTM6MTQ6NDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5tYW4JMjAxMC0wNC0xMSAyMzozMDoyNC4wMDAwMDAwMDAgLTA0MDAKLUBAIC01LDM4ICs1LDU1IEBACi0gLlwiIENvcHlyaWdodCAoQykgMTk5OCBNYXJjdXMuQnJpbmttYW5uQHJ1aHItdW5pLWJvY2h1bS5kZQotIC5cIiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBSZWQgSGF0LCBJbmMuCi0gLlwiIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIENvbnN0YW50aW4gS2FwbGluc2t5IDxjb25zdEBjZS5jY3RwdS5lZHUucnU+Ci0rLlwiIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0gLlwiCi0gLlwiIFlvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotIC5cIiBMaWNlbnNlIGFzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSBMSUNFTkNFLlRYVCB0aGF0IGNvbWVzIHdpdGggdGhlCi0gLlwiIFRpZ2h0Vk5DIGRpc3RyaWJ1dGlvbi4KLSAuXCIKLS0uVEggdm5jdmlld2VyIDEgIkphbnVhcnkgMjAwMyIgIiIgIlRpZ2h0Vk5DIgotKy5USCBzc3ZuY3ZpZXdlciAxICJBcHJpbCAyMDEwIiAiIiAiU1NWTkMiCi0gLlNIIE5BTUUKLS12bmN2aWV3ZXIgXC0gYW4gWCB2aWV3ZXIgY2xpZW50IGZvciBWTkMKLStzc3ZuY3ZpZXdlciBcLSBhbiBYIHZpZXdlciBjbGllbnQgZm9yIFZOQwotIC5TSCBTWU5PUFNJUwotLS5CIHZuY3ZpZXdlcgotKy5CIHNzdm5jdmlld2VyCi0gLlJJIFtcfCBvcHRpb25zIFx8XQotIC5SSSBbXHwgaG9zdCBcfF1bXHwgOmRpc3BsYXkgXHxdCi0gLmJyCi0tLkIgdm5jdmlld2VyCi0rLkIgc3N2bmN2aWV3ZXIKLSAuUkkgW1x8IG9wdGlvbnMgXHxdCi0gLlJJIFtcfCBob3N0IFx8XVtcfCA6OnBvcnQgXHxdCi0gLmJyCi0tLkIgdm5jdmlld2VyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLlJJIGV4ZWM9W1x8IGNtZCthcmdzLi4uIFx8XQotKy5icgotKy5CIHNzdm5jdmlld2VyCi0rLlJJIFtcfCBvcHRpb25zIFx8XQotKy5SSSBmZD1uCi0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSsuUkkgW1x8IG9wdGlvbnMgXHxdCi0rLlJJIC9wYXRoL3RvL3VuaXgvc29ja2V0Ci0rLmJyCi0rLkIgc3N2bmN2aWV3ZXIKLSAuUkkgW1x8IG9wdGlvbnMgXHxdCi0gLklSIFwtbGlzdGVuCi0gLlJJIFtcfCBkaXNwbGF5IFx8XQotIC5icgotLS5CIHZuY3ZpZXdlcgotKy5CIHNzdm5jdmlld2VyCi0gLklSIFwtaGVscAotIC5icgotIC5TSCBERVNDUklQVElPTgotLS5CIHZuY3ZpZXdlcgotKy5CIHNzdm5jdmlld2VyCi0gaXMgYW4gWHRcLWJhc2VkIGNsaWVudCBhcHBsaWNhdGlvbiBmb3IgdGhlIFZOQyAoVmlydHVhbCBOZXR3b3JrCi0gQ29tcHV0aW5nKSBzeXN0ZW0uIEl0IGNhbiBjb25uZWN0IHRvIGFueSBWTkNcLWNvbXBhdGlibGUgc2VydmVyIHN1Y2gKLS1hcyBcZkJYdm5jXGZSIG9yIFdpblZOQywgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgZGVza3RvcCBlbnZpcm9ubWVudAotK2FzIFxmQlh2bmNcZlIsIFdpblZOQywgb3IgXGZCeDExdm5jXGZSLCBhbGxvd2luZyB5b3UgdG8gY29udHJvbCBkZXNrdG9wIGVudmlyb25tZW50Ci0gb2YgYSBkaWZmZXJlbnQgbWFjaGluZS4KLSAKLStzc3ZuY3ZpZXdlciBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mIHRoZSB0aWdodHZuYyB1bml4IHZpZXdlciB0aGF0IGNhbgotK3Rha2UgYWR2YW50YWdlIG9mIGZlYXR1cmVzIGluIHRoZSBcZkJ4MTF2bmNcZlIgYW5kIFVsdHJhVk5DIFZOQyBzZXJ2ZXJzLgotK1NlZSBiZWxvdyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGZlYXR1cmVzLgotKwotIFlvdSBjYW4gdXNlIEY4IHRvIGRpc3BsYXkgYSBwb3BcLXVwIHV0aWxpdHkgbWVudS4gUHJlc3MgRjggdHdpY2UgdG8KLSBwYXNzIHNpbmdsZSBGOCB0byB0aGUgcmVtb3RlIHNpZGUuCi0gLlNIIE9QVElPTlMKLUBAIC0xMDIsMTMgKzExOSwxMyBAQAotIFRpZ2h0Vk5DIHN1cHBvcnRzIHNldmVyYWwgZGlmZmVyZW50IGNvbXByZXNzaW9uIG1ldGhvZHMgdG8gZW5jb2RlCi0gc2NyZWVuIHVwZGF0ZXM7IHRoaXMgb3B0aW9uIHNwZWNpZmllcyBhIHNldCBvZiB0aGVtIHRvIHVzZSBpbiBvcmRlciBvZgotIHByZWZlcmVuY2UuIEVuY29kaW5ncyBhcmUgc3BlY2lmaWVkIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgYW5kIG11c3QKLS10aHVzIGJlIGVuY2xvc2VkIGluIHF1b3RlcyBpZiBtb3JlIHRoYW4gb25lIGlzIHNwZWNpZmllZC4gQXZhaWxhYmxlCi0tZW5jb2RpbmdzLCBpbiBkZWZhdWx0IG9yZGVyIGZvciBhIHJlbW90ZSBjb25uZWN0aW9uLCBhcmUgImNvcHlyZWN0Ci0tdGlnaHQgaGV4dGlsZSB6bGliIGNvcnJlIHJyZSByYXciLiBGb3IgYSBsb2NhbCBjb25uZWN0aW9uICh0byB0aGUgc2FtZQotLW1hY2hpbmUpLCB0aGUgZGVmYXVsdCBvcmRlciB0byB0cnkgaXMgInJhdyBjb3B5cmVjdCB0aWdodCBoZXh0aWxlIHpsaWIKLS1jb3JyZSBycmUiLiBSYXcgZW5jb2RpbmcgaXMgYWx3YXlzIGFzc3VtZWQgYXMgYSBsYXN0IG9wdGlvbiBpZiBubwotLW90aGVyIGVuY29kaW5nIGNhbiBiZSB1c2VkIGZvciBzb21lIHJlYXNvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KLS1lbmNvZGluZ3MsIHNlZSB0aGUgc2VjdGlvbiBFTkNPRElOR1MgYmVsb3cuCi0rdGh1cyBiZSBlbmNsb3NlZCBpbiBxdW90ZXMgaWYgbW9yZSB0aGFuIG9uZSBpcyBzcGVjaWZpZWQuICBDb21tYXMgbWF5IGJlIHVzZWQgdG8gYXZvaWQgc3BhY2VzLgotK0F2YWlsYWJsZSBlbmNvZGluZ3MsIGluIGRlZmF1bHQgb3JkZXIgZm9yIGEgcmVtb3RlIGNvbm5lY3Rpb24sIGFyZQotKyJjb3B5cmVjdCB0aWdodCBoZXh0aWxlIHpsaWIgY29ycmUgcnJlIHJhdyIuIEZvciBhIGxvY2FsIGNvbm5lY3Rpb24KLSsodG8gdGhlIHNhbWUgbWFjaGluZSksIHRoZSBkZWZhdWx0IG9yZGVyIHRvIHRyeSBpcyAicmF3IGNvcHlyZWN0IHRpZ2h0Ci0raGV4dGlsZSB6bGliIGNvcnJlIHJyZSIuIFJhdyBlbmNvZGluZyBpcyBhbHdheXMgYXNzdW1lZCBhcyBhIGxhc3Qgb3B0aW9uCi0raWYgbm8gb3RoZXIgZW5jb2RpbmcgY2FuIGJlIHVzZWQgZm9yIHNvbWUgcmVhc29uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotK29uIGVuY29kaW5ncywgc2VlIHRoZSBzZWN0aW9uIEVOQ09ESU5HUyBiZWxvdy4KLSAuVFAKLSBcZkJcLWJncjIzM1xmUgotIEFsd2F5cyB1c2UgdGhlIEJHUjIzMyBmb3JtYXQgdG8gZW5jb2RlIHBpeGVsIGRhdGEuIFRoaXMgcmVkdWNlcwotQEAgLTE2OCw2ICsxODUsNDI0IEBACi0gXGZCXC1hdXRvcGFzc1xmUgotIFJlYWQgYSBwbGFpbi10ZXh0IHBhc3N3b3JkIGZyb20gc3RkaW4uIFRoaXMgb3B0aW9uIGFmZmVjdHMgb25seSB0aGUKLSBzdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb24uCi0rCi0rLlNIIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIE9QVElPTlMKLSsuVFAKLStFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSB3ZWIgcGFnZSBpcyBsb2NhdGVkIGF0OgotKy5UUAotK2h0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3N2bmMuaHRtbAotKy5UUAotK05vdGU6IFpSTEUgYW5kIFpZV1JMRSBlbmNvZGluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCi0rLlRQCi0rTm90ZTogRjkgaXMgc2hvcnRjdXQgdG8gVG9nZ2xlIEZ1bGxTY3JlZW4gbW9kZS4KLSsuVFAKLStOb3RlOiBJbiAtbGlzdGVuIG1vZGUgc2V0IHRoZSBlbnYgdmFyLiBTU1ZOQ19NVUxUSVBMRV9MSVNURU49MQotK3RvIGFsbG93IG1vcmUgdGhhbiBvbmUgaW5jb21pbmcgVk5DIHNlcnZlciBhdCBhIHRpbWUuCi0rVGhpcyBpcyB0aGUgc2FtZSBhcyAtbXVsdGlsaXN0ZW4gZGVzY3JpYmVkIGJlbG93LiAgU2V0Ci0rU1NWTkNfTVVMVElQTEVfTElTVEVOPU1BWDpuIHRvIGFsbG93IG5vIG1vcmUgdGhhbiAibiIKLStzaW11bHRhbmVvdXMgcmV2ZXJzZSBjb25uZWN0aW9ucy4KLSsKLStJZiB0aGUgaG9zdDpwb3J0IGlzIHNwZWNpZmllZCBhcyAiZXhlYz1jb21tYW5kIGFyZ3MuLi4iCi0rdGhlbiBpbnN0ZWFkIG9mIG1ha2luZyBhIFRDUC9JUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUKLStyZW1vdGUgVk5DIHNlcnZlciwgImNvbW1hbmQgYXJncy4uLiIgaXMgZXhlY3V0ZWQgYW5kIHRoZQotK3ZpZXdlciBpcyBhdHRhY2hlZCB0byBpdHMgc3RkaW8uICBUaGlzIGVuYWJsZXMgdHVubmVsbGluZwotK2VzdGFibGlzaGVkIHZpYSBhbiBleHRlcm5hbCBjb21tYW5kLCBlLmcuIGFuIHN0dW5uZWwoOCkKLSt0aGF0IGRvZXMgbm90IGludm9sdmUgYSBsaXN0ZW5pbmcgc29ja2V0LgotK1RoaXMgbW9kZSBkb2VzIG5vdCB3b3JrIGZvciAtbGlzdGVuIHJldmVyc2UgY29ubmVjdGlvbnMuCi0rCi0rSWYgdGhlIGhvc3Q6cG9ydCBpcyBzcGVjaWZpZWQgYXMgImZkPW4iIHRoZW4gaXQgaXMgYXNzdW1lZAotK24gaXMgYW4gYWxyZWFkeSBvcGVuZWQgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBzb2NrZXQuIChpLmUKLSt0aGUgcGFyZW50IGRpZCBmb3JrK2V4ZWMpCi0rCi0rSWYgdGhlIGhvc3Q6cG9ydCBjb250YWlucyBhICcvJyBpdCBpcyBpbnRlcnByZXRlZCBhcyBhCi0rdW5peC1kb21haW4gc29ja2V0IChBRl9MT0NBTCBpbnNlYWQgb2YgQUZfSU5FVCkKLSsuVFAKLStcZkJcLW11bHRpbGlzdGVuXGZSCi0rQXMgaW4gLWxpc3RlbiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgZXhjZXB0Ci0rYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIHRvIGJlIGNvbm5lY3RlZAotK2F0IGEgdGltZS4gIFRoZSBkZWZhdWx0IGZvciAtbGlzdGVuIG9mIG9ubHkgb25lIGF0IGEKLSt0aW1lIHRyaWVzIHRvIHBsYXkgaXQgc2FmZSBieSBub3QgYWxsb3dpbmcgYW55b25lIG9uCi0rdGhlIG5ldHdvcmsgdG8gcHV0IChtYW55KSBkZXNrdG9wcyBvbiB5b3VyIHNjcmVlbiBvdmVyCi0rYSBsb25nIHdpbmRvdyBvZiB0aW1lLiBVc2UgLW11bHRpbGlzdGVuIGZvciBubyBsaW1pdC4KLSsuVFAKLStcZkJcLWFjY2VwdHBvcHVwXGZSCi0rSW4gXGZCXC1saXN0ZW5cZlIgKHJldmVyc2UgY29ubmVjdGlvbiBsaXN0ZW5pbmcpIG1vZGUgd2hlbgotK2EgcmV2ZXJzZSBWTkMgY29ubmVjdGlvbiBjb21lcyBpbiBzaG93IGEgcG9wdXAgYXNraW5nCi0rd2hldGhlciB0byBBY2NlcHQgb3IgUmVqZWN0IHRoZSBjb25uZWN0aW9uLiAgVGhlIElQCi0rYWRkcmVzcyBvZiB0aGUgY29ubmVjdGluZyBob3N0IGlzIHNob3duLiAgU2FtZSBhcwotK3NldHRpbmcgdGhlIGVudi4gdmFyLiBTU1ZOQ19BQ0NFUFRfUE9QVVA9MS4KLSsuVFAKLStcZkJcLWFjY2VwdHBvcHVwc2NcZlIKLStBcyBpbiBcZkJcLWFjY2VwdHBvcHVwXGZSIGV4Y2VwdCBhc3N1bWUgVWx0cmFWTkMgU2luZ2xlCi0rQ2xpY2sgKFNDKSBzZXJ2ZXIuICBSZXRyaWV2ZSBVc2VyIGFuZCBDb21wdXRlck5hbWUKLStpbmZvIGZyb20gVWx0cmFWTkMgU2VydmVyIGFuZCBkaXNwbGF5IGluIHRoZSBQb3B1cC4KLSsuVFAKLStcZkJcLXVzZTY0XGZSCi0rSW4gXGZCXC1iZ3IyMzNcZlIgbW9kZSwgdXNlIDY0IGNvbG9ycyBpbnN0ZWFkIG9mIDI1Ni4KLSsuVFAKLStcZkJcLWJncjIyMlxmUgotK1NhbWUgYXMgXGZCXC11c2U2NFxmUi4KLSsuVFAKLStcZkJcLXVzZThcZlIKLStJbiBcZkJcLWJncjIzM1xmUiBtb2RlLCB1c2UgOCBjb2xvcnMgaW5zdGVhZCBvZiAyNTYuCi0rLlRQCi0rXGZCXC1iZ3IxMTFcZlIKLStTYW1lIGFzIFxmQlwtdXNlOFxmUi4KLSsuVFAKLStcZkJcLTE2YnBwXGZSCi0rSWYgdGhlIHZuYyB2aWV3ZXIgWCBkaXNwbGF5IGlzIGRlcHRoIDI0IGF0IDMyYnBwCi0rcmVxdWVzdCBhIDE2YnBwIGZvcm1hdCBmcm9tIHRoZSBWTkMgc2VydmVyIHRvIGN1dAotK25ldHdvcmsgdHJhZmZpYyBieSB1cCB0byAyWCwgdGhlbiB0cmFubGF0ZSB0aGUKLStwaXhlbHMgdG8gMzJicHAgbG9jYWxseS4KLSsuVFAKLStcZkJcLWJncjU2NVxmUgotK1NhbWUgYXMgXGZCXC0xNmJwcFxmUi4KLSsuVFAKLStcZkJcLWdyZXlcZlIKLStVc2UgYSBncmV5IHNjYWxlIGZvciB0aGUgMTYtIGFuZCA4XGZCXC1icHBcZlIgbW9kZXMuCi0rLlRQCi0rXGZCXC1hbHBoYVxmUgotK1VzZSBhbHBoYWJsZW5kaW5nIHRyYW5zcGFyZW5jeSBmb3IgbG9jYWwgY3Vyc29ycwotK3JlcXVpcmVzOiB4MTF2bmMgc2VydmVyLCBib3RoIGNsaWVudCBhbmQgc2VydmVyCi0rbXVzdCBiZSAzMmJwcCBhbmQgc2FtZSBlbmRpYW5uZXNzLgotKy5UUAotK1xmQlwtc2NhbGVcZlIgXGZJc3RyXGZSCi0rU2NhbGUgdGhlIGRlc2t0b3AgbG9jYWxseS4gIFRoZSBzdHJpbmcgInN0ciIgY2FuCi0rYSBmbG9hdGluZyBwb2ludCByYXRpbywgZS5nLiAiMC45Iiwgb3IgYSBmcmFjdGlvbiwKLStlLmcuICIzLzQiLCBvciBXeEgsIGUuZy4gMTI4MHgxMDI0LiAgVXNlICJmaXQiCi0rdG8gZml0IGluIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLiAgVXNlICJhdXRvIiB0bwotK2ZpdCBpbiB0aGUgd2luZG93IHNpemUuICAic3RyIiBjYW4gYWxzbyBiZSBzZXQgYnkKLSt0aGUgZW52LiB2YXIuIFNTVk5DX1NDQUxFLgotKwotK0lmIHlvdSBvYnNlcnZlIG1vdXNlIHRyYWlsIHBhaW50aW5nIGVycm9ycywgZW5hYmxlCi0rWDExIEN1cnNvciBtb2RlIChlaXRoZXIgdmlhIFBvcHVwIG9yIFxmQlwteDExY3Vyc29yXGZSLikKLSsKLStOb3RlIHRoYXQgc2NhbGluZyBpcyBkb25lIGluIHNvZnR3YXJlIGFuZCBzbyBjYW4gYmUKLStzbG93IGFuZCByZXF1aXJlcyBtb3JlIG1lbW9yeS4gIFNvbWUgc3BlZWR1cCBUaXBzOgotKwotK1pSTEUgaXMgZmFzdGVyIHRoYW4gVGlnaHQgaW4gdGhpcyBtb2RlLiAgV2hlbgotK3NjYWxpbmcgaXMgZmlyc3QgZGV0ZWN0ZWQsIHRoZSBlbmNvZGluZyB3aWxsCi0rYmUgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byBaUkxFLiAgVXNlIHRoZQotK1BvcHVwIG1lbnUgaWYgeW91IHdhbnQgdG8gZ28gYmFjayB0byBUaWdodC4KLStTZXQgU1NWTkNfUFJFU0VSVkVfRU5DT0RJTkc9MSB0byBkaXNhYmxlIHRoaXMuCi0rCi0rVXNlIGEgc29saWQgYmFja2dyb3VuZCBvbiB0aGUgcmVtb3RlIHNpZGUuCi0rKGUuZy4gbWFudWFsbHkgb3IgdmlhIHgxMXZuYyBcZkJcLXNvbGlkXGZSIC4uLikKLSsKLStJZiB0aGUgcmVtb3RlIHNlcnZlciBpcyB4MTF2bmMsIHRyeSBjbGllbnQKLStzaWRlIGNhY2hpbmc6IHgxMXZuYyBcZkJcLW5jYWNoZVxmUiAxMCAuLi4KLSsuVFAKLStcZkJcLXljcm9wXGZSIG4KLStPbmx5IHNob3cgdGhlIHRvcCBuIHJvd3Mgb2YgdGhlIGZyYW1lYnVmZmVyLiAgRm9yCi0rdXNlIHdpdGggeDExdm5jIFxmQlwtbmNhY2hlXGZSIGNsaWVudCBjYWNoaW5nIG9wdGlvbgotK3RvIGhlbHAgImhpZGUiIHRoZSBwaXhlbCBjYWNoZSByZWdpb24uCi0rVXNlIGEgbmVnYXRpdmUgdmFsdWUgKGUuZy4gXGZCXC0xXGZSKSBmb3IgYXV0b2RldGVjdGlvbi4KLStBdXRvZGV0ZWN0aW9uIHdpbGwgYWx3YXlzIHRha2UgcGxhY2UgaWYgdGhlIHJlbW90ZQotK2ZiIGhlaWdodCBpcyBtb3JlIHRoYW4gMiB0aW1lcyB0aGUgd2lkdGguCi0rLlRQCi0rXGZCXC1zYndpZHRoXGZSIG4KLStTY3JvbGxiYXIgd2lkdGggZm9yIHgxMXZuYyBcZkJcLW5jYWNoZVxmUiBtb2RlIChcZkJcLXljcm9wXGZSKSwKLStkZWZhdWx0IGlzIHZlcnkgbmFycm93OiAyIHBpeGVscywgaXQgaXMgbmFycm93IHRvCi0rYXZvaWQgZGlzdHJhY3Rpb24gaW4gXGZCXC15Y3JvcFxmUiBtb2RlLgotKy5UUAotK1xmQlwtbm9iZWxsXGZSCi0rRGlzYWJsZSBiZWxsLgotKy5UUAotK1xmQlwtcmF3bG9jYWxcZlIKLStQcmVmZXIgcmF3IGVuY29kaW5nIGZvciBsb2NhbGhvc3QsIGRlZmF1bHQgaXMKLStubywgaS5lLiBhc3N1bWVzIHlvdSBoYXZlIGEgU1NIIHR1bm5lbCBpbnN0ZWFkLgotKy5UUAotK1xmQlwtbm90dHlcZlIKLStUcnkgdG8gYXZvaWQgdXNpbmcgdGhlIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZQotK3Jlc3BvbnNlczogdXNlIHdpbmRvd3MgZm9yIG1lc3NhZ2VzIGFuZCBwcm9tcHRpbmcKLStpbnN0ZWFkLiAgTWVzc2FnZXMgd2lsbCBhbHNvIGJlIHByaW50ZWQgdG8gdGVybWluYWwuCi0rLlRQCi0rXGZCXC1zZW5kY2xpcGJvYXJkXGZSCi0rU2VuZCB0aGUgWCBDTElQQk9BUkQgc2VsZWN0aW9uIChpLmUuIEN0cmwrQywKLStDdHJsK1YpIGluc3RlYWQgb2YgdGhlIFggUFJJTUFSWSBzZWxlY3Rpb24gKG1vdXNlCi0rc2VsZWN0IGFuZCBtaWRkbGUgYnV0dG9uIHBhc3RlLikKLSsuVFAKLStcZkJcLXNlbmRhbHdheXNcZlIKLStXaGVuZXZlciB0aGUgbW91c2UgZW50ZXJzIHRoZSBWTkMgdmlld2VyIG1haW4KLSt3aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmCi0raXQgaGFzIG5vdCBjaGFuZ2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBYdCByZXNvdXJjZQotK3RyYW5zbGF0aW9uIFNlbGVjdGlvblRvVk5DKGFsd2F5cykKLSsuVFAKLStcZkJcLXJlY3Z0ZXh0XGZSCi0rc3RyICAgV2hlbiBjdXQgdGV4dCBpcyByZWNlaXZlZCBmcm9tIHRoZSBWTkMgc2VydmVyLAotK3Nzdm5jdmlld2VyIHdpbGwgc2V0IGJvdGggdGhlIFggUFJJTUFSWSBhbmQgdGhlCi0rWCBDTElQQk9BUkQgbG9jYWwgc2VsZWN0aW9ucy4gIFRvIGNvbnRyb2wgd2hpY2gKLStpcyBzZXQsIHNwZWNpZnkgJ3N0cicgYXMgJ3ByaW1hcnknLCAnY2xpcGJvYXJkJywKLStvciAnYm90aCcgKHRoZSBkZWZhdWx0LikKLSsuVFAKLStcZkJcLWdyYWJhbGxcZlIKLStHcmFiIHRoZSBlbnRpcmUgWCBzZXJ2ZXIgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCi0rbmVlZGVkIGJ5IHNvbWUgb2xkIHdpbmRvdyBtYW5hZ2VycyBsaWtlIGZ2d20yLgotKy5UUAotK1xmQlwtcG9wdXBmaXhcZlIKLStXYXJwIHRoZSBwb3B1cCBiYWNrIHRvIHRoZSBwb2ludGVyIHBvc2l0aW9uLAotK25lZWRlZCBieSBzb21lIG9sZCB3aW5kb3cgbWFuYWdlcnMgbGlrZSBmdndtMi4KLSsuVFAKLStcZkJcLWdyYWJrYmRcZlIKLStHcmFiIHRoZSBYIGtleWJvYXJkIHdoZW4gaW4gZnVsbHNjcmVlbiBtb2RlLAotK25lZWRlZCBieSBzb21lIHdpbmRvdyBtYW5hZ2Vycy4gU2FtZSBhcyBcZkJcLWdyYWJrZXlib2FyZFxmUi4KLStcZkJcLWdyYWJrYmRcZlIgaXMgdGhlIGRlZmF1bHQsIHVzZSBcZkJcLW5vZ3JhYmtiZFxmUiB0byBkaXNhYmxlLgotKy5UUAotK1xmQlwtYnNcZlIsIFxmQlwtbm9ic1xmUgotK1doZXRoZXIgb3Igbm90IHRvIHVzZSBYIHNlcnZlciBCYWNraW5nc3RvcmUgZm9yIHRoZQotK21haW4gdmlld2VyIHdpbmRvdy4gIFRoZSBkZWZhdWx0IGlzIHRvIG5vdCwgbWFpbmx5Ci0rYmVjYXVzZSBtb3N0IExpbnV4LCBldGMsIHN5c3RlbXMgWCBzZXJ2ZXJzIGRpc2FibGUKLSsqYWxsKiBCYWNraW5nc3RvcmUgYnkgZGVmYXVsdC4gIFRvIHJlXGZCXC1lbmFibGVcZlIgaXQgcHV0Ci0rCi0rT3B0aW9uICJCYWNraW5nc3RvcmUiCi0rCi0raW4gdGhlIERldmljZSBzZWN0aW9uIG9mIC9ldGMvWDExL3hvcmcuY29uZi4KLStJbiBcZkJcLWJzXGZSIG1vZGUgd2l0aCBubyBYIHNlcnZlciBiYWNraW5nc3RvcmUsIHdoZW5ldmVyIGFuCi0rYXJlYSBvZiB0aGUgc2NyZWVuIGlzIHJlXGZCXC1leHBvc2VkXGZSIGl0IG11c3QgZ28gb3V0IHRvIHRoZQotK1ZOQyBzZXJ2ZXIgdG8gcmV0cmlldmUgdGhlIHBpeGVscy4gVGhpcyBpcyB0b28gc2xvdy4KLSsKLStJbiBcZkJcLW5vYnNcZlIgbW9kZSwgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSB0aGUgdmlld2VyIHRvCi0rcHJvdmlkZSBpdHMgb3duIGJhY2tpbmcgb2YgdGhlIG1haW4gdmlld2VyIHdpbmRvdy4gVGhpcwotK2FjdHVhbGx5IG1ha2VzIHNvbWUgYWN0aXZpdGllcyBmYXN0ZXIgKGNoYW5nZXMgaW4gbGFyZ2UKLStyZWdpb25zKSBidXQgY2FuIGFwcGVhciB0byAiZmxhc2giIHRvbyBtdWNoLgotKy5UUAotK1xmQlwtbm9zaG1cZlIKLStEaXNhYmxlIHVzZSBvZiBNSVQgc2hhcmVkIG1lbW9yeSBleHRlbnNpb24gKG5vdCByZWNvbW1lbmRlZCkKLSsuVFAKLStcZkJcLXRlcm1jaGF0XGZSCi0rRG8gdGhlIFVsdHJhVk5DIGNoYXQgaW4gdGhlIHRlcm1pbmFsIHZuY3ZpZXdlciBpcyBpbgotK2luc3RlYWQgb2YgaW4gYW4gaW5kZXBlbmRlbnQgd2luZG93LgotKy5UUAotK1xmQlwtdW5peHB3XGZSIFxmSXN0clxmUgotK1VzZWZ1bCBmb3IgbG9nZ2luZyBpbnRvIHgxMXZuYyBpbiBcZkJcLXVuaXhwd1xmUiBtb2RlLiAic3RyIiBpcyBhCi0rc3RyaW5nIHRoYXQgYWxsb3dzIG1hbnkgd2F5cyB0byBlbnRlciB0aGUgVW5peCBVc2VybmFtZQotK2FuZCBVbml4IFBhc3N3b3JkLiAgVGhlc2UgY2hhcmFjdGVyczogdXNlcm5hbWUsIG5ld2xpbmUsCi0rcGFzc3dvcmQsIG5ld2xpbmUgYXJlIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIgYWZ0ZXIgYW55IFZOQwotK2F1dGhlbnRpY2F0aW9uIGhhcyB0YWtlbiBwbGFjZS4gIFVuZGVyIHgxMXZuYyB0aGV5IGFyZQotK3VzZWQgZm9yIHRoZSBcZkJcLXVuaXhwd1xmUiBsb2dpbi4gIE90aGVyIFZOQyBzZXJ2ZXJzIGNvdWxkIGRvCi0rc29tZXRoaW5nIHNpbWlsYXIuCi0rCi0rWW91IGNhbiBhbHNvIGluZGljYXRlICJzdHIiIHZpYSB0aGUgZW52aXJvbm1lbnQKLSt2YXJpYWJsZSBTU1ZOQ19VTklYUFcuCi0rCi0rTm90ZSB0aGF0IHRoZSBFc2NhcGUga2V5IGlzIGFjdHVhbGx5IHNlbnQgZmlyc3QgdG8gdGVsbAotK3gxMXZuYyB0byBub3QgZWNobyB0aGUgVW5peCBVc2VybmFtZSBiYWNrIHRvIHRoZSBWTkMKLSt2aWV3ZXIuIFNldCBTU1ZOQ19VTklYUFdfTk9FU0M9MSB0byBvdmVycmlkZSB0aGlzLgotKwotK0lmIHN0ciBpcyAiLiIsIHRoZW4geW91IGFyZSBwcm9tcHRlZCBhdCB0aGUgY29tbWFuZCBsaW5lCi0rZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIG5vcm1hbCB3YXkuICBJZiBzdHIgaXMKLSsiLSIgdGhlIHN0ZGluIGlzIHJlYWQgdmlhIGdldHBhc3MoMykgZm9yIHVzZXJuYW1lQHBhc3N3b3JkLgotK090aGVyd2lzZSBpZiBzdHIgaXMgYSBmaWxlLCBpdCBpcyBvcGVuZWQgYW5kIHRoZSBmaXJzdCBsaW5lCi0rcmVhZCBpcyB0YWtlbiBhcyB0aGUgVW5peCB1c2VybmFtZSBhbmQgdGhlIDJuZCBhcyB0aGUKLStwYXNzd29yZC4gSWYgc3RyIHByZWZpeGVkIGJ5ICJybToiIHRoZSBmaWxlIGlzIHJlbW92ZWQKLSthZnRlciByZWFkaW5nLiBPdGhlcndpc2UsIGlmIHN0ciBoYXMgYSAiQCIgY2hhcmFjdGVyLAotK2l0IGlzIHRha2VuIGFzIHVzZXJuYW1lQHBhc3N3b3JkLiBPdGhlcndpc2UsIHRoZSBwcm9ncmFtCi0rZXhpdHMgd2l0aCBhbiBlcnJvci4gR290IGFsbCB0aGF0PwotKy5UUAotK1xmQi1yZXBlYXRlclxmUiBcZklzdHJcZlIKLStUaGlzIGlzIGZvciB1c2Ugd2l0aCBVbHRyYVZOQyByZXBlYXRlciBwcm94eSBkZXNjcmliZWQKLStoZXJlOiBodHRwOi8vd3d3LnV2bmMuY29tL2FkZG9ucy9yZXBlYXRlci5odG1sLiAgVGhlICJzdHIiCi0raXMgdGhlIElEIHN0cmluZyB0byBiZSBzZW50IHRvIHRoZSByZXBlYXRlci4gIEUuZy4gSUQ6MTIzNAotK0l0IGNhbiBhbHNvIGJlIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBvciBkaXNwbGF5IG9mIHRoZSBWTkMKLStzZXJ2ZXIsIGUuZy4gMTIuMzQuNTYuNzg6MCBvciBzbm9vcHkuY29tOjEuICBOb3RlIHRoYXQgd2hlbgotK3VzaW5nIC1yZXBlYXRlciwgdGhlIGhvc3Q6ZHB5IG9uIHRoZSBjbWRsaW5lIGlzIHRoZSByZXBlYXRlcgotK3NlcnZlciwgTk9UIHRoZSBWTkMgc2VydmVyLiAgVGhlIHJlcGVhdGVyIHdpbGwgY29ubmVjdCB5b3UuCi0rCi0rRXhhbXBsZTogdm5jdmlld2VyIC4uLiAtcmVwZWF0ZXIgSUQ6MzMzMyByZXBlYXQuaG9zdDo1OTAwCi0rCi0rRXhhbXBsZTogdm5jdmlld2VyIC4uLiAtcmVwZWF0ZXIgdmhvc3Q6MCByZXBlYXQuaG9zdDo1OTAwCi0rCi0rVXNlLCBlLmcuLCAnLXJlcGVhdGVyIFNDSUlJPUlEOjMyMTAnIGlmIHRoZSByZXBlYXRlciBpcyBhCi0rU2luZ2xlIENsaWNrIElJSSAoU1NMKSByZXBlYXRlciAocmVwZWF0ZXJfU1NMLmV4ZSkgYW5kIHlvdQotK2FyZSBwYXNzaW5nIHRoZSBTU0wgcGFydCBvZiB0aGUgY29ubmVjdGlvbiB0aHJvdWdoIHN0dW5uZWwsIHNvY2F0LCBldGMuCi0rVGhpcyB3YXkgdGhlIG1hZ2ljIFVsdHJhVk5DIHN0cmluZyAndGVzdEInIG5lZWRlZCB0byB3b3JrIHdpdGggdGhlCi0rcmVwZWF0ZXIgaXMgc2VudCB0byBpdC4KLSsuVFAKLStcZkItcmZidmVyc2lvblxmUiBcZklzdHJcZlIKLStTZXQgdGhlIGFkdmVydGlzZWQgUkZCIHZlcnNpb24uICBFLmcuOiAtcmZidmVyc2lvbiAzLjYgIEZvciBzb21lCi0rc2VydmVycywgZS5nLiBVbHRyYVZOQyB0aGlzIG5lZWRzIHRvIGJlIGRvbmUuCi0rLlRQCi0rXGZCLXVsdHJhZHNtXGZSCi0rVWx0cmFWTkMgaGFzIHN5bW1ldHJpYyBwcml2YXRlIGVuY3J5cHRpb24gRFNNIHBsdWdpbnMuICBTZWUKLStodHRwOi8vd3d3LnV2bmMuY29tL2ZlYXR1cmVzL2VuY3J5cHRpb24uaHRtbC4gIEl0IGlzIGFzc3VtZWQKLSt5b3UgYXJlIHVzaW5nIGEgdW5peCBwcm9ncmFtIChlLmcuIG91ciB1bHRyYXZuY19kc21faGVscGVyKSB0bwotK2VuY3J5cHQgYW5kIGRlY3J5cHQgdGhlIFVsdHJhVk5DIERTTSBzdHJlYW0uIElOIEFERElUSU9OIFRPCi0rVEhBVCBzdXBwbHkgLXVsdHJhZHNtIHRvIHRlbGwgVEhJUyB2aWV3ZXIgdG8gbW9kaWZ5IHRoZSBSRkIKLStkYXRhIHNlbnQgc28gYXMgdG8gd29yayB3aXRoIHRoZSBVbHRyYVZOQyBTZXJ2ZXIuICBGb3Igc29tZQotK3JlYXNvbiwgZWFjaCBSRkIgbXNnIHR5cGUgbXVzdCBiZSBzZW50IHR3aWNlIHVuZGVyIERTTS4KLSsuVFAKLStcZkJcLW1zbG9nb25cZlIgXGZJdXNlclxmUgotK1VzZSBXaW5kb3dzIE1TIExvZ29uIHRvIGFuIFVsdHJhVk5DIHNlcnZlci4gIFN1cHBseSB0aGUKLSt1c2VybmFtZSBvciAiMSIgdG8gYmUgcHJvbXB0ZWQuICBUaGUgZGVmYXVsdCBpcyB0bwotK2F1dG9kZXRlY3QgdGhlIFVsdHJhVk5DIE1TIExvZ29uIHNlcnZlciBhbmQgcHJvbXB0IGZvcgotK3RoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCi0rCi0rSU1QT1JUQU5UIE5PVEU6IFRoZSBVbHRyYVZOQyBNUy1Mb2dvbiBEaWZmaWUtSGVsbG1hbgotK2V4Y2hhbmdlIGlzIHZlcnkgd2VhayBhbmQgY2FuIGJlIGJydXRlIGZvcmNlZCB0byByZWNvdmVyCi0reW91ciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW4gYSBmZXcgc2Vjb25kcyBvZiBDUFUKLSt0aW1lLiAgVG8gYmUgc2FmZSwgYmUgc3VyZSB0byB1c2UgYW4gYWRkaXRpb25hbCBlbmNyeXB0ZWQKLSt0dW5uZWwgKGUuZy4gU1NMIG9yIFNTSCkgZm9yIHRoZSBlbnRpcmUgVk5DIHNlc3Npb24uCi0rLlRQCi0rXGZCXC1jaGF0b25seVxmUgotK1RyeSB0byBiZSBhIGNsaWVudCB0aGF0IG9ubHkgZG9lcyBVbHRyYVZOQyB0ZXh0IGNoYXQuIFRoaXMKLSttb2RlIGlzIHVzZWQgYnkgeDExdm5jIHRvIHByZXNlbnQgYSBjaGF0IHdpbmRvdyBvbiB0aGUgcGh5c2ljYWwKLStYMTEgY29uc29sZSAoaS5lLiB0byBjaGF0IHdpdGggdGhlIHBlcnNvbiBhdCB0aGUgZGlzcGxheSkuCi0rLlRQCi0rXGZCLWVudlxmUiBcZklWQVI9VkFMVUVcZlIKLStUbyBzYXZlIHdyaXRpbmcgYSBzaGVsbCBzY3JpcHQgdG8gc2V0IGVudmlyb25tZW50Ci0rdmFyaWFibGVzLCBzcGVjaWZ5IGFzIG1hbnkgYXMgeW91IG5lZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLAotKy1lbnYgU1NWTkNfTVVMVElQTEVfTElTVEVOPU1BWDo1IC1lbnYgRURJVE9SPXZpCi0rLlRQCi0rXGZCXC1ub2lwdjZcZlIKLStEaXNhYmxlIGFsbCBJUHY2IHNvY2tldHMuICBTYW1lIGFzIFZOQ1ZJRVdFUl9OT19JUFY2PTEuCi0rLlRQCi0rXGZCXC1ub2lwdjRcZlIKLStEaXNhYmxlIGFsbCBJUHY0IHNvY2tldHMuICBTYW1lIGFzIFZOQ1ZJRVdFUl9OT19JUFY0PTEuCi0rLlRQCi0rXGZCXC1wcmludHJlc1xmUgotK1ByaW50IG91dCB0aGUgU3N2bmMgWCByZXNvdXJjZXMgKGFwcGRlZmF1bHRzKSBhbmQKLSt0aGVuIGV4aXQuIFlvdSBjYW4gc2F2ZSB0aGVtIHRvIGEgZmlsZSBhbmQgY3VzdG9taXplIHRoZW0gKGUuZy4gdGhlCi0ra2V5YmluZGluZ3MgYW5kIFBvcHVwIG1lbnUpICBUaGVuIHBvaW50IHRvIHRoZSBmaWxlIHZpYQotK1hFTlZJUk9OTUVOVCBvciBYQVBQTFJFU0RJUi4KLSsuVFAKLStcZkJcLXBpcGVsaW5lXGZSCi0rTGlrZSBUdXJib1ZOQywgcmVxdWVzdCB0aGUgbmV4dCBmcmFtZWJ1ZmZlciB1cGRhdGUgYXMgc29vbgotK2FzIHBvc3NpYmxlIGluc3RlYWQgb2Ygd2FpdGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50Ci0rZnJhbWVidWZmZXIgdXBkYXRlIGNvbWluZyBpbi4gIEhlbHBzICdwaXBlbGluZScgdGhlIHVwZGF0ZXMuCi0rVGhpcyBpcyBjdXJyZW50bHkgdGhlIGRlZmF1bHQsIHVzZSBcZkItbm9waXBlbGluZVxmUiB0byBkaXNhYmxlLgotKy5UUAotK1xmQlwtYXBwc2hhcmVcZlIKLStFbmFibGUgZmVhdHVyZXMgZm9yIHVzZSB3aXRoIHgxMXZuYydzIFxmQlwtYXBwc2hhcmVcZlIgbW9kZSB3aGVyZQotK2luc3RlYWQgb2Ygc2hhcmluZyB0aGUgZnVsbCBkZXNrdG9wIG9ubHkgdGhlIGFwcGxpY2F0aW9uJ3MKLSt3aW5kb3dzIGFyZSBzaGFyZWQuICBWaWV3ZXIgbXVsdGlsaXN0ZW4gbW9kZSBpcyB1c2VkIHRvCi0rY3JlYXRlIHRoZSBtdWx0aXBsZSB3aW5kb3dzOiBcZkJcLW11bHRpbGlzdGVuXGZSIGlzIGltcGxpZWQuCi0rU2VlICd4MTF2bmMgXGZCXC1hcHBzaGFyZVxmUiBcZkJcLWhlbHBcZlInIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG1vZGUuCi0rRmVhdHVyZXMgZW5hYmxlZCBpbiB0aGUgdmlld2VyIHVuZGVyIFxmQlwtYXBwc2hhcmVcZlIgYXJlOgotK01pbmltdW0gZXh0cmEgdGV4dCBpbiB0aGUgdGl0bGUsIGF1dG8gXGZCXC15Y3JvcFxmUiBpcyBkaXNhYmxlZCwKLSt4MTF2bmMgXGZCXC1yZW1vdGVfcHJlZml4XGZSIFgxMVZOQ19BUFBTSEFSRV9DTUQ6IG1lc3NhZ2UgY2hhbm5lbCwKLSt4MTF2bmMgaW5pdGlhbCB3aW5kb3cgcG9zaXRpb24gaGludHMuICBTZWUgYWxzbyBFc2NhcGUgS2V5cwotK2JlbG93IGZvciBhZGRpdGlvbmFsIGtleSBhbmQgbW91c2UgYmluZGluZ3MuCi0rLlRQCi0rXGZCXC1lc2NhcGUgXGZSXGZJc3RyXGZSCi0rVGhpcyBzZXRzIHRoZSAnRXNjYXBlIEtleXMnIG1vZGlmaWVyIHNlcXVlbmNlIGFuZCBlbmFibGVzCi0rZXNjYXBlIGtleXMgbW9kZS4gIFdoZW4gdGhlIG1vZGlmaWVyIGtleXMgZXNjYXBlIHNlcXVlbmNlCi0raXMgaGVsZCBkb3duLCB0aGUgbmV4dCBrZXlzdHJva2UgaXMgaW50ZXJwcmV0ZWQgbG9jYWxseQotK3RvIHBlcmZvcm0gYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG8gdGhlCi0rcmVtb3RlIFZOQyBzZXJ2ZXIuCi0rCi0rVXNlICdcZkJcLWVzY2FwZVxmUiBkZWZhdWx0JyBmb3IgdGhlIGRlZmF1bHQgbW9kaWZpZXIgc2VxdWVuY2UuCi0rKFVuaXg6IEFsdF9MLFN1cGVyX0wgYW5kIE1hY09TWDogQ29udHJvbF9MLE1ldGFfTCkKLSsKLStIZXJlIGFyZSB0aGUgJ0VzY2FwZSBLZXlzOiBIZWxwK1NldCcgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFBvcHVwOgotKwotK0VzY2FwZSBLZXlzOiAgRW50ZXIgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2RpZmllciBrZXlzIHRvIGJlIHRoZSAnZXNjYXBlCi0rc2VxdWVuY2UnLiAgV2hlbiB0aGVzZSBrZXlzIGFyZSBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpcwotK2ludGVycHJldGVkIGxvY2FsbHkgdG8gaW52b2tlIGEgc3BlY2lhbCBhY3Rpb24gaW5zdGVhZCBvZiBiZWluZyBzZW50IHRvCi0rdGhlIHJlbW90ZSBWTkMgc2VydmVyLiAgSW4gb3RoZXIgd29yZHMsIGEgc2V0IG9mICdIb3QgS2V5cycuCi0rCi0rSGVyZSBpcyB0aGUgbGlzdCBvZiBsb2NhbCBrZXkgbWFwcGluZ3MgdG8gc3BlY2lhbCBhY3Rpb25zOgotKwotK3I6IHJlZnJlc2ggZGVza3RvcCAgYjogdG9nZ2xlIGJlbGwgIGM6IHRvZ2dsZSBmdWxsLWNvbG9yCi0rCi0rZjogZmlsZSB0cmFuc2ZlciAgICB4OiB4MTFjdXJzb3IgICAgejogdG9nZ2xlIFRpZ2h0L1pSTEUKLSsKLStsOiBmdWxsIHNjcmVlbiAgICAgIGc6IGdyYWJhbGwgICAgICBlOiBlc2NhcGUga2V5cyBkaWFsb2cKLSsKLStzOiBzY2FsZSBkaWFsb2cgICAgICs6IHNjYWxlIHVwICg9KSAtOiBzY2FsZSBkb3duIChfKQotKwotK3Q6IHRleHQgY2hhdCAgICAgICAgICAgICAgICAgICAgICAgIGE6IGFscGhhYmxlbmQgY3Vyc29yCi0rCi0rVjogdG9nZ2xlIHZpZXdvbmx5ICBROiBxdWl0IHZpZXdlciAgMTIzNDU2OiBVbHRyYVZOQyBzY2FsZSAxL24KLSsKLStBcnJvdyBrZXlzOiBwYW4gdGhlIHZpZXdwb3J0IGFib3V0IDEwJSBmb3IgZWFjaCBrZXlwcmVzcy4KLSsKLStQYWdlVXAvUGFnZURvd246IHBhbiB0aGUgdmlld3BvcnQgYnkgYSBzY3JlZW5mdWwgdmVydGljYWxseS4KLSsKLStIb21lL0VuZDogcGFuIHRoZSB2aWV3cG9ydCBieSBhIHNjcmVlbmZ1bCBob3Jpem9udGFsbHkuCi0rCi0rS2V5UGFkIEFycm93czogcGFuIHRoZSB2aWV3cG9ydCBieSAxIHBpeGVsIGZvciBlYWNoIGtleXByZXNzLgotKwotK0RyYWdnaW5nIHRoZSBNb3VzZSB3aXRoIEJ1dHRvbjEgcHJlc3NlZCBhbHNvIHBhbnMgdGhlIHZpZXdwb3J0LgotKwotK0NsaWNraW5nIE1vdXNlIEJ1dHRvbjMgYnJpbmdzIHVwIHRoZSBQb3B1cCBNZW51LgotKwotK1RoZSBhYm92ZSBtYXBwaW5ncyBhcmUgXGZCYWx3YXlzXGZSIGFjdGl2ZSBpbiBWaWV3T25seSBtb2RlLCB1bmxlc3MgeW91IHNldAotK3RoZSBFc2NhcGUgS2V5cyB2YWx1ZSB0byAnbmV2ZXInLgotKwotK3gxMXZuYyAtYXBwc2hhcmUgaG90LWtleXM6ICB4MTF2bmMgaGFzIGEgc2ltcGxlIGFwcGxpY2F0aW9uIHNoYXJpbmcgbW9kZQotK3RoYXQgZW5hYmxlcyB0aGUgdmlld2VyLXNpZGUgdG8gbW92ZSwgcmVzaXplLCBvciByYWlzZSB0aGUgcmVtb3RlIHRvcGxldmVsCi0rd2luZG93cy4gIFRvIGVuYWJsZSBpdCwgaG9sZCBkb3duIFNoaWZ0ICsgdGhlIEVzY2FwZSBLZXlzIGFuZCBwcmVzcyB0aGVzZToKLSsKLStBcnJvdyBrZXlzOiBtb3ZlIHRoZSByZW1vdGUgd2luZG93IGFyb3VuZCBpbiBpdHMgZGVza3RvcC4KLSsKLStQYWdlVXAvUGFnZURuL0hvbWUvRW5kOiAgcmVzaXplIHRoZSByZW1vdGUgd2luZG93LgotKwotKysvLTogcmFpc2Ugb3IgbG93ZXIgdGhlIHJlbW90ZSB3aW5kb3cuCi0rCi0rTSBvciBCdXR0b24xIG1vdmUgd2luIHRvIGxvY2FsIHBvc2l0aW9uOyAgRCBvciBCdXR0b24zOiBkZWxldGUgcmVtb3RlIHdpbi4KLSsKLStJZiB0aGUgRXNjYXBlIEtleXMgdmFsdWUgYmVsb3cgaXMgc2V0IHRvICdkZWZhdWx0JyB0aGVuIGEgZGVmYXVsdCBsaXN0IG9mCi0rb2YgbW9kaWZpZXIga2V5cyBpcyB1c2VkLiAgRm9yIFVuaXggaXQgaXM6IEFsdF9MLFN1cGVyX0wgYW5kIGZvciBNYWNPU1ggaXQKLStpcyBDb250cm9sX0wsTWV0YV9MLiAgTm90ZTogdGhlIFN1cGVyX0wga2V5IHVzdWFsbHkgaGFzIGEgV2luZG93cyhUTSkgRmxhZwotK29uIGl0LiAgQWxzbyBub3RlIHRoZSBfTCBhbmQgX1IgbWVhbiB0aGUga2V5IGlzIG9uIHRoZSBMRUZUIG9yIFJJR0hUIHNpZGUKLStvZiB0aGUga2V5Ym9hcmQuCi0rCi0rT24gVW5peCAgIHRoZSBkZWZhdWx0IGlzIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIExlZnQgc2lkZSBvZiBrZXlib2FyZC4KLStPbiBNYWNPU1ggdGhlIGRlZmF1bHQgaXMgQ29udHJvbCBhbmQgQ29tbWFuZCBrZXlzIG9uIExlZnQgc2lkZSBvZiBrZXlib2FyZC4KLSsKLStFeGFtcGxlOiBQcmVzcyBhbmQgaG9sZCB0aGUgQWx0IGFuZCBXaW5kb3dzIGtleXMgb24gdGhlIExFRlQgc2lkZSBvZiB0aGUKLStrZXlib2FyZCBhbmQgdGhlbiBwcmVzcyAnYycgdG8gdG9nZ2xlIHRoZSBmdWxsLWNvbG9yIHN0YXRlLiAgT3IgcHJlc3MgJ3QnCi0rdG8gdG9nZ2xlIHRoZSB1bHRyYXZuYyBUZXh0IENoYXQgd2luZG93LCBldGMuCi0rCi0rVG8gdXNlIHNvbWV0aGluZyBiZXNpZGVzIHRoZSBkZWZhdWx0LCBzdXBwbHkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCAob3IgYQotK3NpbmdsZSBvbmUpIGZyb206IFNoaWZ0X0wgU2hpZnRfUiBDb250cm9sX0wgQ29udHJvbF9SIEFsdF9MIEFsdF9SIE1ldGFfTAotK01ldGFfUiBTdXBlcl9MIFN1cGVyX1IgSHlwZXJfTCBIeXBlcl9SIG9yIE1vZGVfc3dpdGNoLgotKy5UUAotK1xmQiBOZXcgUG9wdXAgYWN0aW9uczpcZlIKLSsKLSsgVmlld09ubHk6ICAgICAgICAgICAgICAgIH4gLXZpZXdvbmx5Ci0rIERpc2FibGUgQmVsbDogICAgICAgICAgICB+IC1ub2JlbGwKLSsgQ3Vyc29yIFNoYXBlOiAgICAgICAgICAgIH4gLW5vY3Vyc29yc2hhcGUKLSsgWDExIEN1cnNvcjogICAgICAgICAgICAgIH4gLXgxMWN1cnNvcgotKyBDdXJzb3IgQWxwaGFibGVuZDogICAgICAgfiAtYWxwaGEKLSsgVG9nZ2xlIFRpZ2h0L0hleHRpbGU6ICAgIH4gLWVuY29kaW5ncyBoZXh0aWxlLi4uCi0rIFRvZ2dsZSBUaWdodC9aUkxFOiAgICAgICB+IC1lbmNvZGluZ3MgenJsZS4uLgotKyBUb2dnbGUgWlJMRS9aWVdSTEU6ICAgICAgfiAtZW5jb2RpbmdzIHp5d3JsZS4uLgotKyBRdWFsaXR5IExldmVsICAgICAgICAgICAgfiAtcXVhbGl0eSAoYm90aCBUaWdodCBhbmQgWllXUkxFKQotKyBDb21wcmVzcyBMZXZlbCAgICAgICAgICAgfiAtY29tcHJlc3NsZXZlbAotKyBEaXNhYmxlIEpQRUc6ICAgICAgICAgICAgfiAtbm9qcGVnICAoVGlnaHQpCi0rIFBpcGVsaW5lIFVwZGF0ZXMgICAgICAgICB+IC1waXBlbGluZQotKwotKyBGdWxsIENvbG9yICAgICAgICAgICAgICAgICBhcyBtYW55IGNvbG9ycyBhcyBsb2NhbCBzY3JlZW4gYWxsb3dzLgotKyBHcmV5IHNjYWxlICgxNiAmIDgtYnBwKSAgfiAtZ3JleSwgZm9yIGxvdyBjb2xvcnMgMTYvOGJwcCBtb2RlcyBvbmx5LgotKyAxNiBiaXQgY29sb3IgKEJHUjU2NSkgICAgfiAtMTZicHAgLyAtYmdyNTY1Ci0rIDggIGJpdCBjb2xvciAoQkdSMjMzKSAgICB+IC1iZ3IyMzMKLSsgMjU2IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjIzMyBkZWZhdWx0ICMgb2YgY29sb3JzLgotKyAgNjQgY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMjIyIC8gLXVzZTY0Ci0rICAgOCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IxMTEgLyAtdXNlOAotKyBTY2FsZSBWaWV3ZXIgICAgICAgICAgICAgfiAtc2NhbGUKLSsgRXNjYXBlIEtleXM6IFRvZ2dsZSAgICAgIH4gLWVzY2FwZQotKyBFc2NhcGUgS2V5czogSGVscCtTZXQgICAgfiAtZXNjYXBlCi0rIFNldCBZIENyb3AgKHktbWF4KSAgICAgICB+IC15Y3JvcAotKyBTZXQgU2Nyb2xsYmFyIFdpZHRoICAgICAgfiAtc2J3aWR0aAotKyBYR3JhYlNlcnZlciAgICAgICAgICAgICAgfiAtZ3JhYmFsbAotKwotKyBVbHRyYVZOQyBFeHRlbnNpb25zOgotKwotKyAgIFNldCAxL24gU2VydmVyIFNjYWxlICAgICBVbHRyYXZuYyBleHQuIFNjYWxlIGRlc2t0b3AgYnkgMS9uLgotKyAgIFRleHQgQ2hhdCAgICAgICAgICAgICAgICBVbHRyYXZuYyBleHQuIERvIFRleHQgQ2hhdC4KLSsgICBGaWxlIFRyYW5zZmVyICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBGaWxlIHhmZXIgdmlhIEphdmEgaGVscGVyLgotKyAgIFNpbmdsZSBXaW5kb3cgICAgICAgICAgICBVbHRyYXZuYyBleHQuIEdyYWIgYW5kIHZpZXcgYSBzaW5nbGUgd2luZG93LgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0IHRoZW4gY2xpY2sgb24gdGhlIHdpbmRvdyB5b3Ugd2FudCkuCi0rICAgRGlzYWJsZSBSZW1vdGUgSW5wdXQgICAgIFVsdHJhdm5jIGV4dC4gVHJ5IHRvIHByZXZlbnQgaW5wdXQgYW5kCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdpbmcgb2YgbW9uaXRvciBhdCBwaHlzaWNhbCBkaXNwbGF5LgotKwotKyBOb3RlOiB0aGUgVWx0cmF2bmMgZXh0ZW5zaW9ucyBvbmx5IGFwcGx5IHRvIHNlcnZlcnMgdGhhdCBzdXBwb3J0Ci0rICAgICAgIHRoZW0uICB4MTF2bmMvbGlidm5jc2VydmVyIHN1cHBvcnRzIHNvbWUgb2YgdGhlbS4KLSsKLSsgU2VuZCBDbGlwYm9hcmQgbm90IFByaW1hcnkgIH4gLXNlbmRjbGlwYm9hcmQKLSsgU2VuZCBTZWxlY3Rpb24gRXZlcnkgdGltZSAgIH4gLXNlbmRhbHdheXMKLSsKLSAuU0ggRU5DT0RJTkdTCi0gVGhlIHNlcnZlciBzdXBwbGllcyBpbmZvcm1hdGlvbiBpbiB3aGF0ZXZlciBmb3JtYXQgaXMgZGVzaXJlZCBieSB0aGUKLSBjbGllbnQsIGluIG9yZGVyIHRvIG1ha2UgdGhlIGNsaWVudCBhcyBlYXN5IGFzIHBvc3NpYmxlIHRvIGltcGxlbWVudC4gCi1AQCAtMjM4LDYgKzY3MywxNSBAQAotIFwtcXVhbGl0eSBhbmQgXC1ub2pwZWcgb3B0aW9ucyBhYm92ZSkuIFRpZ2h0IGVuY29kaW5nIGlzIHVzdWFsbHkgdGhlCi0gYmVzdCBjaG9pY2UgZm9yIGxvd1wtYmFuZHdpZHRoIG5ldHdvcmsgZW52aXJvbm1lbnRzIChlLmcuIHNsb3cgbW9kZW0KLSBjb25uZWN0aW9ucykuCi0rLlRQCi0rLkIgWlJMRQotK1RoZSBTU1ZOQyB2aWV3ZXIgaGFzIHBvcnRlZCB0aGUgUmVhbFZOQyAod3d3LnJlYWx2bmMuY29tKSBaUkxFIGVuY29kaW5nCi0rdG8gdGhlIHVuaXggdGlnaHR2bmMgdmlld2VyLgotKy5UUAotKy5CIFpZV1JMRQotK1RoZSBTU1ZOQyB2aWV3ZXIgaGFzIHBvcnRlZCB0aGUgSGl0YWNoaSBsb3NzeSB3YXZlbGV0IGJhc2VkIFpSTEUKLStlbmNvZGluZyBmcm9tIGh0dHA6Ly9tb2JpbGUuaGl0YWNoaS1zeXN0ZW0uY28uanAvcHVibGljYXRpb25zL1pZV1JMRS8gCi0rdG8gdGhlIHVuaXggdGlnaHR2bmMgdmlld2VyLgotIC5TSCBSRVNPVVJDRVMKLSBYIHJlc291cmNlcyB0aGF0IFxmQnZuY3ZpZXdlclxmUiBrbm93cyBhYm91dCwgYXNpZGUgZnJvbSB0aGUKLSBub3JtYWwgWHQgcmVzb3VyY2VzLCBhcmUgYXMgZm9sbG93czoKLUBAIC0zNjQsMTIgKzgwOCwxMyBAQAotIC5CICVSCi0gcmVtb3RlIFRDUCBwb3J0IG51bWJlci4KLSAuU0ggU0VFIEFMU08KLS1cZkJ2bmNzZXJ2ZXJcZlIoMSksIFxmQlh2bmNcZlIoMSksIFxmQnZuY3Bhc3N3ZFxmUigxKSwKLS1cZkJ2bmNjb25uZWN0XGZSKDEpLCBcZkJzc2hcZlIoMSkKLStcZkJ2bmNzZXJ2ZXJcZlIoMSksIFxmQngxMXZuY1xmUigxKSwgXGZCc3N2bmNcZlIoMSksIFxmQlh2bmNcZlIoMSksIFxmQnZuY3Bhc3N3ZFxmUigxKSwKLStcZkJ2bmNjb25uZWN0XGZSKDEpLCBcZkJzc2hcZlIoMSksIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMsIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvc3N2bmMuaHRtbAotIC5TSCBBVVRIT1JTCi0gT3JpZ2luYWwgVk5DIHdhcyBkZXZlbG9wZWQgaW4gQVQmVCBMYWJvcmF0b3JpZXMgQ2FtYnJpZGdlLiBUaWdodFZOQwotIGFkZGl0aW9ucyB3YXMgaW1wbGVtZW50ZWQgYnkgQ29uc3RhbnRpbiBLYXBsaW5za3kuIE1hbnkgb3RoZXIgcGVvcGxlCi0tcGFydGljaXBhdGVkIGluIGRldmVsb3BtZW50LCB0ZXN0aW5nIGFuZCBzdXBwb3J0LgotK3BhcnRpY2lwYXRlZCBpbiBkZXZlbG9wbWVudCwgdGVzdGluZyBhbmQgc3VwcG9ydC4gIEthcmwgSi4gUnVuZ2UgCi0rYWRkZWQgYWxsIG9mIHRoZSBTU1ZOQyByZWxhdGVkIGZlYXR1cmVzIGFuZCBpbXByb3ZlbWVudHMuCi0gCi0gXGZCTWFuIHBhZ2UgYXV0aG9yczpcZlIKLSAuYnIKLUBAIC0zODAsMyArODI1LDUgQEAKLSBUaW0gV2F1Z2ggPHR3YXVnaEByZWRoYXQuY29tPiwKLSAuYnIKLSBDb25zdGFudGluIEthcGxpbnNreSA8Y29uc3RAY2UuY2N0cHUuZWR1LnJ1PgotKy5icgotK0thcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci96cmxlLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3pybGUuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGUuYwkyMDA3LTAyLTA0IDE4OjU5OjUwLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci96cmxlLmMJMjAxMC0wMi0yNSAyMzoyNDoyOC4wMDAwMDAwMDAgLTA1MDAKLUBAIC0wLDAgKzEsNjIwIEBACi0rLyoKLSsgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEpvaGFubmVzIEUuIFNjaGluZGVsaW4uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKyAqCi0rICogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKyAqCi0rICogIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKyAqCi0rICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCi0rICogIFVTQS4KLSsgKi8KLSsKLSsvKgotKyAqIHpybGUuYyAtIGhhbmRsZSB6cmxlIGVuY29kaW5nLgotKyAqCi0rICogVGhpcyBmaWxlIHNob3VsZG4ndCBiZSBjb21waWxlZCBkaXJlY3RseS4gIEl0IGlzIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzIGJ5Ci0rICogcmZicHJvdG8uYywgZWFjaCB0aW1lIHdpdGggYSBkaWZmZXJlbnQgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gQlBQLiAgRm9yCi0rICogZWFjaCB2YWx1ZSBvZiBCUFAsIHRoaXMgZmlsZSBkZWZpbmVzIGEgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyBhbiB6cmxlCi0rICogZW5jb2RlZCByZWN0YW5nbGUgd2l0aCBCUFAgYml0cyBwZXIgcGl4ZWwuCi0rICovCi0rCi0rI2lmbmRlZiBSRUFMQlBQCi0rI2RlZmluZSBSRUFMQlBQIEJQUAotKyNlbmRpZgotKwotKyNpZiAhZGVmaW5lZChVTkNPTVApIHx8IFVOQ09NUD09MAotKyNkZWZpbmUgSGFuZGxlWlJMRSBDT05DQVQyRShIYW5kbGVaUkxFLFJFQUxCUFApCi0rI2RlZmluZSBIYW5kbGVaUkxFVGlsZSBDT05DQVQyRShIYW5kbGVaUkxFVGlsZSxSRUFMQlBQKQotKyNlbGlmIFVOQ09NUD4wCi0rI2RlZmluZSBIYW5kbGVaUkxFIENPTkNBVDNFKEhhbmRsZVpSTEUsUkVBTEJQUCxEb3duKQotKyNkZWZpbmUgSGFuZGxlWlJMRVRpbGUgQ09OQ0FUM0UoSGFuZGxlWlJMRVRpbGUsUkVBTEJQUCxEb3duKQotKyNlbHNlCi0rI2RlZmluZSBIYW5kbGVaUkxFIENPTkNBVDNFKEhhbmRsZVpSTEUsUkVBTEJQUCxVcCkKLSsjZGVmaW5lIEhhbmRsZVpSTEVUaWxlIENPTkNBVDNFKEhhbmRsZVpSTEVUaWxlLFJFQUxCUFAsVXApCi0rI2VuZGlmCi0rI3VuZGVmIENBUkRCUFAKLSsjdW5kZWYgQ0FSRFJFQUxCUFAKLSsjZGVmaW5lIENBUkRCUFAgQ09OQ0FUMkUoQ0FSRCwgQlBQKQotKyNkZWZpbmUgQ0FSRFJFQUxCUFAgQ09OQ0FUMkUoQ0FSRCxSRUFMQlBQKQotKwotKyNkZWZpbmUgRmlsbFJlY3RhbmdsZSh4LCB5LCB3LCBoLCBjb2xvcikgIFwKLSsJeyBcCi0rCQlYR0NWYWx1ZXMgX2djdjsgXAotKwkJX2djdi5mb3JlZ3JvdW5kID0gY29sb3I7IFwKLSsJCWlmICghYXBwRGF0YS51c2VYc2VydmVyQmFja2luZ1N0b3JlKSB7IFwKLSsJCQlGaWxsU2NyZWVuKHgsIHksIHcsIGgsIF9nY3YuZm9yZWdyb3VuZCk7IFwKLSsJCX0gZWxzZSB7IFwKLSsJCQlYQ2hhbmdlR0MoZHB5LCBnYywgR0NGb3JlZ3JvdW5kLCAmX2djdik7IFwKLSsJCQlYRmlsbFJlY3RhbmdsZShkcHksIGRlc2t0b3BXaW4sIGdjLCB4LCB5LCB3LCBoKTsgXAotKwkJfSBcCi0rCX0KLSsKLSsjaWYgZGVmaW5lZChfX3NwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fUE9XRVJQQ19fKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKF9CSUdfRU5ESUFOKQotKyNkZWZpbmUgSVNfQklHX0VORElBTiAxCi0rI2Vsc2UKLSsjZGVmaW5lIElTX0JJR19FTkRJQU4gMAotKyNlbmRpZgotKwotKyNpZiBET19aWVdSTEUKLSsKLSsjZGVmaW5lIEVORElBTl9MSVRUTEUgMAotKyNkZWZpbmUgRU5ESUFOX0JJRyAxCi0rI2RlZmluZSBFTkRJQU5fTk8gMgotKyNpZiBJU19CSUdfRU5ESUFOCi0rI2RlZmluZSBaWVdSTEVfRU5ESUFOIEVORElBTl9CSUcKLSsjZWxzZQotKyNkZWZpbmUgWllXUkxFX0VORElBTiBFTkRJQU5fTElUVExFCi0rI2VuZGlmCi0rI3VuZGVmIEVORF9GSVgKLSsjaWYgWllXUkxFX0VORElBTiA9PSBFTkRJQU5fTElUVExFCi0rIyAgZGVmaW5lIEVORF9GSVggTEUKLSsjZWxpZiBaWVdSTEVfRU5ESUFOID09IEVORElBTl9CSUcKLSsjICBkZWZpbmUgRU5EX0ZJWCBCRQotKyNlbHNlCi0rIyAgZGVmaW5lIEVORF9GSVggTkUKLSsjZW5kaWYKLSsjZGVmaW5lIF9fUkZCX0NPTkNBVDNFKGEsYixjKSBDT05DQVQzRShhLGIsYykKLSsjZGVmaW5lIF9fUkZCX0NPTkNBVDJFKGEsYikgQ09OQ0FUMkUoYSxiKQotKyN1bmRlZiBDUElYRUwKLSsjaWYgUkVBTEJQUCAhPSBCUFAKLSsjaWYgVU5DT01QID09IDAKLSsjZGVmaW5lIENQSVhFTCBSRUFMQlBQCi0rI2VsaWYgVU5DT01QPjAKLSsjZGVmaW5lIENQSVhFTCBDT05DQVQyRShSRUFMQlBQLERvd24pCi0rI2Vsc2UKLSsjZGVmaW5lIENQSVhFTCBDT05DQVQyRShSRUFMQlBQLFVwKQotKyNlbmRpZgotKyNlbmRpZgotKyNkZWZpbmUgUElYRUxfVCBDQVJEQlBQCi0rI2lmIEJQUCE9OAotKyNkZWZpbmUgWllXUkxFX0RFQ09ERSAxCi0rI2luY2x1ZGUgInp5d3JsZXRlbXBsYXRlLmMiCi0rI2VuZGlmCi0rI3VuZGVmIENQSVhFTAotKwotKyNlbmRpZgkvKiBET19aWVdSTEUgKi8KLSsKLStzdGF0aWMgaW50IEhhbmRsZVpSTEVUaWxlKAotKwl1bnNpZ25lZCBjaGFyKiBidWZmZXIsc2l6ZV90IGJ1ZmZlcl9sZW5ndGgsCi0rCWludCB4LGludCB5LGludCB3LGludCBoKTsKLSsKLStzdGF0aWMgQm9vbAotK0hhbmRsZVpSTEUgKGludCByeCwgaW50IHJ5LCBpbnQgcncsIGludCByaCkKLSt7Ci0rCXJmYlpSTEVIZWFkZXIgaGVhZGVyOwotKwlpbnQgcmVtYWluaW5nOwotKwlpbnQgaW5mbGF0ZVJlc3VsdDsKLSsJaW50IHRvUmVhZDsKLSsJaW50IG1pbl9idWZmZXJfc2l6ZSA9IHJ3ICogcmggKiAoUkVBTEJQUCAvIDgpICogMjsKLSsKLSsJLyogRmlyc3QgbWFrZSBzdXJlIHdlIGhhdmUgYSBsYXJnZSBlbm91Z2ggcmF3IGJ1ZmZlciB0byBob2xkIHRoZQotKwkgKiBkZWNvbXByZXNzZWQgZGF0YS4gIEluIHByYWN0aWNlLCB3aXRoIGEgZml4ZWQgUkVBTEJQUCwgZml4ZWQgZnJhbWUKLSsJICogYnVmZmVyIHNpemUgYW5kIHRoZSBmaXJzdCB1cGRhdGUgY29udGFpbmluZyB0aGUgZW50aXJlIGZyYW1lCi0rCSAqIGJ1ZmZlciwgdGhpcyBidWZmZXIgYWxsb2NhdGlvbiBzaG91bGQgb25seSBoYXBwZW4gb25jZSwgb24gdGhlCi0rCSAqIGZpcnN0IHVwZGF0ZS4KLSsJICovCi0rCWlmICggcmF3X2J1ZmZlcl9zaXplIDwgbWluX2J1ZmZlcl9zaXplKSB7Ci0rCi0rCQlpZiAoIHJhd19idWZmZXIgIT0gTlVMTCApIHsKLSsKLSsJCQlmcmVlKCByYXdfYnVmZmVyICk7Ci0rCi0rCQl9Ci0rCi0rCQlyYXdfYnVmZmVyX3NpemUgPSBtaW5fYnVmZmVyX3NpemU7Ci0rCQlyYXdfYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MoIHJhd19idWZmZXJfc2l6ZSApOwotKwotKwl9Ci0rCi0rCWlmICghUmVhZEZyb21SRkJTZXJ2ZXIoKGNoYXIgKikmaGVhZGVyLCBzel9yZmJaUkxFSGVhZGVyKSkKLSsJCXJldHVybiBGYWxzZTsKLSsKLSsJcmVtYWluaW5nID0gU3dhcDMySWZMRShoZWFkZXIubGVuZ3RoKTsKLSsKLSsJLyogTmVlZCB0byBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzb3Igc3RhdGUuICovCi0rCWRlY29tcFN0cmVhbS5uZXh0X2luICAgPSAoIEJ5dGVmICogKWJ1ZmZlcjsKLSsJZGVjb21wU3RyZWFtLmF2YWlsX2luICA9IDA7Ci0rCWRlY29tcFN0cmVhbS5uZXh0X291dCAgPSAoIEJ5dGVmICogKXJhd19idWZmZXI7Ci0rCWRlY29tcFN0cmVhbS5hdmFpbF9vdXQgPSByYXdfYnVmZmVyX3NpemU7Ci0rCWRlY29tcFN0cmVhbS5kYXRhX3R5cGUgPSBaX0JJTkFSWTsKLSsKLSsJLyogSW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc2lvbiBzdHJlYW0gc3RydWN0dXJlcyBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gKi8KLSsJaWYgKCBkZWNvbXBTdHJlYW1Jbml0ZWQgPT0gRmFsc2UgKSB7Ci0rCi0rCQlpbmZsYXRlUmVzdWx0ID0gaW5mbGF0ZUluaXQoICZkZWNvbXBTdHJlYW0gKTsKLSsKLSsJCWlmICggaW5mbGF0ZVJlc3VsdCAhPSBaX09LICkgewotKwkJCWZwcmludGYoc3RkZXJyLCAKLSsJCQkJCSJpbmZsYXRlSW5pdCByZXR1cm5lZCBlcnJvcjogJWQsIG1zZzogJXNcbiIsCi0rCQkJCQlpbmZsYXRlUmVzdWx0LAotKwkJCQkJZGVjb21wU3RyZWFtLm1zZyk7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwotKwkJZGVjb21wU3RyZWFtSW5pdGVkID0gVHJ1ZTsKLSsKLSsJfQotKwotKwlpbmZsYXRlUmVzdWx0ID0gWl9PSzsKLSsKLSsJLyogUHJvY2VzcyBidWZmZXIgZnVsbCBvZiBkYXRhIHVudGlsIG5vIG1vcmUgdG8gcHJvY2Vzcywgb3IKLSsJICogc29tZSB0eXBlIG9mIGluZmxhdGVyIGVycm9yLCBvciBaX1NUUkVBTV9FTkQuCi0rCSAqLwotKwl3aGlsZSAoKCByZW1haW5pbmcgPiAwICkgJiYKLSsJCQkoIGluZmxhdGVSZXN1bHQgPT0gWl9PSyApKSB7Ci0rCi0rCQlpZiAoIHJlbWFpbmluZyA+IEJVRkZFUl9TSVpFICkgewotKwkJCXRvUmVhZCA9IEJVRkZFUl9TSVpFOwotKwkJfQotKwkJZWxzZSB7Ci0rCQkJdG9SZWFkID0gcmVtYWluaW5nOwotKwkJfQotKwotKwkJLyogRmlsbCB0aGUgYnVmZmVyLCBvYnRhaW5pbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuICovCi0rCQlpZiAoIVJlYWRGcm9tUkZCU2VydmVyKGJ1ZmZlcix0b1JlYWQpKQotKwkJCXJldHVybiBGYWxzZTsKLSsKLSsJCWRlY29tcFN0cmVhbS5uZXh0X2luICA9ICggQnl0ZWYgKiApYnVmZmVyOwotKwkJZGVjb21wU3RyZWFtLmF2YWlsX2luID0gdG9SZWFkOwotKwotKwkJLyogTmVlZCB0byB1bmNvbXByZXNzIGJ1ZmZlciBmdWxsLiAqLwotKwkJaW5mbGF0ZVJlc3VsdCA9IGluZmxhdGUoICZkZWNvbXBTdHJlYW0sIFpfU1lOQ19GTFVTSCApOwotKwotKwkJLyogV2UgbmV2ZXIgc3VwcGx5IGEgZGljdGlvbmFyeSBmb3IgY29tcHJlc3Npb24uICovCi0rCQlpZiAoIGluZmxhdGVSZXN1bHQgPT0gWl9ORUVEX0RJQ1QgKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJ6bGliIGluZmxhdGUgbmVlZHMgYSBkaWN0aW9uYXJ5IVxuIik7Ci0rCQkJcmV0dXJuIEZhbHNlOwotKwkJfQotKwkJaWYgKCBpbmZsYXRlUmVzdWx0IDwgMCApIHsKLSsJCQlmcHJpbnRmKHN0ZGVyciwgCi0rCQkJCQkiemxpYiBpbmZsYXRlIHJldHVybmVkIGVycm9yOiAlZCwgbXNnOiAlc1xuIiwKLSsJCQkJCWluZmxhdGVSZXN1bHQsCi0rCQkJCQlkZWNvbXBTdHJlYW0ubXNnKTsKLSsJCQlyZXR1cm4gRmFsc2U7Ci0rCQl9Ci0rCi0rCQkvKiBSZXN1bHQgYnVmZmVyIGFsbG9jYXRlZCB0byBiZSBhdCBsZWFzdCBsYXJnZSBlbm91Z2guICBXZSBzaG91bGQKLSsJCSAqIG5ldmVyIHJ1biBvdXQgb2Ygc3BhY2UhCi0rCQkgKi8KLSsJCWlmICgoIGRlY29tcFN0cmVhbS5hdmFpbF9pbiA+IDAgKSAmJgotKwkJCQkoIGRlY29tcFN0cmVhbS5hdmFpbF9vdXQgPD0gMCApKSB7Ci0rCQkJZnByaW50ZihzdGRlcnIsICJ6bGliIGluZmxhdGUgcmFuIG91dCBvZiBzcGFjZSFcbiIpOwotKwkJCXJldHVybiBGYWxzZTsKLSsJCX0KLSsKLSsJCXJlbWFpbmluZyAtPSB0b1JlYWQ7Ci0rCi0rCX0gLyogd2hpbGUgKCByZW1haW5pbmcgPiAwICkgKi8KLSsKLSsJaWYgKCBpbmZsYXRlUmVzdWx0ID09IFpfT0sgKSB7Ci0rCQl2b2lkKiBidWY9cmF3X2J1ZmZlcjsKLSsJCWludCBpLGo7Ci0rCi0rCQlyZW1haW5pbmcgPSByYXdfYnVmZmVyX3NpemUtZGVjb21wU3RyZWFtLmF2YWlsX291dDsKLSsKLSsJCWZvcihqPTA7IGo8cmg7IGorPXJmYlpSTEVUaWxlSGVpZ2h0KQotKwkJCWZvcihpPTA7IGk8cnc7IGkrPXJmYlpSTEVUaWxlV2lkdGgpIHsKLSsJCQkJaW50IHN1YldpZHRoPShpK3JmYlpSTEVUaWxlV2lkdGg+cncpP3J3LWk6cmZiWlJMRVRpbGVXaWR0aDsKLSsJCQkJaW50IHN1YkhlaWdodD0oaityZmJaUkxFVGlsZUhlaWdodD5yaCk/cmgtajpyZmJaUkxFVGlsZUhlaWdodDsKLSsJCQkJaW50IHJlc3VsdD1IYW5kbGVaUkxFVGlsZShidWYscmVtYWluaW5nLHJ4K2kscnkraixzdWJXaWR0aCxzdWJIZWlnaHQpOwotKwotKwkJCQlpZihyZXN1bHQ8MCkgewotKwkJCQkJZnByaW50ZihzdGRlcnIsICJaUkxFIGRlY29kaW5nIGZhaWxlZCAoJWQpXG4iLHJlc3VsdCk7Ci0rcmV0dXJuIFRydWU7Ci0rCQkJCQlyZXR1cm4gRmFsc2U7Ci0rCQkJCX0KLSsKLSsJCQkJYnVmKz1yZXN1bHQ7Ci0rCQkJCXJlbWFpbmluZy09cmVzdWx0OwotKwkJCX0KLSsJfQotKwllbHNlIHsKLSsKLSsJCWZwcmludGYoc3RkZXJyLCAKLSsJCQkJInpsaWIgaW5mbGF0ZSByZXR1cm5lZCBlcnJvcjogJWQsIG1zZzogJXNcbiIsCi0rCQkJCWluZmxhdGVSZXN1bHQsCi0rCQkJCWRlY29tcFN0cmVhbS5tc2cpOwotKwkJcmV0dXJuIEZhbHNlOwotKwotKwl9Ci0rCi0rCXJldHVybiBUcnVlOwotK30KLSsKLSsjaWYgUkVBTEJQUCE9QlBQICYmIGRlZmluZWQoVU5DT01QKSAmJiBVTkNPTVAhPTAKLSsjIGlmIEJQUCA9PSAzMiAmJiBJU19CSUdfRU5ESUFOCi0rIyAgZGVmaW5lIFVuY29tcHJlc3NDUGl4ZWwocCkgKCAoKnAgPDwgbXlGb3JtYXQucmVkU2hpZnQpIHwgKCoocCsxKSA8PCBteUZvcm1hdC5ncmVlblNoaWZ0KSB8ICgqKHArMikgPDwgbXlGb3JtYXQuYmx1ZVNoaWZ0KSApCi0rIyBlbHNlCi0rIyAgaWYgVU5DT01QPjAKLSsjICAgZGVmaW5lIFVuY29tcHJlc3NDUGl4ZWwocG9pbnRlcikgKCgqKENBUkRCUFAqKXBvaW50ZXIpPj5VTkNPTVApCi0rIyAgZWxzZQotKyMgICBkZWZpbmUgVW5jb21wcmVzc0NQaXhlbChwb2ludGVyKSAoKCooQ0FSREJQUCopcG9pbnRlcik8PCgtKFVOQ09NUCkpKQotKyMgIGVuZGlmCi0rIyBlbmRpZgotKyNlbHNlCi0rIyBkZWZpbmUgVW5jb21wcmVzc0NQaXhlbChwb2ludGVyKSAoKihDQVJEQlBQKilwb2ludGVyKQotKyNlbmRpZgotKwotK2V4dGVybiBYSW1hZ2UgKmltYWdlOwotK2V4dGVybiBYSW1hZ2UgKmltYWdlX3NjYWxlOwotK2V4dGVybiBpbnQgc2tpcF9tYXliZV9zeW5jOwotKwotK3N0YXRpYyBpbnQgSGFuZGxlWlJMRVRpbGUoCi0rCQl1bnNpZ25lZCBjaGFyKiBidWZmZXIsc2l6ZV90IGJ1ZmZlcl9sZW5ndGgsCi0rCQlpbnQgeCxpbnQgeSxpbnQgdyxpbnQgaCkgewotKwl1bnNpZ25lZCBjaGFyKiBidWZmZXJfY29weSA9IGJ1ZmZlcjsKLSsJdW5zaWduZWQgY2hhciogYnVmZmVyX2VuZCA9IGJ1ZmZlcitidWZmZXJfbGVuZ3RoOwotKwl1bnNpZ25lZCBjaGFyIHR5cGU7Ci0rCi0rCWlmKGJ1ZmZlcl9sZW5ndGg8MSkKLSsJCXJldHVybiAtMjsKLSsKLSsJaWYgKGZyYW1lQnVmZmVyTGVuIDwgdyAqIGggKiBCUFAvOCkgewotKwkJaWYoZnJhbWVCdWZmZXIpIHsKLSsJCQlmcmVlKGZyYW1lQnVmZmVyKTsKLSsJCX0KLSsJCWZyYW1lQnVmZmVyTGVuID0gdyAqIGggKiBCUFAvOCAqIDI7Ci0rCQlmcmFtZUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhmcmFtZUJ1ZmZlckxlbik7Ci0rCX0KLSsKLSt6eXdybGVfdG9wOgotKwl0eXBlID0gKmJ1ZmZlcjsKLSsJYnVmZmVyKys7Ci0rCXN3aXRjaCh0eXBlKSB7Ci0rCQljYXNlIDA6IC8qIHJhdyAqLwotKwkJewotKyNpZiBET19aWVdSTEUgJiYgQlBQICE9IDgKLSsJCSAgICBpZiAoenl3cmxlX2xldmVsID4gMCAmJiAhKHp5d3JsZV9sZXZlbCAmIDB4ODApICkgewotKwkJCXp5d3JsZV9sZXZlbCB8PSAweDgwOwotKwkJCWdvdG8genl3cmxlX3RvcDsKLSsJCSAgICB9IGVsc2UKLSsjZW5kaWYKLSsJCSAgICB7Ci0rI2lmIFJFQUxCUFAhPUJQUAotKwkJCWludCBtMCA9IDAsIGksajsKLSsKLSsKLSsJCQlpZigxK3cqaCpSRUFMQlBQLzg+YnVmZmVyX2xlbmd0aCkgewotKwkJCQlmcHJpbnRmKHN0ZGVyciwgImV4cGVjdGVkICVkIGJ5dGVzLCBnb3Qgb25seSAlZCAoJWR4JWQpXG4iLDErdypoKlJFQUxCUFAvOCxidWZmZXJfbGVuZ3RoLHcsaCk7Ci0rCQkJCXJldHVybiAtMzsKLSsJCQl9Ci0rCi0rCQkJZm9yKGo9eSpzaS5mcmFtZWJ1ZmZlcldpZHRoOyBqPCh5K2gpKnNpLmZyYW1lYnVmZmVyV2lkdGg7IGorPXNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCQkJZm9yKGk9eDsgaTx4K3c7IGkrKyxidWZmZXIrPVJFQUxCUFAvOCkgewotKyMgIGlmIDAKLSsJCQkJCSgoQ0FSREJQUCopZnJhbWVCdWZmZXIpW2oraV0gPSBVbmNvbXByZXNzQ1BpeGVsKGJ1ZmZlcik7Ci0rCQkJCQkvKiBhbHQgKi8KLSsJCQkJCUNBUkRCUFAgY29sb3IgPSBVbmNvbXByZXNzQ1BpeGVsKGJ1ZmZlcik7Ci0rCQkJCQlDb3B5RGF0YVRvU2NyZWVuKChjaGFyICopJmNvbG9yLCBpLCBqL3NpLmZyYW1lYnVmZmVyV2lkdGgsIDEsIDEpOwotKyMgIGVsc2UKLSsJCQkJCSgoQ0FSREJQUCopZnJhbWVCdWZmZXIpW20wKytdID0gVW5jb21wcmVzc0NQaXhlbChidWZmZXIpOwotKyMgIGVuZGlmCi0rCQkJCX0KLSsJCQl9Ci0rCQkJQ29weURhdGFUb1NjcmVlbigoY2hhciAqKWZyYW1lQnVmZmVyLCB4LCB5LCB3LCBoKTsKLStpZiAoMCkgZnByaW50ZihzdGRlcnIsICJjaGExOiAlZHglZCslZCslZFxuIiwgdywgaCwgeCwgeSk7Ci0rCi0rI2Vsc2UKLSsjICBpZiAwCi0rCQkJQ29weVJlY3RhbmdsZShidWZmZXIsIHgsIHksIHcsIGgpOwotKyMgIGVsc2UKLSsJCQlDb3B5RGF0YVRvU2NyZWVuKChjaGFyICopYnVmZmVyLCB4LCB5LCB3LCBoKTsKLSsjICBlbmRpZgotKwkJCWJ1ZmZlcis9dypoKlJFQUxCUFAvODsKLSsjZW5kaWYKLSsJCSAgICB9Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCQljYXNlIDE6IC8qIHNvbGlkICovCi0rCQl7Ci0rCQkJQ0FSREJQUCBjb2xvciA9IFVuY29tcHJlc3NDUGl4ZWwoYnVmZmVyKTsKLSsKLSsJCQlpZigxK1JFQUxCUFAvOD5idWZmZXJfbGVuZ3RoKQotKwkJCQlyZXR1cm4gLTQ7Ci0rCQkJCQotKwkJCWlmICgoQlBQID09IDggJiYgYXBwRGF0YS51c2VCR1IyMzMpIHx8IChCUFAgPT0gMTYgJiYgYXBwRGF0YS51c2VCR1I1NjUpKSB7Ci0rCQkJCWludCBtMDsKLSsJCQkJZm9yIChtMD0wOyBtMCA8IHcqaDsgbTArKykgewotKwkJCQkJKChDQVJEQlBQKilmcmFtZUJ1ZmZlcilbbTBdID0gY29sb3I7Ci0rCQkJCX0KLSsJCQkJQ29weURhdGFUb1NjcmVlbigoY2hhciAqKWZyYW1lQnVmZmVyLCB4LCB5LCB3LCBoKTsKLSsJCQl9IGVsc2UgewotKwkJCQlGaWxsUmVjdGFuZ2xlKHgsIHksIHcsIGgsIGNvbG9yKTsKLSsJCQl9Ci0raWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hhMjogJWR4JWQrJWQrJWRcbiIsIHcsIGgsIHgsIHkpOwotKwotKwkJCWJ1ZmZlcis9UkVBTEJQUC84OwotKwotKwkJCWJyZWFrOwotKwkJfQotKwkJY2FzZSAyIC4uLiAxMjc6IC8qIHBhY2tlZCBQYWxldHRlICovCi0rCQl7Ci0rCQkJQ0FSREJQUCBwYWxldHRlWzE2XTsKLSsJCQlpbnQgbTAsIGksaixzaGlmdCwKLSsJCQkJYnBwPSh0eXBlPjQ/KHR5cGU+MTY/ODo0KToodHlwZT4yPzI6MSkpLAotKwkJCQltYXNrPSgxPDxicHApLTEsCi0rCQkJCWRpdmlkZXI9KDgvYnBwKTsKLSsKLSsJCQlpZigxK3R5cGUqUkVBTEJQUC84KygodytkaXZpZGVyLTEpL2RpdmlkZXIpKmg+YnVmZmVyX2xlbmd0aCkKLSsJCQkJcmV0dXJuIC01OwotKwotKwkJCS8qIHJlYWQgcGFsZXR0ZSAqLwotKwkJCWZvcihpPTA7IGk8dHlwZTsgaSsrLGJ1ZmZlcis9UkVBTEJQUC84KQotKwkJCQlwYWxldHRlW2ldID0gVW5jb21wcmVzc0NQaXhlbChidWZmZXIpOwotKwotKwkJCW0wID0gMDsKLSsJCQkvKiByZWFkIHBhbGV0dGl6ZWQgcGl4ZWxzICovCi0rCQkJZm9yKGo9eSpzaS5mcmFtZWJ1ZmZlcldpZHRoOyBqPCh5K2gpKnNpLmZyYW1lYnVmZmVyV2lkdGg7IGorPXNpLmZyYW1lYnVmZmVyV2lkdGgpIHsKLSsJCQkJZm9yKGk9eCxzaGlmdD04LWJwcDsgaTx4K3c7IGkrKykgewotKyMgIGlmIDAKLSsJCQkJCSgoQ0FSREJQUCopZnJhbWVCdWZmZXIpW2oraV0gPSBwYWxldHRlWygoKmJ1ZmZlcik+PnNoaWZ0KSZtYXNrXTsKLSsJCQkJCS8qIGFsdCAqLwotKwkJCQkJQ0FSREJQUCBjb2xvciA9IHBhbGV0dGVbKCgqYnVmZmVyKT4+c2hpZnQpJm1hc2tdOwotKwkJCQkJQ29weURhdGFUb1NjcmVlbigoY2hhciAqKSZjb2xvciwgaSwgai9zaS5mcmFtZWJ1ZmZlcldpZHRoLCAxLCAxKTsKLSsjICBlbHNlCi0rCQkJCQkoKENBUkRCUFAqKWZyYW1lQnVmZmVyKVttMCsrXSA9IHBhbGV0dGVbKCgqYnVmZmVyKT4+c2hpZnQpJm1hc2tdOwotKyMgIGVuZGlmCi0rCQkJCQlzaGlmdC09YnBwOwotKwkJCQkJaWYoc2hpZnQ8MCkgewotKwkJCQkJCXNoaWZ0PTgtYnBwOwotKwkJCQkJCWJ1ZmZlcisrOwotKwkJCQkJfQotKwkJCQl9Ci0rCQkJCWlmKHNoaWZ0PDgtYnBwKQotKwkJCQkJYnVmZmVyKys7Ci0rCQkJfQotKwkJCUNvcHlEYXRhVG9TY3JlZW4oKGNoYXIgKilmcmFtZUJ1ZmZlciwgeCwgeSwgdywgaCk7Ci0raWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hhMzogJWR4JWQrJWQrJWRcbiIsIHcsIGgsIHgsIHkpOwotKwotKwkJCWJyZWFrOwotKwkJfQotKwkJLyogY2FzZSAxNyAuLi4gMTI3OiBub3QgdXNlZCwgYnV0IHZhbGlkICovCi0rCQljYXNlIDEyODogLyogcGxhaW4gUkxFICovCi0rCQl7Ci0rCQkJaW50IG0wPTAsIGk9MCxqPTA7Ci0rCQkJd2hpbGUoajxoKSB7Ci0rCQkJCWludCBjb2xvcixsZW5ndGg7Ci0rCQkJCS8qIHJlYWQgY29sb3IgKi8KLSsJCQkJaWYoYnVmZmVyK1JFQUxCUFAvOCsxPmJ1ZmZlcl9lbmQpCi0rCQkJCQlyZXR1cm4gLTc7Ci0rCQkJCWNvbG9yID0gVW5jb21wcmVzc0NQaXhlbChidWZmZXIpOwotKwkJCQlidWZmZXIrPVJFQUxCUFAvODsKLSsJCQkJLyogcmVhZCBydW4gbGVuZ3RoICovCi0rCQkJCWxlbmd0aD0xOwotKwkJCQl3aGlsZSgqYnVmZmVyPT0weGZmKSB7Ci0rCQkJCQlpZihidWZmZXIrMT49YnVmZmVyX2VuZCkKLSsJCQkJCQlyZXR1cm4gLTg7Ci0rCQkJCQlsZW5ndGgrPSpidWZmZXI7Ci0rCQkJCQlidWZmZXIrKzsKLSsJCQkJfQotKwkJCQlsZW5ndGgrPSpidWZmZXI7Ci0rCQkJCWJ1ZmZlcisrOwotKwkJCQl3aGlsZShqPGggJiYgbGVuZ3RoPjApIHsKLSsjICBpZiAwCi0rCQkJCQkoKENBUkRCUFAqKWZyYW1lQnVmZmVyKVsoeStqKSpzaS5mcmFtZWJ1ZmZlcldpZHRoK3graV0gPSBjb2xvcjsKLSsJCQkJCS8qIGFsdCAqLwotKwkJCQkJQ29weURhdGFUb1NjcmVlbigoY2hhciAqKSZjb2xvciwgeCtpLCB5K2osIDEsIDEpOwotKyMgIGVsc2UKLSsJCQkJCSgoQ0FSREJQUCopZnJhbWVCdWZmZXIpW20wKytdID0gY29sb3I7Ci0rIyAgZW5kaWYKLSsJCQkJCWxlbmd0aC0tOwotKwkJCQkJaSsrOwotKwkJCQkJaWYoaT49dykgewotKwkJCQkJCWk9MDsKLSsJCQkJCQlqKys7Ci0rCQkJCQl9Ci0rCQkJCX0KLSsJCQkJaWYobGVuZ3RoPjApCi0rCQkJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHBvc3NpYmxlIFpSTEUgY29ycnVwdGlvblxuIik7Ci0rCQkJfQotKwkJCUNvcHlEYXRhVG9TY3JlZW4oKGNoYXIgKilmcmFtZUJ1ZmZlciwgeCwgeSwgdywgaCk7Ci0raWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hhNDogJWR4JWQrJWQrJWRcbiIsIHcsIGgsIHgsIHkpOwotKwotKwkJCWJyZWFrOwotKwkJfQotKwkJY2FzZSAxMjk6IC8qIHVudXNlZCAqLwotKwkJewotKwkJCXJldHVybiAtODsKLSsJCX0KLSsJCWNhc2UgMTMwIC4uLiAyNTU6IC8qIHBhbGV0dGUgUkxFICovCi0rCQl7Ci0rCQkJQ0FSREJQUCBwYWxldHRlWzEyOF07Ci0rCQkJaW50IG0wID0gMCwgaSxqOwotKwotKwkJCWlmKDIrKHR5cGUtMTI4KSpSRUFMQlBQLzg+YnVmZmVyX2xlbmd0aCkKLSsJCQkJcmV0dXJuIC05OwotKwotKwkJCS8qIHJlYWQgcGFsZXR0ZSAqLwotKwkJCWZvcihpPTA7IGk8dHlwZS0xMjg7IGkrKyxidWZmZXIrPVJFQUxCUFAvOCkKLSsJCQkJcGFsZXR0ZVtpXSA9IFVuY29tcHJlc3NDUGl4ZWwoYnVmZmVyKTsKLSsJCQkvKiByZWFkIHBhbGV0dGl6ZWQgcGl4ZWxzICovCi0rCQkJaT1qPTA7Ci0rCQkJd2hpbGUoajxoKSB7Ci0rCQkJCWludCBjb2xvcixsZW5ndGg7Ci0rCQkJCS8qIHJlYWQgY29sb3IgKi8KLSsJCQkJaWYoYnVmZmVyPj1idWZmZXJfZW5kKQotKwkJCQkJcmV0dXJuIC0xMDsKLSsJCQkJY29sb3IgPSBwYWxldHRlWygqYnVmZmVyKSYweDdmXTsKLSsJCQkJbGVuZ3RoPTE7Ci0rCQkJCWlmKCpidWZmZXImMHg4MCkgewotKwkJCQkJaWYoYnVmZmVyKzE+PWJ1ZmZlcl9lbmQpCi0rCQkJCQkJcmV0dXJuIC0xMTsKLSsJCQkJCWJ1ZmZlcisrOwotKwkJCQkJLyogcmVhZCBydW4gbGVuZ3RoICovCi0rCQkJCQl3aGlsZSgqYnVmZmVyPT0weGZmKSB7Ci0rCQkJCQkJaWYoYnVmZmVyKzE+PWJ1ZmZlcl9lbmQpCi0rCQkJCQkJCXJldHVybiAtODsKLSsJCQkJCQlsZW5ndGgrPSpidWZmZXI7Ci0rCQkJCQkJYnVmZmVyKys7Ci0rCQkJCQl9Ci0rCQkJCQlsZW5ndGgrPSpidWZmZXI7Ci0rCQkJCX0KLSsJCQkJYnVmZmVyKys7Ci0rCQkJCXdoaWxlKGo8aCAmJiBsZW5ndGg+MCkgewotKyMgIGlmIDAKLSsJCQkJCSgoQ0FSREJQUCopZnJhbWVCdWZmZXIpWyh5K2opKnNpLmZyYW1lYnVmZmVyV2lkdGgreCtpXSA9IGNvbG9yOwotKwkJCQkJLyogYWx0ICovCi0rCQkJCQlDb3B5RGF0YVRvU2NyZWVuKChjaGFyICopJmNvbG9yLCB4K2ksIHkraiwgMSwgMSk7Ci0rIyAgZWxzZQotKwkJCQkJKChDQVJEQlBQKilmcmFtZUJ1ZmZlcilbbTArK10gPSBjb2xvcjsKLSsjICBlbmRpZgotKwkJCQkJbGVuZ3RoLS07Ci0rCQkJCQlpKys7Ci0rCQkJCQlpZihpPj13KSB7Ci0rCQkJCQkJaT0wOwotKwkJCQkJCWorKzsKLSsJCQkJCX0KLSsJCQkJfQotKwkJCQlpZihsZW5ndGg+MCkKLSsJCQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogcG9zc2libGUgWlJMRSBjb3JydXB0aW9uXG4iKTsKLSsJCQl9Ci0rCQkJQ29weURhdGFUb1NjcmVlbigoY2hhciAqKWZyYW1lQnVmZmVyLCB4LCB5LCB3LCBoKTsKLStpZiAoMCkgZnByaW50ZihzdGRlcnIsICJjaGE1OiAlZHglZCslZCslZFxuIiwgdywgaCwgeCwgeSk7Ci0rCi0rCQkJYnJlYWs7Ci0rCQl9Ci0rCX0KLSsKLSsjaWYgRE9fWllXUkxFICYmIEJQUCAhPSA4Ci0rCWlmICh6eXdybGVfbGV2ZWwgJiAweDgwKSB7Ci0rCQlpbnQgdGgsIHR4OwotKwkJaW50IHdpZHRoSW5CeXRlcyA9IHcgKiBCUFAgLyA4OwotKwkJaW50IHNjcldpZHRoSW5CeXRlczsKLSsJCWNoYXIgKnNjciwgKmJ1ZjsKLSsJCXN0YXRpYyBDQVJEQlBQICpwdG1wID0gTlVMTDsKLSsJCXN0YXRpYyBpbnQgcHRtcF9sZW4gPSAwOwotKwkJWEltYWdlICppbSA9IGltYWdlX3NjYWxlID8gaW1hZ2Vfc2NhbGUgOiBpbWFnZTsgCi0rCi0rCQlpZiAodyAqIGggPiBwdG1wX2xlbikgewotKwkJCXB0bXBfbGVuID0gdyAqIGg7Ci0rCQkJaWYgKHB0bXBfbGVuIDwgcmZiWlJMRVRpbGVXaWR0aCpyZmJaUkxFVGlsZUhlaWdodCkgewotKwkJCQlwdG1wX2xlbiA9IHJmYlpSTEVUaWxlV2lkdGgqcmZiWlJMRVRpbGVIZWlnaHQ7Ci0rCQkJfQotKwkJCWlmIChwdG1wKSB7Ci0rCQkJCWZyZWUocHRtcCk7Ci0rCQkJfQotKwkJCXB0bXAgPSAoQ0FSREJQUCAqKSBtYWxsb2MocHRtcF9sZW4gKiBzaXplb2YoQ0FSREJQUCkpOwotKwkJfQotKwotKwkJenl3cmxlX2xldmVsICY9IDB4N0Y7Ci0rCQkvKiBSZXZlcnNlIGNvcHk6IHNjcmVlbiB0byBidWYvcHRtcDogKi8KLSsJCS8qIG1ha2UgdGhpcyBDb3B5RGF0YUZyb21TY3JlZW4oKSBvciBzb21ldGhpbmcuICovCi0rCQlpZiAoIWFwcERhdGEudXNlQkdSNTY1KSB7Ci0rCQkJc2NyV2lkdGhJbkJ5dGVzID0gc2kuZnJhbWVidWZmZXJXaWR0aCAqIG15Rm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0rCQkJaWYgKHNjcldpZHRoSW5CeXRlcyAhPSBpbS0+Ynl0ZXNfcGVyX2xpbmUpIHNjcldpZHRoSW5CeXRlcyA9IGltLT5ieXRlc19wZXJfbGluZTsKLSsJCQlzY3IgPSBpbS0+ZGF0YSArIHkgKiBzY3JXaWR0aEluQnl0ZXMgKyB4ICogbXlGb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLSsJCQlidWYgPSAoY2hhciAqKSBwdG1wOwotKwotKwkJCWZvciAodGggPSAwOyB0aCA8IGg7IHRoKyspIHsKLSsJCQkJbWVtY3B5KGJ1Ziwgc2NyLCB3aWR0aEluQnl0ZXMpOwotKwkJCQlidWYgKz0gd2lkdGhJbkJ5dGVzOwotKwkJCQlzY3IgKz0gc2NyV2lkdGhJbkJ5dGVzOwotKwkJCX0KLSsJCX0gZWxzZSB7Ci0rCQkJc2NyV2lkdGhJbkJ5dGVzID0gc2kuZnJhbWVidWZmZXJXaWR0aCAqIDQ7Ci0rCQkJaWYgKHNjcldpZHRoSW5CeXRlcyAhPSBpbS0+Ynl0ZXNfcGVyX2xpbmUpIHNjcldpZHRoSW5CeXRlcyA9IGltLT5ieXRlc19wZXJfbGluZTsKLSsJCQlzY3IgPSBpbS0+ZGF0YSArIHkgKiBzY3JXaWR0aEluQnl0ZXMgKyB4ICogNDsKLSsJCQlidWYgPSAoY2hhciAqKSBwdG1wOwotKwotKwkJCWZvciAodGggPSAwOyB0aCA8IGg7IHRoKyspIHsKLSsJCQkJZm9yICh0eCA9IDA7IHR4IDwgdzsgdHgrKykgewotKwkJCQkJdW5zaWduZWQgbG9uZyBwaXggPSAqKCh1bnNpZ25lZCBpbnQgKilzY3IgKyB0eCk7Ci0rCQkJCQl1bnNpZ25lZCBpbnQgcjEgPSAocGl4ICYgMHhmZjAwMDApID4+IDE2OyAKLSsJCQkJCXVuc2lnbmVkIGludCBnMSA9IChwaXggJiAweDAwZmYwMCkgPj4gODsgCi0rCQkJCQl1bnNpZ25lZCBpbnQgYjEgPSAocGl4ICYgMHgwMDAwZmYpID4+IDA7IAotKwkJCQkJaW50IHIyLCBnMiwgYjIsIGlkeDsKLSsJCQkJCWludCByb2sgPSAwLCBnb2sgPSAwLCBib2sgPSAwLCBpczAsIHNoID0gMTA7Ci0rCQkJCQlyMiA9ICgzMSAqIHIxKS8yNTU7Ci0rCQkJCQlnMiA9ICg2MyAqIGcxKS8yNTU7Ci0rCQkJCQliMiA9ICgzMSAqIGIxKS8yNTU7Ci0rCQkJCQlmb3IgKGlzMCA9IDA7IGlzMCA8IHNoOyBpczArKykgewotKwkJCQkJCWludCBpcywgaSwgdDsKLSsJCQkJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0rCQkJCQkJCWlmIChpID09IDApIHsKLSsJCQkJCQkJCWlzID0gLWlzMDsKLSsJCQkJCQkJfSBlbHNlIHsKLSsJCQkJCQkJCWlzID0gK2lzMDsKLSsJCQkJCQkJfQotKwkJCQkJCQlpZiAoIXJvaykgewotKwkJCQkJCQkJdCA9IHIyICsgaXM7Ci0rCQkJCQkJCQlpZiAocjEgPT0gKDI1NSAqIHQpLzMxKSB7Ci0rCQkJCQkJCQkJcjIgPSB0OyByb2sgPSAxOwotKwkJCQkJCQkJfQotKwkJCQkJCQl9Ci0rCQkJCQkJCWlmICghZ29rKSB7Ci0rCQkJCQkJCQl0ID0gZzIgKyBpczsKLSsJCQkJCQkJCWlmIChnMSA9PSAoMjU1ICogdCkvNjMpIHsKLSsJCQkJCQkJCQlnMiA9IHQ7IGdvayA9IDE7Ci0rCQkJCQkJCQl9Ci0rCQkJCQkJCX0KLSsJCQkJCQkJaWYgKCFib2spIHsKLSsJCQkJCQkJCXQgPSBiMiArIGlzOwotKwkJCQkJCQkJaWYgKGIxID09ICgyNTUgKiB0KS8zMSkgewotKwkJCQkJCQkJCWIyID0gdDsgYm9rID0gMTsKLSsJCQkJCQkJCX0KLSsJCQkJCQkJfQotKwkJCQkJCX0KLSsJCQkJCQlpZiAocm9rICYmIGdvayAmJiBib2spIHsKLSsJCQkJCQkJYnJlYWs7Ci0rCQkJCQkJfQotKwkJCQkJfQotKwkJCQkJaWR4ID0gKHIyIDw8IDExKSB8IChnMiA8PCA1KSB8IChiMiA8PCAwKTsKLSsJCQkJCSooKENBUkRCUFAgKilidWYgKyB0eCkgPSAoQ0FSREJQUCkgaWR4OwotKwkJCQl9Ci0rCQkJCWJ1ZiArPSB3aWR0aEluQnl0ZXM7Ci0rCQkJCXNjciArPSBzY3JXaWR0aEluQnl0ZXM7Ci0rCQkJfQotKwkJfQotKwkJWllXUkxFX1NZTlRIRVNJWkUoKFBJWEVMX1QgKilwdG1wLCAoUElYRUxfVCAqKXB0bXAsIHcsIGgsIHcsIHp5d3JsZV9sZXZlbCwgenl3cmxlQnVmICk7Ci0rCQlza2lwX21heWJlX3N5bmMgPSAxOwotKwotKwkJaWYgKGFwcERhdGEueUNyb3AgPiAwKSB7Ci0rCQkJc2tpcF9tYXliZV9zeW5jID0gMDsKLSsJCX0KLSsJCUNvcHlEYXRhVG9TY3JlZW4oKGNoYXIgKilwdG1wLCB4LCB5LCB3LCBoKTsKLSsKLSsJfQotKyNlbmRpZgotKwotKwlyZXR1cm4gYnVmZmVyLWJ1ZmZlcl9jb3B5OwkKLSt9Ci0rCi0rI3VuZGVmIENBUkRCUFAKLSsjdW5kZWYgQ0FSRFJFQUxCUFAKLSsjdW5kZWYgSGFuZGxlWlJMRQotKyN1bmRlZiBIYW5kbGVaUkxFVGlsZQotKyN1bmRlZiBVbmNvbXByZXNzQ1BpeGVsCi0rI3VuZGVmIFJFQUxCUFAKLSsKLSsjdW5kZWYgVU5DT01QCi0rCi0rI3VuZGVmIEZpbGxSZWN0YW5nbGUKLSsjdW5kZWYgSVNfQklHX0VORElBTgotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvenJsZWVuY29kZXRlbXBsYXRlLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3pybGVlbmNvZGV0ZW1wbGF0ZS5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvenJsZWVuY29kZXRlbXBsYXRlLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZWVuY29kZXRlbXBsYXRlLmMJMjAwNy0wMi0wNCAyMzoxODowOS4wMDAwMDAwMDAgLTA1MDAKLUBAIC0wLDAgKzEsMzE3IEBACi0rLyoKLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKyAqIENvcHlyaWdodCAoQykgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0rICoKLSsgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0rICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSsgKgotKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKyAqCi0rICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSsgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCi0rICogVVNBLgotKyAqLwotKwotKy8qCi0rICogQmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUsIHlvdSBtdXN0IGRlZmluZSBhIG51bWJlciBvZiBDUFAgbWFjcm9zLgotKyAqCi0rICogQlBQIHNob3VsZCBiZSA4LCAxNiBvciAzMiBkZXBlbmRpbmcgb24gdGhlIGJpdHMgcGVyIHBpeGVsLgotKyAqIEdFVF9JTUFHRV9JTlRPX0JVRiBzaG91bGQgYmUgc29tZSBjb2RlIHdoaWNoIGdldHMgYSByZWN0YW5nbGUgb2YgcGl4ZWwgZGF0YQotKyAqIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4gIEVYVFJBX0FSR1MgY2FuIGJlIGRlZmluZWQgdG8gcGFzcyBhbnkgb3RoZXIKLSsgKiBhcmd1bWVudHMgbmVlZGVkIGJ5IEdFVF9JTUFHRV9JTlRPX0JVRi4KLSsgKgotKyAqIE5vdGUgdGhhdCB0aGUgYnVmIGFyZ3VtZW50IHRvIFpSTEVfRU5DT0RFIG5lZWRzIHRvIGJlIGF0IGxlYXN0IG9uZSBwaXhlbAotKyAqIGJpZ2dlciB0aGFuIHRoZSBsYXJnZXN0IHRpbGUgb2YgcGl4ZWwgZGF0YSwgc2luY2UgdGhlIFpSTEUgZW5jb2RpbmcKLSsgKiBhbGdvcml0aG0gd3JpdGVzIHRvIHRoZSBwb3NpdGlvbiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBwaXhlbCBkYXRhLgotKyAqLwotKwotKyNpbmNsdWRlICJ6cmxlb3V0c3RyZWFtLmgiCi0rI2luY2x1ZGUgInpybGVwYWxldHRlaGVscGVyLmgiCi0rI2luY2x1ZGUgPGFzc2VydC5oPgotKwotKy8qIF9fUkZCX0NPTkNBVDIgY29uY2F0ZW5hdGVzIGl0cyB0d28gYXJndW1lbnRzLiAgX19SRkJfQ09OQ0FUMkUgZG9lcyB0aGUgc2FtZQotKyAgIGJ1dCBhbHNvIGV4cGFuZHMgaXRzIGFyZ3VtZW50cyBpZiB0aGV5IGFyZSBtYWNyb3MgKi8KLSsKLSsjaWZuZGVmIF9fUkZCX0NPTkNBVDJFCi0rI2RlZmluZSBfX1JGQl9DT05DQVQyKGEsYikgYSMjYgotKyNkZWZpbmUgX19SRkJfQ09OQ0FUMkUoYSxiKSBfX1JGQl9DT05DQVQyKGEsYikKLSsjZW5kaWYKLSsKLSsjaWZuZGVmIF9fUkZCX0NPTkNBVDNFCi0rI2RlZmluZSBfX1JGQl9DT05DQVQzKGEsYixjKSBhIyNiIyNjCi0rI2RlZmluZSBfX1JGQl9DT05DQVQzRShhLGIsYykgX19SRkJfQ09OQ0FUMyhhLGIsYykKLSsjZW5kaWYKLSsKLSsjdW5kZWYgRU5EX0ZJWAotKyNpZiBaWVdSTEVfRU5ESUFOID09IEVORElBTl9MSVRUTEUKLSsjICBkZWZpbmUgRU5EX0ZJWCBMRQotKyNlbGlmIFpZV1JMRV9FTkRJQU4gPT0gRU5ESUFOX0JJRwotKyMgIGRlZmluZSBFTkRfRklYIEJFCi0rI2Vsc2UKLSsjICBkZWZpbmUgRU5EX0ZJWCBORQotKyNlbmRpZgotKwotKyNpZmRlZiBDUElYRUwKLSsjZGVmaW5lIFBJWEVMX1QgX19SRkJfQ09OQ0FUMkUoenJsZV9VLEJQUCkKLSsjZGVmaW5lIHpybGVPdXRTdHJlYW1XUklURV9QSVhFTCBfX1JGQl9DT05DQVQyRSh6cmxlT3V0U3RyZWFtV3JpdGVPcGFxdWUsQ1BJWEVMKQotKyNkZWZpbmUgWlJMRV9FTkNPREUgX19SRkJfQ09OQ0FUM0UoenJsZUVuY29kZSxDUElYRUwsRU5EX0ZJWCkKLSsjZGVmaW5lIFpSTEVfRU5DT0RFX1RJTEUgX19SRkJfQ09OQ0FUM0UoenJsZUVuY29kZVRpbGUsQ1BJWEVMLEVORF9GSVgpCi0rI2RlZmluZSBCUFBPVVQgMjQKLSsjZWxpZiBCUFA9PTE1Ci0rI2RlZmluZSBQSVhFTF9UIF9fUkZCX0NPTkNBVDJFKHpybGVfVSwxNikKLSsjZGVmaW5lIHpybGVPdXRTdHJlYW1XUklURV9QSVhFTCBfX1JGQl9DT05DQVQyRSh6cmxlT3V0U3RyZWFtV3JpdGVPcGFxdWUsMTYpCi0rI2RlZmluZSBaUkxFX0VOQ09ERSBfX1JGQl9DT05DQVQzRSh6cmxlRW5jb2RlLEJQUCxFTkRfRklYKQotKyNkZWZpbmUgWlJMRV9FTkNPREVfVElMRSBfX1JGQl9DT05DQVQzRSh6cmxlRW5jb2RlVGlsZSxCUFAsRU5EX0ZJWCkKLSsjZGVmaW5lIEJQUE9VVCAxNgotKyNlbHNlCi0rI2RlZmluZSBQSVhFTF9UIF9fUkZCX0NPTkNBVDJFKHpybGVfVSxCUFApCi0rI2RlZmluZSB6cmxlT3V0U3RyZWFtV1JJVEVfUElYRUwgX19SRkJfQ09OQ0FUMkUoenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlLEJQUCkKLSsjZGVmaW5lIFpSTEVfRU5DT0RFIF9fUkZCX0NPTkNBVDNFKHpybGVFbmNvZGUsQlBQLEVORF9GSVgpCi0rI2RlZmluZSBaUkxFX0VOQ09ERV9USUxFIF9fUkZCX0NPTkNBVDNFKHpybGVFbmNvZGVUaWxlLEJQUCxFTkRfRklYKQotKyNkZWZpbmUgQlBQT1VUIEJQUAotKyNlbmRpZgotKwotKyNpZm5kZWYgWlJMRV9PTkNFCi0rI2RlZmluZSBaUkxFX09OQ0UKLSsKLStzdGF0aWMgY29uc3QgaW50IGJpdHNQZXJQYWNrZWRQaXhlbFtdID0gewotKyAgMCwgMSwgMiwgMiwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNAotK307Ci0rCi0raW50IHp5d3JsZV9sZXZlbDsKLStpbnQgenl3cmxlQnVmW3JmYlpSTEVUaWxlV2lkdGgqcmZiWlJMRVRpbGVIZWlnaHRdOwotKwotK3N0YXRpYyB6cmxlUGFsZXR0ZUhlbHBlciBwYWxldHRlSGVscGVyOwotKwotKyNlbmRpZiAvKiBaUkxFX09OQ0UgKi8KLSsKLSt2b2lkIFpSTEVfRU5DT0RFX1RJTEUgKFBJWEVMX1QqIGRhdGEsIGludCB3LCBpbnQgaCwgenJsZU91dFN0cmVhbSogb3MpOwotKwotKyNpZiBCUFAhPTgKLSsjZGVmaW5lIFpZV1JMRV9FTkNPREUKLSsjaW5jbHVkZSAienl3cmxldGVtcGxhdGUuYyIKLSsjZW5kaWYKLSsKLStzdGF0aWMgdm9pZCBaUkxFX0VOQ09ERSAoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0rCQkgIHpybGVPdXRTdHJlYW0qIG9zLCB2b2lkKiBidWYKLSsgICAgICAgICAgICAgICAgICBFWFRSQV9BUkdTCi0rICAgICAgICAgICAgICAgICAgKQotK3sKLSsgIGludCB0eTsKLSsgIGZvciAodHkgPSB5OyB0eSA8IHkraDsgdHkgKz0gcmZiWlJMRVRpbGVIZWlnaHQpIHsKLSsgICAgaW50IHR4LCB0aCA9IHJmYlpSTEVUaWxlSGVpZ2h0OwotKyAgICBpZiAodGggPiB5K2gtdHkpIHRoID0geStoLXR5OwotKyAgICBmb3IgKHR4ID0geDsgdHggPCB4K3c7IHR4ICs9IHJmYlpSTEVUaWxlV2lkdGgpIHsKLSsgICAgICBpbnQgdHcgPSByZmJaUkxFVGlsZVdpZHRoOwotKyAgICAgIGlmICh0dyA+IHgrdy10eCkgdHcgPSB4K3ctdHg7Ci0rCi0rICAgICAgR0VUX0lNQUdFX0lOVE9fQlVGKHR4LHR5LHR3LHRoLGJ1Zik7Ci0rCi0rICAgICAgWlJMRV9FTkNPREVfVElMRSgoUElYRUxfVCopYnVmLCB0dywgdGgsIG9zKTsKLSsgICAgfQotKyAgfQotKyAgenJsZU91dFN0cmVhbUZsdXNoKG9zKTsKLSt9Ci0rCi0rCi0rdm9pZCBaUkxFX0VOQ09ERV9USUxFIChQSVhFTF9UKiBkYXRhLCBpbnQgdywgaW50IGgsIHpybGVPdXRTdHJlYW0qIG9zKQotK3sKLSsgIC8qIEZpcnN0IGZpbmQgdGhlIHBhbGV0dGUgYW5kIHRoZSBudW1iZXIgb2YgcnVucyAqLwotKwotKyAgenJsZVBhbGV0dGVIZWxwZXIgKnBoOwotKwotKyAgaW50IHJ1bnMgPSAwOwotKyAgaW50IHNpbmdsZVBpeGVscyA9IDA7Ci0rCi0rICByZmJCb29sIHVzZVJsZTsKLSsgIHJmYkJvb2wgdXNlUGFsZXR0ZTsKLSsKLSsgIGludCBlc3RpbWF0ZWRCeXRlczsKLSsgIGludCBwbGFpblJsZUJ5dGVzOwotKyAgaW50IGk7Ci0rCi0rICBQSVhFTF9UKiBwdHIgPSBkYXRhOwotKyAgUElYRUxfVCogZW5kID0gcHRyICsgaCAqIHc7Ci0rICAqZW5kID0gfiooZW5kLTEpOyAvKiBvbmUgcGFzdCB0aGUgZW5kIGlzIGRpZmZlcmVudCBzbyB0aGUgd2hpbGUgbG9vcCBlbmRzICovCi0rCi0rICBwaCA9ICZwYWxldHRlSGVscGVyOwotKyAgenJsZVBhbGV0dGVIZWxwZXJJbml0KHBoKTsKLSsKLSsgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSsgICAgUElYRUxfVCBwaXggPSAqcHRyOwotKyAgICBpZiAoKisrcHRyICE9IHBpeCkgewotKyAgICAgIHNpbmdsZVBpeGVscysrOwotKyAgICB9IGVsc2UgewotKyAgICAgIHdoaWxlICgqKytwdHIgPT0gcGl4KSA7Ci0rICAgICAgcnVucysrOwotKyAgICB9Ci0rICAgIHpybGVQYWxldHRlSGVscGVySW5zZXJ0KHBoLCBwaXgpOwotKyAgfQotKwotKyAgLyogU29saWQgdGlsZSBpcyBhIHNwZWNpYWwgY2FzZSAqLwotKwotKyAgaWYgKHBoLT5zaXplID09IDEpIHsKLSsgICAgenJsZU91dFN0cmVhbVdyaXRlVTgob3MsIDEpOwotKyAgICB6cmxlT3V0U3RyZWFtV1JJVEVfUElYRUwob3MsIHBoLT5wYWxldHRlWzBdKTsKLSsgICAgcmV0dXJuOwotKyAgfQotKwotKyAgLyogVHJ5IHRvIHdvcmsgb3V0IHdoZXRoZXIgdG8gdXNlIFJMRSBhbmQvb3IgYSBwYWxldHRlLiAgV2UgZG8gdGhpcyBieQotKyAgICAgZXN0aW1hdGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBwaWNraW5nIHRoZQotKyAgICAgbWV0aG9kIHdoaWNoIHJlc3VsdHMgaW4gdGhlIGZld2VzdCBieXRlcy4gIE9mIGNvdXJzZSB0aGlzIG1heSBub3QgcmVzdWx0Ci0rICAgICBpbiB0aGUgZmV3ZXN0IGJ5dGVzIGFmdGVyIGNvbXByZXNzaW9uLi4uICovCi0rCi0rICB1c2VSbGUgPSBGQUxTRTsKLSsgIHVzZVBhbGV0dGUgPSBGQUxTRTsKLSsKLSsgIGVzdGltYXRlZEJ5dGVzID0gdyAqIGggKiAoQlBQT1VULzgpOyAvKiBzdGFydCBhc3N1bWluZyByYXcgKi8KLSsKLSsjaWYgQlBQIT04Ci0rICBpZiggKHp5d3JsZV9sZXZlbD4wKSYmICEoenl3cmxlX2xldmVsICYgMHg4MCkgKXsKLSsJICBlc3RpbWF0ZWRCeXRlcyA+Pj0genl3cmxlX2xldmVsOwotKyAgfQotKyNlbmRpZgotKwotKyAgcGxhaW5SbGVCeXRlcyA9ICgoQlBQT1VULzgpKzEpICogKHJ1bnMgKyBzaW5nbGVQaXhlbHMpOwotKwotKyAgaWYgKHBsYWluUmxlQnl0ZXMgPCBlc3RpbWF0ZWRCeXRlcykgewotKyAgICB1c2VSbGUgPSBUUlVFOwotKyAgICBlc3RpbWF0ZWRCeXRlcyA9IHBsYWluUmxlQnl0ZXM7Ci0rICB9Ci0rCi0rICBpZiAocGgtPnNpemUgPCAxMjgpIHsKLSsgICAgaW50IHBhbGV0dGVSbGVCeXRlcyA9IChCUFBPVVQvOCkgKiBwaC0+c2l6ZSArIDIgKiBydW5zICsgc2luZ2xlUGl4ZWxzOwotKwotKyAgICBpZiAocGFsZXR0ZVJsZUJ5dGVzIDwgZXN0aW1hdGVkQnl0ZXMpIHsKLSsgICAgICB1c2VSbGUgPSBUUlVFOwotKyAgICAgIHVzZVBhbGV0dGUgPSBUUlVFOwotKyAgICAgIGVzdGltYXRlZEJ5dGVzID0gcGFsZXR0ZVJsZUJ5dGVzOwotKyAgICB9Ci0rCi0rICAgIGlmIChwaC0+c2l6ZSA8IDE3KSB7Ci0rICAgICAgaW50IHBhY2tlZEJ5dGVzID0gKChCUFBPVVQvOCkgKiBwaC0+c2l6ZSArCi0rICAgICAgICAgICAgICAgICAgICAgICAgIHcgKiBoICogYml0c1BlclBhY2tlZFBpeGVsW3BoLT5zaXplLTFdIC8gOCk7Ci0rCi0rICAgICAgaWYgKHBhY2tlZEJ5dGVzIDwgZXN0aW1hdGVkQnl0ZXMpIHsKLSsgICAgICAgIHVzZVJsZSA9IEZBTFNFOwotKyAgICAgICAgdXNlUGFsZXR0ZSA9IFRSVUU7Ci0rICAgICAgICBlc3RpbWF0ZWRCeXRlcyA9IHBhY2tlZEJ5dGVzOwotKyAgICAgIH0KLSsgICAgfQotKyAgfQotKwotKyAgaWYgKCF1c2VQYWxldHRlKSBwaC0+c2l6ZSA9IDA7Ci0rCi0rICB6cmxlT3V0U3RyZWFtV3JpdGVVOChvcywgKHVzZVJsZSA/IDEyOCA6IDApIHwgcGgtPnNpemUpOwotKwotKyAgZm9yIChpID0gMDsgaSA8IHBoLT5zaXplOyBpKyspIHsKLSsgICAgenJsZU91dFN0cmVhbVdSSVRFX1BJWEVMKG9zLCBwaC0+cGFsZXR0ZVtpXSk7Ci0rICB9Ci0rCi0rICBpZiAodXNlUmxlKSB7Ci0rCi0rICAgIFBJWEVMX1QqIHB0ciA9IGRhdGE7Ci0rICAgIFBJWEVMX1QqIGVuZCA9IHB0ciArIHcgKiBoOwotKyAgICBQSVhFTF9UKiBydW5TdGFydDsKLSsgICAgUElYRUxfVCBwaXg7Ci0rICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSsgICAgICBpbnQgbGVuOwotKyAgICAgIHJ1blN0YXJ0ID0gcHRyOwotKyAgICAgIHBpeCA9ICpwdHIrKzsKLSsgICAgICB3aGlsZSAoKnB0ciA9PSBwaXggJiYgcHRyIDwgZW5kKQotKyAgICAgICAgcHRyKys7Ci0rICAgICAgbGVuID0gcHRyIC0gcnVuU3RhcnQ7Ci0rICAgICAgaWYgKGxlbiA8PSAyICYmIHVzZVBhbGV0dGUpIHsKLSsgICAgICAgIGludCBpbmRleCA9IHpybGVQYWxldHRlSGVscGVyTG9va3VwKHBoLCBwaXgpOwotKyAgICAgICAgaWYgKGxlbiA9PSAyKQotKyAgICAgICAgICB6cmxlT3V0U3RyZWFtV3JpdGVVOChvcywgaW5kZXgpOwotKyAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlVTgob3MsIGluZGV4KTsKLSsgICAgICAgIGNvbnRpbnVlOwotKyAgICAgIH0KLSsgICAgICBpZiAodXNlUGFsZXR0ZSkgewotKyAgICAgICAgaW50IGluZGV4ID0genJsZVBhbGV0dGVIZWxwZXJMb29rdXAocGgsIHBpeCk7Ci0rICAgICAgICB6cmxlT3V0U3RyZWFtV3JpdGVVOChvcywgaW5kZXggfCAxMjgpOwotKyAgICAgIH0gZWxzZSB7Ci0rICAgICAgICB6cmxlT3V0U3RyZWFtV1JJVEVfUElYRUwob3MsIHBpeCk7Ci0rICAgICAgfQotKyAgICAgIGxlbiAtPSAxOwotKyAgICAgIHdoaWxlIChsZW4gPj0gMjU1KSB7Ci0rICAgICAgICB6cmxlT3V0U3RyZWFtV3JpdGVVOChvcywgMjU1KTsKLSsgICAgICAgIGxlbiAtPSAyNTU7Ci0rICAgICAgfQotKyAgICAgIHpybGVPdXRTdHJlYW1Xcml0ZVU4KG9zLCBsZW4pOwotKyAgICB9Ci0rCi0rICB9IGVsc2UgewotKwotKyAgICAvKiBubyBSTEUgKi8KLSsKLSsgICAgaWYgKHVzZVBhbGV0dGUpIHsKLSsgICAgICBpbnQgYnBwcDsKLSsgICAgICBQSVhFTF9UKiBwdHIgPSBkYXRhOwotKwotKyAgICAgIC8qIHBhY2tlZCBwaXhlbHMgKi8KLSsKLSsgICAgICBhc3NlcnQgKHBoLT5zaXplIDwgMTcpOwotKwotKyAgICAgIGJwcHAgPSBiaXRzUGVyUGFja2VkUGl4ZWxbcGgtPnNpemUtMV07Ci0rCi0rICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewotKyAgICAgICAgenJsZV9VOCBuYml0cyA9IDA7Ci0rICAgICAgICB6cmxlX1U4IGJ5dGUgPSAwOwotKwotKyAgICAgICAgUElYRUxfVCogZW9sID0gcHRyICsgdzsKLSsKLSsgICAgICAgIHdoaWxlIChwdHIgPCBlb2wpIHsKLSsgICAgICAgICAgUElYRUxfVCBwaXggPSAqcHRyKys7Ci0rICAgICAgICAgIHpybGVfVTggaW5kZXggPSB6cmxlUGFsZXR0ZUhlbHBlckxvb2t1cChwaCwgcGl4KTsKLSsgICAgICAgICAgYnl0ZSA9IChieXRlIDw8IGJwcHApIHwgaW5kZXg7Ci0rICAgICAgICAgIG5iaXRzICs9IGJwcHA7Ci0rICAgICAgICAgIGlmIChuYml0cyA+PSA4KSB7Ci0rICAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlVTgob3MsIGJ5dGUpOwotKyAgICAgICAgICAgIG5iaXRzID0gMDsKLSsgICAgICAgICAgfQotKyAgICAgICAgfQotKyAgICAgICAgaWYgKG5iaXRzID4gMCkgewotKyAgICAgICAgICBieXRlIDw8PSA4IC0gbmJpdHM7Ci0rICAgICAgICAgIHpybGVPdXRTdHJlYW1Xcml0ZVU4KG9zLCBieXRlKTsKLSsgICAgICAgIH0KLSsgICAgICB9Ci0rICAgIH0gZWxzZSB7Ci0rCi0rICAgICAgLyogcmF3ICovCi0rCi0rI2lmIEJQUCE9OAotKyAgICAgIGlmKCAoenl3cmxlX2xldmVsPjApJiYgISh6eXdybGVfbGV2ZWwgJiAweDgwKSApewotKwkJICBaWVdSTEVfQU5BTFlaRSggZGF0YSwgZGF0YSwgdywgaCwgdywgenl3cmxlX2xldmVsLCB6eXdybGVCdWYgKTsKLSsJCSAgenl3cmxlX2xldmVsIHw9IDB4ODA7Ci0rCQkgIFpSTEVfRU5DT0RFX1RJTEUoIGRhdGEsIHcsIGgsIG9zICk7Ci0rCQkgIHp5d3JsZV9sZXZlbCAmPSAweDdGOwotKwkgIH1lbHNlCi0rI2VuZGlmCi0rCXsKLSsjaWZkZWYgQ1BJWEVMCi0rICAgICAgUElYRUxfVCAqcHRyOwotKyAgICAgIGZvciAocHRyID0gZGF0YTsgcHRyIDwgZGF0YSt3Kmg7IHB0cisrKSB7Ci0rICAgICAgICB6cmxlT3V0U3RyZWFtV1JJVEVfUElYRUwob3MsICpwdHIpOwotKyAgICAgIH0KLSsjZWxzZQotKyAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlQnl0ZXMob3MsICh6cmxlX1U4ICopZGF0YSwgdypoKihCUFAvOCkpOwotKyNlbmRpZgotKwkgIH0KLSsgICAgfQotKyAgfQotK30KLSsKLSsjdW5kZWYgUElYRUxfVAotKyN1bmRlZiB6cmxlT3V0U3RyZWFtV1JJVEVfUElYRUwKLSsjdW5kZWYgWlJMRV9FTkNPREUKLSsjdW5kZWYgWlJMRV9FTkNPREVfVElMRQotKyN1bmRlZiBaWVdSTEVfRU5DT0RFX1RJTEUKLSsjdW5kZWYgQlBQT1VUCi1kaWZmIC1OYXVyIC1YIC4vZXhjbHVkZSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci96cmxlb3V0c3RyZWFtLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3pybGVvdXRzdHJlYW0uYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGVvdXRzdHJlYW0uYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci96cmxlb3V0c3RyZWFtLmMJMjAwNS0wNS0xNSAxMDo1Nzo1NC4wMDAwMDAwMDAgLTA0MDAKLUBAIC0wLDAgKzEsMjc1IEBACi0rLyoKLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKyAqIENvcHlyaWdodCAoQykgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0rICoKLSsgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0rICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSsgKgotKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKyAqCi0rICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSsgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCi0rICogVVNBLgotKyAqLwotKwotKyNpbmNsdWRlICJ6cmxlb3V0c3RyZWFtLmgiCi0rI2luY2x1ZGUgPHN0ZGxpYi5oPgotKwotKyNkZWZpbmUgWlJMRV9JTl9CVUZGRVJfU0laRSAgMTYzODQKLSsjZGVmaW5lIFpSTEVfT1VUX0JVRkZFUl9TSVpFIDEwMjQKLSsjdW5kZWYgIFpSTEVfREVCVUcKLSsKLStzdGF0aWMgcmZiQm9vbCB6cmxlQnVmZmVyQWxsb2MoenJsZUJ1ZmZlciAqYnVmZmVyLCBpbnQgc2l6ZSkKLSt7Ci0rICBidWZmZXItPnB0ciA9IGJ1ZmZlci0+c3RhcnQgPSBtYWxsb2Moc2l6ZSk7Ci0rICBpZiAoYnVmZmVyLT5zdGFydCA9PSBOVUxMKSB7Ci0rICAgIGJ1ZmZlci0+ZW5kID0gTlVMTDsKLSsgICAgcmV0dXJuIEZBTFNFOwotKyAgfQotKwotKyAgYnVmZmVyLT5lbmQgPSBidWZmZXItPnN0YXJ0ICsgc2l6ZTsKLSsKLSsgIHJldHVybiBUUlVFOwotK30KLSsKLStzdGF0aWMgdm9pZCB6cmxlQnVmZmVyRnJlZSh6cmxlQnVmZmVyICpidWZmZXIpCi0rewotKyAgaWYgKGJ1ZmZlci0+c3RhcnQpCi0rICAgIGZyZWUoYnVmZmVyLT5zdGFydCk7Ci0rICBidWZmZXItPnN0YXJ0ID0gYnVmZmVyLT5wdHIgPSBidWZmZXItPmVuZCA9IE5VTEw7Ci0rfQotKwotK3N0YXRpYyByZmJCb29sIHpybGVCdWZmZXJHcm93KHpybGVCdWZmZXIgKmJ1ZmZlciwgaW50IHNpemUpCi0rewotKyAgaW50IG9mZnNldDsKLSsKLSsgIHNpemUgICs9IGJ1ZmZlci0+ZW5kIC0gYnVmZmVyLT5zdGFydDsKLSsgIG9mZnNldCA9IFpSTEVfQlVGRkVSX0xFTkdUSCAoYnVmZmVyKTsKLSsKLSsgIGJ1ZmZlci0+c3RhcnQgPSByZWFsbG9jKGJ1ZmZlci0+c3RhcnQsIHNpemUpOwotKyAgaWYgKCFidWZmZXItPnN0YXJ0KSB7Ci0rICAgIHJldHVybiBGQUxTRTsKLSsgIH0KLSsKLSsgIGJ1ZmZlci0+ZW5kID0gYnVmZmVyLT5zdGFydCArIHNpemU7Ci0rICBidWZmZXItPnB0ciA9IGJ1ZmZlci0+c3RhcnQgKyBvZmZzZXQ7Ci0rCi0rICByZXR1cm4gVFJVRTsKLSt9Ci0rCi0renJsZU91dFN0cmVhbSAqenJsZU91dFN0cmVhbU5ldyh2b2lkKQotK3sKLSsgIHpybGVPdXRTdHJlYW0gKm9zOwotKwotKyAgb3MgPSBtYWxsb2Moc2l6ZW9mKHpybGVPdXRTdHJlYW0pKTsKLSsgIGlmIChvcyA9PSBOVUxMKQotKyAgICByZXR1cm4gTlVMTDsKLSsKLSsgIGlmICghenJsZUJ1ZmZlckFsbG9jKCZvcy0+aW4sIFpSTEVfSU5fQlVGRkVSX1NJWkUpKSB7Ci0rICAgIGZyZWUob3MpOwotKyAgICByZXR1cm4gTlVMTDsKLSsgIH0KLSsKLSsgIGlmICghenJsZUJ1ZmZlckFsbG9jKCZvcy0+b3V0LCBaUkxFX09VVF9CVUZGRVJfU0laRSkpIHsKLSsgICAgenJsZUJ1ZmZlckZyZWUoJm9zLT5pbik7Ci0rICAgIGZyZWUob3MpOwotKyAgICByZXR1cm4gTlVMTDsKLSsgIH0KLSsKLSsgIG9zLT56cy56YWxsb2MgPSBaX05VTEw7Ci0rICBvcy0+enMuemZyZWUgID0gWl9OVUxMOwotKyAgb3MtPnpzLm9wYXF1ZSA9IFpfTlVMTDsKLSsgIGlmIChkZWZsYXRlSW5pdCgmb3MtPnpzLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pICE9IFpfT0spIHsKLSsgICAgenJsZUJ1ZmZlckZyZWUoJm9zLT5pbik7Ci0rICAgIGZyZWUob3MpOwotKyAgICByZXR1cm4gTlVMTDsKLSsgIH0KLSsKLSsgIHJldHVybiBvczsKLSt9Ci0rCi0rdm9pZCB6cmxlT3V0U3RyZWFtRnJlZSAoenJsZU91dFN0cmVhbSAqb3MpCi0rewotKyAgZGVmbGF0ZUVuZCgmb3MtPnpzKTsKLSsgIHpybGVCdWZmZXJGcmVlKCZvcy0+aW4pOwotKyAgenJsZUJ1ZmZlckZyZWUoJm9zLT5vdXQpOwotKyAgZnJlZShvcyk7Ci0rfQotKwotK3JmYkJvb2wgenJsZU91dFN0cmVhbUZsdXNoKHpybGVPdXRTdHJlYW0gKm9zKQotK3sKLSsgIG9zLT56cy5uZXh0X2luID0gb3MtPmluLnN0YXJ0OwotKyAgb3MtPnpzLmF2YWlsX2luID0gWlJMRV9CVUZGRVJfTEVOR1RIICgmb3MtPmluKTsKLSsgIAotKyNpZmRlZiBaUkxFX0RFQlVHCi0rICByZmJMb2coInpybGVPdXRTdHJlYW1GbHVzaDogYXZhaWxfaW4gJWRcbiIsIG9zLT56cy5hdmFpbF9pbik7Ci0rI2VuZGlmCi0rCi0rICB3aGlsZSAob3MtPnpzLmF2YWlsX2luICE9IDApIHsKLSsgICAgZG8gewotKyAgICAgIGludCByZXQ7Ci0rCi0rICAgICAgaWYgKG9zLT5vdXQucHRyID49IG9zLT5vdXQuZW5kICYmCi0rCSAgIXpybGVCdWZmZXJHcm93KCZvcy0+b3V0LCBvcy0+b3V0LmVuZCAtIG9zLT5vdXQuc3RhcnQpKSB7Ci0rCXJmYkxvZygienJsZU91dFN0cmVhbUZsdXNoOiBmYWlsZWQgdG8gZ3JvdyBvdXRwdXQgYnVmZmVyXG4iKTsKLSsJcmV0dXJuIEZBTFNFOwotKyAgICAgIH0KLSsKLSsgICAgICBvcy0+enMubmV4dF9vdXQgPSBvcy0+b3V0LnB0cjsKLSsgICAgICBvcy0+enMuYXZhaWxfb3V0ID0gb3MtPm91dC5lbmQgLSBvcy0+b3V0LnB0cjsKLSsKLSsjaWZkZWYgWlJMRV9ERUJVRwotKyAgICAgIHJmYkxvZygienJsZU91dFN0cmVhbUZsdXNoOiBjYWxsaW5nIGRlZmxhdGUsIGF2YWlsX2luICVkLCBhdmFpbF9vdXQgJWRcbiIsCi0rCSAgICAgb3MtPnpzLmF2YWlsX2luLCBvcy0+enMuYXZhaWxfb3V0KTsKLSsjZW5kaWYgCi0rCi0rICAgICAgaWYgKChyZXQgPSBkZWZsYXRlKCZvcy0+enMsIFpfU1lOQ19GTFVTSCkpICE9IFpfT0spIHsKLSsJcmZiTG9nKCJ6cmxlT3V0U3RyZWFtRmx1c2g6IGRlZmxhdGUgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZFxuIiwgcmV0KTsKLSsJcmV0dXJuIEZBTFNFOwotKyAgICAgIH0KLSsKLSsjaWZkZWYgWlJMRV9ERUJVRwotKyAgICAgIHJmYkxvZygienJsZU91dFN0cmVhbUZsdXNoOiBhZnRlciBkZWZsYXRlOiAlZCBieXRlc1xuIiwKLSsJICAgICBvcy0+enMubmV4dF9vdXQgLSBvcy0+b3V0LnB0cik7Ci0rI2VuZGlmCi0rCi0rICAgICAgb3MtPm91dC5wdHIgPSBvcy0+enMubmV4dF9vdXQ7Ci0rICAgIH0gd2hpbGUgKG9zLT56cy5hdmFpbF9vdXQgPT0gMCk7Ci0rICB9Ci0rCi0rICBvcy0+aW4ucHRyID0gb3MtPmluLnN0YXJ0OwotKyAKLSsgIHJldHVybiBUUlVFOwotK30KLSsKLStzdGF0aWMgaW50IHpybGVPdXRTdHJlYW1PdmVycnVuKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQlpbnQgICAgICAgICAgICBzaXplKQotK3sKLSsjaWZkZWYgWlJMRV9ERUJVRwotKyAgcmZiTG9nKCJ6cmxlT3V0U3RyZWFtT3ZlcnJ1blxuIik7Ci0rI2VuZGlmCi0rCi0rICB3aGlsZSAob3MtPmluLmVuZCAtIG9zLT5pbi5wdHIgPCBzaXplICYmIG9zLT5pbi5wdHIgPiBvcy0+aW4uc3RhcnQpIHsKLSsgICAgb3MtPnpzLm5leHRfaW4gPSBvcy0+aW4uc3RhcnQ7Ci0rICAgIG9zLT56cy5hdmFpbF9pbiA9IFpSTEVfQlVGRkVSX0xFTkdUSCAoJm9zLT5pbik7Ci0rCi0rICAgIGRvIHsKLSsgICAgICBpbnQgcmV0OwotKwotKyAgICAgIGlmIChvcy0+b3V0LnB0ciA+PSBvcy0+b3V0LmVuZCAmJgotKwkgICF6cmxlQnVmZmVyR3Jvdygmb3MtPm91dCwgb3MtPm91dC5lbmQgLSBvcy0+b3V0LnN0YXJ0KSkgewotKwlyZmJMb2coInpybGVPdXRTdHJlYW1PdmVycnVuOiBmYWlsZWQgdG8gZ3JvdyBvdXRwdXQgYnVmZmVyXG4iKTsKLSsJcmV0dXJuIEZBTFNFOwotKyAgICAgIH0KLSsKLSsgICAgICBvcy0+enMubmV4dF9vdXQgPSBvcy0+b3V0LnB0cjsKLSsgICAgICBvcy0+enMuYXZhaWxfb3V0ID0gb3MtPm91dC5lbmQgLSBvcy0+b3V0LnB0cjsKLSsKLSsjaWZkZWYgWlJMRV9ERUJVRwotKyAgICAgIHJmYkxvZygienJsZU91dFN0cmVhbU92ZXJydW46IGNhbGxpbmcgZGVmbGF0ZSwgYXZhaWxfaW4gJWQsIGF2YWlsX291dCAlZFxuIiwKLSsJICAgICBvcy0+enMuYXZhaWxfaW4sIG9zLT56cy5hdmFpbF9vdXQpOwotKyNlbmRpZgotKwotKyAgICAgIGlmICgocmV0ID0gZGVmbGF0ZSgmb3MtPnpzLCAwKSkgIT0gWl9PSykgewotKwlyZmJMb2coInpybGVPdXRTdHJlYW1PdmVycnVuOiBkZWZsYXRlIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIsIHJldCk7Ci0rCXJldHVybiAwOwotKyAgICAgIH0KLSsKLSsjaWZkZWYgWlJMRV9ERUJVRwotKyAgICAgIHJmYkxvZygienJsZU91dFN0cmVhbU92ZXJydW46IGFmdGVyIGRlZmxhdGU6ICVkIGJ5dGVzXG4iLAotKwkgICAgIG9zLT56cy5uZXh0X291dCAtIG9zLT5vdXQucHRyKTsKLSsjZW5kaWYKLSsKLSsgICAgICBvcy0+b3V0LnB0ciA9IG9zLT56cy5uZXh0X291dDsKLSsgICAgfSB3aGlsZSAob3MtPnpzLmF2YWlsX291dCA9PSAwKTsKLSsKLSsgICAgLyogb3V0cHV0IGJ1ZmZlciBub3QgZnVsbCAqLwotKwotKyAgICBpZiAob3MtPnpzLmF2YWlsX2luID09IDApIHsKLSsgICAgICBvcy0+aW4ucHRyID0gb3MtPmluLnN0YXJ0OwotKyAgICB9IGVsc2UgewotKyAgICAgIC8qIGJ1dCBkaWRuJ3QgY29uc3VtZSBhbGwgdGhlIGRhdGE/ICB0cnkgc2hpZnRpbmcgd2hhdCdzIGxlZnQgdG8gdGhlCi0rICAgICAgICogc3RhcnQgb2YgdGhlIGJ1ZmZlci4KLSsgICAgICAgKi8KLSsgICAgICByZmJMb2coInpybGVPdXRTdHJlYW1PdmVycnVuOiBvdXQgYnVmIG5vdCBmdWxsLCBidXQgaW4gZGF0YSBub3QgY29uc3VtZWRcbiIpOwotKyAgICAgIG1lbW1vdmUob3MtPmluLnN0YXJ0LCBvcy0+enMubmV4dF9pbiwgb3MtPmluLnB0ciAtIG9zLT56cy5uZXh0X2luKTsKLSsgICAgICBvcy0+aW4ucHRyIC09IG9zLT56cy5uZXh0X2luIC0gb3MtPmluLnN0YXJ0OwotKyAgICB9Ci0rICB9Ci0rCi0rICBpZiAoc2l6ZSA+IG9zLT5pbi5lbmQgLSBvcy0+aW4ucHRyKQotKyAgICBzaXplID0gb3MtPmluLmVuZCAtIG9zLT5pbi5wdHI7Ci0rCi0rICByZXR1cm4gc2l6ZTsKLSt9Ci0rCi0rc3RhdGljIGludCB6cmxlT3V0U3RyZWFtQ2hlY2soenJsZU91dFN0cmVhbSAqb3MsIGludCBzaXplKQotK3sKLSsgIGlmIChvcy0+aW4ucHRyICsgc2l6ZSA+IG9zLT5pbi5lbmQpIHsKLSsgICAgcmV0dXJuIHpybGVPdXRTdHJlYW1PdmVycnVuKG9zLCBzaXplKTsKLSsgIH0KLSsgIHJldHVybiBzaXplOwotK30KLSsKLSt2b2lkIHpybGVPdXRTdHJlYW1Xcml0ZUJ5dGVzKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCSAgICAgY29uc3QgenJsZV9VOCAqZGF0YSwKLSsJCQkgICAgIGludCAgICAgICAgICAgIGxlbmd0aCkKLSt7Ci0rICBjb25zdCB6cmxlX1U4KiBkYXRhRW5kID0gZGF0YSArIGxlbmd0aDsKLSsgIHdoaWxlIChkYXRhIDwgZGF0YUVuZCkgewotKyAgICBpbnQgbiA9IHpybGVPdXRTdHJlYW1DaGVjayhvcywgZGF0YUVuZCAtIGRhdGEpOwotKyAgICBtZW1jcHkob3MtPmluLnB0ciwgZGF0YSwgbik7Ci0rICAgIG9zLT5pbi5wdHIgKz0gbjsKLSsgICAgZGF0YSArPSBuOwotKyAgfQotK30KLSsKLSt2b2lkIHpybGVPdXRTdHJlYW1Xcml0ZVU4KHpybGVPdXRTdHJlYW0gKm9zLCB6cmxlX1U4IHUpCi0rewotKyAgenJsZU91dFN0cmVhbUNoZWNrKG9zLCAxKTsKLSsgICpvcy0+aW4ucHRyKysgPSB1OwotK30KLSsKLSt2b2lkIHpybGVPdXRTdHJlYW1Xcml0ZU9wYXF1ZTgoenJsZU91dFN0cmVhbSAqb3MsIHpybGVfVTggdSkKLSt7Ci0rICB6cmxlT3V0U3RyZWFtQ2hlY2sob3MsIDEpOwotKyAgKm9zLT5pbi5wdHIrKyA9IHU7Ci0rfQotKwotK3ZvaWQgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMTYgKHpybGVPdXRTdHJlYW0gKm9zLCB6cmxlX1UxNiB1KQotK3sKLSsgIHpybGVPdXRTdHJlYW1DaGVjayhvcywgMik7Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMF07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMV07Ci0rfQotKwotK3ZvaWQgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMzIgKHpybGVPdXRTdHJlYW0gKm9zLCB6cmxlX1UzMiB1KQotK3sKLSsgIHpybGVPdXRTdHJlYW1DaGVjayhvcywgNCk7Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMF07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMV07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMl07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbM107Ci0rfQotKwotK3ZvaWQgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMjRBKHpybGVPdXRTdHJlYW0gKm9zLCB6cmxlX1UzMiB1KQotK3sKLSsgIHpybGVPdXRTdHJlYW1DaGVjayhvcywgMyk7Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMF07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMV07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMl07Ci0rfQotKwotK3ZvaWQgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMjRCKHpybGVPdXRTdHJlYW0gKm9zLCB6cmxlX1UzMiB1KQotK3sKLSsgIHpybGVPdXRTdHJlYW1DaGVjayhvcywgMyk7Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMV07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbMl07Ci0rICAqb3MtPmluLnB0cisrID0gKCh6cmxlX1U4KikmdSlbM107Ci0rfQotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvenJsZW91dHN0cmVhbS5oIHZuY191bml4c3JjL3ZuY3ZpZXdlci96cmxlb3V0c3RyZWFtLmgKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci96cmxlb3V0c3RyZWFtLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZW91dHN0cmVhbS5oCTIwMDQtMDUtMjUgMDY6MDU6MTUuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMCwwICsxLDYyIEBACi0rLyoKLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKyAqIENvcHlyaWdodCAoQykgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0rICoKLSsgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0rICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSsgKgotKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKyAqCi0rICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSsgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCi0rICogVVNBLgotKyAqLwotKwotKyNpZm5kZWYgX19aUkxFX09VVF9TVFJFQU1fSF9fCi0rI2RlZmluZSBfX1pSTEVfT1VUX1NUUkVBTV9IX18KLSsKLSsjaW5jbHVkZSA8emxpYi5oPgotKyNpbmNsdWRlICJ6cmxldHlwZXMuaCIKLSsjaW5jbHVkZSAicmZiL3JmYi5oIgotKwotK3R5cGVkZWYgc3RydWN0IHsKLSsgIHpybGVfVTggKnN0YXJ0OwotKyAgenJsZV9VOCAqcHRyOwotKyAgenJsZV9VOCAqZW5kOwotK30genJsZUJ1ZmZlcjsKLSsKLSt0eXBlZGVmIHN0cnVjdCB7Ci0rICB6cmxlQnVmZmVyIGluOwotKyAgenJsZUJ1ZmZlciBvdXQ7Ci0rCi0rICB6X3N0cmVhbSAgIHpzOwotK30genJsZU91dFN0cmVhbTsKLSsKLSsjZGVmaW5lIFpSTEVfQlVGRkVSX0xFTkdUSChiKSAoKGIpLT5wdHIgLSAoYiktPnN0YXJ0KQotKwotK3pybGVPdXRTdHJlYW0gKnpybGVPdXRTdHJlYW1OZXcgICAgICAgICAgICh2b2lkKTsKLSt2b2lkICAgICAgICAgICB6cmxlT3V0U3RyZWFtRnJlZSAgICAgICAgICAoenJsZU91dFN0cmVhbSAqb3MpOwotK3JmYkJvb2wgICAgICAgIHpybGVPdXRTdHJlYW1GbHVzaCAgICAgICAgICh6cmxlT3V0U3RyZWFtICpvcyk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlQnl0ZXMgICAgKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgY29uc3QgenJsZV9VOCAqZGF0YSwKLSsJCQkJCSAgIGludCAgICAgICAgICAgIGxlbmd0aCk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlVTggICAgICAgKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VOCAgICAgICAgdSk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlOCAgKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VOCAgICAgICAgdSk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMTYgKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VMTYgICAgICAgdSk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMzIgKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VMzIgICAgICAgdSk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMjRBKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VMzIgICAgICAgdSk7Ci0rdm9pZCAgICAgICAgICAgenJsZU91dFN0cmVhbVdyaXRlT3BhcXVlMjRCKHpybGVPdXRTdHJlYW0gKm9zLAotKwkJCQkJICAgenJsZV9VMzIgICAgICAgdSk7Ci0rCi0rI2VuZGlmIC8qIF9fWlJMRV9PVVRfU1RSRUFNX0hfXyAqLwotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuYyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuYwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGVwYWxldHRlaGVscGVyLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuYwkyMDA0LTA1LTI1IDA2OjA1OjE1LjAwMDAwMDAwMCAtMDQwMAotQEAgLTAsMCArMSw2MiBAQAotKy8qCi0rICogQ29weXJpZ2h0IChDKSAyMDAyIFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotKyAqCi0rICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rICoKLSsgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsgKgotKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotKyAqIFVTQS4KLSsgKi8KLSsKLSsjaW5jbHVkZSAienJsZXBhbGV0dGVoZWxwZXIuaCIKLSsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0rI2luY2x1ZGUgPHN0cmluZy5oPgotKwotKyNkZWZpbmUgWlJMRV9IQVNIKHBpeCkgKCgocGl4KSBeICgocGl4KSA+PiAxNykpICYgNDA5NSkKLSsKLSt2b2lkIHpybGVQYWxldHRlSGVscGVySW5pdCh6cmxlUGFsZXR0ZUhlbHBlciAqaGVscGVyKQotK3sKLSsgIG1lbXNldChoZWxwZXItPnBhbGV0dGUsIDAsIHNpemVvZihoZWxwZXItPnBhbGV0dGUpKTsKLSsgIG1lbXNldChoZWxwZXItPmluZGV4LCAyNTUsIHNpemVvZihoZWxwZXItPmluZGV4KSk7Ci0rICBtZW1zZXQoaGVscGVyLT5rZXksIDAsIHNpemVvZihoZWxwZXItPmtleSkpOwotKyAgaGVscGVyLT5zaXplID0gMDsKLSt9Ci0rCi0rdm9pZCB6cmxlUGFsZXR0ZUhlbHBlckluc2VydCh6cmxlUGFsZXR0ZUhlbHBlciAqaGVscGVyLCB6cmxlX1UzMiBwaXgpCi0rewotKyAgaWYgKGhlbHBlci0+c2l6ZSA8IFpSTEVfUEFMRVRURV9NQVhfU0laRSkgewotKyAgICBpbnQgaSA9IFpSTEVfSEFTSChwaXgpOwotKwotKyAgICB3aGlsZSAoaGVscGVyLT5pbmRleFtpXSAhPSAyNTUgJiYgaGVscGVyLT5rZXlbaV0gIT0gcGl4KQotKyAgICAgIGkrKzsKLSsgICAgaWYgKGhlbHBlci0+aW5kZXhbaV0gIT0gMjU1KSByZXR1cm47Ci0rCi0rICAgIGhlbHBlci0+aW5kZXhbaV0gPSBoZWxwZXItPnNpemU7Ci0rICAgIGhlbHBlci0+a2V5W2ldID0gcGl4OwotKyAgICBoZWxwZXItPnBhbGV0dGVbaGVscGVyLT5zaXplXSA9IHBpeDsKLSsgIH0KLSsgIGhlbHBlci0+c2l6ZSsrOwotK30KLSsKLStpbnQgenJsZVBhbGV0dGVIZWxwZXJMb29rdXAoenJsZVBhbGV0dGVIZWxwZXIgKmhlbHBlciwgenJsZV9VMzIgcGl4KQotK3sKLSsgIGludCBpID0gWlJMRV9IQVNIKHBpeCk7Ci0rCi0rICBhc3NlcnQoaGVscGVyLT5zaXplIDw9IFpSTEVfUEFMRVRURV9NQVhfU0laRSk7Ci0rICAKLSsgIHdoaWxlIChoZWxwZXItPmluZGV4W2ldICE9IDI1NSAmJiBoZWxwZXItPmtleVtpXSAhPSBwaXgpCi0rICAgIGkrKzsKLSsgIGlmIChoZWxwZXItPmluZGV4W2ldICE9IDI1NSkgcmV0dXJuIGhlbHBlci0+aW5kZXhbaV07Ci0rCi0rICByZXR1cm4gLTE7Ci0rfQotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuaCB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuaAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGVwYWxldHRlaGVscGVyLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvenJsZXBhbGV0dGVoZWxwZXIuaAkyMDA0LTA1LTI1IDA2OjA1OjE1LjAwMDAwMDAwMCAtMDQwMAotQEAgLTAsMCArMSw0NiBAQAotKy8qCi0rICogQ29weXJpZ2h0IChDKSAyMDAyIFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotKyAqCi0rICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rICoKLSsgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsgKgotKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotKyAqIFVTQS4KLSsgKi8KLSsKLSsvKgotKyAqIFRoZSBQYWxldHRlSGVscGVyIGNsYXNzIGhlbHBzIHVzIGJ1aWxkIHVwIHRoZSBwYWxldHRlIGZyb20gcGl4ZWwgZGF0YSBieQotKyAqIHN0b3JpbmcgYSByZXZlcnNlIGluZGV4IHVzaW5nIGEgc2ltcGxlIGhhc2gtdGFibGUKLSsgKi8KLSsKLSsjaWZuZGVmIF9fWlJMRV9QQUxFVFRFX0hFTFBFUl9IX18KLSsjZGVmaW5lIF9fWlJMRV9QQUxFVFRFX0hFTFBFUl9IX18KLSsKLSsjaW5jbHVkZSAienJsZXR5cGVzLmgiCi0rCi0rI2RlZmluZSBaUkxFX1BBTEVUVEVfTUFYX1NJWkUgMTI3Ci0rCi0rdHlwZWRlZiBzdHJ1Y3QgewotKyAgenJsZV9VMzIgIHBhbGV0dGVbWlJMRV9QQUxFVFRFX01BWF9TSVpFXTsKLSsgIHpybGVfVTggICBpbmRleFtaUkxFX1BBTEVUVEVfTUFYX1NJWkUgKyA0MDk2XTsKLSsgIHpybGVfVTMyICBrZXlbWlJMRV9QQUxFVFRFX01BWF9TSVpFICsgNDA5Nl07Ci0rICBpbnQgICAgICAgc2l6ZTsKLSt9IHpybGVQYWxldHRlSGVscGVyOwotKwotK3ZvaWQgenJsZVBhbGV0dGVIZWxwZXJJbml0ICAoenJsZVBhbGV0dGVIZWxwZXIgKmhlbHBlcik7Ci0rdm9pZCB6cmxlUGFsZXR0ZUhlbHBlckluc2VydCh6cmxlUGFsZXR0ZUhlbHBlciAqaGVscGVyLAotKwkJCSAgICAgenJsZV9VMzIgICAgICAgICAgIHBpeCk7Ci0raW50ICB6cmxlUGFsZXR0ZUhlbHBlckxvb2t1cCh6cmxlUGFsZXR0ZUhlbHBlciAqaGVscGVyLAotKwkJCSAgICAgenJsZV9VMzIgICAgICAgICAgIHBpeCk7Ci0rCi0rI2VuZGlmIC8qIF9fWlJMRV9QQUxFVFRFX0hFTFBFUl9IX18gKi8KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGV0eXBlcy5oIHZuY191bml4c3JjL3ZuY3ZpZXdlci96cmxldHlwZXMuaAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3pybGV0eXBlcy5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3pybGV0eXBlcy5oCTIwMDQtMDUtMjUgMDY6MDU6MTUuMDAwMDAwMDAwIC0wNDAwCi1AQCAtMCwwICsxLDMwIEBACi0rLyoKLSsgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKyAqCi0rICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rICoKLSsgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsgKgotKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotKyAqIFVTQS4KLSsgKi8KLSsKLSsjaWZuZGVmIF9fWlJMRV9UWVBFU19IX18KLSsjZGVmaW5lIF9fWlJMRV9UWVBFU19IX18KLSsKLSt0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHpybGVfVTg7Ci0rdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB6cmxlX1UxNjsKLSt0eXBlZGVmIHVuc2lnbmVkIGludCAgIHpybGVfVTMyOwotK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgenJsZV9TODsKLSt0eXBlZGVmIHNpZ25lZCBzaG9ydCAgIHpybGVfUzE2OwotK3R5cGVkZWYgc2lnbmVkIGludCAgICAgenJsZV9TMzI7Ci0rCi0rI2VuZGlmIC8qIF9fWlJMRV9UWVBFU19IX18gKi8KLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3p5d3JsZXRlbXBsYXRlLmMgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3p5d3JsZXRlbXBsYXRlLmMKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci96eXdybGV0ZW1wbGF0ZS5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3p5d3JsZXRlbXBsYXRlLmMJMjAwOC0wMi0xNSAyMzozMzoxMy4wMDAwMDAwMDAgLTA1MDAKLUBAIC0wLDAgKzEsODI0IEBACi0rCi0rLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICogVEhJUyBGSUxFIElTIFBBUlQgT0YgVEhFICdaWVdSTEUnIFZOQyBDT0RFQyBTT1VSQ0UgQ09ERS4gICAgICAgICAqCi0rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICogVVNFLCBESVNUUklCVVRJT04gQU5EIFJFUFJPRFVDVElPTiBPRiBUSElTIExJQlJBUlkgU09VUkNFIElTICAgICAqCi0rICogR09WRVJORUQgQlkgQSBGT0xMT1dJTkcgQlNELVNUWUxFIFNPVVJDRSBMSUNFTlNFLiAgICAgICAgICAgICAgICAqCi0rICogUExFQVNFIFJFQUQgVEhFU0UgVEVSTVMgQkVGT1JFIERJU1RSSUJVVElORy4gICAgICAgICAgICAgICAgICAgICAqCi0rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICogVEhFICdaWVdSTEUnIFZOQyBDT0RFQyBTT1VSQ0UgQ09ERSBJUyAoQykgQ09QWVJJR0hUIDIwMDYgICAgICAgICAqCi0rICogQlkgSGl0YWNoaSBTeXN0ZW1zICYgU2VydmljZXMsIEx0ZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICogKE5vcmlha2kgWWFtYXpha2ksIFJlc2VhcmNoICYgRGV2ZWxvcGVtZW50IENlbnRlcikgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0rICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0rUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0rbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0rYXJlIG1ldDoKLSsKLSstIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0rbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKwotKy0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLStub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0rZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSsKLSstIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEhpdGFjaGkgU3lzdGVtcyAmIFNlcnZpY2VzLCBMdGQuIG5vcgotK3RoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotK3Blcm1pc3Npb24uCi0rCi0rVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotK2BgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLStMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLStBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OCi0rT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0rU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSsoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLStPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSsKLSsvKiBDaGFuZ2UgTG9nOgotKyAgICAgVjAuMDIgOiAyMDA4LzAyLzA0IDogRml4IG1pcyBlbmNvZGUvZGVjb2RlIHdoZW4gd2lkdGggIT0gc2NhbmxpbmUKLSsJICAgICAgICAgICAgICAgICAgICAgKFRoYW5rcyBKb2hhbm5lcyBTY2hpbmRlbGluLCBhdXRob3Igb2YgTGliVk5DCi0rCQkJCQkJICBTZXJ2ZXIvQ2xpZW50KQotKyAgICAgVjAuMDEgOiAyMDA3LzAyLzA2IDogSW5pdGlhbCByZWxlYXNlCi0rKi8KLSsKLSsvKiAjZGVmaW5lIFpZV1JMRV9FTkNPREUgKi8KLSsvKiAjZGVmaW5lIFpZV1JMRV9ERUNPREUgKi8KLSsjZGVmaW5lIFpZV1JMRV9RVUFOVElaRQotKwotKy8qCi0rW1JlZmVyZW5jZXNdCi0rIFBMSGFycjoKLSsgICBTZW5lY2FsLCBKLiBHLiwgUC4gTGluZHN0cm9tLCBNLiBBLiBEdWNoYWluZWF1LCBhbmQgSy4gSS4gSm95LCAiQW4gSW1wcm92ZWQgTi1CaXQgdG8gTi1CaXQgUmV2ZXJzaWJsZSBIYWFyLUxpa2UgVHJhbnNmb3JtLCIgUGFjaWZpYyBHcmFwaGljcyAyMDA0LCBPY3RvYmVyIDIwMDQsIHBwLiAzNzEtMzgwLgotKyBFWlc6Ci0rICAgU2hhcGlybywgSk06IEVtYmVkZGVkIEltYWdlIENvZGluZyBVc2luZyBaZXJvdHJlZXMgb2YgV2F2ZWxldCBDb2VmZmljaWVudHMsIElFRUUgVHJhbnMuIFNpZ25hbC4gUHJvY2Vzcy4sIFZvbC40MSwgcHAuMzQ0NS0zNDYyICgxOTkzKS4KLSsqLwotKwotKwotKy8qIFRlbXBsYXRlIE1hY3JvIHN0dWZmcy4gKi8KLSsjdW5kZWYgWllXUkxFX0FOQUxZWkUKLSsjdW5kZWYgWllXUkxFX1NZTlRIRVNJWkUKLSsjZGVmaW5lIFpZV1JMRV9BTkFMWVpFIF9fUkZCX0NPTkNBVDNFKHp5d3JsZUFuYWx5emUsQlBQLEVORF9GSVgpCi0rI2RlZmluZSBaWVdSTEVfU1lOVEhFU0laRSBfX1JGQl9DT05DQVQzRSh6eXdybGVTeW50aGVzaXplLEJQUCxFTkRfRklYKQotKwotKyNkZWZpbmUgWllXUkxFX1JHQllVViBfX1JGQl9DT05DQVQzRSh6eXdybGVSR0JZVVYsQlBQLEVORF9GSVgpCi0rI2RlZmluZSBaWVdSTEVfWVVWUkdCIF9fUkZCX0NPTkNBVDNFKHp5d3JsZVlVVlJHQixCUFAsRU5EX0ZJWCkKLSsjZGVmaW5lIFpZV1JMRV9ZTUFTSyBfX1JGQl9DT05DQVQyRShaWVdSTEVfWU1BU0ssQlBQKQotKyNkZWZpbmUgWllXUkxFX1VWTUFTSyBfX1JGQl9DT05DQVQyRShaWVdSTEVfVVZNQVNLLEJQUCkKLSsjZGVmaW5lIFpZV1JMRV9MT0FEX1BJWEVMIF9fUkZCX0NPTkNBVDJFKFpZV1JMRV9MT0FEX1BJWEVMLEJQUCkKLSsjZGVmaW5lIFpZV1JMRV9TQVZFX1BJWEVMIF9fUkZCX0NPTkNBVDJFKFpZV1JMRV9TQVZFX1BJWEVMLEJQUCkKLSsKLSsvKiBQYWNraW5nL1VucGFja2luZyBwaXhlbCBzdHVmZnMuCi0rICAgRW5kaWFuIGNvbnZlcnNpb24gc3R1ZmZzLiAqLwotKyN1bmRlZiBTXzAKLSsjdW5kZWYgU18xCi0rI3VuZGVmIExfMAotKyN1bmRlZiBMXzEKLSsjdW5kZWYgTF8yCi0rI2lmIFpZV1JMRV9FTkRJQU4gPT0gRU5ESUFOX0JJRwotKyMgIGRlZmluZSBTXzAJMQotKyMgIGRlZmluZSBTXzEJMAotKyMgIGRlZmluZSBMXzAJMwotKyMgIGRlZmluZSBMXzEJMgotKyMgIGRlZmluZSBMXzIJMQotKyNlbHNlCi0rIyAgZGVmaW5lIFNfMAkwCi0rIyAgZGVmaW5lIFNfMQkxCi0rIyAgZGVmaW5lIExfMAkwCi0rIyAgZGVmaW5lIExfMQkxCi0rIyAgZGVmaW5lIExfMgkyCi0rI2VuZGlmCi0rCi0rLyogICBMb2FkL1NhdmUgcGl4ZWwgc3R1ZmZzLiAqLwotKyNkZWZpbmUgWllXUkxFX1lNQVNLMTUgIDB4RkZGRkZGRjgKLSsjZGVmaW5lIFpZV1JMRV9VVk1BU0sxNSAweEZGRkZGRkY4Ci0rI2RlZmluZSBaWVdSTEVfTE9BRF9QSVhFTDE1KHBTcmMsUixHLEIpIHsgXAotKwlSID0gICgoKHVuc2lnbmVkIGNoYXIqKXBTcmMpW1NfMV08PCAxKSYgMHhGODsJXAotKwlHID0gKCgoKHVuc2lnbmVkIGNoYXIqKXBTcmMpW1NfMV08PCA2KXwoKCh1bnNpZ25lZCBjaGFyKilwU3JjKVtTXzBdPj4gMikpJiAweEY4OwlcCi0rCUIgPSAgKCgodW5zaWduZWQgY2hhciopcFNyYylbU18wXTw8IDMpJiAweEY4OwlcCi0rfQotKyNkZWZpbmUgWllXUkxFX1NBVkVfUElYRUwxNShwRHN0LFIsRyxCKSB7IFwKLSsJUiAmPSAweEY4OwlcCi0rCUcgJj0gMHhGODsJXAotKwlCICY9IDB4Rjg7CVwKLSsJKCh1bnNpZ25lZCBjaGFyKilwRHN0KVtTXzFdID0gKHVuc2lnbmVkIGNoYXIpKCAoUj4+MSl8KEc+PjYpICAgICAgICk7CVwKLSsJKCh1bnNpZ25lZCBjaGFyKilwRHN0KVtTXzBdID0gKHVuc2lnbmVkIGNoYXIpKCgoQj4+Myl8KEc8PDIpKSYgMHhGRik7CVwKLSt9Ci0rI2RlZmluZSBaWVdSTEVfWU1BU0sxNiAgMHhGRkZGRkZGQwotKyNkZWZpbmUgWllXUkxFX1VWTUFTSzE2IDB4RkZGRkZGRjgKLSsjZGVmaW5lIFpZV1JMRV9MT0FEX1BJWEVMMTYocFNyYyxSLEcsQikgeyBcCi0rCVIgPSAgICgodW5zaWduZWQgY2hhciopcFNyYylbU18xXSAgICAgJiAweEY4OwlcCi0rCUcgPSAoKCgodW5zaWduZWQgY2hhciopcFNyYylbU18xXTw8IDUpfCgoKHVuc2lnbmVkIGNoYXIqKXBTcmMpW1NfMF0+PiAzKSkmIDB4RkM7CVwKLSsJQiA9ICAoKCh1bnNpZ25lZCBjaGFyKilwU3JjKVtTXzBdPDwgMykmIDB4Rjg7CVwKLSt9Ci0rI2RlZmluZSBaWVdSTEVfU0FWRV9QSVhFTDE2KHBEc3QsUixHLEIpIHsgXAotKwlSICY9IDB4Rjg7CVwKLSsJRyAmPSAweEZDOwlcCi0rCUIgJj0gMHhGODsJXAotKwkoKHVuc2lnbmVkIGNoYXIqKXBEc3QpW1NfMV0gPSAodW5zaWduZWQgY2hhcikoICBSICAgIHwoRz4+NSkgICAgICAgKTsJXAotKwkoKHVuc2lnbmVkIGNoYXIqKXBEc3QpW1NfMF0gPSAodW5zaWduZWQgY2hhcikoKChCPj4zKXwoRzw8MykpJiAweEZGKTsJXAotK30KLSsjZGVmaW5lIFpZV1JMRV9ZTUFTSzMyICAweEZGRkZGRkZGCi0rI2RlZmluZSBaWVdSTEVfVVZNQVNLMzIgMHhGRkZGRkZGRgotKyNkZWZpbmUgWllXUkxFX0xPQURfUElYRUwzMihwU3JjLFIsRyxCKSB7IFwKLSsJUiA9ICgodW5zaWduZWQgY2hhciopcFNyYylbTF8yXTsJXAotKwlHID0gKCh1bnNpZ25lZCBjaGFyKilwU3JjKVtMXzFdOwlcCi0rCUIgPSAoKHVuc2lnbmVkIGNoYXIqKXBTcmMpW0xfMF07CVwKLSt9Ci0rI2RlZmluZSBaWVdSTEVfU0FWRV9QSVhFTDMyKHBEc3QsUixHLEIpIHsgXAotKwkoKHVuc2lnbmVkIGNoYXIqKXBEc3QpW0xfMl0gPSAodW5zaWduZWQgY2hhcilSOwlcCi0rCSgodW5zaWduZWQgY2hhciopcERzdClbTF8xXSA9ICh1bnNpZ25lZCBjaGFyKUc7CVwKLSsJKCh1bnNpZ25lZCBjaGFyKilwRHN0KVtMXzBdID0gKHVuc2lnbmVkIGNoYXIpQjsJXAotK30KLSsKLSsjaWZuZGVmIFpZV1JMRV9PTkNFCi0rI2RlZmluZSBaWVdSTEVfT05DRQotKwotKyNpZmRlZiBXSU4zMgotKyNkZWZpbmUgSW5saW5lWCBfX2lubGluZQotKyNlbHNlCi0rI2RlZmluZSBJbmxpbmVYIGlubGluZQotKyNlbmRpZgotKwotKyNpZmRlZiBaWVdSTEVfRU5DT0RFCi0rLyogVGFibGVzIGZvciBDb2VmZmljaWVudHMgZmlsdGVyaW5nLiAqLwotKyMgIGlmbmRlZiBaWVdSTEVfUVVBTlRJWkUKLSsvKiBUeXBlIEE6bG93ZXIgYml0IG9taXR0aW5nIG9mIEVaVyBzdHlsZS4gKi8KLStjb25zdCBzdGF0aWMgdW5zaWduZWQgaW50IHp5d3JsZVBhcmFtWzNdWzNdPXsKLSsJezB4MDAwMEYwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKLSsJezB4MDAwMEMwMDAsMHgwMEYwRjBGMCwweDAwMDAwMDAwfSwKLSsJezB4MDAwMEMwMDAsMHgwMEMwQzBDMCwweDAwRjBGMEYwfSwKLSsvKgl7MHgwMDAwRkYwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAotKwl7MHgwMDAwRkYwMCwweDAwRkZGRkZGLDB4MDAwMDAwMDB9LAotKwl7MHgwMDAwRkYwMCwweDAwRkZGRkZGLDB4MDBGRkZGRkZ9LCAqLwotK307Ci0rIyAgZWxzZQotKy8qIFR5cGUgQjpOb24gbGluZXIgcXVhbnRpemF0aW9uIGZpbHRlci4gKi8KLStzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgenl3cmxlQ29udls0XVsyNTZdPXsKLSt7CS8qIGJpPTUsIGJvPTUgcj0wLjA6UFNOUj0yNC44NDkgKi8KLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSt9LAotK3sJLyogYmk9NSwgYm89NSByPTIuMDpQU05SPTc0LjAzMSAqLwotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAzMiwKLSsJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAotKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCi0rCTQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSsJNDgsIDQ4LCA0OCwgNTYsIDU2LCA1NiwgNTYsIDU2LAotKwk1NiwgNTYsIDU2LCA1NiwgNjQsIDY0LCA2NCwgNjQsCi0rCTY0LCA2NCwgNjQsIDY0LCA3MiwgNzIsIDcyLCA3MiwKLSsJNzIsIDcyLCA3MiwgNzIsIDgwLCA4MCwgODAsIDgwLAotKwk4MCwgODAsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsCi0rCTg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDk2LCA5NiwKLSsJOTYsIDk2LCA5NiwgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsCi0rCTEwNCwgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMTIsIDExMiwgMTEyLAotKwkxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMjAsIDEyMCwKLSsJMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsCi0rCTAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsCi0rCS0xMjAsIC0xMjAsIC0xMjAsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsCi0rCS0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsCi0rCS0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC05NiwgLTk2LAotKwktOTYsIC05NiwgLTk2LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwKLSsJLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODAsCi0rCS04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtNzIsIC03MiwgLTcyLAotKwktNzIsIC03MiwgLTcyLCAtNzIsIC03MiwgLTY0LCAtNjQsIC02NCwKLSsJLTY0LCAtNjQsIC02NCwgLTY0LCAtNjQsIC01NiwgLTU2LCAtNTYsCi0rCS01NiwgLTU2LCAtNTYsIC01NiwgLTU2LCAtNTYsIC00OCwgLTQ4LAotKwktNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwKLSsJLTQ4LCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsCi0rCS0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLAotKwktMzIsIC0zMiwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSt9LAotK3sJLyogYmk9NSwgYm89NCByPTIuMDpQU05SPTY0LjQ0MSAqLwotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwk0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCi0rCTQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKLSsJNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAotKwk2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCi0rCTY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSsJODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAotKwk4MCwgODAsIDgwLCA4MCwgODAsIDg4LCA4OCwgODgsCi0rCTg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwKLSsJMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsCi0rCTEwNCwgMTA0LCAxMDQsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLAotKwkxMTIsIDExMiwgMTEyLCAxMTIsIDEyMCwgMTIwLCAxMjAsIDEyMCwKLSsJMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsCi0rCTAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsCi0rCS0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMjAsIC0xMTIsIC0xMTIsIC0xMTIsCi0rCS0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMDQsIC0xMDQsCi0rCS0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsIC0xMDQsCi0rCS0xMDQsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwKLSsJLTg4LCAtODgsIC04OCwgLTg4LCAtODAsIC04MCwgLTgwLCAtODAsCi0rCS04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLAotKwktODAsIC02NCwgLTY0LCAtNjQsIC02NCwgLTY0LCAtNjQsIC02NCwKLSsJLTY0LCAtNjQsIC02NCwgLTY0LCAtNjQsIC02NCwgLTY0LCAtNjQsCi0rCS02NCwgLTQ4LCAtNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwgLTQ4LAotKwktNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwKLSsJLTQ4LCAtNDgsIC00OCwgLTQ4LCAtNDgsIC00OCwgLTQ4LCAtNDgsCi0rCS00OCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSsJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSt9LAotK3sJLyogYmk9NSwgYm89MiByPTIuMDpQU05SPTQzLjE3NSAqLwotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwk4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsCi0rCTg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwKLSsJODgsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LAotKwk4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsCi0rCTg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwKLSsJODgsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LAotKwk4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwgODgsCi0rCTg4LCA4OCwgODgsIDg4LCA4OCwgODgsIDg4LCA4OCwKLSsJMCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LAotKwktODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwKLSsJLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsCi0rCS04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LAotKwktODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwKLSsJLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsCi0rCS04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LAotKwktODgsIC04OCwgLTg4LCAtODgsIC04OCwgLTg4LCAtODgsIC04OCwKLSsJLTg4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotK30KLSt9OwotK2NvbnN0IHN0YXRpYyBzaWduZWQgY2hhciogenl3cmxlUGFyYW1bM11bM11bM109ewotKwl7e3p5d3JsZUNvbnZbMF0senl3cmxlQ29udlsyXSx6eXdybGVDb252WzBdfSx7enl3cmxlQ29udlswXSx6eXdybGVDb252WzBdLHp5d3JsZUNvbnZbMF19LHt6eXdybGVDb252WzBdLHp5d3JsZUNvbnZbMF0senl3cmxlQ29udlswXX19LAotKwl7e3p5d3JsZUNvbnZbMF0senl3cmxlQ29udlszXSx6eXdybGVDb252WzBdfSx7enl3cmxlQ29udlsxXSx6eXdybGVDb252WzFdLHp5d3JsZUNvbnZbMV19LHt6eXdybGVDb252WzBdLHp5d3JsZUNvbnZbMF0senl3cmxlQ29udlswXX19LAotKwl7e3p5d3JsZUNvbnZbMF0senl3cmxlQ29udlszXSx6eXdybGVDb252WzBdfSx7enl3cmxlQ29udlsyXSx6eXdybGVDb252WzJdLHp5d3JsZUNvbnZbMl19LHt6eXdybGVDb252WzFdLHp5d3JsZUNvbnZbMV0senl3cmxlQ29udlsxXX19LAotK307Ci0rIyAgZW5kaWYKLSsjZW5kaWYKLSsKLStzdGF0aWMgSW5saW5lWCB2b2lkIEhhcnIoc2lnbmVkIGNoYXIqIHBYMCwgc2lnbmVkIGNoYXIqIHBYMSkKLSt7Ci0rCS8qIFBpZWNld2lzZS1MaW5lYXIgSGFycihQTEhhcnIpICovCi0rCWludCBYMCA9IChpbnQpKnBYMCwgWDEgPSAoaW50KSpwWDE7Ci0rCWludCBvcmdYMCA9IFgwLCBvcmdYMSA9IFgxOwotKwlpZiAoKFgwIF4gWDEpICYgMHg4MCkgewotKwkJLyogZGlmZmVyIHNpZ24gKi8KLSsJCVgxICs9IFgwOwotKwkJaWYgKCgoWDFeb3JnWDEpJjB4ODApPT0wKSB7Ci0rCQkJLyogfFgxfCA+IHxYMHwgKi8KLSsJCQlYMCAtPSBYMTsJLyogSCA9IC1CICovCi0rCQl9Ci0rCX0gZWxzZSB7Ci0rCQkvKiBzYW1lIHNpZ24gKi8KLSsJCVgwIC09IFgxOwotKwkJaWYgKCgoWDAgXiBvcmdYMCkgJiAweDgwKSA9PSAwKSB7Ci0rCQkJLyogfFgwfCA+IHxYMXwgKi8KLSsJCQlYMSArPSBYMDsJLyogTCA9IEEgKi8KLSsJCX0KLSsJfQotKwkqcFgwID0gKHNpZ25lZCBjaGFyKVgxOwotKwkqcFgxID0gKHNpZ25lZCBjaGFyKVgwOwotK30KLSsvKgotKyAxRC1XYXZlbGV0IHRyYW5zZm9ybS4KLSsKLSsgSW4gY29lZmZpY2llbnRzIGFycmF5LCB0aGUgZmFtb3VzICdweXJhbWlkJyBkZWNvbXBvc2l0aW9uIGlzIHdlbGwgdXNlZC4KLSsKLSsgMUQgTW9kZWw6Ci0rICAgfEwwTDBMMEwwfEwwTDBMMEwwfEgwSDBIMEgwfEgwSDBIMEgwfCA6IGxldmVsIDAKLSsgICB8TDFMMUwxTDF8SDFIMUgxSDF8SDBIMEgwSDB8SDBIMEgwSDB8IDogbGV2ZWwgMQotKwotKyBCdXQgdGhpcyBtZXRob2QgbmVlZHMgbGluZSBidWZmZXIgYmVjYXVzZSBIL0wgaXMgZGlmZmVyZW50IHBvc2l0aW9uIGZyb20gWDAvWDEuCi0rIFNvLCBJIHVzZWQgJ2ludGVybGVhdmUnIGRlY29tcG9zaXRpb24gaW5zdGVhZCBvZiBpdC4KLSsKLSsgMUQgTW9kZWw6Ci0rICAgfEwwSDBMMEgwfEwwSDBMMEgwfEwwSDBMMEgwfEwwSDBMMEgwfCA6IGxldmVsIDAKLSsgICB8TDFIMEgxSDB8TDFIMEgxSDB8TDFIMEgxSDB8TDFIMEgxSDB8IDogbGV2ZWwgMQotKwotKyBJbiB0aGlzIG1ldGhvZCwgSC9MIGFuZCBYMC9YMSBpcyBhbHdheXMgc2FtZSBwb3NpdGlvbi4KLSsgVGhpcyBsZWFkIHVzIHRvIG1vcmUgc3BlZWQgYW5kIGxlc3MgbWVtb3J5LgotKyBPZiBjYXVzZSwgdGhlIHJlc3VsdCBvZiBib3RoIG1ldGhvZCBpcyBxdWl0ZSBzYW1lCi0rIGJlY2F1c2UgaXQncyBvbmx5IGRpZmZlcmVuY2UgdGhhdCBjb2VmZmljaWVudCBwb3NpdGlvbi4KLSsqLwotK3N0YXRpYyBJbmxpbmVYIHZvaWQgV2F2ZWxldExldmVsKGludCogZGF0YSwgaW50IHNpemUsIGludCBsLCBpbnQgU2tpcFBpeGVsKQotK3sKLSsJaW50IHMsIG9mczsKLSsJc2lnbmVkIGNoYXIqIHBYMDsKLSsJc2lnbmVkIGNoYXIqIGVuZDsKLSsKLSsJcFgwID0gKHNpZ25lZCBjaGFyKilkYXRhOwotKwlzID0gKDg8PGwpKlNraXBQaXhlbDsKLSsJZW5kID0gcFgwKyhzaXplPj4obCsxKSkqczsKLSsJcyAtPSAyOwotKwlvZnMgPSAoNDw8bCkqU2tpcFBpeGVsOwotKwl3aGlsZSAocFgwIDwgZW5kKSB7Ci0rCQlIYXJyKHBYMCwgcFgwK29mcyk7Ci0rCQlwWDArKzsKLSsJCUhhcnIocFgwLCBwWDArb2ZzKTsKLSsJCXBYMCsrOwotKwkJSGFycihwWDAsIHBYMCtvZnMpOwotKwkJcFgwICs9IHM7Ci0rCX0KLSt9Ci0rI2RlZmluZSBJbnZXYXZlbGV0TGV2ZWwoZCxzLGwscGl4KSBXYXZlbGV0TGV2ZWwoZCxzLGwscGl4KQotKwotKyNpZmRlZiBaWVdSTEVfRU5DT0RFCi0rIyAgaWZuZGVmIFpZV1JMRV9RVUFOVElaRQotKy8qIFR5cGUgQTpsb3dlciBiaXQgb21pdHRpbmcgb2YgRVpXIHN0eWxlLiAqLwotK3N0YXRpYyBJbmxpbmVYIHZvaWQgRmlsdGVyV2F2ZWxldFNxdWFyZShpbnQqIHBCdWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxldmVsLCBpbnQgbCkKLSt7Ci0rCWludCByLCBzOwotKwlpbnQgeCwgeTsKLSsJaW50KiBwSDsKLSsJY29uc3QgdW5zaWduZWQgaW50KiBwTTsKLSsKLSsJcE0gPSAmKHp5d3JsZVBhcmFtW2xldmVsLTFdW2xdKTsKLSsJcyA9IDI8PGw7Ci0rCWZvciAociA9IDE7IHIgPCA0OyByKyspIHsKLSsJCXBIICAgPSBwQnVmOwotKwkJaWYgKHIgJiAweDAxKQotKwkJCXBIICs9ICBzPj4xOwotKwkJaWYgKHIgJiAweDAyKQotKwkJCXBIICs9IChzPj4xKSp3aWR0aDsKLSsJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgLyBzOyB5KyspIHsKLSsJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGggLyBzOyB4KyspIHsKLSsJCQkJLyoKLSsJCQkJIHRoZXNlIGFyZSBzYW1lIGZvbGxvd2luZyBjb2RlLgotKwkJCQkgICAgIHBIW3hdID0gcEhbeF0gLyAofnBNW3hdKzEpICogKH5wTVt4XSsxKTsKLSsJCQkJICAgICAoIHJvdW5kIHBIW3hdIHdpdGggcE1beF0gYml0ICkKLSsJCQkJICcmJyBvcGVyYXRvciBpc24ndCAncm91bmQnIGJ1dCBpcyAnZmxvb3InLgotKwkJCQkgU28sIHdlIG11c3Qgb2Zmc2V0IHdoZW4gcEhbeF0gaXMgbmVnYXRpdmUuCi0rCQkJCSovCi0rCQkJCWlmICgoKHNpZ25lZCBjaGFyKilwSClbMF0gJiAweDgwKQotKwkJCQkJKChzaWduZWQgY2hhciopcEgpWzBdICs9IH4oKHNpZ25lZCBjaGFyKilwTSlbMF07Ci0rCQkJCWlmICgoKHNpZ25lZCBjaGFyKilwSClbMV0gJiAweDgwKQotKwkJCQkJKChzaWduZWQgY2hhciopcEgpWzFdICs9IH4oKHNpZ25lZCBjaGFyKilwTSlbMV07Ci0rCQkJCWlmICgoKHNpZ25lZCBjaGFyKilwSClbMl0gJiAweDgwKQotKwkJCQkJKChzaWduZWQgY2hhciopcEgpWzJdICs9IH4oKHNpZ25lZCBjaGFyKilwTSlbMl07Ci0rCQkJCSpwSCAmPSAqcE07Ci0rCQkJCXBIICs9IHM7Ci0rCQkJfQotKwkJCXBIICs9IChzLTEpKndpZHRoOwotKwkJfQotKwl9Ci0rfQotKyMgIGVsc2UKLSsvKgotKyBUeXBlIEI6Tm9uIGxpbmVyIHF1YW50aXphdGlvbiBmaWx0ZXIuCi0rCi0rIENvZWZmaWNpZW50cyBoYXZlIEdhdXNzaWFuIGN1cnZlIGFuZCBzbWFsbGVyIHZhbHVlIHdoaWNoIGlzCi0rIGxhcmdlIHBhcnQgb2YgY29lZmZpY2llbnRzIGlzbid0IG1vcmUgaW1wb3J0YW50IHRoYW4gbGFyZ2VyIHZhbHVlLgotKyBTbywgSSB1c2UgZmlsdGVyIG9mIE5vbiBsaW5lciBxdWFudGl6ZS9kZXF1YW50aXplIHRhYmxlLgotKyBJbiBnZW5lcmFsLCBOb24gbGluZXIgcXVhbnRpemUgZm9ybXVsYSBpcyBleHBsYWluZWQgYXMgZm9sbG93aW5nLgotKwotKyAgICB5PWYoeCkgICA9IHNpZ24oeCkqcm91bmQoICgoYWJzKHgpLygyXjcpKV4gciAgICkqIDJeKGJvLTEpICkqMl4oOC1ibykKLSsgICAgeD1mLTEoeSkgPSBzaWduKHkpKnJvdW5kKCAoKGFicyh5KS8oMl43KSleKDEvcikpKiAyXihiaS0xKSApKjJeKDgtYmkpCi0rICggcjpwb3dlciBjb2VmZmljaWVudCAgYmk6ZWZmZWN0aXZlIE1TQiBpbiBpbnB1dCAgYm86ZWZmZWN0aXZlIE1TQiBpbiBvdXRwdXQgKQotKwotKyAgIHIgPCAxLjAgOiBTbWFsbGVyIHZhbHVlIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gbGFyZ2VyIHZhbHVlLgotKyAgIHIgPiAxLjAgOiBMYXJnZXIgdmFsdWUgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBzbWFsbGVyIHZhbHVlLgotKyAgIHIgPSAxLjAgOiBMaW5lciBxdWFudGl6YXRpb24gd2hpY2ggaXMgc2FtZSB3aXRoIEVaVyBzdHlsZS4KLSsKLSsgciA9IDAuNzUgaXMgZmFtb3VzIG5vbiBsaW5lciBxdWFudGl6YXRpb24gdXNlZCBpbiBNUDMgYXVkaW8gY29kZWMuCi0rIEluIGNvbnRyYXN0IHRvIGF1ZGlvIGRhdGEsIGxhcmdlciB2YWx1ZSBpcyBpbXBvcnRhbnQgaW4gd2F2ZWxldCBjb2VmZmljaWVudHMuCi0rIFNvLCBJIHNlbGVjdCByID0gMi4wIHRhYmxlKCBxdWFudGl6ZSBpcyB4XjIsIGRlcXVhbnRpemUgc3FydCh4KSApLgotKwotKyBBcyBjb21wYXJlZCB3aXRoIEVaVyBzdHlsZSBsaW5lciBxdWFudGl6YXRpb24sIHRoaXMgZmlsdGVyIHRlbmRlZCB0byBiZQotKyBtb3JlIHNoYXJwIGVkZ2UgYW5kIGJlIG1vcmUgY29tcHJlc3Npb24gcmF0ZSBidXQgYmUgbW9yZSBibG9ja2luZyBub2lzZSBhbmQgYmUgbGVzcyBxdWFsaXR5LgotKyBFc3BlY2lhbGx5LCB0aGUgc3VyZmFjZSBvZiBncmFwaGljIG9iamVjdHMgaGFzIGRpc3Rpbmd1aXNoYWJsZSBub2lzZSBpbiBtaWRkbGUgcXVhbGl0eSBtb2RlLgotKwotKyBXZSBuZWVkIG9ubHkgcXVhbnRpemVkLWRlcXVhbnRpemVkKGZpbHRlcmVkKSB2YWx1ZSByYXRoZXIgdGhhbiBxdWFudGl6ZWQgdmFsdWUgaXRzZWxmCi0rIGJlY2F1c2UgYWxsIHZhbHVlcyBhcmUgcGFja2VkIG9yIHBhbGV0dGUtbGl6ZWQgaW4gbGF0ZXIgWlJMRSBzZWN0aW9uLgotKyBUaGlzIGxlYWQgdXMgbm90IHRvIG5lZWQgdG8gbW9kaWZ5IGNsaWVudCBkZWNvZGVyIHdoZW4gd2UgY2hhbmdlCi0rIHRoZSBmaWx0ZXJpbmcgcHJvY2VkdXJlIGluIGZ1dHVyZS4KLSsgQ2xpZW50IG9ubHkgZGVjb2RlcyBjb2VmZmljaWVudHMgZ2l2ZW4gYnkgZW5jb2Rlci4KLSsqLwotK3N0YXRpYyBJbmxpbmVYIHZvaWQgRmlsdGVyV2F2ZWxldFNxdWFyZShpbnQqIHBCdWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxldmVsLCBpbnQgbCkKLSt7Ci0rCWludCByLCBzOwotKwlpbnQgeCwgeTsKLSsJaW50KiBwSDsKLSsJY29uc3Qgc2lnbmVkIGNoYXIqKiBwTTsKLSsKLSsJcE0gPSB6eXdybGVQYXJhbVtsZXZlbC0xXVtsXTsKLSsJcyA9IDI8PGw7Ci0rCWZvciAociA9IDE7IHIgPCA0OyByKyspIHsKLSsJCXBIICAgPSBwQnVmOwotKwkJaWYgKHIgJiAweDAxKQotKwkJCXBIICs9ICBzPj4xOwotKwkJaWYgKHIgJiAweDAyKQotKwkJCXBIICs9IChzPj4xKSp3aWR0aDsKLSsJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgLyBzOyB5KyspIHsKLSsJCQlmb3IgKHggPSAwOyB4IDwgd2lkdGggLyBzOyB4KyspIHsKLSsJCQkJKChzaWduZWQgY2hhciopcEgpWzBdID0gcE1bMF1bKCh1bnNpZ25lZCBjaGFyKilwSClbMF1dOwotKwkJCQkoKHNpZ25lZCBjaGFyKilwSClbMV0gPSBwTVsxXVsoKHVuc2lnbmVkIGNoYXIqKXBIKVsxXV07Ci0rCQkJCSgoc2lnbmVkIGNoYXIqKXBIKVsyXSA9IHBNWzJdWygodW5zaWduZWQgY2hhciopcEgpWzJdXTsKLSsJCQkJcEggKz0gczsKLSsJCQl9Ci0rCQkJcEggKz0gKHMtMSkqd2lkdGg7Ci0rCQl9Ci0rCX0KLSt9Ci0rIyAgZW5kaWYKLSsKLStzdGF0aWMgSW5saW5lWCB2b2lkIFdhdmVsZXQoaW50KiBwQnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsZXZlbCkKLSt7Ci0rCWludCBsLCBzOwotKwlpbnQqIHBUb3A7Ci0rCWludCogcEVuZDsKLSsKLSsJZm9yIChsID0gMDsgbCA8IGxldmVsOyBsKyspIHsKLSsJCXBUb3AgPSBwQnVmOwotKwkJcEVuZCA9IHBCdWYraGVpZ2h0KndpZHRoOwotKwkJcyA9IHdpZHRoPDxsOwotKwkJd2hpbGUgKHBUb3AgPCBwRW5kKSB7Ci0rCQkJV2F2ZWxldExldmVsKHBUb3AsIHdpZHRoLCBsLCAxKTsKLSsJCQlwVG9wICs9IHM7Ci0rCQl9Ci0rCQlwVG9wID0gcEJ1ZjsKLSsJCXBFbmQgPSBwQnVmK3dpZHRoOwotKwkJcyA9IDE8PGw7Ci0rCQl3aGlsZSAocFRvcCA8IHBFbmQpIHsKLSsJCQlXYXZlbGV0TGV2ZWwocFRvcCwgaGVpZ2h0LGwsIHdpZHRoKTsKLSsJCQlwVG9wICs9IHM7Ci0rCQl9Ci0rCQlGaWx0ZXJXYXZlbGV0U3F1YXJlKHBCdWYsIHdpZHRoLCBoZWlnaHQsIGxldmVsLCBsKTsKLSsJfQotK30KLSsjZW5kaWYKLSsjaWZkZWYgWllXUkxFX0RFQ09ERQotK3N0YXRpYyBJbmxpbmVYIHZvaWQgSW52V2F2ZWxldChpbnQqIHBCdWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxldmVsKQotK3sKLSsJaW50IGwsIHM7Ci0rCWludCogcFRvcDsKLSsJaW50KiBwRW5kOwotKwotKwlmb3IgKGwgPSBsZXZlbCAtIDE7IGwgPj0gMDsgbC0tKSB7Ci0rCQlwVG9wID0gcEJ1ZjsKLSsJCXBFbmQgPSBwQnVmK3dpZHRoOwotKwkJcyA9IDE8PGw7Ci0rCQl3aGlsZSAocFRvcCA8IHBFbmQpIHsKLSsJCQlJbnZXYXZlbGV0TGV2ZWwocFRvcCwgaGVpZ2h0LGwsIHdpZHRoKTsKLSsJCQlwVG9wICs9IHM7Ci0rCQl9Ci0rCQlwVG9wID0gcEJ1ZjsKLSsJCXBFbmQgPSBwQnVmK2hlaWdodCp3aWR0aDsKLSsJCXMgPSB3aWR0aDw8bDsKLSsJCXdoaWxlIChwVG9wIDwgcEVuZCkgewotKwkJCUludldhdmVsZXRMZXZlbChwVG9wLCB3aWR0aCwgbCwgMSk7Ci0rCQkJcFRvcCArPSBzOwotKwkJfQotKwl9Ci0rfQotKyNlbmRpZgotKwotKy8qIExvYWQvU2F2ZSBjb2VmZmljaWVudHMgc3R1ZmZzLgotKyBDb2VmZmljaWVudHMgbWFuYWdlcyBhcyAyNCBiaXRzIGxpdHRsZS1lbmRpYW4gcGl4ZWwuICovCi0rI2RlZmluZSBaWVdSTEVfTE9BRF9DT0VGRihwU3JjLFIsRyxCKSB7IFwKLSsJUiA9ICgoc2lnbmVkIGNoYXIqKXBTcmMpWzJdOwlcCi0rCUcgPSAoKHNpZ25lZCBjaGFyKilwU3JjKVsxXTsJXAotKwlCID0gKChzaWduZWQgY2hhciopcFNyYylbMF07CVwKLSt9Ci0rI2RlZmluZSBaWVdSTEVfU0FWRV9DT0VGRihwRHN0LFIsRyxCKSB7IFwKLSsJKChzaWduZWQgY2hhciopcERzdClbMl0gPSAoc2lnbmVkIGNoYXIpUjsJXAotKwkoKHNpZ25lZCBjaGFyKilwRHN0KVsxXSA9IChzaWduZWQgY2hhcilHOwlcCi0rCSgoc2lnbmVkIGNoYXIqKXBEc3QpWzBdID0gKHNpZ25lZCBjaGFyKUI7CVwKLSt9Ci0rCi0rLyoKLSsgUkdCIDw9PiBZVVYgY29udmVyc2lvbiBzdHVmZnMuCi0rIFlVViBjb3ZlcnNpb24gaXMgZXhwbGFpbmVkIGFzIGZvbGxvd2luZyBmb3JtdWxhIGluIHN0cmljdCBtZWFuaW5nOgotKyAgIFkgPSAgMC4yOTlSICsgMC41ODdHICsgMC4xMTRCICggICAwPD1ZPD0yNTUpCi0rICAgVSA9IC0wLjE2OVIgLSAwLjMzMUcgKyAwLjUwMEIgKC0xMjg8PVU8PTEyNykKLSsgICBWID0gIDAuNTAwUiAtIDAuNDE5RyAtIDAuMDgxQiAoLTEyODw9Vjw9MTI3KQotKwotKyBJIHVzZSBzaW1wbGUgY29udmVyc2lvbiBSQ1QocmV2ZXJzaWJsZSBjb2xvciB0cmFuc2Zvcm0pIHdoaWNoIGlzIGRlc2NyaWJlZAotKyBpbiBKUEVHLTIwMDAgc3BlY2lmaWNhdGlvbi4KLSsgICBZID0gKFIgKyAyRyArIEIpLzQgKCAgIDA8PVk8PTI1NSkKLSsgICBVID0gQi1HICgtMjU2PD1VPD0yNTUpCi0rICAgViA9IFItRyAoLTI1Njw9Vjw9MjU1KQotKyovCi0rI2RlZmluZSBST1VORCh4KSAoKCh4KTwwKT8wOigoKHgpPjI1NSk/MjU1Oih4KSkpCi0rCS8qIFJDVCBpcyBOLWJpdCBSR0IgdG8gTi1iaXQgWSBhbmQgTisxLWJpdCBVVi4KLSsJIEZvciBtYWtlIFNhbWUgTi1iaXQsIFVWIGlzIGxvc3N5LgotKwkgTW9yZSBleGFjdCBQTEhhcnIsIHdlIHJlZHVjZSB0byBvZGQgcmFuZ2UoLTEyNzw9eDw9MTI3KS4gKi8KLSsjZGVmaW5lIFpZV1JMRV9SR0JZVVYxKFIsRyxCLFksVSxWLHltYXNrLHV2bWFzaykgeyBcCi0rCVkgPSAoUisoRzw8MSkrQik+PjI7CVwKLSsJVSA9ICBCLUc7CVwKLSsJViA9ICBSLUc7CVwKLSsJWSAtPSAxMjg7CVwKLSsJVSA+Pj0gMTsJXAotKwlWID4+PSAxOwlcCi0rCVkgJj0geW1hc2s7CVwKLSsJVSAmPSB1dm1hc2s7CVwKLSsJViAmPSB1dm1hc2s7CVwKLSsJaWYgKFkgPT0gLTEyOCkJXAotKwkJWSArPSAoMHhGRkZGRkZGRi15bWFzaysxKTsJXAotKwlpZiAoVSA9PSAtMTI4KQlcCi0rCQlVICs9ICgweEZGRkZGRkZGLXV2bWFzaysxKTsJXAotKwlpZiAoViA9PSAtMTI4KQlcCi0rCQlWICs9ICgweEZGRkZGRkZGLXV2bWFzaysxKTsJXAotK30KLSsjZGVmaW5lIFpZV1JMRV9ZVVZSR0IxKFIsRyxCLFksVSxWKSB7IFwKLSsJWSArPSAxMjg7CVwKLSsJVSA8PD0gMTsJXAotKwlWIDw8PSAxOwlcCi0rCUcgPSBZLSgoVStWKT4+Mik7CVwKLSsJQiA9IFUrRzsJXAotKwlSID0gVitHOwlcCi0rCUcgPSBST1VORChHKTsJXAotKwlCID0gUk9VTkQoQik7CVwKLSsJUiA9IFJPVU5EKFIpOwlcCi0rfQotKwotKy8qCi0rIGNvZWZmaWNpZW50IHBhY2tpbmcvdW5wYWNraW5nIHN0dWZmcy4KLSsgV2F2ZWxldCB0cmFuc2Zvcm0gbWFrZXMgNCBzdWIgY29lZmZpY2llbnQgaW1hZ2UgZnJvbSAxIG9yaWdpbmFsIGltYWdlLgotKwotKyBtb2RlbCB3aXRoIHB5cmFtaWQgZGVjb21wb3NpdGlvbjoKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgfCAgICAgIHwKLSsgICB8ICBMICAgfCAgSHggIHwKLSsgICB8ICAgICAgfCAgICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgfCAgICAgIHwKLSsgICB8ICBIICAgfCAgSHh5IHwKLSsgICB8ICAgICAgfCAgICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsKLSsgU28sIHdlIG11c3QgdHJhbnNmZXIgZWFjaCBzdWIgaW1hZ2VzIGluZGl2aWR1YWxseSBpbiBzdHJpY3QgbWVhbmluZy4KLSsgQnV0IGF0IGxlYXN0IFpSTEUgbWVhbmluZywgZm9sbG93aW5nIG9uZSBkZWNvbXBvc2l0b24gaW1hZ2UgaXMgc2FtZSBhcwotKyBhdm9iZSBpbmRpdmlkdWFsIHN1YiBpbWFnZS4gSSB1c2UgdGhpcyBmb3JtYXQuCi0rIChTdHJpY3RseSBzYXlpbmcsIHRyYW5zZmVyIG9yZGVyIGlzIHJldmVyc2UoSHh5LT5IeS0+SHgtPkwpCi0rICBmb3Igc2ltcGxpZmllZCBwcm9jZWR1cmUgZm9yIGFueSB3YXZlbGV0IGxldmVsLikKLSsKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgTCAgICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgSHggICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgSHkgICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsgICB8ICAgICAgSHh5ICAgIHwKLSsgICArLS0tLS0tKy0tLS0tLSsKLSsqLwotKyNkZWZpbmUgSU5DX1BUUihkYXRhKSBcCi0rCWRhdGErKzsJXAotKwlpZiggZGF0YS1wRGF0YSA+PSAodyt1dykgKXsJXAotKwkJZGF0YSArPSBzY2FubGluZS0odyt1dyk7CVwKLSsJCXBEYXRhID0gZGF0YTsJXAotKwl9Ci0rCi0rI2RlZmluZSBaWVdSTEVfVFJBTlNGRVJfQ09FRkYocEJ1ZixkYXRhLHIsdyxoLHNjYW5saW5lLGxldmVsLFRSQU5TKQlcCi0rCXBIID0gcEJ1ZjsJXAotKwlzID0gMjw8bGV2ZWw7CVwKLSsJaWYgKHIgJiAweDAxKQlcCi0rCQlwSCArPSAgcz4+MTsJXAotKwlpZiAociAmIDB4MDIpCVwKLSsJCXBIICs9IChzPj4xKSp3OwlcCi0rCXBFbmQgPSBwSCtoKnc7CVwKLSsJd2hpbGUgKHBIIDwgcEVuZCkgewlcCi0rCQlwTGluZSA9IHBIK3c7CVwKLSsJCXdoaWxlIChwSCA8IHBMaW5lKSB7CVwKLSsJCQlUUkFOUwlcCi0rCQkJSU5DX1BUUihkYXRhKQlcCi0rCQkJcEggKz0gczsJXAotKwkJfQlcCi0rCQlwSCArPSAocy0xKSp3OwlcCi0rCX0KLSsKLSsjZGVmaW5lIFpZV1JMRV9QQUNLX0NPRUZGKHBCdWYsZGF0YSxyLHdpZHRoLGhlaWdodCxzY2FubGluZSxsZXZlbCkJXAotKwlaWVdSTEVfVFJBTlNGRVJfQ09FRkYocEJ1ZixkYXRhLHIsd2lkdGgsaGVpZ2h0LHNjYW5saW5lLGxldmVsLFpZV1JMRV9MT0FEX0NPRUZGKHBILFIsRyxCKTtaWVdSTEVfU0FWRV9QSVhFTChkYXRhLFIsRyxCKTspCi0rCi0rI2RlZmluZSBaWVdSTEVfVU5QQUNLX0NPRUZGKHBCdWYsZGF0YSxyLHdpZHRoLGhlaWdodCxzY2FubGluZSxsZXZlbCkJXAotKwlaWVdSTEVfVFJBTlNGRVJfQ09FRkYocEJ1ZixkYXRhLHIsd2lkdGgsaGVpZ2h0LHNjYW5saW5lLGxldmVsLFpZV1JMRV9MT0FEX1BJWEVMKGRhdGEsUixHLEIpO1pZV1JMRV9TQVZFX0NPRUZGKHBILFIsRyxCKTspCi0rCi0rI2RlZmluZSBaWVdSTEVfU0FWRV9VTkFMSUdOKGRhdGEsVFJBTlMpCVwKLSsJcFRvcCA9IHBCdWYrdypoOwlcCi0rCXBFbmQgPSBwQnVmICsgKHcrdXcpKihoK3VoKTsJXAotKwl3aGlsZSAocFRvcCA8IHBFbmQpIHsJXAotKwkJVFJBTlMJXAotKwkJSU5DX1BUUihkYXRhKQlcCi0rCQlwVG9wKys7CVwKLSsJfQotKwotKyNkZWZpbmUgWllXUkxFX0xPQURfVU5BTElHTihkYXRhLFRSQU5TKQlcCi0rCXBUb3AgPSBwQnVmK3cqaDsJXAotKwlpZiAodXcpIHsJXAotKwkJcERhdGE9ICAgICAgICAgZGF0YSArIHc7CVwKLSsJCXBFbmQgPSAoaW50KikocERhdGErIGgqc2NhbmxpbmUpOwlcCi0rCQl3aGlsZSAocERhdGEgPCAoUElYRUxfVCopcEVuZCkgewlcCi0rCQkJcExpbmUgPSAoaW50KikocERhdGEgKyB1dyk7CVwKLSsJCQl3aGlsZSAocERhdGEgPCAoUElYRUxfVCopcExpbmUpIHsJXAotKwkJCQlUUkFOUwlcCi0rCQkJCXBEYXRhKys7CVwKLSsJCQkJcFRvcCsrOwlcCi0rCQkJfQlcCi0rCQkJcERhdGEgKz0gc2NhbmxpbmUtdXc7CVwKLSsJCX0JXAotKwl9CVwKLSsJaWYgKHVoKSB7CVwKLSsJCXBEYXRhPSAgICAgICAgIGRhdGEgKyAgaCpzY2FubGluZTsJXAotKwkJcEVuZCA9IChpbnQqKShwRGF0YSsgdWgqc2NhbmxpbmUpOwlcCi0rCQl3aGlsZSAocERhdGEgPCAoUElYRUxfVCopcEVuZCkgewlcCi0rCQkJcExpbmUgPSAoaW50KikocERhdGEgKyB3KTsJXAotKwkJCXdoaWxlIChwRGF0YSA8IChQSVhFTF9UKilwTGluZSkgewlcCi0rCQkJCVRSQU5TCVwKLSsJCQkJcERhdGErKzsJXAotKwkJCQlwVG9wKys7CVwKLSsJCQl9CVwKLSsJCQlwRGF0YSArPSBzY2FubGluZS13OwlcCi0rCQl9CVwKLSsJfQlcCi0rCWlmICh1dyAmJiB1aCkgewlcCi0rCQlwRGF0YT0gICAgICAgICBkYXRhICsgdysgaCpzY2FubGluZTsJXAotKwkJcEVuZCA9IChpbnQqKShwRGF0YSsgICB1aCpzY2FubGluZSk7CVwKLSsJCXdoaWxlIChwRGF0YSA8IChQSVhFTF9UKilwRW5kKSB7CVwKLSsJCQlwTGluZSA9IChpbnQqKShwRGF0YSArIHV3KTsJXAotKwkJCXdoaWxlIChwRGF0YSA8IChQSVhFTF9UKilwTGluZSkgewlcCi0rCQkJCVRSQU5TCVwKLSsJCQkJcERhdGErKzsJXAotKwkJCQlwVG9wKys7CVwKLSsJCQl9CVwKLSsJCQlwRGF0YSArPSBzY2FubGluZS11dzsJXAotKwkJfQlcCi0rCX0KLSsKLStzdGF0aWMgSW5saW5lWCB2b2lkIHp5d3JsZUNhbGNTaXplKGludCogcFcsIGludCogcEgsIGludCBsZXZlbCkKLSt7Ci0rCSpwVyAmPSB+KCgxPDxsZXZlbCktMSk7Ci0rCSpwSCAmPSB+KCgxPDxsZXZlbCktMSk7Ci0rfQotKwotKyNlbmRpZiAvKiBaWVdSTEVfT05DRSAqLwotKwotKyNpZm5kZWYgQ1BJWEVMCi0rI2lmZGVmIFpZV1JMRV9FTkNPREUKLStzdGF0aWMgSW5saW5lWCB2b2lkIFpZV1JMRV9SR0JZVVYoaW50KiBwQnVmLCBQSVhFTF9UKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY2FubGluZSkKLSt7Ci0rCWludCBSLCBHLCBCOwotKwlpbnQgWSwgVSwgVjsKLSsJaW50KiBwTGluZTsKLSsJaW50KiBwRW5kOwotKwlwRW5kID0gcEJ1ZitoZWlnaHQqd2lkdGg7Ci0rCXdoaWxlIChwQnVmIDwgcEVuZCkgewotKwkJcExpbmUgPSBwQnVmK3dpZHRoOwotKwkJd2hpbGUgKHBCdWYgPCBwTGluZSkgewotKwkJCVpZV1JMRV9MT0FEX1BJWEVMKGRhdGEsUixHLEIpOwotKwkJCVpZV1JMRV9SR0JZVVYxKFIsRyxCLFksVSxWLFpZV1JMRV9ZTUFTSyxaWVdSTEVfVVZNQVNLKTsKLSsJCQlaWVdSTEVfU0FWRV9DT0VGRihwQnVmLFYsWSxVKTsKLSsJCQlwQnVmKys7Ci0rCQkJZGF0YSsrOwotKwkJfQotKwkJZGF0YSArPSBzY2FubGluZS13aWR0aDsKLSsJfQotK30KLSsjZW5kaWYKLSsjaWZkZWYgWllXUkxFX0RFQ09ERQotK3N0YXRpYyBJbmxpbmVYIHZvaWQgWllXUkxFX1lVVlJHQihpbnQqIHBCdWYsIFBJWEVMX1QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjYW5saW5lKSB7Ci0rCWludCBSLCBHLCBCOwotKwlpbnQgWSwgVSwgVjsKLSsJaW50KiBwTGluZTsKLSsJaW50KiBwRW5kOwotKwlwRW5kID0gcEJ1ZitoZWlnaHQqd2lkdGg7Ci0rCXdoaWxlIChwQnVmIDwgcEVuZCkgewotKwkJcExpbmUgPSBwQnVmK3dpZHRoOwotKwkJd2hpbGUgKHBCdWYgPCBwTGluZSkgewotKwkJCVpZV1JMRV9MT0FEX0NPRUZGKHBCdWYsVixZLFUpOwotKwkJCVpZV1JMRV9ZVVZSR0IxKFIsRyxCLFksVSxWKTsKLSsJCQlaWVdSTEVfU0FWRV9QSVhFTChkYXRhLFIsRyxCKTsKLSsJCQlwQnVmKys7Ci0rCQkJZGF0YSsrOwotKwkJfQotKwkJZGF0YSArPSBzY2FubGluZS13aWR0aDsKLSsJfQotK30KLSsjZW5kaWYKLSsKLSsjaWZkZWYgWllXUkxFX0VOQ09ERQotK1BJWEVMX1QqIFpZV1JMRV9BTkFMWVpFKFBJWEVMX1QqIGRzdCwgUElYRUxfVCogc3JjLCBpbnQgdywgaW50IGgsIGludCBzY2FubGluZSwgaW50IGxldmVsLCBpbnQqIHBCdWYpIHsKLSsJaW50IGw7Ci0rCWludCB1dyA9IHc7Ci0rCWludCB1aCA9IGg7Ci0rCWludCogcFRvcDsKLSsJaW50KiBwRW5kOwotKwlpbnQqIHBMaW5lOwotKwlQSVhFTF9UKiBwRGF0YTsKLSsJaW50IFIsIEcsIEI7Ci0rCWludCBzOwotKwlpbnQqIHBIOwotKwotKwl6eXdybGVDYWxjU2l6ZSgmdywgJmgsIGxldmVsKTsKLSsJaWYgKHcgPT0gMCB8fCBoID09IDApCi0rCQlyZXR1cm4gTlVMTDsKLSsJdXcgLT0gdzsKLSsJdWggLT0gaDsKLSsKLSsJcERhdGEgPSBkc3Q7Ci0rCVpZV1JMRV9MT0FEX1VOQUxJR04oc3JjLCooUElYRUxfVCopcFRvcD0qcERhdGE7KQotKwlaWVdSTEVfUkdCWVVWKHBCdWYsIHNyYywgdywgaCwgc2NhbmxpbmUpOwotKwlXYXZlbGV0KHBCdWYsIHcsIGgsIGxldmVsKTsKLSsJZm9yIChsID0gMDsgbCA8IGxldmVsOyBsKyspIHsKLSsJCVpZV1JMRV9QQUNLX0NPRUZGKHBCdWYsIGRzdCwgMywgdywgaCwgc2NhbmxpbmUsIGwpOwotKwkJWllXUkxFX1BBQ0tfQ09FRkYocEJ1ZiwgZHN0LCAyLCB3LCBoLCBzY2FubGluZSwgbCk7Ci0rCQlaWVdSTEVfUEFDS19DT0VGRihwQnVmLCBkc3QsIDEsIHcsIGgsIHNjYW5saW5lLCBsKTsKLSsJCWlmIChsID09IGxldmVsIC0gMSkgewotKwkJCVpZV1JMRV9QQUNLX0NPRUZGKHBCdWYsIGRzdCwgMCwgdywgaCwgc2NhbmxpbmUsIGwpOwotKwkJfQotKwl9Ci0rCVpZV1JMRV9TQVZFX1VOQUxJR04oZHN0LCpkc3Q9KihQSVhFTF9UKilwVG9wOykKLSsJcmV0dXJuIGRzdDsKLSt9Ci0rI2VuZGlmCi0rI2lmZGVmIFpZV1JMRV9ERUNPREUKLStQSVhFTF9UKiBaWVdSTEVfU1lOVEhFU0laRShQSVhFTF9UKiBkc3QsIFBJWEVMX1QqIHNyYywgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmUsIGludCBsZXZlbCwgaW50KiBwQnVmKQotK3sKLSsJaW50IGw7Ci0rCWludCB1dyA9IHc7Ci0rCWludCB1aCA9IGg7Ci0rCWludCogcFRvcDsKLSsJaW50KiBwRW5kOwotKwlpbnQqIHBMaW5lOwotKwlQSVhFTF9UKiBwRGF0YTsKLSsJaW50IFIsIEcsIEI7Ci0rCWludCBzOwotKwlpbnQqIHBIOwotKwotKwl6eXdybGVDYWxjU2l6ZSgmdywgJmgsIGxldmVsKTsKLSsJaWYgKHcgPT0gMCB8fCBoID09IDApCi0rCQlyZXR1cm4gTlVMTDsKLSsJdXcgLT0gdzsKLSsJdWggLT0gaDsKLSsKLSsJcERhdGEgPSBzcmM7Ci0rCWZvciAobCA9IDA7IGwgPCBsZXZlbDsgbCsrKSB7Ci0rCQlaWVdSTEVfVU5QQUNLX0NPRUZGKHBCdWYsIHNyYywgMywgdywgaCwgc2NhbmxpbmUsIGwpOwotKwkJWllXUkxFX1VOUEFDS19DT0VGRihwQnVmLCBzcmMsIDIsIHcsIGgsIHNjYW5saW5lLCBsKTsKLSsJCVpZV1JMRV9VTlBBQ0tfQ09FRkYocEJ1Ziwgc3JjLCAxLCB3LCBoLCBzY2FubGluZSwgbCk7Ci0rCQlpZiAobCA9PSBsZXZlbCAtIDEpIHsKLSsJCQlaWVdSTEVfVU5QQUNLX0NPRUZGKHBCdWYsIHNyYywgMCwgdywgaCwgc2NhbmxpbmUsIGwpOwotKwkJfQotKwl9Ci0rCVpZV1JMRV9TQVZFX1VOQUxJR04oc3JjLCooUElYRUxfVCopcFRvcD0qc3JjOykKLSsJSW52V2F2ZWxldChwQnVmLCB3LCBoLCBsZXZlbCk7Ci0rCVpZV1JMRV9ZVVZSR0IocEJ1ZiwgZHN0LCB3LCBoLCBzY2FubGluZSk7Ci0rCVpZV1JMRV9MT0FEX1VOQUxJR04oZHN0LCpwRGF0YT0qKFBJWEVMX1QqKXBUb3A7KQotKwlyZXR1cm4gc3JjOwotK30KLSsjZW5kaWYKLSsjZW5kaWYgIC8qIENQSVhFTCAqLwotKwotKyN1bmRlZiBaWVdSTEVfUkdCWVVWCi0rI3VuZGVmIFpZV1JMRV9ZVVZSR0IKLSsjdW5kZWYgWllXUkxFX0xPQURfUElYRUwKLSsjdW5kZWYgWllXUkxFX1NBVkVfUElYRUwKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvaW5jbHVkZS9yZmJwcm90by5oIHZuY191bml4c3JjL2luY2x1ZGUvcmZicHJvdG8uaAotLS0tIHZuY191bml4c3JjLm9yaWcvaW5jbHVkZS9yZmJwcm90by5oCTIwMDQtMDUtMjcgMDM6MDI6MDIuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvaW5jbHVkZS9yZmJwcm90by5oCTIwMTAtMDItMjUgMjE6NTQ6NTguMDAwMDAwMDAwIC0wNTAwCi1AQCAtMjA1LDcgKzIwNSwyMiBAQAotICNkZWZpbmUgcmZiU2VjVHlwZUludmFsaWQgMAotICNkZWZpbmUgcmZiU2VjVHlwZU5vbmUgMQotICNkZWZpbmUgcmZiU2VjVHlwZVZuY0F1dGggMgotKyNkZWZpbmUgcmZiU2VjVHlwZVJBMiA1Ci0rI2RlZmluZSByZmJTZWNUeXBlUkEybmUgNgotICNkZWZpbmUgcmZiU2VjVHlwZVRpZ2h0IDE2Ci0rI2RlZmluZSByZmJTZWNUeXBlVWx0cmEgMTcKLSsKLSsvKiB0cnkgdG8gc3VwcG9ydCBWZU5DcnlwdCBhbmQgVExTICovCi0rI2RlZmluZSByZmJTZWNUeXBlQW5vblRscyAgMTgKLSsjZGVmaW5lIHJmYlNlY1R5cGVWZW5jcnlwdCAxOQotKwotKyNkZWZpbmUgcmZiVmVuY3J5cHRQbGFpbiAgICAgICAgMjU2Ci0rI2RlZmluZSByZmJWZW5jcnlwdFRsc05vbmUgICAgICAyNTcKLSsjZGVmaW5lIHJmYlZlbmNyeXB0VGxzVm5jICAgICAgIDI1OAotKyNkZWZpbmUgcmZiVmVuY3J5cHRUbHNQbGFpbiAgICAgMjU5Ci0rI2RlZmluZSByZmJWZW5jcnlwdFg1MDlOb25lICAgICAyNjAKLSsjZGVmaW5lIHJmYlZlbmNyeXB0WDUwOVZuYyAgICAgIDI2MQotKyNkZWZpbmUgcmZiVmVuY3J5cHRYNTA5UGxhaW4gICAgMjYyCi0gCi0gCi0gLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEAgLTM4MSw2ICszOTYsMTEgQEAKLSAjZGVmaW5lIHJmYkJlbGwgMgotICNkZWZpbmUgcmZiU2VydmVyQ3V0VGV4dCAzCi0gCi0rI2RlZmluZSByZmJSZXNpemVGcmFtZUJ1ZmZlciA0IC8qIE1vZGlmIHNmQDIwMDIgKi8KLSsKLSsvKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3ZuY3Nlc3NtZ3IgKi8KLSsjZGVmaW5lIHJmYlJlc3RhcnRDb25uZWN0aW9uIDgyCi0rCi0gI2RlZmluZSByZmJGaWxlTGlzdERhdGEgMTMwCi0gI2RlZmluZSByZmJGaWxlRG93bmxvYWREYXRhIDEzMQotICNkZWZpbmUgcmZiRmlsZVVwbG9hZENhbmNlbCAxMzIKLUBAIC00MDMsNiArNDIzLDE4IEBACi0gI2RlZmluZSByZmJQb2ludGVyRXZlbnQgNQotICNkZWZpbmUgcmZiQ2xpZW50Q3V0VGV4dCA2Ci0gCi0rLyogdWx0cmEgKi8KLSsKLSsjZGVmaW5lIHJmYkZpbGVUcmFuc2ZlciA3Ci0rI2RlZmluZSByZmJTZXRTY2FsZSA4Ci0rI2RlZmluZSByZmJTZXRTZXJ2ZXJJbnB1dCA5Ci0rI2RlZmluZSByZmJTZXRTVyAxMAotKyNkZWZpbmUgcmZiVGV4dENoYXQgMTEKLSsjZGVmaW5lIHJmYktleUZyYW1lUmVxdWVzdCAxMgotKyNkZWZpbmUgcmZiUGFsbVZOQ1NldFNjYWxlRmFjdG9yIDB4RgotKwotKwotKwotICNkZWZpbmUgcmZiRmlsZUxpc3RSZXF1ZXN0IDEzMAotICNkZWZpbmUgcmZiRmlsZURvd25sb2FkUmVxdWVzdCAxMzEKLSAjZGVmaW5lIHJmYkZpbGVVcGxvYWRSZXF1ZXN0IDEzMgotQEAgLTQzNSw2ICs0NjcsMTMgQEAKLSAjZGVmaW5lIHJmYkVuY29kaW5nVGlnaHQgICAgIDcKLSAjZGVmaW5lIHJmYkVuY29kaW5nWmxpYkhleCAgIDgKLSAKLSsjZGVmaW5lIHJmYkVuY29kaW5nWlJMRSAxNgotKy8qCi0rbnlhbWEvMjAwNi8wOC8wMjpuZXcgWVVWLVdhdmxldCBsb3NzeSBjb2RlYyBiYXNlZCBvbiBaUkxFIChaWVdSTEUpCi0rICovCi0rI2RlZmluZSByZmJFbmNvZGluZ1pZV1JMRSAxNwotKwotKwotIC8qIHNpZ25hdHVyZXMgZm9yIGJhc2ljIGVuY29kaW5nIHR5cGVzICovCi0gI2RlZmluZSBzaWdfcmZiRW5jb2RpbmdSYXcgICAgICAgIlJBV19fX19fIgotICNkZWZpbmUgc2lnX3JmYkVuY29kaW5nQ29weVJlY3QgICJDT1BZUkVDVCIKLUBAIC05NTUsNiArOTk0LDUxIEBACi0gI2RlZmluZSBzel9yZmJGaWxlRG93bmxvYWRGYWlsZWRNc2cgNAotIAotIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSsgKiBSZXN0YXJ0Q29ubmVjdGlvbiAtIHRoZSBzZXJ2ZXIgaGFzIHJlc3RhcnRlZCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCi0rICovCi0rCi0rdHlwZWRlZiBzdHJ1Y3QgX3JmYlJlc3RhcnRDb25uZWN0aW9uTXNnIHsKLSsgICAgQ0FSRDggdHlwZTsJCQkvKiBhbHdheXMgcmZiUmVzdGFydENvbm5lY3Rpb24gKi8KLSsgICAgQ0FSRDggcGFkMTsKLSsgICAgQ0FSRDE2IHBhZDI7Ci0rICAgIENBUkQzMiBsZW5ndGg7Ci0rICAgIC8qIGZvbGxvd2VkIGJ5IGNoYXIgdGV4dFtsZW5ndGhdICovCi0rfSByZmJSZXN0YXJ0Q29ubmVjdGlvbk1zZzsKLSsKLSsjZGVmaW5lIHN6X3JmYlJlc3RhcnRDb25uZWN0aW9uTXNnIDgKLSsKLSsKLSt0eXBlZGVmIHN0cnVjdCBfcmZiVGV4dENoYXRNc2cgewotKyAgICBDQVJEOCB0eXBlOyAgICAgICAgICAgICAgICAgLyogYWx3YXlzIHJmYlRleHRDaGF0ICovCi0rICAgIENBUkQ4IHBhZDE7ICAgICAgICAgLyogQ291bGQgYmUgdXNlZCBsYXRlciBhcyBhbiBhZGRpdGlvbm5hbCBwYXJhbSAqLwotKyAgICBDQVJEMTYgcGFkMjsgICAgICAgICAgICAgICAgLyogQ291bGQgYmUgdXNlZCBsYXRlciBhcyB0ZXh0IG9mZnNldCwgZm9yIGluc3RhbmNlICovCi0rICAgIENBUkQzMiBsZW5ndGg7ICAgICAgLyogU3BlY2lmaWMgdmFsdWVzIGZvciBPcGVuLCBjbG9zZSwgZmluaXNoZWQgKC0xLCAtMiwgLTMpICovCi0rICAgIC8qIGZvbGxvd2VkIGJ5IGNoYXIgdGV4dFtsZW5ndGhdICovCi0rfSByZmJUZXh0Q2hhdE1zZzsKLSsKLSsjZGVmaW5lIHN6X3JmYlRleHRDaGF0TXNnIDgKLSsKLSsjZGVmaW5lIHJmYlRleHRNYXhTaXplICAgICAgICAgIDQwOTYKLSsjZGVmaW5lIHJmYlRleHRDaGF0T3BlbiAgICAgICAgIDB4RkZGRkZGRkYgCi0rI2RlZmluZSByZmJUZXh0Q2hhdENsb3NlICAgICAgICAweEZGRkZGRkZFICAKLSsjZGVmaW5lIHJmYlRleHRDaGF0RmluaXNoZWQgMHhGRkZGRkZGRCAgCi0rCi0rLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKyAqIE1vZGlmIHNmQDIwMDIKLSsgKiBSZXNpemVGcmFtZUJ1ZmZlciAtIFRoZSBDbGllbnQgbXVzdCBjaGFuZ2UgdGhlIHNpemUgb2YgaXRzIGZyYW1lYnVmZmVyICAKLSsgKi8KLSsKLSt0eXBlZGVmIHN0cnVjdCBfcmZiUmVzaXplRnJhbWVCdWZmZXJNc2cgewotKyAgICBDQVJEOCB0eXBlOyAgICAgICAgICAgICAgICAgLyogYWx3YXlzIHJmYlJlc2l6ZUZyYW1lQnVmZmVyICovCi0rICAgICAgICBDQVJEOCBwYWQxOwotKyAgICAgICAgQ0FSRDE2IGZyYW1lYnVmZmVyV2lkdGg7ICAgICAgICAvKiBGcmFtZUJ1ZmZlciB3aWR0aCAqLwotKyAgICAgICAgQ0FSRDE2IGZyYW1lYnVmZmVySGVpZ2h0OyAgICAgICAvKiBGcmFtZUJ1ZmZlciBoZWlnaHQgKi8KLSt9IHJmYlJlc2l6ZUZyYW1lQnVmZmVyTXNnOwotKwotKyNkZWZpbmUgc3pfcmZiUmVzaXplRnJhbWVCdWZmZXJNc2cgNgotKwotKwotKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgKiBVbmlvbiBvZiBhbGwgc2VydmVyLT5jbGllbnQgbWVzc2FnZXMuCi0gICovCi0gCi1AQCAtOTY4LDYgKzEwNTIsOCBAQAotICAgICByZmJGaWxlRG93bmxvYWREYXRhTXNnIGZkZDsKLSAgICAgcmZiRmlsZVVwbG9hZENhbmNlbE1zZyBmdWM7Ci0gICAgIHJmYkZpbGVEb3dubG9hZEZhaWxlZE1zZyBmZGY7Ci0rICAgIHJmYlJlc3RhcnRDb25uZWN0aW9uTXNnIHJjOwotKwlyZmJUZXh0Q2hhdE1zZyB0YzsKLSB9IHJmYlNlcnZlclRvQ2xpZW50TXNnOwotIAotIAotQEAgLTEyMjEsNiArMTMwNyw0MSBAQAotIAotICNkZWZpbmUgc3pfcmZiRmlsZUNyZWF0ZURpclJlcXVlc3RNc2cgNAotIAotKy8qIHVsdHJhICovCi0rdHlwZWRlZiBzdHJ1Y3QgX3JmYlNldFNjYWxlTXNnIHsKLSsgICAgQ0FSRDggdHlwZTsgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyByZmJTZXRTY2FsZSAqLwotKyAgICBDQVJEOCBzY2FsZTsgICAgICAgICAgICAgICAgLyogU2NhbGUgdmFsdWUgMTxzdjxuICovCi0rICAgIENBUkQxNiBwYWQ7Ci0rfSByZmJTZXRTY2FsZU1zZzsKLSsKLSsjZGVmaW5lIHN6X3JmYlNldFNjYWxlTXNnIDQKLSsKLSt0eXBlZGVmIHN0cnVjdCB7Ci0rICAgIENBUkQ4IHR5cGU7ICAgICAgICAgICAgICAgICAvKiBhbHdheXMgcmZiU2V0U2NhbGVGYWN0b3IgKi8KLSsKLSsgICAgQ0FSRDggc2NhbGU7ICAgICAgICAgICAgICAgIC8qIFNjYWxlIGZhY3RvciAocG9zaXRpdmUgbm9uLXplcm8gaW50ZWdlcikgKi8KLSsgICAgQ0FSRDE2IHBhZDI7Ci0rfSByZmJQYWxtVk5DU2V0U2NhbGVGYWN0b3JNc2c7Ci0rCi0rI2RlZmluZSBzel9yZmJQYWxtVk5DU2V0U2NhbGVGYWN0b3JNc2cgKDQpCi0rCi0rdHlwZWRlZiBzdHJ1Y3QgX3JmYlNldFNlcnZlcklucHV0TXNnIHsKLSsgICAgQ0FSRDggdHlwZTsgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyByZmJTZXRTZXJ2ZXJJbnB1dE1zZyAqLwotKyAgICBDQVJEOCBzdGF0dXM7ICAgICAgICAgICAgICAgLyogb24gb3Igb2ZmICovCi0rICAgIENBUkQxNiBwYWQ7Ci0rfSByZmJTZXRTZXJ2ZXJJbnB1dE1zZzsKLSsKLSsjZGVmaW5lIHN6X3JmYlNldFNlcnZlcklucHV0TXNnIDQKLSsKLSt0eXBlZGVmIHN0cnVjdCBfcmZiU2V0U1dNc2cgewotKyAgICBDQVJEOCB0eXBlOyAgICAgICAgICAgICAgICAgLyogYWx3YXlzIHJmYlNldFNXICovCi0rICAgIENBUkQ4IHN0YXR1czsKLSsgICAgQ0FSRDE2IHg7Ci0rICAgIENBUkQxNiB5OwotK30gcmZiU2V0U1dNc2c7Ci0rCi0rI2RlZmluZSBzel9yZmJTZXRTV01zZyA2Ci0rCi0gLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAqIFVuaW9uIG9mIGFsbCBjbGllbnQtPnNlcnZlciBtZXNzYWdlcy4KLSAgKi8KLUBAIC0xMjQxLDQgKzEzNjIsOSBAQAotICAgICByZmJGaWxlRG93bmxvYWRDYW5jZWxNc2cgZmRjOwotICAgICByZmJGaWxlVXBsb2FkRmFpbGVkTXNnIGZ1ZjsKLSAgICAgcmZiRmlsZUNyZWF0ZURpclJlcXVlc3RNc2cgZmNkcjsKLSsJcmZiU2V0U2NhbGVNc2cgc3NjOwotKwlyZmJQYWxtVk5DU2V0U2NhbGVGYWN0b3JNc2cgcHNzZjsKLSsJcmZiU2V0U2VydmVySW5wdXRNc2cgc2ltOwotKwlyZmJTZXRTV01zZyBzdzsKLSsJcmZiVGV4dENoYXRNc2cgdGM7Ci0gfSByZmJDbGllbnRUb1NlcnZlck1zZzsKLWRpZmYgLU5hdXIgLVggLi9leGNsdWRlIHZuY191bml4c3JjLm9yaWcvaW5jbHVkZS92bmNhdXRoLmggdm5jX3VuaXhzcmMvaW5jbHVkZS92bmNhdXRoLmgKLS0tLSB2bmNfdW5peHNyYy5vcmlnL2luY2x1ZGUvdm5jYXV0aC5oCTIwMDAtMDYtMTEgMDg6MDA6NTMuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvaW5jbHVkZS92bmNhdXRoLmgJMjAwOS0wMy0yMSAwMDozNzoyMy4wMDAwMDAwMDAgLTA0MDAKLUBAIC0yMyw4ICsyMywxMSBAQAotIAotICNkZWZpbmUgTUFYUFdMRU4gOAotICNkZWZpbmUgQ0hBTExFTkdFU0laRSAxNgotKyNkZWZpbmUgQ0hBTExFTkdFU0laRV9NU0xPR09OIDY0Ci0gCi0gZXh0ZXJuIGludCB2bmNFbmNyeXB0QW5kU3RvcmVQYXNzd2QoY2hhciAqcGFzc3dkLCBjaGFyICpmbmFtZSk7Ci0gZXh0ZXJuIGNoYXIgKnZuY0RlY3J5cHRQYXNzd2RGcm9tRmlsZShjaGFyICpmbmFtZSk7Ci0gZXh0ZXJuIHZvaWQgdm5jUmFuZG9tQnl0ZXModW5zaWduZWQgY2hhciAqYnl0ZXMpOwotIGV4dGVybiB2b2lkIHZuY0VuY3J5cHRCeXRlcyh1bnNpZ25lZCBjaGFyICpieXRlcywgY2hhciAqcGFzc3dkKTsKLSsKLStleHRlcm4gdm9pZCB2bmNFbmNyeXB0UGFzc3dkX01TTE9HT04odW5zaWduZWQgY2hhciAqZW5jcnlwdGVkUGFzc3dkLCBjaGFyICpwYXNzd2QpOwotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy9saWJ2bmNhdXRoL2QzZGVzLmMgdm5jX3VuaXhzcmMvbGlidm5jYXV0aC9kM2Rlcy5jCi0tLS0gdm5jX3VuaXhzcmMub3JpZy9saWJ2bmNhdXRoL2QzZGVzLmMJMjAwMC0wNi0xMSAwODowMDo1My4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy9saWJ2bmNhdXRoL2QzZGVzLmMJMjAxMC0wMi0yNSAyMTo0OTowMi4wMDAwMDAwMDAgLTA1MDAKLUBAIC0zNCwxMiArMzQsMTUgQEAKLSBzdGF0aWMgdm9pZCBjb29rZXkodW5zaWduZWQgbG9uZyAqKTsKLSAKLSBzdGF0aWMgdW5zaWduZWQgbG9uZyBLbkxbMzJdID0geyAwTCB9OwotKy8qIG5vIGxvbmRlciB1c2VkOiAqLwotKyNpZiAwCi0gc3RhdGljIHVuc2lnbmVkIGxvbmcgS25SWzMyXSA9IHsgMEwgfTsKLSBzdGF0aWMgdW5zaWduZWQgbG9uZyBLbjNbMzJdID0geyAwTCB9OwotIHN0YXRpYyB1bnNpZ25lZCBjaGFyIERmX0tleVsyNF0gPSB7Ci0gCTB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweGFiLDB4Y2QsMHhlZiwKLSAJMHhmZSwweGRjLDB4YmEsMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwLAotIAkweDg5LDB4YWIsMHhjZCwweGVmLDB4MDEsMHgyMywweDQ1LDB4NjcgfTsKLSsjZW5kaWYKLSAKLSBzdGF0aWMgdW5zaWduZWQgc2hvcnQgYnl0ZWJpdFs4XQk9IHsKLSAJMDEsIDAyLCAwNCwgMDEwLCAwMjAsIDA0MCwgMDEwMCwgMDIwMCB9OwotZGlmZiAtTmF1ciAtWCAuL2V4Y2x1ZGUgdm5jX3VuaXhzcmMub3JpZy9saWJ2bmNhdXRoL3ZuY2F1dGguYyB2bmNfdW5peHNyYy9saWJ2bmNhdXRoL3ZuY2F1dGguYwotLS0tIHZuY191bml4c3JjLm9yaWcvbGlidm5jYXV0aC92bmNhdXRoLmMJMjAwMy0wMy0wMSAxMTo0ODowNi4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy9saWJ2bmNhdXRoL3ZuY2F1dGguYwkyMDEwLTAyLTI1IDIxOjQ3OjI1LjAwMDAwMDAwMCAtMDUwMAotQEAgLTI3LDkgKzI3LDExIEBACi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSsjaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDx2bmNhdXRoLmg+Ci0gI2luY2x1ZGUgPGQzZGVzLmg+Ci0gCi0rI2luY2x1ZGUgPGZjbnRsLmg+Ci0gCi0gLyoKLSAgKiBNYWtlIHN1cmUgd2UgY2FsbCBzcmFuZG9tKCkgb25seSBvbmNlLgotQEAgLTQ1LDYgKzQ3LDggQEAKLSAKLSBzdGF0aWMgdW5zaWduZWQgY2hhciBzX2ZpeGVka2V5WzhdID0gezIzLDgyLDEwNyw2LDM1LDc4LDg4LDd9OwotIAotK2ludCB2bmNFbmNyeXB0QW5kU3RvcmVQYXNzd2QyKGNoYXIgKnBhc3N3ZCwgY2hhciAqcGFzc3dkVmlld09ubHksIGNoYXIgKmZuYW1lKTsKLStpbnQgdm5jRGVjcnlwdFBhc3N3ZEZyb21GaWxlMihjaGFyICpmbmFtZSwgY2hhciAqcGFzc3dkRnVsbENvbnRyb2wsIGNoYXIgKnBhc3N3ZFZpZXdPbmx5KTsKLSAKLSAvKgotICAqIEVuY3J5cHQgYSBwYXNzd29yZCBhbmQgc3RvcmUgaXQgaW4gYSBmaWxlLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsCi1AQCAtNzMsNyArNzcsNyBAQAotIHZuY0VuY3J5cHRBbmRTdG9yZVBhc3N3ZDIoY2hhciAqcGFzc3dkLCBjaGFyICpwYXNzd2RWaWV3T25seSwgY2hhciAqZm5hbWUpCi0gewotICAgICBGSUxFICpmcDsKLS0gICAgaW50IGksIGJ5dGVzVG9Xcml0ZSwgYnl0ZXNXcm90ZTsKLSsgICAgaW50IGJ5dGVzVG9Xcml0ZSwgYnl0ZXNXcm90ZTsKLSAgICAgdW5zaWduZWQgY2hhciBlbmNyeXB0ZWRQYXNzd2RbMTZdID0gewotIAkwLDAsMCwwLDAsMCwwLDAsCi0gCTAsMCwwLDAsMCwwLDAsMAotQEAgLTE5NSw2ICsxOTksNDQgQEAKLSAgICAgcmV0dXJuIChpIDwgMTYpID8gMSA6IDI7Ci0gfQotIAotK3Vuc2lnbmVkIGludCB1cmFuZG9tKHZvaWQpIHsKLSsJdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0rCXN0cnVjdCBzdGF0IHNiOwotKwlpbnQgZmQgPSAtMTsKLSsJaWYgKGZkIDwgMCAmJiBzdGF0KCIvZGV2L3VyYW5kb20iLCAmc2IpID09IDApIHsKLSsJCWZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOwotKwl9Ci0rCWlmIChmZCA8IDAgJiYgc3RhdCgiL2Rldi9yYW5kb20iLCAmc2IpID09IDApIHsKLSsJCWZkID0gb3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSk7Ci0rCX0KLSsJaWYgKGZkIDwgMCAmJiBzdGF0KCIvcHJvYy9sb2FkYXZnIiwgJnNiKSA9PSAwKSB7Ci0rCQlmZCA9IG9wZW4oIi9wcm9jL2xvYWRhdmciLCBPX1JET05MWSk7Ci0rCX0KLSsJaWYgKGZkIDwgMCAmJiBzdGF0KCIvYmluL2Jhc2giLCAmc2IpID09IDApIHsKLSsJCWZkID0gb3BlbigiL2Jpbi9iYXNoIiwgT19SRE9OTFkpOwotKwkJbHNlZWsoZmQsIChvZmZfdCkgKHVuc2lnbmVkIGludCkgZ2V0cGlkKCksIFNFRUtfU0VUKTsKLSsJfQotKwlpZiAoZmQgPj0gMCkgewotKwkJaW50IGk7Ci0rCQlmb3IgKGk9MDsgaSA8IDM7IGkrKykgewotKwkJCWNoYXIgYnVmWzJdOwotKwkJCWlmIChyZWFkKGZkLCBidWYsIDEpID4gMCkgewotKwkJCQl1bnNpZ25lZCBjaGFyIHVjID0gKHVuc2lnbmVkIGNoYXIpIGJ1ZlswXTsgIAotKwkJCQlpZiAoaT09MCkgewotKwkJCQkJdmFsICs9IHVjOyAKLSsJCQkJfSBlbHNlIGlmIChpPT0xKSB7Ci0rCQkJCQl2YWwgKz0gdWMgKiAyNTY7IAotKwkJCQl9IGVsc2UgaWYgKGk9PTIpIHsKLSsJCQkJCXZhbCArPSB1YyAqIDI1NiAqIDI1NjsgCi0rCQkJCX0KLSsJCQl9Ci0rCQl9Ci0rCQljbG9zZShmZCk7Ci0rCX0gZWxzZSB7Ci0rCQl2YWwgPSAodW5zaWduZWQgaW50KSBnZXRwaWQoKTsKLSsJfQotKwlyZXR1cm4gdmFsOwotK30KLSAKLSAvKgotICAqIEdlbmVyYXRlIENIQUxMRU5HRVNJWkUgcmFuZG9tIGJ5dGVzIGZvciB1c2UgaW4gY2hhbGxlbmdlLXJlc3BvbnNlCi1AQCAtMjA3LDExICsyNDksMTMgQEAKLSAgICAgaW50IGk7Ci0gICAgIHVuc2lnbmVkIGludCBzZWVkOwotIAotLSAgICBpZiAoIXNfc3JhbmRvbV9jYWxsZWQpIHsKLS0gICAgICBzZWVkID0gKHVuc2lnbmVkIGludCl0aW1lKDApIF4gKHVuc2lnbmVkIGludClnZXRwaWQoKTsKLS0gICAgICBzcmFuZG9tKHNlZWQpOwotLSAgICAgIHNfc3JhbmRvbV9jYWxsZWQgPSAxOwotLSAgICB9Ci0rCWlmICghc19zcmFuZG9tX2NhbGxlZCkgewotKwkJc2VlZCA9ICh1bnNpZ25lZCBpbnQpdGltZSgwKSBeICh1bnNpZ25lZCBpbnQpZ2V0cGlkKCk7Ci0rCQlzZWVkICs9IHVyYW5kb20oKTsKLSsKLSsJCXNyYW5kb20oc2VlZCk7Ci0rCQlzX3NyYW5kb21fY2FsbGVkID0gMTsKLSsJfQotIAotICAgICBmb3IgKGkgPSAwOyBpIDwgQ0hBTExFTkdFU0laRTsgaSsrKSB7Ci0gCWJ5dGVzW2ldID0gKHVuc2lnbmVkIGNoYXIpKHJhbmRvbSgpICYgMjU1KTsgICAgCi1AQCAtMjQ1LDMgKzI4OSw0OCBAQAotIAlkZXMoYnl0ZXMraSwgYnl0ZXMraSk7Ci0gICAgIH0KLSB9Ci0rCi0rdm9pZCBVdm5jRW5jcnlwdFBhc3N3ZF9NU0xPR09OKHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZFBhc3N3ZCwgY2hhciAqcGFzc3dkKSB7Ci0rCXVuc2lnbmVkIGludCBpOwotKwlmb3IgKGk9MDsgaSA8IDMyOyBpKyspIHsKLSsJCWlmIChpIDwgc3RybGVuKHBhc3N3ZCkpIHsKLSsJCQllbmNyeXB0ZWRQYXNzd2RbaV0gPSBwYXNzd2RbaV07Ci0rCQl9IGVsc2UgewotKwkJCWVuY3J5cHRlZFBhc3N3ZFtpXSA9ICdcMCc7Ci0rCQl9Ci0rCX0KLSsJZGVza2V5KHNfZml4ZWRrZXksIEVOMCk7Ci0rCWRlcyhlbmNyeXB0ZWRQYXNzd2QsIGVuY3J5cHRlZFBhc3N3ZCk7Ci0rfQotKwotK3ZvaWQgVXZuY0VuY3J5cHRCeXRlczIodW5zaWduZWQgY2hhciAqd2hlcmUsIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmtleSkgewotKwlpbnQgaSwgajsKLSsJZGVza2V5KGtleSwgRU4wKTsKLSsJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLSsJCXdoZXJlW2ldIF49IGtleVtpXTsKLSsJfQotKwlkZXMod2hlcmUsIHdoZXJlKTsKLSsJZm9yIChpPTg7IGkgPCBsZW5ndGg7IGkgKz0gOCkgewotKwkJZm9yIChqPTA7IGogPCA4OyBqKyspIHsKLSsJCQl3aGVyZVtpK2pdIF49IHdoZXJlW2krai04XTsKLSsJCX0KLSsJCWRlcyh3aGVyZStpLCB3aGVyZStpKTsKLSsJfQotK30KLSsKLSt2b2lkIFV2bmNEZWNyeXB0Qnl0ZXMyKHVuc2lnbmVkIGNoYXIgKndoZXJlLCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICprZXkpIHsKLSsJaW50IGksIGo7Ci0rCWRlc2tleShrZXksIERFMSk7Ci0rCWZvciAoaSA9IGxlbmd0aCAtIDg7IGkgPiAwOyBpIC09IDgpIHsKLSsJCWRlcyh3aGVyZSArIGksIHdoZXJlICsgaSk7Ci0rCQlmb3IgKGo9MDsgaiA8IDg7IGorKykgewotKwkJCXdoZXJlW2kral0gXj0gd2hlcmVbaStqLThdOwotKwkJfQotKwl9Ci0rCS8qIGk9MCAqLwotKwlkZXMod2hlcmUsIHdoZXJlKTsKLSsJZm9yIChpPTA7IGkgPCA4OyBpKyspIHsKLSsJCXdoZXJlW2ldIF49IGtleVtpXTsKLSsJfQotK30KLSsKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItZnVsbHNjcmVlbi5wYXRjaCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItZnVsbHNjcmVlbi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0OTRlZS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvdGlnaHQtdm5jdmlld2VyLWZ1bGxzY3JlZW4ucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvZnVsbHNjcmVlbi5jCTIwMDMtMTAtMDkgMDU6MjM6NDkuMDAwMDAwMDAwIC0wNDAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL2Z1bGxzY3JlZW4uYwkyMDA0LTEyLTI2IDIxOjIxOjQ0LjAwMDAwMDAwMCAtMDUwMAotQEAgLTE3Myw5ICsxNzMsMTUgQEAKLSAgIFh0VmFTZXRWYWx1ZXMocG9wdXAsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsIE5VTEwpOwotIAotICAgLyogVHJ5IHRvIGdldCB0aGUgaW5wdXQgZm9jdXMuICovCi0tCi0rIAotKyNpZiAwCi0gICBYU2V0SW5wdXRGb2N1cyhkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIFJldmVydFRvUG9pbnRlclJvb3QsCi0gCQkgQ3VycmVudFRpbWUpOwotKyNlbHNlCi0rICBYU2V0SW5wdXRGb2N1cyhkcHksIFBvaW50ZXJSb290LCBSZXZlcnRUb1BvaW50ZXJSb290LAotKyAgICAgICAgICAgICAgICAgQ3VycmVudFRpbWUpOwotKyNlbmRpZgotKwotIAotICAgLyogT3B0aW9uYWxseSwgZ3JhYiB0aGUga2V5Ym9hcmQuICovCi0gCi1AQCAtMTg0LDYgKzE5MCwxMCBAQAotIAkJICAgICBHcmFiTW9kZUFzeW5jLCBDdXJyZW50VGltZSkgIT0gR3JhYlN1Y2Nlc3MpIHsKLSAgICAgZnByaW50ZihzdGRlcnIsICJYdEdyYWJLZXlib2FyZCgpIGZhaWxlZC5cbiIpOwotICAgfQotK2lmIChnZXRlbnYoIlZOQ1ZJRVdFUl9HUkFCX1NFUlZFUiIpICE9IE5VTEwpIHsgLyogcnVuZ2UgYm90IG9mIEZ1bGxTY3JlZW5PbiAqLwotKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIFhHcmFiU2VydmVyKGRweSlcbiIpOwotKyAgICAgICAgWEdyYWJTZXJ2ZXIoZHB5KTsgICAgICAgCi0rfQotIH0KLSAKLSAKLUBAIC0yMTAsNiArMjIwLDExIEBACi0gCi0gICBhcHBEYXRhLmZ1bGxTY3JlZW4gPSBGYWxzZTsKLSAKLStpZiAoZ2V0ZW52KCJWTkNWSUVXRVJfR1JBQl9TRVJWRVIiKSAhPSBOVUxMKSB7IC8qIHJ1bmdlIHRvcCBvZiBGdWxsU2NyZWVuT2ZmICovCi0rICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgWFVuZ3JhYlNlcnZlcihkcHkpXG4iKTsKLSsgICAgICAgIFhVbmdyYWJTZXJ2ZXIoZHB5KTsgICAgIAotK30KLSsKLSAgIGlmIChhcHBEYXRhLmdyYWJLZXlib2FyZCkKLSAgICAgWHRVbmdyYWJLZXlib2FyZChkZXNrdG9wLCBDdXJyZW50VGltZSk7Ci0gCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3BhdGNoZXMvdGlnaHQtdm5jdmlld2VyLW5ld2Zic2l6ZS5wYXRjaCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItbmV3ZmJzaXplLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTJjODExLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvcGF0Y2hlcy90aWdodC12bmN2aWV3ZXItbmV3ZmJzaXplLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9kZXNrdG9wLmMJMjAwNC0wNS0yOCAxMzoyOToyOS4wMDAwMDAwMDAgLTA0MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvZGVza3RvcC5jCTIwMDctMDEtMTMgMTM6NTk6NTEuMDAwMDAwMDAwIC0wNTAwCi1AQCAtNTAsNiArNTAsMzAgQEAKLSAgIH0sCi0gfTsKLSAKLSt2b2lkIGNyZWF0ZV9pbWFnZSgpIHsKLSsgIGltYWdlID0gTlVMTDsKLSsKLSsjaWZkZWYgTUlUU0hNCi0rICBpZiAoYXBwRGF0YS51c2VTaG0pIHsKLSsgICAgaW1hZ2UgPSBDcmVhdGVTaG1JbWFnZSgpOwotKyAgICBpZiAoIWltYWdlKQotKyAgICAgIGFwcERhdGEudXNlU2htID0gRmFsc2U7Ci0rICB9Ci0rI2VuZGlmCi0rCi0rICBpZiAoIWltYWdlKSB7Ci0rICAgIGltYWdlID0gWENyZWF0ZUltYWdlKGRweSwgdmlzLCB2aXNkZXB0aCwgWlBpeG1hcCwgMCwgTlVMTCwKLSsJCQkgc2kuZnJhbWVidWZmZXJXaWR0aCwgc2kuZnJhbWVidWZmZXJIZWlnaHQsCi0rCQkJIEJpdG1hcFBhZChkcHkpLCAwKTsKLSsKLSsgICAgaW1hZ2UtPmRhdGEgPSBtYWxsb2MoaW1hZ2UtPmJ5dGVzX3Blcl9saW5lICogaW1hZ2UtPmhlaWdodCk7Ci0rICAgIGlmICghaW1hZ2UtPmRhdGEpIHsKLSsgICAgICBmcHJpbnRmKHN0ZGVyciwibWFsbG9jIGZhaWxlZFxuIik7Ci0rICAgICAgZXhpdCgxKTsKLSsgICAgfQotKyAgfQotK30KLSsKLSAKLSAvKgotICAqIERlc2t0b3BJbml0QmVmb3JlUmVhbGl6YXRpb24gY3JlYXRlcyB0aGUgImRlc2t0b3AiIHdpZGdldCBhbmQgdGhlIHZpZXdwb3J0Ci1AQCAtODIsMzAgKzEwNiw5IEBACi0gICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgIG1vZGlmaWVyUHJlc3NlZFtpXSA9IEZhbHNlOwotIAotLSAgaW1hZ2UgPSBOVUxMOwotLQotLSNpZmRlZiBNSVRTSE0KLS0gIGlmIChhcHBEYXRhLnVzZVNobSkgewotLSAgICBpbWFnZSA9IENyZWF0ZVNobUltYWdlKCk7Ci0tICAgIGlmICghaW1hZ2UpCi0tICAgICAgYXBwRGF0YS51c2VTaG0gPSBGYWxzZTsKLS0gIH0KLS0jZW5kaWYKLS0KLS0gIGlmICghaW1hZ2UpIHsKLS0gICAgaW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIHZpc2RlcHRoLCBaUGl4bWFwLCAwLCBOVUxMLAotLQkJCSBzaS5mcmFtZWJ1ZmZlcldpZHRoLCBzaS5mcmFtZWJ1ZmZlckhlaWdodCwKLS0JCQkgQml0bWFwUGFkKGRweSksIDApOwotLQotLSAgICBpbWFnZS0+ZGF0YSA9IG1hbGxvYyhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUgKiBpbWFnZS0+aGVpZ2h0KTsKLS0gICAgaWYgKCFpbWFnZS0+ZGF0YSkgewotLSAgICAgIGZwcmludGYoc3RkZXJyLCJtYWxsb2MgZmFpbGVkXG4iKTsKLS0gICAgICBleGl0KDEpOwotLSAgICB9Ci0tICB9Ci0rICBjcmVhdGVfaW1hZ2UoKTsKLSB9Ci0gCi0tCi0gLyoKLSAgKiBEZXNrdG9wSW5pdEFmdGVyUmVhbGl6YXRpb24gZG9lcyB0aGluZ3Mgd2hpY2ggcmVxdWlyZSB0aGUgWCB3aW5kb3dzIHRvCi0gICogZXhpc3QuICBJdCBjcmVhdGVzIHNvbWUgR0NzIGFuZCBzZXRzIHRoZSBkb3QgY3Vyc29yLgotQEAgLTQ2MCwzICs0NjMsNzAgQEAKLSAgICAgYnJlYWs7Ci0gICB9Ci0gfQotKwotK3N0YXRpYyB2b2lkIHJlc2V0X2ltYWdlKHZvaWQpIHsKLSsJaWYgKFVzaW5nU2htKCkpIHsKLSsJCVNobUNsZWFudXAoKTsKLSsJfSBlbHNlIHsKLSsJCWlmIChpbWFnZSAmJiBpbWFnZS0+ZGF0YSkgewotKwkJCWZyZWUoaW1hZ2UtPmRhdGEpOwotKwkJCS8qIHNlZSBtYW5wYWdlIFhEZXN0cm95SW1hZ2UgbWF5IGFsc28gZnJlZSBkYXRhLCBzbyB3ZSBza2lwIGFuZCBoYXZlIGEgdGlueSBsZWFrIGluc3RlYWQgKi8KLSsJCQlpZiAoMCkgWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0rCQkJaW1hZ2UgPSBOVUxMOwotKwkJfQotKwl9Ci0rCWNyZWF0ZV9pbWFnZSgpOwotKwlYRmx1c2goZHB5KTsKLSt9Ci0rCi0rdm9pZCBSZURvRGVza3RvcCh2b2lkKSB7Ci0rCWludCB3LCBoLCB4LCB5LCBkdywgZGg7Ci0rCi0rCWlmIChhcHBEYXRhLmZ1bGxTY3JlZW4pIHsKLSsJCWlmIChpbWFnZSAmJiBpbWFnZS0+ZGF0YSkgewotKwkJCWludCBsZW47Ci0rCQkJaW50IGggPSBpbWFnZS0+aGVpZ2h0OwotKwkJCWludCB3ID0gaW1hZ2UtPndpZHRoOwotKwkJCWxlbiA9IGltYWdlLT5ieXRlc19wZXJfbGluZSAqIGltYWdlLT5oZWlnaHQ7Ci0rCQkJLyogYmxhY2sgb3V0IHdpbmRvdyBmaXJzdDogKi8KLSsJCQltZW1zZXQoaW1hZ2UtPmRhdGEsIDAsIGxlbik7Ci0rICAJCQlYUHV0SW1hZ2UoZHB5LCBYdFdpbmRvdyhkZXNrdG9wKSwgZ2MsIGltYWdlLCAwLCAwLCAwLCAwLCB3LCBoKTsKLSsJCQlYRmx1c2goZHB5KTsKLSsJCX0KLSsJCVh0UmVzaXplV2lkZ2V0KGRlc2t0b3AsIHNpLmZyYW1lYnVmZmVyV2lkdGgsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCAwKTsKLSsJCVhTeW5jKGRweSwgRmFsc2UpOwotKwkJdXNsZWVwKDEwMCoxMDAwKTsKLSsJCUZ1bGxTY3JlZW5PbigpOwotKwkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0rCQl1c2xlZXAoMTAwKjEwMDApOwotKwkJcmVzZXRfaW1hZ2UoKTsKLSsJCXJldHVybjsKLSsJfQotKwotKwlkdyA9IGFwcERhdGEud21EZWNvcmF0aW9uV2lkdGg7Ci0rCWRoID0gYXBwRGF0YS53bURlY29yYXRpb25IZWlnaHQ7Ci0rCi0rCXcgPSBzaS5mcmFtZWJ1ZmZlcldpZHRoOwotKwloID0gc2kuZnJhbWVidWZmZXJIZWlnaHQ7Ci0rCi0rCWlmICh3ICsgZHcgPj0gZHB5V2lkdGgpIHsKLSsJCXcgPSBkcHlXaWR0aCAtIGR3OwotKwl9Ci0rCWlmIChoICsgZGggPj0gZHB5SGVpZ2h0KSB7Ci0rCQloID0gZHB5SGVpZ2h0IC0gZGg7Ci0rCX0KLSsKLSsJWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHRObWF4V2lkdGgsIHcsIFh0Tm1heEhlaWdodCwgaCwgTlVMTCk7Ci0rCi0rCVh0VmFTZXRWYWx1ZXMoZGVza3RvcCwgWHROd2lkdGgsIHNpLmZyYW1lYnVmZmVyV2lkdGgsCi0rCSAgICBYdE5oZWlnaHQsIHNpLmZyYW1lYnVmZmVySGVpZ2h0LCBOVUxMKTsKLSsKLSsJeCA9IChkcHlXaWR0aCAgLSB3IC0gZHcpLzI7Ci0rCXkgPSAoZHB5SGVpZ2h0IC0gaCAtIGRoKS8yOwotKwotKwlYdFJlc2l6ZVdpZGdldChkZXNrdG9wLCBzaS5mcmFtZWJ1ZmZlcldpZHRoLCBzaS5mcmFtZWJ1ZmZlckhlaWdodCwgMCk7Ci0rCi0rCVh0Q29uZmlndXJlV2lkZ2V0KHRvcGxldmVsLCB4ICsgZHcsIHkgKyBkaCwgdywgaCwgMCk7Ci0rCi0rCXJlc2V0X2ltYWdlKCk7Ci0rfQotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL2Z1bGxzY3JlZW4uYwkyMDAzLTEwLTA5IDA1OjIzOjQ5LjAwMDAwMDAwMCAtMDQwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9mdWxsc2NyZWVuLmMJMjAwNi0wNy0yNyAxNDozNjowNi4wMDAwMDAwMDAgLTA0MDAKLUBAIC04NSwxMCArODUsMTMgQEAKLSAgIERpbWVuc2lvbiBvbGRWaWV3cG9ydFdpZHRoLCBvbGRWaWV3cG9ydEhlaWdodCwgY2xpcFdpZHRoLCBjbGlwSGVpZ2h0OwotICAgUG9zaXRpb24gdmlld3BvcnRYLCB2aWV3cG9ydFk7Ci0gCi0rICBCb29sIGZzQWxyZWFkeSA9IGFwcERhdGEuZnVsbFNjcmVlbiwgdG9vYmlnID0gRmFsc2U7Ci0rCi0gICBhcHBEYXRhLmZ1bGxTY3JlZW4gPSBUcnVlOwotIAotICAgaWYgKHNpLmZyYW1lYnVmZmVyV2lkdGggPiBkcHlXaWR0aCB8fCBzaS5mcmFtZWJ1ZmZlckhlaWdodCA+IGRweUhlaWdodCkgewotIAotKyAgICB0b29iaWcgPSBUcnVlOwotICAgICBYdFZhU2V0VmFsdWVzKHZpZXdwb3J0LCBYdE5mb3JjZUJhcnMsIFRydWUsIE5VTEwpOwotICAgICBYdFZhR2V0VmFsdWVzKHZpZXdwb3J0LCBYdE53aWR0aCwgJm9sZFZpZXdwb3J0V2lkdGgsCi0gCQkgIFh0TmhlaWdodCwgJm9sZFZpZXdwb3J0SGVpZ2h0LCBOVUxMKTsKLUBAIC0xMjksNiArMTMyLDcgQEAKLSAgICAgIHJlcGFyZW50aW5nIG91ciB3aW5kb3cgdG8gdGhlIHJvb3QuICBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnZXQgYQotICAgICAgUmVwYXJlbnROb3RpZnkgYW5kIGhvcGVmdWxseSBjbGVhbiB1cCBpdHMgZnJhbWUgd2luZG93LiAqLwotIAotK2lmICghIGZzQWxyZWFkeSkgewotICAgWHRWYVNldFZhbHVlcyh0b3BsZXZlbCwgWHROb3ZlcnJpZGVSZWRpcmVjdCwgVHJ1ZSwgTlVMTCk7Ci0gCi0gICBYUmVwYXJlbnRXaW5kb3coZHB5LCBYdFdpbmRvdyh0b3BsZXZlbCksIERlZmF1bHRSb290V2luZG93KGRweSksIDAsIDApOwotQEAgLTE2NCwxMCArMTY4LDIyIEBACi0gCi0gICBYdE1hbmFnZUNoaWxkKHZpZXdwb3J0KTsKLSAKLS0gIC8qIE5vdyB3ZSBjYW4gc2V0ICJ0b3BsZXZlbCIgdG8gaXRzIHByb3BlciBzaXplLiAqLwotK30gZWxzZSB7Ci0rCVhTeW5jKGRweSwgRmFsc2UpOwotK30KLSAKLSsgIC8qIE5vdyB3ZSBjYW4gc2V0ICJ0b3BsZXZlbCIgdG8gaXRzIHByb3BlciBzaXplLiAqLwotICAgWHRSZXNpemVXaWRnZXQodG9wbGV2ZWwsIHRvcGxldmVsV2lkdGgsIHRvcGxldmVsSGVpZ2h0LCAwKTsKLSAKLStpZiAoZnNBbHJlYWR5KSB7Ci0rICBYdFJlc2l6ZVdpZGdldCh2aWV3cG9ydCwgdmlld3BvcnRXaWR0aCwgdmlld3BvcnRIZWlnaHQsIDApOwotKyAgaWYgKCEgdG9vYmlnKSB7Ci0rCVh0VmFTZXRWYWx1ZXModmlld3BvcnQsIFh0TmZvcmNlQmFycywgRmFsc2UsIE5VTEwpOwotKyAgfQotKyAgWE1vdmVXaW5kb3coZHB5LCBYdFdpbmRvdyh2aWV3cG9ydCksIHZpZXdwb3J0WCwgdmlld3BvcnRZKTsKLSsgIFhTeW5jKGRweSwgRmFsc2UpOwotK30KLSsKLSAgIC8qIFNldCB0aGUgcG9wdXAgdG8gb3ZlcnJpZGVSZWRpcmVjdCB0b28gKi8KLSAKLSAgIFh0VmFTZXRWYWx1ZXMocG9wdXAsIFh0Tm92ZXJyaWRlUmVkaXJlY3QsIFRydWUsIE5VTEwpOwotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3JmYnByb3RvLmMJMjAwNC0wMy0xMSAxMzoxNDozOS4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvcmZicHJvdG8uYwkyMDA2LTA3LTI1IDIxOjUxOjIwLjAwMDAwMDAwMCAtMDQwMAotQEAgLTE3Nyw2ICsxNzcsOSBAQAotIAkgIHNpZ19yZmJFbmNvZGluZ1BvaW50ZXJQb3MsICJQb2ludGVyIHBvc2l0aW9uIHVwZGF0ZSIpOwotICAgQ2Fwc0FkZChlbmNvZGluZ0NhcHMsIHJmYkVuY29kaW5nTGFzdFJlY3QsIHJmYlRpZ2h0Vm5jVmVuZG9yLAotIAkgIHNpZ19yZmJFbmNvZGluZ0xhc3RSZWN0LCAiTGFzdFJlY3QgcHJvdG9jb2wgZXh0ZW5zaW9uIik7Ci0rCi0rICBDYXBzQWRkKGVuY29kaW5nQ2FwcywgcmZiRW5jb2RpbmdOZXdGQlNpemUsIHJmYlRpZ2h0Vm5jVmVuZG9yLAotKwkgIHNpZ19yZmJFbmNvZGluZ05ld0ZCU2l6ZSwgIk5ldyBGQiBzaXplIHByb3RvY29sIGV4dGVuc2lvbiIpOwotIH0KLSAKLSAKLUBAIC03MjksNiArNzMyLDcgQEAKLSAgIEJvb2wgcmVxdWVzdENvbXByZXNzTGV2ZWwgPSBGYWxzZTsKLSAgIEJvb2wgcmVxdWVzdFF1YWxpdHlMZXZlbCA9IEZhbHNlOwotICAgQm9vbCByZXF1ZXN0TGFzdFJlY3RFbmNvZGluZyA9IEZhbHNlOwotKyAgQm9vbCByZXF1ZXN0TmV3RkJTaXplRW5jb2RpbmcgPSBUcnVlOwotIAotICAgc3BmLnR5cGUgPSByZmJTZXRQaXhlbEZvcm1hdDsKLSAgIHNwZi5mb3JtYXQgPSBteUZvcm1hdDsKLUBAIC04MDYsNiArODEwLDEwIEBACi0gICAgIGlmIChzZS0+bkVuY29kaW5ncyA8IE1BWF9FTkNPRElOR1MgJiYgcmVxdWVzdExhc3RSZWN0RW5jb2RpbmcpIHsKLSAgICAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ0xhc3RSZWN0KTsKLSAgICAgfQotKwotKyAgICBpZiAoc2UtPm5FbmNvZGluZ3MgPCBNQVhfRU5DT0RJTkdTICYmIHJlcXVlc3ROZXdGQlNpemVFbmNvZGluZykgewotKyAgICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nTmV3RkJTaXplKTsKLSsgICAgfQotICAgfQotICAgZWxzZSB7Ci0gICAgIGlmIChTYW1lTWFjaGluZShyZmJzb2NrKSkgewotQEAgLTg0OSw2ICs4NTcsNyBAQAotICAgICB9Ci0gCi0gICAgIGVuY3Nbc2UtPm5FbmNvZGluZ3MrK10gPSBTd2FwMzJJZkxFKHJmYkVuY29kaW5nTGFzdFJlY3QpOwotKyAgICBlbmNzW3NlLT5uRW5jb2RpbmdzKytdID0gU3dhcDMySWZMRShyZmJFbmNvZGluZ05ld0ZCU2l6ZSk7Ci0gICB9Ci0gCi0gICBsZW4gPSBzel9yZmJTZXRFbmNvZGluZ3NNc2cgKyBzZS0+bkVuY29kaW5ncyAqIDQ7Ci1AQCAtMTAzOCw2ICsxMDQ3LDE2IEBACi0gCX0KLSAJY29udGludWU7Ci0gICAgICAgfQotKyAgICAgIGlmIChyZWN0LmVuY29kaW5nID09IHJmYkVuY29kaW5nTmV3RkJTaXplKSB7Ci0rCSAgZnByaW50ZihzdGRlcnIsIk5ldyBTaXplOiAlZHglZCBhdCAoJWQsICVkKVxuIiwKLSsJCSAgcmVjdC5yLncsIHJlY3Quci5oLCByZWN0LnIueCwgcmVjdC5yLnkpOwotKwlzaS5mcmFtZWJ1ZmZlcldpZHRoID0gcmVjdC5yLnc7Ci0rCXNpLmZyYW1lYnVmZmVySGVpZ2h0ID0gcmVjdC5yLmg7Ci0rICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpOiAlZCAlZFxuIiwgc2kuZnJhbWVidWZmZXJXaWR0aCwgc2kuZnJhbWVidWZmZXJIZWlnaHQpOwotKwlSZURvRGVza3RvcCgpOwotKwotKwljb250aW51ZTsKLSsgICAgICB9Ci0gCi0gICAgICAgaWYgKChyZWN0LnIueCArIHJlY3Quci53ID4gc2kuZnJhbWVidWZmZXJXaWR0aCkgfHwKLSAJICAocmVjdC5yLnkgKyByZWN0LnIuaCA+IHNpLmZyYW1lYnVmZmVySGVpZ2h0KSkKLS0tLSB2bmNfdW5peHNyYy5vcmlnL3ZuY3ZpZXdlci9zaG0uYwkyMDAwLTA2LTExIDA4OjAwOjUzLjAwMDAwMDAwMCAtMDQwMAotKysrIHZuY191bml4c3JjL3ZuY3ZpZXdlci9zaG0uYwkyMDA2LTA3LTI2IDIzOjMwOjQyLjAwMDAwMDAwMCAtMDQwMAotQEAgLTQxLDYgKzQxLDEwIEBACi0gICB9Ci0gfQotIAotK0Jvb2wgVXNpbmdTaG0oKSB7Ci0rCXJldHVybiBuZWVkU2htQ2xlYW51cDsKLSt9Ci0rCi0gc3RhdGljIGludAotIFNobUNyZWF0aW9uWEVycm9ySGFuZGxlcihEaXNwbGF5ICpkcHksIFhFcnJvckV2ZW50ICplcnJvcikKLSB7Ci0tLS0gdm5jX3VuaXhzcmMub3JpZy92bmN2aWV3ZXIvdm5jdmlld2VyLmgJMjAwNC0wMy0xMSAxMzoxNDo0MC4wMDAwMDAwMDAgLTA1MDAKLSsrKyB2bmNfdW5peHNyYy92bmN2aWV3ZXIvdm5jdmlld2VyLmgJMjAwNi0wNy0yNiAyMzozMToyNS4wMDAwMDAwMDAgLTA0MDAKLUBAIC0xNjIsNiArMTYyLDggQEAKLSBleHRlcm4gdm9pZCBDb3B5RGF0YVRvU2NyZWVuKGNoYXIgKmJ1ZiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotIGV4dGVybiB2b2lkIFN5bmNocm9uaXNlU2NyZWVuKCk7Ci0gCi0rZXh0ZXJuIHZvaWQgUmVEb0Rlc2t0b3AoKTsKLSsKLSAvKiBkaWFsb2dzLmMgKi8KLSAKLSBleHRlcm4gdm9pZCBTZXJ2ZXJEaWFsb2dEb25lKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywKLUBAIC0yNDMsNiArMjQ1LDcgQEAKLSAKLSBleHRlcm4gWEltYWdlICpDcmVhdGVTaG1JbWFnZSgpOwotIGV4dGVybiB2b2lkIFNobUNsZWFudXAoKTsKLStleHRlcm4gQm9vbCBVc2luZ1NobSgpOwotIAotIC8qIHNvY2tldHMuYyAqLwotIAotLS0tIHZuY191bml4c3JjLm9yaWcvdm5jdmlld2VyL3ZuY3ZpZXdlci5jCTIwMDQtMDEtMTMgMDk6MjI6MDUuMDAwMDAwMDAwIC0wNTAwCi0rKysgdm5jX3VuaXhzcmMvdm5jdmlld2VyL3ZuY3ZpZXdlci5jCTIwMDYtMDctMjcgMTk6MDA6MjUuMDAwMDAwMDAwIC0wNDAwCi1AQCAtNTcsNiArNTcsMTEgQEAKLSAgICAgfQotICAgfQotIAotKyAgaWYgKGFyZ2MgPiAxICYmIHN0cnN0cihhcmd2WzFdLCAiLWgiKSA9PSBhcmd2WzFdKSB7Ci0rICAJdXNhZ2UoKTsKLSsJcmV0dXJuIDA7Ci0rICB9Ci0rCi0gICAvKiBDYWxsIHRoZSBtYWluIFh0IGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uLiAgSXQgcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zLAotICAgICAgZ2VuZXJhdGluZyBhcHByb3ByaWF0ZSByZXNvdXJjZSBzcGVjcywgYW5kIG1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgWAotICAgICAgZGlzcGxheS4gKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvemlwcy9SRUFETUUgYi94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3JjL3ppcHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjExMzc3Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zcmMvemlwcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1UaGlzIGlzIHdoZXJlIHdlIGtlZXAgdGhlIDNyZCBwYXJ0eSBzb3VyY2UgemlwIGFuZCB0YXIuZ3ogZmlsZXMgdXNlZAotdG8gYnVpbGQgdGhpcyBwYWNrYWdlLgotCi13d3cuc3R1bm5lbC5vcmcgc291cmNlICAgICAgIDQ4ODUxMiBKdWwgMjUgMTU6MDkgc3R1bm5lbC00LjE0LnRhci5negotaHR0cDovL3N0dW5uZWwubWlydC5uZXQKLXd3dy50aWdodHZuYy5jb20gc291cmNlICAgICAyMTgyMTM0IEp1bCAyNSAxNToxMSB0aWdodHZuYy0xLjNkZXY3X3VuaXhzcmMudGFyLmd6Ci13d3cudGlnaHR2bmMuY29tIHdpbmRvd3MKLSAgc3RhbmRhbG9uZSB2aWV3ZXIgYmluYXJ5OiAgMjA5MTQ5IEp1bCAyNSAxNToxMCB0aWdodHZuYy0xLjNkZXY3X3g4Nl92aWV3ZXIuemlwCi0KLVRvIHNhdmUgc3BhY2UgdGhleSBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlIHlvdSBkb3dubG9hZGVkLgotVGhlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgInNzdm5jX2FsbC08dmVyc2lvbj4uemlwIiBmaWxlLgotR28gdG8gdGhlIHdlYnNpdGVzIGluZGljYXRlZCBhYm92ZSBvciBjb250YWN0IG1lIGlmIHlvdSBjYW5ub3QgZmluZCB0aGVtLgotCi1UaGUgc3R1bm5lbC5wYXRjaGVkLnRhciB2bmNfdW5peHNyY192bmN2aWV3ZXIucGF0Y2hlZC50YXIKLWZpbGVzIGFyZSB0YXJiYWxscyBvZiB0aGUgb3JpZ2luYWwgc291cmNlcyBhYm92ZSB3aXRoIHBhdGNoZXMgYXBwbGllZAotKHVzZWQgYnkgYnVpbGQudW5peCBzY3JpcHQgd2hlbiBwYXRjaGluZyBmYWlscykuCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9lbmhhbmNlZF90aWdodHZuY192aWV3ZXIvc3N2bmMuZGVza3RvcCBiL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zc3ZuYy5kZXNrdG9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYyNmI2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci9zc3ZuYy5kZXNrdG9wCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotW0Rlc2t0b3AgRW50cnldCi0jIENvcHkgdGhpcyBmaWxlIHRvICIvdXNyL3NoYXJlZC9hcHBsaWNhdGlvbnMvc3N2bmMuZGVza3RvcCIgdGhlbiBTU1ZOQyB3aWxsCi0jIGFwcGVhciBpbiBkZXNrdG9wIG1lbnVzIChvbmNlIHRoZXkgYXJlIHVwZGF0ZWQ7IGUuZy4gdXBkYXRlLW1lbnVzIGNvbW1hbmQpLgotTmFtZT1TU0wvU1NIIFZOQyBWaWV3ZXIKLUNvbW1lbnQ9U1NWTkMgLSBhY2Nlc3MgcmVtb3RlIFZOQyBkZXNrdG9wcwotRXhlYz1zc3ZuYyAtbm9lbmMKLUljb249Y29tcHV0ZXIKLVRlcm1pbmFsPWZhbHNlCi1UeXBlPUFwcGxpY2F0aW9uCi1TdGFydHVwV01DbGFzcz1Tc3ZuYy50Y2wKLUNhdGVnb3JpZXM9TmV0d29yaztSZW1vdGVBY2Nlc3M7CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9pbmV0NnRvNCBiL3gxMXZuYy9taXNjL2luZXQ2dG80CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDY3YTk5Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL2luZXQ2dG80CisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBpbmV0NnRvNDogIEFjdCBhcyBhbiBpcHY2LXRvLWlwdjQgcmVsYXkgZm9yIHRjcCBhcHBsaWNhdGlvbnMgdGhhdAotIyAgICAgICAgICAgIGRvIG5vdCBzdXBwb3J0IGlwdjYuCi0jCi0jIFVzYWdlOiAgICAgaW5ldDZ0bzQgICAgPGlwdjYtbGlzdGVuLXBvcnQ+IDxpcHY0LWhvc3Q6cG9ydD4KLSMgICAgICAgICAgICBpbmV0NnRvNCAtciA8aXB2NC1saXN0ZW4tcG9ydD4gPGlwdjYtaG9zdDpwb3J0PgotIwotIyBFeGFtcGxlczogIGluZXQ2dG80IDU5MDAgbG9jYWxob3N0OjU5MDAKLSMgICAgICAgICAgICBpbmV0NnRvNCA4MDgwIHdlYjE6ODAKLSMgICAgICAgICAgICBpbmV0NnRvNCAtciA1OTAwIGZlODA6OjIxNzpmMmZmOmZlZTY6NmY1YSVldGgwOjU5MDAKLSMKLSMgVGhlIC1yIG9wdGlvbiByZXZlcnNlcyB0aGUgZGlyZWN0aW9uIG9mIHRyYW5zbGF0aW9uIChlLmcuIGZvciBpcHY0Ci0jIGNsaWVudHMgdGhhdCBuZWVkIHRvIGNvbm5lY3QgdG8gaXB2NiBzZXJ2ZXJzLikgIFJldmVyc2luZyBpcyB0aGUgZGVmYXVsdAotIyBpZiB0aGlzIHNjcmlwdCBpcyBuYW1lZCAnaW5ldDR0bzYnIChlLmcuIGJ5IGEgc3ltbGluay4pCi0jCi0jIFVzZSBDdHJsLUMgdG8gc3RvcCB0aGlzIHByb2dyYW0uICBZb3UgY2FuIGFsc28gc3VwcGx5ICctYyBuJyBhcyB0aGUKLSMgZmlyc3Qgb3B0aW9uIHRvIG9ubHkgaGFuZGxlIHRoYXQgbWFueSBjb25uZWN0aW9ucy4KLSMKLSMgQWxzbyBzZXQgdGhlIGVudi4gdmFycyBJTkVUNlRPNF9MT09QPTEgb3IgSU5FVDZUTzRfTE9PUD1CRwotIyB0byBoYXZlIGFuIG91dGVyIGxvb3AgcmVzdGFydGluZyB0aGlzIHByb2dyYW0gKEJHIG1lYW5zIGRvIHRoYXQKLSMgaW4gdGhlIGJhY2tncm91bmQpLCBhbmQgSU5FVDZUTzRfTE9HRklMRSBmb3IgYSBsb2cgZmlsZS4KLSMgQWxzbyBzZXQgSU5FVDZUTzRfVkVSQk9TRSB0byB2ZXJib3NpdHkgbGV2ZWwgYW5kIElORVQ2VE80X1dBSVRUSU1FCi0jIGFuZCBJTkVUNlRPNF9QSURGSUxFIChzZWUgYmVsb3cuKQotIwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMTAgYnkgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSMKLSMgaW5ldDZ0bzQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgaW5ldDZ0bzQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBpbmV0NnRvNDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIyBvciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXkgJHByb2dyYW0gPSAiaW5ldDZ0bzQiOwotCi0jIFNldCB1cCBsb2dnaW5nOgotIwotaWYgKGV4aXN0cyAkRU5We0lORVQ2VE80X0xPR0ZJTEV9KSB7Ci0JY2xvc2UgU1RET1VUOwotCWlmICghb3BlbihTVERPVVQsICI+PiRFTlZ7SU5FVDZUTzRfTE9HRklMRX0iKSkgewotCSAgICAgICAgZGllICIkcHJvZ3JhbTogJEVOVntJTkVUNlRPNF9MT0dGSUxFfSAkIVxuIjsKLQl9Ci0JY2xvc2UgU1RERVJSOwotCW9wZW4oU1RERVJSLCAiPiZTVERPVVQiKTsKLX0KLXNlbGVjdChTVERFUlIpOyAkfCA9IDE7Ci1zZWxlY3QoU1RET1VUKTsgJHwgPSAxOwotCi0jIGludGVycnVwdCBoYW5kbGVyOgotIwotbXkgJGxvb3BwaWQgPSAnJzsKLW15ICRwaWRmaWxlID0gJyc7Ci1teSAkbGlzdGVuX3NvY2sgPSAnJzsJIyBkZWNsYXJlZCBoZXJlIGZvciBnZXRfb3V0KCkKLSMKLXN1YiBnZXRfb3V0IHsKLQlwcmludCBTVERFUlIgIiRfWzBdOlx0JCQgbG9vcHBpZD0kbG9vcHBpZFxuIjsKLQljbG9zZSAkbGlzdGVuX3NvY2sgaWYgJGxpc3Rlbl9zb2NrOwotCWlmICgkbG9vcHBpZCkgewotCQlraWxsICdURVJNJywgJGxvb3BwaWQ7Ci0JCWZzbGVlcCgwLjIpOwotCX0KLQl1bmxpbmsgJHBpZGZpbGUgaWYgJHBpZGZpbGU7Ci0JZXhpdCAwOwotfQotJFNJR3tJTlR9ICA9IFwmZ2V0X291dDsKLSRTSUd7VEVSTX0gPSBcJmdldF9vdXQ7Ci0KLSMgcGlkZmlsZToKLSMKLXN1YiBvcGVuX3BpZGZpbGUgewotCWlmIChleGlzdHMgJEVOVntJTkVUNlRPNF9QSURGSUxFfSkgewotCQlteSAkcGYgPSAkRU5We0lORVQ2VE80X1BJREZJTEV9OwotCQlpZiAob3BlbihQSUQsICI+JHBmIikpIHsKLQkJCXByaW50IFBJRCAiJCRcbiI7Ci0JCQljbG9zZSBQSUQ7Ci0JCQkkcGlkZmlsZSA9ICRwZjsKLQkJfSBlbHNlIHsKLQkJCXByaW50IFNUREVSUiAiY291bGQgbm90IG9wZW4gcGlkZmlsZTogJHBmIC0gJCEgLSBjb250aW51aW5nLi4uXG4iOwotCQl9Ci0JCWRlbGV0ZSAkRU5We0lORVQ2VE80X1BJREZJTEV9OwotCX0KLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2V0IElORVQ2VE80X0xPT1A9MSB0byBoYXZlIHRoaXMgc2NyaXB0IGNyZWF0ZSBhbiBvdXRlciBsb29wCi0jIHJlc3RhcnRpbmcgaXRzZWxmIGlmIGl0IGV2ZXIgZXhpdHMuICBTZXQgSU5FVDZUTzRfTE9PUD1CRyB0bwotIyBkbyB0aGlzIGluIHRoZSBiYWNrZ3JvdW5kIGFzIGEgZGFlbW9uLgotCi1pZiAoZXhpc3RzICRFTlZ7SU5FVDZUTzRfTE9PUH0pIHsKLQlteSAkY3NsID0gJEVOVntJTkVUNlRPNF9MT09QfTsKLQlpZiAoJGNzbCBuZSAnQkcnICYmICRjc2wgbmUgJzEnKSB7Ci0JCWRpZSAiJHByb2dyYW06IGludmFsaWQgSU5FVDZUTzRfTE9PUC5cbiI7Ci0JfQotCWlmICgkY3NsIGVxICdCRycpIHsKLQkJIyBnbyBpbnRvIGJnIGFzICJkYWVtb24iOgotCQlzZXRwZ3JwKDAsIDApOwotCQlteSAkcGlkID0gZm9yaygpOwotCQlpZiAoISBkZWZpbmVkICRwaWQpIHsKLQkJCWRpZSAiJHByb2dyYW06ICQhXG4iOwotCQl9IGVsc2lmICgkcGlkKSB7Ci0JCQl3YWl0OwotCQkJZXhpdCAwOwotCQl9Ci0JCWlmIChmb3JrKSB7Ci0JCQlleGl0IDA7Ci0JCX0KLQkJc2V0cGdycCgwLCAwKTsKLQkJY2xvc2UgU1RESU47Ci0JCWlmICghICRFTlZ7SU5FVDZUTzRfTE9HRklMRX0pIHsKLQkJCWNsb3NlIFNURE9VVDsKLQkJCWNsb3NlIFNUREVSUjsKLQkJfQotCX0KLQlkZWxldGUgJEVOVntJTkVUNlRPNF9MT09QfTsKLQotCWlmIChleGlzdHMgJEVOVntJTkVUNlRPNF9QSURGSUxFfSkgewotCQlvcGVuX3BpZGZpbGUoKTsKLQl9Ci0KLQlwcmludCBTVERFUlIgIiRwcm9ncmFtOiBzdGFydGluZyBzZXJ2aWNlIGF0ICIsIHNjYWxhcihsb2NhbHRpbWUpLCAiIG1hc3Rlci1waWQ9JCRcbiI7Ci0Jd2hpbGUgKDEpIHsKLQkJJGxvb3BwaWQgPSBmb3JrOwotCQlpZiAoISBkZWZpbmVkICRsb29wcGlkKSB7Ci0JCQlzbGVlcCAxMDsKLQkJfSBlbHNpZiAoJGxvb3BwaWQpIHsKLQkJCXdhaXQ7Ci0JCX0gZWxzZSB7Ci0JCQlleGVjICQwLCBAQVJHVjsJCi0JCQlleGl0IDE7Ci0JCX0KLQkJcHJpbnQgU1RERVJSICIkcHJvZ3JhbTogcmUtc3RhcnRpbmcgc2VydmljZSBhdCAiLCBzY2FsYXIobG9jYWx0aW1lKSwgIiBtYXN0ZXItcGlkPSQkXG4iOwotCQlzbGVlcCAxOwotCX0KLQlleGl0IDA7Ci19Ci1pZiAoZXhpc3RzICRFTlZ7SU5FVDZUTzRfUElERklMRX0pIHsKLQlvcGVuX3BpZGZpbGUoKTsKLX0KLQotdXNlIElPOjpTb2NrZXQ6OklORVQ2OwotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsKLQotIyBzb21lIHNldHRpbmdzOgotIwotbXkgJHZlcmJvc2UgPSAxOwkjIHNldCB0byAwIGZvciBubyBtZXNzYWdlcywgMiBmb3IgbW9yZS4KLW15ICRraWxscGlkID0gMTsJIyBkb2VzIGtpbGwoMikgYXQgZW5kIG9mIGNvbm5lY3Rpb24uIAotbXkgJHdhaXR0aW1lID0gMC4yNTsJIyB0aW1lIHRvIHdhaXQgYmV0d2VlbiBjb25uZWN0aW9ucy4KLW15ICRyZXZlcnNlID0gMDsJIyAtciBzd2l0Y2ggKG9yIGZpbGUgbmFtZWQgaW5ldDR0bzYpCi0KLWlmIChleGlzdHMgJEVOVntJTkVUNlRPNF9WRVJCT1NFfSkgewotCSR2ZXJib3NlID0gJEVOVntJTkVUNlRPNF9WRVJCT1NFfTsKLX0KLWlmIChleGlzdHMgJEVOVntJTkVUNlRPNF9XQUlUVElNRX0pIHsKLQkkd2FpdHRpbWUgPSAkRU5We0lORVQ2VE80X1dBSVRUSU1FfTsKLX0KLQotIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmdzOgotCi1pZiAoISBAQVJHViB8fCAkQVJHVlswXSA9fiAnXi0raCcpIHsJIyAtaGVscAotCW9wZW4oTUUsICI8JDAiKTsKLQl3aGlsZSAoPE1FPikgewotCQlsYXN0IHVubGVzcyAvXiMvOwotCQluZXh0IGlmIC91c3IuYmluLnBlcmwvOwotCQkkXyA9fiBzLyMgPy8vOwotCQlwcmludDsKLQl9Ci0JZXhpdDsKLX0KLQotbXkgJGNtYXggPSAwOwotaWYgKCRBUkdWWzBdIGVxICctYycpIHsJCQkjIC1jCi0Jc2hpZnQ7Ci0JJGNtYXggPSBzaGlmdDsKLX0KLQotaWYgKCRBUkdWWzBdIGVxICctcicpIHsJCQkjIC1yCi0Jc2hpZnQ7Ci0JJHJldmVyc2UgPSAxOwotfSBlbHNpZiAoJDAgPX4gL2luZXQ0dG82JC8pIHsKLQkkcmV2ZXJzZSA9IDE7Ci19Ci0KLW15ICRsaXN0ZW5fcG9ydCA9IHNoaWZ0OwkJIyBpcHY2LWxpc3Rlbi1wb3J0Ci1teSAkY29ubmVjdF90byAgPSBzaGlmdDsJCSMgaXB2NC1ob3N0OnBvcnQKLQotZGllICJubyBsaXN0ZW4gcG9ydCBvciBjb25uZWN0LXRvLWhvc3Q6cG9ydFxuIiBpZiAhICRsaXN0ZW5fcG9ydCB8fCAhICRjb25uZWN0X3RvOwotCi0jIGNvbm5lY3QgdG8gaG9zdDoKLSMKLW15ICRob3N0ID0gJyc7Ci1teSAkcG9ydCA9ICcnOwotaWYgKCRjb25uZWN0X3RvID1+IC9eKC4qKTooXGQrKSQvKSB7Ci0JJGhvc3QgPSAkMTsKLQkkcG9ydCA9ICQyOwotfQotZGllICJpbnZhbGlkIGNvbm5lY3QtdG8taG9zdDpwb3J0XG4iIGlmICEgJGhvc3QgfHwgISAkcG9ydDsKLQotc2V0cGdycCgwLCAwKTsKLQotIyBjcmVhdGUgbGlzdGVuaW5nIHNvY2tldDoKLSMKLW15ICVvcHRzOwotJG9wdHN7TGlzdGVufSAgICA9IDEwOwotJG9wdHN7UHJvdG99ICAgICA9ICJ0Y3AiOwotJG9wdHN7UmV1c2VBZGRyfSA9IDE7Ci1pZiAoJGxpc3Rlbl9wb3J0ID1+IC9eKC4qKTooXGQrKSQvKSB7Ci0JJG9wdHN7TG9jYWxBZGRyfSA9ICQxOwotCSRsaXN0ZW5fcG9ydCA9ICQyOwotfQotJG9wdHN7TG9jYWxQb3J0fSA9ICRsaXN0ZW5fcG9ydDsKLQotaWYgKCEkcmV2ZXJzZSkgewotCSMgZm9yY2UgaXB2NiBpbnRlcmZhY2U6Ci0JJG9wdHN7RG9tYWlufSA9IEFGX0lORVQ2OwotCSRsaXN0ZW5fc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoJW9wdHMpOwotfSBlbHNlIHsKLQkkbGlzdGVuX3NvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoJW9wdHMpOwotCWlmICghICRsaXN0ZW5fc29jayAmJiAkISA9fiAvaW52YWxpZC9pKSB7Ci0JCXdhcm4gIiRwcm9ncmFtOiAkISwgcmV0cnlpbmcgd2l0aCBBRl9VTlNQRUM6XG4iOwotCQkkb3B0c3tEb21haW59ID0gQUZfVU5TUEVDOwotCQkkbGlzdGVuX3NvY2sgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KCVvcHRzKTsKLQl9Ci19Ci1pZiAoISAkbGlzdGVuX3NvY2spIHsKLQlkaWUgIiRwcm9ncmFtOiAkIVxuIjsKLX0KLQotIyBmb3IgdXNlIGJ5IHRoZSB4ZmVyIGhlbHBlciBwcm9jZXNzZXMnIGludGVycnVwdCBoYW5kbGVyczoKLSMKLW15ICRjdXJyZW50X2ZoMSA9ICcnOwotbXkgJGN1cnJlbnRfZmgyID0gJyc7Ci0KLSMgY29ubmVjdGlvbiBjb3VudGVyOgotIwotbXkgJGNvbm4gPSAwOwotCi0jIGxvb3AgZm9yZXZlciB3YWl0aW5nIGZvciBjb25uZWN0aW9uczoKLSMKLXdoaWxlICgxKSB7Ci0JJGNvbm4rKzsKLQlpZiAoJGNtYXggPiAwICYmICRjb25uID4gJGNtYXgpIHsKLQkJcHJpbnQgU1RERVJSICJsYXN0IGNvbm5lY3Rpb24gKCRjbWF4KVxuIiBpZiAkdmVyYm9zZTsgCi0JCWxhc3Q7Ci0JfQotCXByaW50IFNUREVSUiAibGlzdGVuaW5nIGZvciBjb25uZWN0aW9uOiAkY29ublxuIiBpZiAkdmVyYm9zZTsgCi0JbXkgKCRjbGllbnQsICRpcCkgPSAkbGlzdGVuX3NvY2stPmFjY2VwdCgpOwotCi0JaWYgKCRjbGllbnQgJiYgISRyZXZlcnNlICYmICRwb3J0ID09ICRsaXN0ZW5fcG9ydCkgewotCQkjIFRoaXMgaGFwcGVucyBvbiBEYXJ3aW4gJ3RjcDQ2JwotCQlpZiAoJGNsaWVudC0+cGVlcmhvc3QoKSA9fiAvXjo6ZmZmZjovKSB7Ci0JCQlwcmludCBTVERFUlIgImNsb3NpbmcgY2xpZW50IHdlIHRoaW5rIGlzIGFjdHVhbGx5IHVzOiAiLAotCQkJICAgICRjbGllbnQtPnBlZXJob3N0KCksICJcbiI7Ci0JCQljbG9zZSAkY2xpZW50OwotCQkJJGNsaWVudCA9IHVuZGVmOwotCQl9Ci0JfQotCWlmICghICRjbGllbnQpIHsKLQkJIyB0byB0aHJvdHRsZSBydW5hd2F5cwotCQlmc2xlZXAoMiAqICR3YWl0dGltZSk7Ci0JCW5leHQ7Ci0JfQotCXByaW50IFNUREVSUiAiY29ubjogJGNvbm4gLS0gIiwgJGNsaWVudC0+cGVlcmhvc3QoKSwgIiBhdCAiLCBzY2FsYXIobG9jYWx0aW1lKSwgIlxuIiBpZiAkdmVyYm9zZTsKLQotCSMgc3Bhd24gaGVscGVyOgotCSMKLQlteSAkcGlkID0gZm9yaygpOwotCWlmICghIGRlZmluZWQgJHBpZCkgewotCQlkaWUgIiRwcm9ncmFtOiAkIVxuIjsKLQl9IGVsc2lmICgkcGlkKSB7Ci0JCXdhaXQ7Ci0JCSMgdG8gdGhyb3R0bGUgcnVuYXdheXMKLQkJZnNsZWVwKCR3YWl0dGltZSk7Ci0JCW5leHQ7Ci0JfSBlbHNlIHsKLQkJIyB0aGlzIGlzIHRvIGF2b2lkIHpvbWJpZXM6Ci0JCWNsb3NlICRsaXN0ZW5fc29jazsKLQkJaWYgKGZvcmspIHsKLQkJCWV4aXQgMDsKLQkJfQotCQlzZXRwZ3JwKDAsIDApOwotCQloYW5kbGVfY29ubigkY2xpZW50KTsKLQl9Ci19Ci0KLWV4aXQgMDsKLQotc3ViIGhhbmRsZV9jb25uIHsKLQlteSAkY2xpZW50ID0gc2hpZnQ7Ci0KLQlteSAkc3RhcnQgPSB0aW1lKCk7Ci0KLQlwcmludCBTVERFUlIgImNvbm5lY3RpbmcgdG86ICRob3N0OiRwb3J0XG4iIGlmICR2ZXJib3NlOwotCi0JbXkgJHNvY2sgPSAnJzsKLQlteSAlb3B0czsKLQkkb3B0c3tQZWVyQWRkcn0gPSAkaG9zdDsKLQkkb3B0c3tQZWVyUG9ydH0gPSAkcG9ydDsKLQkkb3B0c3tQcm90b30gICAgPSAidGNwIjsKLQlpZiAoISRyZXZlcnNlKSB7Ci0JCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KCVvcHRzKTsKLQl9IGVsc2UgewotCQkkb3B0c3tEb21haW59ID0gQUZfSU5FVDY7Ci0JCSRzb2NrID0gSU86OlNvY2tldDo6SU5FVDYtPm5ldyglb3B0cyk7Ci0JfQotCWlmICghICRzb2NrKSB7Ci0JCXdhcm4gIiRwcm9ncmFtOiAkISwgcmV0cnlpbmcgd2l0aCBBRl9VTlNQRUM6XG4iOwotCQkkb3B0c3tEb21haW59ID0gQUZfVU5TUEVDOwotCQkkc29jayA9IElPOjpTb2NrZXQ6OklORVQ2LT5uZXcoJW9wdHMpOwotCX0KLQotCWlmICghICRzb2NrKSB7Ci0JCWNsb3NlICRjbGllbnQ7Ci0JCWRpZSAiJHByb2dyYW06ICQhXG4iOwotCX0KLQotCSRjdXJyZW50X2ZoMSA9ICRjbGllbnQ7Ci0JJGN1cnJlbnRfZmgyID0gJHNvY2s7Ci0KLQkjIGludGVycnVwdCBoYW5kbGVyOgotCSMKLQkkU0lHe1RFUk19ID0gc3ViIHtwcmludCBTVERFUlIgImdvdCBzaWd0ZXJtXFskJF1cbiIgaWYgJHZlcmJvc2U7IGNsb3NlICRjdXJyZW50X2ZoMTsgY2xvc2UgJGN1cnJlbnRfZmgyOyBleGl0IDB9OwotCi0JIyBzcGF3biBhbm90aGVyIGhlbHBlciBhbmQgdHJhbnNmZXIgdGhlIGRhdGE6Ci0JIwotCW15ICRwYXJlbnQgPSAkJDsKLQlpZiAobXkgJGNoaWxkID0gZm9yaygpKSB7Ci0JCXhmZXIoJHNvY2ssICRjbGllbnQsICdTLT5DJyk7Ci0JCWlmICgka2lsbHBpZCkgewotCQkJZnNsZWVwKDAuNSk7Ci0JCQlraWxsICdURVJNJywgJGNoaWxkOwotCQl9Ci0JfSBlbHNlIHsKLQkJeGZlcigkY2xpZW50LCAkc29jaywgJ0MtPlMnKTsKLQkJaWYgKCRraWxscGlkKSB7Ci0JCQlmc2xlZXAoMC43NSk7Ci0JCQlraWxsICdURVJNJywgJHBhcmVudDsKLQkJfQotCX0KLQotCSMgZG9uZS4KLQkjCi0JaWYgKCR2ZXJib3NlID4gMSkgewotCQlteSAkZHQgPSB0aW1lKCkgLSAkc3RhcnQ7Ci0JCXByaW50IFNUREVSUiAiZHRcWyQkXTogJGR0XG4iOwotCX0KLQlleGl0IDA7Ci19Ci0KLSMgdHJhbnNmZXJzIGRhdGEgaW4gb25lIGRpcmVjdGlvbjoKLSMKLXN1YiB4ZmVyIHsKLQlteSgkaW4sICRvdXQsICRsYWIpID0gQF87Ci0JbXkgKCRSSU4sICRXSU4sICRFSU4sICRST1VUKTsKLQkkUklOID0gJFdJTiA9ICRFSU4gPSAiIjsKLQkkUk9VVCA9ICIiOwotCXZlYygkUklOLCBmaWxlbm8oJGluKSwgMSkgPSAxOwotCXZlYygkV0lOLCBmaWxlbm8oJGluKSwgMSkgPSAxOwotCSRFSU4gPSAkUklOIHwgJFdJTjsKLQlteSAkYnVmOwotCi0Jd2hpbGUgKDEpIHsKLQkJbXkgJG5mID0gMDsKLQkJd2hpbGUgKCEgJG5mKSB7Ci0JCQkkbmYgPSBzZWxlY3QoJFJPVVQ9JFJJTiwgdW5kZWYsIHVuZGVmLCB1bmRlZik7Ci0JCX0KLQkJbXkgJGxlbiA9IHN5c3JlYWQoJGluLCAkYnVmLCA4MTkyKTsKLQkJaWYgKCEgZGVmaW5lZCgkbGVuKSkgewotCQkJbmV4dCBpZiAkISA9fiAvXkludGVycnVwdGVkLzsKLQkJCXByaW50IFNUREVSUiAiJHByb2dyYW1cWyRsYWIvJGNvbm4vJCRdOiAkIVxuIjsKLQkJCWxhc3Q7Ci0JCX0gZWxzaWYgKCRsZW4gPT0gMCkgewotCQkJcHJpbnQgU1RERVJSICIkcHJvZ3JhbVxbJGxhYi8kY29ubi8kJF06ICIKLQkJCSAgICAuICJJbnB1dCBpcyBFT0YuXG4iOwotCQkJbGFzdDsKLQkJfQotCi0JCWlmICgkdmVyYm9zZSA+IDQpIHsKLQkJCSMgdmVyYm9zZSBkZWJ1Z2dpbmcgb2YgZGF0YToKLQkJCXN5c3dyaXRlKFNUREVSUiAsICJcbiRsYWI6ICIsIDYpOwotCQkJc3lzd3JpdGUoU1RERVJSICwgJGJ1ZiwgJGxlbik7Ci0JCX0KLQotCQlteSAkb2Zmc2V0ID0gMDsKLQkJbXkgJHF1aXQgPSAwOwotCQl3aGlsZSAoJGxlbikgewotCQkJbXkgJHdyaXR0ZW4gPSBzeXN3cml0ZSgkb3V0LCAkYnVmLCAkbGVuLCAkb2Zmc2V0KTsKLQkJCWlmICghIGRlZmluZWQgJHdyaXR0ZW4pIHsKLQkJCQlwcmludCBTVERFUlIgIiRwcm9ncmFtXFskbGFiLyRjb25uLyQkXTogIgotCQkJCSAgICAuICJPdXRwdXQgaXMgRU9GLiAkIVxuIjsKLQkJCQkkcXVpdCA9IDE7Ci0JCQkJbGFzdDsKLQkJCX0KLQkJCSRsZW4gLT0gJHdyaXR0ZW47Ci0JCQkkb2Zmc2V0ICs9ICR3cml0dGVuOwotCQl9Ci0JCWxhc3QgaWYgJHF1aXQ7Ci0JfQotCWNsb3NlKCRpbik7Ci0JY2xvc2UoJG91dCk7Ci19Ci0KLSMgc2xlZXAgYSBmcmFjdGlvbiBvZiBhIHNlY29uZDoKLSMKLXN1YiBmc2xlZXAgewotCW15ICgkdGltZSkgPSBAXzsKLQlzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgJHRpbWUpIGlmICR0aW1lOwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvcGFubmVyLnBsIGIveDExdm5jL21pc2MvcGFubmVyLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDRiZWVlLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3Bhbm5lci5wbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMKLSMgcGFubmVyLnBsOiBzdGFydCB1cCB4MTF2bmMgaW4gJy1jbGlwJyBtb2RlIHZpZXdpbmcgYSBzbWFsbCAoV3hIKQotIyAgICAgICAgICAgIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aGUgc2NyZWVuLiAgQWxsb3cgdGhlIHZpZXdlciB1c2VyCi0jICAgICAgICAgICAgdG8gJ3BhbicgYXJvdW5kIHRoZSBkaXNwbGF5IHJlZ2lvbiBieSBtb3ZpbmcgdGhlIG1vdXNlLgotIwotIyAgICAgICAgICAgIFJlbW90ZSBpbnRlcmFjdGlvbiB3aXRoIGFwcGxpY2F0aW9ucywgZS5nLiBjbGlja2luZyBhCi0jICAgICAgICAgICAgYnV0dG9uIHRob3VnaCB0aGUgVk5DIHZpZXdlciwgd2lsbCBiZSB2ZXJ5IGRpZmZpY3VsdC4KLSMgICAgICAgICAgICBUaGlzIG1heSBiZSB1c2VmdWwgaW4gYSAnZGVtbycgbW9kZSB3aGVyZSB0aGUgdXNlciBzaXR0aW5nCi0jICAgICAgICAgICAgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgaXMgdGhlIG9ubHkgb25lIG1vdmluZyB0aGUgbW91c2UuCi0jICAgICAgICAgICAgRGVwZW5kaW5nIG9uIHlvdXIgdXNhZ2UgdGhlIGZvbGxvd2luZyB4MTF2bmMgb3B0aW9ucyBtYXkKLSMgICAgICAgICAgICBiZSB1c2VmdWw6IC1ub25hcAotIwotIyBVc2FnZTogIHBhbm5lci5wbCBXeEggICAgICA8eDExdm5jLWFyZ3M+ICAoZS5nLiAtZGlzcGxheSAuLi4pCi0jIG9yICAgICAgcGFubmVyLnBsIFd4SDowLjA1IDx4MTF2bmMtYXJncz4gIChlLmcuIDAuMDUgaXMgcG9sbGluZyB0aW1lIGluIHNlY3MuKQotCi11c2Ugc3RyaWN0OwotCi1teSAkV3hIID0gc2hpZnQ7Ci1teSAkcG9sbF90aW1lOwotCi0jIHNwbGl0IG9mZiBwb2xsIHRpbWU6Ci0jCi0oJFd4SCwgJHBvbGxfdGltZSkgPSBzcGxpdCgvOi8sICRXeEgpOwotbXkgKCRXLCAkSCkgPSBzcGxpdCgveC8sICRXeEgpOwotCi0kcG9sbF90aW1lID0gMC4xIHVubGVzcyAkcG9sbF90aW1lIG5lICcnOwotCi0jIHNldCB0byB4MTF2bmMgY29tbWFuZCAoZS5nLiBmdWxsIFBBVEgpCi0jCi1teSAkeDExdm5jID0gIngxMXZuYyI7Ci0KLSMgY2hlY2sgaWYgZGlzcGxheSB3YXMgZ2l2ZW46Ci0jCi1teSAkcXVlcnlfYXJncyA9ICIiOwotZm9yIChteSAkaT0wOyAkaSA8IEBBUkdWOyAkaSsrKSB7Ci0JaWYgKCRBUkdWWyRpXSBlcSAnLWRpc3BsYXknKSB7Ci0JCSRxdWVyeV9hcmdzID0gIi1kaXNwbGF5ICRBUkdWWyRpKzFdIjsKLQl9Ci19Ci0KLSMgZmluZCB0aGUgc2l6ZSBvZiBkaXNwbGF5IGFuZCB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbjoKLW15ICV2OwotdnNldCgiRElSRUNUOndkcHlfeCx3ZHB5X3kscG9pbnRlcl94LHBvaW50ZXJfeSxwb2ludGVyX3NhbWUiKTsKLQotIyBzZXQgYSAtY2xpcCBhcmd1bWVudCBiYXNlZCBvbiB0aGUgYWJvdmU6Ci0jCi1teSAkY2xpcCA9ICcnOwotY2xpcF9zZXQoKTsKLSRjbGlwID0gIiR7V314JHtIfSswKzAiIHVubGVzcyAkdntwb2ludGVyX3NhbWV9OwotCi0jIGxhdW5jaCB4MTF2bmMgd2l0aCAtY2xpcCBpbiB0aGUgYmFja2dyb3VuZDoKLSMKLW15ICRjbWQgPSAiJHgxMXZuYyAtY2xpcCAkY2xpcCAtYmcgIiAuIGpvaW4oIiAiLCBAQVJHVik7Ci1wcmludCBTVERFUlIgInJ1bm5pbmc6ICRjbWRcbiI7Ci1zeXN0ZW0gJGNtZDsKLQotIyB1c2VyIGNhbiBoaXQgQ3RybC1DIG9yIGtpbGwgdGhpcyBzY3JpcHQgdG8gcXVpdCAoYW5kIHN0b3AgeDExdm5jKQotIwotc3ViIHF1aXQgewotCXN5c3RlbSgiJHgxMXZuYyAkcXVlcnlfYXJncyAtUiBzdG9wIik7Ci0JZXhpdCAwOwotfQotCi0kU0lHe0lOVH0gID0gXCZxdWl0OwotJFNJR3tURVJNfSA9IFwmcXVpdDsKLQotIyBsb29wIGZvcmV2ZXIgd2FpdGluZyBmb3IgbW91c2UgcG9zaXRpb24gdG8gY2hhbmdlLCB0aGVuIHNoaWZ0IC1jbGlwOgotIwotbXkgJGNsaXBfb2xkID0gJGNsaXA7Ci13aGlsZSAoMSkgewotCWZzbGVlcCgkcG9sbF90aW1lKTsKLQl2c2V0KCJwb2ludGVyX3gscG9pbnRlcl95LHBvaW50ZXJfc2FtZSIpOwotCW5leHQgdW5sZXNzICR2e3BvaW50ZXJfc2FtZX07Ci0JY2xpcF9zZXQoKTsKLQlpZiAoJGNsaXAgbmUgJGNsaXBfb2xkKSB7Ci0JCXN5c3RlbSgiJHgxMXZuYyAkcXVlcnlfYXJncyAtUiBjbGlwOiRjbGlwIik7Ci0JCSRjbGlwX29sZCA9ICRjbGlwCi0JfQotfQotCi1leGl0IDA7Ci0KLSMgc2hvcnQgc2xlZXA6Ci0jCi1zdWIgZnNsZWVwIHsKLQlteSAoJHRpbWUpID0gQF87Ci0Jc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsICR0aW1lKSBpZiAkdGltZTsKLX0KLQotIyBzZXQgdGhlIC1jbGlwIHN0cmluZywgbWFraW5nIHN1cmUgdmlldyBkb2Vzbid0IGdvIG9mZiBlZGdlcyBvZiBkaXNwbGF5OgotIwotc3ViIGNsaXBfc2V0IHsKLQlteSAkeCA9IGludCgkdntwb2ludGVyX3h9IC0gJFcvMik7IAotCW15ICR5ID0gaW50KCR2e3BvaW50ZXJfeX0gLSAkSC8yKTsgCi0JJHggPSAwIGlmICR4IDwgMDsKLQkkeSA9IDAgaWYgJHkgPCAwOwotCSR4ID0gJHZ7d2RweV94fSAtICRXIGlmICR4ICsgJFcgPiAkdnt3ZHB5X3h9OwotCSR5ID0gJHZ7d2RweV95fSAtICRIIGlmICR5ICsgJEggPiAkdnt3ZHB5X3l9OwotCSRjbGlwID0gIiR7V314JHtIfSskeCskeSI7Ci19Ci0KLSMgcXVlcnkgeDExdm5jIGZvciB2YWx1ZXMsIHB1dCByZXN1bHRzIGluIHRoZSAldiBoYXNoOgotIwotc3ViIHZzZXQgewotCW15ICRzdHIgPSBzaGlmdDsKLQlteSAkb3V0ID0gYCR4MTF2bmMgJHF1ZXJ5X2FyZ3MgLVEgJHN0ciAyPi9kZXYvbnVsbGA7Ci0JY2hvbXAgJG91dDsKLQlmb3JlYWNoIG15ICRwYWlyIChzcGxpdCgvLC8sICRvdXQpKSB7Ci0JCSRwYWlyID1+IHMvXmEuLj0vLzsKLQkJbXkgKCRrLCAkdikgPSBzcGxpdCgvOi8sICRwYWlyLCAyKTsKLQkJaWYgKCRrIG5lICcnICYmICR2IG5lICcnKSB7Ci0JCQlwcmludCBTVERFUlIgIms9JGsgdj0kdlxuIiBpZiAkRU5We0RFQlVHfTsKLQkJCSR2eyRrfSA9ICR2OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvcXRfdHNsaWJfaW5qZWN0LnBsIGIveDExdm5jL21pc2MvcXRfdHNsaWJfaW5qZWN0LnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjlkMTc0Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3F0X3RzbGliX2luamVjdC5wbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIHF0X3RzbGliX2luamVjdC5wbDoKLSMKLSMgICB0b3VjaCBzY3JlZW4gaW5wdXQgaW5qZWN0aW9uIHRvb2wgZm9yIHVzZSB3aXRoIHgxMXZuYy4KLSMKLSMgZXhhbXBsZSB1c2FnZToKLSMKLSMgICB4MTF2bmMgLi4uIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgLi9xdF90c2xpYl9pbmplY3RfaW5wdXQucGwgLWVudiBJTkpFQ1RfT1BUSU9OUz1jYWw9L2V0Yy9wb2ludGVyY2FsCi0jCi0jIFNlZSBvcHRpb25zIGJlbG93LgotIwotIyB0ZXN0ZWQgb24gcXRtb2tvIChuZW8gZnJlZXJ1bm5lcikgd2l0aCB0c2xpYi4KLQotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgYnkgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSMKLSMgcXRfdHNsaWJfaW5qZWN0LnBsIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIHF0X3RzbGliX2luamVjdC5wbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHF0X3RzbGliX2luamVjdC5wbDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIyBvciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIyAKLQotc2V0X2NvbnN0YW50cygpOwotCi0jIG9uZSBjYW4gc2V0IHRoZXNlIGVudi4gdmFycy4gYmVmb3JlIHJ1bm5pbmc6Ci0KLSMgdGhlIGRldmljZSBmaWxlIHRvIGluamVjdCB0aGUgZXZlbnRzIGludG86Ci0jCi0kZGV2ID0gJEVOVntJTkpFQ1RfREVWfTsKLSRkZXYgPSAiL2Rldi9pbnB1dC9ldmVudDEiIHVubGVzcyAkZGV2OwotCi0jIG9wdGlvbnMsIHNlZSBiZWxvdy4gdXNlZnVsOiBjYWw9L2V0Yy9wb2ludGVyY2FsCi0jCi0kb3B0aW9ucyA9ICRFTlZ7SU5KRUNUX09QVElPTlN9OwotJG9wdGlvbnMgPSAnJyB1bmxlc3MgJG9wdGlvbnMgbmUgJyc7Ci0KLSRkZWJ1ZyA9IDA7CSMgZW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQ6Ci0kcHJlc3N1cmUgPSAxOwkjIGxldmVsIG9mIHRvdWNoIHBhZCBwcmVzc3VyZSBmb3IgY2xpY2suCi0kYnRuX3RvdWNoID0gMDsJIyBzZW5kIEJUTl9UT1VDSCBvbiBjbGlja3MgaW5zdGVhZCBvZiBwcmVzc3VyZSBjaGFuZ2VzLgotJGFic2Fsd2F5cyA9IDA7CSMgc2VuZCBhIHplcm8gcHJlc3N1cmUgYWJzb2x1dGUgcG9zaXRpb24gZXZlbnQgd2hlbmV2ZXIgbW91c2UgbW92ZXMuCi0kZHJhZ3NraXAgPSAwOwkjIGhvdyBvZnRlbiB0byBza2lwIGluamVjdGluZyBtb3Rpb24gZXZlbnQgd2hpbGUgZHJhZ2dpbmcuCi0KLSRhX3hmb3JtID0gJyc7CSMgdHNsaWIncyBjYWxpYnJhdGlvbiBjb2VmZmljaWVudHMuCi1AYSA9ICgpOwotCi0la2V5Y21kcyA9ICgpOwkjIHVzZXIgZGVmaW5lZCBob3RrZXlzIHRvIHJ1biBleHRlcm5hbCBjb21tYW5kcy4KLQotIyBzZXBhcmF0ZSB0aGUgb3B0aW9ucyBieSBjb21tYSwgZS5nLiBwcmVzc3VyZT01LGNhbD0vZXRjL3BvaW50ZXJjYWwKLQotaWYgKCRvcHRpb25zID1+IC9hYnNhbHdheXMvaSkgewotCSMgc2V0IHRvIGFsd2F5cyBzZW5kIGEgemVybyBwcmVzc3VyZSBBQlMgZXZlbnQgd2hlbiBtb3VzZSBtb3ZlcwotCSRhYnNhbHdheXMgPSAxOwotfQotaWYgKCRvcHRpb25zID1+IC9idG5fdG91Y2gvaSkgewotCSMgc2VuZCBCVE5fVE9VQ0ggb24gY2xpY2tzLgotCSRidG5fdG91Y2ggPSAxOwotfQotaWYgKCRvcHRpb25zID1+IC9wcmVzc3VyZT0oXGQrKS9pKSB7Ci0JIyBsZXZlbCBvZiB0b3VjaHBhZCBwcmVzc3VyZSB0byB1c2Ugb24gYSB0b3VjaC4KLQkkcHJlc3N1cmUgPSAkMTsKLX0KLWlmICgkb3B0aW9ucyA9fiAvZHJhZ3NraXA9KFxkKykvaSkgewotCSMgd2hlbiBkcmFnZ2luZyB3aXRoIHByZXNzdXJlLCBza2lwIHRoaXMgbWFueSBldmVudHMuCi0JJGRyYWdza2lwID0gJDE7Ci19Ci1pZiAoJG9wdGlvbnMgPX4gL2NhbD0oW14sXSspL2kpIHsKLQkjIHRzbGliJ3MgL2V0Yy9wb2ludGVyY2FsIGxpbmVhciB0cmFuc2Zvcm06Ci0JJGFfeGZvcm0gPSAkMTsKLQlpZiAoLWYgJGFfeGZvcm0pIHsKLQkJJGFfeGZvcm0gPSBgaGVhZCAtbiAxICckYV94Zm9ybSdgOwotCQljaG9tcCAkYV94Zm9ybTsKLQkJJGFfeGZvcm0gPX4gcy9eXHMqLy87Ci0JCSRhX3hmb3JtID1+IHMvXHMqJC8vOwotCX0KLX0KLWlmICgkb3B0aW9ucyA9fiAva2V5Y21kcz0oW14sXSspL2kpIHsKLQkjIGZvcm1hdDoga2V5c3ltMTpjb21tYW5kMStrZXlzeW0yOmNvbW1hbmQyKy4uLgotCSMgZS5nLjoga2V5Y21kcz1GNjpkYXRlK0Y3OicuL3gxMXZuYy0wLjkuMTAgLWNvbm5lY3QgLi9jdGwudHh0IC1SIHJlc2V0JwotCW15ICRzdHIgPSAkMTsKLQlpZiAoLWYgJHN0ciAmJiBvcGVuKEYsICI8JHN0ciIpKSB7Ci0JCSRzdHIgPSAnJzsKLQkJd2hpbGUgKDxGPikgewotCQkJY2hvbXA7Ci0JCQkkXyA9fiBzL15ccyovLzsKLQkJCSRfID1+IHMvXHMqJC8vOwotCQkJbmV4dCBpZiAvXiMvOwotCQkJbmV4dCBpZiAkXyBlcSAiIjsKLQkJCSRzdHIgLj0gJysnIGlmICRzdHIgbmUgJyc7Ci0JCQkkc3RyIC49ICRfOwotCQl9Ci0JCWNsb3NlIEY7Ci0JfQotCWZvcmVhY2ggbXkgJHBhcnQgKHNwbGl0KC9cKy8sICRzdHIpKSB7Ci0JCW15ICgka2V5LCAkY21kKSA9IHNwbGl0KC86LywgJHBhcnQsIDIpOwotCQlpZiAoJGtleSAhfiAvXlxzKiQvKSB7Ci0JCQkka2V5Y21kc3ska2V5fSA9ICRjbWQ7Ci0JCX0KLQl9Ci19Ci1pZiAoJG9wdGlvbnMgPX4gL2RlYnVnPShcZCspL2kpIHsKLQkjIGRlYnVnIHByaW50b3V0Ci0JJGRlYnVnID0gJDE7Ci19IGVsc2lmICgkb3B0aW9ucyA9fiAvZGVidWcvaSkgewotCSRkZWJ1ZyA9IDE7Ci19Ci0KLSMgZW5kIG9mIHRoZSB0b3AgcGFydCB0aGF0IHVzZXIgc2hvdWxkIHJlYWQgYW5kIHVuZGVyc3RhbmQgCi0jIGZvciBzZXR0aW5nIG9wdGlvbnMsIGV0Yy4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotJHN0YXJ0ID0gdGltZSgpOwotCi0jIG9wZW4gdGhlIGRldmljZSBmb3Igd3JpdGluZzoKLSMKLSRtb2RlcyA9ICRPX1dST05MWTsKLXByaW50Zigib3BlbiBtb2RlczogMHgleFxuIiwgJG1vZGVzKSBpZiAkZGVidWc7Ci0KLXN5c29wZW4oRkQsICRkZXYsICRtb2RlcykgfHwgZGllICIkZGV2OiAkISI7Ci0KLW15ICRjdXJyX21hc2sgPSAwOwotbXkgJGN1cnJfeCA9IDA7Ci1teSAkY3Vycl95ID0gMDsKLW15ICRkb3duX2NvdW50ID0gMDsKLQotIyByZWFkIGlucHV0IGV2ZW50cyBmcm9tIHgxMXZuYyB0aHJvdWdoIFNURElOOgotIwotd2hpbGUgKDw+KSB7Ci0JY2hvbXA7Ci0JaWYgKC9eUG9pbnRlci8pIHsKLQkJbXkgKCRwLCAkY2xpZW50LCAkeCwgJHksICRtYXNrLCAkaGludCkgPSBzcGxpdCgnICcsICRfLCA2KTsKLQkJZG9fcG9pbnRlcigkY2xpZW50LCAkeCwgJHksICRtYXNrLCAkaGludCk7Ci0JfSBlbHNpZiAoL15LZXlzeW0vKSB7Ci0JCW15ICgkaywgJGNsaWVudCwgJGRvd24sICRrZXlzeW0sICRuYW1lLCAkaGludCkgPSBzcGxpdCgnICcsICRfLCA2KTsKLQkJZG9fa2V5c3ltKCRjbGllbnQsICRkb3duLCAka2V5c3ltLCAkbmFtZSwgJGhpbnQpOwotCX0KLX0KLQotY2xvc2UoRkQpOwotCi1leGl0KDApOwotCi1zdWIgZG9fa2V5c3ltIHsKLQkjIHF0bW9rby9uZW8gZG9lcyBub3Qgc3VwcG9ydCBrZXlzdHJva2UgaW5wdXQuICBzbyB0aGVzZSB3aWxsIGJlIGlnbm9yZWQuCi0JIyAob25lIHBvc3NpYmlsaXR5IHdvdWxkIHRvIGJlIGVuYWJsZSBxdG1va28gdG8gcmVhZCBmcm9tIC9kZXYvdHR5MC4KLQkjIGJ1dCB0aGUgaW5qZWN0aW9uIG1lY2hhbmlzbSB3b3VsZCBuZWVkIHRvIGJlIG1vZGlmaWVkLikKLSAgICAgICAgbXkgKCRjbGllbnQsICRkb3duLCAka2V5c3ltLCAkbmFtZSwgJGhpbnQpID0gQF87Ci0KLQkkRU5We0RPX0tFWVNZTX0gPSAiJGNsaWVudCAkZG93biAka2V5c3ltICRuYW1lICRoaW50IjsKLQotCSMgb25lIGNvdWxkIGltcGxlbWVudCBoaXMgb3duICdob3Qga2V5cycgaGVyZS4KLQotCSMgcHJvY2VzcyBhbnkga2V5Y21kczoKLQlpZiAoJWtleWNtZHMgJiYgKGV4aXN0cyAka2V5Y21kc3skbmFtZX0gfHwgZXhpc3RzICRrZXljbWRze0FMTH0pKSB7Ci0JCW15ICRjbWQgPSAka2V5Y21kc3skbmFtZX07Ci0JCWlmICghZXhpc3RzICRrZXljbWRzeyRuYW1lfSkgewotCQkJJGNtZCA9ICRrZXljbWRze0FMTH07Ci0JCQlwcmludCBTVERFUlIgImtleWNtZHM6ICRuYW1lL0FMTDogcnVubmluZzogJGNtZFxuIjsKLQkJCXN5c3RlbSgiJGNtZCIpOwotCQl9IGVsc2lmICgkZG93bikgewotCQkJcHJpbnQgU1RERVJSICJrZXljbWRzOiAkbmFtZTogcnVubmluZzogJGNtZFxuIjsKLQkJCXN5c3RlbSgiJGNtZCIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkkbmFtZSA9ICJYS18kbmFtZSI7Ci0JbXkgJG5vbG9va3VwID0gMDsKLQlpZiAoISBleGlzdHMgJGtleV9sb29rdXB7JG5hbWV9KSB7Ci0JCSRub2xvb2t1cCA9IDE7Ci0JfSBlbHNpZiAoISBkZWZpbmVkICRrZXlfbG9va3VweyRuYW1lfSkgewotCQkkbm9sb29rdXAgPSAyOwotCX0gZWxzaWYgKCRrZXlfbG9va3VweyRuYW1lfSA9fiAvXlxzKiQvKSB7Ci0JCSRub2xvb2t1cCA9IDM7Ci0JfQotCWlmICgkbm9sb29rdXApIHsKLQkJcHJpbnQgU1RERVJSICJkb19rZXlzeW06IGtleSBub3QgaW1wbGVtZW50ZWQtJG5vbG9va3VwICRkb3duICRrZXlzeW0gJG5hbWUgJGhpbnQuXG4iIGlmICRkZWJ1ZzsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50IFNUREVSUiBnZXR0aW1lKCkgLiAiIGRvX2tleXN5bTogJG5hbWVcbiIgaWYgJGRlYnVnOwotCWRvX2tleSgka2V5X2xvb2t1cHskbmFtZX0sICRkb3duKTsKLX0KLQotc3ViIGRvX3BvaW50ZXIgewotICAgICAgICBteSAoJGNsaWVudCwgJHgsICR5LCAkbWFzaywgJGhpbnQpID0gQF87Ci0JbXkgJHgyID0gJHg7Ci0JbXkgJHkyID0gJHk7Ci0JaWYgKCRhX3hmb3JtIG5lICcnKSB7Ci0JCSMgdGhpcyBpcyB0c2xpYidzIC9ldGMvcG9pbnRlcmNhbCBmb3JtYXQuCi0JCWlmICghIEBhKSB7Ci0JCQkjIC01MjggMzM0MDggLTM0MTc1MTYgLTQ0MjAwIDQwOCA0MDI5MjAyOCA1NjU0MQotCQkJQGEgPSBzcGxpdCgnICcsICRhX3hmb3JtKTsKLQkJCWZvcmVhY2ggbXkgJGEgKEBhKSB7Ci0JCQkJJGEgKz0gMC4wOwotCQkJfQotCQl9Ci0JCSMgdGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgdHNsaWIgdHJhbnNmb3JtYXRpb246Ci0JCSMKLQkJJHgyID0gKCAkYVs0XSAqICgkYVs2XSAqICR4IC0gJGFbMl0pIC0gJGFbMV0gKiAoJGFbNl0gKiAkeSAtICRhWzVdKSApCi0JCQkvICggJGFbNF0gKiAkYVswXSAtICRhWzFdICogJGFbM10pOwotCQkkeTIgPSAoICRhWzBdICogKCRhWzZdICogJHkgLSAkYVs1XSkgLSAkYVszXSAqICgkYVs2XSAqICR4IC0gJGFbMl0pICkKLQkJCS8gKCAkYVs0XSAqICRhWzBdIC0gJGFbMV0gKiAkYVszXSk7Ci0JCSR4MiA9IGludCgkeDIpOwotCQkkeTIgPSBpbnQoJHkyKTsKLQl9Ci0KLQlwcmludCBTVERFUlIgZ2V0dGltZSgpIC4gIiBkb19wb2ludGVyICR4ICR5ICg9PiAkeDIgJHkyKSAkbWFzayAkaGludC5cbiIgaWYgJGRlYnVnOwotCi0JaWYgKCEgJGJ0bl90b3VjaCkgewotCQlpZiAoJGN1cnJfbWFzayA9PSAwICYmICRtYXNrID09IDApIHsKLQkJCWRvX2FicygkeDIsICR5MiwgMCkgaWYgJGFic2Fsd2F5czsKLQkJfSBlbHNpZiAoJGN1cnJfbWFzayA9PSAwICYmICRtYXNrICE9IDApIHsKLQkJCWRvX2FicygkeDIsICR5MiwgJHByZXNzdXJlKTsKLQkJCSRkb3duX2NvdW50ID0gMDsKLQkJfSBlbHNpZiAoJGN1cnJfbWFzayAhPSAwICYmICRtYXNrID09IDApIHsKLQkJCWRvX2FicygkeDIsICR5MiwgMCk7Ci0JCX0gZWxzaWYgKCRjdXJyX21hc2sgIT0gMCAmJiAkbWFzayAhPSAwKSB7Ci0JCQkkZG93bl9jb3VudCsrOwotCQkJaWYgKCRkcmFnc2tpcCA+IDApIHsKLQkJCQlpZiAoJGRvd25fY291bnQgJSAkZHJhZ3NraXAgPT0gMCkgewotCQkJCQlkb19hYnMoJHgyLCAkeTIsICRwcmVzc3VyZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnQgU1RERVJSICJkcmFnc2tpcCAkZG93bl9jb3VudCAkZHJhZ3NraXBcbiIgaWYgJGRlYnVnOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZG9fYWJzKCR4MiwgJHkyLCAkcHJlc3N1cmUpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCRjdXJyX21hc2sgPT0gMCAmJiAkbWFzayA9PSAwKSB7Ci0JCQlkb19hYnMoJHgyLCAkeTIsIDApIGlmICRhYnNhbHdheXM7Ci0JCX0gZWxzaWYgKCRjdXJyX21hc2sgPT0gMCAmJiAkbWFzayAhPSAwKSB7Ci0JCQlkb19hYnMoJHgyLCAkeTIsIDApOwotCQkJZG9fYnRuKCRCVE5fVE9VQ0gsIDEpOwotCQl9IGVsc2lmICgkY3Vycl9tYXNrICE9IDAgJiYgJG1hc2sgPT0gMCkgewotCQkJZG9fYWJzKCR4MiwgJHkyLCAwKTsKLQkJCWRvX2J0bigkQlROX1RPVUNILCAwKTsKLQkJfSBlbHNpZiAoJGN1cnJfbWFzayAhPSAwICYmICRtYXNrICE9IDApIHsKLQkJCTsKLQkJfQotCX0KLQotCSRjdXJyX21hc2sgPSAkbWFzazsKLQkkY3Vycl94ID0gJHgyOwotCSRjdXJyX3kgPSAkeTI7Ci19Ci0KLSMgc3RydWN0IGlucHV0X2V2ZW50IHsKLSMgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwotIyAgICAgICAgIF9fdTE2IHR5cGU7Ci0jICAgICAgICAgX191MTYgY29kZTsKLSMgICAgICAgICBfX3MzMiB2YWx1ZTsKLSMgfTsKLQotc3ViIGRvX3N5biB7Ci0JbXkgJGV2ID0gZ3RvZCgpOwotCSRldiAuPSBwYWNrKCJTIiwgJEVWX1NZTik7Ci0JJGV2IC49IHBhY2soIlMiLCAkU1lOX1JFUE9SVCk7Ci0JJGV2IC49IHBhY2soImkiLCAwKTsKLQlwcmludCBTVERFUlIgImRvX3N5biBFVl9TWU5cbiIgaWYgJGRlYnVnOwotCW15ICRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19zeW46ICQhXG4iOwotCX0KLX0KLQotc3ViIGRvX2tleSB7Ci0JIyBub3Qgc3VwcG9ydGVkIGJ5IHF0bW9rbwotCW15ICgka2V5LCAkZG93bikgPSBAXzsKLQlteSAkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfS0VZKTsKLQkkZXYgLj0gcGFjaygiUyIsICRrZXkpOwotCSRldiAuPSBwYWNrKCJpIiwgJGRvd24pOwotCXByaW50IFNUREVSUiAiZG9fa2V5ICRrZXkgJGRvd25cbiIgaWYgJGRlYnVnOwotCW15ICRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19rZXk6ICQhXG4iOwotCX0KLQlkb19zeW4oKTsKLX0KLQotc3ViIGRvX2J0biB7Ci0JIyBvbmx5IEJUTl9UT1VDSCBzdXBwb3J0ZWQgYnkgcXRtb2tvIChidXQgaXQgc2VlbXMgdG8gYmUgaWdub3JlZD8/KQotCW15ICgkYnV0dG9uLCAkZG93bikgPSBAXzsKLQlteSAkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfS0VZKTsKLQkkZXYgLj0gcGFjaygiUyIsICRidXR0b24pOwotCSRldiAuPSBwYWNrKCJpIiwgJGRvd24pOwotCXByaW50IFNUREVSUiAiZG9fYnRuICRidXR0b24gJGRvd25cbiIgaWYgJGRlYnVnOwotCW15ICRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19idG46ICQhXG4iOwotCX0KLQlkb19zeW4oKTsKLX0KLQotc3ViIGRvX2FicyB7Ci0JIyBhYnNvbHV0ZSBtZXRob2QgaXMgdGhlIHdvcmtob3JzZSBmb3IgdGhlIHRvdWNoc2NyZWVuLgotCW15ICgkeCwgJHksICRwKSA9IEBfOwotCW15ICRldiA9IGd0b2QoKTsKLQkkZXYgLj0gcGFjaygiUyIsICRFVl9BQlMpOwotCSRldiAuPSBwYWNrKCJTIiwgJEFCU19ZKTsKLQkkZXYgLj0gcGFjaygiaSIsICR5KTsKLQlwcmludCBTVERFUlIgImRvX2FicyB5PSR5XG4iIGlmICRkZWJ1ZzsKLQlteSAkcmV0ID0gc3lzd3JpdGUoRkQsICRldiwgbGVuZ3RoKCRldikpOwotCWlmICghZGVmaW5lZCAkcmV0KSB7Ci0JCXByaW50IFNUREVSUiAiZG9fYWJzOiAkIVxuIjsKLQl9Ci0JJGV2ID0gZ3RvZCgpOwotCSRldiAuPSBwYWNrKCJTIiwgJEVWX0FCUyk7Ci0JJGV2IC49IHBhY2soIlMiLCAkQUJTX1gpOwotCSRldiAuPSBwYWNrKCJpIiwgJHgpOwotCXByaW50IFNUREVSUiAiZG9fYWJzIHg9JHhcbiIgaWYgJGRlYnVnOwotCSRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19hYnM6ICQhXG4iOwotCX0KLQkkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfQUJTKTsKLQkkZXYgLj0gcGFjaygiUyIsICRBQlNfUFJFU1NVUkUpOwotCSRldiAuPSBwYWNrKCJpIiwgJHApOwotCXByaW50IFNUREVSUiAiZG9fYWJzIHA9JHBcbiIgaWYgJGRlYnVnOwotCSRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19hYnM6ICQhXG4iOwotCX0KLQlkb19zeW4oKTsKLX0KLQotc3ViIGRvX3JlbCB7Ci0JIyBub3Qgc3VwcG9ydGVkIGJ5IHF0bW9rbwotCW15ICgkZHgsICRkeSkgPSBAXzsKLQlteSAkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfUkVMKTsKLQkkZXYgLj0gcGFjaygiUyIsICRSRUxfWSk7Ci0JJGV2IC49IHBhY2soImkiLCAkZHkpOwotCXByaW50IFNUREVSUiAiZG9fcmVsIGR5PSRkeVxuIiBpZiAkZGVidWc7Ci0JbXkgJHJldCA9IHN5c3dyaXRlKEZELCAkZXYsIGxlbmd0aCgkZXYpKTsKLQlpZiAoIWRlZmluZWQgJHJldCkgewotCQlwcmludCBTVERFUlIgImRvX3JlbDogJCFcbiI7Ci0JfQotCSRldiA9IGd0b2QoKTsKLQkkZXYgLj0gcGFjaygiUyIsICRFVl9SRUwpOwotCSRldiAuPSBwYWNrKCJTIiwgJFJFTF9YKTsKLQkkZXYgLj0gcGFjaygiaSIsICRkeCk7Ci0JcHJpbnQgU1RERVJSICJkb19yZWwgZHg9JGR4XG4iOwotCSRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19yZWw6ICQhXG4iOwotCX0KLQlkb19zeW4oKTsKLX0KLQotc3ViIGd0b2QgewotCSMgMzIgYml0IG1hY2hpbmVzLiAgVEJEIHVzZSBwZXJsIG1vZHVsZSBUaW1lOkhpUmVzLgotCSR0diA9ICgiXDAiIHggNCkgeCAyOyAgICMgYXNzdW1lcyBsb25nIGlzIDQgYnl0ZXMuIHNob3VsZCB1c2UgcGFjay4KLQkkdHogPSAoIlwwIiB4IDQpIHggMjsKLQlzeXNjYWxsKCRsaW51eF9nZXR0aW1lb2ZkYXlfc3lzY2FsbCwgJHR2LCAkdHopOwotCXJldHVybiAkdHY7Ci19Ci0KLXN1YiBnZXR0aW1lIHsKLQlteSAkdHYgPSBndG9kKCk7Ci0JbXkgKCR0dl9zZWMsICR0dl91c2VjKSA9IHVucGFjaygiTDIiLCAkdHYpOwotCSR0dl91c2VjMiA9IHNwcmludGYoIiU4LjZmIiwgJHR2X3VzZWMvMTAwMDAwMC4wKTsKLQlpZiAoICR0dl91c2VjMiA9fiAvXjBcLi8gKSB7Ci0JCSR0dl91c2VjMiA9fiBzL14wXC4vLi87Ci0JCSR0dl9zZWMgPSAiJHR2X3NlYyR0dl91c2VjMiI7Ci0JfSBlbHNlIHsKLQkJJHR2X3NlYyA9ICR0dl9zZWMgKyAoJHR2X3VzZWMvMTAwMDAwMC4wKTsKLQl9Ci0JcmV0dXJuIHNwcmludGYoIiUuM2YiLCAkdHZfc2VjIC0gJHN0YXJ0KTsKLX0KLQotc3ViIGZzbGVlcCB7Ci0gICAgICAgIG15ICgkdGltZSkgPSBAXzsgCi0gICAgICAgIHNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAkdGltZSkgaWYgJHRpbWU7Ci19Ci0KLXN1YiBzZXRfY29uc3RhbnRzIHsKLQotIyBmcm9tIC91c3IvaW5jbHVkZS9saW51eC91aW5wdXQuaCAvdXNyL2luY2x1ZGUvbGludXgvaW5wdXQuaCBhbmQgeDExdm5jLiAKLQotIyAjZGVmaW5lIEFCU19NQVggICAgICAgICAgICAgICAgIDB4M2YgPSA2MwotIyAKLSMgI2RlZmluZSBVSU5QVVRfTUFYX05BTUVfU0laRSAgICA4MAotIyAKLSMgc3RydWN0IGlucHV0X2lkIHsKLSMgICAgICAgICBfX3UxNiBidXN0eXBlOwotIyAgICAgICAgIF9fdTE2IHZlbmRvcjsKLSMgICAgICAgICBfX3UxNiBwcm9kdWN0OwotIyAgICAgICAgIF9fdTE2IHZlcnNpb247Ci0jIH07Ci0jIAotIyBzdHJ1Y3QgdWlucHV0X3VzZXJfZGV2IHsKLSMgICAgICAgICBjaGFyIG5hbWVbVUlOUFVUX01BWF9OQU1FX1NJWkVdOwotIyAgICAgICAgIHN0cnVjdCBpbnB1dF9pZCBpZDsKLSMgICAgICAgICBpbnQgZmZfZWZmZWN0c19tYXg7Ci0jICAgICAgICAgaW50IGFic21heFtBQlNfTUFYICsgMV07Ci0jICAgICAgICAgaW50IGFic21pbltBQlNfTUFYICsgMV07Ci0jICAgICAgICAgaW50IGFic2Z1enpbQUJTX01BWCArIDFdOwotIyAgICAgICAgIGludCBhYnNmbGF0W0FCU19NQVggKyAxXTsKLSMgfTsKLSMgI2VuZGlmICAvKiBfX1VJTlBVVF9IXyAqLwotCi0kRVZfU1lOICAgICAgICAgICAgICAgICAgPSAweDAwOwotJEVWX0tFWSAgICAgICAgICAgICAgICAgID0gMHgwMTsKLSRFVl9SRUwgICAgICAgICAgICAgICAgICA9IDB4MDI7Ci0kRVZfQUJTICAgICAgICAgICAgICAgICAgPSAweDAzOwotJEVWX01TQyAgICAgICAgICAgICAgICAgID0gMHgwNDsKLSRFVl9TVyAgICAgICAgICAgICAgICAgICA9IDB4MDU7Ci0kRVZfTEVEICAgICAgICAgICAgICAgICAgPSAweDExOwotJEVWX1NORCAgICAgICAgICAgICAgICAgID0gMHgxMjsKLSRFVl9SRVAgICAgICAgICAgICAgICAgICA9IDB4MTQ7Ci0kRVZfRkYgICAgICAgICAgICAgICAgICAgPSAweDE1OwotJEVWX1BXUiAgICAgICAgICAgICAgICAgID0gMHgxNjsKLSRFVl9GRl9TVEFUVVMgICAgICAgICAgICA9IDB4MTc7Ci0kRVZfTUFYICAgICAgICAgICAgICAgICAgPSAweDFmOwotCi0kSURfQlVTICAgICAgICAgICAgICAgICAgPSAwOwotJElEX1ZFTkRPUiAgICAgICAgICAgICAgID0gMTsKLSRJRF9QUk9EVUNUICAgICAgICAgICAgICA9IDI7Ci0kSURfVkVSU0lPTiAgICAgICAgICAgICAgPSAzOwotCi0kQlVTX1BDSSAgICAgICAgICAgICAgICAgPSAweDAxOwotJEJVU19JU0FQTlAgICAgICAgICAgICAgID0gMHgwMjsKLSRCVVNfVVNCICAgICAgICAgICAgICAgICA9IDB4MDM7Ci0kQlVTX0hJTCAgICAgICAgICAgICAgICAgPSAweDA0OwotJEJVU19CTFVFVE9PVEggICAgICAgICAgID0gMHgwNTsKLSRCVVNfVklSVFVBTCAgICAgICAgICAgICA9IDB4MDY7Ci0KLSRCVVNfSVNBICAgICAgICAgICAgICAgICA9IDB4MTA7Ci0kQlVTX0k4MDQyICAgICAgICAgICAgICAgPSAweDExOwotJEJVU19YVEtCRCAgICAgICAgICAgICAgID0gMHgxMjsKLSRCVVNfUlMyMzIgICAgICAgICAgICAgICA9IDB4MTM7Ci0kQlVTX0dBTUVQT1JUICAgICAgICAgICAgPSAweDE0OwotJEJVU19QQVJQT1JUICAgICAgICAgICAgID0gMHgxNTsKLSRCVVNfQU1JR0EgICAgICAgICAgICAgICA9IDB4MTY7Ci0kQlVTX0FEQiAgICAgICAgICAgICAgICAgPSAweDE3OwotJEJVU19JMkMgICAgICAgICAgICAgICAgID0gMHgxODsKLSRCVVNfSE9TVCAgICAgICAgICAgICAgICA9IDB4MTk7Ci0kQlVTX0dTQyAgICAgICAgICAgICAgICAgPSAweDFBOwotJEJVU19BVEFSSSAgICAgICAgICAgICAgID0gMHgxQjsKLQotJFJFTF9YICAgICAgICAgICAgICAgICAgID0gMHgwMDsKLSRSRUxfWSAgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0kUkVMX1ogICAgICAgICAgICAgICAgICAgPSAweDAyOwotJFJFTF9SWCAgICAgICAgICAgICAgICAgID0gMHgwMzsKLSRSRUxfUlkgICAgICAgICAgICAgICAgICA9IDB4MDQ7Ci0kUkVMX1JaICAgICAgICAgICAgICAgICAgPSAweDA1OwotJFJFTF9IV0hFRUwgICAgICAgICAgICAgID0gMHgwNjsKLSRSRUxfRElBTCAgICAgICAgICAgICAgICA9IDB4MDc7Ci0kUkVMX1dIRUVMICAgICAgICAgICAgICAgPSAweDA4OwotJFJFTF9NSVNDICAgICAgICAgICAgICAgID0gMHgwOTsKLQotJEFCU19YICAgICAgICAgICAgICAgICAgID0gMHgwMDsKLSRBQlNfWSAgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0kQUJTX1ogICAgICAgICAgICAgICAgICAgPSAweDAyOwotJEFCU19SWCAgICAgICAgICAgICAgICAgID0gMHgwMzsKLSRBQlNfUlkgICAgICAgICAgICAgICAgICA9IDB4MDQ7Ci0kQUJTX1JaICAgICAgICAgICAgICAgICAgPSAweDA1OwotJEFCU19USFJPVFRMRSAgICAgICAgICAgID0gMHgwNjsKLSRBQlNfUlVEREVSICAgICAgICAgICAgICA9IDB4MDc7Ci0kQUJTX1dIRUVMICAgICAgICAgICAgICAgPSAweDA4OwotJEFCU19HQVMgICAgICAgICAgICAgICAgID0gMHgwOTsKLSRBQlNfQlJBS0UgICAgICAgICAgICAgICA9IDB4MGE7Ci0kQUJTX0hBVDBYICAgICAgICAgICAgICAgPSAweDEwOwotJEFCU19IQVQwWSAgICAgICAgICAgICAgID0gMHgxMTsKLSRBQlNfSEFUMVggICAgICAgICAgICAgICA9IDB4MTI7Ci0kQUJTX0hBVDFZICAgICAgICAgICAgICAgPSAweDEzOwotJEFCU19IQVQyWCAgICAgICAgICAgICAgID0gMHgxNDsKLSRBQlNfSEFUMlkgICAgICAgICAgICAgICA9IDB4MTU7Ci0kQUJTX0hBVDNYICAgICAgICAgICAgICAgPSAweDE2OwotJEFCU19IQVQzWSAgICAgICAgICAgICAgID0gMHgxNzsKLSRBQlNfUFJFU1NVUkUgICAgICAgICAgICA9IDB4MTg7Ci0kQUJTX0RJU1RBTkNFICAgICAgICAgICAgPSAweDE5OwotJEFCU19USUxUX1ggICAgICAgICAgICAgID0gMHgxYTsKLSRBQlNfVElMVF9ZICAgICAgICAgICAgICA9IDB4MWI7Ci0kQUJTX1RPT0xfV0lEVEggICAgICAgICAgPSAweDFjOwotJEFCU19WT0xVTUUgICAgICAgICAgICAgID0gMHgyMDsKLSRBQlNfTUlTQyAgICAgICAgICAgICAgICA9IDB4Mjg7Ci0kQUJTX01UX1RPVUNIX01BSk9SICAgICAgPSAweDMwOwotJEFCU19NVF9UT1VDSF9NSU5PUiAgICAgID0gMHgzMTsKLSRBQlNfTVRfV0lEVEhfTUFKT1IgICAgICA9IDB4MzI7Ci0kQUJTX01UX1dJRFRIX01JTk9SICAgICAgPSAweDMzOwotJEFCU19NVF9PUklFTlRBVElPTiAgICAgID0gMHgzNDsKLSRBQlNfTVRfUE9TSVRJT05fWCAgICAgICA9IDB4MzU7Ci0kQUJTX01UX1BPU0lUSU9OX1kgICAgICAgPSAweDM2OwotJEFCU19NVF9UT09MX1RZUEUgICAgICAgID0gMHgzNzsKLSRBQlNfTVRfQkxPQl9JRCAgICAgICAgICA9IDB4Mzg7Ci0kQUJTX01UX1RSQUNLSU5HX0lEICAgICAgPSAweDM5OwotIyRBQlNfTUFYID0gMHgzZjsKLQotCi0kQlROX01JU0MgICAgICAgICAgICAgICAgPSAweDEwMDsKLSRCVE5fMCAgICAgICAgICAgICAgICAgICA9IDB4MTAwOwotJEJUTl8xICAgICAgICAgICAgICAgICAgID0gMHgxMDE7Ci0kQlROXzIgICAgICAgICAgICAgICAgICAgPSAweDEwMjsKLSRCVE5fMyAgICAgICAgICAgICAgICAgICA9IDB4MTAzOwotJEJUTl80ICAgICAgICAgICAgICAgICAgID0gMHgxMDQ7Ci0kQlROXzUgICAgICAgICAgICAgICAgICAgPSAweDEwNTsKLSRCVE5fNiAgICAgICAgICAgICAgICAgICA9IDB4MTA2OwotJEJUTl83ICAgICAgICAgICAgICAgICAgID0gMHgxMDc7Ci0kQlROXzggICAgICAgICAgICAgICAgICAgPSAweDEwODsKLSRCVE5fOSAgICAgICAgICAgICAgICAgICA9IDB4MTA5OwotCi0kQlROX01PVVNFICAgICAgICAgICAgICAgPSAweDExMDsKLSRCVE5fTEVGVCAgICAgICAgICAgICAgICA9IDB4MTEwOwotJEJUTl9SSUdIVCAgICAgICAgICAgICAgID0gMHgxMTE7Ci0kQlROX01JRERMRSAgICAgICAgICAgICAgPSAweDExMjsKLSRCVE5fU0lERSAgICAgICAgICAgICAgICA9IDB4MTEzOwotJEJUTl9FWFRSQSAgICAgICAgICAgICAgID0gMHgxMTQ7Ci0kQlROX0ZPUldBUkQgICAgICAgICAgICAgPSAweDExNTsKLSRCVE5fQkFDSyAgICAgICAgICAgICAgICA9IDB4MTE2OwotJEJUTl9UQVNLICAgICAgICAgICAgICAgID0gMHgxMTc7Ci0KLSRCVE5fSk9ZU1RJQ0sgICAgICAgICAgICA9IDB4MTIwOwotJEJUTl9UUklHR0VSICAgICAgICAgICAgID0gMHgxMjA7Ci0kQlROX1RIVU1CICAgICAgICAgICAgICAgPSAweDEyMTsKLSRCVE5fVEhVTUIyICAgICAgICAgICAgICA9IDB4MTIyOwotJEJUTl9UT1AgICAgICAgICAgICAgICAgID0gMHgxMjM7Ci0kQlROX1RPUDIgICAgICAgICAgICAgICAgPSAweDEyNDsKLSRCVE5fUElOS0lFICAgICAgICAgICAgICA9IDB4MTI1OwotJEJUTl9CQVNFICAgICAgICAgICAgICAgID0gMHgxMjY7Ci0kQlROX0JBU0UyICAgICAgICAgICAgICAgPSAweDEyNzsKLSRCVE5fQkFTRTMgICAgICAgICAgICAgICA9IDB4MTI4OwotJEJUTl9CQVNFNCAgICAgICAgICAgICAgID0gMHgxMjk7Ci0kQlROX0JBU0U1ICAgICAgICAgICAgICAgPSAweDEyYTsKLSRCVE5fQkFTRTYgICAgICAgICAgICAgICA9IDB4MTJiOwotJEJUTl9ERUFEICAgICAgICAgICAgICAgID0gMHgxMmY7Ci0KLSRCVE5fR0FNRVBBRCAgICAgICAgICAgICA9IDB4MTMwOwotJEJUTl9BICAgICAgICAgICAgICAgICAgID0gMHgxMzA7Ci0kQlROX0IgICAgICAgICAgICAgICAgICAgPSAweDEzMTsKLSRCVE5fQyAgICAgICAgICAgICAgICAgICA9IDB4MTMyOwotJEJUTl9YICAgICAgICAgICAgICAgICAgID0gMHgxMzM7Ci0kQlROX1kgICAgICAgICAgICAgICAgICAgPSAweDEzNDsKLSRCVE5fWiAgICAgICAgICAgICAgICAgICA9IDB4MTM1OwotJEJUTl9UTCAgICAgICAgICAgICAgICAgID0gMHgxMzY7Ci0kQlROX1RSICAgICAgICAgICAgICAgICAgPSAweDEzNzsKLSRCVE5fVEwyICAgICAgICAgICAgICAgICA9IDB4MTM4OwotJEJUTl9UUjIgICAgICAgICAgICAgICAgID0gMHgxMzk7Ci0kQlROX1NFTEVDVCAgICAgICAgICAgICAgPSAweDEzYTsKLSRCVE5fU1RBUlQgICAgICAgICAgICAgICA9IDB4MTNiOwotJEJUTl9NT0RFICAgICAgICAgICAgICAgID0gMHgxM2M7Ci0kQlROX1RIVU1CTCAgICAgICAgICAgICAgPSAweDEzZDsKLSRCVE5fVEhVTUJSICAgICAgICAgICAgICA9IDB4MTNlOwotCi0kQlROX0RJR0kgICAgICAgICAgICAgICAgPSAweDE0MDsKLSRCVE5fVE9PTF9QRU4gICAgICAgICAgICA9IDB4MTQwOwotJEJUTl9UT09MX1JVQkJFUiAgICAgICAgID0gMHgxNDE7Ci0kQlROX1RPT0xfQlJVU0ggICAgICAgICAgPSAweDE0MjsKLSRCVE5fVE9PTF9QRU5DSUwgICAgICAgICA9IDB4MTQzOwotJEJUTl9UT09MX0FJUkJSVVNIICAgICAgID0gMHgxNDQ7Ci0kQlROX1RPT0xfRklOR0VSICAgICAgICAgPSAweDE0NTsKLSRCVE5fVE9PTF9NT1VTRSAgICAgICAgICA9IDB4MTQ2OwotJEJUTl9UT09MX0xFTlMgICAgICAgICAgID0gMHgxNDc7Ci0kQlROX1RPVUNIICAgICAgICAgICAgICAgPSAweDE0YTsKLSRCVE5fU1RZTFVTICAgICAgICAgICAgICA9IDB4MTRiOwotJEJUTl9TVFlMVVMyICAgICAgICAgICAgID0gMHgxNGM7Ci0kQlROX1RPT0xfRE9VQkxFVEFQICAgICAgPSAweDE0ZDsKLSRCVE5fVE9PTF9UUklQTEVUQVAgICAgICA9IDB4MTRlOwotCi0kQlROX1dIRUVMICAgICAgICAgICAgICAgPSAweDE1MDsKLSRCVE5fR0VBUl9ET1dOICAgICAgICAgICA9IDB4MTUwOwotJEJUTl9HRUFSX1VQICAgICAgICAgICAgID0gMHgxNTE7Ci0KLSRTWU5fUkVQT1JUICAgICAgICAgICAgICA9IDA7Ci0kU1lOX0NPTkZJRyAgICAgICAgICAgICAgPSAxOwotJFNZTl9NVF9SRVBPUlQgICAgICAgICAgID0gMjsKLQotJEtFWV9SRVNFUlZFRCA9IDA7Ci0kS0VZX0VTQyA9ICAgICAgMTsKLSRLRVlfMSA9ICAgICAgICAyOwotJEtFWV8yID0gICAgICAgIDM7Ci0kS0VZXzMgPSAgICAgICAgNDsKLSRLRVlfNCA9ICAgICAgICA1OwotJEtFWV81ID0gICAgICAgIDY7Ci0kS0VZXzYgPSAgICAgICAgNzsKLSRLRVlfNyA9ICAgICAgICA4OwotJEtFWV84ID0gICAgICAgIDk7Ci0kS0VZXzkgPSAgICAgICAgMTA7Ci0kS0VZXzAgPSAgICAgICAgMTE7Ci0kS0VZX01JTlVTID0gICAgMTI7Ci0kS0VZX0VRVUFMID0gICAgMTM7Ci0kS0VZX0JBQ0tTUEFDRSA9ICAgICAgICAxNDsKLSRLRVlfVEFCID0gICAgICAxNTsKLSRLRVlfUSA9ICAgICAgICAxNjsKLSRLRVlfVyA9ICAgICAgICAxNzsKLSRLRVlfRSA9ICAgICAgICAxODsKLSRLRVlfUiA9ICAgICAgICAxOTsKLSRLRVlfVCA9ICAgICAgICAyMDsKLSRLRVlfWSA9ICAgICAgICAyMTsKLSRLRVlfVSA9ICAgICAgICAyMjsKLSRLRVlfSSA9ICAgICAgICAyMzsKLSRLRVlfTyA9ICAgICAgICAyNDsKLSRLRVlfUCA9ICAgICAgICAyNTsKLSRLRVlfTEVGVEJSQUNFID0gICAgICAgIDI2OwotJEtFWV9SSUdIVEJSQUNFID0gICAgICAgMjc7Ci0kS0VZX0VOVEVSID0gICAgMjg7Ci0kS0VZX0xFRlRDVFJMID0gMjk7Ci0kS0VZX0EgPSAgICAgICAgMzA7Ci0kS0VZX1MgPSAgICAgICAgMzE7Ci0kS0VZX0QgPSAgICAgICAgMzI7Ci0kS0VZX0YgPSAgICAgICAgMzM7Ci0kS0VZX0cgPSAgICAgICAgMzQ7Ci0kS0VZX0ggPSAgICAgICAgMzU7Ci0kS0VZX0ogPSAgICAgICAgMzY7Ci0kS0VZX0sgPSAgICAgICAgMzc7Ci0kS0VZX0wgPSAgICAgICAgMzg7Ci0kS0VZX1NFTUlDT0xPTiA9ICAgICAgICAzOTsKLSRLRVlfQVBPU1RST1BIRSA9ICAgICAgIDQwOwotJEtFWV9HUkFWRSA9ICAgIDQxOwotJEtFWV9MRUZUU0hJRlQgPSAgICAgICAgNDI7Ci0kS0VZX0JBQ0tTTEFTSCA9ICAgICAgICA0MzsKLSRLRVlfWiA9ICAgICAgICA0NDsKLSRLRVlfWCA9ICAgICAgICA0NTsKLSRLRVlfQyA9ICAgICAgICA0NjsKLSRLRVlfViA9ICAgICAgICA0NzsKLSRLRVlfQiA9ICAgICAgICA0ODsKLSRLRVlfTiA9ICAgICAgICA0OTsKLSRLRVlfTSA9ICAgICAgICA1MDsKLSRLRVlfQ09NTUEgPSAgICA1MTsKLSRLRVlfRE9UID0gICAgICA1MjsKLSRLRVlfU0xBU0ggPSAgICA1MzsKLSRLRVlfUklHSFRTSElGVCA9ICAgICAgIDU0OwotJEtFWV9LUEFTVEVSSVNLID0gICAgICAgNTU7Ci0kS0VZX0xFRlRBTFQgPSAgNTY7Ci0kS0VZX1NQQUNFID0gICAgNTc7Ci0kS0VZX0NBUFNMT0NLID0gNTg7Ci0kS0VZX0YxID0gICAgICAgNTk7Ci0kS0VZX0YyID0gICAgICAgNjA7Ci0kS0VZX0YzID0gICAgICAgNjE7Ci0kS0VZX0Y0ID0gICAgICAgNjI7Ci0kS0VZX0Y1ID0gICAgICAgNjM7Ci0kS0VZX0Y2ID0gICAgICAgNjQ7Ci0kS0VZX0Y3ID0gICAgICAgNjU7Ci0kS0VZX0Y4ID0gICAgICAgNjY7Ci0kS0VZX0Y5ID0gICAgICAgNjc7Ci0kS0VZX0YxMCA9ICAgICAgNjg7Ci0kS0VZX05VTUxPQ0sgPSAgNjk7Ci0kS0VZX1NDUk9MTExPQ0sgPSAgICAgICA3MDsKLSRLRVlfS1A3ID0gICAgICA3MTsKLSRLRVlfS1A4ID0gICAgICA3MjsKLSRLRVlfS1A5ID0gICAgICA3MzsKLSRLRVlfS1BNSU5VUyA9ICA3NDsKLSRLRVlfS1A0ID0gICAgICA3NTsKLSRLRVlfS1A1ID0gICAgICA3NjsKLSRLRVlfS1A2ID0gICAgICA3NzsKLSRLRVlfS1BQTFVTID0gICA3ODsKLSRLRVlfS1AxID0gICAgICA3OTsKLSRLRVlfS1AyID0gICAgICA4MDsKLSRLRVlfS1AzID0gICAgICA4MTsKLSRLRVlfS1AwID0gICAgICA4MjsKLSRLRVlfS1BET1QgPSAgICA4MzsKLSRLRVlfMTAzUkQgPSAgICA4NDsKLSRLRVlfRjEzID0gICAgICA4NTsKLSRLRVlfMTAyTkQgPSAgICA4NjsKLSRLRVlfRjExID0gICAgICA4NzsKLSRLRVlfRjEyID0gICAgICA4ODsKLSRLRVlfRjE0ID0gICAgICA4OTsKLSRLRVlfRjE1ID0gICAgICA5MDsKLSRLRVlfRjE2ID0gICAgICA5MTsKLSRLRVlfRjE3ID0gICAgICA5MjsKLSRLRVlfRjE4ID0gICAgICA5MzsKLSRLRVlfRjE5ID0gICAgICA5NDsKLSRLRVlfRjIwID0gICAgICA5NTsKLSRLRVlfS1BFTlRFUiA9ICA5NjsKLSRLRVlfUklHSFRDVFJMID0gICAgICAgIDk3OwotJEtFWV9LUFNMQVNIID0gIDk4OwotJEtFWV9TWVNSUSA9ICAgIDk5OwotJEtFWV9SSUdIVEFMVCA9IDEwMDsKLSRLRVlfTElORUZFRUQgPSAxMDE7Ci0kS0VZX0hPTUUgPSAgICAgMTAyOwotJEtFWV9VUCA9ICAgICAgIDEwMzsKLSRLRVlfUEFHRVVQID0gICAxMDQ7Ci0kS0VZX0xFRlQgPSAgICAgMTA1OwotJEtFWV9SSUdIVCA9ICAgIDEwNjsKLSRLRVlfRU5EID0gICAgICAxMDc7Ci0kS0VZX0RPV04gPSAgICAgMTA4OwotJEtFWV9QQUdFRE9XTiA9IDEwOTsKLSRLRVlfSU5TRVJUID0gICAxMTA7Ci0kS0VZX0RFTEVURSA9ICAgMTExOwotJEtFWV9NQUNSTyA9ICAgIDExMjsKLSRLRVlfTVVURSA9ICAgICAxMTM7Ci0kS0VZX1ZPTFVNRURPV04gPSAgICAgICAxMTQ7Ci0kS0VZX1ZPTFVNRVVQID0gMTE1OwotJEtFWV9QT1dFUiA9ICAgIDExNjsKLSRLRVlfS1BFUVVBTCA9ICAxMTc7Ci0kS0VZX0tQUExVU01JTlVTID0gICAgICAxMTg7Ci0kS0VZX1BBVVNFID0gICAgMTE5OwotJEtFWV9GMjEgPSAgICAgIDEyMDsKLSRLRVlfRjIyID0gICAgICAxMjE7Ci0kS0VZX0YyMyA9ICAgICAgMTIyOwotJEtFWV9GMjQgPSAgICAgIDEyMzsKLSRLRVlfS1BDT01NQSA9ICAxMjQ7Ci0kS0VZX0xFRlRNRVRBID0gMTI1OwotJEtFWV9SSUdIVE1FVEEgPSAgICAgICAgMTI2OwotJEtFWV9DT01QT1NFID0gIDEyNzsKLSRLRVlfU1RPUCA9ICAgICAxMjg7Ci0kS0VZX0FHQUlOID0gICAgMTI5OwotJEtFWV9QUk9QUyA9ICAgIDEzMDsKLSRLRVlfVU5ETyA9ICAgICAxMzE7Ci0kS0VZX0ZST05UID0gICAgMTMyOwotJEtFWV9DT1BZID0gICAgIDEzMzsKLSRLRVlfT1BFTiA9ICAgICAxMzQ7Ci0kS0VZX1BBU1RFID0gICAgMTM1OwotJEtFWV9GSU5EID0gICAgIDEzNjsKLSRLRVlfQ1VUID0gICAgICAxMzc7Ci0kS0VZX0hFTFAgPSAgICAgMTM4OwotJEtFWV9NRU5VID0gICAgIDEzOTsKLSRLRVlfQ0FMQyA9ICAgICAxNDA7Ci0kS0VZX1NFVFVQID0gICAgMTQxOwotJEtFWV9TTEVFUCA9ICAgIDE0MjsKLSRLRVlfV0FLRVVQID0gICAxNDM7Ci0kS0VZX0ZJTEUgPSAgICAgMTQ0OwotJEtFWV9TRU5ERklMRSA9IDE0NTsKLSRLRVlfREVMRVRFRklMRSA9ICAgICAgIDE0NjsKLSRLRVlfWEZFUiA9ICAgICAxNDc7Ci0kS0VZX1BST0cxID0gICAgMTQ4OwotJEtFWV9QUk9HMiA9ICAgIDE0OTsKLSRLRVlfV1dXID0gICAgICAxNTA7Ci0kS0VZX01TRE9TID0gICAgMTUxOwotJEtFWV9DT0ZGRUUgPSAgIDE1MjsKLSRLRVlfRElSRUNUSU9OID0gICAgICAgIDE1MzsKLSRLRVlfQ1lDTEVXSU5ET1dTID0gICAgIDE1NDsKLSRLRVlfTUFJTCA9ICAgICAxNTU7Ci0kS0VZX0JPT0tNQVJLUyA9ICAgICAgICAxNTY7Ci0kS0VZX0NPTVBVVEVSID0gMTU3OwotJEtFWV9CQUNLID0gICAgIDE1ODsKLSRLRVlfRk9SV0FSRCA9ICAxNTk7Ci0kS0VZX0NMT1NFQ0QgPSAgMTYwOwotJEtFWV9FSkVDVENEID0gIDE2MTsKLSRLRVlfRUpFQ1RDTE9TRUNEID0gICAgIDE2MjsKLSRLRVlfTkVYVFNPTkcgPSAxNjM7Ci0kS0VZX1BMQVlQQVVTRSA9ICAgICAgICAxNjQ7Ci0kS0VZX1BSRVZJT1VTU09ORyA9ICAgICAxNjU7Ci0kS0VZX1NUT1BDRCA9ICAgMTY2OwotJEtFWV9SRUNPUkQgPSAgIDE2NzsKLSRLRVlfUkVXSU5EID0gICAxNjg7Ci0kS0VZX1BIT05FID0gICAgMTY5OwotJEtFWV9JU08gPSAgICAgIDE3MDsKLSRLRVlfQ09ORklHID0gICAxNzE7Ci0kS0VZX0hPTUVQQUdFID0gMTcyOwotJEtFWV9SRUZSRVNIID0gIDE3MzsKLSRLRVlfRVhJVCA9ICAgICAxNzQ7Ci0kS0VZX01PVkUgPSAgICAgMTc1OwotJEtFWV9FRElUID0gICAgIDE3NjsKLSRLRVlfU0NST0xMVVAgPSAxNzc7Ci0kS0VZX1NDUk9MTERPV04gPSAgICAgICAxNzg7Ci0kS0VZX0tQTEVGVFBBUkVOID0gICAgICAxNzk7Ci0kS0VZX0tQUklHSFRQQVJFTiA9ICAgICAxODA7Ci0kS0VZX0lOVEwxID0gICAgMTgxOwotJEtFWV9JTlRMMiA9ICAgIDE4MjsKLSRLRVlfSU5UTDMgPSAgICAxODM7Ci0kS0VZX0lOVEw0ID0gICAgMTg0OwotJEtFWV9JTlRMNSA9ICAgIDE4NTsKLSRLRVlfSU5UTDYgPSAgICAxODY7Ci0kS0VZX0lOVEw3ID0gICAgMTg3OwotJEtFWV9JTlRMOCA9ICAgIDE4ODsKLSRLRVlfSU5UTDkgPSAgICAxODk7Ci0kS0VZX0xBTkcxID0gICAgMTkwOwotJEtFWV9MQU5HMiA9ICAgIDE5MTsKLSRLRVlfTEFORzMgPSAgICAxOTI7Ci0kS0VZX0xBTkc0ID0gICAgMTkzOwotJEtFWV9MQU5HNSA9ICAgIDE5NDsKLSRLRVlfTEFORzYgPSAgICAxOTU7Ci0kS0VZX0xBTkc3ID0gICAgMTk2OwotJEtFWV9MQU5HOCA9ICAgIDE5NzsKLSRLRVlfTEFORzkgPSAgICAxOTg7Ci0kS0VZX1BMQVlDRCA9ICAgMjAwOwotJEtFWV9QQVVTRUNEID0gIDIwMTsKLSRLRVlfUFJPRzMgPSAgICAyMDI7Ci0kS0VZX1BST0c0ID0gICAgMjAzOwotJEtFWV9TVVNQRU5EID0gIDIwNTsKLSRLRVlfQ0xPU0UgPSAgICAyMDY7Ci0kS0VZX1BMQVkgPSAgICAgMjA3OwotJEtFWV9GQVNURk9SV0FSRCA9ICAgICAgMjA4OwotJEtFWV9CQVNTQk9PU1QgPSAgICAgICAgMjA5OwotJEtFWV9QUklOVCA9ICAgIDIxMDsKLSRLRVlfSFAgPSAgICAgICAyMTE7Ci0kS0VZX0NBTUVSQSA9ICAgMjEyOwotJEtFWV9TT1VORCA9ICAgIDIxMzsKLSRLRVlfUVVFU1RJT04gPSAyMTQ7Ci0kS0VZX0VNQUlMID0gICAgMjE1OwotJEtFWV9DSEFUID0gICAgIDIxNjsKLSRLRVlfU0VBUkNIID0gICAyMTc7Ci0kS0VZX0NPTk5FQ1QgPSAgMjE4OwotJEtFWV9GSU5BTkNFID0gIDIxOTsKLSRLRVlfU1BPUlQgPSAgICAyMjA7Ci0kS0VZX1NIT1AgPSAgICAgMjIxOwotJEtFWV9BTFRFUkFTRSA9IDIyMjsKLSRLRVlfQ0FOQ0VMID0gICAyMjM7Ci0kS0VZX0JSSUdIVE5FU1NET1dOID0gICAyMjQ7Ci0kS0VZX0JSSUdIVE5FU1NVUCA9ICAgICAyMjU7Ci0kS0VZX01FRElBID0gICAgMjI2OwotJEtFWV9VTktOT1dOID0gIDI0MDsKLSRLRVlfT0sgPSAgICAgICAweDE2MDsKLSRLRVlfU0VMRUNUID0gICAweDE2MTsKLSRLRVlfR09UTyA9ICAgICAweDE2MjsKLSRLRVlfQ0xFQVIgPSAgICAweDE2MzsKLSRLRVlfUE9XRVIyID0gICAweDE2NDsKLSRLRVlfT1BUSU9OID0gICAweDE2NTsKLSRLRVlfSU5GTyA9ICAgICAweDE2NjsKLSRLRVlfVElNRSA9ICAgICAweDE2NzsKLSRLRVlfVkVORE9SID0gICAweDE2ODsKLSRLRVlfQVJDSElWRSA9ICAweDE2OTsKLSRLRVlfUFJPR1JBTSA9ICAweDE2YTsKLSRLRVlfQ0hBTk5FTCA9ICAweDE2YjsKLSRLRVlfRkFWT1JJVEVTID0gICAgICAgIDB4MTZjOwotJEtFWV9FUEcgPSAgICAgIDB4MTZkOwotJEtFWV9QVlIgPSAgICAgIDB4MTZlOwotJEtFWV9NSFAgPSAgICAgIDB4MTZmOwotJEtFWV9MQU5HVUFHRSA9IDB4MTcwOwotJEtFWV9USVRMRSA9ICAgIDB4MTcxOwotJEtFWV9TVUJUSVRMRSA9IDB4MTcyOwotJEtFWV9BTkdMRSA9ICAgIDB4MTczOwotJEtFWV9aT09NID0gICAgIDB4MTc0OwotJEtFWV9NT0RFID0gICAgIDB4MTc1OwotJEtFWV9LRVlCT0FSRCA9IDB4MTc2OwotJEtFWV9TQ1JFRU4gPSAgIDB4MTc3OwotJEtFWV9QQyA9ICAgICAgIDB4MTc4OwotJEtFWV9UViA9ICAgICAgIDB4MTc5OwotJEtFWV9UVjIgPSAgICAgIDB4MTdhOwotJEtFWV9WQ1IgPSAgICAgIDB4MTdiOwotJEtFWV9WQ1IyID0gICAgIDB4MTdjOwotJEtFWV9TQVQgPSAgICAgIDB4MTdkOwotJEtFWV9TQVQyID0gICAgIDB4MTdlOwotJEtFWV9DRCA9ICAgICAgIDB4MTdmOwotJEtFWV9UQVBFID0gICAgIDB4MTgwOwotJEtFWV9SQURJTyA9ICAgIDB4MTgxOwotJEtFWV9UVU5FUiA9ICAgIDB4MTgyOwotJEtFWV9QTEFZRVIgPSAgIDB4MTgzOwotJEtFWV9URVhUID0gICAgIDB4MTg0OwotJEtFWV9EVkQgPSAgICAgIDB4MTg1OwotJEtFWV9BVVggPSAgICAgIDB4MTg2OwotJEtFWV9NUDMgPSAgICAgIDB4MTg3OwotJEtFWV9BVURJTyA9ICAgIDB4MTg4OwotJEtFWV9WSURFTyA9ICAgIDB4MTg5OwotJEtFWV9ESVJFQ1RPUlkgPSAgICAgICAgMHgxOGE7Ci0kS0VZX0xJU1QgPSAgICAgMHgxOGI7Ci0kS0VZX01FTU8gPSAgICAgMHgxOGM7Ci0kS0VZX0NBTEVOREFSID0gMHgxOGQ7Ci0kS0VZX1JFRCA9ICAgICAgMHgxOGU7Ci0kS0VZX0dSRUVOID0gICAgMHgxOGY7Ci0kS0VZX1lFTExPVyA9ICAgMHgxOTA7Ci0kS0VZX0JMVUUgPSAgICAgMHgxOTE7Ci0kS0VZX0NIQU5ORUxVUCA9ICAgICAgICAweDE5MjsKLSRLRVlfQ0hBTk5FTERPV04gPSAgICAgIDB4MTkzOwotJEtFWV9GSVJTVCA9ICAgIDB4MTk0OwotJEtFWV9MQVNUID0gICAgIDB4MTk1OwotJEtFWV9BQiA9ICAgICAgIDB4MTk2OwotJEtFWV9ORVhUID0gICAgIDB4MTk3OwotJEtFWV9SRVNUQVJUID0gIDB4MTk4OwotJEtFWV9TTE9XID0gICAgIDB4MTk5OwotJEtFWV9TSFVGRkxFID0gIDB4MTlhOwotJEtFWV9CUkVBSyA9ICAgIDB4MTliOwotJEtFWV9QUkVWSU9VUyA9IDB4MTljOwotJEtFWV9ESUdJVFMgPSAgIDB4MTlkOwotJEtFWV9URUVOID0gICAgIDB4MTllOwotJEtFWV9UV0VOID0gICAgIDB4MTlmOwotJEtFWV9ERUxfRU9MID0gIDB4MWMwOwotJEtFWV9ERUxfRU9TID0gIDB4MWMxOwotJEtFWV9JTlNfTElORSA9IDB4MWMyOwotJEtFWV9ERUxfTElORSA9IDB4MWMzOwotJEtFWV9NQVggPSAgICAgIDB4MWZmOwotCi0KLSAgICAgICAgJGtleV9sb29rdXB7WEtfRXNjYXBlfSAgPSAkS0VZX0VTQzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfMX0gICAgICAgICAgICAgICA9ICRLRVlfMTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfMn0gICAgICAgICAgICAgICA9ICRLRVlfMjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfM30gICAgICAgICAgICAgICA9ICRLRVlfMzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfNH0gICAgICAgICAgICAgICA9ICRLRVlfNDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfNX0gICAgICAgICAgICAgICA9ICRLRVlfNTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfNn0gICAgICAgICAgICAgICA9ICRLRVlfNjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfN30gICAgICAgICAgICAgICA9ICRLRVlfNzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfOH0gICAgICAgICAgICAgICA9ICRLRVlfODsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfOX0gICAgICAgICAgICAgICA9ICRLRVlfOTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfMH0gICAgICAgICAgICAgICA9ICRLRVlfMDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZXhjbGFtfSAgPSAkS0VZXzE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2F0fSAgICAgICAgICAgICAgPSAkS0VZXzI7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX251bWJlcnNpZ259ICAgICAgPSAkS0VZXzM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2RvbGxhcn0gID0gJEtFWV80OwotICAgICAgICAka2V5X2xvb2t1cHtYS19wZXJjZW50fSA9ICRLRVlfNTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYXNjaWljaXJjdW19ICAgICA9ICRLRVlfNjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYW1wZXJzYW5kfSAgICAgICA9ICRLRVlfNzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYXN0ZXJpc2t9ICAgICAgICA9ICRLRVlfODsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcGFyZW5sZWZ0fSAgICAgICA9ICRLRVlfOTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcGFyZW5yaWdodH0gICAgICA9ICRLRVlfMDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfbWludXN9ICAgPSAkS0VZX01JTlVTOwotICAgICAgICAka2V5X2xvb2t1cHtYS191bmRlcnNjb3JlfSAgICAgID0gJEtFWV9NSU5VUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZXF1YWx9ICAgPSAkS0VZX0VRVUFMOwotICAgICAgICAka2V5X2xvb2t1cHtYS19wbHVzfSAgICA9ICRLRVlfRVFVQUw7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0JhY2tTcGFjZX0gICAgICAgPSAkS0VZX0JBQ0tTUEFDRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfVGFifSAgICAgICAgICAgICA9ICRLRVlfVEFCOwotICAgICAgICAka2V5X2xvb2t1cHtYS19xfSAgICAgICAgICAgICAgID0gJEtFWV9ROwotICAgICAgICAka2V5X2xvb2t1cHtYS19RfSAgICAgICAgICAgICAgID0gJEtFWV9ROwotICAgICAgICAka2V5X2xvb2t1cHtYS193fSAgICAgICAgICAgICAgID0gJEtFWV9XOwotICAgICAgICAka2V5X2xvb2t1cHtYS19XfSAgICAgICAgICAgICAgID0gJEtFWV9XOwotICAgICAgICAka2V5X2xvb2t1cHtYS19lfSAgICAgICAgICAgICAgID0gJEtFWV9FOwotICAgICAgICAka2V5X2xvb2t1cHtYS19FfSAgICAgICAgICAgICAgID0gJEtFWV9FOwotICAgICAgICAka2V5X2xvb2t1cHtYS19yfSAgICAgICAgICAgICAgID0gJEtFWV9SOwotICAgICAgICAka2V5X2xvb2t1cHtYS19SfSAgICAgICAgICAgICAgID0gJEtFWV9SOwotICAgICAgICAka2V5X2xvb2t1cHtYS190fSAgICAgICAgICAgICAgID0gJEtFWV9UOwotICAgICAgICAka2V5X2xvb2t1cHtYS19UfSAgICAgICAgICAgICAgID0gJEtFWV9UOwotICAgICAgICAka2V5X2xvb2t1cHtYS195fSAgICAgICAgICAgICAgID0gJEtFWV9ZOwotICAgICAgICAka2V5X2xvb2t1cHtYS19ZfSAgICAgICAgICAgICAgID0gJEtFWV9ZOwotICAgICAgICAka2V5X2xvb2t1cHtYS191fSAgICAgICAgICAgICAgID0gJEtFWV9VOwotICAgICAgICAka2V5X2xvb2t1cHtYS19VfSAgICAgICAgICAgICAgID0gJEtFWV9VOwotICAgICAgICAka2V5X2xvb2t1cHtYS19pfSAgICAgICAgICAgICAgID0gJEtFWV9JOwotICAgICAgICAka2V5X2xvb2t1cHtYS19JfSAgICAgICAgICAgICAgID0gJEtFWV9JOwotICAgICAgICAka2V5X2xvb2t1cHtYS19vfSAgICAgICAgICAgICAgID0gJEtFWV9POwotICAgICAgICAka2V5X2xvb2t1cHtYS19PfSAgICAgICAgICAgICAgID0gJEtFWV9POwotICAgICAgICAka2V5X2xvb2t1cHtYS19wfSAgICAgICAgICAgICAgID0gJEtFWV9QOwotICAgICAgICAka2V5X2xvb2t1cHtYS19QfSAgICAgICAgICAgICAgID0gJEtFWV9QOwotICAgICAgICAka2V5X2xvb2t1cHtYS19icmFjZWxlZnR9ICAgICAgID0gJEtFWV9MRUZUQlJBQ0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2JyYWNlcmlnaHR9ICAgICAgPSAkS0VZX1JJR0hUQlJBQ0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2JyYWNrZXRsZWZ0fSAgICAgPSAkS0VZX0xFRlRCUkFDRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYnJhY2tldHJpZ2h0fSAgICA9ICRLRVlfUklHSFRCUkFDRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUmV0dXJufSAgPSAkS0VZX0VOVEVSOwotICAgICAgICAka2V5X2xvb2t1cHtYS19Db250cm9sX0x9ICAgICAgID0gJEtFWV9MRUZUQ1RSTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYX0gICAgICAgICAgICAgICA9ICRLRVlfQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQX0gICAgICAgICAgICAgICA9ICRLRVlfQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfc30gICAgICAgICAgICAgICA9ICRLRVlfUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfU30gICAgICAgICAgICAgICA9ICRLRVlfUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZH0gICAgICAgICAgICAgICA9ICRLRVlfRDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRH0gICAgICAgICAgICAgICA9ICRLRVlfRDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZn0gICAgICAgICAgICAgICA9ICRLRVlfRjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRn0gICAgICAgICAgICAgICA9ICRLRVlfRjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZ30gICAgICAgICAgICAgICA9ICRLRVlfRzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfR30gICAgICAgICAgICAgICA9ICRLRVlfRzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfaH0gICAgICAgICAgICAgICA9ICRLRVlfSDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfSH0gICAgICAgICAgICAgICA9ICRLRVlfSDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfan0gICAgICAgICAgICAgICA9ICRLRVlfSjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfSn0gICAgICAgICAgICAgICA9ICRLRVlfSjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfa30gICAgICAgICAgICAgICA9ICRLRVlfSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS30gICAgICAgICAgICAgICA9ICRLRVlfSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfbH0gICAgICAgICAgICAgICA9ICRLRVlfTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTH0gICAgICAgICAgICAgICA9ICRLRVlfTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfc2VtaWNvbG9ufSAgICAgICA9ICRLRVlfU0VNSUNPTE9OOwotICAgICAgICAka2V5X2xvb2t1cHtYS19jb2xvbn0gICA9ICRLRVlfU0VNSUNPTE9OOwotICAgICAgICAka2V5X2xvb2t1cHtYS19hcG9zdHJvcGhlfSAgICAgID0gJEtFWV9BUE9TVFJPUEhFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19xdW90ZWRibH0gICAgICAgID0gJEtFWV9BUE9TVFJPUEhFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19ncmF2ZX0gICA9ICRLRVlfR1JBVkU7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2FzY2lpdGlsZGV9ICAgICAgPSAkS0VZX0dSQVZFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19TaGlmdF9MfSA9ICRLRVlfTEVGVFNISUZUOwotICAgICAgICAka2V5X2xvb2t1cHtYS19iYWNrc2xhc2h9ICAgICAgID0gJEtFWV9CQUNLU0xBU0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2Jhcn0gICAgICAgICAgICAgPSAkS0VZX0JBQ0tTTEFTSDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfen0gICAgICAgICAgICAgICA9ICRLRVlfWjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfWn0gICAgICAgICAgICAgICA9ICRLRVlfWjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfeH0gICAgICAgICAgICAgICA9ICRLRVlfWDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfWH0gICAgICAgICAgICAgICA9ICRLRVlfWDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfY30gICAgICAgICAgICAgICA9ICRLRVlfQzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQ30gICAgICAgICAgICAgICA9ICRLRVlfQzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfdn0gICAgICAgICAgICAgICA9ICRLRVlfVjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfVn0gICAgICAgICAgICAgICA9ICRLRVlfVjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYn0gICAgICAgICAgICAgICA9ICRLRVlfQjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQn0gICAgICAgICAgICAgICA9ICRLRVlfQjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfbn0gICAgICAgICAgICAgICA9ICRLRVlfTjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTn0gICAgICAgICAgICAgICA9ICRLRVlfTjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfbX0gICAgICAgICAgICAgICA9ICRLRVlfTTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTX0gICAgICAgICAgICAgICA9ICRLRVlfTTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfY29tbWF9ICAgPSAkS0VZX0NPTU1BOwotICAgICAgICAka2V5X2xvb2t1cHtYS19sZXNzfSAgICA9ICRLRVlfQ09NTUE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3BlcmlvZH0gID0gJEtFWV9ET1Q7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2dyZWF0ZXJ9ID0gJEtFWV9ET1Q7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3NsYXNofSAgID0gJEtFWV9TTEFTSDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcXVlc3Rpb259ICAgICAgICA9ICRLRVlfU0xBU0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1NoaWZ0X1J9ID0gJEtFWV9SSUdIVFNISUZUOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9NdWx0aXBseX0gICAgID0gJEtFWV9LUEFTVEVSSVNLOwotICAgICAgICAka2V5X2xvb2t1cHtYS19BbHRfTH0gICA9ICRLRVlfTEVGVEFMVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfc3BhY2V9ICAgPSAkS0VZX1NQQUNFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19DYXBzX0xvY2t9ICAgICAgID0gJEtFWV9DQVBTTE9DSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjF9ICAgICAgICAgICAgICA9ICRLRVlfRjE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YyfSAgICAgICAgICAgICAgPSAkS0VZX0YyOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GM30gICAgICAgICAgICAgID0gJEtFWV9GMzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjR9ICAgICAgICAgICAgICA9ICRLRVlfRjQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Y1fSAgICAgICAgICAgICAgPSAkS0VZX0Y1OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GNn0gICAgICAgICAgICAgID0gJEtFWV9GNjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjd9ICAgICAgICAgICAgICA9ICRLRVlfRjc7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Y4fSAgICAgICAgICAgICAgPSAkS0VZX0Y4OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GOX0gICAgICAgICAgICAgID0gJEtFWV9GOTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjEwfSAgICAgICAgICAgICA9ICRLRVlfRjEwOwotICAgICAgICAka2V5X2xvb2t1cHtYS19OdW1fTG9ja30gICAgICAgID0gJEtFWV9OVU1MT0NLOwotICAgICAgICAka2V5X2xvb2t1cHtYS19TY3JvbGxfTG9ja30gICAgID0gJEtFWV9TQ1JPTExMT0NLOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF83fSAgICAgICAgICAgID0gJEtFWV9LUDc7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzh9ICAgICAgICAgICAgPSAkS0VZX0tQODsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfOX0gICAgICAgICAgICA9ICRLRVlfS1A5OwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9TdWJ0cmFjdH0gICAgID0gJEtFWV9LUE1JTlVTOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF80fSAgICAgICAgICAgID0gJEtFWV9LUDQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzV9ICAgICAgICAgICAgPSAkS0VZX0tQNTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfNn0gICAgICAgICAgICA9ICRLRVlfS1A2OwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9BZGR9ICA9ICRLRVlfS1BQTFVTOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF8xfSAgICAgICAgICAgID0gJEtFWV9LUDE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzJ9ICAgICAgICAgICAgPSAkS0VZX0tQMjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfM30gICAgICAgICAgICA9ICRLRVlfS1AzOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF8wfSAgICAgICAgICAgID0gJEtFWV9LUDA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQX0RlY2ltYWx9ICAgICAgPSAkS0VZX0tQRE9UOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTN9ICAgICAgICAgICAgID0gJEtFWV9GMTM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxMX0gICAgICAgICAgICAgPSAkS0VZX0YxMTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjEyfSAgICAgICAgICAgICA9ICRLRVlfRjEyOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTR9ICAgICAgICAgICAgID0gJEtFWV9GMTQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxNX0gICAgICAgICAgICAgPSAkS0VZX0YxNTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjE2fSAgICAgICAgICAgICA9ICRLRVlfRjE2OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTd9ICAgICAgICAgICAgID0gJEtFWV9GMTc7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxOH0gICAgICAgICAgICAgPSAkS0VZX0YxODsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjE5fSAgICAgICAgICAgICA9ICRLRVlfRjE5OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMjB9ICAgICAgICAgICAgID0gJEtFWV9GMjA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQX0VudGVyfSAgICAgICAgPSAkS0VZX0tQRU5URVI7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0NvbnRyb2xfUn0gICAgICAgPSAkS0VZX1JJR0hUQ1RSTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfRGl2aWRlfSAgICAgICA9ICRLRVlfS1BTTEFTSDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfU3lzX1JlcX0gPSAkS0VZX1NZU1JROwotICAgICAgICAka2V5X2xvb2t1cHtYS19BbHRfUn0gICA9ICRLRVlfUklHSFRBTFQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0xpbmVmZWVkfSAgICAgICAgPSAkS0VZX0xJTkVGRUVEOwotICAgICAgICAka2V5X2xvb2t1cHtYS19Ib21lfSAgICAgICAgICAgID0gJEtFWV9IT01FOwotICAgICAgICAka2V5X2xvb2t1cHtYS19VcH0gICAgICAgICAgICAgID0gJEtFWV9VUDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUGFnZV9VcH0gPSAkS0VZX1BBR0VVUDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTGVmdH0gICAgICAgICAgICA9ICRLRVlfTEVGVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUmlnaHR9ICAgPSAkS0VZX1JJR0hUOwotICAgICAgICAka2V5X2xvb2t1cHtYS19FbmR9ICAgICAgICAgICAgID0gJEtFWV9FTkQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Rvd259ICAgICAgICAgICAgPSAkS0VZX0RPV047Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1BhZ2VfRG93bn0gICAgICAgPSAkS0VZX1BBR0VET1dOOwotICAgICAgICAka2V5X2xvb2t1cHtYS19JbnNlcnR9ICA9ICRLRVlfSU5TRVJUOwotICAgICAgICAka2V5X2xvb2t1cHtYS19EZWxldGV9ICA9ICRLRVlfREVMRVRFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9FcXVhbH0gICAgICAgID0gJEtFWV9LUEVRVUFMOwotICAgICAgICAka2V5X2xvb2t1cHtYS19QYXVzZX0gICA9ICRLRVlfUEFVU0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YyMX0gICAgICAgICAgICAgPSAkS0VZX0YyMTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjIyfSAgICAgICAgICAgICA9ICRLRVlfRjIyOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMjN9ICAgICAgICAgICAgID0gJEtFWV9GMjM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YyNH0gICAgICAgICAgICAgPSAkS0VZX0YyNDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfU2VwYXJhdG9yfSAgICA9ICRLRVlfS1BDT01NQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTWV0YV9MfSAgPSAkS0VZX0xFRlRNRVRBOwotICAgICAgICAka2V5X2xvb2t1cHtYS19NZXRhX1J9ICA9ICRLRVlfUklHSFRNRVRBOwotICAgICAgICAka2V5X2xvb2t1cHtYS19NdWx0aV9rZXl9ICAgICAgID0gJEtFWV9DT01QT1NFOwotCi0kQUJTX01BWCA9IDYzOwotCi0kVUlfREVWX0NSRUFURSAgPSAweDU1MDE7Ci0kVUlfREVWX0RFU1RST1kgPSAweDU1MDI7Ci0kVUlfU0VUX0VWQklUICAgPSAweDQwMDQ1NTY0OwotJFVJX1NFVF9LRVlCSVQgID0gMHg0MDA0NTU2NTsKLSRVSV9TRVRfUkVMQklUICA9IDB4NDAwNDU1NjY7Ci0kVUlfU0VUX0FCU0JJVCAgPSAweDQwMDQ1NTY3OwotCi0jIEZJWE1FOiB0aW1lIGhpcmVzLCBldGMuCi0kbGludXhfZ2V0dGltZW9mZGF5X3N5c2NhbGwgPSA3ODsKLQotJE9fUkRPTkxZID0gMDA7Ci0kT19XUk9OTFkgPSAwMTsKLSRPX1JEV1IgICA9IDAyOwotJE9fTkRFTEFZID0gMDQwMDA7Ci0KLX0KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL3JhbmZiLnBsIGIveDExdm5jL21pc2MvcmFuZmIucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2YWE0OWQuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvcmFuZmIucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotICAjIS9iaW4vc2ggLS0gIyBBIGNvbW1lbnQgbWVudGlvbmluZyBwZXJsCi1ldmFsICdleGVjIHBlcmwgLVMgJDAgJHsxKyIkQCJ9JwotICAgICAgICBpZiAwOwotCi0jIHJhbmZiLnBsOiBleGFtcGxlIC1yYXdmYiBzZXR1cCBwcm9ncmFtLgotIyBFLmcuICB4MTF2bmMgLXJhd2ZiIHNldHVwOi4vcmFuZmIucGwKLQotIyBjYW4gc3VwcGx5IFd4SCBvciBXIEggb24gY21kIGxpbmU6Ci1pZiAoJEFSR1ZbMF0gPX4gL14oXGQrKXgoXGQrKSQvKSB7Ci0JJFcgPSAkMTsKLQkkSCA9ICQyOwotfSBlbHNlIHsKLQkkVyA9IHNoaWZ0OwotCSRIID0gc2hpZnQ7Ci19Ci0gCi0kVyA9IDQ4MCB1bmxlc3MgJFc7Ci0kSCA9IDM2MCB1bmxlc3MgJEg7Ci0KLSRmYiA9ICIvdG1wL3JhbmZiLiQkIjsKLW9wZW4oRkIsICI+JGZiIikgfHwgZGllICIkISI7Ci0KLSRvbmVzID0gIlwzNzciIHggKCRXICogNCk7Ci1mb3IgKCR5ID0gMDsgJHkgPCAkSDsgJHkrKykgewotCXByaW50IEZCICRvbmVzOwotfQotCi1pZiAoZm9yaykgewotCXByaW50ICJtYXA6JGZiXEAke1d9eCR7SH14MzJcbiI7Ci0JZXhpdCAwOwotfQotCi1zcmFuZCgpOwotd2hpbGUgKDEpIHsKLQlzaG93cGljKCk7Ci0JaWYgKCEga2lsbCAwLCAkRU5We1gxMVZOQ19QSUR9KSB7Ci0JCXByaW50IFNUREVSUiAiUElEICRFTlZ7WDExVk5DX1BJRH0gZ29uZVxuIjsKLQkJdW5saW5rKCRmYik7Ci0JCWV4aXQ7Ci0JfQotfQotCi1zdWIgc2hvd3BpYyB7Ci0KLQkjICAwIDwgeCx5IDwgMTsgIFIxLCBSMiwgLi4uIEI0IHJhbmRvbSAmIHNjYWxlZCBzbyBSLEcsQiA8IDI1NToKLQkjIFIoeCx5KSA9IFIxICsgUjIgKiB4ICsgUjMgKiB5ICsgUjQgKiB4ICogeQotCSMgRyh4LHkpID0gRzEgKyBHMiAqIHggKyBHMyAqIHkgKyBHNCAqIHggKiB5Ci0JIyBCKHgseSkgPSBCMSArIEIyICogeCArIEIzICogeSArIEI0ICogeCAqIHkKLQotCSRtaW5mYWMgPSAwLjI1OwotCWZvcmVhY2ggJGMgKCdSJywgJ0cnLCAnQicpIHsKLQkJJGExID0gcmFuZCgpICogJG1pbmZhYzsKLQkJJGEyID0gcmFuZCgpOwotCQkkYTMgPSByYW5kKCk7Ci0JCSRhNCA9IHJhbmQoKTsKLQkJJGF0ID0gJGExICsgJGEyICsgJGEzICsgJGE0OwotCQkkYTEgPSAyNTUgKiAoJGExLyRhdCk7Ci0JCSRhMiA9IDI1NSAqICgkYTIvJGF0KTsKLQkJJGEzID0gMjU1ICogKCRhMy8kYXQpOwotCQkkYTQgPSAyNTUgKiAoJGE0LyRhdCk7Ci0JCSMgaW52ZXJ0IGF4ZXMgcmFuZG9tbHkKLQkJJGF4ID0gMDsgJGF4ID0gMSBpZiByYW5kKCkgPCAwLjU7Ci0JCSRheSA9IDA7ICRheSA9IDEgaWYgcmFuZCgpIDwgMC41OwotCQlldmFsICJcJCR7Y30xID0gXCRhMSI7Ci0JCWV2YWwgIlwkJHtjfTIgPSBcJGEyIjsKLQkJZXZhbCAiXCQke2N9MyA9IFwkYTMiOwotCQlldmFsICJcJCR7Y300ID0gXCRhNCI7Ci0JCWV2YWwgIlwkJHtjfXggPSBcJGF4IjsKLQkJZXZhbCAiXCQke2N9eSA9IFwkYXkiOwotCX0KLQotCWZvciAoJGkgPSAwOyAkaSA8IDI1NjsgJGkrKykgewotCQkkcFskaV0gPSBwYWNrKCJjIiwgJGkpOwotCX0KLQotCSRXaW52ID0gMS4wLyRXOwotCSRIaW52ID0gMS4wLyRIOwotCi0JJHN0ciA9ICcnOwotCWZvciAoJHkgPSAwOyAkeSA8ICRIOyAkeSsrKSB7Ci0JCSR5ciA9ICR5ZyA9ICR5YiA9ICR5OwotCQkkeXIgPSAkSCAtICR5ciBpZiAkUnk7Ci0JCSR5ZyA9ICRIIC0gJHlnIGlmICRHeTsKLQkJJHliID0gJEggLSAkeWIgaWYgJEJ5OwotCQkkeXIgPSAkeXIgKiAkSGludjsKLQkJJHlnID0gJHlnICogJEhpbnY7Ci0JCSR5YiA9ICR5YiAqICRIaW52OwotCQkKLQkJJFlbMyokeSswXSA9ICR5cjsKLQkJJFlbMyokeSsxXSA9ICR5ZzsKLQkJJFlbMyokeSsyXSA9ICR5YjsKLQl9Ci0KLQlmb3IgKCR4ID0gMDsgJHggPCAkVzsgJHgrKykgewotCQkkeHIgPSAkeGcgPSAkeGIgPSAkeDsKLQkJJHhyID0gJFcgLSAkeHIgaWYgJFJ4OwotCQkkeGcgPSAkVyAtICR4ZyBpZiAkR3g7Ci0JCSR4YiA9ICRXIC0gJHhiIGlmICRCeDsKLQkJJHhyID0gJHhyICogJFdpbnY7Ci0JCSR4ZyA9ICR4ZyAqICRXaW52OwotCQkkeGIgPSAkeGIgKiAkV2ludjsKLQotCQkkWFszKiR4KzBdID0gJHhyOwotCQkkWFszKiR4KzFdID0gJHhnOwotCQkkWFszKiR4KzJdID0gJHhiOwotCX0KLQotCWZvciAoJHkgPSAwOyAkeSA8ICRIOyAkeSsrKSB7Ci0JCSMkeXIgPSAkeWcgPSAkeWIgPSAkeTsKLQkJIyR5ciA9ICRIIC0gJHlyIGlmICRSeTsKLQkJIyR5ZyA9ICRIIC0gJHlnIGlmICRHeTsKLQkJIyR5YiA9ICRIIC0gJHliIGlmICRCeTsKLQkJIyR5ciA9ICR5ciAqICRIaW52OwotCQkjJHlnID0gJHlnICogJEhpbnY7Ci0JCSMkeWIgPSAkeWIgKiAkSGludjsKLQotCQkkeXIgPSAkWVszKiR5KzBdOwotCQkkeWcgPSAkWVszKiR5KzFdOwotCQkkeWIgPSAkWVszKiR5KzJdOwotCi0JCSRSWTEgPSAkUjEgKyAkeXIgKiAkUjM7Ci0JCSRHWTEgPSAkRzEgKyAkeWcgKiAkRzM7Ci0JCSRCWTEgPSAkQjEgKyAkeWIgKiAkQjM7Ci0KLQkJJFJZMiA9ICRSMiArICR5ciAqICRSNDsKLQkJJEdZMiA9ICRHMiArICR5ZyAqICRHNDsKLQkJJEJZMiA9ICRCMiArICR5YiAqICRCNDsKLQotCQlmb3IgKCR4ID0gMDsgJHggPCAkVzsgJHgrKykgewotCQkJIyR4ciA9ICR4ZyA9ICR4YiA9ICR4OwotCQkJIyR4ciA9ICRXIC0gJHhyIGlmICRSeDsKLQkJCSMkeGcgPSAkVyAtICR4ZyBpZiAkR3g7Ci0JCQkjJHhiID0gJFcgLSAkeGIgaWYgJEJ4OwotCQkJIyR4ciA9ICR4ciAqICRXaW52OwotCQkJIyR4ZyA9ICR4ZyAqICRXaW52OwotCQkJIyR4YiA9ICR4YiAqICRXaW52OwotCi0JCQkkbiA9IDMgKiAkeDsKLQotCQkJIyR2ID0gaW50KCRSMSArICR4ciokUjIgKyAkeXIqJFIzICsgJHhyKiR5ciokUjQpOwotCQkJJHYgID0gaW50KCRSWTEgKyAkWFskbl0qJFJZMik7Ci0JCQkkc3RyIC49ICRwWyR2XTsKLQotCQkJIyR2ID0gaW50KCRHMSArICR4ZyokRzIgKyAkeWcqJEczICsgJHhnKiR5ZyokRzQpOwotCQkJJHYgID0gaW50KCRHWTEgKyAkWFskbisxXSokR1kyKTsKLQkJCSRzdHIgLj0gJHBbJHZdOwotCi0JCQkjJHYgPSBpbnQoJEIxICsgJHhiKiRCMiArICR5YiokQjMgKyAkeGIqJHliKiRCNCk7Ci0JCQkkdiAgPSBpbnQoJEJZMSArICRYWyRuKzJdKiRCWTIpOwotCQkJJHN0ciAuPSAkcFskdl07Ci0KLQkJCSRzdHIgLj0gIlwwIjsKLQkJfQotCX0KLQlzZWVrKEZCLCAwLCAwKTsKLQlwcmludCBGQiAkc3RyOwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvcngxMXZuYyBiL3gxMXZuYy9taXNjL3J4MTF2bmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmOWM3OGIuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvcngxMXZuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgdXNhZ2U6IHJ4MTF2bmMgWy1zXSA8aG9zdD46PHhkaXNwbGF5PgotIyAgICAgICAgcngxMXZuYyBbLXNdIDxob3N0PiAgICAgICAgICAgIChhc3N1bWVzIHhkaXNwbGF5IGlzIDApCi0jCi0jIC1zIG1lYW5zIHVzZSBzc2ggaW5zdGVhZCBvZiByc2guCi0jIC1TIHRyaWVzIHRvIHR1bm5lbCB0aGUgdm5jIHRyYWZmaWMgdGhydSBzc2guICAoZXhwZXJpbWVudGFsLi4uKQotIwotI3NldCAteHYKLQotIwotIyBQbGFjZSB5b3VyIHgxMXZuYyBjbWQgKyBvcHRpb25zIGhlcmUgKG11c3QgaGF2ZSAtYmcgYW5kIC1kaXNwbGF5Ci0jIHdpdGggLWRpc3BsYXkgYXMgdGhlIGxhc3Qgb25lKQotIwotY21kPSJ4MTF2bmMgLW5hcCAtcSAtYmcgLWRpc3BsYXkiCi12aWV3ZXI9InZuY3ZpZXdlciIKLXJzaD1yc2gKLQotIwotIyBUaGUgZm9sbG93aW5nIHR3byBzZXR0aW5ncyBhcmUgb25seSB1c2VkIHVuZGVyIC1TIChzc2ggdHVubmVsKQotIwotIyBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHNldCB1cCB0aGUgc3NoIHBvcnQgcmVkaXJlY3Rpb24gKmJlZm9yZSoKLSMgeDExdm5jIGhhcyBzdGFydGVkIGFuZCBzZWxlY3RlZCBpdHMgbGlzdGVuaW5nIHBvcnQuCi0jIHR1bm5lbF9wb3J0cyBpcyBhIGxpc3Qgb2YgcG9ydHMgd2UgZXhwZWN0L2hvcGUgdG8gYmUgZnJlZSBvbiBib3RoCi0jIHRoZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzOgotIwotdHVubmVsX3BvcnRzPSI1OTAwIDU5MDEgNTkwMiA1OTAzIgotIwotIyBWTkMgaGFzIGEgcG9vciBkZWZhdWx0IGluIHRoYXQgaWYgdGhlIGNsaWVudCBhcHBlYXJzIHRvIGJlIGVtYW5hdGluZwotIyBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLCB0aGVuIHJhdyBlbmNvZGluZyBpcyBwcmVmZXJyZWQuICBXaXRoIHNzaCBwb3J0Ci0jIHJlZGlyZWN0aW9uIHdlIGFwcGVhciB0byBiZSBjb21pbmcgZnJvbSB0aGUgbG9jYWxob3N0LCBidXQgd2UgYXJlIG5vdC4KLSMgV2UgcGFzcyB0aGlzIGVuY29kaW5nIGxpc3QgdG8gdGhlIHZpZXdlciB0byBnaXZlIGxvd2VzdCBwcmVmZXJlbmNlIHRvCi0jIHJhdyBlbmNvZGluZzoKLSMKLXR1bm5lbF9lbmNvZGluZ3M9ImNvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZSB6bGliIGNvcnJlIHJyZSIKLQotaWYgWyAiJFVTRVIiID0gInJ1bmdlIiBdOyB0aGVuCi0JY21kPSJ4MTF2bmMuZXhwdCAtbmFwIC1xIC1iZyAtcmZiYXV0aCAudm5jL3Bhc3N3ZCAtZGlzcGxheSIKLQl2aWV3ZXI9InZuY3ZpZXdlcnoiCi1maQotCi1pZiBbICJYJDEiID0gIlgtcyIgXTsgdGhlbgotCXNoaWZ0Ci0JcnNoPXNzaAotZWxpZiBbICJYJDEiID0gIlgtUyIgXTsgdGhlbgotCXNoaWZ0Ci0JcnNoPXNzaAotCXR1bm5lbD0xCi0JY21kPWBlY2hvICIkY21kIiB8IHNlZCAtZSAncy8gLyAtbG9jYWxob3N0IC8nYAotZmkKLQotcmVtb3RlPSQxCi1pZiBlY2hvICIkcmVtb3RlIiB8IGdyZXAgJzonID4gL2Rldi9udWxsOyB0aGVuCi0JOgotZWxzZQotCXJlbW90ZT0iJHJlbW90ZTowIgotZmkKLQotaG9zdD1gZWNobyAiJHJlbW90ZSIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J2AgCi1kaXNwPWBlY2hvICIkcmVtb3RlIiB8IGF3ayAtRjogJ3twcmludCAkMn0nYCAKLWRpc3A9IjokZGlzcCIKLWlmIFsgIlgkaG9zdCIgPSAiWCIgXTsgdGhlbgotCWVjaG8gImJhZCBob3N0LiIKLQlleGl0IDEKLWZpCi0KLSMgc3RhcnQgdGhlIHJlbW90ZSB4MTF2bmM6Ci1pZiBbICR0dW5uZWwgXTsgdGhlbgotCSMgbXVjaCBtb3JlIGtsdWRneSBmb3IgdHVubmVsbGluZzoKLQl0bXA9L3RtcC9yeDExdm5jLiQkCi0JcmVkaXI9IiIKLQl1c2VkX3BvcnRzPWBuZXRzdGF0IC1hbiB8IGVncmVwICcoRVNUQUJMSVNIRUR8TElTVEVOKSAqJCcgXAotCSAgICB8IHNlZCAtZSAncy9eWyAJXSovLycgICAtZSAncy9edGNwWyAJMC05XVsgCTAtOV0qLy8nIFwKLQkgICAgICAgICAgLWUgJ3MvWyAJXS4qJC8vJyAtZSAncy9eLipbXjAtOV0vLycgfCBzb3J0IC1udWAKLQlmb3IgcCBpbiAkdHVubmVsX3BvcnRzCi0JZG8KLQkJb2s9MQotCQlmb3IgdSBpbiAkdXNlZF9wb3J0cwotCQlkbwotCQkJaWYgWyAiWCRwIiA9ICJYJHUiIF07IHRoZW4KLQkJCQllY2hvICJwb3J0ICR1IGlzIGluIHVzZS4gc2tpcHBpbmcgaXQiCi0JCQkJb2s9Ci0JCQkJYnJlYWsKLQkJCWZpCi0JCWRvbmUKLQkJaWYgWyAkb2sgXTsgdGhlbgotCQkJcmVkaXI9IiRyZWRpciAtTCAkcDpsb2NhbGhvc3Q6JHAiCi0JCWZpCi0JZG9uZQotCSMKLQkjIEhhdmUgc3NoIHB1dCB0aGUgY29tbWFuZCBpbiB0aGUgYmcsIHRoZW4gd2UgbG9vayBmb3IgUE9SVD0KLQkjIGluIHRoZSB0bXAgZmlsZS4gIFRoZSBzbGVlcCBhdCB0aGUgZW5kIGlzIHRvIGdpdmUgdXMgZW5vdWdoCi0JIyB0aW1lIHRvIGNvbm5lY3QgdGhydSB0aGUgcG9ydCByZWRpciwgb3RoZXJ3aXNlIHNzaCB3aWxsIGV4aXQKLQkjIGJlZm9yZSB3ZSBjYW4gY29ubmVjdC4KLQkjCi0JdGltZT0xNQotCSRyc2ggLXQgLWYgJHJlZGlyICRob3N0ICIkY21kICRkaXNwOyBlY2hvIEVORDsgc2xlZXAgJHRpbWUiID4gJHRtcAotCi0JaT0wCi0Jd2hpbGUgWyAkaSAtbHQgJHRpbWUgXQotCWRvCi0JCXNsZWVwIDEKLQkJaWYgZ3JlcCAnXlBPUlQ9JyAkdG1wID4gL2Rldi9udWxsOyB0aGVuCi0JCQlwb3J0PWBncmVwICdeUE9SVD0nICR0bXAgfCBzZWQgLWUgJ3MvUE9SVD0vLydgCi0JCQlpZiBbICJYJHBvcnQiICE9ICJYIiBdOyB0aGVuCi0JCQkJYnJlYWsKLQkJCWZpCi0JCWZpCi0JCWk9YGV4cHIgJGkgKyAxYAotCWRvbmUKLQljYXQgJHRtcAotCXJtIC1mICR0bXAKLWVsc2UKLQlwb3J0PWAkcnNoICRob3N0ICIkY21kICRkaXNwIiB8IGdyZXAgJ15QT1JUPScgfCBzZWQgLWUgJ3MvUE9SVD0vLydgCi1maQotCi1lY2hvICJ4MTF2bmMgcG9ydCBpcyAnJHBvcnQnIgotCi0jIG5vdyBzdGFydCB1cCB0aGUgdmlld2VyIG9uIHRoaXMgZW5kOgotaWYgZWNobyAiJHBvcnQiIHwgZ3JlcCAnXlswLTldWzAtOV0qJCcgPiAvZGV2L251bGw7IHRoZW4KLQlpZiBbICRwb3J0IC1sdCA2MDAwIC1hICRwb3J0IC1nZSA1OTAwIF07IHRoZW4KLQkJIyB2bmN2aWV3ZXIgc3BlY2lhbCBjYXNlcyAwLTk5Ci0JCXBvcnQ9YGV4cHIgJHBvcnQgLSA1OTAwYCAKLQlmaQotCWlmIFsgJHR1bm5lbCBdOyB0aGVuCi0JCSR2aWV3ZXIgLWVuY29kaW5ncyAiJHR1bm5lbF9lbmNvZGluZ3MiICJsb2NhbGhvc3Q6JHBvcnQiCi0JZWxzZQotCQkkdmlld2VyICIkaG9zdDokcG9ydCIKLQlmaQotZWxzZQotCWVjaG8gImJhZCBwb3J0LiIKLQlleGl0IDEKLWZpCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy9yeDExdm5jLnBsIGIveDExdm5jL21pc2MvcngxMXZuYy5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZhYjBhMS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy9yeDExdm5jLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLSAgIyEvYmluL3NoIC0tICMgQSBjb21tZW50IG1lbnRpb25pbmcgcGVybAotZXZhbCAnZXhlYyBwZXJsIC1TICQwICR7MSsiJEAifScKLSAgICAgICAgaWYgMDsKLSMKLSMgSGVyZSBpcyB0aGUgcmVtb3RlIHgxMXZuYyBjb21tYW5kLgotIyBNb2RpZnkgdG8geW91ciBuZWVkcywgcmVxdWlyZWQgdG8gaGF2ZSAlRElTUCBpdGVtIHRoYXQgZXhwYW5kcyB0byBYIGRpc3BsYXkKLSMgYW5kIHRoZSAtYmcgb3B0aW9uIHRvIGdvIGludG8gdGhlIGJhY2tncm91bmQuCi0jCi0keDExdm5jX2NtZCA9ICJ4MTF2bmMgLWxvY2FsaG9zdCAtbmFwIC1xIC1iZyAtZGlzcGxheSAlRElTUCI7Ci0KLSMKLSMgV2Ugd2lsbCByZWRpciBsb2NhbCBwb3J0cyB0byB0aGVzZSByZW1vdGUgcG9ydHMgaG9waW5nIHRoZSByZW1vdGUKLSMgeDExdm5jIHNlbGVjdHMgb25lIG9mIHRoZW06Ci0jCi1AdHVubmVsX3BvcnRzID0gcXcoNTkwMCA1OTAxIDU5MDIgNTkwMyA1OTA0KTsKLQotIwotIyBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlIGVuY29kaW5nIHByZWZlcmVuY2VzIHNpbmNlIHZuY3ZpZXdlciB3aWxsCi0jIG1pc3Rha2VuaW5nbHkgcHJlZmVyICJyYXciIGVuY29kaW5nIGZvciBsb2NhbCBjb25uZWN0aW9uLiAgcmVxdWlyZWQgdG8KLSMgaGF2ZSAlVk5DX0lURU0gdG8gZXhwYW5kIHRvIGxvY2FsaG9zdDo8cG9ydD4KLQotIyBPbmUgcmVhbGx5IG5lZWRzIGFuIC1lbmNvZGluZ3Mgb3B0aW9uIG90aGVyd2lzZSB0aGUgdm5jdmlld2VyIHdpbGwKLSMgcHJlZmVyICdyYXcnIHdoaWNoIGlzIHZlcnkgc2xvdy4KLSMKLSR2aWV3ZXJfY21kID0gInZuY3ZpZXdlciAtZW5jb2RpbmdzICdjb3B5cmVjdCB0aWdodCB6cmxlIGhleHRpbGUgemxpYiBjb3JyZSBycmUnICVWTkNfRElTUCI7Ci0kc2xlZXBfdGltZSA9IDE1OwotCi1pZiAoJEVOVntVU0VSfSBlcSAncnVuZ2UnKSB7Ci0JIyBteSBwZXJzb25hbCBrbHVkZ2VzOgotCSR2aWV3ZXJfY21kID1+IHMvdm5jdmlld2VyL3ZuY3ZpZXdlcnovOwkjIGZvciB0aWdodAotCSR4MTF2bmNfY21kIC49ICcgLXJmYmF1dGggLnZuYy9wYXNzd2QnOwkjIEkgYWx3YXlzIHdhbnQgcmZiYXV0aAotfQotCi1jaG9wKCRQcm9ncmFtID0gYGJhc2VuYW1lICQwYCk7Ci0KLSRVc2FnZSA9IDw8IkVORCI7Ci0KLSRQcm9ncmFtOiB3cmFwcGVyIHRvIHR1bm5lbCB2bmN2aWV3ZXIgPC0+IHgxMXZuYyBWTkMgdHJhZmZpYyB0aHJvdWdoIGEgc3NoCi0JZW5jcnlwdGVkIHR1bm5lbCBwb3J0IHJlZGlyZWN0aW9uLgotCi1Vc2FnZTogJFByb2dyYW0gPG9wdGlvbnM+IDxyZW1vdGUtWGRpc3BsYXk+Ci0KLU9wdGlvbnM6Ci0JLWwgPHVzZXI+CQkJc3NoIGxvZ2luIGFzIHJlbW90ZSB1c2VyIDx1c2VyPgotCi0JLXJmYmF1dGggPHJlbW90ZS1hdXRoLWZpbGU+CXRoaXMgb3B0aW9uIGlzIHBhc3NlZCB0byB0aGUgcmVtb3RlCi0JCQkJCXgxMXZuYyBjb21tYW5kIGZvciBwYXNzd2QgZmlsZS4KLQotTm90ZXM6Ci0KLUV4YW1wbGU6ICRQcm9ncmFtIHNub29weTowCi0KLUVORAotCi1MT09QOgkKLXdoaWxlIChAQVJHVikgewotICAgICRfID0gc2hpZnQ7Ci0gICAgQ0FTRTogewotCS9eLWRpc3BsYXkkLyAmJiAoJHJlbW90ZV94ZGlzcGxheSA9IHNoaWZ0LCBsYXN0IENBU0UpOwotCS9eLXJmYmF1dGgkLyAmJiAoJHgxMXZuY19jbWQgLj0gJyAtcmZiYXV0aCAnIC4gc2hpZnQsIGxhc3QgQ0FTRSk7Ci0JL14tbCQvICYmICgkcmVtb3RlX3VzZXIgPSAnIC1sICcgLiBzaGlmdCwgbGFzdCBDQVNFKTsKLQkvXi0tJC8gJiYgKGxhc3QgTE9PUCk7CSMgLS0gbWVhbnMgZW5kIG9mIHN3aXRjaGVzCi0JL14tKC0uKikkLyAmJiAodW5zaGlmdChAQVJHViwgJDEpLCBsYXN0IENBU0UpOwotCS9eKC1ofC1oZWxwKSQvICYmICgocHJpbnQgU1RET1VUICRVc2FnZSksIGV4aXQgMCwgbGFzdCBDQVNFKTsKLQlpZiAoIC9eLSguLispJC8gKSB7CSMgc3BsaXQgYnVuZGxlZCBzd2l0Y2hlczoKLQkJbG9jYWwoJHksICR4KSA9ICgkMSwgJycpOwotCQkodW5zaGlmdChAQVJHViwgJHkpLCBsYXN0IENBU0UpIGlmICR5ID1+IC9eLS87Ci0JCWZvcmVhY2ggJHggKHJldmVyc2Uoc3BsaXQoLy8sICR5KSkpIHsgdW5zaGlmdChAQVJHViwiLSR4IikgfTsKLQkJbGFzdCBDQVNFOwotCX0KLQkvXi0vICYmICgocHJpbnQgU1RERVJSICJJbnZhbGlkIGFyZzogJF9cbiRVc2FnZSIpLCBleGl0IDEsIGxhc3QgQ0FTRSk7Ci0JdW5zaGlmdChAQVJHViwkXyk7Ci0JbGFzdCBMT09QOwotICAgIH0KLX0KLQotc2VsZWN0KFNUREVSUik7ICR8ID0gMTsKLXNlbGVjdChTVERPVVQpOyAkfCA9IDE7Ci0KLSMgRGV0ZXJtaW5lIHRoZSByZW1vdGUgWCBkaXNwbGF5IHRvIGNvbm5lY3QgdG86Ci0kcmVtb3RlX3hkaXNwbGF5ID0gc2hpZnQgaWYgJHJlbW90ZV94ZGlzcGxheSBlcSAnJzsKLWlmICgkcmVtb3RlX3hkaXNwbGF5ICF+IC86LykgewotCSRyZW1vdGVfeGRpc3BsYXkgLj0gJzowJzsJIyBhc3N1bWUgdGhleSBtZWFuIDowIG92ZXIgdGhlcmUuCi19Ci1pZiAoJHJlbW90ZV94ZGlzcGxheSA9fiAvOi8pIHsKLQkkaG9zdCA9ICRgOwotCSRkaXNwID0gJzonIC4gJCc7Ci19IGVsc2UgewotCWRpZSAiYmFkIFggZGlzcGxheTogJHJlbW90ZV94ZGlzcGxheSwgbXVzdCBiZSA8aG9zdD46PGRpc3BsYXk+XG4iOwotfQotCi0jCi0jIEdldCBsaXN0IG9mIGxvY2FsIHBvcnRzIGluIHVzZSBzbyB3ZSBjYW4gYXZvaWQgdGhlbTogCi0jICh0ZXN0ZWQgb24gTGludXggYW5kIFNvbGFyaXMpCi0jCi1vcGVuKE5FVFNUQVQsICJuZXRzdGF0IC1hbnwiKSB8fCBkaWUgIm5ldHN0YXQgLWFuOiAkISI7Ci13aGlsZSAoPE5FVFNUQVQ+KSB7Ci0JY2hvbXAgKCRsaW5lID0gJF8pOwotCW5leHQgdW5sZXNzICRsaW5lID1+IC8oRVNUQUJMSVNIRUR8TElTVEVOfFdBSVQyPylccyokLzsKLQkkbGluZSA9fiBzL15ccyovLzsKLQkkbGluZSA9fiBzL150Y3BbXHNcZF0qLy87Ci0JJGxpbmUgPX4gcy9ccy4qJC8vOwotCSRsaW5lID1+IHMvXi4qXEQvLzsKLQlpZiAoJGxpbmUgIX4gL15cZCskLykgewotCQlkaWUgImJhZCBuZXRzdGF0IGxpbmU6ICRsaW5lIGZyb20gJF8iOyAKLQl9Ci0JJHVzZWRfcG9ydHskbGluZX0gPSAxOwotfQotY2xvc2UoTkVUU1RBVCk7Ci0KLSMKLSMgTm93IG1hdGNoIHVwIGZyZWUgbG9jYWwgcG9ydHMgd2l0aCB0aGUgZGVzaXJlZCByZW1vdGUgcG9ydHMKLSMgKG5vdGUgdGhhdCB0aGUgcmVtb3RlIG9uZXMgY291bGQgYmUgaW4gdXNlIGJ1dCB0aGF0IHdvbid0IHN0b3AKLSMgdGhlIHNzaCB3aXRoIHBvcnQgcmVkaXJzIGZyb20gc3VjY2VlZGluZykKLSMKLSRscG9ydCA9IDU5MDA7Ci0kY250ID0gMDsKLWZvcmVhY2ggJHJwb3J0IChAdHVubmVsX3BvcnRzKSB7Ci0Jd2hpbGUgKCR1c2VkX3BvcnR7JGxwb3J0fSkgewotCQkkbHBvcnQrKzsKLQkJJGNudCsrOwotCQlkaWUgInRvbyBoYXJkIHRvIGZpbmQgbG9jYWwgcG9ydHMgNTkwMC0kbHBvcnQiIGlmICRjbnQgPiAyMDA7Ci0JfQotCSRwb3J0X21hcHskcnBvcnR9ID0gJGxwb3J0OwotCSRscG9ydCsrOwotfQotCi0kcmVkaXIgPSAnJzsKLWZvcmVhY2ggJHJwb3J0IChAdHVubmVsX3BvcnRzKSB7Ci0JJHJlZGlyIC49ICIgLUwgJHBvcnRfbWFweyRycG9ydH06bG9jYWxob3N0OiRycG9ydCI7Ci19Ci0KLSMKLSMgSGF2ZSBzc2ggcHV0IHRoZSBjb21tYW5kIGluIHRoZSBiZywgdGhlbiB3ZSBsb29rIGZvciBQT1JUPSBpbiB0aGUKLSMgdG1wIGZpbGUuICBUaGUgc2xlZXAgYXQgdGhlIGVuZCBpcyB0byBnaXZlIHVzIGVub3VnaCB0aW1lIHRvIGNvbm5lY3QKLSMgdGhydSB0aGUgcG9ydCByZWRpciwgb3RoZXJ3aXNlIHNzaCB3aWxsIGV4aXQgYmVmb3JlIHdlIGNhbiBjb25uZWN0LgotIwotCi0jIFRoaXMgaXMgdGhlIHgxMXZuYyBjbWQgZm9yIHRoZSByZW1vdGUgc2lkZToKLSRjbWQgPSAkeDExdm5jX2NtZDsKLSRjbWQgPX4gcy8lRElTUC8kZGlzcC87Ci0KLSMgVGhpcyBpcyB0aGUgc3NoIGNtZCBmb3IgdGhlIGxvY2FsIHNpZGUgKHRoaXMgbWFjaGluZSk6Ci0kc3NoX2NtZCA9ICJzc2ggLXQgLWYgJHJlbW90ZV91c2VyICRyZWRpciAkaG9zdCAnJGNtZDsgZWNobyBFTkQ7IHNsZWVwICRzbGVlcF90aW1lJyI7Ci0kc3NoX2NtZCA9fiBzLyAgLyAvZzsKLXByaW50IFNUREVSUiAicnVubmluZyBzc2ggY29tbWFuZDpcblxuJHNzaF9jbWRcblxuIjsKLQotIwotIyBSdW4gc3NoIGFuZCByZWRpciBpbnRvIGEgdG1wIGZpbGUgKGFzc3VtZXMgc3NoIHdpbGwgdXNlIC9kZXYvdHR5Ci0jIGZvciBwYXNzd29yZC9wYXNzcGhyYXNlIGRpYWxvZykKLSMKLSR0bXAgPSAiL3RtcC9yeC4kJCI7Ci1zeXN0ZW0oIiRzc2hfY21kID4gJHRtcCIpOwotCi0jIE5vdyB3YXRjaCBmb3IgdGhlIFBPUlQ9WFhYWCBtZXNzYWdlOgotJHNsZWVwID0gMDsKLSRycG9ydCA9ICcnOwotcHJpbnQgU1RERVJSICJcbldhaXRpbmcgZm9yIHgxMXZuYyB0byBpbmRpY2F0ZSBpdHMgcG9ydCAuLiI7Ci13aGlsZSAoJHNsZWVwIDwgJHNsZWVwX3RpbWUgKyAxMCkgewotCXByaW50IFNUREVSUiAiLiI7Ci0Jc2xlZXAoMSk7Ci0JJHNsZWVwKys7Ci0JaWYgKGBjYXQgJHRtcGAgPX4gL1BPUlQ9KFxkKykvKSB7Ci0JCSRycG9ydCA9ICQxOwotCQkjIHdhaXQgMSBtb3JlIHNlY29uZCBmb3Igb3V0cHV0OgotCQlzbGVlcCgxKTsKLQkJaWYgKGBjYXQgJHRtcGAgPX4gL1BPUlQ9KFxkKykvKSB7Ci0JCQkkcnBvcnQgPSAkMTsKLQkJfQotCQlsYXN0OwotCX0KLX0KLXByaW50IFNUREVSUiAiXG4iOwotCi1pZiAoISAkcnBvcnQpIHsKLQlwcmludCBTVERFUlIgYGNhdCAkdG1wYDsKLQl1bmxpbmsoJHRtcCk7Ci0JZGllICJjb3VsZCBub3QgZGV0ZXJtaW5lIHJlbW90ZSBwb3J0LlxuIjsKLX0KLXVubGluaygkdG1wKTsKLQotIyBGaW5kIHRoZSByZW1vdGUgdG8gbG9jYWwgbWFwcGluZzoKLSRscG9ydCA9ICRwb3J0X21hcHskcnBvcnR9OwotcHJpbnQgU1RERVJSICJyZW1vdGUgcG9ydCBpczogJHJwb3J0IChjb3JyZXNwb25kcyB0byBwb3J0ICRscG9ydCBoZXJlKVxuIjsKLWlmICghICRscG9ydCkgewotCWRpZSAiY291bGQgbm90IGRldGVybWluZSBsb2NhbCBwb3J0IHJlZGlyLlxuIjsKLX0KLQotIyBBcHBseSB0aGUgc3BlY2lhbCBjYXNpbmcgdm5jdmlld2VyIGRvZXMgZm9yIDU5MDAgPD0gcG9ydCA8IDYwMDAKLWlmICgkbHBvcnQgPCA2MDAwICYmICRscG9ydCA+PSA1OTAwKSB7Ci0JJGxwb3J0ID0gJGxwb3J0IC0gNTkwMDsKLX0KLQotIyBGaW5hbGx5LCBydW4gdGhlIHZpZXdlci4KLSRjbWQgPSAkdmlld2VyX2NtZDsKLSRjbWQgPX4gcy8lVk5DX0RJU1AvbG9jYWxob3N0OiRscG9ydC87Ci0KLXByaW50IFNUREVSUiAicnVubmluZyB2bmN2aWV3ZXIgY29tbWFuZDpcblxuJGNtZFxuXG4iOwotc3lzdGVtKCRjbWQpOwpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2Mvc2htX2NsZWFyIGIveDExdm5jL21pc2Mvc2htX2NsZWFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNmQ1Y2I2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3NobV9jbGVhcgorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBzaG1fY2xlYXI6IGNsZWFuIG91dCB1bmF0dGFjaGVkIChOQVRUQUNIPTApIHNobSBzZWdtZW50cy4KLSMgU2VlIGlwY3MoMSkgYW5kIGlwY3JtKDEpLiAgVGVzdGVkIG9uIExpbnV4IGFuZCBTb2xhcmlzLgotIwotIyBVc2FnZToKLSMgICAgc2htX2NsZWFyICAgICAgbGlzdCBhbmQgcHJvbXB0IGZvciByZW1vdmFsIG9mIHlvdXIgdW5hdHRhY2hlZCBzaG0gc2VnbWVudHMuCi0jICAgIHNobV9jbGVhciAteSAgIGFzc3VtZSAieWVzIiB0byBhbGwgdGhlIHJlbW92YWwgcHJvbXB0cy4KLSMgICAgc2htX2NsZWFyIC1sICAgb25seSBsaXN0IChhbGwgb2YpIHlvdXIgc2htIHNlZ21lbnRzIGFuZCBleGl0LgotIwotCi0jc2V0IC14dgotaWYgZWNobyAiJDEiIHwgZ3JlcCAnXi1oJyA+IC9kZXYvbnVsbDsgdGhlbgotCSMgLWggb3IgLWhlbHAgCi0JdGFpbCArMyAkMCB8IGhlYWQgLTkKLQlleGl0Ci1maQotCi1pZiBbICJYJFVTRVIiID0gIlgiIF07IHRoZW4KLQlVU0VSPSRMT0dOQU1FCi1maQotbF9hcmc9InNobWlkLipvd25lcnxDUkVBVE9SfCRVU0VSIgotCi0jIHNldCB1cCBPUyBkZXBlbmRlbnQgY21kbGluZSBvcHRzLCBldGMuCi1pZiBbIGB1bmFtZWAgPSAiTGludXgiIF07IHRoZW4KLQltX2FyZz0iLW0iCi0Jcl9hcmc9InNobSIKLQlnX2FyZz0iXjB4IgotCXNfY21kPSJpcGNzICRtX2FyZyAtaSAlSUQiCi0JYXdrY3V0PSd7cHJpbnQgJDIsICQ2fScKLWVsaWYgWyBgdW5hbWVgID0gIlN1bk9TIiBdOyB0aGVuCi0JbV9hcmc9Ii1tYSIKLQlyX2FyZz0iLW0iCi0JZ19hcmc9Il5tIgotCXNfY21kPSJpcGNzICRtX2FyZyB8IGVncmVwICcgICVJRCAgfENSRUFUT1InIHwgZ3JlcCAtdiBJUEMuc3RhdHVzIgotCWF3a2N1dD0ne3ByaW50ICQyLCAkOX0nCi1lbHNlCi0JZWNobyB1bnN1cHBvcnRlZCBPUzogYHVuYW1lYAotCWV4aXQgMQotZmkKLQotbGlzdCgpIHsKLQlpZiBbICJYJDEiID0gIlgtTCIgXTsgdGhlbgotCQlsX2FyZz0iJGxfYXJnfC4iCi0JCWVjaG8gIkFsbCBzaG0gc2VnbWVudHMgZm9yIGFsbDoiCi0JZWxzZQotCQllY2hvICJBbGwgc2htIHNlZ21lbnRzIGZvciAkVVNFUjoiCi0JZmkKLQlpcGNzICRtX2FyZyB8IGVncmVwICIkbF9hcmciCi0JZWNobwotfQotCi1zaG93KCkgewotCWNtZD1gZWNobyAiJHNfY21kIiB8IHNlZCAtZSAicy8lSUQvJDEvZyJgCi0JZXZhbCAkY21kCi19Ci0KLXJlbW92ZSgpIHsKLQllY2hvIGlwY3JtICRyX2FyZyAkMQotCSAgICAgaXBjcm0gJHJfYXJnICQxCi19Ci0KLWlmIFsgIlgkMSIgPSAiWC1sIiAtbyAiWCQxIiA9ICJYLUwiIF07IHRoZW4KLQkjIGxpc3Qgb25seS4gIGJvdGggYXR0YWNoZWQgYW5kIHVuYXR0YWNoZWQgbGlzdGVkLgotCWxpc3QgJDEKLQlleGl0IDAKLWZpCi0KLWlmIFsgIlgkMSIgPSAiWC15IiBdOyB0aGVuCi0Jc2hpZnQKLQl5ZXM9MQkjIGFzc3VtZSAieWVzIiB0byBhbGwgZGVsZXRlIHF1ZXN0aW9ucy4KLWVsc2UKLQl5ZXM9IiIKLWZpCi0KLWxpc3QKLQotaWRzPWBpcGNzICRtX2FyZyB8IGdyZXAgIiRnX2FyZyIgfCBncmVwICRVU0VSIHwgYXdrICIkYXdrY3V0IiB8IGdyZXAgJyAwJCcgfCBhd2sgJ3twcmludCAkMX0nYAotaWYgWyAiWCRpZHMiID0gIlgiIF07IHRoZW4KLQllY2hvICJObyB1bmF0dGFjaGVkIHNobWlkcyBmb3IgJFVTRVIuIgotZmkKLQotZm9yIGlkIGluICRpZHMgCi1kbwotCWlmIFsgJHllcyBdOyB0aGVuCi0JCToKLQllbHNlCi0JCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JCXNob3cgJGlkCi0JCXByaW50ZiAiXG5EZWxldGU/IFt5XS9uICIKLQkJcmVhZCB4Ci0JCWlmIGVjaG8gIiR4IiB8IGdyZXAgLWkgbiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUKLQkJZmkKLQlmaQotCXJlbW92ZSAkaWQKLWRvbmUKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL3NsaWRlLnBsIGIveDExdm5jL21pc2Mvc2xpZGUucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4ZjI4NGUuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2Mvc2xpZGUucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotICAjIS9iaW4vc2ggLS0gIyBBIGNvbW1lbnQgbWVudGlvbmluZyBwZXJsCi1ldmFsICdleGVjIHBlcmwgLVMgJDAgJHsxKyIkQCJ9JwotICAgICAgICBpZiAwOwotIwotIyBzbGlkZS5wbDogYW11c2luZyBleGFtcGxlIHNsaWRlc2hvdyBwcm9ncmFtIGZvciB1c2Ugd2l0aCB4MTF2bmMgLXJhd2ZiIG1vZGUuCi0jCi0jIEUuZy4geDExdm5jIC1yYXdmYiBtYXA6L3RtcC9mb29ANjQweDQ4MHgzMjpmZi9mZjAwL2ZmMDAwMCAtcGlwZWlucHV0IHNsaWRlLnBsCi0jCi0jIHJlcXVpcmVzOiBqcGVndG9wbm0oMSksIChtYXliZSBMU0IgdG9vKS4KLSMKLQotQGpwZWdzID0gcXcoCi0JZHJfZnVuX25ldy5qcGcJY2Fub24uanBnCWdvX21pY3Jvc29mdC5qcGcJam9uYXRoYW4yLmpwZwotCW1pY2hlbGxlMS5qcGcJbm92bS5qcGcJcGhvdG8tMDA4LmpwZwkJcHJlc3JhbmdlLmpwZwotKTsKLQotIyBPcjoKLSMJQGpwZWdzID0gQEFSR1Y7Ci0jCUBqcGVncyA9IDwqLmpwZz47Ci0KLSMgdGhpcyBpcyB4MTF2bmMncyAtcmF3ZmIgdmFsdWU6Ci1pZiAoJEVOVntYMTFWTkNfUkFXRkJfU1RSfSA9fiBtLDooLiopQChcZCspeChcZCspeChcZCspLCkgewotCSRmYiA9ICQxOwkjIGZpbGVuYW1lCi0JJFcgPSAkMjsJIyB3aWR0aAotCSRIID0gJDM7CSMgaGVpZ2h0Ci19IGVsc2UgewotCWRpZSAiTm8gdXNhYmxlIFgxMVZOQ19SQVdGQl9TVFJcbiI7Ci19Ci0KLW9wZW4oRkIsICI+JGZiIikgfHwgZGllICIkISI7Ci0KLSMgbWFrZSBhIHNvbGlkIGJhY2tncm91bmQ6Ci0kb25lcyA9ICJcMzc3IiB4ICgkVyAqIDQpOwotJGdyZXkgPSAiXDM0MCIgeCAoJFcgKiA0KTsKLWZvciAoJHkgPSAwOyAkeSA8ICRIOyAkeSsrKSB7Ci0JcHJpbnQgRkIgJGdyZXk7Ci19Ci0KLSMgdGhpcyBpcyByYXRoZXIgc2xvdyB3aXRoIG1hbnkganBlZ3MuLi4gb2ggd2VsbC4KLWZvcmVhY2ggJHBpYyAoQGpwZWdzKSB7Ci0JcHJpbnQgU1RERVJSICJsb2FkaW5nICckcGljJwlwbGVhc2Ugd2FpdCAuLi5cbiI7IAotCW9wZW4oSlBFRywgImpwZWd0b3BubSAnJHBpYycgMj4vZGV2L251bGx8IikgfHwgZGllICIkISI7Ci0Jd2hpbGUgKDxKUEVHPikgewotCQluZXh0IGlmIC9eUFxkLzsKLQkJaWYgKC9eKFxkKylccysoXGQrKVxzKiQvKSB7Ci0JCQkkSnBlZ3skcGljfXt3fSA9ICQxOwotCQkJJEpwZWd7JHBpY317aH0gPSAkMjsKLQkJfQotCQlsYXN0IGlmIC9eMjU1JC87Ci0JfQotCSRkYXRhID0gJyc7Ci0Jd2hpbGUgKDxKUEVHPikgewotCQkkZGF0YSAuPSAkXzsKLQl9Ci0JY2xvc2UoSlBFRyk7Ci0KLQkjIG5lZWQgdG8gcHV0IGluIGEgNHRoIDAgYnl0ZSBhZnRlciBSR0IgZm9yIDMyYnBwLiAyNGJwcCBkb2Vzbid0IHdvcmsuCi0JIyAoTVNCIG1pZ2h0IGJlIG90aGVyIHdheSBhcm91bmQpLgotCi0JJG5ldyA9ICcnOwotCWZvciAoJGwgPSAwOyAkbCA8IGludChsZW5ndGgoJGRhdGEpLzMpOyAkbCsrKSB7Ci0JCSRuZXcgLj0gc3Vic3RyKCRkYXRhLCAkbCAqIDMsIDMpIC4gIlwwIjsKLQl9Ci0JJEpwZWd7JHBpY317ZGF0YX0gPSAkbmV3OwotCSRkYXRhID0gJyc7ICRuZXcgPSAnJzsKLQotCWlmICgkcGljIGVxICRqcGVnc1swXSkgewotCQlzaG93cGljKDApOwotCX0KLX0KLQotJE4gPSBzY2FsYXIoQGpwZWdzKTsKLXByaW50IFNUREVSUiAiXG5GaW5pc2hlZCBsb2FkaW5nICROIGltYWdlcy4gQ2xpY2sgQnV0dG9uIG9yIFNwYWNlYmFyIGZvciBuZXh0LlxuIjsKLSRJID0gMDsKLQotd2hpbGUgKDw+KSB7Ci0JIyByZWFkIHRoZSBuZXh0IHVzZXIgaW5wdXQgZXZlbnQsIHdhdGNoIGZvciBidXR0b24gcHJlc3Mgb3Igc3BhY2ViYXI6Ci0JIyMjbGFzdCBpZiAvXktleXN5bS4qIFtxUV0gLzsKLQluZXh0IHVubGVzcyAvXihQb2ludGVyLipCdXR0b25QcmVzc3xLZXlzeW0uKnNwYWNlLipLZXlQcmVzcykvOwotCSRJID0gKCRJICsgMSkgJSAkTjsKLQlzaG93cGljKCRJKTsKLX0KLQotc3ViIHNob3dwaWMgewotCW15KCRpKSA9IEBfOwotCi0JbXkgJHBpYyA9ICRqcGVnc1skaV07Ci0JbXkgJGggPSAkSnBlZ3skcGljfXtofTsKLQlteSAkdyA9ICRKcGVneyRwaWN9e3d9OwotCi0JbXkgJGR5ID0gaW50KCgkSCAtICRoKS8yKTsKLQlteSAkZHggPSBpbnQoKCRXIC0gJHcpLzIpOwotCi0JcHJpbnQgU1RERVJSICJzaG93aW5nIHBpYyAkaTogJHBpY1x0JHcgeCAkaCArJGR5KyRkeFxuIjsKLQotCSMgY2xlYXIgc2NyZWVuOgotCXNlZWsoRkIsIDAsIDApOwotCWZvciAoJHkgPSAwOyAkeSA8ICRIOyAkeSsrKSB7Ci0JCXByaW50IEZCICRvbmVzOwotCX0KLQotCSMgaW5zZXJ0IG5ldyBwaWN0dXJlOgotCWZvciAoJHkgPSAwOyAkeSA8ICRoOyAkeSsrKSB7Ci0JCXNlZWsoRkIsICgoJHkgKyAkZHkpICogJFcgKyAkZHgpICogNCwgMCk7Ci0JCSRsaW5lID0gc3Vic3RyKCRKcGVneyRwaWN9e2RhdGF9LCAkeSAqICR3ICogNCwgJHcgKiA0KTsKLQkJcHJpbnQgRkIgJGxpbmU7Ci0JfQotfQotCi1jbG9zZShGQik7Ci0jIyN1bmxpbmsoJGZiKTsJIyB0aGlzIChwcm9iYWJseSkgd29uJ3Qga2lsbCB4MTF2bmMKLXByaW50IFNUREVSUiAiJDAgZG9uZS5cbiI7CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy90dXJib3ZuYy9NYWtlZmlsZS5hbSBiL3gxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZlZGM2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRoaXMgZmlsZSBoYXMgYmVlbiAob3IgaXMgaGVyZWJ5KSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluIGJ5Ci0jIGl0cyBhdXRob3IsIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+LiBUaGlzIGFwcGxpZXMgd29ybGR3aWRlLgotIyAKLSMgSW4gY2FzZSB0aGlzIGlzIG5vdCBsZWdhbGx5IHBvc3NpYmxlOiBLYXJsIEouIFJ1bmdlIGdyYW50cyBhbnlvbmUgdGhlCi0jIHJpZ2h0IHRvIHVzZSB0aGlzIHdvcmsgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGFueSBjb25kaXRpb25zLCB1bmxlc3MKLSMgc3VjaCBjb25kaXRpb25zIGFyZSByZXF1aXJlZCBieSBsYXcuCi0KLUVYVFJBX0RJU1Q9UkVBRE1FIGFwcGx5X3R1cmJvdm5jIGNvbnZlcnQgY29udmVydF9yZmJzZXJ2ZXIgdGlnaHQuYyB0dXJib2pwZWcuaCB1bmRvX3R1cmJvdm5jCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy90dXJib3ZuYy9NYWtlZmlsZS5pbiBiL3gxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFiYmNkLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuNiBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotIyBUaGlzIGZpbGUgaGFzIGJlZW4gKG9yIGlzIGhlcmVieSkgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieQotIyBpdHMgYXV0aG9yLCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPi4gVGhpcyBhcHBsaWVzIHdvcmxkd2lkZS4KLSMgCi0jIEluIGNhc2UgdGhpcyBpcyBub3QgbGVnYWxseSBwb3NzaWJsZTogS2FybCBKLiBSdW5nZSBncmFudHMgYW55b25lIHRoZQotIyByaWdodCB0byB1c2UgdGhpcyB3b3JrIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBhbnkgY29uZGl0aW9ucywgdW5sZXNzCi0jIHN1Y2ggY29uZGl0aW9ucyBhcmUgcmVxdWlyZWQgYnkgbGF3LgotVlBBVEggPSBAc3JjZGlyQAotYW1fX21ha2VfZHJ5cnVuID0gXAotICB7IFwKLSAgICBhbV9fZHJ5PW5vOyBcCi0gICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCi0gICAgICAqXFxbXCBcCV0qKSBcCi0gICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCi0gICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKLSAgICAgICopIFwKLSAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKLSAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCi0gICAgICAgICAgICAqPSp8LS0qKSA7OyBcCi0gICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKLSAgICAgICAgICBlc2FjOyBcCi0gICAgICAgIGRvbmU7OyBcCi0gICAgZXNhYzsgXAotICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCi0gIH0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXN1YmRpciA9IHgxMXZuYy9taXNjL3R1cmJvdm5jCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3JmYmNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLUFNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQotYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQotYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOwotQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQotYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKLWFtX192X2F0XzAgPSBACi1TT1VSQ0VTID0KLURJU1RfU09VUkNFUyA9Ci1hbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKLSAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCi0gICAgbnxub3xOTykgZmFsc2U7OyBcCi0gICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKLSAgZXNhYwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFWQUhJX0NGTEFHUyA9IEBBVkFISV9DRkxBR1NACi1BVkFISV9MSUJTID0gQEFWQUhJX0xJQlNACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNSWVBUX0xJQlMgPSBAQ1JZUFRfTElCU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVDSE8gPSBARUNIT0AKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUY3NyA9IEBGNzdACi1GRkxBR1MgPSBARkZMQUdTQAotR05VVExTX0NGTEFHUyA9IEBHTlVUTFNfQ0ZMQUdTQAotR05VVExTX0xJQlMgPSBAR05VVExTX0xJQlNACi1HUkVQID0gQEdSRVBACi1HVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACi1HVEtfTElCUyA9IEBHVEtfTElCU0AKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotSlBFR19MREZMQUdTID0gQEpQRUdfTERGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQkdDUllQVF9DRkxBR1MgPSBATElCR0NSWVBUX0NGTEFHU0AKLUxJQkdDUllQVF9DT05GSUcgPSBATElCR0NSWVBUX0NPTkZJR0AKLUxJQkdDUllQVF9MSUJTID0gQExJQkdDUllQVF9MSUJTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAotUEtHX0NPTkZJR19MSUJESVIgPSBAUEtHX0NPTkZJR19MSUJESVJACi1QS0dfQ09ORklHX1BBVEggPSBAUEtHX0NPTkZJR19QQVRIQAotUkFOTElCID0gQFJBTkxJQkAKLVJQTVNPVVJDRURJUiA9IEBSUE1TT1VSQ0VESVJACi1TRExfQ0ZMQUdTID0gQFNETF9DRkxBR1NACi1TRExfTElCUyA9IEBTRExfTElCU0AKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TU0xfTElCUyA9IEBTU0xfTElCU0AKLVNUUklQID0gQFNUUklQQAotU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1MgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9DRkxBR1NACi1TWVNURU1fTElCVk5DU0VSVkVSX0xJQlMgPSBAU1lTVEVNX0xJQlZOQ1NFUlZFUl9MSUJTQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV1NPQ0tMSUIgPSBAV1NPQ0tMSUJACi1YTUtNRiA9IEBYTUtNRkAKLVhfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAotWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKLVhfTElCUyA9IEBYX0xJQlNACi1YX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0NYWCA9IEBhY19jdF9DWFhACi1hY19jdF9GNzcgPSBAYWNfY3RfRjc3QAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi13aXRoX2ZmbXBlZyA9IEB3aXRoX2ZmbXBlZ0AKLUVYVFJBX0RJU1QgPSBSRUFETUUgYXBwbHlfdHVyYm92bmMgY29udmVydCBjb252ZXJ0X3JmYnNlcnZlciB0aWdodC5jIHR1cmJvanBlZy5oIHVuZG9fdHVyYm92bmMKLWFsbDogYWxsLWFtCi0KLS5TVUZGSVhFUzoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCi0JICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUnOyBcCi0JJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgeDExdm5jL21pc2MvdHVyYm92bmMvTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCi0kKGFtX19hY2xvY2FsX200X2RlcHMpOgotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotdGFnczogVEFHUwotVEFHUzoKLQotY3RhZ3M6IENUQUdTCi1DVEFHUzoKLQotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZQotaW5zdGFsbGRpcnM6Ci1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWh0bWwtYW06Ci0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1kdmktYW06Ci0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1odG1sLWFtOgotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLWluZm8tYW06Ci0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wZGYtYW06Ci0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbC1wcy1hbToKLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RkaXIgZHZpIFwKLQlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAotCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCi0JaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAotCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvdHVyYm92bmMvUkVBRE1FIGIveDExdm5jL21pc2MvdHVyYm92bmMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg5MjljLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jCi0jIFRoaXMgd29yayBoYXMgYmVlbiAob3IgaXMgaGVyZWJ5KSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluIGJ5Ci0jIGl0cyBhdXRob3IsIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+LiBUaGlzIGFwcGxpZXMgd29ybGR3aWRlLgotIyAKLSMgSW4gY2FzZSB0aGlzIGlzIG5vdCBsZWdhbGx5IHBvc3NpYmxlOiBLYXJsIEouIFJ1bmdlIGdyYW50cyBhbnlvbmUgdGhlCi0jIHJpZ2h0IHRvIHVzZSB0aGlzIHdvcmsgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGFueSBjb25kaXRpb25zLCB1bmxlc3MKLSMgc3VjaCBjb25kaXRpb25zIGFyZSByZXF1aXJlZCBieSBsYXcuCi0jCi0KLUlOVFJPOgotLS0tLS0tCi0KLVRoaXMgaXMgYSAicGF0Y2giIHRvIG1ha2UgeDExdm5jL2xpYnZuY3NlcnZlciB3b3JrIHdpdGggVHVyYm9WTkM6Ci0KLQlodHRwOi8vd3d3LnZpcnR1YWxnbC5vcmcvQWJvdXQvVHVyYm9WTkMKLQlodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS10dXJib3ZuYwotCi1JdCBpcyB2ZXJ5IGV4cGVyaW1lbnRhbC9rbHVkZ3kuICBOb3QgYWxsIFR1cmJvVk5DIGZlYXR1cmVzIG1heSBiZSBlbmFibGVkLgotV2UgYXJlIGN1cnJlbnRseSBldmFsdWF0aW5nIHdoZXRoZXIgVHVyYm9WTkMgc3VwcG9ydCBzaG91bGQgYmUgb2ZmaWNpYWxseQotcHV0IGludG8geDExdm5jL2xpYnZuY3NlcnZlci4KLQotVHVyYm9WTkMgaXMgYW4gb3B0aW1pemVkIFZOQyBmb3IgZmFzdCByZWZyZXNoIHJhdGVzIG9uIGZhc3QgbmV0d29ya3MuCi0KLUl0IGRvZXMgcHJldHR5IHdlbGwgb24gZ29vZCBicm9hZGJhbmQgYXMgd2VsbC4gIEJ1dCBpdCBpcyBub3QgYXMgZmFzdAotYXMgcmVndWxhciBUaWdodFZOQyBvbiBzbG93IGxpbmtzLgotCi0KLVRVUkJPSlBFRzoKLS0tLS0tLS0tLQotCi1UdXJib1ZOQyB1c2VzIHRoZSBUdXJib0pQRUcgbGlicmFyeSBiYXNlZCBvbiBhIGZhc3QgcHJvcHJpZXRhcnkgSlBFRwotaW1wbGVtZW50YXRpb24uICBZb3Ugd2lsbCBuZWVkIHRvIGRvd25sb2FkIGl0IGZyb20gdGhlIFZpcnR1YWxHTAotc291cmNlZm9yZ2Ugc2l0ZToKLQotCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTExNzUwOSZwYWNrYWdlX2lkPTE2NjEwMAotCi1FaXRoZXIgaW5zdGFsbCBpdCBvciBzaW1wbHkgdW5wYWNrIHRoZSAuZGViIG9yIC5ycG0gZmlsZSBpbnRvIGEgZGlyZWN0b3J5LgotCi1OLkIuIHlvdSBjYW4gdW5wYWNrIGEgLmRlYiB2aWEgJ2FyIHggcGFja2FnZS5kZWInIGFuZCB0aGUgZXh0cmFjdGluZwotZnJvbSB0aGUgZGF0YS50YXIuZ3ogZmlsZS4gIHJwbTJjcGlvIGNhbiBiZSB1c2VkIHRvIHVucGFjayAucnBtJ3MuCi0KLQotUVVJQ0stU1RBUlQ6Ci0tLS0tLS0tLS0tLS0KLQotRm9yIHRob3NlIGluIGEgaHVycnk6Ci0KLSAgY2QgeDExdm5jLXgueS56L3gxMXZuYy9taXNjL3R1cmJvdm5jCi0gIC4vYXBwbHlfdHVyYm92bmMKLSAgY2QgLi4vLi4vLi4KLSAgZW52IExERkxBR1M9Jy1ML0RJUiAtWGxpbmtlciAtLXJwYXRoPS9ESVInIC4vY29uZmlndXJlCi0gIG1ha2UgQU1fTERGTEFHUz0nLWx0dXJib2pwZWcnCi0KLXdoZXJlIHlvdSByZXBsYWNlIC9ESVIgd2l0aCB5b3VyIGRpcmVjdG9yeSBjb250YWluaW5nIGxpYnR1cmJvanBlZy5zby4KLQotCi1QQVRDSElORyBBTkQgQlVJTERJTkc6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFmdGVyIHVucGFja2luZyB5b3VyIHgxMXZuYy14Lnkuei50YXIuZ3ogdGFyYmFsbCBjZCB0byB0aGUKLXgxMXZuYy14Lnkuei94MTF2bmMvbWlzYy90dXJib3ZuYyAod2hlcmUgdGhpcyBSRUFETUUgZmlsZSBpcykgYW5kIGZyb20KLXRoYXQgZGlyZWN0b3J5IHJ1bjoKLQotCS4vYXBwbHlfdHVyYm92bmMKLQotdGhhdCB3aWxsIG1vZGlmeSBmaWxlcyBpbiB0aGUgbGlidm5jc2VydmVyIGFuZCB4MTF2bmMgZGlyZWN0b3JpZXMgYWJvdmUKLXRoaXMgZGlyZWN0b3J5LiAgKFRvIHVuZG8gdGhlc2UgY2hhbmdlcyBydW46IC4vdW5kb190dXJib3ZuYykgIFRoZSBpbnB1dAotc291cmNlcywgdGlnaHQuYyBhbmQgdHVyYm9qcGVnLmggYXJlIGZyb20gdGhlIFR1cmJvVk5DIHNvdXJjZSBwYWNrYWdlLgotCi1BZnRlciBhcHBseWluZywgZ28gYmFjayB0byB0aGUgdG9wIGxldmVsIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHJ1bjoKLQotCWVudiBMREZMQUdTPSctTC9wYXRoL3RvL3R1cmJvanBlZyAtWGxpbmtlciAtLXJwYXRoPS9wYXRoL3RvL3R1cmJvanBlZycgLi9jb25maWd1cmUgCi0KLXdoZXJlIHRoZSB0dXJib2pwZWcgbGlicmFyeSBpczoKLQotCS9wYXRoL3RvL3R1cmJvanBlZy9saWJ0dXJib2pwZWcuc28KLQotKGNoYW5nZSAvcGF0aC90by90dXJib2pwZWcgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3UgaW5zdGFsbGVkIG9yCi11bnBhY2tlZCBpdC4pCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIGdudSBnY2MgYW5kIGdudSBsaW5rZXIgdGhlIG9wdGlvbnMgbWF5IGJlIGEgbGl0dGxlCi1kaWZmZXJlbnQgKGUuZy4gLVIgaW5zdGVhZCBvZiAtWGxpbmtlciAtLXJwYXRoKS4KLQotSWYgeW91IG5lZWQgYWRkaXRpb25hbCAuL2NvbmZpZ3VyZSBvcHRpb25zIG9yIGVudi4gdmFyLiBzZXR0aW5ncywKLWFkZCB0aGVtIHRvby4KLQotCi1OZXh0LCBydW4gdGhpcyBtYWtlIGNvbW1hbmQ6Ci0KLQltYWtlIEFNX0xERkxBR1M9Jy1sdHVyYm9qcGVnJwotCi1UaGlzIGlzIGEgaGFjayBhbmQgbWF5IG5vdCBhbHdheXMgd29yaywgaWYgaXQgZG9lc24ndCBlZGl0IHgxMXZuYy9NYWtlZmlsZQotYW5kIGFkZCAnLWx0dXJib2pwZWcnIHRvIHRoZSBMSUJTIHZhcmlhYmxlLgotCi1UaGlzIHNob3VsZCBjcmVhdGUgYSBiaW5hcnk6Ci0KLQkuL3gxMXZuYy94MTF2bmMKLQotdGhhdCBzdXBwb3J0cyBWaXJ0dWFsR0wncyBUdXJib1ZOQy4KLQotWW91IHdpbGwgbmVlZCBhIFR1cmJvVk5DIHZpZXdlciwgeW91IGNhbiBnZXQgb25lIGhlcmU6Ci0KLQlodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD0xMTc1MDkmcGFja2FnZV9pZD0xMjgxMzAKLQotTGV0IHVzIGtub3cgaG93IGl0IGdvZXMuCi0KLQotUEVSRk9STUFOQ0U6Ci0tLS0tLS0tLS0tLS0KLQotTm90ZSB0aGF0IHgxMXZuYyBoYXMgdG8gcmVhZCB0aGUgZGlzcGxheSdzIHNjcmVlbiBwaXhlbHMgZnJvbSB0aGUKLWdyYXBoaWNzIGNhcmQgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2xvdywgZS5nLiAxMCBNQi9zZWMuCi0KLVRoZXJlIGlzIG5vdCBhIGJpZyBuZWVkIGZvciBncmFwaGljcyBjYXJkIG1hbnVmYWN0dXJlcnMgdG8gb3B0aW1pemUgdGhlCi1yZWFkIHJhdGU7IHRoZSB3cml0ZSByYXRlIGlzIHRoZSBvbmUgdGhleSBvcHRpbWl6ZSBncmVhdGx5LgotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8jbGltaXRhdGlvbnMKLQotSWYgeW91IHJ1biB4MTF2bmMgYW5kIHNlZSBsaW5lcyBsaWtlIHRoaXM6Ci0KLSAgICAyOC8wMi8yMDA5IDAwOjUyOjA3IEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAotICAgIDI4LzAyLzIwMDkgMDA6NTI6MDcgZmIgcmVhZCByYXRlOiAxMCBNQi9zZWMKLSAgICAyOC8wMi8yMDA5IDAwOjUyOjA3IHNjcmVlbiBzZXR1cCBmaW5pc2hlZC4KLQoteW91IGhhdmUgYSB0eXBpY2FsIHNsb3cgb25lLgotCi1XaGVyZWFzIGlmIHlvdSBzZWUgdGhpczoKLQotICAgIDI4LzAyLzIwMDkgMDA6NTQ6NDYgQXV0b3Byb2Jpbmcgc2VsZWN0ZWQgcG9ydCA1OTAwCi0gICAgMjgvMDIvMjAwOSAwMDo1NDo0NiBmYiByZWFkIHJhdGU6IDMyMSBNQi9zZWMKLSAgICAyOC8wMi8yMDA5IDAwOjU0OjQ2IGZhc3QgcmVhZDogcmVzZXQgd2FpdCAgbXMgdG86IDEwCi0gICAgMjgvMDIvMjAwOSAwMDo1NDo0NiBmYXN0IHJlYWQ6IHJlc2V0IGRlZmVyIG1zIHRvOiAxMAotICAgIDI4LzAyLzIwMDkgMDA6NTQ6NDYgc2NyZWVuIHNldHVwIGZpbmlzaGVkLgotCi10aGF0IGlzIHZlcnkgZmFzdC4gIEluIHN1Y2ggYSBzaXR1YXRpb24geW91IG1heSB3YW50IHRvIGRpYWwgZG93bgoteDExdm5jJ3MgZGVsYXksIGUuZy46ICAtd2FpdCA1IC1kZWZlciA1LCBvciBldmVuIHNtYWxsZXIgdG8gcHVzaCB0aGluZ3MKLW91dCBtb3JlIHF1aWNrbHkuCi0KLVdlIGhhdmUgb25seSBzZWVuIGl0IHRoaXMgZmFzdCBvbiBMaW51eCBieSB1c2luZyB0aGUgbnZpZGlhIHByb3ByaWV0YXJ5Ci1ncmFwaGljcyBkcml2ZXJzLiAgVGhlIFhvcmcgZHJpdmVycyBhcmUgdHlwaWNhbGx5IHNsb3cgMTAgTUIvc2VjLgotCi1JdCB3aWxsIGFsc28gYmUgZmFzdCBpZiB0aGUgWCBzZXJ2ZXIgaXMgdmlydHVhbDogWHZmYiBvciBYZHVtbXkKLXNpbmNlIHRoZSBzY3JlZW4gcGl4ZWxzIGFyZSBzdG9yZWQgaW4gUkFNOgotCi0JaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEteHZmYgotCi1BbmQgaXQgd2lsbCBiZSBmYXN0IGlmIHRoZSBTaGFkb3dGQiB4b3JnLmNvbmYgb3B0aW9uIGlzIGVuYWJsZWQgKGlmIHRoZQotY2FyZCBzdXBwb3J0cyBpdC4pCi0KLQotVGhlIHBvaW50IHdlIGFyZSB0cnlpbmcgdG8gbWFrZSBpcyB0aGF0IGV2ZW4gdGhvdWdoIFR1cmJvVk5DIHVzZXMgYQotd2lja2VkIGZhc3QgSlBFRyBpbXBsZW1lbnRhdGlvbiwgYW5kIGN1dHMgb3V0IG92ZXJoZWFkIGluIGl0cyBhdHRlbXB0IHRvCi1wdW1wIG91dCBhcyBtYW55IGZyYW1lcyBwZXIgc2Vjb25kIGFzIGl0IGNhbiwgaWYgaXQgaXMgc2xvdyBmb3IgeDExdm5jCi10byByZWFkIHRoZSBzY3JlZW4gcGl4ZWxzIGluIHRoZSBmaXJzdCBwbGFjZSB0aGVuIHlvdSBtaWdodCBub3QgZXZlbgotbm90aWNlIHRoZSBUdXJib1ZOQyBzcGVlZHVwLgotCi1TbyBUdXJib1ZOQyt4MTF2bmMgd2lsbCBiZSBmYXN0ZXIgdGhhbiBUaWdodFZOQyt4MTF2bmMsIGJ1dCBpZiB0aGVyZSBpcwotYSBsYXJnZSBvdmVyaGVhZC9ib3R0bGVuZWNrIGZyb20gcmVhZGluZyB0aGUgZ3JhcGhpY3MgY2FyZCBmcmFtZWJ1ZmZlciwKLXRoZW4gdGhlIHNwZWVkdXAgd2lsbCBiZSBtYXJnaW5hbC4KZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL2FwcGx5X3R1cmJvdm5jIGIveDExdm5jL21pc2MvdHVyYm92bmMvYXBwbHlfdHVyYm92bmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZTQ3MDAuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvdHVyYm92bmMvYXBwbHlfdHVyYm92bmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgaGFzIGJlZW4gKG9yIGlzIGhlcmVieSkgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieQotIyBpdHMgYXV0aG9yLCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPi4gVGhpcyBhcHBsaWVzIHdvcmxkd2lkZS4KLSMgCi0jIEluIGNhc2UgdGhpcyBpcyBub3QgbGVnYWxseSBwb3NzaWJsZTogS2FybCBKLiBSdW5nZSBncmFudHMgYW55b25lIHRoZQotIyByaWdodCB0byB1c2UgdGhpcyB3b3JrIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBhbnkgY29uZGl0aW9ucywgdW5sZXNzCi0jIHN1Y2ggY29uZGl0aW9ucyBhcmUgcmVxdWlyZWQgYnkgbGF3LgotCi1sZGlyPSIuLi8uLi8uLi9saWJ2bmNzZXJ2ZXIiCi0KLWZhaWw9IiIKLWlmIFsgISAtZiAiLi90aWdodC5jIiBdOyB0aGVuCi0JZmFpbD0xCi1maQotaWYgWyAhIC1mICIuL3R1cmJvanBlZy5oIiBdOyB0aGVuCi0JZmFpbD0xCi1maQotaWYgWyAhIC1mICIuL2NvbnZlcnQiIF07IHRoZW4KLQlmYWlsPTEKLWZpCi1pZiBbICEgLWYgIiRsZGlyL3RpZ2h0LmMiIF07IHRoZW4KLQlscyAtbCAiJGxkaXIvdGlnaHQuYyIKLQlmYWlsPTEKLWZpCi1pZiBbICEgLWYgIiRsZGlyL3JmYnNlcnZlci5jIiBdOyB0aGVuCi0JbHMgLWwgIiRsZGlyL3JmYnNlcnZlci5jIgotCWZhaWw9MQotZmkKLWlmIFsgIlgkZmFpbCIgPSAiWDEiIF07IHRoZW4KLQllY2hvICJNdXN0IGJlIHJ1biBmcm9tIGluc2lkZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgJ2FwcGx5X3R1cmJvdm5jJyIKLQlleGl0IDEKLWZpCi0KLXNldCAteAotaWYgWyAhIC1mICIkbGRpci90aWdodC5jLk9SSUciIF07IHRoZW4KLQljcCAtcCAiJGxkaXIvdGlnaHQuYyIgIiRsZGlyL3RpZ2h0LmMuT1JJRyIKLWZpCi1pZiBbICEgLWYgIiRsZGlyL3JmYnNlcnZlci5jLk9SSUciIF07IHRoZW4KLQljcCAtcCAiJGxkaXIvcmZic2VydmVyLmMiICIkbGRpci9yZmJzZXJ2ZXIuYy5PUklHIgotZmkKLQotcGVybCAuL2NvbnZlcnQgLi90aWdodC5jID4gIiRsZGlyL3RpZ2h0LmMiCi1wZXJsIC4vY29udmVydF9yZmJzZXJ2ZXIgJGxkaXIvcmZic2VydmVyLmMuT1JJRyA+ICIkbGRpci9yZmJzZXJ2ZXIuYyIKLWNwIC1wIC4vdHVyYm9qcGVnLmggIiRsZGlyIgotbHMgLWwgJGxkaXIvdGlnaHQuYyogJGxkaXIvcmZic2VydmVyLmMqICRsZGlyL3R1cmJvanBlZy5oCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy90dXJib3ZuYy9jb252ZXJ0IGIveDExdm5jL21pc2MvdHVyYm92bmMvY29udmVydApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjIxOGY4NC4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy90dXJib3ZuYy9jb252ZXJ0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIFRoaXMgc2NyaXB0IGhhcyBiZWVuIChvciBpcyBoZXJlYnkpIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4gYnkKLSMgaXRzIGF1dGhvciwgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4uIFRoaXMgYXBwbGllcyB3b3JsZHdpZGUuCi0jIAotIyBJbiBjYXNlIHRoaXMgaXMgbm90IGxlZ2FsbHkgcG9zc2libGU6IEthcmwgSi4gUnVuZ2UgZ3JhbnRzIGFueW9uZSB0aGUKLSMgcmlnaHQgdG8gdXNlIHRoaXMgd29yayBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgYW55IGNvbmRpdGlvbnMsIHVubGVzcwotIyBzdWNoIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIGJ5IGxhdy4KLQotd2hpbGUgKDw+KSB7Ci0JaWYgKC9eI2luY2x1ZGUuKiJyZmIuaCIvKSB7Ci0JCXByaW50IDw8RU5EOwotI2luY2x1ZGUgPHJmYi9yZmIuaD4KLSNkZWZpbmUgQm9vbCByZmJCb29sCi0jZGVmaW5lIENBUkQzMiB1aW50MzJfdAotI2RlZmluZSBDQVJEMTYgdWludDE2X3QKLSNkZWZpbmUgQ0FSRDggdWludDhfdAotI2RlZmluZSB4YWxsb2MgbWFsbG9jCi0jZGVmaW5lIHhyZWFsbG9jIHJlYWxsb2MKLSNkZWZpbmUgcmZiVGlnaHROb1psaWIgMHgwQQotI2RlZmluZSB0aWdodFN1YnNhbXBMZXZlbCBjb3JyZU1heFdpZHRoCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJQVEhSRUFEICYmIExJQlZOQ1NFUlZFUl9IQVZFX1RMUwotI2RlZmluZSBUTFMgX190aHJlYWQKLSNlbHNlCi0jZGVmaW5lIFRMUwotI2VuZGlmCi0KLUVORAotCQluZXh0OwotCX0KLQlmb3JlYWNoICRmdW5jIChxdyhGaW5kQmVzdFNvbGlkQXJlYSBFeHRlbmRTb2xpZEFyZWEgQ2hlY2tTb2xpZFRpbGUgQ2hlY2tTb2xpZFRpbGUjI2JwcCBDaGVja1NvbGlkVGlsZTggQ2hlY2tTb2xpZFRpbGUxNiBDaGVja1NvbGlkVGlsZTMyIFBhY2syNCkpIHsKLQkJaWYgKC9zdGF0aWMuKlxiXFEkZnVuY1xFXGIvICYmICFleGlzdHMgJGRpZF9zdGF0aWN7JGZ1bmN9KSB7Ci0JCQkkXyA9fiBzL1xiXFEkZnVuY1xFXGIoXHMqKVwoLyRmdW5jJDEocmZiQ2xpZW50UHRyIGNsLCAvOwotCQkJJGRpZF9zdGF0aWN7JGZ1bmN9ID0gMTsKLQkJfSBlbHNpZiAoL1xiXFEkZnVuY1xFXGJccypcKC8pIHsKLQkJCSRfID1+IHMvXGJcUSRmdW5jXEVcYihccyopXCgvJGZ1bmMkMShjbCwgLzsKLQkJfQotCX0KLQotIwlpZiAoL15ccypzdWJzYW1wTGV2ZWxccyo9XHMqY2wvKSB7Ci0jCQkkXyA9ICIvLyRfIjsKLSMJCXByaW50ICJzdWJzYW1wTGV2ZWwgPSAwO1xuIjsKLSMJfQotCi0jCSRfID1+IHMvY2wtPnRpZ2h0UXVhbGl0eUxldmVsOy9jbC0+dGlnaHRRdWFsaXR5TGV2ZWwgKiAxMDsvOwotCi0JaWYgKC9ec3RhdGljXHMrKEJvb2x8aW50fENBUkQzMnxQQUxFVFRFfGNoYXJ8dW5zaWduZWR8dGpoYW5kbGUpXHMrW14oKV0qO1xzKiQvKSB7Ci0JCSRfID1+IHMvXnN0YXRpYy9zdGF0aWMgVExTIC87Ci0JfQotCi0JJF8gPX4gcy9yZmJTY3JlZW4ucGZiTWVtb3J5L2NsLT5zY2FsZWRTY3JlZW4tPmZyYW1lQnVmZmVyL2c7Ci0JJF8gPX4gcy9yZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzL2NsLT5zY2FsZWRTY3JlZW4tPnBhZGRlZFdpZHRoSW5CeXRlcy9nOwotCSRfID1+IHMvcmZiU2NyZWVuLmJpdHNQZXJQaXhlbC9jbC0+c2NhbGVkU2NyZWVuLT5iaXRzUGVyUGl4ZWwvZzsKLQkkXyA9fiBzL3JmYlNlcnZlckZvcm1hdC9jbC0+c2NyZWVuLT5zZXJ2ZXJGb3JtYXQvZzsKLQotCWlmICgvXihGaW5kQmVzdFNvbGlkQXJlYXxFeHRlbmRTb2xpZEFyZWF8c3RhdGljIHZvaWQgUGFjazI0fENoZWNrU29saWRUaWxlKVwoY2wvKSB7Ci0JCSRfIC49ICJyZmJDbGllbnRQdHIgY2w7XG4iOwotCX0KLQlpZiAoL14oQ2hlY2tTb2xpZFRpbGUjI2JwcClcKGNsLykgewotCQkkXyAuPSAicmZiQ2xpZW50UHRyIGNsOyBcXFxuIjsKLQl9Ci0JJF8gPX4gcy9cYnVibGVuXGIvY2wtPnVibGVuLzsKLQkkXyA9fiBzL1xidXBkYXRlQnVmXGIvY2wtPnVwZGF0ZUJ1Zi87Ci0KLQlpZiAoL2NsLT4ocmZiUmVjdGFuZ2xlc1NlbnR8cmZiQnl0ZXNTZW50KS8pIHsKLQkJJF8gPSAiLy8kXyI7Ci0JfQotCXByaW50OwotfQotCi1wcmludCA8PEVORDsKLQotdm9pZCByZmJUaWdodENsZWFudXAocmZiU2NyZWVuSW5mb1B0ciBzY3JlZW4pIHsKLX0KLQotRU5ECi0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvdHVyYm92bmMvY29udmVydF9yZmJzZXJ2ZXIgYi94MTF2bmMvbWlzYy90dXJib3ZuYy9jb252ZXJ0X3JmYnNlcnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEyNjdhYy4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy90dXJib3ZuYy9jb252ZXJ0X3JmYnNlcnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBUaGlzIHNjcmlwdCBoYXMgYmVlbiAob3IgaXMgaGVyZWJ5KSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluIGJ5Ci0jIGl0cyBhdXRob3IsIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+LiBUaGlzIGFwcGxpZXMgd29ybGR3aWRlLgotIyAKLSMgSW4gY2FzZSB0aGlzIGlzIG5vdCBsZWdhbGx5IHBvc3NpYmxlOiBLYXJsIEouIFJ1bmdlIGdyYW50cyBhbnlvbmUgdGhlCi0jIHJpZ2h0IHRvIHVzZSB0aGlzIHdvcmsgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGFueSBjb25kaXRpb25zLCB1bmxlc3MKLSMgc3VjaCBjb25kaXRpb25zIGFyZSByZXF1aXJlZCBieSBsYXcuCi0KLSRzYXdfbWFyayA9IDA7Ci0kZG9uZSA9IDA7Ci0KLXdoaWxlICg8PikgewotCWlmICghICRzYXdfbWFyayAmJiAvY2FzZSByZmJFbmNvZGluZ1NlcnZlcklkZW50aXR5Oi8pIAkJewotCQkkc2F3X21hcmsgPSAxOwotCX0KLQlpZiAoJHNhd19tYXJrICYmICEkZG9uZSAmJiAvZGVmYXVsdDovKSB7Ci0JCXByaW50OwotCi0JCXByaW50IDw8RU5EOwotICAgICAgICAgICAgICAgIC8qIGZvciB0dXJib3ZuYyAqLwotI2RlZmluZSByZmJKcGVnUXVhbGl0eUxldmVsMSAgICAgICAweEZGRkZGRTAxCi0jZGVmaW5lIHJmYkpwZWdRdWFsaXR5TGV2ZWwxMDAgICAgIDB4RkZGRkZFNjQKLSNkZWZpbmUgcmZiSnBlZ1N1YnNhbXAxWCAgICAgICAgICAgMHhGRkZGRkQwMAotI2RlZmluZSByZmJKcGVnU3Vic2FtcDRYICAgICAgICAgICAweEZGRkZGRDAxCi0jZGVmaW5lIHJmYkpwZWdTdWJzYW1wMlggICAgICAgICAgIDB4RkZGRkZEMDIKLSNkZWZpbmUgcmZiSnBlZ1N1YnNhbXBHcmF5ICAgICAgICAgMHhGRkZGRkQwMwotCi0gICAgICAgICAgICAgICAgaWYgKCBlbmMgPj0gKHVpbnQzMl90KXJmYkpwZWdTdWJzYW1wMVggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmMgPD0gKHVpbnQzMl90KXJmYkpwZWdTdWJzYW1wR3JheSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogWFhYIG1lbWJlciByZWFsbHkgc2hvdWxkIGJlIHRpZ2h0U3Vic2FtcGxlIG5vdCBjb3JyZU1heFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgIGNsLT5jb3JyZU1heFdpZHRoID0gZW5jICYgMHhGRjsKLSAgICAgICAgICAgICAgICAgICAgcmZiTG9nKCJVc2luZyBKUEVHIHN1YnNhbXBsaW5nICVkIGZvciBjbGllbnQgJXNcXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wtPmNvcnJlTWF4V2lkdGgsIGNsLT5ob3N0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBlbmMgPj0gKHVpbnQzMl90KXJmYkVuY29kaW5nUXVhbGl0eUxldmVsMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYyA8PSAodWludDMyX3QpcmZiRW5jb2RpbmdRdWFsaXR5TGV2ZWw5ICkgewotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IEpQRUdfUVVBTFsxMF0gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIDUsIDEwLCAxNSwgMjUsIDM3LCA1MCwgNjAsIDcwLCA3NSwgODAKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgY2wtPnRpZ2h0UXVhbGl0eUxldmVsID0gSlBFR19RVUFMW2VuYyAmIDB4MEZdOwotICAgICAgICAgICAgICAgICAgICAvKiBYWFggbWVtYmVyIHJlYWxseSBzaG91bGQgYmUgdGlnaHRTdWJzYW1wbGUgbm90IGNvcnJlTWF4V2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgY2wtPmNvcnJlTWF4V2lkdGggPSAyOwotICAgICAgICAgICAgICAgICAgICByZmJMb2coIlVzaW5nIGltYWdlIGxldmVsIFN1YnNhbXBsZSAlZCAgUXVhbGl0eSAlZCBmb3IgY2xpZW50ICVzXFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLT5jb3JyZU1heFdpZHRoLCBjbC0+dGlnaHRRdWFsaXR5TGV2ZWwsIGNsLT5ob3N0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBlbmMgPj0gKHVpbnQzMl90KXJmYkpwZWdRdWFsaXR5TGV2ZWwxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jIDw9ICh1aW50MzJfdClyZmJKcGVnUXVhbGl0eUxldmVsMTAwICkgewotICAgICAgICAgICAgICAgICAgICBjbC0+dGlnaHRRdWFsaXR5TGV2ZWwgPSBlbmMgJiAweEZGOwotICAgICAgICAgICAgICAgICAgICByZmJMb2coIlVzaW5nIGltYWdlIHF1YWxpdHkgbGV2ZWwgJWQgZm9yIGNsaWVudCAlc1xcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjbC0+dGlnaHRRdWFsaXR5TGV2ZWwsIGNsLT5ob3N0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLUVORAotCQkkZG9uZSA9IDE7Ci0JCW5leHQ7Ci0JfQotCXByaW50OwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvdHVyYm92bmMvdGlnaHQuYyBiL3gxMXZuYy9taXNjL3R1cmJvdm5jL3RpZ2h0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjRkYmQuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MvdHVyYm92bmMvdGlnaHQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MDIgKzAsMCBAQAotLyoKLSAqIHRpZ2h0LmMKLSAqCi0gKiBSb3V0aW5lcyB0byBpbXBsZW1lbnQgVGlnaHQgRW5jb2RpbmcKLSAqLwotCi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0IExhbmRtYXJrIEdyYXBoaWNzIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgQ29uc3QgS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVQmVCBMYWJvcmF0b3JpZXMgQ2FtYnJpZGdlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKLSAqICBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicmZiLmgiCi0jaW5jbHVkZSAidHVyYm9qcGVnLmgiCi0KLS8qIE5vdGU6IFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqLwotI2RlZmluZSBUSUdIVF9NSU5fVE9fQ09NUFJFU1MgMTIKLQotLyogVGhlIHBhcmFtZXRlcnMgYmVsb3cgbWF5IGJlIGFkanVzdGVkLiAqLwotI2RlZmluZSBNSU5fU1BMSVRfUkVDVF9TSVpFICAgICA0MDk2Ci0jZGVmaW5lIE1JTl9TT0xJRF9TVUJSRUNUX1NJWkUgIDIwNDgKLSNkZWZpbmUgTUFYX1NQTElUX1RJTEVfU0laRSAgICAgICAxNgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCBvbiBldmVyeSByZmJTZW5kUmVjdEVuY29kaW5nVGlnaHQoKSBjYWxsLiAqLwotc3RhdGljIEJvb2wgdXNlUGl4ZWxGb3JtYXQyNDsKLQotCi0vKiBDb21wcmVzc2lvbiBsZXZlbCBzdHVmZi4gVGhlIGZvbGxvd2luZyBhcnJheSBjb250YWlucyB2YXJpb3VzCi0gICBlbmNvZGVyIHBhcmFtZXRlcnMgZm9yIGVhY2ggb2YgMTAgY29tcHJlc3Npb24gbGV2ZWxzICgwLi45KS4KLSAgIExhc3QgdGhyZWUgcGFyYW1ldGVycyBjb3JyZXNwb25kIHRvIEpQRUcgcXVhbGl0eSBsZXZlbHMgKDAuLjkpLiAqLwotCi10eXBlZGVmIHN0cnVjdCBUSUdIVF9DT05GX3MgewotICAgIGludCBtYXhSZWN0U2l6ZSwgbWF4UmVjdFdpZHRoOwotICAgIGludCBtb25vTWluUmVjdFNpemU7Ci0gICAgaW50IGlkeFpsaWJMZXZlbCwgbW9ub1psaWJMZXZlbCwgcmF3WmxpYkxldmVsOwotICAgIGludCBpZHhNYXhDb2xvcnNEaXZpc29yOwotfSBUSUdIVF9DT05GOwotCi1zdGF0aWMgVElHSFRfQ09ORiB0aWdodENvbmZbMl0gPSB7Ci0gICAgeyA2NTUzNiwgMjA0OCwgICA2LCAwLCAwLCAwLCAgIDQgfSwKLSNpZiAwCi0gICAgeyAgMjA0OCwgIDEyOCwgICA2LCAxLCAxLCAxLCAgIDggfSwKLSAgICB7ICA2MTQ0LCAgMjU2LCAgIDgsIDMsIDMsIDIsICAyNCB9LAotICAgIHsgMTAyNDAsIDEwMjQsICAxMiwgNSwgNSwgMywgIDMyIH0sCi0gICAgeyAxNjM4NCwgMjA0OCwgIDEyLCA2LCA2LCA0LCAgMzIgfSwKLSAgICB7IDMyNzY4LCAyMDQ4LCAgMTIsIDcsIDcsIDUsICAzMiB9LAotICAgIHsgNjU1MzYsIDIwNDgsICAxNiwgNywgNywgNiwgIDQ4IH0sCi0gICAgeyA2NTUzNiwgMjA0OCwgIDE2LCA4LCA4LCA3LCAgNjQgfSwKLSAgICB7IDY1NTM2LCAyMDQ4LCAgMzIsIDksIDksIDgsICA2NCB9LAotI2VuZGlmCi0gICAgeyA2NTUzNiwgMjA0OCwgIDMyLCAxLCAxLCAxLCAgOTYgfQotfTsKLQotc3RhdGljIGludCBjb21wcmVzc0xldmVsOwotc3RhdGljIGludCBxdWFsaXR5TGV2ZWw7Ci1zdGF0aWMgaW50IHN1YnNhbXBMZXZlbDsKLQotc3RhdGljIGNvbnN0IGludCBzdWJzYW1wTGV2ZWwydGpzdWJzYW1wWzRdID0gewotICAgIFRKXzQ0NCwgVEpfNDExLCBUSl80MjIsIFRKX0dSQVlTQ0FMRQotfTsKLQotLyogU3R1ZmYgZGVhbGluZyB3aXRoIHBhbGV0dGVzLiAqLwotCi10eXBlZGVmIHN0cnVjdCBDT0xPUl9MSVNUX3MgewotICAgIHN0cnVjdCBDT0xPUl9MSVNUX3MgKm5leHQ7Ci0gICAgaW50IGlkeDsKLSAgICBDQVJEMzIgcmdiOwotfSBDT0xPUl9MSVNUOwotCi10eXBlZGVmIHN0cnVjdCBQQUxFVFRFX0VOVFJZX3MgewotICAgIENPTE9SX0xJU1QgKmxpc3ROb2RlOwotICAgIGludCBudW1QaXhlbHM7Ci19IFBBTEVUVEVfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IFBBTEVUVEVfcyB7Ci0gICAgUEFMRVRURV9FTlRSWSBlbnRyeVsyNTZdOwotICAgIENPTE9SX0xJU1QgKmhhc2hbMjU2XTsKLSAgICBDT0xPUl9MSVNUIGxpc3RbMjU2XTsKLX0gUEFMRVRURTsKLQotc3RhdGljIGludCBwYWxldHRlTnVtQ29sb3JzLCBwYWxldHRlTWF4Q29sb3JzOwotc3RhdGljIENBUkQzMiBtb25vQmFja2dyb3VuZCwgbW9ub0ZvcmVncm91bmQ7Ci1zdGF0aWMgUEFMRVRURSBwYWxldHRlOwotCi0vKiBQb2ludGVycyB0byBkeW5hbWljYWxseS1hbGxvY2F0ZWQgYnVmZmVycy4gKi8KLQotc3RhdGljIGludCB0aWdodEJlZm9yZUJ1ZlNpemUgPSAwOwotc3RhdGljIGNoYXIgKnRpZ2h0QmVmb3JlQnVmID0gTlVMTDsKLQotc3RhdGljIGludCB0aWdodEFmdGVyQnVmU2l6ZSA9IDA7Ci1zdGF0aWMgY2hhciAqdGlnaHRBZnRlckJ1ZiA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgKnByZXZSb3dCdWYgPSBOVUxMOwotCi0KLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICovCi0KLXN0YXRpYyB2b2lkIEZpbmRCZXN0U29saWRBcmVhIChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJEMzIgY29sb3JWYWx1ZSwgaW50ICp3X3B0ciwgaW50ICpoX3B0cik7Ci1zdGF0aWMgdm9pZCBFeHRlbmRTb2xpZEFyZWEgICAoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSRDMyIGNvbG9yVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp4X3B0ciwgaW50ICp5X3B0ciwgaW50ICp3X3B0ciwgaW50ICpoX3B0cik7Ci1zdGF0aWMgQm9vbCBDaGVja1NvbGlkVGlsZSAgICAoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSRDMyICpjb2xvclB0ciwgQm9vbCBuZWVkU2FtZUNvbG9yKTsKLXN0YXRpYyBCb29sIENoZWNrU29saWRUaWxlOCAgIChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJEMzIgKmNvbG9yUHRyLCBCb29sIG5lZWRTYW1lQ29sb3IpOwotc3RhdGljIEJvb2wgQ2hlY2tTb2xpZFRpbGUxNiAgKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkQzMiAqY29sb3JQdHIsIEJvb2wgbmVlZFNhbWVDb2xvcik7Ci1zdGF0aWMgQm9vbCBDaGVja1NvbGlkVGlsZTMyICAoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSRDMyICpjb2xvclB0ciwgQm9vbCBuZWVkU2FtZUNvbG9yKTsKLQotc3RhdGljIEJvb2wgU2VuZFJlY3RTaW1wbGUgICAgKHJmYkNsaWVudFB0ciBjbCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwotc3RhdGljIEJvb2wgU2VuZFN1YnJlY3QgICAgICAgKHJmYkNsaWVudFB0ciBjbCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwotc3RhdGljIEJvb2wgU2VuZFRpZ2h0SGVhZGVyICAgKHJmYkNsaWVudFB0ciBjbCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwotCi1zdGF0aWMgQm9vbCBTZW5kU29saWRSZWN0ICAgICAocmZiQ2xpZW50UHRyIGNsKTsKLXN0YXRpYyBCb29sIFNlbmRNb25vUmVjdCAgICAgIChyZmJDbGllbnRQdHIgY2wsIGludCB3LCBpbnQgaCk7Ci1zdGF0aWMgQm9vbCBTZW5kSW5kZXhlZFJlY3QgICAocmZiQ2xpZW50UHRyIGNsLCBpbnQgdywgaW50IGgpOwotc3RhdGljIEJvb2wgU2VuZEZ1bGxDb2xvclJlY3QgKHJmYkNsaWVudFB0ciBjbCwgaW50IHcsIGludCBoKTsKLQotc3RhdGljIEJvb2wgQ29tcHJlc3NEYXRhKHJmYkNsaWVudFB0ciBjbCwgaW50IHN0cmVhbUlkLCBpbnQgZGF0YUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemxpYkxldmVsLCBpbnQgemxpYlN0cmF0ZWd5KTsKLXN0YXRpYyBCb29sIFNlbmRDb21wcmVzc2VkRGF0YShyZmJDbGllbnRQdHIgY2wsIGNoYXIgKmJ1ZiwgaW50IGNvbXByZXNzZWRMZW4pOwotCi1zdGF0aWMgdm9pZCBGaWxsUGFsZXR0ZTgoaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIEZpbGxQYWxldHRlMTYoaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIEZpbGxQYWxldHRlMzIoaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIEZhc3RGaWxsUGFsZXR0ZTE2KHJmYkNsaWVudFB0ciBjbCwgQ0FSRDE2ICpkYXRhLCBpbnQgdywgaW50IHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpOwotc3RhdGljIHZvaWQgRmFzdEZpbGxQYWxldHRlMzIocmZiQ2xpZW50UHRyIGNsLCBDQVJEMzIgKmRhdGEsIGludCB3LCBpbnQgcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCk7Ci0KLXN0YXRpYyB2b2lkIFBhbGV0dGVSZXNldCh2b2lkKTsKLXN0YXRpYyBpbnQgUGFsZXR0ZUluc2VydChDQVJEMzIgcmdiLCBpbnQgbnVtUGl4ZWxzLCBpbnQgYnBwKTsKLQotc3RhdGljIHZvaWQgUGFjazI0KGNoYXIgKmJ1ZiwgcmZiUGl4ZWxGb3JtYXQgKmZtdCwgaW50IGNvdW50KTsKLQotc3RhdGljIHZvaWQgRW5jb2RlSW5kZXhlZFJlY3QxNihDQVJEOCAqYnVmLCBpbnQgY291bnQpOwotc3RhdGljIHZvaWQgRW5jb2RlSW5kZXhlZFJlY3QzMihDQVJEOCAqYnVmLCBpbnQgY291bnQpOwotCi1zdGF0aWMgdm9pZCBFbmNvZGVNb25vUmVjdDgoQ0FSRDggKmJ1ZiwgaW50IHcsIGludCBoKTsKLXN0YXRpYyB2b2lkIEVuY29kZU1vbm9SZWN0MTYoQ0FSRDggKmJ1ZiwgaW50IHcsIGludCBoKTsKLXN0YXRpYyB2b2lkIEVuY29kZU1vbm9SZWN0MzIoQ0FSRDggKmJ1ZiwgaW50IHcsIGludCBoKTsKLQotc3RhdGljIEJvb2wgU2VuZEpwZWdSZWN0KHJmYkNsaWVudFB0ciBjbCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkpOwotCi0vKgotICogVGlnaHQgZW5jb2RpbmcgaW1wbGVtZW50YXRpb24uCi0gKi8KLQotaW50Ci1yZmJOdW1Db2RlZFJlY3RzVGlnaHQoY2wsIHgsIHksIHcsIGgpCi0gICAgcmZiQ2xpZW50UHRyIGNsOwotICAgIGludCB4LCB5LCB3LCBoOwotewotICAgIGludCBtYXhSZWN0U2l6ZSwgbWF4UmVjdFdpZHRoOwotICAgIGludCBzdWJyZWN0TWF4V2lkdGgsIHN1YnJlY3RNYXhIZWlnaHQ7Ci0KLSAgICAvKiBObyBtYXR0ZXIgaG93IG1hbnkgcmVjdGFuZ2xlcyB3ZSB3aWxsIHNlbmQgaWYgTGFzdFJlY3QgbWFya2VycwotICAgICAgIGFyZSB1c2VkIHRvIHRlcm1pbmF0ZSByZWN0YW5nbGUgc3RyZWFtLiAqLwotICAgIGlmIChjbC0+ZW5hYmxlTGFzdFJlY3RFbmNvZGluZyAmJiB3ICogaCA+PSBNSU5fU1BMSVRfUkVDVF9TSVpFKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBtYXhSZWN0U2l6ZSA9IHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5tYXhSZWN0U2l6ZTsKLSAgICBtYXhSZWN0V2lkdGggPSB0aWdodENvbmZbY29tcHJlc3NMZXZlbF0ubWF4UmVjdFdpZHRoOwotCi0gICAgaWYgKHcgPiBtYXhSZWN0V2lkdGggfHwgdyAqIGggPiBtYXhSZWN0U2l6ZSkgewotICAgICAgICBzdWJyZWN0TWF4V2lkdGggPSAodyA+IG1heFJlY3RXaWR0aCkgPyBtYXhSZWN0V2lkdGggOiB3OwotICAgICAgICBzdWJyZWN0TWF4SGVpZ2h0ID0gbWF4UmVjdFNpemUgLyBzdWJyZWN0TWF4V2lkdGg7Ci0gICAgICAgIHJldHVybiAoKCh3IC0gMSkgLyBtYXhSZWN0V2lkdGggKyAxKSAqCi0gICAgICAgICAgICAgICAgKChoIC0gMSkgLyBzdWJyZWN0TWF4SGVpZ2h0ICsgMSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotQm9vbAotcmZiU2VuZFJlY3RFbmNvZGluZ1RpZ2h0KGNsLCB4LCB5LCB3LCBoKQotICAgIHJmYkNsaWVudFB0ciBjbDsKLSAgICBpbnQgeCwgeSwgdywgaDsKLXsKLSAgICBpbnQgbk1heFJvd3M7Ci0gICAgQ0FSRDMyIGNvbG9yVmFsdWU7Ci0gICAgaW50IGR4LCBkeSwgZHcsIGRoOwotICAgIGludCB4X2Jlc3QsIHlfYmVzdCwgd19iZXN0LCBoX2Jlc3Q7Ci0gICAgY2hhciAqZmJwdHI7Ci0KLSAgICBjb21wcmVzc0xldmVsID0gY2wtPnRpZ2h0Q29tcHJlc3NMZXZlbCA+IDAgPyAxIDogMDsKLSAgICBxdWFsaXR5TGV2ZWwgPSBjbC0+dGlnaHRRdWFsaXR5TGV2ZWw7Ci0gICAgaWYgKHF1YWxpdHlMZXZlbCAhPSAtMSkgewotICAgICAgICBjb21wcmVzc0xldmVsID0gMTsKLSAgICAgICAgdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLmlkeFpsaWJMZXZlbCA9IDE7Ci0gICAgICAgIHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5tb25vWmxpYkxldmVsID0gMTsKLSAgICAgICAgdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLnJhd1psaWJMZXZlbCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLmlkeFpsaWJMZXZlbCA9IGNsLT50aWdodENvbXByZXNzTGV2ZWw7Ci0gICAgICAgIHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5tb25vWmxpYkxldmVsID0gY2wtPnRpZ2h0Q29tcHJlc3NMZXZlbDsKLSAgICAgICAgdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLnJhd1psaWJMZXZlbCA9IGNsLT50aWdodENvbXByZXNzTGV2ZWw7Ci0gICAgfQotICAgIHN1YnNhbXBMZXZlbCA9IGNsLT50aWdodFN1YnNhbXBMZXZlbDsKLQotICAgIGlmICggY2wtPmZvcm1hdC5kZXB0aCA9PSAyNCAmJiBjbC0+Zm9ybWF0LnJlZE1heCA9PSAweEZGICYmCi0gICAgICAgICBjbC0+Zm9ybWF0LmdyZWVuTWF4ID09IDB4RkYgJiYgY2wtPmZvcm1hdC5ibHVlTWF4ID09IDB4RkYgKSB7Ci0gICAgICAgIHVzZVBpeGVsRm9ybWF0MjQgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVzZVBpeGVsRm9ybWF0MjQgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoIWNsLT5lbmFibGVMYXN0UmVjdEVuY29kaW5nIHx8IHcgKiBoIDwgTUlOX1NQTElUX1JFQ1RfU0laRSkKLSAgICAgICAgcmV0dXJuIFNlbmRSZWN0U2ltcGxlKGNsLCB4LCB5LCB3LCBoKTsKLQotICAgIC8qIE1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgYXQgbGVhc3Qgb25lIHBpeGVsIGludG8gdGlnaHRCZWZvcmVCdWYuICovCi0KLSAgICBpZiAodGlnaHRCZWZvcmVCdWZTaXplIDwgNCkgewotICAgICAgICB0aWdodEJlZm9yZUJ1ZlNpemUgPSA0OwotICAgICAgICBpZiAodGlnaHRCZWZvcmVCdWYgPT0gTlVMTCkKLSAgICAgICAgICAgIHRpZ2h0QmVmb3JlQnVmID0gKGNoYXIgKil4YWxsb2ModGlnaHRCZWZvcmVCdWZTaXplKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGlnaHRCZWZvcmVCdWYgPSAoY2hhciAqKXhyZWFsbG9jKHRpZ2h0QmVmb3JlQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZ2h0QmVmb3JlQnVmU2l6ZSk7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgaW4gb25lIG5vbi1zb2xpZCByZWN0YW5nbGUuICovCi0KLSAgICB7Ci0gICAgICAgIGludCBtYXhSZWN0U2l6ZSwgbWF4UmVjdFdpZHRoLCBuTWF4V2lkdGg7Ci0KLSAgICAgICAgbWF4UmVjdFNpemUgPSB0aWdodENvbmZbY29tcHJlc3NMZXZlbF0ubWF4UmVjdFNpemU7Ci0gICAgICAgIG1heFJlY3RXaWR0aCA9IHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5tYXhSZWN0V2lkdGg7Ci0gICAgICAgIG5NYXhXaWR0aCA9ICh3ID4gbWF4UmVjdFdpZHRoKSA/IG1heFJlY3RXaWR0aCA6IHc7Ci0gICAgICAgIG5NYXhSb3dzID0gbWF4UmVjdFNpemUgLyBuTWF4V2lkdGg7Ci0gICAgfQotCi0gICAgLyogVHJ5IHRvIGZpbmQgbGFyZ2Ugc29saWQtY29sb3IgYXJlYXMgYW5kIHNlbmQgdGhlbSBzZXBhcmF0ZWx5LiAqLwotCi0gICAgZm9yIChkeSA9IHk7IGR5IDwgeSArIGg7IGR5ICs9IE1BWF9TUExJVF9USUxFX1NJWkUpIHsKLQotICAgICAgICAvKiBJZiBhIHJlY3RhbmdsZSBiZWNvbWVzIHRvbyBsYXJnZSwgc2VuZCBpdHMgdXBwZXIgcGFydCBub3cuICovCi0KLSAgICAgICAgaWYgKGR5IC0geSA+PSBuTWF4Um93cykgewotICAgICAgICAgICAgaWYgKCFTZW5kUmVjdFNpbXBsZShjbCwgeCwgeSwgdywgbk1heFJvd3MpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgeSArPSBuTWF4Um93czsKLSAgICAgICAgICAgIGggLT0gbk1heFJvd3M7Ci0gICAgICAgIH0KLQotICAgICAgICBkaCA9IChkeSArIE1BWF9TUExJVF9USUxFX1NJWkUgPD0geSArIGgpID8KLSAgICAgICAgICAgIE1BWF9TUExJVF9USUxFX1NJWkUgOiAoeSArIGggLSBkeSk7Ci0KLSAgICAgICAgZm9yIChkeCA9IHg7IGR4IDwgeCArIHc7IGR4ICs9IE1BWF9TUExJVF9USUxFX1NJWkUpIHsKLQotICAgICAgICAgICAgZHcgPSAoZHggKyBNQVhfU1BMSVRfVElMRV9TSVpFIDw9IHggKyB3KSA/Ci0gICAgICAgICAgICAgICAgTUFYX1NQTElUX1RJTEVfU0laRSA6ICh4ICsgdyAtIGR4KTsKLQotICAgICAgICAgICAgaWYgKENoZWNrU29saWRUaWxlKGR4LCBkeSwgZHcsIGRoLCAmY29sb3JWYWx1ZSwgRkFMU0UpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3Vic2FtcExldmVsID09IFRKX0dSQVlTQ0FMRSAmJiBxdWFsaXR5TGV2ZWwgIT0gLTEpIHsKLQkJICAgIENBUkQzMiByPShjb2xvclZhbHVlPj4xNikmMHhGRjsKLQkJICAgIENBUkQzMiBnPShjb2xvclZhbHVlPj44KSYweEZGOwotCQkgICAgQ0FSRDMyIGI9KGNvbG9yVmFsdWUpJjB4RkY7Ci0JCSAgICBkb3VibGUgeT0oMC4yNTcqKGRvdWJsZSlyKSsoMC41MDQqKGRvdWJsZSlnKQotCQkgICAgICAgICsoMC4wOTgqKGRvdWJsZSliKSsxNi47Ci0JCSAgICBjb2xvclZhbHVlPShpbnQpeSsoKChpbnQpeSk8PDgpKygoKGludCl5KTw8MTYpOwotCQl9Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgZGltZW5zaW9ucyBvZiBzb2xpZC1jb2xvciBhcmVhLiAqLwotCi0gICAgICAgICAgICAgICAgRmluZEJlc3RTb2xpZEFyZWEoZHgsIGR5LCB3IC0gKGR4IC0geCksIGggLSAoZHkgLSB5KSwKLQkJCQkgIGNvbG9yVmFsdWUsICZ3X2Jlc3QsICZoX2Jlc3QpOwotCi0gICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGEgc29saWQgcmVjdGFuZ2xlIGlzIGxhcmdlIGVub3VnaAotICAgICAgICAgICAgICAgICAgIChvciB0aGUgd2hvbGUgcmVjdGFuZ2xlIGlzIG9mIHRoZSBzYW1lIGNvbG9yKS4gKi8KLQotICAgICAgICAgICAgICAgIGlmICggd19iZXN0ICogaF9iZXN0ICE9IHcgKiBoICYmCi0gICAgICAgICAgICAgICAgICAgICB3X2Jlc3QgKiBoX2Jlc3QgPCBNSU5fU09MSURfU1VCUkVDVF9TSVpFICkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZXh0ZW5kIHNvbGlkIHJlY3RhbmdsZSB0byBtYXhpbXVtIHNpemUuICovCi0KLSAgICAgICAgICAgICAgICB4X2Jlc3QgPSBkeDsgeV9iZXN0ID0gZHk7Ci0gICAgICAgICAgICAgICAgRXh0ZW5kU29saWRBcmVhKHgsIHksIHcsIGgsIGNvbG9yVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4X2Jlc3QsICZ5X2Jlc3QsICZ3X2Jlc3QsICZoX2Jlc3QpOwotCi0gICAgICAgICAgICAgICAgLyogU2VuZCByZWN0YW5nbGVzIGF0IHRvcCBhbmQgbGVmdCB0byBzb2xpZC1jb2xvciBhcmVhLiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKCB5X2Jlc3QgIT0geSAmJgotICAgICAgICAgICAgICAgICAgICAgIVNlbmRSZWN0U2ltcGxlKGNsLCB4LCB5LCB3LCB5X2Jlc3QteSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaWYgKCB4X2Jlc3QgIT0geCAmJgotICAgICAgICAgICAgICAgICAgICAgIXJmYlNlbmRSZWN0RW5jb2RpbmdUaWdodChjbCwgeCwgeV9iZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2Jlc3QteCwgaF9iZXN0KSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qIFNlbmQgc29saWQtY29sb3IgcmVjdGFuZ2xlLiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKCFTZW5kVGlnaHRIZWFkZXIoY2wsIHhfYmVzdCwgeV9iZXN0LCB3X2Jlc3QsIGhfYmVzdCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIGZicHRyID0gKHJmYlNjcmVlbi5wZmJNZW1vcnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIChyZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzICogeV9iZXN0KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHhfYmVzdCAqIChyZmJTY3JlZW4uYml0c1BlclBpeGVsIC8gOCkpKTsKLQotICAgICAgICAgICAgICAgICgqY2wtPnRyYW5zbGF0ZUZuKShjbC0+dHJhbnNsYXRlTG9va3VwVGFibGUsICZyZmJTZXJ2ZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbC0+Zm9ybWF0LCBmYnB0ciwgdGlnaHRCZWZvcmVCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNjcmVlbi5wYWRkZWRXaWR0aEluQnl0ZXMsIDEsIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFTZW5kU29saWRSZWN0KGNsKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICAgICAgLyogU2VuZCByZW1haW5pbmcgcmVjdGFuZ2xlcyAoYXQgcmlnaHQgYW5kIGJvdHRvbSkuICovCi0KLSAgICAgICAgICAgICAgICBpZiAoIHhfYmVzdCArIHdfYmVzdCAhPSB4ICsgdyAmJgotICAgICAgICAgICAgICAgICAgICAgIXJmYlNlbmRSZWN0RW5jb2RpbmdUaWdodChjbCwgeF9iZXN0K3dfYmVzdCwgeV9iZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LSh4X2Jlc3QteCktd19iZXN0LCBoX2Jlc3QpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIGlmICggeV9iZXN0ICsgaF9iZXN0ICE9IHkgKyBoICYmCi0gICAgICAgICAgICAgICAgICAgICAhcmZiU2VuZFJlY3RFbmNvZGluZ1RpZ2h0KGNsLCB4LCB5X2Jlc3QraF9iZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLSh5X2Jlc3QteSktaF9iZXN0KSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qIFJldHVybiBhZnRlciBhbGwgcmVjdXJzaXZlIGNhbGxzIGFyZSBkb25lLiAqLwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogTm8gc3VpdGFibGUgc29saWQtY29sb3IgcmVjdGFuZ2xlcyBmb3VuZC4gKi8KLQotICAgIHJldHVybiBTZW5kUmVjdFNpbXBsZShjbCwgeCwgeSwgdywgaCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1GaW5kQmVzdFNvbGlkQXJlYSh4LCB5LCB3LCBoLCBjb2xvclZhbHVlLCB3X3B0ciwgaF9wdHIpCi0gICAgaW50IHgsIHksIHcsIGg7Ci0gICAgQ0FSRDMyIGNvbG9yVmFsdWU7Ci0gICAgaW50ICp3X3B0ciwgKmhfcHRyOwotewotICAgIGludCBkeCwgZHksIGR3LCBkaDsKLSAgICBpbnQgd19wcmV2OwotICAgIGludCB3X2Jlc3QgPSAwLCBoX2Jlc3QgPSAwOwotCi0gICAgd19wcmV2ID0gdzsKLQotICAgIGZvciAoZHkgPSB5OyBkeSA8IHkgKyBoOyBkeSArPSBNQVhfU1BMSVRfVElMRV9TSVpFKSB7Ci0KLSAgICAgICAgZGggPSAoZHkgKyBNQVhfU1BMSVRfVElMRV9TSVpFIDw9IHkgKyBoKSA/Ci0gICAgICAgICAgICBNQVhfU1BMSVRfVElMRV9TSVpFIDogKHkgKyBoIC0gZHkpOwotICAgICAgICBkdyA9ICh3X3ByZXYgPiBNQVhfU1BMSVRfVElMRV9TSVpFKSA/Ci0gICAgICAgICAgICBNQVhfU1BMSVRfVElMRV9TSVpFIDogd19wcmV2OwotCi0gICAgICAgIGlmICghQ2hlY2tTb2xpZFRpbGUoeCwgZHksIGR3LCBkaCwgJmNvbG9yVmFsdWUsIFRSVUUpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZm9yIChkeCA9IHggKyBkdzsgZHggPCB4ICsgd19wcmV2OykgewotICAgICAgICAgICAgZHcgPSAoZHggKyBNQVhfU1BMSVRfVElMRV9TSVpFIDw9IHggKyB3X3ByZXYpID8KLSAgICAgICAgICAgICAgICBNQVhfU1BMSVRfVElMRV9TSVpFIDogKHggKyB3X3ByZXYgLSBkeCk7Ci0gICAgICAgICAgICBpZiAoIUNoZWNrU29saWRUaWxlKGR4LCBkeSwgZHcsIGRoLCAmY29sb3JWYWx1ZSwgVFJVRSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGR4ICs9IGR3OwotICAgICAgICB9Ci0KLSAgICAgICAgd19wcmV2ID0gZHggLSB4OwotICAgICAgICBpZiAod19wcmV2ICogKGR5ICsgZGggLSB5KSA+IHdfYmVzdCAqIGhfYmVzdCkgewotICAgICAgICAgICAgd19iZXN0ID0gd19wcmV2OwotICAgICAgICAgICAgaF9iZXN0ID0gZHkgKyBkaCAtIHk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqd19wdHIgPSB3X2Jlc3Q7Ci0gICAgKmhfcHRyID0gaF9iZXN0OwotfQotCi1zdGF0aWMgdm9pZAotRXh0ZW5kU29saWRBcmVhKHgsIHksIHcsIGgsIGNvbG9yVmFsdWUsIHhfcHRyLCB5X3B0ciwgd19wdHIsIGhfcHRyKQotICAgIGludCB4LCB5LCB3LCBoOwotICAgIENBUkQzMiBjb2xvclZhbHVlOwotICAgIGludCAqeF9wdHIsICp5X3B0ciwgKndfcHRyLCAqaF9wdHI7Ci17Ci0gICAgaW50IGN4LCBjeTsKLQotICAgIC8qIFRyeSB0byBleHRlbmQgdGhlIGFyZWEgdXB3YXJkcy4gKi8KLSAgICBmb3IgKCBjeSA9ICp5X3B0ciAtIDE7Ci0gICAgICAgICAgY3kgPj0geSAmJiBDaGVja1NvbGlkVGlsZSgqeF9wdHIsIGN5LCAqd19wdHIsIDEsICZjb2xvclZhbHVlLCBUUlVFKTsKLSAgICAgICAgICBjeS0tICk7Ci0gICAgKmhfcHRyICs9ICp5X3B0ciAtIChjeSArIDEpOwotICAgICp5X3B0ciA9IGN5ICsgMTsKLQotICAgIC8qIC4uLiBkb3dud2FyZHMuICovCi0gICAgZm9yICggY3kgPSAqeV9wdHIgKyAqaF9wdHI7Ci0gICAgICAgICAgY3kgPCB5ICsgaCAmJgotICAgICAgICAgICAgICBDaGVja1NvbGlkVGlsZSgqeF9wdHIsIGN5LCAqd19wdHIsIDEsICZjb2xvclZhbHVlLCBUUlVFKTsKLSAgICAgICAgICBjeSsrICk7Ci0gICAgKmhfcHRyICs9IGN5IC0gKCp5X3B0ciArICpoX3B0cik7Ci0KLSAgICAvKiAuLi4gdG8gdGhlIGxlZnQuICovCi0gICAgZm9yICggY3ggPSAqeF9wdHIgLSAxOwotICAgICAgICAgIGN4ID49IHggJiYgQ2hlY2tTb2xpZFRpbGUoY3gsICp5X3B0ciwgMSwgKmhfcHRyLCAmY29sb3JWYWx1ZSwgVFJVRSk7Ci0gICAgICAgICAgY3gtLSApOwotICAgICp3X3B0ciArPSAqeF9wdHIgLSAoY3ggKyAxKTsKLSAgICAqeF9wdHIgPSBjeCArIDE7Ci0KLSAgICAvKiAuLi4gdG8gdGhlIHJpZ2h0LiAqLwotICAgIGZvciAoIGN4ID0gKnhfcHRyICsgKndfcHRyOwotICAgICAgICAgIGN4IDwgeCArIHcgJiYKLSAgICAgICAgICAgICAgQ2hlY2tTb2xpZFRpbGUoY3gsICp5X3B0ciwgMSwgKmhfcHRyLCAmY29sb3JWYWx1ZSwgVFJVRSk7Ci0gICAgICAgICAgY3grKyApOwotICAgICp3X3B0ciArPSBjeCAtICgqeF9wdHIgKyAqd19wdHIpOwotfQotCi0vKgotICogQ2hlY2sgaWYgYSByZWN0YW5nbGUgaXMgYWxsIG9mIHRoZSBzYW1lIGNvbG9yLiBJZiBuZWVkU2FtZUNvbG9yIGlzCi0gKiBzZXQgdG8gbm9uLXplcm8sIHRoZW4gYWxzbyBjaGVjayB0aGF0IGl0cyBjb2xvciBlcXVhbHMgdG8gdGhlCi0gKiAqY29sb3JQdHIgdmFsdWUuIFRoZSByZXN1bHQgaXMgMSBpZiB0aGUgdGVzdCBpcyBzdWNjZXNzZnVsbCwgYW5kIGluCi0gKiB0aGF0IGNhc2UgbmV3IGNvbG9yIHdpbGwgYmUgc3RvcmVkIGluICpjb2xvclB0ci4KLSAqLwotCi1zdGF0aWMgQm9vbAotQ2hlY2tTb2xpZFRpbGUoeCwgeSwgdywgaCwgY29sb3JQdHIsIG5lZWRTYW1lQ29sb3IpCi0gICAgaW50IHgsIHksIHcsIGg7Ci0gICAgQ0FSRDMyICpjb2xvclB0cjsKLSAgICBCb29sIG5lZWRTYW1lQ29sb3I7Ci17Ci0gICAgc3dpdGNoKHJmYlNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSAgICBjYXNlIDMyOgotICAgICAgICByZXR1cm4gQ2hlY2tTb2xpZFRpbGUzMih4LCB5LCB3LCBoLCBjb2xvclB0ciwgbmVlZFNhbWVDb2xvcik7Ci0gICAgY2FzZSAxNjoKLSAgICAgICAgcmV0dXJuIENoZWNrU29saWRUaWxlMTYoeCwgeSwgdywgaCwgY29sb3JQdHIsIG5lZWRTYW1lQ29sb3IpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBDaGVja1NvbGlkVGlsZTgoeCwgeSwgdywgaCwgY29sb3JQdHIsIG5lZWRTYW1lQ29sb3IpOwotICAgIH0KLX0KLQotI2RlZmluZSBERUZJTkVfQ0hFQ0tfU09MSURfRlVOQ1RJT04oYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIEJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotQ2hlY2tTb2xpZFRpbGUjI2JwcCh4LCB5LCB3LCBoLCBjb2xvclB0ciwgbmVlZFNhbWVDb2xvcikgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCB4LCB5LCB3LCBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQzMiAqY29sb3JQdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJvb2wgbmVlZFNhbWVDb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQjI2JwcCAqZmJwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQjI2JwcCBjb2xvclZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBkeCwgZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZicHRyID0gKENBUkQjI2JwcCAqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmcmZiU2NyZWVuLnBmYk1lbW9yeVt5ICogcmZiU2NyZWVuLnBhZGRlZFdpZHRoSW5CeXRlcyArIHggKiAoYnBwLzgpXTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbG9yVmFsdWUgPSAqZmJwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChuZWVkU2FtZUNvbG9yICYmIChDQVJEMzIpY29sb3JWYWx1ZSAhPSAqY29sb3JQdHIpICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZHkgPSAwOyBkeSA8IGg7IGR5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGR4ID0gMDsgZHggPCB3OyBkeCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKGNvbG9yVmFsdWUgIT0gZmJwdHJbZHhdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmYnB0ciA9IChDQVJEIyNicHAgKikoKENBUkQ4ICopZmJwdHIgKyByZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzKTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpjb2xvclB0ciA9IChDQVJEMzIpY29sb3JWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1ERUZJTkVfQ0hFQ0tfU09MSURfRlVOQ1RJT04oOCkKLURFRklORV9DSEVDS19TT0xJRF9GVU5DVElPTigxNikKLURFRklORV9DSEVDS19TT0xJRF9GVU5DVElPTigzMikKLQotc3RhdGljIEJvb2wKLVNlbmRSZWN0U2ltcGxlKGNsLCB4LCB5LCB3LCBoKQotICAgIHJmYkNsaWVudFB0ciBjbDsKLSAgICBpbnQgeCwgeSwgdywgaDsKLXsKLSAgICBpbnQgbWF4QmVmb3JlU2l6ZSwgbWF4QWZ0ZXJTaXplOwotICAgIGludCBtYXhSZWN0U2l6ZSwgbWF4UmVjdFdpZHRoOwotICAgIGludCBzdWJyZWN0TWF4V2lkdGgsIHN1YnJlY3RNYXhIZWlnaHQ7Ci0gICAgaW50IGR4LCBkeTsKLSAgICBpbnQgcncsIHJoOwotCi0gICAgbWF4UmVjdFNpemUgPSB0aWdodENvbmZbY29tcHJlc3NMZXZlbF0ubWF4UmVjdFNpemU7Ci0gICAgbWF4UmVjdFdpZHRoID0gdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLm1heFJlY3RXaWR0aDsKLQotICAgIG1heEJlZm9yZVNpemUgPSBtYXhSZWN0U2l6ZSAqIChjbC0+Zm9ybWF0LmJpdHNQZXJQaXhlbCAvIDgpOwotICAgIG1heEFmdGVyU2l6ZSA9IG1heEJlZm9yZVNpemUgKyAobWF4QmVmb3JlU2l6ZSArIDk5KSAvIDEwMCArIDEyOwotCi0gICAgaWYgKHRpZ2h0QmVmb3JlQnVmU2l6ZSA8IG1heEJlZm9yZVNpemUpIHsKLSAgICAgICAgdGlnaHRCZWZvcmVCdWZTaXplID0gbWF4QmVmb3JlU2l6ZTsKLSAgICAgICAgaWYgKHRpZ2h0QmVmb3JlQnVmID09IE5VTEwpCi0gICAgICAgICAgICB0aWdodEJlZm9yZUJ1ZiA9IChjaGFyICopeGFsbG9jKHRpZ2h0QmVmb3JlQnVmU2l6ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRpZ2h0QmVmb3JlQnVmID0gKGNoYXIgKil4cmVhbGxvYyh0aWdodEJlZm9yZUJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWdodEJlZm9yZUJ1ZlNpemUpOwotICAgIH0KLQotICAgIGlmICh0aWdodEFmdGVyQnVmU2l6ZSA8IG1heEFmdGVyU2l6ZSkgewotICAgICAgICB0aWdodEFmdGVyQnVmU2l6ZSA9IG1heEFmdGVyU2l6ZTsKLSAgICAgICAgaWYgKHRpZ2h0QWZ0ZXJCdWYgPT0gTlVMTCkKLSAgICAgICAgICAgIHRpZ2h0QWZ0ZXJCdWYgPSAoY2hhciAqKXhhbGxvYyh0aWdodEFmdGVyQnVmU2l6ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRpZ2h0QWZ0ZXJCdWYgPSAoY2hhciAqKXhyZWFsbG9jKHRpZ2h0QWZ0ZXJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWdodEFmdGVyQnVmU2l6ZSk7Ci0gICAgfQotCi0gICAgaWYgKHcgPiBtYXhSZWN0V2lkdGggfHwgdyAqIGggPiBtYXhSZWN0U2l6ZSkgewotICAgICAgICBzdWJyZWN0TWF4V2lkdGggPSAodyA+IG1heFJlY3RXaWR0aCkgPyBtYXhSZWN0V2lkdGggOiB3OwotICAgICAgICBzdWJyZWN0TWF4SGVpZ2h0ID0gbWF4UmVjdFNpemUgLyBzdWJyZWN0TWF4V2lkdGg7Ci0KLSAgICAgICAgZm9yIChkeSA9IDA7IGR5IDwgaDsgZHkgKz0gc3VicmVjdE1heEhlaWdodCkgewotICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgdzsgZHggKz0gbWF4UmVjdFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcncgPSAoZHggKyBtYXhSZWN0V2lkdGggPCB3KSA/IG1heFJlY3RXaWR0aCA6IHcgLSBkeDsKLSAgICAgICAgICAgICAgICByaCA9IChkeSArIHN1YnJlY3RNYXhIZWlnaHQgPCBoKSA/IHN1YnJlY3RNYXhIZWlnaHQgOiBoIC0gZHk7Ci0gICAgICAgICAgICAgICAgaWYgKCFTZW5kU3VicmVjdChjbCwgeCtkeCwgeStkeSwgcncsIHJoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFTZW5kU3VicmVjdChjbCwgeCwgeSwgdywgaCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBCb29sCi1TZW5kU3VicmVjdChjbCwgeCwgeSwgdywgaCkKLSAgICByZmJDbGllbnRQdHIgY2w7Ci0gICAgaW50IHgsIHksIHcsIGg7Ci17Ci0gICAgY2hhciAqZmJwdHI7Ci0gICAgQm9vbCBzdWNjZXNzID0gRkFMU0U7Ci0KLSAgICAvKiBTZW5kIHBlbmRpbmcgZGF0YSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMTI4IGJ5dGVzLiAqLwotICAgIGlmICh1YmxlbiA+IDEyOCkgewotICAgICAgICBpZiAoIXJmYlNlbmRVcGRhdGVCdWYoY2wpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICghU2VuZFRpZ2h0SGVhZGVyKGNsLCB4LCB5LCB3LCBoKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgZmJwdHIgPSAocmZiU2NyZWVuLnBmYk1lbW9yeSArIChyZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzICogeSkKLSAgICAgICAgICAgICArICh4ICogKHJmYlNjcmVlbi5iaXRzUGVyUGl4ZWwgLyA4KSkpOwotCi0gICAgaWYgKHN1YnNhbXBMZXZlbCA9PSBUSl9HUkFZU0NBTEUgJiYgcXVhbGl0eUxldmVsICE9IC0xKQotICAgICAgICByZXR1cm4gU2VuZEpwZWdSZWN0KGNsLCB4LCB5LCB3LCBoLCBxdWFsaXR5TGV2ZWwpOwotCi0gICAgcGFsZXR0ZU1heENvbG9ycyA9IHcgKiBoIC8gdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLmlkeE1heENvbG9yc0Rpdmlzb3I7Ci0gICAgaWYocXVhbGl0eUxldmVsICE9IC0xKQotICAgICAgICBwYWxldHRlTWF4Q29sb3JzID0gMjQ7Ci0gICAgaWYgKCBwYWxldHRlTWF4Q29sb3JzIDwgMiAmJgotICAgICAgICAgdyAqIGggPj0gdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLm1vbm9NaW5SZWN0U2l6ZSApIHsKLSAgICAgICAgcGFsZXR0ZU1heENvbG9ycyA9IDI7Ci0gICAgfQotCi0gICAgaWYgKGNsLT5mb3JtYXQuYml0c1BlclBpeGVsID09IHJmYlNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwgJiYKLSAgICAgICAgY2wtPmZvcm1hdC5yZWRNYXggPT0gcmZiU2VydmVyRm9ybWF0LnJlZE1heCAmJgotICAgICAgICBjbC0+Zm9ybWF0LmdyZWVuTWF4ID09IHJmYlNlcnZlckZvcm1hdC5ncmVlbk1heCAmJiAKLSAgICAgICAgY2wtPmZvcm1hdC5ibHVlTWF4ID09IHJmYlNlcnZlckZvcm1hdC5ibHVlTWF4ICYmCi0gICAgICAgIGNsLT5mb3JtYXQuYml0c1BlclBpeGVsID49IDE2KSB7Ci0KLSAgICAgICAgLyogVGhpcyBpcyBzbyB3ZSBjYW4gYXZvaWQgdHJhbnNsYXRpbmcgdGhlIHBpeGVscyB3aGVuIGNvbXByZXNzaW5nCi0gICAgICAgICAgIHdpdGggSlBFRywgc2luY2UgaXQgaXMgdW5uZWNlc3NhcnkgKi8KLSAgICAgICAgc3dpdGNoIChjbC0+Zm9ybWF0LmJpdHNQZXJQaXhlbCkgewotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgRmFzdEZpbGxQYWxldHRlMTYoY2wsIChDQVJEMTYgKilmYnB0ciwgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNjcmVlbi5wYWRkZWRXaWR0aEluQnl0ZXMvMiwgaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEZhc3RGaWxsUGFsZXR0ZTMyKGNsLCAoQ0FSRDMyICopZmJwdHIsIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzLzQsIGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocGFsZXR0ZU51bUNvbG9ycyAhPSAwIHx8IHF1YWxpdHlMZXZlbCA9PSAtMSkgewotICAgICAgICAgICAgKCpjbC0+dHJhbnNsYXRlRm4pKGNsLT50cmFuc2xhdGVMb29rdXBUYWJsZSwgJnJmYlNlcnZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2wtPmZvcm1hdCwgZmJwdHIsIHRpZ2h0QmVmb3JlQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNjcmVlbi5wYWRkZWRXaWR0aEluQnl0ZXMsIHcsIGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAoKmNsLT50cmFuc2xhdGVGbikoY2wtPnRyYW5zbGF0ZUxvb2t1cFRhYmxlLCAmcmZiU2VydmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsLT5mb3JtYXQsIGZicHRyLCB0aWdodEJlZm9yZUJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNjcmVlbi5wYWRkZWRXaWR0aEluQnl0ZXMsIHcsIGgpOwotCi0gICAgICAgIHN3aXRjaCAoY2wtPmZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgRmlsbFBhbGV0dGU4KHcgKiBoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgRmlsbFBhbGV0dGUxNih3ICogaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEZpbGxQYWxldHRlMzIodyAqIGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChwYWxldHRlTnVtQ29sb3JzKSB7Ci0gICAgY2FzZSAwOgotICAgICAgICAvKiBUcnVlY29sb3IgaW1hZ2UgKi8KLSAgICAgICAgaWYgKHF1YWxpdHlMZXZlbCAhPSAtMSkgewotICAgICAgICAgICAgc3VjY2VzcyA9IFNlbmRKcGVnUmVjdChjbCwgeCwgeSwgdywgaCwgcXVhbGl0eUxldmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBTZW5kRnVsbENvbG9yUmVjdChjbCwgdywgaCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICAvKiBTb2xpZCByZWN0YW5nbGUgKi8KLSAgICAgICAgc3VjY2VzcyA9IFNlbmRTb2xpZFJlY3QoY2wpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIC8qIFR3by1jb2xvciByZWN0YW5nbGUgKi8KLSAgICAgICAgc3VjY2VzcyA9IFNlbmRNb25vUmVjdChjbCwgdywgaCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFVwIHRvIDI1NiBkaWZmZXJlbnQgY29sb3JzICovCi0gICAgICAgIHN1Y2Nlc3MgPSBTZW5kSW5kZXhlZFJlY3QoY2wsIHcsIGgpOwotICAgIH0KLSAgICByZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIEJvb2wKLVNlbmRUaWdodEhlYWRlcihjbCwgeCwgeSwgdywgaCkKLSAgICByZmJDbGllbnRQdHIgY2w7Ci0gICAgaW50IHgsIHksIHcsIGg7Ci17Ci0gICAgcmZiRnJhbWVidWZmZXJVcGRhdGVSZWN0SGVhZGVyIHJlY3Q7Ci0KLSAgICBpZiAodWJsZW4gKyBzel9yZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlY3RIZWFkZXIgPiBVUERBVEVfQlVGX1NJWkUpIHsKLSAgICAgICAgaWYgKCFyZmJTZW5kVXBkYXRlQnVmKGNsKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZWN0LnIueCA9IFN3YXAxNklmTEUoeCk7Ci0gICAgcmVjdC5yLnkgPSBTd2FwMTZJZkxFKHkpOwotICAgIHJlY3Quci53ID0gU3dhcDE2SWZMRSh3KTsKLSAgICByZWN0LnIuaCA9IFN3YXAxNklmTEUoaCk7Ci0gICAgcmVjdC5lbmNvZGluZyA9IFN3YXAzMklmTEUocmZiRW5jb2RpbmdUaWdodCk7Ci0KLSAgICBtZW1jcHkoJnVwZGF0ZUJ1Zlt1Ymxlbl0sIChjaGFyICopJnJlY3QsCi0gICAgICAgICAgIHN6X3JmYkZyYW1lYnVmZmVyVXBkYXRlUmVjdEhlYWRlcik7Ci0gICAgdWJsZW4gKz0gc3pfcmZiRnJhbWVidWZmZXJVcGRhdGVSZWN0SGVhZGVyOwotCi0gICAgY2wtPnJmYlJlY3RhbmdsZXNTZW50W3JmYkVuY29kaW5nVGlnaHRdKys7Ci0gICAgY2wtPnJmYkJ5dGVzU2VudFtyZmJFbmNvZGluZ1RpZ2h0XSArPSBzel9yZmJGcmFtZWJ1ZmZlclVwZGF0ZVJlY3RIZWFkZXI7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAqIFN1YmVuY29kaW5nIGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi1zdGF0aWMgQm9vbAotU2VuZFNvbGlkUmVjdChjbCkKLSAgICByZmJDbGllbnRQdHIgY2w7Ci17Ci0gICAgaW50IGxlbjsKLQotICAgIGlmICh1c2VQaXhlbEZvcm1hdDI0KSB7Ci0gICAgICAgIFBhY2syNCh0aWdodEJlZm9yZUJ1ZiwgJmNsLT5mb3JtYXQsIDEpOwotICAgICAgICBsZW4gPSAzOwotICAgIH0gZWxzZQotICAgICAgICBsZW4gPSBjbC0+Zm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0KLSAgICBpZiAodWJsZW4gKyAxICsgbGVuID4gVVBEQVRFX0JVRl9TSVpFKSB7Ci0gICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgdXBkYXRlQnVmW3VibGVuKytdID0gKGNoYXIpKHJmYlRpZ2h0RmlsbCA8PCA0KTsKLSAgICBtZW1jcHkgKCZ1cGRhdGVCdWZbdWJsZW5dLCB0aWdodEJlZm9yZUJ1ZiwgbGVuKTsKLSAgICB1YmxlbiArPSBsZW47Ci0KLSAgICBjbC0+cmZiQnl0ZXNTZW50W3JmYkVuY29kaW5nVGlnaHRdICs9IGxlbiArIDE7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJvb2wKLVNlbmRNb25vUmVjdChjbCwgdywgaCkKLSAgICByZmJDbGllbnRQdHIgY2w7Ci0gICAgaW50IHcsIGg7Ci17Ci0gICAgaW50IHN0cmVhbUlkID0gMTsKLSAgICBpbnQgcGFsZXR0ZUxlbiwgZGF0YUxlbjsKLQotICAgIGlmICggKHVibGVuICsgVElHSFRfTUlOX1RPX0NPTVBSRVNTICsgNiArCi0gICAgICAgICAgMiAqIGNsLT5mb3JtYXQuYml0c1BlclBpeGVsIC8gOCkgPiBVUERBVEVfQlVGX1NJWkUgKSB7Ci0gICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogUHJlcGFyZSB0aWdodCBlbmNvZGluZyBoZWFkZXIuICovCi0gICAgZGF0YUxlbiA9ICh3ICsgNykgLyA4OwotICAgIGRhdGFMZW4gKj0gaDsKLQotICAgIGlmICh0aWdodENvbmZbY29tcHJlc3NMZXZlbF0ubW9ub1psaWJMZXZlbCA9PSAwKQotICAgICAgICB1cGRhdGVCdWZbdWJsZW4rK10gPSAoY2hhcikoKHJmYlRpZ2h0Tm9abGliIHwgcmZiVGlnaHRFeHBsaWNpdEZpbHRlcikgPDwgNCk7Ci0gICAgZWxzZQotICAgICAgICB1cGRhdGVCdWZbdWJsZW4rK10gPSAoc3RyZWFtSWQgfCByZmJUaWdodEV4cGxpY2l0RmlsdGVyKSA8PCA0OwotICAgIHVwZGF0ZUJ1Zlt1YmxlbisrXSA9IHJmYlRpZ2h0RmlsdGVyUGFsZXR0ZTsKLSAgICB1cGRhdGVCdWZbdWJsZW4rK10gPSAxOwotCi0gICAgLyogUHJlcGFyZSBwYWxldHRlLCBjb252ZXJ0IGltYWdlLiAqLwotICAgIHN3aXRjaCAoY2wtPmZvcm1hdC5iaXRzUGVyUGl4ZWwpIHsKLQotICAgIGNhc2UgMzI6Ci0gICAgICAgIEVuY29kZU1vbm9SZWN0MzIoKENBUkQ4ICopdGlnaHRCZWZvcmVCdWYsIHcsIGgpOwotCi0gICAgICAgICgoQ0FSRDMyICopdGlnaHRBZnRlckJ1ZilbMF0gPSBtb25vQmFja2dyb3VuZDsKLSAgICAgICAgKChDQVJEMzIgKil0aWdodEFmdGVyQnVmKVsxXSA9IG1vbm9Gb3JlZ3JvdW5kOwotICAgICAgICBpZiAodXNlUGl4ZWxGb3JtYXQyNCkgewotICAgICAgICAgICAgUGFjazI0KHRpZ2h0QWZ0ZXJCdWYsICZjbC0+Zm9ybWF0LCAyKTsKLSAgICAgICAgICAgIHBhbGV0dGVMZW4gPSA2OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHBhbGV0dGVMZW4gPSA4OwotCi0gICAgICAgIG1lbWNweSgmdXBkYXRlQnVmW3VibGVuXSwgdGlnaHRBZnRlckJ1ZiwgcGFsZXR0ZUxlbik7Ci0gICAgICAgIHVibGVuICs9IHBhbGV0dGVMZW47Ci0gICAgICAgIGNsLT5yZmJCeXRlc1NlbnRbcmZiRW5jb2RpbmdUaWdodF0gKz0gMyArIHBhbGV0dGVMZW47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxNjoKLSAgICAgICAgRW5jb2RlTW9ub1JlY3QxNigoQ0FSRDggKil0aWdodEJlZm9yZUJ1ZiwgdywgaCk7Ci0KLSAgICAgICAgKChDQVJEMTYgKil0aWdodEFmdGVyQnVmKVswXSA9IChDQVJEMTYpbW9ub0JhY2tncm91bmQ7Ci0gICAgICAgICgoQ0FSRDE2ICopdGlnaHRBZnRlckJ1ZilbMV0gPSAoQ0FSRDE2KW1vbm9Gb3JlZ3JvdW5kOwotCi0gICAgICAgIG1lbWNweSgmdXBkYXRlQnVmW3VibGVuXSwgdGlnaHRBZnRlckJ1ZiwgNCk7Ci0gICAgICAgIHVibGVuICs9IDQ7Ci0gICAgICAgIGNsLT5yZmJCeXRlc1NlbnRbcmZiRW5jb2RpbmdUaWdodF0gKz0gNzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBFbmNvZGVNb25vUmVjdDgoKENBUkQ4ICopdGlnaHRCZWZvcmVCdWYsIHcsIGgpOwotCi0gICAgICAgIHVwZGF0ZUJ1Zlt1YmxlbisrXSA9IChjaGFyKW1vbm9CYWNrZ3JvdW5kOwotICAgICAgICB1cGRhdGVCdWZbdWJsZW4rK10gPSAoY2hhciltb25vRm9yZWdyb3VuZDsKLSAgICAgICAgY2wtPnJmYkJ5dGVzU2VudFtyZmJFbmNvZGluZ1RpZ2h0XSArPSA1OwotICAgIH0KLQotICAgIHJldHVybiBDb21wcmVzc0RhdGEoY2wsIHN0cmVhbUlkLCBkYXRhTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdGlnaHRDb25mW2NvbXByZXNzTGV2ZWxdLm1vbm9abGliTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotfQotCi1zdGF0aWMgQm9vbAotU2VuZEluZGV4ZWRSZWN0KGNsLCB3LCBoKQotICAgIHJmYkNsaWVudFB0ciBjbDsKLSAgICBpbnQgdywgaDsKLXsKLSAgICBpbnQgc3RyZWFtSWQgPSAyOwotICAgIGludCBpLCBlbnRyeUxlbjsKLQotICAgIGlmICggKHVibGVuICsgVElHSFRfTUlOX1RPX0NPTVBSRVNTICsgNiArCi0gICAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyAqIGNsLT5mb3JtYXQuYml0c1BlclBpeGVsIC8gOCkgPiBVUERBVEVfQlVGX1NJWkUgKSB7Ci0gICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogUHJlcGFyZSB0aWdodCBlbmNvZGluZyBoZWFkZXIuICovCi0gICAgaWYgKHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5pZHhabGliTGV2ZWwgPT0gMCkKLSAgICAgICAgdXBkYXRlQnVmW3VibGVuKytdID0gKGNoYXIpKChyZmJUaWdodE5vWmxpYiB8IHJmYlRpZ2h0RXhwbGljaXRGaWx0ZXIpIDw8IDQpOwotICAgIGVsc2UKLSAgICAgICAgdXBkYXRlQnVmW3VibGVuKytdID0gKHN0cmVhbUlkIHwgcmZiVGlnaHRFeHBsaWNpdEZpbHRlcikgPDwgNDsKLSAgICB1cGRhdGVCdWZbdWJsZW4rK10gPSByZmJUaWdodEZpbHRlclBhbGV0dGU7Ci0gICAgdXBkYXRlQnVmW3VibGVuKytdID0gKGNoYXIpKHBhbGV0dGVOdW1Db2xvcnMgLSAxKTsKLQotICAgIC8qIFByZXBhcmUgcGFsZXR0ZSwgY29udmVydCBpbWFnZS4gKi8KLSAgICBzd2l0Y2ggKGNsLT5mb3JtYXQuYml0c1BlclBpeGVsKSB7Ci0KLSAgICBjYXNlIDMyOgotICAgICAgICBFbmNvZGVJbmRleGVkUmVjdDMyKChDQVJEOCAqKXRpZ2h0QmVmb3JlQnVmLCB3ICogaCk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhbGV0dGVOdW1Db2xvcnM7IGkrKykgewotICAgICAgICAgICAgKChDQVJEMzIgKil0aWdodEFmdGVyQnVmKVtpXSA9Ci0gICAgICAgICAgICAgICAgcGFsZXR0ZS5lbnRyeVtpXS5saXN0Tm9kZS0+cmdiOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VQaXhlbEZvcm1hdDI0KSB7Ci0gICAgICAgICAgICBQYWNrMjQodGlnaHRBZnRlckJ1ZiwgJmNsLT5mb3JtYXQsIHBhbGV0dGVOdW1Db2xvcnMpOwotICAgICAgICAgICAgZW50cnlMZW4gPSAzOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGVudHJ5TGVuID0gNDsKLQotICAgICAgICBtZW1jcHkoJnVwZGF0ZUJ1Zlt1Ymxlbl0sIHRpZ2h0QWZ0ZXJCdWYsIHBhbGV0dGVOdW1Db2xvcnMgKiBlbnRyeUxlbik7Ci0gICAgICAgIHVibGVuICs9IHBhbGV0dGVOdW1Db2xvcnMgKiBlbnRyeUxlbjsKLSAgICAgICAgY2wtPnJmYkJ5dGVzU2VudFtyZmJFbmNvZGluZ1RpZ2h0XSArPSAzICsgcGFsZXR0ZU51bUNvbG9ycyAqIGVudHJ5TGVuOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgMTY6Ci0gICAgICAgIEVuY29kZUluZGV4ZWRSZWN0MTYoKENBUkQ4ICopdGlnaHRCZWZvcmVCdWYsIHcgKiBoKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsZXR0ZU51bUNvbG9yczsgaSsrKSB7Ci0gICAgICAgICAgICAoKENBUkQxNiAqKXRpZ2h0QWZ0ZXJCdWYpW2ldID0KLSAgICAgICAgICAgICAgICAoQ0FSRDE2KXBhbGV0dGUuZW50cnlbaV0ubGlzdE5vZGUtPnJnYjsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSgmdXBkYXRlQnVmW3VibGVuXSwgdGlnaHRBZnRlckJ1ZiwgcGFsZXR0ZU51bUNvbG9ycyAqIDIpOwotICAgICAgICB1YmxlbiArPSBwYWxldHRlTnVtQ29sb3JzICogMjsKLSAgICAgICAgY2wtPnJmYkJ5dGVzU2VudFtyZmJFbmNvZGluZ1RpZ2h0XSArPSAzICsgcGFsZXR0ZU51bUNvbG9ycyAqIDI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gQ29tcHJlc3NEYXRhKGNsLCBzdHJlYW1JZCwgdyAqIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aWdodENvbmZbY29tcHJlc3NMZXZlbF0uaWR4WmxpYkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZKTsKLX0KLQotc3RhdGljIEJvb2wKLVNlbmRGdWxsQ29sb3JSZWN0KGNsLCB3LCBoKQotICAgIHJmYkNsaWVudFB0ciBjbDsKLSAgICBpbnQgdywgaDsKLXsKLSAgICBpbnQgc3RyZWFtSWQgPSAwOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAodWJsZW4gKyBUSUdIVF9NSU5fVE9fQ09NUFJFU1MgKyAxID4gVVBEQVRFX0JVRl9TSVpFKSB7Ci0gICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5yYXdabGliTGV2ZWwgPT0gMCkKLSAgICAgICAgdXBkYXRlQnVmW3VibGVuKytdID0gKGNoYXIpKHJmYlRpZ2h0Tm9abGliIDw8IDQpOwotICAgIGVsc2UKLSAgICAgICAgdXBkYXRlQnVmW3VibGVuKytdID0gMHgwMDsgIC8qIHN0cmVhbSBpZCA9IDAsIG5vIGZsdXNoaW5nLCBubyBmaWx0ZXIgKi8KLSAgICBjbC0+cmZiQnl0ZXNTZW50W3JmYkVuY29kaW5nVGlnaHRdKys7Ci0KLSAgICBpZiAodXNlUGl4ZWxGb3JtYXQyNCkgewotICAgICAgICBQYWNrMjQodGlnaHRCZWZvcmVCdWYsICZjbC0+Zm9ybWF0LCB3ICogaCk7Ci0gICAgICAgIGxlbiA9IDM7Ci0gICAgfSBlbHNlCi0gICAgICAgIGxlbiA9IGNsLT5mb3JtYXQuYml0c1BlclBpeGVsIC8gODsKLQotICAgIHJldHVybiBDb21wcmVzc0RhdGEoY2wsIHN0cmVhbUlkLCB3ICogaCAqIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpZ2h0Q29uZltjb21wcmVzc0xldmVsXS5yYXdabGliTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotfQotCi1zdGF0aWMgQm9vbAotQ29tcHJlc3NEYXRhKGNsLCBzdHJlYW1JZCwgZGF0YUxlbiwgemxpYkxldmVsLCB6bGliU3RyYXRlZ3kpCi0gICAgcmZiQ2xpZW50UHRyIGNsOwotICAgIGludCBzdHJlYW1JZCwgZGF0YUxlbiwgemxpYkxldmVsLCB6bGliU3RyYXRlZ3k7Ci17Ci0gICAgel9zdHJlYW1wIHB6OwotICAgIGludCBlcnIsIGk7Ci0KLSAgICBpZiAoZGF0YUxlbiA8IFRJR0hUX01JTl9UT19DT01QUkVTUykgewotICAgICAgICBtZW1jcHkoJnVwZGF0ZUJ1Zlt1Ymxlbl0sIHRpZ2h0QmVmb3JlQnVmLCBkYXRhTGVuKTsKLSAgICAgICAgdWJsZW4gKz0gZGF0YUxlbjsKLSAgICAgICAgY2wtPnJmYkJ5dGVzU2VudFtyZmJFbmNvZGluZ1RpZ2h0XSArPSBkYXRhTGVuOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBpZiAoemxpYkxldmVsID09IDApCi0gICAgICAgIHJldHVybiBTZW5kQ29tcHJlc3NlZERhdGEgKGNsLCB0aWdodEJlZm9yZUJ1ZiwgZGF0YUxlbik7Ci0KLSAgICBweiA9ICZjbC0+enNTdHJ1Y3Rbc3RyZWFtSWRdOwotCi0gICAgLyogSW5pdGlhbGl6ZSBjb21wcmVzc2lvbiBzdHJlYW0gaWYgbmVlZGVkLiAqLwotICAgIGlmICghY2wtPnpzQWN0aXZlW3N0cmVhbUlkXSkgewotICAgICAgICBwei0+emFsbG9jID0gWl9OVUxMOwotICAgICAgICBwei0+emZyZWUgPSBaX05VTEw7Ci0gICAgICAgIHB6LT5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgICAgICAgZXJyID0gZGVmbGF0ZUluaXQyIChweiwgemxpYkxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX01FTV9MRVZFTCwgemxpYlN0cmF0ZWd5KTsKLSAgICAgICAgaWYgKGVyciAhPSBaX09LKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGNsLT56c0FjdGl2ZVtzdHJlYW1JZF0gPSBUUlVFOwotICAgICAgICBjbC0+enNMZXZlbFtzdHJlYW1JZF0gPSB6bGliTGV2ZWw7Ci0gICAgfQotCi0gICAgLyogUHJlcGFyZSBidWZmZXIgcG9pbnRlcnMuICovCi0gICAgcHotPm5leHRfaW4gPSAoQnl0ZWYgKil0aWdodEJlZm9yZUJ1ZjsKLSAgICBwei0+YXZhaWxfaW4gPSBkYXRhTGVuOwotICAgIHB6LT5uZXh0X291dCA9IChCeXRlZiAqKXRpZ2h0QWZ0ZXJCdWY7Ci0gICAgcHotPmF2YWlsX291dCA9IHRpZ2h0QWZ0ZXJCdWZTaXplOwotCi0gICAgLyogQ2hhbmdlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgbmVlZGVkLiAqLwotICAgIGlmICh6bGliTGV2ZWwgIT0gY2wtPnpzTGV2ZWxbc3RyZWFtSWRdKSB7Ci0gICAgICAgIGlmIChkZWZsYXRlUGFyYW1zIChweiwgemxpYkxldmVsLCB6bGliU3RyYXRlZ3kpICE9IFpfT0spIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBjbC0+enNMZXZlbFtzdHJlYW1JZF0gPSB6bGliTGV2ZWw7Ci0gICAgfQotCi0gICAgLyogQWN0dWFsIGNvbXByZXNzaW9uLiAqLwotICAgIGlmICggZGVmbGF0ZSAocHosIFpfU1lOQ19GTFVTSCkgIT0gWl9PSyB8fAotICAgICAgICAgcHotPmF2YWlsX2luICE9IDAgfHwgcHotPmF2YWlsX291dCA9PSAwICkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNlbmRDb21wcmVzc2VkRGF0YShjbCwgdGlnaHRBZnRlckJ1ZiwKLSAgICAgICAgdGlnaHRBZnRlckJ1ZlNpemUgLSBwei0+YXZhaWxfb3V0KTsKLX0KLQotc3RhdGljIEJvb2wgU2VuZENvbXByZXNzZWREYXRhKGNsLCBidWYsIGNvbXByZXNzZWRMZW4pCi0gICAgcmZiQ2xpZW50UHRyIGNsOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgY29tcHJlc3NlZExlbjsKLXsKLSAgICBpbnQgaSwgcG9ydGlvbkxlbjsKLQotICAgIHVwZGF0ZUJ1Zlt1YmxlbisrXSA9IGNvbXByZXNzZWRMZW4gJiAweDdGOwotICAgIGNsLT5yZmJCeXRlc1NlbnRbcmZiRW5jb2RpbmdUaWdodF0rKzsKLSAgICBpZiAoY29tcHJlc3NlZExlbiA+IDB4N0YpIHsKLSAgICAgICAgdXBkYXRlQnVmW3VibGVuLTFdIHw9IDB4ODA7Ci0gICAgICAgIHVwZGF0ZUJ1Zlt1YmxlbisrXSA9IGNvbXByZXNzZWRMZW4gPj4gNyAmIDB4N0Y7Ci0gICAgICAgIGNsLT5yZmJCeXRlc1NlbnRbcmZiRW5jb2RpbmdUaWdodF0rKzsKLSAgICAgICAgaWYgKGNvbXByZXNzZWRMZW4gPiAweDNGRkYpIHsKLSAgICAgICAgICAgIHVwZGF0ZUJ1Zlt1Ymxlbi0xXSB8PSAweDgwOwotICAgICAgICAgICAgdXBkYXRlQnVmW3VibGVuKytdID0gY29tcHJlc3NlZExlbiA+PiAxNCAmIDB4RkY7Ci0gICAgICAgICAgICBjbC0+cmZiQnl0ZXNTZW50W3JmYkVuY29kaW5nVGlnaHRdKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwb3J0aW9uTGVuID0gVVBEQVRFX0JVRl9TSVpFOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb21wcmVzc2VkTGVuOyBpICs9IHBvcnRpb25MZW4pIHsKLSAgICAgICAgaWYgKGkgKyBwb3J0aW9uTGVuID4gY29tcHJlc3NlZExlbikgewotICAgICAgICAgICAgcG9ydGlvbkxlbiA9IGNvbXByZXNzZWRMZW4gLSBpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1YmxlbiArIHBvcnRpb25MZW4gPiBVUERBVEVfQlVGX1NJWkUpIHsKLSAgICAgICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgmdXBkYXRlQnVmW3VibGVuXSwgJmJ1ZltpXSwgcG9ydGlvbkxlbik7Ci0gICAgICAgIHVibGVuICs9IHBvcnRpb25MZW47Ci0gICAgfQotICAgIGNsLT5yZmJCeXRlc1NlbnRbcmZiRW5jb2RpbmdUaWdodF0gKz0gY29tcHJlc3NlZExlbjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAqIENvZGUgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGRpZmZlcmVudCBjb2xvcnMgdXNlZCBpbiByZWN0YW5nbGUuCi0gKi8KLQotc3RhdGljIHZvaWQKLUZpbGxQYWxldHRlOChjb3VudCkKLSAgICBpbnQgY291bnQ7Ci17Ci0gICAgQ0FSRDggKmRhdGEgPSAoQ0FSRDggKil0aWdodEJlZm9yZUJ1ZjsKLSAgICBDQVJEOCBjMCwgYzE7Ci0gICAgaW50IGksIG4wLCBuMTsKLQotICAgIHBhbGV0dGVOdW1Db2xvcnMgPSAwOwotCi0gICAgYzAgPSBkYXRhWzBdOwotICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudCAmJiBkYXRhW2ldID09IGMwOyBpKyspOwotICAgIGlmIChpID09IGNvdW50KSB7Ci0gICAgICAgIHBhbGV0dGVOdW1Db2xvcnMgPSAxOwotICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvKiBTb2xpZCByZWN0YW5nbGUgKi8KLSAgICB9Ci0KLSAgICBpZiAocGFsZXR0ZU1heENvbG9ycyA8IDIpCi0gICAgICAgIHJldHVybjsKLQotICAgIG4wID0gaTsKLSAgICBjMSA9IGRhdGFbaV07Ci0gICAgbjEgPSAwOwotICAgIGZvciAoaSsrOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBpZiAoZGF0YVtpXSA9PSBjMCkgewotICAgICAgICAgICAgbjArKzsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldID09IGMxKSB7Ci0gICAgICAgICAgICBuMSsrOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaSA9PSBjb3VudCkgewotICAgICAgICBpZiAobjAgPiBuMSkgewotICAgICAgICAgICAgbW9ub0JhY2tncm91bmQgPSAoQ0FSRDMyKWMwOwotICAgICAgICAgICAgbW9ub0ZvcmVncm91bmQgPSAoQ0FSRDMyKWMxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbW9ub0JhY2tncm91bmQgPSAoQ0FSRDMyKWMxOwotICAgICAgICAgICAgbW9ub0ZvcmVncm91bmQgPSAoQ0FSRDMyKWMwOwotICAgICAgICB9Ci0gICAgICAgIHBhbGV0dGVOdW1Db2xvcnMgPSAyOyAgIC8qIFR3byBjb2xvcnMgKi8KLSAgICB9Ci19Ci0KLSNkZWZpbmUgREVGSU5FX0ZJTExfUEFMRVRURV9GVU5DVElPTihicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLUZpbGxQYWxldHRlIyNicHAoY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDQVJEIyNicHAgKmRhdGEgPSAoQ0FSRCMjYnBwICopdGlnaHRCZWZvcmVCdWY7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDQVJEIyNicHAgYzAsIGMxLCBjaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaSwgbjAsIG4xLCBuaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjMCA9IGRhdGFbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkgPSAxOyBpIDwgY291bnQgJiYgZGF0YVtpXSA9PSBjMDsgaSsrKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaSA+PSBjb3VudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDE7ICAgLyogU29saWQgcmVjdGFuZ2xlICovICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocGFsZXR0ZU1heENvbG9ycyA8IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDA7ICAgLyogRnVsbC1jb2xvciBlbmNvZGluZyBwcmVmZXJyZWQgKi8gICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuMCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjMSA9IGRhdGFbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkrKzsgaSA8IGNvdW50OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2kgPSBkYXRhW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGNpID09IGMwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG4wKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIGlmIChjaSA9PSBjMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG4xKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaSA+PSBjb3VudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKG4wID4gbjEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9CYWNrZ3JvdW5kID0gKENBUkQzMiljMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9Gb3JlZ3JvdW5kID0gKENBUkQzMiljMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9CYWNrZ3JvdW5kID0gKENBUkQzMiljMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9Gb3JlZ3JvdW5kID0gKENBUkQzMiljMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDI7ICAgLyogVHdvIGNvbG9ycyAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlUmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjMCwgKENBUkQzMiluMCwgYnBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjMSwgKENBUkQzMiluMSwgYnBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkrKzsgaSA8IGNvdW50OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gY2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG5pKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICghUGFsZXR0ZUluc2VydCAoY2ksIChDQVJEMzIpbmksIGJwcCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNpID0gZGF0YVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG5pID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjaSwgKENBUkQzMiluaSwgYnBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotREVGSU5FX0ZJTExfUEFMRVRURV9GVU5DVElPTigxNikKLURFRklORV9GSUxMX1BBTEVUVEVfRlVOQ1RJT04oMzIpCi0KLSNkZWZpbmUgREVGSU5FX0ZBU1RfRklMTF9QQUxFVFRFX0ZVTkNUSU9OKGJwcCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLUZhc3RGaWxsUGFsZXR0ZSMjYnBwKGNsLCBkYXRhLCB3LCBwaXRjaCwgaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZmJDbGllbnRQdHIgY2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDQVJEIyNicHAgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgdywgcGl0Y2gsIGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDQVJEIyNicHAgYzAsIGMxLCBjaSwgbWFzaywgYzB0LCBjMXQsIGNpdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaSwgaiwgaTIsIGoyLCBuMCwgbjEsIG5pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY2wtPnRyYW5zbGF0ZUZuICE9IHJmYlRyYW5zbGF0ZU5vbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbWFzayA9IHJmYlNlcnZlckZvcm1hdC5yZWRNYXggPDwgcmZiU2VydmVyRm9ybWF0LnJlZFNoaWZ0OyAgICAgIFwKLSAgICAgICAgbWFzayB8PSByZmJTZXJ2ZXJGb3JtYXQuZ3JlZW5NYXggPDwgcmZiU2VydmVyRm9ybWF0LmdyZWVuU2hpZnQ7IFwKLSAgICAgICAgbWFzayB8PSByZmJTZXJ2ZXJGb3JtYXQuYmx1ZU1heCA8PCByZmJTZXJ2ZXJGb3JtYXQuYmx1ZVNoaWZ0OyAgIFwKLSAgICB9IGVsc2UgbWFzayA9IH4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjMCA9IGRhdGFbMF0gJiBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICgoZGF0YVtqICogcGl0Y2ggKyBpXSAmIG1hc2spICE9IGMwKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaiA+PSBoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDE7ICAgLyogU29saWQgcmVjdGFuZ2xlICovICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocGFsZXR0ZU1heENvbG9ycyA8IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDA7ICAgLyogRnVsbC1jb2xvciBlbmNvZGluZyBwcmVmZXJyZWQgKi8gICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuMCA9IGogKiB3ICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjMSA9IGRhdGFbaiAqIHBpdGNoICsgaV0gJiBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpKys7ICBpZiAoaSA+PSB3KSB7aSA9IDA7ICBqKys7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGoyID0gajsgajIgPCBoOyBqMisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChpMiA9IGk7IGkyIDwgdzsgaTIrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNpID0gZGF0YVtqMiAqIHBpdGNoICsgaTJdICYgbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmIChjaSA9PSBjMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBuMCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2kgPT0gYzEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBuMSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKmNsLT50cmFuc2xhdGVGbikoY2wtPnRyYW5zbGF0ZUxvb2t1cFRhYmxlLCAmcmZiU2VydmVyRm9ybWF0LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNsLT5mb3JtYXQsIChjaGFyICopJmMwLCAoY2hhciAqKSZjMHQsIGJwcC84LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKmNsLT50cmFuc2xhdGVGbikoY2wtPnRyYW5zbGF0ZUxvb2t1cFRhYmxlLCAmcmZiU2VydmVyRm9ybWF0LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNsLT5mb3JtYXQsIChjaGFyICopJmMxLCAoY2hhciAqKSZjMXQsIGJwcC84LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoajIgPj0gaCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKG4wID4gbjEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9CYWNrZ3JvdW5kID0gKENBUkQzMiljMHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9Gb3JlZ3JvdW5kID0gKENBUkQzMiljMXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9CYWNrZ3JvdW5kID0gKENBUkQzMiljMXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1vbm9Gb3JlZ3JvdW5kID0gKENBUkQzMiljMHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFsZXR0ZU51bUNvbG9ycyA9IDI7ICAgLyogVHdvIGNvbG9ycyAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlUmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjMHQsIChDQVJEMzIpbjAsIGJwcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjMXQsIChDQVJEMzIpbjEsIGJwcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpMisrOyAgaWYgKGkyID49IHcpIHtpMiA9IDA7ICBqMisrO30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGogPSBqMjsgaiA8IGg7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChpID0gaTI7IGkgPCB3OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICgoZGF0YVtqICogcGl0Y2ggKyBpXSAmIG1hc2spID09IGNpKSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBuaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoKmNsLT50cmFuc2xhdGVGbikoY2wtPnRyYW5zbGF0ZUxvb2t1cFRhYmxlLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJmYlNlcnZlckZvcm1hdCwgJmNsLT5mb3JtYXQsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmY2ksIChjaGFyICopJmNpdCwgYnBwLzgsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZiAoIVBhbGV0dGVJbnNlcnQgKGNpdCwgKENBUkQzMiluaSwgYnBwKSkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBjaSA9IGRhdGFbaiAqIHBpdGNoICsgaV0gJiBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBuaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaTIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKmNsLT50cmFuc2xhdGVGbikoY2wtPnRyYW5zbGF0ZUxvb2t1cFRhYmxlLCAmcmZiU2VydmVyRm9ybWF0LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNsLT5mb3JtYXQsIChjaGFyICopJmNpLCAoY2hhciAqKSZjaXQsIGJwcC84LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQYWxldHRlSW5zZXJ0IChjaXQsIChDQVJEMzIpbmksIGJwcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotREVGSU5FX0ZBU1RfRklMTF9QQUxFVFRFX0ZVTkNUSU9OKDE2KQotREVGSU5FX0ZBU1RfRklMTF9QQUxFVFRFX0ZVTkNUSU9OKDMyKQotCi0KLS8qCi0gKiBGdW5jdGlvbnMgdG8gb3BlcmF0ZSB3aXRoIHBhbGV0dGUgc3RydWN0dXJlcy4KLSAqLwotCi0jZGVmaW5lIEhBU0hfRlVOQzE2KHJnYikgKChpbnQpKCgoKHJnYikgPj4gOCkgKyAocmdiKSkgJiAweEZGKSkKLSNkZWZpbmUgSEFTSF9GVU5DMzIocmdiKSAoKGludCkoKCgocmdiKSA+PiAxNikgKyAoKHJnYikgPj4gOCkpICYgMHhGRikpCi0KLXN0YXRpYyB2b2lkCi1QYWxldHRlUmVzZXQodm9pZCkKLXsKLSAgICBwYWxldHRlTnVtQ29sb3JzID0gMDsKLSAgICBtZW1zZXQocGFsZXR0ZS5oYXNoLCAwLCAyNTYgKiBzaXplb2YoQ09MT1JfTElTVCAqKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLVBhbGV0dGVJbnNlcnQocmdiLCBudW1QaXhlbHMsIGJwcCkKLSAgICBDQVJEMzIgcmdiOwotICAgIGludCBudW1QaXhlbHM7Ci0gICAgaW50IGJwcDsKLXsKLSAgICBDT0xPUl9MSVNUICpwbm9kZTsKLSAgICBDT0xPUl9MSVNUICpwcmV2X3Bub2RlID0gTlVMTDsKLSAgICBpbnQgaGFzaF9rZXksIGlkeCwgbmV3X2lkeCwgY291bnQ7Ci0KLSAgICBoYXNoX2tleSA9IChicHAgPT0gMTYpID8gSEFTSF9GVU5DMTYocmdiKSA6IEhBU0hfRlVOQzMyKHJnYik7Ci0KLSAgICBwbm9kZSA9IHBhbGV0dGUuaGFzaFtoYXNoX2tleV07Ci0KLSAgICB3aGlsZSAocG5vZGUgIT0gTlVMTCkgewotICAgICAgICBpZiAocG5vZGUtPnJnYiA9PSByZ2IpIHsKLSAgICAgICAgICAgIC8qIFN1Y2ggcGFsZXR0ZSBlbnRyeSBhbHJlYWR5IGV4aXN0cy4gKi8KLSAgICAgICAgICAgIG5ld19pZHggPSBpZHggPSBwbm9kZS0+aWR4OwotICAgICAgICAgICAgY291bnQgPSBwYWxldHRlLmVudHJ5W2lkeF0ubnVtUGl4ZWxzICsgbnVtUGl4ZWxzOwotICAgICAgICAgICAgaWYgKG5ld19pZHggJiYgcGFsZXR0ZS5lbnRyeVtuZXdfaWR4LTFdLm51bVBpeGVscyA8IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBwYWxldHRlLmVudHJ5W25ld19pZHhdID0gcGFsZXR0ZS5lbnRyeVtuZXdfaWR4LTFdOwotICAgICAgICAgICAgICAgICAgICBwYWxldHRlLmVudHJ5W25ld19pZHhdLmxpc3ROb2RlLT5pZHggPSBuZXdfaWR4OwotICAgICAgICAgICAgICAgICAgICBuZXdfaWR4LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChuZXdfaWR4ICYmIHBhbGV0dGUuZW50cnlbbmV3X2lkeC0xXS5udW1QaXhlbHMgPCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XS5saXN0Tm9kZSA9IHBub2RlOwotICAgICAgICAgICAgICAgIHBub2RlLT5pZHggPSBuZXdfaWR4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFsZXR0ZS5lbnRyeVtuZXdfaWR4XS5udW1QaXhlbHMgPSBjb3VudDsKLSAgICAgICAgICAgIHJldHVybiBwYWxldHRlTnVtQ29sb3JzOwotICAgICAgICB9Ci0gICAgICAgIHByZXZfcG5vZGUgPSBwbm9kZTsKLSAgICAgICAgcG5vZGUgPSBwbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiBwYWxldHRlIGlzIGZ1bGwuICovCi0gICAgaWYgKHBhbGV0dGVOdW1Db2xvcnMgPT0gMjU2IHx8IHBhbGV0dGVOdW1Db2xvcnMgPT0gcGFsZXR0ZU1heENvbG9ycykgewotICAgICAgICBwYWxldHRlTnVtQ29sb3JzID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogTW92ZSBwYWxldHRlIGVudHJpZXMgd2l0aCBsZXNzZXIgcGl4ZWwgY291bnRzLiAqLwotICAgIGZvciAoIGlkeCA9IHBhbGV0dGVOdW1Db2xvcnM7Ci0gICAgICAgICAgaWR4ID4gMCAmJiBwYWxldHRlLmVudHJ5W2lkeC0xXS5udW1QaXhlbHMgPCBudW1QaXhlbHM7Ci0gICAgICAgICAgaWR4LS0gKSB7Ci0gICAgICAgIHBhbGV0dGUuZW50cnlbaWR4XSA9IHBhbGV0dGUuZW50cnlbaWR4LTFdOwotICAgICAgICBwYWxldHRlLmVudHJ5W2lkeF0ubGlzdE5vZGUtPmlkeCA9IGlkeDsKLSAgICB9Ci0KLSAgICAvKiBBZGQgbmV3IHBhbGV0dGUgZW50cnkgaW50byB0aGUgZnJlZWQgc2xvdC4gKi8KLSAgICBwbm9kZSA9ICZwYWxldHRlLmxpc3RbcGFsZXR0ZU51bUNvbG9yc107Ci0gICAgaWYgKHByZXZfcG5vZGUgIT0gTlVMTCkgewotICAgICAgICBwcmV2X3Bub2RlLT5uZXh0ID0gcG5vZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFsZXR0ZS5oYXNoW2hhc2hfa2V5XSA9IHBub2RlOwotICAgIH0KLSAgICBwbm9kZS0+bmV4dCA9IE5VTEw7Ci0gICAgcG5vZGUtPmlkeCA9IGlkeDsKLSAgICBwbm9kZS0+cmdiID0gcmdiOwotICAgIHBhbGV0dGUuZW50cnlbaWR4XS5saXN0Tm9kZSA9IHBub2RlOwotICAgIHBhbGV0dGUuZW50cnlbaWR4XS5udW1QaXhlbHMgPSBudW1QaXhlbHM7Ci0KLSAgICByZXR1cm4gKCsrcGFsZXR0ZU51bUNvbG9ycyk7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnRpbmcgMzItYml0IGNvbG9yIHNhbXBsZXMgaW50byAyNC1iaXQgY29sb3JzLgotICogU2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gcmVkTWF4LCBncmVlbk1heCBhbmQgYmx1ZU1heCBhcmUgMjU1LgotICogQ29sb3IgY29tcG9uZW50cyBhc3N1bWVkIHRvIGJlIGJ5dGUtYWxpZ25lZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBQYWNrMjQoYnVmLCBmbXQsIGNvdW50KQotICAgIGNoYXIgKmJ1ZjsKLSAgICByZmJQaXhlbEZvcm1hdCAqZm10OwotICAgIGludCBjb3VudDsKLXsKLSAgICBDQVJEMzIgKmJ1ZjMyOwotICAgIENBUkQzMiBwaXg7Ci0gICAgaW50IHJfc2hpZnQsIGdfc2hpZnQsIGJfc2hpZnQ7Ci0KLSAgICBidWYzMiA9IChDQVJEMzIgKilidWY7Ci0KLSAgICBpZiAoIXJmYlNlcnZlckZvcm1hdC5iaWdFbmRpYW4gPT0gIWZtdC0+YmlnRW5kaWFuKSB7Ci0gICAgICAgIHJfc2hpZnQgPSBmbXQtPnJlZFNoaWZ0OwotICAgICAgICBnX3NoaWZ0ID0gZm10LT5ncmVlblNoaWZ0OwotICAgICAgICBiX3NoaWZ0ID0gZm10LT5ibHVlU2hpZnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcl9zaGlmdCA9IDI0IC0gZm10LT5yZWRTaGlmdDsKLSAgICAgICAgZ19zaGlmdCA9IDI0IC0gZm10LT5ncmVlblNoaWZ0OwotICAgICAgICBiX3NoaWZ0ID0gMjQgLSBmbXQtPmJsdWVTaGlmdDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY291bnQtLSkgewotICAgICAgICBwaXggPSAqYnVmMzIrKzsKLSAgICAgICAgKmJ1ZisrID0gKGNoYXIpKHBpeCA+PiByX3NoaWZ0KTsKLSAgICAgICAgKmJ1ZisrID0gKGNoYXIpKHBpeCA+PiBnX3NoaWZ0KTsKLSAgICAgICAgKmJ1ZisrID0gKGNoYXIpKHBpeCA+PiBiX3NoaWZ0KTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnRpbmcgdHJ1ZWNvbG9yIHNhbXBsZXMgaW50byBwYWxldHRlIGluZGljZXMuCi0gKi8KLQotI2RlZmluZSBERUZJTkVfSURYX0VOQ09ERV9GVU5DVElPTihicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotRW5jb2RlSW5kZXhlZFJlY3QjI2JwcChidWYsIGNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQ4ICpidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTE9SX0xJU1QgKnBub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQjI2JwcCAqc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENBUkQjI2JwcCByZ2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCByZXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNyYyA9IChDQVJEIyNicHAgKikgYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlIChjb3VudC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZ2IgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB3aGlsZSAoY291bnQgJiYgKnNyYyA9PSByZ2IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmVwKyssIHNyYysrLCBjb3VudC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwbm9kZSA9IHBhbGV0dGUuaGFzaFtIQVNIX0ZVTkMjI2JwcChyZ2IpXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB3aGlsZSAocG5vZGUgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKChDQVJEIyNicHApcG5vZGUtPnJnYiA9PSByZ2IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICpidWYrKyA9IChDQVJEOClwbm9kZS0+aWR4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHdoaWxlIChyZXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAqYnVmKysgPSAoQ0FSRDgpcG5vZGUtPmlkeDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICByZXAtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcG5vZGUgPSBwbm9kZS0+bmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1ERUZJTkVfSURYX0VOQ09ERV9GVU5DVElPTigxNikKLURFRklORV9JRFhfRU5DT0RFX0ZVTkNUSU9OKDMyKQotCi0jZGVmaW5lIERFRklORV9NT05PX0VOQ09ERV9GVU5DVElPTihicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1FbmNvZGVNb25vUmVjdCMjYnBwKGJ1ZiwgdywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0FSRDggKmJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHcsIGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0FSRCMjYnBwICpwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0FSRCMjYnBwIGJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5zaWduZWQgaW50IHZhbHVlLCBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGFsaWduZWRfd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHgsIHksIGJnX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHRyID0gKENBUkQjI2JwcCAqKSBidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmcgPSAoQ0FSRCMjYnBwKSBtb25vQmFja2dyb3VuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWxpZ25lZF93aWR0aCA9IHcgLSB3ICUgODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoeCA9IDA7IHggPCBhbGlnbmVkX3dpZHRoOyB4ICs9IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmb3IgKGJnX2JpdHMgPSAwOyBiZ19iaXRzIDwgODsgYmdfYml0cysrKSB7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaWYgKCpwdHIrKyAhPSBiZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoYmdfYml0cyA9PSA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKmJ1ZisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBtYXNrID0gMHg4MCA+PiBiZ19iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB2YWx1ZSA9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmb3IgKGJnX2JpdHMrKzsgYmdfYml0cyA8IDg7IGJnX2JpdHMrKykgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbWFzayA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaWYgKCpwdHIrKyAhPSBiZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAqYnVmKysgPSAoQ0FSRDgpdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG1hc2sgPSAweDgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHZhbHVlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh4ID49IHcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoOyB4IDwgdzsgeCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoKnB0cisrICE9IGJnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdmFsdWUgfD0gbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBtYXNrID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICpidWYrKyA9IChDQVJEOCl2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLURFRklORV9NT05PX0VOQ09ERV9GVU5DVElPTig4KQotREVGSU5FX01PTk9fRU5DT0RFX0ZVTkNUSU9OKDE2KQotREVGSU5FX01PTk9fRU5DT0RFX0ZVTkNUSU9OKDMyKQotCi0vKgotICogSlBFRyBjb21wcmVzc2lvbiBzdHVmZi4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBqcGVnRHN0RGF0YUxlbjsKLXN0YXRpYyB0amhhbmRsZSBqPU5VTEw7Ci0KLXN0YXRpYyBCb29sCi1TZW5kSnBlZ1JlY3QoY2wsIHgsIHksIHcsIGgsIHF1YWxpdHkpCi0gICAgcmZiQ2xpZW50UHRyIGNsOwotICAgIGludCB4LCB5LCB3LCBoOwotICAgIGludCBxdWFsaXR5OwotewotICAgIGludCBkeTsKLSAgICB1bnNpZ25lZCBjaGFyICpzcmNidWY7Ci0gICAgaW50IHBzPXJmYlNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwvODsKLSAgICBpbnQgc3Vic2FtcD1zdWJzYW1wTGV2ZWwydGpzdWJzYW1wW3N1YnNhbXBMZXZlbF07Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplPTA7Ci0gICAgaW50IGZsYWdzPTAsIHBpdGNoOwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcGJ1Zj1OVUxMOwotCi0gICAgaWYgKHJmYlNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwgPT0gOCkKLSAgICAgICAgcmV0dXJuIFNlbmRGdWxsQ29sb3JSZWN0KGNsLCB3LCBoKTsKLQotCi0gICAgaWYocHM8MikgewotICAgICAgcmZiTG9nKCJFcnJvcjogSlBFRyByZXF1aXJlcyAxNi1iaXQsIDI0LWJpdCwgb3IgMzItYml0IHBpeGVsIGZvcm1hdC5cbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKCFqKSB7Ci0gICAgICBpZigoaj10akluaXRDb21wcmVzcygpKT09TlVMTCkgewotICAgICAgICByZmJMb2coIkpQRUcgRXJyb3I6ICVzXG4iLCB0akdldEVycm9yU3RyKCkpOyAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRpZ2h0QWZ0ZXJCdWZTaXplIDwgVEpCVUZTSVpFKHcsaCkpIHsKLSAgICAgICAgaWYgKHRpZ2h0QWZ0ZXJCdWYgPT0gTlVMTCkKLSAgICAgICAgICAgIHRpZ2h0QWZ0ZXJCdWYgPSAoY2hhciAqKXhhbGxvYyhUSkJVRlNJWkUodyxoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRpZ2h0QWZ0ZXJCdWYgPSAoY2hhciAqKXhyZWFsbG9jKHRpZ2h0QWZ0ZXJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSkJVRlNJWkUodyxoKSk7Ci0gICAgICAgIGlmKCF0aWdodEFmdGVyQnVmKSB7Ci0gICAgICAgICAgICByZmJMb2coIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUhXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRpZ2h0QWZ0ZXJCdWZTaXplID0gVEpCVUZTSVpFKHcsaCk7Ci0gICAgfQotCi0gICAgaWYgKHBzID09IDIpIHsKLSAgICAgICAgQ0FSRDE2ICpzcmNwdHIsIHBpeDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0OwotICAgICAgICBpbnQgaW5SZWQsIGluR3JlZW4sIGluQmx1ZSwgaSwgajsKLQotICAgICAgICBpZigodG1wYnVmPSh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHcqaCozKSk9PU5VTEwpCi0gICAgICAgICAgICByZmJMb2coIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUhXG4iKTsKLSAgICAgICAgc3JjcHRyID0gKENBUkQxNiAqKQotICAgICAgICAgICAgJnJmYlNjcmVlbi5wZmJNZW1vcnlbeSAqIHJmYlNjcmVlbi5wYWRkZWRXaWR0aEluQnl0ZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAqIHBzXTsKLSAgICAgICAgZHN0ID0gdG1wYnVmOwotICAgICAgICBmb3Ioaj0wOyBqPGg7IGorKykgewotICAgICAgICAgICAgQ0FSRDE2ICpzcmNwdHIyPXNyY3B0cjsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdDI9ZHN0OwotICAgICAgICAgICAgZm9yKGk9MDsgaTx3OyBpKyspIHsKLSAgICAgICAgICAgICAgICBwaXggPSAqc3JjcHRyMisrOwotICAgICAgICAgICAgICAgIGluUmVkID0gKGludCkKLSAgICAgICAgICAgICAgICAgICAgKHBpeCA+PiByZmJTZXJ2ZXJGb3JtYXQucmVkU2hpZnQgICAmIHJmYlNlcnZlckZvcm1hdC5yZWRNYXgpOwotICAgICAgICAgICAgICAgIGluR3JlZW4gPSAoaW50KQotICAgICAgICAgICAgICAgICAgICAocGl4ID4+IHJmYlNlcnZlckZvcm1hdC5ncmVlblNoaWZ0ICYgcmZiU2VydmVyRm9ybWF0LmdyZWVuTWF4KTsKLSAgICAgICAgICAgICAgICBpbkJsdWUgID0gKGludCkKLSAgICAgICAgICAgICAgICAgICAgKHBpeCA+PiByZmJTZXJ2ZXJGb3JtYXQuYmx1ZVNoaWZ0ICAmIHJmYlNlcnZlckZvcm1hdC5ibHVlTWF4KTsKLSAgICAgICAgICAgICAgICAqZHN0MisrID0gKENBUkQ4KSgoaW5SZWQgICAqIDI1NSArIHJmYlNlcnZlckZvcm1hdC5yZWRNYXggLyAyKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNlcnZlckZvcm1hdC5yZWRNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAJKmRzdDIrKyA9IChDQVJEOCkoKGluR3JlZW4gKiAyNTUgKyByZmJTZXJ2ZXJGb3JtYXQuZ3JlZW5NYXggLyAyKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJmYlNlcnZlckZvcm1hdC5ncmVlbk1heCk7Ci0gICAgICAgICAgICAgICAgKmRzdDIrKyA9IChDQVJEOCkoKGluQmx1ZSAgKiAyNTUgKyByZmJTZXJ2ZXJGb3JtYXQuYmx1ZU1heCAvIDIpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmZiU2VydmVyRm9ybWF0LmJsdWVNYXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjcHRyKz1yZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzL3BzOwotICAgICAgICAgICAgZHN0Kz13KjM7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjYnVmID0gdG1wYnVmOwotICAgICAgICBwaXRjaCA9IHcqMzsKLSAgICAgICAgcHMgPSAzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKHJmYlNlcnZlckZvcm1hdC5iaWdFbmRpYW4gJiYgcHM9PTQpIGZsYWdzfD1USl9BTFBIQUZJUlNUOwotICAgICAgICBpZihyZmJTZXJ2ZXJGb3JtYXQucmVkU2hpZnQ9PTE2ICYmIHJmYlNlcnZlckZvcm1hdC5ibHVlU2hpZnQ9PTApCi0gICAgICAgICAgICBmbGFnc3w9VEpfQkdSOwotICAgICAgICBpZihyZmJTZXJ2ZXJGb3JtYXQuYmlnRW5kaWFuKSBmbGFnc149VEpfQkdSOwotICAgICAgICBzcmNidWY9KHVuc2lnbmVkIGNoYXIgKikmcmZiU2NyZWVuLnBmYk1lbW9yeVt5ICogCi0gICAgICAgICAgICByZmJTY3JlZW4ucGFkZGVkV2lkdGhJbkJ5dGVzICsgeCAqIHBzXTsKLSAgICAgICAgcGl0Y2g9cmZiU2NyZWVuLnBhZGRlZFdpZHRoSW5CeXRlczsKLSAgICB9Ci0KLSAgICBpZih0akNvbXByZXNzKGosIHNyY2J1ZiwgdywgcGl0Y2gsIGgsIHBzLCAodW5zaWduZWQgY2hhciAqKXRpZ2h0QWZ0ZXJCdWYsCi0gICAgICAmc2l6ZSwgc3Vic2FtcCwgcXVhbGl0eSwgZmxhZ3MpPT0tMSkgewotICAgICAgcmZiTG9nKCJKUEVHIEVycm9yOiAlc1xuIiwgdGpHZXRFcnJvclN0cigpKTsKLSAgICAgIGlmKHRtcGJ1Zikge2ZyZWUodG1wYnVmKTsgIHRtcGJ1Zj1OVUxMO30KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBqcGVnRHN0RGF0YUxlbj0oaW50KXNpemU7Ci0KLSAgICBpZih0bXBidWYpIHtmcmVlKHRtcGJ1Zik7ICB0bXBidWY9TlVMTDt9Ci0KLSAgICBpZiAodWJsZW4gKyBUSUdIVF9NSU5fVE9fQ09NUFJFU1MgKyAxID4gVVBEQVRFX0JVRl9TSVpFKSB7Ci0gICAgICAgIGlmICghcmZiU2VuZFVwZGF0ZUJ1ZihjbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgdXBkYXRlQnVmW3VibGVuKytdID0gKGNoYXIpKHJmYlRpZ2h0SnBlZyA8PCA0KTsKLSAgICBjbC0+cmZiQnl0ZXNTZW50W3JmYkVuY29kaW5nVGlnaHRdKys7Ci0KLSAgICByZXR1cm4gU2VuZENvbXByZXNzZWREYXRhKGNsLCB0aWdodEFmdGVyQnVmLCBqcGVnRHN0RGF0YUxlbik7Ci19CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy90dXJib3ZuYy90dXJib2pwZWcuaCBiL3gxMXZuYy9taXNjL3R1cmJvdm5jL3R1cmJvanBlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZhZjA1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL3R1cmJvanBlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykyMDA0IExhbmRtYXJrIEdyYXBoaWNzCi0gKiBDb3B5cmlnaHQgKEMpMjAwNSwgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmUgYW5kIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSB3eFdpbmRvd3MgTGlicmFyeSBMaWNlbnNlLCBWZXJzaW9uIDMgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uICBUaGUgZnVsbCBsaWNlbnNlIGlzIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGluY2x1ZGVkCi0gKiB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIHd4V2luZG93cyBMaWJyYXJ5IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpICYmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKERMTERFRklORSkKLSNkZWZpbmUgRExMRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2Vsc2UKLSNkZWZpbmUgRExMRVhQT1JUCi0jZW5kaWYKLQotI2RlZmluZSBETExDQUxMCi0KLS8qIFN1YnNhbXBsaW5nICovCi0jZGVmaW5lIE5VTVNVQk9QVCA0Ci0KLWVudW0ge1RKXzQ0ND0wLCBUSl80MjIsIFRKXzQxMSwgVEpfR1JBWVNDQUxFfTsKLQotLyogRmxhZ3MgKi8KLSNkZWZpbmUgVEpfQkdSICAgICAgIDEKLSNkZWZpbmUgVEpfQk9UVE9NVVAgIDIKLSNkZWZpbmUgVEpfRk9SQ0VNTVggIDggICAvKiBGb3JjZSBJUFAgdG8gdXNlIE1NWCBjb2RlIGV2ZW4gaWYgU1NFIGF2YWlsYWJsZSAqLwotI2RlZmluZSBUSl9GT1JDRVNTRSAgMTYgIC8qIEZvcmNlIElQUCB0byB1c2UgU1NFMSBjb2RlIGV2ZW4gaWYgU1NFMiBhdmFpbGFibGUgKi8KLSNkZWZpbmUgVEpfRk9SQ0VTU0UyIDMyICAvKiBGb3JjZSBJUFAgdG8gdXNlIFNTRTIgY29kZSAodXNlZnVsIGlmIGF1dG8tZGV0ZWN0IGlzIG5vdCB3b3JraW5nIHByb3Blcmx5KSAqLwotI2RlZmluZSBUSl9BTFBIQUZJUlNUIDY0IC8qIEJHUiBidWZmZXIgaXMgQUJHUiBhbmQgUkdCIGJ1ZmZlciBpcyBBUkdCICovCi0jZGVmaW5lIFRKX0ZPUkNFU1NFMyAxMjggLyogRm9yY2UgSVBQIHRvIHVzZSBTU0UzIGNvZGUgKHVzZWZ1bCBpZiBhdXRvLWRldGVjdCBpcyBub3Qgd29ya2luZyBwcm9wZXJseSkgKi8KLQotdHlwZWRlZiB2b2lkKiB0amhhbmRsZTsKLQotI2RlZmluZSBUSlBBRChwKSAoKChwKSszKSYofjMpKQotI2lmbmRlZiBtYXgKLSAjZGVmaW5lIG1heChhLGIpICgoYSk+KGIpPyhhKTooYikpCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBBUEkgZm9sbG93cyAqLwotCi0KLS8qCi0gIHRqaGFuZGxlIHRqSW5pdENvbXByZXNzKHZvaWQpCi0KLSAgQ3JlYXRlcyBhIG5ldyBKUEVHIGNvbXByZXNzb3IgaW5zdGFuY2UsIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBzdHJ1Y3R1cmVzLAotICBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgaW5zdGFuY2UuICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIG9ubHkKLSAgbmVlZCB0byBjYWxsIHRoaXMgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIG9yIG9uY2UgZm9yIGVhY2gKLSAgY29uY3VycmVudCB0aHJlYWQuICBEb24ndCB0cnkgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIGV2ZXJ5IHRpbWUgeW91Ci0gIGNvbXByZXNzIGFuIGltYWdlLCBiZWNhdXNlIHRoaXMgd2lsbCBjYXVzZSBwZXJmb3JtYW5jZSB0byBzdWZmZXIuCi0KLSAgUkVUVVJOUzogTlVMTCBvbiBlcnJvcgotKi8KLURMTEVYUE9SVCB0amhhbmRsZSBETExDQUxMIHRqSW5pdENvbXByZXNzKHZvaWQpOwotCi0KLS8qCi0gIGludCB0akNvbXByZXNzKHRqaGFuZGxlIGosCi0gICAgIHVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgaW50IHdpZHRoLCBpbnQgcGl0Y2gsIGludCBoZWlnaHQsIGludCBwaXhlbHNpemUsCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRzdGJ1ZiwgdW5zaWduZWQgbG9uZyAqc2l6ZSwKLSAgICAgaW50IGpwZWdzdWJzYW1wLCBpbnQganBlZ3F1YWwsIGludCBmbGFncykKLQotICBbSU5QVVRdIGogPSBpbnN0YW5jZSBoYW5kbGUgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0bwotICAgICB0akluaXRDb21wcmVzcygpCi0gIFtJTlBVVF0gc3JjYnVmID0gcG9pbnRlciB0byB1c2VyLWFsbG9jYXRlZCBpbWFnZSBidWZmZXIgY29udGFpbmluZyBwaXhlbHMgaW4KLSAgICAgUkdCKEEpIG9yIEJHUihBKSBmb3JtCi0gIFtJTlBVVF0gd2lkdGggPSAgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIHNvdXJjZSBpbWFnZQotICBbSU5QVVRdIHBpdGNoID0gYnl0ZXMgcGVyIGxpbmUgb2YgdGhlIHNvdXJjZSBpbWFnZSAod2lkdGgqcGl4ZWxzaXplIGlmIHRoZQotICAgICBiaXRtYXAgaXMgdW5wYWRkZWQsIGVsc2UgVEpQQUQod2lkdGgqcGl4ZWxzaXplKSBpZiBlYWNoIGxpbmUgb2YgdGhlIGJpdG1hcAotICAgICBpcyBwYWRkZWQgdG8gdGhlIG5lYXJlc3QgMzItYml0IGJvdW5kYXJ5LCBzdWNoIGFzIGlzIHRoZSBjYXNlIGZvciBXaW5kb3dzCi0gICAgIGJpdG1hcHMuICBZb3UgY2FuIGFsc28gYmUgY2xldmVyIGFuZCB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gc2tpcCBsaW5lcywgZXRjLiwKLSAgICAgYXMgbG9uZyBhcyB0aGUgcGl0Y2ggaXMgZ3JlYXRlciB0aGFuIDAuKQotICBbSU5QVVRdIGhlaWdodCA9IGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGUgc291cmNlIGltYWdlCi0gIFtJTlBVVF0gcGl4ZWxzaXplID0gc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggcGl4ZWwgaW4gdGhlIHNvdXJjZSBpbWFnZQotICAgICBSR0JBIGFuZCBCR1JBOiA0LCBSR0IgYW5kIEJHUjogMwotICBbSU5QVVRdIGRzdGJ1ZiA9IHBvaW50ZXIgdG8gdXNlci1hbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIHdoaWNoIHdpbGwgcmVjZWl2ZQotICAgICB0aGUgSlBFRyBpbWFnZS4gIFVzZSB0aGUgbWFjcm8gVEpCVUZTSVpFKHdpZHRoLCBoZWlnaHQpIHRvIGRldGVybWluZQotICAgICB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBmb3IgdGhpcyBidWZmZXIgYmFzZWQgb24gdGhlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQuCi0gIFtPVVRQVVRdIHNpemUgPSBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgd2hpY2ggcmVjZWl2ZXMgdGhlIHNpemUgKGluIGJ5dGVzKQotICAgICBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZQotICBbSU5QVVRdIGpwZWdzdWJzYW1wID0gU3BlY2lmaWVzIGVpdGhlciA0OjE6MSwgNDoyOjIsIG9yIDQ6NDo0IHN1YnNhbXBsaW5nLgotICAgICBXaGVuIHRoZSBpbWFnZSBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgUkdCIHRvIFlDYkNyIGNvbG9yc3BhY2UgYXMgcGFydCBvZiB0aGUKLSAgICAgSlBFRyBjb21wcmVzc2lvbiBwcm9jZXNzLCBldmVyeSBvdGhlciBDYiBhbmQgQ3IgKGNocm9taW5hbmNlKSBwaXhlbCBjYW4gYmUKLSAgICAgZGlzY2FyZGVkIHRvIHByb2R1Y2UgYSBzbWFsbGVyIGltYWdlIHdpdGggbGl0dGxlIHBlcmNlcHRpYmxlIGxvc3Mgb2YKLSAgICAgaW1hZ2UgY2xhcml0eSAodGhlIGh1bWFuIGV5ZSBpcyBtb3JlIHNlbnNpdGl2ZSB0byBzbWFsbCBjaGFuZ2VzIGluCi0gICAgIGJyaWdodG5lc3MgdGhhbiBzbWFsbCBjaGFuZ2VzIGluIGNvbG9yLikKLQotICAgICBUSl80MTE6IDQ6MToxIHN1YnNhbXBsaW5nLiAgRGlzY2FyZHMgZXZlcnkgb3RoZXIgQ2IsIENyIHBpeGVsIGluIGJvdGgKLSAgICAgICAgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlyZWN0aW9ucy4KLSAgICAgVEpfNDIyOiA0OjI6MiBzdWJzYW1wbGluZy4gIERpc2NhcmRzIGV2ZXJ5IG90aGVyIENiLCBDciBwaXhlbCBvbmx5IGluCi0gICAgICAgIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbi4KLSAgICAgVEpfNDQ0OiBubyBzdWJzYW1wbGluZy4KLSAgICAgVEpfR1JBWVNDQUxFOiBHZW5lcmF0ZSBncmF5c2NhbGUgSlBFRyBpbWFnZQotCi0gIFtJTlBVVF0ganBlZ3F1YWwgPSBKUEVHIHF1YWxpdHkgKGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAgaW5jbHVzaXZlLikKLSAgW0lOUFVUXSBmbGFncyA9IHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKLQotICAgICBUSl9CR1I6IFRoZSBjb21wb25lbnRzIG9mIGVhY2ggcGl4ZWwgaW4gdGhlIHNvdXJjZSBpbWFnZSBhcmUgc3RvcmVkIGluCi0gICAgICAgIEIsRyxSIG9yZGVyLCBub3QgUixHLEIKLSAgICAgVEpfQk9UVE9NVVA6IFRoZSBzb3VyY2UgaW1hZ2UgaXMgc3RvcmVkIGluIGJvdHRvbS11cCAoV2luZG93cykgb3JkZXIsCi0gICAgICAgIG5vdCB0b3AtZG93bgotICAgICBUSl9GT1JDRU1NWDogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjb2RlYy0tIGZvcmNlIElQUCB0byB1c2UgTU1YIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0gICAgIFRKX0ZPUkNFU1NFOiBWYWxpZCBvbmx5IGZvciB0aGUgSW50ZWwgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UgY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSAgICAgVEpfRk9SQ0VTU0UyOiBWYWxpZCBvbmx5IGZvciB0aGUgSW50ZWwgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UyIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0gICAgIFRKX0ZPUkNFU1NFMzogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjb2RlYy0tIGZvcmNlIElQUCB0byB1c2UgU1NFMyBjb2RlIChieXBhc3MgQ1BVIGF1dG8tZGV0ZWN0aW9uKQotCi0gIFJFVFVSTlM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSovCi1ETExFWFBPUlQgaW50IERMTENBTEwgdGpDb21wcmVzcyh0amhhbmRsZSBqLAotCXVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgaW50IHdpZHRoLCBpbnQgcGl0Y2gsIGludCBoZWlnaHQsIGludCBwaXhlbHNpemUsCi0JdW5zaWduZWQgY2hhciAqZHN0YnVmLCB1bnNpZ25lZCBsb25nICpzaXplLAotCWludCBqcGVnc3Vic2FtcCwgaW50IGpwZWdxdWFsLCBpbnQgZmxhZ3MpOwotCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBETExDQUxMIFRKQlVGU0laRShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0vKgotICB0amhhbmRsZSB0akluaXREZWNvbXByZXNzKHZvaWQpCi0KLSAgQ3JlYXRlcyBhIG5ldyBKUEVHIGRlY29tcHJlc3NvciBpbnN0YW5jZSwgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlCi0gIHN0cnVjdHVyZXMsIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBpbnN0YW5jZS4gIE1vc3QgYXBwbGljYXRpb25zIHdpbGwKLSAgb25seSBuZWVkIHRvIGNhbGwgdGhpcyBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gb3Igb25jZSBmb3IgZWFjaAotICBjb25jdXJyZW50IHRocmVhZC4gIERvbid0IHRyeSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSB5b3UKLSAgZGVjb21wcmVzcyBhbiBpbWFnZSwgYmVjYXVzZSB0aGlzIHdpbGwgY2F1c2UgcGVyZm9ybWFuY2UgdG8gc3VmZmVyLgotCi0gIFJFVFVSTlM6IE5VTEwgb24gZXJyb3IKLSovCi1ETExFWFBPUlQgdGpoYW5kbGUgRExMQ0FMTCB0akluaXREZWNvbXByZXNzKHZvaWQpOwotCi0KLS8qCi0gIGludCB0akRlY29tcHJlc3NIZWFkZXIodGpoYW5kbGUgaiwKLSAgICAgdW5zaWduZWQgY2hhciAqc3JjYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsCi0gICAgIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KQotCi0gIFtJTlBVVF0gaiA9IGluc3RhbmNlIGhhbmRsZSBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gYSBjYWxsIHRvCi0gICAgIHRqSW5pdERlY29tcHJlc3MoKQotICBbSU5QVVRdIHNyY2J1ZiA9IHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyB0aGUgSlBFRyBpbWFnZQotICAgICB0byBkZWNvbXByZXNzCi0gIFtJTlBVVF0gc2l6ZSA9IHNpemUgb2YgdGhlIEpQRUcgaW1hZ2UgYnVmZmVyIChpbiBieXRlcykKLSAgW09VVFBVVF0gd2lkdGggPSB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgSlBFRyBpbWFnZQotICBbT1VUUFVUXSBoZWlnaHQgPSBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIEpQRUcgaW1hZ2UKLQotICBSRVRVUk5TOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0qLwotRExMRVhQT1JUIGludCBETExDQUxMIHRqRGVjb21wcmVzc0hlYWRlcih0amhhbmRsZSBqLAotCXVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotCWludCAqd2lkdGgsIGludCAqaGVpZ2h0KTsKLQotCi0vKgotICBpbnQgdGpEZWNvbXByZXNzKHRqaGFuZGxlIGosCi0gICAgIHVuc2lnbmVkIGNoYXIgKnNyY2J1ZiwgdW5zaWduZWQgbG9uZyBzaXplLAotICAgICB1bnNpZ25lZCBjaGFyICpkc3RidWYsIGludCB3aWR0aCwgaW50IHBpdGNoLCBpbnQgaGVpZ2h0LCBpbnQgcGl4ZWxzaXplLAotICAgICBpbnQgZmxhZ3MpCi0KLSAgW0lOUFVUXSBqID0gaW5zdGFuY2UgaGFuZGxlIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8KLSAgICAgdGpJbml0RGVjb21wcmVzcygpCi0gIFtJTlBVVF0gc3JjYnVmID0gcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBKUEVHIGltYWdlCi0gICAgIHRvIGRlY29tcHJlc3MKLSAgW0lOUFVUXSBzaXplID0gc2l6ZSBvZiB0aGUgSlBFRyBpbWFnZSBidWZmZXIgKGluIGJ5dGVzKQotICBbSU5QVVRdIGRzdGJ1ZiA9IHBvaW50ZXIgdG8gdXNlci1hbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIHdoaWNoIHdpbGwgcmVjZWl2ZQotICAgICB0aGUgYml0bWFwIGltYWdlLiAgVGhpcyBidWZmZXIgc2hvdWxkIG5vcm1hbGx5IGJlIHBpdGNoKmhlaWdodAotICAgICBieXRlcyBpbiBzaXplLCBhbHRob3VnaCB0aGlzIHBvaW50ZXIgbWF5IGFsc28gYmUgdXNlZCB0byBkZWNvbXByZXNzIGludG8KLSAgICAgYSBzcGVjaWZpYyByZWdpb24gb2YgYSBsYXJnZXIgYnVmZmVyLgotICBbSU5QVVRdIHdpZHRoID0gIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQotICBbSU5QVVRdIHBpdGNoID0gYnl0ZXMgcGVyIGxpbmUgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlICh3aWR0aCpwaXhlbHNpemUgaWYgdGhlCi0gICAgIGJpdG1hcCBpcyB1bnBhZGRlZCwgZWxzZSBUSlBBRCh3aWR0aCpwaXhlbHNpemUpIGlmIGVhY2ggbGluZSBvZiB0aGUgYml0bWFwCi0gICAgIGlzIHBhZGRlZCB0byB0aGUgbmVhcmVzdCAzMi1iaXQgYm91bmRhcnksIHN1Y2ggYXMgaXMgdGhlIGNhc2UgZm9yIFdpbmRvd3MKLSAgICAgYml0bWFwcy4gIFlvdSBjYW4gYWxzbyBiZSBjbGV2ZXIgYW5kIHVzZSB0aGlzIHBhcmFtZXRlciB0byBza2lwIGxpbmVzLCBldGMuLAotICAgICBhcyBsb25nIGFzIHRoZSBwaXRjaCBpcyBncmVhdGVyIHRoYW4gMC4pCi0gIFtJTlBVVF0gaGVpZ2h0ID0gaGVpZ2h0IChpbiBwaXhlbHMpIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQotICBbSU5QVVRdIHBpeGVsc2l6ZSA9IHNpemUgKGluIGJ5dGVzKSBvZiBlYWNoIHBpeGVsIGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZQotICAgICBSR0JBL1JHQnggYW5kIEJHUkEvQkdSeDogNCwgUkdCIGFuZCBCR1I6IDMKLSAgW0lOUFVUXSBmbGFncyA9IHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKLQotICAgICBUSl9CR1I6IFRoZSBjb21wb25lbnRzIG9mIGVhY2ggcGl4ZWwgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHNob3VsZCBiZQotICAgICAgICB3cml0dGVuIGluIEIsRyxSIG9yZGVyLCBub3QgUixHLEIKLSAgICAgVEpfQk9UVE9NVVA6IFRoZSBkZXN0aW5hdGlvbiBpbWFnZSBzaG91bGQgYmUgc3RvcmVkIGluIGJvdHRvbS11cAotICAgICAgICAoV2luZG93cykgb3JkZXIsIG5vdCB0b3AtZG93bgotICAgICBUSl9GT1JDRU1NWDogVmFsaWQgb25seSBmb3IgdGhlIEludGVsIFBlcmZvcm1hbmNlIFByaW1pdGl2ZXMgaW1wbGVtZW50YXRpb24KLSAgICAgICAgb2YgdGhpcyBjb2RlYy0tIGZvcmNlIElQUCB0byB1c2UgTU1YIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0gICAgIFRKX0ZPUkNFU1NFOiBWYWxpZCBvbmx5IGZvciB0aGUgSW50ZWwgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UgY29kZSAoYnlwYXNzIENQVSBhdXRvLWRldGVjdGlvbikKLSAgICAgVEpfRk9SQ0VTU0UyOiBWYWxpZCBvbmx5IGZvciB0aGUgSW50ZWwgUGVyZm9ybWFuY2UgUHJpbWl0aXZlcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICBvZiB0aGlzIGNvZGVjLS0gZm9yY2UgSVBQIHRvIHVzZSBTU0UyIGNvZGUgKGJ5cGFzcyBDUFUgYXV0by1kZXRlY3Rpb24pCi0KLSAgUkVUVVJOUzogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotKi8KLURMTEVYUE9SVCBpbnQgRExMQ0FMTCB0akRlY29tcHJlc3ModGpoYW5kbGUgaiwKLQl1bnNpZ25lZCBjaGFyICpzcmNidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQl1bnNpZ25lZCBjaGFyICpkc3RidWYsIGludCB3aWR0aCwgaW50IHBpdGNoLCBpbnQgaGVpZ2h0LCBpbnQgcGl4ZWxzaXplLAotCWludCBmbGFncyk7Ci0KLQotLyoKLSAgaW50IHRqRGVzdHJveSh0amhhbmRsZSBoKQotCi0gIEZyZWVzIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGEgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBpbnN0YW5jZQotICAKLSAgW0lOUFVUXSBoID0gaW5zdGFuY2UgaGFuZGxlIChyZXR1cm5lZCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bwotICAgICB0akluaXRDb21wcmVzcygpIG9yIHRqSW5pdERlY29tcHJlc3MoKQotCi0gIFJFVFVSTlM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSovCi1ETExFWFBPUlQgaW50IERMTENBTEwgdGpEZXN0cm95KHRqaGFuZGxlIGgpOwotCi0KLS8qCi0gIGNoYXIgKnRqR2V0RXJyb3JTdHIodm9pZCkKLSAgCi0gIFJldHVybnMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGV4cGxhaW5pbmcgd2h5IHRoZSBsYXN0IGNvbW1hbmQgZmFpbGVkCi0qLwotRExMRVhQT1JUIGNoYXIqIERMTENBTEwgdGpHZXRFcnJvclN0cih2b2lkKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL3VuZG9fdHVyYm92bmMgYi94MTF2bmMvbWlzYy90dXJib3ZuYy91bmRvX3R1cmJvdm5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTY2OTFmLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3R1cmJvdm5jL3VuZG9fdHVyYm92bmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgaGFzIGJlZW4gKG9yIGlzIGhlcmVieSkgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieQotIyBpdHMgYXV0aG9yLCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPi4gVGhpcyBhcHBsaWVzIHdvcmxkd2lkZS4KLSMgCi0jIEluIGNhc2UgdGhpcyBpcyBub3QgbGVnYWxseSBwb3NzaWJsZTogS2FybCBKLiBSdW5nZSBncmFudHMgYW55b25lIHRoZQotIyByaWdodCB0byB1c2UgdGhpcyB3b3JrIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBhbnkgY29uZGl0aW9ucywgdW5sZXNzCi0jIHN1Y2ggY29uZGl0aW9ucyBhcmUgcmVxdWlyZWQgYnkgbGF3LgotCi1sZGlyPSIuLi8uLi8uLi9saWJ2bmNzZXJ2ZXIiCi0KLWlmIFsgISAtZiAiJGxkaXIvdGlnaHQuYy5PUklHIiBdOyB0aGVuCi0JbHMgLWwgIiRsZGlyL3RpZ2h0LmMuT1JJRyIKLQlleGl0IDEKLWZpCi1pZiBbICEgLWYgIiRsZGlyL3JmYnNlcnZlci5jLk9SSUciIF07IHRoZW4KLQlscyAtbCAiJGxkaXIvcmZic2VydmVyLmMuT1JJRyIKLQlleGl0IDEKLWZpCi0KLXNldCAteHYKLXJtIC1mICIkbGRpci90aWdodC5jIiAiJGxkaXIvdHVyYm9qcGVnLmgiCi1tdiAiJGxkaXIvdGlnaHQuYy5PUklHIiAiJGxkaXIvdGlnaHQuYyIKLW12ICIkbGRpci9yZmJzZXJ2ZXIuYy5PUklHIiAiJGxkaXIvcmZic2VydmVyLmMiCi1scyAtbCAkbGRpci90aWdodC5jKiAkbGRpci9yZmJzZXJ2ZXIuYyoKZGlmZiAtLWdpdCBhL3gxMXZuYy9taXNjL3VpbnB1dC5wbCBiL3gxMXZuYy9taXNjL3VpbnB1dC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTYyMDE0MC4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy91aW5wdXQucGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NDYgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0KLSMgVGhpcyBpcyBhIHRlc3QgaW5qZWN0aW9uIHNjcmlwdCBmb3IgTGludXggdWlucHV0LgotIyBJdCBjYW4gYmUgaGFuZHkgd29ya2luZyBvdXQgLyB0cm91Ymxlc2hvb3RpbmcgTGludXggdWlucHV0IGluamVjdGlvbiBvbiBhIG5ldyBkZXZpY2UuCi0KLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIGJ5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+Ci0jCi0jIHVpbnB1dC5wbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyB1aW5wdXQucGwgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB1aW5wdXQucGw7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLSMgb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMgCi0KLXNldF9jb25zdGFudHMoKTsKLQotIyBvcHRpb25zIGZvciB3aGF0IGluamVjdGlvbiB0byBoYW5kbGU6Ci0kcmVsID0gMTsKLSRhYnMgPSAxOwotJHRvdWNoID0gMTsKLSRhbGxrZXlzID0gMTsKLQotIyB0aGVzZSBjYW4gYmUgc2V0IHZpYSBlbnY6Ci0KLSRXSURUSCAgPSAkRU5We1dJRFRIfTsKLSRXSURUSCAgPSA0ODAgdW5sZXNzICRXSURUSDsKLSRIRUlHSFQgPSAkRU5We0hFSUdIVH07Ci0kSEVJR0hUID0gNjQwIHVubGVzcyAkSEVJR0hUOwotJERFViA9ICRFTlZ7REVWfTsKLSRERVYgPSAiL2Rldi9pbnB1dC91aW5wdXQiIHVubGVzcyAkREVWOwotCi0jIHRoaXMgZmlsbHMgaW4gbmFtZSBhbmQgaW5wdXQgdHlwZSBwYXJ0IG9mIHVpbnB1dF91c2VyX2RldiBzdHJ1Y3Q6Ci0KLSR1ZGV2ID0gInVpbnB1dC5wbCI7Ci0kbiA9IDgwIC0gbGVuZ3RoKCR1ZGV2KTsKLSR1ZGV2IC49ICJcMCIgeCAkbjsKLQotJHVkZXYgLj0gIlwwIiB4IDI7CSMgYnVzCi0kdWRldiAuPSAiXDAiIHggMjsJIyB2ZW5kb3IKLSR1ZGV2IC49ICJcMCIgeCAyOwkjIHByb2R1Y3QKLSR1ZGV2IC49ICJcMCIgeCAyOwkjIHZlcnNpb24KLQotJHVkZXYgLj0gIlwwIiB4IDQ7CSMgZmZfZWZmZWN0c19tYXgKLQotIyB0aGlzIGZpbGxzIGluIHRoZSBhYnMgYXJyYXlzOgotIwotZm9yZWFjaCAkdHlwZSAocXcoYWJzbWF4IGFic21pbiBhYnNmdXp6IGFic2ZsYXQpKSAgewotCSRuID0gJEFCU19NQVggKyAxOwotCWZvciAoJGogPSAwOyAkaiA8ICRuOyAkaisrKSB7Ci0JCWlmICgkYWJzICYmICR0eXBlIGVxICdhYnNtYXgnICYmICRqID09ICRBQlNfWCkgewotCQkJJHVkZXYgLj0gcGFjaygiaSIsICRXSURUSC0xKTsKLQkJfSBlbHNpZiAoJGFicyAmJiAkdHlwZSBlcSAnYWJzbWF4JyAmJiAkaiA9PSAkQUJTX1kpIHsKLQkJCSR1ZGV2IC49IHBhY2soImkiLCAkSEVJR0hULTEpOwotCQl9IGVsc2UgewotCQkJJHVkZXYgLj0gIlwwIiB4IDQ7Ci0JCX0KLQl9Ci19Ci0KLXByaW50ICJ1ZGV2OiAiLCBsZW5ndGgoJHVkZXYpIC4gIiAnJHVkZXYnXG4iOwotCi0kbW9kZXMgPSAkT19SRFdSOwotJG1vZGVzID0gJE9fV1JPTkxZIHwgJE9fTkRFTEFZOwotcHJpbnRmKCJvcGVuIG1vZGVzOiAweCV4XG4iLCAkbW9kZXMpOwotCi1zeXNvcGVuKEZELCAkREVWLCAkbW9kZXMpIHx8IGRpZSAiJERFVjogJCEiOwotCi1pZiAoJHJlbCkgewotCWlvX2N0bCgkVUlfU0VUX0VWQklULCAgJEVWX1JFTCk7Ci0JaW9fY3RsKCRVSV9TRVRfUkVMQklULCAkUkVMX1gpOwotCWlvX2N0bCgkVUlfU0VUX1JFTEJJVCwgJFJFTF9ZKTsKLX0KLQotaW9fY3RsKCRVSV9TRVRfRVZCSVQsICRFVl9LRVkpOwotCi1pb19jdGwoJFVJX1NFVF9FVkJJVCwgJEVWX1NZTik7Ci0KLWZvciAoJGk9MDsgJGkgPCAyNTY7ICRpKyspIHsKLQlsYXN0IHVubGVzcyAkYWxsa2V5czsKLQlpb19jdGwoJFVJX1NFVF9LRVlCSVQsICRpKTsKLX0KLQotaW9fY3RsKCRVSV9TRVRfS0VZQklULCAkQlROX01PVVNFKTsKLWlvX2N0bCgkVUlfU0VUX0tFWUJJVCwgJEJUTl9MRUZUKTsKLWlvX2N0bCgkVUlfU0VUX0tFWUJJVCwgJEJUTl9NSURETEUpOwotaW9fY3RsKCRVSV9TRVRfS0VZQklULCAkQlROX1JJR0hUKTsKLWlvX2N0bCgkVUlfU0VUX0tFWUJJVCwgJEJUTl9GT1JXQVJEKTsKLWlvX2N0bCgkVUlfU0VUX0tFWUJJVCwgJEJUTl9CQUNLKTsKLQotaWYgKCRhYnMpIHsKLQlpb19jdGwoJFVJX1NFVF9LRVlCSVQsICRCVE5fVE9VQ0gpIGlmICR0b3VjaDsKLQlpb19jdGwoJFVJX1NFVF9FVkJJVCwgICRFVl9BQlMpOwotCWlvX2N0bCgkVUlfU0VUX0FCU0JJVCwgJEFCU19YKTsKLQlpb19jdGwoJFVJX1NFVF9BQlNCSVQsICRBQlNfWSk7Ci19Ci0KLSRyZXQgPSBzeXN3cml0ZShGRCwgJHVkZXYsIGxlbmd0aCgkdWRldikpOwotcHJpbnQgInN5c3dyaXRlOiAkcmV0XG4iOwotCi1pb19jdGwoJFVJX0RFVl9DUkVBVEUpOwotZnNsZWVwKDAuMjUpOwotCi0jIHRoaXMgc2hvdWxkIHNob3cgb3VyIG5ldyB2aXJ0dWFsIGRldmljZToKLSMKLXN5c3RlbSgiY2F0IC9wcm9jL2J1cy9pbnB1dC9kZXZpY2VzIDE+JjIiKTsKLXByaW50IFNUREVSUiAiXG4iOwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHB1dCBpbiB5b3VyIHZhcmlvdXMgdGVzdCBpbmplY3Rpb24gZXZlbnRzIGhlcmU6Ci0KLSNkb19rZXkoJEtFWV9BLCAxLCAwLjEpOwotI2RvX2tleSgkS0VZX0EsIDAsIDAuMSk7Ci0KLSNkb19rZXkoJEtFWV9QT1dFUiwgMSwgMC4xKTsKLSNkb19rZXkoJEtFWV9QT1dFUiwgMCwgMC4xKTsKLQotZG9fYWJzKDExOCwgNDUyLCAwLCAwLjEpOwotCi1kb19hYnMoMTEwLCA1NzIsIDEsIDAuMSk7Ci0KLWRvX2J0bigkQlROX1RPVUNILCAxLCAwLjEpOwotZG9fYnRuKCRCVE5fVE9VQ0gsIDAsIDAuMSk7Ci0KLWRvX2J0bigkQlROX01PVVNFLCAxLCAwLjEpOwotZG9fYnRuKCRCVE5fTU9VU0UsIDAsIDAuMSk7Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWZzbGVlcCgwLjI1KTsKLWlvX2N0bCgkVUlfREVWX0RFU1RST1kpOwotCi1jbG9zZShGRCk7Ci0KLWV4aXQoMCk7Ci0KLXN1YiBpb19jdGwgewotCW15ICgkY21kLCAkdmFsKSA9IEBfOwotCWlmIChkZWZpbmVkICR2YWwpIHsKLQkJbXkgJHJldCA9IHN5c2NhbGwoJGxpbnV4X2lvY3RsX3N5c2NhbGwsIGZpbGVubyhGRCksICRjbWQsICR2YWwpOwotCQlteSAkZXJyID0gJCE7ICRlcnIgPSAnJyBpZiAkcmV0ID09IDA7Ci0JCXByaW50IFNUREVSUiAiaW9fY3RsKEZELCAkY21kLCAkdmFsKSA9ICRyZXQgICRlcnJcbiI7Ci0JfSBlbHNlIHsKLQkJbXkgJHJldCA9IHN5c2NhbGwoJGxpbnV4X2lvY3RsX3N5c2NhbGwsIGZpbGVubyhGRCksICRjbWQpOwotCQlteSAkZXJyID0gJCE7ICRlcnIgPSAnJyBpZiAkcmV0ID09IDA7Ci0JCXByaW50IFNUREVSUiAiaW9fY3RsKEZELCAkY21kKSA9ICRyZXQgICRlcnJcbiI7Ci0JfQotfQotCi1zdWIgZG9fc3luIHsKLQlteSAkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfU1lOKTsKLQkkZXYgLj0gcGFjaygiUyIsICRTWU5fUkVQT1JUKTsKLQkkZXYgLj0gcGFjaygiaSIsIDApOwotCXByaW50IFNUREVSUiAiZG9fc3luIEVWX1NZTlxuIjsKLQlteSAkcmV0ID0gc3lzd3JpdGUoRkQsICRldiwgbGVuZ3RoKCRldikpOwotCWlmICghZGVmaW5lZCAkcmV0KSB7Ci0JCXByaW50IFNUREVSUiAiZG9fc3luOiAkIVxuIjsKLQl9Ci19Ci0KLXN1YiBkb19rZXkgewotCW15ICgka2V5LCAkZG93biwgJHNsZWVwKSA9IEBfOwotCW15ICRldiA9IGd0b2QoKTsKLQkkZXYgLj0gcGFjaygiUyIsICRFVl9LRVkpOwotCSRldiAuPSBwYWNrKCJTIiwgJGtleSk7Ci0JJGV2IC49IHBhY2soImkiLCAkZG93bik7Ci0JcHJpbnQgU1RERVJSICJkb19rZXkgJGtleSAkZG93blxuIjsKLQlteSAkcmV0ID0gc3lzd3JpdGUoRkQsICRldiwgbGVuZ3RoKCRldikpOwotCWlmICghZGVmaW5lZCAkcmV0KSB7Ci0JCXByaW50IFNUREVSUiAiZG9fa2V5OiAkIVxuIjsKLQl9Ci0JZG9fc3luKCk7Ci0JZnNsZWVwKCRzbGVlcCk7Ci0JcHJpbnQgU1RERVJSICJcbiI7Ci19Ci0KLXN1YiBkb19idG4gewotCW15ICgkYnV0dG9uLCAkZG93biwgJHNsZWVwKSA9IEBfOwotCW15ICRldiA9IGd0b2QoKTsKLQkkZXYgLj0gcGFjaygiUyIsICRFVl9LRVkpOwotCSRldiAuPSBwYWNrKCJTIiwgJGJ1dHRvbik7Ci0JJGV2IC49IHBhY2soImkiLCAkZG93bik7Ci0JcHJpbnQgU1RERVJSICJkb19idG4gJGJ1dHRvbiAkZG93blxuIjsKLQlteSAkcmV0ID0gc3lzd3JpdGUoRkQsICRldiwgbGVuZ3RoKCRldikpOwotCWlmICghZGVmaW5lZCAkcmV0KSB7Ci0JCXByaW50IFNUREVSUiAiZG9fYnRuOiAkIVxuIjsKLQl9Ci0JZG9fc3luKCk7Ci0JZnNsZWVwKCRzbGVlcCk7Ci0JcHJpbnQgU1RERVJSICJcbiI7Ci19Ci0KLXN1YiBkb19hYnMgewotCW15ICgkeCwgJHksICRwLCAkc2xlZXApID0gQF87Ci0JbXkgJGV2ID0gZ3RvZCgpOwotCSRldiAuPSBwYWNrKCJTIiwgJEVWX0FCUyk7Ci0JJGV2IC49IHBhY2soIlMiLCAkQUJTX1kpOwotCSRldiAuPSBwYWNrKCJpIiwgJHkpOwotCXByaW50IFNUREVSUiAiZG9fYWJzIHk9JHlcbiI7Ci0JbXkgJHJldCA9IHN5c3dyaXRlKEZELCAkZXYsIGxlbmd0aCgkZXYpKTsKLQlpZiAoIWRlZmluZWQgJHJldCkgewotCQlwcmludCBTVERFUlIgImRvX2FiczogJCFcbiI7Ci0JfQotCSRldiA9IGd0b2QoKTsKLQkkZXYgLj0gcGFjaygiUyIsICRFVl9BQlMpOwotCSRldiAuPSBwYWNrKCJTIiwgJEFCU19YKTsKLQkkZXYgLj0gcGFjaygiaSIsICR4KTsKLQlwcmludCBTVERFUlIgImRvX2FicyB4PSR4XG4iOwotCSRyZXQgPSBzeXN3cml0ZShGRCwgJGV2LCBsZW5ndGgoJGV2KSk7Ci0JaWYgKCFkZWZpbmVkICRyZXQpIHsKLQkJcHJpbnQgU1RERVJSICJkb19hYnM6ICQhXG4iOwotCX0KLQkkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfQUJTKTsKLQkkZXYgLj0gcGFjaygiUyIsICRBQlNfUFJFU1NVUkUpOwotCSRldiAuPSBwYWNrKCJpIiwgJHApOwotCXByaW50IFNUREVSUiAiZG9fYWJzIHA9JHBcbiI7Ci0JJHJldCA9IHN5c3dyaXRlKEZELCAkZXYsIGxlbmd0aCgkZXYpKTsKLQlpZiAoIWRlZmluZWQgJHJldCkgewotCQlwcmludCBTVERFUlIgImRvX2FiczogJCFcbiI7Ci0JfQotCWRvX3N5bigpOwotCWZzbGVlcCgkc2xlZXApOwotCXByaW50IFNUREVSUiAiXG4iOwotfQotCi1zdWIgZG9fcmVsIHsKLQlteSAoJGR4LCAkZHksICRzbGVlcCkgPSBAXzsKLQlteSAkZXYgPSBndG9kKCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkRVZfUkVMKTsKLQkkZXYgLj0gcGFjaygiUyIsICRSRUxfWSk7Ci0JJGV2IC49IHBhY2soImkiLCAkZHkpOwotCXByaW50IFNUREVSUiAiZG9fcmVsIGR5PSRkeVxuIjsKLQlteSAkcmV0ID0gc3lzd3JpdGUoRkQsICRldiwgbGVuZ3RoKCRldikpOwotCWlmICghZGVmaW5lZCAkcmV0KSB7Ci0JCXByaW50IFNUREVSUiAiZG9fcmVsOiAkIVxuIjsKLQl9Ci0JJGV2ID0gZ3RvZCgpOwotCSRldiAuPSBwYWNrKCJTIiwgJEVWX1JFTCk7Ci0JJGV2IC49IHBhY2soIlMiLCAkUkVMX1gpOwotCSRldiAuPSBwYWNrKCJpIiwgJGR4KTsKLQlwcmludCBTVERFUlIgImRvX3JlbCBkeD0kZHhcbiI7Ci0JJHJldCA9IHN5c3dyaXRlKEZELCAkZXYsIGxlbmd0aCgkZXYpKTsKLQlpZiAoIWRlZmluZWQgJHJldCkgewotCQlwcmludCBTVERFUlIgImRvX3JlbDogJCFcbiI7Ci0JfQotCWRvX3N5bigpOwotCWZzbGVlcCgkc2xlZXApOwotCXByaW50IFNUREVSUiAiXG4iOwotfQotCi1zdWIgZ3RvZCB7Ci0JJHR2ID0gKCJcMCIgeCA0KSB4IDI7ICAgIyBhc3N1bWVzIGxvbmcgaXMgNCBieXRlcy4gIEZJWE1FOiB1c2UgcGFjay4KLQkkdHogPSAoIlwwIiB4IDQpIHggMjsKLQlzeXNjYWxsKCRsaW51eF9nZXR0aW1lb2ZkYXlfc3lzY2FsbCwgJHR2LCAkdHopOwotCXJldHVybiAkdHY7Ci19Ci0KLXN1YiBmc2xlZXAgewotICAgICAgICBteSAoJHRpbWUpID0gQF87IAotICAgICAgICBzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgJHRpbWUpIGlmICR0aW1lOwotfQotCi1zdWIgc2V0X2NvbnN0YW50cyB7Ci0KLSMgZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvdWlucHV0LmggL3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmggYW5kIHgxMXZuYy4gCi0KLSMgI2RlZmluZSBBQlNfTUFYICAgICAgICAgICAgICAgICAweDNmID0gNjMKLSMgCi0jICNkZWZpbmUgVUlOUFVUX01BWF9OQU1FX1NJWkUgICAgODAKLSMgCi0jIHN0cnVjdCBpbnB1dF9pZCB7Ci0jICAgICAgICAgX191MTYgYnVzdHlwZTsKLSMgICAgICAgICBfX3UxNiB2ZW5kb3I7Ci0jICAgICAgICAgX191MTYgcHJvZHVjdDsKLSMgICAgICAgICBfX3UxNiB2ZXJzaW9uOwotIyB9OwotIyAKLSMgc3RydWN0IHVpbnB1dF91c2VyX2RldiB7Ci0jICAgICAgICAgY2hhciBuYW1lW1VJTlBVVF9NQVhfTkFNRV9TSVpFXTsKLSMgICAgICAgICBzdHJ1Y3QgaW5wdXRfaWQgaWQ7Ci0jICAgICAgICAgaW50IGZmX2VmZmVjdHNfbWF4OwotIyAgICAgICAgIGludCBhYnNtYXhbQUJTX01BWCArIDFdOwotIyAgICAgICAgIGludCBhYnNtaW5bQUJTX01BWCArIDFdOwotIyAgICAgICAgIGludCBhYnNmdXp6W0FCU19NQVggKyAxXTsKLSMgICAgICAgICBpbnQgYWJzZmxhdFtBQlNfTUFYICsgMV07Ci0jIH07Ci0jICNlbmRpZiAgLyogX19VSU5QVVRfSF8gKi8KLQotJEVWX1NZTiAgICAgICAgICAgICAgICAgID0gMHgwMDsKLSRFVl9LRVkgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0kRVZfUkVMICAgICAgICAgICAgICAgICAgPSAweDAyOwotJEVWX0FCUyAgICAgICAgICAgICAgICAgID0gMHgwMzsKLSRFVl9NU0MgICAgICAgICAgICAgICAgICA9IDB4MDQ7Ci0kRVZfU1cgICAgICAgICAgICAgICAgICAgPSAweDA1OwotJEVWX0xFRCAgICAgICAgICAgICAgICAgID0gMHgxMTsKLSRFVl9TTkQgICAgICAgICAgICAgICAgICA9IDB4MTI7Ci0kRVZfUkVQICAgICAgICAgICAgICAgICAgPSAweDE0OwotJEVWX0ZGICAgICAgICAgICAgICAgICAgID0gMHgxNTsKLSRFVl9QV1IgICAgICAgICAgICAgICAgICA9IDB4MTY7Ci0kRVZfRkZfU1RBVFVTICAgICAgICAgICAgPSAweDE3OwotJEVWX01BWCAgICAgICAgICAgICAgICAgID0gMHgxZjsKLQotJElEX0JVUyAgICAgICAgICAgICAgICAgID0gMDsKLSRJRF9WRU5ET1IgICAgICAgICAgICAgICA9IDE7Ci0kSURfUFJPRFVDVCAgICAgICAgICAgICAgPSAyOwotJElEX1ZFUlNJT04gICAgICAgICAgICAgID0gMzsKLQotJEJVU19QQ0kgICAgICAgICAgICAgICAgID0gMHgwMTsKLSRCVVNfSVNBUE5QICAgICAgICAgICAgICA9IDB4MDI7Ci0kQlVTX1VTQiAgICAgICAgICAgICAgICAgPSAweDAzOwotJEJVU19ISUwgICAgICAgICAgICAgICAgID0gMHgwNDsKLSRCVVNfQkxVRVRPT1RIICAgICAgICAgICA9IDB4MDU7Ci0kQlVTX1ZJUlRVQUwgICAgICAgICAgICAgPSAweDA2OwotCi0kQlVTX0lTQSAgICAgICAgICAgICAgICAgPSAweDEwOwotJEJVU19JODA0MiAgICAgICAgICAgICAgID0gMHgxMTsKLSRCVVNfWFRLQkQgICAgICAgICAgICAgICA9IDB4MTI7Ci0kQlVTX1JTMjMyICAgICAgICAgICAgICAgPSAweDEzOwotJEJVU19HQU1FUE9SVCAgICAgICAgICAgID0gMHgxNDsKLSRCVVNfUEFSUE9SVCAgICAgICAgICAgICA9IDB4MTU7Ci0kQlVTX0FNSUdBICAgICAgICAgICAgICAgPSAweDE2OwotJEJVU19BREIgICAgICAgICAgICAgICAgID0gMHgxNzsKLSRCVVNfSTJDICAgICAgICAgICAgICAgICA9IDB4MTg7Ci0kQlVTX0hPU1QgICAgICAgICAgICAgICAgPSAweDE5OwotJEJVU19HU0MgICAgICAgICAgICAgICAgID0gMHgxQTsKLSRCVVNfQVRBUkkgICAgICAgICAgICAgICA9IDB4MUI7Ci0KLSRSRUxfWCAgICAgICAgICAgICAgICAgICA9IDB4MDA7Ci0kUkVMX1kgICAgICAgICAgICAgICAgICAgPSAweDAxOwotJFJFTF9aICAgICAgICAgICAgICAgICAgID0gMHgwMjsKLSRSRUxfUlggICAgICAgICAgICAgICAgICA9IDB4MDM7Ci0kUkVMX1JZICAgICAgICAgICAgICAgICAgPSAweDA0OwotJFJFTF9SWiAgICAgICAgICAgICAgICAgID0gMHgwNTsKLSRSRUxfSFdIRUVMICAgICAgICAgICAgICA9IDB4MDY7Ci0kUkVMX0RJQUwgICAgICAgICAgICAgICAgPSAweDA3OwotJFJFTF9XSEVFTCAgICAgICAgICAgICAgID0gMHgwODsKLSRSRUxfTUlTQyAgICAgICAgICAgICAgICA9IDB4MDk7Ci0KLSRBQlNfWCAgICAgICAgICAgICAgICAgICA9IDB4MDA7Ci0kQUJTX1kgICAgICAgICAgICAgICAgICAgPSAweDAxOwotJEFCU19aICAgICAgICAgICAgICAgICAgID0gMHgwMjsKLSRBQlNfUlggICAgICAgICAgICAgICAgICA9IDB4MDM7Ci0kQUJTX1JZICAgICAgICAgICAgICAgICAgPSAweDA0OwotJEFCU19SWiAgICAgICAgICAgICAgICAgID0gMHgwNTsKLSRBQlNfVEhST1RUTEUgICAgICAgICAgICA9IDB4MDY7Ci0kQUJTX1JVRERFUiAgICAgICAgICAgICAgPSAweDA3OwotJEFCU19XSEVFTCAgICAgICAgICAgICAgID0gMHgwODsKLSRBQlNfR0FTICAgICAgICAgICAgICAgICA9IDB4MDk7Ci0kQUJTX0JSQUtFICAgICAgICAgICAgICAgPSAweDBhOwotJEFCU19IQVQwWCAgICAgICAgICAgICAgID0gMHgxMDsKLSRBQlNfSEFUMFkgICAgICAgICAgICAgICA9IDB4MTE7Ci0kQUJTX0hBVDFYICAgICAgICAgICAgICAgPSAweDEyOwotJEFCU19IQVQxWSAgICAgICAgICAgICAgID0gMHgxMzsKLSRBQlNfSEFUMlggICAgICAgICAgICAgICA9IDB4MTQ7Ci0kQUJTX0hBVDJZICAgICAgICAgICAgICAgPSAweDE1OwotJEFCU19IQVQzWCAgICAgICAgICAgICAgID0gMHgxNjsKLSRBQlNfSEFUM1kgICAgICAgICAgICAgICA9IDB4MTc7Ci0kQUJTX1BSRVNTVVJFICAgICAgICAgICAgPSAweDE4OwotJEFCU19ESVNUQU5DRSAgICAgICAgICAgID0gMHgxOTsKLSRBQlNfVElMVF9YICAgICAgICAgICAgICA9IDB4MWE7Ci0kQUJTX1RJTFRfWSAgICAgICAgICAgICAgPSAweDFiOwotJEFCU19UT09MX1dJRFRIICAgICAgICAgID0gMHgxYzsKLSRBQlNfVk9MVU1FICAgICAgICAgICAgICA9IDB4MjA7Ci0kQUJTX01JU0MgICAgICAgICAgICAgICAgPSAweDI4OwotJEFCU19NVF9UT1VDSF9NQUpPUiAgICAgID0gMHgzMDsKLSRBQlNfTVRfVE9VQ0hfTUlOT1IgICAgICA9IDB4MzE7Ci0kQUJTX01UX1dJRFRIX01BSk9SICAgICAgPSAweDMyOwotJEFCU19NVF9XSURUSF9NSU5PUiAgICAgID0gMHgzMzsKLSRBQlNfTVRfT1JJRU5UQVRJT04gICAgICA9IDB4MzQ7Ci0kQUJTX01UX1BPU0lUSU9OX1ggICAgICAgPSAweDM1OwotJEFCU19NVF9QT1NJVElPTl9ZICAgICAgID0gMHgzNjsKLSRBQlNfTVRfVE9PTF9UWVBFICAgICAgICA9IDB4Mzc7Ci0kQUJTX01UX0JMT0JfSUQgICAgICAgICAgPSAweDM4OwotJEFCU19NVF9UUkFDS0lOR19JRCAgICAgID0gMHgzOTsKLSMkQUJTX01BWCA9IDB4M2Y7Ci0KLQotJEJUTl9NSVNDICAgICAgICAgICAgICAgID0gMHgxMDA7Ci0kQlROXzAgICAgICAgICAgICAgICAgICAgPSAweDEwMDsKLSRCVE5fMSAgICAgICAgICAgICAgICAgICA9IDB4MTAxOwotJEJUTl8yICAgICAgICAgICAgICAgICAgID0gMHgxMDI7Ci0kQlROXzMgICAgICAgICAgICAgICAgICAgPSAweDEwMzsKLSRCVE5fNCAgICAgICAgICAgICAgICAgICA9IDB4MTA0OwotJEJUTl81ICAgICAgICAgICAgICAgICAgID0gMHgxMDU7Ci0kQlROXzYgICAgICAgICAgICAgICAgICAgPSAweDEwNjsKLSRCVE5fNyAgICAgICAgICAgICAgICAgICA9IDB4MTA3OwotJEJUTl84ICAgICAgICAgICAgICAgICAgID0gMHgxMDg7Ci0kQlROXzkgICAgICAgICAgICAgICAgICAgPSAweDEwOTsKLQotJEJUTl9NT1VTRSAgICAgICAgICAgICAgID0gMHgxMTA7Ci0kQlROX0xFRlQgICAgICAgICAgICAgICAgPSAweDExMDsKLSRCVE5fUklHSFQgICAgICAgICAgICAgICA9IDB4MTExOwotJEJUTl9NSURETEUgICAgICAgICAgICAgID0gMHgxMTI7Ci0kQlROX1NJREUgICAgICAgICAgICAgICAgPSAweDExMzsKLSRCVE5fRVhUUkEgICAgICAgICAgICAgICA9IDB4MTE0OwotJEJUTl9GT1JXQVJEICAgICAgICAgICAgID0gMHgxMTU7Ci0kQlROX0JBQ0sgICAgICAgICAgICAgICAgPSAweDExNjsKLSRCVE5fVEFTSyAgICAgICAgICAgICAgICA9IDB4MTE3OwotCi0kQlROX0pPWVNUSUNLICAgICAgICAgICAgPSAweDEyMDsKLSRCVE5fVFJJR0dFUiAgICAgICAgICAgICA9IDB4MTIwOwotJEJUTl9USFVNQiAgICAgICAgICAgICAgID0gMHgxMjE7Ci0kQlROX1RIVU1CMiAgICAgICAgICAgICAgPSAweDEyMjsKLSRCVE5fVE9QICAgICAgICAgICAgICAgICA9IDB4MTIzOwotJEJUTl9UT1AyICAgICAgICAgICAgICAgID0gMHgxMjQ7Ci0kQlROX1BJTktJRSAgICAgICAgICAgICAgPSAweDEyNTsKLSRCVE5fQkFTRSAgICAgICAgICAgICAgICA9IDB4MTI2OwotJEJUTl9CQVNFMiAgICAgICAgICAgICAgID0gMHgxMjc7Ci0kQlROX0JBU0UzICAgICAgICAgICAgICAgPSAweDEyODsKLSRCVE5fQkFTRTQgICAgICAgICAgICAgICA9IDB4MTI5OwotJEJUTl9CQVNFNSAgICAgICAgICAgICAgID0gMHgxMmE7Ci0kQlROX0JBU0U2ICAgICAgICAgICAgICAgPSAweDEyYjsKLSRCVE5fREVBRCAgICAgICAgICAgICAgICA9IDB4MTJmOwotCi0kQlROX0dBTUVQQUQgICAgICAgICAgICAgPSAweDEzMDsKLSRCVE5fQSAgICAgICAgICAgICAgICAgICA9IDB4MTMwOwotJEJUTl9CICAgICAgICAgICAgICAgICAgID0gMHgxMzE7Ci0kQlROX0MgICAgICAgICAgICAgICAgICAgPSAweDEzMjsKLSRCVE5fWCAgICAgICAgICAgICAgICAgICA9IDB4MTMzOwotJEJUTl9ZICAgICAgICAgICAgICAgICAgID0gMHgxMzQ7Ci0kQlROX1ogICAgICAgICAgICAgICAgICAgPSAweDEzNTsKLSRCVE5fVEwgICAgICAgICAgICAgICAgICA9IDB4MTM2OwotJEJUTl9UUiAgICAgICAgICAgICAgICAgID0gMHgxMzc7Ci0kQlROX1RMMiAgICAgICAgICAgICAgICAgPSAweDEzODsKLSRCVE5fVFIyICAgICAgICAgICAgICAgICA9IDB4MTM5OwotJEJUTl9TRUxFQ1QgICAgICAgICAgICAgID0gMHgxM2E7Ci0kQlROX1NUQVJUICAgICAgICAgICAgICAgPSAweDEzYjsKLSRCVE5fTU9ERSAgICAgICAgICAgICAgICA9IDB4MTNjOwotJEJUTl9USFVNQkwgICAgICAgICAgICAgID0gMHgxM2Q7Ci0kQlROX1RIVU1CUiAgICAgICAgICAgICAgPSAweDEzZTsKLQotJEJUTl9ESUdJICAgICAgICAgICAgICAgID0gMHgxNDA7Ci0kQlROX1RPT0xfUEVOICAgICAgICAgICAgPSAweDE0MDsKLSRCVE5fVE9PTF9SVUJCRVIgICAgICAgICA9IDB4MTQxOwotJEJUTl9UT09MX0JSVVNIICAgICAgICAgID0gMHgxNDI7Ci0kQlROX1RPT0xfUEVOQ0lMICAgICAgICAgPSAweDE0MzsKLSRCVE5fVE9PTF9BSVJCUlVTSCAgICAgICA9IDB4MTQ0OwotJEJUTl9UT09MX0ZJTkdFUiAgICAgICAgID0gMHgxNDU7Ci0kQlROX1RPT0xfTU9VU0UgICAgICAgICAgPSAweDE0NjsKLSRCVE5fVE9PTF9MRU5TICAgICAgICAgICA9IDB4MTQ3OwotJEJUTl9UT1VDSCAgICAgICAgICAgICAgID0gMHgxNGE7Ci0kQlROX1NUWUxVUyAgICAgICAgICAgICAgPSAweDE0YjsKLSRCVE5fU1RZTFVTMiAgICAgICAgICAgICA9IDB4MTRjOwotJEJUTl9UT09MX0RPVUJMRVRBUCAgICAgID0gMHgxNGQ7Ci0kQlROX1RPT0xfVFJJUExFVEFQICAgICAgPSAweDE0ZTsKLQotJEJUTl9XSEVFTCAgICAgICAgICAgICAgID0gMHgxNTA7Ci0kQlROX0dFQVJfRE9XTiAgICAgICAgICAgPSAweDE1MDsKLSRCVE5fR0VBUl9VUCAgICAgICAgICAgICA9IDB4MTUxOwotCi0kU1lOX1JFUE9SVCAgICAgICAgICAgICAgPSAwOwotJFNZTl9DT05GSUcgICAgICAgICAgICAgID0gMTsKLSRTWU5fTVRfUkVQT1JUICAgICAgICAgICA9IDI7Ci0KLSRLRVlfUkVTRVJWRUQgPSAwOwotJEtFWV9FU0MgPSAgICAgIDE7Ci0kS0VZXzEgPSAgICAgICAgMjsKLSRLRVlfMiA9ICAgICAgICAzOwotJEtFWV8zID0gICAgICAgIDQ7Ci0kS0VZXzQgPSAgICAgICAgNTsKLSRLRVlfNSA9ICAgICAgICA2OwotJEtFWV82ID0gICAgICAgIDc7Ci0kS0VZXzcgPSAgICAgICAgODsKLSRLRVlfOCA9ICAgICAgICA5OwotJEtFWV85ID0gICAgICAgIDEwOwotJEtFWV8wID0gICAgICAgIDExOwotJEtFWV9NSU5VUyA9ICAgIDEyOwotJEtFWV9FUVVBTCA9ICAgIDEzOwotJEtFWV9CQUNLU1BBQ0UgPSAgICAgICAgMTQ7Ci0kS0VZX1RBQiA9ICAgICAgMTU7Ci0kS0VZX1EgPSAgICAgICAgMTY7Ci0kS0VZX1cgPSAgICAgICAgMTc7Ci0kS0VZX0UgPSAgICAgICAgMTg7Ci0kS0VZX1IgPSAgICAgICAgMTk7Ci0kS0VZX1QgPSAgICAgICAgMjA7Ci0kS0VZX1kgPSAgICAgICAgMjE7Ci0kS0VZX1UgPSAgICAgICAgMjI7Ci0kS0VZX0kgPSAgICAgICAgMjM7Ci0kS0VZX08gPSAgICAgICAgMjQ7Ci0kS0VZX1AgPSAgICAgICAgMjU7Ci0kS0VZX0xFRlRCUkFDRSA9ICAgICAgICAyNjsKLSRLRVlfUklHSFRCUkFDRSA9ICAgICAgIDI3OwotJEtFWV9FTlRFUiA9ICAgIDI4OwotJEtFWV9MRUZUQ1RSTCA9IDI5OwotJEtFWV9BID0gICAgICAgIDMwOwotJEtFWV9TID0gICAgICAgIDMxOwotJEtFWV9EID0gICAgICAgIDMyOwotJEtFWV9GID0gICAgICAgIDMzOwotJEtFWV9HID0gICAgICAgIDM0OwotJEtFWV9IID0gICAgICAgIDM1OwotJEtFWV9KID0gICAgICAgIDM2OwotJEtFWV9LID0gICAgICAgIDM3OwotJEtFWV9MID0gICAgICAgIDM4OwotJEtFWV9TRU1JQ09MT04gPSAgICAgICAgMzk7Ci0kS0VZX0FQT1NUUk9QSEUgPSAgICAgICA0MDsKLSRLRVlfR1JBVkUgPSAgICA0MTsKLSRLRVlfTEVGVFNISUZUID0gICAgICAgIDQyOwotJEtFWV9CQUNLU0xBU0ggPSAgICAgICAgNDM7Ci0kS0VZX1ogPSAgICAgICAgNDQ7Ci0kS0VZX1ggPSAgICAgICAgNDU7Ci0kS0VZX0MgPSAgICAgICAgNDY7Ci0kS0VZX1YgPSAgICAgICAgNDc7Ci0kS0VZX0IgPSAgICAgICAgNDg7Ci0kS0VZX04gPSAgICAgICAgNDk7Ci0kS0VZX00gPSAgICAgICAgNTA7Ci0kS0VZX0NPTU1BID0gICAgNTE7Ci0kS0VZX0RPVCA9ICAgICAgNTI7Ci0kS0VZX1NMQVNIID0gICAgNTM7Ci0kS0VZX1JJR0hUU0hJRlQgPSAgICAgICA1NDsKLSRLRVlfS1BBU1RFUklTSyA9ICAgICAgIDU1OwotJEtFWV9MRUZUQUxUID0gIDU2OwotJEtFWV9TUEFDRSA9ICAgIDU3OwotJEtFWV9DQVBTTE9DSyA9IDU4OwotJEtFWV9GMSA9ICAgICAgIDU5OwotJEtFWV9GMiA9ICAgICAgIDYwOwotJEtFWV9GMyA9ICAgICAgIDYxOwotJEtFWV9GNCA9ICAgICAgIDYyOwotJEtFWV9GNSA9ICAgICAgIDYzOwotJEtFWV9GNiA9ICAgICAgIDY0OwotJEtFWV9GNyA9ICAgICAgIDY1OwotJEtFWV9GOCA9ICAgICAgIDY2OwotJEtFWV9GOSA9ICAgICAgIDY3OwotJEtFWV9GMTAgPSAgICAgIDY4OwotJEtFWV9OVU1MT0NLID0gIDY5OwotJEtFWV9TQ1JPTExMT0NLID0gICAgICAgNzA7Ci0kS0VZX0tQNyA9ICAgICAgNzE7Ci0kS0VZX0tQOCA9ICAgICAgNzI7Ci0kS0VZX0tQOSA9ICAgICAgNzM7Ci0kS0VZX0tQTUlOVVMgPSAgNzQ7Ci0kS0VZX0tQNCA9ICAgICAgNzU7Ci0kS0VZX0tQNSA9ICAgICAgNzY7Ci0kS0VZX0tQNiA9ICAgICAgNzc7Ci0kS0VZX0tQUExVUyA9ICAgNzg7Ci0kS0VZX0tQMSA9ICAgICAgNzk7Ci0kS0VZX0tQMiA9ICAgICAgODA7Ci0kS0VZX0tQMyA9ICAgICAgODE7Ci0kS0VZX0tQMCA9ICAgICAgODI7Ci0kS0VZX0tQRE9UID0gICAgODM7Ci0kS0VZXzEwM1JEID0gICAgODQ7Ci0kS0VZX0YxMyA9ICAgICAgODU7Ci0kS0VZXzEwMk5EID0gICAgODY7Ci0kS0VZX0YxMSA9ICAgICAgODc7Ci0kS0VZX0YxMiA9ICAgICAgODg7Ci0kS0VZX0YxNCA9ICAgICAgODk7Ci0kS0VZX0YxNSA9ICAgICAgOTA7Ci0kS0VZX0YxNiA9ICAgICAgOTE7Ci0kS0VZX0YxNyA9ICAgICAgOTI7Ci0kS0VZX0YxOCA9ICAgICAgOTM7Ci0kS0VZX0YxOSA9ICAgICAgOTQ7Ci0kS0VZX0YyMCA9ICAgICAgOTU7Ci0kS0VZX0tQRU5URVIgPSAgOTY7Ci0kS0VZX1JJR0hUQ1RSTCA9ICAgICAgICA5NzsKLSRLRVlfS1BTTEFTSCA9ICA5ODsKLSRLRVlfU1lTUlEgPSAgICA5OTsKLSRLRVlfUklHSFRBTFQgPSAxMDA7Ci0kS0VZX0xJTkVGRUVEID0gMTAxOwotJEtFWV9IT01FID0gICAgIDEwMjsKLSRLRVlfVVAgPSAgICAgICAxMDM7Ci0kS0VZX1BBR0VVUCA9ICAgMTA0OwotJEtFWV9MRUZUID0gICAgIDEwNTsKLSRLRVlfUklHSFQgPSAgICAxMDY7Ci0kS0VZX0VORCA9ICAgICAgMTA3OwotJEtFWV9ET1dOID0gICAgIDEwODsKLSRLRVlfUEFHRURPV04gPSAxMDk7Ci0kS0VZX0lOU0VSVCA9ICAgMTEwOwotJEtFWV9ERUxFVEUgPSAgIDExMTsKLSRLRVlfTUFDUk8gPSAgICAxMTI7Ci0kS0VZX01VVEUgPSAgICAgMTEzOwotJEtFWV9WT0xVTUVET1dOID0gICAgICAgMTE0OwotJEtFWV9WT0xVTUVVUCA9IDExNTsKLSRLRVlfUE9XRVIgPSAgICAxMTY7Ci0kS0VZX0tQRVFVQUwgPSAgMTE3OwotJEtFWV9LUFBMVVNNSU5VUyA9ICAgICAgMTE4OwotJEtFWV9QQVVTRSA9ICAgIDExOTsKLSRLRVlfRjIxID0gICAgICAxMjA7Ci0kS0VZX0YyMiA9ICAgICAgMTIxOwotJEtFWV9GMjMgPSAgICAgIDEyMjsKLSRLRVlfRjI0ID0gICAgICAxMjM7Ci0kS0VZX0tQQ09NTUEgPSAgMTI0OwotJEtFWV9MRUZUTUVUQSA9IDEyNTsKLSRLRVlfUklHSFRNRVRBID0gICAgICAgIDEyNjsKLSRLRVlfQ09NUE9TRSA9ICAxMjc7Ci0kS0VZX1NUT1AgPSAgICAgMTI4OwotJEtFWV9BR0FJTiA9ICAgIDEyOTsKLSRLRVlfUFJPUFMgPSAgICAxMzA7Ci0kS0VZX1VORE8gPSAgICAgMTMxOwotJEtFWV9GUk9OVCA9ICAgIDEzMjsKLSRLRVlfQ09QWSA9ICAgICAxMzM7Ci0kS0VZX09QRU4gPSAgICAgMTM0OwotJEtFWV9QQVNURSA9ICAgIDEzNTsKLSRLRVlfRklORCA9ICAgICAxMzY7Ci0kS0VZX0NVVCA9ICAgICAgMTM3OwotJEtFWV9IRUxQID0gICAgIDEzODsKLSRLRVlfTUVOVSA9ICAgICAxMzk7Ci0kS0VZX0NBTEMgPSAgICAgMTQwOwotJEtFWV9TRVRVUCA9ICAgIDE0MTsKLSRLRVlfU0xFRVAgPSAgICAxNDI7Ci0kS0VZX1dBS0VVUCA9ICAgMTQzOwotJEtFWV9GSUxFID0gICAgIDE0NDsKLSRLRVlfU0VOREZJTEUgPSAxNDU7Ci0kS0VZX0RFTEVURUZJTEUgPSAgICAgICAxNDY7Ci0kS0VZX1hGRVIgPSAgICAgMTQ3OwotJEtFWV9QUk9HMSA9ICAgIDE0ODsKLSRLRVlfUFJPRzIgPSAgICAxNDk7Ci0kS0VZX1dXVyA9ICAgICAgMTUwOwotJEtFWV9NU0RPUyA9ICAgIDE1MTsKLSRLRVlfQ09GRkVFID0gICAxNTI7Ci0kS0VZX0RJUkVDVElPTiA9ICAgICAgICAxNTM7Ci0kS0VZX0NZQ0xFV0lORE9XUyA9ICAgICAxNTQ7Ci0kS0VZX01BSUwgPSAgICAgMTU1OwotJEtFWV9CT09LTUFSS1MgPSAgICAgICAgMTU2OwotJEtFWV9DT01QVVRFUiA9IDE1NzsKLSRLRVlfQkFDSyA9ICAgICAxNTg7Ci0kS0VZX0ZPUldBUkQgPSAgMTU5OwotJEtFWV9DTE9TRUNEID0gIDE2MDsKLSRLRVlfRUpFQ1RDRCA9ICAxNjE7Ci0kS0VZX0VKRUNUQ0xPU0VDRCA9ICAgICAxNjI7Ci0kS0VZX05FWFRTT05HID0gMTYzOwotJEtFWV9QTEFZUEFVU0UgPSAgICAgICAgMTY0OwotJEtFWV9QUkVWSU9VU1NPTkcgPSAgICAgMTY1OwotJEtFWV9TVE9QQ0QgPSAgIDE2NjsKLSRLRVlfUkVDT1JEID0gICAxNjc7Ci0kS0VZX1JFV0lORCA9ICAgMTY4OwotJEtFWV9QSE9ORSA9ICAgIDE2OTsKLSRLRVlfSVNPID0gICAgICAxNzA7Ci0kS0VZX0NPTkZJRyA9ICAgMTcxOwotJEtFWV9IT01FUEFHRSA9IDE3MjsKLSRLRVlfUkVGUkVTSCA9ICAxNzM7Ci0kS0VZX0VYSVQgPSAgICAgMTc0OwotJEtFWV9NT1ZFID0gICAgIDE3NTsKLSRLRVlfRURJVCA9ICAgICAxNzY7Ci0kS0VZX1NDUk9MTFVQID0gMTc3OwotJEtFWV9TQ1JPTExET1dOID0gICAgICAgMTc4OwotJEtFWV9LUExFRlRQQVJFTiA9ICAgICAgMTc5OwotJEtFWV9LUFJJR0hUUEFSRU4gPSAgICAgMTgwOwotJEtFWV9JTlRMMSA9ICAgIDE4MTsKLSRLRVlfSU5UTDIgPSAgICAxODI7Ci0kS0VZX0lOVEwzID0gICAgMTgzOwotJEtFWV9JTlRMNCA9ICAgIDE4NDsKLSRLRVlfSU5UTDUgPSAgICAxODU7Ci0kS0VZX0lOVEw2ID0gICAgMTg2OwotJEtFWV9JTlRMNyA9ICAgIDE4NzsKLSRLRVlfSU5UTDggPSAgICAxODg7Ci0kS0VZX0lOVEw5ID0gICAgMTg5OwotJEtFWV9MQU5HMSA9ICAgIDE5MDsKLSRLRVlfTEFORzIgPSAgICAxOTE7Ci0kS0VZX0xBTkczID0gICAgMTkyOwotJEtFWV9MQU5HNCA9ICAgIDE5MzsKLSRLRVlfTEFORzUgPSAgICAxOTQ7Ci0kS0VZX0xBTkc2ID0gICAgMTk1OwotJEtFWV9MQU5HNyA9ICAgIDE5NjsKLSRLRVlfTEFORzggPSAgICAxOTc7Ci0kS0VZX0xBTkc5ID0gICAgMTk4OwotJEtFWV9QTEFZQ0QgPSAgIDIwMDsKLSRLRVlfUEFVU0VDRCA9ICAyMDE7Ci0kS0VZX1BST0czID0gICAgMjAyOwotJEtFWV9QUk9HNCA9ICAgIDIwMzsKLSRLRVlfU1VTUEVORCA9ICAyMDU7Ci0kS0VZX0NMT1NFID0gICAgMjA2OwotJEtFWV9QTEFZID0gICAgIDIwNzsKLSRLRVlfRkFTVEZPUldBUkQgPSAgICAgIDIwODsKLSRLRVlfQkFTU0JPT1NUID0gICAgICAgIDIwOTsKLSRLRVlfUFJJTlQgPSAgICAyMTA7Ci0kS0VZX0hQID0gICAgICAgMjExOwotJEtFWV9DQU1FUkEgPSAgIDIxMjsKLSRLRVlfU09VTkQgPSAgICAyMTM7Ci0kS0VZX1FVRVNUSU9OID0gMjE0OwotJEtFWV9FTUFJTCA9ICAgIDIxNTsKLSRLRVlfQ0hBVCA9ICAgICAyMTY7Ci0kS0VZX1NFQVJDSCA9ICAgMjE3OwotJEtFWV9DT05ORUNUID0gIDIxODsKLSRLRVlfRklOQU5DRSA9ICAyMTk7Ci0kS0VZX1NQT1JUID0gICAgMjIwOwotJEtFWV9TSE9QID0gICAgIDIyMTsKLSRLRVlfQUxURVJBU0UgPSAyMjI7Ci0kS0VZX0NBTkNFTCA9ICAgMjIzOwotJEtFWV9CUklHSFRORVNTRE9XTiA9ICAgMjI0OwotJEtFWV9CUklHSFRORVNTVVAgPSAgICAgMjI1OwotJEtFWV9NRURJQSA9ICAgIDIyNjsKLSRLRVlfVU5LTk9XTiA9ICAyNDA7Ci0kS0VZX09LID0gICAgICAgMHgxNjA7Ci0kS0VZX1NFTEVDVCA9ICAgMHgxNjE7Ci0kS0VZX0dPVE8gPSAgICAgMHgxNjI7Ci0kS0VZX0NMRUFSID0gICAgMHgxNjM7Ci0kS0VZX1BPV0VSMiA9ICAgMHgxNjQ7Ci0kS0VZX09QVElPTiA9ICAgMHgxNjU7Ci0kS0VZX0lORk8gPSAgICAgMHgxNjY7Ci0kS0VZX1RJTUUgPSAgICAgMHgxNjc7Ci0kS0VZX1ZFTkRPUiA9ICAgMHgxNjg7Ci0kS0VZX0FSQ0hJVkUgPSAgMHgxNjk7Ci0kS0VZX1BST0dSQU0gPSAgMHgxNmE7Ci0kS0VZX0NIQU5ORUwgPSAgMHgxNmI7Ci0kS0VZX0ZBVk9SSVRFUyA9ICAgICAgICAweDE2YzsKLSRLRVlfRVBHID0gICAgICAweDE2ZDsKLSRLRVlfUFZSID0gICAgICAweDE2ZTsKLSRLRVlfTUhQID0gICAgICAweDE2ZjsKLSRLRVlfTEFOR1VBR0UgPSAweDE3MDsKLSRLRVlfVElUTEUgPSAgICAweDE3MTsKLSRLRVlfU1VCVElUTEUgPSAweDE3MjsKLSRLRVlfQU5HTEUgPSAgICAweDE3MzsKLSRLRVlfWk9PTSA9ICAgICAweDE3NDsKLSRLRVlfTU9ERSA9ICAgICAweDE3NTsKLSRLRVlfS0VZQk9BUkQgPSAweDE3NjsKLSRLRVlfU0NSRUVOID0gICAweDE3NzsKLSRLRVlfUEMgPSAgICAgICAweDE3ODsKLSRLRVlfVFYgPSAgICAgICAweDE3OTsKLSRLRVlfVFYyID0gICAgICAweDE3YTsKLSRLRVlfVkNSID0gICAgICAweDE3YjsKLSRLRVlfVkNSMiA9ICAgICAweDE3YzsKLSRLRVlfU0FUID0gICAgICAweDE3ZDsKLSRLRVlfU0FUMiA9ICAgICAweDE3ZTsKLSRLRVlfQ0QgPSAgICAgICAweDE3ZjsKLSRLRVlfVEFQRSA9ICAgICAweDE4MDsKLSRLRVlfUkFESU8gPSAgICAweDE4MTsKLSRLRVlfVFVORVIgPSAgICAweDE4MjsKLSRLRVlfUExBWUVSID0gICAweDE4MzsKLSRLRVlfVEVYVCA9ICAgICAweDE4NDsKLSRLRVlfRFZEID0gICAgICAweDE4NTsKLSRLRVlfQVVYID0gICAgICAweDE4NjsKLSRLRVlfTVAzID0gICAgICAweDE4NzsKLSRLRVlfQVVESU8gPSAgICAweDE4ODsKLSRLRVlfVklERU8gPSAgICAweDE4OTsKLSRLRVlfRElSRUNUT1JZID0gICAgICAgIDB4MThhOwotJEtFWV9MSVNUID0gICAgIDB4MThiOwotJEtFWV9NRU1PID0gICAgIDB4MThjOwotJEtFWV9DQUxFTkRBUiA9IDB4MThkOwotJEtFWV9SRUQgPSAgICAgIDB4MThlOwotJEtFWV9HUkVFTiA9ICAgIDB4MThmOwotJEtFWV9ZRUxMT1cgPSAgIDB4MTkwOwotJEtFWV9CTFVFID0gICAgIDB4MTkxOwotJEtFWV9DSEFOTkVMVVAgPSAgICAgICAgMHgxOTI7Ci0kS0VZX0NIQU5ORUxET1dOID0gICAgICAweDE5MzsKLSRLRVlfRklSU1QgPSAgICAweDE5NDsKLSRLRVlfTEFTVCA9ICAgICAweDE5NTsKLSRLRVlfQUIgPSAgICAgICAweDE5NjsKLSRLRVlfTkVYVCA9ICAgICAweDE5NzsKLSRLRVlfUkVTVEFSVCA9ICAweDE5ODsKLSRLRVlfU0xPVyA9ICAgICAweDE5OTsKLSRLRVlfU0hVRkZMRSA9ICAweDE5YTsKLSRLRVlfQlJFQUsgPSAgICAweDE5YjsKLSRLRVlfUFJFVklPVVMgPSAweDE5YzsKLSRLRVlfRElHSVRTID0gICAweDE5ZDsKLSRLRVlfVEVFTiA9ICAgICAweDE5ZTsKLSRLRVlfVFdFTiA9ICAgICAweDE5ZjsKLSRLRVlfREVMX0VPTCA9ICAweDFjMDsKLSRLRVlfREVMX0VPUyA9ICAweDFjMTsKLSRLRVlfSU5TX0xJTkUgPSAweDFjMjsKLSRLRVlfREVMX0xJTkUgPSAweDFjMzsKLSRLRVlfTUFYID0gICAgICAweDFmZjsKLQotCi0gICAgICAgICRrZXlfbG9va3Vwe1hLX0VzY2FwZX0gID0gJEtFWV9FU0M7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzF9ICAgICAgICAgICAgICAgPSAkS0VZXzE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzJ9ICAgICAgICAgICAgICAgPSAkS0VZXzI7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzN9ICAgICAgICAgICAgICAgPSAkS0VZXzM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzR9ICAgICAgICAgICAgICAgPSAkS0VZXzQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzV9ICAgICAgICAgICAgICAgPSAkS0VZXzU7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzZ9ICAgICAgICAgICAgICAgPSAkS0VZXzY7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzd9ICAgICAgICAgICAgICAgPSAkS0VZXzc7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzh9ICAgICAgICAgICAgICAgPSAkS0VZXzg7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzl9ICAgICAgICAgICAgICAgPSAkS0VZXzk7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLXzB9ICAgICAgICAgICAgICAgPSAkS0VZXzA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2V4Y2xhbX0gID0gJEtFWV8xOwotICAgICAgICAka2V5X2xvb2t1cHtYS19hdH0gICAgICAgICAgICAgID0gJEtFWV8yOwotICAgICAgICAka2V5X2xvb2t1cHtYS19udW1iZXJzaWdufSAgICAgID0gJEtFWV8zOwotICAgICAgICAka2V5X2xvb2t1cHtYS19kb2xsYXJ9ICA9ICRLRVlfNDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcGVyY2VudH0gPSAkS0VZXzU7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2FzY2lpY2lyY3VtfSAgICAgPSAkS0VZXzY7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2FtcGVyc2FuZH0gICAgICAgPSAkS0VZXzc7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2FzdGVyaXNrfSAgICAgICAgPSAkS0VZXzg7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3BhcmVubGVmdH0gICAgICAgPSAkS0VZXzk7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3BhcmVucmlnaHR9ICAgICAgPSAkS0VZXzA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX21pbnVzfSAgID0gJEtFWV9NSU5VUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfdW5kZXJzY29yZX0gICAgICA9ICRLRVlfTUlOVVM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2VxdWFsfSAgID0gJEtFWV9FUVVBTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcGx1c30gICAgPSAkS0VZX0VRVUFMOwotICAgICAgICAka2V5X2xvb2t1cHtYS19CYWNrU3BhY2V9ICAgICAgID0gJEtFWV9CQUNLU1BBQ0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1RhYn0gICAgICAgICAgICAgPSAkS0VZX1RBQjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcX0gICAgICAgICAgICAgICA9ICRLRVlfUTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUX0gICAgICAgICAgICAgICA9ICRLRVlfUTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfd30gICAgICAgICAgICAgICA9ICRLRVlfVzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfV30gICAgICAgICAgICAgICA9ICRLRVlfVzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZX0gICAgICAgICAgICAgICA9ICRLRVlfRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRX0gICAgICAgICAgICAgICA9ICRLRVlfRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcn0gICAgICAgICAgICAgICA9ICRLRVlfUjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUn0gICAgICAgICAgICAgICA9ICRLRVlfUjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfdH0gICAgICAgICAgICAgICA9ICRLRVlfVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfVH0gICAgICAgICAgICAgICA9ICRLRVlfVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfeX0gICAgICAgICAgICAgICA9ICRLRVlfWTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfWX0gICAgICAgICAgICAgICA9ICRLRVlfWTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfdX0gICAgICAgICAgICAgICA9ICRLRVlfVTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfVX0gICAgICAgICAgICAgICA9ICRLRVlfVTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfaX0gICAgICAgICAgICAgICA9ICRLRVlfSTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfSX0gICAgICAgICAgICAgICA9ICRLRVlfSTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfb30gICAgICAgICAgICAgICA9ICRLRVlfTzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfT30gICAgICAgICAgICAgICA9ICRLRVlfTzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcH0gICAgICAgICAgICAgICA9ICRLRVlfUDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUH0gICAgICAgICAgICAgICA9ICRLRVlfUDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYnJhY2VsZWZ0fSAgICAgICA9ICRLRVlfTEVGVEJSQUNFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19icmFjZXJpZ2h0fSAgICAgID0gJEtFWV9SSUdIVEJSQUNFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19icmFja2V0bGVmdH0gICAgID0gJEtFWV9MRUZUQlJBQ0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2JyYWNrZXRyaWdodH0gICAgPSAkS0VZX1JJR0hUQlJBQ0U7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1JldHVybn0gID0gJEtFWV9FTlRFUjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQ29udHJvbF9MfSAgICAgICA9ICRLRVlfTEVGVENUUkw7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2F9ICAgICAgICAgICAgICAgPSAkS0VZX0E7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0F9ICAgICAgICAgICAgICAgPSAkS0VZX0E7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3N9ICAgICAgICAgICAgICAgPSAkS0VZX1M7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1N9ICAgICAgICAgICAgICAgPSAkS0VZX1M7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2R9ICAgICAgICAgICAgICAgPSAkS0VZX0Q7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0R9ICAgICAgICAgICAgICAgPSAkS0VZX0Q7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2Z9ICAgICAgICAgICAgICAgPSAkS0VZX0Y7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Z9ICAgICAgICAgICAgICAgPSAkS0VZX0Y7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2d9ICAgICAgICAgICAgICAgPSAkS0VZX0c7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0d9ICAgICAgICAgICAgICAgPSAkS0VZX0c7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2h9ICAgICAgICAgICAgICAgPSAkS0VZX0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0h9ICAgICAgICAgICAgICAgPSAkS0VZX0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2p9ICAgICAgICAgICAgICAgPSAkS0VZX0o7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0p9ICAgICAgICAgICAgICAgPSAkS0VZX0o7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2t9ICAgICAgICAgICAgICAgPSAkS0VZX0s7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0t9ICAgICAgICAgICAgICAgPSAkS0VZX0s7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2x9ICAgICAgICAgICAgICAgPSAkS0VZX0w7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0x9ICAgICAgICAgICAgICAgPSAkS0VZX0w7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3NlbWljb2xvbn0gICAgICAgPSAkS0VZX1NFTUlDT0xPTjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfY29sb259ICAgPSAkS0VZX1NFTUlDT0xPTjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYXBvc3Ryb3BoZX0gICAgICA9ICRLRVlfQVBPU1RST1BIRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfcXVvdGVkYmx9ICAgICAgICA9ICRLRVlfQVBPU1RST1BIRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfZ3JhdmV9ICAgPSAkS0VZX0dSQVZFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19hc2NpaXRpbGRlfSAgICAgID0gJEtFWV9HUkFWRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfU2hpZnRfTH0gPSAkS0VZX0xFRlRTSElGVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfYmFja3NsYXNofSAgICAgICA9ICRLRVlfQkFDS1NMQVNIOwotICAgICAgICAka2V5X2xvb2t1cHtYS19iYXJ9ICAgICAgICAgICAgID0gJEtFWV9CQUNLU0xBU0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3p9ICAgICAgICAgICAgICAgPSAkS0VZX1o7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1p9ICAgICAgICAgICAgICAgPSAkS0VZX1o7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3h9ICAgICAgICAgICAgICAgPSAkS0VZX1g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1h9ICAgICAgICAgICAgICAgPSAkS0VZX1g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2N9ICAgICAgICAgICAgICAgPSAkS0VZX0M7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0N9ICAgICAgICAgICAgICAgPSAkS0VZX0M7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3Z9ICAgICAgICAgICAgICAgPSAkS0VZX1Y7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1Z9ICAgICAgICAgICAgICAgPSAkS0VZX1Y7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2J9ICAgICAgICAgICAgICAgPSAkS0VZX0I7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0J9ICAgICAgICAgICAgICAgPSAkS0VZX0I7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX259ICAgICAgICAgICAgICAgPSAkS0VZX047Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX059ICAgICAgICAgICAgICAgPSAkS0VZX047Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX219ICAgICAgICAgICAgICAgPSAkS0VZX007Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX019ICAgICAgICAgICAgICAgPSAkS0VZX007Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX2NvbW1hfSAgID0gJEtFWV9DT01NQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfbGVzc30gICAgPSAkS0VZX0NPTU1BOwotICAgICAgICAka2V5X2xvb2t1cHtYS19wZXJpb2R9ICA9ICRLRVlfRE9UOwotICAgICAgICAka2V5X2xvb2t1cHtYS19ncmVhdGVyfSA9ICRLRVlfRE9UOwotICAgICAgICAka2V5X2xvb2t1cHtYS19zbGFzaH0gICA9ICRLRVlfU0xBU0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3F1ZXN0aW9ufSAgICAgICAgPSAkS0VZX1NMQVNIOwotICAgICAgICAka2V5X2xvb2t1cHtYS19TaGlmdF9SfSA9ICRLRVlfUklHSFRTSElGVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfTXVsdGlwbHl9ICAgICA9ICRLRVlfS1BBU1RFUklTSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQWx0X0x9ICAgPSAkS0VZX0xFRlRBTFQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX3NwYWNlfSAgID0gJEtFWV9TUEFDRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQ2Fwc19Mb2NrfSAgICAgICA9ICRLRVlfQ0FQU0xPQ0s7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxfSAgICAgICAgICAgICAgPSAkS0VZX0YxOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMn0gICAgICAgICAgICAgID0gJEtFWV9GMjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjN9ICAgICAgICAgICAgICA9ICRLRVlfRjM7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Y0fSAgICAgICAgICAgICAgPSAkS0VZX0Y0OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GNX0gICAgICAgICAgICAgID0gJEtFWV9GNTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjZ9ICAgICAgICAgICAgICA9ICRLRVlfRjY7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0Y3fSAgICAgICAgICAgICAgPSAkS0VZX0Y3OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GOH0gICAgICAgICAgICAgID0gJEtFWV9GODsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjl9ICAgICAgICAgICAgICA9ICRLRVlfRjk7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxMH0gICAgICAgICAgICAgPSAkS0VZX0YxMDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTnVtX0xvY2t9ICAgICAgICA9ICRLRVlfTlVNTE9DSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfU2Nyb2xsX0xvY2t9ICAgICA9ICRLRVlfU0NST0xMTE9DSzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfN30gICAgICAgICAgICA9ICRLRVlfS1A3OwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF84fSAgICAgICAgICAgID0gJEtFWV9LUDg7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzl9ICAgICAgICAgICAgPSAkS0VZX0tQOTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfU3VidHJhY3R9ICAgICA9ICRLRVlfS1BNSU5VUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfNH0gICAgICAgICAgICA9ICRLRVlfS1A0OwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF81fSAgICAgICAgICAgID0gJEtFWV9LUDU7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzZ9ICAgICAgICAgICAgPSAkS0VZX0tQNjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfQWRkfSAgPSAkS0VZX0tQUExVUzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfMX0gICAgICAgICAgICA9ICRLRVlfS1AxOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF8yfSAgICAgICAgICAgID0gJEtFWV9LUDI7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQXzN9ICAgICAgICAgICAgPSAkS0VZX0tQMzsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfMH0gICAgICAgICAgICA9ICRLRVlfS1AwOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9EZWNpbWFsfSAgICAgID0gJEtFWV9LUERPVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjEzfSAgICAgICAgICAgICA9ICRLRVlfRjEzOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTF9ICAgICAgICAgICAgID0gJEtFWV9GMTE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxMn0gICAgICAgICAgICAgPSAkS0VZX0YxMjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjE0fSAgICAgICAgICAgICA9ICRLRVlfRjE0OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTV9ICAgICAgICAgICAgID0gJEtFWV9GMTU7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxNn0gICAgICAgICAgICAgPSAkS0VZX0YxNjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjE3fSAgICAgICAgICAgICA9ICRLRVlfRjE3OwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMTh9ICAgICAgICAgICAgID0gJEtFWV9GMTg7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YxOX0gICAgICAgICAgICAgPSAkS0VZX0YxOTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjIwfSAgICAgICAgICAgICA9ICRLRVlfRjIwOwotICAgICAgICAka2V5X2xvb2t1cHtYS19LUF9FbnRlcn0gICAgICAgID0gJEtFWV9LUEVOVEVSOwotICAgICAgICAka2V5X2xvb2t1cHtYS19Db250cm9sX1J9ICAgICAgID0gJEtFWV9SSUdIVENUUkw7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQX0RpdmlkZX0gICAgICAgPSAkS0VZX0tQU0xBU0g7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1N5c19SZXF9ID0gJEtFWV9TWVNSUTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfQWx0X1J9ICAgPSAkS0VZX1JJR0hUQUxUOwotICAgICAgICAka2V5X2xvb2t1cHtYS19MaW5lZmVlZH0gICAgICAgID0gJEtFWV9MSU5FRkVFRDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfSG9tZX0gICAgICAgICAgICA9ICRLRVlfSE9NRTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfVXB9ICAgICAgICAgICAgICA9ICRLRVlfVVA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1BhZ2VfVXB9ID0gJEtFWV9QQUdFVVA7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0xlZnR9ICAgICAgICAgICAgPSAkS0VZX0xFRlQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX1JpZ2h0fSAgID0gJEtFWV9SSUdIVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRW5kfSAgICAgICAgICAgICA9ICRLRVlfRU5EOwotICAgICAgICAka2V5X2xvb2t1cHtYS19Eb3dufSAgICAgICAgICAgID0gJEtFWV9ET1dOOwotICAgICAgICAka2V5X2xvb2t1cHtYS19QYWdlX0Rvd259ICAgICAgID0gJEtFWV9QQUdFRE9XTjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfSW5zZXJ0fSAgPSAkS0VZX0lOU0VSVDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRGVsZXRlfSAgPSAkS0VZX0RFTEVURTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfS1BfRXF1YWx9ICAgICAgICA9ICRLRVlfS1BFUVVBTDsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfUGF1c2V9ICAgPSAkS0VZX1BBVVNFOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMjF9ICAgICAgICAgICAgID0gJEtFWV9GMjE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0YyMn0gICAgICAgICAgICAgPSAkS0VZX0YyMjsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfRjIzfSAgICAgICAgICAgICA9ICRLRVlfRjIzOwotICAgICAgICAka2V5X2xvb2t1cHtYS19GMjR9ICAgICAgICAgICAgID0gJEtFWV9GMjQ7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX0tQX1NlcGFyYXRvcn0gICAgPSAkS0VZX0tQQ09NTUE7Ci0gICAgICAgICRrZXlfbG9va3Vwe1hLX01ldGFfTH0gID0gJEtFWV9MRUZUTUVUQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTWV0YV9SfSAgPSAkS0VZX1JJR0hUTUVUQTsKLSAgICAgICAgJGtleV9sb29rdXB7WEtfTXVsdGlfa2V5fSAgICAgICA9ICRLRVlfQ09NUE9TRTsKLQotJEFCU19NQVggPSA2MzsKLQotJFVJX0RFVl9DUkVBVEUgID0gMHg1NTAxOwotJFVJX0RFVl9ERVNUUk9ZID0gMHg1NTAyOwotJFVJX1NFVF9FVkJJVCAgID0gMHg0MDA0NTU2NDsKLSRVSV9TRVRfS0VZQklUICA9IDB4NDAwNDU1NjU7Ci0kVUlfU0VUX1JFTEJJVCAgPSAweDQwMDQ1NTY2OwotJFVJX1NFVF9BQlNCSVQgID0gMHg0MDA0NTU2NzsKLQotIyBGSVhNRTogdGltZSBoaXJlcywgZXRjLgotJGxpbnV4X2dldHRpbWVvZmRheV9zeXNjYWxsID0gNzg7Ci0KLSRPX1JET05MWSA9IDAwOwotJE9fV1JPTkxZID0gMDE7Ci0kT19SRFdSICAgPSAwMjsKLSRPX05ERUxBWSA9IDA0MDAwOwotCi19CmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy91bHRyYXZuY19yZXBlYXRlci5wbCBiL3gxMXZuYy9taXNjL3VsdHJhdm5jX3JlcGVhdGVyLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzQ0YTA1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9taXNjL3VsdHJhdm5jX3JlcGVhdGVyLnBsCisrKyAvZGV2L251bGwKQEAgLTEsNzQxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHBlcmwKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgYnkgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSMKLSMgdWx0cmF2bmNfcmVwZWF0ZXIucGwgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgdWx0cmF2bmNfcmVwZWF0ZXIucGwgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB1bHRyYXZuY19yZXBlYXRlci5wbDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIyBvciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIyAKLQotbXkgJHVzYWdlID0gJwotdWx0cmF2bmNfcmVwZWF0ZXIucGw6Ci0gICAgICAgICAgcGVybCBzY3JpcHQgaW1wbGVtZW50aW5nIHRoZSB1bHRyYXZuYyByZXBlYXRlcgotICAgICAgICAgIHByb3h5IHByb3RvY29sLgotCi1wcm90b2NvbDogTGlzdGVuIG9uIG9uZSBwb3J0IGZvciB2bmMgY2xpZW50cyAoZGVmYXVsdCA1OTAwLikKLSAgICAgICAgICBMaXN0ZW4gb24gb25lIHBvcnQgZm9yIHZuYyBzZXJ2ZXJzIChkZWZhdWx0IDU1MDAuKQotICAgICAgICAgIFJlYWQgMjUwIGJ5dGVzIGZyb20gY29ubmVjdGluZyB2bmMgY2xpZW50IG9yIHNlcnZlci4KLSAgICAgICAgICBBY2NlcHQgSUQ6PHN0cmluZz4gZnJvbSBjbGllbnRzIGFuZCBzZXJ2ZXJzLCBjb25uZWN0IHRoZW0KLSAgICAgICAgICB0b2dldGhlciBvbmNlIGJvdGggYXJlIHByZXNlbnQuCi0KLSAgICAgICAgICBUaGUgc3RyaW5nICJSRkIgMDAwLjAwMFxuIiBpcyBzZW50IHRvIHRoZSBjbGllbnQgKHRoZSBjbGllbnQKLSAgICAgICAgICBtdXN0IHVuZGVyc3RhbmQgdGhpcyBtZWFucyBzZW5kIElEOi4uLiBvciBob3N0OnBvcnQuKQotICAgICAgICAgIEFsc28gYWNjZXB0IDxob3N0Pjo8cG9ydD4gZnJvbSBjbGllbnRzIGFuZCBtYWtlIHRoZQotICAgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIHZuYyBzZXJ2ZXIgaW1tZWRpYXRlbHkuIAotCi0gICAgICAgICAgTm90ZSB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbiBvciBzZWN1cml0eSBXUlQgSUQgbmFtZXMgb3IKLSAgICAgICAgICBpZGVudGl0aWVzOyBpdCBpcyB1cCB0byB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgdG8gY29tcGxldGVseQotICAgICAgICAgIG1hbmFnZSB0aGF0IGFzcGVjdCBhbmQgd2hldGhlciB0byBlbmNyeXB0IHRoZSBzZXNzaW9uLCBldGMuCi0KLXVzYWdlOiAgdWx0cmF2bmNfcmVwZWF0ZXIucGwgWy1yXSBbY2xpZW50X3BvcnQgW3NlcnZlcl9wb3J0XV0KLQotVXNlIC1yIHRvIHJlZnVzZSBuZXcgc2VydmVyL2NsaWVudCBjb25uZWN0aW9ucyB3aGVuIHRoZXJlIGlzIGFuIGV4aXN0aW5nCi1zZXJ2ZXIvY2xpZW50IElELiAgVGhlIGRlZmF1bHQgaXMgdG8gY2xvc2UgdGhlIHByZXZpb3VzIG9uZS4KLQotVG8gd3JpdGUgdG8gYSBsb2cgZmlsZSBzZXQgdGhlIGVudi4gdmFyIFVMVFJBVk5DX1JFUEVBVEVSX0xPR0ZJTEUuCi0KLVRvIHJ1biBpbiBhIGxvb3AgcmVzdGFydGluZyB0aGUgc2VydmVyIGlmIGl0IGV4aXRzIHNldCB0aGUgZW52LiB2YXIuCi1VTFRSQVZOQ19SRVBFQVRFUl9MT09QPTEgb3IgVUxUUkFWTkNfUkVQRUFURVJfTE9PUD1CRywgdGhlIGxhdHRlcgotZm9ya3MgaW50byB0aGUgYmFja2dyb3VuZC4gIFNldCBVTFRSQVZOQ19SRVBFQVRFUl9QSURGSUxFIHRvIGEgZmlsZQotdG8gc3RvcmUgdGhlIG1hc3RlciBwaWQgaW4uCi0KLVNldCBVTFRSQVZOQ19SRVBFQVRFUl9OT19SRkI9MSB0byBkaXNhYmxlIHNlbmRpbmcgIlJGQiAwMDAuMDAwIiB0bwotdGhlIGNsaWVudC4gIFRoZW4gdGhpcyBwcm9ncmFtIGFjdHMgYXMgZ2VuZXJhbCBUQ1AgcmVuZGV6dm91cyB0b29sLgotCi1FeGFtcGxlczoKLQotCXVsdHJhdm5jX3JlcGVhdGVyLnBsCi0JdWx0cmF2bmNfcmVwZWF0ZXIucGwgLXIKLQl1bHRyYXZuY19yZXBlYXRlci5wbCA1OTAxCi0JdWx0cmF2bmNfcmVwZWF0ZXIucGwgNTkwMSA1NTAxCi0KLQllbnYgVUxUUkFWTkNfUkVQRUFURVJfTE9PUD1CRyBVTFRSQVZOQ19SRVBFQVRFUl9MT0dGSUxFPS90bXAvdS5sb2cgdWx0cmF2bmNfcmVwZWF0ZXIucGwgLi4uCi0KLSc7Ci0KLXVzZSBzdHJpY3Q7Ci0KLSMgU2V0IHVwIGxvZ2dpbmc6Ci0jCi1pZiAoZXhpc3RzICRFTlZ7VUxUUkFWTkNfUkVQRUFURVJfTE9HRklMRX0pIHsKLQljbG9zZSBTVERPVVQ7Ci0JaWYgKCFvcGVuKFNURE9VVCwgIj4+JEVOVntVTFRSQVZOQ19SRVBFQVRFUl9MT0dGSUxFfSIpKSB7Ci0JICAgICAgICBkaWUgInVsdHJhdm5jX3JlcGVhdGVyLnBsOiAkRU5We1VMVFJBVk5DX1JFUEVBVEVSX0xPR0ZJTEV9ICQhXG4iOwotCX0KLQljbG9zZSBTVERFUlI7Ci0Jb3BlbihTVERFUlIsICI+JlNURE9VVCIpOwotfQotc2VsZWN0KFNUREVSUik7ICR8ID0gMTsKLXNlbGVjdChTVERPVVQpOyAkfCA9IDE7Ci0KLSMgaW50ZXJydXB0IGhhbmRsZXI6Ci0jCi1teSAkbG9vcHBpZCA9ICcnOwotbXkgJHBpZGZpbGUgPSAnJzsKLSMKLXN1YiBnZXRfb3V0IHsKLQlscHJpbnQoIiRfWzBdOlx0JCQgbG9vcHBpZD0kbG9vcHBpZCIpOwotCWlmICgkbG9vcHBpZCkgewotCQlraWxsICdURVJNJywgJGxvb3BwaWQ7Ci0JCWZzbGVlcCgwLjIpOwotCX0KLQl1bmxpbmsgJHBpZGZpbGUgaWYgJHBpZGZpbGU7Ci0JY2xlYW51cCgpOwotCWV4aXQgMDsKLX0KLQotc3ViIGxwcmludCB7Ci0JcHJpbnQgU1RERVJSIHNjYWxhcihsb2NhbHRpbWUpLCAiOiAiLCBAXywgIlxuIjsKLX0KLQotIyBUaGVzZSBhcmUgb3ZlcnJpZGRlbiBpbiBhY3R1YWwgc2VydmVyIHRocmVhZDoKLSMKLSRTSUd7SU5UfSAgPSBcJmdldF9vdXQ7Ci0kU0lHe1RFUk19ID0gXCZnZXRfb3V0OwotCi0jIHBpZGZpbGU6Ci0jCi1zdWIgb3Blbl9waWRmaWxlIHsKLQlpZiAoZXhpc3RzICRFTlZ7VUxUUkFWTkNfUkVQRUFURVJfUElERklMRX0pIHsKLQkJbXkgJHBmID0gJEVOVntVTFRSQVZOQ19SRVBFQVRFUl9QSURGSUxFfTsKLQkJaWYgKG9wZW4oUElELCAiPiRwZiIpKSB7Ci0JCQlwcmludCBQSUQgIiQkXG4iOwotCQkJY2xvc2UgUElEOwotCQkJJHBpZGZpbGUgPSAkcGY7Ci0JCX0gZWxzZSB7Ci0JCQlscHJpbnQoImNvdWxkIG5vdCBvcGVuIHBpZGZpbGU6ICRwZiAtICQhIC0gY29udGludWluZy4uLiIpOwotCQl9Ci0JCWRlbGV0ZSAkRU5We1VMVFJBVk5DX1JFUEVBVEVSX1BJREZJTEV9OwotCX0KLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2V0IFVMVFJBVk5DX1JFUEVBVEVSX0xPT1A9MSB0byBoYXZlIHRoaXMgc2NyaXB0IGNyZWF0ZSBhbiBvdXRlciBsb29wCi0jIHJlc3RhcnRpbmcgaXRzZWxmIGlmIGl0IGV2ZXIgZXhpdHMuICBTZXQgVUxUUkFWTkNfUkVQRUFURVJfTE9PUD1CRyB0bwotIyBkbyB0aGlzIGluIHRoZSBiYWNrZ3JvdW5kIGFzIGEgZGFlbW9uLgotCi1pZiAoZXhpc3RzICRFTlZ7VUxUUkFWTkNfUkVQRUFURVJfTE9PUH0pIHsKLQlteSAkY3NsID0gJEVOVntVTFRSQVZOQ19SRVBFQVRFUl9MT09QfTsKLQlpZiAoJGNzbCBuZSAnQkcnICYmICRjc2wgbmUgJzEnKSB7Ci0JCWRpZSAidWx0cmF2bmNfcmVwZWF0ZXIucGw6IGludmFsaWQgVUxUUkFWTkNfUkVQRUFURVJfTE9PUC5cbiI7Ci0JfQotCWlmICgkY3NsIGVxICdCRycpIHsKLQkJIyBnbyBpbnRvIGJnIGFzICJkYWVtb24iOgotCQlzZXRwZ3JwKDAsIDApOwotCQlteSAkcGlkID0gZm9yaygpOwotCQlpZiAoISBkZWZpbmVkICRwaWQpIHsKLQkJCWRpZSAidWx0cmF2bmNfcmVwZWF0ZXIucGw6ICQhXG4iOwotCQl9IGVsc2lmICgkcGlkKSB7Ci0JCQl3YWl0OwotCQkJZXhpdCAwOwotCQl9Ci0JCWlmIChmb3JrKSB7Ci0JCQlleGl0IDA7Ci0JCX0KLQkJc2V0cGdycCgwLCAwKTsKLQkJY2xvc2UgU1RESU47Ci0JCWlmICghICRFTlZ7VUxUUkFWTkNfUkVQRUFURVJfTE9HRklMRX0pIHsKLQkJCWNsb3NlIFNURE9VVDsKLQkJCWNsb3NlIFNUREVSUjsKLQkJfQotCX0KLQlkZWxldGUgJEVOVntVTFRSQVZOQ19SRVBFQVRFUl9MT09QfTsKLQotCWlmIChleGlzdHMgJEVOVntVTFRSQVZOQ19SRVBFQVRFUl9QSURGSUxFfSkgewotCQlvcGVuX3BpZGZpbGUoKTsKLQl9Ci0KLQlscHJpbnQoInVsdHJhdm5jX3JlcGVhdGVyLnBsOiBzdGFydGluZyBzZXJ2aWNlLiBtYXN0ZXItcGlkPSQkIik7Ci0Jd2hpbGUgKDEpIHsKLQkJJGxvb3BwaWQgPSBmb3JrOwotCQlpZiAoISBkZWZpbmVkICRsb29wcGlkKSB7Ci0JCQlzbGVlcCAxMDsKLQkJfSBlbHNpZiAoJGxvb3BwaWQpIHsKLQkJCXdhaXQ7Ci0JCX0gZWxzZSB7Ci0JCQlleGVjICQwLCBAQVJHVjsJCi0JCQlleGl0IDE7Ci0JCX0KLQkJbHByaW50KCJ1bHRyYXZuY19yZXBlYXRlci5wbDogcmUtc3RhcnRpbmcgc2VydmljZS4gIG1hc3Rlci1waWQ9JCQiKTsKLQkJc2xlZXAgMTsKLQl9Ci0JZXhpdCAwOwotfQotaWYgKGV4aXN0cyAkRU5We1VMVFJBVk5DX1JFUEVBVEVSX1BJREZJTEV9KSB7Ci0Jb3Blbl9waWRmaWxlKCk7Ci19Ci0KLSMgRW5kIG9mIGJhY2tncm91bmQvZGFlbW9uIHN0dWZmLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdXNlIHdhcm5pbmdzOwotdXNlIElPOjpTb2NrZXQ6OklORVQ7Ci11c2UgSU86OlNlbGVjdDsKLQotIyBUZXN0IGZvciBJTkVUNiBzdXBwb3J0OgotIwotbXkgJGhhdmVfaW5ldDYgPSAwOwotZXZhbCAidXNlIElPOjpTb2NrZXQ6OklORVQ2OyI7Ci0kaGF2ZV9pbmV0NiA9IDEgaWYgJEAgZXEgIiI7Ci1wcmludCAicGVybCBtb2R1bGUgSU86OlNvY2tldDo6SU5FVDYgbm90IGF2YWlsYWJsZTogbm8gSVB2NiBzdXBwb3J0LlxuIiBpZiAhICRoYXZlX2luZXQ2OwotCi1teSAkcHJvZyA9ICd1bHRyYXZuY19yZXBlYXRlcic7Ci1teSAlSUQ7Ci0KLW15ICRyZWZ1c2UgPSAwOwotbXkgJGluaXRfdGltZW91dCA9IDU7Ci0KLWlmIChAQVJHViAmJiAkQVJHVlswXSA9fiAvLWgvKSB7Ci0JcHJpbnQgJHVzYWdlOwotCWV4aXQgMDsKLX0KLWlmIChAQVJHViAmJiAkQVJHVlswXSBlcSAnLXInKSB7Ci0JJHJlZnVzZSA9IDE7Ci0JbHByaW50KCJlbmFibGluZyByZWZ1c2UgbW9kZSAoLXIpLiIpOwotCXNoaWZ0OwotfQotCi1teSAkY2xpZW50X3BvcnQgPSBzaGlmdDsKLW15ICRzZXJ2ZXJfcG9ydCA9IHNoaWZ0OwotCi0kY2xpZW50X3BvcnQgPSA1OTAwIHVubGVzcyAkY2xpZW50X3BvcnQ7Ci0kc2VydmVyX3BvcnQgPSA1NTAwIHVubGVzcyAkc2VydmVyX3BvcnQ7Ci0KLW15ICR1bmFtZSA9IGB1bmFtZWA7Ci0KLW15ICRyZXBlYXRlcl9idWZzaXplID0gMjUwOwotJHJlcGVhdGVyX2J1ZnNpemUgPSAkRU5We0JVRlNJWkV9IGlmIGV4aXN0cyAkRU5We0JVRlNJWkV9OwotCi1teSAoJFJJTiwgJFdJTiwgJEVJTiwgJFJPVVQpOwotCi1teSAkY2xpZW50X2xpc3RlbiA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQlMaXN0ZW4gICAgPT4gMTAsCi0JTG9jYWxQb3J0ID0+ICRjbGllbnRfcG9ydCwgCi0JUmV1c2VBZGRyID0+IDEsCi0JUHJvdG8gPT4gInRjcCIKLSk7Ci1teSAkZXJyMSA9ICQhOwotbXkgJGVycjIgPSAnJzsKLSRjbGllbnRfbGlzdGVuID0gJycgaWYgISAkY2xpZW50X2xpc3RlbjsKLQotbXkgJGNsaWVudF9saXN0ZW42ID0gJyc7Ci1pZiAoJGhhdmVfaW5ldDYpIHsKLQlldmFsIHskY2xpZW50X2xpc3RlbjYgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQlMaXN0ZW4gICAgPT4gMTAsCi0JCUxvY2FsUG9ydCA9PiAkY2xpZW50X3BvcnQsCi0JCVJldXNlQWRkciA9PiAxLAotCQlEb21haW4gICAgPT4gQUZfSU5FVDYsCi0JCUxvY2FsQWRkciA9PiAiOjoiLAotCQlQcm90byAgICAgPT4gInRjcCIKLQkpO307Ci0JJGVycjIgPSAkITsKLX0KLWlmICghICRjbGllbnRfbGlzdGVuICYmICEgJGNsaWVudF9saXN0ZW42KSB7Ci0JY2xlYW51cCgpOwotCWRpZSAiJHByb2c6IGVycm9yOiBjbGllbnQgbGlzdGVuIG9uIHBvcnQgJGNsaWVudF9wb3J0OiAkZXJyMSAtICRlcnIyXG4iOwotfQotCi1teSAkc2VydmVyX2xpc3RlbiA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKLQlMaXN0ZW4gICAgPT4gMTAsCi0JTG9jYWxQb3J0ID0+ICRzZXJ2ZXJfcG9ydCwgCi0JUmV1c2VBZGRyID0+IDEsCi0JUHJvdG8gPT4gInRjcCIKLSk7Ci0kZXJyMSA9ICQhOwotJGVycjIgPSAnJzsKLSRzZXJ2ZXJfbGlzdGVuID0gJycgaWYgISAkc2VydmVyX2xpc3RlbjsKLQotbXkgJHNlcnZlcl9saXN0ZW42ID0gJyc7Ci1pZiAoJGhhdmVfaW5ldDYpIHsKLQlldmFsIHskc2VydmVyX2xpc3RlbjYgPSBJTzo6U29ja2V0OjpJTkVUNi0+bmV3KAotCQlMaXN0ZW4gICAgPT4gMTAsCi0JCUxvY2FsUG9ydCA9PiAkc2VydmVyX3BvcnQsCi0JCVJldXNlQWRkciA9PiAxLAotCQlEb21haW4gICAgPT4gQUZfSU5FVDYsCi0JCUxvY2FsQWRkciA9PiAiOjoiLAotCQlQcm90byAgICAgPT4gInRjcCIKLQkpO307Ci0JJGVycjIgPSAkITsKLX0KLWlmICghICRzZXJ2ZXJfbGlzdGVuICYmICEgJHNlcnZlcl9saXN0ZW42KSB7Ci0JY2xlYW51cCgpOwotCWRpZSAiJHByb2c6IGVycm9yOiBzZXJ2ZXIgbGlzdGVuIG9uIHBvcnQgJHNlcnZlcl9wb3J0OiAkZXJyMSAtICRlcnIyXG4iOwotfQotCi1teSAkc2VsZWN0ID0gbmV3IElPOjpTZWxlY3QoKTsKLWlmICghICRzZWxlY3QpIHsKLQljbGVhbnVwKCk7Ci0JZGllICIkcHJvZzogc2VsZWN0ICQhXG4iOwotfQotCi0kc2VsZWN0LT5hZGQoJGNsaWVudF9saXN0ZW4pICBpZiAkY2xpZW50X2xpc3RlbjsKLSRzZWxlY3QtPmFkZCgkY2xpZW50X2xpc3RlbjYpIGlmICRjbGllbnRfbGlzdGVuNjsKLSRzZWxlY3QtPmFkZCgkc2VydmVyX2xpc3RlbikgIGlmICRzZXJ2ZXJfbGlzdGVuOwotJHNlbGVjdC0+YWRkKCRzZXJ2ZXJfbGlzdGVuNikgaWYgJHNlcnZlcl9saXN0ZW42OwotCi0kU0lHe0lOVH0gID0gc3ViIHtjbGVhbnVwKCk7IGV4aXQ7fTsKLSRTSUd7VEVSTX0gPSBzdWIge2NsZWFudXAoKTsgZXhpdDt9OwotCi1teSAkU09DSzEgPSAnJzsKLW15ICRTT0NLMiA9ICcnOwotbXkgJENVUlIgPSAnJzsKLQotbHByaW50KCIkcHJvZzogc3RhcnRpbmcgdXAuICBwaWQ6ICQkIik7Ci1scHJpbnQoIndhdGNoaW5nIGZvciBJUHY0IGNvbm5lY3Rpb25zIG9uICRjbGllbnRfcG9ydC9jbGllbnQuIikgaWYgJGNsaWVudF9saXN0ZW47Ci1scHJpbnQoIndhdGNoaW5nIGZvciBJUHY0IGNvbm5lY3Rpb25zIG9uICRzZXJ2ZXJfcG9ydC9zZXJ2ZXIuIikgaWYgJHNlcnZlcl9saXN0ZW47Ci1scHJpbnQoIndhdGNoaW5nIGZvciBJUHY2IGNvbm5lY3Rpb25zIG9uICRjbGllbnRfcG9ydC9jbGllbnQuIikgaWYgJGNsaWVudF9saXN0ZW42OwotbHByaW50KCJ3YXRjaGluZyBmb3IgSVB2NiBjb25uZWN0aW9ucyBvbiAkc2VydmVyX3BvcnQvc2VydmVyLiIpIGlmICRzZXJ2ZXJfbGlzdGVuNjsKLQotbXkgJGFsYXJtX3NvY2sgPSAnJzsKLW15ICRnb3RfYWxhcm0gPSAwOwotc3ViIGFsYXJtX2hhbmRsZXIgewotCWxwcmludCgiJHByb2c6IGdvdCBzaWcgYWxhcm0uIik7Ci0JaWYgKCRhbGFybV9zb2NrIG5lICcnKSB7Ci0JCWNsb3NlICRhbGFybV9zb2NrOwotCX0KLQkkYWxhcm1fc29jayA9ICcnOwotCSRnb3RfYWxhcm0gPSAxOwotfQotCi13aGlsZSAobXkgQHJlYWR5ID0gJHNlbGVjdC0+Y2FuX3JlYWQoKSkgewotCWZvcmVhY2ggbXkgJGZoIChAcmVhZHkpIHsKLQkJaWYgKCgkY2xpZW50X2xpc3RlbiAmJiAkZmggPT0gJGNsaWVudF9saXN0ZW4pIHx8ICgkY2xpZW50X2xpc3RlbjYgJiYgJGZoID09ICRjbGllbnRfbGlzdGVuNikpIHsKLQkJCWxwcmludCgibmV3IHZuYyBjbGllbnQgY29ubmVjdGluZy4iKTsgCi0JCX0gZWxzaWYgKCgkc2VydmVyX2xpc3RlbiAmJiAkZmggPT0gJHNlcnZlcl9saXN0ZW4pIHx8ICgkc2VydmVyX2xpc3RlbjYgJiYgJGZoID09ICRzZXJ2ZXJfbGlzdGVuNikpIHsKLQkJCWxwcmludCgibmV3IHZuYyBzZXJ2ZXIgY29ubmVjdGluZy4iKTsgCi0JCX0KLQkJbXkgJHNvY2sgPSAkZmgtPmFjY2VwdCgpOwotCQlpZiAoISAkc29jaykgewotCQkJbHByaW50KCIkcHJvZzogYWNjZXB0ICQhIik7Ci0JCQluZXh0OwotCQl9Ci0KLQkJaWYgKCgkY2xpZW50X2xpc3RlbiAmJiAkZmggPT0gJGNsaWVudF9saXN0ZW4pIHx8ICgkY2xpZW50X2xpc3RlbjYgJiYgJGZoID09ICRjbGllbnRfbGlzdGVuNikpIHsKLQkJCWlmIChleGlzdHMgJEVOVntVTFRSQVZOQ19SRVBFQVRFUl9OT19SRkJ9ICYmICRFTlZ7VUxUUkFWTkNfUkVQRUFURVJfTk9fUkZCfSkgewotCQkJCWxwcmludCgiVUxUUkFWTkNfUkVQRUFURVJfTk9fUkZCOiBub3Qgc2VuZGluZyBSRkIgMDAwLjAwMCIpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJbXkgJHN0ciA9ICJSRkIgMDAwLjAwMFxuIjsKLQkJCQlteSAkbGVuID0gbGVuZ3RoICRzdHI7Ci0JCQkJbXkgJG4gPSBzeXN3cml0ZSgkc29jaywgJHN0ciwgJGxlbiwgMCk7Ci0JCQkJaWYgKCRuICE9ICRsZW4pIHsKLQkJCQkJbHByaW50KCIkcHJvZzogYmFkICRzdHIgd3JpdGU6ICRuICE9ICRsZW4gJCEiKTsKLQkJCQkJY2xvc2UgJHNvY2s7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbXkgJGJ1ZiA9ICcnOwotCQlteSAkc2l6ZSA9ICRyZXBlYXRlcl9idWZzaXplOwotCQkkc2l6ZSA9IDEwMjQgdW5sZXNzICRzaXplOwotCi0JCSRTSUd7QUxSTX0gPSAiYWxhcm1faGFuZGxlciI7Ci0JCSRhbGFybV9zb2NrID0gJHNvY2s7Ci0JCSRnb3RfYWxhcm0gPSAwOwotCQlhbGFybSgkaW5pdF90aW1lb3V0KTsKLQkJbXkgJG4gPSBzeXNyZWFkKCRzb2NrLCAkYnVmLCAkc2l6ZSk7Ci0JCWFsYXJtKDApOwotCi0JCWlmICgkZ290X2FsYXJtKSB7Ci0JCQlscHJpbnQoIiRwcm9nOiByZWFkIHRpbWVkIG91dDogJCEiKTsKLQkJfSBlbHNpZiAoISBkZWZpbmVkICRuKSB7Ci0JCQlscHJpbnQoIiRwcm9nOiByZWFkIGVycm9yOiAkISIpOwotCQl9IGVsc2lmICgkcmVwZWF0ZXJfYnVmc2l6ZSA+IDAgJiYgJG4gIT0gJHNpemUpIHsKLQkJCWxwcmludCgiJHByb2c6IHNob3J0IHJlYWQgJG4gIT0gJHNpemUgJCEiKTsKLQkJCWNsb3NlICRzb2NrOwotCQl9IGVsc2lmICgoJGNsaWVudF9saXN0ZW4gJiYgJGZoID09ICRjbGllbnRfbGlzdGVuKSB8fCAoJGNsaWVudF9saXN0ZW42ICYmICRmaCA9PSAkY2xpZW50X2xpc3RlbjYpKSB7Ci0JCQlkb19uZXdfY2xpZW50KCRzb2NrLCAkYnVmKTsKLQkJfSBlbHNpZiAoKCRzZXJ2ZXJfbGlzdGVuICYmICRmaCA9PSAkc2VydmVyX2xpc3RlbikgfHwgKCRzZXJ2ZXJfbGlzdGVuNiAmJiAkZmggPT0gJHNlcnZlcl9saXN0ZW42KSkgewotCQkJZG9fbmV3X3NlcnZlcigkc29jaywgJGJ1Zik7Ci0JCX0KLQl9Ci19Ci0KLXN1YiBkb19uZXdfY2xpZW50IHsKLQlteSAoJHNvY2ssICRidWYpID0gQF87Ci0KLQlpZiAoJGJ1ZiA9fiAvXklEOihcdyspLykgewotCQlteSAkaWQgPSAkMTsKLQkJaWYgKGV4aXN0cyAkSUR7JGlkfSAmJiBleGlzdHMgJElEeyRpZH17Y2xpZW50fSAmJiAkSUR7JGlkfXtjbGllbnR9IGVxICIwIikgewotCQkJaWYgKCFlc3RhYmxpc2hlZCgkSUR7JGlkfXtzb2NrfSkpIHsKLQkJCQlscHJpbnQoInNlcnZlciBzb2NrZXQgZm9yIElEOiRpZCBpcyBubyBsb25nZXIgZXN0YWJsaXNoZWQsIGNsb3NpbmcgaXQuIik7Ci0JCQkJY2xvc2UgJElEeyRpZH17c29ja307Ci0JCQkJZGVsZXRlICRJRHskaWR9OwotCQkJfSBlbHNlIHsKLQkJCQlscHJpbnQoInNlcnZlciBzb2NrZXQgZm9yIElEOiRpZCBpcyBzdGlsbCBlc3RhYmxpc2hlZC4iKTsKLQkJCX0KLQkJfQotCQlpZiAoZXhpc3RzICRJRHskaWR9KSB7Ci0JCQlpZiAoJElEeyRpZH17Y2xpZW50fSkgewotCQkJCW15ICRyZWYgPSAkcmVmdXNlOwotCQkJCWlmICgkcmVmICYmICFlc3RhYmxpc2hlZCgkSUR7JGlkfXtzb2NrfSkpIHsKLQkJCQkJbHByaW50KCJzb2NrZXQgZm9yIElEOiRpZCBpcyBubyBsb25nZXIgZXN0YWJsaXNoZWQsIGNsb3NpbmcgaXQuIik7Ci0JCQkJCSRyZWYgPSAwOwotCQkJCX0KLQkJCQlpZiAoJHJlZikgewotCQkJCQlscHJpbnQoInJlZnVzaW5nIGV4dHJhIHZuYyBjbGllbnQgZm9yIElEOiRpZC4iKTsKLQkJCQkJY2xvc2UgJHNvY2s7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQlscHJpbnQoImNsb3NpbmcgYW5kIGRlbGV0aW5nIHByZXZpb3VzIHZuYyBjbGllbnQgd2l0aCBJRDokaWQuIik7Ci0JCQkJCWNsb3NlICRJRHskaWR9e3NvY2t9OwotCi0JCQkJCWxwcmludCgic3RvcmluZyBuZXcgdm5jIGNsaWVudCB3aXRoIElEOiRpZC4iKTsKLQkJCQkJJElEeyRpZH17Y2xpZW50fSA9IDE7Ci0JCQkJCSRJRHskaWR9e3NvY2t9ID0gJHNvY2s7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlscHJpbnQoImhvb2tpbmcgdXAgbmV3IHZuYyBjbGllbnQgd2l0aCBleGlzdGluZyB2bmMgc2VydmVyIGZvciBJRDokaWQuIik7Ci0JCQkJbXkgJHNvY2syID0gJElEeyRpZH17c29ja307Ci0JCQkJZGVsZXRlICRJRHskaWR9OwotCQkJCWhvb2t1cCgkc29jaywgJHNvY2syLCAiSUQ6JGlkIik7IAotCQkJfQotCQl9IGVsc2UgewotCQkJbHByaW50KCJzdG9yaW5nIG5ldyB2bmMgY2xpZW50IHdpdGggSUQ6JGlkLiIpOwotCQkJJElEeyRpZH17Y2xpZW50fSA9IDE7Ci0JCQkkSUR7JGlkfXtzb2NrfSA9ICRzb2NrOwotCQl9Ci0JfSBlbHNlIHsKLQkJbXkgJHN0ciA9IHNwcmludGYoIiVzIiwgJGJ1Zik7Ci0JCSRzdHIgPX4gcy9ccyokLy9nOwotCQkkc3RyID1+IHMvXDAqJC8vZzsKLQkJbXkgJGhvc3QgPSAnJzsKLQkJbXkgJHBvcnQgPSAnJzsKLQkJaWYgKCRzdHIgPX4gL14oLispOihcZCspJC8pIHsKLQkJCSRob3N0ID0gJDE7Ci0JCQkkcG9ydCA9ICQyOwotCQl9IGVsc2UgewotCQkJJGhvc3QgPSAkc3RyOwotCQkJJHBvcnQgPSA1OTAwOwotCQl9Ci0JCWlmICgkcG9ydCA8IDApIHsKLQkJCW15ICRwbmV3ID0gLSRwb3J0OwotCQkJbHByaW50KCJyZXNldHRpbmcgcG9ydCBmcm9tICRwb3J0IHRvICRwbmV3LiIpOwotCQkJJHBvcnQgPSAkcG5ldzsKLQkJfSBlbHNpZiAoJHBvcnQgPCAyMDApIHsKLQkJCW15ICRwbmV3ID0gJHBvcnQgKyA1OTAwOwotCQkJbHByaW50KCJyZXNldHRpbmcgcG9ydCBmcm9tICRwb3J0IHRvICRwbmV3LiIpOwotCQkJJHBvcnQgPSAkcG5ldzsKLQkJfQotCQlscHJpbnQoIm1ha2luZyB2bmMgY2xpZW50IGNvbm5lY3Rpb24gZGlyZWN0bHkgdG8gdm5jIHNlcnZlciBob3N0PSckaG9zdCcgcG9ydD0nJHBvcnQnLiIpOwotCQlteSAkc29jazIgPSAgSU86OlNvY2tldDo6SU5FVC0+bmV3KAotCQkJUGVlckFkZHIgPT4gJGhvc3QsCi0JCQlQZWVyUG9ydCA9PiAkcG9ydCwKLQkJCVByb3RvID0+ICJ0Y3AiCi0JCSk7Ci0JCWlmICghICRzb2NrMiAmJiAkaGF2ZV9pbmV0NikgewotCQkJbHByaW50KCJJUHY0IGNvbm5lY3QgZXJyb3I6ICQhLCB0cnlpbmcgSVB2NiAuLi4iKTsKLQkJCWV2YWx7JHNvY2syID0gSU86OlNvY2tldDo6SU5FVDYtPm5ldygKLQkJCQlQZWVyQWRkciA9PiAkaG9zdCwKLQkJCQlQZWVyUG9ydCA9PiAkcG9ydCwKLQkJCQlQcm90byA9PiAidGNwIgotCQkJKTt9OwotCQkJbHByaW50KCJJUHY2IGNvbm5lY3QgZXJyb3I6ICQhIikgaWYgISRzb2NrMjsKLQkJfSBlbHNlIHsKLQkJCWxwcmludCgiSVB2NCBjb25uZWN0IGVycm9yOiAkISIpIGlmICEkc29jazI7Ci0JCX0KLQkJaWYgKCEkc29jazIpIHsKLQkJCWxwcmludCgiZmFpbGVkIHRvIGNvbm5lY3QgdG8gJGhvc3Q6JHBvcnQuIik7Ci0JCQljbG9zZSAkc29jazsKLQkJCXJldHVybjsKLQkJfQotCQlob29rdXAoJHNvY2ssICRzb2NrMiwgIiRob3N0OiRwb3J0Iik7IAotCX0KLX0KLQotc3ViIGRvX25ld19zZXJ2ZXIgewotCW15ICgkc29jaywgJGJ1ZikgPSBAXzsKLQotCWlmICgkYnVmID1+IC9eSUQ6KFx3KykvKSB7Ci0JCW15ICRpZCA9ICQxOwotCQlteSAkc3RvcmUgPSAxOwotCQlpZiAoZXhpc3RzICRJRHskaWR9ICYmIGV4aXN0cyAkSUR7JGlkfXtjbGllbnR9ICYmICRJRHskaWR9e2NsaWVudH0gZXEgIjEiKSB7Ci0JCQlpZiAoIWVzdGFibGlzaGVkKCRJRHskaWR9e3NvY2t9KSkgewotCQkJCWxwcmludCgiY2xpZW50IHNvY2tldCBmb3IgSUQ6JGlkIGlzIG5vIGxvbmdlciBlc3RhYmxpc2hlZCwgY2xvc2luZyBpdC4iKTsKLQkJCQljbG9zZSAkSUR7JGlkfXtzb2NrfTsKLQkJCQlkZWxldGUgJElEeyRpZH07Ci0JCQl9IGVsc2UgewotCQkJCWxwcmludCgiY2xpZW50IHNvY2tldCBmb3IgSUQ6JGlkIGlzIHN0aWxsIGVzdGFibGlzaGVkLiIpOwotCQkJfQotCQl9Ci0JCWlmIChleGlzdHMgJElEeyRpZH0pIHsKLQkJCWlmICghICRJRHskaWR9e2NsaWVudH0pIHsKLQkJCQlteSAkcmVmID0gJHJlZnVzZTsKLQkJCQlpZiAoJHJlZiAmJiAhZXN0YWJsaXNoZWQoJElEeyRpZH17c29ja30pKSB7Ci0JCQkJCWxwcmludCgic29ja2V0IGZvciBJRDokaWQgaXMgbm8gbG9uZ2VyIGVzdGFibGlzaGVkLCBjbG9zaW5nIGl0LiIpOwotCQkJCQkkcmVmID0gMDsKLQkJCQl9Ci0JCQkJaWYgKCRyZWYpIHsKLQkJCQkJbHByaW50KCJyZWZ1c2luZyBleHRyYSB2bmMgc2VydmVyIGZvciBJRDokaWQuIik7Ci0JCQkJCWNsb3NlICRzb2NrOwotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHByaW50KCJjbG9zaW5nIGFuZCBkZWxldGluZyBwcmV2aW91cyB2bmMgc2VydmVyIHdpdGggSUQ6JGlkLiIpOwotCQkJCQljbG9zZSAkSUR7JGlkfXtzb2NrfTsKLQotCQkJCQlscHJpbnQoInN0b3JpbmcgbmV3IHZuYyBzZXJ2ZXIgd2l0aCBJRDokaWQuIik7Ci0JCQkJCSRJRHskaWR9e2NsaWVudH0gPSAwOwotCQkJCQkkSUR7JGlkfXtzb2NrfSA9ICRzb2NrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbHByaW50KCJob29raW5nIHVwIG5ldyB2bmMgc2VydmVyIHdpdGggZXhpc3Rpbmcgdm5jIGNsaWVudCBmb3IgSUQ6JGlkLiIpOwotCQkJCW15ICRzb2NrMiA9ICRJRHskaWR9e3NvY2t9OwotCQkJCWRlbGV0ZSAkSUR7JGlkfTsKLQkJCQlob29rdXAoJHNvY2ssICRzb2NrMiwgIklEOiRpZCIpOyAKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxwcmludCgic3RvcmluZyBuZXcgdm5jIHNlcnZlciB3aXRoIElEOiRpZC4iKTsKLQkJCSRJRHskaWR9e2NsaWVudH0gPSAwOwotCQkJJElEeyRpZH17c29ja30gPSAkc29jazsKLQkJfQotCX0gZWxzZSB7Ci0JCWxwcmludCgiaW52YWxpZCBJRDpOTk5OTiBzdHJpbmcgZm9yIHZuYyBzZXJ2ZXI6ICRidWYiKTsKLQkJY2xvc2UgJHNvY2s7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXN1YiBlc3RhYmxpc2hlZCB7Ci0JbXkgJGZoID0gc2hpZnQ7Ci0KLQlyZXR1cm4gZXN0YWJsaXNoZWRfbGludXhfcHJvYygkZmgpOwotCi0JIyBub3Qgd29ya2luZzoKLQlteSAkZXN0ID0gMTsKLQlteSAkc3RyID0gIloiOwotCW15ICRyZXM7Ci0JIyRyZXMgPSByZWN2KCRmaCwgJHN0ciwgMSwgTVNHX1BFRUsgfCBNU0dfRE9OVFdBSVQpOwotCWlmIChkZWZpbmVkKCRyZXMpKSB7Ci0JCWxwcmludCgiZXN0YWJsaXNoZWQgT0s6ICAkISAnJHN0cicuIik7Ci0JCSRlc3QgPSAxOwotCX0gZWxzZSB7Ci0JCSMgd291bGQgY2hlY2sgZm9yIEVBR0FJTiBoZXJlIHRvIGRlY2lkZSAuLi4KLQkJbHByaW50KCJlc3RhYmxpc2hlZCBlcnI6ICQhICckc3RyJy4iKTsKLQkJJGVzdCA9IDE7Ci0JfQotCXJldHVybiAkZXN0OwotfQotCi0KLXN1YiBlc3RhYmxpc2hlZF9saW51eF9wcm9jIHsKLQkjIGhhY2sgZm9yIExpbnV4IHRvIHNlZSBpZiByZW1vdGUgc2lkZSBoYXMgZ29uZSBhd2F5OgotCW15ICRmaCA9IHNoaWZ0OwotCi0JIyBpZiB3ZSBjYW4ndCBmaWd1cmUgdGhpbmdzIG91dCwgd2UgbXVzdCByZXR1cm4gdHJ1ZS4KLQlpZiAoJHVuYW1lICF+IC9MaW51eC8pIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JbXkgQHByb2NfbmV0X3RjcCA9ICgpOwotCWlmICgtZSAiL3Byb2MvbmV0L3RjcCIpIHsKLQkJcHVzaCBAcHJvY19uZXRfdGNwLCAiL3Byb2MvbmV0L3RjcCI7Ci0JfQotCWlmICgtZSAiL3Byb2MvbmV0L3RjcDYiKSB7Ci0JCXB1c2ggQHByb2NfbmV0X3RjcCwgIi9wcm9jL25ldC90Y3A2IjsKLQl9Ci0JaWYgKCEgQHByb2NfbmV0X3RjcCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQlteSAkbiA9IGZpbGVubygkZmgpOwotCWlmICghZGVmaW5lZCgkbikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JbXkgJHByb2NfZmQgPSAiL3Byb2MvJCQvZmQvJG4iOwotCWlmICghIC1lICRwcm9jX2ZkKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCW15ICR2YWwgPSByZWFkbGluaygkcHJvY19mZCk7Ci0JaWYgKCEgZGVmaW5lZCAkdmFsIHx8ICR2YWwgIX4gL3NvY2tldDpcWyhcZCspXF0vKSB7Ci0JCXJldHVybiAxOwotCX0KLQlteSAkbnVtID0gJDE7Ci0KLQlteSAkc3QgPSAnJzsKLQotCWZvcmVhY2ggbXkgJHRjcCAoQHByb2NfbmV0X3RjcCkgewotCQlpZiAoISBvcGVuKFRDUCwgIjwkdGNwIikpIHsKLQkJCW5leHQ7Ci0JCX0KLQkJd2hpbGUgKDxUQ1A+KSB7Ci0JCQluZXh0IGlmIC9eXHMqW0Etel0vOwotCQkJY2hvbXA7Ci0JCQkjICBzbCAgbG9jYWxfYWRkcmVzcyByZW1fYWRkcmVzcyAgIHN0IHR4X3F1ZXVlIHJ4X3F1ZXVlIHRyIHRtLT53aGVuIHJldHJuc210ICAgdWlkICB0aW1lb3V0IGlub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCSMgMTcwOiAwMTAyMDAwQToxNzBDIEZFMDIwMDBBOjg3RkEgMDEgMDAwMDAwMDA6MDAwMDAwMDAgMDA6MDAwMDAwMDAgMDAwMDAwMDAgIDEwMDEgICAgICAgIDAgNDIzMjk0NzY2IDEgZjZmYTQxMDAgMjEgNCA0IDIgLTEKLQkJCSMgMTcyOiAwMTAyMDAwQToxNzBDIEZFMDIwMDBBOjg3RkEgMDggMDAwMDAwMDA6MDAwMDAwMDEgMDA6MDAwMDAwMDAgMDAwMDAwMDAgIDEwMDEgICAgICAgIDAgNDIzMjk0NzY2IDEgZjZmYTQxMDAgMjEgNCA0IDIgLTEKLQkJCW15IEBpdGVtcyA9IHNwbGl0KCcgJywgJF8pOwotCQkJbXkgJHN0YXRlID0gJGl0ZW1zWzNdOwotCQkJbXkgJGlub2RlID0gJGl0ZW1zWzldOwotCQkJaWYgKCFkZWZpbmVkICRzdGF0ZSB8fCAkc3RhdGUgIX4gL15cZCskLykgewotCQkJCW5leHQ7Ci0JCQl9Ci0JCQlpZiAoIWRlZmluZWQgJGlub2RlIHx8ICRpbm9kZSAhfiAvXlxkKyQvKSB7Ci0JCQkJbmV4dDsKLQkJCX0KLQkJCWlmICgkaW5vZGUgPT0gJG51bSkgewotCQkJCSRzdCA9ICRzdGF0ZTsKLQkJCQlsYXN0OwotCQkJfQotCQl9Ci0JCWNsb3NlIFRDUDsKLQkJbGFzdCBpZiAkc3QgbmUgJyc7Ci0JfQotCi0JaWYgKCRzdCBuZSAnJyAmJiAkc3QgIT0gMSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN1YiBoYW5kbGVyIHsKLQlscHJpbnQoIlxbJCQvJENVUlJdIGdvdCBTSUdURVJNLiIpOwotCWNsb3NlICRTT0NLMSBpZiAkU09DSzE7Ci0JY2xvc2UgJFNPQ0syIGlmICRTT0NLMjsKLQlleGl0OwotfQotCi1zdWIgaG9va3VwIHsKLQlteSAoJHNvY2sxLCAkc29jazIsICR0YWcpID0gQF87Ci0KLQlteSAkd29ya2VyID0gZm9yaygpOwotCi0JaWYgKCEgZGVmaW5lZCAkd29ya2VyKSB7Ci0JCWxwcmludCgiZmFpbGVkIHRvIGZvcmsgd29ya2VyOiAkISIpOwotCQljbG9zZSAkc29jazE7Ci0JCWNsb3NlICRzb2NrMjsKLQkJcmV0dXJuOwotCX0gZWxzaWYgKCR3b3JrZXIpIHsKLQkJY2xvc2UgJHNvY2sxOwotCQljbG9zZSAkc29jazI7Ci0JCXdhaXQ7Ci0JfSBlbHNlIHsKLQkJY2xlYW51cCgpOwotCQlpZiAoZm9yaykgewotCQkJZXhpdCAwOwotCQl9Ci0JCXNldHBncnAoMCwgMCk7Ci0JCSRTT0NLMSA9ICRzb2NrMTsKLQkJJFNPQ0syID0gJHNvY2syOwotCQkkQ1VSUiAgPSAkdGFnOwotCQkkU0lHe1RFUk19ID0gImhhbmRsZXIiOwotCQkkU0lHe0lOVH0gID0gImhhbmRsZXIiOwotCQl4ZmVyX2JvdGgoJHNvY2sxLCAkc29jazIpOwotCQlleGl0IDA7Ci0JfQotfQotCi1zdWIgeGZlciB7Ci0JbXkgKCRpbiwgJG91dCkgPSBAXzsKLQotCSRSSU4gPSAkV0lOID0gJEVJTiA9ICIiOwotCSRST1VUID0gIiI7Ci0JdmVjKCRSSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JdmVjKCRXSU4sIGZpbGVubygkaW4pLCAxKSA9IDE7Ci0JJEVJTiA9ICRSSU4gfCAkV0lOOwotCi0JbXkgJGJ1ZjsKLQotCXdoaWxlICgxKSB7Ci0JCW15ICRuZiA9IDA7Ci0JCXdoaWxlICghICRuZikgewotCQkJJG5mID0gc2VsZWN0KCRST1VUPSRSSU4sIHVuZGVmLCB1bmRlZiwgdW5kZWYpOwotCQl9Ci0JCW15ICRsZW4gPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgODE5Mik7Ci0JCWlmICghIGRlZmluZWQoJGxlbikpIHsKLQkJCW5leHQgaWYgJCEgPX4gL15JbnRlcnJ1cHRlZC87Ci0JCQlscHJpbnQoIlxbJCQvJENVUlJdICQhIik7Ci0JCQlsYXN0OwotCQl9IGVsc2lmICgkbGVuID09IDApIHsKLQkJCWxwcmludCgiXFskJC8kQ1VSUl0gSW5wdXQgaXMgRU9GLiIpOwotCQkJbGFzdDsKLQkJfQotCQlteSAkb2Zmc2V0ID0gMDsKLQkJbXkgJHF1aXQgPSAwOwotCQl3aGlsZSAoJGxlbikgewotCQkJbXkgJHdyaXR0ZW4gPSBzeXN3cml0ZSgkb3V0LCAkYnVmLCAkbGVuLCAkb2Zmc2V0KTsKLQkJCWlmICghIGRlZmluZWQgJHdyaXR0ZW4pIHsKLQkJCQlscHJpbnQoIlxbJCQvJENVUlJdIE91dHB1dCBpcyBFT0YuICQhIik7Ci0JCQkJJHF1aXQgPSAxOwotCQkJCWxhc3Q7Ci0JCQl9Ci0JCQkkbGVuIC09ICR3cml0dGVuOwotCQkJJG9mZnNldCArPSAkd3JpdHRlbjsKLQkJfQotCQlsYXN0IGlmICRxdWl0OwotCX0KLQljbG9zZSgkb3V0KTsKLQljbG9zZSgkaW4pOwotCWxwcmludCgiXFskJC8kQ1VSUl0gZmluaXNoZWQgeGZlci4iKTsKLX0KLQotc3ViIHhmZXJfYm90aCB7Ci0JbXkgKCRzb2NrMSwgJHNvY2syKSA9IEBfOwotCi0JbXkgJHBhcmVudCA9ICQkOwotCi0JbXkgJGNoaWxkID0gZm9yaygpOwotCi0JaWYgKCEgZGVmaW5lZCAkY2hpbGQpIHsKLQkJbHByaW50KCIkcHJvZ1xbJCQvJENVUlJdIGZhaWxlZCB0byBmb3JrOiAkISIpOwotCQlyZXR1cm47Ci0JfQotCi0JJFNJR3tURVJNfSA9ICJoYW5kbGVyIjsKLQkkU0lHe0lOVH0gID0gImhhbmRsZXIiOwotCi0JaWYgKCRjaGlsZCkgewotCQlscHJpbnQoIlskJC8kQ1VSUl0gcGFyZW50IDEgLT4gMi4iKTsKLQkJeGZlcigkc29jazEsICRzb2NrMik7Ci0JCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAwLjI1KTsKLQkJaWYgKGtpbGwgMCwgJGNoaWxkKSB7Ci0JCQlzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgMC45KTsKLQkJCWlmIChraWxsIDAsICRjaGlsZCkgewotCQkJCWxwcmludCgiXFskJC8kQ1VSUl0ga2lsbCBURVJNIGNoaWxkICRjaGlsZCIpOwotCQkJCWtpbGwgIlRFUk0iLCAkY2hpbGQ7Ci0JCQl9IGVsc2UgewotCQkJCWxwcmludCgiXFskJC8kQ1VSUl0gY2hpbGQgICRjaGlsZCBnb25lLiIpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuMDUpOwotCQlscHJpbnQoIlskJC8kQ1VSUl0gY2hpbGQgIDIgLT4gMS4iKTsKLQkJeGZlcigkc29jazIsICRzb2NrMSk7Ci0JCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAwLjI1KTsKLQkJaWYgKGtpbGwgMCwgJHBhcmVudCkgewotCQkJc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuOCk7Ci0JCQlpZiAoa2lsbCAwLCAkcGFyZW50KSB7Ci0JCQkJbHByaW50KCJcWyQkLyRDVVJSXSBraWxsIFRFUk0gcGFyZW50ICRwYXJlbnQuIik7Ci0JCQkJa2lsbCAiVEVSTSIsICRwYXJlbnQ7Ci0JCQl9IGVsc2UgewotCQkJCWxwcmludCgiXFskJC8kQ1VSUl0gcGFyZW50ICRwYXJlbnQgZ29uZS4iKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3ViIGZzbGVlcCB7Ci0JbXkgKCR0aW1lKSA9IEBfOwotCXNlbGVjdCh1bmRlZiwgdW5kZWYsIHVuZGVmLCAkdGltZSkgaWYgJHRpbWU7Ci19Ci0KLXN1YiBjbGVhbnVwIHsKLQljbG9zZSAkY2xpZW50X2xpc3RlbiAgaWYgJGNsaWVudF9saXN0ZW47Ci0JY2xvc2UgJGNsaWVudF9saXN0ZW42IGlmICRjbGllbnRfbGlzdGVuNjsKLQljbG9zZSAkc2VydmVyX2xpc3RlbiAgaWYgJHNlcnZlcl9saXN0ZW47Ci0JY2xvc2UgJHNlcnZlcl9saXN0ZW42IGlmICRzZXJ2ZXJfbGlzdGVuNjsKLQlmb3JlYWNoIG15ICRpZCAoa2V5cyAlSUQpIHsKLQkJY2xvc2UgJElEeyRpZH17c29ja307Ci0JfQotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MvdmNpbmplY3QucGwgYi94MTF2bmMvbWlzYy92Y2luamVjdC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM3MWQ0ZS4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy92Y2luamVjdC5wbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0gICMhL2Jpbi9zaCAtLSAjIEEgY29tbWVudCBtZW50aW9uaW5nIHBlcmwKLWV2YWwgJ2V4ZWMgcGVybCAtUyAkMCAkezErIiRAIn0nCi0gICAgICAgIGlmIDA7Ci0jCi0jIHZjaW5qZWN0LnBsOiBzaW1wbGUgaGFjayB0byBpbmplY3Qga2V5c3Ryb2tlcyBpbnRvIExpbnV4IFZDIHR0eS4KLSMgU2VlIExpbnV4Vk5DLmMgZm9yIGEgbW9yZSBjYXJlZnVsIHRyZWF0bWVudCB1c2luZyBDIGFuZCBwdWJsaWMgQVBJLgotIwotIyBVc2FnZTogIHZjaW5qZWN0LnBsIDxOPiAgIChvciAvZGV2L3R0eU4pCi0jCi0jIFRoaXMgaXMgYW4gZXhhbXBsZSB4MTF2bmMgLXBpcGVpbnB1dCBwcm9ncmFtICBFLmcuOiAKLSMKLSMgICB4MTF2bmMgLXJhd2ZiIG1hcDovZGV2L2ZiMEAxMDI0eDc2OHgxNiAtcGlwZWlucHV0ICJ2Y2luamVjdC5wbCAvZGV2L3R0eTMiIAotIwotIyAoc2VlIGZic2V0KDgpIGZvciBvYnRhaW5pbmcgZmIgaW5mbykuCi0jCi0jIEl0IHJlYWRzIGxpbmVzIGxpa2UgdGhpcyBmcm9tIFNURElOOgotIwotIyBLZXlzeW0gPGlkPiA8ZG93bj4gPG4+IDxLZXlzeW0+IC4uLgotIwotIyA8aWQ+IGlzIGlnbm9yZWQsIGl0IHVzZXMgdGhlIHJlc3QgdG8gZGVkdWNlIHRoZSBrZXlzdHJva2VzIHRvIHNlbmQKLSMgdG8gdGhlIGNvbnNvbGUuCi0jCi0KLSR0dHkgPSBzaGlmdDsKLSR0dHkgPSAiL2Rldi90dHkkdHR5IiBpZiAkdHR5ID1+IC9eXGQrJC87Ci0KLXdhcm4gInN0cmFuZ2UgdHR5IGRldmljZTogJHR0eVxuIiBpZiAkdHR5ICF+IG0sXi9kZXYvdHR5XGQrJCw7Ci0KLW9wZW4oVFRZLCAiPiR0dHkiKSB8fCBkaWUgIm9wZW4gJHR0eTogJCFcbiI7Ci0kZmQgPSBmaWxlbm8oVFRZKTsKLQotJGxpbnV4X2lvY3RsX3N5c2NhbGwgPSA1NDsJIyBjb21tb24ga25vd2xlZGdlLCBlaD8gOi0pCi0kVElPQ1NUSSA9IDB4NTQxMjsKLQotJU1hcCA9IHF3KAotCUVzY2FwZQkJMjcKLQlUYWIgCQkgOQotCVJldHVybgkJMTMKLQlCYWNrU3BhY2UJIDgKLQlIb21lCQkgMQotCUVuZAkJIDUKLQlVcAkJMTYKLQlEb3duCQkxNAotCVJpZ2h0CQkgNgotCUxlZnQJCSAyCi0JTmV4dAkJIDYKLQlQcmlvcgkJIDIKLSk7Ci0jIHRoZSBsYXR0ZXIgZmV3IGFib3ZlIHNlZW0gdG8gYmUgdmkgc3BlY2lhbHMuIChzaW5jZSB0aGV5IGFyZSBub3JtYWxseQotIyBlc2NhcGUgc2VxdWVuY2VzLCBlLmcuIEVTQyBbIDUgfikKLQotc3ViIGxvb2t1cCB7Ci0JbXkoJGRvd24sICRrZXksICRuYW1lKSA9IEBfOwotCi0JbXkgJG4gPSAtMTsgCi0JJG5hbWUgPX4gcy9eS1BfLy87Ci0KLQkjIGFsZ29yaXRobSBib3Jyb3dlZCBmcm9tIExpbnV4Vk5DLmM6Ci0JaWYgKCEgJGRvd24pIHsKLQkJaWYgKCRuYW1lID1+IC9eQ29udHJvbC8pIHsKLQkJCSRjb250cm9sLS07Ci0JCX0KLQkJcmV0dXJuICRuOwotCX0gCi0KLQlpZiAoJG5hbWUgPX4gL15Db250cm9sLykgewotCQkkY29udHJvbCsrOwotCX0gZWxzZSB7Ci0JCWlmIChleGlzdHMoJE1hcHskbmFtZX0pKSB7Ci0JCQkkbiA9ICRNYXB7JG5hbWV9OwotCQl9Ci0JCWlmICgkY29udHJvbCAmJiAkbmFtZSA9fiAvXltBLXpdJC8pIHsKLQkJCSRuID0gb3JkKCRuYW1lKTsKLQkJCSMgc2hpZnQgZG93biB0byB0aGUgQ29udHJvbCB6b25lOgotCQkJaWYgKCRuYW1lID1+IC9bYS16XS8pIHsKLQkJCQkkbiAtPSAob3JkKCJhIikgLSAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJJG4gLT0gKG9yZCgiQSIpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCRuIDwgMCAmJiAka2V5IDwgMjU2KSB7Ci0JCQkkbiA9ICRrZXk7Ci0JCX0KLQl9Ci0JcmV0dXJuICRuOwotfQotCi0kY29udHJvbCA9IDA7Ci0kZGVidWcgPSAwOwotCi13aGlsZSAoPD4pIHsKLQljaG9tcDsKLQlpZiAoL15cdyskLykgewotCQkjIGZvciBkZWJ1Z2dpbmcsIHlvdSB0eXBlIHRoZSBrZXlzeW0gaW4gbWFudWFsbHkuCi0JCSRfID0gIktleXN5bSAxIDAgOTk5ICRfIE5vbmUiOwotCX0KLQluZXh0IHVubGVzcyAvXktleXN5bS87Ci0KLQlteSAoJGosICRpZCwgJGRvd24sICRrLCAka2V5c3ltLCAkcmVzdCkgPSBzcGxpdCgnICcsICRfKTsKLQotCSRuID0gbG9va3VwKCRkb3duLCAkaywgJGtleXN5bSk7Ci0JaWYgKCRuIDwgMCB8fCAkbiA+IDI1NSkgewotCQlwcmludCBTVERFUlIgInNraXA6ICcka2V5c3ltJyAtPiAkblxuIiBpZiAkZG93biAmJiAkZGVidWc7Ci0JCW5leHQ7Ci0JfQotCi0JJG5fcCA9IHBhY2soImMiLCAkbik7Ci0JJHJldCA9IHN5c2NhbGwoJGxpbnV4X2lvY3RsX3N5c2NhbGwsICRmZCwgJFRJT0NTVEksICRuX3ApOwotCi0JcHJpbnQgU1RERVJSICJjdHJsPSRjb250cm9sICRrZXlzeW0vJGsgc3lzY2FsbCgiIC4KLQkJIiRsaW51eF9pb2N0bF9zeXNjYWxsLCAkZmQsICRUSU9DU1RJLCAkbikgPSAkcmV0XG4iIGlmICRkZWJ1ZzsKLQotfQpkaWZmIC0tZ2l0IGEveDExdm5jL21pc2MveDExdm5jX2xvb3AgYi94MTF2bmMvbWlzYy94MTF2bmNfbG9vcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWEzZTBhMi4uMDAwMDAwMAotLS0gYS94MTF2bmMvbWlzYy94MTF2bmNfbG9vcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyB4MTF2bmNfbG9vcDoKLSMKLSMgRXhhbXBsZSBzdGFydHVwIHNjcmlwdCBmb3IgY29ubmVjdGluZyB4MTF2bmMgdG8gYW4gWCBkaXNwbGF5Ci0jIGF0IHN5c3RlbSBib290IHVwIGFuZCBoYXZpbmcgaXQgcmVjb25uZWN0IHdoZW4gdGhlIFggc2VydmVyIHJlc3RhcnRzLgotIwotIyBSdW4sIGluIHJjLmxvY2FsIHNheSwgdmlhLCBlLmcuOgotIwotIwkvcGF0aC90by94MTF2bmNfbG9vcCAxPj4gL3Zhci90bXAveDExdm5jX2xvb3AubG9nIDI+JjEgJgotIwotIyBjYWxsIHdpdGggYXJndW1lbnQgIm9uY2UiIG9yIGEgbnVtYmVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgbG9vcHMuCi0jIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGZvbGxvd2luZyBuZWVkcyB0byBiZSBjdXN0b21pemVkOgoteDExdm5jX2NtZD14MTF2bmMJCSMgb3IgdXNlIGZ1bGwgcGF0aCAob3Igc2V0IFBBVEgpLgotcHdmaWxlPS9wYXRoL3RvL3ZuYy9wYXNzd2QJIyBhbHdheXMgdXNlIGEgcGFzc3dvcmQKLWRpc3BsYXk9OjAJCQkjIGRpc3BsYXkgb2YgaW50ZXJlc3QKLXJlc3RhcnRfc2xlZXA9NSAJCSMgcGF1c2UgYmV0d2VlbiBYIHNlcnZlciByZXN0YXJ0cy4KLQotIyBtb2RpZnkgY21kbGluZSBhcmdzIGlmIGRlc2lyZWQ6Ci14MTF2bmNfYXJncz0iLWRpc3BsYXkgJGRpc3BsYXkgLXJmYmF1dGggJHB3ZmlsZSAtZm9yZXZlciAtbmFwIgotCi0jIHlvdSBtYXkgbmVlZCB0byBjdXN0b21pemUgdGhlICJncmVwIiwgZXRjLCBiZWxvdyBpbiBnZXRfeGF1dGhvcml0eV9maWxlKCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmIFsgIlgkMSIgIT0gIlgiIF07IHRoZW4KLQltYXg9JDEKLQlzaGlmdAotZmkKLQotZ2V0X3hhdXRob3JpdHlfZmlsZSgpIHsKLQkjCi0JIyBXZSBuZWVkIHRvIGZpbmQgdGhlIE1JVC1DT09LSUUgZmlsZS4uLiB0aGlzIG5vdCBwb3J0YWJsZSBhdCBhbGwsCi0JIyBkZXBlbmRzIG9uIE9TLCBkaXN0cm8sIGRlc2t0b3AsIHBoYXNlIG9mIG1vb24sIGV0Yy4uLgotCSMKLQkjIElmIHRoZSBjb29raWUgZmlsZSB3YXMgZml4ZWQgYW5kIHlvdSBrbmV3IGl0LCB5b3UgY291bGQganVzdAotCSMgcmV0dXJuIGl0IGhlcmUgZS5nLjoKLQkjCi0JIyMgZWNobyAiL3Zhci9nZG0vOjAuWGF1dGgiOyByZXR1cm4KLQkjCi0JIyBvciwgaWYgeW91IGtuZXcgdGhlIGRpcmVjdG9yeSwgeW91IGNvdWxkIGxvb2sgZm9yIHRoZSB5b3VuZ2VzdAotCSMgZmlsZSB0aGVyZSBhbmQgcmV0dXJuIGl0IGUuZy46Ci0JIwotCSMjIGVjaG8gYGxzIC10IC92YXIvbGliL3hkbS9hdXRoZGlyL2F1dGhmaWxlcy8qIHwgaGVhZCAtMWA7IHJldHVybgotCi0JIyB0aGlzIGhhY2sgdHJpZXMgdG8gZ3JlcCBpdCBvdXQgb2YgcHMgb3V0cHV0Li4uCi0JeGF1dGg9IiIKLQlmb3IgaSBpbiAxIDIgMwotCWRvCi0JCSMgdmVyeSBsaW51eCBzcGVjaWZpYywgYW5kIHlvdSBsaWtlbHkgbmVlZCB0byB0d2Vhay4uCi0JCXBhdHQ9IlgxMVI2LiovWC4qLWF1dGgiCi0JCXhhdXRoPWBwcyB3d3dhdXggfCBncmVwICIkcGF0dCIgXAotCQkJfCBlZ3JlcCAtdiAnZ3JlcHxYcHJ0JyB8IGhlYWQgLTEgXAotCQkJfCBzZWQgLWUgJ3MvXi4qLWF1dGgvLycgfCBhd2sgJ3twcmludCAkMX0nYCAKLQotCQlpZiBbICJYJHhhdXRoIiAhPSAiWCIgXTsgdGhlbgotCQkJYnJlYWsKLQkJZmkKLQkJc2xlZXAgMgkjIHdhaXQgYSBiaXQgaW4gY2FzZSBYIHNlcnZlciBpcyByZXN0YXJ0aW5nIHNsb3dseS4KLQlkb25lCi0JZWNobyAkeGF1dGgKLX0KLQotdHJ5PTEKLXdoaWxlIFsgMSBdCi1kbwotCWVjaG8gImBkYXRlYCAgJDAgdHJ5IG51bWJlcjogJHRyeSI7IHRyeT1gZXhwciAkdHJ5ICsgMWAKLQotCWF1dGg9YGdldF94YXV0aG9yaXR5X2ZpbGVgCi0JaWYgWyAhIC1yICIkYXV0aCIgXTsgdGhlbgotCQllY2hvICJgZGF0ZWAgIGJhZCBhdXRoIGZpbGU6IFwiJGF1dGhcIiIKLQllbHNlCi0JCWNtZD0iJHgxMXZuY19jbWQgJHgxMXZuY19hcmdzIgotCQlzbGVlcCAxCi0JCWVjaG8gImBkYXRlYCAgcnVubmluZzogJGNtZCAtYXV0aCAkYXV0aCIKLQkJIyBydW4geDExdm5jOgotCQkkY21kIC1hdXRoICRhdXRoCi0JCWlmIFsgIlgkbWF4IiA9ICJYb25jZSIgXTsgdGhlbgotCQkJZXhpdCAkPwotCQlmaQotCWZpCi0JaWYgZWNobyAiJG1heCIgfCBncmVwICdbMC05XScgPiAvZGV2L251bGw7IHRoZW4KLQkJaWYgWyAkdHJ5IC1ndCAkbWF4IF07IHRoZW4KLQkJCWV4aXQKLQkJZmkKLQlmaQotCXNsZWVwICRyZXN0YXJ0X3NsZWVwCi1kb25lCmRpZmYgLS1naXQgYS94MTF2bmMvbWlzYy94MTF2bmNfcHcgYi94MTF2bmMvbWlzYy94MTF2bmNfcHcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZWExZTMuLjAwMDAwMDAKLS0tIGEveDExdm5jL21pc2MveDExdm5jX3B3CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0jIHVzYWdlOiB4MTF2bmNfcHcgW2ZpbGVdICAoZGVmYXVsdDogfi8udm5jL3Bhc3N3ZCkKLQotaWYgWyAiWCQxIiA9ICJYIiBdOyB0aGVuCi0JZmlsZT0kSE9NRS8udm5jL3Bhc3N3ZAotZWxzZQotCWZpbGU9JDEKLWZpCi0KLXN0dHkgLWVjaG8KLXByaW50ZiAiUGFzc3dvcmQ6ICIKLXJlYWQgcHcxOyBlY2hvICIiCi1wcmludGYgIlZlcmlmeTogICAiCi1yZWFkIHB3MjsgZWNobyAiIgotc3R0eSAgZWNobwotCi1pZiBbICJYJHB3MSIgIT0gIlgkcHcyIiBdOyB0aGVuCi0JZWNobyAicGFzc3dvcmRzIGRvIG5vdCBtYXRjaC4iCi0JZXhpdCAxCi1maQotCi14MTF2bmMgLWhlbHAgPiAvZGV2L251bGwgMj4mMQoteDExdm5jIC1zdG9yZXBhc3N3ZCAiJHB3MSIgIiRmaWxlIgotbHMgLWwgIiRmaWxlIgpkaWZmIC0tZ2l0IGEveDExdm5jL25veDExLmggYi94MTF2bmMvbm94MTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjYzk3NC4uMDAwMDAwMAotLS0gYS94MTF2bmMvbm94MTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2NzEgKzAsMCBAQAotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFWRV9YU0hNCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX1hTSE0gMAotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVCAwCi0jdW5kZWYgIExJQlZOQ1NFUlZFUl9IQVZFX1hURVNUR1JBQkNPTlRST0wKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1RHUkFCQ09OVFJPTCAwCi0jdW5kZWYgIExJQlZOQ1NFUlZFUl9IQVZFX1hLRVlCT0FSRAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9YS0VZQk9BUkQgMAotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYSU5FUkFNQQotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYSU5FUkFNQSAwCi0jdW5kZWYgIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhSQU5EUgotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYUkFORFIgMAotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYRklYRVMKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfTElCWEZJWEVTIDAKLSN1bmRlZiAgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRQotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYREFNQUdFIDAKLSN1bmRlZiAgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRCAwCi0jdW5kZWYgIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhUUkFQCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhUUkFQIDAKLSN1bmRlZiAgTElCVk5DU0VSVkVSX0hBVkVfU09MQVJJU19YUkVBRFNDUkVFTgotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9TT0xBUklTX1hSRUFEU0NSRUVOIDAKLSN1bmRlZiAgTElCVk5DU0VSVkVSX0hBVkVfSVJJWF9YUkVBRERJU1BMQVkKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfSVJJWF9YUkVBRERJU1BMQVkgMAotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFWRV9GQlBNCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX0ZCUE0gMAotCi0vKiBkZWZhdWx0IGtleXN5bXMgKi8KLSNpZiAwCi0vKiBYWFggZ28gd2l0aCB0aGUgc3Vic2V0IGluIHJmYi9rZXlzeW0uaCBmb3Igbm93ICovCi0jZGVmaW5lIFhLX01JU0NFTExBTlkKLSNkZWZpbmUgWEtfWEtCX0tFWVMKLSNkZWZpbmUgWEtfTEFUSU4xCi0jZGVmaW5lIFhLX0xBVElOMgotI2RlZmluZSBYS19MQVRJTjMKLSNkZWZpbmUgWEtfTEFUSU40Ci0jZGVmaW5lIFhLX0xBVElOOAotI2RlZmluZSBYS19MQVRJTjkKLSNkZWZpbmUgWEtfQ0FVQ0FTVVMKLSNkZWZpbmUgWEtfR1JFRUsKLSNkZWZpbmUgWEtfS0FUQUtBTkEKLSNkZWZpbmUgWEtfQVJBQklDCi0jZGVmaW5lIFhLX0NZUklMTElDCi0jZGVmaW5lIFhLX0hFQlJFVwotI2RlZmluZSBYS19USEFJCi0jZGVmaW5lIFhLX0tPUkVBTgotI2RlZmluZSBYS19BUk1FTklBTgotI2RlZmluZSBYS19HRU9SR0lBTgotI2RlZmluZSBYS19WSUVUTkFNRVNFCi0jZGVmaW5lIFhLX0NVUlJFTkNZCi0jZW5kaWYKLQotLyoKLSAqCSRYb3JnOiBYLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyMiB4b3JnY3ZzIEV4cCAkCi0gKi8KLQotLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBYIHdpbmRvdyBzeXN0ZW0gbGlrZWx5IHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zICovCi0KLSNpZm5kZWYgWF9ICi0jZGVmaW5lIFhfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotZG9jdW1lbnRhdGlvbi4KLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1PUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KLUNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLUV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCi1pbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCi0KLQotQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQotc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCi0KLURJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwotQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCi1ESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgotQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAotV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAotQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwotU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL1guaCx2IDEuNSAyMDAxLzEyLzE0IDE5OjUzOjI1IGRhd2VzIEV4cCAkICovCi0KLSNkZWZpbmUgWF9QUk9UT0NPTAkxMQkJLyogY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uICovCi0jZGVmaW5lIFhfUFJPVE9DT0xfUkVWSVNJT04gMAkJLyogY3VycmVudCBtaW5vciB2ZXJzaW9uICovCi0KLS8qIFJlc291cmNlcyAqLwotCi0vKgotICogX1hTRVJWRVI2NCBtdXN0IE9OTFkgYmUgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBYIHNlcnZlciBzb3VyY2VzIG9uCi0gKiBzeXN0ZW1zIHdoZXJlIHVuc2lnbmVkIGxvbmcgaXMgbm90IDMyIGJpdHMsIG11c3QgTk9UIGJlIHVzZWQgaW4KLSAqIGNsaWVudCBvciBsaWJyYXJ5IGNvZGUuCi0gKi8KLSNpZm5kZWYgX1hTRVJWRVI2NAotIyAgaWZuZGVmIF9YVFlQRURFRl9YSUQKLSMgICAgZGVmaW5lIF9YVFlQRURFRl9YSUQKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBYSUQ7Ci0jICBlbmRpZgotIyAgaWZuZGVmIF9YVFlQRURFRl9NQVNLCi0jICAgIGRlZmluZSBfWFRZUEVERUZfTUFTSwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIE1hc2s7Ci0jICBlbmRpZgotIyAgaWZuZGVmIF9YVFlQRURFRl9BVE9NCi0jICAgIGRlZmluZSBfWFRZUEVERUZfQVRPTQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIEF0b207CQkvKiBBbHNvIGluIFhkZWZzLmggKi8KLSMgIGVuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVmlzdWFsSUQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVGltZTsKLSNlbHNlCi0jICBpbmNsdWRlIDxYMTEvWG1kLmg+Ci0jICBpZm5kZWYgX1hUWVBFREVGX1hJRAotIyAgICBkZWZpbmUgX1hUWVBFREVGX1hJRAotdHlwZWRlZiBDQVJEMzIgWElEOwotIyAgZW5kaWYKLSMgIGlmbmRlZiBfWFRZUEVERUZfTUFTSwotIyAgICBkZWZpbmUgX1hUWVBFREVGX01BU0sKLXR5cGVkZWYgQ0FSRDMyIE1hc2s7Ci0jICBlbmRpZgotIyAgaWZuZGVmIF9YVFlQRURFRl9BVE9NCi0jICAgIGRlZmluZSBfWFRZUEVERUZfQVRPTQotdHlwZWRlZiBDQVJEMzIgQXRvbTsKLSMgIGVuZGlmCi10eXBlZGVmIENBUkQzMiBWaXN1YWxJRDsKLXR5cGVkZWYgQ0FSRDMyIFRpbWU7Ci0jZW5kaWYKLQotdHlwZWRlZiBYSUQgV2luZG93OwotdHlwZWRlZiBYSUQgRHJhd2FibGU7Ci0jaWZuZGVmIF9YVFlQRURFRl9GT05UCi0jICBkZWZpbmUgX1hUWVBFREVGX0ZPTlQKLXR5cGVkZWYgWElEIEZvbnQ7Ci0jZW5kaWYKLXR5cGVkZWYgWElEIFBpeG1hcDsKLXR5cGVkZWYgWElEIEN1cnNvcjsKLXR5cGVkZWYgWElEIENvbG9ybWFwOwotdHlwZWRlZiBYSUQgR0NvbnRleHQ7Ci10eXBlZGVmIFhJRCBLZXlTeW07Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBLZXlDb2RlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJFU0VSVkVEIFJFU09VUkNFIEFORCBDT05TVEFOVCBERUZJTklUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIE5vbmUKLSNkZWZpbmUgTm9uZSAgICAgICAgICAgICAgICAgMEwJLyogdW5pdmVyc2FsIG51bGwgcmVzb3VyY2Ugb3IgbnVsbCBhdG9tICovCi0jZW5kaWYKLQotI2RlZmluZSBQYXJlbnRSZWxhdGl2ZSAgICAgICAxTAkvKiBiYWNrZ3JvdW5kIHBpeG1hcCBpbiBDcmVhdGVXaW5kb3cKLQkJCQkgICAgYW5kIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMgKi8KLQotI2RlZmluZSBDb3B5RnJvbVBhcmVudCAgICAgICAwTAkvKiBib3JkZXIgcGl4bWFwIGluIENyZWF0ZVdpbmRvdwotCQkJCSAgICAgICBhbmQgQ2hhbmdlV2luZG93QXR0cmlidXRlcwotCQkJCSAgIHNwZWNpYWwgVmlzdWFsSUQgYW5kIHNwZWNpYWwgd2luZG93Ci0JCQkJICAgICAgIGNsYXNzIHBhc3NlZCB0byBDcmVhdGVXaW5kb3cgKi8KLQotI2RlZmluZSBQb2ludGVyV2luZG93ICAgICAgICAwTAkvKiBkZXN0aW5hdGlvbiB3aW5kb3cgaW4gU2VuZEV2ZW50ICovCi0jZGVmaW5lIElucHV0Rm9jdXMgICAgICAgICAgIDFMCS8qIGRlc3RpbmF0aW9uIHdpbmRvdyBpbiBTZW5kRXZlbnQgKi8KLQotI2RlZmluZSBQb2ludGVyUm9vdCAgICAgICAgICAxTAkvKiBmb2N1cyB3aW5kb3cgaW4gU2V0SW5wdXRGb2N1cyAqLwotCi0jZGVmaW5lIEFueVByb3BlcnR5VHlwZSAgICAgIDBMCS8qIHNwZWNpYWwgQXRvbSwgcGFzc2VkIHRvIEdldFByb3BlcnR5ICovCi0KLSNkZWZpbmUgQW55S2V5CQkgICAgIDBMCS8qIHNwZWNpYWwgS2V5IENvZGUsIHBhc3NlZCB0byBHcmFiS2V5ICovCi0KLSNkZWZpbmUgQW55QnV0dG9uICAgICAgICAgICAgMEwJLyogc3BlY2lhbCBCdXR0b24gQ29kZSwgcGFzc2VkIHRvIEdyYWJCdXR0b24gKi8KLQotI2RlZmluZSBBbGxUZW1wb3JhcnkgICAgICAgICAwTAkvKiBzcGVjaWFsIFJlc291cmNlIElEIHBhc3NlZCB0byBLaWxsQ2xpZW50ICovCi0KLSNkZWZpbmUgQ3VycmVudFRpbWUgICAgICAgICAgMEwJLyogc3BlY2lhbCBUaW1lICovCi0KLSNkZWZpbmUgTm9TeW1ib2wJICAgICAwTAkvKiBzcGVjaWFsIEtleVN5bSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBFVkVOVCBERUZJTklUSU9OUyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSW5wdXQgRXZlbnQgTWFza3MuIFVzZWQgYXMgZXZlbnQtbWFzayB3aW5kb3cgYXR0cmlidXRlIGFuZCBhcyBhcmd1bWVudHMKLSAgIHRvIEdyYWIgcmVxdWVzdHMuICBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCBldmVudCBuYW1lcy4gICovCi0KLSNkZWZpbmUgTm9FdmVudE1hc2sJCQkwTAotI2RlZmluZSBLZXlQcmVzc01hc2sJCQkoMUw8PDApICAKLSNkZWZpbmUgS2V5UmVsZWFzZU1hc2sJCQkoMUw8PDEpICAKLSNkZWZpbmUgQnV0dG9uUHJlc3NNYXNrCQkJKDFMPDwyKSAgCi0jZGVmaW5lIEJ1dHRvblJlbGVhc2VNYXNrCQkoMUw8PDMpICAKLSNkZWZpbmUgRW50ZXJXaW5kb3dNYXNrCQkJKDFMPDw0KSAgCi0jZGVmaW5lIExlYXZlV2luZG93TWFzawkJCSgxTDw8NSkgIAotI2RlZmluZSBQb2ludGVyTW90aW9uTWFzawkJKDFMPDw2KSAgCi0jZGVmaW5lIFBvaW50ZXJNb3Rpb25IaW50TWFzawkJKDFMPDw3KSAgCi0jZGVmaW5lIEJ1dHRvbjFNb3Rpb25NYXNrCQkoMUw8PDgpICAKLSNkZWZpbmUgQnV0dG9uMk1vdGlvbk1hc2sJCSgxTDw8OSkgIAotI2RlZmluZSBCdXR0b24zTW90aW9uTWFzawkJKDFMPDwxMCkgCi0jZGVmaW5lIEJ1dHRvbjRNb3Rpb25NYXNrCQkoMUw8PDExKSAKLSNkZWZpbmUgQnV0dG9uNU1vdGlvbk1hc2sJCSgxTDw8MTIpIAotI2RlZmluZSBCdXR0b25Nb3Rpb25NYXNrCQkoMUw8PDEzKSAKLSNkZWZpbmUgS2V5bWFwU3RhdGVNYXNrCQkJKDFMPDwxNCkKLSNkZWZpbmUgRXhwb3N1cmVNYXNrCQkJKDFMPDwxNSkgCi0jZGVmaW5lIFZpc2liaWxpdHlDaGFuZ2VNYXNrCQkoMUw8PDE2KSAKLSNkZWZpbmUgU3RydWN0dXJlTm90aWZ5TWFzawkJKDFMPDwxNykgCi0jZGVmaW5lIFJlc2l6ZVJlZGlyZWN0TWFzawkJKDFMPDwxOCkgCi0jZGVmaW5lIFN1YnN0cnVjdHVyZU5vdGlmeU1hc2sJCSgxTDw8MTkpIAotI2RlZmluZSBTdWJzdHJ1Y3R1cmVSZWRpcmVjdE1hc2sJKDFMPDwyMCkgCi0jZGVmaW5lIEZvY3VzQ2hhbmdlTWFzawkJCSgxTDw8MjEpIAotI2RlZmluZSBQcm9wZXJ0eUNoYW5nZU1hc2sJCSgxTDw8MjIpIAotI2RlZmluZSBDb2xvcm1hcENoYW5nZU1hc2sJCSgxTDw8MjMpIAotI2RlZmluZSBPd25lckdyYWJCdXR0b25NYXNrCQkoMUw8PDI0KSAKLQotLyogRXZlbnQgbmFtZXMuICBVc2VkIGluICJ0eXBlIiBmaWVsZCBpbiBYRXZlbnQgc3RydWN0dXJlcy4gIE5vdCB0byBiZQotY29uZnVzZWQgd2l0aCBldmVudCBtYXNrcyBhYm92ZS4gIFRoZXkgc3RhcnQgZnJvbSAyIGJlY2F1c2UgMCBhbmQgMQotYXJlIHJlc2VydmVkIGluIHRoZSBwcm90b2NvbCBmb3IgZXJyb3JzIGFuZCByZXBsaWVzLiAqLwotCi0jZGVmaW5lIEtleVByZXNzCQkyCi0jZGVmaW5lIEtleVJlbGVhc2UJCTMKLSNkZWZpbmUgQnV0dG9uUHJlc3MJCTQKLSNkZWZpbmUgQnV0dG9uUmVsZWFzZQkJNQotI2RlZmluZSBNb3Rpb25Ob3RpZnkJCTYKLSNkZWZpbmUgRW50ZXJOb3RpZnkJCTcKLSNkZWZpbmUgTGVhdmVOb3RpZnkJCTgKLSNkZWZpbmUgRm9jdXNJbgkJCTkKLSNkZWZpbmUgRm9jdXNPdXQJCTEwCi0jZGVmaW5lIEtleW1hcE5vdGlmeQkJMTEKLSNkZWZpbmUgRXhwb3NlCQkJMTIKLSNkZWZpbmUgR3JhcGhpY3NFeHBvc2UJCTEzCi0jZGVmaW5lIE5vRXhwb3NlCQkxNAotI2RlZmluZSBWaXNpYmlsaXR5Tm90aWZ5CTE1Ci0jZGVmaW5lIENyZWF0ZU5vdGlmeQkJMTYKLSNkZWZpbmUgRGVzdHJveU5vdGlmeQkJMTcKLSNkZWZpbmUgVW5tYXBOb3RpZnkJCTE4Ci0jZGVmaW5lIE1hcE5vdGlmeQkJMTkKLSNkZWZpbmUgTWFwUmVxdWVzdAkJMjAKLSNkZWZpbmUgUmVwYXJlbnROb3RpZnkJCTIxCi0jZGVmaW5lIENvbmZpZ3VyZU5vdGlmeQkJMjIKLSNkZWZpbmUgQ29uZmlndXJlUmVxdWVzdAkyMwotI2RlZmluZSBHcmF2aXR5Tm90aWZ5CQkyNAotI2RlZmluZSBSZXNpemVSZXF1ZXN0CQkyNQotI2RlZmluZSBDaXJjdWxhdGVOb3RpZnkJCTI2Ci0jZGVmaW5lIENpcmN1bGF0ZVJlcXVlc3QJMjcKLSNkZWZpbmUgUHJvcGVydHlOb3RpZnkJCTI4Ci0jZGVmaW5lIFNlbGVjdGlvbkNsZWFyCQkyOQotI2RlZmluZSBTZWxlY3Rpb25SZXF1ZXN0CTMwCi0jZGVmaW5lIFNlbGVjdGlvbk5vdGlmeQkJMzEKLSNkZWZpbmUgQ29sb3JtYXBOb3RpZnkJCTMyCi0jZGVmaW5lIENsaWVudE1lc3NhZ2UJCTMzCi0jZGVmaW5lIE1hcHBpbmdOb3RpZnkJCTM0Ci0jZGVmaW5lIExBU1RFdmVudAkJMzUJLyogbXVzdCBiZSBiaWdnZXIgdGhhbiBhbnkgZXZlbnQgIyAqLwotCi0KLS8qIEtleSBtYXNrcy4gVXNlZCBhcyBtb2RpZmllcnMgdG8gR3JhYkJ1dHRvbiBhbmQgR3JhYktleSwgcmVzdWx0cyBvZiBRdWVyeVBvaW50ZXIsCi0gICBzdGF0ZSBpbiB2YXJpb3VzIGtleS0sIG1vdXNlLSwgYW5kIGJ1dHRvbi1yZWxhdGVkIGV2ZW50cy4gKi8KLQotI2RlZmluZSBTaGlmdE1hc2sJCSgxPDwwKQotI2RlZmluZSBMb2NrTWFzawkJKDE8PDEpCi0jZGVmaW5lIENvbnRyb2xNYXNrCQkoMTw8MikKLSNkZWZpbmUgTW9kMU1hc2sJCSgxPDwzKQotI2RlZmluZSBNb2QyTWFzawkJKDE8PDQpCi0jZGVmaW5lIE1vZDNNYXNrCQkoMTw8NSkKLSNkZWZpbmUgTW9kNE1hc2sJCSgxPDw2KQotI2RlZmluZSBNb2Q1TWFzawkJKDE8PDcpCi0KLS8qIG1vZGlmaWVyIG5hbWVzLiAgVXNlZCB0byBidWlsZCBhIFNldE1vZGlmaWVyTWFwcGluZyByZXF1ZXN0IG9yCi0gICB0byByZWFkIGEgR2V0TW9kaWZpZXJNYXBwaW5nIHJlcXVlc3QuICBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZQotICAgbWFza3MgZGVmaW5lZCBhYm92ZS4gKi8KLSNkZWZpbmUgU2hpZnRNYXBJbmRleAkJMAotI2RlZmluZSBMb2NrTWFwSW5kZXgJCTEKLSNkZWZpbmUgQ29udHJvbE1hcEluZGV4CQkyCi0jZGVmaW5lIE1vZDFNYXBJbmRleAkJMwotI2RlZmluZSBNb2QyTWFwSW5kZXgJCTQKLSNkZWZpbmUgTW9kM01hcEluZGV4CQk1Ci0jZGVmaW5lIE1vZDRNYXBJbmRleAkJNgotI2RlZmluZSBNb2Q1TWFwSW5kZXgJCTcKLQotCi0vKiBidXR0b24gbWFza3MuICBVc2VkIGluIHNhbWUgbWFubmVyIGFzIEtleSBtYXNrcyBhYm92ZS4gTm90IHRvIGJlIGNvbmZ1c2VkCi0gICB3aXRoIGJ1dHRvbiBuYW1lcyBiZWxvdy4gKi8KLQotI2RlZmluZSBCdXR0b24xTWFzawkJKDE8PDgpCi0jZGVmaW5lIEJ1dHRvbjJNYXNrCQkoMTw8OSkKLSNkZWZpbmUgQnV0dG9uM01hc2sJCSgxPDwxMCkKLSNkZWZpbmUgQnV0dG9uNE1hc2sJCSgxPDwxMSkKLSNkZWZpbmUgQnV0dG9uNU1hc2sJCSgxPDwxMikKLQotI2RlZmluZSBBbnlNb2RpZmllcgkJKDE8PDE1KSAgLyogdXNlZCBpbiBHcmFiQnV0dG9uLCBHcmFiS2V5ICovCi0KLQotLyogYnV0dG9uIG5hbWVzLiBVc2VkIGFzIGFyZ3VtZW50cyB0byBHcmFiQnV0dG9uIGFuZCBhcyBkZXRhaWwgaW4gQnV0dG9uUHJlc3MKLSAgIGFuZCBCdXR0b25SZWxlYXNlIGV2ZW50cy4gIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGJ1dHRvbiBtYXNrcyBhYm92ZS4KLSAgIE5vdGUgdGhhdCAwIGlzIGFscmVhZHkgZGVmaW5lZCBhYm92ZSBhcyAiQW55QnV0dG9uIi4gICovCi0KLSNkZWZpbmUgQnV0dG9uMQkJCTEKLSNkZWZpbmUgQnV0dG9uMgkJCTIKLSNkZWZpbmUgQnV0dG9uMwkJCTMKLSNkZWZpbmUgQnV0dG9uNAkJCTQKLSNkZWZpbmUgQnV0dG9uNQkJCTUKLQotLyogTm90aWZ5IG1vZGVzICovCi0KLSNkZWZpbmUgTm90aWZ5Tm9ybWFsCQkwCi0jZGVmaW5lIE5vdGlmeUdyYWIJCTEKLSNkZWZpbmUgTm90aWZ5VW5ncmFiCQkyCi0jZGVmaW5lIE5vdGlmeVdoaWxlR3JhYmJlZAkzCi0KLSNkZWZpbmUgTm90aWZ5SGludAkJMQkvKiBmb3IgTW90aW9uTm90aWZ5IGV2ZW50cyAqLwotCQkgICAgICAgCi0vKiBOb3RpZnkgZGV0YWlsICovCi0KLSNkZWZpbmUgTm90aWZ5QW5jZXN0b3IJCTAKLSNkZWZpbmUgTm90aWZ5VmlydHVhbAkJMQotI2RlZmluZSBOb3RpZnlJbmZlcmlvcgkJMgotI2RlZmluZSBOb3RpZnlOb25saW5lYXIJCTMKLSNkZWZpbmUgTm90aWZ5Tm9ubGluZWFyVmlydHVhbAk0Ci0jZGVmaW5lIE5vdGlmeVBvaW50ZXIJCTUKLSNkZWZpbmUgTm90aWZ5UG9pbnRlclJvb3QJNgotI2RlZmluZSBOb3RpZnlEZXRhaWxOb25lCTcKLQotLyogVmlzaWJpbGl0eSBub3RpZnkgKi8KLQotI2RlZmluZSBWaXNpYmlsaXR5VW5vYnNjdXJlZAkJMAotI2RlZmluZSBWaXNpYmlsaXR5UGFydGlhbGx5T2JzY3VyZWQJMQotI2RlZmluZSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZAkJMgotCi0vKiBDaXJjdWxhdGlvbiByZXF1ZXN0ICovCi0KLSNkZWZpbmUgUGxhY2VPblRvcAkJMAotI2RlZmluZSBQbGFjZU9uQm90dG9tCQkxCi0KLS8qIHByb3RvY29sIGZhbWlsaWVzICovCi0KLSNkZWZpbmUgRmFtaWx5SW50ZXJuZXQJCTAKLSNkZWZpbmUgRmFtaWx5REVDbmV0CQkxCi0jZGVmaW5lIEZhbWlseUNoYW9zCQkyCi0KLS8qIFByb3BlcnR5IG5vdGlmaWNhdGlvbiAqLwotCi0jZGVmaW5lIFByb3BlcnR5TmV3VmFsdWUJMAotI2RlZmluZSBQcm9wZXJ0eURlbGV0ZQkJMQotCi0vKiBDb2xvciBNYXAgbm90aWZpY2F0aW9uICovCi0KLSNkZWZpbmUgQ29sb3JtYXBVbmluc3RhbGxlZAkwCi0jZGVmaW5lIENvbG9ybWFwSW5zdGFsbGVkCTEKLQotLyogR3JhYlBvaW50ZXIsIEdyYWJCdXR0b24sIEdyYWJLZXlib2FyZCwgR3JhYktleSBNb2RlcyAqLwotCi0jZGVmaW5lIEdyYWJNb2RlU3luYwkJMAotI2RlZmluZSBHcmFiTW9kZUFzeW5jCQkxCi0KLS8qIEdyYWJQb2ludGVyLCBHcmFiS2V5Ym9hcmQgcmVwbHkgc3RhdHVzICovCi0KLSNkZWZpbmUgR3JhYlN1Y2Nlc3MJCTAKLSNkZWZpbmUgQWxyZWFkeUdyYWJiZWQJCTEKLSNkZWZpbmUgR3JhYkludmFsaWRUaW1lCQkyCi0jZGVmaW5lIEdyYWJOb3RWaWV3YWJsZQkJMwotI2RlZmluZSBHcmFiRnJvemVuCQk0Ci0KLS8qIEFsbG93RXZlbnRzIG1vZGVzICovCi0KLSNkZWZpbmUgQXN5bmNQb2ludGVyCQkwCi0jZGVmaW5lIFN5bmNQb2ludGVyCQkxCi0jZGVmaW5lIFJlcGxheVBvaW50ZXIJCTIKLSNkZWZpbmUgQXN5bmNLZXlib2FyZAkJMwotI2RlZmluZSBTeW5jS2V5Ym9hcmQJCTQKLSNkZWZpbmUgUmVwbGF5S2V5Ym9hcmQJCTUKLSNkZWZpbmUgQXN5bmNCb3RoCQk2Ci0jZGVmaW5lIFN5bmNCb3RoCQk3Ci0KLS8qIFVzZWQgaW4gU2V0SW5wdXRGb2N1cywgR2V0SW5wdXRGb2N1cyAqLwotCi0jZGVmaW5lIFJldmVydFRvTm9uZQkJKGludClOb25lCi0jZGVmaW5lIFJldmVydFRvUG9pbnRlclJvb3QJKGludClQb2ludGVyUm9vdAotI2RlZmluZSBSZXZlcnRUb1BhcmVudAkJMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVSUk9SIENPREVTIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFN1Y2Nlc3MJCSAgIDAJLyogZXZlcnl0aGluZydzIG9rYXkgKi8KLSNkZWZpbmUgQmFkUmVxdWVzdAkgICAxCS8qIGJhZCByZXF1ZXN0IGNvZGUgKi8KLSNkZWZpbmUgQmFkVmFsdWUJICAgMgkvKiBpbnQgcGFyYW1ldGVyIG91dCBvZiByYW5nZSAqLwotI2RlZmluZSBCYWRXaW5kb3cJICAgMwkvKiBwYXJhbWV0ZXIgbm90IGEgV2luZG93ICovCi0jZGVmaW5lIEJhZFBpeG1hcAkgICA0CS8qIHBhcmFtZXRlciBub3QgYSBQaXhtYXAgKi8KLSNkZWZpbmUgQmFkQXRvbQkJICAgNQkvKiBwYXJhbWV0ZXIgbm90IGFuIEF0b20gKi8KLSNkZWZpbmUgQmFkQ3Vyc29yCSAgIDYJLyogcGFyYW1ldGVyIG5vdCBhIEN1cnNvciAqLwotI2RlZmluZSBCYWRGb250CQkgICA3CS8qIHBhcmFtZXRlciBub3QgYSBGb250ICovCi0jZGVmaW5lIEJhZE1hdGNoCSAgIDgJLyogcGFyYW1ldGVyIG1pc21hdGNoICovCi0jZGVmaW5lIEJhZERyYXdhYmxlCSAgIDkJLyogcGFyYW1ldGVyIG5vdCBhIFBpeG1hcCBvciBXaW5kb3cgKi8KLSNkZWZpbmUgQmFkQWNjZXNzCSAgMTAJLyogZGVwZW5kaW5nIG9uIGNvbnRleHQ6Ci0JCQkJIC0ga2V5L2J1dHRvbiBhbHJlYWR5IGdyYWJiZWQKLQkJCQkgLSBhdHRlbXB0IHRvIGZyZWUgYW4gaWxsZWdhbCAKLQkJCQkgICBjbWFwIGVudHJ5IAotCQkJCS0gYXR0ZW1wdCB0byBzdG9yZSBpbnRvIGEgcmVhZC1vbmx5IAotCQkJCSAgIGNvbG9yIG1hcCBlbnRyeS4KLSAJCQkJLSBhdHRlbXB0IHRvIG1vZGlmeSB0aGUgYWNjZXNzIGNvbnRyb2wKLQkJCQkgICBsaXN0IGZyb20gb3RoZXIgdGhhbiB0aGUgbG9jYWwgaG9zdC4KLQkJCQkqLwotI2RlZmluZSBCYWRBbGxvYwkgIDExCS8qIGluc3VmZmljaWVudCByZXNvdXJjZXMgKi8KLSNkZWZpbmUgQmFkQ29sb3IJICAxMgkvKiBubyBzdWNoIGNvbG9ybWFwICovCi0jZGVmaW5lIEJhZEdDCQkgIDEzCS8qIHBhcmFtZXRlciBub3QgYSBHQyAqLwotI2RlZmluZSBCYWRJRENob2ljZQkgIDE0CS8qIGNob2ljZSBub3QgaW4gcmFuZ2Ugb3IgYWxyZWFkeSB1c2VkICovCi0jZGVmaW5lIEJhZE5hbWUJCSAgMTUJLyogZm9udCBvciBjb2xvciBuYW1lIGRvZXNuJ3QgZXhpc3QgKi8KLSNkZWZpbmUgQmFkTGVuZ3RoCSAgMTYJLyogUmVxdWVzdCBsZW5ndGggaW5jb3JyZWN0ICovCi0jZGVmaW5lIEJhZEltcGxlbWVudGF0aW9uIDE3CS8qIHNlcnZlciBpcyBkZWZlY3RpdmUgKi8KLQotI2RlZmluZSBGaXJzdEV4dGVuc2lvbkVycm9yCTEyOAotI2RlZmluZSBMYXN0RXh0ZW5zaW9uRXJyb3IJMjU1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV0lORE9XIERFRklOSVRJT05TIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBXaW5kb3cgY2xhc3NlcyB1c2VkIGJ5IENyZWF0ZVdpbmRvdyAqLwotLyogTm90ZSB0aGF0IENvcHlGcm9tUGFyZW50IGlzIGFscmVhZHkgZGVmaW5lZCBhcyAwIGFib3ZlICovCi0KLSNkZWZpbmUgSW5wdXRPdXRwdXQJCTEKLSNkZWZpbmUgSW5wdXRPbmx5CQkyCi0KLS8qIFdpbmRvdyBhdHRyaWJ1dGVzIGZvciBDcmVhdGVXaW5kb3cgYW5kIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMgKi8KLQotI2RlZmluZSBDV0JhY2tQaXhtYXAJCSgxTDw8MCkKLSNkZWZpbmUgQ1dCYWNrUGl4ZWwJCSgxTDw8MSkKLSNkZWZpbmUgQ1dCb3JkZXJQaXhtYXAJCSgxTDw8MikKLSNkZWZpbmUgQ1dCb3JkZXJQaXhlbCAgICAgICAgICAgKDFMPDwzKQotI2RlZmluZSBDV0JpdEdyYXZpdHkJCSgxTDw8NCkKLSNkZWZpbmUgQ1dXaW5HcmF2aXR5CQkoMUw8PDUpCi0jZGVmaW5lIENXQmFja2luZ1N0b3JlICAgICAgICAgICgxTDw8NikKLSNkZWZpbmUgQ1dCYWNraW5nUGxhbmVzCSAgICAgICAgKDFMPDw3KQotI2RlZmluZSBDV0JhY2tpbmdQaXhlbAkgICAgICAgICgxTDw8OCkKLSNkZWZpbmUgQ1dPdmVycmlkZVJlZGlyZWN0CSgxTDw8OSkKLSNkZWZpbmUgQ1dTYXZlVW5kZXIJCSgxTDw8MTApCi0jZGVmaW5lIENXRXZlbnRNYXNrCQkoMUw8PDExKQotI2RlZmluZSBDV0RvbnRQcm9wYWdhdGUJICAgICAgICAoMUw8PDEyKQotI2RlZmluZSBDV0NvbG9ybWFwCQkoMUw8PDEzKQotI2RlZmluZSBDV0N1cnNvcgkgICAgICAgICgxTDw8MTQpCi0KLS8qIENvbmZpZ3VyZVdpbmRvdyBzdHJ1Y3R1cmUgKi8KLQotI2RlZmluZSBDV1gJCQkoMTw8MCkKLSNkZWZpbmUgQ1dZCQkJKDE8PDEpCi0jZGVmaW5lIENXV2lkdGgJCQkoMTw8MikKLSNkZWZpbmUgQ1dIZWlnaHQJCSgxPDwzKQotI2RlZmluZSBDV0JvcmRlcldpZHRoCQkoMTw8NCkKLSNkZWZpbmUgQ1dTaWJsaW5nCQkoMTw8NSkKLSNkZWZpbmUgQ1dTdGFja01vZGUJCSgxPDw2KQotCi0KLS8qIEJpdCBHcmF2aXR5ICovCi0KLSNkZWZpbmUgRm9yZ2V0R3Jhdml0eQkJMAotI2RlZmluZSBOb3J0aFdlc3RHcmF2aXR5CTEKLSNkZWZpbmUgTm9ydGhHcmF2aXR5CQkyCi0jZGVmaW5lIE5vcnRoRWFzdEdyYXZpdHkJMwotI2RlZmluZSBXZXN0R3Jhdml0eQkJNAotI2RlZmluZSBDZW50ZXJHcmF2aXR5CQk1Ci0jZGVmaW5lIEVhc3RHcmF2aXR5CQk2Ci0jZGVmaW5lIFNvdXRoV2VzdEdyYXZpdHkJNwotI2RlZmluZSBTb3V0aEdyYXZpdHkJCTgKLSNkZWZpbmUgU291dGhFYXN0R3Jhdml0eQk5Ci0jZGVmaW5lIFN0YXRpY0dyYXZpdHkJCTEwCi0KLS8qIFdpbmRvdyBncmF2aXR5ICsgYml0IGdyYXZpdHkgYWJvdmUgKi8KLQotI2RlZmluZSBVbm1hcEdyYXZpdHkJCTAKLQotLyogVXNlZCBpbiBDcmVhdGVXaW5kb3cgZm9yIGJhY2tpbmctc3RvcmUgaGludCAqLwotCi0jZGVmaW5lIE5vdFVzZWZ1bCAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgV2hlbk1hcHBlZCAgICAgICAgICAgICAgMQotI2RlZmluZSBBbHdheXMgICAgICAgICAgICAgICAgICAyCi0KLS8qIFVzZWQgaW4gR2V0V2luZG93QXR0cmlidXRlcyByZXBseSAqLwotCi0jZGVmaW5lIElzVW5tYXBwZWQJCTAKLSNkZWZpbmUgSXNVbnZpZXdhYmxlCQkxCi0jZGVmaW5lIElzVmlld2FibGUJCTIKLQotLyogVXNlZCBpbiBDaGFuZ2VTYXZlU2V0ICovCi0KLSNkZWZpbmUgU2V0TW9kZUluc2VydCAgICAgICAgICAgMAotI2RlZmluZSBTZXRNb2RlRGVsZXRlICAgICAgICAgICAxCi0KLS8qIFVzZWQgaW4gQ2hhbmdlQ2xvc2VEb3duTW9kZSAqLwotCi0jZGVmaW5lIERlc3Ryb3lBbGwgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUmV0YWluUGVybWFuZW50ICAgICAgICAgMQotI2RlZmluZSBSZXRhaW5UZW1wb3JhcnkgICAgICAgICAyCi0KLS8qIFdpbmRvdyBzdGFja2luZyBtZXRob2QgKGluIGNvbmZpZ3VyZVdpbmRvdykgKi8KLQotI2RlZmluZSBBYm92ZSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEJlbG93ICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVG9wSWYgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBCb3R0b21JZiAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE9wcG9zaXRlICAgICAgICAgICAgICAgIDQKLQotLyogQ2lyY3VsYXRpb24gZGlyZWN0aW9uICovCi0KLSNkZWZpbmUgUmFpc2VMb3dlc3QgICAgICAgICAgICAgMAotI2RlZmluZSBMb3dlckhpZ2hlc3QgICAgICAgICAgICAxCi0KLS8qIFByb3BlcnR5IG1vZGVzICovCi0KLSNkZWZpbmUgUHJvcE1vZGVSZXBsYWNlICAgICAgICAgMAotI2RlZmluZSBQcm9wTW9kZVByZXBlbmQgICAgICAgICAxCi0jZGVmaW5lIFByb3BNb2RlQXBwZW5kICAgICAgICAgIDIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHUkFQSElDUyBERUZJTklUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBncmFwaGljcyBmdW5jdGlvbnMsIGFzIGluIEdDLmFsdSAqLwotCi0jZGVmaW5lCUdYY2xlYXIJCQkweDAJCS8qIDAgKi8KLSNkZWZpbmUgR1hhbmQJCQkweDEJCS8qIHNyYyBBTkQgZHN0ICovCi0jZGVmaW5lIEdYYW5kUmV2ZXJzZQkJMHgyCQkvKiBzcmMgQU5EIE5PVCBkc3QgKi8KLSNkZWZpbmUgR1hjb3B5CQkJMHgzCQkvKiBzcmMgKi8KLSNkZWZpbmUgR1hhbmRJbnZlcnRlZAkJMHg0CQkvKiBOT1Qgc3JjIEFORCBkc3QgKi8KLSNkZWZpbmUJR1hub29wCQkJMHg1CQkvKiBkc3QgKi8KLSNkZWZpbmUgR1h4b3IJCQkweDYJCS8qIHNyYyBYT1IgZHN0ICovCi0jZGVmaW5lIEdYb3IJCQkweDcJCS8qIHNyYyBPUiBkc3QgKi8KLSNkZWZpbmUgR1hub3IJCQkweDgJCS8qIE5PVCBzcmMgQU5EIE5PVCBkc3QgKi8KLSNkZWZpbmUgR1hlcXVpdgkJCTB4OQkJLyogTk9UIHNyYyBYT1IgZHN0ICovCi0jZGVmaW5lIEdYaW52ZXJ0CQkweGEJCS8qIE5PVCBkc3QgKi8KLSNkZWZpbmUgR1hvclJldmVyc2UJCTB4YgkJLyogc3JjIE9SIE5PVCBkc3QgKi8KLSNkZWZpbmUgR1hjb3B5SW52ZXJ0ZWQJCTB4YwkJLyogTk9UIHNyYyAqLwotI2RlZmluZSBHWG9ySW52ZXJ0ZWQJCTB4ZAkJLyogTk9UIHNyYyBPUiBkc3QgKi8KLSNkZWZpbmUgR1huYW5kCQkJMHhlCQkvKiBOT1Qgc3JjIE9SIE5PVCBkc3QgKi8KLSNkZWZpbmUgR1hzZXQJCQkweGYJCS8qIDEgKi8KLQotLyogTGluZVN0eWxlICovCi0KLSNkZWZpbmUgTGluZVNvbGlkCQkwCi0jZGVmaW5lIExpbmVPbk9mZkRhc2gJCTEKLSNkZWZpbmUgTGluZURvdWJsZURhc2gJCTIKLQotLyogY2FwU3R5bGUgKi8KLQotI2RlZmluZSBDYXBOb3RMYXN0CQkwCi0jZGVmaW5lIENhcEJ1dHQJCQkxCi0jZGVmaW5lIENhcFJvdW5kCQkyCi0jZGVmaW5lIENhcFByb2plY3RpbmcJCTMKLQotLyogam9pblN0eWxlICovCi0KLSNkZWZpbmUgSm9pbk1pdGVyCQkwCi0jZGVmaW5lIEpvaW5Sb3VuZAkJMQotI2RlZmluZSBKb2luQmV2ZWwJCTIKLQotLyogZmlsbFN0eWxlICovCi0KLSNkZWZpbmUgRmlsbFNvbGlkCQkwCi0jZGVmaW5lIEZpbGxUaWxlZAkJMQotI2RlZmluZSBGaWxsU3RpcHBsZWQJCTIKLSNkZWZpbmUgRmlsbE9wYXF1ZVN0aXBwbGVkCTMKLQotLyogZmlsbFJ1bGUgKi8KLQotI2RlZmluZSBFdmVuT2RkUnVsZQkJMAotI2RlZmluZSBXaW5kaW5nUnVsZQkJMQotCi0vKiBzdWJ3aW5kb3cgbW9kZSAqLwotCi0jZGVmaW5lIENsaXBCeUNoaWxkcmVuCQkwCi0jZGVmaW5lIEluY2x1ZGVJbmZlcmlvcnMJMQotCi0vKiBTZXRDbGlwUmVjdGFuZ2xlcyBvcmRlcmluZyAqLwotCi0jZGVmaW5lIFVuc29ydGVkCQkwCi0jZGVmaW5lIFlTb3J0ZWQJCQkxCi0jZGVmaW5lIFlYU29ydGVkCQkyCi0jZGVmaW5lIFlYQmFuZGVkCQkzCi0KLS8qIENvb3JkaW5hdGVNb2RlIGZvciBkcmF3aW5nIHJvdXRpbmVzICovCi0KLSNkZWZpbmUgQ29vcmRNb2RlT3JpZ2luCQkwCS8qIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gKi8KLSNkZWZpbmUgQ29vcmRNb2RlUHJldmlvdXMgICAgICAgMQkvKiByZWxhdGl2ZSB0byBwcmV2aW91cyBwb2ludCAqLwotCi0vKiBQb2x5Z29uIHNoYXBlcyAqLwotCi0jZGVmaW5lIENvbXBsZXgJCQkwCS8qIHBhdGhzIG1heSBpbnRlcnNlY3QgKi8KLSNkZWZpbmUgTm9uY29udmV4CQkxCS8qIG5vIHBhdGhzIGludGVyc2VjdCwgYnV0IG5vdCBjb252ZXggKi8KLSNkZWZpbmUgQ29udmV4CQkJMgkvKiB3aG9sbHkgY29udmV4ICovCi0KLS8qIEFyYyBtb2RlcyBmb3IgUG9seUZpbGxBcmMgKi8KLQotI2RlZmluZSBBcmNDaG9yZAkJMAkvKiBqb2luIGVuZHBvaW50cyBvZiBhcmMgKi8KLSNkZWZpbmUgQXJjUGllU2xpY2UJCTEJLyogam9pbiBlbmRwb2ludHMgdG8gY2VudGVyIG9mIGFyYyAqLwotCi0vKiBHQyBjb21wb25lbnRzOiBtYXNrcyB1c2VkIGluIENyZWF0ZUdDLCBDb3B5R0MsIENoYW5nZUdDLCBPUidlZCBpbnRvCi0gICBHQy5zdGF0ZUNoYW5nZXMgKi8KLQotI2RlZmluZSBHQ0Z1bmN0aW9uICAgICAgICAgICAgICAoMUw8PDApCi0jZGVmaW5lIEdDUGxhbmVNYXNrICAgICAgICAgICAgICgxTDw8MSkKLSNkZWZpbmUgR0NGb3JlZ3JvdW5kICAgICAgICAgICAgKDFMPDwyKQotI2RlZmluZSBHQ0JhY2tncm91bmQgICAgICAgICAgICAoMUw8PDMpCi0jZGVmaW5lIEdDTGluZVdpZHRoICAgICAgICAgICAgICgxTDw8NCkKLSNkZWZpbmUgR0NMaW5lU3R5bGUgICAgICAgICAgICAgKDFMPDw1KQotI2RlZmluZSBHQ0NhcFN0eWxlICAgICAgICAgICAgICAoMUw8PDYpCi0jZGVmaW5lIEdDSm9pblN0eWxlCQkoMUw8PDcpCi0jZGVmaW5lIEdDRmlsbFN0eWxlCQkoMUw8PDgpCi0jZGVmaW5lIEdDRmlsbFJ1bGUJCSgxTDw8OSkgCi0jZGVmaW5lIEdDVGlsZQkJCSgxTDw8MTApCi0jZGVmaW5lIEdDU3RpcHBsZQkJKDFMPDwxMSkKLSNkZWZpbmUgR0NUaWxlU3RpcFhPcmlnaW4JKDFMPDwxMikKLSNkZWZpbmUgR0NUaWxlU3RpcFlPcmlnaW4JKDFMPDwxMykKLSNkZWZpbmUgR0NGb250IAkJCSgxTDw8MTQpCi0jZGVmaW5lIEdDU3Vid2luZG93TW9kZQkJKDFMPDwxNSkKLSNkZWZpbmUgR0NHcmFwaGljc0V4cG9zdXJlcyAgICAgKDFMPDwxNikKLSNkZWZpbmUgR0NDbGlwWE9yaWdpbgkJKDFMPDwxNykKLSNkZWZpbmUgR0NDbGlwWU9yaWdpbgkJKDFMPDwxOCkKLSNkZWZpbmUgR0NDbGlwTWFzawkJKDFMPDwxOSkKLSNkZWZpbmUgR0NEYXNoT2Zmc2V0CQkoMUw8PDIwKQotI2RlZmluZSBHQ0Rhc2hMaXN0CQkoMUw8PDIxKQotI2RlZmluZSBHQ0FyY01vZGUJCSgxTDw8MjIpCi0KLSNkZWZpbmUgR0NMYXN0Qml0CQkyMgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGT05UUyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdXNlZCBpbiBRdWVyeUZvbnQgLS0gZHJhdyBkaXJlY3Rpb24gKi8KLQotI2RlZmluZSBGb250TGVmdFRvUmlnaHQJCTAKLSNkZWZpbmUgRm9udFJpZ2h0VG9MZWZ0CQkxCi0KLSNkZWZpbmUgRm9udENoYW5nZQkJMjU1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElNQUdJTkcgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEltYWdlRm9ybWF0IC0tIFB1dEltYWdlLCBHZXRJbWFnZSAqLwotCi0jZGVmaW5lIFhZQml0bWFwCQkwCS8qIGRlcHRoIDEsIFhZRm9ybWF0ICovCi0jZGVmaW5lIFhZUGl4bWFwCQkxCS8qIGRlcHRoID09IGRyYXdhYmxlIGRlcHRoICovCi0jZGVmaW5lIFpQaXhtYXAJCQkyCS8qIGRlcHRoID09IGRyYXdhYmxlIGRlcHRoICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENPTE9SIE1BUCBTVFVGRiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIENyZWF0ZUNvbG9ybWFwICovCi0KLSNkZWZpbmUgQWxsb2NOb25lCQkwCS8qIGNyZWF0ZSBtYXAgd2l0aCBubyBlbnRyaWVzICovCi0jZGVmaW5lIEFsbG9jQWxsCQkxCS8qIGFsbG9jYXRlIGVudGlyZSBtYXAgd3JpdGVhYmxlICovCi0KLQotLyogRmxhZ3MgdXNlZCBpbiBTdG9yZU5hbWVkQ29sb3IsIFN0b3JlQ29sb3JzICovCi0KLSNkZWZpbmUgRG9SZWQJCQkoMTw8MCkKLSNkZWZpbmUgRG9HcmVlbgkJCSgxPDwxKQotI2RlZmluZSBEb0JsdWUJCQkoMTw8MikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDVVJTT1IgU1RVRkYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUXVlcnlCZXN0U2l6ZSBDbGFzcyAqLwotCi0jZGVmaW5lIEN1cnNvclNoYXBlCQkwCS8qIGxhcmdlc3Qgc2l6ZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgKi8KLSNkZWZpbmUgVGlsZVNoYXBlCQkxCS8qIHNpemUgdGlsZWQgZmFzdGVzdCAqLwotI2RlZmluZSBTdGlwcGxlU2hhcGUJCTIJLyogc2l6ZSBzdGlwcGxlZCBmYXN0ZXN0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIEtFWUJPQVJEL1BPSU5URVIgU1RVRkYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBdXRvUmVwZWF0TW9kZU9mZgkwCi0jZGVmaW5lIEF1dG9SZXBlYXRNb2RlT24JMQotI2RlZmluZSBBdXRvUmVwZWF0TW9kZURlZmF1bHQJMgotCi0jZGVmaW5lIExlZE1vZGVPZmYJCTAKLSNkZWZpbmUgTGVkTW9kZU9uCQkxCi0KLS8qIG1hc2tzIGZvciBDaGFuZ2VLZXlib2FyZENvbnRyb2wgKi8KLQotI2RlZmluZSBLQktleUNsaWNrUGVyY2VudAkoMUw8PDApCi0jZGVmaW5lIEtCQmVsbFBlcmNlbnQJCSgxTDw8MSkKLSNkZWZpbmUgS0JCZWxsUGl0Y2gJCSgxTDw8MikKLSNkZWZpbmUgS0JCZWxsRHVyYXRpb24JCSgxTDw8MykKLSNkZWZpbmUgS0JMZWQJCQkoMUw8PDQpCi0jZGVmaW5lIEtCTGVkTW9kZQkJKDFMPDw1KQotI2RlZmluZSBLQktleQkJCSgxTDw8NikKLSNkZWZpbmUgS0JBdXRvUmVwZWF0TW9kZQkoMUw8PDcpCi0KLSNkZWZpbmUgTWFwcGluZ1N1Y2Nlc3MgICAgIAkwCi0jZGVmaW5lIE1hcHBpbmdCdXN5ICAgICAgICAJMQotI2RlZmluZSBNYXBwaW5nRmFpbGVkCQkyCi0KLSNkZWZpbmUgTWFwcGluZ01vZGlmaWVyCQkwCi0jZGVmaW5lIE1hcHBpbmdLZXlib2FyZAkJMQotI2RlZmluZSBNYXBwaW5nUG9pbnRlcgkJMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNDUkVFTiBTQVZFUiBTVFVGRiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBEb250UHJlZmVyQmxhbmtpbmcJMAotI2RlZmluZSBQcmVmZXJCbGFua2luZwkJMQotI2RlZmluZSBEZWZhdWx0QmxhbmtpbmcJCTIKLQotI2RlZmluZSBEaXNhYmxlU2NyZWVuU2F2ZXIJMAotI2RlZmluZSBEaXNhYmxlU2NyZWVuSW50ZXJ2YWwJMAotCi0jZGVmaW5lIERvbnRBbGxvd0V4cG9zdXJlcwkwCi0jZGVmaW5lIEFsbG93RXhwb3N1cmVzCQkxCi0jZGVmaW5lIERlZmF1bHRFeHBvc3VyZXMJMgotCi0vKiBmb3IgRm9yY2VTY3JlZW5TYXZlciAqLwotCi0jZGVmaW5lIFNjcmVlblNhdmVyUmVzZXQgMAotI2RlZmluZSBTY3JlZW5TYXZlckFjdGl2ZSAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSE9TVFMgQU5EIENPTk5FQ1RJT05TCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciBDaGFuZ2VIb3N0cyAqLwotCi0jZGVmaW5lIEhvc3RJbnNlcnQJCTAKLSNkZWZpbmUgSG9zdERlbGV0ZQkJMQotCi0vKiBmb3IgQ2hhbmdlQWNjZXNzQ29udHJvbCAqLwotCi0jZGVmaW5lIEVuYWJsZUFjY2VzcwkJMSAgICAgIAotI2RlZmluZSBEaXNhYmxlQWNjZXNzCQkwCi0KLS8qIERpc3BsYXkgY2xhc3NlcyAgdXNlZCBpbiBvcGVuaW5nIHRoZSBjb25uZWN0aW9uIAotICogTm90ZSB0aGF0IHRoZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvbmVzIGFyZSBldmVuIG51bWJlcmVkIGFuZCB0aGUKLSAqIGR5bmFtaWNhbGx5IGNoYW5nZWFibGUgb25lcyBhcmUgb2RkIG51bWJlcmVkICovCi0KLSNkZWZpbmUgU3RhdGljR3JheQkJMAotI2RlZmluZSBHcmF5U2NhbGUJCTEKLSNkZWZpbmUgU3RhdGljQ29sb3IJCTIKLSNkZWZpbmUgUHNldWRvQ29sb3IJCTMKLSNkZWZpbmUgVHJ1ZUNvbG9yCQk0Ci0jZGVmaW5lIERpcmVjdENvbG9yCQk1Ci0KLQotLyogQnl0ZSBvcmRlciAgdXNlZCBpbiBpbWFnZUJ5dGVPcmRlciBhbmQgYml0bWFwQml0T3JkZXIgKi8KLQotI2RlZmluZSBMU0JGaXJzdAkJMAotI2RlZmluZSBNU0JGaXJzdAkJMQotCi0jZW5kaWYgLyogWF9IICovCi0KLQotLyogJFhvcmc6IFhsaWIuaCx2IDEuNiAyMDAxLzAyLzA5IDAyOjAzOjM4IHhvcmdjdnMgRXhwICQgKi8KLS8qIAotCi1Db3B5cmlnaHQgMTk4NSwgMTk4NiwgMTk4NywgMTk5MSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci1jb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLU9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgotQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKLWluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KLQotKi8KLS8qICRYRnJlZTg2OiB4Yy9saWIvWDExL1hsaWIuaCx2IDMuMjMgMjAwMi8wNS8zMSAxODo0NTo0MiBkYXdlcyBFeHAgJCAqLwotCi0KLS8qCi0gKglYbGliLmggLSBIZWFkZXIgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmaWxlIGZvciB0aGUgQyBzdWJyb3V0aW5lCi0gKglpbnRlcmZhY2UgbGlicmFyeSAoWGxpYikgdG8gdGhlIFggV2luZG93IFN5c3RlbSBQcm90b2NvbCAoVjExKS4KLSAqCVN0cnVjdHVyZXMgYW5kIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCAiXyIgYXJlIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkuCi0gKi8KLSNpZm5kZWYgX1hMSUJfSF8KLSNkZWZpbmUgX1hMSUJfSF8KLQotI2RlZmluZSBYbGliU3BlY2lmaWNhdGlvblJlbGVhc2UgNgotCi0jaWZkZWYgVVNHCi0jaWZuZGVmIF9fVFlQRVNfXwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJCS8qIGZvcmdvdCB0byBwcm90ZWN0IGl0Li4uICovCi0jZGVmaW5lIF9fVFlQRVNfXwotI2VuZGlmIC8qIF9fVFlQRVNfXyAqLwotI2Vsc2UKLSNpZiBkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpICYmIGRlZmluZWQoTU9UT1JPTEEpCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jZWxzZQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jZW5kaWYgLyogVVNHICovCi0KLSNpZiAwCi0jaW5jbHVkZSA8WDExL1guaD4KLQotLyogYXBwbGljYXRpb25zIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZXNlIHR3byBoZWFkZXJzIGJlaW5nIGluY2x1ZGVkISAqLwotI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+Ci0jaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KLQotI2VuZGlmIC8qIGlmIDAgKi8KLQotI2lmbmRlZiBYX1dDSEFSCi0jaWZkZWYgWF9OT1RfU1REQ19FTlYKLSNpZm5kZWYgU0NPMzI0Ci0jaWZuZGVmIElTQwotI2RlZmluZSBYX1dDSEFSCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBYX1dDSEFSCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2lmZGVmIF9fVU5JWE9TMl9fCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotLyogcmVwbGFjZSB0aGlzIHdpdGggI2luY2x1ZGUgb3IgdHlwZWRlZiBhcHByb3ByaWF0ZSBmb3IgeW91ciBzeXN0ZW0gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB3Y2hhcl90OwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoSVNDKSAmJiBkZWZpbmVkKFVTRV9YTUJUT1dDKQotI2RlZmluZSB3Y3RvbWIoYSxiKQlfWHdjdG9tYihhLGIpCi0jZGVmaW5lIG1ibGVuKGEsYikJX1htYmxlbihhLGIpIAotI2lmbmRlZiBVU0VfWFdDSEFSX1NUUklORwotI2RlZmluZSBtYnRvd2MoYSxiLGMpCV9YbWJ0b3djKGEsYixjKQotI2VuZGlmCi0jZW5kaWYKLQotLyogQVBJIG1lbnRpb25pbmcgIlVURjgiIG9yICJ1dGY4IiBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbgotICAgTm92ZW1iZXIgMjAwMC4gSXRzIHByZXNlbmNlIGlzIGluZGljYXRlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbWFjcm8uICovCi0jZGVmaW5lIFhfSEFWRV9VVEY4X1NUUklORyAxCi0KLXR5cGVkZWYgY2hhciAqWFBvaW50ZXI7Ci0KLSNkZWZpbmUgQm9vbCBpbnQKLSNkZWZpbmUgU3RhdHVzIGludAotI2RlZmluZSBUcnVlIDEKLSNkZWZpbmUgRmFsc2UgMAotCi0jZGVmaW5lIFF1ZXVlZEFscmVhZHkgMAotI2RlZmluZSBRdWV1ZWRBZnRlclJlYWRpbmcgMQotI2RlZmluZSBRdWV1ZWRBZnRlckZsdXNoIDIKLQotI2RlZmluZSBDb25uZWN0aW9uTnVtYmVyKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZmQpCi0jZGVmaW5lIFJvb3RXaW5kb3coZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290KQotI2RlZmluZSBEZWZhdWx0U2NyZWVuKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGVmYXVsdF9zY3JlZW4pCi0jZGVmaW5lIERlZmF1bHRSb290V2luZG93KGRweSkgCShTY3JlZW5PZkRpc3BsYXkoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSktPnJvb3QpCi0jZGVmaW5lIERlZmF1bHRWaXN1YWwoZHB5LCBzY3IpIChTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPnJvb3RfdmlzdWFsKQotI2RlZmluZSBEZWZhdWx0R0MoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5kZWZhdWx0X2djKQotI2RlZmluZSBCbGFja1BpeGVsKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+YmxhY2tfcGl4ZWwpCi0jZGVmaW5lIFdoaXRlUGl4ZWwoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aGl0ZV9waXhlbCkKLSNkZWZpbmUgQWxsUGxhbmVzIAkJKCh1bnNpZ25lZCBsb25nKX4wTCkKLSNkZWZpbmUgUUxlbmd0aChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5xbGVuKQotI2RlZmluZSBEaXNwbGF5V2lkdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aWR0aCkKLSNkZWZpbmUgRGlzcGxheUhlaWdodChkcHksIHNjcikgKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+aGVpZ2h0KQotI2RlZmluZSBEaXNwbGF5V2lkdGhNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5td2lkdGgpCi0jZGVmaW5lIERpc3BsYXlIZWlnaHRNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5taGVpZ2h0KQotI2RlZmluZSBEaXNwbGF5UGxhbmVzKGRweSwgc2NyKSAoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQotI2RlZmluZSBEaXNwbGF5Q2VsbHMoZHB5LCBzY3IpIAkoRGVmYXVsdFZpc3VhbChkcHksc2NyKS0+bWFwX2VudHJpZXMpCi0jZGVmaW5lIFNjcmVlbkNvdW50KGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bnNjcmVlbnMpCi0jZGVmaW5lIFNlcnZlclZlbmRvcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnZlbmRvcikKLSNkZWZpbmUgUHJvdG9jb2xWZXJzaW9uKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cHJvdG9fbWFqb3JfdmVyc2lvbikKLSNkZWZpbmUgUHJvdG9jb2xSZXZpc2lvbihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnByb3RvX21pbm9yX3ZlcnNpb24pCi0jZGVmaW5lIFZlbmRvclJlbGVhc2UoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5yZWxlYXNlKQotI2RlZmluZSBEaXNwbGF5U3RyaW5nKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGlzcGxheV9uYW1lKQotI2RlZmluZSBEZWZhdWx0RGVwdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQotI2RlZmluZSBEZWZhdWx0Q29sb3JtYXAoZHB5LCBzY3IpKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+Y21hcCkKLSNkZWZpbmUgQml0bWFwVW5pdChkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF91bml0KQotI2RlZmluZSBCaXRtYXBCaXRPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF9iaXRfb3JkZXIpCi0jZGVmaW5lIEJpdG1hcFBhZChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5iaXRtYXBfcGFkKQotI2RlZmluZSBJbWFnZUJ5dGVPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJ5dGVfb3JkZXIpCi0jaWZkZWYgQ1JBWSAvKiB1bmFibGUgdG8gZ2V0IFdPUkQ2NCB3aXRob3V0IHB1bGxpbmcgaW4gb3RoZXIgc3ltYm9scyAqLwotI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCVhOZXh0UmVxdWVzdChkcHkpCi0jZWxzZQotI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVxdWVzdCArIDEpCi0jZW5kaWYKLSNkZWZpbmUgTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bGFzdF9yZXF1ZXN0X3JlYWQpCi0KLS8qIG1hY3JvcyBmb3Igc2NyZWVuIG9yaWVudGVkIGFwcGxpY2F0aW9ucyAodG9vbGtpdCkgKi8KLSNkZWZpbmUgU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSgmKChfWFByaXZEaXNwbGF5KWRweSktPnNjcmVlbnNbc2NyXSkKLSNkZWZpbmUgRGVmYXVsdFNjcmVlbk9mRGlzcGxheShkcHkpIFNjcmVlbk9mRGlzcGxheShkcHksRGVmYXVsdFNjcmVlbihkcHkpKQotI2RlZmluZSBEaXNwbGF5T2ZTY3JlZW4ocykJKChzKS0+ZGlzcGxheSkKLSNkZWZpbmUgUm9vdFdpbmRvd09mU2NyZWVuKHMpCSgocyktPnJvb3QpCi0jZGVmaW5lIEJsYWNrUGl4ZWxPZlNjcmVlbihzKQkoKHMpLT5ibGFja19waXhlbCkKLSNkZWZpbmUgV2hpdGVQaXhlbE9mU2NyZWVuKHMpCSgocyktPndoaXRlX3BpeGVsKQotI2RlZmluZSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihzKSgocyktPmNtYXApCi0jZGVmaW5lIERlZmF1bHREZXB0aE9mU2NyZWVuKHMpCSgocyktPnJvb3RfZGVwdGgpCi0jZGVmaW5lIERlZmF1bHRHQ09mU2NyZWVuKHMpCSgocyktPmRlZmF1bHRfZ2MpCi0jZGVmaW5lIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzKSgocyktPnJvb3RfdmlzdWFsKQotI2RlZmluZSBXaWR0aE9mU2NyZWVuKHMpCSgocyktPndpZHRoKQotI2RlZmluZSBIZWlnaHRPZlNjcmVlbihzKQkoKHMpLT5oZWlnaHQpCi0jZGVmaW5lIFdpZHRoTU1PZlNjcmVlbihzKQkoKHMpLT5td2lkdGgpCi0jZGVmaW5lIEhlaWdodE1NT2ZTY3JlZW4ocykJKChzKS0+bWhlaWdodCkKLSNkZWZpbmUgUGxhbmVzT2ZTY3JlZW4ocykJKChzKS0+cm9vdF9kZXB0aCkKLSNkZWZpbmUgQ2VsbHNPZlNjcmVlbihzKQkoRGVmYXVsdFZpc3VhbE9mU2NyZWVuKChzKSktPm1hcF9lbnRyaWVzKQotI2RlZmluZSBNaW5DbWFwc09mU2NyZWVuKHMpCSgocyktPm1pbl9tYXBzKQotI2RlZmluZSBNYXhDbWFwc09mU2NyZWVuKHMpCSgocyktPm1heF9tYXBzKQotI2RlZmluZSBEb2VzU2F2ZVVuZGVycyhzKQkoKHMpLT5zYXZlX3VuZGVycykKLSNkZWZpbmUgRG9lc0JhY2tpbmdTdG9yZShzKQkoKHMpLT5iYWNraW5nX3N0b3JlKQotI2RlZmluZSBFdmVudE1hc2tPZlNjcmVlbihzKQkoKHMpLT5yb290X2lucHV0X21hc2spCi0KLS8qCi0gKiBFeHRlbnNpb25zIG5lZWQgYSB3YXkgdG8gaGFuZyBwcml2YXRlIGRhdGEgb24gc29tZSBzdHJ1Y3R1cmVzLgotICovCi10eXBlZGVmIHN0cnVjdCBfWEV4dERhdGEgewotCWludCBudW1iZXI7CQkvKiBudW1iZXIgcmV0dXJuZWQgYnkgWFJlZ2lzdGVyRXh0ZW5zaW9uICovCi0Jc3RydWN0IF9YRXh0RGF0YSAqbmV4dDsJLyogbmV4dCBpdGVtIG9uIGxpc3Qgb2YgZGF0YSBmb3Igc3RydWN0dXJlICovCi0JaW50ICgqZnJlZV9wcml2YXRlKSgJLyogY2FsbGVkIHRvIGZyZWUgcHJpdmF0ZSBzdG9yYWdlICovCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotCXN0cnVjdCBfWEV4dERhdGEgKmV4dGVuc2lvbgotI2VuZGlmCi0JKTsKLQlYUG9pbnRlciBwcml2YXRlX2RhdGE7CS8qIGRhdGEgcHJpdmF0ZSB0byB0aGlzIGV4dGVuc2lvbi4gKi8KLX0gWEV4dERhdGE7Ci0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24gbWVjaGFuaXNtLgotICovCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBwdWJsaWMgdG8gZXh0ZW5zaW9uLCBjYW5ub3QgYmUgY2hhbmdlZCAqLwotCWludCBleHRlbnNpb247CQkvKiBleHRlbnNpb24gbnVtYmVyICovCi0JaW50IG1ham9yX29wY29kZTsJLyogbWFqb3Igb3AtY29kZSBhc3NpZ25lZCBieSBzZXJ2ZXIgKi8KLQlpbnQgZmlyc3RfZXZlbnQ7CS8qIGZpcnN0IGV2ZW50IG51bWJlciBmb3IgdGhlIGV4dGVuc2lvbiAqLwotCWludCBmaXJzdF9lcnJvcjsJLyogZmlyc3QgZXJyb3IgbnVtYmVyIGZvciB0aGUgZXh0ZW5zaW9uICovCi19IFhFeHRDb2RlczsKLQotLyoKLSAqIERhdGEgc3RydWN0dXJlIGZvciByZXRyaWV2aW5nIGluZm8gYWJvdXQgcGl4bWFwIGZvcm1hdHMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBkZXB0aDsKLSAgICBpbnQgYml0c19wZXJfcGl4ZWw7Ci0gICAgaW50IHNjYW5saW5lX3BhZDsKLX0gWFBpeG1hcEZvcm1hdFZhbHVlczsKLQotCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgZ3JhcGhpY3MgY29udGV4dC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBmdW5jdGlvbjsJCS8qIGxvZ2ljYWwgb3BlcmF0aW9uICovCi0JdW5zaWduZWQgbG9uZyBwbGFuZV9tYXNrOy8qIHBsYW5lIG1hc2sgKi8KLQl1bnNpZ25lZCBsb25nIGZvcmVncm91bmQ7LyogZm9yZWdyb3VuZCBwaXhlbCAqLwotCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZDsvKiBiYWNrZ3JvdW5kIHBpeGVsICovCi0JaW50IGxpbmVfd2lkdGg7CQkvKiBsaW5lIHdpZHRoICovCi0JaW50IGxpbmVfc3R5bGU7CSAJLyogTGluZVNvbGlkLCBMaW5lT25PZmZEYXNoLCBMaW5lRG91YmxlRGFzaCAqLwotCWludCBjYXBfc3R5bGU7CSAgCS8qIENhcE5vdExhc3QsIENhcEJ1dHQsIAotCQkJCSAgIENhcFJvdW5kLCBDYXBQcm9qZWN0aW5nICovCi0JaW50IGpvaW5fc3R5bGU7CSAJLyogSm9pbk1pdGVyLCBKb2luUm91bmQsIEpvaW5CZXZlbCAqLwotCWludCBmaWxsX3N0eWxlOwkgCS8qIEZpbGxTb2xpZCwgRmlsbFRpbGVkLCAKLQkJCQkgICBGaWxsU3RpcHBsZWQsIEZpbGxPcGFldWVTdGlwcGxlZCAqLwotCWludCBmaWxsX3J1bGU7CSAgCS8qIEV2ZW5PZGRSdWxlLCBXaW5kaW5nUnVsZSAqLwotCWludCBhcmNfbW9kZTsJCS8qIEFyY0Nob3JkLCBBcmNQaWVTbGljZSAqLwotCVBpeG1hcCB0aWxlOwkJLyogdGlsZSBwaXhtYXAgZm9yIHRpbGluZyBvcGVyYXRpb25zICovCi0JUGl4bWFwIHN0aXBwbGU7CQkvKiBzdGlwcGxlIDEgcGxhbmUgcGl4bWFwIGZvciBzdGlwcGluZyAqLwotCWludCB0c194X29yaWdpbjsJLyogb2Zmc2V0IGZvciB0aWxlIG9yIHN0aXBwbGUgb3BlcmF0aW9ucyAqLwotCWludCB0c195X29yaWdpbjsKLSAgICAgICAgRm9udCBmb250OwkgICAgICAgIC8qIGRlZmF1bHQgdGV4dCBmb250IGZvciB0ZXh0IG9wZXJhdGlvbnMgKi8KLQlpbnQgc3Vid2luZG93X21vZGU7ICAgICAvKiBDbGlwQnlDaGlsZHJlbiwgSW5jbHVkZUluZmVyaW9ycyAqLwotCUJvb2wgZ3JhcGhpY3NfZXhwb3N1cmVzOy8qIGJvb2xlYW4sIHNob3VsZCBleHBvc3VyZXMgYmUgZ2VuZXJhdGVkICovCi0JaW50IGNsaXBfeF9vcmlnaW47CS8qIG9yaWdpbiBmb3IgY2xpcHBpbmcgKi8KLQlpbnQgY2xpcF95X29yaWdpbjsKLQlQaXhtYXAgY2xpcF9tYXNrOwkvKiBiaXRtYXAgY2xpcHBpbmc7IG90aGVyIGNhbGxzIGZvciByZWN0cyAqLwotCWludCBkYXNoX29mZnNldDsJLyogcGF0dGVybmVkL2Rhc2hlZCBsaW5lIGluZm9ybWF0aW9uICovCi0JY2hhciBkYXNoZXM7Ci19IFhHQ1ZhbHVlczsKLQotLyoKLSAqIEdyYXBoaWNzIGNvbnRleHQuICBUaGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIGltcGxlbWVudGF0aW9uCi0gKiBkZXBlbmRlbnQuICBBIEdDIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZSBieSBhcHBsaWNhdGlvbiBjb2RlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IF9YR0MKLSNpZmRlZiBYTElCX0lMTEVHQUxfQUNDRVNTCi17Ci0gICAgWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCi0gICAgR0NvbnRleHQgZ2lkOwkvKiBwcm90b2NvbCBJRCBmb3IgZ3JhcGhpY3MgY29udGV4dCAqLwotICAgIC8qIHRoZXJlIGlzIG1vcmUgdG8gdGhpcyBzdHJ1Y3R1cmUsIGJ1dCBpdCBpcyBwcml2YXRlIHRvIFhsaWIgKi8KLX0KLSNlbmRpZgotKkdDOwotCi0vKgotICogVmlzdWFsIHN0cnVjdHVyZTsgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgY29sb3JtYXBwaW5nIHBvc3NpYmxlLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCi0JVmlzdWFsSUQgdmlzdWFsaWQ7CS8qIHZpc3VhbCBpZCBvZiB0aGlzIHZpc3VhbCAqLwotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLQlpbnQgY19jbGFzczsJCS8qIEMrKyBjbGFzcyBvZiBzY3JlZW4gKG1vbm9jaHJvbWUsIGV0Yy4pICovCi0jZWxzZQotCWludCBjbGFzczsJCS8qIGNsYXNzIG9mIHNjcmVlbiAobW9ub2Nocm9tZSwgZXRjLikgKi8KLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzazsJLyogbWFzayB2YWx1ZXMgKi8KLQlpbnQgYml0c19wZXJfcmdiOwkvKiBsb2cgYmFzZSAyIG9mIGRpc3RpbmN0IGNvbG9yIHZhbHVlcyAqLwotCWludCBtYXBfZW50cmllczsJLyogY29sb3IgbWFwIGVudHJpZXMgKi8KLX0gVmlzdWFsOwotCi0vKgotICogRGVwdGggc3RydWN0dXJlOyBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBwb3NzaWJsZSBkZXB0aC4KLSAqLwkKLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgZGVwdGg7CQkvKiB0aGlzIGRlcHRoIChaKSBvZiB0aGUgZGVwdGggKi8KLQlpbnQgbnZpc3VhbHM7CQkvKiBudW1iZXIgb2YgVmlzdWFsIHR5cGVzIGF0IHRoaXMgZGVwdGggKi8KLQlWaXN1YWwgKnZpc3VhbHM7CS8qIGxpc3Qgb2YgdmlzdWFscyBwb3NzaWJsZSBhdCB0aGlzIGRlcHRoICovCi19IERlcHRoOwotCi0vKgotICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmVlbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUKLSAqIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gIEEgU2NyZWVuIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZQotICogYnkgYXBwbGljYXRpb24gY29kZS4KLSAqLwotCi1zdHJ1Y3QgX1hEaXNwbGF5OwkJLyogRm9yd2FyZCBkZWNsYXJlIGJlZm9yZSB1c2UgZm9yIEMrKyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCi0Jc3RydWN0IF9YRGlzcGxheSAqZGlzcGxheTsvKiBiYWNrIHBvaW50ZXIgdG8gZGlzcGxheSBzdHJ1Y3R1cmUgKi8KLQlXaW5kb3cgcm9vdDsJCS8qIFJvb3Qgd2luZG93IGlkLiAqLwotCWludCB3aWR0aCwgaGVpZ2h0OwkvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHNjcmVlbiAqLwotCWludCBtd2lkdGgsIG1oZWlnaHQ7CS8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgIGluIG1pbGxpbWV0ZXJzICovCi0JaW50IG5kZXB0aHM7CQkvKiBudW1iZXIgb2YgZGVwdGhzIHBvc3NpYmxlICovCi0JRGVwdGggKmRlcHRoczsJCS8qIGxpc3Qgb2YgYWxsb3dhYmxlIGRlcHRocyBvbiB0aGUgc2NyZWVuICovCi0JaW50IHJvb3RfZGVwdGg7CQkvKiBiaXRzIHBlciBwaXhlbCAqLwotCVZpc3VhbCAqcm9vdF92aXN1YWw7CS8qIHJvb3QgdmlzdWFsICovCi0JR0MgZGVmYXVsdF9nYzsJCS8qIEdDIGZvciB0aGUgcm9vdCByb290IHZpc3VhbCAqLwotCUNvbG9ybWFwIGNtYXA7CQkvKiBkZWZhdWx0IGNvbG9yIG1hcCAqLwotCXVuc2lnbmVkIGxvbmcgd2hpdGVfcGl4ZWw7Ci0JdW5zaWduZWQgbG9uZyBibGFja19waXhlbDsJLyogV2hpdGUgYW5kIEJsYWNrIHBpeGVsIHZhbHVlcyAqLwotCWludCBtYXhfbWFwcywgbWluX21hcHM7CS8qIG1heCBhbmQgbWluIGNvbG9yIG1hcHMgKi8KLQlpbnQgYmFja2luZ19zdG9yZTsJLyogTmV2ZXIsIFdoZW5NYXBwZWQsIEFsd2F5cyAqLwotCUJvb2wgc2F2ZV91bmRlcnM7CQotCWxvbmcgcm9vdF9pbnB1dF9tYXNrOwkvKiBpbml0aWFsIHJvb3QgaW5wdXQgbWFzayAqLwotfSBTY3JlZW47Ci0KLS8qCi0gKiBGb3JtYXQgc3RydWN0dXJlOyBkZXNjcmliZXMgWkZvcm1hdCBkYXRhIHRoZSBzY3JlZW4gd2lsbCB1bmRlcnN0YW5kLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCi0JaW50IGRlcHRoOwkJLyogZGVwdGggb2YgdGhpcyBpbWFnZSBmb3JtYXQgKi8KLQlpbnQgYml0c19wZXJfcGl4ZWw7CS8qIGJpdHMvcGl4ZWwgYXQgdGhpcyBkZXB0aCAqLwotCWludCBzY2FubGluZV9wYWQ7CS8qIHNjYW5saW5lIG11c3QgcGFkZGVkIHRvIHRoaXMgbXVsdGlwbGUgKi8KLX0gU2NyZWVuRm9ybWF0OwotCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgd2luZG93IGF0dHJpYnV0ZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQaXhtYXAgYmFja2dyb3VuZF9waXhtYXA7CS8qIGJhY2tncm91bmQgb3IgTm9uZSBvciBQYXJlbnRSZWxhdGl2ZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF9waXhlbDsJLyogYmFja2dyb3VuZCBwaXhlbCAqLwotICAgIFBpeG1hcCBib3JkZXJfcGl4bWFwOwkvKiBib3JkZXIgb2YgdGhlIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIGxvbmcgYm9yZGVyX3BpeGVsOwkvKiBib3JkZXIgcGl4ZWwgdmFsdWUgKi8KLSAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCi0gICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KLSAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCi0gICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2V2ZWQgaWYgcG9zc2libGUgKi8KLSAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGl4ZWw7LyogdmFsdWUgdG8gdXNlIGluIHJlc3RvcmluZyBwbGFuZXMgKi8KLSAgICBCb29sIHNhdmVfdW5kZXI7CQkvKiBzaG91bGQgYml0cyB1bmRlciBiZSBzYXZlZD8gKHBvcHVwcykgKi8KLSAgICBsb25nIGV2ZW50X21hc2s7CQkvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHNhdmVkICovCi0gICAgbG9uZyBkb19ub3RfcHJvcGFnYXRlX21hc2s7CS8qIHNldCBvZiBldmVudHMgdGhhdCBzaG91bGQgbm90IHByb3BhZ2F0ZSAqLwotICAgIEJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGJvb2xlYW4gdmFsdWUgZm9yIG92ZXJyaWRlLXJlZGlyZWN0ICovCi0gICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLwotICAgIEN1cnNvciBjdXJzb3I7CQkvKiBjdXJzb3IgdG8gYmUgZGlzcGxheWVkIChvciBOb25lKSAqLwotfSBYU2V0V2luZG93QXR0cmlidXRlczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCB4LCB5OwkJCS8qIGxvY2F0aW9uIG9mIHdpbmRvdyAqLwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwkJLyogd2lkdGggYW5kIGhlaWdodCBvZiB3aW5kb3cgKi8KLSAgICBpbnQgYm9yZGVyX3dpZHRoOwkJLyogYm9yZGVyIHdpZHRoIG9mIHdpbmRvdyAqLwotICAgIGludCBkZXB0aDsgICAgICAgICAgCS8qIGRlcHRoIG9mIHdpbmRvdyAqLwotICAgIFZpc3VhbCAqdmlzdWFsOwkJLyogdGhlIGFzc29jaWF0ZWQgdmlzdWFsIHN0cnVjdHVyZSAqLwotICAgIFdpbmRvdyByb290OyAgICAgICAgCS8qIHJvb3Qgb2Ygc2NyZWVuIGNvbnRhaW5pbmcgd2luZG93ICovCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotICAgIGludCBjX2NsYXNzOwkJLyogQysrIElucHV0T3V0cHV0LCBJbnB1dE9ubHkqLwotI2Vsc2UKLSAgICBpbnQgY2xhc3M7CQkJLyogSW5wdXRPdXRwdXQsIElucHV0T25seSovCi0jZW5kaWYKLSAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCi0gICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KLSAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCi0gICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2VydmVkIGlmIHBvc3NpYmxlICovCi0gICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BpeGVsOy8qIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgcGxhbmVzICovCi0gICAgQm9vbCBzYXZlX3VuZGVyOwkJLyogYm9vbGVhbiwgc2hvdWxkIGJpdHMgdW5kZXIgYmUgc2F2ZWQ/ICovCi0gICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLwotICAgIEJvb2wgbWFwX2luc3RhbGxlZDsJCS8qIGJvb2xlYW4sIGlzIGNvbG9yIG1hcCBjdXJyZW50bHkgaW5zdGFsbGVkKi8KLSAgICBpbnQgbWFwX3N0YXRlOwkJLyogSXNVbm1hcHBlZCwgSXNVbnZpZXdhYmxlLCBJc1ZpZXdhYmxlICovCi0gICAgbG9uZyBhbGxfZXZlbnRfbWFza3M7CS8qIHNldCBvZiBldmVudHMgYWxsIHBlb3BsZSBoYXZlIGludGVyZXN0IGluKi8KLSAgICBsb25nIHlvdXJfZXZlbnRfbWFzazsJLyogbXkgZXZlbnQgbWFzayAqLwotICAgIGxvbmcgZG9fbm90X3Byb3BhZ2F0ZV9tYXNrOyAvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KLSAgICBCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBib29sZWFuIHZhbHVlIGZvciBvdmVycmlkZS1yZWRpcmVjdCAqLwotICAgIFNjcmVlbiAqc2NyZWVuOwkJLyogYmFjayBwb2ludGVyIHRvIGNvcnJlY3Qgc2NyZWVuICovCi19IFhXaW5kb3dBdHRyaWJ1dGVzOwotCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGhvc3Qgc2V0dGluZzsgZ2V0dGluZyByb3V0aW5lcy4KLSAqCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBmYW1pbHk7CQkvKiBmb3IgZXhhbXBsZSBGYW1pbHlJbnRlcm5ldCAqLwotCWludCBsZW5ndGg7CQkvKiBsZW5ndGggb2YgYWRkcmVzcywgaW4gYnl0ZXMgKi8KLQljaGFyICphZGRyZXNzOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSBieXRlcyAqLwotfSBYSG9zdEFkZHJlc3M7Ci0KLS8qCi0gKiBEYXRhIHN0cnVjdHVyZSBmb3IgImltYWdlIiBkYXRhLCB1c2VkIGJ5IGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgX1hJbWFnZSB7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvKiBzaXplIG9mIGltYWdlICovCi0gICAgaW50IHhvZmZzZXQ7CQkvKiBudW1iZXIgb2YgcGl4ZWxzIG9mZnNldCBpbiBYIGRpcmVjdGlvbiAqLwotICAgIGludCBmb3JtYXQ7CQkJLyogWFlCaXRtYXAsIFhZUGl4bWFwLCBaUGl4bWFwICovCi0gICAgY2hhciAqZGF0YTsJCQkvKiBwb2ludGVyIHRvIGltYWdlIGRhdGEgKi8KLSAgICBpbnQgYnl0ZV9vcmRlcjsJCS8qIGRhdGEgYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCi0gICAgaW50IGJpdG1hcF91bml0OwkJLyogcXVhbnQuIG9mIHNjYW5saW5lIDgsIDE2LCAzMiAqLwotICAgIGludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KLSAgICBpbnQgYml0bWFwX3BhZDsJCS8qIDgsIDE2LCAzMiBlaXRoZXIgWFkgb3IgWlBpeG1hcCAqLwotICAgIGludCBkZXB0aDsJCQkvKiBkZXB0aCBvZiBpbWFnZSAqLwotICAgIGludCBieXRlc19wZXJfbGluZTsJCS8qIGFjY2VsYXJhdG9yIHRvIG5leHQgbGluZSAqLwotICAgIGludCBiaXRzX3Blcl9waXhlbDsJCS8qIGJpdHMgcGVyIHBpeGVsIChaUGl4bWFwKSAqLwotICAgIHVuc2lnbmVkIGxvbmcgcmVkX21hc2s7CS8qIGJpdHMgaW4geiBhcnJhbmdtZW50ICovCi0gICAgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgYmx1ZV9tYXNrOwotICAgIFhQb2ludGVyIG9iZGF0YTsJCS8qIGhvb2sgZm9yIHRoZSBvYmplY3Qgcm91dGluZXMgdG8gaGFuZyBvbiAqLwotICAgIHN0cnVjdCBmdW5jcyB7CQkvKiBpbWFnZSBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0Jc3RydWN0IF9YSW1hZ2UgKigqY3JlYXRlX2ltYWdlKSgKLQkJc3RydWN0IF9YRGlzcGxheSogLyogZGlzcGxheSAqLywKLQkJVmlzdWFsKgkJLyogdmlzdWFsICovLAotCQl1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8sCi0JCWludAkJLyogZm9ybWF0ICovLAotCQlpbnQJCS8qIG9mZnNldCAqLywKLQkJY2hhcioJCS8qIGRhdGEgKi8sCi0JCXVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLQkJdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLQkJaW50CQkvKiBiaXRtYXBfcGFkICovLAotCQlpbnQJCS8qIGJ5dGVzX3Blcl9saW5lICovKTsKLQlpbnQgKCpkZXN0cm95X2ltYWdlKSAgICAgICAgKHN0cnVjdCBfWEltYWdlICopOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfcGl4ZWwpICAoc3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQpOwotCWludCAoKnB1dF9waXhlbCkgICAgICAgICAgICAoc3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotCXN0cnVjdCBfWEltYWdlICooKnN1Yl9pbWFnZSkoc3RydWN0IF9YSW1hZ2UgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLQlpbnQgKCphZGRfcGl4ZWwpICAgICAgICAgICAgKHN0cnVjdCBfWEltYWdlICosIGxvbmcpOwotI2Vsc2UKLQlzdHJ1Y3QgX1hJbWFnZSAqKCpjcmVhdGVfaW1hZ2UpKCk7Ci0JaW50ICgqZGVzdHJveV9pbWFnZSkoKTsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X3BpeGVsKSgpOwotCWludCAoKnB1dF9waXhlbCkoKTsKLQlzdHJ1Y3QgX1hJbWFnZSAqKCpzdWJfaW1hZ2UpKCk7Ci0JaW50ICgqYWRkX3BpeGVsKSgpOwotI2VuZGlmCi0JfSBmOwotfSBYSW1hZ2U7Ci0KLS8qIAotICogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhSZWNvbmZpZ3VyZVdpbmRvdwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgaW50IGJvcmRlcl93aWR0aDsKLSAgICBXaW5kb3cgc2libGluZzsKLSAgICBpbnQgc3RhY2tfbW9kZTsKLX0gWFdpbmRvd0NoYW5nZXM7Ci0KLS8qCi0gKiBEYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IGNvbG9yIG9wZXJhdGlvbnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgcGl4ZWw7Ci0JdW5zaWduZWQgc2hvcnQgcmVkLCBncmVlbiwgYmx1ZTsKLQljaGFyIGZsYWdzOyAgLyogZG9fcmVkLCBkb19ncmVlbiwgZG9fYmx1ZSAqLwotCWNoYXIgcGFkOwotfSBYQ29sb3I7Ci0KLS8qIAotICogRGF0YSBzdHJ1Y3R1cmVzIGZvciBncmFwaGljcyBvcGVyYXRpb25zLiAgT24gbW9zdCBtYWNoaW5lcywgdGhlc2UgYXJlCi0gKiBjb25ncnVlbnQgd2l0aCB0aGUgd2lyZSBwcm90b2NvbCBzdHJ1Y3R1cmVzLCBzbyByZWZvcm1hdHRpbmcgdGhlIGRhdGEKLSAqIGNhbiBiZSBhdm9pZGVkIG9uIHRoZXNlIGFyY2hpdGVjdHVyZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzaG9ydCB4MSwgeTEsIHgyLCB5MjsKLX0gWFNlZ21lbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzaG9ydCB4LCB5OwotfSBYUG9pbnQ7Ci0gICAgCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc2hvcnQgeCwgeTsKLSAgICB1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OwotfSBYUmVjdGFuZ2xlOwotICAgIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNob3J0IHgsIHk7Ci0gICAgdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKLSAgICBzaG9ydCBhbmdsZTEsIGFuZ2xlMjsKLX0gWEFyYzsKLQotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3IgWENoYW5nZUtleWJvYXJkQ29udHJvbCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGludCBrZXlfY2xpY2tfcGVyY2VudDsKLSAgICAgICAgaW50IGJlbGxfcGVyY2VudDsKLSAgICAgICAgaW50IGJlbGxfcGl0Y2g7Ci0gICAgICAgIGludCBiZWxsX2R1cmF0aW9uOwotICAgICAgICBpbnQgbGVkOwotICAgICAgICBpbnQgbGVkX21vZGU7Ci0gICAgICAgIGludCBrZXk7Ci0gICAgICAgIGludCBhdXRvX3JlcGVhdF9tb2RlOyAgIC8qIE9uLCBPZmYsIERlZmF1bHQgKi8KLX0gWEtleWJvYXJkQ29udHJvbDsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhHZXRLZXlib2FyZENvbnRyb2wgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBpbnQga2V5X2NsaWNrX3BlcmNlbnQ7Ci0JaW50IGJlbGxfcGVyY2VudDsKLQl1bnNpZ25lZCBpbnQgYmVsbF9waXRjaCwgYmVsbF9kdXJhdGlvbjsKLQl1bnNpZ25lZCBsb25nIGxlZF9tYXNrOwotCWludCBnbG9iYWxfYXV0b19yZXBlYXQ7Ci0JY2hhciBhdXRvX3JlcGVhdHNbMzJdOwotfSBYS2V5Ym9hcmRTdGF0ZTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhHZXRNb3Rpb25FdmVudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIFRpbWUgdGltZTsKLQlzaG9ydCB4LCB5OwotfSBYVGltZUNvb3JkOwotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3IgWHtTZXQsR2V0fU1vZGlmaWVyTWFwcGluZyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gCWludCBtYXhfa2V5cGVybW9kOwkvKiBUaGUgc2VydmVyJ3MgbWF4ICMgb2Yga2V5cyBwZXIgbW9kaWZpZXIgKi8KLSAJS2V5Q29kZSAqbW9kaWZpZXJtYXA7CS8qIEFuIDggYnkgbWF4X2tleXBlcm1vZCBhcnJheSBvZiBtb2RpZmllcnMgKi8KLX0gWE1vZGlmaWVyS2V5bWFwOwotCi0KLS8qCi0gKiBEaXNwbGF5IGRhdGF0eXBlIG1haW50YWluaW5nIGRpc3BsYXkgc3BlY2lmaWMgZGF0YS4KLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgotICogQSBEaXNwbGF5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZSBieSBhcHBsaWNhdGlvbiBjb2RlLgotICovCi0jaWZuZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKLXR5cGVkZWYgc3RydWN0IF9YRGlzcGxheSBEaXNwbGF5OwotI2VuZGlmCi0KLXN0cnVjdCBfWFByaXZhdGU7CQkvKiBGb3J3YXJkIGRlY2xhcmUgYmVmb3JlIHVzZSBmb3IgQysrICovCi1zdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWM7Ci0KLXR5cGVkZWYgc3RydWN0IAotI2lmZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKLV9YRGlzcGxheQotI2VuZGlmCi17Ci0JWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCi0Jc3RydWN0IF9YUHJpdmF0ZSAqcHJpdmF0ZTE7Ci0JaW50IGZkOwkJCS8qIE5ldHdvcmsgc29ja2V0LiAqLwotCWludCBwcml2YXRlMjsKLQlpbnQgcHJvdG9fbWFqb3JfdmVyc2lvbjsvKiBtYWpvciB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KLQlpbnQgcHJvdG9fbWlub3JfdmVyc2lvbjsvKiBtaW5vciB2ZXJzaW9uIG9mIHNlcnZlcnMgWCBwcm90b2NvbCAqLwotCWNoYXIgKnZlbmRvcjsJCS8qIHZlbmRvciBvZiB0aGUgc2VydmVyIGhhcmR3YXJlICovCi0gICAgICAgIFhJRCBwcml2YXRlMzsKLQlYSUQgcHJpdmF0ZTQ7Ci0JWElEIHByaXZhdGU1OwotCWludCBwcml2YXRlNjsKLQlYSUQgKCpyZXNvdXJjZV9hbGxvYykoCS8qIGFsbG9jYXRvciBmdW5jdGlvbiAqLwotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLQkJc3RydWN0IF9YRGlzcGxheSoKLSNlbmRpZgotCSk7Ci0JaW50IGJ5dGVfb3JkZXI7CQkvKiBzY3JlZW4gYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCi0JaW50IGJpdG1hcF91bml0OwkvKiBwYWRkaW5nIGFuZCBkYXRhIHJlcXVpcmVtZW50cyAqLwotCWludCBiaXRtYXBfcGFkOwkJLyogcGFkZGluZyByZXF1aXJlbWVudHMgb24gYml0bWFwcyAqLwotCWludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMZWFzdFNpZ25pZmljYW50IG9yIE1vc3RTaWduaWZpY2FudCAqLwotCWludCBuZm9ybWF0czsJCS8qIG51bWJlciBvZiBwaXhtYXAgZm9ybWF0cyBpbiBsaXN0ICovCi0JU2NyZWVuRm9ybWF0ICpwaXhtYXBfZm9ybWF0OwkvKiBwaXhtYXAgZm9ybWF0IGxpc3QgKi8KLQlpbnQgcHJpdmF0ZTg7Ci0JaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG9mIHRoZSBzZXJ2ZXIgKi8KLQlzdHJ1Y3QgX1hQcml2YXRlICpwcml2YXRlOSwgKnByaXZhdGUxMDsKLQlpbnQgcWxlbjsJCS8qIExlbmd0aCBvZiBpbnB1dCBldmVudCBxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXF1ZXN0X3JlYWQ7IC8qIHNlcSBudW1iZXIgb2YgbGFzdCBldmVudCByZWFkICovCi0JdW5zaWduZWQgbG9uZyByZXF1ZXN0OwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCByZXF1ZXN0LiAqLwotCVhQb2ludGVyIHByaXZhdGUxMTsKLQlYUG9pbnRlciBwcml2YXRlMTI7Ci0JWFBvaW50ZXIgcHJpdmF0ZTEzOwotCVhQb2ludGVyIHByaXZhdGUxNDsKLQl1bnNpZ25lZCBtYXhfcmVxdWVzdF9zaXplOyAvKiBtYXhpbXVtIG51bWJlciAzMiBiaXQgd29yZHMgaW4gcmVxdWVzdCovCi0Jc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjICpkYjsKLQlpbnQgKCpwcml2YXRlMTUpKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLQkJc3RydWN0IF9YRGlzcGxheSoKLSNlbmRpZgotCQkpOwotCWNoYXIgKmRpc3BsYXlfbmFtZTsJLyogImhvc3Q6ZGlzcGxheSIgc3RyaW5nIHVzZWQgb24gdGhpcyBjb25uZWN0Ki8KLQlpbnQgZGVmYXVsdF9zY3JlZW47CS8qIGRlZmF1bHQgc2NyZWVuIGZvciBvcGVyYXRpb25zICovCi0JaW50IG5zY3JlZW5zOwkJLyogbnVtYmVyIG9mIHNjcmVlbnMgb24gdGhpcyBzZXJ2ZXIqLwotCVNjcmVlbiAqc2NyZWVuczsJLyogcG9pbnRlciB0byBsaXN0IG9mIHNjcmVlbnMgKi8KLQl1bnNpZ25lZCBsb25nIG1vdGlvbl9idWZmZXI7CS8qIHNpemUgb2YgbW90aW9uIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZTE2OwotCWludCBtaW5fa2V5Y29kZTsJLyogbWluaW11bSBkZWZpbmVkIGtleWNvZGUgKi8KLQlpbnQgbWF4X2tleWNvZGU7CS8qIG1heGltdW0gZGVmaW5lZCBrZXljb2RlICovCi0JWFBvaW50ZXIgcHJpdmF0ZTE3OwotCVhQb2ludGVyIHByaXZhdGUxODsKLQlpbnQgcHJpdmF0ZTE5OwotCWNoYXIgKnhkZWZhdWx0czsJLyogY29udGVudHMgb2YgZGVmYXVsdHMgZnJvbSBzZXJ2ZXIgKi8KLQkvKiB0aGVyZSBpcyBtb3JlIHRvIHRoaXMgc3RydWN0dXJlLCBidXQgaXQgaXMgcHJpdmF0ZSB0byBYbGliICovCi19Ci0jaWZkZWYgWExJQl9JTExFR0FMX0FDQ0VTUwotRGlzcGxheSwgCi0jZW5kaWYKLSpfWFByaXZEaXNwbGF5OwotCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwkvKiBwcm90b3R5cGVzIHJlcXVpcmUgZXZlbnQgdHlwZSBkZWZpbml0aW9ucyAqLwotI3VuZGVmIF9YRVZFTlRfCi0jZW5kaWYKLSNpZm5kZWYgX1hFVkVOVF8KLS8qCi0gKiBEZWZpbml0aW9ucyBvZiBzcGVjaWZpYyBldmVudHMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCi0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IGl0IGlzIHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCi0JV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KLQlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KLQlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KLQlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KLQlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KLQl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLwotCXVuc2lnbmVkIGludCBrZXljb2RlOwkvKiBkZXRhaWwgKi8KLQlCb29sIHNhbWVfc2NyZWVuOwkvKiBzYW1lIHNjcmVlbiBmbGFnICovCi19IFhLZXlFdmVudDsKLXR5cGVkZWYgWEtleUV2ZW50IFhLZXlQcmVzc2VkRXZlbnQ7Ci10eXBlZGVmIFhLZXlFdmVudCBYS2V5UmVsZWFzZWRFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwkJLyogb2YgZXZlbnQgKi8KLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7CSAgICAgICAgLyogImV2ZW50IiB3aW5kb3cgaXQgaXMgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KLQlXaW5kb3cgcm9vdDsJICAgICAgICAvKiByb290IHdpbmRvdyB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLwotCVdpbmRvdyBzdWJ3aW5kb3c7CS8qIGNoaWxkIHdpbmRvdyAqLwotCVRpbWUgdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLwotCWludCB4LCB5OwkJLyogcG9pbnRlciB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLwotCWludCB4X3Jvb3QsIHlfcm9vdDsJLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLwotCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCi0JdW5zaWduZWQgaW50IGJ1dHRvbjsJLyogZGV0YWlsICovCi0JQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLwotfSBYQnV0dG9uRXZlbnQ7Ci10eXBlZGVmIFhCdXR0b25FdmVudCBYQnV0dG9uUHJlc3NlZEV2ZW50OwotdHlwZWRlZiBYQnV0dG9uRXZlbnQgWEJ1dHRvblJlbGVhc2VkRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCi0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCi0JV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KLQlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KLQlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KLQlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KLQlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KLQl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLwotCWNoYXIgaXNfaGludDsJCS8qIGRldGFpbCAqLwotCUJvb2wgc2FtZV9zY3JlZW47CS8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KLX0gWE1vdGlvbkV2ZW50OwotdHlwZWRlZiBYTW90aW9uRXZlbnQgWFBvaW50ZXJNb3ZlZEV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7CQkvKiBvZiBldmVudCAqLwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHdpbmRvdzsJICAgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLwotCVdpbmRvdyByb290OwkgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIG9uICovCi0JV2luZG93IHN1YndpbmRvdzsJLyogY2hpbGQgd2luZG93ICovCi0JVGltZSB0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCi0JaW50IHgsIHk7CQkvKiBwb2ludGVyIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCi0JaW50IHhfcm9vdCwgeV9yb290OwkvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCi0JaW50IG1vZGU7CQkvKiBOb3RpZnlOb3JtYWwsIE5vdGlmeUdyYWIsIE5vdGlmeVVuZ3JhYiAqLwotCWludCBkZXRhaWw7Ci0JLyoKLQkgKiBOb3RpZnlBbmNlc3RvciwgTm90aWZ5VmlydHVhbCwgTm90aWZ5SW5mZXJpb3IsIAotCSAqIE5vdGlmeU5vbmxpbmVhcixOb3RpZnlOb25saW5lYXJWaXJ0dWFsCi0JICovCi0JQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLwotCUJvb2wgZm9jdXM7CQkvKiBib29sZWFuIGZvY3VzICovCi0JdW5zaWduZWQgaW50IHN0YXRlOwkvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KLX0gWENyb3NzaW5nRXZlbnQ7Ci10eXBlZGVmIFhDcm9zc2luZ0V2ZW50IFhFbnRlcldpbmRvd0V2ZW50OwotdHlwZWRlZiBYQ3Jvc3NpbmdFdmVudCBYTGVhdmVXaW5kb3dFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwkJLyogRm9jdXNJbiBvciBGb2N1c091dCAqLwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHdpbmRvdzsJCS8qIHdpbmRvdyBvZiBldmVudCAqLwotCWludCBtb2RlOwkJLyogTm90aWZ5Tm9ybWFsLCBOb3RpZnlHcmFiLCBOb3RpZnlVbmdyYWIgKi8KLQlpbnQgZGV0YWlsOwotCS8qCi0JICogTm90aWZ5QW5jZXN0b3IsIE5vdGlmeVZpcnR1YWwsIE5vdGlmeUluZmVyaW9yLCAKLQkgKiBOb3RpZnlOb25saW5lYXIsTm90aWZ5Tm9ubGluZWFyVmlydHVhbCwgTm90aWZ5UG9pbnRlciwKLQkgKiBOb3RpZnlQb2ludGVyUm9vdCwgTm90aWZ5RGV0YWlsTm9uZSAKLQkgKi8KLX0gWEZvY3VzQ2hhbmdlRXZlbnQ7Ci10eXBlZGVmIFhGb2N1c0NoYW5nZUV2ZW50IFhGb2N1c0luRXZlbnQ7Ci10eXBlZGVmIFhGb2N1c0NoYW5nZUV2ZW50IFhGb2N1c091dEV2ZW50OwotCi0vKiBnZW5lcmF0ZWQgb24gRW50ZXJXaW5kb3cgYW5kIEZvY3VzSW4gIHdoZW4gS2V5TWFwU3RhdGUgc2VsZWN0ZWQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7Ci0JY2hhciBrZXlfdmVjdG9yWzMyXTsKLX0gWEtleW1hcEV2ZW50OwkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHdpbmRvdzsKLQlpbnQgeCwgeTsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlpbnQgY291bnQ7CQkvKiBpZiBub24temVybywgYXQgbGVhc3QgdGhpcyBtYW55IG1vcmUgKi8KLX0gWEV4cG9zZUV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlEcmF3YWJsZSBkcmF3YWJsZTsKLQlpbnQgeCwgeTsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlpbnQgY291bnQ7CQkvKiBpZiBub24temVybywgYXQgbGVhc3QgdGhpcyBtYW55IG1vcmUgKi8KLQlpbnQgbWFqb3JfY29kZTsJCS8qIGNvcmUgaXMgQ29weUFyZWEgb3IgQ29weVBsYW5lICovCi0JaW50IG1pbm9yX2NvZGU7CQkvKiBub3QgZGVmaW5lZCBpbiB0aGUgY29yZSAqLwotfSBYR3JhcGhpY3NFeHBvc2VFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JRHJhd2FibGUgZHJhd2FibGU7Ci0JaW50IG1ham9yX2NvZGU7CQkvKiBjb3JlIGlzIENvcHlBcmVhIG9yIENvcHlQbGFuZSAqLwotCWludCBtaW5vcl9jb2RlOwkJLyogbm90IGRlZmluZWQgaW4gdGhlIGNvcmUgKi8KLX0gWE5vRXhwb3NlRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7Ci0JaW50IHN0YXRlOwkJLyogVmlzaWJpbGl0eSBzdGF0ZSAqLwotfSBYVmlzaWJpbGl0eUV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgcGFyZW50OwkJLyogcGFyZW50IG9mIHRoZSB3aW5kb3cgKi8KLQlXaW5kb3cgd2luZG93OwkJLyogd2luZG93IGlkIG9mIHdpbmRvdyBjcmVhdGVkICovCi0JaW50IHgsIHk7CQkvKiB3aW5kb3cgbG9jYXRpb24gKi8KLQlpbnQgd2lkdGgsIGhlaWdodDsJLyogc2l6ZSBvZiB3aW5kb3cgKi8KLQlpbnQgYm9yZGVyX3dpZHRoOwkvKiBib3JkZXIgd2lkdGggKi8KLQlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBjcmVhdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiAqLwotfSBYQ3JlYXRlV2luZG93RXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyBldmVudDsKLQlXaW5kb3cgd2luZG93OwotfSBYRGVzdHJveVdpbmRvd0V2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgZXZlbnQ7Ci0JV2luZG93IHdpbmRvdzsKLQlCb29sIGZyb21fY29uZmlndXJlOwotfSBYVW5tYXBFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IGV2ZW50OwotCVdpbmRvdyB3aW5kb3c7Ci0JQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsJLyogYm9vbGVhbiwgaXMgb3ZlcnJpZGUgc2V0Li4uICovCi19IFhNYXBFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHBhcmVudDsKLQlXaW5kb3cgd2luZG93OwotfSBYTWFwUmVxdWVzdEV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgZXZlbnQ7Ci0JV2luZG93IHdpbmRvdzsKLQlXaW5kb3cgcGFyZW50OwotCWludCB4LCB5OwotCUJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7Ci19IFhSZXBhcmVudEV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgZXZlbnQ7Ci0JV2luZG93IHdpbmRvdzsKLQlpbnQgeCwgeTsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlpbnQgYm9yZGVyX3dpZHRoOwotCVdpbmRvdyBhYm92ZTsKLQlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwotfSBYQ29uZmlndXJlRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyBldmVudDsKLQlXaW5kb3cgd2luZG93OwotCWludCB4LCB5OwotfSBYR3Jhdml0eUV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgd2luZG93OwotCWludCB3aWR0aCwgaGVpZ2h0OwotfSBYUmVzaXplUmVxdWVzdEV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgcGFyZW50OwotCVdpbmRvdyB3aW5kb3c7Ci0JaW50IHgsIHk7Ci0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JaW50IGJvcmRlcl93aWR0aDsKLQlXaW5kb3cgYWJvdmU7Ci0JaW50IGRldGFpbDsJCS8qIEFib3ZlLCBCZWxvdywgVG9wSWYsIEJvdHRvbUlmLCBPcHBvc2l0ZSAqLwotCXVuc2lnbmVkIGxvbmcgdmFsdWVfbWFzazsKLX0gWENvbmZpZ3VyZVJlcXVlc3RFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IGV2ZW50OwotCVdpbmRvdyB3aW5kb3c7Ci0JaW50IHBsYWNlOwkJLyogUGxhY2VPblRvcCwgUGxhY2VPbkJvdHRvbSAqLwotfSBYQ2lyY3VsYXRlRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyBwYXJlbnQ7Ci0JV2luZG93IHdpbmRvdzsKLQlpbnQgcGxhY2U7CQkvKiBQbGFjZU9uVG9wLCBQbGFjZU9uQm90dG9tICovCi19IFhDaXJjdWxhdGVSZXF1ZXN0RXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7Ci0JQXRvbSBhdG9tOwotCVRpbWUgdGltZTsKLQlpbnQgc3RhdGU7CQkvKiBOZXdWYWx1ZSwgRGVsZXRlZCAqLwotfSBYUHJvcGVydHlFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHdpbmRvdzsKLQlBdG9tIHNlbGVjdGlvbjsKLQlUaW1lIHRpbWU7Ci19IFhTZWxlY3Rpb25DbGVhckV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgb3duZXI7Ci0JV2luZG93IHJlcXVlc3RvcjsKLQlBdG9tIHNlbGVjdGlvbjsKLQlBdG9tIHRhcmdldDsKLQlBdG9tIHByb3BlcnR5OwotCVRpbWUgdGltZTsKLX0gWFNlbGVjdGlvblJlcXVlc3RFdmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCB0eXBlOwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCi0JQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHJlcXVlc3RvcjsKLQlBdG9tIHNlbGVjdGlvbjsKLQlBdG9tIHRhcmdldDsKLQlBdG9tIHByb3BlcnR5OwkJLyogQVRPTSBvciBOb25lICovCi0JVGltZSB0aW1lOwotfSBYU2VsZWN0aW9uRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7Ci0JQ29sb3JtYXAgY29sb3JtYXA7CS8qIENPTE9STUFQIG9yIE5vbmUgKi8KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi0JQm9vbCBjX25ldzsJCS8qIEMrKyAqLwotI2Vsc2UKLQlCb29sIG5ldzsKLSNlbmRpZgotCWludCBzdGF0ZTsJCS8qIENvbG9ybWFwSW5zdGFsbGVkLCBDb2xvcm1hcFVuaW5zdGFsbGVkICovCi19IFhDb2xvcm1hcEV2ZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KLQlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwotCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KLQlXaW5kb3cgd2luZG93OwotCUF0b20gbWVzc2FnZV90eXBlOwotCWludCBmb3JtYXQ7Ci0JdW5pb24gewotCQljaGFyIGJbMjBdOwotCQlzaG9ydCBzWzEwXTsKLQkJbG9uZyBsWzVdOwotCQl9IGRhdGE7Ci19IFhDbGllbnRNZXNzYWdlRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwotCVdpbmRvdyB3aW5kb3c7CQkvKiB1bnVzZWQgKi8KLQlpbnQgcmVxdWVzdDsJCS8qIG9uZSBvZiBNYXBwaW5nTW9kaWZpZXIsIE1hcHBpbmdLZXlib2FyZCwKLQkJCQkgICBNYXBwaW5nUG9pbnRlciAqLwotCWludCBmaXJzdF9rZXljb2RlOwkvKiBmaXJzdCBrZXljb2RlICovCi0JaW50IGNvdW50OwkJLyogZGVmaW5lcyByYW5nZSBvZiBjaGFuZ2Ugdy4gZmlyc3Rfa2V5Y29kZSovCi19IFhNYXBwaW5nRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JWElEIHJlc291cmNlaWQ7CQkvKiByZXNvdXJjZSBpZCAqLwotCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCi0JdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOwkvKiBlcnJvciBjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCi0JdW5zaWduZWQgY2hhciByZXF1ZXN0X2NvZGU7CS8qIE1ham9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KLQl1bnNpZ25lZCBjaGFyIG1pbm9yX2NvZGU7CS8qIE1pbm9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KLX0gWEVycm9yRXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLwotCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCi0JRGlzcGxheSAqZGlzcGxheTsvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCi0JV2luZG93IHdpbmRvdzsJLyogd2luZG93IG9uIHdoaWNoIGV2ZW50IHdhcyByZXF1ZXN0ZWQgaW4gZXZlbnQgbWFzayAqLwotfSBYQW55RXZlbnQ7Ci0KLS8qCi0gKiB0aGlzIHVuaW9uIGlzIGRlZmluZWQgc28gWGxpYiBjYW4gYWx3YXlzIHVzZSB0aGUgc2FtZSBzaXplZAotICogZXZlbnQgc3RydWN0dXJlIGludGVybmFsbHksIHRvIGF2b2lkIG1lbW9yeSBmcmFnbWVudGF0aW9uLgotICovCi10eXBlZGVmIHVuaW9uIF9YRXZlbnQgewotICAgICAgICBpbnQgdHlwZTsJCS8qIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGZpcnN0IGVsZW1lbnQgKi8KLQlYQW55RXZlbnQgeGFueTsKLQlYS2V5RXZlbnQgeGtleTsKLQlYQnV0dG9uRXZlbnQgeGJ1dHRvbjsKLQlYTW90aW9uRXZlbnQgeG1vdGlvbjsKLQlYQ3Jvc3NpbmdFdmVudCB4Y3Jvc3Npbmc7Ci0JWEZvY3VzQ2hhbmdlRXZlbnQgeGZvY3VzOwotCVhFeHBvc2VFdmVudCB4ZXhwb3NlOwotCVhHcmFwaGljc0V4cG9zZUV2ZW50IHhncmFwaGljc2V4cG9zZTsKLQlYTm9FeHBvc2VFdmVudCB4bm9leHBvc2U7Ci0JWFZpc2liaWxpdHlFdmVudCB4dmlzaWJpbGl0eTsKLQlYQ3JlYXRlV2luZG93RXZlbnQgeGNyZWF0ZXdpbmRvdzsKLQlYRGVzdHJveVdpbmRvd0V2ZW50IHhkZXN0cm95d2luZG93OwotCVhVbm1hcEV2ZW50IHh1bm1hcDsKLQlYTWFwRXZlbnQgeG1hcDsKLQlYTWFwUmVxdWVzdEV2ZW50IHhtYXByZXF1ZXN0OwotCVhSZXBhcmVudEV2ZW50IHhyZXBhcmVudDsKLQlYQ29uZmlndXJlRXZlbnQgeGNvbmZpZ3VyZTsKLQlYR3Jhdml0eUV2ZW50IHhncmF2aXR5OwotCVhSZXNpemVSZXF1ZXN0RXZlbnQgeHJlc2l6ZXJlcXVlc3Q7Ci0JWENvbmZpZ3VyZVJlcXVlc3RFdmVudCB4Y29uZmlndXJlcmVxdWVzdDsKLQlYQ2lyY3VsYXRlRXZlbnQgeGNpcmN1bGF0ZTsKLQlYQ2lyY3VsYXRlUmVxdWVzdEV2ZW50IHhjaXJjdWxhdGVyZXF1ZXN0OwotCVhQcm9wZXJ0eUV2ZW50IHhwcm9wZXJ0eTsKLQlYU2VsZWN0aW9uQ2xlYXJFdmVudCB4c2VsZWN0aW9uY2xlYXI7Ci0JWFNlbGVjdGlvblJlcXVlc3RFdmVudCB4c2VsZWN0aW9ucmVxdWVzdDsKLQlYU2VsZWN0aW9uRXZlbnQgeHNlbGVjdGlvbjsKLQlYQ29sb3JtYXBFdmVudCB4Y29sb3JtYXA7Ci0JWENsaWVudE1lc3NhZ2VFdmVudCB4Y2xpZW50OwotCVhNYXBwaW5nRXZlbnQgeG1hcHBpbmc7Ci0JWEVycm9yRXZlbnQgeGVycm9yOwotCVhLZXltYXBFdmVudCB4a2V5bWFwOwotCWxvbmcgcGFkWzI0XTsKLX0gWEV2ZW50OwotI2VuZGlmCi0KLSNkZWZpbmUgWEFsbG9jSUQoZHB5KSAoKCooKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVzb3VyY2VfYWxsb2MpKChkcHkpKSkKLQotLyoKLSAqIHBlciBjaGFyYWN0ZXIgZm9udCBtZXRyaWMgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzaG9ydAlsYmVhcmluZzsJLyogb3JpZ2luIHRvIGxlZnQgZWRnZSBvZiByYXN0ZXIgKi8KLSAgICBzaG9ydAlyYmVhcmluZzsJLyogb3JpZ2luIHRvIHJpZ2h0IGVkZ2Ugb2YgcmFzdGVyICovCi0gICAgc2hvcnQJd2lkdGg7CQkvKiBhZHZhbmNlIHRvIG5leHQgY2hhcidzIG9yaWdpbiAqLwotICAgIHNob3J0CWFzY2VudDsJCS8qIGJhc2VsaW5lIHRvIHRvcCBlZGdlIG9mIHJhc3RlciAqLwotICAgIHNob3J0CWRlc2NlbnQ7CS8qIGJhc2VsaW5lIHRvIGJvdHRvbSBlZGdlIG9mIHJhc3RlciAqLwotICAgIHVuc2lnbmVkIHNob3J0IGF0dHJpYnV0ZXM7CS8qIHBlciBjaGFyIGZsYWdzIChub3QgcHJlZGVmaW5lZCkgKi8KLX0gWENoYXJTdHJ1Y3Q7Ci0KLS8qCi0gKiBUbyBhbGxvdyBhcmJpdHJhcnkgaW5mb3JtYXRpb24gd2l0aCBmb250cywgdGhlcmUgYXJlIGFkZGl0aW9uYWwgcHJvcGVydGllcwotICogcmV0dXJuZWQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBBdG9tIG5hbWU7Ci0gICAgdW5zaWduZWQgbG9uZyBjYXJkMzI7Ci19IFhGb250UHJvcDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFhFeHREYXRhCSpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLwotICAgIEZvbnQgICAgICAgIGZpZDsgICAgICAgICAgICAvKiBGb250IGlkIGZvciB0aGlzIGZvbnQgKi8KLSAgICB1bnNpZ25lZAlkaXJlY3Rpb247CS8qIGhpbnQgYWJvdXQgZGlyZWN0aW9uIHRoZSBmb250IGlzIHBhaW50ZWQgKi8KLSAgICB1bnNpZ25lZAltaW5fY2hhcl9vcl9ieXRlMjsvKiBmaXJzdCBjaGFyYWN0ZXIgKi8KLSAgICB1bnNpZ25lZAltYXhfY2hhcl9vcl9ieXRlMjsvKiBsYXN0IGNoYXJhY3RlciAqLwotICAgIHVuc2lnbmVkCW1pbl9ieXRlMTsJLyogZmlyc3Qgcm93IHRoYXQgZXhpc3RzICovCi0gICAgdW5zaWduZWQJbWF4X2J5dGUxOwkvKiBsYXN0IHJvdyB0aGF0IGV4aXN0cyAqLwotICAgIEJvb2wJYWxsX2NoYXJzX2V4aXN0Oy8qIGZsYWcgaWYgYWxsIGNoYXJhY3RlcnMgaGF2ZSBub24temVybyBzaXplKi8KLSAgICB1bnNpZ25lZAlkZWZhdWx0X2NoYXI7CS8qIGNoYXIgdG8gcHJpbnQgZm9yIHVuZGVmaW5lZCBjaGFyYWN0ZXIgKi8KLSAgICBpbnQgICAgICAgICBuX3Byb3BlcnRpZXM7ICAgLyogaG93IG1hbnkgcHJvcGVydGllcyB0aGVyZSBhcmUgKi8KLSAgICBYRm9udFByb3AJKnByb3BlcnRpZXM7CS8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzKi8KLSAgICBYQ2hhclN0cnVjdAltaW5fYm91bmRzOwkvKiBtaW5pbXVtIGJvdW5kcyBvdmVyIGFsbCBleGlzdGluZyBjaGFyKi8KLSAgICBYQ2hhclN0cnVjdAltYXhfYm91bmRzOwkvKiBtYXhpbXVtIGJvdW5kcyBvdmVyIGFsbCBleGlzdGluZyBjaGFyKi8KLSAgICBYQ2hhclN0cnVjdAkqcGVyX2NoYXI7CS8qIGZpcnN0X2NoYXIgdG8gbGFzdF9jaGFyIGluZm9ybWF0aW9uICovCi0gICAgaW50CQlhc2NlbnQ7CQkvKiBsb2cuIGV4dGVudCBhYm92ZSBiYXNlbGluZSBmb3Igc3BhY2luZyAqLwotICAgIGludAkJZGVzY2VudDsJLyogbG9nLiBkZXNjZW50IGJlbG93IGJhc2VsaW5lIGZvciBzcGFjaW5nICovCi19IFhGb250U3RydWN0OwotCi0vKgotICogUG9seVRleHQgcm91dGluZXMgdGFrZSB0aGVzZSBhcyBhcmd1bWVudHMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpjaGFyczsJCS8qIHBvaW50ZXIgdG8gc3RyaW5nICovCi0gICAgaW50IG5jaGFyczsJCQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyAqLwotICAgIGludCBkZWx0YTsJCQkvKiBkZWx0YSBiZXR3ZWVuIHN0cmluZ3MgKi8KLSAgICBGb250IGZvbnQ7CQkJLyogZm9udCB0byBwcmludCBpdCBpbiwgTm9uZSBkb24ndCBjaGFuZ2UgKi8KLX0gWFRleHRJdGVtOwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBub3JtYWwgMTYgYml0IGNoYXJhY3RlcnMgYXJlIHR3byBieXRlcyAqLwotICAgIHVuc2lnbmVkIGNoYXIgYnl0ZTE7Ci0gICAgdW5zaWduZWQgY2hhciBieXRlMjsKLX0gWENoYXIyYjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFhDaGFyMmIgKmNoYXJzOwkJLyogdHdvIGJ5dGUgY2hhcmFjdGVycyAqLwotICAgIGludCBuY2hhcnM7CQkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KLSAgICBpbnQgZGVsdGE7CQkJLyogZGVsdGEgYmV0d2VlbiBzdHJpbmdzICovCi0gICAgRm9udCBmb250OwkJCS8qIGZvbnQgdG8gcHJpbnQgaXQgaW4sIE5vbmUgZG9uJ3QgY2hhbmdlICovCi19IFhUZXh0SXRlbTE2OwotCi0KLXR5cGVkZWYgdW5pb24geyBEaXNwbGF5ICpkaXNwbGF5OwotCQlHQyBnYzsKLQkJVmlzdWFsICp2aXN1YWw7Ci0JCVNjcmVlbiAqc2NyZWVuOwotCQlTY3JlZW5Gb3JtYXQgKnBpeG1hcF9mb3JtYXQ7Ci0JCVhGb250U3RydWN0ICpmb250OyB9IFhFRGF0YU9iamVjdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFhSZWN0YW5nbGUgICAgICBtYXhfaW5rX2V4dGVudDsKLSAgICBYUmVjdGFuZ2xlICAgICAgbWF4X2xvZ2ljYWxfZXh0ZW50OwotfSBYRm9udFNldEV4dGVudHM7Ci0KLS8qIHVudXNlZDoKLXR5cGVkZWYgdm9pZCAoKlhPTVByb2MpKCk7Ci0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX1hPTSAqWE9NOwotdHlwZWRlZiBzdHJ1Y3QgX1hPQyAqWE9DLCAqWEZvbnRTZXQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICAgICAgICAgICAqY2hhcnM7Ci0gICAgaW50ICAgICAgICAgICAgIG5jaGFyczsKLSAgICBpbnQgICAgICAgICAgICAgZGVsdGE7Ci0gICAgWEZvbnRTZXQgICAgICAgIGZvbnRfc2V0OwotfSBYbWJUZXh0SXRlbTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHdjaGFyX3QgICAgICAgICpjaGFyczsKLSAgICBpbnQgICAgICAgICAgICAgbmNoYXJzOwotICAgIGludCAgICAgICAgICAgICBkZWx0YTsKLSAgICBYRm9udFNldCAgICAgICAgZm9udF9zZXQ7Ci19IFh3Y1RleHRJdGVtOwotCi0jZGVmaW5lIFhOUmVxdWlyZWRDaGFyU2V0ICJyZXF1aXJlZENoYXJTZXQiCi0jZGVmaW5lIFhOUXVlcnlPcmllbnRhdGlvbiAicXVlcnlPcmllbnRhdGlvbiIKLSNkZWZpbmUgWE5CYXNlRm9udE5hbWUgImJhc2VGb250TmFtZSIKLSNkZWZpbmUgWE5PTUF1dG9tYXRpYyAib21BdXRvbWF0aWMiCi0jZGVmaW5lIFhOTWlzc2luZ0NoYXJTZXQgIm1pc3NpbmdDaGFyU2V0IgotI2RlZmluZSBYTkRlZmF1bHRTdHJpbmcgImRlZmF1bHRTdHJpbmciCi0jZGVmaW5lIFhOT3JpZW50YXRpb24gIm9yaWVudGF0aW9uIgotI2RlZmluZSBYTkRpcmVjdGlvbmFsRGVwZW5kZW50RHJhd2luZyAiZGlyZWN0aW9uYWxEZXBlbmRlbnREcmF3aW5nIgotI2RlZmluZSBYTkNvbnRleHR1YWxEcmF3aW5nICJjb250ZXh0dWFsRHJhd2luZyIKLSNkZWZpbmUgWE5Gb250SW5mbyAiZm9udEluZm8iCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgY2hhcnNldF9jb3VudDsKLSAgICBjaGFyICoqY2hhcnNldF9saXN0OwotfSBYT01DaGFyU2V0TGlzdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBYT01PcmllbnRhdGlvbl9MVFJfVFRCLAotICAgIFhPTU9yaWVudGF0aW9uX1JUTF9UVEIsCi0gICAgWE9NT3JpZW50YXRpb25fVFRCX0xUUiwKLSAgICBYT01PcmllbnRhdGlvbl9UVEJfUlRMLAotICAgIFhPTU9yaWVudGF0aW9uX0NvbnRleHQKLX0gWE9yaWVudGF0aW9uOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG51bV9vcmllbnRhdGlvbjsKLSAgICBYT3JpZW50YXRpb24gKm9yaWVudGF0aW9uOwkvKiBJbnB1dCBUZXh0IGRlc2NyaXB0aW9uICovCi19IFhPTU9yaWVudGF0aW9uOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG51bV9mb250OwotICAgIFhGb250U3RydWN0ICoqZm9udF9zdHJ1Y3RfbGlzdDsKLSAgICBjaGFyICoqZm9udF9uYW1lX2xpc3Q7Ci19IFhPTUZvbnRJbmZvOwotCi10eXBlZGVmIHN0cnVjdCBfWElNICpYSU07Ci10eXBlZGVmIHN0cnVjdCBfWElDICpYSUM7Ci0KLXR5cGVkZWYgdm9pZCAoKlhJTVByb2MpKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSU0sCi0gICAgWFBvaW50ZXIsCi0gICAgWFBvaW50ZXIKLSNlbmRpZgotKTsKLQotdHlwZWRlZiBCb29sICgqWElDUHJvYykoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhJQywKLSAgICBYUG9pbnRlciwKLSAgICBYUG9pbnRlcgotI2VuZGlmCi0pOwotCi10eXBlZGVmIHZvaWQgKCpYSURQcm9jKSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSosCi0gICAgWFBvaW50ZXIsCi0gICAgWFBvaW50ZXIKLSNlbmRpZgotKTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJTVN0eWxlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc2hvcnQgY291bnRfc3R5bGVzOwotICAgIFhJTVN0eWxlICpzdXBwb3J0ZWRfc3R5bGVzOwotfSBYSU1TdHlsZXM7Ci0KLSNkZWZpbmUgWElNUHJlZWRpdEFyZWEJCTB4MDAwMUwKLSNkZWZpbmUgWElNUHJlZWRpdENhbGxiYWNrcwkweDAwMDJMCi0jZGVmaW5lIFhJTVByZWVkaXRQb3NpdGlvbgkweDAwMDRMCi0jZGVmaW5lIFhJTVByZWVkaXROb3RoaW5nCTB4MDAwOEwKLSNkZWZpbmUgWElNUHJlZWRpdE5vbmUJCTB4MDAxMEwKLSNkZWZpbmUgWElNU3RhdHVzQXJlYQkJMHgwMTAwTAotI2RlZmluZSBYSU1TdGF0dXNDYWxsYmFja3MJMHgwMjAwTAotI2RlZmluZSBYSU1TdGF0dXNOb3RoaW5nCTB4MDQwMEwKLSNkZWZpbmUgWElNU3RhdHVzTm9uZQkJMHgwODAwTAotCi0jZGVmaW5lIFhOVmFOZXN0ZWRMaXN0ICJYTlZhTmVzdGVkTGlzdCIKLSNkZWZpbmUgWE5RdWVyeUlucHV0U3R5bGUgInF1ZXJ5SW5wdXRTdHlsZSIKLSNkZWZpbmUgWE5DbGllbnRXaW5kb3cgImNsaWVudFdpbmRvdyIKLSNkZWZpbmUgWE5JbnB1dFN0eWxlICJpbnB1dFN0eWxlIgotI2RlZmluZSBYTkZvY3VzV2luZG93ICJmb2N1c1dpbmRvdyIKLSNkZWZpbmUgWE5SZXNvdXJjZU5hbWUgInJlc291cmNlTmFtZSIKLSNkZWZpbmUgWE5SZXNvdXJjZUNsYXNzICJyZXNvdXJjZUNsYXNzIgotI2RlZmluZSBYTkdlb21ldHJ5Q2FsbGJhY2sgImdlb21ldHJ5Q2FsbGJhY2siCi0jZGVmaW5lIFhORGVzdHJveUNhbGxiYWNrICJkZXN0cm95Q2FsbGJhY2siCi0jZGVmaW5lIFhORmlsdGVyRXZlbnRzICJmaWx0ZXJFdmVudHMiCi0jZGVmaW5lIFhOUHJlZWRpdFN0YXJ0Q2FsbGJhY2sgInByZWVkaXRTdGFydENhbGxiYWNrIgotI2RlZmluZSBYTlByZWVkaXREb25lQ2FsbGJhY2sgInByZWVkaXREb25lQ2FsbGJhY2siCi0jZGVmaW5lIFhOUHJlZWRpdERyYXdDYWxsYmFjayAicHJlZWRpdERyYXdDYWxsYmFjayIKLSNkZWZpbmUgWE5QcmVlZGl0Q2FyZXRDYWxsYmFjayAicHJlZWRpdENhcmV0Q2FsbGJhY2siCi0jZGVmaW5lIFhOUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2sgInByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrIgotI2RlZmluZSBYTlByZWVkaXRBdHRyaWJ1dGVzICJwcmVlZGl0QXR0cmlidXRlcyIKLSNkZWZpbmUgWE5TdGF0dXNTdGFydENhbGxiYWNrICJzdGF0dXNTdGFydENhbGxiYWNrIgotI2RlZmluZSBYTlN0YXR1c0RvbmVDYWxsYmFjayAic3RhdHVzRG9uZUNhbGxiYWNrIgotI2RlZmluZSBYTlN0YXR1c0RyYXdDYWxsYmFjayAic3RhdHVzRHJhd0NhbGxiYWNrIgotI2RlZmluZSBYTlN0YXR1c0F0dHJpYnV0ZXMgInN0YXR1c0F0dHJpYnV0ZXMiCi0jZGVmaW5lIFhOQXJlYSAiYXJlYSIKLSNkZWZpbmUgWE5BcmVhTmVlZGVkICJhcmVhTmVlZGVkIgotI2RlZmluZSBYTlNwb3RMb2NhdGlvbiAic3BvdExvY2F0aW9uIgotI2RlZmluZSBYTkNvbG9ybWFwICJjb2xvck1hcCIKLSNkZWZpbmUgWE5TdGRDb2xvcm1hcCAic3RkQ29sb3JNYXAiCi0jZGVmaW5lIFhORm9yZWdyb3VuZCAiZm9yZWdyb3VuZCIKLSNkZWZpbmUgWE5CYWNrZ3JvdW5kICJiYWNrZ3JvdW5kIgotI2RlZmluZSBYTkJhY2tncm91bmRQaXhtYXAgImJhY2tncm91bmRQaXhtYXAiCi0jZGVmaW5lIFhORm9udFNldCAiZm9udFNldCIKLSNkZWZpbmUgWE5MaW5lU3BhY2UgImxpbmVTcGFjZSIKLSNkZWZpbmUgWE5DdXJzb3IgImN1cnNvciIKLQotI2RlZmluZSBYTlF1ZXJ5SU1WYWx1ZXNMaXN0ICJxdWVyeUlNVmFsdWVzTGlzdCIKLSNkZWZpbmUgWE5RdWVyeUlDVmFsdWVzTGlzdCAicXVlcnlJQ1ZhbHVlc0xpc3QiCi0jZGVmaW5lIFhOVmlzaWJsZVBvc2l0aW9uICJ2aXNpYmxlUG9zaXRpb24iCi0jZGVmaW5lIFhOUjZQcmVlZGl0Q2FsbGJhY2sgInI2UHJlZWRpdENhbGxiYWNrIgotI2RlZmluZSBYTlN0cmluZ0NvbnZlcnNpb25DYWxsYmFjayAic3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrIgotI2RlZmluZSBYTlN0cmluZ0NvbnZlcnNpb24gInN0cmluZ0NvbnZlcnNpb24iCi0jZGVmaW5lIFhOUmVzZXRTdGF0ZSAicmVzZXRTdGF0ZSIKLSNkZWZpbmUgWE5Ib3RLZXkgImhvdEtleSIKLSNkZWZpbmUgWE5Ib3RLZXlTdGF0ZSAiaG90S2V5U3RhdGUiCi0jZGVmaW5lIFhOUHJlZWRpdFN0YXRlICJwcmVlZGl0U3RhdGUiCi0jZGVmaW5lIFhOU2VwYXJhdG9yb2ZOZXN0ZWRMaXN0ICJzZXBhcmF0b3JvZk5lc3RlZExpc3QiCi0KLSNkZWZpbmUgWEJ1ZmZlck92ZXJmbG93CQktMQotI2RlZmluZSBYTG9va3VwTm9uZQkJMQotI2RlZmluZSBYTG9va3VwQ2hhcnMJCTIKLSNkZWZpbmUgWExvb2t1cEtleVN5bQkJMwotI2RlZmluZSBYTG9va3VwQm90aAkJNAotCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotdHlwZWRlZiB2b2lkICpYVmFOZXN0ZWRMaXN0OwotI2Vsc2UKLXR5cGVkZWYgWFBvaW50ZXIgWFZhTmVzdGVkTGlzdDsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgWFBvaW50ZXIgY2xpZW50X2RhdGE7Ci0gICAgWElNUHJvYyBjYWxsYmFjazsKLX0gWElNQ2FsbGJhY2s7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBYUG9pbnRlciBjbGllbnRfZGF0YTsKLSAgICBYSUNQcm9jIGNhbGxiYWNrOwotfSBYSUNDYWxsYmFjazsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJTUZlZWRiYWNrOwotCi0jZGVmaW5lIFhJTVJldmVyc2UJCTFMCi0jZGVmaW5lIFhJTVVuZGVybGluZQkJKDFMPDwxKSAKLSNkZWZpbmUgWElNSGlnaGxpZ2h0CQkoMUw8PDIpCi0jZGVmaW5lIFhJTVByaW1hcnkJIAkoMUw8PDUpCi0jZGVmaW5lIFhJTVNlY29uZGFyeQkJKDFMPDw2KQotI2RlZmluZSBYSU1UZXJ0aWFyeQkgCSgxTDw8NykKLSNkZWZpbmUgWElNVmlzaWJsZVRvRm9yd2FyZCAJKDFMPDw4KQotI2RlZmluZSBYSU1WaXNpYmxlVG9CYWNrd29yZCAJKDFMPDw5KQotI2RlZmluZSBYSU1WaXNpYmxlVG9DZW50ZXIgCSgxTDw8MTApCi0KLXR5cGVkZWYgc3RydWN0IF9YSU1UZXh0IHsKLSAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Ci0gICAgWElNRmVlZGJhY2sgKmZlZWRiYWNrOwotICAgIEJvb2wgZW5jb2RpbmdfaXNfd2NoYXI7IAotICAgIHVuaW9uIHsKLQljaGFyICptdWx0aV9ieXRlOwotCXdjaGFyX3QgKndpZGVfY2hhcjsKLSAgICB9IHN0cmluZzsgCi19IFhJTVRleHQ7Ci0KLXR5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNUHJlZWRpdFN0YXRlOwotCi0jZGVmaW5lCVhJTVByZWVkaXRVbktub3duCTBMCi0jZGVmaW5lCVhJTVByZWVkaXRFbmFibGUJMUwKLSNkZWZpbmUJWElNUHJlZWRpdERpc2FibGUJKDFMPDwxKQotCi10eXBlZGVmCXN0cnVjdAlfWElNUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2tTdHJ1Y3QgewotICAgIFhJTVByZWVkaXRTdGF0ZSBzdGF0ZTsKLX0gWElNUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2tTdHJ1Y3Q7Ci0KLXR5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNUmVzZXRTdGF0ZTsKLQotI2RlZmluZQlYSU1Jbml0aWFsU3RhdGUJCTFMCi0jZGVmaW5lCVhJTVByZXNlcnZlU3RhdGUJKDFMPDwxKQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElNU3RyaW5nQ29udmVyc2lvbkZlZWRiYWNrOwotCi0jZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25MZWZ0RWRnZQkoMHgwMDAwMDAwMSkKLSNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblJpZ2h0RWRnZQkoMHgwMDAwMDAwMikKLSNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblRvcEVkZ2UJKDB4MDAwMDAwMDQpCi0jZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25Cb3R0b21FZGdlCSgweDAwMDAwMDA4KQotI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uQ29uY2VhbGVkCSgweDAwMDAwMDEwKQotI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uV3JhcHBlZAkoMHgwMDAwMDAyMCkKLQotdHlwZWRlZiBzdHJ1Y3QgX1hJTVN0cmluZ0NvbnZlcnNpb25UZXh0IHsKLSAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Ci0gICAgWElNU3RyaW5nQ29udmVyc2lvbkZlZWRiYWNrICpmZWVkYmFjazsKLSAgICBCb29sIGVuY29kaW5nX2lzX3djaGFyOyAKLSAgICB1bmlvbiB7Ci0JY2hhciAqbWJzOwotCXdjaGFyX3QgKndjczsKLSAgICB9IHN0cmluZzsgCi19IFhJTVN0cmluZ0NvbnZlcnNpb25UZXh0OwotCi10eXBlZGVmCXVuc2lnbmVkIHNob3J0CVhJTVN0cmluZ0NvbnZlcnNpb25Qb3NpdGlvbjsKLQotdHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlYSU1TdHJpbmdDb252ZXJzaW9uVHlwZTsKLQotI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uQnVmZmVyCSgweDAwMDEpCi0jZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25MaW5lCQkoMHgwMDAyKQotI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uV29yZAkJKDB4MDAwMykKLSNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkNoYXIJCSgweDAwMDQpCi0KLXR5cGVkZWYJdW5zaWduZWQgc2hvcnQJWElNU3RyaW5nQ29udmVyc2lvbk9wZXJhdGlvbjsKLQotI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uU3Vic3RpdHV0aW9uCSgweDAwMDEpCi0jZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25SZXRyaWV2YWwJKDB4MDAwMikKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBYSU1Gb3J3YXJkQ2hhciwgWElNQmFja3dhcmRDaGFyLAotICAgIFhJTUZvcndhcmRXb3JkLCBYSU1CYWNrd2FyZFdvcmQsCi0gICAgWElNQ2FyZXRVcCwgWElNQ2FyZXREb3duLAotICAgIFhJTU5leHRMaW5lLCBYSU1QcmV2aW91c0xpbmUsCi0gICAgWElNTGluZVN0YXJ0LCBYSU1MaW5lRW5kLCAKLSAgICBYSU1BYnNvbHV0ZVBvc2l0aW9uLAotICAgIFhJTURvbnRDaGFuZ2UKLX0gWElNQ2FyZXREaXJlY3Rpb247Ci0KLXR5cGVkZWYgc3RydWN0IF9YSU1TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2tTdHJ1Y3QgewotICAgIFhJTVN0cmluZ0NvbnZlcnNpb25Qb3NpdGlvbiBwb3NpdGlvbjsKLSAgICBYSU1DYXJldERpcmVjdGlvbiBkaXJlY3Rpb247Ci0gICAgWElNU3RyaW5nQ29udmVyc2lvbk9wZXJhdGlvbiBvcGVyYXRpb247Ci0gICAgdW5zaWduZWQgc2hvcnQgZmFjdG9yOwotICAgIFhJTVN0cmluZ0NvbnZlcnNpb25UZXh0ICp0ZXh0OwotfSBYSU1TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2tTdHJ1Y3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9YSU1QcmVlZGl0RHJhd0NhbGxiYWNrU3RydWN0IHsKLSAgICBpbnQgY2FyZXQ7CQkvKiBDdXJzb3Igb2Zmc2V0IHdpdGhpbiBwcmUtZWRpdCBzdHJpbmcgKi8KLSAgICBpbnQgY2hnX2ZpcnN0OwkvKiBTdGFydGluZyBjaGFuZ2UgcG9zaXRpb24gKi8KLSAgICBpbnQgY2hnX2xlbmd0aDsJLyogTGVuZ3RoIG9mIHRoZSBjaGFuZ2UgaW4gY2hhcmFjdGVyIGNvdW50ICovCi0gICAgWElNVGV4dCAqdGV4dDsKLX0gWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBYSU1Jc0ludmlzaWJsZSwJLyogRGlzYWJsZSBjYXJldCBmZWVkYmFjayAqLyAKLSAgICBYSU1Jc1ByaW1hcnksCS8qIFVJIGRlZmluZWQgY2FyZXQgZmVlZGJhY2sgKi8KLSAgICBYSU1Jc1NlY29uZGFyeQkvKiBVSSBkZWZpbmVkIGNhcmV0IGZlZWRiYWNrICovCi19IFhJTUNhcmV0U3R5bGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9YSU1QcmVlZGl0Q2FyZXRDYWxsYmFja1N0cnVjdCB7Ci0gICAgaW50IHBvc2l0aW9uOwkJIC8qIENhcmV0IG9mZnNldCB3aXRoaW4gcHJlLWVkaXQgc3RyaW5nICovCi0gICAgWElNQ2FyZXREaXJlY3Rpb24gZGlyZWN0aW9uOyAvKiBDYXJldCBtb3ZlcyBkaXJlY3Rpb24gKi8KLSAgICBYSU1DYXJldFN0eWxlIHN0eWxlOwkgLyogRmVlZGJhY2sgb2YgdGhlIGNhcmV0ICovCi19IFhJTVByZWVkaXRDYXJldENhbGxiYWNrU3RydWN0OwotCi10eXBlZGVmIGVudW0gewotICAgIFhJTVRleHRUeXBlLAotICAgIFhJTUJpdG1hcFR5cGUKLX0gWElNU3RhdHVzRGF0YVR5cGU7Ci0JCi10eXBlZGVmIHN0cnVjdCBfWElNU3RhdHVzRHJhd0NhbGxiYWNrU3RydWN0IHsKLSAgICBYSU1TdGF0dXNEYXRhVHlwZSB0eXBlOwotICAgIHVuaW9uIHsKLQlYSU1UZXh0ICp0ZXh0OwotCVBpeG1hcCAgYml0bWFwOwotICAgIH0gZGF0YTsKLX0gWElNU3RhdHVzRHJhd0NhbGxiYWNrU3RydWN0OwotCi10eXBlZGVmIHN0cnVjdCBfWElNSG90S2V5VHJpZ2dlciB7Ci0gICAgS2V5U3ltCSBrZXlzeW07Ci0gICAgaW50CQkgbW9kaWZpZXI7Ci0gICAgaW50CQkgbW9kaWZpZXJfbWFzazsKLX0gWElNSG90S2V5VHJpZ2dlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1hJTUhvdEtleVRyaWdnZXJzIHsKLSAgICBpbnQJCQkgbnVtX2hvdF9rZXk7Ci0gICAgWElNSG90S2V5VHJpZ2dlcgkqa2V5OwotfSBYSU1Ib3RLZXlUcmlnZ2VyczsKLQotdHlwZWRlZgl1bnNpZ25lZCBsb25nCSBYSU1Ib3RLZXlTdGF0ZTsKLQotI2RlZmluZQlYSU1Ib3RLZXlTdGF0ZU9OCSgweDAwMDFMKQotI2RlZmluZQlYSU1Ib3RLZXlTdGF0ZU9GRgkoMHgwMDAyTCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50X3ZhbHVlczsKLSAgICBjaGFyICoqc3VwcG9ydGVkX3ZhbHVlczsKLX0gWElNVmFsdWVzTGlzdDsKLQotI2lmIDAKLV9YRlVOQ1BST1RPQkVHSU4KLQotI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9YTElCSU5UXykKLSNkZWZpbmUgX1hkZWJ1ZyAoKl9YZGVidWdfcCkKLSNlbmRpZgotCi1leHRlcm4gaW50IF9YZGVidWc7Ci0KLWV4dGVybiBYRm9udFN0cnVjdCAqWExvYWRRdWVyeUZvbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWEZvbnRTdHJ1Y3QgKlhRdWVyeUZvbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFhJRAkJCS8qIGZvbnRfSUQgKi8KLSNlbmRpZgotKTsKLQotCi1leHRlcm4gWFRpbWVDb29yZCAqWEdldE1vdGlvbkV2ZW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFRpbWUJCS8qIHN0YXJ0ICovLAotICAgIFRpbWUJCS8qIHN0b3AgKi8sCi0gICAgaW50KgkJLyogbmV2ZW50c19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhNb2RpZmllcktleW1hcCAqWERlbGV0ZU1vZGlmaWVybWFwRW50cnkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovLAotI2lmIE5lZWRXaWRlUHJvdG90eXBlcwotICAgIHVuc2lnbmVkIGludAkvKiBrZXljb2RlX2VudHJ5ICovLAotI2Vsc2UKLSAgICBLZXlDb2RlCQkvKiBrZXljb2RlX2VudHJ5ICovLAotI2VuZGlmCi0gICAgaW50CQkJLyogbW9kaWZpZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEdldE1vZGlmaWVyTWFwcGluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEluc2VydE1vZGlmaWVybWFwRW50cnkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovLAotI2lmIE5lZWRXaWRlUHJvdG90eXBlcwotICAgIHVuc2lnbmVkIGludAkvKiBrZXljb2RlX2VudHJ5ICovLAotI2Vsc2UKLSAgICBLZXlDb2RlCQkvKiBrZXljb2RlX2VudHJ5ICovLAotI2VuZGlmCi0gICAgaW50CQkJLyogbW9kaWZpZXIgKi8gICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYTW9kaWZpZXJLZXltYXAgKlhOZXdNb2RpZmllcm1hcCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgaW50CQkJLyogbWF4X2tleXNfcGVyX21vZCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWEltYWdlICpYQ3JlYXRlSW1hZ2UoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8sCi0gICAgaW50CQkJLyogZm9ybWF0ICovLAotICAgIGludAkJCS8qIG9mZnNldCAqLywKLSAgICBjaGFyKgkJLyogZGF0YSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICBpbnQJCQkvKiBiaXRtYXBfcGFkICovLAotICAgIGludAkJCS8qIGJ5dGVzX3Blcl9saW5lICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gU3RhdHVzIFhJbml0SW1hZ2UoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhJbWFnZSoJCS8qIGltYWdlICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gWEltYWdlICpYR2V0SW1hZ2UoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8sCi0gICAgaW50CQkJLyogZm9ybWF0ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gWEltYWdlICpYR2V0U3ViSW1hZ2UoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8sCi0gICAgaW50CQkJLyogZm9ybWF0ICovLAotICAgIFhJbWFnZSoJCS8qIGRlc3RfaW1hZ2UgKi8sCi0gICAgaW50CQkJLyogZGVzdF94ICovLAotICAgIGludAkJCS8qIGRlc3RfeSAqLwotI2VuZGlmCi0pOwotCi0vKiAKLSAqIFggZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotICovCi1leHRlcm4gRGlzcGxheSAqWE9wZW5EaXNwbGF5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGRpc3BsYXlfbmFtZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYcm1Jbml0aWFsaXplKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICB2b2lkCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYRmV0Y2hCeXRlcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50KgkJLyogbmJ5dGVzX3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGNoYXIgKlhGZXRjaEJ1ZmZlcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50KgkJLyogbmJ5dGVzX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBidWZmZXIgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBjaGFyICpYR2V0QXRvbU5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEF0b20JCS8qIGF0b20gKi8KLSNlbmRpZgotKTsKLWV4dGVybiBTdGF0dXMgWEdldEF0b21OYW1lcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRweSAqLywKLSAgICBBdG9tKgkJLyogYXRvbXMgKi8sCi0gICAgaW50CQkJLyogY291bnQgKi8sCi0gICAgY2hhcioqCQkvKiBuYW1lc19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLWV4dGVybiBjaGFyICpYR2V0RGVmYXVsdCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBwcm9ncmFtICovLAotICAgIF9YY29uc3QgY2hhcioJLyogb3B0aW9uICovCQkgIAotI2VuZGlmCi0pOwotZXh0ZXJuIGNoYXIgKlhEaXNwbGF5TmFtZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBjaGFyICpYS2V5c3ltVG9TdHJpbmcoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIEtleVN5bQkJLyoga2V5c3ltICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgKCpYU3luY2hyb25pemUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEJvb2wJCS8qIG9ub2ZmICovCi0jZW5kaWYKLSkpKAotI2lmIE5lZWROZXN0ZWRQcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBpbnQgKCpYU2V0QWZ0ZXJGdW5jdGlvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50ICgqKSAoCi0jaWYgTmVlZE5lc3RlZFByb3RvdHlwZXMKLQkgICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotICAgICAgICAgICAgKQkJLyogcHJvY2VkdXJlICovCi0jZW5kaWYKLSkpKAotI2lmIE5lZWROZXN0ZWRQcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBBdG9tIFhJbnRlcm5BdG9tKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGF0b21fbmFtZSAqLywKLSAgICBCb29sCQkvKiBvbmx5X2lmX2V4aXN0cyAqLwkJIAotI2VuZGlmCi0pOwotZXh0ZXJuIFN0YXR1cyBYSW50ZXJuQXRvbXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCi0gICAgY2hhcioqCQkvKiBuYW1lcyAqLywKLSAgICBpbnQJCQkvKiBjb3VudCAqLywKLSAgICBCb29sCQkvKiBvbmx5SWZFeGlzdHMgKi8sCi0gICAgQXRvbSoJCS8qIGF0b21zX3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIENvbG9ybWFwIFhDb3B5Q29sb3JtYXBBbmRGcmVlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBDb2xvcm1hcCBYQ3JlYXRlQ29sb3JtYXAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCi0gICAgaW50CQkJLyogYWxsb2MgKi8JCQkgCi0jZW5kaWYKLSk7Ci1leHRlcm4gQ3Vyc29yIFhDcmVhdGVQaXhtYXBDdXJzb3IoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFBpeG1hcAkJLyogc291cmNlICovLAotICAgIFBpeG1hcAkJLyogbWFzayAqLywKLSAgICBYQ29sb3IqCQkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAotICAgIFhDb2xvcioJCS8qIGJhY2tncm91bmRfY29sb3IgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHkgKi8JCQkgICAKLSNlbmRpZgotKTsKLWV4dGVybiBDdXJzb3IgWENyZWF0ZUdseXBoQ3Vyc29yKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBGb250CQkvKiBzb3VyY2VfZm9udCAqLywKLSAgICBGb250CQkvKiBtYXNrX2ZvbnQgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHNvdXJjZV9jaGFyICovLAotICAgIHVuc2lnbmVkIGludAkvKiBtYXNrX2NoYXIgKi8sCi0gICAgWENvbG9yIF9YY29uc3QgKgkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAotICAgIFhDb2xvciBfWGNvbnN0ICoJLyogYmFja2dyb3VuZF9jb2xvciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIEN1cnNvciBYQ3JlYXRlRm9udEN1cnNvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHNoYXBlICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gRm9udCBYTG9hZEZvbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIEdDIFhDcmVhdGVHQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCi0gICAgWEdDVmFsdWVzKgkJLyogdmFsdWVzICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gR0NvbnRleHQgWEdDb250ZXh0RnJvbUdDKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBHQwkJCS8qIGdjICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gdm9pZCBYRmx1c2hHQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFBpeG1hcCBYQ3JlYXRlUGl4bWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8JCSAgICAgICAgCi0jZW5kaWYKLSk7Ci1leHRlcm4gUGl4bWFwIFhDcmVhdGVCaXRtYXBGcm9tRGF0YSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBkYXRhICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gUGl4bWFwIFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgY2hhcioJCS8qIGRhdGEgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiBmZyAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIGJnICovLAotICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFdpbmRvdyBYQ3JlYXRlU2ltcGxlV2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHBhcmVudCAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGJvcmRlcl93aWR0aCAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIGJvcmRlciAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIGJhY2tncm91bmQgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBXaW5kb3cgWEdldFNlbGVjdGlvbk93bmVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBBdG9tCQkvKiBzZWxlY3Rpb24gKi8KLSNlbmRpZgotKTsKLWV4dGVybiBXaW5kb3cgWENyZWF0ZVdpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiBwYXJlbnQgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIHVuc2lnbmVkIGludAkvKiBib3JkZXJfd2lkdGggKi8sCi0gICAgaW50CQkJLyogZGVwdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGNsYXNzICovLAotICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKLSAgICBYU2V0V2luZG93QXR0cmlidXRlcyoJLyogYXR0cmlidXRlcyAqLwotI2VuZGlmCi0pOyAKLWV4dGVybiBDb2xvcm1hcCAqWExpc3RJbnN0YWxsZWRDb2xvcm1hcHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBpbnQqCQkvKiBudW1fcmV0dXJuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gY2hhciAqKlhMaXN0Rm9udHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogcGF0dGVybiAqLywKLSAgICBpbnQJCQkvKiBtYXhuYW1lcyAqLywKLSAgICBpbnQqCQkvKiBhY3R1YWxfY291bnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gY2hhciAqKlhMaXN0Rm9udHNXaXRoSW5mbygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBwYXR0ZXJuICovLAotICAgIGludAkJCS8qIG1heG5hbWVzICovLAotICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLywKLSAgICBYRm9udFN0cnVjdCoqCS8qIGluZm9fcmV0dXJuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gY2hhciAqKlhHZXRGb250UGF0aCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50KgkJLyogbnBhdGhzX3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGNoYXIgKipYTGlzdEV4dGVuc2lvbnMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludCoJCS8qIG5leHRlbnNpb25zX3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIEF0b20gKlhMaXN0UHJvcGVydGllcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGludCoJCS8qIG51bV9wcm9wX3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFhIb3N0QWRkcmVzcyAqWExpc3RIb3N0cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50KgkJLyogbmhvc3RzX3JldHVybiAqLywKLSAgICBCb29sKgkJLyogc3RhdGVfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gS2V5U3ltIFhLZXljb2RlVG9LZXlzeW0oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotI2lmIE5lZWRXaWRlUHJvdG90eXBlcwotICAgIHVuc2lnbmVkIGludAkvKiBrZXljb2RlICovLAotI2Vsc2UKLSAgICBLZXlDb2RlCQkvKiBrZXljb2RlICovLAotI2VuZGlmCi0gICAgaW50CQkJLyogaW5kZXggKi8KLSNlbmRpZgotKTsKLWV4dGVybiBLZXlTeW0gWExvb2t1cEtleXN5bSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEtleUV2ZW50KgkJLyoga2V5X2V2ZW50ICovLAotICAgIGludAkJCS8qIGluZGV4ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gS2V5U3ltICpYR2V0S2V5Ym9hcmRNYXBwaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSNpZiBOZWVkV2lkZVByb3RvdHlwZXMKLSAgICB1bnNpZ25lZCBpbnQJLyogZmlyc3Rfa2V5Y29kZSAqLywKLSNlbHNlCi0gICAgS2V5Q29kZQkJLyogZmlyc3Rfa2V5Y29kZSAqLywKLSNlbmRpZgotICAgIGludAkJCS8qIGtleWNvZGVfY291bnQgKi8sCi0gICAgaW50KgkJLyoga2V5c3ltc19wZXJfa2V5Y29kZV9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLWV4dGVybiBLZXlTeW0gWFN0cmluZ1RvS2V5c3ltKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGxvbmcgWE1heFJlcXVlc3RTaXplKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGxvbmcgWEV4dGVuZGVkTWF4UmVxdWVzdFNpemUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gY2hhciAqWFJlc291cmNlTWFuYWdlclN0cmluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBjaGFyICpYU2NyZWVuUmVzb3VyY2VTdHJpbmcoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotCVNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWERpc3BsYXlNb3Rpb25CdWZmZXJTaXplKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFZpc3VhbElEIFhWaXN1YWxJREZyb21WaXN1YWwoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLwotI2VuZGlmCi0pOwotCi0vKiBtdWx0aXRocmVhZCByb3V0aW5lcyAqLwotCi1leHRlcm4gU3RhdHVzIFhJbml0VGhyZWFkcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgdm9pZAotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYTG9ja0Rpc3BsYXkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhVbmxvY2tEaXNwbGF5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi0vKiByb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoIGV4dGVuc2lvbnMgKi8KLQotZXh0ZXJuIFhFeHRDb2RlcyAqWEluaXRFeHRlbnNpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWEV4dENvZGVzICpYQWRkRXh0ZW5zaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFhFeHREYXRhICpYRmluZE9uRXh0ZW5zaW9uTGlzdCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEV4dERhdGEqKgkJLyogc3RydWN0dXJlICovLAotICAgIGludAkJCS8qIG51bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFhFeHREYXRhICoqWEVIZWFkT2ZFeHRlbnNpb25MaXN0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRURhdGFPYmplY3QJLyogb2JqZWN0ICovCi0jZW5kaWYKLSk7Ci0KLS8qIHRoZXNlIGFyZSByb3V0aW5lcyBmb3Igd2hpY2ggdGhlcmUgYXJlIGFsc28gbWFjcm9zICovCi1leHRlcm4gV2luZG93IFhSb290V2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gV2luZG93IFhEZWZhdWx0Um9vdFdpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBXaW5kb3cgWFJvb3RXaW5kb3dPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gVmlzdWFsICpYRGVmYXVsdFZpc3VhbCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFZpc3VhbCAqWERlZmF1bHRWaXN1YWxPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gR0MgWERlZmF1bHRHQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIEdDIFhEZWZhdWx0R0NPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBYQmxhY2tQaXhlbCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWwoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIFhBbGxQbGFuZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIHZvaWQKLSNlbmRpZgotKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIFhCbGFja1BpeGVsT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWxPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBYTmV4dFJlcXVlc3QoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBYTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBjaGFyICpYU2VydmVyVmVuZG9yKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGNoYXIgKlhEaXNwbGF5U3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIENvbG9ybWFwIFhEZWZhdWx0Q29sb3JtYXAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLWV4dGVybiBDb2xvcm1hcCBYRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFNjcmVlbiAqWFNjcmVlbk9mRGlzcGxheSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFNjcmVlbiAqWERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gbG9uZyBYRXZlbnRNYXNrT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTY3JlZW5OdW1iZXJPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci0KLXR5cGVkZWYgaW50ICgqWEVycm9ySGFuZGxlcikgKAkgICAgLyogV0FSTklORywgdGhpcyB0eXBlIG5vdCBpbiBYbGliIHNwZWMgKi8KLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWEVycm9yRXZlbnQqCS8qIGVycm9yX2V2ZW50ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYRXJyb3JIYW5kbGVyIFhTZXRFcnJvckhhbmRsZXIgKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRXJyb3JIYW5kbGVyCS8qIGhhbmRsZXIgKi8KLSNlbmRpZgotKTsKLQotCi10eXBlZGVmIGludCAoKlhJT0Vycm9ySGFuZGxlcikgKCAgICAvKiBXQVJOSU5HLCB0aGlzIHR5cGUgbm90IGluIFhsaWIgc3BlYyAqLwotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWElPRXJyb3JIYW5kbGVyIFhTZXRJT0Vycm9ySGFuZGxlciAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhJT0Vycm9ySGFuZGxlcgkvKiBoYW5kbGVyICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYUGl4bWFwRm9ybWF0VmFsdWVzICpYTGlzdFBpeG1hcEZvcm1hdHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGludCAqWExpc3REZXB0aHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8sCi0gICAgaW50KgkJLyogY291bnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLS8qIElDQ0NNIHJvdXRpbmVzIGZvciB0aGluZ3MgdGhhdCBkb24ndCByZXF1aXJlIHNwZWNpYWwgaW5jbHVkZSBmaWxlczsgKi8KLS8qIG90aGVyIGRlY2xhcmF0aW9ucyBhcmUgZ2l2ZW4gaW4gWHV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLWV4dGVybiBTdGF0dXMgWFJlY29uZmlndXJlV01XaW5kb3coCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAotICAgIHVuc2lnbmVkIGludAkvKiBtYXNrICovLAotICAgIFhXaW5kb3dDaGFuZ2VzKgkvKiBjaGFuZ2VzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFdNUHJvdG9jb2xzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgQXRvbSoqCQkvKiBwcm90b2NvbHNfcmV0dXJuICovLAotICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFN0YXR1cyBYU2V0V01Qcm90b2NvbHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBBdG9tKgkJLyogcHJvdG9jb2xzICovLAotICAgIGludAkJCS8qIGNvdW50ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gU3RhdHVzIFhJY29uaWZ5V2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFN0YXR1cyBYV2l0aGRyYXdXaW5kb3coCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gU3RhdHVzIFhHZXRDb21tYW5kKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgY2hhcioqKgkJLyogYXJndl9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogYXJnY19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLWV4dGVybiBTdGF0dXMgWEdldFdNQ29sb3JtYXBXaW5kb3dzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgV2luZG93KioJCS8qIHdpbmRvd3NfcmV0dXJuICovLAotICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIFN0YXR1cyBYU2V0V01Db2xvcm1hcFdpbmRvd3MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBXaW5kb3cqCQkvKiBjb2xvcm1hcF93aW5kb3dzICovLAotICAgIGludAkJCS8qIGNvdW50ICovCi0jZW5kaWYKLSk7Ci1leHRlcm4gdm9pZCBYRnJlZVN0cmluZ0xpc3QoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIGNoYXIqKgkJLyogbGlzdCAqLwotI2VuZGlmCi0pOwotZXh0ZXJuIGludCBYU2V0VHJhbnNpZW50Rm9ySGludCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFdpbmRvdwkJLyogcHJvcF93aW5kb3cgKi8KLSNlbmRpZgotKTsKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgZ2l2ZW4gaW4gYWxwaGFiZXRpY2FsIG9yZGVyICovCi0KLWV4dGVybiBpbnQgWEFjdGl2YXRlU2NyZWVuU2F2ZXIoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEFkZEhvc3QoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhBZGRIb3N0cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWEhvc3RBZGRyZXNzKgkvKiBob3N0cyAqLywKLSAgICBpbnQJCQkvKiBudW1faG9zdHMgKi8gICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEFkZFRvRXh0ZW5zaW9uTGlzdCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgc3RydWN0IF9YRXh0RGF0YSoqCS8qIHN0cnVjdHVyZSAqLywKLSAgICBYRXh0RGF0YSoJCS8qIGV4dF9kYXRhICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEFkZFRvU2F2ZVNldCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3IoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKLSAgICBYQ29sb3IqCQkvKiBzY3JlZW5faW5fb3V0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3JDZWxscygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIEJvb2wJICAgICAgICAvKiBjb250aWcgKi8sCi0gICAgdW5zaWduZWQgbG9uZyoJLyogcGxhbmVfbWFza3NfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludAkvKiBucGxhbmVzICovLAotICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVsc19yZXR1cm4gKi8sCi0gICAgdW5zaWduZWQgaW50IAkvKiBucGl4ZWxzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3JQbGFuZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKLSAgICBCb29sCQkvKiBjb250aWcgKi8sCi0gICAgdW5zaWduZWQgbG9uZyoJLyogcGl4ZWxzX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBuY29sb3JzICovLAotICAgIGludAkJCS8qIG5yZWRzICovLAotICAgIGludAkJCS8qIG5ncmVlbnMgKi8sCi0gICAgaW50CQkJLyogbmJsdWVzICovLAotICAgIHVuc2lnbmVkIGxvbmcqCS8qIHJtYXNrX3JldHVybiAqLywKLSAgICB1bnNpZ25lZCBsb25nKgkvKiBnbWFza19yZXR1cm4gKi8sCi0gICAgdW5zaWduZWQgbG9uZyoJLyogYm1hc2tfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEFsbG9jTmFtZWRDb2xvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIF9YY29uc3QgY2hhcioJLyogY29sb3JfbmFtZSAqLywKLSAgICBYQ29sb3IqCQkvKiBzY3JlZW5fZGVmX3JldHVybiAqLywKLSAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEFsbG93RXZlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBldmVudF9tb2RlICovLAotICAgIFRpbWUJCS8qIHRpbWUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQXV0b1JlcGVhdE9mZigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQXV0b1JlcGVhdE9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhCZWxsKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBwZXJjZW50ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEJpdG1hcEJpdE9yZGVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhCaXRtYXBQYWQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEJpdG1hcFVuaXQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENlbGxzT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGV2ZW50X21hc2sgKi8sCi0gICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCi0gICAgVGltZQkJLyogdGltZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDaGFuZ2VHQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKLSAgICBYR0NWYWx1ZXMqCQkvKiB2YWx1ZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlX21hc2sgKi8sCi0gICAgWEtleWJvYXJkQ29udHJvbCoJLyogdmFsdWVzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENoYW5nZUtleWJvYXJkTWFwcGluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogZmlyc3Rfa2V5Y29kZSAqLywKLSAgICBpbnQJCQkvKiBrZXlzeW1zX3Blcl9rZXljb2RlICovLAotICAgIEtleVN5bSoJCS8qIGtleXN5bXMgKi8sCi0gICAgaW50CQkJLyogbnVtX2NvZGVzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENoYW5nZVBvaW50ZXJDb250cm9sKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBCb29sCQkvKiBkb19hY2NlbCAqLywKLSAgICBCb29sCQkvKiBkb190aHJlc2hvbGQgKi8sCi0gICAgaW50CQkJLyogYWNjZWxfbnVtZXJhdG9yICovLAotICAgIGludAkJCS8qIGFjY2VsX2Rlbm9taW5hdG9yICovLAotICAgIGludAkJCS8qIHRocmVzaG9sZCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDaGFuZ2VQcm9wZXJ0eSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIEF0b20JCS8qIHByb3BlcnR5ICovLAotICAgIEF0b20JCS8qIHR5cGUgKi8sCi0gICAgaW50CQkJLyogZm9ybWF0ICovLAotICAgIGludAkJCS8qIG1vZGUgKi8sCi0gICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyKgkvKiBkYXRhICovLAotICAgIGludAkJCS8qIG5lbGVtZW50cyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDaGFuZ2VTYXZlU2V0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgaW50CQkJLyogY2hhbmdlX21vZGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ2hhbmdlV2luZG93QXR0cmlidXRlcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiAvKiBhdHRyaWJ1dGVzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhDaGVja0lmRXZlbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLywKLSAgICBCb29sICgqKSAoCi0jaWYgTmVlZE5lc3RlZFByb3RvdHlwZXMKLQkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAotICAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIGV2ZW50ICovLAotICAgICAgICAgICAgICAgWFBvaW50ZXIJCQkvKiBhcmcgKi8KLSNlbmRpZgotICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKLSAgICBYUG9pbnRlcgkJLyogYXJnICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhDaGVja01hc2tFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKLSAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWENoZWNrVHlwZWRFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogZXZlbnRfdHlwZSAqLywKLSAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWENoZWNrVHlwZWRXaW5kb3dFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGludAkJCS8qIGV2ZW50X3R5cGUgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhDaGVja1dpbmRvd0V2ZW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKLSAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ2lyY3VsYXRlU3Vid2luZG93cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGludAkJCS8qIGRpcmVjdGlvbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDaXJjdWxhdGVTdWJ3aW5kb3dzRG93bigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENpcmN1bGF0ZVN1YndpbmRvd3NVcCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENsZWFyQXJlYSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICBCb29sCQkvKiBleHBvc3VyZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ2xlYXJXaW5kb3coCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDbG9zZURpc3BsYXkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWENvbmZpZ3VyZVdpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB2YWx1ZV9tYXNrICovLAotICAgIFhXaW5kb3dDaGFuZ2VzKgkvKiB2YWx1ZXMgKi8JCSAKLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ29ubmVjdGlvbk51bWJlcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ29udmVydFNlbGVjdGlvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQXRvbQkJLyogc2VsZWN0aW9uICovLAotICAgIEF0b20gCQkvKiB0YXJnZXQgKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8sCi0gICAgV2luZG93CQkvKiByZXF1ZXN0b3IgKi8sCi0gICAgVGltZQkJLyogdGltZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDb3B5QXJlYSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIHNyYyAqLywKLSAgICBEcmF3YWJsZQkJLyogZGVzdCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHNyY194ICovLAotICAgIGludAkJCS8qIHNyY195ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIGludAkJCS8qIGRlc3RfeCAqLywKLSAgICBpbnQJCQkvKiBkZXN0X3kgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ29weUdDKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIHNyYyAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKLSAgICBHQwkJCS8qIGRlc3QgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYQ29weVBsYW5lKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogc3JjICovLAotICAgIERyYXdhYmxlCQkvKiBkZXN0ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogc3JjX3ggKi8sCi0gICAgaW50CQkJLyogc3JjX3kgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCi0gICAgaW50CQkJLyogZGVzdF94ICovLAotICAgIGludAkJCS8qIGRlc3RfeSAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERlZmF1bHREZXB0aCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEZWZhdWx0RGVwdGhPZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERlZmF1bHRTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERlZmluZUN1cnNvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIEN1cnNvcgkJLyogY3Vyc29yICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERlbGV0ZVByb3BlcnR5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGVzdHJveVdpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERlc3Ryb3lTdWJ3aW5kb3dzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRG9lc0JhY2tpbmdTdG9yZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovICAgIAotI2VuZGlmCi0pOwotCi1leHRlcm4gQm9vbCBYRG9lc1NhdmVVbmRlcnMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEaXNhYmxlQWNjZXNzQ29udHJvbCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotCi1leHRlcm4gaW50IFhEaXNwbGF5Q2VsbHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGlzcGxheUhlaWdodCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEaXNwbGF5SGVpZ2h0TU0oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGlzcGxheUtleWNvZGVzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQqCQkvKiBtaW5fa2V5Y29kZXNfcmV0dXJuICovLAotICAgIGludCoJCS8qIG1heF9rZXljb2Rlc19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGlzcGxheVBsYW5lcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEaXNwbGF5V2lkdGgoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGlzcGxheVdpZHRoTU0oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRHJhd0FyYygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCi0gICAgaW50CQkJLyogYW5nbGUxICovLAotICAgIGludAkJCS8qIGFuZ2xlMiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEcmF3QXJjcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBYQXJjKgkJLyogYXJjcyAqLywKLSAgICBpbnQJCQkvKiBuYXJjcyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEcmF3SW1hZ2VTdHJpbmcoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAotICAgIGludAkJCS8qIGxlbmd0aCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEcmF3SW1hZ2VTdHJpbmcxNigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCi0gICAgaW50CQkJLyogbGVuZ3RoICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdMaW5lKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHgxICovLAotICAgIGludAkJCS8qIHkxICovLAotICAgIGludAkJCS8qIHgyICovLAotICAgIGludAkJCS8qIHkyICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdMaW5lcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCi0gICAgaW50CQkJLyogbnBvaW50cyAqLywKLSAgICBpbnQJCQkvKiBtb2RlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdQb2ludCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRHJhd1BvaW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCi0gICAgaW50CQkJLyogbnBvaW50cyAqLywKLSAgICBpbnQJCQkvKiBtb2RlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdSZWN0YW5nbGUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdSZWN0YW5nbGVzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGVzICovLAotICAgIGludAkJCS8qIG5yZWN0YW5nbGVzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWERyYXdTZWdtZW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBYU2VnbWVudCoJCS8qIHNlZ21lbnRzICovLAotICAgIGludAkJCS8qIG5zZWdtZW50cyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEcmF3U3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKLSAgICBpbnQJCQkvKiBsZW5ndGggKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRHJhd1N0cmluZzE2KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKLSAgICBpbnQJCQkvKiBsZW5ndGggKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRHJhd1RleHQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIFhUZXh0SXRlbSoJCS8qIGl0ZW1zICovLAotICAgIGludAkJCS8qIG5pdGVtcyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhEcmF3VGV4dDE2KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICBYVGV4dEl0ZW0xNioJLyogaXRlbXMgKi8sCi0gICAgaW50CQkJLyogbml0ZW1zICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEVuYWJsZUFjY2Vzc0NvbnRyb2woCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEV2ZW50c1F1ZXVlZCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogbW9kZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhGZXRjaE5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBjaGFyKioJCS8qIHdpbmRvd19uYW1lX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhGaWxsQXJjKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICBpbnQJCQkvKiBhbmdsZTEgKi8sCi0gICAgaW50CQkJLyogYW5nbGUyICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZpbGxBcmNzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIFhBcmMqCQkvKiBhcmNzICovLAotICAgIGludAkJCS8qIG5hcmNzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZpbGxQb2x5Z29uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKLSAgICBpbnQJCQkvKiBucG9pbnRzICovLAotICAgIGludAkJCS8qIHNoYXBlICovLAotICAgIGludAkJCS8qIG1vZGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRmlsbFJlY3RhbmdsZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRmlsbFJlY3RhbmdsZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RhbmdsZXMgKi8sCi0gICAgaW50CQkJLyogbnJlY3RhbmdsZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRmx1c2goCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZvcmNlU2NyZWVuU2F2ZXIoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGludAkJCS8qIG1vZGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRnJlZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgdm9pZCoJCS8qIGRhdGEgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRnJlZUNvbG9ybWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRnJlZUNvbG9ycygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVscyAqLywKLSAgICBpbnQJCQkvKiBucGl4ZWxzICovLAotICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZyZWVDdXJzb3IoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEN1cnNvcgkJLyogY3Vyc29yICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZyZWVFeHRlbnNpb25MaXN0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBjaGFyKioJCS8qIGxpc3QgKi8gICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZyZWVGb250KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRnJlZUZvbnRJbmZvKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBjaGFyKioJCS8qIG5hbWVzICovLAotICAgIFhGb250U3RydWN0KgkvKiBmcmVlX2luZm8gKi8sCi0gICAgaW50CQkJLyogYWN0dWFsX2NvdW50ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEZyZWVGb250TmFtZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIGNoYXIqKgkJLyogbGlzdCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhGcmVlRm9udFBhdGgoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIGNoYXIqKgkJLyogbGlzdCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhGcmVlR0MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRnJlZU1vZGlmaWVybWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhGcmVlUGl4bWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBQaXhtYXAJCS8qIHBpeG1hcCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhHZW9tZXRyeSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuICovLAotICAgIF9YY29uc3QgY2hhcioJLyogcG9zaXRpb24gKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X3Bvc2l0aW9uICovLAotICAgIHVuc2lnbmVkIGludAkvKiBid2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGZ3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogZmhlaWdodCAqLywKLSAgICBpbnQJCQkvKiB4YWRkZXIgKi8sCi0gICAgaW50CQkJLyogeWFkZGVyICovLAotICAgIGludCoJCS8qIHhfcmV0dXJuICovLAotICAgIGludCoJCS8qIHlfcmV0dXJuICovLAotICAgIGludCoJCS8qIHdpZHRoX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBoZWlnaHRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEdldEVycm9yRGF0YWJhc2VUZXh0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBtZXNzYWdlICovLAotICAgIF9YY29uc3QgY2hhcioJLyogZGVmYXVsdF9zdHJpbmcgKi8sCi0gICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCi0gICAgaW50CQkJLyogbGVuZ3RoICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEdldEVycm9yVGV4dCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogY29kZSAqLywKLSAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBsZW5ndGggKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWEdldEZvbnRQcm9wZXJ0eSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAotICAgIEF0b20JCS8qIGF0b20gKi8sCi0gICAgdW5zaWduZWQgbG9uZyoJLyogdmFsdWVfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldEdDVmFsdWVzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAotICAgIFhHQ1ZhbHVlcyoJCS8qIHZhbHVlc19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0R2VvbWV0cnkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIFdpbmRvdyoJCS8qIHJvb3RfcmV0dXJuICovLAotICAgIGludCoJCS8qIHhfcmV0dXJuICovLAotICAgIGludCoJCS8qIHlfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKLSAgICB1bnNpZ25lZCBpbnQqCS8qIGJvcmRlcl93aWR0aF9yZXR1cm4gKi8sCi0gICAgdW5zaWduZWQgaW50KgkvKiBkZXB0aF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0SWNvbk5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBjaGFyKioJCS8qIGljb25fbmFtZV9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYR2V0SW5wdXRGb2N1cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93KgkJLyogZm9jdXNfcmV0dXJuICovLAotICAgIGludCoJCS8qIHJldmVydF90b19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYR2V0S2V5Ym9hcmRDb250cm9sKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYS2V5Ym9hcmRTdGF0ZSoJLyogdmFsdWVzX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhHZXRQb2ludGVyQ29udHJvbCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50KgkJLyogYWNjZWxfbnVtZXJhdG9yX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBhY2NlbF9kZW5vbWluYXRvcl9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogdGhyZXNob2xkX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhHZXRQb2ludGVyTWFwcGluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgdW5zaWduZWQgY2hhcioJLyogbWFwX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBubWFwICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEdldFNjcmVlblNhdmVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQqCQkvKiB0aW1lb3V0X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBpbnRlcnZhbF9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogcHJlZmVyX2JsYW5raW5nX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBhbGxvd19leHBvc3VyZXNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFRyYW5zaWVudEZvckhpbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBXaW5kb3cqCQkvKiBwcm9wX3dpbmRvd19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYR2V0V2luZG93UHJvcGVydHkoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLywKLSAgICBsb25nCQkvKiBsb25nX29mZnNldCAqLywKLSAgICBsb25nCQkvKiBsb25nX2xlbmd0aCAqLywKLSAgICBCb29sCQkvKiBkZWxldGUgKi8sCi0gICAgQXRvbQkJLyogcmVxX3R5cGUgKi8sCi0gICAgQXRvbSoJCS8qIGFjdHVhbF90eXBlX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBhY3R1YWxfZm9ybWF0X3JldHVybiAqLywKLSAgICB1bnNpZ25lZCBsb25nKgkvKiBuaXRlbXNfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGxvbmcqCS8qIGJ5dGVzX2FmdGVyX3JldHVybiAqLywKLSAgICB1bnNpZ25lZCBjaGFyKioJLyogcHJvcF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0V2luZG93QXR0cmlidXRlcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhXaW5kb3dBdHRyaWJ1dGVzKgkvKiB3aW5kb3dfYXR0cmlidXRlc19yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYR3JhYkJ1dHRvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAotICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCi0gICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAotICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9tYXNrICovLAotICAgIGludAkJCS8qIHBvaW50ZXJfbW9kZSAqLywKLSAgICBpbnQJCQkvKiBrZXlib2FyZF9tb2RlICovLAotICAgIFdpbmRvdwkJLyogY29uZmluZV90byAqLywKLSAgICBDdXJzb3IJCS8qIGN1cnNvciAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhHcmFiS2V5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBrZXljb2RlICovLAotICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCi0gICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKLSAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCi0gICAgaW50CQkJLyogcG9pbnRlcl9tb2RlICovLAotICAgIGludAkJCS8qIGtleWJvYXJkX21vZGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYR3JhYktleWJvYXJkKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAotICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKLSAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCi0gICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKLSAgICBUaW1lCQkvKiB0aW1lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEdyYWJQb2ludGVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAotICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogZXZlbnRfbWFzayAqLywKLSAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCi0gICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKLSAgICBXaW5kb3cJCS8qIGNvbmZpbmVfdG8gKi8sCi0gICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCi0gICAgVGltZQkJLyogdGltZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhHcmFiU2VydmVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhIZWlnaHRNTU9mU2NyZWVuKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYSGVpZ2h0T2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhJZkV2ZW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCi0gICAgQm9vbCAoKikgKAotI2lmIE5lZWROZXN0ZWRQcm90b3R5cGVzCi0JICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKLSAgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiBldmVudCAqLywKLSAgICAgICAgICAgICAgIFhQb2ludGVyCQkJLyogYXJnICovCi0jZW5kaWYKLSAgICAgICAgICAgICApCQkvKiBwcmVkaWNhdGUgKi8sCi0gICAgWFBvaW50ZXIJCS8qIGFyZyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhJbWFnZUJ5dGVPcmRlcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYSW5zdGFsbENvbG9ybWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEtleUNvZGUgWEtleXN5bVRvS2V5Y29kZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYS2lsbENsaWVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWElECQkJLyogcmVzb3VyY2UgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYTG9va3VwQ29sb3IoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yX25hbWUgKi8sCi0gICAgWENvbG9yKgkJLyogZXhhY3RfZGVmX3JldHVybiAqLywKLSAgICBYQ29sb3IqCQkvKiBzY3JlZW5fZGVmX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhMb3dlcldpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWE1hcFJhaXNlZCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWE1hcFN1YndpbmRvd3MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhNYXBXaW5kb3coCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhNYXNrRXZlbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWE1heENtYXBzT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhNaW5DbWFwc09mU2NyZWVuKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYTW92ZVJlc2l6ZVdpbmRvdygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhNb3ZlV2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWE5leHRFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWE5vT3AoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWFBhcnNlQ29sb3IoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHNwZWMgKi8sCi0gICAgWENvbG9yKgkJLyogZXhhY3RfZGVmX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQYXJzZUdlb21ldHJ5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHBhcnNlc3RyaW5nICovLAotICAgIGludCoJCS8qIHhfcmV0dXJuICovLAotICAgIGludCoJCS8qIHlfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQZWVrRXZlbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQZWVrSWZFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovLAotICAgIEJvb2wgKCopICgKLSNpZiBOZWVkTmVzdGVkUHJvdG90eXBlcwotCSAgICAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICAgICAgICAgICAgIFhFdmVudCoJCS8qIGV2ZW50ICovLAotICAgICAgICAgICAgICAgWFBvaW50ZXIJCS8qIGFyZyAqLwotI2VuZGlmCi0gICAgICAgICAgICAgKQkJLyogcHJlZGljYXRlICovLAotICAgIFhQb2ludGVyCQkvKiBhcmcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUGVuZGluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUGxhbmVzT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotICAgIAotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQcm90b2NvbFJldmlzaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQcm90b2NvbFZlcnNpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLQotZXh0ZXJuIGludCBYUHV0QmFja0V2ZW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYRXZlbnQqCQkvKiBldmVudCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhQdXRJbWFnZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKLSAgICBpbnQJCQkvKiBzcmNfeCAqLywKLSAgICBpbnQJCQkvKiBzcmNfeSAqLywKLSAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCi0gICAgaW50CQkJLyogZGVzdF95ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCSAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFFMZW5ndGgoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdEN1cnNvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgdW5zaWduZWQgaW50ICAgICAgICAvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhRdWVyeUJlc3RTaXplKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBjbGFzcyAqLywKLSAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhRdWVyeUJlc3RTdGlwcGxlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhRdWVyeUJlc3RUaWxlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhRdWVyeUNvbG9yKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCi0gICAgWENvbG9yKgkJLyogZGVmX2luX291dCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhRdWVyeUNvbG9ycygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIFhDb2xvcioJCS8qIGRlZnNfaW5fb3V0ICovLAotICAgIGludAkJCS8qIG5jb2xvcnMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWFF1ZXJ5RXh0ZW5zaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCi0gICAgaW50KgkJLyogbWFqb3Jfb3Bjb2RlX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBmaXJzdF9ldmVudF9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogZmlyc3RfZXJyb3JfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFF1ZXJ5S2V5bWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBjaGFyIFszMl0JCS8qIGtleXNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhRdWVyeVBvaW50ZXIoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBXaW5kb3cqCQkvKiByb290X3JldHVybiAqLywKLSAgICBXaW5kb3cqCQkvKiBjaGlsZF9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogcm9vdF94X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiByb290X3lfcmV0dXJuICovLAotICAgIGludCoJCS8qIHdpbl94X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiB3aW5feV9yZXR1cm4gKi8sCi0gICAgdW5zaWduZWQgaW50KiAgICAgICAvKiBtYXNrX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhRdWVyeVRleHRFeHRlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYSUQJCQkvKiBmb250X0lEICovLAotICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAotICAgIGludAkJCS8qIG5jaGFycyAqLywKLSAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAotICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAotICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLyAgICAKLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUXVlcnlUZXh0RXh0ZW50czE2KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYSUQJCQkvKiBmb250X0lEICovLAotICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAotICAgIGludAkJCS8qIG5jaGFycyAqLywKLSAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAotICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAotICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhRdWVyeVRyZWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBXaW5kb3cqCQkvKiByb290X3JldHVybiAqLywKLSAgICBXaW5kb3cqCQkvKiBwYXJlbnRfcmV0dXJuICovLAotICAgIFdpbmRvdyoqCQkvKiBjaGlsZHJlbl9yZXR1cm4gKi8sCi0gICAgdW5zaWduZWQgaW50KgkvKiBuY2hpbGRyZW5fcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFJhaXNlV2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVhZEJpdG1hcEZpbGUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlIAkJLyogZCAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKLSAgICBQaXhtYXAqCQkvKiBiaXRtYXBfcmV0dXJuICovLAotICAgIGludCoJCS8qIHhfaG90X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiB5X2hvdF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVhZEJpdG1hcEZpbGVEYXRhKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovLAotICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAotICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKLSAgICB1bnNpZ25lZCBjaGFyKioJLyogZGF0YV9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogeF9ob3RfcmV0dXJuICovLAotICAgIGludCoJCS8qIHlfaG90X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhSZWJpbmRLZXlzeW0oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEtleVN5bQkJLyoga2V5c3ltICovLAotICAgIEtleVN5bSoJCS8qIGxpc3QgKi8sCi0gICAgaW50CQkJLyogbW9kX2NvdW50ICovLAotICAgIF9YY29uc3QgdW5zaWduZWQgY2hhcioJLyogc3RyaW5nICovLAotICAgIGludAkJCS8qIGJ5dGVzX3N0cmluZyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhSZWNvbG9yQ3Vyc29yKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDdXJzb3IJCS8qIGN1cnNvciAqLywKLSAgICBYQ29sb3IqCQkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAotICAgIFhDb2xvcioJCS8qIGJhY2tncm91bmRfY29sb3IgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVmcmVzaEtleWJvYXJkTWFwcGluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWE1hcHBpbmdFdmVudCoJLyogZXZlbnRfbWFwICovICAgIAotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhSZW1vdmVGcm9tU2F2ZVNldCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFJlbW92ZUhvc3QoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhSZW1vdmVIb3N0cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWEhvc3RBZGRyZXNzKgkvKiBob3N0cyAqLywKLSAgICBpbnQJCQkvKiBudW1faG9zdHMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVwYXJlbnRXaW5kb3coCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBXaW5kb3cJCS8qIHBhcmVudCAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVzZXRTY3JlZW5TYXZlcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVzaXplV2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAotICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVzdGFja1dpbmRvd3MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdyoJCS8qIHdpbmRvd3MgKi8sCi0gICAgaW50CQkJLyogbndpbmRvd3MgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUm90YXRlQnVmZmVycygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogcm90YXRlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFJvdGF0ZVdpbmRvd1Byb3BlcnRpZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBBdG9tKgkJLyogcHJvcGVydGllcyAqLywKLSAgICBpbnQJCQkvKiBudW1fcHJvcCAqLywKLSAgICBpbnQJCQkvKiBucG9zaXRpb25zICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNjcmVlbkNvdW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZWxlY3RJbnB1dCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYU2VuZEV2ZW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgQm9vbAkJLyogcHJvcGFnYXRlICovLAotICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfc2VuZCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRBY2Nlc3NDb250cm9sKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBtb2RlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldEFyY01vZGUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogYXJjX21vZGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0QmFja2dyb3VuZCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIGJhY2tncm91bmQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0Q2xpcE1hc2soCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgUGl4bWFwCQkvKiBwaXhtYXAgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0Q2xpcE9yaWdpbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiBjbGlwX3hfb3JpZ2luICovLAotICAgIGludAkJCS8qIGNsaXBfeV9vcmlnaW4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0Q2xpcFJlY3RhbmdsZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogY2xpcF94X29yaWdpbiAqLywKLSAgICBpbnQJCQkvKiBjbGlwX3lfb3JpZ2luICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGVzICovLAotICAgIGludAkJCS8qIG4gKi8sCi0gICAgaW50CQkJLyogb3JkZXJpbmcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0Q2xvc2VEb3duTW9kZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogY2xvc2VfbW9kZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRDb21tYW5kKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgY2hhcioqCQkvKiBhcmd2ICovLAotICAgIGludAkJCS8qIGFyZ2MgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0RGFzaGVzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIGRhc2hfb2Zmc2V0ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogZGFzaF9saXN0ICovLAotICAgIGludAkJCS8qIG4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0RmlsbFJ1bGUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogZmlsbF9ydWxlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldEZpbGxTdHlsZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiBmaWxsX3N0eWxlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldEZvbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgRm9udAkJLyogZm9udCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRGb250UGF0aCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgY2hhcioqCQkvKiBkaXJlY3RvcmllcyAqLywKLSAgICBpbnQJCQkvKiBuZGlycyAqLwkgICAgIAotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRGb3JlZ3JvdW5kKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIHVuc2lnbmVkIGxvbmcJLyogZm9yZWdyb3VuZCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRGdW5jdGlvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiBmdW5jdGlvbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRHcmFwaGljc0V4cG9zdXJlcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBCb29sCQkvKiBncmFwaGljc19leHBvc3VyZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0SWNvbk5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGljb25fbmFtZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRJbnB1dEZvY3VzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIGZvY3VzICovLAotICAgIGludAkJCS8qIHJldmVydF90byAqLywKLSAgICBUaW1lCQkvKiB0aW1lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldExpbmVBdHRyaWJ1dGVzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIHVuc2lnbmVkIGludAkvKiBsaW5lX3dpZHRoICovLAotICAgIGludAkJCS8qIGxpbmVfc3R5bGUgKi8sCi0gICAgaW50CQkJLyogY2FwX3N0eWxlICovLAotICAgIGludAkJCS8qIGpvaW5fc3R5bGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0TW9kaWZpZXJNYXBwaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRQbGFuZU1hc2soCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFBvaW50ZXJNYXBwaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBfWGNvbnN0IHVuc2lnbmVkIGNoYXIqCS8qIG1hcCAqLywKLSAgICBpbnQJCQkvKiBubWFwICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFNjcmVlblNhdmVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiB0aW1lb3V0ICovLAotICAgIGludAkJCS8qIGludGVydmFsICovLAotICAgIGludAkJCS8qIHByZWZlcl9ibGFua2luZyAqLywKLSAgICBpbnQJCQkvKiBhbGxvd19leHBvc3VyZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0U2VsZWN0aW9uT3duZXIoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEF0b20JICAgICAgICAvKiBzZWxlY3Rpb24gKi8sCi0gICAgV2luZG93CQkvKiBvd25lciAqLywKLSAgICBUaW1lCQkvKiB0aW1lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFN0YXRlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIHVuc2lnbmVkIGxvbmcgCS8qIGZvcmVncm91bmQgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiBiYWNrZ3JvdW5kICovLAotICAgIGludAkJCS8qIGZ1bmN0aW9uICovLAotICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRTdGlwcGxlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIFBpeG1hcAkJLyogc3RpcHBsZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRTdWJ3aW5kb3dNb2RlKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHN1YndpbmRvd19tb2RlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFRTT3JpZ2luKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIGludAkJCS8qIHRzX3hfb3JpZ2luICovLAotICAgIGludAkJCS8qIHRzX3lfb3JpZ2luICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFRpbGUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgUGl4bWFwCQkvKiB0aWxlICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFdpbmRvd0JhY2tncm91bmQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICB1bnNpZ25lZCBsb25nCS8qIGJhY2tncm91bmRfcGl4ZWwgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0V2luZG93QmFja2dyb3VuZFBpeG1hcCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFBpeG1hcAkJLyogYmFja2dyb3VuZF9waXhtYXAgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiBib3JkZXJfcGl4ZWwgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyUGl4bWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgUGl4bWFwCQkvKiBib3JkZXJfcGl4bWFwICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFdpbmRvd0JvcmRlcldpZHRoKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFdpbmRvd0NvbG9ybWFwKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFN0b3JlQnVmZmVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIGJ5dGVzICovLAotICAgIGludAkJCS8qIG5ieXRlcyAqLywKLSAgICBpbnQJCQkvKiBidWZmZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU3RvcmVCeXRlcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBieXRlcyAqLywKLSAgICBpbnQJCQkvKiBuYnl0ZXMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU3RvcmVDb2xvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIFhDb2xvcioJCS8qIGNvbG9yICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFN0b3JlQ29sb3JzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCi0gICAgWENvbG9yKgkJLyogY29sb3IgKi8sCi0gICAgaW50CQkJLyogbmNvbG9ycyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTdG9yZU5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHdpbmRvd19uYW1lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFN0b3JlTmFtZWRDb2xvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAotICAgIF9YY29uc3QgY2hhcioJLyogY29sb3IgKi8sCi0gICAgdW5zaWduZWQgbG9uZwkvKiBwaXhlbCAqLywKLSAgICBpbnQJCQkvKiBmbGFncyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTeW5jKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBCb29sCQkvKiBkaXNjYXJkICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFRleHRFeHRlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCi0gICAgaW50CQkJLyogbmNoYXJzICovLAotICAgIGludCoJCS8qIGRpcmVjdGlvbl9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogZm9udF9hc2NlbnRfcmV0dXJuICovLAotICAgIGludCoJCS8qIGZvbnRfZGVzY2VudF9yZXR1cm4gKi8sCi0gICAgWENoYXJTdHJ1Y3QqCS8qIG92ZXJhbGxfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFRleHRFeHRlbnRzMTYoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLywKLSAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKLSAgICBpbnQJCQkvKiBuY2hhcnMgKi8sCi0gICAgaW50KgkJLyogZGlyZWN0aW9uX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBmb250X2FzY2VudF9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogZm9udF9kZXNjZW50X3JldHVybiAqLywKLSAgICBYQ2hhclN0cnVjdCoJLyogb3ZlcmFsbF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYVGV4dFdpZHRoKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCi0gICAgaW50CQkJLyogY291bnQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYVGV4dFdpZHRoMTYoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLywKLSAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKLSAgICBpbnQJCQkvKiBjb3VudCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gQm9vbCBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogc3JjX3cgKi8sCi0gICAgV2luZG93CQkvKiBkZXN0X3cgKi8sCi0gICAgaW50CQkJLyogc3JjX3ggKi8sCi0gICAgaW50CQkJLyogc3JjX3kgKi8sCi0gICAgaW50KgkJLyogZGVzdF94X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBkZXN0X3lfcmV0dXJuICovLAotICAgIFdpbmRvdyoJCS8qIGNoaWxkX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhVbmRlZmluZUN1cnNvcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFVuZ3JhYkJ1dHRvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAotICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYVW5ncmFiS2V5KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBrZXljb2RlICovLAotICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCi0gICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhVbmdyYWJLZXlib2FyZCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgVGltZQkJLyogdGltZSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhVbmdyYWJQb2ludGVyKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBUaW1lCQkvKiB0aW1lICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFVuZ3JhYlNlcnZlcigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYVW5pbnN0YWxsQ29sb3JtYXAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhVbmxvYWRGb250KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBGb250CQkvKiBmb250ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFVubWFwU3Vid2luZG93cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFVubWFwV2luZG93KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYVmVuZG9yUmVsZWFzZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYV2FycFBvaW50ZXIoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogc3JjX3cgKi8sCi0gICAgV2luZG93CQkvKiBkZXN0X3cgKi8sCi0gICAgaW50CQkJLyogc3JjX3ggKi8sCi0gICAgaW50CQkJLyogc3JjX3kgKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIHNyY193aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogc3JjX2hlaWdodCAqLywKLSAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCi0gICAgaW50CQkJLyogZGVzdF95ICovCSAgICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFdpZHRoTU1PZlNjcmVlbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgU2NyZWVuKgkJLyogc2NyZWVuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFdpZHRoT2ZTY3JlZW4oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhXaW5kb3dFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8sCi0gICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFdyaXRlQml0bWFwRmlsZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBmaWxlbmFtZSAqLywKLSAgICBQaXhtYXAJCS8qIGJpdG1hcCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCi0gICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKLSAgICBpbnQJCQkvKiB4X2hvdCAqLywKLSAgICBpbnQJCQkvKiB5X2hvdCAqLwkJICAgICAKLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWFN1cHBvcnRzTG9jYWxlICh2b2lkKTsKLQotZXh0ZXJuIGNoYXIgKlhTZXRMb2NhbGVNb2RpZmllcnMoCi0gICAgY29uc3QgY2hhcioJCS8qIG1vZGlmaWVyX2xpc3QgKi8KLSk7Ci0KLWV4dGVybiBYT00gWE9wZW5PTSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAotICAgIHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyoJLyogcmRiICovLAotICAgIF9YY29uc3QgY2hhcioJCS8qIHJlc19uYW1lICovLAotICAgIF9YY29uc3QgY2hhcioJCS8qIHJlc19jbGFzcyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhDbG9zZU9NKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYT00JCQkvKiBvbSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWFNldE9NVmFsdWVzKAotI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcwotICAgIFhPTQkJCS8qIG9tICovLAotICAgIC4uLgotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWEdldE9NVmFsdWVzKAotI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcwotICAgIFhPTQkJCS8qIG9tICovLAotICAgIC4uLgotI2VuZGlmCi0pOwotCi1leHRlcm4gRGlzcGxheSAqWERpc3BsYXlPZk9NKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYT00JCQkvKiBvbSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWExvY2FsZU9mT00oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhPTQkJCS8qIG9tICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYT0MgWENyZWF0ZU9DKAotI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcwotICAgIFhPTQkJCS8qIG9tICovLAotICAgIC4uLgotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYRGVzdHJveU9DKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYT0MJCQkvKiBvYyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWE9NIFhPTU9mT0MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhPQwkJCS8qIG9jICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYU2V0T0NWYWx1ZXMoCi0jaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCi0gICAgWE9DCQkJLyogb2MgKi8sCi0gICAgLi4uCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYR2V0T0NWYWx1ZXMoCi0jaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCi0gICAgWE9DCQkJLyogb2MgKi8sCi0gICAgLi4uCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYRm9udFNldCBYQ3JlYXRlRm9udFNldCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBiYXNlX2ZvbnRfbmFtZV9saXN0ICovLAotICAgIGNoYXIqKioJCS8qIG1pc3NpbmdfY2hhcnNldF9saXN0ICovLAotICAgIGludCoJCS8qIG1pc3NpbmdfY2hhcnNldF9jb3VudCAqLywKLSAgICBjaGFyKioJCS8qIGRlZl9zdHJpbmcgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWEZyZWVGb250U2V0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRm9udHNPZkZvbnRTZXQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKLSAgICBYRm9udFN0cnVjdCoqKgkvKiBmb250X3N0cnVjdF9saXN0ICovLAotICAgIGNoYXIqKioJCS8qIGZvbnRfbmFtZV9saXN0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYQmFzZUZvbnROYW1lTGlzdE9mRm9udFNldCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYTG9jYWxlT2ZGb250U2V0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWENvbnRleHREZXBlbmRlbnREcmF3aW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIEJvb2wgWERpcmVjdGlvbmFsRGVwZW5kZW50RHJhd2luZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhDb250ZXh0dWFsRHJhd2luZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYRm9udFNldEV4dGVudHMgKlhFeHRlbnRzT2ZGb250U2V0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYbWJUZXh0RXNjYXBlbWVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWHdjVGV4dEVzY2FwZW1lbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKLSAgICBfWGNvbnN0IHdjaGFyX3QqCS8qIHRleHQgKi8sCi0gICAgaW50CQkJLyogbnVtX3djaGFycyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFh1dGY4VGV4dEVzY2FwZW1lbnQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCi0gICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhtYlRleHRFeHRlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAotICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKLSAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFh3Y1RleHRFeHRlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCi0gICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAotICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKLSAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFh1dGY4VGV4dEV4dGVudHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCi0gICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLywKLSAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWG1iVGV4dFBlckNoYXJFeHRlbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAotICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIGlua19leHRlbnRzX2J1ZmZlciAqLywKLSAgICBYUmVjdGFuZ2xlKgkJLyogbG9naWNhbF9leHRlbnRzX2J1ZmZlciAqLywKLSAgICBpbnQJCQkvKiBidWZmZXJfc2l6ZSAqLywKLSAgICBpbnQqCQkvKiBudW1fY2hhcnMgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKLSAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFh3Y1RleHRQZXJDaGFyRXh0ZW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCi0gICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCi0gICAgaW50KgkJLyogbnVtX2NoYXJzICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYdXRmOFRleHRQZXJDaGFyRXh0ZW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCi0gICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCi0gICAgaW50KgkJLyogbnVtX2NoYXJzICovLAotICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWG1iRHJhd1RleHQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAotICAgIGludAkJCS8qIG5pdGVtcyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYd2NEcmF3VGV4dCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgWHdjVGV4dEl0ZW0qCS8qIHRleHRfaXRlbXMgKi8sCi0gICAgaW50CQkJLyogbml0ZW1zICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFh1dGY4RHJhd1RleHQoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIERyYXdhYmxlCQkvKiBkICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAotICAgIGludAkJCS8qIG5pdGVtcyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYbWJEcmF3U3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAotICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWHdjRHJhd1N0cmluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFh1dGY4RHJhd1N0cmluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhtYkRyYXdJbWFnZVN0cmluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFh3Y0RyYXdJbWFnZVN0cmluZygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgRHJhd2FibGUJCS8qIGQgKi8sCi0gICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAotICAgIEdDCQkJLyogZ2MgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKLSAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFh1dGY4RHJhd0ltYWdlU3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBEcmF3YWJsZQkJLyogZCAqLywKLSAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCi0gICAgR0MJCQkvKiBnYyAqLywKLSAgICBpbnQJCQkvKiB4ICovLAotICAgIGludAkJCS8qIHkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAotICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhJTSBYT3BlbklNKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKLSAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKLSAgICBjaGFyKgkJCS8qIHJlc19uYW1lICovLAotICAgIGNoYXIqCQkJLyogcmVzX2NsYXNzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWENsb3NlSU0oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhJTSAvKiBpbSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWEdldElNVmFsdWVzKAotI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcwotICAgIFhJTSAvKiBpbSAqLywgLi4uCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYU2V0SU1WYWx1ZXMoCi0jaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCi0gICAgWElNIC8qIGltICovLCAuLi4KLSNlbmRpZgotKTsKLQotZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZJTSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWElNIC8qIGltICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBjaGFyICpYTG9jYWxlT2ZJTSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWElNIC8qIGltKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhJQyBYQ3JlYXRlSUMoCi0jaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCi0gICAgWElNIC8qIGltICovLCAuLi4KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWERlc3Ryb3lJQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWElDIC8qIGljICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhTZXRJQ0ZvY3VzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMgLyogaWMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWFVuc2V0SUNGb2N1cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWElDIC8qIGljICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB3Y2hhcl90ICpYd2NSZXNldElDKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMgLyogaWMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGNoYXIgKlhtYlJlc2V0SUMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhJQyAvKiBpYyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWHV0ZjhSZXNldElDKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMgLyogaWMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGNoYXIgKlhTZXRJQ1ZhbHVlcygKLSNpZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKLSAgICBYSUMgLyogaWMgKi8sIC4uLgotI2VuZGlmCi0pOwotCi1leHRlcm4gY2hhciAqWEdldElDVmFsdWVzKAotI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcwotICAgIFhJQyAvKiBpYyAqLywgLi4uCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYSU0gWElNT2ZJQygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWElDIC8qIGljICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBCb29sIFhGaWx0ZXJFdmVudCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgWEV2ZW50KgkvKiBldmVudCAqLywKLSAgICBXaW5kb3cJLyogd2luZG93ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWG1iTG9va3VwU3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMJCQkvKiBpYyAqLywKLSAgICBYS2V5UHJlc3NlZEV2ZW50KgkvKiBldmVudCAqLywKLSAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBieXRlc19idWZmZXIgKi8sCi0gICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKLSAgICBTdGF0dXMqCQkvKiBzdGF0dXNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWHdjTG9va3VwU3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMJCQkvKiBpYyAqLywKLSAgICBYS2V5UHJlc3NlZEV2ZW50KgkvKiBldmVudCAqLywKLSAgICB3Y2hhcl90KgkJLyogYnVmZmVyX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiB3Y2hhcnNfYnVmZmVyICovLAotICAgIEtleVN5bSoJCS8qIGtleXN5bV9yZXR1cm4gKi8sCi0gICAgU3RhdHVzKgkJLyogc3RhdHVzX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFh1dGY4TG9va3VwU3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYSUMJCQkvKiBpYyAqLywKLSAgICBYS2V5UHJlc3NlZEV2ZW50KgkvKiBldmVudCAqLywKLSAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKLSAgICBpbnQJCQkvKiBieXRlc19idWZmZXIgKi8sCi0gICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKLSAgICBTdGF0dXMqCQkvKiBzdGF0dXNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYVmFOZXN0ZWRMaXN0IFhWYUNyZWF0ZU5lc3RlZExpc3QoCi0jaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCi0gICAgaW50IC8qdW51c2VkKi8sIC4uLgotI2VuZGlmCi0pOwotCi0vKiBpbnRlcm5hbCBjb25uZWN0aW9ucyBmb3IgSU1zICovCi0KLWV4dGVybiBCb29sIFhSZWdpc3RlcklNSW5zdGFudGlhdGVDYWxsYmFjaygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCi0gICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCi0gICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKLSAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKLSAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCi0gICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gQm9vbCBYVW5yZWdpc3RlcklNSW5zdGFudGlhdGVDYWxsYmFjaygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCi0gICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCi0gICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKLSAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKLSAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCi0gICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLwotI2VuZGlmCi0pOwotCi10eXBlZGVmIHZvaWQgKCpYQ29ubmVjdGlvbldhdGNoUHJvYykoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAotICAgIFhQb2ludGVyCQkJLyogY2xpZW50X2RhdGEgKi8sCi0gICAgaW50CQkJCS8qIGZkICovLAotICAgIEJvb2wJCQkvKiBvcGVuaW5nICovLAkgLyogb3BlbiBvciBjbG9zZSBmbGFnICovCi0gICAgWFBvaW50ZXIqCQkJLyogd2F0Y2hfZGF0YSAqLyAvKiBvcGVuIHNldHMsIGNsb3NlIHVzZXMgKi8KLSNlbmRpZgotKTsKLSAgICAKLQotZXh0ZXJuIFN0YXR1cyBYSW50ZXJuYWxDb25uZWN0aW9uTnVtYmVycygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCi0gICAgaW50KioJCQkvKiBmZF9yZXR1cm4gKi8sCi0gICAgaW50KgkJCS8qIGNvdW50X3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYUHJvY2Vzc0ludGVybmFsQ29ubmVjdGlvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCi0gICAgaW50CQkJCS8qIGZkICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEFkZENvbm5lY3Rpb25XYXRjaCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCi0gICAgWENvbm5lY3Rpb25XYXRjaFByb2MJLyogY2FsbGJhY2sgKi8sCi0gICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYUmVtb3ZlQ29ubmVjdGlvbldhdGNoKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKLSAgICBYQ29ubmVjdGlvbldhdGNoUHJvYwkvKiBjYWxsYmFjayAqLywKLSAgICBYUG9pbnRlcgkJCS8qIGNsaWVudF9kYXRhICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhTZXRBdXRob3JpemF0aW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBjaGFyICoJCQkvKiBuYW1lICovLAotICAgIGludAkJCQkvKiBuYW1lbGVuICovLCAKLSAgICBjaGFyICoJCQkvKiBkYXRhICovLAotICAgIGludAkJCQkvKiBkYXRhbGVuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgX1htYnRvd2MoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIHdjaGFyX3QgKgkJCS8qIHdzdHIgKi8sCi0jaWZkZWYgSVNDCi0gICAgY2hhciBjb25zdCAqCQkvKiBzdHIgKi8sCi0gICAgc2l6ZV90CQkJLyogbGVuICovCi0jZWxzZQotICAgIGNoYXIgKgkJCS8qIHN0ciAqLywKLSAgICBpbnQJCQkJLyogbGVuICovCi0jZW5kaWYKLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBfWHdjdG9tYigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgY2hhciAqCQkJLyogc3RyICovLAotICAgIHdjaGFyX3QJCQkvKiB3YyAqLwotI2VuZGlmCi0pOwotCi1fWEZVTkNQUk9UT0VORAotI2VuZGlmCQkvKiBpZiAwICovCi0KLSNlbmRpZiAvKiBfWExJQl9IXyAqLwotCi0KLS8qICRYb3JnOiBYdXRpbC5oLHYgMS44IDIwMDEvMDIvMDkgMDI6MDM6MzkgeG9yZ2N2cyBFeHAgJCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotZG9jdW1lbnRhdGlvbi4KLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1PUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KLUNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLUV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCi1pbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCi0KLQotQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQotc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCi0KLURJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwotQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCi1ESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgotQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAotV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAotQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwotU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICRYRnJlZTg2OiB4Yy9saWIvWDExL1h1dGlsLmgsdiAzLjUgMjAwMy8wMS8yNiAwMjo0MDoxMCBkYXdlcyBFeHAgJCAqLwotCi0jaWZuZGVmIF9YVVRJTF9IXwotI2RlZmluZSBfWFVUSUxfSF8KLQotLyogWW91IG11c3QgaW5jbHVkZSA8WDExL1hsaWIuaD4gYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgKi8KLSNpZiAwCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNlbmRpZgotCi0vKiAKLSAqIEJpdG1hc2sgcmV0dXJuZWQgYnkgWFBhcnNlR2VvbWV0cnkoKS4gIEVhY2ggYml0IHRlbGxzIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0gKiB2YWx1ZSAoeCwgeSwgd2lkdGgsIGhlaWdodCkgd2FzIGZvdW5kIGluIHRoZSBwYXJzZWQgc3RyaW5nLgotICovCi0jZGVmaW5lIE5vVmFsdWUJCTB4MDAwMAotI2RlZmluZSBYVmFsdWUgIAkweDAwMDEKLSNkZWZpbmUgWVZhbHVlCQkweDAwMDIKLSNkZWZpbmUgV2lkdGhWYWx1ZSAgCTB4MDAwNAotI2RlZmluZSBIZWlnaHRWYWx1ZSAgCTB4MDAwOAotI2RlZmluZSBBbGxWYWx1ZXMgCTB4MDAwRgotI2RlZmluZSBYTmVnYXRpdmUgCTB4MDAxMAotI2RlZmluZSBZTmVnYXRpdmUgCTB4MDAyMAotCi0vKgotICogbmV3IHZlcnNpb24gY29udGFpbmluZyBiYXNlX3dpZHRoLCBiYXNlX2hlaWdodCwgYW5kIHdpbl9ncmF2aXR5IGZpZWxkczsKLSAqIHVzZWQgd2l0aCBXTV9OT1JNQUxfSElOVFMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAJbG9uZyBmbGFnczsJLyogbWFya3Mgd2hpY2ggZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBkZWZpbmVkICovCi0JaW50IHgsIHk7CQkvKiBvYnNvbGV0ZSBmb3IgbmV3IHdpbmRvdyBtZ3JzLCBidXQgY2xpZW50cyAqLwotCWludCB3aWR0aCwgaGVpZ2h0OwkvKiBzaG91bGQgc2V0IHNvIG9sZCB3bSdzIGRvbid0IG1lc3MgdXAgKi8KLQlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OwotCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7Ci0gICAgCWludCB3aWR0aF9pbmMsIGhlaWdodF9pbmM7Ci0Jc3RydWN0IHsKLQkJaW50IHg7CS8qIG51bWVyYXRvciAqLwotCQlpbnQgeTsJLyogZGVub21pbmF0b3IgKi8KLQl9IG1pbl9hc3BlY3QsIG1heF9hc3BlY3Q7Ci0JaW50IGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0OwkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCi0JaW50IHdpbl9ncmF2aXR5OwkJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLwotfSBYU2l6ZUhpbnRzOwotCi0vKgotICogVGhlIG5leHQgYmxvY2sgb2YgZGVmaW5pdGlvbnMgYXJlIGZvciB3aW5kb3cgbWFuYWdlciBwcm9wZXJ0aWVzIHRoYXQKLSAqIGNsaWVudHMgYW5kIGFwcGxpY2F0aW9ucyB1c2UgZm9yIGNvbW11bmljYXRpb24uCi0gKi8KLQotLyogZmxhZ3MgYXJndW1lbnQgaW4gc2l6ZSBoaW50cyAqLwotI2RlZmluZSBVU1Bvc2l0aW9uCSgxTCA8PCAwKSAvKiB1c2VyIHNwZWNpZmllZCB4LCB5ICovCi0jZGVmaW5lIFVTU2l6ZQkJKDFMIDw8IDEpIC8qIHVzZXIgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgKi8KLQotI2RlZmluZSBQUG9zaXRpb24JKDFMIDw8IDIpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHBvc2l0aW9uICovCi0jZGVmaW5lIFBTaXplCQkoMUwgPDwgMykgLyogcHJvZ3JhbSBzcGVjaWZpZWQgc2l6ZSAqLwotI2RlZmluZSBQTWluU2l6ZQkoMUwgPDwgNCkgLyogcHJvZ3JhbSBzcGVjaWZpZWQgbWluaW11bSBzaXplICovCi0jZGVmaW5lIFBNYXhTaXplCSgxTCA8PCA1KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBtYXhpbXVtIHNpemUgKi8KLSNkZWZpbmUgUFJlc2l6ZUluYwkoMUwgPDwgNikgLyogcHJvZ3JhbSBzcGVjaWZpZWQgcmVzaXplIGluY3JlbWVudHMgKi8KLSNkZWZpbmUgUEFzcGVjdAkJKDFMIDw8IDcpIC8qIHByb2dyYW0gc3BlY2lmaWVkIG1pbiBhbmQgbWF4IGFzcGVjdCByYXRpb3MgKi8KLSNkZWZpbmUgUEJhc2VTaXplCSgxTCA8PCA4KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBiYXNlIGZvciBpbmNyZW1lbnRpbmcgKi8KLSNkZWZpbmUgUFdpbkdyYXZpdHkJKDFMIDw8IDkpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHdpbmRvdyBncmF2aXR5ICovCi0KLS8qIG9ic29sZXRlICovCi0jZGVmaW5lIFBBbGxIaW50cyAoUFBvc2l0aW9ufFBTaXplfFBNaW5TaXplfFBNYXhTaXplfFBSZXNpemVJbmN8UEFzcGVjdCkKLQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGZsYWdzOwkvKiBtYXJrcyB3aGljaCBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGRlZmluZWQgKi8KLQlCb29sIGlucHV0OwkvKiBkb2VzIHRoaXMgYXBwbGljYXRpb24gcmVseSBvbiB0aGUgd2luZG93IG1hbmFnZXIgdG8KLQkJCWdldCBrZXlib2FyZCBpbnB1dD8gKi8KLQlpbnQgaW5pdGlhbF9zdGF0ZTsJLyogc2VlIGJlbG93ICovCi0JUGl4bWFwIGljb25fcGl4bWFwOwkvKiBwaXhtYXAgdG8gYmUgdXNlZCBhcyBpY29uICovCi0JV2luZG93IGljb25fd2luZG93OyAJLyogd2luZG93IHRvIGJlIHVzZWQgYXMgaWNvbiAqLwotCWludCBpY29uX3gsIGljb25feTsgCS8qIGluaXRpYWwgcG9zaXRpb24gb2YgaWNvbiAqLwotCVBpeG1hcCBpY29uX21hc2s7CS8qIGljb24gbWFzayBiaXRtYXAgKi8KLQlYSUQgd2luZG93X2dyb3VwOwkvKiBpZCBvZiByZWxhdGVkIHdpbmRvdyBncm91cCAqLwotCS8qIHRoaXMgc3RydWN0dXJlIG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlICovCi19IFhXTUhpbnRzOwotCi0vKiBkZWZpbml0aW9uIGZvciBmbGFncyBvZiBYV01IaW50cyAqLwotCi0jZGVmaW5lIElucHV0SGludCAJCSgxTCA8PCAwKQotI2RlZmluZSBTdGF0ZUhpbnQgCQkoMUwgPDwgMSkKLSNkZWZpbmUgSWNvblBpeG1hcEhpbnQJCSgxTCA8PCAyKQotI2RlZmluZSBJY29uV2luZG93SGludAkJKDFMIDw8IDMpCi0jZGVmaW5lIEljb25Qb3NpdGlvbkhpbnQgCSgxTCA8PCA0KQotI2RlZmluZSBJY29uTWFza0hpbnQJCSgxTCA8PCA1KQotI2RlZmluZSBXaW5kb3dHcm91cEhpbnQJCSgxTCA8PCA2KQotI2RlZmluZSBBbGxIaW50cyAoSW5wdXRIaW50fFN0YXRlSGludHxJY29uUGl4bWFwSGludHxJY29uV2luZG93SGludHwgXAotSWNvblBvc2l0aW9uSGludHxJY29uTWFza0hpbnR8V2luZG93R3JvdXBIaW50KQotI2RlZmluZSBYVXJnZW5jeUhpbnQJCSgxTCA8PCA4KQotCi0vKiBkZWZpbml0aW9ucyBmb3IgaW5pdGlhbCB3aW5kb3cgc3RhdGUgKi8KLSNkZWZpbmUgV2l0aGRyYXduU3RhdGUgMAkvKiBmb3Igd2luZG93cyB0aGF0IGFyZSBub3QgbWFwcGVkICovCi0jZGVmaW5lIE5vcm1hbFN0YXRlIDEJLyogbW9zdCBhcHBsaWNhdGlvbnMgd2FudCB0byBzdGFydCB0aGlzIHdheSAqLwotI2RlZmluZSBJY29uaWNTdGF0ZSAzCS8qIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IGFzIGFuIGljb24gKi8KLQotLyoKLSAqIE9ic29sZXRlIHN0YXRlcyBubyBsb25nZXIgZGVmaW5lZCBieSBJQ0NDTQotICovCi0jZGVmaW5lIERvbnRDYXJlU3RhdGUgMAkvKiBkb24ndCBrbm93IG9yIGNhcmUgKi8KLSNkZWZpbmUgWm9vbVN0YXRlIDIJLyogYXBwbGljYXRpb24gd2FudHMgdG8gc3RhcnQgem9vbWVkICovCi0jZGVmaW5lIEluYWN0aXZlU3RhdGUgNAkvKiBhcHBsaWNhdGlvbiBiZWxpZXZlcyBpdCBpcyBzZWxkb20gdXNlZDsgKi8KLQkJCS8qIHNvbWUgd20ncyBtYXkgcHV0IGl0IG9uIGluYWN0aXZlIG1lbnUgKi8KLQotCi0vKgotICogbmV3IHN0cnVjdHVyZSBmb3IgbWFuaXB1bGF0aW5nIFRFWFQgcHJvcGVydGllczsgdXNlZCB3aXRoIFdNX05BTUUsIAotICogV01fSUNPTl9OQU1FLCBXTV9DTElFTlRfTUFDSElORSwgYW5kIFdNX0NPTU1BTkQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsJCS8qIHNhbWUgYXMgUHJvcGVydHkgcm91dGluZXMgKi8KLSAgICBBdG9tIGVuY29kaW5nOwkJCS8qIHByb3AgdHlwZSAqLwotICAgIGludCBmb3JtYXQ7CQkJCS8qIHByb3AgZGF0YSBmb3JtYXQ6IDgsIDE2LCBvciAzMiAqLwotICAgIHVuc2lnbmVkIGxvbmcgbml0ZW1zOwkJLyogbnVtYmVyIG9mIGRhdGEgaXRlbXMgaW4gdmFsdWUgKi8KLX0gWFRleHRQcm9wZXJ0eTsKLQotI2RlZmluZSBYTm9NZW1vcnkgLTEKLSNkZWZpbmUgWExvY2FsZU5vdFN1cHBvcnRlZCAtMgotI2RlZmluZSBYQ29udmVydGVyTm90Rm91bmQgLTMKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBYU3RyaW5nU3R5bGUsCQkvKiBTVFJJTkcgKi8KLSAgICBYQ29tcG91bmRUZXh0U3R5bGUsCQkvKiBDT01QT1VORF9URVhUICovCi0gICAgWFRleHRTdHlsZSwJCQkvKiB0ZXh0IGluIG93bmVyJ3MgZW5jb2RpbmcgKGN1cnJlbnQgbG9jYWxlKSovCi0gICAgWFN0ZElDQ1RleHRTdHlsZSwJCS8qIFNUUklORywgZWxzZSBDT01QT1VORF9URVhUICovCi0gICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbiBOb3ZlbWJlciAyMDAwICovCi0gICAgWFVURjhTdHJpbmdTdHlsZQkJLyogVVRGOF9TVFJJTkcgKi8KLX0gWElDQ0VuY29kaW5nU3R5bGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OwotCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7Ci0JaW50IHdpZHRoX2luYywgaGVpZ2h0X2luYzsKLX0gWEljb25TaXplOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciAqcmVzX25hbWU7Ci0JY2hhciAqcmVzX2NsYXNzOwotfSBYQ2xhc3NIaW50OwotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIGdpdmUgc29tZSBzdWdhciB0byB0aGUgaW1hZ2Ugcm91dGluZXMgc28gdGhhdAotICogbmFpdmUgcGVvcGxlIGFyZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggdGhlbS4KLSAqLwotI2RlZmluZSBYRGVzdHJveUltYWdlKHhpbWFnZSkgXAotCSgoKigoeGltYWdlKS0+Zi5kZXN0cm95X2ltYWdlKSkoKHhpbWFnZSkpKQotI2RlZmluZSBYR2V0UGl4ZWwoeGltYWdlLCB4LCB5KSBcCi0JKCgqKCh4aW1hZ2UpLT5mLmdldF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSkpCi0jZGVmaW5lIFhQdXRQaXhlbCh4aW1hZ2UsIHgsIHksIHBpeGVsKSBcCi0JKCgqKCh4aW1hZ2UpLT5mLnB1dF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHBpeGVsKSkpCi0jZGVmaW5lIFhTdWJJbWFnZSh4aW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpICBcCi0JKCgqKCh4aW1hZ2UpLT5mLnN1Yl9pbWFnZSkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHdpZHRoKSwgKGhlaWdodCkpKQotI2RlZmluZSBYQWRkUGl4ZWwoeGltYWdlLCB2YWx1ZSkgXAotCSgoKigoeGltYWdlKS0+Zi5hZGRfcGl4ZWwpKSgoeGltYWdlKSwgKHZhbHVlKSkpCi0KLS8qCi0gKiBDb21wb3NlIHNlcXVlbmNlIHN0YXR1cyBzdHJ1Y3R1cmUsIHVzZWQgaW4gY2FsbGluZyBYTG9va3VwU3RyaW5nLgotICovCi10eXBlZGVmIHN0cnVjdCBfWENvbXBvc2VTdGF0dXMgewotICAgIFhQb2ludGVyIGNvbXBvc2VfcHRyOwkvKiBzdGF0ZSB0YWJsZSBwb2ludGVyICovCi0gICAgaW50IGNoYXJzX21hdGNoZWQ7CQkvKiBtYXRjaCBzdGF0ZSAqLwotfSBYQ29tcG9zZVN0YXR1czsKLQotLyoKLSAqIEtleXN5bSBtYWNyb3MsIHVzZWQgb24gS2V5c3ltcyB0byB0ZXN0IGZvciBjbGFzc2VzIG9mIHN5bWJvbHMKLSAqLwotI2RlZmluZSBJc0tleXBhZEtleShrZXlzeW0pIFwKLSAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0tQX1NwYWNlKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19LUF9FcXVhbCkpCi0KLSNkZWZpbmUgSXNQcml2YXRlS2V5cGFkS2V5KGtleXN5bSkgXAotICAoKChLZXlTeW0pKGtleXN5bSkgPj0gMHgxMTAwMDAwMCkgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gMHgxMTAwRkZGRikpCi0KLSNkZWZpbmUgSXNDdXJzb3JLZXkoa2V5c3ltKSBcCi0gICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19Ib21lKSAgICAgJiYgKChLZXlTeW0pKGtleXN5bSkgPCAgWEtfU2VsZWN0KSkKLQotI2RlZmluZSBJc1BGS2V5KGtleXN5bSkgXAotICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfS1BfRjEpICAgICAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19LUF9GNCkpCi0KLSNkZWZpbmUgSXNGdW5jdGlvbktleShrZXlzeW0pIFwKLSAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0YxKSAgICAgICAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19GMzUpKQotCi0jZGVmaW5lIElzTWlzY0Z1bmN0aW9uS2V5KGtleXN5bSkgXAotICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfU2VsZWN0KSAgICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0JyZWFrKSkKLQotI2RlZmluZSBJc01vZGlmaWVyS2V5KGtleXN5bSkgXAotICAoKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX1NoaWZ0X0wpICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0h5cGVyX1IpKSBcCi0gICB8fCAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfSVNPX0xvY2spICYmIFwKLSAgICAgICAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19JU09fTGFzdF9Hcm91cF9Mb2NrKSkgXAotICAgfHwgKChLZXlTeW0pKGtleXN5bSkgPT0gWEtfTW9kZV9zd2l0Y2gpIFwKLSAgIHx8ICgoS2V5U3ltKShrZXlzeW0pID09IFhLX051bV9Mb2NrKSkKLS8qCi0gKiBvcGFxdWUgcmVmZXJlbmNlIHRvIFJlZ2lvbiBkYXRhIHR5cGUgCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9YUmVnaW9uICpSZWdpb247IAotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gWFJlY3RJblJlZ2lvbigpICovCi0gCi0jZGVmaW5lIFJlY3RhbmdsZU91dCAwCi0jZGVmaW5lIFJlY3RhbmdsZUluICAxCi0jZGVmaW5lIFJlY3RhbmdsZVBhcnQgMgotIAotCi0vKgotICogSW5mb3JtYXRpb24gdXNlZCBieSB0aGUgdmlzdWFsIHV0aWxpdHkgcm91dGluZXMgdG8gZmluZCBkZXNpcmVkIHZpc3VhbAotICogdHlwZSBmcm9tIHRoZSBtYW55IHZpc3VhbHMgYSBkaXNwbGF5IG1heSBzdXBwb3J0LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgVmlzdWFsICp2aXN1YWw7Ci0gIFZpc3VhbElEIHZpc3VhbGlkOwotICBpbnQgc2NyZWVuOwotICBpbnQgZGVwdGg7Ci0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotICBpbnQgY19jbGFzczsJCQkJCS8qIEMrKyAqLwotI2Vsc2UKLSAgaW50IGNsYXNzOwotI2VuZGlmCi0gIHVuc2lnbmVkIGxvbmcgcmVkX21hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgZ3JlZW5fbWFzazsKLSAgdW5zaWduZWQgbG9uZyBibHVlX21hc2s7Ci0gIGludCBjb2xvcm1hcF9zaXplOwotICBpbnQgYml0c19wZXJfcmdiOwotfSBYVmlzdWFsSW5mbzsKLQotI2RlZmluZSBWaXN1YWxOb01hc2sJCTB4MAotI2RlZmluZSBWaXN1YWxJRE1hc2sgCQkweDEKLSNkZWZpbmUgVmlzdWFsU2NyZWVuTWFzawkweDIKLSNkZWZpbmUgVmlzdWFsRGVwdGhNYXNrCQkweDQKLSNkZWZpbmUgVmlzdWFsQ2xhc3NNYXNrCQkweDgKLSNkZWZpbmUgVmlzdWFsUmVkTWFza01hc2sJMHgxMAotI2RlZmluZSBWaXN1YWxHcmVlbk1hc2tNYXNrCTB4MjAKLSNkZWZpbmUgVmlzdWFsQmx1ZU1hc2tNYXNrCTB4NDAKLSNkZWZpbmUgVmlzdWFsQ29sb3JtYXBTaXplTWFzawkweDgwCi0jZGVmaW5lIFZpc3VhbEJpdHNQZXJSR0JNYXNrCTB4MTAwCi0jZGVmaW5lIFZpc3VhbEFsbE1hc2sJCTB4MUZGCi0KLS8qCi0gKiBUaGlzIGRlZmluZXMgYSB3aW5kb3cgbWFuYWdlciBwcm9wZXJ0eSB0aGF0IGNsaWVudHMgbWF5IHVzZSB0bwotICogc2hhcmUgc3RhbmRhcmQgY29sb3IgbWFwcyBvZiB0eXBlIFJHQl9DT0xPUl9NQVA6Ci0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlDb2xvcm1hcCBjb2xvcm1hcDsKLQl1bnNpZ25lZCBsb25nIHJlZF9tYXg7Ci0JdW5zaWduZWQgbG9uZyByZWRfbXVsdDsKLQl1bnNpZ25lZCBsb25nIGdyZWVuX21heDsKLQl1bnNpZ25lZCBsb25nIGdyZWVuX211bHQ7Ci0JdW5zaWduZWQgbG9uZyBibHVlX21heDsKLQl1bnNpZ25lZCBsb25nIGJsdWVfbXVsdDsKLQl1bnNpZ25lZCBsb25nIGJhc2VfcGl4ZWw7Ci0JVmlzdWFsSUQgdmlzdWFsaWQ7CQkvKiBhZGRlZCBieSBJQ0NDTSB2ZXJzaW9uIDEgKi8KLQlYSUQga2lsbGlkOwkJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLwotfSBYU3RhbmRhcmRDb2xvcm1hcDsKLQotI2RlZmluZSBSZWxlYXNlQnlGcmVlaW5nQ29sb3JtYXAgKChYSUQpIDFMKSAgLyogZm9yIGtpbGxpZCBmaWVsZCBhYm92ZSAqLwotCi0KLS8qCi0gKiByZXR1cm4gY29kZXMgZm9yIFhSZWFkQml0bWFwRmlsZSBhbmQgWFdyaXRlQml0bWFwRmlsZQotICovCi0jZGVmaW5lIEJpdG1hcFN1Y2Nlc3MJCTAKLSNkZWZpbmUgQml0bWFwT3BlbkZhaWxlZCAJMQotI2RlZmluZSBCaXRtYXBGaWxlSW52YWxpZCAJMgotI2RlZmluZSBCaXRtYXBOb01lbW9yeQkJMwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvbnRleHQgTWFuYWdlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIEFzc29jaWF0aXZlIGxvb2t1cCB0YWJsZSByZXR1cm4gY29kZXMgKi8KLQotI2RlZmluZSBYQ1NVQ0NFU1MgMAkvKiBObyBlcnJvci4gKi8KLSNkZWZpbmUgWENOT01FTSAgIDEgICAgLyogT3V0IG9mIG1lbW9yeSAqLwotI2RlZmluZSBYQ05PRU5UICAgMiAgICAvKiBObyBlbnRyeSBpbiB0YWJsZSAqLwotCi10eXBlZGVmIGludCBYQ29udGV4dDsKLQotI2RlZmluZSBYVW5pcXVlQ29udGV4dCgpICAgICAgICgoWENvbnRleHQpIFhybVVuaXF1ZVF1YXJrKCkpCi0jZGVmaW5lIFhTdHJpbmdUb0NvbnRleHQoc3RyaW5nKSAgICgoWENvbnRleHQpIFhybVN0cmluZ1RvUXVhcmsoc3RyaW5nKSkKLQotI2lmIDAKLV9YRlVOQ1BST1RPQkVHSU4KLQotLyogVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgYXJlIGFscGhhYmV0aXplZC4gKi8KLQotZXh0ZXJuIFhDbGFzc0hpbnQgKlhBbGxvY0NsYXNzSGludCAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIHZvaWQKLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhJY29uU2l6ZSAqWEFsbG9jSWNvblNpemUgKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICB2b2lkCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYU2l6ZUhpbnRzICpYQWxsb2NTaXplSGludHMgKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICB2b2lkCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBYU3RhbmRhcmRDb2xvcm1hcCAqWEFsbG9jU3RhbmRhcmRDb2xvcm1hcCAoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIHZvaWQKLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhXTUhpbnRzICpYQWxsb2NXTUhpbnRzICgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgdm9pZAotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhDbGlwQm94KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBSZWdpb24JCS8qIHIgKi8sCi0gICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBSZWdpb24gWENyZWF0ZVJlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgdm9pZAotI2VuZGlmCi0pOwotCi1leHRlcm4gY29uc3QgY2hhciAqWERlZmF1bHRTdHJpbmcgKHZvaWQpOwotCi1leHRlcm4gaW50IFhEZWxldGVDb250ZXh0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYSUQJCQkvKiByaWQgKi8sCi0gICAgWENvbnRleHQJCS8qIGNvbnRleHQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRGVzdHJveVJlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgUmVnaW9uCQkvKiByICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWEVtcHR5UmVnaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBSZWdpb24JCS8qIHIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYRXF1YWxSZWdpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFJlZ2lvbgkJLyogcjEgKi8sCi0gICAgUmVnaW9uCQkvKiByMiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhGaW5kQ29udGV4dCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgWElECQkJLyogcmlkICovLAotICAgIFhDb250ZXh0CQkvKiBjb250ZXh0ICovLAotICAgIFhQb2ludGVyKgkJLyogZGF0YV9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0Q2xhc3NIaW50KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhHZXRJY29uU2l6ZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYSWNvblNpemUqKgkJLyogc2l6ZV9saXN0X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0Tm9ybWFsSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogaGludHNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFJHQkNvbG9ybWFwcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhTdGFuZGFyZENvbG9ybWFwKiogLyogc3RkY21hcF9yZXR1cm4gKi8sCi0gICAgaW50KgkJLyogY291bnRfcmV0dXJuICovLAotICAgIEF0b20JCS8qIHByb3BlcnR5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFNpemVIaW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhTaXplSGludHMqCQkvKiBoaW50c19yZXR1cm4gKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0U3RhbmRhcmRDb2xvcm1hcCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhTdGFuZGFyZENvbG9ybWFwKgkvKiBjb2xvcm1hcF9yZXR1cm4gKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8JCQkgICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFRleHRQcm9wZXJ0eSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCi0gICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLywKLSAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gWFZpc3VhbEluZm8gKlhHZXRWaXN1YWxJbmZvKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBsb25nCQkvKiB2aW5mb19tYXNrICovLAotICAgIFhWaXN1YWxJbmZvKgkvKiB2aW5mb190ZW1wbGF0ZSAqLywKLSAgICBpbnQqCQkvKiBuaXRlbXNfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWEdldFdNQ2xpZW50TWFjaGluZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFhXTUhpbnRzICpYR2V0V01IaW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovCQkgICAgICAKLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0V01JY29uTmFtZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYR2V0V01OYW1lKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhHZXRXTU5vcm1hbEhpbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKLSAgICBsb25nKgkJLyogc3VwcGxpZWRfcmV0dXJuICovIAotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhHZXRXTVNpemVIaW50cygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhTaXplSGludHMqCQkvKiBoaW50c19yZXR1cm4gKi8sCi0gICAgbG9uZyoJCS8qIHN1cHBsaWVkX3JldHVybiAqLywKLSAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gU3RhdHVzIFhHZXRab29tSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogemhpbnRzX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhJbnRlcnNlY3RSZWdpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFJlZ2lvbgkJLyogc3JhICovLAotICAgIFJlZ2lvbgkJLyogc3JiICovLAotICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhDb252ZXJ0Q2FzZSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgS2V5U3ltCQkvKiBzeW0gKi8sCi0gICAgS2V5U3ltKgkJLyogbG93ZXIgKi8sCi0gICAgS2V5U3ltKgkJLyogdXBwZXIgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYTG9va3VwU3RyaW5nKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYS2V5RXZlbnQqCQkvKiBldmVudF9zdHJ1Y3QgKi8sCi0gICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCi0gICAgaW50CQkJLyogYnl0ZXNfYnVmZmVyICovLAotICAgIEtleVN5bSoJCS8qIGtleXN5bV9yZXR1cm4gKi8sCi0gICAgWENvbXBvc2VTdGF0dXMqCS8qIHN0YXR1c19pbl9vdXQgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIFN0YXR1cyBYTWF0Y2hWaXN1YWxJbmZvKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBpbnQJCQkvKiBzY3JlZW4gKi8sCi0gICAgaW50CQkJLyogZGVwdGggKi8sCi0gICAgaW50CQkJLyogY2xhc3MgKi8sCi0gICAgWFZpc3VhbEluZm8qCS8qIHZpbmZvX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhPZmZzZXRSZWdpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFJlZ2lvbgkJLyogciAqLywKLSAgICBpbnQJCQkvKiBkeCAqLywKLSAgICBpbnQJCQkvKiBkeSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gQm9vbCBYUG9pbnRJblJlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgUmVnaW9uCQkvKiByICovLAotICAgIGludAkJCS8qIHggKi8sCi0gICAgaW50CQkJLyogeSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gUmVnaW9uIFhQb2x5Z29uUmVnaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCi0gICAgaW50CQkJLyogbiAqLywKLSAgICBpbnQJCQkvKiBmaWxsX3J1bGUgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYUmVjdEluUmVnaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBSZWdpb24JCS8qIHIgKi8sCi0gICAgaW50CQkJLyogeCAqLywKLSAgICBpbnQJCQkvKiB5ICovLAotICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKLSAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNhdmVDb250ZXh0KAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYSUQJCQkvKiByaWQgKi8sCi0gICAgWENvbnRleHQJCS8qIGNvbnRleHQgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBkYXRhICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldENsYXNzSGludCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRJY29uU2l6ZXMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYSWNvblNpemUqCQkvKiBzaXplX2xpc3QgKi8sCi0gICAgaW50CQkJLyogY291bnQgKi8gICAgCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldE5vcm1hbEhpbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhTZXRSR0JDb2xvcm1hcHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU3RhbmRhcmRDb2xvcm1hcCoJLyogc3RkY21hcHMgKi8sCi0gICAgaW50CQkJLyogY291bnQgKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0U2l6ZUhpbnRzKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovLAotICAgIEF0b20JCS8qIHByb3BlcnR5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFN0YW5kYXJkUHJvcGVydGllcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCi0gICAgUGl4bWFwCQkvKiBpY29uX3BpeG1hcCAqLywKLSAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCi0gICAgaW50CQkJLyogYXJnYyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWFNldFRleHRQcm9wZXJ0eSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLywKLSAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYU2V0V01DbGllbnRNYWNoaW5lKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNldFdNSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhTZXRXTUljb25OYW1lKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBXaW5kb3cJCS8qIHcgKi8sCi0gICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhTZXRXTU5hbWUoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWFNldFdNTm9ybWFsSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIHZvaWQgWFNldFdNUHJvcGVydGllcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIHdpbmRvd19uYW1lICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIGljb25fbmFtZSAqLywKLSAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCi0gICAgaW50CQkJLyogYXJnYyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogbm9ybWFsX2hpbnRzICovLAotICAgIFhXTUhpbnRzKgkJLyogd21faGludHMgKi8sCi0gICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiB2b2lkIFhtYlNldFdNUHJvcGVydGllcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCi0gICAgY2hhcioqCQkvKiBhcmd2ICovLAotICAgIGludAkJCS8qIGFyZ2MgKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIG5vcm1hbF9oaW50cyAqLywKLSAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovLAotICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYdXRmOFNldFdNUHJvcGVydGllcygKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCi0gICAgY2hhcioqCQkvKiBhcmd2ICovLAotICAgIGludAkJCS8qIGFyZ2MgKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIG5vcm1hbF9oaW50cyAqLywKLSAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovLAotICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYU2V0V01TaXplSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8sCi0gICAgQXRvbQkJLyogcHJvcGVydHkgKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU2V0UmVnaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBHQwkJCS8qIGdjICovLAotICAgIFJlZ2lvbgkJLyogciAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gdm9pZCBYU2V0U3RhbmRhcmRDb2xvcm1hcCgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgV2luZG93CQkvKiB3ICovLAotICAgIFhTdGFuZGFyZENvbG9ybWFwKgkvKiBjb2xvcm1hcCAqLywKLSAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhTZXRab29tSGludHMoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAotICAgIFdpbmRvdwkJLyogdyAqLywKLSAgICBYU2l6ZUhpbnRzKgkJLyogemhpbnRzICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFNocmlua1JlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgUmVnaW9uCQkvKiByICovLAotICAgIGludAkJCS8qIGR4ICovLAotICAgIGludAkJCS8qIGR5ICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBTdGF0dXMgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgY2hhcioqCQkvKiBsaXN0ICovLAotICAgIGludAkJCS8qIGNvdW50ICovLAotICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYU3VidHJhY3RSZWdpb24oCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFJlZ2lvbgkJLyogc3JhICovLAotICAgIFJlZ2lvbgkJLyogc3JiICovLAotICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eSgKLSAgICBEaXNwbGF5KgkJZGlzcGxheSwKLSAgICBjaGFyKioJCWxpc3QsCi0gICAgaW50CQkJY291bnQsCi0gICAgWElDQ0VuY29kaW5nU3R5bGUJc3R5bGUsCi0gICAgWFRleHRQcm9wZXJ0eSoJdGV4dF9wcm9wX3JldHVybgotKTsKLQotZXh0ZXJuIGludCBYd2NUZXh0TGlzdFRvVGV4dFByb3BlcnR5KAotICAgIERpc3BsYXkqCQlkaXNwbGF5LAotICAgIHdjaGFyX3QqKgkJbGlzdCwKLSAgICBpbnQJCQljb3VudCwKLSAgICBYSUNDRW5jb2RpbmdTdHlsZQlzdHlsZSwKLSAgICBYVGV4dFByb3BlcnR5Kgl0ZXh0X3Byb3BfcmV0dXJuCi0pOwotCi1leHRlcm4gaW50IFh1dGY4VGV4dExpc3RUb1RleHRQcm9wZXJ0eSgKLSAgICBEaXNwbGF5KgkJZGlzcGxheSwKLSAgICBjaGFyKioJCWxpc3QsCi0gICAgaW50CQkJY291bnQsCi0gICAgWElDQ0VuY29kaW5nU3R5bGUJc3R5bGUsCi0gICAgWFRleHRQcm9wZXJ0eSoJdGV4dF9wcm9wX3JldHVybgotKTsKLQotZXh0ZXJuIHZvaWQgWHdjRnJlZVN0cmluZ0xpc3QoCi0gICAgd2NoYXJfdCoqCQlsaXN0Ci0pOwotCi1leHRlcm4gU3RhdHVzIFhUZXh0UHJvcGVydHlUb1N0cmluZ0xpc3QoCi0jaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcwotICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLywKLSAgICBjaGFyKioqCQkvKiBsaXN0X3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0KAotICAgIERpc3BsYXkqCQlkaXNwbGF5LAotICAgIGNvbnN0IFhUZXh0UHJvcGVydHkqIHRleHRfcHJvcCwKLSAgICBjaGFyKioqCQlsaXN0X3JldHVybiwKLSAgICBpbnQqCQljb3VudF9yZXR1cm4KLSk7Ci0KLWV4dGVybiBpbnQgWHdjVGV4dFByb3BlcnR5VG9UZXh0TGlzdCgKLSAgICBEaXNwbGF5KgkJZGlzcGxheSwKLSAgICBjb25zdCBYVGV4dFByb3BlcnR5KiB0ZXh0X3Byb3AsCi0gICAgd2NoYXJfdCoqKgkJbGlzdF9yZXR1cm4sCi0gICAgaW50KgkJY291bnRfcmV0dXJuCi0pOwotCi1leHRlcm4gaW50IFh1dGY4VGV4dFByb3BlcnR5VG9UZXh0TGlzdCgKLSAgICBEaXNwbGF5KgkJZGlzcGxheSwKLSAgICBjb25zdCBYVGV4dFByb3BlcnR5KiB0ZXh0X3Byb3AsCi0gICAgY2hhcioqKgkJbGlzdF9yZXR1cm4sCi0gICAgaW50KgkJY291bnRfcmV0dXJuCi0pOwotCi1leHRlcm4gaW50IFhVbmlvblJlY3RXaXRoUmVnaW9uKAotI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKLSAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdGFuZ2xlICovLAotICAgIFJlZ2lvbgkJLyogc3JjX3JlZ2lvbiAqLywKLSAgICBSZWdpb24JCS8qIGRlc3RfcmVnaW9uX3JldHVybiAqLwotI2VuZGlmCi0pOwotCi1leHRlcm4gaW50IFhVbmlvblJlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgUmVnaW9uCQkvKiBzcmEgKi8sCi0gICAgUmVnaW9uCQkvKiBzcmIgKi8sCi0gICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotZXh0ZXJuIGludCBYV01HZW9tZXRyeSgKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLywKLSAgICBfWGNvbnN0IGNoYXIqCS8qIHVzZXJfZ2VvbWV0cnkgKi8sCi0gICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X2dlb21ldHJ5ICovLAotICAgIHVuc2lnbmVkIGludAkvKiBib3JkZXJfd2lkdGggKi8sCi0gICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovLAotICAgIGludCoJCS8qIHhfcmV0dXJuICovLAotICAgIGludCoJCS8qIHlfcmV0dXJuICovLAotICAgIGludCoJCS8qIHdpZHRoX3JldHVybiAqLywKLSAgICBpbnQqCQkvKiBoZWlnaHRfcmV0dXJuICovLAotICAgIGludCoJCS8qIGdyYXZpdHlfcmV0dXJuICovCi0jZW5kaWYKLSk7Ci0KLWV4dGVybiBpbnQgWFhvclJlZ2lvbigKLSNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCi0gICAgUmVnaW9uCQkvKiBzcmEgKi8sCi0gICAgUmVnaW9uCQkvKiBzcmIgKi8sCi0gICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KLSNlbmRpZgotKTsKLQotX1hGVU5DUFJPVE9FTkQKLSNlbmRpZiAvKiBpZiAwICovCi0KLSNpZm5kZWYgWEFUT01fSAotI2RlZmluZSBYQVRPTV9IIDEKLQotLyogVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFCi0gKgotICogRG8gbm90IGNoYW5nZSEgIENoYW5naW5nIHRoaXMgZmlsZSBpbXBsaWVzIGEgcHJvdG9jb2wgY2hhbmdlIQotICovCi0KLSNkZWZpbmUgWEFfUFJJTUFSWSAoKEF0b20pIDEpCi0jZGVmaW5lIFhBX1NFQ09OREFSWSAoKEF0b20pIDIpCi0jZGVmaW5lIFhBX0FSQyAoKEF0b20pIDMpCi0jZGVmaW5lIFhBX0FUT00gKChBdG9tKSA0KQotI2RlZmluZSBYQV9CSVRNQVAgKChBdG9tKSA1KQotI2RlZmluZSBYQV9DQVJESU5BTCAoKEF0b20pIDYpCi0jZGVmaW5lIFhBX0NPTE9STUFQICgoQXRvbSkgNykKLSNkZWZpbmUgWEFfQ1VSU09SICgoQXRvbSkgOCkKLSNkZWZpbmUgWEFfQ1VUX0JVRkZFUjAgKChBdG9tKSA5KQotI2RlZmluZSBYQV9DVVRfQlVGRkVSMSAoKEF0b20pIDEwKQotI2RlZmluZSBYQV9DVVRfQlVGRkVSMiAoKEF0b20pIDExKQotI2RlZmluZSBYQV9DVVRfQlVGRkVSMyAoKEF0b20pIDEyKQotI2RlZmluZSBYQV9DVVRfQlVGRkVSNCAoKEF0b20pIDEzKQotI2RlZmluZSBYQV9DVVRfQlVGRkVSNSAoKEF0b20pIDE0KQotI2RlZmluZSBYQV9DVVRfQlVGRkVSNiAoKEF0b20pIDE1KQotI2RlZmluZSBYQV9DVVRfQlVGRkVSNyAoKEF0b20pIDE2KQotI2RlZmluZSBYQV9EUkFXQUJMRSAoKEF0b20pIDE3KQotI2RlZmluZSBYQV9GT05UICgoQXRvbSkgMTgpCi0jZGVmaW5lIFhBX0lOVEVHRVIgKChBdG9tKSAxOSkKLSNkZWZpbmUgWEFfUElYTUFQICgoQXRvbSkgMjApCi0jZGVmaW5lIFhBX1BPSU5UICgoQXRvbSkgMjEpCi0jZGVmaW5lIFhBX1JFQ1RBTkdMRSAoKEF0b20pIDIyKQotI2RlZmluZSBYQV9SRVNPVVJDRV9NQU5BR0VSICgoQXRvbSkgMjMpCi0jZGVmaW5lIFhBX1JHQl9DT0xPUl9NQVAgKChBdG9tKSAyNCkKLSNkZWZpbmUgWEFfUkdCX0JFU1RfTUFQICgoQXRvbSkgMjUpCi0jZGVmaW5lIFhBX1JHQl9CTFVFX01BUCAoKEF0b20pIDI2KQotI2RlZmluZSBYQV9SR0JfREVGQVVMVF9NQVAgKChBdG9tKSAyNykKLSNkZWZpbmUgWEFfUkdCX0dSQVlfTUFQICgoQXRvbSkgMjgpCi0jZGVmaW5lIFhBX1JHQl9HUkVFTl9NQVAgKChBdG9tKSAyOSkKLSNkZWZpbmUgWEFfUkdCX1JFRF9NQVAgKChBdG9tKSAzMCkKLSNkZWZpbmUgWEFfU1RSSU5HICgoQXRvbSkgMzEpCi0jZGVmaW5lIFhBX1ZJU1VBTElEICgoQXRvbSkgMzIpCi0jZGVmaW5lIFhBX1dJTkRPVyAoKEF0b20pIDMzKQotI2RlZmluZSBYQV9XTV9DT01NQU5EICgoQXRvbSkgMzQpCi0jZGVmaW5lIFhBX1dNX0hJTlRTICgoQXRvbSkgMzUpCi0jZGVmaW5lIFhBX1dNX0NMSUVOVF9NQUNISU5FICgoQXRvbSkgMzYpCi0jZGVmaW5lIFhBX1dNX0lDT05fTkFNRSAoKEF0b20pIDM3KQotI2RlZmluZSBYQV9XTV9JQ09OX1NJWkUgKChBdG9tKSAzOCkKLSNkZWZpbmUgWEFfV01fTkFNRSAoKEF0b20pIDM5KQotI2RlZmluZSBYQV9XTV9OT1JNQUxfSElOVFMgKChBdG9tKSA0MCkKLSNkZWZpbmUgWEFfV01fU0laRV9ISU5UUyAoKEF0b20pIDQxKQotI2RlZmluZSBYQV9XTV9aT09NX0hJTlRTICgoQXRvbSkgNDIpCi0jZGVmaW5lIFhBX01JTl9TUEFDRSAoKEF0b20pIDQzKQotI2RlZmluZSBYQV9OT1JNX1NQQUNFICgoQXRvbSkgNDQpCi0jZGVmaW5lIFhBX01BWF9TUEFDRSAoKEF0b20pIDQ1KQotI2RlZmluZSBYQV9FTkRfU1BBQ0UgKChBdG9tKSA0NikKLSNkZWZpbmUgWEFfU1VQRVJTQ1JJUFRfWCAoKEF0b20pIDQ3KQotI2RlZmluZSBYQV9TVVBFUlNDUklQVF9ZICgoQXRvbSkgNDgpCi0jZGVmaW5lIFhBX1NVQlNDUklQVF9YICgoQXRvbSkgNDkpCi0jZGVmaW5lIFhBX1NVQlNDUklQVF9ZICgoQXRvbSkgNTApCi0jZGVmaW5lIFhBX1VOREVSTElORV9QT1NJVElPTiAoKEF0b20pIDUxKQotI2RlZmluZSBYQV9VTkRFUkxJTkVfVEhJQ0tORVNTICgoQXRvbSkgNTIpCi0jZGVmaW5lIFhBX1NUUklLRU9VVF9BU0NFTlQgKChBdG9tKSA1MykKLSNkZWZpbmUgWEFfU1RSSUtFT1VUX0RFU0NFTlQgKChBdG9tKSA1NCkKLSNkZWZpbmUgWEFfSVRBTElDX0FOR0xFICgoQXRvbSkgNTUpCi0jZGVmaW5lIFhBX1hfSEVJR0hUICgoQXRvbSkgNTYpCi0jZGVmaW5lIFhBX1FVQURfV0lEVEggKChBdG9tKSA1NykKLSNkZWZpbmUgWEFfV0VJR0hUICgoQXRvbSkgNTgpCi0jZGVmaW5lIFhBX1BPSU5UX1NJWkUgKChBdG9tKSA1OSkKLSNkZWZpbmUgWEFfUkVTT0xVVElPTiAoKEF0b20pIDYwKQotI2RlZmluZSBYQV9DT1BZUklHSFQgKChBdG9tKSA2MSkKLSNkZWZpbmUgWEFfTk9USUNFICgoQXRvbSkgNjIpCi0jZGVmaW5lIFhBX0ZPTlRfTkFNRSAoKEF0b20pIDYzKQotI2RlZmluZSBYQV9GQU1JTFlfTkFNRSAoKEF0b20pIDY0KQotI2RlZmluZSBYQV9GVUxMX05BTUUgKChBdG9tKSA2NSkKLSNkZWZpbmUgWEFfQ0FQX0hFSUdIVCAoKEF0b20pIDY2KQotI2RlZmluZSBYQV9XTV9DTEFTUyAoKEF0b20pIDY3KQotI2RlZmluZSBYQV9XTV9UUkFOU0lFTlRfRk9SICgoQXRvbSkgNjgpCi0KLSNkZWZpbmUgWEFfTEFTVF9QUkVERUZJTkVEICgoQXRvbSkgNjgpCi0jZW5kaWYgLyogWEFUT01fSCAqLwotCi0jZW5kaWYgLyogX1hVVElMX0hfICovCi0KLWV4dGVybiBLZXlDb2RlIFhLZXlzeW1Ub0tleWNvZGUoCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8KLSk7Ci1leHRlcm4gS2V5U3ltIFhLZXljb2RlVG9LZXlzeW0oCi0gICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCi0gICAgS2V5Q29kZQkJLyoga2V5Y29kZSAqLywKLSAgICBpbnQJCQkvKiBpbmRleCAqLwotKTsKLWV4dGVybiBjaGFyICpYS2V5c3ltVG9TdHJpbmcoCi0gICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8KLSk7Ci1leHRlcm4gS2V5U3ltIFhTdHJpbmdUb0tleXN5bSgKLSAgICBjaGFyKgkvKiBzdHJpbmcgKi8KLSk7Ci0KLXR5cGVkZWYgaW50ICgqWEVycm9ySGFuZGxlcikgKAkgICAgLyogV0FSTklORywgdGhpcyB0eXBlIG5vdCBpbiBYbGliIHNwZWMgKi8KLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKLSAgICBYRXJyb3JFdmVudCoJLyogZXJyb3JfZXZlbnQgKi8KLSk7Ci0KLWV4dGVybiBYRXJyb3JIYW5kbGVyIFhTZXRFcnJvckhhbmRsZXIgKAotICAgIFhFcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLwotKTsKLQotdHlwZWRlZiBpbnQgKCpYSU9FcnJvckhhbmRsZXIpICggICAgLyogV0FSTklORywgdGhpcyB0eXBlIG5vdCBpbiBYbGliIHNwZWMgKi8KLSAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLwotKTsKLQotZXh0ZXJuIFhJT0Vycm9ySGFuZGxlciBYU2V0SU9FcnJvckhhbmRsZXIgKAotICAgIFhJT0Vycm9ySGFuZGxlcgkvKiBoYW5kbGVyICovCi0pOwotCi0jZGVmaW5lIFhfU2htUXVlcnlWZXJzaW9uICAgICAgICAgICAgICAgMAotI2RlZmluZSBYX1NobUF0dGFjaCAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgWF9TaG1EZXRhY2ggICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFhfU2htUHV0SW1hZ2UgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBYX1NobUdldEltYWdlICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgWF9TaG1DcmVhdGVQaXhtYXAgICAgICAgICAgICAgICA1CmRpZmYgLS1naXQgYS94MTF2bmMvbm94MTFfZnVuY3MuaCBiL3gxMXZuYy9ub3gxMV9mdW5jcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhYzU3Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9ub3gxMV9mdW5jcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyMiArMCwwIEBACi0jaWYgMAotZ2VuZXJhdGVkIGJ5IHV0aWwgc2NyaXB0IG1ha2VrZXlzeW1zLnBsOgotCi0tLS0tLQotIyEvdXNyL2Jpbi9wZXJsCi0KLXByaW50ICIjaWYgMFxuIjsKLXByaW50ICJnZW5lcmF0ZWQgYnkgdXRpbCBzY3JpcHQgbWFrZWtleXN5bXMucGw6XG5cbiI7Ci1wcmludCAiLS0tLS1cbiI7Ci1zeXN0ZW0oImNhdCAkMCIpOwotcHJpbnQgIi0tLS0tXG4iOwotcHJpbnQgIiNlbmRpZlxuXG4iOwotCi0jIHByb2JhYmx5IHNob3VsZCB1c2UgcmZiL2tleXN5bS5oOgotJGZpbGUgPSBzaGlmdDsKLSRmaWxlID0gIi91c3IvWDExUjYvaW5jbHVkZS9YMTEva2V5c3ltZGVmLmgiIHVubGVzcyAkZmlsZTsKLQotb3BlbihLUywgIjwkZmlsZSIpIHx8IGRpZSAiJGZpbGU6ICQhIjsKLQotd2hpbGUgKDxLUz4pIHsKLQljaG9tcDsKLQluZXh0IGlmIC9eI2RlZmluZSAoWEtfTUlTQ0VMTEFOWXxYS19YS0JfS0VZU3xYS19MQVRJTjF8WEtfTEFUSU4yfFhLX0xBVElOM3xYS19MQVRJTjR8WEtfR1JFRUspLzsKLQluZXh0IGlmIC9eI2RlZmluZSAoWEtfTEFUSU44fFhLX0xBVElOOXxYS19DQVVDQVNVU3xYS19LQVRBS0FOQXxYS19BUkFCSUN8WEtfQ1lSSUxMSUN8WEtfSEVCUkVXfFhLX1RIQUl8WEtfS09SRUFOfFhLX0FSTUVOSUFOfFhLX0dFT1JHSUFOfFhLX1ZJRVROQU1FU0V8WEtfQ1VSUkVOQ1kpLzsKLQlpZiAoL14jZGVmaW5lXHMrKFhLX1x3KykvKSB7Ci0JCXB1c2ggQHhrLCAkMTsKLQl9IGVsc2lmICgvXiMoaWZkZWZ8aWZuZGVmfGVuZGlmKS8pIHsKLQkJJF8gPX4gcy9pZm5kZWYgWEtfMC9pZm5kZWYgWEtfMF9ub3N1Y2gvOwotCQlwdXNoIEB4aywgJF87Ci0JfQotfQotY2xvc2UoS1MpOwotCi1wcmludCA8PCJFTkQiOwotCi1LZXlTeW0gWFN0cmluZ1RvS2V5c3ltKGNoYXIgKnMpIHsKLUVORAotZm9yZWFjaCAka3MgKEB4aykgewotCSRzID0gJGtzOwotCWlmICgka3MgPX4gLyMvKSB7Ci0JCXByaW50ICIka3NcbiI7Ci0JCW5leHQ7Ci0JfQotCSRzID1+IHMvXlhLXy8vOwotCXByaW50ICIJaWYgKCFzdHJjbXAocywgXCIkc1wiKSkgcmV0dXJuICRrcztcbiI7Ci19Ci1wcmludCA8PCJFTkQiOwotCXJldHVybiBOb1N5bWJvbDsJCi19Ci0KLUVORAotCi1wcmludCA8PCJFTkQiOwotCi1jaGFyICpYS2V5c3ltVG9TdHJpbmcoS2V5U3ltIGspIHsKLUVORAotZm9yZWFjaCAka3MgKEB4aykgewotCSRzID0gJGtzOwotCWlmICgka3MgPX4gLyMvKSB7Ci0JCXByaW50ICIka3NcbiI7Ci0JCW5leHQ7Ci0JfQotCSRzID1+IHMvXlhLXy8vOwotCXByaW50ICIJaWYgKGsgPT0gJGtzKSByZXR1cm4gXCIkc1wiO1xuIjsKLX0KLXByaW50IDw8IkVORCI7Ci0JcmV0dXJuIE5VTEw7CQotfQotCi1LZXlTeW0gWEtleWNvZGVUb0tleXN5bShEaXNwbGF5ICpkaXNwbGF5LCBLZXlDb2RlIGtleWNvZGUsIGludCBpbmRleCkgewotCXJldHVybiBOb1N5bWJvbDsKLX0KLQotS2V5Q29kZSBYS2V5c3ltVG9LZXljb2RlKERpc3BsYXkgKmRpc3BsYXksIEtleVN5bSBrZXlzeW0pIHsKLQlyZXR1cm4gTm9TeW1ib2w7Ci19Ci0KLVhFcnJvckhhbmRsZXIgWFNldEVycm9ySGFuZGxlciAoWEVycm9ySGFuZGxlciBoKSB7Ci0JcmV0dXJuIGg7Ci19Ci0KLUVORAotCi1leGl0IDA7Ci0tLS0tLQotI2VuZGlmCi0KLQotS2V5U3ltIFhTdHJpbmdUb0tleXN5bShjaGFyICpzKSB7Ci0jaWZuZGVmIFhLXzBfbm9zdWNoCi0JaWYgKCFzdHJjbXAocywgIlZvaWRTeW1ib2wiKSkgcmV0dXJuIFhLX1ZvaWRTeW1ib2w7Ci0jaWZkZWYgWEtfTUlTQ0VMTEFOWQotCWlmICghc3RyY21wKHMsICJCYWNrU3BhY2UiKSkgcmV0dXJuIFhLX0JhY2tTcGFjZTsKLQlpZiAoIXN0cmNtcChzLCAiVGFiIikpIHJldHVybiBYS19UYWI7Ci0JaWYgKCFzdHJjbXAocywgIkxpbmVmZWVkIikpIHJldHVybiBYS19MaW5lZmVlZDsKLQlpZiAoIXN0cmNtcChzLCAiQ2xlYXIiKSkgcmV0dXJuIFhLX0NsZWFyOwotCWlmICghc3RyY21wKHMsICJSZXR1cm4iKSkgcmV0dXJuIFhLX1JldHVybjsKLQlpZiAoIXN0cmNtcChzLCAiUGF1c2UiKSkgcmV0dXJuIFhLX1BhdXNlOwotCWlmICghc3RyY21wKHMsICJTY3JvbGxfTG9jayIpKSByZXR1cm4gWEtfU2Nyb2xsX0xvY2s7Ci0JaWYgKCFzdHJjbXAocywgIlN5c19SZXEiKSkgcmV0dXJuIFhLX1N5c19SZXE7Ci0JaWYgKCFzdHJjbXAocywgIkVzY2FwZSIpKSByZXR1cm4gWEtfRXNjYXBlOwotCWlmICghc3RyY21wKHMsICJEZWxldGUiKSkgcmV0dXJuIFhLX0RlbGV0ZTsKLQlpZiAoIXN0cmNtcChzLCAiTXVsdGlfa2V5IikpIHJldHVybiBYS19NdWx0aV9rZXk7Ci0JaWYgKCFzdHJjbXAocywgIlNpbmdsZUNhbmRpZGF0ZSIpKSByZXR1cm4gWEtfU2luZ2xlQ2FuZGlkYXRlOwotCWlmICghc3RyY21wKHMsICJNdWx0aXBsZUNhbmRpZGF0ZSIpKSByZXR1cm4gWEtfTXVsdGlwbGVDYW5kaWRhdGU7Ci0JaWYgKCFzdHJjbXAocywgIlByZXZpb3VzQ2FuZGlkYXRlIikpIHJldHVybiBYS19QcmV2aW91c0NhbmRpZGF0ZTsKLQlpZiAoIXN0cmNtcChzLCAiS2FuamkiKSkgcmV0dXJuIFhLX0thbmppOwotCWlmICghc3RyY21wKHMsICJNdWhlbmthbiIpKSByZXR1cm4gWEtfTXVoZW5rYW47Ci0JaWYgKCFzdHJjbXAocywgIkhlbmthbl9Nb2RlIikpIHJldHVybiBYS19IZW5rYW5fTW9kZTsKLQlpZiAoIXN0cmNtcChzLCAiSGVua2FuIikpIHJldHVybiBYS19IZW5rYW47Ci0JaWYgKCFzdHJjbXAocywgIlJvbWFqaSIpKSByZXR1cm4gWEtfUm9tYWppOwotCWlmICghc3RyY21wKHMsICJIaXJhZ2FuYSIpKSByZXR1cm4gWEtfSGlyYWdhbmE7Ci0JaWYgKCFzdHJjbXAocywgIkthdGFrYW5hIikpIHJldHVybiBYS19LYXRha2FuYTsKLQlpZiAoIXN0cmNtcChzLCAiSGlyYWdhbmFfS2F0YWthbmEiKSkgcmV0dXJuIFhLX0hpcmFnYW5hX0thdGFrYW5hOwotCWlmICghc3RyY21wKHMsICJaZW5rYWt1IikpIHJldHVybiBYS19aZW5rYWt1OwotCWlmICghc3RyY21wKHMsICJIYW5rYWt1IikpIHJldHVybiBYS19IYW5rYWt1OwotCWlmICghc3RyY21wKHMsICJaZW5rYWt1X0hhbmtha3UiKSkgcmV0dXJuIFhLX1plbmtha3VfSGFua2FrdTsKLQlpZiAoIXN0cmNtcChzLCAiVG91cm9rdSIpKSByZXR1cm4gWEtfVG91cm9rdTsKLQlpZiAoIXN0cmNtcChzLCAiTWFzc3lvIikpIHJldHVybiBYS19NYXNzeW87Ci0JaWYgKCFzdHJjbXAocywgIkthbmFfTG9jayIpKSByZXR1cm4gWEtfS2FuYV9Mb2NrOwotCWlmICghc3RyY21wKHMsICJLYW5hX1NoaWZ0IikpIHJldHVybiBYS19LYW5hX1NoaWZ0OwotCWlmICghc3RyY21wKHMsICJFaXN1X1NoaWZ0IikpIHJldHVybiBYS19FaXN1X1NoaWZ0OwotCWlmICghc3RyY21wKHMsICJFaXN1X3RvZ2dsZSIpKSByZXR1cm4gWEtfRWlzdV90b2dnbGU7Ci0JaWYgKCFzdHJjbXAocywgIlplbl9Lb2hvIikpIHJldHVybiBYS19aZW5fS29obzsKLQlpZiAoIXN0cmNtcChzLCAiTWFlX0tvaG8iKSkgcmV0dXJuIFhLX01hZV9Lb2hvOwotCWlmICghc3RyY21wKHMsICJIb21lIikpIHJldHVybiBYS19Ib21lOwotCWlmICghc3RyY21wKHMsICJMZWZ0IikpIHJldHVybiBYS19MZWZ0OwotCWlmICghc3RyY21wKHMsICJVcCIpKSByZXR1cm4gWEtfVXA7Ci0JaWYgKCFzdHJjbXAocywgIlJpZ2h0IikpIHJldHVybiBYS19SaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiRG93biIpKSByZXR1cm4gWEtfRG93bjsKLQlpZiAoIXN0cmNtcChzLCAiUHJpb3IiKSkgcmV0dXJuIFhLX1ByaW9yOwotCWlmICghc3RyY21wKHMsICJQYWdlX1VwIikpIHJldHVybiBYS19QYWdlX1VwOwotCWlmICghc3RyY21wKHMsICJOZXh0IikpIHJldHVybiBYS19OZXh0OwotCWlmICghc3RyY21wKHMsICJQYWdlX0Rvd24iKSkgcmV0dXJuIFhLX1BhZ2VfRG93bjsKLQlpZiAoIXN0cmNtcChzLCAiRW5kIikpIHJldHVybiBYS19FbmQ7Ci0JaWYgKCFzdHJjbXAocywgIkJlZ2luIikpIHJldHVybiBYS19CZWdpbjsKLQlpZiAoIXN0cmNtcChzLCAiU2VsZWN0IikpIHJldHVybiBYS19TZWxlY3Q7Ci0JaWYgKCFzdHJjbXAocywgIlByaW50IikpIHJldHVybiBYS19QcmludDsKLQlpZiAoIXN0cmNtcChzLCAiRXhlY3V0ZSIpKSByZXR1cm4gWEtfRXhlY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiSW5zZXJ0IikpIHJldHVybiBYS19JbnNlcnQ7Ci0JaWYgKCFzdHJjbXAocywgIlVuZG8iKSkgcmV0dXJuIFhLX1VuZG87Ci0JaWYgKCFzdHJjbXAocywgIlJlZG8iKSkgcmV0dXJuIFhLX1JlZG87Ci0JaWYgKCFzdHJjbXAocywgIk1lbnUiKSkgcmV0dXJuIFhLX01lbnU7Ci0JaWYgKCFzdHJjbXAocywgIkZpbmQiKSkgcmV0dXJuIFhLX0ZpbmQ7Ci0JaWYgKCFzdHJjbXAocywgIkNhbmNlbCIpKSByZXR1cm4gWEtfQ2FuY2VsOwotCWlmICghc3RyY21wKHMsICJIZWxwIikpIHJldHVybiBYS19IZWxwOwotCWlmICghc3RyY21wKHMsICJCcmVhayIpKSByZXR1cm4gWEtfQnJlYWs7Ci0JaWYgKCFzdHJjbXAocywgIk1vZGVfc3dpdGNoIikpIHJldHVybiBYS19Nb2RlX3N3aXRjaDsKLQlpZiAoIXN0cmNtcChzLCAic2NyaXB0X3N3aXRjaCIpKSByZXR1cm4gWEtfc2NyaXB0X3N3aXRjaDsKLQlpZiAoIXN0cmNtcChzLCAiTnVtX0xvY2siKSkgcmV0dXJuIFhLX051bV9Mb2NrOwotCWlmICghc3RyY21wKHMsICJLUF9TcGFjZSIpKSByZXR1cm4gWEtfS1BfU3BhY2U7Ci0JaWYgKCFzdHJjbXAocywgIktQX1RhYiIpKSByZXR1cm4gWEtfS1BfVGFiOwotCWlmICghc3RyY21wKHMsICJLUF9FbnRlciIpKSByZXR1cm4gWEtfS1BfRW50ZXI7Ci0JaWYgKCFzdHJjbXAocywgIktQX0YxIikpIHJldHVybiBYS19LUF9GMTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfRjIiKSkgcmV0dXJuIFhLX0tQX0YyOwotCWlmICghc3RyY21wKHMsICJLUF9GMyIpKSByZXR1cm4gWEtfS1BfRjM7Ci0JaWYgKCFzdHJjbXAocywgIktQX0Y0IikpIHJldHVybiBYS19LUF9GNDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfSG9tZSIpKSByZXR1cm4gWEtfS1BfSG9tZTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfTGVmdCIpKSByZXR1cm4gWEtfS1BfTGVmdDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfVXAiKSkgcmV0dXJuIFhLX0tQX1VwOwotCWlmICghc3RyY21wKHMsICJLUF9SaWdodCIpKSByZXR1cm4gWEtfS1BfUmlnaHQ7Ci0JaWYgKCFzdHJjbXAocywgIktQX0Rvd24iKSkgcmV0dXJuIFhLX0tQX0Rvd247Ci0JaWYgKCFzdHJjbXAocywgIktQX1ByaW9yIikpIHJldHVybiBYS19LUF9QcmlvcjsKLQlpZiAoIXN0cmNtcChzLCAiS1BfUGFnZV9VcCIpKSByZXR1cm4gWEtfS1BfUGFnZV9VcDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfTmV4dCIpKSByZXR1cm4gWEtfS1BfTmV4dDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfUGFnZV9Eb3duIikpIHJldHVybiBYS19LUF9QYWdlX0Rvd247Ci0JaWYgKCFzdHJjbXAocywgIktQX0VuZCIpKSByZXR1cm4gWEtfS1BfRW5kOwotCWlmICghc3RyY21wKHMsICJLUF9CZWdpbiIpKSByZXR1cm4gWEtfS1BfQmVnaW47Ci0JaWYgKCFzdHJjbXAocywgIktQX0luc2VydCIpKSByZXR1cm4gWEtfS1BfSW5zZXJ0OwotCWlmICghc3RyY21wKHMsICJLUF9EZWxldGUiKSkgcmV0dXJuIFhLX0tQX0RlbGV0ZTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfRXF1YWwiKSkgcmV0dXJuIFhLX0tQX0VxdWFsOwotCWlmICghc3RyY21wKHMsICJLUF9NdWx0aXBseSIpKSByZXR1cm4gWEtfS1BfTXVsdGlwbHk7Ci0JaWYgKCFzdHJjbXAocywgIktQX0FkZCIpKSByZXR1cm4gWEtfS1BfQWRkOwotCWlmICghc3RyY21wKHMsICJLUF9TZXBhcmF0b3IiKSkgcmV0dXJuIFhLX0tQX1NlcGFyYXRvcjsKLQlpZiAoIXN0cmNtcChzLCAiS1BfU3VidHJhY3QiKSkgcmV0dXJuIFhLX0tQX1N1YnRyYWN0OwotCWlmICghc3RyY21wKHMsICJLUF9EZWNpbWFsIikpIHJldHVybiBYS19LUF9EZWNpbWFsOwotCWlmICghc3RyY21wKHMsICJLUF9EaXZpZGUiKSkgcmV0dXJuIFhLX0tQX0RpdmlkZTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfMCIpKSByZXR1cm4gWEtfS1BfMDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfMSIpKSByZXR1cm4gWEtfS1BfMTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfMiIpKSByZXR1cm4gWEtfS1BfMjsKLQlpZiAoIXN0cmNtcChzLCAiS1BfMyIpKSByZXR1cm4gWEtfS1BfMzsKLQlpZiAoIXN0cmNtcChzLCAiS1BfNCIpKSByZXR1cm4gWEtfS1BfNDsKLQlpZiAoIXN0cmNtcChzLCAiS1BfNSIpKSByZXR1cm4gWEtfS1BfNTsKLQlpZiAoIXN0cmNtcChzLCAiS1BfNiIpKSByZXR1cm4gWEtfS1BfNjsKLQlpZiAoIXN0cmNtcChzLCAiS1BfNyIpKSByZXR1cm4gWEtfS1BfNzsKLQlpZiAoIXN0cmNtcChzLCAiS1BfOCIpKSByZXR1cm4gWEtfS1BfODsKLQlpZiAoIXN0cmNtcChzLCAiS1BfOSIpKSByZXR1cm4gWEtfS1BfOTsKLQlpZiAoIXN0cmNtcChzLCAiRjEiKSkgcmV0dXJuIFhLX0YxOwotCWlmICghc3RyY21wKHMsICJGMiIpKSByZXR1cm4gWEtfRjI7Ci0JaWYgKCFzdHJjbXAocywgIkYzIikpIHJldHVybiBYS19GMzsKLQlpZiAoIXN0cmNtcChzLCAiRjQiKSkgcmV0dXJuIFhLX0Y0OwotCWlmICghc3RyY21wKHMsICJGNSIpKSByZXR1cm4gWEtfRjU7Ci0JaWYgKCFzdHJjbXAocywgIkY2IikpIHJldHVybiBYS19GNjsKLQlpZiAoIXN0cmNtcChzLCAiRjciKSkgcmV0dXJuIFhLX0Y3OwotCWlmICghc3RyY21wKHMsICJGOCIpKSByZXR1cm4gWEtfRjg7Ci0JaWYgKCFzdHJjbXAocywgIkY5IikpIHJldHVybiBYS19GOTsKLQlpZiAoIXN0cmNtcChzLCAiRjEwIikpIHJldHVybiBYS19GMTA7Ci0JaWYgKCFzdHJjbXAocywgIkYxMSIpKSByZXR1cm4gWEtfRjExOwotCWlmICghc3RyY21wKHMsICJMMSIpKSByZXR1cm4gWEtfTDE7Ci0JaWYgKCFzdHJjbXAocywgIkYxMiIpKSByZXR1cm4gWEtfRjEyOwotCWlmICghc3RyY21wKHMsICJMMiIpKSByZXR1cm4gWEtfTDI7Ci0JaWYgKCFzdHJjbXAocywgIkYxMyIpKSByZXR1cm4gWEtfRjEzOwotCWlmICghc3RyY21wKHMsICJMMyIpKSByZXR1cm4gWEtfTDM7Ci0JaWYgKCFzdHJjbXAocywgIkYxNCIpKSByZXR1cm4gWEtfRjE0OwotCWlmICghc3RyY21wKHMsICJMNCIpKSByZXR1cm4gWEtfTDQ7Ci0JaWYgKCFzdHJjbXAocywgIkYxNSIpKSByZXR1cm4gWEtfRjE1OwotCWlmICghc3RyY21wKHMsICJMNSIpKSByZXR1cm4gWEtfTDU7Ci0JaWYgKCFzdHJjbXAocywgIkYxNiIpKSByZXR1cm4gWEtfRjE2OwotCWlmICghc3RyY21wKHMsICJMNiIpKSByZXR1cm4gWEtfTDY7Ci0JaWYgKCFzdHJjbXAocywgIkYxNyIpKSByZXR1cm4gWEtfRjE3OwotCWlmICghc3RyY21wKHMsICJMNyIpKSByZXR1cm4gWEtfTDc7Ci0JaWYgKCFzdHJjbXAocywgIkYxOCIpKSByZXR1cm4gWEtfRjE4OwotCWlmICghc3RyY21wKHMsICJMOCIpKSByZXR1cm4gWEtfTDg7Ci0JaWYgKCFzdHJjbXAocywgIkYxOSIpKSByZXR1cm4gWEtfRjE5OwotCWlmICghc3RyY21wKHMsICJMOSIpKSByZXR1cm4gWEtfTDk7Ci0JaWYgKCFzdHJjbXAocywgIkYyMCIpKSByZXR1cm4gWEtfRjIwOwotCWlmICghc3RyY21wKHMsICJMMTAiKSkgcmV0dXJuIFhLX0wxMDsKLQlpZiAoIXN0cmNtcChzLCAiRjIxIikpIHJldHVybiBYS19GMjE7Ci0JaWYgKCFzdHJjbXAocywgIlIxIikpIHJldHVybiBYS19SMTsKLQlpZiAoIXN0cmNtcChzLCAiRjIyIikpIHJldHVybiBYS19GMjI7Ci0JaWYgKCFzdHJjbXAocywgIlIyIikpIHJldHVybiBYS19SMjsKLQlpZiAoIXN0cmNtcChzLCAiRjIzIikpIHJldHVybiBYS19GMjM7Ci0JaWYgKCFzdHJjbXAocywgIlIzIikpIHJldHVybiBYS19SMzsKLQlpZiAoIXN0cmNtcChzLCAiRjI0IikpIHJldHVybiBYS19GMjQ7Ci0JaWYgKCFzdHJjbXAocywgIlI0IikpIHJldHVybiBYS19SNDsKLQlpZiAoIXN0cmNtcChzLCAiRjI1IikpIHJldHVybiBYS19GMjU7Ci0JaWYgKCFzdHJjbXAocywgIlI1IikpIHJldHVybiBYS19SNTsKLQlpZiAoIXN0cmNtcChzLCAiRjI2IikpIHJldHVybiBYS19GMjY7Ci0JaWYgKCFzdHJjbXAocywgIlI2IikpIHJldHVybiBYS19SNjsKLQlpZiAoIXN0cmNtcChzLCAiRjI3IikpIHJldHVybiBYS19GMjc7Ci0JaWYgKCFzdHJjbXAocywgIlI3IikpIHJldHVybiBYS19SNzsKLQlpZiAoIXN0cmNtcChzLCAiRjI4IikpIHJldHVybiBYS19GMjg7Ci0JaWYgKCFzdHJjbXAocywgIlI4IikpIHJldHVybiBYS19SODsKLQlpZiAoIXN0cmNtcChzLCAiRjI5IikpIHJldHVybiBYS19GMjk7Ci0JaWYgKCFzdHJjbXAocywgIlI5IikpIHJldHVybiBYS19SOTsKLQlpZiAoIXN0cmNtcChzLCAiRjMwIikpIHJldHVybiBYS19GMzA7Ci0JaWYgKCFzdHJjbXAocywgIlIxMCIpKSByZXR1cm4gWEtfUjEwOwotCWlmICghc3RyY21wKHMsICJGMzEiKSkgcmV0dXJuIFhLX0YzMTsKLQlpZiAoIXN0cmNtcChzLCAiUjExIikpIHJldHVybiBYS19SMTE7Ci0JaWYgKCFzdHJjbXAocywgIkYzMiIpKSByZXR1cm4gWEtfRjMyOwotCWlmICghc3RyY21wKHMsICJSMTIiKSkgcmV0dXJuIFhLX1IxMjsKLQlpZiAoIXN0cmNtcChzLCAiRjMzIikpIHJldHVybiBYS19GMzM7Ci0JaWYgKCFzdHJjbXAocywgIlIxMyIpKSByZXR1cm4gWEtfUjEzOwotCWlmICghc3RyY21wKHMsICJGMzQiKSkgcmV0dXJuIFhLX0YzNDsKLQlpZiAoIXN0cmNtcChzLCAiUjE0IikpIHJldHVybiBYS19SMTQ7Ci0JaWYgKCFzdHJjbXAocywgIkYzNSIpKSByZXR1cm4gWEtfRjM1OwotCWlmICghc3RyY21wKHMsICJSMTUiKSkgcmV0dXJuIFhLX1IxNTsKLQlpZiAoIXN0cmNtcChzLCAiU2hpZnRfTCIpKSByZXR1cm4gWEtfU2hpZnRfTDsKLQlpZiAoIXN0cmNtcChzLCAiU2hpZnRfUiIpKSByZXR1cm4gWEtfU2hpZnRfUjsKLQlpZiAoIXN0cmNtcChzLCAiQ29udHJvbF9MIikpIHJldHVybiBYS19Db250cm9sX0w7Ci0JaWYgKCFzdHJjbXAocywgIkNvbnRyb2xfUiIpKSByZXR1cm4gWEtfQ29udHJvbF9SOwotCWlmICghc3RyY21wKHMsICJDYXBzX0xvY2siKSkgcmV0dXJuIFhLX0NhcHNfTG9jazsKLQlpZiAoIXN0cmNtcChzLCAiU2hpZnRfTG9jayIpKSByZXR1cm4gWEtfU2hpZnRfTG9jazsKLQlpZiAoIXN0cmNtcChzLCAiTWV0YV9MIikpIHJldHVybiBYS19NZXRhX0w7Ci0JaWYgKCFzdHJjbXAocywgIk1ldGFfUiIpKSByZXR1cm4gWEtfTWV0YV9SOwotCWlmICghc3RyY21wKHMsICJBbHRfTCIpKSByZXR1cm4gWEtfQWx0X0w7Ci0JaWYgKCFzdHJjbXAocywgIkFsdF9SIikpIHJldHVybiBYS19BbHRfUjsKLQlpZiAoIXN0cmNtcChzLCAiU3VwZXJfTCIpKSByZXR1cm4gWEtfU3VwZXJfTDsKLQlpZiAoIXN0cmNtcChzLCAiU3VwZXJfUiIpKSByZXR1cm4gWEtfU3VwZXJfUjsKLQlpZiAoIXN0cmNtcChzLCAiSHlwZXJfTCIpKSByZXR1cm4gWEtfSHlwZXJfTDsKLQlpZiAoIXN0cmNtcChzLCAiSHlwZXJfUiIpKSByZXR1cm4gWEtfSHlwZXJfUjsKLSNlbmRpZiAvKiBYS19NSVNDRUxMQU5ZICovCi0jaWZkZWYgWEtfWEtCX0tFWVMKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0xvY2siKSkgcmV0dXJuIFhLX0lTT19Mb2NrOwotCWlmICghc3RyY21wKHMsICJJU09fTGV2ZWwyX0xhdGNoIikpIHJldHVybiBYS19JU09fTGV2ZWwyX0xhdGNoOwotCWlmICghc3RyY21wKHMsICJJU09fTGV2ZWwzX1NoaWZ0IikpIHJldHVybiBYS19JU09fTGV2ZWwzX1NoaWZ0OwotCWlmICghc3RyY21wKHMsICJJU09fTGV2ZWwzX0xhdGNoIikpIHJldHVybiBYS19JU09fTGV2ZWwzX0xhdGNoOwotCWlmICghc3RyY21wKHMsICJJU09fTGV2ZWwzX0xvY2siKSkgcmV0dXJuIFhLX0lTT19MZXZlbDNfTG9jazsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0dyb3VwX1NoaWZ0IikpIHJldHVybiBYS19JU09fR3JvdXBfU2hpZnQ7Ci0JaWYgKCFzdHJjbXAocywgIklTT19Hcm91cF9MYXRjaCIpKSByZXR1cm4gWEtfSVNPX0dyb3VwX0xhdGNoOwotCWlmICghc3RyY21wKHMsICJJU09fR3JvdXBfTG9jayIpKSByZXR1cm4gWEtfSVNPX0dyb3VwX0xvY2s7Ci0JaWYgKCFzdHJjbXAocywgIklTT19OZXh0X0dyb3VwIikpIHJldHVybiBYS19JU09fTmV4dF9Hcm91cDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX05leHRfR3JvdXBfTG9jayIpKSByZXR1cm4gWEtfSVNPX05leHRfR3JvdXBfTG9jazsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX1ByZXZfR3JvdXAiKSkgcmV0dXJuIFhLX0lTT19QcmV2X0dyb3VwOwotCWlmICghc3RyY21wKHMsICJJU09fUHJldl9Hcm91cF9Mb2NrIikpIHJldHVybiBYS19JU09fUHJldl9Hcm91cF9Mb2NrOwotCWlmICghc3RyY21wKHMsICJJU09fRmlyc3RfR3JvdXAiKSkgcmV0dXJuIFhLX0lTT19GaXJzdF9Hcm91cDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0ZpcnN0X0dyb3VwX0xvY2siKSkgcmV0dXJuIFhLX0lTT19GaXJzdF9Hcm91cF9Mb2NrOwotCWlmICghc3RyY21wKHMsICJJU09fTGFzdF9Hcm91cCIpKSByZXR1cm4gWEtfSVNPX0xhc3RfR3JvdXA7Ci0JaWYgKCFzdHJjbXAocywgIklTT19MYXN0X0dyb3VwX0xvY2siKSkgcmV0dXJuIFhLX0lTT19MYXN0X0dyb3VwX0xvY2s7Ci0JaWYgKCFzdHJjbXAocywgIklTT19MZWZ0X1RhYiIpKSByZXR1cm4gWEtfSVNPX0xlZnRfVGFiOwotCWlmICghc3RyY21wKHMsICJJU09fTW92ZV9MaW5lX1VwIikpIHJldHVybiBYS19JU09fTW92ZV9MaW5lX1VwOwotCWlmICghc3RyY21wKHMsICJJU09fTW92ZV9MaW5lX0Rvd24iKSkgcmV0dXJuIFhLX0lTT19Nb3ZlX0xpbmVfRG93bjsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX1BhcnRpYWxfTGluZV9VcCIpKSByZXR1cm4gWEtfSVNPX1BhcnRpYWxfTGluZV9VcDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX1BhcnRpYWxfTGluZV9Eb3duIikpIHJldHVybiBYS19JU09fUGFydGlhbF9MaW5lX0Rvd247Ci0JaWYgKCFzdHJjbXAocywgIklTT19QYXJ0aWFsX1NwYWNlX0xlZnQiKSkgcmV0dXJuIFhLX0lTT19QYXJ0aWFsX1NwYWNlX0xlZnQ7Ci0JaWYgKCFzdHJjbXAocywgIklTT19QYXJ0aWFsX1NwYWNlX1JpZ2h0IikpIHJldHVybiBYS19JU09fUGFydGlhbF9TcGFjZV9SaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX1NldF9NYXJnaW5fTGVmdCIpKSByZXR1cm4gWEtfSVNPX1NldF9NYXJnaW5fTGVmdDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX1NldF9NYXJnaW5fUmlnaHQiKSkgcmV0dXJuIFhLX0lTT19TZXRfTWFyZ2luX1JpZ2h0OwotCWlmICghc3RyY21wKHMsICJJU09fUmVsZWFzZV9NYXJnaW5fTGVmdCIpKSByZXR1cm4gWEtfSVNPX1JlbGVhc2VfTWFyZ2luX0xlZnQ7Ci0JaWYgKCFzdHJjbXAocywgIklTT19SZWxlYXNlX01hcmdpbl9SaWdodCIpKSByZXR1cm4gWEtfSVNPX1JlbGVhc2VfTWFyZ2luX1JpZ2h0OwotCWlmICghc3RyY21wKHMsICJJU09fUmVsZWFzZV9Cb3RoX01hcmdpbnMiKSkgcmV0dXJuIFhLX0lTT19SZWxlYXNlX0JvdGhfTWFyZ2luczsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0Zhc3RfQ3Vyc29yX0xlZnQiKSkgcmV0dXJuIFhLX0lTT19GYXN0X0N1cnNvcl9MZWZ0OwotCWlmICghc3RyY21wKHMsICJJU09fRmFzdF9DdXJzb3JfUmlnaHQiKSkgcmV0dXJuIFhLX0lTT19GYXN0X0N1cnNvcl9SaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0Zhc3RfQ3Vyc29yX1VwIikpIHJldHVybiBYS19JU09fRmFzdF9DdXJzb3JfVXA7Ci0JaWYgKCFzdHJjbXAocywgIklTT19GYXN0X0N1cnNvcl9Eb3duIikpIHJldHVybiBYS19JU09fRmFzdF9DdXJzb3JfRG93bjsKLQlpZiAoIXN0cmNtcChzLCAiSVNPX0NvbnRpbnVvdXNfVW5kZXJsaW5lIikpIHJldHVybiBYS19JU09fQ29udGludW91c19VbmRlcmxpbmU7Ci0JaWYgKCFzdHJjbXAocywgIklTT19EaXNjb250aW51b3VzX1VuZGVybGluZSIpKSByZXR1cm4gWEtfSVNPX0Rpc2NvbnRpbnVvdXNfVW5kZXJsaW5lOwotCWlmICghc3RyY21wKHMsICJJU09fRW1waGFzaXplIikpIHJldHVybiBYS19JU09fRW1waGFzaXplOwotCWlmICghc3RyY21wKHMsICJJU09fQ2VudGVyX09iamVjdCIpKSByZXR1cm4gWEtfSVNPX0NlbnRlcl9PYmplY3Q7Ci0JaWYgKCFzdHJjbXAocywgIklTT19FbnRlciIpKSByZXR1cm4gWEtfSVNPX0VudGVyOwotCWlmICghc3RyY21wKHMsICJkZWFkX2dyYXZlIikpIHJldHVybiBYS19kZWFkX2dyYXZlOwotCWlmICghc3RyY21wKHMsICJkZWFkX2FjdXRlIikpIHJldHVybiBYS19kZWFkX2FjdXRlOwotCWlmICghc3RyY21wKHMsICJkZWFkX2NpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX2RlYWRfY2lyY3VtZmxleDsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF90aWxkZSIpKSByZXR1cm4gWEtfZGVhZF90aWxkZTsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9tYWNyb24iKSkgcmV0dXJuIFhLX2RlYWRfbWFjcm9uOwotCWlmICghc3RyY21wKHMsICJkZWFkX2JyZXZlIikpIHJldHVybiBYS19kZWFkX2JyZXZlOwotCWlmICghc3RyY21wKHMsICJkZWFkX2Fib3ZlZG90IikpIHJldHVybiBYS19kZWFkX2Fib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJkZWFkX2RpYWVyZXNpcyIpKSByZXR1cm4gWEtfZGVhZF9kaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgImRlYWRfYWJvdmVyaW5nIikpIHJldHVybiBYS19kZWFkX2Fib3ZlcmluZzsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9kb3VibGVhY3V0ZSIpKSByZXR1cm4gWEtfZGVhZF9kb3VibGVhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9jYXJvbiIpKSByZXR1cm4gWEtfZGVhZF9jYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9jZWRpbGxhIikpIHJldHVybiBYS19kZWFkX2NlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgImRlYWRfb2dvbmVrIikpIHJldHVybiBYS19kZWFkX29nb25lazsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9pb3RhIikpIHJldHVybiBYS19kZWFkX2lvdGE7Ci0JaWYgKCFzdHJjbXAocywgImRlYWRfdm9pY2VkX3NvdW5kIikpIHJldHVybiBYS19kZWFkX3ZvaWNlZF9zb3VuZDsKLQlpZiAoIXN0cmNtcChzLCAiZGVhZF9zZW1pdm9pY2VkX3NvdW5kIikpIHJldHVybiBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQ7Ci0JaWYgKCFzdHJjbXAocywgImRlYWRfYmVsb3dkb3QiKSkgcmV0dXJuIFhLX2RlYWRfYmVsb3dkb3Q7Ci0JaWYgKCFzdHJjbXAocywgIkZpcnN0X1ZpcnR1YWxfU2NyZWVuIikpIHJldHVybiBYS19GaXJzdF9WaXJ0dWFsX1NjcmVlbjsKLQlpZiAoIXN0cmNtcChzLCAiUHJldl9WaXJ0dWFsX1NjcmVlbiIpKSByZXR1cm4gWEtfUHJldl9WaXJ0dWFsX1NjcmVlbjsKLQlpZiAoIXN0cmNtcChzLCAiTmV4dF9WaXJ0dWFsX1NjcmVlbiIpKSByZXR1cm4gWEtfTmV4dF9WaXJ0dWFsX1NjcmVlbjsKLQlpZiAoIXN0cmNtcChzLCAiTGFzdF9WaXJ0dWFsX1NjcmVlbiIpKSByZXR1cm4gWEtfTGFzdF9WaXJ0dWFsX1NjcmVlbjsKLQlpZiAoIXN0cmNtcChzLCAiVGVybWluYXRlX1NlcnZlciIpKSByZXR1cm4gWEtfVGVybWluYXRlX1NlcnZlcjsKLQlpZiAoIXN0cmNtcChzLCAiQWNjZXNzWF9FbmFibGUiKSkgcmV0dXJuIFhLX0FjY2Vzc1hfRW5hYmxlOwotCWlmICghc3RyY21wKHMsICJBY2Nlc3NYX0ZlZWRiYWNrX0VuYWJsZSIpKSByZXR1cm4gWEtfQWNjZXNzWF9GZWVkYmFja19FbmFibGU7Ci0JaWYgKCFzdHJjbXAocywgIlJlcGVhdEtleXNfRW5hYmxlIikpIHJldHVybiBYS19SZXBlYXRLZXlzX0VuYWJsZTsKLQlpZiAoIXN0cmNtcChzLCAiU2xvd0tleXNfRW5hYmxlIikpIHJldHVybiBYS19TbG93S2V5c19FbmFibGU7Ci0JaWYgKCFzdHJjbXAocywgIkJvdW5jZUtleXNfRW5hYmxlIikpIHJldHVybiBYS19Cb3VuY2VLZXlzX0VuYWJsZTsKLQlpZiAoIXN0cmNtcChzLCAiU3RpY2t5S2V5c19FbmFibGUiKSkgcmV0dXJuIFhLX1N0aWNreUtleXNfRW5hYmxlOwotCWlmICghc3RyY21wKHMsICJNb3VzZUtleXNfRW5hYmxlIikpIHJldHVybiBYS19Nb3VzZUtleXNfRW5hYmxlOwotCWlmICghc3RyY21wKHMsICJNb3VzZUtleXNfQWNjZWxfRW5hYmxlIikpIHJldHVybiBYS19Nb3VzZUtleXNfQWNjZWxfRW5hYmxlOwotCWlmICghc3RyY21wKHMsICJPdmVybGF5MV9FbmFibGUiKSkgcmV0dXJuIFhLX092ZXJsYXkxX0VuYWJsZTsKLQlpZiAoIXN0cmNtcChzLCAiT3ZlcmxheTJfRW5hYmxlIikpIHJldHVybiBYS19PdmVybGF5Ml9FbmFibGU7Ci0JaWYgKCFzdHJjbXAocywgIkF1ZGlibGVCZWxsX0VuYWJsZSIpKSByZXR1cm4gWEtfQXVkaWJsZUJlbGxfRW5hYmxlOwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0xlZnQiKSkgcmV0dXJuIFhLX1BvaW50ZXJfTGVmdDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9SaWdodCIpKSByZXR1cm4gWEtfUG9pbnRlcl9SaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9VcCIpKSByZXR1cm4gWEtfUG9pbnRlcl9VcDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9Eb3duIikpIHJldHVybiBYS19Qb2ludGVyX0Rvd247Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfVXBMZWZ0IikpIHJldHVybiBYS19Qb2ludGVyX1VwTGVmdDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9VcFJpZ2h0IikpIHJldHVybiBYS19Qb2ludGVyX1VwUmlnaHQ7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfRG93bkxlZnQiKSkgcmV0dXJuIFhLX1BvaW50ZXJfRG93bkxlZnQ7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfRG93blJpZ2h0IikpIHJldHVybiBYS19Qb2ludGVyX0Rvd25SaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9CdXR0b25fRGZsdCIpKSByZXR1cm4gWEtfUG9pbnRlcl9CdXR0b25fRGZsdDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9CdXR0b24xIikpIHJldHVybiBYS19Qb2ludGVyX0J1dHRvbjE7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfQnV0dG9uMiIpKSByZXR1cm4gWEtfUG9pbnRlcl9CdXR0b24yOwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0J1dHRvbjMiKSkgcmV0dXJuIFhLX1BvaW50ZXJfQnV0dG9uMzsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9CdXR0b240IikpIHJldHVybiBYS19Qb2ludGVyX0J1dHRvbjQ7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfQnV0dG9uNSIpKSByZXR1cm4gWEtfUG9pbnRlcl9CdXR0b241OwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0RibENsaWNrX0RmbHQiKSkgcmV0dXJuIFhLX1BvaW50ZXJfRGJsQ2xpY2tfRGZsdDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EYmxDbGljazEiKSkgcmV0dXJuIFhLX1BvaW50ZXJfRGJsQ2xpY2sxOwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0RibENsaWNrMiIpKSByZXR1cm4gWEtfUG9pbnRlcl9EYmxDbGljazI7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfRGJsQ2xpY2szIikpIHJldHVybiBYS19Qb2ludGVyX0RibENsaWNrMzsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EYmxDbGljazQiKSkgcmV0dXJuIFhLX1BvaW50ZXJfRGJsQ2xpY2s0OwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0RibENsaWNrNSIpKSByZXR1cm4gWEtfUG9pbnRlcl9EYmxDbGljazU7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfRHJhZ19EZmx0IikpIHJldHVybiBYS19Qb2ludGVyX0RyYWdfRGZsdDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EcmFnMSIpKSByZXR1cm4gWEtfUG9pbnRlcl9EcmFnMTsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EcmFnMiIpKSByZXR1cm4gWEtfUG9pbnRlcl9EcmFnMjsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EcmFnMyIpKSByZXR1cm4gWEtfUG9pbnRlcl9EcmFnMzsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EcmFnNCIpKSByZXR1cm4gWEtfUG9pbnRlcl9EcmFnNDsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9EcmFnNSIpKSByZXR1cm4gWEtfUG9pbnRlcl9EcmFnNTsKLQlpZiAoIXN0cmNtcChzLCAiUG9pbnRlcl9FbmFibGVLZXlzIikpIHJldHVybiBYS19Qb2ludGVyX0VuYWJsZUtleXM7Ci0JaWYgKCFzdHJjbXAocywgIlBvaW50ZXJfQWNjZWxlcmF0ZSIpKSByZXR1cm4gWEtfUG9pbnRlcl9BY2NlbGVyYXRlOwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0RmbHRCdG5OZXh0IikpIHJldHVybiBYS19Qb2ludGVyX0RmbHRCdG5OZXh0OwotCWlmICghc3RyY21wKHMsICJQb2ludGVyX0RmbHRCdG5QcmV2IikpIHJldHVybiBYS19Qb2ludGVyX0RmbHRCdG5QcmV2OwotI2VuZGlmCi0jaWZkZWYgWEtfMzI3MAotCWlmICghc3RyY21wKHMsICIzMjcwX0R1cGxpY2F0ZSIpKSByZXR1cm4gWEtfMzI3MF9EdXBsaWNhdGU7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfRmllbGRNYXJrIikpIHJldHVybiBYS18zMjcwX0ZpZWxkTWFyazsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9SaWdodDIiKSkgcmV0dXJuIFhLXzMyNzBfUmlnaHQyOwotCWlmICghc3RyY21wKHMsICIzMjcwX0xlZnQyIikpIHJldHVybiBYS18zMjcwX0xlZnQyOwotCWlmICghc3RyY21wKHMsICIzMjcwX0JhY2tUYWIiKSkgcmV0dXJuIFhLXzMyNzBfQmFja1RhYjsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9FcmFzZUVPRiIpKSByZXR1cm4gWEtfMzI3MF9FcmFzZUVPRjsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9FcmFzZUlucHV0IikpIHJldHVybiBYS18zMjcwX0VyYXNlSW5wdXQ7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfUmVzZXQiKSkgcmV0dXJuIFhLXzMyNzBfUmVzZXQ7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfUXVpdCIpKSByZXR1cm4gWEtfMzI3MF9RdWl0OwotCWlmICghc3RyY21wKHMsICIzMjcwX1BBMSIpKSByZXR1cm4gWEtfMzI3MF9QQTE7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfUEEyIikpIHJldHVybiBYS18zMjcwX1BBMjsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9QQTMiKSkgcmV0dXJuIFhLXzMyNzBfUEEzOwotCWlmICghc3RyY21wKHMsICIzMjcwX1Rlc3QiKSkgcmV0dXJuIFhLXzMyNzBfVGVzdDsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9BdHRuIikpIHJldHVybiBYS18zMjcwX0F0dG47Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfQ3Vyc29yQmxpbmsiKSkgcmV0dXJuIFhLXzMyNzBfQ3Vyc29yQmxpbms7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfQWx0Q3Vyc29yIikpIHJldHVybiBYS18zMjcwX0FsdEN1cnNvcjsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9LZXlDbGljayIpKSByZXR1cm4gWEtfMzI3MF9LZXlDbGljazsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9KdW1wIikpIHJldHVybiBYS18zMjcwX0p1bXA7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfSWRlbnQiKSkgcmV0dXJuIFhLXzMyNzBfSWRlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfUnVsZSIpKSByZXR1cm4gWEtfMzI3MF9SdWxlOwotCWlmICghc3RyY21wKHMsICIzMjcwX0NvcHkiKSkgcmV0dXJuIFhLXzMyNzBfQ29weTsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9QbGF5IikpIHJldHVybiBYS18zMjcwX1BsYXk7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfU2V0dXAiKSkgcmV0dXJuIFhLXzMyNzBfU2V0dXA7Ci0JaWYgKCFzdHJjbXAocywgIjMyNzBfUmVjb3JkIikpIHJldHVybiBYS18zMjcwX1JlY29yZDsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9DaGFuZ2VTY3JlZW4iKSkgcmV0dXJuIFhLXzMyNzBfQ2hhbmdlU2NyZWVuOwotCWlmICghc3RyY21wKHMsICIzMjcwX0RlbGV0ZVdvcmQiKSkgcmV0dXJuIFhLXzMyNzBfRGVsZXRlV29yZDsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9FeFNlbGVjdCIpKSByZXR1cm4gWEtfMzI3MF9FeFNlbGVjdDsKLQlpZiAoIXN0cmNtcChzLCAiMzI3MF9DdXJzb3JTZWxlY3QiKSkgcmV0dXJuIFhLXzMyNzBfQ3Vyc29yU2VsZWN0OwotCWlmICghc3RyY21wKHMsICIzMjcwX1ByaW50U2NyZWVuIikpIHJldHVybiBYS18zMjcwX1ByaW50U2NyZWVuOwotCWlmICghc3RyY21wKHMsICIzMjcwX0VudGVyIikpIHJldHVybiBYS18zMjcwX0VudGVyOwotI2VuZGlmCi0jaWZkZWYgWEtfTEFUSU4xCi0JaWYgKCFzdHJjbXAocywgInNwYWNlIikpIHJldHVybiBYS19zcGFjZTsKLQlpZiAoIXN0cmNtcChzLCAiZXhjbGFtIikpIHJldHVybiBYS19leGNsYW07Ci0JaWYgKCFzdHJjbXAocywgInF1b3RlZGJsIikpIHJldHVybiBYS19xdW90ZWRibDsKLQlpZiAoIXN0cmNtcChzLCAibnVtYmVyc2lnbiIpKSByZXR1cm4gWEtfbnVtYmVyc2lnbjsKLQlpZiAoIXN0cmNtcChzLCAiZG9sbGFyIikpIHJldHVybiBYS19kb2xsYXI7Ci0JaWYgKCFzdHJjbXAocywgInBlcmNlbnQiKSkgcmV0dXJuIFhLX3BlcmNlbnQ7Ci0JaWYgKCFzdHJjbXAocywgImFtcGVyc2FuZCIpKSByZXR1cm4gWEtfYW1wZXJzYW5kOwotCWlmICghc3RyY21wKHMsICJhcG9zdHJvcGhlIikpIHJldHVybiBYS19hcG9zdHJvcGhlOwotCWlmICghc3RyY21wKHMsICJxdW90ZXJpZ2h0IikpIHJldHVybiBYS19xdW90ZXJpZ2h0OwotCWlmICghc3RyY21wKHMsICJwYXJlbmxlZnQiKSkgcmV0dXJuIFhLX3BhcmVubGVmdDsKLQlpZiAoIXN0cmNtcChzLCAicGFyZW5yaWdodCIpKSByZXR1cm4gWEtfcGFyZW5yaWdodDsKLQlpZiAoIXN0cmNtcChzLCAiYXN0ZXJpc2siKSkgcmV0dXJuIFhLX2FzdGVyaXNrOwotCWlmICghc3RyY21wKHMsICJwbHVzIikpIHJldHVybiBYS19wbHVzOwotCWlmICghc3RyY21wKHMsICJjb21tYSIpKSByZXR1cm4gWEtfY29tbWE7Ci0JaWYgKCFzdHJjbXAocywgIm1pbnVzIikpIHJldHVybiBYS19taW51czsKLQlpZiAoIXN0cmNtcChzLCAicGVyaW9kIikpIHJldHVybiBYS19wZXJpb2Q7Ci0JaWYgKCFzdHJjbXAocywgInNsYXNoIikpIHJldHVybiBYS19zbGFzaDsKLQlpZiAoIXN0cmNtcChzLCAiMCIpKSByZXR1cm4gWEtfMDsKLQlpZiAoIXN0cmNtcChzLCAiMSIpKSByZXR1cm4gWEtfMTsKLQlpZiAoIXN0cmNtcChzLCAiMiIpKSByZXR1cm4gWEtfMjsKLQlpZiAoIXN0cmNtcChzLCAiMyIpKSByZXR1cm4gWEtfMzsKLQlpZiAoIXN0cmNtcChzLCAiNCIpKSByZXR1cm4gWEtfNDsKLQlpZiAoIXN0cmNtcChzLCAiNSIpKSByZXR1cm4gWEtfNTsKLQlpZiAoIXN0cmNtcChzLCAiNiIpKSByZXR1cm4gWEtfNjsKLQlpZiAoIXN0cmNtcChzLCAiNyIpKSByZXR1cm4gWEtfNzsKLQlpZiAoIXN0cmNtcChzLCAiOCIpKSByZXR1cm4gWEtfODsKLQlpZiAoIXN0cmNtcChzLCAiOSIpKSByZXR1cm4gWEtfOTsKLQlpZiAoIXN0cmNtcChzLCAiY29sb24iKSkgcmV0dXJuIFhLX2NvbG9uOwotCWlmICghc3RyY21wKHMsICJzZW1pY29sb24iKSkgcmV0dXJuIFhLX3NlbWljb2xvbjsKLQlpZiAoIXN0cmNtcChzLCAibGVzcyIpKSByZXR1cm4gWEtfbGVzczsKLQlpZiAoIXN0cmNtcChzLCAiZXF1YWwiKSkgcmV0dXJuIFhLX2VxdWFsOwotCWlmICghc3RyY21wKHMsICJncmVhdGVyIikpIHJldHVybiBYS19ncmVhdGVyOwotCWlmICghc3RyY21wKHMsICJxdWVzdGlvbiIpKSByZXR1cm4gWEtfcXVlc3Rpb247Ci0JaWYgKCFzdHJjbXAocywgImF0IikpIHJldHVybiBYS19hdDsKLQlpZiAoIXN0cmNtcChzLCAiQSIpKSByZXR1cm4gWEtfQTsKLQlpZiAoIXN0cmNtcChzLCAiQiIpKSByZXR1cm4gWEtfQjsKLQlpZiAoIXN0cmNtcChzLCAiQyIpKSByZXR1cm4gWEtfQzsKLQlpZiAoIXN0cmNtcChzLCAiRCIpKSByZXR1cm4gWEtfRDsKLQlpZiAoIXN0cmNtcChzLCAiRSIpKSByZXR1cm4gWEtfRTsKLQlpZiAoIXN0cmNtcChzLCAiRiIpKSByZXR1cm4gWEtfRjsKLQlpZiAoIXN0cmNtcChzLCAiRyIpKSByZXR1cm4gWEtfRzsKLQlpZiAoIXN0cmNtcChzLCAiSCIpKSByZXR1cm4gWEtfSDsKLQlpZiAoIXN0cmNtcChzLCAiSSIpKSByZXR1cm4gWEtfSTsKLQlpZiAoIXN0cmNtcChzLCAiSiIpKSByZXR1cm4gWEtfSjsKLQlpZiAoIXN0cmNtcChzLCAiSyIpKSByZXR1cm4gWEtfSzsKLQlpZiAoIXN0cmNtcChzLCAiTCIpKSByZXR1cm4gWEtfTDsKLQlpZiAoIXN0cmNtcChzLCAiTSIpKSByZXR1cm4gWEtfTTsKLQlpZiAoIXN0cmNtcChzLCAiTiIpKSByZXR1cm4gWEtfTjsKLQlpZiAoIXN0cmNtcChzLCAiTyIpKSByZXR1cm4gWEtfTzsKLQlpZiAoIXN0cmNtcChzLCAiUCIpKSByZXR1cm4gWEtfUDsKLQlpZiAoIXN0cmNtcChzLCAiUSIpKSByZXR1cm4gWEtfUTsKLQlpZiAoIXN0cmNtcChzLCAiUiIpKSByZXR1cm4gWEtfUjsKLQlpZiAoIXN0cmNtcChzLCAiUyIpKSByZXR1cm4gWEtfUzsKLQlpZiAoIXN0cmNtcChzLCAiVCIpKSByZXR1cm4gWEtfVDsKLQlpZiAoIXN0cmNtcChzLCAiVSIpKSByZXR1cm4gWEtfVTsKLQlpZiAoIXN0cmNtcChzLCAiViIpKSByZXR1cm4gWEtfVjsKLQlpZiAoIXN0cmNtcChzLCAiVyIpKSByZXR1cm4gWEtfVzsKLQlpZiAoIXN0cmNtcChzLCAiWCIpKSByZXR1cm4gWEtfWDsKLQlpZiAoIXN0cmNtcChzLCAiWSIpKSByZXR1cm4gWEtfWTsKLQlpZiAoIXN0cmNtcChzLCAiWiIpKSByZXR1cm4gWEtfWjsKLQlpZiAoIXN0cmNtcChzLCAiYnJhY2tldGxlZnQiKSkgcmV0dXJuIFhLX2JyYWNrZXRsZWZ0OwotCWlmICghc3RyY21wKHMsICJiYWNrc2xhc2giKSkgcmV0dXJuIFhLX2JhY2tzbGFzaDsKLQlpZiAoIXN0cmNtcChzLCAiYnJhY2tldHJpZ2h0IikpIHJldHVybiBYS19icmFja2V0cmlnaHQ7Ci0JaWYgKCFzdHJjbXAocywgImFzY2lpY2lyY3VtIikpIHJldHVybiBYS19hc2NpaWNpcmN1bTsKLQlpZiAoIXN0cmNtcChzLCAidW5kZXJzY29yZSIpKSByZXR1cm4gWEtfdW5kZXJzY29yZTsKLQlpZiAoIXN0cmNtcChzLCAiZ3JhdmUiKSkgcmV0dXJuIFhLX2dyYXZlOwotCWlmICghc3RyY21wKHMsICJxdW90ZWxlZnQiKSkgcmV0dXJuIFhLX3F1b3RlbGVmdDsKLQlpZiAoIXN0cmNtcChzLCAiYSIpKSByZXR1cm4gWEtfYTsKLQlpZiAoIXN0cmNtcChzLCAiYiIpKSByZXR1cm4gWEtfYjsKLQlpZiAoIXN0cmNtcChzLCAiYyIpKSByZXR1cm4gWEtfYzsKLQlpZiAoIXN0cmNtcChzLCAiZCIpKSByZXR1cm4gWEtfZDsKLQlpZiAoIXN0cmNtcChzLCAiZSIpKSByZXR1cm4gWEtfZTsKLQlpZiAoIXN0cmNtcChzLCAiZiIpKSByZXR1cm4gWEtfZjsKLQlpZiAoIXN0cmNtcChzLCAiZyIpKSByZXR1cm4gWEtfZzsKLQlpZiAoIXN0cmNtcChzLCAiaCIpKSByZXR1cm4gWEtfaDsKLQlpZiAoIXN0cmNtcChzLCAiaSIpKSByZXR1cm4gWEtfaTsKLQlpZiAoIXN0cmNtcChzLCAiaiIpKSByZXR1cm4gWEtfajsKLQlpZiAoIXN0cmNtcChzLCAiayIpKSByZXR1cm4gWEtfazsKLQlpZiAoIXN0cmNtcChzLCAibCIpKSByZXR1cm4gWEtfbDsKLQlpZiAoIXN0cmNtcChzLCAibSIpKSByZXR1cm4gWEtfbTsKLQlpZiAoIXN0cmNtcChzLCAibiIpKSByZXR1cm4gWEtfbjsKLQlpZiAoIXN0cmNtcChzLCAibyIpKSByZXR1cm4gWEtfbzsKLQlpZiAoIXN0cmNtcChzLCAicCIpKSByZXR1cm4gWEtfcDsKLQlpZiAoIXN0cmNtcChzLCAicSIpKSByZXR1cm4gWEtfcTsKLQlpZiAoIXN0cmNtcChzLCAiciIpKSByZXR1cm4gWEtfcjsKLQlpZiAoIXN0cmNtcChzLCAicyIpKSByZXR1cm4gWEtfczsKLQlpZiAoIXN0cmNtcChzLCAidCIpKSByZXR1cm4gWEtfdDsKLQlpZiAoIXN0cmNtcChzLCAidSIpKSByZXR1cm4gWEtfdTsKLQlpZiAoIXN0cmNtcChzLCAidiIpKSByZXR1cm4gWEtfdjsKLQlpZiAoIXN0cmNtcChzLCAidyIpKSByZXR1cm4gWEtfdzsKLQlpZiAoIXN0cmNtcChzLCAieCIpKSByZXR1cm4gWEtfeDsKLQlpZiAoIXN0cmNtcChzLCAieSIpKSByZXR1cm4gWEtfeTsKLQlpZiAoIXN0cmNtcChzLCAieiIpKSByZXR1cm4gWEtfejsKLQlpZiAoIXN0cmNtcChzLCAiYnJhY2VsZWZ0IikpIHJldHVybiBYS19icmFjZWxlZnQ7Ci0JaWYgKCFzdHJjbXAocywgImJhciIpKSByZXR1cm4gWEtfYmFyOwotCWlmICghc3RyY21wKHMsICJicmFjZXJpZ2h0IikpIHJldHVybiBYS19icmFjZXJpZ2h0OwotCWlmICghc3RyY21wKHMsICJhc2NpaXRpbGRlIikpIHJldHVybiBYS19hc2NpaXRpbGRlOwotCWlmICghc3RyY21wKHMsICJub2JyZWFrc3BhY2UiKSkgcmV0dXJuIFhLX25vYnJlYWtzcGFjZTsKLQlpZiAoIXN0cmNtcChzLCAiZXhjbGFtZG93biIpKSByZXR1cm4gWEtfZXhjbGFtZG93bjsKLQlpZiAoIXN0cmNtcChzLCAiY2VudCIpKSByZXR1cm4gWEtfY2VudDsKLQlpZiAoIXN0cmNtcChzLCAic3RlcmxpbmciKSkgcmV0dXJuIFhLX3N0ZXJsaW5nOwotCWlmICghc3RyY21wKHMsICJjdXJyZW5jeSIpKSByZXR1cm4gWEtfY3VycmVuY3k7Ci0JaWYgKCFzdHJjbXAocywgInllbiIpKSByZXR1cm4gWEtfeWVuOwotCWlmICghc3RyY21wKHMsICJicm9rZW5iYXIiKSkgcmV0dXJuIFhLX2Jyb2tlbmJhcjsKLQlpZiAoIXN0cmNtcChzLCAic2VjdGlvbiIpKSByZXR1cm4gWEtfc2VjdGlvbjsKLQlpZiAoIXN0cmNtcChzLCAiZGlhZXJlc2lzIikpIHJldHVybiBYS19kaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgImNvcHlyaWdodCIpKSByZXR1cm4gWEtfY29weXJpZ2h0OwotCWlmICghc3RyY21wKHMsICJvcmRmZW1pbmluZSIpKSByZXR1cm4gWEtfb3JkZmVtaW5pbmU7Ci0JaWYgKCFzdHJjbXAocywgImd1aWxsZW1vdGxlZnQiKSkgcmV0dXJuIFhLX2d1aWxsZW1vdGxlZnQ7Ci0JaWYgKCFzdHJjbXAocywgIm5vdHNpZ24iKSkgcmV0dXJuIFhLX25vdHNpZ247Ci0JaWYgKCFzdHJjbXAocywgImh5cGhlbiIpKSByZXR1cm4gWEtfaHlwaGVuOwotCWlmICghc3RyY21wKHMsICJyZWdpc3RlcmVkIikpIHJldHVybiBYS19yZWdpc3RlcmVkOwotCWlmICghc3RyY21wKHMsICJtYWNyb24iKSkgcmV0dXJuIFhLX21hY3JvbjsKLQlpZiAoIXN0cmNtcChzLCAiZGVncmVlIikpIHJldHVybiBYS19kZWdyZWU7Ci0JaWYgKCFzdHJjbXAocywgInBsdXNtaW51cyIpKSByZXR1cm4gWEtfcGx1c21pbnVzOwotCWlmICghc3RyY21wKHMsICJ0d29zdXBlcmlvciIpKSByZXR1cm4gWEtfdHdvc3VwZXJpb3I7Ci0JaWYgKCFzdHJjbXAocywgInRocmVlc3VwZXJpb3IiKSkgcmV0dXJuIFhLX3RocmVlc3VwZXJpb3I7Ci0JaWYgKCFzdHJjbXAocywgImFjdXRlIikpIHJldHVybiBYS19hY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAibXUiKSkgcmV0dXJuIFhLX211OwotCWlmICghc3RyY21wKHMsICJwYXJhZ3JhcGgiKSkgcmV0dXJuIFhLX3BhcmFncmFwaDsKLQlpZiAoIXN0cmNtcChzLCAicGVyaW9kY2VudGVyZWQiKSkgcmV0dXJuIFhLX3BlcmlvZGNlbnRlcmVkOwotCWlmICghc3RyY21wKHMsICJjZWRpbGxhIikpIHJldHVybiBYS19jZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJvbmVzdXBlcmlvciIpKSByZXR1cm4gWEtfb25lc3VwZXJpb3I7Ci0JaWYgKCFzdHJjbXAocywgIm1hc2N1bGluZSIpKSByZXR1cm4gWEtfbWFzY3VsaW5lOwotCWlmICghc3RyY21wKHMsICJndWlsbGVtb3RyaWdodCIpKSByZXR1cm4gWEtfZ3VpbGxlbW90cmlnaHQ7Ci0JaWYgKCFzdHJjbXAocywgIm9uZXF1YXJ0ZXIiKSkgcmV0dXJuIFhLX29uZXF1YXJ0ZXI7Ci0JaWYgKCFzdHJjbXAocywgIm9uZWhhbGYiKSkgcmV0dXJuIFhLX29uZWhhbGY7Ci0JaWYgKCFzdHJjbXAocywgInRocmVlcXVhcnRlcnMiKSkgcmV0dXJuIFhLX3RocmVlcXVhcnRlcnM7Ci0JaWYgKCFzdHJjbXAocywgInF1ZXN0aW9uZG93biIpKSByZXR1cm4gWEtfcXVlc3Rpb25kb3duOwotCWlmICghc3RyY21wKHMsICJBZ3JhdmUiKSkgcmV0dXJuIFhLX0FncmF2ZTsKLQlpZiAoIXN0cmNtcChzLCAiQWFjdXRlIikpIHJldHVybiBYS19BYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgIkFjaXJjdW1mbGV4IikpIHJldHVybiBYS19BY2lyY3VtZmxleDsKLQlpZiAoIXN0cmNtcChzLCAiQXRpbGRlIikpIHJldHVybiBYS19BdGlsZGU7Ci0JaWYgKCFzdHJjbXAocywgIkFkaWFlcmVzaXMiKSkgcmV0dXJuIFhLX0FkaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgIkFyaW5nIikpIHJldHVybiBYS19BcmluZzsKLQlpZiAoIXN0cmNtcChzLCAiQUUiKSkgcmV0dXJuIFhLX0FFOwotCWlmICghc3RyY21wKHMsICJDY2VkaWxsYSIpKSByZXR1cm4gWEtfQ2NlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgIkVncmF2ZSIpKSByZXR1cm4gWEtfRWdyYXZlOwotCWlmICghc3RyY21wKHMsICJFYWN1dGUiKSkgcmV0dXJuIFhLX0VhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiRWNpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX0VjaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJFZGlhZXJlc2lzIikpIHJldHVybiBYS19FZGlhZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJJZ3JhdmUiKSkgcmV0dXJuIFhLX0lncmF2ZTsKLQlpZiAoIXN0cmNtcChzLCAiSWFjdXRlIikpIHJldHVybiBYS19JYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgIkljaXJjdW1mbGV4IikpIHJldHVybiBYS19JY2lyY3VtZmxleDsKLQlpZiAoIXN0cmNtcChzLCAiSWRpYWVyZXNpcyIpKSByZXR1cm4gWEtfSWRpYWVyZXNpczsKLQlpZiAoIXN0cmNtcChzLCAiRVRIIikpIHJldHVybiBYS19FVEg7Ci0JaWYgKCFzdHJjbXAocywgIkV0aCIpKSByZXR1cm4gWEtfRXRoOwotCWlmICghc3RyY21wKHMsICJOdGlsZGUiKSkgcmV0dXJuIFhLX050aWxkZTsKLQlpZiAoIXN0cmNtcChzLCAiT2dyYXZlIikpIHJldHVybiBYS19PZ3JhdmU7Ci0JaWYgKCFzdHJjbXAocywgIk9hY3V0ZSIpKSByZXR1cm4gWEtfT2FjdXRlOwotCWlmICghc3RyY21wKHMsICJPY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfT2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgIk90aWxkZSIpKSByZXR1cm4gWEtfT3RpbGRlOwotCWlmICghc3RyY21wKHMsICJPZGlhZXJlc2lzIikpIHJldHVybiBYS19PZGlhZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJtdWx0aXBseSIpKSByZXR1cm4gWEtfbXVsdGlwbHk7Ci0JaWYgKCFzdHJjbXAocywgIk9vYmxpcXVlIikpIHJldHVybiBYS19Pb2JsaXF1ZTsKLQlpZiAoIXN0cmNtcChzLCAiVWdyYXZlIikpIHJldHVybiBYS19VZ3JhdmU7Ci0JaWYgKCFzdHJjbXAocywgIlVhY3V0ZSIpKSByZXR1cm4gWEtfVWFjdXRlOwotCWlmICghc3RyY21wKHMsICJVY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfVWNpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgIlVkaWFlcmVzaXMiKSkgcmV0dXJuIFhLX1VkaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgIllhY3V0ZSIpKSByZXR1cm4gWEtfWWFjdXRlOwotCWlmICghc3RyY21wKHMsICJUSE9STiIpKSByZXR1cm4gWEtfVEhPUk47Ci0JaWYgKCFzdHJjbXAocywgIlRob3JuIikpIHJldHVybiBYS19UaG9ybjsKLQlpZiAoIXN0cmNtcChzLCAic3NoYXJwIikpIHJldHVybiBYS19zc2hhcnA7Ci0JaWYgKCFzdHJjbXAocywgImFncmF2ZSIpKSByZXR1cm4gWEtfYWdyYXZlOwotCWlmICghc3RyY21wKHMsICJhYWN1dGUiKSkgcmV0dXJuIFhLX2FhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiYWNpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX2FjaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJhdGlsZGUiKSkgcmV0dXJuIFhLX2F0aWxkZTsKLQlpZiAoIXN0cmNtcChzLCAiYWRpYWVyZXNpcyIpKSByZXR1cm4gWEtfYWRpYWVyZXNpczsKLQlpZiAoIXN0cmNtcChzLCAiYXJpbmciKSkgcmV0dXJuIFhLX2FyaW5nOwotCWlmICghc3RyY21wKHMsICJhZSIpKSByZXR1cm4gWEtfYWU7Ci0JaWYgKCFzdHJjbXAocywgImNjZWRpbGxhIikpIHJldHVybiBYS19jY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAiZWdyYXZlIikpIHJldHVybiBYS19lZ3JhdmU7Ci0JaWYgKCFzdHJjbXAocywgImVhY3V0ZSIpKSByZXR1cm4gWEtfZWFjdXRlOwotCWlmICghc3RyY21wKHMsICJlY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfZWNpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgImVkaWFlcmVzaXMiKSkgcmV0dXJuIFhLX2VkaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgImlncmF2ZSIpKSByZXR1cm4gWEtfaWdyYXZlOwotCWlmICghc3RyY21wKHMsICJpYWN1dGUiKSkgcmV0dXJuIFhLX2lhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiaWNpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX2ljaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJpZGlhZXJlc2lzIikpIHJldHVybiBYS19pZGlhZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJldGgiKSkgcmV0dXJuIFhLX2V0aDsKLQlpZiAoIXN0cmNtcChzLCAibnRpbGRlIikpIHJldHVybiBYS19udGlsZGU7Ci0JaWYgKCFzdHJjbXAocywgIm9ncmF2ZSIpKSByZXR1cm4gWEtfb2dyYXZlOwotCWlmICghc3RyY21wKHMsICJvYWN1dGUiKSkgcmV0dXJuIFhLX29hY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAib2NpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX29jaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJvdGlsZGUiKSkgcmV0dXJuIFhLX290aWxkZTsKLQlpZiAoIXN0cmNtcChzLCAib2RpYWVyZXNpcyIpKSByZXR1cm4gWEtfb2RpYWVyZXNpczsKLQlpZiAoIXN0cmNtcChzLCAiZGl2aXNpb24iKSkgcmV0dXJuIFhLX2RpdmlzaW9uOwotCWlmICghc3RyY21wKHMsICJvc2xhc2giKSkgcmV0dXJuIFhLX29zbGFzaDsKLQlpZiAoIXN0cmNtcChzLCAidWdyYXZlIikpIHJldHVybiBYS191Z3JhdmU7Ci0JaWYgKCFzdHJjbXAocywgInVhY3V0ZSIpKSByZXR1cm4gWEtfdWFjdXRlOwotCWlmICghc3RyY21wKHMsICJ1Y2lyY3VtZmxleCIpKSByZXR1cm4gWEtfdWNpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgInVkaWFlcmVzaXMiKSkgcmV0dXJuIFhLX3VkaWFlcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgInlhY3V0ZSIpKSByZXR1cm4gWEtfeWFjdXRlOwotCWlmICghc3RyY21wKHMsICJ0aG9ybiIpKSByZXR1cm4gWEtfdGhvcm47Ci0JaWYgKCFzdHJjbXAocywgInlkaWFlcmVzaXMiKSkgcmV0dXJuIFhLX3lkaWFlcmVzaXM7Ci0jZW5kaWYgLyogWEtfTEFUSU4xICovCi0jaWZkZWYgWEtfTEFUSU4yCi0JaWYgKCFzdHJjbXAocywgIkFvZ29uZWsiKSkgcmV0dXJuIFhLX0FvZ29uZWs7Ci0JaWYgKCFzdHJjbXAocywgImJyZXZlIikpIHJldHVybiBYS19icmV2ZTsKLQlpZiAoIXN0cmNtcChzLCAiTHN0cm9rZSIpKSByZXR1cm4gWEtfTHN0cm9rZTsKLQlpZiAoIXN0cmNtcChzLCAiTGNhcm9uIikpIHJldHVybiBYS19MY2Fyb247Ci0JaWYgKCFzdHJjbXAocywgIlNhY3V0ZSIpKSByZXR1cm4gWEtfU2FjdXRlOwotCWlmICghc3RyY21wKHMsICJTY2Fyb24iKSkgcmV0dXJuIFhLX1NjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiU2NlZGlsbGEiKSkgcmV0dXJuIFhLX1NjZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJUY2Fyb24iKSkgcmV0dXJuIFhLX1RjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiWmFjdXRlIikpIHJldHVybiBYS19aYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgIlpjYXJvbiIpKSByZXR1cm4gWEtfWmNhcm9uOwotCWlmICghc3RyY21wKHMsICJaYWJvdmVkb3QiKSkgcmV0dXJuIFhLX1phYm92ZWRvdDsKLQlpZiAoIXN0cmNtcChzLCAiYW9nb25layIpKSByZXR1cm4gWEtfYW9nb25lazsKLQlpZiAoIXN0cmNtcChzLCAib2dvbmVrIikpIHJldHVybiBYS19vZ29uZWs7Ci0JaWYgKCFzdHJjbXAocywgImxzdHJva2UiKSkgcmV0dXJuIFhLX2xzdHJva2U7Ci0JaWYgKCFzdHJjbXAocywgImxjYXJvbiIpKSByZXR1cm4gWEtfbGNhcm9uOwotCWlmICghc3RyY21wKHMsICJzYWN1dGUiKSkgcmV0dXJuIFhLX3NhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiY2Fyb24iKSkgcmV0dXJuIFhLX2Nhcm9uOwotCWlmICghc3RyY21wKHMsICJzY2Fyb24iKSkgcmV0dXJuIFhLX3NjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAic2NlZGlsbGEiKSkgcmV0dXJuIFhLX3NjZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJ0Y2Fyb24iKSkgcmV0dXJuIFhLX3RjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiemFjdXRlIikpIHJldHVybiBYS196YWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgImRvdWJsZWFjdXRlIikpIHJldHVybiBYS19kb3VibGVhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiemNhcm9uIikpIHJldHVybiBYS196Y2Fyb247Ci0JaWYgKCFzdHJjbXAocywgInphYm92ZWRvdCIpKSByZXR1cm4gWEtfemFib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJSYWN1dGUiKSkgcmV0dXJuIFhLX1JhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiQWJyZXZlIikpIHJldHVybiBYS19BYnJldmU7Ci0JaWYgKCFzdHJjbXAocywgIkxhY3V0ZSIpKSByZXR1cm4gWEtfTGFjdXRlOwotCWlmICghc3RyY21wKHMsICJDYWN1dGUiKSkgcmV0dXJuIFhLX0NhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiQ2Nhcm9uIikpIHJldHVybiBYS19DY2Fyb247Ci0JaWYgKCFzdHJjbXAocywgIkVvZ29uZWsiKSkgcmV0dXJuIFhLX0VvZ29uZWs7Ci0JaWYgKCFzdHJjbXAocywgIkVjYXJvbiIpKSByZXR1cm4gWEtfRWNhcm9uOwotCWlmICghc3RyY21wKHMsICJEY2Fyb24iKSkgcmV0dXJuIFhLX0RjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiRHN0cm9rZSIpKSByZXR1cm4gWEtfRHN0cm9rZTsKLQlpZiAoIXN0cmNtcChzLCAiTmFjdXRlIikpIHJldHVybiBYS19OYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgIk5jYXJvbiIpKSByZXR1cm4gWEtfTmNhcm9uOwotCWlmICghc3RyY21wKHMsICJPZG91YmxlYWN1dGUiKSkgcmV0dXJuIFhLX09kb3VibGVhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiUmNhcm9uIikpIHJldHVybiBYS19SY2Fyb247Ci0JaWYgKCFzdHJjbXAocywgIlVyaW5nIikpIHJldHVybiBYS19VcmluZzsKLQlpZiAoIXN0cmNtcChzLCAiVWRvdWJsZWFjdXRlIikpIHJldHVybiBYS19VZG91YmxlYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgIlRjZWRpbGxhIikpIHJldHVybiBYS19UY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAicmFjdXRlIikpIHJldHVybiBYS19yYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgImFicmV2ZSIpKSByZXR1cm4gWEtfYWJyZXZlOwotCWlmICghc3RyY21wKHMsICJsYWN1dGUiKSkgcmV0dXJuIFhLX2xhY3V0ZTsKLQlpZiAoIXN0cmNtcChzLCAiY2FjdXRlIikpIHJldHVybiBYS19jYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgImNjYXJvbiIpKSByZXR1cm4gWEtfY2Nhcm9uOwotCWlmICghc3RyY21wKHMsICJlb2dvbmVrIikpIHJldHVybiBYS19lb2dvbmVrOwotCWlmICghc3RyY21wKHMsICJlY2Fyb24iKSkgcmV0dXJuIFhLX2VjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAiZGNhcm9uIikpIHJldHVybiBYS19kY2Fyb247Ci0JaWYgKCFzdHJjbXAocywgImRzdHJva2UiKSkgcmV0dXJuIFhLX2RzdHJva2U7Ci0JaWYgKCFzdHJjbXAocywgIm5hY3V0ZSIpKSByZXR1cm4gWEtfbmFjdXRlOwotCWlmICghc3RyY21wKHMsICJuY2Fyb24iKSkgcmV0dXJuIFhLX25jYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAib2RvdWJsZWFjdXRlIikpIHJldHVybiBYS19vZG91YmxlYWN1dGU7Ci0JaWYgKCFzdHJjbXAocywgInVkb3VibGVhY3V0ZSIpKSByZXR1cm4gWEtfdWRvdWJsZWFjdXRlOwotCWlmICghc3RyY21wKHMsICJyY2Fyb24iKSkgcmV0dXJuIFhLX3JjYXJvbjsKLQlpZiAoIXN0cmNtcChzLCAidXJpbmciKSkgcmV0dXJuIFhLX3VyaW5nOwotCWlmICghc3RyY21wKHMsICJ0Y2VkaWxsYSIpKSByZXR1cm4gWEtfdGNlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgImFib3ZlZG90IikpIHJldHVybiBYS19hYm92ZWRvdDsKLSNlbmRpZiAvKiBYS19MQVRJTjIgKi8KLSNpZmRlZiBYS19MQVRJTjMKLQlpZiAoIXN0cmNtcChzLCAiSHN0cm9rZSIpKSByZXR1cm4gWEtfSHN0cm9rZTsKLQlpZiAoIXN0cmNtcChzLCAiSGNpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX0hjaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJJYWJvdmVkb3QiKSkgcmV0dXJuIFhLX0lhYm92ZWRvdDsKLQlpZiAoIXN0cmNtcChzLCAiR2JyZXZlIikpIHJldHVybiBYS19HYnJldmU7Ci0JaWYgKCFzdHJjbXAocywgIkpjaXJjdW1mbGV4IikpIHJldHVybiBYS19KY2lyY3VtZmxleDsKLQlpZiAoIXN0cmNtcChzLCAiaHN0cm9rZSIpKSByZXR1cm4gWEtfaHN0cm9rZTsKLQlpZiAoIXN0cmNtcChzLCAiaGNpcmN1bWZsZXgiKSkgcmV0dXJuIFhLX2hjaXJjdW1mbGV4OwotCWlmICghc3RyY21wKHMsICJpZG90bGVzcyIpKSByZXR1cm4gWEtfaWRvdGxlc3M7Ci0JaWYgKCFzdHJjbXAocywgImdicmV2ZSIpKSByZXR1cm4gWEtfZ2JyZXZlOwotCWlmICghc3RyY21wKHMsICJqY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfamNpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgIkNhYm92ZWRvdCIpKSByZXR1cm4gWEtfQ2Fib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJDY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfQ2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgIkdhYm92ZWRvdCIpKSByZXR1cm4gWEtfR2Fib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJHY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfR2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgIlVicmV2ZSIpKSByZXR1cm4gWEtfVWJyZXZlOwotCWlmICghc3RyY21wKHMsICJTY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfU2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgImNhYm92ZWRvdCIpKSByZXR1cm4gWEtfY2Fib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJjY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfY2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgImdhYm92ZWRvdCIpKSByZXR1cm4gWEtfZ2Fib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJnY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfZ2NpcmN1bWZsZXg7Ci0JaWYgKCFzdHJjbXAocywgInVicmV2ZSIpKSByZXR1cm4gWEtfdWJyZXZlOwotCWlmICghc3RyY21wKHMsICJzY2lyY3VtZmxleCIpKSByZXR1cm4gWEtfc2NpcmN1bWZsZXg7Ci0jZW5kaWYgLyogWEtfTEFUSU4zICovCi0jaWZkZWYgWEtfTEFUSU40Ci0JaWYgKCFzdHJjbXAocywgImtyYSIpKSByZXR1cm4gWEtfa3JhOwotCWlmICghc3RyY21wKHMsICJrYXBwYSIpKSByZXR1cm4gWEtfa2FwcGE7Ci0JaWYgKCFzdHJjbXAocywgIlJjZWRpbGxhIikpIHJldHVybiBYS19SY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAiSXRpbGRlIikpIHJldHVybiBYS19JdGlsZGU7Ci0JaWYgKCFzdHJjbXAocywgIkxjZWRpbGxhIikpIHJldHVybiBYS19MY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAiRW1hY3JvbiIpKSByZXR1cm4gWEtfRW1hY3JvbjsKLQlpZiAoIXN0cmNtcChzLCAiR2NlZGlsbGEiKSkgcmV0dXJuIFhLX0djZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJUc2xhc2giKSkgcmV0dXJuIFhLX1RzbGFzaDsKLQlpZiAoIXN0cmNtcChzLCAicmNlZGlsbGEiKSkgcmV0dXJuIFhLX3JjZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJpdGlsZGUiKSkgcmV0dXJuIFhLX2l0aWxkZTsKLQlpZiAoIXN0cmNtcChzLCAibGNlZGlsbGEiKSkgcmV0dXJuIFhLX2xjZWRpbGxhOwotCWlmICghc3RyY21wKHMsICJlbWFjcm9uIikpIHJldHVybiBYS19lbWFjcm9uOwotCWlmICghc3RyY21wKHMsICJnY2VkaWxsYSIpKSByZXR1cm4gWEtfZ2NlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgInRzbGFzaCIpKSByZXR1cm4gWEtfdHNsYXNoOwotCWlmICghc3RyY21wKHMsICJFTkciKSkgcmV0dXJuIFhLX0VORzsKLQlpZiAoIXN0cmNtcChzLCAiZW5nIikpIHJldHVybiBYS19lbmc7Ci0JaWYgKCFzdHJjbXAocywgIkFtYWNyb24iKSkgcmV0dXJuIFhLX0FtYWNyb247Ci0JaWYgKCFzdHJjbXAocywgIklvZ29uZWsiKSkgcmV0dXJuIFhLX0lvZ29uZWs7Ci0JaWYgKCFzdHJjbXAocywgIkVhYm92ZWRvdCIpKSByZXR1cm4gWEtfRWFib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJJbWFjcm9uIikpIHJldHVybiBYS19JbWFjcm9uOwotCWlmICghc3RyY21wKHMsICJOY2VkaWxsYSIpKSByZXR1cm4gWEtfTmNlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgIk9tYWNyb24iKSkgcmV0dXJuIFhLX09tYWNyb247Ci0JaWYgKCFzdHJjbXAocywgIktjZWRpbGxhIikpIHJldHVybiBYS19LY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAiVW9nb25layIpKSByZXR1cm4gWEtfVW9nb25lazsKLQlpZiAoIXN0cmNtcChzLCAiVXRpbGRlIikpIHJldHVybiBYS19VdGlsZGU7Ci0JaWYgKCFzdHJjbXAocywgIlVtYWNyb24iKSkgcmV0dXJuIFhLX1VtYWNyb247Ci0JaWYgKCFzdHJjbXAocywgImFtYWNyb24iKSkgcmV0dXJuIFhLX2FtYWNyb247Ci0JaWYgKCFzdHJjbXAocywgImlvZ29uZWsiKSkgcmV0dXJuIFhLX2lvZ29uZWs7Ci0JaWYgKCFzdHJjbXAocywgImVhYm92ZWRvdCIpKSByZXR1cm4gWEtfZWFib3ZlZG90OwotCWlmICghc3RyY21wKHMsICJpbWFjcm9uIikpIHJldHVybiBYS19pbWFjcm9uOwotCWlmICghc3RyY21wKHMsICJuY2VkaWxsYSIpKSByZXR1cm4gWEtfbmNlZGlsbGE7Ci0JaWYgKCFzdHJjbXAocywgIm9tYWNyb24iKSkgcmV0dXJuIFhLX29tYWNyb247Ci0JaWYgKCFzdHJjbXAocywgImtjZWRpbGxhIikpIHJldHVybiBYS19rY2VkaWxsYTsKLQlpZiAoIXN0cmNtcChzLCAidW9nb25layIpKSByZXR1cm4gWEtfdW9nb25lazsKLQlpZiAoIXN0cmNtcChzLCAidXRpbGRlIikpIHJldHVybiBYS191dGlsZGU7Ci0JaWYgKCFzdHJjbXAocywgInVtYWNyb24iKSkgcmV0dXJuIFhLX3VtYWNyb247Ci0jZW5kaWYgLyogWEtfTEFUSU40ICovCi0jaWZkZWYgWEtfS0FUQUtBTkEKLQlpZiAoIXN0cmNtcChzLCAib3ZlcmxpbmUiKSkgcmV0dXJuIFhLX292ZXJsaW5lOwotCWlmICghc3RyY21wKHMsICJrYW5hX2Z1bGxzdG9wIikpIHJldHVybiBYS19rYW5hX2Z1bGxzdG9wOwotCWlmICghc3RyY21wKHMsICJrYW5hX29wZW5pbmdicmFja2V0IikpIHJldHVybiBYS19rYW5hX29wZW5pbmdicmFja2V0OwotCWlmICghc3RyY21wKHMsICJrYW5hX2Nsb3NpbmdicmFja2V0IikpIHJldHVybiBYS19rYW5hX2Nsb3NpbmdicmFja2V0OwotCWlmICghc3RyY21wKHMsICJrYW5hX2NvbW1hIikpIHJldHVybiBYS19rYW5hX2NvbW1hOwotCWlmICghc3RyY21wKHMsICJrYW5hX2Nvbmp1bmN0aXZlIikpIHJldHVybiBYS19rYW5hX2Nvbmp1bmN0aXZlOwotCWlmICghc3RyY21wKHMsICJrYW5hX21pZGRsZWRvdCIpKSByZXR1cm4gWEtfa2FuYV9taWRkbGVkb3Q7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfV08iKSkgcmV0dXJuIFhLX2thbmFfV087Ci0JaWYgKCFzdHJjbXAocywgImthbmFfYSIpKSByZXR1cm4gWEtfa2FuYV9hOwotCWlmICghc3RyY21wKHMsICJrYW5hX2kiKSkgcmV0dXJuIFhLX2thbmFfaTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV91IikpIHJldHVybiBYS19rYW5hX3U7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfZSIpKSByZXR1cm4gWEtfa2FuYV9lOwotCWlmICghc3RyY21wKHMsICJrYW5hX28iKSkgcmV0dXJuIFhLX2thbmFfbzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV95YSIpKSByZXR1cm4gWEtfa2FuYV95YTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV95dSIpKSByZXR1cm4gWEtfa2FuYV95dTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV95byIpKSByZXR1cm4gWEtfa2FuYV95bzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV90c3UiKSkgcmV0dXJuIFhLX2thbmFfdHN1OwotCWlmICghc3RyY21wKHMsICJrYW5hX3R1IikpIHJldHVybiBYS19rYW5hX3R1OwotCWlmICghc3RyY21wKHMsICJwcm9sb25nZWRzb3VuZCIpKSByZXR1cm4gWEtfcHJvbG9uZ2Vkc291bmQ7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfQSIpKSByZXR1cm4gWEtfa2FuYV9BOwotCWlmICghc3RyY21wKHMsICJrYW5hX0kiKSkgcmV0dXJuIFhLX2thbmFfSTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9VIikpIHJldHVybiBYS19rYW5hX1U7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfRSIpKSByZXR1cm4gWEtfa2FuYV9FOwotCWlmICghc3RyY21wKHMsICJrYW5hX08iKSkgcmV0dXJuIFhLX2thbmFfTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9LQSIpKSByZXR1cm4gWEtfa2FuYV9LQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9LSSIpKSByZXR1cm4gWEtfa2FuYV9LSTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9LVSIpKSByZXR1cm4gWEtfa2FuYV9LVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9LRSIpKSByZXR1cm4gWEtfa2FuYV9LRTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9LTyIpKSByZXR1cm4gWEtfa2FuYV9LTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9TQSIpKSByZXR1cm4gWEtfa2FuYV9TQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9TSEkiKSkgcmV0dXJuIFhLX2thbmFfU0hJOwotCWlmICghc3RyY21wKHMsICJrYW5hX1NVIikpIHJldHVybiBYS19rYW5hX1NVOwotCWlmICghc3RyY21wKHMsICJrYW5hX1NFIikpIHJldHVybiBYS19rYW5hX1NFOwotCWlmICghc3RyY21wKHMsICJrYW5hX1NPIikpIHJldHVybiBYS19rYW5hX1NPOwotCWlmICghc3RyY21wKHMsICJrYW5hX1RBIikpIHJldHVybiBYS19rYW5hX1RBOwotCWlmICghc3RyY21wKHMsICJrYW5hX0NISSIpKSByZXR1cm4gWEtfa2FuYV9DSEk7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfVEkiKSkgcmV0dXJuIFhLX2thbmFfVEk7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfVFNVIikpIHJldHVybiBYS19rYW5hX1RTVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9UVSIpKSByZXR1cm4gWEtfa2FuYV9UVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9URSIpKSByZXR1cm4gWEtfa2FuYV9URTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9UTyIpKSByZXR1cm4gWEtfa2FuYV9UTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9OQSIpKSByZXR1cm4gWEtfa2FuYV9OQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9OSSIpKSByZXR1cm4gWEtfa2FuYV9OSTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9OVSIpKSByZXR1cm4gWEtfa2FuYV9OVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ORSIpKSByZXR1cm4gWEtfa2FuYV9ORTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9OTyIpKSByZXR1cm4gWEtfa2FuYV9OTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9IQSIpKSByZXR1cm4gWEtfa2FuYV9IQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ISSIpKSByZXR1cm4gWEtfa2FuYV9ISTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9GVSIpKSByZXR1cm4gWEtfa2FuYV9GVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9IVSIpKSByZXR1cm4gWEtfa2FuYV9IVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9IRSIpKSByZXR1cm4gWEtfa2FuYV9IRTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ITyIpKSByZXR1cm4gWEtfa2FuYV9ITzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9NQSIpKSByZXR1cm4gWEtfa2FuYV9NQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9NSSIpKSByZXR1cm4gWEtfa2FuYV9NSTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9NVSIpKSByZXR1cm4gWEtfa2FuYV9NVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9NRSIpKSByZXR1cm4gWEtfa2FuYV9NRTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9NTyIpKSByZXR1cm4gWEtfa2FuYV9NTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ZQSIpKSByZXR1cm4gWEtfa2FuYV9ZQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ZVSIpKSByZXR1cm4gWEtfa2FuYV9ZVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9ZTyIpKSByZXR1cm4gWEtfa2FuYV9ZTzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9SQSIpKSByZXR1cm4gWEtfa2FuYV9SQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9SSSIpKSByZXR1cm4gWEtfa2FuYV9SSTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9SVSIpKSByZXR1cm4gWEtfa2FuYV9SVTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9SRSIpKSByZXR1cm4gWEtfa2FuYV9SRTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9STyIpKSByZXR1cm4gWEtfa2FuYV9STzsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9XQSIpKSByZXR1cm4gWEtfa2FuYV9XQTsKLQlpZiAoIXN0cmNtcChzLCAia2FuYV9OIikpIHJldHVybiBYS19rYW5hX047Ci0JaWYgKCFzdHJjbXAocywgInZvaWNlZHNvdW5kIikpIHJldHVybiBYS192b2ljZWRzb3VuZDsKLQlpZiAoIXN0cmNtcChzLCAic2VtaXZvaWNlZHNvdW5kIikpIHJldHVybiBYS19zZW1pdm9pY2Vkc291bmQ7Ci0JaWYgKCFzdHJjbXAocywgImthbmFfc3dpdGNoIikpIHJldHVybiBYS19rYW5hX3N3aXRjaDsKLSNlbmRpZiAvKiBYS19LQVRBS0FOQSAqLwotI2lmZGVmIFhLX0FSQUJJQwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfY29tbWEiKSkgcmV0dXJuIFhLX0FyYWJpY19jb21tYTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX3NlbWljb2xvbiIpKSByZXR1cm4gWEtfQXJhYmljX3NlbWljb2xvbjsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX3F1ZXN0aW9uX21hcmsiKSkgcmV0dXJuIFhLX0FyYWJpY19xdWVzdGlvbl9tYXJrOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfaGFtemEiKSkgcmV0dXJuIFhLX0FyYWJpY19oYW16YTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX21hZGRhb25hbGVmIikpIHJldHVybiBYS19BcmFiaWNfbWFkZGFvbmFsZWY7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19oYW16YW9uYWxlZiIpKSByZXR1cm4gWEtfQXJhYmljX2hhbXphb25hbGVmOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfaGFtemFvbndhdyIpKSByZXR1cm4gWEtfQXJhYmljX2hhbXphb253YXc7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19oYW16YXVuZGVyYWxlZiIpKSByZXR1cm4gWEtfQXJhYmljX2hhbXphdW5kZXJhbGVmOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfaGFtemFvbnllaCIpKSByZXR1cm4gWEtfQXJhYmljX2hhbXphb255ZWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19hbGVmIikpIHJldHVybiBYS19BcmFiaWNfYWxlZjsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2JlaCIpKSByZXR1cm4gWEtfQXJhYmljX2JlaDsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX3RlaG1hcmJ1dGEiKSkgcmV0dXJuIFhLX0FyYWJpY190ZWhtYXJidXRhOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfdGVoIikpIHJldHVybiBYS19BcmFiaWNfdGVoOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfdGhlaCIpKSByZXR1cm4gWEtfQXJhYmljX3RoZWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19qZWVtIikpIHJldHVybiBYS19BcmFiaWNfamVlbTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2hhaCIpKSByZXR1cm4gWEtfQXJhYmljX2hhaDsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2toYWgiKSkgcmV0dXJuIFhLX0FyYWJpY19raGFoOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfZGFsIikpIHJldHVybiBYS19BcmFiaWNfZGFsOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfdGhhbCIpKSByZXR1cm4gWEtfQXJhYmljX3RoYWw7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19yYSIpKSByZXR1cm4gWEtfQXJhYmljX3JhOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfemFpbiIpKSByZXR1cm4gWEtfQXJhYmljX3phaW47Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19zZWVuIikpIHJldHVybiBYS19BcmFiaWNfc2VlbjsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX3NoZWVuIikpIHJldHVybiBYS19BcmFiaWNfc2hlZW47Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19zYWQiKSkgcmV0dXJuIFhLX0FyYWJpY19zYWQ7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19kYWQiKSkgcmV0dXJuIFhLX0FyYWJpY19kYWQ7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY190YWgiKSkgcmV0dXJuIFhLX0FyYWJpY190YWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY196YWgiKSkgcmV0dXJuIFhLX0FyYWJpY196YWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19haW4iKSkgcmV0dXJuIFhLX0FyYWJpY19haW47Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19naGFpbiIpKSByZXR1cm4gWEtfQXJhYmljX2doYWluOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfdGF0d2VlbCIpKSByZXR1cm4gWEtfQXJhYmljX3RhdHdlZWw7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19mZWgiKSkgcmV0dXJuIFhLX0FyYWJpY19mZWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19xYWYiKSkgcmV0dXJuIFhLX0FyYWJpY19xYWY7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19rYWYiKSkgcmV0dXJuIFhLX0FyYWJpY19rYWY7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19sYW0iKSkgcmV0dXJuIFhLX0FyYWJpY19sYW07Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19tZWVtIikpIHJldHVybiBYS19BcmFiaWNfbWVlbTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX25vb24iKSkgcmV0dXJuIFhLX0FyYWJpY19ub29uOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfaGEiKSkgcmV0dXJuIFhLX0FyYWJpY19oYTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2hlaCIpKSByZXR1cm4gWEtfQXJhYmljX2hlaDsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX3dhdyIpKSByZXR1cm4gWEtfQXJhYmljX3dhdzsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2FsZWZtYWtzdXJhIikpIHJldHVybiBYS19BcmFiaWNfYWxlZm1ha3N1cmE7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY195ZWgiKSkgcmV0dXJuIFhLX0FyYWJpY195ZWg7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19mYXRoYXRhbiIpKSByZXR1cm4gWEtfQXJhYmljX2ZhdGhhdGFuOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfZGFtbWF0YW4iKSkgcmV0dXJuIFhLX0FyYWJpY19kYW1tYXRhbjsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2thc3JhdGFuIikpIHJldHVybiBYS19BcmFiaWNfa2FzcmF0YW47Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19mYXRoYSIpKSByZXR1cm4gWEtfQXJhYmljX2ZhdGhhOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfZGFtbWEiKSkgcmV0dXJuIFhLX0FyYWJpY19kYW1tYTsKLQlpZiAoIXN0cmNtcChzLCAiQXJhYmljX2thc3JhIikpIHJldHVybiBYS19BcmFiaWNfa2FzcmE7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19zaGFkZGEiKSkgcmV0dXJuIFhLX0FyYWJpY19zaGFkZGE7Ci0JaWYgKCFzdHJjbXAocywgIkFyYWJpY19zdWt1biIpKSByZXR1cm4gWEtfQXJhYmljX3N1a3VuOwotCWlmICghc3RyY21wKHMsICJBcmFiaWNfc3dpdGNoIikpIHJldHVybiBYS19BcmFiaWNfc3dpdGNoOwotI2VuZGlmIC8qIFhLX0FSQUJJQyAqLwotI2lmZGVmIFhLX0NZUklMTElDCi0JaWYgKCFzdHJjbXAocywgIlNlcmJpYW5fZGplIikpIHJldHVybiBYS19TZXJiaWFuX2RqZTsKLQlpZiAoIXN0cmNtcChzLCAiTWFjZWRvbmlhX2dqZSIpKSByZXR1cm4gWEtfTWFjZWRvbmlhX2dqZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfaW8iKSkgcmV0dXJuIFhLX0N5cmlsbGljX2lvOwotCWlmICghc3RyY21wKHMsICJVa3JhaW5pYW5faWUiKSkgcmV0dXJuIFhLX1VrcmFpbmlhbl9pZTsKLQlpZiAoIXN0cmNtcChzLCAiVWtyYW5pYW5famUiKSkgcmV0dXJuIFhLX1VrcmFuaWFuX2plOwotCWlmICghc3RyY21wKHMsICJNYWNlZG9uaWFfZHNlIikpIHJldHVybiBYS19NYWNlZG9uaWFfZHNlOwotCWlmICghc3RyY21wKHMsICJVa3JhaW5pYW5faSIpKSByZXR1cm4gWEtfVWtyYWluaWFuX2k7Ci0JaWYgKCFzdHJjbXAocywgIlVrcmFuaWFuX2kiKSkgcmV0dXJuIFhLX1VrcmFuaWFuX2k7Ci0JaWYgKCFzdHJjbXAocywgIlVrcmFpbmlhbl95aSIpKSByZXR1cm4gWEtfVWtyYWluaWFuX3lpOwotCWlmICghc3RyY21wKHMsICJVa3Jhbmlhbl95aSIpKSByZXR1cm4gWEtfVWtyYW5pYW5feWk7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2plIikpIHJldHVybiBYS19DeXJpbGxpY19qZTsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl9qZSIpKSByZXR1cm4gWEtfU2VyYmlhbl9qZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfbGplIikpIHJldHVybiBYS19DeXJpbGxpY19samU7Ci0JaWYgKCFzdHJjbXAocywgIlNlcmJpYW5fbGplIikpIHJldHVybiBYS19TZXJiaWFuX2xqZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfbmplIikpIHJldHVybiBYS19DeXJpbGxpY19uamU7Ci0JaWYgKCFzdHJjbXAocywgIlNlcmJpYW5fbmplIikpIHJldHVybiBYS19TZXJiaWFuX25qZTsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl90c2hlIikpIHJldHVybiBYS19TZXJiaWFuX3RzaGU7Ci0JaWYgKCFzdHJjbXAocywgIk1hY2Vkb25pYV9ramUiKSkgcmV0dXJuIFhLX01hY2Vkb25pYV9ramU7Ci0JaWYgKCFzdHJjbXAocywgIkJ5ZWxvcnVzc2lhbl9zaG9ydHUiKSkgcmV0dXJuIFhLX0J5ZWxvcnVzc2lhbl9zaG9ydHU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2R6aGUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX2R6aGU7Ci0JaWYgKCFzdHJjbXAocywgIlNlcmJpYW5fZHplIikpIHJldHVybiBYS19TZXJiaWFuX2R6ZTsKLQlpZiAoIXN0cmNtcChzLCAibnVtZXJvc2lnbiIpKSByZXR1cm4gWEtfbnVtZXJvc2lnbjsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl9ESkUiKSkgcmV0dXJuIFhLX1NlcmJpYW5fREpFOwotCWlmICghc3RyY21wKHMsICJNYWNlZG9uaWFfR0pFIikpIHJldHVybiBYS19NYWNlZG9uaWFfR0pFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19JTyIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfSU87Ci0JaWYgKCFzdHJjbXAocywgIlVrcmFpbmlhbl9JRSIpKSByZXR1cm4gWEtfVWtyYWluaWFuX0lFOwotCWlmICghc3RyY21wKHMsICJVa3Jhbmlhbl9KRSIpKSByZXR1cm4gWEtfVWtyYW5pYW5fSkU7Ci0JaWYgKCFzdHJjbXAocywgIk1hY2Vkb25pYV9EU0UiKSkgcmV0dXJuIFhLX01hY2Vkb25pYV9EU0U7Ci0JaWYgKCFzdHJjbXAocywgIlVrcmFpbmlhbl9JIikpIHJldHVybiBYS19Va3JhaW5pYW5fSTsKLQlpZiAoIXN0cmNtcChzLCAiVWtyYW5pYW5fSSIpKSByZXR1cm4gWEtfVWtyYW5pYW5fSTsKLQlpZiAoIXN0cmNtcChzLCAiVWtyYWluaWFuX1lJIikpIHJldHVybiBYS19Va3JhaW5pYW5fWUk7Ci0JaWYgKCFzdHJjbXAocywgIlVrcmFuaWFuX1lJIikpIHJldHVybiBYS19Va3Jhbmlhbl9ZSTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfSkUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0pFOwotCWlmICghc3RyY21wKHMsICJTZXJiaWFuX0pFIikpIHJldHVybiBYS19TZXJiaWFuX0pFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19MSkUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0xKRTsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl9MSkUiKSkgcmV0dXJuIFhLX1NlcmJpYW5fTEpFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19OSkUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX05KRTsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl9OSkUiKSkgcmV0dXJuIFhLX1NlcmJpYW5fTkpFOwotCWlmICghc3RyY21wKHMsICJTZXJiaWFuX1RTSEUiKSkgcmV0dXJuIFhLX1NlcmJpYW5fVFNIRTsKLQlpZiAoIXN0cmNtcChzLCAiTWFjZWRvbmlhX0tKRSIpKSByZXR1cm4gWEtfTWFjZWRvbmlhX0tKRTsKLQlpZiAoIXN0cmNtcChzLCAiQnllbG9ydXNzaWFuX1NIT1JUVSIpKSByZXR1cm4gWEtfQnllbG9ydXNzaWFuX1NIT1JUVTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfRFpIRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfRFpIRTsKLQlpZiAoIXN0cmNtcChzLCAiU2VyYmlhbl9EWkUiKSkgcmV0dXJuIFhLX1NlcmJpYW5fRFpFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY195dSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfeXU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2EiKSkgcmV0dXJuIFhLX0N5cmlsbGljX2E7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2JlIikpIHJldHVybiBYS19DeXJpbGxpY19iZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfdHNlIikpIHJldHVybiBYS19DeXJpbGxpY190c2U7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2RlIikpIHJldHVybiBYS19DeXJpbGxpY19kZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfaWUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX2llOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19lZiIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfZWY7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2doZSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfZ2hlOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19oYSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfaGE7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2kiKSkgcmV0dXJuIFhLX0N5cmlsbGljX2k7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX3Nob3J0aSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfc2hvcnRpOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19rYSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfa2E7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2VsIikpIHJldHVybiBYS19DeXJpbGxpY19lbDsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfZW0iKSkgcmV0dXJuIFhLX0N5cmlsbGljX2VtOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19lbiIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfZW47Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX28iKSkgcmV0dXJuIFhLX0N5cmlsbGljX287Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX3BlIikpIHJldHVybiBYS19DeXJpbGxpY19wZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfeWEiKSkgcmV0dXJuIFhLX0N5cmlsbGljX3lhOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19lciIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfZXI7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2VzIikpIHJldHVybiBYS19DeXJpbGxpY19lczsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfdGUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX3RlOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY191IikpIHJldHVybiBYS19DeXJpbGxpY191OwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY196aGUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX3poZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfdmUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX3ZlOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19zb2Z0c2lnbiIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfc29mdHNpZ247Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX3llcnUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX3llcnU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX3plIikpIHJldHVybiBYS19DeXJpbGxpY196ZTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfc2hhIikpIHJldHVybiBYS19DeXJpbGxpY19zaGE7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2UiKSkgcmV0dXJuIFhLX0N5cmlsbGljX2U7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX3NoY2hhIikpIHJldHVybiBYS19DeXJpbGxpY19zaGNoYTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfY2hlIikpIHJldHVybiBYS19DeXJpbGxpY19jaGU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX2hhcmRzaWduIikpIHJldHVybiBYS19DeXJpbGxpY19oYXJkc2lnbjsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfWVUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX1lVOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19BIikpIHJldHVybiBYS19DeXJpbGxpY19BOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19CRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfQkU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX1RTRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfVFNFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19ERSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfREU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX0lFIikpIHJldHVybiBYS19DeXJpbGxpY19JRTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfRUYiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0VGOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19HSEUiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0dIRTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfSEEiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0hBOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19JIikpIHJldHVybiBYS19DeXJpbGxpY19JOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19TSE9SVEkiKSkgcmV0dXJuIFhLX0N5cmlsbGljX1NIT1JUSTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfS0EiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0tBOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19FTCIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfRUw7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX0VNIikpIHJldHVybiBYS19DeXJpbGxpY19FTTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfRU4iKSkgcmV0dXJuIFhLX0N5cmlsbGljX0VOOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19PIikpIHJldHVybiBYS19DeXJpbGxpY19POwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19QRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfUEU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX1lBIikpIHJldHVybiBYS19DeXJpbGxpY19ZQTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfRVIiKSkgcmV0dXJuIFhLX0N5cmlsbGljX0VSOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19FUyIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfRVM7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX1RFIikpIHJldHVybiBYS19DeXJpbGxpY19URTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfVSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfVTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfWkhFIikpIHJldHVybiBYS19DeXJpbGxpY19aSEU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX1ZFIikpIHJldHVybiBYS19DeXJpbGxpY19WRTsKLQlpZiAoIXN0cmNtcChzLCAiQ3lyaWxsaWNfU09GVFNJR04iKSkgcmV0dXJuIFhLX0N5cmlsbGljX1NPRlRTSUdOOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19ZRVJVIikpIHJldHVybiBYS19DeXJpbGxpY19ZRVJVOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19aRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfWkU7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX1NIQSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfU0hBOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19FIikpIHJldHVybiBYS19DeXJpbGxpY19FOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19TSENIQSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfU0hDSEE7Ci0JaWYgKCFzdHJjbXAocywgIkN5cmlsbGljX0NIRSIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfQ0hFOwotCWlmICghc3RyY21wKHMsICJDeXJpbGxpY19IQVJEU0lHTiIpKSByZXR1cm4gWEtfQ3lyaWxsaWNfSEFSRFNJR047Ci0jZW5kaWYgLyogWEtfQ1lSSUxMSUMgKi8KLSNpZmRlZiBYS19HUkVFSwotCWlmICghc3RyY21wKHMsICJHcmVla19BTFBIQWFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfQUxQSEFhY2NlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0VQU0lMT05hY2NlbnQiKSkgcmV0dXJuIFhLX0dyZWVrX0VQU0lMT05hY2NlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0VUQWFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfRVRBYWNjZW50OwotCWlmICghc3RyY21wKHMsICJHcmVla19JT1RBYWNjZW50IikpIHJldHVybiBYS19HcmVla19JT1RBYWNjZW50OwotCWlmICghc3RyY21wKHMsICJHcmVla19JT1RBZGllcmVzaXMiKSkgcmV0dXJuIFhLX0dyZWVrX0lPVEFkaWVyZXNpczsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfT01JQ1JPTmFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfT01JQ1JPTmFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfVVBTSUxPTmFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfVVBTSUxPTmFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfVVBTSUxPTmRpZXJlc2lzIikpIHJldHVybiBYS19HcmVla19VUFNJTE9OZGllcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX09NRUdBYWNjZW50IikpIHJldHVybiBYS19HcmVla19PTUVHQWFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfYWNjZW50ZGllcmVzaXMiKSkgcmV0dXJuIFhLX0dyZWVrX2FjY2VudGRpZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJHcmVla19ob3JpemJhciIpKSByZXR1cm4gWEtfR3JlZWtfaG9yaXpiYXI7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2FscGhhYWNjZW50IikpIHJldHVybiBYS19HcmVla19hbHBoYWFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfZXBzaWxvbmFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfZXBzaWxvbmFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfZXRhYWNjZW50IikpIHJldHVybiBYS19HcmVla19ldGFhY2NlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2lvdGFhY2NlbnQiKSkgcmV0dXJuIFhLX0dyZWVrX2lvdGFhY2NlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2lvdGFkaWVyZXNpcyIpKSByZXR1cm4gWEtfR3JlZWtfaW90YWRpZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJHcmVla19pb3RhYWNjZW50ZGllcmVzaXMiKSkgcmV0dXJuIFhLX0dyZWVrX2lvdGFhY2NlbnRkaWVyZXNpczsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfb21pY3JvbmFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfb21pY3JvbmFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfdXBzaWxvbmFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfdXBzaWxvbmFjY2VudDsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfdXBzaWxvbmRpZXJlc2lzIikpIHJldHVybiBYS19HcmVla191cHNpbG9uZGllcmVzaXM7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3Vwc2lsb25hY2NlbnRkaWVyZXNpcyIpKSByZXR1cm4gWEtfR3JlZWtfdXBzaWxvbmFjY2VudGRpZXJlc2lzOwotCWlmICghc3RyY21wKHMsICJHcmVla19vbWVnYWFjY2VudCIpKSByZXR1cm4gWEtfR3JlZWtfb21lZ2FhY2NlbnQ7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0FMUEhBIikpIHJldHVybiBYS19HcmVla19BTFBIQTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfQkVUQSIpKSByZXR1cm4gWEtfR3JlZWtfQkVUQTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfR0FNTUEiKSkgcmV0dXJuIFhLX0dyZWVrX0dBTU1BOwotCWlmICghc3RyY21wKHMsICJHcmVla19ERUxUQSIpKSByZXR1cm4gWEtfR3JlZWtfREVMVEE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0VQU0lMT04iKSkgcmV0dXJuIFhLX0dyZWVrX0VQU0lMT047Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX1pFVEEiKSkgcmV0dXJuIFhLX0dyZWVrX1pFVEE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0VUQSIpKSByZXR1cm4gWEtfR3JlZWtfRVRBOwotCWlmICghc3RyY21wKHMsICJHcmVla19USEVUQSIpKSByZXR1cm4gWEtfR3JlZWtfVEhFVEE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0lPVEEiKSkgcmV0dXJuIFhLX0dyZWVrX0lPVEE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0tBUFBBIikpIHJldHVybiBYS19HcmVla19LQVBQQTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfTEFNREEiKSkgcmV0dXJuIFhLX0dyZWVrX0xBTURBOwotCWlmICghc3RyY21wKHMsICJHcmVla19MQU1CREEiKSkgcmV0dXJuIFhLX0dyZWVrX0xBTUJEQTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfTVUiKSkgcmV0dXJuIFhLX0dyZWVrX01VOwotCWlmICghc3RyY21wKHMsICJHcmVla19OVSIpKSByZXR1cm4gWEtfR3JlZWtfTlU7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX1hJIikpIHJldHVybiBYS19HcmVla19YSTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfT01JQ1JPTiIpKSByZXR1cm4gWEtfR3JlZWtfT01JQ1JPTjsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfUEkiKSkgcmV0dXJuIFhLX0dyZWVrX1BJOwotCWlmICghc3RyY21wKHMsICJHcmVla19SSE8iKSkgcmV0dXJuIFhLX0dyZWVrX1JITzsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfU0lHTUEiKSkgcmV0dXJuIFhLX0dyZWVrX1NJR01BOwotCWlmICghc3RyY21wKHMsICJHcmVla19UQVUiKSkgcmV0dXJuIFhLX0dyZWVrX1RBVTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfVVBTSUxPTiIpKSByZXR1cm4gWEtfR3JlZWtfVVBTSUxPTjsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfUEhJIikpIHJldHVybiBYS19HcmVla19QSEk7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX0NISSIpKSByZXR1cm4gWEtfR3JlZWtfQ0hJOwotCWlmICghc3RyY21wKHMsICJHcmVla19QU0kiKSkgcmV0dXJuIFhLX0dyZWVrX1BTSTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfT01FR0EiKSkgcmV0dXJuIFhLX0dyZWVrX09NRUdBOwotCWlmICghc3RyY21wKHMsICJHcmVla19hbHBoYSIpKSByZXR1cm4gWEtfR3JlZWtfYWxwaGE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2JldGEiKSkgcmV0dXJuIFhLX0dyZWVrX2JldGE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2dhbW1hIikpIHJldHVybiBYS19HcmVla19nYW1tYTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfZGVsdGEiKSkgcmV0dXJuIFhLX0dyZWVrX2RlbHRhOwotCWlmICghc3RyY21wKHMsICJHcmVla19lcHNpbG9uIikpIHJldHVybiBYS19HcmVla19lcHNpbG9uOwotCWlmICghc3RyY21wKHMsICJHcmVla196ZXRhIikpIHJldHVybiBYS19HcmVla196ZXRhOwotCWlmICghc3RyY21wKHMsICJHcmVla19ldGEiKSkgcmV0dXJuIFhLX0dyZWVrX2V0YTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfdGhldGEiKSkgcmV0dXJuIFhLX0dyZWVrX3RoZXRhOwotCWlmICghc3RyY21wKHMsICJHcmVla19pb3RhIikpIHJldHVybiBYS19HcmVla19pb3RhOwotCWlmICghc3RyY21wKHMsICJHcmVla19rYXBwYSIpKSByZXR1cm4gWEtfR3JlZWtfa2FwcGE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX2xhbWRhIikpIHJldHVybiBYS19HcmVla19sYW1kYTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfbGFtYmRhIikpIHJldHVybiBYS19HcmVla19sYW1iZGE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX211IikpIHJldHVybiBYS19HcmVla19tdTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfbnUiKSkgcmV0dXJuIFhLX0dyZWVrX251OwotCWlmICghc3RyY21wKHMsICJHcmVla194aSIpKSByZXR1cm4gWEtfR3JlZWtfeGk7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX29taWNyb24iKSkgcmV0dXJuIFhLX0dyZWVrX29taWNyb247Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3BpIikpIHJldHVybiBYS19HcmVla19waTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfcmhvIikpIHJldHVybiBYS19HcmVla19yaG87Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3NpZ21hIikpIHJldHVybiBYS19HcmVla19zaWdtYTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfZmluYWxzbWFsbHNpZ21hIikpIHJldHVybiBYS19HcmVla19maW5hbHNtYWxsc2lnbWE7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3RhdSIpKSByZXR1cm4gWEtfR3JlZWtfdGF1OwotCWlmICghc3RyY21wKHMsICJHcmVla191cHNpbG9uIikpIHJldHVybiBYS19HcmVla191cHNpbG9uOwotCWlmICghc3RyY21wKHMsICJHcmVla19waGkiKSkgcmV0dXJuIFhLX0dyZWVrX3BoaTsKLQlpZiAoIXN0cmNtcChzLCAiR3JlZWtfY2hpIikpIHJldHVybiBYS19HcmVla19jaGk7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3BzaSIpKSByZXR1cm4gWEtfR3JlZWtfcHNpOwotCWlmICghc3RyY21wKHMsICJHcmVla19vbWVnYSIpKSByZXR1cm4gWEtfR3JlZWtfb21lZ2E7Ci0JaWYgKCFzdHJjbXAocywgIkdyZWVrX3N3aXRjaCIpKSByZXR1cm4gWEtfR3JlZWtfc3dpdGNoOwotI2VuZGlmIC8qIFhLX0dSRUVLICovCi0jaWZkZWYgWEtfVEVDSE5JQ0FMCi0JaWYgKCFzdHJjbXAocywgImxlZnRyYWRpY2FsIikpIHJldHVybiBYS19sZWZ0cmFkaWNhbDsKLQlpZiAoIXN0cmNtcChzLCAidG9wbGVmdHJhZGljYWwiKSkgcmV0dXJuIFhLX3RvcGxlZnRyYWRpY2FsOwotCWlmICghc3RyY21wKHMsICJob3JpemNvbm5lY3RvciIpKSByZXR1cm4gWEtfaG9yaXpjb25uZWN0b3I7Ci0JaWYgKCFzdHJjbXAocywgInRvcGludGVncmFsIikpIHJldHVybiBYS190b3BpbnRlZ3JhbDsKLQlpZiAoIXN0cmNtcChzLCAiYm90aW50ZWdyYWwiKSkgcmV0dXJuIFhLX2JvdGludGVncmFsOwotCWlmICghc3RyY21wKHMsICJ2ZXJ0Y29ubmVjdG9yIikpIHJldHVybiBYS192ZXJ0Y29ubmVjdG9yOwotCWlmICghc3RyY21wKHMsICJ0b3BsZWZ0c3FicmFja2V0IikpIHJldHVybiBYS190b3BsZWZ0c3FicmFja2V0OwotCWlmICghc3RyY21wKHMsICJib3RsZWZ0c3FicmFja2V0IikpIHJldHVybiBYS19ib3RsZWZ0c3FicmFja2V0OwotCWlmICghc3RyY21wKHMsICJ0b3ByaWdodHNxYnJhY2tldCIpKSByZXR1cm4gWEtfdG9wcmlnaHRzcWJyYWNrZXQ7Ci0JaWYgKCFzdHJjbXAocywgImJvdHJpZ2h0c3FicmFja2V0IikpIHJldHVybiBYS19ib3RyaWdodHNxYnJhY2tldDsKLQlpZiAoIXN0cmNtcChzLCAidG9wbGVmdHBhcmVucyIpKSByZXR1cm4gWEtfdG9wbGVmdHBhcmVuczsKLQlpZiAoIXN0cmNtcChzLCAiYm90bGVmdHBhcmVucyIpKSByZXR1cm4gWEtfYm90bGVmdHBhcmVuczsKLQlpZiAoIXN0cmNtcChzLCAidG9wcmlnaHRwYXJlbnMiKSkgcmV0dXJuIFhLX3RvcHJpZ2h0cGFyZW5zOwotCWlmICghc3RyY21wKHMsICJib3RyaWdodHBhcmVucyIpKSByZXR1cm4gWEtfYm90cmlnaHRwYXJlbnM7Ci0JaWYgKCFzdHJjbXAocywgImxlZnRtaWRkbGVjdXJseWJyYWNlIikpIHJldHVybiBYS19sZWZ0bWlkZGxlY3VybHlicmFjZTsKLQlpZiAoIXN0cmNtcChzLCAicmlnaHRtaWRkbGVjdXJseWJyYWNlIikpIHJldHVybiBYS19yaWdodG1pZGRsZWN1cmx5YnJhY2U7Ci0JaWYgKCFzdHJjbXAocywgInRvcGxlZnRzdW1tYXRpb24iKSkgcmV0dXJuIFhLX3RvcGxlZnRzdW1tYXRpb247Ci0JaWYgKCFzdHJjbXAocywgImJvdGxlZnRzdW1tYXRpb24iKSkgcmV0dXJuIFhLX2JvdGxlZnRzdW1tYXRpb247Ci0JaWYgKCFzdHJjbXAocywgInRvcHZlcnRzdW1tYXRpb25jb25uZWN0b3IiKSkgcmV0dXJuIFhLX3RvcHZlcnRzdW1tYXRpb25jb25uZWN0b3I7Ci0JaWYgKCFzdHJjbXAocywgImJvdHZlcnRzdW1tYXRpb25jb25uZWN0b3IiKSkgcmV0dXJuIFhLX2JvdHZlcnRzdW1tYXRpb25jb25uZWN0b3I7Ci0JaWYgKCFzdHJjbXAocywgInRvcHJpZ2h0c3VtbWF0aW9uIikpIHJldHVybiBYS190b3ByaWdodHN1bW1hdGlvbjsKLQlpZiAoIXN0cmNtcChzLCAiYm90cmlnaHRzdW1tYXRpb24iKSkgcmV0dXJuIFhLX2JvdHJpZ2h0c3VtbWF0aW9uOwotCWlmICghc3RyY21wKHMsICJyaWdodG1pZGRsZXN1bW1hdGlvbiIpKSByZXR1cm4gWEtfcmlnaHRtaWRkbGVzdW1tYXRpb247Ci0JaWYgKCFzdHJjbXAocywgImxlc3N0aGFuZXF1YWwiKSkgcmV0dXJuIFhLX2xlc3N0aGFuZXF1YWw7Ci0JaWYgKCFzdHJjbXAocywgIm5vdGVxdWFsIikpIHJldHVybiBYS19ub3RlcXVhbDsKLQlpZiAoIXN0cmNtcChzLCAiZ3JlYXRlcnRoYW5lcXVhbCIpKSByZXR1cm4gWEtfZ3JlYXRlcnRoYW5lcXVhbDsKLQlpZiAoIXN0cmNtcChzLCAiaW50ZWdyYWwiKSkgcmV0dXJuIFhLX2ludGVncmFsOwotCWlmICghc3RyY21wKHMsICJ0aGVyZWZvcmUiKSkgcmV0dXJuIFhLX3RoZXJlZm9yZTsKLQlpZiAoIXN0cmNtcChzLCAidmFyaWF0aW9uIikpIHJldHVybiBYS192YXJpYXRpb247Ci0JaWYgKCFzdHJjbXAocywgImluZmluaXR5IikpIHJldHVybiBYS19pbmZpbml0eTsKLQlpZiAoIXN0cmNtcChzLCAibmFibGEiKSkgcmV0dXJuIFhLX25hYmxhOwotCWlmICghc3RyY21wKHMsICJhcHByb3hpbWF0ZSIpKSByZXR1cm4gWEtfYXBwcm94aW1hdGU7Ci0JaWYgKCFzdHJjbXAocywgInNpbWlsYXJlcXVhbCIpKSByZXR1cm4gWEtfc2ltaWxhcmVxdWFsOwotCWlmICghc3RyY21wKHMsICJpZm9ubHlpZiIpKSByZXR1cm4gWEtfaWZvbmx5aWY7Ci0JaWYgKCFzdHJjbXAocywgImltcGxpZXMiKSkgcmV0dXJuIFhLX2ltcGxpZXM7Ci0JaWYgKCFzdHJjbXAocywgImlkZW50aWNhbCIpKSByZXR1cm4gWEtfaWRlbnRpY2FsOwotCWlmICghc3RyY21wKHMsICJyYWRpY2FsIikpIHJldHVybiBYS19yYWRpY2FsOwotCWlmICghc3RyY21wKHMsICJpbmNsdWRlZGluIikpIHJldHVybiBYS19pbmNsdWRlZGluOwotCWlmICghc3RyY21wKHMsICJpbmNsdWRlcyIpKSByZXR1cm4gWEtfaW5jbHVkZXM7Ci0JaWYgKCFzdHJjbXAocywgImludGVyc2VjdGlvbiIpKSByZXR1cm4gWEtfaW50ZXJzZWN0aW9uOwotCWlmICghc3RyY21wKHMsICJ1bmlvbiIpKSByZXR1cm4gWEtfdW5pb247Ci0JaWYgKCFzdHJjbXAocywgImxvZ2ljYWxhbmQiKSkgcmV0dXJuIFhLX2xvZ2ljYWxhbmQ7Ci0JaWYgKCFzdHJjbXAocywgImxvZ2ljYWxvciIpKSByZXR1cm4gWEtfbG9naWNhbG9yOwotCWlmICghc3RyY21wKHMsICJwYXJ0aWFsZGVyaXZhdGl2ZSIpKSByZXR1cm4gWEtfcGFydGlhbGRlcml2YXRpdmU7Ci0JaWYgKCFzdHJjbXAocywgImZ1bmN0aW9uIikpIHJldHVybiBYS19mdW5jdGlvbjsKLQlpZiAoIXN0cmNtcChzLCAibGVmdGFycm93IikpIHJldHVybiBYS19sZWZ0YXJyb3c7Ci0JaWYgKCFzdHJjbXAocywgInVwYXJyb3ciKSkgcmV0dXJuIFhLX3VwYXJyb3c7Ci0JaWYgKCFzdHJjbXAocywgInJpZ2h0YXJyb3ciKSkgcmV0dXJuIFhLX3JpZ2h0YXJyb3c7Ci0JaWYgKCFzdHJjbXAocywgImRvd25hcnJvdyIpKSByZXR1cm4gWEtfZG93bmFycm93OwotI2VuZGlmIC8qIFhLX1RFQ0hOSUNBTCAqLwotI2lmZGVmIFhLX1NQRUNJQUwKLQlpZiAoIXN0cmNtcChzLCAiYmxhbmsiKSkgcmV0dXJuIFhLX2JsYW5rOwotCWlmICghc3RyY21wKHMsICJzb2xpZGRpYW1vbmQiKSkgcmV0dXJuIFhLX3NvbGlkZGlhbW9uZDsKLQlpZiAoIXN0cmNtcChzLCAiY2hlY2tlcmJvYXJkIikpIHJldHVybiBYS19jaGVja2VyYm9hcmQ7Ci0JaWYgKCFzdHJjbXAocywgImh0IikpIHJldHVybiBYS19odDsKLQlpZiAoIXN0cmNtcChzLCAiZmYiKSkgcmV0dXJuIFhLX2ZmOwotCWlmICghc3RyY21wKHMsICJjciIpKSByZXR1cm4gWEtfY3I7Ci0JaWYgKCFzdHJjbXAocywgImxmIikpIHJldHVybiBYS19sZjsKLQlpZiAoIXN0cmNtcChzLCAibmwiKSkgcmV0dXJuIFhLX25sOwotCWlmICghc3RyY21wKHMsICJ2dCIpKSByZXR1cm4gWEtfdnQ7Ci0JaWYgKCFzdHJjbXAocywgImxvd3JpZ2h0Y29ybmVyIikpIHJldHVybiBYS19sb3dyaWdodGNvcm5lcjsKLQlpZiAoIXN0cmNtcChzLCAidXByaWdodGNvcm5lciIpKSByZXR1cm4gWEtfdXByaWdodGNvcm5lcjsKLQlpZiAoIXN0cmNtcChzLCAidXBsZWZ0Y29ybmVyIikpIHJldHVybiBYS191cGxlZnRjb3JuZXI7Ci0JaWYgKCFzdHJjbXAocywgImxvd2xlZnRjb3JuZXIiKSkgcmV0dXJuIFhLX2xvd2xlZnRjb3JuZXI7Ci0JaWYgKCFzdHJjbXAocywgImNyb3NzaW5nbGluZXMiKSkgcmV0dXJuIFhLX2Nyb3NzaW5nbGluZXM7Ci0JaWYgKCFzdHJjbXAocywgImhvcml6bGluZXNjYW4xIikpIHJldHVybiBYS19ob3JpemxpbmVzY2FuMTsKLQlpZiAoIXN0cmNtcChzLCAiaG9yaXpsaW5lc2NhbjMiKSkgcmV0dXJuIFhLX2hvcml6bGluZXNjYW4zOwotCWlmICghc3RyY21wKHMsICJob3JpemxpbmVzY2FuNSIpKSByZXR1cm4gWEtfaG9yaXpsaW5lc2NhbjU7Ci0JaWYgKCFzdHJjbXAocywgImhvcml6bGluZXNjYW43IikpIHJldHVybiBYS19ob3JpemxpbmVzY2FuNzsKLQlpZiAoIXN0cmNtcChzLCAiaG9yaXpsaW5lc2NhbjkiKSkgcmV0dXJuIFhLX2hvcml6bGluZXNjYW45OwotCWlmICghc3RyY21wKHMsICJsZWZ0dCIpKSByZXR1cm4gWEtfbGVmdHQ7Ci0JaWYgKCFzdHJjbXAocywgInJpZ2h0dCIpKSByZXR1cm4gWEtfcmlnaHR0OwotCWlmICghc3RyY21wKHMsICJib3R0IikpIHJldHVybiBYS19ib3R0OwotCWlmICghc3RyY21wKHMsICJ0b3B0IikpIHJldHVybiBYS190b3B0OwotCWlmICghc3RyY21wKHMsICJ2ZXJ0YmFyIikpIHJldHVybiBYS192ZXJ0YmFyOwotI2VuZGlmIC8qIFhLX1NQRUNJQUwgKi8KLSNpZmRlZiBYS19QVUJMSVNISU5HCi0JaWYgKCFzdHJjbXAocywgImVtc3BhY2UiKSkgcmV0dXJuIFhLX2Vtc3BhY2U7Ci0JaWYgKCFzdHJjbXAocywgImVuc3BhY2UiKSkgcmV0dXJuIFhLX2Vuc3BhY2U7Ci0JaWYgKCFzdHJjbXAocywgImVtM3NwYWNlIikpIHJldHVybiBYS19lbTNzcGFjZTsKLQlpZiAoIXN0cmNtcChzLCAiZW00c3BhY2UiKSkgcmV0dXJuIFhLX2VtNHNwYWNlOwotCWlmICghc3RyY21wKHMsICJkaWdpdHNwYWNlIikpIHJldHVybiBYS19kaWdpdHNwYWNlOwotCWlmICghc3RyY21wKHMsICJwdW5jdHNwYWNlIikpIHJldHVybiBYS19wdW5jdHNwYWNlOwotCWlmICghc3RyY21wKHMsICJ0aGluc3BhY2UiKSkgcmV0dXJuIFhLX3RoaW5zcGFjZTsKLQlpZiAoIXN0cmNtcChzLCAiaGFpcnNwYWNlIikpIHJldHVybiBYS19oYWlyc3BhY2U7Ci0JaWYgKCFzdHJjbXAocywgImVtZGFzaCIpKSByZXR1cm4gWEtfZW1kYXNoOwotCWlmICghc3RyY21wKHMsICJlbmRhc2giKSkgcmV0dXJuIFhLX2VuZGFzaDsKLQlpZiAoIXN0cmNtcChzLCAic2lnbmlmYmxhbmsiKSkgcmV0dXJuIFhLX3NpZ25pZmJsYW5rOwotCWlmICghc3RyY21wKHMsICJlbGxpcHNpcyIpKSByZXR1cm4gWEtfZWxsaXBzaXM7Ci0JaWYgKCFzdHJjbXAocywgImRvdWJiYXNlbGluZWRvdCIpKSByZXR1cm4gWEtfZG91YmJhc2VsaW5lZG90OwotCWlmICghc3RyY21wKHMsICJvbmV0aGlyZCIpKSByZXR1cm4gWEtfb25ldGhpcmQ7Ci0JaWYgKCFzdHJjbXAocywgInR3b3RoaXJkcyIpKSByZXR1cm4gWEtfdHdvdGhpcmRzOwotCWlmICghc3RyY21wKHMsICJvbmVmaWZ0aCIpKSByZXR1cm4gWEtfb25lZmlmdGg7Ci0JaWYgKCFzdHJjbXAocywgInR3b2ZpZnRocyIpKSByZXR1cm4gWEtfdHdvZmlmdGhzOwotCWlmICghc3RyY21wKHMsICJ0aHJlZWZpZnRocyIpKSByZXR1cm4gWEtfdGhyZWVmaWZ0aHM7Ci0JaWYgKCFzdHJjbXAocywgImZvdXJmaWZ0aHMiKSkgcmV0dXJuIFhLX2ZvdXJmaWZ0aHM7Ci0JaWYgKCFzdHJjbXAocywgIm9uZXNpeHRoIikpIHJldHVybiBYS19vbmVzaXh0aDsKLQlpZiAoIXN0cmNtcChzLCAiZml2ZXNpeHRocyIpKSByZXR1cm4gWEtfZml2ZXNpeHRoczsKLQlpZiAoIXN0cmNtcChzLCAiY2FyZW9mIikpIHJldHVybiBYS19jYXJlb2Y7Ci0JaWYgKCFzdHJjbXAocywgImZpZ2Rhc2giKSkgcmV0dXJuIFhLX2ZpZ2Rhc2g7Ci0JaWYgKCFzdHJjbXAocywgImxlZnRhbmdsZWJyYWNrZXQiKSkgcmV0dXJuIFhLX2xlZnRhbmdsZWJyYWNrZXQ7Ci0JaWYgKCFzdHJjbXAocywgImRlY2ltYWxwb2ludCIpKSByZXR1cm4gWEtfZGVjaW1hbHBvaW50OwotCWlmICghc3RyY21wKHMsICJyaWdodGFuZ2xlYnJhY2tldCIpKSByZXR1cm4gWEtfcmlnaHRhbmdsZWJyYWNrZXQ7Ci0JaWYgKCFzdHJjbXAocywgIm1hcmtlciIpKSByZXR1cm4gWEtfbWFya2VyOwotCWlmICghc3RyY21wKHMsICJvbmVlaWdodGgiKSkgcmV0dXJuIFhLX29uZWVpZ2h0aDsKLQlpZiAoIXN0cmNtcChzLCAidGhyZWVlaWdodGhzIikpIHJldHVybiBYS190aHJlZWVpZ2h0aHM7Ci0JaWYgKCFzdHJjbXAocywgImZpdmVlaWdodGhzIikpIHJldHVybiBYS19maXZlZWlnaHRoczsKLQlpZiAoIXN0cmNtcChzLCAic2V2ZW5laWdodGhzIikpIHJldHVybiBYS19zZXZlbmVpZ2h0aHM7Ci0JaWYgKCFzdHJjbXAocywgInRyYWRlbWFyayIpKSByZXR1cm4gWEtfdHJhZGVtYXJrOwotCWlmICghc3RyY21wKHMsICJzaWduYXR1cmVtYXJrIikpIHJldHVybiBYS19zaWduYXR1cmVtYXJrOwotCWlmICghc3RyY21wKHMsICJ0cmFkZW1hcmtpbmNpcmNsZSIpKSByZXR1cm4gWEtfdHJhZGVtYXJraW5jaXJjbGU7Ci0JaWYgKCFzdHJjbXAocywgImxlZnRvcGVudHJpYW5nbGUiKSkgcmV0dXJuIFhLX2xlZnRvcGVudHJpYW5nbGU7Ci0JaWYgKCFzdHJjbXAocywgInJpZ2h0b3BlbnRyaWFuZ2xlIikpIHJldHVybiBYS19yaWdodG9wZW50cmlhbmdsZTsKLQlpZiAoIXN0cmNtcChzLCAiZW1vcGVuY2lyY2xlIikpIHJldHVybiBYS19lbW9wZW5jaXJjbGU7Ci0JaWYgKCFzdHJjbXAocywgImVtb3BlbnJlY3RhbmdsZSIpKSByZXR1cm4gWEtfZW1vcGVucmVjdGFuZ2xlOwotCWlmICghc3RyY21wKHMsICJsZWZ0c2luZ2xlcXVvdGVtYXJrIikpIHJldHVybiBYS19sZWZ0c2luZ2xlcXVvdGVtYXJrOwotCWlmICghc3RyY21wKHMsICJyaWdodHNpbmdsZXF1b3RlbWFyayIpKSByZXR1cm4gWEtfcmlnaHRzaW5nbGVxdW90ZW1hcms7Ci0JaWYgKCFzdHJjbXAocywgImxlZnRkb3VibGVxdW90ZW1hcmsiKSkgcmV0dXJuIFhLX2xlZnRkb3VibGVxdW90ZW1hcms7Ci0JaWYgKCFzdHJjbXAocywgInJpZ2h0ZG91YmxlcXVvdGVtYXJrIikpIHJldHVybiBYS19yaWdodGRvdWJsZXF1b3RlbWFyazsKLQlpZiAoIXN0cmNtcChzLCAicHJlc2NyaXB0aW9uIikpIHJldHVybiBYS19wcmVzY3JpcHRpb247Ci0JaWYgKCFzdHJjbXAocywgIm1pbnV0ZXMiKSkgcmV0dXJuIFhLX21pbnV0ZXM7Ci0JaWYgKCFzdHJjbXAocywgInNlY29uZHMiKSkgcmV0dXJuIFhLX3NlY29uZHM7Ci0JaWYgKCFzdHJjbXAocywgImxhdGluY3Jvc3MiKSkgcmV0dXJuIFhLX2xhdGluY3Jvc3M7Ci0JaWYgKCFzdHJjbXAocywgImhleGFncmFtIikpIHJldHVybiBYS19oZXhhZ3JhbTsKLQlpZiAoIXN0cmNtcChzLCAiZmlsbGVkcmVjdGJ1bGxldCIpKSByZXR1cm4gWEtfZmlsbGVkcmVjdGJ1bGxldDsKLQlpZiAoIXN0cmNtcChzLCAiZmlsbGVkbGVmdHRyaWJ1bGxldCIpKSByZXR1cm4gWEtfZmlsbGVkbGVmdHRyaWJ1bGxldDsKLQlpZiAoIXN0cmNtcChzLCAiZmlsbGVkcmlnaHR0cmlidWxsZXQiKSkgcmV0dXJuIFhLX2ZpbGxlZHJpZ2h0dHJpYnVsbGV0OwotCWlmICghc3RyY21wKHMsICJlbWZpbGxlZGNpcmNsZSIpKSByZXR1cm4gWEtfZW1maWxsZWRjaXJjbGU7Ci0JaWYgKCFzdHJjbXAocywgImVtZmlsbGVkcmVjdCIpKSByZXR1cm4gWEtfZW1maWxsZWRyZWN0OwotCWlmICghc3RyY21wKHMsICJlbm9wZW5jaXJjYnVsbGV0IikpIHJldHVybiBYS19lbm9wZW5jaXJjYnVsbGV0OwotCWlmICghc3RyY21wKHMsICJlbm9wZW5zcXVhcmVidWxsZXQiKSkgcmV0dXJuIFhLX2Vub3BlbnNxdWFyZWJ1bGxldDsKLQlpZiAoIXN0cmNtcChzLCAib3BlbnJlY3RidWxsZXQiKSkgcmV0dXJuIFhLX29wZW5yZWN0YnVsbGV0OwotCWlmICghc3RyY21wKHMsICJvcGVudHJpYnVsbGV0dXAiKSkgcmV0dXJuIFhLX29wZW50cmlidWxsZXR1cDsKLQlpZiAoIXN0cmNtcChzLCAib3BlbnRyaWJ1bGxldGRvd24iKSkgcmV0dXJuIFhLX29wZW50cmlidWxsZXRkb3duOwotCWlmICghc3RyY21wKHMsICJvcGVuc3RhciIpKSByZXR1cm4gWEtfb3BlbnN0YXI7Ci0JaWYgKCFzdHJjbXAocywgImVuZmlsbGVkY2lyY2J1bGxldCIpKSByZXR1cm4gWEtfZW5maWxsZWRjaXJjYnVsbGV0OwotCWlmICghc3RyY21wKHMsICJlbmZpbGxlZHNxYnVsbGV0IikpIHJldHVybiBYS19lbmZpbGxlZHNxYnVsbGV0OwotCWlmICghc3RyY21wKHMsICJmaWxsZWR0cmlidWxsZXR1cCIpKSByZXR1cm4gWEtfZmlsbGVkdHJpYnVsbGV0dXA7Ci0JaWYgKCFzdHJjbXAocywgImZpbGxlZHRyaWJ1bGxldGRvd24iKSkgcmV0dXJuIFhLX2ZpbGxlZHRyaWJ1bGxldGRvd247Ci0JaWYgKCFzdHJjbXAocywgImxlZnRwb2ludGVyIikpIHJldHVybiBYS19sZWZ0cG9pbnRlcjsKLQlpZiAoIXN0cmNtcChzLCAicmlnaHRwb2ludGVyIikpIHJldHVybiBYS19yaWdodHBvaW50ZXI7Ci0JaWYgKCFzdHJjbXAocywgImNsdWIiKSkgcmV0dXJuIFhLX2NsdWI7Ci0JaWYgKCFzdHJjbXAocywgImRpYW1vbmQiKSkgcmV0dXJuIFhLX2RpYW1vbmQ7Ci0JaWYgKCFzdHJjbXAocywgImhlYXJ0IikpIHJldHVybiBYS19oZWFydDsKLQlpZiAoIXN0cmNtcChzLCAibWFsdGVzZWNyb3NzIikpIHJldHVybiBYS19tYWx0ZXNlY3Jvc3M7Ci0JaWYgKCFzdHJjbXAocywgImRhZ2dlciIpKSByZXR1cm4gWEtfZGFnZ2VyOwotCWlmICghc3RyY21wKHMsICJkb3VibGVkYWdnZXIiKSkgcmV0dXJuIFhLX2RvdWJsZWRhZ2dlcjsKLQlpZiAoIXN0cmNtcChzLCAiY2hlY2ttYXJrIikpIHJldHVybiBYS19jaGVja21hcms7Ci0JaWYgKCFzdHJjbXAocywgImJhbGxvdGNyb3NzIikpIHJldHVybiBYS19iYWxsb3Rjcm9zczsKLQlpZiAoIXN0cmNtcChzLCAibXVzaWNhbHNoYXJwIikpIHJldHVybiBYS19tdXNpY2Fsc2hhcnA7Ci0JaWYgKCFzdHJjbXAocywgIm11c2ljYWxmbGF0IikpIHJldHVybiBYS19tdXNpY2FsZmxhdDsKLQlpZiAoIXN0cmNtcChzLCAibWFsZXN5bWJvbCIpKSByZXR1cm4gWEtfbWFsZXN5bWJvbDsKLQlpZiAoIXN0cmNtcChzLCAiZmVtYWxlc3ltYm9sIikpIHJldHVybiBYS19mZW1hbGVzeW1ib2w7Ci0JaWYgKCFzdHJjbXAocywgInRlbGVwaG9uZSIpKSByZXR1cm4gWEtfdGVsZXBob25lOwotCWlmICghc3RyY21wKHMsICJ0ZWxlcGhvbmVyZWNvcmRlciIpKSByZXR1cm4gWEtfdGVsZXBob25lcmVjb3JkZXI7Ci0JaWYgKCFzdHJjbXAocywgInBob25vZ3JhcGhjb3B5cmlnaHQiKSkgcmV0dXJuIFhLX3Bob25vZ3JhcGhjb3B5cmlnaHQ7Ci0JaWYgKCFzdHJjbXAocywgImNhcmV0IikpIHJldHVybiBYS19jYXJldDsKLQlpZiAoIXN0cmNtcChzLCAic2luZ2xlbG93cXVvdGVtYXJrIikpIHJldHVybiBYS19zaW5nbGVsb3dxdW90ZW1hcms7Ci0JaWYgKCFzdHJjbXAocywgImRvdWJsZWxvd3F1b3RlbWFyayIpKSByZXR1cm4gWEtfZG91YmxlbG93cXVvdGVtYXJrOwotCWlmICghc3RyY21wKHMsICJjdXJzb3IiKSkgcmV0dXJuIFhLX2N1cnNvcjsKLSNlbmRpZiAvKiBYS19QVUJMSVNISU5HICovCi0jaWZkZWYgWEtfQVBMCi0JaWYgKCFzdHJjbXAocywgImxlZnRjYXJldCIpKSByZXR1cm4gWEtfbGVmdGNhcmV0OwotCWlmICghc3RyY21wKHMsICJyaWdodGNhcmV0IikpIHJldHVybiBYS19yaWdodGNhcmV0OwotCWlmICghc3RyY21wKHMsICJkb3duY2FyZXQiKSkgcmV0dXJuIFhLX2Rvd25jYXJldDsKLQlpZiAoIXN0cmNtcChzLCAidXBjYXJldCIpKSByZXR1cm4gWEtfdXBjYXJldDsKLQlpZiAoIXN0cmNtcChzLCAib3ZlcmJhciIpKSByZXR1cm4gWEtfb3ZlcmJhcjsKLQlpZiAoIXN0cmNtcChzLCAiZG93bnRhY2siKSkgcmV0dXJuIFhLX2Rvd250YWNrOwotCWlmICghc3RyY21wKHMsICJ1cHNob2UiKSkgcmV0dXJuIFhLX3Vwc2hvZTsKLQlpZiAoIXN0cmNtcChzLCAiZG93bnN0aWxlIikpIHJldHVybiBYS19kb3duc3RpbGU7Ci0JaWYgKCFzdHJjbXAocywgInVuZGVyYmFyIikpIHJldHVybiBYS191bmRlcmJhcjsKLQlpZiAoIXN0cmNtcChzLCAiam90IikpIHJldHVybiBYS19qb3Q7Ci0JaWYgKCFzdHJjbXAocywgInF1YWQiKSkgcmV0dXJuIFhLX3F1YWQ7Ci0JaWYgKCFzdHJjbXAocywgInVwdGFjayIpKSByZXR1cm4gWEtfdXB0YWNrOwotCWlmICghc3RyY21wKHMsICJjaXJjbGUiKSkgcmV0dXJuIFhLX2NpcmNsZTsKLQlpZiAoIXN0cmNtcChzLCAidXBzdGlsZSIpKSByZXR1cm4gWEtfdXBzdGlsZTsKLQlpZiAoIXN0cmNtcChzLCAiZG93bnNob2UiKSkgcmV0dXJuIFhLX2Rvd25zaG9lOwotCWlmICghc3RyY21wKHMsICJyaWdodHNob2UiKSkgcmV0dXJuIFhLX3JpZ2h0c2hvZTsKLQlpZiAoIXN0cmNtcChzLCAibGVmdHNob2UiKSkgcmV0dXJuIFhLX2xlZnRzaG9lOwotCWlmICghc3RyY21wKHMsICJsZWZ0dGFjayIpKSByZXR1cm4gWEtfbGVmdHRhY2s7Ci0JaWYgKCFzdHJjbXAocywgInJpZ2h0dGFjayIpKSByZXR1cm4gWEtfcmlnaHR0YWNrOwotI2VuZGlmIC8qIFhLX0FQTCAqLwotI2lmZGVmIFhLX0hFQlJFVwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfZG91YmxlbG93bGluZSIpKSByZXR1cm4gWEtfaGVicmV3X2RvdWJsZWxvd2xpbmU7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19hbGVwaCIpKSByZXR1cm4gWEtfaGVicmV3X2FsZXBoOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfYmV0IikpIHJldHVybiBYS19oZWJyZXdfYmV0OwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfYmV0aCIpKSByZXR1cm4gWEtfaGVicmV3X2JldGg7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19naW1lbCIpKSByZXR1cm4gWEtfaGVicmV3X2dpbWVsOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfZ2ltbWVsIikpIHJldHVybiBYS19oZWJyZXdfZ2ltbWVsOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfZGFsZXQiKSkgcmV0dXJuIFhLX2hlYnJld19kYWxldDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2RhbGV0aCIpKSByZXR1cm4gWEtfaGVicmV3X2RhbGV0aDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2hlIikpIHJldHVybiBYS19oZWJyZXdfaGU7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld193YXciKSkgcmV0dXJuIFhLX2hlYnJld193YXc7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld196YWluIikpIHJldHVybiBYS19oZWJyZXdfemFpbjsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X3pheWluIikpIHJldHVybiBYS19oZWJyZXdfemF5aW47Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19jaGV0IikpIHJldHVybiBYS19oZWJyZXdfY2hldDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2hldCIpKSByZXR1cm4gWEtfaGVicmV3X2hldDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X3RldCIpKSByZXR1cm4gWEtfaGVicmV3X3RldDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X3RldGgiKSkgcmV0dXJuIFhLX2hlYnJld190ZXRoOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfeW9kIikpIHJldHVybiBYS19oZWJyZXdfeW9kOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfZmluYWxrYXBoIikpIHJldHVybiBYS19oZWJyZXdfZmluYWxrYXBoOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfa2FwaCIpKSByZXR1cm4gWEtfaGVicmV3X2thcGg7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19sYW1lZCIpKSByZXR1cm4gWEtfaGVicmV3X2xhbWVkOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfZmluYWxtZW0iKSkgcmV0dXJuIFhLX2hlYnJld19maW5hbG1lbTsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X21lbSIpKSByZXR1cm4gWEtfaGVicmV3X21lbTsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2ZpbmFsbnVuIikpIHJldHVybiBYS19oZWJyZXdfZmluYWxudW47Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19udW4iKSkgcmV0dXJuIFhLX2hlYnJld19udW47Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19zYW1lY2giKSkgcmV0dXJuIFhLX2hlYnJld19zYW1lY2g7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19zYW1la2giKSkgcmV0dXJuIFhLX2hlYnJld19zYW1la2g7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19heWluIikpIHJldHVybiBYS19oZWJyZXdfYXlpbjsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2ZpbmFscGUiKSkgcmV0dXJuIFhLX2hlYnJld19maW5hbHBlOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfcGUiKSkgcmV0dXJuIFhLX2hlYnJld19wZTsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2ZpbmFsemFkZSIpKSByZXR1cm4gWEtfaGVicmV3X2ZpbmFsemFkZTsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2ZpbmFsemFkaSIpKSByZXR1cm4gWEtfaGVicmV3X2ZpbmFsemFkaTsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X3phZGUiKSkgcmV0dXJuIFhLX2hlYnJld196YWRlOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfemFkaSIpKSByZXR1cm4gWEtfaGVicmV3X3phZGk7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld19xb3BoIikpIHJldHVybiBYS19oZWJyZXdfcW9waDsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X2t1ZiIpKSByZXR1cm4gWEtfaGVicmV3X2t1ZjsKLQlpZiAoIXN0cmNtcChzLCAiaGVicmV3X3Jlc2giKSkgcmV0dXJuIFhLX2hlYnJld19yZXNoOwotCWlmICghc3RyY21wKHMsICJoZWJyZXdfc2hpbiIpKSByZXR1cm4gWEtfaGVicmV3X3NoaW47Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld190YXciKSkgcmV0dXJuIFhLX2hlYnJld190YXc7Ci0JaWYgKCFzdHJjbXAocywgImhlYnJld190YWYiKSkgcmV0dXJuIFhLX2hlYnJld190YWY7Ci0JaWYgKCFzdHJjbXAocywgIkhlYnJld19zd2l0Y2giKSkgcmV0dXJuIFhLX0hlYnJld19zd2l0Y2g7Ci0jZW5kaWYgLyogWEtfSEVCUkVXICovCi0jaWZkZWYgWEtfVEhBSQotCWlmICghc3RyY21wKHMsICJUaGFpX2tva2FpIikpIHJldHVybiBYS19UaGFpX2tva2FpOwotCWlmICghc3RyY21wKHMsICJUaGFpX2tob2toYWkiKSkgcmV0dXJuIFhLX1RoYWlfa2hva2hhaTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9raG9raHVhdCIpKSByZXR1cm4gWEtfVGhhaV9raG9raHVhdDsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9raG9raHdhaSIpKSByZXR1cm4gWEtfVGhhaV9raG9raHdhaTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9raG9raG9uIikpIHJldHVybiBYS19UaGFpX2tob2tob247Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfa2hvcmFraGFuZyIpKSByZXR1cm4gWEtfVGhhaV9raG9yYWtoYW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX25nb25ndSIpKSByZXR1cm4gWEtfVGhhaV9uZ29uZ3U7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfY2hvY2hhbiIpKSByZXR1cm4gWEtfVGhhaV9jaG9jaGFuOwotCWlmICghc3RyY21wKHMsICJUaGFpX2Nob2NoaW5nIikpIHJldHVybiBYS19UaGFpX2Nob2NoaW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX2Nob2NoYW5nIikpIHJldHVybiBYS19UaGFpX2Nob2NoYW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Nvc28iKSkgcmV0dXJuIFhLX1RoYWlfc29zbzsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9jaG9jaG9lIikpIHJldHVybiBYS19UaGFpX2Nob2Nob2U7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfeW95aW5nIikpIHJldHVybiBYS19UaGFpX3lveWluZzsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9kb2NoYWRhIikpIHJldHVybiBYS19UaGFpX2RvY2hhZGE7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfdG9wYXRhayIpKSByZXR1cm4gWEtfVGhhaV90b3BhdGFrOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Rob3RoYW4iKSkgcmV0dXJuIFhLX1RoYWlfdGhvdGhhbjsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV90aG9uYW5nbW9udGhvIikpIHJldHVybiBYS19UaGFpX3Rob25hbmdtb250aG87Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfdGhvcGh1dGhhbyIpKSByZXR1cm4gWEtfVGhhaV90aG9waHV0aGFvOwotCWlmICghc3RyY21wKHMsICJUaGFpX25vbmVuIikpIHJldHVybiBYS19UaGFpX25vbmVuOwotCWlmICghc3RyY21wKHMsICJUaGFpX2RvZGVrIikpIHJldHVybiBYS19UaGFpX2RvZGVrOwotCWlmICghc3RyY21wKHMsICJUaGFpX3RvdGFvIikpIHJldHVybiBYS19UaGFpX3RvdGFvOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Rob3RodW5nIikpIHJldHVybiBYS19UaGFpX3Rob3RodW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Rob3RoYWhhbiIpKSByZXR1cm4gWEtfVGhhaV90aG90aGFoYW47Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfdGhvdGhvbmciKSkgcmV0dXJuIFhLX1RoYWlfdGhvdGhvbmc7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbm9udSIpKSByZXR1cm4gWEtfVGhhaV9ub251OwotCWlmICghc3RyY21wKHMsICJUaGFpX2JvYmFpbWFpIikpIHJldHVybiBYS19UaGFpX2JvYmFpbWFpOwotCWlmICghc3RyY21wKHMsICJUaGFpX3BvcGxhIikpIHJldHVybiBYS19UaGFpX3BvcGxhOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Bob3BodW5nIikpIHJldHVybiBYS19UaGFpX3Bob3BodW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX2ZvZmEiKSkgcmV0dXJuIFhLX1RoYWlfZm9mYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9waG9waGFuIikpIHJldHVybiBYS19UaGFpX3Bob3BoYW47Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfZm9mYW4iKSkgcmV0dXJuIFhLX1RoYWlfZm9mYW47Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfcGhvc2FtcGhhbyIpKSByZXR1cm4gWEtfVGhhaV9waG9zYW1waGFvOwotCWlmICghc3RyY21wKHMsICJUaGFpX21vbWEiKSkgcmV0dXJuIFhLX1RoYWlfbW9tYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV95b3lhayIpKSByZXR1cm4gWEtfVGhhaV95b3lhazsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9yb3J1YSIpKSByZXR1cm4gWEtfVGhhaV9yb3J1YTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9ydSIpKSByZXR1cm4gWEtfVGhhaV9ydTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9sb2xpbmciKSkgcmV0dXJuIFhLX1RoYWlfbG9saW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX2x1IikpIHJldHVybiBYS19UaGFpX2x1OwotCWlmICghc3RyY21wKHMsICJUaGFpX3dvd2FlbiIpKSByZXR1cm4gWEtfVGhhaV93b3dhZW47Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc29zYWxhIikpIHJldHVybiBYS19UaGFpX3Nvc2FsYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9zb3J1c2kiKSkgcmV0dXJuIFhLX1RoYWlfc29ydXNpOwotCWlmICghc3RyY21wKHMsICJUaGFpX3Nvc3VhIikpIHJldHVybiBYS19UaGFpX3Nvc3VhOwotCWlmICghc3RyY21wKHMsICJUaGFpX2hvaGlwIikpIHJldHVybiBYS19UaGFpX2hvaGlwOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xvY2h1bGEiKSkgcmV0dXJuIFhLX1RoYWlfbG9jaHVsYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9vYW5nIikpIHJldHVybiBYS19UaGFpX29hbmc7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfaG9ub2todWsiKSkgcmV0dXJuIFhLX1RoYWlfaG9ub2todWs7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfcGFpeWFubm9pIikpIHJldHVybiBYS19UaGFpX3BhaXlhbm5vaTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9zYXJhYSIpKSByZXR1cm4gWEtfVGhhaV9zYXJhYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9tYWloYW5ha2F0IikpIHJldHVybiBYS19UaGFpX21haWhhbmFrYXQ7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYWFhIikpIHJldHVybiBYS19UaGFpX3NhcmFhYTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9zYXJhYW0iKSkgcmV0dXJuIFhLX1RoYWlfc2FyYWFtOwotCWlmICghc3RyY21wKHMsICJUaGFpX3NhcmFpIikpIHJldHVybiBYS19UaGFpX3NhcmFpOwotCWlmICghc3RyY21wKHMsICJUaGFpX3NhcmFpaSIpKSByZXR1cm4gWEtfVGhhaV9zYXJhaWk7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYXVlIikpIHJldHVybiBYS19UaGFpX3NhcmF1ZTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9zYXJhdWVlIikpIHJldHVybiBYS19UaGFpX3NhcmF1ZWU7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYXUiKSkgcmV0dXJuIFhLX1RoYWlfc2FyYXU7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYXV1IikpIHJldHVybiBYS19UaGFpX3NhcmF1dTsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9waGludGh1IikpIHJldHVybiBYS19UaGFpX3BoaW50aHU7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbWFpaGFuYWthdF9tYWl0aG8iKSkgcmV0dXJuIFhLX1RoYWlfbWFpaGFuYWthdF9tYWl0aG87Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfYmFodCIpKSByZXR1cm4gWEtfVGhhaV9iYWh0OwotCWlmICghc3RyY21wKHMsICJUaGFpX3NhcmFlIikpIHJldHVybiBYS19UaGFpX3NhcmFlOwotCWlmICghc3RyY21wKHMsICJUaGFpX3NhcmFhZSIpKSByZXR1cm4gWEtfVGhhaV9zYXJhYWU7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYW8iKSkgcmV0dXJuIFhLX1RoYWlfc2FyYW87Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfc2FyYWFpbWFpbXVhbiIpKSByZXR1cm4gWEtfVGhhaV9zYXJhYWltYWltdWFuOwotCWlmICghc3RyY21wKHMsICJUaGFpX3NhcmFhaW1haW1hbGFpIikpIHJldHVybiBYS19UaGFpX3NhcmFhaW1haW1hbGFpOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xha2toYW5neWFvIikpIHJldHVybiBYS19UaGFpX2xha2toYW5neWFvOwotCWlmICghc3RyY21wKHMsICJUaGFpX21haXlhbW9rIikpIHJldHVybiBYS19UaGFpX21haXlhbW9rOwotCWlmICghc3RyY21wKHMsICJUaGFpX21haXRhaWtodSIpKSByZXR1cm4gWEtfVGhhaV9tYWl0YWlraHU7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbWFpZWsiKSkgcmV0dXJuIFhLX1RoYWlfbWFpZWs7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbWFpdGhvIikpIHJldHVybiBYS19UaGFpX21haXRobzsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9tYWl0cmkiKSkgcmV0dXJuIFhLX1RoYWlfbWFpdHJpOwotCWlmICghc3RyY21wKHMsICJUaGFpX21haWNoYXR0YXdhIikpIHJldHVybiBYS19UaGFpX21haWNoYXR0YXdhOwotCWlmICghc3RyY21wKHMsICJUaGFpX3RoYW50aGFraGF0IikpIHJldHVybiBYS19UaGFpX3RoYW50aGFraGF0OwotCWlmICghc3RyY21wKHMsICJUaGFpX25pa2hhaGl0IikpIHJldHVybiBYS19UaGFpX25pa2hhaGl0OwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla3N1biIpKSByZXR1cm4gWEtfVGhhaV9sZWtzdW47Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbGVrbnVuZyIpKSByZXR1cm4gWEtfVGhhaV9sZWtudW5nOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla3NvbmciKSkgcmV0dXJuIFhLX1RoYWlfbGVrc29uZzsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9sZWtzYW0iKSkgcmV0dXJuIFhLX1RoYWlfbGVrc2FtOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla3NpIikpIHJldHVybiBYS19UaGFpX2xla3NpOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla2hhIikpIHJldHVybiBYS19UaGFpX2xla2hhOwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla2hvayIpKSByZXR1cm4gWEtfVGhhaV9sZWtob2s7Ci0JaWYgKCFzdHJjbXAocywgIlRoYWlfbGVrY2hldCIpKSByZXR1cm4gWEtfVGhhaV9sZWtjaGV0OwotCWlmICghc3RyY21wKHMsICJUaGFpX2xla3BhZXQiKSkgcmV0dXJuIFhLX1RoYWlfbGVrcGFldDsKLQlpZiAoIXN0cmNtcChzLCAiVGhhaV9sZWtrYW8iKSkgcmV0dXJuIFhLX1RoYWlfbGVra2FvOwotI2VuZGlmIC8qIFhLX1RIQUkgKi8KLSNpZmRlZiBYS19LT1JFQU4KLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsIikpIHJldHVybiBYS19IYW5ndWw7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9TdGFydCIpKSByZXR1cm4gWEtfSGFuZ3VsX1N0YXJ0OwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfRW5kIikpIHJldHVybiBYS19IYW5ndWxfRW5kOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSGFuamEiKSkgcmV0dXJuIFhLX0hhbmd1bF9IYW5qYTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0phbW8iKSkgcmV0dXJuIFhLX0hhbmd1bF9KYW1vOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUm9tYWphIikpIHJldHVybiBYS19IYW5ndWxfUm9tYWphOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfQ29kZWlucHV0IikpIHJldHVybiBYS19IYW5ndWxfQ29kZWlucHV0OwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSmVvbmphIikpIHJldHVybiBYS19IYW5ndWxfSmVvbmphOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfQmFuamEiKSkgcmV0dXJuIFhLX0hhbmd1bF9CYW5qYTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1ByZUhhbmphIikpIHJldHVybiBYS19IYW5ndWxfUHJlSGFuamE7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9Qb3N0SGFuamEiKSkgcmV0dXJuIFhLX0hhbmd1bF9Qb3N0SGFuamE7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9TaW5nbGVDYW5kaWRhdGUiKSkgcmV0dXJuIFhLX0hhbmd1bF9TaW5nbGVDYW5kaWRhdGU7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9NdWx0aXBsZUNhbmRpZGF0ZSIpKSByZXR1cm4gWEtfSGFuZ3VsX011bHRpcGxlQ2FuZGlkYXRlOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUHJldmlvdXNDYW5kaWRhdGUiKSkgcmV0dXJuIFhLX0hhbmd1bF9QcmV2aW91c0NhbmRpZGF0ZTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1NwZWNpYWwiKSkgcmV0dXJuIFhLX0hhbmd1bF9TcGVjaWFsOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfc3dpdGNoIikpIHJldHVybiBYS19IYW5ndWxfc3dpdGNoOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfS2l5ZW9nIikpIHJldHVybiBYS19IYW5ndWxfS2l5ZW9nOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfU3NhbmdLaXllb2ciKSkgcmV0dXJuIFhLX0hhbmd1bF9Tc2FuZ0tpeWVvZzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0tpeWVvZ1Npb3MiKSkgcmV0dXJuIFhLX0hhbmd1bF9LaXllb2dTaW9zOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfTmlldW4iKSkgcmV0dXJuIFhLX0hhbmd1bF9OaWV1bjsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX05pZXVuSmlldWoiKSkgcmV0dXJuIFhLX0hhbmd1bF9OaWV1bkppZXVqOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfTmlldW5IaWV1aCIpKSByZXR1cm4gWEtfSGFuZ3VsX05pZXVuSGlldWg7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9EaWtldWQiKSkgcmV0dXJuIFhLX0hhbmd1bF9EaWtldWQ7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9Tc2FuZ0Rpa2V1ZCIpKSByZXR1cm4gWEtfSGFuZ3VsX1NzYW5nRGlrZXVkOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUmlldWwiKSkgcmV0dXJuIFhLX0hhbmd1bF9SaWV1bDsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1JpZXVsS2l5ZW9nIikpIHJldHVybiBYS19IYW5ndWxfUmlldWxLaXllb2c7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9SaWV1bE1pZXVtIikpIHJldHVybiBYS19IYW5ndWxfUmlldWxNaWV1bTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1JpZXVsUGlldWIiKSkgcmV0dXJuIFhLX0hhbmd1bF9SaWV1bFBpZXViOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUmlldWxTaW9zIikpIHJldHVybiBYS19IYW5ndWxfUmlldWxTaW9zOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUmlldWxUaWV1dCIpKSByZXR1cm4gWEtfSGFuZ3VsX1JpZXVsVGlldXQ7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9SaWV1bFBoaWV1ZiIpKSByZXR1cm4gWEtfSGFuZ3VsX1JpZXVsUGhpZXVmOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUmlldWxIaWV1aCIpKSByZXR1cm4gWEtfSGFuZ3VsX1JpZXVsSGlldWg7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9NaWV1bSIpKSByZXR1cm4gWEtfSGFuZ3VsX01pZXVtOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUGlldWIiKSkgcmV0dXJuIFhLX0hhbmd1bF9QaWV1YjsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1NzYW5nUGlldWIiKSkgcmV0dXJuIFhLX0hhbmd1bF9Tc2FuZ1BpZXViOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUGlldWJTaW9zIikpIHJldHVybiBYS19IYW5ndWxfUGlldWJTaW9zOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfU2lvcyIpKSByZXR1cm4gWEtfSGFuZ3VsX1Npb3M7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9Tc2FuZ1Npb3MiKSkgcmV0dXJuIFhLX0hhbmd1bF9Tc2FuZ1Npb3M7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9JZXVuZyIpKSByZXR1cm4gWEtfSGFuZ3VsX0lldW5nOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSmlldWoiKSkgcmV0dXJuIFhLX0hhbmd1bF9KaWV1ajsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1NzYW5nSmlldWoiKSkgcmV0dXJuIFhLX0hhbmd1bF9Tc2FuZ0ppZXVqOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfQ2lldWMiKSkgcmV0dXJuIFhLX0hhbmd1bF9DaWV1YzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0toaWV1cSIpKSByZXR1cm4gWEtfSGFuZ3VsX0toaWV1cTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1RpZXV0IikpIHJldHVybiBYS19IYW5ndWxfVGlldXQ7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9QaGlldWYiKSkgcmV0dXJuIFhLX0hhbmd1bF9QaGlldWY7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9IaWV1aCIpKSByZXR1cm4gWEtfSGFuZ3VsX0hpZXVoOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfQSIpKSByZXR1cm4gWEtfSGFuZ3VsX0E7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9BRSIpKSByZXR1cm4gWEtfSGFuZ3VsX0FFOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfWUEiKSkgcmV0dXJuIFhLX0hhbmd1bF9ZQTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1lBRSIpKSByZXR1cm4gWEtfSGFuZ3VsX1lBRTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0VPIikpIHJldHVybiBYS19IYW5ndWxfRU87Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9FIikpIHJldHVybiBYS19IYW5ndWxfRTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1lFTyIpKSByZXR1cm4gWEtfSGFuZ3VsX1lFTzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1lFIikpIHJldHVybiBYS19IYW5ndWxfWUU7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9PIikpIHJldHVybiBYS19IYW5ndWxfTzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1dBIikpIHJldHVybiBYS19IYW5ndWxfV0E7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9XQUUiKSkgcmV0dXJuIFhLX0hhbmd1bF9XQUU7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9PRSIpKSByZXR1cm4gWEtfSGFuZ3VsX09FOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfWU8iKSkgcmV0dXJuIFhLX0hhbmd1bF9ZTzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1UiKSkgcmV0dXJuIFhLX0hhbmd1bF9VOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfV0VPIikpIHJldHVybiBYS19IYW5ndWxfV0VPOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfV0UiKSkgcmV0dXJuIFhLX0hhbmd1bF9XRTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1dJIikpIHJldHVybiBYS19IYW5ndWxfV0k7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9ZVSIpKSByZXR1cm4gWEtfSGFuZ3VsX1lVOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfRVUiKSkgcmV0dXJuIFhLX0hhbmd1bF9FVTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1lJIikpIHJldHVybiBYS19IYW5ndWxfWUk7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9JIikpIHJldHVybiBYS19IYW5ndWxfSTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfS2l5ZW9nIikpIHJldHVybiBYS19IYW5ndWxfSl9LaXllb2c7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1NzYW5nS2l5ZW9nIikpIHJldHVybiBYS19IYW5ndWxfSl9Tc2FuZ0tpeWVvZzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfS2l5ZW9nU2lvcyIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfS2l5ZW9nU2lvczsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfTmlldW4iKSkgcmV0dXJuIFhLX0hhbmd1bF9KX05pZXVuOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9OaWV1bkppZXVqIikpIHJldHVybiBYS19IYW5ndWxfSl9OaWV1bkppZXVqOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9OaWV1bkhpZXVoIikpIHJldHVybiBYS19IYW5ndWxfSl9OaWV1bkhpZXVoOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9EaWtldWQiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX0Rpa2V1ZDsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfUmlldWwiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1JpZXVsOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9SaWV1bEtpeWVvZyIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfUmlldWxLaXllb2c7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1JpZXVsTWlldW0iKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1JpZXVsTWlldW07Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1JpZXVsUGlldWIiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1JpZXVsUGlldWI7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1JpZXVsU2lvcyIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfUmlldWxTaW9zOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9SaWV1bFRpZXV0IikpIHJldHVybiBYS19IYW5ndWxfSl9SaWV1bFRpZXV0OwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9SaWV1bFBoaWV1ZiIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfUmlldWxQaGlldWY7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1JpZXVsSGlldWgiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1JpZXVsSGlldWg7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX01pZXVtIikpIHJldHVybiBYS19IYW5ndWxfSl9NaWV1bTsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfUGlldWIiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1BpZXViOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9QaWV1YlNpb3MiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1BpZXViU2lvczsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfU2lvcyIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfU2lvczsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfU3NhbmdTaW9zIikpIHJldHVybiBYS19IYW5ndWxfSl9Tc2FuZ1Npb3M7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX0lldW5nIikpIHJldHVybiBYS19IYW5ndWxfSl9JZXVuZzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfSmlldWoiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX0ppZXVqOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9DaWV1YyIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfQ2lldWM7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX0toaWV1cSIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfS2hpZXVxOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9UaWV1dCIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfVGlldXQ7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1BoaWV1ZiIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfUGhpZXVmOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfSl9IaWV1aCIpKSByZXR1cm4gWEtfSGFuZ3VsX0pfSGlldWg7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9SaWV1bFllb3JpbkhpZXVoIikpIHJldHVybiBYS19IYW5ndWxfUmlldWxZZW9yaW5IaWV1aDsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX1N1bmt5ZW9uZ2V1bU1pZXVtIikpIHJldHVybiBYS19IYW5ndWxfU3Vua3llb25nZXVtTWlldW07Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9TdW5reWVvbmdldW1QaWV1YiIpKSByZXR1cm4gWEtfSGFuZ3VsX1N1bmt5ZW9uZ2V1bVBpZXViOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfUGFuU2lvcyIpKSByZXR1cm4gWEtfSGFuZ3VsX1BhblNpb3M7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9La29namlEYWxyaW5JZXVuZyIpKSByZXR1cm4gWEtfSGFuZ3VsX0trb2dqaURhbHJpbklldW5nOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfU3Vua3llb25nZXVtUGhpZXVmIikpIHJldHVybiBYS19IYW5ndWxfU3Vua3llb25nZXVtUGhpZXVmOwotCWlmICghc3RyY21wKHMsICJIYW5ndWxfWWVvcmluSGlldWgiKSkgcmV0dXJuIFhLX0hhbmd1bF9ZZW9yaW5IaWV1aDsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0FyYWVBIikpIHJldHVybiBYS19IYW5ndWxfQXJhZUE7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9BcmFlQUUiKSkgcmV0dXJuIFhLX0hhbmd1bF9BcmFlQUU7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX1BhblNpb3MiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1BhblNpb3M7Ci0JaWYgKCFzdHJjbXAocywgIkhhbmd1bF9KX0trb2dqaURhbHJpbklldW5nIikpIHJldHVybiBYS19IYW5ndWxfSl9La29namlEYWxyaW5JZXVuZzsKLQlpZiAoIXN0cmNtcChzLCAiSGFuZ3VsX0pfWWVvcmluSGlldWgiKSkgcmV0dXJuIFhLX0hhbmd1bF9KX1llb3JpbkhpZXVoOwotCWlmICghc3RyY21wKHMsICJLb3JlYW5fV29uIikpIHJldHVybiBYS19Lb3JlYW5fV29uOwotI2VuZGlmIC8qIFhLX0tPUkVBTiAqLwotCWlmICghc3RyY21wKHMsICJFdXJvU2lnbiIpKSByZXR1cm4gWEtfRXVyb1NpZ247Ci0jZW5kaWYKLQlyZXR1cm4gTm9TeW1ib2w7CQotfQotCi0KLWNoYXIgKlhLZXlzeW1Ub1N0cmluZyhLZXlTeW0gaykgewotI2lmbmRlZiBYS18wX25vc3VjaAotCWlmIChrID09IFhLX1ZvaWRTeW1ib2wpIHJldHVybiAiVm9pZFN5bWJvbCI7Ci0jaWZkZWYgWEtfTUlTQ0VMTEFOWQotCWlmIChrID09IFhLX0JhY2tTcGFjZSkgcmV0dXJuICJCYWNrU3BhY2UiOwotCWlmIChrID09IFhLX1RhYikgcmV0dXJuICJUYWIiOwotCWlmIChrID09IFhLX0xpbmVmZWVkKSByZXR1cm4gIkxpbmVmZWVkIjsKLQlpZiAoayA9PSBYS19DbGVhcikgcmV0dXJuICJDbGVhciI7Ci0JaWYgKGsgPT0gWEtfUmV0dXJuKSByZXR1cm4gIlJldHVybiI7Ci0JaWYgKGsgPT0gWEtfUGF1c2UpIHJldHVybiAiUGF1c2UiOwotCWlmIChrID09IFhLX1Njcm9sbF9Mb2NrKSByZXR1cm4gIlNjcm9sbF9Mb2NrIjsKLQlpZiAoayA9PSBYS19TeXNfUmVxKSByZXR1cm4gIlN5c19SZXEiOwotCWlmIChrID09IFhLX0VzY2FwZSkgcmV0dXJuICJFc2NhcGUiOwotCWlmIChrID09IFhLX0RlbGV0ZSkgcmV0dXJuICJEZWxldGUiOwotCWlmIChrID09IFhLX011bHRpX2tleSkgcmV0dXJuICJNdWx0aV9rZXkiOwotCWlmIChrID09IFhLX1NpbmdsZUNhbmRpZGF0ZSkgcmV0dXJuICJTaW5nbGVDYW5kaWRhdGUiOwotCWlmIChrID09IFhLX011bHRpcGxlQ2FuZGlkYXRlKSByZXR1cm4gIk11bHRpcGxlQ2FuZGlkYXRlIjsKLQlpZiAoayA9PSBYS19QcmV2aW91c0NhbmRpZGF0ZSkgcmV0dXJuICJQcmV2aW91c0NhbmRpZGF0ZSI7Ci0JaWYgKGsgPT0gWEtfS2FuamkpIHJldHVybiAiS2FuamkiOwotCWlmIChrID09IFhLX011aGVua2FuKSByZXR1cm4gIk11aGVua2FuIjsKLQlpZiAoayA9PSBYS19IZW5rYW5fTW9kZSkgcmV0dXJuICJIZW5rYW5fTW9kZSI7Ci0JaWYgKGsgPT0gWEtfSGVua2FuKSByZXR1cm4gIkhlbmthbiI7Ci0JaWYgKGsgPT0gWEtfUm9tYWppKSByZXR1cm4gIlJvbWFqaSI7Ci0JaWYgKGsgPT0gWEtfSGlyYWdhbmEpIHJldHVybiAiSGlyYWdhbmEiOwotCWlmIChrID09IFhLX0thdGFrYW5hKSByZXR1cm4gIkthdGFrYW5hIjsKLQlpZiAoayA9PSBYS19IaXJhZ2FuYV9LYXRha2FuYSkgcmV0dXJuICJIaXJhZ2FuYV9LYXRha2FuYSI7Ci0JaWYgKGsgPT0gWEtfWmVua2FrdSkgcmV0dXJuICJaZW5rYWt1IjsKLQlpZiAoayA9PSBYS19IYW5rYWt1KSByZXR1cm4gIkhhbmtha3UiOwotCWlmIChrID09IFhLX1plbmtha3VfSGFua2FrdSkgcmV0dXJuICJaZW5rYWt1X0hhbmtha3UiOwotCWlmIChrID09IFhLX1RvdXJva3UpIHJldHVybiAiVG91cm9rdSI7Ci0JaWYgKGsgPT0gWEtfTWFzc3lvKSByZXR1cm4gIk1hc3N5byI7Ci0JaWYgKGsgPT0gWEtfS2FuYV9Mb2NrKSByZXR1cm4gIkthbmFfTG9jayI7Ci0JaWYgKGsgPT0gWEtfS2FuYV9TaGlmdCkgcmV0dXJuICJLYW5hX1NoaWZ0IjsKLQlpZiAoayA9PSBYS19FaXN1X1NoaWZ0KSByZXR1cm4gIkVpc3VfU2hpZnQiOwotCWlmIChrID09IFhLX0Vpc3VfdG9nZ2xlKSByZXR1cm4gIkVpc3VfdG9nZ2xlIjsKLQlpZiAoayA9PSBYS19aZW5fS29obykgcmV0dXJuICJaZW5fS29obyI7Ci0JaWYgKGsgPT0gWEtfTWFlX0tvaG8pIHJldHVybiAiTWFlX0tvaG8iOwotCWlmIChrID09IFhLX0hvbWUpIHJldHVybiAiSG9tZSI7Ci0JaWYgKGsgPT0gWEtfTGVmdCkgcmV0dXJuICJMZWZ0IjsKLQlpZiAoayA9PSBYS19VcCkgcmV0dXJuICJVcCI7Ci0JaWYgKGsgPT0gWEtfUmlnaHQpIHJldHVybiAiUmlnaHQiOwotCWlmIChrID09IFhLX0Rvd24pIHJldHVybiAiRG93biI7Ci0JaWYgKGsgPT0gWEtfUHJpb3IpIHJldHVybiAiUHJpb3IiOwotCWlmIChrID09IFhLX1BhZ2VfVXApIHJldHVybiAiUGFnZV9VcCI7Ci0JaWYgKGsgPT0gWEtfTmV4dCkgcmV0dXJuICJOZXh0IjsKLQlpZiAoayA9PSBYS19QYWdlX0Rvd24pIHJldHVybiAiUGFnZV9Eb3duIjsKLQlpZiAoayA9PSBYS19FbmQpIHJldHVybiAiRW5kIjsKLQlpZiAoayA9PSBYS19CZWdpbikgcmV0dXJuICJCZWdpbiI7Ci0JaWYgKGsgPT0gWEtfU2VsZWN0KSByZXR1cm4gIlNlbGVjdCI7Ci0JaWYgKGsgPT0gWEtfUHJpbnQpIHJldHVybiAiUHJpbnQiOwotCWlmIChrID09IFhLX0V4ZWN1dGUpIHJldHVybiAiRXhlY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfSW5zZXJ0KSByZXR1cm4gIkluc2VydCI7Ci0JaWYgKGsgPT0gWEtfVW5kbykgcmV0dXJuICJVbmRvIjsKLQlpZiAoayA9PSBYS19SZWRvKSByZXR1cm4gIlJlZG8iOwotCWlmIChrID09IFhLX01lbnUpIHJldHVybiAiTWVudSI7Ci0JaWYgKGsgPT0gWEtfRmluZCkgcmV0dXJuICJGaW5kIjsKLQlpZiAoayA9PSBYS19DYW5jZWwpIHJldHVybiAiQ2FuY2VsIjsKLQlpZiAoayA9PSBYS19IZWxwKSByZXR1cm4gIkhlbHAiOwotCWlmIChrID09IFhLX0JyZWFrKSByZXR1cm4gIkJyZWFrIjsKLQlpZiAoayA9PSBYS19Nb2RlX3N3aXRjaCkgcmV0dXJuICJNb2RlX3N3aXRjaCI7Ci0JaWYgKGsgPT0gWEtfc2NyaXB0X3N3aXRjaCkgcmV0dXJuICJzY3JpcHRfc3dpdGNoIjsKLQlpZiAoayA9PSBYS19OdW1fTG9jaykgcmV0dXJuICJOdW1fTG9jayI7Ci0JaWYgKGsgPT0gWEtfS1BfU3BhY2UpIHJldHVybiAiS1BfU3BhY2UiOwotCWlmIChrID09IFhLX0tQX1RhYikgcmV0dXJuICJLUF9UYWIiOwotCWlmIChrID09IFhLX0tQX0VudGVyKSByZXR1cm4gIktQX0VudGVyIjsKLQlpZiAoayA9PSBYS19LUF9GMSkgcmV0dXJuICJLUF9GMSI7Ci0JaWYgKGsgPT0gWEtfS1BfRjIpIHJldHVybiAiS1BfRjIiOwotCWlmIChrID09IFhLX0tQX0YzKSByZXR1cm4gIktQX0YzIjsKLQlpZiAoayA9PSBYS19LUF9GNCkgcmV0dXJuICJLUF9GNCI7Ci0JaWYgKGsgPT0gWEtfS1BfSG9tZSkgcmV0dXJuICJLUF9Ib21lIjsKLQlpZiAoayA9PSBYS19LUF9MZWZ0KSByZXR1cm4gIktQX0xlZnQiOwotCWlmIChrID09IFhLX0tQX1VwKSByZXR1cm4gIktQX1VwIjsKLQlpZiAoayA9PSBYS19LUF9SaWdodCkgcmV0dXJuICJLUF9SaWdodCI7Ci0JaWYgKGsgPT0gWEtfS1BfRG93bikgcmV0dXJuICJLUF9Eb3duIjsKLQlpZiAoayA9PSBYS19LUF9QcmlvcikgcmV0dXJuICJLUF9QcmlvciI7Ci0JaWYgKGsgPT0gWEtfS1BfUGFnZV9VcCkgcmV0dXJuICJLUF9QYWdlX1VwIjsKLQlpZiAoayA9PSBYS19LUF9OZXh0KSByZXR1cm4gIktQX05leHQiOwotCWlmIChrID09IFhLX0tQX1BhZ2VfRG93bikgcmV0dXJuICJLUF9QYWdlX0Rvd24iOwotCWlmIChrID09IFhLX0tQX0VuZCkgcmV0dXJuICJLUF9FbmQiOwotCWlmIChrID09IFhLX0tQX0JlZ2luKSByZXR1cm4gIktQX0JlZ2luIjsKLQlpZiAoayA9PSBYS19LUF9JbnNlcnQpIHJldHVybiAiS1BfSW5zZXJ0IjsKLQlpZiAoayA9PSBYS19LUF9EZWxldGUpIHJldHVybiAiS1BfRGVsZXRlIjsKLQlpZiAoayA9PSBYS19LUF9FcXVhbCkgcmV0dXJuICJLUF9FcXVhbCI7Ci0JaWYgKGsgPT0gWEtfS1BfTXVsdGlwbHkpIHJldHVybiAiS1BfTXVsdGlwbHkiOwotCWlmIChrID09IFhLX0tQX0FkZCkgcmV0dXJuICJLUF9BZGQiOwotCWlmIChrID09IFhLX0tQX1NlcGFyYXRvcikgcmV0dXJuICJLUF9TZXBhcmF0b3IiOwotCWlmIChrID09IFhLX0tQX1N1YnRyYWN0KSByZXR1cm4gIktQX1N1YnRyYWN0IjsKLQlpZiAoayA9PSBYS19LUF9EZWNpbWFsKSByZXR1cm4gIktQX0RlY2ltYWwiOwotCWlmIChrID09IFhLX0tQX0RpdmlkZSkgcmV0dXJuICJLUF9EaXZpZGUiOwotCWlmIChrID09IFhLX0tQXzApIHJldHVybiAiS1BfMCI7Ci0JaWYgKGsgPT0gWEtfS1BfMSkgcmV0dXJuICJLUF8xIjsKLQlpZiAoayA9PSBYS19LUF8yKSByZXR1cm4gIktQXzIiOwotCWlmIChrID09IFhLX0tQXzMpIHJldHVybiAiS1BfMyI7Ci0JaWYgKGsgPT0gWEtfS1BfNCkgcmV0dXJuICJLUF80IjsKLQlpZiAoayA9PSBYS19LUF81KSByZXR1cm4gIktQXzUiOwotCWlmIChrID09IFhLX0tQXzYpIHJldHVybiAiS1BfNiI7Ci0JaWYgKGsgPT0gWEtfS1BfNykgcmV0dXJuICJLUF83IjsKLQlpZiAoayA9PSBYS19LUF84KSByZXR1cm4gIktQXzgiOwotCWlmIChrID09IFhLX0tQXzkpIHJldHVybiAiS1BfOSI7Ci0JaWYgKGsgPT0gWEtfRjEpIHJldHVybiAiRjEiOwotCWlmIChrID09IFhLX0YyKSByZXR1cm4gIkYyIjsKLQlpZiAoayA9PSBYS19GMykgcmV0dXJuICJGMyI7Ci0JaWYgKGsgPT0gWEtfRjQpIHJldHVybiAiRjQiOwotCWlmIChrID09IFhLX0Y1KSByZXR1cm4gIkY1IjsKLQlpZiAoayA9PSBYS19GNikgcmV0dXJuICJGNiI7Ci0JaWYgKGsgPT0gWEtfRjcpIHJldHVybiAiRjciOwotCWlmIChrID09IFhLX0Y4KSByZXR1cm4gIkY4IjsKLQlpZiAoayA9PSBYS19GOSkgcmV0dXJuICJGOSI7Ci0JaWYgKGsgPT0gWEtfRjEwKSByZXR1cm4gIkYxMCI7Ci0JaWYgKGsgPT0gWEtfRjExKSByZXR1cm4gIkYxMSI7Ci0JaWYgKGsgPT0gWEtfTDEpIHJldHVybiAiTDEiOwotCWlmIChrID09IFhLX0YxMikgcmV0dXJuICJGMTIiOwotCWlmIChrID09IFhLX0wyKSByZXR1cm4gIkwyIjsKLQlpZiAoayA9PSBYS19GMTMpIHJldHVybiAiRjEzIjsKLQlpZiAoayA9PSBYS19MMykgcmV0dXJuICJMMyI7Ci0JaWYgKGsgPT0gWEtfRjE0KSByZXR1cm4gIkYxNCI7Ci0JaWYgKGsgPT0gWEtfTDQpIHJldHVybiAiTDQiOwotCWlmIChrID09IFhLX0YxNSkgcmV0dXJuICJGMTUiOwotCWlmIChrID09IFhLX0w1KSByZXR1cm4gIkw1IjsKLQlpZiAoayA9PSBYS19GMTYpIHJldHVybiAiRjE2IjsKLQlpZiAoayA9PSBYS19MNikgcmV0dXJuICJMNiI7Ci0JaWYgKGsgPT0gWEtfRjE3KSByZXR1cm4gIkYxNyI7Ci0JaWYgKGsgPT0gWEtfTDcpIHJldHVybiAiTDciOwotCWlmIChrID09IFhLX0YxOCkgcmV0dXJuICJGMTgiOwotCWlmIChrID09IFhLX0w4KSByZXR1cm4gIkw4IjsKLQlpZiAoayA9PSBYS19GMTkpIHJldHVybiAiRjE5IjsKLQlpZiAoayA9PSBYS19MOSkgcmV0dXJuICJMOSI7Ci0JaWYgKGsgPT0gWEtfRjIwKSByZXR1cm4gIkYyMCI7Ci0JaWYgKGsgPT0gWEtfTDEwKSByZXR1cm4gIkwxMCI7Ci0JaWYgKGsgPT0gWEtfRjIxKSByZXR1cm4gIkYyMSI7Ci0JaWYgKGsgPT0gWEtfUjEpIHJldHVybiAiUjEiOwotCWlmIChrID09IFhLX0YyMikgcmV0dXJuICJGMjIiOwotCWlmIChrID09IFhLX1IyKSByZXR1cm4gIlIyIjsKLQlpZiAoayA9PSBYS19GMjMpIHJldHVybiAiRjIzIjsKLQlpZiAoayA9PSBYS19SMykgcmV0dXJuICJSMyI7Ci0JaWYgKGsgPT0gWEtfRjI0KSByZXR1cm4gIkYyNCI7Ci0JaWYgKGsgPT0gWEtfUjQpIHJldHVybiAiUjQiOwotCWlmIChrID09IFhLX0YyNSkgcmV0dXJuICJGMjUiOwotCWlmIChrID09IFhLX1I1KSByZXR1cm4gIlI1IjsKLQlpZiAoayA9PSBYS19GMjYpIHJldHVybiAiRjI2IjsKLQlpZiAoayA9PSBYS19SNikgcmV0dXJuICJSNiI7Ci0JaWYgKGsgPT0gWEtfRjI3KSByZXR1cm4gIkYyNyI7Ci0JaWYgKGsgPT0gWEtfUjcpIHJldHVybiAiUjciOwotCWlmIChrID09IFhLX0YyOCkgcmV0dXJuICJGMjgiOwotCWlmIChrID09IFhLX1I4KSByZXR1cm4gIlI4IjsKLQlpZiAoayA9PSBYS19GMjkpIHJldHVybiAiRjI5IjsKLQlpZiAoayA9PSBYS19SOSkgcmV0dXJuICJSOSI7Ci0JaWYgKGsgPT0gWEtfRjMwKSByZXR1cm4gIkYzMCI7Ci0JaWYgKGsgPT0gWEtfUjEwKSByZXR1cm4gIlIxMCI7Ci0JaWYgKGsgPT0gWEtfRjMxKSByZXR1cm4gIkYzMSI7Ci0JaWYgKGsgPT0gWEtfUjExKSByZXR1cm4gIlIxMSI7Ci0JaWYgKGsgPT0gWEtfRjMyKSByZXR1cm4gIkYzMiI7Ci0JaWYgKGsgPT0gWEtfUjEyKSByZXR1cm4gIlIxMiI7Ci0JaWYgKGsgPT0gWEtfRjMzKSByZXR1cm4gIkYzMyI7Ci0JaWYgKGsgPT0gWEtfUjEzKSByZXR1cm4gIlIxMyI7Ci0JaWYgKGsgPT0gWEtfRjM0KSByZXR1cm4gIkYzNCI7Ci0JaWYgKGsgPT0gWEtfUjE0KSByZXR1cm4gIlIxNCI7Ci0JaWYgKGsgPT0gWEtfRjM1KSByZXR1cm4gIkYzNSI7Ci0JaWYgKGsgPT0gWEtfUjE1KSByZXR1cm4gIlIxNSI7Ci0JaWYgKGsgPT0gWEtfU2hpZnRfTCkgcmV0dXJuICJTaGlmdF9MIjsKLQlpZiAoayA9PSBYS19TaGlmdF9SKSByZXR1cm4gIlNoaWZ0X1IiOwotCWlmIChrID09IFhLX0NvbnRyb2xfTCkgcmV0dXJuICJDb250cm9sX0wiOwotCWlmIChrID09IFhLX0NvbnRyb2xfUikgcmV0dXJuICJDb250cm9sX1IiOwotCWlmIChrID09IFhLX0NhcHNfTG9jaykgcmV0dXJuICJDYXBzX0xvY2siOwotCWlmIChrID09IFhLX1NoaWZ0X0xvY2spIHJldHVybiAiU2hpZnRfTG9jayI7Ci0JaWYgKGsgPT0gWEtfTWV0YV9MKSByZXR1cm4gIk1ldGFfTCI7Ci0JaWYgKGsgPT0gWEtfTWV0YV9SKSByZXR1cm4gIk1ldGFfUiI7Ci0JaWYgKGsgPT0gWEtfQWx0X0wpIHJldHVybiAiQWx0X0wiOwotCWlmIChrID09IFhLX0FsdF9SKSByZXR1cm4gIkFsdF9SIjsKLQlpZiAoayA9PSBYS19TdXBlcl9MKSByZXR1cm4gIlN1cGVyX0wiOwotCWlmIChrID09IFhLX1N1cGVyX1IpIHJldHVybiAiU3VwZXJfUiI7Ci0JaWYgKGsgPT0gWEtfSHlwZXJfTCkgcmV0dXJuICJIeXBlcl9MIjsKLQlpZiAoayA9PSBYS19IeXBlcl9SKSByZXR1cm4gIkh5cGVyX1IiOwotI2VuZGlmIC8qIFhLX01JU0NFTExBTlkgKi8KLSNpZmRlZiBYS19YS0JfS0VZUwotCWlmIChrID09IFhLX0lTT19Mb2NrKSByZXR1cm4gIklTT19Mb2NrIjsKLQlpZiAoayA9PSBYS19JU09fTGV2ZWwyX0xhdGNoKSByZXR1cm4gIklTT19MZXZlbDJfTGF0Y2giOwotCWlmIChrID09IFhLX0lTT19MZXZlbDNfU2hpZnQpIHJldHVybiAiSVNPX0xldmVsM19TaGlmdCI7Ci0JaWYgKGsgPT0gWEtfSVNPX0xldmVsM19MYXRjaCkgcmV0dXJuICJJU09fTGV2ZWwzX0xhdGNoIjsKLQlpZiAoayA9PSBYS19JU09fTGV2ZWwzX0xvY2spIHJldHVybiAiSVNPX0xldmVsM19Mb2NrIjsKLQlpZiAoayA9PSBYS19JU09fR3JvdXBfU2hpZnQpIHJldHVybiAiSVNPX0dyb3VwX1NoaWZ0IjsKLQlpZiAoayA9PSBYS19JU09fR3JvdXBfTGF0Y2gpIHJldHVybiAiSVNPX0dyb3VwX0xhdGNoIjsKLQlpZiAoayA9PSBYS19JU09fR3JvdXBfTG9jaykgcmV0dXJuICJJU09fR3JvdXBfTG9jayI7Ci0JaWYgKGsgPT0gWEtfSVNPX05leHRfR3JvdXApIHJldHVybiAiSVNPX05leHRfR3JvdXAiOwotCWlmIChrID09IFhLX0lTT19OZXh0X0dyb3VwX0xvY2spIHJldHVybiAiSVNPX05leHRfR3JvdXBfTG9jayI7Ci0JaWYgKGsgPT0gWEtfSVNPX1ByZXZfR3JvdXApIHJldHVybiAiSVNPX1ByZXZfR3JvdXAiOwotCWlmIChrID09IFhLX0lTT19QcmV2X0dyb3VwX0xvY2spIHJldHVybiAiSVNPX1ByZXZfR3JvdXBfTG9jayI7Ci0JaWYgKGsgPT0gWEtfSVNPX0ZpcnN0X0dyb3VwKSByZXR1cm4gIklTT19GaXJzdF9Hcm91cCI7Ci0JaWYgKGsgPT0gWEtfSVNPX0ZpcnN0X0dyb3VwX0xvY2spIHJldHVybiAiSVNPX0ZpcnN0X0dyb3VwX0xvY2siOwotCWlmIChrID09IFhLX0lTT19MYXN0X0dyb3VwKSByZXR1cm4gIklTT19MYXN0X0dyb3VwIjsKLQlpZiAoayA9PSBYS19JU09fTGFzdF9Hcm91cF9Mb2NrKSByZXR1cm4gIklTT19MYXN0X0dyb3VwX0xvY2siOwotCWlmIChrID09IFhLX0lTT19MZWZ0X1RhYikgcmV0dXJuICJJU09fTGVmdF9UYWIiOwotCWlmIChrID09IFhLX0lTT19Nb3ZlX0xpbmVfVXApIHJldHVybiAiSVNPX01vdmVfTGluZV9VcCI7Ci0JaWYgKGsgPT0gWEtfSVNPX01vdmVfTGluZV9Eb3duKSByZXR1cm4gIklTT19Nb3ZlX0xpbmVfRG93biI7Ci0JaWYgKGsgPT0gWEtfSVNPX1BhcnRpYWxfTGluZV9VcCkgcmV0dXJuICJJU09fUGFydGlhbF9MaW5lX1VwIjsKLQlpZiAoayA9PSBYS19JU09fUGFydGlhbF9MaW5lX0Rvd24pIHJldHVybiAiSVNPX1BhcnRpYWxfTGluZV9Eb3duIjsKLQlpZiAoayA9PSBYS19JU09fUGFydGlhbF9TcGFjZV9MZWZ0KSByZXR1cm4gIklTT19QYXJ0aWFsX1NwYWNlX0xlZnQiOwotCWlmIChrID09IFhLX0lTT19QYXJ0aWFsX1NwYWNlX1JpZ2h0KSByZXR1cm4gIklTT19QYXJ0aWFsX1NwYWNlX1JpZ2h0IjsKLQlpZiAoayA9PSBYS19JU09fU2V0X01hcmdpbl9MZWZ0KSByZXR1cm4gIklTT19TZXRfTWFyZ2luX0xlZnQiOwotCWlmIChrID09IFhLX0lTT19TZXRfTWFyZ2luX1JpZ2h0KSByZXR1cm4gIklTT19TZXRfTWFyZ2luX1JpZ2h0IjsKLQlpZiAoayA9PSBYS19JU09fUmVsZWFzZV9NYXJnaW5fTGVmdCkgcmV0dXJuICJJU09fUmVsZWFzZV9NYXJnaW5fTGVmdCI7Ci0JaWYgKGsgPT0gWEtfSVNPX1JlbGVhc2VfTWFyZ2luX1JpZ2h0KSByZXR1cm4gIklTT19SZWxlYXNlX01hcmdpbl9SaWdodCI7Ci0JaWYgKGsgPT0gWEtfSVNPX1JlbGVhc2VfQm90aF9NYXJnaW5zKSByZXR1cm4gIklTT19SZWxlYXNlX0JvdGhfTWFyZ2lucyI7Ci0JaWYgKGsgPT0gWEtfSVNPX0Zhc3RfQ3Vyc29yX0xlZnQpIHJldHVybiAiSVNPX0Zhc3RfQ3Vyc29yX0xlZnQiOwotCWlmIChrID09IFhLX0lTT19GYXN0X0N1cnNvcl9SaWdodCkgcmV0dXJuICJJU09fRmFzdF9DdXJzb3JfUmlnaHQiOwotCWlmIChrID09IFhLX0lTT19GYXN0X0N1cnNvcl9VcCkgcmV0dXJuICJJU09fRmFzdF9DdXJzb3JfVXAiOwotCWlmIChrID09IFhLX0lTT19GYXN0X0N1cnNvcl9Eb3duKSByZXR1cm4gIklTT19GYXN0X0N1cnNvcl9Eb3duIjsKLQlpZiAoayA9PSBYS19JU09fQ29udGludW91c19VbmRlcmxpbmUpIHJldHVybiAiSVNPX0NvbnRpbnVvdXNfVW5kZXJsaW5lIjsKLQlpZiAoayA9PSBYS19JU09fRGlzY29udGludW91c19VbmRlcmxpbmUpIHJldHVybiAiSVNPX0Rpc2NvbnRpbnVvdXNfVW5kZXJsaW5lIjsKLQlpZiAoayA9PSBYS19JU09fRW1waGFzaXplKSByZXR1cm4gIklTT19FbXBoYXNpemUiOwotCWlmIChrID09IFhLX0lTT19DZW50ZXJfT2JqZWN0KSByZXR1cm4gIklTT19DZW50ZXJfT2JqZWN0IjsKLQlpZiAoayA9PSBYS19JU09fRW50ZXIpIHJldHVybiAiSVNPX0VudGVyIjsKLQlpZiAoayA9PSBYS19kZWFkX2dyYXZlKSByZXR1cm4gImRlYWRfZ3JhdmUiOwotCWlmIChrID09IFhLX2RlYWRfYWN1dGUpIHJldHVybiAiZGVhZF9hY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfZGVhZF9jaXJjdW1mbGV4KSByZXR1cm4gImRlYWRfY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfZGVhZF90aWxkZSkgcmV0dXJuICJkZWFkX3RpbGRlIjsKLQlpZiAoayA9PSBYS19kZWFkX21hY3JvbikgcmV0dXJuICJkZWFkX21hY3JvbiI7Ci0JaWYgKGsgPT0gWEtfZGVhZF9icmV2ZSkgcmV0dXJuICJkZWFkX2JyZXZlIjsKLQlpZiAoayA9PSBYS19kZWFkX2Fib3ZlZG90KSByZXR1cm4gImRlYWRfYWJvdmVkb3QiOwotCWlmIChrID09IFhLX2RlYWRfZGlhZXJlc2lzKSByZXR1cm4gImRlYWRfZGlhZXJlc2lzIjsKLQlpZiAoayA9PSBYS19kZWFkX2Fib3ZlcmluZykgcmV0dXJuICJkZWFkX2Fib3ZlcmluZyI7Ci0JaWYgKGsgPT0gWEtfZGVhZF9kb3VibGVhY3V0ZSkgcmV0dXJuICJkZWFkX2RvdWJsZWFjdXRlIjsKLQlpZiAoayA9PSBYS19kZWFkX2Nhcm9uKSByZXR1cm4gImRlYWRfY2Fyb24iOwotCWlmIChrID09IFhLX2RlYWRfY2VkaWxsYSkgcmV0dXJuICJkZWFkX2NlZGlsbGEiOwotCWlmIChrID09IFhLX2RlYWRfb2dvbmVrKSByZXR1cm4gImRlYWRfb2dvbmVrIjsKLQlpZiAoayA9PSBYS19kZWFkX2lvdGEpIHJldHVybiAiZGVhZF9pb3RhIjsKLQlpZiAoayA9PSBYS19kZWFkX3ZvaWNlZF9zb3VuZCkgcmV0dXJuICJkZWFkX3ZvaWNlZF9zb3VuZCI7Ci0JaWYgKGsgPT0gWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kKSByZXR1cm4gImRlYWRfc2VtaXZvaWNlZF9zb3VuZCI7Ci0JaWYgKGsgPT0gWEtfZGVhZF9iZWxvd2RvdCkgcmV0dXJuICJkZWFkX2JlbG93ZG90IjsKLQlpZiAoayA9PSBYS19GaXJzdF9WaXJ0dWFsX1NjcmVlbikgcmV0dXJuICJGaXJzdF9WaXJ0dWFsX1NjcmVlbiI7Ci0JaWYgKGsgPT0gWEtfUHJldl9WaXJ0dWFsX1NjcmVlbikgcmV0dXJuICJQcmV2X1ZpcnR1YWxfU2NyZWVuIjsKLQlpZiAoayA9PSBYS19OZXh0X1ZpcnR1YWxfU2NyZWVuKSByZXR1cm4gIk5leHRfVmlydHVhbF9TY3JlZW4iOwotCWlmIChrID09IFhLX0xhc3RfVmlydHVhbF9TY3JlZW4pIHJldHVybiAiTGFzdF9WaXJ0dWFsX1NjcmVlbiI7Ci0JaWYgKGsgPT0gWEtfVGVybWluYXRlX1NlcnZlcikgcmV0dXJuICJUZXJtaW5hdGVfU2VydmVyIjsKLQlpZiAoayA9PSBYS19BY2Nlc3NYX0VuYWJsZSkgcmV0dXJuICJBY2Nlc3NYX0VuYWJsZSI7Ci0JaWYgKGsgPT0gWEtfQWNjZXNzWF9GZWVkYmFja19FbmFibGUpIHJldHVybiAiQWNjZXNzWF9GZWVkYmFja19FbmFibGUiOwotCWlmIChrID09IFhLX1JlcGVhdEtleXNfRW5hYmxlKSByZXR1cm4gIlJlcGVhdEtleXNfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19TbG93S2V5c19FbmFibGUpIHJldHVybiAiU2xvd0tleXNfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19Cb3VuY2VLZXlzX0VuYWJsZSkgcmV0dXJuICJCb3VuY2VLZXlzX0VuYWJsZSI7Ci0JaWYgKGsgPT0gWEtfU3RpY2t5S2V5c19FbmFibGUpIHJldHVybiAiU3RpY2t5S2V5c19FbmFibGUiOwotCWlmIChrID09IFhLX01vdXNlS2V5c19FbmFibGUpIHJldHVybiAiTW91c2VLZXlzX0VuYWJsZSI7Ci0JaWYgKGsgPT0gWEtfTW91c2VLZXlzX0FjY2VsX0VuYWJsZSkgcmV0dXJuICJNb3VzZUtleXNfQWNjZWxfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19PdmVybGF5MV9FbmFibGUpIHJldHVybiAiT3ZlcmxheTFfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19PdmVybGF5Ml9FbmFibGUpIHJldHVybiAiT3ZlcmxheTJfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19BdWRpYmxlQmVsbF9FbmFibGUpIHJldHVybiAiQXVkaWJsZUJlbGxfRW5hYmxlIjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX0xlZnQpIHJldHVybiAiUG9pbnRlcl9MZWZ0IjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX1JpZ2h0KSByZXR1cm4gIlBvaW50ZXJfUmlnaHQiOwotCWlmIChrID09IFhLX1BvaW50ZXJfVXApIHJldHVybiAiUG9pbnRlcl9VcCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9Eb3duKSByZXR1cm4gIlBvaW50ZXJfRG93biI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9VcExlZnQpIHJldHVybiAiUG9pbnRlcl9VcExlZnQiOwotCWlmIChrID09IFhLX1BvaW50ZXJfVXBSaWdodCkgcmV0dXJuICJQb2ludGVyX1VwUmlnaHQiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRG93bkxlZnQpIHJldHVybiAiUG9pbnRlcl9Eb3duTGVmdCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9Eb3duUmlnaHQpIHJldHVybiAiUG9pbnRlcl9Eb3duUmlnaHQiOwotCWlmIChrID09IFhLX1BvaW50ZXJfQnV0dG9uX0RmbHQpIHJldHVybiAiUG9pbnRlcl9CdXR0b25fRGZsdCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9CdXR0b24xKSByZXR1cm4gIlBvaW50ZXJfQnV0dG9uMSI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9CdXR0b24yKSByZXR1cm4gIlBvaW50ZXJfQnV0dG9uMiI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9CdXR0b24zKSByZXR1cm4gIlBvaW50ZXJfQnV0dG9uMyI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9CdXR0b240KSByZXR1cm4gIlBvaW50ZXJfQnV0dG9uNCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9CdXR0b241KSByZXR1cm4gIlBvaW50ZXJfQnV0dG9uNSI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EYmxDbGlja19EZmx0KSByZXR1cm4gIlBvaW50ZXJfRGJsQ2xpY2tfRGZsdCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EYmxDbGljazEpIHJldHVybiAiUG9pbnRlcl9EYmxDbGljazEiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRGJsQ2xpY2syKSByZXR1cm4gIlBvaW50ZXJfRGJsQ2xpY2syIjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX0RibENsaWNrMykgcmV0dXJuICJQb2ludGVyX0RibENsaWNrMyI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EYmxDbGljazQpIHJldHVybiAiUG9pbnRlcl9EYmxDbGljazQiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRGJsQ2xpY2s1KSByZXR1cm4gIlBvaW50ZXJfRGJsQ2xpY2s1IjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX0RyYWdfRGZsdCkgcmV0dXJuICJQb2ludGVyX0RyYWdfRGZsdCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EcmFnMSkgcmV0dXJuICJQb2ludGVyX0RyYWcxIjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX0RyYWcyKSByZXR1cm4gIlBvaW50ZXJfRHJhZzIiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRHJhZzMpIHJldHVybiAiUG9pbnRlcl9EcmFnMyI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EcmFnNCkgcmV0dXJuICJQb2ludGVyX0RyYWc0IjsKLQlpZiAoayA9PSBYS19Qb2ludGVyX0RyYWc1KSByZXR1cm4gIlBvaW50ZXJfRHJhZzUiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRW5hYmxlS2V5cykgcmV0dXJuICJQb2ludGVyX0VuYWJsZUtleXMiOwotCWlmIChrID09IFhLX1BvaW50ZXJfQWNjZWxlcmF0ZSkgcmV0dXJuICJQb2ludGVyX0FjY2VsZXJhdGUiOwotCWlmIChrID09IFhLX1BvaW50ZXJfRGZsdEJ0bk5leHQpIHJldHVybiAiUG9pbnRlcl9EZmx0QnRuTmV4dCI7Ci0JaWYgKGsgPT0gWEtfUG9pbnRlcl9EZmx0QnRuUHJldikgcmV0dXJuICJQb2ludGVyX0RmbHRCdG5QcmV2IjsKLSNlbmRpZgotI2lmZGVmIFhLXzMyNzAKLQlpZiAoayA9PSBYS18zMjcwX0R1cGxpY2F0ZSkgcmV0dXJuICIzMjcwX0R1cGxpY2F0ZSI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9GaWVsZE1hcmspIHJldHVybiAiMzI3MF9GaWVsZE1hcmsiOwotCWlmIChrID09IFhLXzMyNzBfUmlnaHQyKSByZXR1cm4gIjMyNzBfUmlnaHQyIjsKLQlpZiAoayA9PSBYS18zMjcwX0xlZnQyKSByZXR1cm4gIjMyNzBfTGVmdDIiOwotCWlmIChrID09IFhLXzMyNzBfQmFja1RhYikgcmV0dXJuICIzMjcwX0JhY2tUYWIiOwotCWlmIChrID09IFhLXzMyNzBfRXJhc2VFT0YpIHJldHVybiAiMzI3MF9FcmFzZUVPRiI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9FcmFzZUlucHV0KSByZXR1cm4gIjMyNzBfRXJhc2VJbnB1dCI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9SZXNldCkgcmV0dXJuICIzMjcwX1Jlc2V0IjsKLQlpZiAoayA9PSBYS18zMjcwX1F1aXQpIHJldHVybiAiMzI3MF9RdWl0IjsKLQlpZiAoayA9PSBYS18zMjcwX1BBMSkgcmV0dXJuICIzMjcwX1BBMSI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9QQTIpIHJldHVybiAiMzI3MF9QQTIiOwotCWlmIChrID09IFhLXzMyNzBfUEEzKSByZXR1cm4gIjMyNzBfUEEzIjsKLQlpZiAoayA9PSBYS18zMjcwX1Rlc3QpIHJldHVybiAiMzI3MF9UZXN0IjsKLQlpZiAoayA9PSBYS18zMjcwX0F0dG4pIHJldHVybiAiMzI3MF9BdHRuIjsKLQlpZiAoayA9PSBYS18zMjcwX0N1cnNvckJsaW5rKSByZXR1cm4gIjMyNzBfQ3Vyc29yQmxpbmsiOwotCWlmIChrID09IFhLXzMyNzBfQWx0Q3Vyc29yKSByZXR1cm4gIjMyNzBfQWx0Q3Vyc29yIjsKLQlpZiAoayA9PSBYS18zMjcwX0tleUNsaWNrKSByZXR1cm4gIjMyNzBfS2V5Q2xpY2siOwotCWlmIChrID09IFhLXzMyNzBfSnVtcCkgcmV0dXJuICIzMjcwX0p1bXAiOwotCWlmIChrID09IFhLXzMyNzBfSWRlbnQpIHJldHVybiAiMzI3MF9JZGVudCI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9SdWxlKSByZXR1cm4gIjMyNzBfUnVsZSI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9Db3B5KSByZXR1cm4gIjMyNzBfQ29weSI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9QbGF5KSByZXR1cm4gIjMyNzBfUGxheSI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9TZXR1cCkgcmV0dXJuICIzMjcwX1NldHVwIjsKLQlpZiAoayA9PSBYS18zMjcwX1JlY29yZCkgcmV0dXJuICIzMjcwX1JlY29yZCI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9DaGFuZ2VTY3JlZW4pIHJldHVybiAiMzI3MF9DaGFuZ2VTY3JlZW4iOwotCWlmIChrID09IFhLXzMyNzBfRGVsZXRlV29yZCkgcmV0dXJuICIzMjcwX0RlbGV0ZVdvcmQiOwotCWlmIChrID09IFhLXzMyNzBfRXhTZWxlY3QpIHJldHVybiAiMzI3MF9FeFNlbGVjdCI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9DdXJzb3JTZWxlY3QpIHJldHVybiAiMzI3MF9DdXJzb3JTZWxlY3QiOwotCWlmIChrID09IFhLXzMyNzBfUHJpbnRTY3JlZW4pIHJldHVybiAiMzI3MF9QcmludFNjcmVlbiI7Ci0JaWYgKGsgPT0gWEtfMzI3MF9FbnRlcikgcmV0dXJuICIzMjcwX0VudGVyIjsKLSNlbmRpZgotI2lmZGVmIFhLX0xBVElOMQotCWlmIChrID09IFhLX3NwYWNlKSByZXR1cm4gInNwYWNlIjsKLQlpZiAoayA9PSBYS19leGNsYW0pIHJldHVybiAiZXhjbGFtIjsKLQlpZiAoayA9PSBYS19xdW90ZWRibCkgcmV0dXJuICJxdW90ZWRibCI7Ci0JaWYgKGsgPT0gWEtfbnVtYmVyc2lnbikgcmV0dXJuICJudW1iZXJzaWduIjsKLQlpZiAoayA9PSBYS19kb2xsYXIpIHJldHVybiAiZG9sbGFyIjsKLQlpZiAoayA9PSBYS19wZXJjZW50KSByZXR1cm4gInBlcmNlbnQiOwotCWlmIChrID09IFhLX2FtcGVyc2FuZCkgcmV0dXJuICJhbXBlcnNhbmQiOwotCWlmIChrID09IFhLX2Fwb3N0cm9waGUpIHJldHVybiAiYXBvc3Ryb3BoZSI7Ci0JaWYgKGsgPT0gWEtfcXVvdGVyaWdodCkgcmV0dXJuICJxdW90ZXJpZ2h0IjsKLQlpZiAoayA9PSBYS19wYXJlbmxlZnQpIHJldHVybiAicGFyZW5sZWZ0IjsKLQlpZiAoayA9PSBYS19wYXJlbnJpZ2h0KSByZXR1cm4gInBhcmVucmlnaHQiOwotCWlmIChrID09IFhLX2FzdGVyaXNrKSByZXR1cm4gImFzdGVyaXNrIjsKLQlpZiAoayA9PSBYS19wbHVzKSByZXR1cm4gInBsdXMiOwotCWlmIChrID09IFhLX2NvbW1hKSByZXR1cm4gImNvbW1hIjsKLQlpZiAoayA9PSBYS19taW51cykgcmV0dXJuICJtaW51cyI7Ci0JaWYgKGsgPT0gWEtfcGVyaW9kKSByZXR1cm4gInBlcmlvZCI7Ci0JaWYgKGsgPT0gWEtfc2xhc2gpIHJldHVybiAic2xhc2giOwotCWlmIChrID09IFhLXzApIHJldHVybiAiMCI7Ci0JaWYgKGsgPT0gWEtfMSkgcmV0dXJuICIxIjsKLQlpZiAoayA9PSBYS18yKSByZXR1cm4gIjIiOwotCWlmIChrID09IFhLXzMpIHJldHVybiAiMyI7Ci0JaWYgKGsgPT0gWEtfNCkgcmV0dXJuICI0IjsKLQlpZiAoayA9PSBYS181KSByZXR1cm4gIjUiOwotCWlmIChrID09IFhLXzYpIHJldHVybiAiNiI7Ci0JaWYgKGsgPT0gWEtfNykgcmV0dXJuICI3IjsKLQlpZiAoayA9PSBYS184KSByZXR1cm4gIjgiOwotCWlmIChrID09IFhLXzkpIHJldHVybiAiOSI7Ci0JaWYgKGsgPT0gWEtfY29sb24pIHJldHVybiAiY29sb24iOwotCWlmIChrID09IFhLX3NlbWljb2xvbikgcmV0dXJuICJzZW1pY29sb24iOwotCWlmIChrID09IFhLX2xlc3MpIHJldHVybiAibGVzcyI7Ci0JaWYgKGsgPT0gWEtfZXF1YWwpIHJldHVybiAiZXF1YWwiOwotCWlmIChrID09IFhLX2dyZWF0ZXIpIHJldHVybiAiZ3JlYXRlciI7Ci0JaWYgKGsgPT0gWEtfcXVlc3Rpb24pIHJldHVybiAicXVlc3Rpb24iOwotCWlmIChrID09IFhLX2F0KSByZXR1cm4gImF0IjsKLQlpZiAoayA9PSBYS19BKSByZXR1cm4gIkEiOwotCWlmIChrID09IFhLX0IpIHJldHVybiAiQiI7Ci0JaWYgKGsgPT0gWEtfQykgcmV0dXJuICJDIjsKLQlpZiAoayA9PSBYS19EKSByZXR1cm4gIkQiOwotCWlmIChrID09IFhLX0UpIHJldHVybiAiRSI7Ci0JaWYgKGsgPT0gWEtfRikgcmV0dXJuICJGIjsKLQlpZiAoayA9PSBYS19HKSByZXR1cm4gIkciOwotCWlmIChrID09IFhLX0gpIHJldHVybiAiSCI7Ci0JaWYgKGsgPT0gWEtfSSkgcmV0dXJuICJJIjsKLQlpZiAoayA9PSBYS19KKSByZXR1cm4gIkoiOwotCWlmIChrID09IFhLX0spIHJldHVybiAiSyI7Ci0JaWYgKGsgPT0gWEtfTCkgcmV0dXJuICJMIjsKLQlpZiAoayA9PSBYS19NKSByZXR1cm4gIk0iOwotCWlmIChrID09IFhLX04pIHJldHVybiAiTiI7Ci0JaWYgKGsgPT0gWEtfTykgcmV0dXJuICJPIjsKLQlpZiAoayA9PSBYS19QKSByZXR1cm4gIlAiOwotCWlmIChrID09IFhLX1EpIHJldHVybiAiUSI7Ci0JaWYgKGsgPT0gWEtfUikgcmV0dXJuICJSIjsKLQlpZiAoayA9PSBYS19TKSByZXR1cm4gIlMiOwotCWlmIChrID09IFhLX1QpIHJldHVybiAiVCI7Ci0JaWYgKGsgPT0gWEtfVSkgcmV0dXJuICJVIjsKLQlpZiAoayA9PSBYS19WKSByZXR1cm4gIlYiOwotCWlmIChrID09IFhLX1cpIHJldHVybiAiVyI7Ci0JaWYgKGsgPT0gWEtfWCkgcmV0dXJuICJYIjsKLQlpZiAoayA9PSBYS19ZKSByZXR1cm4gIlkiOwotCWlmIChrID09IFhLX1opIHJldHVybiAiWiI7Ci0JaWYgKGsgPT0gWEtfYnJhY2tldGxlZnQpIHJldHVybiAiYnJhY2tldGxlZnQiOwotCWlmIChrID09IFhLX2JhY2tzbGFzaCkgcmV0dXJuICJiYWNrc2xhc2giOwotCWlmIChrID09IFhLX2JyYWNrZXRyaWdodCkgcmV0dXJuICJicmFja2V0cmlnaHQiOwotCWlmIChrID09IFhLX2FzY2lpY2lyY3VtKSByZXR1cm4gImFzY2lpY2lyY3VtIjsKLQlpZiAoayA9PSBYS191bmRlcnNjb3JlKSByZXR1cm4gInVuZGVyc2NvcmUiOwotCWlmIChrID09IFhLX2dyYXZlKSByZXR1cm4gImdyYXZlIjsKLQlpZiAoayA9PSBYS19xdW90ZWxlZnQpIHJldHVybiAicXVvdGVsZWZ0IjsKLQlpZiAoayA9PSBYS19hKSByZXR1cm4gImEiOwotCWlmIChrID09IFhLX2IpIHJldHVybiAiYiI7Ci0JaWYgKGsgPT0gWEtfYykgcmV0dXJuICJjIjsKLQlpZiAoayA9PSBYS19kKSByZXR1cm4gImQiOwotCWlmIChrID09IFhLX2UpIHJldHVybiAiZSI7Ci0JaWYgKGsgPT0gWEtfZikgcmV0dXJuICJmIjsKLQlpZiAoayA9PSBYS19nKSByZXR1cm4gImciOwotCWlmIChrID09IFhLX2gpIHJldHVybiAiaCI7Ci0JaWYgKGsgPT0gWEtfaSkgcmV0dXJuICJpIjsKLQlpZiAoayA9PSBYS19qKSByZXR1cm4gImoiOwotCWlmIChrID09IFhLX2spIHJldHVybiAiayI7Ci0JaWYgKGsgPT0gWEtfbCkgcmV0dXJuICJsIjsKLQlpZiAoayA9PSBYS19tKSByZXR1cm4gIm0iOwotCWlmIChrID09IFhLX24pIHJldHVybiAibiI7Ci0JaWYgKGsgPT0gWEtfbykgcmV0dXJuICJvIjsKLQlpZiAoayA9PSBYS19wKSByZXR1cm4gInAiOwotCWlmIChrID09IFhLX3EpIHJldHVybiAicSI7Ci0JaWYgKGsgPT0gWEtfcikgcmV0dXJuICJyIjsKLQlpZiAoayA9PSBYS19zKSByZXR1cm4gInMiOwotCWlmIChrID09IFhLX3QpIHJldHVybiAidCI7Ci0JaWYgKGsgPT0gWEtfdSkgcmV0dXJuICJ1IjsKLQlpZiAoayA9PSBYS192KSByZXR1cm4gInYiOwotCWlmIChrID09IFhLX3cpIHJldHVybiAidyI7Ci0JaWYgKGsgPT0gWEtfeCkgcmV0dXJuICJ4IjsKLQlpZiAoayA9PSBYS195KSByZXR1cm4gInkiOwotCWlmIChrID09IFhLX3opIHJldHVybiAieiI7Ci0JaWYgKGsgPT0gWEtfYnJhY2VsZWZ0KSByZXR1cm4gImJyYWNlbGVmdCI7Ci0JaWYgKGsgPT0gWEtfYmFyKSByZXR1cm4gImJhciI7Ci0JaWYgKGsgPT0gWEtfYnJhY2VyaWdodCkgcmV0dXJuICJicmFjZXJpZ2h0IjsKLQlpZiAoayA9PSBYS19hc2NpaXRpbGRlKSByZXR1cm4gImFzY2lpdGlsZGUiOwotCWlmIChrID09IFhLX25vYnJlYWtzcGFjZSkgcmV0dXJuICJub2JyZWFrc3BhY2UiOwotCWlmIChrID09IFhLX2V4Y2xhbWRvd24pIHJldHVybiAiZXhjbGFtZG93biI7Ci0JaWYgKGsgPT0gWEtfY2VudCkgcmV0dXJuICJjZW50IjsKLQlpZiAoayA9PSBYS19zdGVybGluZykgcmV0dXJuICJzdGVybGluZyI7Ci0JaWYgKGsgPT0gWEtfY3VycmVuY3kpIHJldHVybiAiY3VycmVuY3kiOwotCWlmIChrID09IFhLX3llbikgcmV0dXJuICJ5ZW4iOwotCWlmIChrID09IFhLX2Jyb2tlbmJhcikgcmV0dXJuICJicm9rZW5iYXIiOwotCWlmIChrID09IFhLX3NlY3Rpb24pIHJldHVybiAic2VjdGlvbiI7Ci0JaWYgKGsgPT0gWEtfZGlhZXJlc2lzKSByZXR1cm4gImRpYWVyZXNpcyI7Ci0JaWYgKGsgPT0gWEtfY29weXJpZ2h0KSByZXR1cm4gImNvcHlyaWdodCI7Ci0JaWYgKGsgPT0gWEtfb3JkZmVtaW5pbmUpIHJldHVybiAib3JkZmVtaW5pbmUiOwotCWlmIChrID09IFhLX2d1aWxsZW1vdGxlZnQpIHJldHVybiAiZ3VpbGxlbW90bGVmdCI7Ci0JaWYgKGsgPT0gWEtfbm90c2lnbikgcmV0dXJuICJub3RzaWduIjsKLQlpZiAoayA9PSBYS19oeXBoZW4pIHJldHVybiAiaHlwaGVuIjsKLQlpZiAoayA9PSBYS19yZWdpc3RlcmVkKSByZXR1cm4gInJlZ2lzdGVyZWQiOwotCWlmIChrID09IFhLX21hY3JvbikgcmV0dXJuICJtYWNyb24iOwotCWlmIChrID09IFhLX2RlZ3JlZSkgcmV0dXJuICJkZWdyZWUiOwotCWlmIChrID09IFhLX3BsdXNtaW51cykgcmV0dXJuICJwbHVzbWludXMiOwotCWlmIChrID09IFhLX3R3b3N1cGVyaW9yKSByZXR1cm4gInR3b3N1cGVyaW9yIjsKLQlpZiAoayA9PSBYS190aHJlZXN1cGVyaW9yKSByZXR1cm4gInRocmVlc3VwZXJpb3IiOwotCWlmIChrID09IFhLX2FjdXRlKSByZXR1cm4gImFjdXRlIjsKLQlpZiAoayA9PSBYS19tdSkgcmV0dXJuICJtdSI7Ci0JaWYgKGsgPT0gWEtfcGFyYWdyYXBoKSByZXR1cm4gInBhcmFncmFwaCI7Ci0JaWYgKGsgPT0gWEtfcGVyaW9kY2VudGVyZWQpIHJldHVybiAicGVyaW9kY2VudGVyZWQiOwotCWlmIChrID09IFhLX2NlZGlsbGEpIHJldHVybiAiY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfb25lc3VwZXJpb3IpIHJldHVybiAib25lc3VwZXJpb3IiOwotCWlmIChrID09IFhLX21hc2N1bGluZSkgcmV0dXJuICJtYXNjdWxpbmUiOwotCWlmIChrID09IFhLX2d1aWxsZW1vdHJpZ2h0KSByZXR1cm4gImd1aWxsZW1vdHJpZ2h0IjsKLQlpZiAoayA9PSBYS19vbmVxdWFydGVyKSByZXR1cm4gIm9uZXF1YXJ0ZXIiOwotCWlmIChrID09IFhLX29uZWhhbGYpIHJldHVybiAib25laGFsZiI7Ci0JaWYgKGsgPT0gWEtfdGhyZWVxdWFydGVycykgcmV0dXJuICJ0aHJlZXF1YXJ0ZXJzIjsKLQlpZiAoayA9PSBYS19xdWVzdGlvbmRvd24pIHJldHVybiAicXVlc3Rpb25kb3duIjsKLQlpZiAoayA9PSBYS19BZ3JhdmUpIHJldHVybiAiQWdyYXZlIjsKLQlpZiAoayA9PSBYS19BYWN1dGUpIHJldHVybiAiQWFjdXRlIjsKLQlpZiAoayA9PSBYS19BY2lyY3VtZmxleCkgcmV0dXJuICJBY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfQXRpbGRlKSByZXR1cm4gIkF0aWxkZSI7Ci0JaWYgKGsgPT0gWEtfQWRpYWVyZXNpcykgcmV0dXJuICJBZGlhZXJlc2lzIjsKLQlpZiAoayA9PSBYS19BcmluZykgcmV0dXJuICJBcmluZyI7Ci0JaWYgKGsgPT0gWEtfQUUpIHJldHVybiAiQUUiOwotCWlmIChrID09IFhLX0NjZWRpbGxhKSByZXR1cm4gIkNjZWRpbGxhIjsKLQlpZiAoayA9PSBYS19FZ3JhdmUpIHJldHVybiAiRWdyYXZlIjsKLQlpZiAoayA9PSBYS19FYWN1dGUpIHJldHVybiAiRWFjdXRlIjsKLQlpZiAoayA9PSBYS19FY2lyY3VtZmxleCkgcmV0dXJuICJFY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfRWRpYWVyZXNpcykgcmV0dXJuICJFZGlhZXJlc2lzIjsKLQlpZiAoayA9PSBYS19JZ3JhdmUpIHJldHVybiAiSWdyYXZlIjsKLQlpZiAoayA9PSBYS19JYWN1dGUpIHJldHVybiAiSWFjdXRlIjsKLQlpZiAoayA9PSBYS19JY2lyY3VtZmxleCkgcmV0dXJuICJJY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfSWRpYWVyZXNpcykgcmV0dXJuICJJZGlhZXJlc2lzIjsKLQlpZiAoayA9PSBYS19FVEgpIHJldHVybiAiRVRIIjsKLQlpZiAoayA9PSBYS19FdGgpIHJldHVybiAiRXRoIjsKLQlpZiAoayA9PSBYS19OdGlsZGUpIHJldHVybiAiTnRpbGRlIjsKLQlpZiAoayA9PSBYS19PZ3JhdmUpIHJldHVybiAiT2dyYXZlIjsKLQlpZiAoayA9PSBYS19PYWN1dGUpIHJldHVybiAiT2FjdXRlIjsKLQlpZiAoayA9PSBYS19PY2lyY3VtZmxleCkgcmV0dXJuICJPY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfT3RpbGRlKSByZXR1cm4gIk90aWxkZSI7Ci0JaWYgKGsgPT0gWEtfT2RpYWVyZXNpcykgcmV0dXJuICJPZGlhZXJlc2lzIjsKLQlpZiAoayA9PSBYS19tdWx0aXBseSkgcmV0dXJuICJtdWx0aXBseSI7Ci0JaWYgKGsgPT0gWEtfT29ibGlxdWUpIHJldHVybiAiT29ibGlxdWUiOwotCWlmIChrID09IFhLX1VncmF2ZSkgcmV0dXJuICJVZ3JhdmUiOwotCWlmIChrID09IFhLX1VhY3V0ZSkgcmV0dXJuICJVYWN1dGUiOwotCWlmIChrID09IFhLX1VjaXJjdW1mbGV4KSByZXR1cm4gIlVjaXJjdW1mbGV4IjsKLQlpZiAoayA9PSBYS19VZGlhZXJlc2lzKSByZXR1cm4gIlVkaWFlcmVzaXMiOwotCWlmIChrID09IFhLX1lhY3V0ZSkgcmV0dXJuICJZYWN1dGUiOwotCWlmIChrID09IFhLX1RIT1JOKSByZXR1cm4gIlRIT1JOIjsKLQlpZiAoayA9PSBYS19UaG9ybikgcmV0dXJuICJUaG9ybiI7Ci0JaWYgKGsgPT0gWEtfc3NoYXJwKSByZXR1cm4gInNzaGFycCI7Ci0JaWYgKGsgPT0gWEtfYWdyYXZlKSByZXR1cm4gImFncmF2ZSI7Ci0JaWYgKGsgPT0gWEtfYWFjdXRlKSByZXR1cm4gImFhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfYWNpcmN1bWZsZXgpIHJldHVybiAiYWNpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2F0aWxkZSkgcmV0dXJuICJhdGlsZGUiOwotCWlmIChrID09IFhLX2FkaWFlcmVzaXMpIHJldHVybiAiYWRpYWVyZXNpcyI7Ci0JaWYgKGsgPT0gWEtfYXJpbmcpIHJldHVybiAiYXJpbmciOwotCWlmIChrID09IFhLX2FlKSByZXR1cm4gImFlIjsKLQlpZiAoayA9PSBYS19jY2VkaWxsYSkgcmV0dXJuICJjY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfZWdyYXZlKSByZXR1cm4gImVncmF2ZSI7Ci0JaWYgKGsgPT0gWEtfZWFjdXRlKSByZXR1cm4gImVhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfZWNpcmN1bWZsZXgpIHJldHVybiAiZWNpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2VkaWFlcmVzaXMpIHJldHVybiAiZWRpYWVyZXNpcyI7Ci0JaWYgKGsgPT0gWEtfaWdyYXZlKSByZXR1cm4gImlncmF2ZSI7Ci0JaWYgKGsgPT0gWEtfaWFjdXRlKSByZXR1cm4gImlhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfaWNpcmN1bWZsZXgpIHJldHVybiAiaWNpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2lkaWFlcmVzaXMpIHJldHVybiAiaWRpYWVyZXNpcyI7Ci0JaWYgKGsgPT0gWEtfZXRoKSByZXR1cm4gImV0aCI7Ci0JaWYgKGsgPT0gWEtfbnRpbGRlKSByZXR1cm4gIm50aWxkZSI7Ci0JaWYgKGsgPT0gWEtfb2dyYXZlKSByZXR1cm4gIm9ncmF2ZSI7Ci0JaWYgKGsgPT0gWEtfb2FjdXRlKSByZXR1cm4gIm9hY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfb2NpcmN1bWZsZXgpIHJldHVybiAib2NpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX290aWxkZSkgcmV0dXJuICJvdGlsZGUiOwotCWlmIChrID09IFhLX29kaWFlcmVzaXMpIHJldHVybiAib2RpYWVyZXNpcyI7Ci0JaWYgKGsgPT0gWEtfZGl2aXNpb24pIHJldHVybiAiZGl2aXNpb24iOwotCWlmIChrID09IFhLX29zbGFzaCkgcmV0dXJuICJvc2xhc2giOwotCWlmIChrID09IFhLX3VncmF2ZSkgcmV0dXJuICJ1Z3JhdmUiOwotCWlmIChrID09IFhLX3VhY3V0ZSkgcmV0dXJuICJ1YWN1dGUiOwotCWlmIChrID09IFhLX3VjaXJjdW1mbGV4KSByZXR1cm4gInVjaXJjdW1mbGV4IjsKLQlpZiAoayA9PSBYS191ZGlhZXJlc2lzKSByZXR1cm4gInVkaWFlcmVzaXMiOwotCWlmIChrID09IFhLX3lhY3V0ZSkgcmV0dXJuICJ5YWN1dGUiOwotCWlmIChrID09IFhLX3Rob3JuKSByZXR1cm4gInRob3JuIjsKLQlpZiAoayA9PSBYS195ZGlhZXJlc2lzKSByZXR1cm4gInlkaWFlcmVzaXMiOwotI2VuZGlmIC8qIFhLX0xBVElOMSAqLwotI2lmZGVmIFhLX0xBVElOMgotCWlmIChrID09IFhLX0FvZ29uZWspIHJldHVybiAiQW9nb25layI7Ci0JaWYgKGsgPT0gWEtfYnJldmUpIHJldHVybiAiYnJldmUiOwotCWlmIChrID09IFhLX0xzdHJva2UpIHJldHVybiAiTHN0cm9rZSI7Ci0JaWYgKGsgPT0gWEtfTGNhcm9uKSByZXR1cm4gIkxjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfU2FjdXRlKSByZXR1cm4gIlNhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfU2Nhcm9uKSByZXR1cm4gIlNjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfU2NlZGlsbGEpIHJldHVybiAiU2NlZGlsbGEiOwotCWlmIChrID09IFhLX1RjYXJvbikgcmV0dXJuICJUY2Fyb24iOwotCWlmIChrID09IFhLX1phY3V0ZSkgcmV0dXJuICJaYWN1dGUiOwotCWlmIChrID09IFhLX1pjYXJvbikgcmV0dXJuICJaY2Fyb24iOwotCWlmIChrID09IFhLX1phYm92ZWRvdCkgcmV0dXJuICJaYWJvdmVkb3QiOwotCWlmIChrID09IFhLX2FvZ29uZWspIHJldHVybiAiYW9nb25layI7Ci0JaWYgKGsgPT0gWEtfb2dvbmVrKSByZXR1cm4gIm9nb25layI7Ci0JaWYgKGsgPT0gWEtfbHN0cm9rZSkgcmV0dXJuICJsc3Ryb2tlIjsKLQlpZiAoayA9PSBYS19sY2Fyb24pIHJldHVybiAibGNhcm9uIjsKLQlpZiAoayA9PSBYS19zYWN1dGUpIHJldHVybiAic2FjdXRlIjsKLQlpZiAoayA9PSBYS19jYXJvbikgcmV0dXJuICJjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfc2Nhcm9uKSByZXR1cm4gInNjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfc2NlZGlsbGEpIHJldHVybiAic2NlZGlsbGEiOwotCWlmIChrID09IFhLX3RjYXJvbikgcmV0dXJuICJ0Y2Fyb24iOwotCWlmIChrID09IFhLX3phY3V0ZSkgcmV0dXJuICJ6YWN1dGUiOwotCWlmIChrID09IFhLX2RvdWJsZWFjdXRlKSByZXR1cm4gImRvdWJsZWFjdXRlIjsKLQlpZiAoayA9PSBYS196Y2Fyb24pIHJldHVybiAiemNhcm9uIjsKLQlpZiAoayA9PSBYS196YWJvdmVkb3QpIHJldHVybiAiemFib3ZlZG90IjsKLQlpZiAoayA9PSBYS19SYWN1dGUpIHJldHVybiAiUmFjdXRlIjsKLQlpZiAoayA9PSBYS19BYnJldmUpIHJldHVybiAiQWJyZXZlIjsKLQlpZiAoayA9PSBYS19MYWN1dGUpIHJldHVybiAiTGFjdXRlIjsKLQlpZiAoayA9PSBYS19DYWN1dGUpIHJldHVybiAiQ2FjdXRlIjsKLQlpZiAoayA9PSBYS19DY2Fyb24pIHJldHVybiAiQ2Nhcm9uIjsKLQlpZiAoayA9PSBYS19Fb2dvbmVrKSByZXR1cm4gIkVvZ29uZWsiOwotCWlmIChrID09IFhLX0VjYXJvbikgcmV0dXJuICJFY2Fyb24iOwotCWlmIChrID09IFhLX0RjYXJvbikgcmV0dXJuICJEY2Fyb24iOwotCWlmIChrID09IFhLX0RzdHJva2UpIHJldHVybiAiRHN0cm9rZSI7Ci0JaWYgKGsgPT0gWEtfTmFjdXRlKSByZXR1cm4gIk5hY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfTmNhcm9uKSByZXR1cm4gIk5jYXJvbiI7Ci0JaWYgKGsgPT0gWEtfT2RvdWJsZWFjdXRlKSByZXR1cm4gIk9kb3VibGVhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfUmNhcm9uKSByZXR1cm4gIlJjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfVXJpbmcpIHJldHVybiAiVXJpbmciOwotCWlmIChrID09IFhLX1Vkb3VibGVhY3V0ZSkgcmV0dXJuICJVZG91YmxlYWN1dGUiOwotCWlmIChrID09IFhLX1RjZWRpbGxhKSByZXR1cm4gIlRjZWRpbGxhIjsKLQlpZiAoayA9PSBYS19yYWN1dGUpIHJldHVybiAicmFjdXRlIjsKLQlpZiAoayA9PSBYS19hYnJldmUpIHJldHVybiAiYWJyZXZlIjsKLQlpZiAoayA9PSBYS19sYWN1dGUpIHJldHVybiAibGFjdXRlIjsKLQlpZiAoayA9PSBYS19jYWN1dGUpIHJldHVybiAiY2FjdXRlIjsKLQlpZiAoayA9PSBYS19jY2Fyb24pIHJldHVybiAiY2Nhcm9uIjsKLQlpZiAoayA9PSBYS19lb2dvbmVrKSByZXR1cm4gImVvZ29uZWsiOwotCWlmIChrID09IFhLX2VjYXJvbikgcmV0dXJuICJlY2Fyb24iOwotCWlmIChrID09IFhLX2RjYXJvbikgcmV0dXJuICJkY2Fyb24iOwotCWlmIChrID09IFhLX2RzdHJva2UpIHJldHVybiAiZHN0cm9rZSI7Ci0JaWYgKGsgPT0gWEtfbmFjdXRlKSByZXR1cm4gIm5hY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfbmNhcm9uKSByZXR1cm4gIm5jYXJvbiI7Ci0JaWYgKGsgPT0gWEtfb2RvdWJsZWFjdXRlKSByZXR1cm4gIm9kb3VibGVhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfdWRvdWJsZWFjdXRlKSByZXR1cm4gInVkb3VibGVhY3V0ZSI7Ci0JaWYgKGsgPT0gWEtfcmNhcm9uKSByZXR1cm4gInJjYXJvbiI7Ci0JaWYgKGsgPT0gWEtfdXJpbmcpIHJldHVybiAidXJpbmciOwotCWlmIChrID09IFhLX3RjZWRpbGxhKSByZXR1cm4gInRjZWRpbGxhIjsKLQlpZiAoayA9PSBYS19hYm92ZWRvdCkgcmV0dXJuICJhYm92ZWRvdCI7Ci0jZW5kaWYgLyogWEtfTEFUSU4yICovCi0jaWZkZWYgWEtfTEFUSU4zCi0JaWYgKGsgPT0gWEtfSHN0cm9rZSkgcmV0dXJuICJIc3Ryb2tlIjsKLQlpZiAoayA9PSBYS19IY2lyY3VtZmxleCkgcmV0dXJuICJIY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfSWFib3ZlZG90KSByZXR1cm4gIklhYm92ZWRvdCI7Ci0JaWYgKGsgPT0gWEtfR2JyZXZlKSByZXR1cm4gIkdicmV2ZSI7Ci0JaWYgKGsgPT0gWEtfSmNpcmN1bWZsZXgpIHJldHVybiAiSmNpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2hzdHJva2UpIHJldHVybiAiaHN0cm9rZSI7Ci0JaWYgKGsgPT0gWEtfaGNpcmN1bWZsZXgpIHJldHVybiAiaGNpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2lkb3RsZXNzKSByZXR1cm4gImlkb3RsZXNzIjsKLQlpZiAoayA9PSBYS19nYnJldmUpIHJldHVybiAiZ2JyZXZlIjsKLQlpZiAoayA9PSBYS19qY2lyY3VtZmxleCkgcmV0dXJuICJqY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfQ2Fib3ZlZG90KSByZXR1cm4gIkNhYm92ZWRvdCI7Ci0JaWYgKGsgPT0gWEtfQ2NpcmN1bWZsZXgpIHJldHVybiAiQ2NpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX0dhYm92ZWRvdCkgcmV0dXJuICJHYWJvdmVkb3QiOwotCWlmIChrID09IFhLX0djaXJjdW1mbGV4KSByZXR1cm4gIkdjaXJjdW1mbGV4IjsKLQlpZiAoayA9PSBYS19VYnJldmUpIHJldHVybiAiVWJyZXZlIjsKLQlpZiAoayA9PSBYS19TY2lyY3VtZmxleCkgcmV0dXJuICJTY2lyY3VtZmxleCI7Ci0JaWYgKGsgPT0gWEtfY2Fib3ZlZG90KSByZXR1cm4gImNhYm92ZWRvdCI7Ci0JaWYgKGsgPT0gWEtfY2NpcmN1bWZsZXgpIHJldHVybiAiY2NpcmN1bWZsZXgiOwotCWlmIChrID09IFhLX2dhYm92ZWRvdCkgcmV0dXJuICJnYWJvdmVkb3QiOwotCWlmIChrID09IFhLX2djaXJjdW1mbGV4KSByZXR1cm4gImdjaXJjdW1mbGV4IjsKLQlpZiAoayA9PSBYS191YnJldmUpIHJldHVybiAidWJyZXZlIjsKLQlpZiAoayA9PSBYS19zY2lyY3VtZmxleCkgcmV0dXJuICJzY2lyY3VtZmxleCI7Ci0jZW5kaWYgLyogWEtfTEFUSU4zICovCi0jaWZkZWYgWEtfTEFUSU40Ci0JaWYgKGsgPT0gWEtfa3JhKSByZXR1cm4gImtyYSI7Ci0JaWYgKGsgPT0gWEtfa2FwcGEpIHJldHVybiAia2FwcGEiOwotCWlmIChrID09IFhLX1JjZWRpbGxhKSByZXR1cm4gIlJjZWRpbGxhIjsKLQlpZiAoayA9PSBYS19JdGlsZGUpIHJldHVybiAiSXRpbGRlIjsKLQlpZiAoayA9PSBYS19MY2VkaWxsYSkgcmV0dXJuICJMY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfRW1hY3JvbikgcmV0dXJuICJFbWFjcm9uIjsKLQlpZiAoayA9PSBYS19HY2VkaWxsYSkgcmV0dXJuICJHY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfVHNsYXNoKSByZXR1cm4gIlRzbGFzaCI7Ci0JaWYgKGsgPT0gWEtfcmNlZGlsbGEpIHJldHVybiAicmNlZGlsbGEiOwotCWlmIChrID09IFhLX2l0aWxkZSkgcmV0dXJuICJpdGlsZGUiOwotCWlmIChrID09IFhLX2xjZWRpbGxhKSByZXR1cm4gImxjZWRpbGxhIjsKLQlpZiAoayA9PSBYS19lbWFjcm9uKSByZXR1cm4gImVtYWNyb24iOwotCWlmIChrID09IFhLX2djZWRpbGxhKSByZXR1cm4gImdjZWRpbGxhIjsKLQlpZiAoayA9PSBYS190c2xhc2gpIHJldHVybiAidHNsYXNoIjsKLQlpZiAoayA9PSBYS19FTkcpIHJldHVybiAiRU5HIjsKLQlpZiAoayA9PSBYS19lbmcpIHJldHVybiAiZW5nIjsKLQlpZiAoayA9PSBYS19BbWFjcm9uKSByZXR1cm4gIkFtYWNyb24iOwotCWlmIChrID09IFhLX0lvZ29uZWspIHJldHVybiAiSW9nb25layI7Ci0JaWYgKGsgPT0gWEtfRWFib3ZlZG90KSByZXR1cm4gIkVhYm92ZWRvdCI7Ci0JaWYgKGsgPT0gWEtfSW1hY3JvbikgcmV0dXJuICJJbWFjcm9uIjsKLQlpZiAoayA9PSBYS19OY2VkaWxsYSkgcmV0dXJuICJOY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfT21hY3JvbikgcmV0dXJuICJPbWFjcm9uIjsKLQlpZiAoayA9PSBYS19LY2VkaWxsYSkgcmV0dXJuICJLY2VkaWxsYSI7Ci0JaWYgKGsgPT0gWEtfVW9nb25laykgcmV0dXJuICJVb2dvbmVrIjsKLQlpZiAoayA9PSBYS19VdGlsZGUpIHJldHVybiAiVXRpbGRlIjsKLQlpZiAoayA9PSBYS19VbWFjcm9uKSByZXR1cm4gIlVtYWNyb24iOwotCWlmIChrID09IFhLX2FtYWNyb24pIHJldHVybiAiYW1hY3JvbiI7Ci0JaWYgKGsgPT0gWEtfaW9nb25laykgcmV0dXJuICJpb2dvbmVrIjsKLQlpZiAoayA9PSBYS19lYWJvdmVkb3QpIHJldHVybiAiZWFib3ZlZG90IjsKLQlpZiAoayA9PSBYS19pbWFjcm9uKSByZXR1cm4gImltYWNyb24iOwotCWlmIChrID09IFhLX25jZWRpbGxhKSByZXR1cm4gIm5jZWRpbGxhIjsKLQlpZiAoayA9PSBYS19vbWFjcm9uKSByZXR1cm4gIm9tYWNyb24iOwotCWlmIChrID09IFhLX2tjZWRpbGxhKSByZXR1cm4gImtjZWRpbGxhIjsKLQlpZiAoayA9PSBYS191b2dvbmVrKSByZXR1cm4gInVvZ29uZWsiOwotCWlmIChrID09IFhLX3V0aWxkZSkgcmV0dXJuICJ1dGlsZGUiOwotCWlmIChrID09IFhLX3VtYWNyb24pIHJldHVybiAidW1hY3JvbiI7Ci0jZW5kaWYgLyogWEtfTEFUSU40ICovCi0jaWZkZWYgWEtfS0FUQUtBTkEKLQlpZiAoayA9PSBYS19vdmVybGluZSkgcmV0dXJuICJvdmVybGluZSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9mdWxsc3RvcCkgcmV0dXJuICJrYW5hX2Z1bGxzdG9wIjsKLQlpZiAoayA9PSBYS19rYW5hX29wZW5pbmdicmFja2V0KSByZXR1cm4gImthbmFfb3BlbmluZ2JyYWNrZXQiOwotCWlmIChrID09IFhLX2thbmFfY2xvc2luZ2JyYWNrZXQpIHJldHVybiAia2FuYV9jbG9zaW5nYnJhY2tldCI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9jb21tYSkgcmV0dXJuICJrYW5hX2NvbW1hIjsKLQlpZiAoayA9PSBYS19rYW5hX2Nvbmp1bmN0aXZlKSByZXR1cm4gImthbmFfY29uanVuY3RpdmUiOwotCWlmIChrID09IFhLX2thbmFfbWlkZGxlZG90KSByZXR1cm4gImthbmFfbWlkZGxlZG90IjsKLQlpZiAoayA9PSBYS19rYW5hX1dPKSByZXR1cm4gImthbmFfV08iOwotCWlmIChrID09IFhLX2thbmFfYSkgcmV0dXJuICJrYW5hX2EiOwotCWlmIChrID09IFhLX2thbmFfaSkgcmV0dXJuICJrYW5hX2kiOwotCWlmIChrID09IFhLX2thbmFfdSkgcmV0dXJuICJrYW5hX3UiOwotCWlmIChrID09IFhLX2thbmFfZSkgcmV0dXJuICJrYW5hX2UiOwotCWlmIChrID09IFhLX2thbmFfbykgcmV0dXJuICJrYW5hX28iOwotCWlmIChrID09IFhLX2thbmFfeWEpIHJldHVybiAia2FuYV95YSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV95dSkgcmV0dXJuICJrYW5hX3l1IjsKLQlpZiAoayA9PSBYS19rYW5hX3lvKSByZXR1cm4gImthbmFfeW8iOwotCWlmIChrID09IFhLX2thbmFfdHN1KSByZXR1cm4gImthbmFfdHN1IjsKLQlpZiAoayA9PSBYS19rYW5hX3R1KSByZXR1cm4gImthbmFfdHUiOwotCWlmIChrID09IFhLX3Byb2xvbmdlZHNvdW5kKSByZXR1cm4gInByb2xvbmdlZHNvdW5kIjsKLQlpZiAoayA9PSBYS19rYW5hX0EpIHJldHVybiAia2FuYV9BIjsKLQlpZiAoayA9PSBYS19rYW5hX0kpIHJldHVybiAia2FuYV9JIjsKLQlpZiAoayA9PSBYS19rYW5hX1UpIHJldHVybiAia2FuYV9VIjsKLQlpZiAoayA9PSBYS19rYW5hX0UpIHJldHVybiAia2FuYV9FIjsKLQlpZiAoayA9PSBYS19rYW5hX08pIHJldHVybiAia2FuYV9PIjsKLQlpZiAoayA9PSBYS19rYW5hX0tBKSByZXR1cm4gImthbmFfS0EiOwotCWlmIChrID09IFhLX2thbmFfS0kpIHJldHVybiAia2FuYV9LSSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9LVSkgcmV0dXJuICJrYW5hX0tVIjsKLQlpZiAoayA9PSBYS19rYW5hX0tFKSByZXR1cm4gImthbmFfS0UiOwotCWlmIChrID09IFhLX2thbmFfS08pIHJldHVybiAia2FuYV9LTyI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9TQSkgcmV0dXJuICJrYW5hX1NBIjsKLQlpZiAoayA9PSBYS19rYW5hX1NISSkgcmV0dXJuICJrYW5hX1NISSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9TVSkgcmV0dXJuICJrYW5hX1NVIjsKLQlpZiAoayA9PSBYS19rYW5hX1NFKSByZXR1cm4gImthbmFfU0UiOwotCWlmIChrID09IFhLX2thbmFfU08pIHJldHVybiAia2FuYV9TTyI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9UQSkgcmV0dXJuICJrYW5hX1RBIjsKLQlpZiAoayA9PSBYS19rYW5hX0NISSkgcmV0dXJuICJrYW5hX0NISSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9USSkgcmV0dXJuICJrYW5hX1RJIjsKLQlpZiAoayA9PSBYS19rYW5hX1RTVSkgcmV0dXJuICJrYW5hX1RTVSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9UVSkgcmV0dXJuICJrYW5hX1RVIjsKLQlpZiAoayA9PSBYS19rYW5hX1RFKSByZXR1cm4gImthbmFfVEUiOwotCWlmIChrID09IFhLX2thbmFfVE8pIHJldHVybiAia2FuYV9UTyI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9OQSkgcmV0dXJuICJrYW5hX05BIjsKLQlpZiAoayA9PSBYS19rYW5hX05JKSByZXR1cm4gImthbmFfTkkiOwotCWlmIChrID09IFhLX2thbmFfTlUpIHJldHVybiAia2FuYV9OVSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9ORSkgcmV0dXJuICJrYW5hX05FIjsKLQlpZiAoayA9PSBYS19rYW5hX05PKSByZXR1cm4gImthbmFfTk8iOwotCWlmIChrID09IFhLX2thbmFfSEEpIHJldHVybiAia2FuYV9IQSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9ISSkgcmV0dXJuICJrYW5hX0hJIjsKLQlpZiAoayA9PSBYS19rYW5hX0ZVKSByZXR1cm4gImthbmFfRlUiOwotCWlmIChrID09IFhLX2thbmFfSFUpIHJldHVybiAia2FuYV9IVSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9IRSkgcmV0dXJuICJrYW5hX0hFIjsKLQlpZiAoayA9PSBYS19rYW5hX0hPKSByZXR1cm4gImthbmFfSE8iOwotCWlmIChrID09IFhLX2thbmFfTUEpIHJldHVybiAia2FuYV9NQSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9NSSkgcmV0dXJuICJrYW5hX01JIjsKLQlpZiAoayA9PSBYS19rYW5hX01VKSByZXR1cm4gImthbmFfTVUiOwotCWlmIChrID09IFhLX2thbmFfTUUpIHJldHVybiAia2FuYV9NRSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9NTykgcmV0dXJuICJrYW5hX01PIjsKLQlpZiAoayA9PSBYS19rYW5hX1lBKSByZXR1cm4gImthbmFfWUEiOwotCWlmIChrID09IFhLX2thbmFfWVUpIHJldHVybiAia2FuYV9ZVSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9ZTykgcmV0dXJuICJrYW5hX1lPIjsKLQlpZiAoayA9PSBYS19rYW5hX1JBKSByZXR1cm4gImthbmFfUkEiOwotCWlmIChrID09IFhLX2thbmFfUkkpIHJldHVybiAia2FuYV9SSSI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9SVSkgcmV0dXJuICJrYW5hX1JVIjsKLQlpZiAoayA9PSBYS19rYW5hX1JFKSByZXR1cm4gImthbmFfUkUiOwotCWlmIChrID09IFhLX2thbmFfUk8pIHJldHVybiAia2FuYV9STyI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9XQSkgcmV0dXJuICJrYW5hX1dBIjsKLQlpZiAoayA9PSBYS19rYW5hX04pIHJldHVybiAia2FuYV9OIjsKLQlpZiAoayA9PSBYS192b2ljZWRzb3VuZCkgcmV0dXJuICJ2b2ljZWRzb3VuZCI7Ci0JaWYgKGsgPT0gWEtfc2VtaXZvaWNlZHNvdW5kKSByZXR1cm4gInNlbWl2b2ljZWRzb3VuZCI7Ci0JaWYgKGsgPT0gWEtfa2FuYV9zd2l0Y2gpIHJldHVybiAia2FuYV9zd2l0Y2giOwotI2VuZGlmIC8qIFhLX0tBVEFLQU5BICovCi0jaWZkZWYgWEtfQVJBQklDCi0JaWYgKGsgPT0gWEtfQXJhYmljX2NvbW1hKSByZXR1cm4gIkFyYWJpY19jb21tYSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3NlbWljb2xvbikgcmV0dXJuICJBcmFiaWNfc2VtaWNvbG9uIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfcXVlc3Rpb25fbWFyaykgcmV0dXJuICJBcmFiaWNfcXVlc3Rpb25fbWFyayI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2hhbXphKSByZXR1cm4gIkFyYWJpY19oYW16YSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX21hZGRhb25hbGVmKSByZXR1cm4gIkFyYWJpY19tYWRkYW9uYWxlZiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2hhbXphb25hbGVmKSByZXR1cm4gIkFyYWJpY19oYW16YW9uYWxlZiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2hhbXphb253YXcpIHJldHVybiAiQXJhYmljX2hhbXphb253YXciOwotCWlmIChrID09IFhLX0FyYWJpY19oYW16YXVuZGVyYWxlZikgcmV0dXJuICJBcmFiaWNfaGFtemF1bmRlcmFsZWYiOwotCWlmIChrID09IFhLX0FyYWJpY19oYW16YW9ueWVoKSByZXR1cm4gIkFyYWJpY19oYW16YW9ueWVoIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfYWxlZikgcmV0dXJuICJBcmFiaWNfYWxlZiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2JlaCkgcmV0dXJuICJBcmFiaWNfYmVoIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfdGVobWFyYnV0YSkgcmV0dXJuICJBcmFiaWNfdGVobWFyYnV0YSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3RlaCkgcmV0dXJuICJBcmFiaWNfdGVoIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfdGhlaCkgcmV0dXJuICJBcmFiaWNfdGhlaCI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2plZW0pIHJldHVybiAiQXJhYmljX2plZW0iOwotCWlmIChrID09IFhLX0FyYWJpY19oYWgpIHJldHVybiAiQXJhYmljX2hhaCI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2toYWgpIHJldHVybiAiQXJhYmljX2toYWgiOwotCWlmIChrID09IFhLX0FyYWJpY19kYWwpIHJldHVybiAiQXJhYmljX2RhbCI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3RoYWwpIHJldHVybiAiQXJhYmljX3RoYWwiOwotCWlmIChrID09IFhLX0FyYWJpY19yYSkgcmV0dXJuICJBcmFiaWNfcmEiOwotCWlmIChrID09IFhLX0FyYWJpY196YWluKSByZXR1cm4gIkFyYWJpY196YWluIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfc2VlbikgcmV0dXJuICJBcmFiaWNfc2VlbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3NoZWVuKSByZXR1cm4gIkFyYWJpY19zaGVlbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3NhZCkgcmV0dXJuICJBcmFiaWNfc2FkIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfZGFkKSByZXR1cm4gIkFyYWJpY19kYWQiOwotCWlmIChrID09IFhLX0FyYWJpY190YWgpIHJldHVybiAiQXJhYmljX3RhaCI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3phaCkgcmV0dXJuICJBcmFiaWNfemFoIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfYWluKSByZXR1cm4gIkFyYWJpY19haW4iOwotCWlmIChrID09IFhLX0FyYWJpY19naGFpbikgcmV0dXJuICJBcmFiaWNfZ2hhaW4iOwotCWlmIChrID09IFhLX0FyYWJpY190YXR3ZWVsKSByZXR1cm4gIkFyYWJpY190YXR3ZWVsIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfZmVoKSByZXR1cm4gIkFyYWJpY19mZWgiOwotCWlmIChrID09IFhLX0FyYWJpY19xYWYpIHJldHVybiAiQXJhYmljX3FhZiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2thZikgcmV0dXJuICJBcmFiaWNfa2FmIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfbGFtKSByZXR1cm4gIkFyYWJpY19sYW0iOwotCWlmIChrID09IFhLX0FyYWJpY19tZWVtKSByZXR1cm4gIkFyYWJpY19tZWVtIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfbm9vbikgcmV0dXJuICJBcmFiaWNfbm9vbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2hhKSByZXR1cm4gIkFyYWJpY19oYSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2hlaCkgcmV0dXJuICJBcmFiaWNfaGVoIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfd2F3KSByZXR1cm4gIkFyYWJpY193YXciOwotCWlmIChrID09IFhLX0FyYWJpY19hbGVmbWFrc3VyYSkgcmV0dXJuICJBcmFiaWNfYWxlZm1ha3N1cmEiOwotCWlmIChrID09IFhLX0FyYWJpY195ZWgpIHJldHVybiAiQXJhYmljX3llaCI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2ZhdGhhdGFuKSByZXR1cm4gIkFyYWJpY19mYXRoYXRhbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2RhbW1hdGFuKSByZXR1cm4gIkFyYWJpY19kYW1tYXRhbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2thc3JhdGFuKSByZXR1cm4gIkFyYWJpY19rYXNyYXRhbiI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2ZhdGhhKSByZXR1cm4gIkFyYWJpY19mYXRoYSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2RhbW1hKSByZXR1cm4gIkFyYWJpY19kYW1tYSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX2thc3JhKSByZXR1cm4gIkFyYWJpY19rYXNyYSI7Ci0JaWYgKGsgPT0gWEtfQXJhYmljX3NoYWRkYSkgcmV0dXJuICJBcmFiaWNfc2hhZGRhIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfc3VrdW4pIHJldHVybiAiQXJhYmljX3N1a3VuIjsKLQlpZiAoayA9PSBYS19BcmFiaWNfc3dpdGNoKSByZXR1cm4gIkFyYWJpY19zd2l0Y2giOwotI2VuZGlmIC8qIFhLX0FSQUJJQyAqLwotI2lmZGVmIFhLX0NZUklMTElDCi0JaWYgKGsgPT0gWEtfU2VyYmlhbl9kamUpIHJldHVybiAiU2VyYmlhbl9kamUiOwotCWlmIChrID09IFhLX01hY2Vkb25pYV9namUpIHJldHVybiAiTWFjZWRvbmlhX2dqZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfaW8pIHJldHVybiAiQ3lyaWxsaWNfaW8iOwotCWlmIChrID09IFhLX1VrcmFpbmlhbl9pZSkgcmV0dXJuICJVa3JhaW5pYW5faWUiOwotCWlmIChrID09IFhLX1VrcmFuaWFuX2plKSByZXR1cm4gIlVrcmFuaWFuX2plIjsKLQlpZiAoayA9PSBYS19NYWNlZG9uaWFfZHNlKSByZXR1cm4gIk1hY2Vkb25pYV9kc2UiOwotCWlmIChrID09IFhLX1VrcmFpbmlhbl9pKSByZXR1cm4gIlVrcmFpbmlhbl9pIjsKLQlpZiAoayA9PSBYS19Va3Jhbmlhbl9pKSByZXR1cm4gIlVrcmFuaWFuX2kiOwotCWlmIChrID09IFhLX1VrcmFpbmlhbl95aSkgcmV0dXJuICJVa3JhaW5pYW5feWkiOwotCWlmIChrID09IFhLX1VrcmFuaWFuX3lpKSByZXR1cm4gIlVrcmFuaWFuX3lpIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19qZSkgcmV0dXJuICJDeXJpbGxpY19qZSI7Ci0JaWYgKGsgPT0gWEtfU2VyYmlhbl9qZSkgcmV0dXJuICJTZXJiaWFuX2plIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19samUpIHJldHVybiAiQ3lyaWxsaWNfbGplIjsKLQlpZiAoayA9PSBYS19TZXJiaWFuX2xqZSkgcmV0dXJuICJTZXJiaWFuX2xqZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfbmplKSByZXR1cm4gIkN5cmlsbGljX25qZSI7Ci0JaWYgKGsgPT0gWEtfU2VyYmlhbl9uamUpIHJldHVybiAiU2VyYmlhbl9uamUiOwotCWlmIChrID09IFhLX1NlcmJpYW5fdHNoZSkgcmV0dXJuICJTZXJiaWFuX3RzaGUiOwotCWlmIChrID09IFhLX01hY2Vkb25pYV9ramUpIHJldHVybiAiTWFjZWRvbmlhX2tqZSI7Ci0JaWYgKGsgPT0gWEtfQnllbG9ydXNzaWFuX3Nob3J0dSkgcmV0dXJuICJCeWVsb3J1c3NpYW5fc2hvcnR1IjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19kemhlKSByZXR1cm4gIkN5cmlsbGljX2R6aGUiOwotCWlmIChrID09IFhLX1NlcmJpYW5fZHplKSByZXR1cm4gIlNlcmJpYW5fZHplIjsKLQlpZiAoayA9PSBYS19udW1lcm9zaWduKSByZXR1cm4gIm51bWVyb3NpZ24iOwotCWlmIChrID09IFhLX1NlcmJpYW5fREpFKSByZXR1cm4gIlNlcmJpYW5fREpFIjsKLQlpZiAoayA9PSBYS19NYWNlZG9uaWFfR0pFKSByZXR1cm4gIk1hY2Vkb25pYV9HSkUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX0lPKSByZXR1cm4gIkN5cmlsbGljX0lPIjsKLQlpZiAoayA9PSBYS19Va3JhaW5pYW5fSUUpIHJldHVybiAiVWtyYWluaWFuX0lFIjsKLQlpZiAoayA9PSBYS19Va3Jhbmlhbl9KRSkgcmV0dXJuICJVa3Jhbmlhbl9KRSI7Ci0JaWYgKGsgPT0gWEtfTWFjZWRvbmlhX0RTRSkgcmV0dXJuICJNYWNlZG9uaWFfRFNFIjsKLQlpZiAoayA9PSBYS19Va3JhaW5pYW5fSSkgcmV0dXJuICJVa3JhaW5pYW5fSSI7Ci0JaWYgKGsgPT0gWEtfVWtyYW5pYW5fSSkgcmV0dXJuICJVa3Jhbmlhbl9JIjsKLQlpZiAoayA9PSBYS19Va3JhaW5pYW5fWUkpIHJldHVybiAiVWtyYWluaWFuX1lJIjsKLQlpZiAoayA9PSBYS19Va3Jhbmlhbl9ZSSkgcmV0dXJuICJVa3Jhbmlhbl9ZSSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfSkUpIHJldHVybiAiQ3lyaWxsaWNfSkUiOwotCWlmIChrID09IFhLX1NlcmJpYW5fSkUpIHJldHVybiAiU2VyYmlhbl9KRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfTEpFKSByZXR1cm4gIkN5cmlsbGljX0xKRSI7Ci0JaWYgKGsgPT0gWEtfU2VyYmlhbl9MSkUpIHJldHVybiAiU2VyYmlhbl9MSkUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX05KRSkgcmV0dXJuICJDeXJpbGxpY19OSkUiOwotCWlmIChrID09IFhLX1NlcmJpYW5fTkpFKSByZXR1cm4gIlNlcmJpYW5fTkpFIjsKLQlpZiAoayA9PSBYS19TZXJiaWFuX1RTSEUpIHJldHVybiAiU2VyYmlhbl9UU0hFIjsKLQlpZiAoayA9PSBYS19NYWNlZG9uaWFfS0pFKSByZXR1cm4gIk1hY2Vkb25pYV9LSkUiOwotCWlmIChrID09IFhLX0J5ZWxvcnVzc2lhbl9TSE9SVFUpIHJldHVybiAiQnllbG9ydXNzaWFuX1NIT1JUVSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfRFpIRSkgcmV0dXJuICJDeXJpbGxpY19EWkhFIjsKLQlpZiAoayA9PSBYS19TZXJiaWFuX0RaRSkgcmV0dXJuICJTZXJiaWFuX0RaRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfeXUpIHJldHVybiAiQ3lyaWxsaWNfeXUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2EpIHJldHVybiAiQ3lyaWxsaWNfYSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfYmUpIHJldHVybiAiQ3lyaWxsaWNfYmUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX3RzZSkgcmV0dXJuICJDeXJpbGxpY190c2UiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2RlKSByZXR1cm4gIkN5cmlsbGljX2RlIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19pZSkgcmV0dXJuICJDeXJpbGxpY19pZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfZWYpIHJldHVybiAiQ3lyaWxsaWNfZWYiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2doZSkgcmV0dXJuICJDeXJpbGxpY19naGUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2hhKSByZXR1cm4gIkN5cmlsbGljX2hhIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19pKSByZXR1cm4gIkN5cmlsbGljX2kiOwotCWlmIChrID09IFhLX0N5cmlsbGljX3Nob3J0aSkgcmV0dXJuICJDeXJpbGxpY19zaG9ydGkiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2thKSByZXR1cm4gIkN5cmlsbGljX2thIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19lbCkgcmV0dXJuICJDeXJpbGxpY19lbCI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfZW0pIHJldHVybiAiQ3lyaWxsaWNfZW0iOwotCWlmIChrID09IFhLX0N5cmlsbGljX2VuKSByZXR1cm4gIkN5cmlsbGljX2VuIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19vKSByZXR1cm4gIkN5cmlsbGljX28iOwotCWlmIChrID09IFhLX0N5cmlsbGljX3BlKSByZXR1cm4gIkN5cmlsbGljX3BlIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY195YSkgcmV0dXJuICJDeXJpbGxpY195YSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfZXIpIHJldHVybiAiQ3lyaWxsaWNfZXIiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2VzKSByZXR1cm4gIkN5cmlsbGljX2VzIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY190ZSkgcmV0dXJuICJDeXJpbGxpY190ZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfdSkgcmV0dXJuICJDeXJpbGxpY191IjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY196aGUpIHJldHVybiAiQ3lyaWxsaWNfemhlIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY192ZSkgcmV0dXJuICJDeXJpbGxpY192ZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfc29mdHNpZ24pIHJldHVybiAiQ3lyaWxsaWNfc29mdHNpZ24iOwotCWlmIChrID09IFhLX0N5cmlsbGljX3llcnUpIHJldHVybiAiQ3lyaWxsaWNfeWVydSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfemUpIHJldHVybiAiQ3lyaWxsaWNfemUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX3NoYSkgcmV0dXJuICJDeXJpbGxpY19zaGEiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2UpIHJldHVybiAiQ3lyaWxsaWNfZSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfc2hjaGEpIHJldHVybiAiQ3lyaWxsaWNfc2hjaGEiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2NoZSkgcmV0dXJuICJDeXJpbGxpY19jaGUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX2hhcmRzaWduKSByZXR1cm4gIkN5cmlsbGljX2hhcmRzaWduIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19ZVSkgcmV0dXJuICJDeXJpbGxpY19ZVSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfQSkgcmV0dXJuICJDeXJpbGxpY19BIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19CRSkgcmV0dXJuICJDeXJpbGxpY19CRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfVFNFKSByZXR1cm4gIkN5cmlsbGljX1RTRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfREUpIHJldHVybiAiQ3lyaWxsaWNfREUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX0lFKSByZXR1cm4gIkN5cmlsbGljX0lFIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19FRikgcmV0dXJuICJDeXJpbGxpY19FRiI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfR0hFKSByZXR1cm4gIkN5cmlsbGljX0dIRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfSEEpIHJldHVybiAiQ3lyaWxsaWNfSEEiOwotCWlmIChrID09IFhLX0N5cmlsbGljX0kpIHJldHVybiAiQ3lyaWxsaWNfSSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfU0hPUlRJKSByZXR1cm4gIkN5cmlsbGljX1NIT1JUSSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfS0EpIHJldHVybiAiQ3lyaWxsaWNfS0EiOwotCWlmIChrID09IFhLX0N5cmlsbGljX0VMKSByZXR1cm4gIkN5cmlsbGljX0VMIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19FTSkgcmV0dXJuICJDeXJpbGxpY19FTSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfRU4pIHJldHVybiAiQ3lyaWxsaWNfRU4iOwotCWlmIChrID09IFhLX0N5cmlsbGljX08pIHJldHVybiAiQ3lyaWxsaWNfTyI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfUEUpIHJldHVybiAiQ3lyaWxsaWNfUEUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX1lBKSByZXR1cm4gIkN5cmlsbGljX1lBIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19FUikgcmV0dXJuICJDeXJpbGxpY19FUiI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfRVMpIHJldHVybiAiQ3lyaWxsaWNfRVMiOwotCWlmIChrID09IFhLX0N5cmlsbGljX1RFKSByZXR1cm4gIkN5cmlsbGljX1RFIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19VKSByZXR1cm4gIkN5cmlsbGljX1UiOwotCWlmIChrID09IFhLX0N5cmlsbGljX1pIRSkgcmV0dXJuICJDeXJpbGxpY19aSEUiOwotCWlmIChrID09IFhLX0N5cmlsbGljX1ZFKSByZXR1cm4gIkN5cmlsbGljX1ZFIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19TT0ZUU0lHTikgcmV0dXJuICJDeXJpbGxpY19TT0ZUU0lHTiI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfWUVSVSkgcmV0dXJuICJDeXJpbGxpY19ZRVJVIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19aRSkgcmV0dXJuICJDeXJpbGxpY19aRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfU0hBKSByZXR1cm4gIkN5cmlsbGljX1NIQSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfRSkgcmV0dXJuICJDeXJpbGxpY19FIjsKLQlpZiAoayA9PSBYS19DeXJpbGxpY19TSENIQSkgcmV0dXJuICJDeXJpbGxpY19TSENIQSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfQ0hFKSByZXR1cm4gIkN5cmlsbGljX0NIRSI7Ci0JaWYgKGsgPT0gWEtfQ3lyaWxsaWNfSEFSRFNJR04pIHJldHVybiAiQ3lyaWxsaWNfSEFSRFNJR04iOwotI2VuZGlmIC8qIFhLX0NZUklMTElDICovCi0jaWZkZWYgWEtfR1JFRUsKLQlpZiAoayA9PSBYS19HcmVla19BTFBIQWFjY2VudCkgcmV0dXJuICJHcmVla19BTFBIQWFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfRVBTSUxPTmFjY2VudCkgcmV0dXJuICJHcmVla19FUFNJTE9OYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla19FVEFhY2NlbnQpIHJldHVybiAiR3JlZWtfRVRBYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla19JT1RBYWNjZW50KSByZXR1cm4gIkdyZWVrX0lPVEFhY2NlbnQiOwotCWlmIChrID09IFhLX0dyZWVrX0lPVEFkaWVyZXNpcykgcmV0dXJuICJHcmVla19JT1RBZGllcmVzaXMiOwotCWlmIChrID09IFhLX0dyZWVrX09NSUNST05hY2NlbnQpIHJldHVybiAiR3JlZWtfT01JQ1JPTmFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfVVBTSUxPTmFjY2VudCkgcmV0dXJuICJHcmVla19VUFNJTE9OYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla19VUFNJTE9OZGllcmVzaXMpIHJldHVybiAiR3JlZWtfVVBTSUxPTmRpZXJlc2lzIjsKLQlpZiAoayA9PSBYS19HcmVla19PTUVHQWFjY2VudCkgcmV0dXJuICJHcmVla19PTUVHQWFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfYWNjZW50ZGllcmVzaXMpIHJldHVybiAiR3JlZWtfYWNjZW50ZGllcmVzaXMiOwotCWlmIChrID09IFhLX0dyZWVrX2hvcml6YmFyKSByZXR1cm4gIkdyZWVrX2hvcml6YmFyIjsKLQlpZiAoayA9PSBYS19HcmVla19hbHBoYWFjY2VudCkgcmV0dXJuICJHcmVla19hbHBoYWFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfZXBzaWxvbmFjY2VudCkgcmV0dXJuICJHcmVla19lcHNpbG9uYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla19ldGFhY2NlbnQpIHJldHVybiAiR3JlZWtfZXRhYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla19pb3RhYWNjZW50KSByZXR1cm4gIkdyZWVrX2lvdGFhY2NlbnQiOwotCWlmIChrID09IFhLX0dyZWVrX2lvdGFkaWVyZXNpcykgcmV0dXJuICJHcmVla19pb3RhZGllcmVzaXMiOwotCWlmIChrID09IFhLX0dyZWVrX2lvdGFhY2NlbnRkaWVyZXNpcykgcmV0dXJuICJHcmVla19pb3RhYWNjZW50ZGllcmVzaXMiOwotCWlmIChrID09IFhLX0dyZWVrX29taWNyb25hY2NlbnQpIHJldHVybiAiR3JlZWtfb21pY3JvbmFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfdXBzaWxvbmFjY2VudCkgcmV0dXJuICJHcmVla191cHNpbG9uYWNjZW50IjsKLQlpZiAoayA9PSBYS19HcmVla191cHNpbG9uZGllcmVzaXMpIHJldHVybiAiR3JlZWtfdXBzaWxvbmRpZXJlc2lzIjsKLQlpZiAoayA9PSBYS19HcmVla191cHNpbG9uYWNjZW50ZGllcmVzaXMpIHJldHVybiAiR3JlZWtfdXBzaWxvbmFjY2VudGRpZXJlc2lzIjsKLQlpZiAoayA9PSBYS19HcmVla19vbWVnYWFjY2VudCkgcmV0dXJuICJHcmVla19vbWVnYWFjY2VudCI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfQUxQSEEpIHJldHVybiAiR3JlZWtfQUxQSEEiOwotCWlmIChrID09IFhLX0dyZWVrX0JFVEEpIHJldHVybiAiR3JlZWtfQkVUQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfR0FNTUEpIHJldHVybiAiR3JlZWtfR0FNTUEiOwotCWlmIChrID09IFhLX0dyZWVrX0RFTFRBKSByZXR1cm4gIkdyZWVrX0RFTFRBIjsKLQlpZiAoayA9PSBYS19HcmVla19FUFNJTE9OKSByZXR1cm4gIkdyZWVrX0VQU0lMT04iOwotCWlmIChrID09IFhLX0dyZWVrX1pFVEEpIHJldHVybiAiR3JlZWtfWkVUQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfRVRBKSByZXR1cm4gIkdyZWVrX0VUQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfVEhFVEEpIHJldHVybiAiR3JlZWtfVEhFVEEiOwotCWlmIChrID09IFhLX0dyZWVrX0lPVEEpIHJldHVybiAiR3JlZWtfSU9UQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfS0FQUEEpIHJldHVybiAiR3JlZWtfS0FQUEEiOwotCWlmIChrID09IFhLX0dyZWVrX0xBTURBKSByZXR1cm4gIkdyZWVrX0xBTURBIjsKLQlpZiAoayA9PSBYS19HcmVla19MQU1CREEpIHJldHVybiAiR3JlZWtfTEFNQkRBIjsKLQlpZiAoayA9PSBYS19HcmVla19NVSkgcmV0dXJuICJHcmVla19NVSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfTlUpIHJldHVybiAiR3JlZWtfTlUiOwotCWlmIChrID09IFhLX0dyZWVrX1hJKSByZXR1cm4gIkdyZWVrX1hJIjsKLQlpZiAoayA9PSBYS19HcmVla19PTUlDUk9OKSByZXR1cm4gIkdyZWVrX09NSUNST04iOwotCWlmIChrID09IFhLX0dyZWVrX1BJKSByZXR1cm4gIkdyZWVrX1BJIjsKLQlpZiAoayA9PSBYS19HcmVla19SSE8pIHJldHVybiAiR3JlZWtfUkhPIjsKLQlpZiAoayA9PSBYS19HcmVla19TSUdNQSkgcmV0dXJuICJHcmVla19TSUdNQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfVEFVKSByZXR1cm4gIkdyZWVrX1RBVSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfVVBTSUxPTikgcmV0dXJuICJHcmVla19VUFNJTE9OIjsKLQlpZiAoayA9PSBYS19HcmVla19QSEkpIHJldHVybiAiR3JlZWtfUEhJIjsKLQlpZiAoayA9PSBYS19HcmVla19DSEkpIHJldHVybiAiR3JlZWtfQ0hJIjsKLQlpZiAoayA9PSBYS19HcmVla19QU0kpIHJldHVybiAiR3JlZWtfUFNJIjsKLQlpZiAoayA9PSBYS19HcmVla19PTUVHQSkgcmV0dXJuICJHcmVla19PTUVHQSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfYWxwaGEpIHJldHVybiAiR3JlZWtfYWxwaGEiOwotCWlmIChrID09IFhLX0dyZWVrX2JldGEpIHJldHVybiAiR3JlZWtfYmV0YSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfZ2FtbWEpIHJldHVybiAiR3JlZWtfZ2FtbWEiOwotCWlmIChrID09IFhLX0dyZWVrX2RlbHRhKSByZXR1cm4gIkdyZWVrX2RlbHRhIjsKLQlpZiAoayA9PSBYS19HcmVla19lcHNpbG9uKSByZXR1cm4gIkdyZWVrX2Vwc2lsb24iOwotCWlmIChrID09IFhLX0dyZWVrX3pldGEpIHJldHVybiAiR3JlZWtfemV0YSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfZXRhKSByZXR1cm4gIkdyZWVrX2V0YSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfdGhldGEpIHJldHVybiAiR3JlZWtfdGhldGEiOwotCWlmIChrID09IFhLX0dyZWVrX2lvdGEpIHJldHVybiAiR3JlZWtfaW90YSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfa2FwcGEpIHJldHVybiAiR3JlZWtfa2FwcGEiOwotCWlmIChrID09IFhLX0dyZWVrX2xhbWRhKSByZXR1cm4gIkdyZWVrX2xhbWRhIjsKLQlpZiAoayA9PSBYS19HcmVla19sYW1iZGEpIHJldHVybiAiR3JlZWtfbGFtYmRhIjsKLQlpZiAoayA9PSBYS19HcmVla19tdSkgcmV0dXJuICJHcmVla19tdSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfbnUpIHJldHVybiAiR3JlZWtfbnUiOwotCWlmIChrID09IFhLX0dyZWVrX3hpKSByZXR1cm4gIkdyZWVrX3hpIjsKLQlpZiAoayA9PSBYS19HcmVla19vbWljcm9uKSByZXR1cm4gIkdyZWVrX29taWNyb24iOwotCWlmIChrID09IFhLX0dyZWVrX3BpKSByZXR1cm4gIkdyZWVrX3BpIjsKLQlpZiAoayA9PSBYS19HcmVla19yaG8pIHJldHVybiAiR3JlZWtfcmhvIjsKLQlpZiAoayA9PSBYS19HcmVla19zaWdtYSkgcmV0dXJuICJHcmVla19zaWdtYSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfZmluYWxzbWFsbHNpZ21hKSByZXR1cm4gIkdyZWVrX2ZpbmFsc21hbGxzaWdtYSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfdGF1KSByZXR1cm4gIkdyZWVrX3RhdSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfdXBzaWxvbikgcmV0dXJuICJHcmVla191cHNpbG9uIjsKLQlpZiAoayA9PSBYS19HcmVla19waGkpIHJldHVybiAiR3JlZWtfcGhpIjsKLQlpZiAoayA9PSBYS19HcmVla19jaGkpIHJldHVybiAiR3JlZWtfY2hpIjsKLQlpZiAoayA9PSBYS19HcmVla19wc2kpIHJldHVybiAiR3JlZWtfcHNpIjsKLQlpZiAoayA9PSBYS19HcmVla19vbWVnYSkgcmV0dXJuICJHcmVla19vbWVnYSI7Ci0JaWYgKGsgPT0gWEtfR3JlZWtfc3dpdGNoKSByZXR1cm4gIkdyZWVrX3N3aXRjaCI7Ci0jZW5kaWYgLyogWEtfR1JFRUsgKi8KLSNpZmRlZiBYS19URUNITklDQUwKLQlpZiAoayA9PSBYS19sZWZ0cmFkaWNhbCkgcmV0dXJuICJsZWZ0cmFkaWNhbCI7Ci0JaWYgKGsgPT0gWEtfdG9wbGVmdHJhZGljYWwpIHJldHVybiAidG9wbGVmdHJhZGljYWwiOwotCWlmIChrID09IFhLX2hvcml6Y29ubmVjdG9yKSByZXR1cm4gImhvcml6Y29ubmVjdG9yIjsKLQlpZiAoayA9PSBYS190b3BpbnRlZ3JhbCkgcmV0dXJuICJ0b3BpbnRlZ3JhbCI7Ci0JaWYgKGsgPT0gWEtfYm90aW50ZWdyYWwpIHJldHVybiAiYm90aW50ZWdyYWwiOwotCWlmIChrID09IFhLX3ZlcnRjb25uZWN0b3IpIHJldHVybiAidmVydGNvbm5lY3RvciI7Ci0JaWYgKGsgPT0gWEtfdG9wbGVmdHNxYnJhY2tldCkgcmV0dXJuICJ0b3BsZWZ0c3FicmFja2V0IjsKLQlpZiAoayA9PSBYS19ib3RsZWZ0c3FicmFja2V0KSByZXR1cm4gImJvdGxlZnRzcWJyYWNrZXQiOwotCWlmIChrID09IFhLX3RvcHJpZ2h0c3FicmFja2V0KSByZXR1cm4gInRvcHJpZ2h0c3FicmFja2V0IjsKLQlpZiAoayA9PSBYS19ib3RyaWdodHNxYnJhY2tldCkgcmV0dXJuICJib3RyaWdodHNxYnJhY2tldCI7Ci0JaWYgKGsgPT0gWEtfdG9wbGVmdHBhcmVucykgcmV0dXJuICJ0b3BsZWZ0cGFyZW5zIjsKLQlpZiAoayA9PSBYS19ib3RsZWZ0cGFyZW5zKSByZXR1cm4gImJvdGxlZnRwYXJlbnMiOwotCWlmIChrID09IFhLX3RvcHJpZ2h0cGFyZW5zKSByZXR1cm4gInRvcHJpZ2h0cGFyZW5zIjsKLQlpZiAoayA9PSBYS19ib3RyaWdodHBhcmVucykgcmV0dXJuICJib3RyaWdodHBhcmVucyI7Ci0JaWYgKGsgPT0gWEtfbGVmdG1pZGRsZWN1cmx5YnJhY2UpIHJldHVybiAibGVmdG1pZGRsZWN1cmx5YnJhY2UiOwotCWlmIChrID09IFhLX3JpZ2h0bWlkZGxlY3VybHlicmFjZSkgcmV0dXJuICJyaWdodG1pZGRsZWN1cmx5YnJhY2UiOwotCWlmIChrID09IFhLX3RvcGxlZnRzdW1tYXRpb24pIHJldHVybiAidG9wbGVmdHN1bW1hdGlvbiI7Ci0JaWYgKGsgPT0gWEtfYm90bGVmdHN1bW1hdGlvbikgcmV0dXJuICJib3RsZWZ0c3VtbWF0aW9uIjsKLQlpZiAoayA9PSBYS190b3B2ZXJ0c3VtbWF0aW9uY29ubmVjdG9yKSByZXR1cm4gInRvcHZlcnRzdW1tYXRpb25jb25uZWN0b3IiOwotCWlmIChrID09IFhLX2JvdHZlcnRzdW1tYXRpb25jb25uZWN0b3IpIHJldHVybiAiYm90dmVydHN1bW1hdGlvbmNvbm5lY3RvciI7Ci0JaWYgKGsgPT0gWEtfdG9wcmlnaHRzdW1tYXRpb24pIHJldHVybiAidG9wcmlnaHRzdW1tYXRpb24iOwotCWlmIChrID09IFhLX2JvdHJpZ2h0c3VtbWF0aW9uKSByZXR1cm4gImJvdHJpZ2h0c3VtbWF0aW9uIjsKLQlpZiAoayA9PSBYS19yaWdodG1pZGRsZXN1bW1hdGlvbikgcmV0dXJuICJyaWdodG1pZGRsZXN1bW1hdGlvbiI7Ci0JaWYgKGsgPT0gWEtfbGVzc3RoYW5lcXVhbCkgcmV0dXJuICJsZXNzdGhhbmVxdWFsIjsKLQlpZiAoayA9PSBYS19ub3RlcXVhbCkgcmV0dXJuICJub3RlcXVhbCI7Ci0JaWYgKGsgPT0gWEtfZ3JlYXRlcnRoYW5lcXVhbCkgcmV0dXJuICJncmVhdGVydGhhbmVxdWFsIjsKLQlpZiAoayA9PSBYS19pbnRlZ3JhbCkgcmV0dXJuICJpbnRlZ3JhbCI7Ci0JaWYgKGsgPT0gWEtfdGhlcmVmb3JlKSByZXR1cm4gInRoZXJlZm9yZSI7Ci0JaWYgKGsgPT0gWEtfdmFyaWF0aW9uKSByZXR1cm4gInZhcmlhdGlvbiI7Ci0JaWYgKGsgPT0gWEtfaW5maW5pdHkpIHJldHVybiAiaW5maW5pdHkiOwotCWlmIChrID09IFhLX25hYmxhKSByZXR1cm4gIm5hYmxhIjsKLQlpZiAoayA9PSBYS19hcHByb3hpbWF0ZSkgcmV0dXJuICJhcHByb3hpbWF0ZSI7Ci0JaWYgKGsgPT0gWEtfc2ltaWxhcmVxdWFsKSByZXR1cm4gInNpbWlsYXJlcXVhbCI7Ci0JaWYgKGsgPT0gWEtfaWZvbmx5aWYpIHJldHVybiAiaWZvbmx5aWYiOwotCWlmIChrID09IFhLX2ltcGxpZXMpIHJldHVybiAiaW1wbGllcyI7Ci0JaWYgKGsgPT0gWEtfaWRlbnRpY2FsKSByZXR1cm4gImlkZW50aWNhbCI7Ci0JaWYgKGsgPT0gWEtfcmFkaWNhbCkgcmV0dXJuICJyYWRpY2FsIjsKLQlpZiAoayA9PSBYS19pbmNsdWRlZGluKSByZXR1cm4gImluY2x1ZGVkaW4iOwotCWlmIChrID09IFhLX2luY2x1ZGVzKSByZXR1cm4gImluY2x1ZGVzIjsKLQlpZiAoayA9PSBYS19pbnRlcnNlY3Rpb24pIHJldHVybiAiaW50ZXJzZWN0aW9uIjsKLQlpZiAoayA9PSBYS191bmlvbikgcmV0dXJuICJ1bmlvbiI7Ci0JaWYgKGsgPT0gWEtfbG9naWNhbGFuZCkgcmV0dXJuICJsb2dpY2FsYW5kIjsKLQlpZiAoayA9PSBYS19sb2dpY2Fsb3IpIHJldHVybiAibG9naWNhbG9yIjsKLQlpZiAoayA9PSBYS19wYXJ0aWFsZGVyaXZhdGl2ZSkgcmV0dXJuICJwYXJ0aWFsZGVyaXZhdGl2ZSI7Ci0JaWYgKGsgPT0gWEtfZnVuY3Rpb24pIHJldHVybiAiZnVuY3Rpb24iOwotCWlmIChrID09IFhLX2xlZnRhcnJvdykgcmV0dXJuICJsZWZ0YXJyb3ciOwotCWlmIChrID09IFhLX3VwYXJyb3cpIHJldHVybiAidXBhcnJvdyI7Ci0JaWYgKGsgPT0gWEtfcmlnaHRhcnJvdykgcmV0dXJuICJyaWdodGFycm93IjsKLQlpZiAoayA9PSBYS19kb3duYXJyb3cpIHJldHVybiAiZG93bmFycm93IjsKLSNlbmRpZiAvKiBYS19URUNITklDQUwgKi8KLSNpZmRlZiBYS19TUEVDSUFMCi0JaWYgKGsgPT0gWEtfYmxhbmspIHJldHVybiAiYmxhbmsiOwotCWlmIChrID09IFhLX3NvbGlkZGlhbW9uZCkgcmV0dXJuICJzb2xpZGRpYW1vbmQiOwotCWlmIChrID09IFhLX2NoZWNrZXJib2FyZCkgcmV0dXJuICJjaGVja2VyYm9hcmQiOwotCWlmIChrID09IFhLX2h0KSByZXR1cm4gImh0IjsKLQlpZiAoayA9PSBYS19mZikgcmV0dXJuICJmZiI7Ci0JaWYgKGsgPT0gWEtfY3IpIHJldHVybiAiY3IiOwotCWlmIChrID09IFhLX2xmKSByZXR1cm4gImxmIjsKLQlpZiAoayA9PSBYS19ubCkgcmV0dXJuICJubCI7Ci0JaWYgKGsgPT0gWEtfdnQpIHJldHVybiAidnQiOwotCWlmIChrID09IFhLX2xvd3JpZ2h0Y29ybmVyKSByZXR1cm4gImxvd3JpZ2h0Y29ybmVyIjsKLQlpZiAoayA9PSBYS191cHJpZ2h0Y29ybmVyKSByZXR1cm4gInVwcmlnaHRjb3JuZXIiOwotCWlmIChrID09IFhLX3VwbGVmdGNvcm5lcikgcmV0dXJuICJ1cGxlZnRjb3JuZXIiOwotCWlmIChrID09IFhLX2xvd2xlZnRjb3JuZXIpIHJldHVybiAibG93bGVmdGNvcm5lciI7Ci0JaWYgKGsgPT0gWEtfY3Jvc3NpbmdsaW5lcykgcmV0dXJuICJjcm9zc2luZ2xpbmVzIjsKLQlpZiAoayA9PSBYS19ob3JpemxpbmVzY2FuMSkgcmV0dXJuICJob3JpemxpbmVzY2FuMSI7Ci0JaWYgKGsgPT0gWEtfaG9yaXpsaW5lc2NhbjMpIHJldHVybiAiaG9yaXpsaW5lc2NhbjMiOwotCWlmIChrID09IFhLX2hvcml6bGluZXNjYW41KSByZXR1cm4gImhvcml6bGluZXNjYW41IjsKLQlpZiAoayA9PSBYS19ob3JpemxpbmVzY2FuNykgcmV0dXJuICJob3JpemxpbmVzY2FuNyI7Ci0JaWYgKGsgPT0gWEtfaG9yaXpsaW5lc2NhbjkpIHJldHVybiAiaG9yaXpsaW5lc2NhbjkiOwotCWlmIChrID09IFhLX2xlZnR0KSByZXR1cm4gImxlZnR0IjsKLQlpZiAoayA9PSBYS19yaWdodHQpIHJldHVybiAicmlnaHR0IjsKLQlpZiAoayA9PSBYS19ib3R0KSByZXR1cm4gImJvdHQiOwotCWlmIChrID09IFhLX3RvcHQpIHJldHVybiAidG9wdCI7Ci0JaWYgKGsgPT0gWEtfdmVydGJhcikgcmV0dXJuICJ2ZXJ0YmFyIjsKLSNlbmRpZiAvKiBYS19TUEVDSUFMICovCi0jaWZkZWYgWEtfUFVCTElTSElORwotCWlmIChrID09IFhLX2Vtc3BhY2UpIHJldHVybiAiZW1zcGFjZSI7Ci0JaWYgKGsgPT0gWEtfZW5zcGFjZSkgcmV0dXJuICJlbnNwYWNlIjsKLQlpZiAoayA9PSBYS19lbTNzcGFjZSkgcmV0dXJuICJlbTNzcGFjZSI7Ci0JaWYgKGsgPT0gWEtfZW00c3BhY2UpIHJldHVybiAiZW00c3BhY2UiOwotCWlmIChrID09IFhLX2RpZ2l0c3BhY2UpIHJldHVybiAiZGlnaXRzcGFjZSI7Ci0JaWYgKGsgPT0gWEtfcHVuY3RzcGFjZSkgcmV0dXJuICJwdW5jdHNwYWNlIjsKLQlpZiAoayA9PSBYS190aGluc3BhY2UpIHJldHVybiAidGhpbnNwYWNlIjsKLQlpZiAoayA9PSBYS19oYWlyc3BhY2UpIHJldHVybiAiaGFpcnNwYWNlIjsKLQlpZiAoayA9PSBYS19lbWRhc2gpIHJldHVybiAiZW1kYXNoIjsKLQlpZiAoayA9PSBYS19lbmRhc2gpIHJldHVybiAiZW5kYXNoIjsKLQlpZiAoayA9PSBYS19zaWduaWZibGFuaykgcmV0dXJuICJzaWduaWZibGFuayI7Ci0JaWYgKGsgPT0gWEtfZWxsaXBzaXMpIHJldHVybiAiZWxsaXBzaXMiOwotCWlmIChrID09IFhLX2RvdWJiYXNlbGluZWRvdCkgcmV0dXJuICJkb3ViYmFzZWxpbmVkb3QiOwotCWlmIChrID09IFhLX29uZXRoaXJkKSByZXR1cm4gIm9uZXRoaXJkIjsKLQlpZiAoayA9PSBYS190d290aGlyZHMpIHJldHVybiAidHdvdGhpcmRzIjsKLQlpZiAoayA9PSBYS19vbmVmaWZ0aCkgcmV0dXJuICJvbmVmaWZ0aCI7Ci0JaWYgKGsgPT0gWEtfdHdvZmlmdGhzKSByZXR1cm4gInR3b2ZpZnRocyI7Ci0JaWYgKGsgPT0gWEtfdGhyZWVmaWZ0aHMpIHJldHVybiAidGhyZWVmaWZ0aHMiOwotCWlmIChrID09IFhLX2ZvdXJmaWZ0aHMpIHJldHVybiAiZm91cmZpZnRocyI7Ci0JaWYgKGsgPT0gWEtfb25lc2l4dGgpIHJldHVybiAib25lc2l4dGgiOwotCWlmIChrID09IFhLX2ZpdmVzaXh0aHMpIHJldHVybiAiZml2ZXNpeHRocyI7Ci0JaWYgKGsgPT0gWEtfY2FyZW9mKSByZXR1cm4gImNhcmVvZiI7Ci0JaWYgKGsgPT0gWEtfZmlnZGFzaCkgcmV0dXJuICJmaWdkYXNoIjsKLQlpZiAoayA9PSBYS19sZWZ0YW5nbGVicmFja2V0KSByZXR1cm4gImxlZnRhbmdsZWJyYWNrZXQiOwotCWlmIChrID09IFhLX2RlY2ltYWxwb2ludCkgcmV0dXJuICJkZWNpbWFscG9pbnQiOwotCWlmIChrID09IFhLX3JpZ2h0YW5nbGVicmFja2V0KSByZXR1cm4gInJpZ2h0YW5nbGVicmFja2V0IjsKLQlpZiAoayA9PSBYS19tYXJrZXIpIHJldHVybiAibWFya2VyIjsKLQlpZiAoayA9PSBYS19vbmVlaWdodGgpIHJldHVybiAib25lZWlnaHRoIjsKLQlpZiAoayA9PSBYS190aHJlZWVpZ2h0aHMpIHJldHVybiAidGhyZWVlaWdodGhzIjsKLQlpZiAoayA9PSBYS19maXZlZWlnaHRocykgcmV0dXJuICJmaXZlZWlnaHRocyI7Ci0JaWYgKGsgPT0gWEtfc2V2ZW5laWdodGhzKSByZXR1cm4gInNldmVuZWlnaHRocyI7Ci0JaWYgKGsgPT0gWEtfdHJhZGVtYXJrKSByZXR1cm4gInRyYWRlbWFyayI7Ci0JaWYgKGsgPT0gWEtfc2lnbmF0dXJlbWFyaykgcmV0dXJuICJzaWduYXR1cmVtYXJrIjsKLQlpZiAoayA9PSBYS190cmFkZW1hcmtpbmNpcmNsZSkgcmV0dXJuICJ0cmFkZW1hcmtpbmNpcmNsZSI7Ci0JaWYgKGsgPT0gWEtfbGVmdG9wZW50cmlhbmdsZSkgcmV0dXJuICJsZWZ0b3BlbnRyaWFuZ2xlIjsKLQlpZiAoayA9PSBYS19yaWdodG9wZW50cmlhbmdsZSkgcmV0dXJuICJyaWdodG9wZW50cmlhbmdsZSI7Ci0JaWYgKGsgPT0gWEtfZW1vcGVuY2lyY2xlKSByZXR1cm4gImVtb3BlbmNpcmNsZSI7Ci0JaWYgKGsgPT0gWEtfZW1vcGVucmVjdGFuZ2xlKSByZXR1cm4gImVtb3BlbnJlY3RhbmdsZSI7Ci0JaWYgKGsgPT0gWEtfbGVmdHNpbmdsZXF1b3RlbWFyaykgcmV0dXJuICJsZWZ0c2luZ2xlcXVvdGVtYXJrIjsKLQlpZiAoayA9PSBYS19yaWdodHNpbmdsZXF1b3RlbWFyaykgcmV0dXJuICJyaWdodHNpbmdsZXF1b3RlbWFyayI7Ci0JaWYgKGsgPT0gWEtfbGVmdGRvdWJsZXF1b3RlbWFyaykgcmV0dXJuICJsZWZ0ZG91YmxlcXVvdGVtYXJrIjsKLQlpZiAoayA9PSBYS19yaWdodGRvdWJsZXF1b3RlbWFyaykgcmV0dXJuICJyaWdodGRvdWJsZXF1b3RlbWFyayI7Ci0JaWYgKGsgPT0gWEtfcHJlc2NyaXB0aW9uKSByZXR1cm4gInByZXNjcmlwdGlvbiI7Ci0JaWYgKGsgPT0gWEtfbWludXRlcykgcmV0dXJuICJtaW51dGVzIjsKLQlpZiAoayA9PSBYS19zZWNvbmRzKSByZXR1cm4gInNlY29uZHMiOwotCWlmIChrID09IFhLX2xhdGluY3Jvc3MpIHJldHVybiAibGF0aW5jcm9zcyI7Ci0JaWYgKGsgPT0gWEtfaGV4YWdyYW0pIHJldHVybiAiaGV4YWdyYW0iOwotCWlmIChrID09IFhLX2ZpbGxlZHJlY3RidWxsZXQpIHJldHVybiAiZmlsbGVkcmVjdGJ1bGxldCI7Ci0JaWYgKGsgPT0gWEtfZmlsbGVkbGVmdHRyaWJ1bGxldCkgcmV0dXJuICJmaWxsZWRsZWZ0dHJpYnVsbGV0IjsKLQlpZiAoayA9PSBYS19maWxsZWRyaWdodHRyaWJ1bGxldCkgcmV0dXJuICJmaWxsZWRyaWdodHRyaWJ1bGxldCI7Ci0JaWYgKGsgPT0gWEtfZW1maWxsZWRjaXJjbGUpIHJldHVybiAiZW1maWxsZWRjaXJjbGUiOwotCWlmIChrID09IFhLX2VtZmlsbGVkcmVjdCkgcmV0dXJuICJlbWZpbGxlZHJlY3QiOwotCWlmIChrID09IFhLX2Vub3BlbmNpcmNidWxsZXQpIHJldHVybiAiZW5vcGVuY2lyY2J1bGxldCI7Ci0JaWYgKGsgPT0gWEtfZW5vcGVuc3F1YXJlYnVsbGV0KSByZXR1cm4gImVub3BlbnNxdWFyZWJ1bGxldCI7Ci0JaWYgKGsgPT0gWEtfb3BlbnJlY3RidWxsZXQpIHJldHVybiAib3BlbnJlY3RidWxsZXQiOwotCWlmIChrID09IFhLX29wZW50cmlidWxsZXR1cCkgcmV0dXJuICJvcGVudHJpYnVsbGV0dXAiOwotCWlmIChrID09IFhLX29wZW50cmlidWxsZXRkb3duKSByZXR1cm4gIm9wZW50cmlidWxsZXRkb3duIjsKLQlpZiAoayA9PSBYS19vcGVuc3RhcikgcmV0dXJuICJvcGVuc3RhciI7Ci0JaWYgKGsgPT0gWEtfZW5maWxsZWRjaXJjYnVsbGV0KSByZXR1cm4gImVuZmlsbGVkY2lyY2J1bGxldCI7Ci0JaWYgKGsgPT0gWEtfZW5maWxsZWRzcWJ1bGxldCkgcmV0dXJuICJlbmZpbGxlZHNxYnVsbGV0IjsKLQlpZiAoayA9PSBYS19maWxsZWR0cmlidWxsZXR1cCkgcmV0dXJuICJmaWxsZWR0cmlidWxsZXR1cCI7Ci0JaWYgKGsgPT0gWEtfZmlsbGVkdHJpYnVsbGV0ZG93bikgcmV0dXJuICJmaWxsZWR0cmlidWxsZXRkb3duIjsKLQlpZiAoayA9PSBYS19sZWZ0cG9pbnRlcikgcmV0dXJuICJsZWZ0cG9pbnRlciI7Ci0JaWYgKGsgPT0gWEtfcmlnaHRwb2ludGVyKSByZXR1cm4gInJpZ2h0cG9pbnRlciI7Ci0JaWYgKGsgPT0gWEtfY2x1YikgcmV0dXJuICJjbHViIjsKLQlpZiAoayA9PSBYS19kaWFtb25kKSByZXR1cm4gImRpYW1vbmQiOwotCWlmIChrID09IFhLX2hlYXJ0KSByZXR1cm4gImhlYXJ0IjsKLQlpZiAoayA9PSBYS19tYWx0ZXNlY3Jvc3MpIHJldHVybiAibWFsdGVzZWNyb3NzIjsKLQlpZiAoayA9PSBYS19kYWdnZXIpIHJldHVybiAiZGFnZ2VyIjsKLQlpZiAoayA9PSBYS19kb3VibGVkYWdnZXIpIHJldHVybiAiZG91YmxlZGFnZ2VyIjsKLQlpZiAoayA9PSBYS19jaGVja21hcmspIHJldHVybiAiY2hlY2ttYXJrIjsKLQlpZiAoayA9PSBYS19iYWxsb3Rjcm9zcykgcmV0dXJuICJiYWxsb3Rjcm9zcyI7Ci0JaWYgKGsgPT0gWEtfbXVzaWNhbHNoYXJwKSByZXR1cm4gIm11c2ljYWxzaGFycCI7Ci0JaWYgKGsgPT0gWEtfbXVzaWNhbGZsYXQpIHJldHVybiAibXVzaWNhbGZsYXQiOwotCWlmIChrID09IFhLX21hbGVzeW1ib2wpIHJldHVybiAibWFsZXN5bWJvbCI7Ci0JaWYgKGsgPT0gWEtfZmVtYWxlc3ltYm9sKSByZXR1cm4gImZlbWFsZXN5bWJvbCI7Ci0JaWYgKGsgPT0gWEtfdGVsZXBob25lKSByZXR1cm4gInRlbGVwaG9uZSI7Ci0JaWYgKGsgPT0gWEtfdGVsZXBob25lcmVjb3JkZXIpIHJldHVybiAidGVsZXBob25lcmVjb3JkZXIiOwotCWlmIChrID09IFhLX3Bob25vZ3JhcGhjb3B5cmlnaHQpIHJldHVybiAicGhvbm9ncmFwaGNvcHlyaWdodCI7Ci0JaWYgKGsgPT0gWEtfY2FyZXQpIHJldHVybiAiY2FyZXQiOwotCWlmIChrID09IFhLX3NpbmdsZWxvd3F1b3RlbWFyaykgcmV0dXJuICJzaW5nbGVsb3dxdW90ZW1hcmsiOwotCWlmIChrID09IFhLX2RvdWJsZWxvd3F1b3RlbWFyaykgcmV0dXJuICJkb3VibGVsb3dxdW90ZW1hcmsiOwotCWlmIChrID09IFhLX2N1cnNvcikgcmV0dXJuICJjdXJzb3IiOwotI2VuZGlmIC8qIFhLX1BVQkxJU0hJTkcgKi8KLSNpZmRlZiBYS19BUEwKLQlpZiAoayA9PSBYS19sZWZ0Y2FyZXQpIHJldHVybiAibGVmdGNhcmV0IjsKLQlpZiAoayA9PSBYS19yaWdodGNhcmV0KSByZXR1cm4gInJpZ2h0Y2FyZXQiOwotCWlmIChrID09IFhLX2Rvd25jYXJldCkgcmV0dXJuICJkb3duY2FyZXQiOwotCWlmIChrID09IFhLX3VwY2FyZXQpIHJldHVybiAidXBjYXJldCI7Ci0JaWYgKGsgPT0gWEtfb3ZlcmJhcikgcmV0dXJuICJvdmVyYmFyIjsKLQlpZiAoayA9PSBYS19kb3dudGFjaykgcmV0dXJuICJkb3dudGFjayI7Ci0JaWYgKGsgPT0gWEtfdXBzaG9lKSByZXR1cm4gInVwc2hvZSI7Ci0JaWYgKGsgPT0gWEtfZG93bnN0aWxlKSByZXR1cm4gImRvd25zdGlsZSI7Ci0JaWYgKGsgPT0gWEtfdW5kZXJiYXIpIHJldHVybiAidW5kZXJiYXIiOwotCWlmIChrID09IFhLX2pvdCkgcmV0dXJuICJqb3QiOwotCWlmIChrID09IFhLX3F1YWQpIHJldHVybiAicXVhZCI7Ci0JaWYgKGsgPT0gWEtfdXB0YWNrKSByZXR1cm4gInVwdGFjayI7Ci0JaWYgKGsgPT0gWEtfY2lyY2xlKSByZXR1cm4gImNpcmNsZSI7Ci0JaWYgKGsgPT0gWEtfdXBzdGlsZSkgcmV0dXJuICJ1cHN0aWxlIjsKLQlpZiAoayA9PSBYS19kb3duc2hvZSkgcmV0dXJuICJkb3duc2hvZSI7Ci0JaWYgKGsgPT0gWEtfcmlnaHRzaG9lKSByZXR1cm4gInJpZ2h0c2hvZSI7Ci0JaWYgKGsgPT0gWEtfbGVmdHNob2UpIHJldHVybiAibGVmdHNob2UiOwotCWlmIChrID09IFhLX2xlZnR0YWNrKSByZXR1cm4gImxlZnR0YWNrIjsKLQlpZiAoayA9PSBYS19yaWdodHRhY2spIHJldHVybiAicmlnaHR0YWNrIjsKLSNlbmRpZiAvKiBYS19BUEwgKi8KLSNpZmRlZiBYS19IRUJSRVcKLQlpZiAoayA9PSBYS19oZWJyZXdfZG91YmxlbG93bGluZSkgcmV0dXJuICJoZWJyZXdfZG91YmxlbG93bGluZSI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2FsZXBoKSByZXR1cm4gImhlYnJld19hbGVwaCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2JldCkgcmV0dXJuICJoZWJyZXdfYmV0IjsKLQlpZiAoayA9PSBYS19oZWJyZXdfYmV0aCkgcmV0dXJuICJoZWJyZXdfYmV0aCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2dpbWVsKSByZXR1cm4gImhlYnJld19naW1lbCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2dpbW1lbCkgcmV0dXJuICJoZWJyZXdfZ2ltbWVsIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfZGFsZXQpIHJldHVybiAiaGVicmV3X2RhbGV0IjsKLQlpZiAoayA9PSBYS19oZWJyZXdfZGFsZXRoKSByZXR1cm4gImhlYnJld19kYWxldGgiOwotCWlmIChrID09IFhLX2hlYnJld19oZSkgcmV0dXJuICJoZWJyZXdfaGUiOwotCWlmIChrID09IFhLX2hlYnJld193YXcpIHJldHVybiAiaGVicmV3X3dhdyI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X3phaW4pIHJldHVybiAiaGVicmV3X3phaW4iOwotCWlmIChrID09IFhLX2hlYnJld196YXlpbikgcmV0dXJuICJoZWJyZXdfemF5aW4iOwotCWlmIChrID09IFhLX2hlYnJld19jaGV0KSByZXR1cm4gImhlYnJld19jaGV0IjsKLQlpZiAoayA9PSBYS19oZWJyZXdfaGV0KSByZXR1cm4gImhlYnJld19oZXQiOwotCWlmIChrID09IFhLX2hlYnJld190ZXQpIHJldHVybiAiaGVicmV3X3RldCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X3RldGgpIHJldHVybiAiaGVicmV3X3RldGgiOwotCWlmIChrID09IFhLX2hlYnJld195b2QpIHJldHVybiAiaGVicmV3X3lvZCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2ZpbmFsa2FwaCkgcmV0dXJuICJoZWJyZXdfZmluYWxrYXBoIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfa2FwaCkgcmV0dXJuICJoZWJyZXdfa2FwaCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2xhbWVkKSByZXR1cm4gImhlYnJld19sYW1lZCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2ZpbmFsbWVtKSByZXR1cm4gImhlYnJld19maW5hbG1lbSI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X21lbSkgcmV0dXJuICJoZWJyZXdfbWVtIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfZmluYWxudW4pIHJldHVybiAiaGVicmV3X2ZpbmFsbnVuIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfbnVuKSByZXR1cm4gImhlYnJld19udW4iOwotCWlmIChrID09IFhLX2hlYnJld19zYW1lY2gpIHJldHVybiAiaGVicmV3X3NhbWVjaCI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X3NhbWVraCkgcmV0dXJuICJoZWJyZXdfc2FtZWtoIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfYXlpbikgcmV0dXJuICJoZWJyZXdfYXlpbiI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2ZpbmFscGUpIHJldHVybiAiaGVicmV3X2ZpbmFscGUiOwotCWlmIChrID09IFhLX2hlYnJld19wZSkgcmV0dXJuICJoZWJyZXdfcGUiOwotCWlmIChrID09IFhLX2hlYnJld19maW5hbHphZGUpIHJldHVybiAiaGVicmV3X2ZpbmFsemFkZSI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X2ZpbmFsemFkaSkgcmV0dXJuICJoZWJyZXdfZmluYWx6YWRpIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfemFkZSkgcmV0dXJuICJoZWJyZXdfemFkZSI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X3phZGkpIHJldHVybiAiaGVicmV3X3phZGkiOwotCWlmIChrID09IFhLX2hlYnJld19xb3BoKSByZXR1cm4gImhlYnJld19xb3BoIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfa3VmKSByZXR1cm4gImhlYnJld19rdWYiOwotCWlmIChrID09IFhLX2hlYnJld19yZXNoKSByZXR1cm4gImhlYnJld19yZXNoIjsKLQlpZiAoayA9PSBYS19oZWJyZXdfc2hpbikgcmV0dXJuICJoZWJyZXdfc2hpbiI7Ci0JaWYgKGsgPT0gWEtfaGVicmV3X3RhdykgcmV0dXJuICJoZWJyZXdfdGF3IjsKLQlpZiAoayA9PSBYS19oZWJyZXdfdGFmKSByZXR1cm4gImhlYnJld190YWYiOwotCWlmIChrID09IFhLX0hlYnJld19zd2l0Y2gpIHJldHVybiAiSGVicmV3X3N3aXRjaCI7Ci0jZW5kaWYgLyogWEtfSEVCUkVXICovCi0jaWZkZWYgWEtfVEhBSQotCWlmIChrID09IFhLX1RoYWlfa29rYWkpIHJldHVybiAiVGhhaV9rb2thaSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9raG9raGFpKSByZXR1cm4gIlRoYWlfa2hva2hhaSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9raG9raHVhdCkgcmV0dXJuICJUaGFpX2tob2todWF0IjsKLQlpZiAoayA9PSBYS19UaGFpX2tob2tod2FpKSByZXR1cm4gIlRoYWlfa2hva2h3YWkiOwotCWlmIChrID09IFhLX1RoYWlfa2hva2hvbikgcmV0dXJuICJUaGFpX2tob2tob24iOwotCWlmIChrID09IFhLX1RoYWlfa2hvcmFraGFuZykgcmV0dXJuICJUaGFpX2tob3Jha2hhbmciOwotCWlmIChrID09IFhLX1RoYWlfbmdvbmd1KSByZXR1cm4gIlRoYWlfbmdvbmd1IjsKLQlpZiAoayA9PSBYS19UaGFpX2Nob2NoYW4pIHJldHVybiAiVGhhaV9jaG9jaGFuIjsKLQlpZiAoayA9PSBYS19UaGFpX2Nob2NoaW5nKSByZXR1cm4gIlRoYWlfY2hvY2hpbmciOwotCWlmIChrID09IFhLX1RoYWlfY2hvY2hhbmcpIHJldHVybiAiVGhhaV9jaG9jaGFuZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zb3NvKSByZXR1cm4gIlRoYWlfc29zbyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9jaG9jaG9lKSByZXR1cm4gIlRoYWlfY2hvY2hvZSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV95b3lpbmcpIHJldHVybiAiVGhhaV95b3lpbmciOwotCWlmIChrID09IFhLX1RoYWlfZG9jaGFkYSkgcmV0dXJuICJUaGFpX2RvY2hhZGEiOwotCWlmIChrID09IFhLX1RoYWlfdG9wYXRhaykgcmV0dXJuICJUaGFpX3RvcGF0YWsiOwotCWlmIChrID09IFhLX1RoYWlfdGhvdGhhbikgcmV0dXJuICJUaGFpX3Rob3RoYW4iOwotCWlmIChrID09IFhLX1RoYWlfdGhvbmFuZ21vbnRobykgcmV0dXJuICJUaGFpX3Rob25hbmdtb250aG8iOwotCWlmIChrID09IFhLX1RoYWlfdGhvcGh1dGhhbykgcmV0dXJuICJUaGFpX3Rob3BodXRoYW8iOwotCWlmIChrID09IFhLX1RoYWlfbm9uZW4pIHJldHVybiAiVGhhaV9ub25lbiI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9kb2RlaykgcmV0dXJuICJUaGFpX2RvZGVrIjsKLQlpZiAoayA9PSBYS19UaGFpX3RvdGFvKSByZXR1cm4gIlRoYWlfdG90YW8iOwotCWlmIChrID09IFhLX1RoYWlfdGhvdGh1bmcpIHJldHVybiAiVGhhaV90aG90aHVuZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV90aG90aGFoYW4pIHJldHVybiAiVGhhaV90aG90aGFoYW4iOwotCWlmIChrID09IFhLX1RoYWlfdGhvdGhvbmcpIHJldHVybiAiVGhhaV90aG90aG9uZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9ub251KSByZXR1cm4gIlRoYWlfbm9udSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9ib2JhaW1haSkgcmV0dXJuICJUaGFpX2JvYmFpbWFpIjsKLQlpZiAoayA9PSBYS19UaGFpX3BvcGxhKSByZXR1cm4gIlRoYWlfcG9wbGEiOwotCWlmIChrID09IFhLX1RoYWlfcGhvcGh1bmcpIHJldHVybiAiVGhhaV9waG9waHVuZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9mb2ZhKSByZXR1cm4gIlRoYWlfZm9mYSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9waG9waGFuKSByZXR1cm4gIlRoYWlfcGhvcGhhbiI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9mb2ZhbikgcmV0dXJuICJUaGFpX2ZvZmFuIjsKLQlpZiAoayA9PSBYS19UaGFpX3Bob3NhbXBoYW8pIHJldHVybiAiVGhhaV9waG9zYW1waGFvIjsKLQlpZiAoayA9PSBYS19UaGFpX21vbWEpIHJldHVybiAiVGhhaV9tb21hIjsKLQlpZiAoayA9PSBYS19UaGFpX3lveWFrKSByZXR1cm4gIlRoYWlfeW95YWsiOwotCWlmIChrID09IFhLX1RoYWlfcm9ydWEpIHJldHVybiAiVGhhaV9yb3J1YSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9ydSkgcmV0dXJuICJUaGFpX3J1IjsKLQlpZiAoayA9PSBYS19UaGFpX2xvbGluZykgcmV0dXJuICJUaGFpX2xvbGluZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sdSkgcmV0dXJuICJUaGFpX2x1IjsKLQlpZiAoayA9PSBYS19UaGFpX3dvd2FlbikgcmV0dXJuICJUaGFpX3dvd2FlbiI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zb3NhbGEpIHJldHVybiAiVGhhaV9zb3NhbGEiOwotCWlmIChrID09IFhLX1RoYWlfc29ydXNpKSByZXR1cm4gIlRoYWlfc29ydXNpIjsKLQlpZiAoayA9PSBYS19UaGFpX3Nvc3VhKSByZXR1cm4gIlRoYWlfc29zdWEiOwotCWlmIChrID09IFhLX1RoYWlfaG9oaXApIHJldHVybiAiVGhhaV9ob2hpcCI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sb2NodWxhKSByZXR1cm4gIlRoYWlfbG9jaHVsYSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9vYW5nKSByZXR1cm4gIlRoYWlfb2FuZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9ob25va2h1aykgcmV0dXJuICJUaGFpX2hvbm9raHVrIjsKLQlpZiAoayA9PSBYS19UaGFpX3BhaXlhbm5vaSkgcmV0dXJuICJUaGFpX3BhaXlhbm5vaSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhYSkgcmV0dXJuICJUaGFpX3NhcmFhIjsKLQlpZiAoayA9PSBYS19UaGFpX21haWhhbmFrYXQpIHJldHVybiAiVGhhaV9tYWloYW5ha2F0IjsKLQlpZiAoayA9PSBYS19UaGFpX3NhcmFhYSkgcmV0dXJuICJUaGFpX3NhcmFhYSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhYW0pIHJldHVybiAiVGhhaV9zYXJhYW0iOwotCWlmIChrID09IFhLX1RoYWlfc2FyYWkpIHJldHVybiAiVGhhaV9zYXJhaSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhaWkpIHJldHVybiAiVGhhaV9zYXJhaWkiOwotCWlmIChrID09IFhLX1RoYWlfc2FyYXVlKSByZXR1cm4gIlRoYWlfc2FyYXVlIjsKLQlpZiAoayA9PSBYS19UaGFpX3NhcmF1ZWUpIHJldHVybiAiVGhhaV9zYXJhdWVlIjsKLQlpZiAoayA9PSBYS19UaGFpX3NhcmF1KSByZXR1cm4gIlRoYWlfc2FyYXUiOwotCWlmIChrID09IFhLX1RoYWlfc2FyYXV1KSByZXR1cm4gIlRoYWlfc2FyYXV1IjsKLQlpZiAoayA9PSBYS19UaGFpX3BoaW50aHUpIHJldHVybiAiVGhhaV9waGludGh1IjsKLQlpZiAoayA9PSBYS19UaGFpX21haWhhbmFrYXRfbWFpdGhvKSByZXR1cm4gIlRoYWlfbWFpaGFuYWthdF9tYWl0aG8iOwotCWlmIChrID09IFhLX1RoYWlfYmFodCkgcmV0dXJuICJUaGFpX2JhaHQiOwotCWlmIChrID09IFhLX1RoYWlfc2FyYWUpIHJldHVybiAiVGhhaV9zYXJhZSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhYWUpIHJldHVybiAiVGhhaV9zYXJhYWUiOwotCWlmIChrID09IFhLX1RoYWlfc2FyYW8pIHJldHVybiAiVGhhaV9zYXJhbyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhYWltYWltdWFuKSByZXR1cm4gIlRoYWlfc2FyYWFpbWFpbXVhbiI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9zYXJhYWltYWltYWxhaSkgcmV0dXJuICJUaGFpX3NhcmFhaW1haW1hbGFpIjsKLQlpZiAoayA9PSBYS19UaGFpX2xha2toYW5neWFvKSByZXR1cm4gIlRoYWlfbGFra2hhbmd5YW8iOwotCWlmIChrID09IFhLX1RoYWlfbWFpeWFtb2spIHJldHVybiAiVGhhaV9tYWl5YW1vayI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9tYWl0YWlraHUpIHJldHVybiAiVGhhaV9tYWl0YWlraHUiOwotCWlmIChrID09IFhLX1RoYWlfbWFpZWspIHJldHVybiAiVGhhaV9tYWllayI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9tYWl0aG8pIHJldHVybiAiVGhhaV9tYWl0aG8iOwotCWlmIChrID09IFhLX1RoYWlfbWFpdHJpKSByZXR1cm4gIlRoYWlfbWFpdHJpIjsKLQlpZiAoayA9PSBYS19UaGFpX21haWNoYXR0YXdhKSByZXR1cm4gIlRoYWlfbWFpY2hhdHRhd2EiOwotCWlmIChrID09IFhLX1RoYWlfdGhhbnRoYWtoYXQpIHJldHVybiAiVGhhaV90aGFudGhha2hhdCI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9uaWtoYWhpdCkgcmV0dXJuICJUaGFpX25pa2hhaGl0IjsKLQlpZiAoayA9PSBYS19UaGFpX2xla3N1bikgcmV0dXJuICJUaGFpX2xla3N1biI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtudW5nKSByZXR1cm4gIlRoYWlfbGVrbnVuZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtzb25nKSByZXR1cm4gIlRoYWlfbGVrc29uZyI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtzYW0pIHJldHVybiAiVGhhaV9sZWtzYW0iOwotCWlmIChrID09IFhLX1RoYWlfbGVrc2kpIHJldHVybiAiVGhhaV9sZWtzaSI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtoYSkgcmV0dXJuICJUaGFpX2xla2hhIjsKLQlpZiAoayA9PSBYS19UaGFpX2xla2hvaykgcmV0dXJuICJUaGFpX2xla2hvayI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtjaGV0KSByZXR1cm4gIlRoYWlfbGVrY2hldCI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtwYWV0KSByZXR1cm4gIlRoYWlfbGVrcGFldCI7Ci0JaWYgKGsgPT0gWEtfVGhhaV9sZWtrYW8pIHJldHVybiAiVGhhaV9sZWtrYW8iOwotI2VuZGlmIC8qIFhLX1RIQUkgKi8KLSNpZmRlZiBYS19LT1JFQU4KLQlpZiAoayA9PSBYS19IYW5ndWwpIHJldHVybiAiSGFuZ3VsIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfU3RhcnQpIHJldHVybiAiSGFuZ3VsX1N0YXJ0IjsKLQlpZiAoayA9PSBYS19IYW5ndWxfRW5kKSByZXR1cm4gIkhhbmd1bF9FbmQiOwotCWlmIChrID09IFhLX0hhbmd1bF9IYW5qYSkgcmV0dXJuICJIYW5ndWxfSGFuamEiOwotCWlmIChrID09IFhLX0hhbmd1bF9KYW1vKSByZXR1cm4gIkhhbmd1bF9KYW1vIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUm9tYWphKSByZXR1cm4gIkhhbmd1bF9Sb21hamEiOwotCWlmIChrID09IFhLX0hhbmd1bF9Db2RlaW5wdXQpIHJldHVybiAiSGFuZ3VsX0NvZGVpbnB1dCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0plb25qYSkgcmV0dXJuICJIYW5ndWxfSmVvbmphIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfQmFuamEpIHJldHVybiAiSGFuZ3VsX0JhbmphIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUHJlSGFuamEpIHJldHVybiAiSGFuZ3VsX1ByZUhhbmphIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUG9zdEhhbmphKSByZXR1cm4gIkhhbmd1bF9Qb3N0SGFuamEiOwotCWlmIChrID09IFhLX0hhbmd1bF9TaW5nbGVDYW5kaWRhdGUpIHJldHVybiAiSGFuZ3VsX1NpbmdsZUNhbmRpZGF0ZSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX011bHRpcGxlQ2FuZGlkYXRlKSByZXR1cm4gIkhhbmd1bF9NdWx0aXBsZUNhbmRpZGF0ZSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1ByZXZpb3VzQ2FuZGlkYXRlKSByZXR1cm4gIkhhbmd1bF9QcmV2aW91c0NhbmRpZGF0ZSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1NwZWNpYWwpIHJldHVybiAiSGFuZ3VsX1NwZWNpYWwiOwotCWlmIChrID09IFhLX0hhbmd1bF9zd2l0Y2gpIHJldHVybiAiSGFuZ3VsX3N3aXRjaCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0tpeWVvZykgcmV0dXJuICJIYW5ndWxfS2l5ZW9nIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfU3NhbmdLaXllb2cpIHJldHVybiAiSGFuZ3VsX1NzYW5nS2l5ZW9nIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfS2l5ZW9nU2lvcykgcmV0dXJuICJIYW5ndWxfS2l5ZW9nU2lvcyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX05pZXVuKSByZXR1cm4gIkhhbmd1bF9OaWV1biI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX05pZXVuSmlldWopIHJldHVybiAiSGFuZ3VsX05pZXVuSmlldWoiOwotCWlmIChrID09IFhLX0hhbmd1bF9OaWV1bkhpZXVoKSByZXR1cm4gIkhhbmd1bF9OaWV1bkhpZXVoIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfRGlrZXVkKSByZXR1cm4gIkhhbmd1bF9EaWtldWQiOwotCWlmIChrID09IFhLX0hhbmd1bF9Tc2FuZ0Rpa2V1ZCkgcmV0dXJuICJIYW5ndWxfU3NhbmdEaWtldWQiOwotCWlmIChrID09IFhLX0hhbmd1bF9SaWV1bCkgcmV0dXJuICJIYW5ndWxfUmlldWwiOwotCWlmIChrID09IFhLX0hhbmd1bF9SaWV1bEtpeWVvZykgcmV0dXJuICJIYW5ndWxfUmlldWxLaXllb2ciOwotCWlmIChrID09IFhLX0hhbmd1bF9SaWV1bE1pZXVtKSByZXR1cm4gIkhhbmd1bF9SaWV1bE1pZXVtIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUmlldWxQaWV1YikgcmV0dXJuICJIYW5ndWxfUmlldWxQaWV1YiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1JpZXVsU2lvcykgcmV0dXJuICJIYW5ndWxfUmlldWxTaW9zIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUmlldWxUaWV1dCkgcmV0dXJuICJIYW5ndWxfUmlldWxUaWV1dCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1JpZXVsUGhpZXVmKSByZXR1cm4gIkhhbmd1bF9SaWV1bFBoaWV1ZiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1JpZXVsSGlldWgpIHJldHVybiAiSGFuZ3VsX1JpZXVsSGlldWgiOwotCWlmIChrID09IFhLX0hhbmd1bF9NaWV1bSkgcmV0dXJuICJIYW5ndWxfTWlldW0iOwotCWlmIChrID09IFhLX0hhbmd1bF9QaWV1YikgcmV0dXJuICJIYW5ndWxfUGlldWIiOwotCWlmIChrID09IFhLX0hhbmd1bF9Tc2FuZ1BpZXViKSByZXR1cm4gIkhhbmd1bF9Tc2FuZ1BpZXViIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUGlldWJTaW9zKSByZXR1cm4gIkhhbmd1bF9QaWV1YlNpb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9TaW9zKSByZXR1cm4gIkhhbmd1bF9TaW9zIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfU3NhbmdTaW9zKSByZXR1cm4gIkhhbmd1bF9Tc2FuZ1Npb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9JZXVuZykgcmV0dXJuICJIYW5ndWxfSWV1bmciOwotCWlmIChrID09IFhLX0hhbmd1bF9KaWV1aikgcmV0dXJuICJIYW5ndWxfSmlldWoiOwotCWlmIChrID09IFhLX0hhbmd1bF9Tc2FuZ0ppZXVqKSByZXR1cm4gIkhhbmd1bF9Tc2FuZ0ppZXVqIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfQ2lldWMpIHJldHVybiAiSGFuZ3VsX0NpZXVjIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfS2hpZXVxKSByZXR1cm4gIkhhbmd1bF9LaGlldXEiOwotCWlmIChrID09IFhLX0hhbmd1bF9UaWV1dCkgcmV0dXJuICJIYW5ndWxfVGlldXQiOwotCWlmIChrID09IFhLX0hhbmd1bF9QaGlldWYpIHJldHVybiAiSGFuZ3VsX1BoaWV1ZiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0hpZXVoKSByZXR1cm4gIkhhbmd1bF9IaWV1aCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0EpIHJldHVybiAiSGFuZ3VsX0EiOwotCWlmIChrID09IFhLX0hhbmd1bF9BRSkgcmV0dXJuICJIYW5ndWxfQUUiOwotCWlmIChrID09IFhLX0hhbmd1bF9ZQSkgcmV0dXJuICJIYW5ndWxfWUEiOwotCWlmIChrID09IFhLX0hhbmd1bF9ZQUUpIHJldHVybiAiSGFuZ3VsX1lBRSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0VPKSByZXR1cm4gIkhhbmd1bF9FTyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0UpIHJldHVybiAiSGFuZ3VsX0UiOwotCWlmIChrID09IFhLX0hhbmd1bF9ZRU8pIHJldHVybiAiSGFuZ3VsX1lFTyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1lFKSByZXR1cm4gIkhhbmd1bF9ZRSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX08pIHJldHVybiAiSGFuZ3VsX08iOwotCWlmIChrID09IFhLX0hhbmd1bF9XQSkgcmV0dXJuICJIYW5ndWxfV0EiOwotCWlmIChrID09IFhLX0hhbmd1bF9XQUUpIHJldHVybiAiSGFuZ3VsX1dBRSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX09FKSByZXR1cm4gIkhhbmd1bF9PRSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1lPKSByZXR1cm4gIkhhbmd1bF9ZTyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1UpIHJldHVybiAiSGFuZ3VsX1UiOwotCWlmIChrID09IFhLX0hhbmd1bF9XRU8pIHJldHVybiAiSGFuZ3VsX1dFTyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1dFKSByZXR1cm4gIkhhbmd1bF9XRSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1dJKSByZXR1cm4gIkhhbmd1bF9XSSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1lVKSByZXR1cm4gIkhhbmd1bF9ZVSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0VVKSByZXR1cm4gIkhhbmd1bF9FVSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1lJKSByZXR1cm4gIkhhbmd1bF9ZSSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0kpIHJldHVybiAiSGFuZ3VsX0kiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX0tpeWVvZykgcmV0dXJuICJIYW5ndWxfSl9LaXllb2ciOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1NzYW5nS2l5ZW9nKSByZXR1cm4gIkhhbmd1bF9KX1NzYW5nS2l5ZW9nIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9LaXllb2dTaW9zKSByZXR1cm4gIkhhbmd1bF9KX0tpeWVvZ1Npb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX05pZXVuKSByZXR1cm4gIkhhbmd1bF9KX05pZXVuIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9OaWV1bkppZXVqKSByZXR1cm4gIkhhbmd1bF9KX05pZXVuSmlldWoiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX05pZXVuSGlldWgpIHJldHVybiAiSGFuZ3VsX0pfTmlldW5IaWV1aCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfRGlrZXVkKSByZXR1cm4gIkhhbmd1bF9KX0Rpa2V1ZCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfUmlldWwpIHJldHVybiAiSGFuZ3VsX0pfUmlldWwiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1JpZXVsS2l5ZW9nKSByZXR1cm4gIkhhbmd1bF9KX1JpZXVsS2l5ZW9nIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9SaWV1bE1pZXVtKSByZXR1cm4gIkhhbmd1bF9KX1JpZXVsTWlldW0iOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1JpZXVsUGlldWIpIHJldHVybiAiSGFuZ3VsX0pfUmlldWxQaWV1YiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfUmlldWxTaW9zKSByZXR1cm4gIkhhbmd1bF9KX1JpZXVsU2lvcyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfUmlldWxUaWV1dCkgcmV0dXJuICJIYW5ndWxfSl9SaWV1bFRpZXV0IjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9SaWV1bFBoaWV1ZikgcmV0dXJuICJIYW5ndWxfSl9SaWV1bFBoaWV1ZiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfUmlldWxIaWV1aCkgcmV0dXJuICJIYW5ndWxfSl9SaWV1bEhpZXVoIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9NaWV1bSkgcmV0dXJuICJIYW5ndWxfSl9NaWV1bSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfUGlldWIpIHJldHVybiAiSGFuZ3VsX0pfUGlldWIiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1BpZXViU2lvcykgcmV0dXJuICJIYW5ndWxfSl9QaWV1YlNpb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1Npb3MpIHJldHVybiAiSGFuZ3VsX0pfU2lvcyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfU3NhbmdTaW9zKSByZXR1cm4gIkhhbmd1bF9KX1NzYW5nU2lvcyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfSWV1bmcpIHJldHVybiAiSGFuZ3VsX0pfSWV1bmciOwotCWlmIChrID09IFhLX0hhbmd1bF9KX0ppZXVqKSByZXR1cm4gIkhhbmd1bF9KX0ppZXVqIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9DaWV1YykgcmV0dXJuICJIYW5ndWxfSl9DaWV1YyI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfS2hpZXVxKSByZXR1cm4gIkhhbmd1bF9KX0toaWV1cSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0pfVGlldXQpIHJldHVybiAiSGFuZ3VsX0pfVGlldXQiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX1BoaWV1ZikgcmV0dXJuICJIYW5ndWxfSl9QaGlldWYiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX0hpZXVoKSByZXR1cm4gIkhhbmd1bF9KX0hpZXVoIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfUmlldWxZZW9yaW5IaWV1aCkgcmV0dXJuICJIYW5ndWxfUmlldWxZZW9yaW5IaWV1aCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1N1bmt5ZW9uZ2V1bU1pZXVtKSByZXR1cm4gIkhhbmd1bF9TdW5reWVvbmdldW1NaWV1bSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1N1bmt5ZW9uZ2V1bVBpZXViKSByZXR1cm4gIkhhbmd1bF9TdW5reWVvbmdldW1QaWV1YiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1BhblNpb3MpIHJldHVybiAiSGFuZ3VsX1BhblNpb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9La29namlEYWxyaW5JZXVuZykgcmV0dXJuICJIYW5ndWxfS2tvZ2ppRGFscmluSWV1bmciOwotCWlmIChrID09IFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaGlldWYpIHJldHVybiAiSGFuZ3VsX1N1bmt5ZW9uZ2V1bVBoaWV1ZiI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX1llb3JpbkhpZXVoKSByZXR1cm4gIkhhbmd1bF9ZZW9yaW5IaWV1aCI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0FyYWVBKSByZXR1cm4gIkhhbmd1bF9BcmFlQSI7Ci0JaWYgKGsgPT0gWEtfSGFuZ3VsX0FyYWVBRSkgcmV0dXJuICJIYW5ndWxfQXJhZUFFIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9QYW5TaW9zKSByZXR1cm4gIkhhbmd1bF9KX1BhblNpb3MiOwotCWlmIChrID09IFhLX0hhbmd1bF9KX0trb2dqaURhbHJpbklldW5nKSByZXR1cm4gIkhhbmd1bF9KX0trb2dqaURhbHJpbklldW5nIjsKLQlpZiAoayA9PSBYS19IYW5ndWxfSl9ZZW9yaW5IaWV1aCkgcmV0dXJuICJIYW5ndWxfSl9ZZW9yaW5IaWV1aCI7Ci0JaWYgKGsgPT0gWEtfS29yZWFuX1dvbikgcmV0dXJuICJLb3JlYW5fV29uIjsKLSNlbmRpZiAvKiBYS19LT1JFQU4gKi8KLQlpZiAoayA9PSBYS19FdXJvU2lnbikgcmV0dXJuICJFdXJvU2lnbiI7Ci0jZW5kaWYKLQlyZXR1cm4gTlVMTDsJCi19Ci0KLUtleVN5bSBYS2V5Y29kZVRvS2V5c3ltKERpc3BsYXkgKmRpc3BsYXksIEtleUNvZGUga2V5Y29kZSwgaW50IGluZGV4KSB7Ci0JaWYgKCFkaXNwbGF5IHx8ICFrZXljb2RlIHx8ICFpbmRleCkge30KLQlyZXR1cm4gTm9TeW1ib2w7Ci19Ci0KLUtleUNvZGUgWEtleXN5bVRvS2V5Y29kZShEaXNwbGF5ICpkaXNwbGF5LCBLZXlTeW0ga2V5c3ltKSB7Ci0JaWYgKCFkaXNwbGF5IHx8ICFrZXlzeW0pIHt9Ci0JcmV0dXJuIE5vU3ltYm9sOwotfQotCi1YRXJyb3JIYW5kbGVyIFhTZXRFcnJvckhhbmRsZXIgKFhFcnJvckhhbmRsZXIgaCkgewotCXJldHVybiBoOwotfQotCmRpZmYgLS1naXQgYS94MTF2bmMvb3B0aW9ucy5jIGIveDExdm5jL29wdGlvbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxMTliNi4uMDAwMDAwMAotLS0gYS94MTF2bmMvb3B0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gb3B0aW9ucy5jIC0tICovCi0KLSNkZWZpbmUgX1gxMVZOQ19PUFRJT05TX0gKLSNpbmNsdWRlICJ4MTF2bmMuaCIKLQotLyogCi0gKiB2YXJpYWJsZXMgZm9yIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICovCi1pbnQgZGVidWcgPSAwOwotCi1jaGFyICp1c2VfZHB5ID0gTlVMTDsJCS8qIC1kaXNwbGF5ICovCi1pbnQgZGlzcGxheV9OID0gMDsKLWludCBhdXRvX3BvcnQgPSAwOwotY2hhciAqYXV0aF9maWxlID0gTlVMTDsJCS8qIC1hdXRoLy14YXV0aCAqLwotY2hhciAqdmlzdWFsX3N0ciA9IE5VTEw7CS8qIC12aXN1YWwgKi8KLWludCBzZXRfdmlzdWFsX3N0cl90b19zb21ldGhpbmcgPSAwOwotY2hhciAqbG9nZmlsZSA9IE5VTEw7CQkvKiAtbywgLWxvZ2ZpbGUgKi8KLWludCBsb2dmaWxlX2FwcGVuZCA9IDA7Ci1jaGFyICpmbGFnZmlsZSA9IE5VTEw7CQkvKiAtZmxhZyAqLwotY2hhciAqcm1fZmxhZ2ZpbGUgPSBOVUxMOwkvKiAtcm1mbGFnICovCi1jaGFyICpwYXNzd2RmaWxlID0gTlVMTDsJLyogLXBhc3N3ZGZpbGUgKi8KLWludCB1bml4cHcgPSAwOwkJCS8qIC11bml4cHcgKi8KLWludCB1bml4cHdfbmlzID0gMDsJCS8qIC11bml4cHdfbmlzICovCi1jaGFyICp1bml4cHdfbGlzdCA9IE5VTEw7Ci1jaGFyICp1bml4cHdfY21kID0gTlVMTDsKLWludCB1bml4cHdfc3lzdGVtX2dyZWV0ZXIgPSAwOwotaW50IHVuaXhwd19zeXN0ZW1fZ3JlZXRlcl9hY3RpdmUgPSAwOwotaW50IHVzZV9zdHVubmVsID0gMDsJCS8qIC1zdHVubmVsICovCi1pbnQgc3R1bm5lbF9wb3J0ID0gMDsKLWNoYXIgKnN0dW5uZWxfcGVtID0gTlVMTDsKLWludCB1c2Vfb3BlbnNzbCA9IDA7Ci1pbnQgaHR0cF9zc2wgPSAwOwotaW50IHNzbF9ub19mYWlsID0gMDsKLWNoYXIgKm9wZW5zc2xfcGVtID0gTlVMTDsKLWNoYXIgKnNzbF9jZXJ0c19kaXIgPSBOVUxMOwotY2hhciAqZW5jX3N0ciA9IE5VTEw7Ci1pbnQgdmVuY3J5cHRfbW9kZSA9IFZFTkNSWVBUX1NVUFBPUlQ7Ci1pbnQgdmVuY3J5cHRfa3ggPSBWRU5DUllQVF9CT1RIOwotaW50IHZlbmNyeXB0X2VuYWJsZV9wbGFpbl9sb2dpbiA9IDA7Ci1pbnQgYW5vbnRsc19tb2RlID0gQU5PTlRMU19TVVBQT1JUOwotaW50IGNyZWF0ZV9mcmVzaF9kaHBhcmFtcyA9IDA7Ci1jaGFyICpkaHBhcmFtc19maWxlID0gTlVMTDsKLWludCBodHRwX3RyeV9pdCA9IDA7Ci1pbnQgc3R1bm5lbF9odHRwX3BvcnQgPSAwOwotaW50IGh0dHBzX3BvcnRfbnVtID0gLTE7Ci1pbnQgaHR0cHNfcG9ydF9yZWRpciA9IDA7Ci1jaGFyICpzc2xfdmVyaWZ5ID0gTlVMTDsKLWNoYXIgKnNzbF9jcmwgPSBOVUxMOwotaW50IHNzbF9pbml0aWFsaXplZCA9IDA7Ci1pbnQgc3NsX3RpbWVvdXRfc2VjcyA9IC0xOwotY2hhciAqc3NoX3N0ciA9IE5VTEw7Ci1waWRfdCBzc2hfcGlkID0gMDsKLWludCB1c2VwdyA9IFVTRVBXOwotY2hhciAqYmxhY2tvdXRfc3RyID0gTlVMTDsJLyogLWJsYWNrb3V0ICovCi1pbnQgYmxhY2tvdXRfcHRyID0gMDsKLWNoYXIgKmNsaXBfc3RyID0gTlVMTDsJCS8qIC1jbGlwICovCi1pbnQgdXNlX3NvbGlkX2JnID0gMDsJCS8qIC1zb2xpZCAqLwotY2hhciAqc29saWRfc3RyID0gTlVMTDsKLWNoYXIgKnNvbGlkX2RlZmF1bHQgPSAiY3lhbjQiOwotCi1jaGFyICp3bWR0X3N0ciA9IE5VTEw7CQkvKiAtd21kdCAqLwotCi1jaGFyICpzcGVlZHNfc3RyID0gTlVMTDsJLyogLXNwZWVkcyAqLwotCi1jaGFyICpyY19yY2ZpbGUgPSBOVUxMOwkJLyogLXJjICovCi1pbnQgcmNfcmNmaWxlX2RlZmF1bHQgPSAwOwotaW50IHJjX25vcmMgPSAwOwotaW50IGdvdF9ub3JjID0gMDsKLWludCBvcHRzX2JnID0gMDsKLQotI2lmbmRlZiBWTkNTSEFSRUQKLWludCBzaGFyZWQgPSAwOwkJCS8qIHNoYXJlIHZuYyBkaXNwbGF5LiAqLwotI2Vsc2UKLWludCBzaGFyZWQgPSAxOwotI2VuZGlmCi0jaWZuZGVmIEZPUkVWRVIKLWludCBjb25uZWN0X29uY2UgPSAxOwkJLyogZGlzY29ubmVjdCBhZnRlciBmaXJzdCBjb25uZWN0aW9uIHNlc3Npb24uICovCi0jZWxzZQotaW50IGNvbm5lY3Rfb25jZSA9IDA7Ci0jZW5kaWYKLWludCBnb3RfY29ubmVjdF9vbmNlID0gMDsKLWludCBnb3RfZmluZGF1dGggPSAwOwotaW50IGRlbnlfYWxsID0gMDsJCS8qIGdsb2JhbCBsb2NraW5nIG9mIG5ldyBjbGllbnRzICovCi0jaWZuZGVmIFJFTU9URV9ERUZBVUxUCi0jZGVmaW5lIFJFTU9URV9ERUZBVUxUIDEKLSNlbmRpZgotaW50IGFjY2VwdF9yZW1vdGVfY21kcyA9IFJFTU9URV9ERUZBVUxUOwkvKiAtbm9yZW1vdGUgKi8KLWNoYXIgKnJlbW90ZV9wcmVmaXggPSBOVUxMOwotaW50IHJlbW90ZV9kaXJlY3QgPSAwOwotaW50IHF1ZXJ5X2RlZmF1bHQgPSAwOwotaW50IHNhZmVfcmVtb3RlX29ubHkgPSAxOwkvKiAtdW5zYWZlICovCi1pbnQgcHJpdl9yZW1vdGUgPSAwOwkJLyogLXByaXZyZW1vdGUgKi8KLWludCBtb3JlX3NhZmUgPSAwOwkJLyogLXNhZmVyICovCi0jaWZuZGVmIEVYVEVSTkFMX0NPTU1BTkRTCi0jZGVmaW5lIEVYVEVSTkFMX0NPTU1BTkRTIDEKLSNlbmRpZgotI2lmIEVYVEVSTkFMX0NPTU1BTkRTCi1pbnQgbm9fZXh0ZXJuYWxfY21kcyA9IDA7CS8qIC1ub2NtZHMgKi8KLSNlbHNlCi1pbnQgbm9fZXh0ZXJuYWxfY21kcyA9IDE7CS8qIGNhbm5vdCBiZSB0dXJuZWQgYmFjayBvbi4gKi8KLSNlbmRpZgotY2hhciAqYWxsb3dlZF9leHRlcm5hbF9jbWRzID0gTlVMTDsKLWludCBzdGFydGVkX2FzX3Jvb3QgPSAwOwotaW50IGhvc3RfbG9va3VwID0gMTsKLWNoYXIgKnVuaXhfc29jayA9IE5VTEw7Ci1pbnQgdW5peF9zb2NrX2ZkID0gLTE7Ci0jaWYgWDExVk5DX0xJU1RFTjYKLWludCBpcHY2X2xpc3RlbiA9IDE7CQkvKiAtNiAvIC1ubzYgKi8KLWludCBnb3RfaXB2Nl9saXN0ZW4gPSAxOwotI2Vsc2UKLWludCBpcHY2X2xpc3RlbiA9IDA7CQkvKiAtNiAvIC1ubzYgKi8KLWludCBnb3RfaXB2Nl9saXN0ZW4gPSAwOwotI2VuZGlmCi1pbnQgaXB2Nl9saXN0ZW5fZmQgPSAtMTsKLWludCBpcHY2X2h0dHBfZmQgPSAtMTsKLWludCBub2lwdjYgPSAwOwotaW50IG5vaXB2NCA9IDA7Ci1jaGFyICppcHY2X2NsaWVudF9pcF9zdHIgPSBOVUxMOwotY2hhciAqdXNlcnNfbGlzdCA9IE5VTEw7CS8qIC11c2VycyAqLwotY2hhciAqKnVzZXIyZ3JvdXAgPSBOVUxMOwotY2hhciAqYWxsb3dfbGlzdCA9IE5VTEw7CS8qIGZvciAtYWxsb3cgYW5kIC1sb2NhbGhvc3QgKi8KLWNoYXIgKmxpc3Rlbl9zdHIgPSBOVUxMOwotY2hhciAqbGlzdGVuX3N0cjYgPSBOVUxMOwotY2hhciAqYWxsb3dfb25jZSA9IE5VTEw7CS8qIG9uZSB0aW1lIC1hbGxvdyAqLwotY2hhciAqYWNjZXB0X2NtZCA9IE5VTEw7CS8qIGZvciAtYWNjZXB0ICovCi1jaGFyICphZnRlcmFjY2VwdF9jbWQgPSBOVUxMOwkvKiBmb3IgLWFmdGVyYWNjZXB0ICovCi1jaGFyICpnb25lX2NtZCA9IE5VTEw7CQkvKiBmb3IgLWdvbmUgKi8KLSNpZm5kZWYgVklFV09OTFkKLSNkZWZpbmUgVklFV09OTFkgMAotI2VuZGlmCi1pbnQgdmlld19vbmx5ID0gVklFV09OTFk7CQkvKiBjbGllbnRzIGNhbiBvbmx5IHdhdGNoLiAqLwotY2hhciAqYWxsb3dlZF9pbnB1dF92aWV3X29ubHkgPSBOVUxMOwotY2hhciAqYWxsb3dlZF9pbnB1dF9ub3JtYWwgPSBOVUxMOwotY2hhciAqYWxsb3dlZF9pbnB1dF9zdHIgPSBOVUxMOwotY2hhciAqdmlld29ubHlfcGFzc3dkID0gTlVMTDsJLyogdmlldyBvbmx5IHBhc3N3ZC4gKi8KLWNoYXIgKipwYXNzd2RfbGlzdCA9IE5VTEw7CS8qIGZvciAtcGFzc3dkZmlsZSAqLwotaW50IGJlZ2luX3ZpZXdvbmx5ID0gLTE7Ci1pbnQgaW5ldGQgPSAwOwkJCS8qIHNwYXduZWQgZnJvbSBpbmV0ZCg4KSAqLwotI2lmbmRlZiBUSUdIVEZJTEVYRkVSCi0jZGVmaW5lIFRJR0hURklMRVhGRVIgMAotI2VuZGlmCi1pbnQgdGlnaHRmaWxleGZlciA9IFRJR0hURklMRVhGRVI7IAotaW50IGdvdF91bHRyYWZpbGV4ZmVyID0gMDsgCi1pbnQgZmlyc3RfY29ubl90aW1lb3V0ID0gMDsJLyogLXRpbWVvdXQgKi8KLWludCBwaW5nX2ludGVydmFsID0gMDsJCS8qIC1waW5nICovCi1pbnQgZmxhc2hfY21hcCA9IDA7CQkvKiBmb2xsb3cgaW5zdGFsbGVkIGNvbG9ybWFwcyAqLwotaW50IHNoaWZ0X2NtYXAgPSAwOwkJLyogbmNlbGxzIDwgMjU2IGFuZCBuZWVkcyBzaGlmdCBvZiBwaXhlbCB2YWx1ZXMgKi8KLWludCBmb3JjZV9pbmRleGVkX2NvbG9yID0gMDsJLyogd2hldGhlciB0byBmb3JjZSBpbmRleGVkIGNvbG9yIGZvciA4YnBwICovCi1pbnQgYWR2ZXJ0aXNlX3RydWVjb2xvciA9IDA7Ci1pbnQgYWR2ZXJ0aXNlX3RydWVjb2xvcl9yZXNldCA9IDA7Ci1pbnQgY21hcDh0bzI0ID0gMDsJCS8qIC04dG8yNCAqLwotaW50IHhmb3JtMjR0bzMyID0gMDsJCS8qIC0yNHRvMzIgKi8KLWNoYXIgKmNtYXA4dG8yNF9zdHIgPSBOVUxMOwotaW50IGxhdW5jaF9ndWkgPSAwOwkJLyogLWd1aSAqLwotCi0jaWZuZGVmIEFWQUhJCi0jZGVmaW5lIEFWQUhJIDAKLSNlbmRpZgotaW50IGF2YWhpID0gQVZBSEk7CQkvKiAtYXZhaGksIC1tZG5zICovCi1pbnQgdm5jX3JlZGlyZWN0ID0gMDsKLWludCB2bmNfcmVkaXJlY3Rfc29jayA9IC0xOwotCi1pbnQgdXNlX21vZGlmaWVyX3R3ZWFrID0gMTsJLyogdXNlIHRoZSBzaGlmdC9hbHRnciBtb2RpZmllciB0d2VhayAqLwotaW50IHdhdGNoX2NhcHNsb2NrID0gMDsJCS8qIC1jYXBzbG9jayAqLwotaW50IHNraXBfbG9ja2tleXMgPSAwOwkJLyogLXNraXBfbG9ja2tleXMgKi8KLWludCB1c2VfaXNvX2xldmVsMyA9IDA7CQkvKiBJU09fTGV2ZWwzX1NoaWZ0IGluc3RlYWQgb2YgTW9kZV9zd2l0Y2ggKi8KLWludCBjbGVhcl9tb2RzID0gMDsJCS8qIC1jbGVhcl9tb2RzICgxKSBhbmQgLWNsZWFyX2tleXMgKDIpIC1jbGVhcl9sb2NrcyAoMykgKi8KLWludCBub2ZiID0gMDsJCQkvKiBkbyBub3Qgc2VuZCBhbnkgZmIgdXBkYXRlcyAqLwotY2hhciAqcmF3X2ZiX3N0ciA9IE5VTEw7CS8qIHVzZWQgdW5kZXIgLXJhd2ZiICovCi1jaGFyICpyYXdfZmJfcGl4Zm10ID0gTlVMTDsKLWNoYXIgKnJhd19mYl9mdWxsX3N0ciA9IE5VTEw7Ci1jaGFyICpmcmVxdGFiID0gTlVMTDsKLWNoYXIgKnBpcGVpbnB1dF9zdHIgPSBOVUxMOwkvKiAtcGlwZWlucHV0IFt0ZWUscmVvcGVuLGtleWNvZGVzOl1jbWQgKi8KLWNoYXIgKnBpcGVpbnB1dF9vcHRzID0gTlVMTDsKLUZJTEUgKnBpcGVpbnB1dF9maCA9IE5VTEw7Ci1pbnQgcGlwZWlucHV0X3RlZSA9IDA7Ci1pbnQgcGlwZWlucHV0X2ludCA9IDA7Ci1pbnQgcGlwZWlucHV0X2NvbnNfZmQgPSAtMTsKLWNoYXIgKnBpcGVpbnB1dF9jb25zX2RldiA9IE5VTEw7Ci0KLWludCBtYWNvc3hfbm9kaW1taW5nID0gMDsJLyogU29tZSBuYXRpdmUgTWFjT1NYIHNlcnZlciBzZXR0aW5ncy4gKi8KLWludCBtYWNvc3hfbm9zbGVlcCA9IDA7Ci1pbnQgbWFjb3N4X25vc2NyZWVuc2F2ZXIgPSAwOwotaW50IG1hY29zeF93YWl0X2Zvcl9zd2l0Y2ggPSAxOwotaW50IG1hY29zeF9tb3VzZV93aGVlbF9zcGVlZCA9IDU7Ci1pbnQgbWFjb3N4X2NvbnNvbGUgPSAwOwotaW50IG1hY29zeF9zd2FwMjMgPSAxOwotaW50IG1hY29zeF9yZXNpemUgPSAxOwotaW50IG1hY29zeF9pY29uX2FuaW1fdGltZSA9IDQ1MDsKLWludCBtYWNvc3hfbm9fb3BlbmdsID0gMDsKLWludCBtYWNvc3hfbm9fcmF3ZmIgPSAwOwotaW50IG1hY29zeF9yZWFkX29wZW5nbCA9IDA7Ci1pbnQgbWFjb3N4X3JlYWRfcmF3ZmIgPSAwOwotCi11bnNpZ25lZCBsb25nIHN1YndpbiA9IDB4MDsJLyogLWlkLCAtc2lkICovCi1pbnQgc3Vid2luX3dhaXRfbWFwcGVkID0gMDsKLWludCBmcmVlemVfd2hlbl9vYnNjdXJlZCA9IDA7Ci1pbnQgc3Vid2luX29ic2N1cmVkID0gMDsKLQotaW50IGRlYnVnX3hldmVudHMgPSAwOwkJLyogLVIgZGVidWdfeGV2ZW50czoxICovCi1pbnQgZGVidWdfeGRhbWFnZSA9IDA7CQkvKiAtUiBkZWJ1Z194ZGFtYWdlOjEgb3IgMiAuLi4gKi8KLWludCBkZWJ1Z193aXJlZnJhbWUgPSAwOwotaW50IGRlYnVnX3RpbGVzID0gMDsKLWludCBkZWJ1Z19ncmFicyA9IDA7Ci1pbnQgZGVidWdfc2VsID0gMDsKLQotaW50IHh0cmFwX2lucHV0ID0gMDsJCS8qIC14dHJhcCBmb3IgdXNlciBpbnB1dCBpbnNlcnRpb24gKi8KLWludCB4aW5lcmFtYSA9IFhJTkVSQU1BOwkvKiAteGluZXJhbWEgKi8KLWludCB4cmFuZHIgPSAwOwkJCS8qIC14cmFuZHIgKi8KLWludCB4cmFuZHJfbWF5YmUgPSAxOwkJLyogY2hlY2sgZm9yIGV2ZW50cywgYnV0IGRvbid0IHRyYXAgYWxsIGNhbGxzICovCi1jaGFyICp4cmFuZHJfbW9kZSA9IE5VTEw7Ci1jaGFyICpwYWRfZ2VvbWV0cnkgPSBOVUxMOwotdGltZV90IHBhZF9nZW9tZXRyeV90aW1lID0gMDsKLWludCB1c2Vfc25hcGZiID0gMDsKLQotaW50IHVzZV94cmVjb3JkID0gMDsKLWludCBub3hyZWNvcmQgPSAwOwotCi1jaGFyICpjbGllbnRfY29ubmVjdCA9IE5VTEw7CS8qIHN0cmluZ3MgZm9yIC1jb25uZWN0IG9wdGlvbiAqLwotY2hhciAqY2xpZW50X2Nvbm5lY3RfZmlsZSA9IE5VTEw7Ci1pbnQgY29ubmVjdF9vcl9leGl0ID0gMDsKLWludCB2bmNfY29ubmVjdCA9IDE7CQkvKiAtdm5jY29ubmVjdCBvcHRpb24gKi8KLWNoYXIgKmNvbm5lY3RfcHJveHkgPSBOVUxMOwotCi1pbnQgc2hvd19jdXJzb3IgPSAxOwkJLyogc2hvdyBjdXJzb3Igc2hhcGVzICovCi1pbnQgc2hvd19tdWx0aXBsZV9jdXJzb3JzID0gMDsJLyogc2hvdyBYIHdoZW4gb24gcm9vdCBiYWNrZ3JvdW5kLCBldGMgKi8KLWNoYXIgKm11bHRpcGxlX2N1cnNvcnNfbW9kZSA9IE5VTEw7Ci0jaWZuZGVmIENVUlNPUl9EUkFHCi0jZGVmaW5lIENVUlNPUl9EUkFHIDAKLSNlbmRpZgotaW50IGN1cnNvcl9kcmFnX2NoYW5nZXMgPSBDVVJTT1JfRFJBRzsKLWludCBjdXJzb3JfcG9zX3VwZGF0ZXMgPSAxOwkvKiBjdXJzb3IgcG9zaXRpb24gdXBkYXRlcyAtY3Vyc29ycG9zICovCi1pbnQgY3Vyc29yX3NoYXBlX3VwZGF0ZXMgPSAxOwkvKiBjdXJzb3Igc2hhcGUgdXBkYXRlcyAtbm9jdXJzb3JzaGFwZSAqLwotaW50IHVzZV94d2FycHBvaW50ZXIgPSAwOwkvKiB1c2UgWFdhcnBQb2ludGVyIGluc3RlYWQgb2YgWFRlc3RGYWtlLi4uICovCi1pbnQgYWx3YXlzX2luamVjdCA9IDA7CQkvKiBpbmplY3QgbmV3IG1vdXNlIGNvb3JkaW5hdGVzIGV2ZW4gaWYgZHg9ZHk9MCAqLwotaW50IHNob3dfZHJhZ2dpbmcgPSAxOwkJLyogcHJvY2VzcyBtb3VzZSBtb3ZlbWVudCBldmVudHMgKi8KLSNpZm5kZWYgV0lSRUZSQU1FCi0jZGVmaW5lIFdJUkVGUkFNRSAxCi0jZW5kaWYKLWludCB3aXJlZnJhbWUgPSBXSVJFRlJBTUU7CS8qIHRyeSB0byBlbXVsYXRlIHdpcmVmcmFtZSB3bSBtb3ZlcyAqLwotLyogc2hhZGUsbGluZXdpZHRoLHBlcmNlbnQsVCtCK0wrUix0MSt0Mit0Myt0NCAqLwotY2hhciAqd2lyZWZyYW1lX3N0ciA9IE5VTEw7Ci1jaGFyICp3aXJlZnJhbWVfY29weXJlY3QgPSBOVUxMOwotI2lmbmRlZiBXSVJFRlJBTUVfQ09QWVJFQ1QKLSNkZWZpbmUgV0lSRUZSQU1FX0NPUFlSRUNUIDEKLSNlbmRpZgotI2lmIFdJUkVGUkFNRV9DT1BZUkVDVAotY2hhciAqd2lyZWZyYW1lX2NvcHlyZWN0X2RlZmF1bHQgPSAiYWx3YXlzIjsKLSNlbHNlCi1jaGFyICp3aXJlZnJhbWVfY29weXJlY3RfZGVmYXVsdCA9ICJuZXZlciI7Ci0jZW5kaWYKLWludCB3aXJlZnJhbWVfaW5fcHJvZ3Jlc3MgPSAwOwotaW50IHdpcmVmcmFtZV9sb2NhbCA9IDE7Ci0KLSNpZm5kZWYgTkNBQ0hFCi0jaWZkZWYgTk9fTkNBQ0hFCi0jZGVmaW5lIE5DQUNIRSAwIAotI2Vsc2UKLSNkZWZpbmUgeHhOQ0FDSEUgLTEyCi0jZGVmaW5lIE5DQUNIRSAtMQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE1BQ09TWAotaW50IG5jYWNoZSA9IDA7Ci1pbnQgbmNhY2hlX3BhZCA9IDI0OwotI2Vsc2UKLWludCBuY2FjaGUgPSBOQ0FDSEU7Ci1pbnQgbmNhY2hlX3BhZCA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBOQ0FDSEVfWFJPT1RQTUFQCi0jZGVmaW5lIE5DQUNIRV9YUk9PVFBNQVAgMQotI2VuZGlmCi1pbnQgbmNhY2hlX3hyb290cG1hcCA9IE5DQUNIRV9YUk9PVFBNQVA7Ci1pbnQgbmNhY2hlMCA9IDA7Ci1pbnQgbmNhY2hlX2RlZmF1bHQgPSAxMDsKLWludCBuY2FjaGVfY29weXJlY3QgPSAwOwotaW50IG5jYWNoZV93Zl9yYWlzZXMgPSAxOwotaW50IG5jYWNoZV9kdF9jaGFuZ2UgPSAxOwotaW50IG5jYWNoZV9rZWVwX2FuaW1zID0gMDsKLWludCBuY2FjaGVfb2xkX3dtID0gMDsKLWludCBtYWNvc3hfbmNhY2hlX21hY21lbnUgPSAwOwotaW50IG1hY29zeF91c19rYmQgPSAwOwotaW50IG5jYWNoZV9iZXRhX3Rlc3RlciA9IDA7Ci1pbnQgbmNkYiA9IDA7Ci0KLUF0b20gYXRvbV9ORVRfQUNUSVZFX1dJTkRPVyA9IE5vbmU7Ci1BdG9tIGF0b21fTkVUX0NVUlJFTlRfREVTS1RPUCA9IE5vbmU7Ci1BdG9tIGF0b21fTkVUX0NMSUVOVF9MSVNUX1NUQUNLSU5HID0gTm9uZTsKLUF0b20gYXRvbV9YUk9PVFBNQVBfSUQgPSBOb25lOwotZG91YmxlIGdvdF9ORVRfQUNUSVZFX1dJTkRPVyA9IDAuMDsKLWRvdWJsZSBnb3RfTkVUX0NVUlJFTlRfREVTS1RPUCA9IDAuMDsKLWRvdWJsZSBnb3RfTkVUX0NMSUVOVF9MSVNUX1NUQUNLSU5HID0gMC4wOwotZG91YmxlIGdvdF9YUk9PVFBNQVBfSUQgPSAwLjA7Ci0KLS8qIFQrQitMK1IsdGtleStwcmVzaXN0X2tleSx0bW91c2UrcGVyc2lzdF9tb3VzZSAqLwotY2hhciAqc2Nyb2xsX2NvcHlyZWN0X3N0ciA9IE5VTEw7Ci0jaWZuZGVmIFNDUk9MTF9DT1BZUkVDVAotI2RlZmluZSBTQ1JPTExfQ09QWVJFQ1QgMQotI2VuZGlmCi1jaGFyICpzY3JvbGxfY29weXJlY3QgPSBOVUxMOwotI2lmIFNDUk9MTF9DT1BZUkVDVAotI2lmIDEKLWNoYXIgKnNjcm9sbF9jb3B5cmVjdF9kZWZhdWx0ID0gImFsd2F5cyI7CS8qIC1zY3JvbGxjb3B5cmVjdCAqLwotI2Vsc2UKLWNoYXIgKnNjcm9sbF9jb3B5cmVjdF9kZWZhdWx0ID0gImtleXMiOwotI2VuZGlmCi0jZWxzZQotY2hhciAqc2Nyb2xsX2NvcHlyZWN0X2RlZmF1bHQgPSAibmV2ZXIiOwotI2VuZGlmCi1jaGFyICpzY3JvbGxfa2V5X2xpc3Rfc3RyID0gTlVMTDsKLUtleVN5bSAqc2Nyb2xsX2tleV9saXN0ID0gTlVMTDsKLQotI2lmbmRlZiBTQ0FMSU5HX0NPUFlSRUNUCi0jZGVmaW5lIFNDQUxJTkdfQ09QWVJFQ1QgMQotI2VuZGlmCi1pbnQgc2NhbGluZ19jb3B5cmVjdDAgPSBTQ0FMSU5HX0NPUFlSRUNUOwotaW50IHNjYWxpbmdfY29weXJlY3QgID0gU0NBTElOR19DT1BZUkVDVDsKLQotaW50IHNjcm9sbGNvcHlyZWN0X21pbl9hcmVhID0gNjAwMDA7CS8qIG1pbmltdW0gcmVjdGFuZ2xlIGFyZWEgKi8KLWludCBkZWJ1Z19zY3JvbGwgPSAwOwotZG91YmxlIHBvaW50ZXJfZmx1c2hfZGVsYXkgPSAwLjA7Ci1kb3VibGUgbGFzdF9zY3JvbGxfZXZlbnQgPSAwLjA7Ci1pbnQgbWF4X3Njcm9sbF9rZXlyYXRlID0gMDsKLWRvdWJsZSBtYXhfa2V5cmVwZWF0X3RpbWUgPSAwLjA7Ci1jaGFyICptYXhfa2V5cmVwZWF0X3N0ciA9IE5VTEw7Ci1jaGFyICptYXhfa2V5cmVwZWF0X3N0cjAgPSAiNC0yMCI7Ci1pbnQgbWF4X2tleXJlcGVhdF9sbyA9IDEsIG1heF9rZXlyZXBlYXRfaGkgPSA0MDsKLQotY2hhciAqKnNjcm9sbF9nb29kX2FsbCA9IE5VTEw7Ci1jaGFyICoqc2Nyb2xsX2dvb2Rfa2V5ID0gTlVMTDsKLWNoYXIgKipzY3JvbGxfZ29vZF9tb3VzZSA9IE5VTEw7Ci1jaGFyICpzY3JvbGxfZ29vZF9zdHIgPSBOVUxMOwotY2hhciAqc2Nyb2xsX2dvb2Rfc3RyMCA9ICIjI05vbWF0Y2giOwotLyoJIiMjRmlyZWZveC1iaW4sIiAqLwotLyoJIiMjR25vbWUtdGVybWluYWwsIiAqLwotLyoJIiMjWFRlcm0iLCAqLwotCi1jaGFyICoqc2Nyb2xsX3NraXBfYWxsID0gTlVMTDsKLWNoYXIgKipzY3JvbGxfc2tpcF9rZXkgPSBOVUxMOwotY2hhciAqKnNjcm9sbF9za2lwX21vdXNlID0gTlVMTDsKLWNoYXIgKnNjcm9sbF9za2lwX3N0ciA9IE5VTEw7Ci1jaGFyICpzY3JvbGxfc2tpcF9zdHIwID0gIiMjU29mZmljZS5iaW4sIyNTdGFyT2ZmaWNlLCMjT3Blbk9mZmljZSI7Ci0vKgkiIyNLb25zb2xlLCIJICogbm8gcHJvYmxlbXMsIGtub3duIGhldXJpc3RpY3MgZG8gbm90IHdvcmsgKi8KLQotY2hhciAqKnNjcm9sbF90ZXJtID0gTlVMTDsKLWNoYXIgKnNjcm9sbF90ZXJtX3N0ciA9IE5VTEw7Ci1jaGFyICpzY3JvbGxfdGVybV9zdHIwID0gInRlcm0iOwotCi1jaGFyKiBzY3JlZW5fZml4dXBfc3RyID0gTlVMTDsKLWRvdWJsZSBzY3JlZW5fZml4dXBfViA9IDAuMDsKLWRvdWJsZSBzY3JlZW5fZml4dXBfQyA9IDAuMDsKLWRvdWJsZSBzY3JlZW5fZml4dXBfWCA9IDAuMDsKLWRvdWJsZSBzY3JlZW5fZml4dXBfOCA9IDAuMDsKLQotI2lmbmRlZiBOT1JFUEVBVAotI2RlZmluZSBOT1JFUEVBVCAxCi0jZW5kaWYKLWludCBub19hdXRvcmVwZWF0ID0gTk9SRVBFQVQ7CS8qIHR1cm4gb2ZmIGF1dG9yZXBlYXQgd2l0aCBjbGllbnRzICovCi1pbnQgbm9fcmVwZWF0X2NvdW50ZG93biA9IDI7Ci1pbnQgd2F0Y2hfYmVsbCA9IDE7CQkvKiB3YXRjaCBmb3IgdGhlIGJlbGwgdXNpbmcgWEtFWUJPQVJEICovCi1pbnQgc291bmRfYmVsbCA9IDE7CQkvKiBhY3R1YWxseSBzZW5kIGl0ICovCi1pbnQgeGtiY29tcGF0ID0gMDsJCS8qIGlnbm9yZSBYS0VZQk9BUkQgZXh0ZW5zaW9uICovCi1pbnQgdXNlX3hrYl9tb2R0d2VhayA9IDA7CS8qIC14a2IgKi8KLSNpZm5kZWYgU0tJUERVUFMKLSNkZWZpbmUgU0tJUERVUFMgMAotI2VuZGlmCi1pbnQgc2tpcF9kdXBsaWNhdGVfa2V5X2V2ZW50cyA9IFNLSVBEVVBTOwotY2hhciAqc2tpcF9rZXljb2RlcyA9IE5VTEw7Ci1pbnQgc2xvcHB5X2tleXMgPSAwOwotI2lmbmRlZiBBRERLRVlTWU1TCi0jZGVmaW5lIEFEREtFWVNZTVMgMQotI2VuZGlmCi1pbnQgYWRkX2tleXN5bXMgPSBBRERLRVlTWU1TOwkvKiBhdXRvbWF0aWNhbGx5IGFkZCBrZXlzeW1zIHRvIFggc2VydmVyICovCi0KLWNoYXIgKnJlbWFwX2ZpbGUgPSBOVUxMOwkvKiAtcmVtYXAgKi8KLWNoYXIgKnBvaW50ZXJfcmVtYXAgPSBOVUxMOwotLyogdXNlIHRoZSB2YXJpb3VzIHdheXMgb2YgdXBkYXRpbmcgcG9pbnRlciAqLwotI2lmbmRlZiBQT0lOVEVSX01PREVfREVGQVVMVAotI2RlZmluZSBQT0lOVEVSX01PREVfREVGQVVMVCAyCi0jZW5kaWYKLWludCBwb2ludGVyX21vZGUgPSBQT0lOVEVSX01PREVfREVGQVVMVDsKLWludCBwb2ludGVyX21vZGVfbWF4ID0gNDsJCi1pbnQgc2luZ2xlX2NvcHl0aWxlID0gMDsJLyogdXNlIHRoZSBvbGQgd2F5IGNvcHlfdGlsZXMoKSAqLwotaW50IHNpbmdsZV9jb3B5dGlsZV9vcmlnID0gMDsKLWludCBzaW5nbGVfY29weXRpbGVfY291bnQgPSAwOwotaW50IHRpbGVfc2htX2NvdW50ID0gMDsKLQotaW50IHVzaW5nX3NobSA9IDE7CQkvKiB3aGV0aGVyIG1pdC1zaG0gaXMgdXNlZCAqLwotaW50IGZsaXBfYnl0ZV9vcmRlciA9IDA7CS8qIHNvbWV0aW1lcyBuZWVkZWQgd2hlbiB1c2luZ19zaG0gPSAwICovCi0vKgotICogd2FpdG1zIGlzIHRoZSBtc2VjIHRvIHdhaXQgYmV0d2VlbiBzY3JlZW4gcG9sbHMuICBOb3QgdG9vIG9sZCBoL3cgc2hvd3MKLSAqIHBvbGwgdGltZXMgb2YgMTAtMzVtcywgc28gbWF5YmUgdGhpcyB2YWx1ZSBjdXRzIHRoZSBpZGxlIGxvYWQgYnkgMiBvciBzby4KLSAqLwotaW50IHdhaXRtcyA9IDIwOwotaW50IGdvdF93YWl0bXMgPSAwOwotZG91YmxlIHdhaXRfdWkgPSAyLjA7Ci1kb3VibGUgc2xvd19mYiA9IDAuMDsKLWRvdWJsZSB4cmVmcmVzaCA9IDAuMDsKLWludCB3YWl0X2JvZyA9IDE7Ci1pbnQgZXh0cmFfZmJ1ciA9IDE7Ci1pbnQgZGVmZXJfdXBkYXRlID0gMjA7CS8qIGRlZmVyVXBkYXRlVGltZSBtcyB0byB3YWl0IGJlZm9yZSBzZW5kcy4gKi8KLWludCBzZXRfZGVmZXIgPSAxOwotaW50IGdvdF9kZWZlciA9IDA7Ci1pbnQgZ290X2RlZmVydXBkYXRlID0gMDsKLQotaW50IHNjcmVlbl9ibGFuayA9IDYwOwkvKiBudW1iZXIgb2Ygc2Vjb25kcyBvZiBubyBhY3Rpdml0eSB0byB0aHJvdHRsZSAqLwotCQkJLyogZG93biB0aGUgc2NyZWVuIHBvbGxzLiAgemVybyB0byBkaXNhYmxlLiAqLwotaW50IG5vX2ZidV9ibGFuayA9IDMwOwkvKiBuYXAgaWYgbm8gY2xpZW50IHVwZGF0ZXMgaW4gdGhpcyBtYW55IHNlY3MuICovCi1pbnQgdGFrZV9uYXBzID0gMTsJLyogLW5hcC8tbm9uYXAgKi8KLWludCBuYXB0aWxlID0gNDsJLyogdGlsZSBjaGFuZ2UgdGhyZXNob2xkIHBlciBwb2xsIHRvIHRha2UgYSBuYXAgKi8KLWludCBuYXBmYWMgPSA0OwkJLyogdGltZSA9IG5hcGZhYyp3YWl0bXMsIGN1dCBsb2FkIHdpdGggZXh0cmEgd2FpdHMgKi8KLWludCBuYXBtYXggPSAxNTAwOwkvKiBsb25nZXN0IG5hcCBpbiBtcy4gKi8KLWludCB1aV9za2lwID0gMTA7CS8qIHNlZSB3YXRjaGxvb3AuICBuZWdhdGl2ZSBtZWFucyBpZ25vcmUgaW5wdXQgKi8KLWludCBhbGxfaW5wdXQgPSAwOwotaW50IGhhbmRsZV9ldmVudHNfZWFnZXJseSA9IDA7Ci0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZCUE0KLWludCB3YXRjaF9mYnBtID0gMTsJLyogLW5vZmJwbSAqLwotI2Vsc2UKLWludCB3YXRjaF9mYnBtID0gMDsKLSNlbmRpZgotCi1pbnQgd2F0Y2hfZHBtcyA9IDA7CS8qIC1kcG1zICovCi1pbnQgZm9yY2VfZHBtcyA9IDA7Ci1pbnQgY2xpZW50X2RwbXMgPSAwOwotaW50IG5vX3VsdHJhX2RwbXMgPSAwOwotaW50IG5vX3VsdHJhX2V4dCA9IDA7Ci1pbnQgc2F3X3VsdHJhX2NoYXQgPSAwOwotaW50IHNhd191bHRyYV9maWxlID0gMDsKLWludCBjaGF0X3dpbmRvdyA9IDA7Ci1yZmJDbGllbnRQdHIgY2hhdF93aW5kb3dfY2xpZW50ID0gTlVMTDsKLQotaW50IHdhdGNoX3NlbGVjdGlvbiA9IDE7CS8qIG5vcm1hbCBzZWxlY3Rpb24vY3V0YnVmZmVyIG1haW50ZW5hbmNlICovCi1pbnQgd2F0Y2hfcHJpbWFyeSA9IDE7CQkvKiBtb3JlIGRpY2V5LCBwb2xsIGZvciBjaGFuZ2VzIGluIFBSSU1BUlkgKi8KLWludCB3YXRjaF9jbGlwYm9hcmQgPSAxOwotY2hhciAqc2VsX2RpcmVjdGlvbiA9IE5VTEw7CS8qICJzZW5kIiBvciAicmVjdiIgZm9yIG9uZS13YXkgKi8KLQotY2hhciAqc2lncGlwZSA9IE5VTEw7CQkvKiBza2lwLCBpZ25vcmUsIGV4aXQgKi8KLQotLyogdmlzdWFsIHN0dWZmIGZvciAtdmlzdWFsIG92ZXJyaWRlIG9yIC1vdmVybGF5ICovCi1WaXN1YWxJRCB2aXN1YWxfaWQgPSAoVmlzdWFsSUQpIDA7Ci1pbnQgdmlzdWFsX2RlcHRoID0gMDsKLQotLyogZm9yIC1vdmVybGF5IG1vZGUgb24gU29sYXJpcy9JUklYLiAgWCBzZXJ2ZXIgZHJhd3MgY3Vyc29yIGNvcnJlY3RseS4gICovCi1pbnQgb3ZlcmxheSA9IDA7Ci1pbnQgb3ZlcmxheV9jdXJzb3IgPSAxOwotCi0vKiB0aWxlIGhldXJpc3RpY3M6ICovCi1kb3VibGUgZnNfZnJhYyA9IDAuNzU7CS8qIHRocmVzaG9sZCB0aWxlIGZyYWN0aW9uIHRvIGRvIGZ1bGxzY3JlZW4gdXBkYXRlcy4gKi8KLWludCB0aWxlX2Z1enogPSAyOwkvKiB0b2xlcmFuY2UgZm9yIHN1c3BlY3RpbmcgY2hhbmdlZCB0aWxlcyB0b3VjaGluZyAqLwotCQkJLyogYSBrbm93biBjaGFuZ2VkIHRpbGUuICovCi1pbnQgZ3Jvd19maWxsID0gMzsJLyogZG8gdGhlIGdyb3cgaXNsYW5kcyBoZXVyaXN0aWMgd2l0aCB0aGlzIHdpZHRoLiAqLwotaW50IGdhcHNfZmlsbCA9IDQ7CS8qIGRvIGEgZmluYWwgcGFzcyB0byB0cnkgdG8gZmlsbCBnYXBzIGJldHdlZW4gdGlsZXMuICovCi0KLWludCBkZWJ1Z19wb2ludGVyID0gMDsKLWludCBkZWJ1Z19rZXlib2FyZCA9IDA7Ci0KLWludCBxdWlldCA9IDA7Ci1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIHRocmVhZGVkIHZzLiBub24tdGhyZWFkZWQgKGRlZmF1bHQpICovCi1pbnQgdXNlX3RocmVhZHMgPSAwOwotaW50IHN0YXJ0ZWRfcmZiUnVuRXZlbnRMb29wID0gMDsKLWludCB0aHJlYWRzX2Ryb3BfaW5wdXQgPSAwOwotCi0vKiBpbmZvIGFib3V0IGNvbW1hbmQgbGluZSBvcHRzICovCi1pbnQgZ290X25veHdhcnBwb2ludGVyID0gMDsKLWludCBnb3RfcmZicG9ydCA9IDA7Ci1pbnQgZ290X3JmYnBvcnRfdmFsID0gLTE7Ci1pbnQgZ290X2Fsd2F5c3NoYXJlZCA9IDA7Ci1pbnQgZ290X25ldmVyc2hhcmVkID0gMDsKLWludCBnb3RfY3Vyc29ycG9zID0gMDsKLWludCBnb3RfcG9pbnRlcl9tb2RlID0gLTE7Ci1pbnQgZ290X25vdmlld29ubHkgPSAwOwotaW50IGdvdF93aXJlY29weXJlY3QgPSAwOwotaW50IGdvdF9zY3JvbGxjb3B5cmVjdCA9IDA7Ci1pbnQgZ290X25veGtiID0gMDsKLWludCBnb3Rfbm9tb2R0d2VhayA9IDA7Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9vcHRpb25zLmggYi94MTF2bmMvb3B0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDlmNGNlLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9vcHRpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfT1BUSU9OU19ICi0jZGVmaW5lIF9YMTFWTkNfT1BUSU9OU19ICi0KLS8qIC0tIG9wdGlvbnMuaCAtLSAqLwotCi0vKiAKLSAqIHZhcmlhYmxlcyBmb3IgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCi0gKi8KLWV4dGVybiBpbnQgZGVidWc7Ci0KLWV4dGVybiBjaGFyICp1c2VfZHB5OwotZXh0ZXJuIGludCBkaXNwbGF5X047Ci1leHRlcm4gaW50IGF1dG9fcG9ydDsKLWV4dGVybiBjaGFyICphdXRoX2ZpbGU7Ci1leHRlcm4gY2hhciAqdmlzdWFsX3N0cjsKLWV4dGVybiBpbnQgc2V0X3Zpc3VhbF9zdHJfdG9fc29tZXRoaW5nOwotZXh0ZXJuIGNoYXIgKmxvZ2ZpbGU7Ci1leHRlcm4gaW50IGxvZ2ZpbGVfYXBwZW5kOwotZXh0ZXJuIGNoYXIgKmZsYWdmaWxlOwotZXh0ZXJuIGNoYXIgKnJtX2ZsYWdmaWxlOwotZXh0ZXJuIGNoYXIgKnBhc3N3ZGZpbGU7Ci1leHRlcm4gaW50IHVuaXhwdzsKLWV4dGVybiBpbnQgdW5peHB3X25pczsKLWV4dGVybiBjaGFyICp1bml4cHdfbGlzdDsKLWV4dGVybiBjaGFyICp1bml4cHdfY21kOwotZXh0ZXJuIGludCB1bml4cHdfc3lzdGVtX2dyZWV0ZXI7Ci1leHRlcm4gaW50IHVuaXhwd19zeXN0ZW1fZ3JlZXRlcl9hY3RpdmU7Ci1leHRlcm4gaW50IHVzZV9zdHVubmVsOwotZXh0ZXJuIGludCBzdHVubmVsX3BvcnQ7Ci1leHRlcm4gY2hhciAqc3R1bm5lbF9wZW07Ci1leHRlcm4gaW50IHVzZV9vcGVuc3NsOwotZXh0ZXJuIGludCBodHRwX3NzbDsKLWV4dGVybiBpbnQgc3NsX25vX2ZhaWw7Ci1leHRlcm4gY2hhciAqb3BlbnNzbF9wZW07Ci1leHRlcm4gY2hhciAqc3NsX2NlcnRzX2RpcjsKLWV4dGVybiBjaGFyICplbmNfc3RyOwotZXh0ZXJuIGludCB2ZW5jcnlwdF9tb2RlOwotZXh0ZXJuIGludCB2ZW5jcnlwdF9reDsKLWV4dGVybiBpbnQgdmVuY3J5cHRfZW5hYmxlX3BsYWluX2xvZ2luOwotZXh0ZXJuIGludCBhbm9udGxzX21vZGU7Ci1leHRlcm4gaW50IGNyZWF0ZV9mcmVzaF9kaHBhcmFtczsKLWV4dGVybiBjaGFyICpkaHBhcmFtc19maWxlOwotZXh0ZXJuIGludCBodHRwX3RyeV9pdDsKLWV4dGVybiBpbnQgc3R1bm5lbF9odHRwX3BvcnQ7Ci1leHRlcm4gaW50IGh0dHBzX3BvcnRfbnVtOwotZXh0ZXJuIGludCBodHRwc19wb3J0X3JlZGlyOwotZXh0ZXJuIGNoYXIgKnNzbF92ZXJpZnk7Ci1leHRlcm4gY2hhciAqc3NsX2NybDsKLWV4dGVybiBpbnQgc3NsX2luaXRpYWxpemVkOwotZXh0ZXJuIGludCBzc2xfdGltZW91dF9zZWNzOwotZXh0ZXJuIGNoYXIgKnNzaF9zdHI7Ci1leHRlcm4gcGlkX3Qgc3NoX3BpZDsKLWV4dGVybiBpbnQgdXNlcHc7Ci1leHRlcm4gY2hhciAqYmxhY2tvdXRfc3RyOwotZXh0ZXJuIGludCBibGFja291dF9wdHI7Ci1leHRlcm4gY2hhciAqY2xpcF9zdHI7Ci1leHRlcm4gaW50IHVzZV9zb2xpZF9iZzsKLWV4dGVybiBjaGFyICpzb2xpZF9zdHI7Ci1leHRlcm4gY2hhciAqc29saWRfZGVmYXVsdDsKLQotZXh0ZXJuIGNoYXIgKndtZHRfc3RyOwotCi1leHRlcm4gY2hhciAqc3BlZWRzX3N0cjsKLWV4dGVybiBjaGFyICpyY19yY2ZpbGU7Ci1leHRlcm4gaW50IHJjX3JjZmlsZV9kZWZhdWx0OwotZXh0ZXJuIGludCByY19ub3JjOwotZXh0ZXJuIGludCBnb3Rfbm9yYzsKLWV4dGVybiBpbnQgb3B0c19iZzsKLQotZXh0ZXJuIGludCBzaGFyZWQ7Ci1leHRlcm4gaW50IGNvbm5lY3Rfb25jZTsKLWV4dGVybiBpbnQgZ290X2Nvbm5lY3Rfb25jZTsKLWV4dGVybiBpbnQgZ290X2ZpbmRhdXRoOwotZXh0ZXJuIGludCBkZW55X2FsbDsKLWV4dGVybiBpbnQgYWNjZXB0X3JlbW90ZV9jbWRzOwotZXh0ZXJuIGNoYXIgKnJlbW90ZV9wcmVmaXg7Ci1leHRlcm4gaW50IHJlbW90ZV9kaXJlY3Q7Ci1leHRlcm4gaW50IHF1ZXJ5X2RlZmF1bHQ7Ci1leHRlcm4gaW50IHNhZmVfcmVtb3RlX29ubHk7Ci1leHRlcm4gaW50IHByaXZfcmVtb3RlOwotZXh0ZXJuIGludCBtb3JlX3NhZmU7Ci1leHRlcm4gaW50IG5vX2V4dGVybmFsX2NtZHM7Ci1leHRlcm4gY2hhciAqYWxsb3dlZF9leHRlcm5hbF9jbWRzOwotZXh0ZXJuIGludCBzdGFydGVkX2FzX3Jvb3Q7Ci1leHRlcm4gaW50IGhvc3RfbG9va3VwOwotZXh0ZXJuIGNoYXIgKnVuaXhfc29jazsKLWV4dGVybiBpbnQgdW5peF9zb2NrX2ZkOwotZXh0ZXJuIGludCBpcHY2X2xpc3RlbjsKLWV4dGVybiBpbnQgZ290X2lwdjZfbGlzdGVuOwotZXh0ZXJuIGludCBpcHY2X2xpc3Rlbl9mZDsKLWV4dGVybiBpbnQgaXB2Nl9odHRwX2ZkOwotZXh0ZXJuIGludCBub2lwdjY7Ci1leHRlcm4gaW50IG5vaXB2NDsKLWV4dGVybiBjaGFyICppcHY2X2NsaWVudF9pcF9zdHI7Ci1leHRlcm4gY2hhciAqdXNlcnNfbGlzdDsKLWV4dGVybiBjaGFyICoqdXNlcjJncm91cDsKLWV4dGVybiBjaGFyICphbGxvd19saXN0OwotZXh0ZXJuIGNoYXIgKmxpc3Rlbl9zdHI7Ci1leHRlcm4gY2hhciAqbGlzdGVuX3N0cjY7Ci1leHRlcm4gY2hhciAqYWxsb3dfb25jZTsKLWV4dGVybiBjaGFyICphY2NlcHRfY21kOwotZXh0ZXJuIGNoYXIgKmFmdGVyYWNjZXB0X2NtZDsKLWV4dGVybiBjaGFyICpnb25lX2NtZDsKLWV4dGVybiBpbnQgdmlld19vbmx5OwotZXh0ZXJuIGNoYXIgKmFsbG93ZWRfaW5wdXRfdmlld19vbmx5OwotZXh0ZXJuIGNoYXIgKmFsbG93ZWRfaW5wdXRfbm9ybWFsOwotZXh0ZXJuIGNoYXIgKmFsbG93ZWRfaW5wdXRfc3RyOwotZXh0ZXJuIGNoYXIgKnZpZXdvbmx5X3Bhc3N3ZDsKLWV4dGVybiBjaGFyICoqcGFzc3dkX2xpc3Q7Ci1leHRlcm4gaW50IGJlZ2luX3ZpZXdvbmx5OwotZXh0ZXJuIGludCBpbmV0ZDsKLWV4dGVybiBpbnQgdGlnaHRmaWxleGZlcjsgCi1leHRlcm4gaW50IGdvdF91bHRyYWZpbGV4ZmVyOyAKLWV4dGVybiBpbnQgZmlyc3RfY29ubl90aW1lb3V0OwotZXh0ZXJuIGludCBwaW5nX2ludGVydmFsOwotZXh0ZXJuIGludCBmbGFzaF9jbWFwOwotZXh0ZXJuIGludCBzaGlmdF9jbWFwOwotZXh0ZXJuIGludCBmb3JjZV9pbmRleGVkX2NvbG9yOwotZXh0ZXJuIGludCBhZHZlcnRpc2VfdHJ1ZWNvbG9yOwotZXh0ZXJuIGludCBhZHZlcnRpc2VfdHJ1ZWNvbG9yX3Jlc2V0OwotZXh0ZXJuIGludCBjbWFwOHRvMjQ7Ci1leHRlcm4gY2hhciAqY21hcDh0bzI0X3N0cjsKLWV4dGVybiBpbnQgeGZvcm0yNHRvMzI7Ci1leHRlcm4gaW50IGxhdW5jaF9ndWk7Ci0KLWV4dGVybiBpbnQgYXZhaGk7Ci1leHRlcm4gaW50IHZuY19yZWRpcmVjdDsKLWV4dGVybiBpbnQgdm5jX3JlZGlyZWN0X3NvY2s7Ci0KLWV4dGVybiBpbnQgdXNlX21vZGlmaWVyX3R3ZWFrOwotZXh0ZXJuIGludCB3YXRjaF9jYXBzbG9jazsKLWV4dGVybiBpbnQgc2tpcF9sb2Nra2V5czsKLWV4dGVybiBpbnQgdXNlX2lzb19sZXZlbDM7Ci1leHRlcm4gaW50IGNsZWFyX21vZHM7Ci1leHRlcm4gaW50IG5vZmI7Ci1leHRlcm4gY2hhciAqcmF3X2ZiX3N0cjsKLWV4dGVybiBjaGFyICpyYXdfZmJfcGl4Zm10OwotZXh0ZXJuIGNoYXIgKnJhd19mYl9mdWxsX3N0cjsKLWV4dGVybiBjaGFyICpmcmVxdGFiOwotZXh0ZXJuIGNoYXIgKnBpcGVpbnB1dF9zdHI7Ci1leHRlcm4gY2hhciAqcGlwZWlucHV0X29wdHM7Ci1leHRlcm4gRklMRSAqcGlwZWlucHV0X2ZoOwotZXh0ZXJuIGludCBwaXBlaW5wdXRfdGVlOwotZXh0ZXJuIGludCBwaXBlaW5wdXRfaW50OwotZXh0ZXJuIGludCBwaXBlaW5wdXRfY29uc19mZDsKLWV4dGVybiBjaGFyICpwaXBlaW5wdXRfY29uc19kZXY7Ci0KLWV4dGVybiBpbnQgbWFjb3N4X25vZGltbWluZzsKLWV4dGVybiBpbnQgbWFjb3N4X25vc2xlZXA7Ci1leHRlcm4gaW50IG1hY29zeF9ub3NjcmVlbnNhdmVyOwotZXh0ZXJuIGludCBtYWNvc3hfd2FpdF9mb3Jfc3dpdGNoOwotZXh0ZXJuIGludCBtYWNvc3hfbW91c2Vfd2hlZWxfc3BlZWQ7Ci1leHRlcm4gaW50IG1hY29zeF9jb25zb2xlOwotZXh0ZXJuIGludCBtYWNvc3hfc3dhcDIzOwotZXh0ZXJuIGludCBtYWNvc3hfcmVzaXplOwotZXh0ZXJuIGludCBtYWNvc3hfaWNvbl9hbmltX3RpbWU7Ci1leHRlcm4gaW50IG1hY29zeF9ub19vcGVuZ2w7Ci1leHRlcm4gaW50IG1hY29zeF9ub19yYXdmYjsKLWV4dGVybiBpbnQgbWFjb3N4X3JlYWRfb3BlbmdsOwotZXh0ZXJuIGludCBtYWNvc3hfcmVhZF9yYXdmYjsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3Vid2luOwotZXh0ZXJuIGludCBzdWJ3aW5fd2FpdF9tYXBwZWQ7Ci1leHRlcm4gaW50IGZyZWV6ZV93aGVuX29ic2N1cmVkOwotZXh0ZXJuIGludCBzdWJ3aW5fb2JzY3VyZWQ7Ci0KLWV4dGVybiBpbnQgZGVidWdfeGV2ZW50czsKLWV4dGVybiBpbnQgZGVidWdfeGRhbWFnZTsKLWV4dGVybiBpbnQgZGVidWdfd2lyZWZyYW1lOwotZXh0ZXJuIGludCBkZWJ1Z190aWxlczsKLWV4dGVybiBpbnQgZGVidWdfZ3JhYnM7Ci1leHRlcm4gaW50IGRlYnVnX3NlbDsKLQotZXh0ZXJuIGludCB4dHJhcF9pbnB1dDsKLWV4dGVybiBpbnQgeGluZXJhbWE7Ci1leHRlcm4gaW50IHhyYW5kcjsKLWV4dGVybiBpbnQgeHJhbmRyX21heWJlOwotZXh0ZXJuIGNoYXIgKnhyYW5kcl9tb2RlOwotZXh0ZXJuIGNoYXIgKnBhZF9nZW9tZXRyeTsKLWV4dGVybiB0aW1lX3QgcGFkX2dlb21ldHJ5X3RpbWU7Ci1leHRlcm4gaW50IHVzZV9zbmFwZmI7Ci0KLWV4dGVybiBpbnQgdXNlX3hyZWNvcmQ7Ci1leHRlcm4gaW50IG5veHJlY29yZDsKLQotZXh0ZXJuIGNoYXIgKmNsaWVudF9jb25uZWN0OwotZXh0ZXJuIGNoYXIgKmNsaWVudF9jb25uZWN0X2ZpbGU7Ci1leHRlcm4gaW50IGNvbm5lY3Rfb3JfZXhpdDsKLWV4dGVybiBpbnQgdm5jX2Nvbm5lY3Q7Ci1leHRlcm4gY2hhciAqY29ubmVjdF9wcm94eTsKLQotZXh0ZXJuIGludCBzaG93X2N1cnNvcjsKLWV4dGVybiBpbnQgc2hvd19tdWx0aXBsZV9jdXJzb3JzOwotZXh0ZXJuIGNoYXIgKm11bHRpcGxlX2N1cnNvcnNfbW9kZTsKLWV4dGVybiBpbnQgY3Vyc29yX2RyYWdfY2hhbmdlczsKLWV4dGVybiBpbnQgY3Vyc29yX3Bvc191cGRhdGVzOwotZXh0ZXJuIGludCBjdXJzb3Jfc2hhcGVfdXBkYXRlczsKLWV4dGVybiBpbnQgdXNlX3h3YXJwcG9pbnRlcjsKLWV4dGVybiBpbnQgYWx3YXlzX2luamVjdDsKLWV4dGVybiBpbnQgc2hvd19kcmFnZ2luZzsKLWV4dGVybiBpbnQgd2lyZWZyYW1lOwotZXh0ZXJuIGludCB3aXJlZnJhbWVfbG9jYWw7Ci0KLWV4dGVybiBjaGFyICp3aXJlZnJhbWVfc3RyOwotZXh0ZXJuIGNoYXIgKndpcmVmcmFtZV9jb3B5cmVjdDsKLWV4dGVybiBjaGFyICp3aXJlZnJhbWVfY29weXJlY3RfZGVmYXVsdDsKLWV4dGVybiBpbnQgd2lyZWZyYW1lX2luX3Byb2dyZXNzOwotCi1leHRlcm4gaW50IG5jYWNoZTsKLWV4dGVybiBpbnQgbmNhY2hlMDsKLWV4dGVybiBpbnQgbmNhY2hlX2RlZmF1bHQ7Ci1leHRlcm4gaW50IG5jYWNoZV9jb3B5cmVjdDsKLWV4dGVybiBpbnQgbmNhY2hlX3dmX3JhaXNlczsKLWV4dGVybiBpbnQgbmNhY2hlX2R0X2NoYW5nZTsKLWV4dGVybiBpbnQgbmNhY2hlX3BhZDsKLWV4dGVybiBpbnQgbmNhY2hlX3hyb290cG1hcDsKLWV4dGVybiBpbnQgbmNhY2hlX2tlZXBfYW5pbXM7Ci1leHRlcm4gaW50IG5jYWNoZV9vbGRfd207Ci1leHRlcm4gaW50IG1hY29zeF9uY2FjaGVfbWFjbWVudTsKLWV4dGVybiBpbnQgbWFjb3N4X3VzX2tiZDsKLWV4dGVybiBpbnQgbmNhY2hlX2JldGFfdGVzdGVyOwotZXh0ZXJuIGludCBuY2RiOwotCi1leHRlcm4gQXRvbSBhdG9tX05FVF9BQ1RJVkVfV0lORE9XOwotZXh0ZXJuIEF0b20gYXRvbV9ORVRfQ1VSUkVOVF9ERVNLVE9QOwotZXh0ZXJuIEF0b20gYXRvbV9ORVRfQ0xJRU5UX0xJU1RfU1RBQ0tJTkc7Ci1leHRlcm4gQXRvbSBhdG9tX1hST09UUE1BUF9JRDsKLWV4dGVybiBkb3VibGUgZ290X05FVF9BQ1RJVkVfV0lORE9XOwotZXh0ZXJuIGRvdWJsZSBnb3RfTkVUX0NVUlJFTlRfREVTS1RPUDsKLWV4dGVybiBkb3VibGUgZ290X05FVF9DTElFTlRfTElTVF9TVEFDS0lORzsKLWV4dGVybiBkb3VibGUgZ290X1hST09UUE1BUF9JRDsKLQotZXh0ZXJuIGNoYXIgKnNjcm9sbF9jb3B5cmVjdF9zdHI7Ci1leHRlcm4gY2hhciAqc2Nyb2xsX2NvcHlyZWN0OwotZXh0ZXJuIGNoYXIgKnNjcm9sbF9jb3B5cmVjdF9kZWZhdWx0OwotZXh0ZXJuIGNoYXIgKnNjcm9sbF9rZXlfbGlzdF9zdHI7Ci1leHRlcm4gS2V5U3ltICpzY3JvbGxfa2V5X2xpc3Q7Ci0KLWV4dGVybiBpbnQgc2NhbGluZ19jb3B5cmVjdDA7Ci1leHRlcm4gaW50IHNjYWxpbmdfY29weXJlY3Q7Ci0KLWV4dGVybiBpbnQgc2Nyb2xsY29weXJlY3RfbWluX2FyZWE7Ci1leHRlcm4gaW50IGRlYnVnX3Njcm9sbDsKLWV4dGVybiBkb3VibGUgcG9pbnRlcl9mbHVzaF9kZWxheTsKLWV4dGVybiBkb3VibGUgbGFzdF9zY3JvbGxfZXZlbnQ7Ci1leHRlcm4gaW50IG1heF9zY3JvbGxfa2V5cmF0ZTsKLWV4dGVybiBkb3VibGUgbWF4X2tleXJlcGVhdF90aW1lOwotZXh0ZXJuIGNoYXIgKm1heF9rZXlyZXBlYXRfc3RyOwotZXh0ZXJuIGNoYXIgKm1heF9rZXlyZXBlYXRfc3RyMDsKLWV4dGVybiBpbnQgbWF4X2tleXJlcGVhdF9sbywgbWF4X2tleXJlcGVhdF9oaTsKLQotZXh0ZXJuIGNoYXIgKipzY3JvbGxfZ29vZF9hbGw7Ci1leHRlcm4gY2hhciAqKnNjcm9sbF9nb29kX2tleTsKLWV4dGVybiBjaGFyICoqc2Nyb2xsX2dvb2RfbW91c2U7Ci1leHRlcm4gY2hhciAqc2Nyb2xsX2dvb2Rfc3RyOwotZXh0ZXJuIGNoYXIgKnNjcm9sbF9nb29kX3N0cjA7Ci0KLWV4dGVybiBjaGFyICoqc2Nyb2xsX3NraXBfYWxsOwotZXh0ZXJuIGNoYXIgKipzY3JvbGxfc2tpcF9rZXk7Ci1leHRlcm4gY2hhciAqKnNjcm9sbF9za2lwX21vdXNlOwotZXh0ZXJuIGNoYXIgKnNjcm9sbF9za2lwX3N0cjsKLWV4dGVybiBjaGFyICpzY3JvbGxfc2tpcF9zdHIwOwotCi1leHRlcm4gY2hhciAqKnNjcm9sbF90ZXJtOwotZXh0ZXJuIGNoYXIgKnNjcm9sbF90ZXJtX3N0cjsKLWV4dGVybiBjaGFyICpzY3JvbGxfdGVybV9zdHIwOwotCi1leHRlcm4gY2hhciogc2NyZWVuX2ZpeHVwX3N0cjsKLWV4dGVybiBkb3VibGUgc2NyZWVuX2ZpeHVwX1Y7Ci1leHRlcm4gZG91YmxlIHNjcmVlbl9maXh1cF9DOwotZXh0ZXJuIGRvdWJsZSBzY3JlZW5fZml4dXBfWDsKLWV4dGVybiBkb3VibGUgc2NyZWVuX2ZpeHVwXzg7Ci0KLWV4dGVybiBpbnQgbm9fYXV0b3JlcGVhdDsKLWV4dGVybiBpbnQgbm9fcmVwZWF0X2NvdW50ZG93bjsKLWV4dGVybiBpbnQgd2F0Y2hfYmVsbDsKLWV4dGVybiBpbnQgc291bmRfYmVsbDsKLWV4dGVybiBpbnQgeGtiY29tcGF0OwotZXh0ZXJuIGludCB1c2VfeGtiX21vZHR3ZWFrOwotZXh0ZXJuIGludCBza2lwX2R1cGxpY2F0ZV9rZXlfZXZlbnRzOwotZXh0ZXJuIGNoYXIgKnNraXBfa2V5Y29kZXM7Ci1leHRlcm4gaW50IHNsb3BweV9rZXlzOwotZXh0ZXJuIGludCBhZGRfa2V5c3ltczsKLQotZXh0ZXJuIGNoYXIgKnJlbWFwX2ZpbGU7Ci1leHRlcm4gY2hhciAqcG9pbnRlcl9yZW1hcDsKLWV4dGVybiBpbnQgcG9pbnRlcl9tb2RlOwotZXh0ZXJuIGludCBwb2ludGVyX21vZGVfbWF4OwkKLWV4dGVybiBpbnQgc2luZ2xlX2NvcHl0aWxlOwotZXh0ZXJuIGludCBzaW5nbGVfY29weXRpbGVfb3JpZzsKLWV4dGVybiBpbnQgc2luZ2xlX2NvcHl0aWxlX2NvdW50OwotZXh0ZXJuIGludCB0aWxlX3NobV9jb3VudDsKLQotZXh0ZXJuIGludCB1c2luZ19zaG07Ci1leHRlcm4gaW50IGZsaXBfYnl0ZV9vcmRlcjsKLWV4dGVybiBpbnQgd2FpdG1zOwotZXh0ZXJuIGludCBnb3Rfd2FpdG1zOwotZXh0ZXJuIGRvdWJsZSB3YWl0X3VpOwotZXh0ZXJuIGRvdWJsZSBzbG93X2ZiOwotZXh0ZXJuIGRvdWJsZSB4cmVmcmVzaDsKLWV4dGVybiBpbnQgd2FpdF9ib2c7Ci1leHRlcm4gaW50IGV4dHJhX2ZidXI7Ci1leHRlcm4gaW50IGRlZmVyX3VwZGF0ZTsKLWV4dGVybiBpbnQgc2V0X2RlZmVyOwotZXh0ZXJuIGludCBnb3RfZGVmZXI7Ci1leHRlcm4gaW50IGdvdF9kZWZlcnVwZGF0ZTsKLQotZXh0ZXJuIGludCBzY3JlZW5fYmxhbms7Ci0KLWV4dGVybiBpbnQgbm9fZmJ1X2JsYW5rOwotZXh0ZXJuIGludCB0YWtlX25hcHM7Ci1leHRlcm4gaW50IG5hcHRpbGU7Ci1leHRlcm4gaW50IG5hcGZhYzsKLWV4dGVybiBpbnQgbmFwbWF4OwotZXh0ZXJuIGludCB1aV9za2lwOwotZXh0ZXJuIGludCBhbGxfaW5wdXQ7Ci1leHRlcm4gaW50IGhhbmRsZV9ldmVudHNfZWFnZXJseTsKLQotZXh0ZXJuIGludCB3YXRjaF9mYnBtOwotZXh0ZXJuIGludCB3YXRjaF9kcG1zOwotZXh0ZXJuIGludCBmb3JjZV9kcG1zOwotZXh0ZXJuIGludCBjbGllbnRfZHBtczsKLWV4dGVybiBpbnQgbm9fdWx0cmFfZHBtczsKLWV4dGVybiBpbnQgbm9fdWx0cmFfZXh0OwotZXh0ZXJuIGludCBzYXdfdWx0cmFfY2hhdDsKLWV4dGVybiBpbnQgc2F3X3VsdHJhX2ZpbGU7Ci1leHRlcm4gaW50IGNoYXRfd2luZG93OwotZXh0ZXJuIHJmYkNsaWVudFB0ciBjaGF0X3dpbmRvd19jbGllbnQ7Ci0KLWV4dGVybiBpbnQgd2F0Y2hfc2VsZWN0aW9uOwotZXh0ZXJuIGludCB3YXRjaF9wcmltYXJ5OwotZXh0ZXJuIGludCB3YXRjaF9jbGlwYm9hcmQ7Ci1leHRlcm4gY2hhciAqc2VsX2RpcmVjdGlvbjsKLQotZXh0ZXJuIGNoYXIgKnNpZ3BpcGU7Ci0KLWV4dGVybiBWaXN1YWxJRCB2aXN1YWxfaWQ7Ci1leHRlcm4gaW50IHZpc3VhbF9kZXB0aDsKLQotZXh0ZXJuIGludCBvdmVybGF5OwotZXh0ZXJuIGludCBvdmVybGF5X2N1cnNvcjsKLQotZXh0ZXJuIGRvdWJsZSBmc19mcmFjOwotZXh0ZXJuIGludCB0aWxlX2Z1eno7Ci0KLWV4dGVybiBpbnQgZ3Jvd19maWxsOwotZXh0ZXJuIGludCBnYXBzX2ZpbGw7Ci0KLWV4dGVybiBpbnQgZGVidWdfcG9pbnRlcjsKLWV4dGVybiBpbnQgZGVidWdfa2V5Ym9hcmQ7Ci0KLWV4dGVybiBpbnQgcXVpZXQ7Ci1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLWV4dGVybiBpbnQgdXNlX3RocmVhZHM7Ci1leHRlcm4gaW50IHN0YXJ0ZWRfcmZiUnVuRXZlbnRMb29wOwotZXh0ZXJuIGludCB0aHJlYWRzX2Ryb3BfaW5wdXQ7Ci0KLWV4dGVybiBpbnQgZ290X25veHdhcnBwb2ludGVyOwotZXh0ZXJuIGludCBnb3RfcmZicG9ydDsKLWV4dGVybiBpbnQgZ290X3JmYnBvcnRfdmFsOwotZXh0ZXJuIGludCBnb3RfYWx3YXlzc2hhcmVkOwotZXh0ZXJuIGludCBnb3RfbmV2ZXJzaGFyZWQ7Ci1leHRlcm4gaW50IGdvdF9jdXJzb3Jwb3M7Ci1leHRlcm4gaW50IGdvdF9wb2ludGVyX21vZGU7Ci1leHRlcm4gaW50IGdvdF9ub3ZpZXdvbmx5OwotZXh0ZXJuIGludCBnb3Rfd2lyZWNvcHlyZWN0OwotZXh0ZXJuIGludCBnb3Rfc2Nyb2xsY29weXJlY3Q7Ci1leHRlcm4gaW50IGdvdF9ub3hrYjsKLWV4dGVybiBpbnQgZ290X25vbW9kdHdlYWs7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX09QVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3BhcmFtcy5oIGIveDExdm5jL3BhcmFtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY5MGI5Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9wYXJhbXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19QQVJBTVNfSAotI2RlZmluZSBfWDExVk5DX1BBUkFNU19ICi0KLS8qIC0tIHBhcmFtcy5oIC0tICovCi0KLSNkZWZpbmUgSUNPTl9NT0RFX1NPQ0tTIDE2Ci0KLS8qIGhhZCBsdz0zIGZvciBhIGxvbmcgdGltZSAqLwotI2lmbmRlZiBXSVJFRlJBTUVfUEFSTVMKLSNkZWZpbmUgV0lSRUZSQU1FX1BBUk1TICIweGZmLDIsMCwzMis4KzgrOCxhbGwsMC4xNSswLjMwKzUuMCswLjEyNSIKLSNlbmRpZgotCi0jaWZuZGVmIFNDUk9MTF9DT1BZUkVDVF9QQVJNUwotI2RlZmluZSBTQ1JPTExfQ09QWVJFQ1RfUEFSTVMgIjArNjQrMzIrMzIsMC4wMiswLjEwKzAuOSwwLjAzKzAuMDYrMC41KzAuMSs1LjAiCi0jZW5kaWYKLQotI2lmbmRlZiBQT0xMXzhUTzI0X0RFTEFZCi0jZGVmaW5lIFBPTExfOFRPMjRfREVMQVkgMC4wNQotI2VuZGlmCi0KLSNkZWZpbmUgTEFURU5DWTAgMjAgICAgIC8qIDIwbXMgKi8KLSNkZWZpbmUgTkVUUkFURTAgMjAgICAgIC8qIDIwS0Ivc2VjICovCi0KLSNkZWZpbmUgUE9JTlRFUl9NT0RFX05PRkIgMgotCi0vKiBzY2FuIHBhdHRlcm4gaml0dGVyIGZyb20geDByZmJzZXJ2ZXIgKi8KLSNkZWZpbmUgTlNDQU4gMzIKLQotI2RlZmluZSBGQl9DT1BZIDB4MQotI2RlZmluZSBGQl9NT0QgIDB4MgotI2RlZmluZSBGQl9SRVEgIDB4NAotCi0jZGVmaW5lIFZOQ19DT05ORUNUX01BWCAxNjM4NAotI2RlZmluZSBYMTFWTkNfUkVNT1RFX01BWCA2NTUzNgotI2RlZmluZSBQUk9QX01BWCAoMjYyMTQ0TCkKLQotI2RlZmluZSBNQVhOIDI1NgotCi0jZGVmaW5lIFBJUEVJTlBVVF9OT05FCQkweDAKLSNkZWZpbmUgUElQRUlOUFVUX1ZJRAkJMHgxCi0jZGVmaW5lIFBJUEVJTlBVVF9DT05TT0xFCTB4MgotI2RlZmluZSBQSVBFSU5QVVRfVUlOUFVUCTB4MwotI2RlZmluZSBQSVBFSU5QVVRfTUFDT1NYCTB4NAotI2RlZmluZSBQSVBFSU5QVVRfVk5DCQkweDUKLQotI2RlZmluZSBNQVhfQlVUVE9OUyA1Ci0KLSNkZWZpbmUgUk9UQVRFX05PTkUJCTAKLSNkZWZpbmUgUk9UQVRFX1gJCTEKLSNkZWZpbmUgUk9UQVRFX1kJCTIKLSNkZWZpbmUgUk9UQVRFX1hZCQkzCi0jZGVmaW5lIFJPVEFURV85MAkJNAotI2RlZmluZSBST1RBVEVfOTBYCQk1Ci0jZGVmaW5lIFJPVEFURV85MFkJCTYKLSNkZWZpbmUgUk9UQVRFXzI3MAkJNwotCi0jZGVmaW5lIFZFTkNSWVBUX05PTkUJCTAKLSNkZWZpbmUgVkVOQ1JZUFRfU1VQUE9SVAkxCi0jZGVmaW5lIFZFTkNSWVBUX1NPTEUJCTIKLSNkZWZpbmUgVkVOQ1JZUFRfRk9SQ0UJCTMKLQotI2RlZmluZSBWRU5DUllQVF9CT1RICQkwCi0jZGVmaW5lIFZFTkNSWVBUX05PREgJCTEKLSNkZWZpbmUgVkVOQ1JZUFRfTk9YNTA5CQkyCi0KLSNkZWZpbmUgQU5PTlRMU19OT05FCQkwCi0jZGVmaW5lIEFOT05UTFNfU1VQUE9SVAkJMQotI2RlZmluZSBBTk9OVExTX1NPTEUJCTIKLSNkZWZpbmUgQU5PTlRMU19GT1JDRQkJMwotCi0jZW5kaWYgLyogX1gxMVZOQ19QQVJBTVNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3BtLmMgYi94MTF2bmMvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5YzI3Mi4uMDAwMDAwMAotLS0gYS94MTF2bmMvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHBtLmMgLS0gKi8KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0KLXZvaWQgY2hlY2tfcG0odm9pZCk7Ci12b2lkIHNldF9kcG1zX21vZGUoY2hhciAqbW9kZSk7Ci1zdGF0aWMgdm9pZCBjaGVja19mYnBtKHZvaWQpOwotc3RhdGljIHZvaWQgY2hlY2tfZHBtcyh2b2lkKTsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZCUE0KLSNpbmNsdWRlIDxYMTEvWG1kLmg+Ci0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZmJwbS5oPgotI2VuZGlmCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9EUE1TCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZHBtcy5oPgotI2VuZGlmCi0KLXZvaWQgY2hlY2tfcG0odm9pZCkgewotCXN0YXRpYyBpbnQgc2tpcCA9IC0xOwotCWlmIChza2lwIDwgMCkgewotCQlza2lwID0gMDsKLQkJaWYgKGdldGVudigiWDExVk5DX05PX0NIRUNLX1BNIikpIHsKLQkJCXNraXAgPSAxOwotCQl9Ci0JfQotCWlmIChza2lwKSB7Ci0JCXJldHVybjsKLQl9Ci0JY2hlY2tfZmJwbSgpOwotCWNoZWNrX2RwbXMoKTsKLQkvKiBzb21lZGF5IGRwbXMgYWN0aXZpdGllcz8gKi8KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfZmJwbSh2b2lkKSB7Ci0Jc3RhdGljIGludCBpbml0X2ZicG0gPSAwOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZCUE0KLQlzdGF0aWMgaW50IGZicG1fY2FwYWJsZSA9IDA7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2ZicG0gPSAwOwotCWludCBkYiA9IDA7Ci0KLQlDQVJEMTYgbGV2ZWw7Ci0JQk9PTCBlbmFibGVkOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmICghIGluaXRfZmJwbSkgewotCQlpZiAoZ2V0ZW52KCJGQlBNX0RFQlVHIikpIHsKLQkJCWRiID0gYXRvaShnZXRlbnYoIkZCUE1fREVCVUciKSk7Ci0JCX0KLQkJaWYgKEZCUE1DYXBhYmxlKGRweSkpIHsKLQkJCWZicG1fY2FwYWJsZSA9IDE7Ci0JCQlyZmJMb2coIlggZGlzcGxheSBpcyBjYXBhYmxlIG9mIEZCUE0uXG4iKTsKLQkJCWlmICh3YXRjaF9mYnBtKSB7Ci0JCQkJcmZiTG9nKCJQcmV2ZW50aW5nIGxvdy1wb3dlciBGQlBNIG1vZGVzIHdoZW4iCi0JCQkJICAgICIgY2xpZW50cyBhcmUgY29ubmVjdGVkLlxuIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoISByYXdfZmJfc3RyKSB7Ci0JCQkJcmZiTG9nKCJYIGRpc3BsYXkgaXMgbm90IGNhcGFibGUgb2YgRkJQTS5cbiIpOwotCQkJfQotCQkJZmJwbV9jYXBhYmxlID0gMDsKLQkJfQotCQlpbml0X2ZicG0gPSAxOwotCX0KLQotCWlmICghIHdhdGNoX2ZicG0pIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBmYnBtX2NhcGFibGUpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBjbGllbnRfY291bnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodGltZShOVUxMKSA8IGxhc3RfZmJwbSArIDUpIHsKLQkJcmV0dXJuOwotCX0KLQlsYXN0X2ZicG0gPSB0aW1lKE5VTEwpOwotCi0JaWYgKEZCUE1JbmZvKGRweSwgJmxldmVsLCAmZW5hYmxlZCkpIHsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCUE1JbmZvIGxldmVsOiAlZCBlbmFibGVkOiAlZFxuIiwgbGV2ZWwsIGVuYWJsZWQpOwotCi0JCWlmIChlbmFibGVkICYmIGxldmVsICE9IEZCUE1Nb2RlT24pIHsKLQkJCWNoYXIgKmZyb20gPSAidW5rbm93bi1mYnBtLXN0YXRlIjsKLQkJCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCQkJaWYgKGxldmVsID09IEZCUE1Nb2RlU3RhbmRieSkgewotCQkJCWZyb20gPSAiRkJQTU1vZGVTdGFuZGJ5IjsKLQkJCX0gZWxzZSBpZiAobGV2ZWwgPT0gRkJQTU1vZGVTdXNwZW5kKSB7Ci0JCQkJZnJvbSA9ICJGQlBNTW9kZVN1c3BlbmQiOwotCQkJfSBlbHNlIGlmIChsZXZlbCA9PSBGQlBNTW9kZU9mZikgewotCQkJCWZyb20gPSAiRkJQTU1vZGVPZmYiOwotCQkJfQotCi0JCQlyZmJMb2coInN3aXRjaGluZyBGQlBNIHN0YXRlIGZyb20gJXMgdG8gRkJQTU1vZGVPblxuIiwgZnJvbSk7Ci0JCQkKLQkJCUZCUE1Gb3JjZUxldmVsKGRweSwgRkJQTU1vZGVPbik7Ci0JCQotCQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJQTUluZm8gZmFpbGVkLlxuIik7Ci0JfQotI2Vsc2UKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghIGluaXRfZmJwbSkgewotCQlpZiAoISByYXdfZmJfc3RyKSB7Ci0JCQlyZmJMb2coIlggRkJQTSBleHRlbnNpb24gbm90IHN1cHBvcnRlZC5cbiIpOwotCQl9Ci0JCWluaXRfZmJwbSA9IDE7Ci0JfQotI2VuZGlmCi19Ci0KLXZvaWQgc2V0X2RwbXNfbW9kZShjaGFyICptb2RlKSB7Ci0jaWYgTk9fWDExCi0JcmV0dXJuOwotI2Vsc2UKLQlSQVdGQl9SRVRfVk9JRAotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0RQTVMKLQlpZiAoZHB5ICYmIERQTVNDYXBhYmxlKGRweSkpIHsKLQkJQ0FSRDE2IGxldmVsOwotCQlDQVJEMTYgd2FudDsKLQkJQk9PTCBlbmFibGVkOwotCQlpZiAoIXN0cmNtcChtb2RlLCAib2ZmIikpIHsKLQkJCXdhbnQgPSBEUE1TTW9kZU9mZjsKLQkJfSBlbHNlIGlmICghc3RyY21wKG1vZGUsICJvbiIpKSB7Ci0JCQl3YW50ID0gRFBNU01vZGVPbjsKLQkJfSBlbHNlIGlmICghc3RyY21wKG1vZGUsICJzdGFuZGJ5IikpIHsKLQkJCXdhbnQgPSBEUE1TTW9kZVN0YW5kYnk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAic3VzcGVuZCIpKSB7Ci0JCQl3YW50ID0gRFBNU01vZGVTdXNwZW5kOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgImVuYWJsZSIpKSB7Ci0JCQlEUE1TRW5hYmxlKGRweSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAiZGlzYWJsZSIpKSB7Ci0JCQlEUE1TRGlzYWJsZShkcHkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEUE1TSW5mbyhkcHksICZsZXZlbCwgJmVuYWJsZWQpKSB7Ci0JCQljaGFyICpmcm9tID0gInVuayI7Ci0JCQlpZiAoZW5hYmxlZCAmJiBsZXZlbCAhPSB3YW50KSB7Ci0JCQkJWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCQkJCXJmYkxvZygiRFBNU0luZm8gbGV2ZWw6ICVkIGVuYWJsZWQ6ICVkXG4iLCBsZXZlbCwgZW5hYmxlZCk7Ci0JCQkJaWYgKGxldmVsID09IERQTVNNb2RlU3RhbmRieSkgewotCQkJCQlmcm9tID0gIkRQTVNNb2RlU3RhbmRieSI7Ci0JCQkJfSBlbHNlIGlmIChsZXZlbCA9PSBEUE1TTW9kZVN1c3BlbmQpIHsKLQkJCQkJZnJvbSA9ICJEUE1TTW9kZVN1c3BlbmQiOwotCQkJCX0gZWxzZSBpZiAobGV2ZWwgPT0gRFBNU01vZGVPZmYpIHsKLQkJCQkJZnJvbSA9ICJEUE1TTW9kZU9mZiI7Ci0JCQkJfSBlbHNlIGlmIChsZXZlbCA9PSBEUE1TTW9kZU9uKSB7Ci0JCQkJCWZyb20gPSAiRFBNU01vZGVPbiI7Ci0JCQkJfQotCi0JCQkJcmZiTG9nKCJzd2l0Y2hpbmcgRFBNUyBzdGF0ZSBmcm9tICVzIHRvICVzXG4iLCBmcm9tLCBtb2RlKTsKLQkJCQkKLQkJCQlEUE1TRm9yY2VMZXZlbChkcHksIHdhbnQpOwotCQkJCi0JCQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfZHBtcyh2b2lkKSB7Ci0Jc3RhdGljIGludCBpbml0X2RwbXMgPSAwOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0RQTVMKLQlzdGF0aWMgaW50IGRwbXNfY2FwYWJsZSA9IDA7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2RwbXMgPSAwOwotCWludCBkYiA9IDA7Ci0KLQlDQVJEMTYgbGV2ZWw7Ci0JQk9PTCBlbmFibGVkOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmICghIGluaXRfZHBtcykgewotCQlpZiAoZ2V0ZW52KCJEUE1TX0RFQlVHIikpIHsKLQkJCWRiID0gYXRvaShnZXRlbnYoIkRQTVNfREVCVUciKSk7Ci0JCX0KLQkJaWYgKERQTVNDYXBhYmxlKGRweSkpIHsKLQkJCWRwbXNfY2FwYWJsZSA9IDE7Ci0JCQlyZmJMb2coIlggZGlzcGxheSBpcyBjYXBhYmxlIG9mIERQTVMuXG4iKTsKLQkJCWlmICh3YXRjaF9kcG1zKSB7Ci0JCQkJcmZiTG9nKCJQcmV2ZW50aW5nIGxvdy1wb3dlciBEUE1TIG1vZGVzIHdoZW4iCi0JCQkJICAgICIgY2xpZW50cyBhcmUgY29ubmVjdGVkLlxuIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoISByYXdfZmJfc3RyKSB7Ci0JCQkJcmZiTG9nKCJYIGRpc3BsYXkgaXMgbm90IGNhcGFibGUgb2YgRFBNUy5cbiIpOwotCQkJfQotCQkJZHBtc19jYXBhYmxlID0gMDsKLQkJfQotCQlpbml0X2RwbXMgPSAxOwotCX0KLQotCWlmIChmb3JjZV9kcG1zIHx8IChjbGllbnRfZHBtcyAmJiBjbGllbnRfY291bnQpKSB7Ci0JCXN0YXRpYyBpbnQgbGFzdF9lbmFibGUgPSAwOwotCQlpZiAodGltZShOVUxMKSA+IGxhc3RfZW5hYmxlKSB7Ci0JCQlzZXRfZHBtc19tb2RlKCJlbmFibGUiKTsKLQkJCWxhc3RfZW5hYmxlID0gdGltZShOVUxMKTsKLQkJfQotCQlzZXRfZHBtc19tb2RlKCJvZmYiKTsKLQl9Ci0JaWYgKCEgd2F0Y2hfZHBtcykgewotCQlyZXR1cm47Ci0JfQotCWlmICghIGRwbXNfY2FwYWJsZSkgewotCQlyZXR1cm47Ci0JfQotCWlmICghIGNsaWVudF9jb3VudCkgewotCQlyZXR1cm47Ci0JfQotCWlmICh0aW1lKE5VTEwpIDwgbGFzdF9kcG1zICsgNSkgewotCQlyZXR1cm47Ci0JfQotCWxhc3RfZHBtcyA9IHRpbWUoTlVMTCk7Ci0KLQlpZiAoRFBNU0luZm8oZHB5LCAmbGV2ZWwsICZlbmFibGVkKSkgewotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRFBNU0luZm8gbGV2ZWw6ICVkIGVuYWJsZWQ6ICVkXG4iLCBsZXZlbCwgZW5hYmxlZCk7Ci0KLQkJaWYgKGVuYWJsZWQgJiYgbGV2ZWwgIT0gRFBNU01vZGVPbikgewotCQkJY2hhciAqZnJvbSA9ICJ1bmtub3duLWRwbXMtc3RhdGUiOwotCQkJWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCi0JCQlpZiAobGV2ZWwgPT0gRFBNU01vZGVTdGFuZGJ5KSB7Ci0JCQkJZnJvbSA9ICJEUE1TTW9kZVN0YW5kYnkiOwotCQkJfSBlbHNlIGlmIChsZXZlbCA9PSBEUE1TTW9kZVN1c3BlbmQpIHsKLQkJCQlmcm9tID0gIkRQTVNNb2RlU3VzcGVuZCI7Ci0JCQl9IGVsc2UgaWYgKGxldmVsID09IERQTVNNb2RlT2ZmKSB7Ci0JCQkJZnJvbSA9ICJEUE1TTW9kZU9mZiI7Ci0JCQl9Ci0KLQkJCXJmYkxvZygic3dpdGNoaW5nIERQTVMgc3RhdGUgZnJvbSAlcyB0byBEUE1TTW9kZU9uXG4iLCBmcm9tKTsKLQkJCQotCQkJRFBNU0ZvcmNlTGV2ZWwoZHB5LCBEUE1TTW9kZU9uKTsKLQkJCi0JCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJEUE1TSW5mbyBmYWlsZWQuXG4iKTsKLQl9Ci0jZWxzZQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCEgaW5pdF9kcG1zKSB7Ci0JCWlmICghIHJhd19mYl9zdHIpIHsKLQkJCXJmYkxvZygiWCBEUE1TIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCX0KLQkJaW5pdF9kcG1zID0gMTsKLQl9Ci0jZW5kaWYKLX0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3BtLmggYi94MTF2bmMvcG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlZjlhNi4uMDAwMDAwMAotLS0gYS94MTF2bmMvcG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1BNX0gKLSNkZWZpbmUgX1gxMVZOQ19QTV9ICi0KLS8qIC0tIHBtLmggLS0gKi8KLWV4dGVybiB2b2lkIGNoZWNrX3BtKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X2RwbXNfbW9kZShjaGFyICptb2RlKTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfUE1fSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3BvaW50ZXIuYyBiL3gxMXZuYy9wb2ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTk1YzMuLjAwMDAwMDAKLS0tIGEveDExdm5jL3BvaW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDYgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBwb2ludGVyLmMgLS0gKi8KLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgInh3cmFwcGVycy5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAieGluZXJhbWEuaCIKLSNpbmNsdWRlICJ4cmVjb3JkLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAiY3Vyc29yLmgiCi0jaW5jbHVkZSAidXNlcmlucHV0LmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAidjRsLmgiCi0jaW5jbHVkZSAibGludXhmYi5oIgotI2luY2x1ZGUgInVpbnB1dC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJtYWNvc3guaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLQotaW50IHBvaW50ZXJfcXVldWVkX3NlbnQgPSAwOwotCi12b2lkIGluaXRpYWxpemVfcG9pbnRlcl9tYXAoY2hhciAqcG9pbnRlcl9yZW1hcCk7Ci12b2lkIGRvX2J1dHRvbl9tYXNrX2NoYW5nZShpbnQgbWFzaywgaW50IGJ1dHRvbik7Ci12b2lkIHBvaW50ZXJfZXZlbnQoaW50IG1hc2ssIGludCB4LCBpbnQgeSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci12b2lkIGluaXRpYWxpemVfcGlwZWlucHV0KHZvaWQpOwotaW50IGNoZWNrX3BpcGVpbnB1dCh2b2lkKTsKLXZvaWQgdXBkYXRlX3gxMV9wb2ludGVyX3Bvc2l0aW9uKGludCB4LCBpbnQgeSk7Ci0KLQotc3RhdGljIHZvaWQgYnV0dG9ucGFyc2UoaW50IGZyb20sIGNoYXIgKipzKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV94MTFfcG9pbnRlcl9tYXNrKGludCBtYXNrKTsKLXN0YXRpYyB2b2lkIHBpcGVfcG9pbnRlcihpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLQotLyoKLSAqIHBvaW50ZXIgZXZlbnQgKG1vdGlvbiBhbmQgYnV0dG9uIGNsaWNrKSBoYW5kbGluZyByb3V0aW5lcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcHRycmVtYXAgewotCUtleVN5bSBrZXlzeW07Ci0JS2V5Q29kZSBrZXljb2RlOwotCWludCBlbmQ7Ci0JaW50IGJ1dHRvbjsKLQlpbnQgZG93bjsKLQlpbnQgdXA7Ci19IHBydHJlbWFwX3Q7Ci0KLSNkZWZpbmUgTUFYX0JVVFRPTl9FVkVOVFMgNTAKLXN0YXRpYyBwcnRyZW1hcF90IHBvaW50ZXJfbWFwW01BWF9CVVRUT05TKzFdW01BWF9CVVRUT05fRVZFTlRTXTsKLQotLyoKLSAqIEZvciBwYXJzaW5nIHRoZSAtYnV0dG9ubWFwIHNlY3Rpb25zLCBlLmcuICI0IiBvciAiOlVwK1VwK1VwOiIKLSAqLwotc3RhdGljIHZvaWQgYnV0dG9ucGFyc2UoaW50IGZyb20sIGNoYXIgKipzKSB7Ci0jaWYgKDAgJiYgTk9fWDExKQotCWlmICghZnJvbSB8fCAhcykge30KLQlyZXR1cm47Ci0jZWxzZQotCWNoYXIgKnE7Ci0JaW50IHRvLCBpOwotCWludCBtb2Rpc2Rvd25bMjU2XTsKLQotCXEgPSAqczsKLQotCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCW1vZGlzZG93bltpXSA9IDA7Ci0JfQotCi0JaWYgKCpxID09ICc6JykgewotCQkvKiA6c3ltMStzeW0yKy4uLitzeW1OOiBmb3JtYXQgKi8KLQkJaW50IGwgPSAwLCBuID0gMDsKLQkJY2hhciBsaXN0WzEwMDBdOwotCQljaGFyICp0LCAqa3AgPSBxICsgMTsKLQkJS2V5Q29kZSBrY29kZTsKLQotCQl3aGlsZSAoKihrcCtsKSAhPSAnOicgJiYgKihrcCtsKSAhPSAnXDAnKSB7Ci0JCQkvKiBsb29wIHRvIHRoZSBtYXRjaGluZyAnOicgKi8KLQkJCWwrKzsKLQkJCWlmIChsID49IDEwMDApIHsKLQkJCQlyZmJMb2coImJ1dHRvbnBhcnNlOiBrZXlzeW0gbGlzdCB0b28gbG9uZzogIgotCQkJCSAgICAiJXNcbiIsIHEpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCSooa3ArbCkgPSAnXDAnOwotCQlzdHJuY3B5KGxpc3QsIGtwLCBsKTsKLQkJbGlzdFtsXSA9ICdcMCc7Ci0JCXJmYkxvZygicmVtYXAgYnV0dG9uICVkIHVzaW5nIFwiJXNcIlxuIiwgZnJvbSwgbGlzdCk7Ci0KLQkJLyogbG9vcCBvdmVyIHRva2VucyBzZXBhcmF0ZWQgYnkgJysnICovCi0JCXQgPSBzdHJ0b2sobGlzdCwgIisiKTsKLQkJd2hpbGUgKHQpIHsKLQkJCUtleVN5bSBrc3ltOwotCQkJdW5zaWduZWQgaW50IHVpOwotCQkJaW50IGk7Ci0JCQlpZiAobiA+PSBNQVhfQlVUVE9OX0VWRU5UUyAtIDIwKSB7Ci0JCQkJcmZiTG9nKCJidXR0b25wYXJzZTogdG9vIG1hbnkgYnV0dG9uIG1hcCAiCi0JCQkJCSJldmVudHM6ICVzXG4iLCBsaXN0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzc2NhbmYodCwgIjB4JXgiLCAmdWkpID09IDEpIHsKLQkJCQlrc3ltID0gKEtleVN5bSkgdWk7CS8qIGhleCB2YWx1ZSAqLwotCQkJfSBlbHNlIHsKLQkJCQlYX0xPQ0s7Ci0JCQkJa3N5bSA9IFhTdHJpbmdUb0tleXN5bSh0KTsgLyogc3RyaW5nIHZhbHVlICovCi0JCQkJWF9VTkxPQ0s7Ci0JCQl9Ci0JCQlpZiAoa3N5bSA9PSBOb1N5bWJvbCkgewotCQkJCS8qIHNlZSBpZiBCdXR0b248Tj4gImtleXN5bSIgd2FzIHVzZWQ6ICovCi0JCQkJaWYgKHNzY2FuZih0LCAiQnV0dG9uJWQiLCAmaSkgPT0gMSkgewotCQkJCQlyZmJMb2coIiAgIGV2ZW50ICVkOiBidXR0b24gJWRcbiIsCi0JCQkJCSAgICBmcm9tLCBuKzEsIGkpOwotCQkJCQlpZiAoaSA9PSAwKSBpID0gLTE7IC8qIGJhaCAqLwotCQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5rZXlzeW0gID0gTm9TeW1ib2w7Ci0JCQkJCXBvaW50ZXJfbWFwW2Zyb21dW25dLmtleWNvZGUgPSBOb1N5bWJvbDsKLQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0uYnV0dG9uID0gaTsKLQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0uZW5kICAgID0gMDsKLQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0uZG93biAgID0gMDsKLQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0udXAgICAgID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZmJMb2coImJ1dHRvbnBhcnNlOiBpZ25vcmluZyB1bmtub3duICIKLQkJCQkJICAgICJrZXlzeW06ICVzXG4iLCB0KTsKLQkJCQkJbi0tOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZHB5KSB7Ci0JCQkJLyoKLQkJCQkgKiBYWFggbWF5IG5vdCB3b3JrIHdpdGggLW1vZHR3ZWFrIG9yIC14a2IKLQkJCQkgKi8KLQkJCQljaGFyICpzdHI7Ci0JCQkJWF9MT0NLOwotI2lmIE5PX1gxMQotCQkJCWtjb2RlID0gTm9TeW1ib2w7Ci0jZWxzZQotCQkJCWtjb2RlID0gWEtleXN5bVRvS2V5Y29kZShkcHksIGtzeW0pOwotI2VuZGlmCi0KLQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5rZXlzeW0gID0ga3N5bTsKLQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5rZXljb2RlID0ga2NvZGU7Ci0JCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0uYnV0dG9uID0gMDsKLQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5lbmQgICAgPSAwOwotCQkJCWlmICghIGlzbW9ka2V5KGtzeW0pICkgewotCQkJCQkvKiBkbyBib3RoIGRvd24gdGhlbiB1cCAqLwotCQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5kb3duID0gMTsKLQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0udXAgICA9IDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG1vZGlzZG93bltrY29kZV0pIHsKLQkJCQkJCXBvaW50ZXJfbWFwW2Zyb21dW25dLmRvd24gPSAwOwotCQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0udXAgICA9IDE7Ci0JCQkJCQltb2Rpc2Rvd25ba2NvZGVdID0gMDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBvaW50ZXJfbWFwW2Zyb21dW25dLmRvd24gPSAxOwotCQkJCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0udXAgICA9IDA7Ci0JCQkJCQltb2Rpc2Rvd25ba2NvZGVdID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa3N5bSk7Ci0JCQkJcmZiTG9nKCIgICBldmVudCAlZDoga2V5c3ltICVzICgweCV4KSAtPiAiCi0JCQkJICAgICJrZXljb2RlIDB4JXggZG93bj0lZCB1cD0lZFxuIiwgbisxLAotCQkJCSAgICBzdHIgPyBzdHIgOiAibnVsbCIsIGtzeW0sIGtjb2RlLAotCQkJCSAgICBwb2ludGVyX21hcFtmcm9tXVtuXS5kb3duLAotCQkJCSAgICBwb2ludGVyX21hcFtmcm9tXVtuXS51cCk7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQl9Ci0JCQl0ID0gc3RydG9rKE5VTEwsICIrIik7Ci0JCQluKys7Ci0JCX0KLQotCQkvKiB3ZSBtdXN0IHJlbGVhc2UgYW55IG1vZGlmaWVycyB0aGF0IGFyZSBzdGlsbCBkb3duOiAqLwotCQlmb3IgKGk9MDsgaTwyNTY7IGkrKykgewotCQkJa2NvZGUgPSAoS2V5Q29kZSkgaTsKLQkJCWlmIChuID49IE1BWF9CVVRUT05fRVZFTlRTKSB7Ci0JCQkJcmZiTG9nKCJidXR0b25wYXJzZTogdG9vIG1hbnkgYnV0dG9uIG1hcCAiCi0JCQkJCSJldmVudHM6ICVzXG4iLCBsaXN0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChtb2Rpc2Rvd25ba2NvZGVdKSB7Ci0JCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0ua2V5c3ltICA9IE5vU3ltYm9sOwotCQkJCXBvaW50ZXJfbWFwW2Zyb21dW25dLmtleWNvZGUgPSBrY29kZTsKLQkJCQlwb2ludGVyX21hcFtmcm9tXVtuXS5idXR0b24gPSAwOwotCQkJCXBvaW50ZXJfbWFwW2Zyb21dW25dLmVuZCAgICA9IDA7Ci0JCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0uZG93biA9IDA7Ci0JCQkJcG9pbnRlcl9tYXBbZnJvbV1bbl0udXAgICA9IDE7Ci0JCQkJbW9kaXNkb3duW2tjb2RlXSA9IDA7Ci0JCQkJbisrOwotCQkJfQotCQl9Ci0KLQkJLyogYWR2YW5jZSB0aGUgc291cmNlIHBvaW50ZXIgcG9zaXRpb24gKi8KLQkJKCpzKSArPSBsKzI7Ci0JfSBlbHNlIHsKLQkJLyogc2luZ2xlIGRpZ2l0IGZvcm1hdCAqLwotCQljaGFyIHN0clsyXTsKLQkJc3RyWzBdID0gKnE7Ci0JCXN0clsxXSA9ICdcMCc7Ci0KLQkJdG8gPSBhdG9pKHN0cik7Ci0JCWlmICh0byA8IDEpIHsKLQkJCXJmYkxvZygic2tpcHBpbmcgaW52YWxpZCByZW1hcCBidXR0b24gXCIlZFwiIGZvciBidXR0b24iCi0JCQkgICAgIiAlZCBmcm9tIHN0cmluZyBcIiVzXCJcbiIsCi0JCQkgICAgdG8sIGZyb20sIHN0cik7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbWFwIGJ1dHRvbiAlZCB1c2luZyBcIiVzXCJcbiIsIGZyb20sIHN0cik7Ci0JCQlyZmJMb2coIiAgIGJ1dHRvbjogJWQgLT4gJWRcbiIsIGZyb20sIHRvKTsKLQkJCXBvaW50ZXJfbWFwW2Zyb21dWzBdLmtleXN5bSAgPSBOb1N5bWJvbDsKLQkJCXBvaW50ZXJfbWFwW2Zyb21dWzBdLmtleWNvZGUgPSBOb1N5bWJvbDsKLQkJCXBvaW50ZXJfbWFwW2Zyb21dWzBdLmJ1dHRvbiA9IHRvOwotCQkJcG9pbnRlcl9tYXBbZnJvbV1bMF0uZW5kICAgID0gMDsKLQkJCXBvaW50ZXJfbWFwW2Zyb21dWzBdLmRvd24gICA9IDA7Ci0JCQlwb2ludGVyX21hcFtmcm9tXVswXS51cCAgICAgPSAwOwotCQl9Ci0JCS8qIGFkdmFuY2UgdGhlIHNvdXJjZSBwb2ludGVyIHBvc2l0aW9uICovCi0JCSgqcykrKzsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBwcm9jZXNzIHRoZSAtYnV0dG9ubWFwIHN0cmluZwotICovCi12b2lkIGluaXRpYWxpemVfcG9pbnRlcl9tYXAoY2hhciAqcG9pbnRlcl9yZW1hcCkgewotCXVuc2lnbmVkIGNoYXIgbWFwW01BWF9CVVRUT05TXTsKLQlpbnQgaSwgazsKLQkvKgotCSAqIFRoaXMgcm91dGluZSBjb3VudHMgdGhlIG51bWJlciBvZiBwb2ludGVyIGJ1dHRvbnMgb24gdGhlIFgKLQkgKiBzZXJ2ZXIgKHRvIGF2b2lkIHByb2JsZW1zLCBldmVuIGNyYXNoZXMsIGlmIGEgY2xpZW50IGhhcyBtb3JlCi0JICogYnV0dG9ucykuICBBbmQgYWxzbyBpbml0aWFsaXplcyBhbnkgcG9pbnRlciBidXR0b24gcmVtYXBwaW5nCi0JICogZnJvbSAtYnV0dG9ubWFwIG9wdGlvbi4KLQkgKi8KLQkKLQlpZiAoIXJhd19mYl9zdHIpIHsKLSNpZiBOT19YMTEKLQkJbnVtX2J1dHRvbnMgPSA1OwotI2Vsc2UKLQkJWF9MT0NLOwotCQludW1fYnV0dG9ucyA9IFhHZXRQb2ludGVyTWFwcGluZyhkcHksIG1hcCwgTUFYX0JVVFRPTlMpOwotCQlYX1VOTE9DSzsKLQkJcmZiTG9nKCJUaGUgWCBzZXJ2ZXIgc2F5cyB0aGVyZSBhcmUgJWQgbW91c2UgYnV0dG9ucy5cbiIsIG51bV9idXR0b25zKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCW51bV9idXR0b25zID0gNTsKLQkJcmZiTG9nKCJNYW51YWxseSBzZXQgbnVtX2J1dHRvbnMgdG86ICVkXG4iLCBudW1fYnV0dG9ucyk7Ci0JfQotCi0JaWYgKG51bV9idXR0b25zIDwgMCkgewotCQludW1fYnV0dG9ucyA9IDA7Ci0JfQotCi0JLyogRklYTUU6IHNob3VsZCB1c2UgaW5mbyBpbiBtYXBbXSAqLwotCWZvciAoaT0xOyBpPD0gTUFYX0JVVFRPTlM7IGkrKykgewotCQlmb3IgKGs9MDsgayA8IE1BWF9CVVRUT05fRVZFTlRTOyBrKyspIHsKLQkJCXBvaW50ZXJfbWFwW2ldW2tdLmVuZCA9IDE7Ci0JCX0KLQkJcG9pbnRlcl9tYXBbaV1bMF0ua2V5c3ltICA9IE5vU3ltYm9sOwotCQlwb2ludGVyX21hcFtpXVswXS5rZXljb2RlID0gTm9TeW1ib2w7Ci0JCXBvaW50ZXJfbWFwW2ldWzBdLmJ1dHRvbiA9IGk7Ci0JCXBvaW50ZXJfbWFwW2ldWzBdLmVuZCAgICA9IDA7Ci0JCXBvaW50ZXJfbWFwW2ldWzBdLmRvd24gICA9IDA7Ci0JCXBvaW50ZXJfbWFwW2ldWzBdLnVwICAgICA9IDA7Ci0JfQotCi0JaWYgKHBvaW50ZXJfcmVtYXAgJiYgKnBvaW50ZXJfcmVtYXAgIT0gJ1wwJykgewotCQkvKiAtYnV0dG9ubWFwLCBmb3JtYXQgaXMgbGlrZTogMTItMjE9MiAqLwotCQljaGFyICpwLCAqcSwgKnJlbWFwID0gc3RyZHVwKHBvaW50ZXJfcmVtYXApOwkKLQkJaW50IG47Ci0KLQkJaWYgKChwID0gc3RyY2hyKHJlbWFwLCAnPScpKSAhPSBOVUxMKSB7Ci0JCQkvKiB1bmRvY3VtZW50ZWQgbWF4IGJ1dHRvbiBudW1iZXIgKi8KLQkJCW4gPSBhdG9pKHArMSk7CQotCQkJKnAgPSAnXDAnOwotCQkJaWYgKG4gPCBudW1fYnV0dG9ucyB8fCBudW1fYnV0dG9ucyA9PSAwKSB7Ci0JCQkJbnVtX2J1dHRvbnMgPSBuOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIndhcm5pbmc6IGluY3JlYXNpbmcgbnVtYmVyIG9mIG1vdXNlICIKLQkJCQkgICAgImJ1dHRvbnMgZnJvbSAlZCB0byAlZFxuIiwgbnVtX2J1dHRvbnMsIG4pOwotCQkJCW51bV9idXR0b25zID0gbjsKLQkJCX0KLQkJfQotCQlpZiAoKHEgPSBzdHJjaHIocmVtYXAsICctJykpICE9IE5VTEwpIHsKLQkJCS8qCi0JCQkgKiBUaGUgJy0nIHNlcGFyYXRlcyB0aGUgJ2Zyb20nIGFuZCAndG8nIGxpc3RzLAotCQkJICogdGhlbiBpdCBpcyBraW5kIG9mIGxpa2UgdHIoMSkuICAKLQkJCSAqLwotCQkJY2hhciBzdHJbMl07Ci0JCQlpbnQgZnJvbTsKLQotCQkJcmZiTG9nKCJyZW1hcHBpbmcgcG9pbnRlciBidXR0b25zIHVzaW5nIHN0cmluZzpcbiIpOwotCQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIHJlbWFwKTsKLQotCQkJcCA9IHJlbWFwOwotCQkJcSsrOwotCQkJaSA9IDA7Ci0JCQlzdHJbMV0gPSAnXDAnOwotCQkJd2hpbGUgKCpwICE9ICctJykgewotCQkJCXN0clswXSA9ICpwOwotCQkJCWZyb20gPSBhdG9pKHN0cik7Ci0JCQkJYnV0dG9ucGFyc2UoZnJvbSwgJnEpOwotCQkJCXArKzsKLQkJCX0KLQkJfQotCQlmcmVlKHJlbWFwKTsKLQl9Ci19Ci0KLS8qCi0gKiBTZW5kIGEgcG9pbnRlciBwb3NpdGlvbiBldmVudCB0byB0aGUgWCBzZXJ2ZXIuCi0gKi8KLXZvaWQgdXBkYXRlX3gxMV9wb2ludGVyX3Bvc2l0aW9uKGludCB4LCBpbnQgeSkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCF4IHx8ICF5KSB7fQotCXJldHVybjsKLSNlbHNlCi0JaW50IHJjOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCVhfTE9DSzsKLQlpZiAoIWFsd2F5c19pbmplY3QgJiYgY3Vyc29yX3ggPT0geCAmJiBjdXJzb3JfeSA9PSB5KSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHVzZV94d2FycHBvaW50ZXIpIHsKLQkJLyoKLQkJICogb2ZmX3ggYW5kIG9mZl95IG5vdCBuZWVkZWQgd2l0aCBYV2FycFBvaW50ZXIgc2luY2UKLQkJICogd2luZG93IGlzIHVzZWQ6Ci0JCSAqLwotCQlYV2FycFBvaW50ZXIoZHB5LCBOb25lLCB3aW5kb3csIDAsIDAsIDAsIDAsIHggKyBjb2ZmX3gsCi0JCSAgICB5ICsgY29mZl95KTsKLQl9IGVsc2UgewotCQlYVGVzdEZha2VNb3Rpb25FdmVudF93cihkcHksIHNjciwgeCArIG9mZl94ICsgY29mZl94LAotCQkgICAgeSArIG9mZl95ICsgY29mZl95LCBDdXJyZW50VGltZSk7Ci0JfQotCVhfVU5MT0NLOwotCi0JaWYgKGN1cnNvcl94ICE9IHggfHwgY3Vyc29yX3kgIT0geSkgewotCQlsYXN0X3BvaW50ZXJfbW90aW9uX3RpbWUgPSBkbm93KCk7Ci0JfQotCi0JY3Vyc29yX3ggPSB4OwotCWN1cnNvcl95ID0geTsKLQotCS8qIHJlY29yZCB0aGUgeCwgeSBwb3NpdGlvbiBmb3IgdGhlIHJmYiBzY3JlZW4gYXMgd2VsbC4gKi8KLQljdXJzb3JfcG9zaXRpb24oeCwgeSk7Ci0KLQkvKiBjaGFuZ2UgdGhlIGN1cnNvciBzaGFwZSBpZiBuZWNlc3NhcnkgKi8KLQlyYyA9IHNldF9jdXJzb3IoeCwgeSwgZ2V0X3doaWNoX2N1cnNvcigpKTsKLQljdXJzb3JfY2hhbmdlcyArPSByYzsKLQotCWxhc3RfZXZlbnQgPSBsYXN0X2lucHV0ID0gbGFzdF9wb2ludGVyX2lucHV0ID0gdGltZShOVUxMKTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBkb19idXR0b25fbWFza19jaGFuZ2UoaW50IG1hc2ssIGludCBidXR0b24pIHsKLSNpZiBOT19YMTEKLQlpZiAoIW1hc2sgfHwgIWJ1dHRvbikge30KLQlyZXR1cm47Ci0jZWxzZQotCWludCBtYiwgaywgaSA9IGJ1dHRvbi0xOwotCi0JLyoKLQkgKiB0aGlzIGV4cGFuZHMgdG8gYW55IHBvaW50ZXJfbWFwIGJ1dHRvbiAtPiBrZXlzdHJva2VzCi0JICogcmVtYXBwaW5ncy4gIFVzdWFsbHkganVzdCBrPTAgYW5kIHdlIHNlbmQgb25lIGJ1dHRvbiBldmVudC4KLQkgKi8KLQlmb3IgKGs9MDsgayA8IE1BWF9CVVRUT05fRVZFTlRTOyBrKyspIHsKLQkJaW50IGJtYXNrID0gKG1hc2sgJiAoMTw8aSkpOwotCi0JCWlmIChwb2ludGVyX21hcFtpKzFdW2tdLmVuZCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocG9pbnRlcl9tYXBbaSsxXVtrXS5idXR0b24pIHsKLQkJCS8qIHNlbmQgYnV0dG9uIHVwIG9yIGRvd24gKi8KLQotCQkJbWIgPSBwb2ludGVyX21hcFtpKzFdW2tdLmJ1dHRvbjsKLQkJCWlmICgobnVtX2J1dHRvbnMgJiYgbWIgPiBudW1fYnV0dG9ucykgfHwgbWIgPCAxKSB7Ci0JCQkJcmZiTG9nKCJpZ25vcmluZyBtb3VzZSBidXR0b24gb3V0IG9mICIKLQkJCQkgICAgImJvdW5kczogJWQ+JWQgbWFzazogMHgleCAtPiAweCV4XG4iLAotCQkJCSAgICBtYiwgbnVtX2J1dHRvbnMsIGJ1dHRvbl9tYXNrLCBtYXNrKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCQkJcmZiTG9nKCJwb2ludGVyKCk6IHNlbmRpbmcgYnV0dG9uICVkIgotCQkJCSAgICAiICVzIChldmVudCAlZClcbiIsIG1iLCBibWFzawotCQkJCSAgICA/ICJkb3duIiA6ICJ1cCIsIGsrMSk7Ci0JCQl9Ci0JCQlYVGVzdEZha2VCdXR0b25FdmVudF93cihkcHksIG1iLCAobWFzayAmICgxPDxpKSkKLQkJCSAgICA/IFRydWUgOiBGYWxzZSwgQ3VycmVudFRpbWUpOwotCQl9IGVsc2UgewotCQkJLyogc2VuZCBrZXlzeW0gdXAgb3IgZG93biAqLwotCQkJS2V5Q29kZSBrZXkgPSBwb2ludGVyX21hcFtpKzFdW2tdLmtleWNvZGU7Ci0JCQlpbnQgdXAgICA9IHBvaW50ZXJfbWFwW2krMV1ba10udXA7Ci0JCQlpbnQgZG93biA9IHBvaW50ZXJfbWFwW2krMV1ba10uZG93bjsKLQotCQkJaWYgKCEgYm1hc2spIHsKLQkJCQkvKiBkbyBub3Qgc2VuZCBrZXlzeW0gb24gYnV0dG9uIHVwICovCi0JCQkJY29udGludWU7IAotCQkJfQotCQkJaWYgKGRlYnVnX3BvaW50ZXIgJiYgZHB5KSB7Ci0JCQkJY2hhciAqc3RyID0gWEtleXN5bVRvU3RyaW5nKFhLZXljb2RlVG9LZXlzeW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksIGtleSwgMCkpOwotCQkJCXJmYkxvZygicG9pbnRlcigpOiBzZW5kaW5nIGJ1dHRvbiAlZCAiCi0JCQkJICAgICJkb3duIGFzIGtleWNvZGUgMHgleCAoZXZlbnQgJWQpXG4iLAotCQkJCSAgICBpKzEsIGtleSwgaysxKTsKLQkJCQlyZmJMb2coIiAgICAgICAgICAgZG93bj0lZCB1cD0lZCBrZXlzeW06ICIKLQkJCQkgICAgIiVzXG4iLCBkb3duLCB1cCwgc3RyID8gc3RyIDogIm51bGwiKTsKLQkJCX0KLQkJCWlmIChkb3duKSB7Ci0JCQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBrZXksIFRydWUsCi0JCQkJICAgIEN1cnJlbnRUaW1lKTsKLQkJCX0KLQkJCWlmICh1cCkgewotCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwga2V5LCBGYWxzZSwKLQkJCQkgICAgQ3VycmVudFRpbWUpOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0vKgotICogU2VuZCBhIHBvaW50ZXIgYnV0dG9uIGV2ZW50IHRvIHRoZSBYIHNlcnZlci4KLSAqLwotc3RhdGljIHZvaWQgdXBkYXRlX3gxMV9wb2ludGVyX21hc2soaW50IG1hc2spIHsKLSNpZiBOT19YMTEKLQlsYXN0X2V2ZW50ID0gbGFzdF9pbnB1dCA9IGxhc3RfcG9pbnRlcl9pbnB1dCA9IHRpbWUoTlVMTCk7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCWlmICghbWFzaykge30KLQlyZXR1cm47Ci0jZWxzZQotCWludCBzbmFwcGVkID0gMCwgeHJfbW91c2UgPSAxLCBpOwotCWxhc3RfZXZlbnQgPSBsYXN0X2lucHV0ID0gbGFzdF9wb2ludGVyX2lucHV0ID0gdGltZShOVUxMKTsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAobWFzayAhPSBidXR0b25fbWFzaykgewotCQlsYXN0X3BvaW50ZXJfY2xpY2tfdGltZSA9IGRub3coKTsKLQl9Ci0KLQlpZiAobm9mYikgewotCQl4cl9tb3VzZSA9IDA7Ci0JfSBlbHNlIGlmICghc3RyY21wKHNjcm9sbF9jb3B5cmVjdCwgIm5ldmVyIikpIHsKLQkJeHJfbW91c2UgPSAwOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzY3JvbGxfY29weXJlY3QsICJrZXlzIikpIHsKLQkJeHJfbW91c2UgPSAwOwotCX0gZWxzZSBpZiAoc2tpcF9jcl93aGVuX3NjYWxpbmcoInNjcm9sbCIpKSB7Ci0JCXhyX21vdXNlID0gMDsKLQl9IGVsc2UgaWYgKHhyZWNvcmRfc2tpcF9idXR0b24obWFzaywgYnV0dG9uX21hc2spKSB7Ci0JCXhyX21vdXNlID0gMDsKLQl9Ci0KLQlpZiAobWFzayAmJiB1c2VfeHJlY29yZCAmJiAhIHhyZWNvcmRpbmcgJiYgeHJfbW91c2UpIHsKLQkJc3RhdGljIGludCBweCwgcHksIHgsIHksIHcsIGgsIGdvdF93bV9mcmFtZTsKLQkJc3RhdGljIFhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JCVdpbmRvdyBmcmFtZSA9IE5vbmUsIG13aW4gPSBOb25lOwotCQlpbnQgc2tpcCA9IDA7Ci0KLQkJaWYgKCFidXR0b25fbWFzaykgewotCQkJWF9MT0NLOwotCQkJaWYgKGdldF93bV9mcmFtZV9wb3MoJnB4LCAmcHksICZ4LCAmeSwgJncsICZoLAotCQkJICAgICZmcmFtZSwgJm13aW4pKSB7Ci0JCQkJZ290X3dtX2ZyYW1lID0gMTsKLWlmIChkZWJ1Z19zY3JvbGwgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIndtX3dpbjogMHglbHhcbiIsIG13aW4pOwotCQkJCWlmIChtd2luICE9IE5vbmUpIHsKLQkJCQkJaWYgKCF2YWxpZF93aW5kb3cobXdpbiwgJmF0dHIsIDEpKSB7Ci0JCQkJCQltd2luID0gTm9uZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ290X3dtX2ZyYW1lID0gMDsKLQkJCX0KLQkJCVhfVU5MT0NLOwotCQl9Ci0JCWlmIChnb3Rfd21fZnJhbWUpIHsKLQkJCWlmICh3aXJlZnJhbWUgJiYgbmVhcl93bV9lZGdlKHgsIHksIHcsIGgsIHB4LCBweSkpIHsKLQkJCQkvKiBzdGVwIG91dCBvZiB3aXJlZnJhbWUncyB3YXkgKi8KLQkJCQlza2lwID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IG9rID0gMDsKLQkJCQlpbnQgYnRuNCA9ICgxPDwzKTsKLQkJCQlpbnQgYnRuNSA9ICgxPDw0KTsKLQotCQkJCWlmIChuZWFyX3Njcm9sbGJhcl9lZGdlKHgsIHksIHcsIGgsIHB4LCBweSkpIHsKLQkJCQkJb2sgPSAxOwotCQkJCX0KLQkJCQlpZiAobWFzayAmIChidG40fGJ0bjUpKSB7Ci0JCQkJCS8qIHNjcm9sbCB3aGVlbCBtb3VzZSAqLwotCQkJCQlvayA9IDE7Ci0JCQkJfQotCQkJCWlmIChtd2luICE9IE5vbmUpIHsKLQkJCQkJLyogc2tpbm55IGludGVybmFsIHdpbmRvdyAqLwotCQkJCQlpbnQgdyA9IGF0dHIud2lkdGg7Ci0JCQkJCWludCBoID0gYXR0ci5oZWlnaHQ7Ci0JCQkJCWlmIChoID4gMTAgKiB3IHx8IHcgPiAxMCAqIGgpIHsKLWlmIChkZWJ1Z19zY3JvbGwgPiAxKSBmcHJpbnRmKHN0ZGVyciwgImludGVybmFsIHNjcm9sbGJhcjogJWR4JWRcbiIsIHcsIGgpOwotCQkJCQkJb2sgPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghIG9rKSB7Ci0JCQkJCXNraXAgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghIHNraXApIHsKLQkJCXhyZWNvcmRfd2F0Y2goMSwgU0NSX01PVVNFKTsKLQkJCXNuYXBzaG90X3N0YWNrX2xpc3QoMCwgMC41MCk7Ci0JCQlzbmFwcGVkID0gMTsKLQkJCWlmIChidXR0b25fbWFzaykgewotCQkJCXhyZWNvcmRfc2V0X2J5X21vdXNlID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlX3N0YWNrX2xpc3QoKTsKLQkJCQl4cmVjb3JkX3NldF9ieV9tb3VzZSA9IDI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAobWFzayAmJiAhYnV0dG9uX21hc2spIHsKLQkJLyogYnV0dG9uIGRvd24sIHNuYXBzaG90IHRoZSBzdGFja2luZyBsaXN0IGJlZm9yZSBmbHVzaGluZyAqLwotCQlpZiAod2lyZWZyYW1lICYmICF3aXJlZnJhbWVfaW5fcHJvZ3Jlc3MgJiYKLQkJICAgIHN0cmNtcCh3aXJlZnJhbWVfY29weXJlY3QsICJuZXZlciIpKSB7Ci0JCQlpZiAoISBzbmFwcGVkKSB7Ci0JCQkJc25hcHNob3Rfc3RhY2tfbGlzdCgwLCAwLjApOwotCQkJfQotCQl9Ci0JfQotCi0JWF9MT0NLOwotCi0JLyogbG9vayBmb3IgYnV0dG9ucyB0aGF0IGhhdmUgYmUgY2xpY2tlZCBvciByZWxlYXNlZDogKi8KLQlmb3IgKGk9MDsgaSA8IE1BWF9CVVRUT05TOyBpKyspIHsKLQkgICAgaWYgKCAoYnV0dG9uX21hc2sgJiAoMTw8aSkpICE9IChtYXNrICYgKDE8PGkpKSApIHsKLQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCXJmYkxvZygicG9pbnRlcigpOiBtYXNrIGNoYW5nZTogbWFzazogMHgleCAtPiAiCi0JCQkgICAgIjB4JXggYnV0dG9uOiAlZFxuIiwgYnV0dG9uX21hc2ssIG1hc2ssaSsxKTsKLQkJfQotCQlkb19idXR0b25fbWFza19jaGFuZ2UobWFzaywgaSsxKTsJLyogYnV0dG9uICMgaXMgaSsxICovCi0JICAgIH0KLQl9Ci0KLQlYX1VOTE9DSzsKLQotCS8qCi0JICogUmVtZW1iZXIgdGhlIGJ1dHRvbiBzdGF0ZSBmb3IgbmV4dCB0aW1lIGFuZCBhbHNvIGZvciB0aGUKLQkgKiAtbm9kcmFnZ2luZyBjYXNlOgotCSAqLwotCWJ1dHRvbl9tYXNrX3ByZXYgPSBidXR0b25fbWFzazsKLQlidXR0b25fbWFzayA9IG1hc2s7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qIGZvciAtcGlwZWlucHV0ICovCi0KLQotc3RhdGljIHZvaWQgcGlwZV9wb2ludGVyKGludCBtYXNrLCBpbnQgeCwgaW50IHksIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlpbnQgY2FuX2lucHV0ID0gMCwgdWlkID0gMDsKLQlhbGxvd2VkX2lucHV0X3QgaW5wdXQ7Ci0JQ2xpZW50RGF0YSAqY2QgPSAoQ2xpZW50RGF0YSAqKSBjbGllbnQtPmNsaWVudERhdGE7Ci0JY2hhciBoaW50W01BWF9CVVRUT05TICogMjBdOwotCi0JaWYgKHBpcGVpbnB1dF9pbnQgPT0gUElQRUlOUFVUX1ZJRCkgewotCQl2NGxfcG9pbnRlcl9jb21tYW5kKG1hc2ssIHgsIHksIGNsaWVudCk7Ci0JfSBlbHNlIGlmIChwaXBlaW5wdXRfaW50ID09IFBJUEVJTlBVVF9DT05TT0xFKSB7Ci0JCWNvbnNvbGVfcG9pbnRlcl9jb21tYW5kKG1hc2ssIHgsIHksIGNsaWVudCk7Ci0JfSBlbHNlIGlmIChwaXBlaW5wdXRfaW50ID09IFBJUEVJTlBVVF9VSU5QVVQpIHsKLQkJdWlucHV0X3BvaW50ZXJfY29tbWFuZChtYXNrLCB4LCB5LCBjbGllbnQpOwotCX0gZWxzZSBpZiAocGlwZWlucHV0X2ludCA9PSBQSVBFSU5QVVRfTUFDT1NYKSB7Ci0JCW1hY29zeF9wb2ludGVyX2NvbW1hbmQobWFzaywgeCwgeSwgY2xpZW50KTsKLQl9IGVsc2UgaWYgKHBpcGVpbnB1dF9pbnQgPT0gUElQRUlOUFVUX1ZOQykgewotCQl2bmNfcmVmbGVjdF9zZW5kX3BvaW50ZXIoeCwgeSwgbWFzayk7Ci0JfQotCWlmIChwaXBlaW5wdXRfZmggPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgdmlld19vbmx5KSB7Ci0JCWdldF9hbGxvd2VkX2lucHV0KGNsaWVudCwgJmlucHV0KTsKLQkJaWYgKGlucHV0Lm1vdGlvbiB8fCBpbnB1dC5idXR0b24pIHsKLQkJCWNhbl9pbnB1dCA9IDE7CS8qIFhYWCBkaXN0aW5ndWlzaCBsYXRlciAqLwotCQl9Ci0JfQotCi0JaWYgKGNkKSB7Ci0JCXVpZCA9IGNkLT51aWQ7Ci0JfQotCWlmICghIGNhbl9pbnB1dCkgewotCQl1aWQgPSAtdWlkOwotCX0KLQotCWhpbnRbMF0gPSAnXDAnOwotCWlmIChtYXNrID09IGJ1dHRvbl9tYXNrKSB7Ci0JCXN0cmNhdChoaW50LCAiTm9uZSIpOwotCX0gZWxzZSB7Ci0JCWludCBpLCBvbGQsIG5ld2IsIG0gPSAxLCBjbnQgPSAwOwotCQlmb3IgKGk9MDsgaTxNQVhfQlVUVE9OUzsgaSsrKSB7Ci0JCQljaGFyIHNbMjBdOwotCi0JCQlvbGQgPSBidXR0b25fbWFzayAmIG07Ci0JCQluZXdiID0gbWFzayAmIG07Ci0JCQltID0gbSA8PCAxOwotCi0JCQlpZiAob2xkID09IG5ld2IpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChoaW50WzBdICE9ICdcMCcpIHsKLQkJCQlzdHJjYXQoaGludCwgIiwiKTsKLQkJCX0KLQkJCWlmIChuZXdiICYmICEgb2xkKSB7Ci0JCQkJc3ByaW50ZihzLCAiQnV0dG9uUHJlc3MtJWQiLCBpKzEpOwotCQkJCWNudCsrOwotCQkJfSBlbHNlIGlmICghIG5ld2IgJiYgb2xkKSAgewotCQkJCXNwcmludGYocywgIkJ1dHRvblJlbGVhc2UtJWQiLCBpKzEpOwotCQkJCWNudCsrOwotCQkJfQotCQkJc3RyY2F0KGhpbnQsIHMpOwotCQl9Ci0JCWlmICghIGNudCkgewotCQkJc3RyY3B5KGhpbnQsICJOb25lIik7Ci0JCX0KLQl9Ci0KLQlmcHJpbnRmKHBpcGVpbnB1dF9maCwgIlBvaW50ZXIgJWQgJWQgJWQgJWQgJXNcbiIsIHVpZCwgeCwgeSwKLQkgICAgbWFzaywgaGludCk7Ci0JZmZsdXNoKHBpcGVpbnB1dF9maCk7Ci0JY2hlY2tfcGlwZWlucHV0KCk7Ci19Ci0KLS8qCi0gKiBBY3R1YWwgY2FsbGJhY2sgZnJvbSBsaWJ2bmNzZXJ2ZXIgd2hlbiBpdCBnZXRzIGEgcG9pbnRlciBldmVudC4KLSAqIFRoaXMgbWF5IHF1ZXVlIHBvaW50ZXIgZXZlbnRzIHJhdGhlciB0aGFuIHNlbmRpbmcgdGhlbSBpbW1lZGlhdGVseQotICogdG8gdGhlIFggc2VydmVyLiAoc2VlIHVwZGF0ZV94MTFfcG9pbnRlciooKSkKLSAqLwotdm9pZCBwb2ludGVyX2V2ZW50KGludCBtYXNrLCBpbnQgeCwgaW50IHksIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlhbGxvd2VkX2lucHV0X3QgaW5wdXQ7Ci0JaW50IHNlbnQgPSAwLCBidWZmZXJfaXQgPSAwOwotCWRvdWJsZSBub3c7Ci0KLQlpZiAodGhyZWFkc19kcm9wX2lucHV0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobWFzayA+PSAwKSB7Ci0JCWdvdF9wb2ludGVyX2NhbGxzKys7Ci0JfQotCi0JaWYgKGRlYnVnX3BvaW50ZXIgJiYgbWFzayA+PSAwKSB7Ci0JCXN0YXRpYyBpbnQgc2hvd19tb3Rpb24gPSAtMTsKLQkJc3RhdGljIGRvdWJsZSBsYXN0X3BvaW50ZXIgPSAwLjA7Ci0JCWRvdWJsZSB0bm93LCBkdDsKLQkJc3RhdGljIGludCBsYXN0X3gsIGxhc3RfeTsKLQkJaWYgKHNob3dfbW90aW9uID09IC0xKSB7Ci0JCQlpZiAoZ2V0ZW52KCJYMTFWTkNfREJfTk9NT1RJT04iKSkgewotCQkJCXNob3dfbW90aW9uID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvd19tb3Rpb24gPSAxOwotCQkJfQotCQl9Ci0JCWR0aW1lMCgmdG5vdyk7Ci0JCXRub3cgLT0geDExdm5jX3N0YXJ0OwotCQlkdCA9IHRub3cgLSBsYXN0X3BvaW50ZXI7Ci0JCWxhc3RfcG9pbnRlciA9IHRub3c7Ci0JCWlmIChzaG93X21vdGlvbikgewotCQkJcmZiTG9nKCIjIHBvaW50ZXIobWFzazogMHgleCwgeDolNGQsIHk6JTRkKSAiCi0JCQkgICAgImR4OiAlM2QgZHk6ICUzZCBkdDogJS40ZiB0OiAlLjRmXG4iLCBtYXNrLCB4LCB5LAotCQkJICAgIHggLSBsYXN0X3gsIHkgLSBsYXN0X3ksIGR0LCB0bm93KTsKLQkJfQotCQlsYXN0X3ggPSB4OwotCQlsYXN0X3kgPSB5OwotCX0KLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJcmV0dXJuOwotCX0KLQotCWdldF9hbGxvd2VkX2lucHV0KGNsaWVudCwgJmlucHV0KTsKLQotCWlmIChyb3RhdGluZykgewotCQlyb3RhdGVfY29vcmRzX2ludmVyc2UoeCwgeSwgJngsICZ5LCAtMSwgLTEpOwotCX0KLQotCWlmIChzY2FsaW5nKSB7Ci0JCS8qIG1hcCBmcm9tIHJmYiBzaXplIHRvIFgxMSBzaXplOiAqLwotCQl4ID0gKChkb3VibGUpIHggLyBzY2FsZWRfeCkgKiBkcHlfeDsKLQkJeCA9IG5maXgoeCwgZHB5X3gpOwotCQl5ID0gKChkb3VibGUpIHkgLyBzY2FsZWRfeSkgKiBkcHlfeTsKLQkJeSA9IG5maXgoeSwgZHB5X3kpOwotCX0KLQotCUlOUFVUX0xPQ0s7Ci0KLQlpZiAoKHBpcGVpbnB1dF9maCAhPSBOVUxMIHx8IHBpcGVpbnB1dF9pbnQpICYmIG1hc2sgPj0gMCkgewotCQlwaXBlX3BvaW50ZXIobWFzaywgeCwgeSwgY2xpZW50KTsJLyogTUFDT1NYIGhlcmUuICovCi0JCWlmICghIHBpcGVpbnB1dF90ZWUpIHsKLQkJCWlmICghIHZpZXdfb25seSB8fCByYXdfZmIpIHsJLyogcmF3X2ZiIGhhY2sgKi8KLQkJCQlnb3RfdXNlcl9pbnB1dCsrOwotCQkJCWdvdF9wb2ludGVyX2lucHV0Kys7Ci0JCQkJbGFzdF9wb2ludGVyX2NsaWVudCA9IGNsaWVudDsKLQkJCQlsYXN0X3BvaW50ZXJfdGltZSA9IGRub3coKTsKLQkJCQlsYXN0X2V2ZW50ID0gbGFzdF9pbnB1dCA9IGxhc3RfcG9pbnRlcl9pbnB1dCA9IHRpbWUoTlVMTCk7Ci0JCQl9Ci0JCQlpZiAoaW5wdXQubW90aW9uKSB7Ci0JCQkJLyogcmF3X2ZiIGhhY2sgdHJhY2sgYnV0dG9uIHN0YXRlICovCi0JCQkJYnV0dG9uX21hc2tfcHJldiA9IGJ1dHRvbl9tYXNrOwotCQkJCWJ1dHRvbl9tYXNrID0gbWFzazsKLQkJCX0KLQkJCWlmICghdmlld19vbmx5ICYmIChpbnB1dC5tb3Rpb24gfHwgaW5wdXQuYnV0dG9uKSkgewotCQkJCWxhc3RfcmZiX3B0cl9pbmplY3RlZCA9IGRub3coKTsKLQkJCX0KLQkJCUlOUFVUX1VOTE9DSzsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlmICh2aWV3X29ubHkpIHsKLQkJSU5QVVRfVU5MT0NLOwotCQlyZXR1cm47Ci0JfQotCi0Jbm93ID0gZG5vdygpOwotCi0JaWYgKG1hc2sgPj0gMCkgewotCQkvKgotCQkgKiBtYXNrID0gLTEgaXMgYSBzcGVjaWFsIGNhc2UgY2FsbCBmcm9tIHNjYW5fZm9yX3VwZGF0ZXMoKQotCQkgKiB0byBmbHVzaCB0aGUgZXZlbnQgcXVldWU7IHRoZXJlIGlzIG5vIHJlYWwgcG9pbnRlciBldmVudC4KLQkJICovCi0JCWlmICghIGlucHV0Lm1vdGlvbiAmJiAhIGlucHV0LmJ1dHRvbikgewotCQkJSU5QVVRfVU5MT0NLOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZ290X3VzZXJfaW5wdXQrKzsKLQkJZ290X3BvaW50ZXJfaW5wdXQrKzsKLQkJbGFzdF9wb2ludGVyX2NsaWVudCA9IGNsaWVudDsKLQotCQlsYXN0X3BvaW50ZXJfdGltZSA9IG5vdzsKLQkJbGFzdF9yZmJfcHRyX2luamVjdGVkID0gZG5vdygpOwotCi0JCWlmIChibGFja291dF9wdHIgJiYgYmxhY2tvdXRzKSB7Ci0JCQlpbnQgYiwgb2sgPSAxOwotCQkJLyogc2VlIGlmIGl0IGdvZXMgaW50byB0aGUgYmxhY2tlZCBvdXQgcmVnaW9uICovCi0JCQlmb3IgKGI9MDsgYiA8IGJsYWNrb3V0czsgYisrKSB7Ci0JCQkJaWYgKHggPCBibGFja3JbYl0ueDEgfHwgeCA+IGJsYWNrcltiXS54MikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHkgPCBibGFja3JbYl0ueTEgfHwgeSA+IGJsYWNrcltiXS55MikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogeDEgPD0geCA8PSB4MiBhbmQgeTEgPD0geSA8PSB5MiAqLwotCQkJCW9rID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghIG9rKSB7Ci0JCQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCQkgICAgcmZiTG9nKCJwb2ludGVyKCk6IGJsYWNrb3V0X3B0ciBza2lwcGluZyAiCi0JCQkJCSJ4PSVkIHk9JWQgaW4gcmVjdGFuZ2xlICVkLCVkICVkLCVkXG4iLCB4LCB5LAotCQkJCQlibGFja3JbYl0ueDEsIGJsYWNrcltiXS55MSwKLQkJCQkJYmxhY2tyW2JdLngyLCBibGFja3JbYl0ueTIpOwotCQkJCX0KLQkJCQlJTlBVVF9VTkxPQ0s7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGlzIGhvcGVmdWxseSBhbiBpbXByb3ZlbWVudCB3cnQgcmVzcG9uc2UgZHVyaW5nCi0JICogcG9pbnRlciB1c2VyIGlucHV0ICh3aW5kb3cgZHJhZ3MpIGZvciB0aGUgdGhyZWFkZWQgY2FzZS4KLQkgKiBTZWUgY2hlY2tfdXNlcl9pbnB1dCgpIGZvciB0aGUgbW9yZSBjb21wbGljYXRlZCB0aGluZ3Mgd2UgZG8KLQkgKiBpbiB0aGUgbm9uLXRocmVhZGVkIGNhc2UuCi0JICovCi0JaWYgKCh1c2VfdGhyZWFkcyAmJiBwb2ludGVyX21vZGUgIT0gMSkgfHwgcG9pbnRlcl9mbHVzaF9kZWxheSA+IDAuMCkgewotIwkJZGVmaW5lIE5FViAzMgotCQkvKiBzdG9yYWdlIGZvciB0aGUgZXZlbnQgcXVldWUgKi8KLQkJc3RhdGljIGludCBuZXZlbnRzID0gMDsKLQkJc3RhdGljIGludCBldltORVZdWzNdOwotCQlpbnQgaTsKLQkJLyogdGltZXIgdGhpbmdzICovCi0JCXN0YXRpYyBkb3VibGUgZHQgPSAwLjAsIHRtciA9IDAuMCwgbWF4d2FpdCA9IDAuNDsKLQotCQlpZiAocG9pbnRlcl9mbHVzaF9kZWxheSA+IDAuMCkgewotCQkJbWF4d2FpdCA9IHBvaW50ZXJfZmx1c2hfZGVsYXk7Ci0JCX0KLQkJaWYgKG1hc2sgPj0gMCkgewotCQkJaWYgKGZiX2NvcHlfaW5fcHJvZ3Jlc3MgfHwgcG9pbnRlcl9mbHVzaF9kZWxheSA+IDAuMCkgewotCQkJCWJ1ZmZlcl9pdCA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlQT0lOVEVSX0xPQ0s7Ci0KLQkJLyogCi0JCSAqIElmIHRoZSBmcmFtZWJ1ZmZlciBpcyBiZWluZyBjb3BpZWQgaW4gYW5vdGhlciB0aHJlYWQKLQkJICogKHNjYW5fZm9yX3VwZGF0ZXMoKSksIHdlIHdpbGwgcXVldWUgdXAgdG8gMzIgcG9pbnRlcgotCQkgKiBldmVudHMgZm9yIGxhdGVyLiAgVGhlIGlkZWEgaXMgYnkgZGVsYXlpbmcgdGhlc2UgaW5wdXQKLQkJICogZXZlbnRzLCB0aGUgc2NyZWVuIGlzIGxlc3MgbGlrZWx5IHRvIGNoYW5nZSBkdXJpbmcgdGhlCi0JCSAqIGNvcHlpbmcgcGVyaW9kLCBhbmQgc28gd2lsbCBnaXZlIHJpc2UgdG8gbGVzcyB3aW5kb3cKLQkJICogInRlYXJpbmciLgotCQkgKgotCQkgKiBUZWFyaW5nIGlzIG5vdCBjb21wbGV0ZWx5IGVsaW1pbmF0ZWQgYmVjYXVzZSB3ZSBkbwotCQkgKiBub3Qgc3VzcGVuZCB3b3JrIGluIHRoZSBvdGhlciBsaWJ2bmNzZXJ2ZXIgdGhyZWFkcy4KLQkJICogTWF5YmUgdGhhdCBpcyBhIHBvc3NpYmlsaXR5IHdpdGggYSBtdXRleC4uLgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl9pdCkgewotCQkJLyogCi0JCQkgKiBtYXNrID0gLTEgaXMgYW4gYWxsLWNsZWFyIHNpZ25hbCBmcm9tCi0JCQkgKiBzY2FuX2Zvcl91cGRhdGVzKCkuCi0JCQkgKgotCQkJICogZHQgaXMgYSB0aW1lciBpbiBzZWNvbmRzOyB3ZSBvbmx5IHF1ZXVlIGZvciBzbyBsb25nLgotCQkJICovCi0JCQlkdCArPSBkdGltZSgmdG1yKTsKLQotCQkJaWYgKG5ldmVudHMgPCBORVYgJiYgZHQgPCBtYXh3YWl0KSB7Ci0JCQkJaSA9IG5ldmVudHMrKzsKLQkJCQlldltpXVswXSA9IG1hc2s7Ci0JCQkJZXZbaV1bMV0gPSB4OwotCQkJCWV2W2ldWzJdID0geTsKLQkJCQlpZiAoISBpbnB1dC5idXR0b24pIHsKLQkJCQkJZXZbaV1bMF0gPSAtMTsKLQkJCQl9Ci0JCQkJaWYgKCEgaW5wdXQubW90aW9uKSB7Ci0JCQkJCWV2W2ldWzFdID0gLTE7Ci0JCQkJCWV2W2ldWzJdID0gLTE7Ci0JCQkJfQotCQkJCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCQkJCXJmYkxvZygicG9pbnRlcigpOiBkZWZlcnJpbmcgZXZlbnQgJWQiCi0JCQkJCSAgICAiICUuNGZcbiIsIGksIHRtciAtIHgxMXZuY19zdGFydCk7Ci0JCQkJfQotCQkJCVBPSU5URVJfVU5MT0NLOwotCQkJCUlOUFVUX1VOTE9DSzsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvKiB0aW1lIHRvIHNlbmQgdGhlIHF1ZXVlICovCi0JCWZvciAoaT0wOyBpPG5ldmVudHM7IGkrKykgewotCQkJaW50IHNlbnQgPSAwOwotCQkJaWYgKG1hc2sgPCAwICYmIGNsaWVudCAhPSBOVUxMKSB7Ci0JCQkJLyogaGFjayB0byBvbmx5IHB1c2ggdGhlIGxhdGVzdCBldmVudCAqLwotCQkJCWlmIChpIDwgbmV2ZW50cyAtIDEpIHsKLQkJCQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCQkJCXJmYkxvZygiLSBza2lwIGRlZmVycmVkIGV2ZW50OiIKLQkJCQkJCSAgICAiICVkXG4iLCBpKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGVidWdfcG9pbnRlcikgewotCQkJCXJmYkxvZygicG9pbnRlcigpOiBzZW5kaW5nIGV2ZW50ICVkICUuNGZcbiIsCi0JCQkJICAgIGkrMSwgZG5vd3goKSk7Ci0JCQl9Ci0JCQlpZiAoZXZbaV1bMV0gPj0gMCkgewotCQkJCXVwZGF0ZV94MTFfcG9pbnRlcl9wb3NpdGlvbihldltpXVsxXSwgZXZbaV1bMl0pOwotCQkJCXNlbnQgPSAxOwotCQkJfQotCQkJaWYgKGV2W2ldWzBdID49IDApIHsKLQkJCQl1cGRhdGVfeDExX3BvaW50ZXJfbWFzayhldltpXVswXSk7Ci0JCQkJc2VudCA9IDE7Ci0JCQl9Ci0KLQkJCWlmIChzZW50KSB7Ci0JCQkJcG9pbnRlcl9xdWV1ZWRfc2VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChuZXZlbnRzICYmIGR0ID4gbWF4d2FpdCkgewotCQkgICAgaWYgKGRweSkgewkvKiByYXdfZmIgaGFjayAqLwotCQkJaWYgKG1hc2sgPCAwKSB7Ci0JCQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCQkJcmZiTG9nKCJwb2ludGVyKCk6IGNhbGxpbmcgWEZsdXNoICIKLQkJCQkJICAgICIlLjRmXG4iLCBkbm93eCgpKTsKLQkJCQl9Ci0JCQkJWF9MT0NLOwotCQkJCVhGbHVzaF93cihkcHkpOwkKLQkJCQlYX1VOTE9DSzsKLQkJCX0KLQkJICAgIH0KLQkJfQotCQluZXZlbnRzID0gMDsJLyogcmVzZXQgZXZlcnl0aGluZyAqLwotCQlkdCA9IDAuMDsKLQkJZHRpbWUwKCZ0bXIpOwotCi0JCVBPSU5URVJfVU5MT0NLOwotCX0KLQlpZiAobWFzayA8IDApIHsJCS8qIC0xIGp1c3QgbWVhbnMgZmx1c2ggdGhlIGV2ZW50IHF1ZXVlICovCi0JCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCQlyZmJMb2coInBvaW50ZXIoKTogZmx1c2ggb25seS4gICUuNGZcbiIsCi0JCQkgICAgZG5vd3goKSk7Ci0JCX0KLQkJSU5QVVRfVU5MT0NLOwotCQlyZXR1cm47Ci0JfQotCi0JLyogdXBkYXRlIHRoZSBYIGRpc3BsYXkgd2l0aCB0aGUgZXZlbnQ6ICovCi0JaWYgKGlucHV0Lm1vdGlvbikgewotCQl1cGRhdGVfeDExX3BvaW50ZXJfcG9zaXRpb24oeCwgeSk7Ci0JCXNlbnQgPSAxOwotCX0KLQlpZiAoaW5wdXQuYnV0dG9uKSB7Ci0JCWlmIChtYXNrICE9IGJ1dHRvbl9tYXNrKSB7Ci0JCQlidXR0b25fY2hhbmdlX3ggPSBjdXJzb3JfeDsKLQkJCWJ1dHRvbl9jaGFuZ2VfeSA9IGN1cnNvcl95OwotCQl9Ci0JCXVwZGF0ZV94MTFfcG9pbnRlcl9tYXNrKG1hc2spOwotCQlzZW50ID0gMTsKLQl9Ci0KLQlpZiAoISBkcHkpIHsKLQkJOwotCX0gZWxzZSBpZiAobm9mYiAmJiBzZW50KSB7Ci0JCS8qIAotCQkgKiBub2ZiIGlzIGZvciwgZS5nLiBXaW4yVk5DLCB3aGVyZSBmYXN0ZXN0IHBvaW50ZXIKLQkJICogdXBkYXRlcyBhcmUgZGVzaXJlZC4KLQkJICovCi0JCVhfTE9DSzsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JCVhfVU5MT0NLOwotCX0gZWxzZSBpZiAoYnVmZmVyX2l0KSB7Ci0JCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCQlyZmJMb2coInBvaW50ZXIoKTogY2FsbGluZyBYRmx1c2grIgotCQkJICAgICIlLjRmXG4iLCBkbm93eCgpKTsKLQkJfQotCQlYX0xPQ0s7Ci0JCVhGbHVzaF93cihkcHkpOwkKLQkJWF9VTkxPQ0s7Ci0JfQotCUlOUFVUX1VOTE9DSzsKLX0KLQotdm9pZCBpbml0aWFsaXplX3BpcGVpbnB1dCh2b2lkKSB7Ci0JY2hhciAqcCA9IE5VTEw7Ci0KLQlpZiAocGlwZWlucHV0X2ZoICE9IE5VTEwpIHsKLQkJcmZiTG9nKCJjbG9zaW5nIHBpcGVpbnB1dCBzdHJlYW06ICVwXG4iLCBwaXBlaW5wdXRfZmgpOwotCQlwY2xvc2UocGlwZWlucHV0X2ZoKTsKLQkJcGlwZWlucHV0X2ZoID0gTlVMTDsKLQl9Ci0KLQlwaXBlaW5wdXRfdGVlID0gMDsKLQlpZiAocGlwZWlucHV0X29wdHMpIHsKLQkJZnJlZShwaXBlaW5wdXRfb3B0cyk7Ci0JCXBpcGVpbnB1dF9vcHRzID0gTlVMTDsKLQl9Ci0KLQlpZiAoISBwaXBlaW5wdXRfc3RyKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBsb29rIGZvciBvcHRpb25zOiAgdGVlLCByZW9wZW4sIC4uLiAqLwotCWlmIChzdHJzdHIocGlwZWlucHV0X3N0ciwgIlVJTlBVVCIpID09IHBpcGVpbnB1dF9zdHIpIHsKLQkJOwotCX0gZWxzZSB7Ci0JCXAgPSBzdHJjaHIocGlwZWlucHV0X3N0ciwgJzonKTsKLQl9Ci0JaWYgKHAgIT0gTlVMTCkgewotCQljaGFyICpzdHIsICpvcHQsICpxOwotCQlpbnQgZ290ID0gMDsKLQkJKnAgPSAnXDAnOwotCQlzdHIgPSBzdHJkdXAocGlwZWlucHV0X3N0cik7Ci0JCW9wdCA9IHN0cmR1cChwaXBlaW5wdXRfc3RyKTsKLQkJKnAgPSAnOic7Ci0JCXEgPSBzdHJ0b2soc3RyLCAiLCIpOwotCQl3aGlsZSAocSkgewotCQkJaWYgKCFzdHJjbXAocSwgImtleSIpIHx8ICFzdHJjbXAocSwgImtleWNvZGVzIikpIHsKLQkJCQlnb3QgPSAxOwotCQkJfQotCQkJaWYgKCFzdHJjbXAocSwgInJlb3BlbiIpKSB7Ci0JCQkJZ290ID0gMTsKLQkJCX0KLQkJCWlmICghc3RyY21wKHEsICJ0ZWUiKSkgewotCQkJCXBpcGVpbnB1dF90ZWUgPSAxOwotCQkJCWdvdCA9IDE7Ci0JCQl9Ci0JCQlxID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCX0KLQkJaWYgKGdvdCkgewotCQkJcGlwZWlucHV0X29wdHMgPSBvcHQ7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKG9wdCk7Ci0JCX0KLQkJZnJlZShzdHIpOwotCQlwKys7Ci0JfSBlbHNlIHsKLQkJcCA9IHBpcGVpbnB1dF9zdHI7Ci0JfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiaW5pdGlhbGl6ZV9waXBlaW5wdXQ6ICVzIC0tICVzXG4iLCBwaXBlaW5wdXRfc3RyLCBwKTsKLQotCWlmICghc3RyY21wKHAsICJWSUQiKSkgewotCQlwaXBlaW5wdXRfaW50ID0gUElQRUlOUFVUX1ZJRDsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJDT05TT0xFIikgPT0gcCkgewotCQlpbnQgdHR5ID0gMCwgbjsKLQkJY2hhciBkZXZbMzJdOwotCQlpZiAoc3NjYW5mKHAsICJDT05TT0xFJWQiLCAmbikgPT0gMSkgewotCQkJdHR5ID0gbjsKLQkJfQotCQlzcHJpbnRmKGRldiwgIi9kZXYvdHR5JWQiLCB0dHkpOwotCQlwaXBlaW5wdXRfY29uc19mZCA9IG9wZW4oZGV2LCBPX1dST05MWSk7Ci0JCWlmIChwaXBlaW5wdXRfY29uc19mZCA+PSAwKSB7Ci0JCQlyZmJMb2coInBpcGVpbnB1dDogdXNpbmcgbGludXggY29uc29sZTogJXNcbiIsIGRldik7Ci0JCQlpZiAocGlwZWlucHV0X2NvbnNfZGV2KSB7Ci0JCQkJZnJlZShwaXBlaW5wdXRfY29uc19kZXYpOwotCQkJfQotCQkJcGlwZWlucHV0X2NvbnNfZGV2ID0gc3RyZHVwKGRldik7Ci0JCQlwaXBlaW5wdXRfaW50ID0gUElQRUlOUFVUX0NPTlNPTEU7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInBpcGVpbnB1dDogY291bGQgbm90IG9wZW46ICVzXG4iLCBkZXYpOwotCQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JCQlyZmJMb2coIllvdSBtYXkgbmVlZCB0byBiZSByb290IHRvIG9wZW4gJXMuXG4iLCBkZXYpOwotCQkJcmZiTG9nKCJcbiIpOwotCQl9Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiVUlOUFVUIikgPT0gcCkgewotCQljaGFyICpxID0gc3RyY2hyKHAsICc6Jyk7Ci0JCWlmIChxKSB7Ci0JCQlwYXJzZV91aW5wdXRfc3RyKHErMSk7Ci0JCX0KLQkJcGlwZWlucHV0X2ludCA9IFBJUEVJTlBVVF9VSU5QVVQ7Ci0JCWluaXRpYWxpemVfdWlucHV0KCk7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiTUFDT1NYIikgPT0gcCkgewotCQlwaXBlaW5wdXRfaW50ID0gUElQRUlOUFVUX01BQ09TWDsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJWTkMiKSA9PSBwKSB7Ci0JCXBpcGVpbnB1dF9pbnQgPSBQSVBFSU5QVVRfVk5DOwotCQlyZXR1cm47Ci0JfQotCi0Jc2V0X2NoaWxkX2luZm8oKTsKLQkvKiBwaXBlaW5wdXQgKi8KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJwaXBlaW5wdXQiKSkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIHApOwotCQlyZmJMb2coIiAgIGV4aXRpbmcuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JcmZiTG9nKCJwaXBlaW5wdXQ6IHN0YXJ0aW5nOiBcIiVzXCIuLi5cbiIsIHApOwotCWNsb3NlX2V4ZWNfZmRzKCk7Ci0JcGlwZWlucHV0X2ZoID0gcG9wZW4ocCwgInciKTsKLQotCWlmICghIHBpcGVpbnB1dF9maCkgewotCQlyZmJMb2coInBvcGVuKFwiJXNcIiwgXCJ3XCIpIGZhaWxlZC5cbiIsIHApOwotCQlyZmJMb2dQZXJyb3IoInBvcGVuIik7Ci0JCXJmYkxvZygiRGlzYWJsaW5nIC1waXBlaW5wdXQgbW9kZS5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZnByaW50ZihwaXBlaW5wdXRfZmgsICIlcyIsCi0iIyBcbiIKLSIjIEZvcm1hdCBvZiB0aGUgLXBpcGVpbnB1dCBzdHJlYW06XG4iCi0iIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgotIiNcbiIKLSIjIExpbmVzIGxpa2UgdGhlc2UgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSB0byBiZSBpZ25vcmVkLlxuIgotIiNcbiIKLSIjIFBvaW50ZXIgZXZlbnRzIChtb3VzZSBtb3Rpb24gYW5kIGJ1dHRvbiBjbGlja3MpIGNvbWUgaW4gdGhlIGZvcm06XG4iCi0iI1xuIgotIiNcbiIKLSIjIFBvaW50ZXIgPGNsaWVudCM+IDx4PiA8eT4gPG1hc2s+IDxoaW50PlxuIgotIiNcbiIKLSIjXG4iCi0iIyBUaGUgPGNsaWVudCM+IGlzIGEgZGVjaW1hbCBpbnRlZ2VyIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBjbGllbnRcbiIKLSIjIHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudC4gIElmIGl0IGlzIG5lZ2F0aXZlIHRoYXQgbWVhbnMgdGhpcyBldmVudFxuIgotIiMgd291bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZCBzaW5jZSB0aGUgY2xpZW50IHdhcyB2aWV3b25seS5cbiIKLSIjXG4iCi0iIyA8eD4gYW5kIDx5PiBhcmUgZGVjaW1hbCBpbnRlZ2VycyByZWZsZWN0aW5nIHRoZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuXG4iCi0iIyB0aGUgZXZlbnQgdG9vayBwbGFjZSBhdC5cbiIKLSIjXG4iCi0iIyA8bWFzaz4gaXMgdGhlIGJ1dHRvbiBtYXNrIGluZGljYXRpbmcgdGhlIGJ1dHRvbiBwcmVzcyBzdGF0ZSwgYXMgbm9ybWFsXG4iCi0iIyAwIG1lYW5zIG5vIGJ1dHRvbnMgcHJlc3NlZCwgMSBtZWFucyBidXR0b24gMSBpcyBkb3duIDMgKDExKSBtZWFucyBidXR0b25zXG4iCi0iIyAxIGFuZCAyIGFyZSBkb3duLCBldGMuXG4iCi0iI1xuIgotIiMgPGhpbnQ+IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgbm8gc3BhY2VzIGFuZCBtYXkgYmUgaWdub3JlZC5cbiIKLSIjIEl0IGNvbnRhaW5zIHNvbWUgaW50ZXJwcmV0YXRpb24gYWJvdXQgd2hhdCBoYXMgaGFwcGVuZWQuXG4iCi0iIyBJdCBjYW4gYmU6XG4iCi0iI1xuIgotIiMJTm9uZQkJKG5vdGhpbmcgdG8gcmVwb3J0KVxuIgotIiMJQnV0dG9uUHJlc3MtTgkodGhpcyBldmVudCB3aWxsIGNhdXNlIGJ1dHRvbi1OIHRvIGJlIHByZXNzZWQpIFxuIgotIiMJQnV0dG9uUmVsZWFzZS1OCSh0aGlzIGV2ZW50IHdpbGwgY2F1c2UgYnV0dG9uLU4gdG8gYmUgcmVsZWFzZWQpIFxuIgotIiNcbiIKLSIjIGlmIHR3byBtb3JlIG1vcmUgYnV0dG9ucyBjaGFuZ2Ugc3RhdGUgaW4gb25lIGV2ZW50IHRoZXkgYXJlIGxpc3RlZFxuIgotIiMgc2VwYXJhdGVkIGJ5IGNvbW1hcy5cbiIKLSIjXG4iCi0iIyBPbmUgbWlnaHQgcGFyc2UgYSBQb2ludGVyIGxpbmUgd2l0aDpcbiIKLSIjXG4iCi0iIyBpbnQgY2xpZW50LCB4LCB5LCBtYXNrOyBjaGFyIGhpbnRbMTAwXTtcbiIKLSIjIHNzY2FuZihsaW5lLCBcIlBvaW50ZXIgJWQgJWQgJWQgJWQgJXNcIiwgJmNsaWVudCwgJngsICZ5LCAmbWFzaywgaGludCk7XG4iCi0iI1xuIgotIiNcbiIKLSIjIEtleXN5bSBldmVudHMgKGtleWJvYXJkIHByZXNzZXMgYW5kIHJlbGVhc2VzKSBjb21lIGluIHRoZSBmb3JtOlxuIgotIiNcbiIKLSIjXG4iCi0iIyBLZXlzeW0gPGNsaWVudCM+IDxkb3duPiA8a2V5c3ltIz4gPGtleXN5bS1uYW1lPiA8aGludD5cbiIKLSIjXG4iCi0iI1xuIgotIiMgVGhlIDxjbGllbnQjPiBpcyBhcyB3aXRoIFBvaW50ZXIuXG4iCi0iI1xuIgotIiMgPGRvd24+IGlzIGEgZGVjaW1hbCBlaXRoZXIgMSBvciAwIGluZGljYXRpbmcgS2V5UHJlc3Mgb3IgS2V5UmVsZWFzZSxcbiIKLSIjIHJlc3BlY3RpdmVseS5cbiIKLSIjXG4iCi0iIyA8a2V5c3ltIz4gaXMgYSBkZWNpbWFsIGludGVnZXIgaW5jaWRhdGluZyB0aGUgS2V5c3ltIG9mIHRoZSBldmVudC5cbiIKLSIjXG4iCi0iIyA8a2V5c3ltLW5hbWU+IGlzIHRoZSBjb3JyZXNwb25kaW5nIEtleXN5bSBuYW1lLlxuIgotIiNcbiIKLSIjIFNlZSB0aGUgZmlsZSAvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oIGZvciB0aGUgbWFwcGluZ3MuXG4iCi0iIyBZb3UgYmFzaWNhbGx5IHJlbW92ZSB0aGUgbGVhZGluZyAnWEtfJyBwcmVmaXggZnJvbSB0aGUgbWFjcm8gbmFtZSBpblxuIgotIiMgdGhhdCBmaWxlIHRvIGdldCB0aGUgS2V5c3ltIG5hbWUuXG4iCi0iI1xuIgotIiMgT25lIG1pZ2h0IHBhcnNlIGEgS2V5c3ltIGxpbmUgd2l0aDpcbiIKLSIjXG4iCi0iIyBpbnQgY2xpZW50LCBkb3duLCBrZXlzeW07IGNoYXIgbmFtZVsxMDBdLCBoaW50WzEwMF07XG4iCi0iIyBzc2NhbmYobGluZSwgXCJLZXlzeW0gJWQgJWQgJWQgJXMgJXNcIiwgJmNsaWVudCwgJmRvd24sICZrZXlzeW0sIG5hbWUsIGhpbnQpO1xuIgotIiNcbiIKLSIjIFRoZSA8aGludD4gdmFsdWUgaXMgY3VycmVudGx5IGp1c3QgTm9uZSwgS2V5UHJlc3MsIG9yIEtleVJlbGVhc2UuXG4iCi0iI1xuIgotIiMgSW4gdGhlIGZ1dHVyZSA8aGludD4gd2lsbCBwcm92aWRlIGEgaGludCBmb3IgdGhlIHNlcXVlbmNlIG9mIEtleUNvZGVzXG4iCi0iIyAoaS5lLiBrZXlib2FyZCBzY2FuY29kZXMpIHRoYXQgeDExdm5jIHdvdWxkIGluamVjdCB0byBhbiBYIGRpc3BsYXkgdG9cbiIKLSIjIHNpbXVsYXRlIHRoZSBLZXlzeW0uXG4iCi0iI1xuIgotIiMgWW91IHNlZSwgc29tZSBLZXlzeW1zIHdpbGwgcmVxdWlyZSBtb3JlIHRoYW4gb25lIGluamVjdGVkIEtleWNvZGUgdG9cbiIKLSIjIGdlbmVyYXRlIHRoZSBzeW1ib2wuICBFLmcuIHRoZSBLZXlzeW0gXCJhbXBlcnNhbmRcIiBnb2luZyBkb3duIHVzdWFsbHlcbiIKLSIjIHJlcXVpcmVzIGEgU2hpZnQga2V5IGdvaW5nIGRvd24sIHRoZW4gdGhlIGtleSB3aXRoIHRoZSBcIiZcIiBvbiBpdCBnb2luZ1xuIgotIiMgZG93biwgYW5kLCBwZXJoYXBzLCB0aGUgU2hpZnQga2V5IGdvaW5nIHVwICh0aGF0IGlzIGhvdyB4MTF2bmMgZG9lcyBpdCkuXG4iCi0iI1xuIgotIiMgVGhlIEtleXN5bSA9PiBLZXljb2RlKHMpIHN0dWZmIGdldHMgcHJldHR5IG1lc3N5LiAgSG9wZWZ1bGx5IHRoZSBLZXlzeW1cbiIKLSIjIGluZm8gd2lsbCBiZSBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMgKGhhdmluZyBpZGVudGljYWwga2V5Ym9hcmRzIG9uXG4iCi0iIyBib3RoIHNpZGVzIGhlbHBzKS5cbiIKLSIjXG4iCi0iIyBQYXJzaW5nIGV4YW1wbGUgZm9yIHBlcmw6XG4iCi0iI1xuIgotIiMgd2hpbGUgKDw+KSB7XG4iCi0iIyAgICAgY2hvbXA7XG4iCi0iIyAgICAgaWYgKC9eUG9pbnRlci8pIHtcbiIKLSIjICAgICAgICAgbXkgKCRwLCAkY2xpZW50LCAkeCwgJHksICRtYXNrLCAkaGludCkgPSBzcGxpdCgnICcsICRfLCA2KTtcbiIKLSIjICAgICAgICAgZG9fcG9pbnRlcigkY2xpZW50LCAkeCwgJHksICRtYXNrLCAkaGludCk7XG4iCi0iIyAgICAgfSBlbHNpZiAoL15LZXlzeW0vKSB7XG4iCi0iIyAgICAgICAgIG15ICgkaywgJGNsaWVudCwgJGRvd24sICRrZXlzeW0sICRuYW1lLCAkaGludCkgPSBzcGxpdCgnICcsICRfLCA2KTtcbiIKLSIjICAgICAgICAgZG9fa2V5c3ltKCRjbGllbnQsICRkb3duLCAka2V5c3ltLCAkbmFtZSwgJGhpbnQpO1xuIgotIiMgICAgIH1cbiIKLSIjIH1cbiIKLSIjXG4iCi0iI1xuIgotIiMgSGVyZSBjb21lcyB5b3VyIHN0cmVhbS4gIFRoZSBmb2xsb3dpbmcgdG9rZW4gd2lsbCBhbHdheXMgaW5kaWNhdGUgdGhlXG4iCi0iIyBlbmQgb2YgdGhpcyBpbmZvcm1hdGlvbmFsIHRleHQ6XG4iCi0iIyBFTkRfT0ZfVE9QXG4iCi0pOwotCWZmbHVzaChwaXBlaW5wdXRfZmgpOwotCWlmIChyYXdfZmJfc3RyKSB7Ci0JCS8qIHRoZSBwaXBlIHByb2dyYW0gbWF5IGFjdHVhbGx5IGNyZWF0ZSB0aGUgZmIgKi8KLQkJc2xlZXAoMSk7Ci0JfQotfQotCi1pbnQgY2hlY2tfcGlwZWlucHV0KHZvaWQpIHsKLQlpZiAoISBwaXBlaW5wdXRfZmgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChmZXJyb3IocGlwZWlucHV0X2ZoKSkgewotCQlyZmJMb2coInBpcGVpbnB1dCBwaXBlIGhhcyBmZXJyb3IuICVwXG4iLCBwaXBlaW5wdXRfZmgpOwotCQkKLQkJaWYgKHBpcGVpbnB1dF9vcHRzICYmIHN0cnN0cihwaXBlaW5wdXRfb3B0cywgInJlb3BlbiIpKSB7Ci0JCQlyZmJMb2coInJlc3RhcnRpbmcgLXBpcGVpbnB1dCBwaXBlLi4uXG4iKTsKLQkJCWluaXRpYWxpemVfcGlwZWlucHV0KCk7Ci0JCQlpZiAocGlwZWlucHV0X2ZoKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJjbG9zaW5nIC1waXBlaW5wdXQgcGlwZS4uLlxuIik7Ci0JCQlwY2xvc2UocGlwZWlucHV0X2ZoKTsKLQkJCXBpcGVpbnB1dF9maCA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotCmRpZmYgLS1naXQgYS94MTF2bmMvcG9pbnRlci5oIGIveDExdm5jL3BvaW50ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlNWUwYi4uMDAwMDAwMAotLS0gYS94MTF2bmMvcG9pbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfUE9JTlRFUl9ICi0jZGVmaW5lIF9YMTFWTkNfUE9JTlRFUl9ICi0KLS8qIC0tIHBvaW50ZXIuaCAtLSAqLwotCi1leHRlcm4gaW50IHBvaW50ZXJfcXVldWVkX3NlbnQ7Ci0KLWV4dGVybiB2b2lkIGluaXRpYWxpemVfcG9pbnRlcl9tYXAoY2hhciAqcG9pbnRlcl9yZW1hcCk7Ci1leHRlcm4gdm9pZCBkb19idXR0b25fbWFza19jaGFuZ2UoaW50IG1hc2ssIGludCBidXR0b24pOwotZXh0ZXJuIHZvaWQgcG9pbnRlcl9ldmVudChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLWV4dGVybiBpbnQgY2hlY2tfcGlwZWlucHV0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9waXBlaW5wdXQodm9pZCk7Ci1leHRlcm4gdm9pZCB1cGRhdGVfeDExX3BvaW50ZXJfcG9zaXRpb24oaW50IHgsIGludCB5KTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfUE9JTlRFUl9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvcmF0ZXMuYyBiL3gxMXZuYy9yYXRlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTljYTA1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9yYXRlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMyICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gcmF0ZXMuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotCi1pbnQgbWVhc3VyZV9zcGVlZHMgPSAxOwotaW50IHNwZWVkc19uZXRfcmF0ZSA9IDA7Ci1pbnQgc3BlZWRzX25ldF9yYXRlX21lYXN1cmVkID0gMDsKLWludCBzcGVlZHNfbmV0X2xhdGVuY3kgPSAwOwotaW50IHNwZWVkc19uZXRfbGF0ZW5jeV9tZWFzdXJlZCA9IDA7Ci1pbnQgc3BlZWRzX3JlYWRfcmF0ZSA9IDA7Ci1pbnQgc3BlZWRzX3JlYWRfcmF0ZV9tZWFzdXJlZCA9IDA7Ci0KLQotaW50IGdldF9jbXBfcmF0ZSh2b2lkKTsKLWludCBnZXRfcmF3X3JhdGUodm9pZCk7Ci12b2lkIGluaXRpYWxpemVfc3BlZWRzKHZvaWQpOwotaW50IGdldF9yZWFkX3JhdGUodm9pZCk7Ci1pbnQgbGlua19yYXRlKGludCAqbGF0ZW5jeSwgaW50ICpuZXRyYXRlKTsKLWludCBnZXRfbmV0X3JhdGUodm9pZCk7Ci1pbnQgZ2V0X25ldF9sYXRlbmN5KHZvaWQpOwotdm9pZCBtZWFzdXJlX3NlbmRfcmF0ZXMoaW50IGluaXQpOwotCi0KLXN0YXRpYyB2b2lkIG1lYXN1cmVfZGlzcGxheV9ob29rKHJmYkNsaWVudFB0ciBjbCk7Ci1zdGF0aWMgaW50IGdldF9yYXRlKGludCB3aGljaCk7Ci1zdGF0aWMgaW50IGdldF9sYXRlbmN5KHZvaWQpOwotCi0KLXN0YXRpYyB2b2lkIG1lYXN1cmVfZGlzcGxheV9ob29rKHJmYkNsaWVudFB0ciBjbCkgewotCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2wtPmNsaWVudERhdGE7Ci0JaWYgKCEgY2QpIHsKLQkJcmV0dXJuOwotCX0KLQlkdGltZTAoJmNkLT50aW1lcik7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3JhdGUoaW50IHdoaWNoKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGlyYXRlLCBpcmF0ZV9taW4gPSAxOwkvKiAxIEtCL3NlYyAqLwotCWludCBpcmF0ZV9tYXggPSAxMDAwMDA7CQkvKiAxMDAgTUIvc2VjICovCi0JaW50IGNvdW50ID0gMDsKLQlkb3VibGUgc2xvd2VzdCA9IC0xLjAsIHJhdGU7Ci0Jc3RhdGljIGRvdWJsZSBzYXZlX3JhdGUgPSAxMDAwICogTkVUUkFURTA7Ci0KLQlpZiAoIXNjcmVlbikgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJQ2xpZW50RGF0YSAqY2QgPSAoQ2xpZW50RGF0YSAqKSBjbC0+Y2xpZW50RGF0YTsKLQotCQlpZiAoISBjZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNsLT5zdGF0ZSAhPSBSRkJfTk9STUFMKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2QtPnNlbmRfY21wX3JhdGUgPT0gMC4wIHx8IGNkLT5zZW5kX3Jhd19yYXRlID09IDAuMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJY291bnQrKzsKLQkJCi0JCWlmICh3aGljaCA9PSAwKSB7Ci0JCQlyYXRlID0gY2QtPnNlbmRfY21wX3JhdGU7Ci0JCX0gZWxzZSB7Ci0JCQlyYXRlID0gY2QtPnNlbmRfcmF3X3JhdGU7Ci0JCX0KLQkJaWYgKHNsb3dlc3QgPT0gLTEuMCB8fCByYXRlIDwgc2xvd2VzdCkgewotCQkJc2xvd2VzdCA9IHJhdGU7Ci0JCX0KLQkJCi0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQotCWlmICghIGNvdW50KSB7Ci0JCXJldHVybiBORVRSQVRFMDsKLQl9Ci0KLQlpZiAoc2xvd2VzdCA9PSAtMS4wKSB7Ci0JCXNsb3dlc3QgPSBzYXZlX3JhdGU7Ci0JfSBlbHNlIHsKLQkJc2F2ZV9yYXRlID0gc2xvd2VzdDsKLQl9Ci0KLQlpcmF0ZSA9IChpbnQpIChzbG93ZXN0LzEwMDAuMCk7Ci0JaWYgKGlyYXRlIDwgaXJhdGVfbWluKSB7Ci0JCWlyYXRlID0gaXJhdGVfbWluOwotCX0KLQlpZiAoaXJhdGUgPiBpcmF0ZV9tYXgpIHsKLQkJaXJhdGUgPSBpcmF0ZV9tYXg7Ci0JfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZ2V0X3JhdGUoJWQpICVkICUuM2YvJS4zZlxuIiwgd2hpY2gsIGlyYXRlLCBzYXZlX3JhdGUsIHNsb3dlc3QpOyAKLQotCXJldHVybiBpcmF0ZTsKLX0KLQotc3RhdGljIGludCBnZXRfbGF0ZW5jeSh2b2lkKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGlsYXQsIGlsYXRfbWluID0gMTsJLyogMSBtcyAqLwotCWludCBpbGF0X21heCA9IDIwMDA7CS8qIDIgc2VjICovCi0JZG91YmxlIHNsb3dlc3QgPSAtMS4wLCBsYXQ7Ci0Jc3RhdGljIGRvdWJsZSBzYXZlX2xhdCA9ICgoZG91YmxlKSBMQVRFTkNZMCkvMTAwMC4wOwotCWludCBjb3VudCA9IDA7Ci0JCi0JaWYgKCFzY3JlZW4pIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2wtPmNsaWVudERhdGE7Ci0JCQotCQlpZiAoISBjZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNsLT5zdGF0ZSAhPSBSRkJfTk9STUFMKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2QtPmxhdGVuY3kgPT0gMC4wKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQljb3VudCsrOwotCi0JCWxhdCA9IGNkLT5sYXRlbmN5OwotCQlpZiAoc2xvd2VzdCA9PSAtMS4wIHx8IGxhdCA+IHNsb3dlc3QpIHsKLQkJCXNsb3dlc3QgPSBsYXQ7Ci0JCX0KLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JaWYgKCEgY291bnQpIHsKLQkJcmV0dXJuIExBVEVOQ1kwOwotCX0KLQotCWlmIChzbG93ZXN0ID09IC0xLjApIHsKLQkJc2xvd2VzdCA9IHNhdmVfbGF0OwotCX0gZWxzZSB7Ci0JCXNhdmVfbGF0ID0gc2xvd2VzdDsKLQl9Ci0KLQlpbGF0ID0gKGludCkgKHNsb3dlc3QgKiAxMDAwLjApOwotCWlmIChpbGF0IDwgaWxhdF9taW4pIHsKLQkJaWxhdCA9IGlsYXRfbWluOwotCX0KLQlpZiAoaWxhdCA+IGlsYXRfbWF4KSB7Ci0JCWlsYXQgPSBpbGF0X21heDsKLQl9Ci0KLQlyZXR1cm4gaWxhdDsKLX0KLQotaW50IGdldF9jbXBfcmF0ZSh2b2lkKSB7Ci0JcmV0dXJuIGdldF9yYXRlKDApOwotfQotCi1pbnQgZ2V0X3Jhd19yYXRlKHZvaWQpIHsKLQlyZXR1cm4gZ2V0X3JhdGUoMSk7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9zcGVlZHModm9pZCkgewotCWNoYXIgKnMsICpzX2luLCAqcDsKLQlpbnQgaTsKLQotCXNwZWVkc19yZWFkX3JhdGUgPSAwOwotCXNwZWVkc19uZXRfcmF0ZSA9IDA7Ci0Jc3BlZWRzX25ldF9sYXRlbmN5ID0gMDsKLQlpZiAoISBzcGVlZHNfc3RyIHx8ICpzcGVlZHNfc3RyID09ICdcMCcpIHsKLQkJc19pbiA9IHN0cmR1cCgiIik7Ci0JfSBlbHNlIHsKLQkJc19pbiA9IHN0cmR1cChzcGVlZHNfc3RyKTsKLQl9Ci0KLQlpZiAoIXN0cmNtcChzX2luLCAibW9kZW0iKSkgewotCQlzID0gc3RyZHVwKCI2LDQsMjAwIik7Ci0JfSBlbHNlIGlmICghc3RyY21wKHNfaW4sICJkc2wiKSkgewotCQlzID0gc3RyZHVwKCI2LDEwMCw1MCIpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzX2luLCAibGFuIikpIHsKLQkJcyA9IHN0cmR1cCgiNiw1MDAwLDEiKTsKLQl9IGVsc2UgewotCQlzID0gc3RyZHVwKHNfaW4pOwotCX0KLQotCXAgPSBzdHJ0b2socywgIiwiKTsKLQlpID0gMDsKLQl3aGlsZSAocCkgewotCQlkb3VibGUgdmFsOwotCQlpZiAoKnAgIT0gJ1wwJykgewotCQkJdmFsID0gYXRvZihwKTsKLQkJCWlmIChpPT0wKSB7Ci0JCQkJc3BlZWRzX3JlYWRfcmF0ZSA9IChpbnQpIDEwMDAwMDAgKiB2YWw7Ci0JCQl9IGVsc2UgaWYgKGk9PTEpIHsKLQkJCQlzcGVlZHNfbmV0X3JhdGUgPSAoaW50KSAxMDAwICogdmFsOwotCQkJfSBlbHNlIGlmIChpPT0yKSB7Ci0JCQkJc3BlZWRzX25ldF9sYXRlbmN5ID0gKGludCkgdmFsOwotCQkJfQotCQl9Ci0JCWkrKzsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmcmVlKHMpOwotCWZyZWUoc19pbik7Ci0KLQlpZiAoISBzcGVlZHNfcmVhZF9yYXRlKSB7Ci0JCWludCBuID0gMDsKLQkJZG91YmxlIGR0LCB0aW1lcjsKLSNpZmRlZiBNQUNPU1gKLQkJaWYgKG1hY29zeF9jb25zb2xlICYmIG1hY29zeF9yZWFkX29wZW5nbCAmJiBmdWxsc2NyZWVuKSB7Ci0JCQljb3B5X2ltYWdlKGZ1bGxzY3JlZW4sIDAsIDAsIDAsIDApOwotCQkJdXNsZWVwKDEwICogMTAwMCk7Ci0JCX0KLSNlbmRpZgotCi0JCWR0aW1lMCgmdGltZXIpOwotCQlpZiAoZnVsbHNjcmVlbikgewotCQkJY29weV9pbWFnZShmdWxsc2NyZWVuLCAwLCAwLCAwLCAwKTsKLQkJCW4gPSBmdWxsc2NyZWVuLT5ieXRlc19wZXJfbGluZSAqIGZ1bGxzY3JlZW4tPmhlaWdodDsKLQkJfSBlbHNlIGlmIChzY2FubGluZSkgewotCQkJY29weV9pbWFnZShzY2FubGluZSwgMCwgMCwgMCwgMCk7Ci0JCQluID0gc2NhbmxpbmUtPmJ5dGVzX3Blcl9saW5lICogc2NhbmxpbmUtPmhlaWdodDsKLQkJfQotCQlkdCA9IGR0aW1lKCZ0aW1lcik7Ci0JCWlmIChuICYmIGR0ID4gMC4wKSB7Ci0JCQlkb3VibGUgcmF0ZSA9ICgoZG91YmxlKSBuKSAvIGR0OwotCQkJc3BlZWRzX3JlYWRfcmF0ZV9tZWFzdXJlZCA9IChpbnQpIChyYXRlLzEwMDAwMDAuMCk7Ci0JCQlpZiAoc3BlZWRzX3JlYWRfcmF0ZV9tZWFzdXJlZCA8IDEpIHsKLQkJCQlzcGVlZHNfcmVhZF9yYXRlX21lYXN1cmVkID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJmYiByZWFkIHJhdGU6ICVkIE1CL3NlY1xuIiwKLQkJCQkgICAgc3BlZWRzX3JlYWRfcmF0ZV9tZWFzdXJlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWludCBnZXRfcmVhZF9yYXRlKHZvaWQpIHsKLQlpZiAoc3BlZWRzX3JlYWRfcmF0ZSkgewotCQlyZXR1cm4gc3BlZWRzX3JlYWRfcmF0ZTsKLQl9Ci0JaWYgKHNwZWVkc19yZWFkX3JhdGVfbWVhc3VyZWQpIHsKLQkJcmV0dXJuIHNwZWVkc19yZWFkX3JhdGVfbWVhc3VyZWQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgbGlua19yYXRlKGludCAqbGF0ZW5jeSwgaW50ICpuZXRyYXRlKSB7Ci0JKmxhdGVuY3kgPSBnZXRfbmV0X2xhdGVuY3koKTsKLQkqbmV0cmF0ZSA9IGdldF9uZXRfcmF0ZSgpOwotCi0JaWYgKHNwZWVkc19zdHIpIHsKLQkJaWYgKCFzdHJjbXAoc3BlZWRzX3N0ciwgIm1vZGVtIikpIHsKLQkJCXJldHVybiBMUl9ESUFMVVA7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChzcGVlZHNfc3RyLCAiZHNsIikpIHsKLQkJCXJldHVybiBMUl9CUk9BREJBTkQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChzcGVlZHNfc3RyLCAibGFuIikpIHsKLQkJCXJldHVybiBMUl9MQU47Ci0JCX0KLQl9Ci0KLQlpZiAoKmxhdGVuY3kgPT0gTEFURU5DWTAgJiYgKm5ldHJhdGUgPT0gTkVUUkFURTApICB7Ci0JCXJldHVybiBMUl9VTlNFVDsKLQl9IGVsc2UgaWYgKCpsYXRlbmN5ID4gMTUwIHx8ICpuZXRyYXRlIDwgMjApIHsKLQkJcmV0dXJuIExSX0RJQUxVUDsKLQl9IGVsc2UgaWYgKCpsYXRlbmN5ID4gNTAgfHwgKm5ldHJhdGUgPCAxNTApIHsKLQkJcmV0dXJuIExSX0JST0FEQkFORDsKLQl9IGVsc2UgaWYgKCpsYXRlbmN5IDwgMTAgJiYgKm5ldHJhdGUgPiAzMDApIHsKLQkJcmV0dXJuIExSX0xBTjsKLQl9IGVsc2UgewotCQlyZXR1cm4gTFJfVU5LTk9XTjsKLQl9Ci19Ci0KLWludCBnZXRfbmV0X3JhdGUodm9pZCkgewotCWludCBzcG0gPSBzcGVlZHNfbmV0X3JhdGVfbWVhc3VyZWQ7Ci0JaWYgKHNwZWVkc19uZXRfcmF0ZSkgewotCQlyZXR1cm4gc3BlZWRzX25ldF9yYXRlOwotCX0KLQlpZiAoISBzcG0gfHwgc3BtID09IE5FVFJBVEUwKSB7Ci0JCXNwZWVkc19uZXRfcmF0ZV9tZWFzdXJlZCA9IGdldF9jbXBfcmF0ZSgpOwotCX0KLQlpZiAoc3BlZWRzX25ldF9yYXRlX21lYXN1cmVkKSB7Ci0JCXJldHVybiBzcGVlZHNfbmV0X3JhdGVfbWVhc3VyZWQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgZ2V0X25ldF9sYXRlbmN5KHZvaWQpIHsKLQlpbnQgc3BtID0gc3BlZWRzX25ldF9sYXRlbmN5X21lYXN1cmVkOwotCWlmIChzcGVlZHNfbmV0X2xhdGVuY3kpIHsKLQkJcmV0dXJuIHNwZWVkc19uZXRfbGF0ZW5jeTsKLQl9Ci0JaWYgKCEgc3BtIHx8IHNwbSA9PSBMQVRFTkNZMCkgewotCQlzcGVlZHNfbmV0X2xhdGVuY3lfbWVhc3VyZWQgPSBnZXRfbGF0ZW5jeSgpOwotCX0KLQlpZiAoc3BlZWRzX25ldF9sYXRlbmN5X21lYXN1cmVkKSB7Ci0JCXJldHVybiBzcGVlZHNfbmV0X2xhdGVuY3lfbWVhc3VyZWQ7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIG1lYXN1cmVfc2VuZF9yYXRlcyhpbnQgaW5pdCkgewotCWRvdWJsZSBjbXBfcmF0ZSwgcmF3X3JhdGU7Ci0Jc3RhdGljIGRvdWJsZSBub3csIHN0YXJ0ID0gMC4wOwotCXN0YXRpYyByZmJEaXNwbGF5SG9va1B0ciBvcmlnX2Rpc3BsYXlfaG9vayA9IE5VTEw7Ci0JZG91YmxlIGNtcF9tYXggPSAxLjBlKzA4OwkvKiAxMDAgTUIvc2VjICovCi0JZG91YmxlIGNtcF9taW4gPSAxMDAwLjA7CS8qIDk2MDBiYXVkICovCi0JZG91YmxlIGxhdF9tYXggPSA1LjA7CQkvKiA1IHNlYyAqLwotCWRvdWJsZSBsYXRfbWluID0gLjAwMDU7CQkvKiAwLjUgbXMgKi8KLQlpbnQgbWluX2NtcCA9IDEwMDAwLCBuY2xpZW50czsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDAsIGNsOwotCWludCBtc2cgPSAwLCBjbGNudDAgPSAwLCBjYzsKLQlpbnQgZGIgPSAwLCBvdWNoX2RiID0gMCwgb3VjaCA9IDA7Ci0KLQlpZiAoISBtZWFzdXJlX3NwZWVkcykgewotCQlyZXR1cm47Ci0JfQotCWlmIChzcGVlZHNfbmV0X3JhdGUgJiYgc3BlZWRzX25ldF9sYXRlbmN5KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFjbGllbnRfY291bnQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIG9yaWdfZGlzcGxheV9ob29rKSB7Ci0JCW9yaWdfZGlzcGxheV9ob29rID0gc2NyZWVuLT5kaXNwbGF5SG9vazsKLQl9Ci0KLQlpZiAoc3RhcnQgPT0gMC4wKSB7Ci0JCWR0aW1lKCZzdGFydCk7Ci0JfQotCi0JZHRpbWUwKCZub3cpOwotCWlmIChub3cgPCBsYXN0X2NsaWVudF9nb25lKzQuMCkgewotCQlyZXR1cm47Ci0JfQotCW5vdyA9IG5vdyAtIHN0YXJ0OwotCi0JbmNsaWVudHMgPSAwOwotCi0JaWYgKCFzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQotCWNsMCA9IE5VTEw7Ci0JaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgY2wtPmNsaWVudERhdGE7Ci0KLQkJaWYgKCEgY2QpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChjZC0+c2VuZF9jbXBfcmF0ZSA+IDAuMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGNsLT5vbkhvbGQpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW5jbGllbnRzKys7Ci0JCWlmIChjbDAgPT0gTlVMTCkgIHsKLQkJCWNsMCA9IGNsOwotCQl9Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQotCWNsID0gY2wwOwotCWNjID0gMDsKLQotCXdoaWxlIChjbCAhPSBOVUxMICYmIGNjKysgPT0gMCkgewotCQlpbnQgZGVmZXIsIGksIGNicywgcmJzOwotCQljaGFyICpodHRwZGlyOwotCQlkb3VibGUgZHQsIGR0MSA9IDAuMCwgZHQyLCBkdDM7Ci0JCWRvdWJsZSB0bSwgc3Bpbl9tYXggPSAxNS4wLCBzcGluX2xhdF9tYXggPSAxLjU7Ci0JCWludCBnb3RfdDIgPSAwLCBnb3RfdDMgPSAwOwotCQlDbGllbnREYXRhICpjZCA9IChDbGllbnREYXRhICopIGNsLT5jbGllbnREYXRhOwotCi0jaWYgMAotCQlmb3IgKGk9MDsgaTxNQVhfRU5DT0RJTkdTOyBpKyspIHsKLQkJCWNicyArPSBjbC0+Ynl0ZXNTZW50W2ldOwotCQl9Ci0JCXJicyA9IGNsLT5yYXdCeXRlc0VxdWl2YWxlbnQ7Ci0jZWxzZQotI2lmIExJQlZOQ1NFUlZFUl9IQVNfU1RBVFMKLQkJY2JzID0gcmZiU3RhdEdldFNlbnRCeXRlcyhjbCk7Ci0JCXJicyA9IHJmYlN0YXRHZXRTZW50Qnl0ZXNJZlJhdyhjbCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0JCWlmIChpbml0KSB7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIlZCBjbGllbnQgbnVtIHJlY3RzIHJlcTogJWQgIG1vZDogJWQgIGNiczogJWQgICIKLSAgICAicmJzOiAlZCAgZHQxOiAlLjNmICB0OiAlLjNmXG4iLCBpbml0LAotICAgIChpbnQpIHNyYVJnbkNvdW50UmVjdHMoY2wtPnJlcXVlc3RlZFJlZ2lvbiksCi0gICAgKGludCkgc3JhUmduQ291bnRSZWN0cyhjbC0+bW9kaWZpZWRSZWdpb24pLCBjYnMsIHJicywgZHQxLCBub3cpOwotCi0JCQljZC0+dGltZXIgPSBkbm93KCk7Ci0JCQljZC0+Y21wX2J5dGVzX3NlbnQgPSBjYnM7Ci0JCQljZC0+cmF3X2J5dGVzX3NlbnQgPSByYnM7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIGZpcnN0IHBhcnQgb2YgdGhlIGJ1bGsgdHJhbnNmZXIgb2YgaW5pdGlhbCBzY3JlZW4gKi8KLQkJZHQxID0gZHRpbWUoJmNkLT50aW1lcik7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIlZCBjbGllbnQgbnVtIHJlY3RzIHJlcTogJWQgIG1vZDogJWQgIGNiczogJWQgICIKLSAgICAicmJzOiAlZCAgZHQxOiAlLjNmICB0OiAlLjNmXG4iLCBpbml0LAotICAgIChpbnQpIHNyYVJnbkNvdW50UmVjdHMoY2wtPnJlcXVlc3RlZFJlZ2lvbiksCi0gICAgKGludCkgc3JhUmduQ291bnRSZWN0cyhjbC0+bW9kaWZpZWRSZWdpb24pLCBjYnMsIHJicywgZHQxLCBub3cpOwotCi0JCWlmIChkdDEgPD0gMC4wKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWNicyA9IGNicyAtIGNkLT5jbXBfYnl0ZXNfc2VudDsKLQkJcmJzID0gcmJzIC0gY2QtPnJhd19ieXRlc19zZW50OwotCi0JCWlmIChjYnMgPCBtaW5fY21wKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChvdWNoX2RiKSBmcHJpbnRmKHN0ZGVyciwgIlNUQVJULU9VQ0g6ICVkXG4iLCBjbGllbnRfY291bnQpOwotCQljbGNudDAgPSBjbGllbnRfY291bnQ7Ci0jZGVmaW5lIE9VQ0ggKCBvdWNoIHx8IChvdWNoID0gKCFjbGllbnRfY291bnQgfHwgY2xpZW50X2NvdW50ICE9IGNsY250MCB8fCBkbm93KCkgPCBsYXN0X2NsaWVudF9nb25lKzQuMCkpICkKLQotCQlyZmJQRSgxMDAwKTsKLQkJaWYgKE9VQ0ggJiYgb3VjaF9kYikgZnByaW50ZihzdGRlcnIsICIqKipPVUNILUFcbiIpOwotCQlpZiAoT1VDSCkgY29udGludWU7Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLQkJaWYgKHNyYVJnbkNvdW50UmVjdHMoY2wtPm1vZGlmaWVkUmVnaW9uKSkgewotCQkJcmZiUEUoMTAwMCk7Ci0JCQlpZiAoT1VDSCAmJiBvdWNoX2RiKSBmcHJpbnRmKHN0ZGVyciwgIioqKk9VQ0gtQlxuIik7Ci0JCQlpZiAodXNlX3RocmVhZHMpIFVOTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCQkJaWYgKE9VQ0gpIGNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBVTkxPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQotCQlkZWZlciA9IHNjcmVlbi0+ZGVmZXJVcGRhdGVUaW1lOwotCQlodHRwZGlyID0gc2NyZWVuLT5odHRwRGlyOwotCQlzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSA9IDA7Ci0JCXNjcmVlbi0+aHR0cERpciA9IE5VTEw7Ci0KLQkJLyogbWFyayBhIHNtYWxsIHJlY3RhbmdsZTogKi8KLQkJbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIDE2LCAxNiwgMSk7Ci0KLQkJZHRpbWUwKCZ0bSk7Ci0KLQkJZHQyID0gMC4wOwotCQlkdDMgPSAwLjA7Ci0KLQkJaWYgKGR0MSA8IDAuMjUpIHsKLQkJCS8qIHRyeSB0byBjdXQgaXQgZG93biB0byBhdm9pZCBsb25nIHBhdXNlcy4gKi8KLQkJCXNwaW5fbWF4ID0gNS4wOwotCQl9Ci0KLQkJLyogd2hlbiByZXExID0gMSBtb2QxID09IDAsIGVuZCBvZiAybmQgcGFydCBvZiBidWxrIHRyYW5zZmVyICovCi0JCXdoaWxlICgxKSB7Ci0JCQlpbnQgcmVxMCwgcmVxMSwgbW9kMCwgbW9kMTsKLQotCQkJaWYgKE9VQ0ggJiYgb3VjaF9kYikgZnByaW50ZihzdGRlcnIsICIqKipPVUNILUMxXG4iKTsKLQkJCWlmIChPVUNIKSBicmVhazsKLQotCQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLQkJCXJlcTAgPSBzcmFSZ25Db3VudFJlY3RzKGNsLT5yZXF1ZXN0ZWRSZWdpb24pOwotCQkJbW9kMCA9IHNyYVJnbkNvdW50UmVjdHMoY2wtPm1vZGlmaWVkUmVnaW9uKTsKLQotCQkJaWYgKHVzZV90aHJlYWRzKSBVTkxPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQotCQkJaWYgKHVzZV90aHJlYWRzKSB7Ci0JCQkJdXNsZWVwKDEwMDApOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobW9kMCkgewotCQkJCQlyZmJQRSgxMDAwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZmJDRkQoMTAwMCk7Ci0JCQkJfQotCQkJfQotCQkJZHQgPSBkdGltZSgmdG0pOwotCQkJZHQyICs9IGR0OwotCQkJaWYgKGR0MiA+IHNwaW5fbWF4KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChPVUNIICYmIG91Y2hfZGIpIGZwcmludGYoc3RkZXJyLCAiKioqT1VDSC1DMlxuIik7Ci0JCQlpZiAoT1VDSCkgYnJlYWs7Ci0KLQkJCWlmICh1c2VfdGhyZWFkcykgTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCi0JCQlyZXExID0gc3JhUmduQ291bnRSZWN0cyhjbC0+cmVxdWVzdGVkUmVnaW9uKTsKLQkJCW1vZDEgPSBzcmFSZ25Db3VudFJlY3RzKGNsLT5tb2RpZmllZFJlZ2lvbik7Ci0KLQkJCWlmICh1c2VfdGhyZWFkcykgVU5MT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJkdDIgY2FsYzogbnVtIHJlY3RzIHJlcTogJWQvJWQgbW9kOiAlZC8lZCAgIgotICAgICJmYnUtc2VudDogJWQgIGR0OiAlLjRmIGR0MjogJS40ZiAgdG06ICUuNGZcbiIsCi0gICAgcmVxMCwgcmVxMSwgbW9kMCwgbW9kMSwKLSNpZiAwCi0gICAgY2wtPmZyYW1lYnVmZmVyVXBkYXRlTWVzc2FnZXNTZW50LAotI2Vsc2UKLSNpZiBMSUJWTkNTRVJWRVJfSEFTX1NUQVRTCi0gICAgcmZiU3RhdEdldE1lc3NhZ2VDb3VudFNlbnQoY2wsIHJmYkZyYW1lYnVmZmVyVXBkYXRlKSwKLSNlbmRpZgotI2VuZGlmCi0gICAgZHQsIGR0MiwgdG0pOwotCQkJaWYgKHJlcTEgIT0gMCAmJiBtb2QxID09IDApIHsKLQkJCQlnb3RfdDIgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChPVUNIICYmIG91Y2hfZGIpIGZwcmludGYoc3RkZXJyLCAiKioqT1VDSC1EXG4iKTsKLQkJaWYgKE9VQ0gpIGdvdG8gb3VjaDsKLQotCQlpZiAoISBnb3RfdDIpIHsKLQkJCWR0MiA9IDAuMDsKLQkJfSBlbHNlIHsKLQkJCWludCB0ciwgdHJtID0gMzsKLQkJCWRvdWJsZSBkdHNbMTBdOwotCQkJCi0JCQkvKgotCQkJICogTm90ZTogc2luY2Ugb2Z0ZW4gc2VsZWN0KDIpIGNhbm5vdCBzbGVlcAotCQkJICogbGVzcyB0aGFuIDEvSFogKGUuZy4gMTBtcyksIHRoZSByZXNvbHV0aW9uCi0JCQkgKiBvZiB0aGUgbGF0ZW5jeSBtYXkgYmUgbWVzc2VkIHVwIGJ5IHNvbWV0aGluZwotCQkJICogb2YgdGhpcyBvcmRlci4gIEVmZmVjdCBtYXkgb2NjdXIgb24gYm90aCBlbmRzLAotCQkJICogaS5lLiB0aGUgdmlld2VyIG1heSBub3QgcmVzcG9uZCBpbW1lZGlhdGVseS4KLQkJCSAqLwotCQkKLQkJCWZvciAodHIgPSAwOyB0ciA8IHRybTsgdHIrKykgewotCQkJCXVzbGVlcCg1MDAwKTsKLQotCQkJCS8qIG1hcmsgYSAybmQgc21hbGwgcmVjdGFuZ2xlOiAqLwotCQkJCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCAxNiwgMTYsIDEpOwotCQkJCWkgPSAwOwotCQkJCWR0aW1lMCgmdG0pOwotCQkJCWR0MyA9IDAuMDsKLQotCQkJCS8qCi0JCQkJICogd2hlbiByZXExID4gMCBhbmQgbW9kMSA9PSAwLCB3ZSBzYXkKLQkJCQkgKiB0aGF0IGlzIHRoZSAicGluZyIgdGltZS4KLQkJCQkgKi8KLQkJCQl3aGlsZSAoMSkgewotCQkJCQlpbnQgcmVxMCwgcmVxMSwgbW9kMCwgbW9kMTsKLQotCQkJCQlpZiAodXNlX3RocmVhZHMpIExPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQotCQkJCQlyZXEwID0gc3JhUmduQ291bnRSZWN0cyhjbC0+cmVxdWVzdGVkUmVnaW9uKTsKLQkJCQkJbW9kMCA9IHNyYVJnbkNvdW50UmVjdHMoY2wtPm1vZGlmaWVkUmVnaW9uKTsKLQotCQkJCQlpZiAodXNlX3RocmVhZHMpIFVOTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCi0JCQkJCWlmIChpID09IDApIHsKLQkJCQkJCXJmYlBFKDApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHVzZV90aHJlYWRzKSB7Ci0JCQkJCQkJdXNsZWVwKDEwMDApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvKiB0cnkgdG8gZ2V0IGl0IGFsbCAqLwotCQkJCQkJCXJmYkNGRCgxMDAwKjEwMDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChPVUNIICYmIG91Y2hfZGIpIGZwcmludGYoc3RkZXJyLCAiKioqT1VDSC1FXG4iKTsKLQkJCQkJaWYgKE9VQ0gpIGdvdG8gb3VjaDsKLQkJCQkJZHQgPSBkdGltZSgmdG0pOwotCQkJCQlpKys7Ci0KLQkJCQkJZHQzICs9IGR0OwotCQkJCQlpZiAoZHQzID4gc3Bpbl9sYXRfbWF4KSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWlmICh1c2VfdGhyZWFkcykgTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCi0JCQkJCXJlcTEgPSBzcmFSZ25Db3VudFJlY3RzKGNsLT5yZXF1ZXN0ZWRSZWdpb24pOwotCQkJCQltb2QxID0gc3JhUmduQ291bnRSZWN0cyhjbC0+bW9kaWZpZWRSZWdpb24pOwotCi0JCQkJCWlmICh1c2VfdGhyZWFkcykgVU5MT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJkdDMgY2FsYzogbnVtIHJlY3RzIHJlcTogJWQvJWQgbW9kOiAlZC8lZCAgIgotICAgICJmYnUtc2VudDogJWQgIGR0OiAlLjRmIGR0MzogJS40ZiAgdG06ICUuNGZcbiIsCi0gICAgcmVxMCwgcmVxMSwgbW9kMCwgbW9kMSwKLSNpZiAwCi0gICAgY2wtPmZyYW1lYnVmZmVyVXBkYXRlTWVzc2FnZXNTZW50LAotI2Vsc2UKLSNpZiBMSUJWTkNTRVJWRVJfSEFTX1NUQVRTCi0gICAgcmZiU3RhdEdldE1lc3NhZ2VDb3VudFNlbnQoY2wsIHJmYkZyYW1lYnVmZmVyVXBkYXRlKSwKLSNlbmRpZgotI2VuZGlmCi0gICAgZHQsIGR0MywgdG0pOwotCi0JCQkJCWlmIChyZXExICE9IDAgJiYgbW9kMSA9PSAwKSB7Ci0JCQkJCQlkdHNbZ290X3QzKytdID0gZHQzOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQotCQkJaWYgKCEgZ290X3QzKSB7Ci0JCQkJZHQzID0gMC4wOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZ290X3QzID09IDEpIHsKLQkJCQkJZHQzID0gZHRzWzBdOwotCQkJCX0gZWxzZSBpZiAoZ290X3QzID09IDIpIHsKLQkJCQkJZHQzID0gZHRzWzFdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkdHNbMl0gPiAwLjApIHsKLQkJCQkJCWRvdWJsZSByYXQgPSBkdHNbMV0vZHRzWzJdOwotCQkJCQkJaWYgKHJhdCA+IDAuNSAmJiByYXQgPCAyLjApIHsKLQkJCQkJCQlkdDMgPSBkdHNbMV0rZHRzWzJdOwotCQkJCQkJCWR0MyAqPSAwLjU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWR0MyA9IGR0c1sxXTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR0MyA9IGR0c1sxXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW91Y2g6Ci0JCQotCQlzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSA9IGRlZmVyOwotCQlzY3JlZW4tPmh0dHBEaXIgPSBodHRwZGlyOwotCi0JCWlmIChPVUNIICYmIG91Y2hfZGIpIGZwcmludGYoc3RkZXJyLCAiKioqT1VDSC1GXG4iKTsKLQkJaWYgKE9VQ0gpIGJyZWFrOwotCi0JCWR0ID0gZHQxICsgZHQyOwotCi0KLQkJaWYgKGR0MyA8PSBkdDIvMi4wKSB7Ci0JCQkvKiBndWVzcyBvbmx5IDEvMiBhIHBpbmcgZm9yIHJlcGx5Li4uICovCi0JCQlkdCA9IGR0IC0gZHQzLzIuMDsKLQkJfQotCi0JCWNtcF9yYXRlID0gY2JzL2R0OwotCQlyYXdfcmF0ZSA9IHJicy9kdDsKLQotCQlpZiAoY21wX3JhdGUgPiBjbXBfbWF4KSB7Ci0JCQljbXBfcmF0ZSA9IGNtcF9tYXg7Ci0JCX0KLQkJaWYgKGNtcF9yYXRlIDw9IGNtcF9taW4pIHsKLQkJCWNtcF9yYXRlID0gY21wX21pbjsKLQkJfQotCi0JCWNkLT5zZW5kX2NtcF9yYXRlID0gY21wX3JhdGU7Ci0JCWNkLT5zZW5kX3Jhd19yYXRlID0gcmF3X3JhdGU7Ci0KLQkJaWYgKGR0MyA+IGxhdF9tYXgpIHsKLQkJCWR0MyA9IGxhdF9tYXg7Ci0JCX0KLQkJaWYgKGR0MyA8PSBsYXRfbWluKSB7Ci0JCQlkdDMgPSBsYXRfbWluOwotCQl9Ci0KLQkJY2QtPmxhdGVuY3kgPSBkdDM7Ci0JCQotCQlyZmJMb2coImNsaWVudCAlZCBuZXR3b3JrIHJhdGUgJS4xZiBLQi9zZWMgKCUuMWYgZWZmIEtCL3NlYylcbiIsCi0JCSAgICBjZC0+dWlkLCBjbXBfcmF0ZS8xMDAwLjAsIHJhd19yYXRlLzEwMDAuMCk7Ci0JCXJmYkxvZygiY2xpZW50ICVkIGxhdGVuY3k6ICAlLjFmIG1zXG4iLCBjZC0+dWlkLCAxMDAwLjAqZHQzKTsKLQkJcmZiTG9nKCJkdDE6ICUuNGYsIGR0MjogJS40ZiBkdDM6ICUuNGYgYnl0ZXM6ICVkXG4iLAotCQkgICAgZHQxLCBkdDIsIGR0MywgY2JzKTsKLQkJbXNnID0gMTsKLQl9Ci0KLQlpZiAobXNnKSB7Ci0JCWludCBsaW5rLCBsYXRlbmN5LCBuZXRyYXRlOwotCQljaGFyICpzdHIgPSAiZXJyb3IiOwotCi0JCWxpbmsgPSBsaW5rX3JhdGUoJmxhdGVuY3ksICZuZXRyYXRlKTsKLQkJaWYgKGxpbmsgPT0gTFJfVU5TRVQpIHsKLQkJCXN0ciA9ICJMUl9VTlNFVCI7Ci0JCX0gZWxzZSBpZiAobGluayA9PSBMUl9VTktOT1dOKSB7Ci0JCQlzdHIgPSAiTFJfVU5LTk9XTiI7Ci0JCX0gZWxzZSBpZiAobGluayA9PSBMUl9ESUFMVVApIHsKLQkJCXN0ciA9ICJMUl9ESUFMVVAiOwotCQl9IGVsc2UgaWYgKGxpbmsgPT0gTFJfQlJPQURCQU5EKSB7Ci0JCQlzdHIgPSAiTFJfQlJPQURCQU5EIjsKLQkJfSBlbHNlIGlmIChsaW5rID09IExSX0xBTikgewotCQkJc3RyID0gIkxSX0xBTiI7Ci0JCX0KLQkJcmZiTG9nKCJsaW5rX3JhdGU6ICVzIC0gJWQgbXMsICVkIEtCL3NcbiIsIHN0ciwgbGF0ZW5jeSwKLQkJICAgIG5ldHJhdGUpOwotCX0KLQotCWlmIChpbml0KSB7Ci0JCWlmIChuY2xpZW50cykgewotCQkJc2NyZWVuLT5kaXNwbGF5SG9vayA9IG1lYXN1cmVfZGlzcGxheV9ob29rOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2NyZWVuLT5kaXNwbGF5SG9vayA9IG9yaWdfZGlzcGxheV9ob29rOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3JhdGVzLmggYi94MTF2bmMvcmF0ZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlOGM0ZS4uMDAwMDAwMAotLS0gYS94MTF2bmMvcmF0ZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1JBVEVTX0gKLSNkZWZpbmUgX1gxMVZOQ19SQVRFU19ICi0KLS8qIC0tIHJhdGVzLmggLS0gKi8KLQotZXh0ZXJuIGludCBtZWFzdXJlX3NwZWVkczsKLWV4dGVybiBpbnQgc3BlZWRzX25ldF9yYXRlOwotZXh0ZXJuIGludCBzcGVlZHNfbmV0X3JhdGVfbWVhc3VyZWQ7Ci1leHRlcm4gaW50IHNwZWVkc19uZXRfbGF0ZW5jeTsKLWV4dGVybiBpbnQgc3BlZWRzX25ldF9sYXRlbmN5X21lYXN1cmVkOwotZXh0ZXJuIGludCBzcGVlZHNfcmVhZF9yYXRlOwotZXh0ZXJuIGludCBzcGVlZHNfcmVhZF9yYXRlX21lYXN1cmVkOwotCi1leHRlcm4gaW50IGdldF9jbXBfcmF0ZSh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0X3Jhd19yYXRlKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9zcGVlZHModm9pZCk7Ci1leHRlcm4gaW50IGdldF9yZWFkX3JhdGUodm9pZCk7Ci1leHRlcm4gaW50IGxpbmtfcmF0ZShpbnQgKmxhdGVuY3ksIGludCAqbmV0cmF0ZSk7Ci1leHRlcm4gaW50IGdldF9uZXRfcmF0ZSh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0X25ldF9sYXRlbmN5KHZvaWQpOwotZXh0ZXJuIHZvaWQgbWVhc3VyZV9zZW5kX3JhdGVzKGludCBpbml0KTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfUkFURVNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3JlbW90ZS5jIGIveDExdm5jL3JlbW90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllNWY4Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9yZW1vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMjMgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSByZW1vdGUuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgInh3cmFwcGVycy5oIgotI2luY2x1ZGUgInhldmVudHMuaCIKLSNpbmNsdWRlICJ4aW5lcmFtYS5oIgotI2luY2x1ZGUgInhyYW5kci5oIgotI2luY2x1ZGUgInhkYW1hZ2UuaCIKLSNpbmNsdWRlICJ4cmVjb3JkLmgiCi0jaW5jbHVkZSAieGtiX2JlbGwuaCIKLSNpbmNsdWRlICJ3aW5fdXRpbHMuaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAiZ3VpLmgiCi0jaW5jbHVkZSAic29saWQuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAicmF0ZXMuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJwb2ludGVyLmgiCi0jaW5jbHVkZSAiY3Vyc29yLmgiCi0jaW5jbHVkZSAidXNlcmlucHV0LmgiCi0jaW5jbHVkZSAia2V5Ym9hcmQuaCIKLSNpbmNsdWRlICJzZWxlY3Rpb24uaCIKLSNpbmNsdWRlICJ1bml4cHcuaCIKLSNpbmNsdWRlICJ1aW5wdXQuaCIKLSNpbmNsdWRlICJ1c2VyaW5wdXQuaCIKLSNpbmNsdWRlICJhdmFoaS5oIgotI2luY2x1ZGUgInNzbGhlbHBlci5oIgotCi1pbnQgc2VuZF9yZW1vdGVfY21kKGNoYXIgKmNtZCwgaW50IHF1ZXJ5LCBpbnQgd2FpdCk7Ci1pbnQgZG9fcmVtb3RlX3F1ZXJ5KGNoYXIgKnJlbW90ZV9jbWQsIGNoYXIgKnF1ZXJ5X2NtZCwgaW50IHJlbW90ZV9zeW5jLAotICAgIGludCBxZGVmYXVsdCk7Ci12b2lkIGNoZWNrX2JsYWNrX2ZiKHZvaWQpOwotaW50IGNoZWNrX2h0dHBkaXIodm9pZCk7Ci12b2lkIGh0dHBfY29ubmVjdGlvbnMoaW50IG9uKTsKLWludCByZW1vdGVfY29udHJvbF9hY2Nlc3Nfb2sodm9pZCk7Ci1jaGFyICpwcm9jZXNzX3JlbW90ZV9jbWQoY2hhciAqY21kLCBpbnQgc3RyaW5nb25seSk7Ci0KLQotc3RhdGljIGNoYXIgKmFkZF9pdGVtKGNoYXIgKmluc3RyLCBjaGFyICppdGVtKTsKLXN0YXRpYyBjaGFyICpkZWxldGVfaXRlbShjaGFyICppbnN0ciwgY2hhciAqaXRlbSk7Ci1zdGF0aWMgdm9pZCBpZl84YnBwX2RvX25ld19mYih2b2lkKTsKLXN0YXRpYyB2b2lkIHJlc2V0X2h0dHBwb3J0KGludCBvbGQsIGludCBuZXdwKTsKLXN0YXRpYyB2b2lkIHJlc2V0X3JmYnBvcnQoaW50IG9sZCwgaW50IG5ld3ApIDsKLQotY2hhciAqcXVlcnlfcmVzdWx0ID0gTlVMTDsKLQotLyoKLSAqIGZvciB0aGUgd2lsZC1uLWNyYXp5IC1yZW1vdGUvLVIgaW50ZXJmYWNlLgotICovCi1pbnQgc2VuZF9yZW1vdGVfY21kKGNoYXIgKmNtZCwgaW50IHF1ZXJ5LCBpbnQgd2FpdCkgewotCUZJTEUgKmluID0gTlVMTDsKLQotCWlmIChxdWVyeV9yZXN1bHQgIT0gTlVMTCkgewotCQlmcmVlKHF1ZXJ5X3Jlc3VsdCk7Ci0JCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7Ci0JfQotCi0JaWYgKGNsaWVudF9jb25uZWN0X2ZpbGUpIHsKLQkJdW1hc2soMDc3KTsKLQkJaW4gPSBmb3BlbihjbGllbnRfY29ubmVjdF9maWxlLCAidyIpOwotCQlpZiAoaW4gPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJzZW5kX3JlbW90ZV9jbWQ6IGNvdWxkIG5vdCBvcGVuICIKLQkJCSAgICAiY29ubmVjdCBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZ1xuIiwKLQkJCSAgICBjbGllbnRfY29ubmVjdF9maWxlKTsKLQkJCXBlcnJvcigiZm9wZW4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfSBlbHNlIGlmICh4MTF2bmNfcmVtb3RlX3Byb3AgPT0gTm9uZSkgewotCQlpbml0aWFsaXplX3gxMXZuY19yZW1vdGVfcHJvcCgpOwotCQlpZiAoeDExdm5jX3JlbW90ZV9wcm9wID09IE5vbmUpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAic2VuZF9yZW1vdGVfY21kOiBjb3VsZCBub3Qgb2J0YWluICIKLQkJCSAgICAiWDExVk5DX1JFTU9URSBYIHByb3BlcnR5XG4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JaWYgKGluICE9IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICI+Pj4gc2VuZGluZyByZW1vdGUgY29tbWFuZDogXCIlc1wiXG4gIHZpYSIKLQkJICAgICIgY29ubmVjdCBmaWxlOiAlc1xuIiwgY21kLCBjbGllbnRfY29ubmVjdF9maWxlKTsKLQkJZnByaW50ZihpbiwgIiVzXG4iLCBjbWQpOwotCQlmY2xvc2UoaW4pOwotCX0gZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiPj4+IHNlbmRpbmcgcmVtb3RlIGNvbW1hbmQ6IFwiJXNcIiB2aWEiCi0JCSAgICAiIFgxMVZOQ19SRU1PVEUgWCBwcm9wZXJ0eS5cbiIsIGNtZCk7Ci0JCXNldF94MTF2bmNfcmVtb3RlX3Byb3AoY21kKTsKLQkJaWYgKGRweSkgewotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCX0KLQl9Ci0KLQlpZiAocXVlcnkgfHwgd2FpdCkgewotCQljaGFyIGxpbmVbWDExVk5DX1JFTU9URV9NQVhdOwkKLQkJaW50IHJjPTEsIGk9MCwgbWF4PTE0MCwgbXNfc2w9MjU7Ci0KLQkJaWYgKCFzdHJjbXAoY21kLCAiY21kPXN0b3AiKSkgewotCQkJbWF4ID0gNDA7Ci0JCX0KLQkJaWYgKHN0cnN0cihjbWQsICJzY3JpcHQ6IikpIHsKLQkJCW1heCA9IDQwMDsKLQkJfQotCQlpZiAoc3Ryc3RyKGNtZCwgImJjeF94YXR0YWNoOiIpKSB7Ci0JCQltYXggPSA0MDA7Ci0JCX0KLQkJaWYgKGdldGVudigiWDExVk5DX1NZTkNfVElNRU9VVCIpKSB7Ci0JCQltYXggPSAoaW50KSAoKDEwMDAuICogYXRvZihnZXRlbnYoIlgxMVZOQ19TWU5DX1RJTUVPVVQiKSkpL21zX3NsKTsKLQkJfQotCQlmb3IgKGk9MDsgaTxtYXg7IGkrKykgewotCQkJaWYgKGk9PTApIHsKLQkJCQl1c2xlZXAoMTAgKiAxMDAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNsZWVwKG1zX3NsICogMTAwMCk7Ci0JCQl9Ci0JCQlpZiAoY2xpZW50X2Nvbm5lY3RfZmlsZSkgewotCQkJCWNoYXIgKnE7Ci0JCQkJaW4gPSBmb3BlbihjbGllbnRfY29ubmVjdF9maWxlLCAiciIpOwotCQkJCWlmIChpbiA9PSBOVUxMKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAic2VuZF9yZW1vdGVfY21kOiBjb3VsZCIKLQkJCQkJICAgICIgbm90IG9wZW4gY29ubmVjdCBmaWxlIFwiJXNcIiBmb3IiCi0JCQkJCSAgICAiIHdyaXRpbmdcbiIsIGNsaWVudF9jb25uZWN0X2ZpbGUpOwotCQkJCQlwZXJyb3IoImZvcGVuIik7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlmZ2V0cyhsaW5lLCBYMTFWTkNfUkVNT1RFX01BWCwgaW4pOwotCQkJCWZjbG9zZShpbik7Ci0JCQkJcSA9IGxpbmU7Ci0JCQkJd2hpbGUgKCpxICE9ICdcMCcpIHsKLQkJCQkJaWYgKCpxID09ICdcbicpICpxID0gJ1wwJzsKLQkJCQkJcSsrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVhZF94MTF2bmNfcmVtb3RlX3Byb3AoMSk7Ci0JCQkJc3RybmNweShsaW5lLCB4MTF2bmNfcmVtb3RlX3N0ciwKLQkJCQkgICAgWDExVk5DX1JFTU9URV9NQVgpOwotCQkJfQotCQkJaWYgKHN0cmNtcChjbWQsIGxpbmUpKSB7Ci0JCQkJaWYgKHF1ZXJ5IHx8IHdhaXQpIHsKLQkJCQkJcXVlcnlfcmVzdWx0ID0gc3RyZHVwKGxpbmUpOwotCQkJCQlmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBsaW5lKTsKLQkJCQkJZmZsdXNoKHN0ZG91dCk7Ci0JCQkJfQotCQkJCXJjID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmMpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCBjb25uZWN0IHRvICIKLQkJCSAgICAiYW4geDExdm5jIHNlcnZlciBhdCAlcyAgKHJjPSVkKVxuIiwKLQkJCSAgICBjbGllbnRfY29ubmVjdF9maWxlID8gY2xpZW50X2Nvbm5lY3RfZmlsZQotCQkJICAgIDogRGlzcGxheVN0cmluZyhkcHkpLCByYyk7Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRvX3JlbW90ZV9xdWVyeShjaGFyICpyZW1vdGVfY21kLCBjaGFyICpxdWVyeV9jbWQsIGludCByZW1vdGVfc3luYywKLSAgICBpbnQgcWRlZmF1bHQpIHsKLQljaGFyICpyY21kID0gTlVMTCwgKnFjbWQgPSBOVUxMOwotCWludCByYyA9IDEsIGRpcmVjdCA9IDA7Ci0KLQlpZiAocWRlZmF1bHQgJiYgIXF1ZXJ5X2NtZCkgewotCQlxdWVyeV9jbWQgPSByZW1vdGVfY21kOwotCQlyZW1vdGVfY21kID0gTlVMTDsKLQl9Ci0JaWYgKHJlbW90ZV9jbWQgJiYgc3Ryc3RyKHJlbW90ZV9jbWQsICJESVJFQ1Q6IikgPT0gcmVtb3RlX2NtZCkgewotCQlkaXJlY3QgPSAxOwotCQlyZW1vdGVfY21kICs9IHN0cmxlbigiRElSRUNUOiIpOwotCX0KLQlpZiAocXVlcnlfY21kICYmIHN0cnN0cihxdWVyeV9jbWQsICJESVJFQ1Q6IikgPT0gcXVlcnlfY21kKSB7Ci0JCWRpcmVjdCA9IDE7Ci0JCXF1ZXJ5X2NtZCArPSBzdHJsZW4oIkRJUkVDVDoiKTsKLQl9Ci0KLQlpZiAocmVtb3RlX2NtZCkgewotCQlyY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihyZW1vdGVfY21kKSArIDUpOwotCQlzdHJjcHkocmNtZCwgImNtZD0iKTsKLQkJc3RyY2F0KHJjbWQsIHJlbW90ZV9jbWQpOwotCX0KLQlpZiAocXVlcnlfY21kKSB7Ci0JCXFjbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHF1ZXJ5X2NtZCkgKyA1KTsKLQkJc3RyY3B5KHFjbWQsICJxcnk9Iik7Ci0JCXN0cmNhdChxY21kLCBxdWVyeV9jbWQpOwotCX0KLQlpZiAoZGlyZWN0KSB7Ci0JCWNoYXIgKnJlczsKLQkJaWYgKHJjbWQpIHsKLQkJCXJlcyA9IHByb2Nlc3NfcmVtb3RlX2NtZChyY21kLCAxKTsKLQkJCWZwcmludGYoc3Rkb3V0LCAiJXNcbiIsIHJlcyk7Ci0JCX0KLQkJaWYgKHFjbWQpIHsKLQkJCXJlcyA9IHByb2Nlc3NfcmVtb3RlX2NtZChxY21kLCAxKTsKLQkJCWZwcmludGYoc3Rkb3V0LCAiJXNcbiIsIHJlcyk7Ci0JCX0KLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocWRlZmF1bHQpIHsKLQkJY2hhciAqcmVzOwotCQlpZiAoIXFjbWQpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJlcyA9IHByb2Nlc3NfcmVtb3RlX2NtZChxY21kLCAxKTsKLQkJZnByaW50ZihzdGRvdXQsICIlc1xuIiwgcmVzKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlpZiAocmNtZCAmJiBxY21kKSB7Ci0JCXJjID0gc2VuZF9yZW1vdGVfY21kKHJjbWQsIDAsIDEpOwotCQlpZiAocmMpIHsKLQkJCWZyZWUocmNtZCk7Ci0JCQlmcmVlKHFjbWQpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCQlyYyA9IHNlbmRfcmVtb3RlX2NtZChxY21kLCAxLCAxKTsKLQl9IGVsc2UgaWYgKHJjbWQpIHsKLQkJcmMgPSBzZW5kX3JlbW90ZV9jbWQocmNtZCwgMCwgcmVtb3RlX3N5bmMpOwotCQlmcmVlKHJjbWQpOwotCX0gZWxzZSBpZiAocWNtZCkgewotCQlyYyA9IHNlbmRfcmVtb3RlX2NtZChxY21kLCAxLCAxKTsKLQkJZnJlZShxY21kKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY2hhciAqYWRkX2l0ZW0oY2hhciAqaW5zdHIsIGNoYXIgKml0ZW0pIHsKLQljaGFyICpwLCAqc3RyOwotCWludCBsZW4sIHNhd19pdGVtID0gMDsKLQotCWlmICghIGluc3RyIHx8ICppbnN0ciA9PSAnXDAnKSB7Ci0JCXN0ciA9IHN0cmR1cChpdGVtKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JbGVuID0gc3RybGVuKGluc3RyKSArIDEgKyBzdHJsZW4oaXRlbSkgKyAxOwotCXN0ciA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCXN0clswXSA9ICdcMCc7Ci0KLQkvKiBuLmIuIGluc3RyIHdpbGwgYmUgbW9kaWZpZWQ7IGNhbGxlciByZXBsYWNlcyB3aXRoIHJldHVybmVkIHN0cmluZyAqLwotCXAgPSBzdHJ0b2soaW5zdHIsICIsIik7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKCFzdHJjbXAocCwgaXRlbSkpIHsKLQkJCWlmIChzYXdfaXRlbSkgewotCQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNhd19pdGVtID0gMTsKLQkJfSBlbHNlIGlmICgqcCA9PSAnXDAnKSB7Ci0JCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc3RyWzBdKSB7Ci0JCQlzdHJjYXQoc3RyLCAiLCIpOwotCQl9Ci0JCXN0cmNhdChzdHIsIHApOwotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWlmICghIHNhd19pdGVtKSB7Ci0JCWlmIChzdHJbMF0pIHsKLQkJCXN0cmNhdChzdHIsICIsIik7Ci0JCX0KLQkJc3RyY2F0KHN0ciwgaXRlbSk7Ci0JfQotCXJldHVybiBzdHI7Ci19Ci0KLXN0YXRpYyBjaGFyICpkZWxldGVfaXRlbShjaGFyICppbnN0ciwgY2hhciAqaXRlbSkgewotCWNoYXIgKnAsICpzdHI7Ci0JaW50IGxlbjsKLQotCWlmICghIGluc3RyIHx8ICppbnN0ciA9PSAnXDAnKSB7Ci0JCXN0ciA9IHN0cmR1cCgiIik7Ci0JCXJldHVybiBzdHI7Ci0JfQotCWxlbiA9IHN0cmxlbihpbnN0cikgKyAxOwotCXN0ciA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCXN0clswXSA9ICdcMCc7Ci0KLQkvKiBuLmIuIGluc3RyIHdpbGwgYmUgbW9kaWZpZWQ7IGNhbGxlciByZXBsYWNlcyB3aXRoIHJldHVybmVkIHN0cmluZyAqLwotCXAgPSBzdHJ0b2soaW5zdHIsICIsIik7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKCFzdHJjbXAocCwgaXRlbSkgfHwgKnAgPT0gJ1wwJykgewotCQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0clswXSkgewotCQkJc3RyY2F0KHN0ciwgIiwiKTsKLQkJfQotCQlzdHJjYXQoc3RyLCBwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlyZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgdm9pZCBpZl84YnBwX2RvX25ld19mYih2b2lkKSB7Ci0JaWYgKGJwcCA9PSA4KSB7Ci0JCWRvX25ld19mYigwKTsKLQl9IGVsc2UgewotCQlyZmJMb2coIiAgYnBwKCVkKSBpcyBub3QgOGJwcCwgbm90IHJlc2V0dGluZyBmYlxuIiwgYnBwKTsKLQl9Ci19Ci0KLXZvaWQgY2hlY2tfYmxhY2tfZmIodm9pZCkgewotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG5ld19mYl9zaXplX2NsaWVudHMoc2NyZWVuKSAhPSBjbGllbnRfY291bnQpIHsKLQkJcmZiTG9nKCJ0cnlpbmcgdG8gc2VuZCBhIGJsYWNrIGZiIGZvciBub24tbmV3ZmJzaXplIgotCQkgICAgIiBjbGllbnRzICVkICE9ICVkXG4iLCBjbGllbnRfY291bnQsCi0JCSAgICBuZXdfZmJfc2l6ZV9jbGllbnRzKHNjcmVlbikpOwotCQlwdXNoX2JsYWNrX3NjcmVlbig0KTsKLQl9Ci19Ci0KLWludCBjaGVja19odHRwZGlyKHZvaWQpIHsKLQlpZiAoaHR0cF9kaXIgJiYgaHR0cF9kaXJbMF0gIT0gJ1wwJykgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQljaGFyICpwcm9nID0gTlVMTCwgKmh0dHBkaXIsICpxOwotCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCQlpbnQgbGVuOwotCi0JCXJmYkxvZygiY2hlY2tfaHR0cGRpcjogdHJ5aW5nIHRvIGd1ZXNzIGh0dHBkaXIuLi4gJXNcbiIsIHByb2dyYW1fbmFtZSk7Ci0JCWlmIChwcm9ncmFtX25hbWVbMF0gPT0gJy8nKSB7Ci0JCQlwcm9nID0gc3RyZHVwKHByb2dyYW1fbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyIGN3ZFsxMDI0XTsKLQkJCWdldGN3ZChjd2QsIDEwMjQpOwotCQkJbGVuID0gc3RybGVuKGN3ZCkgKyAxICsgc3RybGVuKHByb2dyYW1fbmFtZSkgKyAxOwotCQkJcHJvZyA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCQkJc25wcmludGYocHJvZywgbGVuLCAiJXMvJXMiLCBjd2QsIHByb2dyYW1fbmFtZSk7Ci0JCQlpZiAoc3RhdChwcm9nLCAmc2J1ZikgIT0gMCkgewotCQkJCWNoYXIgKnBhdGggPSBzdHJkdXAoZ2V0ZW52KCJQQVRIIikpOwotCQkJCWNoYXIgKnAsICpiYXNlOwotCQkJCWJhc2UgPSBzdHJyY2hyKHByb2dyYW1fbmFtZSwgJy8nKTsKLQkJCQlpZiAoYmFzZSkgewotCQkJCQliYXNlKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZSA9IHByb2dyYW1fbmFtZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcCA9IHN0cnRvayhwYXRoLCAiOiIpOwotCQkJCXdoaWxlKHApIHsKLQkJCQkJaWYgKHByb2cpIHsKLQkJCQkJCWZyZWUocHJvZyk7Ci0JCQkJCQlwcm9nID0gTlVMTDsKLQkJCQkJfQotCQkJCQlsZW4gPSBzdHJsZW4ocCkgKyAxICsgc3RybGVuKGJhc2UpICsgMTsKLQkJCQkJcHJvZyA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCQkJCQlzbnByaW50Zihwcm9nLCBsZW4sICIlcy8lcyIsIHAsIGJhc2UpOwotCQkJCQlpZiAoc3RhdChwcm9nLCAmc2J1ZikgPT0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcCA9IHN0cnRvayhOVUxMLCAiOiIpOwotCQkJCX0KLQkJCQlmcmVlKHBhdGgpOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIC9wYXRoL3RvL2Jpbi94MTF2bmMKLQkJICogL3BhdGgvdG8vYmluLy4uL3NoYXJlL3gxMXZuYy9jbGFzc2VzCi0JCSAqICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2NwotCQkgKiAvcGF0aC90by9iaW4vLi4vc2hhcmUveDExdm5jL2NsYXNzZXMvc3NsCi0JCSAqICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEKLQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKLQkJICovCi0JCWlmICgocSA9IHN0cnJjaHIocHJvZywgJy8nKSkgPT0gTlVMTCkgewotCQkJcmZiTG9nKCJjaGVja19odHRwZGlyOiBiYWQgcHJvZ3JhbSBwYXRoOiAlc1xuIiwgcHJvZyk7Ci0JCQlmcmVlKHByb2cpOwotCQkJcmZiTG9nKCJjaGVja19odHRwZGlyOiAqSFRUUCBkaXNhYmxlZCogIFVzZSAtaHR0cGRpciBwYXRoXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJbGVuID0gc3RybGVuKHByb2cpICsgMjEgKyAxOwotCQkqcSA9ICdcMCc7Ci0JCWh0dHBkaXIgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQkJaWYgKHVzZV9zdHVubmVsICYmIGh0dHBfc3NsKSB7Ci0JCQlzbnByaW50ZihodHRwZGlyLCBsZW4sICIlcy8uLi9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wiLCBwcm9nKTsKLQkJfSBlbHNlIGlmICghZW5jX3N0ciAmJiAodXNlX29wZW5zc2wgfHwgdXNlX3N0dW5uZWwgfHwgaHR0cF9zc2wpKSB7Ci0JCQlzbnByaW50ZihodHRwZGlyLCBsZW4sICIlcy8uLi9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wiLCBwcm9nKTsKLQkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKGh0dHBkaXIsIGxlbiwgIiVzLy4uL3NoYXJlL3gxMXZuYy9jbGFzc2VzIiwgcHJvZyk7Ci0JCX0KLQkJaWYgKHN0YXQoaHR0cGRpciwgJnNidWYpICE9IDApIHsKLQkJCWlmICh1c2Vfc3R1bm5lbCAmJiBodHRwX3NzbCkgewotCQkJCXNucHJpbnRmKGh0dHBkaXIsIGxlbiwgIiVzLy4uL2NsYXNzZXMvc3NsIiwgcHJvZyk7Ci0JCQl9IGVsc2UgaWYgKCFlbmNfc3RyICYmICh1c2Vfb3BlbnNzbCB8fCB1c2Vfc3R1bm5lbCB8fCBodHRwX3NzbCkpIHsKLQkJCQlzbnByaW50ZihodHRwZGlyLCBsZW4sICIlcy8uLi9jbGFzc2VzL3NzbCIsIHByb2cpOwotCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihodHRwZGlyLCBsZW4sICIlcy8uLi9jbGFzc2VzIiwgcHJvZyk7Ci0JCQl9Ci0JCX0KLQkJZnJlZShwcm9nKTsKLQotCQlpZiAoc3RhdChodHRwZGlyLCAmc2J1ZikgPT0gMCkgewotCQkJLyogZ29vZCBlbm91Z2ggZm9yIG1lICovCi0JCQlyZmJMb2coImNoZWNrX2h0dHBkaXI6IGd1ZXNzZWQgZGlyZWN0b3J5OlxuIik7Ci0JCQlyZmJMb2coIiAgICVzXG4iLCBodHRwZGlyKTsKLQkJCWh0dHBfZGlyID0gaHR0cGRpcjsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJLyogdHJ5IHNvbWUgaGFyZHdpcmVzOiAqLwotCQkJaW50IGk7Ci0JCQljaGFyICoqdXNlOwotCQkJY2hhciAqbGlzdFtdID0gewotCQkJCSIvdXNyL2xvY2FsL3NoYXJlL3gxMXZuYy9jbGFzc2VzIiwKLQkJCQkiL3Vzci9zaGFyZS94MTF2bmMvY2xhc3NlcyIsCi0JCQkJTlVMTAotCQkJfTsKLQkJCWNoYXIgKnNzbGxpc3RbXSA9IHsKLQkJCQkiL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wiLAotCQkJCSIvdXNyL3NoYXJlL3gxMXZuYy9jbGFzc2VzL3NzbCIsCi0JCQkJTlVMTAotCQkJfTsKLQkJCWlmICh1c2Vfc3R1bm5lbCAmJiBodHRwX3NzbCkgewotCQkJCXVzZSA9IHNzbGxpc3Q7Ci0JCQl9IGVsc2UgaWYgKCFlbmNfc3RyICYmICh1c2Vfb3BlbnNzbCB8fCB1c2Vfc3R1bm5lbCB8fCBodHRwX3NzbCkpIHsKLQkJCQl1c2UgPSBzc2xsaXN0OwotCQkJfSBlbHNlIHsKLQkJCQl1c2UgPSBsaXN0OwotCQkJfQotCQkJaSA9IDA7Ci0JCQl3aGlsZSAodXNlW2ldICE9IE5VTEwpIHsKLQkJCQlpZiAoc3RhdCh1c2VbaV0sICZzYnVmKSA9PSAwKSB7Ci0JCQkJCWh0dHBfZGlyID0gc3RyZHVwKHVzZVtpXSk7CQotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCi0JCQlyZmJMb2coImNoZWNrX2h0dHBkaXI6IGJhZCBndWVzczpcbiIpOwotCQkJcmZiTG9nKCIgICAlc1xuIiwgaHR0cGRpcik7Ci0JCQlyZmJMb2coImNoZWNrX2h0dHBkaXI6ICpIVFRQIGRpc2FibGVkKiAgVXNlIC1odHRwZGlyIHBhdGhcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJmYl9odHRwX2luaXRfc29ja2V0cyh2b2lkKSB7Ci0JaW5fYWRkcl90IGlmYWNlOwotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWZhY2UgPSBzY3JlZW4tPmxpc3RlbkludGVyZmFjZTsKLQlpZiAoZ2V0ZW52KCJYMTFWTkNfSFRUUF9MSVNURU5fTE9DQUxIT1NUIikpIHsKLQkJcmZiTG9nKCJodHRwX2Nvbm5lY3Rpb25zOiBIVFRQIGxpc3RlbiBvbiBsb2NhbGhvc3Qgb25seS4gKG5vdCBIVFRQUylcbiIpOwotCQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0JfQotCXJmYkh0dHBJbml0U29ja2V0cyhzY3JlZW4pOwotCWlmIChub2lwdjQgfHwgZ2V0ZW52KCJJUFY0X0ZBSUxTIikpIHsKLQkJaWYgKGdldGVudigiSVBWNF9GQUlMUyIpKSB7Ci0JCQlyZmJMb2coIlRFU1RJTkc6IElQVjRfRkFJTFMgZm9yIHJmYl9odHRwX2luaXRfc29ja2V0cygpXG4iKTsKLQkJfQotCQlpZiAoc2NyZWVuLT5odHRwTGlzdGVuU29jayA+IC0xKSB7Ci0JCQljbG9zZShzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrKTsKLQkJCXNjcmVlbi0+aHR0cExpc3RlblNvY2sgPSAtMTsKLQkJfQotCX0KLQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGlmYWNlOwotfQotCi12b2lkIGh0dHBfY29ubmVjdGlvbnMoaW50IG9uKSB7Ci0JaWYgKCFzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAob24pIHsKLQkJcmZiTG9nKCJodHRwX2Nvbm5lY3Rpb25zOiB0dXJuaW5nIG9uIGh0dHAgc2VydmljZS5cbiIpOwotCi0JCWlmIChpbmV0ZCAmJiB1c2Vfb3BlbnNzbCkgewotCQkJLyoKLQkJCSAqIHRyeSB0byB3b3JrIGFyb3VuZCByYXBpZCBmaXJlIGh0dHBzIHJlcXVlc3RzCi0JCQkgKiBpbiBpbmV0ZCBtb2RlLi4uIHVnaC4KLQkJCSAqLwotCQkJaWYgKHNjcmVlbi0+aHR0cFBvcnQgPT0gMCkgewotCQkJCWludCBwb3J0ID0gZmluZF9mcmVlX3BvcnQoNTgwMCwgNTg1MCk7Ci0JCQkJaWYgKHBvcnQpIHsKLQkJCQkJLyogbXV0ZXggKi8KLQkJCQkJc2NyZWVuLT5odHRwUG9ydCA9IHBvcnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNjcmVlbi0+aHR0cEluaXREb25lID0gRkFMU0U7Ci0JCWlmIChjaGVja19odHRwZGlyKCkpIHsKLQkJCWludCBmZDYgPSAtMTsKLQkJCWNoYXIgKnNhdmUgPSBsaXN0ZW5fc3RyNjsKLQotCQkJc2NyZWVuLT5odHRwRGlyID0gaHR0cF9kaXI7Ci0KLQkJCXJmYl9odHRwX2luaXRfc29ja2V0cygpOwotCi0JCQlpZiAoZ2V0ZW52KCJYMTFWTkNfSFRUUF9MSVNURU5fTE9DQUxIT1NUIikpIHsKLQkJCQlsaXN0ZW5fc3RyNiA9ICJsb2NhbGhvc3QiOwotCQkJfQotCi0JCQlpZiAoc2NyZWVuLT5odHRwUG9ydCAhPSAwICYmIHNjcmVlbi0+aHR0cExpc3RlblNvY2sgPCAwKSB7Ci0JCQkJcmZiTG9nKCJodHRwX2Nvbm5lY3Rpb25zOiBmYWlsZWQgdG8gbGlzdGVuIG9uIGh0dHAgcG9ydDogJWRcbiIsIHNjcmVlbi0+aHR0cFBvcnQpOwotCQkJCWlmIChpcHY2X2xpc3RlbikgewotCQkJCQlmZDYgPSBsaXN0ZW42KHNjcmVlbi0+aHR0cFBvcnQpOwotCQkJCX0KLQkJCQlpZiAoZmQ2IDwgMCkgewotCQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJCX0KLQkJCQlyZmJMb2coImh0dHBfY29ubmVjdGlvbnM6IHRyeWluZyBJUHY2IG9ubHkgbW9kZS5cbiIpOwotCQkJfQotCQkJaWYgKGlwdjZfbGlzdGVuICYmIHNjcmVlbi0+aHR0cFBvcnQgPiAwKSB7Ci0JCQkJaWYgKGZkNiA8IDApIHsKLQkJCQkJZmQ2ID0gbGlzdGVuNihzY3JlZW4tPmh0dHBQb3J0KTsKLQkJCQl9Ci0JCQkJaXB2Nl9odHRwX2ZkID0gZmQ2OwotCQkJCWlmIChpcHY2X2h0dHBfZmQgPj0gMCkgewotCQkJCQlyZmJMb2coImh0dHBfY29ubmVjdGlvbnM6IExpc3RlbmluZyAlcyBvbiBJUHY2IHBvcnQgJWQgKHNvY2tldCAlZClcbiIsCi0JCQkJCSAgICBzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrIDwgMCA/ICJvbmx5IiA6ICJhbHNvIiwKLQkJCQkJICAgIHNjcmVlbi0+aHR0cFBvcnQsIGlwdjZfaHR0cF9mZCk7Ci0JCQkJfQotCQkJfQotCQkJbGlzdGVuX3N0cjYgPSBzYXZlOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJodHRwX2Nvbm5lY3Rpb25zOiB0dXJuaW5nIG9mZiBodHRwIHNlcnZpY2UuXG4iKTsKLQkJaWYgKHNjcmVlbi0+aHR0cExpc3RlblNvY2sgPiAtMSkgewotCQkJY2xvc2Uoc2NyZWVuLT5odHRwTGlzdGVuU29jayk7Ci0JCQlzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID0gLTE7Ci0JCX0KLQkJc2NyZWVuLT5odHRwRGlyID0gTlVMTDsKLQkJaWYgKGlwdjZfaHR0cF9mZCA+PSAwKSB7Ci0JCQljbG9zZShpcHY2X2h0dHBfZmQpOwotCQkJaXB2Nl9odHRwX2ZkID0gLTE7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0X2h0dHBwb3J0KGludCBvbGQsIGludCBuZXdwKSB7Ci0JaW50IGhwID0gbmV3cDsKLQotCWlmICghIHNjcmVlbi0+aHR0cERpcikgewotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChpbmV0ZCkgewotCQlyZmJMb2coInJlc2V0X2h0dHBwb3J0OiBjYW5ub3Qgc2V0IGh0dHBwb3J0OiAlZCBpbiBpbmV0ZC5cbiIsIGhwKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoIXNjcmVlbikgewotCQlyZmJMb2coInJlc2V0X2h0dHBwb3J0OiBubyBzY3JlZW4uXG4iKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoaHAgPCAwKSB7Ci0JCXJmYkxvZygicmVzZXRfaHR0cHBvcnQ6IGludmFsaWQgaHR0cHBvcnQ6ICVkXG4iLCBocCk7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKGhwID09IG9sZCkgewotCQlyZmJMb2coInJlc2V0X2h0dHBwb3J0OiB1bmNoYW5nZWQgaHR0cHBvcnQ6ICVkXG4iLCBocCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2NyZWVuLT5odHRwTGlzdGVuU29jayA+IC0xKSB7Ci0JCWNsb3NlKHNjcmVlbi0+aHR0cExpc3RlblNvY2spOwotCQlzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID0gLTE7Ci0JfQotCi0Jc2NyZWVuLT5odHRwUG9ydCA9IGhwOwotCXNjcmVlbi0+aHR0cEluaXREb25lID0gRkFMU0U7Ci0KLQlyZmJMb2coInJlc2V0X2h0dHBwb3J0OiBzZXR0aW5nIGh0dHBwb3J0ICVkIC0+ICVkLlxuIiwKLQkgICAgb2xkID09IC0xID8gaHAgOiBvbGQsIGhwKTsKLQotCWlmIChub2lwdjQgfHwgZ2V0ZW52KCJJUFY0X0ZBSUxTIikpIHsKLQkJaWYgKGdldGVudigiSVBWNF9GQUlMUyIpKSB7Ci0JCQlyZmJMb2coIlRFU1RJTkc6IElQVjRfRkFJTFMgZm9yIHJlc2V0X2h0dHBwb3J0KClcbiIpOwotCQl9Ci0JfSBlbHNlIGlmIChzY3JlZW4tPmh0dHBQb3J0ID09IDApIHsKLQkJOwotCX0gZWxzZSB7Ci0JCXJmYl9odHRwX2luaXRfc29ja2V0cygpOwotCX0KLQotCWlmIChzY3JlZW4tPmh0dHBQb3J0ICE9IDAgJiYgc2NyZWVuLT5odHRwTGlzdGVuU29jayA8IDApIHsKLQkJcmZiTG9nKCJyZXNldF9odHRwcG9ydDogZmFpbGVkIHRvIGxpc3RlbiBvbiBodHRwIHBvcnQ6ICVkXG4iLAotCQkgICAgc2NyZWVuLT5odHRwUG9ydCk7Ci0JfQotCi0JaWYgKGlwdjZfaHR0cF9mZCA+PSAwKSB7Ci0JCWNsb3NlKGlwdjZfaHR0cF9mZCk7Ci0JCWlwdjZfaHR0cF9mZCA9IC0xOwotCX0KLQlpZiAoaXB2Nl9saXN0ZW4gJiYgc2NyZWVuLT5odHRwUG9ydCA+IDApIHsKLQkJaXB2Nl9odHRwX2ZkID0gbGlzdGVuNihzY3JlZW4tPmh0dHBQb3J0KTsKLQkJcmZiTG9nKCJyZXNldF9odHRwcG9ydDogaXB2Nl9odHRwX2ZkOiAlZCAgcG9ydDogJWRcbiIsCi0JCSAgICBpcHY2X2h0dHBfZmQsIHNjcmVlbi0+aHR0cFBvcnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfcmZicG9ydChpbnQgb2xkLCBpbnQgbmV3cCkgIHsKLQlpbnQgcnAgPSBuZXdwOwotCi0JaWYgKGluZXRkKSB7Ci0JCXJmYkxvZygicmVzZXRfcmZicG9ydDogY2Fubm90IHNldCByZmJwb3J0OiAlZCBpbiBpbmV0ZC5cbiIsIHJwKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoIXNjcmVlbikgewotCQlyZmJMb2coInJlc2V0X3JmYnBvcnQ6IG5vIHNjcmVlbi5cbiIpOwotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChycCA8IDApIHsKLQkJcmZiTG9nKCJyZXNldF9yZmJwb3J0OiBpbnZhbGlkIHJmYnBvcnQ6ICVkXG4iLCBycCk7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKHJwID09IG9sZCkgewotCQlyZmJMb2coInJlc2V0X3JmYnBvcnQ6IHVuY2hhbmdlZCByZmJwb3J0OiAlZFxuIiwgcnApOwotCQlyZXR1cm47Ci0JfQotCi0JcmZiTG9nKCJyZXNldF9yZmJwb3J0OiBzZXR0aW5nIHJmYnBvcnQgJWQgLT4gJWQuXG4iLCBvbGQgPT0gLTEgPyBycCA6IG9sZCwgcnApOwotCi0Jc2NyZWVuLT5wb3J0ID0gcnA7Ci0KLQlpZiAodXNlX29wZW5zc2wpIHsKLQkJb3BlbnNzbF9wb3J0KDEpOwotCQlpZiAob3BlbnNzbF9zb2NrIDwgMCAmJiBvcGVuc3NsX3NvY2s2IDwgMCkgewotCQkJcmZiTG9nKCJyZXNldF9yZmJwb3J0OiB3YXJuaW5nIGNvdWxkIG5vdCBsaXN0ZW4gb24gcG9ydDogJWRcbiIsCi0JCQkgICAgc2NyZWVuLT5wb3J0KTsKLQkJfSBlbHNlIHsKLQkJCXNldF92bmNfZGVza3RvcF9uYW1lKCk7Ci0JCX0KLQkJaWYgKGh0dHBzX3BvcnRfbnVtID49IDApIHsKLQkJCWh0dHBzX3BvcnQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChzY3JlZW4tPmxpc3RlblNvY2sgPj0gMCkgewotCQlGRF9DTFIoc2NyZWVuLT5saXN0ZW5Tb2NrLCAmKHNjcmVlbi0+YWxsRmRzKSk7Ci0JCWNsb3NlKHNjcmVlbi0+bGlzdGVuU29jayk7Ci0JCXNjcmVlbi0+bGlzdGVuU29jayA9IC0xOwotCX0KLQotCWlmIChub2lwdjQgfHwgZ2V0ZW52KCJJUFY0X0ZBSUxTIikpIHsKLQkJaWYgKGdldGVudigiSVBWNF9GQUlMUyIpKSB7Ci0JCQlyZmJMb2coIlRFU1RJTkc6IElQVjRfRkFJTFMgZm9yIHJlc2V0X3JmYnBvcnQoKVxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlzY3JlZW4tPmxpc3RlblNvY2sgPSBsaXN0ZW5fdGNwKHNjcmVlbi0+cG9ydCwgc2NyZWVuLT5saXN0ZW5JbnRlcmZhY2UsIDApOwotCQlpZiAoc2NyZWVuLT5saXN0ZW5Tb2NrID49IDApIHsKLQkJCWlmIChzY3JlZW4tPmxpc3RlblNvY2sgPiBzY3JlZW4tPm1heEZkKSB7Ci0JCQkJc2NyZWVuLT5tYXhGZCA9IHNjcmVlbi0+bGlzdGVuU29jazsKLQkJCX0KLQkJCUZEX1NFVChzY3JlZW4tPmxpc3RlblNvY2ssICYoc2NyZWVuLT5hbGxGZHMpKTsKLQkJfQotCX0KLQotCWlmIChpcHY2X2xpc3Rlbl9mZCA+PSAwKSB7Ci0JCWNsb3NlKGlwdjZfbGlzdGVuX2ZkKTsKLQkJaXB2Nl9saXN0ZW5fZmQgPSAtMTsKLQl9Ci0JaWYgKGlwdjZfbGlzdGVuICYmIHNjcmVlbi0+cG9ydCA+IDApIHsKLQkJaXB2Nl9saXN0ZW5fZmQgPSBsaXN0ZW42KHNjcmVlbi0+cG9ydCk7Ci0JCXJmYkxvZygicmVzZXRfcmZicG9ydDogaXB2Nl9saXN0ZW5fZmQ6ICVkICBwb3J0OiAlZFxuIiwKLQkJICAgIGlwdjZfbGlzdGVuX2ZkLCBzY3JlZW4tPnBvcnQpOwotCX0KLQotCWlmIChzY3JlZW4tPmxpc3RlblNvY2sgPCAwICYmIGlwdjZfbGlzdGVuX2ZkIDwgMCkgewotCQlyZmJMb2coInJlc2V0X3JmYnBvcnQ6IHdhcm5pbmcgY291bGQgbm90IGxpc3RlbiBvbiBwb3J0OiAlZFxuIiwgc2NyZWVuLT5wb3J0KTsKLQl9IGVsc2UgewotCQlzZXRfdm5jX2Rlc2t0b3BfbmFtZSgpOwotCX0KLX0KLQotLyoKLSAqIERvIHNvbWUgc2FuaXR5IGNoZWNraW5nIG9mIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgWEFVVEhPUklUWSBhbmQgdGhlCi0gKiAtY29ubmVjdCBmaWxlLiAgVGhpcyBpcyAtcHJpdnJlbW90ZS4gIFdoYXQgc2hvdWxkIGJlIGRvbmUgaXMgY2hlY2sKLSAqIGZvciBhbiBlbXB0eSBob3N0IGFjY2VzcyBsaXN0LCBjdXJyZW50bHkgd2UgbGF6aWx5IGRvIG5vdCBicmluZyBpbgotICogbGliWGF1IHlldC4KLSAqLwotaW50IHJlbW90ZV9jb250cm9sX2FjY2Vzc19vayh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JcmV0dXJuIDA7Ci0jZWxzZQotCXN0cnVjdCBzdGF0IHNidWY7Ci0KLQlpZiAoY2xpZW50X2Nvbm5lY3RfZmlsZSkgewotCQlpZiAoc3RhdChjbGllbnRfY29ubmVjdF9maWxlLCAmc2J1ZikgPT0gMCkgewotCQkJaWYgKHNidWYuc3RfbW9kZSAmIFNfSVdPVEgpIHsKLQkJCQlyZmJMb2coImNvbm5lY3QgZmlsZSBpcyB3cml0YWJsZSBieSBvdGhlcnMuXG4iKTsKLQkJCQlyZmJMb2coIiAgICVzXG4iLCBjbGllbnRfY29ubmVjdF9maWxlKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChzYnVmLnN0X21vZGUgJiBTX0lXR1JQKSB7Ci0JCQkJcmZiTG9nKCJjb25uZWN0IGZpbGUgaXMgd3JpdGFibGUgYnkgZ3JvdXAuXG4iKTsKLQkJCQlyZmJMb2coIiAgICVzXG4iLCBjbGllbnRfY29ubmVjdF9maWxlKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChkcHkpIHsKLQkJY2hhciB0bXBbMTAwMF07Ci0JCWNoYXIgKmhvbWUsICp4YXV0aDsKLQkJY2hhciAqZHB5X3N0ciA9IERpc3BsYXlTdHJpbmcoZHB5KTsKLQkJRGlzcGxheSAqZHB5MjsKLQkJWEhvc3RBZGRyZXNzICp4aGE7Ci0JCUJvb2wgZW5hYmxlZDsKLQkJaW50IG47Ci0KLQkJaG9tZSA9IGdldF9ob21lX2RpcigpOwotCQlpZiAoZ2V0ZW52KCJYQVVUSE9SSVRZIikgIT0gTlVMTCkgewotCQkJeGF1dGggPSBnZXRlbnYoIlhBVVRIT1JJVFkiKTsKLQkJfSBlbHNlIGlmIChob21lKSB7Ci0JCQlpbnQgbGVuID0gMTAwMCAtIHN0cmxlbigiLy5YYXV0aG9yaXR5IikgLSAxOwotCQkJc3RybmNweSh0bXAsIGhvbWUsIGxlbik7IAotCQkJc3RyY2F0KHRtcCwgIi8uWGF1dGhvcml0eSIpOwotCQkJeGF1dGggPSB0bXA7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coImNhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBYQVVUSE9SSVRZLlxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoaG9tZSkgewotCQkJZnJlZShob21lKTsKLQkJfQotCQlpZiAoc3RhdCh4YXV0aCwgJnNidWYpID09IDApIHsKLQkJCWlmIChzYnVmLnN0X21vZGUgJiBTX0lXT1RIKSB7Ci0JCQkJcmZiTG9nKCJYQVVUSE9SSVRZIGlzIHdyaXRhYmxlIGJ5IG90aGVycyEhXG4iKTsKLQkJCQlyZmJMb2coIiAgICVzXG4iLCB4YXV0aCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2J1Zi5zdF9tb2RlICYgU19JV0dSUCkgewotCQkJCXJmYkxvZygiWEFVVEhPUklUWSBpcyB3cml0YWJsZSBieSBncm91cCEhXG4iKTsKLQkJCQlyZmJMb2coIiAgICVzXG4iLCB4YXV0aCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2J1Zi5zdF9tb2RlICYgU19JUk9USCkgewotCQkJCXJmYkxvZygiWEFVVEhPUklUWSBpcyByZWFkYWJsZSBieSBvdGhlcnMuXG4iKTsKLQkJCQlyZmJMb2coIiAgICVzXG4iLCB4YXV0aCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2J1Zi5zdF9tb2RlICYgU19JUkdSUCkgewotCQkJCXJmYkxvZygiWEFVVEhPUklUWSBpcyByZWFkYWJsZSBieSBncm91cC5cbiIpOwotCQkJCXJmYkxvZygiICAgJXNcbiIsIHhhdXRoKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCi0JCVhfTE9DSzsKLQkJeGhhID0gWExpc3RIb3N0cyhkcHksICZuLCAmZW5hYmxlZCk7Ci0JCVhfVU5MT0NLOwotCQlpZiAoISBlbmFibGVkKSB7Ci0JCQlyZmJMb2coIlggYWNjZXNzIGNvbnRyb2wgaXMgZGlzYWJsZWQsIFggY2xpZW50cyBjYW5cbiIpOwotCQkJcmZiTG9nKCIgICBjb25uZWN0IGZyb20gYW55IGhvc3QuICBSdW4gJ3hob3N0IC0nXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICh4aGEpIHsKLQkJCWludCBpOwotCQkJcmZiTG9nKCJUaGUgZm9sbG93aW5nIGhvc3RzIGNhbiBjb25uZWN0IHcvbyBYMTEgIgotCQkJICAgICJhdXRoOlxuIik7Ci0JCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJCQlpZiAoeGhhW2ldLmZhbWlseSA9PSBGYW1pbHlJbnRlcm5ldCkgewotCQkJCQljaGFyICpzdHIgPSByYXcyaG9zdCh4aGFbaV0uYWRkcmVzcywKLQkJCQkJICAgIHhoYVtpXS5sZW5ndGgpOwotCQkJCQljaGFyICppcCA9IHJhdzJpcCh4aGFbaV0uYWRkcmVzcyk7Ci0JCQkJCXJmYkxvZygiICAlcy8lc1xuIiwgc3RyLCBpcCk7Ci0JCQkJCWZyZWUoc3RyKTsKLQkJCQkJZnJlZShpcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmZiTG9nKCIgIHVua25vd24tJWRcbiIsIGkrMSk7Ci0JCQkJfQotCQkJfQotCQkJWEZyZWVfd3IoeGhhKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGdldGVudigiWEFVVEhPUklUWSIpKSB7Ci0JCQl4YXV0aCA9IHN0cmR1cChnZXRlbnYoIlhBVVRIT1JJVFkiKSk7Ci0JCX0gZWxzZSB7Ci0JCQl4YXV0aCA9IE5VTEw7Ci0JCX0KLQkJc2V0X2VudigiWEFVVEhPUklUWSIsICIvaW1wb3NzaWJsZS94YXV0aGZpbGUiKTsKLQotCQlmcHJpbnRmKHN0ZGVyciwgIlxuQ2hlY2tpbmcgaWYgZGlzcGxheSAlcyByZXF1aXJlcyAiCi0JCSAgICAiWEFVVEhPUklUWVxuIiwgZHB5X3N0cik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgLS0gKGlnbm9yZSBhbnkgWGxpYjogZXJyb3JzIHRoYXQiCi0JCSAgICAiIGZvbGxvdykgLS1cbiIpOwotCQlkcHkyID0gWE9wZW5EaXNwbGF5X3dyKGRweV9zdHIpOyAKLQkJZmZsdXNoKHN0ZGVycik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgLS0gKGRvbmUgY2hlY2tpbmcpIC0tXG5cbiIpOwotCi0JCWlmICh4YXV0aCkgewotCQkJc2V0X2VudigiWEFVVEhPUklUWSIsIHhhdXRoKTsKLQkJCWZyZWUoeGF1dGgpOwotCQl9IGVsc2UgewotCQkJeGF1dGggPSBnZXRlbnYoIlhBVVRIT1JJVFkiKTsKLQkJCWlmICh4YXV0aCkgewotCQkJCSooeGF1dGgtMikgPSAnXyc7CS8qIHlvdyAqLwotCQkJfQotCQl9Ci0JCWlmIChkcHkyKSB7Ci0JCQlyZmJMb2coIlhBVVRIT1JJVFkgaXMgbm90IHJlcXVpcmVkIG9uIGRpc3BsYXkuXG4iKTsKLQkJCXJmYkxvZygiICAgJXNcbiIsIERpc3BsYXlTdHJpbmcoZHB5KSk7Ci0JCQlYQ2xvc2VEaXNwbGF5X3dyKGRweTIpOwotCQkJZHB5MiA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfQotCXJldHVybiAxOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0jaWZkZWYgTUFDT1NYCi12b2lkIG1hY29zeENHX2tleWNvZGVfaW5qZWN0KGludCBkb3duLCBpbnQga2V5Y29kZSk7Ci0jZW5kaWYKLQotaW50IHJjX25waWVjZXMgPSAwOwotCi0vKgotICogSHVnZSwgdWdseSBzd2l0Y2ggdG8gaGFuZGxlIGFsbCByZW1vdGUgY29tbWFuZHMgYW5kIHF1ZXJpZXMKLSAqIC1yZW1vdGUvLVIgYW5kIC1xdWVyeS8tUS4KLSAqLwotY2hhciAqcHJvY2Vzc19yZW1vdGVfY21kKGNoYXIgKmNtZCwgaW50IHN0cmluZ29ubHkpIHsKLSNpZiBSRU1PVEVfQ09OVFJPTAotCWNoYXIgKnAgPSBjbWQ7Ci0JY2hhciAqY28gPSAiIjsKLQljaGFyIGJ1ZltYMTFWTkNfUkVNT1RFX01BWF07IAotCWludCBidWZuID0gWDExVk5DX1JFTU9URV9NQVg7Ci0JaW50IHF1ZXJ5ID0gMDsKLQlzdGF0aWMgY2hhciAqcHJldl9jdXJzb3JzX21vZGUgPSBOVUxMOwotCi0JaWYgKCFxdWVyeV9kZWZhdWx0ICYmICFhY2NlcHRfcmVtb3RlX2NtZHMpIHsKLQkJcmZiTG9nKCJyZW1vdGUgY29tbWFuZHMgZGlzYWJsZWQ6ICVzXG4iLCBjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZmJMb2coInNraXAgcmVtb3RlIGNvbW1hbmQ6ICVzIHVuaXhwd19pbl9wcm9ncmVzcy5cbiIsIGNtZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICghcXVlcnlfZGVmYXVsdCAmJiBwcml2X3JlbW90ZSkgewotCQlpZiAoISByZW1vdGVfY29udHJvbF9hY2Nlc3Nfb2soKSkgewotCQkJcmZiTG9nKCIqKiBEaXNhYmxpbmcgcmVtb3RlIGNvbW1hbmRzIGluIC1wcml2cmVtb3RlICIKLQkJCSAgICAibW9kZS5cbiIpOwotCQkJYWNjZXB0X3JlbW90ZV9jbWRzID0gMDsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0KLQlzdHJjcHkoYnVmLCAiIik7Ci0JaWYgKHN0cnN0cihjbWQsICJjbWQ9IikgPT0gY21kKSB7Ci0JCXAgKz0gc3RybGVuKCJjbWQ9Iik7Ci0JCWlmIChzdHJzdHIocCwgInNjcmlwdDoiKSA9PSBwKSB7Ci0JCQljaGFyICpzLCAqcSwgKipwaWVjZXMsIHRtcFsxMDI0XTsKLQkJCWludCBrID0gMCwgbiA9IDAsIGRwID0gMTsKLQotCQkJcCArPSBzdHJsZW4oInNjcmlwdDoiKTsKLQotCQkJaWYgKHN0cnN0cihwLCAiZmlsZT0iKSA9PSBwKSB7Ci0JCQkJRklMRSAqZjsKLQkJCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0JCQkJcCArPSBzdHJsZW4oImZpbGU9Iik7Ci0KLQkJCQlyZmJMb2coInJlYWRpbmcgc2NyaXB0IGZyb20gZmlsZSAnJXMnXG4iLCBwKTsKLQotCQkJCWlmIChzdGF0KHAsICZzYnVmKSAhPSAwKSB7Ci0JCQkJCXJmYkxvZ1BlcnJvcigic3RhdCIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0KLQkJCQlmID0gZm9wZW4ocCwgInIiKTsKLQkJCQlpZiAoZiA9PSBOVUxMKSB7Ci0JCQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCi0JCQkJcCA9IChjaGFyICopIGNhbGxvYyhzYnVmLnN0X3NpemUgKyAxLCAxKTsKLQkJCQlkcCA9IDA7Ci0JCQkJd2hpbGUgKGZnZXRzKHRtcCwgMTAyNCwgZikgIT0gTlVMTCkgewotCQkJCQljaGFyICpjID0gc3RyY2hyKHRtcCwgJyMnKTsKLQkJCQkJaWYgKGMpICpjID0gJ1wwJzsKLQkJCQkJaWYgKHN0cmxlbihwKSArIHN0cmxlbih0bXApID4gKHNpemVfdCkgc2J1Zi5zdF9zaXplKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlzdHJjYXQocCwgdG1wKTsKLQkJCQl9Ci0JCQkJZmNsb3NlKGYpOwotCQkJfQotCi0JCQlwaWVjZXMgPSAoY2hhciAqKikgbWFsbG9jKHN0cmxlbihwKSAqIHNpemVvZihjaGFyICopKTsKLQkJCWlmIChkcCkgewotCQkJCXMgPSBzdHJkdXAocCk7Ci0JCQl9IGVsc2UgewotCQkJCXMgPSBwOwotCQkJfQotCQkJcSA9IHN0cnRvayhzLCAiOyIpOyAKLQotCQkJd2hpbGUgKHEpIHsKLQkJCQljaGFyICp0ID0gbGJsYW5rcyhxKTsKLQkJCQlpZiAoc3Ryc3RyKHQsICJjbWQ9IikgIT0gdCAmJiBzdHJzdHIodCwgInFyeT0iKSAhPSB0KSB7Ci0JCQkJCXN0cmNweSh0bXAsICJjbWQ9Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyY3B5KHRtcCwgIiIpOwotCQkJCX0KLQkJCQlzdHJuY2F0KHRtcCwgdCwgMTAwMCk7Ci0JCQkJcGllY2VzW25dID0gc3RyZHVwKHRtcCk7Ci0JCQkJbisrOwotCQkJCXEgPSBzdHJ0b2soTlVMTCwgIjsiKTsKLQkJCX0KLQkJCWZyZWUocyk7Ci0KLQkJCWZvciAoaz0wOyBrIDwgbjsgaysrKSB7Ci0JCQkJY2hhciAqYyA9IHBpZWNlc1trXTsKLQkJCQljaGFyICp0ID0gYyArIHN0cmxlbihjKSAtIDE7CS8qIHNob3J0ZXN0IGlzICJjbWQ9IiAqLwotCQkJCXdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAoKnQpKSkgewotCQkJCQkqdCA9ICdcMCc7Ci0JCQkJCWlmICh0IDw9IGMpIGJyZWFrOwotCQkJCQl0LS07Ci0JCQkJfQotCQkJCWlmIChrIDwgbiAtIDEpIHsKLQkJCQkJcHJvY2Vzc19yZW1vdGVfY21kKGMsIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NfcmVtb3RlX2NtZChjLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGs9MDsgazxuOyBrKyspIHsKLQkJCQlmcmVlKHBpZWNlc1trXSk7Ci0JCQl9Ci0JCQlmcmVlKHBpZWNlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgInFyeT0iKSA9PSBjbWQpIHsKLQkJcXVlcnkgPSAxOwotCQlpZiAoc3RyY2hyKGNtZCwgJywnKSkgewotCQkJLyogY29tbWEgc2VwYXJhdGVkIGJhdGNoIG1vZGUgKi8KLQkJCWNoYXIgKnMsICpxLCAqcmVzLCAqKnBpZWNlcywgdG1wWzEwMjRdOwotCQkJaW50IGsgPSAwLCBuID0gMDsKLQotCQkJcGllY2VzID0gKGNoYXIgKiopIG1hbGxvYyhzdHJsZW4oY21kKSAqIHNpemVvZihjaGFyICopKTsKLQkJCXMgPSBzdHJkdXAoY21kICsgc3RybGVuKCJxcnk9IikpOwotCQkJcSA9IHN0cnRvayhzLCAiLCIpOyAKLQotCQkJd2hpbGUgKHEpIHsKLQkJCQlzdHJjcHkodG1wLCAicXJ5PSIpOwotCQkJCXN0cm5jYXQodG1wLCBxLCAxMDAwKTsKLQkJCQlwaWVjZXNbbl0gPSBzdHJkdXAodG1wKTsKLQkJCQluKys7Ci0JCQkJcSA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQkJfQotCQkJZnJlZShzKTsKLQotCQkJcmNfbnBpZWNlcyA9IG47Ci0JCQlzdHJjcHkoYnVmLCAiIik7Ci0JCQlmb3IgKGs9MDsgayA8IG47IGsrKykgewotCQkJCXJlcyA9IHByb2Nlc3NfcmVtb3RlX2NtZChwaWVjZXNba10sIDEpOwotCQkJCWlmIChyZXMgJiYgc3RybGVuKGJ1Zikrc3RybGVuKHJlcykKLQkJCQkgICAgPj0gWDExVk5DX1JFTU9URV9NQVggLSAxKSB7Ci0JCQkJCXJmYkxvZygib3ZlcmZsb3cgaW4gcHJvY2Vzc19yZW1vdGVfY21kOiIKLQkJCQkJICAgICIgJXMgLS0gJXNcbiIsIGJ1ZiwgcmVzKTsKLQkJCQkJZnJlZShyZXMpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlcykgewotCQkJCQlzdHJjYXQoYnVmLCByZXMpOwotCQkJCQlmcmVlKHJlcyk7Ci0JCQkJfQotCQkJCWlmIChrIDwgbiAtIDEpIHsKLQkJCQkJc3RyY2F0KGJ1ZiwgIiwiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGs9MDsgazxuOyBrKyspIHsKLQkJCQlmcmVlKHBpZWNlc1trXSk7Ci0JCQl9Ci0JCQlmcmVlKHBpZWNlcyk7Ci0JCQlyY19ucGllY2VzID0gMDsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJxcnk9Iik7Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJpZ25vcmluZyBtYWxmb3JtZWQgY29tbWFuZDogJXNcbiIsIGNtZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBhbGxvdyB2YXI9dmFsIHVzYWdlICovCi0JaWYgKCFzdHJjaHIocCwgJzonKSkgewotCQljaGFyICpxID0gc3RyY2hyKHAsICc9Jyk7Ci0JCWlmIChxKSAqcSA9ICc6JzsKLQl9Ci0KLQkvKiBhbHdheXMgY2FsbCBsaWtlOiBDT0xPTl9DSEVDSygiZm9vYmFyOiIpICovCi0jZGVmaW5lIENPTE9OX0NIRUNLKHN0cikgXAotCWlmIChzdHJzdHIocCwgc3RyKSAhPSBwKSB7IFwKLQkJY28gPSAiOiI7IFwKLQkJaWYgKCEgcXVlcnkpIHsgXAotCQkJZ290byBkb25lOyBcCi0JCX0gXAotCX0gZWxzZSB7IFwKLQkJY2hhciAqcSA9IHN0cmNocihwLCAnOicpOyBcCi0JCWlmIChxdWVyeSAmJiBxICE9IE5VTEwpIHsgXAotCQkJKihxKzEpID0gJ1wwJzsgXAotCQl9IFwKLQl9Ci0KLSNkZWZpbmUgTk9UQVBQIFwKLQlpZiAocXVlcnkpIHsgXAotCQlpZiAoc3RyY2hyKHAsICc6JykpIHsgXAotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzTi9BIiwgcCk7IFwKLQkJfSBlbHNlIHsgXAotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOk4vQSIsIHApOyBcCi0JCX0gXAotCQlnb3RvIHFyeTsgXAotCX0KLQotI2RlZmluZSBOT1RBUFBSTyBcCi0JaWYgKHF1ZXJ5KSB7IFwKLQkJaWYgKHN0cmNocihwLCAnOicpKSB7IFwKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lc04vQSIsIHApOyBcCi0JCX0gZWxzZSB7IFwKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczpOL0EiLCBwKTsgXAotCQl9IFwKLQkJZ290byBxcnk7IFwKLQl9Ci0KLS8qCi0gKiBNYXliZSBhZGQ6IHBhc3N3ZGZpbGUgbG9nZmlsZSBiZyByZmJhdXRoIHBhc3N3ZC4uLgotICovCi0JaWYgKCFzdHJjbXAocCwgIiIpKSB7CS8qIHNraXAtY21kLWxpc3QgKi8KLQkJTk9UQVBQCi0JCXJmYkxvZygicmVtb3RlX2NtZDogZW1wdHkgY29tbWFuZC5cbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIkNSOiIpID09IHApIHsJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkvKiBDUjpXeEgrWCtZLGR4LGR5ICovCi0JCWludCB3LCBoLCB4LCB5LCBkeCwgZHk7Ci0JCU5PVEFQUAotCQlpZiAoc3NjYW5mKHArMywgIiVkeCVkKyVkKyVkLCVkLCVkIiwgJncsICZoLCAmeCwgJnksICZkeCwgJmR5KSA9PSA2KSB7Ci0JCQlzcmFSZWdpb25QdHIgcjsKLQkJCXJmYkxvZygicmZiRG9Db3B5UmVjdChzY3JlZW4sICVkLCAlZCwgJWQsICVkLCAlZCwgJWQpXG4iLCB4LCB5LCB4K3csIHkraCwgZHgsIGR5KTsKLQkJCXIgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHgrdywgeStoKTsKLQkJCWRvX2NvcHlyZWdpb24ociwgZHgsIGR5LCAwKTsKLQkJCWZiX3B1c2goKTsKLQkJCXNyYVJnbkRlc3Ryb3kocik7Ci0JCQlyZmJMb2coImRpZFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGJhZCBDUiBzdHJpbmc6ICVzXG4iLCBwKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJzdG9wIikgfHwgIXN0cmNtcChwLCAicXVpdCIpIHx8Ci0JICAgICFzdHJjbXAocCwgImV4aXQiKSB8fCAhc3RyY21wKHAsICJzaHV0ZG93biIpKSB7Ci0JCU5PVEFQUAotCQlpZiAoY2xpZW50X2Nvbm5lY3RfZmlsZSkgewotCQkJRklMRSAqaW4gPSBmb3BlbihjbGllbnRfY29ubmVjdF9maWxlLCAidyIpOwotCQkJaWYgKGluKSB7Ci0JCQkJZnByaW50ZihpbiwgImNtZD1ub29wXG4iKTsKLQkJCQlmY2xvc2UoaW4pOwotCQkJfQotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBzaHV0X2Rvd24gZmxhZ1xuIik7Ci0JCXNodXRfZG93biA9IDE7Ci0JCWNsb3NlX2FsbF9jbGllbnRzKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInBpbmciKQotCSAgICB8fCBzdHJzdHIocCwgInBpbmc6IikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCXF1ZXJ5ID0gMTsKLQkJaWYgKHJmYl9kZXNrdG9wX25hbWUpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolcyIsIHAsIHJmYl9kZXNrdG9wX25hbWUpOwotCQl9IGVsc2UgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVzIiwgcCwgInVua25vd24iKTsKLQkJfQotCQlnb3RvIHFyeTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVzZW5kX2N1dGJ1ZmZlciIpKSB7Ci0JCU5PVEFQUAotCQlyZXNlbmRfc2VsZWN0aW9uKCJjdXRidWZmZXIiKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVzZW5kX2NsaXBib2FyZCIpKSB7Ci0JCU5PVEFQUAotCQlyZXNlbmRfc2VsZWN0aW9uKCJjbGlwYm9hcmQiKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVzZW5kX3ByaW1hcnkiKSkgewotCQlOT1RBUFAKLQkJcmVzZW5kX3NlbGVjdGlvbigicHJpbWFyeSIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJibGFja2VuIikgfHwgIXN0cmNtcChwLCAiemVybyIpKSB7Ci0JCU5PVEFQUAotCQlwdXNoX2JsYWNrX3NjcmVlbig0KTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVmcmVzaCIpKSB7Ci0JCU5PVEFQUAotCQlyZWZyZXNoX3NjcmVlbigxKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVzZXQiKSkgewotCQlOT1RBUFAKLQkJZG9fbmV3X2ZiKDEpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInplcm86IikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCWludCB4MSwgeTEsIHgyLCB5MjsKLQkJTk9UQVBQCi0JCXAgKz0gc3RybGVuKCJ6ZXJvOiIpOwotCQlpZiAoc3NjYW5mKHAsICIlZCwlZCwlZCwlZCIsICZ4MSwgJnkxLCAmeDIsICZ5MikgPT0gNCkgIHsKLQkJCWludCBtYXJrID0gMTsKLQkJCXJmYkxvZygiemVyb2luZyByZWN0OiAlc1xuIiwgcCk7Ci0JCQlpZiAoeDEgPCAwIHx8IHgyIDwgMCkgewotCQkJCXgxID0gbmFicyh4MSk7Ci0JCQkJeDIgPSBuYWJzKHgyKTsKLQkJCQltYXJrID0gMDsJLyogaGFjayBmb3IgdGVzdGluZyAqLwotCQkJfQotCi0JCQl6ZXJvX2ZiKHgxLCB5MSwgeDIsIHkyKTsKLQkJCWlmIChtYXJrKSB7Ci0JCQkJbWFya19yZWN0X2FzX21vZGlmaWVkKHgxLCB5MSwgeDIsIHkyLCAwKTsKLQkJCX0KLQkJCXB1c2hfc2xlZXAoNCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJkYW1hZ2VmYjoiKSA9PSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJaW50IGRlbGF5OwotCQlOT1RBUFAKLQkJcCArPSBzdHJsZW4oImRhbWFnZWZiOiIpOwotCQlpZiAoc3NjYW5mKHAsICIlZCIsICZkZWxheSkgPT0gMSkgIHsKLQkJCXJmYkxvZygiZGFtYWdpbmcgY2xpZW50IGZiJ3MgZm9yICVkIHNlY3MgIgotCQkJICAgICIoYnkgbm90IG1hcmtpbmcgcmVjdHMuKVxuIiwgZGVsYXkpOwotCQkJZGFtYWdlX3RpbWUgPSB0aW1lKE5VTEwpOwotCQkJZGFtYWdlX2RlbGF5ID0gZGVsYXk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJjbG9zZSIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJjbG9zZToiKQotCQlwICs9IHN0cmxlbigiY2xvc2U6Iik7Ci0JCWNsb3NlX2NsaWVudHMocCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZGlzY29ubmVjdCIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJkaXNjb25uZWN0OiIpCi0JCXAgKz0gc3RybGVuKCJkaXNjb25uZWN0OiIpOwotCQljbG9zZV9jbGllbnRzKHApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImlkX2NtZCIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJpZF9jbWQ6IikKLQkJcCArPSBzdHJsZW4oImlkX2NtZDoiKTsKLQkJaWRfY21kKHApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImlkIikgPT0gcCkgewotCQlpbnQgb2sgPSAwOwotCQlXaW5kb3cgdHdpbjsKLQkJQ09MT05fQ0hFQ0soImlkOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMweCVseCIsIHAsIGNvLAotCQkJICAgIHJvb3RzaGlmdCA/IDAgOiBzdWJ3aW4pOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImlkOiIpOwotCQlpZiAoKnAgPT0gJ1wwJyB8fCAhc3RyY21wKCJyb290IiwgcCkpIHsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJLyogYmFjayB0byByb290IHdpbiAqLwotCQkJdHdpbiA9IDB4MDsKLQkJCW9rID0gMTsKLQkJfSBlbHNlIGlmICghc3RyY21wKCJwaWNrIiwgcCkpIHsKLQkJCXR3aW4gPSAweDA7Ci0JCQlpZiAoc2FmZV9yZW1vdGVfb25seSkgewotCQkJCXJmYkxvZygidW5zYWZlOiAnLWlkIHBpY2snXG4iKTsKLQkJCX0gZWxzZSBpZiAocGlja193aW5kb3dpZCgmdHdpbikpIHsKLQkJCQlvayA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoISBzY2FuX2hleGRlYyhwLCAmdHdpbikpIHsKLQkJCXJmYkxvZygiLWlkOiBza2lwcGluZyBpbmNvcnJlY3QgaGV4L2RlYyBudW1iZXI6IgotCQkJICAgICIgJXNcbiIsIHApOwotCQl9IGVsc2UgewotCQkJb2sgPSAxOwotCQl9Ci0JCWlmIChvaykgewotCQkJWF9MT0NLOwotCQkJaWYgKHR3aW4gJiYgISB2YWxpZF93aW5kb3codHdpbiwgTlVMTCwgMCkpIHsKLQkJCQlyZmJMb2coInNraXBwaW5nIGludmFsaWQgc3ViLXdpbmRvdzogMHglbHhcbiIsIHR3aW4pOwotCQkJCVhfVU5MT0NLOwotCQkJfSBlbHNlIHsKLQkJCQlzdWJ3aW4gPSB0d2luOwotCQkJCXJvb3RzaGlmdCA9IDA7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJY2hlY2tfYmxhY2tfZmIoKTsKLQkJCQlkb19uZXdfZmIoMSk7Ci0JCQl9Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzaWQiKSA9PSBwKSB7Ci0JCWludCBvayA9IDA7Ci0JCVdpbmRvdyB0d2luOwotCQlDT0xPTl9DSEVDSygic2lkOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMweCVseCIsIHAsIGNvLAotCQkJICAgICFyb290c2hpZnQgPyAwIDogc3Vid2luKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJzaWQ6Iik7Ci0JCWlmICgqcCA9PSAnXDAnIHx8ICFzdHJjbXAoInJvb3QiLCBwKSkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCQkvKiBiYWNrIHRvIHJvb3Qgd2luICovCi0JCQl0d2luID0gMHgwOwotCQkJb2sgPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoInBpY2siLCBwKSkgewotCQkJdHdpbiA9IDB4MDsKLQkJCWlmIChzYWZlX3JlbW90ZV9vbmx5KSB7Ci0JCQkJcmZiTG9nKCJ1bnNhZmU6ICctc2lkIHBpY2snXG4iKTsKLQkJCX0gZWxzZSBpZiAocGlja193aW5kb3dpZCgmdHdpbikpIHsKLQkJCQlvayA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoISBzY2FuX2hleGRlYyhwLCAmdHdpbikpIHsKLQkJCXJmYkxvZygiLXNpZDogc2tpcHBpbmcgaW5jb3JyZWN0IGhleC9kZWMgbnVtYmVyOiAlc1xuIiwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlvayA9IDE7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlYX0xPQ0s7Ci0JCQlpZiAodHdpbiAmJiAhIHZhbGlkX3dpbmRvdyh0d2luLCBOVUxMLCAwKSkgewotCQkJCXJmYkxvZygic2tpcHBpbmcgaW52YWxpZCBzdWItd2luZG93OiAweCVseFxuIiwgdHdpbik7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQl9IGVsc2UgewotCQkJCXN1YndpbiA9IHR3aW47Ci0JCQkJcm9vdHNoaWZ0ID0gMTsKLQkJCQlYX1VOTE9DSzsKLQkJCQljaGVja19ibGFja19mYigpOwotCQkJCWRvX25ld19mYigxKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIndhaXRtYXBwZWQiKSA9PSBwKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwKLQkJCSAgICBzdWJ3aW5fd2FpdF9tYXBwZWQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJc3Vid2luX3dhaXRfbWFwcGVkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJub3dhaXRtYXBwZWQiKSA9PSBwKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwKLQkJCSAgICAhc3Vid2luX3dhaXRfbWFwcGVkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXN1Yndpbl93YWl0X21hcHBlZCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNsaXAiKSB8fAotCSAgICBzdHJzdHIocCwgImNsaXA6IikgPT0gcCkgewkvKiBza2lwLWNtZC1saXN0ICovCi0JCUNPTE9OX0NIRUNLKCJjbGlwOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKGNsaXBfc3RyKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiY2xpcDoiKTsKLQkJaWYgKGNsaXBfc3RyKSB7Ci0JCQlpbnQgdywgaCwgeCwgeTsKLQkJCWZyZWUoY2xpcF9zdHIpOwotCQkJLyogdHJ5IHRvIGhhbmRsZSBlYXN5IGNhc2Ugd2hlcmUgV3hIIGlzIHVuY2hhbmdlZDogKi8KLQkJCWlmIChwYXJzZV9nZW9tKHAsICZ3LCAmaCwgJngsICZ5LCB3ZHB5X3gsIHdkcHlfeSkpIHsKLQkJCQlpZiAoY2RweV94ID09IHcgJiYgY2RweV95ID09IGgpIHsKLQkJCQkJaWYgKHggPj0gMCAmJiB5ID49IDApIHsKLQkJCQkJCWlmICh4ICsgdyA8PSB3ZHB5X3ggJiYgeSArIGggPD0gd2RweV95KSB7Ci0JCQkJCQkJY29mZl94ID0geDsKLQkJCQkJCQljb2ZmX3kgPSB5OwotCQkJCQkJCWNsaXBfc3RyID0gc3RyZHVwKHApOwotCQkJCQkJCWdvdG8gZG9uZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljbGlwX3N0ciA9IHN0cmR1cChwKTsKLQotCQkvKiBPSywgdGhpcyByZXF1aXJlcyBhIG5ldyBmYi4uLiAqLwotCQlkb19uZXdfZmIoMSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImZsYXNoY21hcCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZmxhc2hfY21hcCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gZmxhc2hjbWFwIG1vZGUuXG4iKTsKLQkJZmxhc2hfY21hcCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZmxhc2hjbWFwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhZmxhc2hfY21hcCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIGZsYXNoY21hcCBtb2RlLlxuIik7Ci0JCWZsYXNoX2NtYXAgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNoaWZ0Y21hcCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInNoaWZ0Y21hcDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgc2hpZnRfY21hcCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2hpZnRjbWFwOiIpOwotCQlzaGlmdF9jbWFwID0gYXRvaShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgLXNoaWZ0Y21hcCAlZFxuIiwgc2hpZnRfY21hcCk7Ci0JCWRvX25ld19mYigxKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAidHJ1ZWNvbG9yIikpIHsKLQkJaW50IG9yaWcgPSBmb3JjZV9pbmRleGVkX2NvbG9yOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgIWZvcmNlX2luZGV4ZWRfY29sb3IpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiBub3RydWVjb2xvciBtb2RlLlxuIik7Ci0JCWZvcmNlX2luZGV4ZWRfY29sb3IgPSAwOwotCQlpZiAob3JpZyAhPSBmb3JjZV9pbmRleGVkX2NvbG9yKSB7Ci0JCQlpZl84YnBwX2RvX25ld19mYigpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vdHJ1ZWNvbG9yIikpIHsKLQkJaW50IG9yaWcgPSBmb3JjZV9pbmRleGVkX2NvbG9yOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgZm9yY2VfaW5kZXhlZF9jb2xvcik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gbm90cnVlY29sb3IgbW9kZS5cbiIpOwotCQlmb3JjZV9pbmRleGVkX2NvbG9yID0gMTsKLQkJaWYgKG9yaWcgIT0gZm9yY2VfaW5kZXhlZF9jb2xvcikgewotCQkJaWZfOGJwcF9kb19uZXdfZmIoKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJvdmVybGF5IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBvdmVybGF5KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiAtb3ZlcmxheSBtb2RlLlxuIik7Ci0JCWlmICghb3ZlcmxheV9wcmVzZW50KSB7Ci0JCQlyZmJMb2coInNraXBwaW5nOiBvdmVybGF5IGV4dGVuc2lvbiBub3QgcHJlc2VudC5cbiIpOwotCQl9IGVsc2UgaWYgKG92ZXJsYXkpIHsKLQkJCXJmYkxvZygic2tpcHBpbmc6IGFscmVhZHkgaW4gLW92ZXJsYXkgbW9kZS5cbiIpOwotCQl9IGVsc2UgewotCQkJaW50IHJlc2V0X21lbSA9IDA7Ci0JCQkvKiBoZXJlIHdlIGdvLi4uICovCi0JCQlpZiAodXNpbmdfc2htKSB7Ci0JCQkJcmZiTG9nKCJzZXR0aW5nIC1ub3NobSBtb2RlLlxuIik7Ci0JCQkJdXNpbmdfc2htID0gMDsKLQkJCQlyZXNldF9tZW0gPSAxOwotCQkJfQotCQkJb3ZlcmxheSA9IDE7Ci0JCQlkb19uZXdfZmIocmVzZXRfbWVtKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub292ZXJsYXkiKSkgewotCQlpbnQgb3JpZyA9IG92ZXJsYXk7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW92ZXJsYXkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiBvdmVybGF5IG1vZGVcbiIpOwotCQlvdmVybGF5ID0gMDsKLQkJaWYgKCFvdmVybGF5X3ByZXNlbnQpIHsKLQkJCXJmYkxvZygid2FybmluZzogb3ZlcmxheSBleHRlbnNpb24gbm90IHByZXNlbnQuXG4iKTsKLQkJfSBlbHNlIGlmICghb3JpZykgewotCQkJcmZiTG9nKCJza2lwcGluZzogYWxyZWFkeSBub3QgaW4gLW92ZXJsYXkgbW9kZS5cbiIpOwotCQl9IGVsc2UgewotCQkJLyogaGVyZSB3ZSBnby4uLiAqLwotCQkJZG9fbmV3X2ZiKDApOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm92ZXJsYXlfY3Vyc29yIikgfHwKLQkgICAgIXN0cmNtcChwLCAib3ZlcmxheV95ZXNjdXJzb3IiKSB8fAotCSAgICAhc3RyY21wKHAsICJub292ZXJsYXlfbm9jdXJzb3IiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG92ZXJsYXlfY3Vyc29yKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiBvdmVybGF5X2N1cnNvciBtb2RlLlxuIik7Ci0JCW92ZXJsYXlfY3Vyc29yID0gMTsKLQkJaWYgKCFvdmVybGF5X3ByZXNlbnQpIHsKLQkJCXJmYkxvZygid2FybmluZzogb3ZlcmxheSBleHRlbnNpb24gbm90IHByZXNlbnQuXG4iKTsKLQkJfSBlbHNlIGlmICghb3ZlcmxheSkgewotCQkJcmZiTG9nKCJ3YXJuaW5nOiBub3QgaW4gLW92ZXJsYXkgbW9kZS5cbiIpOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJZb3UgbWF5IHdhbnQgdG8gcnVuIC1SIG5vc2hvd19jdXJzb3Igb3JcbiIpOwotCQkJcmZiTG9nKCIgLVIgY3Vyc29yOm5vbmUgdG8gZGlzYWJsZSBhbnkgZXh0cmEgIgotCQkJICAgICJjdXJzb3JzLlxuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9vdmVybGF5X2N1cnNvciIpIHx8Ci0JICAgICFzdHJjbXAocCwgIm5vb3ZlcmxheV95ZXNjdXJzb3IiKSB8fAotCSAgICAhc3RyY21wKHAsICJvdmVybGF5X25vY3Vyc29yIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhb3ZlcmxheV9jdXJzb3IpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiBvdmVybGF5X2N1cnNvciBtb2RlXG4iKTsKLQkJb3ZlcmxheV9jdXJzb3IgPSAwOwotCQlpZiAoIW92ZXJsYXlfcHJlc2VudCkgewotCQkJcmZiTG9nKCJ3YXJuaW5nOiBvdmVybGF5IGV4dGVuc2lvbiBub3QgcHJlc2VudC5cbiIpOwotCQl9IGVsc2UgaWYgKCFvdmVybGF5KSB7Ci0JCQlyZmJMb2coIndhcm5pbmc6IG5vdCBpbiAtb3ZlcmxheSBtb2RlLlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIllvdSBtYXkgd2FudCB0byBydW4gLVIgc2hvd19jdXJzb3Igb3JcbiIpOwotCQkJcmZiTG9nKCIgLVIgY3Vyc29yOi4uLiB0byByZS1lbmFibGUgYW55IGN1cnNvcnMuXG4iKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICI4dG8yNCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgY21hcDh0bzI0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChvdmVybGF5KSB7Ci0JCQlyZmJMb2coImRpc2FibGluZyAtb3ZlcmxheSBpbiAtOHRvMjQgbW9kZS5cbiIpOwotCQkJb3ZlcmxheSA9IDA7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIC04dG8yNCBtb2RlLlxuIik7Ci0JCWNtYXA4dG8yNCA9IDE7Ci0JCWlmIChvdmVybGF5KSB7Ci0JCQlyZmJMb2coImRpc2FibGluZyAtb3ZlcmxheSBpbiAtOHRvMjQgbW9kZS5cbiIpOwotCQkJb3ZlcmxheSA9IDA7Ci0JCX0KLQkJZG9fbmV3X2ZiKDApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJubzh0bzI0IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhY21hcDh0bzI0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgLTh0bzI0IG1vZGUuXG4iKTsKLQkJY21hcDh0bzI0ID0gMDsKLQkJZG9fbmV3X2ZiKDApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIjh0bzI0X29wdHMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCI4dG8yNF9vcHRzOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKGNtYXA4dG8yNF9zdHIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCI4dG8yNF9vcHRzOiIpOwotCQlpZiAoY21hcDh0bzI0X3N0cikgewotCQkJZnJlZShjbWFwOHRvMjRfc3RyKTsKLQkJfQotCQljbWFwOHRvMjRfc3RyID0gc3RyZHVwKHApOwotCQlpZiAoKnAgPT0gJ1wwJykgewotCQkJY21hcDh0bzI0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWNtYXA4dG8yNCA9IDE7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgY21hcDh0bzI0X3N0ciB0bzogJXNcbiIsIGNtYXA4dG8yNF9zdHIpOwotCQlkb19uZXdfZmIoMCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIjI0dG8zMiIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgeGZvcm0yNHRvMzIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIC0yNHRvMzIgbW9kZS5cbiIpOwotCQl4Zm9ybTI0dG8zMiA9IDE7Ci0JCWRvX25ld19mYigxKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm8yNHRvMzIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF4Zm9ybTI0dG8zMik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIC0yNHRvMzIgbW9kZS5cbiIpOwotCQlpZiAoc2V0X3Zpc3VhbF9zdHJfdG9fc29tZXRoaW5nKSB7Ci0JCQlpZiAodmlzdWFsX3N0cikgewotCQkJCXJmYkxvZygidW5zZXR0aW5nOiAlZCAlZC8lZFxuIiwgdmlzdWFsX3N0ciwKLQkJCQkgICAgKGludCkgdmlzdWFsX2lkLCB2aXN1YWxfZGVwdGgpOwotCQkJCWZyZWUodmlzdWFsX3N0cik7Ci0JCQl9Ci0JCQl2aXN1YWxfc3RyID0gTlVMTDsKLQkJCXZpc3VhbF9pZCA9IChWaXN1YWxJRCkgMDsKLQkJCXZpc3VhbF9kZXB0aCA9IDA7Ci0JCX0KLQkJeGZvcm0yNHRvMzIgPSAwOwotCQlkb19uZXdfZmIoMSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAidmlzdWFsIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygidmlzdWFsOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHZpc3VhbF9zdHIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ2aXN1YWw6Iik7Ci0JCWlmICh2aXN1YWxfc3RyKSBmcmVlKHZpc3VhbF9zdHIpOwotCQl2aXN1YWxfc3RyID0gc3RyZHVwKHApOwotCi0JCS8qIE9LLCB0aGlzIHJlcXVpcmVzIGEgbmV3IGZiLi4uICovCi0JCWRvX25ld19mYigwKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAic2NhbGUiKSB8fAotCQkgICAgc3Ryc3RyKHAsICJzY2FsZToiKSA9PSBwKSB7CS8qIHNraXAtY21kLWxpc3QgKi8KLQkJQ09MT05fQ0hFQ0soInNjYWxlOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNjYWxlX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNjYWxlOiIpOwotCQlpZiAoc2NhbGVfc3RyKSBmcmVlKHNjYWxlX3N0cik7Ci0JCXNjYWxlX3N0ciA9IHN0cmR1cChwKTsKLQotCQkvKiBPSywgdGhpcyByZXF1aXJlcyBhIG5ldyBmYi4uLiAqLwotCQljaGVja19ibGFja19mYigpOwotCQlkb19uZXdfZmIoMCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNjYWxlX2N1cnNvciIpIHx8Ci0JCSAgICBzdHJzdHIocCwgInNjYWxlX2N1cnNvcjoiKSA9PSBwKSB7CS8qIHNraXAtY21kLWxpc3QgKi8KLQkJQ09MT05fQ0hFQ0soInNjYWxlX2N1cnNvcjoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTChzY2FsZV9jdXJzb3Jfc3RyKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2NhbGVfY3Vyc29yOiIpOwotCQlpZiAoc2NhbGVfY3Vyc29yX3N0cikgZnJlZShzY2FsZV9jdXJzb3Jfc3RyKTsKLQkJaWYgKCpwID09ICdcMCcpIHsKLQkJCXNjYWxlX2N1cnNvcl9zdHIgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJc2NhbGVfY3Vyc29yX3N0ciA9IHN0cmR1cChwKTsKLQkJfQotCQlzZXR1cF9jdXJzb3JzX2FuZF9wdXNoKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInZpZXdvbmx5IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB2aWV3X29ubHkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgdmlld29ubHkgbW9kZS5cbiIpOwotCQl2aWV3X29ubHkgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3ZpZXdvbmx5IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdmlld19vbmx5KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZSB2aWV3b25seSBtb2RlLlxuIik7Ci0JCXZpZXdfb25seSA9IDA7Ci0JCWlmIChyYXdfZmIpIHNldF9yYXdfZmJfcGFyYW1zKDApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJzaGFyZWQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHNoYXJlZCk7IGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxlIHNoYXJpbmcuXG4iKTsKLQkJc2hhcmVkID0gMTsKLQkJaWYgKHNjcmVlbikgewotCQkJLyogbXV0ZXggKi8KLQkJCXNjcmVlbi0+YWx3YXlzU2hhcmVkID0gVFJVRTsKLQkJCXNjcmVlbi0+bmV2ZXJTaGFyZWQgPSBGQUxTRTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NoYXJlZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNoYXJlZCk7IGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZSBzaGFyaW5nLlxuIik7Ci0JCXNoYXJlZCA9IDA7Ci0JCWlmIChzY3JlZW4pIHsKLQkJCS8qIG11dGV4ICovCi0JCQlzY3JlZW4tPmFsd2F5c1NoYXJlZCA9IEZBTFNFOwotCQkJc2NyZWVuLT5uZXZlclNoYXJlZCA9IFRSVUU7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZm9yZXZlciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgMS1jb25uZWN0X29uY2UpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgLWZvcmV2ZXIgbW9kZS5cbiIpOwotCQljb25uZWN0X29uY2UgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2ZvcmV2ZXIiKSB8fCAhc3RyY21wKHAsICJvbmNlIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBjb25uZWN0X29uY2UpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIC1mb3JldmVyIG1vZGUuXG4iKTsKLQkJY29ubmVjdF9vbmNlID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ0aW1lb3V0IikgPT0gcCkgewotCQlpbnQgdG87Ci0JCUNPTE9OX0NIRUNLKCJ0aW1lb3V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIGZpcnN0X2Nvbm5fdGltZW91dCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigidGltZW91dDoiKTsKLQkJdG8gPSBhdG9pKHApOwotCQlpZiAodG8gPiAwICkgewotCQkJdG8gPSAtdG87Ci0JCX0KLQkJZmlyc3RfY29ubl90aW1lb3V0ID0gdG87Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0IC10aW1lb3V0IHRvICVkXG4iLCAtdG8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ0aWdodGZpbGV4ZmVyIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB0aWdodGZpbGV4ZmVyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0jaWZkZWYgTElCVk5DU0VSVkVSX1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSCi0JCWlmICghIHRpZ2h0ZmlsZXhmZXIpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLXRpZ2h0ZmlsZXhmZXIgZm9yICpORVcqIGNsaWVudHMuXG4iKTsKLQkJCXRpZ2h0ZmlsZXhmZXIgPSAxOwotCQkJcmZiTG9nKCJyZmJSZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uOiA0XG4iKTsKLQkJCXJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb24oKTsKLQkJfQotI2Vsc2UKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiAtdGlnaHRmaWxleGZlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYmluYXJ5LlxuIik7Ci0jZW5kaWYKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm90aWdodGZpbGV4ZmVyIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdGlnaHRmaWxleGZlcik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotI2lmZGVmIExJQlZOQ1NFUlZFUl9XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUgotCQlpZiAodGlnaHRmaWxleGZlcikgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLXRpZ2h0ZmlsZXhmZXIgZm9yICpORVcqIGNsaWVudHMuXG4iKTsKLQkJCXRpZ2h0ZmlsZXhmZXIgPSAwOwotCQkJcmZiTG9nKCJyZmJVbnJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb246IDJcbiIpOwotCQkJcmZiVW5yZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uKCk7Ci0JCX0KLSNlbHNlCi0JCXJmYkxvZygicmVtb3RlX2NtZDogLXRpZ2h0ZmlsZXhmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJpbmFyeS5cbiIpOwotI2VuZGlmCi0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInVsdHJhZmlsZXhmZXIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWlmIChzY3JlZW4pIHsKLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBzY3JlZW4tPnBlcm1pdEZpbGVUcmFuc2ZlciA9PSBUUlVFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgMCk7Ci0JCQl9Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoISBzY3JlZW4tPnBlcm1pdEZpbGVUcmFuc2ZlcikgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtdWx0cmFmaWxleGZlciBmb3IgY2xpZW50cy5cbiIpOwotCQkJLyogbXV0ZXggKi8KLQkJCXNjcmVlbi0+cGVybWl0RmlsZVRyYW5zZmVyID0gVFJVRTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3VsdHJhZmlsZXhmZXIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWlmIChzY3JlZW4pIHsKLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBzY3JlZW4tPnBlcm1pdEZpbGVUcmFuc2ZlciA9PSBGQUxTRSk7Ci0JCQl9IGVsc2UgewotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIDEpOwotCQkJfQotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKHNjcmVlbi0+cGVybWl0RmlsZVRyYW5zZmVyKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyAtdWx0cmFmaWxleGZlciBmb3IgY2xpZW50cy5cbiIpOwotCQkJLyogbXV0ZXggKi8KLQkJCXNjcmVlbi0+cGVybWl0RmlsZVRyYW5zZmVyID0gRkFMU0U7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJyZmJ2ZXJzaW9uIikgPT0gcCkgewotCQlpbnQgbWFqLCBtaW47Ci0JCUNPTE9OX0NIRUNLKCJyZmJ2ZXJzaW9uOiIpCi0JCWlmIChxdWVyeSkgewotCQkJaWYgKHNjcmVlbikgewotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZC4lZCIsIHAsIHNjcmVlbi0+cHJvdG9jb2xNYWpvclZlcnNpb24sIHNjcmVlbi0+cHJvdG9jb2xNaW5vclZlcnNpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQuJWQiLCBwLCAzLCA4KTsKLQkJCX0KLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJyZmJ2ZXJzaW9uOiIpOwotCi0JCWlmIChzc2NhbmYocCwgIiVkLiVkIiwgJm1haiwgJm1pbikgPT0gMikgewotCQkJLyogbXV0ZXggKi8KLQkJCXNjcmVlbi0+cHJvdG9jb2xNYWpvclZlcnNpb24gPSBtYWo7Ci0JCQlzY3JlZW4tPnByb3RvY29sTWlub3JWZXJzaW9uID0gbWluOwotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgcmZidmVyc2lvbiB0bzogJWQuJWRcbiIsIG1haiwgbWluKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogaW52YWxpZCByZmJ2ZXJzaW9uOiAlc1xuIiwgcCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZGVueSIpIHx8ICFzdHJjbXAocCwgImxvY2siKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGRlbnlfYWxsKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGVueWluZyBuZXcgY29ubmVjdGlvbnMuXG4iKTsKLQkJZGVueV9hbGwgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlbnkiKSB8fCAhc3RyY21wKHAsICJ1bmxvY2siKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFkZW55X2FsbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGFsbG93aW5nIG5ldyBjb25uZWN0aW9ucy5cbiIpOwotCQlkZW55X2FsbCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImF2YWhpIikgfHwgIXN0cmNtcChwLCAibWRucyIpIHx8ICFzdHJjbXAocCwgInplcm9jb25mIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBhdmFoaSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsZSAtYXZhaGkgbUROUyBtb2RlLlxuIik7Ci0JCWlmICghYXZhaGkpIHsKLQkJCWF2YWhpID0gMTsKLQkJCWF2YWhpX2luaXRpYWxpc2UoKTsKLQkJCWF2YWhpX2FkdmVydGlzZSh2bmNfZGVza3RvcF9uYW1lLCB0aGlzX2hvc3QoKSwKLQkJCSAgICBzY3JlZW4tPnBvcnQpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vYXZhaGkiKSB8fCAhc3RyY21wKHAsICJub21kbnMiKSB8fCAhc3RyY21wKHAsICJub3plcm9jb25mIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhYXZhaGkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIC1hdmFoaSBtRE5TIG1vZGUuXG4iKTsKLQkJaWYgKGF2YWhpKSB7Ci0JCQlhdmFoaSA9IDA7Ci0JCQlhdmFoaV9yZXNldCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiY29ubmVjdCIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJjb25uZWN0OiIpCi0JCXAgKz0gc3RybGVuKCJjb25uZWN0OiIpOwotCQkvKiB0aGlzIGlzIGEgcmV2ZXJzZSBjb25uZWN0aW9uICovCi0JCXJldmVyc2VfY29ubmVjdChwKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJwcm94eSIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInByb3h5OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKGNvbm5lY3RfcHJveHkpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJwcm94eToiKTsKLQkJaWYgKGNvbm5lY3RfcHJveHkpIHsKLQkJCWZyZWUoY29ubmVjdF9wcm94eSk7Ci0JCQljb25uZWN0X3Byb3h5ID0gTlVMTDsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiIikgfHwgIXN0cmNhc2VjbXAocCwgIm5vbmUiKSkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGVkIC1wcm94eVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQljb25uZWN0X3Byb3h5ID0gc3RyZHVwKHApOwotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgLXByb3h5ICVzXG4iLCBjb25uZWN0X3Byb3h5KTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImFsbG93b25jZSIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImFsbG93b25jZToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTChhbGxvd19vbmNlKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiYWxsb3dvbmNlOiIpOwotCQlhbGxvd19vbmNlID0gc3RyZHVwKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldCBhbGxvd19vbmNlICVzXG4iLCBhbGxvd19vbmNlKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJhbGxvdyIpID09IHApIHsKLQkJY2hhciAqYmVmb3JlLCAqb2xkOwotCQlDT0xPTl9DSEVDSygiYWxsb3c6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoYWxsb3dfbGlzdCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQotCQlpZiAodW5peHB3KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNhbm5vdCBjaGFuZ2UgYWxsb3cgaW4gLXVuaXhwd1xuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImFsbG93OiIpOwotCQlpZiAoYWxsb3dfbGlzdCAmJiBzdHJjaHIoYWxsb3dfbGlzdCwgJy8nKSkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjYW5ub3QgdXNlIGFsbG93Omhvc3RcbiIpOwotCQkJcmZiTG9nKCJpbiAnLWFsbG93ICVzJyBtb2RlLlxuIiwgYWxsb3dfbGlzdCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJaWYgKGFsbG93X2xpc3QpIHsKLQkJCWJlZm9yZSA9IHN0cmR1cChhbGxvd19saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJlZm9yZSA9IHN0cmR1cCgiIik7Ci0JCX0KLQotCQlvbGQgPSBhbGxvd19saXN0OwotCQlpZiAoKnAgPT0gJysnKSB7Ci0JCQlwKys7Ci0JCQlhbGxvd19saXN0ID0gYWRkX2l0ZW0oYWxsb3dfbGlzdCwgcCk7Ci0JCX0gZWxzZSBpZiAoKnAgPT0gJy0nKSB7Ci0JCQlwKys7Ci0JCQlhbGxvd19saXN0ID0gZGVsZXRlX2l0ZW0oYWxsb3dfbGlzdCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlhbGxvd19saXN0ID0gc3RyZHVwKHApOwotCQl9Ci0KLQkJaWYgKHN0cmNtcChiZWZvcmUsIGFsbG93X2xpc3QpKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IG1vZGlmaWVkIGFsbG93X2xpc3Q6XG4iKTsKLQkJCXJmYkxvZygiIGZyb206IFwiJXNcIlxuIiwgYmVmb3JlKTsKLQkJCXJmYkxvZygiIHRvOiAgIFwiJXNcIlxuIiwgYWxsb3dfbGlzdCk7Ci0JCX0KLQkJaWYgKG9sZCkgZnJlZShvbGQpOwotCQlmcmVlKGJlZm9yZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vaXB2NiIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbm9pcHY2KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLW5vaXB2NiBtb2RlIGZvciBmdXR1cmUgc29ja2V0cy5cbiIpOwotCQlub2lwdjYgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJpcHY2IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhbm9pcHY2KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsaW5nIC1ub2lwdjYgbW9kZSBmb3IgZnV0dXJlIHNvY2tldHMuXG4iKTsKLQkJbm9pcHY2ID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9pcHY0IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBub2lwdjQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtbm9pcHY0IG1vZGUgZm9yIGZ1dHVyZSBzb2NrZXRzLlxuIik7Ci0JCW5vaXB2NCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImlwdjQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFub2lwdjQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLW5vaXB2NCBtb2RlIGZvciBmdXR1cmUgc29ja2V0cy5cbiIpOwotCQlub2lwdjQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJubzYiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFpcHY2X2xpc3Rlbik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoaXB2Nl9saXN0ZW4pIHsKLQkJCWlwdjZfbGlzdGVuID0gMDsKLQkJCXJmYkxvZygiZGlzYWJsaW5nIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuXG4iKTsKLQkJCXJlc2V0X3JmYnBvcnQoLTEsIHNjcmVlbi0+cG9ydCk7Ci0JCQlyZXNldF9odHRwcG9ydCgtMSwgc2NyZWVuLT5odHRwUG9ydCk7Ci0JCQlpZiAoaHR0cHNfcG9ydF9udW0gPiAwKSB7Ci0JCQkJaHR0cHNfcG9ydCgxKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICI2IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBpcHY2X2xpc3Rlbik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIWlwdjZfbGlzdGVuKSB7Ci0JCQlpcHY2X2xpc3RlbiA9IDE7Ci0JCQlyZmJMb2coImVuYWJsaW5nIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuXG4iKTsKLQkJCXJlc2V0X3JmYnBvcnQoLTEsIHNjcmVlbi0+cG9ydCk7Ci0JCQlyZXNldF9odHRwcG9ydCgtMSwgc2NyZWVuLT5odHRwUG9ydCk7Ci0JCQlpZiAoaHR0cHNfcG9ydF9udW0gPiAwKSB7Ci0JCQkJaHR0cHNfcG9ydCgxKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJsb2NhbGhvc3QiKSkgewotCQljaGFyICpiZWZvcmUsICpvbGQ7Ci0JCWlmIChxdWVyeSkgewotCQkJaW50IHN0YXRlID0gMDsKLQkJCWNoYXIgKnMgPSBhbGxvd19saXN0OwotCQkJaWYgKHMgJiYgKCFzdHJjbXAocywgIjEyNy4wLjAuMSIpIHx8Ci0JCQkgICAgIXN0cmNtcChzLCAibG9jYWxob3N0IikpKSB7Ci0JCQkJc3RhdGUgPSAxOwotCQkJfQotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgc3RhdGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKGFsbG93X2xpc3QpIHsKLQkJCWJlZm9yZSA9IHN0cmR1cChhbGxvd19saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJlZm9yZSA9IHN0cmR1cCgiIik7Ci0JCX0KLQkJb2xkID0gYWxsb3dfbGlzdDsKLQotCQlhbGxvd19saXN0ID0gc3RyZHVwKCIxMjcuMC4wLjEiKTsKLQotCQlpZiAoc3RyY21wKGJlZm9yZSwgYWxsb3dfbGlzdCkpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogbW9kaWZpZWQgYWxsb3dfbGlzdDpcbiIpOwotCQkJcmZiTG9nKCIgZnJvbTogXCIlc1wiXG4iLCBiZWZvcmUpOwotCQkJcmZiTG9nKCIgdG86ICAgXCIlc1wiXG4iLCBhbGxvd19saXN0KTsKLQkJfQotCQlpZiAob2xkKSBmcmVlKG9sZCk7Ci0JCWZyZWUoYmVmb3JlKTsKLQotCQlpZiAobGlzdGVuX3N0cikgewotCQkJZnJlZShsaXN0ZW5fc3RyKTsKLQkJfQotCQlsaXN0ZW5fc3RyID0gc3RyZHVwKCJsb2NhbGhvc3QiKTsKLQotCQkvKiBtdXRleCAqLwotCQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0JCXJmYkxvZygibGlzdGVuaW5nIG9uIGxvb3BiYWNrIG5ldHdvcmsgb25seS5cbiIpOwotCQlyZmJMb2coImFsbG93IGxpc3QgaXM6ICclcydcbiIsIE5PTlVMKGFsbG93X2xpc3QpKTsKLQkJcmVzZXRfcmZicG9ydCgtMSwgc2NyZWVuLT5wb3J0KTsKLQkJcmVzZXRfaHR0cHBvcnQoLTEsIHNjcmVlbi0+aHR0cFBvcnQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2xvY2FsaG9zdCIpKSB7Ci0JCWNoYXIgKmJlZm9yZSwgKm9sZDsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlpbnQgc3RhdGUgPSAwOwotCQkJY2hhciAqcyA9IGFsbG93X2xpc3Q7Ci0JCQlpZiAocyAmJiAoIXN0cmNtcChzLCAiMTI3LjAuMC4xIikgfHwKLQkJCSAgICAhc3RyY21wKHMsICJsb2NhbGhvc3QiKSkpIHsKLQkJCQlzdGF0ZSA9IDE7Ci0JCQl9Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhc3RhdGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKHVuaXhwdykgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjYW5ub3QgY2hhbmdlIGxvY2FsaG9zdCBpbiAtdW5peHB3XG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlpZiAoYWxsb3dfbGlzdCkgewotCQkJYmVmb3JlID0gc3RyZHVwKGFsbG93X2xpc3QpOwotCQl9IGVsc2UgewotCQkJYmVmb3JlID0gc3RyZHVwKCIiKTsKLQkJfQotCQlvbGQgPSBhbGxvd19saXN0OwotCi0JCWFsbG93X2xpc3QgPSBzdHJkdXAoIiIpOwotCi0JCWlmIChzdHJjbXAoYmVmb3JlLCBhbGxvd19saXN0KSkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBtb2RpZmllZCBhbGxvd19saXN0OlxuIik7Ci0JCQlyZmJMb2coIiBmcm9tOiBcIiVzXCJcbiIsIGJlZm9yZSk7Ci0JCQlyZmJMb2coIiB0bzogICBcIiVzXCJcbiIsIGFsbG93X2xpc3QpOwotCQl9Ci0JCWlmIChvbGQpIGZyZWUob2xkKTsKLQkJZnJlZShiZWZvcmUpOwotCi0JCWlmIChsaXN0ZW5fc3RyKSB7Ci0JCQlmcmVlKGxpc3Rlbl9zdHIpOwotCQl9Ci0JCWxpc3Rlbl9zdHIgPSBOVUxMOwotCi0JCS8qIG11dGV4ICovCi0JCXNjcmVlbi0+bGlzdGVuSW50ZXJmYWNlID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0JCXJmYkxvZygibGlzdGVuaW5nIG9uIEFMTCBuZXR3b3JrIGludGVyZmFjZXMuXG4iKTsKLQkJcmZiTG9nKCJhbGxvdyBsaXN0IGlzOiAnJXMnXG4iLCBOT05VTChhbGxvd19saXN0KSk7Ci0JCXJlc2V0X3JmYnBvcnQoLTEsIHNjcmVlbi0+cG9ydCk7Ci0JCXJlc2V0X2h0dHBwb3J0KC0xLCBzY3JlZW4tPmh0dHBQb3J0KTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJsaXN0ZW4iKSA9PSBwKSB7Ci0JCWNoYXIgKmJlZm9yZTsKLQkJaW50IG9rLCBtb2QgPSAwOwotCi0JCUNPTE9OX0NIRUNLKCJsaXN0ZW46IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwobGlzdGVuX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKHVuaXhwdykgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjYW5ub3QgY2hhbmdlIGxpc3RlbiBpbiAtdW5peHB3XG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlpZiAobGlzdGVuX3N0cikgewotCQkJYmVmb3JlID0gc3RyZHVwKGxpc3Rlbl9zdHIpOwotCQl9IGVsc2UgewotCQkJYmVmb3JlID0gc3RyZHVwKCIiKTsKLQkJfQotCQlwICs9IHN0cmxlbigibGlzdGVuOiIpOwotCi0JCWxpc3Rlbl9zdHIgPSBzdHJkdXAocCk7Ci0KLQkJaWYgKHN0cmNtcChiZWZvcmUsIGxpc3Rlbl9zdHIpKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IG1vZGlmaWVkIGxpc3Rlbl9zdHI6XG4iKTsKLQkJCXJmYkxvZygiIGZyb206IFwiJXNcIlxuIiwgYmVmb3JlKTsKLQkJCXJmYkxvZygiIHRvOiAgIFwiJXNcIlxuIiwgbGlzdGVuX3N0cik7Ci0JCQltb2QgPSAxOwotCQl9Ci0KLQkJb2sgPSAxOwotCQkvKiBtdXRleCAqLwotCQlpZiAobGlzdGVuX3N0ciA9PSBOVUxMIHx8ICpsaXN0ZW5fc3RyID09ICdcMCcgfHwKLQkJICAgICFzdHJjbXAobGlzdGVuX3N0ciwgImFueSIpKSB7Ci0JCQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGh0b25sKElOQUREUl9BTlkpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAobGlzdGVuX3N0ciwgImxvY2FsaG9zdCIpKSB7Ci0JCQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0JCQlpbl9hZGRyX3QgaWZhY2UgPSBpbmV0X2FkZHIobGlzdGVuX3N0cik7Ci0JCQlpZiAoaWZhY2UgPT0gaHRvbmwoSU5BRERSX05PTkUpKSB7Ci0JCQkJaWYgKCFob3N0X2xvb2t1cCkgewotCQkJCQlvayA9IDA7Ci0JCQkJfSBlbHNlIGlmICghKGhwID0gZ2V0aG9zdGJ5bmFtZShsaXN0ZW5fc3RyKSkpIHsKLQkJCQkJb2sgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmYWNlID0gKih1bnNpZ25lZCBsb25nICopaHAtPmhfYWRkcjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2spIHsKLQkJCQlzY3JlZW4tPmxpc3RlbkludGVyZmFjZSA9IGlmYWNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9rICYmIG1vZCkgewotCQkJaW50IGlzX2xvb3BiYWNrID0gMDsKLQkJCWluX2FkZHJfdCBpZmFjZSA9IHNjcmVlbi0+bGlzdGVuSW50ZXJmYWNlOwotCi0JCQlpZiAoYWxsb3dfbGlzdCkgewotCQkJCWlmICghc3RyY21wKGFsbG93X2xpc3QsICIxMjcuMC4wLjEiKSB8fAotCQkJCSAgICAhc3RyY21wKGFsbG93X2xpc3QsICJsb2NhbGhvc3QiKSkgewotCQkJCQlpc19sb29wYmFjayA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlmYWNlICE9IGh0b25sKElOQUREUl9MT09QQkFDSykpIHsKLQkJCSAgICBpZiAoaXNfbG9vcGJhY2spIHsKLQkJCQlyZmJMb2coInJlLXNldHRpbmcgLWFsbG93IGxpc3QgdG8gYWxsICIKLQkJCQkgICAiaG9zdHMgZm9yIG5vbi1sb29wYmFjayBsaXN0ZW5pbmcuXG4iKTsKLQkJCQlpZiAoYWxsb3dfbGlzdCkgewotCQkJCQlmcmVlKGFsbG93X2xpc3QpOwotCQkJCX0KLQkJCQlhbGxvd19saXN0ID0gTlVMTDsKLQkJCSAgICB9Ci0JCQl9IGVsc2UgewotCQkJICAgIGlmICghaXNfbG9vcGJhY2spIHsKLQkJCQlpZiAoYWxsb3dfbGlzdCkgewotCQkJCQlmcmVlKGFsbG93X2xpc3QpOwotCQkJCX0KLQkJCQlyZmJMb2coInNldHRpbmcgLWFsbG93IGxpc3QgdG8gMTI3LjAuMC4xXG4iKTsKLQkJCQlhbGxvd19saXN0ID0gc3RyZHVwKCIxMjcuMC4wLjEiKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlyZmJMb2coImFsbG93IGxpc3QgaXM6ICclcydcbiIsIE5PTlVMKGFsbG93X2xpc3QpKTsKLQkJCXJlc2V0X3JmYnBvcnQoLTEsIHNjcmVlbi0+cG9ydCk7Ci0JCQlyZXNldF9odHRwcG9ydCgtMSwgc2NyZWVuLT5odHRwUG9ydCk7Ci0JCQlmcmVlKGJlZm9yZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coImludmFsaWQgbGlzdGVuIHN0cmluZzogJXNcbiIsIGxpc3Rlbl9zdHIpOwotCQkJZnJlZShsaXN0ZW5fc3RyKTsKLQkJCWxpc3Rlbl9zdHIgPSBiZWZvcmU7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibG9va3VwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBob3N0X2xvb2t1cCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIGhvc3RuYW1lIGxvb2t1cC5cbiIpOwotCQlob3N0X2xvb2t1cCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vbG9va3VwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhaG9zdF9sb29rdXApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgaG9zdG5hbWUgbG9va3VwLlxuIik7Ci0JCWhvc3RfbG9va3VwID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJhY2NlcHQiKSA9PSBwKSB7Ci0JCWludCBkb2l0ID0gMSwgc2FmZSA9IDA7Ci0JCUNPTE9OX0NIRUNLKCJhY2NlcHQ6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoYWNjZXB0X2NtZCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImFjY2VwdDoiKTsKLQkJaWYgKCFzdHJjbXAocCwgIiIpIHx8IHN0cnN0cihwLCAicG9wdXAiKSA9PSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCXNhZmUgPSAxOwotCQl9Ci0JCWlmIChzYWZlX3JlbW90ZV9vbmx5ICYmICEgc2FmZSkgewotCQkJcmZiTG9nKCJ1bnNhZmU6ICVzXG4iLCBwKTsKLQkJCWRvaXQgPSAwOwotCQl9Ci0KLQkJaWYgKGRvaXQpIHsKLQkJCWlmIChhY2NlcHRfY21kKSBmcmVlKGFjY2VwdF9jbWQpOwotCQkJYWNjZXB0X2NtZCA9IHN0cmR1cChwKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImFmdGVyYWNjZXB0IikgPT0gcCkgewotCQlpbnQgc2FmZSA9IDA7Ci0JCUNPTE9OX0NIRUNLKCJhZnRlcmFjY2VwdDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTChhZnRlcmFjY2VwdF9jbWQpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJhZnRlcmFjY2VwdDoiKTsKLQkJaWYgKCFzdHJjbXAocCwgIiIpKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCXNhZmUgPSAxOwotCQl9Ci0JCWlmIChzYWZlX3JlbW90ZV9vbmx5ICYmICEgc2FmZSkgewotCQkJcmZiTG9nKCJ1bnNhZmU6ICVzXG4iLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChhZnRlcmFjY2VwdF9jbWQpIGZyZWUoYWZ0ZXJhY2NlcHRfY21kKTsKLQkJCWFmdGVyYWNjZXB0X2NtZCA9IHN0cmR1cChwKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImdvbmUiKSA9PSBwKSB7Ci0JCWludCBzYWZlID0gMDsKLQkJQ09MT05fQ0hFQ0soImdvbmU6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoZ29uZV9jbWQpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJnb25lOiIpOwotCQlpZiAoIXN0cmNtcChwLCAiIikgfHwgc3Ryc3RyKHAsICJwb3B1cCIpID09IHApIHsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJc2FmZSA9IDE7Ci0JCX0KLQkJaWYgKHNhZmVfcmVtb3RlX29ubHkgJiYgISBzYWZlKSB7Ci0JCQlyZmJMb2coInVuc2FmZTogJXNcbiIsIHApOwotCQl9IGVsc2UgewotCQkJaWYgKGdvbmVfY21kKSBmcmVlKGdvbmVfY21kKTsKLQkJCWdvbmVfY21kID0gc3RyZHVwKHApOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNobSIpKSB7Ci0JCWludCBvcmlnID0gdXNpbmdfc2htOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHVzaW5nX3NobSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIG5vc2htIG1vZGUuXG4iKTsKLQkJdXNpbmdfc2htID0gMTsKLQkJaWYgKHJhd19mYikgc2V0X3Jhd19mYl9wYXJhbXMoMCk7Ci0KLQkJaWYgKG9yaWcgIT0gdXNpbmdfc2htKSB7Ci0JCQlkb19uZXdfZmIoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIiBhbHJlYWR5IGluIHNobSBtb2RlLlxuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9zaG0iKSkgewotCQlpbnQgb3JpZyA9IHVzaW5nX3NobTsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdXNpbmdfc2htKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiBub3NobSBtb2RlLlxuIik7Ci0JCXVzaW5nX3NobSA9IDA7Ci0JCWlmIChvcmlnICE9IHVzaW5nX3NobSkgewotCQkJZG9fbmV3X2ZiKDEpOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCIgYWxyZWFkeSBpbiBub3NobSBtb2RlLlxuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZmxpcGJ5dGVvcmRlciIpKSB7Ci0JCWludCBvcmlnID0gZmxpcF9ieXRlX29yZGVyOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGZsaXBfYnl0ZV9vcmRlcik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gZmxpcGJ5dGVvcmRlciBtb2RlLlxuIik7Ci0JCWZsaXBfYnl0ZV9vcmRlciA9IDE7Ci0JCWlmIChvcmlnICE9IGZsaXBfYnl0ZV9vcmRlcikgewotCQkJaWYgKCEgdXNpbmdfc2htIHx8IHhmb3JtMjR0bzMyKSB7Ci0JCQkJZG9fbmV3X2ZiKDEpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIiAgdXNpbmcgc2htLCBub3QgcmVzZXR0aW5nIGZiXG4iKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2ZsaXBieXRlb3JkZXIiKSkgewotCQlpbnQgb3JpZyA9IGZsaXBfYnl0ZV9vcmRlcjsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhZmxpcF9ieXRlX29yZGVyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgZmxpcGJ5dGVvcmRlciBtb2RlLlxuIik7Ci0JCWZsaXBfYnl0ZV9vcmRlciA9IDA7Ci0JCWlmIChvcmlnICE9IGZsaXBfYnl0ZV9vcmRlcikgewotCQkJaWYgKCEgdXNpbmdfc2htIHx8IHhmb3JtMjR0bzMyKSB7Ci0JCQkJZG9fbmV3X2ZiKDEpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIiAgdXNpbmcgc2htLCBub3QgcmVzZXR0aW5nIGZiXG4iKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJvbmV0aWxlIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBzaW5nbGVfY29weXRpbGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgLW9uZXRpbGUgbW9kZS5cbiIpOwotCQlzaW5nbGVfY29weXRpbGUgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub29uZXRpbGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFzaW5nbGVfY29weXRpbGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIC1vbmV0aWxlIG1vZGUuXG4iKTsKLQkJaWYgKHRpbGVfc2htX2NvdW50IDwgbnRpbGVzX3gpIHsKLQkJCXJmYkxvZygiIHRoaXMgaGFzIG5vIGVmZmVjdDogdGlsZV9zaG1fY291bnQ9JWQiCi0JCQkgICAgIiBudGlsZXNfeD0lZFxuIiwgdGlsZV9zaG1fY291bnQsIG50aWxlc194KTsKLQkJCQotCQl9Ci0JCXNpbmdsZV9jb3B5dGlsZSA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAic29saWRfY29sb3IiKSA9PSBwKSB7Ci0JCS8qCi0JCSAqIG4uYi4gdGhpcyBzb2xpZCBzdHVmZiBwZXJoYXBzIHNob3VsZCByZWZsZWN0Ci0JCSAqIHNhZmVfcmVtb3RlX29ubHkgYnV0IGF0IGxlYXN0IHRoZSBjb21tYW5kIG5hbWVzCi0JCSAqIGFyZSBmaXhlZC4KLQkJICovCi0JCWNoYXIgKm5ld2M7Ci0JCWludCBkb2l0ID0gMTsKLQkJQ09MT05fQ0hFQ0soInNvbGlkX2NvbG9yOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNvbGlkX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNvbGlkX2NvbG9yOiIpOwotCQlpZiAoKnAgIT0gJ1wwJykgewotCQkJbmV3YyA9IHN0cmR1cChwKTsKLQkJfSBlbHNlIHsKLQkJCW5ld2MgPSBzdHJkdXAoc29saWRfZGVmYXVsdCk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzb2xpZCAlcyAtPiAlc1xuIiwgTk9OVUwoc29saWRfc3RyKSwgbmV3Yyk7Ci0KLQkJaWYgKHNvbGlkX3N0cikgewotCQkJaWYgKCFzdHJjbXAoc29saWRfc3RyLCBuZXdjKSkgewotCQkJCWRvaXQgPSAwOwotCQkJfQotCQkJZnJlZShzb2xpZF9zdHIpOwotCQl9Ci0JCXNvbGlkX3N0ciA9IG5ld2M7Ci0JCXVzZV9zb2xpZF9iZyA9IDE7Ci0JCWlmIChyYXdfZmIgJiYgIW1hY29zeF9jb25zb2xlKSBzZXRfcmF3X2ZiX3BhcmFtcygwKTsKLQotCQlpZiAoZG9pdCAmJiBjbGllbnRfY291bnQpIHsKLQkJCXNvbGlkX2JnKDApOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNvbGlkIikpIHsKLQkJaW50IG9yaWcgPSB1c2Vfc29saWRfYmc7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgdXNlX3NvbGlkX2JnKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxlIC1zb2xpZCBtb2RlXG4iKTsKLQkJaWYgKCEgc29saWRfc3RyKSB7Ci0JCQlzb2xpZF9zdHIgPSBzdHJkdXAoc29saWRfZGVmYXVsdCk7Ci0JCX0KLQkJdXNlX3NvbGlkX2JnID0gMTsKLQkJaWYgKHJhd19mYiAmJiAhbWFjb3N4X2NvbnNvbGUpIHNldF9yYXdfZmJfcGFyYW1zKDApOwotCQlpZiAoY2xpZW50X2NvdW50ICYmICFvcmlnKSB7Ci0JCQlzb2xpZF9iZygwKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NvbGlkIikpIHsKLQkJaW50IG9yaWcgPSB1c2Vfc29saWRfYmc7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXVzZV9zb2xpZF9iZyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGUgLXNvbGlkIG1vZGVcbiIpOwotCQl1c2Vfc29saWRfYmcgPSAwOwotCQlpZiAoY2xpZW50X2NvdW50ICYmIG9yaWcpIHsKLQkJCXNvbGlkX2JnKDEpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiYmxhY2tvdXQiKSA9PSBwKSB7Ci0JCWNoYXIgKmJlZm9yZSwgKm9sZDsKLQkJQ09MT05fQ0hFQ0soImJsYWNrb3V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKGJsYWNrb3V0X3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImJsYWNrb3V0OiIpOwotCQlpZiAoYmxhY2tvdXRfc3RyKSB7Ci0JCQliZWZvcmUgPSBzdHJkdXAoYmxhY2tvdXRfc3RyKTsKLQkJfSBlbHNlIHsKLQkJCWJlZm9yZSA9IHN0cmR1cCgiIik7Ci0JCX0KLQkJb2xkID0gYmxhY2tvdXRfc3RyOwotCQlpZiAoKnAgPT0gJysnKSB7Ci0JCQlwKys7Ci0JCQlibGFja291dF9zdHIgPSBhZGRfaXRlbShibGFja291dF9zdHIsIHApOwotCQl9IGVsc2UgaWYgKCpwID09ICctJykgewotCQkJcCsrOwotCQkJYmxhY2tvdXRfc3RyID0gZGVsZXRlX2l0ZW0oYmxhY2tvdXRfc3RyLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWJsYWNrb3V0X3N0ciA9IHN0cmR1cChwKTsKLQkJfQotCQlpZiAoc3RyY21wKGJlZm9yZSwgYmxhY2tvdXRfc3RyKSkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjaGFuZ2luZyAtYmxhY2tvdXRcbiIpOwotCQkJcmZiTG9nKCIgZnJvbTogJXNcbiIsIGJlZm9yZSk7Ci0JCQlyZmJMb2coIiB0bzogICAlc1xuIiwgYmxhY2tvdXRfc3RyKTsKLQkJCWlmICgwICYmICFzdHJjbXAoYmxhY2tvdXRfc3RyLCAiIikgJiYKLQkJCSAgICBzaW5nbGVfY29weXRpbGVfb3JpZyAhPSBzaW5nbGVfY29weXRpbGUpIHsKLQkJCQlyZmJMb2coInJlc2V0dGluZyBzaW5nbGVfY29weXRpbGUgdG86ICVkXG4iLAotCQkJCSAgICBzaW5nbGVfY29weXRpbGVfb3JpZyk7Ci0JCQkJc2luZ2xlX2NvcHl0aWxlID0gc2luZ2xlX2NvcHl0aWxlX29yaWc7Ci0JCQl9Ci0JCQlpbml0aWFsaXplX2JsYWNrb3V0c19hbmRfeGluZXJhbWEoKTsKLQkJfQotCQlpZiAob2xkKSBmcmVlKG9sZCk7Ci0JCWZyZWUoYmVmb3JlKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAieGluZXJhbWEiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHhpbmVyYW1hKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxlIHhpbmVyYW1hIG1vZGUuIChpZiBhcHBsaWNhYmxlKS5cbiIpOwotCQl4aW5lcmFtYSA9IDE7Ci0JCWluaXRpYWxpemVfYmxhY2tvdXRzX2FuZF94aW5lcmFtYSgpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3hpbmVyYW1hIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAheGluZXJhbWEpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIHhpbmVyYW1hIG1vZGUuIChpZiBhcHBsaWNhYmxlKS5cbiIpOwotCQl4aW5lcmFtYSA9IDA7Ci0JCWluaXRpYWxpemVfYmxhY2tvdXRzX2FuZF94aW5lcmFtYSgpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ4dHJhcCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgeHRyYXBfaW5wdXQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgeHRyYXAgaW5wdXQgbW9kZS4iCi0JCSAgICAiKGlmIGFwcGxpY2FibGUpLlxuIik7Ci0JCWlmICghIHh0cmFwX2lucHV0KSB7Ci0JCQl4dHJhcF9pbnB1dCA9IDE7Ci0JCQlkaXNhYmxlX2dyYWJzZXJ2ZXIoZHB5LCAxKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3h0cmFwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAheHRyYXBfaW5wdXQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIHh0cmFwIGlucHV0IG1vZGUuIgotCQkgICAgIihpZiBhcHBsaWNhYmxlKS5cbiIpOwotCQlpZiAoeHRyYXBfaW5wdXQpIHsKLQkJCXh0cmFwX2lucHV0ID0gMDsKLQkJCWRpc2FibGVfZ3JhYnNlcnZlcihkcHksIDEpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInhyYW5kciIpKSB7Ci0JCWludCBvcmlnID0geHJhbmRyOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHhyYW5kcik7IGdvdG8gcXJ5OwotCQl9Ci0JCWlmICh4cmFuZHJfcHJlc2VudCkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgeHJhbmRyIG1vZGUuXG4iKTsKLQkJCXhyYW5kciA9IDE7Ci0JCQlpZiAocmF3X2ZiKSBzZXRfcmF3X2ZiX3BhcmFtcygwKTsKLQkJCWlmICghIHhyYW5kcl9tb2RlKSB7Ci0JCQkJeHJhbmRyX21vZGUgPSBzdHJkdXAoImRlZmF1bHQiKTsKLQkJCX0KLQkJCWlmIChvcmlnICE9IHhyYW5kcikgewotCQkJCWluaXRpYWxpemVfeHJhbmRyKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IFhSQU5EUiBleHQuIG5vdCBwcmVzZW50LlxuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm94cmFuZHIiKSkgewotCQlpbnQgb3JpZyA9IHhyYW5kcjsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAheHJhbmRyKTsgZ290byBxcnk7Ci0JCX0KLQkJeHJhbmRyID0gMDsKLQkJeHJhbmRyX21heWJlID0gMDsKLQkJaWYgKHhyYW5kcl9wcmVzZW50KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGUgeHJhbmRyIG1vZGUuXG4iKTsKLQkJCWlmIChvcmlnICE9IHhyYW5kcikgewotCQkJCWluaXRpYWxpemVfeHJhbmRyKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IFhSQU5EUiBleHQuIG5vdCBwcmVzZW50LlxuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ4cmFuZHJfbW9kZSIpID09IHApIHsKLQkJaW50IG9yaWcgPSB4cmFuZHI7Ci0JCUNPTE9OX0NIRUNLKCJ4cmFuZHJfbW9kZToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTCh4cmFuZHJfbW9kZSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInhyYW5kcl9tb2RlOiIpOwotCQlpZiAoIXN0cmNtcCgibm9uZSIsIHApKSB7Ci0JCQl4cmFuZHIgPSAwOwotCQkJeHJhbmRyX21heWJlID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlmIChrbm93bl94cmFuZHJfbW9kZShwKSkgewotCQkJCWlmICh4cmFuZHJfbW9kZSkgZnJlZSh4cmFuZHJfbW9kZSk7Ci0JCQkJeHJhbmRyX21vZGUgPSBzdHJkdXAocCk7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygic2tpcHBpbmcgdW5rbm93biB4cmFuZHIgbW9kZTogJXNcbiIsIHApOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCXhyYW5kciA9IDE7Ci0JCX0KLQkJaWYgKHhyYW5kcl9wcmVzZW50KSB7Ci0JCQlpZiAoeHJhbmRyKSB7Ci0JCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgeHJhbmRyIG1vZGUuXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIHhyYW5kciBtb2RlLlxuIik7Ci0JCQl9Ci0JCQlpZiAoISB4cmFuZHJfbW9kZSkgewotCQkJCXhyYW5kcl9tb2RlID0gc3RyZHVwKCJkZWZhdWx0Iik7Ci0JCQl9Ci0JCQlpZiAob3JpZyAhPSB4cmFuZHIpIHsKLQkJCQlpbml0aWFsaXplX3hyYW5kcigpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBYUkFORFIgZXh0LiBub3QgcHJlc2VudC5cbiIpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAicm90YXRlIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygicm90YXRlOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHJvdGF0aW5nX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInJvdGF0ZToiKTsKLQkJaWYgKHJvdGF0aW5nX3N0cikgZnJlZShyb3RhdGluZ19zdHIpOwotCQlyb3RhdGluZ19zdHIgPSBzdHJkdXAocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0IHJvdGF0ZSB0byBcIiVzXCJcbiIsIHJvdGF0aW5nX3N0cik7Ci0KLQkJZG9fbmV3X2ZiKDApOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInBhZGdlb20iKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJwYWRnZW9tOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHBhZF9nZW9tZXRyeSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInBhZGdlb206Iik7Ci0JCWlmICghc3RyY21wKCJmb3JjZSIsIHApIHx8ICFzdHJjbXAoImRvIixwKSB8fCAhc3RyY21wKCJnbyIscCkpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogaW52b2tpbmcgaW5zdGFsbF9wYWRkZWRfZmIoKVxuIik7Ci0JCQlpbnN0YWxsX3BhZGRlZF9mYihwYWRfZ2VvbWV0cnkpOwotCQl9IGVsc2UgewotCQkJaWYgKHBhZF9nZW9tZXRyeSkgZnJlZShwYWRfZ2VvbWV0cnkpOwotCQkJcGFkX2dlb21ldHJ5ID0gc3RyZHVwKHApOwotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgcGFkZ2VvbSB0bzogJXNcbiIsCi0JCQkgICAgcGFkX2dlb21ldHJ5KTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJxdWlldCIpIHx8ICFzdHJjbXAocCwgInEiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHF1aWV0KTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIHF1aWV0IG1vZGUuXG4iKTsKLQkJcXVpZXQgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3F1aWV0IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhcXVpZXQpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIHF1aWV0IG1vZGUuXG4iKTsKLQkJcXVpZXQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJtb2R0d2VhayIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgdXNlX21vZGlmaWVyX3R3ZWFrKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLW1vZHR3ZWFrIG1vZGUuXG4iKTsKLQkJaWYgKCEgdXNlX21vZGlmaWVyX3R3ZWFrKSB7Ci0JCQl1c2VfbW9kaWZpZXJfdHdlYWsgPSAxOwotCQkJaW5pdGlhbGl6ZV9tb2R0d2VhaygpOwotCQl9Ci0JCXVzZV9tb2RpZmllcl90d2VhayA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vbW9kdHdlYWsiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgIXVzZV9tb2RpZmllcl90d2Vhayk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC1ub21vZHR3ZWFrIG1vZGUuXG4iKTsKLQkJZ290X25vbW9kdHdlYWsgPSAxOwotCQl1c2VfbW9kaWZpZXJfdHdlYWsgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ4a2IiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHVzZV94a2JfbW9kdHdlYWspOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCEgeGtiX3ByZXNlbnQpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogY2Fubm90IGVuYWJsZSAteGtiICIKLQkJCSAgICAibW9kdHdlYWsgbW9kZSAobm90IHN1cHBvcnRlZCBvbiBYIGRpc3BsYXkpXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC14a2IgbW9kdHdlYWsgbW9kZSIKLQkJICAgICIgKGlmIHN1cHBvcnRlZCkuXG4iKTsKLQkJaWYgKCEgdXNlX21vZGlmaWVyX3R3ZWFrIHx8ICEgdXNlX3hrYl9tb2R0d2VhaykgewotCQkJdXNlX21vZGlmaWVyX3R3ZWFrID0gMTsKLQkJCXVzZV94a2JfbW9kdHdlYWsgPSAxOwotCQkJaW5pdGlhbGl6ZV9tb2R0d2VhaygpOwotCQl9Ci0JCXVzZV9tb2RpZmllcl90d2VhayA9IDE7Ci0JCXVzZV94a2JfbW9kdHdlYWsgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3hrYiIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXVzZV94a2JfbW9kdHdlYWspOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCEgeGtiX3ByZXNlbnQpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogY2Fubm90IGRpc2FibGUgLXhrYiAiCi0JCQkgICAgIm1vZHR3ZWFrIG1vZGUgKG5vdCBzdXBwb3J0ZWQgb24gWCBkaXNwbGF5KVxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLXhrYiBtb2R0d2VhayBtb2RlLlxuIik7Ci0JCXVzZV94a2JfbW9kdHdlYWsgPSAwOwotCQlnb3Rfbm94a2IgPSAxOwotCQlpbml0aWFsaXplX21vZHR3ZWFrKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNhcHNsb2NrIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB3YXRjaF9jYXBzbG9jayk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC1jYXBzbG9jayBtb2RlXG4iKTsKLQkJd2F0Y2hfY2Fwc2xvY2sgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2NhcHNsb2NrIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhd2F0Y2hfY2Fwc2xvY2spOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLWNhcHNsb2NrIG1vZGVcbiIpOwotCQl3YXRjaF9jYXBzbG9jayA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNraXBfbG9ja2tleXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHNraXBfbG9ja2tleXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtc2tpcF9sb2Nra2V5cyBtb2RlXG4iKTsKLQkJc2tpcF9sb2Nra2V5cyA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vc2tpcF9sb2Nra2V5cyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNraXBfbG9ja2tleXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLXNraXBfbG9ja2tleXMgbW9kZVxuIik7Ci0JCXNraXBfbG9ja2tleXMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNraXBfa2V5Y29kZXMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJza2lwX2tleWNvZGVzOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNraXBfa2V5Y29kZXMpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJza2lwX2tleWNvZGVzOiIpOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgeGtiIC1za2lwX2tleWNvZGVzIgotCQkgICAgIiB0bzpcblx0JyVzJ1xuIiwgcCk7Ci0JCWlmICghIHhrYl9wcmVzZW50KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHdhcm5pbmcgeGtiIG5vdCBwcmVzZW50XG4iKTsKLQkJfSBlbHNlIGlmICghIHVzZV94a2JfbW9kdHdlYWspIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiB4a2IuXG4iKTsKLQkJCXVzZV94a2JfbW9kdHdlYWsgPSAxOwotCQkJaWYgKCEgdXNlX21vZGlmaWVyX3R3ZWFrKSB7Ci0JCQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIG1vZHR3ZWFrLlxuIik7Ci0JCQkJdXNlX21vZGlmaWVyX3R3ZWFrID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoc2tpcF9rZXljb2RlcykgZnJlZShza2lwX2tleWNvZGVzKTsKLQkJc2tpcF9rZXljb2RlcyA9IHN0cmR1cChwKTsKLQkJaW5pdGlhbGl6ZV9tb2R0d2VhaygpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJzbG9wcHlfa2V5cyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgc2xvcHB5X2tleXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJc2xvcHB5X2tleXMgKz0gMTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgc2xvcHB5X2tleXMgdG86ICVkXG4iLCBzbG9wcHlfa2V5cyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vc2xvcHB5X2tleXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFzbG9wcHlfa2V5cyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlzbG9wcHlfa2V5cyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0IHNsb3BweV9rZXlzIHRvOiAlZFxuIiwgc2xvcHB5X2tleXMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJza2lwX2R1cHMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgc2tpcF9kdXBsaWNhdGVfa2V5X2V2ZW50cyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC1za2lwX2R1cHMgbW9kZVxuIik7Ci0JCXNraXBfZHVwbGljYXRlX2tleV9ldmVudHMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NraXBfZHVwcyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwKLQkJCSAgICAhc2tpcF9kdXBsaWNhdGVfa2V5X2V2ZW50cyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyAtc2tpcF9kdXBzIG1vZGVcbiIpOwotCQlza2lwX2R1cGxpY2F0ZV9rZXlfZXZlbnRzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiYWRkX2tleXN5bXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGFkZF9rZXlzeW1zKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLWFkZF9rZXlzeW1zIG1vZGUuXG4iKTsKLQkJYWRkX2tleXN5bXMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2FkZF9rZXlzeW1zIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhYWRkX2tleXN5bXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgLWFkZF9rZXlzeW1zIG1vZGUuXG4iKTsKLQkJYWRkX2tleXN5bXMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJjbGVhcl9tb2RzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBjbGVhcl9tb2RzID09IDEpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtY2xlYXJfbW9kcyBtb2RlLlxuIik7Ci0JCWNsZWFyX21vZHMgPSAxOwotCQlpZiAodXNlX3RocmVhZHMpIHtYX0xPQ0s7fQotCQljbGVhcl9tb2RpZmllcnMoMCk7Ci0JCWlmICh1c2VfdGhyZWFkcykge1hfVU5MT0NLO30KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9jbGVhcl9tb2RzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLAotCQkJICAgICEoY2xlYXJfbW9kcyA9PSAxKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyAtY2xlYXJfbW9kcyBtb2RlLlxuIik7Ci0JCWNsZWFyX21vZHMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJjbGVhcl9rZXlzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLAotCQkJICAgIGNsZWFyX21vZHMgPT0gMik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC1jbGVhcl9rZXlzIG1vZGUuXG4iKTsKLQkJY2xlYXJfbW9kcyA9IDI7Ci0JCWlmICh1c2VfdGhyZWFkcykge1hfTE9DSzt9Ci0JCWNsZWFyX2tleXMoKTsKLQkJaWYgKHVzZV90aHJlYWRzKSB7WF9VTkxPQ0s7fQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2NsZWFyX2tleXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgIShjbGVhcl9tb2RzID09IDIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsaW5nIC1jbGVhcl9rZXlzIG1vZGUuXG4iKTsKLQkJY2xlYXJfbW9kcyA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNsZWFyX2FsbCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwKLQkJCSAgICBjbGVhcl9tb2RzID09IDMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkb2luZyBjbGVhcl9hbGwgYWN0aW9uLlxuIik7Ci0JCWNsZWFyX21vZHMgPSAzOwotCQlpZiAodXNlX3RocmVhZHMpIHtYX0xPQ0s7fQotCQljbGVhcl9rZXlzKCk7Ci0JCWNsZWFyX2xvY2tzKCk7Ci0JCWlmICh1c2VfdGhyZWFkcykge1hfVU5MT0NLO30KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiY2xlYXJfbG9ja3MiKSkgewotCQlOT1RBUFAKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkb2luZyBjbGVhcl9sb2NrcyBhY3Rpb24uXG4iKTsKLQkJaWYgKHVzZV90aHJlYWRzKSB7WF9MT0NLO30KLQkJY2xlYXJfbG9ja3MoKTsKLQkJaWYgKHVzZV90aHJlYWRzKSB7WF9VTkxPQ0s7fQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJrZXlzdGF0ZSIpKSB7Ci0JCWludCBpLCBzdGF0ZVsyNTZdOwotCQlOT1RBUFAKLQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCXN0YXRlW2ldID0gMDsKLQkJfQotCQlpZiAodXNlX3RocmVhZHMpIHtYX0xPQ0s7fQotCQlnZXRfa2V5c3RhdGUoc3RhdGUpOwotCQlpZiAodXNlX3RocmVhZHMpIHtYX1VOTE9DSzt9Ci0JCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImtleXN0YXRlWyUwM2RdICVkXG4iLCBpLCBzdGF0ZVtpXSk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJyZW1hcCIpID09IHApIHsKLQkJY2hhciAqYmVmb3JlLCAqb2xkOwotCQlDT0xPTl9DSEVDSygicmVtYXA6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwocmVtYXBfZmlsZSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInJlbWFwOiIpOwotCQlpZiAoKCpwID09ICcrJyB8fCAqcCA9PSAnLScpICYmIHJlbWFwX2ZpbGUgJiYKLQkJICAgIHN0cmNocihyZW1hcF9maWxlLCAnLycpKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNhbm5vdCB1c2UgcmVtYXA6Ky8tXG4iKTsKLQkJCXJmYkxvZygiaW4gJy1yZW1hcCAlcycgbW9kZS5cbiIsIHJlbWFwX2ZpbGUpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWlmIChyZW1hcF9maWxlKSB7Ci0JCQliZWZvcmUgPSBzdHJkdXAocmVtYXBfZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQliZWZvcmUgPSBzdHJkdXAoIiIpOwotCQl9Ci0JCW9sZCA9IHJlbWFwX2ZpbGU7Ci0JCWlmICgqcCA9PSAnKycpIHsKLQkJCXArKzsKLQkJCXJlbWFwX2ZpbGUgPSBhZGRfaXRlbShyZW1hcF9maWxlLCBwKTsKLQkJfSBlbHNlIGlmICgqcCA9PSAnLScpIHsKLQkJCXArKzsKLQkJCXJlbWFwX2ZpbGUgPSBkZWxldGVfaXRlbShyZW1hcF9maWxlLCBwKTsKLQkJCWlmICghIHN0cmNocihyZW1hcF9maWxlLCAnLScpKSB7Ci0JCQkJKnJlbWFwX2ZpbGUgPSAnXDAnOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVtYXBfZmlsZSA9IHN0cmR1cChwKTsKLQkJfQotCQlpZiAoc3RyY21wKGJlZm9yZSwgcmVtYXBfZmlsZSkpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtcmVtYXBcbiIpOwotCQkJcmZiTG9nKCIgZnJvbTogJXNcbiIsIGJlZm9yZSk7Ci0JCQlyZmJMb2coIiB0bzogICAlc1xuIiwgcmVtYXBfZmlsZSk7Ci0JCQlpbml0aWFsaXplX3JlbWFwKHJlbWFwX2ZpbGUpOwotCQl9Ci0JCWlmIChvbGQpIGZyZWUob2xkKTsKLQkJZnJlZShiZWZvcmUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJyZXBlYXQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFub19hdXRvcmVwZWF0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLXJlcGVhdCBtb2RlLlxuIik7Ci0JCWF1dG9yZXBlYXQoMSwgMCk7CS8qIHJlc3RvcmUgaW5pdGlhbCBzZXR0aW5nICovCi0JCW5vX2F1dG9yZXBlYXQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3JlcGVhdCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbm9fYXV0b3JlcGVhdCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC1ub3JlcGVhdCBtb2RlLlxuIik7Ci0JCW5vX2F1dG9yZXBlYXQgPSAxOwotCQlpZiAobm9fcmVwZWF0X2NvdW50ZG93biA+PSAwKSB7Ci0JCQlub19yZXBlYXRfY291bnRkb3duID0gMjsKLQkJfQotCQlpZiAoY2xpZW50X2NvdW50ICYmICEgdmlld19vbmx5KSB7Ci0JCQlhdXRvcmVwZWF0KDAsIDApOwkvKiBkaXNhYmxlIGlmIGFueSBjbGllbnRzICovCi0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZmIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFub2ZiKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChub2ZiKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyBub2ZiIG1vZGUuXG4iKTsKLQkJCXJmYkxvZygiICB5b3UgbWF5IG5lZWQgdG8gdGhlc2UgdHVybiBiYWNrIG9uOlxuIik7Ci0JCQlyZmJMb2coIiAgICAgeGZpeGVzLCB4ZGFtYWdlLCBzb2xpZCwgZmxhc2hjbWFwXG4iKTsKLQkJCXJmYkxvZygiICAgICBvdmVybGF5LCBzaG0sIG5vb25ldGlsZSwgbmFwLCBjdXJzb3JcbiIpOwotCQkJcmZiTG9nKCIgICAgIGN1cnNvcnBvcywgY3Vyc29yc2hhcGUsIGJlbGwuXG4iKTsKLQkJCW5vZmIgPSAwOwotCQkJc2V0X25vZmJfcGFyYW1zKDEpOwotCQkJZG9fbmV3X2ZiKDEpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZmIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG5vZmIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFub2ZiKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIG5vZmIgbW9kZS5cbiIpOwotCQkJaWYgKG1haW5fZmIpIHsKLQkJCQlwdXNoX2JsYWNrX3NjcmVlbig0KTsKLQkJCX0KLQkJCW5vZmIgPSAxOwotCQkJc291bmRfYmVsbCA9IDA7Ci0JCQlpbml0aWFsaXplX3dhdGNoX2JlbGwoKTsKLQkJCXNldF9ub2ZiX3BhcmFtcygwKTsKLQkJCWRvX25ld19mYigxKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJiZWxsIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBzb3VuZF9iZWxsKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgYmVsbCAoaWYgc3VwcG9ydGVkKS5cbiIpOwotCQlpbml0aWFsaXplX3dhdGNoX2JlbGwoKTsKLQkJc291bmRfYmVsbCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vYmVsbCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNvdW5kX2JlbGwpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgYmVsbC5cbiIpOwotCQlpbml0aWFsaXplX3dhdGNoX2JlbGwoKTsKLQkJc291bmRfYmVsbCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNlbmRiZWxsIikpIHsKLQkJTk9UQVBQCi0JCXJmYkxvZygicmVtb3RlX2NtZDogc2VuZGJlbGwuXG4iKTsKLQkJaWYgKHNjcmVlbiAmJiBjbGllbnRfY291bnQpIHsKLQkJCXJmYlNlbmRCZWxsKHNjcmVlbik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAic2VsIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB3YXRjaF9zZWxlY3Rpb24pOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyB3YXRjaCBzZWxlY3Rpb24rcHJpbWFyeS5cbiIpOwotCQl3YXRjaF9zZWxlY3Rpb24gPSAxOwotCQl3YXRjaF9wcmltYXJ5ID0gMTsKLQkJd2F0Y2hfY2xpcGJvYXJkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9zZWwiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF3YXRjaF9zZWxlY3Rpb24pOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgd2F0Y2ggc2VsZWN0aW9uK3ByaW1hcnkuXG4iKTsKLQkJd2F0Y2hfc2VsZWN0aW9uID0gMDsKLQkJd2F0Y2hfcHJpbWFyeSA9IDA7Ci0JCXdhdGNoX2NsaXBib2FyZCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInByaW1hcnkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHdhdGNoX3ByaW1hcnkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyB3YXRjaF9wcmltYXJ5LlxuIik7Ci0JCXdhdGNoX3ByaW1hcnkgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3ByaW1hcnkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF3YXRjaF9wcmltYXJ5KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsaW5nIHdhdGNoX3ByaW1hcnkuXG4iKTsKLQkJd2F0Y2hfcHJpbWFyeSA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNldHByaW1hcnkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHNldF9wcmltYXJ5KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgc2V0X3ByaW1hcnkuXG4iKTsKLQkJc2V0X3ByaW1hcnkgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NldHByaW1hcnkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFzZXRfcHJpbWFyeSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyBzZXRfcHJpbWFyeS5cbiIpOwotCQlzZXRfcHJpbWFyeSA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNsaXBib2FyZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgd2F0Y2hfY2xpcGJvYXJkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgd2F0Y2hfY2xpcGJvYXJkLlxuIik7Ci0JCXdhdGNoX2NsaXBib2FyZCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vY2xpcGJvYXJkIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhd2F0Y2hfY2xpcGJvYXJkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsaW5nIHdhdGNoX2NsaXBib2FyZC5cbiIpOwotCQl3YXRjaF9jbGlwYm9hcmQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJzZXRjbGlwYm9hcmQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHNldF9jbGlwYm9hcmQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyBzZXRfY2xpcGJvYXJkLlxuIik7Ci0JCXNldF9jbGlwYm9hcmQgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NldGNsaXBib2FyZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNldF9jbGlwYm9hcmQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgc2V0X2NsaXBib2FyZC5cbiIpOwotCQlzZXRfY2xpcGJvYXJkID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzZWxkaXIiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJzZWxkaXI6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoc2VsX2RpcmVjdGlvbikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNlbGRpcjoiKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIC1zZWxkaXIgdG8gJXNcbiIsIHApOwotCQlpZiAoc2VsX2RpcmVjdGlvbikgZnJlZShzZWxfZGlyZWN0aW9uKTsKLQkJc2VsX2RpcmVjdGlvbiA9IHN0cmR1cChwKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAic2V0X25vX2N1cnNvciIpKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjYWxsaW5nIHNldF9ub19jdXJzb3IoKVxuIik7Ci0JCXNldF9ub19jdXJzb3IoKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiY3Vyc29yc2hhcGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgY3Vyc29yX3NoYXBlX3VwZGF0ZXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIGN1cnNvcnNoYXBlIG1vZGUuXG4iKTsKLQotCQlzZXRfbm9fY3Vyc29yKCk7Ci0JCWN1cnNvcl9zaGFwZV91cGRhdGVzID0gMTsKLQkJcmVzdG9yZV9jdXJzb3Jfc2hhcGVfdXBkYXRlcyhzY3JlZW4pOwotCQlmaXJzdF9jdXJzb3IoKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9jdXJzb3JzaGFwZSIpKSB7Ci0JCWludCBpLCBtYXggPSA1OwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgIWN1cnNvcl9zaGFwZV91cGRhdGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgY3Vyc29yc2hhcGUgbW9kZS5cbiIpOwotCQkKLQkJc2V0X25vX2N1cnNvcigpOwotCQlmb3IgKGk9MDsgaTxtYXg7IGkrKykgewotCQkJLyogWFhYOiB0cnkgdG8gZm9yY2UgZW1wdHkgY3Vyc29yIGJhY2sgdG8gY2xpZW50ICovCi0JCQlyZmJQRSgtMSk7Ci0JCX0KLQkJY3Vyc29yX3NoYXBlX3VwZGF0ZXMgPSAwOwotCQlkaXNhYmxlX2N1cnNvcl9zaGFwZV91cGRhdGVzKHNjcmVlbik7Ci0JCWZpcnN0X2N1cnNvcigpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJjdXJzb3Jwb3MiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgY3Vyc29yX3Bvc191cGRhdGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiBjdXJzb3Jwb3MgbW9kZS5cbiIpOwotCQljdXJzb3JfcG9zX3VwZGF0ZXMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2N1cnNvcnBvcyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwKLQkJCSAgICAhY3Vyc29yX3Bvc191cGRhdGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgY3Vyc29ycG9zIG1vZGUuXG4iKTsKLQkJY3Vyc29yX3Bvc191cGRhdGVzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiY3Vyc29yX2RyYWciKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGN1cnNvcl9kcmFnX2NoYW5nZXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJY3Vyc29yX2RyYWdfY2hhbmdlcyA9IDE7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBjdXJzb3JfZHJhZ19jaGFuZ2VzOiAlZC5cbiIsIGN1cnNvcl9kcmFnX2NoYW5nZXMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2N1cnNvcl9kcmFnIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhY3Vyc29yX2RyYWdfY2hhbmdlcyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQljdXJzb3JfZHJhZ19jaGFuZ2VzID0gMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIGN1cnNvcl9kcmFnX2NoYW5nZXM6ICVkLlxuIiwgY3Vyc29yX2RyYWdfY2hhbmdlcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiY3Vyc29yIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygiY3Vyc29yOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKG11bHRpcGxlX2N1cnNvcnNfbW9kZSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImN1cnNvcjoiKTsKLQkJaWYgKG11bHRpcGxlX2N1cnNvcnNfbW9kZSkgewotCQkJaWYgKHByZXZfY3Vyc29yc19tb2RlKSBmcmVlKHByZXZfY3Vyc29yc19tb2RlKTsKLQkJCXByZXZfY3Vyc29yc19tb2RlID0gc3RyZHVwKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCQlmcmVlKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCX0KLQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKHApOwotCi0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtY3Vyc29yIG1vZGUgIgotCQkgICAgInRvOiAlc1xuIiwgbXVsdGlwbGVfY3Vyc29yc19tb2RlKTsKLQotCQlpZiAoc3RyY21wKG11bHRpcGxlX2N1cnNvcnNfbW9kZSwgIm5vbmUiKSAmJiAhc2hvd19jdXJzb3IpIHsKLQkJCXNob3dfY3Vyc29yID0gMTsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCBzaG93X2N1cnNvciAiCi0JCQkgICAgInRvOiAlZFxuIiwgc2hvd19jdXJzb3IpOwotCQl9Ci0JCWluaXRpYWxpemVfY3Vyc29yc19tb2RlKCk7Ci0JCWZpcnN0X2N1cnNvcigpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJzaG93X2N1cnNvciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgc2hvd19jdXJzb3IpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyBzaG93X2N1cnNvci5cbiIpOwotCQlzaG93X2N1cnNvciA9IDE7Ci0JCWlmIChtdWx0aXBsZV9jdXJzb3JzX21vZGUgJiYgIXN0cmNtcChtdWx0aXBsZV9jdXJzb3JzX21vZGUsCi0JCSAgICAibm9uZSIpKSB7Ci0JCQlmcmVlKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCQlpZiAocHJldl9jdXJzb3JzX21vZGUpIHsKLQkJCQltdWx0aXBsZV9jdXJzb3JzX21vZGUgPQotCQkJCSAgICBzdHJkdXAocHJldl9jdXJzb3JzX21vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQltdWx0aXBsZV9jdXJzb3JzX21vZGUgPSBzdHJkdXAoImRlZmF1bHQiKTsKLQkJCX0KLQkJCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtY3Vyc29yIG1vZGUgIgotCQkJICAgICJ0bzogJXNcbiIsIG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCX0KLQkJaW5pdGlhbGl6ZV9jdXJzb3JzX21vZGUoKTsKLQkJZmlyc3RfY3Vyc29yKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vc2hvd19jdXJzb3IiKSB8fCAhc3RyY21wKHAsICJub2N1cnNvciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNob3dfY3Vyc29yKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChwcmV2X2N1cnNvcnNfbW9kZSkgZnJlZShwcmV2X2N1cnNvcnNfbW9kZSk7Ci0JCXByZXZfY3Vyc29yc19tb2RlID0gc3RyZHVwKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgc2hvd19jdXJzb3IuXG4iKTsKLQkJc2hvd19jdXJzb3IgPSAwOwotCQlpbml0aWFsaXplX2N1cnNvcnNfbW9kZSgpOwotCQlmaXJzdF9jdXJzb3IoKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJhcnJvdyIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImFycm93OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBhbHRfYXJyb3cpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImFycm93OiIpOwotCQlhbHRfYXJyb3cgPSBhdG9pKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgYWx0X2Fycm93OiAlZC5cbiIsIGFsdF9hcnJvdyk7Ci0JCXNldHVwX2N1cnNvcnNfYW5kX3B1c2goKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAieGZpeGVzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB1c2VfeGZpeGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghIHhmaXhlc19wcmVzZW50KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNhbm5vdCBlbmFibGUgeGZpeGVzICIKLQkJCSAgICAiKG5vdCBzdXBwb3J0ZWQgb24gWCBkaXNwbGF5KVxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAteGZpeGVzIgotCQkgICAgIiAoaWYgc3VwcG9ydGVkKS5cbiIpOwotCQl1c2VfeGZpeGVzID0gMTsKLQkJaW5pdGlhbGl6ZV94Zml4ZXMoKTsKLQkJZmlyc3RfY3Vyc29yKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5veGZpeGVzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdXNlX3hmaXhlcyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoISB4Zml4ZXNfcHJlc2VudCkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxpbmcgeGZpeGVzICAiCi0JCQkgICAgIihidXQgbm90IHN1cHBvcnRlZCBvbiBYIGRpc3BsYXkpXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyAteGZpeGVzLlxuIik7Ci0JCXVzZV94Zml4ZXMgPSAwOwotCQlpbml0aWFsaXplX3hmaXhlcygpOwotCQlmaXJzdF9jdXJzb3IoKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAieGRhbWFnZSIpKSB7Ci0JCWludCBvcmlnID0gdXNlX3hkYW1hZ2U7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgdXNlX3hkYW1hZ2UpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCEgeGRhbWFnZV9wcmVzZW50KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNhbm5vdCBlbmFibGUgeGRhbWFnZSBoaW50cyAiCi0JCQkgICAgIihub3Qgc3VwcG9ydGVkIG9uIFggZGlzcGxheSlcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgeGRhbWFnZSBoaW50cyIKLQkJICAgICIgKGlmIHN1cHBvcnRlZCkuXG4iKTsKLQkJdXNlX3hkYW1hZ2UgPSAxOwotCQlpZiAodXNlX3hkYW1hZ2UgIT0gb3JpZykgewotCQkJaW5pdGlhbGl6ZV94ZGFtYWdlKCk7Ci0JCQljcmVhdGVfeGRhbWFnZV9pZl9uZWVkZWQoMCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm94ZGFtYWdlIikpIHsKLQkJaW50IG9yaWcgPSB1c2VfeGRhbWFnZTsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdXNlX3hkYW1hZ2UpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCEgeGRhbWFnZV9wcmVzZW50KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyB4ZGFtYWdlIGhpbnRzICIKLQkJCSAgICAiKGJ1dCBub3Qgc3VwcG9ydGVkIG9uIFggZGlzcGxheSlcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsaW5nIHhkYW1hZ2UgaGludHMuXG4iKTsKLQkJdXNlX3hkYW1hZ2UgPSAwOwotCQlpZiAodXNlX3hkYW1hZ2UgIT0gb3JpZykgewotCQkJaW5pdGlhbGl6ZV94ZGFtYWdlKCk7Ci0JCQlkZXN0cm95X3hkYW1hZ2VfaWZfbmVlZGVkKCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ4ZF9hcmVhIikgPT0gcCkgewotCQlpbnQgYTsKLQkJQ09MT05fQ0hFQ0soInhkX2FyZWE6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sCi0JCQkgICAgeGRhbWFnZV9tYXhfYXJlYSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigieGRfYXJlYToiKTsKLQkJYSA9IGF0b2kocCk7Ci0JCWlmIChhID49IDApIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyB4ZGFtYWdlX21heF9hcmVhICIKLQkJCSAgICAiJWQgLT4gJWQuXG4iLCB4ZGFtYWdlX21heF9hcmVhLCBhKTsKLQkJCXhkYW1hZ2VfbWF4X2FyZWEgPSBhOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAieGRfbWVtIikgPT0gcCkgewotCQlkb3VibGUgYTsKLQkJQ09MT05fQ0hFQ0soInhkX21lbToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJS4zZiIsIHAsIGNvLAotCQkJICAgIHhkYW1hZ2VfbWVtb3J5KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ4ZF9tZW06Iik7Ci0JCWEgPSBhdG9mKHApOwotCQlpZiAoYSA+PSAwLjApIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyB4ZGFtYWdlX21lbW9yeSAiCi0JCQkgICAgIiUuM2YgLT4gJS4zZi5cbiIsIHhkYW1hZ2VfbWVtb3J5LCBhKTsKLQkJCXhkYW1hZ2VfbWVtb3J5ID0gYTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImFscGhhY3V0IikgPT0gcCkgewotCQlpbnQgYTsKLQkJQ09MT05fQ0hFQ0soImFscGhhY3V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIGFscGhhX3RocmVzaG9sZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiYWxwaGFjdXQ6Iik7Ci0JCWEgPSBhdG9pKHApOwotCQlpZiAoYSA8IDApIGEgPSAwOwotCQlpZiAoYSA+IDI1NikgYSA9IDI1NjsJLyogYWxsb3cgMjU2IGZvciB0ZXN0aW5nLiAqLwotCQlpZiAoYWxwaGFfdGhyZXNob2xkICE9IGEpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBhbHBoYWN1dCAiCi0JCQkgICAgIiVkIC0+ICVkLlxuIiwgYWxwaGFfdGhyZXNob2xkLCBhKTsKLQkJCWlmIChhID09IDI1NikgewotCQkJCXJmYkxvZygibm90ZTogYWxwaGFjdXQ9MjU2IGxlYWRzIHRvIGNvbXBsZXRlbHkiCi0JCQkJICAgICIgdHJhbnNwYXJlbnQgY3Vyc29ycy5cbiIpOwotCQkJfQotCQkJYWxwaGFfdGhyZXNob2xkID0gYTsKLQkJCXNldHVwX2N1cnNvcnNfYW5kX3B1c2goKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImFscGhhZnJhYyIpID09IHApIHsKLQkJZG91YmxlIGE7Ci0JCUNPTE9OX0NIRUNLKCJhbHBoYWZyYWM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVmIiwgcCwgY28sCi0JCQkgICAgYWxwaGFfZnJhYyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiYWxwaGFmcmFjOiIpOwotCQlhID0gYXRvZihwKTsKLQkJaWYgKGEgPCAwLjApIGEgPSAwLjA7Ci0JCWlmIChhID4gMS4wKSBhID0gMS4wOwotCQlpZiAoYWxwaGFfZnJhYyAhPSBhKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgYWxwaGFmcmFjICIKLQkJCSAgICAiJWYgLT4gJWYuXG4iLCBhbHBoYV9mcmFjLCBhKTsKLQkJCWFscGhhX2ZyYWMgPSBhOwotCQkJc2V0dXBfY3Vyc29yc19hbmRfcHVzaCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiYWxwaGFyZW1vdmUiKSA9PSBwKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgYWxwaGFfcmVtb3ZlKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghYWxwaGFfcmVtb3ZlKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsZSBhbHBoYXJlbW92ZVxuIik7Ci0JCQlhbHBoYV9yZW1vdmUgPSAxOwotCQkJc2V0dXBfY3Vyc29yc19hbmRfcHVzaCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAibm9hbHBoYXJlbW92ZSIpID09IHApIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhYWxwaGFfcmVtb3ZlKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChhbHBoYV9yZW1vdmUpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZSBhbHBoYXJlbW92ZVxuIik7Ci0JCQlhbHBoYV9yZW1vdmUgPSAwOwotCQkJc2V0dXBfY3Vyc29yc19hbmRfcHVzaCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiYWxwaGFibGVuZCIpID09IHApIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBhbHBoYV9ibGVuZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIWFscGhhX2JsZW5kKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsZSBhbHBoYWJsZW5kXG4iKTsKLQkJCWFscGhhX3JlbW92ZSA9IDA7Ci0JCQlhbHBoYV9ibGVuZCA9IDE7Ci0JCQlzZXR1cF9jdXJzb3JzX2FuZF9wdXNoKCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJub2FscGhhYmxlbmQiKSA9PSBwKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWFscGhhX2JsZW5kKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChhbHBoYV9ibGVuZCkgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIGFscGhhYmxlbmRcbiIpOwotCQkJYWxwaGFfYmxlbmQgPSAwOwotCQkJc2V0dXBfY3Vyc29yc19hbmRfcHVzaCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAieHdhcnBwb2ludGVyIikgPT0gcCB8fCBzdHJzdHIocCwgInh3YXJwIikgPT0gcCkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHVzZV94d2FycHBvaW50ZXIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIHh3YXJwcG9pbnRlciBtb2RlLlxuIik7Ci0JCXVzZV94d2FycHBvaW50ZXIgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIm5veHdhcnBwb2ludGVyIikgPT0gcCB8fAotCQkgICAgc3Ryc3RyKHAsICJub3h3YXJwIikgPT0gcCkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF1c2VfeHdhcnBwb2ludGVyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgeHdhcnBwb2ludGVyIG1vZGUuXG4iKTsKLQkJdXNlX3h3YXJwcG9pbnRlciA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiYWx3YXlzX2luamVjdCIpID09IHApIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBhbHdheXNfaW5qZWN0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiBhbHdheXNfaW5qZWN0IG1vZGUuXG4iKTsKLQkJYWx3YXlzX2luamVjdCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAibm9hbHdheXNfaW5qZWN0IikgPT0gcCkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFhbHdheXNfaW5qZWN0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgYWx3YXlzX2luamVjdCBtb2RlLlxuIik7Ci0JCWFsd2F5c19pbmplY3QgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImJ1dHRvbm1hcCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImJ1dHRvbm1hcDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTChwb2ludGVyX3JlbWFwKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiYnV0dG9ubWFwOiIpOwotCQlpZiAocG9pbnRlcl9yZW1hcCkgZnJlZShwb2ludGVyX3JlbWFwKTsKLQkJcG9pbnRlcl9yZW1hcCA9IHN0cmR1cChwKTsKLQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgLWJ1dHRvbm1hcCB0bzpcblx0JyVzJ1xuIiwgcCk7Ci0JCWluaXRpYWxpemVfcG9pbnRlcl9tYXAocCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRyYWdnaW5nIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBzaG93X2RyYWdnaW5nKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgbW91c2UgZHJhZ2dpbmcgbW9kZS5cbiIpOwotCQlzaG93X2RyYWdnaW5nID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9kcmFnZ2luZyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXNob3dfZHJhZ2dpbmcpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyBtb3VzZSBub2RyYWdnaW5nIG1vZGUuXG4iKTsKLQkJc2hvd19kcmFnZ2luZyA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0jaWZuZGVmIE5PX05DQUNIRQotCWlmICghc3RyY21wKHAsICJuY2FjaGVfY3IiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG5jYWNoZV9jb3B5cmVjdCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQluY2FjaGVfY29weXJlY3QgPSAxOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldCAtbmNhY2hlX2NyICVkXG4iLCBuY2FjaGVfY29weXJlY3QpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub25jYWNoZV9jciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW5jYWNoZV9jb3B5cmVjdCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQluY2FjaGVfY29weXJlY3QgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGVkIC1uY2FjaGVfY3IgJWRcbiIsIG5jYWNoZV9jb3B5cmVjdCk7Ci0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibmNhY2hlX25vX21vdmVyYWlzZSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW5jYWNoZV93Zl9yYWlzZXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJbmNhY2hlX3dmX3JhaXNlcyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0IC1uY2FjaGVfbm9fbW92ZXJhaXNlXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9uY2FjaGVfbm9fbW92ZXJhaXNlIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBuY2FjaGVfd2ZfcmFpc2VzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZV93Zl9yYWlzZXMgPSAxOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGVkIC1uY2FjaGVfbm9fbW92ZXJhaXNlXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibmNhY2hlX25vX2R0Y2hhbmdlIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhbmNhY2hlX2R0X2NoYW5nZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQluY2FjaGVfZHRfY2hhbmdlID0gMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgLW5jYWNoZV9ub19kdF9jaGFuZ2VcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub25jYWNoZV9ub19kdGNoYW5nZSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbmNhY2hlX2R0X2NoYW5nZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQluY2FjaGVfZHRfY2hhbmdlID0gMTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlZCAtbmNhY2hlX25vX2R0X2NoYW5nZVxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5jYWNoZV9ub19yb290cGl4bWFwIikpIHsKLQkJaW50IG9yaWcgPSBuY2FjaGVfeHJvb3RwbWFwOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFuY2FjaGVfeHJvb3RwbWFwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZV94cm9vdHBtYXAgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldCAtbmNhY2hlX25vX3Jvb3RwaXhtYXBcbiIpOwotCQlpZiAob3JpZyAhPSBuY2FjaGVfeHJvb3RwbWFwKSB7Ci0JCQlkb19uZXdfZmIoMSk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9uY2FjaGVfbm9fcm9vdHBpeG1hcCIpKSB7Ci0JCWludCBvcmlnID0gbmNhY2hlX3hyb290cG1hcDsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBuY2FjaGVfeHJvb3RwbWFwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZV94cm9vdHBtYXAgPSAxOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGVkIC1uY2FjaGVfbm9fcm9vdHBpeG1hcFxuIik7Ci0JCWlmIChvcmlnICE9IG5jYWNoZV94cm9vdHBtYXApIHsKLQkJCWRvX25ld19mYigxKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJuY2FjaGVfcmVzZXRfcm9vdHBpeG1hcCIpIHx8ICFzdHJjbXAocCwgIm5jcnAiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFuY2FjaGVfeHJvb3RwbWFwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChuY2FjaGVfeHJvb3RwbWFwKSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHJlc2V0dGluZyByb290IHBpeG1hcC5cbiIpOwotCQkJc2V0X25jYWNoZV94cm9vdHBtYXAoKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJuY2FjaGVfa2VlcF9hbmltcyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbmNhY2hlX2tlZXBfYW5pbXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJa2RlX25vX2FuaW1hdGUoMCk7Ci0JCW5jYWNoZV9rZWVwX2FuaW1zID0gMTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgLW5jYWNoZV9rZWVwX2FuaW1zXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9uY2FjaGVfa2VlcF9hbmltcyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW5jYWNoZV9rZWVwX2FuaW1zKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZV9rZWVwX2FuaW1zID0gMDsKLQkJa2RlX25vX2FuaW1hdGUoMSk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZWQgLW5jYWNoZV9rZWVwX2FuaW1zXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibmNhY2hlX29sZF93bSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbmNhY2hlX29sZF93bSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQluY2FjaGVfb2xkX3dtID0gMTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXQgLW5jYWNoZV9vbGRfd21cbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub25jYWNoZV9vbGRfd20iKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFuY2FjaGVfb2xkX3dtKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZV9vbGRfd20gPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGVkIC1uY2FjaGVfb2xkX3dtXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJuY2FjaGVfcGFkIikgPT0gcCkgewotCQlpbnQgb3JpZyA9IG5jYWNoZV9wYWQsIG47Ci0JCUNPTE9OX0NIRUNLKCJuY2FjaGVfcGFkOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBuY2FjaGVfcGFkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJuY2FjaGVfcGFkOiIpOwotCQluID0gYXRvaShwKTsKLQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgbmNhY2hlX3BhZCAlZCB0bzogJWRcbiIsIG9yaWcsIG4pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJuY2FjaGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICEhbmNhY2hlKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5jYWNoZSA9IG5jYWNoZTA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0IG5jYWNoZSAlZFxuIiwgbmNhY2hlKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9uY2FjaGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFuY2FjaGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJbmNhY2hlID0gMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlZCBuY2FjaGUgJWRcbiIsIG5jYWNoZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAibmNhY2hlX3NpemUiKSA9PSBwKSB7Ci0JCWludCBvcmlnID0gbmNhY2hlLCBuOwotCQlDT0xPTl9DSEVDSygibmNhY2hlX3NpemU6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIG5jYWNoZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigibmNhY2hlX3NpemU6Iik7Ci0JCW4gPSBhdG9pKHApOwotCi0JCWlmIChuID49IDAgJiYgbiAhPSBuY2FjaGUpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBuY2FjaGUgJWQgdG86ICVkXG4iLCBvcmlnLCBuY2FjaGUpOwotCQkJbmNhY2hlID0gbjsKLQkJCWRvX25ld19mYigxKTsKLQkJCWlmIChjbGllbnRfY291bnQpIHsKLQkJCQljaGVja19uY2FjaGUoMSwwKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJkZWJ1Z19uY2FjaGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG5jZGIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJbmNkYiA9IDE7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxlZCBkZWJ1Z19uY2FjaGVcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlYnVnX25jYWNoZSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW5jZGIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJbmNkYiA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZWQgZGVidWdfbmNhY2hlXG4iKTsKLQkJZ290byBkb25lOwotCX0KLSNlbmRpZgotCWlmIChzdHJzdHIocCwgIndpcmVmcmFtZV9tb2RlIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygid2lyZWZyYW1lX21vZGU6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgd2lyZWZyYW1lX3N0ciA/IHdpcmVmcmFtZV9zdHIgOiBXSVJFRlJBTUVfUEFSTVMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oIndpcmVmcmFtZV9tb2RlOiIpOwotCQlpZiAoKnApIHsKLQkJCWlmICh3aXJlZnJhbWVfc3RyKSB7Ci0JCQkJZnJlZSh3aXJlZnJhbWVfc3RyKTsKLQkJCX0KLQkJCXdpcmVmcmFtZV9zdHIgPSBzdHJkdXAocCk7Ci0JCQlwYXJzZV93aXJlZnJhbWUoKTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC13aXJlZnJhbWUgbW9kZS5cbiIpOwotCQl3aXJlZnJhbWUgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIndpcmVmcmFtZToiKSA9PSBwKSB7CS8qIHNraXAtY21kLWxpc3QgKi8KLQkJQ09MT05fQ0hFQ0soIndpcmVmcmFtZToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgd2lyZWZyYW1lKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ3aXJlZnJhbWU6Iik7Ci0JCWlmICgqcCkgewotCQkJaWYgKHdpcmVmcmFtZV9zdHIpIHsKLQkJCQlmcmVlKHdpcmVmcmFtZV9zdHIpOwotCQkJfQotCQkJd2lyZWZyYW1lX3N0ciA9IHN0cmR1cChwKTsKLQkJCXBhcnNlX3dpcmVmcmFtZSgpOwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLXdpcmVmcmFtZSBtb2RlLlxuIik7Ci0JCXdpcmVmcmFtZSA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAid2Y6IikgPT0gcCkgewkvKiBza2lwLWNtZC1saXN0ICovCi0JCUNPTE9OX0NIRUNLKCJ3ZjoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgd2lyZWZyYW1lKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ3ZjoiKTsKLQkJaWYgKCpwKSB7Ci0JCQlpZiAod2lyZWZyYW1lX3N0cikgewotCQkJCWZyZWUod2lyZWZyYW1lX3N0cik7Ci0JCQl9Ci0JCQl3aXJlZnJhbWVfc3RyID0gc3RyZHVwKHApOwotCQkJcGFyc2Vfd2lyZWZyYW1lKCk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtd2lyZWZyYW1lIG1vZGUuXG4iKTsKLQkJd2lyZWZyYW1lID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAid2lyZWZyYW1lIikgfHwgIXN0cmNtcChwLCAid2YiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHdpcmVmcmFtZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIC13aXJlZnJhbWUgbW9kZS5cbiIpOwotCQl3aXJlZnJhbWUgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3dpcmVmcmFtZSIpIHx8ICFzdHJjbXAocCwgIm5vd2YiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF3aXJlZnJhbWUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGluZyAtbm93aXJlZnJhbWUgbW9kZS5cbiIpOwotCQl3aXJlZnJhbWUgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ3aXJlZnJhbWVsb2NhbCIpIHx8ICFzdHJjbXAocCwgIndmbCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgd2lyZWZyYW1lX2xvY2FsKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLXdpcmVmcmFtZWxvY2FsIG1vZGUuXG4iKTsKLQkJd2lyZWZyYW1lX2xvY2FsID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm93aXJlZnJhbWVsb2NhbCIpIHx8ICFzdHJjbXAocCwgIm5vd2ZsIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhd2lyZWZyYW1lX2xvY2FsKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxpbmcgLW5vd2lyZWZyYW1lbG9jYWwgbW9kZS5cbiIpOwotCQl3aXJlZnJhbWVfbG9jYWwgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIndpcmVjb3B5cmVjdCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soIndpcmVjb3B5cmVjdDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTCh3aXJlZnJhbWVfY29weXJlY3QpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ3aXJlY29weXJlY3Q6Iik7Ci0KLQkJc2V0X3dpcmVjb3B5cmVjdF9tb2RlKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNoYW5nZWQgLXdpcmVjb3B5cmVjdCBtb2RlICIKLQkJICAgICJ0bzogJXNcbiIsIE5PTlVMKHdpcmVmcmFtZV9jb3B5cmVjdCkpOwotCQlnb3Rfd2lyZWNvcHlyZWN0ID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ3Y3IiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJ3Y3I6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwod2lyZWZyYW1lX2NvcHlyZWN0KSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigid2NyOiIpOwotCi0JCXNldF93aXJlY29weXJlY3RfbW9kZShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjaGFuZ2VkIC13aXJlY29weXJlY3QgbW9kZSAiCi0JCSAgICAidG86ICVzXG4iLCBOT05VTCh3aXJlZnJhbWVfY29weXJlY3QpKTsKLQkJZ290X3dpcmVjb3B5cmVjdCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vd2lyZWNvcHlyZWN0IikgfHwgIXN0cmNtcChwLCAibm93Y3IiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolcyIsIHAsCi0JCQkgICAgTk9OVUwod2lyZWZyYW1lX2NvcHlyZWN0KSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCi0JCXNldF93aXJlY29weXJlY3RfbW9kZSgibmV2ZXIiKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjaGFuZ2VkIC13aXJlY29weXJlY3QgbW9kZSAiCi0JCSAgICAidG86ICVzXG4iLCBOT05VTCh3aXJlZnJhbWVfY29weXJlY3QpKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzY3JfYXJlYSIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInNjcl9hcmVhOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIHNjcm9sbGNvcHlyZWN0X21pbl9hcmVhKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJzY3JfYXJlYToiKTsKLQotCQlzY3JvbGxjb3B5cmVjdF9taW5fYXJlYSA9IGF0b2kocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtc2NyX2FyZWEgdG86ICVkXG4iLAotCQkgICAgc2Nyb2xsY29weXJlY3RfbWluX2FyZWEpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNjcl9za2lwIikgPT0gcCkgewotCQljaGFyICpzID0gc2Nyb2xsX3NraXBfc3RyOwotCQlDT0xPTl9DSEVDSygic2NyX3NraXA6IikKLQkJaWYgKCFzIHx8ICpzID09ICdcMCcpIHMgPSBzY3JvbGxfc2tpcF9zdHIwOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywgTk9OVUwocykpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNjcl9za2lwOiIpOwotCQlpZiAoc2Nyb2xsX3NraXBfc3RyKSB7Ci0JCQlmcmVlKHNjcm9sbF9za2lwX3N0cik7Ci0JCX0KLQotCQlzY3JvbGxfc2tpcF9zdHIgPSBzdHJkdXAocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtc2NyX3NraXAgdG86ICVzXG4iLAotCQkgICAgc2Nyb2xsX3NraXBfc3RyKTsKLQkJaW5pdGlhbGl6ZV9zY3JvbGxfbWF0Y2hlcygpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNjcl9pbmMiKSA9PSBwKSB7Ci0JCWNoYXIgKnMgPSBzY3JvbGxfZ29vZF9zdHI7Ci0JCWlmICghcyB8fCAqcyA9PSAnXDAnKSBzID0gc2Nyb2xsX2dvb2Rfc3RyMDsKLQkJQ09MT05fQ0hFQ0soInNjcl9pbmM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sIE5PTlVMKHMpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJzY3JfaW5jOiIpOwotCQlpZiAoc2Nyb2xsX2dvb2Rfc3RyKSB7Ci0JCQlmcmVlKHNjcm9sbF9nb29kX3N0cik7Ci0JCX0KLQotCQlzY3JvbGxfZ29vZF9zdHIgPSBzdHJkdXAocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtc2NyX2luYyB0bzogJXNcbiIsCi0JCSAgICBzY3JvbGxfZ29vZF9zdHIpOwotCQlpbml0aWFsaXplX3Njcm9sbF9tYXRjaGVzKCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAic2NyX2tleXMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJzY3Jfa2V5czoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywKLQkJCSAgICBOT05VTChzY3JvbGxfa2V5X2xpc3Rfc3RyKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2NyX2tleXM6Iik7Ci0JCWlmIChzY3JvbGxfa2V5X2xpc3Rfc3RyKSB7Ci0JCQlmcmVlKHNjcm9sbF9rZXlfbGlzdF9zdHIpOwotCQl9Ci0KLQkJc2Nyb2xsX2tleV9saXN0X3N0ciA9IHN0cmR1cChwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjaGFuZ2VkIC1zY3Jfa2V5cyB0bzogJXNcbiIsCi0JCSAgICBzY3JvbGxfa2V5X2xpc3Rfc3RyKTsKLQkJaW5pdGlhbGl6ZV9zY3JvbGxfa2V5cygpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNjcl90ZXJtIikgPT0gcCkgewotCQljaGFyICpzID0gc2Nyb2xsX3Rlcm1fc3RyOwotCQlpZiAoIXMgfHwgKnMgPT0gJ1wwJykgcyA9IHNjcm9sbF90ZXJtX3N0cjA7Ci0JCUNPTE9OX0NIRUNLKCJzY3JfdGVybToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJXMiLCBwLCBjbywgTk9OVUwocykpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNjcl90ZXJtOiIpOwotCQlpZiAoc2Nyb2xsX3Rlcm1fc3RyKSB7Ci0JCQlmcmVlKHNjcm9sbF90ZXJtX3N0cik7Ci0JCX0KLQotCQlzY3JvbGxfdGVybV9zdHIgPSBzdHJkdXAocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtc2NyX3Rlcm0gdG86ICVzXG4iLAotCQkgICAgc2Nyb2xsX3Rlcm1fc3RyKTsKLQkJaW5pdGlhbGl6ZV9zY3JvbGxfdGVybSgpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNjcl9rZXlyZXBlYXQiKSA9PSBwKSB7Ci0JCWNoYXIgKnMgPSBtYXhfa2V5cmVwZWF0X3N0cjsKLQkJaWYgKCFzIHx8ICpzID09ICdcMCcpIHMgPSBtYXhfa2V5cmVwZWF0X3N0cjA7Ci0JCUNPTE9OX0NIRUNLKCJzY3Jfa2V5cmVwZWF0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLCBOT05VTChzKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2NyX2tleXJlcGVhdDoiKTsKLQkJaWYgKG1heF9rZXlyZXBlYXRfc3RyKSB7Ci0JCQlmcmVlKG1heF9rZXlyZXBlYXRfc3RyKTsKLQkJfQotCi0JCW1heF9rZXlyZXBlYXRfc3RyID0gc3RyZHVwKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNoYW5nZWQgLXNjcl9rZXlyZXBlYXQgdG86ICVzXG4iLAotCQkgICAgbWF4X2tleXJlcGVhdF9zdHIpOwotCQlpbml0aWFsaXplX21heF9rZXlyZXBlYXQoKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzY3JfcGFybXMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJzY3JfcGFybXM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgc2Nyb2xsX2NvcHlyZWN0X3N0ciA/IHNjcm9sbF9jb3B5cmVjdF9zdHIKLQkJCSAgICA6IFNDUk9MTF9DT1BZUkVDVF9QQVJNUyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2NyX3Bhcm1zOiIpOwotCQlpZiAoKnApIHsKLQkJCWlmIChzY3JvbGxfY29weXJlY3Rfc3RyKSB7Ci0JCQkJZnJlZShzY3JvbGxfY29weXJlY3Rfc3RyKTsKLQkJCX0KLQkJCXNldF9zY3JvbGxjb3B5cmVjdF9tb2RlKCJhbHdheXMiKTsKLQkJCXNjcm9sbF9jb3B5cmVjdF9zdHIgPSBzdHJkdXAocCk7Ci0JCQlwYXJzZV9zY3JvbGxfY29weXJlY3QoKTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldCAtc2NyX3Bhcm1zICVzLlxuIiwKLQkJICAgIE5PTlVMKHNjcm9sbF9jb3B5cmVjdF9zdHIpKTsKLQkJZ290X3Njcm9sbGNvcHlyZWN0ID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzY3JvbGxjb3B5cmVjdCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInNjcm9sbGNvcHlyZWN0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNjcm9sbF9jb3B5cmVjdCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNjcm9sbGNvcHlyZWN0OiIpOwotCi0JCXNldF9zY3JvbGxjb3B5cmVjdF9tb2RlKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNoYW5nZWQgLXNjcm9sbGNvcHlyZWN0IG1vZGUgIgotCQkgICAgInRvOiAlc1xuIiwgTk9OVUwoc2Nyb2xsX2NvcHlyZWN0KSk7Ci0JCWdvdF9zY3JvbGxjb3B5cmVjdCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNjciIpIHx8Ci0JICAgIHN0cnN0cihwLCAic2NyOiIpID09IHApIHsJLyogc2tpcC1jbWQtbGlzdCAqLwotCQlDT0xPTl9DSEVDSygic2NyOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNjcm9sbF9jb3B5cmVjdCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNjcjoiKTsKLQotCQlzZXRfc2Nyb2xsY29weXJlY3RfbW9kZShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBjaGFuZ2VkIC1zY3JvbGxjb3B5cmVjdCBtb2RlICIKLQkJICAgICJ0bzogJXNcbiIsIE5PTlVMKHNjcm9sbF9jb3B5cmVjdCkpOwotCQlnb3Rfc2Nyb2xsY29weXJlY3QgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3Njcm9sbGNvcHlyZWN0IikgfHwgIXN0cmNtcChwLCAibm9zY3IiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolcyIsIHAsCi0JCQkgICAgTk9OVUwoc2Nyb2xsX2NvcHlyZWN0KSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCi0JCXNldF9zY3JvbGxjb3B5cmVjdF9tb2RlKCJuZXZlciIpOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGNoYW5nZWQgLXNjcm9sbGNvcHlyZWN0IG1vZGUgIgotCQkgICAgInRvOiAlc1xuIiwgTk9OVUwoc2Nyb2xsX2NvcHlyZWN0KSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZml4c2NyZWVuIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygiZml4c2NyZWVuOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHNjcmVlbl9maXh1cF9zdHIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJmaXhzY3JlZW46Iik7Ci0JCWlmIChzY3JlZW5fZml4dXBfc3RyKSB7Ci0JCQlmcmVlKHNjcmVlbl9maXh1cF9zdHIpOwotCQl9Ci0JCXNjcmVlbl9maXh1cF9zdHIgPSBzdHJkdXAocCk7Ci0JCXBhcnNlX2ZpeHNjcmVlbigpOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldCAtZml4c2NyZWVuICVzLlxuIiwKLQkJICAgIE5PTlVMKHNjcmVlbl9maXh1cF9zdHIpKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm94cmVjb3JkIikpIHsKLQkJaW50IG9yaWcgPSBub3hyZWNvcmQ7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbm94cmVjb3JkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5veHJlY29yZCA9IDE7Ci0JCXJmYkxvZygic2V0IG5veHJlY29yZCB0bzogJWRcbiIsIG5veHJlY29yZCk7Ci0JCWlmIChvcmlnICE9IG5veHJlY29yZCkgewotCQkJc2h1dGRvd25feHJlY29yZCgpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInhyZWNvcmQiKSkgewotCQlpbnQgb3JpZyA9IG5veHJlY29yZDsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhbm94cmVjb3JkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCW5veHJlY29yZCA9IDA7Ci0JCXJmYkxvZygic2V0IG5veHJlY29yZCB0bzogJWRcbiIsIG5veHJlY29yZCk7Ci0JCWlmIChvcmlnICE9IG5veHJlY29yZCkgewotCQkJaW5pdGlhbGl6ZV94cmVjb3JkKCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAicmVzZXRfcmVjb3JkIikpIHsKLQkJTk9UQVBQCi0JCWlmICh1c2VfeHJlY29yZCkgewotCQkJcmZiTG9nKCJyZXNldHRpbmcgUkVDT1JEXG4iKTsKLQkJCWNoZWNrX3hyZWNvcmRfcmVzZXQoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIlJFQ09SRCBpcyBkaXNhYmxlZCwgbm90IHJlc2V0dGluZy5cbiIpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAicG9pbnRlcl9tb2RlIikgPT0gcCkgewotCQlpbnQgcG07Ci0JCUNPTE9OX0NIRUNLKCJwb2ludGVyX21vZGU6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHBvaW50ZXJfbW9kZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigicG9pbnRlcl9tb2RlOiIpOwotCQlwbSA9IGF0b2kocCk7Ci0JCWlmIChwbSA8IDAgfHwgcG0gPiBwb2ludGVyX21vZGVfbWF4KSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHBvaW50ZXJfbW9kZSBvdXQgb2YgcmFuZ2U6IgotCQkJICAgIiAxLSVkOiAlZFxuIiwgcG9pbnRlcl9tb2RlX21heCwgcG0pOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHBvaW50ZXJfbW9kZSAlZFxuIiwgcG0pOwotCQkJcG9pbnRlcl9tb2RlID0gcG07Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJwbSIpID09IHApIHsKLQkJaW50IHBtOwotCQlDT0xPTl9DSEVDSygicG06IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHBvaW50ZXJfbW9kZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigicG06Iik7Ci0JCXBtID0gYXRvaShwKTsKLQkJaWYgKHBtIDwgMCB8fCBwbSA+IHBvaW50ZXJfbW9kZV9tYXgpIHsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogcG9pbnRlcl9tb2RlIG91dCBvZiByYW5nZToiCi0JCQkgICAiIDEtJWQ6ICVkXG4iLCBwb2ludGVyX21vZGVfbWF4LCBwbSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgcG9pbnRlcl9tb2RlICVkXG4iLCBwbSk7Ci0JCQlwb2ludGVyX21vZGUgPSBwbTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImlucHV0X3NraXAiKSA9PSBwKSB7Ci0JCWludCBpczsKLQkJQ09MT05fQ0hFQ0soImlucHV0X3NraXA6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHVpX3NraXApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImlucHV0X3NraXA6Iik7Ci0JCWlzID0gYXRvaShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIGlucHV0X3NraXAgJWRcbiIsIGlzKTsKLQkJdWlfc2tpcCA9IGlzOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJhbGxpbnB1dCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgYWxsX2lucHV0KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWFsbF9pbnB1dCA9IDE7Ci0JCXJmYkxvZygiZW5hYmxlZCBhbGxpbnB1dFxuIik7Ci0JCWlmIChoYW5kbGVfZXZlbnRzX2VhZ2VybHkpIHsKLQkJCXJmYkxvZygiZGlzYWJsZWQgaW5wdXRfZWFnZXJseVxuIik7Ci0JCQloYW5kbGVfZXZlbnRzX2VhZ2VybHkgPSAwOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vYWxsaW5wdXQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFhbGxfaW5wdXQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJYWxsX2lucHV0ID0gMDsKLQkJcmZiTG9nKCJkaXNhYmxlZCBhbGxpbnB1dFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImlucHV0X2VhZ2VybHkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGhhbmRsZV9ldmVudHNfZWFnZXJseSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQloYW5kbGVfZXZlbnRzX2VhZ2VybHkgPSAxOwotCQlyZmJMb2coImVuYWJsZWQgaW5wdXRfZWFnZXJseVxuIik7Ci0JCWlmIChhbGxfaW5wdXQpIHsKLQkJCXJmYkxvZygiZGlzYWJsZWQgYWxsaW5wdXRcbiIpOwotCQkJYWxsX2lucHV0ID0gMDsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2lucHV0X2VhZ2VybHkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFoYW5kbGVfZXZlbnRzX2VhZ2VybHkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaGFuZGxlX2V2ZW50c19lYWdlcmx5ID0gMDsKLQkJcmZiTG9nKCJkaXNhYmxlZCBpbnB1dF9lYWdlcmx5XG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJpbnB1dCIpID09IHApIHsKLQkJaW50IGRvaXQgPSAxOwotCQlDT0xPTl9DSEVDSygiaW5wdXQ6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoYWxsb3dlZF9pbnB1dF9zdHIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJpbnB1dDoiKTsKLQkJaWYgKGFsbG93ZWRfaW5wdXRfc3RyICYmICFzdHJjbXAocCwgYWxsb3dlZF9pbnB1dF9zdHIpKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCWRvaXQgPSAwOwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBpbnB1dCAlc1xuIiwgcCk7Ci0JCWlmIChhbGxvd2VkX2lucHV0X3N0cikgZnJlZShhbGxvd2VkX2lucHV0X3N0cik7Ci0JCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQlhbGxvd2VkX2lucHV0X3N0ciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlhbGxvd2VkX2lucHV0X3N0ciA9IHN0cmR1cChwKTsKLQkJfQotCQlpZiAoZG9pdCkgewotCQkJaW5pdGlhbGl6ZV9hbGxvd2VkX2lucHV0KCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZ3JhYmtiZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZ3JhYl9rYmQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZ3JhYl9rYmQgPSAxOwotCQlpZiAoZ3JhYl9hbHdheXMpIHsKLQkJCWFkanVzdF9ncmFicygxLCAwKTsKLQkJfQotCQlyZmJMb2coImVuYWJsZWQgZ3JhYl9rYmRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2dyYWJrYmQiKSkgewotCQlpbnQgb3JpZyA9IGdyYWJfa2JkOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFncmFiX2tiZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlncmFiX2tiZCA9IDA7Ci0JCWlmIChvcmlnICYmIGRweSkgewotI2lmICFOT19YMTEKLQkJCVhfTE9DSzsKLQkJCVhVbmdyYWJLZXlib2FyZChkcHksIEN1cnJlbnRUaW1lKTsKLQkJCVhfVU5MT0NLOwotI2VuZGlmCi0JCX0KLQkJcmZiTG9nKCJkaXNhYmxlZCBncmFiX2tiZFxuIik7Ci0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZ3JhYnB0ciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZ3JhYl9wdHIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZ3JhYl9wdHIgPSAxOwotCQlpZiAoZ3JhYl9hbHdheXMpIHsKLQkJCWFkanVzdF9ncmFicygxLCAwKTsKLQkJfQotCQlyZmJMb2coImVuYWJsZWQgZ3JhYl9wdHJcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ1bmdyYWJib3RoIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB1bmdyYWJfYm90aCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQl1bmdyYWJfYm90aCA9IDE7Ci0JCXJmYkxvZygiZW5hYmxlZCB1bmdyYWJfYm90aFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vdW5ncmFiYm90aCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXVuZ3JhYl9ib3RoKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXVuZ3JhYl9ib3RoID0gMDsKLQkJcmZiTG9nKCJkaXNhYmxlZCB1bmdyYWJfYm90aFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZ3JhYnB0ciIpKSB7Ci0JCWludCBvcmlnID0gZ3JhYl9wdHI7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWdyYWJfcHRyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWdyYWJfcHRyID0gMDsKLQkJaWYgKG9yaWcgJiYgZHB5KSB7Ci0jaWYgIU5PX1gxMQotCQkJWF9MT0NLOwotCQkJWFVuZ3JhYlBvaW50ZXIoZHB5LCBDdXJyZW50VGltZSk7Ci0JCQlYX1VOTE9DSzsKLSNlbmRpZgotCQl9Ci0JCXJmYkxvZygiZGlzYWJsZWQgZ3JhYl9wdHJcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJncmFiYWx3YXlzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBncmFiX2Fsd2F5cyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlncmFiX3B0ciA9IDE7Ci0JCWdyYWJfa2JkID0gMTsKLQkJZ3JhYl9hbHdheXMgPSAxOwotCQlhZGp1c3RfZ3JhYnMoMSwgMCk7Ci0JCXJmYkxvZygiZW5hYmxlZCBncmFiX2Fsd2F5c1xuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZ3JhYmFsd2F5cyIpKSB7Ci0JCWludCBvcmlnID0gZ3JhYl9hbHdheXM7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWdyYWJfYWx3YXlzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWdyYWJfcHRyID0gMDsKLQkJZ3JhYl9rYmQgPSAwOwotCQlncmFiX2Fsd2F5cyA9IDA7Ci0JCWlmIChvcmlnICYmIGRweSkgewotI2lmICFOT19YMTEKLQkJCVhfTE9DSzsKLQkJCVhVbmdyYWJLZXlib2FyZChkcHksIEN1cnJlbnRUaW1lKTsKLQkJCVhVbmdyYWJQb2ludGVyKGRweSwgQ3VycmVudFRpbWUpOwotCQkJWF9VTkxPQ0s7Ci0jZW5kaWYKLQkJfQotCQlhZGp1c3RfZ3JhYnMoMCwgMCk7Ci0JCXJmYkxvZygiZGlzYWJsZWQgZ3JhYl9hbHdheXNcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImdyYWJsb2NhbCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImdyYWJsb2NhbDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywKLQkJCSAgICBncmFiX2xvY2FsKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJncmFibG9jYWw6Iik7Ci0KLQkJZ3JhYl9sb2NhbCA9IGF0b2kocCk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCAtZ3JhYmxvY2FsIHRvOiAlZFxuIiwKLQkJICAgIGdyYWJfbG9jYWwpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImNsaWVudF9pbnB1dCIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJjbGllbnRfaW5wdXQ6IikKLQkJcCArPSBzdHJsZW4oImNsaWVudF9pbnB1dDoiKTsKLQkJc2V0X2NsaWVudF9pbnB1dChwKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzc2x0aW1lb3V0IikgPT0gcCkgewotCQlpbnQgaXM7Ci0JCUNPTE9OX0NIRUNLKCJzc2x0aW1lb3V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIHNzbF90aW1lb3V0X3NlY3MpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNzbHRpbWVvdXQ6Iik7Ci0JCWlzID0gYXRvaShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHNzbHRpbWVvdXQ6ICVkXG4iLCBpcyk7Ci0JCXNzbF90aW1lb3V0X3NlY3MgPSBpczsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzcGVlZHMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJzcGVlZHM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoc3BlZWRzX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNwZWVkczoiKTsKLQkJaWYgKHNwZWVkc19zdHIpIGZyZWUoc3BlZWRzX3N0cik7Ci0JCXNwZWVkc19zdHIgPSBzdHJkdXAocCk7Ci0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIC1zcGVlZHMgdG86XG5cdCclcydcbiIsIHApOwotCQlpbml0aWFsaXplX3NwZWVkcygpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIndtZHQiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJ3bWR0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHdtZHRfc3RyKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigid21kdDoiKTsKLQkJaWYgKHdtZHRfc3RyKSBmcmVlKHdtZHRfc3RyKTsKLQkJd21kdF9zdHIgPSBzdHJkdXAocCk7Ci0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIC13bWR0IHRvOiAlc1xuIiwgcCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRlYnVnX3BvaW50ZXIiKSB8fCAhc3RyY21wKHAsICJkcCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZGVidWdfcG9pbnRlcik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gZGVidWdfcG9pbnRlci5cbiIpOwotCQlkZWJ1Z19wb2ludGVyID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9kZWJ1Z19wb2ludGVyIikgfHwgIXN0cmNtcChwLCAibm9kcCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWRlYnVnX3BvaW50ZXIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiBkZWJ1Z19wb2ludGVyLlxuIik7Ci0JCWRlYnVnX3BvaW50ZXIgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJkZWJ1Z19rZXlib2FyZCIpIHx8ICFzdHJjbXAocCwgImRrIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBkZWJ1Z19rZXlib2FyZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gZGVidWdfa2V5Ym9hcmQuXG4iKTsKLQkJZGVidWdfa2V5Ym9hcmQgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlYnVnX2tleWJvYXJkIikgfHwgIXN0cmNtcChwLCAibm9kayIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWRlYnVnX2tleWJvYXJkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgZGVidWdfa2V5Ym9hcmQuXG4iKTsKLQkJZGVidWdfa2V5Ym9hcmQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImtleWNvZGUiKSA9PSBwKSB7Ci0JCWludCBrYywgZG93biA9IC0xOwotCQljaGFyICpjOwotCQlOT1RBUFAKLQkJQ09MT05fQ0hFQ0soImtleWNvZGU6IikKLQkJcCArPSBzdHJsZW4oImtleWNvZGU6Iik7Ci0JCWtjID0gYXRvaShwKTsKLQkJaWYgKGtjIDwgMCkga2MgPSAwOwotCQlrYyA9IGtjICUgMjU2OwotCQljID0gc3RyY2hyKHAsICcsJyk7Ci0JCWlmIChjKSBkb3duID0gYXRvaShjKzEpOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGluc2VydCBrZXljb2RlICVkIGRvd249JWRcbiIsIGtjLCBkb3duKTsKLQotCQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLSNpZmRlZiBNQUNPU1gKLQkJCWlmIChkb3duID09IC0xKSB7Ci0JCQkJbWFjb3N4Q0dfa2V5Y29kZV9pbmplY3QoMSwga2MpOwotCQkJCXVzbGVlcCg1MCoxMDAwKTsKLQkJCQltYWNvc3hDR19rZXljb2RlX2luamVjdCgwLCBrYyk7Ci0JCQl9IGVsc2UgewotCQkJCW1hY29zeENHX2tleWNvZGVfaW5qZWN0KGRvd24sIGtjKTsKLQkJCX0KLSNlbmRpZgotCQl9IGVsc2UgewotCQkJWF9MT0NLOwotCQkJaWYgKGRvd24gPT0gLTEpIHsKLQkJCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGtjLCAxLCBDdXJyZW50VGltZSk7Ci0JCQkJdXNsZWVwKDUwKjEwMDApOwotCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwga2MsIDAsIEN1cnJlbnRUaW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBrYywgZG93biwgQ3VycmVudFRpbWUpOwotCQkJfQotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlYX1VOTE9DSzsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImtleXN5bSIpID09IHApIHsKLQkJaW50IGRvd24gPSAtMTsKLQkJdW5zaWduZWQgaW50IGluOwotCQlLZXlTeW0ga3M7Ci0JCWNoYXIgKmMsICpzdHI7Ci0JCU5PVEFQUAotCQlDT0xPTl9DSEVDSygia2V5c3ltOiIpCi0JCXAgKz0gc3RybGVuKCJrZXlzeW06Iik7Ci0KLQkJYyA9IHN0cmNocihwLCAnLCcpOwotCQlpZiAoYykgewotCQkJZG93biA9IGF0b2koYysxKTsKLQkJCSpjID0gJ1wwJzsKLQkJfQotCi0JCWlmIChzc2NhbmYocCwgIjB4JXgiLCAmaW4pID09IDEpIHsKLQkJCWtzID0gKEtleVN5bSkgaW47Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKHAsICIldSIsICZpbikgPT0gMSkgewotCQkJa3MgPSAoS2V5U3ltKSBpbjsKLQkJfSBlbHNlIGlmICgoa3MgPSBYU3RyaW5nVG9LZXlzeW0ocCkpICE9IE5vU3ltYm9sKSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGJhZCBrZXlzeW06ICVzXG4iLCBwKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlzdHIgPSBYS2V5c3ltVG9TdHJpbmcoa3MpOwotCQlzdHIgPSBzdHIgPyBzdHIgOiAiTm9TeW1ib2wiOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGluc2VydCBrZXlzeW0gJXMgMHgleCAnJXMnIGRvd249JWRcbiIsIHAsIGtzLCBzdHIsIGRvd24pOwotCQlpZiAoZG93biA9PSAtMSkgewotCQkJa2V5Ym9hcmQoMSwga3MsIE5VTEwpOwotCQkJdXNsZWVwKDUwKjEwMDApOwotCQkJa2V5Ym9hcmQoMCwga3MsIE5VTEwpOwotCQl9IGVsc2UgewotCQkJa2V5Ym9hcmQoZG93biwga3MsIE5VTEwpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAicHRyIikgPT0gcCkgewotCQlpbnQgeCwgeSwgbSA9IDA7Ci0JCU5PVEFQUAotCQlDT0xPTl9DSEVDSygicHRyOiIpCi0JCXAgKz0gc3RybGVuKCJwdHI6Iik7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogaW5zZXJ0IHBvaW50ZXIgZXZlbnQ6ICVzXG4iLCBwKTsKLQkJaWYgKHNzY2FuZihwLCAiJWQsJWQsJWQiLCAmeCwgJnksICZtKSA9PSAzKSB7Ci0JCQlwb2ludGVyX2V2ZW50KG0sIHgsIHksIE5VTEwpOwotCQl9IGVsc2UgaWYgKHNzY2FuZihwLCAiJWQsJWQiLCAmeCwgJnkpID09IDIpIHsKLQkJCXBvaW50ZXJfZXZlbnQobSwgeCwgeSwgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IGJhZCBwdHI6eCx5LG1hc2tcbiIpOwotCQl9Ci0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJmYWtlYnV0dG9uZXZlbnQiKSA9PSBwKSB7Ci0JCWludCBtYiwgZG93biA9IDA7Ci0JCU5PVEFQUAotCQlDT0xPTl9DSEVDSygiZmFrZWJ1dHRvbmV2ZW50OiIpCi0JCXAgKz0gc3RybGVuKCJmYWtlYnV0dG9uZXZlbnQ6Iik7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogaW5zZXJ0IGZha2VidXR0b25ldmVudDogJXNcbiIsIHApOwotCQlpZiAoc3NjYW5mKHAsICIlZCwlZCIsICZtYiwgJmRvd24pID09IDIpIHsKLQkJCVhfTE9DSzsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogWFRlc3RGYWtlQnV0dG9uRXZlbnQobWI9JWQsIGRvd249JWQpXG4iLCBtYiwgZG93bik7Ci0JCQlYVGVzdEZha2VCdXR0b25FdmVudF93cihkcHksIG1iLCBkb3duID8gVHJ1ZSA6IEZhbHNlLCBDdXJyZW50VGltZSk7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCVhfVU5MT0NLOwotCQl9Ci0KLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzbGVlcCIpID09IHApIHsKLQkJTk9UQVBQCi0JCUNPTE9OX0NIRUNLKCJzbGVlcDoiKQotCQlwICs9IHN0cmxlbigic2xlZXA6Iik7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2xlZXBpbmc6ICVzXG4iLCBwKTsKLQkJdXNsZWVwKChpbnQpICgxLjBlKzYgKiBhdG9mKHApKSk7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZG9uZSBzbGVlcGluZy5cbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImdldF94cHJvcCIpID09IHApIHsKLQkJY2hhciAqcmVzOwotCQl1bnNpZ25lZCBsb25nIGlkOwotCQlXaW5kb3cgd2luID0gTm9uZTsJLyogTm9uZSBpbXBsaWVzIHJvb3QgaW4gZ2V0X3hwcm9wKCkgKi8KLQotCQkvKiBub3RlIHdlIGZvcmNlIHF1ZXJ5IGFuZCBhc3N1bWUgdGhlIGNvbG9uIGlzIHRoZXJlLiAqLwotCQlxdWVyeSA9IDE7Ci0JCWlmIChzdHJzdHIocCwgImdldF94cHJvcDoiKSAhPSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczpOL0EiLCBwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJnZXRfeHByb3A6Iik7Ci0KLQkJaWYgKHN0cnN0cihwLCAiaWQ9IikgPT0gcCkgewkvKiBza2lwLWNtZC1saXN0ICovCi0JCQlwICs9IHN0cmxlbigiaWQ9Iik7Ci0JCQlpZiAoc2Nhbl9oZXhkZWMocCwgJmlkKSkgewotCQkJCXdpbiA9IChXaW5kb3cpIGlkOwotCQkJfQotCQkJaWYgKHN0cmNocihwLCAnOicpKSB7Ci0JCQkJcCA9IHN0cmNocihwLCAnOicpICsgMTsKLQkJCX0KLQkJfQotCi0JCXJlcyA9IGdldF94cHJvcChwLCB3aW4pOwotCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCXJlcyA9IHN0cmR1cCgiTlVMTCIpOwotCQl9Ci0JCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz1nZXRfeHByb3A6JXM6JXMiLCBwLCByZXMpOwotCQlmcmVlKHJlcyk7Ci0KLQkJZ290byBxcnk7Ci0JfQotCWlmIChzdHJzdHIocCwgInNldF94cHJvcCIpID09IHApIHsKLQkJY2hhciAqcTsKLQkJaW50IHJjID0gLTI7Ci0JCXVuc2lnbmVkIGxvbmcgaWQ7Ci0JCVdpbmRvdyB3aW4gPSBOb25lOwkvKiBOb25lIGltcGxpZXMgcm9vdCBpbiBzZXRfeHByb3AoKSAqLwotCi0JCS8qIG5vdGUgd2UgZm9yY2UgcXVlcnkgYW5kIGFzc3VtZSB0aGUgY29sb24gaXMgdGhlcmUuICovCi0JCXF1ZXJ5ID0gMTsKLQkJaWYgKHN0cnN0cihwLCAic2V0X3hwcm9wOiIpICE9IHApIHsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOk4vQSIsIHApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNldF94cHJvcDoiKTsKLQotCQlpZiAoc3Ryc3RyKHAsICJpZD0iKSA9PSBwKSB7CS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCXAgKz0gc3RybGVuKCJpZD0iKTsKLQkJCWlmIChzY2FuX2hleGRlYyhwLCAmaWQpKSB7Ci0JCQkJd2luID0gKFdpbmRvdykgaWQ7Ci0JCQl9Ci0JCQlpZiAoc3RyY2hyKHAsICc6JykpIHsKLQkJCQlwID0gc3RyY2hyKHAsICc6JykgKyAxOwotCQkJfQotCQl9Ci0KLQkJcSA9IHN0cmNocihwLCAnOicpOwotCQlpZiAocSkgewotCQkJKnEgPSAnXDAnOwotCQkJcmMgPSBzZXRfeHByb3AocCwgd2luLCBxKzEpOwotCQkJKnEgPSAnOic7Ci0JCX0KLQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPXNldF94cHJvcDolczolZCIsIHAsIHJjKTsKLQotCQlnb3RvIHFyeTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAid2luaW5mbyIpID09IHApIHsKLQkJY2hhciAqcmVzLCAqdCA9ICIiOwotCQl1bnNpZ25lZCBsb25nIGlkOwotCQlXaW5kb3cgd2luID0gTm9uZTsKLQkJaW50IHNob3dfY2hpbGRyZW4gPSAwOwotCi0JCS8qIG5vdGUgd2UgZm9yY2UgcXVlcnkgYW5kIGFzc3VtZSB0aGUgY29sb24gaXMgdGhlcmUuICovCi0JCXF1ZXJ5ID0gMTsKLQkJaWYgKHN0cnN0cihwLCAid2luaW5mbzoiKSAhPSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczpOL0EiLCBwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ3aW5pbmZvOiIpOwotCi0JCWlmIChwWzBdID09ICcrJykgewotCQkJc2hvd19jaGlsZHJlbiA9IDE7Ci0JCQl0ID0gIisiOwotCQkJcCsrOwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJyb290IikpIHsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJd2luID0gcm9vdHdpbjsKLQkJfSBlbHNlIGlmIChzY2FuX2hleGRlYyhwLCAmaWQpKSB7Ci0JCQl3aW4gPSAoV2luZG93KSBpZDsKLQkJfQotCi0JCXJlcyA9IHdpbmluZm8od2luLCBzaG93X2NoaWxkcmVuKTsKLQkJaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCQlyZXMgPSBzdHJkdXAoIk5VTEwiKTsKLQkJfQotCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9d2luaW5mbzolcyVzOiVzIiwgdCwgcCwgcmVzKTsKLQkJZnJlZShyZXMpOwotCi0JCWdvdG8gcXJ5OwotCX0KLQlpZiAoc3Ryc3RyKHAsICJiY3hfeGF0dGFjaCIpID09IHApIHsKLQkJY2hhciAqcmVzOwotCQlpbnQgcGdfaW5pdCA9IC0xLCBrZ19pbml0ID0gLTE7Ci0JCWludCB0cnkgPSAwLCBtYXhfdHJpZXMgPSA0OwotCi0JCS8qIG5vdGUgd2UgZm9yY2UgcXVlcnkgYW5kIGFzc3VtZSB0aGUgY29sb24gaXMgdGhlcmUuICovCi0JCXF1ZXJ5ID0gMTsKLQkJaWYgKHN0cnN0cihwLCAiYmN4X3hhdHRhY2g6IikgIT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6Ti9BIiwgcCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiYmN4X3hhdHRhY2g6Iik7Ci0KLQkJaWYgKHN0cnN0cihwLCAicmV0cnk9IikpIHsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJaW50IG47Ci0JCQljaGFyICpxID0gc3Ryc3RyKHAsICJyZXRyeT0iKTsgLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJaWYgKHNzY2FuZihxLCAicmV0cnk9JWQiLCAmbikgPT0gMSkgewotCQkJCWlmIChuIDwgMCkgbiA9IDA7Ci0JCQkJbWF4X3RyaWVzID0gMSArIG47Ci0JCQl9Ci0JCX0KLQotCQl0cnlfYWdhaW46Ci0KLQkJcmVzID0gYmN4X3hhdHRhY2gocCwgJnBnX2luaXQsICZrZ19pbml0KTsKLQkJdHJ5Kys7Ci0JCWlmIChyZXMgPT0gTlVMTCkgewotCQkJcmVzID0gc3RyZHVwKCJOVUxMIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHJlcywgIkdSQUJfRkFJTF9JTklUIikpIHsKLQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IGZhaWxlZCBncmFiIGNoZWNrIGZvciAnJXMnOiAlcy4gIEZpbmFsIHN0YXRlIE9LLCBub3QgUmV0cnlpbmcuXG4iLCBwLCByZXMpOwotCQl9IGVsc2UgaWYgKHN0cnN0cihyZXMsICJHUkFCX0ZBSUwiKSAmJiB0cnkgPCBtYXhfdHJpZXMpIHsKLQkJCXJmYkxvZygiYmN4X3hhdHRhY2g6IGZhaWxlZCBncmFiIGNoZWNrIGZvciAnJXMnOiAlcy4gIFJldHJ5aW5nWyVkXS4uLlxuIiwgcCwgcmVzLCB0cnkpOwotCQkJZnJlZShyZXMpOwotCQkJcG9pbnRlcl9ldmVudCgwLCBkcHlfeC8yICsgdHJ5LCBkcHlfeS8yICsgdHJ5LCBOVUxMKTsKLSNpZiAhTk9fWDExCi0JCQlYX0xPQ0s7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCWlmIChkcHkpIHsKLQkJCQlpZiAodHJ5ID09IDIpIHsKLQkJCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JCQkJfSBlbHNlIGlmICh0cnkgPT0gMykgewotCQkJCQlYU3luYyhkcHksIFRydWUpOwotCQkJCX0KLQkJCX0KLQkJCVhfVU5MT0NLOwotI2VuZGlmCi0JCQlpZiAodHJ5ID09IDEpIHsKLQkJCQl1c2xlZXAoMjUwKjEwMDApOwotCQkJfSBlbHNlIGlmICh0cnkgPD0gNCkgewotCQkJCXVzbGVlcCh0cnkqNDAwKjEwMDApOwotCQkJfSBlbHNlIHsKLQkJCQl1c2xlZXAoNCo1MDAqMTAwMCk7Ci0JCQl9Ci0JCQlnb3RvIHRyeV9hZ2FpbjsKLQkJfQotCi0JCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz1iY3hfeGF0dGFjaDolczolcyIsIHAsIHJlcyk7Ci0JCWZyZWUocmVzKTsKLQotCQlnb3RvIHFyeTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZGVmZXJ1cGRhdGUiKSA9PSBwKSB7Ci0JCWludCBkOwotCQlDT0xPTl9DSEVDSygiZGVmZXJ1cGRhdGU6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlpZiAoIXNjcmVlbikgewotCQkJCWQgPSBkZWZlcl91cGRhdGU7Ci0JCQl9IGVsc2UgewotCQkJCWQgPSBzY3JlZW4tPmRlZmVyVXBkYXRlVGltZTsKLQkJCX0KLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZGVmZXJ1cGRhdGU6Iik7Ci0JCWQgPSBhdG9pKHApOwotCQlpZiAoZCA8IDApIGQgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgZGVmZXIgdG8gJWQgbXMuXG4iLCBkKTsKLQkJZGVmZXJfdXBkYXRlID0gZDsKLQkJLyogbXV0ZXggKi8KLQkJc2NyZWVuLT5kZWZlclVwZGF0ZVRpbWUgPSBkOwotCQlnb3RfZGVmZXIgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImRlZmVyIikgPT0gcCkgewotCQlpbnQgZDsKLQkJQ09MT05fQ0hFQ0soImRlZmVyOiIpCi0JCWlmIChxdWVyeSkgewotCQkJaWYgKCFzY3JlZW4pIHsKLQkJCQlkID0gZGVmZXJfdXBkYXRlOwotCQkJfSBlbHNlIHsKLQkJCQlkID0gc2NyZWVuLT5kZWZlclVwZGF0ZVRpbWU7Ci0JCQl9Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIGQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImRlZmVyOiIpOwotCQlkID0gYXRvaShwKTsKLQkJaWYgKGQgPCAwKSBkID0gMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIGRlZmVyIHRvICVkIG1zLlxuIiwgZCk7Ci0JCWRlZmVyX3VwZGF0ZSA9IGQ7Ci0JCS8qIG11dGV4ICovCi0JCXNjcmVlbi0+ZGVmZXJVcGRhdGVUaW1lID0gZDsKLQkJZ290X2RlZmVyID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJzZXRkZWZlciIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInNldGRlZmVyOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBzZXRfZGVmZXIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInNldGRlZmVyOiIpOwotCQlzZXRfZGVmZXIgPSBhdG9pKHApOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgc2V0X2RlZmVyIHRvICVkXG4iLCBzZXRfZGVmZXIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImV4dHJhX2ZidXIiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJleHRyYV9mYnVyOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBleHRyYV9mYnVyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJleHRyYV9mYnVyOiIpOwotCQlleHRyYV9mYnVyID0gYXRvaShwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIGV4dHJhX2ZidXIgdG8gJWRcbiIsIGV4dHJhX2ZidXIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIndhaXRfdWkiKSA9PSBwKSB7Ci0JCWRvdWJsZSB3OwotCQlDT0xPTl9DSEVDSygid2FpdF91aToiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJS4yZiIsIHAsIGNvLCB3YWl0X3VpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ3YWl0X3VpOiIpOwotCQl3ID0gYXRvZihwKTsKLQkJaWYgKHcgPD0gMCkgdyA9IDEuMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHdhaXRfdWkgZmFjdG9yICUuMmYgLT4gJS4yZlxuIiwKLQkJICAgIHdhaXRfdWksIHcpOwotCQl3YWl0X3VpID0gdzsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAid2FpdF9ib2ciKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHdhaXRfYm9nKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXdhaXRfYm9nID0gMTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHdhaXRfYm9nIHRvICVkXG4iLCB3YWl0X2JvZyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vd2FpdF9ib2ciKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF3YWl0X2JvZyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQl3YWl0X2JvZyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyB3YWl0X2JvZyB0byAlZFxuIiwgd2FpdF9ib2cpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNsb3dfZmIiKSA9PSBwKSB7Ci0JCWRvdWJsZSB3OwotCQlDT0xPTl9DSEVDSygic2xvd19mYjoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJS4yZiIsIHAsIGNvLCBzbG93X2ZiKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJzbG93X2ZiOiIpOwotCQl3ID0gYXRvZihwKTsKLQkJaWYgKHcgPD0gMCkgdyA9IDAuMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHNsb3dfZmIgZmFjdG9yICUuMmYgLT4gJS4yZlxuIiwKLQkJICAgIHNsb3dfZmIsIHcpOwotCQlzbG93X2ZiID0gdzsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ4cmVmcmVzaCIpID09IHApIHsKLQkJZG91YmxlIHc7Ci0JCUNPTE9OX0NIRUNLKCJ4cmVmcmVzaDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJS4yZiIsIHAsIGNvLCB4cmVmcmVzaCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigieHJlZnJlc2g6Iik7Ci0JCXcgPSBhdG9mKHApOwotCQlpZiAodyA8PSAwKSB3ID0gMC4wOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgeHJlZnJlc2ggZGVsYXkgJS4yZiAtPiAlLjJmXG4iLAotCQkgICAgeHJlZnJlc2gsIHcpOwotCQl4cmVmcmVzaCA9IHc7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAid2FpdCIpID09IHApIHsKLQkJaW50IHc7Ci0JCUNPTE9OX0NIRUNLKCJ3YWl0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCB3YWl0bXMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oIndhaXQ6Iik7Ci0JCXcgPSBhdG9pKHApOwotCQlpZiAodyA8IDApIHcgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgd2FpdCAlZCAtPiAlZCBtcy5cbiIsIHdhaXRtcywgdyk7Ci0JCXdhaXRtcyA9IHc7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAicmVhZHRpbWVvdXQiKSA9PSBwKSB7Ci0JCWludCB3LCBvcmlnID0gcmZiTWF4Q2xpZW50V2FpdDsKLQkJQ09MT05fQ0hFQ0soInJlYWR0aW1lb3V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIHJmYk1heENsaWVudFdhaXQvMTAwMCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigicmVhZHRpbWVvdXQ6Iik7Ci0JCXcgPSBhdG9pKHApICogMTAwMDsKLQkJaWYgKHcgPD0gMCkgdyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyByZmJNYXhDbGllbnRXYWl0ICVkIC0+ICIKLQkJICAgICIlZCBtc2VjLlxuIiwgb3JpZywgdyk7Ci0JCXJmYk1heENsaWVudFdhaXQgPSB3OwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJuYXAiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHRha2VfbmFwcyk7Ci0JCQkgICAgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIG5hcCBtb2RlLlxuIik7Ci0JCXRha2VfbmFwcyA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vbmFwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhdGFrZV9uYXBzKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIG5hcCBtb2RlLlxuIik7Ci0JCXRha2VfbmFwcyA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAic2IiKSA9PSBwKSB7Ci0JCWludCB3OwotCQlDT0xPTl9DSEVDSygic2I6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHNjcmVlbl9ibGFuayk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2I6Iik7Ci0JCXcgPSBhdG9pKHApOwotCQlpZiAodyA8IDApIHcgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgc2NyZWVuX2JsYW5rICVkIC0+ICVkIHNlYy5cbiIsCi0JCSAgICBzY3JlZW5fYmxhbmssIHcpOwotCQlzY3JlZW5fYmxhbmsgPSB3OwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInNjcmVlbl9ibGFuayIpID09IHApIHsKLQkJaW50IHc7Ci0JCUNPTE9OX0NIRUNLKCJzY3JlZW5fYmxhbms6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHNjcmVlbl9ibGFuayk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigic2NyZWVuX2JsYW5rOiIpOwotCQl3ID0gYXRvaShwKTsKLQkJaWYgKHcgPCAwKSB3ID0gMDsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIHNjcmVlbl9ibGFuayAlZCAtPiAlZCBzZWMuXG4iLAotCQkgICAgc2NyZWVuX2JsYW5rLCB3KTsKLQkJc2NyZWVuX2JsYW5rID0gdzsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZmJwbSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIXdhdGNoX2ZicG0pOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgLW5vZmJwbSBtb2RlLlxuIik7Ci0JCXdhdGNoX2ZicG0gPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2ZicG0iKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHdhdGNoX2ZicG0pOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiAtbm9mYnBtIG1vZGUuXG4iKTsKLQkJd2F0Y2hfZmJwbSA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRwbXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF3YXRjaF9kcG1zKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIC1ub2RwbXMgbW9kZS5cbiIpOwotCQl3YXRjaF9kcG1zID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9kcG1zIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB3YXRjaF9kcG1zKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gLW5vZHBtcyBtb2RlLlxuIik7Ci0JCXdhdGNoX2RwbXMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJjbGllbnRkcG1zIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBjbGllbnRfZHBtcyk7Ci0JCQkgICAgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9uIC1jbGllbnRkcG1zIG1vZGUuXG4iKTsKLQkJY2xpZW50X2RwbXMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2NsaWVudGRwbXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFjbGllbnRfZHBtcyk7Ci0JCQkgICAgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiAtY2xpZW50ZHBtcyBtb2RlLlxuIik7Ci0JCWNsaWVudF9kcG1zID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZm9yY2VkcG1zIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBmb3JjZV9kcG1zKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gLWZvcmNlZHBtcyBtb2RlLlxuIik7Ci0JCWZvcmNlX2RwbXMgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2ZvcmNlZHBtcyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWZvcmNlX2RwbXMpOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvZmYgLWZvcmNlZHBtcyBtb2RlLlxuIik7Ci0JCWZvcmNlX2RwbXMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub3NlcnZlcmRwbXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG5vX3VsdHJhX2RwbXMpOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiAtbm9zZXJ2ZXJkcG1zIG1vZGUuXG4iKTsKLQkJbm9fdWx0cmFfZHBtcyA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgInNlcnZlcmRwbXMiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFub191bHRyYV9kcG1zKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIC1ub3NlcnZlcmRwbXMgbW9kZS5cbiIpOwotCQlub191bHRyYV9kcG1zID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm91bHRyYWV4dCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgbm9fdWx0cmFfZXh0KTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb24gLW5vdWx0cmFleHQgbW9kZS5cbiIpOwotCQlub191bHRyYV9leHQgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJ1bHRyYWV4dCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW5vX3VsdHJhX2V4dCk7Ci0JCQkgICAgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuaW5nIG9mZiAtbm91bHRyYWV4dCBtb2RlLlxuIik7Ci0JCW5vX3VsdHJhX2V4dCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNoYXR3aW5kb3ciKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGNoYXRfd2luZG93KTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsaW5nIHRoZSBsb2NhbCBjaGF0IHdpbmRvdy5cbiIpOwotCQljaGF0X3dpbmRvdyA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vY2hhdHdpbmRvdyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWNoYXRfd2luZG93KTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyB0aGUgbG9jYWwgY2hhdCB3aW5kb3cuXG4iKTsKLQkJY2hhdF93aW5kb3cgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJjaGF0b24iKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIChjaGF0X3dpbmRvd19jbGllbnQgIT0gTlVMTCkpOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBsb2NhbCBjaGF0IHdpbmRvdyBvbi5cbiIpOwotCQljaGF0X3dpbmRvdyA9IDE7Ci0JCXNldF90ZXh0X2NoYXQoTlVMTCwgcmZiVGV4dENoYXRPcGVuLCAiIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImNoYXRvZmYiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIChjaGF0X3dpbmRvd19jbGllbnQgPT0gTlVMTCkpOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBsb2NhbCBjaGF0IHdpbmRvdyBvZmYuXG4iKTsKLQkJc2V0X3RleHRfY2hhdChOVUxMLCByZmJUZXh0Q2hhdENsb3NlLCAiIik7Ci0JCXNldF90ZXh0X2NoYXQoTlVMTCwgcmZiVGV4dENoYXRGaW5pc2hlZCwgIiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImZzIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygiZnM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVmIiwgcCwgY28sIGZzX2ZyYWMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImZzOiIpOwotCQlmc19mcmFjID0gYXRvZihwKTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIC1mcyBmcmFjIHRvICVmXG4iLCBmc19mcmFjKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJnYXBzIikgPT0gcCkgewotCQlpbnQgZzsKLQkJQ09MT05fQ0hFQ0soImdhcHM6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIGdhcHNfZmlsbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZ2FwczoiKTsKLQkJZyA9IGF0b2kocCk7Ci0JCWlmIChnIDwgMCkgZyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBnYXBzX2ZpbGwgJWQgLT4gJWQuXG4iLAotCQkgICAgZ2Fwc19maWxsLCBnKTsKLQkJZ2Fwc19maWxsID0gZzsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJncm93IikgPT0gcCkgewotCQlpbnQgZzsKLQkJQ09MT05fQ0hFQ0soImdyb3c6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIGdyb3dfZmlsbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZ3JvdzoiKTsKLQkJZyA9IGF0b2kocCk7Ci0JCWlmIChnIDwgMCkgZyA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyBncm93X2ZpbGwgJWQgLT4gJWQuXG4iLAotCQkgICAgZ3Jvd19maWxsLCBnKTsKLQkJZ3Jvd19maWxsID0gZzsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJmdXp6IikgPT0gcCkgewotCQlpbnQgZjsKLQkJQ09MT05fQ0hFQ0soImZ1eno6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIHRpbGVfZnV6eik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZnV6ejoiKTsKLQkJZiA9IGF0b2kocCk7Ci0JCWlmIChmIDwgMCkgZiA9IDA7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogc2V0dGluZyB0aWxlX2Z1enogJWQgLT4gJWQuXG4iLAotCQkgICAgdGlsZV9mdXp6LCBmKTsKLQkJZ3Jvd19maWxsID0gZjsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAic25hcGZiIikpIHsKLQkJaW50IG9yaWcgPSB1c2Vfc25hcGZiOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHVzZV9zbmFwZmIpOwotCQkJICAgIGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogdHVybmluZyBvbiBzbmFwZmIgbW9kZS5cbiIpOwotCQl1c2Vfc25hcGZiID0gMTsKLQkJaWYgKG9yaWcgIT0gdXNlX3NuYXBmYikgewotCQkJZG9fbmV3X2ZiKDEpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vc25hcGZiIikpIHsKLQkJaW50IG9yaWcgPSB1c2Vfc25hcGZiOwotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICF1c2Vfc25hcGZiKTsKLQkJCSAgICBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHR1cm5pbmcgb2ZmIHNuYXBmYiBtb2RlLlxuIik7Ci0JCXVzZV9zbmFwZmIgPSAwOwotCQlpZiAob3JpZyAhPSB1c2Vfc25hcGZiKSB7Ci0JCQlkb19uZXdfZmIoMSk7Ci0JCX0KLQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInJhd2ZiIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygicmF3ZmI6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwocmF3X2ZiX3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInJhd2ZiOiIpOwotCQlpZiAocmF3X2ZiX3N0cikgZnJlZShyYXdfZmJfc3RyKTsKLQkJcmF3X2ZiX3N0ciA9IHN0cmR1cChwKTsKLQkJaWYgKHNhZmVfcmVtb3RlX29ubHkgJiYgc3Ryc3RyKHAsICJzZXR1cDoiKSA9PSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJCS8qIG4uYi4gd2Ugc3RpbGwgYWxsb3cgZmlsZW5hbWUsIHNobSwgb2YgcmF3ZmIgKi8KLQkJCWZwcmludGYoc3RkZXJyLCAidW5zYWZlIHJhd2ZiIHNldHVwOiAlc1xuIiwgcCk7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIC1yYXdmYiB0bzpcblx0JyVzJ1xuIiwgcCk7Ci0KLQkJaWYgKCpyYXdfZmJfc3RyID09ICdcMCcpIHsKLQkJCWZyZWUocmF3X2ZiX3N0cik7Ci0JCQlyYXdfZmJfc3RyID0gTlVMTDsKLQkJCWlmIChyYXdfZmJfbW1hcCkgewotCQkJCW11bm1hcChyYXdfZmJfYWRkciwgcmF3X2ZiX21tYXApOwotCQkJfQotCQkJaWYgKHJhd19mYl9mZCA+PSAwKSB7Ci0JCQkJY2xvc2UocmF3X2ZiX2ZkKTsKLQkJCX0KLQkJCXJhd19mYl9mZCA9IC0xOwotCQkJcmF3X2ZiID0gTlVMTDsKLQkJCXJhd19mYl9hZGRyID0gTlVMTDsKLQkJCXJhd19mYl9vZmZzZXQgPSAwOwotCQkJcmF3X2ZiX3NobSA9IDA7Ci0JCQlyYXdfZmJfbW1hcCA9IDA7Ci0JCQlyYXdfZmJfc2VlayA9IDA7Ci0JCQlyZmJMb2coInJlc3RvcmluZyBwZXItcmF3ZmIgc2V0dGluZ3MuLi5cbiIpOwotCQkJc2V0X3Jhd19mYl9wYXJhbXMoMSk7Ci0JCX0KLQkJcmZiTG9nKCJoYW5nIG9uIHRpZ2h0LCBoZXJlIHdlIGdvLi4uXG4iKTsKLQkJcmF3X2ZiX2JhY2tfdG9fWCA9IDE7Ci0JCWRvX25ld19mYigxKTsKLQkJcmF3X2ZiX2JhY2tfdG9fWCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAidWlucHV0X2FjY2VsIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygidWlucHV0X2FjY2VsOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKGdldF91aW5wdXRfYWNjZWwoKSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInVpbnB1dF9hY2NlbDoiKTsKLQkJcmZiTG9nKCJzZXRfdWlucHV0X2FjY2VsOiAlc1xuIiwgcCk7Ci0JCXNldF91aW5wdXRfYWNjZWwocCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAidWlucHV0X3RocmVzaCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soInVpbnB1dF90aHJlc2g6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoZ2V0X3VpbnB1dF90aHJlc2goKSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oInVpbnB1dF90aHJlc2g6Iik7Ci0JCXJmYkxvZygic2V0X3VpbnB1dF90aHJlc2g6ICVzXG4iLCBwKTsKLQkJc2V0X3VpbnB1dF90aHJlc2gocCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAidWlucHV0X3Jlc2V0IikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygidWlucHV0X3Jlc2V0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIGdldF91aW5wdXRfcmVzZXQoKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigidWlucHV0X3Jlc2V0OiIpOwotCQlyZmJMb2coInNldF91aW5wdXRfcmVzZXQ6ICVzXG4iLCBwKTsKLQkJc2V0X3VpbnB1dF9yZXNldChhdG9pKHApKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJ1aW5wdXRfYWx3YXlzIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygidWlucHV0X2Fsd2F5czoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywKLQkJCSAgICBnZXRfdWlucHV0X2Fsd2F5cygpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJ1aW5wdXRfYWx3YXlzOiIpOwotCQlyZmJMb2coInNldF91aW5wdXRfYWx3YXlzOiAlc1xuIiwgcCk7Ci0JCXNldF91aW5wdXRfYWx3YXlzKGF0b2kocCkpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInByb2dyZXNzaXZlIikgPT0gcCkgewotCQlpbnQgZjsKLQkJQ09MT05fQ0hFQ0soInByb2dyZXNzaXZlOiIpCi0JCWlmIChxdWVyeSkgewotCQkJaWYgKCFzY3JlZW4pIHsKLQkJCQlmID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZiA9IHNjcmVlbi0+cHJvZ3Jlc3NpdmVTbGljZUhlaWdodDsKLQkJCX0KLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgZik7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigicHJvZ3Jlc3NpdmU6Iik7Ci0JCWYgPSBhdG9pKHApOwotCQlpZiAoZiA8IDApIGYgPSAwOwotCQlyZmJMb2coInJlbW90ZV9jbWQ6IHNldHRpbmcgcHJvZ3Jlc3NpdmUgJWQgLT4gJWQuXG4iLAotCQkgICAgc2NyZWVuLT5wcm9ncmVzc2l2ZVNsaWNlSGVpZ2h0LCBmKTsKLQkJLyogbXV0ZXggKi8KLQkJc2NyZWVuLT5wcm9ncmVzc2l2ZVNsaWNlSGVpZ2h0ID0gZjsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJyZmJwb3J0IikgPT0gcCkgewotCQlpbnQgcnAsIG9yaWcgPSBzY3JlZW4gPyBzY3JlZW4tPnBvcnQgOiA1OTAwOwotCQlDT0xPTl9DSEVDSygicmZicG9ydDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgb3JpZyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigicmZicG9ydDoiKTsKLQkJcnAgPSBhdG9pKHApOwotCQlyZXNldF9yZmJwb3J0KG9yaWcsIHJwKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiaHR0cCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJaW50IGxzID0gc2NyZWVuID8gc2NyZWVuLT5odHRwTGlzdGVuU29jayA6IC0xOwotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgKGxzID4gLTEpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmIChzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID4gLTEgfHwgaXB2Nl9odHRwX2ZkID4gLTEpIHsKLQkJCXJmYkxvZygiYWxyZWFkeSBsaXN0ZW5pbmcgZm9yIGh0dHAgY29ubmVjdGlvbnMuXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygidHVybmluZyBvbiBsaXN0ZW5pbmcgZm9yIGh0dHAgY29ubmVjdGlvbnMuXG4iKTsKLQkJCWlmIChjaGVja19odHRwZGlyKCkpIHsKLQkJCQlodHRwX2Nvbm5lY3Rpb25zKDEpOwotCQkJfQotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vaHR0cCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJaW50IGxzID0gc2NyZWVuID8gc2NyZWVuLT5odHRwTGlzdGVuU29jayA6IC0xOwotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIShscyA+IC0xKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoc2NyZWVuLT5odHRwTGlzdGVuU29jayA8IDAgJiYgaXB2Nl9odHRwX2ZkIDwgMCkgewotCQkJcmZiTG9nKCJhbHJlYWR5IG5vdCBsaXN0ZW5pbmcgZm9yIGh0dHAgY29ubmVjdGlvbnMuXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygidHVybmluZyBvZmYgbGlzdGVuaW5nIGZvciBodHRwIGNvbm5lY3Rpb25zLlxuIik7Ci0JCQlpZiAoY2hlY2tfaHR0cGRpcigpKSB7Ci0JCQkJaHR0cF9jb25uZWN0aW9ucygwKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImh0dHBwb3J0IikgPT0gcCkgewotCQlpbnQgaHAsIG9yaWcgPSBzY3JlZW4gPyBzY3JlZW4tPmh0dHBQb3J0IDogMDsKLQkJQ09MT05fQ0hFQ0soImh0dHBwb3J0OiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBvcmlnKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJodHRwcG9ydDoiKTsKLQkJaHAgPSBhdG9pKHApOwotCQlyZXNldF9odHRwcG9ydChvcmlnLCBocCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiaHR0cGRpciIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImh0dHBkaXI6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVzIiwgcCwgY28sCi0JCQkgICAgTk9OVUwoaHR0cF9kaXIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJodHRwZGlyOiIpOwotCQlpZiAoaHR0cF9kaXIgJiYgIXN0cmNtcChodHRwX2RpciwgcCkpIHsKLQkJCXJmYkxvZygibm8gY2hhbmdlIGluIGh0dHBkaXI6ICVzXG4iLCBodHRwX2Rpcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaHR0cF9kaXIpIHsKLQkJCQlmcmVlKGh0dHBfZGlyKTsKLQkJCX0KLQkJCWh0dHBfZGlyID0gc3RyZHVwKHApOwotCQkJaHR0cF9jb25uZWN0aW9ucygwKTsKLQkJCWlmICgqcCAhPSAnXDAnKSB7Ci0JCQkJaHR0cF9jb25uZWN0aW9ucygxKTsKLQkJCX0KLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJlbmFibGVodHRwcHJveHkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWludCBodCA9IHNjcmVlbiA/IHNjcmVlbi0+aHR0cEVuYWJsZVByb3h5Q29ubmVjdCA6IDA7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBodCAhPSAwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygidHVybmluZyBvbiBlbmFibGVodHRwcHJveHkuXG4iKTsKLQkJLyogbXV0ZXggKi8KLQkJc2NyZWVuLT5odHRwRW5hYmxlUHJveHlDb25uZWN0ID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9lbmFibGVodHRwcHJveHkiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWludCBodCA9IHNjcmVlbiA/IHNjcmVlbi0+aHR0cEVuYWJsZVByb3h5Q29ubmVjdCA6IDA7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBodCA9PSAwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygidHVybmluZyBvZmYgZW5hYmxlaHR0cHByb3h5LlxuIik7Ci0JCXNjcmVlbi0+aHR0cEVuYWJsZVByb3h5Q29ubmVjdCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImFsd2F5c3NoYXJlZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJaW50IHQgPSBzY3JlZW4gPyBzY3JlZW4tPmFsd2F5c1NoYXJlZCA6IDA7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB0ICE9IDApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJ0dXJuaW5nIG9uIGFsd2F5c3NoYXJlZC5cbiIpOwotCQlzY3JlZW4tPmFsd2F5c1NoYXJlZCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vYWx3YXlzc2hhcmVkIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlpbnQgdCA9IHNjcmVlbiA/IHNjcmVlbi0+YWx3YXlzU2hhcmVkIDogMDsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIHQgPT0gMCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInR1cm5pbmcgb2ZmIGFsd2F5c3NoYXJlZC5cbiIpOwotCQlzY3JlZW4tPmFsd2F5c1NoYXJlZCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5ldmVyc2hhcmVkIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlpbnQgdCA9IHNjcmVlbiA/IHNjcmVlbi0+bmV2ZXJTaGFyZWQgOiAxOwotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgdCAhPSAwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygidHVybmluZyBvbiBuZXZlcnNoYXJlZC5cbiIpOwotCQlzY3JlZW4tPm5ldmVyU2hhcmVkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9hbHdheXNzaGFyZWQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWludCB0ID0gc2NyZWVuID8gc2NyZWVuLT5uZXZlclNoYXJlZCA6IDE7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB0ID09IDApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJ0dXJuaW5nIG9mZiBuZXZlcnNoYXJlZC5cbiIpOwotCQlzY3JlZW4tPm5ldmVyU2hhcmVkID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZG9udGRpc2Nvbm5lY3QiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCWludCB0ID0gc2NyZWVuID8gc2NyZWVuLT5kb250RGlzY29ubmVjdCA6IDE7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCB0ICE9IDApOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJ0dXJuaW5nIG9uIGRvbnRkaXNjb25uZWN0LlxuIik7Ci0JCXNjcmVlbi0+ZG9udERpc2Nvbm5lY3QgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RvbnRkaXNjb25uZWN0IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlpbnQgdCA9IHNjcmVlbiA/IHNjcmVlbi0+ZG9udERpc2Nvbm5lY3QgOiAxOwotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgdCA9PSAwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygidHVybmluZyBvZmYgZG9udGRpc2Nvbm5lY3QuXG4iKTsKLQkJc2NyZWVuLT5kb250RGlzY29ubmVjdCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRlc2t0b3AiKSB8fAotCSAgICBzdHJzdHIocCwgImRlc2t0b3A6IikgPT0gcCkgewkvKiBza2lwLWNtZC1saXN0ICovCi0JCUNPTE9OX0NIRUNLKCJkZXNrdG9wOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlcyIsIHAsIGNvLAotCQkJICAgIE5PTlVMKHJmYl9kZXNrdG9wX25hbWUpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCXAgKz0gc3RybGVuKCJkZXNrdG9wOiIpOwotCQlpZiAocmZiX2Rlc2t0b3BfbmFtZSkgewotCQkJZnJlZShyZmJfZGVza3RvcF9uYW1lKTsKLQkJfQotCQlyZmJfZGVza3RvcF9uYW1lID0gc3RyZHVwKHApOwotCQkvKiBtdXRleCAqLwotCQlzY3JlZW4tPmRlc2t0b3BOYW1lID0gcmZiX2Rlc2t0b3BfbmFtZTsKLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBzZXR0aW5nIGRlc2t0b3AgbmFtZSB0byAlc1xuIiwKLQkJICAgIHJmYl9kZXNrdG9wX25hbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJkZWJ1Z194ZXZlbnRzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBkZWJ1Z194ZXZlbnRzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3hldmVudHMgPSAxOwotCQlyZmJMb2coInNldCBkZWJ1Z194ZXZlbnRzIHRvOiAlZFxuIiwgZGVidWdfeGV2ZW50cyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZGVidWdfeGV2ZW50cyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWRlYnVnX3hldmVudHMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZGVidWdfeGV2ZW50cyA9IDA7Ci0JCXJmYkxvZygic2V0IGRlYnVnX3hldmVudHMgdG86ICVkXG4iLCBkZWJ1Z194ZXZlbnRzKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJkZWJ1Z194ZXZlbnRzIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygiZGVidWdfeGV2ZW50czoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywgZGVidWdfeGV2ZW50cyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZGVidWdfeGV2ZW50czoiKTsKLQkJZGVidWdfeGV2ZW50cyA9IGF0b2kocCk7Ci0JCXJmYkxvZygic2V0IGRlYnVnX3hldmVudHMgdG86ICVkXG4iLCBkZWJ1Z194ZXZlbnRzKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZGVidWdfeGRhbWFnZSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZGVidWdfeGRhbWFnZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlkZWJ1Z194ZGFtYWdlID0gMTsKLQkJcmZiTG9nKCJzZXQgZGVidWdfeGRhbWFnZSB0bzogJWRcbiIsIGRlYnVnX3hkYW1hZ2UpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlYnVnX3hkYW1hZ2UiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFkZWJ1Z194ZGFtYWdlKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3hkYW1hZ2UgPSAwOwotCQlyZmJMb2coInNldCBkZWJ1Z194ZGFtYWdlIHRvOiAlZFxuIiwgZGVidWdfeGRhbWFnZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZGVidWdfeGRhbWFnZSIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImRlYnVnX3hkYW1hZ2U6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIGRlYnVnX3hkYW1hZ2UpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImRlYnVnX3hkYW1hZ2U6Iik7Ci0JCWRlYnVnX3hkYW1hZ2UgPSBhdG9pKHApOwotCQlyZmJMb2coInNldCBkZWJ1Z194ZGFtYWdlIHRvOiAlZFxuIiwgZGVidWdfeGRhbWFnZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRlYnVnX3dpcmVmcmFtZSIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgZGVidWdfd2lyZWZyYW1lKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3dpcmVmcmFtZSA9IDE7Ci0JCXJmYkxvZygic2V0IGRlYnVnX3dpcmVmcmFtZSB0bzogJWRcbiIsIGRlYnVnX3dpcmVmcmFtZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZGVidWdfd2lyZWZyYW1lIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhZGVidWdfd2lyZWZyYW1lKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3dpcmVmcmFtZSA9IDA7Ci0JCXJmYkxvZygic2V0IGRlYnVnX3dpcmVmcmFtZSB0bzogJWRcbiIsIGRlYnVnX3dpcmVmcmFtZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZGVidWdfd2lyZWZyYW1lIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygiZGVidWdfd2lyZWZyYW1lOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLAotCQkJICAgIGRlYnVnX3dpcmVmcmFtZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZGVidWdfd2lyZWZyYW1lOiIpOwotCQlkZWJ1Z193aXJlZnJhbWUgPSBhdG9pKHApOwotCQlyZmJMb2coInNldCBkZWJ1Z193aXJlZnJhbWUgdG86ICVkXG4iLCBkZWJ1Z193aXJlZnJhbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJkZWJ1Z19zY3JvbGwiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGRlYnVnX3Njcm9sbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlkZWJ1Z19zY3JvbGwgPSAxOwotCQlyZmJMb2coInNldCBkZWJ1Z19zY3JvbGwgdG86ICVkXG4iLCBkZWJ1Z19zY3JvbGwpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlYnVnX3Njcm9sbCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWRlYnVnX3Njcm9sbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlkZWJ1Z19zY3JvbGwgPSAwOwotCQlyZmJMb2coInNldCBkZWJ1Z19zY3JvbGwgdG86ICVkXG4iLCBkZWJ1Z19zY3JvbGwpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImRlYnVnX3Njcm9sbCIpID09IHApIHsKLQkJQ09MT05fQ0hFQ0soImRlYnVnX3Njcm9sbDoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywKLQkJCSAgICBkZWJ1Z19zY3JvbGwpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJcCArPSBzdHJsZW4oImRlYnVnX3Njcm9sbDoiKTsKLQkJZGVidWdfc2Nyb2xsID0gYXRvaShwKTsKLQkJcmZiTG9nKCJzZXQgZGVidWdfc2Nyb2xsIHRvOiAlZFxuIiwgZGVidWdfc2Nyb2xsKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZGVidWdfdGlsZXMiKSB8fCAhc3RyY21wKHAsICJkYnQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIGRlYnVnX3RpbGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3RpbGVzID0gMTsKLQkJcmZiTG9nKCJzZXQgZGVidWdfdGlsZXMgdG86ICVkXG4iLCBkZWJ1Z190aWxlcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm5vZGVidWdfdGlsZXMiKSB8fCAhc3RyY21wKHAsICJub2RidCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWRlYnVnX3RpbGVzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWRlYnVnX3RpbGVzID0gMDsKLQkJcmZiTG9nKCJzZXQgZGVidWdfdGlsZXMgdG86ICVkXG4iLCBkZWJ1Z190aWxlcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAiZGVidWdfdGlsZXMiKSA9PSBwKSB7Ci0JCUNPTE9OX0NIRUNLKCJkZWJ1Z190aWxlczoiKQotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lcyVzJWQiLCBwLCBjbywKLQkJCSAgICBkZWJ1Z190aWxlcyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiZGVidWdfdGlsZXM6Iik7Ci0JCWRlYnVnX3RpbGVzID0gYXRvaShwKTsKLQkJcmZiTG9nKCJzZXQgZGVidWdfdGlsZXMgdG86ICVkXG4iLCBkZWJ1Z190aWxlcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgImRlYnVnX2dyYWJzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBkZWJ1Z19ncmFicyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlkZWJ1Z19ncmFicyA9IDE7Ci0JCXJmYkxvZygic2V0IGRlYnVnX2dyYWJzIHRvOiAlZFxuIiwgZGVidWdfZ3JhYnMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RlYnVnX2dyYWJzIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhZGVidWdfZ3JhYnMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZGVidWdfZ3JhYnMgPSAwOwotCQlyZmJMb2coInNldCBkZWJ1Z19ncmFicyB0bzogJWRcbiIsIGRlYnVnX2dyYWJzKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZGVidWdfc2VsIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBkZWJ1Z19zZWwpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZGVidWdfc2VsID0gMTsKLQkJcmZiTG9nKCJzZXQgZGVidWdfc2VsIHRvOiAlZFxuIiwgZGVidWdfc2VsKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9kZWJ1Z19zZWwiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFkZWJ1Z19zZWwpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJZGVidWdfc2VsID0gMDsKLQkJcmZiTG9nKCJzZXQgZGVidWdfc2VsIHRvOiAlZFxuIiwgZGVidWdfc2VsKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAiZGJnIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBjcmFzaF9kZWJ1Zyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQljcmFzaF9kZWJ1ZyA9IDE7Ci0JCXJmYkxvZygic2V0IGNyYXNoX2RlYnVnIHRvOiAlZFxuIiwgY3Jhc2hfZGVidWcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJub2RiZyIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIWNyYXNoX2RlYnVnKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWNyYXNoX2RlYnVnID0gMDsKLQkJcmZiTG9nKCJzZXQgY3Jhc2hfZGVidWcgdG86ICVkXG4iLCBjcmFzaF9kZWJ1Zyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm1hY25vc2F2ZXIiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG1hY29zeF9ub3NjcmVlbnNhdmVyKTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuIG9uIG1hY25vc2F2ZXIuXG4iKTsKLQkJbWFjb3N4X25vc2NyZWVuc2F2ZXIgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJtYWNzYXZlciIpIHx8ICFzdHJjbXAocCwgIm5vbWFjbm9zYXZlciIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW1hY29zeF9ub3NjcmVlbnNhdmVyKTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiB0dXJuIG9mZiBtYWNub3NhdmVyLlxuIik7Ci0JCW1hY29zeF9ub3NjcmVlbnNhdmVyID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibWFjbm93YWl0IikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCAhbWFjb3N4X3dhaXRfZm9yX3N3aXRjaCk7IGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZGlzYWJsZSBtYWNvc3hfd2FpdF9mb3Jfc3dpdGNoLlxuIik7Ci0JCW1hY29zeF93YWl0X2Zvcl9zd2l0Y2ggPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJtYWN3YWl0IikgfHwgIXN0cmNtcChwLCAibm9tYWNub3dhaXQiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG1hY29zeF93YWl0X2Zvcl9zd2l0Y2gpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsZSBtYWNvc3hfd2FpdF9mb3Jfc3dpdGNoLlxuIik7Ci0JCW1hY29zeF93YWl0X2Zvcl9zd2l0Y2ggPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIm1hY3doZWVsIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygibWFjd2hlZWw6IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIG1hY29zeF9tb3VzZV93aGVlbF9zcGVlZCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigibWFjd2hlZWw6Iik7Ci0JCW1hY29zeF9tb3VzZV93aGVlbF9zcGVlZCA9IGF0b2kocCk7Ci0JCXJmYkxvZygic2V0IG1hY29zeF9tb3VzZV93aGVlbF9zcGVlZCB0bzogJWRcbiIsIG1hY29zeF9tb3VzZV93aGVlbF9zcGVlZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm1hY25vc3dhcCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW1hY29zeF9zd2FwMjMpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGUgbWFjb3N4X3N3YXAyMy5cbiIpOwotCQltYWNvc3hfc3dhcDIzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibWFjc3dhcCIpIHx8ICFzdHJjbXAocCwgIm5vbWFjbm9zd2FwIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBtYWNvc3hfc3dhcDIzKTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgbWFjb3N4X3N3YXAyMy5cbiIpOwotCQltYWNvc3hfc3dhcDIzID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibWFjbm9yZXNpemUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFtYWNvc3hfcmVzaXplKTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBkaXNhYmxlIG1hY29zeF9yZXNpemUuXG4iKTsKLQkJbWFjb3N4X3Jlc2l6ZSA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm1hY3Jlc2l6ZSIpIHx8ICFzdHJjbXAocCwgIm5vbWFjbm9yZXNpemUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG1hY29zeF9yZXNpemUpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGVuYWJsZSBtYWNvc3hfcmVzaXplLlxuIik7Ci0JCW1hY29zeF9yZXNpemUgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIm1hY2ljb25hbmltIikgPT0gcCkgewotCQlDT0xPTl9DSEVDSygibWFjaWNvbmFuaW06IikKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXMlcyVkIiwgcCwgY28sIG1hY29zeF9pY29uX2FuaW1fdGltZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigibWFjaWNvbmFuaW06Iik7Ci0JCW1hY29zeF9pY29uX2FuaW1fdGltZSA9IGF0b2kocCk7Ci0JCXJmYkxvZygic2V0IG1hY29zeF9pY29uX2FuaW1fdGltZSB0bzogJWRcbiIsIG1hY29zeF9pY29uX2FuaW1fdGltZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm1hY21lbnUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsIG1hY29zeF9uY2FjaGVfbWFjbWVudSk7IGdvdG8gcXJ5OwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogZW5hYmxlIG1hY29zeF9uY2FjaGVfbWFjbWVudS5cbiIpOwotCQltYWNvc3hfbmNhY2hlX21hY21lbnUgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghc3RyY21wKHAsICJtYWNub21lbnUiKSB8fCAhc3RyY21wKHAsICJub21hY21lbnUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsICFtYWNvc3hfbmNhY2hlX21hY21lbnUpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGUgbWFjb3N4X25jYWNoZV9tYWNtZW51LlxuIik7Ci0JCW1hY29zeF9uY2FjaGVfbWFjbWVudSA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKCFzdHJjbXAocCwgIm1hY3Vza2JkIikpIHsKLQkJaWYgKHF1ZXJ5KSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhbnM9JXM6JWQiLCBwLCBtYWNvc3hfdXNfa2JkKTsgZ290byBxcnk7Ci0JCX0KLQkJcmZiTG9nKCJyZW1vdGVfY21kOiBlbmFibGUgbWFjb3N4X3VzX2tiZC5cbiIpOwotCQltYWNvc3hfdXNfa2JkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9tYWN1c2tiZCIpKSB7Ci0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzOiVkIiwgcCwgIW1hY29zeF91c19rYmQpOyBnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGUgbWFjb3N4X3VzX2tiZC5cbiIpOwotCQltYWNvc3hfdXNfa2JkID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc3Ryc3RyKHAsICJoYWNrIikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCUNPTE9OX0NIRUNLKCJoYWNrOiIpCi0JCWlmIChxdWVyeSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYW5zPSVzJXMlZCIsIHAsIGNvLCBoYWNrX3ZhbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlwICs9IHN0cmxlbigiaGFjazoiKTsKLQkJaGFja192YWwgPSBhdG9pKHApOwotCQlyZmJMb2coInNldCBoYWNrX3ZhbCB0bzogJWRcbiIsIGhhY2tfdmFsKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXN0cmNtcChwLCAibm9yZW1vdGUiKSkgewotCQlpZiAocXVlcnkpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFucz0lczolZCIsIHAsCi0JCQkgICAgIWFjY2VwdF9yZW1vdGVfY21kcyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9jbWQ6IGRpc2FibGluZyByZW1vdGUgY29tbWFuZHMuXG4iKTsKLQkJYWNjZXB0X3JlbW90ZV9jbWRzID0gMDsgLyogY2Fubm90IGJlIHR1cm5lZCBiYWNrIG9uLiAqLwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgImNsaWVudF9pbmZvX3NvY2siKSA9PSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJTk9UQVBQCi0JCXAgKz0gc3RybGVuKCJjbGllbnRfaW5mb19zb2NrOiIpOwotCQlpZiAoKnAgIT0gJ1wwJykgewotCQkJc3RhcnRfY2xpZW50X2luZm9fc29jayhwKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgIm5vb3AiKSA9PSBwKSB7Ci0JCU5PVEFQUAotCQlyZmJMb2coInJlbW90ZV9jbWQ6IG5vb3BcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChpY29uX21vZGUgJiYgIXF1ZXJ5ICYmIHN0cnN0cihwLCAicGFzc3dkIikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCWNoYXIgKipwYXNzd2RzX25ldyA9IChjaGFyICoqKSBtYWxsb2MoMypzaXplb2YoY2hhciAqKSk7Ci0JCWNoYXIgKipwYXNzd2RzX29sZCA9IChjaGFyICoqKSBzY3JlZW4tPmF1dGhQYXNzd2REYXRhOwotCi0JCUNPTE9OX0NIRUNLKCJwYXNzd2Q6IikKLQkJcCArPSBzdHJsZW4oInBhc3N3ZDoiKTsKLQotCQlwYXNzd2RzX25ld1swXSA9IHN0cmR1cChwKTsKLQotCQkvKiBtdXRleCAqLwotCQlpZiAoc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSAmJgotCQkgICAgc2NyZWVuLT5wYXNzd29yZENoZWNrID09IHJmYkNoZWNrUGFzc3dvcmRCeUxpc3QpIHsKLQkJCQlwYXNzd2RzX25ld1sxXSA9IHBhc3N3ZHNfb2xkWzFdOwotCQl9IGVsc2UgewotCQkJcGFzc3dkc19uZXdbMV0gPSBOVUxMOwotCQkJc2NyZWVuLT5wYXNzd29yZENoZWNrID0gcmZiQ2hlY2tQYXNzd29yZEJ5TGlzdDsKLQkJfQotCQlwYXNzd2RzX25ld1syXSA9IE5VTEw7Ci0KLQkJc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSA9ICh2b2lkKikgcGFzc3dkc19uZXc7Ci0JCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQlzY3JlZW4tPmF1dGhQYXNzd2REYXRhID0gKHZvaWQqKSBOVUxMOwotCQl9Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCBmdWxsIGFjY2VzcyBwYXNzd2QuXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoaWNvbl9tb2RlICYmICFxdWVyeSAmJiBzdHJzdHIocCwgInZpZXdwYXNzd2QiKSA9PSBwKSB7IC8qIHNraXAtY21kLWxpc3QgKi8KLQkJY2hhciAqKnBhc3N3ZHNfbmV3ID0gKGNoYXIgKiopIG1hbGxvYygzKnNpemVvZihjaGFyICopKTsKLQkJY2hhciAqKnBhc3N3ZHNfb2xkID0gKGNoYXIgKiopIHNjcmVlbi0+YXV0aFBhc3N3ZERhdGE7Ci0JCQotCQlDT0xPTl9DSEVDSygidmlld3Bhc3N3ZDoiKQotCQlwICs9IHN0cmxlbigidmlld3Bhc3N3ZDoiKTsKLQotCQlwYXNzd2RzX25ld1sxXSA9IHN0cmR1cChwKTsKLQotCQlpZiAoc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSAmJgotCQkgICAgc2NyZWVuLT5wYXNzd29yZENoZWNrID09IHJmYkNoZWNrUGFzc3dvcmRCeUxpc3QpIHsKLQkJCQlwYXNzd2RzX25ld1swXSA9IHBhc3N3ZHNfb2xkWzBdOwotCQl9IGVsc2UgewotCQkJY2hhciAqdG1wID0gKGNoYXIgKikgbWFsbG9jKDQgKyBDSEFMTEVOR0VTSVpFKTsKLQkJCXJmYlJhbmRvbUJ5dGVzKCh1bnNpZ25lZCBjaGFyKil0bXApOwotCQkJcGFzc3dkc19uZXdbMF0gPSB0bXA7Ci0JCQlzY3JlZW4tPnBhc3N3b3JkQ2hlY2sgPSByZmJDaGVja1Bhc3N3b3JkQnlMaXN0OwotCQl9Ci0JCXBhc3N3ZHNfbmV3WzJdID0gTlVMTDsKLQotCQlpZiAoKnAgPT0gJ1wwJykgewotCQkJcGFzc3dkc19uZXdbMV0gPSBOVUxMOwotCQl9Ci0KLQkJc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSA9ICh2b2lkKikgcGFzc3dkc19uZXc7Ci0JCXJmYkxvZygicmVtb3RlX2NtZDogY2hhbmdlZCB2aWV3IG9ubHkgcGFzc3dkLlxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHN0cnN0cihwLCAidHJheWVtYmVkIikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCXVuc2lnbmVkIGxvbmcgaWQ7Ci0JCU5PVEFQUAotCi0JCUNPTE9OX0NIRUNLKCJ0cmF5ZW1iZWQ6IikKLQkJcCArPSBzdHJsZW4oInRyYXllbWJlZDoiKTsKLQkJaWYgKHNjYW5faGV4ZGVjKHAsICZpZCkpIHsKLQkJCXRyYXlfcmVxdWVzdCA9IChXaW5kb3cpIGlkOwotCQkJdHJheV91bmVtYmVkID0gMDsKLQkJCXJmYkxvZygicmVtb3RlX2NtZDogd2lsbCB0cnkgdG8gZW1iZWQgMHgleCBpbiIKLQkJCSAgICAiIHRoZSBzeXN0ZW0gdHJheS5cbiIsIGlkKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzdHJzdHIocCwgInRyYXl1bmVtYmVkIikgPT0gcCkgeyAvKiBza2lwLWNtZC1saXN0ICovCi0JCXVuc2lnbmVkIGxvbmcgaWQ7Ci0JCU5PVEFQUAotCi0JCUNPTE9OX0NIRUNLKCJ0cmF5dW5lbWJlZDoiKQotCQlwICs9IHN0cmxlbigidHJheXVuZW1iZWQ6Iik7Ci0JCWlmIChzY2FuX2hleGRlYyhwLCAmaWQpKSB7Ci0JCQl0cmF5X3JlcXVlc3QgPSAoV2luZG93KSBpZDsKLQkJCXRyYXlfdW5lbWJlZCA9IDE7Ci0JCQlyZmJMb2coInJlbW90ZV9jbWQ6IHdpbGwgdHJ5IHRvIHVuZW1iZWQgMHgleCBvdXQiCi0JCQkgICAgIiBvZiB0aGUgc3lzdGVtIHRyYXkuXG4iLCBpZCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlpZiAocXVlcnkpIHsKLQkJLyogcmVhZC1vbmx5IHZhcmlhYmxlcyB0aGF0IGNhbiBvbmx5IGJlIHF1ZXJpZWQ6ICovCi0KLQkJaWYgKCFzdHJjbXAocCwgImRpc3BsYXkiKSkgewotCQkJaWYgKHJhd19mYikgewotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczpyYXdmYjolcCIsCi0JCQkJICAgIHAsIHJhd19mYl9hZGRyKTsKLQkJCX0gZWxzZSBpZiAoISBkcHkpIHsKLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6IiwgcCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoYXIgKmQ7Ci0JCQkJZCA9IERpc3BsYXlTdHJpbmcoZHB5KTsKLQkJCQlpZiAoISBkKSBkID0gInVua25vd24iOwotCQkJCWlmICgqZCA9PSAnOicpIHsKLQkJCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzJXMiLCBwLAotCQkJCQkgICAgdGhpc19ob3N0KCksIGQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsIGQpOwotCQkJCX0KLQkJCX0KLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJ2bmNkaXNwbGF5IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsCi0JCQkgICAgTk9OVUwodm5jX2Rlc2t0b3BfbmFtZSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImljb25fbW9kZSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBpY29uX21vZGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImF1dG9wb3J0IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGF1dG9fcG9ydCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAibG9vcCIpIHx8ICFzdHJjbXAocCwgImxvb3BiZyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCAwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJkZXNrdG9wbmFtZSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLAotCQkJICAgIE5PTlVMKHJmYl9kZXNrdG9wX25hbWUpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJndWVzc19kZXNrdG9wIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsCi0JCQkgICAgTk9OVUwoZ3Vlc3NfZGVza3RvcCgpKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZ3Vlc3NfZGJ1cyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLAotCQkJICAgIE5PTlVMKGRidXNfc2Vzc2lvbigpKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiaHR0cF91cmwiKSkgewotCQkJaWYgKCFzY3JlZW4pIHsKLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6IiwgcCk7Ci0JCQl9IGVsc2UgaWYgKHNjcmVlbi0+aHR0cExpc3RlblNvY2sgPiAtMSkgewotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczpodHRwOi8vJXM6JWQiLCBwLAotCQkJCSAgICBOT05VTChzY3JlZW4tPnRoaXNIb3N0KSwgc2NyZWVuLT5odHRwUG9ydCk7Ci0JCQl9IGVsc2UgewotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsCi0JCQkJICAgICJodHRwX25vdF9hY3RpdmUiKTsKLQkJCX0KLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJhdXRoIikgfHwgIXN0cmNtcChwLCAieGF1dGgiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwoYXV0aF9maWxlKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAidXNlcnMiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwodXNlcnNfbGlzdCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInJvb3RzaGlmdCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCByb290c2hpZnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImNsaXBzaGlmdCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBjbGlwc2hpZnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNjYWxlX3N0ciIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBOT05VTChzY2FsZV9zdHIpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJzY2FsZWRfeCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBzY2FsZWRfeCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic2NhbGVkX3kiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgc2NhbGVkX3kpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNjYWxlX251bWVyIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHNjYWxlX251bWVyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJzY2FsZV9kZW5vbSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBzY2FsZV9kZW5vbSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic2NhbGVfZmFjX3giKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVmIiwgcCwgc2NhbGVfZmFjX3gpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNjYWxlX2ZhY195IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZiIsIHAsIHNjYWxlX2ZhY195KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJzY2FsaW5nX2JsZW5kIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHNjYWxpbmdfYmxlbmQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNjYWxpbmdfbm9tdWx0NCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBzY2FsaW5nX25vbXVsdDQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNjYWxpbmdfcGFkIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHNjYWxpbmdfcGFkKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJzY2FsaW5nX2ludGVycG9sYXRlIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsCi0JCQkgICAgc2NhbGluZ19pbnRlcnBvbGF0ZSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiaW5ldGQiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgaW5ldGQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInByaXZyZW1vdGUiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgcHJpdl9yZW1vdGUpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInVuc2FmZSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCAhc2FmZV9yZW1vdGVfb25seSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic2FmZXIiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgbW9yZV9zYWZlKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJub2NtZHMiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgbm9fZXh0ZXJuYWxfY21kcyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAicGFzc3dkZmlsZSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBOT05VTChwYXNzd2RmaWxlKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAidW5peHB3IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHVuaXhwdyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAidW5peHB3X25pcyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB1bml4cHdfbmlzKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJ1bml4cHdfbGlzdCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBOT05VTCh1bml4cHdfbGlzdCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNzbCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB1c2Vfb3BlbnNzbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic3NsX3BlbSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBOT05VTChvcGVuc3NsX3BlbSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNzbHZlcmlmeSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBOT05VTChzc2xfdmVyaWZ5KSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic3R1bm5lbCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB1c2Vfc3R1bm5lbCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAic3R1bm5lbF9wZW0iKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwoc3R1bm5lbF9wZW0pKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJodHRwcyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBodHRwc19wb3J0X251bSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiaHR0cHNyZWRpciIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBodHRwc19wb3J0X3JlZGlyKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJ1c2VwdyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB1c2Vwdyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAidXNpbmdfc2htIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsICF1c2luZ19zaG0pOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImxvZ2ZpbGUiKSB8fCAhc3RyY21wKHAsICJvIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsIE5PTlVMKGxvZ2ZpbGUpKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJmbGFnIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsIE5PTlVMKGZsYWdmaWxlKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAicm1mbGFnIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsIE5PTlVMKHJtX2ZsYWdmaWxlKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAicmMiKSkgewotCQkJY2hhciAqcyA9IHJjX3JjZmlsZTsKLQkJCWlmIChyY19yY2ZpbGVfZGVmYXVsdCkgewotCQkJCXMgPSBOVUxMOwotCQkJfQotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwocykpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIm5vcmMiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgZ290X25vcmMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImgiKSB8fCAhc3RyY21wKHAsICJoZWxwIikgfHwKLQkJICAgICFzdHJjbXAocCwgIlYiKSB8fCAhc3RyY21wKHAsICJ2ZXJzaW9uIikgfHwKLQkJICAgICFzdHJjbXAocCwgImxhc3Rtb2QiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwobGFzdG1vZCkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImJnIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIG9wdHNfYmcpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInNpZ3BpcGUiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVzIiwgcCwgTk9OVUwoc2lncGlwZSkpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInRocmVhZHMiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgdXNlX3RocmVhZHMpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInJlYWRyYXRlIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGdldF9yZWFkX3JhdGUoKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAibmV0cmF0ZSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBnZXRfbmV0X3JhdGUoKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAibmV0bGF0ZW5jeSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBnZXRfbmV0X2xhdGVuY3koKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAicGlwZWlucHV0IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolcyIsIHAsCi0JCQkgICAgTk9OVUwocGlwZWlucHV0X3N0cikpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImNsaWVudHMiKSkgewotCQkJY2hhciAqc3RyID0gbGlzdF9jbGllbnRzKCk7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JXMiLCBwLCBzdHIpOwotCQkJZnJlZShzdHIpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImNsaWVudF9jb3VudCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBjbGllbnRfY291bnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInBpZCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCAoaW50KSBnZXRwaWQoKSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZXh0X3h0ZXN0IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHh0ZXN0X3ByZXNlbnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImV4dF94dHJhcCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB4dHJhcF9wcmVzZW50KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJleHRfeHJlY29yZCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB4cmVjb3JkX3ByZXNlbnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImV4dF94a2IiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgeGtiX3ByZXNlbnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImV4dF94c2htIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHhzaG1fcHJlc2VudCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZXh0X3hpbmVyYW1hIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHhpbmVyYW1hX3ByZXNlbnQpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImV4dF9vdmVybGF5IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIG92ZXJsYXlfcHJlc2VudCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZXh0X3hmaXhlcyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB4Zml4ZXNfcHJlc2VudCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZXh0X3hkYW1hZ2UiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgeGRhbWFnZV9wcmVzZW50KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJleHRfeHJhbmRyIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHhyYW5kcl9wcmVzZW50KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJyb290d2luIikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczoweCV4IiwgcCwKLQkJCSAgICAodW5zaWduZWQgaW50KSByb290d2luKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJudW1fYnV0dG9ucyIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBudW1fYnV0dG9ucyk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiYnV0dG9uX21hc2siKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgYnV0dG9uX21hc2spOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIm1vdXNlX3giKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgY3Vyc29yX3gpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIm1vdXNlX3kiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgY3Vyc29yX3kpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgImdyYWJfc3RhdGUiKSkgewotCQkJaW50IHB0cl9ncmFiYmVkLCBrYmRfZ3JhYmJlZDsKLQotCQkJZ3JhYl9zdGF0ZSgmcHRyX2dyYWJiZWQsICZrYmRfZ3JhYmJlZCk7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQsJWQiLCBwLCBwdHJfZ3JhYmJlZCwga2JkX2dyYWJiZWQpOwotCQkJaWYgKGRweSAmJiByY19ucGllY2VzIDwgMTApIHsKLQkJCQlyZmJMb2coInJlbW90ZV9jbWQ6IHB0cixrYmQ6ICVzXG4iLCBidWYpOwotCQkJfQotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInBvaW50ZXJfcG9zIikgfHwgIXN0cmNtcChwLCAicG9pbnRlcl94IikgfHwgIXN0cmNtcChwLCAicG9pbnRlcl95IikgfHwgIXN0cmNtcChwLCAicG9pbnRlcl9zYW1lIikgfHwgIXN0cmNtcChwLCAicG9pbnRlcl9yb290IikgfHwgIXN0cmNtcChwLCAicG9pbnRlcl9tYXNrIikpIHsKLQkJCWludCBweCA9IC0xLCBweSA9IC0xOyAKLQkJCWludCB3eCwgd3k7Ci0JCQl1bnNpZ25lZCBpbnQgbSA9IDA7Ci0JCQlXaW5kb3cgciwgYzsKLQkJCUJvb2wgc2FtZV9zY3JlZW4gPSBUcnVlOwotCQkJCi0KLQkJCWlmICghc3RyY21wKHAsICJwb2ludGVyX3BvcyIpKSB7CQkJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCwlZCIsIHAsIHB4LCBweSk7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInBvaW50ZXJfeCIpKSB7CQkJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHB4KTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAicG9pbnRlcl95IikpIHsJCQkvKiBza2lwLWNtZC1saXN0ICovCi0JCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgcHkpOwotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJwb2ludGVyX3NhbWUiKSkgewkJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHNhbWVfc2NyZWVuKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAicG9pbnRlcl9yb290IikpIHsJCS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6MHgleCIsIHAsICh1bnNpZ25lZCBpbnQpIHJvb3R3aW4pOwotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJwb2ludGVyX21hc2siKSkgewkJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczoweCV4IiwgcCwgbSk7Ci0JCQl9IAotCQkJaWYgKCFkcHkpIHsKLQkJCQlnb3RvIHFyeTsKLQkJCX0KLSNpZiBOT19YMTEKLQkJCWdvdG8gcXJ5OwotI2Vsc2UKLQkJCVhfTE9DSzsKLQkJCXNhbWVfc2NyZWVuID0gWFF1ZXJ5UG9pbnRlcl93cihkcHksIHJvb3R3aW4sICZyLCAmYywgJnB4LCAmcHksICZ3eCwgJnd5LCAmbSk7Ci0JCQlYX1VOTE9DSzsKLSNlbmRpZgotCi0JCQlpZiAoIXN0cmNtcChwLCAicG9pbnRlcl9wb3MiKSkgewkJCS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQsJWQiLCBwLCBweCwgcHkpOwotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJwb2ludGVyX3giKSkgewkJCS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBweCk7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInBvaW50ZXJfeSIpKSB7CQkJLyogc2tpcC1jbWQtbGlzdCAqLwotCQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIHB5KTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAicG9pbnRlcl9zYW1lIikpIHsJCS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBzYW1lX3NjcmVlbik7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInBvaW50ZXJfcm9vdCIpKSB7CQkvKiBza2lwLWNtZC1saXN0ICovCi0JCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOjB4JXgiLCBwLCAodW5zaWduZWQgaW50KSByKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAicG9pbnRlcl9tYXNrIikpIHsJCS8qIHNraXAtY21kLWxpc3QgKi8KLQkJCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6MHgleCIsIHAsIG0pOwotCQkJfSAKLQkJCWlmIChyY19ucGllY2VzIDwgMTApIHsKLQkJCQlyZmJMb2coInJlbW90ZV9jbWQ6ICVzOiAlc1xuIiwgcCwgYnVmKTsKLQkJCX0KLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJicHAiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgYnBwKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJkZXB0aCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBkZXB0aCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiaW5kZXhlZF9jb2xvciIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBpbmRleGVkX2NvbG9yKTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJkcHlfeCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBkcHlfeCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiZHB5X3kiKSkgewotCQkJc25wcmludGYoYnVmLCBidWZuLCAiYXJvPSVzOiVkIiwgcCwgZHB5X3kpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIndkcHlfeCIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB3ZHB5X3gpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIndkcHlfeSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCB3ZHB5X3kpOwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgIm9mZl94IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIG9mZl94KTsKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICghc3RyY21wKHAsICJvZmZfeSIpKSB7Ci0JCQlzbnByaW50ZihidWYsIGJ1Zm4sICJhcm89JXM6JWQiLCBwLCBvZmZfeSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiY2RweV94IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGNkcHlfeCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiY2RweV95IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGNkcHlfeSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiY29mZl94IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGNvZmZfeCk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAiY29mZl95IikpIHsKLQkJCXNucHJpbnRmKGJ1ZiwgYnVmbiwgImFybz0lczolZCIsIHAsIGNvZmZfeSk7Ci0JCQlnb3RvIHFyeTsKLQkJfQotCQlpZiAoIXN0cmNtcChwLCAicmZiYXV0aCIpKSB7Ci0JCQlOT1RBUFBSTwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInBhc3N3ZCIpKSB7Ci0JCQlOT1RBUFBSTwotCQkJZ290byBxcnk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAocCwgInZpZXdwYXNzd2QiKSkgewotCQkJTk9UQVBQUk8KLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWlmICgxKSB7Ci0JCQlOT1RBUFAKLQkJCWdvdG8gcXJ5OwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKDEpIHsKLQkJY2hhciB0bXBbMTAwXTsKLQkJTk9UQVBQCi0JCXJmYkxvZygicmVtb3RlX2NtZDogd2FybmluZyB1bmtub3duXG4iKTsKLQkJc3RybmNweSh0bXAsIHAsIDkwKTsKLQkJcmZiTG9nKCJjb21tYW5kIFwiJXNcIlxuIiwgdG1wKTsKLQkJZ290byBkb25lOwotCX0KLQotCWRvbmU6Ci0KLQlpZiAoKmJ1ZiA9PSAnXDAnKSB7Ci0JCXNwcmludGYoYnVmLCAiJXMiLCAiYWNrPTEiKTsKLQl9Ci0KLQlxcnk6Ci0KLQlpZiAoc3RyaW5nb25seSkgewotCQlyZXR1cm4gc3RyZHVwKGJ1Zik7Ci0JfSBlbHNlIGlmIChjbGllbnRfY29ubmVjdF9maWxlKSB7Ci0JCUZJTEUgKm91dCA9IGZvcGVuKGNsaWVudF9jb25uZWN0X2ZpbGUsICJ3Iik7Ci0JCWlmIChvdXQgIT0gTlVMTCkgewotCQkJZnByaW50ZihvdXQsICIlc1xuIiwgYnVmKTsKLQkJCWZjbG9zZShvdXQpOwotCQkJdXNsZWVwKDIwKjEwMDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGRweSkgewkvKiByYXdfZmIgaGFjayAqLwotCQkJWF9MT0NLOwotCQkJc2V0X3gxMXZuY19yZW1vdGVfcHJvcChidWYpOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlYX1VOTE9DSzsKLQkJfQotCX0KLSNlbmRpZgkvKiBSRU1PVEVfQ09OVFJPTCAqLwotCXJldHVybiBOVUxMOwotfQotCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9yZW1vdGUuaCBiL3gxMXZuYy9yZW1vdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyZGVhMi4uMDAwMDAwMAotLS0gYS94MTF2bmMvcmVtb3RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19SRU1PVEVfSAotI2RlZmluZSBfWDExVk5DX1JFTU9URV9ICi0KLS8qIC0tIHJlbW90ZS5oIC0tICovCi0KLWV4dGVybiBpbnQgc2VuZF9yZW1vdGVfY21kKGNoYXIgKmNtZCwgaW50IHF1ZXJ5LCBpbnQgd2FpdCk7Ci1leHRlcm4gaW50IGRvX3JlbW90ZV9xdWVyeShjaGFyICpyZW1vdGVfY21kLCBjaGFyICpxdWVyeV9jbWQsIGludCByZW1vdGVfc3luYywKLSAgICBpbnQgcWRlZmF1bHQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfYmxhY2tfZmIodm9pZCk7Ci1leHRlcm4gaW50IGNoZWNrX2h0dHBkaXIodm9pZCk7Ci1leHRlcm4gdm9pZCBodHRwX2Nvbm5lY3Rpb25zKGludCBvbik7Ci1leHRlcm4gaW50IHJlbW90ZV9jb250cm9sX2FjY2Vzc19vayh2b2lkKTsKLWV4dGVybiBjaGFyICpwcm9jZXNzX3JlbW90ZV9jbWQoY2hhciAqY21kLCBpbnQgc3RyaW5nb25seSk7Ci0KLWV4dGVybiBjaGFyICpxdWVyeV9yZXN1bHQ7Ci0KLQotI2VuZGlmIC8qIF9YMTFWTkNfUkVNT1RFX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9zY2FuLmMgYi94MTF2bmMvc2Nhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI3ODgzLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zY2FuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjg3ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gc2Nhbi5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4aW5lcmFtYS5oIgotI2luY2x1ZGUgInh3cmFwcGVycy5oIgotI2luY2x1ZGUgInhkYW1hZ2UuaCIKLSNpbmNsdWRlICJ4cmFuZHIuaCIKLSNpbmNsdWRlICJ3aW5fdXRpbHMuaCIKLSNpbmNsdWRlICI4dG8yNC5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgInBvaW50ZXIuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAic2NyZWVuLmgiCi0jaW5jbHVkZSAibWFjb3N4LmgiCi0jaW5jbHVkZSAidXNlcmlucHV0LmgiCi0KLS8qCi0gKiByb3V0aW5lcyBmb3Igc2Nhbm5pbmcgYW5kIHJlYWRpbmcgdGhlIFgxMSBkaXNwbGF5IGZvciBjaGFuZ2VzLCBhbmQKLSAqIGZvciBkb2luZyBhbGwgdGhlIHRpbGUgd29yayAoc2htLCBldGMpLgotICovCi12b2lkIGluaXRpYWxpemVfdGlsZXModm9pZCk7Ci12b2lkIGZyZWVfdGlsZXModm9pZCk7Ci12b2lkIHNobV9kZWxldGUoWFNobVNlZ21lbnRJbmZvICpzaG0pOwotdm9pZCBzaG1fY2xlYW4oWFNobVNlZ21lbnRJbmZvICpzaG0sIFhJbWFnZSAqeGltKTsKLXZvaWQgaW5pdGlhbGl6ZV9wb2xsaW5nX2ltYWdlcyh2b2lkKTsKLXZvaWQgc2NhbGVfcmVjdChkb3VibGUgZmFjdG9yX3gsIGRvdWJsZSBmYWN0b3JfeSwgaW50IGJsZW5kLCBpbnQgaW50ZXJwb2xhdGUsIGludCBCcHAsCi0gICAgY2hhciAqc3JjX2ZiLCBpbnQgc3JjX2J5dGVzX3Blcl9saW5lLCBjaGFyICpkc3RfZmIsIGludCBkc3RfYnl0ZXNfcGVyX2xpbmUsCi0gICAgaW50IE54LCBpbnQgTnksIGludCBueCwgaW50IG55LCBpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIsIGludCBtYXJrKTsKLXZvaWQgc2NhbGVfYW5kX21hcmtfcmVjdChpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIsIGludCBtYXJrKTsKLXZvaWQgbWFya19yZWN0X2FzX21vZGlmaWVkKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGZvcmNlKTsKLWludCBjb3B5X3NjcmVlbih2b2lkKTsKLWludCBjb3B5X3NuYXAodm9pZCk7Ci12b2lkIG5hcF9zbGVlcChpbnQgbXMsIGludCBzcGxpdCk7Ci12b2lkIHNldF9vZmZzZXQodm9pZCk7Ci1pbnQgc2Nhbl9mb3JfdXBkYXRlcyhpbnQgY291bnRfb25seSk7Ci12b2lkIHJvdGF0ZV9jdXJzKGNoYXIgKmRzdF8wLCBjaGFyICpzcmNfMCwgaW50IER4LCBpbnQgRHksIGludCBCcHApOwotdm9pZCByb3RhdGVfY29vcmRzKGludCB4LCBpbnQgeSwgaW50ICp4bywgaW50ICp5bywgaW50IGR4aSwgaW50IGR5aSk7Ci12b2lkIHJvdGF0ZV9jb29yZHNfaW52ZXJzZShpbnQgeCwgaW50IHksIGludCAqeG8sIGludCAqeW8sIGludCBkeGksIGludCBkeWkpOwotCi1zdGF0aWMgdm9pZCBzZXRfZnNfZmFjdG9yKGludCBtYXgpOwotc3RhdGljIGNoYXIgKmZsaXBfeGltYWdlX2J5dGVfb3JkZXIoWEltYWdlICp4aW0pOwotc3RhdGljIGludCBzaG1fY3JlYXRlKFhTaG1TZWdtZW50SW5mbyAqc2htLCBYSW1hZ2UgKip4aW1nX3B0ciwgaW50IHcsIGludCBoLAotICAgIGNoYXIgKm5hbWUpOwotc3RhdGljIHZvaWQgY3JlYXRlX3RpbGVfaGludChpbnQgeCwgaW50IHksIGludCB0dywgaW50IHRoLCBoaW50X3QgKmhpbnQpOwotc3RhdGljIHZvaWQgZXh0ZW5kX3RpbGVfaGludChpbnQgeCwgaW50IHksIGludCB0dywgaW50IHRoLCBoaW50X3QgKmhpbnQpOwotc3RhdGljIHZvaWQgc2F2ZV9oaW50KGhpbnRfdCBoaW50LCBpbnQgbG9jKTsKLXN0YXRpYyB2b2lkIGhpbnRfdXBkYXRlcyh2b2lkKTsKLXN0YXRpYyB2b2lkIG1hcmtfaGludChoaW50X3QgaGludCk7Ci1zdGF0aWMgaW50IGNvcHlfdGlsZXMoaW50IHR4LCBpbnQgdHksIGludCBudCk7Ci1zdGF0aWMgaW50IGNvcHlfYWxsX3RpbGVzKHZvaWQpOwotc3RhdGljIGludCBjb3B5X2FsbF90aWxlX3J1bnModm9pZCk7Ci1zdGF0aWMgaW50IGNvcHlfdGlsZXNfYmFja3dhcmRfcGFzcyh2b2lkKTsKLXN0YXRpYyBpbnQgY29weV90aWxlc19hZGRpdGlvbmFsX3Bhc3Modm9pZCk7Ci1zdGF0aWMgaW50IGdhcF90cnkoaW50IHgsIGludCB5LCBpbnQgKnJ1biwgaW50ICpzYXcsIGludCBhbG9uZ194KTsKLXN0YXRpYyBpbnQgZmlsbF90aWxlX2dhcHModm9pZCk7Ci1zdGF0aWMgaW50IGlzbGFuZF90cnkoaW50IHgsIGludCB5LCBpbnQgdSwgaW50IHYsIGludCAqcnVuKTsKLXN0YXRpYyBpbnQgZ3Jvd19pc2xhbmRzKHZvaWQpOwotc3RhdGljIHZvaWQgYmxhY2tvdXRfcmVnaW9ucyh2b2lkKTsKLXN0YXRpYyB2b2lkIG5hcF9zZXQoaW50IHRpbGVfY250KTsKLXN0YXRpYyB2b2lkIG5hcF9jaGVjayhpbnQgdGlsZV9jbnQpOwotc3RhdGljIHZvaWQgcGluZ19jbGllbnRzKGludCB0aWxlX2NudCk7Ci1zdGF0aWMgaW50IGJsYWNrb3V0X2xpbmVfc2tpcChpbnQgbiwgaW50IHgsIGludCB5LCBpbnQgcmVzY2FuLAotICAgIGludCAqdGlsZV9jb3VudCk7Ci1zdGF0aWMgaW50IGJsYWNrb3V0X2xpbmVfY21wc2tpcChpbnQgbiwgaW50IHgsIGludCB5LCBjaGFyICpkc3QsIGNoYXIgKnNyYywKLSAgICBpbnQgdywgaW50IHBpeGVsc2l6ZSk7Ci1zdGF0aWMgaW50IHNjYW5fZGlzcGxheShpbnQgeXN0YXJ0LCBpbnQgcmVzY2FuKTsKLQotCi0vKiBhcnJheSB0byBob2xkIHRoZSBoaW50czogKi8KLXN0YXRpYyBoaW50X3QgKmhpbnRfbGlzdDsKLQotLyogbmFwIHN0YXRlICovCi1pbnQgbmFwX29rID0gMDsKLXN0YXRpYyBpbnQgbmFwX2RpZmZfY291bnQgPSAwOwotCi1zdGF0aWMgaW50IHNjYW5fY291bnQgPSAwOwkvKiBpbmRpY2F0ZXMgd2hpY2ggc2NhbiBwYXR0ZXJuIHdlIGFyZSBvbiAgKi8KLXN0YXRpYyBpbnQgc2Nhbl9pbl9wcm9ncmVzcyA9IDA7CQotCi0KLXR5cGVkZWYgc3RydWN0IHRpbGVfY2hhbmdlX3JlZ2lvbiB7Ci0JLyogc3RhcnQgYW5kIGVuZCBsaW5lcywgYWxvbmcgeSwgb2YgdGhlIGNoYW5nZWQgYXJlYSBpbnNpZGUgYSB0aWxlLiAqLwotCXVuc2lnbmVkIHNob3J0IGZpcnN0X2xpbmUsIGxhc3RfbGluZTsKLQlzaG9ydCBmaXJzdF94LCBsYXN0X3g7Ci0JLyogaW5mbyBhYm91dCBkaWZmZXJlbmNlcyBhbG9uZyBlZGdlcy4gKi8KLQl1bnNpZ25lZCBzaG9ydCBsZWZ0X2RpZmYsIHJpZ2h0X2RpZmY7Ci0JdW5zaWduZWQgc2hvcnQgdG9wX2RpZmYsICBib3RfZGlmZjsKLX0gcmVnaW9uX3Q7Ci0KLS8qIGFycmF5IHRvIGhvbGQgdGhlIHRpbGVzIHJlZ2lvbl90LXMuICovCi1zdGF0aWMgcmVnaW9uX3QgKnRpbGVfcmVnaW9uOwotCi0KLQotCi0vKgotICogc2V0dXAgdGlsZSBudW1iZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGlsZSBhbmQgaGludCBhcnJheXM6Ci0gKi8KLXZvaWQgaW5pdGlhbGl6ZV90aWxlcyh2b2lkKSB7Ci0KLQludGlsZXNfeCA9IChkcHlfeCAtIDEpL3RpbGVfeCArIDE7Ci0JbnRpbGVzX3kgPSAoZHB5X3kgLSAxKS90aWxlX3kgKyAxOwotCW50aWxlcyA9IG50aWxlc194ICogbnRpbGVzX3k7Ci0KLQl0aWxlX2hhc19kaWZmID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJY2FsbG9jKChzaXplX3QpIChudGlsZXMgKiBzaXplb2YodW5zaWduZWQgY2hhcikpLCAxKTsKLQl0aWxlX2hhc194ZGFtYWdlX2RpZmYgPSAodW5zaWduZWQgY2hhciAqKQotCQljYWxsb2MoKHNpemVfdCkgKG50aWxlcyAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSksIDEpOwotCXRpbGVfcm93X2hhc194ZGFtYWdlX2RpZmYgPSAodW5zaWduZWQgY2hhciAqKQotCQljYWxsb2MoKHNpemVfdCkgKG50aWxlc195ICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSwgMSk7Ci0JdGlsZV90cmllZCAgICA9ICh1bnNpZ25lZCBjaGFyICopCi0JCWNhbGxvYygoc2l6ZV90KSAobnRpbGVzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSwgMSk7Ci0JdGlsZV9jb3BpZWQgICA9ICh1bnNpZ25lZCBjaGFyICopCi0JCWNhbGxvYygoc2l6ZV90KSAobnRpbGVzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSwgMSk7Ci0JdGlsZV9ibGFja291dCAgICA9ICh0aWxlX2JsYWNrb3V0X3QgKikKLQkJY2FsbG9jKChzaXplX3QpIChudGlsZXMgKiBzaXplb2YodGlsZV9ibGFja291dF90KSksIDEpOwotCXRpbGVfcmVnaW9uID0gKHJlZ2lvbl90ICopIGNhbGxvYygoc2l6ZV90KSAobnRpbGVzICogc2l6ZW9mKHJlZ2lvbl90KSksIDEpOwotCi0JdGlsZV9yb3cgPSAoWEltYWdlICoqKQotCQljYWxsb2MoKHNpemVfdCkgKChudGlsZXNfeCArIDEpICogc2l6ZW9mKFhJbWFnZSAqKSksIDEpOwotCXRpbGVfcm93X3NobSA9IChYU2htU2VnbWVudEluZm8gKikKLQkJY2FsbG9jKChzaXplX3QpICgobnRpbGVzX3ggKyAxKSAqIHNpemVvZihYU2htU2VnbWVudEluZm8pKSwgMSk7Ci0KLQkvKiB0aGVyZSB3aWxsIG5ldmVyIGJlIG1vcmUgaGludHMgdGhhbiB0aWxlczogKi8KLQloaW50X2xpc3QgPSAoaGludF90ICopIGNhbGxvYygoc2l6ZV90KSAobnRpbGVzICogc2l6ZW9mKGhpbnRfdCkpLCAxKTsKLX0KLQotdm9pZCBmcmVlX3RpbGVzKHZvaWQpIHsKLQlpZiAodGlsZV9oYXNfZGlmZikgewotCQlmcmVlKHRpbGVfaGFzX2RpZmYpOwotCQl0aWxlX2hhc19kaWZmID0gTlVMTDsKLQl9Ci0JaWYgKHRpbGVfaGFzX3hkYW1hZ2VfZGlmZikgewotCQlmcmVlKHRpbGVfaGFzX3hkYW1hZ2VfZGlmZik7Ci0JCXRpbGVfaGFzX3hkYW1hZ2VfZGlmZiA9IE5VTEw7Ci0JfQotCWlmICh0aWxlX3Jvd19oYXNfeGRhbWFnZV9kaWZmKSB7Ci0JCWZyZWUodGlsZV9yb3dfaGFzX3hkYW1hZ2VfZGlmZik7Ci0JCXRpbGVfcm93X2hhc194ZGFtYWdlX2RpZmYgPSBOVUxMOwotCX0KLQlpZiAodGlsZV90cmllZCkgewotCQlmcmVlKHRpbGVfdHJpZWQpOwotCQl0aWxlX3RyaWVkID0gTlVMTDsKLQl9Ci0JaWYgKHRpbGVfY29waWVkKSB7Ci0JCWZyZWUodGlsZV9jb3BpZWQpOwotCQl0aWxlX2NvcGllZCA9IE5VTEw7Ci0JfQotCWlmICh0aWxlX2JsYWNrb3V0KSB7Ci0JCWZyZWUodGlsZV9ibGFja291dCk7Ci0JCXRpbGVfYmxhY2tvdXQgPSBOVUxMOwotCX0KLQlpZiAodGlsZV9yZWdpb24pIHsKLQkJZnJlZSh0aWxlX3JlZ2lvbik7Ci0JCXRpbGVfcmVnaW9uID0gTlVMTDsKLQl9Ci0JaWYgKHRpbGVfcm93KSB7Ci0JCWZyZWUodGlsZV9yb3cpOwotCQl0aWxlX3JvdyA9IE5VTEw7Ci0JfQotCWlmICh0aWxlX3Jvd19zaG0pIHsKLQkJZnJlZSh0aWxlX3Jvd19zaG0pOwotCQl0aWxlX3Jvd19zaG0gPSBOVUxMOwotCX0KLQlpZiAoaGludF9saXN0KSB7Ci0JCWZyZWUoaGludF9saXN0KTsKLQkJaGludF9saXN0ID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBzaWxseSBmdW5jdGlvbiB0byBmYWN0b3IgZHB5X3kgdW50aWwgZnVsbHNjcmVlbiBzaG0gaXMgbm90IGJpZ2dlciB0aGFuIG1heC4KLSAqIHNob3VsZCBhbHdheXMgd29yayB1bmxlc3MgZHB5X3kgaXMgYSBsYXJnZSBwcmltZSBvciBzb21ldGhpbmcuLi4gdW5kZXIKLSAqIGZhaWx1cmUgZnNfZmFjdG9yIHJlbWFpbnMgMCBhbmQgbm8gZnVsbHNjcmVlbiB1cGRhdGVzIHdpbGwgYmUgdHJpZWQuCi0gKi8KLXN0YXRpYyBpbnQgZnNfZmFjdG9yID0gMDsKLQotc3RhdGljIHZvaWQgc2V0X2ZzX2ZhY3RvcihpbnQgbWF4KSB7Ci0JaW50IGYsIGZhYyA9IDEsIG4gPSBkcHlfeTsKLQotCWZzX2ZhY3RvciA9IDA7Ci0JaWYgKChicHAvOCkgKiBkcHlfeCAqIGRweV95IDw9IG1heCkgIHsKLQkJZnNfZmFjdG9yID0gMTsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGY9MjsgZiA8PSAxMDE7IGYrKykgewotCQl3aGlsZSAobiAlIGYgPT0gMCkgewotCQkJbiA9IG4gLyBmOwotCQkJZmFjID0gZmFjICogZjsKLQkJCWlmICggKGJwcC84KSAqIGRweV94ICogKGRweV95L2ZhYykgPD0gbWF4ICkgIHsKLQkJCQlmc19mYWN0b3IgPSBmYWM7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgY2hhciAqZmxpcF94aW1hZ2VfYnl0ZV9vcmRlcihYSW1hZ2UgKnhpbSkgewotCWNoYXIgKm9yZGVyOwotCWlmICh4aW0tPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3QpIHsKLQkJb3JkZXIgPSAiTVNCRmlyc3QiOwotCQl4aW0tPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKLQkJeGltLT5iaXRtYXBfYml0X29yZGVyID0gTVNCRmlyc3Q7Ci0JfSBlbHNlIHsKLQkJb3JkZXIgPSAiTFNCRmlyc3QiOwotCQl4aW0tPmJ5dGVfb3JkZXIgPSBMU0JGaXJzdDsKLQkJeGltLT5iaXRtYXBfYml0X29yZGVyID0gTFNCRmlyc3Q7Ci0JfQotCXJldHVybiBvcmRlcjsKLX0KLQotLyoKLSAqIHNldCB1cCBhbiBYU2htIGltYWdlLCBvciBpZiBub3QgdXNpbmcgc2htIGp1c3QgY3JlYXRlIHRoZSBYSW1hZ2UuCi0gKi8KLXN0YXRpYyBpbnQgc2htX2NyZWF0ZShYU2htU2VnbWVudEluZm8gKnNobSwgWEltYWdlICoqeGltZ19wdHIsIGludCB3LCBpbnQgaCwKLSAgICBjaGFyICpuYW1lKSB7Ci0KLQlYSW1hZ2UgKnhpbTsKLQlzdGF0aWMgaW50IHJlcG9ydGVkX2ZsaXAgPSAwOwotCWludCBkYiA9IDA7Ci0KLQlzaG0tPnNobWlkID0gLTE7Ci0Jc2htLT5zaG1hZGRyID0gKGNoYXIgKikgLTE7Ci0JKnhpbWdfcHRyID0gTlVMTDsKLQotCWlmIChub2ZiKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCVhfTE9DSzsKLQotCWlmICghIHVzaW5nX3NobSB8fCB4Zm9ybTI0dG8zMiB8fCByYXdfZmIpIHsKLQkJLyogd2Ugb25seSBuZWVkIHRoZSBYSW1hZ2UgY3JlYXRlZCAqLwotCQl4aW0gPSBYQ3JlYXRlSW1hZ2Vfd3IoZHB5LCBkZWZhdWx0X3Zpc3VhbCwgZGVwdGgsIFpQaXhtYXAsCi0JCSAgICAwLCBOVUxMLCB3LCBoLCByYXdfZmIgPyAzMiA6IEJpdG1hcFBhZChkcHkpLCAwKTsKLQotCQlYX1VOTE9DSzsKLQotCQlpZiAoeGltID09IE5VTEwpIHsKLQkJCXJmYkVycigiWENyZWF0ZUltYWdlKCVzKSBmYWlsZWQuXG4iLCBuYW1lKTsKLQkJCWlmIChxdWlldCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiWENyZWF0ZUltYWdlKCVzKSBmYWlsZWQuXG4iLAotCQkJCSAgICBuYW1lKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzaG1fY3JlYXRlIHNpbXBsZSAlZCAlZFx0JXAgJXNcbiIsIHcsIGgsICh2b2lkICopeGltLCBuYW1lKTsKLQkJeGltLT5kYXRhID0gKGNoYXIgKikgbWFsbG9jKHhpbS0+Ynl0ZXNfcGVyX2xpbmUgKiB4aW0tPmhlaWdodCk7Ci0JCWlmICh4aW0tPmRhdGEgPT0gTlVMTCkgewotCQkJcmZiRXJyKCJYQ3JlYXRlSW1hZ2UoJXMpIGRhdGEgbWFsbG9jIGZhaWxlZC5cbiIsIG5hbWUpOwotCQkJaWYgKHF1aWV0KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlSW1hZ2UoJXMpIGRhdGEgbWFsbG9jIgotCQkJCSAgICAiIGZhaWxlZC5cbiIsIG5hbWUpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKGZsaXBfYnl0ZV9vcmRlcikgewotCQkJY2hhciAqb3JkZXIgPSBmbGlwX3hpbWFnZV9ieXRlX29yZGVyKHhpbSk7Ci0JCQlpZiAoISByZXBvcnRlZF9mbGlwICYmICEgcXVpZXQpIHsKLQkJCQlyZmJMb2coIkNoYW5naW5nIFhJbWFnZSBieXRlIG9yZGVyIgotCQkJCSAgICAiIHRvICVzXG4iLCBvcmRlcik7Ci0JCQkJcmVwb3J0ZWRfZmxpcCA9IDE7Ci0JCQl9Ci0JCX0KLQotCQkqeGltZ19wdHIgPSB4aW07Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICghIGRweSkgewotCQlYX1VOTE9DSzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JeGltID0gWFNobUNyZWF0ZUltYWdlX3dyKGRweSwgZGVmYXVsdF92aXN1YWwsIGRlcHRoLCBaUGl4bWFwLCBOVUxMLAotCSAgICBzaG0sIHcsIGgpOwotCi0JaWYgKHhpbSA9PSBOVUxMKSB7Ci0JCXJmYkVycigiWFNobUNyZWF0ZUltYWdlKCVzKSBmYWlsZWQuXG4iLCBuYW1lKTsKLQkJaWYgKHF1aWV0KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlhTaG1DcmVhdGVJbWFnZSglcykgZmFpbGVkLlxuIiwgbmFtZSk7Ci0JCX0KLQkJWF9VTkxPQ0s7Ci0JCXJldHVybiAwOwotCX0KLQotCSp4aW1nX3B0ciA9IHhpbTsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hTSE0KLQlzaG0tPnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLAotCSAgICB4aW0tPmJ5dGVzX3Blcl9saW5lICogeGltLT5oZWlnaHQsIElQQ19DUkVBVCB8IDA3NzcpOwotCi0JaWYgKHNobS0+c2htaWQgPT0gLTEpIHsKLQkJcmZiRXJyKCJzaG1nZXQoJXMpIGZhaWxlZC5cbiIsIG5hbWUpOwotCQlyZmJMb2dQZXJyb3IoInNobWdldCIpOwotCi0JCVhEZXN0cm95SW1hZ2UoeGltKTsKLQkJKnhpbWdfcHRyID0gTlVMTDsKLQotCQlYX1VOTE9DSzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2htLT5zaG1hZGRyID0geGltLT5kYXRhID0gKGNoYXIgKikgc2htYXQoc2htLT5zaG1pZCwgMCwgMCk7Ci0KLQlpZiAoc2htLT5zaG1hZGRyID09IChjaGFyICopLTEpIHsKLQkJcmZiRXJyKCJzaG1hdCglcykgZmFpbGVkLlxuIiwgbmFtZSk7Ci0JCXJmYkxvZ1BlcnJvcigic2htYXQiKTsKLQotCQlYRGVzdHJveUltYWdlKHhpbSk7Ci0JCSp4aW1nX3B0ciA9IE5VTEw7Ci0KLQkJc2htY3RsKHNobS0+c2htaWQsIElQQ19STUlELCAwKTsKLQkJc2htLT5zaG1pZCA9IC0xOwotCi0JCVhfVU5MT0NLOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzaG0tPnJlYWRPbmx5ID0gRmFsc2U7Ci0KLQlpZiAoISBYU2htQXR0YWNoX3dyKGRweSwgc2htKSkgewotCQlyZmJFcnIoIlhTaG1BdHRhY2goJXMpIGZhaWxlZC5cbiIsIG5hbWUpOwotCQlYRGVzdHJveUltYWdlKHhpbSk7Ci0JCSp4aW1nX3B0ciA9IE5VTEw7Ci0KLQkJc2htZHQoc2htLT5zaG1hZGRyKTsKLQkJc2htLT5zaG1hZGRyID0gKGNoYXIgKikgLTE7Ci0KLQkJc2htY3RsKHNobS0+c2htaWQsIElQQ19STUlELCAwKTsKLQkJc2htLT5zaG1pZCA9IC0xOwotCi0JCVhfVU5MT0NLOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKLQotCVhfVU5MT0NLOwotCXJldHVybiAxOwotfQotCi12b2lkIHNobV9kZWxldGUoWFNobVNlZ21lbnRJbmZvICpzaG0pIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YU0hNCi0JaWYgKGdldGVudigiWDExVk5DX1NITV9ERUJVRyIpKSBmcHJpbnRmKHN0ZGVyciwgInNobV9kZWxldGU6ICAgICVwXG4iLCAodm9pZCAqKSBzaG0pOwotCWlmIChzaG0gIT0gTlVMTCAmJiBzaG0tPnNobWFkZHIgIT0gKGNoYXIgKikgLTEpIHsKLQkJc2htZHQoc2htLT5zaG1hZGRyKTsKLQl9Ci0JaWYgKHNobSAhPSBOVUxMICYmIHNobS0+c2htaWQgIT0gLTEpIHsKLQkJc2htY3RsKHNobS0+c2htaWQsIElQQ19STUlELCAwKTsKLQl9Ci0JaWYgKHNobSAhPSBOVUxMKSB7Ci0JCXNobS0+c2htYWRkciA9IChjaGFyICopIC0xOwotCQlzaG0tPnNobWlkID0gLTE7Ci0JfQotI2Vsc2UKLQlpZiAoIXNobSkge30KLSNlbmRpZgotfQotCi12b2lkIHNobV9jbGVhbihYU2htU2VnbWVudEluZm8gKnNobSwgWEltYWdlICp4aW0pIHsKLQlpbnQgZGIgPSAwOwotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNobV9jbGVhbjogY2FsbGVkOiAgJXBcbiIsICh2b2lkICopeGltKTsKLQlYX0xPQ0s7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFNITQotCWlmIChzaG0gIT0gTlVMTCAmJiBzaG0tPnNobWlkICE9IC0xICYmIGRweSkgewotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic2htX2NsZWFuOiBYU2htRGV0YWNoX3dyXG4iKTsKLQkJWFNobURldGFjaF93cihkcHksIHNobSk7Ci0JfQotI2VuZGlmCi0JaWYgKHhpbSAhPSBOVUxMKSB7Ci0JCWlmICghIHJhd19mYl9iYWNrX3RvX1gpIHsJLyogcmF3X2ZiIGhhY2sgKi8KLQkJCWlmICh4aW0tPmJpdG1hcF91bml0ICE9IC0xKSB7Ci0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNobV9jbGVhbjogWERlc3Ryb3lJbWFnZSAgJXBcbiIsICh2b2lkICopeGltKTsKLQkJCQlYRGVzdHJveUltYWdlKHhpbSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh4aW0tPmRhdGEpIHsKLQkJCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNobV9jbGVhbjogZnJlZSB4aW0tPmRhdGEgICVwICVwXG4iLCAodm9pZCAqKXhpbSwgKHZvaWQgKikoeGltLT5kYXRhKSk7Ci0JCQkJCWZyZWUoeGltLT5kYXRhKTsKLQkJCQkJeGltLT5kYXRhID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJeGltID0gTlVMTDsKLQl9Ci0JWF9VTkxPQ0s7Ci0KLQlzaG1fZGVsZXRlKHNobSk7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9wb2xsaW5nX2ltYWdlcyh2b2lkKSB7Ci0JaW50IGksIE1CID0gMTAyNCAqIDEwMjQ7Ci0KLQkvKiBzZXQgYWxsIHNobSBhcmVhcyB0byAibm9uZSIgYmVmb3JlIHRyeWluZyB0byBjcmVhdGUgYW55ICovCi0Jc2NhbmxpbmVfc2htLnNobWlkCT0gLTE7Ci0Jc2NhbmxpbmVfc2htLnNobWFkZHIJPSAoY2hhciAqKSAtMTsKLQlzY2FubGluZQkJPSBOVUxMOwotCWZ1bGxzY3JlZW5fc2htLnNobWlkCT0gLTE7Ci0JZnVsbHNjcmVlbl9zaG0uc2htYWRkcgk9IChjaGFyICopIC0xOwotCWZ1bGxzY3JlZW4JCT0gTlVMTDsKLQlzbmFwcmVjdF9zaG0uc2htaWQJPSAtMTsKLQlzbmFwcmVjdF9zaG0uc2htYWRkcgk9IChjaGFyICopIC0xOwotCXNuYXByZWN0CQk9IE5VTEw7Ci0JZm9yIChpPTE7IGk8PW50aWxlc194OyBpKyspIHsKLQkJdGlsZV9yb3dfc2htW2ldLnNobWlkCT0gLTE7Ci0JCXRpbGVfcm93X3NobVtpXS5zaG1hZGRyCT0gKGNoYXIgKikgLTE7Ci0JCXRpbGVfcm93W2ldCQk9IE5VTEw7Ci0JfQotCi0JLyogdGhlIHNjYW5saW5lIChlLmcuIDEyODB4MSkgc2hhcmVkIG1lbW9yeSBhcmVhIGltYWdlOiAqLwotCi0JaWYgKCEgc2htX2NyZWF0ZSgmc2NhbmxpbmVfc2htLCAmc2NhbmxpbmUsIGRweV94LCAxLCAic2NhbmxpbmUiKSkgewotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCS8qCi0JICogdGhlIGZ1bGxzY3JlZW4gKGUuZy4gMTI4MHgxMDI0L2ZzX2ZhY3Rvcikgc2hhcmVkIG1lbW9yeSBhcmVhIGltYWdlOgotCSAqICh3ZSBjdXQgZG93biB0aGUgc2l6ZSBvZiB0aGUgc2htIGFyZWEgdG8gdHJ5IGF2b2lkIGFuZCBzaG0gc2VnbWVudAotCSAqIGxpbWl0cywgZS5nLiB0aGUgZGVmYXVsdCAxTUIgb24gU29sYXJpcykKLQkgKi8KLQlpZiAoVVQuc3lzbmFtZSAmJiBzdHJzdHIoVVQuc3lzbmFtZSwgIkxpbnV4IikpIHsKLQkJc2V0X2ZzX2ZhY3RvcigxMCAqIE1CKTsKLQl9IGVsc2UgewotCQlzZXRfZnNfZmFjdG9yKDEgKiBNQik7Ci0JfQotCWlmIChmc19mcmFjID49IDEuMCkgewotCQlmc19mcmFjID0gMS4xOwotCQlmc19mYWN0b3IgPSAwOwotCX0KLQlpZiAoISBmc19mYWN0b3IpIHsKLQkJcmZiTG9nKCJ3YXJuaW5nOiBmdWxsc2NyZWVuIHVwZGF0ZXMgYXJlIGRpc2FibGVkLlxuIik7Ci0JfSBlbHNlIHsKLQkJaWYgKCEgc2htX2NyZWF0ZSgmZnVsbHNjcmVlbl9zaG0sICZmdWxsc2NyZWVuLCBkcHlfeCwKLQkJICAgIGRweV95L2ZzX2ZhY3RvciwgImZ1bGxzY3JlZW4iKSkgewotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCX0KLQlpZiAodXNlX3NuYXBmYikgewotCQlpZiAoISBmc19mYWN0b3IpIHsKLQkJCXJmYkxvZygid2FybmluZzogZGlzYWJsaW5nIC1zbmFwZmIgbW9kZS5cbiIpOwotCQkJdXNlX3NuYXBmYiA9IDA7Ci0JCX0gZWxzZSBpZiAoISBzaG1fY3JlYXRlKCZzbmFwcmVjdF9zaG0sICZzbmFwcmVjdCwgZHB5X3gsCi0JCSAgICBkcHlfeS9mc19mYWN0b3IsICJzbmFwcmVjdCIpKSB7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBmb3IgY29weV90aWxlcyB3ZSBuZWVkIGEgbG90IG9mIHNoYXJlZCBtZW1vcnkgYXJlYXMsIG9uZSBmb3IKLQkgKiBlYWNoIHBvc3NpYmxlIHJ1biBsZW5ndGggb2YgY2hhbmdlZCB0aWxlcy4gIDMyIGZvciAxMDI0eDc2OAotCSAqIGFuZCA0MCBmb3IgMTI4MHgxMDI0LCBldGMuIAotCSAqLwotCi0JdGlsZV9zaG1fY291bnQgPSAwOwotCWZvciAoaT0xOyBpPD1udGlsZXNfeDsgaSsrKSB7Ci0JCWlmICghIHNobV9jcmVhdGUoJnRpbGVfcm93X3NobVtpXSwgJnRpbGVfcm93W2ldLCB0aWxlX3ggKiBpLAotCQkgICAgdGlsZV95LCAidGlsZV9yb3ciKSkgewotCQkJaWYgKGkgPT0gMSkgewotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlyZmJMb2coInNobTogRXJyb3IgY3JlYXRpbmcgc2hhcmVkIG1lbW9yeSB0aWxlLXJvdyBmb3IiCi0JCQkgICAgIiBsZW49JWQsXG4iLCBpKTsKLQkJCXJmYkxvZygic2htOiByZXZlcnRpbmcgdG8gLW9uZXRpbGUgbW9kZS4gSWYgdGhpcyIKLQkJCSAgICAiIHByb2JsZW0gcGVyc2lzdHNcbiIpOwotCQkJcmZiTG9nKCJzaG06IHRyeSB1c2luZyB0aGUgLW9uZXRpbGUgb3IgLW5vc2htIG9wdGlvbnMiCi0JCQkgICAgIiB0byBsaW1pdFxuIik7Ci0JCQlyZmJMb2coInNobTogc2hhcmVkIG1lbW9yeSB1c2FnZSwgb3IgcnVuIGlwY3JtKDEpIgotCQkJICAgICIgdG8gbWFudWFsbHlcbiIpOwotCQkJcmZiTG9nKCJzaG06IGRlbGV0ZSB1bmF0dGFjaGVkIHNobSBzZWdtZW50cy5cbiIpOwotCQkJc2luZ2xlX2NvcHl0aWxlX2NvdW50ID0gaTsKLQkJCXNpbmdsZV9jb3B5dGlsZSA9IDE7Ci0JCX0KLQkJdGlsZV9zaG1fY291bnQrKzsKLQkJaWYgKHNpbmdsZV9jb3B5dGlsZSAmJiBpID49IDEpIHsKLQkJCS8qIG9ubHkgbmVlZCAxeDEgdGlsZXMgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICh2ZXJib3NlKSB7Ci0JCWlmICh1c2luZ19zaG0gJiYgISB4Zm9ybTI0dG8zMikgewotCQkJcmZiTG9nKCJjcmVhdGVkICVkIHRpbGVfcm93IHNobSBwb2xsaW5nIGltYWdlcy5cbiIsCi0JCQkgICAgdGlsZV9zaG1fY291bnQpOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJjcmVhdGVkICVkIHRpbGVfcm93IHBvbGxpbmcgaW1hZ2VzLlxuIiwKLQkJCSAgICB0aWxlX3NobV9jb3VudCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBBIGhpbnQgaXMgYSByZWN0YW5ndWxhciByZWdpb24gYnVpbHQgZnJvbSAxIG9yIG1vcmUgYWRqYWNlbnQgdGlsZXMKLSAqIGdsdWVkIHRvZ2V0aGVyLiAgVWx0aW1hdGVseSwgdGhpcyBpbmZvcm1hdGlvbiBpbiBhIHNpbmdsZSBoaW50IGlzIHNlbnQKLSAqIHRvIGxpYnZuY3NlcnZlciByYXRoZXIgdGhhbiBzZW5kaW5nIGVhY2ggdGlsZSBzZXBhcmF0ZWx5LgotICovCi1zdGF0aWMgdm9pZCBjcmVhdGVfdGlsZV9oaW50KGludCB4LCBpbnQgeSwgaW50IHR3LCBpbnQgdGgsIGhpbnRfdCAqaGludCkgewotCWludCB3ID0gZHB5X3ggLSB4OwotCWludCBoID0gZHB5X3kgLSB5OwotCi0JaWYgKHcgPiB0dykgewotCQl3ID0gdHc7Ci0JfQotCWlmIChoID4gdGgpIHsKLQkJaCA9IHRoOwotCX0KLQotCWhpbnQtPnggPSB4OwotCWhpbnQtPnkgPSB5OwotCWhpbnQtPncgPSB3OwotCWhpbnQtPmggPSBoOwotfQotCi1zdGF0aWMgdm9pZCBleHRlbmRfdGlsZV9oaW50KGludCB4LCBpbnQgeSwgaW50IHR3LCBpbnQgdGgsIGhpbnRfdCAqaGludCkgewotCWludCB3ID0gZHB5X3ggLSB4OwotCWludCBoID0gZHB5X3kgLSB5OwotCi0JaWYgKHcgPiB0dykgewotCQl3ID0gdHc7Ci0JfQotCWlmIChoID4gdGgpIHsKLQkJaCA9IHRoOwotCX0KLQotCWlmIChoaW50LT54ID4geCkgewkJCS8qIGV4dGVuZCB0byB0aGUgbGVmdCAqLwotCQloaW50LT53ICs9IGhpbnQtPnggLSB4OwotCQloaW50LT54ID0geDsKLQl9Ci0JaWYgKGhpbnQtPnkgPiB5KSB7CQkJLyogZXh0ZW5kIHVwd2FyZCAqLwotCQloaW50LT5oICs9IGhpbnQtPnkgLSB5OwotCQloaW50LT55ID0geTsKLQl9Ci0KLQlpZiAoaGludC0+eCArIGhpbnQtPncgPCB4ICsgdykgewkvKiBleHRlbmQgdG8gdGhlIHJpZ2h0ICovCi0JCWhpbnQtPncgPSB4ICsgdyAtIGhpbnQtPng7Ci0JfQotCWlmIChoaW50LT55ICsgaGludC0+aCA8IHkgKyBoKSB7CS8qIGV4dGVuZCBkb3dud2FyZCAqLwotCQloaW50LT5oID0geSArIGggLSBoaW50LT55OwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2F2ZV9oaW50KGhpbnRfdCBoaW50LCBpbnQgbG9jKSB7Ci0JLyogc2ltcGx5IGNvcHkgaXQgdG8gdGhlIGdsb2JhbCBhcnJheSBmb3IgbGF0ZXIgdXNlLiAqLwotCWhpbnRfbGlzdFtsb2NdLnggPSBoaW50Lng7Ci0JaGludF9saXN0W2xvY10ueSA9IGhpbnQueTsKLQloaW50X2xpc3RbbG9jXS53ID0gaGludC53OwotCWhpbnRfbGlzdFtsb2NdLmggPSBoaW50Lmg7Ci19Ci0KLS8qCi0gKiBHbHVlIHRvZ2V0aGVyIGhvcml6b250YWwgInJ1bnMiIG9mIGFkamFjZW50IGNoYW5nZWQgdGlsZXMgaW50byBvbmUgYmlnCi0gKiByZWN0YW5nbGUgY2hhbmdlICJoaW50IiB0byBiZSBwYXNzZWQgdG8gdGhlIHZuYyBtYWNoaW5lcnkuCi0gKi8KLXN0YXRpYyB2b2lkIGhpbnRfdXBkYXRlcyh2b2lkKSB7Ci0JaGludF90IGhpbnQ7Ci0JaW50IHgsIHksIGksIG4sIHR5LCB0aCwgdHgsIHR3OwotCWludCBoaW50X2NvdW50ID0gMCwgaW5fcnVuID0gMDsKLQotCWhpbnQueCA9IGhpbnQueSA9IGhpbnQudyA9IGhpbnQuaCA9IDA7Ci0KLQlmb3IgKHk9MDsgeSA8IG50aWxlc195OyB5KyspIHsKLQkJZm9yICh4PTA7IHggPCBudGlsZXNfeDsgeCsrKSB7Ci0JCQluID0geCArIHkgKiBudGlsZXNfeDsKLQotCQkJaWYgKHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCQl0eSA9IHRpbGVfcmVnaW9uW25dLmZpcnN0X2xpbmU7Ci0JCQkJdGggPSB0aWxlX3JlZ2lvbltuXS5sYXN0X2xpbmUgLSB0eSArIDE7Ci0KLQkJCQl0eCA9IHRpbGVfcmVnaW9uW25dLmZpcnN0X3g7Ci0JCQkJdHcgPSB0aWxlX3JlZ2lvbltuXS5sYXN0X3ggLSB0eCArIDE7Ci0JCQkJaWYgKHR4IDwgMCkgewotCQkJCQl0eCA9IDA7Ci0JCQkJCXR3ID0gdGlsZV94OwotCQkJCX0KLQotCQkJCWlmICghIGluX3J1bikgewotCQkJCQljcmVhdGVfdGlsZV9oaW50KCB4ICogdGlsZV94ICsgdHgsCi0JCQkJCSAgICB5ICogdGlsZV95ICsgdHksIHR3LCB0aCwgJmhpbnQpOwotCQkJCQlpbl9ydW4gPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4dGVuZF90aWxlX2hpbnQoIHggKiB0aWxlX3ggKyB0eCwKLQkJCQkJICAgIHkgKiB0aWxlX3kgKyB0eSwgdHcsIHRoLCAmaGludCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5fcnVuKSB7Ci0JCQkJCS8qIGVuZCBvZiBhIHJvdyBydW4gb2YgYWx0ZXJlZCB0aWxlczogKi8KLQkJCQkJc2F2ZV9oaW50KGhpbnQsIGhpbnRfY291bnQrKyk7Ci0JCQkJCWluX3J1biA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpbl9ydW4pIHsJLyogc2F2ZSB0aGUgbGFzdCByb3cgcnVuICovCi0JCQlzYXZlX2hpbnQoaGludCwgaGludF9jb3VudCsrKTsKLQkJCWluX3J1biA9IDA7Ci0JCX0KLQl9Ci0KLQlmb3IgKGk9MDsgaSA8IGhpbnRfY291bnQ7IGkrKykgewotCQkvKiBwYXNzIHVwZGF0ZSBpbmZvIHRvIHZuYzogKi8KLQkJbWFya19oaW50KGhpbnRfbGlzdFtpXSk7Ci0JfQotfQotCi0vKgotICoga2x1ZGdlLCBzaW1wbGUgY2VpbCtmbG9vciBmb3Igbm9uLW5lZ2F0aXZlIGRvdWJsZXM6Ci0gKi8KLSNkZWZpbmUgQ0VJTCh4KSAgKCAoZG91YmxlKSAoKGludCkgKHgpKSA9PSAoeCkgPyBcCi0JKGRvdWJsZSkgKChpbnQpICh4KSkgOiAoZG91YmxlKSAoKGludCkgKHgpICsgMSkgKQotI2RlZmluZSBGTE9PUih4KSAoIChkb3VibGUpICgoaW50KSAoeCkpICkKLQotLyoKLSAqIFNjYWxpbmc6Ci0gKgotICogRm9yIHNocmlua2luZywgYSBkZXN0aW5hdGlvbiAoc2NhbGVkKSBwaXhlbCB3aWxsIGNvcnJlc3BvbmQgdG8gbW9yZQotICogdGhhbiBvbmUgc291cmNlIChpLmUuIG1haW4gZmIpIHBpeGVsLiAgVGhpbmsgb2YgYW4geC15IHBsYW5lIG1hZGUgd2l0aAotICogZ3JhcGggcGFwZXIuICBFYWNoIHVuaXQgc3F1YXJlIGluIHRoZSBncmFwaCBwYXBlciAoaS5lLiBjb2xsZWN0aW9uIG9mCi0gKiBwb2ludHMgKHgseSkgc3VjaCB0aGF0IE4gPCB4IDwgTisxIGFuZCBNIDwgeSA8IE0rMSwgTiBhbmQgTSBpbnRlZ2VycykKLSAqIGNvcnJlc3BvbmRzIHRvIG9uZSBwaXhlbCBpbiB0aGUgdW5zY2FsZWQgZmIuICBUaGVyZSBpcyBhIHNvbGlkCi0gKiBjb2xvciBmaWxsaW5nIHRoZSBpbnNpZGUgb2Ygc3VjaCBhIHNxdWFyZS4gIEEgc2NhbGVkIHBpeGVsIGhhcyB3aWR0aAotICogMS9zY2FsZV9mYWMsIGUuZy4gZm9yICItc2NhbGUgMy80IiB0aGUgd2lkdGggb2YgdGhlIHNjYWxlZCBwaXhlbAotICogaXMgMS4zMzMuICBUaGUgYXJlYSBvZiB0aGlzIHNjYWxlZCBwaXhlbCBpcyAxLjMzMyAqIDEuMzMzIChzbyBpdAotICogb2J2aW91c2x5IG92ZXJsYXBzIG1vcmUgdGhhbiBvbmUgc291cmNlIHBpeGVsLCBlYWNoIHdoaWNoIGhhdmUgYXJlYSAxKS4KLSAqCi0gKiBXZSB0YWtlIHRoZSB3ZWlnaHQgYW4gdW5zY2FsZWQgcGl4ZWwgKHNvdXJjZSkgY29udHJpYnV0ZXMgdG8gYQotICogc2NhbGVkIHBpeGVsIChkZXN0aW5hdGlvbikgYXMgc2ltcGx5IHByb3BvcnRpb25hbCB0byB0aGUgb3ZlcmxhcCBhcmVhCi0gKiBiZXR3ZWVuIHRoZSB0d28gcGl4ZWxzLiAgT25lIGNhbiB0aGVuIHRoaW5rIG9mIHRoZSB2YWx1ZSBvZiB0aGUgc2NhbGVkCi0gKiBwaXhlbCBhcyBhbiBpbnRlZ3JhbCBvdmVyIHRoZSBwb3J0aW9uIG9mIHRoZSBncmFwaCBwYXBlciBpdCBjb3ZlcnMuCi0gKiBUaGUgdGhpbmcgYmVpbmcgaW50ZWdyYXRlZCBpcyB0aGUgY29sb3IgdmFsdWUgb2YgdGhlIHVuc2NhbGVkIHNvdXJjZS4KLSAqIFRoYXQgY29sb3IgdmFsdWUgaXMgY29uc3RhbnQgb3ZlciBhIGdyYXBoIHBhcGVyIHNxdWFyZSAoc291cmNlIHBpeGVsKSwKLSAqIGFuZCBjaGFuZ2VzIGRpc2NvbnRpbnVvdXNseSBmcm9tIG9uZSB1bml0IHNxdWFyZSB0byB0aGUgbmV4dC4KLSAqCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBmb3IgLXNjYWxlIDMvNCwgdGhlIHNvbGlkIGxpbmVzIGFyZSB0aGUgc291cmNlIHBpeGVscwotKGdyYXBoIHBhcGVyIHVuaXQgc3F1YXJlcyksIHdoaWxlIHRoZSBkb3R0ZWQgbGluZXMgZGVub3RlIHRoZSBzY2FsZWQKLXBpeGVscyAoZGVzdGluYXRpb24gcGl4ZWxzKToKLQotICAgICAgICAgICAgMCAgICAgICAgIDEgNC8zICAgICAyICAgICA4LzMgMyAgICAgICAgIDQ9MTIvMwotICAgICAgICAgICAgfC0tLS0tLS0tLXwtLS4tLS0tLS18LS0tLS0tLi0tfC0tLS0tLS0tLXwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICBBICAgIHwgIC4gQiAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgIDEgfC0tLS0tLS0tLXwtLS4tLS0tLS18LS0tLS0tLi0tfC0tLS0tLS0tLXwuICAgICAgICAgICAgICAgIAotICAgICAgICAgNC8zfC4uLi4uLi4uLnwuLi4uLi4uLi58Li4uLi4uLi4ufC4uLi4uLi4uLnwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICBDICAgIHwgIC4gRCAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgIDIgfC0tLS0tLS0tLXwtLS4tLS0tLS18LS0tLS0tLi0tfC0tLS0tLS0tLXwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgOC8zfC4uLi4uLi4uLnwuLi4uLi4uLi58Li4uLi4uLi4ufC4uLi4uLi4uLnwuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfCAgICAgICAgIHwgIC4gICAgICB8ICAgICAgLiAgfCAgICAgICAgIHwuICAgICAgICAgICAgICAgIAotICAgICAgICAgIDMgfC0tLS0tLS0tLXwtLS4tLS0tLS18LS0tLS0tLi0tfC0tLS0tLS0tLXwuICAgICAgICAgICAgICAgIAotCi1TbyB3ZSBzZWUgdGhlIGZpcnN0IHNjYWxlZCBwaXhlbCAoMCA8IHggPCA0LzMgYW5kIDAgPCB5IDwgNC8zKSBtb3N0bHkKLW92ZXJsYXBzIHdpdGggdW5zY2FsZWQgc291cmNlIHBpeGVsICJBIi4gIFRoZSBpbnRlZ3JhdGlvbiAoYXZlcmFnaW5nKQotd2VpZ2h0cyBmb3IgdGhpcyBzY2FsZWQgcGl4ZWwgYXJlOgotCi0JCQlBCSAxCi0JCQlCCTEvMwotCQkJQwkxLzMKLQkJCUQJMS85Ci0KLSAqCi0gKiBUaGUgUmVkLCBHcmVlbiwgYW5kIEJsdWUgY29sb3IgdmFsdWVzIG11c3QgYmUgYXZlcmFnZWQgb3ZlciBzZXBhcmF0ZWx5Ci0gKiBvdGhlcndpc2UgeW91IGNhbiBnZXQgYSBjb21wbGV0ZSBtZXNzIChleGNlcHQgaW4gc29saWQgcmVnaW9ucyksCi0gKiBiZWNhdXNlIGhpZ2ggb3JkZXIgYml0cyBhcmUgYXZlcmFnZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgbG93IG9yZGVyIGJpdHMuCi0gKgotICogU28gdGhlIGFsZ29yaXRobSBpcyByb3VnaGx5OgotICoKLSAqICAgLSBHaXZlbiBhcyBpbnB1dCBhIHJlY3RhbmdsZSBpbiB0aGUgdW5zY2FsZWQgc291cmNlIGZiIHdpdGggY2hhbmdlcywKLSAqICAgICBmaW5kIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzIHRoaXMgYWZmZWN0cyBpbiB0aGUgc2NhbGVkIGRlc3RpbmF0aW9uIGZiLgotICoKLSAqICAgLSBGb3IgZWFjaCBvZiB0aGUgYWZmZWN0ZWQgc2NhbGVkIChkZXN0KSBwaXhlbHMsIGRldGVybWluZSBhbGwgb2YgdGhlCi0gKiAgICAgdW5zY2FsZWQgKHNvdXJjZSkgcGl4ZWxzIGl0IG92ZXJsYXBzIHdpdGguCi0gKiAgCi0gKiAgIC0gQXZlcmFnZSB0aG9zZSB1bnNjYWxlZCBzb3VyY2UgdmFsdWVzIHRvZ2V0aGVyLCB3ZWlnaHRlZCBieSB0aGUgYXJlYQotICogICAgIG92ZXJsYXAgd2l0aCB0aGUgZGVzdGluYXRpb24gcGl4ZWwuICBBdmVyYWdlIFIsIEcsIEIgc2VwYXJhdGVseS4KLSAqCi0gKiAgIC0gVGFrZSB0aGlzIGF2ZXJhZ2UgdmFsdWUgYW5kIGNvbnZlcnQgdG8gYSB2YWxpZCBwaXhlbCB2YWx1ZSBpZgotICogICAgIG5lY2Vzc2FyeSAoZS5nLiByb3VuZGluZywgc2hpZnRpbmcpLCBhbmQgdGhlbiBpbnNlcnQgaXQgaW50byB0aGUKLSAqICAgICBkZXN0aW5hdGlvbiBmcmFtZWJ1ZmZlciBhcyB0aGUgcGl4ZWwgdmFsdWUuCi0gKgotICogICAtIE9uIHRvIHRoZSBuZXh0IGRlc3RpbmF0aW9uIHBpeGVsLi4uCi0gKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogRm9yIGV4cGFuZGluZywgZS5nLiAtc2NhbGUgMS4xICh3aGljaCB3ZSBkb24ndCB0aGluayBwZW9wbGUgd2lsbCBkbwotICogdmVyeSBvZnRlbi4uLiBvciBhdCBsZWFzdCBzbyB3ZSBob3BlLCB0aGUgZnJhbWVidWZmZXIgY2FuIGJlY29tZSBodWdlKQotICogdGhlIHNpdHVhdGlvbiBpcyByZXZlcnNlZCBhbmQgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIGlzIHNtYWxsZXIgdGhhbiBhCi0gKiAiZ3JhcGggcGFwZXIiIHVuaXQgc3F1YXJlIChzb3VyY2UgcGl4ZWwpLiAgU29tZSBkZXN0aW5hdGlvbiBwaXhlbHMKLSAqIHdpbGwgYmUgY29tcGxldGVseSB3aXRoaW4gYSBzaW5nbGUgdW5zY2FsZWQgc291cmNlIHBpeGVsLgotICoKLSAqIFdoYXQgd2UgZG8gaGVyZSBpcyBhIHNpbXBsZSA0IHBvaW50IGludGVycG9sYXRpb24gc2NoZW1lOgotICogCi0gKiBMZXQgUDAwIGJlIHRoZSBzb3VyY2UgcGl4ZWwgY2xvc2VzdCB0byB0aGUgZGVzdGluYXRpb24gcGl4ZWwgYnV0IHdpdGgKLSAqIHggYW5kIHkgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aG9zZSBvZiB0aGUgZGVzdGluYXRpb24gcGl4ZWwuCi0gKiAoZm9yIHNpbXBsaWNpdHksIHRoaW5rIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiBhIHBpeGVsIGRlZmluaW5nIHRoZQotICogeCx5IGxvY2F0aW9uIG9mIHRoZSBwaXhlbCwgdGhlIGNlbnRlciB3b3VsZCB3b3JrIGp1c3QgYXMgd2VsbCkuICBTbyBpdAotICogaXMgdGhlIHNvdXJjZSBwaXhlbCBpbW1lZGlhdGVseSB0byB0aGUgdXBwZXIgbGVmdCBvZiB0aGUgZGVzdGluYXRpb24KLSAqIHBpeGVsLiAgTGV0IFAxMCBiZSB0aGUgc291cmNlIHBpeGVsIG9uZSB0byB0aGUgcmlnaHQgb2YgUDAwLiAgTGV0IFAwMQotICogYmUgb25lIGRvd24gZnJvbSBQMDAuICBBbmQgbGV0IFAxMSBiZSBvbmUgZG93biBhbmQgb25lIHRvIHRoZSByaWdodAotICogb2YgUDAwLiAgVGhleSBmb3JtIGEgMngyIHNxdWFyZSB3ZSB3aWxsIGludGVycG9sYXRlIGluc2lkZSBvZi4KLSAqIAotICogTGV0IFYwMCwgVjEwLCBWMDEsIGFuZCBWMTEgYmUgdGhlIGNvbG9yIHZhbHVlcyBvZiB0aG9zZSA0IHNvdXJjZQotICogcGl4ZWxzLiAgTGV0IGR4IGJlIHRoZSBkaXNwbGFjZW1lbnQgYWxvbmcgeCB0aGUgZGVzdGluYXRpb24gcGl4ZWwgaXMKLSAqIGZyb20gUDAwLiAgTm90ZTogMCA8PSBkeCA8IDEgYnkgZGVmaW5pdGlvbiBvZiBQMDAuICBTaW1pbGFybHkgbGV0Ci0gKiBkeSBiZSB0aGUgZGlzcGxhY2VtZW50IGFsb25nIHkuICBUaGUgd2VpZ2h0ZWQgYXZlcmFnZSBmb3IgdGhlCi0gKiBpbnRlcnBvbGF0aW9uIGlzOgotICogCi0gKiAJVl9hdmUgPSBWMDAgKiAoMSAtIGR4KSAqICgxIC0gZHkpCi0gKiAJICAgICAgKyBWMTAgKiAgICAgIGR4ICAqICgxIC0gZHkpCi0gKiAJICAgICAgKyBWMDEgKiAoMSAtIGR4KSAqICAgICAgZHkKLSAqIAkgICAgICArIFYxMSAqICAgICAgZHggICogICAgICBkeQotICogCi0gKiBOb3RlIHRoYXQgdGhlIHdlaWdodHMgKDEtZHgpKigxLWR5KSArIGR4KigxLWR5KSArICgxLWR4KSpkeSArIGR4KmR5Ci0gKiBhdXRvbWF0aWNhbGx5IGFkZCB1cCB0byAxLiAgSXQgaXMgYWxzbyBuaWNlIHRoYXQgYWxsIHRoZSB3ZWlnaHRzIGFyZQotICogcG9zaXRpdmUgKHVuc2lnbmVkIGNoYXIgc3RheXMgdW5zaWduZWQgY2hhcikuICBUaGUgYWJvdmUgZm9ybXVsYSBjYW4KLSAqIGJlIG1vdGl2YXRlZCBieSBkb2luZyB0d28gMUQgaW50ZXJwb2xhdGlvbnMgYWxvbmcgeDoKLSAqIAotICogCVZBID0gVjAwICogKDEgLSBkeCkgKyBWMTAgKiBkeAotICogCVZCID0gVjAxICogKDEgLSBkeCkgKyBWMTEgKiBkeAotICogCi0gKiBhbmQgdGhlbiBpbnRlcnBvbGF0aW5nIFZBIGFuZCBWQiBhbG9uZyB5OgotICogCi0gKiAJVl9hdmUgPSBWQSAqICgxIC0gZHkpICsgVkIgKiBkeQotICogCi0gKiAgICAgICAgICAgICAgICAgICAgICBWQSAKLSAqICAgICAgICAgICB2ICAgfDwtZHgtPnwKLSAqICAgICAgICAgICAtLSBWMDAgLS0tLS0tIFYxMAotICogICAgICAgICAgIGR5ICB8ICAgICAgICAgIHwgIAotICogICAgICAgICAgIC0tICB8ICAgICAgby4uLnwuLi4gICAgIm8iIGRlbm90ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkCi0gKiAgICAgICAgICAgXiAgIHwgICAgICAuICAgfCAgLiAgICBkZXN0aW5hdGlvbiBwaXhlbCByZWxhdGl2ZSB0byB0aGUgUDAwCi0gKiAgICAgICAgICAgICAgIHwgICAgICAuICAgfCAgLiAgICBzb3VyY2UgcGl4ZWwuCi0gKiAgICAgICAgICAgICAgVjEwIC0tLS0uLSBWMTEgLgotICogICAgICAgICAgICAgICAgICAgICAgLi4uLi4uLi4KLSAqICAgICAgICAgICAgICAgICAgICAgIHwgIAotICogICAgICAgICAgICAgICAgICAgICAgVkIgCi0gKgotICogCi0gKiBPZiBjb3Vyc2UgUiwgRywgQiBhdmVyYWdlcyBhcmUgZG9uZSBzZXBhcmF0ZWx5IGFzIGluIHRoZSBzaHJpbmtpbmcKLSAqIGNhc2UuICBUaGlzIGdpdmVzIHJlYXNvbmFibGUgcmVzdWx0cywgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqIHNocmlua2luZyBjYW4gc2ltcGx5IGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgY2hvaWNlcyBmb3Igd2VpZ2h0cyBmb3IKLSAqIHRoZSBsb29wIG92ZXIgdGhlIDQgcGl4ZWxzLgotICovCi0KLXZvaWQgc2NhbGVfcmVjdChkb3VibGUgZmFjdG9yX3gsIGRvdWJsZSBmYWN0b3JfeSwgaW50IGJsZW5kLCBpbnQgaW50ZXJwb2xhdGUsIGludCBCcHAsCi0gICAgY2hhciAqc3JjX2ZiLCBpbnQgc3JjX2J5dGVzX3Blcl9saW5lLCBjaGFyICpkc3RfZmIsIGludCBkc3RfYnl0ZXNfcGVyX2xpbmUsCi0gICAgaW50IE54LCBpbnQgTnksIGludCBueCwgaW50IG55LCBpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIsIGludCBtYXJrKSB7Ci0vKgotICogTm90YXRpb246Ci0gKiAiaSIgYW4geCBwaXhlbCBpbmRleCBpbiB0aGUgZGVzdGluYXRpb24gKHNjYWxlZCkgZnJhbWVidWZmZXIKLSAqICJqIiBhICB5IHBpeGVsIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbiAoc2NhbGVkKSBmcmFtZWJ1ZmZlcgotICogIkkiIGFuIHggcGl4ZWwgaW5kZXggaW4gdGhlIHNvdXJjZSAodW4tc2NhbGVkLCBpLmUuIG1haW4pIGZyYW1lYnVmZmVyCi0gKiAiSiIgYSAgeSBwaXhlbCBpbmRleCBpbiB0aGUgc291cmNlICh1bi1zY2FsZWQsIGkuZS4gbWFpbikgZnJhbWVidWZmZXIKLSAqCi0gKiAgU2ltaWxhcmx5IGZvciBueCwgbnksIE54LCBOeSwgZXRjLiAgTG93ZXJjYXNlOiBkZXN0LCBVcHBlcmNhc2U6IHNvdXJjZS4KLSAqLwotCWludCBpLCBqLCBpMSwgaTIsIGoxLCBqMjsJLyogaW5kaWNlcyBmb3Igc2NhbGVkIGZiIChkZXN0KSAqLwotCWludCBJLCBKLCBJMSwgSTIsIEoxLCBKMjsJLyogaW5kaWNlcyBmb3IgbWFpbiBmYiAgIChzb3VyY2UpICovCi0KLQlkb3VibGUgdywgd3gsIHd5LCB3dG90OwkvKiBwaXhlbCB3ZWlnaHRzICovCi0KLQlkb3VibGUgeDEsIHkxLCB4MiwgeTI7CS8qIHgteSBjb29yZHMgZm9yIGRlc3RpbmF0aW9uIHBpeGVscyBlZGdlcyAqLwotCWRvdWJsZSBkeCwgZHk7CQkvKiBzaXplIG9mIGRlc3RpbmF0aW9uIHBpeGVsICovCi0JZG91YmxlIGRkeD0wLCBkZHk9MDsJLyogZm9yIGludGVycG9sYXRpb24gZXhwYW5zaW9uICovCi0KLQljaGFyICpzcmMsICpkZXN0OwkvKiBwb2ludGVycyB0byB0aGUgdHdvIGZyYW1lYnVmZmVycyAqLwotCi0KLQl1bnNpZ25lZCBzaG9ydCB1cyA9IDA7Ci0JdW5zaWduZWQgY2hhciAgdWMgPSAwOwotCXVuc2lnbmVkIGludCAgIHVpID0gMDsKLQotCWludCB1c2Vfbm9ibGVuZF9zaG9ydGN1dCA9IDE7Ci0JaW50IHNocmluazsJCS8qIHdoZXRoZXIgc2hyaW5raW5nIG9yIGV4cGFuZGluZyAqLwotCXN0YXRpYyBpbnQgY29uc3RhbnRfd2VpZ2h0cyA9IC0xLCBtYWdfaW50ID0gLTE7Ci0Jc3RhdGljIGludCBsYXN0X054ID0gLTEsIGxhc3RfTnkgPSAtMSwgY250ID0gMDsKLQlzdGF0aWMgZG91YmxlIGxhc3RfZmFjdG9yID0gLTEuMDsKLQlpbnQgYiwgazsKLQlkb3VibGUgcGl4YXZlWzRdOwkvKiBmb3IgYXZlcmFnaW5nIHBpeGVsIHZhbHVlcyAqLwotCi0JaWYgKGZhY3Rvcl94IDw9IDEuMCAmJiBmYWN0b3JfeSA8PSAxLjApIHsKLQkJc2hyaW5rID0gMTsKLQl9IGVsc2UgewotCQlzaHJpbmsgPSAwOwotCX0KLQotCS8qCi0JICogTi5CLiB3aWR0aCBhbmQgaGVpZ2h0IChyZWFsIG51bWJlcnMpIG9mIGEgc2NhbGVkIHBpeGVsLgotCSAqIGJvdGggYXJlID4gMSAgIChlLmcuIDEuMzMzIGZvciAtc2NhbGUgMy80KQotCSAqIHRoZXkgc2hvdWxkIGFsc28gYmUgZXF1YWwgYnV0IHdlIGRvbid0IGFzc3VtZSBpdC4KLQkgKgotCSAqIFRoaXMgbmV3IHdheSBpcyBwcm9iYWJseSB0aGUgYmVzdCB3ZSBjYW4gZG8sIHRha2UgdGhlIGludmVyc2UKLQkgKiBvZiB0aGUgc2NhbGluZyBmYWN0b3IgdG8gZG91YmxlIHByZWNpc2lvbi4KLQkgKi8KLQlkeCA9IDEuMC9mYWN0b3JfeDsKLQlkeSA9IDEuMC9mYWN0b3JfeTsKLQotCS8qCi0JICogVGhlcmUgaXMgc29tZSBzcGVlZHVwIGlmIHRoZSBwaXhlbCB3ZWlnaHRzIGFyZSBjb25zdGFudCwgc28KLQkgKiBsZXQncyBzcGVjaWFsIGNhc2UgdGhlc2UuCi0JICoKLQkgKiBJZiBzY2FsZSA9IDEvbiBhbmQgbiBkaXZpZGVzIE54IGFuZCBOeSwgdGhlIHBpeGVsIHdlaWdodHMKLQkgKiBhcmUgY29uc3RhbnQgKGUuZy4gMS8yID0+IGVxdWFsIG9uIDJ4MiBzcXVhcmUpLgotCSAqLwotCWlmIChmYWN0b3JfeCAhPSBsYXN0X2ZhY3RvciB8fCBOeCAhPSBsYXN0X054IHx8IE55ICE9IGxhc3RfTnkpIHsKLQkJY29uc3RhbnRfd2VpZ2h0cyA9IC0xOwotCQltYWdfaW50ID0gLTE7Ci0JCWxhc3RfTnggPSBOeDsKLQkJbGFzdF9OeSA9IE55OwotCQlsYXN0X2ZhY3RvciA9IGZhY3Rvcl94OwotCX0KLQlpZiAoY29uc3RhbnRfd2VpZ2h0cyA8IDAgJiYgZmFjdG9yX3ggIT0gZmFjdG9yX3kpIHsKLQkJY29uc3RhbnRfd2VpZ2h0cyA9IDA7Ci0JCW1hZ19pbnQgPSAwOwotCi0JfSBlbHNlIGlmIChjb25zdGFudF93ZWlnaHRzIDwgMCkgewotCQlpbnQgbiA9IDA7Ci0KLQkJY29uc3RhbnRfd2VpZ2h0cyA9IDA7Ci0JCW1hZ19pbnQgPSAwOwotCi0JCWZvciAoaSA9IDI7IGk8PTEyODsgaSsrKSB7Ci0JCQlkb3VibGUgdGVzdCA9ICgoZG91YmxlKSAxKS8gaTsKLQkJCWRvdWJsZSBkaWZmLCBlcHMgPSAxLjBlLTc7Ci0JCQlkaWZmID0gZmFjdG9yX3ggLSB0ZXN0OwotCQkJaWYgKC1lcHMgPCBkaWZmICYmIGRpZmYgPCBlcHMpIHsKLQkJCQluID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoISBibGVuZCB8fCAhIHNocmluayB8fCBpbnRlcnBvbGF0ZSkgewotCQkJOwotCQl9IGVsc2UgaWYgKG4gIT0gMCkgewotCQkJaWYgKE54ICUgbiA9PSAwICYmIE55ICUgbiA9PSAwKSB7Ci0JCQkJc3RhdGljIGludCBkaWRtc2cgPSAwOwotCQkJCWlmIChtYXJrICYmICEgZGlkbXNnKSB7Ci0JCQkJCWRpZG1zZyA9IDE7Ci0JCQkJCXJmYkxvZygic2NhbGVfYW5kX21hcmtfcmVjdDogdXNpbmcgIgotCQkJCQkgICAgImNvbnN0YW50IHBpeGVsIHdlaWdodCBzcGVlZHVwICIKLQkJCQkJICAgICJmb3IgMS8lZFxuIiwgbik7Ci0JCQkJfQotCQkJCWNvbnN0YW50X3dlaWdodHMgPSAxOwotCQkJfQotCQl9Ci0KLQkJbiA9IDA7Ci0JCWZvciAoaSA9IDI7IGk8PTMyOyBpKyspIHsKLQkJCWRvdWJsZSB0ZXN0ID0gKGRvdWJsZSkgaTsKLQkJCWRvdWJsZSBkaWZmLCBlcHMgPSAxLjBlLTc7Ci0JCQlkaWZmID0gZmFjdG9yX3ggLSB0ZXN0OwotCQkJaWYgKC1lcHMgPCBkaWZmICYmIGRpZmYgPCBlcHMpIHsKLQkJCQluID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoISBibGVuZCAmJiBmYWN0b3JfeCA+IDEuMCAmJiBuKSB7Ci0JCQltYWdfaW50ID0gbjsKLQkJfQotCX0KLQotCWlmIChtYXJrICYmIGZhY3Rvcl94ID4gMS4wICYmIGJsZW5kKSB7Ci0JCS8qCi0JCSAqIGtsdWRnZTogY29ycmVjdCBmb3IgaW50ZXJwb2xhdGluZyBibHVycmluZyBsZWFraW5nCi0JCSAqIHVwIG9yIGxlZnQgMSBkZXN0aW5hdGlvbiBwaXhlbC4KLQkJICovCi0JCWlmIChYMSA+IDApIFgxLS07Ci0JCWlmIChZMSA+IDApIFkxLS07Ci0JfQotCi0JLyoKLQkgKiBmaW5kIHRoZSBleHRlbnQgb2YgdGhlIGNoYW5nZSB0aGUgaW5wdXQgcmVjdGFuZ2xlIGluZHVjZXMgaW4KLQkgKiB0aGUgc2NhbGVkIGZyYW1lYnVmZmVyLgotCSAqLwotCi0JLyogTGVmdCBlZGdlczogZmluZCBsYXJnZXN0IGkgc3VjaCB0aGF0IGkgKiBkeCA8PSBYMSAgKi8KLQlpMSA9IEZMT09SKFgxL2R4KTsKLQotCS8qIFJpZ2h0IGVkZ2VzOiBmaW5kIHNtYWxsZXN0IGkgc3VjaCB0aGF0IChpKzEpICogZHggPj0gWDIrMSAgKi8KLQlpMiA9IENFSUwoIChYMisxKS9keCApIC0gMTsKLQotCS8qIFRvIGJlIHNhZmUsIGNvcnJlY3QgYW55IG92ZXJmbG93czogKi8KLQlpMSA9IG5maXgoaTEsIG54KTsKLQlpMiA9IG5maXgoaTIsIG54KSArIDE7CS8qIGFkZCAxIHRvIG1ha2UgYSByZWN0YW5nbGUgdXBwZXIgYm91bmRhcnkgKi8KLQotCS8qIFJlcGVhdCBhYm92ZSBmb3IgeSBkaXJlY3Rpb246ICovCi0JajEgPSBGTE9PUihZMS9keSk7Ci0JajIgPSBDRUlMKCAoWTIrMSkvZHkgKSAtIDE7Ci0KLQlqMSA9IG5maXgoajEsIG55KTsKLQlqMiA9IG5maXgoajIsIG55KSArIDE7Ci0KLQkvKgotCSAqIHNwZWNpYWwgY2FzZSBpbnRlZ2VyIG1hZ25pZmljYXRpb24gd2l0aCBubyBibGVuZGluZy4KLQkgKiB2aXNpb24gaW1wYWlyZWQgbWFnbmlmaWNhdGlvbiB1c2FnZSBpcyBpbnRlcmVzdGVkIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlpZiAobWFyayAmJiAhIGJsZW5kICYmIG1hZ19pbnQgJiYgQnBwICE9IDMpIHsKLQkJaW50IGptaW4sIGptYXgsIGltaW4sIGltYXg7Ci0KLQkJLyogb3V0ZXIgbG9vcCBvdmVyICpzb3VyY2UqIHBpeGVscyAqLwotCQlmb3IgKEo9WTE7IEogPCBZMjsgSisrKSB7Ci0JCSAgICBqbWluID0gSiAqIG1hZ19pbnQ7Ci0JCSAgICBqbWF4ID0gam1pbiArIG1hZ19pbnQ7Ci0JCSAgICBmb3IgKEk9WDE7IEkgPCBYMjsgSSsrKSB7Ci0JCQkvKiBleHRyYWN0IHZhbHVlICovCi0JCQlzcmMgPSBzcmNfZmIgKyBKKnNyY19ieXRlc19wZXJfbGluZSArIEkqQnBwOwotCQkJaWYgKEJwcCA9PSA0KSB7Ci0JCQkJdWkgPSAqKCh1bnNpZ25lZCBpbnQgKilzcmMpOwotCQkJfSBlbHNlIGlmIChCcHAgPT0gMikgewotCQkJCXVzID0gKigodW5zaWduZWQgc2hvcnQgKilzcmMpOwotCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotCQkJCXVjID0gKigodW5zaWduZWQgY2hhciAqKXNyYyk7Ci0JCQl9Ci0JCQlpbWluID0gSSAqIG1hZ19pbnQ7Ci0JCQlpbWF4ID0gaW1pbiArIG1hZ19pbnQ7Ci0JCQkvKiBpbm5lciBsb29wIG92ZXIgKmRlc3QqIHBpeGVscyAqLwotCQkJZm9yIChqPWptaW47IGo8am1heDsgaisrKSB7Ci0JCQkgICAgZGVzdCA9IGRzdF9mYiArIGoqZHN0X2J5dGVzX3Blcl9saW5lICsgaW1pbipCcHA7Ci0JCQkgICAgZm9yIChpPWltaW47IGk8aW1heDsgaSsrKSB7Ci0JCQkJaWYgKEJwcCA9PSA0KSB7Ci0JCQkJCSooKHVuc2lnbmVkIGludCAqKWRlc3QpID0gdWk7Ci0JCQkJfSBlbHNlIGlmIChCcHAgPT0gMikgewotCQkJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKWRlc3QpID0gdXM7Ci0JCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotCQkJCQkqKCh1bnNpZ25lZCBjaGFyICopZGVzdCkgPSB1YzsKLQkJCQl9Ci0JCQkJZGVzdCArPSBCcHA7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JCWdvdG8gbWFya2l0OwotCX0KLQotCS8qIHNldCB0aGVzZSBhbGwgdG8gMS4wIHRvIGJlZ2luIHdpdGggKi8KLQl3eCA9IDEuMDsKLQl3eSA9IDEuMDsKLQl3ICA9IDEuMDsKLQotCS8qCi0JICogTG9vcCBvdmVyIGRlc3RpbmF0aW9uIHBpeGVscyBpbiBzY2FsZWQgZmI6Ci0JICovCi0JZm9yIChqPWoxOyBqPGoyOyBqKyspIHsKLQkJeTEgPSAgaiAqIGR5OwkvKiB0b3AgZWRnZSAqLwotCQlpZiAoeTEgPiBOeSAtIDEpIHsKLQkJCS8qIGNhbiBnbyBvdmVyIHdpdGggZHkgPSAxL3NjYWxlX2ZhYyAqLwotCQkJeTEgPSBOeSAtIDE7Ci0JCX0KLQkJeTIgPSB5MSArIGR5OwkvKiBib3R0b20gZWRnZSAqLwotCi0JCS8qIEZpbmQgbWFpbiBmYiBpbmRpY2VzIGNvdmVyZWQgYnkgdGhpcyBkZXN0IHBpeGVsOiAqLwotCQlKMSA9IChpbnQpIEZMT09SKHkxKTsKLQkJSjEgPSBuZml4KEoxLCBOeSk7Ci0KLQkJaWYgKHNocmluayAmJiAhIGludGVycG9sYXRlKSB7Ci0JCQlKMiA9IChpbnQpIENFSUwoeTIpIC0gMTsKLQkJCUoyID0gbmZpeChKMiwgTnkpOwotCQl9IGVsc2UgewotCQkJSjIgPSBKMSArIDE7CS8qIHNpbXBsZSBpbnRlcnBvbGF0aW9uICovCi0JCQlkZHkgPSB5MSAtIEoxOwotCQl9Ci0KLQkJLyogZGVzdGluYXRpb24gY2hhciogcG9pbnRlcjogKi8KLQkJZGVzdCA9IGRzdF9mYiArIGoqZHN0X2J5dGVzX3Blcl9saW5lICsgaTEqQnBwOwotCQkKLQkJZm9yIChpPWkxOyBpPGkyOyBpKyspIHsKLQotCQkJeDEgPSAgaSAqIGR4OwkvKiBsZWZ0IGVkZ2UgKi8KLQkJCWlmICh4MSA+IE54IC0gMSkgewotCQkJCS8qIGNhbiBnbyBvdmVyIHdpdGggZHggPSAxL3NjYWxlX2ZhYyAqLwotCQkJCXgxID0gTnggLSAxOwotCQkJfQotCQkJeDIgPSB4MSArIGR4OwkvKiByaWdodCBlZGdlICovCi0KLQkJCWNudCsrOwotCi0JCQkvKiBGaW5kIG1haW4gZmIgaW5kaWNlcyBjb3ZlcmVkIGJ5IHRoaXMgZGVzdCBwaXhlbDogKi8KLQkJCUkxID0gKGludCkgRkxPT1IoeDEpOwotCQkJaWYgKEkxID49IE54KSBJMSA9IE54IC0gMTsKLQotCQkJaWYgKCEgYmxlbmQgJiYgdXNlX25vYmxlbmRfc2hvcnRjdXQpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBub2JsZW5kIGNhc2UgaW52b2x2ZXMgbm8gd2VpZ2h0cywKLQkJCQkgKiBhbmQgMSBwaXhlbCwgc28ganVzdCBjb3B5IHRoZSB2YWx1ZQotCQkJCSAqIGRpcmVjdGx5LgotCQkJCSAqLwotCQkJCXNyYyA9IHNyY19mYiArIEoxKnNyY19ieXRlc19wZXJfbGluZSArIEkxKkJwcDsKLQkJCQlpZiAoQnBwID09IDQpIHsKLQkJCQkJKigodW5zaWduZWQgaW50ICopZGVzdCkKLQkJCQkJICAgID0gKigodW5zaWduZWQgaW50ICopc3JjKTsKLQkJCQl9IGVsc2UgaWYgKEJwcCA9PSAyKSB7Ci0JCQkJCSooKHVuc2lnbmVkIHNob3J0ICopZGVzdCkKLQkJCQkJICAgID0gKigodW5zaWduZWQgc2hvcnQgKilzcmMpOwotCQkJCX0gZWxzZSBpZiAoQnBwID09IDEpIHsKLQkJCQkJKihkZXN0KSA9ICooc3JjKTsKLQkJCQl9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0JCQkJCS8qIHJhcmUgY2FzZSAqLwotCQkJCQlmb3IgKGs9MDsgazw9MjsgaysrKSB7Ci0JCQkJCQkqKGRlc3QraykgPSAqKHNyYytrKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkZXN0ICs9IEJwcDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKHNocmluayAmJiAhIGludGVycG9sYXRlKSB7Ci0JCQkJSTIgPSAoaW50KSBDRUlMKHgyKSAtIDE7Ci0JCQkJaWYgKEkyID49IE54KSBJMiA9IE54IC0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJSTIgPSBJMSArIDE7CS8qIHNpbXBsZSBpbnRlcnBvbGF0aW9uICovCi0JCQkJZGR4ID0geDEgLSBJMTsKLQkJCX0KLQotCQkJLyogWmVybyBvdXQgYWNjdW11bGF0b3JzIGZvciBuZXh0IHBpeGVsIGF2ZXJhZ2U6ICovCi0JCQlmb3IgKGI9MDsgYjw0OyBiKyspIHsKLQkJCQlwaXhhdmVbYl0gPSAwLjA7IC8qIGZvciBSR0Igd2VpZ2h0ZWQgc3VtcyAqLwotCQkJfQotCi0JCQkvKgotCQkJICogd3RvdCBpcyBmb3IgYWNjdW11bGF0aW5nIHRoZSB0b3RhbCB3ZWlnaHQuCi0JCQkgKiBJdCBzaG91bGQgYWx3YXlzIHN1bSB0byAxLyhzY2FsZV9mYWMgKiBzY2FsZV9mYWMpLgotCQkJICovCi0JCQl3dG90ID0gMC4wOwotCi0JCQkvKgotCQkJICogTG9vcCBvdmVyIHNvdXJjZSBwaXhlbHMgY292ZXJlZCBieSB0aGlzIGRlc3QgcGl4ZWwuCi0JCQkgKiAKLQkJCSAqIFRoZXNlICJleHRyYSIgbG9vcHMgb3ZlciAiSiIgYW5kICJJIiBtYWtlCi0JCQkgKiB0aGUgY2FjaGUvY2FjaGVsaW5lIHBlcmZvcm1hbmNlIHVuY2xlYXIuCi0JCQkgKiBGb3IgZXhhbXBsZSwgd2lsbCB0aGUgZGF0YSBicm91Z2h0IGluIGZyb20KLQkJCSAqIHNyYyBmb3IgaiwgaSwgYW5kIEo9MCBzdGlsbCBiZSBpbiB0aGUgY2FjaGUKLQkJCSAqIGFmdGVyIHRoZSBKID4gMCBkYXRhIGhhdmUgYmVlbiBhY2Nlc3NlZCBhbmQKLQkJCSAqIHdlIGFyZSBhdCBqLCBpKzEsIEo9MD8gIFRoZSBzdHJpZGUgaW4gSiBpcwotCQkJICogbWFpbl9ieXRlc19wZXJfbGluZSwgYW5kIHNvIH40IEtCLgotCQkJICoKLQkJCSAqIFR5cGljYWwgY2FzZSB3aGVuIHNocmlua2luZyBhcmUgMngyIGxvb3AsIHNvCi0JCQkgKiBqdXN0IHR3byBsaW5lcyB0byB3b3JyeSBhYm91dC4KLQkJCSAqLwotCQkJZm9yIChKPUoxOyBKPD1KMjsgSisrKSB7Ci0JCQkgICAgLyogc2VlIGNvbW1lbnRzIGZvciBJLCB4MSwgeDIsIGV0Yy4gYmVsb3cgKi8KLQkJCSAgICBpZiAoY29uc3RhbnRfd2VpZ2h0cykgewotCQkJCTsKLQkJCSAgICB9IGVsc2UgaWYgKCEgYmxlbmQpIHsKLQkJCQlpZiAoSiAhPSBKMSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJd3kgPSAxLjA7Ci0KLQkJCQkvKiBpbnRlcnBvbGF0aW9uIHNjaGVtZTogKi8KLQkJCSAgICB9IGVsc2UgaWYgKCEgc2hyaW5rIHx8IGludGVycG9sYXRlKSB7Ci0JCQkJaWYgKEogPj0gTnkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChKID09IEoxKSB7Ci0JCQkJCXd5ID0gMS4wIC0gZGR5OwotCQkJCX0gZWxzZSBpZiAoSiAhPSBKMSkgewotCQkJCQl3eSA9IGRkeTsKLQkJCQl9Ci0KLQkJCQkvKiBpbnRlZ3JhdGlvbiBzY2hlbWU6ICovCi0JCQkgICAgfSBlbHNlIGlmIChKIDwgeTEpIHsKLQkJCQl3eSA9IEorMSAtIHkxOwotCQkJICAgIH0gZWxzZSBpZiAoSisxID4geTIpIHsKLQkJCQl3eSA9IHkyIC0gSjsKLQkJCSAgICB9IGVsc2UgewotCQkJCXd5ID0gMS4wOwotCQkJICAgIH0KLQotCQkJICAgIHNyYyA9IHNyY19mYiArIEoqc3JjX2J5dGVzX3Blcl9saW5lICsgSTEqQnBwOwotCi0JCQkgICAgZm9yIChJPUkxOyBJPD1JMjsgSSsrKSB7Ci0KLQkJCQkvKiBXb3JrIG91dCB0aGUgd2VpZ2h0OiAqLwotCi0JCQkJaWYgKGNvbnN0YW50X3dlaWdodHMpIHsKLQkJCQkJOwotCQkJCX0gZWxzZSBpZiAoISBibGVuZCkgewotCQkJCQkvKgotCQkJCQkgKiBVZ2gsIFBzZXVkb0NvbG9yIGNvbG9ybWFwIGlzCi0JCQkJCSAqIGJhZCBuZXdzLCB0byBhdm9pZCByYW5kb20KLQkJCQkJICogY29sb3JzIGp1c3QgdGFrZSB0aGUgZmlyc3QKLQkJCQkJICogcGl4ZWwuICBPciB1c2VyIG1heSBoYXZlCi0JCQkJCSAqIHNwZWNpZmllZCA6bmIgdG8gZnJhY3Rpb24uCi0JCQkJCSAqIFRoZSA6ZmIgd2lsbCBmb3JjZSBibGVuZGluZwotCQkJCQkgKiBmb3IgdGhpcyBjYXNlLgotCQkJCQkgKi8KLQkJCQkJaWYgKEkgIT0gSTEpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXd4ID0gMS4wOwotCi0JCQkJCS8qIGludGVycG9sYXRpb24gc2NoZW1lOiAqLwotCQkJCX0gZWxzZSBpZiAoISBzaHJpbmsgfHwgaW50ZXJwb2xhdGUpIHsKLQkJCQkJaWYgKEkgPj0gTngpIHsKLQkJCQkJCWNvbnRpbnVlOwkvKiBvZmYgZWRnZSAqLwotCQkJCQl9IGVsc2UgaWYgKEkgPT0gSTEpIHsKLQkJCQkJCXd4ID0gMS4wIC0gZGR4OwotCQkJCQl9IGVsc2UgaWYgKEkgIT0gSTEpIHsKLQkJCQkJCXd4ID0gZGR4OwotCQkJCQl9Ci0KLQkJCQkJLyogaW50ZWdyYXRpb24gc2NoZW1lOiAqLwotCQkJCX0gZWxzZSBpZiAoSSA8IHgxKSB7Ci0JCQkJCS8qIAotCQkJCQkgKiBzb3VyY2UgbGVmdCBlZGdlIChJKSB0byB0aGUKLQkJCQkJICogbGVmdCBvZiBkZXN0IGxlZnQgZWRnZSAoeDEpOgotCQkJCQkgKiBmcmFjdGlvbmFsIHdlaWdodAotCQkJCQkgKi8KLQkJCQkJd3ggPSBJKzEgLSB4MTsKLQkJCQl9IGVsc2UgaWYgKEkrMSA+IHgyKSB7Ci0JCQkJCS8qIAotCQkJCQkgKiBzb3VyY2UgcmlnaHQgZWRnZSAoSSsxKSB0byB0aGUKLQkJCQkJICogcmlnaHQgb2YgZGVzdCByaWdodCBlZGdlICh4Mik6Ci0JCQkJCSAqIGZyYWN0aW9uYWwgd2VpZ2h0Ci0JCQkJCSAqLwotCQkJCQl3eCA9IHgyIC0gSTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiAKLQkJCQkJICogc291cmNlIGVkZ2VzIChJIGFuZCBJKzEpIGNvbXBsZXRlbHkKLQkJCQkJICogaW5zaWRlIGRlc3QgZWRnZXMgKHgxIGFuZCB4Mik6Ci0JCQkJCSAqIGZ1bGwgd2VpZ2h0Ci0JCQkJCSAqLwotCQkJCQl3eCA9IDEuMDsKLQkJCQl9Ci0KLQkJCQl3ID0gd3ggKiB3eTsKLQkJCQl3dG90ICs9IHc7Ci0KLQkJCQkvKiAKLQkJCQkgKiBXZSBhdmVyYWdlIHRoZSB1bnNpZ25lZCBjaGFyIHZhbHVlCi0JCQkJICogaW5zdGVhZCBvZiBjaGFyIHZhbHVlOiBvdGhlcndpc2UKLQkJCQkgKiB0aGUgbWluaW11bSAoY2hhciAwKSBpcyByaWdodCBuZXh0Ci0JCQkJICogdG8gdGhlIG1heGltdW0gKGNoYXIgLTEpISAgVGhpcyB3YXkKLQkJCQkgKiB0aGV5IGFyZSBzcHJlYWQgYmV0d2VlbiAwIGFuZCAyNTUuCi0JCQkJICovCi0JCQkJaWYgKEJwcCA9PSA0KSB7Ci0JCQkJCS8qIHVucm9sbCB0aGUgbG9vcHMsIGNhbiBnaXZlIDIwJSAqLwotCQkJCQlwaXhhdmVbMF0gKz0gdyAqICgodW5zaWduZWQgY2hhcikgKihzcmMgICkpOwotCQkJCQlwaXhhdmVbMV0gKz0gdyAqICgodW5zaWduZWQgY2hhcikgKihzcmMrMSkpOwotCQkJCQlwaXhhdmVbMl0gKz0gdyAqICgodW5zaWduZWQgY2hhcikgKihzcmMrMikpOwotCQkJCQlwaXhhdmVbM10gKz0gdyAqICgodW5zaWduZWQgY2hhcikgKihzcmMrMykpOwotCQkJCX0gZWxzZSBpZiAoQnBwID09IDIpIHsKLQkJCQkJLyoKLQkJCQkJICogMTZicHA6IHRyaWNraWVyIHdpdGggZ3JlZW4KLQkJCQkJICogc3BsaXQgb3ZlciB0d28gYnl0ZXMsIHNvIHdlCi0JCQkJCSAqIHVzZSB0aGUgbWFza3M6Ci0JCQkJCSAqLwotCQkJCQl1cyA9ICooKHVuc2lnbmVkIHNob3J0ICopIHNyYyk7Ci0JCQkJCXBpeGF2ZVswXSArPSB3Kih1cyAmIG1haW5fcmVkX21hc2spOwotCQkJCQlwaXhhdmVbMV0gKz0gdyoodXMgJiBtYWluX2dyZWVuX21hc2spOwotCQkJCQlwaXhhdmVbMl0gKz0gdyoodXMgJiBtYWluX2JsdWVfbWFzayk7Ci0JCQkJfSBlbHNlIGlmIChCcHAgPT0gMSkgewotCQkJCQlwaXhhdmVbMF0gKz0gdyAqCi0JCQkJCSAgICAoKHVuc2lnbmVkIGNoYXIpICooc3JjKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChiPTA7IGI8QnBwOyBiKyspIHsKLQkJCQkJCXBpeGF2ZVtiXSArPSB3ICoKLQkJCQkJCSAgICAoKHVuc2lnbmVkIGNoYXIpICooc3JjK2IpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzcmMgKz0gQnBwOwotCQkJICAgIH0KLQkJCX0KLQotCQkJaWYgKHd0b3QgPD0gMC4wKSB7Ci0JCQkJd3RvdCA9IDEuMDsKLQkJCX0KLQkJCXd0b3QgPSAxLjAvd3RvdDsJLyogbm9ybWFsaXphdGlvbiBmYWN0b3IgKi8KLQotCQkJLyogcGxhY2Ugd2VpZ2h0ZWQgYXZlcmFnZSBwaXhlbCBpbiB0aGUgc2NhbGVkIGZiOiAqLwotCQkJaWYgKEJwcCA9PSA0KSB7Ci0JCQkJKihkZXN0ICApID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzBdKTsKLQkJCQkqKGRlc3QrMSkgPSAoY2hhcikgKHd0b3QgKiBwaXhhdmVbMV0pOwotCQkJCSooZGVzdCsyKSA9IChjaGFyKSAod3RvdCAqIHBpeGF2ZVsyXSk7Ci0JCQkJKihkZXN0KzMpID0gKGNoYXIpICh3dG90ICogcGl4YXZlWzNdKTsKLQkJCX0gZWxzZSBpZiAoQnBwID09IDIpIHsKLQkJCQkvKiAxNmJwcCAvIDU2NSBjYXNlOiAqLwotCQkJCXBpeGF2ZVswXSAqPSB3dG90OwotCQkJCXBpeGF2ZVsxXSAqPSB3dG90OwotCQkJCXBpeGF2ZVsyXSAqPSB3dG90OwotCQkJCXVzID0gIChtYWluX3JlZF9tYXNrICAgJiAoaW50KSBwaXhhdmVbMF0pCi0JCQkJICAgIHwgKG1haW5fZ3JlZW5fbWFzayAmIChpbnQpIHBpeGF2ZVsxXSkKLQkJCQkgICAgfCAobWFpbl9ibHVlX21hc2sgICYgKGludCkgcGl4YXZlWzJdKTsKLQkJCQkqKCAodW5zaWduZWQgc2hvcnQgKikgZGVzdCApID0gdXM7Ci0JCQl9IGVsc2UgaWYgKEJwcCA9PSAxKSB7Ci0JCQkJKihkZXN0KSA9IChjaGFyKSAod3RvdCAqIHBpeGF2ZVswXSk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoYj0wOyBiPEJwcDsgYisrKSB7Ci0JCQkJCSooZGVzdCtiKSA9IChjaGFyKSAod3RvdCAqIHBpeGF2ZVtiXSk7Ci0JCQkJfQotCQkJfQotCQkJZGVzdCArPSBCcHA7Ci0JCX0KLQl9Ci0JbWFya2l0OgotCWlmIChtYXJrKSB7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZChpMSwgajEsIGkyLCBqMiwgMSk7Ci0JfQotfQotCi0vKgotIEZyYW1lYnVmZmVycyBkYXRhIGZsb3c6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIEdlbmVyYWwgY2FzZToKLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgICAgICAtLS0tLS0tLSAgICAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0gICAgCi0gICAgLS0tLS0gICAgICB8OHRvMjRfZmJ8ICAgICB8bWFpbl9mYiB8ICAgICB8c25hcF9mYiB8ICAgICAgfCBYICAgICAgfCAgICAKLSAgIHxyZmJmYnwgPD09IHwgICAgICAgIHwgPD09IHwgICAgICAgIHwgPD09IHwgICAgICAgIHwgPD09ICB8IFNlcnZlciB8ICAgIAotICAgIC0tLS0tICAgICAgIC0tLS0tLS0tICAgICAgIC0tLS0tLS0tICAgICAgIC0tLS0tLS0tICAgICAgICAtLS0tLS0tLSAgICAKLSAgICh0byB2bmMpICAgIChvcHRpb25hbCkgICAgKHVzdSA9IHJmYmZiKSAgIChvcHRpb25hbCkgICAgICAocmVhZCBvbmx5KSAgIAotCi0gOHRvMjRfZmIgbW9kZSB3aWxsIGNyZWF0ZSBzaWRlIGZiczogcG9sbDI0X2ZiIGFuZCBwb2xsOF9mYiBmb3IKLSBib29ra2VlcHBpbmcgdGhlIGRpZmZlcmVudCByZWdpb25zIChtZXJnZWQgaW50byA4dG8yNF9mYikuCi0KLSBOb3JtYWwgY2FzZToKLSAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0gICAgCi0gICB8bWFpbl9mYiB8ICAgICAgfCBYICAgICAgfCAgICAKLSAgIHw9IHJmYl9mYnwgPD09ICB8IFNlcnZlciB8ICAgIAotICAgIC0tLS0tLS0tICAgICAgICAtLS0tLS0tLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gU2NhbGluZyBjYXNlOgotICAgICAgICAgICAgICAgIC0tLS0tLS0tICAgICAgICAtLS0tLS0tLSAgICAKLSAgICAtLS0tLSAgICAgIHxtYWluX2ZiIHwgICAgICB8IFggICAgICB8ICAgIAotICAgfHJmYmZifCA8PT0gfCAgICAgICAgfCA8PT0gIHwgU2VydmVyIHwgICAgCi0gICAgLS0tLS0gICAgICAgLS0tLS0tLS0gICAgICAgIC0tLS0tLS0tICAgIAotCi0gV2ViY2FtL3ZpZGVvIGNhc2U6Ci0gICAgLS0tLS0tLS0gICAgICAgIC0tLS0tLS0tICAgICAgICAtLS0tLS0tLSAgICAKLSAgIHxtYWluX2ZiIHwgICAgICB8c25hcF9mYiB8ICAgICAgfCBWaWRlbyAgfCAgICAKLSAgIHwgICAgICAgIHwgPD09ICB8ICAgICAgICB8IDw9PSAgfCBkZXZpY2UgfCAgICAKLSAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0gICAgICAgIC0tLS0tLS0tICAgIAotCi1JZiB3ZSBldmVyIGRvIGEgLXJyIHJvdGF0aW9uL3JlZmxlY3Rpb24gdHJhbiwgaXQgcHJvYmFibHkgc2hvdWxkIAotYmUgZG9uZSBhZnRlciBhbnkgc2NhbGluZyAobmVlZCBhIHJyX2ZiIGZvciBpbnRlcm1lZGlhdGUgcmVzdWx0cykKLQotLXJyIG9wdGlvbjoJCXRyYW5zZm9ybWF0aW9uOgotCi0Jbm9uZQkJeCAtPiB4OwotCQkJeSAtPiB5OwotCi0JeAkJeCAtPiB3IC0geCAtIDE7Ci0JCQl5IC0+IHk7Ci0KLQl5CQl4IC0+IHg7Ci0JCQl4IC0+IGggLSB5IC0gMTsKLQotCXh5CQl4IC0+IHcgLSB4IC0gMTsKLQkJCXkgLT4gaCAtIHkgLSAxOwotCi0JKzkwCQl4IC0+IGggLSB5IC0gMTsKLQkJCXkgLT4geDsKLQotCSs5MHgJCXggLT4geTsKLQkJCXkgLT4geDsKLQotCSs5MHkJCXggLT4gaCAtIHkgLSAxOwotCQkJeSAtPiB3IC0geCAtIDE7Ci0KLQktOTAJCXggLT4geTsKLQkJCXkgLT4gdyAtIHggLSAxOwotCi1zb21lIGFsaWFzZXM6Ci0KLQl4eToJeXgsICsxODAsIC0xODAsIDE4MAotCSs5MDoJOTAKLQkrOTB4Ogk5MHgKLQkrOTB5Ogk5MHkKLQktOTA6CSsyNzAsIDI3MAotICovCi0KLXZvaWQgc2NhbGVfYW5kX21hcmtfcmVjdChpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIsIGludCBtYXJrKSB7Ci0JY2hhciAqZHN0X2ZiLCAqc3JjX2ZiID0gbWFpbl9mYjsKLQlpbnQgZHN0X2JwbCwgQnBwID0gYnBwLzgsIGZhYyA9IDE7Ci0KLQlpZiAoIXNjcmVlbiB8fCAhcmZiX2ZiIHx8ICFtYWluX2ZiKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCEgc2NyZWVuLT5zZXJ2ZXJGb3JtYXQudHJ1ZUNvbG91cikgewotCQkvKgotCQkgKiBQc2V1ZG9Db2xvciBjb2xvcm1hcC4uLiBibGVuZGluZyBsZWFkcyB0byByYW5kb20gY29sb3JzLgotCQkgKiBVc2VyIGNhbiBvdmVycmlkZSB3aXRoICI6ZmIiCi0JCSAqLwotCQlpZiAoc2NhbGluZ19ibGVuZCA9PSAxKSB7Ci0JCQkvKiA6ZmIgb3B0aW9uIHNldHMgaXQgdG8gMiAqLwotCQkJaWYgKGRlZmF1bHRfdmlzdWFsLT5jbGFzcyA9PSBTdGF0aWNHcmF5KSB7Ci0JCQkJLyoKLQkJCQkgKiBTdGF0aWNHcmF5IGNhbiBiZSBibGVuZGVkIE9LLCBvdGhlcndpc2UKLQkJCQkgKiB1c2VyIGNhbiBkaXNhYmxlIHdpdGggOm5iCi0JCQkJICovCi0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlzY2FsaW5nX2JsZW5kID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChjbWFwOHRvMjQgJiYgY21hcDh0bzI0X2ZiKSB7Ci0JCXNyY19mYiA9IGNtYXA4dG8yNF9mYjsKLQkJaWYgKHNjYWxpbmcpIHsKLQkJCWlmIChkZXB0aCA8PSA4KSB7Ci0JCQkJZmFjID0gNDsKLQkJCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYpIHsKLQkJCQlmYWMgPSAyOwotCQkJfQotCQl9Ci0JfQotCWRzdF9mYiA9IHJmYl9mYjsKLQlkc3RfYnBsID0gcmZiX2J5dGVzX3Blcl9saW5lOwotCi0Jc2NhbGVfcmVjdChzY2FsZV9mYWNfeCwgc2NhbGVfZmFjX3ksIHNjYWxpbmdfYmxlbmQsIHNjYWxpbmdfaW50ZXJwb2xhdGUsIGZhYyAqIEJwcCwKLQkgICAgc3JjX2ZiLCBmYWMgKiBtYWluX2J5dGVzX3Blcl9saW5lLCBkc3RfZmIsIGRzdF9icGwsIGRweV94LCBkcHlfeSwKLQkgICAgc2NhbGVkX3gsIHNjYWxlZF95LCBYMSwgWTEsIFgyLCBZMiwgbWFyayk7Ci19Ci0KLXZvaWQgcm90YXRlX2Nvb3JkcyhpbnQgeCwgaW50IHksIGludCAqeG8sIGludCAqeW8sIGludCBkeGksIGludCBkeWkpIHsKLQlpbnQgeGkgPSB4LCB5aSA9IHk7Ci0JaW50IER4LCBEeTsKLQotCWlmIChkeGkgPj0gMCkgewotCQlEeCA9IGR4aTsKLQkJRHkgPSBkeWk7Ci0JfSBlbHNlIGlmIChzY2FsaW5nKSB7Ci0JCUR4ID0gc2NhbGVkX3g7Ci0JCUR5ID0gc2NhbGVkX3k7Ci0JfSBlbHNlIHsKLQkJRHggPSBkcHlfeDsKLQkJRHkgPSBkcHlfeTsKLQl9Ci0KLQkvKiBuY2FjaGU/PyAqLwotCi0JaWYgKHJvdGF0aW5nID09IFJPVEFURV9OT05FKSB7Ci0JCSp4byA9IHhpOwotCQkqeW8gPSB5aTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YKSB7Ci0JCSp4byA9IER4IC0geGkgLSAxOwotCQkqeW8gPSB5aTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9ZKSB7Ci0JCSp4byA9IHhpOwotCQkqeW8gPSBEeSAtIHlpIC0gMTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YWSkgewotCQkqeG8gPSBEeCAtIHhpIC0gMTsKLQkJKnlvID0gRHkgLSB5aSAtIDE7Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTApIHsKLQkJKnhvID0gRHkgLSB5aSAtIDE7Ci0JCSp5byA9IHhpOwotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwWCkgewotCQkqeG8gPSB5aTsKLQkJKnlvID0geGk7Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTBZKSB7Ci0JCSp4byA9IER5IC0geWkgLSAxOwotCQkqeW8gPSBEeCAtIHhpIC0gMTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV8yNzApIHsKLQkJKnhvID0geWk7Ci0JCSp5byA9IER4IC0geGkgLSAxOwotCX0KLX0KLQotdm9pZCByb3RhdGVfY29vcmRzX2ludmVyc2UoaW50IHgsIGludCB5LCBpbnQgKnhvLCBpbnQgKnlvLCBpbnQgZHhpLCBpbnQgZHlpKSB7Ci0JaW50IHhpID0geCwgeWkgPSB5OwotCi0JaW50IER4LCBEeTsKLQotCWlmIChkeGkgPj0gMCkgewotCQlEeCA9IGR4aTsKLQkJRHkgPSBkeWk7Ci0JfSBlbHNlIGlmIChzY2FsaW5nKSB7Ci0JCUR4ID0gc2NhbGVkX3g7Ci0JCUR5ID0gc2NhbGVkX3k7Ci0JfSBlbHNlIHsKLQkJRHggPSBkcHlfeDsKLQkJRHkgPSBkcHlfeTsKLQl9Ci0JaWYgKCEgcm90YXRpbmdfc2FtZSkgewotCQlpbnQgdCA9IER4OwotCQlEeCA9IER5OwotCQlEeSA9IHQ7Ci0JfQotCi0JaWYgKHJvdGF0aW5nID09IFJPVEFURV9OT05FKSB7Ci0JCSp4byA9IHhpOwotCQkqeW8gPSB5aTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YKSB7Ci0JCSp4byA9IER4IC0geGkgLSAxOwotCQkqeW8gPSB5aTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9ZKSB7Ci0JCSp4byA9IHhpOwotCQkqeW8gPSBEeSAtIHlpIC0gMTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YWSkgewotCQkqeG8gPSBEeCAtIHhpIC0gMTsKLQkJKnlvID0gRHkgLSB5aSAtIDE7Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTApIHsKLQkJKnhvID0geWk7Ci0JCSp5byA9IER4IC0geGkgLSAxOwotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwWCkgewotCQkqeG8gPSB5aTsKLQkJKnlvID0geGk7Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTBZKSB7Ci0JCSp4byA9IER5IC0geWkgLSAxOwotCQkqeW8gPSBEeCAtIHhpIC0gMTsKLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV8yNzApIHsKLQkJKnhvID0gRHkgLSB5aSAtIDE7Ci0JCSp5byA9IHhpOwotCX0KLX0KLQotCS8qIHVucm9sbCB0aGUgQnBwIGxvb3AgdG8gYmUgdXNlZCBpbiBlYWNoIGNhc2U6ICovCi0jZGVmaW5lIFJPVF9DT1BZIFwKLQlzcmMgPSBzcmNfMCArIGZibCp5ICArIEJwcCp4OyAgXAotCWRzdCA9IGRzdF8wICsgcmJsKnluICsgQnBwKnhuOyBcCi0JaWYgKEJwcCA9PSAxKSB7IFwKLQkJKihkc3QpID0gKihzcmMpOwkgXAotCX0gZWxzZSBpZiAoQnBwID09IDIpIHsgXAotCQkqKGRzdCswKSA9ICooc3JjKzApOwkgXAotCQkqKGRzdCsxKSA9ICooc3JjKzEpOwkgXAotCX0gZWxzZSBpZiAoQnBwID09IDMpIHsgXAotCQkqKGRzdCswKSA9ICooc3JjKzApOwkgXAotCQkqKGRzdCsxKSA9ICooc3JjKzEpOwkgXAotCQkqKGRzdCsyKSA9ICooc3JjKzIpOwkgXAotCX0gZWxzZSBpZiAoQnBwID09IDQpIHsgXAotCQkqKGRzdCswKSA9ICooc3JjKzApOwkgXAotCQkqKGRzdCsxKSA9ICooc3JjKzEpOwkgXAotCQkqKGRzdCsyKSA9ICooc3JjKzIpOwkgXAotCQkqKGRzdCszKSA9ICooc3JjKzMpOwkgXAotCX0KLQotdm9pZCByb3RhdGVfZmIoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JaW50IHgsIHksIHhuLCB5biwgcl94MSwgcl95MSwgcl94Miwgcl95MiwgQnBwID0gYnBwLzg7Ci0JaW50IGZibCA9IHJmYl9ieXRlc19wZXJfbGluZTsKLQlpbnQgcmJsID0gcm90X2J5dGVzX3Blcl9saW5lOwotCWludCBEeCwgRHk7Ci0JY2hhciAqc3JjLCAqZHN0OwotCWNoYXIgKnNyY18wID0gcmZiX2ZiOwotCWNoYXIgKmRzdF8wID0gcm90X2ZiOwotCi0JaWYgKCEgcm90YXRpbmcgfHwgISByb3RfZmIpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChzY2FsaW5nKSB7Ci0JCUR4ID0gc2NhbGVkX3g7Ci0JCUR5ID0gc2NhbGVkX3k7Ci0JfSBlbHNlIHsKLQkJRHggPSBkcHlfeDsKLQkJRHkgPSBkcHlfeTsKLQl9Ci0Jcm90YXRlX2Nvb3Jkcyh4MSwgeTEsICZyX3gxLCAmcl95MSwgLTEsIC0xKTsKLQlyb3RhdGVfY29vcmRzKHgyLCB5MiwgJnJfeDIsICZyX3kyLCAtMSwgLTEpOwotCi0JZHN0ID0gcm90X2ZiOwotCi0JaWYgKHJvdGF0aW5nID09IFJPVEFURV9YKSB7Ci0JCWZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgIHsKLQkJCWZvciAoeCA9IHgxOyB4IDwgeDI7IHgrKykgIHsKLQkJCQl4biA9IER4IC0geCAtIDE7Ci0JCQkJeW4gPSB5OwotCQkJCVJPVF9DT1BZCi0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9ZKSB7Ci0JCWZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgIHsKLQkJCWZvciAoeCA9IHgxOyB4IDwgeDI7IHgrKykgIHsKLQkJCQl4biA9IHg7Ci0JCQkJeW4gPSBEeSAtIHkgLSAxOwotCQkJCVJPVF9DT1BZCi0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YWSkgewotCQlmb3IgKHkgPSB5MTsgeSA8IHkyOyB5KyspICB7Ci0JCQlmb3IgKHggPSB4MTsgeCA8IHgyOyB4KyspICB7Ci0JCQkJeG4gPSBEeCAtIHggLSAxOwotCQkJCXluID0gRHkgLSB5IC0gMTsKLQkJCQlST1RfQ09QWQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTApIHsKLQkJZm9yICh5ID0geTE7IHkgPCB5MjsgeSsrKSAgewotCQkJZm9yICh4ID0geDE7IHggPCB4MjsgeCsrKSAgewotCQkJCXhuID0gRHkgLSB5IC0gMTsKLQkJCQl5biA9IHg7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwWCkgewotCQlmb3IgKHkgPSB5MTsgeSA8IHkyOyB5KyspICB7Ci0JCQlmb3IgKHggPSB4MTsgeCA8IHgyOyB4KyspICB7Ci0JCQkJeG4gPSB5OwotCQkJCXluID0geDsKLQkJCQlST1RfQ09QWQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTBZKSB7Ci0JCWZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgIHsKLQkJCWZvciAoeCA9IHgxOyB4IDwgeDI7IHgrKykgIHsKLQkJCQl4biA9IER5IC0geSAtIDE7Ci0JCQkJeW4gPSBEeCAtIHggLSAxOwotCQkJCVJPVF9DT1BZCi0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV8yNzApIHsKLQkJZm9yICh5ID0geTE7IHkgPCB5MjsgeSsrKSAgewotCQkJZm9yICh4ID0geDE7IHggPCB4MjsgeCsrKSAgewotCQkJCXhuID0geTsKLQkJCQl5biA9IER4IC0geCAtIDE7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCByb3RhdGVfY3VycyhjaGFyICpkc3RfMCwgY2hhciAqc3JjXzAsIGludCBEeCwgaW50IER5LCBpbnQgQnBwKSB7Ci0JaW50IHgsIHksIHhuLCB5bjsKLQljaGFyICpzcmMsICpkc3Q7Ci0JaW50IGZibCwgcmJsOwotCi0JaWYgKCEgcm90YXRpbmcpIHsKLQkJcmV0dXJuOwotCX0KLQotCWZibCA9IER4ICogQnBwOwotCWlmIChyb3RhdGluZ19zYW1lKSB7Ci0JCXJibCA9IER4ICogQnBwOwotCX0gZWxzZSB7Ci0JCXJibCA9IER5ICogQnBwOwotCX0KLQotCWlmIChyb3RhdGluZyA9PSBST1RBVEVfWCkgewotCQlmb3IgKHkgPSAwOyB5IDwgRHk7IHkrKykgIHsKLQkJCWZvciAoeCA9IDA7IHggPCBEeDsgeCsrKSAgewotCQkJCXhuID0gRHggLSB4IC0gMTsKLQkJCQl5biA9IHk7Ci0JCQkJUk9UX0NPUFkKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgInJjdXJzOiAlZCAlZCAgJWQgJWRcbiIsIHgsIHksIHhuLCB5bik7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9ZKSB7Ci0JCWZvciAoeSA9IDA7IHkgPCBEeTsgeSsrKSAgewotCQkJZm9yICh4ID0gMDsgeCA8IER4OyB4KyspICB7Ci0JCQkJeG4gPSB4OwotCQkJCXluID0gRHkgLSB5IC0gMTsKLQkJCQlST1RfQ09QWQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfWFkpIHsKLQkJZm9yICh5ID0gMDsgeSA8IER5OyB5KyspICB7Ci0JCQlmb3IgKHggPSAwOyB4IDwgRHg7IHgrKykgIHsKLQkJCQl4biA9IER4IC0geCAtIDE7Ci0JCQkJeW4gPSBEeSAtIHkgLSAxOwotCQkJCVJPVF9DT1BZCi0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV85MCkgewotCQlmb3IgKHkgPSAwOyB5IDwgRHk7IHkrKykgIHsKLQkJCWZvciAoeCA9IDA7IHggPCBEeDsgeCsrKSAgewotCQkJCXhuID0gRHkgLSB5IC0gMTsKLQkJCQl5biA9IHg7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwWCkgewotCQlmb3IgKHkgPSAwOyB5IDwgRHk7IHkrKykgIHsKLQkJCWZvciAoeCA9IDA7IHggPCBEeDsgeCsrKSAgewotCQkJCXhuID0geTsKLQkJCQl5biA9IHg7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwWSkgewotCQlmb3IgKHkgPSAwOyB5IDwgRHk7IHkrKykgIHsKLQkJCWZvciAoeCA9IDA7IHggPCBEeDsgeCsrKSAgewotCQkJCXhuID0gRHkgLSB5IC0gMTsKLQkJCQl5biA9IER4IC0geCAtIDE7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzI3MCkgewotCQlmb3IgKHkgPSAwOyB5IDwgRHk7IHkrKykgIHsKLQkJCWZvciAoeCA9IDA7IHggPCBEeDsgeCsrKSAgewotCQkJCXhuID0geTsKLQkJCQl5biA9IER4IC0geCAtIDE7Ci0JCQkJUk9UX0NPUFkKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCBtYXJrX3dyYXBwZXIoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JaW50IHQsIHJfeDEgPSB4MSwgcl95MSA9IHkxLCByX3gyID0geDIsIHJfeTIgPSB5MjsKLQotCWlmIChyb3RhdGluZykgewotCQkvKiB3ZWxsIHdlIGhvcGUgcm90X2ZiIHdpbGwgYWx3YXlzIGJlIHRoZSBsYXN0IG9uZS4uLiAqLwotCQlyb3RhdGVfY29vcmRzKHgxLCB5MSwgJnJfeDEsICZyX3kxLCAtMSwgLTEpOwotCQlyb3RhdGVfY29vcmRzKHgyLCB5MiwgJnJfeDIsICZyX3kyLCAtMSwgLTEpOwotCQlyb3RhdGVfZmIoeDEsIHkxLCB4MiwgeTIpOwotCQlpZiAocl94MSA+IHJfeDIpIHsKLQkJCXQgPSByX3gxOwotCQkJcl94MSA9IHJfeDI7Ci0JCQlyX3gyID0gdDsKLQkJfQotCQlpZiAocl95MSA+IHJfeTIpIHsKLQkJCXQgPSByX3kxOwotCQkJcl95MSA9IHJfeTI7Ci0JCQlyX3kyID0gdDsKLQkJfQotCQkvKiBwYWludGluZyBlcnJvcnMgICovCi0JCXJfeDEtLTsKLQkJcl94MisrOwotCQlyX3kxLS07Ci0JCXJfeTIrKzsKLQl9Ci0JcmZiTWFya1JlY3RBc01vZGlmaWVkKHNjcmVlbiwgcl94MSwgcl95MSwgcl94Miwgcl95Mik7Ci19Ci0KLXZvaWQgbWFya19yZWN0X2FzX21vZGlmaWVkKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGZvcmNlKSB7Ci0KLQlpZiAoZGFtYWdlX3RpbWUgIT0gMCkgewotCQkvKgotCQkgKiBUaGlzIGlzIG5vdCBYREFNQUdFLCByYXRoZXIgYSBoYWNrIGZvciB0ZXN0aW5nCi0JCSAqIHdoZXJlIHdlIGFsbG93IHRoZSBmcmFtZWJ1ZmZlciB0byBiZSBjb3JydXB0ZWQgZm9yCi0JCSAqIGRhbWFnZV9kZWxheSBzZWNvbmRzLgotCQkgKi8KLQkJaW50IGRlYnVnID0gMDsKLQkJaWYgKHRpbWUoTlVMTCkgPiBkYW1hZ2VfdGltZSArIGRhbWFnZV9kZWxheSkgewotCQkJaWYgKCEgcXVpZXQpIHsKLQkJCQlyZmJMb2coImRhbWFnaW5nIHR1cm5lZCBvZmYuXG4iKTsKLQkJCX0KLQkJCWRhbWFnZV90aW1lID0gMDsKLQkJCWRhbWFnZV9kZWxheSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlyZmJMb2coImRhbWFnaW5nIHZpZXdlciBmYiBieSBub3QgbWFya2luZyAiCi0JCQkJICAgICJyZWN0OiAlZCwlZCwlZCwlZFxuIiwgeDEsIHkxLCB4MiwgeTIpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0KLQlpZiAocmZiX2ZiID09IG1haW5fZmIgfHwgZm9yY2UpIHsKLQkJbWFya193cmFwcGVyKHgxLCB5MSwgeDIsIHkyKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjbWFwOHRvMjQpIHsKLQkJYnBwOHRvMjQoeDEsIHkxLCB4MiwgeTIpOwotCX0KLQotCWlmIChzY2FsaW5nKSB7Ci0JCXNjYWxlX2FuZF9tYXJrX3JlY3QoeDEsIHkxLCB4MiwgeTIsIDEpOwotCX0gZWxzZSB7Ci0JCW1hcmtfd3JhcHBlcih4MSwgeTEsIHgyLCB5Mik7Ci0JfQotfQotCi0vKgotICogTm90aWZpZXMgbGlidm5jc2VydmVyIG9mIGEgY2hhbmdlZCBoaW50IHJlY3RhbmdsZS4KLSAqLwotc3RhdGljIHZvaWQgbWFya19oaW50KGhpbnRfdCBoaW50KSB7Ci0JaW50IHggPSBoaW50Lng7CQotCWludCB5ID0gaGludC55OwkKLQlpbnQgdyA9IGhpbnQudzsJCi0JaW50IGggPSBoaW50Lmg7CQotCi0JbWFya19yZWN0X2FzX21vZGlmaWVkKHgsIHksIHggKyB3LCB5ICsgaCwgMCk7Ci19Ci0KLS8qCi0gKiBjb3B5X3RpbGVzKCkgZ2l2ZXMgYSBzbGlnaHQgaW1wcm92ZW1lbnQgb3ZlciBjb3B5X3RpbGUoKSBzaW5jZQotICogYWRqYWNlbnQgcnVucyBvZiB0aWxlcyBhcmUgZG9uZSBhbGwgYXQgb25jZSB0aGVyZSBpcyBzb21lIHNhdmluZ3MKLSAqIGR1ZSB0byBjb250aWd1b3VzIG1lbW9yeSBhY2Nlc3MuICBOb3QgYSBncmVhdCBzcGVlZHVwLCBidXQgaW4gc29tZQotICogY2FzZXMgaXQgY2FuIGJlIHVwIHRvIDJYLiAgRXZlbiBtb3JlIG9uIGEgU3VuUmF5IG9yIFNoYWRvd0ZCIHdoZXJlCi0gKiBubyBncmFwaGljcyBoYXJkd2FyZSBpcyBpbnZvbHZlZCBpbiB0aGUgcmVhZC4gIEdlbmVyYWxseSwgZ3JhcGhpY3MKLSAqIGRldmljZXMgYXJlIG9wdGltaXplZCBmb3Igd3JpdGUsIG5vdCByZWFkLCBzbyB3ZSBhcmUgbGltaXRlZCBieSB0aGUKLSAqIHJlYWQgYmFuZHdpZHRoLCBzb21ldGltZXMgb25seSA1IE1CL3NlYyBvbiBvdGhlcndpc2UgZmFzdCBoYXJkd2FyZS4KLSAqLwotc3RhdGljIGludCAqZmlyc3RfbGluZSA9IE5VTEwsICpsYXN0X2xpbmUgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIHNob3J0ICpsZWZ0X2RpZmYgPSBOVUxMLCAqcmlnaHRfZGlmZiA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgY29weV90aWxlcyhpbnQgdHgsIGludCB0eSwgaW50IG50KSB7Ci0JaW50IHgsIHksIGxpbmU7Ci0JaW50IHNpemVfeCwgc2l6ZV95LCB3aWR0aDEsIHdpZHRoMjsKLQlpbnQgb2ZmLCBsZW4sIG4sIGR3LCBkeCwgdDsKLQlpbnQgdzEsIHcyLCBkeDEsIGR4MjsJLyogdG1wcyBmb3Igbm9ybWFsIGFuZCBzaG9ydCB0aWxlcyAqLwotCWludCBwaXhlbHNpemUgPSBicHAvODsKLQlpbnQgZmlyc3RfbWluLCBsYXN0X21heDsKLQlpbnQgZmlyc3RfeCA9IC0xLCBsYXN0X3ggPSAtMTsKLQlzdGF0aWMgaW50IHByZXZfbnRpbGVzX3ggPSAtMTsKLQotCWNoYXIgKnNyYywgKmRzdCwgKnNfc3JjLCAqc19kc3QsICptX3NyYywgKm1fZHN0OwotCWNoYXIgKmhfc3JjLCAqaF9kc3Q7Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuIDA7Ci0KLQlpZiAobnRpbGVzX3ggIT0gcHJldl9udGlsZXNfeCAmJiBmaXJzdF9saW5lICE9IE5VTEwpIHsKLQkJZnJlZShmaXJzdF9saW5lKTsJZmlyc3RfbGluZSA9IE5VTEw7Ci0JCWZyZWUobGFzdF9saW5lKTsJbGFzdF9saW5lID0gTlVMTDsKLQkJZnJlZShsZWZ0X2RpZmYpOwlsZWZ0X2RpZmYgPSBOVUxMOwotCQlmcmVlKHJpZ2h0X2RpZmYpOwlyaWdodF9kaWZmID0gTlVMTDsKLQl9Ci0KLQlpZiAoZmlyc3RfbGluZSA9PSBOVUxMKSB7Ci0JCS8qIGFsbG9jYXRlIGFycmF5cyBmaXJzdCB0aW1lIGluLiAqLwotCQlpbnQgbiA9IG50aWxlc194ICsgMTsKLQkJcmZiTG9nKCJjb3B5X3RpbGVzOiBhbGxvY2F0aW5nIGZpcnN0X2xpbmUgYXQgc2l6ZSAlZFxuIiwgbik7Ci0JCWZpcnN0X2xpbmUgPSAoaW50ICopIG1hbGxvYygoc2l6ZV90KSAobiAqIHNpemVvZihpbnQpKSk7Ci0JCWxhc3RfbGluZSAgPSAoaW50ICopIG1hbGxvYygoc2l6ZV90KSAobiAqIHNpemVvZihpbnQpKSk7Ci0JCWxlZnRfZGlmZiAgPSAodW5zaWduZWQgc2hvcnQgKikKLQkJCW1hbGxvYygoc2l6ZV90KSAobiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsKLQkJcmlnaHRfZGlmZiA9ICh1bnNpZ25lZCBzaG9ydCAqKQotCQkJbWFsbG9jKChzaXplX3QpIChuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpOwotCX0KLQlwcmV2X250aWxlc194ID0gbnRpbGVzX3g7Ci0KLQl4ID0gdHggKiB0aWxlX3g7Ci0JeSA9IHR5ICogdGlsZV95OwotCi0Jc2l6ZV94ID0gZHB5X3ggLSB4OwotCWlmICggc2l6ZV94ID4gdGlsZV94ICogbnQgKSB7Ci0JCXNpemVfeCA9IHRpbGVfeCAqIG50OwotCQl3aWR0aDEgPSB0aWxlX3g7Ci0JCXdpZHRoMiA9IHRpbGVfeDsKLQl9IGVsc2UgewotCQkvKiBzaG9ydCB0aWxlICovCi0JCXdpZHRoMSA9IHRpbGVfeDsJLyogaW50ZXJuYWwgdGlsZSAqLwotCQl3aWR0aDIgPSBzaXplX3ggLSAobnQgLSAxKSAqIHRpbGVfeDsJLyogcmlnaHQgaGFuZCB0aWxlICovCi0JfQotCi0Jc2l6ZV95ID0gZHB5X3kgLSB5OwotCWlmICggc2l6ZV95ID4gdGlsZV95ICkgewotCQlzaXplX3kgPSB0aWxlX3k7Ci0JfQotCi0JbiA9IHR4ICsgdHkgKiBudGlsZXNfeDsJCS8qIG51bWJlciBvZiB0aGUgZmlyc3QgdGlsZSAqLwotCi0JaWYgKGJsYWNrb3V0cyAmJiB0aWxlX2JsYWNrb3V0W25dLmNvdmVyID09IDIpIHsKLQkJLyoKLQkJICogSWYgdGhlcmUgYXJlIGJsYWNrb3V0cyBhbmQgdGhpcyB0aWxlIGlzIGNvbXBsZXRlbHkgY292ZXJlZAotCQkgKiBubyBuZWVkIHRvIHBvbGwgc2NyZWVuIG9yIGRvIGFueXRoaW5nIGVsc2UuLgotCQkgKiBuLmIuIHdlIGFyZSBpbiBzaW5nbGUgY29weV90aWxlIG1vZGU6IG50PTEKLQkJICovCi0JCXRpbGVfaGFzX2RpZmZbbl0gPSAwOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JWF9MT0NLOwotCVhSQU5EUl9TRVRfVFJBUF9SRVQoLTEsICJjb3B5X3RpbGUtc2V0Iik7Ci0JLyogcmVhZCBpbiB0aGUgd2hvbGUgdGlsZSBydW4gYXQgb25jZTogKi8KLQljb3B5X2ltYWdlKHRpbGVfcm93W250XSwgeCwgeSwgc2l6ZV94LCBzaXplX3kpOwotCVhSQU5EUl9DSEtfVFJBUF9SRVQoLTEsICJjb3B5X3RpbGUtY2hrIik7Ci0KLQotCVhfVU5MT0NLOwotCi0JaWYgKGJsYWNrb3V0cyAmJiB0aWxlX2JsYWNrb3V0W25dLmNvdmVyID09IDEpIHsKLQkJLyoKLQkJICogSWYgdGhlcmUgYXJlIGJsYWNrb3V0cyBhbmQgdGhpcyB0aWxlIGlzIHBhcnRpYWxseSBjb3ZlcmVkCi0JCSAqIHdlIHNob3VsZCByZS1ibGFjay1vdXQgdGhlIHBvcnRpb24uCi0JCSAqIG4uYi4gd2UgYXJlIGluIHNpbmdsZSBjb3B5X3RpbGUgbW9kZTogbnQ9MQotCQkgKi8KLQkJaW50IHgxLCB4MiwgeTEsIHkyLCBiOwotCQlpbnQgdywgcywgZmlsbCA9IDA7Ci0KLQkJZm9yIChiPTA7IGIgPCB0aWxlX2JsYWNrb3V0W25dLmNvdW50OyBiKyspIHsKLQkJCWNoYXIgKmJfZHN0ID0gdGlsZV9yb3dbbnRdLT5kYXRhOwotCQkJCi0JCQl4MSA9IHRpbGVfYmxhY2tvdXRbbl0uYm9bYl0ueDEgLSB4OwotCQkJeTEgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLnkxIC0geTsKLQkJCXgyID0gdGlsZV9ibGFja291dFtuXS5ib1tiXS54MiAtIHg7Ci0JCQl5MiA9IHRpbGVfYmxhY2tvdXRbbl0uYm9bYl0ueTIgLSB5OwotCi0JCQl3ID0gKHgyIC0geDEpICogcGl4ZWxzaXplOwotCQkJcyA9IHgxICogcGl4ZWxzaXplOwotCi0JCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgc2l6ZV95OyBsaW5lKyspIHsKLQkJCQlpZiAoeTEgPD0gbGluZSAmJiBsaW5lIDwgeTIpIHsKLQkJCQkJbWVtc2V0KGJfZHN0ICsgcywgZmlsbCwgKHNpemVfdCkgdyk7Ci0JCQkJfQotCQkJCWJfZHN0ICs9IHRpbGVfcm93W250XS0+Ynl0ZXNfcGVyX2xpbmU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcmMgPSB0aWxlX3Jvd1tudF0tPmRhdGE7Ci0JZHN0ID0gbWFpbl9mYiArIHkgKiBtYWluX2J5dGVzX3Blcl9saW5lICsgeCAqIHBpeGVsc2l6ZTsKLQotCXNfc3JjID0gc3JjOwotCXNfZHN0ID0gZHN0OwotCi0JZm9yICh0PTE7IHQgPD0gbnQ7IHQrKykgewotCQlmaXJzdF9saW5lW3RdID0gLTE7Ci0JfQotCi0JLyogZmluZCB0aGUgZmlyc3QgbGluZSB3aXRoIGRpZmZlcmVuY2U6ICovCi0JdzEgPSB3aWR0aDEgKiBwaXhlbHNpemU7Ci0JdzIgPSB3aWR0aDIgKiBwaXhlbHNpemU7Ci0KLQkvKiBmb3JlYWNoIGxpbmU6ICovCi0JZm9yIChsaW5lID0gMDsgbGluZSA8IHNpemVfeTsgbGluZSsrKSB7Ci0JCS8qIGZvcmVhY2ggaG9yaXpvbnRhbCB0aWxlOiAqLwotCQlmb3IgKHQ9MTsgdCA8PSBudDsgdCsrKSB7Ci0JCQlpZiAoZmlyc3RfbGluZVt0XSAhPSAtMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlvZmYgPSAodC0xKSAqIHcxOwotCQkJaWYgKHQgPT0gbnQpIHsKLQkJCQlsZW4gPSB3MjsJLyogcG9zc2libGUgc2hvcnQgdGlsZSAqLwotCQkJfSBlbHNlIHsKLQkJCQlsZW4gPSB3MTsKLQkJCX0KLQkJCQotCQkJaWYgKG1lbWNtcChzX2RzdCArIG9mZiwgc19zcmMgKyBvZmYsIGxlbikpIHsKLQkJCQlmaXJzdF9saW5lW3RdID0gbGluZTsKLQkJCX0KLQkJfQotCQlzX3NyYyArPSB0aWxlX3Jvd1tudF0tPmJ5dGVzX3Blcl9saW5lOwotCQlzX2RzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lOwotCX0KLQotCS8qIHNlZSBpZiB0aGVyZSB3ZXJlIGFueSBkaWZmZXJlbmNlcyBmb3IgYW55IHRpbGU6ICovCi0JZmlyc3RfbWluID0gLTE7Ci0JZm9yICh0PTE7IHQgPD0gbnQ7IHQrKykgewotCQl0aWxlX3RyaWVkW24rKHQtMSldID0gMTsKLQkJaWYgKGZpcnN0X2xpbmVbdF0gIT0gLTEpIHsKLQkJCWlmIChmaXJzdF9taW4gPT0gLTEgfHwgZmlyc3RfbGluZVt0XSA8IGZpcnN0X21pbikgewotCQkJCWZpcnN0X21pbiA9IGZpcnN0X2xpbmVbdF07Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGZpcnN0X21pbiA9PSAtMSkgewotCQkvKiBubyB0aWxlIGhhcyBhIGRpZmZlcmVuY2UsIG5vdGUgdGhpcyBhbmQgZ2V0IG91dDogKi8KLQkJZm9yICh0PTE7IHQgPD0gbnQ7IHQrKykgewotCQkJdGlsZV9oYXNfZGlmZltuKyh0LTEpXSA9IDA7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIGF0IGxlYXN0IG9uZSB0aWxlIGhhcyBhIGRpZmZlcmVuY2UuICBtYWtlIHN1cmUgaW5mbwotCQkgKiBpcyByZWNvcmRlZCAoZS5nLiBzb21ldGltZXMgd2UgZ3Vlc3MgdGlsZXMgYW5kIHRoZXkKLQkJICogY2FtZSBpbiB3aXRoIHRpbGVfaGFzX2RpZmYgMCkKLQkJICovCi0JCWZvciAodD0xOyB0IDw9IG50OyB0KyspIHsKLQkJCWlmIChmaXJzdF9saW5lW3RdID09IC0xKSB7Ci0JCQkJdGlsZV9oYXNfZGlmZltuKyh0LTEpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXRpbGVfaGFzX2RpZmZbbisodC0xKV0gPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JbV9zcmMgPSBzcmMgKyAodGlsZV9yb3dbbnRdLT5ieXRlc19wZXJfbGluZSAqIHNpemVfeSk7Ci0JbV9kc3QgPSBkc3QgKyAobWFpbl9ieXRlc19wZXJfbGluZSAqIHNpemVfeSk7Ci0KLQlmb3IgKHQ9MTsgdCA8PSBudDsgdCsrKSB7Ci0JCWxhc3RfbGluZVt0XSA9IGZpcnN0X2xpbmVbdF07Ci0JfQotCi0JLyogZmluZCB0aGUgbGFzdCBsaW5lIHdpdGggZGlmZmVyZW5jZTogKi8KLQl3MSA9IHdpZHRoMSAqIHBpeGVsc2l6ZTsKLQl3MiA9IHdpZHRoMiAqIHBpeGVsc2l6ZTsKLQotCS8qIGZvcmVhY2ggbGluZTogKi8KLQlmb3IgKGxpbmUgPSBzaXplX3kgLSAxOyBsaW5lID4gZmlyc3RfbWluOyBsaW5lLS0pIHsKLQotCQltX3NyYyAtPSB0aWxlX3Jvd1tudF0tPmJ5dGVzX3Blcl9saW5lOwotCQltX2RzdCAtPSBtYWluX2J5dGVzX3Blcl9saW5lOwotCi0JCS8qIGZvcmVhY2ggdGlsZTogKi8KLQkJZm9yICh0PTE7IHQgPD0gbnQ7IHQrKykgewotCQkJaWYgKGZpcnN0X2xpbmVbdF0gPT0gLTEKLQkJCSAgICB8fCBsYXN0X2xpbmVbdF0gIT0gZmlyc3RfbGluZVt0XSkgewotCQkJCS8qIHRpbGUgaGFzIG5vIGNoYW5nZXMgb3IgYWxyZWFkeSBkb25lICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCW9mZiA9ICh0LTEpICogdzE7Ci0JCQlpZiAodCA9PSBudCkgewotCQkJCWxlbiA9IHcyOwkvKiBwb3NzaWJsZSBzaG9ydCB0aWxlICovCi0JCQl9IGVsc2UgewotCQkJCWxlbiA9IHcxOwotCQkJfQotCQkJaWYgKG1lbWNtcChtX2RzdCArIG9mZiwgbV9zcmMgKyBvZmYsIGxlbikpIHsKLQkJCQlsYXN0X2xpbmVbdF0gPSBsaW5lOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogZGV0ZXJtaW5lIHRoZSBmYXJ0aGVzdCBkb3duIGxhc3QgY2hhbmdlZCBsaW5lCi0JICogd2lsbCBiZSB1c2VkIGJlbG93IHRvIGxpbWl0IG91ciBtZW1jcHkoKSB0byB0aGUgZnJhbWVidWZmZXIuCi0JICovCi0JbGFzdF9tYXggPSAtMTsKLQlmb3IgKHQ9MTsgdCA8PSBudDsgdCsrKSB7Ci0JCWlmIChmaXJzdF9saW5lW3RdID09IC0xKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAobGFzdF9tYXggPT0gLTEgfHwgbGFzdF9saW5lW3RdID4gbGFzdF9tYXgpIHsKLQkJCWxhc3RfbWF4ID0gbGFzdF9saW5lW3RdOwotCQl9Ci0JfQotCi0JLyogbG9vayBmb3IgZGlmZmVyZW5jZXMgb24gbGVmdCBhbmQgcmlnaHQgaGFuZCBlZGdlczogKi8KLQlmb3IgKHQ9MTsgdCA8PSBudDsgdCsrKSB7Ci0JCWxlZnRfZGlmZlt0XSA9IDA7Ci0JCXJpZ2h0X2RpZmZbdF0gPSAwOwotCX0KLQotCWhfc3JjID0gc3JjOwotCWhfZHN0ID0gZHN0OwotCi0JdzEgPSB3aWR0aDEgKiBwaXhlbHNpemU7Ci0JdzIgPSB3aWR0aDIgKiBwaXhlbHNpemU7Ci0KLQlkeDEgPSAod2lkdGgxIC0gdGlsZV9mdXp6KSAqIHBpeGVsc2l6ZTsKLQlkeDIgPSAod2lkdGgyIC0gdGlsZV9mdXp6KSAqIHBpeGVsc2l6ZTsKLQlkdyA9IHRpbGVfZnV6eiAqIHBpeGVsc2l6ZTsgCi0KLQkvKiBmb3JlYWNoIGxpbmU6ICovCi0JZm9yIChsaW5lID0gMDsgbGluZSA8IHNpemVfeTsgbGluZSsrKSB7Ci0JCS8qIGZvcmVhY2ggdGlsZTogKi8KLQkJZm9yICh0PTE7IHQgPD0gbnQ7IHQrKykgewotCQkJaWYgKGZpcnN0X2xpbmVbdF0gPT0gLTEpIHsKLQkJCQkvKiB0aWxlIGhhcyBubyBjaGFuZ2VzIGF0IGFsbCAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlvZmYgPSAodC0xKSAqIHcxOwotCQkJaWYgKHQgPT0gbnQpIHsKLQkJCQlkeCA9IGR4MjsJLyogcG9zc2libGUgc2hvcnQgdGlsZSAqLwotCQkJCWlmIChkeCA8PSAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZHggPSBkeDE7Ci0JCQl9Ci0KLQkJCWlmICghIGxlZnRfZGlmZlt0XSAmJiBtZW1jbXAoaF9kc3QgKyBvZmYsCi0JCQkgICAgaF9zcmMgKyBvZmYsIGR3KSkgewotCQkJCWxlZnRfZGlmZlt0XSA9IDE7Ci0JCQl9Ci0JCQlpZiAoISByaWdodF9kaWZmW3RdICYmIG1lbWNtcChoX2RzdCArIG9mZiArIGR4LAotCQkJICAgIGhfc3JjICsgb2ZmICsgZHgsIGR3KSApIHsKLQkJCQlyaWdodF9kaWZmW3RdID0gMTsKLQkJCX0KLQkJfQotCQloX3NyYyArPSB0aWxlX3Jvd1tudF0tPmJ5dGVzX3Blcl9saW5lOwotCQloX2RzdCArPSBtYWluX2J5dGVzX3Blcl9saW5lOwotCX0KLQotCS8qIG5vdyBmaW5hbGx5IGNvcHkgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHJmYiBmcmFtZWJ1ZmZlcjogKi8KLQlzX3NyYyA9IHNyYyArIHRpbGVfcm93W250XS0+Ynl0ZXNfcGVyX2xpbmUgKiBmaXJzdF9taW47Ci0Jc19kc3QgPSBkc3QgKyBtYWluX2J5dGVzX3Blcl9saW5lICogZmlyc3RfbWluOwotCi0JZm9yIChsaW5lID0gZmlyc3RfbWluOyBsaW5lIDw9IGxhc3RfbWF4OyBsaW5lKyspIHsKLQkJLyogZm9yIEkvTyBzcGVlZCB3ZSBkbyBub3QgZG8gdGhpcyB0aWxlIGJ5IHRpbGUgKi8KLQkJbWVtY3B5KHNfZHN0LCBzX3NyYywgc2l6ZV94ICogcGl4ZWxzaXplKTsKLQkJaWYgKG50ID09IDEpIHsKLQkJCS8qCi0JCQkgKiBvcHRpbWl6YXRpb24gZm9yIHRhbGwgc2tpbm55IGxpbmVzLCBlLmcuIHdtCi0JCQkgKiBmcmFtZS4gdHJ5IHRvIGZpbmQgZmlyc3RfeCBhbmQgbGFzdF94IHRvIGxpbWl0Ci0JCQkgKiB0aGUgc2l6ZSBvZiB0aGUgaGludC4gIGNvdWxkIGhlbHAgZm9yIGEgc2xvdwotCQkJICogbGluay4gIFVuZm9ydHVuYXRlbHkgd2Ugc3BlbnQgYSBsb3Qgb2YgdGltZQotCQkJICogcmVhZGluZyBpbiB0aGUgbWFueSB0aWxlcy4KLQkJCSAqCi0JCQkgKiBCVFcsIHdlIGxpa2UgdG8gdGhpbmsgdGhlIGFib3ZlIG1lbWNweSBsZWF2ZXMKLQkJCSAqIHRoZSBkYXRhIHdlIHVzZSBiZWxvdyBpbiB0aGUgY2FjaGUuLi4gKGJ1dAotCQkJICogaXQgY291bGQgYmUgdHdvIDEyOCBieXRlIHNlZ21lbnRzIGF0IDMyYnBwKQotCQkJICogc28gdGhpcyBpbm5lciBsb29wIGlzIG5vdCBhcyBiYWQgYXMgaXQgc2VlbXMuCi0JCQkgKi8KLQkJCWludCBrLCBreDsKLQkJCWt4ID0gcGl4ZWxzaXplOwotCQkJZm9yIChrPTA7IGs8c2l6ZV94OyBrKyspIHsKLQkJCQlpZiAobWVtY21wKHNfZHN0ICsgaypreCwgc19zcmMgKyBrKmt4LCBreCkpICB7Ci0JCQkJCWlmIChmaXJzdF94ID09IC0xIHx8IGsgPCBmaXJzdF94KSB7Ci0JCQkJCQlmaXJzdF94ID0gazsKLQkJCQkJfQotCQkJCQlpZiAobGFzdF94ID09IC0xIHx8IGsgPiBsYXN0X3gpIHsKLQkJCQkJCWxhc3RfeCA9IGs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc19zcmMgKz0gdGlsZV9yb3dbbnRdLT5ieXRlc19wZXJfbGluZTsKLQkJc19kc3QgKz0gbWFpbl9ieXRlc19wZXJfbGluZTsKLQl9Ci0KLQkvKiByZWNvcmQgYWxsIHRoZSBpbmZvIGluIHRoZSByZWdpb24gYXJyYXkgZm9yIHRoaXMgdGlsZTogKi8KLQlmb3IgKHQ9MTsgdCA8PSBudDsgdCsrKSB7Ci0JCWludCBzID0gdCAtIDE7Ci0KLQkJaWYgKGZpcnN0X2xpbmVbdF0gPT0gLTEpIHsKLQkJCS8qIHRpbGUgdW5jaGFuZ2VkICovCi0JCQljb250aW51ZTsKLQkJfQotCQl0aWxlX3JlZ2lvbltuK3NdLmZpcnN0X2xpbmUgPSBmaXJzdF9saW5lW3RdOwotCQl0aWxlX3JlZ2lvbltuK3NdLmxhc3RfbGluZSAgPSBsYXN0X2xpbmVbdF07Ci0KLQkJdGlsZV9yZWdpb25bbitzXS5maXJzdF94ID0gZmlyc3RfeDsKLQkJdGlsZV9yZWdpb25bbitzXS5sYXN0X3ggID0gbGFzdF94OwotCi0JCXRpbGVfcmVnaW9uW24rc10udG9wX2RpZmYgPSAwOwotCQl0aWxlX3JlZ2lvbltuK3NdLmJvdF9kaWZmID0gMDsKLQkJaWYgKCBmaXJzdF9saW5lW3RdIDwgdGlsZV9mdXp6ICkgewotCQkJdGlsZV9yZWdpb25bbitzXS50b3BfZGlmZiA9IDE7Ci0JCX0KLQkJaWYgKCBsYXN0X2xpbmVbdF0gPiAoc2l6ZV95IC0gMSkgLSB0aWxlX2Z1enogKSB7Ci0JCQl0aWxlX3JlZ2lvbltuK3NdLmJvdF9kaWZmID0gMTsKLQkJfQotCi0JCXRpbGVfcmVnaW9uW24rc10ubGVmdF9kaWZmICA9IGxlZnRfZGlmZlt0XTsKLQkJdGlsZV9yZWdpb25bbitzXS5yaWdodF9kaWZmID0gcmlnaHRfZGlmZlt0XTsKLQotCQl0aWxlX2NvcGllZFtuK3NdID0gMTsKLQl9Ci0KLQlyZXR1cm4oMSk7Ci19Ci0KLS8qCi0gKiBUaGUgY29weV90aWxlKCkgY2FsbCBpbiB0aGUgbG9vcCBiZWxvdyBjb3BpZXMgdGhlIGNoYW5nZWQgdGlsZSBpbnRvCi0gKiB0aGUgcmZiIGZyYW1lYnVmZmVyLiAgTm90ZSB0aGF0IGNvcHlfdGlsZSgpIHNldHMgdGhlIHRpbGVfcmVnaW9uCi0gKiBzdHJ1Y3QgdG8gaGF2ZSBpbmZvIGFib3V0IHRoZSB5LXJhbmdlIG9mIHRoZSBjaGFuZ2VkIHJlZ2lvbiBhbmQgYWxzbwotICogd2hldGhlciB0aGUgdGlsZSBlZGdlcyBjb250YWluIGRpZmZzICh3aXRoaW4gZGlzdGFuY2UgdGlsZV9mdXp6KS4KLSAqCi0gKiBXZSB1c2UgdGhpcyB0aWxlX3JlZ2lvbiBpbmZvIHRvIHRyeSB0byBndWVzcyBpZiB0aGUgZG93bndhcmQgYW5kIHJpZ2h0Ci0gKiB0aWxlcyB3aWxsIGhhdmUgZGlmZnMuICBUaGVzZSB0aWxlcyB3aWxsIGJlIGNoZWNrZWQgbGF0ZXIgaW4gdGhlIGxvb3AKLSAqIChzaW5jZSB5KzEgPiB5IGFuZCB4KzEgPiB4KS4KLSAqCi0gKiBTZWUgY29weV90aWxlc19iYWNrd2FyZF9wYXNzKCkgZm9yIGFuYWxvZ291cyBjaGVja2luZyB1cHdhcmQgYW5kCi0gKiBsZWZ0IHRpbGVzLgotICovCi1zdGF0aWMgaW50IGNvcHlfYWxsX3RpbGVzKHZvaWQpIHsKLQlpbnQgeCwgeSwgbiwgbTsKLQlpbnQgZGlmZnMgPSAwLCBjdDsKLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAwOwotCi0JZm9yICh5PTA7IHkgPCBudGlsZXNfeTsgeSsrKSB7Ci0JCWZvciAoeD0wOyB4IDwgbnRpbGVzX3g7IHgrKykgewotCQkJbiA9IHggKyB5ICogbnRpbGVzX3g7Ci0KLQkJCWlmICh0aWxlX2hhc19kaWZmW25dKSB7Ci0JCQkJY3QgPSBjb3B5X3RpbGVzKHgsIHksIDEpOwotCQkJCWlmIChjdCA8IDApIHJldHVybiBjdDsJLyogZmF0YWwgKi8KLQkJCX0KLQkJCWlmICghIHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCQkvKgotCQkJCSAqIG4uYi4gY29weV90aWxlcygpIG1heSBoYXZlIGRldGVjdGVkCi0JCQkJICogbm8gY2hhbmdlIGFuZCByZXNldCB0aWxlX2hhc19kaWZmIHRvIDAuCi0JCQkJICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlkaWZmcysrOwotCi0JCQkvKiBuZWlnaGJvcmluZyB0aWxlIGRvd253YXJkOiAqLwotCQkJaWYgKCAoeSsxKSA8IG50aWxlc195ICYmIHRpbGVfcmVnaW9uW25dLmJvdF9kaWZmKSB7Ci0JCQkJbSA9IHggKyAoeSsxKSAqIG50aWxlc194OwotCQkJCWlmICghIHRpbGVfaGFzX2RpZmZbbV0pIHsKLQkJCQkJdGlsZV9oYXNfZGlmZlttXSA9IDI7Ci0JCQkJfQotCQkJfQotCQkJLyogbmVpZ2hib3JpbmcgdGlsZSB0byByaWdodDogKi8KLQkJCWlmICggKHgrMSkgPCBudGlsZXNfeCAmJiB0aWxlX3JlZ2lvbltuXS5yaWdodF9kaWZmKSB7Ci0JCQkJbSA9ICh4KzEpICsgeSAqIG50aWxlc194OwotCQkJCWlmICghIHRpbGVfaGFzX2RpZmZbbV0pIHsKLQkJCQkJdGlsZV9oYXNfZGlmZlttXSA9IDI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBkaWZmczsKLX0KLQotLyoKLSAqIFJvdXRpbmUgYW5hbG9nb3VzIHRvIGNvcHlfYWxsX3RpbGVzKCkgYWJvdmUsIGJ1dCBmb3IgaG9yaXpvbnRhbCBydW5zCi0gKiBvZiBhZGphY2VudCBjaGFuZ2VkIHRpbGVzLgotICovCi1zdGF0aWMgaW50IGNvcHlfYWxsX3RpbGVfcnVucyh2b2lkKSB7Ci0JaW50IHgsIHksIG4sIG0sIGk7Ci0JaW50IGRpZmZzID0gMCwgY3Q7Ci0JaW50IGluX3J1biA9IDAsIHJ1biA9IDA7Ci0JaW50IG50YXZlID0gMCwgbnRjbnQgPSAwOwotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuIDA7Ci0KLQlmb3IgKHk9MDsgeSA8IG50aWxlc195OyB5KyspIHsKLQkJZm9yICh4PTA7IHggPCBudGlsZXNfeCArIDE7IHgrKykgewotCQkJbiA9IHggKyB5ICogbnRpbGVzX3g7Ci0KLQkJCWlmICh4ICE9IG50aWxlc194ICYmIHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCQlpbl9ydW4gPSAxOwotCQkJCXJ1bisrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoISBpbl9ydW4pIHsKLQkJCQkJaW5fcnVuID0gMDsKLQkJCQkJcnVuID0gMDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWN0ID0gY29weV90aWxlcyh4IC0gcnVuLCB5LCBydW4pOwotCQkJCWlmIChjdCA8IDApIHJldHVybiBjdDsJLyogZmF0YWwgKi8KLQotCQkJCW50Y250Kys7Ci0JCQkJbnRhdmUgKz0gcnVuOwotCQkJCWRpZmZzICs9IHJ1bjsKLQotCQkJCS8qIG5laWdoYm9yaW5nIHRpbGUgZG93bndhcmQ6ICovCi0JCQkJZm9yIChpPTE7IGkgPD0gcnVuOyBpKyspIHsKLQkJCQkJaWYgKCh5KzEpIDwgbnRpbGVzX3kKLQkJCQkJICAgICYmIHRpbGVfcmVnaW9uW24taV0uYm90X2RpZmYpIHsKLQkJCQkJCW0gPSAoeC1pKSArICh5KzEpICogbnRpbGVzX3g7Ci0JCQkJCQlpZiAoISB0aWxlX2hhc19kaWZmW21dKSB7Ci0JCQkJCQkJdGlsZV9oYXNfZGlmZlttXSA9IDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKiBuZWlnaGJvcmluZyB0aWxlIHRvIHJpZ2h0OiAqLwotCQkJCWlmICgoKHgtMSkrMSkgPCBudGlsZXNfeAotCQkJCSAgICAmJiB0aWxlX3JlZ2lvbltuLTFdLnJpZ2h0X2RpZmYpIHsKLQkJCQkJbSA9ICgoeC0xKSsxKSArIHkgKiBudGlsZXNfeDsKLQkJCQkJaWYgKCEgdGlsZV9oYXNfZGlmZlttXSkgewotCQkJCQkJdGlsZV9oYXNfZGlmZlttXSA9IDI7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8qIG5vdGUgdGhhdCB0aGlzIHN0YXJ0cyBhIG5ldyBydW4gKi8KLQkJCQkJaW5fcnVuID0gMTsKLQkJCQkJcnVuID0gMTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbl9ydW4gPSAwOwotCQkJCQlydW4gPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKgotCQkgKiBDb3VsZCBzb21lIGFjdGl2aXR5IGdvIGhlcmUsIHRvIGVtdWxhdGUgdGhyZWFkZWQKLQkJICogYmVoYXZpb3IgYnkgc2VydmljaW5nIHNvbWUgbGlidm5jc2VydmVyIHRhc2tzPwotCQkgKi8KLQl9Ci0JcmV0dXJuIGRpZmZzOwotfQotCi0vKgotICogSGVyZSBzdGFydHMgYSBidW5jaCBvZiBoZXVyaXN0aWNzIHRvIGd1ZXNzL2RldGVjdCBjaGFuZ2VkIHRpbGVzLgotICogVGhleSBhcmU6Ci0gKiAgIGNvcHlfdGlsZXNfYmFja3dhcmRfcGFzcywgZmlsbF90aWxlX2dhcHMvZ2FwX3RyeSwgZ3Jvd19pc2xhbmRzL2lzbGFuZF90cnkKLSAqLwotCi0vKgotICogVHJ5IHRvIHByZWRpY3Qgd2hldGhlciB0aGUgdXB3YXJkIGFuZC9vciBsZWZ0d2FyZCB0aWxlIGhhcyBiZWVuIG1vZGlmaWVkLgotICogY29weV9hbGxfdGlsZXMoKSBoYXMgYWxyZWFkeSBkb25lIGRvd253YXJkIGFuZCByaWdodHdhcmQgdGlsZXMuCi0gKi8KLXN0YXRpYyBpbnQgY29weV90aWxlc19iYWNrd2FyZF9wYXNzKHZvaWQpIHsKLQlpbnQgeCwgeSwgbiwgbTsKLQlpbnQgZGlmZnMgPSAwLCBjdDsKLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAwOwotCi0JZm9yICh5ID0gbnRpbGVzX3kgLSAxOyB5ID49IDA7IHktLSkgewotCSAgICBmb3IgKHggPSBudGlsZXNfeCAtIDE7IHggPj0gMDsgeC0tKSB7Ci0JCW4gPSB4ICsgeSAqIG50aWxlc194OwkJLyogbnVtYmVyIG9mIHRoaXMgdGlsZSAqLwotCi0JCWlmICghIHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbSA9IHggKyAoeS0xKSAqIG50aWxlc194OwkvKiBuZWlnaGJvcmluZyB0aWxlIHVwd2FyZCAqLwotCi0JCWlmICh5ID49IDEgJiYgISB0aWxlX2hhc19kaWZmW21dICYmIHRpbGVfcmVnaW9uW25dLnRvcF9kaWZmKSB7Ci0JCQlpZiAoISB0aWxlX3RyaWVkW21dKSB7Ci0JCQkJdGlsZV9oYXNfZGlmZlttXSA9IDI7Ci0JCQkJY3QgPSBjb3B5X3RpbGVzKHgsIHktMSwgMSk7Ci0JCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQkJfQotCQl9Ci0KLQkJbSA9ICh4LTEpICsgeSAqIG50aWxlc194OwkvKiBuZWlnaGJvcmluZyB0aWxlIHRvIGxlZnQgKi8KLQotCQlpZiAoeCA+PSAxICYmICEgdGlsZV9oYXNfZGlmZlttXSAmJiB0aWxlX3JlZ2lvbltuXS5sZWZ0X2RpZmYpIHsKLQkJCWlmICghIHRpbGVfdHJpZWRbbV0pIHsKLQkJCQl0aWxlX2hhc19kaWZmW21dID0gMjsKLQkJCQljdCA9IGNvcHlfdGlsZXMoeC0xLCB5LCAxKTsKLQkJCQlpZiAoY3QgPCAwKSByZXR1cm4gY3Q7CS8qIGZhdGFsICovCi0JCQl9Ci0JCX0KLQkgICAgfQotCX0KLQlmb3IgKG49MDsgbiA8IG50aWxlczsgbisrKSB7Ci0JCWlmICh0aWxlX2hhc19kaWZmW25dKSB7Ci0JCQlkaWZmcysrOwotCQl9Ci0JfQotCXJldHVybiBkaWZmczsKLX0KLQotc3RhdGljIGludCBjb3B5X3RpbGVzX2FkZGl0aW9uYWxfcGFzcyh2b2lkKSB7Ci0JaW50IHgsIHksIG47Ci0JaW50IGRpZmZzID0gMCwgY3Q7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm4gMDsKLQotCWZvciAoeT0wOyB5IDwgbnRpbGVzX3k7IHkrKykgewotCQlmb3IgKHg9MDsgeCA8IG50aWxlc194OyB4KyspIHsKLQkJCW4gPSB4ICsgeSAqIG50aWxlc194OwkJLyogbnVtYmVyIG9mIHRoaXMgdGlsZSAqLwotCi0JCQlpZiAoISB0aWxlX2hhc19kaWZmW25dKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodGlsZV9jb3BpZWRbbl0pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJY3QgPSBjb3B5X3RpbGVzKHgsIHksIDEpOwotCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQl9Ci0JfQotCWZvciAobj0wOyBuIDwgbnRpbGVzOyBuKyspIHsKLQkJaWYgKHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCWRpZmZzKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGRpZmZzOwotfQotCi1zdGF0aWMgaW50IGdhcF90cnkoaW50IHgsIGludCB5LCBpbnQgKnJ1biwgaW50ICpzYXcsIGludCBhbG9uZ194KSB7Ci0JaW50IG4sIG0sIGksIHh0LCB5dCwgY3Q7Ci0KLQluID0geCArIHkgKiBudGlsZXNfeDsKLQotCWlmICghIHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJaWYgKCpzYXcpIHsKLQkJCSgqcnVuKSsrOwkvKiBleHRlbmQgdGhlIGdhcCBydW4uICovCi0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghICpzYXcgfHwgKnJ1biA9PSAwIHx8ICpydW4gPiBnYXBzX2ZpbGwpIHsKLQkJKnJ1biA9IDA7CQkvKiB1bmFjY2VwdGFibGUgcnVuLiAqLwotCQkqc2F3ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZm9yIChpPTE7IGkgPD0gKnJ1bjsgaSsrKSB7CS8qIGl0ZXJhdGUgdGhydSB0aGUgcnVuLiAqLwotCQlpZiAoYWxvbmdfeCkgewotCQkJeHQgPSB4IC0gaTsKLQkJCXl0ID0geTsKLQkJfSBlbHNlIHsKLQkJCXh0ID0geDsKLQkJCXl0ID0geSAtIGk7Ci0JCX0KLQotCQltID0geHQgKyB5dCAqIG50aWxlc194OwotCQlpZiAodGlsZV90cmllZFttXSkgewkvKiBkbyBub3QgcmVwZWF0IHRpbGVzICovCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWN0ID0gY29weV90aWxlcyh4dCwgeXQsIDEpOwotCQlpZiAoY3QgPCAwKSByZXR1cm4gY3Q7CS8qIGZhdGFsICovCi0JfQotCSpydW4gPSAwOwotCSpzYXcgPSAxOwotCXJldHVybiAxOwotfQotCi0vKgotICogTG9vayBmb3Igc21hbGwgZ2FwcyBvZiB1bmNoYW5nZWQgdGlsZXMgdGhhdCBtYXkgYWN0dWFsbHkgY29udGFpbiBjaGFuZ2VzLgotICogRS5nLiB3aGVuIHBhZ2luZyB1cCBhbmQgZG93biBpbiBhIHdlYiBicm9zd2VyIG9yIHRlcm1pbmFsIHRoZXJlIGNhbgotICogYmUgYSBkaXN0cmFjdGluZyBkZWxheWVkIGZpbGxpbmcgaW4gb2Ygc3VjaCBnYXBzLiAgZ2Fwc19maWxsIGlzIHRoZQotICogdHdlYWsgcGFyYW1ldGVyIHRoYXQgc2V0cyB0aGUgd2lkdGggb2YgdGhlIGdhcHMgdGhhdCBhcmUgY2hlY2tlZC4KLSAqCi0gKiBCVFcsIGdyb3dfaXNsYW5kcygpIGlzIGFjdHVhbGx5IHByZXR0eSBzdWNjZXNzZnVsIGF0IGRvaW5nIHRoaXMgdG9vLi4uCi0gKi8KLXN0YXRpYyBpbnQgZmlsbF90aWxlX2dhcHModm9pZCkgewotCWludCB4LCB5LCBydW4sIHNhdzsKLQlpbnQgbiwgZGlmZnMgPSAwLCBjdDsKLQotCS8qIGhvcml6b250YWw6ICovCi0JZm9yICh5PTA7IHkgPCBudGlsZXNfeTsgeSsrKSB7Ci0JCXJ1biA9IDA7Ci0JCXNhdyA9IDA7Ci0JCWZvciAoeD0wOyB4IDwgbnRpbGVzX3g7IHgrKykgewotCQkJY3QgPSBnYXBfdHJ5KHgsIHksICZydW4sICZzYXcsIDEpOwotCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQl9Ci0JfQotCi0JLyogdmVydGljYWw6ICovCi0JZm9yICh4PTA7IHggPCBudGlsZXNfeDsgeCsrKSB7Ci0JCXJ1biA9IDA7Ci0JCXNhdyA9IDA7Ci0JCWZvciAoeT0wOyB5IDwgbnRpbGVzX3k7IHkrKykgewotCQkJY3QgPSBnYXBfdHJ5KHgsIHksICZydW4sICZzYXcsIDApOwotCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQl9Ci0JfQotCi0JZm9yIChuPTA7IG4gPCBudGlsZXM7IG4rKykgewotCQlpZiAodGlsZV9oYXNfZGlmZltuXSkgewotCQkJZGlmZnMrKzsKLQkJfQotCX0KLQlyZXR1cm4gZGlmZnM7Ci19Ci0KLXN0YXRpYyBpbnQgaXNsYW5kX3RyeShpbnQgeCwgaW50IHksIGludCB1LCBpbnQgdiwgaW50ICpydW4pIHsKLQlpbnQgbiwgbSwgY3Q7Ci0KLQluID0geCArIHkgKiBudGlsZXNfeDsKLQltID0gdSArIHYgKiBudGlsZXNfeDsKLQotCWlmICh0aWxlX2hhc19kaWZmW25dKSB7Ci0JCSgqcnVuKSsrOwotCX0gZWxzZSB7Ci0JCSpydW4gPSAwOwotCX0KLQotCWlmICh0aWxlX2hhc19kaWZmW25dICYmICEgdGlsZV9oYXNfZGlmZlttXSkgewotCQkvKiBmb3VuZCBhIGRpc2NvbnRpbnVpdHkgKi8KLQotCQlpZiAodGlsZV90cmllZFttXSkgewotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoKnJ1biA8IGdyb3dfZmlsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQljdCA9IGNvcHlfdGlsZXModSwgdiwgMSk7Ci0JCWlmIChjdCA8IDApIHJldHVybiBjdDsJLyogZmF0YWwgKi8KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBTY2FuIGxvb2tpbmcgZm9yIGRpc2NvbnRpbnVpdGllcyBpbiB0aWxlX2hhc19kaWZmW10uICBUcnkgdG8gZXh0ZW5kCi0gKiB0aGUgYm91bmRhcnkgb2YgdGhlIGRpc2NvbnRpbnVpdHkgKGkuZS4gbWFrZSB0aGUgaXNsYW5kIGxhcmdlcikuCi0gKiBWZXJ0aWNhbCBzY2FucyBhcmUgc2tpcHBlZCBzaW5jZSB0aGV5IGRvIG5vdCBzZWVtIHRvIHlpZWxkIG11Y2guLi4KLSAqLwotc3RhdGljIGludCBncm93X2lzbGFuZHModm9pZCkgewotCWludCB4LCB5LCBuLCBydW47Ci0JaW50IGRpZmZzID0gMCwgY3Q7Ci0KLQkvKgotCSAqIG4uYi4gdGhlIHdheSB3ZSBzY2FuIGhlcmUgc2hvdWxkIGtlZXAgYW4gZXh0ZW5zaW9uIGdvaW5nLAotCSAqIGFuZCBzbyBhbHNvIGZpbGwgaW4gZ2FwcyBlZmZlY3RpdmVseS4uLgotCSAqLwotCi0JLyogbGVmdCB0byByaWdodDogKi8KLQlmb3IgKHk9MDsgeSA8IG50aWxlc195OyB5KyspIHsKLQkJcnVuID0gMDsKLQkJZm9yICh4PTA7IHggPD0gbnRpbGVzX3ggLSAyOyB4KyspIHsKLQkJCWN0ID0gaXNsYW5kX3RyeSh4LCB5LCB4KzEsIHksICZydW4pOwotCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQl9Ci0JfQotCS8qIHJpZ2h0IHRvIGxlZnQ6ICovCi0JZm9yICh5PTA7IHkgPCBudGlsZXNfeTsgeSsrKSB7Ci0JCXJ1biA9IDA7Ci0JCWZvciAoeCA9IG50aWxlc194IC0gMTsgeCA+PSAxOyB4LS0pIHsKLQkJCWN0ID0gaXNsYW5kX3RyeSh4LCB5LCB4LTEsIHksICZydW4pOwotCQkJaWYgKGN0IDwgMCkgcmV0dXJuIGN0OwkvKiBmYXRhbCAqLwotCQl9Ci0JfQotCWZvciAobj0wOyBuIDwgbnRpbGVzOyBuKyspIHsKLQkJaWYgKHRpbGVfaGFzX2RpZmZbbl0pIHsKLQkJCWRpZmZzKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGRpZmZzOwotfQotCi0vKgotICogRmlsbCB0aGUgZnJhbWVidWZmZXIgd2l0aCB6ZXJvcyBmb3IgZWFjaCBibGFja291dCByZWdpb24KLSAqLwotc3RhdGljIHZvaWQgYmxhY2tvdXRfcmVnaW9ucyh2b2lkKSB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGkgPCBibGFja291dHM7IGkrKykgewotCQl6ZXJvX2ZiKGJsYWNrcltpXS54MSwgYmxhY2tyW2ldLnkxLCBibGFja3JbaV0ueDIsIGJsYWNrcltpXS55Mik7Ci0JfQotfQotCi0vKgotICogY29weSB0aGUgd2hvbGUgWCBzY3JlZW4gdG8gdGhlIHJmYiBmcmFtZWJ1ZmZlci4gIEZvciBhIGxhcmdlIGVub3VnaAotICogbnVtYmVyIG9mIGNoYW5nZWQgdGlsZXMsIHRoaXMgaXMgZmFzdGVyIHRoYW4gdGlsZXMgc2NoZW1lIGF0IHJldHJpZXZpbmcKLSAqIHRoZSBpbmZvIGZyb20gdGhlIFggc2VydmVyLiAgQmFuZHdpZHRoIHRvIGNsaWVudCBhbmQgY29tcHJlc3Npb24gdGltZQotICogYXJlIG90aGVyIGlzc3Vlcy4uLiAgdXNlIC1mcyAxLjAgdG8gZGlzYWJsZS4KLSAqLwotaW50IGNvcHlfc2NyZWVuKHZvaWQpIHsKLQljaGFyICpmYnA7Ci0JaW50IGksIHksIGJsb2NrX3NpemU7Ci0KLQlpZiAoISBmc19mYWN0b3IpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChkZWJ1Z190aWxlcykgZnByaW50ZihzdGRlcnIsICJjb3B5X3NjcmVlblxuIik7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm4gMDsKLQotCi0JaWYgKCEgbWFpbl9mYikgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlibG9ja19zaXplID0gKChkcHlfeS9mc19mYWN0b3IpICogbWFpbl9ieXRlc19wZXJfbGluZSk7Ci0KLQlmYnAgPSBtYWluX2ZiOwotCXkgPSAwOwotCi0JWF9MT0NLOwotCi0JLyogc2NyZWVuIG1heSBiZSB0b28gYmlnIGZvciAxIHNobSBhcmVhLCBzbyBicm9rZW4gaW50byBmc19mYWN0b3IgKi8KLQlmb3IgKGk9MDsgaSA8IGZzX2ZhY3RvcjsgaSsrKSB7Ci0JCVhSQU5EUl9TRVRfVFJBUF9SRVQoLTEsICJjb3B5X3NjcmVlbi1zZXQiKTsKLQkJY29weV9pbWFnZShmdWxsc2NyZWVuLCAwLCB5LCAwLCAwKTsKLQkJWFJBTkRSX0NIS19UUkFQX1JFVCgtMSwgImNvcHlfc2NyZWVuLWNoayIpOwotCi0JCW1lbWNweShmYnAsIGZ1bGxzY3JlZW4tPmRhdGEsIChzaXplX3QpIGJsb2NrX3NpemUpOwotCi0JCXkgKz0gZHB5X3kgLyBmc19mYWN0b3I7Ci0JCWZicCArPSBibG9ja19zaXplOwotCX0KLQotCVhfVU5MT0NLOwotCi0JaWYgKGJsYWNrb3V0cykgewotCQlibGFja291dF9yZWdpb25zKCk7Ci0JfQotCi0JbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIGRweV94LCBkcHlfeSwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpbmNsdWRlIDxyZmIvZGVmYXVsdDh4MTYuaD4KLQotLyoKLSAqIENvbG9yIHZhbHVlcyBmcm9tIHRoZSB2Y3NhZHVtcCBwcm9ncmFtLgotICogdm9pZCBkdW1wY3NzKEZJTEUgKmZwLCBjaGFyICphdHRyaWJzX3VzZWQpCi0gKiBjaGFyICpjb2xvcm1hcFtdID0gewotICogICAgIiMwMDAwMDAiLCAiIzAwMDBBQSIsICIjMDBBQTAwIiwgIiMwMEFBQUEiLCAiI0FBMDAwMCIsICIjQUEwMEFBIiwgIiNBQTU1MDAiLCAiI0FBQUFBQSIsCi0gKiAgICAiIzU1NTU1NSIsICIjNTU1NUFBIiwgIiM1NUZGNTUiLCAiIzU1RkZGRiIsICIjRkY1NTU1IiwgIiNGRjU1RkYiLCAiI0ZGRkYwMCIsICIjRkZGRkZGIiB9OwotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvbnNvbGVfY21hcFsxNiozXT17Ci0vKiAgMCAqLwkweDAwLCAweDAwLCAweDAwLAotLyogIDEgKi8JMHgwMCwgMHgwMCwgMHhBQSwKLS8qICAyICovCTB4MDAsIDB4QUEsIDB4MDAsCi0vKiAgMyAqLwkweDAwLCAweEFBLCAweEFBLAotLyogIDQgKi8JMHhBQSwgMHgwMCwgMHgwMCwKLS8qICA1ICovCTB4QUEsIDB4MDAsIDB4QUEsCi0vKiAgNiAqLwkweEFBLCAweDU1LCAweDAwLAotLyogIDcgKi8JMHhBQSwgMHhBQSwgMHhBQSwKLS8qICA4ICovCTB4NTUsIDB4NTUsIDB4NTUsCi0vKiAgOSAqLwkweDU1LCAweDU1LCAweEFBLAotLyogMTAgKi8JMHg1NSwgMHhGRiwgMHg1NSwKLS8qIDExICovCTB4NTUsIDB4RkYsIDB4RkYsCi0vKiAxMiAqLwkweEZGLCAweDU1LCAweDU1LAotLyogMTMgKi8JMHhGRiwgMHg1NSwgMHhGRiwKLS8qIDE0ICovCTB4RkYsIDB4RkYsIDB4MDAsCi0vKiAxNSAqLwkweEZGLCAweEZGLCAweEZGCi19OwotICAKLXN0YXRpYyB2b2lkIHNuYXBfdmNzYV9yYXdmYih2b2lkKSB7Ci0JaW50IG47Ci0JY2hhciAqZHN0OwotCWNoYXIgYnVmWzMyXTsKLQlpbnQgaSwgbGVuLCBkZWw7Ci0JdW5zaWduZWQgY2hhciByb3dzLCBjb2xzLCB4cG9zLCB5cG9zOwotCXN0YXRpYyBpbnQgcHJldl9yb3dzID0gLTEsIHByZXZfY29scyA9IC0xOwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHByZXZfeHBvcyA9IC0xLCBwcmV2X3lwb3MgPSAtMTsKLQlzdGF0aWMgY2hhciAqdmNzYWJ1ZiAgPSBOVUxMOwotCXN0YXRpYyBjaGFyICp2Y3NhYnVmMCA9IE5VTEw7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBjb2xvcl90YWJbMTZdOwotCXN0YXRpYyBpbnQgQ3cgPSA4LCBDaCA9IDE2OwotCXN0YXRpYyBpbnQgZGIgPSAtMSwgZmlyc3QgPSAxOwotCWludCBjcmVhdGVkID0gMDsKLQlyZmJTY3JlZW5JbmZvIHM7Ci0JcmZiU2NyZWVuSW5mb1B0ciBmYWtlX3NjcmVlbiA9ICZzOwotCWludCBCcHAgPSByYXdfZmJfbmF0aXZlX2JwcCAvIDg7Ci0KLQlpZiAoZGIgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19WQ1NBIikpIHsKLQkJCWRiID0gYXRvaShnZXRlbnYoIlgxMVZOQ19ERUJVR19WQ1NBIikpOwotCQl9IGVsc2UgewotCQkJZGIgPSAwOwotCQl9Ci0JfQotCi0JaWYgKGZpcnN0KSB7Ci0JCXVuc2lnbmVkIGludCBybSA9IHJhd19mYl9uYXRpdmVfcmVkX21hc2s7Ci0JCXVuc2lnbmVkIGludCBnbSA9IHJhd19mYl9uYXRpdmVfZ3JlZW5fbWFzazsKLQkJdW5zaWduZWQgaW50IGJtID0gcmF3X2ZiX25hdGl2ZV9ibHVlX21hc2s7Ci0JCXVuc2lnbmVkIGludCBycyA9IHJhd19mYl9uYXRpdmVfcmVkX3NoaWZ0OwotCQl1bnNpZ25lZCBpbnQgZ3MgPSByYXdfZmJfbmF0aXZlX2dyZWVuX3NoaWZ0OwotCQl1bnNpZ25lZCBpbnQgYnMgPSByYXdfZmJfbmF0aXZlX2JsdWVfc2hpZnQ7Ci0JCXVuc2lnbmVkIGludCByeCA9IHJhd19mYl9uYXRpdmVfcmVkX21heDsKLQkJdW5zaWduZWQgaW50IGd4ID0gcmF3X2ZiX25hdGl2ZV9ncmVlbl9tYXg7Ci0JCXVuc2lnbmVkIGludCBieCA9IHJhd19mYl9uYXRpdmVfYmx1ZV9tYXg7Ci0KLQkJZm9yIChpPTA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlpbnQgciA9IGNvbnNvbGVfY21hcFszKmkrMF07Ci0JCQlpbnQgZyA9IGNvbnNvbGVfY21hcFszKmkrMV07Ci0JCQlpbnQgYiA9IGNvbnNvbGVfY21hcFszKmkrMl07Ci0JCQlyID0gcnggKiByIC8gMjU1OwotCQkJZyA9IGd4ICogZyAvIDI1NTsKLQkJCWIgPSBieCAqIGIgLyAyNTU7Ci0JCQljb2xvcl90YWJbaV0gPSAociA8PCBycykgfCAoZyA8PCBncykgfCAoYiA8PCBicyk7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY21hcFslMDJkXSAweCUwOHggICUwNGQgJTA0ZCAlMDRkXG4iLCBpLCBjb2xvcl90YWJbaV0sIHIsIGcsIGIpOyAKLQkJCWlmIChpICE9IDAgJiYgZ2V0ZW52KCJSQVdGQl9WQ1NBX0JXIikpIHsKLQkJCQljb2xvcl90YWJbaV0gPSBybSB8IGdtIHwgYm07Ci0JCQl9Ci0JCX0KLQl9Ci0JZmlyc3QgPSAwOwotCi0JbHNlZWsocmF3X2ZiX2ZkLCAwLCBTRUVLX1NFVCk7Ci0JbGVuID0gNDsKLQlkZWwgPSAwOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQl3aGlsZSAobGVuID4gMCkgewotCQluID0gcmVhZChyYXdfZmJfZmQsIGJ1ZiArIGRlbCwgbGVuKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlkZWwgKz0gbjsKLQkJCWxlbiAtPSBuOwotCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJvd3MgPSAodW5zaWduZWQgY2hhcikgYnVmWzBdOwotCWNvbHMgPSAodW5zaWduZWQgY2hhcikgYnVmWzFdOwotCXhwb3MgPSAodW5zaWduZWQgY2hhcikgYnVmWzJdOwotCXlwb3MgPSAodW5zaWduZWQgY2hhcikgYnVmWzNdOwotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInJvd3M9JWQgY29scz0lZCB4cG9zPSVkIHlwb3M9JWQgQnBwPSVkXG4iLCByb3dzLCBjb2xzLCB4cG9zLCB5cG9zLCBCcHApOwotCWlmIChyb3dzID09IDAgfHwgY29scyA9PSAwKSB7Ci0JCXVzbGVlcCgxMDAgKiAxMDAwKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh2Y3NhYnVmID09IE5VTEwgfHwgcHJldl9yb3dzICE9IHJvd3MgfHwgcHJldl9jb2xzICE9IGNvbHMpIHsKLQkJaWYgKHZjc2FidWYpIHsKLQkJCWZyZWUodmNzYWJ1Zik7Ci0JCQlmcmVlKHZjc2FidWYwKTsKLQkJfQotCQl2Y3NhYnVmICA9IChjaGFyICopIGNhbGxvYygyICogcm93cyAqIGNvbHMsIDEpOwotCQl2Y3NhYnVmMCA9IChjaGFyICopIGNhbGxvYygyICogcm93cyAqIGNvbHMsIDEpOwotCQljcmVhdGVkID0gMTsKLQotCQlpZiAocHJldl9yb3dzICE9IC0xICYmIHByZXZfY29scyAhPSAtMSkgewotCQkJZG9fbmV3X2ZiKDEpOwotCQl9Ci0KLQkJcHJldl9yb3dzID0gcm93czsKLQkJcHJldl9jb2xzID0gY29sczsKLQl9Ci0KLQlpZiAoIXJmYkVuZGlhblRlc3QpIHsKLQkJdW5zaWduZWQgY2hhciB0YyA9IHJvd3M7Ci0JCXJvd3MgPSBjb2xzOwotCQljb2xzID0gdGM7Ci0KLQkJdGMgPSB4cG9zOwotCQl4cG9zID0geXBvczsKLQkJeXBvcyA9IHRjOwotCX0KLQotCWxlbiA9IDIgKiByb3dzICogY29sczsKLQlkZWwgPSAwOwotCW1lbXNldCh2Y3NhYnVmLCAwLCBsZW4pOwotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCW4gPSByZWFkKHJhd19mYl9mZCwgdmNzYWJ1ZiArIGRlbCwgbGVuKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlkZWwgKz0gbjsKLQkJCWxlbiAtPSBuOwotCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWZha2Vfc2NyZWVuLT5mcmFtZUJ1ZmZlciA9IHNuYXAtPmRhdGE7Ci0JZmFrZV9zY3JlZW4tPnBhZGRlZFdpZHRoSW5CeXRlcyA9IHNuYXAtPmJ5dGVzX3Blcl9saW5lOwotCWZha2Vfc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYml0c1BlclBpeGVsID0gcmF3X2ZiX25hdGl2ZV9icHA7Ci0JZmFrZV9zY3JlZW4tPndpZHRoID0gc25hcC0+d2lkdGg7Ci0JZmFrZV9zY3JlZW4tPmhlaWdodCA9IHNuYXAtPmhlaWdodDsKLQotCWZvciAoaT0wOyBpIDwgcm93cyAqIGNvbHM7IGkrKykgewotCQlpbnQgaXgsIGl5LCB4LCB5LCB3LCBoOwotCQl1bnNpZ25lZCBjaGFyIGNociA9IDA7Ci0JCXVuc2lnbmVkIGNoYXIgYXR0cjsKLQkJdW5zaWduZWQgaW50IGZvcmUsIGJhY2s7Ci0JCXVuc2lnbmVkIHNob3J0ICp1c3A7Ci0JCXVuc2lnbmVkIGludCAqdWlwOwotCQljaHIgID0gKHVuc2lnbmVkIGNoYXIpIHZjc2FidWZbMippXTsKLQkJYXR0ciA9IHZjc2FidWZbMippKzFdOwotCi0JCWl5ID0gaSAvIGNvbHM7Ci0JCWl4ID0gaSAtIGl5ICogY29sczsKLQotCQlpZiAoaXggPT0gcHJldl94cG9zICYmIGl5ID09IHByZXZfeXBvcykgewotCQkJOwotCQl9IGVsc2UgaWYgKGl4ID09IHhwb3MgJiYgaXkgPT0geXBvcykgewotCQkJOwotCQl9IGVsc2UgaWYgKCFjcmVhdGVkICYmIGNociA9PSB2Y3NhYnVmMFsyKmldICYmIGF0dHIgPT0gdmNzYWJ1ZjBbMippKzFdKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghcmZiRW5kaWFuVGVzdCkgewotCQkJdW5zaWduZWQgY2hhciB0YyA9IGNocjsKLQkJCWNociA9IGF0dHI7Ci0JCQlhdHRyID0gdGM7Ci0JCX0KLQotCQl5ID0gaXkgKiBDaDsKLQkJeCA9IGl4ICogQ3c7Ci0JCWRzdCA9IHNuYXAtPmRhdGEgKyB5ICogc25hcC0+Ynl0ZXNfcGVyX2xpbmUgKyB4ICogQnBwOwotCi0JCWZvcmUgPSBjb2xvcl90YWJbYXR0ciAmIDB4Zl07Ci0JCWJhY2sgPSBjb2xvcl90YWJbKGF0dHIgPj4gNCkgJiAweDddOwotCi0JCWlmIChpeCA9PSB4cG9zICYmIGl5ID09IHlwb3MpIHsKLQkJCXVuc2lnbmVkIGludCB0aSA9IGZvcmU7Ci0JCQlmb3JlID0gYmFjazsKLQkJCWJhY2sgPSB0aTsKLQkJfQotCi0JCWZvciAoaCA9IDA7IGggPCBDaDsgaCsrKSB7Ci0JCQlpZiAoQnBwID09IDEpIHsKLQkJCQltZW1zZXQoZHN0LCBiYWNrLCBDdyk7Ci0JCQl9IGVsc2UgaWYgKEJwcCA9PSAyKSB7Ci0JCQkJZm9yICh3ID0gMDsgdyA8IEN3OyB3KyspIHsKLQkJCQkJdXNwID0gKHVuc2lnbmVkIHNob3J0ICopIChkc3QgKyB3KkJwcCk7IAotCQkJCQkqdXNwID0gKHVuc2lnbmVkIHNob3J0KSBiYWNrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQnBwID09IDQpIHsKLQkJCQlmb3IgKHcgPSAwOyB3IDwgQ3c7IHcrKykgewotCQkJCQl1aXAgPSAodW5zaWduZWQgaW50ICopIChkc3QgKyB3KkJwcCk7IAotCQkJCQkqdWlwID0gKHVuc2lnbmVkIGludCkgYmFjazsKLQkJCQl9Ci0JCQl9Ci0JCQlkc3QgKz0gc25hcC0+Ynl0ZXNfcGVyX2xpbmU7Ci0JCX0KLQkJcmZiRHJhd0NoYXIoZmFrZV9zY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsIHgsIHkgKyBDaCwgY2hyLCBmb3JlKTsKLQl9Ci0JbWVtY3B5KHZjc2FidWYwLCB2Y3NhYnVmLCAyICogcm93cyAqIGNvbHMpOyAKLQlwcmV2X3hwb3MgPSB4cG9zOwotCXByZXZfeXBvcyA9IHlwb3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuYXBfYWxsX3Jhd2ZiKHZvaWQpIHsKLQlpbnQgcGl4ZWxzaXplID0gYnBwLzg7Ci0JaW50IG4sIHN6OwotCWNoYXIgKmRzdDsKLQlzdGF0aWMgY2hhciAqdW5jbGlwcGVkX2RzdCA9IE5VTEw7Ci0Jc3RhdGljIGludCB1bmNsaXBwZWRfbGVuID0gMDsKLQotCWRzdCA9IHNuYXAtPmRhdGE7Ci0KLQlpZiAoeGZvcm0yNHRvMzIgJiYgYnBwID09IDMyKSB7Ci0JCXBpeGVsc2l6ZSA9IDM7Ci0JfQotCXN6ID0gZHB5X3kgKiBzbmFwLT5ieXRlc19wZXJfbGluZTsKLQotCWlmICh3ZHB5X3ggPiBkcHlfeCB8fCB3ZHB5X3kgPiBkcHlfeSkgewotCQlzeiA9IHdkcHlfeCAqIHdkcHlfeSAqIHBpeGVsc2l6ZTsKLQkJaWYgKHN6ID4gdW5jbGlwcGVkX2xlbiB8fCB1bmNsaXBwZWRfZHN0ID09IE5VTEwpIHsKLQkJCWlmICh1bmNsaXBwZWRfZHN0KSB7Ci0JCQkJZnJlZSh1bmNsaXBwZWRfZHN0KTsKLQkJCX0KLQkJCXVuY2xpcHBlZF9kc3QgPSAoY2hhciAqKSBtYWxsb2Moc3orNCk7Ci0JCQl1bmNsaXBwZWRfbGVuID0gc3o7Ci0JCX0KLQkJZHN0ID0gdW5jbGlwcGVkX2RzdDsKLQl9Ci0JCQotCWlmICghIHJhd19mYl9zZWVrKSB7Ci0JCW1lbWNweShkc3QsIHJhd19mYl9hZGRyICsgcmF3X2ZiX29mZnNldCwgc3opOwotCi0JfSBlbHNlIHsKLQkJaW50IGxlbiA9IHN6LCBkZWwgPSAwOwotCQlvZmZfdCBvZmYgPSAob2ZmX3QpIHJhd19mYl9vZmZzZXQ7Ci0KLQkJbHNlZWsocmF3X2ZiX2ZkLCBvZmYsIFNFRUtfU0VUKTsKLQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCW4gPSByZWFkKHJhd19mYl9mZCwgZHN0ICsgZGVsLCBsZW4pOwotCQkJaWYgKG4gPiAwKSB7Ci0JCQkJZGVsICs9IG47Ci0JCQkJbGVuIC09IG47Ci0JCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChkc3QgPT0gdW5jbGlwcGVkX2RzdCkgewotCQljaGFyICpzcmM7Ci0JCWludCBoOwotCQlpbnQgeCA9IG9mZl94ICsgY29mZl94OwotCQlpbnQgeSA9IG9mZl95ICsgY29mZl95OwotCi0JCXNyYyA9IHVuY2xpcHBlZF9kc3QgKyB5ICogd2RweV94ICogcGl4ZWxzaXplICsKLQkJICAgIHggKiBwaXhlbHNpemU7Ci0JCWRzdCA9IHNuYXAtPmRhdGE7Ci0KLQkJZm9yIChoID0gMDsgaCA8IGRweV95OyBoKyspIHsKLQkJCW1lbWNweShkc3QsIHNyYywgZHB5X3ggKiBwaXhlbHNpemUpOwotCQkJc3JjICs9IHdkcHlfeCAqIHBpeGVsc2l6ZTsKLQkJCWRzdCArPSBzbmFwLT5ieXRlc19wZXJfbGluZTsKLQkJfQotCX0KLX0KLQotaW50IGNvcHlfc25hcCh2b2lkKSB7Ci0JaW50IGRiID0gMTsKLQljaGFyICpmYnA7Ci0JaW50IGksIHksIGJsb2NrX3NpemU7Ci0JZG91YmxlIGR0OwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxLCBzbmFwY250ID0gMDsKLQotCWlmIChyYXdfZmJfc3RyKSB7Ci0JCWludCByZWFkX2FsbF9hdF9vbmNlID0gMTsKLQkJZG91YmxlIHN0YXJ0ID0gZG5vdygpOwotCQlpZiAocmF3ZmJfcmVzZXQgPCAwKSB7Ci0JCQlpZiAoZ2V0ZW52KCJTTkFQRkJfUkFXRkJfUkVTRVQiKSkgewotCQkJCXJhd2ZiX3Jlc2V0ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmF3ZmJfcmVzZXQgPSAwOwotCQkJfQotCQl9Ci0JCWlmIChzbmFwX2ZiID09IE5VTEwgfHwgc25hcCA9PSBOVUxMKSB7Ci0JCQlyZmJMb2coImNvcHlfc25hcDogcmF3ZmIgbW9kZSBhbmQgbnVsbCBzbmFwIGZiXG4iKTsgCi0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWlmIChyYXdmYl9yZXNldCkgewotCQkJaW5pdGlhbGl6ZV9yYXdfZmIoMSk7Ci0JCX0KLQkJaWYgKHJhd19mYl9ieXRlc19wZXJfbGluZSAhPSBzbmFwLT5ieXRlc19wZXJfbGluZSkgewotCQkJcmVhZF9hbGxfYXRfb25jZSA9IDA7Ci0JCX0KLQkJaWYgKHJhd19mYl9mdWxsX3N0ciAmJiBzdHJzdHIocmF3X2ZiX2Z1bGxfc3RyLCAiL2Rldi92Y3NhIikpIHsKLQkJCXNuYXBfdmNzYV9yYXdmYigpOwotCQl9IGVsc2UgaWYgKHJlYWRfYWxsX2F0X29uY2UpIHsKLQkJCXNuYXBfYWxsX3Jhd2ZiKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB0aGlzIGdvZXMgbGluZSBieSBsaW5lLCBYWFggbm90IHdvcmtpbmcgZm9yIHZpZGVvICovCi0JCQljb3B5X3Jhd19mYihzbmFwLCAwLCAwLCBkcHlfeCwgZHB5X3kpOwotCQl9Ci1pZiAoZGIgJiYgc25hcGNudCsrIDwgNSkgcmZiTG9nKCJyYXdmYiBjb3B5X3NuYXAgdG9vazogJS41ZiBzZWNzXG4iLCBkbm93KCkgLSBzdGFydCk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCWlmICghIGZzX2ZhY3RvcikgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCWlmICghIHNuYXBfZmIgfHwgISBzbmFwIHx8ICEgc25hcHJlY3QpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWJsb2NrX3NpemUgPSAoKGRweV95L2ZzX2ZhY3RvcikgKiBzbmFwLT5ieXRlc19wZXJfbGluZSk7Ci0KLQlmYnAgPSBzbmFwX2ZiOwotCXkgPSAwOwotCi0KLQlkdGltZTAoJmR0KTsKLQlYX0xPQ0s7Ci0KLQkvKiBzY3JlZW4gbWF5IGJlIHRvbyBiaWcgZm9yIDEgc2htIGFyZWEsIHNvIGJyb2tlbiBpbnRvIGZzX2ZhY3RvciAqLwotCWZvciAoaT0wOyBpIDwgZnNfZmFjdG9yOyBpKyspIHsKLQkJWFJBTkRSX1NFVF9UUkFQX1JFVCgtMSwgImNvcHlfc25hcC1zZXQiKTsKLQkJY29weV9pbWFnZShzbmFwcmVjdCwgMCwgeSwgMCwgMCk7Ci0JCVhSQU5EUl9DSEtfVFJBUF9SRVQoLTEsICJjb3B5X3NuYXAtY2hrIik7Ci0KLQkJbWVtY3B5KGZicCwgc25hcHJlY3QtPmRhdGEsIChzaXplX3QpIGJsb2NrX3NpemUpOwotCi0JCXkgKz0gZHB5X3kgLyBmc19mYWN0b3I7Ci0JCWZicCArPSBibG9ja19zaXplOwotCX0KLQotCVhfVU5MT0NLOwotCi0JZHQgPSBkdGltZSgmZHQpOwotCWlmIChmaXJzdCkgewotCQlyZmJMb2coImNvcHlfc25hcDogdGltZSBmb3IgLXNuYXBmYiBzbmFwc2hvdDogJS4zZiBzZWNcbiIsIGR0KTsKLQkJZmlyc3QgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qIAotICogZGVidWdnaW5nOiBwcmludCBvdXQgYSBwaWN0dXJlIG9mIHRoZSB0aWxlcy4KLSAqLwotc3RhdGljIHZvaWQgcHJpbnRfdGlsZXModm9pZCkgewotCS8qIGhhY2sgZm9yIHZpZXdpbmcgdGlsZSBkaWZmcyBvbiB0aGUgc2NyZWVuLiAqLwotCXN0YXRpYyBjaGFyICpwcmV2ID0gTlVMTDsKLQlpbnQgbiwgeCwgeSwgbXMgPSAxNTAwOwotCi0JbXMgPSAxOwotCi0JaWYgKCEgcHJldikgewotCQlwcmV2ID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIG50aWxlcyk7Ci0JCWZvciAobj0wOyBuIDwgbnRpbGVzOyBuKyspIHsKLQkJCXByZXZbbl0gPSAwOwotCQl9Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiICAgIik7Ci0JZm9yICh4PTA7IHggPCBudGlsZXNfeDsgeCsrKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJTFkIiwgeCAlIDEwKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCW4gPSAwOwotCWZvciAoeT0wOyB5IDwgbnRpbGVzX3k7IHkrKykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiUyZCAiLCB5KTsKLQkJZm9yICh4PTA7IHggPCBudGlsZXNfeDsgeCsrKSB7Ci0JCQlpZiAodGlsZV9oYXNfZGlmZltuXSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiWCIpOwotCQkJfSBlbHNlIGlmIChwcmV2W25dKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJvIik7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLCAiLiIpOwotCQkJfQotCQkJbisrOwotCQl9Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQl9Ci0JZm9yIChuPTA7IG4gPCBudGlsZXM7IG4rKykgewotCQlwcmV2W25dID0gdGlsZV9oYXNfZGlmZltuXTsKLQl9Ci0JdXNsZWVwKG1zICogMTAwMCk7Ci19Ci0KLS8qCi0gKiBVdGlsaXRpZXMgZm9yIG1hbmFnaW5nIHRoZSAibmFwcyIgdG8gY3V0IGRvd24gb24gYW1vdW50IG9mIHBvbGxpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIG5hcF9zZXQoaW50IHRpbGVfY250KSB7Ci0JaW50IG5hcF9pbiA9IG5hcF9vazsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQotCWlmIChzY2FuX2NvdW50ID09IDApIHsKLQkJLyogcm9sbCB1cCBjaGVjayBmb3IgYWxsIE5TQ0FOIHNjYW5zICovCi0JCW5hcF9vayA9IDA7Ci0JCWlmIChuYXB0aWxlICYmIG5hcF9kaWZmX2NvdW50IDwgMiAqIE5TQ0FOICogbmFwdGlsZSkgewotCQkJLyogIjIiIGlzIGEgZnVkZ2UgdG8gcGVybWl0IGEgYml0IG9mIGJnIGRyYXdpbmcgKi8KLQkJCW5hcF9vayA9IDE7Ci0JCX0KLQkJbmFwX2RpZmZfY291bnQgPSAwOwotCX0KLQlpZiAobmFwX29rICYmICEgbmFwX2luICYmIHVzZV94ZGFtYWdlKSB7Ci0JCWlmIChYRF9za2lwID4gMC44ICogWERfdG90KSAJewotCQkJLyogWCBEQU1BR0UgaXMga2VlcGluZyBsb2FkIGxvdywgc28gc2tpcCBuYXAgKi8KLQkJCW5hcF9vayA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCEgbmFwX29rICYmIGNsaWVudF9jb3VudCkgewotCQlpZihub3cgPiBsYXN0X2ZiX2J5dGVzX3NlbnQgKyBub19mYnVfYmxhbmspIHsKLQkJCWlmIChkZWJ1Z190aWxlcyA+IDEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIm5hcF9zZXQ6IG5hcF9vaz0xOiBub3c6ICVkIGxhc3Q6ICVkXG4iLAotCQkJCSAgICAoaW50KSBub3csIChpbnQpIGxhc3RfZmJfYnl0ZXNfc2VudCk7Ci0JCQl9Ci0JCQluYXBfb2sgPSAxOwotCQl9Ci0JfQotCi0JaWYgKHNob3dfY3Vyc29yKSB7Ci0JCS8qIGtsdWRnZSBmb3IgdGhlIHVwIHRvIDQgdGlsZXMgdGhlIG1vdXNlIHBhdGNoIGNvdWxkIG9jY3VweSAqLwotCQlpZiAoIHRpbGVfY250ID4gNCkgewotCQkJbGFzdF9ldmVudCA9IG5vdzsKLQkJfQotCX0gZWxzZSBpZiAodGlsZV9jbnQgIT0gMCkgewotCQlsYXN0X2V2ZW50ID0gbm93OwotCX0KLX0KLQotLyoKLSAqIHNwbGl0IHVwIGEgbG9uZyBuYXAgdG8gaW1wcm92ZSB0aGUgd2FrZXVwIHRpbWUKLSAqLwotdm9pZCBuYXBfc2xlZXAoaW50IG1zLCBpbnQgc3BsaXQpIHsKLQlpbnQgaSwgaW5wdXQgPSBnb3RfdXNlcl9pbnB1dDsKLQlpbnQgZ2QgPSBnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dDsKLQotCWZvciAoaT0wOyBpPHNwbGl0OyBpKyspIHsKLQkJdXNsZWVwKG1zICogMTAwMCAvIHNwbGl0KTsKLQkJaWYgKCEgdXNlX3RocmVhZHMgJiYgaSAhPSBzcGxpdCAtIDEpIHsKLQkJCXJmYlBFKC0xKTsKLQkJfQotCQlpZiAoaW5wdXQgIT0gZ290X3VzZXJfaW5wdXQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChnZCAhPSBnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICpnZXRfbG9hZCh2b2lkKSB7Ci0Jc3RhdGljIGNoYXIgdG1wWzY0XTsKLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCWlmIChjb3VudCsrICUgNSA9PSAwKSB7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JCWlmIChzdGF0KCIvcHJvYy9sb2FkYXZnIiwgJnNiKSA9PSAwKSB7Ci0JCQlpbnQgZCA9IG9wZW4oIi9wcm9jL2xvYWRhdmciLCBPX1JET05MWSk7Ci0JCQlpZiAoZCA+PSAwKSB7Ci0JCQkJcmVhZChkLCB0bXAsIDYwKTsKLQkJCQljbG9zZShkKTsKLQkJCX0KLQkJfQotCQlpZiAodG1wWzBdID09ICdcMCcpIHsKLQkJCXN0cmNhdCh0bXAsICJ1bmtub3duIik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRtcDsKLX0KLQotLyoKLSAqIHNlZSBpZiB3ZSBzaG91bGQgdGFrZSBhIG5hcCBvZiBzb21lIHNvcnQgYmV0d2VlbiBwb2xscwotICovCi1zdGF0aWMgdm9pZCBuYXBfY2hlY2soaW50IHRpbGVfY250KSB7Ci0JdGltZV90IG5vdzsKLQotCW5hcF9kaWZmX2NvdW50ICs9IHRpbGVfY250OwotCi0JaWYgKCEgdGFrZV9uYXBzKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlub3cgPSB0aW1lKE5VTEwpOwotCi0JaWYgKHNjcmVlbl9ibGFuayA+IDApIHsKLQkJaW50IGR0X2V2LCBkdF9mYnU7Ci0JCXN0YXRpYyBpbnQgbXMgPSAwOwotCQlpZiAobXMgPT0gMCkgewotCQkJbXMgPSAyMDAwOwotCQkJaWYgKGdldGVudigiWDExVk5DX1NCX0ZBQ1RPUiIpKSB7Ci0JCQkJbXMgPSBtcyAqIGF0b2YoZ2V0ZW52KCJYMTFWTkNfU0JfRkFDVE9SIikpOwotCQkJfQotCQkJaWYgKG1zIDw9IDApIHsKLQkJCQltcyA9IDIwMDA7Ci0JCQl9Ci0JCX0KLQotCQkvKiBpZiBubyBhY3Rpdml0eSwgcGF1c2UgaGVyZSBmb3IgYSBzZWNvbmQgb3Igc28uICovCi0JCWR0X2V2ICA9IChpbnQpIChub3cgLSBsYXN0X2V2ZW50KTsKLQkJZHRfZmJ1ID0gKGludCkgKG5vdyAtIGxhc3RfZmJfYnl0ZXNfc2VudCk7Ci0JCWlmIChkdF9mYnUgPiBzY3JlZW5fYmxhbmspIHsKLQkJCS8qIHNsZWVwIGxvbmdlciBmb3Igbm8gZmIgcmVxdWVzdHMgKi8KLQkJCWlmIChkZWJ1Z190aWxlcyA+IDEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInNjcmVlbiBibGFuayBzbGVlcDE6ICVkIG1zIC8gMTYsIGxvYWQ6ICVzXG4iLCAyICogbXMsIGdldF9sb2FkKCkpOwotCQkJfQotCQkJbmFwX3NsZWVwKDIgKiBtcywgMTYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkdF9ldiA+IHNjcmVlbl9ibGFuaykgewotCQkJaWYgKGRlYnVnX3RpbGVzID4gMSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAic2NyZWVuIGJsYW5rIHNsZWVwMjogJWQgbXMgLyA4LCBsb2FkOiAlc1xuIiwgbXMsIGdldF9sb2FkKCkpOwotCQkJfQotCQkJbmFwX3NsZWVwKG1zLCA4KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlpZiAobmFwdGlsZSAmJiBuYXBfb2sgJiYgdGlsZV9jbnQgPCBuYXB0aWxlKSB7Ci0JCWludCBtcyA9IG5hcGZhYyAqIHdhaXRtczsKLQkJbXMgPSBtcyA+IG5hcG1heCA/IG5hcG1heCA6IG1zOwotCQlpZiAobm93IC0gbGFzdF9pbnB1dCA8PSAzKSB7Ci0JCQluYXBfb2sgPSAwOwotCQl9IGVsc2UgaWYgKG5vdyAtIGxhc3RfbG9jYWxfaW5wdXQgPD0gMykgewotCQkJbmFwX29rID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZWJ1Z190aWxlcyA+IDEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIm5hcF9jaGVjayBzbGVlcDogJWQgbXMgLyAxLCBsb2FkOiAlc1xuIiwgbXMsIGdldF9sb2FkKCkpOwotCQkJfQotCQkJbmFwX3NsZWVwKG1zLCAxKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFRoaXMgaXMgY2FsbGVkIHRvIGF2b2lkIGEgfjIwIHNlY29uZCB0aW1lb3V0IGluIGxpYnZuY3NlcnZlci4KLSAqIE1heSBubyBsb25nZXIgYmUgbmVlZGVkLgotICovCi1zdGF0aWMgdm9pZCBwaW5nX2NsaWVudHMoaW50IHRpbGVfY250KSB7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X3NlbmQgPSAwOwotCXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotCi0JaWYgKHJmYk1heENsaWVudFdhaXQgPCAyMDAwMCkgewotCQlyZmJNYXhDbGllbnRXYWl0ID0gMjAwMDA7Ci0JCXJmYkxvZygicmVzZXQgcmZiTWF4Q2xpZW50V2FpdCB0byAlZCBtc2VjLlxuIiwKLQkJICAgIHJmYk1heENsaWVudFdhaXQpOwotCX0KLQlpZiAodGlsZV9jbnQgPiAwKSB7Ci0JCWxhc3Rfc2VuZCA9IG5vdzsKLQl9IGVsc2UgaWYgKHRpbGVfY250IDwgMCkgewotCQkvKiBuZWdhdGl2ZSB0aWxlX2NudCBpcyAtcGluZyBjYXNlICovCi0JCWlmIChub3cgPj0gbGFzdF9zZW5kIC0gdGlsZV9jbnQpIHsKLQkJCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCAxLCAxLCAxKTsKLQkJCWxhc3Rfc2VuZCA9IG5vdzsKLQkJfQotCX0gZWxzZSBpZiAobm93IC0gbGFzdF9zZW5kID4gNSkgewotCQkvKiBTZW5kIHNtYWxsIGhlYXJ0YmVhdCB0byBjbGllbnQgKi8KLQkJbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIDEsIDEsIDEpOwotCQlsYXN0X3NlbmQgPSBub3c7Ci0JfQotfQotCi0vKgotICogc2Nhbl9kaXNwbGF5KCkgd2FudHMgdG8ga25vdyBpZiB0aGlzIHRpbGUgY2FuIGJlIHNraXBwZWQgZHVlIHRvCi0gKiBibGFja291dCByZWdpb25zOiAobm8gZGF0YSBjb21wYXJlIGlzIGRvbmUsIGp1c3QgYSBxdWljayBnZW9tZXRyaWMgdGVzdCkKLSAqLwotc3RhdGljIGludCBibGFja291dF9saW5lX3NraXAoaW50IG4sIGludCB4LCBpbnQgeSwgaW50IHJlc2NhbiwKLSAgICBpbnQgKnRpbGVfY291bnQpIHsKLQkKLQlpZiAodGlsZV9ibGFja291dFtuXS5jb3ZlciA9PSAyKSB7Ci0JCXRpbGVfaGFzX2RpZmZbbl0gPSAwOwotCQlyZXR1cm4gMTsJLyogc2tpcCBpdCAqLwotCi0JfSBlbHNlIGlmICh0aWxlX2JsYWNrb3V0W25dLmNvdmVyID09IDEpIHsKLQkJaW50IHcsIHgxLCB5MSwgeDIsIHkyLCBiLCBoaXQgPSAwOwotCQlpZiAoeCArIE5TQ0FOID4gZHB5X3gpIHsKLQkJCXcgPSBkcHlfeCAtIHg7Ci0JCX0gZWxzZSB7Ci0JCQl3ID0gTlNDQU47Ci0JCX0KLQotCQlmb3IgKGI9MDsgYiA8IHRpbGVfYmxhY2tvdXRbbl0uY291bnQ7IGIrKykgewotCQkJCi0JCQkvKiBuLmIuIHRoZXNlIGNvb3JkcyBhcmUgaW4gZnVsbCBkaXNwbGF5IHNwYWNlOiAqLwotCQkJeDEgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLngxOwotCQkJeDIgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLngyOwotCQkJeTEgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLnkxOwotCQkJeTIgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLnkyOwotCi0JCQlpZiAoeDIgLSB4MSA8IHcpIHsKLQkJCQkvKiBuZWVkIHRvIGNvdmVyIGZ1bGwgd2lkdGggKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh5MSA8PSB5ICYmIHkgPCB5MikgewotCQkJCWhpdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGhpdCkgewotCQkJaWYgKCEgcmVzY2FuKSB7Ci0JCQkJdGlsZV9oYXNfZGlmZltuXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCSp0aWxlX2NvdW50ICs9IHRpbGVfaGFzX2RpZmZbbl07Ci0JCQl9Ci0JCQlyZXR1cm4gMTsJLyogc2tpcCAqLwotCQl9Ci0JfQotCXJldHVybiAwOwkvKiBkbyBub3Qgc2tpcCAqLwotfQotCi1zdGF0aWMgaW50IGJsYWNrb3V0X2xpbmVfY21wc2tpcChpbnQgbiwgaW50IHgsIGludCB5LCBjaGFyICpkc3QsIGNoYXIgKnNyYywKLSAgICBpbnQgdywgaW50IHBpeGVsc2l6ZSkgewotCi0JaW50IGksIHgxLCB5MSwgeDIsIHkyLCBiLCBoaXQgPSAwOwotCWludCBiZWcgPSAtMSwgZW5kID0gLTE7IAotCi0JaWYgKHRpbGVfYmxhY2tvdXRbbl0uY292ZXIgPT0gMCkgewotCQlyZXR1cm4gMDsJLyogMCBtZWFucyBkbyBub3Qgc2tpcCBpdC4gKi8KLQl9IGVsc2UgaWYgKHRpbGVfYmxhY2tvdXRbbl0uY292ZXIgPT0gMikgewotCQlyZXR1cm4gMTsJLyogMSBtZWFucyBza2lwIGl0LiAqLwotCX0KLQotCS8qIHRpbGUgaGFzIHBhcnRpYWwgY292ZXJhZ2U6ICovCi0KLQlmb3IgKGk9MDsgaSA8IHcgKiBwaXhlbHNpemU7IGkrKykgIHsKLQkJaWYgKCooZHN0K2kpICE9ICooc3JjK2kpKSB7Ci0JCQliZWcgPSBpL3BpeGVsc2l6ZTsJLyogYmVnaW5uaW5nIGRpZmZlcmVuY2UgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWZvciAoaSA9IHcgKiBwaXhlbHNpemUgLSAxOyBpID49IDA7IGktLSkgIHsKLQkJaWYgKCooZHN0K2kpICE9ICooc3JjK2kpKSB7Ci0JCQllbmQgPSBpL3BpeGVsc2l6ZTsJLyogZW5kaW5nIGRpZmZlcmVuY2UgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChiZWcgPCAwIHx8IGVuZCA8IDApIHsKLQkJLyogcHJvYmxlbSBmaW5kaW5nIHJhbmdlLi4uICovCi0JCXJldHVybiAwOwotCX0KLQotCS8qIGxvb3Agb3ZlciBibGFja291dCByZWN0YW5nbGVzOiAqLwotCWZvciAoYj0wOyBiIDwgdGlsZV9ibGFja291dFtuXS5jb3VudDsgYisrKSB7Ci0JCQotCQkvKiB5IGluIGZ1bGwgZGlzcGxheSBzcGFjZTogKi8KLQkJeTEgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLnkxOwotCQl5MiA9IHRpbGVfYmxhY2tvdXRbbl0uYm9bYl0ueTI7Ci0KLQkJLyogeCByZWxhdGl2ZSB0byB0aWxlIG9yaWdpbjogKi8KLQkJeDEgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLngxIC0geDsKLQkJeDIgPSB0aWxlX2JsYWNrb3V0W25dLmJvW2JdLngyIC0geDsKLQotCQlpZiAoeTEgPiB5IHx8IHkgPj0geTIpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh4MSA8PSBiZWcgJiYgZW5kIDw9IHgyKSB7Ci0JCQloaXQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGhpdCkgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qCi0gKiBGb3IgdGhlIHN1YndpbiBjYXNlIGZvbGxvd3MgdGhlIHdpbmRvdyBpZiBpdCBpcyBtb3ZlZC4KLSAqLwotdm9pZCBzZXRfb2Zmc2V0KHZvaWQpIHsKLQlXaW5kb3cgdzsKLQlpZiAoISBzdWJ3aW4pIHsKLQkJcmV0dXJuOwotCX0KLQlYX0xPQ0s7Ci0JeHRyYW5zbGF0ZSh3aW5kb3csIHJvb3R3aW4sIDAsIDAsICZvZmZfeCwgJm9mZl95LCAmdywgMCk7Ci0JWF9VTkxPQ0s7Ci19Ci0KLXN0YXRpYyBpbnQgeGRfc2FtcGxlcyA9IDAsIHhkX21pc3NlcyA9IDAsIHhkX2RvX2NoZWNrID0gMDsKLQotLyoKLSAqIExvb3Agb3ZlciAxLXBpeGVsIHRhbGwgaG9yaXpvbnRhbCBzY2FubGluZXMgbG9va2luZyBmb3IgY2hhbmdlcy4gIAotICogUmVjb3JkIHRoZSBjaGFuZ2VzIGluIHRpbGVfaGFzX2RpZmZbXS4gIFNjYW5saW5lcyBpbiB0aGUgbG9vcCBhcmUKLSAqIGVxdWFsbHkgc3BhY2VkIGFsb25nIHkgYnkgTlNDQU4gcGl4ZWxzLCBidXQgaGF2ZSBhIHNsaWdodGx5IHJhbmRvbQotICogc3RhcnRpbmcgb2Zmc2V0IHlzdGFydCAoIDwgTlNDQU4gKSBmcm9tIHNjYW5saW5lc1tdLgotICovCi0KLXN0YXRpYyBpbnQgc2Nhbl9kaXNwbGF5KGludCB5c3RhcnQsIGludCByZXNjYW4pIHsKLQljaGFyICpzcmMsICpkc3Q7Ci0JaW50IHBpeGVsc2l6ZSA9IGJwcC84OwotCWludCB4LCB5LCB3LCBuOwotCWludCB0aWxlX2NvdW50ID0gMDsKLQlpbnQgbm9kaWZmcyA9IDAsIGRpZmZfaGludDsKLQlpbnQgeGRfY2hlY2sgPSAwLCB4ZF9mcmVxID0gMTsKLQlzdGF0aWMgaW50IHhkX3RjayA9IDA7Ci0KLQl5ID0geXN0YXJ0OwotCi0JZ19ub3cgPSBkbm93KCk7Ci0KLQlpZiAoISBtYWluX2ZiKSB7Ci0JCXJmYkxvZygic2Nhbl9kaXNwbGF5OiBubyBtYWluX2ZiIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCVhfTE9DSzsKLQotCXdoaWxlICh5IDwgZHB5X3kpIHsKLQotCQlpZiAodXNlX3hkYW1hZ2UpIHsKLQkJCVhEX3RvdCsrOwotCQkJeGRfY2hlY2sgPSAwOwotCQkJaWYgKHhkYW1hZ2VfaGludF9za2lwKHkpKSB7Ci0JCQkJaWYgKHhkX2RvX2NoZWNrICYmIGRweSAmJiB1c2VfeGRhbWFnZSA9PSAxKSB7Ci0JCQkJCXhkX3RjaysrOwotCQkJCQl4ZF90Y2sgPSB4ZF90Y2sgJSB4ZF9mcmVxOwotCQkJCQlpZiAoeGRfdGNrID09IDApIHsKLQkJCQkJCXhkX2NoZWNrID0gMTsKLQkJCQkJCXhkX3NhbXBsZXMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXhkX2NoZWNrKSB7Ci0JCQkJCVhEX3NraXArKzsKLQkJCQkJeSArPSBOU0NBTjsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoeGRfZG9fY2hlY2sgJiYgMCkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIm5zIHk9JWRcbiIsIHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIGdyYWIgdGhlIGhvcml6b250YWwgc2NhbmxpbmUgZnJvbSB0aGUgZGlzcGxheTogKi8KLQotI2lmbmRlZiBOT19OQ0FDSEUKLS8qIFhYWCBZIHRlc3QgKi8KLWlmIChuY2FjaGUgPiAwKSB7Ci0JaW50IGdvdG9uZSA9IDA7Ci0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCWlmIChtYWNvc3hfY2hlY2tldmVudChOVUxMKSkgewotCQkJZ290b25lID0gMTsKLQkJfQotCX0gZWxzZSB7Ci0jaWYgIU5PX1gxMQotCQlYRXZlbnQgZXY7Ci0JCWlmIChyYXdfZmJfc3RyKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoWEV2ZW50c1F1ZXVlZChkcHksIFF1ZXVlZEFscmVhZHkpID09IDApIHsKLQkJCTsJLyogWFhYIFkgcmVzcCAqLwotCQl9IGVsc2UgaWYgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBNYXBOb3RpZnksICZldikpIHsKLQkJCWdvdG9uZSA9IDE7Ci0JCX0gZWxzZSBpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIFVubWFwTm90aWZ5LCAmZXYpKSB7Ci0JCQlnb3RvbmUgPSAyOwotCQl9IGVsc2UgaWYgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBDcmVhdGVOb3RpZnksICZldikpIHsKLQkJCWdvdG9uZSA9IDM7Ci0JCX0gZWxzZSBpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIENvbmZpZ3VyZU5vdGlmeSwgJmV2KSkgewotCQkJZ290b25lID0gNDsKLQkJfSBlbHNlIGlmIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgVmlzaWJpbGl0eU5vdGlmeSwgJmV2KSkgewotCQkJZ290b25lID0gNTsKLQkJfQotCQlpZiAoZ290b25lKSB7Ci0JCQlYUHV0QmFja0V2ZW50KGRweSwgJmV2KTsKLQkJfQotI2VuZGlmCi0JfQotCWlmIChnb3RvbmUpIHsKLQkJc3RhdGljIGludCBub21zZyA9IDE7Ci0JCWlmIChub21zZykgewotCQkJaWYgKGRub3d4KCkgPiAyMCkgewotCQkJCW5vbXNnID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlxuKioqIFNDQU5fRElTUExBWSBDSEVDS19OQ0FDSEUvJWQgKioqICVkIHJlc2Nhbj0lZFxuIiwgZ290b25lLCB5LCByZXNjYW4pOwotCQl9Ci0JCVhfVU5MT0NLOwotCQljaGVja19uY2FjaGUoMCwgMSk7Ci0JCVhfTE9DSzsKLQl9Ci19Ci0jZW5kaWYKLQotCQlYUkFORFJfU0VUX1RSQVBfUkVUKC0xLCAic2Nhbl9kaXNwbGF5LXNldCIpOwotCQljb3B5X2ltYWdlKHNjYW5saW5lLCAwLCB5LCAwLCAwKTsKLQkJWFJBTkRSX0NIS19UUkFQX1JFVCgtMSwgInNjYW5fZGlzcGxheS1jaGsiKTsKLQotCQkvKiBmb3IgYmV0dGVyIG1lbW9yeSBpL28gdHJ5IHRoZSB3aG9sZSBsaW5lIGF0IG9uY2UgKi8KLQkJc3JjID0gc2NhbmxpbmUtPmRhdGE7Ci0JCWRzdCA9IG1haW5fZmIgKyB5ICogbWFpbl9ieXRlc19wZXJfbGluZTsKLQotCQlpZiAoISBtZW1jbXAoZHN0LCBzcmMsIG1haW5fYnl0ZXNfcGVyX2xpbmUpKSB7Ci0JCQkvKiBubyBjaGFuZ2VzIGFueXdoZXJlIGluIHNjYW4gbGluZSAqLwotCQkJbm9kaWZmcyA9IDE7Ci0JCQlpZiAoISByZXNjYW4pIHsKLQkJCQl5ICs9IE5TQ0FOOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWlmICh4ZF9jaGVjaykgewotCQkJeGRfbWlzc2VzKys7Ci0JCX0KLQotCQl4ID0gMDsKLQkJd2hpbGUgKHggPCBkcHlfeCkgewotCQkJbiA9ICh4L3RpbGVfeCkgKyAoeS90aWxlX3kpICogbnRpbGVzX3g7Ci0JCQlkaWZmX2hpbnQgPSAwOwotCi0JCQlpZiAoYmxhY2tvdXRzKSB7Ci0JCQkJaWYgKGJsYWNrb3V0X2xpbmVfc2tpcChuLCB4LCB5LCByZXNjYW4sCi0JCQkJICAgICZ0aWxlX2NvdW50KSkgewotCQkJCQl4ICs9IE5TQ0FOOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNjYW4pIHsKLQkJCQlpZiAobm9kaWZmcyB8fCB0aWxlX2hhc19kaWZmW25dKSB7Ci0JCQkJCXRpbGVfY291bnQgKz0gdGlsZV9oYXNfZGlmZltuXTsKLQkJCQkJeCArPSBOU0NBTjsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh4ZGFtYWdlX3RpbGVfY291bnQgJiYKLQkJCSAgICB0aWxlX2hhc194ZGFtYWdlX2RpZmZbbl0pIHsKLQkJCQl0aWxlX2hhc194ZGFtYWdlX2RpZmZbbl0gPSAyOwotCQkJCWRpZmZfaGludCA9IDE7Ci0JCQl9Ci0KLQkJCS8qIHNldCBwdHJzIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHggb2Zmc2V0OiAqLwotCQkJc3JjID0gc2NhbmxpbmUtPmRhdGEgKyB4ICogcGl4ZWxzaXplOwotCQkJZHN0ID0gbWFpbl9mYiArIHkgKiBtYWluX2J5dGVzX3Blcl9saW5lICsgeCAqIHBpeGVsc2l6ZTsKLQotCQkJLyogY29tcHV0ZSB0aGUgd2lkdGggb2YgZGF0YSB0byBiZSBjb21wYXJlZDogKi8KLQkJCWlmICh4ICsgTlNDQU4gPiBkcHlfeCkgewotCQkJCXcgPSBkcHlfeCAtIHg7Ci0JCQl9IGVsc2UgewotCQkJCXcgPSBOU0NBTjsKLQkJCX0KLQotCQkJaWYgKGRpZmZfaGludCB8fCBtZW1jbXAoZHN0LCBzcmMsIHcgKiBwaXhlbHNpemUpKSB7Ci0JCQkJLyogZm91bmQgYSBkaWZmZXJlbmNlLCByZWNvcmQgaXQ6ICovCi0JCQkJaWYgKCEgYmxhY2tvdXRzKSB7Ci0JCQkJCXRpbGVfaGFzX2RpZmZbbl0gPSAxOwotCQkJCQl0aWxlX2NvdW50Kys7CQkKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYmxhY2tvdXRfbGluZV9jbXBza2lwKG4sIHgsIHksCi0JCQkJCSAgICBkc3QsIHNyYywgdywgcGl4ZWxzaXplKSkgewotCQkJCQkJdGlsZV9oYXNfZGlmZltuXSA9IDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aWxlX2hhc19kaWZmW25dID0gMTsKLQkJCQkJCXRpbGVfY291bnQrKzsJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJeCArPSBOU0NBTjsKLQkJfQotCQl5ICs9IE5TQ0FOOwotCX0KLQotCVhfVU5MT0NLOwotCi0JcmV0dXJuIHRpbGVfY291bnQ7Ci19Ci0KLQotaW50IHNjYW5saW5lc1tOU0NBTl0gPSB7Ci0JIDAsIDE2LCAgOCwgMjQsICA0LCAyMCwgMTIsIDI4LAotCTEwLCAyNiwgMTgsICAyLCAyMiwgIDYsIDMwLCAxNCwKLQkgMSwgMTcsICA5LCAyNSwgIDcsIDIzLCAxNSwgMzEsCi0JMTksICAzLCAyNywgMTEsIDI5LCAxMywgIDUsIDIxCi19OwotCi0vKgotICogdG9wbGV2ZWwgZm9yIHRoZSBzY2FubmluZywgcmVzY2FubmluZywgYW5kIGFwcGx5aW5nIHRoZSBoZXVyaXN0aWNzLgotICogcmV0dXJucyBudW1iZXIgb2YgY2hhbmdlZCB0aWxlcy4KLSAqLwotaW50IHNjYW5fZm9yX3VwZGF0ZXMoaW50IGNvdW50X29ubHkpIHsKLQlpbnQgaSwgdGlsZV9jb3VudCwgdGlsZV9kaWZmczsKLQlpbnQgb2xkX2NvcHlfdGlsZTsKLQlkb3VibGUgZnJhYzEgPSAwLjE7ICAgLyogdHdlYWsgcGFyYW1ldGVyIHRvIHRyeSBhIDJuZCBzY2FuX2Rpc3BsYXkoKSAqLwotCWRvdWJsZSBmcmFjMiA9IDAuMzU7ICAvKiBvciAzcmQgKi8KLQlkb3VibGUgZnJhYzMgPSAwLjAyOyAgLyogZG8gc2Nhbl9kaXNwbGF5KCkgYWdhaW4gYWZ0ZXIgY29weV90aWxlcygpICovCi0Jc3RhdGljIGRvdWJsZSBsYXN0X3BvbGwgPSAwLjA7Ci0JZG91YmxlIGR0bXAgPSAwLjA7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm4gMDsKLSAKLQlpZiAoc2xvd19mYiA+IDAuMCkgewotCQlkb3VibGUgbm93ID0gZG5vdygpOwotCQlpZiAobm93IDwgbGFzdF9wb2xsICsgc2xvd19mYikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbGFzdF9wb2xsID0gbm93OwotCX0KLQotCWZvciAoaT0wOyBpIDwgbnRpbGVzOyBpKyspIHsKLQkJdGlsZV9oYXNfZGlmZltpXSA9IDA7Ci0JCXRpbGVfaGFzX3hkYW1hZ2VfZGlmZltpXSA9IDA7Ci0JCXRpbGVfdHJpZWRbaV0gPSAwOwotCQl0aWxlX2NvcGllZFtpXSA9IDA7Ci0JfQotCWZvciAoaT0wOyBpIDwgbnRpbGVzX3k7IGkrKykgewotCQkvKiBjb3VsZCBiZSB1c2VmdWwsIGN1cnJlbnRseSBub3QgdXNlZCAqLwotCQl0aWxlX3Jvd19oYXNfeGRhbWFnZV9kaWZmW2ldID0gMDsKLQl9Ci0JeGRhbWFnZV90aWxlX2NvdW50ID0gMDsKLQotCS8qCi0JICogbi5iLiB0aGlzIHByb2dyYW0gaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgc28gZmFyIHdpdGgKLQkgKiB0aWxlX3ggPSB0aWxlX3kgPSBOU0NBTiA9IDMyIQotCSAqLwotCi0JaWYgKCFjb3VudF9vbmx5KSB7Ci0JCXNjYW5fY291bnQrKzsKLQkJc2Nhbl9jb3VudCAlPSBOU0NBTjsKLQotCQkvKiBzb21lIHBlcmlvZGljIG1haW50ZW5hbmNlICovCi0JCWlmIChzdWJ3aW4gJiYgc2Nhbl9jb3VudCAlIDQgPT0gMCkgewotCQkJc2V0X29mZnNldCgpOwkvKiBmb2xsb3cgdGhlIHN1YndpbmRvdyAqLwotCQl9Ci0JCWlmIChpbmRleGVkX2NvbG9yICYmIHNjYW5fY291bnQgJSA0ID09IDApIHsKLQkJCS8qIGNoZWNrIGZvciBjaGFuZ2VkIGNvbG9ybWFwICovCi0JCQlzZXRfY29sb3JtYXAoMCk7Ci0JCX0KLQkJaWYgKGNtYXA4dG8yNCAmJiBzY2FuX2NvdW50ICUgMSA9PSAwKSB7Ci0JCQljaGVja19mb3JfbXVsdGl2aXMoKTsKLQkJfQotI2lmZGVmIE1BQ09TWAotCQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJCW1hY29zeF9ldmVudF9sb29wKCk7Ci0JCX0KLSNlbmRpZgotCQlpZiAodXNlX3hkYW1hZ2UpIHsKLQkJCS8qIGZpcnN0IHBhc3MgY29sbGVjdGluZyBEQU1BR0UgZXZlbnRzOiAqLwotI2lmZGVmIE1BQ09TWAotCQkJaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCQkJY29sbGVjdF9ub25fWF94ZGFtYWdlKC0xLCAtMSwgLTEsIC0xLCAwKTsKLQkJCX0gZWxzZSAKLSNlbmRpZgotCQkJewotCQkJCWlmIChyYXdmYl92bmNfcmVmbGVjdCkgewotCQkJCQljb2xsZWN0X25vbl9YX3hkYW1hZ2UoLTEsIC0xLCAtMSwgLTEsIDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbGxlY3RfeGRhbWFnZShzY2FuX2NvdW50LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLSNkZWZpbmUgU0NBTl9GQVRBTCh4KSBcCi0JaWYgKHggPCAwKSB7IFwKLQkJc2Nhbl9pbl9wcm9ncmVzcyA9IDA7IFwKLQkJZmJfY29weV9pbl9wcm9ncmVzcyA9IDA7IFwKLQkJcmV0dXJuIDA7IFwKLQl9Ci0KLQkvKiBzY2FuIHdpdGggdGhlIGluaXRpYWwgeSB0byB0aGUgaml0dGVyIHZhbHVlIGZyb20gc2NhbmxpbmVzOiAqLwotCXNjYW5faW5fcHJvZ3Jlc3MgPSAxOwotCXRpbGVfY291bnQgPSBzY2FuX2Rpc3BsYXkoc2NhbmxpbmVzW3NjYW5fY291bnRdLCAwKTsKLQlTQ0FOX0ZBVEFMKHRpbGVfY291bnQpOwotCi0JLyoKLQkgKiB3ZSBkbyB0aGUgWERBTUFHRSBoZXJlIHRvbyBzaW5jZSBhZnRlciBzY2FuX2Rpc3BsYXkoKQotCSAqIHRoZXJlIGlzIGEgYmV0dGVyIGNoYW5jZSB3ZSBoYXZlIHJlY2VpdmVkIHRoZSBldmVudHMgZnJvbQotCSAqIHRoZSBYIHNlcnZlciAob3RoZXJ3aXNlIHRoZSBEQU1BR0UgZXZlbnRzIHdpbGwgYmUgcHJvY2Vzc2VkCi0JICogaW4gdGhlICpuZXh0KiBjYWxsLCB1c3VhbGx5IHRvbyBsYXRlIGFuZCB3YXN0ZWZ1bCBzaW5jZQotCSAqIHRoZSB1bmNoYW5nZWQgdGlsZXMgYXJlIHJlYWQgaW4gYWdhaW4pLgotCSAqLwotCWlmICh1c2VfeGRhbWFnZSkgewotI2lmZGVmIE1BQ09TWAotCQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJCTsKLQkJfSBlbHNlIAotI2VuZGlmCi0JCXsKLQkJCWlmIChyYXdmYl92bmNfcmVmbGVjdCkgewotCQkJCTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29sbGVjdF94ZGFtYWdlKHNjYW5fY291bnQsIDEpOwotCQkJfQotCQl9Ci0JfQotCWlmIChjb3VudF9vbmx5KSB7Ci0JCXNjYW5faW5fcHJvZ3Jlc3MgPSAwOwotCQlmYl9jb3B5X2luX3Byb2dyZXNzID0gMDsKLQkJcmV0dXJuIHRpbGVfY291bnQ7Ci0JfQotCi0JaWYgKHhkYW1hZ2VfdGlsZV9jb3VudCkgewotCQkvKiBwaWNrIHVwICJrbm93biIgZGFtYWdlZCB0aWxlcyB3ZSBtaXNzZWQgaW4gc2Nhbl9kaXNwbGF5KCkgKi8KLQkJZm9yIChpPTA7IGkgPCBudGlsZXM7IGkrKykgewotCQkJaWYgKHRpbGVfaGFzX2RpZmZbaV0pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0aWxlX2hhc194ZGFtYWdlX2RpZmZbaV0pIHsKLQkJCQl0aWxlX2hhc19kaWZmW2ldID0gMTsKLQkJCQlpZiAodGlsZV9oYXNfeGRhbWFnZV9kaWZmW2ldID09IDEpIHsKLQkJCQkJdGlsZV9oYXNfeGRhbWFnZV9kaWZmW2ldID0gMjsKLQkJCQkJdGlsZV9jb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAoZHB5ICYmIHVzZV94ZGFtYWdlID09IDEpIHsKLQkJc3RhdGljIHRpbWVfdCBsYXN0X3hkX2NoZWNrID0gMDsKLQkJaWYgKHRpbWUoTlVMTCkgPiBsYXN0X3hkX2NoZWNrICsgMikgewotCQkJaW50IGNwID0gKHNjYW5fY291bnQgKyAzKSAlIE5TQ0FOOwotCQkJeGRfZG9fY2hlY2sgPSAxOwotCQkJdGlsZV9jb3VudCA9IHNjYW5fZGlzcGxheShzY2FubGluZXNbY3BdLCAwKTsKLQkJCXhkX2RvX2NoZWNrID0gMDsKLQkJCVNDQU5fRkFUQUwodGlsZV9jb3VudCk7Ci0JCQlsYXN0X3hkX2NoZWNrID0gdGltZShOVUxMKTsKLQkJCWlmICh4ZF9zYW1wbGVzID4gMjAwKSB7Ci0JCQkJc3RhdGljIGludCBiYWQgPSAwOwotCQkJCWlmICh4ZF9taXNzZXMgPiAoMjAgKiB4ZF9zYW1wbGVzKSAvIDEwMCkgewotCQkJCQlyZmJMb2coIlhEQU1BR0UgaXMgbm90IHdvcmtpbmcgd2VsbC4uLiBtaXNzZXM6ICVkLyVkXG4iLCB4ZF9taXNzZXMsIHhkX3NhbXBsZXMpOwotCQkJCQlyZmJMb2coIk1heWJlIGFuIE9wZW5HTCBhcHAgbGlrZSBCZXJ5bCBvciBDb21waXogaXMgdGhlIHByb2JsZW0/XG4iKTsKLQkJCQkJcmZiTG9nKCJVc2UgeDExdm5jIC1ub3hkYW1hZ2Ugb3IgZGlzYWJsZSB0aGUgQmVyeWwvQ29tcGl6IGFwcC5cbiIpOwotCQkJCQlyZmJMb2coIlRvIGRpc2FibGUgdGhpcyBjaGVjayBhbmQgd2FybmluZyBzcGVjaWZ5IC14ZGFtYWdlIHR3aWNlLlxuIik7Ci0JCQkJCWlmICgrK2JhZCA+PSAxMCkgewotCQkJCQkJcmZiTG9nKCJYREFNQUdFIGFwcGVhcnMgYnJva2VuIChPcGVuR0wgYXBwPyksIHR1cm5pbmcgaXQgb2ZmLlxuIik7Ci0JCQkJCQl1c2VfeGRhbWFnZSA9IDA7Ci0JCQkJCQlpbml0aWFsaXplX3hkYW1hZ2UoKTsKLQkJCQkJCWRlc3Ryb3lfeGRhbWFnZV9pZl9uZWVkZWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl4ZF9zYW1wbGVzID0gMDsKLQkJCQl4ZF9taXNzZXMgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JbmFwX3NldCh0aWxlX2NvdW50KTsKLQotCWlmIChmc19mYWN0b3IgJiYgZnJhYzEgPj0gZnNfZnJhYykgewotCQkvKiBtYWtlIGZyYWMxIDwgZnNfZnJhYyBpZiBmdWxsc2NyZWVuIHVwZGF0ZXMgYXJlIGVuYWJsZWQgKi8KLQkJZnJhYzEgPSBmc19mcmFjLzIuMDsKLQl9Ci0KLQlpZiAodGlsZV9jb3VudCA+IGZyYWMxICogbnRpbGVzKSB7Ci0JCS8qCi0JCSAqIG1hbnkgdGlsZXMgaGF2ZSBjaGFuZ2VkLCBzbyB0cnkgYSByZXNjYW4gKHNpbmNlIGl0IHNob3VsZAotCQkgKiBiZSBzaG9ydCBjb21wYXJlZCB0byB0aGUgbWFueSB1cGNvbWluZyBjb3B5X3RpbGVzKCkgY2FsbHMpCi0JCSAqLwotCi0JCS8qIHRoaXMgY2hlY2sgaXMgZG9uZSB0byBza2lwIHRoZSBleHRyYSBzY2FuX2Rpc3BsYXkoKSBjYWxsICovCi0JCWlmICghIGZzX2ZhY3RvciB8fCB0aWxlX2NvdW50IDw9IGZzX2ZyYWMgKiBudGlsZXMpIHsKLQkJCWludCBjcCwgdGlsZV9jb3VudF9vbGQgPSB0aWxlX2NvdW50OwotCQkJCi0JCQkvKiBjaG9vc2UgYSBkaWZmZXJlbnQgeSBzaGlmdCBmb3IgdGhlIDJuZCBzY2FuOiAqLwotCQkJY3AgPSAoTlNDQU4gLSBzY2FuX2NvdW50KSAlIE5TQ0FOOwotCi0JCQl0aWxlX2NvdW50ID0gc2Nhbl9kaXNwbGF5KHNjYW5saW5lc1tjcF0sIDEpOwotCQkJU0NBTl9GQVRBTCh0aWxlX2NvdW50KTsKLQotCQkJaWYgKHRpbGVfY291bnQgPj0gKDEgKyBmcmFjMikgKiB0aWxlX2NvdW50X29sZCkgewotCQkJCS8qIG9uIGEgcm9sbC4uLiBkbyBhIDNyZCBzY2FuICovCi0JCQkJY3AgPSAoTlNDQU4gLSBzY2FuX2NvdW50ICsgNykgJSBOU0NBTjsKLQkJCQl0aWxlX2NvdW50ID0gc2Nhbl9kaXNwbGF5KHNjYW5saW5lc1tjcF0sIDEpOwotCQkJCVNDQU5fRkFUQUwodGlsZV9jb3VudCk7Ci0JCQl9Ci0JCX0KLQkJc2Nhbl9pbl9wcm9ncmVzcyA9IDA7Ci0KLQkJLyoKLQkJICogQXQgc29tZSBudW1iZXIgb2YgY2hhbmdlZCB0aWxlcyBpdCBpcyBiZXR0ZXIgdG8ganVzdAotCQkgKiBjb3B5IHRoZSBmdWxsIHNjcmVlbiBhdCBvbmNlLiAgSS5lLiB0aW1lID0gYzEgKyBtICogcjEKLQkJICogd2hlcmUgbSBpcyBudW1iZXIgb2YgdGlsZXMsIHIxIGlzIHRoZSBjb3B5X3RpbGVzKCkKLQkJICogdGltZSwgYW5kIGMxIGlzIHRoZSBzY2FuX2Rpc3BsYXkoKSB0aW1lOiBmb3Igc29tZSBtCi0JCSAqIGl0IGNyb3NzZXMgdGhlIGZ1bGwgc2NyZWVuIHVwZGF0ZSB0aW1lLgotCQkgKgotCQkgKiBXZSB0cnkgdG8gcHJlZGljdCB0aGF0IGNyb3Nzb3ZlciB3aXRoIHRoZSBmc19mcmFjCi0JCSAqIGZ1ZGdlIGZhY3Rvci4uLiBzZWVtcyB0byBiZSBhYm91dCAxLzIgdGhlIHRvdGFsIG51bWJlcgotCQkgKiBvZiB0aWxlcy4gIG4uYi4gdGhpcyBpZ25vcmVzIG5ldHdvcmsgYmFuZHdpZHRoLAotCQkgKiBjb21wcmVzc2lvbiB0aW1lIGV0Yy4uLgotCQkgKgotCQkgKiBVc2UgLWZzIDEuMCB0byBkaXNhYmxlIG9uIHNsb3cgbGlua3MuCi0JCSAqLwotCQlpZiAoZnNfZmFjdG9yICYmIHRpbGVfY291bnQgPiBmc19mcmFjICogbnRpbGVzKSB7Ci0JCQlpbnQgY3M7Ci0JCQlmYl9jb3B5X2luX3Byb2dyZXNzID0gMTsKLQkJCWNzID0gY29weV9zY3JlZW4oKTsKLQkJCWZiX2NvcHlfaW5fcHJvZ3Jlc3MgPSAwOwotCQkJU0NBTl9GQVRBTChjcyk7Ci0JCQlpZiAodXNlX3RocmVhZHMgJiYgcG9pbnRlcl9tb2RlICE9IDEpIHsKLQkJCQlwb2ludGVyX2V2ZW50KC0xLCAwLCAwLCBOVUxMKTsKLQkJCX0KLQkJCW5hcF9jaGVjayh0aWxlX2NvdW50KTsKLQkJCXJldHVybiB0aWxlX2NvdW50OwotCQl9Ci0JfQotCXNjYW5faW5fcHJvZ3Jlc3MgPSAwOwotCi0JLyogY29weSBhbGwgdGlsZXMgd2l0aCBkaWZmZXJlbmNlcyBmcm9tIGRpc3BsYXkgdG8gcmZiIGZyYW1lYnVmZmVyOiAqLwotCWZiX2NvcHlfaW5fcHJvZ3Jlc3MgPSAxOwotCi0JaWYgKHNpbmdsZV9jb3B5dGlsZSB8fCB0aWxlX3NobV9jb3VudCA8IG50aWxlc194KSB7Ci0JCS8qCi0JCSAqIE9sZCB3YXksIGNvcHkgSS9PIG9uZSB0aWxlIGF0IGEgdGltZS4KLQkJICovCi0JCW9sZF9jb3B5X3RpbGUgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIAotCQkgKiBOZXcgd2F5LCBkb2VzIHJ1bnMgb2YgaG9yaXpvbnRhbCB0aWxlcyBhdCBvbmNlLgotCQkgKiBOb3RlIHRoYXQgYmVsb3csIGZvciBzaW1wbGljaXR5LCB0aGUgZXh0cmEgdGlsZSBmaW5kaW5nCi0JCSAqIChlLmcuIGNvcHlfdGlsZXNfYmFja3dhcmRfcGFzcykgaXMgZG9uZSB0aGUgb2xkIHdheS4KLQkJICovCi0JCW9sZF9jb3B5X3RpbGUgPSAwOwotCX0KLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAwOwotCi0vKiBYWFggWSAqLwotaWYgKDAgJiYgdGlsZV9jb3VudCA+IDIwKSBwcmludF90aWxlcygpOwotI2lmIDAKLWR0bXAgPSBkbm93KCk7Ci0jZWxzZQotZHRtcCA9IDAuMDsKLSNlbmRpZgotCi0JaWYgKG9sZF9jb3B5X3RpbGUpIHsKLQkJdGlsZV9kaWZmcyA9IGNvcHlfYWxsX3RpbGVzKCk7Ci0JfSBlbHNlIHsKLQkJdGlsZV9kaWZmcyA9IGNvcHlfYWxsX3RpbGVfcnVucygpOwotCX0KLQlTQ0FOX0ZBVEFMKHRpbGVfZGlmZnMpOwotCi0jaWYgMAotaWYgKHRpbGVfY291bnQpIGZwcmludGYoc3RkZXJyLCAiWFggY29weXRpbGU6ICUuNGYgIHRpbGVfY291bnQ6ICVkXG4iLCBkbm93KCkgLSBkdG1wLCB0aWxlX2NvdW50KTsKLSNlbmRpZgotCi0JLyoKLQkgKiBUaGlzIGJhY2t3YXJkIHBhc3MgZm9yIHVwd2FyZCBhbmQgbGVmdCB0aWxlcyBjb21wbGVtZW50cyB3aGF0Ci0JICogd2FzIGRvbmUgaW4gY29weV9hbGxfdGlsZXMoKSBmb3IgZG93bndhcmQgYW5kIHJpZ2h0IHRpbGVzLgotCSAqLwotCXRpbGVfZGlmZnMgPSBjb3B5X3RpbGVzX2JhY2t3YXJkX3Bhc3MoKTsKLQlTQ0FOX0ZBVEFMKHRpbGVfZGlmZnMpOwotCi0JaWYgKHRpbGVfZGlmZnMgPiBmcmFjMyAqIG50aWxlcykgewotCQkvKgotCQkgKiB3ZSBzcGVudCBhIGxvdCBvZiB0aW1lIGluIHRob3NlIGNvcHlfdGlsZXMsIHJ1bgotCQkgKiBhbm90aGVyIHNjYW4sIG1heWJlIG1vcmUgb2YgdGhlIHNjcmVlbiBjaGFuZ2VkLgotCQkgKi8KLQkJaW50IGNwID0gKE5TQ0FOIC0gc2Nhbl9jb3VudCArIDEzKSAlIE5TQ0FOOwotCi0JCXNjYW5faW5fcHJvZ3Jlc3MgPSAxOwotCQl0aWxlX2NvdW50ID0gc2Nhbl9kaXNwbGF5KHNjYW5saW5lc1tjcF0sIDEpOwotCQlTQ0FOX0ZBVEFMKHRpbGVfY291bnQpOwotCQlzY2FuX2luX3Byb2dyZXNzID0gMDsKLQotCQl0aWxlX2RpZmZzID0gY29weV90aWxlc19hZGRpdGlvbmFsX3Bhc3MoKTsKLQkJU0NBTl9GQVRBTCh0aWxlX2RpZmZzKTsKLQl9Ci0KLQkvKiBHaXZlbiBlbm91Z2ggdGlsZSBkaWZmcywgdHJ5IHRoZSBpc2xhbmRzOiAqLwotCWlmIChncm93X2ZpbGwgJiYgdGlsZV9kaWZmcyA+IDQpIHsKLQkJdGlsZV9kaWZmcyA9IGdyb3dfaXNsYW5kcygpOwotCX0KLQlTQ0FOX0ZBVEFMKHRpbGVfZGlmZnMpOwotCi0JLyogR2l2ZW4gZW5vdWdoIHRpbGUgZGlmZnMsIHRyeSB0aGUgZ2FwczogKi8KLQlpZiAoZ2Fwc19maWxsICYmIHRpbGVfZGlmZnMgPiA0KSB7Ci0JCXRpbGVfZGlmZnMgPSBmaWxsX3RpbGVfZ2FwcygpOwotCX0KLQlTQ0FOX0ZBVEFMKHRpbGVfZGlmZnMpOwotCi0JZmJfY29weV9pbl9wcm9ncmVzcyA9IDA7Ci0JaWYgKHVzZV90aHJlYWRzICYmIHBvaW50ZXJfbW9kZSAhPSAxKSB7Ci0JCS8qCi0JCSAqIHRlbGwgdGhlIHBvaW50ZXIgaGFuZGxlciBpdCBjYW4gcHJvY2VzcyBhbnkgcXVldWVkCi0JCSAqIHBvaW50ZXIgZXZlbnRzOgotCQkgKi8KLQkJcG9pbnRlcl9ldmVudCgtMSwgMCwgMCwgTlVMTCk7Ci0JfQotCi0JaWYgKGJsYWNrb3V0cykgewotCQkvKiBpZ25vcmUgYW55IGRpZmZzIGluIGNvbXBsZXRlbHkgY292ZXJlZCB0aWxlcyAqLwotCQlpbnQgeCwgeSwgbjsKLQkJZm9yICh5PTA7IHkgPCBudGlsZXNfeTsgeSsrKSB7Ci0JCQlmb3IgKHg9MDsgeCA8IG50aWxlc194OyB4KyspIHsKLQkJCQluID0geCArIHkgKiBudGlsZXNfeDsKLQkJCQlpZiAodGlsZV9ibGFja291dFtuXS5jb3ZlciA9PSAyKSB7Ci0JCQkJCXRpbGVfaGFzX2RpZmZbbl0gPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWhpbnRfdXBkYXRlcygpOwkvKiB1c2UgeDByZmJzZXJ2ZXIgaGludHMgYWxnb3JpdGhtICovCi0KLQkvKiBXb3JrIGFyb3VuZCB0aHJlYWRlZCByZmJQcm9jZXNzQ2xpZW50TWVzc2FnZSgpIGNhbGxzIHRpbWVvdXRzICovCi0JaWYgKHVzZV90aHJlYWRzKSB7Ci0JCXBpbmdfY2xpZW50cyh0aWxlX2RpZmZzKTsKLQl9IGVsc2UgaWYgKHNhd191bHRyYV9jaGF0IHx8IHNhd191bHRyYV9maWxlKSB7Ci0JCXBpbmdfY2xpZW50cygtMSk7Ci0JfSBlbHNlIGlmICh1c2Vfb3BlbnNzbCAmJiAhdGlsZV9kaWZmcykgewotCQlwaW5nX2NsaWVudHMoMCk7Ci0JfQotCS8qIC1waW5nIG9wdGlvbjogKi8KLQlpZiAocGluZ19pbnRlcnZhbCkgewotCQlpbnQgdGQgPSBwaW5nX2ludGVydmFsID4gMCA/IHBpbmdfaW50ZXJ2YWwgOiAtcGluZ19pbnRlcnZhbDsKLQkJcGluZ19jbGllbnRzKC10ZCk7Ci0JfQotCi0KLQluYXBfY2hlY2sodGlsZV9kaWZmcyk7Ci0JcmV0dXJuIHRpbGVfZGlmZnM7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3NjYW4uaCBiL3gxMXZuYy9zY2FuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2YyMTYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3NjYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1NDQU5fSAotI2RlZmluZSBfWDExVk5DX1NDQU5fSAotCi0vKiAtLSBzY2FuLmggLS0gKi8KLQotZXh0ZXJuIGludCBuYXBfb2s7Ci1leHRlcm4gaW50IHNjYW5saW5lc1tdOwotCi1leHRlcm4gdm9pZCBpbml0aWFsaXplX3RpbGVzKHZvaWQpOwotZXh0ZXJuIHZvaWQgZnJlZV90aWxlcyh2b2lkKTsKLWV4dGVybiB2b2lkIHNobV9kZWxldGUoWFNobVNlZ21lbnRJbmZvICpzaG0pOwotZXh0ZXJuIHZvaWQgc2htX2NsZWFuKFhTaG1TZWdtZW50SW5mbyAqc2htLCBYSW1hZ2UgKnhpbSk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3BvbGxpbmdfaW1hZ2VzKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2NhbGVfcmVjdChkb3VibGUgZmFjdG9yX3gsIGRvdWJsZSBmYWN0b3JfeSwgaW50IGJsZW5kLCBpbnQgaW50ZXJwb2xhdGUsIGludCBCcHAsCi0gICAgY2hhciAqc3JjX2ZiLCBpbnQgc3JjX2J5dGVzX3Blcl9saW5lLCBjaGFyICpkc3RfZmIsIGludCBkc3RfYnl0ZXNfcGVyX2xpbmUsCi0gICAgaW50IE54LCBpbnQgTnksIGludCBueCwgaW50IG55LCBpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIsIGludCBtYXJrKTsKLWV4dGVybiB2b2lkIHNjYWxlX2FuZF9tYXJrX3JlY3QoaW50IFgxLCBpbnQgWTEsIGludCBYMiwgaW50IFkyLCBpbnQgbWFyayk7Ci1leHRlcm4gdm9pZCBtYXJrX3JlY3RfYXNfbW9kaWZpZWQoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZm9yY2UpOwotZXh0ZXJuIGludCBjb3B5X3NjcmVlbih2b2lkKTsKLWV4dGVybiBpbnQgY29weV9zbmFwKHZvaWQpOwotZXh0ZXJuIHZvaWQgbmFwX3NsZWVwKGludCBtcywgaW50IHNwbGl0KTsKLWV4dGVybiB2b2lkIHNldF9vZmZzZXQodm9pZCk7Ci1leHRlcm4gaW50IHNjYW5fZm9yX3VwZGF0ZXMoaW50IGNvdW50X29ubHkpOwotZXh0ZXJuIHZvaWQgcm90YXRlX2N1cnMoY2hhciAqZHN0XzAsIGNoYXIgKnNyY18wLCBpbnQgRHgsIGludCBEeSwgaW50IEJwcCk7Ci1leHRlcm4gdm9pZCByb3RhdGVfY29vcmRzKGludCB4LCBpbnQgeSwgaW50ICp4bywgaW50ICp5bywgaW50IGR4aSwgaW50IGR5aSk7Ci1leHRlcm4gdm9pZCByb3RhdGVfY29vcmRzX2ludmVyc2UoaW50IHgsIGludCB5LCBpbnQgKnhvLCBpbnQgKnlvLCBpbnQgZHhpLCBpbnQgZHlpKTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfU0NBTl9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvc2NyZWVuLmMgYi94MTF2bmMvc2NyZWVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODUxZjYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3NjcmVlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcwNSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHNjcmVlbi5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4ZXZlbnRzLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAieGluZXJhbWEuaCIKLSNpbmNsdWRlICJ4ZGFtYWdlLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInVzZXJpbnB1dC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAicmF0ZXMuaCIKLSNpbmNsdWRlICJwb2ludGVyLmgiCi0jaW5jbHVkZSAia2V5Ym9hcmQuaCIKLSNpbmNsdWRlICJjdXJzb3IuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgInNzbGNtZHMuaCIKLSNpbmNsdWRlICJzc2xoZWxwZXIuaCIKLSNpbmNsdWRlICJ2NGwuaCIKLSNpbmNsdWRlICJsaW51eGZiLmgiCi0jaW5jbHVkZSAibWFjb3N4LmgiCi0jaW5jbHVkZSAibWFjb3N4Q0cuaCIKLSNpbmNsdWRlICJhdmFoaS5oIgotI2luY2x1ZGUgInNvbGlkLmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgInhyYW5kci5oIgotI2luY2x1ZGUgInhyZWNvcmQuaCIKLSNpbmNsdWRlICJwbS5oIgotCi0jaW5jbHVkZSA8cmZiL3JmYmNsaWVudC5oPgotCi12b2lkIHNldF9ncmV5c2NhbGVfY29sb3JtYXAodm9pZCk7Ci12b2lkIHNldF9oaTI0MF9jb2xvcm1hcCh2b2lkKTsKLXZvaWQgdW5zZXRfY29sb3JtYXAodm9pZCk7Ci12b2lkIHNldF9jb2xvcm1hcChpbnQgcmVzZXQpOwotdm9pZCBzZXRfbm9mYl9wYXJhbXMoaW50IHJlc3RvcmUpOwotdm9pZCBzZXRfcmF3X2ZiX3BhcmFtcyhpbnQgcmVzdG9yZSk7Ci12b2lkIGRvX25ld19mYihpbnQgcmVzZXRfbWVtKTsKLXZvaWQgZnJlZV9vbGRfZmIodm9pZCk7Ci12b2lkIGNoZWNrX3BhZGRlZF9mYih2b2lkKTsKLXZvaWQgaW5zdGFsbF9wYWRkZWRfZmIoY2hhciAqZ2VvbSk7Ci1YSW1hZ2UgKmluaXRpYWxpemVfeGRpc3BsYXlfZmIodm9pZCk7Ci12b2lkIHBhcnNlX3NjYWxlX3N0cmluZyhjaGFyICpzdHIsIGRvdWJsZSAqZmFjdG9yX3gsIGRvdWJsZSAqZmFjdG9yX3ksIGludCAqc2NhbGluZywgaW50ICpibGVuZCwKLSAgICBpbnQgKm5vbXVsdDQsIGludCAqcGFkLCBpbnQgKmludGVycG9sYXRlLCBpbnQgKm51bWVyLCBpbnQgKmRlbm9tLCBpbnQgd19pbiwgaW50IGhfaW4pOwotaW50IHBhcnNlX3JvdGF0ZV9zdHJpbmcoY2hhciAqc3RyLCBpbnQgKm1vZGUpOwotaW50IHNjYWxlX3JvdW5kKGludCBsZW4sIGRvdWJsZSBmYWMpOwotdm9pZCBpbml0aWFsaXplX3NjcmVlbihpbnQgKmFyZ2MsIGNoYXIgKiphcmd2LCBYSW1hZ2UgKmZiKTsKLXZvaWQgc2V0X3ZuY19kZXNrdG9wX25hbWUodm9pZCk7Ci12b2lkIGFubm91bmNlKGludCBscG9ydCwgaW50IHNzbCwgY2hhciAqaWZhY2UpOwotCi1jaGFyICp2bmNfcmVmbGVjdF9ndWVzcyhjaGFyICpzdHIsIGNoYXIgKipyYXdfZmJfYWRkcik7Ci12b2lkIHZuY19yZWZsZWN0X3Byb2Nlc3NfY2xpZW50KHZvaWQpOwotcmZiQm9vbCB2bmNfcmVmbGVjdF9zZW5kX3BvaW50ZXIoaW50IHgsIGludCB5LCBpbnQgbWFzayk7Ci1yZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfa2V5KHVpbnQzMl90IGtleSwgcmZiQm9vbCBkb3duKTsKLXJmYkJvb2wgdm5jX3JlZmxlY3Rfc2VuZF9jdXR0ZXh0KGNoYXIgKnN0ciwgaW50IGxlbik7Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2NvbG9ybWFwKFhJbWFnZSAqZmIpOwotc3RhdGljIHZvaWQgc2V0X3Zpc3VhbChjaGFyICpzdHIpOwotc3RhdGljIHZvaWQgbm9mYl9ob29rKHJmYkNsaWVudFB0ciBjbCk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfZmFrZV9mYih2b2lkKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfZmFrZV9mYihpbnQgdywgaW50IGgsIGludCBicHApOwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zbmFwX2ZiKHZvaWQpOwotWEltYWdlICppbml0aWFsaXplX3Jhd19mYihpbnQpOwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jbGlwc2hpZnQodm9pZCk7Ci1zdGF0aWMgaW50IHdhaXRfdW50aWxfbWFwcGVkKFdpbmRvdyB3aW4pOwotc3RhdGljIHZvaWQgc2V0dXBfc2NhbGluZyhpbnQgKndpZHRoX2luLCBpbnQgKmhlaWdodF9pbik7Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX2ZpbGV4ZmVyKHZvaWQpOwotc3RhdGljIHZvaWQgcmVjb3JkX2xhc3RfZmJfdXBkYXRlKHZvaWQpOwotc3RhdGljIHZvaWQgY2hlY2tfY3Vyc29yX2NoYW5nZXModm9pZCk7Ci1zdGF0aWMgaW50IGNob29zZV9kZWxheShkb3VibGUgZHQpOwotCi1pbnQgcmF3ZmJfcmVzZXQgPSAtMTsKLWludCByYXdmYl9kZXZfdmlkZW8gPSAwOwotaW50IHJhd2ZiX3ZuY19yZWZsZWN0ID0gMDsKLQotLyoKLSAqIFgxMSBhbmQgcmZiIGRpc3BsYXkvc2NyZWVuIHJlbGF0ZWQgcm91dGluZXMKLSAqLwotCi0vKgotICogU29tZSBoYW5kbGluZyBvZiA4YnBwIFBzZXVkb0NvbG9yIGNvbG9ybWFwcy4gIENhbGxlZCBmb3IgaW5pdGlhbGl6aW5nCi0gKiB0aGUgY2xpZW50cyBhbmQgZHluYW1pY2FsbHkgaWYgLWZsYXNoY21hcCBpcyBzcGVjaWZpZWQuCi0gKi8KLSNkZWZpbmUgTkNPTE9SIDI1NgotCi0vKiB0aGlzIGlzIG9ubHkgZm9yIHJhd2ZiICovCi12b2lkIHNldF9ncmV5c2NhbGVfY29sb3JtYXAodm9pZCkgewotCWludCBpOwotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCS8qIG11dGV4ICovCi0JaWYgKHNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzKSB7Ci0JCWZyZWUoc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMpOwotCQlzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0cyA9IE5VTEw7Ci0JfQotCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJzZXRfZ3JleXNjYWxlX2NvbG9ybWFwOiAlc1xuIiwgcmF3X2ZiX3BpeGZtdCk7Ci0Jc2NyZWVuLT5jb2xvdXJNYXAuY291bnQgPSBOQ09MT1I7Ci0Jc2NyZWVuLT5zZXJ2ZXJGb3JtYXQudHJ1ZUNvbG91ciA9IEZBTFNFOwotCXNjcmVlbi0+Y29sb3VyTWFwLmlzMTYgPSBUUlVFOwotCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzID0gKHVuc2lnbmVkIHNob3J0ICopCi0JCW1hbGxvYygzKnNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiBOQ09MT1IpOwotCi0JZm9yKGkgPSAwOyBpIDwgTkNPTE9SOyBpKyspIHsKLQkJdW5zaWduZWQgc2hvcnQgbHZsID0gaSAqIDI1NjsKLQotCQlzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0c1tpKjMrMF0gPSBsdmw7Ci0JCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzW2kqMysxXSA9IGx2bDsKLQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHNbaSozKzJdID0gbHZsOwotCX0KLQotCXJmYlNldENsaWVudENvbG91ck1hcHMoc2NyZWVuLCAwLCBOQ09MT1IpOwotfQotCi0vKiB0aGlzIGlzIHNwZWNpZmljIHRvIGJ0dHYgcmYgdHVuZXIgY2FyZCAqLwotdm9pZCBzZXRfaGkyNDBfY29sb3JtYXAodm9pZCkgewotCWludCBpOwotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCS8qIG11dGV4ICovCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJzZXRfaGkyNDBfY29sb3JtYXA6ICVzXG4iLCByYXdfZmJfcGl4Zm10KTsKLQlpZiAoc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMpIHsKLQkJZnJlZShzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0cyk7Ci0JCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzID0gTlVMTDsKLQl9Ci0KLQlzY3JlZW4tPmNvbG91ck1hcC5jb3VudCA9IDI1NjsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC50cnVlQ29sb3VyID0gRkFMU0U7Ci0Jc2NyZWVuLT5jb2xvdXJNYXAuaXMxNiA9IFRSVUU7Ci0Jc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMgPSAodW5zaWduZWQgc2hvcnQgKikKLQkJY2FsbG9jKDMqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIDI1NiwgMSk7Ci0KLQlmb3IoaSA9IDA7IGkgPCAyMjU7IGkrKykgewotCQlpbnQgciwgZywgYjsKLQotCQlyID0gKCAoaS81KSAlIDUgKSAqIDI1NS4wIC8gNCArIDAuNTsKLQkJZyA9ICggKGkvMjUpICAgICkgKiAyNTUuMCAvIDggKyAwLjU7Ci0JCWIgPSAoIGkgJSA1ICAgICApICogMjU1LjAgLyA0ICsgMC41OwotCi0JCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzWyhpKzE2KSozKzBdID0gKHVuc2lnbmVkIHNob3J0KSAociAqIDI1Nik7Ci0JCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzWyhpKzE2KSozKzFdID0gKHVuc2lnbmVkIHNob3J0KSAoZyAqIDI1Nik7Ci0JCXNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzWyhpKzE2KSozKzJdID0gKHVuc2lnbmVkIHNob3J0KSAoYiAqIDI1Nik7Ci0JfQotCi0JcmZiU2V0Q2xpZW50Q29sb3VyTWFwcyhzY3JlZW4sIDAsIDI1Nik7Ci19Ci0KLS8qIHRoaXMgaXMgb25seSBmb3IgcmF3ZmIgKi8KLXZvaWQgdW5zZXRfY29sb3JtYXAodm9pZCkgewotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCWlmIChzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0cykgewotCQlmcmVlKHNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzKTsKLQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMgPSBOVUxMOwotCX0KLQlzY3JlZW4tPnNlcnZlckZvcm1hdC50cnVlQ29sb3VyID0gVFJVRTsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgInVuc2V0X2NvbG9ybWFwOiAlc1xuIiwgcmF3X2ZiX3BpeGZtdCk7Ci19Ci0KLS8qIHRoaXMgaXMgWDExIGNhc2UgKi8KLXZvaWQgc2V0X2NvbG9ybWFwKGludCByZXNldCkgewotCi0jaWYgTk9fWDExCi0JaWYgKCFyZXNldCkge30KLQlyZXR1cm47Ci0jZWxzZQotCXN0YXRpYyBpbnQgaW5pdCA9IDE7Ci0Jc3RhdGljIFhDb2xvciAqY29sb3IgPSBOVUxMLCAqcHJldiA9IE5VTEw7Ci0Jc3RhdGljIGludCBuY29sb3IgPSAwOwotCUNvbG9ybWFwIGNtYXA7Ci0JVmlzdWFsICp2aXM7Ci0JaW50IGksIG5jZWxscywgZGlmZnMgPSAwOwotCi0JaWYgKHJlc2V0KSB7Ci0JCWluaXQgPSAxOwotCQluY29sb3IgPSAwOwotCQkvKiBtdXRleCAqLwotCQlpZiAoc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMpIHsKLQkJCWZyZWUoc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMpOwotCQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHMgPSBOVUxMOwotCQl9Ci0JCWlmIChjb2xvcikgewotCQkJZnJlZShjb2xvcik7Ci0JCQljb2xvciA9IE5VTEw7Ci0JCX0KLQkJaWYgKHByZXYpIHsKLQkJCWZyZWUocHJldik7Ci0JCQlwcmV2ID0gTlVMTDsKLQkJfQotCX0KLQotCWlmIChpbml0KSB7Ci0JCWlmIChkZXB0aCA+IDE2KSB7Ci0JCQluY29sb3IgPSBOQ09MT1I7Ci0JCX0gZWxzZSBpZiAoZGVwdGggPiA4KSB7Ci0JCQluY29sb3IgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJbmNvbG9yID0gTkNPTE9SOwotCQl9Ci0JCS8qIG11dGV4ICovCi0JCXNjcmVlbi0+Y29sb3VyTWFwLmNvdW50ID0gbmNvbG9yOwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC50cnVlQ29sb3VyID0gRkFMU0U7Ci0JCXNjcmVlbi0+Y29sb3VyTWFwLmlzMTYgPSBUUlVFOwotCQlzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQotCQkJbWFsbG9jKDMqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIG5jb2xvcik7Ci0JfQotCWlmIChjb2xvciA9PSBOVUxMKSB7Ci0JCWNvbG9yID0gKFhDb2xvciAqKSBjYWxsb2MobmNvbG9yICogc2l6ZW9mKFhDb2xvciksIDEpOwotCQlwcmV2ICA9IChYQ29sb3IgKikgY2FsbG9jKG5jb2xvciAqIHNpemVvZihYQ29sb3IpLCAxKTsKLQl9Ci0KLQlmb3IgKGk9MDsgaSA8IG5jb2xvcjsgaSsrKSB7Ci0JCXByZXZbaV0ucmVkICAgPSBjb2xvcltpXS5yZWQ7Ci0JCXByZXZbaV0uZ3JlZW4gPSBjb2xvcltpXS5ncmVlbjsKLQkJcHJldltpXS5ibHVlICA9IGNvbG9yW2ldLmJsdWU7Ci0JfQotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCVhfTE9DSzsKLQotCWNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoZHB5LCBzY3IpOwotCW5jZWxscyA9IENlbGxzT2ZTY3JlZW4oU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSk7Ci0JdmlzID0gZGVmYXVsdF92aXN1YWw7Ci0KLQlpZiAoc3Vid2luKSB7Ci0JCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0KLQkJaWYgKFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGRweSwgd2luZG93LCAmYXR0cikpIHsKLQkJCWNtYXAgPSBhdHRyLmNvbG9ybWFwOwotCQkJdmlzID0gYXR0ci52aXN1YWw7Ci0JCQluY2VsbHMgPSB2aXMtPm1hcF9lbnRyaWVzOwotCQl9Ci0JfQotCi0JaWYgKG5jZWxscyAhPSBuY29sb3IpIHsKLQkJaWYgKCEgc2hpZnRfY21hcCkgewotCQkJc2NyZWVuLT5jb2xvdXJNYXAuY291bnQgPSBuY2VsbHM7Ci0JCX0KLQl9Ci0JaWYgKGluaXQgJiYgISBxdWlldCkgewotCQlyZmJMb2coInNldF9jb2xvcm1hcDogbnVtYmVyIG9mIGNlbGxzOiAlZCwgIgotCQkgICAgIm5jb2xvciglZCkgaXMgJWQuXG4iLCBuY2VsbHMsIGRlcHRoLCBuY29sb3IpOwotCX0KLQotCWlmIChmbGFzaF9jbWFwICYmICEgaW5pdCkgewotCQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCQlXaW5kb3cgYzsKLQkJaW50IHRyaWVzID0gMDsKLQotCQljID0gd2luZG93OwotCQl3aGlsZSAoYyAmJiB0cmllcysrIDwgMTYpIHsKLQkJCWMgPSBxdWVyeV9wb2ludGVyKGMpOwotCQkJaWYgKHZhbGlkX3dpbmRvdyhjLCAmYXR0ciwgMCkpIHsKLQkJCQlpZiAoYXR0ci5jb2xvcm1hcCAmJiBhdHRyLm1hcF9pbnN0YWxsZWQpIHsKLQkJCQkJY21hcCA9IGF0dHIuY29sb3JtYXA7Ci0JCQkJCXZpcyA9IGF0dHIudmlzdWFsOwotCQkJCQluY2VsbHMgPSB2aXMtPm1hcF9lbnRyaWVzOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmIChuY2VsbHMgPiBuY29sb3IgJiYgISBxdWlldCkgewotCQlyZmJMb2coInNldF9jb2xvcm1hcDogYmlnIHByb2JsZW06IG5jZWxscz0lZCA+ICVkXG4iLAotCQkgICAgbmNlbGxzLCBuY29sb3IpOwotCX0KLQotCWlmICh2aXMtPmNsYXNzID09IFRydWVDb2xvciB8fCB2aXMtPmNsYXNzID09IERpcmVjdENvbG9yKSB7Ci0JCS8qCi0JCSAqIEtsdWRnZSB0byBtYWtlIDhicHAgVHJ1ZUNvbG9yICYgRGlyZWN0Q29sb3IgYmUgbGlrZQotCQkgKiB0aGUgU3RhdGljQ29sb3IgbWFwLiAgVGhlIG5jZWxscyA9IDggaXMgIjggcGVyIHN1YmZpZWxkIgotCQkgKiBtZW50aW9uZWQgaW4geGRweWluZm8uICBMb29rcyBPSy4uLiBwZXJoYXBzIGZvcnR1aXRvdXNseS4KLQkJICovCi0JCWlmIChuY2VsbHMgPT0gOCAmJiAhIHNoaWZ0X2NtYXApIHsKLQkJCW5jZWxscyA9IG5jb2xvcjsKLQkJfQotCX0KLQotCWZvciAoaT0wOyBpIDwgbmNlbGxzOyBpKyspIHsKLQkJY29sb3JbaV0ucGl4ZWwgPSBpOwotCQljb2xvcltpXS5wYWQgPSAwOwotCX0KLQotCVhRdWVyeUNvbG9ycyhkcHksIGNtYXAsIGNvbG9yLCBuY2VsbHMpOwotCi0JWF9VTkxPQ0s7Ci0KLQlmb3IoaSA9IG5jZWxscyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWludCBrID0gaSArIHNoaWZ0X2NtYXA7Ci0KLQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHNbaSozKzBdID0gY29sb3JbaV0ucmVkOwotCQlzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0c1tpKjMrMV0gPSBjb2xvcltpXS5ncmVlbjsKLQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHNbaSozKzJdID0gY29sb3JbaV0uYmx1ZTsKLQotCQlpZiAocHJldltpXS5yZWQgICAhPSBjb2xvcltpXS5yZWQgfHwKLQkJICAgIHByZXZbaV0uZ3JlZW4gIT0gY29sb3JbaV0uZ3JlZW4gfHwgCi0JCSAgICBwcmV2W2ldLmJsdWUgICE9IGNvbG9yW2ldLmJsdWUgKSB7Ci0JCQlkaWZmcysrOwotCQl9Ci0KLQkJaWYgKHNoaWZ0X2NtYXAgJiYgayA+PSAwICYmIGsgPCBuY29sb3IpIHsKLQkJCS8qIGtsdWRnZSB0byBjb3B5IHRoZSBjb2xvcnMgdG8gaGlnaGVyIHBpeGVsIHZhbHVlcyAqLwotCQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHNbayozKzBdID0gY29sb3JbaV0ucmVkOwotCQkJc2NyZWVuLT5jb2xvdXJNYXAuZGF0YS5zaG9ydHNbayozKzFdID0gY29sb3JbaV0uZ3JlZW47Ci0JCQlzY3JlZW4tPmNvbG91ck1hcC5kYXRhLnNob3J0c1trKjMrMl0gPSBjb2xvcltpXS5ibHVlOwotCQl9Ci0JfQotCi0JaWYgKGRpZmZzICYmICEgaW5pdCkgewotCQlpZiAoISBhbGxfY2xpZW50c19pbml0aWFsaXplZCgpKSB7Ci0JCQlyZmJMb2coInNldF9jb2xvcm1hcDogd2FybmluZzogc2VuZGluZyBjbWFwICIKLQkJCSAgICAid2l0aCB1bmluaXRpYWxpemVkIGNsaWVudHMuXG4iKTsKLQkJfQotCQlpZiAoc2hpZnRfY21hcCkgewotCQkJcmZiU2V0Q2xpZW50Q29sb3VyTWFwcyhzY3JlZW4sIDAsIG5jb2xvcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJTZXRDbGllbnRDb2xvdXJNYXBzKHNjcmVlbiwgMCwgbmNlbGxzKTsKLQkJfQotCX0KLQotCWluaXQgPSAwOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgdm9pZCBkZWJ1Z19jb2xvcm1hcChYSW1hZ2UgKmZiKSB7Ci0Jc3RhdGljIGludCBkZWJ1Z19jbWFwID0gLTE7Ci0JaW50IGksIGssICpoaXN0bzsKLQlpbnQgbmNvbG9yOwotCi0JaWYgKGRlYnVnX2NtYXAgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIkRFQlVHX0NNQVAiKSAhPSBOVUxMKSB7Ci0JCQlkZWJ1Z19jbWFwID0gMTsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnX2NtYXAgPSAwOwotCQl9Ci0JfQotCWlmICghIGRlYnVnX2NtYXApIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBmYikgewotCQlyZXR1cm47Ci0JfQotCWlmIChmYi0+Yml0c19wZXJfcGl4ZWwgPiAxNikgewotCQlyZXR1cm47Ci0JfQotCW5jb2xvciA9IHNjcmVlbi0+Y29sb3VyTWFwLmNvdW50OwotCWhpc3RvID0gKGludCAqKSBjYWxsb2MobmNvbG9yICogc2l6ZW9mKGludCksIDEpOwotCi0JZm9yIChpPTA7IGkgPCBuY29sb3I7IGkrKykgewotCQloaXN0b1tpXSA9IDA7Ci0JfQotCWZvciAoayA9IDA7IGsgPCBmYi0+d2lkdGggKiBmYi0+aGVpZ2h0OyBrKyspIHsKLQkJdW5zaWduZWQgY2hhciBuOwotCQljaGFyIGMgPSAqKGZiLT5kYXRhICsgayk7Ci0KLQkJbiA9ICh1bnNpZ25lZCBjaGFyKSBjOwotCQloaXN0b1tuXSsrOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuQ29sb3JtYXAgaGlzdG9ncmFtIGZvciBjdXJyZW50IHNjcmVlbiBjb250ZW50czpcbiIpOwotCWZvciAoaT0wOyBpIDwgbmNvbG9yOyBpKyspIHsKLQkJdW5zaWduZWQgc2hvcnQgciA9IHNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzW2kqMyswXTsKLQkJdW5zaWduZWQgc2hvcnQgZyA9IHNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzW2kqMysxXTsKLQkJdW5zaWduZWQgc2hvcnQgYiA9IHNjcmVlbi0+Y29sb3VyTWFwLmRhdGEuc2hvcnRzW2kqMysyXTsKLQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUwM2Q6ICU3ZCAlMDR4LyUwNHgvJTA0eCIsIGksIGhpc3RvW2ldLAotCQkgICAgciwgZywgYik7Ci0JCWlmICgoaSsxKSAlIDIgPT0gMCkgIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJfQotCX0KLQlmcmVlKGhpc3RvKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLS8qCi0gKiBFeHBlcmltZW50YWwgbW9kZSB0byBmb3JjZSB0aGUgdmlzdWFsIG9mIHRoZSB3aW5kb3cgaW5zdGVhZCBvZiBxdWVyeWluZwotICogaXQuICBVc2VkIGZvciB0ZXN0aW5nLCBvdmVycmlkaW5nIHNvbWUgcmFyZSBjYXNlcyAod2luMnZuYyksIGFuZCBmb3IKLSAqIC1vdmVybGF5IC4gIElucHV0IHN0cmluZyBjYW4gYmUgYSBkZWNpbWFsIG9yIDB4IGhleCBvciBzb21ldGhpbmcgbGlrZQotICogVHJ1ZUNvbG9yIG9yIFRydWVDb2xvcjoyNCB0byBmb3JjZSBhIGRlcHRoIGFzIHdlbGwuCi0gKgotICogdmlzdWFsX2lkIGFuZCBwb3NzaWJseSB2aXN1YWxfZGVwdGggYXJlIHNldC4KLSAqLwotc3RhdGljIHZvaWQgc2V0X3Zpc3VhbChjaGFyICpzdHIpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghc3RyKSB7fQotCXJldHVybjsKLSNlbHNlCi0JaW50IHZpcywgdmRlcHRoLCBkZWZkZXB0aDsKLQlYVmlzdWFsSW5mbyB2aW5mbzsKLQljaGFyICpwLCAqdnN0cmluZyA9IHN0cmR1cChzdHIpOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWRlZmRlcHRoID0gRGVmYXVsdERlcHRoKGRweSwgc2NyKTsKLQl2aXN1YWxfaWQgPSAoVmlzdWFsSUQpIDA7Ci0JdmlzdWFsX2RlcHRoID0gMDsKLQotCWlmICghc3RyY21wKHZzdHJpbmcsICJpZ25vcmUiKSB8fCAhc3RyY21wKHZzdHJpbmcsICJkZWZhdWx0IikKLQkgICAgfHwgIXN0cmNtcCh2c3RyaW5nLCAiIikpIHsKLQkJZnJlZSh2c3RyaW5nKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHNldCB2aXN1YWwgZGVwdGggKi8KLQlpZiAoKHAgPSBzdHJjaHIodnN0cmluZywgJzonKSkgIT0gTlVMTCkgewotCQl2aXN1YWxfZGVwdGggPSBhdG9pKHArMSk7Ci0JCSpwID0gJ1wwJzsKLQkJdmRlcHRoID0gdmlzdWFsX2RlcHRoOwotCX0gZWxzZSB7Ci0JCXZkZXB0aCA9IGRlZmRlcHRoOyAKLQl9Ci0JaWYgKCEgcXVpZXQpIHsKLQkJZnByaW50ZihzdGRlcnIsICJcblZpc3VhbCBJbmZvOlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHNldF92aXN1YWwoXCIlc1wiKVxuIiwgc3RyKTsKLQkJZnByaW50ZihzdGRlcnIsICIgdmlzdWFsX2RlcHRoOiAlZFxuIiwgdmRlcHRoKTsKLQl9Ci0KLQkvKiBzZXQgdmlzdWFsIGlkIG51bWJlciAqLwotCWlmIChzdHJjbXAodnN0cmluZywgIlN0YXRpY0dyYXkiKSA9PSAwKSB7Ci0JCXZpcyA9IFN0YXRpY0dyYXk7Ci0JfSBlbHNlIGlmIChzdHJjbXAodnN0cmluZywgIkdyYXlTY2FsZSIpID09IDApIHsKLQkJdmlzID0gR3JheVNjYWxlOwotCX0gZWxzZSBpZiAoc3RyY21wKHZzdHJpbmcsICJTdGF0aWNDb2xvciIpID09IDApIHsKLQkJdmlzID0gU3RhdGljQ29sb3I7Ci0JfSBlbHNlIGlmIChzdHJjbXAodnN0cmluZywgIlBzZXVkb0NvbG9yIikgPT0gMCkgewotCQl2aXMgPSBQc2V1ZG9Db2xvcjsKLQl9IGVsc2UgaWYgKHN0cmNtcCh2c3RyaW5nLCAiVHJ1ZUNvbG9yIikgPT0gMCkgewotCQl2aXMgPSBUcnVlQ29sb3I7Ci0JfSBlbHNlIGlmIChzdHJjbXAodnN0cmluZywgIkRpcmVjdENvbG9yIikgPT0gMCkgewotCQl2aXMgPSBEaXJlY3RDb2xvcjsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgdl9pbjsKLQkJaWYgKHNzY2FuZih2c3RyaW5nLCAiMHgleCIsICZ2X2luKSAhPSAxKSB7Ci0JCQlpZiAoc3NjYW5mKHZzdHJpbmcsICIldSIsICZ2X2luKSA9PSAxKSB7Ci0JCQkJdmlzdWFsX2lkID0gKFZpc3VhbElEKSB2X2luOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiaW52YWxpZCAtdmlzdWFsIGFyZzogJXNcbiIsIHZzdHJpbmcpOwotCQkJWF9VTkxPQ0s7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXZpc3VhbF9pZCA9IChWaXN1YWxJRCkgdl9pbjsKLQkJZnJlZSh2c3RyaW5nKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHF1aWV0KSBmcHJpbnRmKHN0ZGVyciwgIiB2aXN1YWw6ICVkXG4iLCB2aXMpOwotCWlmIChYTWF0Y2hWaXN1YWxJbmZvKGRweSwgc2NyLCB2aXN1YWxfZGVwdGgsIHZpcywgJnZpbmZvKSkgewotCQk7Ci0JfSBlbHNlIGlmIChYTWF0Y2hWaXN1YWxJbmZvKGRweSwgc2NyLCBkZWZkZXB0aCwgdmlzLCAmdmluZm8pKSB7Ci0JCTsKLQl9IGVsc2UgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygiY291bGQgbm90IGZpbmQgdmlzdWFsOiAlc1xuIiwgdnN0cmluZyk7Ci0JCVhfVU5MT0NLOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQlmcmVlKHZzdHJpbmcpOwotCi0JLyogc2V0IG51bWVyaWNhbCB2aXN1YWwgaWQuICovCi0JdmlzdWFsX2lkID0gdmluZm8udmlzdWFsaWQ7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgc2V0X25vZmJfcGFyYW1zKGludCByZXN0b3JlKSB7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0Jc3RhdGljIGludCBzYXZlWzEwMF07Ci0Jc3RhdGljIGNoYXIgKnNjcm9sbCA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCi0JaWYgKGZpcnN0KSB7Ci0JCWZpcnN0ID0gMDsKLQkJc2F2ZVtpKytdID0gdXNlX3hmaXhlczsKLQkJc2F2ZVtpKytdID0gdXNlX3hkYW1hZ2U7Ci0JCXNhdmVbaSsrXSA9IHVzZV94cmVjb3JkOwotCQlzYXZlW2krK10gPSB3aXJlZnJhbWU7Ci0JCXNhdmVbaSsrXSA9IHVzZV9zb2xpZF9iZzsKLQkJc2F2ZVtpKytdID0gb3ZlcmxheTsKLQkJc2F2ZVtpKytdID0gb3ZlcmxheV9jdXJzb3I7Ci0JCXNhdmVbaSsrXSA9IHVzaW5nX3NobTsKLQkJc2F2ZVtpKytdID0gc2luZ2xlX2NvcHl0aWxlOwotCQlzYXZlW2krK10gPSB0YWtlX25hcHM7Ci0JCXNhdmVbaSsrXSA9IG1lYXN1cmVfc3BlZWRzOwotCQlzYXZlW2krK10gPSBncmFiX2J1c3RlcjsKLQkJc2F2ZVtpKytdID0gc2hvd19jdXJzb3I7Ci0JCXNhdmVbaSsrXSA9IGN1cnNvcl9zaGFwZV91cGRhdGVzOwotCQlzYXZlW2krK10gPSBjdXJzb3JfcG9zX3VwZGF0ZXM7Ci0JCXNhdmVbaSsrXSA9IG5jYWNoZTsKLQotCQlzY3JvbGwgPSBzY3JvbGxfY29weXJlY3Q7Ci0JfQotCWlmIChyZXN0b3JlKSB7Ci0JCWkgPSAwOwotCQl1c2VfeGZpeGVzICAgICAgICAgICAgPSBzYXZlW2krK107Ci0JCXVzZV94ZGFtYWdlICAgICAgICAgICA9IHNhdmVbaSsrXTsKLQkJdXNlX3hyZWNvcmQgICAgICAgICAgID0gc2F2ZVtpKytdOwotCQl3aXJlZnJhbWUgICAgICAgICAgICAgPSBzYXZlW2krK107Ci0JCXVzZV9zb2xpZF9iZyAgICAgICAgICA9IHNhdmVbaSsrXTsKLQkJb3ZlcmxheSAgICAgICAgICAgICAgID0gc2F2ZVtpKytdOwotCQlvdmVybGF5X2N1cnNvciAgICAgICAgPSBzYXZlW2krK107Ci0JCXVzaW5nX3NobSAgICAgICAgICAgICA9IHNhdmVbaSsrXTsKLQkJc2luZ2xlX2NvcHl0aWxlICAgICAgID0gc2F2ZVtpKytdOwotCQl0YWtlX25hcHMgICAgICAgICAgICAgPSBzYXZlW2krK107Ci0JCW1lYXN1cmVfc3BlZWRzICAgICAgICA9IHNhdmVbaSsrXTsKLQkJZ3JhYl9idXN0ZXIgICAgICAgICAgID0gc2F2ZVtpKytdOwotCQlzaG93X2N1cnNvciAgICAgICAgICAgPSBzYXZlW2krK107Ci0JCWN1cnNvcl9zaGFwZV91cGRhdGVzICA9IHNhdmVbaSsrXTsKLQkJY3Vyc29yX3Bvc191cGRhdGVzICAgID0gc2F2ZVtpKytdOwotCQluY2FjaGUgICAgICAgICAgICAgICAgPSBzYXZlW2krK107Ci0KLQkJc2Nyb2xsX2NvcHlyZWN0ID0gc2Nyb2xsOwotCi0JCWlmIChjdXJzb3Jfc2hhcGVfdXBkYXRlcykgewotCQkJcmVzdG9yZV9jdXJzb3Jfc2hhcGVfdXBkYXRlcyhzY3JlZW4pOwotCQl9Ci0JCWluaXRpYWxpemVfY3Vyc29yc19tb2RlKCk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCXVzZV94Zml4ZXMgPSAwOwotCXVzZV94ZGFtYWdlID0gMDsKLQl1c2VfeHJlY29yZCA9IDA7Ci0Jd2lyZWZyYW1lID0gMDsKLQotCXVzZV9zb2xpZF9iZyA9IDA7Ci0Jb3ZlcmxheSA9IDA7Ci0Jb3ZlcmxheV9jdXJzb3IgPSAwOwotCi0JdXNpbmdfc2htID0gMDsKLQlzaW5nbGVfY29weXRpbGUgPSAxOwotCi0JdGFrZV9uYXBzID0gMDsKLQltZWFzdXJlX3NwZWVkcyA9IDA7Ci0KLQkvKiBnb3RfZ3JhYl9idXN0ZXI/ICovCi0JZ3JhYl9idXN0ZXIgPSAwOwotCi0Jc2hvd19jdXJzb3IgPSAwOwotCXNob3dfbXVsdGlwbGVfY3Vyc29ycyA9IDA7Ci0JY3Vyc29yX3NoYXBlX3VwZGF0ZXMgPSAwOwotCWlmICghIGdvdF9jdXJzb3Jwb3MpIHsKLQkJY3Vyc29yX3Bvc191cGRhdGVzID0gMDsKLQl9Ci0KLQluY2FjaGUgPSAwOwotCi0Jc2Nyb2xsX2NvcHlyZWN0ID0gIm5ldmVyIjsKLQotCWlmICghIHF1aWV0KSB7Ci0JCXJmYkxvZygiZGlzYWJsaW5nOiB4Zml4ZXMsIHhkYW1hZ2UsIHNvbGlkLCBvdmVybGF5LCBzaG0sXG4iKTsKLQkJcmZiTG9nKCIgIHdpcmVmcmFtZSwgc2Nyb2xsY29weXJlY3QsIG5jYWNoZSxcbiIpOwotCQlyZmJMb2coIiAgbm9vbmV0aWxlLCBuYXAsIGN1cnNvciwgJXNjdXJzb3JzaGFwZVxuIiwKLQkJICAgIGdvdF9jdXJzb3Jwb3MgPyAiIiA6ICJjdXJzb3Jwb3MsICIgKTsKLQkJcmZiTG9nKCIgIGluIC1ub2ZiIG1vZGUuXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICpyYXdfZmJfb3JpZ19kcHkgPSBOVUxMOwotCi12b2lkIHNldF9yYXdfZmJfcGFyYW1zKGludCByZXN0b3JlKSB7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0Jc3RhdGljIGludCB2bzAsIHVzMCwgc20wLCB3czAsIHdwMCwgd2MwLCB3YjAsIG5hMCwgdG4wOyAgCi0Jc3RhdGljIGludCB4cjAsIHhybTAsIHNiMCwgcmUwOwotCXN0YXRpYyBjaGFyICptYzA7Ci0KLQkvKgotCSAqIHNldCB0dXJuIG9mZiBhIGJ1bmNoIG9mIHBhcmFtZXRlcnMgbm90IGNvbXBhdGlibGUgd2l0aCAKLQkgKiAtcmF3ZmIgbW9kZTogMSkgaWdub3JpbmcgdGhlIFggc2VydmVyIDIpIGlnbm9yaW5nIHVzZXIgaW5wdXQuIAotCSAqLwotCQotCWlmIChmaXJzdCkgewotCQkvKiBhdCBsZWFzdCBzYXZlIHRoZSBpbml0aWFsIHNldHRpbmdzLi4uICovCi0JCXZvMCA9IHZpZXdfb25seTsKLQkJd3MwID0gd2F0Y2hfc2VsZWN0aW9uOwotCQl3cDAgPSB3YXRjaF9wcmltYXJ5OwotCQl3YzAgPSB3YXRjaF9jbGlwYm9hcmQ7Ci0JCXdiMCA9IHdhdGNoX2JlbGw7Ci0JCW5hMCA9IG5vX2F1dG9yZXBlYXQ7Ci0JCXNiMCA9IHVzZV9zb2xpZF9iZzsKLQotCQl1czAgPSB1c2Vfc25hcGZiOwotCQlzbTAgPSB1c2luZ19zaG07Ci0JCXRuMCA9IHRha2VfbmFwczsKLQkJeHIwID0geHJhbmRyOwotCQl4cm0wID0geHJhbmRyX21heWJlOwotCQlyZTAgPSBub3hyZWNvcmQ7Ci0JCW1jMCA9IG11bHRpcGxlX2N1cnNvcnNfbW9kZTsKLQotCQlmaXJzdCA9IDA7Ci0JfQotCi0JaWYgKHJlc3RvcmUpIHsKLQkJdmlld19vbmx5ID0gdm8wOwotCQl3YXRjaF9zZWxlY3Rpb24gPSB3czA7Ci0JCXdhdGNoX3ByaW1hcnkgPSB3cDA7Ci0JCXdhdGNoX2NsaXBib2FyZCA9IHdjMDsKLQkJd2F0Y2hfYmVsbCA9IHdiMDsKLQkJbm9fYXV0b3JlcGVhdCA9IG5hMDsKLQkJdXNlX3NvbGlkX2JnID0gc2IwOwotCi0JCXVzZV9zbmFwZmIgPSB1czA7Ci0JCXVzaW5nX3NobSA9IHNtMDsKLQkJdGFrZV9uYXBzID0gdG4wOwotCQl4cmFuZHIgPSB4cjA7Ci0JCXhyYW5kcl9tYXliZSA9IHhybTA7Ci0JCW5veHJlY29yZCA9IHJlMDsKLQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gbWMwOwotCi0JCWlmICghIGRweSAmJiByYXdfZmJfb3JpZ19kcHkpIHsKLQkJCWRweSA9IFhPcGVuRGlzcGxheV93cihyYXdfZmJfb3JpZ19kcHkpOwotCQkJbGFzdF9vcGVuX3hkaXNwbGF5ID0gdGltZShOVUxMKTsKLQkJCWlmIChkcHkpIHsKLQkJCQlpZiAoISBxdWlldCkgcmZiTG9nKCJyZW9wZW5lZCBESVNQTEFZOiAlc1xuIiwKLQkJCQkgICAgcmF3X2ZiX29yaWdfZHB5KTsKLQkJCQlzY3IgPSBEZWZhdWx0U2NyZWVuKGRweSk7Ci0JCQkJcm9vdHdpbiA9IFJvb3RXaW5kb3coZHB5LCBzY3IpOwotCQkJCWNoZWNrX3hldmVudHMoMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghIHF1aWV0KSByZmJMb2coIldBUk5JTkc6IGZhaWxlZCB0byByZW9wZW4gIgotCQkJCSAgICAiRElTUExBWTogJXNcbiIsIHJhd19mYl9vcmlnX2RweSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmICh2ZXJib3NlKSB7Ci0JCXJmYkxvZygic2V0X3Jhd19mYl9wYXJhbXM6IG1vZGlmeWluZyBzZXR0aW5ncyBmb3IgIgotCQkgICAgIi1yYXdmYiBtb2RlLlxuIik7Ci0JfQotCi0JaWYgKGdvdF9ub3ZpZXdvbmx5KSB7Ci0JCS8qCi0JCSAqIFRoZSB1c2VyIGlucHV0IHBhcmFtZXRlcnMgYXJlIG5vdCB1bnNldCB1bmRlcgotCQkgKiAtbm92aWV3b25seS4uLiB0aGlzIHVzYWdlIHNob3VsZCBiZSB2ZXJ5IHJhcmUKLQkJICogKGkuZS4gcmF3ZmIgYnV0IGFsc28gc2VuZCB1c2VyIGlucHV0IHRvIHRoZSBYCi0JCSAqIGRpc3BsYXksIG1vc3QgbGlrZWx5IHVzaW5nIC9kZXYvZmIwIGZvciBzb21lIHJlYXNvbi4uLikKLQkJICovCi0JCWlmICh2ZXJib3NlKSB7Ci0JCSAgIHJmYkxvZygicmF3ZmI6IC1ub3ZpZXdvbmx5IG1vZGU6IHN0aWxsIHNlbmRpbmcgbW91c2UgYW5kXG4iKTsKLQkJICAgcmZiTG9nKCJyYXdmYjogICBrZXlib2FyZCBpbnB1dCB0byB0aGUgWCBESVNQTEFZISFcbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTm9ybWFsIGNhc2U6ICovCi0jaWYgMAotCQlpZiAoISB2aWV3X29ubHkgJiYgISBwaXBlaW5wdXRfc3RyKSB7Ci0JCQlpZiAoISBxdWlldCkgcmZiTG9nKCIgIHJhd2ZiOiBzZXR0aW5nIHZpZXdfb25seVxuIik7Ci0JCQl2aWV3X29ubHkgPSAxOwotCQl9Ci0jZW5kaWYKLQkJaWYgKHJhd19mYl9zdHIgJiYgc3Ryc3RyKHJhd19mYl9zdHIsICJ2bmMiKSA9PSByYXdfZmJfc3RyKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAod2F0Y2hfc2VsZWN0aW9uKSB7Ci0JCQlpZiAodmVyYm9zZSkgcmZiTG9nKCIgIHJhd2ZiOiB0dXJuaW5nIG9mZiAiCi0JCQkgICAgIndhdGNoX3NlbGVjdGlvblxuIik7Ci0JCQl3YXRjaF9zZWxlY3Rpb24gPSAwOwotCQl9Ci0JCWlmICh3YXRjaF9wcmltYXJ5KSB7Ci0JCQlpZiAodmVyYm9zZSkgcmZiTG9nKCIgIHJhd2ZiOiB0dXJuaW5nIG9mZiAiCi0JCQkgICAgIndhdGNoX3ByaW1hcnlcbiIpOwotCQkJd2F0Y2hfcHJpbWFyeSA9IDA7Ci0JCX0KLQkJaWYgKHdhdGNoX2NsaXBib2FyZCkgewotCQkJaWYgKHZlcmJvc2UpIHJmYkxvZygiICByYXdmYjogdHVybmluZyBvZmYgIgotCQkJICAgICJ3YXRjaF9jbGlwYm9hcmRcbiIpOwotCQkJd2F0Y2hfY2xpcGJvYXJkID0gMDsKLQkJfQotCQlpZiAod2F0Y2hfYmVsbCkgewotCQkJaWYgKHZlcmJvc2UpIHJmYkxvZygiICByYXdmYjogdHVybmluZyBvZmYgd2F0Y2hfYmVsbFxuIik7Ci0JCQl3YXRjaF9iZWxsID0gMDsKLQkJfQotCQlpZiAobm9fYXV0b3JlcGVhdCkgewotCQkJaWYgKHZlcmJvc2UpIHJmYkxvZygiICByYXdmYjogdHVybmluZyBvZmYgIgotCQkJICAgICJub19hdXRvcmVwZWF0XG4iKTsKLQkJCW5vX2F1dG9yZXBlYXQgPSAwOwotCQl9Ci0JCWlmICh1c2Vfc29saWRfYmcpIHsKLQkJCWlmICh2ZXJib3NlKSByZmJMb2coIiAgcmF3ZmI6IHR1cm5pbmcgb2ZmICIKLQkJCSAgICAidXNlX3NvbGlkX2JnXG4iKTsKLQkJCXVzZV9zb2xpZF9iZyA9IDA7Ci0JCX0KLSNpZm5kZWYgTUFDT1NYCi0JCWlmIChyYXdfZmJfc3RyICYmIHN0cnN0cihyYXdfZmJfc3RyLCAidm5jIikgPT0gcmF3X2ZiX3N0cikgewotCQkJOwotCQl9IGVsc2UgewotCQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKCJhcnJvdyIpOwotCQl9Ci0jZW5kaWYKLQl9Ci0JaWYgKHVzaW5nX3NobSkgewotCQlpZiAodmVyYm9zZSkgcmZiTG9nKCIgIHJhd2ZiOiB0dXJuaW5nIG9mZiB1c2luZ19zaG1cbiIpOwotCQl1c2luZ19zaG0gPSAwOwotCX0KLQlpZiAodGFrZV9uYXBzKSB7Ci0JCWlmICh2ZXJib3NlKSByZmJMb2coIiAgcmF3ZmI6IHR1cm5pbmcgb2ZmIHRha2VfbmFwc1xuIik7Ci0JCXRha2VfbmFwcyA9IDA7Ci0JfQotCWlmICh4cmFuZHIpIHsKLQkJaWYgKHZlcmJvc2UpIHJmYkxvZygiICByYXdmYjogdHVybmluZyBvZmYgeHJhbmRyXG4iKTsKLQkJeHJhbmRyID0gMDsKLQl9Ci0JaWYgKHhyYW5kcl9tYXliZSkgewotCQlpZiAodmVyYm9zZSkgcmZiTG9nKCIgIHJhd2ZiOiB0dXJuaW5nIG9mZiB4cmFuZHJfbWF5YmVcbiIpOwotCQl4cmFuZHJfbWF5YmUgPSAwOwotCX0KLQlpZiAoISBub3hyZWNvcmQpIHsKLQkJaWYgKHZlcmJvc2UpIHJmYkxvZygiICByYXdmYjogdHVybmluZyBvZmYgeHJlY29yZFxuIik7Ci0JCW5veHJlY29yZCA9IDE7Ci0JfQotfQotCi0vKgotICogUHJlc3VtYWJseSB1bmRlciAtbm9mYiB0aGUgY2xpZW50cyB3aWxsIG5ldmVyIHJlcXVlc3QgdGhlIGZyYW1lYnVmZmVyLgotICogSG93ZXZlciwgd2UgaGF2ZSBnb3R0ZW4gc3VjaCBhIHJlcXVlc3QuLi4gc28gbGV0J3MganVzdCBnaXZlIHRoZW0KLSAqIHRoZSBjdXJyZW50IHZpZXcgb24gdGhlIGRpc3BsYXkuICBuLmIuIHgydm5jIGFuZCBwZXJoYXBzIHdpbjJ2bmMKLSAqIHJlcXVlc3RzIGEgMXgxIHBpeGVsIGZvciBzb21lIHdvcmthcm91bmQgc28gc2FkbHkgdGhpcyBldmlkZW50bHkKLSAqIG5lYXJseSBhbHdheXMgaGFwcGVucy4KLSAqLwotc3RhdGljIHZvaWQgbm9mYl9ob29rKHJmYkNsaWVudFB0ciBjbCkgewotCVhJbWFnZSAqZmI7Ci0JWEltYWdlIHJhdzsKLQotCXJmYkxvZygiZnJhbWVidWZmZXIgcmVxdWVzdGVkIGluIC1ub2ZiIG1vZGUgYnkgY2xpZW50ICVzXG4iLCBjbC0+aG9zdCk7Ci0JLyogaWdub3JlIHhyYW5kciAqLwotCi0JaWYgKHJhd19mYiAmJiAhIGRweSkgewotCQlmYiA9ICZyYXc7Ci0JCWZiLT5kYXRhID0gKGNoYXIgKiltYWxsb2MoMzIpOwotCX0gZWxzZSB7Ci0JCWludCB1c2VfcmVhbF94aW1hZ2UgPSAwOwotCQlpZiAodXNlX3JlYWxfeGltYWdlKSB7Ci0JCQlmYiA9IFhHZXRJbWFnZV93cihkcHksIHdpbmRvdywgMCwgMCwgZHB5X3gsIGRweV95LCBBbGxQbGFuZXMsIFpQaXhtYXApOwotCQl9IGVsc2UgewotCQkJZmIgPSAmcmF3OwotCQkJZmItPmRhdGEgPSAoY2hhciAqKSBjYWxsb2MoZHB5X3gqZHB5X3kqYnBwLzgsIDEpOwotCQl9Ci0JfQotCW1haW5fZmIgPSBmYi0+ZGF0YTsKLQlyZmJfZmIgPSBtYWluX2ZiOwotCS8qIG11dGV4ICovCi0Jc2NyZWVuLT5mcmFtZUJ1ZmZlciA9IHJmYl9mYjsKLQlzY3JlZW4tPmRpc3BsYXlIb29rID0gTlVMTDsKLX0KLQotdm9pZCBmcmVlX29sZF9mYih2b2lkKSB7Ci0JY2hhciAqZmJzWzE2XTsKLQlpbnQgaSwgaiwgbmZiID0gMCwgZGIgPSAwOyAKLQotCWZic1tuZmIrK10gPSBtYWluX2ZiOwkJbWFpbl9mYiA9IE5VTEw7Ci0JZmJzW25mYisrXSA9IHJmYl9mYjsJCXJmYl9mYiA9IE5VTEw7Ci0JZmJzW25mYisrXSA9IGNtYXA4dG8yNF9mYjsJY21hcDh0bzI0X2ZiID0gTlVMTDsKLQlmYnNbbmZiKytdID0gc25hcF9mYjsJCXNuYXBfZmIgPSBOVUxMOwotCWZic1tuZmIrK10gPSByb3RfZmI7CQlyb3RfZmIgPSBOVUxMOwotCWZic1tuZmIrK10gPSByYXdfZmI7CQlyYXdfZmIgPSBOVUxMOwotCi0JZm9yIChpPTA7IGkgPCBuZmI7IGkrKykgewotCQljaGFyICpmYiA9IGZic1tpXTsKLQkJaW50IGZyZWVpdCA9IDE7Ci0JCWlmICghIGZiIHx8IGZiIDwgKGNoYXIgKikgMHgxMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJZm9yIChqPTA7IGogPCBpOyBqKyspIHsKLQkJCWlmIChmYiA9PSBmYnNbal0pIHsKLQkJCQlmcmVlaXQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChmcmVlaXQpIHsKLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJmcmVlOiAlaSAlcFxuIiwgaSwgZmIpOwotCQkJZnJlZShmYik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic2tpcDogJWkgJXBcbiIsIGksIGZiKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGNoYXIgX2xjc190bXBbMTI4XTsKLXN0YXRpYyBpbnQgX2J5dGVzMF9zaXplID0gMTI4LCBfYnl0ZXMwWzEyOF07Ci0KLXN0YXRpYyBjaGFyICpsY3MocmZiQ2xpZW50UHRyIGNsKSB7Ci0Jc3ByaW50ZihfbGNzX3RtcCwgIiVkLyVkLyVkLyVkLyVkLSVkLyVkLyVkIiwKLQkJISEoY2wtPm5ld0ZCU2l6ZVBlbmRpbmcpLAotCQkhIShjbC0+Y3Vyc29yV2FzQ2hhbmdlZCksCi0JCSEhKGNsLT5jdXJzb3JXYXNNb3ZlZCksCi0JCSEhKGNsLT5yZXZlcnNlQ29ubmVjdGlvbiksCi0JCWNsLT5zdGF0ZSwKLQkJY2wtPm1vZGlmaWVkUmVnaW9uICA/ICEhKHNyYVJnbkVtcHR5KGNsLT5tb2RpZmllZFJlZ2lvbikpICA6IDIsCi0JCWNsLT5yZXF1ZXN0ZWRSZWdpb24gPyAhIShzcmFSZ25FbXB0eShjbC0+cmVxdWVzdGVkUmVnaW9uKSkgOiAyLAotCQljbC0+Y29weVJlZ2lvbiAgICAgID8gISEoc3JhUmduRW1wdHkoY2wtPmNvcHlSZWdpb24pKSAgICAgIDogMgotCSk7Ci0JcmV0dXJuIF9sY3NfdG1wOwotfQotCi1zdGF0aWMgaW50IGxvY2tfY2xpZW50X3NlbmRzKGludCBsb2NrKSB7Ci0Jc3RhdGljIHJmYkNsaWVudFB0ciAqY2xzID0gTlVMTDsKLQlzdGF0aWMgaW50IGNsc19sZW4gPSAwOwotCXN0YXRpYyBpbnQgYmxvY2tlZCA9IDA7Ci0Jc3RhdGljIGludCBzdGF0ZSA9IDA7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JY2hhciAqczsKLQotCWlmICghdXNlX3RocmVhZHMgfHwgIXNjcmVlbikgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGxvY2sgPCAwKSB7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0Jc3RhdGUgPSBsb2NrOwotCi0JaWYgKGxvY2spIHsKLQkJaWYgKGNsc19sZW4gPCBjbGllbnRfY291bnQgKyAxMjgpIHsKLQkJCWlmIChjbHMgIT0gTlVMTCkgewotCQkJCWZyZWUoY2xzKTsKLQkJCX0KLQkJCWNsc19sZW4gPSBjbGllbnRfY291bnQgKyAyNTY7Ci0JCQljbHMgPSAocmZiQ2xpZW50UHRyICopIGNhbGxvYyhjbHNfbGVuICogc2l6ZW9mKHJmYkNsaWVudFB0ciksIDEpOwotCQl9Ci0JCQotCQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQkJYmxvY2tlZCA9IDA7Ci0JCXdoaWxlICgoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICE9IE5VTEwpIHsKLQkJCXMgPSBsY3MoY2wpOwotCQkJU0VORF9MT0NLKGNsKTsKLQkJCXJmYkxvZygibG9ja2VkIGNsaWVudDogICAlcCAgJS42ZiAlc1xuIiwgY2wsIGRub3d4KCksIHMpOwotCQkJY2xzW2Jsb2NrZWQrK10gPSBjbDsKLQkJfQotCQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaXRlcik7Ci0JfSBlbHNlIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpIDwgYmxvY2tlZDsgaSsrKSB7Ci0JCQljbCA9IGNsc1tpXTsKLQkJCWlmIChjbCAhPSBOVUxMKSB7Ci0JCQkJcyA9IGxjcyhjbCk7Ci0JCQkJU0VORF9VTkxPQ0soY2wpCi0JCQkJcmZiTG9nKCJ1bmxvY2tlZCBjbGllbnQ6ICVwICAlLjZmICVzXG4iLCBjbCwgZG5vd3goKSwgcyk7Ci0JCQl9Ci0JCQljbHNbaV0gPSBOVUxMOwotCQl9Ci0JCWJsb2NrZWQgPSAwOwotCX0KLQlyZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHRsZV9jbGllbnRzKGludCBpbml0KSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGZiX3BlbmQsIGksIG1zID0gMTAwMDsKLQljaGFyICpzOwotCi0JaWYgKCF1c2VfdGhyZWFkcyB8fCAhc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW5pdCkgewotCQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQkJaSA9IDA7Ci0JCXdoaWxlICgoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICE9IE5VTEwpIHsKLQkJCWlmIChpIDwgX2J5dGVzMF9zaXplKSB7Ci0JCQkJX2J5dGVzMFtpXSA9IHJmYlN0YXRHZXRTZW50Qnl0ZXNJZlJhdyhjbCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JCWlmIChnZXRlbnYoIlgxMVZOQ19USFJFQURTX05FV19GQl9TTEVFUCIpKSB7Ci0JCQltcyA9IGF0b2koZ2V0ZW52KCJYMTFWTkNfVEhSRUFEU19ORVdfRkJfU0xFRVAiKSk7Ci0JCX0gZWxzZSBpZiAoc3Vid2luKSB7Ci0JCQltcyA9IDI1MDsKLQkJfSBlbHNlIHsKLQkJCW1zID0gNTAwOwotCQl9Ci0JCXVzbGVlcChtcyAqIDEwMDApOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGdldGVudigiWDExVk5DX1RIUkVBRFNfTkVXX0ZCX1NMRUVQIikpIHsKLQkJbXMgPSBhdG9pKGdldGVudigiWDExVk5DX1RIUkVBRFNfTkVXX0ZCX1NMRUVQIikpOwotCX0gZWxzZSBpZiAoc3Vid2luKSB7Ci0JCW1zID0gNTAwOwotCX0gZWxzZSB7Ci0JCW1zID0gMTAwMDsKLQl9Ci0JdXNsZWVwKG1zICogMTAwMCk7Ci0KLQlmb3IgKGk9MDsgaSA8IDU7IGkrKykgewotCQlmYl9wZW5kID0gMDsKLQkJaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0JCXdoaWxlICgoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICE9IE5VTEwpIHsKLQkJCXMgPSBsY3MoY2wpOwotCQkJaWYgKGNsLT5uZXdGQlNpemVQZW5kaW5nKSB7Ci0JCQkJZmJfcGVuZCsrOwotCQkJCXJmYkxvZygicGVuZGluZyBmYiBzaXplOiAlcCAgJS42ZiAlc1xuIiwgY2wsIGRub3d4KCksIHMpOwotCQkJfQotCQl9Ci0JCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLQkJaWYgKGZiX3BlbmQgPiAwKSB7Ci0JCQlyZmJMb2coImRvX25ld19mYjogbmV3RkJTaXplUGVuZGluZyBleHRyYSAtdGhyZWFkcyBzbGVlcCAoJWQpXG4iLCBpKzEpOyAKLQkJCXVzbGVlcChtcyAqIDEwMDApOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZm9yIChpPTA7IGkgPCA1OyBpKyspIHsKLQkJaW50IHN0dWNrID0gMCwgdG90ID0gMCwgaiA9IDA7Ci0JCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCQl3aGlsZSAoKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoaiA8IF9ieXRlczBfc2l6ZSkgewotCQkJCWludCBkYiA9IHJmYlN0YXRHZXRTZW50Qnl0ZXNJZlJhdyhjbCkgLSBfYnl0ZXMwW2pdOwotCQkJCWludCBCcHAgPSBjbC0+Zm9ybWF0LmJpdHNQZXJQaXhlbCAvIDg7Ci0KLQkJCQlzID0gbGNzKGNsKTsKLQkJCQlyZmJMb2coImFkZGwgYnl0ZXMgc2VudDogJXAgICUuNmYgJXMgICVkICAlZFxuIiwKLQkJCQkgICAgY2wsIGRub3d4KCksIHMsIGRiLCBfYnl0ZXMwW2pdKTsKLQotCQkJCWlmIChpPT0wKSB7Ci0JCQkJCWlmIChkYiA8IEJwcCAqIGRweV94ICogZHB5X3kpIHsKLQkJCQkJCXN0dWNrKys7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGk9PTEpIHsKLQkJCQkJaWYgKGRiIDwgMC41ICogQnBwICogZHB5X3ggKiBkcHlfeSkgewotCQkJCQkJc3R1Y2srKzsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkYiA8PSAwKSB7Ci0JCQkJCQlzdHVjaysrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdG90Kys7Ci0JCQlqKys7Ci0JCX0KLQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCQlpZiAoc3R1Y2sgPiAwKSB7Ci0JCQlyZmJMb2coImNsaWVudHMgc3R1Y2s6ICAlZC8lZCAgc2xlZXAoJWQpXG4iLCBzdHVjaywgdG90LCBpKTsKLQkJCXVzbGVlcCgyICogbXMgKiAxMDAwKTsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBwcmVwX2NsaWVudHNfZm9yX25ld19mYih2b2lkKSB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0KLQlpZiAoIXVzZV90aHJlYWRzIHx8ICFzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSAoKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSAhPSBOVUxMKSB7Ci0JCWlmICghY2wtPm5ld0ZCU2l6ZVBlbmRpbmcpIHsKLQkJCXJmYkxvZygiKiogc2V0X25ld19mYl9zaXplX3BlbmRpbmcgY2xpZW50OiAgICVwXG4iLCBjbCk7Ci0JCQljbC0+bmV3RkJTaXplUGVuZGluZyA9IFRSVUU7Ci0JCX0KLQkJY2wtPmN1cnNvcldhc0NoYW5nZWQgPSBGQUxTRTsKLQkJY2wtPmN1cnNvcldhc01vdmVkID0gRkFMU0U7Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpdGVyKTsKLX0KLQotdm9pZCBkb19uZXdfZmIoaW50IHJlc2V0X21lbSkgewotCVhJbWFnZSAqZmI7Ci0KLQkvKiBmb3IgdGhyZWFkZWQgd2UgcmVhbGx5IHNob3VsZCBsb2NrIGxpYnZuY3NlcnZlciBvdXQuICovCi0JaWYgKHVzZV90aHJlYWRzKSB7Ci0JCWludCBtcyA9IDEwMDA7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19USFJFQURTX05FV19GQl9TTEVFUCIpKSB7Ci0JCQltcyA9IGF0b2koZ2V0ZW52KCJYMTFWTkNfVEhSRUFEU19ORVdfRkJfU0xFRVAiKSk7Ci0JCX0gZWxzZSBpZiAoc3Vid2luKSB7Ci0JCQltcyA9IDUwMDsKLQkJfSBlbHNlIHsKLQkJCW1zID0gMTAwMDsKLQkJfQotCQlyZmJMb2coIldhcm5pbmc6IGNoYW5naW5nIGZyYW1lYnVmZmVycyBpbiB0aHJlYWRlZCBtb2RlIG1heSBiZSB1bnN0YWJsZS5cbiIpOwotCQl0aHJlYWRzX2Ryb3BfaW5wdXQgPSAxOwotCQl1c2xlZXAobXMgKiAxMDAwKTsKLQl9Ci0KLQlJTlBVVF9MT0NLOwotCWxvY2tfY2xpZW50X3NlbmRzKDEpOwotCi0JaWYgKHVzZV90aHJlYWRzKSB7Ci0JCXNldHRsZV9jbGllbnRzKDEpOwotCX0KLQotI2lmZGVmIE1BQ09TWAotCWlmIChtYWNvc3hfY29uc29sZSkgewotCQltYWNvc3hDR19maW5pKCk7Ci0JfQotI2VuZGlmCi0JaWYgKHJlc2V0X21lbSA9PSAxKSB7Ci0JCS8qIHJlc2V0X21lbSA9PSAyIGlzIGEgaGFjayBmb3IgY2hhbmdpbmcgdXNlcnMuLi4gKi8KLQkJY2xlYW5fc2htKDApOwotCQlmcmVlX3RpbGVzKCk7Ci0JfQotCi0JZnJlZV9vbGRfZmIoKTsKLQotCWZiID0gaW5pdGlhbGl6ZV94ZGlzcGxheV9mYigpOwotCi0JaW5pdGlhbGl6ZV9zY3JlZW4oTlVMTCwgTlVMTCwgZmIpOwotCi0JaWYgKHJlc2V0X21lbSkgewotCQlpbml0aWFsaXplX3RpbGVzKCk7Ci0JCWluaXRpYWxpemVfYmxhY2tvdXRzX2FuZF94aW5lcmFtYSgpOwotCQlpbml0aWFsaXplX3BvbGxpbmdfaW1hZ2VzKCk7Ci0JfQotCWlmIChuY2FjaGUpIHsKLQkJY2hlY2tfbmNhY2hlKDEsIDApOwotCX0KLQotCXByZXBfY2xpZW50c19mb3JfbmV3X2ZiKCk7Ci0JbG9ja19jbGllbnRfc2VuZHMoMCk7Ci0JSU5QVVRfVU5MT0NLOwotCi0JaWYgKHVzZV90aHJlYWRzKSB7Ci0JCS8qIG5lZWQgdG8gbGV0IHRoaW5ncyBzZXR0bGUuLi4gKi8KLQkJc2V0dGxlX2NsaWVudHMoMCk7Ci0JCXRocmVhZHNfZHJvcF9pbnB1dCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfZmFrZV9mYih2b2lkKSB7Ci0JaWYgKCEgc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JcmZiTG9nKCJyZW1vdmluZyBmYWtlIGZiOiAweCV4XG4iLCBmYWtlX2ZiKTsKLQotCWRvX25ld19mYigxKTsKLQotCS8qCi0JICogZmFrZV9mYiBpcyBmcmVlZCBpbiBkb19uZXdfZmIoKSwgYnV0IHdlIHNldCB0byBOVUxMIGhlcmUgdG8KLQkgKiBpbmRpY2F0ZSBpdCBpcyBnb25lLgotCSAqLwotCWZha2VfZmIgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCByZmJfbmV3X2ZyYW1lYnVmZmVyKHJmYlNjcmVlbkluZm9QdHIgcmZiU2NyZWVuLCBjaGFyICpmcmFtZWJ1ZmZlciwKLSAgICBpbnQgd2lkdGgsaW50IGhlaWdodCwgaW50IGJpdHNQZXJTYW1wbGUsaW50IHNhbXBsZXNQZXJQaXhlbCwKLSAgICBpbnQgYnl0ZXNQZXJQaXhlbCkgewotCi0JcmZiTmV3RnJhbWVidWZmZXIocmZiU2NyZWVuLCBmcmFtZWJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgYml0c1BlclNhbXBsZSwKLQkgICAgc2FtcGxlc1BlclBpeGVsLCBieXRlc1BlclBpeGVsKTsKLQotfQotCi1zdGF0aWMgdm9pZCBpbnN0YWxsX2Zha2VfZmIoaW50IHcsIGludCBoLCBpbnQgYnBwKSB7Ci0JaW50IGJwYzsKLQlpZiAoISBzY3JlZW4pIHsKLQkJcmV0dXJuOwotCX0KLQlsb2NrX2NsaWVudF9zZW5kcygxKTsKLQlpZiAoZmFrZV9mYikgewotCQlmcmVlKGZha2VfZmIpOwotCX0KLQlmYWtlX2ZiID0gKGNoYXIgKikgY2FsbG9jKHcqaCpicHAvOCwgMSk7Ci0JaWYgKCEgZmFrZV9mYikgewotCQlyZmJMb2coImNvdWxkIG5vdCBjcmVhdGUgZmFrZSBmYjogJWR4JWQgJWRcbiIsIHcsIGgsIGJwcCk7Ci0JCWxvY2tfY2xpZW50X3NlbmRzKDApOwotCQlyZXR1cm47Ci0JfQotCWJwYyA9IGd1ZXNzX2JpdHNfcGVyX2NvbG9yKGJwcCk7Ci0JcmZiTG9nKCJpbnN0YWxsaW5nIGZha2UgZmI6ICVkeCVkICVkXG4iLCB3LCBoLCBicHApOwotCXJmYkxvZygicmZiTmV3RnJhbWVidWZmZXIoMHgleCwgMHgleCwgJWQsICVkLCAlZCwgJWQsICVkKVxuIiwKLQkgICAgc2NyZWVuLCBmYWtlX2ZiLCB3LCBoLCBicGMsIDEsIGJwcC84KTsKLQotCXJmYl9uZXdfZnJhbWVidWZmZXIoc2NyZWVuLCBmYWtlX2ZiLCB3LCBoLCBicGMsIDEsIGJwcC84KTsKLQlsb2NrX2NsaWVudF9zZW5kcygwKTsKLX0KLQotdm9pZCBjaGVja19wYWRkZWRfZmIodm9pZCkgewotCWlmICghIGZha2VfZmIpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlpZiAodGltZShOVUxMKSA+IHBhZF9nZW9tZXRyeV90aW1lKzEgJiYgYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQlyZW1vdmVfZmFrZV9mYigpOwotCX0KLX0KLQotdm9pZCBpbnN0YWxsX3BhZGRlZF9mYihjaGFyICpnZW9tKSB7Ci0JaW50IHcsIGg7Ci0JaW50IG9rID0gMTsKLQlpZiAoISBnZW9tIHx8ICpnZW9tID09ICdcMCcpIHsKLQkJb2sgPSAwOwotCX0gZWxzZSBpZiAoc3NjYW5mKGdlb20sICIlZHglZCIsICZ3LCAmaCkgIT0gMikgIHsKLQkJb2sgPSAwOwotCX0KLQl3ID0gbmFicyh3KTsKLQloID0gbmFicyhoKTsKLQotCWlmICh3IDwgNSkgdyA9IDU7Ci0JaWYgKGggPCA1KSBoID0gNTsKLQotCWlmICghb2spIHsKLQkJcmZiTG9nKCJza2lwcGluZyBpbnZhbGlkIHBhZCBnZW9tZXRyeTogJyVzJ1xuIiwgTk9OVUwoZ2VvbSkpOwotCQlyZXR1cm47Ci0JfQotCWluc3RhbGxfZmFrZV9mYih3LCBoLCBicHApOwotCXBhZF9nZW9tZXRyeV90aW1lID0gdGltZShOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zbmFwX2ZiKHZvaWQpIHsKLQlSQVdGQl9SRVRfVk9JRAotCWlmIChzbmFwX2ZiKSB7Ci0JCWZyZWUoc25hcF9mYik7Ci0JfQotCXNuYXAgPSBYR2V0SW1hZ2Vfd3IoZHB5LCB3aW5kb3csIDAsIDAsIGRweV94LCBkcHlfeSwgQWxsUGxhbmVzLAotCSAgICBaUGl4bWFwKTsKLQlzbmFwX2ZiID0gc25hcC0+ZGF0YTsKLX0KLQotc3RhdGljIHJmYkNsaWVudCogY2xpZW50ID0gTlVMTDsKLQotdm9pZCB2bmNfcmVmbGVjdF9iZWxsKHJmYkNsaWVudCAqY2wpIHsKLQlpZiAoY2wpIHt9Ci0JaWYgKHNvdW5kX2JlbGwpIHsKLQkJaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJCXJmYkxvZygidm5jX3JlZmxlY3RfYmVsbDogbm90IHNlbmRpbmcgYmVsbDogIgotCQkJICAgICJ1bmluaXRpYWxpemVkIGNsaWVudHNcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHNjcmVlbiAmJiBjbGllbnRfY291bnQpIHsKLQkJCQlyZmJTZW5kQmVsbChzY3JlZW4pOwotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIHZuY19yZWZsZWN0X3JlY3ZfY3V0dGV4dChyZmJDbGllbnQgKmNsLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pIHsKLQlpZiAoY2wpIHt9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZXR1cm47Ci0JfQotCWlmICghIHdhdGNoX3NlbGVjdGlvbikgewotCQlyZXR1cm47Ci0JfQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJcmZiTG9nKCJ2bmNfcmVmbGVjdF9yZWN2X2N1dHRleHQ6IG5vIHNlbmQ6IHVuaW5pdGlhbGl6ZWQgY2xpZW50c1xuIik7Ci0JCXJldHVybjsgLyogc29tZSBjbGllbnRzIGluaXRpYWxpemluZywgY2Fubm90IHNlbmQgKi8gCi0JfQotCXJmYlNlbmRTZXJ2ZXJDdXRUZXh0KHNjcmVlbiwgKGNoYXIgKilzdHIsIGxlbik7Ci19Ci0KLXZvaWQgdm5jX3JlZmxlY3RfZ290X3VwZGF0ZShyZmJDbGllbnQgKmNsLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewotCWlmIChjbCkge30KLQlpZiAodXNlX3hkYW1hZ2UpIHsKLQkJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JCWlmIChmaXJzdCkgewotCQkJY29sbGVjdF9ub25fWF94ZGFtYWdlKC0xLCAtMSwgLTEsIC0xLCAwKTsKLQkJCWZpcnN0ID0gMDsKLQkJfQotCQljb2xsZWN0X25vbl9YX3hkYW1hZ2UoeCwgeSwgdywgaCwgMSk7Ci0JfQotfQotCi12b2lkIHZuY19yZWZsZWN0X2dvdF9jdXJzb3JzaGFwZShyZmJDbGllbnQgKmNsLCBpbnQgeGhvdCwgaW50IHlob3QsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJ5dGVzUGVyUGl4ZWwpIHsKLQlzdGF0aWMgaW50IHNlcmlhbCA9IDE7Ci0JaW50IGksIGo7Ci0JY2hhciAqcGl4ZWxzID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHIsIGcsIGI7Ci0JdW5zaWduZWQgaW50IHVpID0gMDsKLQl1bnNpZ25lZCBsb25nIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7Ci0KLQlpZiAoY2wpIHt9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZXR1cm47Ci0JfQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJcmZiTG9nKCJ2bmNfcmVmbGVjdF9nb3RfY29weXNoYXBlOiBubyBzZW5kOiB1bmluaXRpYWxpemVkIGNsaWVudHNcbiIpOwotCQlyZXR1cm47IC8qIHNvbWUgY2xpZW50cyBpbml0aWFsaXppbmcsIGNhbm5vdCBzZW5kICovIAotCX0KLQlpZiAoISBjbGllbnQtPnJjU291cmNlKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGJ5dGVzUGVyUGl4ZWwgIT0gMSAmJiBieXRlc1BlclBpeGVsICE9IDIgJiYgYnl0ZXNQZXJQaXhlbCAhPSA0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZWRfbWFzayAgID0gKGNsaWVudC0+Zm9ybWF0LnJlZE1heCAgIDw8IGNsaWVudC0+Zm9ybWF0LnJlZFNoaWZ0KTsKLQlncmVlbl9tYXNrID0gKGNsaWVudC0+Zm9ybWF0LmdyZWVuTWF4IDw8IGNsaWVudC0+Zm9ybWF0LmdyZWVuU2hpZnQpOwotCWJsdWVfbWFzayAgPSAoY2xpZW50LT5mb3JtYXQuYmx1ZU1heCAgPDwgY2xpZW50LT5mb3JtYXQuYmx1ZVNoaWZ0KTsKLQotCXBpeGVscyA9IChjaGFyICopbWFsbG9jKDQqd2lkdGgqaGVpZ2h0KTsKLQlmb3IgKGo9MDsgajxoZWlnaHQ7IGorKykgewotCQlmb3IgKGk9MDsgaTx3aWR0aDsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQqIHVpcDsKLQkJCXVuc2lnbmVkIGNoYXIqIHVpYzsKLQkJCWludCBtOwotCQkJaWYgKGJ5dGVzUGVyUGl4ZWwgPT0gMSkgewotCQkJCXVuc2lnbmVkIGNoYXIqIHAgPSAodW5zaWduZWQgY2hhciAqKSBjbGllbnQtPnJjU291cmNlOwotCQkJCXVpID0gKHVuc2lnbmVkIGxvbmcpICoocCArIGogKiB3aWR0aCArIGkpOwotCQkJfSBlbHNlIGlmIChieXRlc1BlclBpeGVsID09IDIpIHsKLQkJCQl1bnNpZ25lZCBzaG9ydCogcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjbGllbnQtPnJjU291cmNlOwotCQkJCXVpID0gKHVuc2lnbmVkIGxvbmcpICoocCArIGogKiB3aWR0aCArIGkpOwotCQkJfSBlbHNlIGlmIChieXRlc1BlclBpeGVsID09IDQpIHsKLQkJCQl1bnNpZ25lZCBpbnQqIHAgPSAodW5zaWduZWQgaW50ICopIGNsaWVudC0+cmNTb3VyY2U7Ci0JCQkJdWkgPSAodW5zaWduZWQgbG9uZykgKihwICsgaiAqIHdpZHRoICsgaSk7Ci0JCQl9Ci0JCQlyID0gKHJlZF9tYXNrICAgJiB1aSkgPj4gY2xpZW50LT5mb3JtYXQucmVkU2hpZnQ7Ci0JCQlnID0gKGdyZWVuX21hc2sgJiB1aSkgPj4gY2xpZW50LT5mb3JtYXQuZ3JlZW5TaGlmdDsKLQkJCWIgPSAoYmx1ZV9tYXNrICAmIHVpKSA+PiBjbGllbnQtPmZvcm1hdC5ibHVlU2hpZnQ7Ci0KLQkJCXIgPSAoMjU1ICogcikgLyBjbGllbnQtPmZvcm1hdC5yZWRNYXg7Ci0JCQlnID0gKDI1NSAqIGcpIC8gY2xpZW50LT5mb3JtYXQuZ3JlZW5NYXg7Ci0JCQliID0gKDI1NSAqIGIpIC8gY2xpZW50LT5mb3JtYXQuYmx1ZU1heDsKLQotCQkJdWkgPSAociA8PCAxNiB8IGcgPDwgOCB8IGIgPDwgMCkgOwotCi0JCQl1aWMgPSAodW5zaWduZWQgY2hhciAqKWNsaWVudC0+cmNNYXNrOwotCQkJbSA9IChpbnQpICoodWljICsgaiAqIHdpZHRoICsgaSk7Ci0JCQlpZiAobSkgewotCQkJCXVpIHw9IDB4ZmYwMDAwMDA7Ci0JCQl9Ci0JCQl1aXAgPSAodW5zaWduZWQgaW50ICopcGl4ZWxzOwotCQkJKih1aXAgKyBqICogd2lkdGggKyBpKSA9IHVpOwotCQl9Ci0JfQotCi0Jc3RvcmVfY3Vyc29yKHNlcmlhbCsrLCAodW5zaWduZWQgbG9uZyopIHBpeGVscywgd2lkdGgsIGhlaWdodCwgMzIsIHhob3QsIHlob3QpOwotCWZyZWUocGl4ZWxzKTsKLQlzZXRfY3Vyc29yKGN1cnNvcl94LCBjdXJzb3JfeSwgZ2V0X3doaWNoX2N1cnNvcigpKTsKLX0KLQotcmZiQm9vbCB2bmNfcmVmbGVjdF9jdXJzb3JfcG9zKHJmYkNsaWVudCAqY2wsIGludCB4LCBpbnQgeSkgewotCWlmIChjbCkge30KLQlpZiAoZGVidWdfcG9pbnRlcikgewotCQlyZmJMb2coInZuY19yZWZsZWN0X2N1cnNvcl9wb3M6ICVkICVkXG4iLCB4LCB5KTsKLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlpZiAoZGVidWdfcG9pbnRlcikgewotCQkJcmZiTG9nKCJ2bmNfcmVmbGVjdF9jdXJzb3JfcG9zOiB1bml4cHdfaW5fcHJvZ3Jlc3MlZFxuIiwgdW5peHB3X2luX3Byb2dyZXNzKTsKLQkJfQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JaWYgKCEgYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQlyZmJMb2coInZuY19yZWZsZWN0X2N1cnNvcl9wb3M6IG5vIHNlbmQ6IHVuaW5pdGlhbGl6ZWQgY2xpZW50c1xuIik7Ci0JCXJldHVybiBUUlVFOyAvKiBzb21lIGNsaWVudHMgaW5pdGlhbGl6aW5nLCBjYW5ub3Qgc2VuZCAqLyAKLQl9Ci0KLQljdXJzb3JfcG9zaXRpb24oeCwgeSk7Ci0Jc2V0X2N1cnNvcih4LCB5LCBnZXRfd2hpY2hfY3Vyc29yKCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyb21fbGlidm5jY2xpZW50X0NvcHlSZWN0YW5nbGVGcm9tUmVjdGFuZ2xlKHJmYkNsaWVudCogY2xpZW50LCBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoLCBpbnQgZGVzdF94LCBpbnQgZGVzdF95KSB7Ci0gIGludCBpLGo7Ci0KLSNkZWZpbmUgQ09QWV9SRUNUX0ZST01fUkVDVChCUFApIFwKLSAgeyBcCi0gICAgdWludCMjQlBQIyNfdCogX2J1ZmZlcj0oKHVpbnQjI0JQUCMjX3QqKWNsaWVudC0+ZnJhbWVCdWZmZXIpKyhzcmNfeS1kZXN0X3kpKmNsaWVudC0+d2lkdGgrc3JjX3gtZGVzdF94OyBcCi0gICAgaWYgKGRlc3RfeSA8IHNyY195KSB7IFwKLSAgICAgIGZvcihqID0gZGVzdF95KmNsaWVudC0+d2lkdGg7IGogPCAoZGVzdF95K2gpKmNsaWVudC0+d2lkdGg7IGogKz0gY2xpZW50LT53aWR0aCkgeyBcCi0gICAgICAgIGlmIChkZXN0X3ggPCBzcmNfeCkgeyBcCi0gICAgICAgICAgZm9yKGkgPSBkZXN0X3g7IGkgPCBkZXN0X3grdzsgaSsrKSB7IFwKLSAgICAgICAgICAgICgodWludCMjQlBQIyNfdCopY2xpZW50LT5mcmFtZUJ1ZmZlcilbaitpXT1fYnVmZmVyW2oraV07IFwKLSAgICAgICAgICB9IFwKLSAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgIGZvcihpID0gZGVzdF94K3ctMTsgaSA+PSBkZXN0X3g7IGktLSkgeyBcCi0gICAgICAgICAgICAoKHVpbnQjI0JQUCMjX3QqKWNsaWVudC0+ZnJhbWVCdWZmZXIpW2oraV09X2J1ZmZlcltqK2ldOyBcCi0gICAgICAgICAgfSBcCi0gICAgICAgIH0gXAotICAgICAgfSBcCi0gICAgfSBlbHNlIHsgXAotICAgICAgZm9yKGogPSAoZGVzdF95K2gtMSkqY2xpZW50LT53aWR0aDsgaiA+PSBkZXN0X3kqY2xpZW50LT53aWR0aDsgai09Y2xpZW50LT53aWR0aCkgeyBcCi0gICAgICAgIGlmIChkZXN0X3ggPCBzcmNfeCkgeyBcCi0gICAgICAgICAgZm9yKGkgPSBkZXN0X3g7IGkgPCBkZXN0X3grdzsgaSsrKSB7IFwKLSAgICAgICAgICAgICgodWludCMjQlBQIyNfdCopY2xpZW50LT5mcmFtZUJ1ZmZlcilbaitpXT1fYnVmZmVyW2oraV07IFwKLSAgICAgICAgICB9IFwKLSAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgIGZvcihpID0gZGVzdF94K3ctMTsgaSA+PSBkZXN0X3g7IGktLSkgeyBcCi0gICAgICAgICAgICAoKHVpbnQjI0JQUCMjX3QqKWNsaWVudC0+ZnJhbWVCdWZmZXIpW2oraV09X2J1ZmZlcltqK2ldOyBcCi0gICAgICAgICAgfSBcCi0gICAgICAgIH0gXAotICAgICAgfSBcCi0gICAgfSBcCi0gIH0KLQotICBzd2l0Y2goY2xpZW50LT5mb3JtYXQuYml0c1BlclBpeGVsKSB7Ci0gIGNhc2UgIDg6IENPUFlfUkVDVF9GUk9NX1JFQ1QoOCk7ICBicmVhazsKLSAgY2FzZSAxNjogQ09QWV9SRUNUX0ZST01fUkVDVCgxNik7IGJyZWFrOwotICBjYXNlIDMyOiBDT1BZX1JFQ1RfRlJPTV9SRUNUKDMyKTsgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmZiQ2xpZW50TG9nKCJVbnN1cHBvcnRlZCBiaXRzUGVyUGl4ZWw6ICVkXG4iLGNsaWVudC0+Zm9ybWF0LmJpdHNQZXJQaXhlbCk7Ci0gIH0KLX0KLQotdm9pZCB2bmNfcmVmbGVjdF9nb3RfY29weXJlY3QocmZiQ2xpZW50ICpjbCwgaW50IHNyY194LCBpbnQgc3JjX3ksIGludCB3LCBpbnQgaCwgaW50IGRlc3RfeCwgaW50IGRlc3RfeSkgewotCXNyYVJlZ2lvblB0ciByZWc7Ci0JaW50IGR4LCBkeSwgcmMgPSAtMTsKLQlzdGF0aWMgaW50IGxhc3RfZHggPSAwLCBsYXN0X2R5ID0gMDsKLQlpZiAoY2wpIHt9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZXR1cm47Ci0JfQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJcmZiTG9nKCJ2bmNfcmVmbGVjdF9nb3RfY29weXJlY3Q6IG5vIHNlbmQ6IHVuaW5pdGlhbGl6ZWQgY2xpZW50c1xuIik7Ci0JCXJldHVybjsgLyogc29tZSBjbGllbnRzIGluaXRpYWxpemluZywgY2Fubm90IHNlbmQgKi8gCi0JfQotCWR4ID0gZGVzdF94IC0gc3JjX3g7Ci0JZHkgPSBkZXN0X3kgLSBzcmNfeTsKLQlpZiAoZHggIT0gbGFzdF9keCB8fCBkeSAhPSBsYXN0X2R5KSB7Ci0JCXJjID0gZmJfcHVzaF93YWl0KDAuMDUsIEZCX0NPUFl8RkJfTU9EKTsKLQl9Ci0JaWYgKDApIGZwcmludGYoc3RkZXJyLCAidm5jX3JlZmxlY3RfZ290X2NvcHlyZWN0OiAlMDNkeCUwM2QrJTAzZCslMDNkICAgJTNkICUzZCAgcmM9JWRcbiIsIGRlc3RfeCwgZGVzdF95LCB3LCBoLCBkeCwgZHksIHJjKTsKLQlyZWcgPSBzcmFSZ25DcmVhdGVSZWN0KGRlc3RfeCwgZGVzdF95LCBkZXN0X3ggKyB3LCBkZXN0X3kgKyBoKTsKLQlkb19jb3B5cmVnaW9uKHJlZywgZHgsIGR5LCAwKTsKLQlzcmFSZ25EZXN0cm95KHJlZyk7Ci0KLQlsYXN0X2R4ID0gZHg7Ci0JbGFzdF9keSA9IGR5OwotCi0JZnJvbV9saWJ2bmNjbGllbnRfQ29weVJlY3RhbmdsZUZyb21SZWN0YW5nbGUoY2wsIHNyY194LCBzcmNfeSwgdywgaCwgZGVzdF94LCBkZXN0X3kpOwotfQotCi1yZmJCb29sIHZuY19yZWZsZWN0X3Jlc2l6ZShyZmJDbGllbnQgKmNsKSAgewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWlmKGNsLT5mcmFtZUJ1ZmZlcikgewotCQlmcmVlKGNsLT5mcmFtZUJ1ZmZlcik7Ci0JfQotCWNsLT5mcmFtZUJ1ZmZlcj0gbWFsbG9jKGNsLT53aWR0aCAqIGNsLT5oZWlnaHQgKiBjbC0+Zm9ybWF0LmJpdHNQZXJQaXhlbC84KTsKLQlyZmJMb2coInZuY19yZWZsZWN0X3Jlc2l6ZTogJWR4JWR4JWQgZmlyc3Q9JWRcbiIsIGNsLT53aWR0aCwgY2wtPmhlaWdodCwKLQkgICAgY2wtPmZvcm1hdC5iaXRzUGVyUGl4ZWwsIGZpcnN0KTsKLQlpZiAoIWZpcnN0KSB7Ci0JCWRvX25ld19mYigxKTsKLQl9Ci0JZmlyc3QgPSAwOwotCXJldHVybiBjbC0+ZnJhbWVCdWZmZXIgPyBUUlVFIDogRkFMU0U7Ci19Ci0KLSNpZmRlZiByZmJDcmVkZW50aWFsVHlwZVg1MDkKLXN0YXRpYyByZmJDcmVkZW50aWFsKiB2bmNfcmVmbGVjdF9nZXRfY3JlZGVudGlhbChyZmJDbGllbnQqIGNsaWVudCwgaW50IHR5cGUpIHsKLQljaGFyICpwYXNzID0gZ2V0ZW52KCJYMTFWTkNfUkVGTEVDVF9QQVNTV09SRCIpOwotCWNoYXIgKnVzZXIgPSBnZXRlbnYoIlgxMVZOQ19SRUZMRUNUX1VTRVIiKTsKLQljaGFyICpjZXJ0ID0gZ2V0ZW52KCJYMTFWTkNfUkVGTEVDVF9DQUNFUlQiKTsKLQljaGFyICpjY3JsID0gZ2V0ZW52KCJYMTFWTkNfUkVGTEVDVF9DQUNSTCIpOwotCWNoYXIgKmNsaWMgPSBnZXRlbnYoIlgxMVZOQ19SRUZMRUNUX0NMSUVOVENFUlQiKTsKLQljaGFyICpjbGlrID0gZ2V0ZW52KCJYMTFWTkNfUkVGTEVDVF9DTElFTlRLRVkiKTsKLQlpbnQgZGIgPSAwOwotCWlmIChjbGllbnQpIHt9Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidHlwZTogJWRcbiIsIHR5cGUpOwotI2lmZGVmIHJmYkNyZWRlbnRpYWxUeXBlVXNlcgotCWlmICh0eXBlID09IHJmYkNyZWRlbnRpYWxUeXBlVXNlcikgewotCQlpZiAoIXBhc3MgJiYgIXVzZXIpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJcmZiQ3JlZGVudGlhbCAqcmMgPSAocmZiQ3JlZGVudGlhbCAqKSBjYWxsb2Moc2l6ZW9mKHJmYkNyZWRlbnRpYWwpLCAxKTsKLQkJCXJjLT51c2VyQ3JlZGVudGlhbC51c2VybmFtZSA9ICh1c2VyID8gc3RyZHVwKHVzZXIpIDogTlVMTCk7Ci0JCQlyYy0+dXNlckNyZWRlbnRpYWwucGFzc3dvcmQgPSAocGFzcyA/IHN0cmR1cChwYXNzKSA6IE5VTEwpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotI2VuZGlmCi0JaWYgKHR5cGUgPT0gcmZiQ3JlZGVudGlhbFR5cGVYNTA5KSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2VydDogJXNcbiIsIGNlcnQpOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNjcmw6ICVzXG4iLCBjY3JsKTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjbGljOiAlc1xuIiwgY2xpYyk7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2xpazogJXNcbiIsIGNsaWspOwotCQlpZiAoIWNlcnQgJiYgIWNjcmwgJiYgIWNsaWMgJiYgIWNsaWspIHsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJcmZiQ3JlZGVudGlhbCAqcmMgPSAocmZiQ3JlZGVudGlhbCAqKSBjYWxsb2Moc2l6ZW9mKHJmYkNyZWRlbnRpYWwpLCAxKTsKLQkJCXJjLT54NTA5Q3JlZGVudGlhbC54NTA5Q0FDZXJ0RmlsZSAgICAgPSAoY2VydCA/IHN0cmR1cChjZXJ0KSA6IE5VTEwpOwotCQkJcmMtPng1MDlDcmVkZW50aWFsLng1MDlDQUNybEZpbGUgICAgICA9IChjY3JsID8gc3RyZHVwKGNjcmwpIDogTlVMTCk7Ci0JCQlyYy0+eDUwOUNyZWRlbnRpYWwueDUwOUNsaWVudENlcnRGaWxlID0gKGNsaWMgPyBzdHJkdXAoY2xpYykgOiBOVUxMKTsKLQkJCXJjLT54NTA5Q3JlZGVudGlhbC54NTA5Q2xpZW50S2V5RmlsZSAgPSAoY2xpayA/IHN0cmR1cChjbGlrKSA6IE5VTEwpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyKiB2bmNfcmVmbGVjdF9nZXRfcGFzc3dvcmQocmZiQ2xpZW50KiBjbGllbnQpIHsKLQljaGFyICpxLCAqcCwgKnN0ciA9IGdldGVudigiWDExVk5DX1JFRkxFQ1RfUEFTU1dPUkQiKTsKLQlpbnQgbGVuID0gMTEwOwotCi0JaWYgKGNsaWVudCkge30KLQotCWlmIChzdHIpIHsKLQkJbGVuICs9IDIqc3RybGVuKHN0cik7CQotCX0KLQlwID0gKGNoYXIgKikgY2FsbG9jKGxlbiwgMSk7Ci0JaWYgKCFzdHIgfHwgc3RybGVuKHN0cikgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlZOQyBSZWZsZWN0IFBhc3N3b3JkOiAiKTsKLQkJZmdldHMocCwgMTAwLCBzdGRpbik7Ci0JfSBlbHNlIHsKLQkJaWYgKHN0cnN0cihzdHIsICJmaWxlOiIpID09IHN0cikgewotCQkJRklMRSAqZiA9IGZvcGVuKHN0ciArIHN0cmxlbigiZmlsZToiKSwgInIiKTsKLQkJCWlmIChmKSB7Ci0JCQkJZmdldHMocCwgMTAwLCBmKTsKLQkJCQlmY2xvc2UoZik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBbMF0gPT0gJ1wwJykgewotCQkJc3RybmNweShwLCBzdHIsIDEwMCk7Ci0JCX0KLQl9Ci0JcSA9IHA7Ci0Jd2hpbGUgKCpxICE9ICdcMCcpIHsKLQkJaWYgKCpxID09ICdcbicpIHsKLQkJCSpxID0gJ1wwJzsKLQkJfQotCQlxKys7Ci0JfQotCXJldHVybiBwOwotfQotCi1jaGFyICp2bmNfcmVmbGVjdF9ndWVzcyhjaGFyICpzdHIsIGNoYXIgKipyYXdfZmJfYWRkcikgewotCi0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JY2hhciAqaHAgPSBzdHIgKyBzdHJsZW4oInZuYzoiKTsKLQljaGFyICphdCA9IE5VTEw7Ci0JaW50IGFyZ2MgPSAwLCBpOwotCWNoYXIgKmFyZ3ZbMTZdOwotCWNoYXIgc3RyMlsyNTZdOwotCWNoYXIgKnN0cjAgPSBzdHJkdXAoc3RyKTsKLQotCWlmIChjbGllbnQgPT0gTlVMTCkgewotCQlpbnQgYml0c1BlclNhbXBsZSA9IDg7Ci0JCWludCBzYW1wbGVzUGVyUGl4ZWwgPSAzOwotCQlpbnQgYnl0ZXNQZXJQaXhlbCA9IDQ7Ci0JCWNoYXIgKnM7Ci0JCXMgPSBnZXRlbnYoIlgxMVZOQ19SRUZMRUNUX2JpdHNQZXJTYW1wbGUiKTsKLQkJaWYgKHMpIGJpdHNQZXJTYW1wbGUgPSBhdG9pKHMpOwotCQlzID0gZ2V0ZW52KCJYMTFWTkNfUkVGTEVDVF9zYW1wbGVzUGVyUGl4ZWwiKTsKLQkJaWYgKHMpIHNhbXBsZXNQZXJQaXhlbCA9IGF0b2kocyk7Ci0JCXMgPSBnZXRlbnYoIlgxMVZOQ19SRUZMRUNUX2J5dGVzUGVyUGl4ZWwiKTsKLQkJaWYgKHMpIGJ5dGVzUGVyUGl4ZWwgPSBhdG9pKHMpOwotCQlyZmJMb2coInJmYkdldENsaWVudChiaXRzUGVyU2FtcGxlPSVkLCBzYW1wbGVzUGVyUGl4ZWw9JWQsIGJ5dGVzUGVyUGl4ZWw9JWQpXG4iLAotCQkgICAgYml0c1BlclNhbXBsZSwgc2FtcGxlc1BlclBpeGVsLCBieXRlc1BlclBpeGVsKTsKLQkJY2xpZW50ID0gcmZiR2V0Q2xpZW50KGJpdHNQZXJTYW1wbGUsIHNhbXBsZXNQZXJQaXhlbCwgYnl0ZXNQZXJQaXhlbCk7Ci0JfQotCi0JcmZiTG9nKCJyYXdmYjogJXNcbiIsIHN0cik7Ci0KLQlhdCA9IHN0cmNocihocCwgJ0AnKTsKLQlpZiAoYXQpIHsKLQkJKmF0ID0gJ1wwJzsKLQkJYXQrKzsKLQl9Ci0KLQljbGllbnQtPmFwcERhdGEudXNlUmVtb3RlQ3Vyc29yID0gVFJVRTsKLQljbGllbnQtPmNhbkhhbmRsZU5ld0ZCU2l6ZSA9IFRSVUU7Ci0KLQljbGllbnQtPkhhbmRsZUN1cnNvclBvcyA9IHZuY19yZWZsZWN0X2N1cnNvcl9wb3M7Ci0JY2xpZW50LT5Hb3RGcmFtZUJ1ZmZlclVwZGF0ZSA9IHZuY19yZWZsZWN0X2dvdF91cGRhdGU7Ci0JY2xpZW50LT5NYWxsb2NGcmFtZUJ1ZmZlciA9IHZuY19yZWZsZWN0X3Jlc2l6ZTsKLQljbGllbnQtPkJlbGwgPSB2bmNfcmVmbGVjdF9iZWxsOwotI2lmIDAKLQljbGllbnQtPlNvZnRDdXJzb3JMb2NrQXJlYSA9IE5VTEw7Ci0JY2xpZW50LT5Tb2Z0Q3Vyc29yVW5sb2NrU2NyZWVuID0gTlVMTDsKLQljbGllbnQtPkZpbmlzaGVkRnJhbWVCdWZmZXJVcGRhdGUgPSBOVUxMOwotCWNsaWVudC0+SGFuZGxlS2V5Ym9hcmRMZWRTdGF0ZSA9IE5VTEw7Ci0JY2xpZW50LT5IYW5kbGVUZXh0Q2hhdCA9IE5VTEw7Ci0jZW5kaWYKLQljbGllbnQtPkdvdFhDdXRUZXh0ID0gdm5jX3JlZmxlY3RfcmVjdl9jdXR0ZXh0OwotCWNsaWVudC0+R290Q3Vyc29yU2hhcGUgPSB2bmNfcmVmbGVjdF9nb3RfY3Vyc29yc2hhcGU7Ci0JY2xpZW50LT5Hb3RDb3B5UmVjdCA9IHZuY19yZWZsZWN0X2dvdF9jb3B5cmVjdDsKLQotCWlmIChnZXRlbnYoIlgxMVZOQ19SRUZMRUNUX1BBU1NXT1JEIikpIHsKLQkJY2xpZW50LT5HZXRQYXNzd29yZCA9IHZuY19yZWZsZWN0X2dldF9wYXNzd29yZDsKLQl9Ci0jaWZkZWYgcmZiQ3JlZGVudGlhbFR5cGVYNTA5Ci0JY2xpZW50LT5HZXRDcmVkZW50aWFsID0gTlVMTDsKLQlpZiAoMCB8fCBnZXRlbnYoIkxJQlZOQ0NMSUVOVF9HRVRfQ1JFREVOVElBTCIpKSB7Ci0JCWNsaWVudC0+R2V0Q3JlZGVudGlhbCA9IHZuY19yZWZsZWN0X2dldF9jcmVkZW50aWFsOwotCX0KLSNlbmRpZgotCi0JaWYgKGZpcnN0KSB7Ci0JCWFyZ3ZbYXJnYysrXSA9ICJ4MTF2bmNfcmF3ZmJfdm5jIjsKLQkJaWYgKHN0cnN0cihocCwgImxpc3RlbiIpID09IGhwKSB7Ci0JCQljaGFyICpxID0gc3RycmNocihocCwgJzonKTsKLQkJCWFyZ3ZbYXJnYysrXSA9IHN0cmR1cCgiLWxpc3RlbiIpOwotCQkJaWYgKHEpIHsKLQkJCQljbGllbnQtPmxpc3RlblBvcnQgPSBhdG9pKHErMSk7Ci0JCQl9IGVsc2UgewotCQkJCWNsaWVudC0+bGlzdGVuUG9ydCA9IExJU1RFTl9QT1JUX09GRlNFVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFyZ3ZbYXJnYysrXSA9IHN0cmR1cChocCk7Ci0JCX0KLQotCQlpZiAoISByZmJJbml0Q2xpZW50KGNsaWVudCwgJmFyZ2MsIGFyZ3YpKSB7Ci0JCQlyZmJMb2coInZuY19yZWZsZWN0b3IgZmFpbGVkIGZvcjogJXNcbiIsIHN0cjApOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCX0KLQotCWlmIChhdCkgewotCQlzcHJpbnRmKHN0cjIsICJtYXA6L2Rldi9udWxsQCVzIiwgYXQpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzazsKLQkJcmVkX21hc2sgICA9IChjbGllbnQtPmZvcm1hdC5yZWRNYXggICA8PCBjbGllbnQtPmZvcm1hdC5yZWRTaGlmdCk7Ci0JCWdyZWVuX21hc2sgPSAoY2xpZW50LT5mb3JtYXQuZ3JlZW5NYXggPDwgY2xpZW50LT5mb3JtYXQuZ3JlZW5TaGlmdCk7Ci0JCWJsdWVfbWFzayAgPSAoY2xpZW50LT5mb3JtYXQuYmx1ZU1heCAgPDwgY2xpZW50LT5mb3JtYXQuYmx1ZVNoaWZ0KTsKLQkJc3ByaW50ZihzdHIyLCAibWFwOi9kZXYvbnVsbEAlZHglZHglZDoweCVseC8weCVseC8weCVseCIsCi0JCSAgICBjbGllbnQtPndpZHRoLCBjbGllbnQtPmhlaWdodCwgY2xpZW50LT5mb3JtYXQuYml0c1BlclBpeGVsLAotCQkgICAgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzayk7Ci0JfQotCSpyYXdfZmJfYWRkciA9IChjaGFyICopIGNsaWVudC0+ZnJhbWVCdWZmZXI7Ci0JZnJlZShzdHIwKTsKLQotCWlmIChmaXJzdCkgewotCQlzZXR1cF9jdXJzb3JzX2FuZF9wdXNoKCk7Ci0KLQkJZm9yIChpPTA7IGk8MTA7IGkrKykgewotCQkJdm5jX3JlZmxlY3RfcHJvY2Vzc19jbGllbnQoKTsKLQkJfQotCX0KLQlmaXJzdCA9IDA7Ci0KLQlyZXR1cm4gc3RyZHVwKHN0cjIpOwotfQotCi1yZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfcG9pbnRlcihpbnQgeCwgaW50IHksIGludCBtYXNrKSB7Ci0JaW50IHJjOwotCWlmIChtYXNrID49IDApIHsKLQkJZ290X3VzZXJfaW5wdXQrKzsKLQkJZ290X3BvaW50ZXJfaW5wdXQrKzsKLQkJbGFzdF9wb2ludGVyX3RpbWUgPSB0aW1lKE5VTEwpOwotCX0KLQotCWlmIChjbGlwc2hpZnQpIHsKLQkJeCArPSBjb2ZmX3g7Ci0JCXkgKz0gY29mZl95OwotCX0KLQotCWlmIChjdXJzb3JfeCAhPSB4IHx8IGN1cnNvcl95ICE9IHkpIHsKLQkJbGFzdF9wb2ludGVyX21vdGlvbl90aW1lID0gZG5vdygpOwotCX0KLQotCWN1cnNvcl94ID0geDsKLQljdXJzb3JfeSA9IHk7Ci0KLQkvKiByZWNvcmQgdGhlIHgsIHkgcG9zaXRpb24gZm9yIHRoZSByZmIgc2NyZWVuIGFzIHdlbGwuICovCi0JY3Vyc29yX3Bvc2l0aW9uKHgsIHkpOwotCi0JLyogY2hhbmdlIHRoZSBjdXJzb3Igc2hhcGUgaWYgbmVjZXNzYXJ5ICovCi0JcmMgPSBzZXRfY3Vyc29yKHgsIHksIGdldF93aGljaF9jdXJzb3IoKSk7Ci0JY3Vyc29yX2NoYW5nZXMgKz0gcmM7Ci0KLQlyZXR1cm4gU2VuZFBvaW50ZXJFdmVudChjbGllbnQsIHgsIHksIG1hc2spOwotfQotCi1yZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfa2V5KHVpbnQzMl90IGtleSwgcmZiQm9vbCBkb3duKSB7Ci0JcmV0dXJuIFNlbmRLZXlFdmVudChjbGllbnQsIGtleSwgZG93bik7Ci19Ci0KLXJmYkJvb2wgdm5jX3JlZmxlY3Rfc2VuZF9jdXR0ZXh0KGNoYXIgKnN0ciwgaW50IGxlbikgewotCXJldHVybiBTZW5kQ2xpZW50Q3V0VGV4dChjbGllbnQsIHN0ciwgbGVuKTsKLX0KLQotdm9pZCB2bmNfcmVmbGVjdF9wcm9jZXNzX2NsaWVudCh2b2lkKSB7Ci0JaW50IG51bTsKLQlpZiAoY2xpZW50ID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQludW0gPSBXYWl0Rm9yTWVzc2FnZShjbGllbnQsIDEwMDApOwotCWlmIChudW0gPiAwKSB7Ci0JCWlmICghSGFuZGxlUkZCU2VydmVyTWVzc2FnZShjbGllbnQpKSB7Ci0JCQlyZmJMb2coInZuY19yZWZsZWN0X3Byb2Nlc3NfY2xpZW50OiByZWFkIGZhaWx1cmUgdG8gc2VydmVyXG4iKTsKLQkJCXNodXRfZG93biA9IDE7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgbGludXhfZGV2X2ZiX21zZyhjaGFyKiBxKSB7Ci0JaWYgKHN0cnN0cihxLCAiL2Rldi9mYiIpICYmIHN0cnN0cihVVC5zeXNuYW1lLCAiTGludXgiKSkgewotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiT24gTGludXggeW91IG1heSBuZWVkIHRvIGxvYWQgYSBrZXJuZWwgbW9kdWxlIHRvIGVuYWJsZVxuIik7Ci0JCXJmYkxvZygidGhlIGZyYW1lYnVmZmVyIGRldmljZSAvZGV2L2ZiKjsgZS5nLjpcbiIpOwotCQlyZmJMb2coIiAgIHZnYT0weDMwMyAoYW5kIG90aGVycykga2VybmVsIGJvb3QgcGFyYW1ldGVyXG4iKTsKLQkJcmZiTG9nKCIgICBtb2Rwcm9iZSB1dmVzYWZiXG4iKTsKLQkJcmZiTG9nKCIgICBtb2Rwcm9iZSByYWRlb25mYiAoY2FyZCBzcGVjaWZpYylcbiIpOwotCQlyZmJMb2coIiAgIG1vZHByb2JlIG52aWRpYWZiIChjYXJkIHNwZWNpZmljLCBvdGhlcnMpXG4iKTsKLQkJcmZiTG9nKCIgICBtb2Rwcm9iZSB2ZXNhZmIgKD8pXG4iKTsKLQkJcmZiTG9nKCIgICBtb2Rwcm9iZSB2Z2ExNmZiXG4iKTsKLQkJcmZiTG9nKCJcbiIpOwotCQlyZmJMb2coIllvdSBtYXkgYWxzbyBuZWVkIHJvb3QgcGVybWlzc2lvbiB0byBvcGVuIC9kZXYvZmIqXG4iKTsKLQkJcmZiTG9nKCJhbmQvb3IgL2Rldi90dHkqLlxuIik7Ci0JCXJmYkxvZygiXG4iKTsKLQl9Ci19Ci0KLSNkZWZpbmUgUkFXRkJfTU1BUCAxCi0jZGVmaW5lIFJBV0ZCX0ZJTEUgMgotI2RlZmluZSBSQVdGQl9TSE0gIDMKLQotWEltYWdlICppbml0aWFsaXplX3Jhd19mYihpbnQgcmVzZXQpIHsKLQljaGFyICpzdHIsICpyc3RyLCAqcTsKLQlpbnQgdywgaCwgYiwgc2htaWQgPSAwOwotCXVuc2lnbmVkIGxvbmcgcm0gPSAwLCBnbSA9IDAsIGJtID0gMCwgdG07Ci0Jc3RhdGljIFhJbWFnZSB4aW1hZ2Vfc3RydWN0OwkvKiBuLmIuOiBub3QgKFhJbWFnZSAqKSAqLwotCXN0YXRpYyBYSW1hZ2UgeGltYWdlX3N0cnVjdF9zbmFwOwotCWludCBjbG9zZWRweSA9IDEsIGksIG0sIGRiID0gMDsKLQlpbnQgZG9fbWFjb3N4ID0gMDsKLQlpbnQgZG9fcmVmbGVjdCA9IDA7Ci0JY2hhciAqdW5saW5rX21lID0gTlVMTDsKLQotCXN0YXRpYyBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOwotCXN0YXRpYyBpbnQgbGFzdF9tb2RlID0gMDsKLQotCWlmIChyZXNldCAmJiBsYXN0X21vZGUpIHsKLQkJaW50IGZkOwotCQlpZiAobGFzdF9tb2RlICE9IFJBV0ZCX01NQVAgJiYgbGFzdF9tb2RlICE9IFJBV0ZCX0ZJTEUpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChsYXN0X21vZGUgPT0gUkFXRkJfTU1BUCkgewotCQkJbXVubWFwKHJhd19mYl9hZGRyLCByYXdfZmJfbW1hcCk7Ci0JCX0KLQkJaWYgKHJhd19mYl9mZCA+PSAwKSB7Ci0JCQljbG9zZShyYXdfZmJfZmQpOwotCQl9Ci0JCXJhd19mYl9mZCA9IC0xOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImluaXRpYWxpemVfcmF3X2ZiIHJlc2V0XG4iKTsKLQkJCQotCQlmZCA9IC0xOwotCQlpZiAocmF3ZmJfZGV2X3ZpZGVvKSB7Ci0JCQlmZCA9IG9wZW4obGFzdF9maWxlLCBPX1JEV1IpOwotCQl9Ci0JCWlmIChmZCA8IDApIHsKLQkJCWZkID0gb3BlbihsYXN0X2ZpbGUsIE9fUkRPTkxZKTsKLQkJfQotCQlpZiAoZmQgPCAwKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coImZhaWxlZCB0byByYXdmYiBmaWxlOiAlc1xuIiwgbGFzdF9maWxlKTsKLQkJCXJmYkxvZ1BlcnJvcigib3BlbiIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlyYXdfZmJfZmQgPSBmZDsKLQkJaWYgKGxhc3RfbW9kZSA9PSBSQVdGQl9NTUFQKSB7Ci0JCQlyYXdfZmJfYWRkciA9IG1tYXAoMCwgcmF3X2ZiX21tYXAsIFBST1RfUkVBRCwKLQkJCSAgICBNQVBfU0hBUkVELCBmZCwgMCk7Ci0KLQkJCWlmIChyYXdfZmJfYWRkciA9PSBNQVBfRkFJTEVEIHx8IHJhd19mYl9hZGRyID09IE5VTEwpIHsKLQkJCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQkJcmZiTG9nKCJmYWlsZWQgdG8gbW1hcCBmaWxlOiAlc1xuIiwgbGFzdF9maWxlKTsKLQkJCQlyZmJMb2coIiAgIHJhd19mYl9hZGRyOiAlcFxuIiwgcmF3X2ZiX2FkZHIpOwotCQkJCXJmYkxvZ1BlcnJvcigibW1hcCIpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKHJhd19mYl9hZGRyICE9IE5VTEwgJiYgbWFjb3N4X2NvbnNvbGUgJiYgcmF3X2ZiX2FkZHIgPT0gbWFjb3N4X2dldF9mYl9hZGRyKCkpIHsKLQkJcmF3X2ZiX2FkZHIgPSBOVUxMOwotCX0KLSNlbmRpZgotCi0JaWYgKHJhd19mYl9hZGRyIHx8IHJhd19mYl9zZWVrKSB7Ci0JCWlmIChyYXdfZmJfc2htKSB7Ci0JCQlzaG1kdChyYXdfZmJfYWRkcik7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTU1BUAotCQl9IGVsc2UgaWYgKHJhd19mYl9tbWFwKSB7Ci0JCQltdW5tYXAocmF3X2ZiX2FkZHIsIHJhd19mYl9tbWFwKTsKLQkJCWlmIChyYXdfZmJfZmQgPj0gMCkgewotCQkJCWNsb3NlKHJhd19mYl9mZCk7Ci0JCQl9Ci0JCQlyYXdfZmJfZmQgPSAtMTsKLSNlbmRpZgotCQl9IGVsc2UgaWYgKHJhd19mYl9zZWVrKSB7Ci0JCQlpZiAocmF3X2ZiX2ZkID49IDApIHsKLQkJCQljbG9zZShyYXdfZmJfZmQpOwotCQkJfQotCQkJcmF3X2ZiX2ZkID0gLTE7Ci0JCX0KLQkJcmF3X2ZiX2FkZHIgPSBOVUxMOwotCQlyYXdfZmJfbW1hcCA9IDA7Ci0JCXJhd19mYl9zZWVrID0gMDsKLQl9Ci0JaWYgKCEgcmF3X2ZiX3N0cikgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAocmF3X2ZiX3N0clswXSA9PSAnKycpIHsKLQkJcnN0ciA9IHN0cmR1cChyYXdfZmJfc3RyKzEpOwotCQljbG9zZWRweSA9IDA7Ci0JCWlmICghIHdpbmRvdykgewotCQkJd2luZG93ID0gcm9vdHdpbjsKLQkJfQotCX0gZWxzZSB7Ci0JCXJzdHIgPSBzdHJkdXAocmF3X2ZiX3N0cik7Ci0JfQotCi0JLyogdGVzdGluZyBhbGlhc2VzICovCi0JaWYgKCFzdHJjYXNlY21wKHJzdHIsICJOVUxMIikgfHwgIXN0cmNhc2VjbXAocnN0ciwgIlpFUk8iKQotCSAgICB8fCAhc3RyY2FzZWNtcChyc3RyLCAiTk9ORSIpKSB7Ci0JCXJzdHIgPSBzdHJkdXAoIm1hcDovZGV2L3plcm9ANjQweDQ4MHgzMiIpOwotCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAocnN0ciwgIk5VTExCSUciKSB8fCAhc3RyY2FzZWNtcChyc3RyLCAiTk9ORUJJRyIpKSB7Ci0JCXJzdHIgPSBzdHJkdXAoIm1hcDovZGV2L3plcm9AMTAyNHg3Njh4MzIiKTsKLQl9Ci0JaWYgKCFzdHJjYXNlY21wKHJzdHIsICJSQU5EIikpIHsKLQkJcnN0ciA9IHN0cmR1cCgiZmlsZTovZGV2L3VyYW5kb21AMTI4eDEyOHgxNiIpOwotCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAocnN0ciwgIlJBTkRCSUciKSkgewotCQlyc3RyID0gc3RyZHVwKCJmaWxlOi9kZXYvdXJhbmRvbUA2NDB4NDgweDE2Iik7Ci0JfSBlbHNlIGlmICghc3RyY2FzZWNtcChyc3RyLCAiUkFOREhVR0UiKSkgewotCQlyc3RyID0gc3RyZHVwKCJmaWxlOi9kZXYvdXJhbmRvbUAxMDI0eDc2OHgxNiIpOwotCX0KLQlpZiAoc3Ryc3RyKHJzdHIsICJzb2xpZD0iKSA9PSByc3RyKSB7Ci0JCWNoYXIgKm4gPSByc3RyICsgc3RybGVuKCJzb2xpZD0iKTsKLQkJY2hhciB0bXBbXSA9ICIvdG1wL3Jhd2ZiX3NvbGlkLlhYWFhYWCI7Ci0JCWNoYXIgc3RyWzEwMF07Ci0JCXVuc2lnbmVkIGludCB2YWxzWzEwMjRdLCB2YWw7Ci0JCWludCB4LCB5LCBmZCwgdyA9IDEwMjQsIGggPSA3Njg7Ci0JCWlmIChzdHJzdHIobiwgIjB4IikpIHsKLQkJCWlmIChzc2NhbmYobiwgIjB4JXgiLCAmdmFsKSAhPSAxKSB7Ci0JCQkJdmFsID0gMDsKLQkJCX0KLQkJfQotCQlpZiAodmFsID09IDApIHsKLQkJCXZhbCA9IGdldF9waXhlbChuKTsKLQkJfQotCQlpZiAodmFsID09IDApIHsKLQkJCXZhbCA9IDB4RkYwMEZGOwotCQl9Ci0JCWZkID0gbWtzdGVtcCh0bXApOwotCQlmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0JCQlmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0JCQkJdmFsc1t4XSA9IHZhbDsKLQkJCX0KLQkJCXdyaXRlKGZkLCAoY2hhciAqKXZhbHMsIDQgKiB3KTsKLQkJfQotCQljbG9zZShmZCk7Ci0JCWZkID0gb3Blbih0bXAsIE9fV1JPTkxZKTsKLQkJdW5saW5rX21lID0gc3RyZHVwKHRtcCk7Ci0JCXNwcmludGYoc3RyLCAibWFwOiVzQCVkeCVkeDMyIiwgdG1wLCB3LCBoKTsKLQkJcnN0ciA9IHN0cmR1cChzdHIpOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHJzdHIsICJzd2lybCIpID09IHJzdHIpIHsKLQkJY2hhciB0bXBbXSA9ICIvdG1wL3Jhd2ZiX3N3aXJsLlhYWFhYWCI7Ci0JCWNoYXIgc3RyWzEwMF07Ci0JCXVuc2lnbmVkIGludCB2YWxbMTAyNF07Ci0JCXVuc2lnbmVkIGludCBjMSwgYzIsIGMzLCBjNDsKLQkJaW50IHgsIHksIGZkLCB3ID0gMTAyNCwgaCA9IDc2ODsKLQkJZmQgPSBta3N0ZW1wKHRtcCk7Ci0JCWZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLQkJCWZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLQkJCQljMSA9IDA7Ci0JCQkJYzIgPSAoKHgreSkqMTI4KS8odytoKTsKLQkJCQljMyA9ICh4KjEyOCkvdzsKLQkJCQljNCA9ICh5KjI1NikvaDsKLQkJCQl2YWxbeF0gPSAoYzEgPDwgMjQpIHwgKGMyIDw8IDE2KSB8IChjMyA8PCA4KSB8IChjNCA8PCAwKTsKLQkJCX0KLQkJCXdyaXRlKGZkLCAoY2hhciAqKXZhbCwgNCAqIHcpOwotCQl9Ci0JCWNsb3NlKGZkKTsKLQkJZmQgPSBvcGVuKHRtcCwgT19XUk9OTFkpOwotCQl1bmxpbmtfbWUgPSBzdHJkdXAodG1wKTsKLQkJc3ByaW50ZihzdHIsICJtYXA6JXNAJWR4JWR4MzIiLCB0bXAsIHcsIGgpOwotCQlyc3RyID0gc3RyZHVwKHN0cik7Ci0JfQotCi0KLQlpZiAoIChxID0gc3Ryc3RyKHJzdHIsICJzZXR1cDoiKSkgPT0gcnN0cikgewotCQlGSUxFICpwaXBlOwotCQljaGFyIGxpbmVbMTAyNF0sICp0OwotCi0JCXNldF9jaGlsZF9pbmZvKCk7Ci0JCXEgKz0gc3RybGVuKCJzZXR1cDoiKTsKLQkJLyogcmF3ZmItc2V0dXAgKi8KLQkJaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygicmF3ZmItc2V0dXAiKSkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJjYW5ub3QgcnVuIGV4dGVybmFsIGNvbW1hbmRzIGluIC1ub2NtZHMgIgotCQkJICAgICJtb2RlOlxuIik7Ci0JCQlyZmJMb2coIiAgIFwiJXNcIlxuIiwgcSk7Ci0JCQlyZmJMb2coIiAgIGV4aXRpbmcuXG4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmZiTG9nKCJydW5uaW5nIGNvbW1hbmQgdG8gc2V0dXAgcmF3ZmI6ICVzXG4iLCBxKTsKLQkJY2xvc2VfZXhlY19mZHMoKTsKLQkJcGlwZSA9IHBvcGVuKHEsICJyIik7Ci0JCWlmICghIHBpcGUpIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygicG9wZW4gb2Ygc2V0dXAgY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJCXJmYkxvZ1BlcnJvcigicG9wZW4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJbGluZVswXSA9ICdcMCc7Ci0JCWlmIChmZ2V0cyhsaW5lLCAxMDI0LCBwaXBlKSA9PSBOVUxMKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coInJlYWQgb2Ygc2V0dXAgY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcGNsb3NlKHBpcGUpOwotCQlzdHIgPSBzdHJkdXAobGluZSk7Ci0JCXQgPSBzdHI7Ci0JCXdoaWxlICgqdCAhPSAnXDAnKSB7Ci0JCQlpZiAoKnQgPT0gJ1xuJykgewotCQkJCSp0ID0gJ1wwJzsKLQkJCX0KLQkJCXQrKzsKLQkJfQotCQlyZmJMb2coInNldHVwIGNvbW1hbmQgcmV0dXJuZWQ6ICVzXG4iLCBzdHIpOwotCi0JfSBlbHNlIHsKLQkJc3RyID0gc3RyZHVwKHJzdHIpOwotCX0KLQotCXJhd19mYl9zaG0gPSAwOwotCXJhd19mYl9tbWFwID0gMDsKLQlyYXdfZmJfc2VlayA9IDA7Ci0JcmF3X2ZiX2ZkID0gLTE7Ci0JcmF3X2ZiX2FkZHIgPSBOVUxMOwotCXJhd19mYl9vZmZzZXQgPSAwOwotCXJhd19mYl9ieXRlc19wZXJfbGluZSA9IDA7Ci0JcmF3ZmJfdm5jX3JlZmxlY3QgPSAwOwotCi0JbGFzdF9tb2RlID0gMDsKLQlpZiAobGFzdF9maWxlKSB7Ci0JCWZyZWUobGFzdF9maWxlKTsKLQkJbGFzdF9maWxlID0gTlVMTDsKLQl9Ci0JaWYgKHN0cnN0cihzdHIsICJWaWRlbyIpID09IHN0cikgewotCQlpZiAocGlwZWlucHV0X3N0ciAhPSBOVUxMKSB7Ci0JCQlmcmVlKHBpcGVpbnB1dF9zdHIpOwotCQl9Ci0JCXBpcGVpbnB1dF9zdHIgPSBzdHJkdXAoIlZJRCIpOwotCQlpbml0aWFsaXplX3BpcGVpbnB1dCgpOwotCQlzdHJbMF0gPSAndic7Ci0JfQotCi0JaWYgKHN0cnN0cihzdHIsICJ2aWRlbyIpID09IHN0ciB8fCBzdHJzdHIoc3RyLCAiL2Rldi92aWRlbyIpID09IHN0cikgewotCQljaGFyICpzdHIyID0gdjRsX2d1ZXNzKHN0ciwgJnJhd19mYl9mZCk7Ci0JCWlmIChzdHIyID09IE5VTEwpIHsKLQkJCXJmYkxvZygidjRsX2d1ZXNzIGZhaWxlZCBmb3I6ICVzXG4iLCBzdHIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlzdHIgPSBzdHIyOwotCQlyZmJMb2coInY0bF9ndWVzcyByZXR1cm5lZDogJXNcbiIsIHN0cik7Ci0JCXJhd2ZiX2Rldl92aWRlbyA9IDE7Ci0JfSBlbHNlIGlmIChzdHJzdHIoc3RyLCAiZGV2L3ZpZGVvIikpIHsKLQkJcmF3ZmJfZGV2X3ZpZGVvID0gMTsKLQl9IGVsc2UgaWYgKHN0cnN0cihzdHIsICJjb25zb2xlIikgPT0gc3RyIHx8IHN0cnN0cihzdHIsICJmYiIpID09IHN0ciB8fAotCSAgICBzdHJzdHIoc3RyLCAiL2Rldi9mYiIpID09IHN0ciB8fCBzdHJzdHIoc3RyLCAidnQiKSA9PSBzdHIpIHsKLQkJY2hhciAqc3RyMiA9IGNvbnNvbGVfZ3Vlc3Moc3RyLCAmcmF3X2ZiX2ZkKTsKLQkJaWYgKHN0cjIgPT0gTlVMTCkgewotCQkJcmZiTG9nKCJjb25zb2xlX2d1ZXNzIGZhaWxlZCBmb3I6ICVzXG4iLCBzdHIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlzdHIgPSBzdHIyOwotCQlyZmJMb2coImNvbnNvbGVfZ3Vlc3MgcmV0dXJuZWQ6ICVzXG4iLCBzdHIpOwotCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgInZuYzoiKSA9PSBzdHIpIHsKLQkJY2hhciAqc3RyMiA9IHZuY19yZWZsZWN0X2d1ZXNzKHN0ciwgJnJhd19mYl9hZGRyKTsKLQotCQlyYXdmYl92bmNfcmVmbGVjdCA9IDE7Ci0JCWRvX3JlZmxlY3QgPSAxOwotCi0JCXN0ciA9IHN0cjI7Ci0JCXJmYkxvZygidm5jX3JlZmxlY3RvciBzZXQgcmF3ZmIgc3RyIHRvOiAlc1xuIiwgc3RyKTsKLQkJaWYgKHBpcGVpbnB1dF9zdHIgPT0gTlVMTCkgewotCQkJcGlwZWlucHV0X3N0ciA9IHN0cmR1cCgiVk5DIik7Ci0JCX0KLQkJaW5pdGlhbGl6ZV9waXBlaW5wdXQoKTsKLQl9Ci0KLQlpZiAoY2xvc2VkcHkgJiYgIXZpZXdfb25seSAmJiBnb3Rfbm92aWV3b25seSkgewotCQlyZmJMb2coIm5vdCBjbG9zaW5nIFggRElTUExBWSB1bmRlciAtbm92aWV3b25seSBvcHRpb24uXG4iKTsKLQkJY2xvc2VkcHkgPSAwOwotCQlpZiAoISB3aW5kb3cpIHsKLQkJCXdpbmRvdyA9IHJvb3R3aW47Ci0JCX0KLQl9Ci0KLQlpZiAoISByYXdfZmJfb3JpZ19kcHkgJiYgZHB5KSB7Ci0JCXJhd19mYl9vcmlnX2RweSA9IHN0cmR1cChEaXNwbGF5U3RyaW5nKGRweSkpOwotCX0KLSNpZm5kZWYgQk9MRExZX0NMT1NFX0RJU1BMQVkKLSNkZWZpbmUgQk9MRExZX0NMT1NFX0RJU1BMQVkgMQotI2VuZGlmCi0jaWYgQk9MRExZX0NMT1NFX0RJU1BMQVkKLQlpZiAoY2xvc2VkcHkpIHsKLQkJaWYgKGRweSkgewotCQkJcmZiTG9nKCJjbG9zaW5nIFggRElTUExBWTogJXMgaW4gcmF3ZmIgbW9kZS5cbiIsCi0JCQkgICAgRGlzcGxheVN0cmluZyhkcHkpKTsKLQkJCVhDbG9zZURpc3BsYXlfd3IoZHB5KTsJLyogeW93ISAqLwotCQl9Ci0JCWRweSA9IE5VTEw7Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIC1yYXdmYiBzaG06MTYzOTM4NDQyQDY0MHg0ODB4MzI6ZmYvZmYwMC9mZjAwMDArMzAwMAotCSAqIC1yYXdmYiBtYXA6L3BhdGgvdG8vZmlsZUA2NDB4NDgweDMyOmZmL2ZmMDAvZmYwMDAwCi0JICogLXJhd2ZiIGZpbGU6L3BhdGgvdG8vZmlsZUA2NDB4NDgweDMyOmZmL2ZmMDAvZmYwMDAwCi0JICovCi0KLQlpZiAocmF3X2ZiX2Z1bGxfc3RyKSB7Ci0JCWZyZWUocmF3X2ZiX2Z1bGxfc3RyKTsKLQl9Ci0JcmF3X2ZiX2Z1bGxfc3RyID0gc3RyZHVwKHN0cik7Ci0KLQotCS8qICtPIG9mZnNldCAqLwotCWlmICgocSA9IHN0cnJjaHIoc3RyLCAnKycpKSAhPSBOVUxMKSB7Ci0JCWlmIChzc2NhbmYocSwgIislZCIsICZyYXdfZmJfb2Zmc2V0KSA9PSAxKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0gZWxzZSB7Ci0JCQlyYXdfZmJfb2Zmc2V0ID0gMDsKLQkJfQotCX0KLQkvKiA6Ui9HL0IgbWFza3MgKi8KLQlpZiAoKHEgPSBzdHJyY2hyKHN0ciwgJzonKSkgIT0gTlVMTCkgewotCQlpZiAoc3NjYW5mKHEsICI6JWx4LyVseC8lbHgiLCAmcm0sICZnbSwgJmJtKSA9PSAzKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKHEsICI6MHglbHgvMHglbHgvMHglbHgiLCAmcm0sICZnbSwgJmJtKT09IDMpIHsKLQkJCSpxID0gJ1wwJzsKLQkJfSBlbHNlIGlmIChzc2NhbmYocSwgIjolbHUvJWx1LyVsdSIsICZybSwgJmdtLCAmYm0pID09IDMpIHsKLQkJCSpxID0gJ1wwJzsKLQkJfSBlbHNlIHsKLQkJCXJtID0gMDsKLQkJCWdtID0gMDsKLQkJCWJtID0gMDsKLQkJfQotCX0KLQlpZiAoKHEgPSBzdHJyY2hyKHN0ciwgJ0AnKSkgPT0gTlVMTCkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygiaW52YWxpZCByYXdmYiBzdHI6ICVzXG4iLCBzdHIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCWlmIChzdHJyY2hyKHEsICctJykpIHsKLQkJY2hhciAqcTIgPSBzdHJyY2hyKHEsICctJyk7Ci0JCXJhd19mYl9ieXRlc19wZXJfbGluZSA9IGF0b2kocTIrMSk7Ci0JCSpxMiA9ICdcMCc7Ci0JfQotCS8qIEBXeEh4QiAqLwotCWlmIChzc2NhbmYocSwgIkAlZHglZHglZCIsICZ3LCAmaCwgJmIpICE9IDMpIHsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlyZmJMb2coImludmFsaWQgcmF3ZmIgc3RyOiAlc1xuIiwgc3RyKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JKnEgPSAnXDAnOwotCi0JaWYgKHJtID09IDAgJiYgZ20gPT0gMCAmJiBibSA9PSAwKSB7Ci0JCS8qIGd1ZXNzIG1hc2tzLi4uICovCi0JCWlmIChiID09IDI0IHx8IGIgPT0gMzIpIHsKLQkJCXJtID0gMHhmZjAwMDA7Ci0JCQlnbSA9IDB4MDBmZjAwOwotCQkJYm0gPSAweDAwMDBmZjsKLQkJfSBlbHNlIGlmIChiID09IDE2KSB7Ci0JCQlybSA9IDB4ZjgwMDsKLQkJCWdtID0gMHgwN2UwOwotCQkJYm0gPSAweDAwMWY7Ci0JCX0gZWxzZSBpZiAoYiA9PSA4KSB7Ci0JCQlybSA9IDB4MDc7Ci0JCQlnbSA9IDB4Mzg7Ci0JCQlibSA9IDB4YzA7Ci0JCX0KLQl9Ci0JLyogd2UgY2FuIGZha2UgLWZsaXBieXRlb3JkZXIgdG8gc29tZSBkZWdyZWUuLi4gKi8KLQlpZiAoZmxpcF9ieXRlX29yZGVyKSB7Ci0JCWlmIChiID09IDI0IHx8IGIgPT0gMzIpIHsKLQkJCXRtID0gcm07Ci0JCQlybSA9IGJtOwotCQkJYm0gPSB0bTsKLQkJfSBlbHNlIGlmIChiID09IDE2KSB7Ci0JCQl1bnNpZ25lZCBzaG9ydCBzMSwgczI7Ci0JCQlzMSA9ICh1bnNpZ25lZCBzaG9ydCkgcm07Ci0JCQlzMiA9ICgoMHhmZiAmIHMxKSA8PCA4KSB8ICgoMHhmZjAwICYgczEpID4+IDgpOwotCQkJcm0gPSAodW5zaWduZWQgbG9uZykgczI7Ci0JCQlzMSA9ICh1bnNpZ25lZCBzaG9ydCkgZ207Ci0JCQlzMiA9ICgoMHhmZiAmIHMxKSA8PCA4KSB8ICgoMHhmZjAwICYgczEpID4+IDgpOwotCQkJZ20gPSAodW5zaWduZWQgbG9uZykgczI7Ci0JCQlzMSA9ICh1bnNpZ25lZCBzaG9ydCkgYm07Ci0JCQlzMiA9ICgoMHhmZiAmIHMxKSA8PCA4KSB8ICgoMHhmZjAwICYgczEpID4+IDgpOwotCQkJYm0gPSAodW5zaWduZWQgbG9uZykgczI7Ci0JCX0KLQl9Ci0KLQkvKiBuYXRpdmUgZmIgc3R1ZmYgZm9yIGJwcCA8IDggb25seSAqLwotCXJhd19mYl9uYXRpdmVfYnBwID0gYjsKLQlyYXdfZmJfbmF0aXZlX3JlZF9tYXNrID0gcm07Ci0JcmF3X2ZiX25hdGl2ZV9ncmVlbl9tYXNrID0gZ207Ci0JcmF3X2ZiX25hdGl2ZV9ibHVlX21hc2sgPSBibTsKLQlyYXdfZmJfbmF0aXZlX3JlZF9zaGlmdCA9IDEwMDsKLQlyYXdfZmJfbmF0aXZlX2dyZWVuX3NoaWZ0ID0gMTAwOwotCXJhd19mYl9uYXRpdmVfYmx1ZV9zaGlmdCA9IDEwMDsKLQlyYXdfZmJfbmF0aXZlX3JlZF9tYXggPSAxOwotCXJhd19mYl9uYXRpdmVfZ3JlZW5fbWF4ID0gMTsKLQlyYXdfZmJfbmF0aXZlX2JsdWVfbWF4ID0gMTsKLQltID0gMTsKLQlmb3IgKGk9MDsgaTwzMjsgaSsrKSAgewotCQlpZiAocmF3X2ZiX25hdGl2ZV9yZWRfbWFzayAmIG0pIHsKLQkJCWlmIChyYXdfZmJfbmF0aXZlX3JlZF9zaGlmdCA9PSAxMDApIHsKLQkJCQlyYXdfZmJfbmF0aXZlX3JlZF9zaGlmdCA9IGk7Ci0JCQl9Ci0JCQlyYXdfZmJfbmF0aXZlX3JlZF9tYXggKj0gMjsKLQkJfQotCQlpZiAocmF3X2ZiX25hdGl2ZV9ncmVlbl9tYXNrICYgbSkgewotCQkJaWYgKHJhd19mYl9uYXRpdmVfZ3JlZW5fc2hpZnQgPT0gMTAwKSB7Ci0JCQkJcmF3X2ZiX25hdGl2ZV9ncmVlbl9zaGlmdCA9IGk7Ci0JCQl9Ci0JCQlyYXdfZmJfbmF0aXZlX2dyZWVuX21heCAqPSAyOwotCQl9Ci0JCWlmIChyYXdfZmJfbmF0aXZlX2JsdWVfbWFzayAmIG0pIHsKLQkJCWlmIChyYXdfZmJfbmF0aXZlX2JsdWVfc2hpZnQgPT0gMTAwKSB7Ci0JCQkJcmF3X2ZiX25hdGl2ZV9ibHVlX3NoaWZ0ID0gaTsKLQkJCX0KLQkJCXJhd19mYl9uYXRpdmVfYmx1ZV9tYXggKj0gMjsKLQkJfQotCQltID0gbSA8PCAxOwotCX0KLQlyYXdfZmJfbmF0aXZlX3JlZF9tYXggLT0gMTsKLQlyYXdfZmJfbmF0aXZlX2dyZWVuX21heCAtPSAxOwotCXJhd19mYl9uYXRpdmVfYmx1ZV9tYXggLT0gMTsKLQotCWlmIChiIDwgOCkgewotCQkvKiBlLmcuIFZHQTE2ICovCi0JCXJmYkxvZygicmF3X2ZiX25hdGl2ZV9icHA6ICVkIDB4JTAybHggMHglMDJseCAweCUwMmx4ICVkLyVkLyVkICVkLyVkLyVkXG4iLCByYXdfZmJfbmF0aXZlX2JwcCwKLQkJICAgIHJhd19mYl9uYXRpdmVfcmVkX21hc2ssIHJhd19mYl9uYXRpdmVfZ3JlZW5fbWFzaywgcmF3X2ZiX25hdGl2ZV9ibHVlX21hc2ssCi0JCSAgICByYXdfZmJfbmF0aXZlX3JlZF9tYXgsIHJhd19mYl9uYXRpdmVfZ3JlZW5fbWF4LCByYXdfZmJfbmF0aXZlX2JsdWVfbWF4LAotCQkgICAgcmF3X2ZiX25hdGl2ZV9yZWRfc2hpZnQsIHJhd19mYl9uYXRpdmVfZ3JlZW5fc2hpZnQsIHJhd19mYl9uYXRpdmVfYmx1ZV9zaGlmdCk7Ci0JCXJhd19mYl9leHBhbmRfYnl0ZXMgPSAxOwotCQliID0gODsKLQkJcm0gPSAweDA3OwotCQlnbSA9IDB4Mzg7Ci0JCWJtID0gMHhjMDsKLQl9Ci0JLyogZW5kIG9mIHN0dWZmIGZvciBicHAgPCA4ICovCi0KLQlkcHlfeCA9IHdkcHlfeCA9IHc7Ci0JZHB5X3kgPSB3ZHB5X3kgPSBoOwotCW9mZl94ID0gMDsKLQlvZmZfeSA9IDA7Ci0KLQlpZiAocmF3ZmJfZGV2X3ZpZGVvKSB7Ci0JCWlmIChiID09IDI0KSB7Ci0JCQlyZmJMb2coImVuYWJsaW5nIC0yNHRvMzIgZm9yIDI0YnBwIHZpZGVvXG4iKTsKLQkJCXhmb3JtMjR0bzMyID0gMTsKLQkJfSBlbHNlIHsKLQkJCWlmICh4Zm9ybTI0dG8zMikgewotCQkJCXJmYkxvZygiZGlzYWJsaW5nIC0yNHRvMzIgZm9yIDI0YnBwIHZpZGVvXG4iKTsKLQkJCX0KLQkJCXhmb3JtMjR0bzMyID0gMDsKLQkJfQotCX0KLQotCWlmICh4Zm9ybTI0dG8zMikgewotCQlpZiAoYiAhPSAyNCkgewotCQkJcmZiTG9nKCJ3YXJuaW5nOiAtMjR0bzMyIG1vZGUgYW5kIGJwcD0lZFxuIiwgYik7Ci0JCX0KLQkJYiA9IDMyOwotCX0KLQlpZiAoc3Ryc3RyKHN0ciwgInNuYXA6IikgPT0gc3RyKSB7Ci0JCXVzZV9zbmFwZmIgPSAxOwotCQlzdHJbMF0gPSAnZic7IHN0clsxXSA9ICdpJzsgc3RyWzJdID0gJ2wnOyBzdHJbM10gPSAnZSc7Ci0JfQotCi0JaWYgKHN0cnN0cihzdHIsICJzaG06IikgIT0gc3RyICYmIHN0cnN0cihzdHIsICJtbWFwOiIpICE9IHN0ciAmJgotCSAgICBzdHJzdHIoc3RyLCAibWFwOiIpICE9IHN0ciAmJiBzdHJzdHIoc3RyLCAiZmlsZToiKSAhPSBzdHIpIHsKLQkJLyogaG1tbSwgbm90IGZvbGxvd2luZyBkaXJlY3Rpb25zLCBzZWUgaWYgbWFwOiBhcHBsaWVzICovCi0JCXN0cnVjdCBzdGF0IHNidWY7Ci0JCWlmIChzdGF0KHN0ciwgJnNidWYpID09IDApIHsKLQkJCWNoYXIgKm5ld3N0cjsKLQkJCWludCBsZW4gPSBzdHJsZW4oIm1hcDoiKSArIHN0cmxlbihzdHIpICsgMTsKLQkJCXJmYkxvZygibm8gdHlwZSBwcmVmaXg6ICVzXG4iLCByYXdfZmJfc3RyKTsKLQkJCXJmYkxvZygiICBidXQgZmlsZSBleGlzdHMsIHNvIGFzc3VtaW5nOiBtYXA6JXNcbiIsCi0JCQkgICAgcmF3X2ZiX3N0cik7Ci0JCQluZXdzdHIgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQkJCXN0cmNweShuZXdzdHIsICJtYXA6Iik7Ci0JCQlzdHJjYXQobmV3c3RyLCBzdHIpOwotCQkJZnJlZShzdHIpOwotCQkJc3RyID0gbmV3c3RyOwotCQl9Ci0JfQotCi0JaWYgKHNzY2FuZihzdHIsICJzaG06JWQiLCAmc2htaWQpID09IDEpIHsKLQkJLyogc2htOk4gKi8KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YU0hNIHx8IExJQlZOQ1NFUlZFUl9IQVZFX1NITUFUCi0JCXJhd19mYl9hZGRyID0gKGNoYXIgKikgc2htYXQoc2htaWQsIDAsIFNITV9SRE9OTFkpOwotCQlpZiAoISByYXdfZmJfYWRkcikgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJmYWlsZWQgdG8gYXR0YWNoIHRvIHNobTogJWQsICVzXG4iLCBzaG1pZCwgc3RyKTsKLQkJCXJmYkxvZ1BlcnJvcigic2htYXQiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmF3X2ZiX3NobSA9IDE7Ci0JCXJmYkxvZygicmF3ZmI6IHNobTogJWQgVzogJWQgSDogJWQgQjogJWQgYWRkcjogJXBcbiIsCi0JCSAgICBzaG1pZCwgdywgaCwgYiwgcmF3X2ZiX2FkZHIpOwotCQlsYXN0X21vZGUgPSBSQVdGQl9TSE07Ci0jZWxzZQotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygieDExdm5jIHdhcyBjb21waWxlZCB3aXRob3V0IHNobSBzdXBwb3J0LlxuIik7Ci0JCXJmYkxvZ1BlcnJvcigic2htYXQiKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLSNlbmRpZgotCX0gZWxzZSBpZiAoc3Ryc3RyKHN0ciwgIm1hcDoiKSA9PSBzdHIgfHwgc3Ryc3RyKHN0ciwgIm1tYXA6IikgPT0gc3RyCi0JICAgIHx8IHN0cnN0cihzdHIsICJmaWxlOiIpID09IHN0cikgewotCQkvKiBtYXA6L3BhdGgvLi4uIG9yIGZpbGU6L3BhdGggICovCi0JCWludCBmZCwgZG9fbW1hcCA9IDEsIHNpemU7Ci0JCXN0cnVjdCBzdGF0IHNidWY7Ci0KLQkJaWYgKCpzdHIgPT0gJ2YnKSB7Ci0JCQlkb19tbWFwID0gMDsKLQkJfQotCQlxID0gc3RyY2hyKHN0ciwgJzonKTsKLQkJcSsrOwotCi0JCW1hY29zeF9jb25zb2xlID0gMDsKLQkJaWYgKHN0cnN0cihxLCAibWFjb3N4OiIpID09IHEpIHsKLQkJCS8qIG1tYXA6bWFjb3N4Oi9kZXYvbnVsbEAuLi4gKi8KLQkJCXEgKz0gc3RybGVuKCJtYWNvc3g6Iik7CQkJCi0JCQlkb19tYWNvc3ggPSAxOwotCQkJZG9fbW1hcCA9IDA7Ci0JCQltYWNvc3hfY29uc29sZSA9IDE7Ci0JCX0KLQotCQlsYXN0X2ZpbGUgPSBzdHJkdXAocSk7Ci0KLQkJZmQgPSByYXdfZmJfZmQ7Ci0JCWlmIChmZCA8IDAgJiYgcmF3ZmJfZGV2X3ZpZGVvKSB7Ci0JCQlmZCA9IG9wZW4ocSwgT19SRFdSKTsKLQkJfQotCQlpZiAoZmQgPCAwKSB7Ci0JCQlmZCA9IG9wZW4ocSwgT19SRE9OTFkpOwotCQl9Ci0JCWlmIChmZCA8IDApIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiZmFpbGVkIHRvIG9wZW4gZmlsZTogJXMsICVzXG4iLCBxLCBzdHIpOwotCQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JCQlsaW51eF9kZXZfZmJfbXNnKHEpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlyYXdfZmJfZmQgPSBmZDsKLQotCQlpZiAocmF3X2ZiX25hdGl2ZV9icHAgPCA4KSB7Ci0JCQlzaXplID0gdypoKnJhd19mYl9uYXRpdmVfYnBwLzggKyByYXdfZmJfb2Zmc2V0OwotCQl9IGVsc2UgaWYgKHhmb3JtMjR0bzMyKSB7Ci0JCQlzaXplID0gdypoKjI0LzggKyByYXdfZmJfb2Zmc2V0OwotCQl9IGVsc2UgewotCQkJc2l6ZSA9IHcqaCpiLzggKyByYXdfZmJfb2Zmc2V0OwotCQl9Ci0JCWlmIChmc3RhdChmZCwgJnNidWYpID09IDApIHsKLQkJCWlmIChTX0lTUkVHKHNidWYuc3RfbW9kZSkpIHsKLQkJCQlpZiAoMCkgc2l6ZSA9IHNidWYuc3Rfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJyYXcgZmIgaXMgbm9uLXJlZ3VsYXIgZmlsZTogJXNcbiIsIHEpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRvX21hY29zeCkgewotCQkJcmF3X2ZiX2FkZHIgPSBtYWNvc3hfZ2V0X2ZiX2FkZHIoKTsKLQkJCXJhd19mYl9tbWFwID0gc2l6ZTsKLQkJCXJmYkxvZygicmF3ZmI6IG1hY29zeCBmYjogJXNcbiIsIHEpOwotCQkJcmZiTG9nKCIgICB3OiAlZCBoOiAlZCBiOiAlZCBhZGRyOiAlcCBzejogJWRcbiIsIHcsIGgsCi0JCQkgICAgYiwgcmF3X2ZiX2FkZHIsIHNpemUpOwotCQkJbGFzdF9tb2RlID0gMDsKLQkJfSBlbHNlIGlmIChkb19yZWZsZWN0KSB7Ci0JCQlyYXdfZmJfbW1hcCA9IHNpemU7Ci0JCQlyZmJMb2coInJhd2ZiOiB2bmMgZmI6ICVzXG4iLCBxKTsKLQkJCXJmYkxvZygiICAgdzogJWQgaDogJWQgYjogJWQgYWRkcjogJXAgc3o6ICVkXG4iLCB3LCBoLAotCQkJICAgIGIsIHJhd19mYl9hZGRyLCBzaXplKTsKLQkJCWxhc3RfbW9kZSA9IDA7Ci0KLQkJfSBlbHNlIGlmIChkb19tbWFwKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTU1BUAotCQkJcmF3X2ZiX2FkZHIgPSBtbWFwKDAsIHNpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwKLQkJCSAgICBmZCwgMCk7Ci0KLQkJCWlmIChyYXdfZmJfYWRkciA9PSBNQVBfRkFJTEVEIHx8IHJhd19mYl9hZGRyID09IE5VTEwpIHsKLQkJCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQkJcmZiTG9nKCJmYWlsZWQgdG8gbW1hcCBmaWxlOiAlcywgJXNcbiIsIHEsIHN0cik7Ci0JCQkJcmZiTG9nKCIgICByYXdfZmJfYWRkcjogJXBcbiIsIHJhd19mYl9hZGRyKTsKLQkJCQlyZmJMb2dQZXJyb3IoIm1tYXAiKTsKLQotCQkJCXJhd19mYl9hZGRyID0gTlVMTDsKLQkJCQlyZmJMb2coIm1tYXAoMikgZmFpbGVkLCB0cnlpbmcgc2xvd2VyIGxzZWVrKDIpXG4iKTsKLQkJCQlyYXdfZmJfc2VlayA9IHNpemU7Ci0JCQkJbGFzdF9tb2RlID0gUkFXRkJfRklMRTsKLQotCQkJfSBlbHNlIHsKLQkJCQlyYXdfZmJfbW1hcCA9IHNpemU7Ci0KLQkJCQlyZmJMb2coInJhd2ZiOiBtbWFwIGZpbGU6ICVzXG4iLCBxKTsKLQkJCQlyZmJMb2coIiAgIHc6ICVkIGg6ICVkIGI6ICVkIGFkZHI6ICVwIHN6OiAlZFxuIiwgdywgaCwKLQkJCQkgICAgYiwgcmF3X2ZiX2FkZHIsIHNpemUpOwotCQkJCWxhc3RfbW9kZSA9IFJBV0ZCX01NQVA7Ci0JCQl9Ci0jZWxzZQotCQkJcmZiTG9nKCJtbWFwKDIpIG5vdCBzdXBwb3J0ZWQgb24gc3lzdGVtLCB1c2luZyIKLQkJCSAgICAiIHNsb3dlciBsc2VlaygyKVxuIik7Ci0JCQlyYXdfZmJfc2VlayA9IHNpemU7Ci0JCQlsYXN0X21vZGUgPSBSQVdGQl9GSUxFOwotI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlyYXdfZmJfc2VlayA9IHNpemU7Ci0JCQlsYXN0X21vZGUgPSBSQVdGQl9GSUxFOwotCi0JCQlyZmJMb2coInJhd2ZiOiBzZWVrIGZpbGU6ICVzXG4iLCBxKTsKLQkJCXJmYkxvZygiICAgVzogJWQgSDogJWQgQjogJWQgc3o6ICVkXG4iLCB3LCBoLCBiLCBzaXplKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJmYkxvZ0VuYWJsZSgxKTsKLQkJcmZiTG9nKCJpbnZhbGlkIHJhd2ZiIHN0cjogJXNcbiIsIHN0cik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCi0JaWYgKHVubGlua19tZSkgewotCQl1bmxpbmsodW5saW5rX21lKTsKLQl9Ci0KLQlpZiAoISByYXdfZmJfaW1hZ2UpIHsKLQkJcmF3X2ZiX2ltYWdlID0gJnhpbWFnZV9zdHJ1Y3Q7Ci0JfQotCi0JaW5pdGlhbGl6ZV9jbGlwc2hpZnQoKTsKLQotCWlmIChyYXdfZmJfYnl0ZXNfcGVyX2xpbmUgPT0gMCkgewotCQlyYXdfZmJfYnl0ZXNfcGVyX2xpbmUgPSBkcHlfeCpiLzg7Ci0KLQkJLyoKLQkJICogUHV0IGNhc2VzIGhlcmUgd2VyZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQKLQkJICogcmF3X2J5dGVzX3Blcl9saW5lICE9IGRweV94KmIvOAotCQkgKi8KLSNpZmRlZiBNQUNPU1gKLQkJaWYgKGRvX21hY29zeCkgewotCQkJcmF3X2ZiX2J5dGVzX3Blcl9saW5lID0gbWFjb3N4Q0dfQ0dEaXNwbGF5Qnl0ZXNQZXJSb3coKTsKLQkJfQotI2VuZGlmCi0JfQotCi0JcmF3X2ZiX2ltYWdlLT5ieXRlc19wZXJfbGluZSA9IGRweV94ICogYi84OwotCXJhd19mYiA9IChjaGFyICopIG1hbGxvYyhkcHlfeSAqIGRweV94ICogYi84KTsKLQlyYXdfZmJfaW1hZ2UtPmRhdGEgPSByYXdfZmI7Ci0JcmF3X2ZiX2ltYWdlLT5mb3JtYXQgPSBaUGl4bWFwOwotCXJhd19mYl9pbWFnZS0+d2lkdGggID0gZHB5X3g7Ci0JcmF3X2ZiX2ltYWdlLT5oZWlnaHQgPSBkcHlfeTsKLQlyYXdfZmJfaW1hZ2UtPmJpdHNfcGVyX3BpeGVsID0gYjsKLQlyYXdfZmJfaW1hZ2UtPmJpdG1hcF91bml0ID0gLTE7Ci0KLQotCWlmICh1c2Vfc25hcGZiICYmIChyYXdfZmJfc2VlayB8fCByYXdfZmJfbW1hcCkpIHsKLQkJaW50IGJfdXNlID0gYjsKLQkJaWYgKHNuYXBfZmIpIHsKLQkJCWZyZWUoc25hcF9mYik7Ci0JCX0KLQkJaWYgKGJfdXNlID09IDMyICYmIHhmb3JtMjR0bzMyKSB7Ci0JCQkvKgotCQkJICogVGhlIGFjdHVhbCBmcmFtZWJ1ZmZlciAoZS5nLiBtYXBwZWQgYWRkcikgYW5kCi0JCQkgKiBzbmFwIGZiIG11c3QgYmUgdGhlIHNhbWUgYnBwLiAgRS5nLiBib3RoIDI0YnBwLgotCQkJICogUmVhZGluZyBGUk9NIHNuYXAgdG8gdXRpbGl0eSBpbWFnZSB3aWxsIGJlCi0JCQkgKiB0cmFuc2Zvcm1lZCAyNC0+MzIgaW4gY29weV9yYXdfZmJfMjRfdG9fMzIuCi0JCQkgKgotCQkJICogYWRkciAtPiBzbmFwIC0+IChzY2FubGluZSwgZnVsbHNjcmVlbiwgLi4uKQotCQkJICovCi0JCQliX3VzZSA9IDI0OwotCQkJcmF3X2ZiX2J5dGVzX3Blcl9saW5lID0gZHB5X3ggKiBiX3VzZS84OwotCQl9Ci0JCXNuYXBfZmIgPSAoY2hhciAqKSBtYWxsb2MoZHB5X3kgKiBkcHlfeCAqIGJfdXNlLzgpOwotCQlzbmFwID0gJnhpbWFnZV9zdHJ1Y3Rfc25hcDsKLQkJc25hcC0+ZGF0YSA9IHNuYXBfZmI7Ci0JCXNuYXAtPmZvcm1hdCA9IFpQaXhtYXA7Ci0JCXNuYXAtPndpZHRoICA9IGRweV94OwotCQlzbmFwLT5oZWlnaHQgPSBkcHlfeTsKLQkJc25hcC0+Yml0c19wZXJfcGl4ZWwgPSBiX3VzZTsKLQkJc25hcC0+Ynl0ZXNfcGVyX2xpbmUgPSBkcHlfeCAqIGJfdXNlLzg7Ci0JCXNuYXAtPmJpdG1hcF91bml0ID0gLTE7Ci0JfQotCi0KLQlyYXdfZmJfaW1hZ2UtPnJlZF9tYXNrID0gcm07Ci0JcmF3X2ZiX2ltYWdlLT5ncmVlbl9tYXNrID0gZ207Ci0JcmF3X2ZiX2ltYWdlLT5ibHVlX21hc2sgPSBibTsKLQotCXJhd19mYl9pbWFnZS0+ZGVwdGggPSAwOwotCW0gPSAxOwotCWZvciAoaT0wOyBpPDMyOyBpKyspICB7Ci0JCWlmIChybSAmIG0pIHsKLQkJCXJhd19mYl9pbWFnZS0+ZGVwdGgrKzsKLQkJfQotCQlpZiAoZ20gJiBtKSB7Ci0JCQlyYXdfZmJfaW1hZ2UtPmRlcHRoKys7Ci0JCX0KLQkJaWYgKGJtICYgbSkgewotCQkJcmF3X2ZiX2ltYWdlLT5kZXB0aCsrOwotCQl9Ci0JCW0gPSBtIDw8IDE7Ci0JfQotCWlmIChyYXdfZmJfbmF0aXZlX2JwcCA8IDgpIHsKLQkJcmF3X2ZiX2ltYWdlLT5kZXB0aCA9IHJhd19mYl9leHBhbmRfYnl0ZXMgKiA4OwotCX0KLQlpZiAoISByYXdfZmJfaW1hZ2UtPmRlcHRoKSB7IAotCQlyYXdfZmJfaW1hZ2UtPmRlcHRoID0gKGIgPT0gMzIpID8gMjQgOiBiOwotCX0KLQotCWRlcHRoID0gcmF3X2ZiX2ltYWdlLT5kZXB0aDsKLQotCWlmIChyYXdfZmJfaW1hZ2UtPmRlcHRoID09IDE1KSB7Ci0JCS8qIHVucmVzb2x2ZWQgYnVnIHdpdGggUkdCNTU1Li4uICovCi0JCWRlcHRoKys7Ci0JfQotCi0JaWYgKGNsaXBzaGlmdCB8fCByYXdfZmJfbmF0aXZlX2JwcCA8IDgpIHsKLQkJbWVtc2V0KHJhd19mYiwgMHhmZiwgZHB5X3kgKiByYXdfZmJfaW1hZ2UtPmJ5dGVzX3Blcl9saW5lKTsKLQl9IGVsc2UgaWYgKHJhd19mYl9hZGRyICYmICEgeGZvcm0yNHRvMzIpIHsKLQkJbWVtY3B5KHJhd19mYiwgcmF3X2ZiX2FkZHIgKyByYXdfZmJfb2Zmc2V0LCBkcHlfeSAqIHJhd19mYl9pbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpOwotCX0gZWxzZSB7Ci0JCW1lbXNldChyYXdfZmIsIDB4ZmYsIGRweV95ICogcmF3X2ZiX2ltYWdlLT5ieXRlc19wZXJfbGluZSk7Ci0JfQotCi0JaWYgKHZlcmJvc2UpIHsKLQkJcmZiTG9nKCJcbiIpOwotCQlyZmJMb2coInJhd2ZiOiAgcmF3X2ZiICAlcFxuIiwgcmF3X2ZiKTsKLQkJcmZiTG9nKCIgICAgICAgIGZvcm1hdCAgJWRcbiIsIHJhd19mYl9pbWFnZS0+Zm9ybWF0KTsKLQkJcmZiTG9nKCIgICAgICAgIHdpZHRoICAgJWRcbiIsIHJhd19mYl9pbWFnZS0+d2lkdGgpOwotCQlyZmJMb2coIiAgICAgICAgaGVpZ2h0ICAlZFxuIiwgcmF3X2ZiX2ltYWdlLT5oZWlnaHQpOwotCQlyZmJMb2coIiAgICAgICAgYnBwICAgICAlZFxuIiwgcmF3X2ZiX2ltYWdlLT5iaXRzX3Blcl9waXhlbCk7Ci0JCXJmYkxvZygiICAgICAgICBkZXB0aCAgICVkXG4iLCByYXdfZmJfaW1hZ2UtPmRlcHRoKTsKLQkJcmZiTG9nKCIgICAgICAgIGJwbCAgICAgJWRcbiIsIHJhd19mYl9pbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpOwotCQlpZiAodXNlX3NuYXBmYiAmJiBzbmFwX2ZiKSB7Ci0JCQlyZmJMb2coIiAgICAgICAgc25hcF9mYiAlcFxuIiwgc25hcF9mYik7Ci0JCX0KLQl9Ci0KLQlmcmVlKHN0cik7Ci0KLQlyZXR1cm4gcmF3X2ZiX2ltYWdlOwotfQotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX2NsaXBzaGlmdCh2b2lkKSB7Ci0JY2xpcHNoaWZ0ID0gMDsKLQljZHB5X3ggPSBjZHB5X3kgPSBjb2ZmX3ggPSBjb2ZmX3kgPSAwOwotCWlmIChjbGlwX3N0cikgewotCQlpbnQgdywgaCwgeCwgeSwgYmFkID0gMDsKLQkJaWYgKHBhcnNlX2dlb20oY2xpcF9zdHIsICZ3LCAmaCwgJngsICZ5LCB3ZHB5X3gsIHdkcHlfeSkpIHsKLQkJCWlmICh4IDwgMCkgewotCQkJCXggPSAwOwotCQkJfQotCQkJaWYgKHkgPCAwKSB7Ci0JCQkJeSA9IDA7Ci0JCQl9Ci0JCQlpZiAoeCArIHcgPiB3ZHB5X3gpIHsKLQkJCQl3ID0gd2RweV94IC0geDsKLQkJCX0KLQkJCWlmICh5ICsgaCA+IHdkcHlfeSkgewotCQkJCWggPSB3ZHB5X3kgLSB5OwotCQkJfQotCQkJaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKLQkJCQliYWQgPSAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmFkID0gMTsKLQkJfQotCQlpZiAoYmFkKSB7Ci0JCQlyZmJMb2coIioqKiBpZ25vcmluZyBpbnZhbGlkIC1jbGlwIFd4SCtYK1k6ICVzXG4iLAotCQkJICAgIGNsaXBfc3RyKTsgCi0JCX0gZWxzZSB7Ci0JCQkvKiBPSywgY2hhbmdlIGdlb20gYmVoaW5kIGV2ZXJ5b25lJ3MgYmFjay4uLiAqLwotCQkJY2RweV94ID0gdzsKLQkJCWNkcHlfeSA9IGg7Ci0JCQljb2ZmX3ggPSB4OwotCQkJY29mZl95ID0geTsKLQotCQkJY2xpcHNoaWZ0ID0gMTsKLQotCQkJZHB5X3ggPSBjZHB5X3g7Ci0JCQlkcHlfeSA9IGNkcHlfeTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCB3YWl0X3VudGlsX21hcHBlZChXaW5kb3cgd2luKSB7Ci0jaWYgTk9fWDExCi0JaWYgKCF3aW4pIHt9Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCWludCBtcyA9IDUwLCB3YWl0dGltZSA9IDMwOwotCXRpbWVfdCBzdGFydCA9IHRpbWUoTlVMTCk7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQotCXdoaWxlICgxKSB7Ci0JCWlmICghIHZhbGlkX3dpbmRvdyh3aW4sIE5VTEwsIDApKSB7Ci0JCQlpZiAodGltZShOVUxMKSA+IHN0YXJ0ICsgd2FpdHRpbWUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXVzbGVlcChtcyAqIDEwMDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGRweSAmJiAhIFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGRweSwgd2luLCAmYXR0cikpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChhdHRyLm1hcF9zdGF0ZSA9PSBJc1ZpZXdhYmxlKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQl1c2xlZXAobXMgKiAxMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiBpbml0aWFsaXplIGEgZmIgZm9yIHRoZSBYIGRpc3BsYXkKLSAqLwotWEltYWdlICppbml0aWFsaXplX3hkaXNwbGF5X2ZiKHZvaWQpIHsKLSNpZiBOT19YMTEKLQlpZiAocmF3X2ZiX3N0cikgewotCQlyZXR1cm4gaW5pdGlhbGl6ZV9yYXdfZmIoMCk7Ci0JfQotCXJldHVybiBOVUxMOwotI2Vsc2UKLQlYSW1hZ2UgKmZiOwotCWNoYXIgKnZpc19zdHIgPSB2aXN1YWxfc3RyOwotCWludCB0cnkgPSAwLCBzdWJ3aW5fdHJpZXMgPSAzOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCWludCBzdWJ3aW5fYnM7Ci0KLQlpZiAocmF3X2ZiX3N0cikgewotCQlyZXR1cm4gaW5pdGlhbGl6ZV9yYXdfZmIoMCk7Ci0JfQotCi0JWF9MT0NLOwotCWlmIChzdWJ3aW4pIHsKLQkJaWYgKHN1Yndpbl93YWl0X21hcHBlZCkgewotCQkJd2FpdF91bnRpbF9tYXBwZWQoc3Vid2luKTsKLQkJfQotCQlpZiAoIXZhbGlkX3dpbmRvdygoV2luZG93KSBzdWJ3aW4sIE5VTEwsIDApKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coImludmFsaWQgc3ViLXdpbmRvdzogMHglbHhcbiIsIHN1Yndpbik7Ci0JCQlYX1VOTE9DSzsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQl9Ci0JCi0JaWYgKG92ZXJsYXkpIHsKLQkJLyogCi0JCSAqIGlkZWFsbHkgd2UnZCBsaWtlIHRvIG5vdCBoYXZlIHRvIGNvb2sgdXAgdGhlCi0JCSAqIHZpc3VhbCB2YXJpYWJsZXMgYnV0IHJhdGhlciBsZXQgaXQgYWxsIGNvbWUgb3V0Ci0JCSAqIG9mIFhSZWFkU2NyZWVuKCksIGhvd2V2ZXIgdGhlcmUgaXMgbm8gd2F5IHRvIGdldAotCQkgKiBhIGRlZmF1bHQgdmlzdWFsIG91dCBvZiBpdCwgc28gd2UgcHJldGVuZCAtdmlzdWFsCi0JCSAqIFRydWVDb2xvcjpOTiB3YXMgc3VwcGxpZWQgd2l0aCBOTiB1c3VhbGx5IDI0LgotCQkgKi8KLQkJY2hhciBzdHJbMzJdOwotCQlXaW5kb3cgdHdpbiA9IHN1YndpbiA/IHN1YndpbiA6IHJvb3R3aW47Ci0JCVhJbWFnZSAqeGk7Ci0KLQkJeGkgPSB4cmVhZHNjcmVlbihkcHksIHR3aW4sIDAsIDAsIDgsIDgsIEZhbHNlKTsKLQkJc3ByaW50ZihzdHIsICJUcnVlQ29sb3I6JWQiLCB4aS0+ZGVwdGgpOwotCQlpZiAoeGktPmRlcHRoICE9IDI0ICYmICEgcXVpZXQpIHsKLQkJCXJmYkxvZygid2FybmluZzogb3ZlcmxheSBpbWFnZSBoYXMgZGVwdGggJWQgIgotCQkJICAgICJpbnN0ZWFkIG9mIDI0LlxuIiwgeGktPmRlcHRoKTsKLQkJfQotCQlYRGVzdHJveUltYWdlKHhpKTsKLQkJaWYgKHZpc3VhbF9zdHIgIT0gTlVMTCAmJiAhIHF1aWV0KSB7Ci0JCQlyZmJMb2coIndhcm5pbmc6IHJlcGxhY2luZyAnLXZpc3VhbCAlcycgYnkgJyVzJyAiCi0JCQkgICAgImZvciB1c2Ugd2l0aCAtb3ZlcmxheVxuIiwgdmlzdWFsX3N0ciwgc3RyKTsKLQkJfQotCQl2aXNfc3RyID0gc3RyZHVwKHN0cik7Ci0JfQotCi0JaWYgKHhmb3JtMjR0bzMyKSB7Ci0JCWlmIChEZWZhdWx0RGVwdGgoZHB5LCBzY3IpID09IDI0KSB7Ci0JCQl2aXNfc3RyID0gc3RyZHVwKCJUcnVlQ29sb3I6MzIiKTsKLQkJCXJmYkxvZygiaW5pdGlhbGl6ZV94ZGlzcGxheV9mYjogdmlzX3N0ciBzZXQgdG86ICVzXG4iLAotCQkJICAgIHZpc19zdHIpOwotCQkJdmlzdWFsX2lkID0gKFZpc3VhbElEKSAwOwotCQkJdmlzdWFsX2RlcHRoID0gMDsKLQkJCXNldF92aXN1YWxfc3RyX3RvX3NvbWV0aGluZyA9IDE7Ci0JCX0KLQl9IGVsc2UgaWYgKERlZmF1bHREZXB0aChkcHksIHNjcikgPCA4KSB7Ci0JCS8qIGNoZWNrIHZlcnkgbG93IGJwcCBjYXNlLCBlLmcuIG1vbm8gb3IgdmdhMTYgKi8KLQkJU2NyZWVuICpzID0gRGVmYXVsdFNjcmVlbk9mRGlzcGxheShkcHkpOwotCQlYSW1hZ2UgKnhpID0gWEdldEltYWdlX3dyKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgMCwgMCwgMiwgMiwgQWxsUGxhbmVzLAotCQkgICAgWlBpeG1hcCk7Ci0JCWlmICh4aSAmJiB4aS0+Yml0c19wZXJfcGl4ZWwgPCA4KSB7Ci0JCQlpbnQgbG93YnBwID0geGktPmJpdHNfcGVyX3BpeGVsOyAKLQkJCWlmICghdmlzX3N0cikgewotCQkJCWNoYXIgdG1wWzMyXTsKLQkJCQlzcHJpbnRmKHRtcCwgIjB4JXg6OCIsIChpbnQpIHMtPnJvb3RfdmlzdWFsLT52aXN1YWxpZCk7Ci0JCQkJdmlzX3N0ciA9IHN0cmR1cCh0bXApOwotCQkJCXJmYkxvZygiaW5pdGlhbGl6ZV94ZGlzcGxheV9mYjogbG93IGJwcFslZF0sIHZpc19zdHIgIgotCQkJCSAgICAic2V0IHRvOiAlc1xuIiwgbG93YnBwLCB2aXNfc3RyKTsKLQkJCX0KLQkJCWlmICh1c2luZ19zaG0pIHsKLQkJCQl1c2luZ19zaG0gPSAwOwotCQkJCXJmYkxvZygiaW5pdGlhbGl6ZV94ZGlzcGxheV9mYjogbG93IGJwcFslZF0sICIKLQkJCQkgICAgImRpc2FibGluZyBzaG1cbiIsIGxvd2JwcCk7Ci0JCQl9Ci0JCQl2aXN1YWxfaWQgPSAoVmlzdWFsSUQpIDA7Ci0JCQl2aXN1YWxfZGVwdGggPSAwOwotCQkJc2V0X3Zpc3VhbF9zdHJfdG9fc29tZXRoaW5nID0gMTsKLQkJfQotCQlpZiAoeGkpIHsKLQkJCVhEZXN0cm95SW1hZ2UoeGkpOwotCQl9Ci0JfQotCi0JaWYgKHZpc19zdHIgIT0gTlVMTCkgewotCQlzZXRfdmlzdWFsKHZpc19zdHIpOwotCQlpZiAodmlzX3N0ciAhPSB2aXN1YWxfc3RyKSB7Ci0JCQlmcmVlKHZpc19zdHIpOwotCQl9Ci0JfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAidmlzX3N0ciAlc1xuIiwgdmlzX3N0ciA/IHZpc19zdHIgOiAibm90c2V0Iik7Ci0KLQkvKiBzZXQgdXAgcGFyYW1ldGVycyBmb3Igc3Vid2luIG9yIG5vbi1zdWJ3aW4gY2FzZXM6ICovCi0KLQlhZ2FpbjoKLQotCWlmICghIHN1YndpbikgewotCQkvKiBmdWxsIHNjcmVlbiAqLwotCQl3aW5kb3cgPSByb290d2luOwotCQlkcHlfeCA9IHdkcHlfeCA9IERpc3BsYXlXaWR0aChkcHksIHNjcik7Ci0JCWRweV95ID0gd2RweV95ID0gRGlzcGxheUhlaWdodChkcHksIHNjcik7Ci0JCW9mZl94ID0gMDsKLQkJb2ZmX3kgPSAwOwotCQkvKiB0aGlzIG1heSBiZSBvdmVycmlkZGVuIHZpYSB2aXN1YWxfaWQgYmVsb3cgKi8KLQkJZGVmYXVsdF92aXN1YWwgPSBEZWZhdWx0VmlzdWFsKGRweSwgc2NyKTsKLQl9IGVsc2UgewotCQkvKiBzaW5nbGUgd2luZG93ICovCi0JCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0KLQkJd2luZG93ID0gKFdpbmRvdykgc3Vid2luOwotCQlpZiAoISBYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIHdpbmRvdywgJmF0dHIpKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coImludmFsaWQgd2luZG93OiAweCVseFxuIiwgd2luZG93KTsKLQkJCVhfVU5MT0NLOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlkcHlfeCA9IHdkcHlfeCA9IGF0dHIud2lkdGg7Ci0JCWRweV95ID0gd2RweV95ID0gYXR0ci5oZWlnaHQ7Ci0KLQkJc3Vid2luX2JzID0gYXR0ci5iYWNraW5nX3N0b3JlOwotCi0JCS8qIHRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdmlhIHZpc3VhbF9pZCBiZWxvdyAqLwotCQlkZWZhdWx0X3Zpc3VhbCA9IGF0dHIudmlzdWFsOwotCi0JCVhfVU5MT0NLOwotCQlzZXRfb2Zmc2V0KCk7Ci0JCVhfTE9DSzsKLQl9Ci0KLQlpbml0aWFsaXplX2NsaXBzaGlmdCgpOwotCi0JLyogaW5pdGlhbGl6ZSBkZXB0aCB0byByZWFzb25hYmxlIHZhbHVlLCB2aXN1YWxfaWQgbWF5IG92ZXJyaWRlICovCi0JZGVwdGggPSBEZWZhdWx0RGVwdGgoZHB5LCBzY3IpOwotCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJEZWZhdWx0RGVwdGg6ICVkICB2aXNpYWxfaWQ6ICVkXG4iLCBkZXB0aCwgKGludCkgdmlzdWFsX2lkKTsKLQotCWlmICh2aXN1YWxfaWQpIHsKLQkJaW50IG47Ci0JCVhWaXN1YWxJbmZvIHZpbmZvX3RtcGwsICp2aW5mbzsKLQotCQkvKgotCQkgKiB3ZSBhcmUgaW4gaGVyZSBmcm9tIC12aXN1YWwgb3IgLW92ZXJsYXkgb3B0aW9ucwotCQkgKiB2aXN1YWxfaWQgYW5kIHZpc3VhbF9kZXB0aCB3ZXJlIHNldCBpbiBzZXRfdmlzdWFsKCkuCi0JCSAqLwotCi0JCXZpbmZvX3RtcGwudmlzdWFsaWQgPSB2aXN1YWxfaWQ7IAotCQl2aW5mbyA9IFhHZXRWaXN1YWxJbmZvKGRweSwgVmlzdWFsSURNYXNrLCAmdmluZm9fdG1wbCwgJm4pOwotCQlpZiAodmluZm8gPT0gTlVMTCB8fCBuID09IDApIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCXJmYkxvZygiY291bGQgbm90IG1hdGNoIHZpc3VhbF9pZDogMHgleFxuIiwKLQkJCSAgICAoaW50KSB2aXN1YWxfaWQpOwotCQkJWF9VTkxPQ0s7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWRlZmF1bHRfdmlzdWFsID0gdmluZm8tPnZpc3VhbDsKLQkJZGVwdGggPSB2aW5mby0+ZGVwdGg7Ci0JCWlmICh2aXN1YWxfZGVwdGgpIHsKLQkJCS8qIGZvcmNlIGl0IGZyb20gLXZpc3VhbCBNb29Db2xvcjpOTiAqLwotCQkJZGVwdGggPSB2aXN1YWxfZGVwdGg7Ci0JCX0KLQkJaWYgKCEgcXVpZXQpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGluaXRpYWxpemVfeGRpc3BsYXlfZmIoKVxuIik7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBWaXN1YWwqOiAgICAlcFxuIiwKLQkJCSAgICAodm9pZCAqKSB2aW5mby0+dmlzdWFsKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIHZpc3VhbGlkOiAgIDB4JXhcbiIsCi0JCQkgICAgKGludCkgdmluZm8tPnZpc3VhbGlkKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIHNjcmVlbjogICAgICVkXG4iLCB2aW5mby0+c2NyZWVuKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGRlcHRoOiAgICAgICVkXG4iLCB2aW5mby0+ZGVwdGgpOwotCQkJZnByaW50ZihzdGRlcnIsICIgY2xhc3M6ICAgICAgJWRcbiIsIHZpbmZvLT5jbGFzcyk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiByZWRfbWFzazogICAweCUwOGx4ICAlc1xuIiwKLQkJCSAgICB2aW5mby0+cmVkX21hc2ssIGJpdHByaW50KHZpbmZvLT5yZWRfbWFzaywgMzIpKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGdyZWVuX21hc2s6IDB4JTA4bHggICVzXG4iLAotCQkJICAgIHZpbmZvLT5ncmVlbl9tYXNrLCBiaXRwcmludCh2aW5mby0+Z3JlZW5fbWFzaywgMzIpKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGJsdWVfbWFzazogIDB4JTA4bHggICVzXG4iLAotCQkJICAgIHZpbmZvLT5ibHVlX21hc2ssIGJpdHByaW50KHZpbmZvLT5ibHVlX21hc2ssIDMyKSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBjbWFwX3NpemU6ICAlZFxuIiwKLQkJCSAgICB2aW5mby0+Y29sb3JtYXBfc2l6ZSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBiaXRzIGIvcmdiOiAlZFxuIiwKLQkJCSAgICB2aW5mby0+Yml0c19wZXJfcmdiKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJfQotCQlYRnJlZV93cih2aW5mbyk7Ci0JfQotCi0JaWYgKCEgcXVpZXQpIHsKLQkJcmZiTG9nKCJEZWZhdWx0IHZpc3VhbCBJRDogMHgleFxuIiwKLQkJICAgIChpbnQpIFhWaXN1YWxJREZyb21WaXN1YWwoZGVmYXVsdF92aXN1YWwpKTsKLQl9Ci0KLQlpZiAoc3Vid2luKSB7Ci0JCWludCBzaGlmdCA9IDAsIHJlc2l6ZSA9IDA7Ci0JCWludCBzdWJ3aW5feCwgc3Vid2luX3k7Ci0JCWludCBkaXNwX3ggPSBEaXNwbGF5V2lkdGgoZHB5LCBzY3IpOwotCQlpbnQgZGlzcF95ID0gRGlzcGxheUhlaWdodChkcHksIHNjcik7Ci0JCVdpbmRvdyB0d2luOwotCQkvKiBzdWJ3aW5zIGNhbiBiZSBhIGRpY2V5IGlmIHRoZXkgYXJlIGNoYW5naW5nIHNpemUuLi4gKi8KLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwkvKiByZXNldCBpbiBpZihzdWJ3aW4pIGJsb2NrIGJlbG93ICovCi0JCVhUcmFuc2xhdGVDb29yZGluYXRlcyhkcHksIHdpbmRvdywgcm9vdHdpbiwgMCwgMCwgJnN1Yndpbl94LAotCQkgICAgJnN1Yndpbl95LCAmdHdpbik7Ci0KLQkJaWYgKHdkcHlfeCA+IGRpc3BfeCkgewotCQkJcmVzaXplID0gMTsKLQkJCWRweV94ID0gd2RweV94ID0gZGlzcF94IC0gNDsKLQkJfQotCQlpZiAod2RweV95ID4gZGlzcF95KSB7Ci0JCQlyZXNpemUgPSAxOwotCQkJZHB5X3kgPSB3ZHB5X3kgPSBkaXNwX3kgLSA0OwotCQl9Ci0KLQkJaWYgKHN1Yndpbl94ICsgd2RweV94ID4gZGlzcF94KSB7Ci0JCQlzaGlmdCA9IDE7Ci0JCQlzdWJ3aW5feCA9IGRpc3BfeCAtIHdkcHlfeCAtIDM7Ci0JCX0KLQkJaWYgKHN1Yndpbl95ICsgd2RweV95ID4gZGlzcF95KSB7Ci0JCQlzaGlmdCA9IDE7Ci0JCQlzdWJ3aW5feSA9IGRpc3BfeSAtIHdkcHlfeSAtIDM7Ci0JCX0KLQkJaWYgKHN1Yndpbl94IDwgMCkgewotCQkJc2hpZnQgPSAxOwotCQkJc3Vid2luX3ggPSAxOwotCQl9Ci0JCWlmIChzdWJ3aW5feSA8IDApIHsKLQkJCXNoaWZ0ID0gMTsKLQkJCXN1Yndpbl95ID0gMTsKLQkJfQotCi0JCWlmIChyZXNpemUpIHsKLQkJCVhSZXNpemVXaW5kb3coZHB5LCB3aW5kb3csIHdkcHlfeCwgd2RweV95KTsKLQkJfQotCQlpZiAoc2hpZnQpIHsKLQkJCVhNb3ZlV2luZG93KGRweSwgd2luZG93LCBzdWJ3aW5feCwgc3Vid2luX3kpOwotCQkJb2ZmX3ggPSBzdWJ3aW5feDsKLQkJCW9mZl95ID0gc3Vid2luX3k7Ci0JCX0KLQkJWE1hcFJhaXNlZChkcHksIHdpbmRvdyk7Ci0JCVhSYWlzZVdpbmRvdyhkcHksIHdpbmRvdyk7Ci0JCVhTeW5jKGRweSwgRmFsc2UpOwotCX0KLQl0cnkrKzsKLQotCWlmIChub2ZiKSB7Ci0JCS8qIAotCQkgKiBGb3IgLW5vZmIgd2UgZG8gbm90IGFsbG9jYXRlIHRoZSBmcmFtZWJ1ZmZlciwgc28gd2UKLQkJICogY2FuIHNhdmUgYSBmZXcgTUIgb2YgbWVtb3J5LiAKLQkJICovCi0JCWZiID0gWENyZWF0ZUltYWdlX3dyKGRweSwgZGVmYXVsdF92aXN1YWwsIGRlcHRoLCBaUGl4bWFwLAotCQkgICAgMCwgTlVMTCwgZHB5X3gsIGRweV95LCBCaXRtYXBQYWQoZHB5KSwgMCk7Ci0KLQl9IGVsc2UgaWYgKHZpc3VhbF9pZCkgewotCQkvKgotCQkgKiB3ZSBuZWVkIHRvIGNhbGwgWENyZWF0ZUltYWdlIHRvIHN1cHBseSB0aGUgdmlzdWFsCi0JCSAqLwotCQlmYiA9IFhDcmVhdGVJbWFnZV93cihkcHksIGRlZmF1bHRfdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwKLQkJICAgIDAsIE5VTEwsIGRweV94LCBkcHlfeSwgQml0bWFwUGFkKGRweSksIDApOwotCQlpZiAoZmIpIHsKLQkJCWZiLT5kYXRhID0gKGNoYXIgKikgbWFsbG9jKGZiLT5ieXRlc19wZXJfbGluZSAqIGZiLT5oZWlnaHQpOwotCQl9Ci0KLQl9IGVsc2UgewotCQlmYiA9IFhHZXRJbWFnZV93cihkcHksIHdpbmRvdywgMCwgMCwgZHB5X3gsIGRweV95LCBBbGxQbGFuZXMsCi0JCSAgICBaUGl4bWFwKTsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygiUmVhZCBpbml0aWFsIGRhdGEgZnJvbSBYIGRpc3BsYXkgaW50byIKLQkJCSAgICAiIGZyYW1lYnVmZmVyLlxuIik7Ci0JCX0KLQl9Ci0KLQlpZiAoc3Vid2luKSB7Ci0JCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQlpZiAodHJhcHBlZF94ZXJyb3IgfHwgZmIgPT0gTlVMTCkgewotCQkgICAgcmZiTG9nKCJ0cmFwcGVkIEdldEltYWdlIGF0IFNVQldJTiBjcmVhdGlvbi5cbiIpOwotCQkgICAgaWYgKHRyeSA8IHN1Yndpbl90cmllcykgewotCQkJdXNsZWVwKDI1MCAqIDEwMDApOwotCQkJaWYgKCFnZXRfd2luZG93X3NpemUod2luZG93LCAmd2RweV94LCAmd2RweV95KSkgewotCQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCQlyZmJMb2coImNvdWxkIG5vdCBnZXQgc2l6ZSBvZiBzdWJ3aW4gIgotCQkJCSAgICAiMHglbHhcbiIsIHN1Yndpbik7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCWdvdG8gYWdhaW47Ci0JCSAgICB9Ci0JCX0KLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCi0JfSBlbHNlIGlmIChmYiA9PSBOVUxMKSB7Ci0JCVhFdmVudCB4ZXY7Ci0JCXJmYkxvZygiaW5pdGlhbGl6ZV94ZGlzcGxheV9mYjogKioqIGZiIGNyZWF0aW9uIGZhaWxlZDogMHgleCB0cnk6ICVkXG4iLCBmYiwgdHJ5KTsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYUkFORFIKLQkJaWYgKHhyYW5kcl9wcmVzZW50ICYmIHhyYW5kcl9iYXNlX2V2ZW50X3R5cGUpIHsKLQkJCWludCBjbnQgPSAwOwotCQkJd2hpbGUgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCB4cmFuZHJfYmFzZV9ldmVudF90eXBlICsgUlJTY3JlZW5DaGFuZ2VOb3RpZnksICZ4ZXYpKSB7Ci0JCQkJWFJSU2NyZWVuQ2hhbmdlTm90aWZ5RXZlbnQgKnJldjsKLQkJCQlyZXYgPSAoWFJSU2NyZWVuQ2hhbmdlTm90aWZ5RXZlbnQgKikgJnhldjsKLQotCQkJCXJmYkxvZygiaW5pdGlhbGl6ZV94ZGlzcGxheV9mYjogWFJBTkRSIGV2ZW50IHdoaWxlIHJlZG9pbmcgZmJbJWRdOlxuIiwgY250KyspOwotCQkJCXJmYkxvZygiICBzZXJpYWw6ICAgICAgICAgICVkXG4iLCAoaW50KSByZXYtPnNlcmlhbCk7Ci0JCQkJcmZiTG9nKCIgIHRpbWVzdGFtcDogICAgICAgJWRcbiIsIChpbnQpIHJldi0+dGltZXN0YW1wKTsKLQkJCQlyZmJMb2coIiAgY2ZnX3RpbWVzdGFtcDogICAlZFxuIiwgKGludCkgcmV2LT5jb25maWdfdGltZXN0YW1wKTsKLQkJCQlyZmJMb2coIiAgc2l6ZV9pZDogICAgICAgICAlZFxuIiwgKGludCkgcmV2LT5zaXplX2luZGV4KTsKLQkJCQlyZmJMb2coIiAgc3ViX3BpeGVsOiAgICAgICAlZFxuIiwgKGludCkgcmV2LT5zdWJwaXhlbF9vcmRlcik7Ci0JCQkJcmZiTG9nKCIgIHJvdGF0aW9uOiAgICAgICAgJWRcbiIsIChpbnQpIHJldi0+cm90YXRpb24pOwotCQkJCXJmYkxvZygiICB3aWR0aDogICAgICAgICAgICVkXG4iLCAoaW50KSByZXYtPndpZHRoKTsKLQkJCQlyZmJMb2coIiAgaGVpZ2h0OiAgICAgICAgICAlZFxuIiwgKGludCkgcmV2LT5oZWlnaHQpOwotCQkJCXJmYkxvZygiICBtd2lkdGg6ICAgICAgICAgICVkIG1tXG4iLCAoaW50KSByZXYtPm13aWR0aCk7Ci0JCQkJcmZiTG9nKCIgIG1oZWlnaHQ6ICAgICAgICAgJWQgbW1cbiIsIChpbnQpIHJldi0+bWhlaWdodCk7Ci0JCQkJcmZiTG9nKCJcbiIpOwotCQkJCXJmYkxvZygicHJldmlvdXMgV3hIOiAlZHglZFxuIiwgd2RweV94LCB3ZHB5X3kpOwotCi0JCQkJeHJhbmRyX3dpZHRoICA9IHJldi0+d2lkdGg7Ci0JCQkJeHJhbmRyX2hlaWdodCA9IHJldi0+aGVpZ2h0OwotCQkJCXhyYW5kcl90aW1lc3RhbXAgPSByZXYtPnRpbWVzdGFtcDsKLQkJCQl4cmFuZHJfY2ZnX3RpbWUgID0gcmV2LT5jb25maWdfdGltZXN0YW1wOwotCQkJCXhyYW5kcl9yb3RhdGlvbiA9IChpbnQpIHJldi0+cm90YXRpb247Ci0KLQkJCQlyZmJMb2coImluaXRpYWxpemVfeGRpc3BsYXlfZmI6IHVwZGF0aW5nIFhSQU5EUiBjb25maWcuLi5cbiIpOwotCQkJCVhSUlVwZGF0ZUNvbmZpZ3VyYXRpb24oJnhldik7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlpZiAodHJ5IDwgNSkgIHsKLQkJCVhGbHVzaF93cihkcHkpOwotCQkJdXNsZWVwKDI1MCAqIDEwMDApOwotCQkJaWYgKHRyeSA8IDMpIHsKLQkJCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJCX0gZWxzZSBpZiAodHJ5ID49IDMpIHsKLQkJCQlYU3luYyhkcHksIFRydWUpOwotCQkJfQotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQlpZiAodXNlX3NuYXBmYikgewotCQlpbml0aWFsaXplX3NuYXBfZmIoKTsKLQl9Ci0KLQlYX1VOTE9DSzsKLQotCWlmIChmYi0+Yml0c19wZXJfcGl4ZWwgPT0gMjQgJiYgISBxdWlldCkgewotCQlyZmJMb2coIndhcm5pbmc6IDI0IGJwcCBtYXkgaGF2ZSBwb29yIHBlcmZvcm1hbmNlLlxuIik7Ci0JfQotCXJldHVybiBmYjsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBwYXJzZV9zY2FsZV9zdHJpbmcoY2hhciAqc3RyLCBkb3VibGUgKmZhY3Rvcl94LCBkb3VibGUgKmZhY3Rvcl95LCBpbnQgKnNjYWxpbmcsIGludCAqYmxlbmQsCi0gICAgaW50ICpub211bHQ0LCBpbnQgKnBhZCwgaW50ICppbnRlcnBvbGF0ZSwgaW50ICpudW1lciwgaW50ICpkZW5vbSwgaW50IHdfaW4sIGludCBoX2luKSB7Ci0KLQlpbnQgbSwgbjsKLQljaGFyICpwLCAqdHN0cjsKLQlkb3VibGUgZiwgZjI7Ci0KLQkqZmFjdG9yX3ggPSAxLjA7Ci0JKmZhY3Rvcl95ID0gMS4wOwotCSpzY2FsaW5nID0gMDsKLQkqYmxlbmQgPSAxOwotCSpub211bHQ0ID0gMDsKLQkqcGFkID0gMDsKLQkqaW50ZXJwb2xhdGUgPSAwOwotCSpudW1lciA9IDAsICpkZW5vbSA9IDA7Ci0KLQlpZiAoc3RyID09IE5VTEwgfHwgc3RyWzBdID09ICdcMCcpIHsKLQkJcmV0dXJuOwotCX0KLQl0c3RyID0gc3RyZHVwKHN0cik7Ci0JCi0JaWYgKCAocCA9IHN0cmNocih0c3RyLCAnOicpKSAhPSBOVUxMKSB7Ci0JCS8qIG9wdGlvbnMgKi8KLQkJaWYgKHN0cnN0cihwKzEsICJuYiIpICE9IE5VTEwpIHsKLQkJCSpibGVuZCA9IDA7Ci0JCX0KLQkJaWYgKHN0cnN0cihwKzEsICJmYiIpICE9IE5VTEwpIHsKLQkJCSpibGVuZCA9IDI7Ci0JCX0KLQkJaWYgKHN0cnN0cihwKzEsICJuNCIpICE9IE5VTEwpIHsKLQkJCSpub211bHQ0ID0gMTsKLQkJfQotCQlpZiAoc3Ryc3RyKHArMSwgImluIikgIT0gTlVMTCkgewotCQkJKmludGVycG9sYXRlID0gMTsKLQkJfQotCQlpZiAoc3Ryc3RyKHArMSwgInBhZCIpICE9IE5VTEwpIHsKLQkJCSpwYWQgPSAxOwotCQl9Ci0JCWlmIChzdHJzdHIocCsxLCAibm9jciIpICE9IE5VTEwpIHsKLQkJCS8qIGdsb2JhbCAqLwotCQkJc2NhbGluZ19jb3B5cmVjdCA9IDA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHArMSwgImNyIikgIT0gTlVMTCkgewotCQkJLyogZ2xvYmFsICovCi0JCQlzY2FsaW5nX2NvcHlyZWN0ID0gMTsKLQkJfQotCQkqcCA9ICdcMCc7Ci0JfQotCi0JaWYgKHN0cmNocih0c3RyLCAnLicpICE9IE5VTEwpIHsKLQkJZG91YmxlIHRlc3QsIGRpZmYsIGVwcyA9IDEuMGUtNzsKLQkJaWYgKHNzY2FuZih0c3RyLCAiJWxmeCVsZiIsICZmLCAmZjIpID09IDIpIHsKLQkJCSpmYWN0b3JfeCA9IChkb3VibGUpIGY7Ci0JCQkqZmFjdG9yX3kgPSAoZG91YmxlKSBmMjsKLQkJfSBlbHNlIGlmIChzc2NhbmYodHN0ciwgIiVsZiIsICZmKSAhPSAxKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coImludmFsaWQgLXNjYWxlIGFyZzogJXNcbiIsIHRzdHIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfSBlbHNlIHsKLQkJCSpmYWN0b3JfeCA9IChkb3VibGUpIGY7Ci0JCQkqZmFjdG9yX3kgPSAoZG91YmxlKSBmOwotCQl9Ci0JCS8qIGxvb2sgZm9yIGNvbW1vbiBmcmFjdGlvbnMgZnJvbSBzbWFsbCBpbnRzOiAqLwotCQlpZiAoKmZhY3Rvcl94ID09ICpmYWN0b3JfeSkgewotCQkJZm9yIChuPTI7IG48PTEwOyBuKyspIHsKLQkJCQlmb3IgKG09MTsgbTxuOyBtKyspIHsKLQkJCQkJdGVzdCA9ICgoZG91YmxlKSBtKS8gbjsKLQkJCQkJZGlmZiA9ICpmYWN0b3JfeCAtIHRlc3Q7Ci0JCQkJCWlmICgtZXBzIDwgZGlmZiAmJiBkaWZmIDwgZXBzKSB7Ci0JCQkJCQkqbnVtZXIgPSBtOwotCQkJCQkJKmRlbm9tID0gbjsKLQkJCQkJCWJyZWFrOwotCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKmRlbm9tKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICgqZmFjdG9yX3ggPCAwLjAxKSB7Ci0JCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJCXJmYkxvZygiLXNjYWxlIGZhY3RvciB0b28gc21hbGw6ICVmXG4iLCAqZmFjdG9yX3gpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHNzY2FuZih0c3RyLCAiJWR4JWQiLCAmbSwgJm4pID09IDIgJiYgd19pbiA+IDAgJiYgaF9pbiA+IDApIHsKLQkJKmZhY3Rvcl94ID0gKChkb3VibGUpIG0pIC8gKChkb3VibGUpIHdfaW4pOwotCQkqZmFjdG9yX3kgPSAoKGRvdWJsZSkgbikgLyAoKGRvdWJsZSkgaF9pbik7Ci0JfSBlbHNlIHsKLQkJaWYgKHNzY2FuZih0c3RyLCAiJWQvJWQiLCAmbSwgJm4pICE9IDIpIHsKLQkJCWlmIChzc2NhbmYodHN0ciwgIiVkIiwgJm0pICE9IDEpIHsKLQkJCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQkJcmZiTG9nKCJpbnZhbGlkIC1zY2FsZSBhcmc6ICVzXG4iLCB0c3RyKTsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBlLmcuIC1zY2FsZSAxIG9yIC1zY2FsZSAyICovCi0JCQkJbiA9IDE7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPD0gMCB8fCBtIDw9MCkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJcmZiTG9nKCJpbnZhbGlkIC1zY2FsZSBhcmc6ICVzXG4iLCB0c3RyKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJKmZhY3Rvcl94ID0gKChkb3VibGUpIG0pLyBuOwotCQkqZmFjdG9yX3kgPSAoKGRvdWJsZSkgbSkvIG47Ci0JCWlmICgqZmFjdG9yX3ggPCAwLjAxKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coIi1zY2FsZSBmYWN0b3IgdG9vIHNtYWxsOiAlZlxuIiwgKmZhY3Rvcl94KTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJKm51bWVyID0gbTsKLQkJKmRlbm9tID0gbjsKLQl9Ci0JaWYgKCpmYWN0b3JfeCA9PSAxLjAgJiYgKmZhY3Rvcl95ID09IDEuMCkgewotCQlpZiAoISBxdWlldCkgewotCQkJcmZiTG9nKCJzY2FsaW5nIGRpc2FibGVkIGZvciBmYWN0b3IgJWYgJWZcbiIsICpmYWN0b3JfeCwgKmZhY3Rvcl95KTsKLQkJfQotCX0gZWxzZSB7Ci0JCSpzY2FsaW5nID0gMTsKLQl9Ci0JZnJlZSh0c3RyKTsKLX0KLQotaW50IHBhcnNlX3JvdGF0ZV9zdHJpbmcoY2hhciAqc3RyLCBpbnQgKm1vZGUpIHsKLQlpbnQgbSA9IFJPVEFURV9OT05FOwotCWlmIChzdHIgPT0gTlVMTCB8fCAhc3RyY21wKHN0ciwgIiIpIHx8ICFzdHJjbXAoc3RyLCAiMCIpKSB7Ci0JCW0gPSBST1RBVEVfTk9ORTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAieCIpKSB7Ci0JCW0gPSBST1RBVEVfWDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAieSIpKSB7Ci0JCW0gPSBST1RBVEVfWTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAieHkiKSB8fCAhc3RyY21wKHN0ciwgInl4IikgfHwKLQkgICAgIXN0cmNtcChzdHIsIisxODAiKSB8fCAhc3RyY21wKHN0ciwiLTE4MCIpIHx8ICFzdHJjbXAoc3RyLCIxODAiKSkgewotCQltID0gUk9UQVRFX1hZOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICIrOTAiKSB8fCAhc3RyY21wKHN0ciwgIjkwIikpIHsKLQkJbSA9IFJPVEFURV85MDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiKzkweCIpIHx8ICFzdHJjbXAoc3RyLCAiOTB4IikpIHsKLQkJbSA9IFJPVEFURV85MFg7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIis5MHkiKSB8fCAhc3RyY21wKHN0ciwgIjkweSIpKSB7Ci0JCW0gPSBST1RBVEVfOTBZOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICItOTAiKSB8fCAhc3RyY21wKHN0ciwgIjI3MCIpIHx8Ci0JICAgICFzdHJjbXAoc3RyLCAiKzI3MCIpKSB7Ci0JCW0gPSBST1RBVEVfMjcwOwotCX0gZWxzZSB7Ci0JCXJmYkxvZygiaW52YWxpZCAtcm90YXRlIG1vZGU6ICVzXG4iLCBzdHIpOwotCX0KLQlpZiAobW9kZSkgewotCQkqbW9kZSA9IG07Ci0JfQotCXJldHVybiBtOwotfQotCi1pbnQgc2NhbGVfcm91bmQoaW50IGxlbiwgZG91YmxlIGZhYykgewotCWRvdWJsZSBlcHMgPSAwLjAwMDAwMTsKLQkKLQlsZW4gPSAoaW50KSAobGVuICogZmFjICsgZXBzKTsKLQlpZiAobGVuIDwgMSkgewotCQlsZW4gPSAxOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9zY2FsaW5nKGludCAqd2lkdGhfaW4sIGludCAqaGVpZ2h0X2luKSB7Ci0JaW50IHdpZHRoICA9ICp3aWR0aF9pbjsKLQlpbnQgaGVpZ2h0ID0gKmhlaWdodF9pbjsKLQotCXBhcnNlX3NjYWxlX3N0cmluZyhzY2FsZV9zdHIsICZzY2FsZV9mYWNfeCwgJnNjYWxlX2ZhY195LCAmc2NhbGluZywgJnNjYWxpbmdfYmxlbmQsCi0JICAgICZzY2FsaW5nX25vbXVsdDQsICZzY2FsaW5nX3BhZCwgJnNjYWxpbmdfaW50ZXJwb2xhdGUsCi0JICAgICZzY2FsZV9udW1lciwgJnNjYWxlX2Rlbm9tLCAqd2lkdGhfaW4sICpoZWlnaHRfaW4pOwotCi0JaWYgKHNjYWxpbmcpIHsKLQkJd2lkdGggID0gc2NhbGVfcm91bmQod2lkdGgsICBzY2FsZV9mYWNfeCk7Ci0JCWhlaWdodCA9IHNjYWxlX3JvdW5kKGhlaWdodCwgc2NhbGVfZmFjX3kpOwotCQlpZiAoc2NhbGVfZGVub20gJiYgc2NhbGluZ19wYWQpIHsKLQkJCS8qIGl0IGlzIG5vdCBjbGVhciB0aGlzIHBhZGRpbmcgaXMgdXNlZnVsIGFueW1vcmUgKi8KLQkJCXJmYkxvZygid2lkdGggICUlIGRlbm9tOiAlZCAlJSAlZCA9ICVkXG4iLCB3aWR0aCwKLQkJCSAgICBzY2FsZV9kZW5vbSwgd2lkdGggICUgc2NhbGVfZGVub20pOwotCQkJcmZiTG9nKCJoZWlnaHQgJSUgZGVub206ICVkICUlICVkID0gJWRcbiIsIGhlaWdodCwKLQkJCSAgICBzY2FsZV9kZW5vbSwgaGVpZ2h0ICUgc2NhbGVfZGVub20pOwotCQkJaWYgKHdpZHRoICUgc2NhbGVfZGVub20gIT0gMCkgewotCQkJCWludCB3ID0gd2lkdGg7Ci0JCQkJdyArPSBzY2FsZV9kZW5vbSAtICh3ICUgc2NhbGVfZGVub20pOwotCQkJCWlmICghc2NhbGluZ19ub211bHQ0ICYmIHcgJSA0ICE9IDApIHsKLQkJCQkJLyogbmVlZCB0byBtYWtlIG11bHQgb2YgNCBhcyB3ZWxsICovCi0JCQkJCWludCBjID0gMDsJCi0JCQkJCXdoaWxlICh3ICUgNCAhPSAwICYmIGMrKyA8PSA1KSB7Ci0JCQkJCQl3ICs9IHNjYWxlX2Rlbm9tOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdpZHRoID0gdzsKLQkJCQlyZmJMb2coInBhZGRlZCB3aWR0aCAgdG86ICVkIChtdWx0IG9mICVkJXNcbiIsCi0JCQkJICAgIHdpZHRoLCBzY2FsZV9kZW5vbSwgIXNjYWxpbmdfbm9tdWx0NCA/Ci0JCQkJICAgICIgYW5kIDQpIiA6ICIpIik7Ci0JCQl9Ci0JCQlpZiAoaGVpZ2h0ICUgc2NhbGVfZGVub20gIT0gMCkgewotCQkJCWhlaWdodCArPSBzY2FsZV9kZW5vbSAtIChoZWlnaHQgJSBzY2FsZV9kZW5vbSk7Ci0JCQkJcmZiTG9nKCJwYWRkZWQgaGVpZ2h0IHRvOiAlZCAobXVsdCBvZiAlZClcbiIsCi0JCQkJICAgIGhlaWdodCwgc2NhbGVfZGVub20pOwotCQkJfQotCQl9Ci0JCWlmICghc2NhbGluZ19ub211bHQ0ICYmIHdpZHRoICUgNCAhPSAwICYmIHdpZHRoID4gMikgewotCQkJLyogcmVzZXQgd2lkdGggdG8gYmUgbXVsdGlwbGUgb2YgNCAqLwotCQkJaW50IHdpZHRoMCA9IHdpZHRoOwotCQkJaWYgKCh3aWR0aCsxKSAlIDQgPT0gMCkgewotCQkJCXdpZHRoID0gd2lkdGgrMTsKLQkJCX0gZWxzZSBpZiAoKHdpZHRoLTEpICUgNCA9PSAwKSB7Ci0JCQkJd2lkdGggPSB3aWR0aC0xOwotCQkJfSBlbHNlIGlmICgod2lkdGgrMikgJSA0ID09IDApIHsKLQkJCQl3aWR0aCA9IHdpZHRoKzI7Ci0JCQl9Ci0JCQlyZmJMb2coInJlc2V0IHNjYWxlZCB3aWR0aCAlZCAtPiAlZCB0byBiZSBhIG11bHRpcGxlIG9mIgotCQkJICAgICIgNCAodG9cbiIsIHdpZHRoMCwgd2lkdGgpOwotCQkJcmZiTG9nKCJtYWtlIHZuY3ZpZXdlcnMgaGFwcHkpLiB1c2UgLXNjYWxlIG0vbjpuNCB0byAiCi0JCQkgICAgImRpc2FibGUuXG4iKTsKLQkJfQotCQlzY2FsZWRfeCA9IHdpZHRoOwotCQlzY2FsZWRfeSA9IGhlaWdodDsKLQotCQkqd2lkdGhfaW4gID0gd2lkdGg7Ci0JCSpoZWlnaHRfaW4gPSBoZWlnaHQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9yb3RhdGluZyh2b2lkKSB7Ci0JY2hhciAqcnMgPSByb3RhdGluZ19zdHI7Ci0KLQlyb3RhdGluZ19jdXJzb3JzID0gMTsKLQlpZiAocnMgJiYgc3Ryc3RyKHJzLCAibmM6IikgPT0gcnMpIHsKLQkJcnMgKz0gc3RybGVuKCJuYzoiKTsKLQkJcm90YXRpbmdfY3Vyc29ycyA9IDA7Ci0JfQotCi0Jcm90YXRpbmcgPSBwYXJzZV9yb3RhdGVfc3RyaW5nKHJzLCBOVUxMKTsKLQlpZiAoISByb3RhdGluZykgewotCQlyb3RhdGluZ19jdXJzb3JzID0gMDsKLQl9Ci0KLQlpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwICB8fCByb3RhdGluZyA9PSBST1RBVEVfOTBYIHx8Ci0JICAgIHJvdGF0aW5nID09IFJPVEFURV85MFkgfHwgcm90YXRpbmcgPT0gUk9UQVRFXzI3MCkgewotCQlyb3RhdGluZ19zYW1lID0gMDsKLQl9IGVsc2UgewotCQlyb3RhdGluZ19zYW1lID0gMTsKLQl9Ci19Ci0KLXN0YXRpYyByZmJCb29sIHNldF94bGF0ZV93cmFwcGVyKHJmYkNsaWVudFB0ciBjbCkgewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWlmIChmaXJzdCkgewotCQlmaXJzdCA9IDA7Ci0JfSBlbHNlIGlmIChuY2FjaGUpIHsKLQkJaW50IHNhdmUgPSBuY2FjaGVfeHJvb3RwbWFwOwotCQlyZmJMb2coInNldF94bGF0ZV93cmFwcGVyOiBjbGVhcmluZyAtbmNhY2hlIGZvciBuZXcgcGl4ZWwgZm9ybWF0LlxuIik7Ci0JCUlOUFVUX0xPQ0s7Ci0JCW5jYWNoZV94cm9vdHBtYXAgPSAwOwotCQljaGVja19uY2FjaGUoMSwgMCk7Ci0JCW5jYWNoZV94cm9vdHBtYXAgPSBzYXZlOwotCQlJTlBVVF9VTkxPQ0s7Ci0JfQotCXJldHVybiByZmJTZXRUcmFuc2xhdGVGdW5jdGlvbihjbCk7CQotfQotCi0vKgotICogaW5pdGlhbGl6ZSB0aGUgcmZiIGZyYW1lYnVmZmVyL3NjcmVlbgotICovCi12b2lkIGluaXRpYWxpemVfc2NyZWVuKGludCAqYXJnYywgY2hhciAqKmFyZ3YsIFhJbWFnZSAqZmIpIHsKLQlpbnQgaGF2ZV9tYXNrcyA9IDA7Ci0JaW50IHdpZHRoICA9IGZiLT53aWR0aDsKLQlpbnQgaGVpZ2h0ID0gZmItPmhlaWdodDsKLQlpbnQgY3JlYXRlX3NjcmVlbiA9IHNjcmVlbiA/IDAgOiAxOwotCWludCBiaXRzX3Blcl9jb2xvcjsKLQlpbnQgZmJfYnBwLCBmYl9CcGwsIGZiX2RlcHRoOwotCWludCBsb2NrZWRfc2VuZHMgPSAwOwotCi0JYnBwID0gZmItPmJpdHNfcGVyX3BpeGVsOwotCi0JZmJfYnBwICAgPSAoaW50KSBmYi0+Yml0c19wZXJfcGl4ZWw7Ci0JZmJfQnBsICAgPSAoaW50KSBmYi0+Ynl0ZXNfcGVyX2xpbmU7Ci0JZmJfZGVwdGggPSAoaW50KSBmYi0+ZGVwdGg7Ci0KLQlyZmJMb2coImluaXRpYWxpemVfc2NyZWVuOiBmYl9kZXB0aC9mYl9icHAvZmJfQnBsICVkLyVkLyVkXG4iLCBmYl9kZXB0aCwKLQkgICAgZmJfYnBwLCBmYl9CcGwpOwotCi0JbWFpbl9ieXRlc19wZXJfbGluZSA9IGZiLT5ieXRlc19wZXJfbGluZTsKLQotCWlmIChjbWFwOHRvMjQpIHsKLQkJaWYgKHJhd19mYikgewotCQkJaWYgKCFxdWlldCkgcmZiTG9nKCJkaXNhYmxpbmcgLTh0bzI0IG1vZGUiCi0JCQkgICAgIiBpbiByYXdfZmIgbW9kZS5cbiIpOwotCQkJY21hcDh0bzI0ID0gMDsKLQkJfSBlbHNlIGlmIChkZXB0aCA9PSAyNCkgewotCQkJaWYgKGZiX2JwcCAhPSAzMikgIHsKLQkJCQlpZiAoIXF1aWV0KSByZmJMb2coImRpc2FibGluZyAtOHRvMjQgbW9kZToiCi0JCQkJICAgICIgYnBwICE9IDMyIHdpdGggZGVwdGggPT0gMjRcbiIpOwotCQkJCWNtYXA4dG8yNCA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYpIHsKLQkJCS8qIG5lZWQgdG8gY29vayB1cCB0aGUgc2NyZWVuIGZiIHRvIGJlIGRlcHRoIDI0ICovCi0JCQlmYl9icHAgPSAzMjsKLQkJCWZiX2RlcHRoID0gMjQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXF1aWV0KSByZmJMb2coImRpc2FibGluZyAtOHRvMjQgbW9kZToiCi0JCQkgICAgIiBkZWZhdWx0IGRlcHRoIG5vdCAxNiBvciBsZXNzXG4iKTsKLQkJCWNtYXA4dG8yNCA9IDA7Ci0JCX0KLQl9Ci0KLQlzZXR1cF9zY2FsaW5nKCZ3aWR0aCwgJmhlaWdodCk7Ci0KLQlpZiAoc2NhbGluZykgewotCQlyZmJMb2coInNjYWxpbmcgc2NyZWVuOiAlZHglZCAtPiAlZHglZFxuIiwgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCBzY2FsZWRfeCwgc2NhbGVkX3kpOwotCQlyZmJMb2coInNjYWxpbmcgc2NyZWVuOiBzY2FsZV9mYWNfeD0lLjVmIHNjYWxlX2ZhY195PSUuNWZcbiIsIHNjYWxlX2ZhY194LCBzY2FsZV9mYWNfeSk7Ci0KLQkJcmZiX2J5dGVzX3Blcl9saW5lID0gKG1haW5fYnl0ZXNfcGVyX2xpbmUgLyBmYi0+d2lkdGgpICogd2lkdGg7Ci0JfSBlbHNlIHsKLQkJcmZiX2J5dGVzX3Blcl9saW5lID0gbWFpbl9ieXRlc19wZXJfbGluZTsKLQl9Ci0KLQlzZXR1cF9yb3RhdGluZygpOwotCi0JaWYgKHJvdGF0aW5nKSB7Ci0JCWlmICghIHJvdGF0aW5nX3NhbWUpIHsKLQkJCWludCB0LCBiID0gbWFpbl9ieXRlc19wZXJfbGluZSAvIGZiLT53aWR0aDsKLQkJCWlmIChzY2FsaW5nKSB7Ci0JCQkJcm90X2J5dGVzX3Blcl9saW5lID0gYiAqIGhlaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJcm90X2J5dGVzX3Blcl9saW5lID0gYiAqIGZiLT5oZWlnaHQ7Ci0JCQl9Ci0JCQl0ID0gd2lkdGg7Ci0JCQl3aWR0aCA9IGhlaWdodDsJCS8qIFRoZSBiaWcgc3dhcC4uLiAqLwotCQkJaGVpZ2h0ID0gdDsKLQkJfSBlbHNlIHsKLQkJCXJvdF9ieXRlc19wZXJfbGluZSA9IHJmYl9ieXRlc19wZXJfbGluZTsKLQkJfQotCX0KLQotI2lmbmRlZiBOT19OQ0FDSEUKLQlpZiAobmNhY2hlID4gMCAmJiAhbm9mYikgewotIyBpZmRlZiBNQUNPU1gKLQkJaWYgKCEgcmF3X2ZiX3N0ciB8fCBtYWNvc3hfY29uc29sZSkgewotIyBlbHNlCi0JCWlmICghIHJhd19mYl9zdHIpIHsKLSMgZW5kaWYKLQkJCQotCQkJY2hhciAqbmV3X2ZiOwotCQkJaW50IHN6ID0gZmItPmhlaWdodCAqIGZiLT5ieXRlc19wZXJfbGluZTsKLQkJCWludCBucyA9IDErbmNhY2hlOwotCi0JCQlpZiAobmNhY2hlX3hyb290cG1hcCkgewotCQkJCW5zKys7Ci0JCQl9Ci0KLQkJCW5ld19mYiA9IChjaGFyICopIGNhbGxvYygoc2l6ZV90KSAoc3ogKiBucyksIDEpOwotCQkJaWYgKGZiLT5kYXRhKSB7Ci0JCQkJbWVtY3B5KG5ld19mYiwgZmItPmRhdGEsIHN6KTsKLQkJCQlmcmVlKGZiLT5kYXRhKTsKLQkJCX0KLQkJCWZiLT5kYXRhID0gbmV3X2ZiOwotCQkJZmItPmhlaWdodCAqPSAobnMpOwotCQkJaGVpZ2h0ICo9IChucyk7Ci0JCQluY2FjaGUwID0gbmNhY2hlOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlpZiAoY21hcDh0bzI0KSB7Ci0JCWlmIChkZXB0aCA8PSA4KSB7Ci0JCQlyZmJfYnl0ZXNfcGVyX2xpbmUgKj0gNDsKLQkJCXJvdF9ieXRlc19wZXJfbGluZSAqPSA0OwotCQl9IGVsc2UgaWYgKGRlcHRoIDw9IDE2KSB7Ci0JCQlyZmJfYnl0ZXNfcGVyX2xpbmUgKj0gMjsKLQkJCXJvdF9ieXRlc19wZXJfbGluZSAqPSAyOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGVzZSBhcmUganVzdCBoaW50cyB3cnQgcGl4ZWwgZm9ybWF0IGp1c3QgdG8gbGV0Ci0JICogcmZiR2V0U2NyZWVuL3JmYk5ld0ZyYW1lYnVmZmVyIHByb2NlZWQgd2l0aCByZWFzb25hYmxlCi0JICogZGVmYXVsdHMuICBXZSBtYW51YWxseSBzZXQgdGhlbSBpbiBwYWluZnVsIGRldGFpbCBiZWxvdy4KLQkgKi8KLQliaXRzX3Blcl9jb2xvciA9IGd1ZXNzX2JpdHNfcGVyX2NvbG9yKGZiX2JwcCk7Ci0KLQlpZiAobG9ja19jbGllbnRfc2VuZHMoLTEpID09IDApIHsKLQkJbG9ja19jbGllbnRfc2VuZHMoMSk7Ci0JCWxvY2tlZF9zZW5kcyA9IDE7Ci0JfQotCi0JLyogbi5iLiBzYW1wbGVzUGVyUGl4ZWwgKHNldCA9IDEgaGVyZSkgc2VlbXMgdG8gYmUgdW51c2VkLiAqLwotCWlmIChjcmVhdGVfc2NyZWVuKSB7Ci0JCWlmICh1c2Vfc3R1bm5lbCkgewotCQkJc2V0dXBfc3R1bm5lbCgwLCBhcmdjLCBhcmd2KTsKLQkJfQotCQlpZiAodXNlX29wZW5zc2wpIHsKLQkJCWlmICh1c2Vfc3R1bm5lbCAmJiBlbmNfc3RyICYmICFzdHJjbXAoZW5jX3N0ciwgIm5vbmUiKSkgewotCQkJCS8qIGVtdWxhdGluZyBIVFRQUyBvbmVwb3J0ICovCi0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlvcGVuc3NsX2luaXQoMCk7Ci0JCQl9Ci0JCX0KLQkJc2NyZWVuID0gcmZiR2V0U2NyZWVuKGFyZ2MsIGFyZ3YsIHdpZHRoLCBoZWlnaHQsCi0JCSAgICBiaXRzX3Blcl9jb2xvciwgMSwgZmJfYnBwLzgpOwotCQlpZiAoc2NyZWVuICYmIGh0dHBfZGlyKSB7Ci0JCQlodHRwX2Nvbm5lY3Rpb25zKDEpOwotCQl9Ci0JCWlmICh1bml4X3NvY2spIHsKLQkJCXVuaXhfc29ja19mZCA9IGxpc3Rlbl91bml4KHVuaXhfc29jayk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBzZXQgc2V0IGZyYW1lQnVmZmVyIG1lbWJlciBiZWxvdy4gKi8KLQkJcmZiTG9nKCJyZmJOZXdGcmFtZWJ1ZmZlcigweCV4LCAweCV4LCAlZCwgJWQsICVkLCAlZCwgJWQpXG4iLAotCQkgICAgc2NyZWVuLCBOVUxMLCB3aWR0aCwgaGVpZ2h0LCBiaXRzX3Blcl9jb2xvciwgMSwgZmJfYnBwLzgpOwotCi0JCS8qIHRoZXNlIGFyZSBwcm9iYWJseSBvdmVyd3JpdHRlbiwgYnV0IGp1c3QgdG8gYmUgc2FmZTogKi8KLQkJc2NyZWVuLT5iaXRzUGVyUGl4ZWwgPSBmYl9icHA7Ci0JCXNjcmVlbi0+ZGVwdGggPSBmYl9kZXB0aDsKLQotCQlyZmJfbmV3X2ZyYW1lYnVmZmVyKHNjcmVlbiwgTlVMTCwgd2lkdGgsIGhlaWdodCwKLQkJICAgIGJpdHNfcGVyX2NvbG9yLCAxLCAoaW50KSBmYl9icHAvOCk7Ci0JfQotCWlmICghIHNjcmVlbikgewotCQlpbnQgaTsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiZmFpbGVkIHRvIGNyZWF0ZSByZmIgc2NyZWVuLlxuIik7Ci0JCWZvciAoaT0wOyBpPCAqYXJnYzsgaSsrKSAgewotCQkJcmZiTG9nKCJcdFslZF0gICVzXG4iLCBpLCBhcmd2W2ldKTsKLQkJfQotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCWlmIChjcmVhdGVfc2NyZWVuICYmICphcmdjICE9IDEpIHsKLQkJaW50IGk7Ci0JCXJmYkxvZ0VuYWJsZSgxKTsKLQkJcmZiTG9nKCIqKiogdW5yZWNvZ25pemVkIG9wdGlvbihzKSAqKipcbiIpOwotCQlmb3IgKGk9MTsgaTwgKmFyZ2M7IGkrKykgIHsKLQkJCXJmYkxvZygiXHRbJWRdICAlc1xuIiwgaSwgYXJndltpXSk7Ci0JCX0KLQkJcmZiTG9nKCJGb3IgYSBsaXN0IG9mIG9wdGlvbnMgcnVuOiB4MTF2bmMgLW9wdHNcbiIpOwotCQlyZmJMb2coIm9yIGZvciB0aGUgZnVsbCBoZWxwOiB4MTF2bmMgLWhlbHBcbiIpOwotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiSGVyZSBpcyBhIGxpc3Qgb2YgcmVtb3ZlZCBvciBvYnNvbGV0ZSIKLQkJICAgICIgb3B0aW9uczpcbiIpOwotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygicmVtb3ZlZDogLWhpbnRzLCAtbm9oaW50c1xuIik7Ci0JCXJmYkxvZygicmVtb3ZlZDogLWN1cnNvcnBvc2FsbFxuIik7Ci0JCXJmYkxvZygicmVtb3ZlZDogLW5vZmlsZXhmZXIsIG5vdyB0aGUgZGVmYXVsdC5cbiIpOwotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygicmVuYW1lZDogLW9sZF9jb3B5dGlsZSwgdXNlIC1vbmV0aWxlXG4iKTsKLQkJcmZiTG9nKCJyZW5hbWVkOiAtbW91c2UsICAgdXNlIC1jdXJzb3JcbiIpOwotCQlyZmJMb2coInJlbmFtZWQ6IC1tb3VzZVgsICB1c2UgLWN1cnNvciBYXG4iKTsKLQkJcmZiTG9nKCJyZW5hbWVkOiAtWCwgICAgICAgdXNlIC1jdXJzb3IgWFxuIik7Ci0JCXJmYkxvZygicmVuYW1lZDogLW5vbW91c2UsIHVzZSAtbm9jdXJzb3JcbiIpOwotCQlyZmJMb2coInJlbmFtZWQ6IC1vbGRfcG9pbnRlciwgdXNlIC1wb2ludGVyX21vZGUgMVxuIik7Ci0JCi0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCi0JLyogc2V0IHVwIGZvcm1hdCBmcm9tIHNjcmF0Y2g6ICovCi0JaWYgKHJvdGF0aW5nICYmICEgcm90YXRpbmdfc2FtZSkgewotCQlzY3JlZW4tPnBhZGRlZFdpZHRoSW5CeXRlcyA9IHJvdF9ieXRlc19wZXJfbGluZTsKLQl9IGVsc2UgewotCQlzY3JlZW4tPnBhZGRlZFdpZHRoSW5CeXRlcyA9IHJmYl9ieXRlc19wZXJfbGluZTsKLQl9Ci0Jc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYml0c1BlclBpeGVsID0gZmJfYnBwOwotCXNjcmVlbi0+c2VydmVyRm9ybWF0LmRlcHRoID0gZmJfZGVwdGg7Ci0Jc2NyZWVuLT5zZXJ2ZXJGb3JtYXQudHJ1ZUNvbG91ciA9IFRSVUU7Ci0KLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5yZWRTaGlmdCAgID0gMDsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ncmVlblNoaWZ0ID0gMDsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlU2hpZnQgID0gMDsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5yZWRNYXggICAgID0gMDsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ncmVlbk1heCAgID0gMDsKLQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlTWF4ICAgID0gMDsKLQotCS8qIHRoZXNlIG1haW5fKiBmb3JtYXRzIGFyZSB1c2VkIGdlbmVyYWxseS4gKi8KLQltYWluX3JlZF9zaGlmdCAgID0gMDsKLQltYWluX2dyZWVuX3NoaWZ0ID0gMDsKLQltYWluX2JsdWVfc2hpZnQgID0gMDsKLQltYWluX3JlZF9tYXggICAgID0gMDsKLQltYWluX2dyZWVuX21heCAgID0gMDsKLQltYWluX2JsdWVfbWF4ICAgID0gMDsKLQltYWluX3JlZF9tYXNrICAgID0gZmItPnJlZF9tYXNrOwotCW1haW5fZ3JlZW5fbWFzayAgPSBmYi0+Z3JlZW5fbWFzazsKLQltYWluX2JsdWVfbWFzayAgID0gZmItPmJsdWVfbWFzazsKLQotCWhhdmVfbWFza3MgPSAoKGZiLT5yZWRfbWFza3xmYi0+Z3JlZW5fbWFza3xmYi0+Ymx1ZV9tYXNrKSAhPSAwKTsKLQlpZiAoZm9yY2VfaW5kZXhlZF9jb2xvcikgewotCQloYXZlX21hc2tzID0gMDsKLQl9Ci0KLQlpZiAoY21hcDh0bzI0ICYmIGRlcHRoIDw9IDE2ICYmIGRweSkgewotCQlYVmlzdWFsSW5mbyB2aW5mbzsKLQkJdmluZm8ucmVkX21hc2sgPSAwOwotCQl2aW5mby5ncmVlbl9tYXNrID0gMDsKLQkJdmluZm8uYmx1ZV9tYXNrID0gMDsKLQkJLyogbW9yZSBjb29raW5nIHVwLi4uICovCi0JCWhhdmVfbWFza3MgPSAyOwotCQkvKiBuZWVkIHRvIGZldGNoIFRydWVDb2xvciB2aXN1YWwgKi8KLQkJWF9MT0NLOwotCQlpZiAoZHB5Ci0jaWYgIU5PX1gxMQotCQkgICAgJiYgWE1hdGNoVmlzdWFsSW5mbyhkcHksIHNjciwgMjQsIFRydWVDb2xvciwgJnZpbmZvKQotI2VuZGlmCi0JCSAgICApIHsKLQkJCW1haW5fcmVkX21hc2sgICA9IHZpbmZvLnJlZF9tYXNrOwotCQkJbWFpbl9ncmVlbl9tYXNrID0gdmluZm8uZ3JlZW5fbWFzazsKLQkJCW1haW5fYmx1ZV9tYXNrICA9IHZpbmZvLmJsdWVfbWFzazsKLQkJfSBlbHNlIGlmIChmYi0+Ynl0ZV9vcmRlciA9PSBMU0JGaXJzdCkgewotCQkJbWFpbl9yZWRfbWFzayAgID0gMHgwMGZmMDAwMDsKLQkJCW1haW5fZ3JlZW5fbWFzayA9IDB4MDAwMGZmMDA7Ci0JCQltYWluX2JsdWVfbWFzayAgPSAweDAwMDAwMGZmOwotCQl9IGVsc2UgewotCQkJbWFpbl9yZWRfbWFzayAgID0gMHgwMDAwMDBmZjsKLQkJCW1haW5fZ3JlZW5fbWFzayA9IDB4MDAwMGZmMDA7Ci0JCQltYWluX2JsdWVfbWFzayAgPSAweDAwZmYwMDAwOwotCQl9Ci0JCVhfVU5MT0NLOwotCX0KLQotCWlmIChyYXdfZmJfc3RyICYmIHJhd19mYl9waXhmbXQpIHsKLQkJY2hhciAqZm10ID0gc3RyZHVwKHJhd19mYl9waXhmbXQpOwotCQl1cHBlcmNhc2UoZm10KTsKLQkJaWYgKHN0cnN0cihmbXQsICJHUkVZIikpIHsKLQkJCXNldF9ncmV5c2NhbGVfY29sb3JtYXAoKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIoZm10LCAiSEkyNDAiKSkgewotCQkJc2V0X2hpMjQwX2NvbG9ybWFwKCk7Ci0JCX0gZWxzZSB7Ci0JCQl1bnNldF9jb2xvcm1hcCgpOwotCQl9Ci0JCWZyZWUoZm10KTsKLQl9Ci0KLQlpZiAoISBoYXZlX21hc2tzICYmIHNjcmVlbi0+c2VydmVyRm9ybWF0LmJpdHNQZXJQaXhlbCA8PSAxNgotCSAgICAmJiBkcHkgJiYgQ2VsbHNPZlNjcmVlbihTY3JlZW5PZkRpc3BsYXkoZHB5LCBzY3IpKSkgewotCQkvKiBpbmRleGVkIGNvbG9yLiB3ZSBsZXQgMSA8PSBicHAgPD0gMTYsIGJ1dCBpdCBpcyBub3JtYWxseSA4ICovCi0JCWlmICghcXVpZXQpIHsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXJmYkxvZygiWCBkaXNwbGF5ICVzIGlzICVkYnBwIGluZGV4ZWQgY29sb3IsIGRlcHRoPSVkXG4iLAotCQkJICAgIERpc3BsYXlTdHJpbmcoZHB5KSwgc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYml0c1BlclBpeGVsLAotCQkJICAgIHNjcmVlbi0+c2VydmVyRm9ybWF0LmRlcHRoKTsKLQkJCWlmICghIGZsYXNoX2NtYXAgJiYgISBvdmVybGF5KSB7Ci0JCQkJcmZiTG9nKCJcbiIpOwotCQkJCXJmYkxvZygiSW4gOGJwcCBQc2V1ZG9Db2xvciBtb2RlIGlmIHlvdSAiCi0JCQkJICAgICJleHBlcmllbmNlIGNvbG9yXG4iKTsKLQkJCQlyZmJMb2coInByb2JsZW1zIHlvdSBtYXkgd2FudCB0byBlbmFibGUgIgotCQkJCSAgICAiZm9sbG93aW5nIHRoZVxuIik7Ci0JCQkJcmZiTG9nKCJjaGFuZ2luZyBjb2xvcm1hcCBieSB1c2luZyB0aGUgIgotCQkJCSAgICAiLWZsYXNoY21hcCBvcHRpb24uXG4iKTsKLQkJCQlyZmJMb2coIlxuIik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNjcmVlbi0+c2VydmVyRm9ybWF0LmRlcHRoIDwgOCkgewotCQkJcmZiTG9nKCJyZXNldHRpbmcgc2VydmVyRm9ybWF0LmRlcHRoICVkIC0+IDguXG4iLAotCQkJICAgIHNjcmVlbi0+c2VydmVyRm9ybWF0LmRlcHRoKTsKLQkJCXJmYkxvZygicmVzZXR0aW5nIHNlcnZlckZvcm1hdC5icHAgICAlZCAtPiA4LlxuIiwKLQkJCSAgICBzY3JlZW4tPnNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwpOwotCQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZGVwdGggPSA4OwotCQkJc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYml0c1BlclBpeGVsID0gODsKLQkJfQotCQlpZiAoc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuZGVwdGggPiA4KSB7Ci0JCQlyZmJMb2coIldBUk5JTkc6IGluZGV4ZWQgY29sb3IgZGVwdGggPiA4LCBUaWdodCBlbmNvZGluZyB3aWxsIGNyYXNoLlxuIik7Ci0JCX0KLQotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC50cnVlQ29sb3VyID0gRkFMU0U7Ci0JCWluZGV4ZWRfY29sb3IgPSAxOwotCQlzZXRfY29sb3JtYXAoMSk7Ci0JCWRlYnVnX2NvbG9ybWFwKGZiKTsKLQl9IGVsc2UgewotCQkvKiAKLQkJICogZ2VuZXJhbCBjYXNlLCB3ZSBjYWxsIGl0IHRydWVjb2xvciwgYnV0IGNvdWxkIGJlIGRpcmVjdAotCQkgKiBjb2xvciwgc3RhdGljIGNvbG9yLCBldGMuLi4uCi0JCSAqLwotCQlpZiAoISBxdWlldCkgewotCQkJaWYgKHJhd19mYikgewotCQkJCXJmYkxvZygiXG4iKTsKLQkJCQlyZmJMb2coIlJhdyBmYiBhdCBhZGRyICVwIGlzICVkYnBwIGRlcHRoPSVkICIKLQkJCQkgICAgInRydWUgY29sb3JcbiIsIHJhd19mYl9hZGRyLAotCQkJCSAgICBmYl9icHAsIGZiX2RlcHRoKTsKLQkJCX0gZWxzZSBpZiAoISBkcHkpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKGhhdmVfbWFza3MgPT0gMikgewotCQkJCXJmYkxvZygiXG4iKTsKLQkJCQlyZmJMb2coIlggZGlzcGxheSAlcyBpcyAlZGJwcCBkZXB0aD0lZCBpbmRleGVkICIKLQkJCQkgICAgImNvbG9yICgtOHRvMjQgbW9kZSlcbiIsIERpc3BsYXlTdHJpbmcoZHB5KSwKLQkJCQkgICAgZmItPmJpdHNfcGVyX3BpeGVsLCBmYi0+ZGVwdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIlxuIik7Ci0JCQkJcmZiTG9nKCJYIGRpc3BsYXkgJXMgaXMgJWRicHAgZGVwdGg9JWQgdHJ1ZSAiCi0JCQkJICAgICJjb2xvclxuIiwgRGlzcGxheVN0cmluZyhkcHkpLAotCQkJCSAgICBmYl9icHAsIGZiX2RlcHRoKTsKLQkJCX0KLQkJfQotCi0JCWluZGV4ZWRfY29sb3IgPSAwOwotCi0JCWlmICghaGF2ZV9tYXNrcykgewotCQkJaW50IE0sIEIgPSBiaXRzX3Blcl9jb2xvcjsKLQotCQkJaWYgKDMqQiA+IGZiX2JwcCkgQi0tOwotCQkJaWYgKEIgPCAxKSBCID0gMTsKLQkJCU0gPSAoMSA8PCBCKSAtIDE7Ci0KLQkJCXJmYkxvZygiV0FSTklORzogYWxsIFRydWVDb2xvciBSR0IgbWFza3MgYXJlIHplcm8hXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogY29va2luZyBzb21ldGhpbmcgdXAgZm9yIFZOQyBmYi4uLiAgQj0lZCBNPSVkXG4iLCBCLCBNKTsKLQkJCW1haW5fcmVkX21hc2sgICA9IE07Ci0JCQltYWluX2dyZWVuX21hc2sgPSBNOwotCQkJbWFpbl9ibHVlX21hc2sgID0gTTsKLQkJCW1haW5fcmVkX21hc2sgICA9IG1haW5fcmVkX21hc2sgICA8PCAoMipCKTsKLQkJCW1haW5fZ3JlZW5fbWFzayA9IG1haW5fZ3JlZW5fbWFzayA8PCAoMSpCKTsKLQkJCW1haW5fYmx1ZV9tYXNrICA9IG1haW5fYmx1ZV9tYXNrICA8PCAoMCpCKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIHJlZF9tYXNrOiAgIDB4JTA4bHggICVzXG4iLCBtYWluX3JlZF9tYXNrLAotCQkJICAgIGJpdHByaW50KG1haW5fcmVkX21hc2ssIDMyKSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBncmVlbl9tYXNrOiAweCUwOGx4ICAlc1xuIiwgbWFpbl9ncmVlbl9tYXNrLAotCQkJICAgIGJpdHByaW50KG1haW5fZ3JlZW5fbWFzaywgMzIpKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGJsdWVfbWFzazogIDB4JTA4bHggICVzXG4iLCBtYWluX2JsdWVfbWFzaywKLQkJCSAgICBiaXRwcmludChtYWluX2JsdWVfbWFzaywgMzIpKTsKLQkJfQotCi0JCS8qIGNvbnZlcnQgbWFza3MgdG8gYml0IHNoaWZ0cyBhbmQgbWF4ICMgY29sb3JzICovCi0JCWlmIChtYWluX3JlZF9tYXNrKSB7Ci0JCQl3aGlsZSAoISAobWFpbl9yZWRfbWFzawotCQkJICAgICYgKDEgPDwgc2NyZWVuLT5zZXJ2ZXJGb3JtYXQucmVkU2hpZnQpKSkgewotCQkJCSAgICBzY3JlZW4tPnNlcnZlckZvcm1hdC5yZWRTaGlmdCsrOwotCQkJfQotCQl9Ci0JCWlmIChtYWluX2dyZWVuX21hc2spIHsKLQkJCXdoaWxlICghIChtYWluX2dyZWVuX21hc2sKLQkJCSAgICAmICgxIDw8IHNjcmVlbi0+c2VydmVyRm9ybWF0LmdyZWVuU2hpZnQpKSkgewotCQkJCSAgICBzY3JlZW4tPnNlcnZlckZvcm1hdC5ncmVlblNoaWZ0Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1haW5fYmx1ZV9tYXNrKSB7Ci0JCQl3aGlsZSAoISAobWFpbl9ibHVlX21hc2sKLQkJCSAgICAmICgxIDw8IHNjcmVlbi0+c2VydmVyRm9ybWF0LmJsdWVTaGlmdCkpKSB7Ci0JCQkJICAgIHNjcmVlbi0+c2VydmVyRm9ybWF0LmJsdWVTaGlmdCsrOwotCQkJfQotCQl9Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LnJlZE1heAotCQkgICAgPSBtYWluX3JlZF9tYXNrICAgPj4gc2NyZWVuLT5zZXJ2ZXJGb3JtYXQucmVkU2hpZnQ7Ci0JCXNjcmVlbi0+c2VydmVyRm9ybWF0LmdyZWVuTWF4Ci0JCSAgICA9IG1haW5fZ3JlZW5fbWFzayA+PiBzY3JlZW4tPnNlcnZlckZvcm1hdC5ncmVlblNoaWZ0OwotCQlzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlTWF4Ci0JCSAgICA9IG1haW5fYmx1ZV9tYXNrICA+PiBzY3JlZW4tPnNlcnZlckZvcm1hdC5ibHVlU2hpZnQ7Ci0KLQkJbWFpbl9yZWRfbWF4ICAgICA9IHNjcmVlbi0+c2VydmVyRm9ybWF0LnJlZE1heDsKLQkJbWFpbl9ncmVlbl9tYXggICA9IHNjcmVlbi0+c2VydmVyRm9ybWF0LmdyZWVuTWF4OwotCQltYWluX2JsdWVfbWF4ICAgID0gc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYmx1ZU1heDsKLQotCQltYWluX3JlZF9zaGlmdCAgID0gc2NyZWVuLT5zZXJ2ZXJGb3JtYXQucmVkU2hpZnQ7Ci0JCW1haW5fZ3JlZW5fc2hpZnQgPSBzY3JlZW4tPnNlcnZlckZvcm1hdC5ncmVlblNoaWZ0OwotCQltYWluX2JsdWVfc2hpZnQgID0gc2NyZWVuLT5zZXJ2ZXJGb3JtYXQuYmx1ZVNoaWZ0OwotCX0KLQotI2lmICFTTUFMTF9GT09UUFJJTlQKLQlpZiAodmVyYm9zZSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiRnJhbWVCdWZmZXIgSW5mbzpcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiB3aWR0aDogICAgICAgICAgICAlZFxuIiwgZmItPndpZHRoKTsKLQkJZnByaW50ZihzdGRlcnIsICIgaGVpZ2h0OiAgICAgICAgICAgJWRcbiIsIGZiLT5oZWlnaHQpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBzY2FsZWRfd2lkdGg6ICAgICAlZFxuIiwgd2lkdGgpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBzY2FsZWRfaGVpZ2h0OiAgICAlZFxuIiwgaGVpZ2h0KTsKLQkJZnByaW50ZihzdGRlcnIsICIgaW5kZXhlZF9jb2xvcjogICAgJWRcbiIsIGluZGV4ZWRfY29sb3IpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBiaXRzX3Blcl9waXhlbDogICAlZFxuIiwgZmItPmJpdHNfcGVyX3BpeGVsKTsKLQkJZnByaW50ZihzdGRlcnIsICIgZGVwdGg6ICAgICAgICAgICAgJWRcbiIsIGZiLT5kZXB0aCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHJlZF9tYXNrOiAgIDB4JTA4bHggICVzXG4iLCBmYi0+cmVkX21hc2ssCi0JCSAgICBiaXRwcmludChmYi0+cmVkX21hc2ssIDMyKSk7Ci0JCWZwcmludGYoc3RkZXJyLCAiIGdyZWVuX21hc2s6IDB4JTA4bHggICVzXG4iLCBmYi0+Z3JlZW5fbWFzaywKLQkJICAgIGJpdHByaW50KGZiLT5ncmVlbl9tYXNrLCAzMikpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBibHVlX21hc2s6ICAweCUwOGx4ICAlc1xuIiwgZmItPmJsdWVfbWFzaywKLQkJICAgIGJpdHByaW50KGZiLT5ibHVlX21hc2ssIDMyKSk7Ci0JCWlmIChjbWFwOHRvMjQpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiIDh0bzI0IGluZm86XG4iKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGZiX2JwcDogICAgICAgICAgICVkXG4iLCBmYl9icHApOwotCQkJZnByaW50ZihzdGRlcnIsICIgZmJfZGVwdGg6ICAgICAgICAgJWRcbiIsIGZiX2RlcHRoKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIHJlZF9tYXNrOiAgIDB4JTA4bHggICVzXG4iLCBtYWluX3JlZF9tYXNrLAotCQkJICAgIGJpdHByaW50KG1haW5fcmVkX21hc2ssIDMyKSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBncmVlbl9tYXNrOiAweCUwOGx4ICAlc1xuIiwgbWFpbl9ncmVlbl9tYXNrLAotCQkJICAgIGJpdHByaW50KG1haW5fZ3JlZW5fbWFzaywgMzIpKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiIGJsdWVfbWFzazogIDB4JTA4bHggICVzXG4iLCBtYWluX2JsdWVfbWFzaywKLQkJCSAgICBiaXRwcmludChtYWluX2JsdWVfbWFzaywgMzIpKTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIiByZWQ6ICAgbWF4OiAlM2QgIHNoaWZ0OiAlMmRcbiIsCi0JCQltYWluX3JlZF9tYXgsIG1haW5fcmVkX3NoaWZ0KTsKLQkJZnByaW50ZihzdGRlcnIsICIgZ3JlZW46IG1heDogJTNkICBzaGlmdDogJTJkXG4iLAotCQkJbWFpbl9ncmVlbl9tYXgsIG1haW5fZ3JlZW5fc2hpZnQpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBibHVlOiAgbWF4OiAlM2QgIHNoaWZ0OiAlMmRcbiIsCi0JCQltYWluX2JsdWVfbWF4LCBtYWluX2JsdWVfc2hpZnQpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBtYWluZmJfYnl0ZXNfcGVyX2xpbmU6ICVkXG4iLAotCQkJbWFpbl9ieXRlc19wZXJfbGluZSk7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHJmYl9mYl9ieXRlc19wZXJfbGluZTogJWRcbiIsCi0JCQlyZmJfYnl0ZXNfcGVyX2xpbmUpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiByb3RfZmJfYnl0ZXNfcGVyX2xpbmU6ICVkXG4iLAotCQkJcm90X2J5dGVzX3Blcl9saW5lKTsKLQkJZnByaW50ZihzdGRlcnIsICIgcmF3X2ZiX2J5dGVzX3Blcl9saW5lOiAlZFxuIiwKLQkJCXJhd19mYl9ieXRlc19wZXJfbGluZSk7Ci0JCXN3aXRjaChmYi0+Zm9ybWF0KSB7Ci0JCWNhc2UgWFlCaXRtYXA6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBmb3JtYXQ6ICAgICBYWUJpdG1hcFxuIik7IGJyZWFrOwotCQljYXNlIFhZUGl4bWFwOgotCQkJZnByaW50ZihzdGRlcnIsICIgZm9ybWF0OiAgICAgWFlQaXhtYXBcbiIpOyBicmVhazsKLQkJY2FzZSBaUGl4bWFwOgotCQkJZnByaW50ZihzdGRlcnIsICIgZm9ybWF0OiAgICAgWlBpeG1hcFxuIik7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICIgZm9ybWF0OiAgICAgJWRcbiIsIGZiLT5mb3JtYXQpOyBicmVhazsKLQkJfQotCQlzd2l0Y2goZmItPmJ5dGVfb3JkZXIpIHsKLQkJY2FzZSBMU0JGaXJzdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiIGJ5dGVfb3JkZXI6IExTQkZpcnN0XG4iKTsgYnJlYWs7Ci0JCWNhc2UgTVNCRmlyc3Q6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBieXRlX29yZGVyOiBNU0JGaXJzdFxuIik7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICIgYnl0ZV9vcmRlcjogJWRcbiIsIGZiLT5ieXRlX29yZGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWZwcmludGYoc3RkZXJyLCAiIGJpdG1hcF9wYWQ6ICAlZFxuIiwgZmItPmJpdG1hcF9wYWQpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiBiaXRtYXBfdW5pdDogJWRcbiIsIGZiLT5iaXRtYXBfdW5pdCk7Ci0JCXN3aXRjaChmYi0+Yml0bWFwX2JpdF9vcmRlcikgewotCQljYXNlIExTQkZpcnN0OgotCQkJZnByaW50ZihzdGRlcnIsICIgYml0bWFwX2JpdF9vcmRlcjogTFNCRmlyc3RcbiIpOyBicmVhazsKLQkJY2FzZSBNU0JGaXJzdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiIGJpdG1hcF9iaXRfb3JkZXI6IE1TQkZpcnN0XG4iKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiBiaXRtYXBfYml0X29yZGVyOiAlZFxuIiwKLQkJCWZiLT5iaXRtYXBfYml0X29yZGVyKTsgYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG92ZXJsYXkgJiYgISBxdWlldCkgewotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiT3ZlcmxheSBtb2RlIGVuYWJsZWQ6ICBJZiB5b3UgZXhwZXJpZW5jZSBjb2xvclxuIik7Ci0JCXJmYkxvZygicHJvYmxlbXMgd2hlbiBwb3B1cCBtZW51cyBhcmUgb24gdGhlIHNjcmVlbiwgdHJ5XG4iKTsKLQkJcmZiTG9nKCJkaXNhYmxpbmcgU2F2ZVVuZGVycyBpbiB5b3VyIFggc2VydmVyLCBvbmUgd2F5IGlzXG4iKTsKLQkJcmZiTG9nKCJ0byBzdGFydCB0aGUgWCBzZXJ2ZXIgd2l0aCB0aGUgJy1zdScgb3B0aW9uLCBlLmcuOlxuIik7Ci0JCXJmYkxvZygiWHN1biAtc3UgLi4uIHNlZSBYc2VydmVyKDEpLCB4aW5pdCgxKSBmb3IgbW9yZSBpbmZvLlxuIik7Ci0JCXJmYkxvZygiXG4iKTsKLQl9Ci0jZW5kaWYKLQkvKiBub2ZiIGlzIGZvciBwb2ludGVyL2tleWJvYXJkIG9ubHkgaGFuZGxpbmcuICAqLwotCWlmIChub2ZiKSB7Ci0JCW1haW5fZmIgPSBOVUxMOwotCQlyZmJfZmIgPSBtYWluX2ZiOwotCQljbWFwOHRvMjRfZmIgPSBOVUxMOwotCQlyb3RfZmIgPSBOVUxMOwotCQlzY3JlZW4tPmRpc3BsYXlIb29rID0gbm9mYl9ob29rOwotCX0gZWxzZSB7Ci0JCW1haW5fZmIgPSBmYi0+ZGF0YTsKLQkJcmZiX2ZiID0gTlVMTDsKLQkJY21hcDh0bzI0X2ZiID0gTlVMTDsKLQkJcm90X2ZiID0gTlVMTDsKLQotCQlpZiAoY21hcDh0bzI0KSB7Ci0JCQlpbnQgbiA9IG1haW5fYnl0ZXNfcGVyX2xpbmUgKiBmYi0+aGVpZ2h0OwotCQkJaWYgKGRlcHRoIDw9IDgpIHsKLQkJCQluICo9IDQ7Ci0JCQl9IGVsc2UgaWYgKGRlcHRoIDw9IDE2KSB7Ci0JCQkJbiAqPSAyOwotCQkJfQotCQkJY21hcDh0bzI0X2ZiID0gKGNoYXIgKikgbWFsbG9jKG4pOwotCQkJbWVtc2V0KGNtYXA4dG8yNF9mYiwgMCwgbik7Ci0JCX0KLQotCQlpZiAocm90YXRpbmcpIHsKLQkJCWludCBuID0gcm90X2J5dGVzX3Blcl9saW5lICogaGVpZ2h0OwotCQkJcm90X2ZiID0gKGNoYXIgKikgbWFsbG9jKG4pOwotCQkJbWVtc2V0KHJvdF9mYiwgMCwgbik7Ci0JCX0KLQotCQlpZiAoc2NhbGluZykgewotCQkJaW50IG4gPSByZmJfYnl0ZXNfcGVyX2xpbmUgKiBoZWlnaHQ7Ci0KLQkJCWlmIChyb3RhdGluZyAmJiAhIHJvdGF0aW5nX3NhbWUpIHsKLQkJCQluID0gcm90X2J5dGVzX3Blcl9saW5lICogaGVpZ2h0OwotCQkJfQotCi0JCQlyZmJfZmIgPSAoY2hhciAqKSBtYWxsb2Mobik7Ci0JCQltZW1zZXQocmZiX2ZiLCAwLCBuKTsKLQotCQl9IGVsc2UgaWYgKGNtYXA4dG8yNCkgewotCQkJcmZiX2ZiID0gY21hcDh0bzI0X2ZiOwkKLQkJfSBlbHNlIHsKLQkJCXJmYl9mYiA9IG1haW5fZmI7Ci0JCX0KLQl9Ci0JaWYgKHJvdF9mYikgewotCQlzY3JlZW4tPmZyYW1lQnVmZmVyID0gcm90X2ZiOwotCX0gZWxzZSB7Ci0JCXNjcmVlbi0+ZnJhbWVCdWZmZXIgPSByZmJfZmI7Ci0JfQotCWlmICh2ZXJib3NlKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHJmYl9mYjogICAgICAlcFxuIiwgcmZiX2ZiKTsKLQkJZnByaW50ZihzdGRlcnIsICIgbWFpbl9mYjogICAgICVwXG4iLCBtYWluX2ZiKTsKLQkJZnByaW50ZihzdGRlcnIsICIgOHRvMjRfZmI6ICAgICVwXG4iLCBjbWFwOHRvMjRfZmIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiByb3RfZmI6ICAgICAgJXBcbiIsIHJvdF9mYik7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHNuYXBfZmI6ICAgICAlcFxuIiwgc25hcF9mYik7Ci0JCWZwcmludGYoc3RkZXJyLCAiIHJhd19mYjogICAgICAlcFxuIiwgcmF3X2ZiKTsKLQkJZnByaW50ZihzdGRlcnIsICIgZmFrZV9mYjogICAgICVwXG4iLCBmYWtlX2ZiKTsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLQotCS8qIG1heSBuZWVkLCBicHAsIG1haW5fcmVkX21heCwgZXRjLiAqLwotCXBhcnNlX3dpcmVmcmFtZSgpOwotCXBhcnNlX3Njcm9sbF9jb3B5cmVjdCgpOwotCXNldHVwX2N1cnNvcnNfYW5kX3B1c2goKTsKLQotCWlmIChzY2FsaW5nIHx8IHJvdGF0aW5nIHx8IGNtYXA4dG8yNCkgewotCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoMCwgMCwgZHB5X3gsIGRweV95LCAwKTsKLQl9Ci0KLQlpZiAoISBjcmVhdGVfc2NyZWVuKSB7Ci0JCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JCXJmYkNsaWVudFB0ciBjbDsKLQotCQkvKiAKLQkJICogc2luY2UgYml0c19wZXJfY29sb3IgYWJvdmUgbWF5IGhhdmUgYmVlbiBhcHByb3hpbWF0ZSwKLQkJICogdHJ5IHRvIHJlc2V0IHRoZSBpbmRpdmlkdWFsIHRyYW5zbGF0aW9uIHRhYmxlcy4uLgotCQkgKiB3ZSBkbyBub3Qgc2VlbSB0byBuZWVkIHRoaXMgd2l0aCByZmJHZXRTY3JlZW4oKS4uLgotCQkgKi8KLQkJaWYgKCFxdWlldCkgcmZiTG9nKCJjYWxsaW5nIHNldFRyYW5zbGF0ZUZ1bmN0aW9uKCkuLi5cbiIpOwotCQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQkJd2hpbGUgKChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgIT0gTlVMTCkgewotCQkJc2NyZWVuLT5zZXRUcmFuc2xhdGVGdW5jdGlvbihjbCk7Ci0JCX0KLQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCQlpZiAoIXF1aWV0KSByZmJMb2coIiAgZG9uZS5cbiIpOwotCQkKLQkJLyogZG9uZSBmb3IgZnJhbWVidWZmZXIgY2hhbmdlIGNhc2UgKi8KLQkJaWYgKGxvY2tlZF9zZW5kcykgewotCQkJbG9ja19jbGllbnRfc2VuZHMoMCk7Ci0JCX0KLQotCQlkb19jb3B5X3NjcmVlbiA9IDE7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIHRoZSByZXN0IGlzIHNjcmVlbiBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24sIGV0Yywgb25seSBuZWVkZWQKLQkgKiBhdCBzY3JlZW4gY3JlYXRpb24gdGltZS4KLQkgKi8KLQotCS8qIGV2ZW50IGNhbGxiYWNrczogKi8KLQlzY3JlZW4tPm5ld0NsaWVudEhvb2sgPSBuZXdfY2xpZW50OwotCXNjcmVlbi0+a2JkQWRkRXZlbnQgPSBrZXlib2FyZDsKLQlzY3JlZW4tPnB0ckFkZEV2ZW50ID0gcG9pbnRlcl9ldmVudDsKLQlzY3JlZW4tPnNldFhDdXRUZXh0ID0geGN1dF9yZWNlaXZlOwotCXNjcmVlbi0+c2V0VHJhbnNsYXRlRnVuY3Rpb24gPSBzZXRfeGxhdGVfd3JhcHBlcjsKLQotCXNjcmVlbi0+a2JkUmVsZWFzZUFsbEtleXMgPSBrYmRfcmVsZWFzZV9hbGxfa2V5czsgCi0Jc2NyZWVuLT5zZXRTaW5nbGVXaW5kb3cgPSBzZXRfc2luZ2xlX3dpbmRvdzsgCi0Jc2NyZWVuLT5zZXRTZXJ2ZXJJbnB1dCA9IHNldF9zZXJ2ZXJfaW5wdXQ7IAotCXNjcmVlbi0+c2V0VGV4dENoYXQgPSBzZXRfdGV4dF9jaGF0OyAKLQlzY3JlZW4tPmdldEZpbGVUcmFuc2ZlclBlcm1pc3Npb24gPSBnZXRfZmlsZV90cmFuc2Zlcl9wZXJtaXR0ZWQ7IAotCi0JLyogY2FsbGVkIGZyb20gaW5ldGQsIHdlIG5lZWQgdG8gdHJlYXQgc3RkaW8gYXMgb3VyIHNvY2tldCAqLwotCWlmIChpbmV0ZCAmJiB1c2Vfb3BlbnNzbCkgewotCQkvKiBhY2NlcHRfb3BlbnNzbCgpIGNhbGxlZCBsYXRlciAqLwotCQlzY3JlZW4tPnBvcnQgPSAwOwotCX0gZWxzZSBpZiAoaW5ldGQpIHsKLQkJaW50IGZkID0gZHVwKDApOwotCQlpZiAoZmQgPCAwKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJFcnIoImR1cCgwKSA9ICVkIGZhaWxlZC5cbiIsIGZkKTsKLQkJCXJmYkxvZ1BlcnJvcigiZHVwIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWZjbG9zZShzdGRpbik7Ci0JCWZjbG9zZShzdGRvdXQpOwotCQkvKiB3ZSBrZWVwIHN0ZGVyciBmb3IgbG9nZ2luZyAqLwotCQlzY3JlZW4tPmluZXRkU29jayA9IGZkOwotCQlzY3JlZW4tPnBvcnQgPSAwOwotCi0JfSBlbHNlIGlmICghIGdvdF9yZmJwb3J0ICYmIGF1dG9fcG9ydCA+IDApIHsKLQkJaW50IGxwb3J0ID0gZmluZF9mcmVlX3BvcnQoYXV0b19wb3J0LCBhdXRvX3BvcnQrMjAwKTsKLQkJc2NyZWVuLT5hdXRvUG9ydCA9IEZBTFNFOwotCQlzY3JlZW4tPnBvcnQgPSBscG9ydDsKLQl9IGVsc2UgaWYgKCEgZ290X3JmYnBvcnQpIHsKLQkJc2NyZWVuLT5hdXRvUG9ydCA9IFRSVUU7Ci0JfSBlbHNlIGlmIChnb3RfcmZicG9ydCAmJiBnb3RfcmZicG9ydF92YWwgPT0gMCkgewotCQlzY3JlZW4tPmF1dG9Qb3J0ID0gRkFMU0U7Ci0JCXNjcmVlbi0+cG9ydCA9IDA7Ci0JfQotCi0JaWYgKCEgZ290X25ldmVyc2hhcmVkICYmICEgZ290X2Fsd2F5c3NoYXJlZCkgewotCQlpZiAoc2hhcmVkKSB7Ci0JCQlzY3JlZW4tPmFsd2F5c1NoYXJlZCA9IFRSVUU7Ci0JCX0gZWxzZSB7Ci0JCQlzY3JlZW4tPm5ldmVyU2hhcmVkID0gVFJVRTsKLQkJfQotCQlzY3JlZW4tPmRvbnREaXNjb25uZWN0ID0gVFJVRTsKLQl9Ci0JaWYgKCEgZ290X2RlZmVydXBkYXRlKSB7Ci0JCXNjcmVlbi0+ZGVmZXJVcGRhdGVUaW1lID0gZGVmZXJfdXBkYXRlOwotCX0gZWxzZSB7Ci0JCWRlZmVyX3VwZGF0ZSA9IHNjcmVlbi0+ZGVmZXJVcGRhdGVUaW1lOwotCX0KLQotCWlmIChub2lwdjQgfHwgZ2V0ZW52KCJJUFY0X0ZBSUxTIikpIHsKLQkJcmZiQm9vbCBhcCA9IHNjcmVlbi0+YXV0b1BvcnQ7Ci0JCWludCBwb3J0ID0gc2NyZWVuLT5wb3J0OwotCi0JCWlmIChnZXRlbnYoIklQVjRfRkFJTFMiKSkgewotCQkJcmZiTG9nKCJURVNUSU5HOiBJUFY0X0ZBSUxTIGZvciByZmJJbml0U2VydmVyKClcbiIpOwotCQl9Ci0KLQkJc2NyZWVuLT5hdXRvUG9ydCA9IEZBTFNFOwotCQlzY3JlZW4tPnBvcnQgPSAwOwotCi0JCXJmYkluaXRTZXJ2ZXIoc2NyZWVuKTsKLQotCQlzY3JlZW4tPmF1dG9Qb3J0ID0gYXA7Ci0JCXNjcmVlbi0+cG9ydCA9IHBvcnQ7Ci0JCQotCX0gZWxzZSB7Ci0JCXJmYkluaXRTZXJ2ZXIoc2NyZWVuKTsKLQl9Ci0KLQlpZiAodXNlX29wZW5zc2wpIHsKLQkJb3BlbnNzbF9wb3J0KDApOwotCQlpZiAoaHR0cHNfcG9ydF9udW0gPj0gMCkgewotCQkJaHR0cHNfcG9ydCgwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChpcHY2X2xpc3RlbikgewotCQkJaW50IGZkID0gLTE7Ci0JCQlpZiAoc2NyZWVuLT5wb3J0IDw9IDApIHsKLQkJCQlpZiAoZ290X3JmYnBvcnQpIHsKLQkJCQkJc2NyZWVuLT5wb3J0ID0gZ290X3JmYnBvcnRfdmFsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBhcCA9IDU5MDA7Ci0JCQkJCWlmIChhdXRvX3BvcnQgPiAwKSB7Ci0JCQkJCQlhcCA9IGF1dG9fcG9ydDsKLQkJCQkJfQotCQkJCQlzY3JlZW4tPnBvcnQgPSBmaW5kX2ZyZWVfcG9ydDYoYXAsIGFwKzIwMCk7Ci0JCQkJfQotCQkJfQotCQkJZmQgPSBsaXN0ZW42KHNjcmVlbi0+cG9ydCk7Ci0JCQlpZiAoZmQgPCAwKSB7Ci0JCQkJaXB2Nl9saXN0ZW4gPSAwOwotCQkJCXJmYkxvZygiTm90IGxpc3RlbmluZyBvbiBJUHY2IGludGVyZmFjZS5cbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIkxpc3RlbmluZyAlcyBvbiBJUHY2IHBvcnQgJWQgKHNvY2tldCAlZClcbiIsCi0JCQkJICAgIHNjcmVlbi0+bGlzdGVuU29jayA8IDAgPyAib25seSIgOiAiYWxzbyIsCi0JCQkJICAgIHNjcmVlbi0+cG9ydCwgZmQpOwotCQkJCWlwdjZfbGlzdGVuX2ZkID0gZmQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpbnN0YWxsX3Bhc3N3ZHMoKTsKLQotCWlmIChsb2NrZWRfc2VuZHMpIHsKLQkJbG9ja19jbGllbnRfc2VuZHMoMCk7Ci0JfQotCXJldHVybjsKLX0KLQotI2RlZmluZSBET19BVkFISSBcCi0JaWYgKGF2YWhpKSB7IFwKLQkJYXZhaGlfaW5pdGlhbGlzZSgpOyBcCi0JCWF2YWhpX2FkdmVydGlzZSh2bmNfZGVza3RvcF9uYW1lLCBob3N0LCBscG9ydCk7IFwKLQkJdXNsZWVwKDEwMDAqMTAwMCk7IFwKLQl9Ci0KLXZvaWQgYW5ub3VuY2UoaW50IGxwb3J0LCBpbnQgc3NsLCBjaGFyICppZmFjZSkgewotCQotCWNoYXIgKmhvc3QgPSB0aGlzX2hvc3QoKTsKLQljaGFyICp0dmR0OwotCi0JaWYgKHJlbW90ZV9kaXJlY3QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHNzbCkgewotCQl0dmR0ID0gIlRoZSBWTkMgZGVza3RvcCBpczogICAgICI7Ci0JfSBlbHNlIHsKLQkJaWYgKGVuY19zdHIgJiYgIXN0cmNtcChlbmNfc3RyLCAibm9uZSIpKSB7Ci0JCQl0dmR0ID0gIlRoZSBWTkMgZGVza3RvcCBpczogICAgICI7Ci0JCX0gZWxzZSBpZiAoZW5jX3N0cikgewotCQkJdHZkdCA9ICJUaGUgRU5DIFZOQyBkZXNrdG9wIGlzOiAiOwotCQl9IGVsc2UgewotCQkJdHZkdCA9ICJUaGUgU1NMIFZOQyBkZXNrdG9wIGlzOiAiOwotCQl9Ci0JfQotCi0JaWYgKGlmYWNlICE9IE5VTEwgJiYgKmlmYWNlICE9ICdcMCcgJiYgc3RyY21wKGlmYWNlLCAiYW55IikpIHsKLQkJaG9zdCA9IGlmYWNlOwotCX0KLQlpZiAoaG9zdCAhPSBOVUxMKSB7Ci0JCS8qIG5vdGUgdGhhdCB2bmN2aWV3ZXIgc3BlY2lhbCBjYXNlcyA1OTAwLTU5OTkgKi8KLQkJaW50IHN6ID0gMjU2OwotCQlpZiAoaW5ldGQpIHsKLQkJCTsJLyogc2hvdWxkIG5vdCBvY2N1ciAocG9ydCkgKi8KLQkJfSBlbHNlIGlmIChxdWlldCkgewotCQkJaWYgKGxwb3J0ID49IDU5MDApIHsKLQkJCQlzbnByaW50Zih2bmNfZGVza3RvcF9uYW1lLCBzeiwgIiVzOiVkIiwKLQkJCQkgICAgaG9zdCwgbHBvcnQgLSA1OTAwKTsKLQkJCQlET19BVkFISQotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4lcyAlc1xuIiwgdHZkdCwKLQkJCQkgICAgdm5jX2Rlc2t0b3BfbmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNucHJpbnRmKHZuY19kZXNrdG9wX25hbWUsIHN6LCAiJXM6JWQiLAotCQkJCSAgICBob3N0LCBscG9ydCk7Ci0JCQkJRE9fQVZBSEkKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXNcbiIsIHR2ZHQsCi0JCQkJICAgIHZuY19kZXNrdG9wX25hbWUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGxwb3J0ID49IDU5MDApIHsKLQkJCXNucHJpbnRmKHZuY19kZXNrdG9wX25hbWUsIHN6LCAiJXM6JWQiLAotCQkJICAgIGhvc3QsIGxwb3J0IC0gNTkwMCk7Ci0JCQlET19BVkFISQotCQkJZnByaW50ZihzdGRlcnIsICJcbiVzICVzXG4iLCB0dmR0LCB2bmNfZGVza3RvcF9uYW1lKTsKLQkJCWlmIChscG9ydCA+PSA2MDAwKSB7Ci0JCQkJcmZiTG9nKCJwb3NzaWJsZSBhbGlhc2VzOiAgJXM6JWQsICIKLQkJCQkgICAgIiVzOjolZFxuIiwgaG9zdCwgbHBvcnQsCi0JCQkJICAgIGhvc3QsIGxwb3J0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKHZuY19kZXNrdG9wX25hbWUsIHN6LCAiJXM6JWQiLAotCQkJICAgIGhvc3QsIGxwb3J0KTsKLQkJCURPX0FWQUhJCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXNcbiIsIHR2ZHQsIHZuY19kZXNrdG9wX25hbWUpOwotCQkJcmZiTG9nKCJwb3NzaWJsZSBhbGlhczogICAgJXM6OiVkXG4iLAotCQkJICAgIGhvc3QsIGxwb3J0KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYW5ub3VuY2VfaHR0cChpbnQgbHBvcnQsIGludCBzc2wsIGNoYXIgKmlmYWNlLCBjaGFyICpleHRyYSkgewotCQotCWNoYXIgKmhvc3QgPSB0aGlzX2hvc3QoKTsKLQljaGFyICpqdnU7Ci0JaW50IGh0dHAgPSAwOwotCi0JaWYgKGVuY19zdHIgJiYgIXN0cmNtcChlbmNfc3RyLCAibm9uZSIpICYmICF1c2Vfc3R1bm5lbCkgewotCQlqdnUgPSAiSmF2YSB2aWV3ZXIgVVJMOiAgICAgICAgIGh0dHAiOwotCQlodHRwID0gMTsKLQl9IGVsc2UgaWYgKHNzbCA9PSAxKSB7Ci0JCWp2dSA9ICJKYXZhIFNTTCB2aWV3ZXIgVVJMOiAgICAgaHR0cHMiOwotCX0gZWxzZSBpZiAoc3NsID09IDIpIHsKLQkJanZ1ID0gIkphdmEgU1NMIHZpZXdlciBVUkw6ICAgICBodHRwIjsKLQkJaHR0cCA9IDE7Ci0JfSBlbHNlIHsKLQkJanZ1ID0gIkphdmEgdmlld2VyIFVSTDogICAgICAgICBodHRwIjsKLQkJaHR0cCA9IDE7Ci0JfQotCi0JaWYgKGlmYWNlICE9IE5VTEwgJiYgKmlmYWNlICE9ICdcMCcgJiYgc3RyY21wKGlmYWNlLCAiYW55IikpIHsKLQkJaG9zdCA9IGlmYWNlOwotCX0KLQlpZiAoaHR0cCAmJiBnZXRlbnYoIlgxMVZOQ19IVFRQX0xJU1RFTl9MT0NBTEhPU1QiKSkgewotCQlob3N0ID0gImxvY2FsaG9zdCI7Ci0JfQotCWlmIChob3N0ICE9IE5VTEwpIHsKLQkJaWYgKCEgaW5ldGQpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXM6Ly8lczolZC8lc1xuIiwganZ1LCBob3N0LCBscG9ydCwgZXh0cmEpOwotCQl9Ci0JfQotfQotCi12b2lkIGRvX2Fubm91bmNlX2h0dHAodm9pZCkgewotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJlbW90ZV9kaXJlY3QpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFhYWCBpcHY2PyAqLwotCWlmICgoc2NyZWVuLT5odHRwTGlzdGVuU29jayA+IC0xIHx8IGlwdjZfaHR0cF9mZCA+IC0xKSAmJiBzY3JlZW4tPmh0dHBQb3J0KSB7Ci0JCWludCBlbmNfbm9uZSA9IChlbmNfc3RyICYmICFzdHJjbXAoZW5jX3N0ciwgIm5vbmUiKSk7Ci0JCWNoYXIgKlNQT1JUID0gIiAgIChzaW5nbGUgcG9ydCkiOwotCQlpZiAodXNlX29wZW5zc2wgJiYgISBlbmNfbm9uZSkgewotCQkJYW5ub3VuY2VfaHR0cChzY3JlZW4tPnBvcnQsIDEsIGxpc3Rlbl9zdHIsIFNQT1JUKTsKLQkJCWlmIChodHRwc19wb3J0X251bSA+PSAwKSB7Ci0JCQkJYW5ub3VuY2VfaHR0cChodHRwc19wb3J0X251bSwgMSwKLQkJCQkgICAgbGlzdGVuX3N0ciwgIiIpOwotCQkJfQotCQkJYW5ub3VuY2VfaHR0cChzY3JlZW4tPmh0dHBQb3J0LCAyLCBsaXN0ZW5fc3RyLCAiIik7Ci0JCX0gZWxzZSBpZiAodXNlX3N0dW5uZWwpIHsKLQkJCWNoYXIgcG1zZ1sxMDBdOwotCQkJcG1zZ1swXSA9ICdcMCc7Ci0JCQlpZiAoc3R1bm5lbF9wb3J0KSB7Ci0JCQkJc3ByaW50ZihwbXNnLCAiP1BPUlQ9JWQiLCBzdHVubmVsX3BvcnQpOwotCQkJfQotCQkJYW5ub3VuY2VfaHR0cChzY3JlZW4tPmh0dHBQb3J0LCAyLCBsaXN0ZW5fc3RyLCBwbXNnKTsKLQkJCWlmIChzdHVubmVsX2h0dHBfcG9ydCA+IDApIHsKLQkJCQlhbm5vdW5jZV9odHRwKHN0dW5uZWxfaHR0cF9wb3J0LCAxLCBOVUxMLCBwbXNnKTsKLQkJCX0KLQkJCWlmIChlbmNfbm9uZSkgewotCQkJCXN0cmNhdChwbXNnLCBTUE9SVCk7Ci0JCQkJYW5ub3VuY2VfaHR0cChzdHVubmVsX3BvcnQsIDEsIE5VTEwsIHBtc2cpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYW5ub3VuY2VfaHR0cChzY3JlZW4tPmh0dHBQb3J0LCAwLCBsaXN0ZW5fc3RyLCAiIik7Ci0JCQlpZiAoZW5jX25vbmUpIHsKLQkJCQlhbm5vdW5jZV9odHRwKHNjcmVlbi0+cG9ydCwgMSwgTlVMTCwgU1BPUlQpOwotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIGRvX21lbnRpb25famF2YV91cmxzKHZvaWQpIHsKLQlpZiAoISBxdWlldCAmJiBzY3JlZW4pIHsKLQkJLyogWFhYIGlwdjY/ICovCi0JCWlmIChzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID4gLTEgJiYgc2NyZWVuLT5odHRwUG9ydCkgewotCQkJcmZiTG9nKCJcbiIpOwotCQkJcmZiTG9nKCJUaGUgVVJMcyBwcmludGVkIG91dCBiZWxvdyAoJ0phdmEgLi4uIHZpZXdlciBVUkwnKSBjYW5cbiIpOwotCQkJcmZiTG9nKCJiZSB1c2VkIGZvciBKYXZhIGVuYWJsZWQgV2ViIGJyb3dzZXIgY29ubmVjdGlvbnMuXG4iKTsKLQkJCWlmICghc3R1bm5lbF9wb3J0ICYmIGVuY19zdHIgJiYgIXN0cmNtcChlbmNfc3RyLCAibm9uZSIpKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmICh1c2Vfb3BlbnNzbCB8fCBzdHVubmVsX3BvcnQpIHsKLQkJCQlyZmJMb2coIkhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBwb3NzaWJpbGl0aWVzOlxuIik7Ci0JCQkJcmZiTG9nKCJcbiIpOwotCQkJCXJmYkxvZygiaHR0cHM6Ly9ob3N0OnBvcnQvcHJveHkudm5jIChNVVNUIGJlIHVzZWQgaWYgV2ViIFByb3h5IHVzZWQpXG4iKTsKLQkJCQlyZmJMb2coIlxuIik7Ci0JCQkJcmZiTG9nKCJodHRwczovL2hvc3Q6cG9ydC91bHRyYS52bmMgKFVzZSBVbHRyYVZOQyBKYXZhIFZpZXdlcilcbiIpOwotCQkJCXJmYkxvZygiaHR0cHM6Ly9ob3N0OnBvcnQvdWx0cmFwcm94eS52bmMgKFdlYiBQcm94eSB3aXRoIFVsdHJhVk5DKVxuIik7Ci0JCQkJcmZiTG9nKCJodHRwczovL2hvc3Q6cG9ydC91bHRyYXNpZ25lZC52bmMgKFNpZ25lZCBVbHRyYVZOQyBGaWxleGZlcilcbiIpOwotCQkJCXJmYkxvZygiXG4iKTsKLQkJCQlyZmJMb2coIldoZXJlIHlvdSByZXBsYWNlIFwiaG9zdDpwb3J0XCIgd2l0aCB0aGF0IHByaW50ZWQgYmVsb3csIG9yXG4iKTsKLQkJCQlyZmJMb2coIndoYXRldmVyIGlzIG5lZWRlZCB0byByZWFjaCB0aGUgaG9zdCBlLmcuIEludGVybmV0IElQIG51bWJlclxuIik7Ci0JCQkJcmZiTG9nKCJcbiIpOwotCQkJCXJmYkxvZygiQXBwZW5kID9HRVQ9MSB0byBhIFVSTCBmb3IgZmFzdGVyIGxvYWRpbmcgb3Igc3VwcGx5OlxuIik7Ci0JCQkJcmZiTG9nKCItZW52IFgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVM9Jz9HRVQ9MScgdG8gY21kbGluZS5cbiIpOwotCQkJfQotCQl9Ci0JCXJmYkxvZygiXG4iKTsKLQl9Ci19Ci0KLXZvaWQgc2V0X3ZuY19kZXNrdG9wX25hbWUodm9pZCkgewotCXNwcmludGYodm5jX2Rlc2t0b3BfbmFtZSwgInVua25vd24iKTsKLQlpZiAoaW5ldGQpIHsKLQkJc3ByaW50Zih2bmNfZGVza3RvcF9uYW1lLCAiJXMvaW5ldGQtbm8tZnVydGhlci1jbGllbnRzIiwKLQkJICAgIHRoaXNfaG9zdCgpKTsKLQl9Ci0JaWYgKHJlbW90ZV9kaXJlY3QpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc2NyZWVuLT5wb3J0KSB7Ci0KLQkJZG9fbWVudGlvbl9qYXZhX3VybHMoKTsKLQotCQlpZiAodXNlX29wZW5zc2wpIHsKLQkJCWFubm91bmNlKHNjcmVlbi0+cG9ydCwgMSwgbGlzdGVuX3N0cik7Ci0JCX0gZWxzZSB7Ci0JCQlhbm5vdW5jZShzY3JlZW4tPnBvcnQsIDAsIGxpc3Rlbl9zdHIpOwotCQl9Ci0JCWlmIChzdHVubmVsX3BvcnQpIHsKLQkJCWFubm91bmNlKHN0dW5uZWxfcG9ydCwgMSwgTlVMTCk7Ci0JCX0KLQotCQlkb19hbm5vdW5jZV9odHRwKCk7Ci0JCQotCQlmZmx1c2goc3RkZXJyKTsJCi0JCWlmIChpbmV0ZCkgewotCQkJOwkvKiBzaG91bGQgbm90IG9jY3VyIChwb3J0ICE9IDApICovCi0JCX0gZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZG91dCwgIlBPUlQ9JWRcbiIsIHNjcmVlbi0+cG9ydCk7Ci0JCQlpZiAoc3R1bm5lbF9wb3J0KSB7Ci0JCQkJZnByaW50ZihzdGRvdXQsICJTU0xQT1JUPSVkXG4iLCBzdHVubmVsX3BvcnQpOwotCQkJfSBlbHNlIGlmICh1c2Vfb3BlbnNzbCkgewotCQkJCWlmIChlbmNfc3RyICYmICFzdHJjbXAoZW5jX3N0ciwgIm5vbmUiKSkgewotCQkJCQk7Ci0JCQkJfSBlbHNlIGlmIChlbmNfc3RyKSB7Ci0JCQkJCWZwcmludGYoc3Rkb3V0LCAiRU5DUE9SVD0lZFxuIiwgc2NyZWVuLT5wb3J0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlmcHJpbnRmKHN0ZG91dCwgIlNTTFBPUlQ9JWRcbiIsIHNjcmVlbi0+cG9ydCk7Ci0JCQkJfQotCQkJfQotCQkJZmZsdXNoKHN0ZG91dCk7CQotCQkJaWYgKGZsYWdmaWxlKSB7Ci0JCQkJRklMRSAqZmxhZyA9IGZvcGVuKGZsYWdmaWxlLCAidyIpOwotCQkJCWlmIChmbGFnKSB7Ci0JCQkJCWZwcmludGYoZmxhZywgIlBPUlQ9JWRcbiIsc2NyZWVuLT5wb3J0KTsKLQkJCQkJaWYgKHN0dW5uZWxfcG9ydCkgewotCQkJCQkJZnByaW50ZihmbGFnLCAiU1NMX1BPUlQ9JWRcbiIsCi0JCQkJCQkgICAgc3R1bm5lbF9wb3J0KTsKLQkJCQkJfQotCQkJCQlmZmx1c2goZmxhZyk7CQotCQkJCQlmY2xvc2UoZmxhZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmZiTG9nKCJjb3VsZCBub3Qgb3BlbiBmbGFnIGZpbGU6ICVzXG4iLAotCQkJCQkgICAgZmxhZ2ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChybV9mbGFnZmlsZSkgewotCQkJCWludCBjcmVhdGUgPSAwOwotCQkJCXN0cnVjdCBzdGF0IHNiOwotCQkJCWlmIChzdHJzdHIocm1fZmxhZ2ZpbGUsICJjcmVhdGU6IikgPT0gcm1fZmxhZ2ZpbGUpIHsKLQkJCQkJY2hhciAqcyA9IHJtX2ZsYWdmaWxlOwotCQkJCQljcmVhdGUgPSAxOwotCQkJCQlybV9mbGFnZmlsZSA9IHN0cmR1cChybV9mbGFnZmlsZSArIHN0cmxlbigiY3JlYXRlOiIpKTsKLQkJCQkJZnJlZShzKTsKLQkJCQl9Ci0JCQkJaWYgKHN0cnN0cihybV9mbGFnZmlsZSwgIm5vY3JlYXRlOiIpID09IHJtX2ZsYWdmaWxlKSB7Ci0JCQkJCWNoYXIgKnMgPSBybV9mbGFnZmlsZTsKLQkJCQkJY3JlYXRlID0gMDsKLQkJCQkJcm1fZmxhZ2ZpbGUgPSBzdHJkdXAocm1fZmxhZ2ZpbGUgKyBzdHJsZW4oIm5vY3JlYXRlOiIpKTsKLQkJCQkJZnJlZShzKTsKLQkJCQl9IGVsc2UgaWYgKHN0YXQocm1fZmxhZ2ZpbGUsICZzYikgIT0gMCkgewotCQkJCQljcmVhdGUgPSAxOwotCQkJCX0KLQkJCQlpZiAoY3JlYXRlKSB7Ci0JCQkJCUZJTEUgKmZsYWcgPSBmb3BlbihybV9mbGFnZmlsZSwgInciKTsKLQkJCQkJaWYgKGZsYWcpIHsKLQkJCQkJCWZwcmludGYoZmxhZywgIiVkXG4iLCBnZXRwaWQoKSk7Ci0JCQkJCQlmY2xvc2UoZmxhZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmZsdXNoKHN0ZG91dCk7CQotCX0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfY3Vyc29yX2NoYW5nZXModm9pZCkgewotCXN0YXRpYyBkb3VibGUgbGFzdF9wdXNoID0gMC4wOwotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JY3Vyc29yX2NoYW5nZXMgKz0gY2hlY2tfeDExX3BvaW50ZXIoKTsKLQotCWlmIChjdXJzb3JfY2hhbmdlcykgewotCQlkb3VibGUgdG0sIG1heF9wdXNoID0gMC4xMjUsIG11bHRpX3B1c2ggPSAwLjAxLCB3YWl0ID0gMC4wMjsKLQkJaW50IGN1cnNvcl9zaGFwZSwgZG9wdXNoID0gMCwgbGluaywgbGF0ZW5jeSwgbmV0cmF0ZTsKLQotCQlpZiAoISBhbGxfY2xpZW50c19pbml0aWFsaXplZCgpKSB7Ci0JCQkvKiBwbGF5IGl0IHNhZmUgKi8KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgwKSBjdXJzb3Jfc2hhcGUgPSBjdXJzb3Jfc2hhcGVfdXBkYXRlc19jbGllbnRzKHNjcmVlbik7Ci0JCi0JCWR0aW1lMCgmdG0pOwotCQlsaW5rID0gbGlua19yYXRlKCZsYXRlbmN5LCAmbmV0cmF0ZSk7Ci0JCWlmIChsaW5rID09IExSX0RJQUxVUCkgewotCQkJbWF4X3B1c2ggPSAwLjI7Ci0JCQl3YWl0ID0gMC4wNTsKLQkJfSBlbHNlIGlmIChsaW5rID09IExSX0JST0FEQkFORCkgewotCQkJbWF4X3B1c2ggPSAwLjA3NTsKLQkJCXdhaXQgPSAwLjA1OwotCQl9IGVsc2UgaWYgKGxpbmsgPT0gTFJfTEFOKSB7Ci0JCQltYXhfcHVzaCA9IDAuMDE7Ci0JCX0gZWxzZSBpZiAobGF0ZW5jeSA8IDUgJiYgbmV0cmF0ZSA+IDIwMCkgewotCQkJbWF4X3B1c2ggPSAwLjAxOwotCQl9Ci0JCQotCQlpZiAodG0gPiBsYXN0X3B1c2ggKyBtYXhfcHVzaCkgewotCQkJZG9wdXNoID0gMTsKLQkJfSBlbHNlIGlmIChjdXJzb3JfY2hhbmdlcyA+IDEgJiYgdG0gPiBsYXN0X3B1c2ggKyBtdWx0aV9wdXNoKSB7Ci0JCQlkb3B1c2ggPSAxOwotCQl9Ci0KLQkJaWYgKGRvcHVzaCkgeyAKLQkJCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCAxLCAxLCAxKTsKLQkJCWZiX3B1c2hfd2FpdCh3YWl0LCBGQl9NT0QpOwotCQkJbGFzdF9wdXNoID0gdG07Ci0JCX0gZWxzZSB7Ci0JCQlyZmJQRSgwKTsKLQkJfQotCX0KLQljdXJzb3JfY2hhbmdlcyA9IDA7Ci19Ci0KLS8qCi0gKiBUaGVzZSB3YXRjaF9sb29wKCkgcmVsZWF0ZWQgd2VyZSBtb3ZlZCBmcm9tIHgxMXZuYy5jIHNvIHdlIGNvdWxkIHRyeQotICogdG8gcmVtb3ZlIC1PMiBmcm9tIGl0cyBjb21waWxhdGlvbi4gIFREQiBuZXcgZmlsZSwgZS5nLiB3YXRjaC5jLgotICovCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2ZpbGV4ZmVyKHZvaWQpIHsKLQlzdGF0aWMgdGltZV90IGxhc3RfY2hlY2sgPSAwOwotCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCWludCB0cmFuc2ZlcnJpbmcgPSAwOyAKLQkKLQlpZiAodGltZShOVUxMKSA8PSBsYXN0X2NoZWNrKSB7Ci0JCXJldHVybjsKLQl9Ci0KLSNpZiAwCi0JaWYgKGdldGVudigiTk9GVCIpKSB7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQlpZiAoY2wtPmZpbGVUcmFuc2Zlci5yZWNlaXZpbmcpIHsKLQkJCXRyYW5zZmVycmluZyA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2wtPmZpbGVUcmFuc2Zlci5zZW5kaW5nKSB7Ci0JCQl0cmFuc2ZlcnJpbmcgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JaWYgKHRyYW5zZmVycmluZykgewotCQlkb3VibGUgc3RhcnQgPSBkbm93KCk7Ci0JCXdoaWxlIChkbm93KCkgPCBzdGFydCArIDAuNSkgewotCQkJcmZiQ0ZEKDUwMDApOwotCQkJcmZiQ0ZEKDEwMDApOwotCQkJcmZiQ0ZEKDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGFzdF9jaGVjayA9IHRpbWUoTlVMTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCByZWNvcmRfbGFzdF9mYl91cGRhdGUodm9pZCkgewotCXN0YXRpYyBpbnQgcmJzMCA9IC0xOwotCXN0YXRpYyB0aW1lX3QgbGFzdF9jYWxsID0gMDsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQlpbnQgcmJzID0gLTE7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQlyZmJDbGllbnRQdHIgY2w7Ci0KLQlpZiAobGFzdF9mYl9ieXRlc19zZW50ID09IDApIHsKLQkJbGFzdF9mYl9ieXRlc19zZW50ID0gbm93OwotCQlsYXN0X2NhbGwgPSBub3c7Ci0JfQotCi0JaWYgKG5vdyA8PSBsYXN0X2NhbGwgKyAxKSB7Ci0JCS8qIGNoZWNrIGV2ZXJ5IHNlY29uZCBvciBzbyAqLwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JbGFzdF9jYWxsID0gbm93OwotCi0JaWYgKCEgc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpdGVyID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLSNpZiAwCi0JCXJicyArPSBjbC0+cmF3Qnl0ZXNFcXVpdmFsZW50OwotI2Vsc2UKLSNpZiBMSUJWTkNTRVJWRVJfSEFTX1NUQVRTCi0JCXJicyArPSByZmJTdGF0R2V0U2VudEJ5dGVzSWZSYXcoY2wpOwotI2VuZGlmCi0jZW5kaWYKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JaWYgKHJicyAhPSByYnMwKSB7Ci0JCXJiczAgPSByYnM7Ci0JCWlmIChkZWJ1Z190aWxlcyA+IDEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicmVjb3JkX2xhc3RfZmJfdXBkYXRlOiAlZCAlZFxuIiwKLQkJCSAgICAoaW50KSBub3csIChpbnQpIGxhc3RfZmJfYnl0ZXNfc2VudCk7Ci0JCX0KLQkJbGFzdF9mYl9ieXRlc19zZW50ID0gbm93OwotCX0KLX0KLQotCi1zdGF0aWMgaW50IGNob29zZV9kZWxheShkb3VibGUgZHQpIHsKLQlzdGF0aWMgZG91YmxlIHQwID0gMC4wLCB0MSA9IDAuMCwgdDIgPSAwLjAsIG5vdzsgCi0Jc3RhdGljIGludCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCBmaXJzdCA9IDE7Ci0JaW50IGR4MCwgZHkwLCBkeDEsIGR5MSwgZG0sIGksIG1zZWMgPSB3YWl0bXM7Ci0JZG91YmxlIGN1dDEgPSAwLjE1LCBjdXQyID0gMC4wNzUsIGN1dDMgPSAwLjI1OwotCWRvdWJsZSBib2dkb3duX3RpbWUgPSAwLjI1LCBiYXZlID0gMC4wOwotCWludCBib2dkb3duID0gMSwgYmNudCA9IDA7Ci0JaW50IG5kdCA9IDgsIG5hdmUgPSAzOwotCWRvdWJsZSBmYWMgPSAxLjA7Ci0Jc3RhdGljIGludCBkYiA9IDAsIGRpZF9zZXRfZGVmZXIgPSAwOwotCXN0YXRpYyBkb3VibGUgZHRzWzhdOwotCXN0YXRpYyBpbnQgbGluayA9IExSX1VOU0VULCBsYXRlbmN5ID0gLTEsIG5ldHJhdGUgPSAtMTsKLQlzdGF0aWMgZG91YmxlIGxhc3RfbGluayA9IDAuMDsKLQotCWlmIChzY3JlZW4gJiYgZGlkX3NldF9kZWZlcikgewotCQkvKiByZXNldCBkZWZlciBpbiBjYXNlIHdlIGNoYW5nZWQgaXQgKi8KLQkJc2NyZWVuLT5kZWZlclVwZGF0ZVRpbWUgPSBkZWZlcl91cGRhdGU7Ci0JfQotCWlmICh3YWl0bXMgPT0gMCkgewotCQlyZXR1cm4gd2FpdG1zOwotCX0KLQlpZiAobm9mYikgewotCQlyZXR1cm4gd2FpdG1zOwotCX0KLQotCWlmIChmaXJzdCkgewotCQlmb3IoaT0wOyBpPG5kdDsgaSsrKSB7Ci0JCQlkdHNbaV0gPSAwLjA7Ci0JCX0KLQkJaWYgKGdldGVudigiREVCVUdfREVMQVkiKSkgewotCQkJZGIgPSBhdG9pKGdldGVudigiREVCVUdfREVMQVkiKSk7Ci0JCX0KLQkJaWYgKGdldGVudigiU0VUX0RFRkVSIikpIHsKLQkJCXNldF9kZWZlciA9IGF0b2koZ2V0ZW52KCJTRVRfREVGRVIiKSk7Ci0JCX0KLQkJZmlyc3QgPSAwOwotCX0KLQotCW5vdyA9IGRub3coKTsKLQotCWlmIChub3cgPiBsYXN0X2xpbmsgKyAzMC4wIHx8IGxpbmsgPT0gTFJfVU5TRVQpIHsKLQkJbGluayA9IGxpbmtfcmF0ZSgmbGF0ZW5jeSwgJm5ldHJhdGUpOwotCQlsYXN0X2xpbmsgPSBub3c7Ci0JfQotCi0JLyoKLQkgKiBmaXJzdCBjaGVjayBmb3IgYm9nZG93biwgZS5nLiBsb3RzIG9mIGFjdGl2aXR5LCBzY3JvbGxpbmcgdGV4dAotCSAqIGZyb20gY29tbWFuZCBvdXRwdXQsIGV0Yy4KLQkgKi8KLQlpZiAobmFwX29rKSB7Ci0JCWR0ID0gMC4wOwotCX0KLQlpZiAoISB3YWl0X2JvZykgewotCQlib2dkb3duID0gMDsKLQotCX0gZWxzZSBpZiAoYnV0dG9uX21hc2sgfHwgbm93IDwgbGFzdF9rZXlib2FyZF90aW1lICsgMipib2dkb3duX3RpbWUpIHsKLQkJLyoKLQkJICogbGV0IHNjcm9sbHMgJiBrZXlib2FyZCBpbnB1dCB0aHJvdWdoIHRoZSBub3JtYWwgd2F5Ci0JCSAqIG90aGVyd2lzZSwgaXQgd2lsbCBsaWtlbHkganVzdCBhbm5veSB0aGVtLgotCQkgKi8KLQkJYm9nZG93biA9IDA7Ci0KLQl9IGVsc2UgaWYgKGR0ID4gMC4wKSB7Ci0JCS8qCi0JCSAqIGluc3BlY3QgcmVjZW50IGR0J3M6Ci0JCSAqIDAgMSAyIDMgNCA1IDYgNyBkdAotCQkgKiAgICAgICAgICAgICBeIF4gXgotCQkgKi8KLQkJZm9yIChpID0gbmR0IC0gKG5hdmUgLSAxKTsgaSA8IG5kdDsgaSsrKSB7Ci0JCQliYXZlICs9IGR0c1tpXTsKLQkJCWJjbnQrKzsKLQkJCWlmIChkdHNbaV0gPCBib2dkb3duX3RpbWUpIHsKLQkJCQlib2dkb3duID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQliYXZlICs9IGR0OwotCQliY250Kys7Ci0JCWJhdmUgPSBiYXZlIC8gYmNudDsKLQkJaWYgKGR0IDwgYm9nZG93bl90aW1lKSB7Ci0JCQlib2dkb3duID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWJvZ2Rvd24gPSAwOwotCX0KLQkvKiBzaGlmdCBmb3IgbmV4dCB0aW1lICovCi0JZm9yIChpID0gMDsgaSA8IG5kdC0xOyBpKyspIHsKLQkJZHRzW2ldID0gZHRzW2krMV07Ci0JfQotCWR0c1tuZHQtMV0gPSBkdDsKLQotaWYgKDAgJiYgZHQgPiAwLjApIGZwcmludGYoc3RkZXJyLCAiZHQ6ICUuNWYgJS40ZlxuIiwgZHQsIGRub3d4KCkpOwotCWlmIChib2dkb3duKSB7Ci0JCWlmICh1c2VfeGRhbWFnZSkgewotCQkJLyogREFNQUdFIGNhbiBxdWV1ZSB+MTAwMCByZWN0YW5nbGVzIGZvciBhIHNjcm9sbCAqLwotCQkJY2xlYXJfeGRhbWFnZV9tYXJrX3JlZ2lvbihOVUxMLCAwKTsKLQkJfQotCQltc2VjID0gKGludCkgKDEwMDAgKiAxLjc1ICogYmF2ZSk7Ci0JCWlmIChkdHNbbmR0IC0gbmF2ZSAtIDFdID4gMC43NSAqIGJhdmUpIHsKLQkJCW1zZWMgPSAxLjUgKiBtc2VjOwotCQkJc2V0X3hkYW1hZ2VfbWFyaygwLCAwLCBkcHlfeCwgZHB5X3kpOwotCQl9Ci0JCWlmIChtc2VjID4gMTUwMCkgewotCQkJbXNlYyA9IDE1MDA7Ci0JCX0KLQkJaWYgKG1zZWMgPCB3YWl0bXMpIHsKLQkJCW1zZWMgPSB3YWl0bXM7Ci0JCX0KLQkJZGIgPSAoZGIgfHwgZGVidWdfdGlsZXMpOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYm9nZ1slZF0gJS4zZiAlLjNmICUuM2YgJS4zZlxuIiwKLQkJICAgIG1zZWMsIGR0c1tuZHQtNF0sIGR0c1tuZHQtM10sIGR0c1tuZHQtMl0sIGR0c1tuZHQtMV0pOwotCi0JCXJldHVybiBtc2VjOwotCX0KLQotCS8qIG5leHQgY2hlY2sgZm9yIHBvaW50ZXIgbW90aW9uLCBrZXlzdHJva2VzLCB0byBzcGVlZCB1cCAqLwotCXQyID0gZG5vdygpOwotCXgyID0gY3Vyc29yX3g7Ci0JeTIgPSBjdXJzb3JfeTsKLQotCWR4MCA9IG5hYnMoeDEgLSB4MCk7Ci0JZHkwID0gbmFicyh5MSAtIHkwKTsKLQlkeDEgPSBuYWJzKHgyIC0geDEpOwotCWR5MSA9IG5hYnMoeTIgLSB5MSk7Ci0KLQkvKiBiaWdnZXIgZGlzcGxhY2VtZW50IGZvciBtb3N0IHJlY2VudCBkdDogKi8KLQlpZiAoZHgxID4gZHkxKSB7Ci0JCWRtID0gZHgxOwotCX0gZWxzZSB7Ci0JCWRtID0gZHkxOwotCX0KLQotCWlmICgoZHgwIHx8IGR5MCkgJiYgKGR4MSB8fCBkeTEpKSB7Ci0JCS8qIGlmIG1vdXNlIG1vdmVkIHRoZSBwcmV2aW91cyB0d28gdGltZXM6ICovCi0JCWlmICh0MiA8IHQwICsgY3V0MSB8fCB0MiA8IHQxICsgY3V0MiB8fCBkbSA+IDIwKSB7Ci0JCQkvKgotCQkJICogaWYgd2l0aGluIDAuMTVzKDApIG9yIDAuMDc1cygxKSBvciBtb3VzZQotCQkJICogbW92ZWQgPiAyMHBpeGVscywgc2V0IGFuZCBidW1wIHVwIHRoZSBjdXQKLQkJCSAqIGRvd24gZmFjdG9yLgotCQkJICovCi0JCQlmYWMgPSB3YWl0X3VpICogMS41OwotCQl9IGVsc2UgaWYgKChkeDEgfHwgZHkxKSAmJiBkbSA+IDQwKSB7Ci0JCQlmYWMgPSB3YWl0X3VpOwotCQl9IGVsc2UgewotCQkJLyogc3RpbGwgMS4wPyAqLwotCQkJaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJ3YWl0X3VpOiBzdGlsbCAxLjBcbiIpOwotCQl9Ci0JfSBlbHNlIGlmICgoZHgxIHx8IGR5MSkgJiYgZG0gPiA0MCkgewotCQkvKiBpZiBtb3VzZSBtb3ZlZCA+IDQwIGxhc3QgdGltZTogKi8KLQkJZmFjID0gd2FpdF91aTsKLQl9Ci0KLQlpZiAoZmFjID09IDEuMCAmJiB0MiA8IGxhc3Rfa2V5Ym9hcmRfdGltZSArIGN1dDMpIHsKLQkJLyogaWYgdHlwZWQgaW4gbGFzdCAwLjI1cyBzZXQgd2FpdF91aSAqLwotCQlmYWMgPSB3YWl0X3VpOwotCX0KLQlpZiAoZmFjICE9IDEuMCkgewotCQlpZiAobGluayA9PSBMUl9MQU4gfHwgbGF0ZW5jeSA8PSAzKSB7Ci0JCQlmYWMgKj0gMS41OwotCQl9Ci0JfQotCi0JbXNlYyA9IChpbnQpICgoKGRvdWJsZSkgd2FpdG1zKSAvIGZhYyk7Ci0JaWYgKG1zZWMgPT0gMCkgewotCQltc2VjID0gMTsKLQl9Ci0KLQlpZiAoc2V0X2RlZmVyICYmIGZhYyAhPSAxLjAgJiYgc2NyZWVuKSB7Ci0JCS8qIHRoaXMgaXMgd2FpdF91aSBtb2RlLCBzZXQgZGVmZXIgdG8gbWF0Y2ggd2FpdDogKi8KLQkJaWYgKHNldF9kZWZlciA+PSAxKSB7Ci0JCQlzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSA9IG1zZWM7Ci0JCX0gZWxzZSBpZiAoc2V0X2RlZmVyIDw9IC0xKSB7Ci0JCQlzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSA9IDA7Ci0JCX0KLQkJaWYgKG5hYnMoc2V0X2RlZmVyKSA9PSAyKSB7Ci0JCQl1cmdlbnRfdXBkYXRlID0gMTsKLQkJfQotCQlkaWRfc2V0X2RlZmVyID0gMTsKLQl9Ci0KLQl4MCA9IHgxOwotCXkwID0geTE7Ci0JdDAgPSB0MTsKLQotCXgxID0geDI7Ci0JeTEgPSB5MjsKLQl0MSA9IHQyOwotCi0JaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJ3YWl0OiAlMmQgZGVmZXJbJTAyZF06ICUyZFxuIiwgbXNlYywgZGVmZXJfdXBkYXRlLCBzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSk7Ci0KLQlyZXR1cm4gbXNlYzsKLX0KLQotLyoKLSAqIG1haW4geDExdm5jIGxvb3A6IHBvbGxzLCBjaGVja3MgZm9yIGV2ZW50cywgaXRlcmF0ZSBsaWJ2bmNzZXJ2ZXIsIGV0Yy4KLSAqLwotdm9pZCB3YXRjaF9sb29wKHZvaWQpIHsKLQlpbnQgY250ID0gMCwgdGlsZV9kaWZmcyA9IDAsIHNraXBfcGUgPSAwLCB3YWl0OwotCWRvdWJsZSB0bSwgZHRyLCBkdCA9IDAuMDsKLQl0aW1lX3Qgc3RhcnQgPSB0aW1lKE5VTEwpOwotCi0JaWYgKHVzZV90aHJlYWRzICYmICFzdGFydGVkX3JmYlJ1bkV2ZW50TG9vcCkgewotCQlzdGFydGVkX3JmYlJ1bkV2ZW50TG9vcCA9IDE7Ci0JCXJmYlJ1bkV2ZW50TG9vcChzY3JlZW4sIC0xLCBUUlVFKTsKLQl9Ci0KLQl3aGlsZSAoMSkgewotCQljaGFyIG1zZ1tdID0gIm5ldyBjbGllbnQ6ICVzIHRha2luZyB1bml4cHcgY2xpZW50IG9mZiBob2xkLlxuIjsKLQkJaW50IHNraXBfc2Nhbl9mb3JfdXBkYXRlcyA9IDA7Ci0KLQkJZ290X3VzZXJfaW5wdXQgPSAwOwotCQlnb3RfcG9pbnRlcl9pbnB1dCA9IDA7Ci0JCWdvdF9sb2NhbF9wb2ludGVyX2lucHV0ID0gMDsKLQkJZ290X3BvaW50ZXJfY2FsbHMgPSAwOwotCQlnb3Rfa2V5Ym9hcmRfaW5wdXQgPSAwOwotCQlnb3Rfa2V5Ym9hcmRfY2FsbHMgPSAwOwotCQl1cmdlbnRfdXBkYXRlID0gMDsKLQotCQl4MTF2bmNfY3VycmVudCA9IGRub3coKTsKLQotCQlpZiAoISB1c2VfdGhyZWFkcykgewotCQkJZHRpbWUwKCZ0bSk7Ci0JCQlpZiAoISBza2lwX3BlKSB7Ci0JCQkJaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQkJCQlyZmJDbGllbnRQdHIgY2wgPSB1bml4cHdfY2xpZW50OwotCQkJCQlpZiAoY2wgJiYgY2wtPm9uSG9sZCkgewotCQkJCQkJcmZiTG9nKG1zZywgY2wtPmhvc3QpOwotCQkJCQkJdW5peHB3X2NsaWVudC0+b25Ib2xkID0gRkFMU0U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQltZWFzdXJlX3NlbmRfcmF0ZXMoMSk7Ci0JCQkJfQotCi0JCQkJdW5peHB3X2luX3JmYlBFID0gMTsKLQotCQkJCS8qCi0JCQkJICogZG8gYSBmZXcgbW9yZSBzaW5jZSBhIGtleSBwcmVzcyBtYXkKLQkJCQkgKiBoYXZlIGluZHVjZWQgYSBzbWFsbCBjaGFuZ2Ugd2Ugd2FudCB0bwotCQkJCSAqIHNlZSBxdWlja2x5IChqdXN0IDEgcmZiUEUgd2lsbCBsaWtlbHkKLQkJCQkgKiBvbmx5IHByb2Nlc3MgdGhlIHN1YnNlcXVlbnQgInVwIiBldmVudCkKLQkJCQkgKi8KLQkJCQlpZiAodG0gPCBsYXN0X2tleWJvYXJkX3RpbWUgKyAwLjIwKSB7Ci0JCQkJCXJmYlBFKDApOwotCQkJCQlyZmJQRSgwKTsKLQkJCQkJcmZiUEUoLTEpOwotCQkJCQlyZmJQRSgwKTsKLQkJCQkJcmZiUEUoMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGV4dHJhX2ZidXIgPiAwKSB7Ci0JCQkJCQlpbnQgaTsKLQkJCQkJCWZvciAoaT0wOyBpIDwgZXh0cmFfZmJ1cjsgaSsrKSB7Ci0JCQkJCQkJcmZiUEUoMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmZiUEUoLTEpOwotCQkJCX0KLQkJCQlpZiAoeDExdm5jX2N1cnJlbnQgPCBsYXN0X25ld19jbGllbnQgKyAwLjUpIHsKLQkJCQkJdXJnZW50X3VwZGF0ZSA9IDE7Ci0JCQkJfQotCi0JCQkJdW5peHB3X2luX3JmYlBFID0gMDsKLQotCQkJCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJCQkJLyogcmZiUEUgbG9vcCB1bnRpbCBsb2dnZWQgaW4uICovCi0JCQkJCXNraXBfcGUgPSAwOwotCQkJCQljaGVja19uZXdfY2xpZW50cygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQltZWFzdXJlX3NlbmRfcmF0ZXMoMCk7Ci0JCQkJCWZiX3VwZGF0ZV9zZW50KE5VTEwpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQkJCQlza2lwX3BlID0gMDsKLQkJCQkJY2hlY2tfbmV3X2NsaWVudHMoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJZHRyID0gZHRpbWUoJnRtKTsKLQotCQkJaWYgKCEgY3Vyc29yX3NoYXBlX3VwZGF0ZXMpIHsKLQkJCQkvKiB1bmRvIGFueSBjdXJzb3Igc2hhcGUgcmVxdWVzdHMgKi8KLQkJCQlkaXNhYmxlX2N1cnNvcl9zaGFwZV91cGRhdGVzKHNjcmVlbik7Ci0JCQl9Ci0JCQlpZiAoc2NyZWVuICYmIHNjcmVlbi0+Y2xpZW50SGVhZCkgewotCQkJCWludCByZXQgPSBjaGVja191c2VyX2lucHV0KGR0LCBkdHIsIHRpbGVfZGlmZnMsICZjbnQpOwotCQkJCS8qIHRydWU6IGxvb3AgYmFjayBmb3IgbW9yZSBpbnB1dCAqLwotCQkJCWlmIChyZXQgPT0gMikgewotCQkJCQlza2lwX3BlID0gMTsKLQkJCQl9Ci0JCQkJaWYgKHJldCkgewotCQkJCQlpZiAoZGVidWdfc2Nyb2xsKSBmcHJpbnRmKHN0ZGVyciwgIndhdGNoX2xvb3A6IExPT1AtQkFDSzogJWRcbiIsIHJldCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8qIHdhdGNoIGZvciB2aWV3b25seSBpbnB1dCBwaWxpbmcgdXA6ICovCi0JCQlpZiAoKGdvdF9wb2ludGVyX2NhbGxzID4gZ290X3BvaW50ZXJfaW5wdXQpIHx8Ci0JCQkgICAgKGdvdF9rZXlib2FyZF9jYWxscyA+IGdvdF9rZXlib2FyZF9pbnB1dCkpIHsKLQkJCQllYXRfdmlld29ubHlfaW5wdXQoMTAsIDMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogLXRocmVhZHMgaGVyZS4gKi8KLQkJCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJCQlyZmJDbGllbnRQdHIgY2wgPSB1bml4cHdfY2xpZW50OwotCQkJCWlmIChjbCAmJiBjbC0+b25Ib2xkKSB7Ci0JCQkJCXJmYkxvZyhtc2csIGNsLT5ob3N0KTsKLQkJCQkJdW5peHB3X2NsaWVudC0+b25Ib2xkID0gRkFMU0U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVzZV94cmVjb3JkKSB7Ci0JCQkJY2hlY2tfeHJlY29yZCgpOwotCQkJfQotCQkJaWYgKHdpcmVmcmFtZSAmJiBidXR0b25fbWFzaykgewotCQkJCWNoZWNrX3dpcmVmcmFtZSgpOwotCQkJfQotCQl9Ci0JCXNraXBfcGUgPSAwOwotCi0JCWlmIChzaHV0X2Rvd24pIHsKLQkJCWNsZWFuX3VwX2V4aXQoMCk7Ci0JCX0KLQotCQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSB7Ci0JCQljaGVja19uZXdfY2xpZW50cygpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoISB1cmdlbnRfdXBkYXRlKSB7Ci0JCQlpZiAoZG9fY29weV9zY3JlZW4pIHsKLQkJCQlkb19jb3B5X3NjcmVlbiA9IDA7Ci0JCQkJY29weV9zY3JlZW4oKTsKLQkJCX0KLQotCQkJY2hlY2tfbmV3X2NsaWVudHMoKTsKLQkJCWNoZWNrX25jYWNoZSgwLCAwKTsKLQkJCWNoZWNrX3hldmVudHMoMCk7Ci0JCQljaGVja19hdXRvcmVwZWF0KCk7Ci0JCQljaGVja19wbSgpOwotCQkJY2hlY2tfZmlsZXhmZXIoKTsKLQkJCWNoZWNrX2tleWNvZGVfc3RhdGUoKTsKLQkJCWNoZWNrX2Nvbm5lY3RfaW5wdXRzKCk7Ci0JCQljaGVja19ndWlfaW5wdXRzKCk7Ci0JCQljaGVja19zdHVubmVsKCk7Ci0JCQljaGVja19vcGVuc3NsKCk7Ci0JCQljaGVja19odHRwcygpOwotCQkJcmVjb3JkX2xhc3RfZmJfdXBkYXRlKCk7Ci0JCQljaGVja19wYWRkZWRfZmIoKTsKLQkJCWNoZWNrX2ZpeHNjcmVlbigpOwotCQkJY2hlY2tfeGRhbWFnZV9zdGF0ZSgpOwotCQkJY2hlY2tfeHJlY29yZF9yZXNldCgwKTsKLQkJCWNoZWNrX2FkZF9rZXlzeW1zKCk7Ci0JCQljaGVja19uZXdfcGFzc3dkcygwKTsKLSNpZmRlZiBFTkFCTEVfR1JBQkxPQ0FMCi0JCQlpZiAoZ3JhYl9sb2NhbCkgewotCQkJCWNoZWNrX2xvY2FsX2dyYWIoKTsKLQkJCX0KLSNlbmRpZgotCQkJaWYgKHN0YXJ0ZWRfYXNfcm9vdCkgewotCQkJCWNoZWNrX3N3aXRjaGVkX3VzZXIoKTsKLQkJCX0KLQotCQkJaWYgKGZpcnN0X2Nvbm5fdGltZW91dCA8IDApIHsKLQkJCQlzdGFydCA9IHRpbWUoTlVMTCk7Ci0JCQkJZmlyc3RfY29ubl90aW1lb3V0ID0gLWZpcnN0X2Nvbm5fdGltZW91dDsKLQkJCX0KLQkJfQotCi0JCWlmIChyYXdmYl92bmNfcmVmbGVjdCkgewotCQkJc3RhdGljIHRpbWVfdCBsYXN0b25lID0gMDsKLQkJCWlmICh0aW1lKE5VTEwpID4gbGFzdG9uZSArIDEwKSB7Ci0JCQkJbGFzdG9uZSA9IHRpbWUoTlVMTCk7Ci0JCQkJdm5jX3JlZmxlY3RfcHJvY2Vzc19jbGllbnQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmaXJzdF9jb25uX3RpbWVvdXQpIHsKLQkJCWludCB0ID0gZmlyc3RfY29ubl90aW1lb3V0OwotCQkJaWYgKCFjbGllbnRzX3NlcnZlZCkgewotCQkJCWlmICh0aW1lKE5VTEwpIC0gc3RhcnQgPiBmaXJzdF9jb25uX3RpbWVvdXQpIHsKLQkJCQkJcmZiTG9nKCJObyBjbGllbnQgYWZ0ZXIgJWQgc2Vjcy5cbiIsIHQpOwotCQkJCQlzaHV0X2Rvd24gPSAxOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFjbGllbnRfbm9ybWFsX2NvdW50KSB7Ci0JCQkJCWlmICh0aW1lKE5VTEwpIC0gc3RhcnQgPiB0ICsgMykgewotCQkJCQkJcmZiTG9nKCJObyB2YWxpZCBjbGllbnQgYWZ0ZXIgJWQgc2Vjcy5cbiIsIHQgKyAzKTsKLQkJCQkJCXNodXRfZG93biA9IDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoISBzY3JlZW4gfHwgISBzY3JlZW4tPmNsaWVudEhlYWQpIHsKLQkJCS8qIHdhaXRpbmcgZm9yIGEgY2xpZW50ICovCi0JCQl1c2xlZXAoMjAwICogMTAwMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChmaXJzdF9jb25uX3RpbWVvdXQgJiYgYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQkJZmlyc3RfY29ubl90aW1lb3V0ID0gMDsKLQkJfQotCi0JCWlmIChub2ZiKSB7Ci0JCQkvKiBubyBmcmFtZWJ1ZmZlciBwb2xsaW5nIG5lZWRlZCAqLwotCQkJaWYgKGN1cnNvcl9wb3NfdXBkYXRlcykgewotCQkJCWNoZWNrX3gxMV9wb2ludGVyKCk7Ci0JCQl9Ci0jaWZkZWYgTUFDT1NYCi0JCQllbHNlIGNoZWNrX3gxMV9wb2ludGVyKCk7Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh4MTF2bmNfY3VycmVudCA8IGxhc3RfbmV3X2NsaWVudCArIDAuNSAmJiAhYWxsX2NsaWVudHNfaW5pdGlhbGl6ZWQoKSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN1YndpbiAmJiBmcmVlemVfd2hlbl9vYnNjdXJlZCkgewotCQkJLyogWFhYIG5vdCB3b3JraW5nICovCi0JCQlYX0xPQ0s7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCVhfVU5MT0NLOwotCQkJY2hlY2tfeGV2ZW50cygwKTsKLQkJCWlmIChzdWJ3aW5fb2JzY3VyZWQpIHsKLQkJCQlza2lwX3NjYW5fZm9yX3VwZGF0ZXMgPSAxOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNraXBfc2Nhbl9mb3JfdXBkYXRlcykgewotCQkJOwotCQl9IGVsc2UgaWYgKGJ1dHRvbl9tYXNrICYmICghc2hvd19kcmFnZ2luZyB8fCBwb2ludGVyX21vZGUgPT0gMCkpIHsKLQkJCS8qCi0JCQkgKiBpZiBhbnkgYnV0dG9uIGlzIHByZXNzZWQgaW4gdGhpcyBtb2RlIGRvCi0JCQkgKiBub3QgdXBkYXRlIHJmYiBzY3JlZW4sIGJ1dCBkbyBmbHVzaCB0aGUKLQkJCSAqIFgxMSBkaXNwbGF5LgotCQkJICovCi0JCQlYX0xPQ0s7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCVhfVU5MT0NLOwotCQkJZHQgPSAwLjA7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0aWMgZG91YmxlIGxhc3RfZHQgPSAwLjA7Ci0JCQlkb3VibGUgeGRhbWFnZV90aHJhc2ggPSAwLjQ7IAotCQkJc3RhdGljIGludCB0aWxlY3V0ID0gLTE7Ci0KLQkJCWNoZWNrX2N1cnNvcl9jaGFuZ2VzKCk7Ci0KLQkJCS8qIGZvciB0aW1pbmcgdGhlIHNjYW4gdG8gdHJ5IHRvIGRldGVjdCB0aHJhc2hpbmcgKi8KLQotCQkJaWYgKHVzZV94ZGFtYWdlICYmIGxhc3RfZHQgPiB4ZGFtYWdlX3RocmFzaCkgIHsKLQkJCQljbGVhcl94ZGFtYWdlX21hcmtfcmVnaW9uKE5VTEwsIDApOwotCQkJfQotCi0JCQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSBjb250aW51ZTsKLQotCQkJaWYgKHJhd2ZiX3ZuY19yZWZsZWN0KSB7Ci0JCQkJdm5jX3JlZmxlY3RfcHJvY2Vzc19jbGllbnQoKTsKLQkJCX0KLQotCQkJZHRpbWUwKCZ0bSk7Ci0KLSNpZiAhTk9fWDExCi0JCQlpZiAoeHJhbmRyX3ByZXNlbnQgJiYgIXhyYW5kciAmJiB4cmFuZHJfbWF5YmUpIHsKLQkJCQlpbnQgZGVsYXkgPSAxODA7Ci0JCQkJLyogIHRoZXJlIG1heSBiZSB4cmFuZHIgcmlnaHQgYWZ0ZXIgeHNlc3Npb24gc3RhcnQgKi8KLQkJCQlpZiAodG0gPCB4MTF2bmNfc3RhcnQgKyBkZWxheSB8fCB0bSA8IGxhc3RfY2xpZW50ICsgZGVsYXkpIHsKLQkJCQkJaW50IHR3ID0gMjA7Ci0JCQkJCWlmIChhdXRoX2ZpbGUgIT0gTlVMTCkgewotCQkJCQkJdHcgPSAxMjA7Ci0JCQkJCX0KLQkJCQkJWF9MT0NLOwotCQkJCQlpZiAodG0gPCB4MTF2bmNfc3RhcnQgKyB0dyB8fCB0bSA8IGxhc3RfY2xpZW50ICsgdHcpIHsKLQkJCQkJCVhTeW5jKGRweSwgRmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJCX0KLQkJCQkJWF9VTkxPQ0s7Ci0JCQkJfQotCQkJCVhfTE9DSzsKLQkJCQljaGVja194cmFuZHJfZXZlbnQoImJlZm9yZS1zY2FuIik7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQl9Ci0jZW5kaWYKLQkJCWlmICh1c2Vfc25hcGZiKSB7Ci0JCQkJaW50IHQsIHRyaWVzID0gMzsKLQkJCQljb3B5X3NuYXAoKTsKLQkJCQlmb3IgKHQ9MDsgdCA8IHRyaWVzOyB0KyspIHsKLQkJCQkJdGlsZV9kaWZmcyA9IHNjYW5fZm9yX3VwZGF0ZXMoMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aWxlX2RpZmZzID0gc2Nhbl9mb3JfdXBkYXRlcygwKTsKLQkJCX0KLQkJCWR0ID0gZHRpbWUoJnRtKTsKLQkJCWlmICghIG5hcF9vaykgewotCQkJCWxhc3RfZHQgPSBkdDsKLQkJCX0KLQotCQkJaWYgKHRpbGVjdXQgPCAwKSB7Ci0JCQkJaWYgKGdldGVudigiVElMRUNVVCIpKSB7Ci0JCQkJCXRpbGVjdXQgPSBhdG9pKGdldGVudigiVElMRUNVVCIpKTsKLQkJCQl9Ci0JCQkJaWYgKHRpbGVjdXQgPCAwKSB0aWxlY3V0ID0gNDsKLQkJCX0KLQotCQkJaWYgKChkZWJ1Z190aWxlcyB8fCBkZWJ1Z19zY3JvbGwgPiAxIHx8IGRlYnVnX3dpcmVmcmFtZSA+IDEpCi0JCQkgICAgJiYgKHRpbGVfZGlmZnMgPiB0aWxlY3V0IHx8IGRlYnVnX3RpbGVzID4gMSkpIHsKLQkJCQlkb3VibGUgcmF0ZSA9ICh0aWxlX3ggKiB0aWxlX3kgKiBicHAvOCAqIHRpbGVfZGlmZnMpIC8gZHQ7Ci0JCQkJZnByaW50ZihzdGRlcnIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUSUxFUzogJWQgIGR0OiAlLjRmIgotCQkJCSAgICAiICB0OiAlLjRmICAlLjJmIE1CL3MgbmFwX29rOiAlZFxuIiwgdGlsZV9kaWZmcywgZHQsCi0JCQkJICAgIHRtIC0geDExdm5jX3N0YXJ0LCByYXRlLzEwMDAwMDAuMCwgbmFwX29rKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyogc2xlZXAgYSBiaXQgdG8gbGVzc2VuIGxvYWQgKi8KLQkJd2FpdCA9IGNob29zZV9kZWxheShkdCk7Ci0KLQkJaWYgKHVyZ2VudF91cGRhdGUpIHsKLQkJCTsKLQkJfSBlbHNlIGlmICh3YWl0ID4gMip3YWl0bXMpIHsKLQkJCS8qIGJvZyBjYXNlLCBicmVhayBpdCB1cCAqLwotCQkJbmFwX3NsZWVwKHdhaXQsIDEwKTsKLQkJfSBlbHNlIHsKLQkJCWRvdWJsZSB0MSwgdDI7Ci0JCQlpbnQgaWR0OwotCQkJaWYgKGV4dHJhX2ZidXIgPiAwKSB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpPTA7IGkgPD0gZXh0cmFfZmJ1cjsgaSsrKSB7Ci0JCQkJCWludCByID0gcmZiUEUoMCk7Ci0JCQkJCWlmICghcikgYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBzb21ldGltZXMgdGhlIHNsZWVwIGlzIHRvbyBzaG9ydCwgc28gbWVhc3VyZSBpdDogKi8KLQkJCXQxID0gZG5vdygpOwotCQkJdXNsZWVwKHdhaXQgKiAxMDAwKTsKLQkJCXQyID0gZG5vdygpOwotCi0JCQlpZHQgPSAoaW50KSAoMTAwMC4gKiAodDIgLSB0MSkpOwotCQkJaWYgKGlkdCA+IDAgJiYgaWR0IDwgd2FpdCkgewotCQkJCS8qIHRyeSB0byBzbGVlcCB0aGUgcmVtYWluZGVyICovCi0JCQkJdXNsZWVwKCh3YWl0IC0gaWR0KSAqIDEwMDApOwotCQkJfQotCQl9Ci0KLQkJY250Kys7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy9zY3JlZW4uaCBiL3gxMXZuYy9zY3JlZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczNzZmNC4uMDAwMDAwMAotLS0gYS94MTF2bmMvc2NyZWVuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19TQ1JFRU5fSAotI2RlZmluZSBfWDExVk5DX1NDUkVFTl9ICi0KLS8qIC0tIHNjcmVlbi5oIC0tICovCi0KLWV4dGVybiB2b2lkIHNldF9ncmV5c2NhbGVfY29sb3JtYXAodm9pZCk7Ci1leHRlcm4gdm9pZCBzZXRfaGkyNDBfY29sb3JtYXAodm9pZCk7Ci1leHRlcm4gdm9pZCB1bnNldF9jb2xvcm1hcCh2b2lkKTsKLWV4dGVybiB2b2lkIHNldF9jb2xvcm1hcChpbnQgcmVzZXQpOwotZXh0ZXJuIHZvaWQgc2V0X25vZmJfcGFyYW1zKGludCByZXN0b3JlKTsKLWV4dGVybiB2b2lkIHNldF9yYXdfZmJfcGFyYW1zKGludCByZXN0b3JlKTsKLWV4dGVybiB2b2lkIGRvX25ld19mYihpbnQgcmVzZXRfbWVtKTsKLWV4dGVybiB2b2lkIGZyZWVfb2xkX2ZiKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfcGFkZGVkX2ZiKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5zdGFsbF9wYWRkZWRfZmIoY2hhciAqZ2VvbSk7Ci1leHRlcm4gWEltYWdlICppbml0aWFsaXplX3hkaXNwbGF5X2ZiKHZvaWQpOwotZXh0ZXJuIFhJbWFnZSAqaW5pdGlhbGl6ZV9yYXdfZmIoaW50KTsKLWV4dGVybiB2b2lkIHBhcnNlX3NjYWxlX3N0cmluZyhjaGFyICpzdHIsIGRvdWJsZSAqZmFjdG9yX3gsIGRvdWJsZSAqZmFjdG9yX3ksIGludCAqc2NhbGluZywgaW50ICpibGVuZCwKLSAgICBpbnQgKm5vbXVsdDQsIGludCAqcGFkLCBpbnQgKmludGVycG9sYXRlLCBpbnQgKm51bWVyLCBpbnQgKmRlbm9tLCBpbnQgd19pbiwgaW50IGhfaW4pOwotZXh0ZXJuIGludCBwYXJzZV9yb3RhdGVfc3RyaW5nKGNoYXIgKnN0ciwgaW50ICptb2RlKTsKLWV4dGVybiBpbnQgc2NhbGVfcm91bmQoaW50IGxlbiwgZG91YmxlIGZhYyk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3NjcmVlbihpbnQgKmFyZ2MsIGNoYXIgKiphcmd2LCBYSW1hZ2UgKmZiKTsKLWV4dGVybiB2b2lkIHNldF92bmNfZGVza3RvcF9uYW1lKHZvaWQpOwotZXh0ZXJuIHZvaWQgYW5ub3VuY2UoaW50IGxwb3J0LCBpbnQgc3NsLCBjaGFyICppZmFjZSk7Ci0KLWV4dGVybiBjaGFyICp2bmNfcmVmbGVjdF9ndWVzcyhjaGFyICpzdHIsIGNoYXIgKipyYXdfZmJfYWRkcik7Ci1leHRlcm4gdm9pZCB2bmNfcmVmbGVjdF9wcm9jZXNzX2NsaWVudCh2b2lkKTsKLWV4dGVybiByZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfcG9pbnRlcihpbnQgeCwgaW50IHksIGludCBtYXNrKTsKLWV4dGVybiByZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfa2V5KHVpbnQzMl90IGtleSwgcmZiQm9vbCBkb3duKTsKLWV4dGVybiByZmJCb29sIHZuY19yZWZsZWN0X3NlbmRfY3V0dGV4dChjaGFyICpzdHIsIGludCBsZW4pOwotCi1leHRlcm4gaW50IHJhd2ZiX3Jlc2V0OwotZXh0ZXJuIGludCByYXdmYl9kZXZfdmlkZW87Ci1leHRlcm4gaW50IHJhd2ZiX3ZuY19yZWZsZWN0OwotCi0jZW5kaWYgLyogX1gxMVZOQ19TQ1JFRU5fSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3Njcm9sbGV2ZW50X3QuaCBiL3gxMXZuYy9zY3JvbGxldmVudF90LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWE5NTEuLjAwMDAwMDAKLS0tIGEveDExdm5jL3Njcm9sbGV2ZW50X3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1NDUk9MTEVWRU5UX1RfSAotI2RlZmluZSBfWDExVk5DX1NDUk9MTEVWRU5UX1RfSAotCi0vKiAtLSBzY3JvbGxldmVudF90LmggLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2Nyb2xsX2V2ZW50IHsKLQlXaW5kb3cgd2luLCBmcmFtZTsKLQlpbnQgZHgsIGR5OwotCWludCB4LCB5LCB3LCBoOwotCWRvdWJsZSB0OwotCWludCB3aW5feCwgd2luX3ksIHdpbl93LCB3aW5faDsJCi0JaW50IG5ld194LCBuZXdfeSwgbmV3X3csIG5ld19oOwkKLX0gc2Nyb2xsX2V2ZW50X3Q7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX1NDUk9MTEVWRU5UX1RfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3NlbGVjdGlvbi5jIGIveDExdm5jL3NlbGVjdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM0NTg2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zZWxlY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHNlbGVjdGlvbi5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJ1bml4cHcuaCIKLSNpbmNsdWRlICJ3aW5fdXRpbHMuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLQotLyoKLSAqIFNlbGVjdGlvbi9DdXRidWZmZXIvQ2xpcGJvYXJkIGhhbmRsZXJzLgotICovCi0KLWludCBvd25fcHJpbWFyeSA9IDA7CS8qIHdoZXRoZXIgd2UgY3VycmVudGx5IG93biBQUklNQVJZIG9yIG5vdCAqLwotaW50IHNldF9wcmltYXJ5ID0gMTsKLWludCBvd25fY2xpcGJvYXJkID0gMDsJLyogd2hldGhlciB3ZSBjdXJyZW50bHkgb3duIENMSVBCT0FSRCBvciBub3QgKi8KLWludCBzZXRfY2xpcGJvYXJkID0gMTsKLWludCBzZXRfY3V0YnVmZmVyID0gMDsJLyogdG8gYXZvaWQgYm91bmNpbmcgdGhlIEN1dFRleHQgcmlnaHQgYmFjayAqLwotaW50IHNlbF93YWl0dGltZSA9IDE1OwkvKiBzb21lIHNlY29uZHMgdG8gc2tpcCBiZWZvcmUgZmlyc3Qgc2VuZCAqLwotV2luZG93IHNlbHdpbiA9IE5vbmU7CS8qIHNwZWNpYWwgd2luZG93IGZvciBvdXIgc2VsZWN0aW9uICovCi1BdG9tIGNsaXBib2FyZF9hdG9tID0gTm9uZTsKLQotLyoKLSAqIFRoaXMgaXMgd2hlcmUgd2Uga2VlcCBvdXIgc2VsZWN0aW9uOiB0aGUgc3RyaW5nIHNlbnQgVE8gdXMgZnJvbSBWTkMKLSAqIGNsaWVudHMsIGFuZCB0aGUgc3RyaW5nIHNlbnQgQlkgdXMgdG8gcmVxdWVzdGluZyBYMTEgY2xpZW50cy4KLSAqLwotY2hhciAqeGN1dF9zdHJfcHJpbWFyeSA9IE5VTEw7Ci1jaGFyICp4Y3V0X3N0cl9jbGlwYm9hcmQgPSBOVUxMOwotCi0KLXZvaWQgc2VsZWN0aW9uX3JlcXVlc3QoWEV2ZW50ICpldiwgY2hhciAqdHlwZSk7Ci1pbnQgY2hlY2tfc2VsX2RpcmVjdGlvbihjaGFyICpkaXIsIGNoYXIgKmxhYmVsLCBjaGFyICpzZWwsIGludCBsZW4pOwotdm9pZCBjdXRidWZmZXJfc2VuZCh2b2lkKTsKLXZvaWQgc2VsZWN0aW9uX3NlbmQoWEV2ZW50ICpldik7Ci12b2lkIHJlc2VuZF9zZWxlY3Rpb24oY2hhciAqdHlwZSk7Ci0KLQotLyoKLSAqIE91ciBjYWxsYmFja3MgaW5zdHJ1Y3QgdXMgdG8gY2hlY2sgZm9yIGNoYW5nZXMgaW4gdGhlIGN1dGJ1ZmZlcgotICogYW5kIFBSSU1BUlkgYW5kIENMSVBCT0FSRCBzZWxlY3Rpb24gb24gdGhlIGxvY2FsIFgxMSBkaXNwbGF5LgotICoKLSAqIFRPRE86IGNoZWNrIGlmIG1hbGxvYyBkb2VzIG5vdCBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMgKGVzcC4gV1JUCi0gKiBTZWxlY3Rpb25Ob3RpZnkgaGFuZGxpbmcpLgotICovCi1zdGF0aWMgY2hhciBjdXRidWZmZXJfc3RyW1BST1BfTUFYKzFdOwotc3RhdGljIGNoYXIgcHJpbWFyeV9zdHJbUFJPUF9NQVgrMV07Ci1zdGF0aWMgY2hhciBjbGlwYm9hcmRfc3RyW1BST1BfTUFYKzFdOwotc3RhdGljIGludCBjdXRidWZmZXJfbGVuID0gMDsKLXN0YXRpYyBpbnQgcHJpbWFyeV9sZW4gICA9IDA7Ci1zdGF0aWMgaW50IGNsaXBib2FyZF9sZW4gPSAwOwotCi0vKgotICogQW4gWDExIChub3QgVk5DKSBjbGllbnQgb24gdGhlIGxvY2FsIGRpc3BsYXkgaGFzIHJlcXVlc3RlZCB0aGUgc2VsZWN0aW9uCi0gKiBmcm9tIHVzIChiZWNhdXNlIHdlIGFyZSB0aGUgY3VycmVudCBvd25lcikuCi0gKgotICogbi5iLjogb3VyIGNhbGxlciBhbHJlYWR5IGhhcyB0aGUgWF9MT0NLLgotICovCi12b2lkIHNlbGVjdGlvbl9yZXF1ZXN0KFhFdmVudCAqZXYsIGNoYXIgKnR5cGUpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghZXYgfHwgIXR5cGUpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlYU2VsZWN0aW9uRXZlbnQgbm90aWZ5X2V2ZW50OwotCVhTZWxlY3Rpb25SZXF1ZXN0RXZlbnQgKnJlcV9ldmVudDsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCWNoYXIgKnN0cjsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0Jc3RhdGljIEF0b20geGFfdGFyZ2V0cyA9IE5vbmU7Ci0Jc3RhdGljIGludCBzeW5jX2l0ID0gLTE7Ci0jIGlmbmRlZiBYQV9MRU5HVEgKLQl1bnNpZ25lZCBsb25nIFhBX0xFTkdUSDsKLSMgZW5kaWYKLQlSQVdGQl9SRVRfVk9JRAotCi0jIGlmbmRlZiBYQV9MRU5HVEgKLQlYQV9MRU5HVEggPSBYSW50ZXJuQXRvbShkcHksICJMRU5HVEgiLCBUcnVlKTsKLSMgZW5kaWYKLQotCWlmIChzeW5jX2l0IDwgMCkgewotCQlpZiAoZ2V0ZW52KCJYMTFWTkNfU0VOREVWRU5UX1NZTkMiKSkgewotCQkJc3luY19pdCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzeW5jX2l0ID0gMDsKLQkJfQotCX0KLQotCXJlcV9ldmVudCA9ICYoZXYtPnhzZWxlY3Rpb25yZXF1ZXN0KTsKLQlub3RpZnlfZXZlbnQudHlwZSAJPSBTZWxlY3Rpb25Ob3RpZnk7Ci0Jbm90aWZ5X2V2ZW50LmRpc3BsYXkJPSByZXFfZXZlbnQtPmRpc3BsYXk7Ci0Jbm90aWZ5X2V2ZW50LnJlcXVlc3Rvcgk9IHJlcV9ldmVudC0+cmVxdWVzdG9yOwotCW5vdGlmeV9ldmVudC5zZWxlY3Rpb24JPSByZXFfZXZlbnQtPnNlbGVjdGlvbjsKLQlub3RpZnlfZXZlbnQudGFyZ2V0CT0gcmVxX2V2ZW50LT50YXJnZXQ7Ci0Jbm90aWZ5X2V2ZW50LnRpbWUJPSByZXFfZXZlbnQtPnRpbWU7Ci0KLQlpZiAocmVxX2V2ZW50LT5wcm9wZXJ0eSA9PSBOb25lKSB7Ci0JCW5vdGlmeV9ldmVudC5wcm9wZXJ0eSA9IHJlcV9ldmVudC0+dGFyZ2V0OwotCX0gZWxzZSB7Ci0JCW5vdGlmeV9ldmVudC5wcm9wZXJ0eSA9IHJlcV9ldmVudC0+cHJvcGVydHk7Ci0JfQotCi0JaWYgKCFzdHJjbXAodHlwZSwgIlBSSU1BUlkiKSkgewotCQlzdHIgPSB4Y3V0X3N0cl9wcmltYXJ5OwotCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiQ0xJUEJPQVJEIikpIHsKLQkJc3RyID0geGN1dF9zdHJfY2xpcGJvYXJkOwotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHN0cikgewotCQlsZW5ndGggPSBzdHJsZW4oc3RyKTsKLQl9IGVsc2UgewotCQlsZW5ndGggPSAwOwotCX0KLQlpZiAoZGVidWdfc2VsKSB7Ci0JCXJmYkxvZygiJXNcdHJlcXVlc3QgZXZlbnQ6ICAgb3duZXI9MHgleCByZXF1ZXN0b3I9MHgleCBzZWw9JTAzZCB0YXJnPSVkIHByb3A9JWRcbiIsCi0JCQl0eXBlLCByZXFfZXZlbnQtPm93bmVyLCByZXFfZXZlbnQtPnJlcXVlc3RvciwgcmVxX2V2ZW50LT5zZWxlY3Rpb24sCi0JCQlyZXFfZXZlbnQtPnRhcmdldCwgcmVxX2V2ZW50LT5wcm9wZXJ0eSk7Ci0JfQotCi0JaWYgKHhhX3RhcmdldHMgPT0gTm9uZSkgewotCQl4YV90YXJnZXRzID0gWEludGVybkF0b20oZHB5LCAiVEFSR0VUUyIsIEZhbHNlKTsKLQl9Ci0KLQkvKiB0aGUgd2luZG93IG1heSBoYXZlIGdvbmUgYXdheSwgc28gdHJhcCBlcnJvcnMgKi8KLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0Jb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQotCWlmIChldi0+eHNlbGVjdGlvbnJlcXVlc3QudGFyZ2V0ID09IFhBX0xFTkdUSCkgewotCQkvKiBsZW5ndGggcmVxdWVzdCAqLwotCQlpbnQgcmV0OwotCQlsb25nIGxsZW5ndGggPSAobG9uZykgbGVuZ3RoOwotCi0JCXJldCA9IFhDaGFuZ2VQcm9wZXJ0eShldi0+eHNlbGVjdGlvbnJlcXVlc3QuZGlzcGxheSwKLQkJICAgIGV2LT54c2VsZWN0aW9ucmVxdWVzdC5yZXF1ZXN0b3IsCi0JCSAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QucHJvcGVydHksCi0JCSAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QudGFyZ2V0LCAzMiwgUHJvcE1vZGVSZXBsYWNlLAotCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmxsZW5ndGgsIDEpOwkvKiBoYWQgc2l6ZW9mKHVuc2lnbmVkIGludCkgPSA0IGJlZm9yZS4uLiAqLwotCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQlyZmJMb2coIkxFTkdUSDogWENoYW5nZVByb3BlcnR5KCkgLT4gJWRcbiIsIHJldCk7Ci0JCX0KLQotCX0gZWxzZSBpZiAoeGFfdGFyZ2V0cyAhPSBOb25lICYmIGV2LT54c2VsZWN0aW9ucmVxdWVzdC50YXJnZXQgPT0geGFfdGFyZ2V0cykgewotCQkvKiB0YXJnZXRzIHJlcXVlc3QgKi8KLQkJaW50IHJldDsKLQkJQXRvbSB0YXJnZXRzWzJdOwotCQl0YXJnZXRzWzBdID0gKEF0b20pIHhhX3RhcmdldHM7Ci0JCXRhcmdldHNbMV0gPSAoQXRvbSkgWEFfU1RSSU5HOwotCi0JCXJldCA9IFhDaGFuZ2VQcm9wZXJ0eShldi0+eHNlbGVjdGlvbnJlcXVlc3QuZGlzcGxheSwKLQkJICAgIGV2LT54c2VsZWN0aW9ucmVxdWVzdC5yZXF1ZXN0b3IsCi0JCSAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QucHJvcGVydHksCi0JCSAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QudGFyZ2V0LCAzMiwgUHJvcE1vZGVSZXBsYWNlLAotCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgdGFyZ2V0cywgMik7Ci0JCWlmIChkZWJ1Z19zZWwpIHsKLQkJCXJmYkxvZygiVEFSR0VUUzogWENoYW5nZVByb3BlcnR5KCkgLT4gJWQgLS0gc3oxOiAlZCAgc3oyOiAlZFxuIiwKLQkJCSAgICByZXQsIHNpemVvZih0YXJnZXRzWzBdKSwgc2l6ZW9mKHRhcmdldHMpL3NpemVvZih0YXJnZXRzWzBdKSk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCS8qIGRhdGEgcmVxdWVzdCAqLwotCQlpbnQgcmV0OwotCi0JCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKXN0cjsKLQotCQlyZXQgPSBYQ2hhbmdlUHJvcGVydHkoZXYtPnhzZWxlY3Rpb25yZXF1ZXN0LmRpc3BsYXksCi0JCSAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QucmVxdWVzdG9yLAotCQkgICAgZXYtPnhzZWxlY3Rpb25yZXF1ZXN0LnByb3BlcnR5LAotCQkgICAgZXYtPnhzZWxlY3Rpb25yZXF1ZXN0LnRhcmdldCwgOCwgUHJvcE1vZGVSZXBsYWNlLAotCQkgICAgZGF0YSwgbGVuZ3RoKTsKLQkJaWYgKGRlYnVnX3NlbCkgewotCQkJcmZiTG9nKCJEQVRBOiBYQ2hhbmdlUHJvcGVydHkoKSAtPiAlZFxuIiwgcmV0KTsKLQkJfQotCX0KLQotCWlmICghIHRyYXBwZWRfeGVycm9yKSB7Ci0JCWludCByZXQgPSAtMiwgc2tpcF9pdCA9IDAsIG1zID0gMDsKLQkJZG91YmxlIG5vdyA9IGRub3coKTsKLQkJc3RhdGljIGRvdWJsZSBsYXN0X2NoZWNrID0gMC4wOwotCi0JCWlmIChub3cgPiBsYXN0X2NoZWNrICsgMC4yKSB7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCWlmICghdmFsaWRfd2luZG93KHJlcV9ldmVudC0+cmVxdWVzdG9yICwgTlVMTCwgMSkpIHsKLQkJCQlzeW5jX2l0ID0gMTsKLQkJCQlza2lwX2l0ID0gMTsKLQkJCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQkJCXJmYkxvZygic2VsZWN0aW9uX3JlcXVlc3Q6IG5vdCBhIHZhbGlkIHdpbmRvdzogMHgleFxuIiwKLQkJCQkJICAgIHJlcV9ldmVudC0+cmVxdWVzdG9yKTsKLQkJCQl9Ci0JCQkJbXMgPSAxMDsKLQkJCX0KLQkJCWlmICh0cmFwcGVkX3hlcnJvcikgewotCQkJCXN5bmNfaXQgPSAxOwotCQkJCXNraXBfaXQgPSAxOwotCQkJfQotCQkJbGFzdF9jaGVjayA9IGRub3coKTsKLQkJfQotCi0JCWlmICghc2tpcF9pdCkgewotCQkJcmV0ID0gWFNlbmRFdmVudChyZXFfZXZlbnQtPmRpc3BsYXksIHJlcV9ldmVudC0+cmVxdWVzdG9yLCBGYWxzZSwgMCwKLQkJCSAgICAoWEV2ZW50ICopJm5vdGlmeV9ldmVudCk7Ci0JCX0KLQkJaWYgKGRlYnVnX3NlbCkgewotCQkJcmZiTG9nKCJYU2VuZEV2ZW50KCkgLT4gJWRcbiIsIHJldCk7Ci0JCX0KLQkJaWYgKG1zID4gMCkgewotCQkJdXNsZWVwKG1zICogMTAwMCk7Ci0JCX0KLQl9Ci0JaWYgKHRyYXBwZWRfeGVycm9yKSB7Ci0JCXJmYkxvZygic2VsZWN0aW9uX3JlcXVlc3Q6IGlnbm9yZWQgWEVycm9yIHdoaWxlIHNlbmRpbmcgIgotCQkgICAgIiVzIHNlbGVjdGlvbiB0byAweCV4LlxuIiwgdHlwZSwgcmVxX2V2ZW50LT5yZXF1ZXN0b3IpOwotCX0KLQotCVhGbHVzaF93cihkcHkpOwotCWlmIChzeW5jX2l0KSB7Ci0JCXVzbGVlcCgxMCAqIDEwMDApOwotCQlYU3luYyhkcHksIEZhbHNlKTsKLQl9Ci0KLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotaW50IGNoZWNrX3NlbF9kaXJlY3Rpb24oY2hhciAqZGlyLCBjaGFyICpsYWJlbCwgY2hhciAqc2VsLCBpbnQgbGVuKSB7Ci0JaW50IGRiID0gMCwgb2sgPSAxOwotCWlmIChkZWJ1Z19zZWwpIHsKLQkJZGIgPSAxOwotCX0KLQlpZiAoc2VsX2RpcmVjdGlvbikgewotCQlpZiAoc3Ryc3RyKHNlbF9kaXJlY3Rpb24sICJkZWJ1ZyIpKSB7Ci0JCQlkYiA9IDE7Ci0JCX0KLQkJaWYgKHN0cmNtcChzZWxfZGlyZWN0aW9uLCAiZGVidWciKSkgewotCQkJaWYgKHN0cnN0cihzZWxfZGlyZWN0aW9uLCBkaXIpID09IE5VTEwpIHsKLQkJCQlvayA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGRiKSB7Ci0JCWNoYXIgc3RyWzQwXTsKLQkJaW50IG4gPSA0MDsKLQkJc3RybmNweShzdHIsIHNlbCwgbik7Ci0JCXN0cltuLTFdID0gJ1wwJzsKLQkJaWYgKGxlbiA8IG4pIHsKLQkJCXN0cltsZW5dID0gJ1wwJzsKLQkJfQotCQlyZmJMb2coIiVzOiAnJXMnXG4iLCBsYWJlbCwgc3RyKTsKLQkJaWYgKG9rKSB7Ci0JCQlyZmJMb2coIiVzOiAlcy1pbmcgaXQuXG4iLCBsYWJlbCwgZGlyKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiJXM6IE5PVCAlcy1pbmcgaXQuXG4iLCBsYWJlbCwgZGlyKTsKLQkJfQotCX0KLQlyZXR1cm4gb2s7Ci19Ci0KLS8qCi0gKiBDVVRfQlVGRkVSMCBwcm9wZXJ0eSBvbiB0aGUgbG9jYWwgZGlzcGxheSBoYXMgY2hhbmdlZCwgd2UgcmVhZCBhbmQKLSAqIHN0b3JlIGl0IGFuZCBzZW5kIGl0IG91dCB0byBhbnkgY29ubmVjdGVkIFZOQyBjbGllbnRzLgotICoKLSAqIG4uYi46IG91ciBjYWxsZXIgYWxyZWFkeSBoYXMgdGhlIFhfTE9DSy4KLSAqLwotdm9pZCBjdXRidWZmZXJfc2VuZCh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlyZXR1cm47Ci0jZWxzZQotCUF0b20gdHlwZTsKLQlpbnQgZm9ybWF0LCBzbGVuLCBkbGVuLCBsZW47Ci0JdW5zaWduZWQgbG9uZyBuaXRlbXMgPSAwLCBieXRlc19hZnRlciA9IDA7Ci0JdW5zaWduZWQgY2hhciogZGF0YSA9IE5VTEw7Ci0KLQljdXRidWZmZXJfc3RyWzBdID0gJ1wwJzsKLQlzbGVuID0gMDsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQkvKiByZWFkIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpbnRvIGN1dGJ1ZmZlcl9zdHI6ICovCi0JZG8gewotCQlpZiAoWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwKLQkJICAgIFhBX0NVVF9CVUZGRVIwLCBuaXRlbXMvNCwgUFJPUF9NQVgvMTYsIEZhbHNlLAotCQkgICAgQW55UHJvcGVydHlUeXBlLCAmdHlwZSwgJmZvcm1hdCwgJm5pdGVtcywgJmJ5dGVzX2FmdGVyLAotCQkgICAgJmRhdGEpID09IFN1Y2Nlc3MpIHsKLQotCQkJZGxlbiA9IG5pdGVtcyAqIChmb3JtYXQvOCk7Ci0JCQlpZiAoc2xlbiArIGRsZW4gPiBQUk9QX01BWCkgewotCQkJCS8qIHRvbyBiaWcgKi8KLQkJCQlyZmJMb2coIndhcm5pbmc6IHRydW5jYXRpbmcgbGFyZ2UgQ1VUX0JVRkZFUjAiCi0JCQkJICAgIiBzZWxlY3Rpb24gPiAlZCBieXRlcy5cbiIsIFBST1BfTUFYKTsKLQkJCQlYRnJlZV93cihkYXRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1lbWNweShjdXRidWZmZXJfc3RyK3NsZW4sIGRhdGEsIGRsZW4pOwotCQkJc2xlbiArPSBkbGVuOwotCQkJY3V0YnVmZmVyX3N0cltzbGVuXSA9ICdcMCc7Ci0JCQlYRnJlZV93cihkYXRhKTsKLQkJfQotCX0gd2hpbGUgKGJ5dGVzX2FmdGVyID4gMCk7Ci0KLQljdXRidWZmZXJfc3RyW1BST1BfTUFYXSA9ICdcMCc7Ci0KLQlpZiAoZGVidWdfc2VsKSB7Ci0JCXJmYkxvZygiY3V0YnVmZmVyX3NlbmQ6ICclcydcbiIsIGN1dGJ1ZmZlcl9zdHIpOwotCX0KLQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJcmZiTG9nKCJjdXRidWZmZXJfc2VuZDogbm8gc2VuZDogdW5pbml0aWFsaXplZCBjbGllbnRzXG4iKTsKLQkJcmV0dXJuOyAvKiBzb21lIGNsaWVudHMgaW5pdGlhbGl6aW5nLCBjYW5ub3Qgc2VuZCAqLyAKLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZXR1cm47Ci0JfQotCi0JLyogbm93IHNlbmQgaXQgdG8gYW55IGNvbm5lY3RlZCBWTkMgY2xpZW50cyAocmZiU2VydmVyQ3V0VGV4dCkgKi8KLQlpZiAoIXNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCWN1dGJ1ZmZlcl9sZW4gPSBsZW4gPSBzdHJsZW4oY3V0YnVmZmVyX3N0cik7Ci0JaWYgKGNoZWNrX3NlbF9kaXJlY3Rpb24oInNlbmQiLCAiY3V0YnVmZmVyX3NlbmQiLCBjdXRidWZmZXJfc3RyLCBsZW4pKSB7Ci0JCXJmYlNlbmRTZXJ2ZXJDdXRUZXh0KHNjcmVlbiwgY3V0YnVmZmVyX3N0ciwgbGVuKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qIAotICogImNhbGxiYWNrIiBmb3Igb3VyIFNlbGVjdGlvbk5vdGlmeSBwb2xsaW5nLiAgV2UgdHJ5IHRvIGRldGVybWluZSBpZgotICogdGhlIFBSSU1BUlkgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIChjaGVja2luZyBsZW5ndGggYW5kIGZpcnN0IENIS1NaIGJ5dGVzKQotICogYW5kIGlmIGl0IGhhcyB3ZSBzdG9yZSBpdCBhbmQgc2VuZCBpdCBvZmYgdG8gYW55IGNvbm5lY3RlZCBWTkMgY2xpZW50cy4KLSAqCi0gKiBuLmIuOiBvdXIgY2FsbGVyIGFscmVhZHkgaGFzIHRoZSBYX0xPQ0suCi0gKgotICogVE9ETzogaWYgd2Ugd2VyZSB3aWxsaW5nIHRvIHVzZSBsaWJYdCwgd2UgY291bGQgcGVyaGFwcyBnZXQgc2VsZWN0aW9uCi0gKiB0aW1lc3RhbXBzIHRvIHNwZWVkIHVwIHRoZSBjaGVja2luZy4uLiBYdEdldFNlbGVjdGlvblZhbHVlKCkuCi0gKgotICogQWxzbzogWEZJWEVTIGhhcyBYRml4ZXNTZWxlY3RTZWxlY3Rpb25JbnB1dCgpLgotICovCi0jZGVmaW5lIENIS1NaIDMyCi0KLXZvaWQgc2VsZWN0aW9uX3NlbmQoWEV2ZW50ICpldikgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFldikge30KLQlyZXR1cm47Ci0jZWxzZQotCUF0b20gdHlwZTsKLQlpbnQgZm9ybWF0LCBzbGVuLCBkbGVuLCBvbGRsZW4sIG5ld2xlbiwgdG9vYmlnID0gMCwgbGVuOwotCXN0YXRpYyBpbnQgZXJyID0gMCwgc2VudF9vbmUgPSAwOwotCWNoYXIgYmVmb3JlW0NIS1NaXSwgYWZ0ZXJbQ0hLU1pdOwotCXVuc2lnbmVkIGxvbmcgbml0ZW1zID0gMCwgYnl0ZXNfYWZ0ZXIgPSAwOwotCXVuc2lnbmVkIGNoYXIqIGRhdGEgPSBOVUxMOwotCWNoYXIgKnNlbGVjdGlvbl9zdHI7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCS8qCi0JICogcmVtZW1iZXIgaW5mbyBhYm91dCBvdXIgbGFzdCB2YWx1ZSBvZiBQUklNQVJZIChvciBDVVRfQlVGRkVSMCkKLQkgKiBzbyB3ZSBjYW4gY2hlY2sgZm9yIGFueSBjaGFuZ2VzIGJlbG93LgotCSAqLwotCWlmIChldi0+eHNlbGVjdGlvbi5zZWxlY3Rpb24gPT0gWEFfUFJJTUFSWSkgewotCQlpZiAoISB3YXRjaF9wcmltYXJ5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2VsZWN0aW9uX3N0ciA9IHByaW1hcnlfc3RyOwotCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQlyZmJMb2coInNlbGVjdGlvbl9zZW5kOiBldmVudCBQUklNQVJZICAgcHJvcDogJWQgIHJlcXVlc3RvcjogMHgleCAgYXRvbTogJWRcbiIsCi0JCQkgICAgZXYtPnhzZWxlY3Rpb24ucHJvcGVydHksIGV2LT54c2VsZWN0aW9uLnJlcXVlc3RvciwgZXYtPnhzZWxlY3Rpb24uc2VsZWN0aW9uKTsKLQkJfQotCX0gZWxzZSBpZiAoY2xpcGJvYXJkX2F0b20gJiYgZXYtPnhzZWxlY3Rpb24uc2VsZWN0aW9uID09IGNsaXBib2FyZF9hdG9tKSAgewotCQlpZiAoISB3YXRjaF9jbGlwYm9hcmQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZWxlY3Rpb25fc3RyID0gY2xpcGJvYXJkX3N0cjsKLQkJaWYgKGRlYnVnX3NlbCkgewotCQkJcmZiTG9nKCJzZWxlY3Rpb25fc2VuZDogZXZlbnQgQ0xJUEJPQVJEIHByb3A6ICVkICByZXF1ZXN0b3I6IDB4JXggYXRvbTogJWRcbiIsCi0JCQkgICAgZXYtPnhzZWxlY3Rpb24ucHJvcGVydHksIGV2LT54c2VsZWN0aW9uLnJlcXVlc3RvciwgZXYtPnhzZWxlY3Rpb24uc2VsZWN0aW9uKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0Jb2xkbGVuID0gc3RybGVuKHNlbGVjdGlvbl9zdHIpOwotCXN0cm5jcHkoYmVmb3JlLCBzZWxlY3Rpb25fc3RyLCBDSEtTWik7Ci0KLQlzZWxlY3Rpb25fc3RyWzBdID0gJ1wwJzsKLQlzbGVuID0gMDsKLQotCS8qIHJlYWQgaW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgUFJJTUFSWSBvciBDTElQQk9BUkQ6ICovCi0JZG8gewotCQlpZiAoWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgZXYtPnhzZWxlY3Rpb24ucmVxdWVzdG9yLAotCQkgICAgZXYtPnhzZWxlY3Rpb24ucHJvcGVydHksIG5pdGVtcy80LCBQUk9QX01BWC8xNiwgVHJ1ZSwKLQkJICAgIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsICZmb3JtYXQsICZuaXRlbXMsICZieXRlc19hZnRlciwKLQkJICAgICZkYXRhKSA9PSBTdWNjZXNzKSB7Ci0KLQkJCWRsZW4gPSBuaXRlbXMgKiAoZm9ybWF0LzgpOwotCQkJaWYgKHNsZW4gKyBkbGVuID4gUFJPUF9NQVgpIHsKLQkJCQkvKiB0b28gYmlnICovCi0JCQkJdG9vYmlnID0gMTsKLQkJCQlYRnJlZV93cihkYXRhKTsKLQkJCQlpZiAoZXJyKSB7CS8qIGN1dCBkb3duIG9uIG1lc3NhZ2VzICovCi0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVyciA9IDU7Ci0JCQkJfQotCQkJCXJmYkxvZygid2FybmluZzogdHJ1bmNhdGluZyBsYXJnZSBQUklNQVJZIgotCQkJCSAgICAiL0NMSVBCT0FSRCBzZWxlY3Rpb24gPiAlZCBieXRlcy5cbiIsCi0JCQkJICAgIFBST1BfTUFYKTsKLQkJCQlicmVhazsKLQkJCX0KLWlmIChkZWJ1Z19zZWwpIGZwcmludGYoc3RkZXJyLCAic2VsZWN0aW9uX3NlbmQ6IGRhdGE6ICclcycgZGxlbjogJWQgbml0ZW1zOiAlbHUgYmE6ICVsdVxuIiwgZGF0YSwgZGxlbiwgbml0ZW1zLCBieXRlc19hZnRlcik7Ci0JCQltZW1jcHkoc2VsZWN0aW9uX3N0citzbGVuLCBkYXRhLCBkbGVuKTsKLQkJCXNsZW4gKz0gZGxlbjsKLQkJCXNlbGVjdGlvbl9zdHJbc2xlbl0gPSAnXDAnOwotCQkJWEZyZWVfd3IoZGF0YSk7Ci0JCX0KLQl9IHdoaWxlIChieXRlc19hZnRlciA+IDApOwotCi0JaWYgKCEgdG9vYmlnKSB7Ci0JCWVyciA9IDA7Ci0JfSBlbHNlIGlmIChlcnIpIHsKLQkJZXJyLS07Ci0JfQotCi0JaWYgKCEgc2VudF9vbmUpIHsKLQkJLyogdHJ5IHRvIGZvcmNlIGEgc2VuZCBmaXJzdCB0aW1lIGluICovCi0JCW9sZGxlbiA9IC0xOwotCQlzZW50X29uZSA9IDE7Ci0JfQotCWlmIChkZWJ1Z19zZWwpIHsKLQkJcmZiTG9nKCJzZWxlY3Rpb25fc2VuZDogICVzICclcydcbiIsCi0JCSAgICBldi0+eHNlbGVjdGlvbi5zZWxlY3Rpb24gPT0gWEFfUFJJTUFSWSA/ICJQUklNQVJZICAiIDogIkNMSVBCT0FSRCIsCi0JCSAgICBzZWxlY3Rpb25fc3RyKTsKLQl9Ci0KLQkvKiBsb29rIGZvciBjaGFuZ2VzIGluIHRoZSBuZXcgdmFsdWUgKi8KLQluZXdsZW4gPSBzdHJsZW4oc2VsZWN0aW9uX3N0cik7Ci0Jc3RybmNweShhZnRlciwgc2VsZWN0aW9uX3N0ciwgQ0hLU1opOwotCi0JaWYgKG9sZGxlbiA9PSBuZXdsZW4gJiYgc3RybmNtcChiZWZvcmUsIGFmdGVyLCBDSEtTWikgPT0gMCkgewotCQkvKiBldmlkZW50bHkgbm8gY2hhbmdlICovCi0JCWlmIChkZWJ1Z19zZWwpIHsKLQkJCXJmYkxvZygic2VsZWN0aW9uX3NlbmQ6ICBubyBjaGFuZ2UuXG4iKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChuZXdsZW4gPT0gMCkgewotCQkvKiBkbyBub3QgYm90aGVyIHNlbmRpbmcgYSBudWxsIHN0cmluZyBvdXQgKi8KLQkJcmV0dXJuOwotCX0KLQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJcmZiTG9nKCJzZWxlY3Rpb25fc2VuZDogbm8gc2VuZDogdW5pbml0aWFsaXplZCBjbGllbnRzXG4iKTsKLQkJcmV0dXJuOyAvKiBzb21lIGNsaWVudHMgaW5pdGlhbGl6aW5nLCBjYW5ub3Qgc2VuZCAqLyAKLQl9Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBub3cgc2VuZCBpdCB0byBhbnkgY29ubmVjdGVkIFZOQyBjbGllbnRzIChyZmJTZXJ2ZXJDdXRUZXh0KSAqLwotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlsZW4gPSBuZXdsZW47Ci0JaWYgKGV2LT54c2VsZWN0aW9uLnNlbGVjdGlvbiA9PSBYQV9QUklNQVJZKSB7Ci0JCXByaW1hcnlfbGVuID0gbGVuOwotCX0gZWxzZSBpZiAoY2xpcGJvYXJkX2F0b20gJiYgZXYtPnhzZWxlY3Rpb24uc2VsZWN0aW9uID09IGNsaXBib2FyZF9hdG9tKSAgewotCQljbGlwYm9hcmRfbGVuID0gbGVuOwotCX0KLQlpZiAoY2hlY2tfc2VsX2RpcmVjdGlvbigic2VuZCIsICJzZWxlY3Rpb25fc2VuZCIsIHNlbGVjdGlvbl9zdHIsIGxlbikpIHsKLQkJcmZiU2VuZFNlcnZlckN1dFRleHQoc2NyZWVuLCBzZWxlY3Rpb25fc3RyLCBsZW4pOwotCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCByZXNlbmRfc2VsZWN0aW9uKGNoYXIgKnR5cGUpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghdHlwZSkge30KLQlyZXR1cm47Ci0jZWxzZQotCWNoYXIgKnNlbGVjdGlvbl9zdHIgPSAiIjsKLQlpbnQgbGVuID0gMDsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAoISBhbGxfY2xpZW50c19pbml0aWFsaXplZCgpKSB7Ci0JCXJmYkxvZygic2VsZWN0aW9uX3NlbmQ6IG5vIHNlbmQ6IHVuaW5pdGlhbGl6ZWQgY2xpZW50c1xuIik7Ci0JCXJldHVybjsgLyogc29tZSBjbGllbnRzIGluaXRpYWxpemluZywgY2Fubm90IHNlbmQgKi8gCi0JfQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIXNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFzdHJjbXAodHlwZSwgImN1dGJ1ZmZlciIpKSB7Ci0JCXNlbGVjdGlvbl9zdHIgPSBjdXRidWZmZXJfc3RyOwotCQlsZW4gPSBjdXRidWZmZXJfbGVuOwotCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiY2xpcGJvYXJkIikpIHsKLQkJc2VsZWN0aW9uX3N0ciA9IGNsaXBib2FyZF9zdHI7Ci0JCWxlbiA9IGNsaXBib2FyZF9sZW47Ci0JfSBlbHNlIGlmICghc3RyY21wKHR5cGUsICJwcmltYXJ5IikpIHsKLQkJc2VsZWN0aW9uX3N0ciA9IHByaW1hcnlfc3RyOwotCQlsZW4gPSBwcmltYXJ5X2xlbjsKLQl9Ci0JaWYgKGNoZWNrX3NlbF9kaXJlY3Rpb24oInNlbmQiLCAic2VsZWN0aW9uX3NlbmQiLCBzZWxlY3Rpb25fc3RyLCBsZW4pKSB7Ci0JCXJmYlNlbmRTZXJ2ZXJDdXRUZXh0KHNjcmVlbiwgc2VsZWN0aW9uX3N0ciwgbGVuKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3NlbGVjdGlvbi5oIGIveDExdm5jL3NlbGVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTI4NTQwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zZWxlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1NFTEVDVElPTl9ICi0jZGVmaW5lIF9YMTFWTkNfU0VMRUNUSU9OX0gKLQotLyogLS0gc2VsZWN0aW9uLmggLS0gKi8KLQotZXh0ZXJuIGNoYXIgKnhjdXRfc3RyX3ByaW1hcnk7Ci1leHRlcm4gY2hhciAqeGN1dF9zdHJfY2xpcGJvYXJkOwotZXh0ZXJuIGludCBvd25fcHJpbWFyeTsKLWV4dGVybiBpbnQgc2V0X3ByaW1hcnk7Ci1leHRlcm4gaW50IG93bl9jbGlwYm9hcmQ7Ci1leHRlcm4gaW50IHNldF9jbGlwYm9hcmQ7Ci1leHRlcm4gaW50IHNldF9jdXRidWZmZXI7Ci1leHRlcm4gaW50IHNlbF93YWl0dGltZTsKLWV4dGVybiBXaW5kb3cgc2Vsd2luOwotZXh0ZXJuIEF0b20gY2xpcGJvYXJkX2F0b207Ci0KLWV4dGVybiB2b2lkIHNlbGVjdGlvbl9yZXF1ZXN0KFhFdmVudCAqZXYsIGNoYXIgKnR5cGUpOwotZXh0ZXJuIGludCBjaGVja19zZWxfZGlyZWN0aW9uKGNoYXIgKmRpciwgY2hhciAqbGFiZWwsIGNoYXIgKnNlbCwgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBjdXRidWZmZXJfc2VuZCh2b2lkKTsKLWV4dGVybiB2b2lkIHNlbGVjdGlvbl9zZW5kKFhFdmVudCAqZXYpOwotZXh0ZXJuIHZvaWQgcmVzZW5kX3NlbGVjdGlvbihjaGFyICp0eXBlKTsKLQotI2VuZGlmIC8qIF9YMTFWTkNfU0VMRUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy9zb2xpZC5jIGIveDExdm5jL3NvbGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OGZiMWYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3NvbGlkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gc29saWQuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAieGV2ZW50cy5oIgotCi1jaGFyICpndWVzc19kZXNrdG9wKHZvaWQpOwotdm9pZCBzb2xpZF9iZyhpbnQgcmVzdG9yZSk7Ci1jaGFyICpkYnVzX3Nlc3Npb24odm9pZCk7Ci0KLQotc3RhdGljIHZvaWQgdXNyX2Jpbl9wYXRoKGludCByZXN0b3JlKTsKLXN0YXRpYyBpbnQgZHRfY21kKGNoYXIgKmNtZCk7Ci1zdGF0aWMgY2hhciAqY21kX291dHB1dChjaGFyICpjbWQpOwotWEltYWdlICpzb2xpZF9yb290KGNoYXIgKmNvbG9yKTsKLXN0YXRpYyB2b2lkIHNvbGlkX2NkZShjaGFyICpjb2xvcik7Ci1zdGF0aWMgdm9pZCBzb2xpZF9nbm9tZShjaGFyICpjb2xvcik7Ci1zdGF0aWMgdm9pZCBzb2xpZF9rZGUoY2hhciAqY29sb3IpOwotc3RhdGljIHZvaWQgc29saWRfbWFjb3N4KGludCByZXN0b3JlKTsKLQotc3RhdGljIHZvaWQgdXNyX2Jpbl9wYXRoKGludCByZXN0b3JlKSB7Ci0Jc3RhdGljIGNoYXIgKm9sZHBhdGggPSBOVUxMOwotCWNoYXIgKm5ld3BhdGg7Ci0JY2hhciBhZGRwYXRoW10gPSAiL3Vzci9iaW46L2JpbjoiOwotCi0JaWYgKHJlc3RvcmUpIHsKLQkJaWYgKG9sZHBhdGgpIHsKLQkJCXNldF9lbnYoIlBBVEgiLCBvbGRwYXRoKTsKLQkJCWZyZWUob2xkcGF0aCk7Ci0JCQlvbGRwYXRoID0gTlVMTDsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGdldGVudigiUEFUSCIpKSB7Ci0JCW9sZHBhdGggPSBzdHJkdXAoZ2V0ZW52KCJQQVRIIikpOwotCX0gZWxzZSB7Ci0JCW9sZHBhdGggPSBzdHJkdXAoIi91c3IvYmluIik7Ci0JfQotCW5ld3BhdGggPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKG9sZHBhdGgpICsgc3RybGVuKGFkZHBhdGgpICsgMSk7Ci0JbmV3cGF0aFswXSA9ICdcMCc7Ci0Jc3RyY2F0KG5ld3BhdGgsIGFkZHBhdGgpOwotCXN0cmNhdChuZXdwYXRoLCBvbGRwYXRoKTsKLQlzZXRfZW52KCJQQVRIIiwgbmV3cGF0aCk7Ci0JZnJlZShuZXdwYXRoKTsKLX0KLQotc3RhdGljIGludCBkdF9jbWQoY2hhciAqY21kKSB7Ci0JaW50IHJjOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAoIWNtZCB8fCAqY21kID09ICdcMCcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZHQgKi8KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJkdCIpKSB7Ci0JCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIGNtZCk7Ci0JCXJmYkxvZygiICAgZHRfY21kOiByZXR1cm5pbmcgMVxuIik7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChnZXRlbnYoIkRJU1BMQVkiKSA9PSBOVUxMKSB7Ci0JCXNldF9lbnYoIkRJU1BMQVkiLCBEaXNwbGF5U3RyaW5nKGRweSkpOwotCX0KLQotCXJmYkxvZygicnVubmluZyBjb21tYW5kOlxuIik7Ci0JaWYgKCFxdWlldCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuICAlc1xuXG4iLCBjbWQpOwotCX0KLQl1c3JfYmluX3BhdGgoMCk7Ci0JY2xvc2VfZXhlY19mZHMoKTsKLQlyYyA9IHN5c3RlbShjbWQpOwotCXVzcl9iaW5fcGF0aCgxKTsKLQotCWlmIChyYyA+PSAyNTYpIHsKLQkJcmMgPSByYy8yNTY7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNoYXIgKmNtZF9vdXRwdXQoY2hhciAqY21kKSB7Ci0JRklMRSAqcDsKLQlzdGF0aWMgY2hhciBvdXRwdXRbNTAwMDBdOwotCWNoYXIgbGluZVsxMDI0XTsKLQlpbnQgcmM7Ci0KLQlpZiAoIWNtZCB8fCAqY21kID09ICdcMCcpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCWlmIChub19leHRlcm5hbF9jbWRzKSB7Ci0JCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIGNtZCk7Ci0JCXJmYkxvZygiICAgY21kX291dHB1dDogbnVsbCBzdHJpbmcuXG4iKTsKLQkJcmV0dXJuICIiOwotCX0KLQotCXJmYkxvZygicnVubmluZyBwaXBlOlxuIik7Ci0JaWYgKCFxdWlldCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuICAlc1xuXG4iLCBjbWQpOwotCX0KLQl1c3JfYmluX3BhdGgoMCk7Ci0JY2xvc2VfZXhlY19mZHMoKTsKLQlwID0gcG9wZW4oY21kLCAiciIpOwotCXVzcl9iaW5fcGF0aCgxKTsKLQotCW91dHB1dFswXSA9ICdcMCc7Ci0KLQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgcCkgIT0gTlVMTCkgewotCQlpZiAoc3RybGVuKG91dHB1dCkgKyBzdHJsZW4obGluZSkgKyAxIDwgNTAwMDApIHsKLQkJCXN0cmNhdChvdXRwdXQsIGxpbmUpOwotCQl9Ci0JfQotCXJjID0gcGNsb3NlKHApOwotCXJldHVybihvdXRwdXQpOwotfQotCi1zdGF0aWMgY2hhciAqbGFzdF9jb2xvciA9IE5VTEw7Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3BpeGVsKGNoYXIgKmNvbG9yKSB7Ci0jaWYgTk9fWDExCi0JcmV0dXJuIDA7Ci0jZWxzZQotCVhDb2xvciBjZGVmOwotCUNvbG9ybWFwIGNtYXA7Ci0JdW5zaWduZWQgbG9uZyBwaXhlbCA9IEJsYWNrUGl4ZWwoZHB5LCBzY3IpOwotCWlmIChkZXB0aCA+IDggfHwgc3RyY21wKGNvbG9yLCBzb2xpZF9kZWZhdWx0KSkgewotCQljbWFwID0gRGVmYXVsdENvbG9ybWFwIChkcHksIHNjcik7Ci0JCWlmIChYUGFyc2VDb2xvcihkcHksIGNtYXAsIGNvbG9yLCAmY2RlZikgJiYKLQkJICAgIFhBbGxvY0NvbG9yKGRweSwgY21hcCwgJmNkZWYpKSB7Ci0JCQlwaXhlbCA9IGNkZWYucGl4ZWw7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coImVycm9yIHBhcnNpbmcvYWxsb2NpbmcgY29sb3I6ICVzXG4iLCBjb2xvcik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHBpeGVsOwotI2VuZGlmCi19Ci0KLVhJbWFnZSAqc29saWRfcm9vdChjaGFyICpjb2xvcikgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFjb2xvcikge30KLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JV2luZG93IGV4cG9zZTsKLQlzdGF0aWMgWEltYWdlICppbWFnZSA9IE5VTEw7Ci0JUGl4bWFwIHBpeG1hcDsKLQlYR0NWYWx1ZXMgZ2N2OwotCUdDIGdjOwotCVhTZXRXaW5kb3dBdHRyaWJ1dGVzIHN3YTsKLQlWaXN1YWwgdmlzdWFsOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIG1hc2ssIHBpeGVsID0gMDsKLQotCVJBV0ZCX1JFVChOVUxMKQotCi0JaWYgKHN1YndpbiB8fCB3aW5kb3cgIT0gcm9vdHdpbikgewotCQlyZmJMb2coImNhbm5vdCBzZXQgc3Vid2luIHRvIHNvbGlkIGNvbG9yLCBtdXN0IGJlIHJvb3R3aW5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBjcmVhdGUgdGhlICJjbGVhciIgd2luZG93IGp1c3QgZm9yIGdlbmVyYXRpbmcgZXhwb3N1cmVzICovCi0Jc3dhLm92ZXJyaWRlX3JlZGlyZWN0ID0gVHJ1ZTsKLQlzd2EuYmFja2luZ19zdG9yZSA9IE5vdFVzZWZ1bDsKLQlzd2Euc2F2ZV91bmRlciA9IEZhbHNlOwotCXN3YS5iYWNrZ3JvdW5kX3BpeG1hcCA9IE5vbmU7Ci0JdmlzdWFsLnZpc3VhbGlkID0gQ29weUZyb21QYXJlbnQ7Ci0JbWFzayA9IChDV092ZXJyaWRlUmVkaXJlY3R8Q1dCYWNraW5nU3RvcmV8Q1dTYXZlVW5kZXJ8Q1dCYWNrUGl4bWFwKTsKLQlleHBvc2UgPSBYQ3JlYXRlV2luZG93KGRweSwgd2luZG93LCAwLCAwLCB3ZHB5X3gsIHdkcHlfeSwgMCwgZGVwdGgsCi0JICAgIElucHV0T3V0cHV0LCAmdmlzdWFsLCBtYXNrLCAmc3dhKTsKLQotCWlmICghIGNvbG9yKSB7Ci0KLQkJaWYgKCEgaW1hZ2UpIHsKLQkJCS8qIHdob29wcyAqLwotCQkJWERlc3Ryb3lXaW5kb3coZHB5LCBleHBvc2UpOwotCQkJcmZiTG9nKCJubyByb290IHNuYXBzaG90IGF2YWlsYWJsZS5cbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvKiByZXN0b3JlIHRoZSByb290IHdpbmRvdyBmcm9tIHRoZSBYSW1hZ2Ugc25hcHNob3QgKi8KLQkJcGl4bWFwID0gWENyZWF0ZVBpeG1hcChkcHksIHdpbmRvdywgd2RweV94LCB3ZHB5X3ksIGRlcHRoKTsKLQkJCi0JCS8qIGRyYXcgdGhlIGltYWdlIHRvIGEgcGl4bWFwOiAqLwotCQlnY3YuZnVuY3Rpb24gPSBHWGNvcHk7Ci0JCWdjdi5wbGFuZV9tYXNrID0gQWxsUGxhbmVzOwotCQlnYyA9IFhDcmVhdGVHQyhkcHksIHdpbmRvdywgR0NGdW5jdGlvbnxHQ1BsYW5lTWFzaywgJmdjdik7Ci0KLQkJWFB1dEltYWdlKGRweSwgcGl4bWFwLCBnYywgaW1hZ2UsIDAsIDAsIDAsIDAsIHdkcHlfeCwgd2RweV95KTsKLQotCQlnY3YuZm9yZWdyb3VuZCA9IGdjdi5iYWNrZ3JvdW5kID0gQmxhY2tQaXhlbChkcHksIHNjcik7Ci0JCWdjID0gWENyZWF0ZUdDKGRweSwgd2luZG93LCBHQ0ZvcmVncm91bmR8R0NCYWNrZ3JvdW5kLCAmZ2N2KTsKLQotCQlyZmJMb2coInJlc3RvcmluZyByb290IHNuYXBzaG90Li4uXG4iKTsKLQkJLyogc2V0IHRoZSBwaXhtYXAgYXMgdGhlIGJnOiAqLwotCQlYU2V0V2luZG93QmFja2dyb3VuZFBpeG1hcChkcHksIHdpbmRvdywgcGl4bWFwKTsKLQkJWEZyZWVQaXhtYXAoZHB5LCBwaXhtYXApOwotCQlYQ2xlYXJXaW5kb3coZHB5LCB3aW5kb3cpOwotCQlYRmx1c2hfd3IoZHB5KTsKLQkJCi0JCS8qIGdlbmVyYXRlIGV4cG9zdXJlcyAqLwotCQlYTWFwV2luZG93KGRweSwgZXhwb3NlKTsKLQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JCVhEZXN0cm95V2luZG93KGRweSwgZXhwb3NlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCEgaW1hZ2UpIHsKLQkJLyogbmVlZCB0byByZXRyaWV2ZSBhIHNuYXBzaG90IG9mIHRoZSByb290IGJhY2tncm91bmQ6ICovCi0JCVdpbmRvdyBpd2luOwotCQlYU2V0V2luZG93QXR0cmlidXRlcyBpc3dhOwotCi0JCS8qIGNyZWF0ZSBpbWFnZSB3aW5kb3c6ICovCi0JCWlzd2Eub3ZlcnJpZGVfcmVkaXJlY3QgPSBUcnVlOwotCQlpc3dhLmJhY2tpbmdfc3RvcmUgPSBOb3RVc2VmdWw7Ci0JCWlzd2Euc2F2ZV91bmRlciA9IEZhbHNlOwotCQlpc3dhLmJhY2tncm91bmRfcGl4bWFwID0gUGFyZW50UmVsYXRpdmU7Ci0KLQkJaXdpbiA9IFhDcmVhdGVXaW5kb3coZHB5LCB3aW5kb3csIDAsIDAsIHdkcHlfeCwgd2RweV95LCAwLAotCQkgICAgZGVwdGgsIElucHV0T3V0cHV0LCAmdmlzdWFsLCBtYXNrLCAmaXN3YSk7Ci0KLQkJcmZiTG9nKCJzbmFwc2hvdHRpbmcgYmFja2dyb3VuZC4uLlxuIik7Ci0KLQkJWE1hcFdpbmRvdyhkcHksIGl3aW4pOwotCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCBpd2luLCAwLCAwLCB3ZHB5X3gsIHdkcHlfeSwgQWxsUGxhbmVzLAotCQkgICAgWlBpeG1hcCk7Ci0JCVhTeW5jKGRweSwgRmFsc2UpOwotCQlYRGVzdHJveVdpbmRvdyhkcHksIGl3aW4pOwotCQlyZmJMb2coImRvbmUuXG4iKTsKLQl9Ci0JaWYgKGNvbG9yID09IChjaGFyICopIDB4MSkgewotCQkvKiBjYWxsZXIgd2lsbCBYRGVzdHJveUltYWdlIGl0OiAqLwotCQlYSW1hZ2UgKnhpID0gaW1hZ2U7Ci0JCWltYWdlID0gTlVMTDsKLQkJcmV0dXJuIHhpOwotCX0KLQotCS8qIHVzZSBibGFjayBmb3IgbG93IGNvbG9ycyBvciBmYWlsdXJlICovCi0JcGl4ZWwgPSBnZXRfcGl4ZWwoY29sb3IpOwotCi0JcmZiTG9nKCJzZXR0aW5nIHNvbGlkIGJhY2tncm91bmQuLi5cbiIpOwotCVhTZXRXaW5kb3dCYWNrZ3JvdW5kKGRweSwgd2luZG93LCBwaXhlbCk7Ci0JWE1hcFdpbmRvdyhkcHksIGV4cG9zZSk7Ci0JWFN5bmMoZHB5LCBGYWxzZSk7Ci0JWERlc3Ryb3lXaW5kb3coZHB5LCBleHBvc2UpOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBzb2xpZF9jZGUoY2hhciAqY29sb3IpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghY29sb3IpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlpbnQgd3NtYXggPSAxNjsKLQlzdGF0aWMgWEltYWdlICppbWFnZVsxNl07Ci0Jc3RhdGljIFdpbmRvdyB3c193aW5zWzE2XTsKLQlzdGF0aWMgaW50IG53cyA9IC0xOwotCi0JV2luZG93IGV4cG9zZTsKLQlQaXhtYXAgcGl4bWFwOwotCVhHQ1ZhbHVlcyBnY3Y7Ci0JR0MgZ2M7Ci0JWFNldFdpbmRvd0F0dHJpYnV0ZXMgc3dhOwotCVZpc3VhbCB2aXN1YWw7Ci0JdW5zaWduZWQgbG9uZyBtYXNrLCBwaXhlbDsKLQlYQ29sb3IgY2RlZjsKLQlDb2xvcm1hcCBjbWFwOwotCWludCBuOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChzdWJ3aW4gfHwgd2luZG93ICE9IHJvb3R3aW4pIHsKLQkJcmZiTG9nKCJjYW5ub3Qgc2V0IHN1YndpbiB0byBzb2xpZCBjb2xvciwgbXVzdCBiZSByb290d2luXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGNyZWF0ZSB0aGUgImNsZWFyIiB3aW5kb3cganVzdCBmb3IgZ2VuZXJhdGluZyBleHBvc3VyZXMgKi8KLQlzd2Eub3ZlcnJpZGVfcmVkaXJlY3QgPSBUcnVlOwotCXN3YS5iYWNraW5nX3N0b3JlID0gTm90VXNlZnVsOwotCXN3YS5zYXZlX3VuZGVyID0gRmFsc2U7Ci0Jc3dhLmJhY2tncm91bmRfcGl4bWFwID0gTm9uZTsKLQl2aXN1YWwudmlzdWFsaWQgPSBDb3B5RnJvbVBhcmVudDsKLQltYXNrID0gKENXT3ZlcnJpZGVSZWRpcmVjdHxDV0JhY2tpbmdTdG9yZXxDV1NhdmVVbmRlcnxDV0JhY2tQaXhtYXApOwotCWV4cG9zZSA9IFhDcmVhdGVXaW5kb3coZHB5LCB3aW5kb3csIDAsIDAsIHdkcHlfeCwgd2RweV95LCAwLCBkZXB0aCwKLQkgICAgSW5wdXRPdXRwdXQsICZ2aXN1YWwsIG1hc2ssICZzd2EpOwotCi0JaWYgKCEgY29sb3IpIHsKLQkJLyogcmVzdG9yZSB0aGUgYmFja2Ryb3Agd2luZG93cyBmcm9tIHRoZSBYSW1hZ2Ugc25hcHNob3RzICovCi0KLQkJZm9yIChuPTA7IG4gPCBud3M7IG4rKykgewotCQkJV2luZG93IHR3aW47Ci0KLQkJCWlmICghIGltYWdlW25dKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXR3aW4gPSB3c193aW5zW25dOwotCQkJaWYgKCEgdHdpbikgewotCQkJCXR3aW4gPSByb290d2luOwotCQkJfQotCQkJaWYgKCEgdmFsaWRfd2luZG93KHR3aW4sIE5VTEwsIDApKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoZHB5LCB0d2luLCB3ZHB5X3gsIHdkcHlfeSwKLQkJCSAgICBkZXB0aCk7Ci0JCQkKLQkJCS8qIGRyYXcgdGhlIGltYWdlIHRvIGEgcGl4bWFwOiAqLwotCQkJZ2N2LmZ1bmN0aW9uID0gR1hjb3B5OwotCQkJZ2N2LnBsYW5lX21hc2sgPSBBbGxQbGFuZXM7Ci0JCQlnYyA9IFhDcmVhdGVHQyhkcHksIHR3aW4sIEdDRnVuY3Rpb258R0NQbGFuZU1hc2ssICZnY3YpOwotCi0JCQlYUHV0SW1hZ2UoZHB5LCBwaXhtYXAsIGdjLCBpbWFnZVtuXSwgMCwgMCwgMCwgMCwKLQkJCSAgICB3ZHB5X3gsIHdkcHlfeSk7Ci0KLQkJCWdjdi5mb3JlZ3JvdW5kID0gZ2N2LmJhY2tncm91bmQgPSBCbGFja1BpeGVsKGRweSwgc2NyKTsKLQkJCWdjID0gWENyZWF0ZUdDKGRweSwgdHdpbiwgR0NGb3JlZ3JvdW5kfEdDQmFja2dyb3VuZCwKLQkJCSAgICAmZ2N2KTsKLQotCQkJcmZiTG9nKCJyZXN0b3JpbmcgQ0RFIHdzJWQgc25hcHNob3QgdG8gMHglbHhcbiIsCi0JCQkgICAgbiwgdHdpbik7Ci0JCQkvKiBzZXQgdGhlIHBpeG1hcCBhcyB0aGUgYmc6ICovCi0JCQlYU2V0V2luZG93QmFja2dyb3VuZFBpeG1hcChkcHksIHR3aW4sIHBpeG1hcCk7Ci0JCQlYRnJlZVBpeG1hcChkcHksIHBpeG1hcCk7Ci0JCQlYQ2xlYXJXaW5kb3coZHB5LCB0d2luKTsKLQkJCVhGbHVzaF93cihkcHkpOwotCQl9Ci0JCQotCQkvKiBnZW5lcmF0ZSBleHBvc3VyZXMgKi8KLQkJWE1hcFdpbmRvdyhkcHksIGV4cG9zZSk7Ci0JCVhTeW5jKGRweSwgRmFsc2UpOwotCQlYRGVzdHJveVdpbmRvdyhkcHksIGV4cG9zZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobndzIDwgMCkgewotCQkvKiBuZWVkIHRvIHJldHJpZXZlIHNuYXBzaG90cyBvZiB0aGUgd3MgYmFja2dyb3VuZHM6ICovCi0JCVdpbmRvdyBpd2luLCB3bV93aW47Ci0JCVhTZXRXaW5kb3dBdHRyaWJ1dGVzIGlzd2E7Ci0JCUF0b20gZHRfbGlzdCwgd21faW5mbywgdHlwZTsKLQkJaW50IGZvcm1hdDsKLQkJdW5zaWduZWQgbG9uZyBsZW5ndGgsIGFmdGVyOwotCQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCQl1bnNpZ25lZCBsb25nICpkcDsJLyogY3Jhc2ggb24gNjRiaXQgd2l0aCBpbnQgKi8KLQotCQlud3MgPSAwOwotCi0JCS8qIGV4dHJhY3QgdGhlIGhpZGRlbiB3bSBwcm9wZXJ0aWVzIGFib3V0IGJhY2tkcm9wczogKi8KLQotCQl3bV9pbmZvID0gWEludGVybkF0b20oZHB5LCAiX01PVElGX1dNX0lORk8iLCBUcnVlKTsKLQkJaWYgKHdtX2luZm8gPT0gTm9uZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgcm9vdHdpbiwgd21faW5mbywgMEwsIDEwTCwgRmFsc2UsCi0JCSAgICBBbnlQcm9wZXJ0eVR5cGUsICZ0eXBlLCAmZm9ybWF0LCAmbGVuZ3RoLCAmYWZ0ZXIsICZkYXRhKTsKLQotCQkvKgotCQkgKiB4cHJvcCAtbm90eXBlIC1yb290IF9NT1RJRl9XTV9JTkZPCi0JCSAqIF9NT1RJRl9XTV9JTkZPID0gMHgyLCAweDU4MDAyOAotCQkgKi8KLQotCQlpZiAobGVuZ3RoIDwgMiB8fCBmb3JtYXQgIT0gMzIgfHwgYWZ0ZXIgIT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZHAgPSAodW5zaWduZWQgbG9uZyAqKSBkYXRhOwotCQl3bV93aW4gPSAoV2luZG93KSAqKGRwKzEpOwkvKiAybmQgaXRlbS4gKi8KLQotCi0JCWR0X2xpc3QgPSBYSW50ZXJuQXRvbShkcHksICJfRFRfV09SS1NQQUNFX0xJU1QiLCBUcnVlKTsKLQkJaWYgKGR0X2xpc3QgPT0gTm9uZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJWEdldFdpbmRvd1Byb3BlcnR5KGRweSwgd21fd2luLCBkdF9saXN0LCAwTCwgMTBMLCBGYWxzZSwKLQkJICAgQW55UHJvcGVydHlUeXBlLCAmdHlwZSwgJmZvcm1hdCwgJmxlbmd0aCwgJmFmdGVyLCAmZGF0YSk7Ci0KLQkJbndzID0gbGVuZ3RoOwotCi0JCWlmIChud3MgPiB3c21heCkgewotCQkJbndzID0gd3NtYXg7Ci0JCX0KLQkJaWYgKG53cyA8IDApIHsKLQkJCW53cyA9IDA7Ci0JCX0KLQotCQlyZmJMb2coInNwZWNpYWwgQ0RFIHdpbjogMHglbHgsICVkIHdvcmtzcGFjZXNcbiIsIHdtX3dpbiwgbndzKTsKLQkJaWYgKG53cyA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKG49MDsgbjxud3M7IG4rKykgewotCQkJQXRvbSB3c19hdG9tOwotCQkJY2hhciB0bXBbMzJdOwotCQkJV2luZG93IHR3aW47Ci0JCQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCQkJaW50IGksIGNudDsKLQotCQkJaW1hZ2Vbbl0gPSBOVUxMOwotCQkJd3Nfd2luc1tuXSA9IDB4MDsKLQotCQkJc3ByaW50Zih0bXAsICJfRFRfV09SS1NQQUNFX0lORk9fd3MlZCIsIG4pOwotCQkJd3NfYXRvbSA9IFhJbnRlcm5BdG9tKGRweSwgdG1wLCBGYWxzZSk7Ci0JCQlpZiAod3NfYXRvbSA9PSBOb25lKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlYR2V0V2luZG93UHJvcGVydHkoZHB5LCB3bV93aW4sIHdzX2F0b20sIDBMLCAxMDBMLAotCQkJICAgRmFsc2UsIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsICZmb3JtYXQsICZsZW5ndGgsCi0JCQkgICAmYWZ0ZXIsICZkYXRhKTsKLQotCQkJaWYgKGZvcm1hdCAhPSA4IHx8IGFmdGVyICE9IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qCi0JCQkgKiB4cHJvcCAtbm90eXBlIC1pZCB3bV93aW4KLQkJCSAqIF9EVF9XT1JLU1BBQ0VfSU5GT193czAgPSAiT25lIiwgIjMiLCAiMHgyZjJmNGEiLAotCQkJICogIjB4NjM2MzljIiwgIjB4MTAzIiwgIjEiLCAiMHg1ODA0NGUiCi0JCQkgKi8KLQotCQkJY250ID0gMDsKLQkJCXR3aW4gPSAweDA7Ci0JCQlmb3IgKGk9MDsgaTwgKGludCkgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKihkYXRhK2kpICE9ICdcMCcpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNudCsrOwkvKiBjb3VudCBudWxscyB0byBpbmRpY2F0ZSBmaWVsZCAqLwotCQkJCWlmIChjbnQgPT0gNikgewotCQkJCQkvKiBvbmUgcGFzdCB0aGUgbnVsbDogKi8KLQkJCQkJY2hhciAqcSA9IChjaGFyICopIChkYXRhK2krMSk7Ci0JCQkJCXVuc2lnbmVkIGxvbmcgaW47Ci0JCQkJCWlmIChzc2NhbmYocSwgIjB4JWx4IiwgJmluKSA9PSAxKSB7Ci0JCQkJCQl0d2luID0gKFdpbmRvdykgaW47Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXdzX3dpbnNbbl0gPSB0d2luOwotCi0JCQlpZiAoISB0d2luKSB7Ci0JCQkJdHdpbiA9IHJvb3R3aW47Ci0JCQl9Ci0KLQkJCVhHZXRXaW5kb3dBdHRyaWJ1dGVzKGRweSwgdHdpbiwgJmF0dHIpOwotCQkJaWYgKHR3aW4gIT0gcm9vdHdpbikgewotCQkJCWlmIChhdHRyLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQkJCVhNYXBXaW5kb3coZHB5LCB0d2luKTsKLQkJCQl9Ci0JCQkJWFJhaXNlV2luZG93KGRweSwgdHdpbik7Ci0JCQl9Ci0JCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJCi0JCQkvKiBjcmVhdGUgaW1hZ2Ugd2luZG93OiAqLwotCQkJaXN3YS5vdmVycmlkZV9yZWRpcmVjdCA9IFRydWU7Ci0JCQlpc3dhLmJhY2tpbmdfc3RvcmUgPSBOb3RVc2VmdWw7Ci0JCQlpc3dhLnNhdmVfdW5kZXIgPSBGYWxzZTsKLQkJCWlzd2EuYmFja2dyb3VuZF9waXhtYXAgPSBQYXJlbnRSZWxhdGl2ZTsKLQkJCXZpc3VhbC52aXN1YWxpZCA9IENvcHlGcm9tUGFyZW50OwotCi0JCQlpd2luID0gWENyZWF0ZVdpbmRvdyhkcHksIHR3aW4sIDAsIDAsIHdkcHlfeCwgd2RweV95LAotCQkJICAgIDAsIGRlcHRoLCBJbnB1dE91dHB1dCwgJnZpc3VhbCwgbWFzaywgJmlzd2EpOwotCi0JCQlyZmJMb2coInNuYXBzaG90dGluZyBDREUgYmFja2Ryb3Agd3MlZCAweCVseCAtPiAiCi0JCQkgICAgIjB4JWx4IC4uLlxuIiwgbiwgdHdpbiwgaXdpbik7Ci0JCQlYTWFwV2luZG93KGRweSwgaXdpbik7Ci0JCQlYU3luYyhkcHksIEZhbHNlKTsKLQotCQkJaW1hZ2Vbbl0gPSBYR2V0SW1hZ2UoZHB5LCBpd2luLCAwLCAwLCB3ZHB5X3gsIHdkcHlfeSwKLQkJCSAgICBBbGxQbGFuZXMsIFpQaXhtYXApOwotCQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JCQlYRGVzdHJveVdpbmRvdyhkcHksIGl3aW4pOwotCQkJaWYgKHR3aW4gIT0gcm9vdHdpbikgewotCQkJCVhMb3dlcldpbmRvdyhkcHksIHR3aW4pOwotCQkJCWlmIChhdHRyLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQkJCVhVbm1hcFdpbmRvdyhkcHksIHR3aW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAobndzID09IDApIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHVzZSBibGFjayBmb3IgbG93IGNvbG9ycyBvciBmYWlsdXJlICovCi0JcGl4ZWwgPSBCbGFja1BpeGVsKGRweSwgc2NyKTsKLQlpZiAoZGVwdGggPiA4IHx8IHN0cmNtcChjb2xvciwgc29saWRfZGVmYXVsdCkpIHsKLQkJY21hcCA9IERlZmF1bHRDb2xvcm1hcCAoZHB5LCBzY3IpOwotCQlpZiAoWFBhcnNlQ29sb3IoZHB5LCBjbWFwLCBjb2xvciwgJmNkZWYpICYmCi0JCSAgICBYQWxsb2NDb2xvcihkcHksIGNtYXAsICZjZGVmKSkgewotCQkJcGl4ZWwgPSBjZGVmLnBpeGVsOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJlcnJvciBwYXJzaW5nL2FsbG9jaW5nIGNvbG9yOiAlc1xuIiwgY29sb3IpOwotCQl9Ci0JfQotCi0JcmZiTG9nKCJzZXR0aW5nIHNvbGlkIGJhY2tncm91bmRzLi4uXG4iKTsKLQotCWZvciAobj0wOyBuIDwgbndzOyBuKyspICB7Ci0JCVdpbmRvdyB0d2luID0gd3Nfd2luc1tuXTsKLQkJaWYgKGltYWdlW25dID09IE5VTEwpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghIHR3aW4pICB7Ci0JCQl0d2luID0gcm9vdHdpbjsKLQkJfQotCQlYU2V0V2luZG93QmFja2dyb3VuZChkcHksIHR3aW4sIHBpeGVsKTsKLQl9Ci0JWE1hcFdpbmRvdyhkcHksIGV4cG9zZSk7Ci0JWFN5bmMoZHB5LCBGYWxzZSk7Ci0JWERlc3Ryb3lXaW5kb3coZHB5LCBleHBvc2UpOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgY2hhciBfZGJ1c19zdHJbMTEwMF07Ci0KLWNoYXIgKmRidXNfc2Vzc2lvbih2b2lkKSB7Ci0JY2hhciAqZGJ1c19lbnYgPSBnZXRlbnYoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIpOyAKLQljaGFyIHRtcFsxMDAwXTsKLQotCWlmIChkYnVzX2VudiAhPSBOVUxMICYmIHN0cmxlbihkYnVzX2VudikgPiAwKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JaWYgKCFkcHkpIHsKLQkJcmV0dXJuICIiOwotCX0KLSNpZiBOT19YMTEKLQlyZXR1cm4gIiI7Ci0jZWxzZQotCXsKLQkJQXRvbSBkYnVzX3Byb3AsIGRidXNfcGlkOwotCQlXaW5kb3cgciwgdywgKmNoaWxkcmVuOwotCQlpbnQgc2Jlc3QgPSAtMTsKLQkJdW5zaWduZWQgaW50IHVpOwotCQlpbnQgcmMsIGk7Ci0KLQkJbWVtc2V0KF9kYnVzX3N0ciwgMCwgc2l6ZW9mKF9kYnVzX3N0cikpOwotCi0JCVhfTE9DSzsKLQkJZGJ1c19wcm9wID0gWEludGVybkF0b20oZHB5LCAiX0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsIFRydWUpOwotCQlkYnVzX3BpZCAgPSBYSW50ZXJuQXRvbShkcHksICJfREJVU19TRVNTSU9OX0JVU19QSUQiLCBUcnVlKTsKLQkJWF9VTkxPQ0s7Ci0JCWlmIChkYnVzX3Byb3AgPT0gTm9uZSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0KLQkJWF9MT0NLOwotCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JCWdldF9wcm9wKHRtcCwgc2l6ZW9mKHRtcCktMSwgZGJ1c19wcm9wLCBOb25lKTsKLQkJWF9VTkxPQ0s7Ci0JCWlmIChzdHJjbXAodG1wLCAiIikpIHsKLQkJCWlmICghc3RyY2hyKHRtcCwgJ1wnJykpIHsKLQkJCQlzcHJpbnRmKF9kYnVzX3N0ciwgImVudiBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JyVzJyIsIHRtcCk7Ci0JCQkJcmV0dXJuIF9kYnVzX3N0cjsKLQkJCX0KLQkJfQotCi0JCVhfTE9DSzsKLQkJcmMgPSBYUXVlcnlUcmVlX3dyKGRweSwgcm9vdHdpbiwgJnIsICZ3LCAmY2hpbGRyZW4sICZ1aSk7Ci0JCVhfVU5MT0NLOwotCQlpZiAoIXJjIHx8IGNoaWxkcmVuID09IE5VTEwgfHwgdWkgPT0gMCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWZvciAoaT0wOyBpIDwgKGludCkgdWk7IGkrKykgewotCQkJaW50IHBpZCA9IC0xOwotCQotCQkJWF9MT0NLOwotCQkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCQkJZ2V0X3Byb3AodG1wLCBzaXplb2YodG1wKS0xLCBkYnVzX3Byb3AsIGNoaWxkcmVuW2ldKTsKLQkJCWlmIChkYnVzX3BpZCAhPSBOb25lKSB7Ci0JCQkJQXRvbSBhdHlwZTsKLQkJCQlpbnQgYWZvcm1hdDsKLQkJCQl1bnNpZ25lZCBsb25nIG5pdGVtcywgYmFmdGVyOwotCQkJCXVuc2lnbmVkIGNoYXIgKnByb3A7Ci0JCQkJaWYgKFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIGNoaWxkcmVuW2ldLCBkYnVzX3BpZCwKLQkJCQkgICAgMCwgMSwgRmFsc2UsIFhBX0NBUkRJTkFMLCAmYXR5cGUsICZhZm9ybWF0LAotCQkJCSAgICAmbml0ZW1zLCAmYmFmdGVyLCAmcHJvcCkgPT0gU3VjY2VzcwotCQkJCSAgICAmJiBhdHlwZSA9PSBYQV9DQVJESU5BTCkgewotCQkJCQlwaWQgPSAqKChpbnQgKikgcHJvcCk7Ci0JCQkJCVhGcmVlX3dyKHByb3ApOwotCQkJCX0KLQkJCX0KLQkJCVhfVU5MT0NLOwotCi0JCQlpZiAoc3RyY21wKHRtcCwgIiIpICAmJiAhc3RyY2hyKHRtcCwgJ1wnJykpIHsKLQkJCQlpbnQgc2NvcmUgPSAwOwotCQkJCWlmICgxIDwgcGlkICYmIHBpZCA8IDEwMDAwMDAwKSB7Ci0JCQkJCXN0cnVjdCBzdGF0IHNiOwotCQkJCQljaGFyIHByb2NmaWxlWzMyXTsKLQotCQkJCQlzcHJpbnRmKHByb2NmaWxlLCAiL3Byb2MvJWQiLCBwaWQpOwotCQkJCQlpZiAoc3RhdChwcm9jZmlsZSwgJnNiKSA9PSAwKSB7Ci0JCQkJCQlzY29yZSArPSAxMDAwMDAwMDsKLQkJCQkJfQotCQkJCQlzY29yZSArPSBwaWQ7Ci0JCQkJfQotCQkJCWlmIChnZXRlbnYoIlgxMVZOQ19EQlVTX0RFQlVHIikpIGZwcmludGYoc3RkZXJyLCAid2luOiAweCVseCAgcGlkOiAlOGQgIHNjb3JlOiAlOGQgIHN0cjogJXNcbiIsIGNoaWxkcmVuW2ldLCBwaWQsIHNjb3JlLCB0bXApOwotCQkJCWlmIChzY29yZSA+IHNiZXN0KSB7Ci0JCQkJCXNwcmludGYoX2RidXNfc3RyLCAiZW52IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nJXMnIiwgdG1wKTsKLQkJCQkJc2Jlc3QgPSBzY29yZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJWF9MT0NLOwotCQlYRnJlZV93cihjaGlsZHJlbik7Ci0JCVhfVU5MT0NLOwotCi0JCXJldHVybiBfZGJ1c19zdHI7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHNvbGlkX2dub21lKGNoYXIgKmNvbG9yKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlpZiAoIWNvbG9yKSB7fQotCXJldHVybjsKLSNlbHNlCi0JY2hhciBnZXRfY29sb3JbXSA9ICIlcyBnY29uZnRvb2wtMiAtLWdldCAiCi0JICAgICIvZGVza3RvcC9nbm9tZS9iYWNrZ3JvdW5kL3ByaW1hcnlfY29sb3IiOwotCWNoYXIgc2V0X2NvbG9yW10gPSAiJXMgZ2NvbmZ0b29sLTIgLS1zZXQgLS10eXBlIHN0cmluZyAiCi0JICAgICIvZGVza3RvcC9nbm9tZS9iYWNrZ3JvdW5kL3ByaW1hcnlfY29sb3IgJyVzJyI7Ci0JY2hhciBnZXRfb3B0aW9uW10gPSAiJXMgZ2NvbmZ0b29sLTIgLS1nZXQgIgotCSAgICAiL2Rlc2t0b3AvZ25vbWUvYmFja2dyb3VuZC9waWN0dXJlX29wdGlvbnMiOwotCWNoYXIgc2V0X29wdGlvbltdID0gIiVzIGdjb25mdG9vbC0yIC0tc2V0IC0tdHlwZSBzdHJpbmcgIgotCSAgICAiL2Rlc2t0b3AvZ25vbWUvYmFja2dyb3VuZC9waWN0dXJlX29wdGlvbnMgJyVzJyI7Ci0jaWYgMAotCWNoYXIgZ2V0X3NoYWRpbmdbXSA9ICIlcyBnY29uZnRvb2wtMiAtLWdldCAiCi0JICAgICIvZGVza3RvcC9nbm9tZS9iYWNrZ3JvdW5kL2NvbG9yX3NoYWRpbmdfdHlwZSI7Ci0JY2hhciBzZXRfc2hhZGluZ1tdID0gIiVzIGdjb25mdG9vbC0yIC0tc2V0IC0tdHlwZSBzdHJpbmcgIgotCSAgICAiL2Rlc2t0b3AvZ25vbWUvYmFja2dyb3VuZC9jb2xvcl9zaGFkaW5nX3R5cGUgJyVzJyI7Ci0JY2hhciBnZXRfZmlsZW5hbWVbXSA9ICIlcyBnY29uZnRvb2wtMiAtLWdldCAiCi0JICAgICIvZGVza3RvcC9nbm9tZS9iYWNrZ3JvdW5kL3BpY3R1cmVfZmlsZW5hbWUiOwotCWNoYXIgc2V0X2ZpbGVuYW1lW10gPSAiJXMgZ2NvbmZ0b29sLTIgLS1zZXQgLS10eXBlIHN0cmluZyAiCi0JICAgICIvZGVza3RvcC9nbm9tZS9iYWNrZ3JvdW5kL3BpY3R1cmVfZmlsZW5hbWUgJyVzJyI7Ci0jZW5kaWYKLQlzdGF0aWMgY2hhciAqb3JpZ19jb2xvciA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKm9yaWdfb3B0aW9uID0gTlVMTDsKLQljaGFyICpjbWQsICpkYnVzID0gIiI7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JZGJ1cyA9IGRidXNfc2Vzc2lvbigpOwotCXJmYkxvZygiZ3Vlc3NlZCBkYnVzOiAlc1xuIiwgZGJ1cyk7Ci0JCi0JaWYgKCEgY29sb3IpIHsKLQkJaWYgKCEgb3JpZ19jb2xvcikgewotCQkJb3JpZ19jb2xvciA9IHN0cmR1cCgiI0ZGRkZGRiIpOwotCQl9Ci0JCWlmICghIG9yaWdfb3B0aW9uKSB7Ci0JCQlvcmlnX29wdGlvbiA9IHN0cmR1cCgic3RyZXRjaGVkIik7Ci0JCX0KLQkJaWYgKHN0cnN0cihvcmlnX2NvbG9yLCAiJyIpICE9IE5VTEwpICB7Ci0JCQlyZmJMb2coImludmFsaWQgY29sb3I6ICVzXG4iLCBvcmlnX2NvbG9yKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3Ryc3RyKG9yaWdfb3B0aW9uLCAiJyIpICE9IE5VTEwpICB7Ci0JCQlyZmJMb2coImludmFsaWQgb3B0aW9uOiAlc1xuIiwgb3JpZ19vcHRpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oc2V0X29wdGlvbikgLSAyICsgc3RybGVuKG9yaWdfb3B0aW9uKSArIHN0cmxlbihkYnVzKSArIDEpOwotCQlzcHJpbnRmKGNtZCwgc2V0X29wdGlvbiwgZGJ1cywgb3JpZ19vcHRpb24pOwotCQlkdF9jbWQoY21kKTsKLQkJZnJlZShjbWQpOwotCQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHNldF9jb2xvcikgLSAyICsgc3RybGVuKG9yaWdfY29sb3IpICsgc3RybGVuKGRidXMpICsgMSk7Ci0JCXNwcmludGYoY21kLCBzZXRfY29sb3IsIGRidXMsIG9yaWdfY29sb3IpOwotCQlkdF9jbWQoY21kKTsKLQkJZnJlZShjbWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgb3JpZ19jb2xvcikgewotCQljaGFyICpxOwotCQlpZiAoY21kX29rKCJkdCIpKSB7Ci0JCQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGdldF9jb2xvcikgKyBzdHJsZW4oZGJ1cykgKyAxKTsKLQkJCXNwcmludGYoY21kLCBnZXRfY29sb3IsIGRidXMpOwotCQkJb3JpZ19jb2xvciA9IHN0cmR1cChjbWRfb3V0cHV0KGNtZCkpOwotCQkJZnJlZShjbWQpOwotCQl9IGVsc2UgewotCQkJb3JpZ19jb2xvciA9ICIiOwotCQl9Ci0JCWlmICgqb3JpZ19jb2xvciA9PSAnXDAnKSB7Ci0JCQlvcmlnX2NvbG9yID0gc3RyZHVwKCIjRkZGRkZGIik7Ci0JCX0KLQkJaWYgKChxID0gc3RyY2hyKG9yaWdfY29sb3IsICdcbicpKSAhPSBOVUxMKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0KLQl9Ci0JaWYgKCEgb3JpZ19vcHRpb24pIHsKLQkJY2hhciAqcTsKLQkJaWYgKGNtZF9vaygiZHQiKSkgewotCQkJY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihnZXRfb3B0aW9uKSArIHN0cmxlbihkYnVzKSArIDEpOwotCQkJc3ByaW50ZihjbWQsIGdldF9vcHRpb24sIGRidXMpOwotCQkJb3JpZ19vcHRpb24gPSBzdHJkdXAoY21kX291dHB1dChjbWQpKTsKLQkJCWZyZWUoY21kKTsKLQkJfSBlbHNlIHsKLQkJCW9yaWdfY29sb3IgPSAiIjsKLQkJfQotCQlpZiAoKm9yaWdfb3B0aW9uID09ICdcMCcpIHsKLQkJCW9yaWdfb3B0aW9uID0gc3RyZHVwKCJzdHJldGNoZWQiKTsKLQkJfQotCQlpZiAoKHEgPSBzdHJjaHIob3JpZ19vcHRpb24sICdcbicpKSAhPSBOVUxMKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0KLQl9Ci0JaWYgKHN0cnN0cihjb2xvciwgIiciKSAhPSBOVUxMKSAgewotCQlyZmJMb2coImludmFsaWQgY29sb3I6ICVzXG4iLCBjb2xvcik7Ci0JCXJldHVybjsKLQl9Ci0JY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzZXRfY29sb3IpICsgc3RybGVuKGNvbG9yKSArIHN0cmxlbihkYnVzKSArIDEpOwotCXNwcmludGYoY21kLCBzZXRfY29sb3IsIGRidXMsIGNvbG9yKTsKLQlkdF9jbWQoY21kKTsKLQlmcmVlKGNtZCk7Ci0KLQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHNldF9vcHRpb24pICsgc3RybGVuKCJub25lIikgKyBzdHJsZW4oZGJ1cykgKyAxKTsKLQlzcHJpbnRmKGNtZCwgc2V0X29wdGlvbiwgZGJ1cywgIm5vbmUiKTsKLQlkdF9jbWQoY21kKTsKLQlmcmVlKGNtZCk7Ci0KLSNpZiAwCi0JY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzZXRfZmlsZW5hbWUpICsgc3RybGVuKCJub25lIikgKyAxKTsKLQlzcHJpbnRmKGNtZCwgc2V0X2ZpbGVuYW1lLCBkYnVzLCAibm9uZSIpOwotCWR0X2NtZChjbWQpOwotCWZyZWUoY21kKTsKLSNlbmRpZgotCi0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyB2b2lkIHNvbGlkX3hmY2UoY2hhciAqY29sb3IpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghY29sb3IpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQljaGFyIGdldF9pbWFnZV9zaG93W10gID0gIiVzIHhmY29uZi1xdWVyeSAtdiAtYyB4ZmNlNC1kZXNrdG9wIC1wIC9iYWNrZHJvcC9zY3JlZW4wL21vbml0b3IwL2ltYWdlLXNob3ciOwotCWNoYXIgc2V0X2ltYWdlX3Nob3dbXSAgPSAiJXMgeGZjb25mLXF1ZXJ5IC12IC1jIHhmY2U0LWRlc2t0b3AgLXAgL2JhY2tkcm9wL3NjcmVlbjAvbW9uaXRvcjAvaW1hZ2Utc2hvdyAtcyAnJXMnIjsKLQljaGFyIGdldF9jb2xvcl9zdHlsZVtdID0gIiVzIHhmY29uZi1xdWVyeSAtdiAtYyB4ZmNlNC1kZXNrdG9wIC1wIC9iYWNrZHJvcC9zY3JlZW4wL21vbml0b3IwL2NvbG9yLXN0eWxlIjsKLQljaGFyIHNldF9jb2xvcl9zdHlsZVtdID0gIiVzIHhmY29uZi1xdWVyeSAtdiAtYyB4ZmNlNC1kZXNrdG9wIC1wIC9iYWNrZHJvcC9zY3JlZW4wL21vbml0b3IwL2NvbG9yLXN0eWxlIC1zICclcyciOwotCi0Jc3RhdGljIGNoYXIgKm9yaWdfaW1hZ2Vfc2hvdyA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKm9yaWdfY29sb3Jfc3R5bGUgPSBOVUxMOwotCWNoYXIgKmNtZCwgKmRidXMgPSAiIjsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlkYnVzID0gZGJ1c19zZXNzaW9uKCk7Ci0JcmZiTG9nKCJndWVzc2VkIGRidXM6ICVzXG4iLCBkYnVzKTsKLQkKLQlpZiAoISBjb2xvcikgewotCQlpZiAoISBvcmlnX2ltYWdlX3Nob3cpIHsKLQkJCW9yaWdfaW1hZ2Vfc2hvdyA9ICJ0cnVlIjsKLQkJfQotCQlpZiAoISBvcmlnX2NvbG9yX3N0eWxlKSB7Ci0JCQlvcmlnX2NvbG9yX3N0eWxlID0gIjAiOwotCQl9Ci0JCWlmIChzdHJzdHIob3JpZ19pbWFnZV9zaG93LCAiJyIpICE9IE5VTEwpICB7Ci0JCQlyZmJMb2coImludmFsaWQgaW1hZ2Ugc2hvdzogJXNcbiIsIG9yaWdfaW1hZ2Vfc2hvdyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHN0cnN0cihvcmlnX2NvbG9yX3N0eWxlLCAiJyIpICE9IE5VTEwpICB7Ci0JCQlyZmJMb2coImludmFsaWQgY29sb3Igc3R5bGU6ICVzXG4iLCBvcmlnX2NvbG9yX3N0eWxlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob3JpZ19pbWFnZV9zaG93WzBdICE9ICdcMCcpIHsKLQkJCWNtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oc2V0X2ltYWdlX3Nob3cpIC0gMiArIHN0cmxlbihvcmlnX2ltYWdlX3Nob3cpICsgc3RybGVuKGRidXMpICsgMSk7Ci0JCQlzcHJpbnRmKGNtZCwgc2V0X2ltYWdlX3Nob3csIGRidXMsIG9yaWdfaW1hZ2Vfc2hvdyk7Ci0JCQlkdF9jbWQoY21kKTsKLQkJCWZyZWUoY21kKTsKLQkJfQotCQlpZiAob3JpZ19jb2xvcl9zdHlsZVswXSAhPSAnXDAnKSB7Ci0JCQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHNldF9jb2xvcl9zdHlsZSkgLSAyICsgc3RybGVuKG9yaWdfY29sb3Jfc3R5bGUpICsgc3RybGVuKGRidXMpICsgMSk7Ci0JCQlzcHJpbnRmKGNtZCwgc2V0X2NvbG9yX3N0eWxlLCBkYnVzLCBvcmlnX2NvbG9yX3N0eWxlKTsKLQkJCWR0X2NtZChjbWQpOwotCQkJZnJlZShjbWQpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoISBvcmlnX2ltYWdlX3Nob3cpIHsKLQkJY2hhciAqcTsKLQkJb3JpZ19pbWFnZV9zaG93ID0gIiI7Ci0JCWlmIChjbWRfb2soImR0IikpIHsKLQkJCWNtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oZ2V0X2ltYWdlX3Nob3cpICsgc3RybGVuKGRidXMpICsgMSk7Ci0JCQlzcHJpbnRmKGNtZCwgZ2V0X2ltYWdlX3Nob3csIGRidXMpOwotCQkJb3JpZ19pbWFnZV9zaG93ID0gc3RyZHVwKGNtZF9vdXRwdXQoY21kKSk7Ci0JCQlpZiAoKHEgPSBzdHJyY2hyKG9yaWdfaW1hZ2Vfc2hvdywgJ1xuJykpICE9IE5VTEwpIHsKLQkJCQkqcSA9ICdcMCc7Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImdldF9pbWFnZV9zaG93IHJldHVybmVkOiAnJXMnXG5cbiIsIG9yaWdfaW1hZ2Vfc2hvdyk7Ci0JCQlmcmVlKGNtZCk7Ci0JCQlpZiAoc3RyY2FzZWNtcChvcmlnX2ltYWdlX3Nob3csICJmYWxzZSIpICYmIHN0cmNhc2VjbXAob3JpZ19pbWFnZV9zaG93LCAidHJ1ZSIpKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJ1bnJlY29nbml6ZWQgaW1hZ2Vfc2hvdywgZGlzYWJsaW5nLlxuIik7Ci0JCQkJZnJlZShvcmlnX2ltYWdlX3Nob3cpOwotCQkJCW9yaWdfaW1hZ2Vfc2hvdyA9ICIiOwotCQkJfQotCQl9Ci0JfQotCWlmICghIG9yaWdfY29sb3Jfc3R5bGUpIHsKLQkJY2hhciAqcTsKLQkJb3JpZ19jb2xvcl9zdHlsZSA9ICIiOwotCQlpZiAoY21kX29rKCJkdCIpKSB7Ci0JCQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGdldF9jb2xvcl9zdHlsZSkgKyBzdHJsZW4oZGJ1cykgKyAxKTsKLQkJCXNwcmludGYoY21kLCBnZXRfY29sb3Jfc3R5bGUsIGRidXMpOwotCQkJb3JpZ19jb2xvcl9zdHlsZSA9IHN0cmR1cChjbWRfb3V0cHV0KGNtZCkpOwotCQkJaWYgKChxID0gc3RycmNocihvcmlnX2NvbG9yX3N0eWxlLCAnXG4nKSkgIT0gTlVMTCkgewotCQkJCSpxID0gJ1wwJzsKLQkJCX0KLQkJCWZwcmludGYoc3RkZXJyLCAiZ2V0X2NvbG9yX3N0eWxlIHJldHVybmVkOiAnJXMnXG5cbiIsIG9yaWdfY29sb3Jfc3R5bGUpOwotCQkJZnJlZShjbWQpOwotCQkJaWYgKHN0cmxlbihvcmlnX2NvbG9yX3N0eWxlKSA+IDEgfHwgIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICgqb3JpZ19jb2xvcl9zdHlsZSkpKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJ1bnJlY29nbml6ZWQgY29sb3Jfc3R5bGUsIGRpc2FibGluZy5cbiIpOwotCQkJCWZyZWUob3JpZ19jb2xvcl9zdHlsZSk7Ci0JCQkJb3JpZ19jb2xvcl9zdHlsZSA9ICIiOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHN0cnN0cihjb2xvciwgIiciKSAhPSBOVUxMKSAgewotCQlyZmJMb2coImludmFsaWQgY29sb3I6ICVzXG4iLCBjb2xvcik7Ci0JCXJldHVybjsKLQl9Ci0KLQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHNldF9jb2xvcl9zdHlsZSkgKyBzdHJsZW4oIjAiKSArIHN0cmxlbihkYnVzKSArIDEpOwotCXNwcmludGYoY21kLCBzZXRfY29sb3Jfc3R5bGUsIGRidXMsICIwIik7Ci0JZHRfY21kKGNtZCk7Ci0JZnJlZShjbWQpOwotCi0JY21kID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzZXRfaW1hZ2Vfc2hvdykgKyBzdHJsZW4oImZhbHNlIikgKyBzdHJsZW4oZGJ1cykgKyAxKTsKLQlzcHJpbnRmKGNtZCwgc2V0X2ltYWdlX3Nob3csIGRidXMsICJmYWxzZSIpOwotCWR0X2NtZChjbWQpOwotCWZyZWUoY21kKTsKLQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0KLXN0YXRpYyBjaGFyICpkY29wX3Nlc3Npb24odm9pZCkgewotCWNoYXIgKmVtcHR5ID0gc3RyZHVwKCIiKTsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVQoZW1wdHkpOwotCXJldHVybiBlbXB0eTsKLSNlbHNlCi0JY2hhciBsaXN0X3Nlc3Npb25zW10gPSAiZGNvcCAtLXVzZXIgJyVzJyAtLWxpc3Qtc2Vzc2lvbnMiOwotCWludCBsZW47Ci0JY2hhciAqY21kLCAqaG9zdCwgKnVzZXIgPSBOVUxMOwotCWNoYXIgKm91dCwgKnAsICpkcywgKmRzbiA9IE5VTEwsICpzZXNzID0gTlVMTCwgKnNlc3MyID0gTlVMTDsKLQlpbnQgZGIgPSAwOwotCi0JUkFXRkJfUkVUKGVtcHR5KTsKLQotCWlmIChnZXRlbnYoIlNFU1NJT05fTUFOQUdFUiIpKSB7Ci0JCXJldHVybiBlbXB0eTsKLQl9Ci0KLQl1c2VyID0gZ2V0X3VzZXJfbmFtZSgpOwotCWlmIChzdHJzdHIodXNlciwgIiciKSAhPSBOVUxMKSAgewotCQlyZmJMb2coImludmFsaWQgdXNlcjogJXNcbiIsIHVzZXIpOwotCQlmcmVlKHVzZXIpOwotCQlyZXR1cm4gZW1wdHk7Ci0JfQotCi0JbGVuID0gc3RybGVuKGxpc3Rfc2Vzc2lvbnMpICsgc3RybGVuKHVzZXIpICsgMTsKLQljbWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQlzcHJpbnRmKGNtZCwgbGlzdF9zZXNzaW9ucywgdXNlcik7Ci0KLQlvdXQgPSBzdHJkdXAoY21kX291dHB1dChjbWQpKTsKLQlmcmVlKGNtZCk7Ci0JZnJlZSh1c2VyKTsKLQotCWRzID0gRGlzcGxheVN0cmluZyhkcHkpOwotCWlmICghZHMgfHwgIXN0cmNtcChkcywgIiIpKSB7Ci0JCWRzID0gZ2V0ZW52KCJESVNQTEFZIik7Ci0JfQotCWlmICghZHMpIHsKLQkJZHMgPSAiOjAiOwotCX0KLQlkcyA9IHN0cmR1cChkcyk7Ci0JcCA9IHN0cnJjaHIoZHMsICcuJyk7Ci0JaWYgKHApICpwID0gJ1wwJzsKLQotCWRzbiA9IHN0cmNocihkcywgJzonKTsKLQlpZiAoZHNuKSB7Ci0JCSpkc24gPSAnXyc7Ci0JfSBlbHNlIHsKLQkJZnJlZShkcyk7Ci0JCWRzID0gc3RyZHVwKCJfMCIpOwotCQlkc24gPSBkczsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImRzOiAgJXNcbiIsIGRzKTsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZHNuOiAlc1xuIiwgZHNuKTsKLQotCWhvc3QgPSB0aGlzX2hvc3QoKTsKLQlpZiAoaG9zdCkgewotCQljaGFyICpoMiA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oaG9zdCkgKyAyICsgMSk7Ci0JCXNwcmludGYoaDIsICJfJXNfIiwgaG9zdCk7Ci0JCWZyZWUoaG9zdCk7Ci0JCWhvc3QgPSBoMjsKLQl9IGVsc2UgewotCQlob3N0ID0gc3RyZHVwKCIiKTsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImhvc3Q6ICVzXG4iLCBob3N0KTsKLQotCXAgPSBzdHJ0b2sob3V0LCAiXG4iKTsKLQl3aGlsZSAocCkgewotCQljaGFyICpxID0gc3Ryc3RyKHAsICIuRENPUCIpOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicDogICVzXG4iLCBwKTsKLQkJaWYgKHEgPT0gTlVMTCkgewotCQkJOwotCQl9IGVsc2UgaWYgKGhvc3QpIHsKLQkJCWlmIChzdHJzdHIocSwgaG9zdCkpIHsKLQkJCQljaGFyICpyID0gc3Ryc3RyKHAsIGRzbik7Ci0JCQkJaW50IG4gPSBzdHJsZW4oZHNuKTsKLQkJCQlpZihyICYmICFpc2FsbnVtKChpbnQpICoocituKSkpIHsKLQkJCQkJc2VzcyA9IHN0cmR1cChxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHNlc3MyKSB7Ci0JCQkJCQlmcmVlKHNlc3MyKTsKLQkJCQkJfQotCQkJCQlzZXNzMiA9IHN0cmR1cChxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljaGFyICpyID0gc3Ryc3RyKHAsIGRzbik7Ci0JCQlpbnQgbiA9IHN0cmxlbihkc24pOwotCQkJaWYociAmJiAhaXNhbG51bSgoaW50KSAqKHIrbikpKSB7Ci0JCQkJc2VzcyA9IHN0cmR1cChxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICJcbiIpOwotCX0KLQlmcmVlKGRzKTsKLQlmcmVlKG91dCk7Ci0JZnJlZShob3N0KTsKLQlpZiAoIXNlc3MgJiYgc2VzczIpIHsKLQkJc2VzcyA9IHNlc3MyOwotCX0KLQlpZiAoIXNlc3MgfHwgc3RyY2hyKHNlc3MsICdcJycpKSB7Ci0JCWlmIChzZXNzKSBmcmVlKHNlc3MpOwotCQlzZXNzID0gc3RyZHVwKCItLWFsbC1zZXNzaW9ucyIpOwotCX0gZWxzZSB7Ci0JCWxlbiA9IHN0cmxlbigiLS1zZXNzaW9uICIpICsgMiArIHN0cmxlbihzZXNzKSArIDE7Ci0JCWNtZCA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCQlzcHJpbnRmKGNtZCwgIi0tc2Vzc2lvbiAnJXMnIiwgc2Vzcyk7Ci0JCWZyZWUoc2Vzcyk7Ci0JCXNlc3MgPSBjbWQ7Ci0JfQotCXJldHVybiBzZXNzOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHNvbGlkX2tkZShjaGFyICpjb2xvcikgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFjb2xvcikge30KLQlyZXR1cm47Ci0jZWxzZQotCWNoYXIgc2V0X2NvbG9yW10gPQotCSAgICAiZGNvcCAtLXVzZXIgJyVzJyAlcyBrZGVza3RvcCBLQmFja2dyb3VuZElmYWNlIHNldENvbG9yICclcycgMSI7Ci0JY2hhciBiZ19vZmZbXSA9Ci0JICAgICJkY29wIC0tdXNlciAnJXMnICVzIGtkZXNrdG9wIEtCYWNrZ3JvdW5kSWZhY2Ugc2V0QmFja2dyb3VuZEVuYWJsZWQgMCI7Ci0JY2hhciBiZ19vbltdID0KLQkgICAgImRjb3AgLS11c2VyICclcycgJXMga2Rlc2t0b3AgS0JhY2tncm91bmRJZmFjZSBzZXRCYWNrZ3JvdW5kRW5hYmxlZCAxIjsKLQljaGFyICpjbWQsICp1c2VyID0gTlVMTCwgKnNlc3M7Ci0JaW50IGxlbjsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQl1c2VyID0gZ2V0X3VzZXJfbmFtZSgpOwotCWlmIChzdHJzdHIodXNlciwgIiciKSAhPSBOVUxMKSAgewotCQlyZmJMb2coImludmFsaWQgdXNlcjogJXNcbiIsIHVzZXIpOwotCQlmcmVlKHVzZXIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2V0X2VudigiRElTUExBWSIsIERpc3BsYXlTdHJpbmcoZHB5KSk7Ci0KLQlpZiAoISBjb2xvcikgewotCQlzZXNzID0gZGNvcF9zZXNzaW9uKCk7Ci0JCWxlbiA9IHN0cmxlbihiZ19vbikgKyBzdHJsZW4odXNlcikgKyBzdHJsZW4oc2VzcykgKyAxOwotCQljbWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQkJc3ByaW50ZihjbWQsIGJnX29uLCB1c2VyLCBzZXNzKTsKLQotCQlkdF9jbWQoY21kKTsKLQotCQlmcmVlKGNtZCk7Ci0JCWZyZWUodXNlcik7Ci0JCWZyZWUoc2Vzcyk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChzdHJzdHIoY29sb3IsICInIikgIT0gTlVMTCkgIHsKLQkJcmZiTG9nKCJpbnZhbGlkIGNvbG9yOiAlc1xuIiwgY29sb3IpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2VzcyA9IGRjb3Bfc2Vzc2lvbigpOwotCi0JbGVuID0gc3RybGVuKHNldF9jb2xvcikgKyBzdHJsZW4odXNlcikgKyBzdHJsZW4oc2VzcykgKyBzdHJsZW4oY29sb3IpICsgMTsKLQljbWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQlzcHJpbnRmKGNtZCwgc2V0X2NvbG9yLCB1c2VyLCBzZXNzLCBjb2xvcik7Ci0JZHRfY21kKGNtZCk7Ci0JZnJlZShjbWQpOwotCi0JbGVuID0gc3RybGVuKGJnX29mZikgKyBzdHJsZW4odXNlcikgKyBzdHJsZW4oc2VzcykgKyAxOwotCWNtZCA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCXNwcmludGYoY21kLCBiZ19vZmYsIHVzZXIsIHNlc3MpOwotCWR0X2NtZChjbWQpOwotCWZyZWUoY21kKTsKLQlmcmVlKHVzZXIpOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIGtkZV9ub19hbmltYXRlKGludCByZXN0b3JlKSB7Ci0jaWYgTk9fWDExCi0JaWYgKCFyZXN0b3JlKSB7fQotCVJBV0ZCX1JFVF9WT0lECi0JcmV0dXJuOwotI2Vsc2UKLQljaGFyIHF1ZXJ5X3NldHRpbmdbXSA9Ci0JICAgICJrcmVhZGNvbmZpZyAgLS1maWxlIGt3aW5yYyAtLWdyb3VwIFdpbmRvd3MgLS1rZXkgQW5pbWF0ZU1pbmltaXplIjsKLQljaGFyIGt3aW5yY19vZmZbXSA9Ci0JICAgICJrd3JpdGVjb25maWcgLS1maWxlIGt3aW5yYyAtLWdyb3VwIFdpbmRvd3MgLS1rZXkgQW5pbWF0ZU1pbmltaXplIC0tdHlwZSBib29sIGZhbHNlIjsKLQljaGFyIGt3aW5yY19vbltdID0KLQkgICAgImt3cml0ZWNvbmZpZyAtLWZpbGUga3dpbnJjIC0tZ3JvdXAgV2luZG93cyAtLWtleSBBbmltYXRlTWluaW1pemUgLS10eXBlIGJvb2wgdHJ1ZSI7Ci0JY2hhciBrd2luX3JlY29uZmlndXJlW10gPQotCSAgICAiZGNvcCAtLXVzZXIgJyVzJyAlcyBrd2luIEtXaW5JbnRlcmZhY2UgcmVjb25maWd1cmUiOwotCWNoYXIgKmNtZCwgKmNtZDIsICpvdXQsICp1c2VyID0gTlVMTCwgKnNlc3M7Ci0JaW50IGxlbjsKLQlzdGF0aWMgaW50IGFuaW1fc3RhdGUgPSAxOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChuY2FjaGVfa2VlcF9hbmltcykgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHJlc3RvcmUpIHsKLQkJaWYgKGFuaW1fc3RhdGUgPT0gMSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdXNlciA9IGdldF91c2VyX25hbWUoKTsKLQkJaWYgKHN0cnN0cih1c2VyLCAiJyIpICE9IE5VTEwpICB7Ci0JCQlyZmJMb2coImludmFsaWQgdXNlcjogJXNcbiIsIHVzZXIpOwotCQkJZnJlZSh1c2VyKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNlc3MgPSBkY29wX3Nlc3Npb24oKTsKLQotCQlsZW4gPSBzdHJsZW4oa3dpbl9yZWNvbmZpZ3VyZSkgKyBzdHJsZW4odXNlcikgKyBzdHJsZW4oc2VzcykgKyAxOwotCQljbWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQkJc3ByaW50ZihjbWQsIGt3aW5fcmVjb25maWd1cmUsIHVzZXIsIHNlc3MpOwotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiUmVzdG9yaW5nIEtERSBrd2lucmMgc2V0dGluZ3MuXG4iKTsKLQkJcmZiTG9nKCJcbiIpOwotCQlkdF9jbWQoY21kKTsKLQkJZnJlZShjbWQpOwotCQlmcmVlKHVzZXIpOwotCQlmcmVlKHNlc3MpOwotCQlhbmltX3N0YXRlID0gMTsKLQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCWlmIChhbmltX3N0YXRlID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlhbmltX3N0YXRlID0gMDsKLQl9Ci0KLQl1c2VyID0gZ2V0X3VzZXJfbmFtZSgpOwotCWlmIChzdHJzdHIodXNlciwgIiciKSAhPSBOVUxMKSAgewotCQlyZmJMb2coImludmFsaWQgdXNlcjogJXNcbiIsIHVzZXIpOwotCQlmcmVlKHVzZXIpOwotCQlyZXR1cm47Ci0JfQotCW91dCA9IGNtZF9vdXRwdXQocXVlcnlfc2V0dGluZyk7Ci0KLQotCWlmICghb3V0IHx8IHN0cnN0cihvdXQsICJmYWxzZSIpKSB7Ci0JCXJmYkxvZygiXG4iKTsKLQkJcmZiTG9nKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0JCXJmYkxvZygiS0RFIGt3aW5yYyBBbmltYXRlTWluaW1pemUgaXMgZmFsc2UuIEdvb2QuXG4iKTsKLQkJcmZiTG9nKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0JCXJmYkxvZygiXG4iKTsKLQkJZnJlZSh1c2VyKTsKLQkJcmV0dXJuOwotCX0KLQotCXJmYkxvZygiXG4iKTsKLQlyZmJMb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQlyZmJMb2coIlRvIGltcHJvdmUgdGhlIC1uY2FjaGUgY2xpZW50LXNpZGUgY2FjaGluZyBwZXJmb3JtYW5jZVxuIik7Ci0JcmZiTG9nKCJ0ZW1wb3JhcmlseSBzZXR0aW5nIEtERSBrd2lucmMgQW5pbWF0ZU1pbmltaXplIHRvIGZhbHNlLlxuIik7Ci0JcmZiTG9nKCJJdCB3aWxsIGJlIHJlc2V0IGZvciB0aGUgbmV4dCBzZXNzaW9uIG9yIHdoZW4gVk5DIGNsaWVudFxuIik7Ci0JcmZiTG9nKCJkaXNjb25uZWN0cy4gIE9yIHlvdSBjYW4gdXNlIHRoZSBDb250cm9sIENlbnRlciBHVUkgdG9cbiIpOwotCXJmYkxvZygiY2hhbmdlIGl0IG5vdyAodG9nZ2xlIGl0cyBzZXR0aW5nIGEgZmV3IHRpbWVzKTpcbiIpOwotCXJmYkxvZygiICAgRGVza3RvcCAtPiBXaW5kb3cgQmVoYXZpb3IgLT4gTW92aW5nXG4iKTsKLQlyZmJMb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQlyZmJMb2coIlxuIik7Ci0KLQlzZXRfZW52KCJESVNQTEFZIiwgRGlzcGxheVN0cmluZyhkcHkpKTsKLQotCXNlc3MgPSBkY29wX3Nlc3Npb24oKTsKLQlsZW4gPSBzdHJsZW4oa3dpbl9yZWNvbmZpZ3VyZSkgKyBzdHJsZW4odXNlcikgKyBzdHJsZW4oc2VzcykgKyAxOwotCWNtZCA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCXNwcmludGYoY21kLCBrd2luX3JlY29uZmlndXJlLCB1c2VyLCBzZXNzKTsKLQotCWxlbiA9IDEgKyBzdHJsZW4oInNsZWVwIDEwIikgKyAyICsgc3RybGVuKGt3aW5yY19vZmYpICsgMiArIHN0cmxlbihjbWQpICsgMiArIHN0cmxlbigic2xlZXAgNSIpICsgMiArIHN0cmxlbihrd2lucmNfb24pICsgMyArIDE7Ci0JY21kMiA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCi0Jc3ByaW50ZihjbWQyLCAiKHNsZWVwIDEwOyAlczsgJXM7IHNsZWVwIDU7ICVzKSAmIiwga3dpbnJjX29mZiwgY21kLCBrd2lucmNfb24pOwotCi0JZHRfY21kKGNtZDIpOwotCWZyZWUoY21kKTsKLQlmcmVlKGNtZDIpOwotCWZyZWUodXNlcik7Ci0JZnJlZShzZXNzKTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBnbm9tZV9ub19hbmltYXRlKHZvaWQpIHsKLQk7Ci19Ci0KLXN0YXRpYyBwaWRfdCBzb2xpZF9tYWNvc3hfcGlkID0gMDsKLWV4dGVybiBjaGFyIG1hY29zeF9zb2xpZF9iYWNrZ3JvdW5kW107Ci0KLXN0YXRpYyB2b2lkIHNvbGlkX21hY29zeChpbnQgcmVzdG9yZSkgewotCWNoYXIgdG1wW10gPSAiL3RtcC9tYWNvc3hfc29saWRfYmFja2dyb3VuZC5YWFhYWFgiOwotCXBpZF90IHBpZCwgcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQlpZiAocmVzdG9yZSkgewotCQlyZmJMb2coInJlc3RvcmUgcGlkOiAlZFxuIiwgKGludCkgc29saWRfbWFjb3N4X3BpZCk7Ci0JCWlmIChzb2xpZF9tYWNvc3hfcGlkID4gMCkgewotI2lmIDAKLQkJCWludCBpLCBzdGF0dXM7Ci0jZW5kaWYKLQkJCXJmYkxvZygia2lsbCAtVEVSTSBtYWNvc3hfc29saWRfYmFja2dyb3VuZCBoZWxwZXIgcGlkOiAlZFxuIiwgKGludCkgc29saWRfbWFjb3N4X3BpZCk7Ci0JCQlraWxsKHNvbGlkX21hY29zeF9waWQsIFNJR1RFUk0pOwotI2lmIDAKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfV0FJVF9ICi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfV0FJVFBJRAotCQkJZm9yIChpPTA7IGkgPCA3OyBpKyspIHsKLQkJCQl1c2xlZXAoMTAwMCAqIDEwMDApOwotCQkJCXdhaXRwaWQoc29saWRfbWFjb3N4X3BpZCwgJnN0YXR1cywgV05PSEFORyk7IAotCQkJCWlmIChraWxsKHNvbGlkX21hY29zeF9waWQsIDApICE9IDApIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCQkJc29saWRfbWFjb3N4X3BpZCA9IDA7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJkdCIpKSB7Ci0JCXJldHVybjsKLQl9Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSwotCXBpZCA9IGZvcmsoKTsKLQotCWlmIChwaWQgPT0gLTEpIHsKLQkJcGVycm9yKCJmb3JrIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBpZCA9PSAwKSB7Ci0JCWludCBmZCA9IG1rc3RlbXAodG1wKTsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRTSUQKLQkJc2V0c2lkKCk7Ci0jZWxzZQotCQlzZXRwZ3JwKCk7Ci0jZW5kaWYKLQkJaWYgKGZkID49IDApIHsKLQkJCWNoYXIgbnVtWzMyXTsKLQkJCXdyaXRlKGZkLCBtYWNvc3hfc29saWRfYmFja2dyb3VuZCwgc3RybGVuKG1hY29zeF9zb2xpZF9iYWNrZ3JvdW5kKSk7Ci0JCQljbG9zZShmZCk7Ci0JCQlzcHJpbnRmKG51bSwgIiVkIiwgKGludCkgcGFyZW50KTsKLQkJCXNldF9lbnYoIlNTX1dBVENIX1BJRCIsIG51bSk7Ci0JCQlleGVjbHAoIi9iaW4vc2giLCAiL2Jpbi9zaCIsIHRtcCwgKGNoYXIgKikgTlVMTCk7Ci0JCX0KLQkJZXhpdCgxKTsKLQl9Ci0Jc29saWRfbWFjb3N4X3BpZCA9IHBpZDsKLQlyZmJMb2coIm1hY29zeF9zb2xpZF9iYWNrZ3JvdW5kIGhlbHBlciBwaWQ6ICVkXG4iLCAoaW50KSBzb2xpZF9tYWNvc3hfcGlkKTsKLQl1c2xlZXAoMjc1MCAqIDEwMDApOwotCXVubGluayh0bXApOwotI2VuZGlmCi19Ci0KLWNoYXIgKmd1ZXNzX2Rlc2t0b3Aodm9pZCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVCgicm9vdCIpCi0JcmV0dXJuICJyb290IjsKLSNlbHNlCi0JQXRvbSBwcm9wOwotCi0JUkFXRkJfUkVUKCJyb290IikKLQotCWlmICh3bWR0X3N0ciAmJiAqd21kdF9zdHIgIT0gJ1wwJykgewotCQljaGFyICpzID0gd21kdF9zdHI7Ci0JCWxvd2VyY2FzZShzKTsKLQkJaWYgKHN0cnN0cihzLCAieGZjZSIpKSB7Ci0JCQlyZXR1cm4gInhmY2UiOwotCQl9Ci0JCWlmIChzdHJzdHIocywgImdub21lIikgfHwgc3Ryc3RyKHMsICJtZXRhY2l0eSIpKSB7Ci0JCQlyZXR1cm4gImdub21lIjsKLQkJfQotCQlpZiAoc3Ryc3RyKHMsICJrZGUiKSB8fCBzdHJzdHIocywgImt3aW4iKSkgewotCQkJcmV0dXJuICJrZGUiOwotCQl9Ci0JCWlmIChzdHJzdHIocywgImNkZSIpKSB7Ci0JCQlyZXR1cm4gImNkZSI7Ci0JCX0KLQkJcmV0dXJuICJyb290IjsKLQl9Ci0KLQlpZiAoISBkcHkpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCXByb3AgPSBYSW50ZXJuQXRvbShkcHksICJYRkNFX0RFU0tUT1BfV0lORE9XIiwgVHJ1ZSk7Ci0JaWYgKHByb3AgIT0gTm9uZSkgcmV0dXJuICJ4ZmNlIjsKLQotCS8qIHNwZWNpYWwgY2FzZSB3aW5kb3dtYWtlciAqLwotCXByb3AgPSBYSW50ZXJuQXRvbShkcHksICJfV0lORE9XTUFLRVJfV01fUFJPVE9DT0xTIiwgVHJ1ZSk7Ci0JaWYgKHByb3AgIT0gTm9uZSkgIHJldHVybiAicm9vdCI7Ci0KLQlwcm9wID0gWEludGVybkF0b20oZHB5LCAiX1dJTkRPV01BS0VSX0NPTU1BTkQiLCBUcnVlKTsKLQlpZiAocHJvcCAhPSBOb25lKSByZXR1cm4gInJvb3QiOwotCi0JcHJvcCA9IFhJbnRlcm5BdG9tKGRweSwgIk5BVVRJTFVTX0RFU0tUT1BfV0lORE9XX0lEIiwgVHJ1ZSk7Ci0JaWYgKHByb3AgIT0gTm9uZSkgcmV0dXJuICJnbm9tZSI7Ci0KLQlwcm9wID0gWEludGVybkF0b20oZHB5LCAiS1dJTl9SVU5OSU5HIiwgVHJ1ZSk7Ci0JaWYgKHByb3AgIT0gTm9uZSkgewotCQlwcm9wID0gWEludGVybkF0b20oZHB5LCAiX0tERV9SVU5OSU5HIiwgVHJ1ZSk7Ci0JCWlmIChwcm9wICE9IE5vbmUpIHsKLQkJCXByb3AgPSBYSW50ZXJuQXRvbShkcHksICJLREVfREVTS1RPUF9XSU5ET1ciLCBUcnVlKTsKLQkJCWlmIChwcm9wICE9IE5vbmUpIHJldHVybiAia2RlIjsKLQkJfQotCX0KLQotCXByb3AgPSBYSW50ZXJuQXRvbShkcHksICJfTU9USUZfV01fSU5GTyIsIFRydWUpOwotCWlmIChwcm9wICE9IE5vbmUpIHsKLQkJcHJvcCA9IFhJbnRlcm5BdG9tKGRweSwgIl9EVF9XT1JLU1BBQ0VfTElTVCIsIFRydWUpOwotCQlpZiAocHJvcCAhPSBOb25lKSByZXR1cm4gImNkZSI7Ci0JfQotCXJldHVybiAicm9vdCI7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLVhJbWFnZSAqc29saWRfaW1hZ2UoY2hhciAqY29sb3IpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVQoTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JWEltYWdlICppbWFnZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBwaXhlbCA9IDA7Ci0JaW50IHgsIHk7Ci0KLQlSQVdGQl9SRVQoTlVMTCkKLQotCWlmICghY29sb3IpIHsKLQkJY29sb3IgPSBsYXN0X2NvbG9yOwotCX0KLQotCWlmICghY29sb3IpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCByb290d2luLCAwLCAwLCB3ZHB5X3gsIHdkcHlfeSwgQWxsUGxhbmVzLAotCSAgICBaUGl4bWFwKTsKLQotCWlmICghaW1hZ2UpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBpeGVsID0gZ2V0X3BpeGVsKGNvbG9yKTsKLQotCWZvciAoeT0wOyB5PHdkcHlfeTsgeSsrKSB7Ci0JCWZvciAoeD0wOyB4PHdkcHlfeDsgeCsrKSB7Ci0JCQlYUHV0UGl4ZWwoaW1hZ2UsIHgsIHksIHBpeGVsKTsKLQkJfQotCX0KLQlyZXR1cm4gaW1hZ2U7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgc29saWRfYmcoaW50IHJlc3RvcmUpIHsKLQlzdGF0aWMgaW50IGRlc2t0b3AgPSAtMTsKLQlzdGF0aWMgaW50IHNvbGlkX29uID0gMDsKLQlzdGF0aWMgY2hhciAqcHJldl9zdHI7Ci0JY2hhciAqZHRuYW1lLCAqY29sb3I7Ci0KLQlpZiAoc3RhcnRlZF9hc19yb290ID09IDEgJiYgdXNlcnNfbGlzdCkgewotCQkvKiB3ZSBhcmUgc3RpbGwgcm9vdCwgZG9uJ3QgdHJ5LiAqLwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCXNvbGlkX21hY29zeChyZXN0b3JlKTsKLQkJcmV0dXJuOwotCX0KLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlpZiAocmVzdG9yZSkgewotCQlpZiAoISBzb2xpZF9vbikgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkZXNrdG9wID09IDApIHsKLQkJCXNvbGlkX3Jvb3QoTlVMTCk7Ci0JCX0gZWxzZSBpZiAoZGVza3RvcCA9PSAxKSB7Ci0JCQlzb2xpZF9nbm9tZShOVUxMKTsKLQkJfSBlbHNlIGlmIChkZXNrdG9wID09IDIpIHsKLQkJCXNvbGlkX2tkZShOVUxMKTsKLQkJfSBlbHNlIGlmIChkZXNrdG9wID09IDMpIHsKLQkJCXNvbGlkX2NkZShOVUxMKTsKLQkJfSBlbHNlIGlmIChkZXNrdG9wID09IDQpIHsKLQkJCXNvbGlkX3hmY2UoTlVMTCk7Ci0JCX0KLQkJc29saWRfb24gPSAwOwotCQlyZXR1cm47Ci0JfQotCWlmICghIHNvbGlkX3N0cikgewotCQlyZXR1cm47Ci0JfQotCWlmIChzb2xpZF9vbiAmJiAhc3RyY21wKHByZXZfc3RyLCBzb2xpZF9zdHIpKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHN0cnN0cihzb2xpZF9zdHIsICJndWVzczoiKSA9PSBzb2xpZF9zdHIKLQkgICAgfHwgIXN0cmNocihzb2xpZF9zdHIsICc6JykpIHsKLQkJZHRuYW1lID0gZ3Vlc3NfZGVza3RvcCgpOwotCQlyZmJMb2coImd1ZXNzZWQgZGVza3RvcDogJXNcbiIsIGR0bmFtZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHN0cnN0cihzb2xpZF9zdHIsICJnbm9tZToiKSA9PSBzb2xpZF9zdHIpIHsKLQkJCWR0bmFtZSA9ICJnbm9tZSI7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHNvbGlkX3N0ciwgImtkZToiKSA9PSBzb2xpZF9zdHIpIHsKLQkJCWR0bmFtZSA9ICJrZGUiOwotCQl9IGVsc2UgaWYgKHN0cnN0cihzb2xpZF9zdHIsICJjZGU6IikgPT0gc29saWRfc3RyKSB7Ci0JCQlkdG5hbWUgPSAiY2RlIjsKLQkJfSBlbHNlIGlmIChzdHJzdHIoc29saWRfc3RyLCAieGZjZToiKSA9PSBzb2xpZF9zdHIpIHsKLQkJCWR0bmFtZSA9ICJ4ZmNlIjsKLQkJfSBlbHNlIHsKLQkJCWR0bmFtZSA9ICJyb290IjsKLQkJfQotCX0KLQotCWNvbG9yID0gc3RyY2hyKHNvbGlkX3N0ciwgJzonKTsKLQlpZiAoISBjb2xvcikgewotCQljb2xvciA9IHNvbGlkX3N0cjsKLQl9IGVsc2UgewotCQljb2xvcisrOwotCQlpZiAoKmNvbG9yID09ICdcMCcpIHsKLQkJCWNvbG9yID0gc29saWRfZGVmYXVsdDsKLQkJfQotCX0KLQlpZiAobGFzdF9jb2xvcikgewotCQlmcmVlKGxhc3RfY29sb3IpOwotCX0KLQlsYXN0X2NvbG9yID0gc3RyZHVwKGNvbG9yKTsKLQotCWlmICghc3RyY21wKGR0bmFtZSwgImdub21lIikpIHsKLQkJZGVza3RvcCA9IDE7Ci0JCXNvbGlkX2dub21lKGNvbG9yKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoZHRuYW1lLCAia2RlIikpIHsKLQkJZGVza3RvcCA9IDI7Ci0JCXNvbGlkX2tkZShjb2xvcik7Ci0JfSBlbHNlIGlmICghc3RyY21wKGR0bmFtZSwgImNkZSIpKSB7Ci0JCWRlc2t0b3AgPSAzOwotCQlzb2xpZF9jZGUoY29sb3IpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChkdG5hbWUsICJ4ZmNlIikpIHsKLQkJZGVza3RvcCA9IDQ7Ci0JCXNvbGlkX3hmY2UoY29sb3IpOwotCX0gZWxzZSB7Ci0JCWRlc2t0b3AgPSAwOwotCQlzb2xpZF9yb290KGNvbG9yKTsKLQl9Ci0JaWYgKHByZXZfc3RyKSB7Ci0JCWZyZWUocHJldl9zdHIpOwotCX0KLQlwcmV2X3N0ciA9IHN0cmR1cChzb2xpZF9zdHIpOwotCXNvbGlkX29uID0gMTsKLX0KLQotCmRpZmYgLS1naXQgYS94MTF2bmMvc29saWQuaCBiL3gxMXZuYy9zb2xpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1YWNlLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zb2xpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfU09MSURfSAotI2RlZmluZSBfWDExVk5DX1NPTElEX0gKLQotLyogLS0gc29saWQuaCAtLSAqLwotCi1leHRlcm4gY2hhciAqZ3Vlc3NfZGVza3RvcCh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9waXhlbChjaGFyICpjb2xvcik7Ci1leHRlcm4gWEltYWdlICpzb2xpZF9pbWFnZShjaGFyICpjb2xvcik7Ci1leHRlcm4gdm9pZCBzb2xpZF9iZyhpbnQgcmVzdG9yZSk7Ci1leHRlcm4gY2hhciAqZGJ1c19zZXNzaW9uKHZvaWQpOwotZXh0ZXJuIFhJbWFnZSAqc29saWRfcm9vdChjaGFyICpjb2xvcik7Ci1leHRlcm4gdm9pZCBrZGVfbm9fYW5pbWF0ZShpbnQgcmVzdG9yZSk7Ci1leHRlcm4gdm9pZCBnbm9tZV9ub19hbmltYXRlKHZvaWQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19TT0xJRF9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvc3NsY21kcy5jIGIveDExdm5jL3NzbGNtZHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0YmRjMS4uMDAwMDAwMAotLS0gYS94MTF2bmMvc3NsY21kcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA4ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gc3NsY21kcy5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJpbmV0LmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInNzbGhlbHBlci5oIgotI2luY2x1ZGUgInNzbHRvb2xzLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZPUksKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfV0FJVF9ICi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfV0FJVFBJRAotI2RlZmluZSBTU0xDTURTCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLQotdm9pZCBjaGVja19zdHVubmVsKHZvaWQpOwotaW50IHN0YXJ0X3N0dW5uZWwoaW50IHN0dW5uZWxfcG9ydCwgaW50IHgxMXZuY19wb3J0LCBpbnQgaHBvcnQsIGludCB4MTF2bmNfaHBvcnQpOwotdm9pZCBzdG9wX3N0dW5uZWwodm9pZCk7Ci12b2lkIHNldHVwX3N0dW5uZWwoaW50IHJwb3J0LCBpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KTsKLWNoYXIgKmdldF9DZXJ0X2RpcihjaGFyICpjZGlyX2luLCBjaGFyICoqdG1wX2luKTsKLXZvaWQgc3NsU2NyaXB0cyh2b2lkKTsKLXZvaWQgc3NsR2VuQ0EoY2hhciAqY2Rpcik7Ci12b2lkIHNzbEdlbkNlcnQoY2hhciAqdHksIGNoYXIgKm5tKTsKLXZvaWQgc3NsRW5jS2V5KGNoYXIgKnBhdGgsIGludCBpbmZvX29ubHkpOwotCi1zdGF0aWMgcGlkX3Qgc3R1bm5lbF9waWQgPSAwOwotCi12b2lkIGNoZWNrX3N0dW5uZWwodm9pZCkgewotCXN0YXRpYyB0aW1lX3QgbGFzdF9jaGVjayA9IDA7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0KLQlpZiAobGFzdF9jaGVjayArIDMgPj0gbm93KSB7Ci0JCXJldHVybjsKLQl9Ci0JbGFzdF9jaGVjayA9IG5vdzsKLQotCS8qIGRvdWJsZSBjaGVjayB0aGF0IHN0dW5uZWwgaXMgc3RpbGwgcnVubmluZzogKi8KLQotCWlmIChzdHVubmVsX3BpZCA+IDApIHsKLQkJaW50IHN0YXR1czsKLSNpZmRlZiBTU0xDTURTCi0JCXdhaXRwaWQoc3R1bm5lbF9waWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLSNlbmRpZgotCQlpZiAoa2lsbChzdHVubmVsX3BpZCwgMCkgIT0gMCkgewotI2lmZGVmIFNTTENNRFMKLQkJCXdhaXRwaWQoc3R1bm5lbF9waWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLSNlbmRpZgotCQkJcmZiTG9nKCJzdHVubmVsIHN1YnByb2Nlc3MgJWQgZGllZC5cbiIsIHN0dW5uZWxfcGlkKTsgCi0JCQlzdHVubmVsX3BpZCA9IDA7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JfQotfQotCi1pbnQgc3RhcnRfc3R1bm5lbChpbnQgc3R1bm5lbF9wb3J0LCBpbnQgeDExdm5jX3BvcnQsIGludCBocG9ydCwgaW50IHgxMXZuY19ocG9ydCkgewotI2lmZGVmIFNTTENNRFMKLQljaGFyIGV4dHJhW10gPSAiOi91c3Ivc2JpbjovdXNyL2xvY2FsL3NiaW46L2Rpc3Qvc2JpbiI7Ci0JY2hhciAqcGF0aCwgKnAsICpleGU7Ci0JY2hhciAqc3R1bm5lbF9wYXRoID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhdCB2ZXJpZnlfYnVmOwotCXN0cnVjdCBzdGF0IGNybF9idWY7Ci0JaW50IHN0YXR1cywgdG1wX3BlbSA9IDA7Ci0KLQlpZiAoc3R1bm5lbF9waWQpIHsKLQkJc3RvcF9zdHVubmVsKCk7Ci0JfQotCXN0dW5uZWxfcGlkID0gMDsKLQotCXBhdGggPSBnZXRlbnYoIlBBVEgiKTsKLQlpZiAoISBwYXRoKSB7Ci0JCXBhdGggPSBzdHJkdXAoZXh0cmErMSk7Ci0JfSBlbHNlIHsKLQkJY2hhciAqcHQgPSBwYXRoOwotCQlwYXRoID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwYXRoKStzdHJsZW4oZXh0cmEpKzEpOwotCQlpZiAoISBwYXRoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlzdHJjcHkocGF0aCwgcHQpOwotCQlzdHJjYXQocGF0aCwgZXh0cmEpOwotCX0KLQotCWV4ZSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ocGF0aCkgKyAxICsgc3RybGVuKCJzdHVubmVsNCIpICsgMSk7Ci0KLQlwID0gc3RydG9rKHBhdGgsICI6Iik7Ci0KLQlleGVbMF0gPSAnXDAnOwotCi0Jd2hpbGUgKHApIHsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQotCQlzcHJpbnRmKGV4ZSwgIiVzLyVzIiwgcCwgInN0dW5uZWw0Iik7Ci0JCWlmICghIHN0dW5uZWxfcGF0aCAmJiBzdGF0KGV4ZSwgJnNidWYpID09IDApIHsKLQkJCWlmICghIFNfSVNESVIoc2J1Zi5zdF9tb2RlKSkgewotCQkJCXN0dW5uZWxfcGF0aCA9IGV4ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXNwcmludGYoZXhlLCAiJXMvJXMiLCBwLCAic3R1bm5lbCIpOwotCQlpZiAoISBzdHVubmVsX3BhdGggJiYgc3RhdChleGUsICZzYnVmKSA9PSAwKSB7Ci0JCQlpZiAoISBTX0lTRElSKHNidWYuc3RfbW9kZSkpIHsKLQkJCQlzdHVubmVsX3BhdGggPSBleGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwID0gc3RydG9rKE5VTEwsICI6Iik7Ci0JfQotCWlmIChwYXRoKSB7Ci0JCWZyZWUocGF0aCk7Ci0JfQotCi0JaWYgKGdldGVudigiU1RVTk5FTF9QUk9HIikpIHsKLQkJZnJlZShleGUpOwotCQlleGUgPSBzdHJkdXAoZ2V0ZW52KCJTVFVOTkVMX1BST0ciKSk7Ci0JCXN0dW5uZWxfcGF0aCA9IGV4ZTsKLQl9Ci0KLQlpZiAoISBzdHVubmVsX3BhdGgpIHsKLQkJZnJlZShleGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHN0dW5uZWxfcGF0aFswXSA9PSAnXDAnKSB7Ci0JCWZyZWUoZXhlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogc3R1bm5lbCAqLwotCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soInN0dW5uZWwiKSkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygic3RhcnRfc3R1bm5lbDogY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIHN0dW5uZWxfcGF0aCk7Ci0JCXJmYkxvZygiICAgZXhpdGluZy5cbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCWlmICghIHF1aWV0KSB7Ci0JCXJmYkxvZygiXG4iKTsKLQkJcmZiTG9nKCJzdGFydGluZyBzc2wgdHVubmVsOiAlcyAgJWQgLT4gJWRcbiIsIHN0dW5uZWxfcGF0aCwKLQkJICAgIHN0dW5uZWxfcG9ydCwgeDExdm5jX3BvcnQpOwotCX0KLQotCWlmIChzdHVubmVsX3BlbSAmJiBzdHJzdHIoc3R1bm5lbF9wZW0sICJTQVZFIikgPT0gc3R1bm5lbF9wZW0pIHsKLQkJc3R1bm5lbF9wZW0gPSBnZXRfc2F2ZWRfcGVtKHN0dW5uZWxfcGVtLCAxKTsKLQkJaWYgKCEgc3R1bm5lbF9wZW0pIHsKLQkJCXJmYkxvZygic3RhcnRfc3R1bm5lbDogY291bGQgbm90IGNyZWF0ZSBvciBvcGVuIgotCQkJICAgICIgc2F2ZWQgUEVNLlxuIik7CQotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCX0gZWxzZSBpZiAoIXN0dW5uZWxfcGVtKSB7Ci0JCXN0dW5uZWxfcGVtID0gY3JlYXRlX3RtcF9wZW0oTlVMTCwgMCk7Ci0JCWlmICghIHN0dW5uZWxfcGVtKSB7Ci0JCQlyZmJMb2coInN0YXJ0X3N0dW5uZWw6IGNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5LCIKLQkJCSAgICAiIHNlbGYtc2lnbmVkIFBFTS5cbiIpOwkKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJdG1wX3BlbSA9IDE7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19TSE9XX1RNUF9QRU0iKSkgewotCQkJRklMRSAqaW4gPSBmb3BlbihzdHVubmVsX3BlbSwgInIiKTsKLQkJCWlmIChpbiAhPSBOVUxMKSB7Ci0JCQkJY2hhciBsaW5lWzEyOF07Ci0JCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQkJCXdoaWxlIChmZ2V0cyhsaW5lLCAxMjgsIGluKSAhPSBOVUxMKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaW5lKTsKLQkJCQl9Ci0JCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQkJCWZjbG9zZShpbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoc3NsX3ZlcmlmeSkgewotCQljaGFyICpmaWxlID0gZ2V0X3NzbF92ZXJpZnlfZmlsZShzc2xfdmVyaWZ5KTsKLQkJaWYgKGZpbGUpIHsKLQkJCXNzbF92ZXJpZnkgPSBmaWxlOwotCQl9Ci0JCWlmIChzdGF0KHNzbF92ZXJpZnksICZ2ZXJpZnlfYnVmKSAhPSAwKSB7Ci0JCQlyZmJMb2coInN0dW5uZWw6ICVzIGRvZXMgbm90IGV4aXN0LlxuIiwgc3NsX3ZlcmlmeSk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JfQotCWlmIChzc2xfY3JsKSB7Ci0JCWlmIChzdGF0KHNzbF9jcmwsICZjcmxfYnVmKSAhPSAwKSB7Ci0JCQlyZmJMb2coInN0dW5uZWw6ICVzIGRvZXMgbm90IGV4aXN0LlxuIiwgc3NsX2NybCk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JfQotCi0Jc3R1bm5lbF9waWQgPSBmb3JrKCk7Ci0KLQlpZiAoc3R1bm5lbF9waWQgPCAwKSB7Ci0JCXN0dW5uZWxfcGlkID0gMDsKLQkJZnJlZShleGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3R1bm5lbF9waWQgPT0gMCkgewotCQlGSUxFICppbjsKLQkJY2hhciBmZFsyMF07Ci0JCWludCBpOwotCQljaGFyICpzdF9pZiA9IGdldGVudigiU1RVTk5FTF9MSVNURU4iKTsKLQotCQlpZiAoc3RfaWYgPT0gTlVMTCkgewotCQkJc3RfaWYgPSAiIjsKLQkJfSBlbHNlIHsKLQkJCXN0X2lmID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzdF9pZikgKyAyKTsKLQkJCXNwcmludGYoc3RfaWYsICIlczoiLCBnZXRlbnYoIlNUVU5ORUxfTElTVEVOIikpOwotCQl9Ci0KLQotCQlmb3IgKGk9MzsgaTwyNTY7IGkrKykgewotCQkJY2xvc2UoaSk7Ci0JCX0KLQotCQlpZiAodXNlX3N0dW5uZWwgPT0gMykgewotCQkJY2hhciBzcFszMF0sIHhwWzMwXSwgKmEgPSBOVUxMOwotCQkJY2hhciAqc3QgPSBzdHVubmVsX3BhdGg7Ci0JCQljaGFyICpwbSA9IHN0dW5uZWxfcGVtOwotCQkJY2hhciAqc3YgPSBzc2xfdmVyaWZ5OwotCi0JCQlzcHJpbnRmKHNwLCAiJWQiLCBzdHVubmVsX3BvcnQpOwotCQkJc3ByaW50Zih4cCwgIiVkIiwgeDExdm5jX3BvcnQpOwotCi0JCQlpZiAoc3NsX3ZlcmlmeSkgewotCQkJCWlmKFNfSVNESVIodmVyaWZ5X2J1Zi5zdF9tb2RlKSkgewotCQkJCQlhID0gIi1hIjsKLQkJCQl9IGVsc2UgewotCQkJCQlhID0gIi1BIjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzc2xfY3JsKSB7Ci0JCQkJcmZiTG9nKCJzdHVubmVsOiBzdHVubmVsMyBkb2VzIG5vdCBzdXBwb3J0IENSTC4gJXNcbiIsIHNzbF9jcmwpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChzdHVubmVsX3BlbSAmJiBzc2xfdmVyaWZ5KSB7Ci0JCQkJLyogWFhYIGRvdWJsZSBjaGVjayAtdiAyICovCi0JCQkJZXhlY2xwKHN0LCBzdCwgIi1mIiwgIi1kIiwgc3AsICItciIsIHhwLCAiLVAiLAotCQkJCSAgICAibm9uZSIsICItcCIsIHBtLCBhLCBzdiwgIi12IiwgIjIiLAotCQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkJCX0gZWxzZSBpZiAoc3R1bm5lbF9wZW0gJiYgIXNzbF92ZXJpZnkpIHsKLQkJCQlleGVjbHAoc3QsIHN0LCAiLWYiLCAiLWQiLCBzcCwgIi1yIiwgeHAsICItUCIsCi0JCQkJICAgICJub25lIiwgIi1wIiwgcG0sCi0JCQkJICAgIChjaGFyICopIE5VTEwpOwotCQkJfSBlbHNlIGlmICghc3R1bm5lbF9wZW0gJiYgc3NsX3ZlcmlmeSkgewotCQkJCWV4ZWNscChzdCwgc3QsICItZiIsICItZCIsIHNwLCAiLXIiLCB4cCwgIi1QIiwKLQkJCQkgICAgIm5vbmUiLCBhLCBzdiwgIi12IiwgIjIiLAotCQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhlY2xwKHN0LCBzdCwgIi1mIiwgIi1kIiwgc3AsICItciIsIHhwLCAiLVAiLAotCQkJCSAgICAibm9uZSIsIChjaGFyICopIE5VTEwpOwotCQkJfQotCQkJZXhpdCgxKTsKLQkJfQotCi0JCWluID0gdG1wZmlsZSgpOwotCQlpZiAoISBpbikgewotCQkJZXhpdCgxKTsKLQkJfQotCi0JCWZwcmludGYoaW4sICJmb3JlZ3JvdW5kID0geWVzXG4iKTsKLQkJZnByaW50ZihpbiwgInBpZCA9XG4iKTsKLQkJaWYgKHN0dW5uZWxfcGVtKSB7Ci0JCQlmcHJpbnRmKGluLCAiY2VydCA9ICVzXG4iLCBzdHVubmVsX3BlbSk7Ci0JCX0KLQkJaWYgKHNzbF9jcmwpIHsKLQkJCWlmKFNfSVNESVIoY3JsX2J1Zi5zdF9tb2RlKSkgewotCQkJCWZwcmludGYoaW4sICJDUkxwYXRoID0gJXNcbiIsIHNzbF9jcmwpOwotCQkJfSBlbHNlIHsKLQkJCQlmcHJpbnRmKGluLCAiQ1JMZmlsZSA9ICVzXG4iLCBzc2xfY3JsKTsKLQkJCX0KLQkJfQotCQlpZiAoc3NsX3ZlcmlmeSkgewotCQkJaWYoU19JU0RJUih2ZXJpZnlfYnVmLnN0X21vZGUpKSB7Ci0JCQkJZnByaW50ZihpbiwgIkNBcGF0aCA9ICVzXG4iLCBzc2xfdmVyaWZ5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihpbiwgIkNBZmlsZSA9ICVzXG4iLCBzc2xfdmVyaWZ5KTsKLQkJCX0KLQkJCWZwcmludGYoaW4sICJ2ZXJpZnkgPSAyXG4iKTsKLQkJfQotCQlmcHJpbnRmKGluLCAiO2RlYnVnID0gN1xuXG4iKTsKLQkJZnByaW50ZihpbiwgIlt4MTF2bmNfc3R1bm5lbF1cbiIpOwotCQlmcHJpbnRmKGluLCAiYWNjZXB0ID0gJXMlZFxuIiwgc3RfaWYsIHN0dW5uZWxfcG9ydCk7Ci0JCWZwcmludGYoaW4sICJjb25uZWN0ID0gJWRcbiIsIHgxMXZuY19wb3J0KTsKLQotCQlpZiAoaHBvcnQgPiAwICYmIHgxMXZuY19ocG9ydCA+IDApIHsKLQkJCWZwcmludGYoaW4sICJcblt4MTF2bmNfaHR0cF1cbiIpOwotCQkJZnByaW50ZihpbiwgImFjY2VwdCA9ICVzJWRcbiIsIHN0X2lmLCBocG9ydCk7Ci0JCQlmcHJpbnRmKGluLCAiY29ubmVjdCA9ICVkXG4iLCB4MTF2bmNfaHBvcnQpOwotCQl9Ci0KLQkJZmZsdXNoKGluKTsKLQkJcmV3aW5kKGluKTsKLQotCQlpZiAoZ2V0ZW52KCJTVFVOTkVMX0RFQlVHIikpIHsKLQkJCWNoYXIgbGluZVsxMDAwXTsKLQkJCWZwcmludGYoc3RkZXJyLCAiXG5zdHVubmVsIGNvbmZpZyBjb250ZW50czpcblxuIik7Ci0JCQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikgIT0gTlVMTCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaW5lKTsKLQkJCX0KLQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCXJld2luZChpbik7Ci0JCX0KLQkJCi0JCXNwcmludGYoZmQsICIlZCIsIGZpbGVubyhpbikpOwotCQlleGVjbHAoc3R1bm5lbF9wYXRoLCBzdHVubmVsX3BhdGgsICItZmQiLCBmZCwgKGNoYXIgKikgTlVMTCk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JZnJlZShleGUpOwotCXVzbGVlcCg3NTAgKiAxMDAwKTsKLQotCXdhaXRwaWQoc3R1bm5lbF9waWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLQotCWlmIChzc2xfdmVyaWZ5ICYmIHN0cnN0cihzc2xfdmVyaWZ5LCAiL3NzbHZlcmlmeS10bXAtbG9hZC0iKSkgewotCQkvKiB0ZW1wb3JhcnkgZmlsZSAqLwotCQl1c2xlZXAoMTAwMCAqIDEwMDApOwotCQl1bmxpbmsoc3NsX3ZlcmlmeSk7Ci0JfQotCWlmICh0bXBfcGVtKSB7Ci0JCS8qIHRlbXBvcmFyeSBjZXJ0ICovCi0JCXVzbGVlcCgxNTAwICogMTAwMCk7Ci0JCXVubGluayhzdHVubmVsX3BlbSk7Ci0JfQotCi0JaWYgKGtpbGwoc3R1bm5lbF9waWQsIDApICE9IDApIHsKLQkJd2FpdHBpZChzdHVubmVsX3BpZCwgJnN0YXR1cywgV05PSEFORyk7IAotCQlzdHVubmVsX3BpZCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghIHF1aWV0KSB7Ci0JCXJmYkxvZygic3R1bm5lbCBwaWQgaXM6ICVkXG4iLCAoaW50KSBzdHVubmVsX3BpZCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLXZvaWQgc3RvcF9zdHVubmVsKHZvaWQpIHsKLQlpbnQgc3RhdHVzOwotCWlmICghIHN0dW5uZWxfcGlkKSB7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgU1NMQ01EUwotCWtpbGwoc3R1bm5lbF9waWQsIFNJR1RFUk0pOwotCXVzbGVlcCAoMTUwICogMTAwMCk7Ci0Ja2lsbChzdHVubmVsX3BpZCwgU0lHS0lMTCk7Ci0JdXNsZWVwICg1MCAqIDEwMDApOwotCXdhaXRwaWQoc3R1bm5lbF9waWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLSNlbmRpZgotCXN0dW5uZWxfcGlkID0gMDsKLX0KLQotdm9pZCBzZXR1cF9zdHVubmVsKGludCBycG9ydCwgaW50ICphcmdjLCBjaGFyICoqYXJndikgewotCWludCBpLCB4cG9ydCA9IDAsIGhwb3J0ID0gMCwgeGhwb3J0ID0gMDsKLQotCWlmICghIHJwb3J0ICYmIGFyZ2MgJiYgYXJndikgewotCQlmb3IgKGk9MDsgaTwgKmFyZ2M7IGkrKykgewotCQkJaWYgKGFyZ3ZbaV0gJiYgIXN0cmNtcChhcmd2W2ldLCAiLXJmYnBvcnQiKSkgewotCQkJCWlmIChpIDwgKmFyZ2MgLSAxKSB7Ci0JCQkJCXJwb3J0ID0gYXRvaShhcmd2W2krMV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmICghIHJwb3J0KSB7Ci0JCS8qIHdlIGRvIG91ciBvd24gYXV0b3Byb2JpbmcgdGhlbi4uLiAqLwotCQlycG9ydCA9IGZpbmRfZnJlZV9wb3J0KDU5MDAsIDU5OTkpOwotCQlpZiAoISBycG9ydCkgewotCQkJZ290byBzdHVubmVsX2ZhaWw7Ci0JCX0KLQl9Ci0KLQl4cG9ydCA9IGZpbmRfZnJlZV9wb3J0KDU5NTAsIDU5OTkpOwotCWlmICghIHhwb3J0KSB7Ci0JCWdvdG8gc3R1bm5lbF9mYWlsOyAKLQl9Ci0KLQlpZiAoaHR0cHNfcG9ydF9udW0gPiAwKSB7Ci0JCWhwb3J0ID0gaHR0cHNfcG9ydF9udW07Ci0JfQotCi0JaWYgKCEgaHBvcnQgJiYgYXJnYyAmJiBhcmd2KSB7Ci0JCWZvciAoaT0wOyBpPCAqYXJnYzsgaSsrKSB7Ci0JCQlpZiAoYXJndltpXSAmJiAhc3RyY21wKGFyZ3ZbaV0sICItaHR0cHBvcnQiKSkgewotCQkJCWlmIChpIDwgKmFyZ2MgLSAxKSB7Ci0JCQkJCWhwb3J0ID0gYXRvaShhcmd2W2krMV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmICghIGhwb3J0ICYmIGh0dHBfdHJ5X2l0KSB7Ci0JCWhwb3J0ID0gZmluZF9mcmVlX3BvcnQocnBvcnQtMTAwLCBycG9ydC0xKTsKLQkJaWYgKCEgaHBvcnQpIHsKLQkJCWdvdG8gc3R1bm5lbF9mYWlsOwotCQl9Ci0JfQotCWlmIChocG9ydCkgewotCQl4aHBvcnQgPSBmaW5kX2ZyZWVfcG9ydCg1ODUwLCA1ODk5KTsKLQkJaWYgKCEgeGhwb3J0KSB7Ci0JCQlnb3RvIHN0dW5uZWxfZmFpbDsgCi0JCX0KLQkJc3R1bm5lbF9odHRwX3BvcnQgPSBocG9ydDsKLQl9Ci0JCi0KLQlpZiAoc3RhcnRfc3R1bm5lbChycG9ydCwgeHBvcnQsIGhwb3J0LCB4aHBvcnQpKSB7Ci0JCWludCB0d2Vha2VkID0gMDsKLQkJY2hhciB0bXBbMzBdOwotCQlzcHJpbnRmKHRtcCwgIiVkIiwgeHBvcnQpOwotCQlpZiAoYXJnYyAmJiBhcmd2KSB7Ci0JCQlmb3IgKGk9MDsgaSA8ICphcmdjOyBpKyspIHsKLQkJCQlpZiAoYXJndltpXSAmJiAhc3RyY21wKGFyZ3ZbaV0sICItcmZicG9ydCIpKSB7Ci0JCQkJCWlmIChpIDwgKmFyZ2MgLSAxKSB7Ci0JCQkJCQkvKiByZXBsYWNlIG9yaWcgdmFsdWUgKi8KLQkJCQkJCWFyZ3ZbaStpXSA9IHN0cmR1cCh0bXApOyAKLQkJCQkJCXR3ZWFrZWQgPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISB0d2Vha2VkKSB7Ci0JCQkJaSA9ICphcmdjOwotCQkJCWFyZ3ZbaV0gPSBzdHJkdXAoIi1yZmJwb3J0Iik7Ci0JCQkJYXJndltpKzFdID0gc3RyZHVwKHRtcCk7Ci0JCQkJKmFyZ2MgKz0gMjsKLQkJCQlnb3RfcmZicG9ydCA9IDE7Ci0JCQkJZ290X3JmYnBvcnRfdmFsID0gYXRvaSh0bXApOwotCQkJfQotCQl9Ci0JCXN0dW5uZWxfcG9ydCA9IHJwb3J0OwotCQlzc2xfaW5pdGlhbGl6ZWQgPSAxOwotCQlyZXR1cm47Ci0JfQotCi0Jc3R1bm5lbF9mYWlsOgotCXJmYkxvZygiZmFpbGVkIHRvIHN0YXJ0IHN0dW5uZWwuXG4iKTsKLQljbGVhbl91cF9leGl0KDEpOwotfQotCi1jaGFyICpnZXRfQ2VydF9kaXIoY2hhciAqY2Rpcl9pbiwgY2hhciAqKnRtcF9pbikgewotCWNoYXIgKmNkaXIsICpob21lLCAqdG1wOwotCXN0cnVjdCBzdGF0IHNidWY7Ci0JaW50IGk7Ci0JY2hhciAqY2FzZXMxW10gPSB7Ii8udm5jIiwgIi8udm5jL2NlcnRzIiwgIi8udm5jL2NlcnRzL0NBIn07Ci0JY2hhciAqY2FzZXMyW10gPSB7IiIsICIvQ0EiLCAiL3RtcCJ9OwotCi0JaWYgKGNkaXJfaW4gIT0gTlVMTCkgewotCQljZGlyID0gY2Rpcl9pbjsKLQl9IGVsc2UgewotCQljZGlyID0gc3NsX2NlcnRzX2RpcjsKLQl9Ci0KLQlpZiAoY2RpciA9PSBOVUxMKSB7Ci0JCWhvbWUgPSBnZXRfaG9tZV9kaXIoKTsKLQkJaWYgKCEgaG9tZSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY2RpciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oaG9tZSkgKyBzdHJsZW4oIi8udm5jL2NlcnRzL0NBIikgKyAxKTsKLQkJZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCQlzcHJpbnRmKGNkaXIsICIlcyVzIiwgaG9tZSwgY2FzZXMxW2ldKTsKLQkJCWlmIChzdGF0KGNkaXIsICZzYnVmKSAhPSAwKSB7Ci0JCQkJcmZiTG9nKCJjcmVhdGluZyBkaXI6ICVzXG4iLCBjZGlyKTsKLQkJCQlpZiAobWtkaXIoY2RpciwgMDc1NSkgIT0gMCkgewotCQkJCQlyZmJMb2coImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzXG4iLCBjZGlyKTsKLQkJCQkJcmZiTG9nUGVycm9yKCJta2RpciIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCEgU19JU0RJUihzYnVmLnN0X21vZGUpKSB7Ci0JCQkJcmZiTG9nKCJub3QgYSBkaXJlY3Rvcnk6ICVzXG4iLCBjZGlyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlzcHJpbnRmKGNkaXIsICIlcyVzIiwgaG9tZSwgY2FzZXMxWzFdKTsKLQl9Ci0KLQl0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNkaXIpICsgc3RybGVuKCIvdG1wIikgKyAxKTsKLQlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJaW50IHJldDsKLQkJc3ByaW50Zih0bXAsICIlcyVzIiwgY2RpciwgY2FzZXMyW2ldKTsKLQkJaWYgKHN0YXQodG1wLCAmc2J1ZikgIT0gMCkgewotCQkJcmZiTG9nKCJjcmVhdGluZyBkaXI6ICVzXG4iLCB0bXApOwotCQkJaWYgKCEgc3RyY21wKGNhc2VzMltpXSwgIi90bXAiKSkgewotCQkJCXJldCA9IG1rZGlyKHRtcCwgMDcwMCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IG1rZGlyKHRtcCwgMDc1NSk7Ci0JCQl9Ci0JCQkJCi0JCQlpZiAocmV0ICE9IDApIHsKLQkJCQlyZmJMb2coImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzXG4iLCB0bXApOwotCQkJCXJmYkxvZ1BlcnJvcigibWtkaXIiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIGlmICghIFNfSVNESVIoc2J1Zi5zdF9tb2RlKSkgewotCQkJcmZiTG9nKCJub3QgYSBkaXJlY3Rvcnk6ICVzXG4iLCB0bXApOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0Jc3ByaW50Zih0bXAsICIlcy90bXAiLCBjZGlyKTsKLQkqdG1wX2luID0gdG1wOwotCXJldHVybiBjZGlyOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0c3Nsc2NyaXB0KGNoYXIgKmNkaXIsIGNoYXIgKm5hbWUsIGNoYXIgKnNjcmlwdCkgewotCWNoYXIgKm9wZW5zc2wgPSBmaW5kX29wZW5zc2xfYmluKCk7Ci0JY2hhciAqdG1wLCAqc2NyLCAqY2Rpcl91c2U7Ci0JRklMRSAqb3V0OwotCi0JaWYgKCEgb3BlbnNzbCB8fCBvcGVuc3NsWzBdID09ICdcMCcpIHsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAoIW5hbWUgfHwgIXNjcmlwdCkgewotCQlleGl0KDEpOwotCX0KLQotCWNkaXJfdXNlID0gZ2V0X0NlcnRfZGlyKGNkaXIsICZ0bXApOwotCWlmICghY2Rpcl91c2UgfHwgIXRtcCkgewotCQlleGl0KDEpOwotCX0KLQotCXNjciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4odG1wKSArIDEgKyBzdHJsZW4obmFtZSkgKyAzMCk7Ci0KLQlzcHJpbnRmKHNjciwgIiVzLyVzLiVkLnNoIiwgdG1wLCBuYW1lLCBnZXRwaWQoKSk7Ci0Jb3V0ID0gZm9wZW4oc2NyLCAidyIpOwotCWlmICghIG91dCkgewotCQlyZmJMb2coImNvdWxkIG5vdCBvcGVuOiAlc1xuIiwgc2NyKTsKLQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQlleGl0KDEpOwotCX0KLQlmcHJpbnRmKG91dCwgIiVzIiwgc2NyaXB0KTsKLQlmY2xvc2Uob3V0KTsKLQotCXJmYkxvZygiVXNpbmcgb3BlbnNzbDogICAlc1xuIiwgb3BlbnNzbCk7Ci0JcmZiTG9nKCJVc2luZyBjZXJ0cyBkaXI6ICVzXG4iLCBjZGlyX3VzZSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCi0Jc2V0X2VudigiQkFTRV9ESVIiLCBjZGlyX3VzZSk7Ci0Jc2V0X2VudigiT1BFTlNTTCIsIG9wZW5zc2wpOwotCi0JcmV0dXJuIHNjcjsKLX0KLQotdm9pZCBzc2xTY3JpcHRzKHZvaWQpIHsKLQlmcHJpbnRmKHN0ZG91dCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JZnByaW50ZihzdGRvdXQsICJnZW5DQSBzY3JpcHQgZm9yICctc3NsR2VuQ0EnOlxuXG4iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBnZW5DQSk7Ci0JZnByaW50ZihzdGRvdXQsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiZ2VuQ2VydCBzY3JpcHQgZm9yICctc3NsR2VuQ2VydCcsIGV0Yy46XG5cbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiJXNcbiIsIGdlbkNlcnQpOwotfQotCi12b2lkIHNzbEdlbkNBKGNoYXIgKmNkaXIpIHsKLQljaGFyICpjbWQsICpzY3IgPSBnZXRzc2xzY3JpcHQoY2RpciwgImdlbmNhIiwgZ2VuQ0EpOwotCi0JaWYgKCEgc2NyKSB7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JY21kID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKCIvYmluL3NoICIpICsgc3RybGVuKHNjcikgKyAxKTsKLQlzcHJpbnRmKGNtZCwgIi9iaW4vc2ggJXMiLCBzY3IpOwotCi0Jc3lzdGVtKGNtZCk7Ci0JdW5saW5rKHNjcik7Ci0KLQlmcmVlKGNtZCk7Ci0JZnJlZShzY3IpOwotfQotCi12b2lkIHNzbEdlbkNlcnQoY2hhciAqdHksIGNoYXIgKm5tKSB7Ci0JY2hhciAqY21kLCAqc2NyID0gZ2V0c3Nsc2NyaXB0KE5VTEwsICJnZW5jZXJ0IiwgZ2VuQ2VydCk7Ci0KLQlpZiAoISBzY3IpIHsKLQkJZXhpdCgxKTsKLQl9Ci0KLQljbWQgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oIi9iaW4vc2ggIikgKyBzdHJsZW4oc2NyKSArIDEpOwotCXNwcmludGYoY21kLCAiL2Jpbi9zaCAlcyIsIHNjcik7Ci0KLQlpZiAoISB0eSkgewotCQlzZXRfZW52KCJUWVBFIiwgIiIpOwotCX0gZWxzZSB7Ci0JCXNldF9lbnYoIlRZUEUiLCB0eSk7Ci0JfQotCWlmICghIG5tKSB7Ci0JCXNldF9lbnYoIk5BTUUiLCAiIik7Ci0JfSBlbHNlIHsKLQkJY2hhciAqcSA9IHN0cnN0cihubSwgIlNBVkUtIik7Ci0JCWlmICghc3RyY21wKG5tLCAiU0FWRSIpKSB7Ci0JCQlzZXRfZW52KCJOQU1FIiwgIiIpOwotCQl9IGVsc2UgaWYgKHEgPT0gbm0pIHsKLQkJCXEgKz0gc3RybGVuKCJTQVZFLSIpOwotCQkJc2V0X2VudigiTkFNRSIsIHEpOwotCQl9IGVsc2UgewotCQkJc2V0X2VudigiTkFNRSIsIG5tKTsKLQkJfQotCX0KLQotCXN5c3RlbShjbWQpOwotCXVubGluayhzY3IpOwotCi0JZnJlZShjbWQpOwotCWZyZWUoc2NyKTsKLX0KLQotdm9pZCBzc2xFbmNLZXkoY2hhciAqcGF0aCwgaW50IG1vZGUpIHsKLQljaGFyICpvcGVuc3NsID0gZmluZF9vcGVuc3NsX2JpbigpOwotCWNoYXIgKnNjciwgKmNlcnQgPSBOVUxMLCAqdGNhLCAqY2RpciA9IE5VTEw7Ci0JY2hhciBsaW5lWzEwMjRdLCB0bXBbXSA9ICIvdG1wL3gxMXZuYy10bXAuWFhYWFhYIjsKLQlpbnQgdG1wX2ZkLCBpbmNlcnQsIGluZm9fb25seSA9IDAsIGRlbGV0ZV9vbmx5ID0gMCwgbGlzdGxvbmcgPSAwOwotCXN0cnVjdCBzdGF0IHNidWY7Ci0JRklMRSAqZmlsZTsKLQlzdGF0aWMgaW50IGRlcHRoID0gMDsKLQotCWlmIChkZXB0aCA+IDApIHsKLQkJLyogZ2V0X3NhdmVkX3BlbSBtYXkgY2FsbCB1cyBiYWNrLiAqLwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgcGF0aCkgewotCQlyZXR1cm47Ci0JfQotCi0JZGVwdGgrKzsKLQotCWlmIChtb2RlID09IDEpIHsKLQkJaW5mb19vbmx5ID0gMTsKLQl9IGVsc2UgaWYgKG1vZGUgPT0gMikgewotCQlkZWxldGVfb25seSA9IDE7Ci0JfQotCi0JaWYgKCEgb3BlbnNzbCkgewotCQlleGl0KDEpOwotCX0KLQotCWNkaXIgPSBnZXRfQ2VydF9kaXIoTlVMTCwgJnRjYSk7Ci0JaWYgKCEgY2RpciB8fCAhIHRjYSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIENlcnQgZGlyXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAoIXN0cmNhc2VjbXAocGF0aCwgIkxMIikgfHwgIXN0cmNhc2VjbXAocGF0aCwgIkxJU1RMIikpIHsKLQkJbGlzdGxvbmcgPSAxOwotCQlwYXRoID0gIkxJU1QiOwotCX0KLQotCWlmIChzdHJzdHIocGF0aCwgIlNBVkUiKSA9PSBwYXRoKSB7Ci0JCWNoYXIgKnAgPSBnZXRfc2F2ZWRfcGVtKHBhdGgsIDApOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIHNhdmVkIHBlbSAiCi0JCQkgICAgIm1hdGNoaW5nOiAlc1xuIiwgcGF0aCk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXBhdGggPSBwOwotCi0JfSBlbHNlIGlmICghc3RyY21wKHBhdGgsICJDQSIpKSB7Ci0JCXRjYSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY2Rpcikrc3RybGVuKCIvQ0EvY2FjZXJ0LnBlbSIpKzEpOwotCQlzcHJpbnRmKHRjYSwgIiVzL0NBL2NhY2VydC5wZW0iLCBjZGlyKTsKLQkJcGF0aCA9IHRjYTsKLQotCX0gZWxzZSBpZiAoaW5mb19vbmx5ICYmICghc3RyY2FzZWNtcChwYXRoLCAiTElTVCIpIHx8Ci0JICAgICFzdHJjYXNlY21wKHBhdGgsICJMUyIpIHx8ICFzdHJjYXNlY21wKHBhdGgsICJBTEwiKSkpIHsKLQotCQlpZiAoISBwcm9ncmFtX25hbWUgfHwgc3RyY2hyKHByb2dyYW1fbmFtZSwgJyAnKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJiYWQgcHJvZ3JhbSBuYW1lLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWlmIChzdHJjaHIoY2RpciwgJ1wnJykpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiYmFkIGNlcnRkaXIgY2hhcjogJXNcbiIsIGNkaXIpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCXRjYSA9IChjaGFyICopIG1hbGxvYygyKnN0cmxlbihjZGlyKStzdHJsZW4ocHJvZ3JhbV9uYW1lKSsxMDAwKTsKLQotCQlzcHJpbnRmKHRjYSwgImZpbmQgJyVzJyB8IGVncmVwICcvKENBfHRtcHxjbGllbnRzKSR8IgotCQkgICAgIlxcLihjcnR8cGVtfGtleXxyZXEpJCcgfCBncmVwIC12IENBL25ld2NlcnRzIiwgY2Rpcik7Ci0KLQkJaWYgKCFzdHJjYXNlY21wKHBhdGgsICJBTEwiKSkgewotCQkJLyogdWdoLi4gKi8KLQkJCXN0cmNhdCh0Y2EsICIgfCBlZ3JlcCAtdiAncHJpdmF0ZS9jYWtleS5wZW18IgotCQkJICAgICIoQ0F8dG1wfGNsaWVudHMpJCcgfCB4YXJncyAtbjEgIik7Ci0JCQlzdHJjYXQodGNhLCBwcm9ncmFtX25hbWUpOwotCQkJc3RyY2F0KHRjYSwgIiAtc3NsZGlyICciKTsKLQkJCXN0cmNhdCh0Y2EsIGNkaXIpOwotCQkJc3RyY2F0KHRjYSwgIicgLXNzbENlcnRJbmZvIDI+JjEgIik7Ci0JCX0gZWxzZSBpZiAobGlzdGxvbmcpIHsKLQkJCXN0cmNhdCh0Y2EsICIgfCB4YXJncyBscyAtbGQgIik7Ci0JCX0KLQkJc3lzdGVtKHRjYSk7Ci0JCWZyZWUodGNhKTsKLQotCQlkZXB0aC0tOwotCQlyZXR1cm47Ci0KLQl9IGVsc2UgaWYgKGluZm9fb25seSAmJiAoIXN0cmNhc2VjbXAocGF0aCwgIkhBU0hPTiIpCi0JICAgIHx8ICFzdHJjYXNlY21wKHBhdGgsICJIQVNIT0ZGIikpKSB7Ci0KLQkJdG1wX2ZkID0gbWtzdGVtcCh0bXApOwotCQlpZiAodG1wX2ZkIDwgMCkgewotCQkJZXhpdCgxKTsKLQkJfQotCi0JCXdyaXRlKHRtcF9mZCwgZ2VuQ2VydCwgc3RybGVuKGdlbkNlcnQpKTsKLQkJY2xvc2UodG1wX2ZkKTsKLQotCQlzY3IgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKCIvYmluL3NoICIpICsgc3RybGVuKHRtcCkgKyAxKTsKLQkJc3ByaW50ZihzY3IsICIvYmluL3NoICVzIiwgdG1wKTsKLQotCQlzZXRfZW52KCJCQVNFX0RJUiIsIGNkaXIpOwotCQlzZXRfZW52KCJPUEVOU1NMIiwgb3BlbnNzbCk7Ci0JCXNldF9lbnYoIlRZUEUiLCAic2VydmVyIik7Ci0JCWlmICghc3RyY2FzZWNtcChwYXRoLCAiSEFTSE9OIikpIHsKLQkJCXNldF9lbnYoIkhBU0hPTiIsICIxIik7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfZW52KCJIQVNIT0ZGIiwgIjEiKTsKLQkJfQotCQlzeXN0ZW0oc2NyKTsKLQkJdW5saW5rKHRtcCk7Ci0JCWZyZWUoc2NyKTsKLQotCQlkZXB0aC0tOwotCQlyZXR1cm47Ci0JfQotCi0KLQlpZiAoc3RhdChwYXRoLCAmc2J1ZikgIT0gMCkgewotCSAgICBpZiAoc3Ryc3RyKHBhdGgsICJjbGllbnQiKSB8fCBzdHJjaHIocGF0aCwgJy8nKSA9PSBOVUxMKSB7Ci0JCWludCBpOwotCQl0Y2EgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNkaXIpICsgc3RybGVuKHBhdGgpICsgMTAwKTsKLQkJZm9yIChpID0gMTsgaSA8PSAxNTsgaSsrKSAgewotCQkJdGNhWzBdID0gJ1wwJzsKLQkJCWlmICggICAgICAgaSA9PSAxKSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy8lcyIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAyICYmIG1vZGUgPiAwKSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy8lcy5jcnQiLCBjZGlyLCBwYXRoKTsgCi0JCQl9IGVsc2UgaWYgKGkgPT0gMykgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvJXMucGVtIiwgY2RpciwgcGF0aCk7IAotCQkJfSBlbHNlIGlmIChpID09IDQgJiYgbW9kZSA+IDEpIHsKLQkJCSAgICBzcHJpbnRmKHRjYSwgIiVzLyVzLnJlcSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSA1ICYmIG1vZGUgPiAxKSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy8lcy5rZXkiLCBjZGlyLCBwYXRoKTsgCi0JCQl9IGVsc2UgaWYgKGkgPT0gNikgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvY2xpZW50cy8lcyIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSA3ICYmIG1vZGUgPiAwKSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy9jbGllbnRzLyVzLmNydCIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSA4KSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy9jbGllbnRzLyVzLnBlbSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSA5ICYmIG1vZGUgPiAxKSB7Ci0JCQkgICAgc3ByaW50Zih0Y2EsICIlcy9jbGllbnRzLyVzLnJlcSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAxMCAmJiBtb2RlID4gMSkgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvY2xpZW50cy8lcy5rZXkiLCBjZGlyLCBwYXRoKTsgCi0JCQl9IGVsc2UgaWYgKGkgPT0gMTEpIHsKLQkJCSAgICBzcHJpbnRmKHRjYSwgIiVzL3NlcnZlci0lcyIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAxMiAmJiBtb2RlID4gMCkgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvc2VydmVyLSVzLmNydCIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAxMykgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvc2VydmVyLSVzLnBlbSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAxNCAmJiBtb2RlID4gMSkgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvc2VydmVyLSVzLnJlcSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0gZWxzZSBpZiAoaSA9PSAxNSAmJiBtb2RlID4gMSkgewotCQkJICAgIHNwcmludGYodGNhLCAiJXMvc2VydmVyLSVzLmtleSIsIGNkaXIsIHBhdGgpOyAKLQkJCX0KLQkJCWlmICh0Y2FbMF0gPT0gJ1wwJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHN0YXQodGNhLCAmc2J1ZikgPT0gMCkgewotCQkJCXBhdGggPSB0Y2E7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkgICAgfQotCX0KLQotCWlmIChzdGF0KHBhdGgsICZzYnVmKSAhPSAwKSB7Ci0JCXJmYkxvZygic3NsRW5jS2V5OiAlc1xuIiwgcGF0aCk7Ci0JCXJmYkxvZ1BlcnJvcigic3RhdCIpOwotCQlleGl0KDEpOwotCX0KLQotCWlmICghIGluZm9fb25seSkgewotCQljZXJ0ID0gKGNoYXIgKikgbWFsbG9jKDIqKHNidWYuc3Rfc2l6ZSArIDEwMjQpKTsKLQkJZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7Ci0JCWlmIChmaWxlID09IE5VTEwpIHsKLQkJCXJmYkxvZygic3NsRW5jS2V5OiAlc1xuIiwgcGF0aCk7Ci0JCQlyZmJMb2dQZXJyb3IoImZvcGVuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWluY2VydCA9IDA7Ci0JCWNlcnRbMF0gPSAnXDAnOwotCQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgZmlsZSkgIT0gTlVMTCkgewotCQkJaWYgKHN0cnN0cihsaW5lLCAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tIikKLQkJCSAgICA9PSBsaW5lKSB7Ci0JCQkJaW5jZXJ0ID0gMTsKLQkJCX0KLQkJCWlmIChpbmNlcnQpIHsKLQkJCQlpZiAoc3RybGVuKGNlcnQpK3N0cmxlbihsaW5lKSA8Ci0JCQkJICAgIDIgKiAoc2l6ZV90KSBzYnVmLnN0X3NpemUpIHsKLQkJCQkJc3RyY2F0KGNlcnQsIGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzdHJzdHIobGluZSwgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iKQotCQkJICAgID09IGxpbmUpIHsKLQkJCQlpbmNlcnQgPSAwOwotCQkJfQotCQl9Ci0JCWZjbG9zZShmaWxlKTsKLQl9Ci0KLQl0bXBfZmQgPSBta3N0ZW1wKHRtcCk7Ci0JaWYgKHRtcF9mZCA8IDApIHsKLQkJZXhpdCgxKTsKLQl9Ci0KLQl3cml0ZSh0bXBfZmQsIGdlbkNlcnQsIHN0cmxlbihnZW5DZXJ0KSk7Ci0JY2xvc2UodG1wX2ZkKTsKLQotICAgICAgICBzY3IgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKCIvYmluL3NoICIpICsgc3RybGVuKHRtcCkgKyAxKTsKLQlzcHJpbnRmKHNjciwgIi9iaW4vc2ggJXMiLCB0bXApOwotCi0Jc2V0X2VudigiQkFTRV9ESVIiLCAiL25vL3N1Y2gvZGlyIik7Ci0Jc2V0X2VudigiT1BFTlNTTCIsIG9wZW5zc2wpOwotCXNldF9lbnYoIlRZUEUiLCAic2VydmVyIik7Ci0JaWYgKGluZm9fb25seSkgewotCQlzZXRfZW52KCJJTkZPX09OTFkiLCBwYXRoKTsKLQl9IGVsc2UgaWYgKGRlbGV0ZV9vbmx5KSB7Ci0JCXNldF9lbnYoIkRFTEVURV9PTkxZIiwgcGF0aCk7Ci0JfSBlbHNlIHsKLQkJc2V0X2VudigiRU5DUllQVF9PTkxZIiwgcGF0aCk7Ci0JfQotCXN5c3RlbShzY3IpOwotCXVubGluayh0bXApOwotCi0JaWYgKCEgbW9kZSAmJiBjZXJ0ICYmIGNlcnRbMF0gIT0gJ1wwJykgewotCQlpbnQgZ290X2NlcnQgPSAwOwotCQlmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKLQkJaWYgKGZpbGUgPT0gTlVMTCkgewotCQkJcmZiTG9nKCJzc2xFbmNLZXk6ICVzXG4iLCBwYXRoKTsKLQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJd2hpbGUgKGZnZXRzKGxpbmUsIDEwMjQsIGZpbGUpICE9IE5VTEwpIHsKLQkJCWlmIChzdHJzdHIobGluZSwgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLSIpCi0JCQkgICAgPT0gbGluZSkgewotCQkJCWdvdF9jZXJ0Kys7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKGxpbmUsICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIikKLQkJCSAgICA9PSBsaW5lKSB7Ci0JCQkJZ290X2NlcnQrKzsKLQkJCX0KLQkJfQotCQlmY2xvc2UoZmlsZSk7Ci0JCWlmIChnb3RfY2VydCA8IDIpIHsKLQkJCWZpbGUgPSBmb3BlbihwYXRoLCAiYSIpOwotCQkJaWYgKGZpbGUgPT0gTlVMTCkgewotCQkJCXJmYkxvZygic3NsRW5jS2V5OiAlc1xuIiwgcGF0aCk7Ci0JCQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlmcHJpbnRmKGZpbGUsICIlcyIsIGNlcnQpOwotCQkJZmNsb3NlKGZpbGUpOwotCQl9Ci0JCWZyZWUoY2VydCk7Ci0JfQotCi0JZGVwdGgtLTsKLX0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3NzbGNtZHMuaCBiL3gxMXZuYy9zc2xjbWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTEyZGYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3NzbGNtZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1NTTENNRFNfSAotI2RlZmluZSBfWDExVk5DX1NTTENNRFNfSAotCi0vKiAtLSBzc2xjbWRzLmggLS0gKi8KLQotZXh0ZXJuIHZvaWQgY2hlY2tfc3R1bm5lbCh2b2lkKTsKLWV4dGVybiBpbnQgc3RhcnRfc3R1bm5lbChpbnQgc3R1bm5lbF9wb3J0LCBpbnQgeDExdm5jX3BvcnQsIGludCBocG9ydCwgaW50IHgxMXZuY19ocG9ydCk7Ci1leHRlcm4gdm9pZCBzdG9wX3N0dW5uZWwodm9pZCk7Ci1leHRlcm4gdm9pZCBzZXR1cF9zdHVubmVsKGludCBycG9ydCwgaW50ICphcmdjLCBjaGFyICoqYXJndik7Ci1leHRlcm4gY2hhciAqZ2V0X0NlcnRfZGlyKGNoYXIgKmNkaXJfaW4sIGNoYXIgKip0bXBfaW4pOwotZXh0ZXJuIHZvaWQgc3NsU2NyaXB0cyh2b2lkKTsKLWV4dGVybiB2b2lkIHNzbEdlbkNBKGNoYXIgKmNkaXIpOwotZXh0ZXJuIHZvaWQgc3NsR2VuQ2VydChjaGFyICp0eSwgY2hhciAqbm0pOwotZXh0ZXJuIHZvaWQgc3NsRW5jS2V5KGNoYXIgKnBhdGgsIGludCBpbmZvX29ubHkpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX1NTTENNRFNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3NzbGhlbHBlci5jIGIveDExdm5jL3NzbGhlbHBlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDU3NjE1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zc2xoZWxwZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNDUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSBzc2xoZWxwZXIuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbnMuaCIKLSNpbmNsdWRlICJzc2xjbWRzLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAidXNlci5oIgotCi0jZGVmaW5lIE9QRU5TU0xfSU5FVEQgICAxCi0jZGVmaW5lIE9QRU5TU0xfVk5DICAgICAyCi0jZGVmaW5lIE9QRU5TU0xfVk5DNiAgICAzCi0jZGVmaW5lIE9QRU5TU0xfSFRUUFMgICA0Ci0jZGVmaW5lIE9QRU5TU0xfSFRUUFM2ICA1Ci0jZGVmaW5lIE9QRU5TU0xfUkVWRVJTRSA2Ci0KLSNkZWZpbmUgRE9fREggMAotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19XQUlUX0ggJiYgTElCVk5DU0VSVkVSX0hBVkVfV0FJVFBJRAotI2RlZmluZSBGT1JLX09LCi0jZW5kaWYKLSNlbmRpZgotCi1pbnQgb3BlbnNzbF9zb2NrID0gLTE7Ci1pbnQgb3BlbnNzbF9zb2NrNiA9IC0xOwotaW50IG9wZW5zc2xfcG9ydF9udW0gPSAwOwotaW50IGh0dHBzX3NvY2sgPSAtMTsKLWludCBodHRwc19zb2NrNiA9IC0xOwotcGlkX3Qgb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQgPSAwOwotY2hhciAqb3BlbnNzbF9sYXN0X2lwID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKmNlcnRyZXQgPSBOVUxMOwotc3RhdGljIGludCBjZXJ0cmV0X2ZkID0gLTE7Ci1zdGF0aWMgbW9kZV90IG9tb2RlOwotY2hhciAqY2VydHJldF9zdHIgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqZGhyZXQgPSBOVUxMOwotc3RhdGljIGludCBkaHJldF9mZCA9IC0xOwotY2hhciAqZGhyZXRfc3RyID0gTlVMTDsKLWNoYXIgKm5ld19kaF9wYXJhbXMgPSBOVUxMOwotCi12b2lkIHJhd194ZmVyKGludCBjc29jaywgaW50IHNfaW4sIGludCBzX291dCk7Ci0KLS8qIG9wZW5zc2woMSkgcGVtIHJlbGF0ZWQgZnVuY3Rpb25zOiAqLwotY2hhciAqZ2V0X3NhdmVkX3BlbShjaGFyICpzdHJpbmcsIGludCBjcmVhdGUpOwotY2hhciAqZmluZF9vcGVuc3NsX2Jpbih2b2lkKTsKLWNoYXIgKmdldF9zc2xfdmVyaWZ5X2ZpbGUoY2hhciAqc3RyX2luKTsKLWNoYXIgKmNyZWF0ZV90bXBfcGVtKGNoYXIgKnBhdGgsIGludCBwcm9tcHQpOwotCi1zdGF0aWMgY2hhciAqZ2V0X2lucHV0KGNoYXIgKnRhZywgY2hhciAqKmluKTsKLQotY2hhciAqZ2V0X3NhdmVkX3BlbShjaGFyICpzYXZlLCBpbnQgY3JlYXRlKSB7Ci0JY2hhciAqcyA9IE5VTEwsICpwYXRoLCAqY2RpciwgKnRtcDsKLQlpbnQgcHJvbXB0ID0gMCwgbGVuOwotCXN0cnVjdCBzdGF0IHNidWY7Ci0KLQlpZiAoISBzYXZlKSB7Ci0JCXJmYkxvZygiZ2V0X3NhdmVkX3BlbTogc2F2ZSBzdHJpbmcgaXMgbnVsbC5cbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCWlmIChzdHJzdHIoc2F2ZSwgIlNBVkVfUFJPTVBUIikgPT0gc2F2ZSkgewotCQlwcm9tcHQgPSAxOwotCQlzID0gc2F2ZSArIHN0cmxlbigiU0FWRV9QUk9NUFQiKTsKLQl9IGVsc2UgaWYgKHN0cnN0cihzYXZlLCAiU0FWRV9OT1BST01QVCIpID09IHNhdmUpIHsKLQkJc2V0X2VudigiR0VOQ0VSVF9OT1BST01QVCIsICIxIik7Ci0JCXMgPSBzYXZlICsgc3RybGVuKCJTQVZFX05PUFJPTVBUIik7Ci0JfSBlbHNlIGlmIChzdHJzdHIoc2F2ZSwgIlNBVkUiKSA9PSBzYXZlKSB7Ci0JCXMgPSBzYXZlICsgc3RybGVuKCJTQVZFIik7Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJnZXRfc2F2ZWRfcGVtOiBpbnZhbGlkIHNhdmUgc3RyaW5nOiAlc1xuIiwgc2F2ZSk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmIChzdHJjaHIocywgJy8nKSkgewotCQlyZmJMb2coImdldF9zYXZlZF9wZW06IGludmFsaWQgc2F2ZSBzdHJpbmc6ICVzXG4iLCBzKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQotCWNkaXIgPSBnZXRfQ2VydF9kaXIoTlVMTCwgJnRtcCk7Ci0JaWYgKCEgY2RpciB8fCAhIHRtcCkgewotCQlyZmJMb2coImdldF9zYXZlZF9wZW06IGNvdWxkIG5vdCBmaW5kIENlcnQgZGlyLlxuIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCi0JbGVuID0gc3RybGVuKGNkaXIpICsgc3RybGVuKCIvc2VydmVyLnBlbSIpICsgc3RybGVuKHMpICsgMTsKLQotCXBhdGggPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQlzcHJpbnRmKHBhdGgsICIlcy9zZXJ2ZXIlcy5wZW0iLCBjZGlyLCBzKTsKLQotCWlmIChzdGF0KHBhdGgsICZzYnVmKSAhPSAwKSB7Ci0JCWNoYXIgKm5ld19uYW1lID0gTlVMTDsKLQkJaWYgKGNyZWF0ZSkgewotCQkJaWYgKGluZXRkIHx8IG9wdHNfYmcpIHsKLQkJCQlzZXRfZW52KCJHRU5DRVJUX05PUFJPTVBUIiwgIjEiKTsKLQkJCX0KLQkJCW5ld19uYW1lID0gY3JlYXRlX3RtcF9wZW0ocGF0aCwgcHJvbXB0KTsKLQkJCWlmICghZ2V0ZW52KCJYMTFWTkNfU1NMX05PX1BBU1NQSFJBU0UiKSAmJiAhaW5ldGQgJiYgIW9wdHNfYmcpIHsKLQkJCQlzc2xFbmNLZXkobmV3X25hbWUsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdfbmFtZTsKLQl9Ci0KLQlpZiAoISBxdWlldCkgewotCQljaGFyIGxpbmVbMTAyNF07Ci0JCWludCBvbiA9IDA7Ci0JCUZJTEUgKmluID0gZm9wZW4ocGF0aCwgInIiKTsKLQkJaWYgKGluICE9IE5VTEwpIHsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXJmYkxvZygiVXNpbmcgU1NMIENlcnRpZmljYXRlOlxuIik7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgaW4pICE9IE5VTEwpIHsKLQkJCQlpZiAoc3Ryc3RyKGxpbmUsICJCRUdJTiBDRVJUSUZJQ0FURSIpKSB7Ci0JCQkJCW9uID0gMTsKLQkJCQl9Ci0JCQkJaWYgKG9uKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaW5lKTsKLQkJCQl9Ci0JCQkJaWYgKHN0cnN0cihsaW5lLCAiRU5EIENFUlRJRklDQVRFIikpIHsKLQkJCQkJb24gPSAwOwotCQkJCX0KLQkJCQlpZiAoc3Ryc3RyKGxpbmUsICJQUklWQVRFIEtFWSIpKSB7Ci0JCQkJCW9uID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQlmY2xvc2UoaW4pOwotCQl9Ci0JfQotCXJldHVybiBzdHJkdXAocGF0aCk7Ci19Ci0KLXN0YXRpYyBjaGFyICpnZXRfaW5wdXQoY2hhciAqdGFnLCBjaGFyICoqaW4pIHsKLQljaGFyIGxpbmVbMTAyNF0sICpzdHI7Ci0KLQlpZiAoISB0YWcgfHwgISBpbiB8fCAhICppbikgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIiVzOlxuICAgICBbJXNdICIsIHRhZywgKmluKTsKLQlpZiAoZmdldHMobGluZSwgMTAyNCwgc3RkaW4pID09IE5VTEwpIHsKLQkJcmZiTG9nKCJjb3VsZCBub3QgcmVhZCBzdGRpbiFcbiIpOwotCQlyZmJMb2dQZXJyb3IoImZnZXRzIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmICgoc3RyID0gc3RycmNocihsaW5lLCAnXG4nKSkgIT0gTlVMTCkgewotCQkqc3RyID0gJ1wwJzsKLQl9Ci0Jc3RyID0gbGJsYW5rcyhsaW5lKTsKLQlpZiAoIXN0cmNtcChzdHIsICIiKSkgewotCQlyZXR1cm4gKmluOwotCX0gZWxzZSB7Ci0JCXJldHVybiBzdHJkdXAobGluZSk7Ci0JfQotfQotCi1jaGFyICpmaW5kX29wZW5zc2xfYmluKHZvaWQpIHsKLQljaGFyICpwYXRoLCAqZXhlLCAqcCwgKmdwOwotCXN0cnVjdCBzdGF0IHNidWY7Ci0JaW50IGZvdW5kX29wZW5zc2wgPSAwOwotCWNoYXIgZXh0cmFbXSA9ICI6L3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3Vzci9sb2NhbC9iaW4iCi0JICAgICI6L3Vzci9sb2NhbC9zYmluOi91c3Ivc2Z3L2JpbiI7Ci0JCi0JZ3AgPSBnZXRlbnYoIlBBVEgiKTsKLQlpZiAoISBncCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9wZW5zc2woMSkgcHJvZ3JhbSBpbiBQQVRILiAobnVsbClcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwYXRoID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihncCkgKyBzdHJsZW4oZXh0cmEpICsgMSk7Ci0Jc3RyY3B5KHBhdGgsIGdwKTsKLQlzdHJjYXQocGF0aCwgZXh0cmEpOwotCi0JLyogZmluZCBvcGVuc3NsIGJpbmFyeTogKi8KLQlleGUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHBhdGgpICsgc3RybGVuKCIvb3BlbnNzbCIpICsgMSk7Ci0JcCA9IHN0cnRvayhwYXRoLCAiOiIpOwotCi0Jd2hpbGUgKHApIHsKLQkJc3ByaW50ZihleGUsICIlcy9vcGVuc3NsIiwgcCk7Ci0JCWlmIChzdGF0KGV4ZSwgJnNidWYpID09IDApIHsKLQkJCWlmICghIFNfSVNESVIoc2J1Zi5zdF9tb2RlKSkgewotCQkJCWZvdW5kX29wZW5zc2wgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIjoiKTsKLQl9Ci0JZnJlZShwYXRoKTsKLQotCWlmICghIGZvdW5kX29wZW5zc2wpIHsKLQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCBvcGVuc3NsKDEpIHByb2dyYW0gaW4gUEFUSC5cbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlBBVEg9JXNcbiIsIGdwKTsKLQkJZnByaW50ZihzdGRlcnIsICIoYWxzbyBjaGVja2VkOiAlcylcbiIsIGV4dHJhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBleGU7Ci19Ci0KLS8qIHVzZXMgL3Vzci9iaW4vb3BlbnNzbCB0byBjcmVhdGUgYSB0bXAgY2VydCAqLwotCi1jaGFyICpjcmVhdGVfdG1wX3BlbShjaGFyICpwYXRoaW4sIGludCBwcm9tcHQpIHsKLQlwaWRfdCBwaWQsIHBpZHc7Ci0JRklMRSAqaW4sICpvdXQ7Ci0JY2hhciBjbmZbXSA9ICIvdG1wL3gxMXZuYy1jbmYuWFhYWFhYIjsKLQljaGFyIHBlbVtdID0gIi90bXAveDExdm5jLXBlbS5YWFhYWFgiOwotCWNoYXIgc3RyWzgqMTAyNF0sIGxpbmVbMTAyNF0sICpleGU7Ci0JaW50IGNuZl9mZCwgcGVtX2ZkLCBzdGF0dXMsIHNob3dfY2VydCA9IDE7Ci0JY2hhciAqZGF5czsKLQljaGFyICpDLCAqTCwgKk9VLCAqTywgKkNOLCAqRU07Ci0JY2hhciB0bXBsW10gPSAKLSJbIHJlcSBdXG4iCi0icHJvbXB0ID0gbm9cbiIKLSJkZWZhdWx0X2JpdHMgPSAyMDQ4XG4iCi0iZW5jcnlwdF9rZXkgPSB5ZXNcbiIKLSJkaXN0aW5ndWlzaGVkX25hbWUgPSByZXFfZG5cbiIKLSJ4NTA5X2V4dGVuc2lvbnMgPSBjZXJ0X3R5cGVcbiIKLSJcbiIKLSJbIHJlcV9kbiBdXG4iCi0iY291bnRyeU5hbWU9JXNcbiIKLSJsb2NhbGl0eU5hbWU9JXNcbiIKLSJvcmdhbml6YXRpb25hbFVuaXROYW1lPSVzXG4iCi0ib3JnYW5pemF0aW9uTmFtZT0lc1xuIgotImNvbW1vbk5hbWU9JXNcbiIKLSJlbWFpbEFkZHJlc3M9JXNcbiIKLSJcbiIKLSJbIGNlcnRfdHlwZSBdXG4iCi0ibnNDZXJ0VHlwZSA9IHNlcnZlclxuIgotOwotCi0JQyA9IHN0cmR1cCgiQVUiKTsKLQlMID0gc3RyZHVwKFVULnN5c25hbWUgPyBVVC5zeXNuYW1lIDogInVua25vd24tb3MiKTsKLQlzbnByaW50ZihsaW5lLCAxMDI0LCAiJXMtJWYiLCBVVC5ub2RlbmFtZSA/IFVULm5vZGVuYW1lIDoKLQkgICAgInVua25vd24tbm9kZSIsIGRub3coKSk7Ci0JbGluZVsxMDI0LTFdID0gJ1wwJzsKLQotCU9VID0gc3RyZHVwKGxpbmUpOwotCU8gPSBzdHJkdXAoIngxMXZuYyIpOwotCWlmIChwYXRoaW4pIHsKLQkJc25wcmludGYobGluZSwgMTAyNCwgIngxMXZuYy1TRUxGLVNJR05FRC1DRVJULSVkIiwgZ2V0cGlkKCkpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGxpbmUsIDEwMjQsICJ4MTF2bmMtU0VMRi1TSUdORUQtVEVNUE9SQVJZLUNFUlQtJWQiLAotCQkgICAgZ2V0cGlkKCkpOwotCX0KLQlsaW5lWzEwMjQtMV0gPSAnXDAnOwotCUNOID0gc3RyZHVwKGxpbmUpOwotCUVNID0gc3RyZHVwKCJ4MTF2bmNAc2VydmVyLm5vd2hlcmUiKTsKLQotCS8qIHNzbCAqLwotCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soInNzbCIpKSB7Ci0JCXJmYkxvZygiY3JlYXRlX3RtcF9wZW06IGNhbm5vdCBydW4gZXh0ZXJuYWwgY29tbWFuZHMuXG4iKTsJCi0JCXJldHVybiBOVUxMOwotCX0KLQotCXJmYkxvZygiXG4iKTsJCi0JaWYgKHBhdGhpbikgewotCQlyZmJMb2coIkNyZWF0aW5nIGEgc2VsZi1zaWduZWQgUEVNIGNlcnRpZmljYXRlLi4uXG4iKTsJCi0JfSBlbHNlIHsKLQkJcmZiTG9nKCJDcmVhdGluZyBhIHRlbXBvcmFyeSwgc2VsZi1zaWduZWQgUEVNIGNlcnRpZmljYXRlLi4uXG4iKTsJCi0JfQotCi0JcmZiTG9nKCJcbiIpOwkKLQlyZmJMb2coIlRoaXMgd2lsbCBOT1QgcHJldmVudCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzIFVOTEVTUyB5b3VcbiIpOwkKLQlyZmJMb2coImdldCB0aGUgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gdG8gdGhlIFZOQyB2aWV3ZXJzIFNTTFxuIik7CQotCXJmYkxvZygidHVubmVsIGNvbmZpZ3VyYXRpb24gb3IgeW91IHRha2UgdGhlIGV4dHJhIHN0ZXBzIHRvIHNpZ24gaXRcbiIpOwotCXJmYkxvZygid2l0aCBhIENBIGtleS4gSG93ZXZlciwgaXQgd2lsbCBwcmV2ZW50IHBhc3NpdmUgbmV0d29ya1xuIik7Ci0JcmZiTG9nKCJzbmlmZmluZy5cbiIpOwkKLQlyZmJMb2coIlxuIik7CQotCXJmYkxvZygiVGhlIGNlcnQgaW5zaWRlIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIik7CQotCXJmYkxvZygiICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLlxuIik7CQotCXJmYkxvZygiICAgICAgICAgICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIpOwkKLQlyZmJMb2coInByaW50ZWQgYmVsb3cgbWF5IGJlIHVzZWQgb24gdGhlIFZOQyB2aWV3ZXItc2lkZSB0b1xuIik7CQotCXJmYkxvZygiYXV0aGVudGljYXRlIHRoaXMgc2VydmVyIGZvciB0aGlzIHNlc3Npb24uICBTZWUgdGhlIC1zc2xcbiIpOwotCXJmYkxvZygiaGVscCBvdXRwdXQgYW5kIHRoZSBGQVEgZm9yIGhvdyB0byBjcmVhdGUgYSBwZXJtYW5lbnRcbiIpOwotCXJmYkxvZygic2VydmVyIGNlcnRpZmljYXRlLlxuIik7CQotCXJmYkxvZygiXG4iKTsJCi0KLQlleGUgPSBmaW5kX29wZW5zc2xfYmluKCk7Ci0JaWYgKCEgZXhlKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIGNyZWF0ZSB0ZW1wbGF0ZSBmaWxlIHdpdGggb3VyIG1hZGUgdXAgc3R1ZmY6ICovCi0JaWYgKHByb21wdCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuUmVwbHkgdG8gdGhlIGZvbGxvd2luZyBwcm9tcHRzIHRvIHNldCIKLQkJICAgICIgeW91ciBDZXJ0aWZpY2F0ZSBwYXJhbWV0ZXJzLlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiKHByZXNzIEVudGVyIHRvIGFjY2VwdCB0aGUgZGVmYXVsdCBpbiBbLi4uXSwgIgotCQkgICAgIm9yIHR5cGUgaW4gdGhlIHZhbHVlIHlvdSB3YW50KVxuXG4iKTsKLQkJQyA9IGdldF9pbnB1dCgiQ291bnRyeU5hbWUiLCAmQyk7Ci0JCUwgPSBnZXRfaW5wdXQoIkxvY2FsaXR5TmFtZSIsICZMKTsKLQkJT1UgPSBnZXRfaW5wdXQoIk9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiLCAmT1UpOwotCQlPID0gZ2V0X2lucHV0KCJPcmdhbml6YXRpb25hbE5hbWUiLCAmTyk7Ci0JCUNOID0gZ2V0X2lucHV0KCJDb21tb25OYW1lIiwgJkNOKTsKLQkJRU0gPSBnZXRfaW5wdXQoIkVtYWlsQWRkcmVzcyIsICZFTSk7Ci0JfQotCXNwcmludGYoc3RyLCB0bXBsLCBDLCBMLCBPVSwgTywgQ04sIEVNKTsKLQotCWNuZl9mZCA9IG1rc3RlbXAoY25mKTsKLQlpZiAoY25mX2ZkIDwgMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGVtX2ZkID0gbWtzdGVtcChwZW0pOwotCWlmIChwZW1fZmQgPCAwKSB7Ci0JCWNsb3NlKGNuZl9mZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNsb3NlKHBlbV9mZCk7Ci0KLQl3cml0ZShjbmZfZmQsIHN0ciwgc3RybGVuKHN0cikpOwotCWNsb3NlKGNuZl9mZCk7Ci0KLQlpZiAocGF0aGluKSB7Ci0JCWRheXMgPSAiMzY1IjsKLQl9IGVsc2UgewotCQlkYXlzID0gIjMwIjsKLQl9Ci0KLSNpZm5kZWYgRk9SS19PSwotCXJmYkxvZygibm90IGNvbXBpbGVkIHdpdGggZm9yaygyKVxuIik7Ci0JY2xlYW5fdXBfZXhpdCgxKTsKLSNlbHNlCi0JLyogbWFrZSBSU0Ega2V5ICovCi0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPCAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAocGlkID09IDApIHsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCQljbG9zZShpKTsKLQkJfQotCQlleGVjbHAoZXhlLCBleGUsICJyZXEiLCAiLW5ldyIsICIteDUwOSIsICItbm9kZXMiLAotCQkgICAgIi1kYXlzIiwgZGF5cywgIi1jb25maWciLCBjbmYsICItb3V0IiwgcGVtLAotCQkgICAgIi1rZXlvdXQiLCBwZW0sIChjaGFyICopMCk7Ci0JCWV4aXQoMSk7Ci0JfQotCXBpZHcgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7IAotCWlmIChwaWR3ICE9IHBpZCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgewotCQk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0jaWYgRE9fREgKLQkvKiBtYWtlIERIIHBhcmFtZXRlcnMgKi8KLQlwaWQgPSBmb3JrKCk7Ci0JaWYgKHBpZCA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChwaWQgPT0gMCkgewotCQlpbnQgaTsKLQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCWNsb3NlKGkpOwotCQl9Ci0JCS8qIHJhdGhlciBzbG93IGF0IDEwMjQgKi8KLQkJZXhlY2xwKGV4ZSwgZXhlLCAiZGhwYXJhbSIsICItb3V0IiwgY25mLCAiNTEyIiwgKGNoYXIgKikwKTsKLQkJZXhpdCgxKTsKLQl9Ci0JcGlkdyA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsgCi0JaWYgKHBpZHcgIT0gcGlkKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwKSB7Ci0JCTsKLQl9IGVsc2UgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBhcHBlbmQgcmVzdWx0OiAqLwotCWluID0gZm9wZW4oY25mLCAiciIpOwotCWlmIChpbiA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvdXQgPSBmb3BlbihwZW0sICJhIik7Ci0JaWYgKG91dCA9PSBOVUxMKSB7Ci0JCWZjbG9zZShpbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgaW4pICE9IE5VTEwpIHsKLQkJZnByaW50ZihvdXQsICIlcyIsIGxpbmUpOwotCX0KLQlmY2xvc2UoaW4pOwotCWZjbG9zZShvdXQpOwotI2VuZGlmCi0KLSNlbmRpZgkvKiBGT1JLX09LICovCi0KLQl1bmxpbmsoY25mKTsKLQlmcmVlKGV4ZSk7Ci0KLQlpZiAocGF0aGluICE9IE5VTEwpIHsKLQkJY2hhciAqcSwgKnBhdGhjcnQgPSBzdHJkdXAocGF0aGluKTsKLQkJRklMRSAqY3J0ID0gTlVMTDsKLQkJaW50IG9uID0gMDsKLQotCQlxID0gc3RycmNocihwYXRoY3J0LCAnLycpOwotCQlpZiAocSkgewotCQkJcSA9IHN0cnN0cihxLCAiLnBlbSIpOwotCQkJaWYgKHEpIHsKLQkJCQkqKHErMSkgPSAnYyc7Ci0JCQkJKihxKzIpID0gJ3InOwotCQkJCSoocSszKSA9ICd0JzsKLQkJCQljcnQgPSBmb3BlbihwYXRoY3J0LCAidyIpOwotCQkJfQotCQl9Ci0JCWlmIChjcnQgPT0gTlVMTCkgewotCQkJcmZiTG9nKCJjb3VsZCBub3Qgb3BlbjogJXNcbiIsIHBhdGhjcnQpOwotCQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlvdXQgPSBmb3BlbihwYXRoaW4sICJ3Iik7Ci0JCWNobW9kKHBhdGhpbiwgIDA2MDApOwotCQlpZiAob3V0ID09IE5VTEwpIHsKLQkJCXJmYkxvZygiY291bGQgbm90IG9wZW46ICVzXG4iLCBwYXRoaW4pOwotCQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQkJZmNsb3NlKGNydCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCWluID0gZm9wZW4ocGVtLCAiciIpOwotCQlpZiAoaW4gPT0gTlVMTCkgewotCQkJcmZiTG9nKCJjb3VsZCBub3Qgb3BlbjogJXNcbiIsIHBlbSk7Ci0JCQlyZmJMb2dQZXJyb3IoImZvcGVuIik7Ci0JCQlmY2xvc2Uob3V0KTsKLQkJCWZjbG9zZShjcnQpOwotCQkJdW5saW5rKHBhdGhpbik7Ci0JCQl1bmxpbmsocGF0aGNydCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgaW4pICE9IE5VTEwpIHsKLQkJCWlmIChzdHJzdHIobGluZSwgIkJFR0lOIENFUlRJRklDQVRFIikpIHsKLQkJCQlvbiA9IDE7Ci0JCQl9Ci0JCQlmcHJpbnRmKG91dCwgIiVzIiwgbGluZSk7Ci0JCQlpZiAob24pIHsKLQkJCQlmcHJpbnRmKGNydCwgIiVzIiwgbGluZSk7Ci0JCQkJaWYgKCFxdWlldCkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbGluZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0cnN0cihsaW5lLCAiRU5EIENFUlRJRklDQVRFIikpIHsKLQkJCQlvbiA9IDA7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKGxpbmUsICJQUklWQVRFIEtFWSIpKSB7Ci0JCQkJb24gPSAwOwotCQkJfQotCQl9Ci0JCWZjbG9zZShpbik7Ci0JCWZjbG9zZShvdXQpOwotCQlmY2xvc2UoY3J0KTsKLQl9Ci0KLQlpZiAoc2hvd19jZXJ0KSB7Ci0JCWV4ZSA9IGZpbmRfb3BlbnNzbF9iaW4oKTsKLQkJaWYgKCFleGUpIHsKLQkJCWV4ZSA9IHN0cmR1cCgib3BlbnNzbCIpOwotCQl9Ci0JCWlmIChzdHJsZW4ocGVtKSArIHN0cmxlbihleGUpIDwgNDAwMCkgewotCQkJY2hhciBjbWRbNTAwMF07Ci0JCQlpZiAoaW5ldGQpIHsKLQkJCQlzcHJpbnRmKGNtZCwgIiVzIHg1MDkgLXRleHQgLWluICclcycgMT4mMiIsIGV4ZSwgcGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3ByaW50ZihjbWQsICIlcyB4NTA5IC10ZXh0IC1pbiAnJXMnIiwgZXhlLCBwZW0pOwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQkJc3lzdGVtKGNtZCk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCX0KLQkJZnJlZShleGUpOwotCX0KLQotCWlmIChwYXRoaW4pIHsKLQkJdW5saW5rKHBlbSk7Ci0JCXJldHVybiBzdHJkdXAocGF0aGluKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gc3RyZHVwKHBlbSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFwcGVuZGZpbGUoRklMRSAqb3V0LCBjaGFyICppbmZpbGUpIHsKLQljaGFyIGxpbmVbMTAyNF07Ci0JRklMRSAqaW47Ci0KLQlpZiAoISBpbmZpbGUpIHsKLQkJcmZiTG9nKCJhcHBlbmRmaWxlOiBudWxsIGluZmlsZS5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgb3V0KSB7Ci0JCXJmYkxvZygiYXBwZW5kZmlsZTogbnVsbCBvdXQgaGFuZGxlLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWluID0gZm9wZW4oaW5maWxlLCAiciIpOwotCi0JaWYgKGluID09IE5VTEwpIHsKLQkJcmZiTG9nKCJhcHBlbmRmaWxlOiAlc1xuIiwgaW5maWxlKTsKLQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoZmdldHMobGluZSwgMTAyNCwgaW4pICE9IE5VTEwpIHsKLQkJZnByaW50ZihvdXQsICIlcyIsIGxpbmUpOwotCX0KLQlmY2xvc2UoaW4pOwotCXJldHVybiAxOwotfQotCQotY2hhciAqZ2V0X3NzbF92ZXJpZnlfZmlsZShjaGFyICpzdHJfaW4pIHsKLQljaGFyICpwLCAqc3RyLCAqY2RpciwgKnRtcDsKLQljaGFyICp0ZmlsZSwgKnRmaWxlMjsKLQlGSUxFICpmaWxlOwotCXN0cnVjdCBzdGF0IHNidWY7Ci0JaW50IGNvdW50ID0gMCwgZmQ7Ci0KLQlpZiAoISBzdHJfaW4pIHsKLQkJcmZiTG9nKCJnZXRfc3NsX3ZlcmlmeV9maWxlOiBubyBmaWxlbmFtZVxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JaWYgKHN0YXQoc3RyX2luLCAmc2J1ZikgPT0gMCkgewotCQkvKiBhc3N1bWUgaGUga25vd3Mgd2hhdCBoZSBpcyBkb2luZy4gKi8KLQkJcmV0dXJuIHN0cl9pbjsKLQl9Ci0KLQljZGlyID0gZ2V0X0NlcnRfZGlyKE5VTEwsICZ0bXApOwotCWlmICghIGNkaXIgfHwgISB0bXApIHsKLQkJcmZiTG9nKCJnZXRfc3NsX3ZlcmlmeV9maWxlOiBpbnZhbGlkIGNlcnQtZGlyLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JdGZpbGUgID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbih0bXApICsgMTAyNCk7Ci0JdGZpbGUyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbih0bXApICsgMTAyNCk7Ci0KLQlzcHJpbnRmKHRmaWxlLCAiJXMvc3NsdmVyaWZ5LXRtcC1sb2FkLSVkLmNydHMuWFhYWFhYIiwgdG1wLCBnZXRwaWQoKSk7Ci0KLQlmZCA9IG1rc3RlbXAodGZpbGUpOwotCWlmIChmZCA8IDApIHsKLQkJcmZiTG9nKCJnZXRfc3NsX3ZlcmlmeV9maWxlOiAlc1xuIiwgdGZpbGUpOwotCQlyZmJMb2dQZXJyb3IoIm1rc3RlbXAiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JY2xvc2UoZmQpOwotCi0JZmlsZSA9IGZvcGVuKHRmaWxlLCAidyIpOwotCWNobW9kKHRmaWxlLCAwNjAwKTsKLQlpZiAoZmlsZSA9PSBOVUxMKSB7Ci0JCXJmYkxvZygiZ2V0X3NzbF92ZXJpZnlfZmlsZTogJXNcbiIsIHRmaWxlKTsKLQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQlleGl0KDEpOwotCX0KLQotCXN0ciA9IHN0cmR1cChzdHJfaW4pOwotCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCi0Jd2hpbGUgKHApIHsKLQkJaWYgKCFzdHJjbXAocCwgIkNBIikpIHsKLQkJCXNwcmludGYodGZpbGUyLCAiJXMvQ0EvY2FjZXJ0LnBlbSIsIGNkaXIpOwotCQkJaWYgKCEgYXBwZW5kZmlsZShmaWxlLCB0ZmlsZTIpKSB7Ci0JCQkJdW5saW5rKHRmaWxlKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJcmZiTG9nKCJzc2x2ZXJpZnk6IGxvYWRlZCAlc1xuIiwgdGZpbGUyKTsKLQkJCWNvdW50Kys7Ci0KLQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJjbGllbnRzIikpIHsKLQkJCURJUiAqZGlyOwotCQkJc3RydWN0IGRpcmVudCAqZHA7Ci0KLQkJCXNwcmludGYodGZpbGUyLCAiJXMvY2xpZW50cyIsIGNkaXIpOwotCQkJZGlyID0gb3BlbmRpcih0ZmlsZTIpOwotCQkJaWYgKCEgZGlyKSB7Ci0JCQkJcmZiTG9nKCJnZXRfc3NsX3ZlcmlmeV9maWxlOiAlc1xuIiwgdGZpbGUyKTsKLQkJCQlyZmJMb2dQZXJyb3IoIm9wZW5kaXIiKTsKLQkJCQl1bmxpbmsodGZpbGUpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQl3aGlsZSAoIChkcCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotCQkJCWNoYXIgKm4gPSBkcC0+ZF9uYW1lOwotCQkJCWNoYXIgKnEgPSBzdHJzdHIobiwgIi5jcnQiKTsKLQotCQkJCWlmICghIHEgfHwgc3RybGVuKHEpICE9IHN0cmxlbigiLmNydCIpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoc3RybGVuKG4pID4gNTEyKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXNwcmludGYodGZpbGUyLCAiJXMvY2xpZW50cy8lcyIsIGNkaXIsIG4pOwotCQkJCWlmICghIGFwcGVuZGZpbGUoZmlsZSwgdGZpbGUyKSkgewotCQkJCQl1bmxpbmsodGZpbGUpOwotCQkJCQlleGl0KDEpOwotCQkJCX0KLQkJCQlyZmJMb2coInNzbHZlcmlmeTogbG9hZGVkICVzXG4iLAotCQkJCSAgICB0ZmlsZTIpOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQljbG9zZWRpcihkaXIpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoc3RybGVuKHApID4gNTEyKSB7Ci0JCQkJdW5saW5rKHRmaWxlKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJc3ByaW50Zih0ZmlsZTIsICIlcy9jbGllbnRzLyVzLmNydCIsIGNkaXIsIHApOwotCQkJaWYgKHN0YXQodGZpbGUyLCAmc2J1ZikgIT0gMCkgewotCQkJCXNwcmludGYodGZpbGUyLCAiJXMvY2xpZW50cy8lcyIsIGNkaXIsIHApOwotCQkJfQotCQkJaWYgKCEgYXBwZW5kZmlsZShmaWxlLCB0ZmlsZTIpKSB7Ci0JCQkJdW5saW5rKHRmaWxlKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJcmZiTG9nKCJzc2x2ZXJpZnk6IGxvYWRlZCAlc1xuIiwgdGZpbGUyKTsKLQkJCWNvdW50Kys7Ci0JCX0KLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmY2xvc2UoZmlsZSk7Ci0JZnJlZSh0ZmlsZTIpOwotCWZyZWUoc3RyKTsKLQotCXJmYkxvZygic3NsdmVyaWZ5OiB1c2luZyAlZCBjbGllbnQgY2VydHMgaW5cbiIsIGNvdW50KTsKLQlyZmJMb2coInNzbHZlcmlmeTogJXNcbiIsIHRmaWxlKTsKLQotCXJldHVybiB0ZmlsZTsKLX0KLQotaW50IG9wZW5zc2xfcHJlc2VudCh2b2lkKTsKLXZvaWQgb3BlbnNzbF9pbml0KGludCBpc2NsaWVudCk7Ci12b2lkIG9wZW5zc2xfcG9ydChpbnQgcmVzdGFydCk7Ci12b2lkIGh0dHBzX3BvcnQoaW50IHJlc3RhcnQpOwotdm9pZCBjaGVja19vcGVuc3NsKHZvaWQpOwotdm9pZCBjaGVja19odHRwcyh2b2lkKTsKLXZvaWQgc3NsX2hlbHBlcl9waWQocGlkX3QgcGlkLCBpbnQgc29jayk7Ci12b2lkIGFjY2VwdF9vcGVuc3NsKGludCBtb2RlLCBpbnQgcHJlc29jayk7Ci0KLXN0YXRpYyB2b2lkIGxvc2VfcmFtKHZvaWQpOwotI2RlZmluZSBBQlNJWkUgMTYzODQKLQotc3RhdGljIGludCB2ZW5jcnlwdF9zZWxlY3RlZCA9IDA7Ci1zdGF0aWMgaW50IGFub250bHNfc2VsZWN0ZWQgPSAwOwotCi0vKiB0byB0ZXN0IG5vIG9wZW5zc2wgbGlic3NsICovCi0jaWYgMAotI3VuZGVmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlNTTAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9MSUJTU0wgMAotI2VuZGlmCi0KLSNpZiAhTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMCi0KLXN0YXRpYyB2b2lkIGJhZG5ld3MoY2hhciAqbmFtZSkgewotCXVzZV9vcGVuc3NsID0gMDsKLQl1c2Vfc3R1bm5lbCA9IDA7Ci0JcmZiTG9nKCIqKiAlczogbm90IGNvbXBpbGVkIHdpdGggbGlic3NsIE9wZW5TU0wgc3VwcG9ydCAqKlxuIiwgbmFtZSA/IG5hbWUgOiAiPz8/Iik7Ci0JY2xlYW5fdXBfZXhpdCgxKTsKLX0KLQotaW50IG9wZW5zc2xfcHJlc2VudCh2b2lkKSB7cmV0dXJuIDA7fQotdm9pZCBvcGVuc3NsX2luaXQoaW50IGlzY2xpZW50KSB7YmFkbmV3cygib3BlbnNzbF9pbml0Iik7fQotCi0jZGVmaW5lIFNTTF9FUlJPUl9OT05FIDAKLQotc3RhdGljIGludCBzc2xfaW5pdChpbnQgc19pbiwgaW50IHNfb3V0LCBpbnQgc2tpcF92bmNfdGxzLCBkb3VibGUgbGFzdF9odHRwcykgewotCWlmIChlbmNfc3RyICE9IE5VTEwpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWJhZG5ld3MoInNzbF9pbml0Iik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF94ZmVyKGludCBjc29jaywgaW50IHNfaW4sIGludCBzX291dCwgaW50IGlzX2h0dHBzKSB7Ci0JaWYgKGVuY19zdHIgIT0gTlVMTCAmJiAhc3RyY21wKGVuY19zdHIsICJub25lIikpIHsKLQkJdXNsZWVwKDI1MCoxMDAwKTsKLQkJcmZiTG9nKCJkb2luZyAnLWVuYyBub25lJyByYXcgdHJhbnNmZXIgKG5vIGVuY3J5cHRpb24pXG4iKTsgCi0JCXJhd194ZmVyKGNzb2NrLCBzX2luLCBzX291dCk7Ci0JfSBlbHNlIHsKLQkJYmFkbmV3cygic3NsX3hmZXIiKTsKLQl9Ci19Ci0KLSNlbHNlIAkvKiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJTU0wgKi8KLQotLyoKLSAqIFRoaXMgaXMgYmVjYXVzZSBvbiBvbGRlciBzeXN0ZW1zIGJvdGggemxpYi5oIGFuZCBzc2wuaCBkZWZpbmUKLSAqICdmcmVlX2Z1bmMnIG5vdGhpbmcgd2UgZG8gYmVsb3cgKGN1cnJlbnRseSkgaW5kdWNlcyBhbiBleHRlcm5hbAotICogZGVwZW5kZW5jeSBvbiAnZnJlZV9mdW5jJy4KLSAqLwotI2RlZmluZSBmcmVlX2Z1bmMgbXlfam9sbHlfbGl0dGxlX2ZyZWVfZnVuYwotCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotCi1zdGF0aWMgU1NMX0NUWCAqY3R4ID0gTlVMTDsKLXN0YXRpYyBSU0EgKnJzYV81MTIgPSBOVUxMOwotc3RhdGljIFJTQSAqcnNhXzEwMjQgPSBOVUxMOwotc3RhdGljIFNTTCAqc3NsID0gTlVMTDsKLXN0YXRpYyBYNTA5X1NUT1JFICpyZXZvY2F0aW9uX3N0b3JlID0gTlVMTDsKLQotCi1zdGF0aWMgdm9pZCBpbml0X3Bybmcodm9pZCk7Ci1zdGF0aWMgdm9pZCBzc2xlcnJleGl0KHZvaWQpOwotc3RhdGljIGludCAgc3NsX2luaXQoaW50IHNfaW4sIGludCBzX291dCwgaW50IHNraXBfdm5jX3RscywgZG91YmxlIGxhc3RfaHR0cHMpOwotc3RhdGljIHZvaWQgc3NsX3hmZXIoaW50IGNzb2NrLCBpbnQgc19pbiwgaW50IHNfb3V0LCBpbnQgaXNfaHR0cHMpOwotCi0jaWZuZGVmIEZPUktfT0sKLXZvaWQgb3BlbnNzbF9pbml0KGludCBpc2NsaWVudCkgewotCXJmYkxvZygib3BlbnNzbF9pbml0OiBmb3JrIGlzIG5vdCBzdXBwb3J0ZWQuIGNhbm5vdCBjcmVhdGUiCi0JICAgICIgc3NsIGhlbHBlciBwcm9jZXNzLlxuIik7Ci0JY2xlYW5fdXBfZXhpdCgxKTsKLX0KLWludCBvcGVuc3NsX3ByZXNlbnQodm9pZCkge3JldHVybiAwO30KLQotI2Vsc2UKLQotaW50IG9wZW5zc2xfcHJlc2VudCh2b2lkKSB7cmV0dXJuIDE7fQotCi1zdGF0aWMgdm9pZCBzc2xlcnJleGl0KHZvaWQpIHsKLQl1bnNpZ25lZCBsb25nIGVyciA9IEVSUl9nZXRfZXJyb3IoKTsKLQkKLQlpZiAoZXJyKSB7Ci0JCWNoYXIgc3RyWzI1Nl07Ci0JCUVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzdHIpOwotCQlmcHJpbnRmKHN0ZGVyciwgInNzbCBlcnJvcjogJXNcbiIsIHN0cik7Ci0JfQotCWNsZWFuX3VwX2V4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGVtX3Bhc3N3ZF9jYWxsYmFjayhjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLAotICAgIHZvaWQgKnVzZXJkYXRhKSB7Ci0JY2hhciAqcSwgbGluZVsxMDI0XTsKLQotCWlmICghIGJ1ZikgewotCQlleGl0KDEpOwotCX0KLQotCWZwcmludGYoc3RkZXJyLCAiXG5BIHBhc3NwaHJhc2UgaXMgbmVlZGVkIHRvIHVubG9jayBhbiBPcGVuU1NMICIKLQkgICAgInByaXZhdGUga2V5IChQRU0gZmlsZSkuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkVudGVyIHBhc3NwaHJhc2U+ICIpOwotCXN5c3RlbSgic3R0eSAtZWNobyIpOwotCWlmKGZnZXRzKGxpbmUsIDEwMjQsIHN0ZGluKSA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKLQkJc3lzdGVtKCJzdHR5IGVjaG8iKTsKLQkJZXhpdCgxKTsKLQl9Ci0Jc3lzdGVtKCJzdHR5IGVjaG8iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIlxuXG4iKTsKLQlxID0gc3RycmNocihsaW5lLCAnXG4nKTsKLQlpZiAocSkgewotCQkqcSA9ICdcMCc7Ci0JfQotCWxpbmVbMTAyNCAtIDFdID0gJ1wwJzsKLQlzdHJuY3B5KGJ1ZiwgbGluZSwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWJ1ZltzaXplIC0gMV0gPSAnXDAnOwotCi0JaWYgKDApIHJ3ZmxhZyA9IDA7CS8qIGNvbXBpbGVyIHdhcm5pbmcuICovCi0JaWYgKDApIHVzZXJkYXRhID0gMDsJLyogY29tcGlsZXIgd2FybmluZy4gKi8KLQotCXJldHVybiBzdHJsZW4oYnVmKTsKLX0KLQotLyogYmFzZWQgb24gbW9kX3NzbCAqLwotc3RhdGljIGludCBjcmxfY2FsbGJhY2soWDUwOV9TVE9SRV9DVFggKmNhbGxiYWNrX2N0eCkgewotCVg1MDlfU1RPUkVfQ1RYIHN0b3JlX2N0eDsKLQlYNTA5X09CSkVDVCBvYmo7Ci0JWDUwOV9OQU1FICpzdWJqZWN0OwotCVg1MDlfTkFNRSAqaXNzdWVyOwotCVg1MDkgKnhzOwotCVg1MDlfQ1JMICpjcmw7Ci0JWDUwOV9SRVZPS0VEICpyZXZva2VkOwotCUVWUF9QS0VZICpwdWJrZXk7Ci0JbG9uZyBzZXJpYWw7Ci0JQklPICpiaW87Ci0JaW50IGksIG4sIHJjOwotCWNoYXIgKmNwLCAqY3AyOwotCUFTTjFfVElNRSAqdDsKLQkKLQkvKiBEZXRlcm1pbmUgY2VydGlmaWNhdGUgaW5ncmVkaWVudHMgaW4gYWR2YW5jZSAqLwotCXhzICAgICAgPSBYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KGNhbGxiYWNrX2N0eCk7Ci0Jc3ViamVjdCA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4cyk7Ci0JaXNzdWVyICA9IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHhzKTsKLQkKLQkvKiBUcnkgdG8gcmV0cmlldmUgYSBDUkwgY29ycmVzcG9uZGluZyB0byB0aGUgX3N1YmplY3RfIG9mCi0JKiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBpbiBvcmRlciB0byB2ZXJpZnkgaXQncyBpbnRlZ3JpdHkuICovCi0JbWVtc2V0KChjaGFyICopJm9iaiwgMCwgc2l6ZW9mKG9iaikpOwotCVg1MDlfU1RPUkVfQ1RYX2luaXQoJnN0b3JlX2N0eCwgcmV2b2NhdGlvbl9zdG9yZSwgTlVMTCwgTlVMTCk7Ci0JcmM9WDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdCgmc3RvcmVfY3R4LCBYNTA5X0xVX0NSTCwgc3ViamVjdCwgJm9iaik7Ci0JWDUwOV9TVE9SRV9DVFhfY2xlYW51cCgmc3RvcmVfY3R4KTsKLQljcmw9b2JqLmRhdGEuY3JsOwotCi0JaWYocmM+MCAmJiBjcmwpIHsKLQkJLyogTG9nIGluZm9ybWF0aW9uIGFib3V0IENSTAotCQkgKiAoQSBsaXR0bGUgYml0IGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgQVNOLjEgYW5kIEJJT3MuLi4pICovCi0JCWJpbz1CSU9fbmV3KEJJT19zX21lbSgpKTsKLQkJQklPX3ByaW50ZihiaW8sICJsYXN0VXBkYXRlOiAiKTsKLQkJQVNOMV9VVENUSU1FX3ByaW50KGJpbywgWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoY3JsKSk7Ci0JCUJJT19wcmludGYoYmlvLCAiLCBuZXh0VXBkYXRlOiAiKTsKLQkJQVNOMV9VVENUSU1FX3ByaW50KGJpbywgWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSk7Ci0JCW49QklPX3BlbmRpbmcoYmlvKTsKLQkJY3A9bWFsbG9jKG4rMSk7Ci0JCW49QklPX3JlYWQoYmlvLCBjcCwgbik7Ci0JCWNwW25dPSdcMCc7Ci0JCUJJT19mcmVlKGJpbyk7Ci0JCWNwMj1YNTA5X05BTUVfb25lbGluZShzdWJqZWN0LCBOVUxMLCAwKTsKLQkJcmZiTG9nKCJDQSBDUkw6IElzc3VlcjogJXMsICVzXG4iLCBjcDIsIGNwKTsKLQkJT1BFTlNTTF9mcmVlKGNwMik7Ci0JCWZyZWUoY3ApOwotCi0JCS8qIFZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uIHRoaXMgQ1JMICovCi0JCXB1YmtleT1YNTA5X2dldF9wdWJrZXkoeHMpOwotCQlpZihYNTA5X0NSTF92ZXJpZnkoY3JsLCBwdWJrZXkpPD0wKSB7Ci0JCQlyZmJMb2coIkludmFsaWQgc2lnbmF0dXJlIG9uIENSTFxuIik7Ci0JCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LAotCQkJCVg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFKTsKLQkJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7Ci0JCQlpZihwdWJrZXkpCi0JCQkJRVZQX1BLRVlfZnJlZShwdWJrZXkpOwotCQkJcmV0dXJuIDA7IC8qIFJlamVjdCBjb25uZWN0aW9uICovCi0JCX0KLQkJaWYocHVia2V5KQotCQkJRVZQX1BLRVlfZnJlZShwdWJrZXkpOwotCi0JCS8qIENoZWNrIGRhdGUgb2YgQ1JMIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBleHBpcmVkICovCi0JCXQ9WDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKTsKLQkJaWYoIXQpIHsKLQkJCXJmYkxvZygiRm91bmQgQ1JMIGhhcyBpbnZhbGlkIG5leHRVcGRhdGUgZmllbGRcbiIpOwotCQkJWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGNhbGxiYWNrX2N0eCwKLQkJCQlYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRCk7Ci0JCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotCQkJcmV0dXJuIDA7IC8qIFJlamVjdCBjb25uZWN0aW9uICovCi0JCX0KLQkJaWYoWDUwOV9jbXBfY3VycmVudF90aW1lKHQpPDApIHsKLQkJCXJmYkxvZygiRm91bmQgQ1JMIGlzIGV4cGlyZWQgLSAiCi0JCQkJInJldm9raW5nIGFsbCBjZXJ0aWZpY2F0ZXMgdW50aWwgeW91IGdldCB1cGRhdGVkIENSTFxuIik7Ci0JCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY2FsbGJhY2tfY3R4LCBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRCk7Ci0JCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotCQkJcmV0dXJuIDA7IC8qIFJlamVjdCBjb25uZWN0aW9uICovCi0JCX0KLQkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKLQl9Ci0KLQkvKiBUcnkgdG8gcmV0cmlldmUgYSBDUkwgY29ycmVzcG9uZGluZyB0byB0aGUgX2lzc3Vlcl8gb2YKLQkgKiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBpbiBvcmRlciB0byBjaGVjayBmb3IgcmV2b2NhdGlvbi4gKi8KLQltZW1zZXQoKGNoYXIgKikmb2JqLCAwLCBzaXplb2Yob2JqKSk7Ci0JWDUwOV9TVE9SRV9DVFhfaW5pdCgmc3RvcmVfY3R4LCByZXZvY2F0aW9uX3N0b3JlLCBOVUxMLCBOVUxMKTsKLQlyYz1YNTA5X1NUT1JFX2dldF9ieV9zdWJqZWN0KCZzdG9yZV9jdHgsIFg1MDlfTFVfQ1JMLCBpc3N1ZXIsICZvYmopOwotCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJnN0b3JlX2N0eCk7Ci0JY3JsPW9iai5kYXRhLmNybDsKLQotCWlmKHJjPjAgJiYgY3JsKSB7Ci0JCS8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGNlcnRpZmljYXRlIGlzIHJldm9rZWQgYnkgdGhpcyBDUkwgKi8KLQkJbj1za19YNTA5X1JFVk9LRURfbnVtKFg1MDlfQ1JMX2dldF9SRVZPS0VEKGNybCkpOwotCQlmb3IoaT0wOyBpPG47IGkrKykgewotCQkJcmV2b2tlZD1za19YNTA5X1JFVk9LRURfdmFsdWUoWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKSwgaSk7Ci0JCQlpZihBU04xX0lOVEVHRVJfY21wKHJldm9rZWQtPnNlcmlhbE51bWJlciwKLQkJCQkJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHhzKSkgPT0gMCkgewotCQkJCXNlcmlhbD1BU04xX0lOVEVHRVJfZ2V0KHJldm9rZWQtPnNlcmlhbE51bWJlcik7Ci0JCQkJY3A9WDUwOV9OQU1FX29uZWxpbmUoaXNzdWVyLCBOVUxMLCAwKTsKLQkJCQlyZmJMb2coIkNlcnRpZmljYXRlIHdpdGggc2VyaWFsICVsZCAoMHglbFgpICIKLQkJCQkJInJldm9rZWQgcGVyIENSTCBmcm9tIGlzc3VlciAlc1xuIiwgc2VyaWFsLCBzZXJpYWwsIGNwKTsKLQkJCQlPUEVOU1NMX2ZyZWUoY3ApOwotCQkJCVg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjYWxsYmFja19jdHgsIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEKTsKLQkJCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotCQkJCXJldHVybiAwOyAvKiBSZWplY3QgY29ubmVjdGlvbiAqLwotCQkJfQotCQl9Ci0JCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7Ci0JfQotCi0JcmV0dXJuIDE7IC8qIEFjY2VwdCBjb25uZWN0aW9uICovCi19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmNhbGxiYWNrX2N0eCkgewotCWlmICghc3NsX3ZlcmlmeSkgewotCQlyZmJMb2coIkNSTF9jaGVjazogc2tpcHBlZC5cbiIpOwotCQlyZXR1cm4gb2s7Ci0JfQotCWlmICghc3NsX2NybCkgewotCQlyZmJMb2coIkNSTF9jaGVjazogc2tpcHBlZC5cbiIpOwotCQlyZXR1cm4gb2s7Ci0JfQotCWlmICghb2spIHsKLQkJcmZiTG9nKCJDUkxfY2hlY2s6IGNsaWVudCBjZXJ0IGlzIGFscmVhZHkgcmVqZWN0ZWQuXG4iKTsKLQkJcmV0dXJuIG9rOwotCX0KLQlpZiAocmV2b2NhdGlvbl9zdG9yZSkgewotCQlpZiAoY3JsX2NhbGxiYWNrKGNhbGxiYWNrX2N0eCkpIHsKLQkJCXJmYkxvZygiQ1JMX2NoZWNrOiBzdWNjZWVkZWQuXG4iKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJDUkxfY2hlY2s6IGRpZCBub3QgcGFzcy5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIHJmYlNlY1R5cGVBbm9uVGxzICAxOAotI2RlZmluZSByZmJTZWNUeXBlVmVuY3J5cHQgMTkKLQotI2RlZmluZSByZmJWZW5jcnlwdFBsYWluCTI1NgotI2RlZmluZSByZmJWZW5jcnlwdFRsc05vbmUJMjU3Ci0jZGVmaW5lIHJmYlZlbmNyeXB0VGxzVm5jCTI1OAotI2RlZmluZSByZmJWZW5jcnlwdFRsc1BsYWluCTI1OQotI2RlZmluZSByZmJWZW5jcnlwdFg1MDlOb25lCTI2MAotI2RlZmluZSByZmJWZW5jcnlwdFg1MDlWbmMJMjYxCi0jZGVmaW5lIHJmYlZlbmNyeXB0WDUwOVBsYWluCTI2MgotCi1zdGF0aWMgaW50IHNzbF9jbGllbnRfbW9kZSA9IDA7Ci0KLXN0YXRpYyBpbnQgc3dpdGNoX3RvX2Fub25fZGgodm9pZCk7Ci0KLXZvaWQgb3BlbnNzbF9pbml0KGludCBpc2NsaWVudCkgewotCWludCBkYiA9IDAsIHRtcF9wZW0gPSAwLCBkb19kaDsKLQlGSUxFICppbjsKLQlkb3VibGUgZHM7Ci0JbG9uZyBtb2RlOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCi0JZG9fZGggPSBET19ESDsKLQotCWlmIChlbmNfc3RyICE9IE5VTEwpIHsKLQkJaWYgKGZpcnN0KSB7Ci0JCQlpbml0X3BybmcoKTsKLQkJfQotCQlmaXJzdCA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoISBxdWlldCkgewotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygiSW5pdGlhbGl6aW5nIFNTTCAoJXMgY29ubmVjdCBtb2RlKS5cbiIsIGlzY2xpZW50ID8gImNsaWVudCI6InNlcnZlciIpOwotCX0KLQlpZiAoZmlyc3QpIHsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpXG4iKTsKLQotCQlTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7Ci0KLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlNTTF9saWJyYXJ5X2luaXQoKVxuIik7Ci0KLQkJU1NMX2xpYnJhcnlfaW5pdCgpOwotCi0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJpbml0X3BybmcoKVxuIik7Ci0KLQkJaW5pdF9wcm5nKCk7Ci0KLQkJZmlyc3QgPSAwOwotCX0KLQotCWlmIChpc2NsaWVudCkgewotCQlzc2xfY2xpZW50X21vZGUgPSAxOwotCX0gZWxzZSB7Ci0JCXNzbF9jbGllbnRfbW9kZSA9IDA7Ci0JfQotCi0JaWYgKHNzbF9jbGllbnRfbW9kZSkgewotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiU1NMdjIzX2NsaWVudF9tZXRob2QoKVxuIik7Ci0JCWN0eCA9IFNTTF9DVFhfbmV3KCBTU0x2MjNfY2xpZW50X21ldGhvZCgpICk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlNTTHYyM19zZXJ2ZXJfbWV0aG9kKClcbiIpOwotCQljdHggPSBTU0xfQ1RYX25ldyggU1NMdjIzX3NlcnZlcl9tZXRob2QoKSApOwotCX0KLQotCWlmIChjdHggPT0gTlVMTCkgewotCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogU1NMX0NUWF9uZXcgZmFpbGVkLlxuIik7CQotCQlzc2xlcnJleGl0KCk7Ci0JfQotCi0JZHMgPSBkbm93KCk7Ci0JcnNhXzUxMiA9IFJTQV9nZW5lcmF0ZV9rZXkoNTEyLCBSU0FfRjQsIE5VTEwsIE5VTEwpOwotCWlmIChyc2FfNTEyID09IE5VTEwpIHsKLQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFJTQV9nZW5lcmF0ZV9rZXkoNTEyKSBmYWlsZWQuXG4iKTsJCi0JCXNzbGVycmV4aXQoKTsKLQl9Ci0KLQlyZmJMb2coImNyZWF0ZWQgIDUxMiBiaXQgdGVtcG9yYXJ5IFJTQSBrZXk6ICUuM2ZzXG4iLCBkbm93KCkgLSBkcyk7Ci0KLQlkcyA9IGRub3coKTsKLQlyc2FfMTAyNCA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKLQlpZiAocnNhXzEwMjQgPT0gTlVMTCkgewotCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogUlNBX2dlbmVyYXRlX2tleSgxMDI0KSBmYWlsZWQuXG4iKTsJCi0JCXNzbGVycmV4aXQoKTsKLQl9Ci0KLQlyZmJMb2coImNyZWF0ZWQgMTAyNCBiaXQgdGVtcG9yYXJ5IFJTQSBrZXk6ICUuM2ZzXG4iLCBkbm93KCkgLSBkcyk7Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiU1NMX0NUWF9zZXRfdG1wX3JzYSgpXG4iKTsKLQotCWlmICghIFNTTF9DVFhfc2V0X3RtcF9yc2EoY3R4LCByc2FfMTAyNCkpIHsKLQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFNTTF9DVFhfc2V0X3RtcF9yc2EoMTAyNCkgZmFpbGVkLlxuIik7CQotCQlzc2xlcnJleGl0KCk7Ci0JfQotCi0JbW9kZSA9IDA7Ci0JbW9kZSB8PSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURTsKLQltb2RlIHw9IFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSOwotCVNTTF9DVFhfc2V0X21vZGUoY3R4LCBtb2RlKTsKLQotI2RlZmluZSBzc2xfY2FjaGUgMAotI2lmIHNzbF9jYWNoZQotCVNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjdHgsIFNTTF9TRVNTX0NBQ0hFX0JPVEgpOwotCVNTTF9DVFhfc2V0X3RpbWVvdXQoY3R4LCAzMDApOwotI2Vsc2UKLQlTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoY3R4LCBTU0xfU0VTU19DQUNIRV9PRkYpOwotCVNTTF9DVFhfc2V0X3RpbWVvdXQoY3R4LCAxKTsKLSNlbmRpZgotCi0JZHMgPSBkbm93KCk7Ci0JaWYgKCEgb3BlbnNzbF9wZW0pIHsKLQkJb3BlbnNzbF9wZW0gPSBjcmVhdGVfdG1wX3BlbShOVUxMLCAwKTsKLQkJaWYgKCEgb3BlbnNzbF9wZW0pIHsKLQkJCXJmYkxvZygib3BlbnNzbF9pbml0OiBjb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSwiCi0JCQkgICAgIiBzZWxmLXNpZ25lZCBQRU0uXG4iKTsJCi0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXRtcF9wZW0gPSAxOwotCi0JfSBlbHNlIGlmICghc3RyY21wKG9wZW5zc2xfcGVtLCAiQU5PTiIpKSB7Ci0JCWlmIChzc2xfdmVyaWZ5KSB7Ci0JCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIGNhbm5vdCIKLQkJCSAgICAiIGJlIHVzZWQgaW4gLXNzbHZlcmlmeSBtb2RlLlxuIik7CQotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlpZiAoc3NsX2NybCkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBjYW5ub3QiCi0JCQkgICAgIiBiZSB1c2VkIGluIC1zc2xDUkwgbW9kZS5cbiIpOwkKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJLyogbi5iLiBuZXcgY3R4ICovCi0JCWlmICghc3dpdGNoX3RvX2Fub25fZGgoKSkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBzZXR1cCIKLQkJCSAgICAiIGZhaWxlZC5cbiIpOwkKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHN0cnN0cihvcGVuc3NsX3BlbSwgIlNBVkUiKSA9PSBvcGVuc3NsX3BlbSkgewotCQlvcGVuc3NsX3BlbSA9IGdldF9zYXZlZF9wZW0ob3BlbnNzbF9wZW0sIDEpOwotCQlpZiAoISBvcGVuc3NsX3BlbSkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IGNvdWxkIG5vdCBjcmVhdGUgb3Igb3BlbiIKLQkJCSAgICAiIHNhdmVkIFBFTTogJXNcbiIsIG9wZW5zc2xfcGVtKTsJCi0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXRtcF9wZW0gPSAwOwotCX0KLQotCXJmYkxvZygidXNpbmcgUEVNICVzICAlLjNmc1xuIiwgb3BlbnNzbF9wZW0sIGRub3coKSAtIGRzKTsKLQotCVNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGN0eCwgcGVtX3Bhc3N3ZF9jYWxsYmFjayk7Ci0KLQlpZiAoZG9fZGgpIHsKLQkJREggKmRoOwotCQlCSU8gKmJpbzsKLQotCQlkcyA9IGRub3coKTsKLQkJaW4gPSBmb3BlbihvcGVuc3NsX3BlbSwgInIiKTsKLQkJaWYgKGluID09IE5VTEwpIHsKLQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJYmlvID0gQklPX25ld19mcChpbiwgQklPX0NMT1NFfEJJT19GUF9URVhUKTsKLQkJaWYgKCEgYmlvKSB7Ci0JCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogQklPX25ld19mcCgpIGZhaWxlZC5cbiIpOwkKLQkJCXNzbGVycmV4aXQoKTsKLQkJfQotCQlkaCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOwotCQlpZiAoZGggPT0gTlVMTCkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFBFTV9yZWFkX2Jpb19ESHBhcmFtcygpIGZhaWxlZC5cbiIpOwkKLQkJCUJJT19mcmVlKGJpbyk7Ci0JCQlzc2xlcnJleGl0KCk7Ci0JCX0KLQkJQklPX2ZyZWUoYmlvKTsKLQkJU1NMX0NUWF9zZXRfdG1wX2RoKGN0eCwgZGgpOwotCQlyZmJMb2coImxvYWRlZCBEaWZmaWUgSGVsbG1hbiAlZCBiaXRzLCAlLjNmc1xuIiwKLQkJICAgIDgqREhfc2l6ZShkaCksIGRub3coKS1kcyk7Ci0JCURIX2ZyZWUoZGgpOwotCX0KLQotCWlmIChzdHJjbXAob3BlbnNzbF9wZW0sICJBTk9OIikpIHsKLQkJaWYgKCEgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHgsIG9wZW5zc2xfcGVtKSkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKSBmYWlsZWQuXG4iKTsJCi0JCQlzc2xlcnJleGl0KCk7Ci0JCX0KLQkJaWYgKCEgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKGN0eCwgb3BlbnNzbF9wZW0sCi0JCSAgICBTU0xfRklMRVRZUEVfUEVNKSkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFNTTF9DVFhfc2V0X3RtcF9yc2EoMTAyNCkgZmFpbGVkLlxuIik7CQotCQkJc3NsZXJyZXhpdCgpOwotCQl9Ci0JCWlmICghIFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4KSkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFNTTF9DVFhfc2V0X3RtcF9yc2EoMTAyNCkgZmFpbGVkLlxuIik7CQotCQkJc3NsZXJyZXhpdCgpOwotCQl9Ci0JfQotCi0JaWYgKHRtcF9wZW0gJiYgISBnZXRlbnYoIlgxMVZOQ19LRUVQX1RNUF9QRU0iKSkgewotCQlpZiAoZ2V0ZW52KCJYMTFWTkNfU0hPV19UTVBfUEVNIikpIHsKLQkJCUZJTEUgKmluID0gZm9wZW4ob3BlbnNzbF9wZW0sICJyIik7Ci0JCQlpZiAoaW4gIT0gTlVMTCkgewotCQkJCWNoYXIgbGluZVsxMjhdOwotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQl3aGlsZSAoZmdldHMobGluZSwgMTI4LCBpbikgIT0gTlVMTCkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbGluZSk7Ci0JCQkJfQotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCQlmY2xvc2UoaW4pOwotCQkJfQotCQl9Ci0JCXVubGluayhvcGVuc3NsX3BlbSk7Ci0JCWZyZWUob3BlbnNzbF9wZW0pOwotCQlvcGVuc3NsX3BlbSA9IE5VTEw7Ci0JfQotCi0JaWYgKHNzbF9jcmwpIHsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJWDUwOV9MT09LVVAgKmxvb2t1cDsKLQotCQlpZiAoc3RhdChzc2xfY3JsLCAmc2J1ZikgIT0gMCkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IC1zc2xDUkwgZG9lcyBub3QgZXhpc3QgJXMuXG4iLAotCQkJICAgIHNzbF9jcmwgPyBzc2xfY3JsIDogIm51bGwiKTsJCi0JCQlyZmJMb2dQZXJyb3IoInN0YXQiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQotCQlyZXZvY2F0aW9uX3N0b3JlID0gWDUwOV9TVE9SRV9uZXcoKTsKLQkJaWYgKCFyZXZvY2F0aW9uX3N0b3JlKSB7Ci0JCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogWDUwOV9TVE9SRV9uZXcgZmFpbGVkLlxuIik7Ci0JCQlzc2xlcnJleGl0KCk7Ci0JCX0KLQkJaWYgKCEgU19JU0RJUihzYnVmLnN0X21vZGUpKSB7Ci0JCQlsb29rdXAgPSBYNTA5X1NUT1JFX2FkZF9sb29rdXAocmV2b2NhdGlvbl9zdG9yZSwgWDUwOV9MT09LVVBfZmlsZSgpKTsKLQkJCWlmICghbG9va3VwKSB7Ci0JCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFg1MDlfU1RPUkVfYWRkX2xvb2t1cCBmYWlsZWQuXG4iKTsKLQkJCQlzc2xlcnJleGl0KCk7Ci0JCQl9Ci0JCQlpZiAoIVg1MDlfTE9PS1VQX2xvYWRfZmlsZShsb29rdXAsIHNzbF9jcmwsIFg1MDlfRklMRVRZUEVfUEVNKSkgIHsKLQkJCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogWDUwOV9MT09LVVBfbG9hZF9maWxlIGZhaWxlZC5cbiIpOwotCQkJCXNzbGVycmV4aXQoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxvb2t1cCA9IFg1MDlfU1RPUkVfYWRkX2xvb2t1cChyZXZvY2F0aW9uX3N0b3JlLCBYNTA5X0xPT0tVUF9oYXNoX2RpcigpKTsKLQkJCWlmICghbG9va3VwKSB7Ci0JCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFg1MDlfU1RPUkVfYWRkX2xvb2t1cCBmYWlsZWQuXG4iKTsKLQkJCQlzc2xlcnJleGl0KCk7Ci0JCQl9Ci0JCQlpZiAoIVg1MDlfTE9PS1VQX2FkZF9kaXIobG9va3VwLCBzc2xfY3JsLCBYNTA5X0ZJTEVUWVBFX1BFTSkpICB7Ci0JCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFg1MDlfTE9PS1VQX2FkZF9kaXIgZmFpbGVkLlxuIik7Ci0JCQkJc3NsZXJyZXhpdCgpOwotCQkJfQotCQl9Ci0JCXJmYkxvZygibG9hZGVkIENSTCBmaWxlOiAlc1xuIiwgc3NsX2NybCk7Ci0JfQotCi0JaWYgKHNzbF92ZXJpZnkpIHsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJY2hhciAqZmlsZTsKLQkJaW50IGx2bDsKLQotCQlmaWxlID0gZ2V0X3NzbF92ZXJpZnlfZmlsZShzc2xfdmVyaWZ5KTsKLQotCQlpZiAoIWZpbGUgfHwgc3RhdChmaWxlLCAmc2J1ZikgIT0gMCkgewotCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IC1zc2x2ZXJpZnkgZG9lcyBub3QgZXhpc3QgJXMuXG4iLAotCQkJICAgIGZpbGUgPyBmaWxlIDogIm51bGwiKTsJCi0JCQlyZmJMb2dQZXJyb3IoInN0YXQiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKCEgU19JU0RJUihzYnVmLnN0X21vZGUpKSB7Ci0JCQlpZiAoISBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHgsIGZpbGUsIE5VTEwpKSB7Ci0JCQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFNTTF9DVFhfbG9hZF92ZXJpZnlfIgotCQkJCSAgICAibG9jYXRpb25zKCkgZmFpbGVkLlxuIik7CQotCQkJCXNzbGVycmV4aXQoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eCwgTlVMTCwgZmlsZSkpIHsKLQkJCQlyZmJMb2coIm9wZW5zc2xfaW5pdDogU1NMX0NUWF9sb2FkX3ZlcmlmeV8iCi0JCQkJICAgICJsb2NhdGlvbnMoKSBmYWlsZWQuXG4iKTsJCi0JCQkJc3NsZXJyZXhpdCgpOwotCQkJfQotCQl9Ci0KLQkJbHZsID0gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVHxTU0xfVkVSSUZZX1BFRVI7Ci0JCWlmIChzc2xfY3JsID09IE5VTEwpIHsKLQkJCVNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIGx2bCwgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlTU0xfQ1RYX3NldF92ZXJpZnkoY3R4LCBsdmwsIHZlcmlmeV9jYWxsYmFjayk7Ci0JCX0KLQkJaWYgKHN0cnN0cihmaWxlLCAiL3NzbHZlcmlmeS10bXAtbG9hZC0iKSkgewotCQkJLyogdGVtcG9yYXJ5IGZpbGUgKi8KLQkJCXVubGluayhmaWxlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIFNTTF9WRVJJRllfTk9ORSwgTlVMTCk7Ci0JfQotCi0JcmZiTG9nKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZXhhY3QoaW50IHNvY2ssIGNoYXIgKmJ1ZiwgaW50IGxlbikgewotCWludCBuLCBmYWlsID0gMDsKLQlpZiAoc29jayA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCW4gPSByZWFkKHNvY2ssIGJ1ZiwgbGVuKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlidWYgKz0gbjsKLQkJCWxlbiAtPSBuOwotCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJZmFpbCA9IDE7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChuIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkgewotCQkJdXNsZWVwKDEwKjEwMDApOwotCQl9IGVsc2UgaWYgKG4gPCAwICYmIGVycm5vICE9IEVJTlRSKSB7Ci0JCQlmYWlsID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChmYWlsKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotc3RhdGljIGludCB3cml0ZV9leGFjdChpbnQgc29jaywgY2hhciAqYnVmLCBpbnQgbGVuKSB7Ci0JaW50IG4sIGZhaWwgPSAwOwotCWlmIChzb2NrIDwgMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJbiA9IHdyaXRlKHNvY2ssIGJ1ZiwgbGVuKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlidWYgKz0gbjsKLQkJCWxlbiAtPSBuOwotCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJZmFpbCA9IDE7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChuIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkgewotCQkJdXNsZWVwKDEwKjEwMDApOwotCQl9IGVsc2UgaWYgKG4gPCAwICYmIGVycm5vICE9IEVJTlRSKSB7Ci0JCQlmYWlsID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChmYWlsKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotLyogWFhYIG5vdCBpbiByZmIuaDogKi8KLXZvaWQgcmZiQ2xpZW50U2VuZFN0cmluZyhyZmJDbGllbnRQdHIgY2wsIGNoYXIgKnJlYXNvbik7Ci0KLXN0YXRpYyBpbnQgZmluaXNoX2F1dGgocmZiQ2xpZW50UHRyIGNsaWVudCwgY2hhciAqdHlwZSkgewotCWludCBzZWN1cml0eV9yZXN1bHQsIHJldDsKLQotCXJldCA9IDA7Ci0KLWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19UTFNQTEFJTiIpKSBmcHJpbnRmKHN0ZGVyciwgImZpbmlzaF9hdXRoIHR5cGU9JXNcbiIsIHR5cGUpOwotCi0JaWYgKCFzdHJjbXAodHlwZSwgIk5vbmUiKSkgewotCQlzZWN1cml0eV9yZXN1bHQgPSAwOwkvKiBzdWNjZXNzICovCi0JCWlmICh3cml0ZV9leGFjdChjbGllbnQtPnNvY2ssIChjaGFyICopICZzZWN1cml0eV9yZXN1bHQsIDQpKSB7Ci0JCQlyZXQgPSAxOwotCQl9Ci0JCXJmYkxvZygiZmluaXNoX2F1dGg6IHVzaW5nIGF1dGggJ05vbmUnXG4iKTsKLQkJY2xpZW50LT5zdGF0ZSA9IFJGQl9JTklUSUFMSVNBVElPTjsKLQotCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiVm5jIikpIHsKLQkJUkFORF9ieXRlcyhjbGllbnQtPmF1dGhDaGFsbGVuZ2UsIENIQUxMRU5HRVNJWkUpOwotCQlpZiAod3JpdGVfZXhhY3QoY2xpZW50LT5zb2NrLCAoY2hhciAqKSAmY2xpZW50LT5hdXRoQ2hhbGxlbmdlLCBDSEFMTEVOR0VTSVpFKSkgewotCQkJcmV0ID0gMTsKLQkJfQotCQlyZmJMb2coImZpbmlzaF9hdXRoOiB1c2luZyBhdXRoICdWbmMnLCBzZW50IGNoYWxsZW5nZS5cbiIpOwotCQljbGllbnQtPnN0YXRlID0gUkZCX0FVVEhFTlRJQ0FUSU9OOwotCi0JfSBlbHNlIGlmICghc3RyY21wKHR5cGUsICJQbGFpbiIpKSB7Ci0JCWlmICghdW5peHB3KSB7Ci0JCQlyZmJMb2coImZpbmlzaF9hdXRoOiAqUGxhaW4gbm90IGFsbG93ZWQgb3V0c2lkZSB1bml4cHcgbW9kZS5cbiIpOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKnVuLCAqcHc7Ci0JCQlpbnQgdW5sZW4sIHB3bGVuOwotCi1pZiAoZ2V0ZW52KCJYMTFWTkNfREVCVUdfVExTUExBSU4iKSkgZnByaW50ZihzdGRlcnIsICIqUGxhaW4gYmVnaW46IG9uSG9sZD0lZCBjbGllbnQ9JXAgdW5peHB3X2NsaWVudD0lcFxuIiwgY2xpZW50LT5vbkhvbGQsICh2b2lkICopIGNsaWVudCwgKHZvaWQgKikgdW5peHB3X2NsaWVudCk7Ci0KLQkJCWlmICghcmVhZF9leGFjdChjbGllbnQtPnNvY2ssIChjaGFyICopJnVubGVuLCA0KSkgZ290byBmYWlsOwotCQkJdW5sZW4gPSBTd2FwMzJJZkxFKHVubGVuKTsKLQotaWYgKGdldGVudigiWDExVk5DX0RFQlVHX1RMU1BMQUlOIikpIGZwcmludGYoc3RkZXJyLCAidW5sZW46ICVkXG4iLCB1bmxlbik7Ci0KLQkJCWlmICghcmVhZF9leGFjdChjbGllbnQtPnNvY2ssIChjaGFyICopJnB3bGVuLCA0KSkgZ290byBmYWlsOwotCQkJcHdsZW4gPSBTd2FwMzJJZkxFKHB3bGVuKTsKLQotaWYgKGdldGVudigiWDExVk5DX0RFQlVHX1RMU1BMQUlOIikpIGZwcmludGYoc3RkZXJyLCAicHdsZW46ICVkXG4iLCBwd2xlbik7Ci0KLQkJCXVuID0gKGNoYXIgKikgbWFsbG9jKHVubGVuKzEpOwotCQkJbWVtc2V0KHVuLCAwLCB1bmxlbisxKTsKLQotCQkJcHcgPSAoY2hhciAqKSBtYWxsb2MocHdsZW4rMik7Ci0JCQltZW1zZXQocHcsIDAsIHB3bGVuKzIpOwotCi0JCQlpZiAoIXJlYWRfZXhhY3QoY2xpZW50LT5zb2NrLCB1biwgdW5sZW4pKSBnb3RvIGZhaWw7Ci0JCQlpZiAoIXJlYWRfZXhhY3QoY2xpZW50LT5zb2NrLCBwdywgcHdsZW4pKSBnb3RvIGZhaWw7Ci0KLWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19UTFNQTEFJTiIpKSBmcHJpbnRmKHN0ZGVyciwgIipQbGFpbjogJWQgJWQgJyVzJyAuLi4gXG4iLCB1bmxlbiwgcHdsZW4sIHVuKTsKLQkJCXN0cmNhdChwdywgIlxuIik7Ci0KLQkJCWlmICh1bml4cHdfdmVyaWZ5KHVuLCBwdykpIHsKLQkJCQlzZWN1cml0eV9yZXN1bHQgPSAwOwkvKiBzdWNjZXNzICovCi0JCQkJaWYgKHdyaXRlX2V4YWN0KGNsaWVudC0+c29jaywgKGNoYXIgKikgJnNlY3VyaXR5X3Jlc3VsdCwgNCkpIHsKLQkJCQkJcmV0ID0gMTsKLQkJCQkJdW5peHB3X3ZlcmlmeV9zY3JlZW4odW4sIHB3KTsKLQkJCQl9Ci0JCQkJY2xpZW50LT5vbkhvbGQgPSBGQUxTRTsKLQkJCQljbGllbnQtPnN0YXRlID0gUkZCX0lOSVRJQUxJU0FUSU9OOwotCQkJfQotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJcmZiQ2xpZW50U2VuZFN0cmluZyhjbGllbnQsICJ1bml4cHcgZmFpbGVkIik7Ci0JCQl9Ci0KLQkJCW1lbXNldCh1biwgMCwgdW5sZW4rMSk7Ci0JCQltZW1zZXQocHcsIDAsIHB3bGVuKzIpOwotCQkJZnJlZSh1bik7Ci0JCQlmcmVlKHB3KTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJmYkxvZygiZmluaXNoX2F1dGg6IHVua25vd24gc3ViLXR5cGU6ICVzXG4iLCB0eXBlKTsKLQkJcmV0ID0gMDsKLQl9Ci0KLQlmYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZmluaXNoX3ZlbmNyeXB0X2F1dGgocmZiQ2xpZW50UHRyIGNsaWVudCwgaW50IHN1YnR5cGUpIHsKLQotCWlmIChzdWJ0eXBlID09IHJmYlZlbmNyeXB0VGxzTm9uZSB8fCBzdWJ0eXBlID09IHJmYlZlbmNyeXB0WDUwOU5vbmUpIHsKLQkJcmV0dXJuIGZpbmlzaF9hdXRoKGNsaWVudCwgIk5vbmUiKTsKLQl9IGVsc2UgaWYgKHN1YnR5cGUgPT0gcmZiVmVuY3J5cHRUbHNWbmMgfHwgc3VidHlwZSA9PSByZmJWZW5jcnlwdFg1MDlWbmMpIHsKLQkJcmV0dXJuIGZpbmlzaF9hdXRoKGNsaWVudCwgIlZuYyIpOwotCX0gZWxzZSBpZiAoc3VidHlwZSA9PSByZmJWZW5jcnlwdFRsc1BsYWluIHx8IHN1YnR5cGUgPT0gcmZiVmVuY3J5cHRYNTA5UGxhaW4pIHsKLQkJcmV0dXJuIGZpbmlzaF9hdXRoKGNsaWVudCwgIlBsYWluIik7Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJmaW5pc2hfdmVuY3J5cHRfYXV0aDogdW5rbm93biBzdWItdHlwZTogJWRcbiIsIHN1YnR5cGUpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLQotc3RhdGljIGludCBhZGRfYW5vbl9kaCh2b2lkKSB7Ci0JcGlkX3QgcGlkLCBwaWR3OwotCWNoYXIgY25mW10gPSAiL3RtcC94MTF2bmMtZGguWFhYWFhYIjsKLQljaGFyICppbmZpbGUgPSBOVUxMOwotCWludCBzdGF0dXMsIGNuZl9mZDsKLQlESCAqZGg7Ci0JQklPICpiaW87Ci0JRklMRSAqaW47Ci0JZG91YmxlIGRzOwotCS8qCi0JICogVGhlc2UgYXJlIGRoIHBhcmFtZXRlcnMgKHByaW1lLCBnZW5lcmF0b3IpLCBub3QgZGgga2V5cy4KLQkgKiBFdmlkZW50bHkgaXQgaXMgb2sgZm9yIHRoZW0gdG8gYmUgcHVibGljbHkga25vd24uCi0JICogb3BlbnNzbCBkaHBhcmFtIC1vdXQgZGgub3V0IDEwMjQKLQkgKi8KLQljaGFyICpmaXhlZF9kaF9wYXJhbXMgPSAKLSItLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLVxuIgotIk1JR0hBb0dCQUwyOHc2OVpuTFlCdnA4UjJPZXF0QUltcytvYXRZMTlpQkw0V2hHSS83SDFPTW1rSmpJZStPSHNcbiIKLSJQWG9KZmU1dWNybnZubzdYbStISlpZYTFqblBHUXVXb2EvVkpLWGRWallkSlZOemF6SktNMmRhS0tjUUE0R0RjXG4iCi0ibXNGUzVEeExielVSNWp5MW4xMkszRWNidnB5RnFEWVZUSkpYbTdOdU51aVdSZnozd1RvekFnRUNcbiIKLSItLS0tLUVORCBESCBQQVJBTUVURVJTLS0tLS1cbiI7Ci0KLQlpZiAoZGhwYXJhbXNfZmlsZSAhPSBOVUxMKSB7Ci0JCWluZmlsZSA9IGRocGFyYW1zX2ZpbGU7Ci0JCXJmYkxvZygiYWRkX2Fub25fZGg6IHVzaW5nICVzXG4iLCBkaHBhcmFtc19maWxlKTsKLQkJZ290byByZWFkaW47Ci0JfQotCi0JY25mX2ZkID0gbWtzdGVtcChjbmYpOwotCWlmIChjbmZfZmQgPCAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpbmZpbGUgPSBjbmY7Ci0KLQlpZiAoY3JlYXRlX2ZyZXNoX2RocGFyYW1zKSB7Ci0KLQkJaWYgKG5ld19kaF9wYXJhbXMgIT0gTlVMTCkgewotCQkJd3JpdGUoY25mX2ZkLCBuZXdfZGhfcGFyYW1zLCBzdHJsZW4obmV3X2RoX3BhcmFtcykpOwotCQkJY2xvc2UoY25mX2ZkKTsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKmV4ZSA9IGZpbmRfb3BlbnNzbF9iaW4oKTsKLQkJCXN0cnVjdCBzdGF0IHNidWY7Ci0KLQkJCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soInNzbCIpKSB7Ci0JCQkJcmZiTG9nKCJhZGRfYW5vbl9kaDogY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcy5cbiIpOwkKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJY2xvc2UoY25mX2ZkKTsKLQkJCWlmIChleGUgPT0gTlVMTCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZHMgPSBkbm93KCk7Ci0JCQlwaWQgPSBmb3JrKCk7Ci0JCQlpZiAocGlkIDwgMCkgewotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmIChwaWQgPT0gMCkgewotCQkJCWludCBpOwotCQkJCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7Ci0JCQkJCWlmIChpID09IDIpIGNvbnRpbnVlOwotCQkJCQljbG9zZShpKTsKLQkJCQl9Ci0JCQkJLyogcmF0aGVyIHNsb3cgYXQgMTAyNCAqLwotCQkJCWV4ZWNscChleGUsIGV4ZSwgImRocGFyYW0iLCAiLW91dCIsIGNuZiwgIjEwMjQiLCAoY2hhciAqKTApOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlwaWR3ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOyAKLQkJCWlmIChwaWR3ICE9IHBpZCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgewotCQkJCTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZmJMb2coImFkZF9hbm9uX2RoOiBjcmVhdGVkIG5ldyBESCBwYXJhbXMgaW4gJS4zZiBzZWNzXG4iLCBkbm93KCkgLSBkcyk7Ci0KLQkJCWlmIChzdGF0KGNuZiwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF9zaXplID4gMCkgewotCQkJCS8qIHNhdmUgaXQgdG8gcmV1c2UgZHVyaW5nIG91ciBwcm9jZXNzJ3MgbGlmZXRpbWU6ICovCi0JCQkJaW50IGQgPSBvcGVuKGNuZiwgT19SRE9OTFkpOwotCQkJCWlmIChkID49IDApIHsKLQkJCQkJaW50IG4sIGxlbiA9IHNidWYuc3Rfc2l6ZTsKLQkJCQkJbmV3X2RoX3BhcmFtcyA9IChjaGFyICopIGNhbGxvYyhsZW4rMSwgMSk7Ci0JCQkJCW4gPSByZWFkKGQsIG5ld19kaF9wYXJhbXMsIGxlbik7Ci0JCQkJCWNsb3NlKGQpOwotCQkJCQlpZiAobiAhPSBsZW4pIHsKLQkJCQkJCWZyZWUobmV3X2RoX3BhcmFtcyk7Ci0JCQkJCQluZXdfZGhfcGFyYW1zID0gTlVMTDsKLQkJCQkJfSBlbHNlIGlmIChkaHJldCAhPSBOVUxMKSB7Ci0JCQkJCQlkID0gb3BlbihkaHJldCwgT19XUk9OTFkpOwotCQkJCQkJaWYgKGQgPj0gMCkgewotCQkJCQkJCXdyaXRlKGQsIG5ld19kaF9wYXJhbXMsIHN0cmxlbihuZXdfZGhfcGFyYW1zKSk7Ci0JCQkJCQkJY2xvc2UoZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQl3cml0ZShjbmZfZmQsIGZpeGVkX2RoX3BhcmFtcywgc3RybGVuKGZpeGVkX2RoX3BhcmFtcykpOwotCQljbG9zZShjbmZfZmQpOwotCX0KLQotCXJlYWRpbjoKLQotCWRzID0gZG5vdygpOwotCWluID0gZm9wZW4oaW5maWxlLCAiciIpOwotCi0JaWYgKGluID09IE5VTEwpIHsKLQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQl1bmxpbmsoY25mKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWJpbyA9IEJJT19uZXdfZnAoaW4sIEJJT19DTE9TRXxCSU9fRlBfVEVYVCk7Ci0JaWYgKCEgYmlvKSB7Ci0JCXJmYkxvZygib3BlbnNzbF9pbml0OiBCSU9fbmV3X2ZwKCkgZmFpbGVkLlxuIik7CQotCQl1bmxpbmsoY25mKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGRoID09IE5VTEwpIHsKLQkJcmZiTG9nKCJvcGVuc3NsX2luaXQ6IFBFTV9yZWFkX2Jpb19ESHBhcmFtcygpIGZhaWxlZC5cbiIpOwkKLQkJdW5saW5rKGNuZik7Ci0JCUJJT19mcmVlKGJpbyk7Ci0JCXJldHVybiAwOwotCX0KLQlCSU9fZnJlZShiaW8pOwotCVNTTF9DVFhfc2V0X3RtcF9kaChjdHgsIGRoKTsKLQlyZmJMb2coImxvYWRlZCBEaWZmaWUgSGVsbG1hbiAlZCBiaXRzLCAlLjNmc1xuIiwgOCpESF9zaXplKGRoKSwgZG5vdygpLWRzKTsKLQlESF9mcmVlKGRoKTsKLQotCXVubGluayhjbmYpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHN3aXRjaF90b19hbm9uX2RoKHZvaWQpIHsKLQlsb25nIG1vZGU7Ci0JCi0JcmZiTG9nKCJVc2luZyBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gbW9kZS5cbiIpOwotCXJmYkxvZygiV0FSTklORzogQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIHVzZXMgZW5jcnlwdGlvbiBidXQgaXNcbiIpOwotCXJmYkxvZygiV0FSTklORzogc3VzY2VwdGlibGUgdG8gYSBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2suXG4iKTsKLQlpZiAoc3NsX2NsaWVudF9tb2RlKSB7Ci0JCWN0eCA9IFNTTF9DVFhfbmV3KCBTU0x2MjNfY2xpZW50X21ldGhvZCgpICk7Ci0JfSBlbHNlIHsKLQkJY3R4ID0gU1NMX0NUWF9uZXcoIFNTTHYyM19zZXJ2ZXJfbWV0aG9kKCkgKTsKLQl9Ci0JaWYgKGN0eCA9PSBOVUxMKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoc3NsX2NsaWVudF9tb2RlKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCwgIkFESDpAU1RSRU5HVEgiKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFhZGRfYW5vbl9kaCgpKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCW1vZGUgPSAwOwotCW1vZGUgfD0gU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEU7Ci0JbW9kZSB8PSBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUjsKLQlTU0xfQ1RYX3NldF9tb2RlKGN0eCwgbW9kZSk7Ci0KLQlTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoY3R4LCBTU0xfU0VTU19DQUNIRV9CT1RIKTsKLQlTU0xfQ1RYX3NldF90aW1lb3V0KGN0eCwgMzAwKTsKLQlTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihjdHgsIHBlbV9wYXNzd2RfY2FsbGJhY2spOwotCVNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIFNTTF9WRVJJRllfTk9ORSwgTlVMTCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBhbm9udGxzX2RpYWxvZyhpbnQgc19pbiwgaW50IHNfb3V0KSB7Ci0KLQlpZiAoc19pbiB8fCBzX291dCkge30KLQlhbm9udGxzX3NlbGVjdGVkID0gMTsKLQotCWlmICghc3dpdGNoX3RvX2Fub25fZGgoKSkgewotCQlyZmJMb2coImFub250bHM6IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBmYWlsZWQuXG4iKTsJCi0JCXJldHVybiAwOwotCX0KLQotCS8qIGNvbnRpbnVlIHdpdGggU1NML1RMUyAqLwotCXJldHVybiAxOwotfQotCi0vKgotICogVXNpbmcgc3BlYzoKLSAqIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9xZW11LWRldmVsQG5vbmdudS5vcmcvbXNnMDg2ODEuaHRtbAotICovCi1zdGF0aWMgaW50IHZlbmNyeXB0X2RpYWxvZyhpbnQgc19pbiwgaW50IHNfb3V0KSB7Ci0JY2hhciBidWZbMjU2XSwgYnVmMlsyNTZdOwotCWludCBzdWJ0eXBlc1sxNl07Ci0JaW50IG4sIGksIGl2YWwsIG9rLCBuc3VidHlwZXMgPSAwOwotCi0JdmVuY3J5cHRfc2VsZWN0ZWQgPSAwOwotCi0JLyogc2VuZCB2ZXJzaW9uIDAuMiAqLwotCWJ1ZlswXSA9IDA7Ci0JYnVmWzFdID0gMjsKLQotCWlmICghd3JpdGVfZXhhY3Qoc19vdXQsIGJ1ZiwgMikpIHsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogcmVhZCBjbGllbnQgdmVyc2lvbiAwLjIgKi8KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JaWYgKCFyZWFkX2V4YWN0KHNfaW4sIGJ1ZiwgMikpIHsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJmYkxvZygidmVuY3J5cHQ6IHJlY2VpdmVkICVkLiVkIGNsaWVudCB2ZXJzaW9uLlxuIiwgKGludCkgYnVmWzBdLCAoaW50KSBidWZbMV0pOwotCi0JLyogY2xvc2UgMC4wICovCi0JaWYgKGJ1ZlswXSA9PSAwICYmIGJ1ZlsxXSA9PSAwKSB7Ci0JCXJmYkxvZygidmVuY3J5cHQ6IHJlY2VpdmVkIDAuMCB2ZXJzaW9uLCBjbG9zaW5nIGNvbm5lY3Rpb24uXG4iKTsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogYWNjZXB0IG9ubHkgMC4yICovCi0JaWYgKGJ1ZlswXSAhPSAwIHx8IGJ1ZlsxXSAhPSAyKSB7Ci0JCXJmYkxvZygidmVuY3J5cHQ6IHVuc3VwcG9ydGVkIFZlTkNyeXB0IHZlcnNpb24sIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpOwotCQlidWZbMF0gPSAoY2hhcikgMjU1OwotCQl3cml0ZV9leGFjdChzX291dCwgYnVmLCAxKTsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogdGVsbCB0aGVtIE9LICovCi0JYnVmWzBdID0gMDsKLQlpZiAoIXdyaXRlX2V4YWN0KHNfb3V0LCBidWYsIDEpKSB7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChnZXRlbnYoIlgxMVZOQ19FTkFCTEVfVkVOQ1JZUFRfUExBSU5fTE9HSU4iKSkgewotCQl2ZW5jcnlwdF9lbmFibGVfcGxhaW5fbG9naW4gPSBhdG9pKGdldGVudigiWDExVk5DX0VOQUJMRV9WRU5DUllQVF9QTEFJTl9MT0dJTiIpKTsKLQl9Ci0KLQkvKiBsb2FkIG91ciBsaXN0IG9mIHN1Yi10eXBlczogKi8KLQluID0gMDsKLQlpZiAoIXNzbF92ZXJpZnkgJiYgdmVuY3J5cHRfa3ggIT0gVkVOQ1JZUFRfTk9ESCkgewotCQlpZiAoc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSAhPSBOVUxMKSB7Ci0JCQlzdWJ0eXBlc1tuKytdID0gcmZiVmVuY3J5cHRUbHNWbmM7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodmVuY3J5cHRfZW5hYmxlX3BsYWluX2xvZ2luICYmIHVuaXhwdykgewotCQkJCXN1YnR5cGVzW24rK10gPSByZmJWZW5jcnlwdFRsc1BsYWluOwotCQkJfSBlbHNlIHsKLQkJCQlzdWJ0eXBlc1tuKytdID0gcmZiVmVuY3J5cHRUbHNOb25lOwotCQkJfQotCQl9Ci0JfQotCWlmICh2ZW5jcnlwdF9reCAhPSBWRU5DUllQVF9OT1g1MDkpIHsKLQkJaWYgKHNjcmVlbi0+YXV0aFBhc3N3ZERhdGEgIT0gTlVMTCkgewotCQkJc3VidHlwZXNbbisrXSA9IHJmYlZlbmNyeXB0WDUwOVZuYzsKLQkJfSBlbHNlIHsKLQkJCWlmICh2ZW5jcnlwdF9lbmFibGVfcGxhaW5fbG9naW4gJiYgdW5peHB3KSB7Ci0JCQkJc3VidHlwZXNbbisrXSA9IHJmYlZlbmNyeXB0WDUwOVBsYWluOwotCQkJfSBlbHNlIHsKLQkJCQlzdWJ0eXBlc1tuKytdID0gcmZiVmVuY3J5cHRYNTA5Tm9uZTsKLQkJCX0KLQkJfQotCX0KLQotCW5zdWJ0eXBlcyA9IG47Ci0JZm9yIChpID0gMDsgaSA8IG5zdWJ0eXBlczsgaSsrKSB7Ci0JCSgodWludDMyX3QgKilidWYpW2ldID0gU3dhcDMySWZMRShzdWJ0eXBlc1tpXSk7Ci0JfQotCi0JLyogc2VuZCBudW1iZXIgZmlyc3Q6ICovCi0JYnVmMlswXSA9IChjaGFyKSBuc3VidHlwZXM7Ci0JaWYgKCF3cml0ZV9leGFjdChzX291dCwgYnVmMiwgMSkpIHsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIGFuZCBub3cgdGhlIGxpc3Q6ICovCi0JaWYgKCF3cml0ZV9leGFjdChzX291dCwgYnVmLCA0Km4pKSB7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIHJlYWQgY2xpZW50J3Mgc2VsZWN0aW9uOiAqLwotCWlmICghcmVhZF9leGFjdChzX2luLCAoY2hhciAqKSZpdmFsLCA0KSkgewotCQljbG9zZShzX2luKTsgY2xvc2Uoc19vdXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaXZhbCA9IFN3YXAzMklmTEUoaXZhbCk7Ci0KLQkvKiB6ZXJvIG1lYW5zIG5vIGRpY2U6ICovCi0JaWYgKGl2YWwgPT0gMCkgewotCQlyZmJMb2coInZlbmNyeXB0OiBjbGllbnQgc2VsZWN0ZWQgbm8gc3ViLXR5cGUsIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpOwotCQljbG9zZShzX2luKTsgY2xvc2Uoc19vdXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBjaGVjayBpZiBoZSBzZWxlY3RlZCBhIHZhbGlkIG9uZTogKi8KLQlvayA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5zdWJ0eXBlczsgaSsrKSB7Ci0JCWlmIChpdmFsID09IHN1YnR5cGVzW2ldKSB7Ci0JCQlvayA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIW9rKSB7Ci0JCXJmYkxvZygidmVuY3J5cHQ6IGNsaWVudCBzZWxlY3RlZCBpbnZhbGlkIHN1Yi10eXBlOiAlZFxuIiwgaXZhbCk7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWNoYXIgKnN0ID0gInVua25vd24hISI7Ci0JCWlmIChpdmFsID09IHJmYlZlbmNyeXB0VGxzTm9uZSkJICBzdCA9ICJyZmJWZW5jcnlwdFRsc05vbmUiOwotCQlpZiAoaXZhbCA9PSByZmJWZW5jcnlwdFRsc1ZuYykgICAgc3QgPSAicmZiVmVuY3J5cHRUbHNWbmMiOwotCQlpZiAoaXZhbCA9PSByZmJWZW5jcnlwdFRsc1BsYWluKSAgc3QgPSAicmZiVmVuY3J5cHRUbHNQbGFpbiI7Ci0JCWlmIChpdmFsID09IHJmYlZlbmNyeXB0WDUwOU5vbmUpICBzdCA9ICJyZmJWZW5jcnlwdFg1MDlOb25lIjsKLQkJaWYgKGl2YWwgPT0gcmZiVmVuY3J5cHRYNTA5Vm5jKSAgIHN0ID0gInJmYlZlbmNyeXB0WDUwOVZuYyI7Ci0JCWlmIChpdmFsID09IHJmYlZlbmNyeXB0WDUwOVBsYWluKSBzdCA9ICJyZmJWZW5jcnlwdFg1MDlQbGFpbiI7Ci0JCXJmYkxvZygidmVuY3J5cHQ6IGNsaWVudCBzZWxlY3RlZCBzdWItdHlwZTogJWQgKCVzKVxuIiwgaXZhbCwgc3QpOwotCX0KLQotCXZlbmNyeXB0X3NlbGVjdGVkID0gaXZhbDsKLQotCS8qIG5vdCBkb2N1bWVudGVkIGluIHNwZWMsIHNlbmQgT0s6ICovCi0JYnVmWzBdID0gMTsKLQlpZiAoIXdyaXRlX2V4YWN0KHNfb3V0LCBidWYsIDEpKSB7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh2ZW5jcnlwdF9zZWxlY3RlZCA9PSByZmJWZW5jcnlwdFRsc05vbmUgfHwKLQkgICAgdmVuY3J5cHRfc2VsZWN0ZWQgPT0gcmZiVmVuY3J5cHRUbHNWbmMgIHx8Ci0JICAgIHZlbmNyeXB0X3NlbGVjdGVkID09IHJmYlZlbmNyeXB0VGxzUGxhaW4pIHsKLQkJLyogdGhlc2UgbW9kZXMgYXJlIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiAqLwotCQlpZiAoIXN3aXRjaF90b19hbm9uX2RoKCkpIHsKLQkJCXJmYkxvZygidmVuY3J5cHQ6IEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBmYWlsZWQuXG4iKTsJCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qIGNvbnRpbnVlIHdpdGggU1NML1RMUyAqLwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3ZuY190bHNfbW9kZShpbnQgc19pbiwgaW50IHNfb3V0LCBkb3VibGUgbGFzdF9odHRwcykgewotCWRvdWJsZSB3YWl0ZWQgPSAwLjAsIHdhaXRtYXggPSAxLjQsIGR0ID0gMC4wMSwgc3RhcnQgPSBkbm93KCk7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IGlucHV0ID0gMCwgaSwgbiwgb2s7Ci0JaW50IG1ham9yLCBtaW5vciwgc2VjdHlwZSA9IC0xOwotCWNoYXIgKnByb3RvID0gIlJGQiAwMDMuMDA4XG4iOwotCWNoYXIgKnN0eXBlID0gInVua25vd24iOwotCWNoYXIgYnVmWzI1Nl07Ci0JCi0JdmVuY3J5cHRfc2VsZWN0ZWQgPSAwOwotCWFub250bHNfc2VsZWN0ZWQgPSAwOwotCi0JaWYgKHZlbmNyeXB0X21vZGUgPT0gVkVOQ1JZUFRfTk9ORSAmJiBhbm9udGxzX21vZGUgPT0gQU5PTlRMU19OT05FKSB7Ci0JCS8qIG9ubHkgbm9ybWFsIFNTTCAqLwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHNzbF9jbGllbnRfbW9kZSkgewotCQlpZiAodmVuY3J5cHRfbW9kZSA9PSBWRU5DUllQVF9GT1JDRSB8fCBhbm9udGxzX21vZGUgPT0gQU5PTlRMU19GT1JDRSkgewotCQkJcmZiTG9nKCJjaGVja192bmNfdGxzX21vZGU6IFZFTkNSWVBUX0ZPUkNFL0FOT05UTFNfRk9SQ0UgaW4gY2xpZW50XG4iKTsKLQkJCXJmYkxvZygiY2hlY2tfdm5jX3Rsc19tb2RlOiBjb25uZWN0IG1vZGUuXG4iKTsKLQkJCS8qIHRoaXMgaXMgT0ssIGNvbnRpbnVlIG9uIGJlbG93IGZvciBkaWFsb2cuICovCi0JCX0gZWxzZSB7Ci0JCQkvKiBvdGhlcndpc2Ugd2UgbXVzdCBhc3N1bWUgbm9ybWFsIFNTTCAod2Ugc2VuZCBjbGllbnQgaGVsbG8pICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlpZiAoc3NsX3ZlcmlmeSAmJiB2ZW5jcnlwdF9tb2RlICE9IFZFTkNSWVBUX0ZPUkNFICYmIGFub250bHNfbW9kZSA9PSBBTk9OVExTX0ZPUkNFKSB7Ci0JCXJmYkxvZygiY2hlY2tfdm5jX3Rsc19tb2RlOiBDYW5ub3QgdXNlIEFOT05UTFNfRk9SQ0Ugd2l0aCAtc3NsdmVyaWZ5IChBbm9uIERIIG9ubHkpXG4iKTsKLQkJLyogZmFsbGJhY2sgdG8gbm9ybWFsIFNTTCAqLwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAobGFzdF9odHRwcyA+IDAuMCkgewotCQlkb3VibGUgbm93ID0gZG5vdygpOwotCQlpZiAobm93IDwgbGFzdF9odHRwcyArIDUuMCkgewotCQkJd2FpdG1heCA9IDIwLjA7Ci0JCX0gZWxzZSBpZiAobm93IDwgbGFzdF9odHRwcyArIDE1LjApIHsKLQkJCXdhaXRtYXggPSAxMC4wOwotCQl9IGVsc2UgaWYgKG5vdyA8IGxhc3RfaHR0cHMgKyAzMC4wKSB7Ci0JCQl3YWl0bWF4ID0gNS4wOwotCQl9IGVsc2UgaWYgKG5vdyA8IGxhc3RfaHR0cHMgKyA2MC4wKSB7Ci0JCQl3YWl0bWF4ID0gMi41OwotCQl9Ci0JfQotCi0Jd2hpbGUgKHdhaXRlZCA8IHdhaXRtYXgpIHsKLQkJZmRfc2V0IHJmZHM7Ci0JCUZEX1pFUk8oJnJmZHMpOwotCQlGRF9TRVQoc19pbiwgJnJmZHMpOwotCQl0di50dl9zZWMgPSAwOyAKLQkJdHYudHZfdXNlYyA9IDA7IAotCQlzZWxlY3Qoc19pbisxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQkJaWYgKEZEX0lTU0VUKHNfaW4sICZyZmRzKSkgewotCQkJaW5wdXQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJdXNsZWVwKChpbnQpICgxMDAwICogMTAwMCAqIGR0KSk7Ci0JCXdhaXRlZCArPSBkdDsKLQl9Ci0JcmZiTG9nKCJjaGVja192bmNfdGxzX21vZGU6IHdhaXRlZDogJWYgLyAlLjJmIGlucHV0OiAlc1xuIiwKLQkgICAgZG5vdygpIC0gc3RhcnQsIHdhaXRtYXgsIGlucHV0ID8gIlNTTCBIYW5kc2hha2UiIDogIihmdXR1cmUpIFJGQiBIYW5kc2hha2UiKTsKLQotCWlmIChpbnB1dCkgewotCQkvKiBnb3QgU1NMIGNsaWVudCBoZWxsbywgY2FuIG9ubHkgYXNzdW1lIG5vcm1hbCBTU0wgKi8KLQkJaWYgKHZlbmNyeXB0X21vZGUgPT0gVkVOQ1JZUFRfRk9SQ0UgfHwgYW5vbnRsc19tb2RlID09IEFOT05UTFNfRk9SQ0UpIHsKLQkJCXJmYkxvZygiY2hlY2tfdm5jX3Rsc19tb2RlOiBWRU5DUllQVF9GT1JDRS9BTk9OVExTX0ZPUkNFIHByZXZlbnRzIG5vcm1hbCBTU0xcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogc2VuZCBSRkIgMDAzLjAwOCAtLSB0aGVyZSBpcyBubyB0dXJuaW5nIGJhY2sgZnJvbSB0aGlzIHBvaW50Li4uICovCi0JaWYgKCF3cml0ZV9leGFjdChzX291dCwgcHJvdG8sIHN0cmxlbihwcm90bykpKSB7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlpZiAoIXJlYWRfZXhhY3Qoc19pbiwgYnVmLCAxMikpIHsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHNzY2FuZihidWYsICJSRkIgJTAzZC4lMDNkXG4iLCAmbWFqb3IsICZtaW5vcikgIT0gMikgewotCQlpbnQgaTsKLQkJcmZiTG9nKCJjaGVja192bmNfdGxzX21vZGU6IGFibm9ybWFsIGhhbmRzaGFrZTogJyVzJ1xuYnl0ZXM6ICIsIGJ1Zik7Ci0JCWZvciAoaT0wOyBpIDwgMTI7IGkrKykgewotCQkJZnByaW50ZihzdGRlcnIsICIlZC4iLCAodW5zaWduZWQgY2hhcikgYnVmW2ldKTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZmJMb2coImNoZWNrX3ZuY190bHNfbW9kZTogdmVyc2lvbjogJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7Ci0JaWYgKG1ham9yICE9IDMgfHwgbWlub3IgPCA4KSB7Ci0JCXJmYkxvZygiY2hlY2tfdm5jX3Rsc19tb2RlOiBpbnZhbGlkIHZlcnNpb246ICclcydcbiIsIGJ1Zik7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW4gPSAxOwotCWlmICh2ZW5jcnlwdF9tb2RlID09IFZFTkNSWVBUX0ZPUkNFKSB7Ci0JCWJ1ZltuKytdID0gcmZiU2VjVHlwZVZlbmNyeXB0OwotCX0gZWxzZSBpZiAoYW5vbnRsc19tb2RlID09IEFOT05UTFNfRk9SQ0UgJiYgIXNzbF92ZXJpZnkpIHsKLQkJYnVmW24rK10gPSByZmJTZWNUeXBlQW5vblRsczsKLQl9IGVsc2UgaWYgKHZlbmNyeXB0X21vZGUgPT0gVkVOQ1JZUFRfU09MRSkgewotCQlidWZbbisrXSA9IHJmYlNlY1R5cGVWZW5jcnlwdDsKLQl9IGVsc2UgaWYgKGFub250bHNfbW9kZSA9PSBBTk9OVExTX1NPTEUgJiYgIXNzbF92ZXJpZnkpIHsKLQkJYnVmW24rK10gPSByZmJTZWNUeXBlQW5vblRsczsKLQl9IGVsc2UgewotCQlpZiAodmVuY3J5cHRfbW9kZSA9PSBWRU5DUllQVF9TVVBQT1JUKSB7Ci0JCQlidWZbbisrXSA9IHJmYlNlY1R5cGVWZW5jcnlwdDsKLQkJfQotCQlpZiAoYW5vbnRsc19tb2RlID09IEFOT05UTFNfU1VQUE9SVCAmJiAhc3NsX3ZlcmlmeSkgewotCQkJYnVmW24rK10gPSByZmJTZWNUeXBlQW5vblRsczsKLQkJfQotCX0KLQotCW4tLTsKLQlidWZbMF0gPSAoY2hhcikgbjsKLQlpZiAoIXdyaXRlX2V4YWN0KHNfb3V0LCBidWYsIG4rMSkpIHsKLQkJY2xvc2Uoc19pbik7IGNsb3NlKHNfb3V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIndyb3RlWyVkXSAlZCAlZCAlZFxuIiwgbiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7Ci0KLQlidWZbMF0gPSAwOwotCWlmICghcmVhZF9leGFjdChzX2luLCBidWYsIDEpKSB7Ci0JCWNsb3NlKHNfaW4pOyBjbG9zZShzX291dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChidWZbMF0gPT0gcmZiU2VjVHlwZVZlbmNyeXB0KSBzdHlwZSA9ICJWZU5DcnlwdCI7Ci0JaWYgKGJ1ZlswXSA9PSByZmJTZWNUeXBlQW5vblRscykgIHN0eXBlID0gIkFOT05UTFMiOwotCi0JcmZiTG9nKCJjaGVja192bmNfdGxzX21vZGU6IHJlcGx5OiAlZCAoJXMpXG4iLCAoaW50KSBidWZbMF0sIHN0eXBlKTsKLQotCW9rID0gMDsKLQlmb3IgKGk9MTsgaSA8IG4rMTsgaSsrKSB7Ci0JCWlmIChidWZbMF0gPT0gYnVmW2ldKSB7Ci0JCQlvayA9IDE7Ci0JCX0KLQl9Ci0JaWYgKCFvaykgewotCQljaGFyICptc2cgPSAiY2hlY2tfdm5jX3Rsc19tb2RlOiBpbnZhbGlkIHNlY3VyaXR5LXR5cGUiOwotCQlpbnQgbGVuID0gc3RybGVuKG1zZyk7Ci0JCXJmYkxvZygiJXM6ICVkXG4iLCBtc2csIChpbnQpIGJ1ZlswXSk7Ci0JCSgodWludDMyX3QgKilidWYpWzBdID0gU3dhcDMySWZMRShsZW4pOwotCQl3cml0ZV9leGFjdChzX291dCwgYnVmLCA0KTsKLQkJd3JpdGVfZXhhY3Qoc19vdXQsIG1zZywgc3RybGVuKG1zZykpOwotCQljbG9zZShzX2luKTsgY2xvc2Uoc19vdXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzZWN0eXBlID0gKGludCkgYnVmWzBdOwotCi0JaWYgKHNlY3R5cGUgPT0gcmZiU2VjVHlwZVZlbmNyeXB0KSB7Ci0JCXJldHVybiB2ZW5jcnlwdF9kaWFsb2coc19pbiwgc19vdXQpOwotCX0gZWxzZSBpZiAoc2VjdHlwZSA9PSByZmJTZWNUeXBlQW5vblRscykgewotCQlyZXR1cm4gYW5vbnRsc19kaWFsb2coc19pbiwgc19vdXQpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcHJfc3NsX2luZm8oaW50IHZlcmIpIHsKLQlTU0xfQ0lQSEVSICpjOwotCVNTTF9TRVNTSU9OICpzOwotCWNoYXIgKnByb3RvID0gInVua25vd24iOwotCi0JaWYgKHZlcmIpIHt9Ci0KLQlpZiAoc3NsID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQljID0gU1NMX2dldF9jdXJyZW50X2NpcGhlcihzc2wpOwotCXMgPSBTU0xfZ2V0X3Nlc3Npb24oc3NsKTsKLQotCWlmIChzID09IE5VTEwpIHsKLQkJcHJvdG8gPSAibm9zZXNzaW9uIjsKLQl9IGVsc2UgaWYgKHMtPnNzbF92ZXJzaW9uID09IFNTTDJfVkVSU0lPTikgewotCQlwcm90byA9ICJTU0x2MiI7Ci0JfSBlbHNlIGlmIChzLT5zc2xfdmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04pIHsKLQkJcHJvdG8gPSAiU1NMdjMiOwotCX0gZWxzZSBpZiAocy0+c3NsX3ZlcnNpb24gPT0gVExTMV9WRVJTSU9OKSB7Ci0JCXByb3RvID0gIlRMU3YxIjsKLQl9Ci0JaWYgKGMgIT0gTlVMTCkgewotCQlyZmJMb2coIlNTTDogc3NsX2hlbHBlclslZF06IENpcGhlcjogJXMgJXMgUHJvdG86ICVzXG4iLCBnZXRwaWQoKSwKLQkJICAgIFNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oYyksIFNTTF9DSVBIRVJfZ2V0X25hbWUoYyksIHByb3RvKTsKLQl9IGVsc2UgewotCQlyZmJMb2coIlNTTDogc3NsX2hlbHBlclslZF06IFByb3RvOiAlc1xuIiwgZ2V0cGlkKCksCi0JCSAgICBwcm90byk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzc2xfdGltZW91dCAoaW50IHNpZykgewotCWludCBpOwotCXJmYkxvZygic2lnOiAlZCwgc3NsX2luaXRbJWRdIHRpbWVkIG91dC5cbiIsIHNpZywgZ2V0cGlkKCkpOwotCXJmYkxvZygiVG8gaW5jcmVhc2UgdGhlIFNTTCBpbml0aWFsaXphdGlvbiB0aW1lb3V0IHVzZSwgZS5nLjpcbiIpOwotCXJmYkxvZygiICAgLWVudiBTU0xfSU5JVF9USU1FT1VUPTEyMCAgICAgICAgKGZvciAxMjAgc2Vjb25kcylcbiIpOwotCWZvciAoaT0wOyBpIDwgMjU2OyBpKyspIHsKLQkJY2xvc2UoaSk7Ci0JfQotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3NsX2luaXQoaW50IHNfaW4sIGludCBzX291dCwgaW50IHNraXBfdm5jX3RscywgZG91YmxlIGxhc3RfaHR0cHMpIHsKLQl1bnNpZ25lZCBjaGFyICpzaWQgPSAodW5zaWduZWQgY2hhciAqKSAieDExdm5jIFNJRCI7Ci0JY2hhciAqbmFtZSA9IE5VTEw7Ci0JaW50IHBlZXJwb3J0ID0gMDsKLQlpbnQgZGIgPSAwLCByYywgZXJyOwotCWludCBzc29jayA9IHNfaW47Ci0JZG91YmxlIHN0YXJ0ID0gZG5vdygpOwotCWludCB0aW1lb3V0ID0gMjA7Ci0KLQlpZiAoZW5jX3N0ciAhPSBOVUxMKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZ2V0ZW52KCJTU0xfREVCVUciKSkgewotCQlkYiA9IGF0b2koZ2V0ZW52KCJTU0xfREVCVUciKSk7Ci0JfQotCXVzbGVlcCgxMDAgKiAxMDAwKTsKLQlpZiAoZ2V0ZW52KCJTU0xfSU5JVF9USU1FT1VUIikpIHsKLQkJdGltZW91dCA9IGF0b2koZ2V0ZW52KCJTU0xfSU5JVF9USU1FT1VUIikpOwotCX0gZWxzZSBpZiAoY2xpZW50X2Nvbm5lY3QgIT0gTlVMTCAmJiBzdHJzdHIoY2xpZW50X2Nvbm5lY3QsICJyZXBlYXRlciIpKSB7Ci0JCXJmYkxvZygiU1NMOiBzc2xfaW5pdFslZF06IGRldGVjdGVkICdyZXBlYXRlcicgaW4gY29ubmVjdCBzdHJpbmcuXG4iLCBnZXRwaWQoKSk7Ci0JCXJmYkxvZygiU1NMOiBzZXR0aW5nIHRpbWVvdXQgdG8gMSBob3VyOiAtZW52IFNTTF9JTklUX1RJTUVPVVQ9MzYwMFxuIik7Ci0JCXJmYkxvZygiU1NMOiB1c2UgdGhhdCBvcHRpb24gdG8gc2V0IGEgZGlmZmVyZW50IHRpbWVvdXQgdmFsdWUsXG4iKTsKLQkJcmZiTG9nKCJTU0w6IGhvd2V2ZXIgbm90ZSB0aGF0IHdpdGggV2luZG93cyBVbHRyYVZOQyByZXBlYXRlciBpdFxuIik7Ci0JCXJmYkxvZygiU1NMOiBtYXkgdGltZW91dCBiZWZvcmUgeW91ciBzZXR0aW5nIGR1ZSB0byBvdGhlciByZWFzb25zLlxuIik7Ci0JCXRpbWVvdXQgPSAzNjAwOwotCX0KLQotCWlmIChza2lwX3ZuY190bHMpIHsKLQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBIVFRQUyBtb2RlLCBza2lwcGluZyBjaGVja192bmNfdGxzX21vZGUoKVxuIiwKLQkJICAgIGdldHBpZCgpKTsKLQl9IGVsc2UgaWYgKCFjaGVja192bmNfdGxzX21vZGUoc19pbiwgc19vdXQsIGxhc3RfaHR0cHMpKSB7Ci0JCXJldHVybiAwOwotCX0KLQlyZmJMb2coIlNTTDogc3NsX2luaXRbJWRdOiAlZC8lZCBpbml0aWFsaXphdGlvbiB0aW1lb3V0OiAlZCBzZWNzLlxuIiwKLQkgICAgZ2V0cGlkKCksIHNfaW4sIHNfb3V0LCB0aW1lb3V0KTsKLQotCXNzbCA9IFNTTF9uZXcoY3R4KTsKLQlpZiAoc3NsID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJTU0xfbmV3IGZhaWxlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInNzbF9pbml0OiAxXG4iKTsKLQotCVNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNzbCwgc2lkLCBzdHJsZW4oKGNoYXIgKilzaWQpKTsKLQotCWlmIChzX2luID09IHNfb3V0KSB7Ci0JCWlmICghIFNTTF9zZXRfZmQoc3NsLCBzc29jaykpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiU1NMX3NldF9mZCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoISBTU0xfc2V0X3JmZChzc2wsIHNfaW4pKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlNTTF9zZXRfcmZkIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoISBTU0xfc2V0X3dmZChzc2wsIHNfb3V0KSkgewotCQkJZnByaW50ZihzdGRlcnIsICJTU0xfc2V0X3dmZCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJzc2xfaW5pdDogMlxuIik7Ci0KLQlpZiAoc3NsX2NsaWVudF9tb2RlKSB7Ci0JCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShzc2wpOwotCX0gZWxzZSB7Ci0JCVNTTF9zZXRfYWNjZXB0X3N0YXRlKHNzbCk7Ci0JfQotCi0JaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJzc2xfaW5pdDogM1xuIik7Ci0KLQluYW1lID0gZ2V0X3JlbW90ZV9ob3N0KHNzb2NrKTsKLQlwZWVycG9ydCA9IGdldF9yZW1vdGVfcG9ydChzc29jayk7Ci0KLQlpZiAoIXN0cmNtcChuYW1lLCAiMC4wLjAuMCIpICYmIG9wZW5zc2xfbGFzdF9pcCAhPSBOVUxMKSB7Ci0JCW5hbWUgPSBzdHJkdXAob3BlbnNzbF9sYXN0X2lwKTsKLQl9Ci0KLQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInNzbF9pbml0OiA0XG4iKTsKLQotCXdoaWxlICgxKSB7Ci0KLQkJc2lnbmFsKFNJR0FMUk0sIHNzbF90aW1lb3V0KTsKLQkJYWxhcm0odGltZW91dCk7Ci0KLQkJaWYgKHNzbF9jbGllbnRfbW9kZSkgewotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgU1NMX2Nvbm5lY3QuLi5cbiIpOwotCQkJcmMgPSBTU0xfY29ubmVjdChzc2wpOwotCQl9IGVsc2UgewotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgU1NMX2FjY2VwdC4uLlxuIik7Ci0JCQlyYyA9IFNTTF9hY2NlcHQoc3NsKTsKLQkJfQotCQllcnIgPSBTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpOwotCi0JCWFsYXJtKDApOwotCQlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ci0KLQkJaWYgKHNzbF9jbGllbnRfbW9kZSkgewotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlNTTF9jb25uZWN0ICVkLyVkXG4iLCByYywgZXJyKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJTU0xfYWNjZXB0ICVkLyVkXG4iLCByYywgZXJyKTsKLQkJfQotCQlpZiAoZXJyID09IFNTTF9FUlJPUl9OT05FKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCkgewotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZ290IFNTTF9FUlJPUl9XQU5UX1JFQURcbiIpOwotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiAlcygpIGZhaWxlZCBmb3I6ICVzOiVkIDFcbiIsCi0JCQkgICAgZ2V0cGlkKCksIHNzbF9jbGllbnRfbW9kZSA/ICJTU0xfY29ubmVjdCIgOiAiU1NMX2FjY2VwdCIsIG5hbWUsIHBlZXJwb3J0KTsKLQkJCXByX3NzbF9pbmZvKDEpOwotCQkJcmV0dXJuIDA7Ci0JCQkKLQkJfSBlbHNlIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpIHsKLQotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdvdCBTU0xfRVJST1JfV0FOVF9XUklURVxuIik7Ci0JCQlyZmJMb2coIlNTTDogc3NsX2hlbHBlclslZF06ICVzKCkgZmFpbGVkIGZvcjogJXM6JWQgMlxuIiwKLQkJCSAgICBnZXRwaWQoKSwgc3NsX2NsaWVudF9tb2RlID8gIlNTTF9jb25uZWN0IiA6ICJTU0xfYWNjZXB0IiwgbmFtZSwgcGVlcnBvcnQpOwotCQkJcHJfc3NsX2luZm8oMSk7Ci0JCQlyZXR1cm4gMDsKLQotCQl9IGVsc2UgaWYgKGVyciA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgewotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZ290IFNTTF9FUlJPUl9TWVNDQUxMXG4iKTsKLQkJCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogJXMoKSBmYWlsZWQgZm9yOiAlczolZCAzXG4iLAotCQkJICAgIGdldHBpZCgpLCBzc2xfY2xpZW50X21vZGUgPyAiU1NMX2Nvbm5lY3QiIDogIlNTTF9hY2NlcHQiLCBuYW1lLCBwZWVycG9ydCk7Ci0JCQlwcl9zc2xfaW5mbygxKTsKLQkJCXJldHVybiAwOwotCi0JCX0gZWxzZSBpZiAoZXJyID09IFNTTF9FUlJPUl9aRVJPX1JFVFVSTikgewotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZ290IFNTTF9FUlJPUl9aRVJPX1JFVFVSTlxuIik7Ci0JCQlyZmJMb2coIlNTTDogc3NsX2hlbHBlclslZF06ICVzKCkgZmFpbGVkIGZvcjogJXM6JWQgNFxuIiwKLQkJCSAgICBnZXRwaWQoKSwgc3NsX2NsaWVudF9tb2RlID8gIlNTTF9jb25uZWN0IiA6ICJTU0xfYWNjZXB0IiwgbmFtZSwgcGVlcnBvcnQpOwotCQkJcHJfc3NsX2luZm8oMSk7Ci0JCQlyZXR1cm4gMDsKLQotCQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQkJdW5zaWduZWQgbG9uZyBlcnI7Ci0JCQlpbnQgY250ID0gMDsKLQotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiAlcygpICpGQVRBTDogJWQgU1NMIEZBSUxFRFxuIiwKLQkJCSAgICBnZXRwaWQoKSwgc3NsX2NsaWVudF9tb2RlID8gIlNTTF9jb25uZWN0IiA6ICJTU0xfYWNjZXB0IiwgcmMpOwotCQkJd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKLQkJCQlyZmJMb2coIlNTTDogJXNcbiIsIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBOVUxMKSk7Ci0JCQkJaWYgKGNudCsrID4gMTAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXByX3NzbF9pbmZvKDEpOwotCQkJcmV0dXJuIDA7Ci0KLQkJfSBlbHNlIGlmIChkbm93KCkgPiBzdGFydCArIDMuMCkgewotCi0JCQlyZmJMb2coIlNTTDogc3NsX2hlbHBlclslZF06IHRpbWVvdXQgbG9vcGluZyAlcygpICIKLQkJCSAgICAiZmF0YWwuXG4iLCBnZXRwaWQoKSwgc3NsX2NsaWVudF9tb2RlID8gIlNTTF9jb25uZWN0IiA6ICJTU0xfYWNjZXB0Iik7Ci0JCQlwcl9zc2xfaW5mbygxKTsKLQkJCXJldHVybiAwOwotCi0JCX0gZWxzZSB7Ci0JCQlCSU8gKmJpbyA9IFNTTF9nZXRfcmJpbyhzc2wpOwotCQkJaWYgKGJpbyA9PSBOVUxMKSB7Ci0JCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBzc2wgQklPIGlzIG51bGwuICIKLQkJCQkgICAgImZhdGFsLlxuIiwgZ2V0cGlkKCkpOwotCQkJCXByX3NzbF9pbmZvKDEpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKEJJT19lb2YoYmlvKSkgewotCQkJCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogc3NsIEJJTyBpcyBFT0YuICIKLQkJCQkgICAgImZhdGFsLlxuIiwgZ2V0cGlkKCkpOwotCQkJCXByX3NzbF9pbmZvKDEpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCXVzbGVlcCgxMCAqIDEwMDApOwotCX0KLQotCWlmIChzc2xfY2xpZW50X21vZGUpIHsKLQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBTU0xfY29ubmVjdCgpIHN1Y2NlZWRlZCBmb3I6ICVzOiVkXG4iLCBnZXRwaWQoKSwgbmFtZSwgcGVlcnBvcnQpOwotCX0gZWxzZSB7Ci0JCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogU1NMX2FjY2VwdCgpIHN1Y2NlZWRlZCBmb3I6ICVzOiVkXG4iLCBnZXRwaWQoKSwgbmFtZSwgcGVlcnBvcnQpOwotCX0KLQotCXByX3NzbF9pbmZvKDApOwotCi0JaWYgKFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2wpID09IFg1MDlfVl9PSykgewotCQlYNTA5ICp4OwotCQlGSUxFICpjciA9IE5VTEw7Ci0JCWlmIChjZXJ0cmV0ICE9IE5VTEwpIHsKLQkJCWNyID0gZm9wZW4oY2VydHJldCwgInciKTsKLQkJfQotCQkKLQkJeCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpOwkKLQkJaWYgKHggPT0gTlVMTCkgewotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBhY2NlcHRlZCBjbGllbnQgJXMgeDUwOSBwZWVyIGNlcnQgaXMgbnVsbFxuIiwgZ2V0cGlkKCksIG5hbWUpOwotCQkJaWYgKGNyICE9IE5VTEwpIHsKLQkJCQlmcHJpbnRmKGNyLCAiTk9DRVJUXG4iKTsKLQkJCQlmY2xvc2UoY3IpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBhY2NlcHRlZCBjbGllbnQgJXMgeDUwOSBjZXJ0IGlzOlxuIiwgZ2V0cGlkKCksIG5hbWUpOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1g1MDlfUFJJTlRfRVhfRlAKLQkJCVg1MDlfcHJpbnRfZXhfZnAoc3RkZXJyLCB4LCAwLCBYTl9GTEFHX01VTFRJTElORSk7Ci0jZW5kaWYKLQkJCWlmIChjciAhPSBOVUxMKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWDUwOV9QUklOVF9FWF9GUAotCQkJCVg1MDlfcHJpbnRfZXhfZnAoY3IsIHgsIDAsIFhOX0ZMQUdfTVVMVElMSU5FKTsKLSNlbHNlCi0JCQkJcmZiTG9nKCIqKiBub3QgY29tcGlsZWQgd2l0aCBsaWJzc2wgWDUwOV9wcmludF9leF9mcCgpIGZ1bmN0aW9uICoqXG4iKTsKLQkJCQlpZiAodXNlcnNfbGlzdCAmJiBzdHJzdHIodXNlcnNfbGlzdCwgInNzbHBlZXI9IikpIHsKLQkJCQkJcmZiTG9nKCIqKiAtdXNlcnMgc3NscGVlcj0gd2lsbCBub3Qgd29yayEgKipcbiIpOwotCQkJCX0KLSNlbmRpZgotCQkJCWZjbG9zZShjcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JZnJlZShuYW1lKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBzeW1tZXRyaWNfZW5jcnlwdGlvbl94ZmVyKGludCBjc29jaywgaW50IHNfaW4sIGludCBzX291dCk7Ci0KLXN0YXRpYyB2b2lkIHNzbF94ZmVyKGludCBjc29jaywgaW50IHNfaW4sIGludCBzX291dCwgaW50IGlzX2h0dHBzKSB7Ci0JaW50IGRieGZlciA9IDAsIGRiID0gMCwgY2hlY2tfcGVuZGluZywgZmRtYXgsIG5mZCwgbiwgaSwgZXJyOwotCWNoYXIgY2J1ZltBQlNJWkVdLCBzYnVmW0FCU0laRV07Ci0JaW50ICBjcHRyLCBzcHRyLCBjX3JkLCBjX3dyLCBzX3JkLCBzX3dyOwotCWZkX3NldCByZCwgd3I7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IHNzb2NrLCBjbnQgPSAwLCBuZGF0YSA9IDA7Ci0KLQkvKgotCSAqIHdlIHdhbnQgdG8gc3dpdGNoIHRvIGEgbG9uZ2VyIHRpbWVvdXQgZm9yIGxvbmcgdGVybSBWTkMKLQkgKiBjb25uZWN0aW9ucyAoaW4gY2FzZSB0aGUgbmV0d29yayBpcyBub3Qgd29ya2luZyBmb3IgcGVyaW9kcyBvZgotCSAqIHRpbWUpLCBidXQgd2UgYWxzbyB3YW50IHRoZSB0aW1lb3V0IHNob3J0ZXIgYXQgdGhlIGJlZ2lubmluZwotCSAqIGluIGNhc2UgdGhlIGNsaWVudCB3ZW50IGF3YXkuCi0JICovCi0JZG91YmxlIHN0YXJ0LCBub3c7Ci0JaW50IHR2X2h0dHBzX2Vhcmx5ID0gNjA7Ci0JaW50IHR2X2h0dHBzX2xhdGVyID0gMjA7Ci0JaW50IHR2X3ZuY19lYXJseSA9IDQwOwotCWludCB0dl92bmNfbGF0ZXIgPSA0MzIwMDsJLyogd2FzIDMwMCwgc3R1bm5lbDogNDMyMDAgKi8KLQlpbnQgdHZfY3V0b3ZlciA9IDcwOwotCWludCB0dl9jbG9zaW5nID0gNjA7Ci0JaW50IHR2X3VzZTsKLQotCWlmIChkYnhmZXIpIHsKLQkJcmF3X3hmZXIoY3NvY2ssIHNfaW4sIHNfb3V0KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZW5jX3N0ciAhPSBOVUxMKSB7Ci0JCWlmICghc3RyY21wKGVuY19zdHIsICJub25lIikpIHsKLQkJCXVzbGVlcCgyNTAqMTAwMCk7Ci0JCQlyZmJMb2coImRvaW5nICctZW5jIG5vbmUnIHJhdyB0cmFuc2ZlciAobm8gZW5jcnlwdGlvbilcbiIpOyAKLQkJCXJhd194ZmVyKGNzb2NrLCBzX2luLCBzX291dCk7Ci0JCX0gZWxzZSB7Ci0JCQlzeW1tZXRyaWNfZW5jcnlwdGlvbl94ZmVyKGNzb2NrLCBzX2luLCBzX291dCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChnZXRlbnYoIlNTTF9ERUJVRyIpKSB7Ci0JCWRiID0gYXRvaShnZXRlbnYoIlNTTF9ERUJVRyIpKTsKLQl9Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic3NsX3hmZXIgYmVnaW5cbiIpOwotCi0Jc3RhcnQgPSBkbm93KCk7Ci0JaWYgKGlzX2h0dHBzKSB7Ci0JCXR2X3VzZSA9IHR2X2h0dHBzX2Vhcmx5OwotCX0gZWxzZSB7Ci0JCXR2X3VzZSA9IHR2X3ZuY19lYXJseTsKLQl9Ci0JCi0KLQkvKgotCSAqIGNzb2NrOiBjbGVhciB0ZXh0IHNvY2tldCB3aXRoIGxpYnZuY3NlcnZlci4gICAgIkMiCi0JICogc3NvY2s6IHNzbCBkYXRhIHNvY2tldCB3aXRoIHJlbW90ZSB2bmMgdmlld2VyLiAiUyIKLQkgKgotCSAqIHRvIGNvdmVyIGluZXRkIG1vZGUsIHdlIGhhdmUgc19pbiBhbmQgc19vdXQsIGJ1dCBpbiBub24taW5ldGQKLQkgKiBtb2RlIHRoZXkgYm90aCBzc29jay4KLQkgKgotCSAqIGNidWZbXSBpcyBkYXRhIGZyb20gY3NvY2sgdGhhdCB3ZSBoYXZlIHJlYWQgYnV0IG5vdCBwYXNzZWQgb24gdG8gc3NsIAotCSAqIHNidWZbXSBpcyBkYXRhIGZyb20gc3NsIHRoYXQgd2UgaGF2ZSByZWFkIGJ1dCBub3QgcGFzc2VkIG9uIHRvIGNzb2NrIAotCSAqLwotCWZvciAoaT0wOyBpPEFCU0laRTsgaSsrKSB7Ci0JCWNidWZbaV0gPSAnXDAnOwotCQlzYnVmW2ldID0gJ1wwJzsKLQl9Ci0JCQotCWlmIChzX291dCA+IHNfaW4pIHsKLQkJc3NvY2sgPSBzX291dDsKLQl9IGVsc2UgewotCQlzc29jayA9IHNfaW47Ci0JfQotCi0JaWYgKGNzb2NrID4gc3NvY2spIHsKLQkJZmRtYXggPSBjc29jazsgCi0JfSBlbHNlIHsKLQkJZmRtYXggPSBzc29jazsgCi0JfQotCi0JY19yZCA9IDE7CS8qIGNsZWFyIHRleHQgKGxpYnZuY3NlcnZlcikgc29ja2V0IG9wZW4gZm9yIHJlYWRpbmcgKi8KLQljX3dyID0gMTsJLyogY2xlYXIgdGV4dCAobGlidm5jc2VydmVyKSBzb2NrZXQgb3BlbiBmb3Igd3JpdGluZyAqLwotCXNfcmQgPSAxOwkvKiBzc2wgZGF0YSAocmVtb3RlIGNsaWVudCkgIHNvY2tldCBvcGVuIGZvciByZWFkaW5nICovCi0Jc193ciA9IDE7CS8qIHNzbCBkYXRhIChyZW1vdGUgY2xpZW50KSAgc29ja2V0IG9wZW4gZm9yIHdyaXRpbmcgKi8KLQotCWNwdHIgPSAwOwkvKiBvZmZzZXRzIGludG8gQUJTSVpFIGJ1ZmZlcnMgKi8KLQlzcHRyID0gMDsKLQotCWlmICh2ZW5jcnlwdF9zZWxlY3RlZCA+IDAgfHwgYW5vbnRsc19zZWxlY3RlZCA+IDApIHsKLQkJY2hhciB0bXBbMTZdOwotCQkvKiByZWFkIGFuZCBkaXNjYXJkIHRoZSBleHRyYSBSRkIgdmVyc2lvbiAqLwotCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JCXJlYWQoY3NvY2ssIHRtcCwgMTIpOwotCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJleHRyYTogJXNcbiIsIHRtcCk7Ci0JfQotCi0Jd2hpbGUgKDEpIHsKLQkJaW50IGNfdG9fcywgc190b19jLCBjbG9zaW5nOwotCi0JCWlmICggc193ciAmJiAoY19yZCB8fCBjcHRyID4gMCkgKSB7Ci0JCQkvKiAKLQkJCSAqIFMgaXMgd3JpdGFibGUgYW5kIAotCQkJICogQyBpcyByZWFkYWJsZSBvciBzb21lIGNidWYgZGF0YSByZW1haW5pbmcKLQkJCSAqLwotCQkJY190b19zID0gMTsKLQkJfSBlbHNlIHsKLQkJCWNfdG9fcyA9IDA7Ci0JCX0KLQotCQlpZiAoIGNfd3IgJiYgKHNfcmQgfHwgc3B0ciA+IDApICkgewotCQkJLyogCi0JCQkgKiBDIGlzIHdyaXRhYmxlIGFuZCAKLQkJCSAqIFMgaXMgcmVhZGFibGUgb3Igc29tZSBzYnVmIGRhdGEgcmVtYWluaW5nCi0JCQkgKi8KLQkJCXNfdG9fYyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzX3RvX2MgPSAwOwotCQl9Ci0KLQkJaWYgKCEgY190b19zICYmICEgc190b19jKSB7Ci0JCQkvKgotCQkJICogbm90aGluZyBjYW4gYmUgc2VudCBlaXRoZXIgZGlyZWN0aW9uLgotCQkJICogYnJlYWsgb3V0IG9mIHRoZSBsb29wIHRvIGZpbmlzaCBhbGwgd29yay4KLQkJCSAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJY250Kys7Ci0KLQkJLyogc2V0IHVwIHRoZSBmZCBzZXRzIGZvciB0aGUgdHdvIHNvY2tldHMgZm9yIHJlYWQgJiB3cml0ZTogKi8KLQotCQlGRF9aRVJPKCZyZCk7Ci0KLQkJaWYgKGNfcmQgJiYgY3B0ciA8IEFCU0laRSkgewotCQkJLyogd2UgY291bGQgcmVhZCBtb3JlIGZyb20gQyBzaW5jZSBjYnVmIGlzIG5vdCBmdWxsICovCi0JCQlGRF9TRVQoY3NvY2ssICZyZCk7Ci0JCX0KLQkJaWYgKHNfcmQpIHsKLQkJCS8qCi0JCQkgKiB3ZSBjb3VsZCByZWFkIG1vcmUgZnJvbSBTIHNpbmNlIHNidWYgbm90IGZ1bGwsCi0JCQkgKiBPUiBzc2wgaXMgd2FpdGluZyBmb3IgbW9yZSBCSU8gdG8gYmUgYWJsZSB0bwotCQkJICogcmVhZCBhbmQgd2UgaGF2ZSBzb21lIEMgZGF0YSBzdGlsbCBidWZmZXJlZC4KLQkJCSAqLwotCQkJaWYgKHNwdHIgPCBBQlNJWkUgfHwgKGNwdHIgPiAwICYmIFNTTF93YW50X3JlYWQoc3NsKSkpIHsKLQkJCQlGRF9TRVQoc19pbiwgJnJkKTsKLQkJCX0KLQkJfQotCQkKLQkJRkRfWkVSTygmd3IpOwotCi0JCWlmIChjX3dyICYmIHNwdHIgPiAwKSB7Ci0JCQkvKiB3ZSBjb3VsZCB3cml0ZSBtb3JlIHRvIEMgc2luY2Ugc2J1ZiBpcyBub3QgZW1wdHkgKi8KLQkJCUZEX1NFVChjc29jaywgJndyKTsKLQkJfQotCQlpZiAoc193cikgewotCQkJLyoKLQkJCSAqIHdlIGNvdWxkIHdyaXRlIG1vcmUgdG8gUyBzaW5jZSBjYnVmIG5vdCBlbXB0eSwKLQkJCSAqIE9SIHNzbCBpcyB3YWl0aW5nIGZvciBtb3JlIEJJTyB0byBiZSBhYmxlCi0JCQkgKiB3cml0ZSBhbmQgd2UgaGF2ZW4ndCBmaWxsZWQgdXAgc2J1ZiB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjcHRyID4gMCB8fCAoc3B0ciA8IEFCU0laRSAmJiBTU0xfd2FudF93cml0ZShzc2wpKSkgewotCQkJCUZEX1NFVChzX291dCwgJndyKTsKLQkJCX0KLQkJfQotCi0JCW5vdyA9IGRub3coKTsKLQkJaWYgKHR2X2N1dG92ZXIgJiYgbm93ID4gc3RhcnQgKyB0dl9jdXRvdmVyKSB7Ci0JCQlyZmJMb2coIlNTTDogc3NsX3hmZXJbJWRdOiB0dl9jdXRvdmVyOiAlZFxuIiwgZ2V0cGlkKCksCi0JCQkgICAgdHZfY3V0b3Zlcik7Ci0JCQl0dl9jdXRvdmVyID0gMDsKLQkJCWlmIChpc19odHRwcykgewotCQkJCXR2X3VzZSA9IHR2X2h0dHBzX2xhdGVyOwotCQkJfSBlbHNlIHsKLQkJCQl0dl91c2UgPSB0dl92bmNfbGF0ZXI7Ci0JCQl9Ci0JCQkvKiB0cnkgdG8gY2xlYW4gb3V0IHNvbWUgem9tYmllcyBpZiB3ZSBjYW4uICovCi0JCQlzc2xfaGVscGVyX3BpZCgwLCAtMik7Ci0JCX0KLQkJaWYgKHNzbF90aW1lb3V0X3NlY3MgPiAwKSB7Ci0JCQl0dl91c2UgPSBzc2xfdGltZW91dF9zZWNzOwotCQl9Ci0KLQkJaWYgKCAoc19yZCAmJiBjX3JkKSB8fCBjcHRyIHx8IHNwdHIpIHsKLQkJCWNsb3NpbmcgPSAwOwotCQl9IGVsc2UgewotCQkJY2xvc2luZyA9IDE7Ci0JCQl0dl91c2UgPSB0dl9jbG9zaW5nOwotCQl9Ci0KLQkJdHYudHZfc2VjICA9IHR2X3VzZTsKLQkJdHYudHZfdXNlYyA9IDA7Ci0KLQkJLyogIGRvIHRoZSBzZWxlY3QsIHJlcGVhdCBpZiBpbnRlcnJ1cHRlZCAqLwotCQlkbyB7Ci0JCQlpZiAoc3NsX3RpbWVvdXRfc2VjcyA9PSAwKSB7Ci0JCQkJbmZkID0gc2VsZWN0KGZkbWF4KzEsICZyZCwgJndyLCBOVUxMLCBOVUxMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmZkID0gc2VsZWN0KGZkbWF4KzEsICZyZCwgJndyLCBOVUxMLCAmdHYpOwotCQkJfQotCQl9IHdoaWxlIChuZmQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotCQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIm5mZDogJWRcbiIsIG5mZCk7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIm5mZFslZF06ICVkICB3L3IgY3NvY2s6ICVkICVkIHNfaW46ICVkICVkXG4iLCBnZXRwaWQoKSwgbmZkLCBGRF9JU1NFVChjc29jaywgJndyKSwgRkRfSVNTRVQoY3NvY2ssICZyZCksIEZEX0lTU0VUKHNfb3V0LCAmd3IpLCBGRF9JU1NFVChzX2luLCAmcmQpKTsgCi0KLQkJaWYgKG5mZCA8IDApIHsKLQkJCXJmYkxvZygiU1NMOiBzc2xfeGZlclslZF06IHNlbGVjdCBlcnJvcjogJWRcbiIsIGdldHBpZCgpLCBuZmQpOwotCQkJcGVycm9yKCJzZWxlY3QiKTsKLQkJCS8qIGNvbm5lY3Rpb24gZmluaXNoZWQgKi8KLQkJCWdvdG8gZG9uZTsJCi0JCX0KLQotCQlpZiAobmZkID09IDApIHsKLQkJCWlmICghY2xvc2luZyAmJiB0dl9jdXRvdmVyICYmIG5kYXRhID4gMjUwMDApIHsKLQkJCQlzdGF0aWMgaW50IGNuID0gMDsKLQkJCQkvKiBwcm9iYWJseSBvaywgZWFybHkgd2luZG93cyBpY29uaWZ5ICovCi0JCQkJaWYgKGNuKysgPCAyKSB7Ci0JCQkJCXJmYkxvZygiU1NMOiBzc2xfeGZlclslZF06IGVhcmx5IHRpbWUiCi0JCQkJCSAgICAib3V0OiAlZFxuIiwgZ2V0cGlkKCksIG5kYXRhKTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZmJMb2coIlNTTDogc3NsX3hmZXJbJWRdOiBjb25uZWN0aW9uIHRpbWVkb3V0LiAlZCAgdHZfdXNlOiAlZFxuIiwKLQkJCSAgICBnZXRwaWQoKSwgbmRhdGEsIHR2X3VzZSk7Ci0JCQkvKiBjb25uZWN0aW9uIGZpbmlzaGVkICovCi0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkvKiB1c2VkIHRvIHNlZSBpZiBTU0xfcGVuZGluZygpIHNob3VsZCBiZSBjaGVja2VkOiAqLwotCQljaGVja19wZW5kaW5nID0gMDsKLS8qIEFVRElUICovCi0KLQkJaWYgKGNfd3IgJiYgRkRfSVNTRVQoY3NvY2ssICZ3cikpIHsKLQotCQkJLyogdHJ5IHRvIHdyaXRlIHNvbWUgb2Ygb3VyIHNidWYgdG8gQzogKi8KLQkJCW4gPSB3cml0ZShjc29jaywgc2J1Ziwgc3B0cik7IAotCi0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkJCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCAqLwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJCS8qIHByb2NlZWQgKi8KLQkJCX0gZWxzZSBpZiAobiA9PSAwKSB7Ci0JCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCBYWFggZG91YmxlIGNoZWNrICovCi0JCQkJZ290byBkb25lOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBzaGlmdCBvdmVyIHRoZSBkYXRhIGluIHNidWYgYnkgbiAqLwotCQkJCW1lbW1vdmUoc2J1Ziwgc2J1ZiArIG4sIHNwdHIgLSBuKTsKLQkJCQlpZiAoc3B0ciA9PSBBQlNJWkUpIHsKLQkJCQkJY2hlY2tfcGVuZGluZyA9IDE7Ci0JCQkJfQotCQkJCXNwdHIgLT0gbjsKLQotCQkJCWlmICghIHNfcmQgJiYgc3B0ciA9PSAwKSB7Ci0JCQkJCS8qIGZpbmlzaGVkIHNlbmRpbmcgbGFzdCBvZiBzYnVmICovCi0JCQkJCXNodXRkb3duKGNzb2NrLCBTSFVUX1dSKTsKLQkJCQkJY193ciA9IDA7Ci0JCQkJfQotCQkJCW5kYXRhICs9IG47Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc193cikgewotCQkJaWYgKChjcHRyID4gMCAmJiBGRF9JU1NFVChzX291dCwgJndyKSkgfHwKLQkJCSAgICAoU1NMX3dhbnRfcmVhZChzc2wpICYmIEZEX0lTU0VUKHNfaW4sICZyZCkpKSB7Ci0KLQkJCQkvKiB0cnkgdG8gd3JpdGUgc29tZSBvZiBvdXIgY2J1ZiB0byBTOiAqLwotCi0JCQkJbiA9IFNTTF93cml0ZShzc2wsIGNidWYsIGNwdHIpOwotCQkJCWVyciA9IFNTTF9nZXRfZXJyb3Ioc3NsLCBuKTsKLQotCQkJCWlmIChlcnIgPT0gU1NMX0VSUk9SX05PTkUpIHsKLQkJCQkJLyogc2hpZnQgb3ZlciB0aGUgZGF0YSBpbiBjYnVmIGJ5IG4gKi8KLQkJCQkJbWVtbW92ZShjYnVmLCBjYnVmICsgbiwgY3B0ciAtIG4pOwotCQkJCQljcHRyIC09IG47Ci0KLQkJCQkJaWYgKCEgY19yZCAmJiBjcHRyID09IDAgJiYgc193cikgewotCQkJCQkJLyogZmluaXNoZWQgc2VuZGluZyBsYXN0IGNidWYgKi8KLQkJCQkJCVNTTF9zaHV0ZG93bihzc2wpOwotCQkJCQkJc193ciA9IDA7Ci0JCQkJCX0KLQkJCQkJbmRhdGEgKz0gbjsKLQotCQkJCX0gZWxzZSBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFCi0JCQkJCXx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFECi0JCQkJCXx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCkgewotCi0JCQkJCQk7CS8qIHByb2NlZWQgKi8KLQotCQkJCX0gZWxzZSBpZiAoZXJyID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0JCQkJCWlmIChuIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgewotCQkJCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCAqLwotCQkJCQkJZ290byBkb25lOwotCQkJCQl9Ci0JCQkJCS8qIHByb2NlZWQgKi8KLQkJCQl9IGVsc2UgaWYgKGVyciA9PSBTU0xfRVJST1JfWkVST19SRVRVUk4pIHsKLQkJCQkJLyogUyBmaW5pc2hlZCAqLwotCQkJCQlzX3JkID0gMDsKLQkJCQkJc193ciA9IDA7Ci0JCQkJfSBlbHNlIGlmIChlcnIgPT0gU1NMX0VSUk9SX1NTTCkgewotCQkJCQkvKiBjb25uZWN0aW9uIGZpbmlzaGVkICovCi0JCQkJCWdvdG8gZG9uZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY19yZCAmJiBGRF9JU1NFVChjc29jaywgJnJkKSkgewotCi0KLQkJCS8qIHRyeSB0byByZWFkIHNvbWUgZGF0YSBmcm9tIEMgaW50byBvdXIgY2J1ZiAqLwotCi0JCQluID0gcmVhZChjc29jaywgY2J1ZiArIGNwdHIsIEFCU0laRSAtIGNwdHIpOwotCi0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkJCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCAqLwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJCS8qIHByb2NlZWQgKi8KLQkJCX0gZWxzZSBpZiAobiA9PSAwKSB7Ci0JCQkJLyogQyBpcyBFT0YgKi8KLQkJCQljX3JkID0gMDsKLQkJCQlpZiAoY3B0ciA9PSAwICYmIHNfd3IpIHsKLQkJCQkJLyogYW5kIG5vIG1vcmUgaW4gY2J1ZiB0byBzZW5kICovCi0JCQkJCVNTTF9zaHV0ZG93bihzc2wpOwotCQkJCQlzX3dyID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIGdvb2QgKi8KLQotCQkJCWNwdHIgKz0gbjsKLQkJCQluZGF0YSArPSBuOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNfcmQpIHsKLQkJCWlmICgoc3B0ciA8IEFCU0laRSAmJiBGRF9JU1NFVChzX2luLCAmcmQpKSB8fAotCQkJICAgIChTU0xfd2FudF93cml0ZShzc2wpICYmIEZEX0lTU0VUKHNfb3V0LCAmd3IpKSB8fAotCQkJICAgIChjaGVja19wZW5kaW5nICYmIFNTTF9wZW5kaW5nKHNzbCkpKSB7Ci0KLQkJCQkvKiB0cnkgdG8gcmVhZCBzb21lIGRhdGEgZnJvbSBTIGludG8gb3VyIHNidWYgKi8KLQotCQkJCW4gPSBTU0xfcmVhZChzc2wsIHNidWYgKyBzcHRyLCBBQlNJWkUgLSBzcHRyKTsKLQkJCQllcnIgPSBTU0xfZ2V0X2Vycm9yKHNzbCwgbik7Ci0KLQkJCQlpZiAoZXJyID09IFNTTF9FUlJPUl9OT05FKSB7Ci0JCQkJCS8qIGdvb2QgKi8KLQotCQkJCQlzcHRyICs9IG47Ci0JCQkJCW5kYXRhICs9IG47Ci0KLQkJCQl9IGVsc2UgaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURQotCQkJCQl8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRAotCQkJCQl8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApIHsKLQotCQkJCQkJOwkvKiBwcm9jZWVkICovCi0KLQkJCQl9IGVsc2UgaWYgKGVyciA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgewotCQkJCQlpZiAobiA8IDApIHsKLQkJCQkJCWlmKGVycm5vICE9IEVJTlRSKSB7Ci0JCQkJCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCAqLwotCQkJCQkJCWdvdG8gZG9uZTsKLQkJCQkJCX0KLQkJCQkJCS8qIHByb2NlZWQgKi8KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIFMgZmluaXNoZWQgKi8KLQkJCQkJCXNfcmQgPSAwOwotCQkJCQkJc193ciA9IDA7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVyciA9PSBTU0xfRVJST1JfWkVST19SRVRVUk4pIHsKLQkJCQkJLyogUyBpcyBFT0YgKi8KLQkJCQkJc19yZCA9IDA7Ci0JCQkJCWlmIChjcHRyID09IDAgJiYgc193cikgewotCQkJCQkJLyogYW5kIG5vIG1vcmUgaW4gY2J1ZiB0byBzZW5kICovCi0JCQkJCQlTU0xfc2h1dGRvd24oc3NsKTsKLQkJCQkJCXNfd3IgPSAwOwotCQkJCQl9Ci0JCQkJCWlmIChzcHRyID09IDAgJiYgY193cikgewotCQkJCQkJLyogYW5kIG5vIG1vcmUgaW4gc2J1ZiB0byBzZW5kICovCi0JCQkJCQlzaHV0ZG93bihjc29jaywgU0hVVF9XUik7Ci0JCQkJCQljX3dyID0gMDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZXJyID09IFNTTF9FUlJPUl9TU0wpIHsKLQkJCQkJLyogY29ubmVjdGlvbiBmaW5pc2hlZCAqLwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JZG9uZToKLQlyZmJMb2coIlNTTDogc3NsX3hmZXJbJWRdOiBjbG9zaW5nIHNvY2tldHMgJWQsICVkLCAlZFxuIiwKLQkJCSAgICBnZXRwaWQoKSwgY3NvY2ssIHNfaW4sIHNfb3V0KTsKLQljbG9zZShjc29jayk7Ci0JY2xvc2Uoc19pbik7Ci0JY2xvc2Uoc19vdXQpOwotCXJldHVybjsKLX0KLQotI2RlZmluZSBNU1ogNDA5Ngotc3RhdGljIHZvaWQgaW5pdF9wcm5nKHZvaWQpIHsKLQlpbnQgZGIgPSAwLCBieXRlcywgdWJ5dGVzLCBmZDsKLQljaGFyIGZpbGVbTVNaXSwgZHRtcFsxMDBdOwotCXVuc2lnbmVkIGludCBzcjsKLQotCVJBTkRfZmlsZV9uYW1lKGZpbGUsIE1TWik7Ci0KLQlyZmJMb2coIlJBTkRfZmlsZV9uYW1lOiAlc1xuIiwgZmlsZSk7Ci0KLQlieXRlcyA9IFJBTkRfbG9hZF9maWxlKGZpbGUsIC0xKTsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgcmVhZDogJWRcbiIsIGJ5dGVzKTsKLQkKLQl1Ynl0ZXMgPSBSQU5EX2xvYWRfZmlsZSgiL2Rldi91cmFuZG9tIiwgNjQpOwotCWJ5dGVzICs9IHVieXRlczsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgcmVhZDogJWQgLyAlZFxuIiwgYnl0ZXMsIHVieXRlcyk7Ci0KLQkvKiBtaXggaW4gbW9yZSBwcmVkaWN0YWJsZSBzdHVmZiBhcyB3ZWxsIGZvciBmYWxsYmFjayAqLwotCXNwcmludGYoZHRtcCwgIi90bXAvcCUuOGYuWFhYWFhYIiwgZG5vdygpKTsKLQlmZCA9IG1rc3RlbXAoZHRtcCk7Ci0JUkFORF9hZGQoZHRtcCwgc3RybGVuKGR0bXApLCAwKTsKLQlpZiAoZmQgPj0gMCkgewotCQljbG9zZShmZCk7Ci0JCXVubGluayhkdG1wKTsKLQl9Ci0Jc3ByaW50ZihkdG1wLCAiJWQtJS44ZiIsIChpbnQpIGdldHBpZCgpLCBkbm93KCkpOwotCVJBTkRfYWRkKGR0bXAsIHN0cmxlbihkdG1wKSwgMCk7Ci0KLQlpZiAoIVJBTkRfc3RhdHVzKCkpIHsKLQkJdWJ5dGVzID0gLTE7Ci0JCXJmYkxvZygiY2FsbGluZyBSQU5EX3BvbGwoKVxuIik7Ci0JCVJBTkRfcG9sbCgpOwotCX0KLQkKLQlSQU5EX2J5dGVzKCh1bnNpZ25lZCBjaGFyICopJnNyLCA0KTsKLQlzcmFuZChzcik7Ci0KLQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCWlmICghIHF1aWV0KSB7Ci0JCQlyZmJMb2coImluaXRpYWxpemVkIFBSTkcgd2l0aCAlZCByYW5kb20gYnl0ZXMuXG4iLAotCQkJICAgIGJ5dGVzKTsKLQkJfQotCQlpZiAodWJ5dGVzID4gMzIgJiYgcm5vdygpIDwgMC4yNSkgewotCQkJUkFORF93cml0ZV9maWxlKGZpbGUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlieXRlcyArPSBSQU5EX2xvYWRfZmlsZSgiL2Rldi9yYW5kb20iLCA4KTsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgcmVhZDogJWRcbiIsIGJ5dGVzKTsKLQlSQU5EX3BvbGwoKTsKLQotCWlmICghIHF1aWV0KSB7Ci0JCXJmYkxvZygiaW5pdGlhbGl6ZWQgUFJORyB3aXRoICVkIHJhbmRvbSBieXRlcy5cbiIsIGJ5dGVzKTsKLQl9Ci19Ci0jZW5kaWYJLyogRk9SS19PSyAqLwotI2VuZGlmCS8qIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlNTTCAqLwotCi12b2lkIGNoZWNrX29wZW5zc2wodm9pZCkgewotCWZkX3NldCBmZHM7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IG5mZHMsIG5tYXggPSBvcGVuc3NsX3NvY2s7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X3dhaXRhbGwgPSAwOwotCXN0YXRpYyBkb3VibGUgbGFzdF9jaGVjayA9IDAuMDsKLQlkb3VibGUgbm93OwotCi0JaWYgKCEgdXNlX29wZW5zc2wpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh0aW1lKE5VTEwpID4gbGFzdF93YWl0YWxsICsgMTIwKSB7Ci0JCWxhc3Rfd2FpdGFsbCA9IHRpbWUoTlVMTCk7Ci0JCXNzbF9oZWxwZXJfcGlkKDAsIC0yKTsJLyogd2FpdGFsbCAqLwotCX0KLQotCWlmIChvcGVuc3NsX3NvY2sgPCAwICYmIG9wZW5zc2xfc29jazYgPCAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlub3cgPSBkbm93KCk7Ci0JaWYgKG5vdyA8IGxhc3RfY2hlY2sgKyAwLjUpIHsKLQkJcmV0dXJuOwotCX0KLQlsYXN0X2NoZWNrID0gbm93OwotCi0JRkRfWkVSTygmZmRzKTsKLQlpZiAob3BlbnNzbF9zb2NrID49IDApIHsKLQkJRkRfU0VUKG9wZW5zc2xfc29jaywgJmZkcyk7Ci0JfQotCWlmIChvcGVuc3NsX3NvY2s2ID49IDApIHsKLQkJRkRfU0VUKG9wZW5zc2xfc29jazYsICZmZHMpOwotCQlpZiAob3BlbnNzbF9zb2NrNiA+IG9wZW5zc2xfc29jaykgewotCQkJbm1heCA9IG9wZW5zc2xfc29jazY7Ci0JCX0KLQl9Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCi0JbmZkcyA9IHNlbGVjdChubWF4KzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLQlpZiAobmZkcyA8PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAob3BlbnNzbF9zb2NrID49IDAgJiYgRkRfSVNTRVQob3BlbnNzbF9zb2NrLCAmZmRzKSkgewotCQlyZmJMb2coIlNTTDogYWNjZXB0X29wZW5zc2woT1BFTlNTTF9WTkMpXG4iKTsKLQkJYWNjZXB0X29wZW5zc2woT1BFTlNTTF9WTkMsIC0xKTsKLQl9Ci0JaWYgKG9wZW5zc2xfc29jazYgPj0gMCAmJiBGRF9JU1NFVChvcGVuc3NsX3NvY2s2LCAmZmRzKSkgewotCQlyZmJMb2coIlNTTDogYWNjZXB0X29wZW5zc2woT1BFTlNTTF9WTkM2KVxuIik7Ci0JCWFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfVk5DNiwgLTEpOwotCX0KLX0KLQotdm9pZCBjaGVja19odHRwcyh2b2lkKSB7Ci0JZmRfc2V0IGZkczsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlpbnQgbmZkcywgbm1heCA9IGh0dHBzX3NvY2s7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X2NoZWNrID0gMC4wOwotCWRvdWJsZSBub3c7Ci0KLQlpZiAoISB1c2Vfb3BlbnNzbCB8fCAoaHR0cHNfc29jayA8IDAgJiYgaHR0cHNfc29jazYgPCAwKSkgewotCQlyZXR1cm47Ci0JfQotCi0Jbm93ID0gZG5vdygpOwotCWlmIChub3cgPCBsYXN0X2NoZWNrICsgMC41KSB7Ci0JCXJldHVybjsKLQl9Ci0JbGFzdF9jaGVjayA9IG5vdzsKLQotCUZEX1pFUk8oJmZkcyk7Ci0JaWYgKGh0dHBzX3NvY2sgPj0gMCkgewotCQlGRF9TRVQoaHR0cHNfc29jaywgJmZkcyk7Ci0JfQotCWlmIChodHRwc19zb2NrNiA+PSAwKSB7Ci0JCUZEX1NFVChodHRwc19zb2NrNiwgJmZkcyk7Ci0JCWlmIChodHRwc19zb2NrNiA+IGh0dHBzX3NvY2spIHsKLQkJCW5tYXggPSBodHRwc19zb2NrNjsKLQkJfQotCX0KLQotCXR2LnR2X3NlYyA9IDA7Ci0JdHYudHZfdXNlYyA9IDA7Ci0KLQluZmRzID0gc2VsZWN0KG5tYXgrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQotCWlmIChuZmRzIDw9IDApIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChodHRwc19zb2NrID49IDAgJiYgRkRfSVNTRVQoaHR0cHNfc29jaywgJmZkcykpIHsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfSFRUUFMpXG4iKTsKLQkJYWNjZXB0X29wZW5zc2woT1BFTlNTTF9IVFRQUywgLTEpOwotCX0KLQlpZiAoaHR0cHNfc29jazYgPj0gMCAmJiBGRF9JU1NFVChodHRwc19zb2NrNiwgJmZkcykpIHsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfSFRUUFM2KVxuIik7Ci0JCWFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfSFRUUFM2LCAtMSk7Ci0JfQotfQotCi12b2lkIG9wZW5zc2xfcG9ydChpbnQgcmVzdGFydCkgewotCWludCBzb2NrID0gLTEsIHNodXRkb3duID0gMDsKLQlzdGF0aWMgaW50IHBvcnQgPSAtMTsKLQlzdGF0aWMgaW5fYWRkcl90IGlmYWNlID0gSU5BRERSX0FOWTsKLQlpbnQgZGIgPSAwLCBmZDYgPSAtMTsKLQotCWlmICghIHNjcmVlbikgewotCQlyZmJMb2coIm9wZW5zc2xfcG9ydDogbm8gc2NyZWVuIVxuIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmIChpbmV0ZCkgewotCQlzc2xfaW5pdGlhbGl6ZWQgPSAxOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlwdjZfbGlzdGVuICYmIHNjcmVlbi0+cG9ydCA8PSAwKSB7Ci0JCWlmIChnb3RfcmZicG9ydCkgewotCQkJc2NyZWVuLT5wb3J0ID0gZ290X3JmYnBvcnRfdmFsOwotCQl9IGVsc2UgewotCQkJaW50IGFwID0gNTkwMDsKLQkJCWlmIChhdXRvX3BvcnQgPiAwKSB7Ci0JCQkJYXAgPSBhdXRvX3BvcnQ7Ci0JCQl9Ci0JCQlzY3JlZW4tPnBvcnQgPSBmaW5kX2ZyZWVfcG9ydDYoYXAsIGFwKzIwMCk7Ci0JCX0KLQkJcmZiTG9nKCJvcGVuc3NsX3BvcnQ6IHJlc2V0IHBvcnQgZnJvbSAwID0+ICVkXG4iLCBzY3JlZW4tPnBvcnQpOwotCX0KLQotCWlmIChyZXN0YXJ0KSB7Ci0JCXBvcnQgPSBzY3JlZW4tPnBvcnQ7Ci0JfSBlbHNlIGlmIChzY3JlZW4tPmxpc3RlblNvY2sgPiAtMSAmJiBzY3JlZW4tPnBvcnQgPiAwKSB7Ci0JCXBvcnQgPSBzY3JlZW4tPnBvcnQ7Ci0JCXNodXRkb3duID0gMTsKLQl9IGVsc2UgaWYgKGlwdjZfbGlzdGVuICYmIHNjcmVlbi0+cG9ydCA+IDApIHsKLQkJcG9ydCA9IHNjcmVlbi0+cG9ydDsKLQl9IGVsc2UgaWYgKHNjcmVlbi0+cG9ydCA9PSAwKSB7Ci0JCXBvcnQgPSBzY3JlZW4tPnBvcnQ7Ci0JfQotCi0JaWZhY2UgPSBzY3JlZW4tPmxpc3RlbkludGVyZmFjZTsKLQotCWlmIChzaHV0ZG93bikgewotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic2h1dHRpbmcgZG93biAlZC8lZFxuIiwKLQkJICAgIHBvcnQsIHNjcmVlbi0+bGlzdGVuU29jayk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBU19TSFVURE9XTlNPQ0tFVFMKLQkJcmZiU2h1dGRvd25Tb2NrZXRzKHNjcmVlbik7Ci0jZW5kaWYKLQl9Ci0KLQlpZiAob3BlbnNzbF9zb2NrID49IDApIHsKLQkJY2xvc2Uob3BlbnNzbF9zb2NrKTsKLQkJb3BlbnNzbF9zb2NrID0gLTE7Ci0JfQotCWlmIChvcGVuc3NsX3NvY2s2ID49IDApIHsKLQkJY2xvc2Uob3BlbnNzbF9zb2NrNik7Ci0JCW9wZW5zc2xfc29jazYgPSAtMTsKLQl9Ci0KLQlpZiAocG9ydCA8IDApIHsKLQkJcmZiTG9nKCJvcGVuc3NsX3BvcnQ6IGNvdWxkIG5vdCBvYnRhaW4gbGlzdGVuaW5nIHBvcnQgJWRcbiIsIHBvcnQpOwotCQlpZiAoIWdvdF9yZmJwb3J0ICYmICFnb3RfaXB2Nl9saXN0ZW4pIHsKLQkJCXJmYkxvZygib3BlbnNzbF9wb3J0OiBpZiB0aGlzIHN5c3RlbSBpcyBJUHY2LW9ubHksIHVzZSB0aGUgLTYgb3B0aW9uXG4iKTsKLQkJfQotCQljbGVhbl91cF9leGl0KDEpOwotCX0gZWxzZSBpZiAocG9ydCA9PSAwKSB7Ci0JCS8qIG5vIGxpc3RlbiBjYXNlLCBpLmUuIC1jb25uZWN0ICovCi0JCXNvY2sgPSAtMTsKLQl9IGVsc2UgewotCQlzb2NrID0gbGlzdGVuX3RjcChwb3J0LCBpZmFjZSwgMCk7Ci0JCWlmIChpcHY2X2xpc3RlbikgewotCQkJZmQ2ID0gbGlzdGVuNihwb3J0KTsKLQkJfSBlbHNlIGlmICghZ290X3JmYnBvcnQgJiYgIWdvdF9pcHY2X2xpc3RlbikgewotCQkJaWYgKHNvY2sgPCAwKSB7Ci0JCQkJcmZiTG9nKCJvcGVuc3NsX3BvcnQ6IGlmIHRoaXMgc3lzdGVtIGlzIElQdjYtb25seSwgdXNlIHRoZSAtNiBvcHRpb25cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChzb2NrIDwgMCkgewotCQkJaWYgKGZkNiA8IDApIHsKLQkJCQlyZmJMb2coIm9wZW5zc2xfcG9ydDogY291bGQgbm90IHJlb3BlbiBwb3J0ICVkXG4iLCBwb3J0KTsKLQkJCQlpZiAoIXJlc3RhcnQpIHsKLQkJCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygib3BlbnNzbF9wb3J0OiBJbmZvOiBsaXN0ZW5pbmcgb24gSVB2NiBvbmx5LlxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmZiTG9nKCJvcGVuc3NsX3BvcnQ6IGxpc3RlbiBvbiBwb3J0L3NvY2sgJWQvJWRcbiIsIHBvcnQsIHNvY2spOwotCWlmIChpcHY2X2xpc3RlbiAmJiBwb3J0ID4gMCkgewotCQlpZiAoZmQ2IDwgMCkgewotCQkJZmQ2ID0gbGlzdGVuNihwb3J0KTsKLQkJfQotCQlpZiAoZmQ2IDwgMCkgewotCQkJaXB2Nl9saXN0ZW4gPSAwOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJvcGVuc3NsX3BvcnQ6IGxpc3RlbiBvbiBwb3J0L3NvY2sgJWQvJWQgKGlwdjYpXG4iLAotCQkJICAgIHBvcnQsIGZkNik7Ci0JCQlvcGVuc3NsX3NvY2s2ID0gZmQ2OwotCQl9Ci0JfQotCWlmICghcXVpZXQgJiYgc29jayA+PTApIHsKLQkJYW5ub3VuY2UocG9ydCwgMSwgTlVMTCk7Ci0JfQotCW9wZW5zc2xfc29jayA9IHNvY2s7Ci0Jb3BlbnNzbF9wb3J0X251bSA9IHBvcnQ7Ci0KLQlzc2xfaW5pdGlhbGl6ZWQgPSAxOwotfQotCi12b2lkIGh0dHBzX3BvcnQoaW50IHJlc3RhcnQpIHsKLQlpbnQgc29jaywgZmQ2ID0gLTE7Ci0Jc3RhdGljIGludCBwb3J0ID0gMDsKLQlzdGF0aWMgaW5fYWRkcl90IGlmYWNlID0gSU5BRERSX0FOWTsKLQotCS8qIGFzIG9wZW5zc2xfcG9ydCBhYm92ZTogb3BlbiBhIGxpc3RlbmluZyBzb2NrZXQgZm9yIHB1cmUgaHR0cHM6ICovCi0JaWYgKGh0dHBzX3BvcnRfbnVtIDwgMCkgewotCQlyZXR1cm47Ci0JfQotCWlmICghIHNjcmVlbikgewotCQlyZmJMb2coImh0dHBzX3BvcnQ6IG5vIHNjcmVlbiFcbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQlpZiAoISBzY3JlZW4tPmh0dHBEaXIpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc2NyZWVuLT5saXN0ZW5JbnRlcmZhY2UpIHsKLQkJaWZhY2UgPSBzY3JlZW4tPmxpc3RlbkludGVyZmFjZTsKLQl9Ci0KLQlpZiAoaHR0cHNfcG9ydF9udW0gPT0gMCkgewotCQlodHRwc19wb3J0X251bSA9IGZpbmRfZnJlZV9wb3J0KDU4MDEsIDU4NTEpOwotCX0KLQlpZiAoaXB2Nl9saXN0ZW4gJiYgaHR0cHNfcG9ydF9udW0gPD0gMCkgewotCQlodHRwc19wb3J0X251bSA9IGZpbmRfZnJlZV9wb3J0Nig1ODAxLCA1ODUxKTsKLQl9Ci0JaWYgKGh0dHBzX3BvcnRfbnVtIDw9IDApIHsKLQkJcmZiTG9nKCJodHRwc19wb3J0OiBjb3VsZCBub3QgZmluZCBwb3J0ICVkXG4iLCBodHRwc19wb3J0X251bSk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCXBvcnQgPSBodHRwc19wb3J0X251bTsKLQotCWlmIChwb3J0IDw9IDApIHsKLQkJcmZiTG9nKCJodHRwc19wb3J0OiBjb3VsZCBub3Qgb2J0YWluIGxpc3RlbmluZyBwb3J0ICVkXG4iLCBwb3J0KTsKLQkJaWYgKCFyZXN0YXJ0KSB7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWlmIChodHRwc19zb2NrID49IDApIHsKLQkJY2xvc2UoaHR0cHNfc29jayk7Ci0JCWh0dHBzX3NvY2sgPSAtMTsKLQl9Ci0JaWYgKGh0dHBzX3NvY2s2ID49IDApIHsKLQkJY2xvc2UoaHR0cHNfc29jazYpOwotCQlodHRwc19zb2NrNiA9IC0xOwotCX0KLQlzb2NrID0gbGlzdGVuX3RjcChwb3J0LCBpZmFjZSwgMCk7Ci0JaWYgKHNvY2sgPCAwKSB7Ci0JCXJmYkxvZygiaHR0cHNfcG9ydDogY291bGQgbm90IG9wZW4gcG9ydCAlZFxuIiwgcG9ydCk7Ci0JCWlmIChpcHY2X2xpc3RlbikgewotCQkJZmQ2ID0gbGlzdGVuNihwb3J0KTsKLQkJfSAKLQkJaWYgKGZkNiA8IDApIHsKLQkJCWlmICghcmVzdGFydCkgewotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCX0KLQkJcmZiTG9nKCJodHRwc19wb3J0OiB0cnlpbmcgSVB2NiBvbmx5IG1vZGUuXG4iKTsKLQl9Ci0JcmZiTG9nKCJodHRwc19wb3J0OiBsaXN0ZW4gb24gcG9ydC9zb2NrICVkLyVkXG4iLCBwb3J0LCBzb2NrKTsKLQlodHRwc19zb2NrID0gc29jazsKLQotCWlmIChpcHY2X2xpc3RlbikgewotCQlpZiAoZmQ2IDwgMCkgewotCQkJZmQ2ID0gbGlzdGVuNihwb3J0KTsKLQkJfQotCQlpZiAoZmQ2IDwgMCkgewotCQkJOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJodHRwc19wb3J0OiBsaXN0ZW4gb24gcG9ydC9zb2NrICVkLyVkIChpcHY2KVxuIiwKLQkJCSAgICBwb3J0LCBmZDYpOwotCQkJaHR0cHNfc29jazYgPSBmZDY7Ci0JCX0KLQkJaWYgKGZkNiA8IDAgJiYgaHR0cHNfc29jayA8IDApIHsKLQkJCXJmYkxvZygiaHR0cHNfcG9ydDogY291bGQgbm90IGxpc3RlbiBvbiBlaXRoZXIgSVB2NCBvciBJUHY2LlxuIik7Ci0JCQlpZiAoIXJlc3RhcnQpIHsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBsb3NlX3JhbSh2b2lkKSB7Ci0JLyoKLQkgKiBmb3IgYSBmb3JrZWQgY2hpbGQgdGhhdCB3aWxsIGJlIGFyb3VuZCBmb3IgYSBsb25nIHRpbWUKLQkgKiB3aXRob3V0IGRvaW5nIGV4ZWMoKS4gIHdlIHJlYWxseSBzaG91bGQgcmUtZXhlYywgYnV0IGEgcGFpbgotCSAqIHRvIHJlZG8gYWxsIFNTTCBjdHguCi0JICovCi0JZnJlZV9vbGRfZmIoKTsKLQotCWZyZWVfdGlsZXMoKTsKLX0KLQotLyogdXRpbGl0eSB0byBrZWVwIHRyYWNrIG9mIGV4aXN0aW5nIGhlbHBlciBwcm9jZXNzZXM6ICovCi0KLXZvaWQgc3NsX2hlbHBlcl9waWQocGlkX3QgcGlkLCBpbnQgc29jaykgewotIwlkZWZpbmUgSFBTSVpFIDI1NgotCXN0YXRpYyBwaWRfdCBoZWxwZXJzW0hQU0laRV07Ci0Jc3RhdGljIGludCAgIHNvY2tldHNbSFBTSVpFXSwgZmlyc3QgPSAxOwotCWludCBpLCBlbXB0eSwgc2V0LCBzdGF0dXM7Ci0Jc3RhdGljIGludCBkYiA9IDA7Ci0KLQlpZiAoZmlyc3QpIHsKLQkJZm9yIChpPTA7IGkgPCBIUFNJWkU7IGkrKykgIHsKLQkJCWhlbHBlcnNbaV0gPSAwOwotCQkJc29ja2V0c1tpXSA9IDA7Ci0JCX0KLQkJaWYgKGdldGVudigiU1NMX0hFTFBFUl9QSURfREIiKSkgewotCQkJZGIgPSAxOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQotCWlmIChwaWQgPT0gMCkgewotCQkvKiBraWxsYWxsIG9yIHdhaXRhbGwgKi8KLQkJZm9yIChpPTA7IGkgPCBIUFNJWkU7IGkrKykgewotCQkJaWYgKGhlbHBlcnNbaV0gPT0gMCkgewotCQkJCXNvY2tldHNbaV0gPSAtMTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChraWxsKGhlbHBlcnNbaV0sIDApID09IDApIHsKLQkJCQlpbnQga3JldCA9IC0yOwotCQkJCXBpZF90IHdyZXQ7Ci0JCQkJaWYgKHNvY2sgIT0gLTIpIHsKLQkJCQkJaWYgKHNvY2tldHNbaV0gPj0gMCkgewotCQkJCQkJY2xvc2Uoc29ja2V0c1tpXSk7Ci0JCQkJCX0KLQkJCQkJa3JldCA9IGtpbGwoaGVscGVyc1tpXSwgU0lHVEVSTSk7Ci0JCQkJCWlmIChrcmV0ID09IDApIHsKLQkJCQkJCXVzbGVlcCgyMCAqIDEwMDApOwotCQkJCQl9Ci0JCQkJfQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1dBSVRfSCAmJiBMSUJWTkNTRVJWRVJfSEFWRV9XQUlUUElEIAotCQkJCXdyZXQgPSB3YWl0cGlkKGhlbHBlcnNbaV0sICZzdGF0dXMsIFdOT0hBTkcpOyAKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndhaXRwaWQoJWQpXG4iLCBoZWxwZXJzW2ldKTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgIHdhaXRyZXQxPSVkXG4iLCB3cmV0KTsKLQotCQkJCWlmIChrcmV0ID09IDAgJiYgd3JldCAhPSBoZWxwZXJzW2ldKSB7Ci0JCQkJCWludCBrOwotCQkJCQlmb3IgKGs9MDsgayA8IDEwOyBrKyspIHsKLQkJCQkJCXVzbGVlcCgxMDAgKiAxMDAwKTsKLQkJCQkJCXdyZXQgPSB3YWl0cGlkKGhlbHBlcnNbaV0sICZzdGF0dXMsIFdOT0hBTkcpOyAKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgIHdhaXRyZXQyPSVkXG4iLCB3cmV0KTsKLQkJCQkJCWlmICh3cmV0ID09IGhlbHBlcnNbaV0pIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLSNlbmRpZgotCQkJCWlmIChzb2NrID09IC0yKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWhlbHBlcnNbaV0gPSAwOwotCQkJc29ja2V0c1tpXSA9IC0xOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzc2xfaGVscGVyX3BpZCglZCwgJWQpXG4iLCBwaWQsIHNvY2spOwotCi0JLyogYWRkIChvciBkZWxldGUgZm9yIHNvY2sgPT0gLTEpICovCi0Jc2V0ID0gMDsKLQllbXB0eSA9IC0xOwotCWZvciAoaT0wOyBpIDwgSFBTSVpFOyBpKyspIHsKLQkJaWYgKGhlbHBlcnNbaV0gPT0gcGlkKSB7Ci0JCQlpZiAoc29jayA9PSAtMSkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19XQUlUX0ggJiYgTElCVk5DU0VSVkVSX0hBVkVfV0FJVFBJRCAKLQkJCQlwaWRfdCB3cmV0OwotCQkJCXdyZXQgPSB3YWl0cGlkKGhlbHBlcnNbaV0sICZzdGF0dXMsIFdOT0hBTkcpOyAKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndhaXRwaWQoJWQpIDJcbiIsIGhlbHBlcnNbaV0pOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgd2FpdHJldDE9JWRcbiIsIHdyZXQpOwotI2VuZGlmCi0JCQkJaGVscGVyc1tpXSA9IDA7Ci0JCQl9Ci0JCQlzb2NrZXRzW2ldID0gc29jazsKLQkJCXNldCA9IDE7Ci0JCX0gZWxzZSBpZiAoZW1wdHkgPT0gLTEgJiYgaGVscGVyc1tpXSA9PSAwKSB7Ci0JCQllbXB0eSA9IGk7Ci0JCX0KLQl9Ci0JaWYgKHNldCB8fCBzb2NrID09IC0xKSB7Ci0JCXJldHVybjsJLyogZG9uZSAqLwotCX0KLQotCS8qIG5vdyB0cnkgdG8gc3RvcmUgKi8KLQlpZiAoZW1wdHkgPj0gMCkgewotCQloZWxwZXJzW2VtcHR5XSA9IHBpZDsKLQkJc29ja2V0c1tlbXB0eV0gPSBzb2NrOwotCQlyZXR1cm47Ci0JfQotCWZvciAoaT0wOyBpIDwgSFBTSVpFOyBpKyspIHsKLQkJaWYgKGhlbHBlcnNbaV0gPT0gMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJLyogY2xlYXIgb3V0IHN0YWxlIHBpZHM6ICovCi0JCWlmIChraWxsKGhlbHBlcnNbaV0sIDApICE9IDApIHsKLQkJCWhlbHBlcnNbaV0gPSAwOwotCQkJc29ja2V0c1tpXSA9IC0xOwotCQkJCi0JCQlpZiAoZW1wdHkgPT0gLTEpIHsKLQkJCQllbXB0eSA9IGk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGVtcHR5ID49IDApIHsKLQkJaGVscGVyc1tlbXB0eV0gPSBwaWQ7Ci0JCXNvY2tldHNbZW1wdHldID0gc29jazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaXNfc3NsX3JlYWRhYmxlKGludCBzX2luLCBkb3VibGUgbGFzdF9odHRwcywgY2hhciAqbGFzdF9nZXQsCi0gICAgaW50IG1vZGUpIHsKLQlpbnQgbmZkLCBkYiA9IDA7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JZmRfc2V0IHJkOwotCi0JaWYgKGdldGVudigiQUNDRVBUX09QRU5TU0xfREVCVUciKSkgewotCQlkYiA9IGF0b2koZ2V0ZW52KCJBQ0NFUFRfT1BFTlNTTF9ERUJVRyIpKTsKLQl9Ci0KLQkvKgotCSAqIHdlJ2xsIGRvIGEgc2VsZWN0KCkgb24gc19pbiBmb3IgcmVhZGluZy4gIHRoaXMgaXMgbm90IGFuCi0JICogYWJzb2x1dGUgcHJvb2YgdGhhdCBTU0xfcmVhZCBpcyByZWFkeSAoWFhYIHVzZSBTU0wgdXRpbGl0eSkuCi0JICovCi0JdHYudHZfc2VjICA9IDI7Ci0JdHYudHZfdXNlYyA9IDA7Ci0KLQlpZiAobW9kZSA9PSBPUEVOU1NMX0lORVREKSB7Ci0JCS8qCi0JCSAqIGh0dHBzIHZpYSBpbmV0ZCBpcyBpY2t5IGJlY2F1c2UgeDExdm5jIGlzIHJlc3RhcnRlZAotCQkgKiBmb3IgZWFjaCBzb2NrZXQgKGFuZCBzb21lIGNsaWVudHMgc2VuZCByZXF1ZXN0cwotCQkgKiByYXBpZCBmaXJlKS4KLQkJICovCi0JCXR2LnR2X3NlYyA9IDQ7Ci0JfQotCi0JLyoKLQkgKiBpbmNyZWFzZSB0aGUgdGltZW91dCBpZiB3ZSBrbm93IEhUVFAgdHJhZmZpYyBoYXMgb2NjdXJyZWQKLQkgKiByZWNlbnRseToKLQkgKi8KLQlpZiAoZG5vdygpIDwgbGFzdF9odHRwcyArIDMwLjApIHsKLQkJdHYudHZfc2VjID0gMTA7Ci0JCWlmIChsYXN0X2dldCAmJiBzdHJzdHIobGFzdF9nZXQsICJWbmNWaWV3ZXIiKSkgewotCQkJdHYudHZfc2VjID0gNTsKLQkJfQotCX0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfSFRUUFNfVlNfVk5DX1RJTUVPVVQiKSkgewotCQl0di50dl9zZWMgID0gYXRvaShnZXRlbnYoIlgxMVZOQ19IVFRQU19WU19WTkNfVElNRU9VVCIpKTsKLQl9Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidHZfc2VjOiAlZCAtICclcydcbiIsIChpbnQpIHR2LnR2X3NlYywgbGFzdF9nZXQpOwotCi0JRkRfWkVSTygmcmQpOwotCUZEX1NFVChzX2luLCAmcmQpOwotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImlzX3NzbF9yZWFkYWJsZTogYmVnaW4gIHNlbGVjdCglZCBzZWNzKSAlLjZmXG4iLCAoaW50KSB0di50dl9zZWMsIGRub3coKSk7Ci0JZG8gewotCQluZmQgPSBzZWxlY3Qoc19pbisxLCAmcmQsIE5VTEwsIE5VTEwsICZ0dik7Ci0JfSB3aGlsZSAobmZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImlzX3NzbF9yZWFkYWJsZTogZmluaXNoIHNlbGVjdCglZCBzZWNzKSAlLjZmXG4iLCAoaW50KSB0di50dl9zZWMsIGRub3coKSk7Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiaHR0cHMgbmZkOiAlZFxuIiwgbmZkKTsKLQotCWlmIChuZmQgPD0gMCB8fCAhIEZEX0lTU0VUKHNfaW4sICZyZCkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHdhdGNoX2Zvcl9odHRwX3RyYWZmaWMoY2hhciAqYnVmX2EsIGludCAqbl9hLCBpbnQgcmF3X3NvY2spIHsKLQlpbnQgaXNfaHR0cCwgZXJyLCBuLCBuMjsKLQljaGFyICpidWY7Ci0JaW50IGRiID0gMDsKLQkvKgotCSAqIHNuaWZmIHRoZSBmaXJzdCBjb3VwbGUgYnl0ZXMgb2YgdGhlIHN0cmVhbSBhbmQgdHJ5IHRvIHNlZQotCSAqIGlmIGl0IGlzIGh0dHAgb3Igbm90LiAgaWYgd2UgcmVhZCB0aGVtIE9LLCB3ZSBtdXN0IHJlYWQgdGhlCi0JICogcmVzdCBvZiB0aGUgYXZhaWxhYmxlIGRhdGEgb3RoZXJ3aXNlIHdlIG1heSBkZWFkbG9jay4KLQkgKiB3aGF0IGhhcyBiZWVuIHJlYWQgaXMgcmV0dXJuZWQgaW4gYnVmX2EgYW5kIG5fYS4KLQkgKiAqYnVmX2EgaXMgQUJTSVpFKzEgbG9uZyBhbmQgemVyb2VkLgotCSAqLwotCWlmIChnZXRlbnYoIkFDQ0VQVF9PUEVOU1NMX0RFQlVHIikpIHsKLQkJZGIgPSBhdG9pKGdldGVudigiQUNDRVBUX09QRU5TU0xfREVCVUciKSk7Ci0JfQotCWlmICghIGJ1Zl9hIHx8ICEgbl9hKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWJ1ZiA9IChjaGFyICopIGNhbGxvYygoQUJTSVpFKzEpLCAxKTsKLQkqbl9hID0gMDsKLQotCWlmIChlbmNfc3RyICYmICFzdHJjbXAoZW5jX3N0ciwgIm5vbmUiKSkgewotCQluID0gcmVhZChyYXdfc29jaywgYnVmLCAyKTsKLQkJZXJyID0gU1NMX0VSUk9SX05PTkU7Ci0JfSBlbHNlIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJTU0wgCi0JCW4gPSBTU0xfcmVhZChzc2wsIGJ1ZiwgMik7Ci0JCWVyciA9IFNTTF9nZXRfZXJyb3Ioc3NsLCBuKTsKLSNlbHNlCi0JCWVyciA9IG4gPSAwOwotCQliYWRuZXdzKCIxIGluIHdhdGNoX2Zvcl9odHRwX3RyYWZmaWMiKTsKLSNlbmRpZgotCX0KLQotCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgfHwgbiA8IDIpIHsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlzdHJuY3B5KGJ1Zl9hLCBidWYsIG4pOwotCQkJKm5fYSA9IG47Ci0JCX0KLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndhdGNoX2Zvcl9odHRwX3RyYWZmaWMgc3NsIGVycjogJWQvJWRcbiIsIGVyciwgbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBsb29rIGZvciBHRVQsIEhFQUQsIFBPU1QsIENPTk5FQ1QgKi8KLQlpc19odHRwID0gMDsKLQlpZiAoIXN0cm5jbXAoIkdFIiwgYnVmLCAyKSkgewotCQlpc19odHRwID0gMTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCJIRSIsIGJ1ZiwgMikpIHsKLQkJaXNfaHR0cCA9IDE7Ci0JfSBlbHNlIGlmICghc3RybmNtcCgiUE8iLCBidWYsIDIpKSB7Ci0JCWlzX2h0dHAgPSAxOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoIkNPIiwgYnVmLCAyKSkgewotCQlpc19odHRwID0gMTsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIndhdGNoX2Zvcl9odHRwX3RyYWZmaWMgcmVhZDogJyVzJyAlZFxuIiwgYnVmLCBuKTsKLQotCS8qCi0JICogYmV0dGVyIHJlYWQgYWxsIHdlIGNhbiBhbmQgZndkIGl0IGFsb25nIHRvIGF2b2lkIGJsb2NraW5nCi0JICogaW4gc3NsX3hmZXIoKS4KLQkgKi8KLQotCWlmIChlbmNfc3RyICYmICFzdHJjbXAoZW5jX3N0ciwgIm5vbmUiKSkgewotCQluMiA9IHJlYWQocmF3X3NvY2ssIGJ1ZiArIG4sIEFCU0laRSAtIG4pOwotCX0gZWxzZSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMIAotCQluMiA9IFNTTF9yZWFkKHNzbCwgYnVmICsgbiwgQUJTSVpFIC0gbik7Ci0jZWxzZQotCQluMiA9IDA7Ci0JCWJhZG5ld3MoIjIgaW4gd2F0Y2hfZm9yX2h0dHBfdHJhZmZpYyIpOwotI2VuZGlmCi0JfQotCWlmIChuMiA+PSAwKSB7Ci0JCW4gKz0gbjI7Ci0JfQotCi0JKm5fYSA9IG47Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAid2F0Y2hfZm9yX2h0dHBfdHJhZmZpYyByZWFkbW9yZTogJWRcbiIsIG4yKTsKLQotCWlmIChuID4gMCkgewotCQltZW1jcHkoYnVmX2EsIGJ1Ziwgbik7Ci0JfQotCWlmIChkYiA+IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ3YXRjaF9mb3JfaHR0cF90cmFmZmljIHJlYWRtb3JlOiAiKTsKLQkJd3JpdGUoMiwgYnVmX2EsICpuX2EpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ3YXRjaF9mb3JfaHR0cF90cmFmZmljIHJldHVybjogJWRcbiIsIGlzX2h0dHApOwotCXJldHVybiBpc19odHRwOwotfQotCi1zdGF0aWMgaW50IGNzb2NrX3RpbWVvdXRfc29jayA9IC0xOwotCi1zdGF0aWMgdm9pZCBjc29ja190aW1lb3V0IChpbnQgc2lnKSB7Ci0JcmZiTG9nKCJzaWc6ICVkLCBjc29ja190aW1lb3V0LlxuIiwgc2lnKTsKLQlpZiAoY3NvY2tfdGltZW91dF9zb2NrID49IDApIHsKLQkJY2xvc2UoY3NvY2tfdGltZW91dF9zb2NrKTsKLQkJY3NvY2tfdGltZW91dF9zb2NrID0gLTE7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX3NzbF9hY2Nlc3MoY2hhciAqYWRkcikgewotCXN0YXRpYyBjaGFyICpzYXZlX2FsbG93X29uY2UgPSBOVUxMOwotCXN0YXRpYyB0aW1lX3QgdGltZV9hbGxvd19vbmNlID0gMDsKLQotCS8qIGR1ZSB0byAiRmV0Y2ggQ2VydCIgYWN0aXZpdGllcyBmb3IgU1NMIHJlYWxseSBuZWVkIHRvICJhbGxvdyB0d2ljZSIgKi8KLQlpZiAoYWxsb3dfb25jZSAhPSBOVUxMKSB7Ci0JCXNhdmVfYWxsb3dfb25jZSA9IHN0cmR1cChhbGxvd19vbmNlKTsKLQkJdGltZV9hbGxvd19vbmNlID0gdGltZShOVUxMKTsKLQl9IGVsc2UgaWYgKHNhdmVfYWxsb3dfb25jZSAhPSBOVUxMKSB7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19OT19TU0xfQUxMT1dfVFdJQ0UiKSkgewotCQkJOwotCQl9IGVsc2UgaWYgKHRpbWUoTlVMTCkgPCB0aW1lX2FsbG93X29uY2UgKyAzMCkgewotCQkJLyogZ2l2ZSB0aGVtIDMwIHNlY3MgdG8gY2hlY2sgYW5kIHNhdmUgdGhlIGZldGNoZWQgY2VydC4gKi8KLQkJCWFsbG93X29uY2UgPSBzYXZlX2FsbG93X29uY2U7IAotCQkJcmZiTG9nKCJTU0w6IFBlcm1pdHRpbmcgMzAgc2VjIGdyYWNlIHBlcmlvZCBmb3IgYWxsb3dvbmNlLlxuIik7Ci0JCQlyZmJMb2coIlNTTDogU2V0IFgxMVZOQ19OT19TU0xfQUxMT1dfVFdJQ0U9MSB0byBkaXNhYmxlLlxuIik7Ci0JCX0KLQkJc2F2ZV9hbGxvd19vbmNlID0gTlVMTDsKLQkJdGltZV9hbGxvd19vbmNlID0gMDsKLQl9Ci0KLQlyZXR1cm4gY2hlY2tfYWNjZXNzKGFkZHIpOwotfQotCi12b2lkIGFjY2VwdF9vcGVuc3NsKGludCBtb2RlLCBpbnQgcHJlc29jaykgewotCWludCBzb2NrID0gLTEsIGxpc3RlbiA9IC0xLCBjcG9ydCwgY3NvY2ssIHZzb2NrOwkKLQlpbnQgcGVlcnBvcnQgPSAwOwotCWludCBzdGF0dXMsIG4sIGksIGRiID0gMDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSNpZmRlZiBfX2hwdXgKLQlpbnQgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLSNlbHNlCi0Jc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0jZW5kaWYKLQlyZmJDbGllbnRQdHIgY2xpZW50OwotCXBpZF90IHBpZDsKLQljaGFyIHVuaXFbXSA9ICJfZXZpbHJhdHNfIjsKLQljaGFyIGNvb2tpZVsyNTZdLCByY29va2llWzI1Nl0sICpuYW1lID0gTlVMTDsKLQlpbnQgdmVuY3J5cHRfc2VsID0gMDsKLQlpbnQgYW5vbnRsc19zZWwgPSAwOwotCWNoYXIgKmlwdjZfbmFtZSA9IE5VTEw7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X2h0dHBzID0gMC4wOwotCXN0YXRpYyBjaGFyIGxhc3RfZ2V0WzI1Nl07Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JdW5zaWduZWQgY2hhciAqcmI7Ci0KLSNpZiAhTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMIAotCWlmIChlbmNfc3RyID09IE5VTEwgfHwgc3RyY21wKGVuY19zdHIsICJub25lIikpIHsKLQkJYmFkbmV3cygiMCBhY2NlcHRfb3BlbnNzbCIpOwotCX0KLSNlbmRpZgotCi0Jb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQgPSAwOwotCi0JLyogemVybyBidWZmZXJzIGZvciB1c2UgYmVsb3cuICovCi0JZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJaWYgKGZpcnN0KSB7Ci0JCQlsYXN0X2dldFtpXSA9ICdcMCc7Ci0JCX0KLQkJY29va2llW2ldICA9ICdcMCc7Ci0JCXJjb29raWVbaV0gPSAnXDAnOwotCX0KLQlmaXJzdCA9IDA7Ci0KLQlpZiAoZ2V0ZW52KCJBQ0NFUFRfT1BFTlNTTF9ERUJVRyIpKSB7Ci0JCWRiID0gYXRvaShnZXRlbnYoIkFDQ0VQVF9PUEVOU1NMX0RFQlVHIikpOwotCX0KLQotCS8qIGRvIElORVRELCBWTkMsIG9yIEhUVFBTIGNhc2VzIChyZXN1bHQgaXMgY2xpZW50IHNvY2tldCBvciBwaXBlKSAqLwotCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQpIHsKLQkJc3NsX2luaXRpYWxpemVkID0gMTsKLQotCX0gZWxzZSBpZiAobW9kZSA9PSBPUEVOU1NMX1ZOQykgewotCQlzb2NrID0gYWNjZXB0KG9wZW5zc2xfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCWlmIChzb2NrIDwgMCkgIHsKLQkJCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogYWNjZXB0IGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKLQkJCXJmYkxvZ1BlcnJvcigiYWNjZXB0Iik7Ci0JCQlpZiAoc3NsX25vX2ZhaWwpIHsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RlbiA9IG9wZW5zc2xfc29jazsKLQotCX0gZWxzZSBpZiAobW9kZSA9PSBPUEVOU1NMX1ZOQzYgfHwgbW9kZSA9PSBPUEVOU1NMX0hUVFBTNikgewotI2lmIFgxMVZOQ19JUFY2Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgYTY7Ci0JCXNvY2tsZW5fdCBhNmxlbiA9IHNpemVvZihhNik7Ci0JCWludCBmZCA9IChtb2RlID09IE9QRU5TU0xfVk5DNiA/IG9wZW5zc2xfc29jazYgOiBodHRwc19zb2NrNik7IAotCi0JCXNvY2sgPSBhY2NlcHQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYTYsICZhNmxlbik7Ci0JCWlmIChzb2NrIDwgMCkgIHsKLQkJCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogYWNjZXB0IGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKLQkJCXJmYkxvZ1BlcnJvcigiYWNjZXB0Iik7Ci0JCQlpZiAoc3NsX25vX2ZhaWwpIHsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlwdjZfbmFtZSA9IGlwdjZfZ2V0aXBhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmYTYsIGE2bGVuKTsKLQkJaWYgKCFpcHY2X25hbWUpIGlwdjZfbmFtZSA9IHN0cmR1cCgidW5rbm93biIpOwotCQlsaXN0ZW4gPSBmZDsKLSNlbmRpZgotCX0gZWxzZSBpZiAobW9kZSA9PSBPUEVOU1NMX1JFVkVSU0UpIHsKLQkJc29jayA9IHByZXNvY2s7Ci0JCWlmIChzb2NrIDwgMCkgIHsKLQkJCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogY29ubmVjdGlvbiBmYWlsZWRcbiIpOwotCQkJaWYgKHNzbF9ub19mYWlsKSB7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0ZW52KCJPUEVOU1NMX1JFVkVSU0VfREVCVUciKSkgZnByaW50ZihzdGRlcnIsICJPUEVOU1NMX1JFVkVSU0U6IGlwdjZfY2xpZW50X2lwX3N0cjogJXNcbiIsIGlwdjZfY2xpZW50X2lwX3N0cik7Ci0JCWlmIChpcHY2X2NsaWVudF9pcF9zdHIgIT0gTlVMTCkgewotCQkJaXB2Nl9uYW1lID0gc3RyZHVwKGlwdjZfY2xpZW50X2lwX3N0cik7Ci0JCX0KLQkJbGlzdGVuID0gLTE7Ci0KLQl9IGVsc2UgaWYgKG1vZGUgPT0gT1BFTlNTTF9IVFRQUykgewotCQlzb2NrID0gYWNjZXB0KGh0dHBzX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOwotCQlpZiAoc29jayA8IDApICB7Ci0JCQlyZmJMb2coIlNTTDogYWNjZXB0X29wZW5zc2w6IGFjY2VwdCBjb25uZWN0aW9uIGZhaWxlZFxuIik7Ci0JCQlyZmJMb2dQZXJyb3IoImFjY2VwdCIpOwotCQkJaWYgKHNzbF9ub19mYWlsKSB7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlsaXN0ZW4gPSBodHRwc19zb2NrOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiU1NMOiBhY2NlcHRfb3BlbnNzbDogc29jazogJWRcbiIsIHNvY2spOwotCi0JaWYgKG9wZW5zc2xfbGFzdF9pcCkgewotCQlmcmVlKG9wZW5zc2xfbGFzdF9pcCk7Ci0JCW9wZW5zc2xfbGFzdF9pcCA9IE5VTEw7Ci0JfQotCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQpIHsKLQkJb3BlbnNzbF9sYXN0X2lwID0gZ2V0X3JlbW90ZV9ob3N0KGZpbGVubyhzdGRpbikpOwotCX0gZWxzZSBpZiAobW9kZSA9PSBPUEVOU1NMX1ZOQzYgfHwgbW9kZSA9PSBPUEVOU1NMX0hUVFBTNikgewotCQlvcGVuc3NsX2xhc3RfaXAgPSBpcHY2X25hbWU7Ci0JfSBlbHNlIGlmIChtb2RlID09IE9QRU5TU0xfUkVWRVJTRSAmJiBpcHY2X25hbWUgIT0gTlVMTCkgewotCQlvcGVuc3NsX2xhc3RfaXAgPSBpcHY2X25hbWU7Ci0JfSBlbHNlIHsKLQkJb3BlbnNzbF9sYXN0X2lwID0gZ2V0X3JlbW90ZV9ob3N0KHNvY2spOwotCX0KLQotCWlmICghY2hlY2tfc3NsX2FjY2VzcyhvcGVuc3NsX2xhc3RfaXApKSB7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogZGVueWluZyBjbGllbnQgJXNcbiIsIG9wZW5zc2xfbGFzdF9pcCk7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogZG9lcyBub3QgbWF0Y2ggLWFsbG93IG9yIG90aGVyIHJlYXNvbi5cbiIpOwotCQljbG9zZShzb2NrKTsKLQkJc29jayA9IC0xOwotCQlpZiAoc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qIG5vdyBtYWtlIGEgbGlzdGVuaW5nIHNvY2tldCBmb3IgY2hpbGQgdG8gY29ubmVjdCBiYWNrIHRvIHVzIGJ5OiAqLwotCi0JY3BvcnQgPSBmaW5kX2ZyZWVfcG9ydCgyMDAwMCwgMjIwMDApOwotCWlmICghIGNwb3J0ICYmIGlwdjZfbGlzdGVuKSB7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogc2Vla2luZyBJUHY2IHBvcnQuXG4iKTsKLQkJY3BvcnQgPSBmaW5kX2ZyZWVfcG9ydDYoMjAwMDAsIDIyMDAwKTsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsOiBJUHY2IHBvcnQ6ICVkXG4iLCBjcG9ydCk7Ci0JfQotCWlmICghIGNwb3J0KSB7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogY291bGQgbm90IGZpbmQgb3BlbiBwb3J0LlxuIik7Ci0JCWNsb3NlKHNvY2spOwotCQlpZiAobW9kZSA9PSBPUEVOU1NMX0lORVREIHx8IHNzbF9ub19mYWlsKSB7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImFjY2VwdF9vcGVuc3NsOiBjcG9ydDogJWRcbiIsIGNwb3J0KTsKLQotCWNzb2NrID0gbGlzdGVuX3RjcChjcG9ydCwgaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwgMSk7Ci0KLQlpZiAoY3NvY2sgPCAwKSB7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogY291bGQgbm90IGxpc3RlbiBvbiBwb3J0ICVkLlxuIiwKLQkJICAgIGNwb3J0KTsKLQkJY2xvc2Uoc29jayk7Ci0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQgfHwgc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYWNjZXB0X29wZW5zc2w6IGNzb2NrOiAlZFxuIiwgY3NvY2spOwotCi0JZmZsdXNoKHN0ZGVycik7Ci0KLQkvKgotCSAqIG1ha2UgYSBzaW1wbGUgY29va2llIHRvIGlkIHRoZSBjaGlsZCBzb2NrZXQsIG5vdCBmb29scHJvb2YKLQkgKiBidXQgaGFyZCB0byBndWVzcyBleGFjdGx5IChqdXN0IHdvcnJ5aW5nIGFib3V0IGxvY2FsIGx1c2VycwotCSAqIGhlcmUsIHNpbmNlIHdlIHVzZSBJTkFERFJfTE9PUEJBQ0spLgotCSAqLwotCXJiID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jKDYsIDEpOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlNTTCAKLQlSQU5EX2J5dGVzKHJiLCA2KTsKLSNlbmRpZgotCXNwcmludGYoY29va2llLCAiUkI9JWQlZCVkJWQlZCVkLyVmJWYvJXAiLAotCSAgICByYlswXSwgcmJbMV0sIHJiWzJdLCByYlszXSwgcmJbNF0sIHJiWzVdLAotICAgICAgICAgICAgZG5vdygpIC0geDExdm5jX3N0YXJ0LCB4MTF2bmNfc3RhcnQsICh2b2lkICopcmIpOwotCi0JaWYgKG1vZGUgPT0gT1BFTlNTTF9WTkM2KSB7Ci0JCW5hbWUgPSBzdHJkdXAoaXB2Nl9uYW1lKTsKLQkJcGVlcnBvcnQgPSBnZXRfcmVtb3RlX3BvcnQoc29jayk7Ci0JfSBlbHNlIGlmIChtb2RlID09IE9QRU5TU0xfUkVWRVJTRSAmJiBpcHY2X25hbWUgIT0gTlVMTCkgewotCQluYW1lID0gc3RyZHVwKGlwdjZfbmFtZSk7Ci0JCXBlZXJwb3J0ID0gZ2V0X3JlbW90ZV9wb3J0KHNvY2spOwotCX0gZWxzZSBpZiAobW9kZSAhPSBPUEVOU1NMX0lORVREKSB7Ci0JCW5hbWUgPSBnZXRfcmVtb3RlX2hvc3Qoc29jayk7Ci0JCXBlZXJwb3J0ID0gZ2V0X3JlbW90ZV9wb3J0KHNvY2spOwotCX0gZWxzZSB7Ci0JCW9wZW5zc2xfbGFzdF9pcCA9IGdldF9yZW1vdGVfaG9zdChmaWxlbm8oc3RkaW4pKTsKLQkJcGVlcnBvcnQgPSBnZXRfcmVtb3RlX3BvcnQoZmlsZW5vKHN0ZGluKSk7Ci0JCWlmIChvcGVuc3NsX2xhc3RfaXApIHsKLQkJCW5hbWUgPSBzdHJkdXAob3BlbnNzbF9sYXN0X2lwKTsKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBzdHJkdXAoInVua25vd24iKTsKLQkJfQotCX0KLQlpZiAobmFtZSkgewotCQlpZiAobW9kZSA9PSBPUEVOU1NMX0lORVREKSB7Ci0JCQlyZmJMb2coIlNTTDogKGluZXRkKSBzcGF3bmluZyBoZWxwZXIgcHJvY2VzcyAiCi0JCQkgICAgInRvIGhhbmRsZTogJXM6JWRcbiIsIG5hbWUsIHBlZXJwb3J0KTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiU1NMOiBzcGF3bmluZyBoZWxwZXIgcHJvY2VzcyB0byBoYW5kbGU6ICIKLQkJCSAgICAiJXM6JWRcbiIsIG5hbWUsIHBlZXJwb3J0KTsKLQkJfQotCQlmcmVlKG5hbWUpOwotCQluYW1lID0gTlVMTDsKLQl9Ci0KLQlpZiAoY2VydHJldCkgewotCQlmcmVlKGNlcnRyZXQpOwotCX0KLQlpZiAoY2VydHJldF9zdHIpIHsKLQkJZnJlZShjZXJ0cmV0X3N0cik7Ci0JCWNlcnRyZXRfc3RyID0gTlVMTDsKLQl9Ci0JY2VydHJldCA9IHN0cmR1cCgiL3RtcC94MTF2bmMtY2VydHJldC5YWFhYWFgiKTsKLQlvbW9kZSA9IHVtYXNrKDA3Nyk7Ci0JY2VydHJldF9mZCA9IG1rc3RlbXAoY2VydHJldCk7Ci0JdW1hc2sob21vZGUpOwotCWlmIChjZXJ0cmV0X2ZkIDwgMCkgewotCQlmcmVlKGNlcnRyZXQpOwotCQljZXJ0cmV0ID0gTlVMTDsKLQkJY2VydHJldF9mZCA9IC0xOwotCX0KLQotCWlmIChkaHJldCkgewotCQlmcmVlKGRocmV0KTsKLQl9Ci0JaWYgKGRocmV0X3N0cikgewotCQlmcmVlKGRocmV0X3N0cik7Ci0JCWRocmV0X3N0ciA9IE5VTEw7Ci0JfQotCWRocmV0ID0gc3RyZHVwKCIvdG1wL3gxMXZuYy1kaHJldC5YWFhYWFgiKTsKLQlvbW9kZSA9IHVtYXNrKDA3Nyk7Ci0JZGhyZXRfZmQgPSBta3N0ZW1wKGRocmV0KTsKLQl1bWFzayhvbW9kZSk7Ci0JaWYgKGRocmV0X2ZkIDwgMCkgewotCQlmcmVlKGRocmV0KTsKLQkJZGhyZXQgPSBOVUxMOwotCQlkaHJldF9mZCA9IC0xOwotCX0KLQotCS8qIG5vdyBmb3JrIHRoZSBjaGlsZCB0byBoYW5kbGUgdGhlIFNTTDogKi8KLQlwaWQgPSBmb3JrKCk7Ci0KLQlpZiAocGlkID4gMCkgewotCQlyZmJMb2coIlNTTDogaGVscGVyIGZvciBwZWVycG9ydCAlZCBpcyBwaWQgJWQ6IFxuIiwKLQkJICAgIHBlZXJwb3J0LCAoaW50KSBwaWQpOwotCX0KLQotCWlmIChwaWQgPCAwKSB7Ci0JCXJmYkxvZygiU1NMOiBhY2NlcHRfb3BlbnNzbDogY291bGQgbm90IGZvcmsuXG4iKTsKLQkJcmZiTG9nUGVycm9yKCJmb3JrIik7Ci0JCWNsb3NlKHNvY2spOwotCQljbG9zZShjc29jayk7Ci0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQgfHwgc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCi0JfSBlbHNlIGlmIChwaWQgPT0gMCkgewotCQlpbnQgc19pbiwgc19vdXQsIGh0dHBzb2NrID0gLTE7Ci0JCWludCB2bmNzb2NrOwotCQlpbnQgaSwgaGF2ZV9odHRwZCA9IDA7Ci0JCWludCBmX2luICA9IGZpbGVubyhzdGRpbik7Ci0JCWludCBmX291dCA9IGZpbGVubyhzdGRvdXQpOwotCQlpbnQgc2tpcF92bmNfdGxzID0gbW9kZSA9PSBPUEVOU1NMX0hUVFBTID8gMSA6IDA7Ci0KLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImhlbHBlciBwaWQgaW46ICVkICVkICVkICVkXG4iLCBmX2luLCBmX291dCwgc29jaywgbGlzdGVuKTsKLQotCQkvKiByZXNldCBhbGwgaGFuZGxlcnMgdG8gZGVmYXVsdCAobm8gaW50ZXJydXB0ZWQoKSBjYWxscykgKi8KLQkJdW5zZXRfc2lnbmFscygpOwotCi0JCS8qIGNsb3NlIGFsbCBub24tZXNzZW50aWFsIGZkJ3MgKi8KLQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQpIHsKLQkJCQlpZiAoaSA9PSBmX2luIHx8IGkgPT0gZl9vdXQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGkgPT0gc29jaykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGkgPT0gMikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xvc2UoaSk7Ci0JCX0KLQotCQkvKgotCQkgKiBzYWRseSwgd2UgYXJlIGEgbG9uZyBsaXZlZCBjaGlsZCBhbmQgc28gdGhlIGxhcmdlCi0JCSAqIGZyYW1lYnVmZmVyIG1lbW9yeSBhcmVhcyB3aWxsIHNvb24gZGlmZmVyIGZyb20gcGFyZW50LgotCQkgKiB0cnkgdG8gZnJlZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgotCQkgKi8KLQkJbG9zZV9yYW0oKTsKLQotCQkvKiBub3cgY29ubmVjdCBiYWNrIHRvIHBhcmVudCBzb2NrZXQ6ICovCi0JCXZuY3NvY2sgPSBjb25uZWN0X3RjcCgiMTI3LjAuMC4xIiwgY3BvcnQpOwotCQlpZiAodm5jc29jayA8IDApIHsKLQkJCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogY291bGQgbm90IGNvbm5lY3QiCi0JCQkgICAgIiBiYWNrIHRvOiAlZFxuIiwgZ2V0cGlkKCksIGNwb3J0KTsKLQkJCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogZXhpdCBjYXNlIDEgKG5vIGxvY2FsIHZuY3NvY2spXG4iLCBnZXRwaWQoKSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ2bmNzb2NrICVkXG4iLCB2bmNzb2NrKTsKLQotCQkvKiB0cnkgdG8gaW5pdGlhbGl6ZSBTU0wgd2l0aCB0aGUgcmVtb3RlIGNsaWVudCAqLwotCi0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQpIHsKLQkJCXNfaW4gID0gZmlsZW5vKHN0ZGluKTsKLQkJCXNfb3V0ID0gZmlsZW5vKHN0ZG91dCk7Ci0JCX0gZWxzZSB7Ci0JCQlzX2luID0gc19vdXQgPSBzb2NrOwotCQl9Ci0KLQkJaWYgKCEgc3NsX2luaXQoc19pbiwgc19vdXQsIHNraXBfdm5jX3RscywgbGFzdF9odHRwcykpIHsKLQkJCWNsb3NlKHZuY3NvY2spOwotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBleGl0IGNhc2UgMiAoc3NsX2luaXQgZmFpbGVkKVxuIiwgZ2V0cGlkKCkpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCWlmICh2ZW5jcnlwdF9zZWxlY3RlZCAhPSAwKSB7Ci0JCQljaGFyICp0YnVmOwotCQkJdGJ1ZiA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29va2llKSArIDEwMCk7Ci0JCQlzcHJpbnRmKHRidWYsICIlcyxWRU5DUllQVD0lZCwlcyIsIHVuaXEsIHZlbmNyeXB0X3NlbGVjdGVkLCBjb29raWUpOwotCQkJd3JpdGUodm5jc29jaywgdGJ1Ziwgc3RybGVuKGNvb2tpZSkpOwotCQkJZ290byB3cm90ZV9jb29raWU7Ci0JCX0gZWxzZSBpZiAoYW5vbnRsc19zZWxlY3RlZCAhPSAwKSB7Ci0JCQljaGFyICp0YnVmOwotCQkJdGJ1ZiA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29va2llKSArIDEwMCk7Ci0JCQlzcHJpbnRmKHRidWYsICIlcyxBTk9OVExTPSVkLCVzIiwgdW5pcSwgYW5vbnRsc19zZWxlY3RlZCwgY29va2llKTsKLQkJCXdyaXRlKHZuY3NvY2ssIHRidWYsIHN0cmxlbihjb29raWUpKTsKLQkJCWdvdG8gd3JvdGVfY29va2llOwotCQl9Ci0KLQkJLyoKLQkJICogdGhpbmdzIGdldCBtZXNzeSBiZWxvdyBzaW5jZSB3ZSBhcmUgdHJ5aW5nIHRvIGRvCi0JCSAqICpib3RoKiBWTkMgYW5kIEphdmEgYXBwbGV0IGh0dHBkIHRocm91Z2ggdGhlIHNhbWUKLQkJICogU1NMIHNvY2tldC4KLQkJICovCi0KLQkJaWYgKCEgc2NyZWVuKSB7Ci0JCQljbG9zZSh2bmNzb2NrKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJaWYgKHNjcmVlbi0+aHR0cExpc3RlblNvY2sgPj0gMCAmJiBzY3JlZW4tPmh0dHBQb3J0ID4gMCkgewotCQkJaGF2ZV9odHRwZCA9IDE7Ci0JCX0gZWxzZSBpZiAoaXB2Nl9odHRwX2ZkID49IDApIHsKLQkJCWhhdmVfaHR0cGQgPSAxOwotCQl9IGVsc2UgaWYgKHNjcmVlbi0+aHR0cExpc3RlblNvY2sgPT0gLTIpIHsKLQkJCWhhdmVfaHR0cGQgPSAxOwotCQl9Ci0JCWlmIChtb2RlID09IE9QRU5TU0xfSFRUUFMgJiYgISBoYXZlX2h0dHBkKSB7Ci0JCQlyZmJMb2coIlNTTDogYWNjZXB0X29wZW5zc2xbJWRdOiBubyBodHRwZCBzb2NrZXQgZm9yICIKLQkJCSAgICAiLWh0dHBzIG1vZGVcbiIsIGdldHBpZCgpKTsKLQkJCWNsb3NlKHZuY3NvY2spOwotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBleGl0IGNhc2UgMyAobm8gaHR0cGQgc29jaylcbiIsIGdldHBpZCgpKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQotCQlpZiAoaGF2ZV9odHRwZCkgewotCQkJaW50IG4gPSAwLCBpc19odHRwID0gMDsKLQkJCWludCBocG9ydCA9IHNjcmVlbi0+aHR0cFBvcnQ7IAotCQkJY2hhciAqaWZhY2UgPSBOVUxMOwotCQkJY2hhciAqYnVmLCAqdGJ1ZjsKLQotCQkJYnVmICA9IChjaGFyICopIGNhbGxvYygoQUJTSVpFKzEpLCAxKTsKLQkJCXRidWYgPSAoY2hhciAqKSBjYWxsb2MoKDIqQUJTSVpFKzEpLCAxKTsKLQotCQkJaWYgKG1vZGUgPT0gT1BFTlNTTF9IVFRQUykgewotCQkJCS8qCi0JCQkJICogZm9yIHRoaXMgbW9kZSB3ZSBrbm93IGl0IGlzIEhUVFAgdHJhZmZpYwotCQkJCSAqIHNvIHdlIHNraXAgdHJ5aW5nIHRvIGd1ZXNzLgotCQkJCSAqLwotCQkJCWlzX2h0dHAgPSAxOwotCQkJCW4gPSAwOwotCQkJCWdvdG8gY29ubmVjdF90b19odHRwZDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENoZWNrIGlmIHRoZXJlIGlzIHN0dWZmIHRvIHJlYWQgZnJvbSByZW1vdGUgZW5kCi0JCQkgKiBpZiBzbyBpdCBpcyBsaWtlbHkgYSBHRVQgb3IgSEVBRC4KLQkJCSAqLwotCQkJaWYgKCEgaXNfc3NsX3JlYWRhYmxlKHNfaW4sIGxhc3RfaHR0cHMsIGxhc3RfZ2V0LAotCQkJICAgIG1vZGUpKSB7Ci0JCQkJZ290byB3cml0ZV9jb29raWU7Ci0JCQl9Ci0JCi0JCQkvKiAKLQkJCSAqIHJlYWQgZmlyc3QgMiBieXRlcyB0byB0cnkgdG8gZ3Vlc3MuICBzYWRseSwKLQkJCSAqIHRoZSB1c2VyIGlzIG9mdGVuIHBvbmRlcmluZyBhICJub24tdmVyaWZpZWQKLQkJCSAqIGNlcnQiIGRpYWxvZyBmb3IgYSBsb25nIHRpbWUgYmVmb3JlIHRoZSBHRVQKLQkJCSAqIGlzIGV2ZXIgc2VudC4gIFNvIG9mdGVuIHdlIHRpbWVvdXQgaGVyZS4KLQkJCSAqLwotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAid2F0Y2hfZm9yX2h0dHBfdHJhZmZpY1xuIik7Ci0KLQkJCWlzX2h0dHAgPSB3YXRjaF9mb3JfaHR0cF90cmFmZmljKGJ1ZiwgJm4sIHNfaW4pOwotCi0JCQlpZiAoaXNfaHR0cCA8IDAgfHwgaXNfaHR0cCA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBlcnJvciBvciBodHRwIG5vdCBkZXRlY3RlZCwgZmFsbCBiYWNrCi0JCQkJICogdG8gbm9ybWFsIFZOQyBzb2NrZXQuCi0JCQkJICovCi0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImlzX2h0dHAgZXJyOiAlZCBuOiAlZFxuIiwgaXNfaHR0cCwgbik7Ci0JCQkJd3JpdGUodm5jc29jaywgY29va2llLCBzdHJsZW4oY29va2llKSk7Ci0JCQkJaWYgKG4gPiAwKSB7Ci0JCQkJCXdyaXRlKHZuY3NvY2ssIGJ1Ziwgbik7Ci0JCQkJfQotCQkJCWdvdG8gd3JvdGVfY29va2llOwotCQkJfQotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiaXNfaHR0cDogJWQgbjogJWRcbiIsCi0JCQkgICAgaXNfaHR0cCwgbik7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnVmOiAnJXMnXG4iLCBidWYpOwotCi0JCQlpZiAoc3Ryc3RyKGJ1ZiwgIi9yZXF1ZXN0Lmh0dHBzLnZuYy5jb25uZWN0aW9uIikpIHsKLQkJCQljaGFyIHJlcGx5W10gPSAiSFRUUC8xLjAgMjAwIE9LXHJcbiIKLQkJCQkgICAgIkNvbnRlbnQtVHlwZTogb2N0ZXQtc3RyZWFtXHJcbiIKLQkJCQkgICAgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIgotCQkJCSAgICAiVk5DLVNlcnZlcjogeDExdm5jXHJcbiIKLQkJCQkgICAgIlByYWdtYTogbm8tY2FjaGVcclxuXHJcbiI7Ci0JCQkJLyoKLQkJCQkgKiBzcGVjaWFsIGNhc2UgcHJveHkgY29taW5nIHRocnUgaHR0cHMKLQkJCQkgKiBpbnN0ZWFkIG9mIGEgZGlyZWN0IFNTTCBjb25uZWN0aW9uLgotCQkJCSAqLwotCQkJCXJmYkxvZygiSGFuZGxpbmcgVk5DIHJlcXVlc3QgdmlhIGh0dHBzIEdFVC4gWyVkXVxuIiwgZ2V0cGlkKCkpOwotCQkJCXJmYkxvZygiLS0gJXNcbiIsIGJ1Zik7Ci0KLQkJCQlpZiAoc3Ryc3RyKGJ1ZiwgIi9yZXZlcnNlLnByb3h5IikpIHsKLQkJCQkJY2hhciAqYnVmMjsKLQkJCQkJaW50IG4sIHB0cjsKLSNpZiAhTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMCi0JCQkJCXdyaXRlKHNfb3V0LCByZXBseSwgc3RybGVuKHJlcGx5KSk7Ci0jZWxzZQotCQkJCQlTU0xfd3JpdGUoc3NsLCByZXBseSwgc3RybGVuKHJlcGx5KSk7Ci0jZW5kaWYKLQkJCQkKLQkJCQkJYnVmMiAgPSAoY2hhciAqKSBjYWxsb2MoKDgxOTIrMSksIDEpOwotCQkJCQluID0gMDsKLQkJCQkJcHRyID0gMDsKLQkJCQkJd2hpbGUgKHB0ciA8IDgxOTIpIHsKLSNpZiAhTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMCi0JCQkJCQluID0gcmVhZChzX2luLCBidWYyICsgcHRyLCAxKTsKLSNlbHNlCi0JCQkJCQluID0gU1NMX3JlYWQoc3NsLCBidWYyICsgcHRyLCAxKTsKLSNlbmRpZgotCQkJCQkJaWYgKG4gPiAwKSB7Ci0JCQkJCQkJcHRyICs9IG47Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnVmMjogJyVzJ1xuIiwgYnVmMik7Ci0KLQkJCQkJCWlmIChzdHJzdHIoYnVmMiwgIlxyXG5cclxuIikpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmcmVlKGJ1ZjIpOwotCQkJCX0KLQkJCQlnb3RvIHdyaXRlX2Nvb2tpZTsKLQotCQkJfSBlbHNlIGlmIChzdHJzdHIoYnVmLCAiL2NoZWNrLmh0dHBzLnByb3h5LmNvbm5lY3Rpb24iKSkgewotCQkJCWNoYXIgcmVwbHlbXSA9ICJIVFRQLzEuMCAyMDAgT0tcclxuIgotCQkJCSAgICAiQ29ubmVjdGlvbjogY2xvc2VcclxuIgotCQkJCSAgICAiQ29udGVudC1UeXBlOiBvY3RldC1zdHJlYW1cclxuIgotCQkJCSAgICAiVk5DLVNlcnZlcjogeDExdm5jXHJcbiIKLQkJCQkgICAgIlByYWdtYTogbm8tY2FjaGVcclxuXHJcbiI7Ci0KLQkJCQlyZmJMb2coIkhhbmRsaW5nIENoZWNrIEhUVFBTIHJlcXVlc3QgdmlhIGh0dHBzIEdFVC4gWyVkXVxuIiwgZ2V0cGlkKCkpOwotCQkJCXJmYkxvZygiLS0gJXNcbiIsIGJ1Zik7Ci0KLSNpZiAhTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMCi0JCQkJd3JpdGUoc19vdXQsIHJlcGx5LCBzdHJsZW4ocmVwbHkpKTsKLSNlbHNlCi0JCQkJU1NMX3dyaXRlKHNzbCwgcmVwbHksIHN0cmxlbihyZXBseSkpOwotCQkJCVNTTF9zaHV0ZG93bihzc2wpOwotI2VuZGlmCi0KLQkJCQlzdHJjcHkodGJ1ZiwgdW5pcSk7Ci0JCQkJc3RyY2F0KHRidWYsIGNvb2tpZSk7Ci0JCQkJd3JpdGUodm5jc29jaywgdGJ1Ziwgc3RybGVuKHRidWYpKTsKLQkJCQljbG9zZSh2bmNzb2NrKTsKLQotCQkJCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogZXhpdCBjYXNlIDQgKGNoZWNrLmh0dHBzLnByb3h5LmNvbm5lY3Rpb24pXG4iLCBnZXRwaWQoKSk7Ci0JCQkJZXhpdCgwKTsKLQkJCX0KLQkJCWNvbm5lY3RfdG9faHR0cGQ6Ci0KLQkJCS8qCi0JCQkgKiBIZXJlIHdlIGdvLi4uIG5vIHR1cm5pbmcgYmFjay4gIHdlIGhhdmUgdG8KLQkJCSAqIHNlbmQgZmFpbHVyZSB0byBwYXJlbnQgYW5kIGNsb3NlIHNvY2tldCB0byBoYXZlCi0JCQkgKiBodHRwIHByb2Nlc3NlZCBhdCBhbGwgaW4gYSB0aW1lbHkgZmFzaGlvbi4uLgotCQkJICovCi0KLQkJCS8qIHNlbmQgdGhlIGZhaWx1cmUgdGFnOiAqLwotCQkJc3RyY3B5KHRidWYsIHVuaXEpOwotCi0JCQlpZiAoaHR0cHNfcG9ydF9yZWRpciA8IDAgfHwgKHN0cnN0cihidWYsICJQT1JUPSIpIHx8IHN0cnN0cihidWYsICJwb3J0PSIpKSkgewotCQkJCWNoYXIgKnEgPSBzdHJzdHIoYnVmLCAiSG9zdDoiKTsKLQkJCQlpbnQgZnBvcnQgPSA0NDMsIG1hdGNoID0gMDsKLQkJCQljaGFyIG51bVsxNl07Ci0KLQkJCQlpZiAocSAmJiBzdHJzdHIocSwgIlxuIikpIHsKLQkJCQkgICAgcSArPSBzdHJsZW4oIkhvc3Q6IikgKyAxOwotCQkJCSAgICB3aGlsZSAoKnEgIT0gJ1xuJykgewotCQkJCQlpbnQgcDsKLQkJCQkJaWYgKCpxID09ICc6JyAmJiBzc2NhbmYocSwgIjolZCIsICZwKSA9PSAxKSB7Ci0JCQkJCQlpZiAocCA+IDAgJiYgcCA8IDY1NTM2KSB7Ci0JCQkJCQkJZnBvcnQgPSBwOwotCQkJCQkJCW1hdGNoID0gMTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlxKys7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCB8fCAhaHR0cHNfcG9ydF9yZWRpcikgewotCQkJCQlpbnQgcDsKLQkJCQkJaWYgKHNzY2FuZihidWYsICJQT1JUPSVkLCIsICZwKSA9PSAxKSB7Ci0JCQkJCQlpZiAocCA+IDAgJiYgcCA8IDY1NTM2KSB7Ci0JCQkJCQkJZnBvcnQgPSBwOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHNzY2FuZihidWYsICJwb3J0PSVkLCIsICZwKSA9PSAxKSB7Ci0JCQkJCQlpZiAocCA+IDAgJiYgcCA8IDY1NTM2KSB7Ci0JCQkJCQkJZnBvcnQgPSBwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXNwcmludGYobnVtLCAiSFA9JWQsIiwgZnBvcnQpOwotCQkJCXN0cmNhdCh0YnVmLCBudW0pOwotCQkJfQotCi0JCQlpZiAoc3Ryc3RyKGJ1ZiwgIkhUVFAvIikgIT0gTlVMTCkgIHsKLQkJCQljaGFyICpxLCAqc3RyOwotCQkJCS8qCi0JCQkJICogQWxzbyBzZW5kIGJhY2sgdGhlIEdFVCBsaW5lIGZvciBoZXVyaXN0aWNzLgotCQkJCSAqIChsYXN0X2h0dHBzLCBnZXQgZmlsZSkuCi0JCQkJICovCi0JCQkJc3RyID0gc3RyZHVwKGJ1Zik7Ci0JCQkJcSA9IHN0cnN0cihzdHIsICJIVFRQLyIpOwotCQkJCWlmIChxICE9IE5VTEwpIHsKLQkJCQkJKnEgPSAnXDAnOwkKLQkJCQkJc3RyY2F0KHRidWYsIHN0cik7Ci0JCQkJfQotCQkJCWZyZWUoc3RyKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEFsc28gc2VuZCB0aGUgY29va2llIHRvIHBhZCBvdXQgdGhlIG51bWJlciBvZgotCQkJICogYnl0ZXMgdG8gbW9yZSB0aGFuIHRoZSBwYXJlbnQgd2FudHMgdG8gcmVhZC4KLQkJCSAqIFNpbmNlIHRoaXMgaXMgdGhlIGZhaWx1cmUgY2FzZSwgaXQgZG9lcyBub3QKLQkJCSAqIG1hdHRlciB0aGF0IHdlIHNlbmQgbW9yZSB0aGFuIHN0cmxlbihjb29raWUpLgotCQkJICovCi0JCQlzdHJjYXQodGJ1ZiwgY29va2llKTsKLQkJCXdyaXRlKHZuY3NvY2ssIHRidWYsIHN0cmxlbih0YnVmKSk7Ci0KLQkJCXVzbGVlcCgxNTAqMTAwMCk7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2xvc2Ugdm5jc29jazogJWRcbiIsIHZuY3NvY2spOwotCQkJY2xvc2Uodm5jc29jayk7Ci0KLQkJCS8qIG5vdywgZmluYWxseSwgY29ubmVjdCB0byB0aGUgbGlidm5jc2VydmVyIGh0dHBkOiAqLwotCQkJaWYgKHNjcmVlbi0+bGlzdGVuSW50ZXJmYWNlID09IGh0b25sKElOQUREUl9BTlkpIHx8Ci0JCQkgICAgc2NyZWVuLT5saXN0ZW5JbnRlcmZhY2UgPT0gaHRvbmwoSU5BRERSX05PTkUpKSB7Ci0JCQkJaWZhY2UgPSAiMTI3LjAuMC4xIjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IGluX2FkZHIgaW47Ci0JCQkJaW4uc19hZGRyID0gc2NyZWVuLT5saXN0ZW5JbnRlcmZhY2U7Ci0JCQkJaWZhY2UgPSBpbmV0X250b2EoaW4pOwotCQkJfQotCQkJaWYgKGlmYWNlID09IE5VTEwgfHwgIXN0cmNtcChpZmFjZSwgIiIpKSB7Ci0JCQkJaWZhY2UgPSAiMTI3LjAuMC4xIjsKLQkJCX0KLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJpZmFjZTogJXM6JWRcbiIsIGlmYWNlLCBocG9ydCk7Ci0JCQl1c2xlZXAoMTUwKjEwMDApOwotCi0JCQlodHRwc29jayA9IGNvbm5lY3RfdGNwKGlmYWNlLCBocG9ydCk7Ci0KLQkJCWlmIChodHRwc29jayA8IDApIHsKLQkJCQkvKiBVR0gsIGFmdGVyIGFsbCBvZiB0aGF0ISAqLwotCQkJCXJmYkxvZygiQ291bGQgbm90IGNvbm5lY3QgdG8gaHR0cGQgc29ja2V0IVxuIik7Ci0JCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBleGl0IGNhc2UgNS5cbiIsIGdldHBpZCgpKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNzbF9oZWxwZXJbJWRdOiBodHRwc29jazogJWQgJWRcbiIsCi0JCQkgICAgZ2V0cGlkKCksIGh0dHBzb2NrLCBuKTsKLQotCQkJLyoKLQkJCSAqIHNlbmQgd2hhdCB3ZSByZWFkIHRvIGh0dHBkLCBhbmQgdGhlbiBjb25uZWN0Ci0JCQkgKiB0aGUgcmVzdCBvZiB0aGUgU1NMIHNlc3Npb24gdG8gaXQ6Ci0JCQkgKi8KLQkJCWlmIChuID4gMCkgewotCQkJCWNoYXIgKnMgPSBnZXRlbnYoIlgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVMiKTsKLQkJCQlpbnQgZGlkX2V4dHJhID0gMDsKLQotCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzZW5kaW5nIGh0dHAgYnVmZmVyIGh0dHBzb2NrOiAlZCBuPSVkXG4nJXMnXG4iLCBodHRwc29jaywgbiwgYnVmKTsKLQkJCQlpZiAocyAhPSBOVUxMKSB7Ci0JCQkJCWNoYXIgKnEgPSBzdHJzdHIoYnVmLCAiIEhUVFAvIik7Ci0JCQkJCWlmIChxKSB7Ci0JCQkJCQlpbnQgbTsKLQkJCQkJCSpxID0gJ1wwJzsKLQkJCQkJCW0gPSBzdHJsZW4oYnVmKTsKLQkJCQkJCXdyaXRlKGh0dHBzb2NrLCBidWYsIG0pOwotCQkJCQkJd3JpdGUoaHR0cHNvY2ssIHMsIHN0cmxlbihzKSk7Ci0JCQkJCQkqcSA9ICcgJzsKLQkJCQkJCXdyaXRlKGh0dHBzb2NrLCBxLCBuLW0pOwotCQkJCQkJZGlkX2V4dHJhID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWRpZF9leHRyYSkgewotCQkJCQl3cml0ZShodHRwc29jaywgYnVmLCBuKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzc2xfeGZlcihodHRwc29jaywgc19pbiwgc19vdXQsIGlzX2h0dHApOwotCQkJcmZiTG9nKCJTU0w6IHNzbF9oZWxwZXJbJWRdOiBleGl0IGNhc2UgNiAoaHR0cHMgc3NsX3hmZXIgZG9uZSlcbiIsIGdldHBpZCgpKTsKLQkJCWV4aXQoMCk7Ci0JCX0KLQotCQkvKgotCQkgKiBvaywgYmFjayBmcm9tIHRoZSBhYm92ZSBodHRwcyBtZXNzLCBzaW1wbHkgc2VuZCB0aGUKLQkJICogY29va2llIGJhY2sgdG8gdGhlIHBhcmVudCAod2hvIHdpbGwgYXR0YWNoIHVzIHRvCi0JCSAqIGxpYnZuY3NlcnZlciksIGFuZCBjb25uZWN0IHRoZSByZXN0IG9mIHRoZSBTU0wgc2Vzc2lvbgotCQkgKiB0byBpdC4KLQkJICovCi0JCXdyaXRlX2Nvb2tpZToKLQkJd3JpdGUodm5jc29jaywgY29va2llLCBzdHJsZW4oY29va2llKSk7Ci0KLQkJd3JvdGVfY29va2llOgotCQlzc2xfeGZlcih2bmNzb2NrLCBzX2luLCBzX291dCwgMCk7Ci0JCXJmYkxvZygiU1NMOiBzc2xfaGVscGVyWyVkXTogZXhpdCBjYXNlIDcgKHNzbF94ZmVyIGRvbmUpXG4iLCBnZXRwaWQoKSk7Ci0JCWlmICgwKSB1c2xlZXAoNTAgKiAxMDAwKTsKLQkJZXhpdCgwKTsKLQl9Ci0JLyogcGFyZW50IGhlcmUgKi8KLQotCWlmIChtb2RlICE9IE9QRU5TU0xfSU5FVEQpIHsKLQkJY2xvc2Uoc29jayk7Ci0JfQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJoZWxwZXIgcHJvY2VzcyBpczogJWRcbiIsIHBpZCk7Ci0KLQkvKiBhY2NlcHQgY29ubmVjdGlvbiBmcm9tIG91ciBjaGlsZC4gICovCi0Jc2lnbmFsKFNJR0FMUk0sIGNzb2NrX3RpbWVvdXQpOwotCWNzb2NrX3RpbWVvdXRfc29jayA9IGNzb2NrOwotCWFsYXJtKDIwKTsKLQotCXZzb2NrID0gYWNjZXB0KGNzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKLQotCWFsYXJtKDApOwotCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKLQljbG9zZShjc29jayk7Ci0KLQotCWlmICh2c29jayA8IDApIHsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsOiBjb25uZWN0aW9uIGZyb20gc3NsX2hlbHBlclslZF0gRkFJTEVELlxuIiwgcGlkKTsKLQkJcmZiTG9nUGVycm9yKCJhY2NlcHQiKTsKLQotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQgfHwgc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKGNlcnRyZXRfZmQgPj0gMCkgewotCQkJY2xvc2UoY2VydHJldF9mZCk7Ci0JCQljZXJ0cmV0X2ZkID0gLTE7Ci0JCX0KLQkJaWYgKGNlcnRyZXQpIHsKLQkJCXVubGluayhjZXJ0cmV0KTsKLQkJfQotCQlpZiAoZGhyZXRfZmQgPj0gMCkgewotCQkJY2xvc2UoZGhyZXRfZmQpOwotCQkJZGhyZXRfZmQgPSAtMTsKLQkJfQotCQlpZiAoZGhyZXQpIHsKLQkJCXVubGluayhkaHJldCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYWNjZXB0X29wZW5zc2w6IHZzb2NrOiAlZFxuIiwgdnNvY2spOwotCi0JbiA9IHJlYWQodnNvY2ssIHJjb29raWUsIHN0cmxlbihjb29raWUpKTsKLQlpZiAobiA8IDAgJiYgZXJybm8gIT0gMCkgewotCQlyZmJMb2dQZXJyb3IoInJlYWQiKTsKLQl9Ci0KLQlpZiAoY2VydHJldCkgewotCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCQlzYnVmLnN0X3NpemUgPSAwOwotCQlpZiAoY2VydHJldF9mZCA+PSAwICYmIHN0YXQoY2VydHJldCwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF9zaXplID4gMCkgewotCQkJY2VydHJldF9zdHIgPSAoY2hhciAqKSBjYWxsb2Moc2J1Zi5zdF9zaXplKzEsIDEpOwotCQkJcmVhZChjZXJ0cmV0X2ZkLCBjZXJ0cmV0X3N0ciwgc2J1Zi5zdF9zaXplKTsKLQkJCWNsb3NlKGNlcnRyZXRfZmQpOwotCQkJY2VydHJldF9mZCA9IC0xOwotCQl9Ci0JCWlmIChjZXJ0cmV0X2ZkID49IDApIHsKLQkJCWNsb3NlKGNlcnRyZXRfZmQpOwotCQkJY2VydHJldF9mZCA9IC0xOwotCQl9Ci0JCXVubGluayhjZXJ0cmV0KTsKLQkJaWYgKGNlcnRyZXRfc3RyICYmIHN0cnN0cihjZXJ0cmV0X3N0ciwgIk5PQ0VSVCIpID09IGNlcnRyZXRfc3RyKSB7Ci0JCQlmcmVlKGNlcnRyZXRfc3RyKTsKLQkJCWNlcnRyZXRfc3RyID0gTlVMTDsKLQkJfQotCQlpZiAoMCAmJiBjZXJ0cmV0X3N0cikgewotCQkJZnByaW50ZihzdGRlcnIsICJjZXJ0cmV0X3N0clslZF06XG4lc1xuIiwgKGludCkgc2J1Zi5zdF9zaXplLCBjZXJ0cmV0X3N0cik7Ci0JCX0KLQl9Ci0KLQlpZiAoZGhyZXQpIHsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJc2J1Zi5zdF9zaXplID0gMDsKLQkJaWYgKGRocmV0X2ZkID49IDAgJiYgc3RhdChkaHJldCwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF9zaXplID4gMCkgewotCQkJZGhyZXRfc3RyID0gKGNoYXIgKikgY2FsbG9jKHNidWYuc3Rfc2l6ZSsxLCAxKTsKLQkJCXJlYWQoZGhyZXRfZmQsIGRocmV0X3N0ciwgc2J1Zi5zdF9zaXplKTsKLQkJCWNsb3NlKGRocmV0X2ZkKTsKLQkJCWRocmV0X2ZkID0gLTE7Ci0JCX0KLQkJaWYgKGRocmV0X2ZkID49IDApIHsKLQkJCWNsb3NlKGRocmV0X2ZkKTsKLQkJCWRocmV0X2ZkID0gLTE7Ci0JCX0KLQkJdW5saW5rKGRocmV0KTsKLQkJaWYgKGRocmV0X3N0ciAmJiBzdHJzdHIoZGhyZXRfc3RyLCAiTk9DRVJUIikgPT0gZGhyZXRfc3RyKSB7Ci0JCQlmcmVlKGRocmV0X3N0cik7Ci0JCQlkaHJldF9zdHIgPSBOVUxMOwotCQl9Ci0JCWlmIChkaHJldF9zdHIpIHsKLQkJCWlmIChuZXdfZGhfcGFyYW1zID09IE5VTEwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImRocmV0X3N0clslZF06XG4lc1xuIiwgKGludCkgc2J1Zi5zdF9zaXplLCBkaHJldF9zdHIpOwotCQkJCW5ld19kaF9wYXJhbXMgPSBzdHJkdXAoZGhyZXRfc3RyKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICgwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicmNvb2tpZTogJXNcbiIsIHJjb29raWUpOwotCQlmcHJpbnRmKHN0ZGVyciwgImNvb2tpZTogICVzXG4iLCBjb29raWUpOwotCX0KLQotCWlmIChzdHJzdHIocmNvb2tpZSwgdW5pcSkgPT0gcmNvb2tpZSkgewotCQljaGFyICpxID0gc3Ryc3RyKHJjb29raWUsICJSQj0iKTsKLQkJaWYgKHEgJiYgc3Ryc3RyKGNvb2tpZSwgcSkgPT0gY29va2llKSB7Ci0JCQl2ZW5jcnlwdF9zZWwgPSAwOwotCQkJYW5vbnRsc19zZWwgPSAwOwotCQkJcSA9IHN0cnN0cihyY29va2llLCAiVkVOQ1JZUFQ9Iik7Ci0JCQlpZiAocSAmJiBzc2NhbmYocSwgIlZFTkNSWVBUPSVkLCIsICZ2ZW5jcnlwdF9zZWwpID09IDEpIHsKLQkJCQlpZiAodmVuY3J5cHRfc2VsICE9IDApIHsKLQkJCQkJcmZiTG9nKCJTU0w6IFZFTkNSWVBUIG1vZGU9JWQgYWNjZXB0ZWQuIGhlbHBlclslZF1cbiIsIHZlbmNyeXB0X3NlbCwgcGlkKTsKLQkJCQkJZ290byBhY2NlcHRfY2xpZW50OwotCQkJCX0KLQkJCX0KLQkJCXEgPSBzdHJzdHIocmNvb2tpZSwgIkFOT05UTFM9Iik7Ci0JCQlpZiAocSAmJiBzc2NhbmYocSwgIkFOT05UTFM9JWQsIiwgJmFub250bHNfc2VsKSA9PSAxKSB7Ci0JCQkJaWYgKGFub250bHNfc2VsICE9IDApIHsKLQkJCQkJcmZiTG9nKCJTU0w6IEFOT05UTFMgbW9kZT0lZCBhY2NlcHRlZC4gaGVscGVyWyVkXVxuIiwgYW5vbnRsc19zZWwsIHBpZCk7Ci0JCQkJCWdvdG8gYWNjZXB0X2NsaWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAobiAhPSAoaW50KSBzdHJsZW4oY29va2llKSB8fCBzdHJuY21wKGNvb2tpZSwgcmNvb2tpZSwgbikpIHsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsOiBjb29raWUgZnJvbSBzc2xfaGVscGVyWyVkXSBGQUlMRUQuICVkXG4iLCBwaWQsIG4pOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiJyVzJ1xuJyVzJ1xuIiwgY29va2llLCByY29va2llKTsKLQkJY2xvc2UodnNvY2spOwotCi0JCWlmIChzdHJzdHIocmNvb2tpZSwgdW5pcSkgPT0gcmNvb2tpZSkgewotCQkJaW50IGk7Ci0JCQlkb3VibGUgaHR0cHNfZG93bmxvYWRfd2FpdF90aW1lID0gMTUuMDsKLQotCQkJaWYgKGdldGVudigiWDExVk5DX0hUVFBTX0RPV05MT0FEX1dBSVRfVElNRSIpKSB7Ci0JCQkJaHR0cHNfZG93bmxvYWRfd2FpdF90aW1lID0gYXRvZihnZXRlbnYoIlgxMVZOQ19IVFRQU19ET1dOTE9BRF9XQUlUX1RJTUUiKSk7Ci0JCQl9Ci0KLQkJCXJmYkxvZygiU1NMOiBCVVQgV0FJVCEgSFRUUFMgZm9yIGhlbHBlciBwcm9jZXNzWyVkXSBzdWNjZWVkZWQuIEdvb2QuXG4iLCBwaWQpOwotCQkJaWYgKG1vZGUgIT0gT1BFTlNTTF9IVFRQUykgewotCQkJCWxhc3RfaHR0cHMgPSBkbm93KCk7Ci0JCQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCQkJbGFzdF9nZXRbaV0gPSAnXDAnOwotCQkJCX0KLQkJCQlzdHJuY3B5KGxhc3RfZ2V0LCByY29va2llLCAxMDApOwotCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJsYXN0X2dldDogJyVzJ1xuIiwgbGFzdF9nZXQpOwotCQkJfQotCQkJaWYgKHJjb29raWUgJiYgc3Ryc3RyKHJjb29raWUsICJWbmNWaWV3ZXIuY2xhc3MiKSkgewotCQkJCXJmYkxvZygiXG4iKTsKLQkJCQlyZmJMb2coImhlbHBlclslZF06XG4iLCBwaWQpOwotCQkJCXJmYkxvZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCQkJCXJmYkxvZygiU1NMOiBXQVJOSU5HIENMSUVOVCBBU0tFRCBGT1IgTk9ORVhJU1RFTlQgJ1ZuY1ZpZXdlci5jbGFzcydcbiIpOwotCQkJCXJmYkxvZygiU1NMOiBVU0VSIE5FRURTIFRPIE1BS0UgU1VSRSBUSEUgSkFWQSBQTFVHSU4gSVMgSU5TVEFMTEVEXG4iKTsKLQkJCQlyZmJMb2coIlNTTDogQU5EIFdPUktJTkcgUFJPUEVSTFkgKGUuZy4gYSB0ZXN0LWphdmEtcGx1Z2luIHBhZ2UuKVxuIik7Ci0JCQkJcmZiTG9nKCJTU0w6IEFORC9PUiBVU0VSIE5FRURTIFRPICoqUkVTVEFSVCoqIEhJUyBXRUIgQlJPV1NFUi5cbiIpOwotCQkJCXJmYkxvZygiU1NMOiBTT01FVElNRVMgVEhFIEJST1dTRVIgJ1JFTUVNQkVSUycgRkFJTEVEIEFQUExFVCBET1dOLVxuIik7Ci0JCQkJcmZiTG9nKCJTU0w6IExPQURTIEFORCBSRVNUQVJUSU5HIElUIElTIFRIRSBPTkxZIFdBWSBUTyBGSVggVEhJTkdTLlxuIik7Ci0JCQkJcmZiTG9nKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0JCQkJcmZiTG9nKCJcbiIpOwotCQkJfQotCQkJc3NsX2hlbHBlcl9waWQocGlkLCAtMik7Ci0KLQkJCWlmIChodHRwc19wb3J0X3JlZGlyKSB7Ci0JCQkJZG91YmxlIHN0YXJ0OwotCQkJCWludCBvcmlncG9ydCA9IHNjcmVlbi0+cG9ydDsKLQkJCQlpbnQgdXNlcG9ydCA9IHNjcmVlbi0+cG9ydDsKLQkJCQlpbnQgc2F3X2h0dHBzb2NrID0gMDsKLQkJCQkvKiB0byBleHBhbmQgJFBPUlQgY29ycmVjdGx5IGluIGluZGV4LnZuYyAqLwotCQkJCWlmIChodHRwc19wb3J0X3JlZGlyIDwgMCkgewotCQkJCQljaGFyICpxID0gc3Ryc3RyKHJjb29raWUsICJIUD0iKTsKLQkJCQkJaWYgKHEpIHsKLQkJCQkJCWludCBwOwotCQkJCQkJaWYgKHNzY2FuZihxLCAiSFA9JWQsIiwgJnApID09IDEpIHsKLQkJCQkJCQl1c2Vwb3J0ID0gcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzZXBvcnQgPSBodHRwc19wb3J0X3JlZGlyOwotCQkJCX0KLQkJCQlzY3JlZW4tPnBvcnQgPSB1c2Vwb3J0OwotCQkJCWlmIChvcmlncG9ydCAhPSB1c2Vwb3J0KSB7Ci0JCQkJCXJmYkxvZygiU1NMOiAtaHR0cHNyZWRpciBndWVzcyBwb3J0OiAlZCAgaGVscGVyWyVkXVxuIiwgc2NyZWVuLT5wb3J0LCBwaWQpOwotCQkJCX0KLQotCQkJCXN0YXJ0ID0gZG5vdygpOwotCQkJCXdoaWxlIChkbm93KCkgPCBzdGFydCArIGh0dHBzX2Rvd25sb2FkX3dhaXRfdGltZSkgewotCQkJCQlpZiAoc2NyZWVuLT5odHRwU29jayA+PSAwKSBzYXdfaHR0cHNvY2sgPSAxOwotCQkJCQlyZmJQRSgxMDAwMCk7Ci0JCQkJCXVzbGVlcCgxMDAwMCk7Ci0JCQkJCWlmIChzY3JlZW4tPmh0dHBTb2NrID49IDApIHNhd19odHRwc29jayA9IDE7Ci0JCQkJCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCQkJCWlmIChraWxsKHBpZCwgMCkgIT0gMCkgewotCQkJCQkJcmZiTG9nKCJTU0w6IGhlbHBlclslZF0gcGlkIGZpbmlzaGVkXG4iLCBwaWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKDAgJiYgc2F3X2h0dHBzb2NrICYmIHNjcmVlbi0+aHR0cFNvY2sgPCAwKSB7Ci0JCQkJCQkvKiB0aGlzIGNoZWNrIGNhbiBraWxsIHRoZSBoZWxwZXIgdG9vIHNvb24uICovCi0JCQkJCQlyZmJMb2coIlNTTDogaHR0cFNvY2sgZm9yIGhlbHBlclslZF0gd2VudCBhd2F5XG4iLCBwaWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmZiTG9nKCJTU0w6IGd1ZXNzaW5nIGNoaWxkIGhlbHBlclslZF0gaHR0cHMgZmluaXNoZWQuIGR0PSUuNmZcbiIsCi0JCQkJICAgIHBpZCwgZG5vdygpIC0gc3RhcnQpOwotCi0JCQkJcmZiUEUoMTAwMDApOwotCQkJCXJmYlBFKDEwMDAwKTsKLQkJCQlyZmJQRSgxMDAwMCk7Ci0KLQkJCQlzY3JlZW4tPnBvcnQgPSBvcmlncG9ydDsKLQkJCQlzc2xfaGVscGVyX3BpZCgwLCAtMik7Ci0JCQkJaWYgKG1vZGUgPT0gT1BFTlNTTF9JTkVURCkgewotCQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobW9kZSA9PSBPUEVOU1NMX0lORVREKSB7Ci0JCQkJZG91YmxlIHN0YXJ0OwotCQkJCWludCBzYXdfaHR0cHNvY2sgPSAwOwotCi0JCQkJLyogdG8gZXhwYW5kICRQT1JUIGNvcnJlY3RseSBpbiBpbmRleC52bmMgKi8KLQkJCQlpZiAoc2NyZWVuLT5wb3J0ID09IDApIHsKLQkJCQkJaW50IGZkID0gZmlsZW5vKHN0ZGluKTsKLQkJCQkJaWYgKGdldGVudigiWDExVk5DX0lORVREX1BPUlQiKSkgewotCQkJCQkJLyogbXV0ZXggKi8KLQkJCQkJCXNjcmVlbi0+cG9ydCA9IGF0b2koZ2V0ZW52KAotCQkJCQkJICAgICJYMTFWTkNfSU5FVERfUE9SVCIpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWludCB0cG9ydCA9IGdldF9sb2NhbF9wb3J0KGZkKTsKLQkJCQkJCWlmICh0cG9ydCA+IDApIHsKLQkJCQkJCQlzY3JlZW4tPnBvcnQgPSB0cG9ydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZmJMb2coIlNTTDogc2NyZWVuLT5wb3J0ICVkIGZvciBoZWxwZXJbJWRdXG4iLCBzY3JlZW4tPnBvcnQsIHBpZCk7Ci0KLQkJCQkvKiBrbHVkZ2UgZm9yIGh0dHBzIGZldGNoIHZpYSBpbmV0ZCAqLwotCQkJCXN0YXJ0ID0gZG5vdygpOwotCQkJCXdoaWxlIChkbm93KCkgPCBzdGFydCArIGh0dHBzX2Rvd25sb2FkX3dhaXRfdGltZSkgewotCQkJCQlpZiAoc2NyZWVuLT5odHRwU29jayA+PSAwKSBzYXdfaHR0cHNvY2sgPSAxOwotCQkJCQlyZmJQRSgxMDAwMCk7Ci0JCQkJCXVzbGVlcCgxMDAwMCk7Ci0JCQkJCWlmIChzY3JlZW4tPmh0dHBTb2NrID49IDApIHNhd19odHRwc29jayA9IDE7Ci0JCQkJCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCQkJCWlmIChraWxsKHBpZCwgMCkgIT0gMCkgewotCQkJCQkJcmZiTG9nKCJTU0w6IGhlbHBlclslZF0gcGlkIGZpbmlzaGVkXG4iLCBwaWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKDAgJiYgc2F3X2h0dHBzb2NrICYmIHNjcmVlbi0+aHR0cFNvY2sgPCAwKSB7Ci0JCQkJCQkvKiB0aGlzIGNoZWNrIGNhbiBraWxsIHRoZSBoZWxwZXIgdG9vIHNvb24uICovCi0JCQkJCQlyZmJMb2coIlNTTDogaHR0cFNvY2sgZm9yIGhlbHBlclslZF0gd2VudCBhd2F5XG4iLCBwaWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmZiTG9nKCJTU0w6IE9QRU5TU0xfSU5FVEQgZ3Vlc3NpbmcgIgotCQkJCSAgICAiY2hpbGQgaGVscGVyWyVkXSBodHRwcyBmaW5pc2hlZC4gZHQ9JS42ZlxuIiwKLQkJCQkgICAgcGlkLCBkbm93KCkgLSBzdGFydCk7Ci0KLQkJCQlyZmJQRSgxMDAwMCk7Ci0JCQkJcmZiUEUoMTAwMDApOwotCQkJCXJmYlBFKDEwMDAwKTsKLQotCQkJCXNzbF9oZWxwZXJfcGlkKDAsIC0yKTsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJLyogdGhpcyB3aWxsIGFjdHVhbGx5IG9ubHkgZ2V0IGVhcmxpZXIgaHR0cHMgKi8KLQkJCXNzbF9oZWxwZXJfcGlkKDAsIC0yKTsKLQkJCXJldHVybjsKLQkJfQotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQgfHwgc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWFjY2VwdF9jbGllbnQ6Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYWNjZXB0X29wZW5zc2w6IGNvb2tpZSBnb29kOiAlc1xuIiwgY29va2llKTsKLQotCXJmYkxvZygiU1NMOiBoYW5kc2hha2Ugd2l0aCBoZWxwZXIgcHJvY2Vzc1slZF0gc3VjY2VlZGVkLlxuIiwgcGlkKTsKLQotCW9wZW5zc2xfbGFzdF9oZWxwZXJfcGlkID0gcGlkOwotCXNzbF9oZWxwZXJfcGlkKHBpZCwgdnNvY2spOwotCi0JaWYgKHZuY19yZWRpcmVjdCkgewotCQl2bmNfcmVkaXJlY3Rfc29jayA9IHZzb2NrOwotCQlvcGVuc3NsX2xhc3RfaGVscGVyX3BpZCA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQljbGllbnQgPSBjcmVhdGVfbmV3X2NsaWVudCh2c29jaywgMCk7Ci0Jb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQgPSAwOwotCi0JaWYgKGNsaWVudCkgewotCQlpbnQgc3d0ID0gMDsKLQkJaWYgKG1vZGUgPT0gT1BFTlNTTF9WTkM2ICYmIG9wZW5zc2xfbGFzdF9pcCAhPSBOVUxMKSB7Ci0JCQlzd3QgPSAxOwotCQl9IGVsc2UgaWYgKG1vZGUgPT0gT1BFTlNTTF9SRVZFUlNFICYmIGlwdjZfbmFtZSAhPSBOVUxMICYmIG9wZW5zc2xfbGFzdF9pcCAhPSBOVUxMKSB7Ci0JCQlzd3QgPSAxOwotCQl9Ci0JCWlmIChzd3QpIHsKLQkJCWlmIChjbGllbnQtPmhvc3QpIHsKLQkJCQlmcmVlKGNsaWVudC0+aG9zdCk7Ci0JCQl9Ci0JCQljbGllbnQtPmhvc3QgPSBzdHJkdXAob3BlbnNzbF9sYXN0X2lwKTsKLQkJfQotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYWNjZXB0X29wZW5zc2w6IGNsaWVudCAlcFxuIiwgKHZvaWQgKikgY2xpZW50KTsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImFjY2VwdF9vcGVuc3NsOiBuZXdfY2xpZW50ICVwXG4iLCAodm9pZCAqKSBzY3JlZW4tPm5ld0NsaWVudEhvb2spOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYWNjZXB0X29wZW5zc2w6IG5ld19jbGllbnQgJXBcbiIsICh2b2lkICopIG5ld19jbGllbnQpOwotCQlpZiAobW9kZSA9PSBPUEVOU1NMX0lORVREKSB7Ci0JCQlpbmV0ZF9jbGllbnQgPSBjbGllbnQ7Ci0JCQljbGllbnQtPmNsaWVudEdvbmVIb29rID0gY2xpZW50X2dvbmU7Ci0JCX0KLQkJaWYgKG9wZW5zc2xfbGFzdF9pcCAmJgotCQkgICAgc3RycGJyayhvcGVuc3NsX2xhc3RfaXAsICIwMTIzNDU2Nzg5IikgPT0gb3BlbnNzbF9sYXN0X2lwKSB7Ci0JCQljbGllbnQtPmhvc3QgPSBzdHJkdXAob3BlbnNzbF9sYXN0X2lwKTsKLQkJfQotCQlpZiAodmVuY3J5cHRfc2VsICE9IDApIHsKLQkJCWNsaWVudC0+cHJvdG9jb2xNYWpvclZlcnNpb24gPSAzOwotCQkJY2xpZW50LT5wcm90b2NvbE1pbm9yVmVyc2lvbiA9IDg7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCU1NMCi0JCQlpZiAoIWZpbmlzaF92ZW5jcnlwdF9hdXRoKGNsaWVudCwgdmVuY3J5cHRfc2VsKSkgewotCQkJCXJmYkNsb3NlQ2xpZW50KGNsaWVudCk7Ci0JCQkJY2xpZW50ID0gTlVMTDsKLQkJCX0KLSNlbHNlCi0JCQliYWRuZXdzKCIzIGFjY2VwdF9vcGVuc3NsIik7Ci0jZW5kaWYKLQkJfSBlbHNlIGlmIChhbm9udGxzX3NlbCAhPSAwKSB7Ci0JCQljbGllbnQtPnByb3RvY29sTWFqb3JWZXJzaW9uID0gMzsKLQkJCWNsaWVudC0+cHJvdG9jb2xNaW5vclZlcnNpb24gPSA4OwotCQkJcmZiQXV0aE5ld0NsaWVudChjbGllbnQpOwotCQl9Ci0JCWlmICh1c2VfdGhyZWFkcyAmJiBjbGllbnQgIT0gTlVMTCkgewotCQkJcmZiU3RhcnRPbkhvbGRDbGllbnQoY2xpZW50KTsKLQkJfQotCQkvKiB0cnkgdG8gZ2V0IFJGQiBwcm90byBkb25lIG5vdy4gKi8KLQkJcHJvZ3Jlc3NfY2xpZW50KCk7Ci0JfSBlbHNlIHsKLQkJcmZiTG9nKCJTU0w6IGFjY2VwdF9vcGVuc3NsOiByZmJOZXdDbGllbnQgZmFpbGVkLlxuIik7Ci0JCWNsb3NlKHZzb2NrKTsKLQotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCWlmIChtb2RlID09IE9QRU5TU0xfSU5FVEQgfHwgc3NsX25vX2ZhaWwpIHsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLX0KLQotdm9pZCByYXdfeGZlcihpbnQgY3NvY2ssIGludCBzX2luLCBpbnQgc19vdXQpIHsKLQljaGFyIGJ1ZjBbODE5Ml07Ci0JaW50IHN6ID0gODE5MiwgbiwgbSwgc3RhdHVzLCBkYiA9IDE7Ci0JY2hhciAqYnVmOwotI2lmZGVmIEZPUktfT0sKLQlwaWRfdCBwYXIgPSBnZXRwaWQoKTsKLQlwaWRfdCBwaWQgPSBmb3JrKCk7Ci0KLQlidWYgPSBidWYwOwotCWlmICh2bmNfcmVkaXJlY3QpIHsKLQkJLyogY2hhbmdlIGJ1ZiBzaXplIHNvbWUgZGlyZWN0aW9uLiAqLwotCX0KLQotCWlmIChnZXRlbnYoIlgxMVZOQ19ERUJVR19SQVdfWEZFUiIpKSB7Ci0JCWRiID0gYXRvaShnZXRlbnYoIlgxMVZOQ19ERUJVR19SQVdfWEZFUiIpKTsKLQl9Ci0JaWYgKHBpZCA8IDApIHsKLQkJZXhpdCgxKTsKLQl9Ci0JLyogdGhpcyBpcyBmb3IgdGVzdGluZyBvciBzcGVjaWFsIGhlbHBlciB1c2FnZSwgbm8gU1NMIGp1c3Qgc29ja2V0IHJlZGlyICovCi0JaWYgKHBpZCkgewotCQlpZiAoZGIpIHJmYkxvZygicmF3X3hmZXIgc3RhcnQ6ICVkIC0+ICVkLyVkXG4iLCBjc29jaywgc19pbiwgc19vdXQpOwotCi0JCXdoaWxlICgxKSB7Ci0JCQluID0gcmVhZChjc29jaywgYnVmLCBzeik7Ci0JCQlpZiAobiA9PSAwIHx8IChuIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKG4gPiAwKSB7Ci0JCQkJaW50IGxlbiA9IG47Ci0JCQkJY2hhciAqc3JjID0gYnVmOwotCQkJCWlmIChkYiA+IDEpIHdyaXRlKDIsIGJ1Ziwgbik7Ci0JCQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCQkJbSA9IHdyaXRlKHNfb3V0LCBzcmMsIGxlbik7Ci0JCQkJCWlmIChtID4gMCkgewotCQkJCQkJc3JjICs9IG07Ci0JCQkJCQlsZW4gLT0gbTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChtIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLWlmIChkYikgcmZiTG9nKCJyYXdfeGZlciBiYWQgd3JpdGU6ICAlZCAtPiAlZCB8ICVkLyVkICBlcnJubz0lZFxuIiwgY3NvY2ssIHNfb3V0LCBtLCBuLCBlcnJubyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQl1c2xlZXAoMjUwKjEwMDApOwotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsgCi0JCWlmIChkYikgcmZiTG9nKCJyYXdfeGZlciBkb25lOiAgJWQgLT4gJWRcbiIsIGNzb2NrLCBzX291dCk7Ci0KLQl9IGVsc2UgewotCQlpZiAoZGIpIHVzbGVlcCg1MCoxMDAwKTsKLQkJaWYgKGRiKSByZmJMb2coInJhd194ZmVyIHN0YXJ0OiAlZCA8LSAlZFxuIiwgY3NvY2ssIHNfaW4pOwotCi0JCXdoaWxlICgxKSB7Ci0JCQluID0gcmVhZChzX2luLCBidWYsIHN6KTsKLQkJCWlmIChuID09IDAgfHwgKG4gPCAwICYmIGVycm5vICE9IEVJTlRSKSApIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAobiA+IDApIHsKLQkJCQlpbnQgbGVuID0gbjsKLQkJCQljaGFyICpzcmMgPSBidWY7Ci0JCQkJaWYgKGRiID4gMSkgd3JpdGUoMiwgYnVmLCBuKTsKLQkJCQl3aGlsZSAobGVuID4gMCkgewotCQkJCQltID0gd3JpdGUoY3NvY2ssIHNyYywgbGVuKTsKLQkJCQkJaWYgKG0gPiAwKSB7Ci0JCQkJCQlzcmMgKz0gbTsKLQkJCQkJCWxlbiAtPSBtOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKG0gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQlpZiAoZGIpIHJmYkxvZygicmF3X3hmZXIgYmFkIHdyaXRlOiAgJWQgPC0gJWQgfCAlZC8lZCBlcnJubz0lZFxuIiwgY3NvY2ssIHNfaW4sIG0sIG4sIGVycm5vKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVzbGVlcCgyNTAqMTAwMCk7Ci0JCWtpbGwocGFyLCBTSUdURVJNKTsKLQkJd2FpdHBpZChwYXIsICZzdGF0dXMsIFdOT0hBTkcpOyAKLQkJaWYgKGRiKSByZmJMb2coInJhd194ZmVyIGRvbmU6ICAlZCA8LSAlZFxuIiwgY3NvY2ssIHNfaW4pOwotCX0KLQljbG9zZShjc29jayk7Ci0JY2xvc2Uoc19pbik7Ci0JY2xvc2Uoc19vdXQpOwotI2VuZGlmCS8qIEZPUktfT0sgKi8KLX0KLQotLyogY29tcGlsZSB3aXRoIC1ERU5DX0hBVkVfT1BFTlNTTD0wIHRvIGRpc2FibGUgZW5jIHN0dWZmIGJ1dCBzdGlsbCBoYXZlIHNzbCAqLwotCi0jZGVmaW5lIEVOQ19NT0RVTEUKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlNTTAotI2lmbmRlZiBFTkNfSEFWRV9PUEVOU1NMCi0jZGVmaW5lIEVOQ19IQVZFX09QRU5TU0wgMQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBFTkNfSEFWRV9PUEVOU1NMIDAKLSNlbmRpZgotCi0jZGVmaW5lIEVOQ19ESVNBQkxFX1NIT1dfQ0VSVCAKLQotI2luY2x1ZGUgImVuYy5oIgotCi1zdGF0aWMgdm9pZCBzeW1tZXRyaWNfZW5jcnlwdGlvbl94ZmVyKGludCBjc29jaywgaW50IHNfaW4sIGludCBzX291dCkgewotCWNoYXIgdG1wWzEwMF07Ci0JY2hhciAqY2lwaGVyLCAqa2V5ZmlsZSwgKnE7Ci0KLQlpZiAoISBlbmNfc3RyKSB7Ci0JCXJldHVybjsKLQl9Ci0JY2lwaGVyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihlbmNfc3RyKSArIDEwMCk7Ci0JcSA9IHN0cmNocihlbmNfc3RyLCAnOicpOwotCWlmICghcSkgcmV0dXJuOwotCSpxID0gJ1wwJzsKLQlpZiAoZ2V0ZW52KCJYMTFWTkNfVVNFX1VMVFJBRFNNX0lWIikpIHsKLQkJc3ByaW50ZihjaXBoZXIsICJyZXY6JXMiLCBlbmNfc3RyKTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKGNpcGhlciwgIm5vdWx0cmE6cmV2OiVzIiwgZW5jX3N0cik7Ci0JfQotCWtleWZpbGUgPSBzdHJkdXAocSsxKTsKLQkqcSA9ICc6JzsKLQotCi0JLyogVEJEOiBzX2luICE9IHNfb3V0ICovCi0JaWYgKHNfb3V0KSB7fQotCi0Jc3ByaW50Zih0bXAsICJmZD0lZCwlZCIsIHNfaW4sIGNzb2NrKTsKLQotCWVuY19kbyhjaXBoZXIsIGtleWZpbGUsICItMSIsIHRtcCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy9zc2xoZWxwZXIuaCBiL3gxMXZuYy9zc2xoZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2ZGI3My4uMDAwMDAwMAotLS0gYS94MTF2bmMvc3NsaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19TU0xIRUxQRVJfSAotI2RlZmluZSBfWDExVk5DX1NTTEhFTFBFUl9ICi0KLS8qIC0tIHNzbGhlbHBlci5oIC0tICovCi0KLQotI2RlZmluZSBPUEVOU1NMX0lORVREICAgMQotI2RlZmluZSBPUEVOU1NMX1ZOQyAgICAgMgotI2RlZmluZSBPUEVOU1NMX1ZOQzYgICAgMwotI2RlZmluZSBPUEVOU1NMX0hUVFBTICAgNAotI2RlZmluZSBPUEVOU1NMX0hUVFBTNiAgNQotI2RlZmluZSBPUEVOU1NMX1JFVkVSU0UgNgotCi1leHRlcm4gaW50IG9wZW5zc2xfc29jazsKLWV4dGVybiBpbnQgb3BlbnNzbF9zb2NrNjsKLWV4dGVybiBpbnQgb3BlbnNzbF9wb3J0X251bTsKLWV4dGVybiBpbnQgaHR0cHNfc29jazsKLWV4dGVybiBpbnQgaHR0cHNfc29jazY7Ci1leHRlcm4gcGlkX3Qgb3BlbnNzbF9sYXN0X2hlbHBlcl9waWQ7Ci1leHRlcm4gY2hhciAqb3BlbnNzbF9sYXN0X2lwOwotZXh0ZXJuIGNoYXIgKmNlcnRyZXRfc3RyOwotZXh0ZXJuIGNoYXIgKmRocmV0X3N0cjsKLWV4dGVybiBjaGFyICpuZXdfZGhfcGFyYW1zOwotCi1leHRlcm4gdm9pZCByYXdfeGZlcihpbnQgY3NvY2ssIGludCBzX2luLCBpbnQgc19vdXQpOwotCi1leHRlcm4gaW50IG9wZW5zc2xfcHJlc2VudCh2b2lkKTsKLWV4dGVybiB2b2lkIG9wZW5zc2xfaW5pdChpbnQpOwotZXh0ZXJuIHZvaWQgb3BlbnNzbF9wb3J0KGludCk7Ci1leHRlcm4gdm9pZCBodHRwc19wb3J0KGludCk7Ci1leHRlcm4gdm9pZCBjaGVja19vcGVuc3NsKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfaHR0cHModm9pZCk7Ci1leHRlcm4gdm9pZCBzc2xfaGVscGVyX3BpZChwaWRfdCBwaWQsIGludCBzb2NrKTsKLWV4dGVybiB2b2lkIGFjY2VwdF9vcGVuc3NsKGludCBtb2RlLCBpbnQgcHJlc29jayk7Ci1leHRlcm4gY2hhciAqZmluZF9vcGVuc3NsX2Jpbih2b2lkKTsKLWV4dGVybiBjaGFyICpnZXRfc2F2ZWRfcGVtKGNoYXIgKnN0cmluZywgaW50IGNyZWF0ZSk7Ci1leHRlcm4gY2hhciAqZ2V0X3NzbF92ZXJpZnlfZmlsZShjaGFyICpzdHJfaW4pOwotZXh0ZXJuIGNoYXIgKmNyZWF0ZV90bXBfcGVtKGNoYXIgKnBhdGgsIGludCBwcm9tcHQpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX1NTTEhFTFBFUl9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvc3NsdG9vbHMuaCBiL3gxMXZuYy9zc2x0b29scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFkN2QwLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy9zc2x0b29scy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2MCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1NTTFRPT0xTX0gKLSNkZWZpbmUgX1NTTFRPT0xTX0gKLQotLyogcXVvdGVkIHNjcmlwdHMsIGVkaXQgc291cmNlIG5vdCB0aGlzIGZpbGUuICovCi0KLQotY2hhciBnZW5DQVtdID0gCi0iIyEvYmluL3NoXG4iCi0iXG4iCi0iRElSPSRCQVNFX0RJUlxuIgotImlmIFsgXCJ4JERJUlwiID0gXCJ4XCIgXTsgdGhlblxuIgotIglESVI9XCIkSE9NRS9kb3RranJfdm5jL2NlcnRzXCJcbiIKLSIJcm0gLXJmIFwiJERJUlwiXG4iCi0iZmlcbiIKLSJpZiBlY2hvIFwiJERJUlwiIHwgZ3JlcCAnXi8nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iICAgICAgICA6XG4iCi0iZWxzZVxuIgotIiAgICAgICAgRElSPVwiYHB3ZGAvJERJUlwiXG4iCi0iZmlcbiIKLSJcbiIKLSJQQVRIPS91c3IvYmluOi9iaW46L3Vzci9zYmluOiRQQVRIOyBleHBvcnQgUEFUSFxuIgotImlmIFsgXCJ4JE9QRU5TU0xcIiA9IFwieFwiIF07IHRoZW5cbiIKLSIJT1BFTlNTTD1cIm9wZW5zc2xcIlxuIgotImZpXG4iCi0iXG4iCi0idHlwZSBcIiRPUEVOU1NMXCIgPiAvZGV2L251bGwJfHwgZXhpdCAxXG4iCi0iXG4iCi0iaWYgWyAtZiBcIiRESVIvQ0EvY2FjZXJ0LnBlbVwiIF07IHRoZW5cbiIKLSIJZWNobyBcIkZpbGVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaW4gJERJUi9DQVwiXG4iCi0iCXByaW50ZiBcIkNvbnRpbnVlPyBbeV0vbiBcIlxuIgotIglyZWFkIHhcbiIKLSIJaWYgWyBcIngkeFwiID0gXCJ4blwiIF07IHRoZW5cbiIKLSIJCWV4aXQgMTtcbiIKLSIJZmlcbiIKLSJmaVxuIgotIlxuIgotIiNta2RpciAtcCBcIiRESVIvSEFTSFwiCQl8fCBleGl0IDFcbiIKLSJta2RpciAtcCBcIiRESVIvY2xpZW50c1wiCQl8fCBleGl0IDFcbiIKLSIjbWtkaXIgLXAgXCIkRElSL2NsaWVudHMvSEFTSFwiCXx8IGV4aXQgMVxuIgotIm1rZGlyIC1wIFwiJERJUi9DQS9jZXJ0c1wiCXx8IGV4aXQgMVxuIgotIm1rZGlyIC1wIFwiJERJUi9DQS9jcmxcIgkJfHwgZXhpdCAxXG4iCi0ibWtkaXIgLXAgXCIkRElSL0NBL25ld2NlcnRzXCIJfHwgZXhpdCAxXG4iCi0ibWtkaXIgLXAgXCIkRElSL0NBL3ByaXZhdGVcIgl8fCBleGl0IDFcbiIKLSJjaG1vZCBnby1yd3ggXCIkRElSL0NBL3ByaXZhdGVcIgl8fCBleGl0IDFcbiIKLSJta2RpciAtcCBcIiRESVIvdG1wXCIJCXx8IGV4aXQgMVxuIgotImNobW9kIGdvLXJ3eCBcIiRESVIvdG1wXCIJCXx8IGV4aXQgMVxuIgotInRvdWNoIFwiJERJUi9DQS9pbmRleC50eHRcIgl8fCBleGl0IDFcbiIKLSJpZiBbICEgLWYgXCIkRElSL0NBL3NlcmlhbFwiIF07IHRoZW5cbiIKLSIJZWNobyBcIjAxXCIgPiBcIiRESVIvQ0Evc2VyaWFsXCIJfHwgZXhpdCAxXG4iCi0iZmlcbiIKLSJcbiIKLSJjbmY9J1xuIgotIkhPTUUJCQk9IC5cbiIKLSJSQU5ERklMRQkJPSAkRU5WOjpIT01FLy5ybmRcbiIKLSJcbiIKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgotIlsgY2EgXVxuIgotImRlZmF1bHRfY2EJPSBDQV9kZWZhdWx0CQkjIFRoZSBkZWZhdWx0IGNhIHNlY3Rpb25cbiIKLSJcbiIKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgotIlsgQ0FfZGVmYXVsdCBdXG4iCi0iXG4iCi0iZGlyCQk9IC4vQ0EJCQkjIFdoZXJlIGV2ZXJ5dGhpbmcgaXMga2VwdFxuIgotImNlcnRzCQk9ICRkaXIvY2VydHMJCSMgV2hlcmUgdGhlIGlzc3VlZCBjZXJ0cyBhcmUga2VwdFxuIgotImNybF9kaXIJCT0gJGRpci9jcmwJCSMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHRcbiIKLSJkYXRhYmFzZQk9ICRkaXIvaW5kZXgudHh0CSMgZGF0YWJhc2UgaW5kZXggZmlsZS5cbiIKLSJuZXdfY2VydHNfZGlyCT0gJGRpci9uZXdjZXJ0cwkJIyBkZWZhdWx0IHBsYWNlIGZvciBuZXcgY2VydHMuXG4iCi0iY2VydGlmaWNhdGUJPSAkZGlyL2NhY2VydC5wZW0gCSMgVGhlIENBIGNlcnRpZmljYXRlXG4iCi0ic2VyaWFsCQk9ICRkaXIvc2VyaWFsIAkJIyBUaGUgY3VycmVudCBzZXJpYWwgbnVtYmVyXG4iCi0iY3JsCQk9ICRkaXIvY3JsLnBlbSAJCSMgVGhlIGN1cnJlbnQgQ1JMXG4iCi0icHJpdmF0ZV9rZXkJPSAkZGlyL3ByaXZhdGUvY2FrZXkucGVtICMgVGhlIHByaXZhdGUga2V5XG4iCi0iUkFOREZJTEUJPSAkZGlyL3ByaXZhdGUvLnJhbmQJIyBwcml2YXRlIHJhbmRvbSBudW1iZXIgZmlsZVxuIgotIlxuIgotIng1MDlfZXh0ZW5zaW9ucwk9IHVzcl9jZXJ0CQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgY2VydFxuIgotIlxuIgotIm5hbWVfb3B0IAk9IGNhX2RlZmF1bHQJCSMgU3ViamVjdCBOYW1lIG9wdGlvbnNcbiIKLSJjZXJ0X29wdCAJPSBjYV9kZWZhdWx0CQkjIENlcnRpZmljYXRlIGZpZWxkIG9wdGlvbnNcbiIKLSJcbiIKLSJkZWZhdWx0X2RheXMJPSA3MzAJCQkjIGhvdyBsb25nIHRvIGNlcnRpZnkgZm9yXG4iCi0iZGVmYXVsdF9jcmxfZGF5cz0gMzAJCQkjIGhvdyBsb25nIGJlZm9yZSBuZXh0IENSTFxuIgotImRlZmF1bHRfbWQJPSBtZDUJCQkjIHdoaWNoIG1kIHRvIHVzZS5cbiIKLSJwcmVzZXJ2ZQk9IG5vCQkJIyBrZWVwIHBhc3NlZCBETiBvcmRlcmluZ1xuIgotIlxuIgotInBvbGljeQkJPSBwb2xpY3lfbWF0Y2hcbiIKLSJcbiIKLSIjIEZvciB0aGUgQ0EgcG9saWN5XG4iCi0iWyBwb2xpY3lfbWF0Y2ggXVxuIgotImNvdW50cnlOYW1lCQk9IG1hdGNoXG4iCi0ic3RhdGVPclByb3ZpbmNlTmFtZQk9IG1hdGNoXG4iCi0ib3JnYW5pemF0aW9uTmFtZQk9IG1hdGNoXG4iCi0ib3JnYW5pemF0aW9uYWxVbml0TmFtZQk9IG9wdGlvbmFsXG4iCi0iY29tbW9uTmFtZQkJPSBzdXBwbGllZFxuIgotImVtYWlsQWRkcmVzcwkJPSBvcHRpb25hbFxuIgotIlxuIgotIlsgcG9saWN5X2FueXRoaW5nIF1cbiIKLSJjb3VudHJ5TmFtZQkJPSBvcHRpb25hbFxuIgotInN0YXRlT3JQcm92aW5jZU5hbWUJPSBvcHRpb25hbFxuIgotImxvY2FsaXR5TmFtZQkJPSBvcHRpb25hbFxuIgotIm9yZ2FuaXphdGlvbk5hbWUJPSBvcHRpb25hbFxuIgotIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUJPSBvcHRpb25hbFxuIgotImNvbW1vbk5hbWUJCT0gc3VwcGxpZWRcbiIKLSJlbWFpbEFkZHJlc3MJCT0gb3B0aW9uYWxcbiIKLSJcbiIKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgotIlsgcmVxIF1cbiIKLSJkZWZhdWx0X2JpdHMJCT0gMjA0OFxuIgotImRlZmF1bHRfa2V5ZmlsZSAJPSBwcml2a2V5LnBlbVxuIgotImRpc3Rpbmd1aXNoZWRfbmFtZQk9IHJlcV9kaXN0aW5ndWlzaGVkX25hbWVcbiIKLSJhdHRyaWJ1dGVzCQk9IHJlcV9hdHRyaWJ1dGVzXG4iCi0ieDUwOV9leHRlbnNpb25zCT0gdjNfY2EJIyBUaGUgZXh0ZW50aW9ucyB0byBhZGQgdG8gdGhlIHNlbGYgc2lnbmVkIGNlcnRcbiIKLSJcbiIKLSJzdHJpbmdfbWFzayA9IG5vbWJzdHJcbiIKLSJcbiIKLSIjIHJlcV9leHRlbnNpb25zID0gdjNfcmVxICMgVGhlIGV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgY2VydGlmaWNhdGUgcmVxdWVzdFxuIgotIlxuIgotIlsgcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZSBdXG4iCi0iY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSlcbiIKLSJjb3VudHJ5TmFtZV9kZWZhdWx0CQk9IEFVXG4iCi0iY291bnRyeU5hbWVfbWluCQkJPSAyXG4iCi0iY291bnRyeU5hbWVfbWF4CQkJPSAyXG4iCi0iXG4iCi0ic3RhdGVPclByb3ZpbmNlTmFtZQkJPSBTdGF0ZSBvciBQcm92aW5jZSBOYW1lIChmdWxsIG5hbWUpXG4iCi0ic3RhdGVPclByb3ZpbmNlTmFtZV9kZWZhdWx0CT0gbXlzdGF0ZVxuIgotIlxuIgotImxvY2FsaXR5TmFtZQkJCT0gTG9jYWxpdHkgTmFtZSAoZWcsIGNpdHkpXG4iCi0iXG4iCi0iMC5vcmdhbml6YXRpb25OYW1lCQk9IE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSlcbiIKLSIwLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IHgxMXZuYyBzZXJ2ZXIgQ0FcbiIKLSJcbiIKLSJvcmdhbml6YXRpb25hbFVuaXROYW1lCQk9IE9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pXG4iCi0iXG4iCi0iY29tbW9uTmFtZQkJCT0gQ29tbW9uIE5hbWUgKGVnLCBZT1VSIG5hbWUpXG4iCi0iY29tbW9uTmFtZV9kZWZhdWx0CQk9ICVVU0VSIHgxMXZuYyBzZXJ2ZXIgQ0FcbiIKLSJjb21tb25OYW1lX21heAkJCT0gNjRcbiIKLSJcbiIKLSJlbWFpbEFkZHJlc3MJCQk9IEVtYWlsIEFkZHJlc3NcbiIKLSJlbWFpbEFkZHJlc3NfZGVmYXVsdAkJPSB4MTF2bmNAQ0Eubm93aGVyZVxuIgotImVtYWlsQWRkcmVzc19tYXgJCT0gNjRcbiIKLSJcbiIKLSJbIHJlcV9hdHRyaWJ1dGVzIF1cbiIKLSJjaGFsbGVuZ2VQYXNzd29yZAkJPSBBIGNoYWxsZW5nZSBwYXNzd29yZFxuIgotImNoYWxsZW5nZVBhc3N3b3JkX21pbgkJPSA0XG4iCi0iY2hhbGxlbmdlUGFzc3dvcmRfbWF4CQk9IDIwXG4iCi0iXG4iCi0idW5zdHJ1Y3R1cmVkTmFtZQkJPSBBbiBvcHRpb25hbCBjb21wYW55IG5hbWVcbiIKLSJcbiIKLSJbIHVzcl9jZXJ0IF1cbiIKLSJcbiIKLSJiYXNpY0NvbnN0cmFpbnRzPUNBOkZBTFNFXG4iCi0iXG4iCi0ibnNDb21tZW50CQkJPSBcIk9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlXCJcbiIKLSJcbiIKLSJzdWJqZWN0S2V5SWRlbnRpZmllcj1oYXNoXG4iCi0iYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZCxpc3N1ZXI6YWx3YXlzXG4iCi0iXG4iCi0iWyB2M19yZXEgXVxuIgotIlxuIgotImJhc2ljQ29uc3RyYWludHMgPSBDQTpGQUxTRVxuIgotImtleVVzYWdlID0gbm9uUmVwdWRpYXRpb24sIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudFxuIgotIlxuIgotIlsgdjNfY2EgXVxuIgotIlxuIgotInN1YmplY3RLZXlJZGVudGlmaWVyPWhhc2hcbiIKLSJcbiIKLSJhdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkOmFsd2F5cyxpc3N1ZXI6YWx3YXlzXG4iCi0iXG4iCi0iYmFzaWNDb25zdHJhaW50cyA9IENBOnRydWVcbiIKLSJcbiIKLSJbIGNybF9leHQgXVxuIgotIlxuIgotImF1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQ6YWx3YXlzLGlzc3VlcjphbHdheXNcbiIKLSJcbiIKLSInXG4iCi0ic2VsZmNuZj0nXG4iCi0iIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIKLSJbIHJlcSBdXG4iCi0iZGVmYXVsdF9iaXRzCQk9IDIwNDhcbiIKLSJlbmNyeXB0X2tleQkJPSB5ZXNcbiIKLSJkaXN0aW5ndWlzaGVkX25hbWUJPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lXG4iCi0ieDUwOV9leHRlbnNpb25zCQk9IGNlcnRfdHlwZVxuIgotIlxuIgotIlsgcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZSBdXG4iCi0iY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSlcbiIKLSJjb3VudHJ5TmFtZV9kZWZhdWx0CQk9IEFVXG4iCi0iY291bnRyeU5hbWVfbWluCQkJPSAyXG4iCi0iY291bnRyeU5hbWVfbWF4CQkJPSAyXG4iCi0iXG4iCi0ic3RhdGVPclByb3ZpbmNlTmFtZQkJPSBTdGF0ZSBvciBQcm92aW5jZSBOYW1lIChmdWxsIG5hbWUpXG4iCi0ic3RhdGVPclByb3ZpbmNlTmFtZV9kZWZhdWx0CT0gbXlzdGF0ZVxuIgotIlxuIgotImxvY2FsaXR5TmFtZQkJCT0gTG9jYWxpdHkgTmFtZSAoZWcsIGNpdHkpXG4iCi0iXG4iCi0iMC5vcmdhbml6YXRpb25OYW1lCQk9IE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSlcbiIKLSIwLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IHgxMXZuYyBzZXJ2ZXIgc2VsZi1zaWduZWRcbiIKLSJcbiIKLSJvcmdhbml6YXRpb25hbFVuaXROYW1lCQk9IE9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pXG4iCi0iXG4iCi0iY29tbW9uTmFtZQkJCT0gQ29tbW9uIE5hbWUgKGVnLCBZT1VSIG5hbWUpXG4iCi0iY29tbW9uTmFtZV9kZWZhdWx0CQk9IHgxMXZuYyBzZXJ2ZXIgc2VsZi1zaWduZWQgJU5BTUVcbiIKLSJjb21tb25OYW1lX21heAkJCT0gNjRcbiIKLSJcbiIKLSJlbWFpbEFkZHJlc3MJCQk9IEVtYWlsIEFkZHJlc3NcbiIKLSJlbWFpbEFkZHJlc3NfZGVmYXVsdAkJPSB4MTF2bmNAc2VsZi1zaWduZWQubm93aGVyZVxuIgotImVtYWlsQWRkcmVzc19tYXgJCT0gNjRcbiIKLSJcbiIKLSJbIGNlcnRfdHlwZSBdXG4iCi0ibnNDZXJ0VHlwZSA9IHNlcnZlclxuIgotIlxuIgotIidcbiIKLSJlY2hvIFwiJGNuZlwiIHwgc2VkIC1lIFwicy8lVVNFUi8kVVNFUi9cIiBcXFxuIgotIgk+IFwiJERJUi9DQS9zc2wuY25mXCIgfHwgZXhpdCAxXG4iCi0iZWNobyBcIiRjbmZcIiB8IHNlZCAtZSBcInMvJVVTRVIgKi8vXCIgLWUgJ3Mvc2VydmVyIENBL3NlcnZlciAlTkFNRS9nJyAtZSAncy9AQ0EvQHNlcnZlci8nIFxcXG4iCi0iCT4gXCIkRElSL0NBL3NzbC5jbmYuc2VydmVyXCIgfHwgZXhpdCAxXG4iCi0iZWNobyBcIiRjbmZcIiB8IHNlZCAtZSBcInMvJVVTRVIgKi8vXCIgLWUgJ3Mvc2VydmVyIENBL2NsaWVudCAlTkFNRS9nJyAtZSAncy9AQ0EvQGNsaWVudC8nIFxcXG4iCi0iCT4gXCIkRElSL0NBL3NzbC5jbmYuY2xpZW50XCIgfHwgZXhpdCAxXG4iCi0iXG4iCi0iZWNobyBcIiRzZWxmY25mXCIgPiBcIiRESVIvQ0Evc2VsZi5jbmYuc2VydmVyXCIgfHwgZXhpdCAxXG4iCi0iZWNobyBcIiRzZWxmY25mXCIgfCBzZWQgLWUgJ3MvIHNlcnZlci8gY2xpZW50L2cnIFxcXG4iCi0iCT4gXCIkRElSL0NBL3NlbGYuY25mLmNsaWVudFwiIHx8IGV4aXQgMVxuIgotIlxuIgotImNkIFwiJERJUlwiCXx8IGV4aXQgMVxuIgotIlxuIgotImVjaG8gXCJcIlxuIgotImVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKLSJlY2hvIFwiR2VuZXJhdGluZyB5b3VyIHgxMXZuYyBDQSAoY2VydGlmaWNhdGUgYXV0aG9yaXR5KSBrZXkgYW5kIGNlcnRpZmljYXRlOlwiXG4iCi0iZWNobyBcIlwiXG4iCi0iZWNobyBcIlBsZWFzZSBzdXBwbHkgYSBwYXNzcGhyYXNlIGFuZCBhbnkgb3RoZXIgaW5mb3JtYXRpb24geW91IGNhcmUgdG8uXCJcbiIKLSJlY2hvIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iZWNobyBcIlwiXG4iCi0iXG4iCi0icmVxX2FyZ3M9JFJFUV9BUkdTXG4iCi0iaWYgZWNobyBcIiRyZXFfYXJnc1wiIHwgZ3JlcCAnZGF5cycgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJOlxuIgotImVsc2VcbiIKLSIJcmVxX2FyZ3M9XCIkcmVxX2FyZ3MgLWRheXMgNzMwXCJcbiIKLSJmaVxuIgotIlxuIgotIlwiJE9QRU5TU0xcIiByZXEgLWNvbmZpZyBcIiRESVIvQ0Evc3NsLmNuZlwiIC1uZXcgLXg1MDkgLWRheXMgNzMwICRyZXFfYXJncyAgXFxcbiIKLSIJLWtleW91dCBcIiRESVIvQ0EvcHJpdmF0ZS9jYWtleS5wZW1cIiBcXFxuIgotIgktb3V0IFwiJERJUi9DQS9jYWNlcnQucGVtXCJcbiIKLSJcbiIKLSJpZiBbICQ/ICE9IDAgXTsgdGhlblxuIgotIgllY2hvIFwib3BlbnNzbCBmYWlsZWQuXCJcbiIKLSIJZXhpdCAxXG4iCi0iZmlcbiIKLSJcbiIKLSJjaG1vZCBnby1yd3ggXCIkRElSL0NBL3ByaXZhdGUvY2FrZXkucGVtXCJcbiIKLSJcbiIKLSJlY2hvIFwiXCJcbiIKLSJlY2hvIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iZWNobyBcIllvdXIgcHVibGljIHgxMXZuYyBDQSBjZXJ0IGlzOlwiXG4iCi0iZWNobyBcIlwiXG4iCi0iZWNobyBcIiAgICAgICAgJERJUi9DQS9jYWNlcnQucGVtXCJcbiIKLSJlY2hvIFwiXCJcbiIKLSJlY2hvIFwiICAgSXQgbWF5IGJlIGNvcGllZCB0byBvdGhlciBhcHBsaWNhdGlvbnMsIGUuZy4gV2ViIGJyb3dzZXIsIEphdmFcIlxuIgotImVjaG8gXCIgICBBcHBsZXQga2V5c3RvcmUsIG9yIHN0dW5uZWwgY2ZnLCB0byB1c2UgdG8gdmVyaWZ5IHNpZ25lZCBzZXJ2ZXJcIlxuIgotImVjaG8gXCIgICBvciBjbGllbnQgY2VydHMsIGV0Yy5cIlxuIgotImVjaG8gXCJcIlxuIgotImVjaG8gXCJZb3VyIHByaXZhdGUgeDExdm5jIENBIGtleSBpczpcIlxuIgotImVjaG8gXCJcIlxuIgotImVjaG8gXCIgICAgICAgICRESVIvQ0EvcHJpdmF0ZS9jYWtleS5wZW1cIlxuIgotImVjaG8gXCJcIlxuIgotImVjaG8gXCIgICBJdCB3aWxsIGJlIHVzZWQgdG8gc2lnbiBzZXJ2ZXIgb3IgY2xpZW50IGNlcnRzLCBrZWVwIGl0IHNlY3JldC5cIlxuIgotImVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKLSJlY2hvIFwiXCJcbiIKLSJwcmludGYgXCJQcmVzcyBFbnRlciB0byBwcmludCB0aGUgY2FjZXJ0LnBlbSBjZXJ0aWZpY2F0ZSB0byB0aGUgc2NyZWVuOiBcIlxuIgotInJlYWQgeFxuIgotImVjaG8gXCJcIlxuIgotImNhdCBcIiRESVIvQ0EvY2FjZXJ0LnBlbVwiXG4iCi07Ci0KLWNoYXIgZ2VuQ2VydFtdID0gCi0iIyEvYmluL3NoXG4iCi0iXG4iCi0iZGlyZXJyb3IoKSB7XG4iCi0iCWVjaG8gXCJcIlxuIgotIgllY2hvIFwiWW91IG5lZWQgZmlyc3QgdG8gcnVuOlwiXG4iCi0iCWVjaG8gXCJcIlxuIgotIglpZiBlY2hvIFwiJERJUlwiIHwgZ3JlcCAnL1xcLnZuYy9jZXJ0cycgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCWVjaG8gXCIJeDExdm5jIC1zc2xHZW5DQVwiXG4iCi0iCWVsc2VcbiIKLSIJCWVjaG8gXCIJeDExdm5jIC1zc2xHZW5DQSAkRElSXCJcbiIKLSIJZmlcbiIKLSIJZWNobyBcIlwiXG4iCi0iCWVjaG8gXCJ0byBjcmVhdGUgdGhlIENBIGNlcnQgZmlsZSBhbmQgb3RoZXIgbmVlZGVkIGNvbmZpZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuXCJcbiIKLSIJZWNobyBcIlwiXG4iCi0iCWVjaG8gXCJUaGVuIHlvdSBjYW4gcnVuOiB4MTF2bmMgLXNzbEdlbkNlcnQgJHR5cGUgJG5hbWUwXCJcbiIKLSIJZWNobyBcIlwiXG4iCi0iCWlmIFsgXCJYJDFcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiKG1pc3NpbmcgZmlsZS9kaXI6ICQxKVwiXG4iCi0iCQllY2hvIFwiXCJcbiIKLSIJZmlcbiIKLSIJZXhpdCAxXG4iCi0ifVxuIgotIlxuIgotIm1ha2VfSEFTSCgpIHtcbiIKLSIJY3J0PVwiJDFcIlxuIgotIglyZW1vdmU9XCIkMlwiXG4iCi0iCWlmIFsgISAtZiBcIiRjcnRcIiBdOyB0aGVuXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSIJZGlyaGFzaD1gZGlybmFtZSBcIiRjcnRcImAvSEFTSFxuIgotIgliYXNoYXNoPWBiYXNlbmFtZSBcIiRjcnRcImBcbiIKLSIJaWYgWyAhIC1kIFwiJGRpcmhhc2hcIiBdOyB0aGVuXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSIJaGFzaD1gXCIkT1BFTlNTTFwiIHg1MDkgLWhhc2ggLW5vb3V0IC1pbiBcIiRjcnRcIiAyPi9kZXYvbnVsbCB8IGhlYWQgLTFgXG4iCi0iCWlmIFsgXCJYJGhhc2hcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA5XG4iCi0iCQlkb1xuIgotIgkJCWxuaz1cIiRkaXJoYXNoLyRoYXNoLiRpXCJcbiIKLSIJCQlpZiBbIFwiWCRyZW1vdmVcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQkJCWlmIFsgLWggXCIkbG5rXCIgXTsgdGhlblxuIgotIgkJCQkJaWYgY21wIFwiJGxua1wiIFwiJGNydFwiID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCQkJCQlscyAtbCBcIiRsbmtcIlxuIgotIgkJCQkJCXJtIC1pIFwiJGxua1wiXG4iCi0iCQkJCQlmaVxuIgotIgkJCQlmaVxuIgotIgkJCWVsc2VcbiIKLSIJCQkJaWYgWyAtaCBcIiRsbmtcIiBdOyB0aGVuXG4iCi0iCQkJCQlpZiBbICEgLWYgXCIkbG5rXCIgXTsgdGhlblxuIgotIgkJCQkJCXJtIC1mIFwiJGxua1wiIDE+L2Rldi9udWxsIDI+JjFcbiIKLSIJCQkJCWVsc2VcbiIKLSIJCQkJCQljb250aW51ZVxuIgotIgkJCQkJZmlcbiIKLSIJCQkJZmlcbiIKLSIJCQkJaWYgWyBcIngkSEFTSF92ZXJib3NlXCIgPSBcIngxXCIgXTsgdGhlblxuIgotIgkJCQkJZWNobyBcImNyZWF0aW5nOiAkbG5rIC0+IC4uLyRiYXNoYXNoXCJcbiIKLSIJCQkJZmlcbiIKLSIJCQkJbG4gLXMgXCIuLi8kYmFzaGFzaFwiIFwiJGxua1wiXG4iCi0iCQkJCWJyZWFrXG4iCi0iCQkJZmlcbiIKLSIJCWRvbmVcbiIKLSIJZmlcbiIKLSJ9XG4iCi0iXG4iCi0iY3JlYXRlX2tleSgpIHtcbiIKLSIJXG4iCi0iCWVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKLSIJZWNobyBcIkNyZWF0aW5nIG5ldyB4MTF2bmMgY2VydGlmaWNhdGUgYW5kIGtleSBmb3IgbmFtZTogJHR5cGUgJG5hbWUwXCJcbiIKLSIJZWNobyBcIlwiXG4iCi0iXG4iCi0iCXJlcV9hcmdzPSRSRVFfQVJHU1xuIgotIglpZiBlY2hvIFwiJHJlcV9hcmdzXCIgfCBncmVwICdkYXlzJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJOlxuIgotIgllbHNlXG4iCi0iCQlyZXFfYXJncz1cIiRyZXFfYXJncyAtZGF5cyA3MzBcIlxuIgotIglmaVxuIgotIlxuIgotIgljbmY9XCIkRElSL3RtcC9jbmYuJCRcIlxuIgotIgl0cmFwIFwicm0gLWYgXFxcIiRjbmZcXFwiXCIgMCAxIDIgMTVcbiIKLSJcbiIKLSIJcm0gLWYgXCIkRElSLyRkZXN0LmtleVwiIFwiJERJUi8kZGVzdC5jcnRcIiBcIiRESVIvJGRlc3QucmVxXCJcbiIKLSJcbiIKLSIJaWYgWyBcIngkc2VsZlwiID0gXCJ4MVwiIF07IHRoZW5cbiIKLSIJCWlmIFsgISAtZiBcIiRESVIvQ0Evc2VsZi5jbmYuJHR5cGVcIiBdOyB0aGVuXG4iCi0iCQkJZGlyZXJyb3IgXCIkRElSL0NBL3NlbGYuY25mLiR0eXBlXCJcbiIKLSIJCWZpXG4iCi0iCQljYXQgXCIkRElSL0NBL3NlbGYuY25mLiR0eXBlXCIgfCBzZWQgLWUgXCJzLyVOQU1FLyRuYW1lMC9cIiA+IFwiJGNuZlwiIHx8IGV4aXQgMVxuIgotIgkJXCIkT1BFTlNTTFwiIHJlcSAtY29uZmlnIFwiJGNuZlwiIC1ub2RlcyAtbmV3IC1uZXdrZXkgcnNhOjIwNDggLXg1MDkgJHJlcV9hcmdzIFxcXG4iCi0iCQkJLWtleW91dCBcIiRESVIvJGRlc3Qua2V5XCIgXFxcbiIKLSIJCQktb3V0ICAgIFwiJERJUi8kZGVzdC5jcnRcIlxuIgotIgllbHNlXG4iCi0iCQlpZiBbICEgLWYgXCIkRElSL0NBL3NzbC5jbmYuJHR5cGVcIiBdOyB0aGVuXG4iCi0iCQkJZGlyZXJyb3IgXCIkRElSL0NBL3NzbC5jbmYuJHR5cGVcIlxuIgotIgkJZmlcbiIKLSIJCWNhdCBcIiRESVIvQ0Evc3NsLmNuZi4kdHlwZVwiIHwgc2VkICAtZSBcInMvJU5BTUUvJG5hbWUwL1wiID4gXCIkY25mXCIgfHwgZXhpdCAxXG4iCi0iCQlcIiRPUEVOU1NMXCIgcmVxIC1jb25maWcgXCIkY25mXCIgLW5vZGVzIC1uZXcgLW5ld2tleSByc2E6MjA0OCAkcmVxX2FyZ3MgXFxcbiIKLSIJCQkta2V5b3V0IFwiJERJUi8kZGVzdC5rZXlcIiBcXFxuIgotIgkJCS1vdXQgICAgXCIkRElSLyRkZXN0LnJlcVwiXG4iCi0iCWZpXG4iCi0iCXJjPSQ/XG4iCi0iCWlmIFsgLWYgXCIkRElSLyRkZXN0LmtleVwiIF07IHRoZW5cbiIKLSIJCWNobW9kIGdvLXJ3eCBcIiRESVIvJGRlc3Qua2V5XCJcbiIKLSIJZmlcbiIKLSJcbiIKLSJcbiIKLSJcbiIKLSIJaWYgWyAkcmMgIT0gMCBdOyB0aGVuXG4iCi0iCQllY2hvIFwib3BlbnNzbCAncmVxJyBjb21tYW5kIGZhaWxlZFwiXG4iCi0iCQlybSAtZiBcIiRESVIvJGRlc3Qua2V5XCIgXCIkRElSLyRkZXN0LmNydFwiIFwiJERJUi8kZGVzdC5yZXFcIlxuIgotIgkJZXhpdCAxXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotImVuY19rZXkoKSB7XG4iCi0iCVxuIgotIgllY2hvIFwiXCJcbiIKLSIJZWNobyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIlxuIgotIgllY2hvIFwiRG8geW91IHdhbnQgdG8gcHJvdGVjdCB0aGUgZ2VuZXJhdGVkIHByaXZhdGUga2V5IHdpdGggYSBwYXNzcGhyYXNlP1wiXG4iCi0iCWVjaG8gXCJEb2luZyBzbyB3aWxsIHNpZ25pZmljYW50bHkgZGVjcmVhc2UgdGhlIGNoYW5jZXMgc29tZW9uZSBjb3VsZCBzdGVhbFwiXG4iCi0iCWlmIFsgXCJ4JHR5cGVcIiA9IFwieHNlcnZlclwiIF07IHRoZW5cbiIKLSIJZWNobyBcInRoZSBrZXkgYW5kIHByZXRlbmQgdG8gYmUgeW91ciB4MTF2bmMgc2VydmVyLiAgVGhlIGRvd25zaWRlIGlzIGl0IGlzXCJcbiIKLSIJZWxzZVxuIgotIgllY2hvIFwidGhlIGtleSBhbmQgcHJldGVuZCB0byBiZSB5b3VyIFZOQyBjbGllbnQuICBUaGUgZG93bnNpZGUgaXMgaXQgaXNcIlxuIgotIglmaVxuIgotIgllY2hvIFwiaW5jb252ZW5pZW50IGJlY2F1c2UgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkgdGhlIHBhc3NwaHJhc2UgRVZFUllcIlxuIgotIglpZiBbIFwieCR0eXBlXCIgPSBcInhzZXJ2ZXJcIiBdOyB0aGVuXG4iCi0iCWVjaG8gXCJ0aW1lIHlvdSBzdGFydCB4MTF2bmMgdXNpbmcgdGhpcyBrZXkuXCJcbiIKLSIJZWxzZVxuIgotIgllY2hvIFwidGltZSB5b3Ugc3RhcnQgdGhlIFZOQyB2aWV3ZXIgU1NMIHR1bm5lbCB1c2luZyB0aGlzIGtleS5cIlxuIgotIglmaVxuIgotIgllY2hvIFwiXCJcbiIKLSIJaWYgWyBcIlgkR0VOQ0VSVF9OT1BST01QVFwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJeD1cIlwiXG4iCi0iCQlmb3IgdHAgaW4gMSAyIDNcbiIKLSIJCWRvXG4iCi0iCQkJcHJpbnRmIFwiUHJvdGVjdCBrZXkgd2l0aCBhIHBhc3NwaHJhc2U/ICB5L24gXCJcbiIKLSIJCQlyZWFkIHhcbiIKLSIJCQl4PWBlY2hvIFwiJHhcIiB8IHRyICdBLVonICdhLXonIHwgc2VkIC1lICdzL1sgCV0vL2cnYFxuIgotIgkJCWlmIFsgXCJYJHhcIiA9IFwiWHlcIiAtbyBcIlgkeFwiID0gXCJYblwiIF07IHRoZW5cbiIKLSIJCQkJYnJlYWs7XG4iCi0iCQkJZWxzZSBcbiIKLSIJCQkJZWNobyBcIlBsZWFzZSByZXBseSB3aXRoIFxcXCJ5XFxcIiBvciBcXFwiblxcXCIuXCJcbiIKLSIJCQlmaVxuIgotIgkJZG9uZVxuIgotIgkJaWYgWyBcIlgkeFwiICE9IFwiWHlcIiAtYSBcIlgkeFwiICE9IFwiWG5cIiBdOyB0aGVuXG4iCi0iCQkJZWNobyBcIkFzc3VtaW5nIHJlcGx5IFxcXCJuXFxcIi5cIlxuIgotIgkJCXg9blxuIgotIgkJZmlcbiIKLSIJZWxzZVxuIgotIgkJZWNobyBcIk5PVCBwcm90ZWN0aW5nIHByaXZhdGUga2V5IHdpdGggcGFzc3BocmFzZS5cIlxuIgotIgkJeD1uXG4iCi0iCWZpXG4iCi0iCWVzdHI9XCIgKnVuZW5jcnlwdGVkKlwiXG4iCi0iCWlmIFsgXCJ4JEVOQ1JZUFRfT05MWVwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJCXRhcmdldD1cIiRFTkNSWVBUX09OTFlcIlxuIgotIgllbHNlXG4iCi0iCQl0YXJnZXQ9XCIkRElSLyRkZXN0LmtleVwiXG4iCi0iCQliZGlyPWBkaXJuYW1lIFwiJERJUi8kZGVzdC5rZXlcImBcbiIKLSIJCWlmIFsgISAtZCBcIiRiZGlyXCIgXTsgdGhlblxuIgotIgkJCWRpcmVycm9yIFwiJGJkaXJcIlxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSIJaWYgWyBcIngkeFwiICE9IFwieG5cIiBdOyB0aGVuXG4iCi0iCQlcIiRPUEVOU1NMXCIgcnNhIC1pbiBcIiR0YXJnZXRcIiAtZGVzMyAtb3V0IFwiJHRhcmdldFwiXG4iCi0iCQlpZiBbICQ/ICE9IDAgXTsgdGhlblxuIgotIgkJCWVjaG8gXCJvcGVuc3NsICdyc2EnIGNvbW1hbmQgZmFpbGVkXCJcbiIKLSIJCQlybSAtZiBcIiRESVIvJGRlc3Qua2V5XCIgXCIkRElSLyRkZXN0LmNydFwiIFwiJERJUi8kZGVzdC5yZXFcIlxuIgotIgkJCWV4aXQgMVxuIgotIgkJZmlcbiIKLSIJCWVzdHI9XCIgZW5jcnlwdGVkXCJcbiIKLSIJZmlcbiIKLSIJZWNobyBcIlwiXG4iCi0ifVxuIgotIlxuIgotInNpZ25fa2V5KCkge1xuIgotIgljZCBcIiRESVJcIiB8fCBleGl0IDFcbiIKLSJcbiIKLSIJaWYgWyBcIngkc2VsZlwiID0gXCJ4MVwiIF07IHRoZW5cbiIKLSIJCTpcbiIKLSIJZWxzZVxuIgotIgkJaWYgZWNobyBcIiRuYW1lMFwiIHwgZ3JlcCAnXnJlcTonID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIlxuIgotIgkJCWVjaG8gXCJZb3VyIHgxMXZuYyAkdHlwZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzOlwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIiAgICAgICAgJERJUi8kZGVzdC5yZXFcIlxuIgotIgkJCWVjaG8gXCJcIlxuIgotIgkJCWVjaG8gXCIgICBJdCBtYXkgYmUgc2VudCB0byBhbiBleHRlcm5hbCBDQSBmb3Igc2lnbmluZywgYWZ0ZXJ3YXJkIHlvdSBjYW5cIlxuIgotIgkJCWVjaG8gXCIgICBzYXZlIHRoZSBjZXJ0IHRoZXkgc2VuZCB5b3UgaW46XCJcbiIKLSIJCQllY2hvIFwiXCJcbiIKLSIJCQllY2hvIFwiICAgICAgICAkRElSLyRkZXN0LmNydFwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIllvdXIkZXN0ciBwcml2YXRlIHgxMXZuYyAkdHlwZSBrZXkgaXM6XCJcbiIKLSIJCQllY2hvIFwiXCJcbiIKLSIJCQllY2hvIFwiICAgICAgICAkRElSLyRkZXN0LmtleVwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIiAgIFlvdSBzaG91bGQgY29tYmluZSBpdCBhbmQgdGhlIHJlY2VpdmVkIGNlcnQgaW4gdGhlIGZpbGU6XCJcbiIKLSIJCQllY2hvIFwiXCJcbiIKLSIJCQllY2hvIFwiICAgICAgICAkRElSLyRkZXN0LnBlbVwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIiAgIEl0IHdpbGwgYmUgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyB0byBpZGVudGlmeSB0aGVtc2VsdmVzLlwiXG4iCi0iCQkJZWNobyBcIiAgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBzZWNyZXQuXCJcbiIKLSIJCQllY2hvIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJaWYgWyBcIlgkR0VOQ0VSVF9OT1BST01QVFwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQlwcmludGYgXCJQcmVzcyBFbnRlciB0byBwcmludCB0aGUgJGRlc3QucmVxIGNlcnQgcmVxdWVzdCB0byB0aGUgc2NyZWVuOiBcIlxuIgotIgkJCQlyZWFkIHhcbiIKLSIJCQlmaVxuIgotIgkJCWVjaG8gXCJcIlxuIgotIgkJCWNhdCBcIiRESVIvJGRlc3QucmVxXCJcbiIKLSIJCQlleGl0IDBcbiIKLSIJCWZpXG4iCi0iCQllY2hvIFwiXCJcbiIKLSIJCWVjaG8gXCJcIlxuIgotIgkJZWNobyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIlxuIgotIgkJZWNobyBcIk5vdyBzaWduaW5nIHRoZSBuZXcga2V5IHdpdGggQ0EgcHJpdmF0ZSBrZXkuICBZb3Ugd2lsbCBuZWVkIHRvIHN1cHBseVwiXG4iCi0iCQllY2hvIFwidGhlIENBIGtleSBwYXNzcGhyYXNlIGFuZCByZXBseSBcXFwieVxcXCIgdG8gc2lnbiBhbmQgY29tbWl0IHRoZSBrZXkuXCJcbiIKLSIJCWVjaG8gXCJcIlxuIgotIgkJXCIkT1BFTlNTTFwiIGNhIC1jb25maWcgXCIkY25mXCIgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLW5vdGV4dCBcXFxuIgotIgkJCS1pbiAgXCIkRElSLyRkZXN0LnJlcVwiIFxcXG4iCi0iCQkJLW91dCBcIiRESVIvJGRlc3QuY3J0XCJcbiIKLSIJCWlmIFsgJD8gIT0gMCBdOyB0aGVuXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIm9wZW5zc2wgJ2NhJyBjb21tYW5kIGZhaWxlZFwiXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQkJZWNobyBcIiAgWW91IG1heSBoYXZlIGEgZHVwbGljYXRlIEROIGVudHJ5IGZvciB0aGlzIG5hbWUgaW46XCJcbiIKLSIJCQllY2hvIFwiXCJcbiIKLSIJCQllY2hvIFwiICAgICAgICAgICRESVIvQ0EvaW5kZXgudHh0XCJcbiIKLSIJCQllY2hvIFwiXCJcbiIKLSIJCQllY2hvIFwiICByZW1vdmUgdGhlIGR1cGxpY2F0ZSBpbiB0aGF0IGZpbGUgYW5kIHRyeSBhZ2Fpbi5cIlxuIgotIgkJCWVjaG8gXCJcIlxuIgotIgkJCXJtIC1mIFwiJERJUi8kZGVzdC5rZXlcIiBcIiRESVIvJGRlc3QuY3J0XCIgXCIkRElSLyRkZXN0LnJlcVwiXG4iCi0iCQkJZXhpdCAxXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIlxuIgotIgljYXQgIFwiJERJUi8kZGVzdC5rZXlcIiAgXCIkRElSLyRkZXN0LmNydFwiIFxcXG4iCi0iCQk+IFwiJERJUi8kZGVzdC5wZW1cIiB8fCBleGl0IDEgXG4iCi0iXG4iCi0iCW1ha2VfSEFTSCBcIiRESVIvJGRlc3QuY3J0XCIgMFxuIgotIlxuIgotIglybSAtZiBcIiRESVIvJGRlc3Qua2V5XCIgXCIkRElSLyRkZXN0LnJlcVwiIHx8IGV4aXQgMVxuIgotIgljaG1vZCBnby1yd3ggXCIkRElSLyRkZXN0LnBlbVwiIHx8IGV4aXQgMVxuIgotIlxuIgotIglpZiBbIFwieCR0eXBlXCIgPSBcInhzZXJ2ZXJcIiAtbyBcIngkdHlwZVwiID0gXCJ4Y2xpZW50XCIgXTsgdGhlblxuIgotIgkJZWNobyBcIlwiXG4iCi0iCQllY2hvIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iCQllY2hvIFwiWW91ciBwdWJsaWMgeDExdm5jICR0eXBlIGNlcnQgaXM6XCJcbiIKLSIJCWVjaG8gXCJcIlxuIgotIgkJZWNobyBcIiAgICAgICAgJERJUi8kZGVzdC5jcnRcIlxuIgotIgkJZWNobyBcIlwiXG4iCi0iCQllY2hvIFwiICAgSXQgbWF5IGJlIGNvcGllZCB0byBvdGhlciBtYWNoaW5lcyAvIGFwcGxpY2F0aW9ucyB0byBiZSB1c2VkIGZvclwiXG4iCi0iCQllY2hvIFwiICAgYXV0aGVudGljYXRpb24uICBIb3dldmVyLCBzaW5jZSBpdCBpcyBzaWduZWQgd2l0aCB0aGUgeDExdm5jIENBXCJcbiIKLSIJCWVjaG8gXCIgICBrZXksIGFsbCB0aGUgYXBwbGljYXRpb25zIG5lZWQgaXMgdGhlIHgxMXZuYyBDQSBjZXJ0aWZpY2F0ZS5cIlxuIgotIgkJZWNobyBcIlwiXG4iCi0iCQllY2hvIFwiWW91ciRlc3RyIHByaXZhdGUgeDExdm5jICR0eXBlIGtleSBpczpcIlxuIgotIgkJZWNobyBcIlwiXG4iCi0iCQllY2hvIFwiICAgICAgICAkRElSLyRkZXN0LnBlbVwiXG4iCi0iCQllY2hvIFwiXCJcbiIKLSIJCWVjaG8gXCIgICBJdCB3aWxsIGJlIG5lZWRlZCBieSBhcHBsaWNhdGlvbnMgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcy5cIlxuIgotIgkJZWNobyBcIiAgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBzZWNyZXQuXCJcbiIKLSIJCWVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKLSIJCWVjaG8gXCJcIlxuIgotIglmaVxuIgotIlxuIgotIglpZiBbIFwiWCRHRU5DRVJUX05PUFJPTVBUXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlwcmludGYgXCJQcmVzcyBFbnRlciB0byBwcmludCB0aGUgJGRlc3QuY3J0IGNlcnRpZmljYXRlIHRvIHRoZSBzY3JlZW46IFwiXG4iCi0iCQlyZWFkIHhcbiIKLSIJZmlcbiIKLSIJZWNobyBcIlwiXG4iCi0iCWNhdCBcIiRESVIvJGRlc3QuY3J0XCJcbiIKLSJ9XG4iCi0iXG4iCi0iRElSPSRCQVNFX0RJUlxuIgotImlmIFsgXCJ4JERJUlwiID0gXCJ4XCIgXTsgdGhlblxuIgotIiAgICAgICAgRElSPVwiJEhPTUUvZG90a2pyX3ZuYy9jZXJ0c1wiXG4iCi0iZmlcbiIKLSJpZiBlY2hvIFwiJERJUlwiIHwgZ3JlcCAnXi8nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCTpcbiIKLSJlbHNlXG4iCi0iCURJUj1cImBwd2RgLyRESVJcIlxuIgotImZpXG4iCi0iXG4iCi0iaWYgWyBcIngkSEFTSE9OXCIgIT0gXCJ4XCIgXTsgdGhlblxuIgotIglmb3IgZGlyIGluIFwiJERJUi9IQVNIXCIgXCIkRElSL2NsaWVudHMvSEFTSFwiXG4iCi0iCWRvXG4iCi0iCQlpZiBbIC1kIFwiJGRpclwiIF07IHRoZW5cbiIKLSIJCQlybSAtcmYgXCIkZGlyXCJcbiIKLSIJCWZpXG4iCi0iCWRvbmVcbiIKLSIJZGlyPVwiJERJUi9IQVNIXCJcbiIKLSIJbWtkaXIgLXAgXCIkZGlyXCIgfHwgZXhpdCAxXG4iCi0iCWRpcj1cIiRESVIvY2xpZW50cy9IQVNIXCJcbiIKLSIJbWtkaXIgLXAgXCIkZGlyXCIgfHwgZXhpdCAxXG4iCi0iCUhBU0hfdmVyYm9zZT0xXG4iCi0iCWZvciBmIGluIFwiJERJUlwiLyouY3J0IFwiJERJUlwiL2NsaWVudHMvKi5jcnRcbiIKLSIJZG9cbiIKLSIJCWlmIFsgLWYgXCIkZlwiIF07IHRoZW5cbiIKLSIJCQltYWtlX0hBU0ggXCIkZlwiIDBcbiIKLSIJCWZpXG4iCi0iCWRvbmVcbiIKLSIJZXhpdFxuIgotImZpXG4iCi0iaWYgWyBcIngkSEFTSE9GRlwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJZGlyPVwiJERJUi9IQVNIXCJcbiIKLSIJZm9yIGRpciBpbiBcIiRESVIvSEFTSFwiIFwiJERJUi9jbGllbnRzL0hBU0hcIlxuIgotIglkb1xuIgotIgkJaWYgWyAtZCBcIiRkaXJcIiBdOyB0aGVuXG4iCi0iCQkJZm9yIGYgaW4gXCIkZGlyXCIvKlxuIgotIgkJCWRvXG4iCi0iCQkJCWlmIFsgLWYgXCIkZlwiIF07IHRoZW5cbiIKLSIJCQkJCWVjaG8gXCJkZWxldGluZzogJGZcIlxuIgotIgkJCQkJcm0gLWYgXCIkZlwiXG4iCi0iCQkJCWZpXG4iCi0iCQkJZG9uZVxuIgotIgkJCXJtIC1yZiBcIiRkaXJcIlxuIgotIgkJZmlcbiIKLSIJZG9uZVxuIgotIglleGl0XG4iCi0iZmlcbiIKLSJcbiIKLSJQQVRIPS91c3IvYmluOi9iaW46L3Vzci9zYmluOiRQQVRIOyBleHBvcnQgUEFUSFxuIgotImlmIFsgXCJ4JE9QRU5TU0xcIiA9IFwieFwiIF07IHRoZW5cbiIKLSIgICAgICAgIE9QRU5TU0w9XCJvcGVuc3NsXCJcbiIKLSJmaVxuIgotIlxuIgotInR5cGUgXCIkT1BFTlNTTFwiID4gL2Rldi9udWxsCXx8IGV4aXQgMVxuIgotIlxuIgotInNlbGY9XCJcIlxuIgotImlmIFsgXCJ4JFNFTEZcIiAhPSBcInhcIiBdOyB0aGVuXG4iCi0iCXNlbGY9MVxuIgotImVsaWYgWyBcIngkMVwiID0gXCJ4LXNlbGZcIiBdOyB0aGVuXG4iCi0iCXNoaWZ0XG4iCi0iCXNlbGY9MVxuIgotImZpXG4iCi0iXG4iCi0iaWYgWyBcIngkVFlQRVwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJdHlwZT1cIiRUWVBFXCJcbiIKLSJlbHNlXG4iCi0iCWlmIFsgXCJYJDFcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQl0eXBlPVwiJDFcIlxuIgotIgkJc2hpZnRcbiIKLSIJZmlcbiIKLSJmaVxuIgotImlmIFsgXCJ4JE5BTUVcIiAhPSBcInhcIiBdOyB0aGVuXG4iCi0iCW5hbWU9XCIkTkFNRVwiXG4iCi0iZWxzZVxuIgotIglpZiBbIFwiWCQxXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJbmFtZT1cIiQxXCJcbiIKLSIJCXNoaWZ0XG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJcbiIKLSJpZiBlY2hvIFwiJG5hbWVcIiB8IGdyZXAgJ15zZWxmOicgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJc2VsZj0xXG4iCi0iZmlcbiIKLSJcbiIKLSJpZiBbIFwieCR0eXBlXCIgPSBcInhzZXJ2ZXJcIiBdOyB0aGVuXG4iCi0iCW5hbWUwPVwiJG5hbWVcIlxuIgotIglpZiBlY2hvIFwiJG5hbWVcIiB8IGdyZXAgJ14tJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJOlxuIgotIgllbGlmIFsgXCJ4JG5hbWVcIiAhPSBcInhcIiBdOyB0aGVuXG4iCi0iCQluYW1lPVwiLSRuYW1lXCI7XG4iCi0iCWZpXG4iCi0iCWRlc3Q9XCJzZXJ2ZXIkbmFtZVwiXG4iCi0iZWxpZiBbIFwieCR0eXBlXCIgPSBcInhjbGllbnRcIiBdOyB0aGVuXG4iCi0iCWlmIFsgXCJ4JG5hbWVcIiA9IFwieFwiIF07IHRoZW5cbiIKLSIJCW5hbWU9XCJub2JvZHlcIlxuIgotIglmaVxuIgotIgluYW1lMD1cIiRuYW1lXCJcbiIKLSIJZGVzdD1cImNsaWVudHMvJG5hbWVcIlxuIgotImVsc2VcbiIKLSIJZXhpdCAxXG4iCi0iZmlcbiIKLSJcbiIKLSIjc2V0IC14dlxuIgotIlxuIgotImlmIFsgXCJ4JElORk9fT05MWVwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJZWNobyBcIlwiXG4iCi0iCWVjaG8gXCJWTkMgQ2VydGlmaWNhdGUgZmlsZTpcIlxuIgotIgllY2hvIFwiCSRJTkZPX09OTFlcIlxuIgotIgllY2hvIFwiXCJcbiIKLSIJXCIkT1BFTlNTTFwiIHg1MDkgLXRleHQgLWluIFwiJElORk9fT05MWVwiXG4iCi0iCWV4aXQgXG4iCi0iZWxpZiBbIFwieCRERUxFVEVfT05MWVwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJZWNobyBcIlwiXG4iCi0iCWVjaG8gXCJWTkMgQ2VydGlmaWNhdGUgZmlsZTpcIlxuIgotIgllY2hvIFwiCSRERUxFVEVfT05MWVwiXG4iCi0iCWVjaG8gXCJcIlxuIgotIglcbiIKLSIJYmFzZT1gZWNobyBcIiRERUxFVEVfT05MWVwiIHwgc2VkIC1lICdzL1xcLi4uLiQvLydgXG4iCi0iCWZvciBzdWZmIGluIGNydCBwZW0ga2V5IHJlcVxuIgotIglkb1xuIgotIgkJdHJ5PVwiJGJhc2UuJHN1ZmZcIlxuIgotIgkJaWYgWyAtZiBcIiR0cnlcIiBdOyB0aGVuXG4iCi0iCQkJbWFrZV9IQVNIIFwiJHRyeVwiIDFcbiIKLSIJCQlybSAtaSBcIiR0cnlcIlxuIgotIgkJZmlcbiIKLSIJZG9uZVxuIgotIglpZiBlY2hvIFwiJGJhc2VcIiB8IGdyZXAgJ0NBL2NhY2VydCQnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQliYXNlMj1gZWNobyBcIiRiYXNlXCIgfCBzZWQgLWUgJ3MsY2FjZXJ0JCxwcml2YXRlL2Nha2V5LCdgXG4iCi0iCWVsc2VcbiIKLSIJCWVjaG8gXCJcIlxuIgotIgkJZXhpdFxuIgotIglmaVxuIgotIgllY2hvIFwiXCJcbiIKLSIJZm9yIHN1ZmYgaW4gY3J0IHBlbSBrZXkgcmVxXG4iCi0iCWRvXG4iCi0iCQl0cnk9XCIkYmFzZTIuJHN1ZmZcIlxuIgotIgkJaWYgWyAtZiBcIiR0cnlcIiBdOyB0aGVuXG4iCi0iCQkJbWFrZV9IQVNIIFwiJHRyeVwiIDFcbiIKLSIJCQlybSAtaSBcIiR0cnlcIlxuIgotIgkJZmlcbiIKLSIJZG9uZVxuIgotIgllY2hvIFwiXCJcbiIKLSIJZXhpdCBcbiIKLSJlbGlmIFsgXCJ4JEVOQ1JZUFRfT05MWVwiICE9IFwieFwiIF07IHRoZW5cbiIKLSIJaWYgWyBcIngkdHlwZVwiID0gXCJ4XCIgXTsgdGhlblxuIgotIgkJdHlwZT1cInNlcnZlclwiXG4iCi0iCWZpXG4iCi0iCWVjaG8gXCJcIlxuIgotIgllY2hvIFwiS2V5IFBFTSBmaWxlOlwiXG4iCi0iCWVjaG8gXCIJJEVOQ1JZUFRfT05MWVwiXG4iCi0iCWVuY19rZXlcbiIKLSIJZXhpdFxuIgotImZpXG4iCi0iXG4iCi0iaWYgWyAhIC1kIFwiJERJUi90bXBcIiBdOyB0aGVuXG4iCi0iCWRpcmVycm9yIFwiJERJUi90bXBcIlxuIgotImZpXG4iCi0iYmRpcj1gZGlybmFtZSBcIiRESVIvJGRlc3Qua2V5XCJgXG4iCi0iaWYgWyAhIC1kIFwiJGJkaXJcIiBdOyB0aGVuXG4iCi0iCWRpcmVycm9yIFwiJGJkaXJcIlxuIgotImZpXG4iCi0iaWYgWyAhIC1mIFwiJERJUi9DQS9jYWNlcnQucGVtXCIgXTsgdGhlblxuIgotIglkaXJlcnJvciBcIiRESVIvQ0EvY2FjZXJ0LnBlbVwiXG4iCi0iZmlcbiIKLSJcbiIKLSJjcmVhdGVfa2V5XG4iCi0iZW5jX2tleVxuIgotInNpZ25fa2V5XG4iCi07Ci0KLWNoYXIgZmluZF9kaXNwbGF5W10gPSAKLSIjIS9iaW4vc2hcbiIKLSIjXG4iCi0iIyBTY3JpcHQgZm9yIHVzZSBpbiAtZGlzcGxheSBXQUlUOmNtZD1GSU5ERElTUExBWSAtdW5peHB3IG1vZGUuXG4iCi0iIyBBdHRlbXB0cyB0byBmaW5kIDEpIERJU1BMQVkgYW5kIDIpIFhBVVRIIGRhdGEgZm9yIHRoZSB1c2VyIGFuZFxuIgotIiMgcmV0dXJucyB0aGVtIHRvIGNhbGxlci5cbiIKLSIjXG4iCi0iIyBUaGUgaWRlYSBpcyB0aGlzIHNjcmlwdCBpcyBydW4gdmlhIHN1IC0gdXNlciAtYyAuLi4gYW5kIHJldHVybnNcbiIKLSIjIGRpc3BsYXkgKyB4YXV0aCBpbmZvIHRvIGNhbGxlciAoeDExdm5jIHJ1bm5pbmcgYXMgcm9vdCBvciBub2JvZHkpLlxuIgotIiMgeDExdm5jIHRoZW4gdXNlcyB0aGUgaW5mbyB0byBvcGVuIHRoZSBkaXNwbGF5LlxuIgotIiNcbiIKLSIjIElmIG5vdCBjYWxsZWQgd2l0aCAtdW5peHB3LCByb290LCBldGMuIHVzZXMgY3VycmVudCAkVVNFUi5cbiIKLSJcbiIKLSIjRklORF9ESVNQTEFZX09VVFBVVD0vdG1wL2Zkby4kVVNFUi50eHRcbiIKLSJcbiIKLSJpZiBbIFwiWCRGSU5EX0RJU1BMQVlfT1VUUFVUXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIglpZiBbIFwiWCRGSU5EX0RJU1BMQVlfRVhFQ1wiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJRklORF9ESVNQTEFZX0VYRUM9MVxuIgotIgkJZXhwb3J0IEZJTkRfRElTUExBWV9FWEVDXG4iCi0iCQkjIHdlIHJlcnVuIG91cnNlbHZlcyB3aXRoIHZlcmJvc2Ugb3V0cHV0IHRvIGEgZmlsZTpcbiIKLSIJCSNcbiIKLSIJCWlmIFsgXCJYJEZJTkRfRElTUExBWV9PVVRQVVRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJL2Jpbi9zaCAkMCBcIiRAXCIgMj4gJEZJTkRfRElTUExBWV9PVVRQVVRcbiIKLSIJCWVsc2VcbiIKLSIJCQkvYmluL3NoICQwIFwiJEBcIiAyPiAvZGV2L251bGxcbiIKLSIJCWZpXG4iCi0iCQlleGl0ICQ/XG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJcbiIKLSJpZiBbIFwiWCRGSU5EX0RJU1BMQVlfT1VUUFVUXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkjIHR1cm4gb24gdmVyYm9zZSBvdXRwdXRcbiIKLSIJc2V0IC14dlxuIgotImZpXG4iCi0iaWYgWyBcIlgkRklORF9ESVNQTEFZX0RFQlVHXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkjIHByaW50IGVudmlyb25tZW50IGFuZCB0dXJuIG9uIHZlcmJvc2Ugb3V0cHV0XG4iCi0iCWVudlxuIgotIglzZXQgLXh2XG4iCi0iZmlcbiIKLSJcbiIKLSJpZiBbIFwiWCRYMTFWTkNfU0tJUF9ESVNQTEFZXCIgPSBcIlhhbGxcIiBdOyB0aGVuXG4iCi0iCWV4aXQgMVxuIgotImZpXG4iCi0iXG4iCi0iIyBTZXQgUEFUSCB0byBwaWNrIHVwIHV0aWxpdGllcyB3ZSB1c2UgYmVsb3cuXG4iCi0iUEFUSD0kUEFUSDovYmluOi91c3IvYmluOi91c3IvWDExUjYvYmluOi91c3IvYmluL1gxMTovdXNyL29wZW53aW4vYmluOi91c3IvdWNiXG4iCi0iZXhwb3J0IFBBVEhcbiIKLSJcbiIKLSIjIFRoaXMgaXMgdG8gdHJ5IHRvIHRyaWNrIHBzKDEpIGludG8gd3JpdGluZyB3aWRlIGxpbmVzOiBcbiIKLSJDT0xVTU5TPTI1NlxuIgotImV4cG9ydCBDT0xVTU5TXG4iCi0iXG4iCi0iIyAtbiBtZWFucyBubyB4YXV0aCwgLWYgcHJlc2NyaWJlcyBmaWxlIHRvIHVzZS5cbiIKLSJzaG93eGF1dGg9MVxuIgotImlmIFsgXCJYJDFcIiA9IFwiWC1uXCIgXTsgdGhlblxuIgotIglzaG93eGF1dGg9XCJcIlxuIgotIglzaGlmdFxuIgotImZpXG4iCi0iaWYgWyBcIlgkRklORF9ESVNQTEFZX05PX1NIT1dfWEFVVEhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCXNob3d4YXV0aD1cIlwiXG4iCi0iZmlcbiIKLSJcbiIKLSIjIC1mIG1lYW5zIHVzZSB0aGlzIHhhdXRob3JpdHkgZmlsZTpcbiIKLSJpZiBbIFwiWCQxXCIgPSBcIlgtZlwiIF07IHRoZW5cbiIKLSIJc2hpZnRcbiIKLSIJaWYgWyAhIC1yICQxIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJcIlxuIgotIgkJZXhpdCAxXG4iCi0iCWZpXG4iCi0iCWV4cG9ydCBYQVVUSE9SSVRZPVwiJDFcIlxuIgotIglzaGlmdFxuIgotImZpXG4iCi0iXG4iCi0iIyB3ZSBuZWVkIHRvIHNldCB1c2VyOlxuIgotIiNcbiIKLSJ1c2VyPVwiJDFcIgkJCSMgY21kIGxpbmUgYXJnIHRha2VzIHByZWNlZGVuY2VcbiIKLSJpZiBbIFwiWCR1c2VyXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCXVzZXI9JFgxMVZOQ19VU0VSCSMgdGhlbiBYMTFWTkNfVVNFUlxuIgotImZpXG4iCi0iaWYgWyBcIlgkdXNlclwiID0gXCJYXCIgXTsgdGhlblxuIgotIgl1c2VyPSRVU0VSCQkjIHRoZW4gVVNFUlxuIgotImZpXG4iCi0iaWYgWyBcIlgkdXNlclwiID0gXCJYXCIgXTsgdGhlblxuIgotIgl1c2VyPSRMT0dOQU1FCQkjIHRoZW4gTE9HTkFNRVxuIgotImZpXG4iCi0iaWYgWyBcIlgkdXNlclwiID0gXCJYXCIgXTsgdGhlblxuIgotIgl1c2VyPWB3aG9hbWkgMj4vZGV2L251bGxgCSMgZGVzcGVyYXRpb24gd2hvYW1pXG4iCi0iZmlcbiIKLSJpZiBbIFwiWCR1c2VyXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCWVjaG8gXCJcIgkJIyBmYWlsdXJlXG4iCi0iCWV4aXQgMVxuIgotImZpXG4iCi0iXG4iCi0iTENfQUxMPUNcbiIKLSJleHBvcnQgTENfQUxMXG4iCi0iXG4iCi0iIyB1dGlsIHRvIHRyeSB0byBtYXRjaCBhIGRpc3BsYXkgd2l0aCBhIExpbnV4IFZUIGFuZCBwcmludFxuIgotIiMgZGlzcCxWVD0uLi4gZXRjLiAgT3RoZXJ3aXNlIGp1c3QgcHJpbnQgb3V0IGRpc3BsYXkuXG4iCi0iI1xuIgotInByZHB5ICgpIHtcbiIKLSIJZDE9JDFcbiIKLSIJY2h2dDA9XCJcIlxuIgotIglpZiBbIFwiWCRGSU5EX0RJU1BMQVlfTk9fVlRfRklORFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCTpcbiIKLSIJIyB3ZSBjYW4gb25seSBkbyBjaHZ0IG9uIExpbnV4OlxuIgotIgllbGlmIFsgXCJYJHVuYW1lXCIgPSBcIlhMaW51eFwiIF07IHRoZW5cbiIKLSIJCWQyPSRkMVxuIgotIgkJZDM9YGVjaG8gXCIkZDJcIiB8IHNlZCAtZSAncy9eLio6LzovJyAtZSAncy9cXC4uKiQvLydgXG4iCi0iCQlkND1cIigkZDJ8JGQzKVwiXG4iCi0iXG4iCi0iCQkjIHZ0IGlzIHVzdWFsbHkgaW4gWCBzZXJ2ZXIgbGluZTpcbiIKLSIJCSNcbiIKLSIJCXBzX3RtcD1gcHMgd3dhdXggfCBncmVwIFhgXG4iCi0iCQl2dD1gZWNobyBcIiRwc190bXBcIiB8IGdyZXAgWCB8IGVncmVwIC12ICdzdGFydHh8eGluaXQnIHwgZWdyZXAgXCIgJGQ0IFwiIHwgZWdyZXAgJyB2dChbNzg5XXxbMS05XVswLTldWzAtOV0qKSAnIHwgZ3JlcCAtdiBncmVwIHwgaGVhZCAtbiAxYFxuIgotIlxuIgotIgkJaWYgWyBcIlgkdnRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJIyBzdHJpcCBpdCBvdXQgYW5kIGFkZCBpdC5cbiIKLSIJCQl2dD1gZWNobyBcIiR2dFwiIHwgc2VkIC1lICdzL14uKiB2dFxcKFswLTldWzAtOV0qXFwpIC4qJC9cXDEvJ2BcbiIKLSIJCQlpZiBlY2hvIFwiJHZ0XCIgfCBncmVwICdeWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQljaHZ0MD1cIixWVD0kdnRcIlxuIgotIgkJCWZpXG4iCi0iCQllbHNlXG4iCi0iCQkJIyBvdGhlcndpc2UgbG9vayBmb3IgdHR5OlxuIgotIgkJCXZ0PWBlY2hvIFwiJHBzX3RtcFwiIHwgZ3JlcCBYIHwgZWdyZXAgXCIgJGQ0IFwiIHwgZWdyZXAgJyB0dHkoWzc4OV18WzEtOV1bMC05XVswLTldKikgJyB8IGdyZXAgLXYgZ3JlcCB8IGhlYWQgLW4gMWBcbiIKLSIJCQlpZiBbIFwiWCR2dFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQkJdnQ9YGVjaG8gXCIkdnRcIiB8IHNlZCAtZSAncy9eLiogdHR5XFwoWzAtOV1bMC05XSpcXCkgLiokL1xcMS8nYFxuIgotIgkJCQlpZiBlY2hvIFwiJHZ0XCIgfCBncmVwICdeWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQkJY2h2dDA9XCIsVlQ9JHZ0XCJcbiIKLSIJCQkJZmlcbiIKLSIJCQllbHNlXG4iCi0iCQkJCSMgb3RoZXJ3aXNlIHRyeSBsc29mOlxuIgotIgkJCQlwdnQ9YGVjaG8gXCIkcHNfdG1wXCIgfCBncmVwIFggfCBlZ3JlcCAtdiAnc3RhcnR4fHhpbml0JyB8IGVncmVwIFwiICRkNCBcIiB8IGhlYWQgLW4gMSB8IGF3ayAne3ByaW50ICQyfSdgXG4iCi0iCQkJCWlmIFsgXCJYJEZJTkRfRElTUExBWV9OT19MU09GXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJaWYgWyBcIlgkcHZ0XCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJCWNodnQwPVwiLFhQSUQ9JHB2dFwiXG4iCi0iCQkJCQlmaVxuIgotIgkJCQllbGlmIFsgXCJYJHB2dFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQkJCXZ0PWBsc29mIC1iIC1wIFwiJHB2dFwiIDI+L2Rldi9udWxsIHwgZWdyZXAgJy9kZXYvdHR5KFs3ODldfFsxLTldWzAtOV1bMC05XSopJCcgfCBncmVwIC12IGdyZXAgfCBoZWFkIC1uIDEgfCBhd2sgJ3twcmludCAkTkZ9JyB8IHNlZCAtZSAncywvZGV2L3R0eSwsJ2BcbiIKLSIJCQkJCWlmIGVjaG8gXCIkdnRcIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQkJY2h2dDA9XCIsVlQ9JHZ0XCJcbiIKLSIJCQkJCWVsc2VcbiIKLSIJCQkJCQkjIGlmIHRoaXMgZmFpbHMsIGF0IGxlYXN0IHRlbGwgdGhlbSB0aGUgWFBJRDpcbiIKLSIJCQkJCQljaHZ0MD1cIixYUElEPSRwdnRcIlxuIgotIgkJCQkJZmlcbiIKLSIJCQkJZmlcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSJcbiIKLSIJIyByZXR1cm4gdGhlIHN0cmluZywgcG9zc2libHkgd2l0aCAsVlQ9Li4uIGFwcGVuZGVkOlxuIgotIgkjXG4iCi0iCWVjaG8gXCIkZDEkY2h2dDBcIlxuIgotIn1cbiIKLSJcbiIKLSIjIHNhdmUgdW5hbWUsIG5ldHN0YXQsIGFuZCBwcyBvdXRwdXQ6XG4iCi0idW5hbWU9YHVuYW1lYFxuIgotImlzX2JzZD1cIlwiXG4iCi0iaWYgZWNobyBcIiR1bmFtZVwiIHwgZ3JlcCAtaSBic2QgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJaXNfYnNkPTFcbiIKLSJmaVxuIgotIlxuIgotImlmIFsgXCJYJHVuYW1lXCIgPSBcIlhEYXJ3aW5cIiBdOyB0aGVuXG4iCi0iCXBzb3V0PWBwcyBhdXggMj4vZGV2L251bGwgICAgICAgICAgICAgIHwgZ3JlcCAtd3YgUElEIHwgZ3JlcCAtdiBncmVwYFxuIgotImVsaWYgWyBcIlgkdW5hbWVcIiA9IFwiWExpbnV4XCIgLW8gXCJYJGlzX2JzZFwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJcHNvdXQ9YHBzIHd3YXV4IDI+L2Rldi9udWxsICAgICAgICAgICB8IGdyZXAgLXd2IFBJRCB8IGdyZXAgLXYgZ3JlcGBcbiIKLSJlbGlmIFsgXCJYJHVuYW1lXCIgPSBcIlhTdW5PU1wiIC1hIC14IC91c3IvdWNiL3BzIF07IHRoZW5cbiIKLSIJcHNvdXQ9YC91c3IvdWNiL3BzIHd3YXV4IDI+L2Rldi9udWxsICB8IGdyZXAgLXd2IFBJRCB8IGdyZXAgLXYgZ3JlcGBcbiIKLSJlbHNlXG4iCi0iCXBzb3V0PWBwcyAtZWYgMj4vZGV2L251bGwgfCBncmVwIC13diBQSUQgfCBncmVwIC12IGdyZXBgXG4iCi0iZmlcbiIKLSJwc2xpc3Q9YGVjaG8gXCIkcHNvdXRcIiB8IGF3ayAne3ByaW50ICQyfSdgXG4iCi0iXG4iCi0ibnNvdXQ9YG5ldHN0YXQgLWFuYFxuIgotIlxuIgotInJjaGsoKSB7XG4iCi0iCXJyPXJyCVxuIgotIn1cbiIKLSJcbiIKLSJkTD1cIi1MXCJcbiIKLSJpZiB1bmFtZSAtc3IgfCBlZ3JlcCAnU3VuT1MgNVxcLls1LThdJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIglkTD1cIi1oXCJcbiIKLSJmaVxuIgotIlxuIgotIiMgYSBwb3J0YWJsZSB0bXAgZmlsZSBjcmVhdG9yXG4iCi0ibXl0bXAoKSB7XG4iCi0iCXRmPSQxXG4iCi0iCWlmIHR5cGUgbWt0ZW1wID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCSMgaWYgd2UgaGF2ZSBta3RlbXAoMSksIHVzZSBpdDpcbiIKLSIJCXRmMj1cIiR0Zi5YWFhYWFhcIlxuIgotIgkJdGYyPWBta3RlbXAgXCIkdGYyXCJgXG4iCi0iCQlpZiBbIFwiWCR0ZjJcIiAhPSBcIlhcIiAtYSAtZiBcIiR0ZjJcIiBdOyB0aGVuXG4iCi0iCQkJaWYgWyBcIlgkREVCVUdfTUtURU1QXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQllY2hvIFwibXl0bXAtbWt0ZW1wOiAkdGYyXCIgMT4mMlxuIgotIgkJCWZpXG4iCi0iCQkJZWNobyBcIiR0ZjJcIlxuIgotIgkJCXJldHVyblxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSIJIyBmYWxsYmFjayB0byBtdWx0aXBsZSBjbWRzOlxuIgotIglybSAtcmYgXCIkdGZcIiB8fCBleGl0IDFcbiIKLSIJaWYgWyAtZCBcIiR0ZlwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJ0bXAgZmlsZSAkdGYgc3RpbGwgZXhpc3RzIGFzIGEgZGlyZWN0b3J5LlwiXG4iCi0iCQlleGl0IDFcbiIKLSIJZWxpZiBbICRkTCBcIiR0ZlwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJ0bXAgZmlsZSAkdGYgc3RpbGwgZXhpc3RzIGFzIGEgc3ltbGluay5cIlxuIgotIgkJZXhpdCAxXG4iCi0iCWVsaWYgWyAtZiBcIiR0ZlwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJ0bXAgZmlsZSAkdGYgc3RpbGwgZXhpc3RzLlwiXG4iCi0iCQlleGl0IDFcbiIKLSIJZmlcbiIKLSIJdG91Y2ggXCIkdGZcIiB8fCBleGl0IDFcbiIKLSIJY2htb2QgNjAwIFwiJHRmXCIgfHwgZXhpdCAxXG4iCi0iCXJjaGtcbiIKLSIJaWYgWyBcIlgkREVCVUdfTUtURU1QXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIm15dG1wLXRvdWNoOiAkdGZcIiAxPiYyXG4iCi0iCWZpXG4iCi0iCWVjaG8gXCIkdGZcIlxuIgotIn1cbiIKLSJcbiIKLSJza2lwX2Rpc3BsYXkoKSB7XG4iCi0iCWR0cnk9JDFcbiIKLSIJZHRyeTE9YGVjaG8gXCIkZHRyeVwiIHwgc2VkIC1lICdzL146Ly8nYFxuIgotIglkdHJ5Mj1gZWNobyBcIiRkdHJ5XCIgfCBzZWQgLWUgJ3MvXFwuWzAtOV1bMC05XSokLy8nYFxuIgotIlxuIgotIglpZiBbIFwiWCRYMTFWTkNfU0tJUF9ESVNQTEFZXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkjIG5vIHNraXAgbGlzdCwgcmV0dXJuIGRpc3BsYXk6XG4iCi0iCQllY2hvIFwiJGR0cnlcIlxuIgotIgllbHNlXG4iCi0iCQkjIHVzZXIgc3VwcGxpZWQgc2tpcCBsaXN0OlxuIgotIgkJbWF0PVwiXCJcbiIKLSIJCXNsaXN0PVwiXCJcbiIKLSIJCWZvciBza2lwIGluIGBlY2hvIFwiJFgxMVZOQ19TS0lQX0RJU1BMQVlcIiB8IHRyICcsJyAnXFxuJ2BcbiIKLSIJCWRvXG4iCi0iCQkJaWYgZWNobyBcIiRza2lwXCIgfCBzZWQgLWUgJ3MvOi8vZycgfCBncmVwICdeWzAtOV1bMC05XSotWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQkjIGEgcmFuZ2Ugbi1tXG4iCi0iCQkJCW1pbj1gZWNobyBcIiRza2lwXCIgfCBzZWQgLWUgJ3MvOi8vZycgfCBhd2sgLUYtICd7cHJpbnQgJDF9J2BcbiIKLSIJCQkJbWF4PWBlY2hvIFwiJHNraXBcIiB8IHNlZCAtZSAncy86Ly9nJyB8IGF3ayAtRi0gJ3twcmludCAkMn0nYFxuIgotIgkJCQlpZiBbIFwiJG1pblwiIC1sZSBcIiRtYXhcIiBdOyB0aGVuXG4iCi0iCQkJCQl3aGlsZSBbICRtaW4gLWxlICRtYXggXVxuIgotIgkJCQkJZG9cbiIKLSIJCQkJCQlpZiBbIFwiWCRzbGlzdFwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJCQlzbGlzdD1cIiRtaW5cIlxuIgotIgkJCQkJCWVsc2VcbiIKLSIJCQkJCQkJc2xpc3Q9XCIkc2xpc3QgJG1pblwiXG4iCi0iCQkJCQkJZmlcbiIKLSIJCQkJCQltaW49YGV4cHIgJG1pbiArIDFgXG4iCi0iCQkJCQlkb25lXG4iCi0iCQkJCQljb250aW51ZVxuIgotIgkJCQlmaVxuIgotIgkJCWZpXG4iCi0iCQkJIyBhIHNpbXBsZSA6biBvciBuIChvciB1c2VyIHN1cHBsaWVkIGdhcmJhZ2UpLlxuIgotIgkJCWlmIFsgXCJYJHNsaXN0XCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCXNsaXN0PVwiJHNraXBcIlxuIgotIgkJCWVsc2VcbiIKLSIJCQkJc2xpc3Q9XCIkc2xpc3QgJHNraXBcIlxuIgotIgkJCWZpXG4iCi0iCQlkb25lXG4iCi0iXG4iCi0iCQlmb3Igc2tpcCBpbiAkc2xpc3RcbiIKLSIJCWRvXG4iCi0iCQkJaWYgZWNobyBcIiRza2lwXCIgfCBncmVwIFwiXjpcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQk6XG4iCi0iCQkJZWxzZVxuIgotIgkJCQlza2lwPVwiOiRza2lwXCJcbiIKLSIJCQlmaVxuIgotIgkJCXNraXAyPWBlY2hvIFwiJHNraXBcIiB8IHNlZCAtZSAncy9cXC5bMC05XVswLTldKiQvLydgXG4iCi0iXG4iCi0iCQkJaWYgZWNobyBcIiRza2lwXCIgfCBncmVwIFwiOiRkdHJ5MVxcPlwiID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCW1hdD0xXG4iCi0iCQkJCWJyZWFrXG4iCi0iCQkJZWxpZiBlY2hvIFwiJHNraXBcIiB8IGdyZXAgXCI6JGR0cnkyXFw+XCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJbWF0PTFcbiIKLSIJCQkJYnJlYWtcbiIKLSIJCQllbGlmIFsgXCJYJHNraXAyXCIgPSBcIlg6JGR0cnkxXCIgXTsgdGhlblxuIgotIgkJCQltYXQ9MVxuIgotIgkJCQlicmVha1xuIgotIgkJCWVsaWYgWyBcIlgkc2tpcDJcIiA9IFwiWDokZHRyeTJcIiBdOyB0aGVuXG4iCi0iCQkJCW1hdD0xXG4iCi0iCQkJCWJyZWFrXG4iCi0iCQkJZmlcbiIKLSIJCWRvbmVcbiIKLSIJCWlmIFsgXCJYJFgxMVZOQ19TS0lQX0RJU1BMQVlfTkVHQVRFXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJaWYgWyBcIlgkbWF0XCIgPSBcIlgxXCIgXTsgdGhlblxuIgotIgkJCQllY2hvIFwiXCJcbiIKLSIJCQllbHNlXG4iCi0iCQkJCWVjaG8gXCIkZHRyeVwiXG4iCi0iCQkJZmlcbiIKLSIJCWVsc2VcbiIKLSIJCQlpZiBbIFwiWCRtYXRcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQkJCWVjaG8gXCIkZHRyeVwiXG4iCi0iCQkJZWxzZVxuIgotIgkJCQllY2hvIFwiXCJcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSJ9XG4iCi0iXG4iCi0iYW1fcm9vdD1cIlwiXG4iCi0iaWYgaWQgfCBzZWQgLWUgJ3MvIGdpZC4qJC8vJyB8IGdyZXAgLXcgcm9vdCA+IC9kZXYvbnVsbDsgdGhlblxuIgotIglhbV9yb290PTFcbiIKLSJmaVxuIgotImFtX2dkbT1cIlwiXG4iCi0iaWYgaWQgfCBzZWQgLWUgJ3MvIGdpZC4qJC8vJyB8IGdyZXAgLXcgZ2RtID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCWFtX2dkbT0xXG4iCi0iZmlcbiIKLSJcbiIKLSIjIHRoaXMgbW9kZSBpcyB0byB0cnkgdG8gZ3JhYiBhIGRpc3BsYXkgbWFuYWdlciAoZ2RtLCBrZG0sIHhkbS4uLikgZGlzcGxheVxuIgotIiMgd2hlbiB3ZSBhcmUgcnVuIGFzIHJvb3QgKGUuZy4gbm8gb25lIGlzIGxvZ2dlZCBpbiB5ZXQpLiAgV2UgbG9vayBhdCB0aGVcbiIKLSIjIC1hdXRoIGxpbmUgaW4gdGhlIFgvWG9yZyBjb21tYW5kbGluZS5cbiIKLSIjXG4iCi0iaWYgWyBcIlgkRkRfWERNXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIglsaXN0PVwiXCJcbiIKLSIJZm9yIHBhaXIgaW4gYGVjaG8gXCIkcHNvdXRcIiB8IGdyZXAgJy9YLiogOlswLTldWzAtOV0qIC4qLWF1dGgnIHwgZWdyZXAgLXYgJ3N0YXJ0eHx4aW5pdCcgfCBzZWQgLWUgJ3MsXi4qL1guKiBcXCg6WzAtOV1bMC05XSpcXCkgLiogLWF1dGggXFwoW14gXVteIF0qXFwpLiokLFxcMVxcLFxcMiwnIHwgc29ydCAtdWBcbiIKLSIJZG9cbiIKLSIJCWRhPWBlY2hvIFwiJHBhaXJcIiB8IGF3ayAtRiwgJ3twcmludCAkMX0nYFxuIgotIgkJeGE9YGVjaG8gXCIkcGFpclwiIHwgYXdrIC1GLCAne3ByaW50ICQyfSdgXG4iCi0iCQlkYT1gc2tpcF9kaXNwbGF5IFwiJGRhXCJgXG4iCi0iCQlpZiBbIFwiWCRkYVwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQlmaVxuIgotIgkJaWYgWyAtZiAkeGEgLWEgLXIgJHhhIF07IHRoZW5cbiIKLSIJCQkjIGlmIHdlIGhhdmUgYW4geGF1dGggZmlsZSwgd2UgcHJvY2VlZCB0byB0ZXN0IGl0OlxuIgotIgkJCSNcbiIKLSIJCQllbnYgWEFVVEhPUklUWT1cIiR4YVwiIHhkcHlpbmZvIC1kaXNwbGF5IFwiJGRhXCIgPi9kZXYvbnVsbCAyPiYxXG4iCi0iCQkJaWYgWyAkPyA9IDAgXTsgdGhlblxuIgotIgkJCQlzaV9yb290PVwiXCJcbiIKLSIJCQkJc2lfZ2RtPVwiXCJcbiIKLSIJCQkJIyByZWNlbnQgZ2RtIHNlZW1zIHRvIHVzZSBTSTpsb2NhbHVzZXI6IGZvciB4YXV0aC5cbiIKLSIJCQkJaWYgZW52IERJU1BMQVk9XCIkZGFcIiB4aG9zdCAyPi9kZXYvbnVsbCB8IGdyZXAgLWkgJ15TSTpsb2NhbHVzZXI6cm9vdCQnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQlzaV9yb290PTFcbiIKLSIJCQkJZmlcbiIKLSIJCQkJaWYgZW52IERJU1BMQVk9XCIkZGFcIiB4aG9zdCAyPi9kZXYvbnVsbCB8IGdyZXAgLWkgJ15TSTpsb2NhbHVzZXI6Z2RtJCcgID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQlzaV9nZG09MVxuIgotIgkJCQlmaVxuIgotIgkJCQllbnYgWEFVVEhPUklUWT0vZGV2L251bGwgeGRweWluZm8gLWRpc3BsYXkgXCIkZGFcIiA+L2Rldi9udWxsIDI+JjFcbiIKLSIJCQkJcmM9JD9cbiIKLSIJCQkJaWYgWyBcIlgkcmNcIiA9IFwiWDBcIiBdOyB0aGVuXG4iCi0iCQkJCQkjIGFzc3VtZSBpdCBpcyBvayBmb3Igc2VydmVyIGludGVycHJldGVkIGNhc2UuXG4iCi0iCQkJCQlpZiBbIFwiWCRhbV9yb290XCIgPSBcIlgxXCIgLWEgXCJYJHNpX3Jvb3RcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQkJCQkJcmM9NVxuIgotIgkJCQkJZWxpZiBbIFwiWCRhbV9nZG1cIiA9IFwiWDFcIiAtYSBcIlgkc2lfZ2RtXCIgPSBcIlgxXCIgXTsgdGhlblxuIgotIgkJCQkJCXJjPTZcbiIKLSIJCQkJCWZpXG4iCi0iCQkJCWZpXG4iCi0iCQkJCWlmIFsgJHJjICE9IDAgXTsgdGhlblxuIgotIgkJCQkJeT1gcHJkcHkgJGRhYFxuIgotIgkJCQkJaWYgWyBcIlgkRklORF9ESVNQTEFZX05PX1NIT1dfRElTUExBWVwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJCWVjaG8gXCJESVNQTEFZPSR5XCJcbiIKLSIJCQkJCWZpXG4iCi0iCQkJCQlpZiBbIFwiWCRGSU5EX0RJU1BMQVlfWEFVVEhPUklUWV9QQVRIXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJCSMgY2FsbGVyIHdhbnRzIFhBVVRIT1JJVFkgcHJpbnRlZCBvdXQgdG9vLlxuIgotIgkJCQkJCWlmIFsgXCJYJHhhXCIgIT0gXCJYXCIgLWEgLWYgXCIkeGFcIiBdOyB0aGVuXG4iCi0iCQkJCQkJCWVjaG8gXCJYQVVUSE9SSVRZPSR4YVwiXG4iCi0iCQkJCQkJZWxzZVxuIgotIgkJCQkJCQllY2hvIFwiWEFVVEhPUklUWT0kWEFVVEhPUklUWVwiXG4iCi0iCQkJCQkJZmlcbiIKLSIJCQkJCWZpXG4iCi0iCQkJCQlpZiBbIFwiWCRzaG93eGF1dGhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCQkJIyBjb3B5IHRoZSBjb29raWU6XG4iCi0iCQkJCQkJY29vaz1geGF1dGggLWYgXCIkeGFcIiBsaXN0IHwgaGVhZCAtbiAxIHwgYXdrICd7cHJpbnQgJE5GfSdgXG4iCi0iCQkJCQkJeHRmPSRIT01FLy54YXQuJCRcbiIKLSIJCQkJCQl4dGY9YG15dG1wIFwiJHh0ZlwiYFxuIgotIgkJCQkJCWlmIFsgISAtZiAkeHRmIF07IHRoZW5cbiIKLSIJCQkJCQkJeHRmPS90bXAvLnhhdC4kJFxuIgotIgkJCQkJCQl4dGY9YG15dG1wIFwiJHh0ZlwiYFxuIgotIgkJCQkJCWZpXG4iCi0iCQkJCQkJaWYgWyAhIC1mICR4dGYgXTsgdGhlblxuIgotIgkJCQkJCQl4dGY9L3RtcC8ueGF0Yi4kJFxuIgotIgkJCQkJCQlybSAtZiAkeHRmXG4iCi0iCQkJCQkJCWlmIFsgLWYgJHh0ZiBdOyB0aGVuXG4iCi0iCQkJCQkJCQlleGl0IDFcbiIKLSIJCQkJCQkJZmlcbiIKLSIJCQkJCQkJdG91Y2ggJHh0ZiAyPi9kZXYvbnVsbFxuIgotIgkJCQkJCQljaG1vZCA2MDAgJHh0ZiAyPi9kZXYvbnVsbFxuIgotIgkJCQkJCQlpZiBbICEgLWYgJHh0ZiBdOyB0aGVuXG4iCi0iCQkJCQkJCQlleGl0IDFcbiIKLSIJCQkJCQkJZmlcbiIKLSIJCQkJCQlmaVxuIgotIgkJCQkJCXhhdXRoIC1mICR4dGYgYWRkIFwiJGRhXCIgLiAkY29va1xuIgotIgkJCQkJCXhhdXRoIC1mICR4dGYgZXh0cmFjdCAtIFwiJGRhXCIgMj4vZGV2L251bGxcbiIKLSIJCQkJCQlybSAtZiAkeHRmXG4iCi0iCQkJCQlmaVxuIgotIgkJCQkJIyBET05FXG4iCi0iCQkJCQlleGl0IDBcbiIKLSIJCQkJZmlcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZG9uZVxuIgotIglpZiBbIFwiWCRGSU5EX0RJU1BMQVlfWEFVVEhPUklUWV9QQVRIXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiXCIJCSMgZmFpbHVyZVxuIgotIglmaVxuIgotIglpZiBbIFwiWCRzaG93eGF1dGhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiXCJcbiIKLSIJZmlcbiIKLSIJIyBET05FXG4iCi0iCWV4aXQgMVxuIgotImZpXG4iCi0iXG4iCi0iIyBOb3JtYWwgY2FzZSBoZXJlIChub3QgeGRtLi4uKS5cbiIKLSJcbiIKLSIjIFRyeSB0byBtYXRjaCBYIERJU1BMQVkgdG8gdXNlcjpcbiIKLSJcbiIKLSIjIHdobygxKSBvdXRwdXQgY29sdW1uIDI6XG4iCi0iI2dvbmU9YGxhc3QgJHVzZXIgfCBncmVwICdnb25lLipuby5sb2dvdXQnIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGdyZXAgJ146JyB8IHNlZCAtZSAncywvLiosLCcgfCB0ciAnXFxuJyAnfCdgXG4iCi0iI2dvbmU9XCIke2dvbmV9X19xdWl0ZV9pbXBvc3NpYmxlX19cIlxuIgotIiNkaXNwbGF5PWB3aG8gMj4vZGV2L251bGwgfCBncmVwIFwiXiR7dXNlcn1bIAldWyAJXSo6WzAtOV1cIiB8IGVncmVwIC12IFwiICgkZ29uZSlcXD5cIiB8IGhlYWQgLW4gMSBcXFxuIgotIiMgICAgfCBhd2sgJ3twcmludCAkMn0nIHwgc2VkIC1lICdzLC8uKiQsLCdgXG4iCi0iXG4iCi0icG9zcz1cIlwiXG4iCi0ibGlzdD1gd2hvIDI+L2Rldi9udWxsIHwgZ3JlcCBcIl4ke3VzZXJ9WyAJXVsgCV0qOlswLTldXCIgfCBhd2sgJ3twcmludCAkMn0nIHwgc2VkIC1lICdzLC8uKiQsLCdgXG4iCi0ibGlzdD1cIiRsaXN0IFwiYHcgLWggXCIkdXNlclwiIDI+L2Rldi9udWxsIHwgZ3JlcCBcIl4ke3VzZXJ9WyAJXVsgCV0qOlswLTldXCIgfCBhd2sgJ3twcmludCAkMn0nIHwgc2VkIC1lICdzLC8uKiQsLCdgXG4iCi0ibGlzdD1cIiRsaXN0IFwiYHdobyAyPi9kZXYvbnVsbCB8IGdyZXAgXCJeJHt1c2VyfVsgCV1cIiB8IGF3ayAne3ByaW50ICRORn0nIHwgZ3JlcCAnKDpbMC05XScgfCBzZWQgLWUgJ3MvWygpXS8vZydgXG4iCi0iaG9zdD1gaG9zdG5hbWUgMj4vZGV2L251bGwgfCBzZWQgLWUgJ3MvXFwuLiokLy8nYFxuIgotIlxuIgotImdvdF9sb2NhbF9kbV9maWxlPVwiXCJcbiIKLSJcbiIKLSJpZiBbIFwiWCRYMTFWTkNfRklORERJU1BMQVlfU0tJUF9YQVVUSFwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkjIGRvIGEgbm9ybWFsIHhhdXRoIGxpc3Q6XG4iCi0iCWxpc3Q9XCIkbGlzdCBcImB4YXV0aCBsaXN0IHwgYXdrICd7cHJpbnQgJDF9JyB8IGdyZXAgL3VuaXggfCBncmVwIFwiXiR7aG9zdH1cIiB8IHNlZCAtZSAncy9eLio6LzovJyB8IHNvcnQgLW4gfCB1bmlxYFxuIgotIlxuIgotIgkjIGNoZWNrIGZvciBnZG0gYW5kIGtkbSBub24tTkZTIGNvb2tpZXMgaW4gL3RtcDogKGFuZCBub3cgL3Zhci9ydW4vZ2RtKVxuIgotIglmb3IgeGEgaW4gL3RtcC8uZ2RtKiAvdG1wLy5YYXV0aCogL3Zhci9ydW4vZ2RtKi9hdXRoLWZvci0qL2RhdGFiYXNlIC92YXIvcnVuL2dkbSovYXV0aC1jb29raWUtKi1mb3ItKlxuIgotIglkb1xuIgotIgkJIyB0cnkgdG8gYmUgc29tZXdoYXQgY2FyZWZ1bCBhYm91dCB0aGUgcmVhbCBvd25lciBvZiB0aGUgZmlsZTpcbiIKLSIJCWlmIFsgXCJYJGFtX3Jvb3RcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQkJYnJlYWtcbiIKLSIJCWZpXG4iCi0iCQlpZiBbIC1mICR4YSAtYSAtciAkeGEgXTsgdGhlblxuIgotIgkJCWlmIGxzIC1sIFwiJHhhXCIgfCBzZWQgLWUgJ3MsL3RtcC4qJCwsJyAtZSAncywvdmFyLiokLCwnIHwgZ3JlcCAtdyBcIiR1c2VyXCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJIyBhcHBlbmQgdGhlc2UgdG9vOlxuIgotIgkJCQlpZiBmaW5kIFwiJHhhXCIgLXVzZXIgXCIkdXNlclwiIC1wZXJtIDYwMCA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQkJOlxuIgotIgkJCQllbHNlXG4iCi0iCQkJCQljb250aW51ZVxuIgotIgkJCQlmaVxuIgotIgkJCQkjIGl0IHBhc3NlcyB0aGUgb3duZXJzaGlwIHRlc3RzLCBhZGQgaXQ6XG4iCi0iCQkJCSMgc2luY2UgdGhlIGRpcmVjdG9yeSBpcyAoZXZpZGVudGx5KSBsb2NhbCwgXCJsb2NhbGhvc3RcIiBpcyBnb29kIHRvby4gKGJ1dCBiZXdhcmUgWEFVVEhMT0NBTEhPU1ROQU1FIGluIGxpYnhjYilcbiIKLSIJCQkJc2F2MD1cIiRsaXN0IFwiXG4iCi0iCQkJCWxpc3Q9XCIkbGlzdCBcImB4YXV0aCAtZiBcIiR4YVwiIGxpc3QgfCBhd2sgJ3twcmludCAkMX0nIHwgZ3JlcCAvdW5peCB8IGVncmVwIC1pIFwiXiR7aG9zdH18XmxvY2FsaG9zdFwiIHwgc2VkIC1lICdzL14uKjovOi8nIHwgc29ydCAtbiB8IHVuaXEgfCBzZWQgLWUgXCJzLFxcJCxcXCwkeGEsXCJgXG4iCi0iCQkJCWlmIFsgXCJYJHNhdjBcIiAhPSBcIlgkbGlzdFwiIF07IHRoZW5cbiIKLSIJCQkJCWdvdF9sb2NhbF9kbV9maWxlPTFcbiIKLSIJCQkJZmlcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZG9uZVxuIgotImZpXG4iCi0iXG4iCi0iaWYgWyBcIlgkdW5hbWVcIiA9IFwiWERhcndpblwiIF07IHRoZW5cbiIKLSIJIyBtYWNvc3ggdXNlcyBcImNvbnNvbGVcIiBzdHJpbmcgKGluIGxlb3BhcmQgWDExIHJ1bnMvbGF1bmNoZWQgYnkgZGVmYXVsdClcbiIKLSIJaWYgd2hvIDI+L2Rldi9udWxsIHwgZ3JlcCAtaSBcIl4ke3VzZXJ9WyAJXVsgCV0qY29uc29sZVsgCV1cIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJZWNobyBcIkRJU1BMQVk9Y29uc29sZVwiXG4iCi0iCQlpZiBbIFwiWCRGSU5EX0RJU1BMQVlfQUxMXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJaWYgWyBcIlgkc2hvd3hhdXRoXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQllY2hvIFwiXCJcbiIKLSIJCQlmaVxuIgotIgkJCWV4aXQgMFxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSJmaVxuIgotIlxuIgotIiMgdHJ5IHRoZSBpdGVtcyBpbiB0aGUgbGlzdDpcbiIKLSIjXG4iCi0ibnNvdXRfdHJpbT1gZWNobyBcIiRuc291dFwiIHwgZ3JlcCBcIi90bXAvLlgxMS11bml4L1wiYFxuIgotIiNcbiIKLSJmb3IgcCBpbiAkbGlzdFxuIgotImRvXG4iCi0iCXhhPWBlY2hvIFwiJHBcIiB8IGF3ayAtRiwgJ3twcmludCAkMn0nYFxuIgotIglkPWBlY2hvIFwiJHBcIiB8IHNlZCAtZSAncy8sLiokLy8nIC1lICdzLzovLycgLWUgJ3MvXFwuLiokLy8nYFxuIgotIglvaz1cIlwiXG4iCi0iCWQ9YHNraXBfZGlzcGxheSBcIiRkXCJgXG4iCi0iCWlmIFsgXCJYJGRcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWNvbnRpbnVlO1xuIgotIglmaVxuIgotIlxuIgotIgkjIGNoZWNrIGZvciB0aGUgbG9jYWwgWDExIGZpbGVzOlxuIgotIgl4ZD1cIi90bXAvLlgxMS11bml4L1gkZFwiXG4iCi0iCWlmIFsgLXIgXCIkeGRcIiAtbyAtdyBcIiR4ZFwiIC1vIC14IFwiJHhkXCIgXTsgdGhlblxuIgotIgkJaWYgZWNobyBcIiRuc291dF90cmltXCIgfCBncmVwIFwiL3RtcC8uWDExLXVuaXgvWCRkWyAgXSpcXCRcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCW9rPTFcbiIKLSIJCWZpXG4iCi0iCWZpXG4iCi0iCWlmIFsgXCJYJG9rXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkjIGluc3RlYWQgY2hlY2sgZm9yIHRoZSBsb2NrOlxuIgotIgkJaWYgWyAtZiBcIi90bXAvLlgkZC1sb2NrXCIgXTsgdGhlblxuIgotIgkJCXBpZD1gY2F0IFwiL3RtcC8uWCRkLWxvY2tcIiB8IHNlZCAtZSAncy9bIAldLy9nJ2BcbiIKLSIJCQlpZiBlY2hvIFwiJHBpZFwiIHwgZ3JlcCAnXlswLTldWzAtOV0qJCcgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJaWYgWyBcIlgkdW5hbWVcIiA9IFwiWExpbnV4XCIgLW8gXCJYJHVuYW1lXCIgPSBcIlhTdW5PU1wiIF07IHRoZW5cbiIKLSIJCQkJCWlmIFsgLWQgXCIvcHJvYy8kcGlkXCIgXTsgdGhlblxuIgotIgkJCQkJCW9rPTFcbiIKLSIJCQkJCWZpXG4iCi0iCQkJCWVsaWYgZWNobyBcIiRwc2xpc3RcIiB8IGdyZXAgLXcgXCIkcGlkXCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJCW9rPTFcbiIKLSIJCQkJZmlcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSJcbiIKLSIJaWYgWyBcIlgkb2tcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQkjIG9rLCBwdXQgaXQgb24gdGhlIGxpc3RcbiIKLSIJCXBvc3M9XCIkcG9zcyAkcFwiXG4iCi0iCWZpXG4iCi0iZG9uZVxuIgotIlxuIgotInNlZW52YWx1ZXM9XCJcIlxuIgotIlxuIgotInNlZW4oKSB7XG4iCi0iCSMgc2ltcGxlIHV0aWwgdG8gc2tpcCByZXBlYXRzXG4iCi0iCXY9JDFcbiIKLSIJaWYgWyBcIlgkc2VlbnZhbHVlc1wiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWZvciB2MiBpbiAkc2VlbnZhbHVlc1xuIgotIgkJZG9cbiIKLSIJCQlpZiBbIFwiWCR2XCIgPSBcIlgkdjJcIiBdOyB0aGVuXG4iCi0iCQkJCXNlZW5yZXQ9MVxuIgotIgkJCQlyZXR1cm5cbiIKLSIJCQlmaVxuIgotIgkJZG9uZVxuIgotIglmaVxuIgotIglpZiBbIFwiWCRzZWVudmFsdWVzXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlzZWVudmFsdWVzPVwiJHZcIlxuIgotIgllbHNlXG4iCi0iCQlzZWVudmFsdWVzPVwiJHNlZW52YWx1ZXMgJHZcIlxuIgotIglmaVxuIgotIglzZWVucmV0PTBcbiIKLSJ9XG4iCi0iXG4iCi0iIyBub3cgZ2V0IHJlYWQgdG8gdHJ5IGVhY2ggb25lIGluICRwb3NzXG4iCi0iI1xuIgotInBvc3M9YGVjaG8gXCIkcG9zc1wiIHwgc2VkIC1lICdzL14gKi8vJyAtZSAncy8gKiQvLydgXG4iCi0iZGlzcGxheT1cIlwiXG4iCi0ieGF1dGhfdXNlPVwiXCJcbiIKLSJcbiIKLSJpZiBbIFwiWCRYMTFWTkNfRklORERJU1BMQVlfU0tJUF9YQVVUSFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJIyB3ZSBhcmUgbm90IHN1cHBvc2VkIHRvIGNhbGwgeGF1dGgoMSksIHNpbXBseSByZXBvcnRcbiIKLSIJaWYgWyBcIlgkRklORF9ESVNQTEFZX0FMTFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWZvciBwIGluICRwb3NzXG4iCi0iCQlkb1xuIgotIgkJCWlmIFsgXCJYJHBcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQlmaVxuIgotIgkJCXNlZW4gXCIkcFwiXG4iCi0iCQkJaWYgWyBcIlgkc2VlbnJldFwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQlmaVxuIgotIgkJCSMgZ2V0IHJpZCBvZiBhbnkgLHhhdXRoXG4iCi0iCQkJcD1gZWNobyBcIiRwXCIgfCBzZWQgLWUgJ3MvLC4qJC8vJ2BcbiIKLSIJCQl5PWBwcmRweSAkcGBcbiIKLSIJCQllY2hvICR5XG4iCi0iCQlkb25lXG4iCi0iCQlleGl0IDBcbiIKLSIJZmlcbiIKLSIJZGlzcGxheT1gZWNobyBcIiRwb3NzXCIgfCB0ciAnICcgJ1xcbicgfCBoZWFkIC1uIDFgXG4iCi0iZWxzZVxuIgotIglmcmVlYmllPVwiXCJcbiIKLSIJeGF1dGhfZnJlZWJpZT1cIlwiXG4iCi0iCWZvciBwIGluICRwb3NzXG4iCi0iCWRvXG4iCi0iCQlpZiBbIFwiWCRwXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJY29udGludWVcbiIKLSIJCWZpXG4iCi0iCQlzZWVuIFwiJHBcIlxuIgotIgkJaWYgWyBcIlgkc2VlbnJldFwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCQljb250aW51ZVxuIgotIgkJZmlcbiIKLSJcbiIKLSIJCSMgZXh0cmFjdCAseGF1dGggaWYgYW55LlxuIgotIgkJeGE9XCJcIlxuIgotIgkJeGE9YGVjaG8gXCIkcFwiIHwgYXdrIC1GLCAne3ByaW50ICQyfSdgXG4iCi0iCQlwPWBlY2hvIFwiJHBcIiB8IHNlZCAtZSAncy8sLiokLy8nYFxuIgotIlxuIgotIgkJIyBjaGVjayB4YXV0aCBmb3IgaXQ6XG4iCi0iCQlpZiBbIFwiWCR4YVwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlteWVudj1cIlhBVVRIT1JJVFk9JHhhXCJcbiIKLSIJCWVsc2VcbiIKLSIJCQlteWVudj1cIkZPT19CQVJfPWJhelwiXG4iCi0iCQlmaVxuIgotIgkJcD1gc2tpcF9kaXNwbGF5IFwiJHBcImBcbiIKLSIJCWlmIFsgXCJYJHBcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQljb250aW51ZVxuIgotIgkJZmlcbiIKLSJcbiIKLSIJCWVudiBcIiRteWVudlwiIHhkcHlpbmZvIC1kaXNwbGF5IFwiJHBcIiA+L2Rldi9udWxsIDI+JjFcbiIKLSIJCXJjPSQ/XG4iCi0iXG4iCi0iCQlpZiBbICRyYyAhPSAwIF07IHRoZW5cbiIKLSIJCQkjIGd1YXJkIGFnYWluc3QgbGlieGNiL2Rlc2t0b3Agc2lsbGluZXNzOiBcbiIKLSIJCQl4YWxobl9zYXZlPSRYQVVUSExPQ0FMSE9TVE5BTUVcbiIKLSJcbiIKLSIJCQlpZiBbIFwiWCR4YWxobl9zYXZlXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkjIHRyeSBpdCBhZ2FpbiB1bnNldFxuIgotIgkJCQl1bnNldCBYQVVUSExPQ0FMSE9TVE5BTUVcbiIKLSIJCQkJZW52IFwiJG15ZW52XCIgeGRweWluZm8gLWRpc3BsYXkgXCIkcFwiID4vZGV2L251bGwgMj4mMVxuIgotIgkJCQlyYz0kP1xuIgotIgkJCQlpZiBbICRyYyAhPSAwIF07IHRoZW5cbiIKLSIJCQkJCSMgZGlkIG5vdCB3b3JrOyBwdXQgaXQgYmFja1xuIgotIgkJCQkJWEFVVEhMT0NBTEhPU1ROQU1FPSR4YWxobl9zYXZlXG4iCi0iCQkJCQlleHBvcnQgWEFVVEhMT0NBTEhPU1ROQU1FXG4iCi0iCQkJCWZpXG4iCi0iCQkJZmlcbiIKLSIJCQlpZiBbICRyYyAhPSAwIC1hIFwiWCR4YWxobl9zYXZlXCIgIT0gXCJYbG9jYWxob3N0XCIgXTsgdGhlblxuIgotIgkJCQkjIHRyeSBpdCBhZ2FpbiB3aXRoIGxvY2FsaG9zdFxuIgotIgkJCQllbnYgXCIkbXllbnZcIiBYQVVUSExPQ0FMSE9TVE5BTUU9bG9jYWxob3N0IHhkcHlpbmZvIC1kaXNwbGF5IFwiJHBcIiA+L2Rldi9udWxsIDI+JjFcbiIKLSIJCQkJcmM9JD9cbiIKLSIJCQkJaWYgWyAkcmMgPSAwIF07IHRoZW5cbiIKLSIJCQkJCSMgYmV0dGVyIGV4cG9ydCBpdCBmb3IgY21kcyBiZWxvdy4uLlxuIgotIgkJCQkJWEFVVEhMT0NBTEhPU1ROQU1FPWxvY2FsaG9zdFxuIgotIgkJCQkJZXhwb3J0IFhBVVRITE9DQUxIT1NUTkFNRVxuIgotIgkJCQlmaVxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIlxuIgotIgkJaWYgWyAkcmMgPSAwIF07IHRoZW5cbiIKLSIJCQlpZiBbIFwiWCRGRF9UQUdcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCSMgbG9vayBmb3IgeDExdm5jIHNwZWNpYWwgRkRfVEFHIHByb3BlcnR5OlxuIgotIgkJCQlpZiBbIFwiWCR4YVwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJaWYgeHByb3AgLWRpc3BsYXkgXCIkcFwiIC1yb290IC1sZW4gMTI4IEZEX1RBRyB8IGdyZXAgLWl2IG5vLnN1Y2guYXRvbSBcXFxuIgotIgkJCQkJICAgIHwgZ3JlcCBcIj1bIAldWyAJXSpcXFwiJEZEX1RBR1xcXCJcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQkJCTpcbiIKLSIJCQkJCWVsc2VcbiIKLSIJCQkJCQljb250aW51ZVxuIgotIgkJCQkJZmlcbiIKLSIJCQkJZWxzZVxuIgotIgkJCQkJaWYgZW52IFhBVVRIT1JJVFk9XCIkeGFcIiB4cHJvcCAtZGlzcGxheSBcIiRwXCIgLXJvb3QgLWxlbiAxMjggRkRfVEFHIHwgZ3JlcCAtaXYgbm8uc3VjaC5hdG9tIFxcXG4iCi0iCQkJCQkgICAgfCBncmVwIFwiPVsgCV1bIAldKlxcXCIkRkRfVEFHXFxcIlwiID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQkJOlxuIgotIgkJCQkJZWxzZVxuIgotIgkJCQkJCWNvbnRpbnVlXG4iCi0iCQkJCQlmaVxuIgotIgkJCQlmaVxuIgotIgkJCWZpXG4iCi0iXG4iCi0iCQkJIyBOb3cgdHJ5IGFnYWluIHdpdGggbm8gYXV0aG9yaXR5OlxuIgotIgkJCWVudiBYQVVUSE9SSVRZPS9kZXYvbnVsbCB4ZHB5aW5mbyAtZGlzcGxheSBcIiRwXCIgPi9kZXYvbnVsbCAyPiYxXG4iCi0iXG4iCi0iCQkJIyAwIG1lYW5zIGdvdCBpbiBmb3IgZnJlZS4uLiBza2lwIGl0IHVubGVzcyB3ZSBkb24ndCBmaW5kIGFueXRoaW5nIGVsc2UuXG4iCi0iCQkJaWYgWyAkPyAhPSAwIF07IHRoZW5cbiIKLSIJCQkJIyBrZWVwIGl0XG4iCi0iCQkJCWRpc3BsYXk9XCIkcFwiXG4iCi0iCQkJCXhhdXRoX3VzZT1cIiR4YVwiXG4iCi0iCQkJCWlmIFsgXCJYJEZJTkRfRElTUExBWV9BTExcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCQl5PWBwcmRweSAkcGBcbiIKLSIJCQkJCWVjaG8gXCJESVNQTEFZPSR5XCJcbiIKLSIJCQkJCWNvbnRpbnVlXG4iCi0iCQkJCWZpXG4iCi0iCQkJCWJyZWFrXG4iCi0iCQkJZWxzZVxuIgotIgkJCQkjIHN0b3JlIGluIGZyZWViaWUgYXMgZmFsbGJhY2tcbiIKLSIJCQkJaWYgWyBcIlgkRklORF9ESVNQTEFZX0FMTFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQkJCXk9YHByZHB5ICRwYFxuIgotIgkJCQkJZWNobyBcIiR5LE5PWEFVVEhcIlxuIgotIgkJCQkJY29udGludWVcbiIKLSIJCQkJZmlcbiIKLSIJCQkJaWYgWyBcIlgkZnJlZWJpZVwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJZnJlZWJpZT1cIiRwXCJcbiIKLSIJCQkJCXhhdXRoX2ZyZWViaWU9XCIkeGFcIlxuIgotIgkJCQlmaVxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIglkb25lXG4iCi0iCWlmIFsgXCJYJGRpc3BsYXlcIiA9IFwiWFwiIC1hIFwiWCRmcmVlYmllXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJIyBmYWxsYmFjayB0byB0aGUgZnJlZWJpZSAoaWYgYW55KVxuIgotIgkJZGlzcGxheT1cIiRmcmVlYmllXCJcbiIKLSIJCXhhdXRoX3VzZT1cIiR4YXV0aF9mcmVlYmllXCJcbiIKLSIJZmlcbiIKLSJmaVxuIgotIlxuIgotImlmIFsgXCJYJEZJTkRfRElTUExBWV9BTExcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCSMgd2UgaGF2ZSBsaXN0ZWQgZXZlcnl0aGluZywgZ2V0IG91dC5cbiIKLSIJZXhpdFxuIgotImZpXG4iCi0iaWYgWyBcIlgkZGlzcGxheVwiID0gXCJYXCIgXTsgdGhlblxuIgotIglpZiBbIFwiWCRGSU5ERElTUExBWV9ydW5cIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJcIgkJIyBmYWlsdXJlXG4iCi0iCQlpZiBbIFwiWCRzaG93eGF1dGhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJZWNobyBcIlwiXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIglleGl0IDFcbiIKLSJmaVxuIgotIlxuIgotIiMgYXBwZW5kICxWVD1uIGlmIGFwcGxpY2FibGU6XG4iCi0iZHB5Mj1gcHJkcHkgXCIkZGlzcGxheVwiYFxuIgotIlxuIgotImlmIFsgXCJYJEZJTkRfRElTUExBWV9OT19TSE9XX0RJU1BMQVlcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJZWNobyBcIkRJU1BMQVk9JGRweTJcIlxuIgotImZpXG4iCi0iaWYgWyBcIlgkRklORF9ESVNQTEFZX1hBVVRIT1JJVFlfUEFUSFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJIyBjYWxsZXIgd2FudHMgWEFVVEhPUklUWSBwcmludGVkIG91dCB0b28uXG4iCi0iCWlmIFsgXCJYJHhhdXRoX3VzZVwiICE9IFwiWFwiIC1hIC1mIFwiJHhhdXRoX3VzZVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJYQVVUSE9SSVRZPSR4YXV0aF91c2VcIlxuIgotIgllbHNlXG4iCi0iCQllY2hvIFwiWEFVVEhPUklUWT0kWEFVVEhPUklUWVwiXG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJpZiBbIFwiWCRzaG93eGF1dGhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCSMgc2hvdyB0aGUgKGJpbmFyeSkgeGF1dGggZGF0YTpcbiIKLSIJaWYgWyBcIlgkeGF1dGhfdXNlXCIgIT0gXCJYXCIgLWEgLWYgXCIkeGF1dGhfdXNlXCIgXTsgdGhlblxuIgotIgkJeGF1dGggLWYgXCIkeGF1dGhfdXNlXCIgZXh0cmFjdCAtIFwiJGRpc3BsYXlcIiAyPi9kZXYvbnVsbFxuIgotIgllbHNlXG4iCi0iCQl4YXV0aCBleHRyYWN0IC0gXCIkZGlzcGxheVwiIDI+L2Rldi9udWxsXG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJcbiIKLSJleGl0IDBcbiIKLTsKLQotY2hhciBjcmVhdGVfZGlzcGxheVtdID0gCi0iIyEvYmluL3NoXG4iCi0iXG4iCi0iI0NSRUFURV9ESVNQTEFZX09VVFBVVD0vdG1wL2Nkby50eHRcbiIKLSJcbiIKLSJpZiBlY2hvIFwiJFVTRVJcIiB8IGVncmVwICdydW5nZScgPiAvZGV2L251bGwgOyB0aGVuXG4iCi0iCUNSRUFURV9ESVNQTEFZX09VVFBVVD0vdG1wL2Nkby4kVVNFUi50eHRcbiIKLSIJaWYgWyAtZiAkQ1JFQVRFX0RJU1BMQVlfT1VUUFVUIC1hICEgLXcgJENSRUFURV9ESVNQTEFZX09VVFBVVCBdOyB0aGVuXG4iCi0iCQlDUkVBVEVfRElTUExBWV9PVVRQVVQ9JENSRUFURV9ESVNQTEFZX09VVFBVVC4kJFxuIgotIglmaVxuIgotImZpXG4iCi0iaWYgWyBcIlgkQ1JFQVRFX0RJU1BMQVlfT1VUUFVUXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIglpZiBbIFwiWCRDUkVBVEVfRElTUExBWV9FWEVDXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlDUkVBVEVfRElTUExBWV9FWEVDPTFcbiIKLSIJCWV4cG9ydCBDUkVBVEVfRElTUExBWV9FWEVDXG4iCi0iCQlpZiBbIFwiWCRDUkVBVEVfRElTUExBWV9PVVRQVVRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJL2Jpbi9zaCAkMCBcIiRAXCIgMj4gJENSRUFURV9ESVNQTEFZX09VVFBVVFxuIgotIgkJZWxzZVxuIgotIgkJCS9iaW4vc2ggJDAgXCIkQFwiIDI+IC9kZXYvbnVsbFxuIgotIgkJZmlcbiIKLSIJCWV4aXQgJD9cbiIKLSIJZmlcbiIKLSJmaVxuIgotImlmIFsgXCJYJENSRUFURV9ESVNQTEFZX1BFUkxfU0VUUEdSUFwiID0gXCJYXCIgXTsgdGhlblxuIgotIglDUkVBVEVfRElTUExBWV9QRVJMX1NFVFBHUlA9MVxuIgotIglleHBvcnQgQ1JFQVRFX0RJU1BMQVlfUEVSTF9TRVRQR1JQXG4iCi0iCWlmIHR5cGUgcGVybCA+L2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCXBlcmwgLWUgXCJzZXRwZ3JwKDAsMCk7IGV4ZWMgJy9iaW4vc2ggJDAgJConXCI7XG4iCi0iCQlleGl0ICQ/XG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJcbiIKLSJcbiIKLSJpZiBbIFwiWCRDUkVBVEVfRElTUExBWV9PVVRQVVRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCXNldCAteHZcbiIKLSJmaVxuIgotIlxuIgotIkNPTFVNTlM9MjU2XG4iCi0iZXhwb3J0IENPTFVNTlNcbiIKLSJcbiIKLSJMQ19BTExfc2F2ZT0kTENfQUxMXG4iCi0iTENfQUxMPUNcbiIKLSJleHBvcnQgTENfQUxMXG4iCi0iXG4iCi0iZmluZGZyZWUoKSB7XG4iCi0iCXRyeT0yMFxuIgotIglkcHltYXg9NzlcbiIKLSIJaWYgWyBcIlgkWDExVk5DX0NSRUFURV9TVEFSVElOR19ESVNQTEFZX05VTUJFUlwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCXRyeT0kWDExVk5DX0NSRUFURV9TVEFSVElOR19ESVNQTEFZX05VTUJFUlxuIgotIglmaVxuIgotIglpZiBbIFwiWCRYMTFWTkNfQ1JFQVRFX01BWF9ESVNQTEFZU1wiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWRweW1heD0kWDExVk5DX0NSRUFURV9NQVhfRElTUExBWVNcbiIKLSIJZmlcbiIKLSIJc3J5PWBleHByICR0cnkgKyAkZHB5bWF4YFxuIgotIgluPVwiXCJcbiIKLSIJbnNvdXQ9XCJcIlxuIgotIglpZiBbIFwiWCRoYXZlX25ldHN0YXRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQluc291dD1gJGhhdmVfbmV0c3RhdCAtYW5gXG4iCi0iCWZpXG4iCi0iCW5zb3V0X3RyaW09YGVjaG8gXCIkbnNvdXRcIiB8IGdyZXAgXCIvdG1wLy5YMTEtdW5peC9cImBcbiIKLSIJd2hpbGUgWyAkdHJ5IC1sdCAkc3J5IF1cbiIKLSIJZG9cbiIKLSIJCXRsb2NrPVwiL3RtcC8uWCR7dHJ5fS1sb2NrXCJcbiIKLSIJCWlmIFsgLXIgJHRsb2NrIF07IHRoZW5cbiIKLSIJCQlpZiBlY2hvIFwiJG5zb3V0X3RyaW1cIiB8IGdyZXAgXCIvdG1wLy5YMTEtdW5peC9YJHt0cnl9WyAJXSpcXCRcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQk6XG4iCi0iCQkJZWxzZVxuIgotIgkJCQlwaWQ9YGhlYWQgLW4gMSAkdGxvY2sgMj4vZGV2L251bGwgfCBzZWQgLWUgJ3MvWyAJXS8vZycgfCBncmVwICdeWzAtOV1bMC05XSokJ2BcbiIKLSIJCQkJaWYgWyBcIlgkcGlkXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCQkJZXhpc3RzPTBcbiIKLSIJCQkJCWlmIFsgLWQgL3Byb2MvJHBpZCBdOyB0aGVuXG4iCi0iCQkJCQkJZXhpc3RzPTFcbiIKLSIJCQkJCWVsaWYga2lsbCAtMCAkcGlkIDI+L2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQkJZXhpc3RzPTFcbiIKLSIJCQkJCWZpXG4iCi0iCQkJCQlpZiBbIFwiWCRleGlzdHNcIiA9IFwiWDBcIiBdOyB0aGVuXG4iCi0iCQkJCQkJcm0gLWYgJHRsb2NrXG4iCi0iCQkJCQlmaVxuIgotIgkJCQlmaVxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIgkJaWYgWyAhIC1mICR0bG9jayBdOyB0aGVuXG4iCi0iCQkJaWYgZWNobyBcIiRuc291dF90cmltXCIgfCBncmVwIFwiL3RtcC8uWDExLXVuaXgvWCR7dHJ5fVsgCV0qXFwkXCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJOlxuIgotIgkJCWVsc2VcbiIKLSIJCQkJbj0kdHJ5XG4iCi0iCQkJCWJyZWFrXG4iCi0iCQkJZmlcbiIKLSIJCWZpXG4iCi0iCQl0cnk9YGV4cHIgJHRyeSArIDFgXG4iCi0iCWRvbmVcbiIKLSIJZWNobyBcIiRuXCJcbiIKLSJ9XG4iCi0iXG4iCi0icmFuZG9tKCkge1xuIgotIglpZiBbIFwiWCRSQU5ET01cIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiJFJBTkRPTVwiXG4iCi0iCWVsc2VcbiIKLSIJCXIxPWBiYXNoIC1jICdlY2hvICRSQU5ET00nIDI+L2Rldi9udWxsYFxuIgotIgkJaWYgZWNobyBcIiRyMVwiIHwgZ3JlcCAnXlswLTldWzAtOV0qJCcgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQllY2hvIFwiJHIxXCJcbiIKLSIJCWVsc2VcbiIKLSIJCQlyMj1gc2ggLWMgJ2VjaG8gJCQ7IGRhdGU7IHBzIC1lbGYnIDI+JjEgfCBzdW0gLXIgMj4vZGV2L251bGwgfCBhd2sgJ3twcmludCAkMX0nYFxuIgotIgkJCWlmIGVjaG8gXCIkcjJcIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCWVjaG8gXCIkcjJcIlxuIgotIgkJCWVsc2VcbiIKLSIJCQkJcjM9YHNoIC1jICdlY2hvICQkJ2BcbiIKLSIJCQkJZWNobyBcIiRyM1wiXG4iCi0iCQkJZmlcbiIKLSIJCWZpXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotImZpbmRzZXNzaW9uKCkge1xuIgotIglpZiBbIFwiWCRGRF9QUk9HXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRGRF9QUk9HXCJcbiIKLSIJCXJldHVyblxuIgotIglmaVxuIgotIglpZiBbIFwiWCRoYXZlX2dub21lX3Nlc3Npb25cIiAhPSBcIlhcIiAtYSBcIlgkRkRfU0VTU1wiID0gXCJYZ25vbWVcIiBdOyB0aGVuXG4iCi0iCQlpZiBbIFwiWCRoYXZlX2RidXNfbGF1bmNoXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCWVjaG8gXCIkaGF2ZV9kYnVzX2xhdW5jaCAtLWV4aXQtd2l0aC1zZXNzaW9uICRoYXZlX2dub21lX3Nlc3Npb25cIlxuIgotIgkJZWxzZVxuIgotIgkJCWVjaG8gXCIkaGF2ZV9nbm9tZV9zZXNzaW9uXCJcbiIKLSIJCWZpXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3N0YXJ0a2RlXCIgIT0gXCJYXCIgICAgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWGtkZVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV9zdGFydGtkZVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3N0YXJ0bHhkZVwiICE9IFwiWFwiICAgIC1hIFwiWCRGRF9TRVNTXCIgPSBcIlhseGRlXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRoYXZlX3N0YXJ0bHhkZVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3R3bVwiICE9IFwiWFwiICAgICAgICAgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWHR3bVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV90d21cIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV9mdndtMlwiICE9IFwiWFwiICAgICAgIC1hIFwiWCRGRF9TRVNTXCIgPSBcIlhmdndtXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRoYXZlX2Z2d20yXCJcbiIKLSIJCXJldHVyblxuIgotIgllbGlmIFsgXCJYJGhhdmVfbXdtXCIgIT0gXCJYXCIgICAgICAgICAtYSBcIlgkRkRfU0VTU1wiID0gXCJYbXdtXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRoYXZlX213bVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX2R0d21cIiAhPSBcIlhcIiAgICAgICAgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWGR0d21cIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiJGhhdmVfZHR3bVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3dpbmRvd21ha2VyXCIgIT0gXCJYXCIgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWHdtYWtlclwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV93aW5kb3dtYWtlclwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3dtYWtlclwiICE9IFwiWFwiICAgICAgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWHdtYWtlclwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV93bWFrZXJcIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV9zdGFydHhmY2VcIiAhPSBcIlhcIiAtYSBcIlgkRkRfU0VTU1wiID0gXCJYeGZjZVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV9zdGFydHhmY2VcIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV9zdGFydHhmY2U0XCIgIT0gXCJYXCIgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWHhmY2VcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiJGhhdmVfc3RhcnR4ZmNlNFwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX2VubGlnaHRlbm1lbnRcIiAhPSBcIlhcIiAtYSBcIlgkRkRfU0VTU1wiID0gXCJYZW5saWdodGVubWVudFwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV9lbmxpZ2h0ZW5tZW50XCJcbiIKLSIJCXJldHVyblxuIgotIgllbGlmIFsgXCJYJGhhdmVfWHNlc3Npb25cIiAhPSBcIlhcIiAgICAtYSBcIlgkRkRfU0VTU1wiID0gXCJYWHNlc3Npb25cIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiJGhhdmVfWHNlc3Npb25cIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV9Yc2Vzc2lvblwiICE9IFwiWFwiICAgIC1hIFwiWCRGRF9TRVNTXCIgPSBcIlhjZGVcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwiJGhhdmVfWHNlc3Npb25cIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV94dGVybVwiICE9IFwiWFwiICAgICAgIC1hIFwiWCRGRF9TRVNTXCIgPSBcIlhmYWlsc2FmZVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaGF2ZV94dGVybVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3h0ZXJtXCIgIT0gXCJYXCIgICAgICAgLWEgXCJYJEZEX1NFU1NcIiA9IFwiWHh0ZXJtXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRoYXZlX3h0ZXJtXCJcbiIKLSIJCXJldHVyblxuIgotIglmaVxuIgotIglpZiB0eXBlIGNzaCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuXG4iCi0iCQlob21lPWBjc2ggLWYgLWMgXCJlY2hvIH4kVVNFUlwiYFxuIgotIgllbGlmIHR5cGUgdGNzaCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuXG4iCi0iCQlob21lPWB0Y3NoIC1mIC1jIFwiZWNobyB+JFVTRVJcImBcbiIKLSIJZWxpZiB0eXBlIGJhc2ggPiAvZGV2L251bGwgMj4mMTsgdGhlblxuIgotIgkJaG9tZT1gYmFzaCAtYyBcImVjaG8gfiRVU0VSXCJgXG4iCi0iCWVsc2VcbiIKLSIJCWhvbWU9XCJcIlxuIgotIglmaVxuIgotIglpZiBbIFwiWCRob21lXCIgPSBcIlhcIiAtbyAhIC1kIFwiJGhvbWVcIiBdOyB0aGVuXG4iCi0iCQlpZiBbIFwiWCRoYXZlX3Jvb3RcIiAhPSBcIlhcIiAtYSBcIlgkVVNFUlwiICE9IFwiWHJvb3RcIiBdOyB0aGVuXG4iCi0iCQkJaG9tZT1gc3UgLSAkVVNFUiAtYyAnZWNobyAkSE9NRSdgXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIglpZiBbIFwiWCRob21lXCIgPSBcIlhcIiAtbyAhIC1kIFwiJGhvbWVcIiBdOyB0aGVuXG4iCi0iCQlpZiBbIC1kIFwiL2hvbWUvJFVTRVJcIiBdOyB0aGVuXG4iCi0iCQkJaG9tZT1cIi9ob21lLyRVU0VSXCJcbiIKLSIJCWVsc2UgXG4iCi0iCQkJaG9tZT1fX25vcGxhY2VfX1xuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSIJaWYgWyAtZiBcIiRob21lLy5kbXJjXCIgXTsgdGhlblxuIgotIgkJaWYgWyBcIlgkaGF2ZV9zdGFydGtkZVwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlpZiBlZ3JlcCAtaSAnU2Vzc2lvbj1rZGUnIFwiJGhvbWUvLmRtcmNcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQllY2hvIFwiJGhhdmVfc3RhcnRrZGVcIlxuIgotIgkJCQlyZXR1cm5cbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJCWlmIFsgXCJYJGhhdmVfc3RhcnRseGRlXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCWlmIGVncmVwIC1pICdTZXNzaW9uPWx4ZGUnIFwiJGhvbWUvLmRtcmNcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQllY2hvIFwiJGhhdmVfc3RhcnRseGRlXCJcbiIKLSIJCQkJcmV0dXJuXG4iCi0iCQkJZmlcbiIKLSIJCWZpXG4iCi0iCQlpZiBbIFwiWCRoYXZlX2dub21lX3Nlc3Npb25cIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJaWYgZWdyZXAgLWkgJ1Nlc3Npb249Z25vbWUnIFwiJGhvbWUvLmRtcmNcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQllY2hvIFwiJGhhdmVfZ25vbWVfc2Vzc2lvblwiXG4iCi0iCQkJCXJldHVyblxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIgkJZm9yIHdtIGluIGJsYWNrYm94IGZ2d20gaWNld20gd213IG9wZW5ib3ggdHdtIG13bSB3aW5kb3dtYWtlciBlbmxpZ2h0ZW5tZW50IG1ldGFjaXR5IHN0YXJ0eGZjZTQgc3RhcnR4ZmNlXG4iCi0iCQlkb1xuIgotIgkJCWV2YWwgXCJoYXZlPVxcJGhhdmVfJHdtXCJcbiIKLSIJCQlpZiBbIFwiWCRoYXZlXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCWNvbnRpbnVlXG4iCi0iCQkJZmlcbiIKLSIJCQlpZiBncmVwIC1pIFwiU2Vzc2lvbj0kd21cIiBcIiRob21lLy5kbXJjXCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJZWNobyBcIiRoYXZlXCJcbiIKLSIJCQkJcmV0dXJuXG4iCi0iCQkJZmlcbiIKLSIJCQlcbiIKLSIJCWRvbmVcbiIKLSIJCWlmIGVncmVwIC1pICdTZXNzaW9uPWRlZmF1bHQnIFwiJGhvbWUvLmRtcmNcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCWlmIFsgXCJYJGhhdmVfZ25vbWVfc2Vzc2lvblwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQkJZWNobyBcIiRoYXZlX2dub21lX3Nlc3Npb25cIlxuIgotIgkJCQlyZXR1cm5cbiIKLSIJCQllbGlmIFsgXCJYJGhhdmVfc3RhcnRrZGVcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCWVjaG8gXCIkaGF2ZV9zdGFydGtkZVwiXG4iCi0iCQkJCXJldHVyblxuIgotIgkJCWVsaWYgWyBcIlgkaGF2ZV9zdGFydHhmY2VcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCWVjaG8gXCIkaGF2ZV9zdGFydHhmY2VcIlxuIgotIgkJCQlyZXR1cm5cbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJZmlcbiIKLSIJaWYgWyAtZiBcIiRob21lLy54c2Vzc2lvblwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCIkaG9tZS8ueHNlc3Npb25cIlxuIgotIgkJcmV0dXJuXG4iCi0iCWVsaWYgWyAtZiBcIiRob21lLy54aW5pdHJjXCIgXTsgdGhlblxuIgotIgkJZWNobyBcIiRob21lLy54aW5pdHJjXCJcbiIKLSIJCXJldHVyblxuIgotIglmaVxuIgotIglpZiBbIFwiWCRoYXZlX3h0ZXJtXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJZWNobyAkaGF2ZV94dGVybVxuIgotIgkJcmV0dXJuXG4iCi0iCWVsc2VcbiIKLSIJCWVjaG8gXCIueGluaXRyY1wiXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotImNoZWNrX3JlZGlyX3NlcnZpY2VzKCkge1xuIgotIglyZWRpcl9kYWVtb249XCJcIlxuIgotIgluZWVkX2Vudj1cIlwiXG4iCi0iCWlmIGVjaG8gXCIkc2Vzc1wiIHwgZ3JlcCAnXmVudiAnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQlzZXNzPWBlY2hvIFwiJHNlc3NcIiB8IHNlZCAtZSAncy9eZW52IC8vJ2BcbiIKLSIJCW5lZWRfZW52PTFcbiIKLSIJZmlcbiIKLSIJaWYgWyBcIlgkRkRfRVNEXCIgIT0gXCJYXCIgLWEgXCJYJGhhdmVfZXNkZHNwXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJaWYgZWNobyBcIiRGRF9FU0RcIiB8IGdyZXAgJ15EQUVNT04tJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCUZEX0VTRD1gZWNobyBcIiRGRF9FU0RcIiB8IHNlZCAtZSAncy9EQUVNT04tLy8nYFxuIgotIgkJCXJwb3J0PWBlY2hvIFwiJEZEX0VTRFwiIHwgc2VkIC1lICdzL14uKjovLydgXG4iCi0iCQkJZHBvcnQ9YGV4cHIgJHJwb3J0ICsgMWBcbiIKLSIJCQlkcG9ydD1gZnJlZXBvcnQgJGRwb3J0YFxuIgotIgkJCUZEX0VTRD0kZHBvcnRcbiIKLSIJCQlyZWRpcl9kYWVtb249XCIkcmVkaXJfZGFlbW9uLFRTX0VTRF9SRURJUjokZHBvcnQ6JHJwb3J0XCJcbiIKLSIJCWZpXG4iCi0iCQlpZiBlY2hvIFwiJEZEX0VTRFwiIHwgZ3JlcCAnOicgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQk6XG4iCi0iCQllbHNlXG4iCi0iCQkJRkRfRVNEPVwibG9jYWxob3N0OiRGRF9FU0RcIlxuIgotIgkJZmlcbiIKLSIJCXNlc3M9XCJFU1BFQUtFUj0kRkRfRVNEICRoYXZlX2VzZGRzcCAtcyAkRkRfRVNEICRzZXNzXCJcbiIKLSIJCW5lZWRfZW52PTFcbiIKLSIJZmlcbiIKLSIJaWYgWyBcIlgkRkRfQ1VQU1wiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWlmIGVjaG8gXCIkRkRfQ1VQU1wiIHwgZ3JlcCAnXkRBRU1PTi0nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJRkRfQ1VQUz1gZWNobyBcIiRGRF9DVVBTXCIgfCBzZWQgLWUgJ3MvREFFTU9OLS8vJ2BcbiIKLSIJCQlycG9ydD1gZWNobyBcIiRGRF9DVVBTXCIgfCBzZWQgLWUgJ3MvXi4qOi8vJ2BcbiIKLSIJCQlkcG9ydD1gZXhwciAkcnBvcnQgKyAxYFxuIgotIgkJCWRwb3J0PWBmcmVlcG9ydCAkZHBvcnRgXG4iCi0iCQkJRkRfQ1VQUz0kZHBvcnRcbiIKLSIJCQlyZWRpcl9kYWVtb249XCIkcmVkaXJfZGFlbW9uLFRTX0NVUFNfUkVESVI6JGRwb3J0OiRycG9ydFwiXG4iCi0iCQlmaVxuIgotIgkJaWYgZWNobyBcIiRGRF9DVVBTXCIgfCBncmVwICc6JyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCTpcbiIKLSIJCWVsc2VcbiIKLSIJCQlGRF9DVVBTPVwibG9jYWxob3N0OiRGRF9DVVBTXCJcbiIKLSIJCWZpXG4iCi0iCQljc3I9YGVjaG8gXCIkRkRfQ1VQU1wiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgXG4iCi0iCQlpcHA9YGVjaG8gXCIkRkRfQ1VQU1wiIHwgYXdrIC1GOiAne3ByaW50ICQyfSdgXG4iCi0iCQlvbGQ9YHN0cmluZ3MgLWEgL3Vzci9zYmluL2N1cHNkIDI+L2Rldi9udWxsIHwgZ3JlcCAnQ1VQUy52MVxcLlswMV0nYFxuIgotIgkJaWYgWyBcIlgkb2xkXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCUZEX0NVUFM9YGVjaG8gXCIkRkRfQ1VQU1wiIHwgc2VkIC1lICdzLzouKiQvLydgXG4iCi0iCQlmaVxuIgotIgkJc2Vzcz1cIkNVUFNfU0VSVkVSPSRGRF9DVVBTIElQUF9QT1JUPSRpcHAgJHNlc3NcIlxuIgotIgkJbmVlZF9lbnY9MVxuIgotIglmaVxuIgotIlxuIgotIglpZiBbIFwiWCRGRF9TTUJcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlpZiBlY2hvIFwiJEZEX1NNQlwiIHwgZ3JlcCAnXkRBRU1PTi0nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJRkRfU01CPWBlY2hvIFwiJEZEX1NNQlwiIHwgc2VkIC1lICdzL0RBRU1PTi0vLydgXG4iCi0iCQkJcnBvcnQ9YGVjaG8gXCIkRkRfU01CXCIgfCBzZWQgLWUgJ3MvXi4qOi8vJ2BcbiIKLSIJCQlkcG9ydD1gZXhwciAkcnBvcnQgKyAxYFxuIgotIgkJCWRwb3J0PWBmcmVlcG9ydCAkZHBvcnRgXG4iCi0iCQkJRkRfU01CPSRkcG9ydFxuIgotIgkJCXJlZGlyX2RhZW1vbj1cIiRyZWRpcl9kYWVtb24sVFNfU01CX1JFRElSOiRkcG9ydDokcnBvcnRcIlxuIgotIgkJZmlcbiIKLSIJCWlmIGVjaG8gXCIkRkRfU01CXCIgfCBncmVwICc6JyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCTpcbiIKLSIJCWVsc2VcbiIKLSIJCQlGRF9TTUI9XCJsb2NhbGhvc3Q6JEZEX1NNQlwiXG4iCi0iCQlmaVxuIgotIgkJc21oPWBlY2hvIFwiJEZEX1NNQlwiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgXG4iCi0iCQlzbXA9YGVjaG8gXCIkRkRfU01CXCIgfCBhd2sgLUY6ICd7cHJpbnQgJDJ9J2BcbiIKLSIJCWlmIFsgXCJYJHNtaFwiID0gXCJYXCIgXTsgdGhlblxuIgotIgkJCXNtaD1sb2NhbGhvc3RcbiIKLSIJCWZpXG4iCi0iCQlzZXNzPVwiU01CX1NFUlZFUj0kRkRfU01CIFNNQl9IT1NUPSRzbWggU01CX1BPUlQ9JHNtcCAkc2Vzc1wiXG4iCi0iCQluZWVkX2Vudj0xXG4iCi0iCWZpXG4iCi0iXG4iCi0iCWlmIFsgXCJYJEZEX05BU1wiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWlmIGVjaG8gXCIkRkRfTkFTXCIgfCBncmVwICdeREFFTU9OLScgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQlGRF9OQVM9YGVjaG8gXCIkRkRfTkFTXCIgfCBzZWQgLWUgJ3MvREFFTU9OLS8vJ2BcbiIKLSIJCQlycG9ydD1gZWNobyBcIiRGRF9OQVNcIiB8IHNlZCAtZSAncy9eLio6Ly8nYFxuIgotIgkJCWRwb3J0PWBleHByICRycG9ydCArIDFgXG4iCi0iCQkJZHBvcnQ9YGZyZWVwb3J0ICRkcG9ydGBcbiIKLSIJCQlGRF9OQVM9JGRwb3J0XG4iCi0iCQkJcmVkaXJfZGFlbW9uPVwiJHJlZGlyX2RhZW1vbixUU19OQVNfUkVESVI6JGRwb3J0OiRycG9ydFwiXG4iCi0iCQlmaVxuIgotIgkJaWYgZWNobyBcIiRGRF9OQVNcIiB8IGdyZXAgJzonID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJOlxuIgotIgkJZWxzZVxuIgotIgkJCUZEX05BUz1cInRjcC9sb2NhbGhvc3Q6JEZEX05BU1wiXG4iCi0iCQlmaVxuIgotIgkJc2Vzcz1cIkFVRElPU0VSVkVSPSRGRF9OQVMgJHNlc3NcIlxuIgotIgkJbmVlZF9lbnY9MVxuIgotIglmaVxuIgotIglpZiBbIFwiWCRuZWVkX2VudlwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCXNlc3M9XCJlbnYgJHNlc3NcIlxuIgotIglmaVxuIgotIglyZWRpcl9kYWVtb249YGVjaG8gXCIkcmVkaXJfZGFlbW9uXCIgfCBzZWQgLWUgJ3MvXiwqLy8nYFxuIgotIgllY2hvIFwicmVkaXJfZGFlbW9uPSRyZWRpcl9kYWVtb25cIiAxPiYyXG4iCi0ifVxuIgotIlxuIgotInJjaGsoKSB7XG4iCi0iCXJyPXJyXG4iCi0ifVxuIgotIlxuIgotImRMPVwiLUxcIlxuIgotImlmIHVuYW1lIC1zciB8IGVncmVwICdTdW5PUyA1XFwuWzUtOF0nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCWRMPVwiLWhcIlxuIgotImZpXG4iCi0iXG4iCi0iIyBhIHBvcnRhYmxlIHRtcCBmaWxlIGNyZWF0b3JcbiIKLSJteXRtcCgpIHtcbiIKLSIJdGY9JDFcbiIKLSIJaWYgdHlwZSBta3RlbXAgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuIgotIgkJIyBpZiB3ZSBoYXZlIG1rdGVtcCgxKSwgdXNlIGl0OlxuIgotIgkJdGYyPVwiJHRmLlhYWFhYWFwiXG4iCi0iCQl0ZjI9YG1rdGVtcCBcIiR0ZjJcImBcbiIKLSIJCWlmIFsgXCJYJHRmMlwiICE9IFwiWFwiIC1hIC1mIFwiJHRmMlwiIF07IHRoZW5cbiIKLSIJCQlpZiBbIFwiWCRERUJVR19NS1RFTVBcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJCWVjaG8gXCJteXRtcC1ta3RlbXA6ICR0ZjJcIiAxPiYyXG4iCi0iCQkJZmlcbiIKLSIJCQllY2hvIFwiJHRmMlwiXG4iCi0iCQkJcmV0dXJuXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIgkjIGZhbGxiYWNrIHRvIG11bHRpcGxlIGNtZHM6XG4iCi0iCXJtIC1yZiBcIiR0ZlwiIHx8IGV4aXQgMVxuIgotIglpZiBbIC1kIFwiJHRmXCIgXTsgdGhlblxuIgotIgkJZWNobyBcInRtcCBmaWxlICR0ZiBzdGlsbCBleGlzdHMgYXMgYSBkaXJlY3RvcnkuXCJcbiIKLSIJCWV4aXQgMVxuIgotIgllbGlmIFsgJGRMIFwiJHRmXCIgXTsgdGhlblxuIgotIgkJZWNobyBcInRtcCBmaWxlICR0ZiBzdGlsbCBleGlzdHMgYXMgYSBzeW1saW5rLlwiXG4iCi0iCQlleGl0IDFcbiIKLSIJZWxpZiBbIC1mIFwiJHRmXCIgXTsgdGhlblxuIgotIgkJZWNobyBcInRtcCBmaWxlICR0ZiBzdGlsbCBleGlzdHMuXCJcbiIKLSIJCWV4aXQgMVxuIgotIglmaVxuIgotIgl0b3VjaCBcIiR0ZlwiIHx8IGV4aXQgMVxuIgotIgljaG1vZCA2MDAgXCIkdGZcIiB8fCBleGl0IDFcbiIKLSIJcmNoa1xuIgotIglpZiBbIFwiWCRERUJVR19NS1RFTVBcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQllY2hvIFwibXl0bXAtdG91Y2g6ICR0ZlwiIDE+JjJcbiIKLSIJZmlcbiIKLSIJZWNobyBcIiR0ZlwiXG4iCi0ifVxuIgotIlxuIgotIm1pc3NpbmdfbWVzZygpIHtcbiIKLSIJZWNobyBcIlwiIDE+JjJcbiIKLSIJZWNobyBcIlRoZSBwcm9ncmFtIFxcXCIkMVxcXCIgY291bGQgbm90IGJlIGZvdW5kIGluIFBBVEggYW5kIHN0YW5kYXJkIGxvY2F0aW9ucy5cIiAxPiYyXG4iCi0iCWVjaG8gXCJZb3UgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGEgcGFja2FnZSB0aGF0IHByb3ZpZGVzIHRoZSBcXFwiJDFcXFwiIHByb2dyYW0uXCIgMT4mMlxuIgotIgllY2hvIFwiXCIgMT4mMlxuIgotIn1cbiIKLSJcbiIKLSJwdXRfYmFja19MQ19BTEwoKSB7XG4iCi0iCWlmIFsgXCJYJFgxMVZOQ19DUkVBVEVfTENfQUxMX0NfT0tcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWlmIFsgXCJYJExDX0FMTF9zYXZlXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJdW5zZXQgTENfQUxMXG4iCi0iCQllbHNlXG4iCi0iCQkJTENfQUxMPVwiJExDX0FMTF9zYXZlXCJcbiIKLSIJCWZpXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotInNlcnZlcigpIHtcbiIKLSIJYXV0aGZpbGU9YGF1dGhgXG4iCi0iCXNlc3M9YGZpbmRzZXNzaW9uYFxuIgotIglESVNQTEFZPTokTlxuIgotIglleHBvcnQgRElTUExBWVxuIgotIglzdG1wPVwiXCJcbiIKLSIJbm94YXV0aD1cIlwiXG4iCi0iCWlmIFsgXCJYJGhhdmVfcm9vdFwiICE9IFwiWFwiIC1hIFwiWCRVU0VSXCIgIT0gXCJYcm9vdFwiIF07IHRoZW5cbiIKLSIJCXNlc3M9XCJlbnYgRElTUExBWT06JE4gJHNlc3NcIlxuIgotIgkJbm94YXV0aD1cIjFcIlxuIgotIglmaVxuIgotIlxuIgotIglyZWRpcl9kYWVtb249XCJcIlxuIgotIgljaGVja19yZWRpcl9zZXJ2aWNlc1xuIgotIlxuIgotIglybWY9XCIvbm9zdWNoXCJcbiIKLSIJaWYgZWNobyBcIiRzZXNzXCIgfCBncmVwICdbIAldJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJc3RtcD0vdG1wLy5jZCQkYHJhbmRvbWBcbiIKLSIJCXN0bXA9YG15dG1wIFwiJHN0bXBcImBcbiIKLSIJCXRvdWNoICRzdG1wXG4iCi0iCQljaG1vZCA3NTUgJHN0bXAgfHwgZXhpdCAxXG4iCi0iCQllY2hvIFwiIyEvYmluL3NoXCIgPiAkc3RtcFxuIgotIgkJI2VjaG8gXCIoaWQ7IGVudjsgZW52IHwgZ3JlcCBYQVVUSE9SSVRZIHwgc2VkIC1lICdzL1hBVVRIT1JJVFk9Ly8nIHwgeGFyZ3MgbHMgLWwpID4gL3RtcC9FTlYuT1VULiQkXCIgPj4gJHN0bXBcbiIKLSIJCWlmIFsgXCJYJFNBVkVfUEFUSFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQllY2hvIFwiUEFUSD1cXFwiJFNBVkVfUEFUSFxcXCJcIiA+PiAkc3RtcFxuIgotIgkJCWVjaG8gXCJleHBvcnQgUEFUSFwiID4+ICRzdG1wXG4iCi0iCQlmaVxuIgotIgkJaWYgWyBcIlgkbm94YXV0aFwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCQllY2hvIFwidW5zZXQgWEFVVEhPUklUWVwiICAgPj4gJHN0bXBcbiIKLSIJCWZpXG4iCi0iCQllY2hvIFwiJHNlc3NcIiAgID4+ICRzdG1wXG4iCi0iCQllY2hvIFwic2xlZXAgMVwiICAgPj4gJHN0bXBcbiIKLSIJCWVjaG8gXCJybSAtZiAkc3RtcFwiID4+ICRzdG1wXG4iCi0iCQlzZXNzPSRzdG1wXG4iCi0iCQlybWY9XCIkc3RtcFwiXG4iCi0iCWZpXG4iCi0iXG4iCi0iCWlmIFsgXCJYJGhhdmVfcm9vdFwiICE9IFwiWFwiIC1hIFwiWCRVU0VSXCIgIT0gXCJYcm9vdFwiIF07IHRoZW5cbiIKLSIJCWN0bXAxPS90bXAvLnhhdDFfJCRgcmFuZG9tYFxuIgotIgkJY3RtcDE9YG15dG1wIFwiJGN0bXAxXCJgXG4iCi0iCQljdG1wMj0vdG1wLy54YXQyXyQkYHJhbmRvbWBcbiIKLSIJCWN0bXAyPWBteXRtcCBcIiRjdG1wMlwiYFxuIgotIgkJdG91Y2ggJGN0bXAxICRjdG1wMlxuIgotIgkJJGhhdmVfeGF1dGggLWYgJGF1dGhmaWxlIG5leHRyYWN0IC0gICAgICAgICAgIDokTiA+ICRjdG1wMVxuIgotIgkJJGhhdmVfeGF1dGggLWYgJGF1dGhmaWxlIG5leHRyYWN0IC0gYGhvc3RuYW1lYDokTiA+ICRjdG1wMlxuIgotIgkJY2hvd24gJFVTRVIgJGN0bXAxICRjdG1wMlxuIgotIgkJKHVuc2V0IFhBVVRIT1JJVFk7IHN1IC0gJFVTRVIgLWMgXCIkaGF2ZV94YXV0aCBubWVyZ2UgLSA8ICRjdG1wMVwiIDE+JjIpXG4iCi0iCQkodW5zZXQgWEFVVEhPUklUWTsgc3UgLSAkVVNFUiAtYyBcIiRoYXZlX3hhdXRoIG5tZXJnZSAtIDwgJGN0bXAyXCIgMT4mMilcbiIKLSIJCXJtIC1mICRjdG1wMSAkY3RtcDJcbiIKLSIJCVhBVVRIT1JJVFk9JGF1dGhmaWxlXG4iCi0iCQlleHBvcnQgWEFVVEhPUklUWVxuIgotIgkJc2Vzcz1cIi9iaW4vc3UgLSAkVVNFUiAtYyAkc2Vzc1wiXG4iCi0iCWVsc2VcbiIKLSIJCSRoYXZlX3hhdXRoIC1mICRhdXRoZmlsZSBuZXh0cmFjdCAtICAgICAgICAgICA6JE4gfCAkaGF2ZV94YXV0aCBubWVyZ2UgLVxuIgotIgkJJGhhdmVfeGF1dGggLWYgJGF1dGhmaWxlIG5leHRyYWN0IC0gYGhvc3RuYW1lYDokTiB8ICRoYXZlX3hhdXRoIG5tZXJnZSAtXG4iCi0iCWZpXG4iCi0iXG4iCi0iCXJlc3VsdD0wXG4iCi0iCSNucz00XG4iCi0iCW5zPTBcbiIKLSIJbnMyPTFcbiIKLSIJI2lmIHVuYW1lIHwgZ3JlcCBTdW5PUyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkjCW5zPTJcbiIKLSIJI2ZpXG4iCi0iXG4iCi0iXG4iCi0iCWlmIFsgXCJYJHVzZV94ZG1jcF9xdWVyeVwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCSMgd2UgY2Fubm90IHVzZSAtbm9saXN0ZW4gdGNwXG4iCi0iCQlpZiBbIFwiWCRGRF9YRE1DUF9JRlwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlsaG9zdD0kRkRfWERNQ1BfSUZcbiIKLSIJCWVsaWYgWyBcIlgkaGF2ZV9uZXRzdGF0XCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJbGhvc3Q9bG9jYWxob3N0XG4iCi0iCQllbGlmICRoYXZlX25ldHN0YXQgLWFuIHwgZ3JlcCAtdyAxNzcgfCBncmVwIC13IHVkcCA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCWxob3N0PWxvY2FsaG9zdFxuIgotIgkJZWxpZiAkaGF2ZV9uZXRzdGF0IC1hbiB8IGdyZXAgLXcgMTc3IHwgZ3JlcCAtdyB1ZHA2ID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJbGhvc3Q9OjoxXG4iCi0iCQllbHNlXG4iCi0iCQkJbGhvc3Q9bG9jYWxob3N0XG4iCi0iCQlmaVxuIgotIgkJZWNobyBcIiQqIC1vbmNlIC1xdWVyeSAkbGhvc3QgJEZEX09QVFNcIiAxPiYyXG4iCi0iCQlwdXRfYmFja19MQ19BTExcbiIKLSIJCWlmIFsgXCJYJGhhdmVfcm9vdFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlpZiBbIC1yICRhdXRoZmlsZSBdOyB0aGVuXG4iCi0iCQkJCSRoYXZlX25vaHVwICQqIC1vbmNlIC1xdWVyeSAkbGhvc3QgLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTIDE+JjIgJlxuIgotIgkJCWVsc2VcbiIKLSIJCQkJIyB3aHkgZGlkIHdlIGhhdmUgdGhpcz9cbiIKLSIJCQkJJGhhdmVfbm9odXAgJCogLW9uY2UgLXF1ZXJ5ICRsaG9zdCAkRkRfT1BUUyAxPiYyICZcbiIKLSIJCQlmaVxuIgotIgkJZWxzZVxuIgotIgkJCWlmIFsgXCJYJG5zXCIgPSBcIlgwXCIgXTsgdGhlblxuIgotIgkJCQkkaGF2ZV9ub2h1cCBzaCAtYyBcIiQqIC1vbmNlIC1xdWVyeSAkbGhvc3QgLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTXCIgMT4mMiAmXG4iCi0iCQkJZWxzZVxuIgotIgkJCQkkaGF2ZV9ub2h1cCBzaCAtYyBcIihzbGVlcCAkbnM7ICQqIC1vbmNlIC1xdWVyeSAkbGhvc3QgLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTKVwiIDE+JjIgJlxuIgotIgkJCQkjcmVzdWx0PTFcbiIKLSIJCQlmaVxuIgotIgkJZmlcbiIKLSIJCXBpZD0kIVxuIgotIgkJc2xlZXAgMTBcbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3N0YXJ0eFwiICE9IFwiWFwiIC1vIFwiWCRoYXZlX3hpbml0XCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJaWYgWyBcIlgkaGF2ZV94aW5pdFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlzeGNtZD0kaGF2ZV94aW5pdFxuIgotIgkJZWxzZVxuIgotIgkJCXN4Y21kPSRoYXZlX3N0YXJ0eFxuIgotIgkJZmlcbiIKLSIJCWVjaG8gXCIkc3hjbWQgJHNlc3MgLS0gJCogJG5vbGlzdGVuIC1hdXRoICRhdXRoZmlsZSAkRkRfT1BUU1wiIDE+JjJcbiIKLSIJCXB1dF9iYWNrX0xDX0FMTFxuIgotIgkJaWYgWyBcIlgkaGF2ZV9yb290XCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCSRzeGNtZCAkc2VzcyAtLSAkKiAkbm9saXN0ZW4gLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTIDE+JjIgJlxuIgotIgkJZWxzZVxuIgotIgkJCWlmIFsgXCJYJG5zXCIgPSBcIlgwXCIgXTsgdGhlblxuIgotIgkJCQkkaGF2ZV9ub2h1cCBzaCAtYyBcIiRzeGNtZCAkc2VzcyAtLSAkKiAkbm9saXN0ZW4gLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTXCIgMT4mMiAmXG4iCi0iCQkJZWxzZVxuIgotIgkJCQkjIFdoeSBkaWQgd2UgZXZlciBzbGVlcCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlcj8/XG4iCi0iCQkJCSRoYXZlX25vaHVwIHNoIC1jIFwiKHNsZWVwICRuczsgJHN4Y21kICRzZXNzIC0tICQqICRub2xpc3RlbiAtYXV0aCAkYXV0aGZpbGUgJEZEX09QVFMpXCIgMT4mMiAmXG4iCi0iCQkJCSNyZXN1bHQ9MVxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIgkJcGlkPSQhXG4iCi0iCWVsc2VcbiIKLSIJCSMgbmVlZCB0byBlbXVsYXRlIHN0YXJ0eC94aW5pdCBvdXJzZWx2ZXMuLi5cbiIKLSIJCWVjaG8gXCIkKiAkbm9saXN0ZW4gLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTXCIgMT4mMlxuIgotIgkJcHV0X2JhY2tfTENfQUxMXG4iCi0iCQlpZiBbIFwiWCRoYXZlX3Jvb3RcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJJGhhdmVfbm9odXAgJCogJG5vbGlzdGVuIC1hdXRoICRhdXRoZmlsZSAkRkRfT1BUUyAxPiYyICZcbiIKLSIJCQlwaWQ9JCFcbiIKLSIJCQlzbGVlcCAzXG4iCi0iCQkJJGhhdmVfbm9odXAgJHNlc3MgMT4mMiAmXG4iCi0iCQllbHNlXG4iCi0iCQkJaWYgWyBcIlgkbnNcIiA9IFwiWDBcIiBdOyB0aGVuXG4iCi0iCQkJCSRoYXZlX25vaHVwIHNoIC1jIFwiJCogJG5vbGlzdGVuIC1hdXRoICRhdXRoZmlsZSAkRkRfT1BUU1wiIDE+JjIgJlxuIgotIgkJCWVsc2VcbiIKLSIJCQkJJGhhdmVfbm9odXAgc2ggLWMgXCIoc2xlZXAgJG5zOyAkKiAkbm9saXN0ZW4gLWF1dGggJGF1dGhmaWxlICRGRF9PUFRTKVwiIDE+JjIgJlxuIgotIgkJCQkjcmVzdWx0PTFcbiIKLSIJCQlmaVxuIgotIgkJCXBpZD0kIVxuIgotIgkJCXNsZWVwIDNcbiIKLSIJCQkkaGF2ZV9ub2h1cCBzaCAtYyBcIihzbGVlcCAzOyAkc2VzcylcIiAxPiYyICZcbiIKLSIJCWZpXG4iCi0iCWZpXG4iCi0iXG4iCi0iCUxDX0FMTD1DXG4iCi0iCWV4cG9ydCBMQ19BTExcbiIKLSJcbiIKLSIJaWYgdW5hbWUgfCBncmVwIFN1bk9TID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkkaGF2ZV9ub2h1cCBzaCAtYyBcIihzbGVlcCAxNTA7IHJtIC1mICRybWYpXCIgMT4mMiAmXG4iCi0iCWVsc2VcbiIKLSIJCSRoYXZlX25vaHVwIHNoIC1jIFwiKHNsZWVwIDE1MDsgcm0gLWYgJHJtZiAkYXV0aGZpbGUpXCIgMT4mMiAmXG4iCi0iCWZpXG4iCi0iXG4iCi0iCXQ9MFxuIgotIgl0bWF4PTVcbiIKLSIJd2hpbGUgWyAkdCAtbHQgJHRtYXggXVxuIgotIglkb1xuIgotIgkJdD1gZXhwciAkdCArIDFgXG4iCi0iCQlzbGVlcCAkbnMyXG4iCi0iCQlwaWQyPWBoZWFkIC1uIDEgXCIvdG1wLy5YJE4tbG9ja1wiIDI+L2Rldi9udWxsIHwgc2VkIC1lICdzL1sgCV0vL2cnIHwgZ3JlcCAnXlswLTldWzAtOV0qJCdgXG4iCi0iCQlpZiBbIFwiWCRwaWQyXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJcGlkMj05OTk5OTk5XG4iCi0iCQlmaVxuIgotIgkJaWYgWyBcIlgkcmVzdWx0XCIgPSBcIlgxXCIgXTsgdGhlblxuIgotIgkJCWJyZWFrXG4iCi0iCQllbGlmIFsgLWQgL3Byb2MvJHBpZDIgXTsgdGhlblxuIgotIgkJCXJlc3VsdD0xXG4iCi0iCQkJYnJlYWtcbiIKLSIJCWVsaWYga2lsbCAtMCAkcGlkMiAyPi9kZXYvbnVsbDsgdGhlblxuIgotIgkJCXJlc3VsdD0xXG4iCi0iCQkJYnJlYWtcbiIKLSIJCWVsaWYgWyAtZCAvcHJvYy8kcGlkIF07IHRoZW5cbiIKLSIJCQlyZXN1bHQ9MVxuIgotIgkJCWJyZWFrXG4iCi0iCQllbGlmIGtpbGwgLTAgJHBpZCAyPi9kZXYvbnVsbDsgdGhlblxuIgotIgkJCXJlc3VsdD0xXG4iCi0iCQkJYnJlYWtcbiIKLSIJCWVsc2VcbiIKLSIJCQlyZXN1bHQ9MFxuIgotIgkJZmlcbiIKLSIJCWlmIFsgXCJYJGhhdmVfbmV0c3RhdFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlpZiAkaGF2ZV9uZXRzdGF0IC1hbiB8IGdyZXAgXCIvdG1wLy5YMTEtdW5peC9YJE5cXCRcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCQlyZXN1bHQ9MVxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIglkb25lXG4iCi0iXG4iCi0iCWlmIFsgXCJYJHJlZGlyX2RhZW1vblwiICE9IFwiWFwiIC1hIFwiWCRyZXN1bHRcIiA9IFwiWDFcIiBdOyB0aGVuXG4iCi0iCQlyZWRpcl9kYWVtb249YGVjaG8gXCIkcmVkaXJfZGFlbW9uXCIgfCBzZWQgLWUgJ3MvW34hJCYqKCl8Oz88PlwiXS8vZycgLWUgXCJzLycvL2dcImBcbiIKLSIJCXhwcm9nPSRYMTFWTkNfUFJPR1xuIgotIgkJaWYgWyBcIlgkeHByb2dcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQl4cHJvZz14MTF2bmNcbiIKLSIJCWZpXG4iCi0iCQllY2hvIFwicnVubmluZzogJHhwcm9nIC1zbGVlcGluIDEwIC1hdXRoICRhdXRoZmlsZSAtdHNkICckcmVkaXJfZGFlbW9uJ1wiIDE+JjJcbiIKLSIJCSRoYXZlX25vaHVwIHNoIC1jIFwiJHhwcm9nIC1zbGVlcGluIDEwIC1hdXRoICRhdXRoZmlsZSAtdHNkICckcmVkaXJfZGFlbW9uJyAmXCIgMj4udHNkLmxvZy4kVVNFUiAxPiYyICZcbiIKLSIJZmlcbiIKLSJ9XG4iCi0iXG4iCi0idHJ5X1goKSB7XG4iCi0iCWlmIFsgXCJYJHVzZV94ZG1jcF9xdWVyeVwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCWlmIFsgXCJYJGhhdmVfWFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlzZXJ2ZXIgJGhhdmVfWCA6JE5cbiIKLSIJCWVsaWYgWyBcIlgkaGF2ZV9Yb3JnXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJCXNlcnZlciAkaGF2ZV9Yb3JnIDokTlxuIgotIgkJZWxpZiBbIFwiWCRoYXZlX1hGcmVlODZcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJc2VydmVyICRoYXZlX1hGcmVlODYgOiROXG4iCi0iCQllbGlmIFsgXCJYJGhhdmVfWHN1blwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlzZXJ2ZXIgJGhhdmVfWHN1biA6JE5cbiIKLSIJCWZpXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV94aW5pdFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCXNhdmVfaGF2ZV9zdGFydHg9JGhhdmVfc3RhcnR4XG4iCi0iCQloYXZlX3N0YXJ0eD1cIlwiXG4iCi0iCQlzZXJ2ZXIgOiROXG4iCi0iCQloYXZlX3N0YXJ0eD0kc2F2ZV9oYXZlX3N0YXJ0eFxuIgotIgllbHNlXG4iCi0iCQlzZXJ2ZXIgOiROXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotInRyeV9Ydm5jKCkge1xuIgotIglpZiBbIFwiWCRoYXZlX1h2bmNcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCW1pc3NpbmdfbWVzZyBYdm5jXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSJcbiIKLSIJc2VydmVyICRoYXZlX1h2bmMgOiROIC1nZW9tZXRyeSAkZ2VvbSAtZGVwdGggJGRlcHRoXG4iCi0ifVxuIgotIlxuIgotInRyeV9Yc3J2KCkge1xuIgotIglpZiBbIFwiWCRGRF9YU1JWXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSJcbiIKLSIJc2VydmVyICRGRF9YU1JWIDokTiAtZ2VvbWV0cnkgJGdlb20gLWRlcHRoICRkZXB0aFxuIgotIn1cbiIKLSJcbiIKLSJhZGRfbW9kbWFwKCkge1xuIgotIglpZiBbIFwiWCRoYXZlX3Jvb3RcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJICAgICRoYXZlX25vaHVwIHNoIC1jIFwiKFxuIgotIgkJc2xlZXAgMTA7XG4iCi0iCQkkaGF2ZV94bW9kbWFwIC1kaXNwbGF5IDokTiAtZSAna2V5Y29kZSBhbnkgPSBTaGlmdF9SJyBcXFxuIgotIgkJCS1lICdhZGQgU2hpZnQgPSBTaGlmdF9MIFNoaWZ0X1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQ29udHJvbF9SJyBcXFxuIgotIgkJCS1lICdhZGQgQ29udHJvbCA9IENvbnRyb2xfTCBDb250cm9sX1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQWx0X0wnIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQWx0X1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gTWV0YV9MJyBcXFxuIgotIgkJCS1lICdjbGVhciBNb2QxJyBcXFxuIgotIgkJCS1lICdhZGQgTW9kMSA9IEFsdF9MIEFsdF9SIE1ldGFfTCc7XG4iCi0iCQlpZiB1bmFtZSB8IGdyZXAgU3VuT1MgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQlmb3Igc3ltIGluIFN1bkF1ZGlvTXV0ZSBTdW5BdWRpb0xvd2VyVm9sdW1lIFN1bkF1ZGlvUmFpc2VWb2x1bWVcbiIKLSIJCQlkb1xuIgotIgkJCQlpZiAkaGF2ZV94bW9kbWFwIC1wayB8IGdyZXAgLXcgXFwkc3ltID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJCQk6XG4iCi0iCQkJCWVsc2VcbiIKLSIJCQkJCSRoYXZlX3htb2RtYXAgLWUgXFxcImtleWNvZGUgYW55ID0gXFwkc3ltXFxcIlxuIgotIgkJCQlmaVxuIgotIgkJCWRvbmVcbiIKLSIJCWZpXG4iCi0iXG4iCi0iCSAgICApXCIgMT4mMiAmXG4iCi0iCWVsc2VcbiIKLSIJICAgIChcbiIKLSIJCXNsZWVwIDY7XG4iCi0iCQkkaGF2ZV94bW9kbWFwIC1kaXNwbGF5IDokTiAtZSAna2V5Y29kZSBhbnkgPSBTaGlmdF9SJyBcXFxuIgotIgkJCS1lICdhZGQgU2hpZnQgPSBTaGlmdF9MIFNoaWZ0X1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQ29udHJvbF9SJyBcXFxuIgotIgkJCS1lICdhZGQgQ29udHJvbCA9IENvbnRyb2xfTCBDb250cm9sX1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQWx0X0wnIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gQWx0X1InIFxcXG4iCi0iCQkJLWUgJ2tleWNvZGUgYW55ID0gTWV0YV9MJyBcXFxuIgotIgkJCS1lICdjbGVhciBNb2QxJyBcXFxuIgotIgkJCS1lICdhZGQgTW9kMSA9IEFsdF9MIEFsdF9SIE1ldGFfTCc7XG4iCi0iCQkjIHRoaXMgaXMgdG8gd29ya2Fyb3VuZCBhIGJ1ZyB3aXRoIEpEUyBTb2xhcmlzIDEwIGdub21lLXNlc3Npb24tZGFlbW9uLlxuIgotIgkJaWYgdW5hbWUgfCBncmVwIFN1bk9TID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQkJZm9yIHN5bSBpbiBTdW5BdWRpb011dGUgU3VuQXVkaW9Mb3dlclZvbHVtZSBTdW5BdWRpb1JhaXNlVm9sdW1lXG4iCi0iCQkJZG9cbiIKLSIJCQkJaWYgJGhhdmVfeG1vZG1hcCAtcGsgfCBncmVwIC13ICRzeW0gPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQkJCTpcbiIKLSIJCQkJZWxzZVxuIgotIgkJCQkJJGhhdmVfeG1vZG1hcCAtZSBcImtleWNvZGUgYW55ID0gJHN5bVwiXG4iCi0iCQkJCWZpXG4iCi0iCQkJZG9uZVxuIgotIgkJZmlcbiIKLSIJICAgICkgMT4mMiAmXG4iCi0iCWZpXG4iCi0ifVxuIgotIlxuIgotInRyeV9YdmZiKCkge1xuIgotIglpZiBbIFwiWCRoYXZlX1h2ZmJcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCW1pc3NpbmdfbWVzZyBYdmZiXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSJcbiIKLSIJc2FyZz1cIi1zY3JlZW5cIlxuIgotIglpZiB1bmFtZSB8IGdyZXAgU3VuT1MgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCWlmIGdyZXAgL3Vzci9vcGVud2luL2Jpbi9Yc3VuICRoYXZlX1h2ZmIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQlzYXJnPVwic2NyZWVuXCJcbiIKLSIJCWZpXG4iCi0iCWZpXG4iCi0iCW1hcmdzPVwiXCJcbiIKLSIJaWYgJGhhdmVfWHZmYiAtaGVscCAyPiYxIHwgZ3JlcCAnXlxcK2tiWyAJXS4qS2V5Ym9hcmQgRXh0ZW5zaW9uJyA+L2Rldi9udWxsOyB0aGVuXG4iCi0iCQltYXJncz1cIitrYlwiXG4iCi0iCWZpXG4iCi0iXG4iCi0iCSMgY3VycmVudGx5IG5vdCBlbmFibGVkIGluIFh2ZmIncyB3ZSBzZWUuXG4iCi0iIwlpZiAkaGF2ZV9YdmZiIC1leHRlbnNpb24gTU9PTU9PIDI+JjEgfCBncmVwIC13IFJBTkRSID4vZGV2L251bGw7IHRoZW5cbiIKLSIjCQltYXJncz1cIiRtYXJncyArZXh0ZW5zaW9uIFJBTkRSXCJcbiIKLSIjCWZpXG4iCi0iXG4iCi0iCWlmIFsgJGRlcHRoIC1nZSAxNiBdOyB0aGVuXG4iCi0iCQkjIGF2b2lkIERpcmVjdENvbG9yIGZvciBkZWZhdWx0IHZpc3VhbDpcbiIKLSIJCW1hcmdzPVwiJG1hcmdzIC1jYyA0XCJcbiIKLSIJZmlcbiIKLSIJc2VydmVyICRoYXZlX1h2ZmIgOiROICRzYXJnIDAgJHtnZW9tfXgke2RlcHRofSAkbWFyZ3NcbiIKLSJcbiIKLSIJaWYgWyBcIlgkcmVzdWx0XCIgPSBcIlgxXCIgLWEgXCJYJGhhdmVfeG1vZG1hcFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWFkZF9tb2RtYXBcbiIKLSIJZmlcbiIKLSJ9XG4iCi0iXG4iCi0idHJ5X1hkdW1teSgpIHtcbiIKLSIJaWYgWyBcIlgkaGF2ZV9YZHVtbXlcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCW1pc3NpbmdfbWVzZyBYZHVtbXlcbiIKLSIJCXJldHVyblxuIgotIglmaVxuIgotIglpZiBbIFwiWCRGRF9YRFVNTVlfUlVOX0FTX1JPT1RcIiAhPSBcIlhcIiAtYSBcIlgkaGF2ZV9yb290XCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlyZXR1cm5cbiIKLSIJZmlcbiIKLSJcbiIKLSIJc2VydmVyICRoYXZlX1hkdW1teSA6JE4gLWdlb21ldHJ5ICRnZW9tIC1kZXB0aCAkZGVwdGhcbiIKLSIJXG4iCi0iCWlmIFsgXCJYJHJlc3VsdFwiID0gXCJYMVwiIC1hIFwiWCRoYXZlX3hwcm9wXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJKHNsZWVwIDE7ICRoYXZlX3hwcm9wIC1kaXNwbGF5IDokTiAtcm9vdCAtZiBYMTFWTkNfVFJBUF9YUkFORFIgOHMgLXNldCBYMTFWTkNfVFJBUF9YUkFORFIgMSA+L2Rldi9udWxsIDI+JjEpICZcbiIKLSIJCXNsZWVwIDFcbiIKLSIJZmlcbiIKLSJ9XG4iCi0iXG4iCi0iXG4iCi0iY29va2llKCkge1xuIgotIgljb29raWU9XCJcIlxuIgotIglpZiBbIFwiWCRoYXZlX21jb29raWVcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQljb29raWU9YG1jb29raWVgXG4iCi0iCWVsaWYgWyBcIlgkaGF2ZV9tZDVzdW1cIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlpZiBbIC1jIC9kZXYvdXJhbmRvbSBdOyB0aGVuXG4iCi0iCQkJY29va2llPWBkZCBpZj0vZGV2L3VyYW5kb20gY291bnQ9MzIgMj4vZGV2L251bGwgfCBtZDVzdW0gfCBhd2sgJ3twcmludCAkMX0nYFxuIgotIgkJZWxpZiBbIC1jIC9kZXYvcmFuZG9tIF07IHRoZW5cbiIKLSIJCQljb29raWU9YGRkIGlmPS9kZXYvcmFuZG9tIGNvdW50PTMyIDI+L2Rldi9udWxsIHwgbWQ1c3VtIHwgYXdrICd7cHJpbnQgJDF9J2BcbiIKLSIJCWZpXG4iCi0iCQlpZiBbIFwiWCRjb29raWVcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCQlyPWByYW5kb21gXG4iCi0iCQkJY29va2llPWAoZWNobyAkcjsgZGF0ZTsgdXB0aW1lOyBwcyAtZWFsZiAyPiYxKSB8IG1kNXN1bSB8IGF3ayAne3ByaW50ICQxfSdgXG4iCi0iCQlmaVxuIgotIgllbGlmIFsgXCJYJGhhdmVfeGF1dGhcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlpZiB1bmFtZSB8IGdyZXAgU3VuT1MgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQljb29raWU9YCRoYXZlX3hhdXRoIGxpc3QgfCBhd2sgJ3twcmludCAkTkZ9JyB8IHRhaWwgLTFgXG4iCi0iCQllbHNlXG4iCi0iCQkJY29va2llPWAkaGF2ZV94YXV0aCBsaXN0IHwgYXdrICd7cHJpbnQgJE5GfScgfCB0YWlsIC1uIDFgXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIglpZiBbIFwiWCRjb29raWVcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCSMgb2ggd2VsbC4uXG4iCi0iCQlmb3IgayBpbiAxIDIgMyA0XG4iCi0iCQlkb1xuIgotIgkJCXI9YHJhbmRvbWBcbiIKLSIJCQljb29raWU9JGNvb2tpZWBwcmludGYgXCIlMDh4XCIgXCIke3J9JCRcImBcbiIKLSIJCWRvbmVcbiIKLSIJZmlcbiIKLSIJZWNobyBcIiRjb29raWVcIlxuIgotIn1cbiIKLSJcbiIKLSJhdXRoKCkge1xuIgotIglpZiBbIFwiWCRoYXZlX3hhdXRoXCIgPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlleGl0IDFcbiIKLSIJZmlcbiIKLSIJdG1wPS90bXAvLnhhcyQkYHJhbmRvbWBcbiIKLSIJdG1wPWBteXRtcCBcIiR0bXBcImBcbiIKLSIJdG91Y2ggJHRtcFxuIgotIgljaG1vZCA2MDAgJHRtcCB8fCBleGl0IDFcbiIKLSIJaWYgWyAhIC1mICR0bXAgXTsgdGhlblxuIgotIgkJZXhpdCAxXG4iCi0iCWZpXG4iCi0iCWNvb2s9YGNvb2tpZWBcbiIKLSIJJGhhdmVfeGF1dGggLWYgJHRtcCBhZGQgOiROIC4gJGNvb2sgIDE+JjJcbiIKLSIJJGhhdmVfeGF1dGggLWYgJHRtcCBhZGQgYGhvc3RuYW1lYDokTiAuICRjb29rICAxPiYyXG4iCi0iCWlmIFsgXCJYJENSRUFURV9ESVNQTEFZX0VYRUNcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlscyAtbCAkdG1wIDE+JjJcbiIKLSIJCSRoYXZlX3hhdXRoIC1mICR0bXAgbGlzdCAxPiYyXG4iCi0iCWZpXG4iCi0iCWVjaG8gXCIkdG1wXCJcbiIKLSJ9XG4iCi0iXG4iCi0iZnJlZXBvcnQoKSB7XG4iCi0iCWJhc2U9JDFcbiIKLSIJaWYgWyBcIlgkaGF2ZV91bmFtZVwiICE9IFwiWFwiIC1hIFwiWCRoYXZlX25ldHN0YXRcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQlpbnVzZT1cIlwiXG4iCi0iCQlpZiAkaGF2ZV91bmFtZSB8IGdyZXAgTGludXggPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQlpbnVzZT1gJGhhdmVfbmV0c3RhdCAtYW50IHwgZWdyZXAgJ0xJU1RFTnxXQUlUfEVTVEFCTElTSHxDTE9TRScgfCBhd2sgJ3twcmludCAkNH0nIHwgc2VkICdzL14uKjovLydgXG4iCi0iCQllbGlmICRoYXZlX3VuYW1lIHwgZ3JlcCBTdW5PUyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCWludXNlPWAkaGF2ZV9uZXRzdGF0IC1hbiAtZiBpbmV0IC1QIHRjcCB8IGdyZXAgTElTVEVOIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNlZCAncy9eLipcXC4vLydgXG4iCi0iCQllbGlmICRoYXZlX3VuYW1lIHwgZ3JlcCAtaSBic2QgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQlpbnVzZT1gJGhhdmVfbmV0c3RhdCAtYW50IC1mIGluZXQgfCBncmVwIExJU1RFTiB8IGF3ayAne3ByaW50ICQ0fScgfCBzZWQgJ3MvXi4qXFwuLy8nYFxuIgotIgkJIyBhZGQgb3RoZXJzLi4uXG4iCi0iCQlmaVxuIgotIglmaVxuIgotIglpPTBcbiIKLSIJb2s9XCJcIlxuIgotIgl3aGlsZSBbICRpIC1sdCA1MDAgXVxuIgotIglkb1xuIgotIgkJdHJ5cD1gZXhwciAkYmFzZSArICRpYFxuIgotIgkJaWYgZWNobyBcIiRpbnVzZVwiIHwgZ3JlcCAtdyBcIiR0cnlwXCIgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCQk6XG4iCi0iCQllbGlmIGVjaG8gXCIkcGFsbG9jXCIgfCB0ciAnICcgJ1xcbicgfCBncmVwIC13IFwiJHRyeXBcIiA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJCTpcbiIKLSIJCWVsc2VcbiIKLSIJCQlvaz0kdHJ5cFxuIgotIgkJCWJyZWFrXG4iCi0iCQlmaVxuIgotIgkJaT1gZXhwciAkaSArIDFgXG4iCi0iCWRvbmVcbiIKLSIJaWYgWyBcIlgkb2tcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQliYXNlPSRva1xuIgotIglmaVxuIgotIglpZiBbIFwiWCRwYWxsb2NcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJCXBhbGxvYz1cIiRiYXNlXCJcbiIKLSIJZWxzZVxuIgotIgkJcGFsbG9jPVwiJHBhbGxvYyAkYmFzZVwiXG4iCi0iCWZpXG4iCi0iCWVjaG8gXCIkYmFzZVwiXG4iCi0ifVxuIgotIlxuIgotIlxuIgotImRlcHRoMD0yNFxuIgotImdlb20wPTEyODB4MTAyNFxuIgotImRlcHRoPSR7ZGVwdGg6LTI0fVxuIgotImdlb209JHtnZW9tOi0xMjgweDEwMjR9XG4iCi0iXG4iCi0ibm9saXN0ZW49JHtGRF9OT0xJU1RFTjotXCItbm9saXN0ZW4gdGNwXCJ9XG4iCi0iXG4iCi0iaWYgWyBcIlgkWDExVk5DX0NSRUFURV9HRU9NXCIgIT0gXCJYXCIgLWEgXCJYJEZEX0dFT01cIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJRkRfR0VPTT0kWDExVk5DX0NSRUFURV9HRU9NXG4iCi0iZmlcbiIKLSJcbiIKLSJpZiBbIFwiWCRGRF9HRU9NXCIgIT0gXCJYXCIgLWEgXCJYJEZEX0dFT01cIiAhPSBcIlhOT05FXCIgXTsgdGhlblxuIgotIgl4MT1gZWNobyBcIiRGRF9HRU9NXCIgfCBhd2sgLUZ4ICd7cHJpbnQgJDF9J2BcbiIKLSIJeTE9YGVjaG8gXCIkRkRfR0VPTVwiIHwgYXdrIC1GeCAne3ByaW50ICQyfSdgXG4iCi0iCWQxPWBlY2hvIFwiJEZEX0dFT01cIiB8IGF3ayAtRnggJ3twcmludCAkM30nYFxuIgotIglpZiBbIFwiWCR4MVwiICE9IFwiWFwiIC1hIFwiWCR5MVwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWdlb209XCIke3gxfXgke3kxfVwiXG4iCi0iCWZpXG4iCi0iCWlmIFsgXCJYJGQxXCIgIT0gXCJYXCIgXTsgdGhlblxuIgotIgkJZGVwdGg9XCIke2QxfVwiXG4iCi0iCWZpXG4iCi0iZmlcbiIKLSJcbiIKLSJkZXB0aD1gZWNobyBcIiRkZXB0aFwiIHwgaGVhZCAtbiAxYFxuIgotImdlb209YGVjaG8gXCIkZ2VvbVwiIHwgaGVhZCAtbiAxYFxuIgotIlxuIgotImlmIGVjaG8gXCIkZGVwdGhcIiB8IGdyZXAgJ15bMC05XVswLTldKiQnID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCTpcbiIKLSJlbHNlXG4iCi0iCWRlcHRoPSRkZXB0aDBcbiIKLSJmaVxuIgotImlmIGVjaG8gXCIkZ2VvbVwiIHwgZ3JlcCAnXlswLTldWzAtOV0qeFswLTldWzAtOV0qJCcgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJOlxuIgotImVsc2VcbiIKLSIJZ2VvbT0kZ2VvbTBcbiIKLSJmaVxuIgotIlxuIgotImlmIFsgXCJYJFVTRVJcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJVVNFUj0kTE9HTkFNRVxuIgotImZpXG4iCi0iaWYgWyBcIlgkVVNFUlwiID0gXCJYXCIgXTsgdGhlblxuIgotIglVU0VSPWB3aG9hbWlgXG4iCi0iZmlcbiIKLSJcbiIKLSIjIFNldCBQQVRIIHRvIGhhdmUgYSBiZXR0ZXIgY2hhbmNlIG9mIGZpbmRpbmcgdGhpbmdzOlxuIgotIlNBVkVfUEFUSD0kUEFUSFxuIgotIlBBVEg9JFBBVEg6L3Vzci9YMTFSNi9iaW46L3Vzci9iaW4vWDExOi91c3Ivb3Blbndpbi9iaW46L3Vzci9kdC9iaW46L29wdC9rZGU0L2Jpbjovb3B0L2tkZTMvYmluOi9vcHQvZ25vbWUvYmluOi91c3IvYmluOi9iaW46L3Vzci9zZncvYmluOi91c3IvbG9jYWwvYmluXG4iCi0iXG4iCi0iaGF2ZV9yb290PVwiXCJcbiIKLSJpZDA9YGlkYFxuIgotImlmIGlkIHwgc2VkIC1lICdzLyBnaWQuKiQvLycgfCBncmVwIC13IHJvb3QgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJaGF2ZV9yb290PVwiMVwiXG4iCi0iZmlcbiIKLSJcbiIKLSJwX29rPTBcbiIKLSJpZiBbIFwiYHR5cGUgLXAgL2Jpbi9zaGBcIiA9IFwiL2Jpbi9zaFwiIF07IHRoZW5cbiIKLSIJcF9vaz0xXG4iCi0iZmlcbiIKLSJcbiIKLSJmb3IgcHJvZyBpbiBzdGFydHggeGluaXQgeGRtIGdkbSBrZG0geHRlcm0gWGR1bW15IFh2ZmIgWHZuYyB4YXV0aCB4ZHB5aW5mbyBtY29va2llIG1kNXN1bSB4bW9kbWFwIHN0YXJ0a2RlIHN0YXJ0bHhkZSBkYnVzLWxhdW5jaCBnbm9tZS1zZXNzaW9uIGJsYWNrYm94IGZ2d20yIG13bSBvcGVuYm94IHR3bSB3aW5kb3dtYWtlciB3bWFrZXIgZW5saWdodGVubWVudCBtZXRhY2l0eSBYIFhvcmcgWEZyZWU4NiBYc3VuIFhzZXNzaW9uIGR0d20gbmV0c3RhdCBub2h1cCBlc2Rkc3Aga29uc29sZSBnbm9tZS10ZXJtaW5hbCB4LXRlcm1pbmFsLWVtdWxhdG9yIHBlcmwgc3RhcnR4ZmNlNCBzdGFydHhmY2UgeHByb3BcbiIKLSJkb1xuIgotIglwMj1gZWNobyBcIiRwcm9nXCIgfCBzZWQgLWUgJ3MvLS9fL2cnYFxuIgotIglldmFsIFwiaGF2ZV8kcDI9JydcIlxuIgotIglpZiB0eXBlICRwcm9nID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCWJwYXRoPWB3aGljaCAkcHJvZyB8IGF3ayAne3ByaW50ICRORn0nYFxuIgotIgkJaWYgWyAhIC14IFwiJGJwYXRoXCIgLW8gLWQgXCIkYnBhdGhcIiBdOyB0aGVuXG4iCi0iCQkJaWYgWyBcIlgkcF9va1wiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCQkJYnBhdGg9YHR5cGUgLXAgJHByb2cgfCBhd2sgJ3twcmludCAkTkZ9J2BcbiIKLSIJCQlmaVxuIgotIgkJCWlmIFsgISAteCBcIiRicGF0aFwiIC1vIC1kIFwiJGJwYXRoXCIgXTsgdGhlblxuIgotIgkJCQlicGF0aD1gdHlwZSAkcHJvZyB8IGF3ayAne3ByaW50ICRORn0nYFxuIgotIgkJCWZpXG4iCi0iCQlmaVxuIgotIgkJZXZhbCBcImhhdmVfJHAyPSRicGF0aFwiXG4iCi0iCWZpXG4iCi0iZG9uZVxuIgotImlmIFsgXCJYJGhhdmVfeHRlcm1cIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJaWYgWyBcIlgkaGF2ZV9nbm9tZV90ZXJtaW5hbFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWhhdmVfeHRlcm09JGhhdmVfZ25vbWVfdGVybWluYWxcbiIKLSIJZWxpZiBbIFwiWCRoYXZlX2tvbnNvbGVcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQloYXZlX3h0ZXJtPSRoYXZlX2tvbnNvbGVcbiIKLSIJZWxpZiBbIFwiWCRoYXZlX3hfdGVybWluYWxfZW11bGF0b3JcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQloYXZlX3h0ZXJtPSRoYXZlX3hfdGVybWluYWxfZW11bGF0b3JcbiIKLSIJZmlcbiIKLSJmaVxuIgotIlxuIgotImlmIFsgXCJYJGhhdmVfbm9odXBcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJaGF2ZV9ub2h1cD1cIm5vaHVwXCJcbiIKLSJmaVxuIgotIlxuIgotIk49YGZpbmRmcmVlYFxuIgotIlxuIgotImlmIFsgXCJYJE5cIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJZXhpdCAxXG4iCi0iZmlcbiIKLSJlY2hvIFwidHJ5aW5nIE49JE4gLi4uXCIgMT4mMlxuIgotIlxuIgotImlmIFsgXCJYJENSRUFURV9ESVNQTEFZX09VVFBVVFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJc2V0IHwgZ3JlcCBcIl5oYXZlX1wiIDE+JjJcbiIKLSJmaVxuIgotIlxuIgotIlRSWT1cIiQxXCJcbiIKLSJpZiBbIFwiWCRUUllcIiA9IFwiWFwiIF07IHRoZW5cbiIKLSIJVFJZPVh2ZmIsWGR1bW15XG4iCi0iZmlcbiIKLSJcbiIKLSJmb3IgY3Vycl90cnkgaW4gYGVjaG8gXCIkVFJZXCIgfCB0ciAnLCcgJyAnYFxuIgotImRvXG4iCi0iCXJlc3VsdD0wXG4iCi0iCXVzZV94ZG1jcF9xdWVyeT0wXG4iCi0iCWlmIGVjaG8gXCIkY3Vycl90cnlcIiB8IGVncmVwICdbKy4tXXhkbWNwJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJdXNlX3hkbWNwX3F1ZXJ5PTFcbiIKLSIJZmlcbiIKLSJcbiIKLSIJaWYgWyBcIlgkWDExVk5DX1hETV9PTkxZXCIgPSBcIlgxXCIgLWEgXCJYJHVzZV94ZG1jcF9xdWVyeVwiID0gXCJYMFwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJTS0lQUElORyBOT04tWERNQ1AgaXRlbSAnJGN1cnJfdHJ5JyBpbiBYMTFWTkNfWERNX09OTFk9MSBtb2RlLlwiIDE+JjJcbiIKLSIJCWNvbnRpbnVlXG4iCi0iCWZpXG4iCi0iCVxuIgotIgljdXJyX3RyeT1gZWNobyBcIiRjdXJyX3RyeVwiIHwgc2VkIC1lICAncy9bKy4tXXhkbWNwLy8nYFxuIgotIgljdXJyX3RyeT1gZWNobyBcIiRjdXJyX3RyeVwiIHwgc2VkIC1lICAncy9bKy4tXXJlZGlyZWN0Ly8nYFxuIgotIlxuIgotIglpZiBlY2hvIFwiJGN1cnJfdHJ5XCIgICB8IGdyZXAgLWkgJ15YZHVtbXlcXD4nID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQl0cnlfWGR1bW15XG4iCi0iCWVsaWYgZWNobyBcIiRjdXJyX3RyeVwiIHwgZ3JlcCAtaSAnXlhkdW1teSQnICA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJdHJ5X1hkdW1teVxuIgotIgllbGlmIGVjaG8gXCIkY3Vycl90cnlcIiB8IGdyZXAgLWkgJ15YdmZiXFw+JyAgID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQl0cnlfWHZmYlxuIgotIgllbGlmIGVjaG8gXCIkY3Vycl90cnlcIiB8IGdyZXAgLWkgJ15YdmZiJCcgICAgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCXRyeV9YdmZiXG4iCi0iCWVsaWYgZWNobyBcIiRjdXJyX3RyeVwiIHwgZ3JlcCAtaSAnXlh2bmNcXD4nICAgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCXRyeV9Ydm5jXG4iCi0iCWVsaWYgZWNobyBcIiRjdXJyX3RyeVwiIHwgZ3JlcCAtaSAnXlh2bmMkJyAgICA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJdHJ5X1h2bmNcbiIKLSIJZWxpZiBlY2hvIFwiJGN1cnJfdHJ5XCIgfCBncmVwIC1pICdeWHNydlxcPicgICA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJdHJ5X1hzcnZcbiIKLSIJZWxpZiBlY2hvIFwiJGN1cnJfdHJ5XCIgfCBncmVwIC1pICdeWHNydiQnICAgID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQl0cnlfWHNydlxuIgotIgllbGlmIGVjaG8gXCIkY3Vycl90cnlcIiB8IGdyZXAgLWkgJ15YXFw+JyAgICAgID4gL2Rldi9udWxsOyB0aGVuXG4iCi0iCQl0cnlfWFxuIgotIgllbGlmIGVjaG8gXCIkY3Vycl90cnlcIiB8IGdyZXAgLWkgJ15YJCcgICAgICAgPiAvZGV2L251bGw7IHRoZW5cbiIKLSIJCXRyeV9YXG4iCi0iCWZpXG4iCi0iCWlmIFsgXCJYJHJlc3VsdFwiID0gXCJYMVwiIF07IHRoZW5cbiIKLSIJCWVjaG8gXCJESVNQTEFZPTokTlwiXG4iCi0iCQkkaGF2ZV94YXV0aCAtZiAkYXV0aGZpbGUgZXh0cmFjdCAtIDokTlxuIgotIgkJaWYgWyBcIlgkRkRfRVhUUkFcIiAhPSBcIlhcIiBdOyB0aGVuXG4iCi0iCQkJJGhhdmVfbm9odXAgZW52IERJU1BMQVk9OiROIHNoIC1jIFwiKHNsZWVwIDI7ICRGRF9FWFRSQSkgJlwiIDE+JjIgJlxuIgotIgkJZmlcbiIKLSIJCWV4aXQgMFxuIgotIglmaVxuIgotImRvbmVcbiIKLSJcbiIKLSJleGl0IDFcbiIKLTsKLQotY2hhciBtYWNvc3hfc29saWRfYmFja2dyb3VuZFtdID0gCi0iIyEvYmluL3NoXG4iCi0iXG4iCi0iI3NldCAteHZcbiIKLSJcbiIKLSIjIFRoaXMgaXMgd2hlcmUgdGhlIHVzZXIncyBzY3JlZW4vc2xpZGUgc2F2ZXJzIGFyZSBzdG9yZWQ6XG4iCi0iI1xuIgotIlNTX0RJUj1cIiRIT01FL0xpYnJhcnkvU2NyZWVuIFNhdmVyc1wiXG4iCi0iXG4iCi0iaWYgWyAhIC1kIFwiJFNTX0RJUlwiIF07IHRoZW5cbiIKLSIJZXhpdFxuIgotImZpXG4iCi0iXG4iCi0iUEFUSD0vYmluOi91c3IvYmluOiRQQVRIOyBleHBvcnQgUEFUSFxuIgotIlxuIgotIiMgQ2hlY2sgdG8gc2VlIGlmIG91ciB0YXJiYWxsIGhhcyBhbHJlYWR5IGJlZW4gdW5wYWNrZWQuICBJZiBpdCBoYXMgYmVlblxuIgotIiMgd2UgZG9uJ3QgdW5wYWNrIGl0IGFnYWluLiAgVGhpcyBsZXRzIHRoZSB1c2VyIG92ZXJ3cml0ZSB0aGUgcG5nIHdpdGhcbiIKLSIjIGEgZGlmZmVyZW50IGNvbG9yIGlmIHRoZXkgd2FudC4gIEF0IHNvbWUgcG9pbnQgd2UgY291bGQgdHJ5IHRvIGNyZWF0ZVxuIgotIiMgb3Igb3duIFBQTSBmaWxlIG9yIHNvbWV0aGluZyBvbiB0aGUgZmx5Li4uXG4iCi0iI1xuIgotInRlc3RfZmlsZT1cIiRTU19ESVIvVm5jU29saWRDb2xvci5zbGlkZVNhdmVyL0NvbnRlbnRzL1Jlc291cmNlcy9WbmNTb2xpZENvbG9yMDEucG5nXCJcbiIKLSJpZiBbICEgLWYgXCIkdGVzdF9maWxlXCIgXTsgdGhlblxuIgotIgkjIGdldCB0aGUgbGluZSBudW1iZXIgdGhlIHRhcmJhbGwgZGF0YSBzdGFydHMgYXQ6XG4iCi0iCU49YGdyZXAgLW4gXnZvaWRfZnVuYyBcIiQwXCIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9JyB8IGhlYWQgLW4gMWBcbiIKLSIJaWYgZWNobyBcIiROXCIgfCBncmVwICdeWzAtOV1bMC05XSokJyA+IC9kZXYvbnVsbDsgdGhlblxuIgotIgkJOlxuIgotIgllbHNlXG4iCi0iCQlleGl0XG4iCi0iCWZpXG4iCi0iCU49YGV4cHIgJE4gKyAxYFxuIgotIlxuIgotIgkjIHBpcGUgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgdGhyb3VnaCB1dWRlY29kZSBhbmQgdGFyOlxuIgotIgl0YWlsIC1uICskTiBcIiQwXCIgfCAoY2QgXCIkU1NfRElSXCIgfHwgZXhpdCAxOyB1dWRlY29kZSAtbyAvZGV2L3N0ZG91dCB8IHRhciB4emYgLSlcbiIKLSJmaVxuIgotImlmIFsgISAtZiBcIiR0ZXN0X2ZpbGVcIiBdOyB0aGVuXG4iCi0iCSMgc29tZSBwcm9ibGVtIHVucGFja2luZy4uLlxuIgotIglleGl0XG4iCi0iZmlcbiIKLSJcbiIKLSIjIG9uIGV4aXQgb3IgaW50ZXJydXB0LCB3ZSBraWxsIHRoZSBzY3JlZW4gc2F2ZXIgd2Ugc3RhcnRlZDpcbiIKLSIjXG4iCi0idHJhcCAna2lsbCAtQ09OVCAkU1NfUElEID4vZGV2L251bGwgMj4mMTsga2lsbCAtVEVSTSAkU1NfUElEID4vZGV2L251bGwgMj4mMScgMCAyIDE1XG4iCi0iU1NfUElEPTk5OTk5OTlcbiIKLSJcbiIKLSIjIHN0YXJ0IHRoZSBzY3JlZW5zYXZlciBhbmQgcmVjb3JkIGl0cyBwaWQ6XG4iCi0iI1xuIgotIi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1NjcmVlblNhdmVyLmZyYW1ld29yay9SZXNvdXJjZXMvU2NyZWVuU2F2ZXJFbmdpbmUuYXBwL0NvbnRlbnRzL01hY09TL1NjcmVlblNhdmVyRW5naW5lIC1iYWNrZ3JvdW5kIC1tb2R1bGUgVm5jU29saWRDb2xvciAmXG4iCi0iU1NfUElEPSQhXG4iCi0iXG4iCi0iIyB3YWl0IGEgYml0IGZvciBpdCB0byBnZXQgc3RhcnRlZC4uLlxuIgotIiNcbiIKLSJzbGVlcCAxMFxuIgotIlxuIgotIiMgbG9vcCBmb3JldmVyIHdhaXRpbmcgZm9yIHNvbWUgY2hhbmdlOlxuIgotIiNcbiIKLSJ3aGlsZSBbIDEgXVxuIgotImRvXG4iCi0iCWlmIGtpbGwgLTAgJFNTX1BJRCA+L2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCTpcbiIKLSIJZWxzZVxuIgotIgkJIyBzY3JlZW4gc2F2ZXIgaXMgZ29uZSwgZXhpdC5cbiIKLSIJCWJyZWFrXG4iCi0iCWZpXG4iCi0iXG4iCi0iCSMgd2Ugc3RvcCB0aGUgc2NyZWVuIHNhdmVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IENQVSB1c2FnZVxuIgotIgkjIChpdCBwYW5zIGV2ZW4gdGhvdWdoIHRoZSBjb2xvciBpcyBzb2xpZClcbiIKLSIJI1xuIgotIglraWxsIC1TVE9QICRTU19QSUQgPi9kZXYvbnVsbCAyPiYxXG4iCi0iXG4iCi0iCSMgY2hlY2sgZXZlcnkgNSBzZWNvbmRzOlxuIgotIglzbGVlcCA1XG4iCi0iXG4iCi0iCWlmIFsgXCJYJFNTX1dBVENIX1BJRFwiICE9IFwiWFwiIF07IHRoZW5cbiIKLSIJCWlmIGtpbGwgLTAgJFNTX1dBVENIX1BJRCA+L2Rldi9udWxsIDI+JjE7IHRoZW5cbiIKLSIJCQk6XG4iCi0iCQllbHNlXG4iCi0iCQkJIyB3YXRjaCBwaWQgKHgxMXZuYykgaXMgZ29uZSwgZXhpdC5cbiIKLSIJCQlicmVha1xuIgotIgkJZmlcbiIKLSIJZmkgXG4iCi0iZG9uZVxuIgotIlxuIgotImV4aXQgMFxuIgotIlxuIgotIiMgVGhpcyBjb250YWlucyB0aGUgZGlyZWN0b3J5IFZuY1NvbGlkQ29sb3Iuc2xpZGVTYXZlciBkaXJlY3RvcnlcbiIKLSIjIHdpdGggYSBzaW5nbGUgcG5nICh3aXRoIHNvbGlkIGNvbG9yKVxuIgotIiNcbiIKLSJ2b2lkX2Z1bmMoKSB7XG4iCi0iYmVnaW4gNjQ0IHZzYy50YXIuZ3pcbiIKLSJNJ1hMKGAkKywjVERgYF5WNzA2XzMyITJgNzE0KiUpITZAQCxARCo5ITIsTkFNQj1WOys5KjRZKFgrMSVNXG4iCi0iTSZOSlRgQicwNk87JF09OlFDM1VJVkEsNSlUI1xcYE0wKz9QIVFXRS03TlEqJ0U/O2A4MjZOJy5cImBdQFxcTFxuIgotIk0lWVozXCIqRUkzMkFUTFIjRkRZUilRXl5dJjxdWzteOVlSMy1VV1c2TEhOX1ooMV8hL1ooO0pSMDROL1UjXG4iCi0iTSEtMSxJTS5KOEtMNVRXKkdbPCFBQyQ1KUU2NjxEM0AxUlhISjxSQlNDVy0oSSFFMShUMihcIllOPjMzWEJcbiIKLSJNIVYrVV5CYEYtJUI2RE9RP10jVSovIUtNMFIjTFA/XUk2PDNAP1Q1NikuO18wPSM/X1Y2T1tPLiFaVDNUXG4iCi0iTTxcXD4oJzpTKDxJK19MOjJGL19BPzRCIS5USihMSlFQMl1fLSVEX0MuXzlePTZGTlhcIiFQPi47WFdGPCpcXFxuIgotIk1GJCskLFdXK1xcPlMpVSYpTT5PUTI6QkhXRkFXM1lITlUmXTQyOkQ8XCJKQlg2OUxNJUUhSDdBJ1AwTiQwMFxuIgotIk1NKUomSkstRU84O2BBQlwiNCpCRjQ2SjhURiFcIiQ1Sk8lJlskNDtfSi02I2AySkokP0QpXCJOU1gqUTw1I0BcbiIKLSJNKzZKRTgpQi5dNlczQDVbKyw2RU5dJEFWQTpTR0JNLiVJRj5ZMVwiLktRLzYjIUwzSGBLJSEuQk8kQ1QkSlxuIgotIk1IQiUsL0U/UjsjXCJWRyE2Wl1TV1osWDMmRDpWVydfO0pNRSxcIkY3JS5ILEAsXCI/JTAlJjwlOk9BNlRSNkhcbiIKLSJNI09VK0U2KjJbOyglTFcrSiNARVsjPCxcIj0pPkI4WzlNRT1eNkEoRSY4Ozg6K2AyXFxKQSZOK1c2NkotPl5cbiIKLSJNUEhNKV5BNkMwN0slSV9WMDEjMSlIVko4Klg5LTpOTyEjTDVcIjE5TS00TS43XzkhVllbP1tcXEYoPilSSFtcbiIKLSJNTUY/MDlLQUNRXCJEQDIyRUEsOzgtRFE0WjQ5MDVWQyY2Jl9WXyxeX0tIL19eT1RgQk9RRjpZLyxLQDtXNFxuIgotIk0/UUc8Vz9cXFNbL1A/ISdPUV9TOTkkPy4hOVdfMiYnVy4/WEAtTT5NX0pgMzI0L10jJTJBK1svUD8hYF5KXG4iCi0iTUU5R0NIVj9CVz8hWF44SlZgLlUmPyFUPkA9Xz88XFw6P1QhUlBcXFctWUNHTFk3L0FbX0BHPCdQRk5XKEBYXG4iCi0iTVtOQileIUtCJ0ZePkBMWFE2S0kuPTtdLjZUOShOJk0tUVVSSS4wVlwiLEdcIlgqXkMnLjwuPFVSXVJPU1hMXG4iCi0iTUcwN0EwWzBcXDVTS1RYTFwiOURRLDcrWjJPUEVBI1VcXEk6T0s6Vl48XFwrLysyJU4qVUcuK0teJl89Tz9GM0ZcbiIKLSJNUSwnKUI9PldXWVFfPl8/PFVMVjFeXStFUzolN1FXWlAtUlgtX1ckOl88Nz04NVZbPV1WKklIPy8vV0teXG4iCi0iTVxcRVdMWUcqSUhDVE1fJ1FPQV9fW1lXXlcmL05cIjNYXCJeXjBfPz8lQTRVKFJcIlRaSkQwL1tDLSpPXyFcXCxXXG4iCi0iTTVfXFw3RkhZSykxMVxcSkIzXSlUN0lJXTI3JzBVWEtVXigyNz5LTT81VjtCV1tLOkE3MjZeP0tQRiNfITFHXG4iCi0iP1wiXCJNQyYwUCZAXFwlQCwhQCwhSC8hOCNgOCMsOz4+MF8yNE8xNWBcIkBgYGBgYFxuIgotImBcbiIKLSJlbmRcbiIKLSJ9XG4iCi07Ci0KLSNlbmRpZiAvKiBfU1NMVE9PTFNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3RreDExdm5jIGIveDExdm5jL3RreDExdm5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODdkNzUzLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy90a3gxMXZuYworKysgL2Rldi9udWxsCkBAIC0xLDczMzUgKzAsMCBAQAotIyEvYmluL3NoCi0jIHRoZSBuZXh0IGxpbmUgcmVzdGFydHMgdXNpbmcgd2lzaC4gXAotZXhlYyB3aXNoICIkMCIgIiRAIgotY2F0Y2gge3JlbmFtZSBzZW5kIHt9fQotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKLSMgIFVTQS4KLQotIwotIyB0a3gxMXZuYyB2MC4yCi0jIFRoaXMgaXMgYSBzaW1wbGUgZnJvbnRlbmQgdG8geDExdm5jLiAgSXQgdXNlcyB0aGUgcmVtb3RlIGNvbnRyb2wKLSMgYW5kIHF1ZXJ5IGZlYXR1cmVzICgtcmVtb3RlLy1xdWVyeSBha2EgLVIvLVEpIHRvIGludGVyYWN0IHdpdGggaXQuIAotIyBJdCBpcyBqdXN0IGEgcXVpY2stbi1kaXJ0eSBoYWNrIChpdCBwYXJzZXMgLWhlbHAgb3V0cHV0LCBldGMpLCBidXQKLSMgaXQgY291bGQgYmUgb2YgdXNlIHBsYXlpbmcgd2l0aCBvciBsZWFybmluZyBhYm91dCB0aGUgKHdheSB0b28pIG1hbnkKLSMgcGFyYW1ldGVycyB4MTF2bmMgaGFzLgotIyAKLSMgSXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCBhIHJ1bm5pbmcgeDExdm5jIChzZWUgdGhlIHgxMXZuYwotIyAtZ3VpIG9wdGlvbiksIG9yIHRvIHNldCB0aGUgcGFyYW1ldGVycyBhbmQgdGhlbiBzdGFydCB1cCB4MTF2bmMuICAKLSMgCi0KLSMKLSMgQmVsb3cgaXMgYSBzaW1wbGUgcGljdHVyZSBvZiBob3cgdGhlIGd1aSBzaG91bGQgYmUgbGFpZCBvdXQgYW5kIGhvdwotIyB0aGUgbWVudXMgc2hvdWxkIGJlIG9yZ2FuaXplZC4gIE1vc3QgbWVudSBpdGVtcyBjb3JyZXNwb25kIHRvIHJlbW90ZQotIyBjb250cm9sIGNvbW1hbmRzLiBBIHRyYWlsaW5nICI6IiBhZnRlciB0aGUgaXRlbSBuYW1lIG1lYW5zIGl0IGlzIGEgc3RyaW5nCi0jIHRvIGJlIHNldCByYXRoZXIgdGhhbiBhIGJvb2xlYW4gdGhhdCBjYW4gYmUgdG9nZ2xlZCAoZS5nLiB0aGUgZW50cnkKLSMgYm94IG11c3QgYmUgdXNlZCkuCi0jCi0jIFNvbWUgdHdlYWsgb3B0aW9ucyBtYXkgYmUgc2V0IGluIHRoZSBwcmVmaXggIj0iIHN0cmluZy4KLSMJQSBtZWFucyBpdCBpcyBhbiAiQWN0aW9uIiAobm90IGEgdHJ1ZSB2YXJpYWJsZSkKLSMJUiBtZWFucyBpdCBpcyBhbiBhY3Rpb24gb25seSB2YWxpZCBpbiByZW1vdGUgbW9kZS4KLSMJUyBtZWFucyBpdCBpcyBhbiBhY3Rpb24gb25seSB2YWxpZCBpbiBzdGFydHVwIG1vZGUuCi0jCVEgbWVhbnMgaXQgaXMgYW4gYWN0aW9uIHdvcnRoIHF1ZXJ5aW5nIGFmdGVyIHJ1bm5pbmcuCi0jCVAgbWVhbnMgdGhlIHN0cmluZyBjYW4gYmUgKy8tIGFwcGVuZGVkL2RlbGV0ZWQgKHN0cmluZyBtYXkgbm90Ci0jICAgICAgICAgYmUgdGhlIHNhbWUgYWZ0ZXIgdGhlIHJlbW90ZSBjb21tYW5kKQotIwlHIG1lYW5zIGd1aSBpbnRlcm5hbCBpdGVtCi0jCUYgbWVhbnMgY2FuIGJlIHNldCB2aWEgZmlsZSBicm93c2UKLSMJRCBtZWFucyBmb3Igc2ltcGxlIGd1aQotIwktQzp2YWwxLC4uLiBtZWFucyBpdCB3aWxsIGJlIGEgY2hlY2tib3ggKHJhZGlvIGJ1dHRvbikKLSMJICAgdGhlICItIiBtZWFucyBubyBvdGhlciBvcHRpb25zIGZvbGxvdwotIwkwIG1lYW5zIHRvIHNraXAgdGhlIGl0ZW0uCi0jCS0tIG1lYW5zIGFkZCBhIHNlcGFyYXRvcgotIwotIyAgICAgICBUaGUgPUdBTCAuLi4gPUdBTCBMT0ZGIHN0dWZmIGlzIHRvIHByb3ZpZGUgc3VibWVudXMuCi0jCi0KLWdsb2JhbCBlbnYgc3RhcnRlZCB0aW1lX2NvdW50Ci1zZXQgc3RhcnRlZCAiIgotcHJvYyBkdGltZSB7e21zZyAiIn19IHsKLQlnbG9iYWwgc3RhcnRlZCB0aW1lX2NvdW50Ci0JaWYgeyRzdGFydGVkID09ICIifSB7Ci0JCXJldHVybgotCX0KLQlzZXQgZGlmZiBbZXhwciAiW2V4ZWMgZ3RvZC5iaW5dIC0gJHN0YXJ0ZWQiXQotCXNldCBkaWZmIFtmb3JtYXQgIiUuMmYiICRkaWZmXQotCWluY3IgdGltZV9jb3VudAotCWlmIHskbXNnID09ICIifSB7Ci0JCXNldCBtc2cgJHRpbWVfY291bnQKLQl9Ci0JcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAiJG1zZyAkZGlmZiAiIAotCXB1dHMgc3RkZXJyIFtjbG9jayBmb3JtYXQgW2Nsb2NrIHNlY29uZHNdXQotfQotCi1pZiBbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfVElNRSldIHsKLQlnbG9iYWwgc3RhcnRlZCB0aW1lX2NvdW50Ci0Jc2V0IHN0YXJ0ZWQgW2V4ZWMgZ3RvZC5iaW5dCi0Jc2V0IHRpbWVfY291bnQgMAotCWR0aW1lICJTIgotfQotCi1wcm9jIHNldF90ZW1wbGF0ZSB7fSB7Ci0JZ2xvYmFsIHRlbXBsYXRlCi0Jc2V0IHRlbXBsYXRlICIKLVJvdzogQWN0aW9ucyAgIENsaWVudHMgICBQZXJtaXNzaW9ucyAgS2V5Ym9hcmQgICAgUG9pbnRlciAgSGVscAotUm93OiBEaXNwbGF5cyAgU2NyZWVuICAgIFR1bmluZyAgICAgICBEZWJ1Z2dpbmcgICBNaXNjCi0KLUFjdGlvbnMKLQk9U0Egc3RhcnQKLQk9UkEgc3RvcAotCS0tCi0JPURTQSBhdHRhY2gKLQk9RFJBIGRldGFjaAotCS0tCi0JPVJBIHBpbmcKLQk9UkEgdXBkYXRlLWFsbAotCT1HQUwgU2V0dGluZ3M6OgotCT1HQSBzYXZlLXNldHRpbmdzCi0JPVNGQSBsb2FkLXNldHRpbmdzOgotCT1TQSBkZWZhdWx0cy1hbGwKLQk9MFNBIGNsZWFyLWFsbAotCS0tCi0JPUYgcmM6Ci0Jbm9yYwotCT1HQUwgTE9GRgotCS0tIEQKLQk9RFJBIHN0b3ArcXVpdCAKLQk9REdBIFF1aXQgCi0KLUhlbHAKLQk9REdBIGd1aQotCT1ER0EgYWxsCi0KLUNsaWVudHMKLQk9RFJRQSBjdXJyZW50OgotCT1ERiAgIGNvbm5lY3Q6Ci0JPURSUUEgZGlzY29ubmVjdDoKLQktLQotCWFjY2VwdDoKLQlhZnRlcmFjY2VwdDoKLQlnb25lOgotCXZuY2Nvbm5lY3QKLQl6ZXJvY29uZgotCS0tIEQKLQl0aWdodGZpbGV4ZmVyCi0JdWx0cmFmaWxleGZlcgotCXByb3h5OgotCT1HQUwgQ2hhdDo6Ci0JY2hhdHdpbmRvdwotCT1EUkEgY2hhdG9uCi0JPURSQSBjaGF0b2ZmCi0JPUdBTCBMT0ZGCi0JPUdBTCBKYXZhLWFwcGxldDo6Ci0JPUQgaHR0cAotCWh0dHBkaXI6Ci0JaHR0cHBvcnQ6Ci0JaHR0cHM6Ci0JaHR0cHNyZWRpcjoKLQllbmFibGVodHRwcHJveHkKLQk9R0FMIExPRkYKLQotRGlzcGxheXMKLQk9RCBkaXNwbGF5OgotCT1GIGF1dGg6Ci0JPVMgcmVmbGVjdDoKLQk9RCBkZXNrdG9wOgotCT1EIHJmYnBvcnQ6Ci0JPVMgYXV0b3BvcnQ6Ci0JPTAgZ3VpOgotCi1TY3JlZW4KLQk9RFJBIHJlZnJlc2gKLQk9UkEgcmVzZXQKLQk9UkEgYmxhY2tlbgotCS0tIEQKLQk9RCBzY2FsZToKLQlzY2FsZV9jdXJzb3I6Ci0JLS0KLQk9RCBzb2xpZAotCXNvbGlkX2NvbG9yOgotCS0tCi0JPUdBTCBPdmVybGF5VmlzdWFsczo6Ci0Jb3ZlcmxheQotCW92ZXJsYXlfbm9jdXJzb3IKLQk4dG8yNAotCTh0bzI0X29wdHM6Ci0JPUdBTCBMT0ZGCi0JPUdBTCA4LUJpdC1Db2xvcjo6Ci0JZmxhc2hjbWFwCi0Jc2hpZnRjbWFwOgotCW5vdHJ1ZWNvbG9yCi0JPUdBTCBMT0ZGCi0JPUdBTCBTdWJXaW5kb3c6OgotCWlkOgotCXNpZDoKLQk9UkEgaWRfY21kOgotCT1HQUwgTE9GRgotCT1HQUwgUmVzaXplUm90YXRlOjoKLQk9IHhyYW5kcgotCT0tQzpyZXNpemUsbmV3ZmJzaXplLGV4aXQgeHJhbmRyX21vZGU6Ci0Jcm90YXRlOgotCXBhZGdlb206Ci0JPUdBTCBMT0ZGCi0JPUdBTCBDbGlwcGluZzo6Ci0JPVAgYmxhY2tvdXQ6Ci0JeGluZXJhbWEKLQljbGlwOgotCT1HQUwgTE9GRgotCT1HQUwgTWlzYy1TY3JlZW46OgotCWZpeHNjcmVlbjoKLQl2aXN1YWw6Ci0JcmF3ZmI6Ci0JcGlwZWlucHV0OgotCXVpbnB1dF9hY2NlbDoKLQl1aW5wdXRfcmVzZXQ6Ci0JdWlucHV0X2Fsd2F5czoKLQkyNHRvMzIKLQk9R0FMIExPRkYKLQotS2V5Ym9hcmQKLQk9RCBub3JlcGVhdAotCT1EIGFkZF9rZXlzeW1zCi0JbW9kdHdlYWsKLQl4a2IKLQktLQotCWNhcHNsb2NrCi0Jc2tpcF9sb2Nra2V5cwotCS0tCi0Jc2tpcF9rZXljb2RlczoKLQlza2lwX2R1cHMKLQlzbG9wcHlfa2V5cwotCS0tCi0JPUZQIHJlbWFwOgotCWNsZWFyX21vZHMKLQljbGVhcl9rZXlzCi0JY2xlYXJfYWxsCi0JPVJBIGNsZWFyX2xvY2tzCi0KLVBvaW50ZXIKLQk9RC1DOm5vbmUsYXJyb3csWCxzb21lLG1vc3QgY3Vyc29yOgotCT0tQzoxLDIsMyw0LDUsNiBhcnJvdzoKLQktLQotCWN1cnNvcnBvcwotCT1EIG5vY3Vyc29yc2hhcGUKLQktLQotCW5veGZpeGVzCi0JY3Vyc29yX2RyYWcKLQk9R0FMIEFscGhhQmxlbmRpbmc6OgotCW5vYWxwaGFibGVuZAotCWFscGhhY3V0OgotCWFscGhhZnJhYzoKLQlhbHBoYXJlbW92ZQotCT1HQUwgTE9GRgotCS0tCi0JYnV0dG9ubWFwOgotCS0tCi0JeHdhcnBwb2ludGVyCi0JYWx3YXlzX2luamVjdAotCi1NaXNjCi0JPUdELUM6ZnVsbCxpY29uLHRyYXkgV2luZG93VmlldzoKLQk9R0Qgc2ltcGxlLWd1aQotCS0tIEQKLQk9R0EgYWxsLXNldHRpbmdzCi0JPVJBIHJlbW90ZS1jbWQ6Ci0JPUdBTCBTZWxlY3Rpb246OgotCT1EIG5vc2VsCi0Jbm9wcmltYXJ5Ci0Jbm9zZXRwcmltYXJ5Ci0Jbm9jbGlwYm9hcmQKLQlub3NldGNsaXBib2FyZAotCXNlbGRpcjoKLQk9R0FMIExPRkYKLQk9R0FMIFgtZXh0OjoKLQl4dHJhcAotCW5veHJlY29yZAotCT1SUUEgcmVzZXRfcmVjb3JkCi0JPUdBTCBMT0ZGCi0JPUdBTCBNYWNPU1g6OgotCW1hY25vc2F2ZXIKLQltYWNub3dhaXQKLQltYWN3aGVlbDoKLQltYWNub3N3YXAKLQltYWNub3Jlc2l6ZQotCW1hY2ljb25hbmltOgotCW1hY21lbnUKLQk9R0FMIExPRkYKLQktLQotCTYKLQlub2lwdjYKLQlub2lwdjQKLQktLQotCW5vZmIKLQk9RCBub2JlbGwKLQlub2xvb2t1cAotCXJmYnZlcnNpb246Ci0JYmcKLQk9UyBsb29wCi0JPVMgbG9vcGJnCi0JPVMgc2xlZXBpbjoKLQk9LUM6aWdub3JlLGV4aXQgc2lncGlwZToKLQk9MCBpbmV0ZAotCi1EZWJ1Z2dpbmcKLQlkZWJ1Z19wb2ludGVyCi0JZGVidWdfa2V5Ym9hcmQKLQk9RiBsb2dmaWxlOgotCT1HQSBzaG93LWxvZ2ZpbGUKLQk9R0EgdGFpbC1sb2dmaWxlCi0JcXVpZXQKLQktLQotCT1HQSBzaG93LXN0YXJ0LWNtZAotCT1ERyBkZWJ1Z19ndWkKLQk9R0FMIE1pc2MtRGVidWc6OgotCWRlYnVnX3hldmVudHMKLQlkZWJ1Z194ZGFtYWdlCi0JPS1DOjAsMSwyLDMgZGVidWdfd2lyZWZyYW1lOgotCWRlYnVnX3Njcm9sbAotCWRlYnVnX3RpbGVzCi0JZGVidWdfZ3JhYnMKLQlkZWJ1Z19zZWwKLQlkZWJ1Z19uY2FjaGUKLQlkYmcKLQk9R0FMIExPRkYKLQotUGVybWlzc2lvbnMKLQk9RFJRQSBsb2NrCi0JPURSUUEgdW5sb2NrCi0JPUQgc2hhcmVkCi0JPUQgZm9yZXZlcgotCS0tCi0JPURGUCBhbGxvdzoKLQk9RCBsb2NhbGhvc3QKLQk9UkEgYWxsb3dvbmNlOgotCWxpc3RlbjoKLQktLSBECi0JPUQgdmlld29ubHkKLQlpbnB1dDoKLQktLQotCT1HQUwgUGFzc3dvcmRzOjoKLQlwYXNzd2Q6Ci0Jdmlld3Bhc3N3ZDoKLQk9RiBwYXNzd2RmaWxlOgotCT1GIHJmYmF1dGg6Ci0JdXNlcHcKLQktLQotCXVuaXhwdwotCXVuaXhwd19saXN0OgotCXVuaXhwd19uaXMKLQl1bml4cHdfbmlzX2xpc3Q6Ci0JPTAgc3RvcmVwYXNzd2QKLQk9R0FMIExPRkYKLQk9R0FMIFNTTDo6Ci0Jc3NsCi0JPUYgc3NsX3BlbToKLQlzdHVubmVsCi0JPUYgc3R1bm5lbF9wZW06Ci0JPUYgc3NsZGlyOgotCT1GIHNzbHZlcmlmeToKLQlzc2x0aW1lb3V0OgotCS0tCi0JZW5jOgotCT1HQUwgTE9GRgotCT1HQUwgTWlzYy1QZXJtczo6Ci0Jc2FmZXIKLQl1bnNhZmUKLQk9UkEgbm9yZW1vdGUKLQk9MFMgYWx3YXlzc2hhcmVkCi0JPTBTIG5ldmVyc2hhcmVkCi0JPTBTIGRvbnRkaXNjb25uZWN0Ci0JPVNRQSBkZW55X2FsbAotCXRpbWVvdXQ6Ci0JZ3JhYmtiZAotCWdyYWJwdHIKLQlncmFiYWx3YXlzCi0JZ3JhYmxvY2FsOgotCWZvcmNlZHBtcwotCWNsaWVudGRwbXMKLQlub3NlcnZlcmRwbXMKLQlub3VsdHJhZXh0Ci0JPUdBTCBMT0ZGCi0KLVR1bmluZwotCT1ELUM6MCwxLDIsMyw0IHBvaW50ZXJfbW9kZToKLQlpbnB1dF9za2lwOgotCWFsbGlucHV0Ci0JPUQgbm9kcmFnZ2luZwotCS0tIEQKLQlzcGVlZHM6Ci0JPUQgd2FpdDoKLQlkZWZlcjoKLQk9RCBuYXAKLQlzY3JlZW5fYmxhbms6Ci0JLS0KLQk9R0FMIFdpcmVGcmFtZTo6Ci0Jd2lyZWZyYW1lCi0Jd2lyZWZyYW1lX21vZGU6Ci0JPS1DOm5ldmVyLHRvcCxhbHdheXMgd2lyZWNvcHlyZWN0OgotCT1HQUwgTE9GRgotCT1HQUwgU2Nyb2xsQ29weVJlY3Q6OgotCT0tQzpuZXZlcixrZXlzLG1vdXNlLGFsd2F5cyBzY3JvbGxjb3B5cmVjdDoKLQlzY3JfYXJlYToKLQlzY3Jfc2tpcDoKLQlzY3JfaW5jOgotCXNjcl9rZXlzOgotCXNjcl90ZXJtOgotCXNjcl9rZXlyZXBlYXQ6Ci0Jc2NyX3Bhcm1zOgotCT1HQUwgTE9GRgotCT1HQUwgWERBTUFHRTo6Ci0JeGRhbWFnZQotCXhkX2FyZWE6Ci0JeGRfbWVtOgotCT1HQUwgTE9GRgotCT1HQUwgTmNhY2hlOjoKLQluY2FjaGUKLQluY2FjaGVfc2l6ZToKLQluY2FjaGVfY3IKLQluY2FjaGVfbm9fbW92ZXJhaXNlCi0JbmNhY2hlX25vX2R0Y2hhbmdlCi0JbmNhY2hlX29sZF93bQotCW5jYWNoZV9ub19yb290cGl4bWFwCi0JbmNhY2hlX2tlZXBfYW5pbXMKLQluY2FjaGVfcGFkOgotCT1SQSBuY2FjaGVfcmVzZXRfcm9vdHBpeG1hcAotCT1HQUwgTE9GRgotCS0tCi0JPUdBTCBTaGFyZWRNZW1vcnk6OgotCW5vc2htCi0JZmxpcGJ5dGVvcmRlcgotCW9uZXRpbGUKLQk9R0FMIExPRkYKLQk9R0FMIE1pc2MtVHVuaW5nOjoKLQlwcm9ncmVzc2l2ZToKLQlmczoKLQlnYXBzOgotCWdyb3c6Ci0JZnV6ejoKLQlleHRyYV9mYnVyOgotCXdhaXRfdWk6Ci0Jc2V0ZGVmZXI6Ci0Jbm93YWl0X2JvZwotCXNsb3dfZmI6Ci0JeHJlZnJlc2g6Ci0JcmVhZHRpbWVvdXQ6Ci0Jc25hcGZiCi0JdGhyZWFkcwotCXdtZHQ6Ci0JcmZid2FpdDoKLQlub2RwbXMKLQlub2ZicG0KLQk9R0FMIExPRkYKLSIKLX0KLQotcHJvYyBzZXRfaW50ZXJuYWxfaGVscCB7fSB7Ci0JZ2xvYmFsIGhlbHB0ZXh0IGhlbHBhbGwKLQotCSMgc2V0IHNvbWUgaW50ZXJuYWwgaXRlbSBoZWxwIGhlcmU6Ci0Jc2V0IGhlbHB0ZXh0KHN0YXJ0KSAiCi1MYXVuY2ggeDExdm5jIHdpdGggdGhlIHNldHRpbmdzIHlvdSBoYXZlIHByZXNjcmliZWQgaW4gdGhlIGd1aS4KLVRoZSB4MTF2bmMgcHJvY2VzcyBpcyBzdGFydGVkIGluIGFuIHh0ZXJtIHdpbmRvdyBzbyB5b3UgY2FuIHNlZSB0aGUKLW91dHB1dCwga2lsbCBpdCwgZXRjLgotCi1CeSB2aWV3aW5nIHRoaXMgaGVscCBpdGVtLCB0aGUgY29tbWFuZCBidWlsdCBzbyBmYXIgd2lsbCBiZSBkaXNwbGF5ZWQKLWluIHRoZSBndWkgdGV4dCBhcmVhLiAgSGF2ZSBhIGxvb2suICBJZiB5b3UgUHJlc3Mgc3RhcnQgaXQgd2lsbCBiZSBzaG93bgotYXMgd2VsbCBhbmQgeW91IHdpbGwgYmUgYXNrZWQgdG8gY29uZmlybSBydW5uaW5nIGl0LgotCi1JZiB5b3Ugd2FudCB0byB1c2UgYSBzYXZlZCBwcm9maWxlIFwicmMgZmlsZVwiIHlvdSBjYW4gZG8gXCJNaXNjIC0+IHJjXCIgYW5kCi1zZWxlY3QgdGhlIGZpbGUgYW5kIHNpbXBseSBzdGFydCB4MTF2bmMgdXNpbmcgdGhlIHJjIGZpbGUuICBBbHRlcm5hdGl2ZWx5LAoteW91IGNvdWxkIGZpcnN0IHVzZSB0aGUgXCJBY3Rpb25zIC0+IGxvYWQtc2V0dGluZ3NcIiBhY3Rpb24gdG8gbG9hZCBpbgotYW4gXCJyYyBmaWxlXCIgYW5kIHRoZW4gcHJlc3MgXCJBY3Rpb25zIC0+IHN0YXJ0XCIgdG8gc3RhcnQgdXAgeDExdm5jCi1iYXNlZCBvbiB0aG9zZSB2YWx1ZXMuCi0iCi0Jc2V0IGhlbHB0ZXh0KHN0b3ApICIKLVRoZSBcIkFjdGlvbnMgLT4gc3RvcFwiIGFjdGlvbiBzZW5kcyBhIHNpZ25hbCB0byB0aGUgcnVubmluZyB4MTF2bmMKLXNlcnZlciBpbmRpY2F0aW5nIGl0IHNob3VsZCBzaHV0ZG93biBhbGwgY29ubmVjdGlvbnMgYW5kIGV4aXQuCi0KLVRoZSBHVUkgc3RheXMgcnVubmluZyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGEgbmV3IHgxMXZuYyBvciBhdHRhY2gKLXRvIGFub3RoZXIgb25lLiAgVXNlIFwiQWN0aW9ucyAtPiBRdWl0XCIgaWYgeW91IHRoZW4gd2FudCB0byBoYXZlIHRoZQotZ3VpIGV4aXQuIFVzZSBcIkFjdGlvbnMgLT4gc3RvcCtxdWl0XCIgdG8gaGF2ZSBib3RoIGV4aXQgYXQgb25jZS4KLSIKLQotCXNldCBoZWxwdGV4dChzaG93LXN0YXJ0LWNtZCkgIgotRGlzcGxheXMgaW4gdGhlIHRleHQgYXJlYSB3aGF0IHRoZSB4MTF2bmMgc3RhcnQgY29tbWFuZCAoaS5lLiB0aGUgY29tbWFuZAotcnVuIGJ5IFwiQWN0aW9ucyAtPiBzdGFydFwiKSBsb29rcyBsaWtlIGZvciB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlCi1zZXR0aW5ncy4gIFRoaXMgY2FuIGJlIGRvbmUgZXZlbiBpbiB0aGUgYXR0YWNoZWQgc3RhdGUuICBJbnRlbmRlZCBmb3IKLWRlYnVnZ2luZyB0aGUgZ3VpLiAgVGhlIGhlbHAgaXRlbSBmb3IgXCJBY3Rpb25zIC0+IHN0YXJ0XCIgZ2l2ZXMgdGhlCi1zYW1lIGluZm8uCi0KLUlmIHlvdSB3YW50IHRvIGxvYWQgaW4gYSBzYXZlZCBwcm9maWxlIFwicmMgZmlsZVwiIHVzZSBcIk1pc2MgLT4gcmNcIgotYW5kIHNlbGVjdCB0aGUgZmlsZS4gIFwiQWN0aW9ucyAtPiBsb2FkLXNldHRpbmdzXCIgZG9lcyBhIHNpbWlsYXIgdGhpbmcKLXdpdGggYW4gcmMtZmlsZSwgYnV0IHJlYWRpbmcgdGhlIGZpbGUgYW5kIHNldHRpbmcgdGhlIGd1aSB2YXJpYWJsZXMgdG8KLWl0cyB2YWx1ZXMuCi0iCi0KLQlzZXQgaGVscHRleHQoZGVidWdfZ3VpKSAiCi1TZXQgZGVidWdfZ3VpIHRvIGdldCBtb3JlIG91dHB1dCBwcmludGVkIGluIHRoZSB0ZXh0IGFyZWEuCi0iCi0KLQlzZXQgaGVscHRleHQoZGV0YWNoKSAiCi1ObyBsb25nZXIgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB4MTF2bmMgc2VydmVyLiAgU3dpdGNoIHRvIHRoZQotbm9uLWNvbm5lY3RlZCBzdGF0ZS4gIFRoZSB4MTF2bmMgc2VydmVyIGtlZXBzIHJ1bm5pbmc6IGl0IGRvZXMgbm90IGV4aXQuCi0KLVlvdSBjYW4gZWl0aGVyIGxhdGVyIHJlYXR0YWNoIHRvIGl0IFwiQWN0aW9ucyAtPiBhdHRhY2hcIiwgb3Igc3RhcnQKLXVwIGEgbmV3IHgxMXZuYyBcIkFjdGlvbnMgLT4gc3RhcnRcIiwgb3IgZXhpdCBcIkFjdGlvbnMgLT4gUXVpdFwiLgotIgotCi0Jc2V0IGhlbHB0ZXh0KGF0dGFjaCkgIgotQXR0YWNoIHRvIGEgcnVubmluZyB4MTF2bmMgc2VydmVyLCBpZiBwb3NzaWJsZS4gIFN3aXRjaGVzIHRvIGNvbm5lY3RlZAotc3RhdGUgaWYgc3VjY2Vzc2Z1bC4gIFVzdWFsbHkgdGhlIGNoYW5uZWwgdXNlZCB0byBhdHRhY2ggaXMgdmlhIHRoZSBYCi1kaXNwbGF5IChWTkNfQ09OTkVDVCByb290d2luIHByb3BlcnR5KSBiZWluZyBwb2xsZWQgYnkgdGhlIHgxMXZuYyBzZXJ2ZXIuCi1UbyBjaGFuZ2Ugb3Igc2V0IHRoZSBYIGRpc3BsYXkgdG8gdXNlIGRvIFwiRGlzcGxheXMgLT4gZGlzcGxheVwiLgotCi1Tb21ldGltZXMgdGhlIFwiLWNvbm5lY3QgL3BhdGgvdG8vZmlsZW5hbWVcIiBpcyB1c2VkIGFzIHRoZSBjb21tdW5jYXRpb24KLWNoYW5uZWwuICBUaGUgcnVubmluZyB4MTF2bmMgaGFzIHRvIGtub3cgdGhhdCBcIi9wYXRoL3RvL2ZpbGVuYW1lXCIKLWlzIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKGkuZS4gaXQgaXMgdXNpbmcgdGhlIHNhbWUgLWNvbm5lY3Qgb3B0aW9uKS4KLSIKLQotCXNldCBoZWxwdGV4dChwaW5nKSAiCi1DaGVjayBpZiB4MTF2bmMgc3RpbGwgcmVzcG9uZHMgdG8gXCJwaW5nXCIgcmVtb3RlIGNvbW1hbmQuCi0iCi0KLQlzZXQgaGVscHRleHQodXBkYXRlLWFsbCkgIgotUXVlcnkgdGhlIHgxMXZuYyBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBhbGwgdmFyaWFibGVzLgotUG9wdWxhdGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBndWkncyBkYXRhYmFzZS4KLQotTm9ybWFsbHkgdGhlIGd1aSB3aWxsIHJlZnJlc2ggdGhpcyBpbmZvIGV2ZXJ5IHRpbWUgaXQgaW50ZXJhY3RzIHdpdGgKLXRoZSB4MTF2bmMgc2VydmVyIChpbmNsdWRpbmcgYWZ0ZXIgYSBmZXcgbWludXRlcyBvZiBpbmFjdGl2aXR5KSwgc28gb25lCi1kb2Vzbid0IG5lZWQgdG8gdXNlIHRoaXMgYWN0aW9uIHZlcnkgb2Z0ZW4gKHVubGVzcyBzb21ldGhpbmcgZWxzZSBpcwotY2hhbmdpbmcgdGhlIHN0YXRlIG9mIHRoZSB4MTF2bmMgc2VydmVyLCBvciBuZXcgY2xpZW50cyBoYXZlIGNvbm5lY3RlZCwKLWV0YykuCi0iCi0KLQlzZXQgaGVscHRleHQoY2xlYXItYWxsKSAiCi1Gb3JnZXQgYW55IHZhcmlhYmxlIHNldHRpbmdzIGVpdGhlciBlbnRlcmVkIGluIGJ5IHlvdSBvciBzZXQgYXQgdGhlCi1kZWZhdWx0LiAgQmFzaWNhbGx5IHNldHMgZXZlcnl0aGluZyB0byAwIG9yIHRoZSBzdHJpbmcgKHVuc2V0KS4KLQotVGhpcyBhY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaW4gXCJzdGFydHVwXCIgbW9kZSwgbm90IHdoZW4gY29ubmVjdGVkCi10byBhIHJ1bm5pbmcgeDExdm5jIHNlcnZlciAoaW4gdGhhdCBjYXNlIHRoZSB2YXJpYWJsZSBzZXR0aW5ncyByZWZsZWN0Ci10aGUgc3RhdGUgb2YgdGhlIHJ1bm5pbmcgeDExdm5jKS4gIFRvIGRldGFjaCBmcm9tIGEgcnVubmluZyB4MTF2bmMKLXNlcnZlciB1c2UgXCJBY3Rpb25zIC0+IGRldGFjaFwiOyB0byBjb21wbGV0ZWx5IHN0b3AgdGhlIHgxMXZuYyBzZXJ2ZXIKLXVzZSBcIkFjdGlvbnMgLT4gc3RvcFwiLgotIgotCi0Jc2V0IGhlbHB0ZXh0KGRlZmF1bHRzLWFsbCkgIgotUmVzZXQgYWxsIHZhcmlhYmxlIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4gIEJhc2ljYWxseSBzZXRzCi1ldmVyeXRoaW5nIHRvIHRoZSBkZWZhdWx0IHF1ZXJpZXMgXCJ4MTF2bmMgLVFEIHZhclwiIHJldHJpZXZlZCBhdCBzdGFydHVwLgotCi1UaGlzIGFjdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBcInN0YXJ0dXBcIiBtb2RlLCBub3Qgd2hlbiBjb25uZWN0ZWQKLXRvIGEgcnVubmluZyB4MTF2bmMgc2VydmVyIChpbiB0aGF0IGNhc2UgdGhlIHZhcmlhYmxlIHNldHRpbmdzIHJlZmxlY3QKLXRoZSBzdGF0ZSBvZiB0aGUgcnVubmluZyB4MTF2bmMpLiAgVG8gZGV0YWNoIGZyb20gYSBydW5uaW5nIHgxMXZuYwotc2VydmVyIHVzZSBcIkFjdGlvbnMgLT4gZGV0YWNoXCI7IHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgeDExdm5jIHNlcnZlcgotdXNlIFwiQWN0aW9ucyAtPiBzdG9wXCIuCi0iCi0KLQlzZXQgaGVscHRleHQobG9hZC1zZXR0aW5ncykgIgotUmVhZCBpbiB0aGUgXCJyYyBmaWxlXCIgeW91IHByZXNjcmliZSBpbiB0aGUgZGlhbG9nIGFuZCB0aGVuIHNldCB0aGUKLXZhcmlhYmxlcyB0byB0aG9zZSBpbiB0aGUgcmMtZmlsZS4gIEFueSB2YXJpYWJsZXMgbm90IG1lbnRpb25lZCBpbiB0aGUKLXJjLWZpbGUgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgotCi1Zb3UgY291bGQgdGhlbiBkbyBcIkFjdGlvbnMgLT4gc3RhcnRcIiB0byBzdGFydCB4MTF2bmMgd2l0aCB0aGVzZQotcGFyYW1ldGVycy4gIE9yIHlvdSBjb3VsZCBtYWtlIHNvbWUgZnVydGhlciBjaGFuZ2VzIHRvIHZhcmlhYmxlcwotdXNpbmcgdGhlIGd1aSBiZWZvcmUgc3RhcnRpbmcgeDExdm5jLgotCi1UaGlzIGFjdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBcInN0YXJ0dXBcIiBtb2RlLCBub3Qgd2hlbiBjb25uZWN0ZWQKLXRvIGEgcnVubmluZyB4MTF2bmMgc2VydmVyIChpbiB0aGF0IGNhc2UgdGhlIHZhcmlhYmxlIHNldHRpbmdzIHJlZmxlY3QKLXRoZSBzdGF0ZSBvZiB0aGUgcnVubmluZyB4MTF2bmMpLiAgVG8gZGV0YWNoIGZyb20gYSBydW5uaW5nIHgxMXZuYwotc2VydmVyIHVzZSBcIkFjdGlvbnMgLT4gZGV0YWNoXCI7IHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgeDExdm5jIHNlcnZlcgotdXNlIFwiQWN0aW9ucyAtPiBzdG9wXCIuCi0iCi0KLQlzZXQgaGVscHRleHQoc2F2ZS1zZXR0aW5ncykgIgotQ29uc3RydWN0IGEgfi8ueDExdm5jcmMgZmlsZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5ncyBhbmQKLW9mZmVyIHRvIHNhdmUgaXQgaW4gYSBmaWxlIChkZWZhdWx0IH4vLngxMXZuY3JjKS4gIElmIHNhdmVkIGluIGEKLWZpbGUgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCwgeW91IGNhbiBhY2Nlc3MgdGhlIHByb2ZpbGUgYnkgdXNpbmcKLXRoZSBcIi1yYyA8ZmlsZW5hbWU+XCIgb3B0aW9uIHdoZW4gc3RhcnRpbmcgeDExdm5jLgotCi1JZiBhbiByYyBmaWxlIGVudHJ5IGJlZ2lucyB3aXRoIFwiI2RcIiB0aGF0IG1lYW5zIHRoZSBjdXJyZW50Ci1zZXR0aW5nIGlzIGF0IHRoZSBEZWZhdWx0IHZhbHVlIGFuZCBzbyB5b3UgcHJvYmFibHkgd2FudCB0byBsZWF2ZQotaXQgY29tbWVudGVkIG91dCB3aXRoIHRoZSBcIiNcIiBjaGFyYWN0ZXIuCi0KLUlmIGFuIHJjIGZpbGUgZW50cnkgYmVnaW5zIHdpdGggXCIjP1wiIHRoYXQgbWVhbnMgd2UgdGhpbmsKLXlvdSBwcm9iYWJseSBkbyBub3QgcmVhbGx5IHdhbnQgdG8gZm9yY2UgdGhlIHZhbHVlIHRvIHRoaXMgc2V0dGluZy4KLQotSW4gZWl0aGVyIGNhc2UsIGZlZWwgZnJlZSB0byB1bmNvbW1lbnQgdGhlIGxpbmUgYW5kL29yIGNoYW5nZSBhbnkKLW9mIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGluIHRoZSBmaWxlLiAKLSIKLQotCXNldCBoZWxwdGV4dChhbGwtc2V0dGluZ3MpICIKLURpc3BsYXlzIHRoZSBndWkncyBkYXRhYmFzZSBvZiBhbGwgb2YgdGhlIHgxMXZuYyBzZXJ2ZXIncyBjdXJyZW50Ci1zZXR0aW5ncy4gIFVzZSBcIkFjdGlvbnMgLT4gdXBkYXRlLWFsbFwiICBvciBcIkNvbnRyb2wrUlwiIHRvCi1yZWZyZXNoIHRoaXMgbGlzdCBpZiBpdCBldmVyIGdldHMgb3V0IG9mIHN5bmMuCi0iCi0KLQlzZXQgaGVscHRleHQocmVtb3RlLWNtZCkgIgotUnVuIGEgcmVtb3RlIGNvbW1hbmQgKC1SKSBvciBxdWVyeSAoLVEpIGRpcmVjdGx5LiAgT25seSBhIGZldwotcmVtb3RlIGNvbW1hbmRzIGFyZSBub3Qgb24gYSBtZW51LCBidXQgZm9yIHRob3NlIGZldyB5b3UgY2FuCi1ydW4gdGhlIGNvbW1hbmQgZGlyZWN0bHkgdGhpcyB3YXkuICBKdXN0IGVudGVyIHRoZSBjb21tYW5kIGludG8KLXRoZSBFbnRyeSBib3ggd2hlbiBwcm9tcHRlZC4gIFVzZSB0aGUgcHJlZml4IFwiUTpcIiB0byBpbmRpY2F0ZQotYSAtUSBxdWVyeS4gIEV4YW1wbGVzOiBcInplcm86MjAsMjAsMTAwLDEwMFwiLCBcIlE6ZXh0X3hmaXhlc1wiICAKLSIKLQotCXNldCBoZWxwdGV4dChzdG9wK3F1aXQpICIKLVNlbmQgdGhlIHN0b3AgY29tbWFuZCB0byB0aGUgeDExdm5jIHNlcnZlciwgdGhlbiB0ZXJtaW5hdGUgdGhlIHRreDExdm5jIGd1aS4KLSIKLQotCXNldCBoZWxwdGV4dChzaG93LWxvZ2ZpbGUpICIKLVZpZXcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGxvZ2ZpbGUgKGlmIGl0IGV4aXN0cyBhbmQgaXMgYWNjZXNzaWJsZQotYnkgdGhlIGd1aSBwcm9jZXNzKS4KLSIKLQotCXNldCBoZWxwdGV4dCh0YWlsLWxvZ2ZpbGUpICIKLVJ1biB0aGUgdGFpbCgxKSBjb21tYW5kIHdpdGggLWYgb3B0aW9uIG9uIHRoZSBsb2dmaWxlIGluIGFuIHh0ZXJtLgotKGlmIGl0IGV4aXN0cyBhbmQgaXMgYWNjZXNzaWJsZSBieSB0aGUgZ3VpIHByb2Nlc3MpLgotIgotCi0Jc2V0IGhlbHB0ZXh0KFF1aXQpICIKLVRlcm1pbmF0ZSB0aGUgdGt4MTF2bmMgZ3VpLiAgQW55IHgxMXZuYyBzZXJ2ZXIgd2lsbCBiZSBsZWZ0IHJ1bm5pbmcuCi0iCi0KLQlzZXQgaGVscHRleHQoY3VycmVudCkgIgotU2hvd3MgYSBtZW51IG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgVk5DIGNsaWVudHMgb24gdGhlIHgxMXZuYyBzZXJ2ZXIuCi0KLUFsbG93cyB5b3UgdG8gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZW0sIGNoYW5nZSB0aGVpciBpbnB1dAotcGVybWlzc2lvbnMsIG9yIGRpc2Nvbm5lY3QgdGhlbS4KLQotTm90ZSB0aGF0IHRoZSBGaWxlIHRyYW5zZmVyIHBlcm1pc3Npb24gb25seSBhcHBsaWVzIHRvIFVsdHJhVk5DCi1maWxlIHRyYW5zZmVyLCBub3QgVGlnaHRWTkMgZmlsZSB0cmFuc2Zlci4KLQotWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gY29uZmlybSBhbnkgZGlzY29ubmVjdGlvbnMuCi0iCi0KLQlzZXQgaGVscHRleHQoY2xpZW50KSAiCi1BZnRlciBzZWxlY3RpbmcgYSBWTkMgY2xpZW50IGZyb20gdGhlIFwiQ2xpZW50cyAtPiBjdXJyZW50XCIgbWVudSwKLXlvdSB3aWxsIGJlIHByZXNlbnRlZCB3aXRoIGEgZGlhbG9nIHRoYXQgc2hvd3MgdGhlIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgVk5DIGNsaWVudC4KLQotWW91IGNhbiBjaG9vc2UgdG8gZGlzY29ubmVjdCB0aGUgY2xpZW50IGJ5IGNsaWNraW5nIG9uIHRoZSAKLVwiRGlzY29ubmVjdFwiIGNoZWNrYm94IGFuZCBwcmVzc2luZyBcIk9LXCIuICBUaGVyZSB3aWxsIGJlIGEKLWNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gZG91YmxlY2hlY2suCi0KLUFsdGVybmF0aXZlbHksIHlvdSBjYW4gZmluZSB0dW5lIHRoZSBWTkMgY2xpZW50J3MgaW5wdXQgcGVybWlzc2lvbnMKLWJ5IHNlbGVjdGluZyBhbnkgb2YgdGhlIEtleXN0cm9rZXMsIE1vdXNlLU1vdGlvbiwgQnV0dG9uLUNsaWNrLAotQ2xpcGJvYXJkLUlucHV0LCBvciBGaWxlcyBjaGVja2JveGVzIGFuZCBwcmVzc2luZyBcIk9LXCIuICBUaGlzIGlzIGxpa2UKLXRoZSBcIi1pbnB1dFwiIG9wdGlvbiBidXQgb24gYSBwZXItY2xpZW50IGJhc2lzLgotCi1UbyBub3QgY2hhbmdlIGFueSBhc3BlY3RzIG9mIHRoZSBWTkMgY2xpZW50IHByZXNzIFwiQ2FuY2VsXCIuCi0iCi0KLQlzZXQgaGVscHRleHQoc29saWRfY29sb3IpICIKLVNldCB0aGUgLXNvbGlkIGNvbG9yIHZhbHVlLgotIgotCi0Jc2V0IGhlbHB0ZXh0KHhyYW5kcl9tb2RlKSAiCi1TZXQgdGhlIC14cmFuZHIgbW9kZSB2YWx1ZS4KLSIKLQotCXNldCBoZWxwdGV4dCh1bml4cHdfbGlzdCkgIgotU2V0IHRoZSAtdW5peHB3IHVzZXJuYW1lcyBsaXN0IHZhbHVlLgotIgotCi0Jc2V0IGhlbHB0ZXh0KHVuaXhwd19uaXNfbGlzdCkgIgotU2V0IHRoZSAtdW5peHB3X25pcyB1c2VybmFtZXMgbGlzdCB2YWx1ZS4KLSIKLQotCXNldCBoZWxwdGV4dChzdHVubmVsX3BlbSkgIgotU2V0IHRoZSAtc3R1bm5lbCBwZW0gZmlsZW5hbWUgdmFsdWUuCi0iCi0KLQlzZXQgaGVscHRleHQoc3NsX3BlbSkgIgotU2V0IHRoZSAtc3NsIHBlbSBmaWxlbmFtZSB2YWx1ZS4KLSIKLQotCXNldCBoZWxwdGV4dCh3aXJlZnJhbWVfbW9kZSkgIgotU2V0IHRoZSAtd2lyZWZyYW1lIG1vZGUgc3RyaW5nIHZhbHVlLgotIgotCi0Jc2V0IGhlbHB0ZXh0KHNpbXBsZS1ndWkpICIKLVRvZ2dsZSBiZXR3ZWVuIG1lbnUgaXRlbXMgY29ycmVzcG9uZGluZyB0aGUgbW9zdCBiYXNpYyBvbmVzCi1hbmQgYWxsIHBvc3NpYmxlIHNldHRpbmdzLiAgSS5lLiB0b2dnbGUgYmV0d2VlbiBhIHNpbXBsZSBndWkKLWFuZCBvbmUgZm9yIHBvd2VyIHVzZXJzLgotIgotCi0Jc2V0IGhlbHB0ZXh0KFRyYXkpICIKLVRoZSB0cmF5L2ljb24gbW9kZSAoc3RhcnRlZCB3aXRoIFwieDExdm5jIC1ndWkgdHJheSAuLi5cIiwgZXRjLikgcHJlc2VudHMKLWEgc21hbGwgaWNvbiB0aGF0IGluZGljYXRlcyB0aGUgc3RhdHVzIG9mIHRoZSBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIuCi0KLURlcGVuZGluZyBvbiB5b3VyIGVudmlyb25tZW50LCB0aGlzIGljb24gbWF5IGJlIGVtYmVkZGVkIGluIGEgc3lzdGVtCi10cmF5IG9yIGFwcGxldCBkb2NrLCBvciBzaW1wbHkgYmUgYSBzdGFuZGFsb25lIHdpbmRvdy4gIFwiLWd1aSB0cmF5XCIKLXdpbGwgYXR0ZW1wdCB0byBlbWJlZCB0aGUgaWNvbiBpbiB0aGUgc3lzdGVtIHRyYXksIHdoaWxlIFwiLWd1aSBpY29uXCIKLWlzIGZvciBhIHN0YW5kYWxvbmUgd2luZG93LiAgVXNlIFwiLWd1aSB0cmF5PXNldHBhc3NcIiAob3IgaWNvbj1zZXRwYXNzKQotdG8gYmUgcHJvbXB0ZWQgdG8gc2V0IHRoZSBzZXNzaW9uIHBhc3N3b3JkIGF0IHN0YXJ0dXAuCi0KLVdoZW4gdGhlIGljb24gaGFzIGEgbGlnaHQgYmFja2dyb3VuZCwgdGhhdCBtZWFucyBubyBWTkMgdmlld2VycyBhcmUKLWN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIFZOQyBkaXNwbGF5LgotCi1XaGVuIHRoZSBpY29uIGhhcyBhIGRhcmsgYmFja2dyb3VuZCAoaS5lLiByZXZlcnNlLXZpZGVvKSwgdGhhdCBtZWFucyBhdAotbGVhc3Qgb25lIFZOQyB2aWV3ZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBWTkMgZGlzcGxheS4KLQotTW92aW5nIHRoZSBtb3VzZSBwb2ludGVyIG92ZXIgdGhlIGljb24gd2lsbCBwb3B1cCBhIFwic3RhdHVzIGJhbGxvb25cIgotaW5kaWNhdGluZyB0aGUgVk5DIGRpc3BsYXkgbmFtZSBhbmQgdGhlIG5hbWVzIGFuZCBpbmZvIG9mIGFueSBjb25uZWN0ZWQgVk5DCi12aWV3ZXJzLiAgUHJlc3MgdGhlIG1pZGRsZSBtb3VzZSBidXR0b24gaWYgdGhlIGJhbGxvb24gZG9lcyBub3QgYXBwZWFyLgotCi1DbGlja2luZyB0aGUgbGVmdCBvciByaWdodCBtb3VzZSBidXR0b24gb24gdGhlIGljb24gZGlzcGxheXMgYSBtZW51Ci1vZiBhY3Rpb25zOgotCi0gICAgUHJvcGVydGllcyAgICAgIC0gQnJpbmdzIHVwIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZyB0byBzZXQgc29tZSBiYXNpYwotICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuICBUaGUgZnVsbCB0a3gxMXZuYyBHVUkgbWF5IGJlIGFjY2Vzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgdmlhIHRoZSBcIkFkdmFuY2VkIC4uLlwiIGJ1dHRvbi4gIFByZXNzIFwiSGVscFwiCi0gICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIFByb3BlcnRpZXMgZGlhbG9nIGZvciBtb3JlIGluZm8uCi0gICAgCi0gICAgSGVscCAgICAgICAgICAgIC0gRGlzcGxheXMgdGhpcyBoZWxwIHRleHQuCi0gICAgCi0gICAgTmV3IENsaWVudCAgICAgIC0gUHJlc2VudHMgYW4gZW50cnkgYm94IHdoZXJlIHlvdSB0eXBlIGluIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb21wdXRlciB0aGF0IGlzIHJ1bm5pbmcgYSBWTkMgdmlld2VyIGluCi0gICAgICAgICAgICAgICAgICAgICAgXCJsaXN0ZW5cIiBtb2RlIChlLmcuIHZuY3ZpZXdlciAtbGlzdGVuKS4gIEZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgbm9uLXN0YW5kYXJkIGxpc3RlbmluZyBwb3J0IHVzZSBcImhvc3Q6cG9ydFwiLgotCi0gICAgICAgICAgICAgICAgICAgICAgUHJlc3NpbmcgXCJPS1wiIHdpbGwgaW5pdGlhdGUgdGhlIHJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLiAgVXNlIGEgYmxhbmsgaG9zdG5hbWUgdG8gc2tpcCBpdC4KLSAgICAKLSAgICBEaXNjb25uZWN0ICAgICAgLSBTaG93cyBhIHBvcHVwIG1lbnUgb2YgY29ubmVjdGVkIGNsaWVudHMuICBDbGljayBvbgotICAgICAgICAgICAgICAgICAgICAgIG9uZSB0byBkaXNjb25uZWN0IGl0LCBvciBjbGljayBvbiBcIkFsbCBDbGllbnRzXCIKLSAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0IGFsbCBjbGllbnRzLgotCi0gICAgV2luZG93IFZpZXcgICAgIC0gU3dpdGNoIGJldHdlZW4gdGhlIFwiZnVsbFwiIGd1aSAoYWxzbyBrbm93biBhcwotICAgICAgICAgICAgICAgICAgICAgIFwiQWR2YW5jZWRcIiksIFwiaWNvblwiIG1vZGUgKHNtYWxsIGljb24gd2luZG93IHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICBwb3B1cHMpLCBvciBcInRyYXlcIiBtb2RlIChzbWFsbCBpY29uIGVtYmVkZGVkIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSB0cmF5KS4gIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGFjdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgICBcIlByb3BlcnRpZXMgLT4gQWR2YW5jZWQgLT4gTWlzYyAtPiBXaW5kb3dWaWV3XCIuCi0gICAgCi0gICAgU3RvcCB4MTF2bmMgICAgIC0gRGlyZWN0cyB0aGUgeDExdm5jIHNlcnZlciB0byBkaXNjb25uZWN0IGFsbCB2bmN2aWV3ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gZXhpdC4gIFRoZSB0cmF5L2ljb24gR1VJIHRoZW4gZXhpdHMgYXMgd2VsbC4KLQotICAgIExvZ2ZpbGUgICAgICAgICAtIFNob3cgdGhlIGxvZ2ZpbGUgaWYgeDExdm5jIGlzIGJlaW5nIHJ1biB3aXRoIG9uZS4KLQotICAgIEN1c3RvbSAgICAgICAgICAtIElmIHlvdSBoYXZlIGEgXCRIT01FLy54MTF2bmMuZ3VpIGZpbGUgZWFjaCB1bmNvbW1lbnRlZAotICAgICAgICAgICAgICAgICAgICAgIGxpbmUgaW4gaXQgYmVjb21lcyBhbiBhZGRpdGlvbmFsIG1lbnUgaXRlbSBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgIG1lbnUuICBUaGUgcmVtb3RlIGNvbnRyb2wgY29tbWFuZCBpcyBydW4gZGlyZWN0bHkKLSAgICAgICAgICAgICAgICAgICAgICB2aWEgXCJ4MTF2bmMgLVIgPGNvbW1hbmQ+XCIsIG9yIGlmIHByZWZpeGVkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb246XCIgcnVucyBhIGd1aSBpbnRlcm5hbCBhY3Rpb24sIG9yIGlmIFwic2VwXCIKLSAgICAgICAgICAgICAgICAgICAgICBhZGRzIGEgc2VwYXJhdG9yLiAgU2V0IFgxMVZOQ19DVVNUT01fR1VJIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGZpbGVuYW1lLiAgRXhhbXBsZSBmaWxlIGNvbnRlbnRzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOjMvNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZToxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2N1cnNvcjoxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246YWxsLXNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWJ1Z19rZXlib2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOlF1aXQKLQotVGVybWluYXRpb246Ci0KLUlmIHRoZSB4MTF2bmMgc2VydmVyIHN0b3BzIGZvciBhbnkgcmVhc29uLCB0aGUgdHJheS9pY29uIGd1aSB3aWxsIGV4aXQuCi0KLUlmIHlvdSBkZWxldGUgdGhlIHRyYXkvaWNvbiAoZS5nLiBYIG91dCBidXR0b24pLCB0aGF0IGlzIHRoZSBzYW1lCi1hcyB0aGUgXCJTdG9wIHgxMXZuY1wiIGFjdGlvbiBpbiB0aGUgbWVudS4gKFRoaXMgd2lsbCBkaXNjb25uZWN0IGFueQotVk5DIHZpZXdlciB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0byBhY2Nlc3MgdGhlIGRpc3BsYXkgc2luY2UgdGhlCi14MTF2bmMgc2VydmVyIGlzIHRlcm1pbmF0ZWQpLgotCi1UbyB0ZXJtaW5hdGUgdGhlIHRyYXkvaWNvbiBndWkgd2luZG93IGJ1dCBub3QgdGhlIHgxMXZuYyBzZXJ2ZXIgcHJlc3MKLUNvbnRyb2wtQyBvbiB0aGUgdHJheS9pY29uIHdpbmRvdy4gIFlvdSBjYW4gYWxzbyBkbyB0aGlzIChhbmQgbXVjaAotbW9yZSkgdmlhIFByb3BlcnRpZXMgLT4gQWR2YW5jZWQgLT4gQWN0aW9ucyAtPiBRdWl0Ci0iCi0KLQlzZXQgaGVscHRleHQoTmV3Q2xpZW50KSAiCi0gICAgTmV3IENsaWVudCAgICAgIC0gUHJlc2VudHMgYW4gZW50cnkgYm94IHdoZXJlIHlvdSB0eXBlIGluIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb21wdXRlciB0aGF0IGlzIHJ1bm5pbmcgYSBWTkMgdmlld2VyIGluCi0gICAgICAgICAgICAgICAgICAgICAgXCJsaXN0ZW5cIiBtb2RlIChlLmcuIHZuY3ZpZXdlciAtbGlzdGVuKS4gIEZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgbm9uLXN0YW5kYXJkIGxpc3RlbmluZyBwb3J0IHVzZSBcImhvc3Q6cG9ydFwiLgotCi0gICAgICAgICAgICAgICAgICAgICAgUHJlc3NpbmcgXCJPS1wiIHdpbGwgaW5pdGlhdGUgdGhlIHJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLiAgVXNlIGEgYmxhbmsgaG9zdG5hbWUgdG8gc2tpcCBpdCwgb3IKLSAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKFwiWC1vdXRcIikgdGhlIHdpbmRvdy4KLSAgICAKLSIKLQotCXNldCBoZWxwdGV4dChQcm9wZXJ0aWVzKSAiCi1UaGUgUHJvcGVydGllcyBkaWFsb2cgYWxsb3dzIHlvdSB0byBzZXQgc29tZSBiYXNpYyBwYXJhbWV0ZXJzIG9mIGEKLXJ1bm5pbmcgeDExdm5jIHNlcnZlci4gIEFmdGVyIG1vZGlmeWluZyB0aGVtIHByZXNzIFwiT0tcIiBvciBcIkFwcGx5XCIKLXRvIGFwcGx5IHRoZSBjaGFuZ2VzLCBvciBwcmVzcyBcIkNhbmNlbFwiIHRvIHNraXAgYXBwbHlpbmcgdGhlbS4KLQotIEFjY2VwdCBDb25uZWN0aW9uczoKLQotICAgVG9nZ2xlcyB3aGV0aGVyIFZOQyB2aWV3ZXJzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3Qgb3Igbm90LiAgSXQgY29ycmVzcG9uZHMKLSAgIHRvIHRoZSBcIi1SIHVubG9ja1wiIGFuZCBcIi1SIGxvY2tcIiByZW1vdGUtY29udHJvbCBjb21tYW5kcy4KLQotIEFzayBmb3IgQ29uZmlybWF0aW9uOgotCi0gICBUb2dnbGVzIHdoZXRoZXIgYSBwb3B1cCBtZW51IHdpbGwgYmUgcHJlc2VudGVkIGF0IHRoZSBYIGRpc3BsYXkgd2hlbgotICAgYSBuZXcgVk5DIHZpZXdlciBhdHRlbXB0cyB0byBjb25uZWN0LiAgVGhlIHBlcnNvbiBzaXR0aW5nIGF0IHRoZSBYCi0gICBkaXNwbGF5IGNhbiBjaG9vc2UgdG8gYWNjZXB0IG9yIHJlamVjdCB0aGUgY29ubmVjdGlvbiBvciBhY2NlcHQgdGhlCi0gICBjb25uZWN0aW9uIGluIFZpZXdPbmx5IG1vZGUuICBJdCBjb3JyZXNwb25kcyB0byB0aGUgXCItUiBhY2NlcHQ6cG9wdXBcIgotICAgYW5kIFwiLVIgYWNjZXB0OlwiIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLgotICAgCi0gQWxsIENsaWVudHMgVmlld09ubHk6Ci0KLSAgIFRvZ2dsZXMgd2hldGhlciB0aGUgZW50aXJlIFZOQyBkZXNrdG9wIGlzIHZpZXcgb25seS4gIEFsbCBjbGllbnRzCi0gICB3aWxsIG9ubHkgYmUgYWJsZSB0byB3YXRjaCB3aGVuIHRoaXMgaXMgc2V0IChyZWdhcmRsZXNzIG9mIGhvdyB0aGV5Ci0gICBsb2dnZWQgaW4pLiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIFwiLVIgdmlld29ubHlcIiBhbmQgXCItUiBub3ZpZXdvbmx5XCIKLSAgIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLgotICAgCi0gU2hhcmVkOgotCi0gICBUb2dnbGVzIHdoZXRoZXIgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHZpZXdlciBjb25uZWN0aW9ucyBhcmUgYWxsb3dlZAotICAgb3Igbm90LiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIFwiLVIgc2hhcmVkXCIgYW5kIFwiLVIgbm9zaGFyZWRcIgotICAgcmVtb3RlLWNvbnRyb2wgY29tbWFuZHMuCi0KLSBBZHZlcnRpc2UgU2VydmljZSAoWmVyb2NvbmYpOgotCi0gICBUb2dnbGVzIHdoZXRoZXIgdGhpcyBWTkMgc2VydmVyIHNob3VsZCBhZHZlcnRpemUgaXRzZWxmIHZpYSBaZXJvY29uZgotICAgKGFsc28gY2FsbGVkIEJvbmpvdXIsIG1ETlMsIGFuZCBhdmFoaSkuICBUaGVuIFZOQyB2aWV3ZXJzIGNhbiB0aGVuIGZpbmQKLSAgIHRoaXMgc2VydmljZSBvbiB0aGUgbG9jYWwgbmV0d29yay4gIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBcIi1SIHplcm9jb25mXCIKLSAgIGFuZCBcIi1SIG5vemVyb2NvbmZcIiByZW1vdGUtY29udHJvbCBjb21tYW5kcy4KLQotIFNlcnZlIEphdmEgVmlld2VyIEFwcGxldDoKLQotICAgVG9nZ2xlcyB3aGV0aGVyIHRoaXMgVk5DIHNlcnZlciBzaG91bGQgc2VydmUgdXAgYSBKYXZhIFZOQyBWaWV3ZXIKLSAgIGFwcGxldCB2aWEgSFRUUCBvbiBodHRwOi8vaG9zdG5hbWU6NTgwMC8gKG9yIHBvcnQgNTgwMCtuIGZvciBWTkMKLSAgIHBvcnQgNTkwMCtuKS4gIEEgamF2YSBlbmFibGVkIFdlYiBCcm93c2VyIGNhbiB0aGVuIGNvbm5lY3QgdG8gdGhlCi0gICBkZXNrdG9wYnkgVk5DLiAgSWYgU1NMIGlzIGFjdGl2ZSB0aGVuIHRoZSBIVFRQUyBVUkwgaHR0cHM6Ly9ob3N0bmFtZTo1OTAwLwotICAgKGV0Yy4pIHdpbGwgd29yayBhcyB3ZWxsLiAgVGhpcyByZXF1aXJlcyB0aGUgeDExdm5jIGphdmEgdmlld2VyIGphciBmaWxlCi0gICAoc2hhcmVkL3gxMXZuYy9jbGFzc2VzKSB0byBiZSBpbnN0YWxsZWQuICBJdCBjb3JyZXNwb25kcyB0byB0aGUKLSAgIFwiLVIgaHR0cFwiIGFuZCBcIi1SIG5vaHR0cFwiIHJlbW90ZSBjb21tYW5kcy4KLQotIFNvbGlkIEJhY2tncm91bmQgQ29sb3I6Ci0KLSAgIFRvIGltcHJvdmUgVk5DIHBlcmZvcm1hbmNlLCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZW4geDExdm5jIHdpbGwgdHJ5Ci0gICB0byBtYWtlIHRoZSBkZXNrdG9wIGJhY2tncm91bmQgYSBzb2xpZCBjb2xvciAod2hpY2ggY29tcHJlc3NlcyBleHRyZW1lbHkKLSAgIHdlbGwgY29tcGFyZWQgdG8gcGhvdG8gaW1hZ2VzLCBldGMuKSAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIFwiLVIgc29saWRcIgotICAgYW5kIFwiLVIgbm9zb2xpZFwiIHJlbW90ZSBjb21tYW5kcy4KLQotIFBhc3N3b3JkOgotCi0gICBMZXRzIHlvdSBzZXQgdGhlIHNlc3Npb24gcGFzc3dvcmQgdmlld2VycyBtYXkgdXNlIHRvIGdhaW4gZnVsbCBhY2Nlc3MKLSAgIHRvIHRoZSBkaXNwbGF5LiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB4MTF2bmMgd2FzIHN0YXJ0ZWQgd2l0aCB0aGUKLSAgIC1ndWkgaWNvbiBvciAtZ3VpIHRyYXkgbW9kZS4KLSAgIAotIFZpZXdPbmx5IFBhc3N3b3JkOgotCi0gICBMZXRzIHlvdSBzZXQgdGhlIHNlc3Npb24gcGFzc3dvcmQgdmlld2VycyBtYXkgdXNlIHRvIGdhaW4gdmlldyBvbmx5Ci0gICBhY2Nlc3MgdG8gdGhlIGRpc3BsYXkuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHgxMXZuYyB3YXMgc3RhcnRlZCB3aXRoCi0gICB0aGUgLWd1aSBpY29uIG9yIC1ndWkgdHJheSBtb2RlLgotCi0KLSBOT1RFOiBUaGVzZSBcInNlc3Npb25cIiBwYXNzd29yZHMgb25seSBsYXN0IGZvciB0aGUgY3VycmVudCB4MTF2bmMKLSBzZXNzaW9uICh0aGV5IGFyZSBub3QgcmVtZW1iZXJlZCwgc2VlIHRoZSAtc3RvcmVwYXNzd2QsIC1wYXNzd2RmaWxlLAotIGFuZCAtcmZiYXV0aCB4MTF2bmMgb3B0aW9ucyBmb3IgdXNpbmcgc3RvcmVkIHBhc3N3b3JkcykuCi0KLSBJZiB5b3Ugc2V0IFwiUGFzc3dvcmRcIiB0byB0aGUgZW1wdHkgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIFwiVmlld09ubHkKLSBQYXNzd29yZFwiIGVtcHR5IGFzIHdlbGwgYW5kIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGFueSBwYXNzd29yZCB0byBsb2cgaW4uCi0KLSBJZiB5b3Ugc2V0IFwiVmlld09ubHkgUGFzc3dvcmRcIiB0byB0aGUgZW1wdHkgc3RyaW5nIHRoYXQganVzdCByZW1vdmVzCi0gdGhlIFZpZXdPbmx5IGxvZyBpbiBhc3BlY3Q6IFwiUGFzc3dvcmRcIiBpcyBzdGlsbCByZXF1aXJlZCB0byBsb2cgaW4uCi0KLSAtIFRoZSBcIkhlbHBcIiBidXR0b24gc2hvd3MgdGhpcyBoZWxwIHRleHQuCi0gICAKLSAtIFRoZSBcIkFkdmFuY2VkIC4uLlwiIGJ1dHRvbiByZXBsYWNlcyB0aGUgUHJvcGVydGllcyBkaWFsb2cgd2l0aCB0aGUgZnVsbAotICAgdGt4MTF2bmMgR1VJLiAgQWxsIGR5bmFtaWMgc2V0dGluZ3MgY2FuIGJlIG1vZGlmaWVkIGluIHRoZSBmdWxsIEdVSS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Eb24ndCBMb2NrIFlvdXJzZWxmIE91dDoKLQotICAgSWYgeW91IGFyZSBzaXR0aW5nIGF0IHRoZSBwaHlzaWNhbCBYIGRpc3BsYXkgeW91IGNhbm5vdCBnZXQgaW50byB0b28KLSAgIG11Y2ggdHJvdWJsZSBzZXR0aW5nIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZyB2YWx1ZXMuCi0KLSAgIEhvd2V2ZXIgSUYgeW91IGFyZSB1c2luZyBhIFZOQyBWaWV3ZXIgdG8gUkVNT1RFTFkgYWNjZXNzIHRoZSBYIGRpc3BsYXkKLSAgIHNvbWUgaXRlbXMgaW4gdGhlIFByb3BlcnRpZXMgZGlhbG9nIGNhbiBsb2NrIHlvdSBvdXQgb2YgZnVydGhlciBhY2Nlc3M6Ci0KLSAgICAgIFwiQWNjZXB0IENvbm5lY3Rpb25zXCIgIGlmIHlvdSBkaXNhYmxlIHRoaXMgcmVtb3RlbHksIGFuZAotICAgICAgYWNjaWRlbnRhbGx5IGRpc2Nvbm5lY3QgeW91ciBWTkMgdmlld2VyIHRoZW4geW91IHdpbGwgbm90IGJlCi0gICAgICBhYmxlIHRvIHJlY29ubmVjdC4KLSAgIAotICAgICAgXCJBc2sgZm9yIENvbmZpcm1hdGlvblwiICBpZiB5b3UgZW5hYmxlIHRoaXMgb25seSBzb21lb25lCi0gICAgICBzaXR0aW5nIGF0IHRoZSBYIGRpc3BsYXkgY2FuIGNvbmZpcm0gYW55IG5ldyBWTkMgY29ubmVjdGlvbnMuCi0gICAgICBGdXJ0aGVybW9yZSwgYW55IGN1cnJlbnQgVk5DIHZpZXdlcnMgd2lsbCBiZSBibG9ja2VkIHdoaWxlCi0gICAgICB3YWl0aW5nIGZvciB0aGUgY29uZmlybWF0aW9uICh0aW1lcyBvdXQgaW4gMTIwIHNlYyBieSBkZWZhdWx0KS4gCi0gICAKLSAgICAgIFwiQWxsIENsaWVudHMgVmlld09ubHlcIiAgaWYgeW91IGVuYWJsZSB0aGlzIHJlbW90ZWx5LCB3ZWxsCi0gICAgICB5b3UgY2FuIG5vIGxvbmdlciBwcm92aWRlIGlucHV0IHRvIGRpc2FibGUgaXQuCi0gICAKLSAgIElmIHlvdSBkbyBsb2NrIHlvdXJzZWxmIG91dCB5b3UgY291bGQgbG9nIGluIHJlbW90ZWx5IGFuZCBzdGFydCB1cAotICAgYSBzZWNvbmQgeDExdm5jIGFuZCBjb25uZWN0IHRvIHRoYXQgb25lIHRvIHRyeSB0byBmaXggdGhpbmdzIGluIHRoZQotICAgZmlyc3Qgb25lLgotCi0gICBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIHgxMXZuYydzIG9uIHRoZSBzYW1lIGRpc3BsYXkgdGhlCi0gICB1c2Ugb2YgdGhlIEdVSSBtYXkgYmUgaWxsLWJlaGF2ZWQuICBUZXJtaW5hdGUgdGhlIHNlY29uZCB4MTF2bmMgYXMKLSAgIHNvb24gYXMgeW91IGhhdmUgZml4ZWQgdGhlIHNldHRpbmcgaW4gdGhlIGZpcnN0IG9uZS4gIFVzZSBvZiBhIHJlbW90ZQotICAgY29udHJvbCBjb21tYW5kLCBlLmcuIFwieDExdm5jIC1SIG5vdmlld29ubHlcIiBvciBcIngxMXZuYyAtUiB1bmxvY2tcIgotICAgaXMgYSBnb29kIHdheSB0byBhdm9pZCB0aGlzIHByb2JsZW0uCi0iCi0KLQlzZXQgaGVscHRleHQoYWxsKSAkaGVscGFsbAotCi0Jc2V0IGhlbHB0ZXh0KE1pc2MtVHVuaW5nOikgIgoteDExdm5jIGhhcyB3aGF0IHNlZW1zIGxpa2UgaHVuZHJlZHMgb2YgdHVuaW5nIHBhcmFtZXRlcnMhICBJbiB0aGlzCi1zdWItbWVudSB3ZSBwbGFjZSBzb21lIGxlc3NlciB1c2VkIG9uZXMuICBNb3N0IGxpa2VseSB5b3UnbGwgd2FudCB0bwotbGVhdmUgdGhlbSBhdCB0aGVpciBkZWZhdWx0IHZhbHVlcywgYnV0IHlvdSBjYW4gdHJ5IHRoZW0gb3V0IHF1aWNrbHkKLXdpdGggdGhlIGd1aSB0byBzZWUgaWYgdGhleSBpbXByb3ZlIHRoaW5ncy4KLSIKLQotCXNldCBoZWxwdGV4dChQYXNzd29yZHM6KSAiCi1UaGUgaXRlbXMgaW4gdGhpcyBzdWItbWVudSBwZXJ0YWluIHRvIHNldHRpbmcgcGFzc3dvcmRzLiAgTm90ZSB0aGF0IHgxMXZuYwotaGFzIHR3byB0eXBlcyBvZiBwYXNzd29yZCBmaWxlczogUmVhbFZOQy1zdHlsZSBvbmVzICh5b3UgY2FuIGNyZWF0ZSB0aGVtCi13aXRoIHgxMXZuYyAtc3RvcmVwYXNzd2Qgb3Igb3RoZXIgVk5DIHV0aWxpdHkgcHJvZ3JhbSkgeW91IHVzZSB0aGVzZQotdmlhIC1yZmJhdXRoOyBhbmQgcGxhaW4tdGV4dCBmaWxlIHBhc3N3b3JkcyB5b3UgdXNlIHZpYSAtcGFzc3dkZmlsZS4KLQotTm9ybWFsbHkgcGFzc3dvcmRzIGNhbm5vdCBiZSBjaGFuZ2VkIGJ5IHJlbW90ZS1jb250cm9sIChlLmcuIHRoZSBndWkpLAotYnV0IGZvciB0aGUgY2FzZSBvZiB0aGUgXCJJY29uXCIgYW5kIFwiVHJheVwiIG1vZGVzIHRoaXMgY29uc3RyYWludCBoYXMKLWJlZW4gcmVsYXhlZC4KLQotSW4gbmVpdGhlciB0aGUgUmVhbFZOQy1zdHlsZSBub3IgdGhlIHBsYWluLXRleHQgZmlsZSBjYXNlcyBzaG91bGQgdGhlCi1wYXNzd29yZCBmaWxlcyBiZSByZWFkYWJsZSBieSB1c2VycyB5b3UgZG8gbm90IHdhbnQgdG8gYWNjZXNzIHRoZSBWTkMKLXNlcnZlci4gIENvbnRyYXJ5IHRvIHBvcHVsYXIgYmVsaWVmLCB0aGUgIFJlYWxWTkMtc3R5bGUgcGFzc3dvcmRzIGFyZQotbm90IGVuY3J5cHRlZCwgbWVyZWx5IG9ic2N1cmVkLgotCi14MTF2bmMgaGFzIHRoZSBldmVuIGxlc3Mgc2VjdXJlIC1wYXNzd2QgYW5kIC12aWV3cGFzc3dkIHN1cHBsaWVkIG9uCi10aGUgY29tbWFuZCBsaW5lLiAgQmUgY2FyZWZ1bCB3aXRoIHRoZXNlIHNpbmNlIHRoZXkgY291bGQgYmUgcmVhZCBieQotdXNlcnMgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGUgcHMoMSkgY29tbWFuZC4gIE9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMKLXgxMXZuYyB0cmllcyB0byBxdWlja2x5IG92ZXJ3cml0ZSB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgYnV0IGl0IGRvZXNuJ3QKLXdvcmsgZXZlcnl3aGVyZS4KLQotUmVnYXJkaW5nIFZpZXdPbmx5IHBhc3N3b3JkcyAod2hlcmUgYSBWTkMgY2xpZW50IHVzaW5nIHRoYXQgcGFzc3dvcmQKLWNhbiBvbmx5IHdhdGNoIHRoZSBzY3JlZW4sIG5vdCBpbnRlcmFjdCB3aXRoIGl0KSwgdGhpcyBpcyBub3QgYXZhaWxhYmxlCi13aXRoIC1yZmJhdXRoLCBidXQgb25seSB3aXRoIC1wYXNzd2RmaWxlLCAtcGFzc3dkLCBhbmQgLXZpZXdwYXNzd2QuCi0iCi0KLQlzZXQgaGVscHRleHQoU1NMOikgIgotSW4gdGhpcyBzdWItbWVudSB3ZSBwcm92aWRlIHRoZSBvcHRpb25zIHJlbGF0ZWQgdG8gU1NMIGVuY3JweXRpb24KLWFuZCBhdXRoZW50aWNhdGlvbi4KLQotVGhlcmUgaXMgYSBidWlsdC1pbiBtb2RlICgtc3NsKSB1c2luZyB0aGUgT3BlblNTTCBsaWJyYXJ5LCBhbmQgYSAybmQKLXVzaW5nIHRoZSBleHRlcm5hbCBzdHVubmVsIHByb2dyYW0gKC1zdHVubmVsLCB0aGF0IG5lZWRzIHRvIGJlIGluc3RhbGxlZAotb24gdGhlIHN5c3RlbSkuICBFaXRoZXIgbWF5IHJlcXVpcmUgb3IgYmVuZWZpdCBmcm9tIGhhdmluZyBQRU0gY2VydGlmaWNhdGUKLWZpbGVzIHNwZWNpZmllZC4KLQotIgotCi0Jc2V0IGhlbHB0ZXh0KE1pc2MtUGVybXM6KSAiCi1JbiB0aGlzIHN1Yi1tZW51IHdlIHByb3ZpZGUgc29tZSBsZXNzZXIgdXNlZCBwZXJtaXNzaW9uIG9wdGlvbnMuCi0KLVJlZ2FyZGluZyAtYWx3YXlzc2hhcmVkLCAtbmV2ZXJzaGFyZWQsIGFuZCAtZG9udGRpc2Nvbm5lY3QsIHlvdSBwcm9iYWJseQotc2hvdWxkIG5ldmVyIHVzZSB0aGVtIGFuZCBqdXN0IHVzZSB4MTF2bmMncyAtc2hhcmVkIGFuZCAtZm9yZXZlciBvcHRpb25zCi1pbnN0ZWFkICh0aGVzZSBnaXZlIGJhc2ljYWxseSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFuZCBpZiB5b3UgbWl4ZWQKLXRoZW0gdG9vIG11Y2ggdW5leHBlY3RlZCB0aGluZ3MgbWF5IGhhcHBlbikuCi0iCi0jJwotCi0Jc2V0IGhlbHB0ZXh0KEFscGhhQmxlbmRpbmc6KSAiCi1JbiB0aGlzIHN1Yi1tZW51IHdlIHByb3ZpZGUgc29tZSB0d2VhayBwYXJhbWV0ZXJzIGZvciBjdXJzb3JzIChsaXR0bGUKLWljb24gYXQgdGhlIG1vdXNlIHBvaW50ZXIpIHRoYXQgaGF2ZSB0cmFuc3BhcmVuY3kgKGkuZS4gYW4gQWxwaGEgY2hhbm5lbAotaW4gYWRkaXRpb24gdG8gUmVkLCBHcmVlbiwgYW5kIEJsdWUgUkdCIGNoYW5uZWxzKS4gIEZvciB0aGVzZSBjdXJzb3JzLAotc29tZSBvZiB0aGUgZ3JhcGhpY3MgdW5kZXJuZWF0aCB0aGUgY3Vyc29yIGlzIGFsbG93ZWQgdG8gYmUgYmxlbmRlZCBpbjoKLWUuZy4gYSBkcm9wLXNoYWRvdyAoYSB0ZXJyaWJsZSBlZmZlY3QgSU1OU0hPKS4KLQotQWxwaGFCbGVuZGluZyBmb3IgeDExdm5jIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIFhGSVhFUyBYIGV4dGVuc2lvbiBpcwotcHJlc2VudCAoc2luY2Ugb3RoZXJ3aXNlIGl0IGNhbm5vdCBzZWUgdGhlIGN1cnNvcnMgYXQgYWxsIGFuZCBzbyBhcHBsaWVzCi1oZXVyaXN0aWNzIHRvIHNob3cgc29tZSBmYWtlIGN1cnNvcnMpLiAgQWxwaGFCbGVuZGluZyBpcyBvbmx5IGEgcHJvYmxlbQotd2l0aCB4MTF2bmMgd2hlbiB0aGUgY3Vyc29ycyBhcmUgbm90IG9wYXF1ZS4KLQotT3BhcXVlIGN1cnNvcnMgKGUuZy4gYml0bWFwIG9yIHNpbXBseSBjb2xvcmVkIGN1cnNvcikgYXJlIHJlbmRlcmVkCi1jb3JyZWN0bHkgYnkgeDExdm5jLiAgT25seSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeSBkb2VzIHgxMXZuYyBoYXZlCi10byBtYWtlIHNvbWUgYXBwcm94aW1hdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGN1cnNvciB0byBiZSBvcGFxdWUgKHRoZQotVk5DIHByb3RvY29sIGRvZXMgbm90IHByb3ZpZGUgZm9yIGFuIGFscGhhIGNoYW5uZWwgaW4gY3Vyc29ycywgb25seSBSR0IpLgotCi1UaGUgaXRlbXMgaW4gdGhpcyBzdWItbWVudSBsZXQgeW91IHR3ZWFrIHgxMXZuYydzIGFwcHJveGltYXRpb24gc2NoZW1lCi1mb3IgY3Vyc29ycyB3aXRoIHRyYW5zcGFyZW5jeS4gIEhvcGVmdWxseSB5b3Ugd29uJ3QgaGF2ZSB0byB1c2UgdGhlbS4KLUNlcnRhaW4gY3Vyc29yIFwidGhlbWVzXCIgbWF5IHJlcXVpcmUgYWRqdXN0bWVudCBob3dldmVyLgotIgotIycKLQlzZXQgaGVscHRleHQoT3ZlcmxheVZpc3VhbHM6KSAiCi1JbiB0aGlzIHN1Yi1tZW51IGFyZSBzb21lIG9wdGlvbnMgdGhhdCBpbnZvbHZlIGZpeGluZyBjb2xvciBwcm9ibGVtcwotZm9yIFwiT3ZlcmxheVwiIG9yIFwiTXVsdGktRGVwdGhcIiB2aXN1YWxzLiAgVGhpcyBwcm9ibGVtIGlzIHJhcmUKLXNpbmNlIG92ZXJsYXkgYW5kIG11bHRpLWRlcHRoIHZpc3VhbCB2aWRlbyBoYXJkd2FyZSBpcyByYXJlLiAKLVNvbWUgU3VuLCBTR0ksIGFuZCBIUCBtYWNoaW5lcyBhcmUga25vd24gdG8gaGF2ZSB0aGVtLgotCi1UaGUgc2hvcnQgYW5zd2VyIGlzIGlmIHlvdSBoYXZlIGEgbXVsdGktZGVwdGggdmlzdWFsIGRpc3BsYXkgKGUuZy4gIDggYW5kCi0yNCBiaXRzKSwgYW5kIHlvdSBzZWUgbWVzc2VkIHVwIGNvbG9ycyBpbiB4MTF2bmMgdHJ5IHRoZSBcIi1vdmVybGF5XCIKLW9wdGlvbiBvbiBTb2xhcmlzIG9yIElSSVguCi0KLUEgYnJpZWYgQmFja2dyb3VuZCBvbiBwaXhlbHMsIGNvbG9yLCBhbmQgdmlzdWFsczoKLQotICAgUGl4ZWxzIChwaWN0dXJlIGVsZW1lbnRzKSBhcmUga2VwdCBpbiB2aWRlbyBtZW1vcnkgYXMgYSBjZXJ0YWluIG51bWJlcgotICAgb2YgYml0cy1wZXItcGl4ZWwgKGJwcCkuICBNb3N0IGNvbW1vbiBhcmUgOGJwcCwgMTZicHAsIGFuZCAzMmJwcC4KLSAgIExlc3MgY29tbW9uIGFyZSAyNGJwcCwgNGJwcCwgYW5kIDFicHAgKG1vbm9jaHJvbWUpLgotCi0gICBIb3cgcGl4ZWwgdmFsdWVzIChpLmUuIHZhbHVlcyBvZiB0aGUgYml0cykgYXJlIHJlbmRlcmVkIGludG8gY29sb3JzIG9uCi0gICB0aGUgc2NyZWVuIGNhbiBiZSBkb25lIHZpYSBkaWZmZXJlbnQgXCJSZWNpcGVzXCIuICBUaGVzZSBkaWZmZXJlbnQKLSAgIHJlY2lwZXMgYXJlIHJlZmVycmVkIHRvIGFzIFwidmlzdWFsc1wiLiAgRS5nLiBmb3IgOGJwcCB0aGVyZSBpcwotICAgYSBQc2V1ZG9Db2xvciB2aXN1YWwgdGhhdCBtYWludGFpbnMgYSBtYXBwaW5nICh0aGF0IGNhbiBiZSBjaGFuZ2VkCi0gICBkeW5hbWljYWxseSkgb2YgdGhlIHBpeGVsIHZhbHVlcyAoMjU2IHBvc3NpYmxlIG9uZXMpIGludG8gUkdCIHZhbHVlcy4KLSAgIE90aGVyIDhicHAgdmlzdWFscywgZS5nLiBTdGF0aWNHcmV5IGFuZCBUcnVlQ29sb3IgaGF2ZSBmaXhlZCwgcmVndWxhcgotICAgbWFwcGluZ3MgYW5kIHNvIHByb3ZpZGUgbGVzcyB2YXJpYXRpb24gaW4ga2luZHMgb2YgY29sb3JzLgotCi0gICBBIHZpc3VhbCdzIFwiZGVwdGhcIiBpcyBob3cgbWFueSBvZiB0aGUgcGl4ZWxzIGFyZSB1c2VkIGluIHRoZQotICAgYWN0dWFsIHJlY2lwZS4gIFRoaXMgbWF5IHNvdW5kIHdhc3RlZnVsIChpLmUuIG5vdCB1c2luZyBzb21lIG9mIHRoZQotICAgYml0cyksIGJ1dCBmb3IgMzJicHAgKDQgYmlsbGlvbiBjb2xvcnMpIHRoYXQgaXMgdG9vIG11Y2ggYW5kIG5lYXJseQotICAgYWx3YXlzIG9ubHkgMjQgZm9yIHRoZW0gYXJlIHVzZWQuICBUaGUgbW9zdCBjb21tb24gVmlzdWFsIHNlZW1zIHRvCi0gICBiZSBkZXB0aCAyNCBUcnVlQ29sb3IgYXQgMzJicHAuICBUaGlzIHByb3ZpZGVzIDE2IG1pbGxpb24gY29sb3JzCi0gICB3aGljaCBpcyBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBwaXhlbHMgb24gbW9zdCBzY3JlZW5zICgxMjgweDEwMjQgPQotICAgMS4zIG1pbGxpb24gcGl4ZWxzKS4gIEFub3RoZXIgc29tZXRpbWVzIHVzZWQgdmlzdWFsIHRoYXQgaWdub3JlcyBzb21lCi0gICBiaXRzIGlzIGRlcHRoIDE1IFRydWVDb2xvciBhdCAxNmJwcC4KLQotT0ssIG5vdywgZmluYWxseSwgdG8gdGhlIE92ZXJsYXkgVmlzdWFscy4gIFNvbWUgaGFyZHdhcmUgKG9yIHNvZnR3YXJlCi1lbXVsYXRpb25zKSBhbGxvdyBkaWZmZXJlbnQgZGVwdGggdmlzdWFscyB0byBiZSB1c2VkIG9uIHRoZSBkaXNwbGF5Ci1hdCB0aGUgc2FtZSB0aW1lLiAgVGhlIHBpeGVscyBvZiB3aW5kb3dzIHVzaW5nIGRpZmZlcmVudCBkZXB0aCB2aXN1YWxzCi1tYXkgb3ZlcmxhcC4KLQotVGhlIG1vc3QgY29tbW9uIHNlZW1zIHRvIGJlIGJvdGggOCBhbmQgMjQgZGVwdGggdmlzdWFscyBvbiBhIDMyYnBwIHNldHVwLgotMjQgb2YgdGhlIHBpeGVscyBjYW4gYmUgdXNlZCBmb3Igb25lIHZpc3VhbCBhbmQgdGhlIHJlbWFpbmluZyA4IGZvciB0aGUKLW90aGVyLiAgVGhpcyBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgXCI4KzI0XCIgbW9kZS4gIEZ1cnRoZXJtb3JlLAotYSBzcGVlZHVwIGlzIGFjaGlldmVkIGJlY2F1c2Ugd3JpdGluZyBncmFwaGljcyBkYXRhIHRvLCBzYXksIHRoZSA4Yml0Ci12aXN1YWwgZG9lcyBub3QgZGVzdHJveSB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgMjRiaXQgdmlzdWFsLiAgRXZpZGVudGx5Ci1wb3B1cCBtZW51cyBjYW4gYmUgZG9uZSB2ZXJ5IHF1aWNrbHkgdGhpcyB3YXk6IHRoZXkgdXNlIHRoZSA4Yml0IHZpc3VhbAotYW5kIHdoZW4gdGhlIHBvcHVwIGdvZXMgYXdheSB0aGUgZ3JhcGhpY3MgZGF0YSBpbiB0aGUgMjRiaXQgdmlzdWFsIGlzCi1pbW1lZGlhdGVseSByZWV4cG9zZWQgd2l0aG91dCBoYXZpbmcgdGhlIGFwcGxpY2F0aW9uIHJlZHJhdyBpdC4KLQotQWxzbywgc29tZSBsZWdhY3kgYXBwbGljYXRpb25zIGNhbiBvbmx5IHVzZSA4YnBwIHZpc3VhbHMuICBCdXQgaW4gdGhlc2UKLWRheXMgb2YgaGlnaCBjb2xvciBncmFwaGljcyBhbmQgd2ViIGJyb3dzZXJzIG9uZSB3b3VsZCBsaWtlIHRoZSByZXN0Ci1vZiB0aGUgZGVza3RvcCB0byB1c2UgZGVwdGggMjQgdmlzdWFscy4gIFRoZXkgb2Z0ZW4gd29yayBvbiB0aGUgbXVsdGkKLWRlcHRoIHZpc3VhbHMuCi0KLUhvdyBkb2VzIHRoaXMgZWZmZWN0IHgxMXZuYz8gIHgxMXZuYyBuZWFybHkgYWx3YXlzIHBvbGxzIHRoZSByb290IHdpbmRvdwotKGNvbnRhaW5lciBvZiBhbGwgb3RoZXIgd2luZG93cykuICBUaGUgcm9vdCB3aW5kb3cgd2lsbCBiZSBvbmUgZGVwdGgsCi1lLmcuIDggb3IgMjQuICBBbnkgd2luZG93cyB1c2luZyB0aGUgKm90aGVyKiBkZXB0aCB3aWxsIGFwcGVhciB0byBoYXZlCi1tZXNzZWQgdXAgY29sb3JzIChvciBqdXN0IGJlIGJsYWNrIG9yIHNvbWUgb3RoZXIgc29saWQgY29sb3IpIHdoZW4gdmlld2VkCi12aWEgeDExdm5jLgotCi1Ib3cgdG8gZml4PyAgU29sYXJpcyBhbmQgSVJJWCBwcm92aWRlIGFuIEFQSSB0byBleHRyYWN0IHRoZSBmdWxsIHNuYXBzaG90Ci1vZiB0aGUgZGlzcGxheSB3aXRoIGFsbCB0aGUgY29sb3JzIGNvcnJlY3QuICBJdCBjb21lcyB0byB4MTF2bmMgYXMgZGVwdGgKLTI0IFRydWVDb2xvci4gIFRvIGVuYWJsZSB0aGlzIHVzZSB0aGUgXCItb3ZlcmxheVwiIG9wdGlvbi4gIFBlcmZvcm1hbmNlCi1tYXkgYmUgc2xvd2VyLCBidXQgaWYgdGhlIGNvbG9ycyBhcmUgY29ycmVjdCB0aGF0IGlzIGEgYmlnIGltcHJvdmVtZW50LgotIgotCi0Jc2V0IGhlbHB0ZXh0KDgtQml0LUNvbG9yOikgIgotU29tZSBvbGRlciBkaXNwbGF5cyAoZS5nLiB3aXRoIGxpbWl0ZWQgVmlkZW8gUkFNKSB1c2UgOCBiaXRzLXBlci1waXhlbAotY29sb3IuICBUaGlzIGFsbG93cyBmb3Igb25seSAyNTYgZGlmZmVyZW50IGNvbG9ycyBvbiB0aGUgc2NyZWVuIGF0IHRoZQotc2FtZSB0aW1lLiAgVGhpcyBzb21ldGltZXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCB2aWV3aW5nIHRoZXNlIDhicHAKLWRpc3BsYXlzIHZpYSB4MTF2bmMuICBUaGlzIHN1Yi1tZW51IGhhcyBzb21lIG9wdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvCi13b3JrYXJvdW5kcyBmb3IgdGhpcyBjYXNlLiAgSWYgeW91IGNhbiBjb25maWd1cmUgdGhlIG1hY2hpbmUgdG8gdXNlIDE2YnBwCi1pdCBtYXkgYmUgd29ydGggaXQgdG8gYXZvaWQgdGhlIGNvbG9yIHByb2JsZW1zIChlLmcuIGNvbG9yIGZsYXNoaW5nCi1hcyB0aGUgOGJpdCBjb2xvcm1hcCBpcyBzd2l0Y2hlZCkuCi0iCi0Jc2V0IGhlbHB0ZXh0KFN1YldpbmRvdzopICIKLVRoaXMgc3ViLW1lbnUgaGFzIGEgY291cGxlIG9wdGlvbnMgcmVnYXJkaW5nIGhhdmluZyB4MTF2bmMgcG9sbCBhIAotc2luZ2xlIHdpbmRvdywgbm90IHRoZSBlbnRpcmUgZGlzcGxheS4gIFRoaXMgd2F5IGp1c3QgdGhlIHdpbmRvdwotaXMgc2hhcmVkLgotCi1Ob3RlIGlmIHRoZSBhcHBsaWNhdGlvbiBwb3BzIHVwIG11bHRpcGxlIHdpbmRvd3MgdGhleSBhcmUgbm90IHRyYWNrZWQKLWFuZCBzaGFyZWQuICBTbyB0aGlzIGlzIG5vdCBhcHBsaWNhdGlvbiBzaGFyaW5nLiAgVGhlIGFwcGxpY2F0aW9uIGhhcyB0bwotYmUgdmVyeSBzaW1wbGUgKGUuZy4gYSBzaW1wbGUgdGVybWluYWwgb3IgdGhlIGltYWdlIHdpbmRvdyBvbiBhIHdlYmNhbSkKLWZvciB0aGlzIG1vZGUgdG8gYmUgdXNhYmxlLgotIgotCXNldCBoZWxwdGV4dChSZXNpemVSb3RhdGU6KSAiCi1UaGlzIHN1Yi1tZW51IGhhcyBzb21lIG9wdGlvbnMgcmVnYXJkaW5nIHNjcmVlbnMgdGhhdCBzdXBwb3J0IHRoZSBYCi1SZXNpemUsIFJlZmxlY3Rpb24sIGFuZCBSb3RhdGlvbiBFeHRlbnNpb24gKFJBTkRSKSwgYW5kIG9uZSBleHBlY3RzIHNjcmVlbgotcmVzaXppbmcsIHJlZmxlY3Rpb24sIG9yIHJvdGF0aW9uIHRvIHRha2UgcGxhY2UgZHVyaW5nIHRoZSB4MTF2bmMgc2Vzc2lvbi4KLVRoaXMgaXMgcHJldHR5IHJhcmUsIGJ1dCB4MTF2bmMgc2VlbXMgdG8gaGFuZGxlIGl0IHJlYXNvbmFibHkgd2VsbCB1c2luZwotdGhpcyBYIGV4dGVuc2lvbi4KLQotVGhpcyBtb2RlIGlzIG9uIGJ5IGRlZmF1bHQgaW4gLWlkIG1vZGUgdG8gdHJ5IHRvIHRyYWNrIHRoZSBjaGFuZ2luZwotc2l6ZSBvZiB0aGUgU3ViV2luZG93LiAgSXQgaXMgbm90IG9uIGJ5IGRlZmF1bHQgZm9yIGZ1bGwtc2NyZWVuIG1vZGUKLWJlY2F1c2Ugb2YgdGhlIGV4dHJhIG92ZXJoZWFkLCBldGMuCi0iCi0KLQlzZXQgaGVscHRleHQoV2lyZUZyYW1lOikgIgotVGhpcyBzdWItbWVudSBoYXMgc29tZSBvcHRpb25zIGZvciB0aGUgeDExdm5jIHdpcmVmcmFtaW5nIHNwZWVkdXAgc2NoZW1lLgotCi1Gb3IgeDExdm5jLCBXaXJlZnJhbWluZyBtZWFucyB0byB3YXRjaCBmb3IgdG9wbGV2ZWwgd2luZG93cyBiZWluZyBPcGFxdWVseQotTW92ZWQgb3IgUmVzaXplZC4gIFdoZW4geDExdm5jIGRldGVjdHMgdGhpcywgaXQgc3RvcHMgcG9sbGluZyB0aGUgc2NyZWVuCi1hbmQgc2ltcGx5IHNob3dzIGEgXCJ3aXJlZnJhbWVcIiBvdXRsaW5lIG9mIHRoZSB3aW5kb3cgYXMgaXQgaXMgYmVpbmcKLW1vdmVkIG9yIHJlc2l6ZWQuICBUaGlzIGF2b2lkcyBcInNjcmVlbiBwb2xsaW5nIHRocmFzaGluZ1wiIHdoZW4gdGhlCi1zY3JlZW4gaXMgY2hhbmdpbmcgc28gcmFwaWRseSBkdXJpbmcgdGhpcyBwZXJpb2QuICBGb3IgdmFyaW91cyByZWFzb25zCi10aGlzIGlzIHVzdWFsbHkgbXVjaCBmYXN0ZXIgdGhlbiBsZXR0aW5nIHRoZSB3aW5kb3cgbWFuYWdlciBkbyBpdHMKLW93biB3aXJlZnJhbWluZyAoeW91IGFyZSBlbmNvdXJhZ2VkIHRvIGRvIE9wYXF1ZSBtb3ZlcyBhbmQgcmVzaXplcwotd2hlbiB1c2luZyB4MTF2bmMhKQotCi1BbHNvLCBvbmNlIGEgbW92ZWQgd2luZG93IGlzIHJlbGVhc2VkIGluIGl0cyBuZXcgcG9zaXRpb24sIHgxMXZuYyB1c2VzCi10aGUgVk5DIENvcHlSZWN0IGVuY29kaW5nIHRvIHZlcnkgZWZmaWNpZW50bHkgdXBkYXRlIHRoZSBWTkMgdmlld2VycwotKGVhY2gganVzdCBjb3BpZXMgdGhlIGltYWdlIGRhdGEgbG9jYWxseSkuCi0KLVRoaXMgc29ydCBvZiBzY2hlbWUgd2FzIHVzZWQgbXVjaCBpbiB0aGUgMTk5MCdzIG9uIGxvY2FsIGRpc3BsYXlzIGJlY2F1c2UKLXZpZGVvIGhhcmR3YXJlIHdhcyBzbG93IGF0IHRoZSB0aW1lLiAgeDExdm5jIHRyaWVzIHRvIHVzZSB0aGlzIHNhbWUgdHJpY2sKLWFzIGEgc3BlZWR1cCBmb3IgaXRzIGFjdGl2aXRpZXMgKHRoZSBuZXR3b3JrIGlzIG11Y2ggc2xvd2VyIHRoYW4gdmlkZW8KLWhhcmR3YXJlIHdyaXRlcywgYW5kIHRoZSB2aWRlbyBoYXJkd2FyZSByZWFkcyB0aGF0IHgxMXZuYyB1c2VzIHRvIHBvbGwKLXRoZSBzY3JlZW4gYXJlIHN0aWxsIHNsb3cgdG9kYXkpLgotIgotIyciCi0KLQlzZXQgaGVscHRleHQoU2FmZTopICIKLUluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgbWFraW5nIHgxMXZuYyBvcGVyYXRpb25zCi1tb3JlLCBvciBsZXNzLCBzYWZlLiAgRS5nLiBkaXNhYmxlIHRoZSBydW5uaW5nIG9mIGV4dGVybmFsIGNvbW1hbmRzLCBldGMuCi0KLVlvdSBjYW4gYWxzbyB0dXJuIG9mZiB0aGUgUmVtb3RlIGNvbnRyb2wgY2hhbm5lbCAoTk9URSB0aGF0IGRvaW5nIHRoYXQKLXdpbGwgZGlzYWJsZSB0aGUgR1VJIGZyb20gYmVpbmcgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHgxMXZuYykuCi0iCi0KLQlzZXQgaGVscHRleHQoWC1leHQ6KSAiCi1JbiB0aGlzIHN1Yi1tZW51IGFyZSBhIGZldyByYXJlbHkgdXNlZCBvcHRpb25zIHJlZ2FyZGluZyBzb21lIFggZXh0ZW5zaW9ucwotdXNlZCBieSB4MTF2bmMuCi0iCi0Jc2V0IGhlbHB0ZXh0KENsaXBwaW5nOikgIgotSW4gdGhpcyBzdWItbWVudSBhcmUgc29tZSBvcHRpb25zIHJlZ2FyZGluZyBjbGlwcGluZyBvciBibGFja2luZyBvdXQKLXBvcnRpb25zIG9mIHRoZSBTY3JlZW4uICBFLmcuIHVuZGVyIFhJTkVSQU1BIHdoZW4gdGhlIG11bHRpcGxlIG1vbml0b3JzCi1hcmUgbm90IHRoZSBzYW1lIHNpemUuCi0KLSIKLQlzZXQgaGVscHRleHQoTWlzYy1TY3JlZW46KSAiCi1JbiB0aGlzIHN1Yi1tZW51IGFyZSBzb21lIGxpdHRsZSB1c2VkIG9wdGlvbnMgbW9kaWZ5aW5nIGFzcGVjdHMgb2YKLXRoZSBzY3JlZW4gc291cmNlLgotIgotCi0Jc2V0IGhlbHB0ZXh0KFNldHRpbmdzOikgIgotSW4gdGhpcyBzdWItbWVudSBhcmUgc29tZSBvcHRpb25zIGZvciBzYXZpbmcgYW5kIGxvYWRpbmcgb3B0aW9uIHNldHRpbmdzLgotVGhlIGRlZmF1bHQgZmlsZSB0byBzdG9yZSBzZXR0aW5ncyBpbiBpcyB+Ly54MTF2bmNyYywgYnV0IHlvdSBjYW4gc2F2ZQotZGlmZmVyZW50IFwicHJvZmlsZXNcIiBpbiBvdGhlciBmaWxlcyBmb3IgbGF0ZXIgdXNlLgotCi0iCi0Jc2V0IGhlbHB0ZXh0KEphdmEtYXBwbGV0OikgIgotSW4gdGhpcyBzdWItbWVudSBhcmUgc29tZSBvcHRpb25zIGZvciBydW5uaW5nIHRoZSBidWlsdC1pbiBIVFRQIHNlcnZlcgotdGhhdCBkZWxpdmVycyB0aGUgVGlnaHRWTkMgSmF2YSBWTkMgVmlld2VyIGFwcGxldCAoVm5jVmlld2VyLmphcikgdG8KLWNsaWVudHMuICBUaGUgdmlld2VyIHJ1bnMgaW4gdGhlaXIgV2ViIGJyb3dzZXIuCi0KLVRoZSBkZWZhdWx0IHBvcnQgbGlzdGVuZWQgb24gaXMgNTgwMCwgc28gdGhlIFVSTCBpcyB0eXBpY2FsbHk6Ci0KLQlodHRwOi8vaG9zdG5hbWU6NTgwMC8KLQotYnV0IHRoaXMgY2FuIGJlIGFsdGVyZWQgYnkgLWh0dHBwb3J0LCBldGMuCi0iCi0KLQlzZXQgaGVscHRleHQoQ2hhdDopICIKLUluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgZW5hYmxpbmcgYSBsb2NhbCBjaGF0IHdpbmRvdwotYW5kIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIHRoZSBjdXJyZW50IGNoYXQuICBUaGlzIGlzIHRoZSBVbHRyYVZOQyAKLVRleHQgQ2hhdCBzdXBwb3J0IGluIHgxMXZuYy4KLSIKLQotCXNldCBoZWxwdGV4dChTY3JvbGxDb3B5UmVjdDopICIKLVRoaXMgc3ViLW1lbnUgaGFzIHNvbWUgb3B0aW9ucyBmb3IgdGhlIHgxMXZuYyBTY3JvbGwgZGV0ZWN0aW9uIGFuZAotQ29weVJlY3Qgc3BlZWR1cCBzY2hlbWUuCi0KLUZvciB0aGlzIG1vZGUsIHgxMXZuYyBcInNwaWVzXCIgb24gY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBYIHNlcnZlciBhbmQKLWFwcGxpY2F0aW9ucyB1c2luZyB0aGUgUkVDT1JEIGV4dGVuc2lvbi4gIEl0IGxvb2tzIGZvciB2YXJpb3VzIHBhdHRlcm5zCi10byBkZXRlY3QgYSBzY3JvbGxlZCB3aW5kb3cuICBUaGlzIG9ubHkgd29ya3MgZm9yIHNvbWUgYXBwbGljYXRpb25zLAotZm9ydHVuYXRlbHkgc29tZSBpbXBvcnRhbnQgb25lcy4KLQotT25jZSB0aGUgc2Nyb2xsIGlzIGRldGVjdGVkIGl0IHVzZXMgdGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZyBmb3IgYQotYmlnIHNwZWVkdXAuICBTY3JlZW4gcG9sbGluZyBpcyBhbHNvIHNwZWQgdXAgZm9yIHRoaXMgc2NoZW1lLgotCi1UaGVyZSBhcmUgbWFueSB0d2Vha2FibGUgcGFyYW1ldGVycyBmb3IgdGhpcyBtb2RlIGFuZCB0aGV5IGFyZSBkZXNjcmliZWQKLWluIHRoZSBzdWItbWVudSBpdGVtcy4KLSIKLQotCXNldCBoZWxwdGV4dChYREFNQUdFOikgIgotVGhlIERBTUFHRSBYIGV4dGVuc2lvbiBhbGxvd3MgdGhlIFggc2VydmVyIHRvIHNlbmQgc2lnbmFscyB0byB4MTF2bmMKLXRlbGxpbmcgaXQgd2hpY2ggcmVnaW9ucyBvZiB0aGUgc2NyZWVuIGhhdmUgYmVlbiBjaGFuZ2VkLiAgVGhpcyBpbXByb3ZlcwoteDExdm5jJ3MgcGVyZm9ybWFuY2UgbWFya2VkbHkuICBUaGUgREFNQUdFIGV4dGVuc2lvbiBtdXN0IGJlIGF2YWlsYWJsZQotb24gdGhlIGRpc3BsYXkgZm9yIHRoaXMgdG8gd29yay4KLQotVW5mb3J0dW5hdGVseSBEQU1BR0UgY2Fubm90IGJlIHRydXN0ZWQgY29tcGxldGVseSBmb3IgdGhlIGNoYW5nZWQgcmVnaW9ucywKLWJlY2F1c2Ugb2Z0ZW4gdGhlIHJlcG9ydGVkIGNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbAotY2hhbmdlZCByZWdpb25zLiAgTmV2ZXJ0aGVsZXNzLCB4MTF2bmMgdXNlcyB0aGUgREFNQUdFIGluZm9ybWF0aW9uIHZlcnkKLWVmZmVjdGl2ZWx5IGFzIGhpbnRzIHRvIGltcHJvdmUgaXRzIHBlcmZvcm1hbmNlLgotCi1UaGUgaXRlbXMgaW4gdGhlIHN1Yi1tZW51IGFsbG93IHR3ZWFraW5nIHgxMXZuYydzIERBTUFHRSBhbGdvcml0aG0uCi0iCi0KLQlzZXQgaGVscHRleHQoTmNhY2hlOikgIgotQSBzaW1wbGUgY2xpZW50LXNpZGUgKHZpZXdlcikgY2FjaGluZyBzY2hlbWUgaXMgZW5hYmxlZCB3aXRoIHRoZQotXCItbmNhY2hlIG5cIiBvcHRpb24uICBJdCBzaW1wbHkgdXNlcyBcIm5cIiBmcmFtZWJ1ZmZlciBzaXplZCBhcmVhcwotYmVsb3cgdGhlIGFjdHVhbCBkaXNwbGF5IGZvciBjYWNoaW5nIHdpbmRvdyBwaXhlbCBkYXRhLiAgCi0KLURyYXdiYWNrcyBhcmUgaXQgdXNlcyBhIGxvdCBvZiBSQU0gKHJvdWdobHkgbiB0aW1lcyBtb3JlKSwgYW5kIHRoZQotcGl4ZWxzIGNhY2hlIGFyZWEgaXMgdmlzaWJsZSBpbiB0aGUgdmlld2Vycy4KLQotVGhlIGl0ZW1zIGluIHRoZSBzdWItbWVudSBhbGxvdyB0d2Vha2luZyB4MTF2bmMncyAtbmNhY2hlIGFsZ29yaXRobS4KLSIKLQotCXNldCBoZWxwdGV4dChTaGFyZWRNZW1vcnk6KSAiCi1UaGlzIHN1Yi1tZW51IHByb3ZpZGVzIHNvbWUgb3B0aW9ucyByZWdhcmRpbmcgU1lTViBzaGFyZWQgbWVtb3J5IHVzYWdlCi0oc2htKSBieSB4MTF2bmMuICBVc3VhbGx5IHlvdSB3YW50IHNobSB0dXJuZWQgb24gYmVjYXVzZSB0aGUgeDExdm5jCi1wcm9jZXNzIGlzIG5lYXJseSBhbHdheXMgcnVubmluZyBvbiB0aGUgc2FtZSBtYWNoaW5lIHRoZSBYIHNlcnZlciBwcm9jZXNzCi1pcyBydW5uaW5nIG9uLiAgU2hhcmVkTWVtb3J5IGdpdmVzIGEgcGVyZm9ybWFuY2Ugc3BlZWR1cC4gIEhvd2V2ZXIsIGlmIHlvdQotbmVlZCB0byBtb2RpZnkgdGhpcyBzY2VuYXJpbyBmb3Igc3BlY2lhbCB1c2FnZSB0aGVzZSBvcHRpb25zIGFsbG93IHlvdSB0by4KLSIKLQotCXNldCBoZWxwdGV4dChNaXNjLURlYnVnOikgIgotVGhpcyBzdWItbWVudSBjb250YWlucyBhIGxvdCBvZiBkZWJ1Z2dpbmcgcGFyYW1ldGVycyB1c3VhbGx5IHVzZWQKLWZvciBkZWJ1Z2dpbmcgeDExdm5jIGl0c2VsZi4gIFRoaXMgaXMgdW5saWtlIHRoZSAtZGVidWdfcG9pbnRlciBhbmQKLS1kZWJ1Z19rZXlib2FyZCBvcHRpb25zIHRoYXQgYXJlIHVzZWZ1bCBpbiBsZWFybmluZyBpbmZvcm1hdGlvbiwgcXVpcmtzLAotZXRjLiBhYm91dCB5b3VyIGxvY2FsIGRpc3BsYXkgYW5kIGVudmlyb25tZW50LgotIgotCi0Jc2V0IGhlbHB0ZXh0KFNlbGVjdGlvbjopICIKLVRoaXMgc3ViLW1lbnUgY29udGFpbnMgc29tZSBvcHRpb25zIGNlbnRlcmluZyBhcm91bmQgdGhlIFNlbGVjdGlvbgotKGFsc28gcmVmZXJyZWQgdG8gYXMgdGhlIENsaXBib2FyZCwgQ3V0YnVmZmVycywgZXRjKS4gIHgxMXZuYyB3aWxsIHRyeQotdG8gZXhjaGFuZ2UgdGhlIHNlbGVjdGlvbnMgYmV0d2VlbiB0aGUgVk5DIHZpZXdlcnMgYW5kIHRoZSBYIHNlcnZlci4KLVlvdSBjYW4gYWRqdXN0IHRoYXQgYmVoYXZpb3Igd2l0aCB0aGVzZSBvcHRpb25zLgotIgotCi0Jc2V0IGhlbHB0ZXh0KFdpbmRvd1ZpZXcpICIKLVNldCB0aGUgV2luZG93IFZpZXcgTW9kZSBmb3IgdGhlIGd1aS4gIFRoZXJlIGFyZSB0aHJlZSBtb2RlczoKLQotICAtIGZ1bGw6ICBQcmVzZW50cyB0aGUgZnVsbCBndWkgKEFjdGlvbnMsIENsaWVudHMsIGV0YywgYnV0dG9ucywKLSAgICAgICAgICAgYW5kIHRoZSBUZXh0IGFyZWEgYW5kIFNldC9FbnRyeSBib3gpLgotCi0gIC0gaWNvbjogIFByZXNlbnRzIGEgc21hbGwgaWNvbiBpbnN0ZWFkIG9mIHRoZSBmdWxsIGd1aS4gIE1vdmluZwotICAgICAgICAgICB0aGUgbW91c2Ugb3ZlciBpdCBzaG93cyB0aGUgVk5DIGRpc3BsYXkgbmFtZSBhbmQgYW55Ci0gICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnRzLiAgQ2xpY2tpbmcgb24gdGhlIGljb24gcG9wcyB1cCBhIG1lbnUKLSAgICAgICAgICAgb2YgYWN0aW9ucyB0byBwZXJmb3JtLiAgQW1vbmcgdGhlbSBpcyBcIlByb3BlcnRpZXNcIiB0aGF0Ci0gICAgICAgICAgIGFsbG93cyBzZXR0aW5nIG1vcmUgcGFyYW1ldGVycy4gIENsaWNraW5nIG9uIFwiQWR2YW5jZWRcIgotICAgICAgICAgICBpbiBcIlByb3BlcnRpZXNcIiBicmluZ3MgdXAgdGhlIGZ1bGwgZ3VpLgotCi0gIC0gdHJheTogIEF0dGVtcHQgdG8gZW1iZWQgdGhlIHNtYWxsIGljb24gaW4gdGhlIHN5c3RlbSB0cmF5LiAgSWYKLSAgICAgICAgICAgdGhpcyBmYWlscyBpdCB3aWxsIHJlc29ydCB0byBpY29uIG1vZGUgd2hlcmUgdGhlIHNtYWxsIGljb24KLSAgICAgICAgICAgaXMgYSBzdGFuZGFsb25lIHdpbmRvdy4KLQotTm90ZSB0aGF0IGluIFwiZnVsbFwiIG1vZGUgaWYgeW91IGRlbGV0ZSB0aGUgZnVsbCBndWkgd2luZG93IHRoZSBndWkKLXRlcm1pbmF0ZXMgKGJ1dCB0aGUgeDExdm5jIHNlcnZlciBrZWVwcyBydW5uaW5nKS4gIEhvd2V2ZXIgdW5kZXIgXCJpY29uXCIKLW9yIFwidHJheVwiIG1vZGUgaWYgeW91IGJyaW5nIHVwIHRoZSBmdWxsIGd1aSB3aW5kb3cgdmlhIFwiUHJvcGVydGllcyAtPgotQWR2YW5jZWRcIiBhbmQgdGhlbiBkZWxldGUgaXQgdGhlIGd1aSBkb2VzIE5PVCB0ZXJtaW5hdGUuCi0KLUFsc28gbm90ZSB0aGF0IGJ5IGRlZmF1bHQgaW4gXCJpY29uXCIgbW9kZSBpZiB5b3UgZGVsZXRlIHRoZSBpY29uCi13aW5kb3cgYm90aCB0aGUgZ3VpICphbmQqIHRoZSB4MTF2bmMgc2VydmVyIHRlcm1pbmF0ZS4KLSIKLQotCXNldCBoZWxwdGV4dChndWkpICIKLXRreDExdm5jIGlzIGEgc2ltcGxlIGZyb250ZW5kIHRvIHgxMXZuYy4gIE5vdGhpbmcgZmFuY3ksIGl0IG1lcmVseQotcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGVhY2ggb2YgdGhlIG1hbnkgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZAotcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMuICBTZWUgXCJIZWxwIC0+IGFsbFwiIGZvciBtdWNoIGluZm8gYWJvdXQgeDExdm5jLgotCi1Gb3IgYSBzaW1wbGllciBndWksIHJ1biB4MTF2bmMgaW4gXCJ0cmF5XCIgb3IgXCJpY29uXCIgbW9kZSBzdWNoIGFzCi1cIi1ndWkgdHJheVwiLCBcIi1ndWkgaWNvblwiLCBvciBcIi1ndWkgdHJheT1zZXRwYXNzXCIuICBJbiB0aGF0Ci1tb2RlIHRoZSBmdWxsIGd1aSBpcyBvbmx5IGF2YWlsYWJsZSB1bmRlciBcIkFkdmFuY2VkIC4uLlwiLgotCi1BbHNvLCBcIi1ndWkgZXpcIiB3aWxsIHNob3cgZmV3ZXIgbWVudSBpdGVtcyAodG9nZ2xlIHZpYSBNaXNjIC0+IHNpbXBsZV9ndWkpCi0KLUFsbCBtZW51IGl0ZW1zIGhhdmUgYSAoPykgYnV0dG9uIG9uZSBjYW4gY2xpY2sgb24gdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBvcHRpb24gb3IgY29tbWFuZC4KLQotVGhlcmUgYXJlIHR3byBzdGF0ZXMgdGt4MTF2bmMgY2FuIGJlIGluOgotCi0JMSkgQXZhaWxhYmxlIHRvIGNvbnRyb2wgYSBydW5uaW5nIHgxMXZuYyBwcm9jZXNzLgotCi0JMikgR2V0dGluZyByZWFkeSB0byBzdGFydCBhIHgxMXZuYyBwcm9jZXNzLgotCi1Nb3N0IHBlb3BsZSB3aWxsIGp1c3QgdXNlIHN0YXRlIDEpLgotCi1JbiBzdGF0ZSAxKSB0aGUgTWVudSBpdGVtcyBhdmFpbGFibGUgaW4gdGhlIG1lbnVzIGFyZSB0aG9zZSB0aGF0Ci1jb3JyZXNwb25kIHRvIHRoZSB4MTF2bmMgXCJyZW1vdGUgY29udHJvbFwiIGNvbW1hbmRzLiAgU2VlIHRoZSAtcmVtb3RlCi1lbnRyeSB1bmRlciBcIkhlbHAgLT4gYWxsXCIgZm9yIGEgY29tcGxldGUgbGlzdC4gIEFsc28gYXZhaWxhYmxlIGlzCi10aGUgXCJBY3Rpb25zIC0+IHN0b3BcIiBpdGVtIHRvIHNodXQgZG93biB0aGUgcnVubmluZyB4MTF2bmMgc2VydmVyLAotdGhlcmVieSBjaGFuZ2luZyB0byBzdGF0ZSAyKS4gIFRoZXJlIGFyZSBvdGhlciBhY3Rpb25zIGF2YWlsYWJsZSB0b28uCi0KLUluIHN0YXRlIDIpIHRoZSBNZW51IGl0ZW1zIGF2YWlsYWJsZSBpbiB0aGUgbWVudXMgKFwiQWN0aW9uc1wiLCBcIkNsaWVudHNcIiwKLWV0Yy4pIGFyZSB0aG9zZSB0aGF0IGNvcnJlc3BvbmQgdG8gY29tbWFuZCBsaW5lIG9wdGlvbnMgdXNlZCBpbiBzdGFydGluZwotYW4geDExdm5jIHByb2Nlc3MsIGFuZCB0aGUgXCJBY3Rpb25zIC0+IHN0YXJ0XCIgaXRlbSBleGVjdXRlcwoteDExdm5jIHRoZXJlYnkgY2hhbmdpbmcgdG8gc3RhdGUgMSkuICBUbyBzZWUgd2hhdCB4MTF2bmMgc3RhcnR1cCBjb21tYW5kCi15b3UgaGF2ZSBidWlsdCBzbyBmYXIsIGxvb2sgYXQgdGhlICg/KSBoZWxwIGZvciAgXCJBY3Rpb25zIC0+IHN0YXJ0XCIKLWFuZCBpdCB3aWxsIHNob3cgeW91IHdoYXQgdGhlIGNvbW1hbmQgbG9va3MgbGlrZS4KLQotVGhlcmUgaXMgbXVjaCBvdmVybGFwIGJldHdlZW4gdGhlIG1lbnUgaXRlbXMgYXZhaWxhYmxlIGluIHN0YXRlIDEpCi1hbmQgc3RhdGUgMiksIGJ1dCBpdCBpcyB3b3J0aCBrZWVwaW5nIGluIG1pbmQgaXQgaXMgbm90IDEwMCUuCi1Gb3IgZXhhbXBsZSwgeW91IGNhbm5vdCBzZXQgcGFzc3dvcmRzIG9yIHBhc3N3b3JkIGZpbGVzIGluIHN0YXRlIDEpLgotKHVwZGF0ZTogc2ltcGxlIHBhc3N3b3JkIHNldHRpbmcgaXMgbm93IGFsbG93ZWQgaW4gXCJ0cmF5XCIgb3IgXCJpY29uXCIgbW9kZSkuCi0KLQotQWxzbyBub3RlIHRoYXQgdGhlcmUgbWF5IGJlICp0d28qIHNlcGFyYXRlIFggZGlzcGxheXMgaW52b2x2ZWQsIG5vdCBqdXN0Ci1vbmU6ICAxKSB0aGUgWCBkaXNwbGF5IHgxMXZuYyB3aWxsIGJlIHBvbGxpbmcgKGFuZCBtYWtpbmcgYXZhaWxhYmxlIHRvCi1WTkMgdmlld2VycyksIGFuZCAyKSB0aGUgWCBkaXNwbGF5IHRoaXMgR1VJIGlzIGludGVuZGVkIHRvIGRpc3BsYXkgb24uCi0KLUZvciBleGFtcGxlLCBvbmUgbWlnaHQgdXNlIHNzaCB0byBhY2Nlc3MgdGhlIHJlbW90ZSBtYWNoaW5lIHdoZXJlIHRoZQotR1VJIHdvdWxkIGRpc3BsYXkgb24gOjExIGFuZCB4MTF2bmMgd291bGQgcG9sbCBkaXNwbGF5IDowLiAgQnkgZGVmYXVsdAotdGhlIGd1aSB3aWxsIGRpc3BsYXkgb24gdGhlIHZhbHVlIGluIHRoZSBESVNQTEFZIGVudi4gdmFyaWFibGUgZm9sbG93ZWQKLWJ5IHRoZSB2YWx1ZSBmcm9tIHRoZSAtZGlzcGxheSBvcHRpb24uICBUbyBvdmVycmlkZSB0aGlzLCB1c2Ugc29tZXRoaW5nCi1saWtlOiBcIi1ndWkgb3RoZXJob3N0OjBcIiwgZXRjLgotCi0KLUdVSSBjb21wb25lbnRzOiAKLS0tLSAtLS0tLS0tLS0tCi0KLTEpIEF0IHRoZSB0b3Agb2YgdGhlIGd1aSBpcyBhIGluZm8gdGV4dCBsYWJlbCB3aGVyZSBpbmZvcm1hdGlvbiB3aWxsCi0gICBiZSBwb3N0ZWQsIGUuZy4gd2hlbiB0cmF2ZXJzaW5nIG1lbnUgaXRlbXMgdGV4dCBpbmRpY2F0aW5nIGhvdyB0byBnZXQKLSAgIGhlbHAgb24gdGhlIGl0ZW0gYW5kIGl0cyBjdXJyZW50IHZhbHVlIHdpbGwgYmUgZGlzcGxheWVkLgotCi0yKSBCZWxvdyB0aGUgaW5mbyBsYWJlbCBpcyB0aGUgYXJlYSB3aGVyZSB0aGUgbWVudSBidXR0b25zLCBcIkFjdGlvbnNcIiwKLSAgIFwiQ2xpZW50c1wiLCBldGMuLCBhcmUgcHJlc2VudGVkLiAgSWYgYSBtZW51IGl0ZW0gaGFzIGEgY2hlY2tib3gsCi0gICBpdCBjb3JyZXNwb25kcyB0byBhIGJvb2xlYW4gb24vb2ZmIHZhcmlhYmxlLiAgT3RoZXJ3aXNlIGl0IGlzCi0gICBlaXRoZXIgYSBzdHJpbmcgdmFyaWFibGUsIG9yIGFuIGFjdGlvbiBub3QgYXNzb2NpYXRlZCB3aXRoIGEKLSAgIHZhcmlhYmxlIChmb3IgdGhlIG1vc3QgcGFydCkuCi0KLTMpIEJlbG93IHRoZSBtZW51IGJ1dHRvbiBhcmVhIGlzIGEgbGFiZWwgaW5kaWNhdGluZyB0aGUgY3VycmVudCB4MTF2bmMKLSAgIFggZGlzcGxheSBiZWluZyBwb2xsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFZOQyBkaXNwbGF5IG5hbWUuICBCb3RoCi0gICB3aWxsIGJlIFwiKCpub25lKilcIiB3aGVuIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQuCi0KLTQpIEJlbG93IHRoZSB4MTEgYW5kIHZuYyBkaXNwbGF5cyBsYWJlbCBpcyBhIHRleHQgYXJlYSB0aGVyZSBzY3JvbGxpbmcKLSAgIGluZm9ybWF0aW9uIGFib3V0IGFjdGlvbnMgYmVpbmcgdGFrZW4gYW5kIGNvbW1hbmRzIGJlaW5nIHJ1biBpcyBkaXNwbGF5ZWQuCi0gICBUbyBzY3JvbGwgY2xpY2sgaW4gdGhlIGFyZWEgYW5kIHVzZSBQYWdlVXAvUGFnZURvd24gb3IgdGhlIGFycm93IGtleXMuCi0KLTUpIEF0IHRoZSBib3R0b20gaXMgYW4gZW50cnkgYXJlYS4gIFdoZW4gb25lIHNlbGVjdHMgYSBtZW51IGl0ZW0gdGhhdAotICAgcmVxdWlyZXMgc3VwcGx5aW5nIGEgc3RyaW5nIHZhbHVlLCB0aGUgbGFiZWwgd2lsbCBiZSBzZXQgdG8gdGhlCi0gICBwYXJhbWV0ZXIgbmFtZSBhbmQgb25lIHR5cGVzIGluIHRoZSBuZXcgdmFsdWUuICBUaGVuIG9uZSBwcmVzc2VzIHRoZQotICAgXCJPS1wiIGJ1dHRvbiBvciBwcmVzc2VzIFwiRW50ZXJcIiB0byBzZXQgdGhlIHZhbHVlLiAgT3IgeW91IGNhbiBwcmVzcwotICAgXCJDYW5jZWxcIiBvciBcIkVzY2FwZVwiIHRvIGF2b2lkIGNoYW5naW5nIHRoZSB2YXJpYWJsZS4KLQotICAgTWFueSB2YXJpYWJsZXMgYXJlIGJvb2xlYW4gdG9nZ2xlcyAoZm9yIGV4YW1wbGUsIFwiUGVybWlzc2lvbnMgLT4KLSAgIHZpZXdvbmx5XCIpIG9yIFJhZGlvIGJ1dHRvbiBzZWxlY3Rpb25zLiAgU2VsZWN0aW5nIHRoZXNlIG1lbnUgaXRlbXMKLSAgIHdpbGwgTk9UIGFjdGl2YXRlIHRoZSBlbnRyeSBhcmVhIGJ1dCByYXRoZXIgdG9nZ2xlIHRoZSB2YXJpYWJsZQotICAgaW1tZWRpYXRlbHkuCi0KLQotQ0FTQ0FERVMgQlVHOiBUaGVyZSBpcyBhIGJ1ZyBub3QgeWV0IHdvcmtlZCBhcm91bmQgZm9yIHRoZSBjYXNjYWRlIG1lbnVzCi13aGVyZSB0aGUgKD8pIGhlbHAgYnV0dG9uIGdldHMgaW4gdGhlIHdheS4gIFRvIGdldCB0aGUgbW91c2Ugb3ZlciB0bwotdGhlIGNhc2NhZGUgbWVudSBjbGljayBhbmQgcmVsZWFzZSBtb3VzZSB0byBhY3RpdmF0ZSB0aGUgY2FzY2FkZSwgdGhlbgoteW91IGNhbiBjbGljayBvbiBpdHMgaXRlbXMuICBEcmFnZ2luZyB3aXRoIGEgbW91c2UgYnV0dG9uIGhlbGQgZG93biB3aWxsCi1ub3Qgd29yayAoc29ycnkhKS4KLQotCi1LZXkgQmluZGluZ3M6Ci0KLQlJbiB0aGUgVGV4dCBBcmVhOiBDb250cm9sLS8gc2VsZWN0cyBhbGwgb2YgdGhlIHRleHQuCi0JQW55d2hlcmU6IENvbnRyb2wtZCBpbnZva2VzIFwiQWN0aW9ucyAtPiBkZXRhY2hcIgotCUFueXdoZXJlOiBDb250cm9sLWEgaW52b2tlcyBcIkFjdGlvbnMgLT4gYXR0YWNoXCIKLQlBbnl3aGVyZTogQ29udHJvbC1wIGludm9rZXMgXCJBY3Rpb25zIC0+IHBpbmdcIgotCUFueXdoZXJlOiBDb250cm9sLXUgYW5kIENvbnRyb2wtciBpbnZva2UgXCJBY3Rpb25zIC0+IHVwZGF0ZS1hbGxcIgotIgotCi1zZXQgdW5kZXJfd2FsbHkgIgotTWlzYzoKLQotU2luY2UgeDExdm5jIGhhcyBzbyBtYW55IHNldHRpbmdzIGFuZCB0byBhdm9pZCBmdXJ0aGVyIGNvbmZ1c2lvbiwKLXRoZSBsaWJ2bmNzZXJ2ZXIgb3B0aW9uczoKLQotCS1hbHdheXNzaGFyZWQKLQktbmV2ZXJzaGFyZWQKLQktZG9udGRpc2Nvbm5lY3QKLQotYXJlIG5vdCBhdmFpbGFibGUgZm9yIGNoYW5naW5nIGluIGEgcnVubmluZyB4MTF2bmMgKGV2ZW4gdGhvdWdoIGl0Ci1pcyBmZWFzaWJsZSkuICBUaGVzZSBvcHRpb25zIG92ZXJsYXAgd2l0aCB0aGUgeDExdm5jIG9wdGlvbnMgLXNoYXJlZAotYW5kIC1mb3JldmVyIHdoaWNoIGFyZSBob3BlZnVsbHkgZW5vdWdoIGZvciBtb3N0IHVzYWdlLiAgVGhleSBtYXkgYmUKLXNwZWNpZmllZCBmb3IgeDExdm5jIHN0YXJ0dXAgaWYgZGVzaXJlZC4KLQotIgotCi1nbG9iYWwgYmVnaW5uZXJfbW9kZQotaWYgeyRiZWdpbm5lcl9tb2RlfSB7Ci0Jc2V0IGhlbHB0ZXh0KGd1aSkgIgotdGt4MTF2bmMgaXMgYSBzaW1wbGUgZnJvbnRlbmQgdG8geDExdm5jLiAgSXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgaW4KLVwiZXpcIiBvciBcInNpbXBsZVwiIG1vZGUuICBGb3IgbWFueSBtb3JlIG9wdGlvbnMgcnVuIGl0IGluIG5vcm1hbAotbW9kZSBieSB0b2dnbGluZyBcIk1pc2MgLT4gc2ltcGxlX2d1aVwiLgotCi1BbGwgbWVudSBpdGVtcyBoYXZlIGEgKD8pIGJ1dHRvbiBvbmUgY2FuIGNsaWNrIG9uIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgb3B0aW9uIG9yIGNvbW1hbmQuCi0KLUdVSSBjb21wb25lbnRzOiAKLS0tLSAtLS0tLS0tLS0tCi0KLTEpIEF0IHRoZSB0b3Agb2YgdGhlIGd1aSBpcyBhIGluZm8gdGV4dCBsYWJlbCB3aGVyZSBpbmZvcm1hdGlvbiB3aWxsCi0gICBiZSBwb3N0ZWQsIGUuZy4gd2hlbiB0cmF2ZXJzaW5nIG1lbnUgaXRlbXMgdGV4dCBpbmRpY2F0aW5nIGhvdyB0byBnZXQKLSAgIGhlbHAgb24gdGhlIGl0ZW0gYW5kIGl0cyBjdXJyZW50IHZhbHVlIHdpbGwgYmUgZGlzcGxheWVkLgotCi0yKSBCZWxvdyB0aGUgaW5mbyBsYWJlbCBpcyB0aGUgYXJlYSB3aGVyZSB0aGUgbWVudSBidXR0b25zLCBcIkFjdGlvbnNcIiwKLSAgIFwiQ2xpZW50c1wiLCBldGMuLCBhcmUgcHJlc2VudGVkLiAgSWYgYSBtZW51IGl0ZW0gaGFzIGEgY2hlY2tib3gsCi0gICBpdCBjb3JyZXNwb25kcyB0byBhIGJvb2xlYW4gb24vb2ZmIHZhcmlhYmxlLiAgT3RoZXJ3aXNlIGl0IGlzCi0gICBlaXRoZXIgYSBzdHJpbmcgdmFyaWFibGUsIG9yIGFuIGFjdGlvbiBub3QgYXNzb2NpYXRlZCB3aXRoIGEKLSAgIHZhcmlhYmxlIChmb3IgdGhlIG1vc3QgcGFydCkuCi0KLTMpIEJlbG93IHRoZSBtZW51IGJ1dHRvbiBhcmVhIGlzIGEgbGFiZWwgaW5kaWNhdGluZyB0aGUgY3VycmVudCB4MTF2bmMKLSAgIFggZGlzcGxheSBiZWluZyBwb2xsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFZOQyBkaXNwbGF5IG5hbWUuICBCb3RoCi0gICB3aWxsIGJlIFwiKCpub25lKilcIiB3aGVuIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQuCi0KLTQpIEJlbG93IHRoZSB4MTEgYW5kIHZuYyBkaXNwbGF5cyBsYWJlbCBpcyBhIHRleHQgYXJlYSB0aGVyZSBzY3JvbGxpbmcKLSAgIGluZm9ybWF0aW9uIGFib3V0IGFjdGlvbnMgYmVpbmcgdGFrZW4gYW5kIGNvbW1hbmRzIGJlaW5nIHJ1biBpcyBkaXNwbGF5ZWQuCi0gICBUbyBzY3JvbGwgY2xpY2sgaW4gdGhlIGFyZWEgYW5kIHVzZSBQYWdlVXAvUGFnZURvd24gb3IgdGhlIGFycm93IGtleXMuCi0KLTUpIEF0IHRoZSBib3R0b20gaXMgYW4gZW50cnkgYXJlYS4gIFdoZW4gb25lIHNlbGVjdHMgYSBtZW51IGl0ZW0gdGhhdAotICAgcmVxdWlyZXMgc3VwcGx5aW5nIGEgc3RyaW5nIHZhbHVlLCB0aGUgbGFiZWwgd2lsbCBiZSBzZXQgdG8gdGhlCi0gICBwYXJhbWV0ZXIgbmFtZSBhbmQgb25lIHR5cGVzIGluIHRoZSBuZXcgdmFsdWUuICBUaGVuIG9uZSBwcmVzc2VzIHRoZQotICAgXCJPS1wiIGJ1dHRvbiBvciBwcmVzc2VzIFwiRW50ZXJcIiB0byBzZXQgdGhlIHZhbHVlLiAgT3IgeW91IGNhbiBwcmVzcwotICAgXCJDYW5jZWxcIiBvciBcIkVzY2FwZVwiIHRvIGF2b2lkIGNoYW5naW5nIHRoZSB2YXJpYWJsZS4KLQotICAgTWFueSB2YXJpYWJsZXMgYXJlIGJvb2xlYW4gdG9nZ2xlcyAoZm9yIGV4YW1wbGUsIFwiUGVybWlzc2lvbnMgLT4KLSAgIHZpZXdvbmx5XCIpIG9yIFJhZGlvIGJ1dHRvbiBzZWxlY3Rpb25zLiAgU2VsZWN0aW5nIHRoZXNlIG1lbnUgaXRlbXMKLSAgIHdpbGwgTk9UIGFjdGl2YXRlIHRoZSBlbnRyeSBhcmVhIGJ1dCByYXRoZXIgdG9nZ2xlIHRoZSB2YXJpYWJsZQotICAgaW1tZWRpYXRlbHkuCi0KLUNBU0NBREVTIEJVRzogVGhlcmUgaXMgYSBidWcgbm90IHlldCB3b3JrZWQgYXJvdW5kIGZvciB0aGUgY2FzY2FkZSBtZW51cwotd2hlcmUgdGhlICg/KSBoZWxwIGJ1dHRvbiBnZXRzIGluIHRoZSB3YXkuICBUbyBnZXQgdGhlIG1vdXNlIG92ZXIgdG8KLXRoZSBjYXNjYWRlIG1lbnUgY2xpY2sgYW5kIHJlbGVhc2UgbW91c2UgdG8gYWN0aXZhdGUgdGhlIGNhc2NhZGUsIHRoZW4KLXlvdSBjYW4gY2xpY2sgb24gaXRzIGl0ZW1zLiAgRHJhZ2dpbmcgd2l0aCBhIG1vdXNlIGJ1dHRvbiBoZWxkIGRvd24gd2lsbAotbm90IHdvcmsgKHNvcnJ5ISkuCi0KLSIKLX0KLQotfQotCi1wcm9jIGNlbnRlcl93aW4ge3d9IHsKLQl3bSB3aXRoZHJhdyAkdwotCXNldCB4IFtleHByIFt3aW5mbyBzY3JlZW53aWR0aCAgJHddLzIgLSBbd2luZm8gcmVxd2lkdGggICR3XS8yXTsKLQlzZXQgeSBbZXhwciBbd2luZm8gc2NyZWVuaGVpZ2h0ICR3XS8yIC0gW3dpbmZvIHJlcWhlaWdodCAkd10vMl07Ci0Jd20gZ2VvbWV0cnkgJHcgKyR4KyR5Ci0Jd20gZGVpY29uaWZ5ICR3Ci0JdXBkYXRlCi19Ci0KLXByb2MgdGV4dHdpZHRoIHt0ZXh0fSB7Ci0Jc2V0IG1pbiAwOwotCWZvcmVhY2ggbGluZSBbc3BsaXQgJHRleHQgIlxuIl0gewotCQlzZXQgbiBbc3RyaW5nIGxlbmd0aCAkbGluZV0KLQkJaWYgeyRuID4gJG1pbn0gewotCQkJc2V0IG1pbiAkbgotCQl9Ci0JfQotCXJldHVybiAkbWluCi19Ci0KLXByb2MgdGV4dGhlaWdodCB7dGV4dH0gewotCXNldCBjb3VudCAwOwotCWZvcmVhY2ggbGluZSBbc3BsaXQgJHRleHQgIlxuIl0gewotCQlpbmNyIGNvdW50Ci0JfQotCXJldHVybiAkY291bnQKLX0KLQotcHJvYyBzZXRfbmFtZSB7bmFtZX0gewotCWdsb2JhbCBmdWxsX3dpbiBpY29uX21vZGUKLQlnbG9iYWwgc2F2ZWRfc2V0X25hbWUKLQotCWlmIHshW2luZm8gZXhpc3RzIHNhdmVkX3NldF9uYW1lXX0gewotCQlzZXQgc2F2ZWRfc2V0X25hbWUgInRreDExdm5jIgotCX0KLQlpZiB7JG5hbWUgPT0gIlJFU1RPUkUifSB7Ci0JCXNldCBuYW1lICRzYXZlZF9zZXRfbmFtZQotCX0gZWxzZSB7Ci0JCXNldCBzYXZlZF9zZXRfbmFtZSAkbmFtZQotCX0KLQlpZiB7IVtpbmZvIGV4aXN0cyBmdWxsX3dpbl19IHsKLQkJcmV0dXJuCi0JfQotCXNldCB3ICIuIgotCWlmIHskaWNvbl9tb2RlfSB7Ci0JCXdtIHRpdGxlICAgICR3ICIkbmFtZSIKLQkJd20gaWNvbm5hbWUgJHcgIiRuYW1lIgotCQlzZXQgdyAkZnVsbF93aW4KLQl9Ci0Jd20gdGl0bGUgICAgJHcgIiRuYW1lIgotCXdtIGljb25uYW1lICR3ICIkbmFtZSIKLX0KLQotcHJvYyBtYWtlX3RvcGxldmVsIHt3IHt0aXRsZSAiIn19IHsKLQljYXRjaCB7ZGVzdHJveSAkd30KLQl0b3BsZXZlbCAgJHc7Ci0JYmluZCAkdyA8RXNjYXBlPiAiZGVzdHJveSAkdyIKLQlpZiB7JHRpdGxlICE9ICIifSB7Ci0JCXdtIHRpdGxlICAgICR3ICR0aXRsZQotCQl3bSBpY29ubmFtZSAkdyAkdGl0bGUKLQl9Ci19Ci0KLXByb2MgdGV4dHdpbiB7bmFtZSB0aXRsZSB0ZXh0IHtlbnRyeSAiIn19IHsKLQlnbG9iYWwgbWF4X3RleHRfaGVpZ2h0IG1heF90ZXh0X3dpZHRoCi0JZ2xvYmFsIGJmb250IGZmb250Ci0KLQlzZXQgd2lkdGggIFt0ZXh0d2lkdGggJHRleHRdCi0JaW5jciB3aWR0aAotCWlmIHskd2lkdGggPiAkbWF4X3RleHRfd2lkdGh9IHsKLQkJc2V0IHdpZHRoICRtYXhfdGV4dF93aWR0aAotCX0KLQlzZXQgaGVpZ2h0IFt0ZXh0aGVpZ2h0ICR0ZXh0XQotCWlmIHskaGVpZ2h0ID4gJG1heF90ZXh0X2hlaWdodH0gewotCQlzZXQgaGVpZ2h0ICRtYXhfdGV4dF9oZWlnaHQKLQl9Ci0KLQlzZXQgdyAiLnRleHRfJG5hbWUiCi0JbWFrZV90b3BsZXZlbCAkdyAkdGl0bGUKLQotCWZyYW1lICAgICAkdy5mIC1iZCAwOwotCXBhY2sgICAgICAkdy5mIC1maWxsIGJvdGggLWV4cGFuZCAxCi0JdGV4dCAgICAgICR3LmYudCAtd2lkdGggJHdpZHRoIC1oZWlnaHQgJGhlaWdodCAtc2V0Z3JpZCAxIC1iZCAyIFwKLQkJCS15c2Nyb2xsY29tbWFuZCAiJHcuZi55IHNldCIgLXJlbGllZiByaWRnZSBcCi0JCQktZm9udCAkZmZvbnQ7Ci0Jc2Nyb2xsYmFyICR3LmYueSAtb3JpZW50IHYgLXJlbGllZiBzdW5rZW4gLWNvbW1hbmQgIiR3LmYudCB5dmlldyI7Ci0JYnV0dG9uICAgICR3LmYuYiAtdGV4dCAiRGlzbWlzcyIgLWNvbW1hbmQgImRlc3Ryb3kgJHciIC1mb250ICRiZm9udCBcCi0JCQktcGFkeSAyCi0KLQkkdy5mLnQgaW5zZXJ0IDEuMCAkdGV4dDsKLQotCWJpbmQgJHcgPEVudGVyPiAiZm9jdXMgJHcuZi50IgotCi0JaWYgeyRlbnRyeSAhPSAiIn0gewotCQkjIHZhcm5hbWUrTGFiZWwgTmFtZQotCQlzZXQgbGlzdCBbc3BsaXQgJGVudHJ5ICIrIl0KLQkJc2V0IHZhcm5hbWUgW2xpbmRleCAkbGlzdCAwXQotCQlzZXQgbGFibmFtZSBbbGluZGV4ICRsaXN0IDFdCi0JCWZyYW1lICR3LmYuZWYgLWJkIDEgLXJlbGllZiBncm9vdmUKLQkJbGFiZWwgJHcuZi5lZi5sIC10ZXh0ICIkbGFibmFtZSIgLWFuY2hvciB3IC1mb250ICRiZm9udAotCQllbnRyeSAkdy5mLmVmLmUgLXJlbGllZiBzdW5rZW4gLWZvbnQgJGZmb250IFwKLQkJCS10ZXh0dmFyaWFibGUgJHZhcm5hbWUKLQkJYnV0dG9uICR3LmYuZWYuYiAtdGV4dCAiT0siIC1mb250ICRiZm9udCBcCi0JCQktY29tbWFuZCAic2V0ICR7dmFybmFtZX1fb2sgMTsgZGVzdHJveSAkdyIgCi0JCWJpbmQgJHcuZi5lZi5lIDxLZXlQcmVzcy1SZXR1cm4+ICJzZXQgJHt2YXJuYW1lfV9vayAxOyBkZXN0cm95ICR3IgotCQkKLQkJcGFjayAkdy5mLmVmLmwgLXNpZGUgbGVmdAotCQlwYWNrICR3LmYuZWYuZSAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxCi0JCXBhY2sgJHcuZi5lZi5iIC1zaWRlIHJpZ2h0Ci0JfQotCi0Jd20gd2l0aGRyYXcgJHcKLQlwYWNrICR3LmYuYiAtc2lkZSBib3R0b20gLWZpbGwgeCAKLQlpZiB7JGVudHJ5ICE9ICIifSB7Ci0JCXBhY2sgJHcuZi5lZiAtc2lkZSBib3R0b20gLWZpbGwgeCAKLQkJYmluZCAkdyA8RW50ZXI+ICJmb2N1cyAkdy5mLmVmLmUiCi0JCSR3LmYuZWYuZSBpY3Vyc29yIGVuZAotCX0gZWxzZSB7Ci0JCWJpbmQgJHcgPEVudGVyPiAiZm9jdXMgJHcuZi50IgotCX0KLQlwYWNrICR3LmYueSAtc2lkZSByaWdodCAtZmlsbCB5OwotCXBhY2sgJHcuZi50IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMTsKLQl1cGRhdGUKLQotCWNlbnRlcl93aW4gJHcKLQotCXJldHVybiAkdwotfQotCi1wcm9jIGFjdGl2ZV93aGVuX2Nvbm5lY3RlZCB7aXRlbX0gewotCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0Ci0JZ2xvYmFsIGljb25fbW9kZQotCi0JaWYgeyRpY29uX21vZGV9IHsKLQkJaWYgeyRpdGVtID09ICJwYXNzd2QifSB7Ci0JCQlyZXR1cm4gMQotCQl9Ci0JCWlmIHskaXRlbSA9PSAidmlld3Bhc3N3ZCJ9IHsKLQkJCXJldHVybiAxCi0JCX0KLQl9Ci0KLQlpZiB7W29wdF9tYXRjaCBHICRpdGVtXX0gewotCQlyZXR1cm4gMQotCX0gZWxzZWlmIHtbb3B0X21hdGNoIFIgJGl0ZW1dfSB7Ci0JCXJldHVybiAxCi0JfSBlbHNlaWYge1tvcHRfbWF0Y2ggUyAkaXRlbV19IHsKLQkJcmV0dXJuIDAKLQl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHsKLQkJaWYge1tvcHRfbWF0Y2ggUiAkaXRlbV19IHsKLQkJCXJldHVybiAxCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMAotCQl9Ci0JfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBoZWxwcmVtb3RlKCRpdGVtKV19IHsKLQkJcmV0dXJuIDEKLQl9IGVsc2UgewotCQlyZXR1cm4gMAotCX0KLX0KLQotcHJvYyBhY3RpdmVfd2hlbl9zdGFydGluZyB7aXRlbX0gewotCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0IGJlZ2lubmVyX21vZGUKLQotCWlmIHskYmVnaW5uZXJfbW9kZX0gewotCQlpZiB7W29wdF9tYXRjaCBHICRpdGVtXX0gewotCQkJcmV0dXJuIDEKLQkJfQotCQlpZiB7JGl0ZW0gPT0gImRpc3BsYXkifSB7Ci0JCQlyZXR1cm4gMQotCQl9Ci0JCWlmIHskaXRlbSA9PSAiYXR0YWNoIn0gewotCQkJcmV0dXJuIDEKLQkJfQotCQlpZiB7JGl0ZW0gPT0gImRlYnVnX2d1aSJ9IHsKLQkJCXJldHVybiAxCi0JCX0KLQkJcmV0dXJuIDAKLQl9Ci0KLQlpZiB7W29wdF9tYXRjaCBHICRpdGVtXX0gewotCQlyZXR1cm4gMQotCX0gZWxzZWlmIHtbb3B0X21hdGNoIFMgJGl0ZW1dfSB7Ci0JCXJldHVybiAxCi0JfSBlbHNlaWYge1tvcHRfbWF0Y2ggUiAkaXRlbV19IHsKLQkJcmV0dXJuIDAKLQl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHsKLQkJaWYge1tvcHRfbWF0Y2ggUyAkaXRlbV19IHsKLQkJCXJldHVybiAxCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMAotCQl9Ci0JfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBoZWxwdGV4dCgkaXRlbSldfSB7Ci0JCXJldHVybiAxCi0JfSBlbHNlIHsKLQkJcmV0dXJuIDAKLQl9Ci19Ci0KLXByb2MgaGVscF93aW4ge2l0ZW19IHsKLQlnbG9iYWwgaGVscHRleHQgaGVscHJlbW90ZSBtZW51X3ZhcgotCWdsb2JhbCBxdWVyeV9hbnMgcXVlcnlfYXJvCi0JZ2xvYmFsIGJlZ2lubmVyX21vZGUKLQotCXNldCBvayAwCi0Jc2V0IHRleHQgIkhlbHAgb24gJGl0ZW06XG5cbiIKLQotCWlmIHskaXRlbSA9PSAiTmV3Q2xpZW50In0gewotCQk7Ci0JfSBlbHNlaWYge1tpc19ndWlfaW50ZXJuYWwgJGl0ZW1dfSB7Ci0JCWlmIHskaXRlbSAhPSAiZ3VpIiAmJiAkaXRlbSAhPSAiYWxsIiAmJiAkaXRlbSAhPSAiTWlzYy1UdW5pbmc6IiBcCi0JCSAgICAmJiAkaXRlbSAhPSAiUHJvcGVydGllcyIgJiYgJGl0ZW0gIT0gIlRyYXkifSB7Ci0JCQlhcHBlbmQgdGV4dCAiICAgICsgSXMgYSBndWkgaW50ZXJuYWwgQWN0aW9uIChjYW5ub3QgYmUgc2V0KS5cbiI7Ci0JCX0KLQl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHsKLQkJYXBwZW5kIHRleHQgIiAgICArIElzIGEgcmVtb3RlIGNvbnRyb2wgQWN0aW9uIChjYW5ub3QgYmUgc2V0KS5cbiI7Ci0JfSBlbHNlaWYge1thY3RpdmVfd2hlbl9jb25uZWN0ZWQgJGl0ZW1dfSB7Ci0JCWFwcGVuZCB0ZXh0ICIgICAgKyBDYW4gYmUgY2hhbmdlZCBpbiBhIHJ1bm5pbmcgeDExdm5jLlxuIjsKLQl9IGVsc2UgewotCQlhcHBlbmQgdGV4dCAiICAgIC0gQ2Fubm90IGJlIGNoYW5nZWQgaW4gYSBydW5uaW5nIHgxMXZuYy5cbiI7Ci0JfQotCWlmIHskaXRlbSA9PSAiTmV3Q2xpZW50In0gewotCQk7Ci0JfSBlbHNlaWYge1tpc19ndWlfaW50ZXJuYWwgJGl0ZW1dfSB7Ci0JCTsKLQl9IGVsc2VpZiB7W2FjdGl2ZV93aGVuX3N0YXJ0aW5nICRpdGVtXX0gewotCQlhcHBlbmQgdGV4dCAiICAgICsgQ2FuIGJlIHNldCBhdCB4MTF2bmMgc3RhcnR1cC5cbiI7Ci0JfSBlbHNlIHsKLQkJaWYgeyEgJGJlZ2lubmVyX21vZGV9IHsKLQkJCWFwcGVuZCB0ZXh0ICIgICAgLSBDYW5ub3QgYmUgc2V0IGF0IHgxMXZuYyBzdGFydHVwLlxuIjsKLQkJfQotCX0KLQlhcHBlbmQgdGV4dCAiXG4iCi0KLQlpZiB7W2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRpdGVtKV19IHsKLQkJYXBwZW5kIHRleHQgIlxuIgotCQlpZiB7W2lzX2d1aV9pbnRlcm5hbCAkaXRlbV19IHsKLQkJCWFwcGVuZCB0ZXh0ICI9PT09IHgxMXZuYyBoZWxwOiA9PT09XG4iOwotCQl9IGVsc2UgewotCQkJYXBwZW5kIHRleHQgIj09PT0geDExdm5jIHN0YXJ0dXAgb3B0aW9uIGhlbHA6ID09PT1cbiI7Ci0JCX0KLQkJYXBwZW5kIHRleHQgIlxuIgotCQlhcHBlbmQgdGV4dCAkaGVscHRleHQoJGl0ZW0pCi0JCWFwcGVuZCB0ZXh0ICJcbiIKLQkJc2V0IG9rIDEKLQl9Ci0KLQlpZiB7W2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJGl0ZW0pXX0gewotCQlhcHBlbmQgdGV4dCAiXG4iCi0JCWFwcGVuZCB0ZXh0ICI9PT09IHgxMXZuYyByZW1vdGUgY29udHJvbCBoZWxwOiA9PT09XG4iOwotCQlhcHBlbmQgdGV4dCAiXG4iCi0JCWFwcGVuZCB0ZXh0ICRoZWxwcmVtb3RlKCRpdGVtKQotCQlzZXQgb2sgMQotCX0KLQotCWlmIHshW2lzX2FjdGlvbiAkaXRlbV0gJiYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHsKLQkJZ2xvYmFsIHVuc2V0X3N0cgotCQlhcHBlbmQgdGV4dCAiXG5cbiIKLQkJYXBwZW5kIHRleHQgIj09PT0gY3VycmVudCAkaXRlbSB2YWx1ZTogPT09PVxuIjsKLQkJYXBwZW5kIHRleHQgIlxuIgotCi0JCWlmIHskaXRlbSA9PSAicGFzc3dkIiB8fCAkaXRlbSA9PSAidmlld3Bhc3N3ZCJ9IHsKLQkJCTsKLQkJfSBlbHNlaWYgeyRtZW51X3ZhcigkaXRlbSkgPT0gIiJ9IHsKLQkJCWFwcGVuZCB0ZXh0ICIkdW5zZXRfc3RyXG4iCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgdGV4dCAiJG1lbnVfdmFyKCRpdGVtKVxuIgotCQl9Ci0JCWlmIHskaXRlbSA9PSAiaHR0cCIgfHwgJGl0ZW0gPT0gImh0dHBkaXIiIHx8ICRpdGVtID09ICJodHRwcG9ydCJ9IHsKLQkJCWdsb2JhbCB2bmNfdXJsOwotCQkJYXBwZW5kIHRleHQgIlxuVVJMOiAkdm5jX3VybFxuIgotCQl9Ci0JfQotCi0JaWYgeyRpdGVtID09ICJzdGFydCJ9IHsKLQkJc2V0IHN0ciBbZ2V0X3N0YXJ0X3gxMXZuY190eHRdCi0JCWFwcGVuZF90ZXh0ICIkc3RyXG4iCi0jCQlhcHBlbmQgdGV4dCAiXG5Qb3NzaWJsZSBcJEhPTUUvLngxMXZuY3JjIHNldHRpbmdzIGZvciB0aGlzIGNvbW1hbmQ6XG5cbiIKLSMJCXNldCByY3R4dCBbZ2V0X3N0YXJ0X3gxMXZuY19jbWQgMV0KLSMJCWFwcGVuZCB0ZXh0ICIkcmN0eHRcbiIKLQl9Ci0KLQlyZWdzdWIgLWFsbCB7IH0gJGl0ZW0gIiAiIG5hbWUKLQotCWlmIHskb2t9IHsKLQkJdGV4dHdpbiAkbmFtZSAieDExdm5jIGhlbHA6ICRpdGVtIiAiJHRleHQiOwotCX0KLQlyZXR1cm4gJG9rCi19Ci0KLXByb2MgcGFyc2VfaGVscCB7fSB7Ci0JZ2xvYmFsIGVudiB4MTF2bmNfcHJvZzsKLQlnbG9iYWwgaGVscGFsbCBoZWxwdGV4dDsKLQotCXNldCBoZWxwcGlwZSBbb3BlbiAifCAkeDExdm5jX3Byb2cgLWhlbHAiICJyIl07Ci0JaWYgeyRoZWxwcGlwZSA9PSAiIn0gewotCQlwdXRzIHN0ZGVyciAiZmFpbGVkIHRvIHJ1biAkeDExdm5jX3Byb2cgLWhlbHAiOwotCQlleGl0IDE7Ci0JfQotCi0Jc2V0IHNhd29wdHMgMDsKLQlzZXQgY3Vycm9wdCAiIjsKLQl3aGlsZSB7W2dldHMgJGhlbHBwaXBlIGxpbmVdID4gLTF9IHsKLQkJYXBwZW5kIGhlbHBhbGwgIiRsaW5lXG4iCQotCi0JCSMgWFhYCi0JCWlmIHtbcmVnZXhwIHteT3B0aW9uczp9ICRsaW5lXX0gewotCQkJc2V0IHNhd29wdHMgMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCSMgWFhYCi0JCWlmIHtbcmVnZXhwIHteVGhlc2Ugb3B0aW9uc30gJGxpbmVdfSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQkjIHR3ZWFrIGFsaWFzZXM6Ci0JCXJlZ3N1YiB7Xi16ZXJvY29uZn0gJGxpbmUgIi16ZXJvX2NvbmYiIGxpbmUKLQkJcmVnc3ViIHteLWF2YWhpICAgfSAkbGluZSAiLXplcm9jb25mIiBsaW5lCi0KLQkJaWYgeyEgJHNhd29wdHN9IHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIHtbcmVnZXhwIHteLShbMC05QS16X11bMC05QS16X10qKX0gJGxpbmUgbWF0Y2ggbmFtZV19IHsKLQkJCXNldCBhbGxuYW1lcygkbmFtZSkgMTsKLQkJCWlmIHsiJGN1cnJvcHQiICE9ICJubyRuYW1lIiAmJiAibm8kY3Vycm9wdCIgIT0gIiRuYW1lIn0gewotCQkJCXNldCBjdXJyb3B0ICRuYW1lOwotCQkJCXNldCBoZWxwdGV4dCgkY3Vycm9wdCkgIiRsaW5lXG4iOwotCQkJfSBlbHNlIHsKLQkJCQlhcHBlbmQgaGVscHRleHQoJGN1cnJvcHQpICIkbGluZVxuIjsKLQkJCX0KLQkJfSBlbHNlaWYgeyRjdXJyb3B0ICE9ICIifSB7Ci0JCQlhcHBlbmQgaGVscHRleHQoJGN1cnJvcHQpICIkbGluZVxuIjsKLQkJfQotCX0KLQlmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGFsbG5hbWVzXSB7Ci0JCWlmIHtbcmVnZXhwIHtebm99ICRuYW1lXX0gewotCQkJcmVnc3ViIHtebm99ICRuYW1lICIiIHBhaXIKLQkJfSBlbHNlIHsKLQkJCXNldCBwYWlyICJubyRuYW1lIgotCQl9Ci0JCWlmIHtbaW5mbyBleGlzdHMgaGVscHRleHQoJG5hbWUpXX0gewotCQkJaWYgIVtpbmZvIGV4aXN0cyBoZWxwdGV4dCgkcGFpcildIHsKLQkJCQlzZXQgaGVscHRleHQoJHBhaXIpICRoZWxwdGV4dCgkbmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVscHRleHQoJHBhaXIpXX0gewotCQkJaWYgIVtpbmZvIGV4aXN0cyBoZWxwdGV4dCgkbmFtZSldIHsKLQkJCQlzZXQgaGVscHRleHQoJG5hbWUpICRoZWxwdGV4dCgkcGFpcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXRfaW50ZXJuYWxfaGVscAotfQotCi1wcm9jIHR3ZWFrX2JvdGgge25ldyBvbGR9IHsKLQl0d2Vha19oZWxwICRuZXcgJG9sZAotCXR3ZWFrX3JlbW90ZV9oZWxwICRuZXcgJG9sZAotfQotCi1wcm9jIHR3ZWFrX3JlbW90ZV9oZWxwIHtuZXcgb2xkfSB7Ci0JZ2xvYmFsIGhlbHByZW1vdGUKLQlpZiAhW2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJG5ldyldIHsKLQkJaWYge1tpbmZvIGV4aXN0cyBoZWxwcmVtb3RlKCRvbGQpXX0gewotCQkJc2V0IGhlbHByZW1vdGUoJG5ldykgJGhlbHByZW1vdGUoJG9sZCkKLQkJfQotCX0KLX0KLQotcHJvYyB0d2Vha19oZWxwIHtuZXcgb2xkfSB7Ci0JZ2xvYmFsIGhlbHB0ZXh0Ci0JaWYgIVtpbmZvIGV4aXN0cyBoZWxwdGV4dCgkbmV3KV0gewotCQlpZiB7W2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRvbGQpXX0gewotCQkJc2V0IGhlbHB0ZXh0KCRuZXcpICRoZWxwdGV4dCgkb2xkKQotCQl9Ci0JfQotfQotCi1wcm9jIHBhcnNlX3JlbW90ZV9oZWxwIHt9IHsKLQlnbG9iYWwgaGVscHJlbW90ZSBoZWxwdGV4dCBoZWxwX2luZGVudCByZW1vdGVfbmFtZTsKLQotCXNldCBzYXdvcHRzIDA7Ci0Jc2V0IGN1cnJvcHQgIiI7Ci0Jc2V0IHBvc3NvcHRzICIiOwotCXNldCBvZmZzZXQgW2V4cHIgJGhlbHBfaW5kZW50IC0gMV07Ci0JZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVscHRleHQocmVtb3RlKSAiXG4iXSB7Ci0JCQotCQlzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lICRvZmZzZXQgZW5kXTsKLQotCQkjIFhYWAotCQlpZiB7W3JlZ2V4cCB7XlRoZSBmb2xsb3dpbmcgLXJlbW90ZS8tUiBjb21tYW5kc30gJGxpbmVdfSB7Ci0JCQlzZXQgc2F3b3B0cyAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJIyBYWFgKLQkJaWYge1tyZWdleHAge15UaGUgdm5jY29ubmVjdC4qY29tbWFuZH0gJGxpbmVdfSB7Ci0JCQlzZXQgc2F3b3B0cyAwOwotCQl9Ci0KLQkJaWYgeyEgJHNhd29wdHN9IHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIHtbcmVnZXhwIHteKFswLTlBLXpfXVswLTlBLXpfOl0qKX0gJGxpbmUgbWF0Y2ggbmFtZV19IHsKLQkJCXJlZ3N1YiB7Oi4qJH0gJG5hbWUgIiIgcG9wdAotCQkJbGFwcGVuZCBwb3Nzb3B0cyAkcG9wdAotCQkJaWYgeyIkY3Vycm9wdCIgIT0gIm5vJG5hbWUiICYmICJubyRjdXJyb3B0IiAhPSAiJG5hbWUifSB7Ci0JCQkJc2V0IGN1cnJvcHQgJG5hbWU7Ci0JCQkJcmVnc3ViIHs6LiokfSAkY3Vycm9wdCAiIiBjdXJyb3B0Ci0JCQkJc2V0IHJlbW90ZV9uYW1lKCRjdXJyb3B0KSAkbmFtZQotCQkJCXNldCBoZWxwcmVtb3RlKCRjdXJyb3B0KSAiJGxpbmVcbiI7Ci0JCQl9IGVsc2UgewotCQkJCWFwcGVuZCBoZWxwcmVtb3RlKCRjdXJyb3B0KSAiJGxpbmVcbiI7Ci0JCQl9Ci0JCX0gZWxzZWlmIHskY3Vycm9wdCAhPSAiIn0gewotCQkJYXBwZW5kIGhlbHByZW1vdGUoJGN1cnJvcHQpICIkbGluZVxuIjsKLQkJfQotCX0KLQotCWZvcmVhY2ggcG9wdCAkcG9zc29wdHMgewotCQlpZiB7W2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJHBvcHQpXX0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W3JlZ2V4cCB7Xm5vfSAkcG9wdF19IHsKLQkJCXJlZ3N1YiB7Xm5vfSAkcG9wdCAiIiB0cnkKLQkJfSBlbHNlIHsKLQkJCXNldCB0cnkgIm5vJHBvcHQiCi0JCX0KLQkJaWYge1tpbmZvIGV4aXN0cyBoZWxwcmVtb3RlKCR0cnkpXX0gewotCQkJc2V0IGhlbHByZW1vdGUoJHBvcHQpICRoZWxwcmVtb3RlKCR0cnkpCi0JCX0KLQl9Ci19Ci0KLXByb2MgcGFyc2VfcXVlcnlfaGVscCB7fSB7Ci0JZ2xvYmFsIHF1ZXJ5X2FucyBxdWVyeV9hcm8gcXVlcnlfYW5zX2xpc3QgcXVlcnlfYXJvX2xpc3QgaGVscHRleHQ7Ci0KLQlzZXQgc2F3YW5zIDA7Ci0Jc2V0IHNhd2FybyAwOwotCXNldCBhbnNfc3RyICIiCi0Jc2V0IGFyb19zdHIgIiIKLQotCWZvcmVhY2ggbGluZSBbc3BsaXQgJGhlbHB0ZXh0KHF1ZXJ5KSAiXG4iXSB7Ci0KLQkJaWYgeyEgJHNhd2FucyAmJiBbcmVnZXhwIHteICphbnM9fSAkbGluZV19IHsKLQkJCXNldCBzYXdhbnMgMQotCQl9Ci0JCWlmIHshICRzYXdhbnN9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQotCQlpZiB7W3JlZ2V4cCB7XiAqYXJvPX0gJGxpbmVdfSB7Ci0JCQlzZXQgc2F3YXJvIDEKLQkJfQotCQlpZiB7JHNhd2FybyAmJiBbcmVnZXhwIHteWyAJXSokfSAkbGluZV19IHsKLQkJCXNldCBzYXdhbnMgMAotCQkJYnJlYWsKLQkJfQotCi0JCXJlZ3N1YiB7YW5zPX0gJGxpbmUgIiIgbGluZQotCQlyZWdzdWIge2Fybz19ICRsaW5lICIiIGxpbmUKLQkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCi0JCWlmIHskc2F3YXJvfSB7Ci0JCQlzZXQgYXJvX3N0ciAiJGFyb19zdHIgJGxpbmUiCi0JCX0gZWxzZSB7Ci0JCQlzZXQgYW5zX3N0ciAiJGFuc19zdHIgJGxpbmUiCi0JCX0KLQl9Ci0KLQlyZWdzdWIgLWFsbCB7ICAqfSAkYW5zX3N0ciAiICIgYW5zX3N0cgotCXJlZ3N1YiAtYWxsIHsgICp9ICRhcm9fc3RyICIgIiBhcm9fc3RyCi0KLQlzZXQgYW5zX3N0ciBbc3RyaW5nIHRyaW0gJGFuc19zdHJdCi0Jc2V0IGFyb19zdHIgW3N0cmluZyB0cmltICRhcm9fc3RyXQotCXNldCBxdWVyeV9hbnNfbGlzdCBbc3BsaXQgJGFuc19zdHJdCi0Jc2V0IHF1ZXJ5X2Fyb19saXN0IFtzcGxpdCAkYXJvX3N0cl0KLQotCWZvcmVhY2ggaXRlbSAkcXVlcnlfYW5zX2xpc3QgewotCQlpZiB7W3JlZ2V4cCB7XlsgCV0qJH0gJGl0ZW1dfSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBxdWVyeV9hbnMoJGl0ZW0pIDEKLQl9Ci0JZm9yZWFjaCBpdGVtICRxdWVyeV9hcm9fbGlzdCB7Ci0JCWlmIHtbcmVnZXhwIHteWyAJXSokfSAkaXRlbV19IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJc2V0IHF1ZXJ5X2FybygkaXRlbSkgMQotCX0KLX0KLQotcHJvYyBpbl9kZWJ1Z19tb2RlIHt9IHsKLQlnbG9iYWwgbWVudV92YXIKLQlpZiB7IVtpbmZvIGV4aXN0cyBtZW51X3ZhcihkZWJ1Z19ndWkpXX0gewotCQlyZXR1cm4gMAotCX0KLQlyZXR1cm4gJG1lbnVfdmFyKGRlYnVnX2d1aSkKLX0KLQotIyBNZW51YmFyIHV0aWxpdGllczoKLXByb2MgbWVudXNfc3RhdGUge3N0YXRlfSB7Ci0JZ2xvYmFsIG1lbnVfYgotCi0JZm9yZWFjaCBjYXNlIFthcnJheSBuYW1lcyBtZW51X2JdIHsKLQkJc2V0IG1lbnVfYnV0dG9uICRtZW51X2IoJGNhc2UpCi0JCWlmIHshW3dpbmZvIGV4aXN0cyAkbWVudV9idXR0b25dfSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCSRtZW51X2J1dHRvbiBjb25maWd1cmUgLXN0YXRlICRzdGF0ZQotCX0KLX0KLQotcHJvYyBtZW51c19lbmFibGUge30gewotCWdsb2JhbCBtZW51c19kaXNhYmxlZAotCi0JbWVudXNfc3RhdGUgIm5vcm1hbCIKLQlzZXQgbWVudXNfZGlzYWJsZWQgMAotfQotCi1wcm9jIG1lbnVzX2Rpc2FibGUge30gewotCWdsb2JhbCBtZW51c19kaXNhYmxlZAotCi0Jc2V0IG1lbnVzX2Rpc2FibGVkIDEKLQltZW51c19zdGF0ZSAiZGlzYWJsZWQiCi19Ci0KLSMgRW50cnkgYm94IHV0aWxpdGllczoKLXByb2MgZW50cnlfc3RhdGUge3ggc3RhdGV9IHsKLQlnbG9iYWwgZW50cnlfYm94IGVudHJ5X2xhYmVsIGVudHJ5X29rIGVudHJ5X2hlbHAgZW50cnlfc2tpcCBlbnRyeV9icm93c2UKLQlnbG9iYWwgb2xkX2xhYmVscwotCWlmIHskeCA9PSAiYWxsIn0gewotCQlpZiB7ISRvbGRfbGFiZWxzfSB7Ci0JCQkkZW50cnlfbGFiZWwgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUKLQkJfQotCQkkZW50cnlfYm94ICAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlCi0JCSRlbnRyeV9vayAgICAgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUKLQkJJGVudHJ5X3NraXAgICBjb25maWd1cmUgLXN0YXRlICRzdGF0ZQotCQkkZW50cnlfaGVscCAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlCi0JCSRlbnRyeV9icm93c2UgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUKLQl9IGVsc2VpZiB7JHggPT0gImxhYmVsIn0gewotCQlpZiB7ISRvbGRfbGFiZWxzfSB7Ci0JCQkkZW50cnlfbGFiZWwgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUKLQkJfQotCX0gZWxzZWlmIHskeCA9PSAiYm94In0gewotCQkkZW50cnlfYm94ICAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlCi0JfSBlbHNlaWYgeyR4ID09ICJvayJ9IHsKLQkJJGVudHJ5X29rICAgICBjb25maWd1cmUgLXN0YXRlICRzdGF0ZQotCX0gZWxzZWlmIHskeCA9PSAic2tpcCJ9IHsKLQkJJGVudHJ5X3NraXAgICBjb25maWd1cmUgLXN0YXRlICRzdGF0ZQotCX0gZWxzZWlmIHskeCA9PSAiaGVscCJ9IHsKLQkJJGVudHJ5X2hlbHAgICBjb25maWd1cmUgLXN0YXRlICRzdGF0ZQotCX0gZWxzZWlmIHskeCA9PSAiYnJvd3NlIn0gewotCQkkZW50cnlfYnJvd3NlIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlCi0JfQotfQotCi1wcm9jIGVudHJ5X2VuYWJsZSB7e3ggImFsbCJ9fSB7Ci0JZW50cnlfc3RhdGUgJHggbm9ybWFsCi19Ci0KLXByb2MgZW50cnlfZGlzYWJsZSB7e3ggImFsbCJ9fSB7Ci0JZW50cnlfc3RhdGUgJHggZGlzYWJsZWQKLX0KLQotcHJvYyBlbnRyeV9icm93c2VfYnV0dG9uIHt7c2hvdyAxfX0gewotCWdsb2JhbCBlbnRyeV9icm93c2UKLQlpZiB7JHNob3d9IHsKLQkJcGFjayAkZW50cnlfYnJvd3NlIC1zaWRlIGxlZnQKLQl9ICBlbHNlIHsKLQkJcGFjayBmb3JnZXQgJGVudHJ5X2Jyb3dzZQotCX0KLX0KLXByb2MgZW50cnlfZm9jdXMge30gewotCWdsb2JhbCBlbnRyeV9ib3gKLQlmb2N1cyAkZW50cnlfYm94Ci19Ci1wcm9jIGVudHJ5X3NlbGVjdCB7fSB7Ci0JZ2xvYmFsIGVudHJ5X2JveAotCSRlbnRyeV9ib3ggc2VsZWN0aW9uIHJhbmdlIDAgZW5kCi19Ci1wcm9jIGVudHJ5X2dldCB7fSB7Ci0JZ2xvYmFsIGVudHJ5X2JveAotCXJldHVybiBbJGVudHJ5X2JveCBnZXRdCi19Ci1wcm9jIGVudHJ5X2luc2VydCB7c3RyfSB7Ci0JZ2xvYmFsIGVudHJ5X2JveAotCWVudHJ5X2RlbGV0ZQotCSRlbnRyeV9ib3ggaW5zZXJ0IGVuZCAkc3RyCi0JJGVudHJ5X2JveCBpY3Vyc29yIGVuZAotfQotcHJvYyBlbnRyeV9kZWxldGUge30gewotCWdsb2JhbCBlbnRyeV9ib3gKLQkkZW50cnlfYm94IGRlbGV0ZSAwIGVuZAotfQotCi0KLSMgVXRpbGl0aWVzIGZvciByZW1vdGUgY29udHJvbCBhbmQgdXBkYXRpbmcgdmFycy4KLQotcHJvYyBwdXNoX25ld192YWx1ZSB7aXRlbSBuYW1lIG5ldyB7cXVlcnkgMX19IHsKLQlnbG9iYWwgbWVudV92YXIgYWx3YXlzX3VwZGF0ZSByZW1vdGVfb3V0cHV0IHF1ZXJ5X291dHB1dAotCWdsb2JhbCBxdWVyeV9yZXN1bHRfbGlzdAotCi0Jc2V0IGRlYnVnIFtpbl9kZWJ1Z19tb2RlXQotCi0Jc2V0IGdldG91dCAwCi0Jc2V0IHByaW50X2dldG91dCAwOwotCi0Jc2V0IGRvX3F1ZXJ5X2FsbCAwCi0KLQlzZXQgbmV3bmV3ICIiCi0JaWYgeyRpdGVtID09ICJkaXNjb25uZWN0In0gewotCQlzZXQgbmV3bmV3ICJOL0EiCi0JCXNldCBkb19xdWVyeV9hbGwgMQotCX0gZWxzZWlmIHskYWx3YXlzX3VwZGF0ZX0gewotCQlzZXQgZG9fcXVlcnlfYWxsIDEKLQl9Ci0KLQlpZiB7JGl0ZW0gPT0gInJlbW90ZS1jbWQifSB7Ci0JCSMga2x1ZGdlIGZvciBhcmJpdHJhcnkgcmVtb3RlIGNvbW1hbmQ6Ci0JCWlmIHtbcmVnZXhwIHteUTp9ICRuZXddfSB7Ci0JCQkjIGV4dHJhIGtsdWRnZSBmb3IgUTp2YXIgdG8gbWVhbiAtUSB2YXIKLQkJCXJlZ3N1YiB7XlE6fSAkbmV3ICIiIG5ldwotCQkJc2V0IHFvbmx5IDEKLQkJfSBlbHNlIHsKLQkJCXNldCBxb25seSAwCi0JCX0KLQkJIyBuZWVkIHRvIGV4dHJhY3QgaXRlbSBmcm9tIG5ldzoKLQkJc2V0IHF0bXAgJG5ldwotCQlyZWdzdWIgezouKiR9ICRxdG1wICIiIHF0bXAKLQkJaWYgeyRxb25seX0gewotCQkJc2V0IHJhcmdzIFtsaXN0ICItUSIgIiRxdG1wIl0KLQkJCXNldCBwcmludF9nZXRvdXQgMQotCQkJc2V0IHFhcmdzICIiCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcmFyZ3MgW2xpc3QgIi1SIiAiJG5ldyJdCi0JCQlzZXQgcWFyZ3MgIiIKLQkJfQotCQlzZXQgZ2V0b3V0IDEKLQotCX0gZWxzZWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0gewotCQkjIHN0cmluZyB2YXI6Ci0JCXNldCByYXJncyBbbGlzdCAiLVIiICIkbmFtZTokbmV3Il0KLQkJc2V0IHFhcmdzIFtsaXN0ICItUSIgIiRuYW1lIl0KLQl9IGVsc2UgewotCQkjIGJvb2xlYW4gdmFyOgotCQlzZXQgcmFyZ3MgW2xpc3QgIi1SIiAiJG5hbWUiXQotCQlzZXQgcWFyZ3MgW2xpc3QgIi1RIiAiJG5hbWUiXQotCX0KLQotCWlmIHshICRxdWVyeSAmJiAhICRhbHdheXNfdXBkYXRlfSB7Ci0JCXNldCBnZXRvdXQgMQotCX0gZWxzZWlmIHskaXRlbSA9PSAibm9yZW1vdGUifSB7Ci0JCXNldCBnZXRvdXQgMQotCX0gZWxzZWlmIHtbaXNfYWN0aW9uICRpdGVtXSAmJiAhW29wdF9tYXRjaCBRICRpdGVtXSAmJiAkcmFyZ3MgIT0gIiJ9IHsKLQkJc2V0IGdldG91dCAxCi0JfSBlbHNlaWYge1tyZWdleHAge14oc2lkfGlkKSR9ICRpdGVtXSAmJiAhW3JlZ2V4cCB7XjB4fSAkbmV3XX0gewotCQlzZXQgZ2V0b3V0IDEKLQl9Ci0KLQlzZXQgcmVtb3RlX291dHB1dCAiIgotCXNldCBxdWVyeV9vdXRwdXQgIiIKLQotCWlmIHshJGRlYnVnfSB7Ci0JCWlmIFtyZWdleHAge3Bhc3N3ZH0gJHJhcmdzXSB7Ci0JCQlhcHBlbmRfdGV4dCAieDExdm5jIC4uLiIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZF90ZXh0ICJ4MTF2bmMgJHJhcmdzIC4uLiIKLQkJfQotCX0KLQotCWlmIHskZ2V0b3V0fSB7Ci0JCXNldCByZW1vdGVfb3V0cHV0IFtydW5fcmVtb3RlX2NtZCAkcmFyZ3NdCi0JCWlmIHskcHJpbnRfZ2V0b3V0fSB7Ci0JCQlhcHBlbmRfdGV4dCAiXHQkcmVtb3RlX291dHB1dCIKLQkJfQotCQlhcHBlbmRfdGV4dCAiXG4iCi0JCXJldHVybgotCX0KLQotCWlmIHskZG9fcXVlcnlfYWxsfSB7Ci0JCXNldCBhbGwgW2FsbF9xdWVyeV92YXJzXQotCQlzZXQgcWFyZ3MgW2xpc3QgIi1RIiAkYWxsXQotCi0JCWdsb2JhbCBsYXN0X3F1ZXJ5X2FsbF90aW1lCi0JCXNldCBsYXN0X3F1ZXJ5X2FsbF90aW1lIFtjbG9jayBzZWNvbmRzXQotCX0KLQotCXNldCBycWFyZ3MgW2NvbmNhdCAkcmFyZ3MgJHFhcmdzXQotCi0Jc2V0IHF1ZXJ5IFtydW5fcmVtb3RlX2NtZCAkcnFhcmdzXQotCXNldCBxdWVyeV9vdXRwdXQgJHF1ZXJ5Ci0KLQlzZXQgcXVlcnlfcmVzdWx0X2xpc3QgIiIKLQotCWlmIHskbmV3bmV3ICE9ICIifSB7Ci0JCXNldCBuZXcgJG5ld25ldwotCX0KLQotCWlmIHshW3NlZV9pZl9vayAkcXVlcnkgJGl0ZW0gIiRuYW1lOiRuZXciXX0gewotCQkjIGZhaWxlZAotCQlpZiAge1tyZWdleHAge15hLi49fSAkcXVlcnldfSB7Ci0JCQkjIGJ1dCBzb21lIHJlc3VsdCBjYW1lIGJhY2sKLQkJCSMgc3luY2hyb25pemUgZXZlcnl0aGluZyB3aXRoIGEgMm5kIGNhbGwuCi0JCQlzZXQgcXVlcnlfb3V0cHV0IFtxdWVyeV9hbGwgMV0KLQkJfSBlbHNlIHsKLQkJCSMgc2VydmVyIG1heSBiZSBkZWFkCi0JCQlpZiB7JGl0ZW0gIT0gInBpbmciICYmICRpdGVtICE9ICJhdHRhY2gifSB7Ci0JCQkJdHJ5X2Nvbm5lY3QKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCSMgc3VjY2VlZGVkCi0JCSMgc3luY2hyb25pemUgdGhpcyB2YXJpYWJsZSAob3IgdmFyaWFibGVzKQotCQkjIGZvciBhIHNwZWVkdXAgdXNlZCB0aGUgbGlzdCBwYXJzZWQgYnkgc2VlX2lmX29rLgotCQl1cGRhdGVfbWVudV92YXJzICJVU0VfTElTVCIKLQotCQlpZiB7JGRvX3F1ZXJ5X2FsbH0gewotCQkJZ2xvYmFsIGFsbF9zZXR0aW5ncwotCQkJc2V0IGFsbF9zZXR0aW5ncyAkcXVlcnkKLQkJfQotCX0KLX0KLQotcHJvYyBzZXRfa21iY19zdHIge30gewotCWdsb2JhbCB2bF9iayB2bF9ibSB2bF9iYiB2bF9iYyB2bF9iZiB2cl9iayB2cl9ibSB2cl9iYiB2cl9iYyB2cl9iZgotCi0Jc2V0IHN0ciAiIgotCWlmIHskdmxfYmt9IHsKLQkJYXBwZW5kIHN0ciAiSyIKLQl9Ci0JaWYgeyR2bF9ibX0gewotCQlhcHBlbmQgc3RyICJNIgotCX0KLQlpZiB7JHZsX2JifSB7Ci0JCWFwcGVuZCBzdHIgIkIiCi0JfQotCWlmIHskdmxfYmN9IHsKLQkJYXBwZW5kIHN0ciAiQyIKLQl9Ci0JaWYgeyR2bF9iZn0gewotCQlhcHBlbmQgc3RyICJGIgotCX0KLQlpZiB7JHZyX2JrIHx8ICR2cl9ibSB8fCAkdnJfYmIgfHwgJHZyX2JjIHx8ICR2cl9iZn0gewotCQlhcHBlbmQgc3RyICIsIgotCX0KLQlpZiB7JHZyX2JrfSB7Ci0JCWFwcGVuZCBzdHIgIksiCi0JfQotCWlmIHskdnJfYm19IHsKLQkJYXBwZW5kIHN0ciAiTSIKLQl9Ci0JaWYgeyR2cl9iYn0gewotCQlhcHBlbmQgc3RyICJCIgotCX0KLQlpZiB7JHZyX2JjfSB7Ci0JCWFwcGVuZCBzdHIgIkMiCi0JfQotCWlmIHskdnJfYmZ9IHsKLQkJYXBwZW5kIHN0ciAiRiIKLQl9Ci0JZW50cnlfaW5zZXJ0ICRzdHIKLX0KLQotcHJvYyBpbnNlcnRfaW5wdXRfd2luZG93IHt9IHsKLQlnbG9iYWwgdGV4dF9hcmVhIGNsZWFudXBfd2luZG93Ci0JZ2xvYmFsIGZmb250IG1lbnVfdmFyCi0JZ2xvYmFsIHZsX2JrIHZsX2JtIHZsX2JiIHZsX2JjIHZsX2JmIHZyX2JrIHZyX2JtIHZyX2JiIHZyX2JjIHZyX2JmCi0KLQlhcHBlbmRfdGV4dCAiXG5Vc2UgdGhlc2UgY2hlY2tib3hlcyB0byBzZXQgdGhlIGlucHV0IHBlcm1pc3Npb25zLCAiCi0JYXBwZW5kX3RleHQgIm9yIHR5cGUgaW4gdGhlIFwiS01CQ0YuLi5cIlxuIgotCWFwcGVuZF90ZXh0ICItaW5wdXQgc3RyaW5nIG1hbnVhbGx5LiAgVGhlbiBwcmVzcyBcIk9LXCIgb3IgXCJDYW5jZWxcIi5cbiIKLQlhcHBlbmRfdGV4dCAiKG5vdGU6IGFuIGVtcHR5IHNldHRpbmcgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCAiCi0JYXBwZW5kX3RleHQgInNlZSB2aWV3b25seSlcblxuIgotCXNldCB3ICIkdGV4dF9hcmVhLndrX2YiCi0JY2F0Y2gge2Rlc3Ryb3kgJHd9Ci0JZnJhbWUgJHcgLWJkIDEgLXJlbGllZiByaWRnZSAtY3Vyc29yIHt0b3BfbGVmdF9hcnJvd30KLQlzZXQgZmwgJHcuZmwKLQlmcmFtZSAkZmwKLQlzZXQgZnIgJHcuZnIKLQlmcmFtZSAkZnIKLQlsYWJlbCAkZmwubCAtZm9udCAkZmZvbnQgLXRleHQgIk5vcm1hbCBjbGllbnRzOiAgICIKLQljaGVja2J1dHRvbiAkZmwuYmsgLXBhZHkgMSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2bF9iayBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0ICJLZXlzdHJva2VzIiAKLQljaGVja2J1dHRvbiAkZmwuYm0gLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgdmxfYm0gXAotCQktcGFkeSAxIC1jb21tYW5kIHNldF9rbWJjX3N0ciAtdGV4dCAiTW91c2UtTW90aW9uIiAKLQljaGVja2J1dHRvbiAkZmwuYmIgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgdmxfYmIgXAotCQktcGFkeSAxIC1jb21tYW5kIHNldF9rbWJjX3N0ciAtdGV4dCAiQnV0dG9uLUNsaWNrIgotCWNoZWNrYnV0dG9uICRmbC5iYyAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2bF9iYyBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0ICJDbGlwYm9hcmQtSW5wdXQiCi0JY2hlY2tidXR0b24gJGZsLmJmIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIHZsX2JmIFwKLQkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgIkZpbGVzIgotCWxhYmVsICRmci5sIC1wYWR5IDEgLWZvbnQgJGZmb250IC10ZXh0ICJWaWV3LU9ubHkgY2xpZW50czoiCi0JY2hlY2tidXR0b24gJGZyLmJrIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIHZyX2JrIFwKLQkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgIktleXN0cm9rZXMiIAotCWNoZWNrYnV0dG9uICRmci5ibSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2cl9ibSBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0ICJNb3VzZS1Nb3Rpb24iIAotCWNoZWNrYnV0dG9uICRmci5iYiAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2cl9iYiBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0ICJCdXR0b24tQ2xpY2siCi0JY2hlY2tidXR0b24gJGZyLmJjIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIHZyX2JjIFwKLQkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgIkNsaXBib2FyZC1JbnB1dCIKLQljaGVja2J1dHRvbiAkZnIuYmYgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgdnJfYmYgXAotCQktcGFkeSAxIC1jb21tYW5kIHNldF9rbWJjX3N0ciAtdGV4dCAiRmlsZXMiCi0KLQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKGlucHV0KV19IHsKLQkJc2V0IGlucHV0X3N0ciAkbWVudV92YXIoaW5wdXQpCi0JfSBlbHNlIHsKLQkJc2V0IGlucHV0X3N0ciAiIgotCX0KLQotCWlmIHtbcmVnZXhwIHsoLiopLCguKil9ICRpbnB1dF9zdHIgbWF0Y2ggbm9ybWFsIHZpZXdvbmx5XX0gewotCQk7Ci0JfSBlbHNlIHsKLQkJc2V0IG5vcm1hbCAkaW5wdXRfc3RyCi0JCXNldCB2aWV3b25seSAiIgotCX0KLQlzZXQgdmxfYmsgMAotCXNldCB2bF9ibSAwCi0Jc2V0IHZsX2JiIDAKLQlzZXQgdmxfYmMgMAotCXNldCB2bF9iZiAwCi0KLQlzZXQgdnJfYmsgMAotCXNldCB2cl9ibSAwCi0Jc2V0IHZyX2JiIDAKLQlzZXQgdnJfYmMgMAotCXNldCB2cl9iZiAwCi0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtLfSAkbm9ybWFsXX0gewotCQlzZXQgdmxfYmsgMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtNfSAkbm9ybWFsXX0gewotCQlzZXQgdmxfYm0gMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtCfSAkbm9ybWFsXX0gewotCQlzZXQgdmxfYmIgMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtDfSAkbm9ybWFsXX0gewotCQlzZXQgdmxfYmMgMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtGfSAkbm9ybWFsXX0gewotCQlzZXQgdmxfYmYgMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtLfSAkdmlld29ubHldfSB7Ci0JCXNldCB2cl9iayAxCi0JfQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge019ICR2aWV3b25seV19IHsKLQkJc2V0IHZyX2JtIDEKLQl9Ci0JaWYge1tyZWdleHAgLW5vY2FzZSB7Qn0gJHZpZXdvbmx5XX0gewotCQlzZXQgdnJfYmIgMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtDfSAkdmlld29ubHldfSB7Ci0JCXNldCB2cl9iYyAxCi0JfQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0Z9ICR2aWV3b25seV19IHsKLQkJc2V0IHZyX2JmIDEKLQl9Ci0KLQlwYWNrICRmbC5sICRmbC5iayAkZmwuYm0gJGZsLmJiICRmbC5iYyAkZmwuYmYgLXNpZGUgdG9wIC1maWxsIHgKLQlwYWNrICRmci5sICRmci5iayAkZnIuYm0gJGZyLmJiICRmci5iYyAkZnIuYmYgLXNpZGUgdG9wIC1maWxsIHgKLQlwYWNrICRmbCAkZnIgLXNpZGUgbGVmdAotCXVwZGF0ZQotCXVwZGF0ZSBpZGxldGFza3MKLQkkdGV4dF9hcmVhIHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJHcKLQkkdGV4dF9hcmVhIHNlZSBlbmQKLQkkdGV4dF9hcmVhIGluc2VydCBlbmQgIlxuIgotIwkkdGV4dF9hcmVhIGluc2VydCBlbmQgIlxuXG5cblxuXG5cblxuXG5cbiIKLQotCXNldCBjbGVhbnVwX3dpbmRvdyAkdwotfQotCi1wcm9jIHNldF9jYV9zdHIge3d9IHsKLQlnbG9iYWwgY2FfYmsgY2FfYm0gY2FfYmIgY2FfYmMgY2FfYmYgY2FfZGkKLQotCWlmIHskY2FfZGl9IHsKLQkJZW50cnlfaW5zZXJ0ICJkaXNjb25uZWN0IgotCQkkdy5iayBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCSR3LmJtIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJJHcuYmIgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZAotCQkkdy5iYyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCSR3LmJmIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJcmV0dXJuCi0JfQotCi0JJHcuYmsgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKLQkkdy5ibSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCSR3LmJiIGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCi0JJHcuYmMgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKLQkkdy5iZiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAotCi0Jc2V0IHN0ciAiIgotCWlmIHskY2FfYmt9IHsKLQkJYXBwZW5kIHN0ciAiSyIKLQl9Ci0JaWYgeyRjYV9ibX0gewotCQlhcHBlbmQgc3RyICJNIgotCX0KLQlpZiB7JGNhX2JifSB7Ci0JCWFwcGVuZCBzdHIgIkIiCi0JfQotCWlmIHskY2FfYmN9IHsKLQkJYXBwZW5kIHN0ciAiQyIKLQl9Ci0JaWYgeyRjYV9iZn0gewotCQlhcHBlbmQgc3RyICJGIgotCX0KLQllbnRyeV9pbnNlcnQgJHN0cgotfQotCi1wcm9jIGluc2VydF9jbGllbnRfYWN0aW9uX3dpbmRvdyB7aW5wdXR9IHsKLQlnbG9iYWwgdGV4dF9hcmVhIGNsZWFudXBfd2luZG93Ci0JZ2xvYmFsIGZmb250IG1lbnVfdmFyCi0JZ2xvYmFsIGNhX2JrIGNhX2JtIGNhX2JiIGNhX2JjIGNhX2JmIGNhX2RpCi0KLQlhcHBlbmRfdGV4dCAiXG5Vc2UgdGhlc2UgY2hlY2tib3hlcyB0byBzZXQgdGhlIGlucHV0IHBlcm1pc3Npb25zICIKLQlhcHBlbmRfdGV4dCAiZm9yIHRoaXMgY2xpZW50XG4tT1ItIHdoZXRoZXIgdG8gZGlzY29ubmVjdCBpdCBpbnN0ZWFkLiAgIgotCWFwcGVuZF90ZXh0ICJUaGVuIHByZXNzIFwiT0tcIiBvciBcIkNhbmNlbFwiLlxuXG4iCi0Jc2V0IHcgIiR0ZXh0X2FyZWEuY2FfZiIKLQljYXRjaCB7ZGVzdHJveSAkd30KLQlmcmFtZSAkdyAtYmQgMSAtcmVsaWVmIHJpZGdlIC1jdXJzb3Ige3RvcF9sZWZ0X2Fycm93fQotCWNoZWNrYnV0dG9uICR3LmRpIC1wYWR5IDEgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgY2FfZGkgXAotCQktcGFkeSAxIC1jb21tYW5kICJzZXRfY2Ffc3RyICR3IiAtdGV4dCAiRGlzY29ubmVjdCAgIiAKLQljaGVja2J1dHRvbiAkdy5iayAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSBjYV9iayBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgInNldF9jYV9zdHIgJHciIC10ZXh0ICJLZXlzdHJva2VzIiAKLQljaGVja2J1dHRvbiAkdy5ibSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSBjYV9ibSBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgInNldF9jYV9zdHIgJHciIC10ZXh0ICJNb3VzZS1Nb3Rpb24iIAotCWNoZWNrYnV0dG9uICR3LmJiIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIGNhX2JiIFwKLQkJLXBhZHkgMSAtY29tbWFuZCAic2V0X2NhX3N0ciAkdyIgLXRleHQgIkJ1dHRvbi1DbGljayIKLQljaGVja2J1dHRvbiAkdy5iYyAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSBjYV9iYyBcCi0JCS1wYWR5IDEgLWNvbW1hbmQgInNldF9jYV9zdHIgJHciIC10ZXh0ICJDbGlwYm9hcmQiCi0JY2hlY2tidXR0b24gJHcuYmYgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgY2FfYmYgXAotCQktcGFkeSAxIC1jb21tYW5kICJzZXRfY2Ffc3RyICR3IiAtdGV4dCAiRmlsZXMiCi0KLQlzZXQgY2FfZGkgMAotCXNldCBjYV9iayAwCi0Jc2V0IGNhX2JtIDAKLQlzZXQgY2FfYmIgMAotCXNldCBjYV9iZiAwCi0Jc2V0IGNhX2JjIDAKLQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0t9ICRpbnB1dF19IHsKLQkJc2V0IGNhX2JrIDEKLQl9Ci0JaWYge1tyZWdleHAgLW5vY2FzZSB7TX0gJGlucHV0XX0gewotCQlzZXQgY2FfYm0gMQotCX0KLQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtCfSAkaW5wdXRdfSB7Ci0JCXNldCBjYV9iYiAxCi0JfQotCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0N9ICRpbnB1dF19IHsKLQkJc2V0IGNhX2JjIDEKLQl9Ci0JaWYge1tyZWdleHAgLW5vY2FzZSB7Rn0gJGlucHV0XX0gewotCQlzZXQgY2FfYmYgMQotCX0KLQotCXBhY2sgJHcuZGkgJHcuYmsgJHcuYm0gJHcuYmIgJHcuYmMgJHcuYmYgLXNpZGUgbGVmdAotCXVwZGF0ZQotCXVwZGF0ZSBpZGxldGFza3MKLQkkdGV4dF9hcmVhIHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJHcKLQkkdGV4dF9hcmVhIHNlZSBlbmQKLQkkdGV4dF9hcmVhIGluc2VydCBlbmQgIlxuIgotCi0Jc2V0IGNsZWFudXBfd2luZG93ICR3Ci19Ci0KLXByb2MgY2xlYW51cF90ZXh0X3dpbmRvdyB7fSB7Ci0JZ2xvYmFsIGNsZWFudXBfd2luZG93Ci0JaWYge1tpbmZvIGV4aXN0cyBjbGVhbnVwX3dpbmRvd119IHsKLQkJY2F0Y2gge2Rlc3Ryb3kgJGNsZWFudXBfd2luZG93fQotCX0KLX0KLQotIyBGb3IgdXBkYXRpbmcgYSBzdHJpbmcgdmFyaWFibGUuICAgQWxzbyB1c2VkIGZvciBzaW1wbGUgT0svQ2FuY2VsIGRpYWxvZ3MKLSMgd2l0aCBlbnRyeSA9IDAuCi1wcm9jIGVudHJ5X2RpYWxvZyB7aXRlbSB7ZW50cnkgMX19IHsKLQlnbG9iYWwgbWVudV92YXIgZW50cnlfc3RyIGVudHJ5X3NldCBlbnRyeV9kaWFsb2dfaXRlbQotCWdsb2JhbCB1bnNldF9zdHIgY29ubmVjdGVkX3RvX3gxMXZuYyBlbnRyeV9ib3gKLQotCXNldCBlbnRyeV9zdHIgIlNldCAkaXRlbSIKLQlzZXQgZW50cnlfc2V0IDAKLQlzZXQgZW50cnlfZGlhbG9nX2l0ZW0gJGl0ZW0KLQotCWVudHJ5X2VuYWJsZQotCW1lbnVzX2Rpc2FibGUKLQotCWlmIHskaXRlbSA9PSAicGFzc3dkIiB8fCAkaXRlbSA9PSAidmlld3Bhc3N3ZCJ9IHsKLQkJJGVudHJ5X2JveCBjb25maWd1cmUgLXNob3cgIioiCi0JfQotCi0JaWYgeyRlbnRyeX0gewotCQllbnRyeV9pbnNlcnQgIiIKLQkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldICYmCi0JCSAgICAkbWVudV92YXIoJGl0ZW0pICE9ICR1bnNldF9zdHJ9IHsKLQkJCWVudHJ5X2luc2VydCAkbWVudV92YXIoJGl0ZW0pCi0JCQllbnRyeV9zZWxlY3QKLQkJfQotCi0JCWlmIHtbaXNfYnJvd3NlICRpdGVtXX0gewotCQkJZW50cnlfYnJvd3NlX2J1dHRvbgotCQl9Ci0JCXNldF9pbmZvICJTZXQgcGFyYW1ldGVyIGluIGVudHJ5IGJveCwgIgotCQllbnRyeV9mb2N1cwotCX0gZWxzZSB7Ci0JCWVudHJ5X2Rpc2FibGUgYm94Ci0JfQotCi0Jc2V0IGNsZWFuX3RleHRfd2luZG93IDA7Ci0KLQlpZiB7JGl0ZW0gPT0gImlucHV0In0gewotCQlpbnNlcnRfaW5wdXRfd2luZG93Ci0JCXNldCBjbGVhbl90ZXh0X3dpbmRvdyAxCi0JfQotCi0JdXBkYXRlCi0KLQkjIHdhaXQgZm9yIHVzZXIgcmVwbHk6Ci0JdndhaXQgZW50cnlfc2V0Ci0KLQlzZXQgcmMgJGVudHJ5X3NldAotCXNldCBlbnRyeV9zZXQgMAotCi0Jc2V0IHZhbHVlIFtlbnRyeV9nZXRdCi0JdXBkYXRlCi0KLQllbnRyeV9icm93c2VfYnV0dG9uIDAKLQlzZXQgZW50cnlfc3RyICJTZXQuLi4gOiIKLQotCWVudHJ5X2RlbGV0ZQotCWVudHJ5X2Rpc2FibGUKLQltZW51c19lbmFibGUKLQotCWlmIHskY2xlYW5fdGV4dF93aW5kb3d9IHsKLQkJY2xlYW51cF90ZXh0X3dpbmRvdzsKLQl9Ci0KLQl1cGRhdGUKLQotCWlmIHshICRlbnRyeX0gewotCQk7Ci0JfSBlbHNlaWYgeyRyY30gewotCQlzZXQgbWVudV92YXIoJGl0ZW0pICR2YWx1ZQotCX0gZWxzZSB7Ci0JCWlmIHtbaW5fZGVidWdfbW9kZV19IHsKLQkJCWFwcGVuZF90ZXh0ICJza2lwcGVkIHNldHRpbmcgJGl0ZW1cbiIKLQkJfQotCX0KLQotCSRlbnRyeV9ib3ggY29uZmlndXJlIC1zaG93ICIiCi0KLQlyZXR1cm4gJHJjCi19Ci0KLXByb2Mgd2FybmluZ19kaWFsb2cge21zZyB7aXRlbSAiZ3VpIn0gfSB7Ci0JYXBwZW5kX3RleHQgJG1zZwotCSMganVzdCByZXVzZSB0aGUgZW50cnkgd2lkZ2V0cyBmb3IgYSB5ZXMvbm8gZGlhbG9nCi0JcmV0dXJuIFtlbnRyeV9kaWFsb2cgJGl0ZW0gMF0KLX0KLQotIyBGb3IgdXBkYXRpbmcgYSBib29sZWFuIHRvZ2dsZToKLXByb2MgY2hlY2tfdmFyIHtpdGVtfSB7Ci0JZ2xvYmFsIG1lbnVfdmFyCi0KLQlzZXQgaW52YWwgJG1lbnVfdmFyKCRpdGVtKTsKLQotCWlmIHskaXRlbSA9PSAiZGVidWdfZ3VpIn0gewotCQlyZXR1cm4gIiI7Ci0JfQotCi0Jc2V0IHJuYW1lICRpdGVtCi0JaWYgeyEgJGludmFsfSB7Ci0JCWlmIHtbcmVnZXhwIHtebm99ICRpdGVtXX0gewotCQkJcmVnc3ViIHtebm99ICRybmFtZSAiIiBybmFtZQotCQl9IGVsc2UgewotCQkJc2V0IHJuYW1lICJubyRybmFtZSIKLQkJfQotCX0KLQlyZXR1cm4gJHJuYW1lCi19Ci0KLXByb2Mgc2VlX2lmX29rIHtxdWVyeSBpdGVtIGV4cGVjdGVkfSB7Ci0JZ2xvYmFsIHF1ZXJ5X3Jlc3VsdF9saXN0Ci0KLQlzZXQgb2sgMAotCXNldCBmb3VuZCAiIgotCi0Jc2V0IHF1ZXJ5X3Jlc3VsdF9saXN0IFtzcGxpdF9xdWVyeSAkcXVlcnldCi0KLQlmb3JlYWNoIHEgJHF1ZXJ5X3Jlc3VsdF9saXN0IHsKLQkJIyBYWFggZm9sbG93aW5nIHdpbGwgY3Jhc2ggaWYgJGl0ZW0gaXMgbm90IGEgZ29vZCByZWdleHAKLQkJIyBuZWVkIHRvIHByb3RlY3QgaXQgXFEkaXRlbVxFIHN0eWxlLi4uCi0jCQlpZiB7W3JlZ2V4cCAiXiRpdGVtOiIgJHFdfSB7Ci0jCQkJc2V0IGZvdW5kICRxCi0jCQl9Ci0JCWlmIHtbc3RyaW5nIGZpcnN0ICIkaXRlbToiICRxXSA9PSAwfSB7Ci0JCQlzZXQgZm91bmQgJHEKLQkJfQotCQlpZiB7JHEgPT0gJGV4cGVjdGVkfSB7Ci0JCQlzZXQgb2sgMQotCQkJaWYgeyRmb3VuZCAhPSAiIn0gewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmIHskZm91bmQgPT0gIiJ9IHsKLQkJc2V0IG1zZyAkcXVlcnkKLQkJcmVnc3ViIHteYS4uPX0gJG1zZyB7fSBtc2cKLQkJaWYge1tzdHJpbmcgbGVuZ3RoICRtc2ddID4gNjB9IHsKLQkJCXNldCBtc2cgW3N0cmluZyByYW5nZSAkbXNnIDAgNjBdCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbXNnICRmb3VuZAotCX0KLQlpZiB7ISRvayAmJiAkZm91bmQgIT0gIiJ9IHsKLQkJIyBjaGVjayBmb3IgZmxvYXRpbmcgcG9pbnQgbWF0Y2g6Ci0JCXNldCB2MSAiIgotCQlzZXQgdjIgIiIKLQkJcmVnZXhwIHs6KFswLTkuXVswLTkuXSopJH0gJGZvdW5kIG0wIHYxCi0JCXJlZ2V4cCB7OihbMC05Ll1bMC05Ll0qKSR9ICRleHBlY3RlZCBtMCB2MgotCQlpZiB7JHYxICE9ICIiICYmICR2MiAhPSAiIn0gewotCQkJc2V0IGRpZmYgIiIKLQkJCWNhdGNoIHtzZXQgZGlmZiBbZXhwciAiJHYxIC0gJHYyIl19Ci0JCQlpZiB7JGRpZmYgIT0gIiJ9IHsKLQkJCQlpZiB7JGRpZmYgPCAwfSB7Ci0JCQkJCXNldCBkaWZmIFtleHByICIwLjAgLSAkZGlmZiJdCi0JCQkJfQotCQkJCWlmIHskZGlmZiA8IDAuMDAwMDF9IHsKLQkJCQkJc2V0IG9rIDEKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgeyRva30gewotCQlhcHBlbmRfdGV4dCAiXHRTZXQgT0sgICgkbXNnKVxuIgotCQlyZXR1cm4gMQotCi0JfSBlbHNlaWYge1tvcHRfbWF0Y2ggUCAkaXRlbV0gJiYgW3JlZ2V4cCB7OigtfFwrKX0gJGV4cGVjdGVkXX0gewotCQkjIGUuZy4gYmxhY2tvdXQ6KzMweDMwKzIwKzIwCi0JCWFwcGVuZF90ZXh0ICJcdCgkbXNnKVxuIgotCQlyZXR1cm4gMQotCX0gZWxzZWlmIHtbcmVnZXhwIHs6WzAtOV1cLlswLTldfSAkZXhwZWN0ZWRdfSB7Ci0JCWFwcGVuZF90ZXh0ICJcdCgkbXNnKVxuIgotCQlyZXR1cm4gMQotCX0gZWxzZWlmIHskaXRlbSA9PSAiY29ubmVjdCIgfHwgJGl0ZW0gPT0gImRpc2Nvbm5lY3QiCi0JICAgIHx8ICRpdGVtID09ICJjbGllbnQiIHx8ICRpdGVtID09ICJjbGllbnRfaW5wdXQifSB7Ci0JCWFwcGVuZF90ZXh0ICJcdCgkbXNnKVxuIgotCQlyZXR1cm4gMQotCX0gZWxzZWlmIHskaXRlbSA9PSAicGFzc3dkIiB8fCAkaXRlbSA9PSAidmlld3Bhc3N3ZCJ9IHsKLQkJYXBwZW5kX3RleHQgIlx0KCRtc2cpXG4iCi0JCXJldHVybiAxCi0JfSBlbHNlIHsKLQkJYXBwZW5kX3RleHQgIlx0KkZBSUxFRCogJG1zZ1xuIgotCQlyZXR1cm4gMAotCX0KLX0KLQotcHJvYyBnZXRfZGVmYXVsdF92YXJzIHt9IHsKLQlnbG9iYWwgZGVmYXVsdF92YXIgZW52Ci0KLQlzZXQgcXJ5IFthbGxfcXVlcnlfdmFyc10KLQotCWFwcGVuZCBxcnkgIix2bmNjb25uZWN0IgotCi0Jc2V0IHEgIiIKLQlzZXQgaSAwCi0Jc2V0IGFsbCAiIgotCWZvcmVhY2ggcyBbc3BsaXQgJHFyeSAiLCJdIHsKLQkJaWYgeyRxICE9ICIifSB7Ci0JCQlhcHBlbmQgcSAiLCIKLQkJfQotCQlhcHBlbmQgcSAkcwotCQlpbmNyIGkKLQkJaWYgeyRpID4gNTB9IHsKLQkJCXNldCBxYXJncyBbbGlzdCAiLVFEIiAkcV0KLQkJCXNldCBhIFtydW5fcmVtb3RlX2NtZCAkcWFyZ3NdCi0JCQlpZiBbaW5mbyBleGlzdHMgZW52KFRLWDExVk5DX1BSSU5UX0FMTF9RRCldIHsKLQkJCQlwdXRzICRxCi0JCQkJcHV0cyAkYQotCQkJCXB1dHMgIi0tLS0tLS0tLS0tLS0tLSIKLQkJCX0KLQkJCWlmIHskYWxsICE9ICIifSB7Ci0JCQkJYXBwZW5kIGFsbCAiLCIKLQkJCX0KLQkJCWFwcGVuZCBhbGwgJGEKLQkJCXNldCBxICIiCi0JCQlzZXQgaSAwCi0JCX0KLQl9Ci0JaWYgeyRxICE9ICIifSB7Ci0JCXNldCBxYXJncyBbbGlzdCAiLVFEIiAkcV0KLQkJc2V0IGEgW3J1bl9yZW1vdGVfY21kICRxYXJnc10KLQkJaWYgW2luZm8gZXhpc3RzIGVudihUS1gxMVZOQ19QUklOVF9BTExfUUQpXSB7Ci0JCQlwdXRzICRxCi0JCQlwdXRzICRhCi0JCQlwdXRzICItLS0tLS0tLS0tLS0tLS0iCi0JCX0KLQkJaWYgeyRhbGwgIT0gIiJ9IHsKLQkJCWFwcGVuZCBhbGwgIiwiCi0JCX0KLQkJYXBwZW5kIGFsbCAkYQotCX0KLQotIyBvbGQgd2F5LCBxcnkgdG9vIGxvbmcuLi4KLSMJc2V0IHFhcmdzIFtsaXN0ICItUUQiICRxcnldCi0jCXNldCBhbGwgW3J1bl9yZW1vdGVfY21kICRxYXJnc10KLQotCWlmIHtbcmVnZXhwIHthbnM9fSAkYWxsXX0gewotCQkjYXBwZW5kX3RleHQgIlJldHJpZXZlZCBhbGwgZGVmYXVsdCBzZXR0aW5ncy5cbiIKLQl9IGVsc2UgewotCQkjYXBwZW5kX3RleHQgIkZhaWxlZCB0byByZXRyaWV2ZSBkZWZhdWx0IHNldHRpbmdzLlxuIgotCX0KLQotCXNldCBxdWVyeV9yZXN1bHRfbGlzdCBbc3BsaXRfcXVlcnkgJGFsbF0KLQotCXNldCBkZWZhdWx0X3ZhcihndWkpICIiCi0KLQlmb3JlYWNoIHBpZWNlICRxdWVyeV9yZXN1bHRfbGlzdCB7Ci0JCWlmIHtbcmVnZXhwIHteKFteOl1bXjpdKik6KC4qKSR9ICRwaWVjZSBtMCBpdGVtIHZhbF19IHsKLQkJCWlmIHskdmFsID09ICJOL0EifSB7Ci0JCQkJaWYgeyRpdGVtID09ICJ2bmNjb25uZWN0In0gewotCQkJCQlzZXQgdmFsIDEKLQkJCQl9IGVsc2UgewotCQkJCQlzZXQgdmFsICIiCi0JCQkJfQotCQkJfQotCQkJaWYgeyRpdGVtID09ICJkaXNwbGF5In0gewotCQkJCXNldCB2YWwgIiIKLQkJCX0gZWxzZWlmIHskaXRlbSA9PSAiZGVza3RvcCJ9IHsKLQkJCQlzZXQgdmFsICIiCi0JCQl9IGVsc2VpZiB7JGl0ZW0gPT0gImF1dGgifSB7Ci0JCQkJc2V0IHZhbCAiIgotCQkJfSBlbHNlaWYgeyRpdGVtID09ICJndWkifSB7Ci0JCQkJY29udGludWUKLQkJCX0gCi0JCQkjIHNvbWUgaGFja3Mgd2UgZG8gaGVyZSBmb3Igbm93Li4KLQkJCWlmIHskaXRlbSA9PSAiY3Vyc29yIiAmJiAkdmFsID09ICIifSB7Ci0JCQkJc2V0IHZhbCAibW9zdCIKLQkJCX0gZWxzZWlmIHskaXRlbSA9PSAic2Nyb2xsY29weXJlY3QiICYmICR2YWwgPT0gIiJ9IHsKLQkJCQlzZXQgdmFsICJhbHdheXMiCi0JCQl9IGVsc2VpZiB7JGl0ZW0gPT0gIndpcmVjb3B5cmVjdCIgJiYgJHZhbCA9PSAiIn0gewotCQkJCXNldCB2YWwgImFsd2F5cyIKLSMJCQl9IGVsc2VpZiB7JGl0ZW0gPT0gIm92ZXJsYXlfbm9jdXJzb3IiICYmICR2YWwgPT0gMH0gewotIwkJCQlzZXQgdmFsIDEKLQkJCX0KLQotCQkJc2V0IGRlZmF1bHRfdmFyKCRpdGVtKSAkdmFsCi0jcHV0cyAiZGVmYXVsdDogJGl0ZW0gLT4gJHZhbCIKLQkJfQotCX0KLX0KLQotcHJvYyB0aWxkZV9leHBhbmQge2ZpbGV9IHsKLQlnbG9iYWwgZW52Ci0JaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKLQkJcmV0dXJuICRmaWxlCi0JfQotCi0Jc2V0IHVzZXIgIiIKLQlpZiB7W2luZm8gZXhpc3RzIGVudihVU0VSKV19IHsKLQkJc2V0IHVzZXIgJGVudihVU0VSKQotCX0KLQlpZiB7JHVzZXIgPT0gIiIgJiYgW2luZm8gZXhpc3RzIGVudihMT0dOQU1FKV19IHsKLQkJc2V0IHVzZXIgJGVudihMT0dOQU1FKQotCX0KLQotCXNldCBob21lICIiCi0JaWYge1tpbmZvIGV4aXN0cyBlbnYoSE9NRSldfSB7Ci0JCXNldCBob21lICRlbnYoSE9NRSkKLQl9IGVsc2VpZiB7JHVzZXIgIT0gIiJ9IHsKLQkJc2V0IGhvbWUgIi9ob21lLyR1c2VyIgotCX0KLQotCWlmIHtbcmVnZXhwIHtefn0gJGZpbGVdfSB7Ci0JCWlmIHtbcmVnZXhwIHtefi99ICRmaWxlXX0gewotCQkJaWYgeyRob21lICE9ICIifSB7Ci0JCQkJcmVnc3ViIHtefn0gJGZpbGUgJGhvbWUgZmlsZQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVnc3ViIHtefn0gJGZpbGUgIi9ob21lLyIgZmlsZQotCQl9Ci0JfQotCXJldHVybiAkZmlsZQotfQotCi1wcm9jIGluc2VydF9jbWRsaW5lX3ZhcnMge30gewotCWdsb2JhbCBlbnYgY21kX3ZhciBtZW51X3ZhciBkZWZhdWx0X3ZhciB4MTF2bmNfY21kbGluZQotCWlmIHshW2luZm8gZXhpc3RzIHgxMXZuY19jbWRsaW5lXX0gewotCQlyZXR1cm4KLQl9Ci0JaWYgeyR4MTF2bmNfY21kbGluZSA9PSAiIn0gewotCQlyZXR1cm4KLQl9Ci0Jc2V0IGNtZF92YXIobm92YXIpIDEgCi0Jc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHgxMXZuY19jbWRsaW5lXQotCi0Jd2hpbGUge1tyZWdleHAgLS0ge14tfSAkc3RyXX0gewotCQlpZiB7W3JlZ2V4cCAtLSB7Xi0tKihbXiBcdF1bXiBcdF0qKSguKikkfSAkc3RyIG0gdmFyIHJlc3RdfSB7Ci0JCQlzZXQgcmVzdCBbc3RyaW5nIHRyaW0gJHJlc3RdCi0JCQlzZXQgdmFyIFtzdHJpbmcgdHJpbSAkdmFyXQotCQkJaWYge1tyZWdleHAge15ce1x7KFteXH1dKilcfVx9KC4qKX0gJHJlc3QgbSB2YWwgcmVzdF19IHsKLQkJCQlzZXQgc3RyIFtzdHJpbmcgdHJpbSAkcmVzdF0KLQkJCQlzZXQgY21kX3ZhcigkdmFyKSAkdmFsCi0JCQl9IGVsc2UgewotCQkJCXNldCBzdHIgJHJlc3QKLQkJCQlzZXQgY21kX3ZhcigkdmFyKSAiYm9vbGVhbiIKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJyZWFrCi0JCX0KLQl9Ci0KLQlpZiB7W2luZm8gZXhpc3RzIGNtZF92YXIocmMpXX0gewotCQlsb2FkX3NldHRpbmdzICRjbWRfdmFyKHJjKQotCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgY21kX3Zhcihub3JjKV19IHsKLQkJOwotCX0gZWxzZSB7Ci0JCXNldCBmaWxleCBbdGlsZGVfZXhwYW5kICJ+Ly54MTF2bmNyYyJdCi0JCWlmIHtbZmlsZSBleGlzdHMgJGZpbGV4XX0gewotCQkJbG9hZF9zZXR0aW5ncyAkZmlsZXgKLQkJfQotCX0KLQotCWZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBjbWRfdmFyXSB7Ci0JCWlmIHskdmFyID09ICJub3ZhciJ9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYge1tyZWdleHAge15bIFx0XSokfSAkdmFyXX0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKCR2YXIpXX0gewotCQkJaWYgeyRjbWRfdmFyKCR2YXIpID09ICJib29sZWFuIn0gewotCQkJCXNldCBtZW51X3ZhcigkdmFyKSAxCi0JCQl9IGVsc2UgewotCQkJCXNldCBtZW51X3ZhcigkdmFyKSAkY21kX3ZhcigkdmFyKQotCQkJfQotCQl9Ci0JfQotfQotCi1wcm9jIGNvcHlfZGVmYXVsdF92YXJzIHt9IHsKLQlnbG9iYWwgbWVudV92YXIgZGVmYXVsdF92YXIKLQlmb3JlYWNoIGl0ZW0gW2FycmF5IG5hbWVzIGRlZmF1bHRfdmFyXSB7Ci0JCWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoJGl0ZW0pXX0gewotCQkJaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X3ZhcigkaXRlbSldfSB7Ci0JCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSAkZGVmYXVsdF92YXIoJGl0ZW0pCi0JCQl9Ci0JCX0KLQl9Ci0JZm9yZWFjaCBpdGVtIFthcnJheSBuYW1lcyBtZW51X3Zhcl0gewotCQlpZiB7W2luZm8gZXhpc3RzIGRlZmF1bHRfdmFyKCRpdGVtKV19IHsKLQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJGRlZmF1bHRfdmFyKCRpdGVtKQotCQl9Ci0JfQotfQotCi1wcm9jIHVwZGF0ZV9tZW51X3ZhcnMge3txdWVyeSAiIn19IHsKLQlnbG9iYWwgYWxsX3NldHRpbmdzIG1lbnVfdmFyIHF1ZXJ5X3Jlc3VsdF9saXN0Ci0JZ2xvYmFsIHgxMXZuY19pY29uX21vZGUKLQotCXNldCBkZWJ1ZyBbaW5fZGVidWdfbW9kZV0KLQotCWlmIHskcXVlcnkgPT0gIlVTRV9MSVNUIn0gewotCQk7Ci0JfSBlbHNlaWYgeyRxdWVyeSA9PSAiIn0gewotCQlzZXQgcXVlcnlfcmVzdWx0X2xpc3QgW3NwbGl0X3F1ZXJ5ICRhbGxfc2V0dGluZ3NdCi0JfSBlbHNlIHsKLQkJc2V0IHF1ZXJ5X3Jlc3VsdF9saXN0IFtzcGxpdF9xdWVyeSAkcXVlcnldCi0JfQotCi0JZm9yZWFjaCBwaWVjZSAkcXVlcnlfcmVzdWx0X2xpc3QgewotI3B1dHMgc3RkZXJyICJVTVY6ICRwaWVjZSIKLQkJaWYgW3JlZ2V4cCB7aWNvbl9tb2RlOjB9ICRwaWVjZV0gewotCQkJc2V0IHgxMXZuY19pY29uX21vZGUgMAotCQkJI3B1dHMgc3RkZXJyICJ4MTF2bmNfaWNvbl9tb2RlOiAkeDExdm5jX2ljb25fbW9kZSIKLQkJfQotCQlpZiBbcmVnZXhwIHtpY29uX21vZGU6MX0gJHBpZWNlXSB7Ci0JCQlzZXQgeDExdm5jX2ljb25fbW9kZSAxCi0JCQkjcHV0cyBzdGRlcnIgIngxMXZuY19pY29uX21vZGU6ICR4MTF2bmNfaWNvbl9tb2RlIgotCQl9Ci0JCSMgWFhYIGlwdjYKLQkJaWYge1tyZWdleHAge14oW146XVteOl0qKTooLiopJH0gJHBpZWNlIG0wIGl0ZW0gdmFsXX0gewotCQkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7Ci0JCQkJc2V0IG9sZCAkbWVudV92YXIoJGl0ZW0pCi0jcHV0cyBzdGRlcnIgIiAgICAgJG9sZCIKLQkJCQlpZiB7JHZhbCA9PSAiTi9BIn0gewotCQkJCQljb250aW51ZQotCQkJCX0KLQkJCQlzZXQgbWVudV92YXIoJGl0ZW0pICR2YWwKLQkJCX0KLQkJCWlmIHskaXRlbSA9PSAiY2xpZW50cyJ9IHsKLQkJCQl1cGRhdGVfY2xpZW50c19tZW51ICR2YWwKLQkJCX0gZWxzZWlmIHskaXRlbSA9PSAiZGlzcGxheSJ9IHsKLQkJCQlzZXRfeDExX2Rpc3BsYXkgJHZhbAotCQkJfSBlbHNlaWYgeyRpdGVtID09ICJ2bmNkaXNwbGF5In0gewotCQkJCXNldF92bmNfZGlzcGxheSAkdmFsCi0JCQl9IGVsc2VpZiB7JGl0ZW0gPT0gImh0dHBfdXJsIn0gewotCQkJCXNldF92bmNfdXJsICR2YWwKLQkJCX0KLQkJfQotCX0KLX0KLQotcHJvYyBsb2FkX3NldHRpbmdzIHt7ZmlsZSAiIn19IHsKLQlnbG9iYWwgbWVudV92YXIgZGVmYXVsdF92YXIgZW52Ci0KLQlpZiB7JGZpbGUgPT0gIiJ9IHsKLQkJaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIobG9hZC1zZXR0aW5ncyldfSB7Ci0JCQlyZXR1cm4KLQkJfQotCQlzZXQgZmlsZSAkbWVudV92YXIobG9hZC1zZXR0aW5ncykKLQl9Ci0JaWYgeyRmaWxlID09ICIifSB7Ci0JCXJldHVybgotCX0KLQotCXNldCBmaCAiIgotCXNldCBmaWxleCBbdGlsZGVfZXhwYW5kICRmaWxlXQotCWNhdGNoIHtzZXQgZmggW29wZW4gJGZpbGV4ICJyIl19Ci0KLQlpZiB7JGZoID09ICIifSB7Ci0JCWFwcGVuZF90ZXh0ICJsb2FkX3NldHRpbmdzOiAqKiogZmFpbGVkIHRvIG9wZW4gJGZpbGV4ICoqKlxuIgotCQlyZXR1cm4KLQl9Ci0JY29weV9kZWZhdWx0X3ZhcnMKLQotCXNldCBzdHIgIiIKLQl3aGlsZSB7W2dldHMgJGZoIGxpbmVdID4gLTF9IHsKLQkJcmVnc3ViIC1hbGwge1xcI30gJGxpbmUge19fUVVPVEVEX0hBU0hfX30gbGluZQotCQlpZiB7W3JlZ2V4cCB7XlsgXHRdKiN9ICRsaW5lXX0gewotCQkJY29udGludWUKLQkJfQotCQlmb3Ige3NldCBpIDB9IHskaSA8IDV9IHtpbmNyIGl9IHsKLQkJCXJlZ3N1YiB7Iy4qJH0gJGxpbmUgIiIgbGluZQotCQl9Ci0JCWlmIHtbcmVnZXhwIHteWyBcdF0qJH0gJGxpbmVdfSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXJlZ3N1YiAtYWxsIHtfX1FVT1RFRF9IQVNIX199ICRsaW5lIHsjfSBsaW5lCi0JCWlmIHtbcmVnZXhwIHtcXCR9ICRsaW5lXX0gewotCQkJcmVnc3ViIHtcXCR9ICRsaW5lICIgIiBsaW5lCi0JCQlhcHBlbmQgc3RyICIkbGluZSIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCBzdHIgIiRsaW5lXG4iCi0JCX0KLQl9Ci0JY2xvc2UgJGZoCi0KLQlzZXQgY291bnQgMAotCXNldCBwYXJtcyAiIgotCi0JZm9yZWFjaCBsaW5lIFtzcGxpdCAkc3RyICJcbiJdIHsKLQkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCQlyZWdzdWIge14tLSp9ICRsaW5lICIiIGxpbmUKLQkJcmVnc3ViIC1hbGwge1sgXHRdWyBcdF0qfSAkbGluZSAiICIgbGluZQotCQlzZXQgbGlzdCBbc3BsaXQgJGxpbmVdCi0JCXNldCBpdGVtIFtsaW5kZXggJGxpc3QgMF0KLQkJc2V0IHZhbHVlIFtsaW5kZXggJGxpc3QgMV0KLQkJaWYge1tyZWdleHAge15bIFx0XSokfSAkaXRlbV19IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgeyRpdGVtID09ICJndWkifSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoJGl0ZW0pXX0gewotCQkJaWYge1t2YWx1ZV9pc19ib29sICRpdGVtXX0gewotCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgMQotCQkJCWluY3IgY291bnQKLQkJCQlhcHBlbmQgcGFybXMgIiAgLSRpdGVtXG4iCi0JCQl9IGVsc2VpZiB7W3ZhbHVlX2lzX3N0cmluZyAkaXRlbV19IHsKLQkJCQlpZiB7JHZhbHVlICE9ICIifSB7Ci0JCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJHZhbHVlCi0JCQkJCXNldCBuaXRlbSBbZ2V0X25pdGVtICRpdGVtXQotCQkJCQlhcHBlbmQgcGFybXMgIiAgLSRuaXRlbSAkdmFsdWVcbiIKLQkJCQkJaW5jciBjb3VudAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlhcHBlbmRfdGV4dCAibG9hZGVkICRjb3VudCBwYXJhbWV0ZXIgc2V0dGluZ3MgZnJvbSAkZmlsZXgiCi0JaWYgeyRjb3VudCA+IDB9IHsKLQkJYXBwZW5kX3RleHQgIjpcbiIKLQkJYXBwZW5kX3RleHQgJHBhcm1zCi0JfSBlbHNlIHsKLQkJYXBwZW5kX3RleHQgIi5cbiIKLQl9Ci19Ci0KLXByb2Mgc2F2ZV9zZXR0aW5ncyB7fSB7Ci0Jc2V0IHJjX3RleHQgW2dldF9zZXR0aW5nc19yY2ZpbGVdCi0KLQlzZXQgdG9wICIjCi0jIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB4MTF2bmMgc2V0dGluZ3MgYW5kIGNhbiBiZSB1c2VkIGFzCi0jIGFzIGEgfi8ueDExdm5jcmMgZGVmYXVsdHMgZmlsZS4gIElmIHNhdmVkIHRvIGFub3RoZXIgZmlsZW5hbWUsIHRoZXNlCi0jIHNldHRpbmdzIGNhbiBiZSBwYXNzZWQgdG8geDExdm5jIGF0IHN0YXJ0dXAgdmlhIFwiLXJjIDxmaWxlbmFtZT5cIi4KLSMKLSMgVGhlIHJjIGZpbGUgY29tbWVudCBjaGFyYWN0ZXIgaXMgXCIjXCIuICBVc2UgXCJcXCNcIiBmb3IgdGhlIGxpdGVyYWwgY2hhci4KLSMgWW91IGNhbiBjb250aW51ZSBsaW5lcyB1c2luZyBcIlxcXCIgYXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGEgbGluZS4KLSMKLSMgTGluZXMgYmVnaW5uaW5nIHdpdGggXCIjZFwiIGluZGljYXRlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgYXQgaXRzIGRlZmF1bHQKLSMgc2V0dGluZyBhbmQgeW91IHByb2JhYmx5IHdhbnQgdG8gbGVhdmUgaXQgY29tbWVudGVkIG91dC4KLSMKLSMgTGluZXMgYmVnaW5uaW5nIHdpdGggXCIjP1wiIGluZGljYXRlIHBhcmFtZXRlcnMgeW91IHByb2JhYmx5IGRvIG5vdAotIyB3YW50IHRvIGhhcmR3aXJlIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgKHVuY29tbWVudCBpZiB5b3Ugd2FudCB0aGF0KS4KLSMgCi0jIFNvbWUgcGFyYW1ldGVycyBhcmUgYm9vbGVhbiwgZS5nLiAtZm9yZXZlciwgYW5kIHRha2Ugbm8gdmFsdWU7IHdoaWxlCi0jIHRoZSBvdGhlcnMsIGUuZy4gLXdhaXQgNTAsIHRha2UgYSBzdHJpbmcgb3IgbnVtZXJpY2FsIHZhbHVlLgotIwotIyBGb3IgYm9vbGVhbnMsIHRoZSBsaW5lIHdpbGwgZW5kIHdpdGggY29tbWVudCBcImRlZmF1bHQ6IG9uXCIgb3IKLSMgXCJkZWZhdWx0OiBvZmZcIiBpbmRpY2F0aW5nIHRoZSBkZWZhdWx0IHNldHRpbmcuICAoTm90ZTogb2Z0ZW4KLSMgXCItbm9mb29iYXJcIiBjb3JyZXNwb25kcyB0byBvcHRpb24gXCItZm9vYmFyXCIgYW5kIHRoZSBmb3JtZXIgaXMKLSMgXCJ0aGUgZGVmYXVsdFwiLCBlLmcuIC1ub3JlcGVhdCkuCi0jCi0jIEZvciBzdHJpbmcgb3IgbnVtZXJpY2FsIG9wdGlvbnMsIHRoZSB2YWx1ZSBcIlwiIGluIGEgbGluZSBiZWxvdwotIyBtZWFucyB0aGUgZGVmYXVsdCBpcyB1bnNldCBhbmQgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkgc29tZSBub24tZW1wdHkKLSMgdmFsdWUgdG8gdXNlIHRoZSBwYXJhbWV0ZXIuICBGb3IgcmVmZXJlbmNlLCBpZiB0aGUgZGVmYXVsdCBkaWZmZXJzCi0jIGZyb20geW91ciB2YWx1ZSBpdCBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhcyBhIGNvbW1lbnQuCi0jIAotIyBGZWVsIGZyZWUgdG8gdW5jb21tZW50IG9yIGNvbW1lbnQgYW55IG9mIHRoZSBsaW5lcyBvciB0byBjaGFuZ2UgYW55Ci0jIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMuICBEb24ndCBiZSBzdXJwcmlzZWQgdGhhdCBtb3N0IGlmIG5vdAotIyBhbGwgb2YgdGhlIGxpbmVzIGJlbG93IGFyZSBjb21tZW50ZWQgb3V0ICh4MTF2bmMgaGFzIHNvIG1hbnkgcGFyYW1ldGVycywKLSMgbW9zdCBvZiB0aGVtIHdpbGwgYmUgYXQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIgotCi0Jc2V0IHJjX3RleHQgIiR0b3AkcmNfdGV4dCIKLQotCWdsb2JhbCBlbnYgc2F2ZV9zZXR0aW5nc192YXIgc2F2ZV9zZXR0aW5nc192YXJfb2sKLQlpZiB7W2luZm8gZXhpc3RzIGVudihIT01FKV19IHsKLQkJc2V0IHNhdmVfc2V0dGluZ3NfdmFyICIkZW52KEhPTUUpLy54MTF2bmNyYyIKLQl9IGVsc2UgewotCQlzZXQgc2F2ZV9zZXR0aW5nc192YXIgIi54MTF2bmNyYyIKLQl9Ci0Jc2V0IHNhdmVfc2V0dGluZ3NfdmFyX29rIDAKLQotCXNldCB3IFt0ZXh0d2luICJzYXZlX3NldHRpbmdzIiAiU2F2ZSBTZXR0aW5ncy4uLiIgJHJjX3RleHQgXAotCQkic2F2ZV9zZXR0aW5nc192YXIrU2F2ZSBhczoiXQotCi0JdGt3YWl0IHdpbmRvdyAkdwotCi0JaWYgeyRzYXZlX3NldHRpbmdzX3Zhcl9vayA9PSAxfSB7Ci0JCXNldCBmaWxlICRzYXZlX3NldHRpbmdzX3ZhcgotCQlpZiB7JGZpbGUgPT0gIiJ9IHsKLQkJCXJldHVybgotCQl9Ci0JCXNldCBmaWxlIFt0aWxkZV9leHBhbmQgJGZpbGVdCi0JCWFwcGVuZF90ZXh0ICJcblNhdmluZyBjdXJyZW50IHNldHRpbmdzIHRvICRmaWxlIC4uLlxuIiAKLQkJaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKLQkJCXNldCBiYWNrdXAgIiR7ZmlsZX1+IgotCQkJYXBwZW5kX3RleHQgIkJhY2tpbmcgdXAgJGZpbGUgLT4gJGJhY2t1cCAuLi5cbiIKLQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAtZm9yY2UgJGJhY2t1cH0KLQkJCXNldCBlbXNnICIqKiogQmFja3VwIHRvICRiYWNrdXAgZmFpbGVkLiAqKipcbiIKLQkJCWlmIHshW2ZpbGUgZXhpc3RzICRiYWNrdXBdfSB7Ci0JCQkJY2F0Y2gge2ZpbGUgY29weSAtZm9yY2UgJGZpbGUgJGJhY2t1cH0KLQkJCQlpZiB7IVtmaWxlIGV4aXN0cyAkYmFja3VwXX0gewotCQkJCQlhcHBlbmRfdGV4dCAkZW1zZwotCQkJCQliZWxsCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhcHBlbmRfdGV4dCAkZW1zZwotCQkJCWJlbGwKLQkJCX0KLQkJfQotCQlzZXQgZmggIiIKLQkJY2F0Y2gge3NldCBmaCBbb3BlbiAkZmlsZSAidyJdfQotCQlpZiB7JGZoICE9ICIifSB7Ci0JCQlwdXRzICRmaCAkcmNfdGV4dAotCQkJY2xvc2UgJGZoCi0JCQlpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKLQkJCQlhcHBlbmRfdGV4dCAiKioqIFNhdmluZyB0byAkZmlsZSBmYWlsZWQuICoqKlxuIgotCQkJCWJlbGwKLQkJCX0gZWxzZSB7Ci0JCQkJYXBwZW5kX3RleHQgIkRvbmUuXG4iCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhcHBlbmRfdGV4dCAiKioqIE9wZW4gb2YgJGZpbGUgZmFpbGVkLiAqKipcbiIKLQkJCWJlbGwKLQkJfQotCX0KLX0KLQotcHJvYyBjbGVhcl9hbGwge30gewotCWdsb2JhbCBtZW51X3ZhciB1bnNldF9zdHIKLQotCXNldCBkZWJ1ZyBbaW5fZGVidWdfbW9kZV0KLQkKLQlmb3JlYWNoIGl0ZW0gW2FycmF5IG5hbWVzIG1lbnVfdmFyXSB7Ci0JCWlmIHskaXRlbSA9PSAiZGVidWdfZ3VpIn0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHsKLQkJCWlmIHtbaXNfYWN0aW9uICRpdGVtXX0gewotCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgIiIKLQkJCX0gZWxzZWlmIHtbdmFsdWVfaXNfYm9vbCAkaXRlbV19IHsKLQkJCQlzZXQgbWVudV92YXIoJGl0ZW0pIDAKLQkJCX0gZWxzZWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0gewotCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJHVuc2V0X3N0cgotCQkJfQotCQl9Ci0JfQotCWFwcGVuZF90ZXh0ICJDbGVhcmVkIGFsbCBzZXR0aW5ncy5cbiIKLX0KLQotcHJvYyBkZWZhdWx0c19hbGwge30gewotCWNvcHlfZGVmYXVsdF92YXJzCi0JYXBwZW5kX3RleHQgIlJlc2V0IGFsbCB2YXJpYWJsZXMgdG8gZGVmYXVsdCB2YWx1ZXMuXG4iCi19Ci0KLXByb2MgYWxsX3F1ZXJ5X3ZhcnMge30gewotCWdsb2JhbCBxdWVyeV9hbnNfbGlzdCBxdWVyeV9hcm9fbGlzdCBhbGxfc2V0dGluZ3MKLQlnbG9iYWwgY2FjaGVfYWxsX3F1ZXJ5X3ZhcnMKLQkKLQlpZiB7JGNhY2hlX2FsbF9xdWVyeV92YXJzICE9ICIifSB7Ci0JCXJldHVybiAkY2FjaGVfYWxsX3F1ZXJ5X3ZhcnMKLQl9Ci0KLQlzZXQgcXJ5ICIiCi0JZm9yZWFjaCBpdGVtICRxdWVyeV9hbnNfbGlzdCB7Ci0JCWlmIHskcXJ5ID09ICIifSB7Ci0JCQlzZXQgcXJ5ICRpdGVtCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgcXJ5ICIsJGl0ZW0iCi0JCX0KLQl9Ci0JZm9yZWFjaCBpdGVtICRxdWVyeV9hcm9fbGlzdCB7Ci0JCWlmIHskcXJ5ID09ICIifSB7Ci0JCQlzZXQgcXJ5ICRpdGVtCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQgcXJ5ICIsJGl0ZW0iCi0JCX0KLQl9Ci0Jc2V0IGNhY2hlX2FsbF9xdWVyeV92YXJzICRxcnkKLQotCWdsb2JhbCBlbnYKLQlpZiBbaW5mbyBleGlzdHMgZW52KFRLWDExVk5DX1BSSU5UX0FMTF9WQVJTKV0gewotCQlwdXRzICItLS0tLS0tLS0tLS0tLS0gQkVHSU4gQUxMIFZBUlMgLS0tLS0tLS0tLS0tLS0tIgotCQlwdXRzICRxcnkKLQkJcHV0cyAiLS0tLS0tLS0tLS0tLS0tIEVORCBBTEwgVkFSUyAtLS0tLS0tLS0tLS0tLS0iCi0JfQotCi0JcmV0dXJuICRxcnkKLX0KLQotcHJvYyBxdWVyeV9hbGwge3txdWlldCAwfX0gewotCWdsb2JhbCBxdWVyeV9hbnNfbGlzdCBxdWVyeV9hcm9fbGlzdCBhbGxfc2V0dGluZ3MKLQlnbG9iYWwgbGFzdF9xdWVyeV9hbGxfdGltZQotCi0JZHRpbWUgMQotCXNldCBxcnkgW2FsbF9xdWVyeV92YXJzXQotCi0Jc2V0IHFhcmdzIFtsaXN0ICItUSIgJHFyeV0KLQlzZXQgYWxsIFtydW5fcmVtb3RlX2NtZCAkcWFyZ3NdCi0KLQlpZiB7W3JlZ2V4cCB7YW5zPX0gJGFsbF19IHsKLQkJaWYgeyEgJHF1aWV0fSB7Ci0JCQlhcHBlbmRfdGV4dCAiUmV0cmlldmVkIGFsbCBjdXJyZW50IHNldHRpbmdzLlxuIgotCQl9Ci0JCXNldCBhbGxfc2V0dGluZ3MgJGFsbAotCQl1cGRhdGVfbWVudV92YXJzICRhbGwKLQl9IGVsc2UgewotCQlpZiB7ISAkcXVpZXR9IHsKLQkJCWFwcGVuZF90ZXh0ICJGYWlsZWQgdG8gcmV0cmlldmUgY3VycmVudCBzZXR0aW5ncy5cbiIKLQkJfQotCX0KLQlzZXQgbGFzdF9xdWVyeV9hbGxfdGltZSBbY2xvY2sgc2Vjb25kc10KLQlkdGltZSAyCi0JcmV0dXJuICRhbGwKLX0KLQotcHJvYyBzZXRfaW5mbyB7c3RyfSB7Ci0JZ2xvYmFsIGluZm9fc3RyIGluZm9fbGFiZWwKLSNzZXQgdzEgWyRpbmZvX2xhYmVsIGNnZXQgLXdpZHRoXQotI3NldCB3MiBbd2luZm8gd2lkdGggJGluZm9fbGFiZWxdCi0jcHV0cyAic2V0X2luZm86IHc9JHcxICB3aW5mbz0kdzIiCi0jYXBwZW5kX3RleHQgIiRzdHJcbiIKLQlzZXQgaW5mb19zdHIgIiRzdHIiCi0JdXBkYXRlCi19Ci0KLXByb2MgYXBwZW5kX3RleHQge3N0cn0gewotCWdsb2JhbCB0ZXh0X2FyZWEgdGV4dF9hcmVhX3N0cgotCi0JaWYgeyFbaW5mbyBleGlzdHMgdGV4dF9hcmVhX3N0cl19IHsKLQkJc2V0IHRleHRfYXJlYV9zdHIgIiIKLQl9Ci0JYXBwZW5kIHRleHRfYXJlYV9zdHIgJHN0cgotCi0JaWYgeyFbaW5mbyBleGlzdHMgdGV4dF9hcmVhXX0gewotCQlwdXRzIHN0ZGVyciAkc3RyCi0JCXJldHVybgotCX0KLQlpZiB7JHRleHRfYXJlYSA9PSAiIn0gewotCQlwdXRzIHN0ZGVyciAkc3RyCi0JCXJldHVybgotCX0KLQlpZiB7IVt3aW5mbyBleGlzdHMgJHRleHRfYXJlYV19IHsKLQkJcHV0cyBzdGRlcnIgJHN0cgotCQlyZXR1cm4KLQl9Ci0JCi0JJHRleHRfYXJlYSBpbnNlcnQgZW5kICRzdHIKLQkkdGV4dF9hcmVhIHNlZSBlbmQKLX0KLQotcHJvYyBzaG93X2FsbF9zZXR0aW5ncyB7fSB7Ci0JZ2xvYmFsIGFsbF9zZXR0aW5ncwotCWdsb2JhbCBjbGllbnRfc29jayBjbGllbnRfdGFpbAotCWdsb2JhbCB4MTF2bmNfY2xpZW50X2ZpbGUKLQotCXNldCB0eHQgIlxuUmVhZC1Xcml0ZSBzZXR0aW5nczpcblxuIgotCWZvcmVhY2ggaXRlbSBbc3BsaXRfcXVlcnkgJGFsbF9zZXR0aW5nc10gIHsKLQkJcmVnc3ViIHs6fSAkaXRlbSB7OiB9IGl0ZW0KLQkJYXBwZW5kIHR4dCAiICAkaXRlbVxuIgotCQlpZiB7W3JlZ2V4cCB7bm9yZW1vdGV9ICRpdGVtXX0gewotCQkJYXBwZW5kIHR4dCAiXG5SZWFkLU9ubHkgc2V0dGluZ3M6XG5cbiIKLQkJfQotCX0KLQlhcHBlbmQgdHh0ICJcbkludGVybmFsIHNldHRpbmdzOlxuXG4iCi0JYXBwZW5kIHR4dCAieDExdm5jX2NsaWVudF9maWxlOiAkeDExdm5jX2NsaWVudF9maWxlXG4iCi0JaWYge1tpbmZvIGV4aXN0cyBjbGllbnRfdGFpbF19IHsKLQkJYXBwZW5kIHR4dCAiY2xpZW50X3RhaWw6ICRjbGllbnRfdGFpbFxuIgotCX0gZWxzZSB7Ci0JCWFwcGVuZCB0eHQgImNsaWVudF90YWlsOiB1bnNldFxuIgotCX0KLQlpZiB7W2luZm8gZXhpc3RzIGNsaWVudF9zb2NrXX0gewotCQlhcHBlbmQgdHh0ICJjbGllbnRfc29jazogJGNsaWVudF9zb2NrXG4iCi0JfSBlbHNlIHsKLQkJYXBwZW5kIHR4dCAiY2xpZW50X3NvY2s6IHVuc2V0XG4iCi0JfQotCXNldCBlc3RyICIiCi0JY2F0Y2gge3NldCBlc3RyIFtleGVjIGVudiB8IGdyZXAgLWkgWDExVk5DXX0KLQlhcHBlbmQgdHh0ICIkZXN0clxuIgotCXRleHR3aW4gIlNldHRpbmdzIiAiQWxsIEN1cnJlbnQgU2V0dGluZ3MiICR0eHQKLX0KLQotcHJvYyBzaG93X2xvZ2ZpbGUge30gewotCWdsb2JhbCBtZW51X3ZhciB1bnNldF9zdHIKLQotCXNldCBsb2dmaWxlIFt0aWxkZV9leHBhbmQgJG1lbnVfdmFyKGxvZ2ZpbGUpXQotCQotCWlmIHskbG9nZmlsZSA9PSAiIiB8fCAkbG9nZmlsZSA9PSAkdW5zZXRfc3RyfSB7Ci0JCXNldCB0eHQgIlxuTm8gbG9nZmlsZSB3YXMgc3BlY2lmaWVkIGF0IHgxMXZuYyBzdGFydHVwLlxuXG4iCQotCX0gZWxzZWlmIHshW2ZpbGUgZXhpc3RzICRsb2dmaWxlXX0gewotCQlzZXQgdHh0ICJcbkxvZ2ZpbGUgXCIkbG9nZmlsZVwiIGRvZXMgbm90IGV4aXN0LlxuXG4iCi0JfSBlbHNlIHsKLQkJc2V0IGZoICItMyIKLQkJc2V0IGVyciAiIgotCQljYXRjaCB7c2V0IGZoIFtvcGVuICRsb2dmaWxlICJyIl19IGVycgotCQlpZiB7JGZoID09ICItMyJ9IHsKLQkJCXNldCB0eHQgIlxuRXJyb3Igb3BlbmluZyBcIiRsb2dmaWxlXCIgJGVyci5cblxuIgotCQl9IGVsc2UgewotCQkJc2V0IHR4dCAiXG5Mb2dmaWxlIFwiJGxvZ2ZpbGVcIiBjdXJyZW50IGNvbnRlbnRzOlxuIgotCQkJd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7Ci0JCQkJYXBwZW5kIHR4dCAiJGxpbmVcbiIKLQkJCX0KLQkJCWNsb3NlICRmaAotCQl9Ci0JfQotCXRleHR3aW4gIkxvZ2ZpbGUiICJMb2dmaWxlIiAkdHh0Ci19Ci0KLXByb2MgdGFpbF9sb2dmaWxlIHt9IHsKLQlnbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyIGZmb250Ci0Jc2V0IGxvZ2ZpbGUgJG1lbnVfdmFyKGxvZ2ZpbGUpCi0JCi0Jc2V0IHR4dCAiIgotCWlmIHskbG9nZmlsZSA9PSAiIiB8fCAkbG9nZmlsZSA9PSAkdW5zZXRfc3RyfSB7Ci0JCXNldCB0eHQgIlxuTm8gbG9nZmlsZSB3YXMgc3BlY2lmaWVkIGF0IHgxMXZuYyBzdGFydHVwLlxuXG4iCQotCX0gZWxzZWlmIHshW2ZpbGUgZXhpc3RzICRsb2dmaWxlXX0gewotCQlzZXQgdHh0ICJcbkxvZ2ZpbGUgXCIkbG9nZmlsZVwiIGRvZXMgbm90IGV4aXN0LlxuXG4iCi0JfSBlbHNlIHsKLQkJc2V0IGNtZCAiIgotCQlzZXQgeHRlcm1fY21kICJ4dGVybSAtc2IgLWZuICRmZm9udCAtZ2VvbWV0cnkgODB4NDUgLXRpdGxlIHgxMXZuYy1sb2dmaWxlIC1lIgotCQlzZXQgY21kIFtzcGxpdCAkeHRlcm1fY21kXQotCQlsYXBwZW5kIGNtZCAidGFpbCIKLQkJbGFwcGVuZCBjbWQgIi0zMDAwZiIKLQkJbGFwcGVuZCBjbWQgJGxvZ2ZpbGUKLQkJbGFwcGVuZCBjbWQgIiYiCi0JCWNhdGNoIHtbZXZhbCBleGVjICRjbWRdfQotCX0KLQlpZiB7JHR4dCAhPSAiIn0gewotCQl0ZXh0d2luICJMb2dmaWxlIiAiTG9nZmlsZSIgJHR4dAotCX0KLX0KLQotcHJvYyBzZXRfY29ubmVjdGVkIHt5ZXNub30gewotCWdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jCi0Jc2V0IG9yaWcgJGNvbm5lY3RlZF90b194MTF2bmMKLQkKLQlpZiB7JHllc25vID09ICJ5ZXMifSB7Ci0JCXNldCBjb25uZWN0ZWRfdG9feDExdm5jIDEKLQl9IGVsc2UgewotCQlzZXQgY29ubmVjdGVkX3RvX3gxMXZuYyAwCi0JCW5vX3gxMV9kaXNwbGF5Ci0JCW5vX3ZuY19kaXNwbGF5Ci0JfQotCWlmIHskb3JpZyAhPSAkY29ubmVjdGVkX3RvX3gxMXZuY30gewotCQlzZXRfd2lkZ2V0cwotCX0KLX0KLQotcHJvYyBkZXRhY2hfZnJvbV9kaXNwbGF5IHt9IHsKLQlnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYyByZXBseV94ZGlzcGxheSB4MTF2bmNfeGRpc3BsYXkKLQlzZXQgc3RyICJEZXRhY2hpbmcgZnJvbSBYIGRpc3BsYXkuIgotCWlmIHskcmVwbHlfeGRpc3BsYXkgIT0gIiJ9IHsKLQkJc2V0IHN0ciAiRGV0YWNoaW5nIGZyb20gJHJlcGx5X3hkaXNwbGF5LiIKLQl9IGVsc2VpZiB7JHgxMXZuY194ZGlzcGxheSAhPSAiIn0gewotCQlzZXQgc3RyICJEZXRhY2hpbmcgZnJvbSAkeDExdm5jX3hkaXNwbGF5LiIKLQl9Ci0JaWYgeyRjb25uZWN0ZWRfdG9feDExdm5jfSB7Ci0JCWFwcGVuZF90ZXh0ICIkc3RyXG4iCi0JfQotCXNldF9jb25uZWN0ZWQgbm8KLX0KLQotcHJvYyBkb19zdG9wX3F1aXQge30gewotCXB1c2hfbmV3X3ZhbHVlICJzdG9wIiAic3RvcCIgMSAwCi0Jc2V0X2Nvbm5lY3RlZCBubwotCXVwZGF0ZQotCWFmdGVyIDI1MAotCWRlc3Ryb3kgLgotfQotCi0jIE1lbnUgaXRlbSBpcyBhbiBhY3Rpb246Ci1wcm9jIGRvX2FjdGlvbiB7aXRlbX0gewotCWdsb2JhbCBtZW51X3ZhciBjb25uZWN0ZWRfdG9feDExdm5jIGJlZ2lubmVyX21vZGUKLQotCWlmIHtbaW5fZGVidWdfbW9kZV19IHsKLQkJYXBwZW5kX3RleHQgImFjdGlvbjogXCIkaXRlbVwiXG4iCi0JfQotI3B1dHMgImFjdGlvbjogXCIkaXRlbVwiXG4iCi0KLQlpZiB7JGl0ZW0gPT0gInBpbmcifSB7Ci0JCWlmIHskYmVnaW5uZXJfbW9kZX0gewotCQkJdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbAotCQl9IGVsc2UgewotCQkJdHJ5X2Nvbm5lY3QKLQkJfQotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gInN0YXJ0In0gewotCQlzdGFydF94MTF2bmMKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpdGVtID09ICJkZXRhY2gifSB7Ci0JCWRldGFjaF9mcm9tX2Rpc3BsYXkKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpdGVtID09ICJhdHRhY2gifSB7Ci0JCXRyeV9jb25uZWN0X2FuZF9xdWVyeV9hbGwKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpdGVtID09ICJ1cGRhdGUtYWxsIn0gewotCQlxdWVyeV9hbGwKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpdGVtID09ICJjbGVhci1hbGwifSB7Ci0JCWNsZWFyX2FsbAotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gImRlZmF1bHRzLWFsbCJ9IHsKLQkJZGVmYXVsdHNfYWxsCi0JCXJldHVybgotCX0gZWxzZWlmIHskaXRlbSA9PSAic2F2ZS1zZXR0aW5ncyJ9IHsKLQkJc2F2ZV9zZXR0aW5ncwotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gInNob3ctc3RhcnQtY21kIn0gewotCQlzaG93X3N0YXJ0X2NtZAotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gImFsbC1zZXR0aW5ncyJ9IHsKLQkJc2hvd19hbGxfc2V0dGluZ3MKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpdGVtID09ICJzaG93LWxvZ2ZpbGUifSB7Ci0JCXNob3dfbG9nZmlsZQotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gInRhaWwtbG9nZmlsZSJ9IHsKLQkJdGFpbF9sb2dmaWxlCi0JCXJldHVybgotCX0gZWxzZWlmIHskaXRlbSA9PSAiTWlzYy1UdW5pbmc6In0gewotCQltZW51X2hlbHAgIiRpdGVtIgotCQlyZXR1cm4KLQl9IGVsc2VpZiB7JGl0ZW0gPT0gIldpbmRvd1ZpZXcifSB7Ci0JCWNoYW5nZV92aWV3X3N0YXRlCi0JCXJldHVybgotCX0gZWxzZWlmIHskaXRlbSA9PSAicXVpdCIgfHwgJGl0ZW0gPT0gIlF1aXQifSB7Ci0JCWRlc3Ryb3kgLgotCQlleGl0IDAKLQl9IGVsc2VpZiB7JGl0ZW0gPT0gInN0b3ArcXVpdCJ9IHsKLQkJZG9fc3RvcF9xdWl0Ci0JfQotCi0JaWYge1t2YWx1ZV9pc19zdHJpbmcgJGl0ZW1dfSB7Ci0JCWlmIHshIFtlbnRyeV9kaWFsb2cgJGl0ZW1dfSB7Ci0JCQlyZXR1cm4KLQkJfQotCQlzZXQgbmV3ICRtZW51X3ZhcigkaXRlbSkKLQkJc2V0IG5hbWUgJGl0ZW0KLQl9IGVsc2UgewotCQlzZXQgbmV3IDEKLQkJc2V0IG5hbWUgJGl0ZW0KLQl9Ci0KLQlpZiB7JGl0ZW0gPT0gImxvYWQtc2V0dGluZ3MifSB7Ci0JCWxvYWRfc2V0dGluZ3MKLQkJcmV0dXJuCi0JfQotCi0JaWYgeyEgJGNvbm5lY3RlZF90b194MTF2bmN9IHsKLQkJOwotCX0gZWxzZWlmIHtbcmVnZXhwIHteKHN0b3B8cXVpdHxleGl0fHNodXRkb3duKSR9ICRpdGVtXX0gewotCQkjIGp1c3QgZG8gLVIKLQkJYXBwZW5kX3RleHQgInN0b3BwaW5nIHJlbW90ZSB4MTF2bmMgc2VydmVyLi4uXG4iCi0JCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMAotCQlzZXRfY29ubmVjdGVkIG5vCi0JCQotCX0gZWxzZWlmIHtbb3B0X21hdGNoIFEgJGl0ZW1dfSB7Ci0JCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMQotCX0gZWxzZSB7Ci0JCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMAotCX0KLX0KLQotcHJvYyBwdGltZSB7dGltZX0gewotCXNldCB1c2VjIFtsaW5kZXggW3NwbGl0ICR0aW1lXSAwXQotCXNldCBzZWMgW2Zvcm1hdCAiJS4zZiIgW2V4cHIgIiR1c2VjIC8gMTAwMDAwMC4wIl1dCi0JcHV0cyAidGltZTogJHNlYyBzZWNzLiIKLX0KLQotcHJvYyBkb192YXIge2l0ZW19IHsKLQlnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYyBpdGVtX2Nhc2NhZGUgbWVudV92YXIKLQotCXNldCBkZWJ1ZyBbaW5fZGVidWdfbW9kZV0KLQotCXNldCBzdHJpbmcgMAotCWlmIHtbaXNfYWN0aW9uICRpdGVtXSB8fCAkaXRlbSA9PSAiV2luZG93VmlldyJ9IHsKLQkJIyBNZW51IGl0ZW0gaXMgYWN0aW9uOgotCQlpZiB7JGRlYnVnfSB7Ci0JCQlwdGltZSBbdGltZSB7ZG9fYWN0aW9uICRpdGVtfV0KLQkJfSBlbHNlIHsKLQkJCWRvX2FjdGlvbiAkaXRlbQotCQl9Ci0JCXJldHVybgotCX0KLQotCWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0gewotCQkjIE1lbnUgaXRlbSBpcyBhIHN0cmluZzoKLQkJaWYgeyRpdGVtX2Nhc2NhZGUoJGl0ZW0pICE9ICIifSB7Ci0JCQkjIENhc2NhZGUgc2V0cyB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5Ci0JCX0gZWxzZSB7Ci0JCQkjIE90aGVyd2lzZSBFbnRyeSBib3gKLQkJCWlmIHshW2VudHJ5X2RpYWxvZyAkaXRlbV19IHsKLQkJCQlyZXR1cm4KLQkJCX0KLQkJfQotCQlzZXQgbmV3ICRtZW51X3ZhcigkaXRlbSkKLQkJc2V0IG5hbWUgJGl0ZW0KLQl9IGVsc2UgewotCQkjIE1lbnUgaXRlbSBpcyBhIGJvb2xlYW46Ci0JCXNldCBuYW1lIFtjaGVja192YXIgJGl0ZW1dCi0JCWlmIHskbmFtZSA9PSAiIn0gewotCQkJcmV0dXJuCi0JCX0KLQkJc2V0IG5ldyAxCi0JfQotCWlmIHskY29ubmVjdGVkX3RvX3gxMXZuY30gewotCQlpZiB7JGRlYnVnfSB7Ci0JCQlwdGltZSBbdGltZSB7cHVzaF9uZXdfdmFsdWUgJGl0ZW0gJG5hbWUgJG5ldyAxfV0KLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMQotCQl9Ci0KLQkJaWYgeyRpdGVtID09ICJodHRwIn0gewotCQkJZ2xvYmFsIHZuY191cmwKLQkJCWFwcGVuZF90ZXh0ICIgIFVSTDogJHZuY191cmxcbiIKLQkJfQotCX0KLX0KLQotcHJvYyBtZW51X2hlbHAge2l0ZW19IHsKLQlpZiAhW2hlbHBfd2luICRpdGVtXSB7Ci0JCXRleHR3aW4gIm5vaGVscCIgIk5vIGhlbHAgYXZhaWxhYmxlIiBcCi0JCQkiU29ycnksIG5vIGhlbHAgYXZhaWFibGUgZm9yIFwiJGl0ZW1cIiIKLQl9Ci19Ci0KLXByb2Mgb3B0X21hdGNoIHtjIGl0ZW19IHsKLQlnbG9iYWwgaXRlbV9vcHRzCi0JaWYge1tpbmZvIGV4aXN0cyBpdGVtX29wdHMoJGl0ZW0pXX0gewotCQlpZiB7W3JlZ2V4cCAiXlxbQS16XF0qJGMiICRpdGVtX29wdHMoJGl0ZW0pXX0gewotCQkJcmV0dXJuIDEKLQkJfQotCX0KLQlyZXR1cm4gMAotfQotCi1wcm9jIGlzX2FjdGlvbiB7aXRlbX0gewotCXJldHVybiBbb3B0X21hdGNoIEEgJGl0ZW1dCi19Ci0KLXByb2MgaXNfZ3VpX2ludGVybmFsIHtpdGVtfSB7Ci0JaWYgeyRpdGVtID09ICJQcm9wZXJ0aWVzIn0gewotCQlyZXR1cm4gMQotCX0KLQlpZiB7JGl0ZW0gPT0gIlRyYXkifSB7Ci0JCXJldHVybiAxCi0JfQotCXJldHVybiBbb3B0X21hdGNoIEcgJGl0ZW1dCi19Ci0KLXByb2MgaXNfYnJvd3NlIHtpdGVtfSB7Ci0JcmV0dXJuIFtvcHRfbWF0Y2ggRiAkaXRlbV0KLX0KLQotcHJvYyB2YWx1ZV9pc19zdHJpbmcge2l0ZW19IHsKLQlnbG9iYWwgaXRlbV9ib29sCi0JaWYgeyFbaW5mbyBleGlzdHMgaXRlbV9ib29sKCRpdGVtKV19IHsKLQkJcmV0dXJuIDAKLQl9Ci0JaWYgeyEgJGl0ZW1fYm9vbCgkaXRlbSl9IHsKLQkJcmV0dXJuIDEKLQl9IGVsc2UgewotCQlyZXR1cm4gMAotCX0KLX0KLQotcHJvYyB2YWx1ZV9pc19ib29sIHtpdGVtfSB7Ci0JZ2xvYmFsIGl0ZW1fYm9vbAotCWlmIHshW2luZm8gZXhpc3RzIGl0ZW1fYm9vbCgkaXRlbSldfSB7Ci0JCXJldHVybiAwCi0JfQotCWlmIHskaXRlbV9ib29sKCRpdGVtKX0gewotCQlyZXR1cm4gMQotCX0gZWxzZSB7Ci0JCXJldHVybiAwCi0JfQotfQotCi1wcm9jIHNwbGl0X3F1ZXJ5MCB7cXVlcnl9IHsKLQkjIG9yaWdpbmFsIHNsb3dlciB3YXkgd2l0aCByZWdleHAvcmVnc3ViCi0JcmVnc3ViIC1hbGwge2Fybz19ICRxdWVyeSB7YW5zPX0gcXVlcnkKLQlzZXQgaXRlbXMge30KLQl3aGlsZSB7MX0gewotCQlpZiB7ISBbcmVnZXhwIHteYW5zPSguKikkfSAkcXVlcnkgbTAgbTFdfSB7Ci0JCQlicmVhawotCQl9Ci0JCXNldCBpdGVtICRtMQotCQlzZXQgbTIgIiIKLQkJcmVnZXhwIHssYW5zPS4qJH0gJGl0ZW0gbTIKLQkJcmVnc3ViIHssYW5zPS4qJH0gJGl0ZW0gIiIgaXRlbQotCQlpZiB7JGl0ZW0gIT0gIiJ9IHsKLQkJCWxhcHBlbmQgaXRlbXMgJGl0ZW0KLQkJfQotCQlzZXQgcXVlcnkgJG0yCi0JCXJlZ3N1YiB7Xix9ICRxdWVyeSAiIiBxdWVyeQotCX0KLQlyZXR1cm4gJGl0ZW1zCi19Ci0KLXByb2Mgc3BsaXRfcXVlcnkge3F1ZXJ5fSB7Ci0JcmVnc3ViIC1hbGwge2Fybz19ICRxdWVyeSB7YW5zPX0gcXVlcnkKLQlzZXQgaXRlbXMge30KLQl3aGlsZSB7MX0gewotCQlzZXQgbiBbc3RyaW5nIGZpcnN0ICJhbnM9IiAkcXVlcnldCi0JCWlmIHskbiA8IDB9IHsKLQkJCWJyZWFrCi0JCX0KLQkJc2V0IGZyb20gW2V4cHIgJG4rNF0KLQotCQlzZXQgbSBbc3RyaW5nIGZpcnN0ICIsYW5zPSIgJHF1ZXJ5XQotCQlpZiB7JG0gPCAwfSB7Ci0JCQlzZXQgbW9yZSAwCi0JCQlzZXQgaXRlbSBbc3RyaW5nIHJhbmdlICRxdWVyeSAkZnJvbSBlbmRdCi0JCX0gZWxzZSB7Ci0JCQlzZXQgbW9yZSAxCi0JCQlzZXQgdG8gICBbZXhwciAkbS0xXQotCQkJc2V0IGl0ZW0gW3N0cmluZyByYW5nZSAkcXVlcnkgJGZyb20gJHRvXQotCQl9Ci0JCWlmIHskaXRlbSAhPSAiIn0gewotCQkJbGFwcGVuZCBpdGVtcyAkaXRlbQotCQl9Ci0JCWlmIHskbW9yZX0gewotCQkJaW5jciBtCi0JCQlzZXQgcXVlcnkgW3N0cmluZyByYW5nZSAkcXVlcnkgJG0gZW5kXQotCQl9IGVsc2UgewotCQkJc2V0IHF1ZXJ5ICIiCi0JCX0KLQl9Ci0JcmV0dXJuICRpdGVtcwotfQotCi1wcm9jIHNldF94MTFfZGlzcGxheSB7bmFtZX0gewotCWdsb2JhbCB4MTFfZGlzcGxheQotCXNldCB4MTFfZGlzcGxheSAieDExdm5jIFggZGlzcGxheTogJG5hbWUiCi0Jc2V0X25hbWUgInRreDExdm5jIC0gJG5hbWUiCi19Ci1wcm9jIHNldF92bmNfZGlzcGxheSB7bmFtZX0gewotCWdsb2JhbCB2bmNfZGlzcGxheSBpY29uX21vZGUKLQlzZXQgdm5jX2Rpc3BsYXkgIlZOQyBkaXNwbGF5OiAkbmFtZSIKLQotCWlmIHskaWNvbl9tb2RlfSB7Ci0JCXNldF9pY29uX2xhYmVsCi0JfQotfQotcHJvYyBzZXRfdm5jX3VybCB7bmFtZX0gewotCWdsb2JhbCB2bmNfdXJsCi0Jc2V0IHZuY191cmwgJG5hbWUKLX0KLXByb2Mgbm9feDExX2Rpc3BsYXkge30gewotCXNldF94MTFfZGlzcGxheSAiKCpub25lKikiCi0Jc2V0X25hbWUgInRreDExdm5jIgotfQotcHJvYyBub192bmNfZGlzcGxheSB7fSB7Ci0Jc2V0X3ZuY19kaXNwbGF5ICIoKm5vbmUqKSIKLX0KLXByb2Mgbm9fdm5jX3VybCB7fSB7Ci0Jc2V0X3ZuY191cmwgIigqbm9uZSopIgotfQotCi1wcm9jIGdldF92bmNfZGlzcGxheV9udW1iZXIge30gewotCWdsb2JhbCB2bmNfZGlzcGxheQotCWlmICFbaW5mbyBleGlzdHMgdm5jX2Rpc3BsYXldIHsKLQkJcmV0dXJuICJub25lIgotCX0KLQlpZiB7JHZuY19kaXNwbGF5ID09ICIifSB7Ci0JCXJldHVybiAibm9uZSIKLQl9Ci0Jc2V0IHN0ciAkdm5jX2Rpc3BsYXkKLQlyZWdzdWIge1ZOQyBkaXNwbGF5OiAqfSAkc3RyICIiIHN0cgotCWlmIFtyZWdleHAgezooWzAtOV1bMC05XSopfSAkc3RyIG0wIG5dIHsKLQkJcmV0dXJuICRuCi0JfQotCXJldHVybiAibm9uZSIKLX0KLQotcHJvYyBmZXRjaF9kaXNwbGF5cyB7fSB7Ci0KLQlzZXQgcWFyZ3MgW2xpc3QgIi1RIiAiZGlzcGxheSx2bmNkaXNwbGF5Il0KLQlzZXQgcmVzdWx0IFtydW5fcmVtb3RlX2NtZCAkcWFyZ3NdCi0KLQlzZXQgZ290X3gxMSAwCi0Jc2V0IGdvdF92bmMgMAotCXNldCBnb3RfdXJsIDAKLQotCWZvcmVhY2ggaXRlbSBbc3BsaXRfcXVlcnkgJHJlc3VsdF0gewotCQlpZiB7W3JlZ2V4cCB7XmRpc3BsYXk6KC4qKSR9ICRpdGVtIG0wIG0xXX0gewotCQkJc2V0X3gxMV9kaXNwbGF5ICRtMQotCQkJc2V0IGdvdF94MTEgMQotCQl9IGVsc2VpZiB7W3JlZ2V4cCB7XnZuY2Rpc3BsYXk6KC4qKSR9ICRpdGVtIG0wIG0xXX0gewotCQkJc2V0X3ZuY19kaXNwbGF5ICRtMQotCQkJc2V0IGdvdF92bmMgMQotCQl9IGVsc2VpZiB7W3JlZ2V4cCB7Xmh0dHBfdXJsOiguKikkfSAkaXRlbSBtMCBtMV19IHsKLQkJCXNldF92bmNfdXJsICRtMQotCQkJc2V0IGdvdF91cmwgMQotCQl9Ci0JfQotCWlmIHshICRnb3RfeDExfSB7Ci0JCW5vX3gxMV9kaXNwbGF5Ci0JfQotCWlmIHshICRnb3Rfdm5jfSB7Ci0JCW5vX3ZuY19kaXNwbGF5Ci0JfQotCWlmIHshICRnb3RfdXJsfSB7Ci0JCW5vX3ZuY191cmwKLQl9Ci19Ci0KLXByb2MgY2xpZW50X2RpYWxvZyB7Y2xpZW50fSB7Ci0Jc2V0IGNpZCAiIgotCXNldCBob3N0ICIiCi0Jc2V0IGlwICIiCi0JZ2xvYmFsIG1lbnVfdmFyIHRleHRfYXJlYSBjbGVhbnVwX3dpbmRvdyBpdGVtX2Jvb2wKLQotCSM8aWQ+OjxpcD46PHBvcnQ+Ojx1c2VyPjo8dW5peD46PGhvc3RuYW1lPjo8aW5wdXQ+Ojxsb2dpbnZpZXc+Ojx0aW1lPgotCWFwcGVuZF90ZXh0ICJcbkNsaWVudCBpbmZvIHN0cmluZzpcbiAtICRjbGllbnRcblxuIgotCWlmIHtbcmVnZXhwIHteKC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKikkfSBcCi0JICAgICRjbGllbnQgbTAgbTEgbTIgbTMgbTQgbTUgbTYgbTcgbTggbTldfSB7Ci0JCXNldCBjaWQgICRtMQotCQlzZXQgaXAgICAkbTIKLQkJc2V0IHBvcnQgJG0zCi0JCXNldCB1c2VyICRtNAotCQlzZXQgdW5peCAkbTUKLQkJc2V0IGhvc3QgJG02Ci0JCXJlZ3N1YiB7XC4uKiR9ICRob3N0ICIiIGhvc3QKLQkJc2V0IGlucHV0ICRtNwotCQlzZXQgbG9ndm8gJG04Ci0JCXNldCBsdGltZSAkbTkKLQkJYXBwZW5kX3RleHQgIkhvc3Q6ICRob3N0LCBQb3J0OiAkcG9ydCwgVXNlcjogJHVzZXIiCi0JCWlmIHskdW5peCAhPSAiIiAmJiAkdW5peCAhPSAibm9uZSJ9IHsKLQkJCWFwcGVuZF90ZXh0ICIsIFVuaXg6ICR1bml4IgotCQl9Ci0JCWFwcGVuZF90ZXh0ICIsIElQOiAkaXAsIElkOiAkY2lkXG4iCi0JCWFwcGVuZF90ZXh0ICIgLSBvcmlnaW5hbGx5IGxvZ2dlZCBpbiBhczogIgotCQlpZiB7JGxvZ3ZvID09ICIxIiB9IHsKLQkJCWFwcGVuZF90ZXh0ICJWaWV3LU9ubHkgQ2xpZW50IgotCQl9IGVsc2UgewotCQkJYXBwZW5kX3RleHQgIk5vcm1hbCBDbGllbnQiCi0JCX0KLQkJaWYgeyRsdGltZSAhPSAiIn0gewotCQkJc2V0IHRpbSBbY2xvY2sgZm9ybWF0ICRsdGltZV0KLQkJCWFwcGVuZF90ZXh0ICIsICAkdGltIgotCQl9Ci0JCWFwcGVuZF90ZXh0ICJcbiIKLQkJYXBwZW5kX3RleHQgIiAtIGN1cnJlbnRseSBhbGxvd2VkIGlucHV0OiAiCi0JCXNldCBzayAwCi0JCXNldCBzbSAwCi0JCXNldCBzYiAwCi0JCXNldCBzYyAwCi0JCXNldCBzZiAwCi0JCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0t9ICRpbnB1dF19IHsKLQkJCWFwcGVuZF90ZXh0ICJLZXlzdHJva2VzIgotCQkJc2V0IHNrIDEKLQkJfQotCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtNfSAkaW5wdXRdfSB7Ci0JCQlpZiB7JHNrfSB7Ci0JCQkJYXBwZW5kX3RleHQgIiwgIgotCQkJfQotCQkJYXBwZW5kX3RleHQgIk1vdXNlLU1vdGlvbiIKLQkJCXNldCBzbSAxCi0JCX0KLQkJaWYge1tyZWdleHAgLW5vY2FzZSB7Qn0gJGlucHV0XX0gewotCQkJaWYgeyRzayB8fCAkc219IHsKLQkJCQlhcHBlbmRfdGV4dCAiLCAiCi0JCQl9Ci0JCQlhcHBlbmRfdGV4dCAiQnV0dG9uLUNsaWNrIgotCQkJc2V0IHNiIDEKLQkJfQotCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtDfSAkaW5wdXRdfSB7Ci0JCQlpZiB7JHNrIHx8ICRzbSB8fCAkc2J9IHsKLQkJCQlhcHBlbmRfdGV4dCAiLCAiCi0JCQl9Ci0JCQlhcHBlbmRfdGV4dCAiQ2xpcGJvYXJkIgotCQkJc2V0IHNtIDEKLQkJfQotCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtGfSAkaW5wdXRdfSB7Ci0JCQlpZiB7JHNrIHx8ICRzbSB8fCAkc2IgfHwgJHNmfSB7Ci0JCQkJYXBwZW5kX3RleHQgIiwgIgotCQkJfQotCQkJYXBwZW5kX3RleHQgIkZpbGVzIgotCQkJc2V0IHNmIDEKLQkJfQotCQlpZiB7ISAkc2sgJiYgISAkc20gJiYgISAkc2IgJiYgISAkc20gJiYgISAkc2Z9IHsKLQkJCWFwcGVuZF90ZXh0ICJOb25lIgotCQl9Ci0JCWFwcGVuZF90ZXh0ICJcbiIKLQl9Ci0JaWYgeyRjaWQgPT0gIiJ9IHsKLQkJYXBwZW5kX3RleHQgIkludmFsaWQgY2xpZW50IGluZm8gc3RyaW5nOiAkY2xpZW50XG4iCi0JCXJldHVybgotCX0KLQotCXJlZ3N1YiAtYWxsIHtffSAkaW5wdXQgIiIgaW5wdXQKLQlzZXQgbWVudV92YXIoY2xpZW50KSAiJGlucHV0IgotCXNldCBpdGVtX2Jvb2woY2xpZW50KSAwCi0KLQlpbnNlcnRfY2xpZW50X2FjdGlvbl93aW5kb3cgJGlucHV0Ci0Jc2V0IHJjIFtlbnRyeV9kaWFsb2cgY2xpZW50IDFdCi0KLQljbGVhbnVwX3RleHRfd2luZG93Ci0KLQlzZXQgdmFsICRtZW51X3ZhcihjbGllbnQpCi0JI3B1dHMgInJjOiAkcmMgIHZhbDogJHZhbCIKLQotCWlmIHshICRyY30gewotCQlyZXR1cm47Ci0JfSBlbHNlaWYge1tyZWdleHAgLW5vY2FzZSB7KGRpc2Nvbm5lY3R8Y2xvc2UpfSAkdmFsXX0gewotCQlkaXNjb25uZWN0X2RpYWxvZyAkY2xpZW50Ci0JfSBlbHNlIHsKLQkJcmVnc3ViIC1hbGwgLW5vY2FzZSB7W15LTUJDRl19ICR2YWwgIiIgdmFsCi0JCXNldCBpdGVtX2Jvb2woY2xpZW50X2lucHV0KSAwCi0JCXB1c2hfbmV3X3ZhbHVlICJjbGllbnRfaW5wdXQiICJjbGllbnRfaW5wdXQiICIkY2lkOiR2YWwiIDAKLQl9Ci19Ci0KLXByb2MgZGlzY29ubmVjdF9kaWFsb2cge2NsaWVudH0gewotCXNldCBjaWQgIiIKLQlzZXQgaG9zdCAiIgotCXNldCBtc2cgIlxuIgotCWFwcGVuZCBtc2cgIioqKiBDbGllbnQgaW5mbyBzdHJpbmc6XG4gICAgJGNsaWVudFxuIgotCWlmIHtbcmVnZXhwIHteKC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKikkfSBcCi0JICAgICRjbGllbnQgbTAgbTEgbTIgbTMgbTQgbTUgbTYgbTcgbTggbTldfSB7Ci0JCXNldCBjaWQgICRtMQotCQlzZXQgaXAgICAkbTIKLQkJc2V0IHBvcnQgJG0zCi0JCXNldCB1c2VyICRtNAotCQlzZXQgdW5peCAkbTUKLQkJc2V0IGhvc3QgJG02Ci0JCXJlZ3N1YiB7XC4uKiR9ICRob3N0ICIiIGhvc3QKLQkJc2V0IGlucHV0ICRtNwotCQlzZXQgbG9ndm8gJG04Ci0JCXNldCBsdGltZSAkbTkKLQkJYXBwZW5kX3RleHQgIkhvc3Q6ICRob3N0LCBQb3J0OiAkcG9ydCwgSVA6ICRpcCwgVXNlcjogJHVzZXIiCi0JCWlmIHskdW5peCAhPSAiIiAmJiAkdW5peCAhPSAibm9uZSJ9IHsKLQkJCWFwcGVuZF90ZXh0ICIsIFVuaXg6ICR1bml4IgotCQl9Ci0JCWFwcGVuZF90ZXh0ICIsIElkOiAkY2lkXG4iCi0JfQotCWlmIHskY2lkID09ICIifSB7Ci0JCWFwcGVuZF90ZXh0ICJJbnZhbGlkIGNsaWVudCBpbmZvIHN0cmluZzogJGNsaWVudFxuIgotCQlyZXR1cm4KLQl9Ci0JYXBwZW5kIG1zZyAiKioqIFRvICpESVNDT05ORUNUKiB0aGlzIGNsaWVudCBwcmVzcyBcIk9LXCIgYWdhaW4sIG90aGVyd2lzZSBwcmVzcyBcIkNhbmNlbFwiXG4iCi0JYmVsbAotCWlmIHtbd2FybmluZ19kaWFsb2cgJG1zZyAiY3VycmVudCJdfSB7Ci0JCXB1c2hfbmV3X3ZhbHVlICJkaXNjb25uZWN0IiAiZGlzY29ubmVjdCIgJGNpZCAxCi0JfSBlbHNlIHsKLQkJYXBwZW5kX3RleHQgImRpc2Nvbm5lY3QgY2FuY2VsbGVkLlxuIgotCX0KLX0KLQotcHJvYyB1cGRhdGVfY2xpZW50c19hbmRfcmVwb3N0IHt9IHsKLQlnbG9iYWwgaXRlbV9jYXNjYWRlIG1lbnVfbSBtZW51X2IKLQotCWFwcGVuZF90ZXh0ICJSZWZyZXNoaW5nIGNvbm5lY3RlZCBjbGllbnRzIGxpc3QuLi4gIgotCXF1ZXJ5X2FsbCAxCi0JdXBkYXRlCi0KLQlzZXQgc2F3IDAKLQlzZXQgY2FzYyAkaXRlbV9jYXNjYWRlKGN1cnJlbnQpCi0Jc2V0IGxhc3QgWyRjYXNjIGluZGV4IGVuZF0KLQlmb3Ige3NldCBpIDB9IHskaSA8PSAkbGFzdH0ge2luY3IgaX0gewotCQlpZiB7WyRjYXNjIHR5cGUgJGldID09ICJzZXBhcmF0b3IifSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBuYW1lIFskY2FzYyBlbnRyeWNnZXQgJGkgLWxhYmVsXQotCQlpZiB7W3JlZ2V4cCB7Xm51bS1jbGllbnRzfSAkbmFtZV19IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYge1tyZWdleHAge15yZWZyZXNoLWxpc3R9ICRuYW1lXX0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7ISAkc2F3fSB7Ci0JCQlhcHBlbmRfdGV4dCAiXG4iCi0JCX0KLQkJc2V0IHNhdyAxCi0JCWFwcGVuZF90ZXh0ICJjbGllbnQ6ICRuYW1lXG4iCi0JfQotCWlmIHshICRzYXd9IHsKLQkJYXBwZW5kX3RleHQgImRvbmUuXG4iCi0JfQotfQotCi1wcm9jIHVwZGF0ZV9jbGllbnRzX21lbnUge2xpc3R9IHsKLQlnbG9iYWwgaXRlbV9jYXNjYWRlIGZmb250Ci0JZ2xvYmFsIHNhdmVkX2NsaWVudHNfc3RyCi0KLQlpZiB7IVtpbmZvIGV4aXN0cyBzYXZlZF9jbGllbnRzX3N0cl19IHsKLQkJc2V0IHNhdmVkX2NsaWVudHNfc3RyICIiCi0JfQotCWlmIHskbGlzdCA9PSAiSU5JVCJ9IHsKLQkJc2V0IGxpc3QgJHNhdmVkX2NsaWVudHNfc3RyCi0JfSBlbHNlIHsKLQkJc2V0IHNhdmVkX2NsaWVudHNfc3RyICRsaXN0Ci0JfQotCi0Jc2V0IHN1Ym0gJGl0ZW1fY2FzY2FkZShjdXJyZW50KTsKLQljYXRjaCB7ZGVzdHJveSAkc3VibX0KLQltZW51ICRzdWJtIC10ZWFyb2ZmIDAgLWZvbnQgJGZmb250Ci0JJHN1Ym0gYWRkIGNvbW1hbmQKLQkkc3VibSBhZGQgY29tbWFuZCAtbGFiZWwgInJlZnJlc2gtbGlzdCIgXAotCQktY29tbWFuZCAidXBkYXRlX2NsaWVudHNfYW5kX3JlcG9zdCIKLQkkc3VibSBhZGQgc2VwYXJhdG9yCi0Jc2V0IGNvdW50IDAKLQlmb3JlYWNoIGNsaWVudCBbc3BsaXQgJGxpc3QgIiwiXSB7Ci0JCWlmIHshW3JlZ2V4cCB7XlthLXowLTldKlthLXowLTldOn0gJGNsaWVudF19IHsKLQkJCSNhcHBlbmRfdGV4dCAiU2tpcHBpbmcgY2xpZW50IGxpbmU6ICIKLQkJCSNhcHBlbmRfdGV4dCAkY2xpZW50Ci0JCQkjYXBwZW5kX3RleHQgIlxuIgotCQkJY29udGludWUKLQkJfQotCQlyZWdzdWIgLWFsbCB7W3t9KCl+ISQmKnw7JyJge308PlxbXF1dfSAkY2xpZW50ICIiIGNsaWVudAotCQkjJwotCQlpZiB7W3JlZ2V4cCB7XiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopJH0gXAotCQkgICAgJGNsaWVudCBtMCBtMSBtMiBtMyBtNCBtNSBtNiBtNyBtOCBtOV19IHsKLQkJCXNldCBpZCAgICRtMQotCQkJc2V0IHVzZXIgJG00Ci0JCQlzZXQgdW5peCAkbTUKLQkJCXNldCBob3N0ICRtNgotCQkJcmVnc3ViIHtcLi4qJH0gJGhvc3QgIiIgaG9zdAotCQkJc2V0IGNsYWJlbCAiJGhvc3QgJGlkIgotCQkJaWYgeyR1bml4ICE9ICIiICYmICR1bml4ICE9ICJub25lIn0gewotCQkJCXNldCBjbGFiZWwgIiR1bml4QCRjbGFiZWwiCi0JCQl9IGVsc2VpZiB7JHVzZXIgIT0gInVua25vd24tdXNlciJ9IHsKLQkJCQlzZXQgY2xhYmVsICIkdXNlckAkY2xhYmVsIgotCQkJfQotCQl9IGVsc2UgewotCQkJcmVnc3ViIHs6LiokfSAkY2xpZW50ICIiIGNsYWJlbAotCQl9Ci0JCSRzdWJtIGFkZCBjb21tYW5kIC1sYWJlbCAiJGNsYWJlbCIgXAotCQkJLWNvbW1hbmQgImNsaWVudF9kaWFsb2cgXHskY2xpZW50XH0iCi0JCWluY3IgY291bnQKLQl9Ci0JJHN1Ym0gZW50cnljb25maWd1cmUgMCAtbGFiZWwgIm51bS1jbGllbnRzOiAkY291bnQiCi19Ci0KLXByb2Mgc2V0X3dpZGdldHMge30gewotCWdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jIGl0ZW1fY2FzZSBpdGVtX21lbnUgaXRlbV9lbnRyeSBtZW51X20KLQotCWZvcmVhY2ggaXRlbSBbYXJyYXkgbmFtZXMgaXRlbV9jYXNlXSB7Ci0JCWlmICFbaW5mbyBleGlzdHMgaXRlbV9jYXNlKCRpdGVtKV0geyBjb250aW51ZTsgfQotCQlzZXQgY2FzZSAkaXRlbV9jYXNlKCRpdGVtKQotCQlpZiAhW2luZm8gZXhpc3RzIGl0ZW1fbWVudSgkaXRlbSldIHsgY29udGludWU7IH0KLQkJc2V0IG1lbnUgJGl0ZW1fbWVudSgkaXRlbSkKLQkJaWYgIVtpbmZvIGV4aXN0cyBpdGVtX2VudHJ5KCRpdGVtKV0geyBjb250aW51ZTsgfQotCQlzZXQgZW50cnkgJGl0ZW1fZW50cnkoJGl0ZW0pCi0JCWlmIHskZW50cnkgPCAwfSB7Ci0JCQkjIHNraXAgY2FzZSB1bmRlciBiZWdpbm5lcl9tb2RlIAotCQkJY29udGludWUKLQkJfQotCQlzZXQgdHlwZSBbJG1lbnUgdHlwZSAkZW50cnldCi0JCWlmIHskdHlwZSA9PSAic2VwYXJhdG9yIiB8fCAkdHlwZSA9PSAidGVhcm9mZiJ9IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYgeyFbd2luZm8gZXhpc3RzICRtZW51XX0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7JGNvbm5lY3RlZF90b194MTF2bmN9IHsKLQkJCWlmIHtbYWN0aXZlX3doZW5fY29ubmVjdGVkICRpdGVtXX0gewotCQkJCSRtZW51IGVudHJ5Y29uZmlndXJlICRlbnRyeSAtc3RhdGUgbm9ybWFsCi0JCQl9IGVsc2UgewotCQkJCSRtZW51IGVudHJ5Y29uZmlndXJlICRlbnRyeSAtc3RhdGUgZGlzYWJsZWQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIHtbYWN0aXZlX3doZW5fc3RhcnRpbmcgJGl0ZW1dfSB7Ci0JCQkJJG1lbnUgZW50cnljb25maWd1cmUgJGVudHJ5IC1zdGF0ZSBub3JtYWwKLQkJCX0gZWxzZSB7Ci0JCQkJJG1lbnUgZW50cnljb25maWd1cmUgJGVudHJ5IC1zdGF0ZSBkaXNhYmxlZAotCQkJfQotCQl9Ci0JfQotfQotCi1wcm9jIHRvZ2dsZV9zaW1wbGVfZ3VpIHt9IHsKLQlnbG9iYWwgYmVnaW5uZXJfbW9kZSBzaW1wbGVfZ3VpX2NyZWF0ZWQKLQlnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYyBtYWtlX2d1aV9jb3VudAotCi0JaWYgeyRiZWdpbm5lcl9tb2RlfSB7Ci0JCWFwcGVuZF90ZXh0ICJcblN3aXRjaGluZyB0byBzaW1wbGUtZ3VpIG1vZGUuXG4iCi0JfSBlbHNlIHsKLQkJYXBwZW5kX3RleHQgIlxuU3dpdGNoaW5nIHRvIHBvd2VyLXVzZXIgZ3VpIG1vZGUuXG4iCi0JfQotCi0JaWYgeyRtYWtlX2d1aV9jb3VudCA9PSAxfSB7Ci0JCWluY3IgbWFrZV9ndWlfY291bnQKLQl9Ci0Jc2V0IHNpbXBsZV9ndWlfY3JlYXRlZCAxCi0JbWFrZV9tZW51X2l0ZW1zCi0Jc2V0X3dpZGdldHMKLQlzZXRfaW50ZXJuYWxfaGVscAotCWFwcGVuZF90ZXh0ICJcbiIKLX0KLQotcHJvYyBsaXR0bGVfcXMge219IHsKLQlnbG9iYWwgYmZvbnQgZmZvbnQgYmVnaW5uZXJfbW9kZQotCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0IGhlbHBsYWJlbAotCWdsb2JhbCB0a192ZXJzaW9uIG9zbmFtZQotCi0JaWYgeyR0a192ZXJzaW9uIDwgOC4wfSB7Ci0JCXJldHVybgotCX0KLQlpZiB7JG9zbmFtZSA9PSAiRGFyd2luIn0gewotCQlyZXR1cm4KLQl9Ci0KLQlzZXQgbiBbJG0gaW5kZXggZW5kXQotCi0JZm9yIHtzZXQgaSAwfSB7JGkgPD0gJG59IHtpbmNyIGl9IHsKLQkJc2V0IHR5cGUgWyRtIHR5cGUgJGldCi0jcHV0cyAiJG0gLSAkaSAtICR0eXBlIgotCQlpZiB7JHR5cGUgPT0gInNlcGFyYXRvciJ9IHsKLQkJCSRtIGFkZCBzZXBhcmF0b3IKLQkJfSBlbHNlaWYgeyR0eXBlID09ICJ0ZWFyb2ZmIn0gewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlzZXQgbGFiZWwgWyRtIGVudHJ5Y2dldCAkaSAtbGFiZWxdCi0JCQlzZXQgc3RyICIiCi0JCQlpZiB7W2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJGxhYmVsKV19IHsKLQkJCQlzZXQgc3RyICIoPykiCi0JCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRsYWJlbCldfSB7Ci0JCQkJc2V0IHN0ciAiKD8pIgotCQkJfQotCQkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsICRzdHIgXAotCQkJCS1mb250ICRmZm9udCBcCi0JCQkJLWNvbW1hbmQgIm1lbnVfaGVscCAkbGFiZWwiOwotCi0JCQlpZiB7JHN0ciA9PSAiIn0gewotCQkJCSRtIGVudHJ5Y29uZmlndXJlIGVuZCAtc3RhdGUgZGlzYWJsZWQKLQkJCX0KLQkJCXNldCBhcmcgIiRtLCRpIgotI3B1dHMgImhlbHBsYWJlbDogJGFyZyAtPiAkbGFiZWwiCi0JCQlzZXQgaGVscGxhYmVsKCRhcmcpICRsYWJlbAotCQkJc2V0IGogWyRtIGluZGV4IGVuZF0KLQkJCXNldCBhcmcgIiRtLCRqIgotCQkJc2V0IGhlbHBsYWJlbCgkYXJnKSAkbGFiZWwKLQkJfQotCQlpZiB7JGkgPT0gMH0gewotCQkJJG0gZW50cnljb25maWd1cmUgZW5kIC1jb2x1bW5icmVhayAxCi0JCX0KLQl9Ci0KLQltZW51X2JpbmRpbmdzICRtCi19Ci0KLXByb2MgbWFrZV9tZW51X2l0ZW1zIHt9IHsKLQlnbG9iYWwgdGVtcGxhdGUgCi0JZ2xvYmFsIG1lbnVfYiBtZW51X20gbWVudV9jb3VudAotCWdsb2JhbCBpdGVtX29wdHMgaXRlbV9ib29sIGl0ZW1fY2FzZSBpdGVtX21lbnUgaXRlbV9lbnRyeSBtZW51X3ZhciB1bnNldF9zdHIKLQlnbG9iYWwgaXRlbV9jYXNjYWRlCi0JZ2xvYmFsIGJmb250IGZmb250IGJlZ2lubmVyX21vZGUgc2ltcGxlX2d1aV9jcmVhdGVkCi0JZ2xvYmFsIGhlbHB0ZXh0IGhlbHByZW1vdGUgaGVscGxhYmVsCi0KLQkjIHNvbWUgdHdlYWtzLi4uCi0JaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIoZGVueSldfSB7Ci0JCXNldCBtZW51X3ZhcihkZW55KSAwCi0JfQotCi0Jc2V0IGNhc2UgIiI7Ci0Jc2V0IExfY2FzYyAiIgotCXNldCBMX2Nhc2NfY291bnQgMAotCXNldCBMX21lbnVzIFtsaXN0XQotCi0JIyBFeHRyYWN0IHRoZSBtZW51IGl0ZW1zOgotCWZvcmVhY2ggbGluZSBbc3BsaXQgJHRlbXBsYXRlICJcbiJdIHsKLQkJaWYge1tyZWdleHAge15Sb3c6fSAkbGluZV19IHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJaWYge1tyZWdleHAge15bQS16XX0gJGxpbmVdfSB7Ci0JCQlzZXQgY2FzZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0KLQkJCWlmIHskc2ltcGxlX2d1aV9jcmVhdGVkfSB7Ci0JCQkJc2V0IGkwIDAKLQkJCQkjaWYgeyRjYXNlID09ICJNaXNjIn0geyAjIGtsdWRnZSBmb3Igc2ltcGxlX2d1aQotCQkJCSMJc2V0IGkwIDEKLQkJCQkjfQotCQkJCWNhdGNoIHskbWVudV9tKCRjYXNlKSBkZWxldGUgJGkwIGVuZH0KLQkJCX0KLQkJCXNldCBtZW51X2NvdW50KCRjYXNlKSAwCi0JCQljb250aW51ZTsKLQkJfQotCi0JCXNldCBpdGVtIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkJcmVnc3ViIC1hbGwgeyAgKn0gJGl0ZW0gIiAiIGl0ZW0KLQkJaWYgeyRpdGVtID09ICIifSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzZXQgb3B0cyAiIgotCQlpZiB7W3JlZ2V4cCB7Xj19ICRpdGVtXX0gewotCQkJc2V0IG9wdHMgW2xpbmRleCBbc3BsaXQgJGl0ZW1dIDBdCi0JCQlyZWdzdWIge149fSAkb3B0cyAiIiBvcHRzCi0JCQlzZXQgaXRlbSBbbGluZGV4IFtzcGxpdCAkaXRlbV0gMV0KLQkJfQotCQlpZiB7W3JlZ2V4cCB7XjB9ICRvcHRzXX0gewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYge1tyZWdleHAgezokfSAkaXRlbV19IHsKLQkJCXNldCBib29sIDAKLQkJfSBlbHNlIHsKLQkJCXNldCBib29sIDEKLQkJfQotCQlyZWdzdWIgezokfSAkaXRlbSB7fSBpdGVtCi0KLQkJaWYgeyRpdGVtID09ICJMT0ZGIn0gewotCQkJc2V0IExfY2FzYyAiIgotCQkJY29udGludWUKLQkJfQotCi0JCWlmIHskaXRlbSA9PSAiLS0gRCJ9IHsKLQkJCXNldCBiZWdpbm5lcl9zZXAgMQotCQkJc2V0IGl0ZW0gIi0tIgotCQl9IGVsc2UgewotCQkJc2V0IGJlZ2lubmVyX3NlcCAwCi0JCX0KLQotCQlzZXQgaXRlbV9vcHRzKCRpdGVtKSAkb3B0cwotCQlzZXQgaXRlbV9jYXNlKCRpdGVtKSAkY2FzZQotCQlzZXQgaXRlbV9ib29sKCRpdGVtKSAkYm9vbAotCQlzZXQgaXRlbV9jYXNjYWRlKCRpdGVtKSAiIgotCi0JCWlmIHskTF9jYXNjID09ICIifSB7Ci0JCQlzZXQgaXRlbV9lbnRyeSgkaXRlbSkgJG1lbnVfY291bnQoJGNhc2UpCi0JCQlzZXQgbSAkbWVudV9tKCRjYXNlKQotCQl9IGVsc2UgewotCQkJIyBoYWNrIGZvciBjYXNjYWRlcyBmb3IgY3Jvd2RlZCBtZW51cy4gIFNlZSA9R0FMIG9wdHMuCi0JCQlzZXQgaXRlbV9lbnRyeSgkaXRlbSkgJExfY2FzY19jb3VudAotCQkJc2V0IG0gJExfY2FzYwotCQl9Ci0KLQkJc2V0IG12YXIgMCAKLQotCQlpZiB7JGJlZ2lubmVyX21vZGUgJiYgISAkYmVnaW5uZXJfc2VwICYmICFbb3B0X21hdGNoIEQgJGl0ZW1dfSB7Ci0JCQlzZXQgaXRlbV9lbnRyeSgkaXRlbSkgIi0xIgotCQkJY29udGludWU7Ci0JCX0KLQotCQlzZXQgaXRlbV9tZW51KCRpdGVtKSAkbQotCi0JCWlmIHswfSB7IHB1dHMgIklURU06ICRpdGVtXHQtICRvcHRzXHQtICRjYXNlXHQtIFwKLQkJCSRib29sXHQtICRtZW51X2NvdW50KCRjYXNlKSIgfQotCi0JCSMgQ3JlYXRlIHRoZSBtZW51IGl0ZW1zLCBpdHMgdmFyaWFibGVzLCBldGMuLCBldGMuCi0KLQkJaWYgeyRpdGVtID09ICItLSJ9IHsKLQkJCSRtIGFkZCBzZXBhcmF0b3IKLQotCQl9IGVsc2VpZiB7JGl0ZW0gPT0gIlF1aXQifSB7Ci0JCQkjIFF1aXQgaXRlbSBtdXN0IHNodXQgdXMgZG93bjoKLQkJCSRtIGFkZCBjb21tYW5kIC1sYWJlbCAiJGl0ZW0iIC11bmRlcmxpbmUgMCBcCi0JCQkJLWZvbnQgJGZmb250IFwKLQkJCQktY29tbWFuZCB7ZGVzdHJveSAuOyBleGl0IDB9Ci0KLQkJfSBlbHNlaWYgeyRjYXNlID09ICJIZWxwIn0gewotCQkJIyBIZWxwIGlzIHNpbXBsZSBoZWxwOgotCQkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsICIkaXRlbSIgXAotCQkJCS1mb250ICRmZm9udCBcCi0JCQkJLWNvbW1hbmQgIm1lbnVfaGVscCAkaXRlbSIKLQotCQl9IGVsc2VpZiB7W29wdF9tYXRjaCBMICRpdGVtXX0gewotCQkJIyBTcGVjaWFsIHN1Yi1tZW51IGNhc2NhZGUgKD1HQUwgZW5kcyB3aXRoIExPRkYpCi0JCQlzZXQgc3VibSAkbS5jYXNjX0wkbWVudV9jb3VudCgkY2FzZSkKLQkJCWNhdGNoIHtkZXN0cm95ICRzdWJtfQotCQkJbWVudSAkc3VibSAtdGVhcm9mZiAwIC1mb250ICRmZm9udAotCQkJc2V0IGl0ZW1fY2FzY2FkZSgkaXRlbSkgJHN1Ym0KLQkJCSRtIGFkZCBjYXNjYWRlIC1sYWJlbCAiJGl0ZW0iIFwKLQkJCQktZm9udCAkZmZvbnQgXAotCQkJCS1tZW51ICRzdWJtCi0JCQlzZXQgTF9jYXNjICRzdWJtCi0JCQlzZXQgTF9jYXNjX2NvdW50IC0xCi0JCQlsYXBwZW5kIExfbWVudXMgJExfY2FzYwotCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAiY3VycmVudCJ9IHsKLQkJCSMgQ3VycmVudCBjbGllbnRzIGNhc2NhZGUKLQkJCXNldCBzdWJtICRtLmN1cnJlbnRfY2FzY2FkZQotCQkJY2F0Y2gge2Rlc3Ryb3kgJHN1Ym19Ci0JCQlzZXQgaXRlbV9jYXNjYWRlKCRpdGVtKSAkc3VibQotCQkJdXBkYXRlX2NsaWVudHNfbWVudSAiSU5JVCIKLQkJCSRtIGFkZCBjYXNjYWRlIC1sYWJlbCAiJGl0ZW0iIFwKLQkJCQktZm9udCAkZmZvbnQgXAotCQkJCS1tZW51ICRzdWJtCi0KLQkJfSBlbHNlaWYge1tpc19hY3Rpb24gJGl0ZW1dfSB7Ci0JCQkjIEFjdGlvbgotCQkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsICIkaXRlbSIgXAotCQkJCS1mb250ICRmZm9udCBcCi0JCQkJLWNvbW1hbmQgImRvX3ZhciAkaXRlbSIKLQkJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHsKLQkJCQlzZXQgbWVudV92YXIoJGl0ZW0pICIiOwkjIGZvciBjb252ZW5pZW5jZQotCQkJfQotCi0JCX0gZWxzZWlmIHshICRpdGVtX2Jvb2woJGl0ZW0pfSB7Ci0JCQkjIFN0cmluZwotCQkJaWYge1tyZWdleHAgLS0gey1DOiguKil9ICRpdGVtX29wdHMoJGl0ZW0pIG0wIG0xXX0gewotCQkJCSMgUmFkaW9idXR0b24gc2VsZWN0Ci0JCQkJc2V0IHN1Ym0gJG0ucmFkaW9fY2FzY2FkZSRtZW51X2NvdW50KCRjYXNlKQotCQkJCWNhdGNoIHtkZXN0cm95ICRzdWJtfQotCQkJCW1lbnUgJHN1Ym0gLXRlYXJvZmYgMCAtZm9udCAkZmZvbnQKLQkJCQlmb3JlYWNoIHZhbCBbc3BsaXQgJG0xICIsIl0gewotCQkJCQkkc3VibSBhZGQgcmFkaW9idXR0b24gLWxhYmVsICIkdmFsIiBcCi0JCQkJCQktY29tbWFuZCAiZG9fdmFyICRpdGVtIiBcCi0JCQkJCQktdmFsdWUgIiR2YWwiIFwKLQkJCQkJCS1mb250ICRmZm9udCBcCi0JCQkJCQktdmFyaWFibGUgbWVudV92YXIoJGl0ZW0pCi0JCQkJfQotCQkJCSRtIGFkZCBjYXNjYWRlIC1sYWJlbCAiJGl0ZW0iIFwKLQkJCQkJLWZvbnQgJGZmb250IFwKLQkJCQkJLW1lbnUgJHN1Ym0KLQkJCQlzZXQgaXRlbV9jYXNjYWRlKCRpdGVtKSAkc3VibQotCQkJfSBlbHNlIHsKLQkJCQkjIEFyYml0cmFyeV9zdHJpbmcKLQkJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgIiRpdGVtIiBcCi0JCQkJCS1mb250ICRmZm9udCBcCi0JCQkJCS1jb21tYW5kICJkb192YXIgJGl0ZW0iCi0JCQl9Ci0JCQlzZXQgbXZhciAxCi0KLQkJfSBlbHNlaWYgeyRpdGVtID09ICJzaW1wbGUtZ3VpIn0gewotCQkJJG0gYWRkIGNoZWNrYnV0dG9uIC1sYWJlbCAiJGl0ZW0iIFwKLQkJCQktY29tbWFuZCAidG9nZ2xlX3NpbXBsZV9ndWkiIFwKLQkJCQktZm9udCAkZmZvbnQgXAotCQkJCS12YXJpYWJsZSBiZWdpbm5lcl9tb2RlCi0JCX0gZWxzZSB7Ci0JCQkjIEJvb2xlYW4KLQkJCSRtIGFkZCBjaGVja2J1dHRvbiAtbGFiZWwgIiRpdGVtIiBcCi0JCQkJLWNvbW1hbmQgImRvX3ZhciAkaXRlbSIgXAotCQkJCS1mb250ICRmZm9udCBcCi0JCQkJLXZhcmlhYmxlIG1lbnVfdmFyKCRpdGVtKQotCQkJaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIoJGl0ZW0pXX0gewotCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgMAotCQkJfQotCQl9Ci0KLQkJaWYgeyRMX2Nhc2NfY291bnQgPT0gLTF9IHsKLQkJCWluY3IgbWVudV9jb3VudCgkY2FzZSkKLQkJCWluY3IgTF9jYXNjX2NvdW50Ci0JCX0gZWxzZWlmIHskTF9jYXNjICE9ICIifSB7Ci0JCQlpbmNyIExfY2FzY19jb3VudAotCQl9IGVsc2UgewotCQkJaW5jciBtZW51X2NvdW50KCRjYXNlKQotCQl9Ci0KLQkJaWYgeyRtdmFyfSB7Ci0JCQlpZiB7IVtpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7Ci0JCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSAkdW5zZXRfc3RyCi0JCQl9Ci0JCX0KLQl9Ci0KLQkjIE5vdyBtYWtlIHRoZSBsaXR0bGUgIig/KSIgaGVscCBidXR0b25zCi0JZ2xvYmFsIG9zbmFtZQotCWZvcmVhY2ggY2FzZSBbYXJyYXkgbmFtZXMgbWVudV9tXSB7Ci0JCWlmIHskY2FzZSA9PSAiSGVscCJ9IHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWxpdHRsZV9xcyAkbWVudV9tKCRjYXNlKTsKLQl9Ci0JZm9yZWFjaCBtICRMX21lbnVzIHsKLQkJbGl0dGxlX3FzICRtCi0JfQotfQotCi1wcm9jIGNoZWNrX3VwZGF0ZV92YXJzIHt9IHsKLQlnbG9iYWwgbGFzdF9xdWVyeV9hbGxfdGltZSBxdWVyeV9hbGxfZnJlcSBpY29uX21vZGUKLQlnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYyBjbGllbnRfdGFpbCBjbGllbnRfc29jawotCi0Jc2V0IG5vdyBbY2xvY2sgc2Vjb25kc10KLQotCXNldCBkZWxheSAkcXVlcnlfYWxsX2ZyZXEKLQlpZiB7JGNsaWVudF90YWlsICE9ICIiICYmICRjbGllbnRfc29jayA9PSAiIn0gewotCQlzZXQgZGVsYXkgW2V4cHIgMiAqICRxdWVyeV9hbGxfZnJlcV0KLQl9Ci0KLQlpZiB7JGNvbm5lY3RlZF90b194MTF2bmN9IHsKLQkJc2V0IHF1aWV0IDAKLQkJc2V0IHJlZnJlc2ggW2V4cHIgIiRsYXN0X3F1ZXJ5X2FsbF90aW1lICsgJGRlbGF5Il0KLQotCQkjIHB1dHMgIm1lbnVfcG9zdGVkICRub3cgJGxhc3RfcXVlcnlfYWxsX3RpbWUiCi0JCSMgcHV0cyAibWVudV9wb3N0ZWQgJHJlZnJlc2giCi0KLQkJaWYgeyRub3cgPiAkcmVmcmVzaH0gewotCQkJYXBwZW5kX3RleHQgIlJlZnJlc2hpbmcgY3VycmVudCBzZXR0aW5ncy4uLiAiCi0JCQlxdWVyeV9hbGwgJHF1aWV0Ci0JCQlpZiB7JHF1aWV0fSB7Ci0JCQkJYXBwZW5kX3RleHQgImRvbmVcbiIKLQkJCX0KLQkJfQotCX0KLX0KLQotcHJvYyBtZW51X3Bvc3RlZCB7fSB7Ci0JY2hlY2tfdXBkYXRlX3ZhcnMKLX0KLQotcHJvYyBwcm9wc193aWRnZXRzIHtzdGF0ZX0gewotCWdsb2JhbCBwcm9wc19idXR0b25zCi0JZm9yZWFjaCB3ICRwcm9wc19idXR0b25zIHsKLQkJJHcgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUJCi0JfQotCXVwZGF0ZQotfQotCi1wcm9jIHByb3BzX2FwcGx5IHt9IHsKLQlnbG9iYWwgcHJvcHNfYWNjZXB0IHByb3BzX2NvbmZpcm0gcHJvcHNfdmlld29ubHkgcHJvcHNfc2hhcmVkIAotCWdsb2JhbCBwcm9wc196ZXJvY29uZiBwcm9wc19qYXZhdmlldyBwcm9wc19zb2xpZAotCWdsb2JhbCBwcm9wc19wYXNzd2QgcHJvcHNfdmlld3Bhc3N3ZAotCWdsb2JhbCBwcm9wMF9hY2NlcHQgcHJvcDBfY29uZmlybSBwcm9wMF92aWV3b25seSBwcm9wMF9zaGFyZWQKLQlnbG9iYWwgcHJvcDBfemVyb2NvbmYgcHJvcDBfamF2YXZpZXcgcHJvcDBfc29saWQKLQlnbG9iYWwgcHJvcDBfcGFzc3dkIHByb3AwX3ZpZXdwYXNzd2QKLQlnbG9iYWwgbWVudV92YXIKLQlnbG9iYWwgY2xpZW50X3NvY2sKLQotCXByb3BzX3dpZGdldHMgZGlzYWJsZWQKLQotCXNldCBhZnQgNTAwCi0JaWYge1tpbmZvIGV4aXN0cyBjbGllbnRfc29ja119IHsKLQkJaWYgeyRjbGllbnRfc29jayAhPSAiIn0gewotCQkJc2V0IGFmdCAxNTAKLQkJfQotCX0KLQlzZXQgZGlkIDAKLQotCXNldCBmYWlsIDAKLQotCWlmIHskcHJvcHNfY29uZmlybSAhPSAkcHJvcDBfY29uZmlybX0gewotCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWQKLQkJaWYgeyRwcm9wc19jb25maXJtfSB7Ci0JCQlwdXNoX25ld192YWx1ZSAiYWNjZXB0IiAiYWNjZXB0IiAicG9wdXAiIDEKLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJhY2NlcHQiICJhY2NlcHQiICIiIDEKLQkJfQotCQlpZiB7JG1lbnVfdmFyKGFjY2VwdCkgPT0gInBvcHVwIn0gewotCQkJc2V0IHByb3BzX2NvbmZpcm0gMQotCQl9IGVsc2VpZiB7JG1lbnVfdmFyKGFjY2VwdCkgPT0gIiJ9IHsKLQkJCXNldCBwcm9wc19jb25maXJtIDAKLQkJfQotCQlpZiB7JHByb3BzX2NvbmZpcm0gPT0gJHByb3AwX2NvbmZpcm19IHtpbmNyIGZhaWx9Ci0JCXNldCBwcm9wMF9jb25maXJtICRwcm9wc19jb25maXJtCi0JfQotCi0JaWYgeyRwcm9wc192aWV3b25seSAhPSAkcHJvcDBfdmlld29ubHl9IHsKLQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkCi0JCWlmIHskcHJvcHNfdmlld29ubHl9IHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJ2aWV3b25seSIgInZpZXdvbmx5IiAxIDEKLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJ2aWV3b25seSIgIm5vdmlld29ubHkiIDEgMQotCQl9Ci0JCWlmIHskbWVudV92YXIodmlld29ubHkpfSB7Ci0JCQlzZXQgcHJvcHNfdmlld29ubHkgMQotCQl9IGVsc2UgewotCQkJc2V0IHByb3BzX3ZpZXdvbmx5IDAKLQkJfQotCQlpZiB7JHByb3BzX3ZpZXdvbmx5ID09ICRwcm9wMF92aWV3b25seX0ge2luY3IgZmFpbH0KLQkJc2V0IHByb3AwX3ZpZXdvbmx5ICRwcm9wc192aWV3b25seQotCX0KLQotCWlmIHskcHJvcHNfc2hhcmVkICE9ICRwcm9wMF9zaGFyZWR9IHsKLQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkCi0JCWlmIHskcHJvcHNfc2hhcmVkfSB7Ci0JCQlwdXNoX25ld192YWx1ZSAic2hhcmVkIiAic2hhcmVkIiAxIDEKLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJzaGFyZWQiICJub3NoYXJlZCIgMSAxCi0JCX0KLQkJaWYgeyRtZW51X3ZhcihzaGFyZWQpfSB7Ci0JCQlzZXQgcHJvcHNfc2hhcmVkIDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc19zaGFyZWQgMAotCQl9Ci0JCWlmIHskcHJvcHNfc2hhcmVkID09ICRwcm9wMF9zaGFyZWR9IHtpbmNyIGZhaWx9Ci0JCXNldCBwcm9wMF9zaGFyZWQgJHByb3BzX3NoYXJlZAotCX0KLQotCWlmIHskcHJvcHNfemVyb2NvbmYgIT0gJHByb3AwX3plcm9jb25mfSB7Ci0JCWlmIHskZGlkID4gMH0ge2FmdGVyICRhZnR9OyBpbmNyIGRpZAotCQlpZiB7JHByb3BzX3plcm9jb25mfSB7Ci0JCQlwdXNoX25ld192YWx1ZSAiemVyb2NvbmYiICJ6ZXJvY29uZiIgMSAxCi0JCX0gZWxzZSB7Ci0JCQlwdXNoX25ld192YWx1ZSAiemVyb2NvbmYiICJub3plcm9jb25mIiAxIDEKLQkJfQotCQlpZiB7JG1lbnVfdmFyKHplcm9jb25mKX0gewotCQkJc2V0IHByb3BzX3plcm9jb25mIDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc196ZXJvY29uZiAwCi0JCX0KLQkJaWYgeyRwcm9wc196ZXJvY29uZiA9PSAkcHJvcDBfemVyb2NvbmZ9IHtpbmNyIGZhaWx9Ci0JCXNldCBwcm9wMF96ZXJvY29uZiAkcHJvcHNfemVyb2NvbmYKLQl9Ci0KLQlpZiB7JHByb3BzX2phdmF2aWV3ICE9ICRwcm9wMF9qYXZhdmlld30gewotCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWQKLQkJaWYgeyRwcm9wc19qYXZhdmlld30gewotCQkJcHVzaF9uZXdfdmFsdWUgImh0dHAiICJodHRwIiAxIDEKLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJodHRwIiAibm9odHRwIiAxIDEKLQkJfQotCQlpZiB7JG1lbnVfdmFyKGh0dHApfSB7Ci0JCQlzZXQgcHJvcHNfamF2YXZpZXcgMQotCQl9IGVsc2UgewotCQkJc2V0IHByb3BzX2phdmF2aWV3IDAKLQkJfQotCQlpZiB7JHByb3BzX2phdmF2aWV3ID09ICRwcm9wMF9qYXZhdmlld30ge2luY3IgZmFpbH0KLQkJc2V0IHByb3AwX2phdmF2aWV3ICRwcm9wc19qYXZhdmlldwotCX0KLQotCWlmIHskcHJvcHNfc29saWQgIT0gJHByb3AwX3NvbGlkfSB7Ci0JCWlmIHskZGlkID4gMH0ge2FmdGVyICRhZnR9OyBpbmNyIGRpZAotCQlpZiB7JHByb3BzX3NvbGlkfSB7Ci0JCQlwdXNoX25ld192YWx1ZSAic29saWQiICJzb2xpZCIgMSAxCi0JCX0gZWxzZSB7Ci0JCQlwdXNoX25ld192YWx1ZSAic29saWQiICJub3NvbGlkIiAxIDEKLQkJfQotCQlpZiB7JG1lbnVfdmFyKHNvbGlkKX0gewotCQkJc2V0IHByb3BzX3NvbGlkIDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc19zb2xpZCAwCi0JCX0KLQkJaWYgeyRwcm9wc19zb2xpZCA9PSAkcHJvcDBfc29saWR9IHtpbmNyIGZhaWx9Ci0JCXNldCBwcm9wMF9zb2xpZCAkcHJvcHNfc29saWQKLQl9Ci0KLQlzZXQgZnB3IDAKLQlpZiB7JHByb3BzX3Bhc3N3ZCAhPSAkcHJvcDBfcGFzc3dkfSB7Ci0JCXNldCBmcHcgMQotCX0KLQlzZXQgdnB3IDAKLQlpZiB7JHByb3BzX3ZpZXdwYXNzd2QgIT0gJHByb3AwX3ZpZXdwYXNzd2R9IHsKLQkJc2V0IHZwdyAxCi0JfQotCi0Jc2V0IHB3X29yZCBbbGlzdF0KLQlpZiB7ISRmcHcgJiYgISR2cHcgfSB7Ci0JCSMgbmVpdGhlciBjaGFuZ2UKLQkJOwotCX0gZWxzZWlmIHskZnB3ICYmICEkdnB3fSB7Ci0JCSMgZnVsbCBwYXNzd29yZCBjaGFuZ2UKLQkJaWYgeyRwcm9wc19wYXNzd2QgPT0gIiJ9IHsKLQkJCWlmIHskcHJvcDBfdmlld3Bhc3N3ZCAhPSAiIn0gewotCQkJCSMgc2V0IHZpZXcgdG8gIiIgYXMgd2VsbCBhbmQgZmlyc3QKLQkJCQlzZXQgcHJvcHNfdmlld3Bhc3N3ZCAiIgotCQkJCXNldCBwd19vcmQgW2xpc3QgdnB3IGZwd10KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0IHB3X29yZCBbbGlzdCBmcHddCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkjIGFzc3VtZSB2aWV3IHN0YXRlIE9LCi0JCQlzZXQgcHdfb3JkIFtsaXN0IGZwd10KLQkJfQotCQkKLQl9IGVsc2VpZiB7ISRmcHcgJiYgJHZwd30gewotCQkjIHZpZXcgcGFzc3dvcmQgY2hhbmdlCi0JCWlmIHskcHJvcHNfdmlld3Bhc3N3ZCA9PSAiIn0gewotCQkJIyBhc3N1bWUgZnVsbCBzdGF0ZSBPSwotCQkJc2V0IHB3X29yZCBbbGlzdCB2cHddCi0JCX0gZWxzZSB7Ci0JCQlpZiB7JHByb3AwX3Bhc3N3ZCA9PSAiIn0gewotCQkJCSMgY291bGQgYmUgdHJvdWJsZSwgeDExdm5jIG1ha2VzIHJhbmRvbQotCQkJCSMgZnVsbCBwYXNzd2QuLi4KLQkJCQlzZXQgcHdfb3JkIFtsaXN0IHZwd10KLQkJCX0gZWxzZSB7Ci0JCQkJIyBPSywgZnVsbCBub24tbnVsbC4KLQkJCQlzZXQgcHdfb3JkIFtsaXN0IHZwd10KLQkJCX0KLQkJfQotCX0gZWxzZWlmIHskZnB3ICYmICR2cHd9IHsKLQkJIyBib3RoIGZ1bGwgYW5kIHZpZXcgcGFzc3dvcmQgY2hhbmdlCi0JCWlmIHskcHJvcHNfcGFzc3dkID09ICIiICYmICRwcm9wc192aWV3cGFzc3dkID09ICIifSB7Ci0JCQkjIE9LLCBkbyB2aWV3IGZpcnN0Ci0JCQlzZXQgcHdfb3JkIFtsaXN0IHZwdyBmcHddCi0JCX0gZWxzZWlmIHskcHJvcHNfcGFzc3dkID09ICIiICYmICRwcm9wc192aWV3cGFzc3dkICE9ICIifSB7Ci0JCQkjIE5vdCBnb29kLCBkbyB2aWV3IGZpcnN0IGFueXdheSB4MTF2bmMgd2lsbCBmaXguCi0JCQlzZXQgcHdfb3JkIFtsaXN0IHZwdyBmcHddCi0JCX0gZWxzZWlmIHskcHJvcHNfcGFzc3dkICE9ICIiICYmICRwcm9wc192aWV3cGFzc3dkID09ICIifSB7Ci0JCQkjIE9LLCB2aWV3IGZpcnN0Ci0JCQlzZXQgcHdfb3JkIFtsaXN0IHZwdyBmcHddCi0JCX0gZWxzZWlmIHskcHJvcHNfcGFzc3dkICE9ICIiICYmICRwcm9wc192aWV3cGFzc3dkICE9ICIifSB7Ci0JCQkjIE9LLCBmdWxsIGZpcnN0Ci0JCQlzZXQgcHdfb3JkIFtsaXN0IGZwdyB2cHddCi0JCX0KLQl9Ci0KLQlmb3JlYWNoIGNhc2UgJHB3X29yZCB7Ci0JCWlmIHskY2FzZSA9PSAiZnB3In0gewotCQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkCi0JCQlwdXNoX25ld192YWx1ZSAicGFzc3dkIiAicGFzc3dkIiAiJHByb3BzX3Bhc3N3ZCIgMQotCQkJaWYgeyRwcm9wc19wYXNzd2QgPT0gJHByb3AwX3Bhc3N3ZH0ge2luY3IgZmFpbH0KLQkJCXNldCBwcm9wMF9wYXNzd2QgJHByb3BzX3Bhc3N3ZAotCQl9Ci0JCWlmIHskY2FzZSA9PSAidnB3In0gewotCQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkCi0JCQlwdXNoX25ld192YWx1ZSAidmlld3Bhc3N3ZCIgInZpZXdwYXNzd2QiICIkcHJvcHNfdmlld3Bhc3N3ZCIgMQotCQkJaWYgeyRwcm9wc192aWV3cGFzc3dkID09ICRwcm9wMF92aWV3cGFzc3dkfSB7aW5jciBmYWlsfQotCQkJc2V0IHByb3AwX3ZpZXdwYXNzd2QgJHByb3BzX3ZpZXdwYXNzd2QKLQkJfQotCX0KLQotCWlmIHskcHJvcHNfYWNjZXB0ICE9ICRwcm9wMF9hY2NlcHR9IHsKLQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkCi0JCWlmIHskcHJvcHNfYWNjZXB0fSB7Ci0JCQlwdXNoX25ld192YWx1ZSAidW5sb2NrIiAidW5sb2NrIiAxIDAKLQkJfSBlbHNlIHsKLQkJCXB1c2hfbmV3X3ZhbHVlICJsb2NrIiAibG9jayIgMSAwCi0JCX0KLQkJaWYgeyRwcm9wc19hY2NlcHQgPT0gJHByb3AwX2FjY2VwdH0ge2luY3IgZmFpbH0KLQkJc2V0IHByb3AwX2FjY2VwdCAkcHJvcHNfYWNjZXB0Ci0JfQotCi0JcHJvcHNfd2lkZ2V0cyBub3JtYWwKLQlpZiB7JGZhaWwgPiAwfSB7Ci0JCXJldHVybiAwCi0JfSBlbHNlIHsKLQkJcmV0dXJuIDEKLQl9Ci19Ci0KLXByb2MgcHJvcHNfYWR2YW5jZWQge30gewotCWdsb2JhbCBpY29uX21vZGUgcHJvcHNfd2luIGZ1bGxfd2luCi0JZ2xvYmFsIHByb3BzX2FkdmFuY2VkX2ZpcnN0Ci0KLQlpZiAhW2luZm8gZXhpc3RzIHByb3BzX2FkdmFuY2VkX2ZpcnN0XSB7Ci0JCWNlbnRlcl93aW4gJGZ1bGxfd2luCi0JCXNldCBwcm9wc19hZHZhbmNlZF9maXJzdCAxCi0JCXNldCBmaXJzdCAxCi0JfSBlbHNlIHsKLQkJc2V0IGZpcnN0IDAKLQl9Ci0JdXBkYXRlCi0Jd20gZGVpY29uaWZ5ICRmdWxsX3dpbgotCXVwZGF0ZQotCi0JaWYgeyRmaXJzdH0gewotCQlzZXQgdyAkZnVsbF93aW4KLQkJd20gbWluc2l6ZSAkdyBbd2luZm8gd2lkdGggJHddIFt3aW5mbyBoZWlnaHQgJHddCi0JfQotCXB1c2hfbmV3X3ZhbHVlICJyZW1vdGUtY21kIiAicmVtb3RlLWNtZCIgIlE6Y2xpZW50cyIgMQotfQotCi1wcm9jIGRvX3Byb3BzIHt9IHsKLQlnbG9iYWwgcHJvcHNfYWNjZXB0IHByb3BzX2NvbmZpcm0gcHJvcHNfdmlld29ubHkgcHJvcHNfc2hhcmVkCi0JZ2xvYmFsIHByb3BzX3plcm9jb25mIHByb3BzX2phdmF2aWV3IHByb3BzX3NvbGlkCi0JZ2xvYmFsIHByb3BzX3Bhc3N3ZCBwcm9wc192aWV3cGFzc3dkCi0JZ2xvYmFsIHByb3AwX2FjY2VwdCBwcm9wMF9jb25maXJtIHByb3AwX3ZpZXdvbmx5IHByb3AwX3NoYXJlZAotCWdsb2JhbCBwcm9wMF96ZXJvY29uZiBwcm9wMF9qYXZhdmlldyBwcm9wMF9zb2xpZAotCWdsb2JhbCBwcm9wMF9wYXNzd2QgcHJvcDBfdmlld3Bhc3N3ZAotCWdsb2JhbCBtZW51X3ZhciB1bnNldF9zdHIKLQlnbG9iYWwgaGF2ZV9sYWJlbGZyYW1lcyBmZm9udCBiZm9udAotCWdsb2JhbCBwcm9wc19idXR0b25zIGljb25fbm9hZHZhbmNlZAotCWdsb2JhbCBpY29uX21vZGUgaWNvbl9tb2RlX2F0X3N0YXJ0dXAKLQlnbG9iYWwgc2NyZWVuX2hlaWdodCBzY3JlZW5fd2lkdGgKLQlnbG9iYWwgZG9fcHJvcHNfbXNnCi0KLQlzZXQgbXNnICIiCi0JaWYge1tpbmZvIGV4aXN0cyBkb19wcm9wc19tc2ddfSB7Ci0JCXNldCBtc2cgJGRvX3Byb3BzX21zZwotCX0KLQotCWNoZWNrX3VwZGF0ZV92YXJzCi0KLQlzZXQgcGFkeSAwLjVtCi0Jc2V0IHBhZHkgMC4zbQotCWlmIHskc2NyZWVuX2hlaWdodCA8PSAzNjB9IHsKLQkJc2V0IHBhZHkgMG0KLQl9Ci0KLQlpZiBbaW5mbyBleGlzdHMgbWVudV92YXIoZGVueSldIHsKLQkJaWYgeyRtZW51X3ZhcihkZW55KSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3ZhcihkZW55KSA9PSAwfSB7Ci0JCQlzZXQgcHJvcHNfYWNjZXB0IDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc19hY2NlcHQgMAotCQl9Ci0JfSBlbHNlIHsKLQkJc2V0IG1lbnVfdmFyKGRlbnkpIDAKLQkJc2V0IHByb3BzX2FjY2VwdCAxCi0JfQotCXNldCBwcm9wMF9hY2NlcHQgJHByb3BzX2FjY2VwdAotCi0JaWYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKGFjY2VwdCldIHsKLQkJaWYgeyRtZW51X3ZhcihhY2NlcHQpID09ICR1bnNldF9zdHIgfHwgJG1lbnVfdmFyKGFjY2VwdCkgPT0gIiJ9IHsKLQkJCXNldCBwcm9wc19jb25maXJtIDAKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc19jb25maXJtIDEKLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBtZW51X3ZhcihhY2NlcHQpICIiCi0JCXNldCBwcm9wc19jb25maXJtIDAKLQl9Ci0Jc2V0IHByb3AwX2NvbmZpcm0gJHByb3BzX2NvbmZpcm0KLQotCWlmIFtpbmZvIGV4aXN0cyBtZW51X3Zhcih2aWV3b25seSldIHsKLQkJaWYgeyRtZW51X3Zhcih2aWV3b25seSkgPT0gJHVuc2V0X3N0ciB8fCAkbWVudV92YXIodmlld29ubHkpID09ICIifSB7Ci0JCQlzZXQgcHJvcHNfdmlld29ubHkgMAotCQl9IGVsc2VpZiAoJG1lbnVfdmFyKHZpZXdvbmx5KSkgewotCQkJc2V0IHByb3BzX3ZpZXdvbmx5IDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc192aWV3b25seSAwCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbWVudV92YXIodmlld29ubHkpIDAKLQkJc2V0IHByb3BzX3ZpZXdvbmx5IDAKLQl9Ci0Jc2V0IHByb3AwX3ZpZXdvbmx5ICRwcm9wc192aWV3b25seQotCi0JaWYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKHNoYXJlZCldIHsKLQkJaWYgeyRtZW51X3ZhcihzaGFyZWQpID09ICR1bnNldF9zdHIgfHwgJG1lbnVfdmFyKHNoYXJlZCkgPT0gIiJ9IHsKLQkJCXNldCBwcm9wc19zaGFyZWQgMAotCQl9IGVsc2VpZiAoJG1lbnVfdmFyKHNoYXJlZCkpIHsKLQkJCXNldCBwcm9wc19zaGFyZWQgMQotCQl9IGVsc2UgewotCQkJc2V0IHByb3BzX3NoYXJlZCAwCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbWVudV92YXIoc2hhcmVkKSAwCi0JCXNldCBwcm9wc19zaGFyZWQgMAotCX0KLQlzZXQgcHJvcDBfc2hhcmVkICRwcm9wc19zaGFyZWQKLQotCWlmIFtpbmZvIGV4aXN0cyBtZW51X3Zhcih6ZXJvY29uZildIHsKLQkJaWYgeyRtZW51X3Zhcih6ZXJvY29uZikgPT0gJHVuc2V0X3N0ciB8fCAkbWVudV92YXIoemVyb2NvbmYpID09ICIifSB7Ci0JCQlzZXQgcHJvcHNfemVyb2NvbmYgMAotCQl9IGVsc2VpZiAoJG1lbnVfdmFyKHplcm9jb25mKSkgewotCQkJc2V0IHByb3BzX3plcm9jb25mIDEKLQkJfSBlbHNlIHsKLQkJCXNldCBwcm9wc196ZXJvY29uZiAwCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbWVudV92YXIoemVyb2NvbmYpIDAKLQkJc2V0IHByb3BzX3plcm9jb25mIDAKLQl9Ci0Jc2V0IHByb3AwX3plcm9jb25mICRwcm9wc196ZXJvY29uZgotCi0JaWYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKGh0dHApXSB7Ci0JCWlmIHskbWVudV92YXIoaHR0cCkgPT0gJHVuc2V0X3N0ciB8fCAkbWVudV92YXIoaHR0cCkgPT0gIiJ9IHsKLQkJCXNldCBwcm9wc19qYXZhdmlldyAwCi0JCX0gZWxzZWlmICgkbWVudV92YXIoaHR0cCkpIHsKLQkJCXNldCBwcm9wc19qYXZhdmlldyAxCi0JCX0gZWxzZSB7Ci0JCQlzZXQgcHJvcHNfamF2YXZpZXcgMAotCQl9Ci0JfSBlbHNlIHsKLQkJc2V0IG1lbnVfdmFyKGh0dHApIDAKLQkJc2V0IHByb3BzX2phdmF2aWV3IDAKLQl9Ci0Jc2V0IHByb3AwX2phdmF2aWV3ICRwcm9wc19qYXZhdmlldwotCi0JaWYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKHNvbGlkKV0gewotCQlpZiB7JG1lbnVfdmFyKHNvbGlkKSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3Zhcihzb2xpZCkgPT0gIiJ9IHsKLQkJCXNldCBwcm9wc19zb2xpZCAwCi0JCX0gZWxzZWlmICgkbWVudV92YXIoc29saWQpKSB7Ci0JCQlzZXQgcHJvcHNfc29saWQgMQotCQl9IGVsc2UgewotCQkJc2V0IHByb3BzX3NvbGlkIDAKLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBtZW51X3Zhcihzb2xpZCkgMAotCQlzZXQgcHJvcHNfc29saWQgMAotCX0KLQlzZXQgcHJvcDBfc29saWQgJHByb3BzX3NvbGlkCi0KLQlpZiAhW2luZm8gZXhpc3RzIHByb3BzX3Bhc3N3ZF0gewotCQlzZXQgcHJvcHNfcGFzc3dkICIiCi0JfQotCXNldCBwcm9wMF9wYXNzd2QgJHByb3BzX3Bhc3N3ZAotCi0JaWYgIVtpbmZvIGV4aXN0cyBwcm9wc192aWV3cGFzc3dkXSB7Ci0JCXNldCBwcm9wc192aWV3cGFzc3dkICIiCi0JfQotCXNldCBwcm9wMF92aWV3cGFzc3dkICRwcm9wc192aWV3cGFzc3dkCi0KLQlpZiBbaW5mbyBleGlzdHMgcHJvcHNfYnV0dG9uc10gewotCQljYXRjaCB7dW5zZXQgcHJvcHNfYnV0dG9uc30KLQl9Ci0Jc2V0IHByb3BzX2J1dHRvbnMgW2xpc3RdCi0KLQlzZXQgd3AgLnByb3BzCi0Jc2V0IHcgJHdwCi0JY2F0Y2gge2Rlc3Ryb3kgJHdwfQotCXRvcGxldmVsICR3cAotCXdtIHRpdGxlICR3cCAieDExdm5jIFByb3BlcnRpZXMiCi0JZnJhbWUgJHcubGYKLQlzZXQgdyAkdy5sZgotCXNldCBiMSAiJHcuYnV0dG9uczEiCi0JZnJhbWUgJGIxCi0JYnV0dG9uICRiMS5vayAtdGV4dCBPSyAtY29tbWFuZCAiaWYge1xbcHJvcHNfYXBwbHlcXX0ge2Rlc3Ryb3kgJHdwfSIgLWZvbnQgJGJmb250Ci0JYnV0dG9uICRiMS5jYW5jZWwgLXRleHQgQ2FuY2VsIC1jb21tYW5kICJkZXN0cm95ICR3cCIgLWZvbnQgJGJmb250Ci0JYnV0dG9uICRiMS5hcHBseSAgLXRleHQgQXBwbHkgLWNvbW1hbmQgInByb3BzX2FwcGx5IiAtZm9udCAkYmZvbnQKLQotCWJpbmQgJHcgPEtleVByZXNzLUVzY2FwZT4gImRlc3Ryb3kgJHdwIgotCi0JcGFjayAkYjEub2sgJGIxLmNhbmNlbCAkYjEuYXBwbHkgLXNpZGUgbGVmdCAtZXhwYW5kIDAKLQlsYXBwZW5kIHByb3BzX2J1dHRvbnMgJGIxLmFwcGx5ICRiMS5jYW5jZWwgJGIxLm9rCi0KLQlzZXQgYjIgIiR3LmJ1dHRvbnMyIgotCWZyYW1lICRiMgotCi0JYnV0dG9uICRiMi5hZHZhbmNlZCAtdGV4dCAiIEFkdmFuY2VkIC4uLiAiIFwKLQkJLWNvbW1hbmQgImRlc3Ryb3kgJHdwOyBwcm9wc19hZHZhbmNlZCIgLWZvbnQgJGJmb250Ci0JaWYgeyEgJGljb25fbm9hZHZhbmNlZH0gewotCQlsYXBwZW5kIHByb3BzX2J1dHRvbnMgJGIyLmFkdmFuY2VkCi0JCXBhY2sgJGIyLmFkdmFuY2VkIC1zaWRlIGxlZnQgLWV4cGFuZCAwCi0JfQotCi0JYnV0dG9uICRiMi5oZWxwIC10ZXh0ICIgIEhlbHAgICIgLWNvbW1hbmQgIm1lbnVfaGVscCBQcm9wZXJ0aWVzIiAtZm9udCAkYmZvbnQKLQlsYXBwZW5kIHByb3BzX2J1dHRvbnMgJGIyLmhlbHAKLQlwYWNrICRiMi5oZWxwIC1zaWRlIGxlZnQgLWV4cGFuZCAwCi0KLQlzZXQgcHcgIiR3LnBhc3N3ZCIKLQlpZiB7JGhhdmVfbGFiZWxmcmFtZXN9IHsKLQkJbGFiZWxmcmFtZSAkcHcgLXRleHQgIlBhc3N3b3JkIiAtZm9udCAkYmZvbnQKLQl9IGVsc2UgewotCQlmcmFtZSAkcHcKLQkJc2V0IGwgJHB3LmwKLQkJbGFiZWwgJGwgLXRleHQgIlBhc3N3b3JkOiIgLWp1c3RpZnkgbGVmdCAtYW5jaG9yIHcgLWZvbnQgJGJmb250Ci0JCXBhY2sgJHB3LmwgLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgMG0gLXNpZGUgdG9wCi0JfQotCWVudHJ5ICRwdy5lIC1zaG93ICIqIiAtdGV4dHZhcmlhYmxlIHByb3BzX3Bhc3N3ZCAtZm9udCAkYmZvbnQKLQlwYWNrICRwdy5lIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5IC1zaWRlIHRvcAotCi0JZ2xvYmFsIHgxMXZuY19pY29uX21vZGUKLQlpZiB7ISAkeDExdm5jX2ljb25fbW9kZX0gewotCQljYXRjaCB7ICRwdy5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWlmIHshICRoYXZlX2xhYmVsZnJhbWVzfSB7Ci0JCQljYXRjaCB7ICRwdy5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCX0KLQl9IGVsc2UgewotCQlsYXBwZW5kIHByb3BzX2J1dHRvbnMgJHB3LmUKLQl9Ci0KLQotCXNldCB2cCAiJHcudmlld3B3IgotCWlmIHskaGF2ZV9sYWJlbGZyYW1lc30gewotCQlsYWJlbGZyYW1lICR2cCAtdGV4dCAiVmlld09ubHkgUGFzc3dvcmQiIC1mb250ICRiZm9udAotCX0gZWxzZSB7Ci0JCWZyYW1lICR2cAotCQlzZXQgbCAkdnAubAotCQlsYWJlbCAkbCAtdGV4dCAiVmlld09ubHkgUGFzc3dvcmQ6IiAtanVzdGlmeSBsZWZ0IC1hbmNob3IgdyAtZm9udCAkYmZvbnQKLQkJcGFjayAkdnAubCAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAwbSAtc2lkZSB0b3AKLQl9Ci0JZW50cnkgJHZwLmUgLXNob3cgIioiIC10ZXh0dmFyaWFibGUgcHJvcHNfdmlld3Bhc3N3ZCAtZm9udCAkYmZvbnQKLQlwYWNrICR2cC5lIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5IC1zaWRlIHRvcAotCi0JaWYgeyEgJHgxMXZuY19pY29uX21vZGV9IHsKLQkJY2F0Y2ggeyAkdnAuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQlpZiB7ISAkaGF2ZV9sYWJlbGZyYW1lc30gewotCQkJY2F0Y2ggeyAkdnAubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQl9Ci0JfSBlbHNlIHsKLQkJbGFwcGVuZCBwcm9wc19idXR0b25zICR2cC5lCi0JfQotCi0JaWYgeyEgJGljb25fbW9kZV9hdF9zdGFydHVwfSB7Ci0JCSR2cC5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKLQkJY2F0Y2ggeyR2cC5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHskdnAgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH0KLQkJY2F0Y2ggeyR2cCBjb25maWd1cmUgLWZvcmVncm91bmQgZ3JleTYwfQotCQkkcHcuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCi0JCWNhdGNoIHskcHcubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfQotCQljYXRjaCB7JHB3IGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9Ci0JCWNhdGNoIHskcHcgY29uZmlndXJlIC1mb3JlZ3JvdW5kIGdyZXk2MH0KLQl9Ci0KLQlzZXQgc2IgIiR3LnNvbGlkIgotCWZyYW1lICRzYgotCWNoZWNrYnV0dG9uICRzYi5idXR0b24gLXRleHQgIlNvbGlkIEJhY2tncm91bmQgQ29sb3IiIFwKLQkJLXZhcmlhYmxlIHByb3BzX3NvbGlkIC1hbmNob3IgdyAtZm9udCAkYmZvbnQKLQlwYWNrICRzYi5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkKLQotCXNldCBqdiAiJHcuamF2YXZpZXciCi0JZnJhbWUgJGp2Ci0JY2hlY2tidXR0b24gJGp2LmJ1dHRvbiAtdGV4dCAiU2VydmUgSmF2YSBWaWV3ZXIgQXBwbGV0IiBcCi0JCS12YXJpYWJsZSBwcm9wc19qYXZhdmlldyAtYW5jaG9yIHcgLWZvbnQgJGJmb250Ci0JcGFjayAkanYuYnV0dG9uIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5Ci0KLQlzZXQgemMgIiR3Lnplcm9jb25mIgotCWZyYW1lICR6YwotCWNoZWNrYnV0dG9uICR6Yy5idXR0b24gLXRleHQgIkFkdmVydGlzZSBTZXJ2aWNlIChaZXJvY29uZikiIFwKLQkJLXZhcmlhYmxlIHByb3BzX3plcm9jb25mIC1hbmNob3IgdyAtZm9udCAkYmZvbnQKLQlwYWNrICR6Yy5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkKLQotCXNldCBzaCAiJHcuc2hhcmVkIgotCWZyYW1lICRzaAotCWNoZWNrYnV0dG9uICRzaC5idXR0b24gLXRleHQgIlNoYXJlZCIgXAotCQktdmFyaWFibGUgcHJvcHNfc2hhcmVkIC1hbmNob3IgdyAtZm9udCAkYmZvbnQKLQlwYWNrICRzaC5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkKLQotCXNldCB2byAiJHcudmlld29ubHkiCi0JZnJhbWUgJHZvCi0JY2hlY2tidXR0b24gJHZvLmJ1dHRvbiAtdGV4dCAiQWxsIENsaWVudHMgVmlld09ubHkiIFwKLQkJLXZhcmlhYmxlIHByb3BzX3ZpZXdvbmx5IC1hbmNob3IgdyAtZm9udCAkYmZvbnQKLQlwYWNrICR2by5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkKLQotCXNldCBjZiAiJHcuY29uZmlybSIKLQlmcmFtZSAkY2YKLQljaGVja2J1dHRvbiAkY2YuYnV0dG9uIC10ZXh0ICJBc2sgZm9yIENvbmZpcm1hdGlvbiIgXAotCQktdmFyaWFibGUgcHJvcHNfY29uZmlybSAtYW5jaG9yIHcgLWZvbnQgJGJmb250Ci0JcGFjayAkY2YuYnV0dG9uIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5Ci0KLQlzZXQgYWMgIiR3LmFjY2VwdCIKLQlmcmFtZSAkYWMKLQljaGVja2J1dHRvbiAkYWMuYnV0dG9uIC10ZXh0ICJBY2NlcHQgQ29ubmVjdGlvbnMiIFwKLQkJLXZhcmlhYmxlIHByb3BzX2FjY2VwdCAtYW5jaG9yIHcgLWZvbnQgJGJmb250Ci0JcGFjayAkYWMuYnV0dG9uIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5Ci0KLQlzZXQgcHggIjZtIgotCXBhY2sgJGIxIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5ICRwYWR5IC1wYWR4ICRweAotCXBhY2sgJGIyIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5ICRwYWR5IC1wYWR4ICRweAotCXBhY2sgJHZwIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5ICRwYWR5IC1wYWR4ICRweAotCXBhY2sgJHB3IC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5ICRwYWR5IC1wYWR4ICRweAotCXBhY2sgJHNiIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJGp2IC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJHpjIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJHNoIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJHZvIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJGNmIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCXBhY2sgJGFjIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweAotCi0JZ2xvYmFsIHNob3dfcHJvcHNfaW5zdHJ1Y3Rpb25zCi0JaWYgeyFbaW5mbyBleGlzdHMgc2hvd19wcm9wc19pbnN0cnVjdGlvbnNdfSB7Ci0JCXNldCBzaG93X3Byb3BzX2luc3RydWN0aW9ucyAxCi0JfQotCi0Jd20gd2l0aGRyYXcgLnByb3BzCi0KLQlzZXQgd2wgJHcKLQotCXBhY2sgJHdsIC1zaWRlIGxlZnQKLQotCWlmIHskbXNnICE9ICIifSB7Ci0JCXNldCB0dyBbdGV4dHdpZHRoICRtc2ddCi0JCXNldCB0aCBbdGV4dGhlaWdodCAkbXNnXQotCQlzZXQgdGggW2V4cHIgJHRoIC0gMV0KLQkJc2V0IG1zICIucHJvcHMubXNnIgotCQl0ZXh0ICRtcyAtZm9udCAkZmZvbnQgLXJlbGllZiByaWRnZSAtd2lkdGggJHR3IC1oZWlnaHQgJHRoCi0JCSRtcyBpbnNlcnQgMS4wICRtc2cKLQotCQlzZXQgc2kgIiR3bC5pbnN0cnVjdGlvbnMiCi0JCWZyYW1lICRzaQotCQljaGVja2J1dHRvbiAkc2kuYnV0dG9uIC10ZXh0ICJTaG93IEluc3RydWN0aW9ucyIgXAotCQkJLXZhcmlhYmxlIHNob3dfcHJvcHNfaW5zdHJ1Y3Rpb25zIC1hbmNob3IgdyAtZm9udCAkYmZvbnQgXAotCQkJLWNvbW1hbmQgInRvZ2dsZV9pbnN0cnVjdGlvbnMgJG1zICRwYWR5ICRweCIKLQotCQlwYWNrICRzaS5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkKLQkJcGFjayAkc2kgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMG0gLXBhZHggJHB4Ci0KLQkJaWYgeyRzaG93X3Byb3BzX2luc3RydWN0aW9uc30gewotCQkJcGFjayAkbXMgLXNpZGUgbGVmdCAtZmlsbCBib3RoCi0JCX0KLQotCQl1cGRhdGUKLQl9Ci0KLQotCWxhcHBlbmQgcHJvcHNfYnV0dG9ucyAkYWMuYnV0dG9uICRjZi5idXR0b24gJHZvLmJ1dHRvbiAkc2guYnV0dG9uICR6Yy5idXR0b24gJGp2LmJ1dHRvbiAkc2IuYnV0dG9uCi0KLQkKLQlzZXQgdyAucHJvcHMKLQl1cGRhdGUKLQl3bSByZXNpemFibGUgJHcgMSAwCi0JY2VudGVyX3dpbiAkdwotCXVwZGF0ZQotCi0JI3dtIG1pbnNpemUgJHcgW3dpbmZvIHdpZHRoICR3XSBbd2luZm8gaGVpZ2h0ICR3XQotCi0JdGt3YWl0IHdpbmRvdyAkdwotCXNldCBzaG93X3Byb3BzX2luc3RydWN0aW9ucyAwCi19Ci0KLXByb2MgdG9nZ2xlX2luc3RydWN0aW9ucyB7bXMgcGFkeSBweH0gewotCWdsb2JhbCBzaG93X3Byb3BzX2luc3RydWN0aW9ucwotCWlmIHskc2hvd19wcm9wc19pbnN0cnVjdGlvbnN9IHsKLQkJcGFjayAkbXMgLXNpZGUgbGVmdCAtZmlsbCBib3RoCi0JfSBlbHNlIHsKLQkJcGFjayBmb3JnZXQgJG1zCi0JfQotCWNhdGNoIHtwYWNrIC5wcm9wc30KLQl1cGRhdGUKLX0KLQotcHJvYyBkb19uZXdfY2xpZW50IHt9IHsKLQlnbG9iYWwgbmV3Y2xpZW50IGZmb250IGJmb250Ci0KLQlzZXQgdyAubmV3Y2xpZW50Ci0JY2F0Y2gge2Rlc3Ryb3kgJHd9Ci0JdG9wbGV2ZWwgJHcKLQlsYWJlbCAkdy5sIC10ZXh0ICJIb3N0bmFtZTogIiAtZm9udCAkYmZvbnQKLQlzZXQgbmV3Y2xpZW50ICIiCi0JZW50cnkgJHcuZSAtd2lkdGggMTYgLXRleHR2YXJpYWJsZSBuZXdjbGllbnQgLWZvbnQgJGJmb250IAotCWJ1dHRvbiAkdy5iIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR3IiAtZm9udCAkYmZvbnQKLQlidXR0b24gJHcuaCAtdGV4dCBIZWxwIC1jb21tYW5kICJtZW51X2hlbHAgTmV3Q2xpZW50IiAtZm9udCAkYmZvbnQKLQliaW5kICR3LmUgPFJldHVybj4gInVwZGF0ZTsgYWZ0ZXIgMTAwOyBkZXN0cm95ICR3IgotCi0Jd20gdGl0bGUgJHcgIk5ldyBDbGllbnQiCi0KLQlwYWNrICR3LmwgJHcuZSAkdy5oICR3LmIgLXNpZGUgbGVmdCAtcGFkeSAxbSAtcGFkeCAwLjVtCi0JZm9jdXMgJHcuZQotCWNlbnRlcl93aW4gJHcKLQl1cGRhdGUgCi0JCi0JdGt3YWl0IHdpbmRvdyAkdwotCi0JcmVnc3ViIC1hbGwge1t7fSgpfiEkJip8OyciYHt9PD5cW1xdXX0gJG5ld2NsaWVudCAiIiBuZXdjbGllbnQKLQkjJwotCWlmIHskbmV3Y2xpZW50ICE9ICIifSB7Ci0JCXB1c2hfbmV3X3ZhbHVlICJjb25uZWN0IiAiY29ubmVjdCIgIiRuZXdjbGllbnQiIDEKLQl9Ci19Ci0KLXByb2MgZG9fZGlzY29ubmVjdF9hbGwge30gewotCXB1c2hfbmV3X3ZhbHVlICJkaXNjb25uZWN0IiAiZGlzY29ubmVjdCIgImFsbCIgMQotfQotCi1wcm9jIGRvX2Rpc2Nvbm5lY3RfY2xpZW50IHtpZH0gewotCXB1c2hfbmV3X3ZhbHVlICJkaXNjb25uZWN0IiAiZGlzY29ubmVjdCIgIiRpZCIgMQotfQotCi1wcm9jIHBvcHVwX3Bvc3Qge219IHsKLQlnbG9iYWwgcG9wdXBfY2FzY2FkZV9wb3N0ZWQgY2xpZW50X2JhbGxvb24KLQlnbG9iYWwgY2xpZW50X2lkX2xpc3QKLQotCXNldCBwb3B1cF9jYXNjYWRlX3Bvc3RlZCAwCi0JCi0Jc2V0IHdkICIkbS5kaXNjb25uZWN0IgotCi0JaWYgeyFbd2luZm8gZXhpc3RzICR3ZF19IHsKLQkJcmV0dXJuCi0JfQotCi0JY2F0Y2ggeyR3ZCBkZWxldGUgMCBlbmR9Ci0KLQkkd2QgYWRkIGNvbW1hbmQgLWxhYmVsICJEaXNjb25uZWN0IGNsaWVudDoiCi0JJHdkIGFkZCBzZXBhcmF0b3IKLQkkd2QgYWRkIGNvbW1hbmQgLWxhYmVsICJBbGwgQ2xpZW50cyIgLWNvbW1hbmQgZG9fZGlzY29ubmVjdF9hbGwKLQotCWlmIHshW2luZm8gZXhpc3RzIGNsaWVudF9pZF9saXN0XX0gewotCQlyZXR1cm4KLQl9Ci0KLQlmb3JlYWNoIGNsaWVudCAkY2xpZW50X2lkX2xpc3QgewotCQlpZiB7JGNsaWVudCA9PSAiIn0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W3JlZ2V4cCB7XihbXjpdKik6KC4qKSR9ICRjbGllbnQgbWF0IGlkIGxhYl19IHsKLQkJCXNldCBuaWQgW2V4cHIgIiRpZCArIDAiXQotCQkJJHdkIGFkZCBjb21tYW5kIC1sYWJlbCAiJG5pZCAkbGFiIiBcCi0JCQkJLWNvbW1hbmQgImRvX2Rpc2Nvbm5lY3RfY2xpZW50ICRpZCIKLQkJfQotCX0KLX0KLQotcHJvYyBwbWVudSB7bSB4IHl9IHsKLQlpZiB7IVt3aW5mbyBleGlzdHMgJG1dfSB7Ci0JCXJldHVybgotCX0KLQlzZXQgeCBbZXhwciAkeC0xMF0KLQlzZXQgeSBbZXhwciAkeS0xMF0KLQkkbSBwb3N0ICR4ICR5Ci0JIyBYWFggbW9yZSBjYXJlIG5lZWRlZAotCWdyYWIgc2V0IC1nbG9iYWwgJG0KLX0KLQotcHJvYyBzZXRfY2xpZW50X2JhbGxvb24ge3N0cn0gewotCWdsb2JhbCBjbGllbnRfYmFsbG9vbiB2bmNfZGlzcGxheQotCWdsb2JhbCBjbGllbnRfaWRfbGlzdAotCi0Jc2V0IGNsaWVudF9pZF9saXN0IFtsaXN0XQotCQotCXNldCBjbGllbnRfYmFsbG9vbiAiJHZuY19kaXNwbGF5IgotCXNldCBjb3VudCAwCi0JcmVnc3ViIC1hbGwge14uKmFybz1jbGllbnRzOn0gJHN0ciAiIiBzdHIKLQlyZWdzdWIgLWFsbCB7YXJvPS4qJH0gJHN0ciAiIiBzdHIKLQlyZWdzdWIgLWFsbCB7YW5zPS4qJH0gJHN0ciAiIiBzdHIKLQlmb3JlYWNoIGNsaWVudCBbc3BsaXQgJHN0ciAiLCJdIHsKLQkJI3B1dHMgImNsaWVudDogJGNsaWVudCIKLQkJaWYgW3JlZ2V4cCB7XlsgCV0qJH0gJGNsaWVudF0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W3JlZ2V4cCB7XiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopJH0gXAotCQkgICAgJGNsaWVudCBtMCBtMSBtMiBtMyBtNCBtNSBtNiBtNyBtOCBtOV19IHsKLQkJCXNldCBpZCAgICAkbTEKLQkJCXNldCBuaWQgICBbZXhwciAiJG0xICsgMCJdCi0JCQlzZXQgaXAgICAgJG0yCi0JCQlzZXQgcG9ydCAgJG0zCi0JCQlzZXQgdXNlciAgJG00Ci0JCQlzZXQgdW5peCAgJG01Ci0JCQlpZiB7W3N0cmluZyBsZW5ndGggJHVzZXJdID49IDI0fSB7Ci0JCQkJIyB3ZWlyZCBpZGVudGQgaGFzaC4uLgotCQkJCXNldCB1c2VyIFtzdHJpbmcgcmFuZ2UgJHVzZXIgMCA4XQotCQkJCXNldCB1c2VyICIke3VzZXJ9Li4uIgotCQkJfQotCQkJaWYgeyR1bml4ICE9ICIiICYmICR1bml4ICE9ICJub25lIn0gewotCQkJCXNldCB1c2VyICR1bml4Ci0JCQl9Ci0JCQlzZXQgaG9zdCAgJG02Ci0JCQlzZXQgaW5wdXQgJG03Ci0JCQlzZXQgdm8gICAgJG04Ci0JCQlzZXQgbHRpbWUgJG05Ci0JCQlpZiBbcmVnZXhwIHteWyAJXSokfSAkaG9zdF0gewotCQkJCXNldCBob3N0ICRpcAotCQkJfQotCQkJc2V0IGNsaWVudF9iYWxsb29uICIke2NsaWVudF9iYWxsb29ufVxuJG5pZCAkdXNlclxAJGhvc3QiCi0JCQlpZiB7JHZvID09ICIxIn0gewotCQkJCXNldCBjbGllbnRfYmFsbG9vbiAiJHtjbGllbnRfYmFsbG9vbn0gLSB2aWV3IgotCQkJCWxhcHBlbmQgY2xpZW50X2lkX2xpc3QgIiRpZDokdXNlclxAJGhvc3QgLSB2aWV3IgotCQkJfSBlbHNlIHsKLQkJCQlzZXQgY2xpZW50X2JhbGxvb24gIiR7Y2xpZW50X2JhbGxvb259IC0gZnVsbCIKLQkJCQlsYXBwZW5kIGNsaWVudF9pZF9saXN0ICIkaWQ6JHVzZXJcQCRob3N0IC0gZnVsbCIKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldCBpIFtleHByICRjb3VudCsxXQotCQkJaWYgeyRpID09IDF9IHsKLQkJCQlzZXQgY2xpZW50X2JhbGxvb24gIiR7Y2xpZW50X2JhbGxvb259XG51bmtub3duLWhvc3QkaSIKLQkJCX0KLQkJfQotCQlpbmNyIGNvdW50Ci0JfQotCWlmIHskY291bnQgPT0gMH0gewotCQlzZXQgY2xpZW50X2JhbGxvb24gIiR7Y2xpZW50X2JhbGxvb259XG5ObyBjb25uZWN0aW9ucy4iCi0JfQotCWljb25fd2luX2NmZyAkY291bnQKLX0KLQotcHJvYyByZWFkX2NsaWVudF9pbmZvIHtjaGFubmVsfSB7Ci0JZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZSBjbGllbnRfc3RyIGNsaWVudF9pbmZvX3JlYWQKLQlnbG9iYWwgcmVhZF9jbGllbnRfaW5mb19sb2NrCi0JZ2xvYmFsIHJlYWRfY2xpZW50cwotCXNldCBkYiAwCi0KLQlzZXQgcmVhZF9jbGllbnRzIDAKLQotCWlmIHshW2luZm8gZXhpc3RzIHJlYWRfY2xpZW50X2luZm9fbG9ja119IHsKLQkJc2V0IHJlYWRfY2xpZW50X2luZm9fbG9jayAwCi0JfQotCi0JaWYgeyRjaGFubmVsICE9ICIifSB7Ci0KLQkJaWYgeyRyZWFkX2NsaWVudF9pbmZvX2xvY2t9IHsKLQkJCXJldHVybgotCQl9Ci0JCXNldCByZWFkX2NsaWVudF9pbmZvX2xvY2sgMQotCQlhZnRlciAxMDAKLQkJc2V0IHN0ciAiIgotCQlzZXQgY291bnQgW2dldHMgJGNoYW5uZWwgc3RyXQotCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgInJlYWRfY2xpZW50X2luZm8tJGNoYW5uZWw6ICRzdHIifQotCi0JCWlmIHskY291bnQgPT0gLTEgfHwgW2VvZiAkY2hhbm5lbF19IHsKLQkJCWNsb3NlICRjaGFubmVsCi0JCQljYXRjaCB7ZmlsZSBkZWxldGUgJHgxMXZuY19jbGllbnRfZmlsZX0KLQkJCXNldCByZWFkX2NsaWVudF9pbmZvX2xvY2sgMAotCQkJY2xlYW5faWNvbl9leGl0Ci0JCX0KLQkJaWYgeyRjb3VudCA+IDAgJiYgIVtyZWdleHAge15bIAldKiR9ICRzdHJdfSB7Ci0JCQlzZXQgY2xpZW50X2luZm9fcmVhZCAxCi0JCQlpZiB7JHN0ciA9PSAicXVpdCJ9IHsKLQkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJHgxMXZuY19jbGllbnRfZmlsZX0KLQkJCQlzZXQgcmVhZF9jbGllbnRfaW5mb19sb2NrIDAKLQkJCQljbGVhbl9pY29uX2V4aXQKLQkJCX0gZWxzZWlmIHskc3RyID09ICJza2lwIn0gewotCQkJCTsKLQkJCX0gZWxzZWlmIFtyZWdleHAge15jbGllbnRzOn0gJHN0cl0gewotCQkJCXJlZ3N1YiB7XmNsaWVudHM6fSAkc3RyICIiIHN0cgotCQkJCXNldCByZWFkX2NsaWVudHMgMQotCQkJCWlmIHskc3RyID09ICJub25lIn0gewotCQkJCQlzZXQgc3RyICIiCi0JCQkJfQotCQkJCXVwZGF0ZV9jbGllbnRzX21lbnUgJHN0cgotCQkJCXNldCBjbGllbnRfc3RyICRzdHIKLQkJCQlzZXRfY2xpZW50X2JhbGxvb24gJHN0cgotCQkJfQotCQl9Ci0JCXNldCByZWFkX2NsaWVudF9pbmZvX2xvY2sgMAotCX0KLX0KLQotcHJvYyBjaGVja19zZXRfdm5jX2Rpc3BsYXkge30gewotCQotCWdsb2JhbCByZWFkX2NsaWVudHMgY2hlY2tfc2V0X3ZuY19kaXNwbGF5X2RvbmUKLQotCWlmIHtbaW5mbyBleGlzdHMgY2hlY2tfc2V0X3ZuY19kaXNwbGF5X2RvbmVdfSB7Ci0JCXJldHVybgotCX0KLQlpZiB7W2luZm8gZXhpc3RzIHJlYWRfY2xpZW50c119IHsKLQkJaWYgeyRyZWFkX2NsaWVudHN9IHsKLQkJCWFmdGVyIDI1MAotCQkJcXVlcnlfYWxsCi0JCQlnbG9iYWwgY2xpZW50X3N0cgotCQkJc2V0X2NsaWVudF9iYWxsb29uICRjbGllbnRfc3RyCi0JCQlzZXQgY2hlY2tfc2V0X3ZuY19kaXNwbGF5X2RvbmUgMQotCQl9Ci0JfQotfQotCi1wcm9jIHJlYWRfY2xpZW50X3RhaWwge30gewotCWdsb2JhbCBjbGllbnRfdGFpbAotCi0JaWYgeyRjbGllbnRfdGFpbCAhPSAiIn0gewotCQlyZWFkX2NsaWVudF9pbmZvICRjbGllbnRfdGFpbAotCQljaGVja19zZXRfdm5jX2Rpc3BsYXkKLQl9Ci19Ci0KLXByb2MgcmVhZF9jbGllbnRfc29jayB7fSB7Ci0JZ2xvYmFsIGNsaWVudF9zb2NrCi0KLQlpZiB7JGNsaWVudF9zb2NrICE9ICIifSB7Ci0JCXJlYWRfY2xpZW50X2luZm8gJGNsaWVudF9zb2NrCi0JCWNoZWNrX3NldF92bmNfZGlzcGxheQotCX0KLX0KLQotcHJvYyBzaG93X2NsaWVudF9iYWxsb29uIHt9IHsKLQlnbG9iYWwgaWNvbl9tb2RlIGljb25fd2luIHByb3BzX3dpbiBmdWxsX3dpbgotCWdsb2JhbCBjbGllbnRfYmFsbG9vbiBmZm9udCBjb25uZWN0ZWRfdG9feDExdm5jCi0KLQlzZXQgbm9pbmZvICJ0a3gxMXZuYzogbm8gY2xpZW50IGluZm9ybWF0aW9uIgotCXNldCBub2luZm8gIiRub2luZm9cbmF2YWlsYWJsZSBmcm9tIHgxMXZuYyAuLi4iCi0JaWYgIVtpbmZvIGV4aXN0cyBjbGllbnRfYmFsbG9vbl0gewotCQlzZXQgY2xpZW50X2JhbGxvb24gJG5vaW5mbwotCX0KLQlpZiB7JGNsaWVudF9iYWxsb29uID09ICIifSB7Ci0JCXNldCBjbGllbnRfYmFsbG9vbiAkbm9pbmZvCi0JfQotCWlmIHshIFtpbmZvIGV4aXN0cyBpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpY29uX3dpbiA9PSAiIn0gewotCQlyZXR1cm4KLQl9IGVsc2VpZiB7ISBbd2luZm8gZXhpc3RzICRpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IHggW2V4cHIgW3dpbmZvIHJvb3R4ICRpY29uX3dpbl0gKyAoW3dpbmZvIHdpZHRoICRpY29uX3dpbl0vMildCi0Jc2V0IHkgW2V4cHIgW3dpbmZvIHJvb3R5ICRpY29uX3dpbl0gKyBbd2luZm8gaGVpZ2h0ICRpY29uX3dpbl0gKyA0XQotCi0Jc2V0IGluZm90ZXh0ICRjbGllbnRfYmFsbG9vbgotCWlmIHshJGNvbm5lY3RlZF90b194MTF2bmN9IHsKLQkJc2V0IGluZm90ZXh0ICJOb3QgY3VycmVudGx5IGF0dGFjaGVkIHRvIHgxMXZuY1xuTGFzdCBhdmFpbGFibGUgaW5mbzpcbiRpbmZvdGV4dCIKLQl9Ci0KLQlzZXQgdyAuY2xpZW50X2JhbGxvb24KLQljYXRjaCB7ZGVzdHJveSAkd30KLQl0b3BsZXZlbCAkdyAtYmcgYmxhY2sgLXNjcmVlbiBbd2luZm8gc2NyZWVuICRpY29uX3dpbl0KLQl3bSBvdmVycmlkZXJlZGlyZWN0ICR3IDEKLQlsYWJlbCAkdy5sIC10ZXh0ICIkaW5mb3RleHQiIC1yZWxpZWYgZmxhdCAtYmcgIiNmZmZmYWEiIC1mZyBibGFjayBcCi0JCS1wYWR4IDIgLXBhZHkgMCAtYW5jaG9yIHcgLWp1c3RpZnkgbGVmdCAtZm9udCAkZmZvbnQKLQlwYWNrICR3LmwgLXNpZGUgbGVmdCAtcGFkeCAxIC1wYWR5IDEKLQotCXNldCB3MiBbd2luZm8gcmVxd2lkdGggICR3LmxdCi0Jc2V0IGgyIFt3aW5mbyByZXFoZWlnaHQgJHcubF0KLQotCXNldCBXIFt3aW5mbyBzY3JlZW53aWR0aCAgJHddCi0Jc2V0IEggW3dpbmZvIHNjcmVlbmhlaWdodCAkd10KLQotCWlmIHtbZXhwciAkeCskdzJdID4gJFd9IHsKLQkJc2V0IHczIFt3aW5mbyB3aWR0aCAkaWNvbl93aW5dCi0JCXNldCB4IFtleHByICIkVyAtICR3MiAtICR3MyAtIDQiXSAKLQl9Ci0JaWYge1tleHByICR5KyRoMl0gPiAkSH0gewotCQlzZXQgaDMgW3dpbmZvIGhlaWdodCAkaWNvbl93aW5dCi0JCXNldCB5IFtleHByICIkSCAtICRoMiAtICRoMyAtIDQiXSAKLQl9Ci0KLQl3bSBnZW9tZXRyeSAkdyArJHt4fSske3l9Ci19Ci0KLXByb2Mga2lsbF9jbGllbnRfYmFsbG9vbiB7fSB7Ci0JZ2xvYmFsIGNsaWVudF9iYWxsb29uX2lkIGNsaWVudF9iYWxsb29uX3dpbgotCWlmIFtpbmZvIGV4aXN0cyBjbGllbnRfYmFsbG9vbl9pZF0gewotCQljYXRjaCB7YWZ0ZXIgY2FuY2VsICRjbGllbnRfYmFsbG9vbl9pZH0KLQl9Ci0JaWYgW3dpbmZvIGV4aXN0cyAuY2xpZW50X2JhbGxvb25dIHsKLQkJZGVzdHJveSAuY2xpZW50X2JhbGxvb24KLQl9Ci19Ci0KLXByb2MgaWNvbl93aW5fY2ZnIHtjbGllbnRzfSB7Ci0JZ2xvYmFsIGljb25fd2luIGNsaWVudF90YWlsIGNsaWVudF9zb2NrIGNsaWVudF9pbmZvX3JlYWQKLQotCWlmIHshIFtpbmZvIGV4aXN0cyBpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpY29uX3dpbiA9PSAiIn0gewotCQlyZXR1cm4KLQl9IGVsc2VpZiB7ISBbd2luZm8gZXhpc3RzICRpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfQotCWlmIHskY2xpZW50cyA+IDB9IHsKLQkJJGljb25fd2luIGNvbmZpZ3VyZSAtYmcgYmxhY2sgLWZnIHdoaXRlCi0JfSBlbHNlIHsKLQkJJGljb25fd2luIGNvbmZpZ3VyZSAtYmcgd2hpdGUgLWZnIGJsYWNrCi0JfQotCi0JaWYgeyRjbGllbnRfdGFpbCA9PSAiIiB8fCAhJGNsaWVudF9pbmZvX3JlYWR9IHsKLQkJaWYgeyRjbGllbnRfc29jayA9PSAiIn0gewotCQkJJGljb25fd2luIGNvbmZpZ3VyZSAtZmcgcmVkCi0JCX0KLQl9Ci19Ci0KLXByb2Mgc2VydmVyX2FjY2VwdCB7c29jayBhZGRyIHBvcnR9IHsKLQlnbG9iYWwgc29ja2V0X2Nvb2tpZSBzZXJ2ZXIgc29ja2V0X2dvdF9jYWxsYmFjawotCWdsb2JhbCBjbGllbnRfdGFpbCBjbGllbnRfc29jawotCXNldCBkYiAwCi0KLQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgInNvY2s9JHNvY2sgYWRkcj0kYWRkciBwb3J0PSRwb3J0In0KLQotCXVwZGF0ZTsgdXBkYXRlIGlkbGV0YXNrcwotCWFmdGVyIDUwCi0JdXBkYXRlOyB1cGRhdGUgaWRsZXRhc2tzCi0Jc2V0IGNvdW50IFtnZXRzICRzb2NrIHN0cl0KLQotCWlmIHskY291bnQgPj0gMH0gewotCQlzZXQgc3RyIFtzdHJpbmcgdHJpbSAkc3RyXQotCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgInNlcnZlcl9hY2NlcHQ6IFwiJHN0clwiIn0KLQkJaWYgeyRzdHIgPT0gIkNPT0tJRTokc29ja2V0X2Nvb2tpZSJ9IHsKLQkJCXNldCBjbGllbnRfc29jayAkc29jawotCQkJaWYgeyRkYn0ge3B1dHMgc3RkZXJyICJjb29raWUgbWF0Y2hlZC4gJGNsaWVudF9zb2NrIn0KLQkJfSBlbHNlIHsKLQkJCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciAiY29va2llIE5PIG1hdGNoZWQuIn0KLQkJfQotCX0KLQljYXRjaCB7Y2xvc2UgJHNlcnZlcn0KLQlzZXQgc29ja2V0X2dvdF9jYWxsYmFjayAxCi0JaWYgeyRkYn0ge3B1dHMgc3RkZXJyICJzb2NrZXRfZ290X2NhbGxiYWNrICRzb2NrZXRfZ290X2NhbGxiYWNrIn0KLX0KLQotcHJvYyB0cnlfY2xpZW50X2luZm9fc29jayB7fSB7Ci0JZ2xvYmFsIHNvY2tldF9jb29raWUgc2VydmVyIHNvY2tldF9nb3RfY2FsbGJhY2sKLQlnbG9iYWwgeDExdm5jX3N0YXJ0ZWQgeDExdm5jX3hkaXNwbGF5IGhvc3RuYW1lIGNsaWVudF9zb2NrCi0JZ2xvYmFsIHgxMXZuY194ZGlzcGxheTAgbWVudV92YXIKLQotCXNldCBkYiAwCi0jZHRpbWUgdDEKLQlzZXQgc3RhcnQgMTMwMzcKLQlzZXQgdHJpZXMgMTAwCi0Jc2V0IHNvY2tldF9nb3RfY2FsbGJhY2sgMAotCi0Jc2V0IHhkICR4MTF2bmNfeGRpc3BsYXkKLQlpZiB7JHhkID09ICIiICYmICR4MTF2bmNfeGRpc3BsYXkwICE9ICIifSB7Ci0JCXNldCB4ZCAkeDExdm5jX3hkaXNwbGF5MAotCX0KLQlpZiB7JHhkID09ICIiICYmIFtpbmZvIGV4aXN0cyBtZW51X3ZhcihkaXNwbGF5KV19IHsKLQkJc2V0IHhkICRtZW51X3ZhcihkaXNwbGF5KQotCX0KLQotCXNldCBteWFkZHIgIiIKLQlyZWdzdWIge1wuLiokfSAkaG9zdG5hbWUgIiIgc2hvc3QKLQlpZiB7JHgxMXZuY19zdGFydGVkfSB7Ci0JCXNldCBteWFkZHIgIjEyNy4wLjAuMSIKLQl9IGVsc2VpZiB7JHhkICE9ICIifSB7Ci0JCWlmIHtbcmVnZXhwIHteOn0gJHhkXX0gewotCQkJc2V0IG15YWRkciAiMTI3LjAuMC4xIgotCQl9IGVsc2VpZiB7W3JlZ2V4cCAtbm9jYXNlICJeJHNob3N0IiAkeGRdfSB7Ci0JCQlzZXQgbXlhZGRyICIxMjcuMC4wLjEiCi0JCX0gZWxzZWlmIHtbcmVnZXhwIC1ub2Nhc2UgIl5sb2NhbGhvc3QiICR4ZF19IHsKLQkJCXNldCBteWFkZHIgIjEyNy4wLjAuMSIKLQkJfSBlbHNlIHsKLQkJCXNldCBteWFkZHIgJGhvc3RuYW1lCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgbXlhZGRyICRob3N0bmFtZQotCX0KLQkKLQlmb3Ige3NldCBpIDB9IHskaSA8PSAkdHJpZXN9IHtpbmNyIGl9IHsKLQkJc2V0IHBvcnQgW2V4cHIgJHN0YXJ0ICsgJGldCi0JCXNldCBzZXJ2ZXIgW3NvY2tldCAtc2VydmVyIHNlcnZlcl9hY2NlcHQgLW15YWRkciAkbXlhZGRyICRwb3J0XQotCQlpZiB7JHNlcnZlciA9PSAiIn0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7W2VvZiAkc2VydmVyXX0gewotCQkJY29udGludWUKLQkJfQotCQlzZXQgZXJyICIiCi0JCWNhdGNoIHtzZXQgZXJyIFtmY29uZmlndXJlICRzZXJ2ZXIgLWVycm9yXX0KLQkJI3B1dHMgImVycjogJHNlcnZlcjogJGVyciIKLQkJaWYgeyRlcnIgPT0gIiJ9IHsKLQkJCWJyZWFrCi0JCX0KLQl9Ci0JaWYgeyRzZXJ2ZXIgPT0gIiJ9IHsKLQkJYXBwZW5kX3RleHQgInRyeV9jbGllbnRfaW5mb19zb2NrOiBzZXJ2ZXIgc29ja2V0IGZhaWxlZC5cbiIKLQkJcmV0dXJuCi0JfQotCWlmIHshICR4MTF2bmNfc3RhcnRlZH0gewotCQlydW5fcmVtb3RlX2NtZCBbbGlzdCAiLW5vc3luYyIgIi1SIiAibm9vcCJdCi0JCWlmIHskZGJ9IHtkdGltZSBBfQotCQlhZnRlciAyNTAKLQkJaWYgeyRkYn0ge2R0aW1lIEF9Ci0JfQotCi0JIyBzZXQgdGhlIGNvb2tpZSB0byBzb21lIG9ic2N1cmVkIHJhbmRvbW5lc3MKLQlzZXQgc29ja2V0X2Nvb2tpZSBbY2xvY2sgY2xpY2tzXQotCXNldCByIFtleHByIHJhbmQoKV0KLQlpZiB7JHIgIT0gIiJ9IHsKLQkJYXBwZW5kIHNvY2tldF9jb29raWUgJHIKLQl9Ci0Jc2V0IHIgIiIKLQljYXRjaCB7c2V0IHIgW3dpbmZvIGlkIC5dfQotCWlmIHskciAhPSAiIn0gewotCQlhcHBlbmQgc29ja2V0X2Nvb2tpZSAkcgotCX0KLQlpZiB7W3JlZ2V4cCB7KFswLTldKShbMC05XSkkfSBbY2xvY2sgY2xpY2tzXSBtIG0xIG0yXX0gewotCQlyZWdzdWIgLWFsbCB7XC59ICRzb2NrZXRfY29va2llICRtMSBzb2NrZXRfY29va2llCi0JCXJlZ3N1YiAtYWxsIHt4fSAgJHNvY2tldF9jb29raWUgJG0yIHNvY2tldF9jb29raWUKLQl9Ci0JcnVuX3JlbW90ZV9jbWQgW2xpc3QgIi1ub3N5bmMiICItUiIgXAotCQkiY2xpZW50X2luZm9fc29jazokbXlhZGRyOiRwb3J0OiRzb2NrZXRfY29va2llIl0KLSNkdGltZSB0MgotCWlmIHskZGJ9IHtwdXRzICJjbGllbnRfaW5mb19zb2NrOiRteWFkZHI6JHBvcnQ6JHNvY2tldF9jb29raWUifQotCWZvciB7c2V0IGkgMH0geyRpIDwgMTB9IHtpbmNyIGl9IHsKLQkJYWZ0ZXIgNTAKLQkJdXBkYXRlOyB1cGRhdGUgaWRsZXRhc2tzCi0jZHRpbWUgYWEKLQkJaWYgeyRzb2NrZXRfZ290X2NhbGxiYWNrICE9IDB9IHsKLSNwdXRzICJicmVhay0iCi0JCQlicmVhawotCQl9Ci0JfQotI2R0aW1lIHQzCi0KLQlzZXQgYWZ0aWQgIiIKLQlpZiB7JHNvY2tldF9nb3RfY2FsbGJhY2sgPT0gMH0gewotCQlzZXQgYWZ0aWQgW2FmdGVyIDEwMDAwIHtzZXQgc29ja2V0X2dvdF9jYWxsYmFjayAyfV0KLQkJdGt3YWl0IHZhcmlhYmxlIHNvY2tldF9nb3RfY2FsbGJhY2sKLQl9Ci0KLQlpZiB7JGFmdGlkICE9ICIifSB7Ci0JCWNhdGNoIHthZnRlciBjYW5jZWwgJGFmdGlkfQotCX0KLQotCWlmIHskc29ja2V0X2dvdF9jYWxsYmFjayAhPSAxfSB7Ci0JCXB1dHMgc3RkZXJyICJ0cnlfY2xpZW50X2luZm9fc29jayBmYWlsZWQ6IG5vIGNhbGxiYWNrXG4iCi0JCWNhdGNoIHtjbG9zZSAkc2VydmVyfQotCX0gZWxzZSB7Ci0JCXNldHVwX2NsaWVudF9zb2NrIDEKLQl9Ci0jZHRpbWUgdDQKLX0KLQotcHJvYyBzZXRfaWNvbl9sYWJlbCB7fSB7Ci0JZ2xvYmFsIGljb25fd2luCi0KLQlzZXQgbGFiIFtnZXRfaWNvbl9sYWJlbF0KLQotCWlmIHshIFtpbmZvIGV4aXN0cyBpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfSBlbHNlaWYgeyRpY29uX3dpbiA9PSAiIn0gewotCQlyZXR1cm4KLQl9IGVsc2VpZiB7ISBbd2luZm8gZXhpc3RzICRpY29uX3dpbl19IHsKLQkJcmV0dXJuCi0JfQotCQotCWlmIHtbaW5mbyBleGlzdHMgaWNvbl93aW5dfSB7Ci0JCSRpY29uX3dpbiBjb25maWd1cmUgLXRleHQgJGxhYgotCX0KLX0KLQotcHJvYyBnZXRfaWNvbl9sYWJlbCB7e3NldCAwfX0gewotCWdsb2JhbCBpY29uX21pbmltYWwgCi0KLQlzZXQgbGFiMCAieDExXG52bmMiCi0JCi0JaWYgeyRpY29uX21pbmltYWx9IHsKLQkJc2V0IGxhYiBbZ2V0X3ZuY19kaXNwbGF5X251bWJlcl0KLQkJaWYgeyRsYWIgIT0gIm5vbmUifSB7Ci0JCQkjc2V0IGxhYiAiICA6JGxhYiIKLQkJCXNldCBsYWIgIjokbGFiIgotCQl9IGVsc2UgewotCQkJc2V0IGxhYiAiLSIKLQkJfQotCX0gZWxzZSB7Ci0JCXNldCBsYWIgJGxhYjAKLQl9Ci0JcmV0dXJuICRsYWIKLX0KLQotIyBjdXJyZW50bHkgdW51c2VkCi1wcm9jIGxtZW51IHttZW51fSB7Ci0JZ2xvYmFsIHBvcHVwX2Nhc2NhZGVfcG9zdGVkCi0JZ2xvYmFsIGxlZnRfaWNvbndpbl9tZW51Ci0Jc2V0IGxlZnRfaWNvbndpbl9tZW51IDEKLQlhZnRlciAxMDAKLQl1cGRhdGUKLQlpZiB7ISRwb3B1cF9jYXNjYWRlX3Bvc3RlZCAmJiAkbGVmdF9pY29ud2luX21lbnV9IHsKLQkJZm9yIHtzZXQgaSAwfSB7JGkgPCAzfSB7aW5jciBpfSB7Ci0JCQlhZnRlciAxMDAKLQkJCXVwZGF0ZQotCQl9Ci0JCWlmIHshJHBvcHVwX2Nhc2NhZGVfcG9zdGVkICYmICRsZWZ0X2ljb253aW5fbWVudX0gewotCQkJJG1lbnUgdW5wb3N0Ci0JCQlyZXR1cm4KLQkJfQotCX0KLQkjIGtsdWRnZSBmb3IgV2luZG93VmlldwotCWlmIHskcG9wdXBfY2FzY2FkZV9wb3N0ZWR9IHsKLQkJZm9jdXMgJG1lbnUKLQl9Ci19Ci0KLXByb2Mgb2xkX2JhbGxvb24ge30gewotCWdsb2JhbCBjbGllbnRfc3RyIHNhdmVkX2NsaWVudHNfc3RyCi0Jc2V0IHN0ciAiIgotCWlmIHtbaW5mbyBleGlzdHMgY2xpZW50X3N0cl19IHsKLQkJaWYgeyRjbGllbnRfc3RyICE9ICIifSB7Ci0JCQlzZXQgc3RyICRjbGllbnRfc3RyCi0JCX0KLQl9Ci0JaWYgeyRzdHIgPT0gIiJ9IHsKLQkJaWYge1tpbmZvIGV4aXN0cyBzYXZlZF9jbGllbnRzX3N0cl19IHsKLQkJCXNldCBzdHIgJHNhdmVkX2NsaWVudHNfc3RyCi0JCX0KLQl9Ci0JaWYgeyRzdHIgIT0gIiJ9IHsKLQkJc2V0X2NsaWVudF9iYWxsb29uICRzdHIKLQl9Ci19Ci0KLXByb2MgZ2V0X2N1c3RvbV9tZW51X2l0ZW1zIHt9IHsKLQlnbG9iYWwgZW52IGN1c3RvbV9sYXN0X3JlYWQKLQotCWlmIHshW2luZm8gZXhpc3RzIGN1c3RvbV9sYXN0X3JlYWRdfSB7Ci0JCXNldCBjdXN0b21fbGFzdF9yZWFkIDAKLQl9Ci0JaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0NVU1RPTV9HVUkpXX0gewotCQlzZXQgY3VzdG9tICIkZW52KFgxMVZOQ19DVVNUT01fR1VJKSIKLQl9IGVsc2VpZiB7IVtpbmZvIGV4aXN0cyBlbnYoSE9NRSldfSB7Ci0JCXJldHVybiBbbGlzdCAibm9uZSJdCi0JfSBlbHNlIHsKLQkJc2V0IGN1c3RvbSAiJGVudihIT01FKS8ueDExdm5jLmd1aSIKLQl9Ci0JaWYgeyFbZmlsZSBleGlzdHMgJGN1c3RvbV19IHsKLQkJcmV0dXJuIFtsaXN0ICJub25lIl0KLQl9Ci0KLSMJaWYge1tmaWxlIG10aW1lICRjdXN0b21dIDw9ICRjdXN0b21fbGFzdF9yZWFkfSB7Ci0jCQlyZXR1cm4gW2xpc3QgIm5vY2hhbmdlIl0KLSMJfQotCi0Jc2V0IGluICIiCi0JY2F0Y2gge3NldCBpbiBbb3BlbiAkY3VzdG9tICJyIl19IAotCWlmIHskaW4gPT0gIiJ9IHsKLQkJcmV0dXJuIFtsaXN0ICJub25lIl0KLQl9Ci0KLQlzZXQgY3VzdG9tX2xhc3RfcmVhZCBbY2xvY2sgc2Vjb25kc10KLQotCXNldCBjb3VudCAwCi0Jd2hpbGUge1tnZXRzICRpbiBsaW5lXSA+IC0xfSB7Ci0JCWlmIHtbcmVnZXhwIHteWyBcdF0qI30gJGxpbmVdfSB7Ci0JCQljb250aW51ZQotCQl9Ci0JCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkJaWYgeyRsaW5lICE9ICIifSB7Ci0JCQlsYXBwZW5kIGl0ZW1zICRsaW5lCi0JCQlpbmNyIGNvdW50Ci0JCX0KLQl9Ci0JY2xvc2UgJGluCi0JCi0JaWYgeyRjb3VudCA+IDB9IHsKLQkJcmV0dXJuICRpdGVtcwotCX0gZWxzZSB7Ci0JCXJldHVybiBbbGlzdCAibm9uZSJdCi0JfQotfQotCi1wcm9jIG1ha2VfY3VzdG9tX21lbnUge21lbnUgZm9udH0gewotCXNldCBpdGVtcyBbZ2V0X2N1c3RvbV9tZW51X2l0ZW1zXQotCXNldCBpMCBbbGluZGV4ICRpdGVtcyAwXQotCWNhdGNoIHskbWVudSBkZWxldGUgMCBlbmR9Ci0JaWYgeyRpMCAhPSAibm9uZSJ9IHsKLQkJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJGZvbnQgLWxhYmVsICJDdXN0b20gaXRlbXM6IgotCQkkbWVudSBhZGQgc2VwYXJhdG9yCi0JCWZvcmVhY2ggaXRlbSAkaXRlbXMgewotCQkJaWYgeyRpdGVtID09ICJzZXAiIHx8ICRpdGVtID09ICJzZXBhcmF0b3IifSB7Ci0JCQkJJG1lbnUgYWRkIHNlcGFyYXRvcgotCQkJCWNvbnRpbnVlCi0JCQl9Ci0JCQlpZiB7W3JlZ2V4cCB7XmFjdGlvbjooLiopJH0gJGl0ZW0gbSBhY3Rpb25dfSB7Ci0JCQkJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJGZvbnQgLWxhYmVsICIkYWN0aW9uIiBcCi0JCQkJICAgIC1jb21tYW5kICJkb192YXIgJGFjdGlvbiIKLQkJCQljb250aW51ZQotCQkJfQotCQkJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJGZvbnQgLWxhYmVsICIkaXRlbSIgXAotCQkgCSAgICAtY29tbWFuZCAicnVuX3JlbW90ZV9jbWQgXFtsaXN0IFwiLVJcIiBcIiRpdGVtXCJcXSIKLQkJfQotCX0KLX0KLQotcHJvYyBtYWtlX2ljb24ge30gewotCWdsb2JhbCBpY29uX21vZGUgaWNvbl9lbWJlZF9pZCBpY29uX3dpbiBwcm9wc193aW4gZnVsbF93aW4KLQlnbG9iYWwgdHJheV9lbWJlZCB0cmF5X3J1bm5pbmcgZW52Ci0JZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZSBjbGllbnRfdGFpbCBjbGllbnRfc29jayBjbGllbnRfc3RyIHNhdmVkX2NsaWVudHNfc3RyCi0JZ2xvYmFsIGNsaWVudF9iYWxsb29uX2lkCi0JZ2xvYmFsIGJmb250IHNmb250IHNuZm9udCBmZm9udAotCWdsb2JhbCBpY29uX21pbmltYWwgZ3VpX3N0YXJ0X21vZGUKLQlnbG9iYWwgcG9wdXBfY2FzY2FkZV9wb3N0ZWQgbWVudV92YXIgeDExdm5jX2d1aV9nZW9tCi0Jc2V0IG1pbl94IDI0Ci0Jc2V0IG1pbl95IDI0Ci0JCi0Jc2V0IGZvbnQgJGJmb250Ci0Jc2V0IG1mb250ICRmb250Ci0KLQlpZiB7JHRyYXlfZW1iZWR9IHsKLQkJc2V0IGZvbnQgJHNmb250Ci0JCXNldCBtZm9udCAkc25mb250Ci0JfQotCWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX0ZPTlQpXX0gewotCQlzZXQgZm9udCAkZW52KFgxMVZOQ19JQ09OX0ZPTlQpCi0JfQotCWlmIHtbcmVnZXhwIHsoWzAtOV1bMC05XSopeChbMC05XVswLTldKil9ICR4MTF2bmNfZ3VpX2dlb20gbSBteCBteV19IHsKLQkJaWYgeyRteCA8ICRtaW5feH0gewotCQkJc2V0IG1pbl94ICRteAotCQl9Ci0JCWlmIHskbXkgPCAkbWluX3l9IHsKLQkJCXNldCBtaW5feSAkbXkKLQkJfQotCX0KLQl3bSBtaW5zaXplIC4gJG1pbl94ICRtaW5feQotCi0JaWYgeyR0cmF5X2VtYmVkICYmICR0cmF5X3J1bm5pbmd9IHsKLQkJd20gd2l0aGRyYXcgLgotCX0KLQotCXNldCBsIC5pY29uCi0Jc2V0IGljb25fd2luICRsCi0JY2F0Y2ggZGVzdHJveSB7JGljb25fd2lufQotCWlmIHskaWNvbl9taW5pbWFsfSB7Ci0JCXNldCBidyAxCi0JfSBlbHNlIHsKLQkJc2V0IGJ3IDUKLQl9Ci0Jc2V0IGxhYiBbZ2V0X2ljb25fbGFiZWxdCi0JbGFiZWwgJGwgLXRleHQgJGxhYiAtYm9yZGVyd2lkdGggJGJ3IC1mb250ICRmb250Ci0JaWNvbl93aW5fY2ZnIDAKLQotCi0Jc2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDAKLQlwYWNrICRsIC1maWxsIGJvdGggLWV4cGFuZCAxCi0Jc2V0IG1lbnUgIiRsLm1lbnUiCi0JbWVudSAkbWVudSAtdGVhcm9mZiAwIC1wb3N0Y29tbWFuZCAicG9wdXBfcG9zdCAkbWVudSIKLQkkbWVudSBhZGQgY29tbWFuZCAtZm9udCAkbWZvbnQgLWxhYmVsICJQcm9wZXJ0aWVzIiAtY29tbWFuZCBkb19wcm9wcwotCSRtZW51IGFkZCBjb21tYW5kIC1mb250ICRtZm9udCAtbGFiZWwgIkhlbHAiIC1jb21tYW5kICJtZW51X2hlbHAgVHJheSIKLQkkbWVudSBhZGQgY29tbWFuZCAtZm9udCAkbWZvbnQgLWxhYmVsICJMb2dmaWxlIiAtY29tbWFuZCBzaG93X2xvZ2ZpbGUKLQkkbWVudSBhZGQgc2VwYXJhdG9yCi0JJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJG1mb250IC1sYWJlbCAiTmV3IENsaWVudCIgLWNvbW1hbmQgZG9fbmV3X2NsaWVudAotCi0Jc2V0IHdkICIkbWVudS5kaXNjb25uZWN0IgotCWNhdGNoIHtkZXN0cm95ICR3ZH0KLQltZW51ICR3ZCAtdGVhcm9mZiAwIC1mb250ICRmZm9udCBcCi0JCS1wb3N0Y29tbWFuZCB7c2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDF9Ci0JJHdkIGFkZCBjb21tYW5kIC1sYWJlbCAiRGlzY29ubmVjdCBjbGllbnQ6IgotCSR3ZCBhZGQgc2VwYXJhdG9yCi0JJHdkIGFkZCBjb21tYW5kIC1sYWJlbCAiQWxsIENsaWVudHMiIC1jb21tYW5kIGRvX2Rpc2Nvbm5lY3RfYWxsCi0JJG1lbnUgYWRkIGNhc2NhZGUgLWZvbnQgJG1mb250IC1sYWJlbCAiRGlzY29ubmVjdDoiIC1tZW51ICR3ZAotCi0JJG1lbnUgYWRkIHNlcGFyYXRvcgotCi0Jc2V0IHd2ICIkbWVudS53aW5kb3d2aWV3IgotCWNhdGNoIHtkZXN0cm95ICR3dn0KLQltZW51ICR3diAtdGVhcm9mZiAwIC1mb250ICRmZm9udCBcCi0JCS1wb3N0Y29tbWFuZCB7c2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDF9Ci0JZm9yZWFjaCB2YWwge2Z1bGwgaWNvbiB0cmF5fSB7Ci0JCSR3diBhZGQgcmFkaW9idXR0b24gLWxhYmVsICIkdmFsIiBcCi0JCQktdmFsdWUgIiR2YWwiIC1mb250ICRmZm9udCBcCi0JCQktY29tbWFuZCAiZG9fdmFyIFdpbmRvd1ZpZXciIFwKLQkJCS12YXJpYWJsZSBtZW51X3ZhcihXaW5kb3dWaWV3KQotCX0KLQkkbWVudSBhZGQgY2FzY2FkZSAtZm9udCAkbWZvbnQgLWxhYmVsICJXaW5kb3cgVmlldzoiIC1tZW51ICR3dgotCi0JJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJG1mb250IC1sYWJlbCAiRGlzbWlzcyIgLWNvbW1hbmQgIiRtZW51IHVucG9zdCIKLQkkbWVudSBhZGQgY29tbWFuZCAtZm9udCAkbWZvbnQgLWxhYmVsICJTdG9wIHgxMXZuYyIgLWNvbW1hbmQgY2xlYW5faWNvbl9leGl0Ci0KLQlzZXQgaXRlbXMgW2dldF9jdXN0b21fbWVudV9pdGVtc10KLQlzZXQgaTAgW2xpbmRleCAkaXRlbXMgMF0KLQlpZiB7JGkwICE9ICJub25lIiAmJiAkaTAgIT0gIm5vY2hhbmdlIn0gewotCQkkbWVudSBhZGQgc2VwYXJhdG9yCi0JCXNldCBjbSAiJG1lbnUuY3VzdG9tIgotCQljYXRjaCB7ZGVzdHJveSAkY219Ci0JCW1lbnUgJGNtIC10ZWFyb2ZmIDAgLWZvbnQgJGZmb250IFwKLQkJCS1wb3N0Y29tbWFuZCAic2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDE7IG1ha2VfY3VzdG9tX21lbnUgJGNtICRmZm9udCIKLQkJJG1lbnUgYWRkIGNhc2NhZGUgLWZvbnQgJG1mb250IC1sYWJlbCAiQ3VzdG9tOiIgLW1lbnUgJGNtCi0JfQotCi0JYmluZCAkaWNvbl93aW4gPEJ1dHRvblJlbGVhc2UtMT4gInBtZW51ICRtZW51ICVYICVZIgotCWJpbmQgJGljb25fd2luIDxCdXR0b25SZWxlYXNlLTM+ICJwbWVudSAkbWVudSAlWCAlWSIKLQliaW5kICRpY29uX3dpbiA8RW50ZXI+IHtzZXQgY2xpZW50X2JhbGxvb25faWQgW2FmdGVyIDUwMCBzaG93X2NsaWVudF9iYWxsb29uXX0KLQliaW5kICRpY29uX3dpbiA8QnV0dG9uPiB7a2lsbF9jbGllbnRfYmFsbG9vbn0KLQliaW5kICRpY29uX3dpbiA8TGVhdmU+ICB7a2lsbF9jbGllbnRfYmFsbG9vbn0KLQliaW5kICRpY29uX3dpbiA8U2hpZnQtQnV0dG9uUmVsZWFzZS0xPiB7a2lsbF9jbGllbnRfYmFsbG9vbjsgc2hvd19jbGllbnRfYmFsbG9vbn0KLQliaW5kICRpY29uX3dpbiA8QnV0dG9uUmVsZWFzZS0yPiB7a2lsbF9jbGllbnRfYmFsbG9vbjsgc2hvd19jbGllbnRfYmFsbG9vbn0KLSMJYmluZCAkbWVudSA8TGVhdmU+ICJsbWVudSAkbWVudSIKLSMJYmluZCAkbWVudSA8RW50ZXI+ICJzZXQgbGVmdF9pY29ud2luX21lbnUgMCIKLSMJYmluZCAkbWVudSA8S2V5UHJlc3MtRXNjYXBlPiAiJG1lbnUgdW5wb3N0IgotCi0JYmluZCAuIDxDb250cm9sLUtleVByZXNzLWM+IHtkZXN0cm95IC47IGV4aXQgMH0KLQotCWlmIHshJHRyYXlfZW1iZWQgfHwgISR0cmF5X3J1bm5pbmd9IHsKLQkJZ2xvYmFsIHgxMXZuY19ndWlfZ2VvbQotCQlpZiB7JHgxMXZuY19ndWlfZ2VvbSAhPSAiIn0gewotCQkJc2V0IGRvaXQgMQotCQkJaWYge1tyZWdleHAge3h9ICR4MTF2bmNfZ3VpX2dlb21dfSB7Ci0JCQkJaWYgeyRndWlfc3RhcnRfbW9kZSA9PSAiZnVsbCJ9IHsKLQkJCQkJc2V0IGRvaXQgMAotCQkJCX0KLQkJCX0gCi0JCQlpZiB7JGRvaXR9IHsKLQkJCQl3bSBnZW9tZXRyeSAuICR4MTF2bmNfZ3VpX2dlb20KLQkJCX0KLQkJfQotCX0KLQl3bSBpY29ubmFtZSAuICJ0a3gxMXZuYyIKLQl3bSB0aXRsZSAuICJ0a3gxMXZuYyIKLQl1cGRhdGUKLQlpZiB7JHRyYXlfZW1iZWQgJiYgJHRyYXlfcnVubmluZ30gewotCQkjd20gZGVpY29uaWZ5IC47ICAgIyAgd2h5IGRpZCB3ZSBoYXZlIHRoaXM/Pz8KLQkJI2FmdGVyIDEwMDAwIHt3bSBkZWljb25pZnkgLjsgcHV0cyAicmVxaGVpZ2h0IFt3aW5mbyByZXFoZWlnaHQgLl0iOyBwdXRzICJyZXF3aWR0aCAgW3dpbmZvIHJlcXdpZHRoICAuXSI7IHB1dHMgImhlaWdodCBbd2luZm8gaGVpZ2h0IC5dIjsgcHV0cyAid2lkdGggIFt3aW5mbyB3aWR0aCAgLl0ifQotCX0gZWxzZSB7Ci0JCXdtIGRlaWNvbmlmeSAuCi0JfQotCXVwZGF0ZQotCi0jcHV0cyAicmVxaGVpZ2h0IFt3aW5mbyByZXFoZWlnaHQgLl0iCi0jcHV0cyAicmVxd2lkdGggIFt3aW5mbyByZXF3aWR0aCAgLl0iCi0jcHV0cyAiaGVpZ2h0IFt3aW5mbyBoZWlnaHQgLl0iCi0jcHV0cyAid2lkdGggIFt3aW5mbyB3aWR0aCAgLl0iCi0jcHV0cyAiQUFBIgotCi0Jb2xkX2JhbGxvb24KLX0KLQotcHJvYyBzZXR1cF9jbGllbnRfY2hhbm5lbCB7fSB7Ci0JZ2xvYmFsIGNsaWVudF9zb2NrIGNsaWVudF90YWlsCi0KLSMgWFhYL3NldHVwX2NsaWVudF9jaGFubmVsCi0JaWYgeyRjbGllbnRfc29jayA9PSAiIiB9IHsKLQkJc3RvcF93YXRjaCBvbgotCQl0cnlfY2xpZW50X2luZm9fc29jawotCQlpZiB7JGNsaWVudF9zb2NrID09ICIiIH0gewotCQkJYWZ0ZXIgNTAwCi0JCQl0cnlfY2xpZW50X2luZm9fc29jawotCQl9Ci0JCXN0b3Bfd2F0Y2ggb2ZmCi0JfQotCWlmIHskY2xpZW50X3RhaWwgPT0gIiIgJiYgJGNsaWVudF9zb2NrID09ICIifSB7Ci0JCXNldCBtICJcbiIKLQkJc2V0IG0gIiR7bX10a3gxMXZuYzpcbiIKLQkJc2V0IG0gIiR7bX1cbiIKLQkJc2V0IG0gIiR7bX0gICAgV2FybmluZyAtLSBydW5uaW5nIGluIGljb24vdHJheSBtb2RlIGJ1dCB0aGVcbiIKLQkJc2V0IG0gIiR7bX0gICAgY29ubmVjdGVkIGNsaWVudCBpbmZvIGNoYW5uZWwgZnJvbSB4MTF2bmMgaXNcbiIKLQkJc2V0IG0gIiR7bX0gICAgbm90IHdvcmtpbmcuICBUaGUgdmlld2VyIGNsaWVudCBsaXN0IGFuZCBpY29uXG4iCi0JCXNldCBtICIke219ICAgIGNvbG9yIGluZGljYXRvciB3aWxsIG5vdCBiZSBhY2N1cmF0ZS5cbiIKLQkJc2V0IG0gIiR7bX1cbiIKLQkJc2V0IG0gIiR7bX0gICAgWW91IG1heSBuZWVkIHRvIHJlc3RhcnQgXCJ4MTF2bmMgLWd1aSB0cmF5IC4uLlwiXG4iCi0JCXNldCBtICIke219ICAgIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuXG4iCi0JCXNldCBtICIke219XG4iCi0JCXRleHR3aW4gIldhcm5pbmciICJXYXJuaW5nIiAkbQotCQl1cGRhdGUKLQl9Ci0JZHRpbWUgQwotfQotCi1wcm9jIGNsZWFuX2NsaWVudF90YWlsIHt9IHsKLQlnbG9iYWwgY2xpZW50X3RhaWwgY2xpZW50X2luZm9fcmVhZAotCWlmIFtpbmZvIGV4aXN0cyBjbGllbnRfdGFpbF0gewotCQlpZiB7JGNsaWVudF90YWlsICE9ICIifSB7Ci0JCQlzZXQgcCAiIgotCQkJY2F0Y2gge3NldCBwIFtwaWQgJGNsaWVudF90YWlsXX0KLQkJCWlmIHskcCAhPSAiIn0gewotCQkJCWNhdGNoIHtleGVjIGtpbGwgLVRFUk0gJHAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbH0KLQkJCX0KLQkJCWNhdGNoIHtjbG9zZSAkY2xpZW50X3RhaWx9Ci0JCQlzZXQgY2xpZW50X3RhaWwgIiIKLQkJfQotCX0KLQlzZXQgY2xpZW50X2luZm9fcmVhZCAwCi19Ci0KLXByb2MgY2xlYW5faWNvbl9leGl0IHt9IHsKLQljbGVhbl9jbGllbnRfdGFpbAotCXB1c2hfbmV3X3ZhbHVlICJzdG9wIiAic3RvcCIgMSAwCi0Jc2V0X2Nvbm5lY3RlZCBubwotCXVwZGF0ZQotCWRlc3Ryb3kgLgotCWV4aXQKLX0KLQotcHJvYyBtYWtlX2d1aSB7bW9kZX0gewotCWdsb2JhbCBpY29uX21vZGUgdHJheV9lbWJlZCB0cmF5X3J1bm5pbmcgZnVsbF93aW4gaWNvbl93aW4KLQlnbG9iYWwgdG9wX3dpZGdldF9uYW1lcyB4MTF2bmNfZ3VpX2dlb20KLQlnbG9iYWwgZ3VpX2N1cnJlbnRfc3RhdGUgbWFrZV9ndWlfY291bnQKLQlnbG9iYWwgeDExdm5jX2Nvbm5lY3QgY29ubmVjdGVkX3RvX3gxMXZuYwotCWdsb2JhbCB4MTFfZGlzcGxheQotCWdsb2JhbCBndWlfc3RhcnRfbW9kZQotCi0JaW5jciBtYWtlX2d1aV9jb3VudAotCi0JaWYgeyRndWlfc3RhcnRfbW9kZSA9PSAiIn0gewotCQlzZXQgZ3VpX3N0YXJ0X21vZGUgJG1vZGUKLQl9Ci0KLQl3bSB3aXRoZHJhdyAuCi0KLQlzZXQgZnVsbF9nZW9tICIiCi0JaWYge1t3aW5mbyBleGlzdHMgLmZ1bGxdfSB7Ci0JCWNhdGNoIHtzZXQgZnVsbF9nZW9tIFt3bSBnZW9tZXRyeSAuZnVsbF19Ci0JfQotCi0Jc2V0IGZ3IC5mdWxsCi0Jc2V0IGZ1bGxfd2luICRmdwotCWNhdGNoIHtwYWNrIGZvcmdldCAkZnVsbF93aW59Ci0JY2F0Y2gge3BhY2sgZm9yZ2V0ICRpY29uX3dpbn0KLQljYXRjaCB7ZGVzdHJveSAkZnVsbF93aW59Ci0JY2F0Y2gge2Rlc3Ryb3kgJGljb25fd2lufQotCi0Jd20gbWluc2l6ZSAuIDEgMQotCi0Jc2V0IGd1aV9jdXJyZW50X3N0YXRlICIiCi0KLQlpZiB7JG1vZGUgPT0gImZ1bGwifSB7Ci0JCWZyYW1lICRmdwotCQlzZXQgaWNvbl9tb2RlIDAKLQotCQl3bSBwcm90b2NvbCAuICAgICBXTV9ERUxFVEVfV0lORE9XICJkZXN0cm95IC47IGV4aXQiCi0JCW1ha2Vfd2lkZ2V0cyAkZncKLQotCQlzZXQgdyAiLiIKLQkJd20gZ2VvbWV0cnkgJHcgIiIKLQkJaWYgeyR4MTF2bmNfZ3VpX2dlb20gIT0gIiJ9IHsKLQkJCXNldCBkb2l0IDEKLQkJCWlmIHtbcmVnZXhwIHt4fSAkeDExdm5jX2d1aV9nZW9tXX0gewotCQkJCWlmIHskZ3VpX3N0YXJ0X21vZGUgIT0gJG1vZGV9IHsKLQkJCQkJc2V0IGRvaXQgMAotCQkJCX0KLQkJCX0KLQkJCWlmIHskZG9pdH0gewotCQkJCXdtIGdlb21ldHJ5ICR3ICR4MTF2bmNfZ3VpX2dlb20KLQkJCX0KLQkJfQotCQlwYWNrICRmdyAtZmlsbCBib3RoIC1leHBhbmQgMQotCi0JfSBlbHNlaWYgeyRtb2RlID09ICJpY29uIiB8fCAkbW9kZSA9PSAidHJheSJ9IHsKLQotCQl0b3BsZXZlbCAkZncKLQkJd20gd2l0aGRyYXcgJGZ3Ci0KLQkJd20gcHJvdG9jb2wgJGZ3IFdNX0RFTEVURV9XSU5ET1cgIndtIHdpdGhkcmF3IC5mdWxsIgotCQl3bSBwcm90b2NvbCAuICAgV01fREVMRVRFX1dJTkRPVyAiY2xlYW5faWNvbl9leGl0IgotCQkKLQkJaWYgeyRtb2RlID09ICJpY29uIn0gewotCQkJc2V0IHRyYXlfZW1iZWQgMAotCQl9IGVsc2VpZiB7JG1vZGUgPT0gInRyYXkifSB7Ci0JCQlzZXQgdHJheV9lbWJlZCAxCi0JCX0KLQkJc2V0IGljb25fbW9kZSAxCi0JCW1ha2Vfd2lkZ2V0cyAkZncKLQkJc2V0IHcgJGZ3Ci0JCW1ha2VfaWNvbgotCQl3bSBnZW9tZXRyeSAkZncgIiIKLQkJd20gZ2VvbWV0cnkgLiAgICIiCi0JfSBlbHNlIHsKLQkJcmV0dXJuCi0JfQotCXNldF92aWV3X3ZhcmlhYmxlICRtb2RlCi0Jc2V0IGd1aV9jdXJyZW50X3N0YXRlICRtb2RlCi0KLQotCXVwZGF0ZQotCWlmIHshJHRyYXlfZW1iZWQgfHwgISR0cmF5X3J1bm5pbmd9IHsKLQkJd20gZGVpY29uaWZ5IC4KLQl9Ci0JdXBkYXRlIGlkbGV0YXNrcwotCXdtIG1pbnNpemUgJHcgW3dpbmZvIHdpZHRoICR3XSBbd2luZm8gaGVpZ2h0ICR3XQotCWlmIHskbW9kZSA9PSAiZnVsbCIgJiYgJG1ha2VfZ3VpX2NvdW50ID4gMX0gewotCQljZW50ZXJfd2luIC4KLQl9Ci0KLQotCWlmIHskbWFrZV9ndWlfY291bnQgPT0gMX0gewotCQljb3B5X2RlZmF1bHRfdmFycwotCQlpZiB7JHgxMXZuY19jb25uZWN0fSB7Ci0JCQl0cnlfY29ubmVjdF9hbmRfcXVlcnlfYWxsCi0JCX0gZWxzZSB7Ci0JCQlpbnNlcnRfY21kbGluZV92YXJzCi0JCX0KLQl9IGVsc2UgewotCQlzZXRfbmFtZSAiUkVTVE9SRSIKLQl9Ci0KLQlzZXR1cF9jbGllbnRfdGFpbAotCi0Jc2V0X3dpZGdldHMKLQotCWlmIHskbW9kZSA9PSAidHJheSJ9IHsKLQkJc2V0dXBfdHJheV9lbWJlZAotCX0KLX0KLQotcHJvYyBtYWtlX3dpZGdldHMge3RvcH0gewotCWdsb2JhbCB0ZW1wbGF0ZSBtYWtlX2d1aV9jb3VudAotCWdsb2JhbCBtZW51X2IgbWVudV9tIG1lbnVfY291bnQKLQlnbG9iYWwgaXRlbV9vcHRzIGl0ZW1fYm9vbCBpdGVtX2Nhc2UgaXRlbV9tZW51IGl0ZW1fZW50cnkgbWVudV92YXIgdW5zZXRfc3RyCi0JZ2xvYmFsIGl0ZW1fY2FzY2FkZQotCWdsb2JhbCBpbmZvX2xhYmVsIGluZm9fc3RyIHgxMV9kaXNwbGF5IHZuY19kaXNwbGF5Ci0JZ2xvYmFsIHRleHRfYXJlYSB0ZXh0X2FyZWFfc3RyCi0JZ2xvYmFsIGVudHJ5X2JveCBlbnRyeV9zdHIgZW50cnlfc2V0IGVudHJ5X2xhYmVsIGVudHJ5X29rIGVudHJ5X2Jyb3dzZQotCWdsb2JhbCBlbnRyeV9oZWxwIGVudHJ5X3NraXAKLQlnbG9iYWwgYmZvbnQgZmZvbnQgYmVnaW5uZXJfbW9kZQotCWdsb2JhbCBoZWxwdGV4dCBoZWxwcmVtb3RlIGhlbHBsYWJlbAotCWdsb2JhbCBpY29uX21vZGUgaWNvbl93aW4gcHJvcHNfd2luIGZ1bGxfd2luCi0JZ2xvYmFsIHRvcF93aWRnZXRfbmFtZXMKLQlnbG9iYWwgc2NyZWVuX2hlaWdodCBzY3JlZW5fd2lkdGgKLQotCi0JIyBNYWtlIHRoZSB0b3AgbGFiZWwKLQlzZXQgbGFiZWxfd2lkdGggODQKLQlpZiB7JHNjcmVlbl93aWR0aCA8PSA0MDB9IHsKLQkJc2V0IGxhYmVsX3dpZHRoIDY0Ci0JfQotCXNldCBpbmZvX2xhYmVsICIkdG9wLmluZm8iCi0JbGFiZWwgJGluZm9fbGFiZWwgLXRleHR2YXJpYWJsZSBpbmZvX3N0ciAtYmQgMiAtcmVsaWVmIGdyb292ZSBcCi0JCS1hbmNob3IgdyAtd2lkdGggJGxhYmVsX3dpZHRoIC1mb250ICRmZm9udAotCXBhY2sgJGluZm9fbGFiZWwgLXNpZGUgdG9wIC1maWxsIHggLWV4cGFuZCAwCi0KLQlzZXQgdG9wX3dpZGdldF9uYW1lcyhpbmZvKSAkaW5mb19sYWJlbAotCi0JIyBFeHRyYWN0IHRoZSBSb3dzOgotCXNldCByb3cgMDsKLQlzZXQgY29sbWF4IDA7Ci0JZm9yZWFjaCBsaW5lIFtzcGxpdCAkdGVtcGxhdGUgIlxuIl0gewotCQlpZiB7W3JlZ2V4cCB7XlJvdzogKC4qKX0gJGxpbmUgcmVzdF19IHsKLQkJCXNldCBjb2wgMAotCQkJZm9yZWFjaCBjYXNlIFtzcGxpdCAkcmVzdF0gewotCQkJCWlmIHskY2FzZSA9PSAiIiB8fCAkY2FzZSA9PSAiUm93OiJ9IHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJc2V0IG1lbnVfcm93KCRjYXNlKSAkcm93Ci0JCQkJc2V0IG1lbnVfY29sKCRjYXNlKSAkY29sCi0KLQkJCQlsYXBwZW5kIGNhc2VzKCRjb2wpICRjYXNlOwotCQkJCXNldCBsZW4gW3N0cmluZyBsZW5ndGggJGNhc2VdCi0JCQkJaWYge1tpbmZvIGV4aXN0cyBtYXhfbGVuKCRjb2wpXX0gewotCQkJCQlpZiB7JGxlbiA+ICRtYXhfbGVuKCRjb2wpfSB7Ci0JCQkJCQlzZXQgbWF4X2xlbigkY29sKSAkbGVuCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzZXQgbWF4X2xlbigkY29sKSAkbGVuCi0JCQkJfQotCQkJCWluY3IgY29sCi0JCQkJaWYgeyRjb2wgPiAkY29sbWF4fSB7Ci0JCQkJCXNldCBjb2xtYXggJGNvbAotCQkJCX0KLQkJCX0KLQkJCWluY3Igcm93OwotCQl9Ci0JfQotCi0JIyBNYWtlIGZyYW1lcyBmb3IgdGhlIHJvd3MgYW5kIG1ha2UgdGhlIG1lbnUgYnV0dG9ucy4KLQlzZXQgZiAiJHRvcC5tZW51ZnJhbWUiCi0JZnJhbWUgJGYKLQlmb3Ige3NldCBjIDB9IHskYyA8ICRjb2xtYXh9IHtpbmNyIGN9IHsKLQkJc2V0IGNvbGYgIiRmLm1lbnVmcmFtZSRjIgotCQlmcmFtZSAkY29sZgotCQlwYWNrICRjb2xmIC1zaWRlIGxlZnQgLWZpbGwgeQotCQlzZXQgZmJnIFskY29sZiBjZ2V0IC1iYWNrZ3JvdW5kXQotCQlmb3JlYWNoIGNhc2UgJGNhc2VzKCRjKSB7Ci0JCQlzZXQgbWVudWIgIiRjb2xmLm1lbnUkY2FzZSI7Ci0JCQlzZXQgbWVudSAiJGNvbGYubWVudSRjYXNlLm1lbnUiOwotCQkJc2V0IG1lbnVfYigkY2FzZSkgJG1lbnViCi0JCQlzZXQgbWVudV9tKCRjYXNlKSAkbWVudQotCQkJc2V0IHVsIDAKLQkJCWZvcmVhY2ggY2hhciBbc3BsaXQgJGNhc2UgIiJdIHsKLQkJCQlzZXQgY2hhciBbc3RyaW5nIHRvbG93ZXIgJGNoYXJdCi0JCQkJaWYgeyFbaW5mbyBleGlzdHMgdW5kZXJsaW5lZCgkY2hhcildfSB7Ci0JCQkJCXNldCB1bmRlcmxpbmVkKCRjaGFyKSAxCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJCWluY3IgdWwKLQkJCX0KLQkJCWdsb2JhbCBvc25hbWUKLQkJCXNldCB0c3RyICIkY2FzZSIKLQkJCWlmIHskb3NuYW1lID09ICJEYXJ3aW4ifSB7Ci0JCQkJI3NldCB0c3RyICIgJGNhc2UgICAiCi0JCQl9Ci0JCQltZW51YnV0dG9uICRtZW51YiAtdGV4dCAiJHRzdHIiIC11bmRlcmxpbmUgJHVsIFwKLQkJCQktYW5jaG9yIHcgLW1lbnUgJG1lbnUgLWJhY2tncm91bmQgJGZiZyBcCi0JCQkJLWZvbnQgJGJmb250Ci0JCQlwYWNrICRtZW51YiAtc2lkZSB0b3AgLWZpbGwgeAotCQkJbWVudSAkbWVudSAtdGVhcm9mZiAwIC1wb3N0Y29tbWFuZCBtZW51X3Bvc3RlZAotCQl9Ci0JfQotCXBhY2sgJGYgLXNpZGUgdG9wIC1maWxsIHgKLQlzZXQgdG9wX3dpZGdldF9uYW1lcyhtZW51ZnJhbWUpICRmCi0KLQltYWtlX21lbnVfaXRlbXMKLQotCSMgTWFrZSB0aGUgeDExIGFuZCB2bmMgZGlzcGxheSBsYWJlbCBiYXI6Ci0Jc2V0IGRmICIkdG9wLmRpc3BsYXlmcmFtZSIKLQlmcmFtZSAkZGYgLWJkIDEgLXJlbGllZiBncm9vdmUKLQlzZXQgdG9wX3dpZGdldF9uYW1lcyhkaXNwbGF5ZnJhbWUpICRkZgotCi0Jc2V0IGRmX3gxMSAiJGRmLnhkaXNwbGF5IgotCi0JaWYgeyRtYWtlX2d1aV9jb3VudCA9PSAxfSB7Ci0JCW5vX3gxMV9kaXNwbGF5Ci0JfQotCXNldCBsdyBbZXhwciB7JGxhYmVsX3dpZHRoIC8gMn1dCi0JbGFiZWwgJGRmX3gxMSAtdGV4dHZhcmlhYmxlIHgxMV9kaXNwbGF5IC13aWR0aCAkbHcgLWFuY2hvciB3IFwKLQkJLWZvbnQgJGZmb250Ci0KLQlzZXQgZGZfdm5jICIkZGYudmRpc3BsYXkiCi0KLQlpZiB7JG1ha2VfZ3VpX2NvdW50ID09IDF9IHsKLQkJbm9fdm5jX2Rpc3BsYXkKLQl9Ci0JbGFiZWwgJGRmX3ZuYyAtdGV4dHZhcmlhYmxlIHZuY19kaXNwbGF5IC13aWR0aCAkbHcgLWFuY2hvciB3IFwKLQkJLWZvbnQgJGZmb250Ci0KLQlwYWNrICRkZl94MTEgJGRmX3ZuYyAtc2lkZSBsZWZ0IAotCXBhY2sgJGRmIC1zaWRlIHRvcCAtZmlsbCB4Ci0KLQkjIHRleHQgYXJlYQotCWdsb2JhbCB0ZXh0X2hlaWdodAotCXNldCB0ZXh0X2FyZWEgIiR0b3AudGV4dCIKLQlpZiB7JHNjcmVlbl93aWR0aCA8PSA0MDB9IHsKLQkJdGV4dCAkdGV4dF9hcmVhIC1oZWlnaHQgJHRleHRfaGVpZ2h0IC13aWR0aCAkbGFiZWxfd2lkdGggXAotCQkJLXJlbGllZiByaWRnZSAtZm9udCAkZmZvbnQKLQl9IGVsc2UgewotCQl0ZXh0ICR0ZXh0X2FyZWEgLWhlaWdodCAkdGV4dF9oZWlnaHQgLXJlbGllZiByaWRnZSAtZm9udCAkZmZvbnQKLQl9Ci0JcGFjayAkdGV4dF9hcmVhIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQotCXNldCB0b3Bfd2lkZ2V0X25hbWVzKHRleHQpICR0ZXh0X2FyZWEKLQotCi0JaWYgeyR0ZXh0X2FyZWFfc3RyID09ICIifSB7Ci0JCXNldCBzdHIgIkNsaWNrIEhlbHAgLT4gZ3VpIGZvciBvdmVydmlldy4iCi0JCWFwcGVuZF90ZXh0ICJcbiRzdHJcblxuIgotCX0gZWxzZSB7Ci0JCWFwcGVuZF90ZXh0ICR0ZXh0X2FyZWFfc3RyCi0JfQotCi0JIyBNYWtlIGVudHJ5IGJveCBzdHVmZgotCXNldCBlZiAiJHRvcC5lbnRyeWZyYW1lIgotCWZyYW1lICRlZiAtYmQgMSAtcmVsaWVmIGdyb292ZQotCXNldCB0b3Bfd2lkZ2V0X25hbWVzKGVudHJ5ZnJhbWUpICRlZgotCi0JIyBFbnRyeSBMYWJlbAotCXNldCBlZl9sYWJlbCAiJGVmLmxhYmVsIgotCWxhYmVsICRlZl9sYWJlbCAtdGV4dHZhcmlhYmxlIGVudHJ5X3N0ciAtYW5jaG9yIHcgLWZvbnQgJGJmb250Ci0KLQlzZXQgZW50cnlfc3RyICJTZXQuLi4gOiAiCi0Jc2V0IGVmX2VudHJ5ICIkZWYuZW50cnkiCi0JZW50cnkgJGVmX2VudHJ5IC1yZWxpZWYgc3Vua2VuIC1mb250ICRmZm9udAotCWJpbmQgJGVmX2VudHJ5IDxLZXlQcmVzcy1SZXR1cm4+IHtzZXQgZW50cnlfc2V0IDF9Ci0JYmluZCAkZWZfZW50cnkgPEtleVByZXNzLUVzY2FwZT4ge3NldCBlbnRyeV9zZXQgMH0KLQotCXNldCBva19zICJPSyIKLQlzZXQgY2FuY2VsX3MgIkNhbmNlbCIKLQlzZXQgaGVscF9zICJIZWxwIgotCXNldCBicm93c2VfcyAiQnJvd3NlLi4uIgotCWdsb2JhbCBvc25hbWUKLQlpZiB7JG9zbmFtZSA9PSAiRGFyd2luIn0gewotCQlzZXQgb2tfcyAiIE9LICAgIgotCQlzZXQgY2FuY2VsX3MgIiBDYW5jZWwgICAiCi0JCXNldCBoZWxwX3MgIiBIZWxwICAgIgotCQlzZXQgYnJvd3NlX3MgIiBCcm93c2UuLi4gICAiCi0JfQotCi0JIyBFbnRyeSBPSyBidXR0b24KLQlzZXQgYnB4ICIxbSIKLQlzZXQgYnB5ICIxIgotCXNldCBobHQgIjAiCi0Jc2V0IGVmX29rICIkZWYub2siCi0JYnV0dG9uICRlZl9vayAtdGV4dCAkb2tfcyAtcGFkeSAkYnB5IC1wYWR4ICRicHggLWNvbW1hbmQge3NldCBlbnRyeV9zZXQgMX0gXAotCQktaGlnaGxpZ2h0dGhpY2tuZXNzICRobHQgXAotCQktZm9udCAkYmZvbnQKLQotCSMgRW50cnkgU2tpcCBidXR0b24KLQlzZXQgZWZfc2tpcCAiJGVmLnNraXAiCi0JYnV0dG9uICRlZl9za2lwIC10ZXh0ICRjYW5jZWxfcyAtcGFkeSAkYnB5IC1wYWR4ICRicHggLWNvbW1hbmQge3NldCBlbnRyeV9zZXQgMH0gXAotCQktaGlnaGxpZ2h0dGhpY2tuZXNzICRobHQgXAotCQktZm9udCAkYmZvbnQKLQotCSMgRW50cnkgSGVscCBidXR0b24KLQlzZXQgZWZfaGVscCAiJGVmLmhlbHAiCi0JYnV0dG9uICRlZl9oZWxwIC10ZXh0ICRoZWxwX3MgLXBhZHkgJGJweSAtcGFkeCAkYnB4IC1jb21tYW5kIFwKLQkJe21lbnVfaGVscCAkZW50cnlfZGlhbG9nX2l0ZW19IC1mb250ICRiZm9udCBcCi0JCS1oaWdobGlnaHR0aGlja25lc3MgJGhsdAotCi0JIyBFbnRyeSBCcm93c2UgYnV0dG9uCi0Jc2V0IGVmX2Jyb3dzZSAiJGVmLmJyb3dzZSIKLQlidXR0b24gJGVmX2Jyb3dzZSAtdGV4dCAkYnJvd3NlX3MgLXBhZHkgJGJweSAtcGFkeCAkYnB4IC1mb250ICRiZm9udCBcCi0JCS1oaWdobGlnaHR0aGlja25lc3MgJGhsdCBcCi0JCS1jb21tYW5kIHtlbnRyeV9pbnNlcnQgW3RrX2dldE9wZW5GaWxlXX0gCi0KLQlwYWNrICRlZl9sYWJlbCAtc2lkZSBsZWZ0Ci0JcGFjayAkZWZfZW50cnkgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMQotCXBhY2sgJGVmX29rICAgLXNpZGUgcmlnaHQKLQlwYWNrICRlZl9za2lwIC1zaWRlIHJpZ2h0Ci0JcGFjayAkZWZfaGVscCAtc2lkZSByaWdodAotCXBhY2sgJGVmIC1zaWRlIGJvdHRvbSAtZmlsbCB4Ci0KLQlzZXQgZW50cnlfb2sgJGVmX29rCi0Jc2V0IGVudHJ5X3NraXAgJGVmX3NraXAKLQlzZXQgZW50cnlfaGVscCAkZWZfaGVscAotCXNldCBlbnRyeV9ib3ggJGVmX2VudHJ5Ci0Jc2V0IGVudHJ5X2Jyb3dzZSAkZWZfYnJvd3NlCi0Jc2V0IGVudHJ5X2xhYmVsICRlZl9sYWJlbAotCWVudHJ5X2Rpc2FibGUKLQotfQotCi1wcm9jIG1lbnVfYmluZGluZ3Mge219IHsKLQlzZXQgZGIgMAotCWlmIHskZGJ9IHtwdXRzICJtZW51X2JpbmRpbmdzICRtIn0KLQotCWJpbmQgJG0gPDxNZW51U2VsZWN0Pj4gewotI3N5bnRheCBoaWxpdGUgYnVnIFwKLU1lbnVTZWxlY3Q+PgotCQlzZXQgbiBbJVcgaW5kZXggYWN0aXZlXQotCQlzZXQgZGIgMAotCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgIm1lbnVfYmluZGluZ3MgJVcgJG4ifQotCQlzZXQgbGFiZWwgIiAgICAiCi0JCWlmIHskbiAhPSAibm9uZSJ9IHsKLQkJCXNldCBzdHIgJVcsJG4KLQkJCXNldCB3aGljaCAiIgotCi0JCQlpZiB7JGRifSB7cHV0cyAibWVudV9iaW5kaW5ncyAkc3RyIn0KLQkJCWlmIHtbaW5mbyBleGlzdHMgaGVscGxhYmVsKCRzdHIpXX0gewotCQkJCXNldCB2bmFtZSBbZm9ybWF0ICUlLTE2cyAkaGVscGxhYmVsKCRzdHIpXQotCQkJCXNldCBsYWJlbCAiQ2xpY2sgKD8pIGZvciBoZWxwIG9uOiAkdm5hbWUiCi0JCQkJc2V0IHdoaWNoICRoZWxwbGFiZWwoJHN0cikKLQkJCX0KLQkJCWlmIHskd2hpY2ggPT0gIiJ9IHsKLQkJCQk7Ci0JCQl9IGVsc2VpZiB7JHdoaWNoID09ICJwYXNzd2QiIHx8ICR3aGljaCA9PSAidmlld3Bhc3N3ZCJ9IHsKLQkJCQk7Ci0JCQl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkd2hpY2hdfSB7Ci0JCQkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3Zhcigkd2hpY2gpXSAKLQkJCQkgICAgJiYgJG1lbnVfdmFyKCR3aGljaCkgIT0gIiJ9IHsKLQkJCQkJc2V0IGxhYmVsICIkbGFiZWwgdmFsdWU6ICRtZW51X3Zhcigkd2hpY2gpIgotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldCBsYWJlbCAiJGxhYmVsIChpcyBhY3Rpb24pIgotCQkJCX0KLQkJCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoJHdoaWNoKV19IHsKLQkJCQlzZXQgbGFiZWwgIiRsYWJlbCB2YWx1ZTogJG1lbnVfdmFyKCR3aGljaCkiCi0JCQkJaWYgeyR3aGljaCA9PSAiaHR0cCJ9IHsKLQkJCQkJZ2xvYmFsIHZuY191cmwKLQkJCQkJc2V0IGxhYmVsICIkbGFiZWwgIFVSTDogJHZuY191cmwiCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNldF9pbmZvICRsYWJlbAotCX0KLX0KLQotcHJvYyBrZXlfYmluZGluZ3Mge30gewotCWdsb2JhbCBlbnYgbWVudXNfZGlzYWJsZWQKLQlpZiB7W2luZm8gZXhpc3RzIGVudihVU0VSKV0gJiYgJGVudihVU0VSKSA9PSAicnVuZ2UifSB7Ci0JCSMgcXVpY2sgcmVzdGFydAotCQliaW5kIC4gPENvbnRyb2wtS2V5UHJlc3Mtaz4ge2V4ZWMgJGFyZ3YwICRhcmd2ICY7IGRlc3Ryb3kgLn0KLQl9Ci0JYmluZCAuIDxDb250cm9sLUtleVByZXNzLXA+IHsgXAotCQlnbG9iYWwgbWVudXNfZGlzYWJsZWQ7IFwKLQkJaWYgeyEkbWVudXNfZGlzYWJsZWR9IHt0cnlfY29ubmVjdF9hbmRfcXVlcnlfYWxsfSBcCi0JfQotCWJpbmQgLiA8Q29udHJvbC1LZXlQcmVzcy11PiB7IFwKLQkJZ2xvYmFsIG1lbnVzX2Rpc2FibGVkOyBcCi0JCWlmIHshJG1lbnVzX2Rpc2FibGVkfSB7cXVlcnlfYWxsIDB9IFwKLQl9Ci0JYmluZCAuIDxDb250cm9sLUtleVByZXNzLXI+IHsgXAotCQlnbG9iYWwgbWVudXNfZGlzYWJsZWQ7IFwKLQkJaWYgeyEkbWVudXNfZGlzYWJsZWR9IHtxdWVyeV9hbGwgMH0gXAotCX0KLQliaW5kIC4gPENvbnRyb2wtS2V5UHJlc3MtZD4geyBcCi0JCWdsb2JhbCBtZW51c19kaXNhYmxlZDsgXAotCQlpZiB7ISRtZW51c19kaXNhYmxlZH0ge2RldGFjaF9mcm9tX2Rpc3BsYXl9IFwKLQl9Ci0JYmluZCAuIDxDb250cm9sLUtleVByZXNzLWE+IHsgXAotCQlnbG9iYWwgbWVudXNfZGlzYWJsZWQ7IFwKLQkJaWYgeyEkbWVudXNfZGlzYWJsZWR9IHt0cnlfY29ubmVjdF9hbmRfcXVlcnlfYWxsfSBcCi0JfQotfQotCi1wcm9jIHN0b3Bfd2F0Y2gge29ub2ZmfSB7Ci0JZ2xvYmFsIG9yaWdfY3Vyc29yIHRleHRfYXJlYSBlbnRyeV9ib3gKLQotCXNldCB3aWRnZXRzIFtsaXN0IC5dCi0JaWYgW2luZm8gZXhpc3RzIHRleHRfYXJlYV0gewotCQlpZiB7JHRleHRfYXJlYSAhPSAiIn0gewotCQkJbGFwcGVuZCB3aWRnZXRzICR0ZXh0X2FyZWEKLQkJfQotCX0KLQlpZiBbaW5mbyBleGlzdHMgZW50cnlfYm94XSB7Ci0JCWlmIHskZW50cnlfYm94ICE9ICIifSB7Ci0JCQlsYXBwZW5kIHdpZGdldHMgJGVudHJ5X2JveAotCQl9Ci0JfQotCi0JaWYgeyRvbm9mZiA9PSAib24ifSB7Ci0JCWZvcmVhY2ggaXRlbSAkd2lkZ2V0cyB7Ci0JCQlpZiB7IVt3aW5mbyBleGlzdHMgJGl0ZW1dfSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCSRpdGVtIGNvbmZpZyAtY3Vyc29yIHt3YXRjaH0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvcmVhY2ggaXRlbSAkd2lkZ2V0cyB7Ci0JCQlpZiB7IVt3aW5mbyBleGlzdHMgJGl0ZW1dfSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCSRpdGVtIGNvbmZpZyAtY3Vyc29yIHt9Ci0JCX0KLQl9Ci0JdXBkYXRlCi19Ci0KLXByb2MgZG91YmxlX2NoZWNrX25vcmVtb3RlIHt9IHsKLQlzZXQgbXNnICJcblxuIgotCWFwcGVuZCBtc2cgIioqKiBXQVJOSU5HOiBzZXR0aW5nIFwibm9yZW1vdGVcIiB3aWxsIGRpc2FibGUgQUxMIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIChpLmUuXG4iCi0JYXBwZW5kIG1zZyAiKioqIFdBUk5JTkc6ICp0aGlzKiBndWkgd2lsbCBiZSBsb2NrZWQgb3V0KS4gRG8geW91IHJlYWxseSB3YW50IHRvIGRvIHRoaXM/XG4iCi0JYXBwZW5kIG1zZyAiKioqIFdBUk5JTkc6IElmIHNvLCBwcmVzcyBcIk9LXCIsIG90aGVyd2lzZSBwcmVzcyBcIkNhbmNlbFwiXG4iCi0JYXBwZW5kIG1zZyAiXG4iCi0JYmVsbAotCXJldHVybiBbd2FybmluZ19kaWFsb2cgJG1zZyAibm9yZW1vdGUiXQotfQotCi1wcm9jIGdldF9zZXR0aW5nc19yY2ZpbGUge30gewotCWdsb2JhbCBtZW51X3ZhciBkZWZhdWx0X3ZhciB1bnNldF9zdHIKLQlnbG9iYWwgeDExdm5jX2d1aV9wYXJhbXMKLQotCXNldCByY190eHQgIiIKLQotCXNldCBtZW51X3ZhcihndWkpICR4MTF2bmNfZ3VpX3BhcmFtcwotCi0JZm9yZWFjaCBpdGVtIFtsc29ydCBbYXJyYXkgbmFtZXMgbWVudV92YXJdXSB7Ci0JCWlmIHskaXRlbSA9PSAiZ3VpIn0gewotCQkJOwotCQl9IGVsc2VpZiB7IVthY3RpdmVfd2hlbl9zdGFydGluZyAkaXRlbV19IHsKLQkJCWNvbnRpbnVlCi0JCX0gZWxzZWlmIHtbaXNfYWN0aW9uICRpdGVtXX0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7JGl0ZW0gPT0gImRlYnVnX2d1aSJ9IHsKLQkJCWNvbnRpbnVlCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAiV2luZG93VmlldyJ9IHsKLQkJCWNvbnRpbnVlCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAicmMiIHx8ICRpdGVtID09ICJub3JjIn0gewotCQkJY29udGludWUKLQkJfSBlbHNlaWYgeyRpdGVtID09ICJsb29wIn0gewotCQkJY29udGludWUKLQkJfSBlbHNlaWYgeyRpdGVtID09ICJsb29wYmcifSB7Ci0JCQljb250aW51ZQotCQl9Ci0KLQkJc2V0IGRlZiAiIgotCQlpZiB7W2luZm8gZXhpc3RzIGRlZmF1bHRfdmFyKCRpdGVtKV19IHsKLQkJCXNldCBkZWYgJGRlZmF1bHRfdmFyKCRpdGVtKQotCQl9Ci0KLQotCQlzZXQgcXN0ICIiCi0JCXNldCBobW0gIiM/ICIKLQkJaWYgeyRpdGVtID09ICJkaXNwbGF5In0gewotCQkJc2V0IHFzdCAkaG1tCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAiZGVza3RvcCJ9IHsKLQkJCXNldCBxc3QgJGhtbQotCQl9IGVsc2VpZiB7JGl0ZW0gPT0gImRvbnRkaXNjb25uZWN0In0gewotCQkJc2V0IHFzdCAkaG1tCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAiYWx3YXlzc2hhcmVkIn0gewotCQkJc2V0IHFzdCAkaG1tCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAibmV2ZXJzaGFyZWQifSB7Ci0JCQlzZXQgcXN0ICRobW0KLQkJfSBlbHNlaWYgeyRpdGVtID09ICJndWkifSB7Ci0JCQlzZXQgcXN0ICRobW0KLQkJfQotCi0JCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHsKLQkJCXNldCBtdiAkZGVmCi0JCX0gZWxzZSB7Ci0JCQlzZXQgbXYgJG1lbnVfdmFyKCRpdGVtKQotCQl9Ci0jcHV0cyAiaXRlbT0kaXRlbSBkZWY9JGRlZiBtdj0kbXYiCi0JCWlmIHskbXYgPT0gJHVuc2V0X3N0cn0gewotCQkJc2V0IG12ICIiCi0JCX0KLQkJc2V0IG50YWIgMwotCi0JCWlmIHskaXRlbSA9PSAiZ3VpIiB8fCBbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0gewotCQkJc2V0IG5pdGVtIFtnZXRfbml0ZW0gJGl0ZW1dCi0KLQkJCWlmIHskbXYgPT0gIiIgJiYgJGRlZiAhPSAiIn0gIHsKLQkJCQlzZXQgcXN0ICRobW0KLQkJCX0KLQkJCXNldCBuIDAKLQkJCWlmIHskcXN0ICE9ICIifSB7Ci0JCQkJYXBwZW5kIHJjX3R4dCAkcXN0Ci0JCQkJaW5jciBuIFtzdHJpbmcgbGVuZ3RoICRxc3RdCi0JCQl9IGVsc2VpZiB7JG12ID09ICRkZWZ9IHsKLQkJCQlhcHBlbmQgcmNfdHh0ICIjZCAiCi0JCQkJaW5jciBuIFtzdHJpbmcgbGVuZ3RoICIjZCAiXQotCQkJfQotCQkJc2V0IG10ICRtdgotCQkJcmVnc3ViIC1hbGwgeyN9ICRtdCB7XCN9IG10Ci0JCQlpZiB7JG10ID09ICIifSB7Ci0JCQkJc2V0IG10IHsiIn0KLQkJCX0KLQkJCWFwcGVuZCByY190eHQgIi0kbml0ZW0gJG10IgotCi0JCQlpZiB7JG12ICE9ICRkZWZ9IHsKLQkJCQlzZXQgbSBbc3RyaW5nIGxlbmd0aCAiLSRuaXRlbSAkbXQiXQotCQkJCWluY3IgbiAkbQotCQkJCXNldCBuIFtleHByICRuIC8gOF0KLQkJCQlzZXQgYyAwCi0JCQkJZm9yIHtzZXQgaSAkbn0geyRpIDw9ICRudGFifSB7aW5jciBpfSB7Ci0JCQkJCWFwcGVuZCByY190eHQgIlx0IgotCQkJCQlpbmNyIGMKLQkJCQl9Ci0JCQkJaWYgeyRjID09IDB9IHsKLQkJCQkJYXBwZW5kIHJjX3R4dCAiXHQiCi0JCQkJfQotCQkJCXJlZ3N1YiAtYWxsIHsjfSAkZGVmIHtcI30gZGVmCi0JCQkJaWYgeyRkZWYgPT0gIiJ9IHsKLQkJCQkJc2V0IGRlZiB7IiJ9Ci0JCQkJfQotCQkJCWFwcGVuZCByY190eHQgIiMgZGVmYXVsdDogICRkZWYiCi0JCQl9Ci0JCQlhcHBlbmQgcmNfdHh0ICJcbiIKLQotCQl9IGVsc2VpZiB7W3ZhbHVlX2lzX2Jvb2wgJGl0ZW1dfSB7Ci0JCQlzZXQgbiAwCi0JCQlpZiB7JHFzdCAhPSAiIn0gewotCQkJCWFwcGVuZCByY190eHQgJHFzdAotCQkJCWluY3IgbiBbc3RyaW5nIGxlbmd0aCAkcXN0XQotCQkJfSBlbHNlaWYgeyRtdiA9PSAkZGVmfSB7Ci0JCQkJYXBwZW5kIHJjX3R4dCAiI2QgIgotCQkJCWluY3IgbiBbc3RyaW5nIGxlbmd0aCAiI2QgIl0KLQkJCX0KLQkJCWlmIHskZGVmID09IDF9IHsKLQkJCQlzZXQgZHYgIm9uIgotCQkJfSBlbHNlIHsKLQkJCQlzZXQgZHYgIm9mZiIKLQkJCX0KLQkJCWFwcGVuZCByY190eHQgIi0kaXRlbSIKLQkJCXNldCBtIFtzdHJpbmcgbGVuZ3RoICItJGl0ZW0iXQotCQkJaW5jciBuICRtCi0JCQlzZXQgbiBbZXhwciAkbiAvIDhdCi0JCQlmb3Ige3NldCBpICRufSB7JGkgPD0gJG50YWJ9IHtpbmNyIGl9IHsKLQkJCQlhcHBlbmQgcmNfdHh0ICJcdCIKLQkJCX0KLQkJCWFwcGVuZCByY190eHQgIiMgZGVmYXVsdDogJGR2IgotCQkJYXBwZW5kIHJjX3R4dCAiXG4iCi0KLQkJfQotCX0KLQlyZXR1cm4gJHJjX3R4dAotfQotCi1wcm9jIGRvdWJsZV9jaGVja19zdGFydF94MTF2bmMge30gewotCWdsb2JhbCBob3N0bmFtZQotCXNldCBtc2cgW2dldF9zdGFydF94MTF2bmNfdHh0XQotCWJlbGwKLQlhcHBlbmQgbXNnICJcbiIKLQlhcHBlbmQgbXNnICIqKiogVG8gcnVuIHRoZSBhYm92ZSBjb21tYW5kIG9uIG1hY2hpbmUgXCIkaG9zdG5hbWVcIiAodGhlcmVieVxuIgotCWFwcGVuZCBtc2cgIioqKiBzdGFydGluZyB4MTF2bmMpIHByZXNzIFwiT0tcIiwgb3RoZXJ3aXNlIHByZXNzIFwiQ2FuY2VsXCIuXG4iCi0JcmV0dXJuIFt3YXJuaW5nX2RpYWxvZyAkbXNnICJzdGFydCJdCi19Ci0KLXByb2MgZ2V0X3N0YXJ0X3gxMXZuY190eHQge30gewotCXNldCBjbWQgW2dldF9zdGFydF94MTF2bmNfY21kXQotCXNldCBzdHIgW2pvaW4gJGNtZF0KLQlzZXQgbXNnICIiCi0JYXBwZW5kIG1zZyAiXG4iCi0JYXBwZW5kIG1zZyAiPT09PSBUaGUgY29tbWFuZCBidWlsdCBzbyBmYXIgaXM6ID09PT1cbiI7Ci0JYXBwZW5kIG1zZyAiXG4iCi0JYXBwZW5kIG1zZyAiJHN0clxuIgotCXJldHVybiAkbXNnCi19Ci0KLXByb2Mgc2hvd19zdGFydF9jbWQge30gewotCXNldCBtc2cgW2dldF9zdGFydF94MTF2bmNfdHh0XQotCWFwcGVuZF90ZXh0ICIkbXNnXG4iCi19Ci0KLXByb2MgZ2V0X25pdGVtIHtpdGVtfSB7Ci0Jc2V0IG5pdGVtICRpdGVtCi0JaWYgeyRuaXRlbSA9PSAic2NyZWVuX2JsYW5rIn0gewotCQlzZXQgbml0ZW0gInNiIgotCX0gZWxzZWlmIHskbml0ZW0gPT0gInhyYW5kcl9tb2RlIn0gewotCQlzZXQgbml0ZW0gInhyYW5kciIKLQl9IGVsc2VpZiB7JG5pdGVtID09ICJ1bml4cHdfbGlzdCJ9IHsKLQkJc2V0IG5pdGVtICJ1bml4cHciCi0JfSBlbHNlaWYgeyRuaXRlbSA9PSAidW5peHB3X25pc19saXN0In0gewotCQlzZXQgbml0ZW0gInVuaXhwd19uaXMiCi0JfSBlbHNlaWYgeyRuaXRlbSA9PSAic3R1bm5lbF9wZW0ifSB7Ci0JCXNldCBuaXRlbSAic3R1bm5lbCIKLQl9IGVsc2VpZiB7JG5pdGVtID09ICJzc2xfcGVtIn0gewotCQlzZXQgbml0ZW0gInNzbCIKLQl9IGVsc2VpZiB7JG5pdGVtID09ICJ3aXJlZnJhbWVfbW9kZSJ9IHsKLQkJc2V0IG5pdGVtICJ3aXJlZnJhbWUiCi0JfSBlbHNlaWYgeyRuaXRlbSA9PSAic29saWRfY29sb3IifSB7Ci0JCXNldCBuaXRlbSAic29saWQiCi0JfQotCXJldHVybiAkbml0ZW0KLX0KLQotcHJvYyBnZXRfc3RhcnRfeDExdm5jX2NtZCB7e3Nob3dfcmMgMH19IHsKLQlnbG9iYWwgY21kX3ZhciBtZW51X3ZhciBkZWZhdWx0X3ZhciB1bnNldF9zdHIgeDExdm5jX3Byb2cKLQotCXNldCB4dGVybV9jbWQgInh0ZXJtIC1pY29uaWMgLWdlb21ldHJ5IDgweDM1IC10aXRsZSB4MTF2bmMtY29uc29sZSAtZSIKLQotCXNldCBjbWQgW3NwbGl0ICR4dGVybV9jbWRdCi0KLQlsYXBwZW5kIGNtZCAkeDExdm5jX3Byb2cKLQotCWxhcHBlbmQgY21kICItZ3VpIgotCWxhcHBlbmQgY21kICJub25lIgotCi0Jc2V0IHJjX3R4dCAiIgotCi0Jc2V0IHNhd19pZCAwCi0KLQlmb3JlYWNoIGl0ZW0gW2xzb3J0IFthcnJheSBuYW1lcyBtZW51X3Zhcl1dIHsKLQkJaWYgeyRpdGVtID09ICJndWkifSB7Ci0JCQljb250aW51ZQotCQl9IGVsc2VpZiB7IVthY3RpdmVfd2hlbl9zdGFydGluZyAkaXRlbV19IHsKLQkJCWNvbnRpbnVlCi0JCX0gZWxzZWlmIHtbaXNfYWN0aW9uICRpdGVtXX0gewotCQkJY29udGludWUKLQkJfSBlbHNlaWYgeyRpdGVtID09ICJkZWJ1Z19ndWkifSB7Ci0JCQljb250aW51ZQotCQl9IGVsc2VpZiB7JGl0ZW0gPT0gIldpbmRvd1ZpZXcifSB7Ci0JCQljb250aW51ZQotCQl9Ci0KLQkJaWYgeyRpdGVtID09ICJpZCIgfHwgJGl0ZW0gPT0gInNpZCJ9IHsKLQkJCXNldCB2YWwgJG1lbnVfdmFyKCRpdGVtKTsKLQkJCWlmIHskdmFsID09ICIweDAiIHx8ICR2YWwgPT0gInJvb3QifSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJfQotCQlpZiB7JGl0ZW0gPT0gInNpZCIgJiYgJHNhd19pZH0gewotCQkJY29udGludWUKLQkJfQotCQlpZiB7JGl0ZW0gPT0gImlkIn0gewotCQkJc2V0IHNhd19pZCAxCi0JCX0gZWxzZWlmIHskaXRlbSA9PSAiaHR0cHBvcnQiICYmICRtZW51X3ZhcigkaXRlbSkgPT0gIjAifSB7Ci0JCQljb250aW51ZQotCQl9IGVsc2VpZiB7JGl0ZW0gPT0gInByb2dyZXNzaXZlIiAmJiAkbWVudV92YXIoJGl0ZW0pID09ICIwIn0gewotCQkJY29udGludWUKLQkJfSBlbHNlaWYgeyRpdGVtID09ICJkb250ZGlzY29ubmVjdCIgJiYgJG1lbnVfdmFyKCRpdGVtKSA9PSAiLTEifSB7Ci0JCQljb250aW51ZQotCQl9IGVsc2VpZiB7JGl0ZW0gPT0gImFsd2F5c3NoYXJlZCIgJiYgJG1lbnVfdmFyKCRpdGVtKSA9PSAiLTEifSB7Ci0JCQljb250aW51ZQotCQl9Ci0KLQkJaWYge1t2YWx1ZV9pc19ib29sICRpdGVtXX0gewotCQkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7Ci0JCQkJc2V0IGFkZCAxCi0JCQkJaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X3ZhcigkaXRlbSldfSB7Ci0JCQkJCWlmIHskbWVudV92YXIoJGl0ZW0pID09ICRkZWZhdWx0X3ZhcigkaXRlbSl9IHsKLQkJCQkJCXNldCBhZGQgMDsKLQkJCQkJfQotCQkJCX0gZWxzZWlmIHshICRtZW51X3ZhcigkaXRlbSl9IHsKLQkJCQkJc2V0IGFkZCAwCi0JCQkJfQotCQkJCWlmIHskYWRkfSB7Ci0JCQkJCWxhcHBlbmQgY21kICItJGl0ZW0iCi0JCQkJCWFwcGVuZCByY190eHQgIi0kaXRlbVxuIgotCQkJCX0KLQkJCX0KLQkJfSBlbHNlaWYge1t2YWx1ZV9pc19zdHJpbmcgJGl0ZW1dfSB7Ci0JCQlpZiB7IVtpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCWlmIHskbWVudV92YXIoJGl0ZW0pICE9ICIiICYmICRtZW51X3ZhcigkaXRlbSkgIT0gJHVuc2V0X3N0cn0gewotCQkJCXNldCBhZGQgMQotCQkJCXNldCBuaXRlbSBbZ2V0X25pdGVtICRpdGVtXQotCi0JCQkJaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X3ZhcigkaXRlbSldfSB7Ci0JCQkJCWlmIHskbWVudV92YXIoJGl0ZW0pID09ICRkZWZhdWx0X3ZhcigkaXRlbSl9IHsKLQkJCQkJCXNldCBhZGQgMDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiB7JGFkZH0gewotCQkJCQlsYXBwZW5kIGNtZCAiLSRuaXRlbSIKLQkJCQkJc2V0IG12ICRtZW51X3ZhcigkaXRlbSkKLQotCQkJCQlpZiB7W3JlZ2V4cCB7Xn59ICRtdl19ICB7Ci0JCQkJCQlpZiB7JGl0ZW0gPT0gImF1dGgiIHx8Ci0JCQkJCQkgICAgJGl0ZW0gPT0gInJjIiB8fAotCQkJCQkJICAgICRpdGVtID09ICJhY2NlcHQiIHx8IAotCQkJCQkJICAgICRpdGVtID09ICJjb25uZWN0IiB8fCAKLQkJCQkJCSAgICAkaXRlbSA9PSAiYWxsb3ciIHx8IAotCQkJCQkJICAgICRpdGVtID09ICJwYXNzd2RmaWxlIiB8fCAKLQkJCQkJCSAgICAkaXRlbSA9PSAibyIgfHwgCi0JCQkJCQkgICAgJGl0ZW0gPT0gImxvZ2ZpbGUiIHx8IAotCQkJCQkJICAgICRpdGVtID09ICJyZW1hcCIgfHwgCi0JCQkJCQkgICAgJGl0ZW0gPT0gImh0dHBkaXIifSB7IAotCQkJCQkJCXNldCBtdiBbdGlsZGVfZXhwYW5kICRtdl0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJbGFwcGVuZCBjbWQgJG12Ci0JCQkJCXNldCBtdCAkbXYKLQkJCQkJcmVnc3ViIC1hbGwgeyN9ICRtdCB7XCN9IG10Ci0JCQkJCWFwcGVuZCByY190eHQgIi0kbml0ZW0gJG10XG4iCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWxhcHBlbmQgY21kICIyPiIKLQlsYXBwZW5kIGNtZCAiL2Rldi9udWxsIgotCWxhcHBlbmQgY21kICImIgotCQotCWlmIHskc2hvd19yY30gewotCQlyZXR1cm4gJHJjX3R4dAotCX0gZWxzZSB7Ci0JCXJldHVybiAkY21kCi0JfQotfQotCi1wcm9jIHN0YXJ0X3gxMXZuYyB7fSB7Ci0JZ2xvYmFsIG1lbnVfdmFyIHVuc2V0X3N0cgotCWdsb2JhbCB4MTF2bmNfcHJvZyB4MTF2bmNfeGRpc3BsYXkKLQlnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYwotCi0JaWYgeyRjb25uZWN0ZWRfdG9feDExdm5jfSB7Ci0JCWFwcGVuZF90ZXh0ICJcbiIKLQkJYXBwZW5kX3RleHQgIldBUk5JTkc6IFN0aWxsIGNvbm5lY3RlZCB0byBhbiB4MTF2bmMgc2VydmVyLlxuIgotCQlhcHBlbmRfdGV4dCAiV0FSTklORzogVXNlIFwic3RvcFwiIG9yIFwiZGV0YWNoXCIgZmlyc3QuXG4iCi0JCXJldHVybiAwCi0JfQotCi0JaWYgeyFbZG91YmxlX2NoZWNrX3N0YXJ0X3gxMXZuY119IHsKLQkJcmV0dXJuCi0JfQotCi0Jc2V0IHgxMXZuY194ZGlzcGxheSAiIgotCWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoZGlzcGxheSldfSB7Ci0JCWlmIHskbWVudV92YXIoZGlzcGxheSkgIT0gIiIgJiYgJG1lbnVfdmFyKGRpc3BsYXkpICE9ICR1bnNldF9zdHJ9IHsKLQkJCXNldCB4MTF2bmNfeGRpc3BsYXkgJG1lbnVfdmFyKGRpc3BsYXkpCi0JCX0KLQl9Ci0KLQlzZXQgY21kIFtnZXRfc3RhcnRfeDExdm5jX2NtZF0KLQotCXNldCBzdHIgW2pvaW4gJGNtZF0KLQlyZWdzdWIgeyAtZX0gJHN0ciAiIC1lIFxcXG4gICAiIHN0cgotCi0JaWYgezB9IHsKLQkJcHV0cyAicnVubmluZzogJHN0ciIKLQkJZm9yZWFjaCB3b3JkICRjbWQgewotCQkJcHV0cyAiICAgd29yZDogJHdvcmQiCi0JCX0KLQl9Ci0KLQlhcHBlbmRfdGV4dCAiU3RhcnRpbmcgeDExdm5jIGluIGFuIGljb25pZmllZCB4dGVybSB3aXRoIGNvbW1hbmQ6XG4iCi0JYXBwZW5kX3RleHQgIiAgJHN0clxuXG4iCi0JY2F0Y2gge1tldmFsIGV4ZWMgJGNtZF19Ci0JYWZ0ZXIgNTAwCi0JdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbCAzCi0JaWYgeyEkY29ubmVjdGVkX3RvX3gxMXZuY30gewotCQlhcHBlbmRfdGV4dCAiXG5TdGFydGluZyB4MTF2bmMgc2VlbXMgdG8gaGF2ZSBmYWlsZWQuXG4iCi0JCWlmIHtbcmVnZXhwIC0tIHstbyB9ICRzdHJdIHx8IFtyZWdleHAgLS0gey1sb2dmaWxlfSAkc3RyXX0gewotCQkJYXBwZW5kX3RleHQgIkV4YW1pbmUgdGhlIGxvZ2ZpbGUgKERlYnVnZ2luZyAtPiBzaG93LWxvZ2ZpbGUpIGZvciBlcnJvciBtZXNzYWdlcy5cbiIKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZF90ZXh0ICJSZXJ1biB3aXRoIGEgbG9nZmlsZSAoaWYgbmVlZGVkKSBhbmQgZXhhbWluZSB0aGUgbG9nZmlsZVxuIgotCQkJYXBwZW5kX3RleHQgIihEZWJ1Z2dpbmcgLT4gc2hvdy1sb2dmaWxlKSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4iCi0JCX0KLQl9Ci19Ci0KLXByb2MgcnVuX3JlbW90ZV9jbWRfdmlhX3NvY2sge29wdHN9IHsKLQlnbG9iYWwgY2xpZW50X3NvY2sKLQotCXNldCBkYiAwCi0JaWYge1tmaWxlIGNoYW5uZWxzICRjbGllbnRfc29ja10gPT0gIiJ9IHsKLQkJc2V0IGNsaWVudF9zb2NrICIiCi0JCXJldHVybiAiZmFpbCIKLQl9Ci0JaWYge1tlb2YgJGNsaWVudF9zb2NrXX0gewotCQljYXRjaCB7Y2xvc2UgJGNsaWVudF9zb2NrfQotCQlzZXQgY2xpZW50X3NvY2sgIiIKLQkJcmV0dXJuICJmYWlsIgotCX0KLQlzZXQgcmVzdWx0ICIiCi0JCQotCXNldHVwX2NsaWVudF9zb2NrIDAKLQotCXNldCBkb2NtZCAiIgotCWZvcmVhY2ggb3B0ICRvcHRzIHsKLQkJaWYgeyRvcHQgPT0gIi1SIn0gewotCQkJc2V0IGRvY21kICItUiIKLQkJCWNvbnRpbnVlCi0JCX0gZWxzZWlmIHskb3B0ID09ICItUSJ9IHsKLQkJCXNldCBkb2NtZCAiLVEiCi0JCQljb250aW51ZQotCQl9Ci0KLQkJaWYgeyRkb2NtZCA9PSAiIn0gewotCQkJY29udGludWUKLQkJfSBlbHNlaWYgeyRkb2NtZCA9PSAiLVIifSB7Ci0JCQlzZXQgc3RyICJjbWQ9JG9wdCIKLQkJfSBlbHNlaWYgeyRkb2NtZCA9PSAiLVEifSB7Ci0JCQlzZXQgc3RyICJxcnk9JG9wdCIKLQkJfSBlbHNlIHsKLQkJCXNldCBkb2NtZCAiIgotCQkJY29udGludWUKLQkJfQotCi0JCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciAicnVuX3JlbW90ZV9jbWRfdmlhX3NvY2s6ICRkb2NtZCBcIiRzdHJcIiJ9Ci0JCWNhdGNoIHtwdXRzICRjbGllbnRfc29jayAkc3RyfQotCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgInJ1bl9yZW1vdGVfY21kX3ZpYV9zb2NrOiBmbHVzaCJ9Ci0JCWNhdGNoIHtmbHVzaCAkY2xpZW50X3NvY2t9Ci0JCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciAicnVuX3JlbW90ZV9jbWRfdmlhX3NvY2s6IGdldHMifQotCQljYXRjaCB7Z2V0cyAkY2xpZW50X3NvY2sgcmVzfQotCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgInJ1bl9yZW1vdGVfY21kX3ZpYV9zb2NrOiBcIiRyZXNcIiJ9Ci0JCXNldCByZXMgW3N0cmluZyB0cmltICRyZXNdCi0KLQkJaWYgW3JlZ2V4cCB7PWNsaWVudHM6fSAkcmVzXSB7Ci0JCQlyZWdzdWIge14uKj1jbGllbnRzOn0gJHJlcyAiIiBjcmVzCi0JCQlyZWdzdWIgeyxhcm89LiokfSAkY3JlcyAiIiBjcmVzCi0JCQlyZWdzdWIgeyxhbnM9LiokfSAkY3JlcyAiIiBjcmVzCi0JCQlpZiB7JGNyZXMgPT0gIm5vbmUifSB7Ci0JCQkJc2V0IGNyZXMgIiIKLQkJCX0KLQkJCXVwZGF0ZV9jbGllbnRzX21lbnUgJGNyZXMKLQkJCXNldCBjbGllbnRfc3RyICRjcmVzCi0JCQlzZXRfY2xpZW50X2JhbGxvb24gJGNyZXMKLQkJfQotCi0JCWlmIFtyZWdleHAge15jbGllbnRzOn0gJHJlc10gewotCQkJcmVnc3ViIHteY2xpZW50czp9ICRyZXMgIiIgdG1wCi0JCQlpZiB7JHRtcCA9PSAibm9uZSJ9IHsKLQkJCQlzZXQgdG1wICIiCi0JCQl9Ci0JCQl1cGRhdGVfY2xpZW50c19tZW51ICR0bXAKLQkJCXNldCBjbGllbnRfc3RyICR0bXAKLQkJCXNldF9jbGllbnRfYmFsbG9vbiAkdG1wCi0KLQkJCWlmICFbcmVnZXhwIHteY2xpZW50c30gJG9wdF0gewotCQkJCSMgd2UgY291bGQgYmxvY2sgaGVyZS4uLgotCQkJCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciAicnVuX3JlbW90ZV9jbWRfdmlhX3NvY2s6IGdldHMifQotCQkJCWdldHMgJGNsaWVudF9zb2NrIHJlcwotCQkJCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciAicnVuX3JlbW90ZV9jbWRfdmlhX3NvY2s6IFwiJHJlc1wiIn0KLQkJCQlzZXQgcmVzIFtzdHJpbmcgdHJpbSAkcmVzXQotCQkJfQotCQl9Ci0KLQkJc2V0IGRvY21kICIiCi0KLQkJaWYgeyRyZXMgIT0gIiJ9IHsKLQkJCWFwcGVuZCByZXN1bHQgIiRyZXNcbiIKLQkJfQotCX0KLQkKLQlzZXR1cF9jbGllbnRfc29jayAxCi0KLQlzZXQgcmVzdWx0IFtzdHJpbmcgdHJpbSAkcmVzdWx0XQotCi0JcmV0dXJuICRyZXN1bHQKLX0KLQotcHJvYyBydW5fcmVtb3RlX2NtZCB7b3B0c30gewotCWdsb2JhbCBtZW51X3ZhciB4MTF2bmNfcHJvZyB4MTF2bmNfY21kbGluZSB4MTF2bmNfeGRpc3BsYXkKLQlnbG9iYWwgeDExdm5jX2F1dGhfZmlsZSB4MTF2bmNfY29ubmVjdF9maWxlCi0JZ2xvYmFsIGNsaWVudF9zb2NrCi0KLQlzZXQgZGVidWcgW2luX2RlYnVnX21vZGVdCi0KLQlpZiB7W2xpbmRleCAkb3B0cyAwXSA9PSAiLVIiICYmIFtsaW5kZXggJG9wdHMgMV0gPT0gIm5vcmVtb3RlIn0gewotCQlzZXQgc3RyIFtqb2luICRvcHRzXQotCQlpZiAhW2RvdWJsZV9jaGVja19ub3JlbW90ZV0gewotCQkJYXBwZW5kX3RleHQgInNraXBwaW5nOiB4MTF2bmMgJHN0ciIKLQkJCXJldHVybiAiIgotCQl9IGVsc2UgewotCQkJYXBwZW5kX3RleHQgInJ1bm5pbmc6IHgxMXZuYyAkc3RyIChwbGVhc2UgZG8gXCJBY3Rpb25zIC0+IGRldGFjaFwiIHRvIGNsZWFuIHRoaW5ncyB1cClcbiIKLQkJCWFwcGVuZF90ZXh0ICJzdWJzZXF1ZW50IC1SLy1RIGNvbW1hbmRzIHNob3VsZCBmYWlsLi4uIgotCQl9Ci0JfQotCi0JaWYgeyRjbGllbnRfc29jayAhPSAiIn0gewotCQltZW51c19kaXNhYmxlCi0JCXN0b3Bfd2F0Y2ggb24KLQkJc2V0IHJlc3VsdCBbcnVuX3JlbW90ZV9jbWRfdmlhX3NvY2sgJG9wdHNdCi0JCXN0b3Bfd2F0Y2ggb2ZmCi0JCW1lbnVzX2VuYWJsZQotCQlpZiB7JHJlc3VsdCAhPSAiZmFpbCJ9IHsKLQkJCXJldHVybiAkcmVzdWx0Ci0JCX0KLQl9Ci0KLQlzZXQgY21kICIiCi0KLQlsYXBwZW5kIGNtZCAkeDExdm5jX3Byb2c7Ci0KLQlpZiB7JHgxMXZuY19jb25uZWN0X2ZpbGUgIT0gIiJ9IHsKLQkJbGFwcGVuZCBjbWQgIi1jb25uZWN0IgotCQlsYXBwZW5kIGNtZCAkeDExdm5jX2Nvbm5lY3RfZmlsZQotCX0gZWxzZSB7Ci0JCWlmIHskeDExdm5jX3hkaXNwbGF5ICE9ICIifSB7Ci0JCQlsYXBwZW5kIGNtZCAiLWRpc3BsYXkiCi0JCQlsYXBwZW5kIGNtZCAkeDExdm5jX3hkaXNwbGF5Ci0JCX0KLQkJaWYgeyR4MTF2bmNfYXV0aF9maWxlICE9ICIifSB7Ci0JCQlsYXBwZW5kIGNtZCAiLWF1dGgiCi0JCQlsYXBwZW5kIGNtZCAkeDExdm5jX2F1dGhfZmlsZQotCQl9Ci0JfQotCWxhcHBlbmQgY21kICItc3luYyIKLQlmb3JlYWNoIHdvcmQgJG9wdHMgewotCQlsYXBwZW5kIGNtZCAkd29yZAotCX0KLQlsYXBwZW5kIGNtZCAiMj4iCi0JbGFwcGVuZCBjbWQgIi9kZXYvbnVsbCIKLQotCWlmIHswIHx8ICRkZWJ1Z30gewotCQlzZXQgc3RyIFtqb2luICRjbWRdCi0JCXB1dHMgInJ1bm5pbmc6ICRzdHIiCi0JCWZvcmVhY2ggd29yZCAkY21kIHsKLQkJCXB1dHMgIiAgIHdvcmQ6ICR3b3JkIgotCQl9Ci0JfQotCi0Jc2V0IG91dHB1dCAiIgotCW1lbnVzX2Rpc2FibGUKLQotCXN0b3Bfd2F0Y2ggb24KLQljYXRjaCB7c2V0IG91dHB1dCBbZXZhbCBleGVjICRjbWRdfQotCXN0b3Bfd2F0Y2ggb2ZmCi0KLQltZW51c19lbmFibGUKLQlpZiB7JGRlYnVnfSB7Ci0JCWlmIHtbc3RyaW5nIGxlbmd0aCAkb3V0cHV0XSA+IDEwMH0gewotCQkJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRvdXRwdXQgMCAxMDBdCi0JCQlhcHBlbmRfdGV4dCAib3V0cHV0OiAkc3RyIC4uLlxuIgotCQl9IGVsc2UgewotCQkJYXBwZW5kX3RleHQgIm91dHB1dDogJG91dHB1dFxuIgotCQl9Ci0JfQotCXJldHVybiAkb3V0cHV0Ci19Ci0KLXByb2MgdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbCB7e24gMn19IHsKLQlmb3Ige3NldCBpIDB9IHskaSA8ICRufSB7aW5jciBpfSB7Ci0JCWlmIHskaSA+IDB9IHsKLQkJCWFmdGVyIDUwMAotCQkJYXBwZW5kX3RleHQgInRyeWluZyBhZ2FpbiAuLi5cbiIKLQkJfQotCQlpZiB7W3RyeV9jb25uZWN0XX0gewotCQkJcXVlcnlfYWxsCi0JCQlicmVhawotCQl9Ci0JfQotfQotCi1wcm9jIHRyeV9jb25uZWN0IHt9IHsKLQlnbG9iYWwgeDExdm5jX3hkaXNwbGF5IGNvbm5lY3RlZF90b194MTF2bmMgcmVwbHlfeGRpc3BsYXkKLQlnbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyCi0KLQlzZXQgZGIgMAotI2R0aW1lIGMxCi0KLQlpZiB7ISAkY29ubmVjdGVkX3RvX3gxMXZuY30gewotCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKGRpc3BsYXkpXX0gewotCQkJc2V0IGQgJG1lbnVfdmFyKGRpc3BsYXkpCi0JCQlpZiB7JGQgIT0gIiIgJiYgJGQgIT0gJHVuc2V0X3N0ciAmJiAkZCAhPSAkeDExdm5jX3hkaXNwbGF5fSB7Ci0JCQkJc2V0IHgxMXZuY194ZGlzcGxheSAkbWVudV92YXIoZGlzcGxheSkKLQkJCQlhcHBlbmRfdGV4dCAiU2V0dGluZyBYIGRpc3BsYXkgdG86ICR4MTF2bmNfeGRpc3BsYXlcbiIKLQkJCX0KLQkJfQotCX0KLQotCXNldF9pbmZvICJQaW5naW5nICR4MTF2bmNfeGRpc3BsYXkgLi4uIgotCXNldCByYXJncyBbbGlzdCAiLVEiICJwaW5nIl0KLQlzZXQgcmVzdWx0IFtydW5fcmVtb3RlX2NtZCAkcmFyZ3NdCi0jZHRpbWUgYzJhCi0KLQlpZiB7JGRifSB7cHV0cyAidHJ5X2Nvbm5lY3Q6IFwiJHJlc3VsdFwiIn0KLQotCWlmIHtbcmVnZXhwIHteYW5zPXBpbmc6fSAkcmVzdWx0XX0gewotCQlyZWdzdWIge15hbnM9cGluZzp9ICRyZXN1bHQge30gcmVwbHlfeGRpc3BsYXkKLQkJc2V0IG1zZyAiQ29ubmVjdGVkIHRvICRyZXBseV94ZGlzcGxheSIKLQkJc2V0X2luZm8gJG1zZwotCQlhcHBlbmRfdGV4dCAiJG1zZ1xuIgotCQlzZXRfY29ubmVjdGVkIHllcwotCi0JCXNldHVwX2NsaWVudF9jaGFubmVsCi0jZHRpbWUgYzJiCi0JCXNldHVwX2NsaWVudF9zb2NrIDEKLQkJc2V0dXBfY2xpZW50X3RhaWwKLQotCQlmZXRjaF9kaXNwbGF5cwotI2R0aW1lIGMzYQotCQlyZXR1cm4gMQotCX0gZWxzZSB7Ci0JCXNldCBzdHIgIngxMXZuYyBzZXJ2ZXIuIgotCQlpZiB7JHgxMXZuY194ZGlzcGxheSAhPSAiIn0gewotCQkJc2V0IHN0ciAkeDExdm5jX3hkaXNwbGF5Ci0JCX0KLQkJc2V0IG1zZyAiTm8gcmVwbHkgZnJvbSAkc3RyIgotCQlzZXRfaW5mbyAkbXNnCi0JCWFwcGVuZF90ZXh0ICIkbXNnXG4iCi0JCXNldF9jb25uZWN0ZWQgbm8KLQkJcmV0dXJuIDAKLQl9Ci19Ci0KLXByb2Mgc2V0X3ZpZXdfdmFyaWFibGUge3ZhbH0gewotCWdsb2JhbCBtZW51X3ZhcgotCXNldCBtZW51X3ZhcihXaW5kb3dWaWV3KSAkdmFsCi19Ci1wcm9jIGdldF92aWV3X3ZhcmlhYmxlIHt9IHsKLQlnbG9iYWwgbWVudV92YXIKLQlpZiB7IVtpbmZvIGV4aXN0cyBtZW51X3ZhcihXaW5kb3dWaWV3KV19IHsKLQkJc2V0IG1lbnVfdmFyKFdpbmRvd1ZpZXcpICJub25lIgotCX0KLQlyZXR1cm4gJG1lbnVfdmFyKFdpbmRvd1ZpZXcpCi19Ci0KLXByb2MgZG9ubyB7YSBiIGN9IHsKLQlleGl0IDE7Ci19Ci0KLXByb2MgZG9fcG9ydF9wcm9tcHQge30gewotCWdsb2JhbCBiZm9udCBmZm9udAotCWdsb2JhbCBwb3J0X3JlcGx5IHBvcnRfc2V0Ci0KLQlzZXQgZ3Vlc3MgNTkwMAotCWZvciB7c2V0IGkgMH0geyRpIDwgNTB9IHtpbmNyIGl9IHsKLQkJc2V0IGZoICIiCi0JCXNldCB0cnkgW2V4cHIgJGd1ZXNzICsgJGldCi0JCWNhdGNoIHtzZXQgZmggW3NvY2tldCAtc2VydmVyIGRvbm8gJHRyeV19Ci0JCWlmIHskZmggIT0gIiJ9IHsKLQkJCWNhdGNoIHtjbG9zZSAkZmh9Ci0JCQlzZXQgZ3Vlc3MgJHRyeQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0Jc2V0IGhuICIiCi0JY2F0Y2gge3NldCBobiBbZXhlYyB1bmFtZSAtbl19Ci0JaWYgeyRobiA9PSAiIn0gewotCQlzZXQgaG4gImhvc3RuYW1lIgotCX0KLQotCXNldCB0ZXh0ICIgU2V0IHRoZSB4MTF2bmMgTGlzdGVuaW5nIFBvcnQ6Ci0KLSAgICBWTkMgRGlzcGxheSA6MCBjb3JyZXNwb25kcyB0byBUQ1AgcG9ydCA1OTAwCi0gICAgVk5DIERpc3BsYXkgOjEgY29ycmVzcG9uZHMgdG8gVENQIHBvcnQgNTkwMQotICAgIGV0Yy4KLQotIEluIHRoZSBFbnRyeSBiZWxvdywgaW5kaWNhdGUgYSBQb3J0IGZvciB4MTF2bmMgdG8gbGlzdGVuIG9uLiAKLQotIE5vdGUgdGhhdCB0byBjb25uZWN0IHRvIHgxMXZuYywgYSBWTkMgVmlld2VyIHdpbGwgbmVlZCB0bwotIGtub3cgeW91ciBzZWxlY3Rpb24sIGZvciBleGFtcGxlOgotCi0gICAgdm5jdmlld2VyICRobjowCi0gICAgdm5jdmlld2VyICRobjoxCi0gICAgZXRjLgotCi0gWW91ciBmaXJld2FsbCBtYXkgYmxvY2sgaW5jb21pbmcgY29ubmVjdGlvbnMgdG8gVENQIHBvcnRzOwotIGlmIGl0IGRvZXMgeW91IG1heSBuZWVkIHRvIHJlY29uZmlndXJlIGl0LiAKLSAgICAKLSBZb3UgY2FuIGFsc28gc2V0IHNvbWUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOgotCi0gICAgLSBFbmFibGUgU1NMIGVuY3J5cHRpb24uCi0gICAgICAocmVxdWlyZXMgYW4gU1NMIGVuYWJsZWQgdm5jdmlld2VyLCBzdWNoIGFzIFNTVk5DKSAgCi0gICAgLSBMaXN0ZW4gb25seSBvbiBsb2NhbGhvc3QuIChlLmcuIGZvciBhbiBTU0ggdHVubmVsKQotICAgIC0gRW5hYmxlIFVsdHJhVk5DIG9yIFRpZ2h0Vk5DIEZpbGUgdHJhbnNmZXIuCi0iCi0Jc2V0IHBvcnRfc2V0ICRndWVzcwotCXNldCBwb3J0X3JlcGx5ICIiCi0KLQl0b3BsZXZlbCAucHAKLQl3bSB0aXRsZSAucHAgIlNlbGVjdCB4MTF2bmMgcG9ydCIKLQotCXdtIHByb3RvY29sIC4gICBXTV9ERUxFVEVfV0lORE9XICJkZXN0cm95IC47IGV4aXQiCi0Jd20gcHJvdG9jb2wgLnBwIFdNX0RFTEVURV9XSU5ET1cgImRlc3Ryb3kgLnBwOyBleGl0IgotCi0JbGFiZWwgLnBwLm0gLXRleHQgIiR0ZXh0IiAtcmVsaWVmIHJpZGdlIC1qdXN0aWZ5IGxlZnQgLWZvbnQgJGZmb250Ci0KLQlnbG9iYWwgdGtfdmVyc2lvbgotCXNldCB0a29sZCAwCi0JaWYgW2luZm8gZXhpc3RzIHRrX3ZlcnNpb25dIHsKLQkJaWYgW3JlZ2V4cCB7XjhcLlswLTNdJH0gJHRrX3ZlcnNpb25dIHsKLQkJCXNldCB0a29sZCAxCi0JCX0KLQkJaWYgW3JlZ2V4cCB7XlszLTddXC59ICR0a192ZXJzaW9uXSB7Ci0JCQlzZXQgdGtvbGQgMQotCQl9Ci0JfQotCi0JaWYgeyR0a29sZH0gewotCQlmcmFtZSAucHAuZiAtYmQgMSAtcmVsaWVmIHJpZGdlCi0JfSBlbHNlIHsKLQkJZnJhbWUgLnBwLmYgLWJkIDEgLXJlbGllZiByaWRnZSAtcGFkeSAyCi0JfQotCWxhYmVsIC5wcC5mLmwgLXRleHQgIlBvcnQ6ICIgLWZvbnQgJGJmb250Ci0JZW50cnkgLnBwLmYuZSAtd2lkdGggOCAtdGV4dHZhcmlhYmxlIHBvcnRfc2V0IC1mb250ICRmZm9udAotCWdsb2JhbCBlbmFibGVfc3NsOyBzZXQgZW5hYmxlX3NzbCAwCi0JaWYgW2luZm8gZXhpc3RzIGVudihYMTFWTkNfU1NMX0VOQUJMRUQpXSB7Ci0JCXNldCBlbmFibGVfc3NsIDEKLQl9Ci0JY2hlY2tidXR0b24gLnBwLmYuc3NsIC1yZWxpZWYgcmFpc2VkIC1wYWR5IDMgLXBhZHggMyAtdGV4dCAiRW5hYmxlIFNTTCIgLXZhcmlhYmxlIGVuYWJsZV9zc2wgLWZvbnQgJGJmb250Ci0JZ2xvYmFsIGxvY2FsaG9zdDsgc2V0IGxvY2FsaG9zdCAwCi0JaWYgW2luZm8gZXhpc3RzIGVudihYMTFWTkNfTE9DQUxIT1NUX0VOQUJMRUQpXSB7Ci0JCXNldCBsb2NhbGhvc3QgMQotCX0KLQljaGVja2J1dHRvbiAucHAuZi5sb2MgLXJlbGllZiByYWlzZWQgLXBhZHkgMyAtcGFkeCAzIC10ZXh0ICJMaXN0ZW4gb24gbG9jYWxob3N0IiAtdmFyaWFibGUgbG9jYWxob3N0IC1mb250ICRiZm9udAotCXBhY2sgLnBwLmYubCAucHAuZi5lIC1zaWRlIGxlZnQKLQlwYWNrIC5wcC5mLmxvYyAucHAuZi5zc2wgLXNpZGUgcmlnaHQKLQotCWlmIHskdGtvbGR9IHsKLQkJZnJhbWUgLnBwLnQgLWJkIDEgLXJlbGllZiByaWRnZQotCX0gZWxzZSB7Ci0JCWZyYW1lIC5wcC50IC1iZCAxIC1yZWxpZWYgcmlkZ2UgLXBhZHkgMgotCX0KLQlnbG9iYWwgZmlsZV90cmFuc2Zlcjsgc2V0IGZpbGVfdHJhbnNmZXIgIm5vbmUiCi0JaWYgW2luZm8gZXhpc3RzIGVudihYMTFWTkNfRklMRVRSQU5TRkVSX0VOQUJMRUQpXSB7Ci0JCXNldCBmaWxlX3RyYW5zZmVyICRlbnYoWDExVk5DX0ZJTEVUUkFOU0ZFUl9FTkFCTEVEKQotCX0KLQlsYWJlbCAucHAudC5sIC10ZXh0ICJGaWxlIFRyYW5zZmVyOiAiIC1mb250ICRiZm9udAotCXJhZGlvYnV0dG9uIC5wcC50Lm5vbmUgIC10ZXh0ICJOb25lIiAtdmFyaWFibGUgZmlsZV90cmFuc2ZlciAtdmFsdWUgIm5vbmUiIC1mb250ICRiZm9udAotCXJhZGlvYnV0dG9uIC5wcC50LnVsdHJhIC10ZXh0ICJVbHRyYVZOQyIgLXZhcmlhYmxlIGZpbGVfdHJhbnNmZXIgLXZhbHVlICJ1bHRyYSIgLWZvbnQgJGJmb250Ci0JcmFkaW9idXR0b24gLnBwLnQudGlnaHQgLXRleHQgIlRpZ2h0Vk5DIiAtdmFyaWFibGUgZmlsZV90cmFuc2ZlciAtdmFsdWUgInRpZ2h0IiAtZm9udCAkYmZvbnQKLQlwYWNrIC5wcC50LmwgLnBwLnQubm9uZSAucHAudC51bHRyYSAucHAudC50aWdodCAtc2lkZSBsZWZ0Ci0KLQlmcmFtZSAucHAubyAtYmQgMSAtcmVsaWVmIHJpZGdlCi0JYnV0dG9uIC5wcC5vLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgInNldCBwb3J0X3JlcGx5IDE7IGRlc3Ryb3kgLnBwIiAtZm9udCAkYmZvbnQKLQlidXR0b24gLnBwLm8uY2FuY2VsIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kICJzZXQgcG9ydF9yZXBseSAwOyBkZXN0cm95IC5wcCIgLWZvbnQgJGJmb250Ci0JcGFjayAucHAuby5vayAucHAuby5jYW5jZWwgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMQotCXBhY2sgLnBwLm0gLXNpZGUgdG9wIC1maWxsIHggLWV4cGFuZCAxIAotCXBhY2sgLnBwLmYgLnBwLnQgLnBwLm8gLXNpZGUgdG9wIC1maWxsIHgKLQotCWZvY3VzIC5wcC5mLmUKLQkucHAuZi5lIGljdXJzb3IgZW5kCi0KLQl3bSB3aXRoZHJhdyAucHAKLQl1cGRhdGUKLQljZW50ZXJfd2luIC5wcAotCi0Jd20gbWluc2l6ZSAucHAgW3dpbmZvIHdpZHRoIC5wcF0gW3dpbmZvIGhlaWdodCAucHBdCi0KLQliaW5kIC5wcC5mLmUgPEtleVByZXNzLVJldHVybj4gInNldCBwb3J0X3JlcGx5IDE7IGRlc3Ryb3kgLnBwIgotCi0JdndhaXQgcG9ydF9yZXBseQotCi0JaWYgeyRwb3J0X3JlcGx5fSB7Ci0JCXJlZ3N1YiAtYWxsIHteOn0gJHBvcnRfc2V0ICIiIHBvcnRfc2V0Ci0JCXJlZ3N1YiAtYWxsIHtbIFx0XX0gJHBvcnRfc2V0ICIiIHBvcnRfc2V0Ci0JCWlmIHtbcmVnZXhwIHteWzAtOV1bMC05XSokfSAkcG9ydF9zZXRdfSB7Ci0JCQlpZiB7JHBvcnRfc2V0IDwgMH0gewotCQkJCXNldCBwb3J0X3NldCBbZXhwciAwIC0gJHBvcnRfc2V0XQotCQkJfSBlbHNlaWYgeyRwb3J0X3NldCA8IDIwMH0gewotCQkJCXNldCBwb3J0X3NldCBbZXhwciAkcG9ydF9zZXQgKyA1OTAwXQotCQkJfSAKLQkJCXB1dHMgIiRwb3J0X3NldDpzc2wke2VuYWJsZV9zc2x9OmxvY2FsaG9zdCRsb2NhbGhvc3Q6ZnRfJGZpbGVfdHJhbnNmZXIiCi0JCX0KLQl9Ci19Ci0KLXByb2MgY2hhbmdlX3ZpZXdfc3RhdGUge30gewotCWdsb2JhbCBtZW51X3ZhciBndWlfY3VycmVudF9zdGF0ZQotCi0Jc2V0IG5ldyBbZ2V0X3ZpZXdfdmFyaWFibGVdCi0KLQlpZiB7IVtpbmZvIGV4aXN0cyBndWlfY3VycmVudF9zdGF0ZV19IHsKLQkJc2V0IGd1aV9jdXJyZW50X3N0YXRlICIiCi0JfQotCXNldCBvbGQgJGd1aV9jdXJyZW50X3N0YXRlCi0JI3B1dHMgIiRvbGQgLT4gJG5ldyIKLQotCWlmIHskb2xkID09ICRuZXd9IHsKLQkJcmV0dXJuCi0JfQotCi0JaWYgeyRvbGQgPT0gImZ1bGwiIHx8ICRvbGQgPT0gImljb24iIHx8ICRvbGQgPT0gInRyYXkifSB7Ci0JCTsKLQl9IGVsc2UgewotCQlzZXQgb2xkICJub25lIgotCX0KLQotCWlmIHskbmV3ID09ICJmdWxsIiB8fCAkbmV3ID09ICJpY29uIiB8fCAkbmV3ID09ICJ0cmF5In0gewotCQlpZiB7JG9sZCA9PSAidHJheSJ9IHsKLQkJCSMgc2lnaCBYUmVwYXJlbnRXaW5kb3cgd291bGQgYmUgdG9vIGVhc3kuLi4KLQkJCSMgdW5kb190cmF5X2VtYmVkCi0JCQlyZXN0YXJ0X2V2ZXJ5dGhpbmcgJG5ldwotCQkJZGVzdHJveSAuCi0JCQlleGl0Ci0JCX0KLQkJbWFrZV9ndWkgJG5ldwotCQlpZiB7JG5ldyA9PSAidHJheSJ9IHsKLQkJCXdtIHdpdGhkcmF3IC4KLQkJfQotCX0gZWxzZSB7Ci0JCXNldF92aWV3X3ZhcmlhYmxlICRvbGQKLQl9Ci19Ci0KLXByb2Mgc2V0dXBfY2xpZW50X3RhaWwge30gewotCWdsb2JhbCBjbGllbnRfdGFpbAotCWlmIHskY2xpZW50X3RhaWwgIT0gIiJ9IHsKLQkJZmlsZWV2ZW50ICRjbGllbnRfdGFpbCByZWFkYWJsZSByZWFkX2NsaWVudF90YWlsCi0JfQotfQotCi1wcm9jIHNldHVwX2NsaWVudF9zb2NrIHt7ZW5hYmxlIDF9fSB7Ci0JZ2xvYmFsIGNsaWVudF9zb2NrCi0JaWYgeyRjbGllbnRfc29jayAhPSAiIn0gewotCQlpZiB7JGVuYWJsZX0gewotCQkJZmlsZWV2ZW50ICRjbGllbnRfc29jayByZWFkYWJsZSByZWFkX2NsaWVudF9zb2NrCi0JCX0gZWxzZSB7Ci0JCQlmaWxlZXZlbnQgJGNsaWVudF9zb2NrIHJlYWRhYmxlICIiCi0JCX0KLQl9Ci19Ci0KLXByb2Mgc2V0dXBfdHJheV9lbWJlZCB7fSB7Ci0JdXBkYXRlCi0Jc2V0IHcgW3dpbmZvIHdpZHRoIC5dCi0Jc2V0IGggW3dpbmZvIGhlaWdodCAuXQotCWlmIHskdyA8IDI0fSB7Ci0JCXNldCB3IDI0Ci0JfQotCWlmIHskaCA8IDI0fSB7Ci0JCXNldCBoIDI0Ci0JfQotCXdtIG1pbnNpemUgLiAkdyAkaAotCXNldCB3aWQgW3dpbmZvIGlkIC5dCQotCXB1c2hfbmV3X3ZhbHVlICJyZW1vdGUtY21kIiAicmVtb3RlLWNtZCIgInRyYXllbWJlZDokd2lkIiAwCi19Ci0KLXByb2MgcmVzdGFydF9ldmVyeXRoaW5nIHtndWlfbW9kZX0gewotCWdsb2JhbCBlbnYgZ3VpX2FyZ3YwIHgxMXZuY19wcm9nIGZ1bGxfd2luCi0JZ2xvYmFsIGljb25fbW9kZV9hdF9zdGFydHVwCi0JZ2xvYmFsIHRyYXlfZW1iZWQgdHJheV9ydW5uaW5nCi0JaWYgeyRndWlfbW9kZSA9PSAiZnVsbCJ9IHsKLQkJc2V0IGVudihYMTFWTkNfSUNPTl9NT0RFKSAwCi0JfSBlbHNlaWYgeyRndWlfbW9kZSA9PSAiaWNvbiJ9IHsKLQkJc2V0IGVudihYMTFWTkNfSUNPTl9NT0RFKSAxCi0JfSBlbHNlaWYgeyRndWlfbW9kZSA9PSAidHJheSJ9IHsKLQkJaWYgeyR0cmF5X3J1bm5pbmd9IHsKLQkJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERSkgIlJVTk5JTkciCi0JCX0gZWxzZSB7Ci0JCQlzZXQgZW52KFgxMVZOQ19JQ09OX01PREUpICJUUkFZIgotCQl9Ci0JfQotCXB1dHMgc3RkZXJyICIiCi0JcHV0cyBzdGRlcnIgInRreDExdm5jOiByZXN0YXJ0aW5nIGd1aSB0byBsZWF2ZSB0cmF5IG1vZGUuIgotCXB1dHMgc3RkZXJyICIgIG5ldyBndWkgd2lsbCBiZSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLiIKLQlwdXRzIHN0ZGVyciAiICB1c2Uga2lsbCgxKSByYXRoZXIgdGhhbiBDdHJsLUMgdG8ga2lsbCBpdC4iCi0JcHV0cyBzdGRlcnIgIiIKLQlpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfUkVTVEFSVF9ERVBUSCldfSB7Ci0JCXNldCBuICRlbnYoWDExVk5DX1JFU1RBUlRfREVQVEgpCi0JCWluY3IgbgotCQlzZXQgZW52KFgxMVZOQ19SRVNUQVJUX0RFUFRIKSAkbgotCX0gZWxzZSB7Ci0JCXNldCBlbnYoWDExVk5DX1JFU1RBUlRfREVQVEgpIDAKLQl9Ci0Jc2V0IGVudihYMTFWTkNfSUNPTl9TRVRQQVNTKSAiIgotCi0JaWYgeyFbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19XSVNIQ01EKV19IHsKLQkJcHV0cyBzdGRlcnIgImZhaWx1cmUgaW4gcmVzdGFydF9ldmVyeXRoaW5nLiIKLQkJZXhpdCAxOwotCX0KLQotCXNldCBjb2RlIFtleGVjICR4MTF2bmNfcHJvZyAtcHJpbnRndWldCi0JaWYge1tzdHJpbmcgbGVuZ3RoICRjb2RlXSA8IDIwMDAwfSB7Ci0JCXB1dHMgc3RkZXJyICJmYWlsdXJlIGluIHJlc3RhcnRfZXZlcnl0aGluZy4iCi0JCWV4aXQgMTsKLQl9Ci0Jc2V0IHRtcCAiL3RtcC94MTF2bmNbcGlkXSIKLQlhcHBlbmQgdG1wIFtjbG9jayBjbGlja3NdCi0Jc2V0IHRtcDIgIiIKLQljYXRjaCB7c2V0IHRtcDIgW2V4ZWMgbWt0ZW1wICR0bXAuWFhYWFhYIDI+L2Rldi9udWxsXX0KLQlpZiB7JHRtcDIgIT0gIiIgJiYgW2ZpbGUgZXhpc3RzICR0bXAyXX0gewotCQlzZXQgdG1wICR0bXAyCi0JfSBlbHNlIHsKLQkJZmlsZSBkZWxldGUgLWZvcmNlICR0bXAKLQkJaWYge1tmaWxlIGV4aXN0cyAkdG1wXX0gewotCQkJcHV0cyBzdGRlcnIgImZhaWx1cmUgaW4gcmVzdGFydF9ldmVyeXRoaW5nLiIKLQkJCWV4aXQgMTsKLQkJfQotCX0KLQlzZXQgZmggW29wZW4gJHRtcCAiYSJdCi0JaWYgeyFbZmlsZSBvd25lZCAkdG1wXX0gIHsKLQkJcHV0cyBzdGRlcnIgImZhaWx1cmUgaW4gcmVzdGFydF9ldmVyeXRoaW5nLiIKLQkJZXhpdCAxOwotCX0KLQlmaWxlIGF0dHJpYnV0ZXMgJHRtcCAtcGVybWlzc2lvbnMgIjA0MDAiCi0JcHV0cyAkZmggJGNvZGUKLQljbG9zZSAkZmgKLQotCSNwdXRzIHN0ZGVyciBbZXhlYyBscyAtbCAkdG1wXQotCi0Jd20gd2l0aGRyYXcgLgotCWNhdGNoIHt3bSB3aXRoZHJhdyAkZnVsbF93aW59Ci0JdXBkYXRlCi0KLQlleGVjICRlbnYoWDExVk5DX1dJU0hDTUQpICR0bXAgJgotCWFmdGVyIDIwMDAKLQlmaWxlIGRlbGV0ZSAtZm9yY2UgJHRtcAotCQotCWRlc3Ryb3kgLgotCWV4aXQKLX0KLQotcHJvYyB1bmRvX3RyYXlfZW1iZWQge30gewotCXNldCB3aWQgW3dpbmZvIGlkIC5dCQotCXB1c2hfbmV3X3ZhbHVlICJyZW1vdGUtY21kIiAicmVtb3RlLWNtZCIgInRyYXl1bmVtYmVkOiR3aWQiIDAKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBtYWluOgotCi1pZiBbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfVElNRSldIHsKLQlkdGltZSBNCi19Ci0KLXdtIHdpdGhkcmF3IC4KLQotZ2xvYmFsIGVudiB4MTF2bmNfcHJvZyB4MTF2bmNfY21kbGluZSB4MTF2bmNfeGRpc3BsYXkgeDExdm5jX2Nvbm5lY3Q7Ci1nbG9iYWwgeDExdm5jX3hkaXNwbGF5MAotZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZSB4MTF2bmNfZ3VpX2dlb20geDExdm5jX3N0YXJ0ZWQgdm5jX3VybAotZ2xvYmFsIHgxMXZuY19ndWlfcGFyYW1zCi1nbG9iYWwgeDExdm5jX2F1dGhfZmlsZSB4MTF2bmNfY29ubmVjdF9maWxlIGJlZ2lubmVyX21vZGUgc2ltcGxlX2d1aV9jcmVhdGVkCi1nbG9iYWwgaGVscGFsbCBoZWxwdGV4dCBoZWxwcmVtb3RlIGhlbHBsYWJlbCBob3N0bmFtZSBvc25hbWUKLWdsb2JhbCBhbGxfc2V0dGluZ3MgcmVwbHlfeGRpc3BsYXkgYWx3YXlzX3VwZGF0ZQotZ2xvYmFsIG1heF90ZXh0X2hlaWdodCBtYXhfdGV4dF93aWR0aAotZ2xvYmFsIHRleHRfaGVpZ2h0Ci1nbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyIG1lbnVzX2Rpc2FibGVkCi1nbG9iYWwgYmZvbnQgZmZvbnQgc2ZvbnQgc25mb250IG9sZF9sYWJlbHMgaGF2ZV9sYWJlbGZyYW1lcwotZ2xvYmFsIGNvbm5lY3RlZF90b194MTF2bmMKLWdsb2JhbCBjYWNoZV9hbGxfcXVlcnlfdmFycwotZ2xvYmFsIGxhc3RfcXVlcnlfYWxsX3RpbWUgcXVlcnlfYWxsX2ZyZXEgY2xpZW50X3RhaWwgY2xpZW50X3NvY2sgY2xpZW50X2luZm9fcmVhZAotZ2xvYmFsIGljb25fbW9kZSBpY29uX21vZGVfYXRfc3RhcnR1cCB4MTF2bmNfaWNvbl9tb2RlCi1nbG9iYWwgdHJheV9lbWJlZCB0cmF5X3J1bm5pbmcgaWNvbl9zZXRwYXNzd2QgaWNvbl9lbWJlZF9pZAotZ2xvYmFsIGljb25fbm9hZHZhbmNlZCBpY29uX21pbmltYWwKLWdsb2JhbCBtYWtlX2d1aV9jb3VudCB0ZXh0X2FyZWFfc3RyCi1nbG9iYWwgZ3VpX2FyZ3YwIGd1aV9zdGFydF9tb2RlCi1nbG9iYWwgc2NyZWVuX2hlaWdodCBzY3JlZW5fd2lkdGgKLQotc2V0IHVuc2V0X3N0ciAiKHVuc2V0KSIKLXNldCB2bmNfdXJsICR1bnNldF9zdHIKLXNldCBjb25uZWN0ZWRfdG9feDExdm5jIDAKLXNldCBtZW51c19kaXNhYmxlZCAwCi1zZXQgbWF4X3RleHRfaGVpZ2h0IDQwCi1zZXQgbWF4X3RleHRfd2lkdGggOTAKLXNldCB0ZXh0X2hlaWdodCAxNAotc2V0IGJmb250ICItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi0xMjAtKi0qLSotKi0qLSoiCi1zZXQgc2ZvbnQgIi1hZG9iZS1oZWx2ZXRpY2EtYm9sZC1yLSotKi0qLTEwMC0qLSotKi0qLSotKiIKLXNldCBzbmZvbnQgIi1hZG9iZS1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLSotMTAwLSotKi0qLSotKi0qIgotc2V0IGZmb250ICJmaXhlZCIKLQotc2V0IGdvdF9oZWx2IDAKLWNhdGNoIHsKLQlmb3JlYWNoIGZhbSBbZm9udCBmYW1pbGllc10gIHsKLQkJaWYgeyRmYW0gPT0gImhlbHZldGljYSJ9IHsKLQkJCXNldCBnb3RfaGVsdiAxCi0JCX0KLQkJaWYgeyRmYW0gPT0gIkhlbHZldGljYSJ9IHsKLQkJCXNldCBnb3RfaGVsdiAxCi0JCX0KLQl9Ci19Ci0KLWlmIHskZ290X2hlbHZ9IHsKLQlzZXQgYmZvbnQgICJIZWx2ZXRpY2EgLTEyIGJvbGQiCi0Jc2V0IHNmb250ICAiSGVsdmV0aWNhIC0xMCBib2xkIgotCXNldCBzbmZvbnQgIkhlbHZldGljYSAtMTAiCi19Ci0KLXNldCBscyAiIgotY2F0Y2gge3NldCBscyBbZm9udCBtZXRyaWNzICRiZm9udCAtbGluZXNwYWNlXX0KLWlmIHskbHMgIT0gIiIgJiYgJGxzID4gMTR9IHsKLQkjIHNvbWUgcmVjZW50IHNldHVwcyBoYXZlIEJJRyByZW5kZXJpbmcgZm9yIHRoZSBhYm92ZSBmb250cy4KLQkjIG9uIHJlY2VudCAoOC8wOCkgZGViaWFuIHRoZXNlIGFyZSByZWFsbHkgcmFnZ2VkOgotCXNldCBiZm9udCAiLWFkb2JlLWhlbHZldGljYS1ib2xkLXItKi0qLSotOTAtKi0qLSotKi0qLSoiCi0Jc2V0IHNmb250ICItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi03NS0qLSotKi0qLSotKiIKLQlzZXQgc25mb250ICItYWRvYmUtaGVsdmV0aWNhLW1lZGl1bS1yLSotKi0qLTc1LSotKi0qLSotKi0qIgotCi0Jc2V0IGxzICIiCi0JY2F0Y2gge3NldCBscyBbZm9udCBtZXRyaWNzICRiZm9udCAtbGluZXNwYWNlXX0KLQlpZiB7JGxzICE9ICIiICYmICRscyA8IDE0fSB7Ci0JCSMgdGhlc2UgYXJlIGJpZ2dlciBidXQgbG9vayBiZXR0ZXIuLi4gYnV0IGZvciBob3cgbG9uZz8KLQkJc2V0IGJmb250ICItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi0xMDAtKi0qLSotKi0qLSoiCi0JCXNldCBzZm9udCAiLWFkb2JlLWhlbHZldGljYS1ib2xkLXItKi0qLSotODAtKi0qLSotKi0qLSoiCi0JCXNldCBzbmZvbnQgIi1hZG9iZS1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLSotODAtKi0qLSotKi0qLSoiCi0KLQkJIyBtYXliZSBjb25zaWRlci4uLiB7LWZvbnQgZm9udCBGb250IHtIZWx2ZXRpY2EgLTEyIGJvbGR9IHtIZWx2ZXRpY2EgLTEyIGJvbGR9fQotCQkjIG9yIHN0aWNrIHdpdGggc3lzdGVtIGZvbnQgbGlrZSBzc3ZuYy4KLQl9Ci19Ci0KLSMgbmVlZCB0byBjaGVjayBpZiAiZml4ZWQiIGZvbnQgdW5kZXIgWEZUIG9uIHRrOC41IGlzIGFjdHVhbGx5IGZpeGVkIHdpZHRoISEKLXNldCBscyAiIgotY2F0Y2gge3NldCBscyBbZm9udCBtZXRyaWNzICRmZm9udCAtbGluZXNwYWNlXX0KLXNldCBmcyAiIgotY2F0Y2gge3NldCBmcyBbZm9udCBtZXRyaWNzICRmZm9udCAtZml4ZWRdfQotc2V0IHJlZG8gMAotaWYgeyRmcyAhPSAiIiAmJiAkZnMgIT0gIjEifSB7Ci0Jc2V0IHJlZG8gMQotfQotaWYgeyRscyAhPSAiIiAmJiAkbHMgPiAxNH0gewotCXNldCByZWRvIDEKLX0KLWlmIHskcmVkb30gewotCWZvcmVhY2ggZm4gW2ZvbnQgbmFtZXNdIHsKLQkJaWYgeyRmbiA9PSAiVGtGaXhlZEZvbnQifSB7Ci0JCQlzZXQgZmZvbnQgJGZuCi0JCQlicmVhawotCQl9Ci0JfQotfQotCi1zZXQgaGVscF9pbmRlbnQgMjQ7Ci1zZXQgcmVwbHlfeGRpc3BsYXkgIiIKLXNldCBhbGxfc2V0dGluZ3MgIk5vbmUgc28gZmFyLiIKLXNldCBhbHdheXNfdXBkYXRlIDEKLXNldCBjYWNoZV9hbGxfcXVlcnlfdmFycyAiIgotc2V0IHF1ZXJ5X2FsbF9mcmVxIDEyMAotc2V0IGxhc3RfcXVlcnlfYWxsX3RpbWUgW2Nsb2NrIHNlY29uZHNdCi1zZXQgY2xpZW50X3RhaWwgIiIKLXNldCBjbGllbnRfc29jayAiIgotc2V0IGNsaWVudF9pbmZvX3JlYWQgMAotc2V0IG1ha2VfZ3VpX2NvdW50IDAKLXNldCB0ZXh0X2FyZWFfc3RyICIiCi1zZXQgZ3VpX2FyZ3YwICRhcmd2MAotc2V0IGd1aV9zdGFydF9tb2RlICIiCi0KLWlmIHskdGtfdmVyc2lvbiA8IDguMH0gewotCXB1dHMgc3RkZXJyICIiCi0JcHV0cyBzdGRlcnIgIioqKiB0a3gxMXZuYzogdGsgdmVyc2lvbiBpcyBvbGQgJHRrX3ZlcnNpb24sIHBsZWFzZSB1c2UgOC4wIG9yIGhpZ2hlci4iCi0JcHV0cyBzdGRlcnIgIioqKiAgICAgICAgICAgd2lsbCB0cnkgdG8gY29udGludWUgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuLi4iCi0JcHV0cyBzdGRlcnIgIiIKLX0KLWlmIHtbcmVnZXhwIHteWzM0XX0gJHRrX3ZlcnNpb25dIHx8ICR0a192ZXJzaW9uID09ICI4LjAifSB7Ci0Jc2V0IG9sZF9sYWJlbHMgMQotfSBlbHNlIHsKLQlzZXQgb2xkX2xhYmVscyAwCi19Ci1zZXQgaGF2ZV9sYWJlbGZyYW1lcyAxCi1pZiB7JHRrX3ZlcnNpb24gPCA4LjR9IHsKLQlzZXQgaGF2ZV9sYWJlbGZyYW1lcyAwCi19Ci0KLXNldCBzY3JlZW5faGVpZ2h0IFt3aW5mbyBzY3JlZW5oZWlnaHQgLl0KLXNldCBzY3JlZW5fd2lkdGggIFt3aW5mbyBzY3JlZW53aWR0aCAgLl0KLWlmIHskc2NyZWVuX2hlaWdodCA8IDcwMH0gewotCSMgc2hvcnQgc2NyZWVuLCBuZXRib29rPwotCXNldCBtYXhfdGV4dF9oZWlnaHQgMzAKLQlpZiB7JHNjcmVlbl9oZWlnaHQgPCA1MDB9IHsKLQkJIyBzaG9ydCBzY3JlZW4sIFBEQT8KLQkJc2V0IG1heF90ZXh0X2hlaWdodCAyMgotCQlzZXQgdGV4dF9oZWlnaHQgMTMKLQkJaWYgeyRzY3JlZW5faGVpZ2h0IDw9IDM2MH0gewotCQkJIyB2ZXJ5IHNob3J0LgotCQkJc2V0IG1heF90ZXh0X2hlaWdodCAxNgotCQkJc2V0IG1heF90ZXh0X3dpZHRoICA2MAotCQkJc2V0IHRleHRfaGVpZ2h0IDExCi0JCX0KLQl9Ci19Ci1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfR1VJX1RFWFRfSEVJR0hUKV19IHsKLQlzZXQgbWF4X3RleHRfaGVpZ2h0ICRlbnYoWDExVk5DX0dVSV9URVhUX0hFSUdIVCkKLX0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfVEVYVF9XSURUSCldfSB7Ci0Jc2V0IG1heF90ZXh0X3dpZHRoICAkZW52KFgxMVZOQ19HVUlfVEVYVF9XSURUSCkKLX0KLQotaWYgeyIkYXJndiIgPT0gIi1zcGl0In0gewotCXNldCBmaCBbb3BlbiAkYXJndjAgcl0KLQlwdXRzICIjaWZuZGVmIF9US1gxMVZOQ19IIgotCXB1dHMgIiNkZWZpbmUgX1RLWDExVk5DX0giCi0JcHV0cyAiI2lmZGVmIE5PR1VJIgotCXB1dHMgImNoYXIgZ3VpX2NvZGVcW1xdID0gXCJcIjsiCi0JcHV0cyAiI2Vsc2UiCi0JcHV0cyAiLyoiCi0JcHV0cyAiICogdGt4MTF2bmMuaDogZ2VuZXJhdGVkIGJ5ICd0a3gxMXZuYyAtc3BpdCciCi0JcHV0cyAiICogQWJhbmRvbiBhbGwgaG9wZSwgeWUgd2hvIGVudGVyIGhlcmUuLi4iCi0JcHV0cyAiICogLi4uZWRpdCB0a3gxMXZuYyBpbnN0ZWFkLiIKLQlwdXRzICIgKi8iCi0JcHV0cyAiCWNoYXIgZ3VpX2NvZGVcW1xdID0iCi0Jd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7Ci0JCXJlZ3N1YiAtYWxsIHtcXH0gJGxpbmUge1xcXFx9IGxpbmUKLQkJcmVnc3ViIC1hbGwgeyJ9ICRsaW5lIHtcXCJ9IGxpbmUKLQkJcHV0cyAiXCIkbGluZVxcblwiIgotCX0KLQlwdXRzICIjZW5kaWYiCi0JcHV0cyAiLyogaWZkZWYgTk9HVUkgKi8iCi0JcHV0cyAiI2VuZGlmIgotCXB1dHMgIi8qIGlmbmRlZiBfVEtYMTFWTkNfSCAqLyIKLQljbG9zZSAkZmgKLQlwdXRzICI7IgotCWV4aXQgMAotfQotCi1zZXRfdmlld192YXJpYWJsZSAiZnVsbCIKLQotI3B1dHMgW2V4ZWMgZW52IHwgZ3JlcCBYMTFWTkNdCi0KLSMgUmVhZCBlbnZpcm9ubWVudCBmb3IgY2x1ZXM6Ci0KLXNldCB4MTF2bmNfY2xpZW50X2ZpbGUgIiI7Ci1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfQ0xJRU5UX0ZJTEUpXX0gewotCXNldCB4MTF2bmNfY2xpZW50X2ZpbGUgJGVudihYMTFWTkNfQ0xJRU5UX0ZJTEUpOwotCXNldCBmaWxlICR4MTF2bmNfY2xpZW50X2ZpbGUKLQotCXNldCBjbGllbnRfdGFpbCAiIgotCWlmIHtbZmlsZSBleGlzdHMgJGZpbGVdICYmIFtmaWxlIGlzZmlsZSAkZmlsZV19IHsKLQkJaWYge1tmaWxlIHJlYWRhYmxlICRmaWxlXSAmJiBbZmlsZSBvd25lZCAkZmlsZV19IHsKLQkJCXNldCBjbGllbnRfdGFpbCBbb3BlbiAifHRhaWwgLWYgJHgxMXZuY19jbGllbnRfZmlsZSIgInIiXQotCQl9Ci0JfQotCWlmIHskY2xpZW50X3RhaWwgIT0gIiJ9IHsKLQkJZ2V0cyAkY2xpZW50X3RhaWwgdG1wCi0JCWlmIFtlb2YgJGNsaWVudF90YWlsXSB7Ci0jcHV0cyAiZW9mICRjbGllbnRfdGFpbCIKLQkJCWNsZWFuX2NsaWVudF90YWlsCi0JCQlzZXQgY2xpZW50X3RhaWwgIiIKLQkJfQotCX0KLQljYXRjaCB7ZmlsZSBkZWxldGUgLWZvcmNlICR4MTF2bmNfY2xpZW50X2ZpbGV9Ci19Ci0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19QUk9HKV19IHsKLQlzZXQgeDExdm5jX3Byb2cgJGVudihYMTFWTkNfUFJPRyk7Ci19IGVsc2UgewotCXNldCB4MTF2bmNfcHJvZyAieDExdm5jIjsKLX0KLQotaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0NNRExJTkUpXX0gewotCXNldCB4MTF2bmNfY21kbGluZSAkZW52KFgxMVZOQ19DTURMSU5FKTsKLX0gZWxzZSB7Ci0Jc2V0IHgxMXZuY19jbWRsaW5lICIiOwotfQotCi1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfQ09OTkVDVCldfSB7Ci0Jc2V0IHgxMXZuY19jb25uZWN0IDEKLX0gZWxzZSB7Ci0Jc2V0IHgxMXZuY19jb25uZWN0IDA7Ci19Ci0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfR0VPTSldfSB7Ci0Jc2V0IHgxMXZuY19ndWlfZ2VvbSAkZW52KFgxMVZOQ19HVUlfR0VPTSk7Ci19IGVsc2UgewotCXNldCB4MTF2bmNfZ3VpX2dlb20gIiIKLX0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfUEFSQU1TKV19IHsKLQlzZXQgeDExdm5jX2d1aV9wYXJhbXMgJGVudihYMTFWTkNfR1VJX1BBUkFNUyk7Ci19IGVsc2UgewotCXNldCB4MTF2bmNfZ3VpX3BhcmFtcyAiIgotfQotCi1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfRk9OVF9CT0xEKV19IHsKLQlzZXQgYmZvbnQgJGVudihYMTFWTkNfRk9OVF9CT0xEKQotfQotaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0ZPTlRfQk9MRF9TTUFMTCldfSB7Ci0Jc2V0IHNmb250ICRlbnYoWDExVk5DX0ZPTlRfQk9MRF9TTUFMTCkKLX0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19GT05UX1JFR19TTUFMTCldfSB7Ci0Jc2V0IHNuZm9udCAkZW52KFgxMVZOQ19GT05UX1JFR19TTUFMTCkKLX0KLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19GT05UX0ZJWEVEKV19IHsKLQlzZXQgZmZvbnQgJGVudihYMTFWTkNfRk9OVF9GSVhFRCkKLX0KLQotaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0NPTk5FQ1RfRklMRSldfSB7Ci0Jc2V0IHgxMXZuY19jb25uZWN0X2ZpbGUgJGVudihYMTFWTkNfQ09OTkVDVF9GSUxFKTsKLX0gZWxzZSB7Ci0Jc2V0IHgxMXZuY19jb25uZWN0X2ZpbGUgIiI7Ci19Ci0KLXNldCB4MTF2bmNfc3RhcnRlZCAwCi1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfU1RBUlRFRCldfSB7Ci0Jc2V0IHgxMXZuY19zdGFydGVkIDEKLX0KLQotc2V0IHgxMXZuY194ZGlzcGxheSAiIgotaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1hESVNQTEFZKV19IHsKLQlzZXQgeDExdm5jX3hkaXNwbGF5ICRlbnYoWDExVk5DX1hESVNQTEFZKTsKLQlzZXQgeDExdm5jX2Nvbm5lY3QgMQotCi19IGVsc2VpZiB7JGFyZ3YgIT0gIiIgJiYgW3JlZ2V4cCB7OlswLTldfSAkYXJndl19IHsKLQlzZXQgZW52KFgxMVZOQ19YRElTUExBWSkgIiRhcmd2IgotCXNldCB4MTF2bmNfeGRpc3BsYXkgIiRhcmd2IgotCXNldCB4MTF2bmNfY29ubmVjdCAxCi0KLX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZW52KERJU1BMQVkpXX0gewotCXNldCB4MTF2bmNfeGRpc3BsYXkgJGVudihESVNQTEFZKTsKLX0gZWxzZSB7Ci0Jc2V0IHgxMXZuY194ZGlzcGxheSAiOjAiOwotfQotc2V0IHgxMXZuY194ZGlzcGxheTAgJHgxMXZuY194ZGlzcGxheQotCi1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfQVVUSF9GSUxFKV19IHsKLQlzZXQgeDExdm5jX2F1dGhfZmlsZSAkZW52KFgxMVZOQ19BVVRIX0ZJTEUpCi19IGVsc2UgewotCXNldCB4MTF2bmNfYXV0aF9maWxlICIiCi19Ci0KLXNldCBzaW1wbGVfZ3VpX2NyZWF0ZWQgMAotaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1NJTVBMRV9HVUkpXX0gewotCXNldCBiZWdpbm5lcl9tb2RlIDEKLX0gZWxzZSB7Ci0Jc2V0IGJlZ2lubmVyX21vZGUgMAotfQotCi1zZXQgaWNvbl9tb2RlIDAKLXNldCB4MTF2bmNfaWNvbl9tb2RlIDAKLXNldCB0cmF5X2VtYmVkIDAKLXNldCB0cmF5X3J1bm5pbmcgMAotCi1pZiB7IVtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0lDT05fTU9ERV9BVF9TVEFSVFVQKV19IHsKLQlpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfSUNPTl9NT0RFKV19IHsKLQkJaWYgeyRlbnYoWDExVk5DX0lDT05fTU9ERSkgIT0gMH0gewotCQkJc2V0IGVudihYMTFWTkNfSUNPTl9NT0RFX0FUX1NUQVJUVVApIDEKLQkJfSBlbHNlIHsKLQkJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERV9BVF9TVEFSVFVQKSAwCi0JCX0KLQl9IGVsc2UgewotCQlzZXQgZW52KFgxMVZOQ19JQ09OX01PREVfQVRfU1RBUlRVUCkgMAotCX0KLX0KLXNldCBpY29uX21vZGVfYXRfc3RhcnR1cCAkZW52KFgxMVZOQ19JQ09OX01PREVfQVRfU1RBUlRVUCkKLQotaWYgeyFbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX01PREUpXX0gewotCXNldCBpY29uX21vZGUgMAotfSBlbHNlaWYgeyRlbnYoWDExVk5DX0lDT05fTU9ERSkgPT0gIiIgfHwgJGVudihYMTFWTkNfSUNPTl9NT0RFKSA9PSAiMCJ9IHsKLQlzZXQgaWNvbl9tb2RlIDAKLX0gZWxzZSB7Ci0Jc2V0IGljb25fbW9kZSAxCi0Jc2V0X3ZpZXdfdmFyaWFibGUgImljb24iCi0JaWYgW3JlZ2V4cCAtbm9jYXNlIHtUUkFZfSAkZW52KFgxMVZOQ19JQ09OX01PREUpXSB7Ci0JCXNldCB0cmF5X2VtYmVkIDEKLQl9Ci0JaWYgW3JlZ2V4cCAtbm9jYXNlIHtSVU5OSU5HfSAkZW52KFgxMVZOQ19JQ09OX01PREUpXSB7Ci0JCXNldCB0cmF5X3J1bm5pbmcgMQotCX0KLX0KLQotc2V0IGljb25fc2V0cGFzc3dkIDAKLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX1NFVFBBU1MpXX0gewotCWlmIHskZW52KFgxMVZOQ19JQ09OX1NFVFBBU1MpICE9ICIifSB7Ci0JCXNldCBpY29uX3NldHBhc3N3ZCAxCi0JfQotfQotCi1zZXQgaWNvbl9ub2FkdmFuY2VkIDAKLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX05PQURWQU5DRUQpXX0gewotCXNldCBpY29uX25vYWR2YW5jZWQgMQotfQotCi1zZXQgaWNvbl9taW5pbWFsIDAKLWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX01JTklNQUwpXX0gewotCXNldCBpY29uX21pbmltYWwgMQotfQotCi1pZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfSUNPTl9FTUJFRF9JRCldfSB7Ci0Jc2V0IGljb25fZW1iZWRfaWQgJGVudihYMTFWTkNfSUNPTl9FTUJFRF9JRCkKLX0gZWxzZSB7Ci0Jc2V0IGljb25fZW1iZWRfaWQgIiIKLX0KLQotCi1zZXQgaG9zdG5hbWUgW2V4ZWMgdW5hbWUgLW5dCi1zZXQgb3NuYW1lIFtleGVjIHVuYW1lXQotCi1pZiB7W3JlZ2V4cCAtbm9jYXNlIHtJUklYfSAkb3NuYW1lXX0gewotCSMgSVJJWCAiZml4ZWQiIGZvbnQgaXMgaHVnZSBhbmQgZG91Ymxlc3BhY2VkLi4uIAotCXNldCBmZm9udCAkc25mb250Ci19Ci1pZiB7W3JlZ2V4cCAtbm9jYXNlIHtEYXJ3aW59ICRvc25hbWVdfSB7Ci0Jc2V0IGZmb250IHtNb25hY28gMTB9Ci0Jc2V0IGJmb250IHtzeXN0ZW19Ci19Ci0KLWlmIHsiJGFyZ3YiID09ICItcG9ydHByb21wdCJ9IHsKLQlkb19wb3J0X3Byb21wdAotCWV4aXQgMAotfQotCi0jcHV0cyBbZXhlYyBlbnZdCi0jcHV0cyAieDExdm5jX3hkaXNwbGF5OiAkeDExdm5jX3hkaXNwbGF5IgotCi1zZXQgZW52KFgxMVZOQ19TVERfSEVMUCkgMQotCi0jIHNjcmFwZSB0aGUgaGVscCBvdXRwdXQgZm9yIHRoZSB0ZXh0IGFuZCByZW1vdGUgY29udHJvbCB2YXJzOgotcGFyc2VfaGVscDsKLXBhcnNlX3JlbW90ZV9oZWxwOwotcGFyc2VfcXVlcnlfaGVscDsKLQotIyB0d2Vha3MgdG8gZHVwbGljYXRlIGhlbHAgdGV4dDoKLXR3ZWFrX3JlbW90ZV9oZWxwIGxvY2sgZGVueQotdHdlYWtfcmVtb3RlX2hlbHAgdW5sb2NrIGRlbnkKLQotdHdlYWtfYm90aCBxdWlldCBxCi10d2Vha19oZWxwIGxvZ2ZpbGUgbwotdHdlYWtfYm90aCB4d2FycHBvaW50ZXIgeHdhcnAKLXR3ZWFrX2JvdGggc2NyZWVuX2JsYW5rIHNiCi0KLXNldF90ZW1wbGF0ZQotCi1zZXRfbmFtZSAidGt4MTF2bmMiCi0KLWtleV9iaW5kaW5nczsKLQotZ2V0X2RlZmF1bHRfdmFycwotCi1kdGltZSBECi0KLXByb2MgY2hlY2tfc2V0cGFzc3dkIHt9IHsKLQlnbG9iYWwgZW52IGljb25fc2V0cGFzc3dkCi0JZ2xvYmFsIGRvX3Byb3BzX21zZwotCXNldCBkb19wcm9wc19tc2cgIiIKLQlpZiB7JGljb25fc2V0cGFzc3dkfSB7Ci0JCXNldCBtICJcbiIKLQkJc2V0IG0gIiR7bX0gTm90ZSB0aGUgeDExdm5jIGljb24gaW4gdGhlIHN5c3RlbSB0cmF5LlxuIiAKLQkJc2V0IG0gIiR7bX0gVGhpcyBwYW5lbCBpcyBpdHMgJ1Byb3BlcnRpZXMnIGRpYWxvZy5cbiIgCi0JCXNldCBtICIke219XG4iIAotCQlzZXQgbSAiJHttfSBUbyBzcGVjaWZ5IGEgU2Vzc2lvbiBQYXNzd29yZCBhbmQgdG9cbiIgCi0JCXNldCBtICIke219IGFsbG93IFZOQyB2aWV3ZXJzIHRvIGNvbm5lY3QsIGZvbGxvd1xuIiAKLQkJc2V0IG0gIiR7bX0gdGhlc2Ugc3RlcHM6XG4iIAotCQlzZXQgbSAiJHttfVxuIiAKLQkJc2V0IG0gIiR7bX0gRW50ZXIgYSBwYXNzd2QgaW4gdGhlIFBhc3N3b3JkIGZpZWxkXG4iIAotCQlzZXQgbSAiJHttfSAoaXQgY2FuIGJlIGxlZnQgYmxhbmsuKSAgWW91IGNhbiBhbHNvXG4iIAotCQlzZXQgbSAiJHttfSBzdXBwbHkgYSBWaWV3T25seSBwYXNzd2QgaWYgZGVzaXJlZC5cbiIgCi0JCXNldCBtICIke219XG4iIAotCQlzZXQgbSAiJHttfSBTZXQgJ0FjY2VwdCBDb25uZWN0aW9ucycgYW5kIHRoZW4gUHJlc3MgXG4iIAotCQlzZXQgbSAiJHttfSAnQXBwbHknIHRvIGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zLlxuIiAKLQkJc2V0IG0gIiR7bX1cbiIgCi0JCXNldCBtICIke219IE5vIFZpZXdlciBjYW4gY29ubmVjdCB1bnRpbCB5b3UgZG8gdGhpcy5cbiIgCi0JCXNldCBtICIke219XG4iIAotCQlzZXQgbSAiJHttfSBUaGUgcGFzc3dvcmRzIGFyZSBvbmx5IGZvciB0aGlzIHgxMXZuY1xuIiAKLQkJc2V0IG0gIiR7bX0gc2Vzc2lvbiBhbmQgYXJlIG5vdCBzYXZlZC4gIFJ1biB4MTF2bmNcbiIgCi0JCXNldCBtICIke219IG1hbnVhbGx5IGZvciBtb3JlIGNvbnRyb2wgKGUuZy4gLXJmYmF1dGggXG4iIAotCQlzZXQgbSAiJHttfSBmb3IgYSBzYXZlZCBwYXNzd29yZC4pXG4iIAotCQlzZXQgbSAiJHttfVxuIiAKLQkJc2V0IG0gIiR7bX0gU2VlICdIZWxwJyBmb3IgZGV0YWlscyBvbiBlYWNoIG9wdGlvbi5cbiIgCi0KLQkJZ2xvYmFsIHgxMXZuY19jbWRsaW5lCi0KLQkJc2V0IGRvc3NsIDAKLQkJaWYge1tpbmZvIGV4aXN0cyB4MTF2bmNfY21kbGluZV19IHsKLQkJCWlmIFtyZWdleHAgLS0gey1zc2x9ICR4MTF2bmNfY21kbGluZV0gewotCQkJCXNldCBkb3NzbCAxCi0JCQl9Ci0JCX0KLQkJaWYgeyRkb3NzbCB8fCBbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HT1RfU1NMKV19IHsKLQkJCXNldCBtICIke219XG4iIAotCQkJc2V0IG0gIiR7bX0gU1NMIGVuY3J5cHRpb24gbW9kZSBhY3RpdmUuICBZb3UgY2FuXG4iIAotCQkJc2V0IG0gIiR7bX0gZmluZCB5b3VyIFB1YmxpYyBDZXJ0IGluIHRoZSBMb2dmaWxlXG4iIAotCQkJc2V0IG0gIiR7bX0gYW5kIGFsc28gdGhlIH4vLnZuYy9jZXJ0cyBkaXJlY3RvcnkuXG4iIAotCQl9Ci0KLQkJaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1NFVFBBU1NfRkFJTCldfSB7Ci0JCQlzZXQgcHAgNTkwMAotCQkJaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0dPVF9SRkJQT1JUX1ZBTCldfSB7Ci0JCQkJaWYgeyRlbnYoWDExVk5DX0dPVF9SRkJQT1JUX1ZBTCkgPiAwfSB7Ci0JCQkJCXNldCBwcCAkZW52KFgxMVZOQ19HT1RfUkZCUE9SVF9WQUwpCi0JCQkJfQotCQkJfQotCQkJCi0JCQlzZXQgbSAgICAgIiBUaGUgeDExdm5jIHByb2dyYW0gZmFpbGVkIHRvIHN0YXJ0ISBcbiIKLQkJCXNldCBtICIke219XG4iIAotCQkJc2V0IG0gIiR7bX0gTWF5YmUgdGhlcmUgaXMgYW5vdGhlciBWTkMgc2VydmVyXG4iCi0JCQlzZXQgbSAiJHttfSBhbHJlYWR5IGxpc3RlbmluZyBvbiBwb3J0ICRwcD9cbiIKLQkJCXNldCBtICIke219XG4iIAotCQkJc2V0IG0gIiR7bX0gWW91IHdpbGwgbmVlZCB0byBzdGFydCBvdmVyIGFmdGVyXG4iCi0JCQlzZXQgbSAiJHttfSB5b3UgbWFrZSBzdXJlIHgxMXZuYyBjYW4gc3RhcnQuXG4iCi0JCX0KLQkJCi0JCXNldCBkb19wcm9wc19tc2cgJG0KLQkJZG9fcHJvcHMKLQl9Ci19Ci0KLWlmIHswfSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0lDT05fU0VUUEFTUyldfSB7Ci0JCWlmIHskZW52KFgxMVZOQ19JQ09OX1NFVFBBU1MpID09ICIyIn0gewotCQkJZ2xvYmFsIGljb25fbW9kZV9hdF9zdGFydHVwIGljb25fbW9kZQotCQkJc2V0IGljb25fbW9kZV9hdF9zdGFydHVwIDEKLQkJCXNldCBpY29uX21vZGUgMgotCQl9Ci0JfQotfQotCi1pZiB7JGljb25fbW9kZX0gewotCWlmIHskaWNvbl9tb2RlID09IDJ9IHsKLQkJbWFrZV9ndWkgImZ1bGwiCi0JfSBlbHNlaWYgeyR0cmF5X2VtYmVkfSB7Ci0JCW1ha2VfZ3VpICJ0cmF5IgotCX0gZWxzZSB7Ci0JCW1ha2VfZ3VpICJpY29uIgotCX0KLQlkdGltZSBHCi0Jb2xkX2JhbGxvb24KLQljaGVja19zZXRwYXNzd2QKLQlwdXNoX25ld192YWx1ZSAicmVtb3RlLWNtZCIgInJlbW90ZS1jbWQiICJROmNsaWVudHMiIDEKLX0gZWxzZSB7Ci0JbWFrZV9ndWkgImZ1bGwiCi0JZHRpbWUgRwotCWNoZWNrX3NldHBhc3N3ZAotfQotCi0KLSMgbWFpbiBsb29wLgpkaWZmIC0tZ2l0IGEveDExdm5jL3RreDExdm5jLmggYi94MTF2bmMvdGt4MTF2bmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmNGJiYy4uMDAwMDAwMAotLS0gYS94MTF2bmMvdGt4MTF2bmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDczNTEgKzAsMCBAQAotI2lmbmRlZiBfVEtYMTFWTkNfSAotI2RlZmluZSBfVEtYMTFWTkNfSAotI2lmZGVmIE5PR1VJCi1jaGFyIGd1aV9jb2RlW10gPSAiIjsKLSNlbHNlCi0vKgotICogdGt4MTF2bmMuaDogZ2VuZXJhdGVkIGJ5ICd0a3gxMXZuYyAtc3BpdCcKLSAqIEFiYW5kb24gYWxsIGhvcGUsIHllIHdobyBlbnRlciBoZXJlLi4uCi0gKiAuLi5lZGl0IHRreDExdm5jIGluc3RlYWQuCi0gKi8KLQljaGFyIGd1aV9jb2RlW10gPQotIiMhL2Jpbi9zaFxuIgotIiMgdGhlIG5leHQgbGluZSByZXN0YXJ0cyB1c2luZyB3aXNoLiBcXFxuIgotImV4ZWMgd2lzaCBcIiQwXCIgXCIkQFwiXG4iCi0iY2F0Y2gge3JlbmFtZSBzZW5kIHt9fVxuIgotIiNcbiIKLSIjIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+XG4iCi0iIyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIgotIiNcbiIKLSIjICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiIKLSIjICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuIgotIiMgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yXG4iCi0iIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKLSIjXG4iCi0iIyAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIgotIiMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCi0iIyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuIgotIiMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0iI1xuIgotIiMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iCi0iIyAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4iCi0iIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LFxuIgotIiMgIFVTQS5cbiIKLSJcbiIKLSIjXG4iCi0iIyB0a3gxMXZuYyB2MC4yXG4iCi0iIyBUaGlzIGlzIGEgc2ltcGxlIGZyb250ZW5kIHRvIHgxMXZuYy4gIEl0IHVzZXMgdGhlIHJlbW90ZSBjb250cm9sXG4iCi0iIyBhbmQgcXVlcnkgZmVhdHVyZXMgKC1yZW1vdGUvLXF1ZXJ5IGFrYSAtUi8tUSkgdG8gaW50ZXJhY3Qgd2l0aCBpdC4gXG4iCi0iIyBJdCBpcyBqdXN0IGEgcXVpY2stbi1kaXJ0eSBoYWNrIChpdCBwYXJzZXMgLWhlbHAgb3V0cHV0LCBldGMpLCBidXRcbiIKLSIjIGl0IGNvdWxkIGJlIG9mIHVzZSBwbGF5aW5nIHdpdGggb3IgbGVhcm5pbmcgYWJvdXQgdGhlICh3YXkgdG9vKSBtYW55XG4iCi0iIyBwYXJhbWV0ZXJzIHgxMXZuYyBoYXMuXG4iCi0iIyBcbiIKLSIjIEl0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggYSBydW5uaW5nIHgxMXZuYyAoc2VlIHRoZSB4MTF2bmNcbiIKLSIjIC1ndWkgb3B0aW9uKSwgb3IgdG8gc2V0IHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHN0YXJ0IHVwIHgxMXZuYy4gIFxuIgotIiMgXG4iCi0iXG4iCi0iI1xuIgotIiMgQmVsb3cgaXMgYSBzaW1wbGUgcGljdHVyZSBvZiBob3cgdGhlIGd1aSBzaG91bGQgYmUgbGFpZCBvdXQgYW5kIGhvd1xuIgotIiMgdGhlIG1lbnVzIHNob3VsZCBiZSBvcmdhbml6ZWQuICBNb3N0IG1lbnUgaXRlbXMgY29ycmVzcG9uZCB0byByZW1vdGVcbiIKLSIjIGNvbnRyb2wgY29tbWFuZHMuIEEgdHJhaWxpbmcgXCI6XCIgYWZ0ZXIgdGhlIGl0ZW0gbmFtZSBtZWFucyBpdCBpcyBhIHN0cmluZ1xuIgotIiMgdG8gYmUgc2V0IHJhdGhlciB0aGFuIGEgYm9vbGVhbiB0aGF0IGNhbiBiZSB0b2dnbGVkIChlLmcuIHRoZSBlbnRyeVxuIgotIiMgYm94IG11c3QgYmUgdXNlZCkuXG4iCi0iI1xuIgotIiMgU29tZSB0d2VhayBvcHRpb25zIG1heSBiZSBzZXQgaW4gdGhlIHByZWZpeCBcIj1cIiBzdHJpbmcuXG4iCi0iIwlBIG1lYW5zIGl0IGlzIGFuIFwiQWN0aW9uXCIgKG5vdCBhIHRydWUgdmFyaWFibGUpXG4iCi0iIwlSIG1lYW5zIGl0IGlzIGFuIGFjdGlvbiBvbmx5IHZhbGlkIGluIHJlbW90ZSBtb2RlLlxuIgotIiMJUyBtZWFucyBpdCBpcyBhbiBhY3Rpb24gb25seSB2YWxpZCBpbiBzdGFydHVwIG1vZGUuXG4iCi0iIwlRIG1lYW5zIGl0IGlzIGFuIGFjdGlvbiB3b3J0aCBxdWVyeWluZyBhZnRlciBydW5uaW5nLlxuIgotIiMJUCBtZWFucyB0aGUgc3RyaW5nIGNhbiBiZSArLy0gYXBwZW5kZWQvZGVsZXRlZCAoc3RyaW5nIG1heSBub3RcbiIKLSIjICAgICAgICAgYmUgdGhlIHNhbWUgYWZ0ZXIgdGhlIHJlbW90ZSBjb21tYW5kKVxuIgotIiMJRyBtZWFucyBndWkgaW50ZXJuYWwgaXRlbVxuIgotIiMJRiBtZWFucyBjYW4gYmUgc2V0IHZpYSBmaWxlIGJyb3dzZVxuIgotIiMJRCBtZWFucyBmb3Igc2ltcGxlIGd1aVxuIgotIiMJLUM6dmFsMSwuLi4gbWVhbnMgaXQgd2lsbCBiZSBhIGNoZWNrYm94IChyYWRpbyBidXR0b24pXG4iCi0iIwkgICB0aGUgXCItXCIgbWVhbnMgbm8gb3RoZXIgb3B0aW9ucyBmb2xsb3dcbiIKLSIjCTAgbWVhbnMgdG8gc2tpcCB0aGUgaXRlbS5cbiIKLSIjCS0tIG1lYW5zIGFkZCBhIHNlcGFyYXRvclxuIgotIiNcbiIKLSIjICAgICAgIFRoZSA9R0FMIC4uLiA9R0FMIExPRkYgc3R1ZmYgaXMgdG8gcHJvdmlkZSBzdWJtZW51cy5cbiIKLSIjXG4iCi0iXG4iCi0iZ2xvYmFsIGVudiBzdGFydGVkIHRpbWVfY291bnRcbiIKLSJzZXQgc3RhcnRlZCBcIlwiXG4iCi0icHJvYyBkdGltZSB7e21zZyBcIlwifX0ge1xuIgotIglnbG9iYWwgc3RhcnRlZCB0aW1lX2NvdW50XG4iCi0iCWlmIHskc3RhcnRlZCA9PSBcIlwifSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglzZXQgZGlmZiBbZXhwciBcIltleGVjIGd0b2QuYmluXSAtICRzdGFydGVkXCJdXG4iCi0iCXNldCBkaWZmIFtmb3JtYXQgXCIlLjJmXCIgJGRpZmZdXG4iCi0iCWluY3IgdGltZV9jb3VudFxuIgotIglpZiB7JG1zZyA9PSBcIlwifSB7XG4iCi0iCQlzZXQgbXNnICR0aW1lX2NvdW50XG4iCi0iCX1cbiIKLSIJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciBcIiRtc2cgJGRpZmYgXCIgXG4iCi0iCXB1dHMgc3RkZXJyIFtjbG9jayBmb3JtYXQgW2Nsb2NrIHNlY29uZHNdXVxuIgotIn1cbiIKLSJcbiIKLSJpZiBbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfVElNRSldIHtcbiIKLSIJZ2xvYmFsIHN0YXJ0ZWQgdGltZV9jb3VudFxuIgotIglzZXQgc3RhcnRlZCBbZXhlYyBndG9kLmJpbl1cbiIKLSIJc2V0IHRpbWVfY291bnQgMFxuIgotIglkdGltZSBcIlNcIlxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNldF90ZW1wbGF0ZSB7fSB7XG4iCi0iCWdsb2JhbCB0ZW1wbGF0ZVxuIgotIglzZXQgdGVtcGxhdGUgXCJcbiIKLSJSb3c6IEFjdGlvbnMgICBDbGllbnRzICAgUGVybWlzc2lvbnMgIEtleWJvYXJkICAgIFBvaW50ZXIgIEhlbHBcbiIKLSJSb3c6IERpc3BsYXlzICBTY3JlZW4gICAgVHVuaW5nICAgICAgIERlYnVnZ2luZyAgIE1pc2NcbiIKLSJcbiIKLSJBY3Rpb25zXG4iCi0iCT1TQSBzdGFydFxuIgotIgk9UkEgc3RvcFxuIgotIgktLVxuIgotIgk9RFNBIGF0dGFjaFxuIgotIgk9RFJBIGRldGFjaFxuIgotIgktLVxuIgotIgk9UkEgcGluZ1xuIgotIgk9UkEgdXBkYXRlLWFsbFxuIgotIgk9R0FMIFNldHRpbmdzOjpcbiIKLSIJPUdBIHNhdmUtc2V0dGluZ3NcbiIKLSIJPVNGQSBsb2FkLXNldHRpbmdzOlxuIgotIgk9U0EgZGVmYXVsdHMtYWxsXG4iCi0iCT0wU0EgY2xlYXItYWxsXG4iCi0iCS0tXG4iCi0iCT1GIHJjOlxuIgotIglub3JjXG4iCi0iCT1HQUwgTE9GRlxuIgotIgktLSBEXG4iCi0iCT1EUkEgc3RvcCtxdWl0IFxuIgotIgk9REdBIFF1aXQgXG4iCi0iXG4iCi0iSGVscFxuIgotIgk9REdBIGd1aVxuIgotIgk9REdBIGFsbFxuIgotIlxuIgotIkNsaWVudHNcbiIKLSIJPURSUUEgY3VycmVudDpcbiIKLSIJPURGICAgY29ubmVjdDpcbiIKLSIJPURSUUEgZGlzY29ubmVjdDpcbiIKLSIJLS1cbiIKLSIJYWNjZXB0OlxuIgotIglhZnRlcmFjY2VwdDpcbiIKLSIJZ29uZTpcbiIKLSIJdm5jY29ubmVjdFxuIgotIgl6ZXJvY29uZlxuIgotIgktLSBEXG4iCi0iCXRpZ2h0ZmlsZXhmZXJcbiIKLSIJdWx0cmFmaWxleGZlclxuIgotIglwcm94eTpcbiIKLSIJPUdBTCBDaGF0OjpcbiIKLSIJY2hhdHdpbmRvd1xuIgotIgk9RFJBIGNoYXRvblxuIgotIgk9RFJBIGNoYXRvZmZcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgSmF2YS1hcHBsZXQ6OlxuIgotIgk9RCBodHRwXG4iCi0iCWh0dHBkaXI6XG4iCi0iCWh0dHBwb3J0OlxuIgotIglodHRwczpcbiIKLSIJaHR0cHNyZWRpcjpcbiIKLSIJZW5hYmxlaHR0cHByb3h5XG4iCi0iCT1HQUwgTE9GRlxuIgotIlxuIgotIkRpc3BsYXlzXG4iCi0iCT1EIGRpc3BsYXk6XG4iCi0iCT1GIGF1dGg6XG4iCi0iCT1TIHJlZmxlY3Q6XG4iCi0iCT1EIGRlc2t0b3A6XG4iCi0iCT1EIHJmYnBvcnQ6XG4iCi0iCT1TIGF1dG9wb3J0OlxuIgotIgk9MCBndWk6XG4iCi0iXG4iCi0iU2NyZWVuXG4iCi0iCT1EUkEgcmVmcmVzaFxuIgotIgk9UkEgcmVzZXRcbiIKLSIJPVJBIGJsYWNrZW5cbiIKLSIJLS0gRFxuIgotIgk9RCBzY2FsZTpcbiIKLSIJc2NhbGVfY3Vyc29yOlxuIgotIgktLVxuIgotIgk9RCBzb2xpZFxuIgotIglzb2xpZF9jb2xvcjpcbiIKLSIJLS1cbiIKLSIJPUdBTCBPdmVybGF5VmlzdWFsczo6XG4iCi0iCW92ZXJsYXlcbiIKLSIJb3ZlcmxheV9ub2N1cnNvclxuIgotIgk4dG8yNFxuIgotIgk4dG8yNF9vcHRzOlxuIgotIgk9R0FMIExPRkZcbiIKLSIJPUdBTCA4LUJpdC1Db2xvcjo6XG4iCi0iCWZsYXNoY21hcFxuIgotIglzaGlmdGNtYXA6XG4iCi0iCW5vdHJ1ZWNvbG9yXG4iCi0iCT1HQUwgTE9GRlxuIgotIgk9R0FMIFN1YldpbmRvdzo6XG4iCi0iCWlkOlxuIgotIglzaWQ6XG4iCi0iCT1SQSBpZF9jbWQ6XG4iCi0iCT1HQUwgTE9GRlxuIgotIgk9R0FMIFJlc2l6ZVJvdGF0ZTo6XG4iCi0iCT0geHJhbmRyXG4iCi0iCT0tQzpyZXNpemUsbmV3ZmJzaXplLGV4aXQgeHJhbmRyX21vZGU6XG4iCi0iCXJvdGF0ZTpcbiIKLSIJcGFkZ2VvbTpcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgQ2xpcHBpbmc6OlxuIgotIgk9UCBibGFja291dDpcbiIKLSIJeGluZXJhbWFcbiIKLSIJY2xpcDpcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgTWlzYy1TY3JlZW46OlxuIgotIglmaXhzY3JlZW46XG4iCi0iCXZpc3VhbDpcbiIKLSIJcmF3ZmI6XG4iCi0iCXBpcGVpbnB1dDpcbiIKLSIJdWlucHV0X2FjY2VsOlxuIgotIgl1aW5wdXRfcmVzZXQ6XG4iCi0iCXVpbnB1dF9hbHdheXM6XG4iCi0iCTI0dG8zMlxuIgotIgk9R0FMIExPRkZcbiIKLSJcbiIKLSJLZXlib2FyZFxuIgotIgk9RCBub3JlcGVhdFxuIgotIgk9RCBhZGRfa2V5c3ltc1xuIgotIgltb2R0d2Vha1xuIgotIgl4a2JcbiIKLSIJLS1cbiIKLSIJY2Fwc2xvY2tcbiIKLSIJc2tpcF9sb2Nra2V5c1xuIgotIgktLVxuIgotIglza2lwX2tleWNvZGVzOlxuIgotIglza2lwX2R1cHNcbiIKLSIJc2xvcHB5X2tleXNcbiIKLSIJLS1cbiIKLSIJPUZQIHJlbWFwOlxuIgotIgljbGVhcl9tb2RzXG4iCi0iCWNsZWFyX2tleXNcbiIKLSIJY2xlYXJfYWxsXG4iCi0iCT1SQSBjbGVhcl9sb2Nrc1xuIgotIlxuIgotIlBvaW50ZXJcbiIKLSIJPUQtQzpub25lLGFycm93LFgsc29tZSxtb3N0IGN1cnNvcjpcbiIKLSIJPS1DOjEsMiwzLDQsNSw2IGFycm93OlxuIgotIgktLVxuIgotIgljdXJzb3Jwb3NcbiIKLSIJPUQgbm9jdXJzb3JzaGFwZVxuIgotIgktLVxuIgotIglub3hmaXhlc1xuIgotIgljdXJzb3JfZHJhZ1xuIgotIgk9R0FMIEFscGhhQmxlbmRpbmc6OlxuIgotIglub2FscGhhYmxlbmRcbiIKLSIJYWxwaGFjdXQ6XG4iCi0iCWFscGhhZnJhYzpcbiIKLSIJYWxwaGFyZW1vdmVcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCS0tXG4iCi0iCWJ1dHRvbm1hcDpcbiIKLSIJLS1cbiIKLSIJeHdhcnBwb2ludGVyXG4iCi0iCWFsd2F5c19pbmplY3RcbiIKLSJcbiIKLSJNaXNjXG4iCi0iCT1HRC1DOmZ1bGwsaWNvbix0cmF5IFdpbmRvd1ZpZXc6XG4iCi0iCT1HRCBzaW1wbGUtZ3VpXG4iCi0iCS0tIERcbiIKLSIJPUdBIGFsbC1zZXR0aW5nc1xuIgotIgk9UkEgcmVtb3RlLWNtZDpcbiIKLSIJPUdBTCBTZWxlY3Rpb246OlxuIgotIgk9RCBub3NlbFxuIgotIglub3ByaW1hcnlcbiIKLSIJbm9zZXRwcmltYXJ5XG4iCi0iCW5vY2xpcGJvYXJkXG4iCi0iCW5vc2V0Y2xpcGJvYXJkXG4iCi0iCXNlbGRpcjpcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgWC1leHQ6OlxuIgotIgl4dHJhcFxuIgotIglub3hyZWNvcmRcbiIKLSIJPVJRQSByZXNldF9yZWNvcmRcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgTWFjT1NYOjpcbiIKLSIJbWFjbm9zYXZlclxuIgotIgltYWNub3dhaXRcbiIKLSIJbWFjd2hlZWw6XG4iCi0iCW1hY25vc3dhcFxuIgotIgltYWNub3Jlc2l6ZVxuIgotIgltYWNpY29uYW5pbTpcbiIKLSIJbWFjbWVudVxuIgotIgk9R0FMIExPRkZcbiIKLSIJLS1cbiIKLSIJNlxuIgotIglub2lwdjZcbiIKLSIJbm9pcHY0XG4iCi0iCS0tXG4iCi0iCW5vZmJcbiIKLSIJPUQgbm9iZWxsXG4iCi0iCW5vbG9va3VwXG4iCi0iCXJmYnZlcnNpb246XG4iCi0iCWJnXG4iCi0iCT1TIGxvb3BcbiIKLSIJPVMgbG9vcGJnXG4iCi0iCT1TIHNsZWVwaW46XG4iCi0iCT0tQzppZ25vcmUsZXhpdCBzaWdwaXBlOlxuIgotIgk9MCBpbmV0ZFxuIgotIlxuIgotIkRlYnVnZ2luZ1xuIgotIglkZWJ1Z19wb2ludGVyXG4iCi0iCWRlYnVnX2tleWJvYXJkXG4iCi0iCT1GIGxvZ2ZpbGU6XG4iCi0iCT1HQSBzaG93LWxvZ2ZpbGVcbiIKLSIJPUdBIHRhaWwtbG9nZmlsZVxuIgotIglxdWlldFxuIgotIgktLVxuIgotIgk9R0Egc2hvdy1zdGFydC1jbWRcbiIKLSIJPURHIGRlYnVnX2d1aVxuIgotIgk9R0FMIE1pc2MtRGVidWc6OlxuIgotIglkZWJ1Z194ZXZlbnRzXG4iCi0iCWRlYnVnX3hkYW1hZ2VcbiIKLSIJPS1DOjAsMSwyLDMgZGVidWdfd2lyZWZyYW1lOlxuIgotIglkZWJ1Z19zY3JvbGxcbiIKLSIJZGVidWdfdGlsZXNcbiIKLSIJZGVidWdfZ3JhYnNcbiIKLSIJZGVidWdfc2VsXG4iCi0iCWRlYnVnX25jYWNoZVxuIgotIglkYmdcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iXG4iCi0iUGVybWlzc2lvbnNcbiIKLSIJPURSUUEgbG9ja1xuIgotIgk9RFJRQSB1bmxvY2tcbiIKLSIJPUQgc2hhcmVkXG4iCi0iCT1EIGZvcmV2ZXJcbiIKLSIJLS1cbiIKLSIJPURGUCBhbGxvdzpcbiIKLSIJPUQgbG9jYWxob3N0XG4iCi0iCT1SQSBhbGxvd29uY2U6XG4iCi0iCWxpc3RlbjpcbiIKLSIJLS0gRFxuIgotIgk9RCB2aWV3b25seVxuIgotIglpbnB1dDpcbiIKLSIJLS1cbiIKLSIJPUdBTCBQYXNzd29yZHM6OlxuIgotIglwYXNzd2Q6XG4iCi0iCXZpZXdwYXNzd2Q6XG4iCi0iCT1GIHBhc3N3ZGZpbGU6XG4iCi0iCT1GIHJmYmF1dGg6XG4iCi0iCXVzZXB3XG4iCi0iCS0tXG4iCi0iCXVuaXhwd1xuIgotIgl1bml4cHdfbGlzdDpcbiIKLSIJdW5peHB3X25pc1xuIgotIgl1bml4cHdfbmlzX2xpc3Q6XG4iCi0iCT0wIHN0b3JlcGFzc3dkXG4iCi0iCT1HQUwgTE9GRlxuIgotIgk9R0FMIFNTTDo6XG4iCi0iCXNzbFxuIgotIgk9RiBzc2xfcGVtOlxuIgotIglzdHVubmVsXG4iCi0iCT1GIHN0dW5uZWxfcGVtOlxuIgotIgk9RiBzc2xkaXI6XG4iCi0iCT1GIHNzbHZlcmlmeTpcbiIKLSIJc3NsdGltZW91dDpcbiIKLSIJLS1cbiIKLSIJZW5jOlxuIgotIgk9R0FMIExPRkZcbiIKLSIJPUdBTCBNaXNjLVBlcm1zOjpcbiIKLSIJc2FmZXJcbiIKLSIJdW5zYWZlXG4iCi0iCT1SQSBub3JlbW90ZVxuIgotIgk9MFMgYWx3YXlzc2hhcmVkXG4iCi0iCT0wUyBuZXZlcnNoYXJlZFxuIgotIgk9MFMgZG9udGRpc2Nvbm5lY3RcbiIKLSIJPVNRQSBkZW55X2FsbFxuIgotIgl0aW1lb3V0OlxuIgotIglncmFia2JkXG4iCi0iCWdyYWJwdHJcbiIKLSIJZ3JhYmFsd2F5c1xuIgotIglncmFibG9jYWw6XG4iCi0iCWZvcmNlZHBtc1xuIgotIgljbGllbnRkcG1zXG4iCi0iCW5vc2VydmVyZHBtc1xuIgotIglub3VsdHJhZXh0XG4iCi0iCT1HQUwgTE9GRlxuIgotIlxuIgotIlR1bmluZ1xuIgotIgk9RC1DOjAsMSwyLDMsNCBwb2ludGVyX21vZGU6XG4iCi0iCWlucHV0X3NraXA6XG4iCi0iCWFsbGlucHV0XG4iCi0iCT1EIG5vZHJhZ2dpbmdcbiIKLSIJLS0gRFxuIgotIglzcGVlZHM6XG4iCi0iCT1EIHdhaXQ6XG4iCi0iCWRlZmVyOlxuIgotIgk9RCBuYXBcbiIKLSIJc2NyZWVuX2JsYW5rOlxuIgotIgktLVxuIgotIgk9R0FMIFdpcmVGcmFtZTo6XG4iCi0iCXdpcmVmcmFtZVxuIgotIgl3aXJlZnJhbWVfbW9kZTpcbiIKLSIJPS1DOm5ldmVyLHRvcCxhbHdheXMgd2lyZWNvcHlyZWN0OlxuIgotIgk9R0FMIExPRkZcbiIKLSIJPUdBTCBTY3JvbGxDb3B5UmVjdDo6XG4iCi0iCT0tQzpuZXZlcixrZXlzLG1vdXNlLGFsd2F5cyBzY3JvbGxjb3B5cmVjdDpcbiIKLSIJc2NyX2FyZWE6XG4iCi0iCXNjcl9za2lwOlxuIgotIglzY3JfaW5jOlxuIgotIglzY3Jfa2V5czpcbiIKLSIJc2NyX3Rlcm06XG4iCi0iCXNjcl9rZXlyZXBlYXQ6XG4iCi0iCXNjcl9wYXJtczpcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgWERBTUFHRTo6XG4iCi0iCXhkYW1hZ2VcbiIKLSIJeGRfYXJlYTpcbiIKLSIJeGRfbWVtOlxuIgotIgk9R0FMIExPRkZcbiIKLSIJPUdBTCBOY2FjaGU6OlxuIgotIgluY2FjaGVcbiIKLSIJbmNhY2hlX3NpemU6XG4iCi0iCW5jYWNoZV9jclxuIgotIgluY2FjaGVfbm9fbW92ZXJhaXNlXG4iCi0iCW5jYWNoZV9ub19kdGNoYW5nZVxuIgotIgluY2FjaGVfb2xkX3dtXG4iCi0iCW5jYWNoZV9ub19yb290cGl4bWFwXG4iCi0iCW5jYWNoZV9rZWVwX2FuaW1zXG4iCi0iCW5jYWNoZV9wYWQ6XG4iCi0iCT1SQSBuY2FjaGVfcmVzZXRfcm9vdHBpeG1hcFxuIgotIgk9R0FMIExPRkZcbiIKLSIJLS1cbiIKLSIJPUdBTCBTaGFyZWRNZW1vcnk6OlxuIgotIglub3NobVxuIgotIglmbGlwYnl0ZW9yZGVyXG4iCi0iCW9uZXRpbGVcbiIKLSIJPUdBTCBMT0ZGXG4iCi0iCT1HQUwgTWlzYy1UdW5pbmc6OlxuIgotIglwcm9ncmVzc2l2ZTpcbiIKLSIJZnM6XG4iCi0iCWdhcHM6XG4iCi0iCWdyb3c6XG4iCi0iCWZ1eno6XG4iCi0iCWV4dHJhX2ZidXI6XG4iCi0iCXdhaXRfdWk6XG4iCi0iCXNldGRlZmVyOlxuIgotIglub3dhaXRfYm9nXG4iCi0iCXNsb3dfZmI6XG4iCi0iCXhyZWZyZXNoOlxuIgotIglyZWFkdGltZW91dDpcbiIKLSIJc25hcGZiXG4iCi0iCXRocmVhZHNcbiIKLSIJd21kdDpcbiIKLSIJcmZid2FpdDpcbiIKLSIJbm9kcG1zXG4iCi0iCW5vZmJwbVxuIgotIgk9R0FMIExPRkZcbiIKLSJcIlxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNldF9pbnRlcm5hbF9oZWxwIHt9IHtcbiIKLSIJZ2xvYmFsIGhlbHB0ZXh0IGhlbHBhbGxcbiIKLSJcbiIKLSIJIyBzZXQgc29tZSBpbnRlcm5hbCBpdGVtIGhlbHAgaGVyZTpcbiIKLSIJc2V0IGhlbHB0ZXh0KHN0YXJ0KSBcIlxuIgotIkxhdW5jaCB4MTF2bmMgd2l0aCB0aGUgc2V0dGluZ3MgeW91IGhhdmUgcHJlc2NyaWJlZCBpbiB0aGUgZ3VpLlxuIgotIlRoZSB4MTF2bmMgcHJvY2VzcyBpcyBzdGFydGVkIGluIGFuIHh0ZXJtIHdpbmRvdyBzbyB5b3UgY2FuIHNlZSB0aGVcbiIKLSJvdXRwdXQsIGtpbGwgaXQsIGV0Yy5cbiIKLSJcbiIKLSJCeSB2aWV3aW5nIHRoaXMgaGVscCBpdGVtLCB0aGUgY29tbWFuZCBidWlsdCBzbyBmYXIgd2lsbCBiZSBkaXNwbGF5ZWRcbiIKLSJpbiB0aGUgZ3VpIHRleHQgYXJlYS4gIEhhdmUgYSBsb29rLiAgSWYgeW91IFByZXNzIHN0YXJ0IGl0IHdpbGwgYmUgc2hvd25cbiIKLSJhcyB3ZWxsIGFuZCB5b3Ugd2lsbCBiZSBhc2tlZCB0byBjb25maXJtIHJ1bm5pbmcgaXQuXG4iCi0iXG4iCi0iSWYgeW91IHdhbnQgdG8gdXNlIGEgc2F2ZWQgcHJvZmlsZSBcXFwicmMgZmlsZVxcXCIgeW91IGNhbiBkbyBcXFwiTWlzYyAtPiByY1xcXCIgYW5kXG4iCi0ic2VsZWN0IHRoZSBmaWxlIGFuZCBzaW1wbHkgc3RhcnQgeDExdm5jIHVzaW5nIHRoZSByYyBmaWxlLiAgQWx0ZXJuYXRpdmVseSxcbiIKLSJ5b3UgY291bGQgZmlyc3QgdXNlIHRoZSBcXFwiQWN0aW9ucyAtPiBsb2FkLXNldHRpbmdzXFxcIiBhY3Rpb24gdG8gbG9hZCBpblxuIgotImFuIFxcXCJyYyBmaWxlXFxcIiBhbmQgdGhlbiBwcmVzcyBcXFwiQWN0aW9ucyAtPiBzdGFydFxcXCIgdG8gc3RhcnQgdXAgeDExdm5jXG4iCi0iYmFzZWQgb24gdGhvc2UgdmFsdWVzLlxuIgotIlwiXG4iCi0iCXNldCBoZWxwdGV4dChzdG9wKSBcIlxuIgotIlRoZSBcXFwiQWN0aW9ucyAtPiBzdG9wXFxcIiBhY3Rpb24gc2VuZHMgYSBzaWduYWwgdG8gdGhlIHJ1bm5pbmcgeDExdm5jXG4iCi0ic2VydmVyIGluZGljYXRpbmcgaXQgc2hvdWxkIHNodXRkb3duIGFsbCBjb25uZWN0aW9ucyBhbmQgZXhpdC5cbiIKLSJcbiIKLSJUaGUgR1VJIHN0YXlzIHJ1bm5pbmcgaW4gY2FzZSB5b3Ugd2FudCB0byBzdGFydCBhIG5ldyB4MTF2bmMgb3IgYXR0YWNoXG4iCi0idG8gYW5vdGhlciBvbmUuICBVc2UgXFxcIkFjdGlvbnMgLT4gUXVpdFxcXCIgaWYgeW91IHRoZW4gd2FudCB0byBoYXZlIHRoZVxuIgotImd1aSBleGl0LiBVc2UgXFxcIkFjdGlvbnMgLT4gc3RvcCtxdWl0XFxcIiB0byBoYXZlIGJvdGggZXhpdCBhdCBvbmNlLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzaG93LXN0YXJ0LWNtZCkgXCJcbiIKLSJEaXNwbGF5cyBpbiB0aGUgdGV4dCBhcmVhIHdoYXQgdGhlIHgxMXZuYyBzdGFydCBjb21tYW5kIChpLmUuIHRoZSBjb21tYW5kXG4iCi0icnVuIGJ5IFxcXCJBY3Rpb25zIC0+IHN0YXJ0XFxcIikgbG9va3MgbGlrZSBmb3IgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZVxuIgotInNldHRpbmdzLiAgVGhpcyBjYW4gYmUgZG9uZSBldmVuIGluIHRoZSBhdHRhY2hlZCBzdGF0ZS4gIEludGVuZGVkIGZvclxuIgotImRlYnVnZ2luZyB0aGUgZ3VpLiAgVGhlIGhlbHAgaXRlbSBmb3IgXFxcIkFjdGlvbnMgLT4gc3RhcnRcXFwiIGdpdmVzIHRoZVxuIgotInNhbWUgaW5mby5cbiIKLSJcbiIKLSJJZiB5b3Ugd2FudCB0byBsb2FkIGluIGEgc2F2ZWQgcHJvZmlsZSBcXFwicmMgZmlsZVxcXCIgdXNlIFxcXCJNaXNjIC0+IHJjXFxcIlxuIgotImFuZCBzZWxlY3QgdGhlIGZpbGUuICBcXFwiQWN0aW9ucyAtPiBsb2FkLXNldHRpbmdzXFxcIiBkb2VzIGEgc2ltaWxhciB0aGluZ1xuIgotIndpdGggYW4gcmMtZmlsZSwgYnV0IHJlYWRpbmcgdGhlIGZpbGUgYW5kIHNldHRpbmcgdGhlIGd1aSB2YXJpYWJsZXMgdG9cbiIKLSJpdHMgdmFsdWVzLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChkZWJ1Z19ndWkpIFwiXG4iCi0iU2V0IGRlYnVnX2d1aSB0byBnZXQgbW9yZSBvdXRwdXQgcHJpbnRlZCBpbiB0aGUgdGV4dCBhcmVhLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChkZXRhY2gpIFwiXG4iCi0iTm8gbG9uZ2VyIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgeDExdm5jIHNlcnZlci4gIFN3aXRjaCB0byB0aGVcbiIKLSJub24tY29ubmVjdGVkIHN0YXRlLiAgVGhlIHgxMXZuYyBzZXJ2ZXIga2VlcHMgcnVubmluZzogaXQgZG9lcyBub3QgZXhpdC5cbiIKLSJcbiIKLSJZb3UgY2FuIGVpdGhlciBsYXRlciByZWF0dGFjaCB0byBpdCBcXFwiQWN0aW9ucyAtPiBhdHRhY2hcXFwiLCBvciBzdGFydFxuIgotInVwIGEgbmV3IHgxMXZuYyBcXFwiQWN0aW9ucyAtPiBzdGFydFxcXCIsIG9yIGV4aXQgXFxcIkFjdGlvbnMgLT4gUXVpdFxcXCIuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KGF0dGFjaCkgXCJcbiIKLSJBdHRhY2ggdG8gYSBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIsIGlmIHBvc3NpYmxlLiAgU3dpdGNoZXMgdG8gY29ubmVjdGVkXG4iCi0ic3RhdGUgaWYgc3VjY2Vzc2Z1bC4gIFVzdWFsbHkgdGhlIGNoYW5uZWwgdXNlZCB0byBhdHRhY2ggaXMgdmlhIHRoZSBYXG4iCi0iZGlzcGxheSAoVk5DX0NPTk5FQ1Qgcm9vdHdpbiBwcm9wZXJ0eSkgYmVpbmcgcG9sbGVkIGJ5IHRoZSB4MTF2bmMgc2VydmVyLlxuIgotIlRvIGNoYW5nZSBvciBzZXQgdGhlIFggZGlzcGxheSB0byB1c2UgZG8gXFxcIkRpc3BsYXlzIC0+IGRpc3BsYXlcXFwiLlxuIgotIlxuIgotIlNvbWV0aW1lcyB0aGUgXFxcIi1jb25uZWN0IC9wYXRoL3RvL2ZpbGVuYW1lXFxcIiBpcyB1c2VkIGFzIHRoZSBjb21tdW5jYXRpb25cbiIKLSJjaGFubmVsLiAgVGhlIHJ1bm5pbmcgeDExdm5jIGhhcyB0byBrbm93IHRoYXQgXFxcIi9wYXRoL3RvL2ZpbGVuYW1lXFxcIlxuIgotImlzIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKGkuZS4gaXQgaXMgdXNpbmcgdGhlIHNhbWUgLWNvbm5lY3Qgb3B0aW9uKS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQocGluZykgXCJcbiIKLSJDaGVjayBpZiB4MTF2bmMgc3RpbGwgcmVzcG9uZHMgdG8gXFxcInBpbmdcXFwiIHJlbW90ZSBjb21tYW5kLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dCh1cGRhdGUtYWxsKSBcIlxuIgotIlF1ZXJ5IHRoZSB4MTF2bmMgc2VydmVyIGZvciB0aGUgY3VycmVudCB2YWx1ZXMgb2YgYWxsIHZhcmlhYmxlcy5cbiIKLSJQb3B1bGF0ZSB0aGUgdmFsdWVzIGludG8gdGhlIGd1aSdzIGRhdGFiYXNlLlxuIgotIlxuIgotIk5vcm1hbGx5IHRoZSBndWkgd2lsbCByZWZyZXNoIHRoaXMgaW5mbyBldmVyeSB0aW1lIGl0IGludGVyYWN0cyB3aXRoXG4iCi0idGhlIHgxMXZuYyBzZXJ2ZXIgKGluY2x1ZGluZyBhZnRlciBhIGZldyBtaW51dGVzIG9mIGluYWN0aXZpdHkpLCBzbyBvbmVcbiIKLSJkb2Vzbid0IG5lZWQgdG8gdXNlIHRoaXMgYWN0aW9uIHZlcnkgb2Z0ZW4gKHVubGVzcyBzb21ldGhpbmcgZWxzZSBpc1xuIgotImNoYW5naW5nIHRoZSBzdGF0ZSBvZiB0aGUgeDExdm5jIHNlcnZlciwgb3IgbmV3IGNsaWVudHMgaGF2ZSBjb25uZWN0ZWQsXG4iCi0iZXRjKS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoY2xlYXItYWxsKSBcIlxuIgotIkZvcmdldCBhbnkgdmFyaWFibGUgc2V0dGluZ3MgZWl0aGVyIGVudGVyZWQgaW4gYnkgeW91IG9yIHNldCBhdCB0aGVcbiIKLSJkZWZhdWx0LiAgQmFzaWNhbGx5IHNldHMgZXZlcnl0aGluZyB0byAwIG9yIHRoZSBzdHJpbmcgKHVuc2V0KS5cbiIKLSJcbiIKLSJUaGlzIGFjdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBcXFwic3RhcnR1cFxcXCIgbW9kZSwgbm90IHdoZW4gY29ubmVjdGVkXG4iCi0idG8gYSBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIgKGluIHRoYXQgY2FzZSB0aGUgdmFyaWFibGUgc2V0dGluZ3MgcmVmbGVjdFxuIgotInRoZSBzdGF0ZSBvZiB0aGUgcnVubmluZyB4MTF2bmMpLiAgVG8gZGV0YWNoIGZyb20gYSBydW5uaW5nIHgxMXZuY1xuIgotInNlcnZlciB1c2UgXFxcIkFjdGlvbnMgLT4gZGV0YWNoXFxcIjsgdG8gY29tcGxldGVseSBzdG9wIHRoZSB4MTF2bmMgc2VydmVyXG4iCi0idXNlIFxcXCJBY3Rpb25zIC0+IHN0b3BcXFwiLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChkZWZhdWx0cy1hbGwpIFwiXG4iCi0iUmVzZXQgYWxsIHZhcmlhYmxlIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4gIEJhc2ljYWxseSBzZXRzXG4iCi0iZXZlcnl0aGluZyB0byB0aGUgZGVmYXVsdCBxdWVyaWVzIFxcXCJ4MTF2bmMgLVFEIHZhclxcXCIgcmV0cmlldmVkIGF0IHN0YXJ0dXAuXG4iCi0iXG4iCi0iVGhpcyBhY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaW4gXFxcInN0YXJ0dXBcXFwiIG1vZGUsIG5vdCB3aGVuIGNvbm5lY3RlZFxuIgotInRvIGEgcnVubmluZyB4MTF2bmMgc2VydmVyIChpbiB0aGF0IGNhc2UgdGhlIHZhcmlhYmxlIHNldHRpbmdzIHJlZmxlY3RcbiIKLSJ0aGUgc3RhdGUgb2YgdGhlIHJ1bm5pbmcgeDExdm5jKS4gIFRvIGRldGFjaCBmcm9tIGEgcnVubmluZyB4MTF2bmNcbiIKLSJzZXJ2ZXIgdXNlIFxcXCJBY3Rpb25zIC0+IGRldGFjaFxcXCI7IHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgeDExdm5jIHNlcnZlclxuIgotInVzZSBcXFwiQWN0aW9ucyAtPiBzdG9wXFxcIi5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQobG9hZC1zZXR0aW5ncykgXCJcbiIKLSJSZWFkIGluIHRoZSBcXFwicmMgZmlsZVxcXCIgeW91IHByZXNjcmliZSBpbiB0aGUgZGlhbG9nIGFuZCB0aGVuIHNldCB0aGVcbiIKLSJ2YXJpYWJsZXMgdG8gdGhvc2UgaW4gdGhlIHJjLWZpbGUuICBBbnkgdmFyaWFibGVzIG5vdCBtZW50aW9uZWQgaW4gdGhlXG4iCi0icmMtZmlsZSBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuXG4iCi0iXG4iCi0iWW91IGNvdWxkIHRoZW4gZG8gXFxcIkFjdGlvbnMgLT4gc3RhcnRcXFwiIHRvIHN0YXJ0IHgxMXZuYyB3aXRoIHRoZXNlXG4iCi0icGFyYW1ldGVycy4gIE9yIHlvdSBjb3VsZCBtYWtlIHNvbWUgZnVydGhlciBjaGFuZ2VzIHRvIHZhcmlhYmxlc1xuIgotInVzaW5nIHRoZSBndWkgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYy5cbiIKLSJcbiIKLSJUaGlzIGFjdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBcXFwic3RhcnR1cFxcXCIgbW9kZSwgbm90IHdoZW4gY29ubmVjdGVkXG4iCi0idG8gYSBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIgKGluIHRoYXQgY2FzZSB0aGUgdmFyaWFibGUgc2V0dGluZ3MgcmVmbGVjdFxuIgotInRoZSBzdGF0ZSBvZiB0aGUgcnVubmluZyB4MTF2bmMpLiAgVG8gZGV0YWNoIGZyb20gYSBydW5uaW5nIHgxMXZuY1xuIgotInNlcnZlciB1c2UgXFxcIkFjdGlvbnMgLT4gZGV0YWNoXFxcIjsgdG8gY29tcGxldGVseSBzdG9wIHRoZSB4MTF2bmMgc2VydmVyXG4iCi0idXNlIFxcXCJBY3Rpb25zIC0+IHN0b3BcXFwiLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzYXZlLXNldHRpbmdzKSBcIlxuIgotIkNvbnN0cnVjdCBhIH4vLngxMXZuY3JjIGZpbGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2V0dGluZ3MgYW5kXG4iCi0ib2ZmZXIgdG8gc2F2ZSBpdCBpbiBhIGZpbGUgKGRlZmF1bHQgfi8ueDExdm5jcmMpLiAgSWYgc2F2ZWQgaW4gYVxuIgotImZpbGUgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCwgeW91IGNhbiBhY2Nlc3MgdGhlIHByb2ZpbGUgYnkgdXNpbmdcbiIKLSJ0aGUgXFxcIi1yYyA8ZmlsZW5hbWU+XFxcIiBvcHRpb24gd2hlbiBzdGFydGluZyB4MTF2bmMuXG4iCi0iXG4iCi0iSWYgYW4gcmMgZmlsZSBlbnRyeSBiZWdpbnMgd2l0aCBcXFwiI2RcXFwiIHRoYXQgbWVhbnMgdGhlIGN1cnJlbnRcbiIKLSJzZXR0aW5nIGlzIGF0IHRoZSBEZWZhdWx0IHZhbHVlIGFuZCBzbyB5b3UgcHJvYmFibHkgd2FudCB0byBsZWF2ZVxuIgotIml0IGNvbW1lbnRlZCBvdXQgd2l0aCB0aGUgXFxcIiNcXFwiIGNoYXJhY3Rlci5cbiIKLSJcbiIKLSJJZiBhbiByYyBmaWxlIGVudHJ5IGJlZ2lucyB3aXRoIFxcXCIjP1xcXCIgdGhhdCBtZWFucyB3ZSB0aGlua1xuIgotInlvdSBwcm9iYWJseSBkbyBub3QgcmVhbGx5IHdhbnQgdG8gZm9yY2UgdGhlIHZhbHVlIHRvIHRoaXMgc2V0dGluZy5cbiIKLSJcbiIKLSJJbiBlaXRoZXIgY2FzZSwgZmVlbCBmcmVlIHRvIHVuY29tbWVudCB0aGUgbGluZSBhbmQvb3IgY2hhbmdlIGFueVxuIgotIm9mIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGluIHRoZSBmaWxlLiBcbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoYWxsLXNldHRpbmdzKSBcIlxuIgotIkRpc3BsYXlzIHRoZSBndWkncyBkYXRhYmFzZSBvZiBhbGwgb2YgdGhlIHgxMXZuYyBzZXJ2ZXIncyBjdXJyZW50XG4iCi0ic2V0dGluZ3MuICBVc2UgXFxcIkFjdGlvbnMgLT4gdXBkYXRlLWFsbFxcXCIgIG9yIFxcXCJDb250cm9sK1JcXFwiIHRvXG4iCi0icmVmcmVzaCB0aGlzIGxpc3QgaWYgaXQgZXZlciBnZXRzIG91dCBvZiBzeW5jLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChyZW1vdGUtY21kKSBcIlxuIgotIlJ1biBhIHJlbW90ZSBjb21tYW5kICgtUikgb3IgcXVlcnkgKC1RKSBkaXJlY3RseS4gIE9ubHkgYSBmZXdcbiIKLSJyZW1vdGUgY29tbWFuZHMgYXJlIG5vdCBvbiBhIG1lbnUsIGJ1dCBmb3IgdGhvc2UgZmV3IHlvdSBjYW5cbiIKLSJydW4gdGhlIGNvbW1hbmQgZGlyZWN0bHkgdGhpcyB3YXkuICBKdXN0IGVudGVyIHRoZSBjb21tYW5kIGludG9cbiIKLSJ0aGUgRW50cnkgYm94IHdoZW4gcHJvbXB0ZWQuICBVc2UgdGhlIHByZWZpeCBcXFwiUTpcXFwiIHRvIGluZGljYXRlXG4iCi0iYSAtUSBxdWVyeS4gIEV4YW1wbGVzOiBcXFwiemVybzoyMCwyMCwxMDAsMTAwXFxcIiwgXFxcIlE6ZXh0X3hmaXhlc1xcXCIgIFxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzdG9wK3F1aXQpIFwiXG4iCi0iU2VuZCB0aGUgc3RvcCBjb21tYW5kIHRvIHRoZSB4MTF2bmMgc2VydmVyLCB0aGVuIHRlcm1pbmF0ZSB0aGUgdGt4MTF2bmMgZ3VpLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzaG93LWxvZ2ZpbGUpIFwiXG4iCi0iVmlldyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgbG9nZmlsZSAoaWYgaXQgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlXG4iCi0iYnkgdGhlIGd1aSBwcm9jZXNzKS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQodGFpbC1sb2dmaWxlKSBcIlxuIgotIlJ1biB0aGUgdGFpbCgxKSBjb21tYW5kIHdpdGggLWYgb3B0aW9uIG9uIHRoZSBsb2dmaWxlIGluIGFuIHh0ZXJtLlxuIgotIihpZiBpdCBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGUgYnkgdGhlIGd1aSBwcm9jZXNzKS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoUXVpdCkgXCJcbiIKLSJUZXJtaW5hdGUgdGhlIHRreDExdm5jIGd1aS4gIEFueSB4MTF2bmMgc2VydmVyIHdpbGwgYmUgbGVmdCBydW5uaW5nLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChjdXJyZW50KSBcIlxuIgotIlNob3dzIGEgbWVudSBvZiBjdXJyZW50bHkgY29ubmVjdGVkIFZOQyBjbGllbnRzIG9uIHRoZSB4MTF2bmMgc2VydmVyLlxuIgotIlxuIgotIkFsbG93cyB5b3UgdG8gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZW0sIGNoYW5nZSB0aGVpciBpbnB1dFxuIgotInBlcm1pc3Npb25zLCBvciBkaXNjb25uZWN0IHRoZW0uXG4iCi0iXG4iCi0iTm90ZSB0aGF0IHRoZSBGaWxlIHRyYW5zZmVyIHBlcm1pc3Npb24gb25seSBhcHBsaWVzIHRvIFVsdHJhVk5DXG4iCi0iZmlsZSB0cmFuc2Zlciwgbm90IFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIuXG4iCi0iXG4iCi0iWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gY29uZmlybSBhbnkgZGlzY29ubmVjdGlvbnMuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KGNsaWVudCkgXCJcbiIKLSJBZnRlciBzZWxlY3RpbmcgYSBWTkMgY2xpZW50IGZyb20gdGhlIFxcXCJDbGllbnRzIC0+IGN1cnJlbnRcXFwiIG1lbnUsXG4iCi0ieW91IHdpbGwgYmUgcHJlc2VudGVkIHdpdGggYSBkaWFsb2cgdGhhdCBzaG93cyB0aGUgaW5mb3JtYXRpb25cbiIKLSJhYm91dCB0aGUgVk5DIGNsaWVudC5cbiIKLSJcbiIKLSJZb3UgY2FuIGNob29zZSB0byBkaXNjb25uZWN0IHRoZSBjbGllbnQgYnkgY2xpY2tpbmcgb24gdGhlIFxuIgotIlxcXCJEaXNjb25uZWN0XFxcIiBjaGVja2JveCBhbmQgcHJlc3NpbmcgXFxcIk9LXFxcIi4gIFRoZXJlIHdpbGwgYmUgYVxuIgotImNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gZG91YmxlY2hlY2suXG4iCi0iXG4iCi0iQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBmaW5lIHR1bmUgdGhlIFZOQyBjbGllbnQncyBpbnB1dCBwZXJtaXNzaW9uc1xuIgotImJ5IHNlbGVjdGluZyBhbnkgb2YgdGhlIEtleXN0cm9rZXMsIE1vdXNlLU1vdGlvbiwgQnV0dG9uLUNsaWNrLFxuIgotIkNsaXBib2FyZC1JbnB1dCwgb3IgRmlsZXMgY2hlY2tib3hlcyBhbmQgcHJlc3NpbmcgXFxcIk9LXFxcIi4gIFRoaXMgaXMgbGlrZVxuIgotInRoZSBcXFwiLWlucHV0XFxcIiBvcHRpb24gYnV0IG9uIGEgcGVyLWNsaWVudCBiYXNpcy5cbiIKLSJcbiIKLSJUbyBub3QgY2hhbmdlIGFueSBhc3BlY3RzIG9mIHRoZSBWTkMgY2xpZW50IHByZXNzIFxcXCJDYW5jZWxcXFwiLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzb2xpZF9jb2xvcikgXCJcbiIKLSJTZXQgdGhlIC1zb2xpZCBjb2xvciB2YWx1ZS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoeHJhbmRyX21vZGUpIFwiXG4iCi0iU2V0IHRoZSAteHJhbmRyIG1vZGUgdmFsdWUuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KHVuaXhwd19saXN0KSBcIlxuIgotIlNldCB0aGUgLXVuaXhwdyB1c2VybmFtZXMgbGlzdCB2YWx1ZS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQodW5peHB3X25pc19saXN0KSBcIlxuIgotIlNldCB0aGUgLXVuaXhwd19uaXMgdXNlcm5hbWVzIGxpc3QgdmFsdWUuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KHN0dW5uZWxfcGVtKSBcIlxuIgotIlNldCB0aGUgLXN0dW5uZWwgcGVtIGZpbGVuYW1lIHZhbHVlLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChzc2xfcGVtKSBcIlxuIgotIlNldCB0aGUgLXNzbCBwZW0gZmlsZW5hbWUgdmFsdWUuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KHdpcmVmcmFtZV9tb2RlKSBcIlxuIgotIlNldCB0aGUgLXdpcmVmcmFtZSBtb2RlIHN0cmluZyB2YWx1ZS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoc2ltcGxlLWd1aSkgXCJcbiIKLSJUb2dnbGUgYmV0d2VlbiBtZW51IGl0ZW1zIGNvcnJlc3BvbmRpbmcgdGhlIG1vc3QgYmFzaWMgb25lc1xuIgotImFuZCBhbGwgcG9zc2libGUgc2V0dGluZ3MuICBJLmUuIHRvZ2dsZSBiZXR3ZWVuIGEgc2ltcGxlIGd1aVxuIgotImFuZCBvbmUgZm9yIHBvd2VyIHVzZXJzLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChUcmF5KSBcIlxuIgotIlRoZSB0cmF5L2ljb24gbW9kZSAoc3RhcnRlZCB3aXRoIFxcXCJ4MTF2bmMgLWd1aSB0cmF5IC4uLlxcXCIsIGV0Yy4pIHByZXNlbnRzXG4iCi0iYSBzbWFsbCBpY29uIHRoYXQgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIHJ1bm5pbmcgeDExdm5jIHNlcnZlci5cbiIKLSJcbiIKLSJEZXBlbmRpbmcgb24geW91ciBlbnZpcm9ubWVudCwgdGhpcyBpY29uIG1heSBiZSBlbWJlZGRlZCBpbiBhIHN5c3RlbVxuIgotInRyYXkgb3IgYXBwbGV0IGRvY2ssIG9yIHNpbXBseSBiZSBhIHN0YW5kYWxvbmUgd2luZG93LiAgXFxcIi1ndWkgdHJheVxcXCJcbiIKLSJ3aWxsIGF0dGVtcHQgdG8gZW1iZWQgdGhlIGljb24gaW4gdGhlIHN5c3RlbSB0cmF5LCB3aGlsZSBcXFwiLWd1aSBpY29uXFxcIlxuIgotImlzIGZvciBhIHN0YW5kYWxvbmUgd2luZG93LiAgVXNlIFxcXCItZ3VpIHRyYXk9c2V0cGFzc1xcXCIgKG9yIGljb249c2V0cGFzcylcbiIKLSJ0byBiZSBwcm9tcHRlZCB0byBzZXQgdGhlIHNlc3Npb24gcGFzc3dvcmQgYXQgc3RhcnR1cC5cbiIKLSJcbiIKLSJXaGVuIHRoZSBpY29uIGhhcyBhIGxpZ2h0IGJhY2tncm91bmQsIHRoYXQgbWVhbnMgbm8gVk5DIHZpZXdlcnMgYXJlXG4iCi0iY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgVk5DIGRpc3BsYXkuXG4iCi0iXG4iCi0iV2hlbiB0aGUgaWNvbiBoYXMgYSBkYXJrIGJhY2tncm91bmQgKGkuZS4gcmV2ZXJzZS12aWRlbyksIHRoYXQgbWVhbnMgYXRcbiIKLSJsZWFzdCBvbmUgVk5DIHZpZXdlciBpcyBjb25uZWN0ZWQgdG8gdGhlIFZOQyBkaXNwbGF5LlxuIgotIlxuIgotIk1vdmluZyB0aGUgbW91c2UgcG9pbnRlciBvdmVyIHRoZSBpY29uIHdpbGwgcG9wdXAgYSBcXFwic3RhdHVzIGJhbGxvb25cXFwiXG4iCi0iaW5kaWNhdGluZyB0aGUgVk5DIGRpc3BsYXkgbmFtZSBhbmQgdGhlIG5hbWVzIGFuZCBpbmZvIG9mIGFueSBjb25uZWN0ZWQgVk5DXG4iCi0idmlld2Vycy4gIFByZXNzIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uIGlmIHRoZSBiYWxsb29uIGRvZXMgbm90IGFwcGVhci5cbiIKLSJcbiIKLSJDbGlja2luZyB0aGUgbGVmdCBvciByaWdodCBtb3VzZSBidXR0b24gb24gdGhlIGljb24gZGlzcGxheXMgYSBtZW51XG4iCi0ib2YgYWN0aW9uczpcbiIKLSJcbiIKLSIgICAgUHJvcGVydGllcyAgICAgIC0gQnJpbmdzIHVwIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZyB0byBzZXQgc29tZSBiYXNpY1xuIgotIiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLiAgVGhlIGZ1bGwgdGt4MTF2bmMgR1VJIG1heSBiZSBhY2Nlc3NlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICB2aWEgdGhlIFxcXCJBZHZhbmNlZCAuLi5cXFwiIGJ1dHRvbi4gIFByZXNzIFxcXCJIZWxwXFxcIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgUHJvcGVydGllcyBkaWFsb2cgZm9yIG1vcmUgaW5mby5cbiIKLSIgICAgXG4iCi0iICAgIEhlbHAgICAgICAgICAgICAtIERpc3BsYXlzIHRoaXMgaGVscCB0ZXh0LlxuIgotIiAgICBcbiIKLSIgICAgTmV3IENsaWVudCAgICAgIC0gUHJlc2VudHMgYW4gZW50cnkgYm94IHdoZXJlIHlvdSB0eXBlIGluIHRoZSBuYW1lXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIG9mIGEgY29tcHV0ZXIgdGhhdCBpcyBydW5uaW5nIGEgVk5DIHZpZXdlciBpblxuIgotIiAgICAgICAgICAgICAgICAgICAgICBcXFwibGlzdGVuXFxcIiBtb2RlIChlLmcuIHZuY3ZpZXdlciAtbGlzdGVuKS4gIEZvciBhXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGFuZGFyZCBsaXN0ZW5pbmcgcG9ydCB1c2UgXFxcImhvc3Q6cG9ydFxcXCIuXG4iCi0iXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFByZXNzaW5nIFxcXCJPS1xcXCIgd2lsbCBpbml0aWF0ZSB0aGUgcmV2ZXJzZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLiAgVXNlIGEgYmxhbmsgaG9zdG5hbWUgdG8gc2tpcCBpdC5cbiIKLSIgICAgXG4iCi0iICAgIERpc2Nvbm5lY3QgICAgICAtIFNob3dzIGEgcG9wdXAgbWVudSBvZiBjb25uZWN0ZWQgY2xpZW50cy4gIENsaWNrIG9uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIG9uZSB0byBkaXNjb25uZWN0IGl0LCBvciBjbGljayBvbiBcXFwiQWxsIENsaWVudHNcXFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QgYWxsIGNsaWVudHMuXG4iCi0iXG4iCi0iICAgIFdpbmRvdyBWaWV3ICAgICAtIFN3aXRjaCBiZXR3ZWVuIHRoZSBcXFwiZnVsbFxcXCIgZ3VpIChhbHNvIGtub3duIGFzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFxcXCJBZHZhbmNlZFxcXCIpLCBcXFwiaWNvblxcXCIgbW9kZSAoc21hbGwgaWNvbiB3aW5kb3cgd2l0aFxuIgotIiAgICAgICAgICAgICAgICAgICAgICBwb3B1cHMpLCBvciBcXFwidHJheVxcXCIgbW9kZSAoc21hbGwgaWNvbiBlbWJlZGRlZCBpbiB0aGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIHRyYXkpLiAgVGhpcyBpcyBhIHNob3J0Y3V0IGZvciB0aGUgYWN0aW9uOlxuIgotIiAgICAgICAgICAgICAgICAgICAgICBcXFwiUHJvcGVydGllcyAtPiBBZHZhbmNlZCAtPiBNaXNjIC0+IFdpbmRvd1ZpZXdcXFwiLlxuIgotIiAgICBcbiIKLSIgICAgU3RvcCB4MTF2bmMgICAgIC0gRGlyZWN0cyB0aGUgeDExdm5jIHNlcnZlciB0byBkaXNjb25uZWN0IGFsbCB2bmN2aWV3ZXJzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGV4aXQuICBUaGUgdHJheS9pY29uIEdVSSB0aGVuIGV4aXRzIGFzIHdlbGwuXG4iCi0iXG4iCi0iICAgIExvZ2ZpbGUgICAgICAgICAtIFNob3cgdGhlIGxvZ2ZpbGUgaWYgeDExdm5jIGlzIGJlaW5nIHJ1biB3aXRoIG9uZS5cbiIKLSJcbiIKLSIgICAgQ3VzdG9tICAgICAgICAgIC0gSWYgeW91IGhhdmUgYSBcXCRIT01FLy54MTF2bmMuZ3VpIGZpbGUgZWFjaCB1bmNvbW1lbnRlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICBsaW5lIGluIGl0IGJlY29tZXMgYW4gYWRkaXRpb25hbCBtZW51IGl0ZW0gZm9yIHRoaXNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgbWVudS4gIFRoZSByZW1vdGUgY29udHJvbCBjb21tYW5kIGlzIHJ1biBkaXJlY3RseVxuIgotIiAgICAgICAgICAgICAgICAgICAgICB2aWEgXFxcIngxMXZuYyAtUiA8Y29tbWFuZD5cXFwiLCBvciBpZiBwcmVmaXhlZCB3aXRoIFxuIgotIiAgICAgICAgICAgICAgICAgICAgICBcXFwiYWN0aW9uOlxcXCIgcnVucyBhIGd1aSBpbnRlcm5hbCBhY3Rpb24sIG9yIGlmIFxcXCJzZXBcXFwiXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIGFkZHMgYSBzZXBhcmF0b3IuICBTZXQgWDExVk5DX0NVU1RPTV9HVUkgdG8gdXNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGZpbGVuYW1lLiAgRXhhbXBsZSBmaWxlIGNvbnRlbnRzOlxuIgotIlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6My80XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZToxXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jdXJzb3I6MVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246YWxsLXNldHRpbmdzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVidWdfa2V5Ym9hcmRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOlF1aXRcbiIKLSJcbiIKLSJUZXJtaW5hdGlvbjpcbiIKLSJcbiIKLSJJZiB0aGUgeDExdm5jIHNlcnZlciBzdG9wcyBmb3IgYW55IHJlYXNvbiwgdGhlIHRyYXkvaWNvbiBndWkgd2lsbCBleGl0LlxuIgotIlxuIgotIklmIHlvdSBkZWxldGUgdGhlIHRyYXkvaWNvbiAoZS5nLiBYIG91dCBidXR0b24pLCB0aGF0IGlzIHRoZSBzYW1lXG4iCi0iYXMgdGhlIFxcXCJTdG9wIHgxMXZuY1xcXCIgYWN0aW9uIGluIHRoZSBtZW51LiAoVGhpcyB3aWxsIGRpc2Nvbm5lY3QgYW55XG4iCi0iVk5DIHZpZXdlciB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0byBhY2Nlc3MgdGhlIGRpc3BsYXkgc2luY2UgdGhlXG4iCi0ieDExdm5jIHNlcnZlciBpcyB0ZXJtaW5hdGVkKS5cbiIKLSJcbiIKLSJUbyB0ZXJtaW5hdGUgdGhlIHRyYXkvaWNvbiBndWkgd2luZG93IGJ1dCBub3QgdGhlIHgxMXZuYyBzZXJ2ZXIgcHJlc3NcbiIKLSJDb250cm9sLUMgb24gdGhlIHRyYXkvaWNvbiB3aW5kb3cuICBZb3UgY2FuIGFsc28gZG8gdGhpcyAoYW5kIG11Y2hcbiIKLSJtb3JlKSB2aWEgUHJvcGVydGllcyAtPiBBZHZhbmNlZCAtPiBBY3Rpb25zIC0+IFF1aXRcbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoTmV3Q2xpZW50KSBcIlxuIgotIiAgICBOZXcgQ2xpZW50ICAgICAgLSBQcmVzZW50cyBhbiBlbnRyeSBib3ggd2hlcmUgeW91IHR5cGUgaW4gdGhlIG5hbWVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb21wdXRlciB0aGF0IGlzIHJ1bm5pbmcgYSBWTkMgdmlld2VyIGluXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFxcXCJsaXN0ZW5cXFwiIG1vZGUgKGUuZy4gdm5jdmlld2VyIC1saXN0ZW4pLiAgRm9yIGFcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgbm9uLXN0YW5kYXJkIGxpc3RlbmluZyBwb3J0IHVzZSBcXFwiaG9zdDpwb3J0XFxcIi5cbiIKLSJcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgUHJlc3NpbmcgXFxcIk9LXFxcIiB3aWxsIGluaXRpYXRlIHRoZSByZXZlcnNlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICBVc2UgYSBibGFuayBob3N0bmFtZSB0byBza2lwIGl0LCBvclxuIgotIiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKFxcXCJYLW91dFxcXCIpIHRoZSB3aW5kb3cuXG4iCi0iICAgIFxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChQcm9wZXJ0aWVzKSBcIlxuIgotIlRoZSBQcm9wZXJ0aWVzIGRpYWxvZyBhbGxvd3MgeW91IHRvIHNldCBzb21lIGJhc2ljIHBhcmFtZXRlcnMgb2YgYVxuIgotInJ1bm5pbmcgeDExdm5jIHNlcnZlci4gIEFmdGVyIG1vZGlmeWluZyB0aGVtIHByZXNzIFxcXCJPS1xcXCIgb3IgXFxcIkFwcGx5XFxcIlxuIgotInRvIGFwcGx5IHRoZSBjaGFuZ2VzLCBvciBwcmVzcyBcXFwiQ2FuY2VsXFxcIiB0byBza2lwIGFwcGx5aW5nIHRoZW0uXG4iCi0iXG4iCi0iIEFjY2VwdCBDb25uZWN0aW9uczpcbiIKLSJcbiIKLSIgICBUb2dnbGVzIHdoZXRoZXIgVk5DIHZpZXdlcnMgYXJlIGFsbG93ZWQgdG8gY29ubmVjdCBvciBub3QuICBJdCBjb3JyZXNwb25kc1xuIgotIiAgIHRvIHRoZSBcXFwiLVIgdW5sb2NrXFxcIiBhbmQgXFxcIi1SIGxvY2tcXFwiIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLlxuIgotIlxuIgotIiBBc2sgZm9yIENvbmZpcm1hdGlvbjpcbiIKLSJcbiIKLSIgICBUb2dnbGVzIHdoZXRoZXIgYSBwb3B1cCBtZW51IHdpbGwgYmUgcHJlc2VudGVkIGF0IHRoZSBYIGRpc3BsYXkgd2hlblxuIgotIiAgIGEgbmV3IFZOQyB2aWV3ZXIgYXR0ZW1wdHMgdG8gY29ubmVjdC4gIFRoZSBwZXJzb24gc2l0dGluZyBhdCB0aGUgWFxuIgotIiAgIGRpc3BsYXkgY2FuIGNob29zZSB0byBhY2NlcHQgb3IgcmVqZWN0IHRoZSBjb25uZWN0aW9uIG9yIGFjY2VwdCB0aGVcbiIKLSIgICBjb25uZWN0aW9uIGluIFZpZXdPbmx5IG1vZGUuICBJdCBjb3JyZXNwb25kcyB0byB0aGUgXFxcIi1SIGFjY2VwdDpwb3B1cFxcXCJcbiIKLSIgICBhbmQgXFxcIi1SIGFjY2VwdDpcXFwiIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLlxuIgotIiAgIFxuIgotIiBBbGwgQ2xpZW50cyBWaWV3T25seTpcbiIKLSJcbiIKLSIgICBUb2dnbGVzIHdoZXRoZXIgdGhlIGVudGlyZSBWTkMgZGVza3RvcCBpcyB2aWV3IG9ubHkuICBBbGwgY2xpZW50c1xuIgotIiAgIHdpbGwgb25seSBiZSBhYmxlIHRvIHdhdGNoIHdoZW4gdGhpcyBpcyBzZXQgKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXlcbiIKLSIgICBsb2dnZWQgaW4pLiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIFxcXCItUiB2aWV3b25seVxcXCIgYW5kIFxcXCItUiBub3ZpZXdvbmx5XFxcIlxuIgotIiAgIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLlxuIgotIiAgIFxuIgotIiBTaGFyZWQ6XG4iCi0iXG4iCi0iICAgVG9nZ2xlcyB3aGV0aGVyIG11bHRpcGxlIHNpbXVsdGFuZW91cyB2aWV3ZXIgY29ubmVjdGlvbnMgYXJlIGFsbG93ZWRcbiIKLSIgICBvciBub3QuICBJdCBjb3JyZXNwb25kcyB0byB0aGUgXFxcIi1SIHNoYXJlZFxcXCIgYW5kIFxcXCItUiBub3NoYXJlZFxcXCJcbiIKLSIgICByZW1vdGUtY29udHJvbCBjb21tYW5kcy5cbiIKLSJcbiIKLSIgQWR2ZXJ0aXNlIFNlcnZpY2UgKFplcm9jb25mKTpcbiIKLSJcbiIKLSIgICBUb2dnbGVzIHdoZXRoZXIgdGhpcyBWTkMgc2VydmVyIHNob3VsZCBhZHZlcnRpemUgaXRzZWxmIHZpYSBaZXJvY29uZlxuIgotIiAgIChhbHNvIGNhbGxlZCBCb25qb3VyLCBtRE5TLCBhbmQgYXZhaGkpLiAgVGhlbiBWTkMgdmlld2VycyBjYW4gdGhlbiBmaW5kXG4iCi0iICAgdGhpcyBzZXJ2aWNlIG9uIHRoZSBsb2NhbCBuZXR3b3JrLiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlIFxcXCItUiB6ZXJvY29uZlxcXCJcbiIKLSIgICBhbmQgXFxcIi1SIG5vemVyb2NvbmZcXFwiIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzLlxuIgotIlxuIgotIiBTZXJ2ZSBKYXZhIFZpZXdlciBBcHBsZXQ6XG4iCi0iXG4iCi0iICAgVG9nZ2xlcyB3aGV0aGVyIHRoaXMgVk5DIHNlcnZlciBzaG91bGQgc2VydmUgdXAgYSBKYXZhIFZOQyBWaWV3ZXJcbiIKLSIgICBhcHBsZXQgdmlhIEhUVFAgb24gaHR0cDovL2hvc3RuYW1lOjU4MDAvIChvciBwb3J0IDU4MDArbiBmb3IgVk5DXG4iCi0iICAgcG9ydCA1OTAwK24pLiAgQSBqYXZhIGVuYWJsZWQgV2ViIEJyb3dzZXIgY2FuIHRoZW4gY29ubmVjdCB0byB0aGVcbiIKLSIgICBkZXNrdG9wYnkgVk5DLiAgSWYgU1NMIGlzIGFjdGl2ZSB0aGVuIHRoZSBIVFRQUyBVUkwgaHR0cHM6Ly9ob3N0bmFtZTo1OTAwL1xuIgotIiAgIChldGMuKSB3aWxsIHdvcmsgYXMgd2VsbC4gIFRoaXMgcmVxdWlyZXMgdGhlIHgxMXZuYyBqYXZhIHZpZXdlciBqYXIgZmlsZVxuIgotIiAgIChzaGFyZWQveDExdm5jL2NsYXNzZXMpIHRvIGJlIGluc3RhbGxlZC4gIEl0IGNvcnJlc3BvbmRzIHRvIHRoZVxuIgotIiAgIFxcXCItUiBodHRwXFxcIiBhbmQgXFxcIi1SIG5vaHR0cFxcXCIgcmVtb3RlIGNvbW1hbmRzLlxuIgotIlxuIgotIiBTb2xpZCBCYWNrZ3JvdW5kIENvbG9yOlxuIgotIlxuIgotIiAgIFRvIGltcHJvdmUgVk5DIHBlcmZvcm1hbmNlLCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZW4geDExdm5jIHdpbGwgdHJ5XG4iCi0iICAgdG8gbWFrZSB0aGUgZGVza3RvcCBiYWNrZ3JvdW5kIGEgc29saWQgY29sb3IgKHdoaWNoIGNvbXByZXNzZXMgZXh0cmVtZWx5XG4iCi0iICAgd2VsbCBjb21wYXJlZCB0byBwaG90byBpbWFnZXMsIGV0Yy4pICBJdCBjb3JyZXNwb25kcyB0byB0aGUgXFxcIi1SIHNvbGlkXFxcIlxuIgotIiAgIGFuZCBcXFwiLVIgbm9zb2xpZFxcXCIgcmVtb3RlIGNvbW1hbmRzLlxuIgotIlxuIgotIiBQYXNzd29yZDpcbiIKLSJcbiIKLSIgICBMZXRzIHlvdSBzZXQgdGhlIHNlc3Npb24gcGFzc3dvcmQgdmlld2VycyBtYXkgdXNlIHRvIGdhaW4gZnVsbCBhY2Nlc3NcbiIKLSIgICB0byB0aGUgZGlzcGxheS4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeDExdm5jIHdhcyBzdGFydGVkIHdpdGggdGhlXG4iCi0iICAgLWd1aSBpY29uIG9yIC1ndWkgdHJheSBtb2RlLlxuIgotIiAgIFxuIgotIiBWaWV3T25seSBQYXNzd29yZDpcbiIKLSJcbiIKLSIgICBMZXRzIHlvdSBzZXQgdGhlIHNlc3Npb24gcGFzc3dvcmQgdmlld2VycyBtYXkgdXNlIHRvIGdhaW4gdmlldyBvbmx5XG4iCi0iICAgYWNjZXNzIHRvIHRoZSBkaXNwbGF5LiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB4MTF2bmMgd2FzIHN0YXJ0ZWQgd2l0aFxuIgotIiAgIHRoZSAtZ3VpIGljb24gb3IgLWd1aSB0cmF5IG1vZGUuXG4iCi0iXG4iCi0iXG4iCi0iIE5PVEU6IFRoZXNlIFxcXCJzZXNzaW9uXFxcIiBwYXNzd29yZHMgb25seSBsYXN0IGZvciB0aGUgY3VycmVudCB4MTF2bmNcbiIKLSIgc2Vzc2lvbiAodGhleSBhcmUgbm90IHJlbWVtYmVyZWQsIHNlZSB0aGUgLXN0b3JlcGFzc3dkLCAtcGFzc3dkZmlsZSxcbiIKLSIgYW5kIC1yZmJhdXRoIHgxMXZuYyBvcHRpb25zIGZvciB1c2luZyBzdG9yZWQgcGFzc3dvcmRzKS5cbiIKLSJcbiIKLSIgSWYgeW91IHNldCBcXFwiUGFzc3dvcmRcXFwiIHRvIHRoZSBlbXB0eSBzdHJpbmcgdGhhdCBtYWtlcyB0aGUgXFxcIlZpZXdPbmx5XG4iCi0iIFBhc3N3b3JkXFxcIiBlbXB0eSBhcyB3ZWxsIGFuZCByZW1vdmVzIHRoZSBuZWVkIGZvciBhbnkgcGFzc3dvcmQgdG8gbG9nIGluLlxuIgotIlxuIgotIiBJZiB5b3Ugc2V0IFxcXCJWaWV3T25seSBQYXNzd29yZFxcXCIgdG8gdGhlIGVtcHR5IHN0cmluZyB0aGF0IGp1c3QgcmVtb3Zlc1xuIgotIiB0aGUgVmlld09ubHkgbG9nIGluIGFzcGVjdDogXFxcIlBhc3N3b3JkXFxcIiBpcyBzdGlsbCByZXF1aXJlZCB0byBsb2cgaW4uXG4iCi0iXG4iCi0iIC0gVGhlIFxcXCJIZWxwXFxcIiBidXR0b24gc2hvd3MgdGhpcyBoZWxwIHRleHQuXG4iCi0iICAgXG4iCi0iIC0gVGhlIFxcXCJBZHZhbmNlZCAuLi5cXFwiIGJ1dHRvbiByZXBsYWNlcyB0aGUgUHJvcGVydGllcyBkaWFsb2cgd2l0aCB0aGUgZnVsbFxuIgotIiAgIHRreDExdm5jIEdVSS4gIEFsbCBkeW5hbWljIHNldHRpbmdzIGNhbiBiZSBtb2RpZmllZCBpbiB0aGUgZnVsbCBHVUkuXG4iCi0iXG4iCi0iXG4iCi0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLSJcbiIKLSJEb24ndCBMb2NrIFlvdXJzZWxmIE91dDpcbiIKLSJcbiIKLSIgICBJZiB5b3UgYXJlIHNpdHRpbmcgYXQgdGhlIHBoeXNpY2FsIFggZGlzcGxheSB5b3UgY2Fubm90IGdldCBpbnRvIHRvb1xuIgotIiAgIG11Y2ggdHJvdWJsZSBzZXR0aW5nIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZyB2YWx1ZXMuXG4iCi0iXG4iCi0iICAgSG93ZXZlciBJRiB5b3UgYXJlIHVzaW5nIGEgVk5DIFZpZXdlciB0byBSRU1PVEVMWSBhY2Nlc3MgdGhlIFggZGlzcGxheVxuIgotIiAgIHNvbWUgaXRlbXMgaW4gdGhlIFByb3BlcnRpZXMgZGlhbG9nIGNhbiBsb2NrIHlvdSBvdXQgb2YgZnVydGhlciBhY2Nlc3M6XG4iCi0iXG4iCi0iICAgICAgXFxcIkFjY2VwdCBDb25uZWN0aW9uc1xcXCIgIGlmIHlvdSBkaXNhYmxlIHRoaXMgcmVtb3RlbHksIGFuZFxuIgotIiAgICAgIGFjY2lkZW50YWxseSBkaXNjb25uZWN0IHlvdXIgVk5DIHZpZXdlciB0aGVuIHlvdSB3aWxsIG5vdCBiZVxuIgotIiAgICAgIGFibGUgdG8gcmVjb25uZWN0LlxuIgotIiAgIFxuIgotIiAgICAgIFxcXCJBc2sgZm9yIENvbmZpcm1hdGlvblxcXCIgIGlmIHlvdSBlbmFibGUgdGhpcyBvbmx5IHNvbWVvbmVcbiIKLSIgICAgICBzaXR0aW5nIGF0IHRoZSBYIGRpc3BsYXkgY2FuIGNvbmZpcm0gYW55IG5ldyBWTkMgY29ubmVjdGlvbnMuXG4iCi0iICAgICAgRnVydGhlcm1vcmUsIGFueSBjdXJyZW50IFZOQyB2aWV3ZXJzIHdpbGwgYmUgYmxvY2tlZCB3aGlsZVxuIgotIiAgICAgIHdhaXRpbmcgZm9yIHRoZSBjb25maXJtYXRpb24gKHRpbWVzIG91dCBpbiAxMjAgc2VjIGJ5IGRlZmF1bHQpLiBcbiIKLSIgICBcbiIKLSIgICAgICBcXFwiQWxsIENsaWVudHMgVmlld09ubHlcXFwiICBpZiB5b3UgZW5hYmxlIHRoaXMgcmVtb3RlbHksIHdlbGxcbiIKLSIgICAgICB5b3UgY2FuIG5vIGxvbmdlciBwcm92aWRlIGlucHV0IHRvIGRpc2FibGUgaXQuXG4iCi0iICAgXG4iCi0iICAgSWYgeW91IGRvIGxvY2sgeW91cnNlbGYgb3V0IHlvdSBjb3VsZCBsb2cgaW4gcmVtb3RlbHkgYW5kIHN0YXJ0IHVwXG4iCi0iICAgYSBzZWNvbmQgeDExdm5jIGFuZCBjb25uZWN0IHRvIHRoYXQgb25lIHRvIHRyeSB0byBmaXggdGhpbmdzIGluIHRoZVxuIgotIiAgIGZpcnN0IG9uZS5cbiIKLSJcbiIKLSIgICBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIHgxMXZuYydzIG9uIHRoZSBzYW1lIGRpc3BsYXkgdGhlXG4iCi0iICAgdXNlIG9mIHRoZSBHVUkgbWF5IGJlIGlsbC1iZWhhdmVkLiAgVGVybWluYXRlIHRoZSBzZWNvbmQgeDExdm5jIGFzXG4iCi0iICAgc29vbiBhcyB5b3UgaGF2ZSBmaXhlZCB0aGUgc2V0dGluZyBpbiB0aGUgZmlyc3Qgb25lLiAgVXNlIG9mIGEgcmVtb3RlXG4iCi0iICAgY29udHJvbCBjb21tYW5kLCBlLmcuIFxcXCJ4MTF2bmMgLVIgbm92aWV3b25seVxcXCIgb3IgXFxcIngxMXZuYyAtUiB1bmxvY2tcXFwiXG4iCi0iICAgaXMgYSBnb29kIHdheSB0byBhdm9pZCB0aGlzIHByb2JsZW0uXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KGFsbCkgJGhlbHBhbGxcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KE1pc2MtVHVuaW5nOikgXCJcbiIKLSJ4MTF2bmMgaGFzIHdoYXQgc2VlbXMgbGlrZSBodW5kcmVkcyBvZiB0dW5pbmcgcGFyYW1ldGVycyEgIEluIHRoaXNcbiIKLSJzdWItbWVudSB3ZSBwbGFjZSBzb21lIGxlc3NlciB1c2VkIG9uZXMuICBNb3N0IGxpa2VseSB5b3UnbGwgd2FudCB0b1xuIgotImxlYXZlIHRoZW0gYXQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsIGJ1dCB5b3UgY2FuIHRyeSB0aGVtIG91dCBxdWlja2x5XG4iCi0id2l0aCB0aGUgZ3VpIHRvIHNlZSBpZiB0aGV5IGltcHJvdmUgdGhpbmdzLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChQYXNzd29yZHM6KSBcIlxuIgotIlRoZSBpdGVtcyBpbiB0aGlzIHN1Yi1tZW51IHBlcnRhaW4gdG8gc2V0dGluZyBwYXNzd29yZHMuICBOb3RlIHRoYXQgeDExdm5jXG4iCi0iaGFzIHR3byB0eXBlcyBvZiBwYXNzd29yZCBmaWxlczogUmVhbFZOQy1zdHlsZSBvbmVzICh5b3UgY2FuIGNyZWF0ZSB0aGVtXG4iCi0id2l0aCB4MTF2bmMgLXN0b3JlcGFzc3dkIG9yIG90aGVyIFZOQyB1dGlsaXR5IHByb2dyYW0pIHlvdSB1c2UgdGhlc2VcbiIKLSJ2aWEgLXJmYmF1dGg7IGFuZCBwbGFpbi10ZXh0IGZpbGUgcGFzc3dvcmRzIHlvdSB1c2UgdmlhIC1wYXNzd2RmaWxlLlxuIgotIlxuIgotIk5vcm1hbGx5IHBhc3N3b3JkcyBjYW5ub3QgYmUgY2hhbmdlZCBieSByZW1vdGUtY29udHJvbCAoZS5nLiB0aGUgZ3VpKSxcbiIKLSJidXQgZm9yIHRoZSBjYXNlIG9mIHRoZSBcXFwiSWNvblxcXCIgYW5kIFxcXCJUcmF5XFxcIiBtb2RlcyB0aGlzIGNvbnN0cmFpbnQgaGFzXG4iCi0iYmVlbiByZWxheGVkLlxuIgotIlxuIgotIkluIG5laXRoZXIgdGhlIFJlYWxWTkMtc3R5bGUgbm9yIHRoZSBwbGFpbi10ZXh0IGZpbGUgY2FzZXMgc2hvdWxkIHRoZVxuIgotInBhc3N3b3JkIGZpbGVzIGJlIHJlYWRhYmxlIGJ5IHVzZXJzIHlvdSBkbyBub3Qgd2FudCB0byBhY2Nlc3MgdGhlIFZOQ1xuIgotInNlcnZlci4gIENvbnRyYXJ5IHRvIHBvcHVsYXIgYmVsaWVmLCB0aGUgIFJlYWxWTkMtc3R5bGUgcGFzc3dvcmRzIGFyZVxuIgotIm5vdCBlbmNyeXB0ZWQsIG1lcmVseSBvYnNjdXJlZC5cbiIKLSJcbiIKLSJ4MTF2bmMgaGFzIHRoZSBldmVuIGxlc3Mgc2VjdXJlIC1wYXNzd2QgYW5kIC12aWV3cGFzc3dkIHN1cHBsaWVkIG9uXG4iCi0idGhlIGNvbW1hbmQgbGluZS4gIEJlIGNhcmVmdWwgd2l0aCB0aGVzZSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlYWQgYnlcbiIKLSJ1c2VycyB3aXRoIHNvbWV0aGluZyBsaWtlIHRoZSBwcygxKSBjb21tYW5kLiAgT24gc29tZSBvcGVyYXRpbmcgc3lzdGVtc1xuIgotIngxMXZuYyB0cmllcyB0byBxdWlja2x5IG92ZXJ3cml0ZSB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgYnV0IGl0IGRvZXNuJ3RcbiIKLSJ3b3JrIGV2ZXJ5d2hlcmUuXG4iCi0iXG4iCi0iUmVnYXJkaW5nIFZpZXdPbmx5IHBhc3N3b3JkcyAod2hlcmUgYSBWTkMgY2xpZW50IHVzaW5nIHRoYXQgcGFzc3dvcmRcbiIKLSJjYW4gb25seSB3YXRjaCB0aGUgc2NyZWVuLCBub3QgaW50ZXJhY3Qgd2l0aCBpdCksIHRoaXMgaXMgbm90IGF2YWlsYWJsZVxuIgotIndpdGggLXJmYmF1dGgsIGJ1dCBvbmx5IHdpdGggLXBhc3N3ZGZpbGUsIC1wYXNzd2QsIGFuZCAtdmlld3Bhc3N3ZC5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoU1NMOikgXCJcbiIKLSJJbiB0aGlzIHN1Yi1tZW51IHdlIHByb3ZpZGUgdGhlIG9wdGlvbnMgcmVsYXRlZCB0byBTU0wgZW5jcnB5dGlvblxuIgotImFuZCBhdXRoZW50aWNhdGlvbi5cbiIKLSJcbiIKLSJUaGVyZSBpcyBhIGJ1aWx0LWluIG1vZGUgKC1zc2wpIHVzaW5nIHRoZSBPcGVuU1NMIGxpYnJhcnksIGFuZCBhIDJuZFxuIgotInVzaW5nIHRoZSBleHRlcm5hbCBzdHVubmVsIHByb2dyYW0gKC1zdHVubmVsLCB0aGF0IG5lZWRzIHRvIGJlIGluc3RhbGxlZFxuIgotIm9uIHRoZSBzeXN0ZW0pLiAgRWl0aGVyIG1heSByZXF1aXJlIG9yIGJlbmVmaXQgZnJvbSBoYXZpbmcgUEVNIGNlcnRpZmljYXRlXG4iCi0iZmlsZXMgc3BlY2lmaWVkLlxuIgotIlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChNaXNjLVBlcm1zOikgXCJcbiIKLSJJbiB0aGlzIHN1Yi1tZW51IHdlIHByb3ZpZGUgc29tZSBsZXNzZXIgdXNlZCBwZXJtaXNzaW9uIG9wdGlvbnMuXG4iCi0iXG4iCi0iUmVnYXJkaW5nIC1hbHdheXNzaGFyZWQsIC1uZXZlcnNoYXJlZCwgYW5kIC1kb250ZGlzY29ubmVjdCwgeW91IHByb2JhYmx5XG4iCi0ic2hvdWxkIG5ldmVyIHVzZSB0aGVtIGFuZCBqdXN0IHVzZSB4MTF2bmMncyAtc2hhcmVkIGFuZCAtZm9yZXZlciBvcHRpb25zXG4iCi0iaW5zdGVhZCAodGhlc2UgZ2l2ZSBiYXNpY2FsbHkgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhbmQgaWYgeW91IG1peGVkXG4iCi0idGhlbSB0b28gbXVjaCB1bmV4cGVjdGVkIHRoaW5ncyBtYXkgaGFwcGVuKS5cbiIKLSJcIlxuIgotIiMnXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChBbHBoYUJsZW5kaW5nOikgXCJcbiIKLSJJbiB0aGlzIHN1Yi1tZW51IHdlIHByb3ZpZGUgc29tZSB0d2VhayBwYXJhbWV0ZXJzIGZvciBjdXJzb3JzIChsaXR0bGVcbiIKLSJpY29uIGF0IHRoZSBtb3VzZSBwb2ludGVyKSB0aGF0IGhhdmUgdHJhbnNwYXJlbmN5IChpLmUuIGFuIEFscGhhIGNoYW5uZWxcbiIKLSJpbiBhZGRpdGlvbiB0byBSZWQsIEdyZWVuLCBhbmQgQmx1ZSBSR0IgY2hhbm5lbHMpLiAgRm9yIHRoZXNlIGN1cnNvcnMsXG4iCi0ic29tZSBvZiB0aGUgZ3JhcGhpY3MgdW5kZXJuZWF0aCB0aGUgY3Vyc29yIGlzIGFsbG93ZWQgdG8gYmUgYmxlbmRlZCBpbjpcbiIKLSJlLmcuIGEgZHJvcC1zaGFkb3cgKGEgdGVycmlibGUgZWZmZWN0IElNTlNITykuXG4iCi0iXG4iCi0iQWxwaGFCbGVuZGluZyBmb3IgeDExdm5jIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIFhGSVhFUyBYIGV4dGVuc2lvbiBpc1xuIgotInByZXNlbnQgKHNpbmNlIG90aGVyd2lzZSBpdCBjYW5ub3Qgc2VlIHRoZSBjdXJzb3JzIGF0IGFsbCBhbmQgc28gYXBwbGllc1xuIgotImhldXJpc3RpY3MgdG8gc2hvdyBzb21lIGZha2UgY3Vyc29ycykuICBBbHBoYUJsZW5kaW5nIGlzIG9ubHkgYSBwcm9ibGVtXG4iCi0id2l0aCB4MTF2bmMgd2hlbiB0aGUgY3Vyc29ycyBhcmUgbm90IG9wYXF1ZS5cbiIKLSJcbiIKLSJPcGFxdWUgY3Vyc29ycyAoZS5nLiBiaXRtYXAgb3Igc2ltcGx5IGNvbG9yZWQgY3Vyc29yKSBhcmUgcmVuZGVyZWRcbiIKLSJjb3JyZWN0bHkgYnkgeDExdm5jLiAgT25seSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeSBkb2VzIHgxMXZuYyBoYXZlXG4iCi0idG8gbWFrZSBzb21lIGFwcHJveGltYXRpb24gdG8gdHJhbnNmb3JtIHRoZSBjdXJzb3IgdG8gYmUgb3BhcXVlICh0aGVcbiIKLSJWTkMgcHJvdG9jb2wgZG9lcyBub3QgcHJvdmlkZSBmb3IgYW4gYWxwaGEgY2hhbm5lbCBpbiBjdXJzb3JzLCBvbmx5IFJHQikuXG4iCi0iXG4iCi0iVGhlIGl0ZW1zIGluIHRoaXMgc3ViLW1lbnUgbGV0IHlvdSB0d2VhayB4MTF2bmMncyBhcHByb3hpbWF0aW9uIHNjaGVtZVxuIgotImZvciBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5LiAgSG9wZWZ1bGx5IHlvdSB3b24ndCBoYXZlIHRvIHVzZSB0aGVtLlxuIgotIkNlcnRhaW4gY3Vyc29yIFxcXCJ0aGVtZXNcXFwiIG1heSByZXF1aXJlIGFkanVzdG1lbnQgaG93ZXZlci5cbiIKLSJcIlxuIgotIiMnXG4iCi0iCXNldCBoZWxwdGV4dChPdmVybGF5VmlzdWFsczopIFwiXG4iCi0iSW4gdGhpcyBzdWItbWVudSBhcmUgc29tZSBvcHRpb25zIHRoYXQgaW52b2x2ZSBmaXhpbmcgY29sb3IgcHJvYmxlbXNcbiIKLSJmb3IgXFxcIk92ZXJsYXlcXFwiIG9yIFxcXCJNdWx0aS1EZXB0aFxcXCIgdmlzdWFscy4gIFRoaXMgcHJvYmxlbSBpcyByYXJlXG4iCi0ic2luY2Ugb3ZlcmxheSBhbmQgbXVsdGktZGVwdGggdmlzdWFsIHZpZGVvIGhhcmR3YXJlIGlzIHJhcmUuIFxuIgotIlNvbWUgU3VuLCBTR0ksIGFuZCBIUCBtYWNoaW5lcyBhcmUga25vd24gdG8gaGF2ZSB0aGVtLlxuIgotIlxuIgotIlRoZSBzaG9ydCBhbnN3ZXIgaXMgaWYgeW91IGhhdmUgYSBtdWx0aS1kZXB0aCB2aXN1YWwgZGlzcGxheSAoZS5nLiAgOCBhbmRcbiIKLSIyNCBiaXRzKSwgYW5kIHlvdSBzZWUgbWVzc2VkIHVwIGNvbG9ycyBpbiB4MTF2bmMgdHJ5IHRoZSBcXFwiLW92ZXJsYXlcXFwiXG4iCi0ib3B0aW9uIG9uIFNvbGFyaXMgb3IgSVJJWC5cbiIKLSJcbiIKLSJBIGJyaWVmIEJhY2tncm91bmQgb24gcGl4ZWxzLCBjb2xvciwgYW5kIHZpc3VhbHM6XG4iCi0iXG4iCi0iICAgUGl4ZWxzIChwaWN0dXJlIGVsZW1lbnRzKSBhcmUga2VwdCBpbiB2aWRlbyBtZW1vcnkgYXMgYSBjZXJ0YWluIG51bWJlclxuIgotIiAgIG9mIGJpdHMtcGVyLXBpeGVsIChicHApLiAgTW9zdCBjb21tb24gYXJlIDhicHAsIDE2YnBwLCBhbmQgMzJicHAuXG4iCi0iICAgTGVzcyBjb21tb24gYXJlIDI0YnBwLCA0YnBwLCBhbmQgMWJwcCAobW9ub2Nocm9tZSkuXG4iCi0iXG4iCi0iICAgSG93IHBpeGVsIHZhbHVlcyAoaS5lLiB2YWx1ZXMgb2YgdGhlIGJpdHMpIGFyZSByZW5kZXJlZCBpbnRvIGNvbG9ycyBvblxuIgotIiAgIHRoZSBzY3JlZW4gY2FuIGJlIGRvbmUgdmlhIGRpZmZlcmVudCBcXFwiUmVjaXBlc1xcXCIuICBUaGVzZSBkaWZmZXJlbnRcbiIKLSIgICByZWNpcGVzIGFyZSByZWZlcnJlZCB0byBhcyBcXFwidmlzdWFsc1xcXCIuICBFLmcuIGZvciA4YnBwIHRoZXJlIGlzXG4iCi0iICAgYSBQc2V1ZG9Db2xvciB2aXN1YWwgdGhhdCBtYWludGFpbnMgYSBtYXBwaW5nICh0aGF0IGNhbiBiZSBjaGFuZ2VkXG4iCi0iICAgZHluYW1pY2FsbHkpIG9mIHRoZSBwaXhlbCB2YWx1ZXMgKDI1NiBwb3NzaWJsZSBvbmVzKSBpbnRvIFJHQiB2YWx1ZXMuXG4iCi0iICAgT3RoZXIgOGJwcCB2aXN1YWxzLCBlLmcuIFN0YXRpY0dyZXkgYW5kIFRydWVDb2xvciBoYXZlIGZpeGVkLCByZWd1bGFyXG4iCi0iICAgbWFwcGluZ3MgYW5kIHNvIHByb3ZpZGUgbGVzcyB2YXJpYXRpb24gaW4ga2luZHMgb2YgY29sb3JzLlxuIgotIlxuIgotIiAgIEEgdmlzdWFsJ3MgXFxcImRlcHRoXFxcIiBpcyBob3cgbWFueSBvZiB0aGUgcGl4ZWxzIGFyZSB1c2VkIGluIHRoZVxuIgotIiAgIGFjdHVhbCByZWNpcGUuICBUaGlzIG1heSBzb3VuZCB3YXN0ZWZ1bCAoaS5lLiBub3QgdXNpbmcgc29tZSBvZiB0aGVcbiIKLSIgICBiaXRzKSwgYnV0IGZvciAzMmJwcCAoNCBiaWxsaW9uIGNvbG9ycykgdGhhdCBpcyB0b28gbXVjaCBhbmQgbmVhcmx5XG4iCi0iICAgYWx3YXlzIG9ubHkgMjQgZm9yIHRoZW0gYXJlIHVzZWQuICBUaGUgbW9zdCBjb21tb24gVmlzdWFsIHNlZW1zIHRvXG4iCi0iICAgYmUgZGVwdGggMjQgVHJ1ZUNvbG9yIGF0IDMyYnBwLiAgVGhpcyBwcm92aWRlcyAxNiBtaWxsaW9uIGNvbG9yc1xuIgotIiAgIHdoaWNoIGlzIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIHBpeGVscyBvbiBtb3N0IHNjcmVlbnMgKDEyODB4MTAyNCA9XG4iCi0iICAgMS4zIG1pbGxpb24gcGl4ZWxzKS4gIEFub3RoZXIgc29tZXRpbWVzIHVzZWQgdmlzdWFsIHRoYXQgaWdub3JlcyBzb21lXG4iCi0iICAgYml0cyBpcyBkZXB0aCAxNSBUcnVlQ29sb3IgYXQgMTZicHAuXG4iCi0iXG4iCi0iT0ssIG5vdywgZmluYWxseSwgdG8gdGhlIE92ZXJsYXkgVmlzdWFscy4gIFNvbWUgaGFyZHdhcmUgKG9yIHNvZnR3YXJlXG4iCi0iZW11bGF0aW9ucykgYWxsb3cgZGlmZmVyZW50IGRlcHRoIHZpc3VhbHMgdG8gYmUgdXNlZCBvbiB0aGUgZGlzcGxheVxuIgotImF0IHRoZSBzYW1lIHRpbWUuICBUaGUgcGl4ZWxzIG9mIHdpbmRvd3MgdXNpbmcgZGlmZmVyZW50IGRlcHRoIHZpc3VhbHNcbiIKLSJtYXkgb3ZlcmxhcC5cbiIKLSJcbiIKLSJUaGUgbW9zdCBjb21tb24gc2VlbXMgdG8gYmUgYm90aCA4IGFuZCAyNCBkZXB0aCB2aXN1YWxzIG9uIGEgMzJicHAgc2V0dXAuXG4iCi0iMjQgb2YgdGhlIHBpeGVscyBjYW4gYmUgdXNlZCBmb3Igb25lIHZpc3VhbCBhbmQgdGhlIHJlbWFpbmluZyA4IGZvciB0aGVcbiIKLSJvdGhlci4gIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFxcXCI4KzI0XFxcIiBtb2RlLiAgRnVydGhlcm1vcmUsXG4iCi0iYSBzcGVlZHVwIGlzIGFjaGlldmVkIGJlY2F1c2Ugd3JpdGluZyBncmFwaGljcyBkYXRhIHRvLCBzYXksIHRoZSA4Yml0XG4iCi0idmlzdWFsIGRvZXMgbm90IGRlc3Ryb3kgdGhlIGltYWdlIGRhdGEgaW4gdGhlIDI0Yml0IHZpc3VhbC4gIEV2aWRlbnRseVxuIgotInBvcHVwIG1lbnVzIGNhbiBiZSBkb25lIHZlcnkgcXVpY2tseSB0aGlzIHdheTogdGhleSB1c2UgdGhlIDhiaXQgdmlzdWFsXG4iCi0iYW5kIHdoZW4gdGhlIHBvcHVwIGdvZXMgYXdheSB0aGUgZ3JhcGhpY3MgZGF0YSBpbiB0aGUgMjRiaXQgdmlzdWFsIGlzXG4iCi0iaW1tZWRpYXRlbHkgcmVleHBvc2VkIHdpdGhvdXQgaGF2aW5nIHRoZSBhcHBsaWNhdGlvbiByZWRyYXcgaXQuXG4iCi0iXG4iCi0iQWxzbywgc29tZSBsZWdhY3kgYXBwbGljYXRpb25zIGNhbiBvbmx5IHVzZSA4YnBwIHZpc3VhbHMuICBCdXQgaW4gdGhlc2VcbiIKLSJkYXlzIG9mIGhpZ2ggY29sb3IgZ3JhcGhpY3MgYW5kIHdlYiBicm93c2VycyBvbmUgd291bGQgbGlrZSB0aGUgcmVzdFxuIgotIm9mIHRoZSBkZXNrdG9wIHRvIHVzZSBkZXB0aCAyNCB2aXN1YWxzLiAgVGhleSBvZnRlbiB3b3JrIG9uIHRoZSBtdWx0aVxuIgotImRlcHRoIHZpc3VhbHMuXG4iCi0iXG4iCi0iSG93IGRvZXMgdGhpcyBlZmZlY3QgeDExdm5jPyAgeDExdm5jIG5lYXJseSBhbHdheXMgcG9sbHMgdGhlIHJvb3Qgd2luZG93XG4iCi0iKGNvbnRhaW5lciBvZiBhbGwgb3RoZXIgd2luZG93cykuICBUaGUgcm9vdCB3aW5kb3cgd2lsbCBiZSBvbmUgZGVwdGgsXG4iCi0iZS5nLiA4IG9yIDI0LiAgQW55IHdpbmRvd3MgdXNpbmcgdGhlICpvdGhlciogZGVwdGggd2lsbCBhcHBlYXIgdG8gaGF2ZVxuIgotIm1lc3NlZCB1cCBjb2xvcnMgKG9yIGp1c3QgYmUgYmxhY2sgb3Igc29tZSBvdGhlciBzb2xpZCBjb2xvcikgd2hlbiB2aWV3ZWRcbiIKLSJ2aWEgeDExdm5jLlxuIgotIlxuIgotIkhvdyB0byBmaXg/ICBTb2xhcmlzIGFuZCBJUklYIHByb3ZpZGUgYW4gQVBJIHRvIGV4dHJhY3QgdGhlIGZ1bGwgc25hcHNob3RcbiIKLSJvZiB0aGUgZGlzcGxheSB3aXRoIGFsbCB0aGUgY29sb3JzIGNvcnJlY3QuICBJdCBjb21lcyB0byB4MTF2bmMgYXMgZGVwdGhcbiIKLSIyNCBUcnVlQ29sb3IuICBUbyBlbmFibGUgdGhpcyB1c2UgdGhlIFxcXCItb3ZlcmxheVxcXCIgb3B0aW9uLiAgUGVyZm9ybWFuY2VcbiIKLSJtYXkgYmUgc2xvd2VyLCBidXQgaWYgdGhlIGNvbG9ycyBhcmUgY29ycmVjdCB0aGF0IGlzIGEgYmlnIGltcHJvdmVtZW50LlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dCg4LUJpdC1Db2xvcjopIFwiXG4iCi0iU29tZSBvbGRlciBkaXNwbGF5cyAoZS5nLiB3aXRoIGxpbWl0ZWQgVmlkZW8gUkFNKSB1c2UgOCBiaXRzLXBlci1waXhlbFxuIgotImNvbG9yLiAgVGhpcyBhbGxvd3MgZm9yIG9ubHkgMjU2IGRpZmZlcmVudCBjb2xvcnMgb24gdGhlIHNjcmVlbiBhdCB0aGVcbiIKLSJzYW1lIHRpbWUuICBUaGlzIHNvbWV0aW1lcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIHZpZXdpbmcgdGhlc2UgOGJwcFxuIgotImRpc3BsYXlzIHZpYSB4MTF2bmMuICBUaGlzIHN1Yi1tZW51IGhhcyBzb21lIG9wdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvXG4iCi0id29ya2Fyb3VuZHMgZm9yIHRoaXMgY2FzZS4gIElmIHlvdSBjYW4gY29uZmlndXJlIHRoZSBtYWNoaW5lIHRvIHVzZSAxNmJwcFxuIgotIml0IG1heSBiZSB3b3J0aCBpdCB0byBhdm9pZCB0aGUgY29sb3IgcHJvYmxlbXMgKGUuZy4gY29sb3IgZmxhc2hpbmdcbiIKLSJhcyB0aGUgOGJpdCBjb2xvcm1hcCBpcyBzd2l0Y2hlZCkuXG4iCi0iXCJcbiIKLSIJc2V0IGhlbHB0ZXh0KFN1YldpbmRvdzopIFwiXG4iCi0iVGhpcyBzdWItbWVudSBoYXMgYSBjb3VwbGUgb3B0aW9ucyByZWdhcmRpbmcgaGF2aW5nIHgxMXZuYyBwb2xsIGEgXG4iCi0ic2luZ2xlIHdpbmRvdywgbm90IHRoZSBlbnRpcmUgZGlzcGxheS4gIFRoaXMgd2F5IGp1c3QgdGhlIHdpbmRvd1xuIgotImlzIHNoYXJlZC5cbiIKLSJcbiIKLSJOb3RlIGlmIHRoZSBhcHBsaWNhdGlvbiBwb3BzIHVwIG11bHRpcGxlIHdpbmRvd3MgdGhleSBhcmUgbm90IHRyYWNrZWRcbiIKLSJhbmQgc2hhcmVkLiAgU28gdGhpcyBpcyBub3QgYXBwbGljYXRpb24gc2hhcmluZy4gIFRoZSBhcHBsaWNhdGlvbiBoYXMgdG9cbiIKLSJiZSB2ZXJ5IHNpbXBsZSAoZS5nLiBhIHNpbXBsZSB0ZXJtaW5hbCBvciB0aGUgaW1hZ2Ugd2luZG93IG9uIGEgd2ViY2FtKVxuIgotImZvciB0aGlzIG1vZGUgdG8gYmUgdXNhYmxlLlxuIgotIlwiXG4iCi0iCXNldCBoZWxwdGV4dChSZXNpemVSb3RhdGU6KSBcIlxuIgotIlRoaXMgc3ViLW1lbnUgaGFzIHNvbWUgb3B0aW9ucyByZWdhcmRpbmcgc2NyZWVucyB0aGF0IHN1cHBvcnQgdGhlIFhcbiIKLSJSZXNpemUsIFJlZmxlY3Rpb24sIGFuZCBSb3RhdGlvbiBFeHRlbnNpb24gKFJBTkRSKSwgYW5kIG9uZSBleHBlY3RzIHNjcmVlblxuIgotInJlc2l6aW5nLCByZWZsZWN0aW9uLCBvciByb3RhdGlvbiB0byB0YWtlIHBsYWNlIGR1cmluZyB0aGUgeDExdm5jIHNlc3Npb24uXG4iCi0iVGhpcyBpcyBwcmV0dHkgcmFyZSwgYnV0IHgxMXZuYyBzZWVtcyB0byBoYW5kbGUgaXQgcmVhc29uYWJseSB3ZWxsIHVzaW5nXG4iCi0idGhpcyBYIGV4dGVuc2lvbi5cbiIKLSJcbiIKLSJUaGlzIG1vZGUgaXMgb24gYnkgZGVmYXVsdCBpbiAtaWQgbW9kZSB0byB0cnkgdG8gdHJhY2sgdGhlIGNoYW5naW5nXG4iCi0ic2l6ZSBvZiB0aGUgU3ViV2luZG93LiAgSXQgaXMgbm90IG9uIGJ5IGRlZmF1bHQgZm9yIGZ1bGwtc2NyZWVuIG1vZGVcbiIKLSJiZWNhdXNlIG9mIHRoZSBleHRyYSBvdmVyaGVhZCwgZXRjLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChXaXJlRnJhbWU6KSBcIlxuIgotIlRoaXMgc3ViLW1lbnUgaGFzIHNvbWUgb3B0aW9ucyBmb3IgdGhlIHgxMXZuYyB3aXJlZnJhbWluZyBzcGVlZHVwIHNjaGVtZS5cbiIKLSJcbiIKLSJGb3IgeDExdm5jLCBXaXJlZnJhbWluZyBtZWFucyB0byB3YXRjaCBmb3IgdG9wbGV2ZWwgd2luZG93cyBiZWluZyBPcGFxdWVseVxuIgotIk1vdmVkIG9yIFJlc2l6ZWQuICBXaGVuIHgxMXZuYyBkZXRlY3RzIHRoaXMsIGl0IHN0b3BzIHBvbGxpbmcgdGhlIHNjcmVlblxuIgotImFuZCBzaW1wbHkgc2hvd3MgYSBcXFwid2lyZWZyYW1lXFxcIiBvdXRsaW5lIG9mIHRoZSB3aW5kb3cgYXMgaXQgaXMgYmVpbmdcbiIKLSJtb3ZlZCBvciByZXNpemVkLiAgVGhpcyBhdm9pZHMgXFxcInNjcmVlbiBwb2xsaW5nIHRocmFzaGluZ1xcXCIgd2hlbiB0aGVcbiIKLSJzY3JlZW4gaXMgY2hhbmdpbmcgc28gcmFwaWRseSBkdXJpbmcgdGhpcyBwZXJpb2QuICBGb3IgdmFyaW91cyByZWFzb25zXG4iCi0idGhpcyBpcyB1c3VhbGx5IG11Y2ggZmFzdGVyIHRoZW4gbGV0dGluZyB0aGUgd2luZG93IG1hbmFnZXIgZG8gaXRzXG4iCi0ib3duIHdpcmVmcmFtaW5nICh5b3UgYXJlIGVuY291cmFnZWQgdG8gZG8gT3BhcXVlIG1vdmVzIGFuZCByZXNpemVzXG4iCi0id2hlbiB1c2luZyB4MTF2bmMhKVxuIgotIlxuIgotIkFsc28sIG9uY2UgYSBtb3ZlZCB3aW5kb3cgaXMgcmVsZWFzZWQgaW4gaXRzIG5ldyBwb3NpdGlvbiwgeDExdm5jIHVzZXNcbiIKLSJ0aGUgVk5DIENvcHlSZWN0IGVuY29kaW5nIHRvIHZlcnkgZWZmaWNpZW50bHkgdXBkYXRlIHRoZSBWTkMgdmlld2Vyc1xuIgotIihlYWNoIGp1c3QgY29waWVzIHRoZSBpbWFnZSBkYXRhIGxvY2FsbHkpLlxuIgotIlxuIgotIlRoaXMgc29ydCBvZiBzY2hlbWUgd2FzIHVzZWQgbXVjaCBpbiB0aGUgMTk5MCdzIG9uIGxvY2FsIGRpc3BsYXlzIGJlY2F1c2VcbiIKLSJ2aWRlbyBoYXJkd2FyZSB3YXMgc2xvdyBhdCB0aGUgdGltZS4gIHgxMXZuYyB0cmllcyB0byB1c2UgdGhpcyBzYW1lIHRyaWNrXG4iCi0iYXMgYSBzcGVlZHVwIGZvciBpdHMgYWN0aXZpdGllcyAodGhlIG5ldHdvcmsgaXMgbXVjaCBzbG93ZXIgdGhhbiB2aWRlb1xuIgotImhhcmR3YXJlIHdyaXRlcywgYW5kIHRoZSB2aWRlbyBoYXJkd2FyZSByZWFkcyB0aGF0IHgxMXZuYyB1c2VzIHRvIHBvbGxcbiIKLSJ0aGUgc2NyZWVuIGFyZSBzdGlsbCBzbG93IHRvZGF5KS5cbiIKLSJcIlxuIgotIiMnXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KFNhZmU6KSBcIlxuIgotIkluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgbWFraW5nIHgxMXZuYyBvcGVyYXRpb25zXG4iCi0ibW9yZSwgb3IgbGVzcywgc2FmZS4gIEUuZy4gZGlzYWJsZSB0aGUgcnVubmluZyBvZiBleHRlcm5hbCBjb21tYW5kcywgZXRjLlxuIgotIlxuIgotIllvdSBjYW4gYWxzbyB0dXJuIG9mZiB0aGUgUmVtb3RlIGNvbnRyb2wgY2hhbm5lbCAoTk9URSB0aGF0IGRvaW5nIHRoYXRcbiIKLSJ3aWxsIGRpc2FibGUgdGhlIEdVSSBmcm9tIGJlaW5nIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCB4MTF2bmMpLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChYLWV4dDopIFwiXG4iCi0iSW4gdGhpcyBzdWItbWVudSBhcmUgYSBmZXcgcmFyZWx5IHVzZWQgb3B0aW9ucyByZWdhcmRpbmcgc29tZSBYIGV4dGVuc2lvbnNcbiIKLSJ1c2VkIGJ5IHgxMXZuYy5cbiIKLSJcIlxuIgotIglzZXQgaGVscHRleHQoQ2xpcHBpbmc6KSBcIlxuIgotIkluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyByZWdhcmRpbmcgY2xpcHBpbmcgb3IgYmxhY2tpbmcgb3V0XG4iCi0icG9ydGlvbnMgb2YgdGhlIFNjcmVlbi4gIEUuZy4gdW5kZXIgWElORVJBTUEgd2hlbiB0aGUgbXVsdGlwbGUgbW9uaXRvcnNcbiIKLSJhcmUgbm90IHRoZSBzYW1lIHNpemUuXG4iCi0iXG4iCi0iXCJcbiIKLSIJc2V0IGhlbHB0ZXh0KE1pc2MtU2NyZWVuOikgXCJcbiIKLSJJbiB0aGlzIHN1Yi1tZW51IGFyZSBzb21lIGxpdHRsZSB1c2VkIG9wdGlvbnMgbW9kaWZ5aW5nIGFzcGVjdHMgb2ZcbiIKLSJ0aGUgc2NyZWVuIHNvdXJjZS5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoU2V0dGluZ3M6KSBcIlxuIgotIkluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3Igc2F2aW5nIGFuZCBsb2FkaW5nIG9wdGlvbiBzZXR0aW5ncy5cbiIKLSJUaGUgZGVmYXVsdCBmaWxlIHRvIHN0b3JlIHNldHRpbmdzIGluIGlzIH4vLngxMXZuY3JjLCBidXQgeW91IGNhbiBzYXZlXG4iCi0iZGlmZmVyZW50IFxcXCJwcm9maWxlc1xcXCIgaW4gb3RoZXIgZmlsZXMgZm9yIGxhdGVyIHVzZS5cbiIKLSJcbiIKLSJcIlxuIgotIglzZXQgaGVscHRleHQoSmF2YS1hcHBsZXQ6KSBcIlxuIgotIkluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgcnVubmluZyB0aGUgYnVpbHQtaW4gSFRUUCBzZXJ2ZXJcbiIKLSJ0aGF0IGRlbGl2ZXJzIHRoZSBUaWdodFZOQyBKYXZhIFZOQyBWaWV3ZXIgYXBwbGV0IChWbmNWaWV3ZXIuamFyKSB0b1xuIgotImNsaWVudHMuICBUaGUgdmlld2VyIHJ1bnMgaW4gdGhlaXIgV2ViIGJyb3dzZXIuXG4iCi0iXG4iCi0iVGhlIGRlZmF1bHQgcG9ydCBsaXN0ZW5lZCBvbiBpcyA1ODAwLCBzbyB0aGUgVVJMIGlzIHR5cGljYWxseTpcbiIKLSJcbiIKLSIJaHR0cDovL2hvc3RuYW1lOjU4MDAvXG4iCi0iXG4iCi0iYnV0IHRoaXMgY2FuIGJlIGFsdGVyZWQgYnkgLWh0dHBwb3J0LCBldGMuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KENoYXQ6KSBcIlxuIgotIkluIHRoaXMgc3ViLW1lbnUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgZW5hYmxpbmcgYSBsb2NhbCBjaGF0IHdpbmRvd1xuIgotImFuZCBzdGFydGluZyBvciBzdG9wcGluZyB0aGUgY3VycmVudCBjaGF0LiAgVGhpcyBpcyB0aGUgVWx0cmFWTkMgXG4iCi0iVGV4dCBDaGF0IHN1cHBvcnQgaW4geDExdm5jLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChTY3JvbGxDb3B5UmVjdDopIFwiXG4iCi0iVGhpcyBzdWItbWVudSBoYXMgc29tZSBvcHRpb25zIGZvciB0aGUgeDExdm5jIFNjcm9sbCBkZXRlY3Rpb24gYW5kXG4iCi0iQ29weVJlY3Qgc3BlZWR1cCBzY2hlbWUuXG4iCi0iXG4iCi0iRm9yIHRoaXMgbW9kZSwgeDExdm5jIFxcXCJzcGllc1xcXCIgb24gY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBYIHNlcnZlciBhbmRcbiIKLSJhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIFJFQ09SRCBleHRlbnNpb24uICBJdCBsb29rcyBmb3IgdmFyaW91cyBwYXR0ZXJuc1xuIgotInRvIGRldGVjdCBhIHNjcm9sbGVkIHdpbmRvdy4gIFRoaXMgb25seSB3b3JrcyBmb3Igc29tZSBhcHBsaWNhdGlvbnMsXG4iCi0iZm9ydHVuYXRlbHkgc29tZSBpbXBvcnRhbnQgb25lcy5cbiIKLSJcbiIKLSJPbmNlIHRoZSBzY3JvbGwgaXMgZGV0ZWN0ZWQgaXQgdXNlcyB0aGUgVk5DIENvcHlSZWN0IGVuY29kaW5nIGZvciBhXG4iCi0iYmlnIHNwZWVkdXAuICBTY3JlZW4gcG9sbGluZyBpcyBhbHNvIHNwZWQgdXAgZm9yIHRoaXMgc2NoZW1lLlxuIgotIlxuIgotIlRoZXJlIGFyZSBtYW55IHR3ZWFrYWJsZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG1vZGUgYW5kIHRoZXkgYXJlIGRlc2NyaWJlZFxuIgotImluIHRoZSBzdWItbWVudSBpdGVtcy5cbiIKLSJcIlxuIgotIlxuIgotIglzZXQgaGVscHRleHQoWERBTUFHRTopIFwiXG4iCi0iVGhlIERBTUFHRSBYIGV4dGVuc2lvbiBhbGxvd3MgdGhlIFggc2VydmVyIHRvIHNlbmQgc2lnbmFscyB0byB4MTF2bmNcbiIKLSJ0ZWxsaW5nIGl0IHdoaWNoIHJlZ2lvbnMgb2YgdGhlIHNjcmVlbiBoYXZlIGJlZW4gY2hhbmdlZC4gIFRoaXMgaW1wcm92ZXNcbiIKLSJ4MTF2bmMncyBwZXJmb3JtYW5jZSBtYXJrZWRseS4gIFRoZSBEQU1BR0UgZXh0ZW5zaW9uIG11c3QgYmUgYXZhaWxhYmxlXG4iCi0ib24gdGhlIGRpc3BsYXkgZm9yIHRoaXMgdG8gd29yay5cbiIKLSJcbiIKLSJVbmZvcnR1bmF0ZWx5IERBTUFHRSBjYW5ub3QgYmUgdHJ1c3RlZCBjb21wbGV0ZWx5IGZvciB0aGUgY2hhbmdlZCByZWdpb25zLFxuIgotImJlY2F1c2Ugb2Z0ZW4gdGhlIHJlcG9ydGVkIGNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbFxuIgotImNoYW5nZWQgcmVnaW9ucy4gIE5ldmVydGhlbGVzcywgeDExdm5jIHVzZXMgdGhlIERBTUFHRSBpbmZvcm1hdGlvbiB2ZXJ5XG4iCi0iZWZmZWN0aXZlbHkgYXMgaGludHMgdG8gaW1wcm92ZSBpdHMgcGVyZm9ybWFuY2UuXG4iCi0iXG4iCi0iVGhlIGl0ZW1zIGluIHRoZSBzdWItbWVudSBhbGxvdyB0d2Vha2luZyB4MTF2bmMncyBEQU1BR0UgYWxnb3JpdGhtLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChOY2FjaGU6KSBcIlxuIgotIkEgc2ltcGxlIGNsaWVudC1zaWRlICh2aWV3ZXIpIGNhY2hpbmcgc2NoZW1lIGlzIGVuYWJsZWQgd2l0aCB0aGVcbiIKLSJcXFwiLW5jYWNoZSBuXFxcIiBvcHRpb24uICBJdCBzaW1wbHkgdXNlcyBcXFwiblxcXCIgZnJhbWVidWZmZXIgc2l6ZWQgYXJlYXNcbiIKLSJiZWxvdyB0aGUgYWN0dWFsIGRpc3BsYXkgZm9yIGNhY2hpbmcgd2luZG93IHBpeGVsIGRhdGEuICBcbiIKLSJcbiIKLSJEcmF3YmFja3MgYXJlIGl0IHVzZXMgYSBsb3Qgb2YgUkFNIChyb3VnaGx5IG4gdGltZXMgbW9yZSksIGFuZCB0aGVcbiIKLSJwaXhlbHMgY2FjaGUgYXJlYSBpcyB2aXNpYmxlIGluIHRoZSB2aWV3ZXJzLlxuIgotIlxuIgotIlRoZSBpdGVtcyBpbiB0aGUgc3ViLW1lbnUgYWxsb3cgdHdlYWtpbmcgeDExdm5jJ3MgLW5jYWNoZSBhbGdvcml0aG0uXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KFNoYXJlZE1lbW9yeTopIFwiXG4iCi0iVGhpcyBzdWItbWVudSBwcm92aWRlcyBzb21lIG9wdGlvbnMgcmVnYXJkaW5nIFNZU1Ygc2hhcmVkIG1lbW9yeSB1c2FnZVxuIgotIihzaG0pIGJ5IHgxMXZuYy4gIFVzdWFsbHkgeW91IHdhbnQgc2htIHR1cm5lZCBvbiBiZWNhdXNlIHRoZSB4MTF2bmNcbiIKLSJwcm9jZXNzIGlzIG5lYXJseSBhbHdheXMgcnVubmluZyBvbiB0aGUgc2FtZSBtYWNoaW5lIHRoZSBYIHNlcnZlciBwcm9jZXNzXG4iCi0iaXMgcnVubmluZyBvbi4gIFNoYXJlZE1lbW9yeSBnaXZlcyBhIHBlcmZvcm1hbmNlIHNwZWVkdXAuICBIb3dldmVyLCBpZiB5b3VcbiIKLSJuZWVkIHRvIG1vZGlmeSB0aGlzIHNjZW5hcmlvIGZvciBzcGVjaWFsIHVzYWdlIHRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChNaXNjLURlYnVnOikgXCJcbiIKLSJUaGlzIHN1Yi1tZW51IGNvbnRhaW5zIGEgbG90IG9mIGRlYnVnZ2luZyBwYXJhbWV0ZXJzIHVzdWFsbHkgdXNlZFxuIgotImZvciBkZWJ1Z2dpbmcgeDExdm5jIGl0c2VsZi4gIFRoaXMgaXMgdW5saWtlIHRoZSAtZGVidWdfcG9pbnRlciBhbmRcbiIKLSItZGVidWdfa2V5Ym9hcmQgb3B0aW9ucyB0aGF0IGFyZSB1c2VmdWwgaW4gbGVhcm5pbmcgaW5mb3JtYXRpb24sIHF1aXJrcyxcbiIKLSJldGMuIGFib3V0IHlvdXIgbG9jYWwgZGlzcGxheSBhbmQgZW52aXJvbm1lbnQuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KFNlbGVjdGlvbjopIFwiXG4iCi0iVGhpcyBzdWItbWVudSBjb250YWlucyBzb21lIG9wdGlvbnMgY2VudGVyaW5nIGFyb3VuZCB0aGUgU2VsZWN0aW9uXG4iCi0iKGFsc28gcmVmZXJyZWQgdG8gYXMgdGhlIENsaXBib2FyZCwgQ3V0YnVmZmVycywgZXRjKS4gIHgxMXZuYyB3aWxsIHRyeVxuIgotInRvIGV4Y2hhbmdlIHRoZSBzZWxlY3Rpb25zIGJldHdlZW4gdGhlIFZOQyB2aWV3ZXJzIGFuZCB0aGUgWCBzZXJ2ZXIuXG4iCi0iWW91IGNhbiBhZGp1c3QgdGhhdCBiZWhhdmlvciB3aXRoIHRoZXNlIG9wdGlvbnMuXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IGhlbHB0ZXh0KFdpbmRvd1ZpZXcpIFwiXG4iCi0iU2V0IHRoZSBXaW5kb3cgVmlldyBNb2RlIGZvciB0aGUgZ3VpLiAgVGhlcmUgYXJlIHRocmVlIG1vZGVzOlxuIgotIlxuIgotIiAgLSBmdWxsOiAgUHJlc2VudHMgdGhlIGZ1bGwgZ3VpIChBY3Rpb25zLCBDbGllbnRzLCBldGMsIGJ1dHRvbnMsXG4iCi0iICAgICAgICAgICBhbmQgdGhlIFRleHQgYXJlYSBhbmQgU2V0L0VudHJ5IGJveCkuXG4iCi0iXG4iCi0iICAtIGljb246ICBQcmVzZW50cyBhIHNtYWxsIGljb24gaW5zdGVhZCBvZiB0aGUgZnVsbCBndWkuICBNb3ZpbmdcbiIKLSIgICAgICAgICAgIHRoZSBtb3VzZSBvdmVyIGl0IHNob3dzIHRoZSBWTkMgZGlzcGxheSBuYW1lIGFuZCBhbnlcbiIKLSIgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnRzLiAgQ2xpY2tpbmcgb24gdGhlIGljb24gcG9wcyB1cCBhIG1lbnVcbiIKLSIgICAgICAgICAgIG9mIGFjdGlvbnMgdG8gcGVyZm9ybS4gIEFtb25nIHRoZW0gaXMgXFxcIlByb3BlcnRpZXNcXFwiIHRoYXRcbiIKLSIgICAgICAgICAgIGFsbG93cyBzZXR0aW5nIG1vcmUgcGFyYW1ldGVycy4gIENsaWNraW5nIG9uIFxcXCJBZHZhbmNlZFxcXCJcbiIKLSIgICAgICAgICAgIGluIFxcXCJQcm9wZXJ0aWVzXFxcIiBicmluZ3MgdXAgdGhlIGZ1bGwgZ3VpLlxuIgotIlxuIgotIiAgLSB0cmF5OiAgQXR0ZW1wdCB0byBlbWJlZCB0aGUgc21hbGwgaWNvbiBpbiB0aGUgc3lzdGVtIHRyYXkuICBJZlxuIgotIiAgICAgICAgICAgdGhpcyBmYWlscyBpdCB3aWxsIHJlc29ydCB0byBpY29uIG1vZGUgd2hlcmUgdGhlIHNtYWxsIGljb25cbiIKLSIgICAgICAgICAgIGlzIGEgc3RhbmRhbG9uZSB3aW5kb3cuXG4iCi0iXG4iCi0iTm90ZSB0aGF0IGluIFxcXCJmdWxsXFxcIiBtb2RlIGlmIHlvdSBkZWxldGUgdGhlIGZ1bGwgZ3VpIHdpbmRvdyB0aGUgZ3VpXG4iCi0idGVybWluYXRlcyAoYnV0IHRoZSB4MTF2bmMgc2VydmVyIGtlZXBzIHJ1bm5pbmcpLiAgSG93ZXZlciB1bmRlciBcXFwiaWNvblxcXCJcbiIKLSJvciBcXFwidHJheVxcXCIgbW9kZSBpZiB5b3UgYnJpbmcgdXAgdGhlIGZ1bGwgZ3VpIHdpbmRvdyB2aWEgXFxcIlByb3BlcnRpZXMgLT5cbiIKLSJBZHZhbmNlZFxcXCIgYW5kIHRoZW4gZGVsZXRlIGl0IHRoZSBndWkgZG9lcyBOT1QgdGVybWluYXRlLlxuIgotIlxuIgotIkFsc28gbm90ZSB0aGF0IGJ5IGRlZmF1bHQgaW4gXFxcImljb25cXFwiIG1vZGUgaWYgeW91IGRlbGV0ZSB0aGUgaWNvblxuIgotIndpbmRvdyBib3RoIHRoZSBndWkgKmFuZCogdGhlIHgxMXZuYyBzZXJ2ZXIgdGVybWluYXRlLlxuIgotIlwiXG4iCi0iXG4iCi0iCXNldCBoZWxwdGV4dChndWkpIFwiXG4iCi0idGt4MTF2bmMgaXMgYSBzaW1wbGUgZnJvbnRlbmQgdG8geDExdm5jLiAgTm90aGluZyBmYW5jeSwgaXQgbWVyZWx5XG4iCi0icHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGVhY2ggb2YgdGhlIG1hbnkgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZFxuIgotInJlbW90ZSBjb250cm9sIGNvbW1hbmRzLiAgU2VlIFxcXCJIZWxwIC0+IGFsbFxcXCIgZm9yIG11Y2ggaW5mbyBhYm91dCB4MTF2bmMuXG4iCi0iXG4iCi0iRm9yIGEgc2ltcGxpZXIgZ3VpLCBydW4geDExdm5jIGluIFxcXCJ0cmF5XFxcIiBvciBcXFwiaWNvblxcXCIgbW9kZSBzdWNoIGFzXG4iCi0iXFxcIi1ndWkgdHJheVxcXCIsIFxcXCItZ3VpIGljb25cXFwiLCBvciBcXFwiLWd1aSB0cmF5PXNldHBhc3NcXFwiLiAgSW4gdGhhdFxuIgotIm1vZGUgdGhlIGZ1bGwgZ3VpIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIFxcXCJBZHZhbmNlZCAuLi5cXFwiLlxuIgotIlxuIgotIkFsc28sIFxcXCItZ3VpIGV6XFxcIiB3aWxsIHNob3cgZmV3ZXIgbWVudSBpdGVtcyAodG9nZ2xlIHZpYSBNaXNjIC0+IHNpbXBsZV9ndWkpXG4iCi0iXG4iCi0iQWxsIG1lbnUgaXRlbXMgaGF2ZSBhICg/KSBidXR0b24gb25lIGNhbiBjbGljayBvbiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvblxuIgotImFib3V0IHRoZSBvcHRpb24gb3IgY29tbWFuZC5cbiIKLSJcbiIKLSJUaGVyZSBhcmUgdHdvIHN0YXRlcyB0a3gxMXZuYyBjYW4gYmUgaW46XG4iCi0iXG4iCi0iCTEpIEF2YWlsYWJsZSB0byBjb250cm9sIGEgcnVubmluZyB4MTF2bmMgcHJvY2Vzcy5cbiIKLSJcbiIKLSIJMikgR2V0dGluZyByZWFkeSB0byBzdGFydCBhIHgxMXZuYyBwcm9jZXNzLlxuIgotIlxuIgotIk1vc3QgcGVvcGxlIHdpbGwganVzdCB1c2Ugc3RhdGUgMSkuXG4iCi0iXG4iCi0iSW4gc3RhdGUgMSkgdGhlIE1lbnUgaXRlbXMgYXZhaWxhYmxlIGluIHRoZSBtZW51cyBhcmUgdGhvc2UgdGhhdFxuIgotImNvcnJlc3BvbmQgdG8gdGhlIHgxMXZuYyBcXFwicmVtb3RlIGNvbnRyb2xcXFwiIGNvbW1hbmRzLiAgU2VlIHRoZSAtcmVtb3RlXG4iCi0iZW50cnkgdW5kZXIgXFxcIkhlbHAgLT4gYWxsXFxcIiBmb3IgYSBjb21wbGV0ZSBsaXN0LiAgQWxzbyBhdmFpbGFibGUgaXNcbiIKLSJ0aGUgXFxcIkFjdGlvbnMgLT4gc3RvcFxcXCIgaXRlbSB0byBzaHV0IGRvd24gdGhlIHJ1bm5pbmcgeDExdm5jIHNlcnZlcixcbiIKLSJ0aGVyZWJ5IGNoYW5naW5nIHRvIHN0YXRlIDIpLiAgVGhlcmUgYXJlIG90aGVyIGFjdGlvbnMgYXZhaWxhYmxlIHRvby5cbiIKLSJcbiIKLSJJbiBzdGF0ZSAyKSB0aGUgTWVudSBpdGVtcyBhdmFpbGFibGUgaW4gdGhlIG1lbnVzIChcXFwiQWN0aW9uc1xcXCIsIFxcXCJDbGllbnRzXFxcIixcbiIKLSJldGMuKSBhcmUgdGhvc2UgdGhhdCBjb3JyZXNwb25kIHRvIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzZWQgaW4gc3RhcnRpbmdcbiIKLSJhbiB4MTF2bmMgcHJvY2VzcywgYW5kIHRoZSBcXFwiQWN0aW9ucyAtPiBzdGFydFxcXCIgaXRlbSBleGVjdXRlc1xuIgotIngxMXZuYyB0aGVyZWJ5IGNoYW5naW5nIHRvIHN0YXRlIDEpLiAgVG8gc2VlIHdoYXQgeDExdm5jIHN0YXJ0dXAgY29tbWFuZFxuIgotInlvdSBoYXZlIGJ1aWx0IHNvIGZhciwgbG9vayBhdCB0aGUgKD8pIGhlbHAgZm9yICBcXFwiQWN0aW9ucyAtPiBzdGFydFxcXCJcbiIKLSJhbmQgaXQgd2lsbCBzaG93IHlvdSB3aGF0IHRoZSBjb21tYW5kIGxvb2tzIGxpa2UuXG4iCi0iXG4iCi0iVGhlcmUgaXMgbXVjaCBvdmVybGFwIGJldHdlZW4gdGhlIG1lbnUgaXRlbXMgYXZhaWxhYmxlIGluIHN0YXRlIDEpXG4iCi0iYW5kIHN0YXRlIDIpLCBidXQgaXQgaXMgd29ydGgga2VlcGluZyBpbiBtaW5kIGl0IGlzIG5vdCAxMDAlLlxuIgotIkZvciBleGFtcGxlLCB5b3UgY2Fubm90IHNldCBwYXNzd29yZHMgb3IgcGFzc3dvcmQgZmlsZXMgaW4gc3RhdGUgMSkuXG4iCi0iKHVwZGF0ZTogc2ltcGxlIHBhc3N3b3JkIHNldHRpbmcgaXMgbm93IGFsbG93ZWQgaW4gXFxcInRyYXlcXFwiIG9yIFxcXCJpY29uXFxcIiBtb2RlKS5cbiIKLSJcbiIKLSJcbiIKLSJBbHNvIG5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgKnR3byogc2VwYXJhdGUgWCBkaXNwbGF5cyBpbnZvbHZlZCwgbm90IGp1c3RcbiIKLSJvbmU6ICAxKSB0aGUgWCBkaXNwbGF5IHgxMXZuYyB3aWxsIGJlIHBvbGxpbmcgKGFuZCBtYWtpbmcgYXZhaWxhYmxlIHRvXG4iCi0iVk5DIHZpZXdlcnMpLCBhbmQgMikgdGhlIFggZGlzcGxheSB0aGlzIEdVSSBpcyBpbnRlbmRlZCB0byBkaXNwbGF5IG9uLlxuIgotIlxuIgotIkZvciBleGFtcGxlLCBvbmUgbWlnaHQgdXNlIHNzaCB0byBhY2Nlc3MgdGhlIHJlbW90ZSBtYWNoaW5lIHdoZXJlIHRoZVxuIgotIkdVSSB3b3VsZCBkaXNwbGF5IG9uIDoxMSBhbmQgeDExdm5jIHdvdWxkIHBvbGwgZGlzcGxheSA6MC4gIEJ5IGRlZmF1bHRcbiIKLSJ0aGUgZ3VpIHdpbGwgZGlzcGxheSBvbiB0aGUgdmFsdWUgaW4gdGhlIERJU1BMQVkgZW52LiB2YXJpYWJsZSBmb2xsb3dlZFxuIgotImJ5IHRoZSB2YWx1ZSBmcm9tIHRoZSAtZGlzcGxheSBvcHRpb24uICBUbyBvdmVycmlkZSB0aGlzLCB1c2Ugc29tZXRoaW5nXG4iCi0ibGlrZTogXFxcIi1ndWkgb3RoZXJob3N0OjBcXFwiLCBldGMuXG4iCi0iXG4iCi0iXG4iCi0iR1VJIGNvbXBvbmVudHM6IFxuIgotIi0tLSAtLS0tLS0tLS0tXG4iCi0iXG4iCi0iMSkgQXQgdGhlIHRvcCBvZiB0aGUgZ3VpIGlzIGEgaW5mbyB0ZXh0IGxhYmVsIHdoZXJlIGluZm9ybWF0aW9uIHdpbGxcbiIKLSIgICBiZSBwb3N0ZWQsIGUuZy4gd2hlbiB0cmF2ZXJzaW5nIG1lbnUgaXRlbXMgdGV4dCBpbmRpY2F0aW5nIGhvdyB0byBnZXRcbiIKLSIgICBoZWxwIG9uIHRoZSBpdGVtIGFuZCBpdHMgY3VycmVudCB2YWx1ZSB3aWxsIGJlIGRpc3BsYXllZC5cbiIKLSJcbiIKLSIyKSBCZWxvdyB0aGUgaW5mbyBsYWJlbCBpcyB0aGUgYXJlYSB3aGVyZSB0aGUgbWVudSBidXR0b25zLCBcXFwiQWN0aW9uc1xcXCIsXG4iCi0iICAgXFxcIkNsaWVudHNcXFwiLCBldGMuLCBhcmUgcHJlc2VudGVkLiAgSWYgYSBtZW51IGl0ZW0gaGFzIGEgY2hlY2tib3gsXG4iCi0iICAgaXQgY29ycmVzcG9uZHMgdG8gYSBib29sZWFuIG9uL29mZiB2YXJpYWJsZS4gIE90aGVyd2lzZSBpdCBpc1xuIgotIiAgIGVpdGhlciBhIHN0cmluZyB2YXJpYWJsZSwgb3IgYW4gYWN0aW9uIG5vdCBhc3NvY2lhdGVkIHdpdGggYVxuIgotIiAgIHZhcmlhYmxlIChmb3IgdGhlIG1vc3QgcGFydCkuXG4iCi0iXG4iCi0iMykgQmVsb3cgdGhlIG1lbnUgYnV0dG9uIGFyZWEgaXMgYSBsYWJlbCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHgxMXZuY1xuIgotIiAgIFggZGlzcGxheSBiZWluZyBwb2xsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFZOQyBkaXNwbGF5IG5hbWUuICBCb3RoXG4iCi0iICAgd2lsbCBiZSBcXFwiKCpub25lKilcXFwiIHdoZW4gdGhlcmUgaXMgbm8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZC5cbiIKLSJcbiIKLSI0KSBCZWxvdyB0aGUgeDExIGFuZCB2bmMgZGlzcGxheXMgbGFiZWwgaXMgYSB0ZXh0IGFyZWEgdGhlcmUgc2Nyb2xsaW5nXG4iCi0iICAgaW5mb3JtYXRpb24gYWJvdXQgYWN0aW9ucyBiZWluZyB0YWtlbiBhbmQgY29tbWFuZHMgYmVpbmcgcnVuIGlzIGRpc3BsYXllZC5cbiIKLSIgICBUbyBzY3JvbGwgY2xpY2sgaW4gdGhlIGFyZWEgYW5kIHVzZSBQYWdlVXAvUGFnZURvd24gb3IgdGhlIGFycm93IGtleXMuXG4iCi0iXG4iCi0iNSkgQXQgdGhlIGJvdHRvbSBpcyBhbiBlbnRyeSBhcmVhLiAgV2hlbiBvbmUgc2VsZWN0cyBhIG1lbnUgaXRlbSB0aGF0XG4iCi0iICAgcmVxdWlyZXMgc3VwcGx5aW5nIGEgc3RyaW5nIHZhbHVlLCB0aGUgbGFiZWwgd2lsbCBiZSBzZXQgdG8gdGhlXG4iCi0iICAgcGFyYW1ldGVyIG5hbWUgYW5kIG9uZSB0eXBlcyBpbiB0aGUgbmV3IHZhbHVlLiAgVGhlbiBvbmUgcHJlc3NlcyB0aGVcbiIKLSIgICBcXFwiT0tcXFwiIGJ1dHRvbiBvciBwcmVzc2VzIFxcXCJFbnRlclxcXCIgdG8gc2V0IHRoZSB2YWx1ZS4gIE9yIHlvdSBjYW4gcHJlc3NcbiIKLSIgICBcXFwiQ2FuY2VsXFxcIiBvciBcXFwiRXNjYXBlXFxcIiB0byBhdm9pZCBjaGFuZ2luZyB0aGUgdmFyaWFibGUuXG4iCi0iXG4iCi0iICAgTWFueSB2YXJpYWJsZXMgYXJlIGJvb2xlYW4gdG9nZ2xlcyAoZm9yIGV4YW1wbGUsIFxcXCJQZXJtaXNzaW9ucyAtPlxuIgotIiAgIHZpZXdvbmx5XFxcIikgb3IgUmFkaW8gYnV0dG9uIHNlbGVjdGlvbnMuICBTZWxlY3RpbmcgdGhlc2UgbWVudSBpdGVtc1xuIgotIiAgIHdpbGwgTk9UIGFjdGl2YXRlIHRoZSBlbnRyeSBhcmVhIGJ1dCByYXRoZXIgdG9nZ2xlIHRoZSB2YXJpYWJsZVxuIgotIiAgIGltbWVkaWF0ZWx5LlxuIgotIlxuIgotIlxuIgotIkNBU0NBREVTIEJVRzogVGhlcmUgaXMgYSBidWcgbm90IHlldCB3b3JrZWQgYXJvdW5kIGZvciB0aGUgY2FzY2FkZSBtZW51c1xuIgotIndoZXJlIHRoZSAoPykgaGVscCBidXR0b24gZ2V0cyBpbiB0aGUgd2F5LiAgVG8gZ2V0IHRoZSBtb3VzZSBvdmVyIHRvXG4iCi0idGhlIGNhc2NhZGUgbWVudSBjbGljayBhbmQgcmVsZWFzZSBtb3VzZSB0byBhY3RpdmF0ZSB0aGUgY2FzY2FkZSwgdGhlblxuIgotInlvdSBjYW4gY2xpY2sgb24gaXRzIGl0ZW1zLiAgRHJhZ2dpbmcgd2l0aCBhIG1vdXNlIGJ1dHRvbiBoZWxkIGRvd24gd2lsbFxuIgotIm5vdCB3b3JrIChzb3JyeSEpLlxuIgotIlxuIgotIlxuIgotIktleSBCaW5kaW5nczpcbiIKLSJcbiIKLSIJSW4gdGhlIFRleHQgQXJlYTogQ29udHJvbC0vIHNlbGVjdHMgYWxsIG9mIHRoZSB0ZXh0LlxuIgotIglBbnl3aGVyZTogQ29udHJvbC1kIGludm9rZXMgXFxcIkFjdGlvbnMgLT4gZGV0YWNoXFxcIlxuIgotIglBbnl3aGVyZTogQ29udHJvbC1hIGludm9rZXMgXFxcIkFjdGlvbnMgLT4gYXR0YWNoXFxcIlxuIgotIglBbnl3aGVyZTogQ29udHJvbC1wIGludm9rZXMgXFxcIkFjdGlvbnMgLT4gcGluZ1xcXCJcbiIKLSIJQW55d2hlcmU6IENvbnRyb2wtdSBhbmQgQ29udHJvbC1yIGludm9rZSBcXFwiQWN0aW9ucyAtPiB1cGRhdGUtYWxsXFxcIlxuIgotIlwiXG4iCi0iXG4iCi0ic2V0IHVuZGVyX3dhbGx5IFwiXG4iCi0iTWlzYzpcbiIKLSJcbiIKLSJTaW5jZSB4MTF2bmMgaGFzIHNvIG1hbnkgc2V0dGluZ3MgYW5kIHRvIGF2b2lkIGZ1cnRoZXIgY29uZnVzaW9uLFxuIgotInRoZSBsaWJ2bmNzZXJ2ZXIgb3B0aW9uczpcbiIKLSJcbiIKLSIJLWFsd2F5c3NoYXJlZFxuIgotIgktbmV2ZXJzaGFyZWRcbiIKLSIJLWRvbnRkaXNjb25uZWN0XG4iCi0iXG4iCi0iYXJlIG5vdCBhdmFpbGFibGUgZm9yIGNoYW5naW5nIGluIGEgcnVubmluZyB4MTF2bmMgKGV2ZW4gdGhvdWdoIGl0XG4iCi0iaXMgZmVhc2libGUpLiAgVGhlc2Ugb3B0aW9ucyBvdmVybGFwIHdpdGggdGhlIHgxMXZuYyBvcHRpb25zIC1zaGFyZWRcbiIKLSJhbmQgLWZvcmV2ZXIgd2hpY2ggYXJlIGhvcGVmdWxseSBlbm91Z2ggZm9yIG1vc3QgdXNhZ2UuICBUaGV5IG1heSBiZVxuIgotInNwZWNpZmllZCBmb3IgeDExdm5jIHN0YXJ0dXAgaWYgZGVzaXJlZC5cbiIKLSJcbiIKLSJcIlxuIgotIlxuIgotImdsb2JhbCBiZWdpbm5lcl9tb2RlXG4iCi0iaWYgeyRiZWdpbm5lcl9tb2RlfSB7XG4iCi0iCXNldCBoZWxwdGV4dChndWkpIFwiXG4iCi0idGt4MTF2bmMgaXMgYSBzaW1wbGUgZnJvbnRlbmQgdG8geDExdm5jLiAgSXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgaW5cbiIKLSJcXFwiZXpcXFwiIG9yIFxcXCJzaW1wbGVcXFwiIG1vZGUuICBGb3IgbWFueSBtb3JlIG9wdGlvbnMgcnVuIGl0IGluIG5vcm1hbFxuIgotIm1vZGUgYnkgdG9nZ2xpbmcgXFxcIk1pc2MgLT4gc2ltcGxlX2d1aVxcXCIuXG4iCi0iXG4iCi0iQWxsIG1lbnUgaXRlbXMgaGF2ZSBhICg/KSBidXR0b24gb25lIGNhbiBjbGljayBvbiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvblxuIgotImFib3V0IHRoZSBvcHRpb24gb3IgY29tbWFuZC5cbiIKLSJcbiIKLSJHVUkgY29tcG9uZW50czogXG4iCi0iLS0tIC0tLS0tLS0tLS1cbiIKLSJcbiIKLSIxKSBBdCB0aGUgdG9wIG9mIHRoZSBndWkgaXMgYSBpbmZvIHRleHQgbGFiZWwgd2hlcmUgaW5mb3JtYXRpb24gd2lsbFxuIgotIiAgIGJlIHBvc3RlZCwgZS5nLiB3aGVuIHRyYXZlcnNpbmcgbWVudSBpdGVtcyB0ZXh0IGluZGljYXRpbmcgaG93IHRvIGdldFxuIgotIiAgIGhlbHAgb24gdGhlIGl0ZW0gYW5kIGl0cyBjdXJyZW50IHZhbHVlIHdpbGwgYmUgZGlzcGxheWVkLlxuIgotIlxuIgotIjIpIEJlbG93IHRoZSBpbmZvIGxhYmVsIGlzIHRoZSBhcmVhIHdoZXJlIHRoZSBtZW51IGJ1dHRvbnMsIFxcXCJBY3Rpb25zXFxcIixcbiIKLSIgICBcXFwiQ2xpZW50c1xcXCIsIGV0Yy4sIGFyZSBwcmVzZW50ZWQuICBJZiBhIG1lbnUgaXRlbSBoYXMgYSBjaGVja2JveCxcbiIKLSIgICBpdCBjb3JyZXNwb25kcyB0byBhIGJvb2xlYW4gb24vb2ZmIHZhcmlhYmxlLiAgT3RoZXJ3aXNlIGl0IGlzXG4iCi0iICAgZWl0aGVyIGEgc3RyaW5nIHZhcmlhYmxlLCBvciBhbiBhY3Rpb24gbm90IGFzc29jaWF0ZWQgd2l0aCBhXG4iCi0iICAgdmFyaWFibGUgKGZvciB0aGUgbW9zdCBwYXJ0KS5cbiIKLSJcbiIKLSIzKSBCZWxvdyB0aGUgbWVudSBidXR0b24gYXJlYSBpcyBhIGxhYmVsIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgeDExdm5jXG4iCi0iICAgWCBkaXNwbGF5IGJlaW5nIHBvbGxlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgVk5DIGRpc3BsYXkgbmFtZS4gIEJvdGhcbiIKLSIgICB3aWxsIGJlIFxcXCIoKm5vbmUqKVxcXCIgd2hlbiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIGVzdGFibGlzaGVkLlxuIgotIlxuIgotIjQpIEJlbG93IHRoZSB4MTEgYW5kIHZuYyBkaXNwbGF5cyBsYWJlbCBpcyBhIHRleHQgYXJlYSB0aGVyZSBzY3JvbGxpbmdcbiIKLSIgICBpbmZvcm1hdGlvbiBhYm91dCBhY3Rpb25zIGJlaW5nIHRha2VuIGFuZCBjb21tYW5kcyBiZWluZyBydW4gaXMgZGlzcGxheWVkLlxuIgotIiAgIFRvIHNjcm9sbCBjbGljayBpbiB0aGUgYXJlYSBhbmQgdXNlIFBhZ2VVcC9QYWdlRG93biBvciB0aGUgYXJyb3cga2V5cy5cbiIKLSJcbiIKLSI1KSBBdCB0aGUgYm90dG9tIGlzIGFuIGVudHJ5IGFyZWEuICBXaGVuIG9uZSBzZWxlY3RzIGEgbWVudSBpdGVtIHRoYXRcbiIKLSIgICByZXF1aXJlcyBzdXBwbHlpbmcgYSBzdHJpbmcgdmFsdWUsIHRoZSBsYWJlbCB3aWxsIGJlIHNldCB0byB0aGVcbiIKLSIgICBwYXJhbWV0ZXIgbmFtZSBhbmQgb25lIHR5cGVzIGluIHRoZSBuZXcgdmFsdWUuICBUaGVuIG9uZSBwcmVzc2VzIHRoZVxuIgotIiAgIFxcXCJPS1xcXCIgYnV0dG9uIG9yIHByZXNzZXMgXFxcIkVudGVyXFxcIiB0byBzZXQgdGhlIHZhbHVlLiAgT3IgeW91IGNhbiBwcmVzc1xuIgotIiAgIFxcXCJDYW5jZWxcXFwiIG9yIFxcXCJFc2NhcGVcXFwiIHRvIGF2b2lkIGNoYW5naW5nIHRoZSB2YXJpYWJsZS5cbiIKLSJcbiIKLSIgICBNYW55IHZhcmlhYmxlcyBhcmUgYm9vbGVhbiB0b2dnbGVzIChmb3IgZXhhbXBsZSwgXFxcIlBlcm1pc3Npb25zIC0+XG4iCi0iICAgdmlld29ubHlcXFwiKSBvciBSYWRpbyBidXR0b24gc2VsZWN0aW9ucy4gIFNlbGVjdGluZyB0aGVzZSBtZW51IGl0ZW1zXG4iCi0iICAgd2lsbCBOT1QgYWN0aXZhdGUgdGhlIGVudHJ5IGFyZWEgYnV0IHJhdGhlciB0b2dnbGUgdGhlIHZhcmlhYmxlXG4iCi0iICAgaW1tZWRpYXRlbHkuXG4iCi0iXG4iCi0iQ0FTQ0FERVMgQlVHOiBUaGVyZSBpcyBhIGJ1ZyBub3QgeWV0IHdvcmtlZCBhcm91bmQgZm9yIHRoZSBjYXNjYWRlIG1lbnVzXG4iCi0id2hlcmUgdGhlICg/KSBoZWxwIGJ1dHRvbiBnZXRzIGluIHRoZSB3YXkuICBUbyBnZXQgdGhlIG1vdXNlIG92ZXIgdG9cbiIKLSJ0aGUgY2FzY2FkZSBtZW51IGNsaWNrIGFuZCByZWxlYXNlIG1vdXNlIHRvIGFjdGl2YXRlIHRoZSBjYXNjYWRlLCB0aGVuXG4iCi0ieW91IGNhbiBjbGljayBvbiBpdHMgaXRlbXMuICBEcmFnZ2luZyB3aXRoIGEgbW91c2UgYnV0dG9uIGhlbGQgZG93biB3aWxsXG4iCi0ibm90IHdvcmsgKHNvcnJ5ISkuXG4iCi0iXG4iCi0iXCJcbiIKLSJ9XG4iCi0iXG4iCi0ifVxuIgotIlxuIgotInByb2MgY2VudGVyX3dpbiB7d30ge1xuIgotIgl3bSB3aXRoZHJhdyAkd1xuIgotIglzZXQgeCBbZXhwciBbd2luZm8gc2NyZWVud2lkdGggICR3XS8yIC0gW3dpbmZvIHJlcXdpZHRoICAkd10vMl07XG4iCi0iCXNldCB5IFtleHByIFt3aW5mbyBzY3JlZW5oZWlnaHQgJHddLzIgLSBbd2luZm8gcmVxaGVpZ2h0ICR3XS8yXTtcbiIKLSIJd20gZ2VvbWV0cnkgJHcgKyR4KyR5XG4iCi0iCXdtIGRlaWNvbmlmeSAkd1xuIgotIgl1cGRhdGVcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB0ZXh0d2lkdGgge3RleHR9IHtcbiIKLSIJc2V0IG1pbiAwO1xuIgotIglmb3JlYWNoIGxpbmUgW3NwbGl0ICR0ZXh0IFwiXFxuXCJdIHtcbiIKLSIJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRsaW5lXVxuIgotIgkJaWYgeyRuID4gJG1pbn0ge1xuIgotIgkJCXNldCBtaW4gJG5cbiIKLSIJCX1cbiIKLSIJfVxuIgotIglyZXR1cm4gJG1pblxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHRleHRoZWlnaHQge3RleHR9IHtcbiIKLSIJc2V0IGNvdW50IDA7XG4iCi0iCWZvcmVhY2ggbGluZSBbc3BsaXQgJHRleHQgXCJcXG5cIl0ge1xuIgotIgkJaW5jciBjb3VudFxuIgotIgl9XG4iCi0iCXJldHVybiAkY291bnRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXRfbmFtZSB7bmFtZX0ge1xuIgotIglnbG9iYWwgZnVsbF93aW4gaWNvbl9tb2RlXG4iCi0iCWdsb2JhbCBzYXZlZF9zZXRfbmFtZVxuIgotIlxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyBzYXZlZF9zZXRfbmFtZV19IHtcbiIKLSIJCXNldCBzYXZlZF9zZXRfbmFtZSBcInRreDExdm5jXCJcbiIKLSIJfVxuIgotIglpZiB7JG5hbWUgPT0gXCJSRVNUT1JFXCJ9IHtcbiIKLSIJCXNldCBuYW1lICRzYXZlZF9zZXRfbmFtZVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IHNhdmVkX3NldF9uYW1lICRuYW1lXG4iCi0iCX1cbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgZnVsbF93aW5dfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglzZXQgdyBcIi5cIlxuIgotIglpZiB7JGljb25fbW9kZX0ge1xuIgotIgkJd20gdGl0bGUgICAgJHcgXCIkbmFtZVwiXG4iCi0iCQl3bSBpY29ubmFtZSAkdyBcIiRuYW1lXCJcbiIKLSIJCXNldCB3ICRmdWxsX3dpblxuIgotIgl9XG4iCi0iCXdtIHRpdGxlICAgICR3IFwiJG5hbWVcIlxuIgotIgl3bSBpY29ubmFtZSAkdyBcIiRuYW1lXCJcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBtYWtlX3RvcGxldmVsIHt3IHt0aXRsZSBcIlwifX0ge1xuIgotIgljYXRjaCB7ZGVzdHJveSAkd31cbiIKLSIJdG9wbGV2ZWwgICR3O1xuIgotIgliaW5kICR3IDxFc2NhcGU+IFwiZGVzdHJveSAkd1wiXG4iCi0iCWlmIHskdGl0bGUgIT0gXCJcIn0ge1xuIgotIgkJd20gdGl0bGUgICAgJHcgJHRpdGxlXG4iCi0iCQl3bSBpY29ubmFtZSAkdyAkdGl0bGVcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHRleHR3aW4ge25hbWUgdGl0bGUgdGV4dCB7ZW50cnkgXCJcIn19IHtcbiIKLSIJZ2xvYmFsIG1heF90ZXh0X2hlaWdodCBtYXhfdGV4dF93aWR0aFxuIgotIglnbG9iYWwgYmZvbnQgZmZvbnRcbiIKLSJcbiIKLSIJc2V0IHdpZHRoICBbdGV4dHdpZHRoICR0ZXh0XVxuIgotIglpbmNyIHdpZHRoXG4iCi0iCWlmIHskd2lkdGggPiAkbWF4X3RleHRfd2lkdGh9IHtcbiIKLSIJCXNldCB3aWR0aCAkbWF4X3RleHRfd2lkdGhcbiIKLSIJfVxuIgotIglzZXQgaGVpZ2h0IFt0ZXh0aGVpZ2h0ICR0ZXh0XVxuIgotIglpZiB7JGhlaWdodCA+ICRtYXhfdGV4dF9oZWlnaHR9IHtcbiIKLSIJCXNldCBoZWlnaHQgJG1heF90ZXh0X2hlaWdodFxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCB3IFwiLnRleHRfJG5hbWVcIlxuIgotIgltYWtlX3RvcGxldmVsICR3ICR0aXRsZVxuIgotIlxuIgotIglmcmFtZSAgICAgJHcuZiAtYmQgMDtcbiIKLSIJcGFjayAgICAgICR3LmYgLWZpbGwgYm90aCAtZXhwYW5kIDFcbiIKLSIJdGV4dCAgICAgICR3LmYudCAtd2lkdGggJHdpZHRoIC1oZWlnaHQgJGhlaWdodCAtc2V0Z3JpZCAxIC1iZCAyIFxcXG4iCi0iCQkJLXlzY3JvbGxjb21tYW5kIFwiJHcuZi55IHNldFwiIC1yZWxpZWYgcmlkZ2UgXFxcbiIKLSIJCQktZm9udCAkZmZvbnQ7XG4iCi0iCXNjcm9sbGJhciAkdy5mLnkgLW9yaWVudCB2IC1yZWxpZWYgc3Vua2VuIC1jb21tYW5kIFwiJHcuZi50IHl2aWV3XCI7XG4iCi0iCWJ1dHRvbiAgICAkdy5mLmIgLXRleHQgXCJEaXNtaXNzXCIgLWNvbW1hbmQgXCJkZXN0cm95ICR3XCIgLWZvbnQgJGJmb250IFxcXG4iCi0iCQkJLXBhZHkgMlxuIgotIlxuIgotIgkkdy5mLnQgaW5zZXJ0IDEuMCAkdGV4dDtcbiIKLSJcbiIKLSIJYmluZCAkdyA8RW50ZXI+IFwiZm9jdXMgJHcuZi50XCJcbiIKLSJcbiIKLSIJaWYgeyRlbnRyeSAhPSBcIlwifSB7XG4iCi0iCQkjIHZhcm5hbWUrTGFiZWwgTmFtZVxuIgotIgkJc2V0IGxpc3QgW3NwbGl0ICRlbnRyeSBcIitcIl1cbiIKLSIJCXNldCB2YXJuYW1lIFtsaW5kZXggJGxpc3QgMF1cbiIKLSIJCXNldCBsYWJuYW1lIFtsaW5kZXggJGxpc3QgMV1cbiIKLSIJCWZyYW1lICR3LmYuZWYgLWJkIDEgLXJlbGllZiBncm9vdmVcbiIKLSIJCWxhYmVsICR3LmYuZWYubCAtdGV4dCBcIiRsYWJuYW1lXCIgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIgkJZW50cnkgJHcuZi5lZi5lIC1yZWxpZWYgc3Vua2VuIC1mb250ICRmZm9udCBcXFxuIgotIgkJCS10ZXh0dmFyaWFibGUgJHZhcm5hbWVcbiIKLSIJCWJ1dHRvbiAkdy5mLmVmLmIgLXRleHQgXCJPS1wiIC1mb250ICRiZm9udCBcXFxuIgotIgkJCS1jb21tYW5kIFwic2V0ICR7dmFybmFtZX1fb2sgMTsgZGVzdHJveSAkd1wiIFxuIgotIgkJYmluZCAkdy5mLmVmLmUgPEtleVByZXNzLVJldHVybj4gXCJzZXQgJHt2YXJuYW1lfV9vayAxOyBkZXN0cm95ICR3XCJcbiIKLSIJCVxuIgotIgkJcGFjayAkdy5mLmVmLmwgLXNpZGUgbGVmdFxuIgotIgkJcGFjayAkdy5mLmVmLmUgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMVxuIgotIgkJcGFjayAkdy5mLmVmLmIgLXNpZGUgcmlnaHRcbiIKLSIJfVxuIgotIlxuIgotIgl3bSB3aXRoZHJhdyAkd1xuIgotIglwYWNrICR3LmYuYiAtc2lkZSBib3R0b20gLWZpbGwgeCBcbiIKLSIJaWYgeyRlbnRyeSAhPSBcIlwifSB7XG4iCi0iCQlwYWNrICR3LmYuZWYgLXNpZGUgYm90dG9tIC1maWxsIHggXG4iCi0iCQliaW5kICR3IDxFbnRlcj4gXCJmb2N1cyAkdy5mLmVmLmVcIlxuIgotIgkJJHcuZi5lZi5lIGljdXJzb3IgZW5kXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQliaW5kICR3IDxFbnRlcj4gXCJmb2N1cyAkdy5mLnRcIlxuIgotIgl9XG4iCi0iCXBhY2sgJHcuZi55IC1zaWRlIHJpZ2h0IC1maWxsIHk7XG4iCi0iCXBhY2sgJHcuZi50IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMTtcbiIKLSIJdXBkYXRlXG4iCi0iXG4iCi0iCWNlbnRlcl93aW4gJHdcbiIKLSJcbiIKLSIJcmV0dXJuICR3XG4iCi0ifVxuIgotIlxuIgotInByb2MgYWN0aXZlX3doZW5fY29ubmVjdGVkIHtpdGVtfSB7XG4iCi0iCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0XG4iCi0iCWdsb2JhbCBpY29uX21vZGVcbiIKLSJcbiIKLSIJaWYgeyRpY29uX21vZGV9IHtcbiIKLSIJCWlmIHskaXRlbSA9PSBcInBhc3N3ZFwifSB7XG4iCi0iCQkJcmV0dXJuIDFcbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSA9PSBcInZpZXdwYXNzd2RcIn0ge1xuIgotIgkJCXJldHVybiAxXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYge1tvcHRfbWF0Y2ggRyAkaXRlbV19IHtcbiIKLSIJCXJldHVybiAxXG4iCi0iCX0gZWxzZWlmIHtbb3B0X21hdGNoIFIgJGl0ZW1dfSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9IGVsc2VpZiB7W29wdF9tYXRjaCBTICRpdGVtXX0ge1xuIgotIgkJcmV0dXJuIDBcbiIKLSIJfSBlbHNlaWYge1tpc19hY3Rpb24gJGl0ZW1dfSB7XG4iCi0iCQlpZiB7W29wdF9tYXRjaCBSICRpdGVtXX0ge1xuIgotIgkJCXJldHVybiAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXJldHVybiAwXG4iCi0iCQl9XG4iCi0iCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVscHJlbW90ZSgkaXRlbSldfSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9IGVsc2Uge1xuIgotIgkJcmV0dXJuIDBcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGFjdGl2ZV93aGVuX3N0YXJ0aW5nIHtpdGVtfSB7XG4iCi0iCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0IGJlZ2lubmVyX21vZGVcbiIKLSJcbiIKLSIJaWYgeyRiZWdpbm5lcl9tb2RlfSB7XG4iCi0iCQlpZiB7W29wdF9tYXRjaCBHICRpdGVtXX0ge1xuIgotIgkJCXJldHVybiAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7JGl0ZW0gPT0gXCJkaXNwbGF5XCJ9IHtcbiIKLSIJCQlyZXR1cm4gMVxuIgotIgkJfVxuIgotIgkJaWYgeyRpdGVtID09IFwiYXR0YWNoXCJ9IHtcbiIKLSIJCQlyZXR1cm4gMVxuIgotIgkJfVxuIgotIgkJaWYgeyRpdGVtID09IFwiZGVidWdfZ3VpXCJ9IHtcbiIKLSIJCQlyZXR1cm4gMVxuIgotIgkJfVxuIgotIgkJcmV0dXJuIDBcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7W29wdF9tYXRjaCBHICRpdGVtXX0ge1xuIgotIgkJcmV0dXJuIDFcbiIKLSIJfSBlbHNlaWYge1tvcHRfbWF0Y2ggUyAkaXRlbV19IHtcbiIKLSIJCXJldHVybiAxXG4iCi0iCX0gZWxzZWlmIHtbb3B0X21hdGNoIFIgJGl0ZW1dfSB7XG4iCi0iCQlyZXR1cm4gMFxuIgotIgl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHtcbiIKLSIJCWlmIHtbb3B0X21hdGNoIFMgJGl0ZW1dfSB7XG4iCi0iCQkJcmV0dXJuIDFcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJcmV0dXJuIDBcbiIKLSIJCX1cbiIKLSIJfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBoZWxwdGV4dCgkaXRlbSldfSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9IGVsc2Uge1xuIgotIgkJcmV0dXJuIDBcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGhlbHBfd2luIHtpdGVtfSB7XG4iCi0iCWdsb2JhbCBoZWxwdGV4dCBoZWxwcmVtb3RlIG1lbnVfdmFyXG4iCi0iCWdsb2JhbCBxdWVyeV9hbnMgcXVlcnlfYXJvXG4iCi0iCWdsb2JhbCBiZWdpbm5lcl9tb2RlXG4iCi0iXG4iCi0iCXNldCBvayAwXG4iCi0iCXNldCB0ZXh0IFwiSGVscCBvbiAkaXRlbTpcXG5cXG5cIlxuIgotIlxuIgotIglpZiB7JGl0ZW0gPT0gXCJOZXdDbGllbnRcIn0ge1xuIgotIgkJO1xuIgotIgl9IGVsc2VpZiB7W2lzX2d1aV9pbnRlcm5hbCAkaXRlbV19IHtcbiIKLSIJCWlmIHskaXRlbSAhPSBcImd1aVwiICYmICRpdGVtICE9IFwiYWxsXCIgJiYgJGl0ZW0gIT0gXCJNaXNjLVR1bmluZzpcIiBcXFxuIgotIgkJICAgICYmICRpdGVtICE9IFwiUHJvcGVydGllc1wiICYmICRpdGVtICE9IFwiVHJheVwifSB7XG4iCi0iCQkJYXBwZW5kIHRleHQgXCIgICAgKyBJcyBhIGd1aSBpbnRlcm5hbCBBY3Rpb24gKGNhbm5vdCBiZSBzZXQpLlxcblwiO1xuIgotIgkJfVxuIgotIgl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHtcbiIKLSIJCWFwcGVuZCB0ZXh0IFwiICAgICsgSXMgYSByZW1vdGUgY29udHJvbCBBY3Rpb24gKGNhbm5vdCBiZSBzZXQpLlxcblwiO1xuIgotIgl9IGVsc2VpZiB7W2FjdGl2ZV93aGVuX2Nvbm5lY3RlZCAkaXRlbV19IHtcbiIKLSIJCWFwcGVuZCB0ZXh0IFwiICAgICsgQ2FuIGJlIGNoYW5nZWQgaW4gYSBydW5uaW5nIHgxMXZuYy5cXG5cIjtcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWFwcGVuZCB0ZXh0IFwiICAgIC0gQ2Fubm90IGJlIGNoYW5nZWQgaW4gYSBydW5uaW5nIHgxMXZuYy5cXG5cIjtcbiIKLSIJfVxuIgotIglpZiB7JGl0ZW0gPT0gXCJOZXdDbGllbnRcIn0ge1xuIgotIgkJO1xuIgotIgl9IGVsc2VpZiB7W2lzX2d1aV9pbnRlcm5hbCAkaXRlbV19IHtcbiIKLSIJCTtcbiIKLSIJfSBlbHNlaWYge1thY3RpdmVfd2hlbl9zdGFydGluZyAkaXRlbV19IHtcbiIKLSIJCWFwcGVuZCB0ZXh0IFwiICAgICsgQ2FuIGJlIHNldCBhdCB4MTF2bmMgc3RhcnR1cC5cXG5cIjtcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWlmIHshICRiZWdpbm5lcl9tb2RlfSB7XG4iCi0iCQkJYXBwZW5kIHRleHQgXCIgICAgLSBDYW5ub3QgYmUgc2V0IGF0IHgxMXZuYyBzdGFydHVwLlxcblwiO1xuIgotIgkJfVxuIgotIgl9XG4iCi0iCWFwcGVuZCB0ZXh0IFwiXFxuXCJcbiIKLSJcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBoZWxwdGV4dCgkaXRlbSldfSB7XG4iCi0iCQlhcHBlbmQgdGV4dCBcIlxcblwiXG4iCi0iCQlpZiB7W2lzX2d1aV9pbnRlcm5hbCAkaXRlbV19IHtcbiIKLSIJCQlhcHBlbmQgdGV4dCBcIj09PT0geDExdm5jIGhlbHA6ID09PT1cXG5cIjtcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYXBwZW5kIHRleHQgXCI9PT09IHgxMXZuYyBzdGFydHVwIG9wdGlvbiBoZWxwOiA9PT09XFxuXCI7XG4iCi0iCQl9XG4iCi0iCQlhcHBlbmQgdGV4dCBcIlxcblwiXG4iCi0iCQlhcHBlbmQgdGV4dCAkaGVscHRleHQoJGl0ZW0pXG4iCi0iCQlhcHBlbmQgdGV4dCBcIlxcblwiXG4iCi0iCQlzZXQgb2sgMVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgaGVscHJlbW90ZSgkaXRlbSldfSB7XG4iCi0iCQlhcHBlbmQgdGV4dCBcIlxcblwiXG4iCi0iCQlhcHBlbmQgdGV4dCBcIj09PT0geDExdm5jIHJlbW90ZSBjb250cm9sIGhlbHA6ID09PT1cXG5cIjtcbiIKLSIJCWFwcGVuZCB0ZXh0IFwiXFxuXCJcbiIKLSIJCWFwcGVuZCB0ZXh0ICRoZWxwcmVtb3RlKCRpdGVtKVxuIgotIgkJc2V0IG9rIDFcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7IVtpc19hY3Rpb24gJGl0ZW1dICYmIFtpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7XG4iCi0iCQlnbG9iYWwgdW5zZXRfc3RyXG4iCi0iCQlhcHBlbmQgdGV4dCBcIlxcblxcblwiXG4iCi0iCQlhcHBlbmQgdGV4dCBcIj09PT0gY3VycmVudCAkaXRlbSB2YWx1ZTogPT09PVxcblwiO1xuIgotIgkJYXBwZW5kIHRleHQgXCJcXG5cIlxuIgotIlxuIgotIgkJaWYgeyRpdGVtID09IFwicGFzc3dkXCIgfHwgJGl0ZW0gPT0gXCJ2aWV3cGFzc3dkXCJ9IHtcbiIKLSIJCQk7XG4iCi0iCQl9IGVsc2VpZiB7JG1lbnVfdmFyKCRpdGVtKSA9PSBcIlwifSB7XG4iCi0iCQkJYXBwZW5kIHRleHQgXCIkdW5zZXRfc3RyXFxuXCJcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYXBwZW5kIHRleHQgXCIkbWVudV92YXIoJGl0ZW0pXFxuXCJcbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSA9PSBcImh0dHBcIiB8fCAkaXRlbSA9PSBcImh0dHBkaXJcIiB8fCAkaXRlbSA9PSBcImh0dHBwb3J0XCJ9IHtcbiIKLSIJCQlnbG9iYWwgdm5jX3VybDtcbiIKLSIJCQlhcHBlbmQgdGV4dCBcIlxcblVSTDogJHZuY191cmxcXG5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskaXRlbSA9PSBcInN0YXJ0XCJ9IHtcbiIKLSIJCXNldCBzdHIgW2dldF9zdGFydF94MTF2bmNfdHh0XVxuIgotIgkJYXBwZW5kX3RleHQgXCIkc3RyXFxuXCJcbiIKLSIjCQlhcHBlbmQgdGV4dCBcIlxcblBvc3NpYmxlIFxcJEhPTUUvLngxMXZuY3JjIHNldHRpbmdzIGZvciB0aGlzIGNvbW1hbmQ6XFxuXFxuXCJcbiIKLSIjCQlzZXQgcmN0eHQgW2dldF9zdGFydF94MTF2bmNfY21kIDFdXG4iCi0iIwkJYXBwZW5kIHRleHQgXCIkcmN0eHRcXG5cIlxuIgotIgl9XG4iCi0iXG4iCi0iCXJlZ3N1YiAtYWxsIHsgfSAkaXRlbSBcIiBcIiBuYW1lXG4iCi0iXG4iCi0iCWlmIHskb2t9IHtcbiIKLSIJCXRleHR3aW4gJG5hbWUgXCJ4MTF2bmMgaGVscDogJGl0ZW1cIiBcIiR0ZXh0XCI7XG4iCi0iCX1cbiIKLSIJcmV0dXJuICRva1xuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHBhcnNlX2hlbHAge30ge1xuIgotIglnbG9iYWwgZW52IHgxMXZuY19wcm9nO1xuIgotIglnbG9iYWwgaGVscGFsbCBoZWxwdGV4dDtcbiIKLSJcbiIKLSIJc2V0IGhlbHBwaXBlIFtvcGVuIFwifCAkeDExdm5jX3Byb2cgLWhlbHBcIiBcInJcIl07XG4iCi0iCWlmIHskaGVscHBpcGUgPT0gXCJcIn0ge1xuIgotIgkJcHV0cyBzdGRlcnIgXCJmYWlsZWQgdG8gcnVuICR4MTF2bmNfcHJvZyAtaGVscFwiO1xuIgotIgkJZXhpdCAxO1xuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBzYXdvcHRzIDA7XG4iCi0iCXNldCBjdXJyb3B0IFwiXCI7XG4iCi0iCXdoaWxlIHtbZ2V0cyAkaGVscHBpcGUgbGluZV0gPiAtMX0ge1xuIgotIgkJYXBwZW5kIGhlbHBhbGwgXCIkbGluZVxcblwiCVxuIgotIlxuIgotIgkJIyBYWFhcbiIKLSIJCWlmIHtbcmVnZXhwIHteT3B0aW9uczp9ICRsaW5lXX0ge1xuIgotIgkJCXNldCBzYXdvcHRzIDE7XG4iCi0iCQkJY29udGludWU7XG4iCi0iCQl9XG4iCi0iCQkjIFhYWFxuIgotIgkJaWYge1tyZWdleHAge15UaGVzZSBvcHRpb25zfSAkbGluZV19IHtcbiIKLSIJCQljb250aW51ZTtcbiIKLSIJCX1cbiIKLSIJCSMgdHdlYWsgYWxpYXNlczpcbiIKLSIJCXJlZ3N1YiB7Xi16ZXJvY29uZn0gJGxpbmUgXCItemVyb19jb25mXCIgbGluZVxuIgotIgkJcmVnc3ViIHteLWF2YWhpICAgfSAkbGluZSBcIi16ZXJvY29uZlwiIGxpbmVcbiIKLSJcbiIKLSIJCWlmIHshICRzYXdvcHRzfSB7XG4iCi0iCQkJY29udGludWU7XG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCB7Xi0oWzAtOUEtel9dWzAtOUEtel9dKil9ICRsaW5lIG1hdGNoIG5hbWVdfSB7XG4iCi0iCQkJc2V0IGFsbG5hbWVzKCRuYW1lKSAxO1xuIgotIgkJCWlmIHtcIiRjdXJyb3B0XCIgIT0gXCJubyRuYW1lXCIgJiYgXCJubyRjdXJyb3B0XCIgIT0gXCIkbmFtZVwifSB7XG4iCi0iCQkJCXNldCBjdXJyb3B0ICRuYW1lO1xuIgotIgkJCQlzZXQgaGVscHRleHQoJGN1cnJvcHQpIFwiJGxpbmVcXG5cIjtcbiIKLSIJCQl9IGVsc2Uge1xuIgotIgkJCQlhcHBlbmQgaGVscHRleHQoJGN1cnJvcHQpIFwiJGxpbmVcXG5cIjtcbiIKLSIJCQl9XG4iCi0iCQl9IGVsc2VpZiB7JGN1cnJvcHQgIT0gXCJcIn0ge1xuIgotIgkJCWFwcGVuZCBoZWxwdGV4dCgkY3Vycm9wdCkgXCIkbGluZVxcblwiO1xuIgotIgkJfVxuIgotIgl9XG4iCi0iCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgYWxsbmFtZXNdIHtcbiIKLSIJCWlmIHtbcmVnZXhwIHtebm99ICRuYW1lXX0ge1xuIgotIgkJCXJlZ3N1YiB7Xm5vfSAkbmFtZSBcIlwiIHBhaXJcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IHBhaXIgXCJubyRuYW1lXCJcbiIKLSIJCX1cbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgaGVscHRleHQoJG5hbWUpXX0ge1xuIgotIgkJCWlmICFbaW5mbyBleGlzdHMgaGVscHRleHQoJHBhaXIpXSB7XG4iCi0iCQkJCXNldCBoZWxwdGV4dCgkcGFpcikgJGhlbHB0ZXh0KCRuYW1lKTtcbiIKLSIJCQl9XG4iCi0iCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRwYWlyKV19IHtcbiIKLSIJCQlpZiAhW2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRuYW1lKV0ge1xuIgotIgkJCQlzZXQgaGVscHRleHQoJG5hbWUpICRoZWxwdGV4dCgkcGFpcik7XG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCXNldF9pbnRlcm5hbF9oZWxwXG4iCi0ifVxuIgotIlxuIgotInByb2MgdHdlYWtfYm90aCB7bmV3IG9sZH0ge1xuIgotIgl0d2Vha19oZWxwICRuZXcgJG9sZFxuIgotIgl0d2Vha19yZW1vdGVfaGVscCAkbmV3ICRvbGRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB0d2Vha19yZW1vdGVfaGVscCB7bmV3IG9sZH0ge1xuIgotIglnbG9iYWwgaGVscHJlbW90ZVxuIgotIglpZiAhW2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJG5ldyldIHtcbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgaGVscHJlbW90ZSgkb2xkKV19IHtcbiIKLSIJCQlzZXQgaGVscHJlbW90ZSgkbmV3KSAkaGVscHJlbW90ZSgkb2xkKVxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgdHdlYWtfaGVscCB7bmV3IG9sZH0ge1xuIgotIglnbG9iYWwgaGVscHRleHRcbiIKLSIJaWYgIVtpbmZvIGV4aXN0cyBoZWxwdGV4dCgkbmV3KV0ge1xuIgotIgkJaWYge1tpbmZvIGV4aXN0cyBoZWxwdGV4dCgkb2xkKV19IHtcbiIKLSIJCQlzZXQgaGVscHRleHQoJG5ldykgJGhlbHB0ZXh0KCRvbGQpXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBwYXJzZV9yZW1vdGVfaGVscCB7fSB7XG4iCi0iCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0IGhlbHBfaW5kZW50IHJlbW90ZV9uYW1lO1xuIgotIlxuIgotIglzZXQgc2F3b3B0cyAwO1xuIgotIglzZXQgY3Vycm9wdCBcIlwiO1xuIgotIglzZXQgcG9zc29wdHMgXCJcIjtcbiIKLSIJc2V0IG9mZnNldCBbZXhwciAkaGVscF9pbmRlbnQgLSAxXTtcbiIKLSIJZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVscHRleHQocmVtb3RlKSBcIlxcblwiXSB7XG4iCi0iCQlcbiIKLSIJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgJG9mZnNldCBlbmRdO1xuIgotIlxuIgotIgkJIyBYWFhcbiIKLSIJCWlmIHtbcmVnZXhwIHteVGhlIGZvbGxvd2luZyAtcmVtb3RlLy1SIGNvbW1hbmRzfSAkbGluZV19IHtcbiIKLSIJCQlzZXQgc2F3b3B0cyAxO1xuIgotIgkJCWNvbnRpbnVlO1xuIgotIgkJfVxuIgotIgkJIyBYWFhcbiIKLSIJCWlmIHtbcmVnZXhwIHteVGhlIHZuY2Nvbm5lY3QuKmNvbW1hbmR9ICRsaW5lXX0ge1xuIgotIgkJCXNldCBzYXdvcHRzIDA7XG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7ISAkc2F3b3B0c30ge1xuIgotIgkJCWNvbnRpbnVlO1xuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge14oWzAtOUEtel9dWzAtOUEtel86XSopfSAkbGluZSBtYXRjaCBuYW1lXX0ge1xuIgotIgkJCXJlZ3N1YiB7Oi4qJH0gJG5hbWUgXCJcIiBwb3B0XG4iCi0iCQkJbGFwcGVuZCBwb3Nzb3B0cyAkcG9wdFxuIgotIgkJCWlmIHtcIiRjdXJyb3B0XCIgIT0gXCJubyRuYW1lXCIgJiYgXCJubyRjdXJyb3B0XCIgIT0gXCIkbmFtZVwifSB7XG4iCi0iCQkJCXNldCBjdXJyb3B0ICRuYW1lO1xuIgotIgkJCQlyZWdzdWIgezouKiR9ICRjdXJyb3B0IFwiXCIgY3Vycm9wdFxuIgotIgkJCQlzZXQgcmVtb3RlX25hbWUoJGN1cnJvcHQpICRuYW1lXG4iCi0iCQkJCXNldCBoZWxwcmVtb3RlKCRjdXJyb3B0KSBcIiRsaW5lXFxuXCI7XG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJYXBwZW5kIGhlbHByZW1vdGUoJGN1cnJvcHQpIFwiJGxpbmVcXG5cIjtcbiIKLSIJCQl9XG4iCi0iCQl9IGVsc2VpZiB7JGN1cnJvcHQgIT0gXCJcIn0ge1xuIgotIgkJCWFwcGVuZCBoZWxwcmVtb3RlKCRjdXJyb3B0KSBcIiRsaW5lXFxuXCI7XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJZm9yZWFjaCBwb3B0ICRwb3Nzb3B0cyB7XG4iCi0iCQlpZiB7W2luZm8gZXhpc3RzIGhlbHByZW1vdGUoJHBvcHQpXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCB7Xm5vfSAkcG9wdF19IHtcbiIKLSIJCQlyZWdzdWIge15ub30gJHBvcHQgXCJcIiB0cnlcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IHRyeSBcIm5vJHBvcHRcIlxuIgotIgkJfVxuIgotIgkJaWYge1tpbmZvIGV4aXN0cyBoZWxwcmVtb3RlKCR0cnkpXX0ge1xuIgotIgkJCXNldCBoZWxwcmVtb3RlKCRwb3B0KSAkaGVscHJlbW90ZSgkdHJ5KVxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgcGFyc2VfcXVlcnlfaGVscCB7fSB7XG4iCi0iCWdsb2JhbCBxdWVyeV9hbnMgcXVlcnlfYXJvIHF1ZXJ5X2Fuc19saXN0IHF1ZXJ5X2Fyb19saXN0IGhlbHB0ZXh0O1xuIgotIlxuIgotIglzZXQgc2F3YW5zIDA7XG4iCi0iCXNldCBzYXdhcm8gMDtcbiIKLSIJc2V0IGFuc19zdHIgXCJcIlxuIgotIglzZXQgYXJvX3N0ciBcIlwiXG4iCi0iXG4iCi0iCWZvcmVhY2ggbGluZSBbc3BsaXQgJGhlbHB0ZXh0KHF1ZXJ5KSBcIlxcblwiXSB7XG4iCi0iXG4iCi0iCQlpZiB7ISAkc2F3YW5zICYmIFtyZWdleHAge14gKmFucz19ICRsaW5lXX0ge1xuIgotIgkJCXNldCBzYXdhbnMgMVxuIgotIgkJfVxuIgotIgkJaWYgeyEgJHNhd2Fuc30ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7W3JlZ2V4cCB7XiAqYXJvPX0gJGxpbmVdfSB7XG4iCi0iCQkJc2V0IHNhd2FybyAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7JHNhd2FybyAmJiBbcmVnZXhwIHteWyAJXSokfSAkbGluZV19IHtcbiIKLSIJCQlzZXQgc2F3YW5zIDBcbiIKLSIJCQlicmVha1xuIgotIgkJfVxuIgotIlxuIgotIgkJcmVnc3ViIHthbnM9fSAkbGluZSBcIlwiIGxpbmVcbiIKLSIJCXJlZ3N1YiB7YXJvPX0gJGxpbmUgXCJcIiBsaW5lXG4iCi0iCQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdXG4iCi0iXG4iCi0iCQlpZiB7JHNhd2Fyb30ge1xuIgotIgkJCXNldCBhcm9fc3RyIFwiJGFyb19zdHIgJGxpbmVcIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgYW5zX3N0ciBcIiRhbnNfc3RyICRsaW5lXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIglyZWdzdWIgLWFsbCB7ICAqfSAkYW5zX3N0ciBcIiBcIiBhbnNfc3RyXG4iCi0iCXJlZ3N1YiAtYWxsIHsgICp9ICRhcm9fc3RyIFwiIFwiIGFyb19zdHJcbiIKLSJcbiIKLSIJc2V0IGFuc19zdHIgW3N0cmluZyB0cmltICRhbnNfc3RyXVxuIgotIglzZXQgYXJvX3N0ciBbc3RyaW5nIHRyaW0gJGFyb19zdHJdXG4iCi0iCXNldCBxdWVyeV9hbnNfbGlzdCBbc3BsaXQgJGFuc19zdHJdXG4iCi0iCXNldCBxdWVyeV9hcm9fbGlzdCBbc3BsaXQgJGFyb19zdHJdXG4iCi0iXG4iCi0iCWZvcmVhY2ggaXRlbSAkcXVlcnlfYW5zX2xpc3Qge1xuIgotIgkJaWYge1tyZWdleHAge15bIAldKiR9ICRpdGVtXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlzZXQgcXVlcnlfYW5zKCRpdGVtKSAxXG4iCi0iCX1cbiIKLSIJZm9yZWFjaCBpdGVtICRxdWVyeV9hcm9fbGlzdCB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XlsgCV0qJH0gJGl0ZW1dfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCXNldCBxdWVyeV9hcm8oJGl0ZW0pIDFcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGluX2RlYnVnX21vZGUge30ge1xuIgotIglnbG9iYWwgbWVudV92YXJcbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIoZGVidWdfZ3VpKV19IHtcbiIKLSIJCXJldHVybiAwXG4iCi0iCX1cbiIKLSIJcmV0dXJuICRtZW51X3ZhcihkZWJ1Z19ndWkpXG4iCi0ifVxuIgotIlxuIgotIiMgTWVudWJhciB1dGlsaXRpZXM6XG4iCi0icHJvYyBtZW51c19zdGF0ZSB7c3RhdGV9IHtcbiIKLSIJZ2xvYmFsIG1lbnVfYlxuIgotIlxuIgotIglmb3JlYWNoIGNhc2UgW2FycmF5IG5hbWVzIG1lbnVfYl0ge1xuIgotIgkJc2V0IG1lbnVfYnV0dG9uICRtZW51X2IoJGNhc2UpXG4iCi0iCQlpZiB7IVt3aW5mbyBleGlzdHMgJG1lbnVfYnV0dG9uXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQkkbWVudV9idXR0b24gY29uZmlndXJlIC1zdGF0ZSAkc3RhdGVcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG1lbnVzX2VuYWJsZSB7fSB7XG4iCi0iCWdsb2JhbCBtZW51c19kaXNhYmxlZFxuIgotIlxuIgotIgltZW51c19zdGF0ZSBcIm5vcm1hbFwiXG4iCi0iCXNldCBtZW51c19kaXNhYmxlZCAwXG4iCi0ifVxuIgotIlxuIgotInByb2MgbWVudXNfZGlzYWJsZSB7fSB7XG4iCi0iCWdsb2JhbCBtZW51c19kaXNhYmxlZFxuIgotIlxuIgotIglzZXQgbWVudXNfZGlzYWJsZWQgMVxuIgotIgltZW51c19zdGF0ZSBcImRpc2FibGVkXCJcbiIKLSJ9XG4iCi0iXG4iCi0iIyBFbnRyeSBib3ggdXRpbGl0aWVzOlxuIgotInByb2MgZW50cnlfc3RhdGUge3ggc3RhdGV9IHtcbiIKLSIJZ2xvYmFsIGVudHJ5X2JveCBlbnRyeV9sYWJlbCBlbnRyeV9vayBlbnRyeV9oZWxwIGVudHJ5X3NraXAgZW50cnlfYnJvd3NlXG4iCi0iCWdsb2JhbCBvbGRfbGFiZWxzXG4iCi0iCWlmIHskeCA9PSBcImFsbFwifSB7XG4iCi0iCQlpZiB7ISRvbGRfbGFiZWxzfSB7XG4iCi0iCQkJJGVudHJ5X2xhYmVsIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCQl9XG4iCi0iCQkkZW50cnlfYm94ICAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCQkkZW50cnlfb2sgICAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCQkkZW50cnlfc2tpcCAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCQkkZW50cnlfaGVscCAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCQkkZW50cnlfYnJvd3NlIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCX0gZWxzZWlmIHskeCA9PSBcImxhYmVsXCJ9IHtcbiIKLSIJCWlmIHshJG9sZF9sYWJlbHN9IHtcbiIKLSIJCQkkZW50cnlfbGFiZWwgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGVcbiIKLSIJCX1cbiIKLSIJfSBlbHNlaWYgeyR4ID09IFwiYm94XCJ9IHtcbiIKLSIJCSRlbnRyeV9ib3ggICAgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGVcbiIKLSIJfSBlbHNlaWYgeyR4ID09IFwib2tcIn0ge1xuIgotIgkJJGVudHJ5X29rICAgICBjb25maWd1cmUgLXN0YXRlICRzdGF0ZVxuIgotIgl9IGVsc2VpZiB7JHggPT0gXCJza2lwXCJ9IHtcbiIKLSIJCSRlbnRyeV9za2lwICAgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGVcbiIKLSIJfSBlbHNlaWYgeyR4ID09IFwiaGVscFwifSB7XG4iCi0iCQkkZW50cnlfaGVscCAgIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCX0gZWxzZWlmIHskeCA9PSBcImJyb3dzZVwifSB7XG4iCi0iCQkkZW50cnlfYnJvd3NlIGNvbmZpZ3VyZSAtc3RhdGUgJHN0YXRlXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBlbnRyeV9lbmFibGUge3t4IFwiYWxsXCJ9fSB7XG4iCi0iCWVudHJ5X3N0YXRlICR4IG5vcm1hbFxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGVudHJ5X2Rpc2FibGUge3t4IFwiYWxsXCJ9fSB7XG4iCi0iCWVudHJ5X3N0YXRlICR4IGRpc2FibGVkXG4iCi0ifVxuIgotIlxuIgotInByb2MgZW50cnlfYnJvd3NlX2J1dHRvbiB7e3Nob3cgMX19IHtcbiIKLSIJZ2xvYmFsIGVudHJ5X2Jyb3dzZVxuIgotIglpZiB7JHNob3d9IHtcbiIKLSIJCXBhY2sgJGVudHJ5X2Jyb3dzZSAtc2lkZSBsZWZ0XG4iCi0iCX0gIGVsc2Uge1xuIgotIgkJcGFjayBmb3JnZXQgJGVudHJ5X2Jyb3dzZVxuIgotIgl9XG4iCi0ifVxuIgotInByb2MgZW50cnlfZm9jdXMge30ge1xuIgotIglnbG9iYWwgZW50cnlfYm94XG4iCi0iCWZvY3VzICRlbnRyeV9ib3hcbiIKLSJ9XG4iCi0icHJvYyBlbnRyeV9zZWxlY3Qge30ge1xuIgotIglnbG9iYWwgZW50cnlfYm94XG4iCi0iCSRlbnRyeV9ib3ggc2VsZWN0aW9uIHJhbmdlIDAgZW5kXG4iCi0ifVxuIgotInByb2MgZW50cnlfZ2V0IHt9IHtcbiIKLSIJZ2xvYmFsIGVudHJ5X2JveFxuIgotIglyZXR1cm4gWyRlbnRyeV9ib3ggZ2V0XVxuIgotIn1cbiIKLSJwcm9jIGVudHJ5X2luc2VydCB7c3RyfSB7XG4iCi0iCWdsb2JhbCBlbnRyeV9ib3hcbiIKLSIJZW50cnlfZGVsZXRlXG4iCi0iCSRlbnRyeV9ib3ggaW5zZXJ0IGVuZCAkc3RyXG4iCi0iCSRlbnRyeV9ib3ggaWN1cnNvciBlbmRcbiIKLSJ9XG4iCi0icHJvYyBlbnRyeV9kZWxldGUge30ge1xuIgotIglnbG9iYWwgZW50cnlfYm94XG4iCi0iCSRlbnRyeV9ib3ggZGVsZXRlIDAgZW5kXG4iCi0ifVxuIgotIlxuIgotIlxuIgotIiMgVXRpbGl0aWVzIGZvciByZW1vdGUgY29udHJvbCBhbmQgdXBkYXRpbmcgdmFycy5cbiIKLSJcbiIKLSJwcm9jIHB1c2hfbmV3X3ZhbHVlIHtpdGVtIG5hbWUgbmV3IHtxdWVyeSAxfX0ge1xuIgotIglnbG9iYWwgbWVudV92YXIgYWx3YXlzX3VwZGF0ZSByZW1vdGVfb3V0cHV0IHF1ZXJ5X291dHB1dFxuIgotIglnbG9iYWwgcXVlcnlfcmVzdWx0X2xpc3RcbiIKLSJcbiIKLSIJc2V0IGRlYnVnIFtpbl9kZWJ1Z19tb2RlXVxuIgotIlxuIgotIglzZXQgZ2V0b3V0IDBcbiIKLSIJc2V0IHByaW50X2dldG91dCAwO1xuIgotIlxuIgotIglzZXQgZG9fcXVlcnlfYWxsIDBcbiIKLSJcbiIKLSIJc2V0IG5ld25ldyBcIlwiXG4iCi0iCWlmIHskaXRlbSA9PSBcImRpc2Nvbm5lY3RcIn0ge1xuIgotIgkJc2V0IG5ld25ldyBcIk4vQVwiXG4iCi0iCQlzZXQgZG9fcXVlcnlfYWxsIDFcbiIKLSIJfSBlbHNlaWYgeyRhbHdheXNfdXBkYXRlfSB7XG4iCi0iCQlzZXQgZG9fcXVlcnlfYWxsIDFcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JGl0ZW0gPT0gXCJyZW1vdGUtY21kXCJ9IHtcbiIKLSIJCSMga2x1ZGdlIGZvciBhcmJpdHJhcnkgcmVtb3RlIGNvbW1hbmQ6XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XlE6fSAkbmV3XX0ge1xuIgotIgkJCSMgZXh0cmEga2x1ZGdlIGZvciBROnZhciB0byBtZWFuIC1RIHZhclxuIgotIgkJCXJlZ3N1YiB7XlE6fSAkbmV3IFwiXCIgbmV3XG4iCi0iCQkJc2V0IHFvbmx5IDFcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IHFvbmx5IDBcbiIKLSIJCX1cbiIKLSIJCSMgbmVlZCB0byBleHRyYWN0IGl0ZW0gZnJvbSBuZXc6XG4iCi0iCQlzZXQgcXRtcCAkbmV3XG4iCi0iCQlyZWdzdWIgezouKiR9ICRxdG1wIFwiXCIgcXRtcFxuIgotIgkJaWYgeyRxb25seX0ge1xuIgotIgkJCXNldCByYXJncyBbbGlzdCBcIi1RXCIgXCIkcXRtcFwiXVxuIgotIgkJCXNldCBwcmludF9nZXRvdXQgMVxuIgotIgkJCXNldCBxYXJncyBcIlwiXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCByYXJncyBbbGlzdCBcIi1SXCIgXCIkbmV3XCJdXG4iCi0iCQkJc2V0IHFhcmdzIFwiXCJcbiIKLSIJCX1cbiIKLSIJCXNldCBnZXRvdXQgMVxuIgotIlxuIgotIgl9IGVsc2VpZiB7W3ZhbHVlX2lzX3N0cmluZyAkaXRlbV19IHtcbiIKLSIJCSMgc3RyaW5nIHZhcjpcbiIKLSIJCXNldCByYXJncyBbbGlzdCBcIi1SXCIgXCIkbmFtZTokbmV3XCJdXG4iCi0iCQlzZXQgcWFyZ3MgW2xpc3QgXCItUVwiIFwiJG5hbWVcIl1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCSMgYm9vbGVhbiB2YXI6XG4iCi0iCQlzZXQgcmFyZ3MgW2xpc3QgXCItUlwiIFwiJG5hbWVcIl1cbiIKLSIJCXNldCBxYXJncyBbbGlzdCBcIi1RXCIgXCIkbmFtZVwiXVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHshICRxdWVyeSAmJiAhICRhbHdheXNfdXBkYXRlfSB7XG4iCi0iCQlzZXQgZ2V0b3V0IDFcbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwibm9yZW1vdGVcIn0ge1xuIgotIgkJc2V0IGdldG91dCAxXG4iCi0iCX0gZWxzZWlmIHtbaXNfYWN0aW9uICRpdGVtXSAmJiAhW29wdF9tYXRjaCBRICRpdGVtXSAmJiAkcmFyZ3MgIT0gXCJcIn0ge1xuIgotIgkJc2V0IGdldG91dCAxXG4iCi0iCX0gZWxzZWlmIHtbcmVnZXhwIHteKHNpZHxpZCkkfSAkaXRlbV0gJiYgIVtyZWdleHAge14weH0gJG5ld119IHtcbiIKLSIJCXNldCBnZXRvdXQgMVxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCByZW1vdGVfb3V0cHV0IFwiXCJcbiIKLSIJc2V0IHF1ZXJ5X291dHB1dCBcIlwiXG4iCi0iXG4iCi0iCWlmIHshJGRlYnVnfSB7XG4iCi0iCQlpZiBbcmVnZXhwIHtwYXNzd2R9ICRyYXJnc10ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwieDExdm5jIC4uLlwiXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwieDExdm5jICRyYXJncyAuLi5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskZ2V0b3V0fSB7XG4iCi0iCQlzZXQgcmVtb3RlX291dHB1dCBbcnVuX3JlbW90ZV9jbWQgJHJhcmdzXVxuIgotIgkJaWYgeyRwcmludF9nZXRvdXR9IHtcbiIKLSIJCQlhcHBlbmRfdGV4dCBcIlxcdCRyZW1vdGVfb3V0cHV0XCJcbiIKLSIJCX1cbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFxuXCJcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskZG9fcXVlcnlfYWxsfSB7XG4iCi0iCQlzZXQgYWxsIFthbGxfcXVlcnlfdmFyc11cbiIKLSIJCXNldCBxYXJncyBbbGlzdCBcIi1RXCIgJGFsbF1cbiIKLSJcbiIKLSIJCWdsb2JhbCBsYXN0X3F1ZXJ5X2FsbF90aW1lXG4iCi0iCQlzZXQgbGFzdF9xdWVyeV9hbGxfdGltZSBbY2xvY2sgc2Vjb25kc11cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgcnFhcmdzIFtjb25jYXQgJHJhcmdzICRxYXJnc11cbiIKLSJcbiIKLSIJc2V0IHF1ZXJ5IFtydW5fcmVtb3RlX2NtZCAkcnFhcmdzXVxuIgotIglzZXQgcXVlcnlfb3V0cHV0ICRxdWVyeVxuIgotIlxuIgotIglzZXQgcXVlcnlfcmVzdWx0X2xpc3QgXCJcIlxuIgotIlxuIgotIglpZiB7JG5ld25ldyAhPSBcIlwifSB7XG4iCi0iCQlzZXQgbmV3ICRuZXduZXdcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7IVtzZWVfaWZfb2sgJHF1ZXJ5ICRpdGVtIFwiJG5hbWU6JG5ld1wiXX0ge1xuIgotIgkJIyBmYWlsZWRcbiIKLSIJCWlmICB7W3JlZ2V4cCB7XmEuLj19ICRxdWVyeV19IHtcbiIKLSIJCQkjIGJ1dCBzb21lIHJlc3VsdCBjYW1lIGJhY2tcbiIKLSIJCQkjIHN5bmNocm9uaXplIGV2ZXJ5dGhpbmcgd2l0aCBhIDJuZCBjYWxsLlxuIgotIgkJCXNldCBxdWVyeV9vdXRwdXQgW3F1ZXJ5X2FsbCAxXVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQkjIHNlcnZlciBtYXkgYmUgZGVhZFxuIgotIgkJCWlmIHskaXRlbSAhPSBcInBpbmdcIiAmJiAkaXRlbSAhPSBcImF0dGFjaFwifSB7XG4iCi0iCQkJCXRyeV9jb25uZWN0XG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9IGVsc2Uge1xuIgotIgkJIyBzdWNjZWVkZWRcbiIKLSIJCSMgc3luY2hyb25pemUgdGhpcyB2YXJpYWJsZSAob3IgdmFyaWFibGVzKVxuIgotIgkJIyBmb3IgYSBzcGVlZHVwIHVzZWQgdGhlIGxpc3QgcGFyc2VkIGJ5IHNlZV9pZl9vay5cbiIKLSIJCXVwZGF0ZV9tZW51X3ZhcnMgXCJVU0VfTElTVFwiXG4iCi0iXG4iCi0iCQlpZiB7JGRvX3F1ZXJ5X2FsbH0ge1xuIgotIgkJCWdsb2JhbCBhbGxfc2V0dGluZ3NcbiIKLSIJCQlzZXQgYWxsX3NldHRpbmdzICRxdWVyeVxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0X2ttYmNfc3RyIHt9IHtcbiIKLSIJZ2xvYmFsIHZsX2JrIHZsX2JtIHZsX2JiIHZsX2JjIHZsX2JmIHZyX2JrIHZyX2JtIHZyX2JiIHZyX2JjIHZyX2JmXG4iCi0iXG4iCi0iCXNldCBzdHIgXCJcIlxuIgotIglpZiB7JHZsX2JrfSB7XG4iCi0iCQlhcHBlbmQgc3RyIFwiS1wiXG4iCi0iCX1cbiIKLSIJaWYgeyR2bF9ibX0ge1xuIgotIgkJYXBwZW5kIHN0ciBcIk1cIlxuIgotIgl9XG4iCi0iCWlmIHskdmxfYmJ9IHtcbiIKLSIJCWFwcGVuZCBzdHIgXCJCXCJcbiIKLSIJfVxuIgotIglpZiB7JHZsX2JjfSB7XG4iCi0iCQlhcHBlbmQgc3RyIFwiQ1wiXG4iCi0iCX1cbiIKLSIJaWYgeyR2bF9iZn0ge1xuIgotIgkJYXBwZW5kIHN0ciBcIkZcIlxuIgotIgl9XG4iCi0iCWlmIHskdnJfYmsgfHwgJHZyX2JtIHx8ICR2cl9iYiB8fCAkdnJfYmMgfHwgJHZyX2JmfSB7XG4iCi0iCQlhcHBlbmQgc3RyIFwiLFwiXG4iCi0iCX1cbiIKLSIJaWYgeyR2cl9ia30ge1xuIgotIgkJYXBwZW5kIHN0ciBcIktcIlxuIgotIgl9XG4iCi0iCWlmIHskdnJfYm19IHtcbiIKLSIJCWFwcGVuZCBzdHIgXCJNXCJcbiIKLSIJfVxuIgotIglpZiB7JHZyX2JifSB7XG4iCi0iCQlhcHBlbmQgc3RyIFwiQlwiXG4iCi0iCX1cbiIKLSIJaWYgeyR2cl9iY30ge1xuIgotIgkJYXBwZW5kIHN0ciBcIkNcIlxuIgotIgl9XG4iCi0iCWlmIHskdnJfYmZ9IHtcbiIKLSIJCWFwcGVuZCBzdHIgXCJGXCJcbiIKLSIJfVxuIgotIgllbnRyeV9pbnNlcnQgJHN0clxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGluc2VydF9pbnB1dF93aW5kb3cge30ge1xuIgotIglnbG9iYWwgdGV4dF9hcmVhIGNsZWFudXBfd2luZG93XG4iCi0iCWdsb2JhbCBmZm9udCBtZW51X3ZhclxuIgotIglnbG9iYWwgdmxfYmsgdmxfYm0gdmxfYmIgdmxfYmMgdmxfYmYgdnJfYmsgdnJfYm0gdnJfYmIgdnJfYmMgdnJfYmZcbiIKLSJcbiIKLSIJYXBwZW5kX3RleHQgXCJcXG5Vc2UgdGhlc2UgY2hlY2tib3hlcyB0byBzZXQgdGhlIGlucHV0IHBlcm1pc3Npb25zLCBcIlxuIgotIglhcHBlbmRfdGV4dCBcIm9yIHR5cGUgaW4gdGhlIFxcXCJLTUJDRi4uLlxcXCJcXG5cIlxuIgotIglhcHBlbmRfdGV4dCBcIi1pbnB1dCBzdHJpbmcgbWFudWFsbHkuICBUaGVuIHByZXNzIFxcXCJPS1xcXCIgb3IgXFxcIkNhbmNlbFxcXCIuXFxuXCJcbiIKLSIJYXBwZW5kX3RleHQgXCIobm90ZTogYW4gZW1wdHkgc2V0dGluZyBtZWFucyB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIFwiXG4iCi0iCWFwcGVuZF90ZXh0IFwic2VlIHZpZXdvbmx5KVxcblxcblwiXG4iCi0iCXNldCB3IFwiJHRleHRfYXJlYS53a19mXCJcbiIKLSIJY2F0Y2gge2Rlc3Ryb3kgJHd9XG4iCi0iCWZyYW1lICR3IC1iZCAxIC1yZWxpZWYgcmlkZ2UgLWN1cnNvciB7dG9wX2xlZnRfYXJyb3d9XG4iCi0iCXNldCBmbCAkdy5mbFxuIgotIglmcmFtZSAkZmxcbiIKLSIJc2V0IGZyICR3LmZyXG4iCi0iCWZyYW1lICRmclxuIgotIglsYWJlbCAkZmwubCAtZm9udCAkZmZvbnQgLXRleHQgXCJOb3JtYWwgY2xpZW50czogICBcIlxuIgotIgljaGVja2J1dHRvbiAkZmwuYmsgLXBhZHkgMSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2bF9iayBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJLZXlzdHJva2VzXCIgXG4iCi0iCWNoZWNrYnV0dG9uICRmbC5ibSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2bF9ibSBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJNb3VzZS1Nb3Rpb25cIiBcbiIKLSIJY2hlY2tidXR0b24gJGZsLmJiIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIHZsX2JiIFxcXG4iCi0iCQktcGFkeSAxIC1jb21tYW5kIHNldF9rbWJjX3N0ciAtdGV4dCBcIkJ1dHRvbi1DbGlja1wiXG4iCi0iCWNoZWNrYnV0dG9uICRmbC5iYyAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2bF9iYyBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJDbGlwYm9hcmQtSW5wdXRcIlxuIgotIgljaGVja2J1dHRvbiAkZmwuYmYgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgdmxfYmYgXFxcbiIKLSIJCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0IFwiRmlsZXNcIlxuIgotIglsYWJlbCAkZnIubCAtcGFkeSAxIC1mb250ICRmZm9udCAtdGV4dCBcIlZpZXctT25seSBjbGllbnRzOlwiXG4iCi0iCWNoZWNrYnV0dG9uICRmci5iayAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2cl9iayBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJLZXlzdHJva2VzXCIgXG4iCi0iCWNoZWNrYnV0dG9uICRmci5ibSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2cl9ibSBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJNb3VzZS1Nb3Rpb25cIiBcbiIKLSIJY2hlY2tidXR0b24gJGZyLmJiIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIHZyX2JiIFxcXG4iCi0iCQktcGFkeSAxIC1jb21tYW5kIHNldF9rbWJjX3N0ciAtdGV4dCBcIkJ1dHRvbi1DbGlja1wiXG4iCi0iCWNoZWNrYnV0dG9uICRmci5iYyAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSB2cl9iYyBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBzZXRfa21iY19zdHIgLXRleHQgXCJDbGlwYm9hcmQtSW5wdXRcIlxuIgotIgljaGVja2J1dHRvbiAkZnIuYmYgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgdnJfYmYgXFxcbiIKLSIJCS1wYWR5IDEgLWNvbW1hbmQgc2V0X2ttYmNfc3RyIC10ZXh0IFwiRmlsZXNcIlxuIgotIlxuIgotIglpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKGlucHV0KV19IHtcbiIKLSIJCXNldCBpbnB1dF9zdHIgJG1lbnVfdmFyKGlucHV0KVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGlucHV0X3N0ciBcIlwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYge1tyZWdleHAgeyguKiksKC4qKX0gJGlucHV0X3N0ciBtYXRjaCBub3JtYWwgdmlld29ubHldfSB7XG4iCi0iCQk7XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgbm9ybWFsICRpbnB1dF9zdHJcbiIKLSIJCXNldCB2aWV3b25seSBcIlwiXG4iCi0iCX1cbiIKLSIJc2V0IHZsX2JrIDBcbiIKLSIJc2V0IHZsX2JtIDBcbiIKLSIJc2V0IHZsX2JiIDBcbiIKLSIJc2V0IHZsX2JjIDBcbiIKLSIJc2V0IHZsX2JmIDBcbiIKLSJcbiIKLSIJc2V0IHZyX2JrIDBcbiIKLSIJc2V0IHZyX2JtIDBcbiIKLSIJc2V0IHZyX2JiIDBcbiIKLSIJc2V0IHZyX2JjIDBcbiIKLSIJc2V0IHZyX2JmIDBcbiIKLSJcbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7S30gJG5vcm1hbF19IHtcbiIKLSIJCXNldCB2bF9iayAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7TX0gJG5vcm1hbF19IHtcbiIKLSIJCXNldCB2bF9ibSAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7Qn0gJG5vcm1hbF19IHtcbiIKLSIJCXNldCB2bF9iYiAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7Q30gJG5vcm1hbF19IHtcbiIKLSIJCXNldCB2bF9iYyAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7Rn0gJG5vcm1hbF19IHtcbiIKLSIJCXNldCB2bF9iZiAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7S30gJHZpZXdvbmx5XX0ge1xuIgotIgkJc2V0IHZyX2JrIDFcbiIKLSIJfVxuIgotIglpZiB7W3JlZ2V4cCAtbm9jYXNlIHtNfSAkdmlld29ubHldfSB7XG4iCi0iCQlzZXQgdnJfYm0gMVxuIgotIgl9XG4iCi0iCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0J9ICR2aWV3b25seV19IHtcbiIKLSIJCXNldCB2cl9iYiAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7Q30gJHZpZXdvbmx5XX0ge1xuIgotIgkJc2V0IHZyX2JjIDFcbiIKLSIJfVxuIgotIglpZiB7W3JlZ2V4cCAtbm9jYXNlIHtGfSAkdmlld29ubHldfSB7XG4iCi0iCQlzZXQgdnJfYmYgMVxuIgotIgl9XG4iCi0iXG4iCi0iCXBhY2sgJGZsLmwgJGZsLmJrICRmbC5ibSAkZmwuYmIgJGZsLmJjICRmbC5iZiAtc2lkZSB0b3AgLWZpbGwgeFxuIgotIglwYWNrICRmci5sICRmci5iayAkZnIuYm0gJGZyLmJiICRmci5iYyAkZnIuYmYgLXNpZGUgdG9wIC1maWxsIHhcbiIKLSIJcGFjayAkZmwgJGZyIC1zaWRlIGxlZnRcbiIKLSIJdXBkYXRlXG4iCi0iCXVwZGF0ZSBpZGxldGFza3NcbiIKLSIJJHRleHRfYXJlYSB3aW5kb3cgY3JlYXRlIGVuZCAtd2luZG93ICR3XG4iCi0iCSR0ZXh0X2FyZWEgc2VlIGVuZFxuIgotIgkkdGV4dF9hcmVhIGluc2VydCBlbmQgXCJcXG5cIlxuIgotIiMJJHRleHRfYXJlYSBpbnNlcnQgZW5kIFwiXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXCJcbiIKLSJcbiIKLSIJc2V0IGNsZWFudXBfd2luZG93ICR3XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0X2NhX3N0ciB7d30ge1xuIgotIglnbG9iYWwgY2FfYmsgY2FfYm0gY2FfYmIgY2FfYmMgY2FfYmYgY2FfZGlcbiIKLSJcbiIKLSIJaWYgeyRjYV9kaX0ge1xuIgotIgkJZW50cnlfaW5zZXJ0IFwiZGlzY29ubmVjdFwiXG4iCi0iCQkkdy5iayBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQkkdy5ibSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQkkdy5iYiBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQkkdy5iYyBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQkkdy5iZiBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIgkkdy5iayBjb25maWd1cmUgLXN0YXRlIG5vcm1hbFxuIgotIgkkdy5ibSBjb25maWd1cmUgLXN0YXRlIG5vcm1hbFxuIgotIgkkdy5iYiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbFxuIgotIgkkdy5iYyBjb25maWd1cmUgLXN0YXRlIG5vcm1hbFxuIgotIgkkdy5iZiBjb25maWd1cmUgLXN0YXRlIG5vcm1hbFxuIgotIlxuIgotIglzZXQgc3RyIFwiXCJcbiIKLSIJaWYgeyRjYV9ia30ge1xuIgotIgkJYXBwZW5kIHN0ciBcIktcIlxuIgotIgl9XG4iCi0iCWlmIHskY2FfYm19IHtcbiIKLSIJCWFwcGVuZCBzdHIgXCJNXCJcbiIKLSIJfVxuIgotIglpZiB7JGNhX2JifSB7XG4iCi0iCQlhcHBlbmQgc3RyIFwiQlwiXG4iCi0iCX1cbiIKLSIJaWYgeyRjYV9iY30ge1xuIgotIgkJYXBwZW5kIHN0ciBcIkNcIlxuIgotIgl9XG4iCi0iCWlmIHskY2FfYmZ9IHtcbiIKLSIJCWFwcGVuZCBzdHIgXCJGXCJcbiIKLSIJfVxuIgotIgllbnRyeV9pbnNlcnQgJHN0clxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGluc2VydF9jbGllbnRfYWN0aW9uX3dpbmRvdyB7aW5wdXR9IHtcbiIKLSIJZ2xvYmFsIHRleHRfYXJlYSBjbGVhbnVwX3dpbmRvd1xuIgotIglnbG9iYWwgZmZvbnQgbWVudV92YXJcbiIKLSIJZ2xvYmFsIGNhX2JrIGNhX2JtIGNhX2JiIGNhX2JjIGNhX2JmIGNhX2RpXG4iCi0iXG4iCi0iCWFwcGVuZF90ZXh0IFwiXFxuVXNlIHRoZXNlIGNoZWNrYm94ZXMgdG8gc2V0IHRoZSBpbnB1dCBwZXJtaXNzaW9ucyBcIlxuIgotIglhcHBlbmRfdGV4dCBcImZvciB0aGlzIGNsaWVudFxcbi1PUi0gd2hldGhlciB0byBkaXNjb25uZWN0IGl0IGluc3RlYWQuICBcIlxuIgotIglhcHBlbmRfdGV4dCBcIlRoZW4gcHJlc3MgXFxcIk9LXFxcIiBvciBcXFwiQ2FuY2VsXFxcIi5cXG5cXG5cIlxuIgotIglzZXQgdyBcIiR0ZXh0X2FyZWEuY2FfZlwiXG4iCi0iCWNhdGNoIHtkZXN0cm95ICR3fVxuIgotIglmcmFtZSAkdyAtYmQgMSAtcmVsaWVmIHJpZGdlIC1jdXJzb3Ige3RvcF9sZWZ0X2Fycm93fVxuIgotIgljaGVja2J1dHRvbiAkdy5kaSAtcGFkeSAxIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIGNhX2RpIFxcXG4iCi0iCQktcGFkeSAxIC1jb21tYW5kIFwic2V0X2NhX3N0ciAkd1wiIC10ZXh0IFwiRGlzY29ubmVjdCAgXCIgXG4iCi0iCWNoZWNrYnV0dG9uICR3LmJrIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIGNhX2JrIFxcXG4iCi0iCQktcGFkeSAxIC1jb21tYW5kIFwic2V0X2NhX3N0ciAkd1wiIC10ZXh0IFwiS2V5c3Ryb2tlc1wiIFxuIgotIgljaGVja2J1dHRvbiAkdy5ibSAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSBjYV9ibSBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBcInNldF9jYV9zdHIgJHdcIiAtdGV4dCBcIk1vdXNlLU1vdGlvblwiIFxuIgotIgljaGVja2J1dHRvbiAkdy5iYiAtZm9udCAkZmZvbnQgLWFuY2hvciB3IC12YXJpYWJsZSBjYV9iYiBcXFxuIgotIgkJLXBhZHkgMSAtY29tbWFuZCBcInNldF9jYV9zdHIgJHdcIiAtdGV4dCBcIkJ1dHRvbi1DbGlja1wiXG4iCi0iCWNoZWNrYnV0dG9uICR3LmJjIC1mb250ICRmZm9udCAtYW5jaG9yIHcgLXZhcmlhYmxlIGNhX2JjIFxcXG4iCi0iCQktcGFkeSAxIC1jb21tYW5kIFwic2V0X2NhX3N0ciAkd1wiIC10ZXh0IFwiQ2xpcGJvYXJkXCJcbiIKLSIJY2hlY2tidXR0b24gJHcuYmYgLWZvbnQgJGZmb250IC1hbmNob3IgdyAtdmFyaWFibGUgY2FfYmYgXFxcbiIKLSIJCS1wYWR5IDEgLWNvbW1hbmQgXCJzZXRfY2Ffc3RyICR3XCIgLXRleHQgXCJGaWxlc1wiXG4iCi0iXG4iCi0iCXNldCBjYV9kaSAwXG4iCi0iCXNldCBjYV9iayAwXG4iCi0iCXNldCBjYV9ibSAwXG4iCi0iCXNldCBjYV9iYiAwXG4iCi0iCXNldCBjYV9iZiAwXG4iCi0iCXNldCBjYV9iYyAwXG4iCi0iXG4iCi0iCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0t9ICRpbnB1dF19IHtcbiIKLSIJCXNldCBjYV9iayAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7TX0gJGlucHV0XX0ge1xuIgotIgkJc2V0IGNhX2JtIDFcbiIKLSIJfVxuIgotIglpZiB7W3JlZ2V4cCAtbm9jYXNlIHtCfSAkaW5wdXRdfSB7XG4iCi0iCQlzZXQgY2FfYmIgMVxuIgotIgl9XG4iCi0iCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0N9ICRpbnB1dF19IHtcbiIKLSIJCXNldCBjYV9iYyAxXG4iCi0iCX1cbiIKLSIJaWYge1tyZWdleHAgLW5vY2FzZSB7Rn0gJGlucHV0XX0ge1xuIgotIgkJc2V0IGNhX2JmIDFcbiIKLSIJfVxuIgotIlxuIgotIglwYWNrICR3LmRpICR3LmJrICR3LmJtICR3LmJiICR3LmJjICR3LmJmIC1zaWRlIGxlZnRcbiIKLSIJdXBkYXRlXG4iCi0iCXVwZGF0ZSBpZGxldGFza3NcbiIKLSIJJHRleHRfYXJlYSB3aW5kb3cgY3JlYXRlIGVuZCAtd2luZG93ICR3XG4iCi0iCSR0ZXh0X2FyZWEgc2VlIGVuZFxuIgotIgkkdGV4dF9hcmVhIGluc2VydCBlbmQgXCJcXG5cIlxuIgotIlxuIgotIglzZXQgY2xlYW51cF93aW5kb3cgJHdcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBjbGVhbnVwX3RleHRfd2luZG93IHt9IHtcbiIKLSIJZ2xvYmFsIGNsZWFudXBfd2luZG93XG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgY2xlYW51cF93aW5kb3ddfSB7XG4iCi0iCQljYXRjaCB7ZGVzdHJveSAkY2xlYW51cF93aW5kb3d9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0iIyBGb3IgdXBkYXRpbmcgYSBzdHJpbmcgdmFyaWFibGUuICAgQWxzbyB1c2VkIGZvciBzaW1wbGUgT0svQ2FuY2VsIGRpYWxvZ3NcbiIKLSIjIHdpdGggZW50cnkgPSAwLlxuIgotInByb2MgZW50cnlfZGlhbG9nIHtpdGVtIHtlbnRyeSAxfX0ge1xuIgotIglnbG9iYWwgbWVudV92YXIgZW50cnlfc3RyIGVudHJ5X3NldCBlbnRyeV9kaWFsb2dfaXRlbVxuIgotIglnbG9iYWwgdW5zZXRfc3RyIGNvbm5lY3RlZF90b194MTF2bmMgZW50cnlfYm94XG4iCi0iXG4iCi0iCXNldCBlbnRyeV9zdHIgXCJTZXQgJGl0ZW1cIlxuIgotIglzZXQgZW50cnlfc2V0IDBcbiIKLSIJc2V0IGVudHJ5X2RpYWxvZ19pdGVtICRpdGVtXG4iCi0iXG4iCi0iCWVudHJ5X2VuYWJsZVxuIgotIgltZW51c19kaXNhYmxlXG4iCi0iXG4iCi0iCWlmIHskaXRlbSA9PSBcInBhc3N3ZFwiIHx8ICRpdGVtID09IFwidmlld3Bhc3N3ZFwifSB7XG4iCi0iCQkkZW50cnlfYm94IGNvbmZpZ3VyZSAtc2hvdyBcIipcIlxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskZW50cnl9IHtcbiIKLSIJCWVudHJ5X2luc2VydCBcIlwiXG4iCi0iCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV0gJiZcbiIKLSIJCSAgICAkbWVudV92YXIoJGl0ZW0pICE9ICR1bnNldF9zdHJ9IHtcbiIKLSIJCQllbnRyeV9pbnNlcnQgJG1lbnVfdmFyKCRpdGVtKVxuIgotIgkJCWVudHJ5X3NlbGVjdFxuIgotIgkJfVxuIgotIlxuIgotIgkJaWYge1tpc19icm93c2UgJGl0ZW1dfSB7XG4iCi0iCQkJZW50cnlfYnJvd3NlX2J1dHRvblxuIgotIgkJfVxuIgotIgkJc2V0X2luZm8gXCJTZXQgcGFyYW1ldGVyIGluIGVudHJ5IGJveCwgXCJcbiIKLSIJCWVudHJ5X2ZvY3VzXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQllbnRyeV9kaXNhYmxlIGJveFxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBjbGVhbl90ZXh0X3dpbmRvdyAwO1xuIgotIlxuIgotIglpZiB7JGl0ZW0gPT0gXCJpbnB1dFwifSB7XG4iCi0iCQlpbnNlcnRfaW5wdXRfd2luZG93XG4iCi0iCQlzZXQgY2xlYW5fdGV4dF93aW5kb3cgMVxuIgotIgl9XG4iCi0iXG4iCi0iCXVwZGF0ZVxuIgotIlxuIgotIgkjIHdhaXQgZm9yIHVzZXIgcmVwbHk6XG4iCi0iCXZ3YWl0IGVudHJ5X3NldFxuIgotIlxuIgotIglzZXQgcmMgJGVudHJ5X3NldFxuIgotIglzZXQgZW50cnlfc2V0IDBcbiIKLSJcbiIKLSIJc2V0IHZhbHVlIFtlbnRyeV9nZXRdXG4iCi0iCXVwZGF0ZVxuIgotIlxuIgotIgllbnRyeV9icm93c2VfYnV0dG9uIDBcbiIKLSIJc2V0IGVudHJ5X3N0ciBcIlNldC4uLiA6XCJcbiIKLSJcbiIKLSIJZW50cnlfZGVsZXRlXG4iCi0iCWVudHJ5X2Rpc2FibGVcbiIKLSIJbWVudXNfZW5hYmxlXG4iCi0iXG4iCi0iCWlmIHskY2xlYW5fdGV4dF93aW5kb3d9IHtcbiIKLSIJCWNsZWFudXBfdGV4dF93aW5kb3c7XG4iCi0iCX1cbiIKLSJcbiIKLSIJdXBkYXRlXG4iCi0iXG4iCi0iCWlmIHshICRlbnRyeX0ge1xuIgotIgkJO1xuIgotIgl9IGVsc2VpZiB7JHJjfSB7XG4iCi0iCQlzZXQgbWVudV92YXIoJGl0ZW0pICR2YWx1ZVxuIgotIgl9IGVsc2Uge1xuIgotIgkJaWYge1tpbl9kZWJ1Z19tb2RlXX0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwic2tpcHBlZCBzZXR0aW5nICRpdGVtXFxuXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIgkkZW50cnlfYm94IGNvbmZpZ3VyZSAtc2hvdyBcIlwiXG4iCi0iXG4iCi0iCXJldHVybiAkcmNcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB3YXJuaW5nX2RpYWxvZyB7bXNnIHtpdGVtIFwiZ3VpXCJ9IH0ge1xuIgotIglhcHBlbmRfdGV4dCAkbXNnXG4iCi0iCSMganVzdCByZXVzZSB0aGUgZW50cnkgd2lkZ2V0cyBmb3IgYSB5ZXMvbm8gZGlhbG9nXG4iCi0iCXJldHVybiBbZW50cnlfZGlhbG9nICRpdGVtIDBdXG4iCi0ifVxuIgotIlxuIgotIiMgRm9yIHVwZGF0aW5nIGEgYm9vbGVhbiB0b2dnbGU6XG4iCi0icHJvYyBjaGVja192YXIge2l0ZW19IHtcbiIKLSIJZ2xvYmFsIG1lbnVfdmFyXG4iCi0iXG4iCi0iCXNldCBpbnZhbCAkbWVudV92YXIoJGl0ZW0pO1xuIgotIlxuIgotIglpZiB7JGl0ZW0gPT0gXCJkZWJ1Z19ndWlcIn0ge1xuIgotIgkJcmV0dXJuIFwiXCI7XG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IHJuYW1lICRpdGVtXG4iCi0iCWlmIHshICRpbnZhbH0ge1xuIgotIgkJaWYge1tyZWdleHAge15ub30gJGl0ZW1dfSB7XG4iCi0iCQkJcmVnc3ViIHtebm99ICRybmFtZSBcIlwiIHJuYW1lXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBybmFtZSBcIm5vJHJuYW1lXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglyZXR1cm4gJHJuYW1lXG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2VlX2lmX29rIHtxdWVyeSBpdGVtIGV4cGVjdGVkfSB7XG4iCi0iCWdsb2JhbCBxdWVyeV9yZXN1bHRfbGlzdFxuIgotIlxuIgotIglzZXQgb2sgMFxuIgotIglzZXQgZm91bmQgXCJcIlxuIgotIlxuIgotIglzZXQgcXVlcnlfcmVzdWx0X2xpc3QgW3NwbGl0X3F1ZXJ5ICRxdWVyeV1cbiIKLSJcbiIKLSIJZm9yZWFjaCBxICRxdWVyeV9yZXN1bHRfbGlzdCB7XG4iCi0iCQkjIFhYWCBmb2xsb3dpbmcgd2lsbCBjcmFzaCBpZiAkaXRlbSBpcyBub3QgYSBnb29kIHJlZ2V4cFxuIgotIgkJIyBuZWVkIHRvIHByb3RlY3QgaXQgXFxRJGl0ZW1cXEUgc3R5bGUuLi5cbiIKLSIjCQlpZiB7W3JlZ2V4cCBcIl4kaXRlbTpcIiAkcV19IHtcbiIKLSIjCQkJc2V0IGZvdW5kICRxXG4iCi0iIwkJfVxuIgotIgkJaWYge1tzdHJpbmcgZmlyc3QgXCIkaXRlbTpcIiAkcV0gPT0gMH0ge1xuIgotIgkJCXNldCBmb3VuZCAkcVxuIgotIgkJfVxuIgotIgkJaWYgeyRxID09ICRleHBlY3RlZH0ge1xuIgotIgkJCXNldCBvayAxXG4iCi0iCQkJaWYgeyRmb3VuZCAhPSBcIlwifSB7XG4iCi0iCQkJCWJyZWFrO1xuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIglpZiB7JGZvdW5kID09IFwiXCJ9IHtcbiIKLSIJCXNldCBtc2cgJHF1ZXJ5XG4iCi0iCQlyZWdzdWIge15hLi49fSAkbXNnIHt9IG1zZ1xuIgotIgkJaWYge1tzdHJpbmcgbGVuZ3RoICRtc2ddID4gNjB9IHtcbiIKLSIJCQlzZXQgbXNnIFtzdHJpbmcgcmFuZ2UgJG1zZyAwIDYwXVxuIgotIgkJfVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IG1zZyAkZm91bmRcbiIKLSIJfVxuIgotIglpZiB7ISRvayAmJiAkZm91bmQgIT0gXCJcIn0ge1xuIgotIgkJIyBjaGVjayBmb3IgZmxvYXRpbmcgcG9pbnQgbWF0Y2g6XG4iCi0iCQlzZXQgdjEgXCJcIlxuIgotIgkJc2V0IHYyIFwiXCJcbiIKLSIJCXJlZ2V4cCB7OihbMC05Ll1bMC05Ll0qKSR9ICRmb3VuZCBtMCB2MVxuIgotIgkJcmVnZXhwIHs6KFswLTkuXVswLTkuXSopJH0gJGV4cGVjdGVkIG0wIHYyXG4iCi0iCQlpZiB7JHYxICE9IFwiXCIgJiYgJHYyICE9IFwiXCJ9IHtcbiIKLSIJCQlzZXQgZGlmZiBcIlwiXG4iCi0iCQkJY2F0Y2gge3NldCBkaWZmIFtleHByIFwiJHYxIC0gJHYyXCJdfVxuIgotIgkJCWlmIHskZGlmZiAhPSBcIlwifSB7XG4iCi0iCQkJCWlmIHskZGlmZiA8IDB9IHtcbiIKLSIJCQkJCXNldCBkaWZmIFtleHByIFwiMC4wIC0gJGRpZmZcIl1cbiIKLSIJCQkJfVxuIgotIgkJCQlpZiB7JGRpZmYgPCAwLjAwMDAxfSB7XG4iCi0iCQkJCQlzZXQgb2sgMVxuIgotIgkJCQl9XG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWlmIHskb2t9IHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFx0U2V0IE9LICAoJG1zZylcXG5cIlxuIgotIgkJcmV0dXJuIDFcbiIKLSJcbiIKLSIJfSBlbHNlaWYge1tvcHRfbWF0Y2ggUCAkaXRlbV0gJiYgW3JlZ2V4cCB7OigtfFxcKyl9ICRleHBlY3RlZF19IHtcbiIKLSIJCSMgZS5nLiBibGFja291dDorMzB4MzArMjArMjBcbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFx0KCRtc2cpXFxuXCJcbiIKLSIJCXJldHVybiAxXG4iCi0iCX0gZWxzZWlmIHtbcmVnZXhwIHs6WzAtOV1cXC5bMC05XX0gJGV4cGVjdGVkXX0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJcXHQoJG1zZylcXG5cIlxuIgotIgkJcmV0dXJuIDFcbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwiY29ubmVjdFwiIHx8ICRpdGVtID09IFwiZGlzY29ubmVjdFwiXG4iCi0iCSAgICB8fCAkaXRlbSA9PSBcImNsaWVudFwiIHx8ICRpdGVtID09IFwiY2xpZW50X2lucHV0XCJ9IHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFx0KCRtc2cpXFxuXCJcbiIKLSIJCXJldHVybiAxXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcInBhc3N3ZFwiIHx8ICRpdGVtID09IFwidmlld3Bhc3N3ZFwifSB7XG4iCi0iCQlhcHBlbmRfdGV4dCBcIlxcdCgkbXNnKVxcblwiXG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9IGVsc2Uge1xuIgotIgkJYXBwZW5kX3RleHQgXCJcXHQqRkFJTEVEKiAkbXNnXFxuXCJcbiIKLSIJCXJldHVybiAwXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBnZXRfZGVmYXVsdF92YXJzIHt9IHtcbiIKLSIJZ2xvYmFsIGRlZmF1bHRfdmFyIGVudlxuIgotIlxuIgotIglzZXQgcXJ5IFthbGxfcXVlcnlfdmFyc11cbiIKLSJcbiIKLSIJYXBwZW5kIHFyeSBcIix2bmNjb25uZWN0XCJcbiIKLSJcbiIKLSIJc2V0IHEgXCJcIlxuIgotIglzZXQgaSAwXG4iCi0iCXNldCBhbGwgXCJcIlxuIgotIglmb3JlYWNoIHMgW3NwbGl0ICRxcnkgXCIsXCJdIHtcbiIKLSIJCWlmIHskcSAhPSBcIlwifSB7XG4iCi0iCQkJYXBwZW5kIHEgXCIsXCJcbiIKLSIJCX1cbiIKLSIJCWFwcGVuZCBxICRzXG4iCi0iCQlpbmNyIGlcbiIKLSIJCWlmIHskaSA+IDUwfSB7XG4iCi0iCQkJc2V0IHFhcmdzIFtsaXN0IFwiLVFEXCIgJHFdXG4iCi0iCQkJc2V0IGEgW3J1bl9yZW1vdGVfY21kICRxYXJnc11cbiIKLSIJCQlpZiBbaW5mbyBleGlzdHMgZW52KFRLWDExVk5DX1BSSU5UX0FMTF9RRCldIHtcbiIKLSIJCQkJcHV0cyAkcVxuIgotIgkJCQlwdXRzICRhXG4iCi0iCQkJCXB1dHMgXCItLS0tLS0tLS0tLS0tLS1cIlxuIgotIgkJCX1cbiIKLSIJCQlpZiB7JGFsbCAhPSBcIlwifSB7XG4iCi0iCQkJCWFwcGVuZCBhbGwgXCIsXCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kIGFsbCAkYVxuIgotIgkJCXNldCBxIFwiXCJcbiIKLSIJCQlzZXQgaSAwXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJaWYgeyRxICE9IFwiXCJ9IHtcbiIKLSIJCXNldCBxYXJncyBbbGlzdCBcIi1RRFwiICRxXVxuIgotIgkJc2V0IGEgW3J1bl9yZW1vdGVfY21kICRxYXJnc11cbiIKLSIJCWlmIFtpbmZvIGV4aXN0cyBlbnYoVEtYMTFWTkNfUFJJTlRfQUxMX1FEKV0ge1xuIgotIgkJCXB1dHMgJHFcbiIKLSIJCQlwdXRzICRhXG4iCi0iCQkJcHV0cyBcIi0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iCQl9XG4iCi0iCQlpZiB7JGFsbCAhPSBcIlwifSB7XG4iCi0iCQkJYXBwZW5kIGFsbCBcIixcIlxuIgotIgkJfVxuIgotIgkJYXBwZW5kIGFsbCAkYVxuIgotIgl9XG4iCi0iXG4iCi0iIyBvbGQgd2F5LCBxcnkgdG9vIGxvbmcuLi5cbiIKLSIjCXNldCBxYXJncyBbbGlzdCBcIi1RRFwiICRxcnldXG4iCi0iIwlzZXQgYWxsIFtydW5fcmVtb3RlX2NtZCAkcWFyZ3NdXG4iCi0iXG4iCi0iCWlmIHtbcmVnZXhwIHthbnM9fSAkYWxsXX0ge1xuIgotIgkJI2FwcGVuZF90ZXh0IFwiUmV0cmlldmVkIGFsbCBkZWZhdWx0IHNldHRpbmdzLlxcblwiXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQkjYXBwZW5kX3RleHQgXCJGYWlsZWQgdG8gcmV0cmlldmUgZGVmYXVsdCBzZXR0aW5ncy5cXG5cIlxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBxdWVyeV9yZXN1bHRfbGlzdCBbc3BsaXRfcXVlcnkgJGFsbF1cbiIKLSJcbiIKLSIJc2V0IGRlZmF1bHRfdmFyKGd1aSkgXCJcIlxuIgotIlxuIgotIglmb3JlYWNoIHBpZWNlICRxdWVyeV9yZXN1bHRfbGlzdCB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XihbXjpdW146XSopOiguKikkfSAkcGllY2UgbTAgaXRlbSB2YWxdfSB7XG4iCi0iCQkJaWYgeyR2YWwgPT0gXCJOL0FcIn0ge1xuIgotIgkJCQlpZiB7JGl0ZW0gPT0gXCJ2bmNjb25uZWN0XCJ9IHtcbiIKLSIJCQkJCXNldCB2YWwgMVxuIgotIgkJCQl9IGVsc2Uge1xuIgotIgkJCQkJc2V0IHZhbCBcIlwiXG4iCi0iCQkJCX1cbiIKLSIJCQl9XG4iCi0iCQkJaWYgeyRpdGVtID09IFwiZGlzcGxheVwifSB7XG4iCi0iCQkJCXNldCB2YWwgXCJcIlxuIgotIgkJCX0gZWxzZWlmIHskaXRlbSA9PSBcImRlc2t0b3BcIn0ge1xuIgotIgkJCQlzZXQgdmFsIFwiXCJcbiIKLSIJCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJhdXRoXCJ9IHtcbiIKLSIJCQkJc2V0IHZhbCBcIlwiXG4iCi0iCQkJfSBlbHNlaWYgeyRpdGVtID09IFwiZ3VpXCJ9IHtcbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQl9IFxuIgotIgkJCSMgc29tZSBoYWNrcyB3ZSBkbyBoZXJlIGZvciBub3cuLlxuIgotIgkJCWlmIHskaXRlbSA9PSBcImN1cnNvclwiICYmICR2YWwgPT0gXCJcIn0ge1xuIgotIgkJCQlzZXQgdmFsIFwibW9zdFwiXG4iCi0iCQkJfSBlbHNlaWYgeyRpdGVtID09IFwic2Nyb2xsY29weXJlY3RcIiAmJiAkdmFsID09IFwiXCJ9IHtcbiIKLSIJCQkJc2V0IHZhbCBcImFsd2F5c1wiXG4iCi0iCQkJfSBlbHNlaWYgeyRpdGVtID09IFwid2lyZWNvcHlyZWN0XCIgJiYgJHZhbCA9PSBcIlwifSB7XG4iCi0iCQkJCXNldCB2YWwgXCJhbHdheXNcIlxuIgotIiMJCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJvdmVybGF5X25vY3Vyc29yXCIgJiYgJHZhbCA9PSAwfSB7XG4iCi0iIwkJCQlzZXQgdmFsIDFcbiIKLSIJCQl9XG4iCi0iXG4iCi0iCQkJc2V0IGRlZmF1bHRfdmFyKCRpdGVtKSAkdmFsXG4iCi0iI3B1dHMgXCJkZWZhdWx0OiAkaXRlbSAtPiAkdmFsXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHRpbGRlX2V4cGFuZCB7ZmlsZX0ge1xuIgotIglnbG9iYWwgZW52XG4iCi0iCWlmIHtbZmlsZSBleGlzdHMgJGZpbGVdfSB7XG4iCi0iCQlyZXR1cm4gJGZpbGVcbiIKLSIJfVxuIgotIlxuIgotIglzZXQgdXNlciBcIlwiXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgZW52KFVTRVIpXX0ge1xuIgotIgkJc2V0IHVzZXIgJGVudihVU0VSKVxuIgotIgl9XG4iCi0iCWlmIHskdXNlciA9PSBcIlwiICYmIFtpbmZvIGV4aXN0cyBlbnYoTE9HTkFNRSldfSB7XG4iCi0iCQlzZXQgdXNlciAkZW52KExPR05BTUUpXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IGhvbWUgXCJcIlxuIgotIglpZiB7W2luZm8gZXhpc3RzIGVudihIT01FKV19IHtcbiIKLSIJCXNldCBob21lICRlbnYoSE9NRSlcbiIKLSIJfSBlbHNlaWYgeyR1c2VyICE9IFwiXCJ9IHtcbiIKLSIJCXNldCBob21lIFwiL2hvbWUvJHVzZXJcIlxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHtbcmVnZXhwIHtefn0gJGZpbGVdfSB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7Xn4vfSAkZmlsZV19IHtcbiIKLSIJCQlpZiB7JGhvbWUgIT0gXCJcIn0ge1xuIgotIgkJCQlyZWdzdWIge15+fSAkZmlsZSAkaG9tZSBmaWxlXG4iCi0iCQkJfVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlyZWdzdWIge15+fSAkZmlsZSBcIi9ob21lL1wiIGZpbGVcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglyZXR1cm4gJGZpbGVcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBpbnNlcnRfY21kbGluZV92YXJzIHt9IHtcbiIKLSIJZ2xvYmFsIGVudiBjbWRfdmFyIG1lbnVfdmFyIGRlZmF1bHRfdmFyIHgxMXZuY19jbWRsaW5lXG4iCi0iCWlmIHshW2luZm8gZXhpc3RzIHgxMXZuY19jbWRsaW5lXX0ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSIJaWYgeyR4MTF2bmNfY21kbGluZSA9PSBcIlwifSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglzZXQgY21kX3Zhcihub3ZhcikgMSBcbiIKLSIJc2V0IHN0ciBbc3RyaW5nIHRyaW0gJHgxMXZuY19jbWRsaW5lXVxuIgotIlxuIgotIgl3aGlsZSB7W3JlZ2V4cCAtLSB7Xi19ICRzdHJdfSB7XG4iCi0iCQlpZiB7W3JlZ2V4cCAtLSB7Xi0tKihbXiBcXHRdW14gXFx0XSopKC4qKSR9ICRzdHIgbSB2YXIgcmVzdF19IHtcbiIKLSIJCQlzZXQgcmVzdCBbc3RyaW5nIHRyaW0gJHJlc3RdXG4iCi0iCQkJc2V0IHZhciBbc3RyaW5nIHRyaW0gJHZhcl1cbiIKLSIJCQlpZiB7W3JlZ2V4cCB7Xlxce1xceyhbXlxcfV0qKVxcfVxcfSguKil9ICRyZXN0IG0gdmFsIHJlc3RdfSB7XG4iCi0iCQkJCXNldCBzdHIgW3N0cmluZyB0cmltICRyZXN0XVxuIgotIgkJCQlzZXQgY21kX3ZhcigkdmFyKSAkdmFsXG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJc2V0IHN0ciAkcmVzdFxuIgotIgkJCQlzZXQgY21kX3ZhcigkdmFyKSBcImJvb2xlYW5cIlxuIgotIgkJCX1cbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYnJlYWtcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIglpZiB7W2luZm8gZXhpc3RzIGNtZF92YXIocmMpXX0ge1xuIgotIgkJbG9hZF9zZXR0aW5ncyAkY21kX3ZhcihyYylcbiIKLSIJfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBjbWRfdmFyKG5vcmMpXX0ge1xuIgotIgkJO1xuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGZpbGV4IFt0aWxkZV9leHBhbmQgXCJ+Ly54MTF2bmNyY1wiXVxuIgotIgkJaWYge1tmaWxlIGV4aXN0cyAkZmlsZXhdfSB7XG4iCi0iCQkJbG9hZF9zZXR0aW5ncyAkZmlsZXhcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIglmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgY21kX3Zhcl0ge1xuIgotIgkJaWYgeyR2YXIgPT0gXCJub3ZhclwifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHtbcmVnZXhwIHteWyBcXHRdKiR9ICR2YXJdfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoJHZhcildfSB7XG4iCi0iCQkJaWYgeyRjbWRfdmFyKCR2YXIpID09IFwiYm9vbGVhblwifSB7XG4iCi0iCQkJCXNldCBtZW51X3ZhcigkdmFyKSAxXG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJc2V0IG1lbnVfdmFyKCR2YXIpICRjbWRfdmFyKCR2YXIpXG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgY29weV9kZWZhdWx0X3ZhcnMge30ge1xuIgotIglnbG9iYWwgbWVudV92YXIgZGVmYXVsdF92YXJcbiIKLSIJZm9yZWFjaCBpdGVtIFthcnJheSBuYW1lcyBkZWZhdWx0X3Zhcl0ge1xuIgotIgkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7XG4iCi0iCQkJaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X3ZhcigkaXRlbSldfSB7XG4iCi0iCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJGRlZmF1bHRfdmFyKCRpdGVtKVxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIglmb3JlYWNoIGl0ZW0gW2FycmF5IG5hbWVzIG1lbnVfdmFyXSB7XG4iCi0iCQlpZiB7W2luZm8gZXhpc3RzIGRlZmF1bHRfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQlzZXQgbWVudV92YXIoJGl0ZW0pICRkZWZhdWx0X3ZhcigkaXRlbSlcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHVwZGF0ZV9tZW51X3ZhcnMge3txdWVyeSBcIlwifX0ge1xuIgotIglnbG9iYWwgYWxsX3NldHRpbmdzIG1lbnVfdmFyIHF1ZXJ5X3Jlc3VsdF9saXN0XG4iCi0iCWdsb2JhbCB4MTF2bmNfaWNvbl9tb2RlXG4iCi0iXG4iCi0iCXNldCBkZWJ1ZyBbaW5fZGVidWdfbW9kZV1cbiIKLSJcbiIKLSIJaWYgeyRxdWVyeSA9PSBcIlVTRV9MSVNUXCJ9IHtcbiIKLSIJCTtcbiIKLSIJfSBlbHNlaWYgeyRxdWVyeSA9PSBcIlwifSB7XG4iCi0iCQlzZXQgcXVlcnlfcmVzdWx0X2xpc3QgW3NwbGl0X3F1ZXJ5ICRhbGxfc2V0dGluZ3NdXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgcXVlcnlfcmVzdWx0X2xpc3QgW3NwbGl0X3F1ZXJ5ICRxdWVyeV1cbiIKLSIJfVxuIgotIlxuIgotIglmb3JlYWNoIHBpZWNlICRxdWVyeV9yZXN1bHRfbGlzdCB7XG4iCi0iI3B1dHMgc3RkZXJyIFwiVU1WOiAkcGllY2VcIlxuIgotIgkJaWYgW3JlZ2V4cCB7aWNvbl9tb2RlOjB9ICRwaWVjZV0ge1xuIgotIgkJCXNldCB4MTF2bmNfaWNvbl9tb2RlIDBcbiIKLSIJCQkjcHV0cyBzdGRlcnIgXCJ4MTF2bmNfaWNvbl9tb2RlOiAkeDExdm5jX2ljb25fbW9kZVwiXG4iCi0iCQl9XG4iCi0iCQlpZiBbcmVnZXhwIHtpY29uX21vZGU6MX0gJHBpZWNlXSB7XG4iCi0iCQkJc2V0IHgxMXZuY19pY29uX21vZGUgMVxuIgotIgkJCSNwdXRzIHN0ZGVyciBcIngxMXZuY19pY29uX21vZGU6ICR4MTF2bmNfaWNvbl9tb2RlXCJcbiIKLSIJCX1cbiIKLSIJCSMgWFhYIGlwdjZcbiIKLSIJCWlmIHtbcmVnZXhwIHteKFteOl1bXjpdKik6KC4qKSR9ICRwaWVjZSBtMCBpdGVtIHZhbF19IHtcbiIKLSIJCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJc2V0IG9sZCAkbWVudV92YXIoJGl0ZW0pXG4iCi0iI3B1dHMgc3RkZXJyIFwiICAgICAkb2xkXCJcbiIKLSIJCQkJaWYgeyR2YWwgPT0gXCJOL0FcIn0ge1xuIgotIgkJCQkJY29udGludWVcbiIKLSIJCQkJfVxuIgotIgkJCQlzZXQgbWVudV92YXIoJGl0ZW0pICR2YWxcbiIKLSIJCQl9XG4iCi0iCQkJaWYgeyRpdGVtID09IFwiY2xpZW50c1wifSB7XG4iCi0iCQkJCXVwZGF0ZV9jbGllbnRzX21lbnUgJHZhbFxuIgotIgkJCX0gZWxzZWlmIHskaXRlbSA9PSBcImRpc3BsYXlcIn0ge1xuIgotIgkJCQlzZXRfeDExX2Rpc3BsYXkgJHZhbFxuIgotIgkJCX0gZWxzZWlmIHskaXRlbSA9PSBcInZuY2Rpc3BsYXlcIn0ge1xuIgotIgkJCQlzZXRfdm5jX2Rpc3BsYXkgJHZhbFxuIgotIgkJCX0gZWxzZWlmIHskaXRlbSA9PSBcImh0dHBfdXJsXCJ9IHtcbiIKLSIJCQkJc2V0X3ZuY191cmwgJHZhbFxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGxvYWRfc2V0dGluZ3Mge3tmaWxlIFwiXCJ9fSB7XG4iCi0iCWdsb2JhbCBtZW51X3ZhciBkZWZhdWx0X3ZhciBlbnZcbiIKLSJcbiIKLSIJaWYgeyRmaWxlID09IFwiXCJ9IHtcbiIKLSIJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKGxvYWQtc2V0dGluZ3MpXX0ge1xuIgotIgkJCXJldHVyblxuIgotIgkJfVxuIgotIgkJc2V0IGZpbGUgJG1lbnVfdmFyKGxvYWQtc2V0dGluZ3MpXG4iCi0iCX1cbiIKLSIJaWYgeyRmaWxlID09IFwiXCJ9IHtcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBmaCBcIlwiXG4iCi0iCXNldCBmaWxleCBbdGlsZGVfZXhwYW5kICRmaWxlXVxuIgotIgljYXRjaCB7c2V0IGZoIFtvcGVuICRmaWxleCBcInJcIl19XG4iCi0iXG4iCi0iCWlmIHskZmggPT0gXCJcIn0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJsb2FkX3NldHRpbmdzOiAqKiogZmFpbGVkIHRvIG9wZW4gJGZpbGV4ICoqKlxcblwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIgljb3B5X2RlZmF1bHRfdmFyc1xuIgotIlxuIgotIglzZXQgc3RyIFwiXCJcbiIKLSIJd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7XG4iCi0iCQlyZWdzdWIgLWFsbCB7XFxcXCN9ICRsaW5lIHtfX1FVT1RFRF9IQVNIX199IGxpbmVcbiIKLSIJCWlmIHtbcmVnZXhwIHteWyBcXHRdKiN9ICRsaW5lXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlmb3Ige3NldCBpIDB9IHskaSA8IDV9IHtpbmNyIGl9IHtcbiIKLSIJCQlyZWdzdWIgeyMuKiR9ICRsaW5lIFwiXCIgbGluZVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge15bIFxcdF0qJH0gJGxpbmVdfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCXJlZ3N1YiAtYWxsIHtfX1FVT1RFRF9IQVNIX199ICRsaW5lIHsjfSBsaW5lXG4iCi0iCQlpZiB7W3JlZ2V4cCB7XFxcXCR9ICRsaW5lXX0ge1xuIgotIgkJCXJlZ3N1YiB7XFxcXCR9ICRsaW5lIFwiIFwiIGxpbmVcbiIKLSIJCQlhcHBlbmQgc3RyIFwiJGxpbmVcIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlhcHBlbmQgc3RyIFwiJGxpbmVcXG5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWNsb3NlICRmaFxuIgotIlxuIgotIglzZXQgY291bnQgMFxuIgotIglzZXQgcGFybXMgXCJcIlxuIgotIlxuIgotIglmb3JlYWNoIGxpbmUgW3NwbGl0ICRzdHIgXCJcXG5cIl0ge1xuIgotIgkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXVxuIgotIgkJcmVnc3ViIHteLS0qfSAkbGluZSBcIlwiIGxpbmVcbiIKLSIJCXJlZ3N1YiAtYWxsIHtbIFxcdF1bIFxcdF0qfSAkbGluZSBcIiBcIiBsaW5lXG4iCi0iCQlzZXQgbGlzdCBbc3BsaXQgJGxpbmVdXG4iCi0iCQlzZXQgaXRlbSBbbGluZGV4ICRsaXN0IDBdXG4iCi0iCQlzZXQgdmFsdWUgW2xpbmRleCAkbGlzdCAxXVxuIgotIgkJaWYge1tyZWdleHAge15bIFxcdF0qJH0gJGl0ZW1dfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSA9PSBcImd1aVwifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgbWVudV92YXIoJGl0ZW0pXX0ge1xuIgotIgkJCWlmIHtbdmFsdWVfaXNfYm9vbCAkaXRlbV19IHtcbiIKLSIJCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSAxXG4iCi0iCQkJCWluY3IgY291bnRcbiIKLSIJCQkJYXBwZW5kIHBhcm1zIFwiICAtJGl0ZW1cXG5cIlxuIgotIgkJCX0gZWxzZWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0ge1xuIgotIgkJCQlpZiB7JHZhbHVlICE9IFwiXCJ9IHtcbiIKLSIJCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJHZhbHVlXG4iCi0iCQkJCQlzZXQgbml0ZW0gW2dldF9uaXRlbSAkaXRlbV1cbiIKLSIJCQkJCWFwcGVuZCBwYXJtcyBcIiAgLSRuaXRlbSAkdmFsdWVcXG5cIlxuIgotIgkJCQkJaW5jciBjb3VudFxuIgotIgkJCQl9XG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWFwcGVuZF90ZXh0IFwibG9hZGVkICRjb3VudCBwYXJhbWV0ZXIgc2V0dGluZ3MgZnJvbSAkZmlsZXhcIlxuIgotIglpZiB7JGNvdW50ID4gMH0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCI6XFxuXCJcbiIKLSIJCWFwcGVuZF90ZXh0ICRwYXJtc1xuIgotIgl9IGVsc2Uge1xuIgotIgkJYXBwZW5kX3RleHQgXCIuXFxuXCJcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNhdmVfc2V0dGluZ3Mge30ge1xuIgotIglzZXQgcmNfdGV4dCBbZ2V0X3NldHRpbmdzX3JjZmlsZV1cbiIKLSJcbiIKLSIJc2V0IHRvcCBcIiNcbiIKLSIjIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB4MTF2bmMgc2V0dGluZ3MgYW5kIGNhbiBiZSB1c2VkIGFzXG4iCi0iIyBhcyBhIH4vLngxMXZuY3JjIGRlZmF1bHRzIGZpbGUuICBJZiBzYXZlZCB0byBhbm90aGVyIGZpbGVuYW1lLCB0aGVzZVxuIgotIiMgc2V0dGluZ3MgY2FuIGJlIHBhc3NlZCB0byB4MTF2bmMgYXQgc3RhcnR1cCB2aWEgXFxcIi1yYyA8ZmlsZW5hbWU+XFxcIi5cbiIKLSIjXG4iCi0iIyBUaGUgcmMgZmlsZSBjb21tZW50IGNoYXJhY3RlciBpcyBcXFwiI1xcXCIuICBVc2UgXFxcIlxcXFwjXFxcIiBmb3IgdGhlIGxpdGVyYWwgY2hhci5cbiIKLSIjIFlvdSBjYW4gY29udGludWUgbGluZXMgdXNpbmcgXFxcIlxcXFxcXFwiIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIGxpbmUuXG4iCi0iI1xuIgotIiMgTGluZXMgYmVnaW5uaW5nIHdpdGggXFxcIiNkXFxcIiBpbmRpY2F0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlIGlzIGF0IGl0cyBkZWZhdWx0XG4iCi0iIyBzZXR0aW5nIGFuZCB5b3UgcHJvYmFibHkgd2FudCB0byBsZWF2ZSBpdCBjb21tZW50ZWQgb3V0LlxuIgotIiNcbiIKLSIjIExpbmVzIGJlZ2lubmluZyB3aXRoIFxcXCIjP1xcXCIgaW5kaWNhdGUgcGFyYW1ldGVycyB5b3UgcHJvYmFibHkgZG8gbm90XG4iCi0iIyB3YW50IHRvIGhhcmR3aXJlIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgKHVuY29tbWVudCBpZiB5b3Ugd2FudCB0aGF0KS5cbiIKLSIjIFxuIgotIiMgU29tZSBwYXJhbWV0ZXJzIGFyZSBib29sZWFuLCBlLmcuIC1mb3JldmVyLCBhbmQgdGFrZSBubyB2YWx1ZTsgd2hpbGVcbiIKLSIjIHRoZSBvdGhlcnMsIGUuZy4gLXdhaXQgNTAsIHRha2UgYSBzdHJpbmcgb3IgbnVtZXJpY2FsIHZhbHVlLlxuIgotIiNcbiIKLSIjIEZvciBib29sZWFucywgdGhlIGxpbmUgd2lsbCBlbmQgd2l0aCBjb21tZW50IFxcXCJkZWZhdWx0OiBvblxcXCIgb3JcbiIKLSIjIFxcXCJkZWZhdWx0OiBvZmZcXFwiIGluZGljYXRpbmcgdGhlIGRlZmF1bHQgc2V0dGluZy4gIChOb3RlOiBvZnRlblxuIgotIiMgXFxcIi1ub2Zvb2JhclxcXCIgY29ycmVzcG9uZHMgdG8gb3B0aW9uIFxcXCItZm9vYmFyXFxcIiBhbmQgdGhlIGZvcm1lciBpc1xuIgotIiMgXFxcInRoZSBkZWZhdWx0XFxcIiwgZS5nLiAtbm9yZXBlYXQpLlxuIgotIiNcbiIKLSIjIEZvciBzdHJpbmcgb3IgbnVtZXJpY2FsIG9wdGlvbnMsIHRoZSB2YWx1ZSBcXFwiXFxcIiBpbiBhIGxpbmUgYmVsb3dcbiIKLSIjIG1lYW5zIHRoZSBkZWZhdWx0IGlzIHVuc2V0IGFuZCB5b3Ugd2lsbCBuZWVkIHRvIHN1cHBseSBzb21lIG5vbi1lbXB0eVxuIgotIiMgdmFsdWUgdG8gdXNlIHRoZSBwYXJhbWV0ZXIuICBGb3IgcmVmZXJlbmNlLCBpZiB0aGUgZGVmYXVsdCBkaWZmZXJzXG4iCi0iIyBmcm9tIHlvdXIgdmFsdWUgaXQgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYXMgYSBjb21tZW50LlxuIgotIiMgXG4iCi0iIyBGZWVsIGZyZWUgdG8gdW5jb21tZW50IG9yIGNvbW1lbnQgYW55IG9mIHRoZSBsaW5lcyBvciB0byBjaGFuZ2UgYW55XG4iCi0iIyBvZiB0aGUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzLiAgRG9uJ3QgYmUgc3VycHJpc2VkIHRoYXQgbW9zdCBpZiBub3RcbiIKLSIjIGFsbCBvZiB0aGUgbGluZXMgYmVsb3cgYXJlIGNvbW1lbnRlZCBvdXQgKHgxMXZuYyBoYXMgc28gbWFueSBwYXJhbWV0ZXJzLFxuIgotIiMgbW9zdCBvZiB0aGVtIHdpbGwgYmUgYXQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLlxuIgotIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCi0iXG4iCi0iXCJcbiIKLSJcbiIKLSIJc2V0IHJjX3RleHQgXCIkdG9wJHJjX3RleHRcIlxuIgotIlxuIgotIglnbG9iYWwgZW52IHNhdmVfc2V0dGluZ3NfdmFyIHNhdmVfc2V0dGluZ3NfdmFyX29rXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgZW52KEhPTUUpXX0ge1xuIgotIgkJc2V0IHNhdmVfc2V0dGluZ3NfdmFyIFwiJGVudihIT01FKS8ueDExdm5jcmNcIlxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IHNhdmVfc2V0dGluZ3NfdmFyIFwiLngxMXZuY3JjXCJcbiIKLSIJfVxuIgotIglzZXQgc2F2ZV9zZXR0aW5nc192YXJfb2sgMFxuIgotIlxuIgotIglzZXQgdyBbdGV4dHdpbiBcInNhdmVfc2V0dGluZ3NcIiBcIlNhdmUgU2V0dGluZ3MuLi5cIiAkcmNfdGV4dCBcXFxuIgotIgkJXCJzYXZlX3NldHRpbmdzX3ZhcitTYXZlIGFzOlwiXVxuIgotIlxuIgotIgl0a3dhaXQgd2luZG93ICR3XG4iCi0iXG4iCi0iCWlmIHskc2F2ZV9zZXR0aW5nc192YXJfb2sgPT0gMX0ge1xuIgotIgkJc2V0IGZpbGUgJHNhdmVfc2V0dGluZ3NfdmFyXG4iCi0iCQlpZiB7JGZpbGUgPT0gXCJcIn0ge1xuIgotIgkJCXJldHVyblxuIgotIgkJfVxuIgotIgkJc2V0IGZpbGUgW3RpbGRlX2V4cGFuZCAkZmlsZV1cbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFxuU2F2aW5nIGN1cnJlbnQgc2V0dGluZ3MgdG8gJGZpbGUgLi4uXFxuXCIgXG4iCi0iCQlpZiB7W2ZpbGUgZXhpc3RzICRmaWxlXX0ge1xuIgotIgkJCXNldCBiYWNrdXAgXCIke2ZpbGV9flwiXG4iCi0iCQkJYXBwZW5kX3RleHQgXCJCYWNraW5nIHVwICRmaWxlIC0+ICRiYWNrdXAgLi4uXFxuXCJcbiIKLSIJCQljYXRjaCB7ZmlsZSBkZWxldGUgLWZvcmNlICRiYWNrdXB9XG4iCi0iCQkJc2V0IGVtc2cgXCIqKiogQmFja3VwIHRvICRiYWNrdXAgZmFpbGVkLiAqKipcXG5cIlxuIgotIgkJCWlmIHshW2ZpbGUgZXhpc3RzICRiYWNrdXBdfSB7XG4iCi0iCQkJCWNhdGNoIHtmaWxlIGNvcHkgLWZvcmNlICRmaWxlICRiYWNrdXB9XG4iCi0iCQkJCWlmIHshW2ZpbGUgZXhpc3RzICRiYWNrdXBdfSB7XG4iCi0iCQkJCQlhcHBlbmRfdGV4dCAkZW1zZ1xuIgotIgkJCQkJYmVsbFxuIgotIgkJCQl9XG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJYXBwZW5kX3RleHQgJGVtc2dcbiIKLSIJCQkJYmVsbFxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJCXNldCBmaCBcIlwiXG4iCi0iCQljYXRjaCB7c2V0IGZoIFtvcGVuICRmaWxlIFwid1wiXX1cbiIKLSIJCWlmIHskZmggIT0gXCJcIn0ge1xuIgotIgkJCXB1dHMgJGZoICRyY190ZXh0XG4iCi0iCQkJY2xvc2UgJGZoXG4iCi0iCQkJaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7XG4iCi0iCQkJCWFwcGVuZF90ZXh0IFwiKioqIFNhdmluZyB0byAkZmlsZSBmYWlsZWQuICoqKlxcblwiXG4iCi0iCQkJCWJlbGxcbiIKLSIJCQl9IGVsc2Uge1xuIgotIgkJCQlhcHBlbmRfdGV4dCBcIkRvbmUuXFxuXCJcbiIKLSIJCQl9XG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwiKioqIE9wZW4gb2YgJGZpbGUgZmFpbGVkLiAqKipcXG5cIlxuIgotIgkJCWJlbGxcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGNsZWFyX2FsbCB7fSB7XG4iCi0iCWdsb2JhbCBtZW51X3ZhciB1bnNldF9zdHJcbiIKLSJcbiIKLSIJc2V0IGRlYnVnIFtpbl9kZWJ1Z19tb2RlXVxuIgotIglcbiIKLSIJZm9yZWFjaCBpdGVtIFthcnJheSBuYW1lcyBtZW51X3Zhcl0ge1xuIgotIgkJaWYgeyRpdGVtID09IFwiZGVidWdfZ3VpXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7XG4iCi0iCQkJaWYge1tpc19hY3Rpb24gJGl0ZW1dfSB7XG4iCi0iCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgXCJcIlxuIgotIgkJCX0gZWxzZWlmIHtbdmFsdWVfaXNfYm9vbCAkaXRlbV19IHtcbiIKLSIJCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSAwXG4iCi0iCQkJfSBlbHNlaWYge1t2YWx1ZV9pc19zdHJpbmcgJGl0ZW1dfSB7XG4iCi0iCQkJCXNldCBtZW51X3ZhcigkaXRlbSkgJHVuc2V0X3N0clxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIglhcHBlbmRfdGV4dCBcIkNsZWFyZWQgYWxsIHNldHRpbmdzLlxcblwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgZGVmYXVsdHNfYWxsIHt9IHtcbiIKLSIJY29weV9kZWZhdWx0X3ZhcnNcbiIKLSIJYXBwZW5kX3RleHQgXCJSZXNldCBhbGwgdmFyaWFibGVzIHRvIGRlZmF1bHQgdmFsdWVzLlxcblwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgYWxsX3F1ZXJ5X3ZhcnMge30ge1xuIgotIglnbG9iYWwgcXVlcnlfYW5zX2xpc3QgcXVlcnlfYXJvX2xpc3QgYWxsX3NldHRpbmdzXG4iCi0iCWdsb2JhbCBjYWNoZV9hbGxfcXVlcnlfdmFyc1xuIgotIglcbiIKLSIJaWYgeyRjYWNoZV9hbGxfcXVlcnlfdmFycyAhPSBcIlwifSB7XG4iCi0iCQlyZXR1cm4gJGNhY2hlX2FsbF9xdWVyeV92YXJzXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IHFyeSBcIlwiXG4iCi0iCWZvcmVhY2ggaXRlbSAkcXVlcnlfYW5zX2xpc3Qge1xuIgotIgkJaWYgeyRxcnkgPT0gXCJcIn0ge1xuIgotIgkJCXNldCBxcnkgJGl0ZW1cbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYXBwZW5kIHFyeSBcIiwkaXRlbVwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJZm9yZWFjaCBpdGVtICRxdWVyeV9hcm9fbGlzdCB7XG4iCi0iCQlpZiB7JHFyeSA9PSBcIlwifSB7XG4iCi0iCQkJc2V0IHFyeSAkaXRlbVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlhcHBlbmQgcXJ5IFwiLCRpdGVtXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglzZXQgY2FjaGVfYWxsX3F1ZXJ5X3ZhcnMgJHFyeVxuIgotIlxuIgotIglnbG9iYWwgZW52XG4iCi0iCWlmIFtpbmZvIGV4aXN0cyBlbnYoVEtYMTFWTkNfUFJJTlRfQUxMX1ZBUlMpXSB7XG4iCi0iCQlwdXRzIFwiLS0tLS0tLS0tLS0tLS0tIEJFR0lOIEFMTCBWQVJTIC0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iCQlwdXRzICRxcnlcbiIKLSIJCXB1dHMgXCItLS0tLS0tLS0tLS0tLS0gRU5EIEFMTCBWQVJTIC0tLS0tLS0tLS0tLS0tLVwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJcmV0dXJuICRxcnlcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBxdWVyeV9hbGwge3txdWlldCAwfX0ge1xuIgotIglnbG9iYWwgcXVlcnlfYW5zX2xpc3QgcXVlcnlfYXJvX2xpc3QgYWxsX3NldHRpbmdzXG4iCi0iCWdsb2JhbCBsYXN0X3F1ZXJ5X2FsbF90aW1lXG4iCi0iXG4iCi0iCWR0aW1lIDFcbiIKLSIJc2V0IHFyeSBbYWxsX3F1ZXJ5X3ZhcnNdXG4iCi0iXG4iCi0iCXNldCBxYXJncyBbbGlzdCBcIi1RXCIgJHFyeV1cbiIKLSIJc2V0IGFsbCBbcnVuX3JlbW90ZV9jbWQgJHFhcmdzXVxuIgotIlxuIgotIglpZiB7W3JlZ2V4cCB7YW5zPX0gJGFsbF19IHtcbiIKLSIJCWlmIHshICRxdWlldH0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwiUmV0cmlldmVkIGFsbCBjdXJyZW50IHNldHRpbmdzLlxcblwiXG4iCi0iCQl9XG4iCi0iCQlzZXQgYWxsX3NldHRpbmdzICRhbGxcbiIKLSIJCXVwZGF0ZV9tZW51X3ZhcnMgJGFsbFxuIgotIgl9IGVsc2Uge1xuIgotIgkJaWYgeyEgJHF1aWV0fSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJGYWlsZWQgdG8gcmV0cmlldmUgY3VycmVudCBzZXR0aW5ncy5cXG5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iCXNldCBsYXN0X3F1ZXJ5X2FsbF90aW1lIFtjbG9jayBzZWNvbmRzXVxuIgotIglkdGltZSAyXG4iCi0iCXJldHVybiAkYWxsXG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0X2luZm8ge3N0cn0ge1xuIgotIglnbG9iYWwgaW5mb19zdHIgaW5mb19sYWJlbFxuIgotIiNzZXQgdzEgWyRpbmZvX2xhYmVsIGNnZXQgLXdpZHRoXVxuIgotIiNzZXQgdzIgW3dpbmZvIHdpZHRoICRpbmZvX2xhYmVsXVxuIgotIiNwdXRzIFwic2V0X2luZm86IHc9JHcxICB3aW5mbz0kdzJcIlxuIgotIiNhcHBlbmRfdGV4dCBcIiRzdHJcXG5cIlxuIgotIglzZXQgaW5mb19zdHIgXCIkc3RyXCJcbiIKLSIJdXBkYXRlXG4iCi0ifVxuIgotIlxuIgotInByb2MgYXBwZW5kX3RleHQge3N0cn0ge1xuIgotIglnbG9iYWwgdGV4dF9hcmVhIHRleHRfYXJlYV9zdHJcbiIKLSJcbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgdGV4dF9hcmVhX3N0cl19IHtcbiIKLSIJCXNldCB0ZXh0X2FyZWFfc3RyIFwiXCJcbiIKLSIJfVxuIgotIglhcHBlbmQgdGV4dF9hcmVhX3N0ciAkc3RyXG4iCi0iXG4iCi0iCWlmIHshW2luZm8gZXhpc3RzIHRleHRfYXJlYV19IHtcbiIKLSIJCXB1dHMgc3RkZXJyICRzdHJcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iCWlmIHskdGV4dF9hcmVhID09IFwiXCJ9IHtcbiIKLSIJCXB1dHMgc3RkZXJyICRzdHJcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iCWlmIHshW3dpbmZvIGV4aXN0cyAkdGV4dF9hcmVhXX0ge1xuIgotIgkJcHV0cyBzdGRlcnIgJHN0clxuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSIJXG4iCi0iCSR0ZXh0X2FyZWEgaW5zZXJ0IGVuZCAkc3RyXG4iCi0iCSR0ZXh0X2FyZWEgc2VlIGVuZFxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNob3dfYWxsX3NldHRpbmdzIHt9IHtcbiIKLSIJZ2xvYmFsIGFsbF9zZXR0aW5nc1xuIgotIglnbG9iYWwgY2xpZW50X3NvY2sgY2xpZW50X3RhaWxcbiIKLSIJZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZVxuIgotIlxuIgotIglzZXQgdHh0IFwiXFxuUmVhZC1Xcml0ZSBzZXR0aW5nczpcXG5cXG5cIlxuIgotIglmb3JlYWNoIGl0ZW0gW3NwbGl0X3F1ZXJ5ICRhbGxfc2V0dGluZ3NdICB7XG4iCi0iCQlyZWdzdWIgezp9ICRpdGVtIHs6IH0gaXRlbVxuIgotIgkJYXBwZW5kIHR4dCBcIiAgJGl0ZW1cXG5cIlxuIgotIgkJaWYge1tyZWdleHAge25vcmVtb3RlfSAkaXRlbV19IHtcbiIKLSIJCQlhcHBlbmQgdHh0IFwiXFxuUmVhZC1Pbmx5IHNldHRpbmdzOlxcblxcblwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJYXBwZW5kIHR4dCBcIlxcbkludGVybmFsIHNldHRpbmdzOlxcblxcblwiXG4iCi0iCWFwcGVuZCB0eHQgXCJ4MTF2bmNfY2xpZW50X2ZpbGU6ICR4MTF2bmNfY2xpZW50X2ZpbGVcXG5cIlxuIgotIglpZiB7W2luZm8gZXhpc3RzIGNsaWVudF90YWlsXX0ge1xuIgotIgkJYXBwZW5kIHR4dCBcImNsaWVudF90YWlsOiAkY2xpZW50X3RhaWxcXG5cIlxuIgotIgl9IGVsc2Uge1xuIgotIgkJYXBwZW5kIHR4dCBcImNsaWVudF90YWlsOiB1bnNldFxcblwiXG4iCi0iCX1cbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBjbGllbnRfc29ja119IHtcbiIKLSIJCWFwcGVuZCB0eHQgXCJjbGllbnRfc29jazogJGNsaWVudF9zb2NrXFxuXCJcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWFwcGVuZCB0eHQgXCJjbGllbnRfc29jazogdW5zZXRcXG5cIlxuIgotIgl9XG4iCi0iCXNldCBlc3RyIFwiXCJcbiIKLSIJY2F0Y2gge3NldCBlc3RyIFtleGVjIGVudiB8IGdyZXAgLWkgWDExVk5DXX1cbiIKLSIJYXBwZW5kIHR4dCBcIiRlc3RyXFxuXCJcbiIKLSIJdGV4dHdpbiBcIlNldHRpbmdzXCIgXCJBbGwgQ3VycmVudCBTZXR0aW5nc1wiICR0eHRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzaG93X2xvZ2ZpbGUge30ge1xuIgotIglnbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyXG4iCi0iXG4iCi0iCXNldCBsb2dmaWxlIFt0aWxkZV9leHBhbmQgJG1lbnVfdmFyKGxvZ2ZpbGUpXVxuIgotIglcbiIKLSIJaWYgeyRsb2dmaWxlID09IFwiXCIgfHwgJGxvZ2ZpbGUgPT0gJHVuc2V0X3N0cn0ge1xuIgotIgkJc2V0IHR4dCBcIlxcbk5vIGxvZ2ZpbGUgd2FzIHNwZWNpZmllZCBhdCB4MTF2bmMgc3RhcnR1cC5cXG5cXG5cIglcbiIKLSIJfSBlbHNlaWYgeyFbZmlsZSBleGlzdHMgJGxvZ2ZpbGVdfSB7XG4iCi0iCQlzZXQgdHh0IFwiXFxuTG9nZmlsZSBcXFwiJGxvZ2ZpbGVcXFwiIGRvZXMgbm90IGV4aXN0LlxcblxcblwiXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgZmggXCItM1wiXG4iCi0iCQlzZXQgZXJyIFwiXCJcbiIKLSIJCWNhdGNoIHtzZXQgZmggW29wZW4gJGxvZ2ZpbGUgXCJyXCJdfSBlcnJcbiIKLSIJCWlmIHskZmggPT0gXCItM1wifSB7XG4iCi0iCQkJc2V0IHR4dCBcIlxcbkVycm9yIG9wZW5pbmcgXFxcIiRsb2dmaWxlXFxcIiAkZXJyLlxcblxcblwiXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCB0eHQgXCJcXG5Mb2dmaWxlIFxcXCIkbG9nZmlsZVxcXCIgY3VycmVudCBjb250ZW50czpcXG5cIlxuIgotIgkJCXdoaWxlIHtbZ2V0cyAkZmggbGluZV0gPiAtMX0ge1xuIgotIgkJCQlhcHBlbmQgdHh0IFwiJGxpbmVcXG5cIlxuIgotIgkJCX1cbiIKLSIJCQljbG9zZSAkZmhcbiIKLSIJCX1cbiIKLSIJfVxuIgotIgl0ZXh0d2luIFwiTG9nZmlsZVwiIFwiTG9nZmlsZVwiICR0eHRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB0YWlsX2xvZ2ZpbGUge30ge1xuIgotIglnbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyIGZmb250XG4iCi0iCXNldCBsb2dmaWxlICRtZW51X3Zhcihsb2dmaWxlKVxuIgotIglcbiIKLSIJc2V0IHR4dCBcIlwiXG4iCi0iCWlmIHskbG9nZmlsZSA9PSBcIlwiIHx8ICRsb2dmaWxlID09ICR1bnNldF9zdHJ9IHtcbiIKLSIJCXNldCB0eHQgXCJcXG5ObyBsb2dmaWxlIHdhcyBzcGVjaWZpZWQgYXQgeDExdm5jIHN0YXJ0dXAuXFxuXFxuXCIJXG4iCi0iCX0gZWxzZWlmIHshW2ZpbGUgZXhpc3RzICRsb2dmaWxlXX0ge1xuIgotIgkJc2V0IHR4dCBcIlxcbkxvZ2ZpbGUgXFxcIiRsb2dmaWxlXFxcIiBkb2VzIG5vdCBleGlzdC5cXG5cXG5cIlxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGNtZCBcIlwiXG4iCi0iCQlzZXQgeHRlcm1fY21kIFwieHRlcm0gLXNiIC1mbiAkZmZvbnQgLWdlb21ldHJ5IDgweDQ1IC10aXRsZSB4MTF2bmMtbG9nZmlsZSAtZVwiXG4iCi0iCQlzZXQgY21kIFtzcGxpdCAkeHRlcm1fY21kXVxuIgotIgkJbGFwcGVuZCBjbWQgXCJ0YWlsXCJcbiIKLSIJCWxhcHBlbmQgY21kIFwiLTMwMDBmXCJcbiIKLSIJCWxhcHBlbmQgY21kICRsb2dmaWxlXG4iCi0iCQlsYXBwZW5kIGNtZCBcIiZcIlxuIgotIgkJY2F0Y2gge1tldmFsIGV4ZWMgJGNtZF19XG4iCi0iCX1cbiIKLSIJaWYgeyR0eHQgIT0gXCJcIn0ge1xuIgotIgkJdGV4dHdpbiBcIkxvZ2ZpbGVcIiBcIkxvZ2ZpbGVcIiAkdHh0XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXRfY29ubmVjdGVkIHt5ZXNub30ge1xuIgotIglnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuY1xuIgotIglzZXQgb3JpZyAkY29ubmVjdGVkX3RvX3gxMXZuY1xuIgotIglcbiIKLSIJaWYgeyR5ZXNubyA9PSBcInllc1wifSB7XG4iCi0iCQlzZXQgY29ubmVjdGVkX3RvX3gxMXZuYyAxXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgY29ubmVjdGVkX3RvX3gxMXZuYyAwXG4iCi0iCQlub194MTFfZGlzcGxheVxuIgotIgkJbm9fdm5jX2Rpc3BsYXlcbiIKLSIJfVxuIgotIglpZiB7JG9yaWcgIT0gJGNvbm5lY3RlZF90b194MTF2bmN9IHtcbiIKLSIJCXNldF93aWRnZXRzXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkZXRhY2hfZnJvbV9kaXNwbGF5IHt9IHtcbiIKLSIJZ2xvYmFsIGNvbm5lY3RlZF90b194MTF2bmMgcmVwbHlfeGRpc3BsYXkgeDExdm5jX3hkaXNwbGF5XG4iCi0iCXNldCBzdHIgXCJEZXRhY2hpbmcgZnJvbSBYIGRpc3BsYXkuXCJcbiIKLSIJaWYgeyRyZXBseV94ZGlzcGxheSAhPSBcIlwifSB7XG4iCi0iCQlzZXQgc3RyIFwiRGV0YWNoaW5nIGZyb20gJHJlcGx5X3hkaXNwbGF5LlwiXG4iCi0iCX0gZWxzZWlmIHskeDExdm5jX3hkaXNwbGF5ICE9IFwiXCJ9IHtcbiIKLSIJCXNldCBzdHIgXCJEZXRhY2hpbmcgZnJvbSAkeDExdm5jX3hkaXNwbGF5LlwiXG4iCi0iCX1cbiIKLSIJaWYgeyRjb25uZWN0ZWRfdG9feDExdm5jfSB7XG4iCi0iCQlhcHBlbmRfdGV4dCBcIiRzdHJcXG5cIlxuIgotIgl9XG4iCi0iCXNldF9jb25uZWN0ZWQgbm9cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkb19zdG9wX3F1aXQge30ge1xuIgotIglwdXNoX25ld192YWx1ZSBcInN0b3BcIiBcInN0b3BcIiAxIDBcbiIKLSIJc2V0X2Nvbm5lY3RlZCBub1xuIgotIgl1cGRhdGVcbiIKLSIJYWZ0ZXIgMjUwXG4iCi0iCWRlc3Ryb3kgLlxuIgotIn1cbiIKLSJcbiIKLSIjIE1lbnUgaXRlbSBpcyBhbiBhY3Rpb246XG4iCi0icHJvYyBkb19hY3Rpb24ge2l0ZW19IHtcbiIKLSIJZ2xvYmFsIG1lbnVfdmFyIGNvbm5lY3RlZF90b194MTF2bmMgYmVnaW5uZXJfbW9kZVxuIgotIlxuIgotIglpZiB7W2luX2RlYnVnX21vZGVdfSB7XG4iCi0iCQlhcHBlbmRfdGV4dCBcImFjdGlvbjogXFxcIiRpdGVtXFxcIlxcblwiXG4iCi0iCX1cbiIKLSIjcHV0cyBcImFjdGlvbjogXFxcIiRpdGVtXFxcIlxcblwiXG4iCi0iXG4iCi0iCWlmIHskaXRlbSA9PSBcInBpbmdcIn0ge1xuIgotIgkJaWYgeyRiZWdpbm5lcl9tb2RlfSB7XG4iCi0iCQkJdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbFxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQl0cnlfY29ubmVjdFxuIgotIgkJfVxuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcInN0YXJ0XCJ9IHtcbiIKLSIJCXN0YXJ0X3gxMXZuY1xuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcImRldGFjaFwifSB7XG4iCi0iCQlkZXRhY2hfZnJvbV9kaXNwbGF5XG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwiYXR0YWNoXCJ9IHtcbiIKLSIJCXRyeV9jb25uZWN0X2FuZF9xdWVyeV9hbGxcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJ1cGRhdGUtYWxsXCJ9IHtcbiIKLSIJCXF1ZXJ5X2FsbFxuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcImNsZWFyLWFsbFwifSB7XG4iCi0iCQljbGVhcl9hbGxcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJkZWZhdWx0cy1hbGxcIn0ge1xuIgotIgkJZGVmYXVsdHNfYWxsXG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwic2F2ZS1zZXR0aW5nc1wifSB7XG4iCi0iCQlzYXZlX3NldHRpbmdzXG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwic2hvdy1zdGFydC1jbWRcIn0ge1xuIgotIgkJc2hvd19zdGFydF9jbWRcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJhbGwtc2V0dGluZ3NcIn0ge1xuIgotIgkJc2hvd19hbGxfc2V0dGluZ3NcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJzaG93LWxvZ2ZpbGVcIn0ge1xuIgotIgkJc2hvd19sb2dmaWxlXG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwidGFpbC1sb2dmaWxlXCJ9IHtcbiIKLSIJCXRhaWxfbG9nZmlsZVxuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcIk1pc2MtVHVuaW5nOlwifSB7XG4iCi0iCQltZW51X2hlbHAgXCIkaXRlbVwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwiV2luZG93Vmlld1wifSB7XG4iCi0iCQljaGFuZ2Vfdmlld19zdGF0ZVxuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaXRlbSA9PSBcInF1aXRcIiB8fCAkaXRlbSA9PSBcIlF1aXRcIn0ge1xuIgotIgkJZGVzdHJveSAuXG4iCi0iCQlleGl0IDBcbiIKLSIJfSBlbHNlaWYgeyRpdGVtID09IFwic3RvcCtxdWl0XCJ9IHtcbiIKLSIJCWRvX3N0b3BfcXVpdFxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0ge1xuIgotIgkJaWYgeyEgW2VudHJ5X2RpYWxvZyAkaXRlbV19IHtcbiIKLSIJCQlyZXR1cm5cbiIKLSIJCX1cbiIKLSIJCXNldCBuZXcgJG1lbnVfdmFyKCRpdGVtKVxuIgotIgkJc2V0IG5hbWUgJGl0ZW1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBuZXcgMVxuIgotIgkJc2V0IG5hbWUgJGl0ZW1cbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JGl0ZW0gPT0gXCJsb2FkLXNldHRpbmdzXCJ9IHtcbiIKLSIJCWxvYWRfc2V0dGluZ3NcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHshICRjb25uZWN0ZWRfdG9feDExdm5jfSB7XG4iCi0iCQk7XG4iCi0iCX0gZWxzZWlmIHtbcmVnZXhwIHteKHN0b3B8cXVpdHxleGl0fHNodXRkb3duKSR9ICRpdGVtXX0ge1xuIgotIgkJIyBqdXN0IGRvIC1SXG4iCi0iCQlhcHBlbmRfdGV4dCBcInN0b3BwaW5nIHJlbW90ZSB4MTF2bmMgc2VydmVyLi4uXFxuXCJcbiIKLSIJCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMFxuIgotIgkJc2V0X2Nvbm5lY3RlZCBub1xuIgotIgkJXG4iCi0iCX0gZWxzZWlmIHtbb3B0X21hdGNoIFEgJGl0ZW1dfSB7XG4iCi0iCQlwdXNoX25ld192YWx1ZSAkaXRlbSAkbmFtZSAkbmV3IDFcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXB1c2hfbmV3X3ZhbHVlICRpdGVtICRuYW1lICRuZXcgMFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgcHRpbWUge3RpbWV9IHtcbiIKLSIJc2V0IHVzZWMgW2xpbmRleCBbc3BsaXQgJHRpbWVdIDBdXG4iCi0iCXNldCBzZWMgW2Zvcm1hdCBcIiUuM2ZcIiBbZXhwciBcIiR1c2VjIC8gMTAwMDAwMC4wXCJdXVxuIgotIglwdXRzIFwidGltZTogJHNlYyBzZWNzLlwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgZG9fdmFyIHtpdGVtfSB7XG4iCi0iCWdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jIGl0ZW1fY2FzY2FkZSBtZW51X3ZhclxuIgotIlxuIgotIglzZXQgZGVidWcgW2luX2RlYnVnX21vZGVdXG4iCi0iXG4iCi0iCXNldCBzdHJpbmcgMFxuIgotIglpZiB7W2lzX2FjdGlvbiAkaXRlbV0gfHwgJGl0ZW0gPT0gXCJXaW5kb3dWaWV3XCJ9IHtcbiIKLSIJCSMgTWVudSBpdGVtIGlzIGFjdGlvbjpcbiIKLSIJCWlmIHskZGVidWd9IHtcbiIKLSIJCQlwdGltZSBbdGltZSB7ZG9fYWN0aW9uICRpdGVtfV1cbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJZG9fYWN0aW9uICRpdGVtXG4iCi0iCQl9XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIglpZiB7W3ZhbHVlX2lzX3N0cmluZyAkaXRlbV19IHtcbiIKLSIJCSMgTWVudSBpdGVtIGlzIGEgc3RyaW5nOlxuIgotIgkJaWYgeyRpdGVtX2Nhc2NhZGUoJGl0ZW0pICE9IFwiXCJ9IHtcbiIKLSIJCQkjIENhc2NhZGUgc2V0cyB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5XG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCSMgT3RoZXJ3aXNlIEVudHJ5IGJveFxuIgotIgkJCWlmIHshW2VudHJ5X2RpYWxvZyAkaXRlbV19IHtcbiIKLSIJCQkJcmV0dXJuXG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgkJc2V0IG5ldyAkbWVudV92YXIoJGl0ZW0pXG4iCi0iCQlzZXQgbmFtZSAkaXRlbVxuIgotIgl9IGVsc2Uge1xuIgotIgkJIyBNZW51IGl0ZW0gaXMgYSBib29sZWFuOlxuIgotIgkJc2V0IG5hbWUgW2NoZWNrX3ZhciAkaXRlbV1cbiIKLSIJCWlmIHskbmFtZSA9PSBcIlwifSB7XG4iCi0iCQkJcmV0dXJuXG4iCi0iCQl9XG4iCi0iCQlzZXQgbmV3IDFcbiIKLSIJfVxuIgotIglpZiB7JGNvbm5lY3RlZF90b194MTF2bmN9IHtcbiIKLSIJCWlmIHskZGVidWd9IHtcbiIKLSIJCQlwdGltZSBbdGltZSB7cHVzaF9uZXdfdmFsdWUgJGl0ZW0gJG5hbWUgJG5ldyAxfV1cbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgJGl0ZW0gJG5hbWUgJG5ldyAxXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7JGl0ZW0gPT0gXCJodHRwXCJ9IHtcbiIKLSIJCQlnbG9iYWwgdm5jX3VybFxuIgotIgkJCWFwcGVuZF90ZXh0IFwiICBVUkw6ICR2bmNfdXJsXFxuXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG1lbnVfaGVscCB7aXRlbX0ge1xuIgotIglpZiAhW2hlbHBfd2luICRpdGVtXSB7XG4iCi0iCQl0ZXh0d2luIFwibm9oZWxwXCIgXCJObyBoZWxwIGF2YWlsYWJsZVwiIFxcXG4iCi0iCQkJXCJTb3JyeSwgbm8gaGVscCBhdmFpYWJsZSBmb3IgXFxcIiRpdGVtXFxcIlwiXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBvcHRfbWF0Y2gge2MgaXRlbX0ge1xuIgotIglnbG9iYWwgaXRlbV9vcHRzXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgaXRlbV9vcHRzKCRpdGVtKV19IHtcbiIKLSIJCWlmIHtbcmVnZXhwIFwiXlxcW0EtelxcXSokY1wiICRpdGVtX29wdHMoJGl0ZW0pXX0ge1xuIgotIgkJCXJldHVybiAxXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJcmV0dXJuIDBcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBpc19hY3Rpb24ge2l0ZW19IHtcbiIKLSIJcmV0dXJuIFtvcHRfbWF0Y2ggQSAkaXRlbV1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBpc19ndWlfaW50ZXJuYWwge2l0ZW19IHtcbiIKLSIJaWYgeyRpdGVtID09IFwiUHJvcGVydGllc1wifSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9XG4iCi0iCWlmIHskaXRlbSA9PSBcIlRyYXlcIn0ge1xuIgotIgkJcmV0dXJuIDFcbiIKLSIJfVxuIgotIglyZXR1cm4gW29wdF9tYXRjaCBHICRpdGVtXVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGlzX2Jyb3dzZSB7aXRlbX0ge1xuIgotIglyZXR1cm4gW29wdF9tYXRjaCBGICRpdGVtXVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHZhbHVlX2lzX3N0cmluZyB7aXRlbX0ge1xuIgotIglnbG9iYWwgaXRlbV9ib29sXG4iCi0iCWlmIHshW2luZm8gZXhpc3RzIGl0ZW1fYm9vbCgkaXRlbSldfSB7XG4iCi0iCQlyZXR1cm4gMFxuIgotIgl9XG4iCi0iCWlmIHshICRpdGVtX2Jvb2woJGl0ZW0pfSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9IGVsc2Uge1xuIgotIgkJcmV0dXJuIDBcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHZhbHVlX2lzX2Jvb2wge2l0ZW19IHtcbiIKLSIJZ2xvYmFsIGl0ZW1fYm9vbFxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyBpdGVtX2Jvb2woJGl0ZW0pXX0ge1xuIgotIgkJcmV0dXJuIDBcbiIKLSIJfVxuIgotIglpZiB7JGl0ZW1fYm9vbCgkaXRlbSl9IHtcbiIKLSIJCXJldHVybiAxXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlyZXR1cm4gMFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc3BsaXRfcXVlcnkwIHtxdWVyeX0ge1xuIgotIgkjIG9yaWdpbmFsIHNsb3dlciB3YXkgd2l0aCByZWdleHAvcmVnc3ViXG4iCi0iCXJlZ3N1YiAtYWxsIHthcm89fSAkcXVlcnkge2Fucz19IHF1ZXJ5XG4iCi0iCXNldCBpdGVtcyB7fVxuIgotIgl3aGlsZSB7MX0ge1xuIgotIgkJaWYgeyEgW3JlZ2V4cCB7XmFucz0oLiopJH0gJHF1ZXJ5IG0wIG0xXX0ge1xuIgotIgkJCWJyZWFrXG4iCi0iCQl9XG4iCi0iCQlzZXQgaXRlbSAkbTFcbiIKLSIJCXNldCBtMiBcIlwiXG4iCi0iCQlyZWdleHAgeyxhbnM9LiokfSAkaXRlbSBtMlxuIgotIgkJcmVnc3ViIHssYW5zPS4qJH0gJGl0ZW0gXCJcIiBpdGVtXG4iCi0iCQlpZiB7JGl0ZW0gIT0gXCJcIn0ge1xuIgotIgkJCWxhcHBlbmQgaXRlbXMgJGl0ZW1cbiIKLSIJCX1cbiIKLSIJCXNldCBxdWVyeSAkbTJcbiIKLSIJCXJlZ3N1YiB7Xix9ICRxdWVyeSBcIlwiIHF1ZXJ5XG4iCi0iCX1cbiIKLSIJcmV0dXJuICRpdGVtc1xuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNwbGl0X3F1ZXJ5IHtxdWVyeX0ge1xuIgotIglyZWdzdWIgLWFsbCB7YXJvPX0gJHF1ZXJ5IHthbnM9fSBxdWVyeVxuIgotIglzZXQgaXRlbXMge31cbiIKLSIJd2hpbGUgezF9IHtcbiIKLSIJCXNldCBuIFtzdHJpbmcgZmlyc3QgXCJhbnM9XCIgJHF1ZXJ5XVxuIgotIgkJaWYgeyRuIDwgMH0ge1xuIgotIgkJCWJyZWFrXG4iCi0iCQl9XG4iCi0iCQlzZXQgZnJvbSBbZXhwciAkbis0XVxuIgotIlxuIgotIgkJc2V0IG0gW3N0cmluZyBmaXJzdCBcIixhbnM9XCIgJHF1ZXJ5XVxuIgotIgkJaWYgeyRtIDwgMH0ge1xuIgotIgkJCXNldCBtb3JlIDBcbiIKLSIJCQlzZXQgaXRlbSBbc3RyaW5nIHJhbmdlICRxdWVyeSAkZnJvbSBlbmRdXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBtb3JlIDFcbiIKLSIJCQlzZXQgdG8gICBbZXhwciAkbS0xXVxuIgotIgkJCXNldCBpdGVtIFtzdHJpbmcgcmFuZ2UgJHF1ZXJ5ICRmcm9tICR0b11cbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSAhPSBcIlwifSB7XG4iCi0iCQkJbGFwcGVuZCBpdGVtcyAkaXRlbVxuIgotIgkJfVxuIgotIgkJaWYgeyRtb3JlfSB7XG4iCi0iCQkJaW5jciBtXG4iCi0iCQkJc2V0IHF1ZXJ5IFtzdHJpbmcgcmFuZ2UgJHF1ZXJ5ICRtIGVuZF1cbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IHF1ZXJ5IFwiXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglyZXR1cm4gJGl0ZW1zXG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0X3gxMV9kaXNwbGF5IHtuYW1lfSB7XG4iCi0iCWdsb2JhbCB4MTFfZGlzcGxheVxuIgotIglzZXQgeDExX2Rpc3BsYXkgXCJ4MTF2bmMgWCBkaXNwbGF5OiAkbmFtZVwiXG4iCi0iCXNldF9uYW1lIFwidGt4MTF2bmMgLSAkbmFtZVwiXG4iCi0ifVxuIgotInByb2Mgc2V0X3ZuY19kaXNwbGF5IHtuYW1lfSB7XG4iCi0iCWdsb2JhbCB2bmNfZGlzcGxheSBpY29uX21vZGVcbiIKLSIJc2V0IHZuY19kaXNwbGF5IFwiVk5DIGRpc3BsYXk6ICRuYW1lXCJcbiIKLSJcbiIKLSIJaWYgeyRpY29uX21vZGV9IHtcbiIKLSIJCXNldF9pY29uX2xhYmVsXG4iCi0iCX1cbiIKLSJ9XG4iCi0icHJvYyBzZXRfdm5jX3VybCB7bmFtZX0ge1xuIgotIglnbG9iYWwgdm5jX3VybFxuIgotIglzZXQgdm5jX3VybCAkbmFtZVxuIgotIn1cbiIKLSJwcm9jIG5vX3gxMV9kaXNwbGF5IHt9IHtcbiIKLSIJc2V0X3gxMV9kaXNwbGF5IFwiKCpub25lKilcIlxuIgotIglzZXRfbmFtZSBcInRreDExdm5jXCJcbiIKLSJ9XG4iCi0icHJvYyBub192bmNfZGlzcGxheSB7fSB7XG4iCi0iCXNldF92bmNfZGlzcGxheSBcIigqbm9uZSopXCJcbiIKLSJ9XG4iCi0icHJvYyBub192bmNfdXJsIHt9IHtcbiIKLSIJc2V0X3ZuY191cmwgXCIoKm5vbmUqKVwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgZ2V0X3ZuY19kaXNwbGF5X251bWJlciB7fSB7XG4iCi0iCWdsb2JhbCB2bmNfZGlzcGxheVxuIgotIglpZiAhW2luZm8gZXhpc3RzIHZuY19kaXNwbGF5XSB7XG4iCi0iCQlyZXR1cm4gXCJub25lXCJcbiIKLSIJfVxuIgotIglpZiB7JHZuY19kaXNwbGF5ID09IFwiXCJ9IHtcbiIKLSIJCXJldHVybiBcIm5vbmVcIlxuIgotIgl9XG4iCi0iCXNldCBzdHIgJHZuY19kaXNwbGF5XG4iCi0iCXJlZ3N1YiB7Vk5DIGRpc3BsYXk6ICp9ICRzdHIgXCJcIiBzdHJcbiIKLSIJaWYgW3JlZ2V4cCB7OihbMC05XVswLTldKil9ICRzdHIgbTAgbl0ge1xuIgotIgkJcmV0dXJuICRuXG4iCi0iCX1cbiIKLSIJcmV0dXJuIFwibm9uZVwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgZmV0Y2hfZGlzcGxheXMge30ge1xuIgotIlxuIgotIglzZXQgcWFyZ3MgW2xpc3QgXCItUVwiIFwiZGlzcGxheSx2bmNkaXNwbGF5XCJdXG4iCi0iCXNldCByZXN1bHQgW3J1bl9yZW1vdGVfY21kICRxYXJnc11cbiIKLSJcbiIKLSIJc2V0IGdvdF94MTEgMFxuIgotIglzZXQgZ290X3ZuYyAwXG4iCi0iCXNldCBnb3RfdXJsIDBcbiIKLSJcbiIKLSIJZm9yZWFjaCBpdGVtIFtzcGxpdF9xdWVyeSAkcmVzdWx0XSB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XmRpc3BsYXk6KC4qKSR9ICRpdGVtIG0wIG0xXX0ge1xuIgotIgkJCXNldF94MTFfZGlzcGxheSAkbTFcbiIKLSIJCQlzZXQgZ290X3gxMSAxXG4iCi0iCQl9IGVsc2VpZiB7W3JlZ2V4cCB7XnZuY2Rpc3BsYXk6KC4qKSR9ICRpdGVtIG0wIG0xXX0ge1xuIgotIgkJCXNldF92bmNfZGlzcGxheSAkbTFcbiIKLSIJCQlzZXQgZ290X3ZuYyAxXG4iCi0iCQl9IGVsc2VpZiB7W3JlZ2V4cCB7Xmh0dHBfdXJsOiguKikkfSAkaXRlbSBtMCBtMV19IHtcbiIKLSIJCQlzZXRfdm5jX3VybCAkbTFcbiIKLSIJCQlzZXQgZ290X3VybCAxXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJaWYgeyEgJGdvdF94MTF9IHtcbiIKLSIJCW5vX3gxMV9kaXNwbGF5XG4iCi0iCX1cbiIKLSIJaWYgeyEgJGdvdF92bmN9IHtcbiIKLSIJCW5vX3ZuY19kaXNwbGF5XG4iCi0iCX1cbiIKLSIJaWYgeyEgJGdvdF91cmx9IHtcbiIKLSIJCW5vX3ZuY191cmxcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGNsaWVudF9kaWFsb2cge2NsaWVudH0ge1xuIgotIglzZXQgY2lkIFwiXCJcbiIKLSIJc2V0IGhvc3QgXCJcIlxuIgotIglzZXQgaXAgXCJcIlxuIgotIglnbG9iYWwgbWVudV92YXIgdGV4dF9hcmVhIGNsZWFudXBfd2luZG93IGl0ZW1fYm9vbFxuIgotIlxuIgotIgkjPGlkPjo8aXA+Ojxwb3J0Pjo8dXNlcj46PHVuaXg+Ojxob3N0bmFtZT46PGlucHV0Pjo8bG9naW52aWV3Pjo8dGltZT5cbiIKLSIJYXBwZW5kX3RleHQgXCJcXG5DbGllbnQgaW5mbyBzdHJpbmc6XFxuIC0gJGNsaWVudFxcblxcblwiXG4iCi0iCWlmIHtbcmVnZXhwIHteKC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKikkfSBcXFxuIgotIgkgICAgJGNsaWVudCBtMCBtMSBtMiBtMyBtNCBtNSBtNiBtNyBtOCBtOV19IHtcbiIKLSIJCXNldCBjaWQgICRtMVxuIgotIgkJc2V0IGlwICAgJG0yXG4iCi0iCQlzZXQgcG9ydCAkbTNcbiIKLSIJCXNldCB1c2VyICRtNFxuIgotIgkJc2V0IHVuaXggJG01XG4iCi0iCQlzZXQgaG9zdCAkbTZcbiIKLSIJCXJlZ3N1YiB7XFwuLiokfSAkaG9zdCBcIlwiIGhvc3RcbiIKLSIJCXNldCBpbnB1dCAkbTdcbiIKLSIJCXNldCBsb2d2byAkbThcbiIKLSIJCXNldCBsdGltZSAkbTlcbiIKLSIJCWFwcGVuZF90ZXh0IFwiSG9zdDogJGhvc3QsIFBvcnQ6ICRwb3J0LCBVc2VyOiAkdXNlclwiXG4iCi0iCQlpZiB7JHVuaXggIT0gXCJcIiAmJiAkdW5peCAhPSBcIm5vbmVcIn0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwiLCBVbml4OiAkdW5peFwiXG4iCi0iCQl9XG4iCi0iCQlhcHBlbmRfdGV4dCBcIiwgSVA6ICRpcCwgSWQ6ICRjaWRcXG5cIlxuIgotIgkJYXBwZW5kX3RleHQgXCIgLSBvcmlnaW5hbGx5IGxvZ2dlZCBpbiBhczogXCJcbiIKLSIJCWlmIHskbG9ndm8gPT0gXCIxXCIgfSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJWaWV3LU9ubHkgQ2xpZW50XCJcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJOb3JtYWwgQ2xpZW50XCJcbiIKLSIJCX1cbiIKLSIJCWlmIHskbHRpbWUgIT0gXCJcIn0ge1xuIgotIgkJCXNldCB0aW0gW2Nsb2NrIGZvcm1hdCAkbHRpbWVdXG4iCi0iCQkJYXBwZW5kX3RleHQgXCIsICAkdGltXCJcbiIKLSIJCX1cbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFxuXCJcbiIKLSIJCWFwcGVuZF90ZXh0IFwiIC0gY3VycmVudGx5IGFsbG93ZWQgaW5wdXQ6IFwiXG4iCi0iCQlzZXQgc2sgMFxuIgotIgkJc2V0IHNtIDBcbiIKLSIJCXNldCBzYiAwXG4iCi0iCQlzZXQgc2MgMFxuIgotIgkJc2V0IHNmIDBcbiIKLSIJCWlmIHtbcmVnZXhwIC1ub2Nhc2Uge0t9ICRpbnB1dF19IHtcbiIKLSIJCQlhcHBlbmRfdGV4dCBcIktleXN0cm9rZXNcIlxuIgotIgkJCXNldCBzayAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtNfSAkaW5wdXRdfSB7XG4iCi0iCQkJaWYgeyRza30ge1xuIgotIgkJCQlhcHBlbmRfdGV4dCBcIiwgXCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJNb3VzZS1Nb3Rpb25cIlxuIgotIgkJCXNldCBzbSAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtCfSAkaW5wdXRdfSB7XG4iCi0iCQkJaWYgeyRzayB8fCAkc219IHtcbiIKLSIJCQkJYXBwZW5kX3RleHQgXCIsIFwiXG4iCi0iCQkJfVxuIgotIgkJCWFwcGVuZF90ZXh0IFwiQnV0dG9uLUNsaWNrXCJcbiIKLSIJCQlzZXQgc2IgMVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAgLW5vY2FzZSB7Q30gJGlucHV0XX0ge1xuIgotIgkJCWlmIHskc2sgfHwgJHNtIHx8ICRzYn0ge1xuIgotIgkJCQlhcHBlbmRfdGV4dCBcIiwgXCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJDbGlwYm9hcmRcIlxuIgotIgkJCXNldCBzbSAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCAtbm9jYXNlIHtGfSAkaW5wdXRdfSB7XG4iCi0iCQkJaWYgeyRzayB8fCAkc20gfHwgJHNiIHx8ICRzZn0ge1xuIgotIgkJCQlhcHBlbmRfdGV4dCBcIiwgXCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJGaWxlc1wiXG4iCi0iCQkJc2V0IHNmIDFcbiIKLSIJCX1cbiIKLSIJCWlmIHshICRzayAmJiAhICRzbSAmJiAhICRzYiAmJiAhICRzbSAmJiAhICRzZn0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwiTm9uZVwiXG4iCi0iCQl9XG4iCi0iCQlhcHBlbmRfdGV4dCBcIlxcblwiXG4iCi0iCX1cbiIKLSIJaWYgeyRjaWQgPT0gXCJcIn0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJJbnZhbGlkIGNsaWVudCBpbmZvIHN0cmluZzogJGNsaWVudFxcblwiXG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIglyZWdzdWIgLWFsbCB7X30gJGlucHV0IFwiXCIgaW5wdXRcbiIKLSIJc2V0IG1lbnVfdmFyKGNsaWVudCkgXCIkaW5wdXRcIlxuIgotIglzZXQgaXRlbV9ib29sKGNsaWVudCkgMFxuIgotIlxuIgotIglpbnNlcnRfY2xpZW50X2FjdGlvbl93aW5kb3cgJGlucHV0XG4iCi0iCXNldCByYyBbZW50cnlfZGlhbG9nIGNsaWVudCAxXVxuIgotIlxuIgotIgljbGVhbnVwX3RleHRfd2luZG93XG4iCi0iXG4iCi0iCXNldCB2YWwgJG1lbnVfdmFyKGNsaWVudClcbiIKLSIJI3B1dHMgXCJyYzogJHJjICB2YWw6ICR2YWxcIlxuIgotIlxuIgotIglpZiB7ISAkcmN9IHtcbiIKLSIJCXJldHVybjtcbiIKLSIJfSBlbHNlaWYge1tyZWdleHAgLW5vY2FzZSB7KGRpc2Nvbm5lY3R8Y2xvc2UpfSAkdmFsXX0ge1xuIgotIgkJZGlzY29ubmVjdF9kaWFsb2cgJGNsaWVudFxuIgotIgl9IGVsc2Uge1xuIgotIgkJcmVnc3ViIC1hbGwgLW5vY2FzZSB7W15LTUJDRl19ICR2YWwgXCJcIiB2YWxcbiIKLSIJCXNldCBpdGVtX2Jvb2woY2xpZW50X2lucHV0KSAwXG4iCi0iCQlwdXNoX25ld192YWx1ZSBcImNsaWVudF9pbnB1dFwiIFwiY2xpZW50X2lucHV0XCIgXCIkY2lkOiR2YWxcIiAwXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkaXNjb25uZWN0X2RpYWxvZyB7Y2xpZW50fSB7XG4iCi0iCXNldCBjaWQgXCJcIlxuIgotIglzZXQgaG9zdCBcIlwiXG4iCi0iCXNldCBtc2cgXCJcXG5cIlxuIgotIglhcHBlbmQgbXNnIFwiKioqIENsaWVudCBpbmZvIHN0cmluZzpcXG4gICAgJGNsaWVudFxcblwiXG4iCi0iCWlmIHtbcmVnZXhwIHteKC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKikkfSBcXFxuIgotIgkgICAgJGNsaWVudCBtMCBtMSBtMiBtMyBtNCBtNSBtNiBtNyBtOCBtOV19IHtcbiIKLSIJCXNldCBjaWQgICRtMVxuIgotIgkJc2V0IGlwICAgJG0yXG4iCi0iCQlzZXQgcG9ydCAkbTNcbiIKLSIJCXNldCB1c2VyICRtNFxuIgotIgkJc2V0IHVuaXggJG01XG4iCi0iCQlzZXQgaG9zdCAkbTZcbiIKLSIJCXJlZ3N1YiB7XFwuLiokfSAkaG9zdCBcIlwiIGhvc3RcbiIKLSIJCXNldCBpbnB1dCAkbTdcbiIKLSIJCXNldCBsb2d2byAkbThcbiIKLSIJCXNldCBsdGltZSAkbTlcbiIKLSIJCWFwcGVuZF90ZXh0IFwiSG9zdDogJGhvc3QsIFBvcnQ6ICRwb3J0LCBJUDogJGlwLCBVc2VyOiAkdXNlclwiXG4iCi0iCQlpZiB7JHVuaXggIT0gXCJcIiAmJiAkdW5peCAhPSBcIm5vbmVcIn0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwiLCBVbml4OiAkdW5peFwiXG4iCi0iCQl9XG4iCi0iCQlhcHBlbmRfdGV4dCBcIiwgSWQ6ICRjaWRcXG5cIlxuIgotIgl9XG4iCi0iCWlmIHskY2lkID09IFwiXCJ9IHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiSW52YWxpZCBjbGllbnQgaW5mbyBzdHJpbmc6ICRjbGllbnRcXG5cIlxuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSIJYXBwZW5kIG1zZyBcIioqKiBUbyAqRElTQ09OTkVDVCogdGhpcyBjbGllbnQgcHJlc3MgXFxcIk9LXFxcIiBhZ2Fpbiwgb3RoZXJ3aXNlIHByZXNzIFxcXCJDYW5jZWxcXFwiXFxuXCJcbiIKLSIJYmVsbFxuIgotIglpZiB7W3dhcm5pbmdfZGlhbG9nICRtc2cgXCJjdXJyZW50XCJdfSB7XG4iCi0iCQlwdXNoX25ld192YWx1ZSBcImRpc2Nvbm5lY3RcIiBcImRpc2Nvbm5lY3RcIiAkY2lkIDFcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiZGlzY29ubmVjdCBjYW5jZWxsZWQuXFxuXCJcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHVwZGF0ZV9jbGllbnRzX2FuZF9yZXBvc3Qge30ge1xuIgotIglnbG9iYWwgaXRlbV9jYXNjYWRlIG1lbnVfbSBtZW51X2JcbiIKLSJcbiIKLSIJYXBwZW5kX3RleHQgXCJSZWZyZXNoaW5nIGNvbm5lY3RlZCBjbGllbnRzIGxpc3QuLi4gXCJcbiIKLSIJcXVlcnlfYWxsIDFcbiIKLSIJdXBkYXRlXG4iCi0iXG4iCi0iCXNldCBzYXcgMFxuIgotIglzZXQgY2FzYyAkaXRlbV9jYXNjYWRlKGN1cnJlbnQpXG4iCi0iCXNldCBsYXN0IFskY2FzYyBpbmRleCBlbmRdXG4iCi0iCWZvciB7c2V0IGkgMH0geyRpIDw9ICRsYXN0fSB7aW5jciBpfSB7XG4iCi0iCQlpZiB7WyRjYXNjIHR5cGUgJGldID09IFwic2VwYXJhdG9yXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJc2V0IG5hbWUgWyRjYXNjIGVudHJ5Y2dldCAkaSAtbGFiZWxdXG4iCi0iCQlpZiB7W3JlZ2V4cCB7Xm51bS1jbGllbnRzfSAkbmFtZV19IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge15yZWZyZXNoLWxpc3R9ICRuYW1lXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlpZiB7ISAkc2F3fSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJcXG5cIlxuIgotIgkJfVxuIgotIgkJc2V0IHNhdyAxXG4iCi0iCQlhcHBlbmRfdGV4dCBcImNsaWVudDogJG5hbWVcXG5cIlxuIgotIgl9XG4iCi0iCWlmIHshICRzYXd9IHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiZG9uZS5cXG5cIlxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgdXBkYXRlX2NsaWVudHNfbWVudSB7bGlzdH0ge1xuIgotIglnbG9iYWwgaXRlbV9jYXNjYWRlIGZmb250XG4iCi0iCWdsb2JhbCBzYXZlZF9jbGllbnRzX3N0clxuIgotIlxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyBzYXZlZF9jbGllbnRzX3N0cl19IHtcbiIKLSIJCXNldCBzYXZlZF9jbGllbnRzX3N0ciBcIlwiXG4iCi0iCX1cbiIKLSIJaWYgeyRsaXN0ID09IFwiSU5JVFwifSB7XG4iCi0iCQlzZXQgbGlzdCAkc2F2ZWRfY2xpZW50c19zdHJcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBzYXZlZF9jbGllbnRzX3N0ciAkbGlzdFxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBzdWJtICRpdGVtX2Nhc2NhZGUoY3VycmVudCk7XG4iCi0iCWNhdGNoIHtkZXN0cm95ICRzdWJtfVxuIgotIgltZW51ICRzdWJtIC10ZWFyb2ZmIDAgLWZvbnQgJGZmb250XG4iCi0iCSRzdWJtIGFkZCBjb21tYW5kXG4iCi0iCSRzdWJtIGFkZCBjb21tYW5kIC1sYWJlbCBcInJlZnJlc2gtbGlzdFwiIFxcXG4iCi0iCQktY29tbWFuZCBcInVwZGF0ZV9jbGllbnRzX2FuZF9yZXBvc3RcIlxuIgotIgkkc3VibSBhZGQgc2VwYXJhdG9yXG4iCi0iCXNldCBjb3VudCAwXG4iCi0iCWZvcmVhY2ggY2xpZW50IFtzcGxpdCAkbGlzdCBcIixcIl0ge1xuIgotIgkJaWYgeyFbcmVnZXhwIHteW2EtejAtOV0qW2EtejAtOV06fSAkY2xpZW50XX0ge1xuIgotIgkJCSNhcHBlbmRfdGV4dCBcIlNraXBwaW5nIGNsaWVudCBsaW5lOiBcIlxuIgotIgkJCSNhcHBlbmRfdGV4dCAkY2xpZW50XG4iCi0iCQkJI2FwcGVuZF90ZXh0IFwiXFxuXCJcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJcmVnc3ViIC1hbGwge1t7fSgpfiEkJip8OydcImB7fTw+XFxbXFxdXX0gJGNsaWVudCBcIlwiIGNsaWVudFxuIgotIgkJIydcbiIKLSIJCWlmIHtbcmVnZXhwIHteKC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKikkfSBcXFxuIgotIgkJICAgICRjbGllbnQgbTAgbTEgbTIgbTMgbTQgbTUgbTYgbTcgbTggbTldfSB7XG4iCi0iCQkJc2V0IGlkICAgJG0xXG4iCi0iCQkJc2V0IHVzZXIgJG00XG4iCi0iCQkJc2V0IHVuaXggJG01XG4iCi0iCQkJc2V0IGhvc3QgJG02XG4iCi0iCQkJcmVnc3ViIHtcXC4uKiR9ICRob3N0IFwiXCIgaG9zdFxuIgotIgkJCXNldCBjbGFiZWwgXCIkaG9zdCAkaWRcIlxuIgotIgkJCWlmIHskdW5peCAhPSBcIlwiICYmICR1bml4ICE9IFwibm9uZVwifSB7XG4iCi0iCQkJCXNldCBjbGFiZWwgXCIkdW5peEAkY2xhYmVsXCJcbiIKLSIJCQl9IGVsc2VpZiB7JHVzZXIgIT0gXCJ1bmtub3duLXVzZXJcIn0ge1xuIgotIgkJCQlzZXQgY2xhYmVsIFwiJHVzZXJAJGNsYWJlbFwiXG4iCi0iCQkJfVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlyZWdzdWIgezouKiR9ICRjbGllbnQgXCJcIiBjbGFiZWxcbiIKLSIJCX1cbiIKLSIJCSRzdWJtIGFkZCBjb21tYW5kIC1sYWJlbCBcIiRjbGFiZWxcIiBcXFxuIgotIgkJCS1jb21tYW5kIFwiY2xpZW50X2RpYWxvZyBcXHskY2xpZW50XFx9XCJcbiIKLSIJCWluY3IgY291bnRcbiIKLSIJfVxuIgotIgkkc3VibSBlbnRyeWNvbmZpZ3VyZSAwIC1sYWJlbCBcIm51bS1jbGllbnRzOiAkY291bnRcIlxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNldF93aWRnZXRzIHt9IHtcbiIKLSIJZ2xvYmFsIGNvbm5lY3RlZF90b194MTF2bmMgaXRlbV9jYXNlIGl0ZW1fbWVudSBpdGVtX2VudHJ5IG1lbnVfbVxuIgotIlxuIgotIglmb3JlYWNoIGl0ZW0gW2FycmF5IG5hbWVzIGl0ZW1fY2FzZV0ge1xuIgotIgkJaWYgIVtpbmZvIGV4aXN0cyBpdGVtX2Nhc2UoJGl0ZW0pXSB7IGNvbnRpbnVlOyB9XG4iCi0iCQlzZXQgY2FzZSAkaXRlbV9jYXNlKCRpdGVtKVxuIgotIgkJaWYgIVtpbmZvIGV4aXN0cyBpdGVtX21lbnUoJGl0ZW0pXSB7IGNvbnRpbnVlOyB9XG4iCi0iCQlzZXQgbWVudSAkaXRlbV9tZW51KCRpdGVtKVxuIgotIgkJaWYgIVtpbmZvIGV4aXN0cyBpdGVtX2VudHJ5KCRpdGVtKV0geyBjb250aW51ZTsgfVxuIgotIgkJc2V0IGVudHJ5ICRpdGVtX2VudHJ5KCRpdGVtKVxuIgotIgkJaWYgeyRlbnRyeSA8IDB9IHtcbiIKLSIJCQkjIHNraXAgY2FzZSB1bmRlciBiZWdpbm5lcl9tb2RlIFxuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlzZXQgdHlwZSBbJG1lbnUgdHlwZSAkZW50cnldXG4iCi0iCQlpZiB7JHR5cGUgPT0gXCJzZXBhcmF0b3JcIiB8fCAkdHlwZSA9PSBcInRlYXJvZmZcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iCQlpZiB7IVt3aW5mbyBleGlzdHMgJG1lbnVdfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHskY29ubmVjdGVkX3RvX3gxMXZuY30ge1xuIgotIgkJCWlmIHtbYWN0aXZlX3doZW5fY29ubmVjdGVkICRpdGVtXX0ge1xuIgotIgkJCQkkbWVudSBlbnRyeWNvbmZpZ3VyZSAkZW50cnkgLXN0YXRlIG5vcm1hbFxuIgotIgkJCX0gZWxzZSB7XG4iCi0iCQkJCSRtZW51IGVudHJ5Y29uZmlndXJlICRlbnRyeSAtc3RhdGUgZGlzYWJsZWRcbiIKLSIJCQl9XG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCWlmIHtbYWN0aXZlX3doZW5fc3RhcnRpbmcgJGl0ZW1dfSB7XG4iCi0iCQkJCSRtZW51IGVudHJ5Y29uZmlndXJlICRlbnRyeSAtc3RhdGUgbm9ybWFsXG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJJG1lbnUgZW50cnljb25maWd1cmUgJGVudHJ5IC1zdGF0ZSBkaXNhYmxlZFxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHRvZ2dsZV9zaW1wbGVfZ3VpIHt9IHtcbiIKLSIJZ2xvYmFsIGJlZ2lubmVyX21vZGUgc2ltcGxlX2d1aV9jcmVhdGVkXG4iCi0iCWdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jIG1ha2VfZ3VpX2NvdW50XG4iCi0iXG4iCi0iCWlmIHskYmVnaW5uZXJfbW9kZX0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJcXG5Td2l0Y2hpbmcgdG8gc2ltcGxlLWd1aSBtb2RlLlxcblwiXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlhcHBlbmRfdGV4dCBcIlxcblN3aXRjaGluZyB0byBwb3dlci11c2VyIGd1aSBtb2RlLlxcblwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRtYWtlX2d1aV9jb3VudCA9PSAxfSB7XG4iCi0iCQlpbmNyIG1ha2VfZ3VpX2NvdW50XG4iCi0iCX1cbiIKLSIJc2V0IHNpbXBsZV9ndWlfY3JlYXRlZCAxXG4iCi0iCW1ha2VfbWVudV9pdGVtc1xuIgotIglzZXRfd2lkZ2V0c1xuIgotIglzZXRfaW50ZXJuYWxfaGVscFxuIgotIglhcHBlbmRfdGV4dCBcIlxcblwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgbGl0dGxlX3FzIHttfSB7XG4iCi0iCWdsb2JhbCBiZm9udCBmZm9udCBiZWdpbm5lcl9tb2RlXG4iCi0iCWdsb2JhbCBoZWxwcmVtb3RlIGhlbHB0ZXh0IGhlbHBsYWJlbFxuIgotIglnbG9iYWwgdGtfdmVyc2lvbiBvc25hbWVcbiIKLSJcbiIKLSIJaWYgeyR0a192ZXJzaW9uIDwgOC4wfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglpZiB7JG9zbmFtZSA9PSBcIkRhcndpblwifSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgbiBbJG0gaW5kZXggZW5kXVxuIgotIlxuIgotIglmb3Ige3NldCBpIDB9IHskaSA8PSAkbn0ge2luY3IgaX0ge1xuIgotIgkJc2V0IHR5cGUgWyRtIHR5cGUgJGldXG4iCi0iI3B1dHMgXCIkbSAtICRpIC0gJHR5cGVcIlxuIgotIgkJaWYgeyR0eXBlID09IFwic2VwYXJhdG9yXCJ9IHtcbiIKLSIJCQkkbSBhZGQgc2VwYXJhdG9yXG4iCi0iCQl9IGVsc2VpZiB7JHR5cGUgPT0gXCJ0ZWFyb2ZmXCJ9IHtcbiIKLSIJCQljb250aW51ZTtcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IGxhYmVsIFskbSBlbnRyeWNnZXQgJGkgLWxhYmVsXVxuIgotIgkJCXNldCBzdHIgXCJcIlxuIgotIgkJCWlmIHtbaW5mbyBleGlzdHMgaGVscHJlbW90ZSgkbGFiZWwpXX0ge1xuIgotIgkJCQlzZXQgc3RyIFwiKD8pXCJcbiIKLSIJCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlbHB0ZXh0KCRsYWJlbCldfSB7XG4iCi0iCQkJCXNldCBzdHIgXCIoPylcIlxuIgotIgkJCX1cbiIKLSIJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgJHN0ciBcXFxuIgotIgkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJLWNvbW1hbmQgXCJtZW51X2hlbHAgJGxhYmVsXCI7XG4iCi0iXG4iCi0iCQkJaWYgeyRzdHIgPT0gXCJcIn0ge1xuIgotIgkJCQkkbSBlbnRyeWNvbmZpZ3VyZSBlbmQgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQkJfVxuIgotIgkJCXNldCBhcmcgXCIkbSwkaVwiXG4iCi0iI3B1dHMgXCJoZWxwbGFiZWw6ICRhcmcgLT4gJGxhYmVsXCJcbiIKLSIJCQlzZXQgaGVscGxhYmVsKCRhcmcpICRsYWJlbFxuIgotIgkJCXNldCBqIFskbSBpbmRleCBlbmRdXG4iCi0iCQkJc2V0IGFyZyBcIiRtLCRqXCJcbiIKLSIJCQlzZXQgaGVscGxhYmVsKCRhcmcpICRsYWJlbFxuIgotIgkJfVxuIgotIgkJaWYgeyRpID09IDB9IHtcbiIKLSIJCQkkbSBlbnRyeWNvbmZpZ3VyZSBlbmQgLWNvbHVtbmJyZWFrIDFcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIgltZW51X2JpbmRpbmdzICRtXG4iCi0ifVxuIgotIlxuIgotInByb2MgbWFrZV9tZW51X2l0ZW1zIHt9IHtcbiIKLSIJZ2xvYmFsIHRlbXBsYXRlIFxuIgotIglnbG9iYWwgbWVudV9iIG1lbnVfbSBtZW51X2NvdW50XG4iCi0iCWdsb2JhbCBpdGVtX29wdHMgaXRlbV9ib29sIGl0ZW1fY2FzZSBpdGVtX21lbnUgaXRlbV9lbnRyeSBtZW51X3ZhciB1bnNldF9zdHJcbiIKLSIJZ2xvYmFsIGl0ZW1fY2FzY2FkZVxuIgotIglnbG9iYWwgYmZvbnQgZmZvbnQgYmVnaW5uZXJfbW9kZSBzaW1wbGVfZ3VpX2NyZWF0ZWRcbiIKLSIJZ2xvYmFsIGhlbHB0ZXh0IGhlbHByZW1vdGUgaGVscGxhYmVsXG4iCi0iXG4iCi0iCSMgc29tZSB0d2Vha3MuLi5cbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIoZGVueSldfSB7XG4iCi0iCQlzZXQgbWVudV92YXIoZGVueSkgMFxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBjYXNlIFwiXCI7XG4iCi0iCXNldCBMX2Nhc2MgXCJcIlxuIgotIglzZXQgTF9jYXNjX2NvdW50IDBcbiIKLSIJc2V0IExfbWVudXMgW2xpc3RdXG4iCi0iXG4iCi0iCSMgRXh0cmFjdCB0aGUgbWVudSBpdGVtczpcbiIKLSIJZm9yZWFjaCBsaW5lIFtzcGxpdCAkdGVtcGxhdGUgXCJcXG5cIl0ge1xuIgotIgkJaWYge1tyZWdleHAge15Sb3c6fSAkbGluZV19IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge15bQS16XX0gJGxpbmVdfSB7XG4iCi0iCQkJc2V0IGNhc2UgW3N0cmluZyB0cmltICRsaW5lXVxuIgotIlxuIgotIgkJCWlmIHskc2ltcGxlX2d1aV9jcmVhdGVkfSB7XG4iCi0iCQkJCXNldCBpMCAwXG4iCi0iCQkJCSNpZiB7JGNhc2UgPT0gXCJNaXNjXCJ9IHsgIyBrbHVkZ2UgZm9yIHNpbXBsZV9ndWlcbiIKLSIJCQkJIwlzZXQgaTAgMVxuIgotIgkJCQkjfVxuIgotIgkJCQljYXRjaCB7JG1lbnVfbSgkY2FzZSkgZGVsZXRlICRpMCBlbmR9XG4iCi0iCQkJfVxuIgotIgkJCXNldCBtZW51X2NvdW50KCRjYXNlKSAwXG4iCi0iCQkJY29udGludWU7XG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlzZXQgaXRlbSBbc3RyaW5nIHRyaW0gJGxpbmVdXG4iCi0iCQlyZWdzdWIgLWFsbCB7ICAqfSAkaXRlbSBcIiBcIiBpdGVtXG4iCi0iCQlpZiB7JGl0ZW0gPT0gXCJcIn0ge1xuIgotIgkJCWNvbnRpbnVlO1xuIgotIgkJfVxuIgotIgkJc2V0IG9wdHMgXCJcIlxuIgotIgkJaWYge1tyZWdleHAge149fSAkaXRlbV19IHtcbiIKLSIJCQlzZXQgb3B0cyBbbGluZGV4IFtzcGxpdCAkaXRlbV0gMF1cbiIKLSIJCQlyZWdzdWIge149fSAkb3B0cyBcIlwiIG9wdHNcbiIKLSIJCQlzZXQgaXRlbSBbbGluZGV4IFtzcGxpdCAkaXRlbV0gMV1cbiIKLSIJCX1cbiIKLSIJCWlmIHtbcmVnZXhwIHteMH0gJG9wdHNdfSB7XG4iCi0iCQkJY29udGludWU7XG4iCi0iCQl9XG4iCi0iCQlpZiB7W3JlZ2V4cCB7OiR9ICRpdGVtXX0ge1xuIgotIgkJCXNldCBib29sIDBcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IGJvb2wgMVxuIgotIgkJfVxuIgotIgkJcmVnc3ViIHs6JH0gJGl0ZW0ge30gaXRlbVxuIgotIlxuIgotIgkJaWYgeyRpdGVtID09IFwiTE9GRlwifSB7XG4iCi0iCQkJc2V0IExfY2FzYyBcIlwiXG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCWlmIHskaXRlbSA9PSBcIi0tIERcIn0ge1xuIgotIgkJCXNldCBiZWdpbm5lcl9zZXAgMVxuIgotIgkJCXNldCBpdGVtIFwiLS1cIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgYmVnaW5uZXJfc2VwIDBcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCXNldCBpdGVtX29wdHMoJGl0ZW0pICRvcHRzXG4iCi0iCQlzZXQgaXRlbV9jYXNlKCRpdGVtKSAkY2FzZVxuIgotIgkJc2V0IGl0ZW1fYm9vbCgkaXRlbSkgJGJvb2xcbiIKLSIJCXNldCBpdGVtX2Nhc2NhZGUoJGl0ZW0pIFwiXCJcbiIKLSJcbiIKLSIJCWlmIHskTF9jYXNjID09IFwiXCJ9IHtcbiIKLSIJCQlzZXQgaXRlbV9lbnRyeSgkaXRlbSkgJG1lbnVfY291bnQoJGNhc2UpXG4iCi0iCQkJc2V0IG0gJG1lbnVfbSgkY2FzZSlcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJIyBoYWNrIGZvciBjYXNjYWRlcyBmb3IgY3Jvd2RlZCBtZW51cy4gIFNlZSA9R0FMIG9wdHMuXG4iCi0iCQkJc2V0IGl0ZW1fZW50cnkoJGl0ZW0pICRMX2Nhc2NfY291bnRcbiIKLSIJCQlzZXQgbSAkTF9jYXNjXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlzZXQgbXZhciAwIFxuIgotIlxuIgotIgkJaWYgeyRiZWdpbm5lcl9tb2RlICYmICEgJGJlZ2lubmVyX3NlcCAmJiAhW29wdF9tYXRjaCBEICRpdGVtXX0ge1xuIgotIgkJCXNldCBpdGVtX2VudHJ5KCRpdGVtKSBcIi0xXCJcbiIKLSIJCQljb250aW51ZTtcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCXNldCBpdGVtX21lbnUoJGl0ZW0pICRtXG4iCi0iXG4iCi0iCQlpZiB7MH0geyBwdXRzIFwiSVRFTTogJGl0ZW1cXHQtICRvcHRzXFx0LSAkY2FzZVxcdC0gXFxcbiIKLSIJCQkkYm9vbFxcdC0gJG1lbnVfY291bnQoJGNhc2UpXCIgfVxuIgotIlxuIgotIgkJIyBDcmVhdGUgdGhlIG1lbnUgaXRlbXMsIGl0cyB2YXJpYWJsZXMsIGV0Yy4sIGV0Yy5cbiIKLSJcbiIKLSIJCWlmIHskaXRlbSA9PSBcIi0tXCJ9IHtcbiIKLSIJCQkkbSBhZGQgc2VwYXJhdG9yXG4iCi0iXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJRdWl0XCJ9IHtcbiIKLSIJCQkjIFF1aXQgaXRlbSBtdXN0IHNodXQgdXMgZG93bjpcbiIKLSIJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgXCIkaXRlbVwiIC11bmRlcmxpbmUgMCBcXFxuIgotIgkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJLWNvbW1hbmQge2Rlc3Ryb3kgLjsgZXhpdCAwfVxuIgotIlxuIgotIgkJfSBlbHNlaWYgeyRjYXNlID09IFwiSGVscFwifSB7XG4iCi0iCQkJIyBIZWxwIGlzIHNpbXBsZSBoZWxwOlxuIgotIgkJCSRtIGFkZCBjb21tYW5kIC1sYWJlbCBcIiRpdGVtXCIgXFxcbiIKLSIJCQkJLWZvbnQgJGZmb250IFxcXG4iCi0iCQkJCS1jb21tYW5kIFwibWVudV9oZWxwICRpdGVtXCJcbiIKLSJcbiIKLSIJCX0gZWxzZWlmIHtbb3B0X21hdGNoIEwgJGl0ZW1dfSB7XG4iCi0iCQkJIyBTcGVjaWFsIHN1Yi1tZW51IGNhc2NhZGUgKD1HQUwgZW5kcyB3aXRoIExPRkYpXG4iCi0iCQkJc2V0IHN1Ym0gJG0uY2FzY19MJG1lbnVfY291bnQoJGNhc2UpXG4iCi0iCQkJY2F0Y2gge2Rlc3Ryb3kgJHN1Ym19XG4iCi0iCQkJbWVudSAkc3VibSAtdGVhcm9mZiAwIC1mb250ICRmZm9udFxuIgotIgkJCXNldCBpdGVtX2Nhc2NhZGUoJGl0ZW0pICRzdWJtXG4iCi0iCQkJJG0gYWRkIGNhc2NhZGUgLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJLW1lbnUgJHN1Ym1cbiIKLSIJCQlzZXQgTF9jYXNjICRzdWJtXG4iCi0iCQkJc2V0IExfY2FzY19jb3VudCAtMVxuIgotIgkJCWxhcHBlbmQgTF9tZW51cyAkTF9jYXNjXG4iCi0iXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJjdXJyZW50XCJ9IHtcbiIKLSIJCQkjIEN1cnJlbnQgY2xpZW50cyBjYXNjYWRlXG4iCi0iCQkJc2V0IHN1Ym0gJG0uY3VycmVudF9jYXNjYWRlXG4iCi0iCQkJY2F0Y2gge2Rlc3Ryb3kgJHN1Ym19XG4iCi0iCQkJc2V0IGl0ZW1fY2FzY2FkZSgkaXRlbSkgJHN1Ym1cbiIKLSIJCQl1cGRhdGVfY2xpZW50c19tZW51IFwiSU5JVFwiXG4iCi0iCQkJJG0gYWRkIGNhc2NhZGUgLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJLW1lbnUgJHN1Ym1cbiIKLSJcbiIKLSIJCX0gZWxzZWlmIHtbaXNfYWN0aW9uICRpdGVtXX0ge1xuIgotIgkJCSMgQWN0aW9uXG4iCi0iCQkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJLWNvbW1hbmQgXCJkb192YXIgJGl0ZW1cIlxuIgotIgkJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSBcIlwiOwkjIGZvciBjb252ZW5pZW5jZVxuIgotIgkJCX1cbiIKLSJcbiIKLSIJCX0gZWxzZWlmIHshICRpdGVtX2Jvb2woJGl0ZW0pfSB7XG4iCi0iCQkJIyBTdHJpbmdcbiIKLSIJCQlpZiB7W3JlZ2V4cCAtLSB7LUM6KC4qKX0gJGl0ZW1fb3B0cygkaXRlbSkgbTAgbTFdfSB7XG4iCi0iCQkJCSMgUmFkaW9idXR0b24gc2VsZWN0XG4iCi0iCQkJCXNldCBzdWJtICRtLnJhZGlvX2Nhc2NhZGUkbWVudV9jb3VudCgkY2FzZSlcbiIKLSIJCQkJY2F0Y2gge2Rlc3Ryb3kgJHN1Ym19XG4iCi0iCQkJCW1lbnUgJHN1Ym0gLXRlYXJvZmYgMCAtZm9udCAkZmZvbnRcbiIKLSIJCQkJZm9yZWFjaCB2YWwgW3NwbGl0ICRtMSBcIixcIl0ge1xuIgotIgkJCQkJJHN1Ym0gYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCBcIiR2YWxcIiBcXFxuIgotIgkJCQkJCS1jb21tYW5kIFwiZG9fdmFyICRpdGVtXCIgXFxcbiIKLSIJCQkJCQktdmFsdWUgXCIkdmFsXCIgXFxcbiIKLSIJCQkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJCQktdmFyaWFibGUgbWVudV92YXIoJGl0ZW0pXG4iCi0iCQkJCX1cbiIKLSIJCQkJJG0gYWRkIGNhc2NhZGUgLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJCQkJLWZvbnQgJGZmb250IFxcXG4iCi0iCQkJCQktbWVudSAkc3VibVxuIgotIgkJCQlzZXQgaXRlbV9jYXNjYWRlKCRpdGVtKSAkc3VibVxuIgotIgkJCX0gZWxzZSB7XG4iCi0iCQkJCSMgQXJiaXRyYXJ5X3N0cmluZ1xuIgotIgkJCQkkbSBhZGQgY29tbWFuZCAtbGFiZWwgXCIkaXRlbVwiIFxcXG4iCi0iCQkJCQktZm9udCAkZmZvbnQgXFxcbiIKLSIJCQkJCS1jb21tYW5kIFwiZG9fdmFyICRpdGVtXCJcbiIKLSIJCQl9XG4iCi0iCQkJc2V0IG12YXIgMVxuIgotIlxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwic2ltcGxlLWd1aVwifSB7XG4iCi0iCQkJJG0gYWRkIGNoZWNrYnV0dG9uIC1sYWJlbCBcIiRpdGVtXCIgXFxcbiIKLSIJCQkJLWNvbW1hbmQgXCJ0b2dnbGVfc2ltcGxlX2d1aVwiIFxcXG4iCi0iCQkJCS1mb250ICRmZm9udCBcXFxuIgotIgkJCQktdmFyaWFibGUgYmVnaW5uZXJfbW9kZVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQkjIEJvb2xlYW5cbiIKLSIJCQkkbSBhZGQgY2hlY2tidXR0b24gLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJCQktY29tbWFuZCBcImRvX3ZhciAkaXRlbVwiIFxcXG4iCi0iCQkJCS1mb250ICRmZm9udCBcXFxuIgotIgkJCQktdmFyaWFibGUgbWVudV92YXIoJGl0ZW0pXG4iCi0iCQkJaWYgeyFbaW5mbyBleGlzdHMgbWVudV92YXIoJGl0ZW0pXX0ge1xuIgotIgkJCQlzZXQgbWVudV92YXIoJGl0ZW0pIDBcbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7JExfY2FzY19jb3VudCA9PSAtMX0ge1xuIgotIgkJCWluY3IgbWVudV9jb3VudCgkY2FzZSlcbiIKLSIJCQlpbmNyIExfY2FzY19jb3VudFxuIgotIgkJfSBlbHNlaWYgeyRMX2Nhc2MgIT0gXCJcIn0ge1xuIgotIgkJCWluY3IgTF9jYXNjX2NvdW50XG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCWluY3IgbWVudV9jb3VudCgkY2FzZSlcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCWlmIHskbXZhcn0ge1xuIgotIgkJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJc2V0IG1lbnVfdmFyKCRpdGVtKSAkdW5zZXRfc3RyXG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCSMgTm93IG1ha2UgdGhlIGxpdHRsZSBcIig/KVwiIGhlbHAgYnV0dG9uc1xuIgotIglnbG9iYWwgb3NuYW1lXG4iCi0iCWZvcmVhY2ggY2FzZSBbYXJyYXkgbmFtZXMgbWVudV9tXSB7XG4iCi0iCQlpZiB7JGNhc2UgPT0gXCJIZWxwXCJ9IHtcbiIKLSIJCQljb250aW51ZTtcbiIKLSIJCX1cbiIKLSIJCWxpdHRsZV9xcyAkbWVudV9tKCRjYXNlKTtcbiIKLSIJfVxuIgotIglmb3JlYWNoIG0gJExfbWVudXMge1xuIgotIgkJbGl0dGxlX3FzICRtXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBjaGVja191cGRhdGVfdmFycyB7fSB7XG4iCi0iCWdsb2JhbCBsYXN0X3F1ZXJ5X2FsbF90aW1lIHF1ZXJ5X2FsbF9mcmVxIGljb25fbW9kZVxuIgotIglnbG9iYWwgY29ubmVjdGVkX3RvX3gxMXZuYyBjbGllbnRfdGFpbCBjbGllbnRfc29ja1xuIgotIlxuIgotIglzZXQgbm93IFtjbG9jayBzZWNvbmRzXVxuIgotIlxuIgotIglzZXQgZGVsYXkgJHF1ZXJ5X2FsbF9mcmVxXG4iCi0iCWlmIHskY2xpZW50X3RhaWwgIT0gXCJcIiAmJiAkY2xpZW50X3NvY2sgPT0gXCJcIn0ge1xuIgotIgkJc2V0IGRlbGF5IFtleHByIDIgKiAkcXVlcnlfYWxsX2ZyZXFdXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRjb25uZWN0ZWRfdG9feDExdm5jfSB7XG4iCi0iCQlzZXQgcXVpZXQgMFxuIgotIgkJc2V0IHJlZnJlc2ggW2V4cHIgXCIkbGFzdF9xdWVyeV9hbGxfdGltZSArICRkZWxheVwiXVxuIgotIlxuIgotIgkJIyBwdXRzIFwibWVudV9wb3N0ZWQgJG5vdyAkbGFzdF9xdWVyeV9hbGxfdGltZVwiXG4iCi0iCQkjIHB1dHMgXCJtZW51X3Bvc3RlZCAkcmVmcmVzaFwiXG4iCi0iXG4iCi0iCQlpZiB7JG5vdyA+ICRyZWZyZXNofSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJSZWZyZXNoaW5nIGN1cnJlbnQgc2V0dGluZ3MuLi4gXCJcbiIKLSIJCQlxdWVyeV9hbGwgJHF1aWV0XG4iCi0iCQkJaWYgeyRxdWlldH0ge1xuIgotIgkJCQlhcHBlbmRfdGV4dCBcImRvbmVcXG5cIlxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG1lbnVfcG9zdGVkIHt9IHtcbiIKLSIJY2hlY2tfdXBkYXRlX3ZhcnNcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBwcm9wc193aWRnZXRzIHtzdGF0ZX0ge1xuIgotIglnbG9iYWwgcHJvcHNfYnV0dG9uc1xuIgotIglmb3JlYWNoIHcgJHByb3BzX2J1dHRvbnMge1xuIgotIgkJJHcgY29uZmlndXJlIC1zdGF0ZSAkc3RhdGUJXG4iCi0iCX1cbiIKLSIJdXBkYXRlXG4iCi0ifVxuIgotIlxuIgotInByb2MgcHJvcHNfYXBwbHkge30ge1xuIgotIglnbG9iYWwgcHJvcHNfYWNjZXB0IHByb3BzX2NvbmZpcm0gcHJvcHNfdmlld29ubHkgcHJvcHNfc2hhcmVkIFxuIgotIglnbG9iYWwgcHJvcHNfemVyb2NvbmYgcHJvcHNfamF2YXZpZXcgcHJvcHNfc29saWRcbiIKLSIJZ2xvYmFsIHByb3BzX3Bhc3N3ZCBwcm9wc192aWV3cGFzc3dkXG4iCi0iCWdsb2JhbCBwcm9wMF9hY2NlcHQgcHJvcDBfY29uZmlybSBwcm9wMF92aWV3b25seSBwcm9wMF9zaGFyZWRcbiIKLSIJZ2xvYmFsIHByb3AwX3plcm9jb25mIHByb3AwX2phdmF2aWV3IHByb3AwX3NvbGlkXG4iCi0iCWdsb2JhbCBwcm9wMF9wYXNzd2QgcHJvcDBfdmlld3Bhc3N3ZFxuIgotIglnbG9iYWwgbWVudV92YXJcbiIKLSIJZ2xvYmFsIGNsaWVudF9zb2NrXG4iCi0iXG4iCi0iCXByb3BzX3dpZGdldHMgZGlzYWJsZWRcbiIKLSJcbiIKLSIJc2V0IGFmdCA1MDBcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBjbGllbnRfc29ja119IHtcbiIKLSIJCWlmIHskY2xpZW50X3NvY2sgIT0gXCJcIn0ge1xuIgotIgkJCXNldCBhZnQgMTUwXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJc2V0IGRpZCAwXG4iCi0iXG4iCi0iCXNldCBmYWlsIDBcbiIKLSJcbiIKLSIJaWYgeyRwcm9wc19jb25maXJtICE9ICRwcm9wMF9jb25maXJtfSB7XG4iCi0iCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWRcbiIKLSIJCWlmIHskcHJvcHNfY29uZmlybX0ge1xuIgotIgkJCXB1c2hfbmV3X3ZhbHVlIFwiYWNjZXB0XCIgXCJhY2NlcHRcIiBcInBvcHVwXCIgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcImFjY2VwdFwiIFwiYWNjZXB0XCIgXCJcIiAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7JG1lbnVfdmFyKGFjY2VwdCkgPT0gXCJwb3B1cFwifSB7XG4iCi0iCQkJc2V0IHByb3BzX2NvbmZpcm0gMVxuIgotIgkJfSBlbHNlaWYgeyRtZW51X3ZhcihhY2NlcHQpID09IFwiXCJ9IHtcbiIKLSIJCQlzZXQgcHJvcHNfY29uZmlybSAwXG4iCi0iCQl9XG4iCi0iCQlpZiB7JHByb3BzX2NvbmZpcm0gPT0gJHByb3AwX2NvbmZpcm19IHtpbmNyIGZhaWx9XG4iCi0iCQlzZXQgcHJvcDBfY29uZmlybSAkcHJvcHNfY29uZmlybVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskcHJvcHNfdmlld29ubHkgIT0gJHByb3AwX3ZpZXdvbmx5fSB7XG4iCi0iCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWRcbiIKLSIJCWlmIHskcHJvcHNfdmlld29ubHl9IHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcInZpZXdvbmx5XCIgXCJ2aWV3b25seVwiIDEgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcInZpZXdvbmx5XCIgXCJub3ZpZXdvbmx5XCIgMSAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7JG1lbnVfdmFyKHZpZXdvbmx5KX0ge1xuIgotIgkJCXNldCBwcm9wc192aWV3b25seSAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc192aWV3b25seSAwXG4iCi0iCQl9XG4iCi0iCQlpZiB7JHByb3BzX3ZpZXdvbmx5ID09ICRwcm9wMF92aWV3b25seX0ge2luY3IgZmFpbH1cbiIKLSIJCXNldCBwcm9wMF92aWV3b25seSAkcHJvcHNfdmlld29ubHlcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JHByb3BzX3NoYXJlZCAhPSAkcHJvcDBfc2hhcmVkfSB7XG4iCi0iCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWRcbiIKLSIJCWlmIHskcHJvcHNfc2hhcmVkfSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJzaGFyZWRcIiBcInNoYXJlZFwiIDEgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcInNoYXJlZFwiIFwibm9zaGFyZWRcIiAxIDFcbiIKLSIJCX1cbiIKLSIJCWlmIHskbWVudV92YXIoc2hhcmVkKX0ge1xuIgotIgkJCXNldCBwcm9wc19zaGFyZWQgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgcHJvcHNfc2hhcmVkIDBcbiIKLSIJCX1cbiIKLSIJCWlmIHskcHJvcHNfc2hhcmVkID09ICRwcm9wMF9zaGFyZWR9IHtpbmNyIGZhaWx9XG4iCi0iCQlzZXQgcHJvcDBfc2hhcmVkICRwcm9wc19zaGFyZWRcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JHByb3BzX3plcm9jb25mICE9ICRwcm9wMF96ZXJvY29uZn0ge1xuIgotIgkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkXG4iCi0iCQlpZiB7JHByb3BzX3plcm9jb25mfSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJ6ZXJvY29uZlwiIFwiemVyb2NvbmZcIiAxIDFcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJ6ZXJvY29uZlwiIFwibm96ZXJvY29uZlwiIDEgMVxuIgotIgkJfVxuIgotIgkJaWYgeyRtZW51X3Zhcih6ZXJvY29uZil9IHtcbiIKLSIJCQlzZXQgcHJvcHNfemVyb2NvbmYgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgcHJvcHNfemVyb2NvbmYgMFxuIgotIgkJfVxuIgotIgkJaWYgeyRwcm9wc196ZXJvY29uZiA9PSAkcHJvcDBfemVyb2NvbmZ9IHtpbmNyIGZhaWx9XG4iCi0iCQlzZXQgcHJvcDBfemVyb2NvbmYgJHByb3BzX3plcm9jb25mXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRwcm9wc19qYXZhdmlldyAhPSAkcHJvcDBfamF2YXZpZXd9IHtcbiIKLSIJCWlmIHskZGlkID4gMH0ge2FmdGVyICRhZnR9OyBpbmNyIGRpZFxuIgotIgkJaWYgeyRwcm9wc19qYXZhdmlld30ge1xuIgotIgkJCXB1c2hfbmV3X3ZhbHVlIFwiaHR0cFwiIFwiaHR0cFwiIDEgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcImh0dHBcIiBcIm5vaHR0cFwiIDEgMVxuIgotIgkJfVxuIgotIgkJaWYgeyRtZW51X3ZhcihodHRwKX0ge1xuIgotIgkJCXNldCBwcm9wc19qYXZhdmlldyAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc19qYXZhdmlldyAwXG4iCi0iCQl9XG4iCi0iCQlpZiB7JHByb3BzX2phdmF2aWV3ID09ICRwcm9wMF9qYXZhdmlld30ge2luY3IgZmFpbH1cbiIKLSIJCXNldCBwcm9wMF9qYXZhdmlldyAkcHJvcHNfamF2YXZpZXdcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JHByb3BzX3NvbGlkICE9ICRwcm9wMF9zb2xpZH0ge1xuIgotIgkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkXG4iCi0iCQlpZiB7JHByb3BzX3NvbGlkfSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJzb2xpZFwiIFwic29saWRcIiAxIDFcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJzb2xpZFwiIFwibm9zb2xpZFwiIDEgMVxuIgotIgkJfVxuIgotIgkJaWYgeyRtZW51X3Zhcihzb2xpZCl9IHtcbiIKLSIJCQlzZXQgcHJvcHNfc29saWQgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgcHJvcHNfc29saWQgMFxuIgotIgkJfVxuIgotIgkJaWYgeyRwcm9wc19zb2xpZCA9PSAkcHJvcDBfc29saWR9IHtpbmNyIGZhaWx9XG4iCi0iCQlzZXQgcHJvcDBfc29saWQgJHByb3BzX3NvbGlkXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IGZwdyAwXG4iCi0iCWlmIHskcHJvcHNfcGFzc3dkICE9ICRwcm9wMF9wYXNzd2R9IHtcbiIKLSIJCXNldCBmcHcgMVxuIgotIgl9XG4iCi0iCXNldCB2cHcgMFxuIgotIglpZiB7JHByb3BzX3ZpZXdwYXNzd2QgIT0gJHByb3AwX3ZpZXdwYXNzd2R9IHtcbiIKLSIJCXNldCB2cHcgMVxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBwd19vcmQgW2xpc3RdXG4iCi0iCWlmIHshJGZwdyAmJiAhJHZwdyB9IHtcbiIKLSIJCSMgbmVpdGhlciBjaGFuZ2VcbiIKLSIJCTtcbiIKLSIJfSBlbHNlaWYgeyRmcHcgJiYgISR2cHd9IHtcbiIKLSIJCSMgZnVsbCBwYXNzd29yZCBjaGFuZ2VcbiIKLSIJCWlmIHskcHJvcHNfcGFzc3dkID09IFwiXCJ9IHtcbiIKLSIJCQlpZiB7JHByb3AwX3ZpZXdwYXNzd2QgIT0gXCJcIn0ge1xuIgotIgkJCQkjIHNldCB2aWV3IHRvIFwiXCIgYXMgd2VsbCBhbmQgZmlyc3RcbiIKLSIJCQkJc2V0IHByb3BzX3ZpZXdwYXNzd2QgXCJcIlxuIgotIgkJCQlzZXQgcHdfb3JkIFtsaXN0IHZwdyBmcHddXG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJc2V0IHB3X29yZCBbbGlzdCBmcHddXG4iCi0iCQkJfVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQkjIGFzc3VtZSB2aWV3IHN0YXRlIE9LXG4iCi0iCQkJc2V0IHB3X29yZCBbbGlzdCBmcHddXG4iCi0iCQl9XG4iCi0iCQlcbiIKLSIJfSBlbHNlaWYgeyEkZnB3ICYmICR2cHd9IHtcbiIKLSIJCSMgdmlldyBwYXNzd29yZCBjaGFuZ2VcbiIKLSIJCWlmIHskcHJvcHNfdmlld3Bhc3N3ZCA9PSBcIlwifSB7XG4iCi0iCQkJIyBhc3N1bWUgZnVsbCBzdGF0ZSBPS1xuIgotIgkJCXNldCBwd19vcmQgW2xpc3QgdnB3XVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlpZiB7JHByb3AwX3Bhc3N3ZCA9PSBcIlwifSB7XG4iCi0iCQkJCSMgY291bGQgYmUgdHJvdWJsZSwgeDExdm5jIG1ha2VzIHJhbmRvbVxuIgotIgkJCQkjIGZ1bGwgcGFzc3dkLi4uXG4iCi0iCQkJCXNldCBwd19vcmQgW2xpc3QgdnB3XVxuIgotIgkJCX0gZWxzZSB7XG4iCi0iCQkJCSMgT0ssIGZ1bGwgbm9uLW51bGwuXG4iCi0iCQkJCXNldCBwd19vcmQgW2xpc3QgdnB3XVxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJfSBlbHNlaWYgeyRmcHcgJiYgJHZwd30ge1xuIgotIgkJIyBib3RoIGZ1bGwgYW5kIHZpZXcgcGFzc3dvcmQgY2hhbmdlXG4iCi0iCQlpZiB7JHByb3BzX3Bhc3N3ZCA9PSBcIlwiICYmICRwcm9wc192aWV3cGFzc3dkID09IFwiXCJ9IHtcbiIKLSIJCQkjIE9LLCBkbyB2aWV3IGZpcnN0XG4iCi0iCQkJc2V0IHB3X29yZCBbbGlzdCB2cHcgZnB3XVxuIgotIgkJfSBlbHNlaWYgeyRwcm9wc19wYXNzd2QgPT0gXCJcIiAmJiAkcHJvcHNfdmlld3Bhc3N3ZCAhPSBcIlwifSB7XG4iCi0iCQkJIyBOb3QgZ29vZCwgZG8gdmlldyBmaXJzdCBhbnl3YXkgeDExdm5jIHdpbGwgZml4LlxuIgotIgkJCXNldCBwd19vcmQgW2xpc3QgdnB3IGZwd11cbiIKLSIJCX0gZWxzZWlmIHskcHJvcHNfcGFzc3dkICE9IFwiXCIgJiYgJHByb3BzX3ZpZXdwYXNzd2QgPT0gXCJcIn0ge1xuIgotIgkJCSMgT0ssIHZpZXcgZmlyc3RcbiIKLSIJCQlzZXQgcHdfb3JkIFtsaXN0IHZwdyBmcHddXG4iCi0iCQl9IGVsc2VpZiB7JHByb3BzX3Bhc3N3ZCAhPSBcIlwiICYmICRwcm9wc192aWV3cGFzc3dkICE9IFwiXCJ9IHtcbiIKLSIJCQkjIE9LLCBmdWxsIGZpcnN0XG4iCi0iCQkJc2V0IHB3X29yZCBbbGlzdCBmcHcgdnB3XVxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCWZvcmVhY2ggY2FzZSAkcHdfb3JkIHtcbiIKLSIJCWlmIHskY2FzZSA9PSBcImZwd1wifSB7XG4iCi0iCQkJaWYgeyRkaWQgPiAwfSB7YWZ0ZXIgJGFmdH07IGluY3IgZGlkXG4iCi0iCQkJcHVzaF9uZXdfdmFsdWUgXCJwYXNzd2RcIiBcInBhc3N3ZFwiIFwiJHByb3BzX3Bhc3N3ZFwiIDFcbiIKLSIJCQlpZiB7JHByb3BzX3Bhc3N3ZCA9PSAkcHJvcDBfcGFzc3dkfSB7aW5jciBmYWlsfVxuIgotIgkJCXNldCBwcm9wMF9wYXNzd2QgJHByb3BzX3Bhc3N3ZFxuIgotIgkJfVxuIgotIgkJaWYgeyRjYXNlID09IFwidnB3XCJ9IHtcbiIKLSIJCQlpZiB7JGRpZCA+IDB9IHthZnRlciAkYWZ0fTsgaW5jciBkaWRcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcInZpZXdwYXNzd2RcIiBcInZpZXdwYXNzd2RcIiBcIiRwcm9wc192aWV3cGFzc3dkXCIgMVxuIgotIgkJCWlmIHskcHJvcHNfdmlld3Bhc3N3ZCA9PSAkcHJvcDBfdmlld3Bhc3N3ZH0ge2luY3IgZmFpbH1cbiIKLSIJCQlzZXQgcHJvcDBfdmlld3Bhc3N3ZCAkcHJvcHNfdmlld3Bhc3N3ZFxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskcHJvcHNfYWNjZXB0ICE9ICRwcm9wMF9hY2NlcHR9IHtcbiIKLSIJCWlmIHskZGlkID4gMH0ge2FmdGVyICRhZnR9OyBpbmNyIGRpZFxuIgotIgkJaWYgeyRwcm9wc19hY2NlcHR9IHtcbiIKLSIJCQlwdXNoX25ld192YWx1ZSBcInVubG9ja1wiIFwidW5sb2NrXCIgMSAwXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXB1c2hfbmV3X3ZhbHVlIFwibG9ja1wiIFwibG9ja1wiIDEgMFxuIgotIgkJfVxuIgotIgkJaWYgeyRwcm9wc19hY2NlcHQgPT0gJHByb3AwX2FjY2VwdH0ge2luY3IgZmFpbH1cbiIKLSIJCXNldCBwcm9wMF9hY2NlcHQgJHByb3BzX2FjY2VwdFxuIgotIgl9XG4iCi0iXG4iCi0iCXByb3BzX3dpZGdldHMgbm9ybWFsXG4iCi0iCWlmIHskZmFpbCA+IDB9IHtcbiIKLSIJCXJldHVybiAwXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlyZXR1cm4gMVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgcHJvcHNfYWR2YW5jZWQge30ge1xuIgotIglnbG9iYWwgaWNvbl9tb2RlIHByb3BzX3dpbiBmdWxsX3dpblxuIgotIglnbG9iYWwgcHJvcHNfYWR2YW5jZWRfZmlyc3RcbiIKLSJcbiIKLSIJaWYgIVtpbmZvIGV4aXN0cyBwcm9wc19hZHZhbmNlZF9maXJzdF0ge1xuIgotIgkJY2VudGVyX3dpbiAkZnVsbF93aW5cbiIKLSIJCXNldCBwcm9wc19hZHZhbmNlZF9maXJzdCAxXG4iCi0iCQlzZXQgZmlyc3QgMVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGZpcnN0IDBcbiIKLSIJfVxuIgotIgl1cGRhdGVcbiIKLSIJd20gZGVpY29uaWZ5ICRmdWxsX3dpblxuIgotIgl1cGRhdGVcbiIKLSJcbiIKLSIJaWYgeyRmaXJzdH0ge1xuIgotIgkJc2V0IHcgJGZ1bGxfd2luXG4iCi0iCQl3bSBtaW5zaXplICR3IFt3aW5mbyB3aWR0aCAkd10gW3dpbmZvIGhlaWdodCAkd11cbiIKLSIJfVxuIgotIglwdXNoX25ld192YWx1ZSBcInJlbW90ZS1jbWRcIiBcInJlbW90ZS1jbWRcIiBcIlE6Y2xpZW50c1wiIDFcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkb19wcm9wcyB7fSB7XG4iCi0iCWdsb2JhbCBwcm9wc19hY2NlcHQgcHJvcHNfY29uZmlybSBwcm9wc192aWV3b25seSBwcm9wc19zaGFyZWRcbiIKLSIJZ2xvYmFsIHByb3BzX3plcm9jb25mIHByb3BzX2phdmF2aWV3IHByb3BzX3NvbGlkXG4iCi0iCWdsb2JhbCBwcm9wc19wYXNzd2QgcHJvcHNfdmlld3Bhc3N3ZFxuIgotIglnbG9iYWwgcHJvcDBfYWNjZXB0IHByb3AwX2NvbmZpcm0gcHJvcDBfdmlld29ubHkgcHJvcDBfc2hhcmVkXG4iCi0iCWdsb2JhbCBwcm9wMF96ZXJvY29uZiBwcm9wMF9qYXZhdmlldyBwcm9wMF9zb2xpZFxuIgotIglnbG9iYWwgcHJvcDBfcGFzc3dkIHByb3AwX3ZpZXdwYXNzd2RcbiIKLSIJZ2xvYmFsIG1lbnVfdmFyIHVuc2V0X3N0clxuIgotIglnbG9iYWwgaGF2ZV9sYWJlbGZyYW1lcyBmZm9udCBiZm9udFxuIgotIglnbG9iYWwgcHJvcHNfYnV0dG9ucyBpY29uX25vYWR2YW5jZWRcbiIKLSIJZ2xvYmFsIGljb25fbW9kZSBpY29uX21vZGVfYXRfc3RhcnR1cFxuIgotIglnbG9iYWwgc2NyZWVuX2hlaWdodCBzY3JlZW5fd2lkdGhcbiIKLSIJZ2xvYmFsIGRvX3Byb3BzX21zZ1xuIgotIlxuIgotIglzZXQgbXNnIFwiXCJcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBkb19wcm9wc19tc2ddfSB7XG4iCi0iCQlzZXQgbXNnICRkb19wcm9wc19tc2dcbiIKLSIJfVxuIgotIlxuIgotIgljaGVja191cGRhdGVfdmFyc1xuIgotIlxuIgotIglzZXQgcGFkeSAwLjVtXG4iCi0iCXNldCBwYWR5IDAuM21cbiIKLSIJaWYgeyRzY3JlZW5faGVpZ2h0IDw9IDM2MH0ge1xuIgotIgkJc2V0IHBhZHkgMG1cbiIKLSIJfVxuIgotIlxuIgotIglpZiBbaW5mbyBleGlzdHMgbWVudV92YXIoZGVueSldIHtcbiIKLSIJCWlmIHskbWVudV92YXIoZGVueSkgPT0gJHVuc2V0X3N0ciB8fCAkbWVudV92YXIoZGVueSkgPT0gMH0ge1xuIgotIgkJCXNldCBwcm9wc19hY2NlcHQgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgcHJvcHNfYWNjZXB0IDBcbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBtZW51X3ZhcihkZW55KSAwXG4iCi0iCQlzZXQgcHJvcHNfYWNjZXB0IDFcbiIKLSIJfVxuIgotIglzZXQgcHJvcDBfYWNjZXB0ICRwcm9wc19hY2NlcHRcbiIKLSJcbiIKLSIJaWYgW2luZm8gZXhpc3RzIG1lbnVfdmFyKGFjY2VwdCldIHtcbiIKLSIJCWlmIHskbWVudV92YXIoYWNjZXB0KSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3ZhcihhY2NlcHQpID09IFwiXCJ9IHtcbiIKLSIJCQlzZXQgcHJvcHNfY29uZmlybSAwXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc19jb25maXJtIDFcbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBtZW51X3ZhcihhY2NlcHQpIFwiXCJcbiIKLSIJCXNldCBwcm9wc19jb25maXJtIDBcbiIKLSIJfVxuIgotIglzZXQgcHJvcDBfY29uZmlybSAkcHJvcHNfY29uZmlybVxuIgotIlxuIgotIglpZiBbaW5mbyBleGlzdHMgbWVudV92YXIodmlld29ubHkpXSB7XG4iCi0iCQlpZiB7JG1lbnVfdmFyKHZpZXdvbmx5KSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3Zhcih2aWV3b25seSkgPT0gXCJcIn0ge1xuIgotIgkJCXNldCBwcm9wc192aWV3b25seSAwXG4iCi0iCQl9IGVsc2VpZiAoJG1lbnVfdmFyKHZpZXdvbmx5KSkge1xuIgotIgkJCXNldCBwcm9wc192aWV3b25seSAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc192aWV3b25seSAwXG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgbWVudV92YXIodmlld29ubHkpIDBcbiIKLSIJCXNldCBwcm9wc192aWV3b25seSAwXG4iCi0iCX1cbiIKLSIJc2V0IHByb3AwX3ZpZXdvbmx5ICRwcm9wc192aWV3b25seVxuIgotIlxuIgotIglpZiBbaW5mbyBleGlzdHMgbWVudV92YXIoc2hhcmVkKV0ge1xuIgotIgkJaWYgeyRtZW51X3ZhcihzaGFyZWQpID09ICR1bnNldF9zdHIgfHwgJG1lbnVfdmFyKHNoYXJlZCkgPT0gXCJcIn0ge1xuIgotIgkJCXNldCBwcm9wc19zaGFyZWQgMFxuIgotIgkJfSBlbHNlaWYgKCRtZW51X3ZhcihzaGFyZWQpKSB7XG4iCi0iCQkJc2V0IHByb3BzX3NoYXJlZCAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc19zaGFyZWQgMFxuIgotIgkJfVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IG1lbnVfdmFyKHNoYXJlZCkgMFxuIgotIgkJc2V0IHByb3BzX3NoYXJlZCAwXG4iCi0iCX1cbiIKLSIJc2V0IHByb3AwX3NoYXJlZCAkcHJvcHNfc2hhcmVkXG4iCi0iXG4iCi0iCWlmIFtpbmZvIGV4aXN0cyBtZW51X3Zhcih6ZXJvY29uZildIHtcbiIKLSIJCWlmIHskbWVudV92YXIoemVyb2NvbmYpID09ICR1bnNldF9zdHIgfHwgJG1lbnVfdmFyKHplcm9jb25mKSA9PSBcIlwifSB7XG4iCi0iCQkJc2V0IHByb3BzX3plcm9jb25mIDBcbiIKLSIJCX0gZWxzZWlmICgkbWVudV92YXIoemVyb2NvbmYpKSB7XG4iCi0iCQkJc2V0IHByb3BzX3plcm9jb25mIDFcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IHByb3BzX3plcm9jb25mIDBcbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBtZW51X3Zhcih6ZXJvY29uZikgMFxuIgotIgkJc2V0IHByb3BzX3plcm9jb25mIDBcbiIKLSIJfVxuIgotIglzZXQgcHJvcDBfemVyb2NvbmYgJHByb3BzX3plcm9jb25mXG4iCi0iXG4iCi0iCWlmIFtpbmZvIGV4aXN0cyBtZW51X3ZhcihodHRwKV0ge1xuIgotIgkJaWYgeyRtZW51X3ZhcihodHRwKSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3ZhcihodHRwKSA9PSBcIlwifSB7XG4iCi0iCQkJc2V0IHByb3BzX2phdmF2aWV3IDBcbiIKLSIJCX0gZWxzZWlmICgkbWVudV92YXIoaHR0cCkpIHtcbiIKLSIJCQlzZXQgcHJvcHNfamF2YXZpZXcgMVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgcHJvcHNfamF2YXZpZXcgMFxuIgotIgkJfVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IG1lbnVfdmFyKGh0dHApIDBcbiIKLSIJCXNldCBwcm9wc19qYXZhdmlldyAwXG4iCi0iCX1cbiIKLSIJc2V0IHByb3AwX2phdmF2aWV3ICRwcm9wc19qYXZhdmlld1xuIgotIlxuIgotIglpZiBbaW5mbyBleGlzdHMgbWVudV92YXIoc29saWQpXSB7XG4iCi0iCQlpZiB7JG1lbnVfdmFyKHNvbGlkKSA9PSAkdW5zZXRfc3RyIHx8ICRtZW51X3Zhcihzb2xpZCkgPT0gXCJcIn0ge1xuIgotIgkJCXNldCBwcm9wc19zb2xpZCAwXG4iCi0iCQl9IGVsc2VpZiAoJG1lbnVfdmFyKHNvbGlkKSkge1xuIgotIgkJCXNldCBwcm9wc19zb2xpZCAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBwcm9wc19zb2xpZCAwXG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgbWVudV92YXIoc29saWQpIDBcbiIKLSIJCXNldCBwcm9wc19zb2xpZCAwXG4iCi0iCX1cbiIKLSIJc2V0IHByb3AwX3NvbGlkICRwcm9wc19zb2xpZFxuIgotIlxuIgotIglpZiAhW2luZm8gZXhpc3RzIHByb3BzX3Bhc3N3ZF0ge1xuIgotIgkJc2V0IHByb3BzX3Bhc3N3ZCBcIlwiXG4iCi0iCX1cbiIKLSIJc2V0IHByb3AwX3Bhc3N3ZCAkcHJvcHNfcGFzc3dkXG4iCi0iXG4iCi0iCWlmICFbaW5mbyBleGlzdHMgcHJvcHNfdmlld3Bhc3N3ZF0ge1xuIgotIgkJc2V0IHByb3BzX3ZpZXdwYXNzd2QgXCJcIlxuIgotIgl9XG4iCi0iCXNldCBwcm9wMF92aWV3cGFzc3dkICRwcm9wc192aWV3cGFzc3dkXG4iCi0iXG4iCi0iCWlmIFtpbmZvIGV4aXN0cyBwcm9wc19idXR0b25zXSB7XG4iCi0iCQljYXRjaCB7dW5zZXQgcHJvcHNfYnV0dG9uc31cbiIKLSIJfVxuIgotIglzZXQgcHJvcHNfYnV0dG9ucyBbbGlzdF1cbiIKLSJcbiIKLSIJc2V0IHdwIC5wcm9wc1xuIgotIglzZXQgdyAkd3BcbiIKLSIJY2F0Y2gge2Rlc3Ryb3kgJHdwfVxuIgotIgl0b3BsZXZlbCAkd3BcbiIKLSIJd20gdGl0bGUgJHdwIFwieDExdm5jIFByb3BlcnRpZXNcIlxuIgotIglmcmFtZSAkdy5sZlxuIgotIglzZXQgdyAkdy5sZlxuIgotIglzZXQgYjEgXCIkdy5idXR0b25zMVwiXG4iCi0iCWZyYW1lICRiMVxuIgotIglidXR0b24gJGIxLm9rIC10ZXh0IE9LIC1jb21tYW5kIFwiaWYge1xcW3Byb3BzX2FwcGx5XFxdfSB7ZGVzdHJveSAkd3B9XCIgLWZvbnQgJGJmb250XG4iCi0iCWJ1dHRvbiAkYjEuY2FuY2VsIC10ZXh0IENhbmNlbCAtY29tbWFuZCBcImRlc3Ryb3kgJHdwXCIgLWZvbnQgJGJmb250XG4iCi0iCWJ1dHRvbiAkYjEuYXBwbHkgIC10ZXh0IEFwcGx5IC1jb21tYW5kIFwicHJvcHNfYXBwbHlcIiAtZm9udCAkYmZvbnRcbiIKLSJcbiIKLSIJYmluZCAkdyA8S2V5UHJlc3MtRXNjYXBlPiBcImRlc3Ryb3kgJHdwXCJcbiIKLSJcbiIKLSIJcGFjayAkYjEub2sgJGIxLmNhbmNlbCAkYjEuYXBwbHkgLXNpZGUgbGVmdCAtZXhwYW5kIDBcbiIKLSIJbGFwcGVuZCBwcm9wc19idXR0b25zICRiMS5hcHBseSAkYjEuY2FuY2VsICRiMS5va1xuIgotIlxuIgotIglzZXQgYjIgXCIkdy5idXR0b25zMlwiXG4iCi0iCWZyYW1lICRiMlxuIgotIlxuIgotIglidXR0b24gJGIyLmFkdmFuY2VkIC10ZXh0IFwiIEFkdmFuY2VkIC4uLiBcIiBcXFxuIgotIgkJLWNvbW1hbmQgXCJkZXN0cm95ICR3cDsgcHJvcHNfYWR2YW5jZWRcIiAtZm9udCAkYmZvbnRcbiIKLSIJaWYgeyEgJGljb25fbm9hZHZhbmNlZH0ge1xuIgotIgkJbGFwcGVuZCBwcm9wc19idXR0b25zICRiMi5hZHZhbmNlZFxuIgotIgkJcGFjayAkYjIuYWR2YW5jZWQgLXNpZGUgbGVmdCAtZXhwYW5kIDBcbiIKLSIJfVxuIgotIlxuIgotIglidXR0b24gJGIyLmhlbHAgLXRleHQgXCIgIEhlbHAgIFwiIC1jb21tYW5kIFwibWVudV9oZWxwIFByb3BlcnRpZXNcIiAtZm9udCAkYmZvbnRcbiIKLSIJbGFwcGVuZCBwcm9wc19idXR0b25zICRiMi5oZWxwXG4iCi0iCXBhY2sgJGIyLmhlbHAgLXNpZGUgbGVmdCAtZXhwYW5kIDBcbiIKLSJcbiIKLSIJc2V0IHB3IFwiJHcucGFzc3dkXCJcbiIKLSIJaWYgeyRoYXZlX2xhYmVsZnJhbWVzfSB7XG4iCi0iCQlsYWJlbGZyYW1lICRwdyAtdGV4dCBcIlBhc3N3b3JkXCIgLWZvbnQgJGJmb250XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmcmFtZSAkcHdcbiIKLSIJCXNldCBsICRwdy5sXG4iCi0iCQlsYWJlbCAkbCAtdGV4dCBcIlBhc3N3b3JkOlwiIC1qdXN0aWZ5IGxlZnQgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIgkJcGFjayAkcHcubCAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAwbSAtc2lkZSB0b3BcbiIKLSIJfVxuIgotIgllbnRyeSAkcHcuZSAtc2hvdyBcIipcIiAtdGV4dHZhcmlhYmxlIHByb3BzX3Bhc3N3ZCAtZm9udCAkYmZvbnRcbiIKLSIJcGFjayAkcHcuZSAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAkcGFkeSAtc2lkZSB0b3BcbiIKLSJcbiIKLSIJZ2xvYmFsIHgxMXZuY19pY29uX21vZGVcbiIKLSIJaWYgeyEgJHgxMXZuY19pY29uX21vZGV9IHtcbiIKLSIJCWNhdGNoIHsgJHB3LmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH1cbiIKLSIJCWlmIHshICRoYXZlX2xhYmVsZnJhbWVzfSB7XG4iCi0iCQkJY2F0Y2ggeyAkcHcubCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkfVxuIgotIgkJfVxuIgotIgl9IGVsc2Uge1xuIgotIgkJbGFwcGVuZCBwcm9wc19idXR0b25zICRwdy5lXG4iCi0iCX1cbiIKLSJcbiIKLSJcbiIKLSIJc2V0IHZwIFwiJHcudmlld3B3XCJcbiIKLSIJaWYgeyRoYXZlX2xhYmVsZnJhbWVzfSB7XG4iCi0iCQlsYWJlbGZyYW1lICR2cCAtdGV4dCBcIlZpZXdPbmx5IFBhc3N3b3JkXCIgLWZvbnQgJGJmb250XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmcmFtZSAkdnBcbiIKLSIJCXNldCBsICR2cC5sXG4iCi0iCQlsYWJlbCAkbCAtdGV4dCBcIlZpZXdPbmx5IFBhc3N3b3JkOlwiIC1qdXN0aWZ5IGxlZnQgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIgkJcGFjayAkdnAubCAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAwbSAtc2lkZSB0b3BcbiIKLSIJfVxuIgotIgllbnRyeSAkdnAuZSAtc2hvdyBcIipcIiAtdGV4dHZhcmlhYmxlIHByb3BzX3ZpZXdwYXNzd2QgLWZvbnQgJGJmb250XG4iCi0iCXBhY2sgJHZwLmUgLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHkgLXNpZGUgdG9wXG4iCi0iXG4iCi0iCWlmIHshICR4MTF2bmNfaWNvbl9tb2RlfSB7XG4iCi0iCQljYXRjaCB7ICR2cC5lIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9XG4iCi0iCQlpZiB7ISAkaGF2ZV9sYWJlbGZyYW1lc30ge1xuIgotIgkJCWNhdGNoIHsgJHZwLmwgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH1cbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWxhcHBlbmQgcHJvcHNfYnV0dG9ucyAkdnAuZVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHshICRpY29uX21vZGVfYXRfc3RhcnR1cH0ge1xuIgotIgkJJHZwLmUgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZFxuIgotIgkJY2F0Y2ggeyR2cC5sIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9XG4iCi0iCQljYXRjaCB7JHZwIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWR9XG4iCi0iCQljYXRjaCB7JHZwIGNvbmZpZ3VyZSAtZm9yZWdyb3VuZCBncmV5NjB9XG4iCi0iCQkkcHcuZSBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkXG4iCi0iCQljYXRjaCB7JHB3LmwgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH1cbiIKLSIJCWNhdGNoIHskcHcgY29uZmlndXJlIC1zdGF0ZSBkaXNhYmxlZH1cbiIKLSIJCWNhdGNoIHskcHcgY29uZmlndXJlIC1mb3JlZ3JvdW5kIGdyZXk2MH1cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgc2IgXCIkdy5zb2xpZFwiXG4iCi0iCWZyYW1lICRzYlxuIgotIgljaGVja2J1dHRvbiAkc2IuYnV0dG9uIC10ZXh0IFwiU29saWQgQmFja2dyb3VuZCBDb2xvclwiIFxcXG4iCi0iCQktdmFyaWFibGUgcHJvcHNfc29saWQgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIglwYWNrICRzYi5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHlcbiIKLSJcbiIKLSIJc2V0IGp2IFwiJHcuamF2YXZpZXdcIlxuIgotIglmcmFtZSAkanZcbiIKLSIJY2hlY2tidXR0b24gJGp2LmJ1dHRvbiAtdGV4dCBcIlNlcnZlIEphdmEgVmlld2VyIEFwcGxldFwiIFxcXG4iCi0iCQktdmFyaWFibGUgcHJvcHNfamF2YXZpZXcgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIglwYWNrICRqdi5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHlcbiIKLSJcbiIKLSIJc2V0IHpjIFwiJHcuemVyb2NvbmZcIlxuIgotIglmcmFtZSAkemNcbiIKLSIJY2hlY2tidXR0b24gJHpjLmJ1dHRvbiAtdGV4dCBcIkFkdmVydGlzZSBTZXJ2aWNlIChaZXJvY29uZilcIiBcXFxuIgotIgkJLXZhcmlhYmxlIHByb3BzX3plcm9jb25mIC1hbmNob3IgdyAtZm9udCAkYmZvbnRcbiIKLSIJcGFjayAkemMuYnV0dG9uIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5XG4iCi0iXG4iCi0iCXNldCBzaCBcIiR3LnNoYXJlZFwiXG4iCi0iCWZyYW1lICRzaFxuIgotIgljaGVja2J1dHRvbiAkc2guYnV0dG9uIC10ZXh0IFwiU2hhcmVkXCIgXFxcbiIKLSIJCS12YXJpYWJsZSBwcm9wc19zaGFyZWQgLWFuY2hvciB3IC1mb250ICRiZm9udFxuIgotIglwYWNrICRzaC5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHlcbiIKLSJcbiIKLSIJc2V0IHZvIFwiJHcudmlld29ubHlcIlxuIgotIglmcmFtZSAkdm9cbiIKLSIJY2hlY2tidXR0b24gJHZvLmJ1dHRvbiAtdGV4dCBcIkFsbCBDbGllbnRzIFZpZXdPbmx5XCIgXFxcbiIKLSIJCS12YXJpYWJsZSBwcm9wc192aWV3b25seSAtYW5jaG9yIHcgLWZvbnQgJGJmb250XG4iCi0iCXBhY2sgJHZvLmJ1dHRvbiAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAkcGFkeVxuIgotIlxuIgotIglzZXQgY2YgXCIkdy5jb25maXJtXCJcbiIKLSIJZnJhbWUgJGNmXG4iCi0iCWNoZWNrYnV0dG9uICRjZi5idXR0b24gLXRleHQgXCJBc2sgZm9yIENvbmZpcm1hdGlvblwiIFxcXG4iCi0iCQktdmFyaWFibGUgcHJvcHNfY29uZmlybSAtYW5jaG9yIHcgLWZvbnQgJGJmb250XG4iCi0iCXBhY2sgJGNmLmJ1dHRvbiAtZmlsbCB4IC1leHBhbmQgMSAtcGFkeCAxbSAtcGFkeSAkcGFkeVxuIgotIlxuIgotIglzZXQgYWMgXCIkdy5hY2NlcHRcIlxuIgotIglmcmFtZSAkYWNcbiIKLSIJY2hlY2tidXR0b24gJGFjLmJ1dHRvbiAtdGV4dCBcIkFjY2VwdCBDb25uZWN0aW9uc1wiIFxcXG4iCi0iCQktdmFyaWFibGUgcHJvcHNfYWNjZXB0IC1hbmNob3IgdyAtZm9udCAkYmZvbnRcbiIKLSIJcGFjayAkYWMuYnV0dG9uIC1maWxsIHggLWV4cGFuZCAxIC1wYWR4IDFtIC1wYWR5ICRwYWR5XG4iCi0iXG4iCi0iCXNldCBweCBcIjZtXCJcbiIKLSIJcGFjayAkYjEgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgJHBhZHkgLXBhZHggJHB4XG4iCi0iCXBhY2sgJGIyIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5ICRwYWR5IC1wYWR4ICRweFxuIgotIglwYWNrICR2cCAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAkcGFkeSAtcGFkeCAkcHhcbiIKLSIJcGFjayAkcHcgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgJHBhZHkgLXBhZHggJHB4XG4iCi0iCXBhY2sgJHNiIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweFxuIgotIglwYWNrICRqdiAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAwbSAtcGFkeCAkcHhcbiIKLSIJcGFjayAkemMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMG0gLXBhZHggJHB4XG4iCi0iCXBhY2sgJHNoIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweFxuIgotIglwYWNrICR2byAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAwbSAtcGFkeCAkcHhcbiIKLSIJcGFjayAkY2YgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMG0gLXBhZHggJHB4XG4iCi0iCXBhY2sgJGFjIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweFxuIgotIlxuIgotIglnbG9iYWwgc2hvd19wcm9wc19pbnN0cnVjdGlvbnNcbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgc2hvd19wcm9wc19pbnN0cnVjdGlvbnNdfSB7XG4iCi0iCQlzZXQgc2hvd19wcm9wc19pbnN0cnVjdGlvbnMgMVxuIgotIgl9XG4iCi0iXG4iCi0iCXdtIHdpdGhkcmF3IC5wcm9wc1xuIgotIlxuIgotIglzZXQgd2wgJHdcbiIKLSJcbiIKLSIJcGFjayAkd2wgLXNpZGUgbGVmdFxuIgotIlxuIgotIglpZiB7JG1zZyAhPSBcIlwifSB7XG4iCi0iCQlzZXQgdHcgW3RleHR3aWR0aCAkbXNnXVxuIgotIgkJc2V0IHRoIFt0ZXh0aGVpZ2h0ICRtc2ddXG4iCi0iCQlzZXQgdGggW2V4cHIgJHRoIC0gMV1cbiIKLSIJCXNldCBtcyBcIi5wcm9wcy5tc2dcIlxuIgotIgkJdGV4dCAkbXMgLWZvbnQgJGZmb250IC1yZWxpZWYgcmlkZ2UgLXdpZHRoICR0dyAtaGVpZ2h0ICR0aFxuIgotIgkJJG1zIGluc2VydCAxLjAgJG1zZ1xuIgotIlxuIgotIgkJc2V0IHNpIFwiJHdsLmluc3RydWN0aW9uc1wiXG4iCi0iCQlmcmFtZSAkc2lcbiIKLSIJCWNoZWNrYnV0dG9uICRzaS5idXR0b24gLXRleHQgXCJTaG93IEluc3RydWN0aW9uc1wiIFxcXG4iCi0iCQkJLXZhcmlhYmxlIHNob3dfcHJvcHNfaW5zdHJ1Y3Rpb25zIC1hbmNob3IgdyAtZm9udCAkYmZvbnQgXFxcbiIKLSIJCQktY29tbWFuZCBcInRvZ2dsZV9pbnN0cnVjdGlvbnMgJG1zICRwYWR5ICRweFwiXG4iCi0iXG4iCi0iCQlwYWNrICRzaS5idXR0b24gLWZpbGwgeCAtZXhwYW5kIDEgLXBhZHggMW0gLXBhZHkgJHBhZHlcbiIKLSIJCXBhY2sgJHNpIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDBtIC1wYWR4ICRweFxuIgotIlxuIgotIgkJaWYgeyRzaG93X3Byb3BzX2luc3RydWN0aW9uc30ge1xuIgotIgkJCXBhY2sgJG1zIC1zaWRlIGxlZnQgLWZpbGwgYm90aFxuIgotIgkJfVxuIgotIlxuIgotIgkJdXBkYXRlXG4iCi0iCX1cbiIKLSJcbiIKLSJcbiIKLSIJbGFwcGVuZCBwcm9wc19idXR0b25zICRhYy5idXR0b24gJGNmLmJ1dHRvbiAkdm8uYnV0dG9uICRzaC5idXR0b24gJHpjLmJ1dHRvbiAkanYuYnV0dG9uICRzYi5idXR0b25cbiIKLSJcbiIKLSIJXG4iCi0iCXNldCB3IC5wcm9wc1xuIgotIgl1cGRhdGVcbiIKLSIJd20gcmVzaXphYmxlICR3IDEgMFxuIgotIgljZW50ZXJfd2luICR3XG4iCi0iCXVwZGF0ZVxuIgotIlxuIgotIgkjd20gbWluc2l6ZSAkdyBbd2luZm8gd2lkdGggJHddIFt3aW5mbyBoZWlnaHQgJHddXG4iCi0iXG4iCi0iCXRrd2FpdCB3aW5kb3cgJHdcbiIKLSIJc2V0IHNob3dfcHJvcHNfaW5zdHJ1Y3Rpb25zIDBcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB0b2dnbGVfaW5zdHJ1Y3Rpb25zIHttcyBwYWR5IHB4fSB7XG4iCi0iCWdsb2JhbCBzaG93X3Byb3BzX2luc3RydWN0aW9uc1xuIgotIglpZiB7JHNob3dfcHJvcHNfaW5zdHJ1Y3Rpb25zfSB7XG4iCi0iCQlwYWNrICRtcyAtc2lkZSBsZWZ0IC1maWxsIGJvdGhcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXBhY2sgZm9yZ2V0ICRtc1xuIgotIgl9XG4iCi0iCWNhdGNoIHtwYWNrIC5wcm9wc31cbiIKLSIJdXBkYXRlXG4iCi0ifVxuIgotIlxuIgotInByb2MgZG9fbmV3X2NsaWVudCB7fSB7XG4iCi0iCWdsb2JhbCBuZXdjbGllbnQgZmZvbnQgYmZvbnRcbiIKLSJcbiIKLSIJc2V0IHcgLm5ld2NsaWVudFxuIgotIgljYXRjaCB7ZGVzdHJveSAkd31cbiIKLSIJdG9wbGV2ZWwgJHdcbiIKLSIJbGFiZWwgJHcubCAtdGV4dCBcIkhvc3RuYW1lOiBcIiAtZm9udCAkYmZvbnRcbiIKLSIJc2V0IG5ld2NsaWVudCBcIlwiXG4iCi0iCWVudHJ5ICR3LmUgLXdpZHRoIDE2IC10ZXh0dmFyaWFibGUgbmV3Y2xpZW50IC1mb250ICRiZm9udCBcbiIKLSIJYnV0dG9uICR3LmIgLXRleHQgT0sgLWNvbW1hbmQgXCJkZXN0cm95ICR3XCIgLWZvbnQgJGJmb250XG4iCi0iCWJ1dHRvbiAkdy5oIC10ZXh0IEhlbHAgLWNvbW1hbmQgXCJtZW51X2hlbHAgTmV3Q2xpZW50XCIgLWZvbnQgJGJmb250XG4iCi0iCWJpbmQgJHcuZSA8UmV0dXJuPiBcInVwZGF0ZTsgYWZ0ZXIgMTAwOyBkZXN0cm95ICR3XCJcbiIKLSJcbiIKLSIJd20gdGl0bGUgJHcgXCJOZXcgQ2xpZW50XCJcbiIKLSJcbiIKLSIJcGFjayAkdy5sICR3LmUgJHcuaCAkdy5iIC1zaWRlIGxlZnQgLXBhZHkgMW0gLXBhZHggMC41bVxuIgotIglmb2N1cyAkdy5lXG4iCi0iCWNlbnRlcl93aW4gJHdcbiIKLSIJdXBkYXRlIFxuIgotIglcbiIKLSIJdGt3YWl0IHdpbmRvdyAkd1xuIgotIlxuIgotIglyZWdzdWIgLWFsbCB7W3t9KCl+ISQmKnw7J1wiYHt9PD5cXFtcXF1dfSAkbmV3Y2xpZW50IFwiXCIgbmV3Y2xpZW50XG4iCi0iCSMnXG4iCi0iCWlmIHskbmV3Y2xpZW50ICE9IFwiXCJ9IHtcbiIKLSIJCXB1c2hfbmV3X3ZhbHVlIFwiY29ubmVjdFwiIFwiY29ubmVjdFwiIFwiJG5ld2NsaWVudFwiIDFcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGRvX2Rpc2Nvbm5lY3RfYWxsIHt9IHtcbiIKLSIJcHVzaF9uZXdfdmFsdWUgXCJkaXNjb25uZWN0XCIgXCJkaXNjb25uZWN0XCIgXCJhbGxcIiAxXG4iCi0ifVxuIgotIlxuIgotInByb2MgZG9fZGlzY29ubmVjdF9jbGllbnQge2lkfSB7XG4iCi0iCXB1c2hfbmV3X3ZhbHVlIFwiZGlzY29ubmVjdFwiIFwiZGlzY29ubmVjdFwiIFwiJGlkXCIgMVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHBvcHVwX3Bvc3Qge219IHtcbiIKLSIJZ2xvYmFsIHBvcHVwX2Nhc2NhZGVfcG9zdGVkIGNsaWVudF9iYWxsb29uXG4iCi0iCWdsb2JhbCBjbGllbnRfaWRfbGlzdFxuIgotIlxuIgotIglzZXQgcG9wdXBfY2FzY2FkZV9wb3N0ZWQgMFxuIgotIglcbiIKLSIJc2V0IHdkIFwiJG0uZGlzY29ubmVjdFwiXG4iCi0iXG4iCi0iCWlmIHshW3dpbmZvIGV4aXN0cyAkd2RdfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIgljYXRjaCB7JHdkIGRlbGV0ZSAwIGVuZH1cbiIKLSJcbiIKLSIJJHdkIGFkZCBjb21tYW5kIC1sYWJlbCBcIkRpc2Nvbm5lY3QgY2xpZW50OlwiXG4iCi0iCSR3ZCBhZGQgc2VwYXJhdG9yXG4iCi0iCSR3ZCBhZGQgY29tbWFuZCAtbGFiZWwgXCJBbGwgQ2xpZW50c1wiIC1jb21tYW5kIGRvX2Rpc2Nvbm5lY3RfYWxsXG4iCi0iXG4iCi0iCWlmIHshW2luZm8gZXhpc3RzIGNsaWVudF9pZF9saXN0XX0ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSJcbiIKLSIJZm9yZWFjaCBjbGllbnQgJGNsaWVudF9pZF9saXN0IHtcbiIKLSIJCWlmIHskY2xpZW50ID09IFwiXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge14oW146XSopOiguKikkfSAkY2xpZW50IG1hdCBpZCBsYWJdfSB7XG4iCi0iCQkJc2V0IG5pZCBbZXhwciBcIiRpZCArIDBcIl1cbiIKLSIJCQkkd2QgYWRkIGNvbW1hbmQgLWxhYmVsIFwiJG5pZCAkbGFiXCIgXFxcbiIKLSIJCQkJLWNvbW1hbmQgXCJkb19kaXNjb25uZWN0X2NsaWVudCAkaWRcIlxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgcG1lbnUge20geCB5fSB7XG4iCi0iCWlmIHshW3dpbmZvIGV4aXN0cyAkbV19IHtcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iCXNldCB4IFtleHByICR4LTEwXVxuIgotIglzZXQgeSBbZXhwciAkeS0xMF1cbiIKLSIJJG0gcG9zdCAkeCAkeVxuIgotIgkjIFhYWCBtb3JlIGNhcmUgbmVlZGVkXG4iCi0iCWdyYWIgc2V0IC1nbG9iYWwgJG1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXRfY2xpZW50X2JhbGxvb24ge3N0cn0ge1xuIgotIglnbG9iYWwgY2xpZW50X2JhbGxvb24gdm5jX2Rpc3BsYXlcbiIKLSIJZ2xvYmFsIGNsaWVudF9pZF9saXN0XG4iCi0iXG4iCi0iCXNldCBjbGllbnRfaWRfbGlzdCBbbGlzdF1cbiIKLSIJXG4iCi0iCXNldCBjbGllbnRfYmFsbG9vbiBcIiR2bmNfZGlzcGxheVwiXG4iCi0iCXNldCBjb3VudCAwXG4iCi0iCXJlZ3N1YiAtYWxsIHteLiphcm89Y2xpZW50czp9ICRzdHIgXCJcIiBzdHJcbiIKLSIJcmVnc3ViIC1hbGwge2Fybz0uKiR9ICRzdHIgXCJcIiBzdHJcbiIKLSIJcmVnc3ViIC1hbGwge2Fucz0uKiR9ICRzdHIgXCJcIiBzdHJcbiIKLSIJZm9yZWFjaCBjbGllbnQgW3NwbGl0ICRzdHIgXCIsXCJdIHtcbiIKLSIJCSNwdXRzIFwiY2xpZW50OiAkY2xpZW50XCJcbiIKLSIJCWlmIFtyZWdleHAge15bIAldKiR9ICRjbGllbnRdIHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJaWYge1tyZWdleHAge14oLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKTooLiopOiguKik6KC4qKSR9IFxcXG4iCi0iCQkgICAgJGNsaWVudCBtMCBtMSBtMiBtMyBtNCBtNSBtNiBtNyBtOCBtOV19IHtcbiIKLSIJCQlzZXQgaWQgICAgJG0xXG4iCi0iCQkJc2V0IG5pZCAgIFtleHByIFwiJG0xICsgMFwiXVxuIgotIgkJCXNldCBpcCAgICAkbTJcbiIKLSIJCQlzZXQgcG9ydCAgJG0zXG4iCi0iCQkJc2V0IHVzZXIgICRtNFxuIgotIgkJCXNldCB1bml4ICAkbTVcbiIKLSIJCQlpZiB7W3N0cmluZyBsZW5ndGggJHVzZXJdID49IDI0fSB7XG4iCi0iCQkJCSMgd2VpcmQgaWRlbnRkIGhhc2guLi5cbiIKLSIJCQkJc2V0IHVzZXIgW3N0cmluZyByYW5nZSAkdXNlciAwIDhdXG4iCi0iCQkJCXNldCB1c2VyIFwiJHt1c2VyfS4uLlwiXG4iCi0iCQkJfVxuIgotIgkJCWlmIHskdW5peCAhPSBcIlwiICYmICR1bml4ICE9IFwibm9uZVwifSB7XG4iCi0iCQkJCXNldCB1c2VyICR1bml4XG4iCi0iCQkJfVxuIgotIgkJCXNldCBob3N0ICAkbTZcbiIKLSIJCQlzZXQgaW5wdXQgJG03XG4iCi0iCQkJc2V0IHZvICAgICRtOFxuIgotIgkJCXNldCBsdGltZSAkbTlcbiIKLSIJCQlpZiBbcmVnZXhwIHteWyAJXSokfSAkaG9zdF0ge1xuIgotIgkJCQlzZXQgaG9zdCAkaXBcbiIKLSIJCQl9XG4iCi0iCQkJc2V0IGNsaWVudF9iYWxsb29uIFwiJHtjbGllbnRfYmFsbG9vbn1cXG4kbmlkICR1c2VyXFxAJGhvc3RcIlxuIgotIgkJCWlmIHskdm8gPT0gXCIxXCJ9IHtcbiIKLSIJCQkJc2V0IGNsaWVudF9iYWxsb29uIFwiJHtjbGllbnRfYmFsbG9vbn0gLSB2aWV3XCJcbiIKLSIJCQkJbGFwcGVuZCBjbGllbnRfaWRfbGlzdCBcIiRpZDokdXNlclxcQCRob3N0IC0gdmlld1wiXG4iCi0iCQkJfSBlbHNlIHtcbiIKLSIJCQkJc2V0IGNsaWVudF9iYWxsb29uIFwiJHtjbGllbnRfYmFsbG9vbn0gLSBmdWxsXCJcbiIKLSIJCQkJbGFwcGVuZCBjbGllbnRfaWRfbGlzdCBcIiRpZDokdXNlclxcQCRob3N0IC0gZnVsbFwiXG4iCi0iCQkJfVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgaSBbZXhwciAkY291bnQrMV1cbiIKLSIJCQlpZiB7JGkgPT0gMX0ge1xuIgotIgkJCQlzZXQgY2xpZW50X2JhbGxvb24gXCIke2NsaWVudF9iYWxsb29ufVxcbnVua25vd24taG9zdCRpXCJcbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCQlpbmNyIGNvdW50XG4iCi0iCX1cbiIKLSIJaWYgeyRjb3VudCA9PSAwfSB7XG4iCi0iCQlzZXQgY2xpZW50X2JhbGxvb24gXCIke2NsaWVudF9iYWxsb29ufVxcbk5vIGNvbm5lY3Rpb25zLlwiXG4iCi0iCX1cbiIKLSIJaWNvbl93aW5fY2ZnICRjb3VudFxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHJlYWRfY2xpZW50X2luZm8ge2NoYW5uZWx9IHtcbiIKLSIJZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZSBjbGllbnRfc3RyIGNsaWVudF9pbmZvX3JlYWRcbiIKLSIJZ2xvYmFsIHJlYWRfY2xpZW50X2luZm9fbG9ja1xuIgotIglnbG9iYWwgcmVhZF9jbGllbnRzXG4iCi0iCXNldCBkYiAwXG4iCi0iXG4iCi0iCXNldCByZWFkX2NsaWVudHMgMFxuIgotIlxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyByZWFkX2NsaWVudF9pbmZvX2xvY2tdfSB7XG4iCi0iCQlzZXQgcmVhZF9jbGllbnRfaW5mb19sb2NrIDBcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JGNoYW5uZWwgIT0gXCJcIn0ge1xuIgotIlxuIgotIgkJaWYgeyRyZWFkX2NsaWVudF9pbmZvX2xvY2t9IHtcbiIKLSIJCQlyZXR1cm5cbiIKLSIJCX1cbiIKLSIJCXNldCByZWFkX2NsaWVudF9pbmZvX2xvY2sgMVxuIgotIgkJYWZ0ZXIgMTAwXG4iCi0iCQlzZXQgc3RyIFwiXCJcbiIKLSIJCXNldCBjb3VudCBbZ2V0cyAkY2hhbm5lbCBzdHJdXG4iCi0iCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJyZWFkX2NsaWVudF9pbmZvLSRjaGFubmVsOiAkc3RyXCJ9XG4iCi0iXG4iCi0iCQlpZiB7JGNvdW50ID09IC0xIHx8IFtlb2YgJGNoYW5uZWxdfSB7XG4iCi0iCQkJY2xvc2UgJGNoYW5uZWxcbiIKLSIJCQljYXRjaCB7ZmlsZSBkZWxldGUgJHgxMXZuY19jbGllbnRfZmlsZX1cbiIKLSIJCQlzZXQgcmVhZF9jbGllbnRfaW5mb19sb2NrIDBcbiIKLSIJCQljbGVhbl9pY29uX2V4aXRcbiIKLSIJCX1cbiIKLSIJCWlmIHskY291bnQgPiAwICYmICFbcmVnZXhwIHteWyAJXSokfSAkc3RyXX0ge1xuIgotIgkJCXNldCBjbGllbnRfaW5mb19yZWFkIDFcbiIKLSIJCQlpZiB7JHN0ciA9PSBcInF1aXRcIn0ge1xuIgotIgkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJHgxMXZuY19jbGllbnRfZmlsZX1cbiIKLSIJCQkJc2V0IHJlYWRfY2xpZW50X2luZm9fbG9jayAwXG4iCi0iCQkJCWNsZWFuX2ljb25fZXhpdFxuIgotIgkJCX0gZWxzZWlmIHskc3RyID09IFwic2tpcFwifSB7XG4iCi0iCQkJCTtcbiIKLSIJCQl9IGVsc2VpZiBbcmVnZXhwIHteY2xpZW50czp9ICRzdHJdIHtcbiIKLSIJCQkJcmVnc3ViIHteY2xpZW50czp9ICRzdHIgXCJcIiBzdHJcbiIKLSIJCQkJc2V0IHJlYWRfY2xpZW50cyAxXG4iCi0iCQkJCWlmIHskc3RyID09IFwibm9uZVwifSB7XG4iCi0iCQkJCQlzZXQgc3RyIFwiXCJcbiIKLSIJCQkJfVxuIgotIgkJCQl1cGRhdGVfY2xpZW50c19tZW51ICRzdHJcbiIKLSIJCQkJc2V0IGNsaWVudF9zdHIgJHN0clxuIgotIgkJCQlzZXRfY2xpZW50X2JhbGxvb24gJHN0clxuIgotIgkJCX1cbiIKLSIJCX1cbiIKLSIJCXNldCByZWFkX2NsaWVudF9pbmZvX2xvY2sgMFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgY2hlY2tfc2V0X3ZuY19kaXNwbGF5IHt9IHtcbiIKLSIJXG4iCi0iCWdsb2JhbCByZWFkX2NsaWVudHMgY2hlY2tfc2V0X3ZuY19kaXNwbGF5X2RvbmVcbiIKLSJcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBjaGVja19zZXRfdm5jX2Rpc3BsYXlfZG9uZV19IHtcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgcmVhZF9jbGllbnRzXX0ge1xuIgotIgkJaWYgeyRyZWFkX2NsaWVudHN9IHtcbiIKLSIJCQlhZnRlciAyNTBcbiIKLSIJCQlxdWVyeV9hbGxcbiIKLSIJCQlnbG9iYWwgY2xpZW50X3N0clxuIgotIgkJCXNldF9jbGllbnRfYmFsbG9vbiAkY2xpZW50X3N0clxuIgotIgkJCXNldCBjaGVja19zZXRfdm5jX2Rpc3BsYXlfZG9uZSAxXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyByZWFkX2NsaWVudF90YWlsIHt9IHtcbiIKLSIJZ2xvYmFsIGNsaWVudF90YWlsXG4iCi0iXG4iCi0iCWlmIHskY2xpZW50X3RhaWwgIT0gXCJcIn0ge1xuIgotIgkJcmVhZF9jbGllbnRfaW5mbyAkY2xpZW50X3RhaWxcbiIKLSIJCWNoZWNrX3NldF92bmNfZGlzcGxheVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgcmVhZF9jbGllbnRfc29jayB7fSB7XG4iCi0iCWdsb2JhbCBjbGllbnRfc29ja1xuIgotIlxuIgotIglpZiB7JGNsaWVudF9zb2NrICE9IFwiXCJ9IHtcbiIKLSIJCXJlYWRfY2xpZW50X2luZm8gJGNsaWVudF9zb2NrXG4iCi0iCQljaGVja19zZXRfdm5jX2Rpc3BsYXlcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNob3dfY2xpZW50X2JhbGxvb24ge30ge1xuIgotIglnbG9iYWwgaWNvbl9tb2RlIGljb25fd2luIHByb3BzX3dpbiBmdWxsX3dpblxuIgotIglnbG9iYWwgY2xpZW50X2JhbGxvb24gZmZvbnQgY29ubmVjdGVkX3RvX3gxMXZuY1xuIgotIlxuIgotIglzZXQgbm9pbmZvIFwidGt4MTF2bmM6IG5vIGNsaWVudCBpbmZvcm1hdGlvblwiXG4iCi0iCXNldCBub2luZm8gXCIkbm9pbmZvXFxuYXZhaWxhYmxlIGZyb20geDExdm5jIC4uLlwiXG4iCi0iCWlmICFbaW5mbyBleGlzdHMgY2xpZW50X2JhbGxvb25dIHtcbiIKLSIJCXNldCBjbGllbnRfYmFsbG9vbiAkbm9pbmZvXG4iCi0iCX1cbiIKLSIJaWYgeyRjbGllbnRfYmFsbG9vbiA9PSBcIlwifSB7XG4iCi0iCQlzZXQgY2xpZW50X2JhbGxvb24gJG5vaW5mb1xuIgotIgl9XG4iCi0iCWlmIHshIFtpbmZvIGV4aXN0cyBpY29uX3dpbl19IHtcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7JGljb25fd2luID09IFwiXCJ9IHtcbiIKLSIJCXJldHVyblxuIgotIgl9IGVsc2VpZiB7ISBbd2luZm8gZXhpc3RzICRpY29uX3dpbl19IHtcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iXG4iCi0iCXNldCB4IFtleHByIFt3aW5mbyByb290eCAkaWNvbl93aW5dICsgKFt3aW5mbyB3aWR0aCAkaWNvbl93aW5dLzIpXVxuIgotIglzZXQgeSBbZXhwciBbd2luZm8gcm9vdHkgJGljb25fd2luXSArIFt3aW5mbyBoZWlnaHQgJGljb25fd2luXSArIDRdXG4iCi0iXG4iCi0iCXNldCBpbmZvdGV4dCAkY2xpZW50X2JhbGxvb25cbiIKLSIJaWYgeyEkY29ubmVjdGVkX3RvX3gxMXZuY30ge1xuIgotIgkJc2V0IGluZm90ZXh0IFwiTm90IGN1cnJlbnRseSBhdHRhY2hlZCB0byB4MTF2bmNcXG5MYXN0IGF2YWlsYWJsZSBpbmZvOlxcbiRpbmZvdGV4dFwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IHcgLmNsaWVudF9iYWxsb29uXG4iCi0iCWNhdGNoIHtkZXN0cm95ICR3fVxuIgotIgl0b3BsZXZlbCAkdyAtYmcgYmxhY2sgLXNjcmVlbiBbd2luZm8gc2NyZWVuICRpY29uX3dpbl1cbiIKLSIJd20gb3ZlcnJpZGVyZWRpcmVjdCAkdyAxXG4iCi0iCWxhYmVsICR3LmwgLXRleHQgXCIkaW5mb3RleHRcIiAtcmVsaWVmIGZsYXQgLWJnIFwiI2ZmZmZhYVwiIC1mZyBibGFjayBcXFxuIgotIgkJLXBhZHggMiAtcGFkeSAwIC1hbmNob3IgdyAtanVzdGlmeSBsZWZ0IC1mb250ICRmZm9udFxuIgotIglwYWNrICR3LmwgLXNpZGUgbGVmdCAtcGFkeCAxIC1wYWR5IDFcbiIKLSJcbiIKLSIJc2V0IHcyIFt3aW5mbyByZXF3aWR0aCAgJHcubF1cbiIKLSIJc2V0IGgyIFt3aW5mbyByZXFoZWlnaHQgJHcubF1cbiIKLSJcbiIKLSIJc2V0IFcgW3dpbmZvIHNjcmVlbndpZHRoICAkd11cbiIKLSIJc2V0IEggW3dpbmZvIHNjcmVlbmhlaWdodCAkd11cbiIKLSJcbiIKLSIJaWYge1tleHByICR4KyR3Ml0gPiAkV30ge1xuIgotIgkJc2V0IHczIFt3aW5mbyB3aWR0aCAkaWNvbl93aW5dXG4iCi0iCQlzZXQgeCBbZXhwciBcIiRXIC0gJHcyIC0gJHczIC0gNFwiXSBcbiIKLSIJfVxuIgotIglpZiB7W2V4cHIgJHkrJGgyXSA+ICRIfSB7XG4iCi0iCQlzZXQgaDMgW3dpbmZvIGhlaWdodCAkaWNvbl93aW5dXG4iCi0iCQlzZXQgeSBbZXhwciBcIiRIIC0gJGgyIC0gJGgzIC0gNFwiXSBcbiIKLSIJfVxuIgotIlxuIgotIgl3bSBnZW9tZXRyeSAkdyArJHt4fSske3l9XG4iCi0ifVxuIgotIlxuIgotInByb2Mga2lsbF9jbGllbnRfYmFsbG9vbiB7fSB7XG4iCi0iCWdsb2JhbCBjbGllbnRfYmFsbG9vbl9pZCBjbGllbnRfYmFsbG9vbl93aW5cbiIKLSIJaWYgW2luZm8gZXhpc3RzIGNsaWVudF9iYWxsb29uX2lkXSB7XG4iCi0iCQljYXRjaCB7YWZ0ZXIgY2FuY2VsICRjbGllbnRfYmFsbG9vbl9pZH1cbiIKLSIJfVxuIgotIglpZiBbd2luZm8gZXhpc3RzIC5jbGllbnRfYmFsbG9vbl0ge1xuIgotIgkJZGVzdHJveSAuY2xpZW50X2JhbGxvb25cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGljb25fd2luX2NmZyB7Y2xpZW50c30ge1xuIgotIglnbG9iYWwgaWNvbl93aW4gY2xpZW50X3RhaWwgY2xpZW50X3NvY2sgY2xpZW50X2luZm9fcmVhZFxuIgotIlxuIgotIglpZiB7ISBbaW5mbyBleGlzdHMgaWNvbl93aW5dfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyRpY29uX3dpbiA9PSBcIlwifSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfSBlbHNlaWYgeyEgW3dpbmZvIGV4aXN0cyAkaWNvbl93aW5dfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglpZiB7JGNsaWVudHMgPiAwfSB7XG4iCi0iCQkkaWNvbl93aW4gY29uZmlndXJlIC1iZyBibGFjayAtZmcgd2hpdGVcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCSRpY29uX3dpbiBjb25maWd1cmUgLWJnIHdoaXRlIC1mZyBibGFja1xuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskY2xpZW50X3RhaWwgPT0gXCJcIiB8fCAhJGNsaWVudF9pbmZvX3JlYWR9IHtcbiIKLSIJCWlmIHskY2xpZW50X3NvY2sgPT0gXCJcIn0ge1xuIgotIgkJCSRpY29uX3dpbiBjb25maWd1cmUgLWZnIHJlZFxuIgotIgkJfVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2VydmVyX2FjY2VwdCB7c29jayBhZGRyIHBvcnR9IHtcbiIKLSIJZ2xvYmFsIHNvY2tldF9jb29raWUgc2VydmVyIHNvY2tldF9nb3RfY2FsbGJhY2tcbiIKLSIJZ2xvYmFsIGNsaWVudF90YWlsIGNsaWVudF9zb2NrXG4iCi0iCXNldCBkYiAwXG4iCi0iXG4iCi0iCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciBcInNvY2s9JHNvY2sgYWRkcj0kYWRkciBwb3J0PSRwb3J0XCJ9XG4iCi0iXG4iCi0iCXVwZGF0ZTsgdXBkYXRlIGlkbGV0YXNrc1xuIgotIglhZnRlciA1MFxuIgotIgl1cGRhdGU7IHVwZGF0ZSBpZGxldGFza3NcbiIKLSIJc2V0IGNvdW50IFtnZXRzICRzb2NrIHN0cl1cbiIKLSJcbiIKLSIJaWYgeyRjb3VudCA+PSAwfSB7XG4iCi0iCQlzZXQgc3RyIFtzdHJpbmcgdHJpbSAkc3RyXVxuIgotIgkJaWYgeyRkYn0ge3B1dHMgc3RkZXJyIFwic2VydmVyX2FjY2VwdDogXFxcIiRzdHJcXFwiXCJ9XG4iCi0iCQlpZiB7JHN0ciA9PSBcIkNPT0tJRTokc29ja2V0X2Nvb2tpZVwifSB7XG4iCi0iCQkJc2V0IGNsaWVudF9zb2NrICRzb2NrXG4iCi0iCQkJaWYgeyRkYn0ge3B1dHMgc3RkZXJyIFwiY29va2llIG1hdGNoZWQuICRjbGllbnRfc29ja1wifVxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJjb29raWUgTk8gbWF0Y2hlZC5cIn1cbiIKLSIJCX1cbiIKLSIJfVxuIgotIgljYXRjaCB7Y2xvc2UgJHNlcnZlcn1cbiIKLSIJc2V0IHNvY2tldF9nb3RfY2FsbGJhY2sgMVxuIgotIglpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJzb2NrZXRfZ290X2NhbGxiYWNrICRzb2NrZXRfZ290X2NhbGxiYWNrXCJ9XG4iCi0ifVxuIgotIlxuIgotInByb2MgdHJ5X2NsaWVudF9pbmZvX3NvY2sge30ge1xuIgotIglnbG9iYWwgc29ja2V0X2Nvb2tpZSBzZXJ2ZXIgc29ja2V0X2dvdF9jYWxsYmFja1xuIgotIglnbG9iYWwgeDExdm5jX3N0YXJ0ZWQgeDExdm5jX3hkaXNwbGF5IGhvc3RuYW1lIGNsaWVudF9zb2NrXG4iCi0iCWdsb2JhbCB4MTF2bmNfeGRpc3BsYXkwIG1lbnVfdmFyXG4iCi0iXG4iCi0iCXNldCBkYiAwXG4iCi0iI2R0aW1lIHQxXG4iCi0iCXNldCBzdGFydCAxMzAzN1xuIgotIglzZXQgdHJpZXMgMTAwXG4iCi0iCXNldCBzb2NrZXRfZ290X2NhbGxiYWNrIDBcbiIKLSJcbiIKLSIJc2V0IHhkICR4MTF2bmNfeGRpc3BsYXlcbiIKLSIJaWYgeyR4ZCA9PSBcIlwiICYmICR4MTF2bmNfeGRpc3BsYXkwICE9IFwiXCJ9IHtcbiIKLSIJCXNldCB4ZCAkeDExdm5jX3hkaXNwbGF5MFxuIgotIgl9XG4iCi0iCWlmIHskeGQgPT0gXCJcIiAmJiBbaW5mbyBleGlzdHMgbWVudV92YXIoZGlzcGxheSldfSB7XG4iCi0iCQlzZXQgeGQgJG1lbnVfdmFyKGRpc3BsYXkpXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IG15YWRkciBcIlwiXG4iCi0iCXJlZ3N1YiB7XFwuLiokfSAkaG9zdG5hbWUgXCJcIiBzaG9zdFxuIgotIglpZiB7JHgxMXZuY19zdGFydGVkfSB7XG4iCi0iCQlzZXQgbXlhZGRyIFwiMTI3LjAuMC4xXCJcbiIKLSIJfSBlbHNlaWYgeyR4ZCAhPSBcIlwifSB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7Xjp9ICR4ZF19IHtcbiIKLSIJCQlzZXQgbXlhZGRyIFwiMTI3LjAuMC4xXCJcbiIKLSIJCX0gZWxzZWlmIHtbcmVnZXhwIC1ub2Nhc2UgXCJeJHNob3N0XCIgJHhkXX0ge1xuIgotIgkJCXNldCBteWFkZHIgXCIxMjcuMC4wLjFcIlxuIgotIgkJfSBlbHNlaWYge1tyZWdleHAgLW5vY2FzZSBcIl5sb2NhbGhvc3RcIiAkeGRdfSB7XG4iCi0iCQkJc2V0IG15YWRkciBcIjEyNy4wLjAuMVwiXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBteWFkZHIgJGhvc3RuYW1lXG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgbXlhZGRyICRob3N0bmFtZVxuIgotIgl9XG4iCi0iCVxuIgotIglmb3Ige3NldCBpIDB9IHskaSA8PSAkdHJpZXN9IHtpbmNyIGl9IHtcbiIKLSIJCXNldCBwb3J0IFtleHByICRzdGFydCArICRpXVxuIgotIgkJc2V0IHNlcnZlciBbc29ja2V0IC1zZXJ2ZXIgc2VydmVyX2FjY2VwdCAtbXlhZGRyICRteWFkZHIgJHBvcnRdXG4iCi0iCQlpZiB7JHNlcnZlciA9PSBcIlwifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHtbZW9mICRzZXJ2ZXJdfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCXNldCBlcnIgXCJcIlxuIgotIgkJY2F0Y2gge3NldCBlcnIgW2Zjb25maWd1cmUgJHNlcnZlciAtZXJyb3JdfVxuIgotIgkJI3B1dHMgXCJlcnI6ICRzZXJ2ZXI6ICRlcnJcIlxuIgotIgkJaWYgeyRlcnIgPT0gXCJcIn0ge1xuIgotIgkJCWJyZWFrXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJaWYgeyRzZXJ2ZXIgPT0gXCJcIn0ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJ0cnlfY2xpZW50X2luZm9fc29jazogc2VydmVyIHNvY2tldCBmYWlsZWQuXFxuXCJcbiIKLSIJCXJldHVyblxuIgotIgl9XG4iCi0iCWlmIHshICR4MTF2bmNfc3RhcnRlZH0ge1xuIgotIgkJcnVuX3JlbW90ZV9jbWQgW2xpc3QgXCItbm9zeW5jXCIgXCItUlwiIFwibm9vcFwiXVxuIgotIgkJaWYgeyRkYn0ge2R0aW1lIEF9XG4iCi0iCQlhZnRlciAyNTBcbiIKLSIJCWlmIHskZGJ9IHtkdGltZSBBfVxuIgotIgl9XG4iCi0iXG4iCi0iCSMgc2V0IHRoZSBjb29raWUgdG8gc29tZSBvYnNjdXJlZCByYW5kb21uZXNzXG4iCi0iCXNldCBzb2NrZXRfY29va2llIFtjbG9jayBjbGlja3NdXG4iCi0iCXNldCByIFtleHByIHJhbmQoKV1cbiIKLSIJaWYgeyRyICE9IFwiXCJ9IHtcbiIKLSIJCWFwcGVuZCBzb2NrZXRfY29va2llICRyXG4iCi0iCX1cbiIKLSIJc2V0IHIgXCJcIlxuIgotIgljYXRjaCB7c2V0IHIgW3dpbmZvIGlkIC5dfVxuIgotIglpZiB7JHIgIT0gXCJcIn0ge1xuIgotIgkJYXBwZW5kIHNvY2tldF9jb29raWUgJHJcbiIKLSIJfVxuIgotIglpZiB7W3JlZ2V4cCB7KFswLTldKShbMC05XSkkfSBbY2xvY2sgY2xpY2tzXSBtIG0xIG0yXX0ge1xuIgotIgkJcmVnc3ViIC1hbGwge1xcLn0gJHNvY2tldF9jb29raWUgJG0xIHNvY2tldF9jb29raWVcbiIKLSIJCXJlZ3N1YiAtYWxsIHt4fSAgJHNvY2tldF9jb29raWUgJG0yIHNvY2tldF9jb29raWVcbiIKLSIJfVxuIgotIglydW5fcmVtb3RlX2NtZCBbbGlzdCBcIi1ub3N5bmNcIiBcIi1SXCIgXFxcbiIKLSIJCVwiY2xpZW50X2luZm9fc29jazokbXlhZGRyOiRwb3J0OiRzb2NrZXRfY29va2llXCJdXG4iCi0iI2R0aW1lIHQyXG4iCi0iCWlmIHskZGJ9IHtwdXRzIFwiY2xpZW50X2luZm9fc29jazokbXlhZGRyOiRwb3J0OiRzb2NrZXRfY29va2llXCJ9XG4iCi0iCWZvciB7c2V0IGkgMH0geyRpIDwgMTB9IHtpbmNyIGl9IHtcbiIKLSIJCWFmdGVyIDUwXG4iCi0iCQl1cGRhdGU7IHVwZGF0ZSBpZGxldGFza3NcbiIKLSIjZHRpbWUgYWFcbiIKLSIJCWlmIHskc29ja2V0X2dvdF9jYWxsYmFjayAhPSAwfSB7XG4iCi0iI3B1dHMgXCJicmVhay1cIlxuIgotIgkJCWJyZWFrXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIjZHRpbWUgdDNcbiIKLSJcbiIKLSIJc2V0IGFmdGlkIFwiXCJcbiIKLSIJaWYgeyRzb2NrZXRfZ290X2NhbGxiYWNrID09IDB9IHtcbiIKLSIJCXNldCBhZnRpZCBbYWZ0ZXIgMTAwMDAge3NldCBzb2NrZXRfZ290X2NhbGxiYWNrIDJ9XVxuIgotIgkJdGt3YWl0IHZhcmlhYmxlIHNvY2tldF9nb3RfY2FsbGJhY2tcbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JGFmdGlkICE9IFwiXCJ9IHtcbiIKLSIJCWNhdGNoIHthZnRlciBjYW5jZWwgJGFmdGlkfVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskc29ja2V0X2dvdF9jYWxsYmFjayAhPSAxfSB7XG4iCi0iCQlwdXRzIHN0ZGVyciBcInRyeV9jbGllbnRfaW5mb19zb2NrIGZhaWxlZDogbm8gY2FsbGJhY2tcXG5cIlxuIgotIgkJY2F0Y2gge2Nsb3NlICRzZXJ2ZXJ9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXR1cF9jbGllbnRfc29jayAxXG4iCi0iCX1cbiIKLSIjZHRpbWUgdDRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXRfaWNvbl9sYWJlbCB7fSB7XG4iCi0iCWdsb2JhbCBpY29uX3dpblxuIgotIlxuIgotIglzZXQgbGFiIFtnZXRfaWNvbl9sYWJlbF1cbiIKLSJcbiIKLSIJaWYgeyEgW2luZm8gZXhpc3RzIGljb25fd2luXX0ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHskaWNvbl93aW4gPT0gXCJcIn0ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX0gZWxzZWlmIHshIFt3aW5mbyBleGlzdHMgJGljb25fd2luXX0ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSIJXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgaWNvbl93aW5dfSB7XG4iCi0iCQkkaWNvbl93aW4gY29uZmlndXJlIC10ZXh0ICRsYWJcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGdldF9pY29uX2xhYmVsIHt7c2V0IDB9fSB7XG4iCi0iCWdsb2JhbCBpY29uX21pbmltYWwgXG4iCi0iXG4iCi0iCXNldCBsYWIwIFwieDExXFxudm5jXCJcbiIKLSIJXG4iCi0iCWlmIHskaWNvbl9taW5pbWFsfSB7XG4iCi0iCQlzZXQgbGFiIFtnZXRfdm5jX2Rpc3BsYXlfbnVtYmVyXVxuIgotIgkJaWYgeyRsYWIgIT0gXCJub25lXCJ9IHtcbiIKLSIJCQkjc2V0IGxhYiBcIiAgOiRsYWJcIlxuIgotIgkJCXNldCBsYWIgXCI6JGxhYlwiXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBsYWIgXCItXCJcbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBsYWIgJGxhYjBcbiIKLSIJfVxuIgotIglyZXR1cm4gJGxhYlxuIgotIn1cbiIKLSJcbiIKLSIjIGN1cnJlbnRseSB1bnVzZWRcbiIKLSJwcm9jIGxtZW51IHttZW51fSB7XG4iCi0iCWdsb2JhbCBwb3B1cF9jYXNjYWRlX3Bvc3RlZFxuIgotIglnbG9iYWwgbGVmdF9pY29ud2luX21lbnVcbiIKLSIJc2V0IGxlZnRfaWNvbndpbl9tZW51IDFcbiIKLSIJYWZ0ZXIgMTAwXG4iCi0iCXVwZGF0ZVxuIgotIglpZiB7ISRwb3B1cF9jYXNjYWRlX3Bvc3RlZCAmJiAkbGVmdF9pY29ud2luX21lbnV9IHtcbiIKLSIJCWZvciB7c2V0IGkgMH0geyRpIDwgM30ge2luY3IgaX0ge1xuIgotIgkJCWFmdGVyIDEwMFxuIgotIgkJCXVwZGF0ZVxuIgotIgkJfVxuIgotIgkJaWYgeyEkcG9wdXBfY2FzY2FkZV9wb3N0ZWQgJiYgJGxlZnRfaWNvbndpbl9tZW51fSB7XG4iCi0iCQkJJG1lbnUgdW5wb3N0XG4iCi0iCQkJcmV0dXJuXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJIyBrbHVkZ2UgZm9yIFdpbmRvd1ZpZXdcbiIKLSIJaWYgeyRwb3B1cF9jYXNjYWRlX3Bvc3RlZH0ge1xuIgotIgkJZm9jdXMgJG1lbnVcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG9sZF9iYWxsb29uIHt9IHtcbiIKLSIJZ2xvYmFsIGNsaWVudF9zdHIgc2F2ZWRfY2xpZW50c19zdHJcbiIKLSIJc2V0IHN0ciBcIlwiXG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgY2xpZW50X3N0cl19IHtcbiIKLSIJCWlmIHskY2xpZW50X3N0ciAhPSBcIlwifSB7XG4iCi0iCQkJc2V0IHN0ciAkY2xpZW50X3N0clxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWlmIHskc3RyID09IFwiXCJ9IHtcbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgc2F2ZWRfY2xpZW50c19zdHJdfSB7XG4iCi0iCQkJc2V0IHN0ciAkc2F2ZWRfY2xpZW50c19zdHJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglpZiB7JHN0ciAhPSBcIlwifSB7XG4iCi0iCQlzZXRfY2xpZW50X2JhbGxvb24gJHN0clxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2MgZ2V0X2N1c3RvbV9tZW51X2l0ZW1zIHt9IHtcbiIKLSIJZ2xvYmFsIGVudiBjdXN0b21fbGFzdF9yZWFkXG4iCi0iXG4iCi0iCWlmIHshW2luZm8gZXhpc3RzIGN1c3RvbV9sYXN0X3JlYWRdfSB7XG4iCi0iCQlzZXQgY3VzdG9tX2xhc3RfcmVhZCAwXG4iCi0iCX1cbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0NVU1RPTV9HVUkpXX0ge1xuIgotIgkJc2V0IGN1c3RvbSBcIiRlbnYoWDExVk5DX0NVU1RPTV9HVUkpXCJcbiIKLSIJfSBlbHNlaWYgeyFbaW5mbyBleGlzdHMgZW52KEhPTUUpXX0ge1xuIgotIgkJcmV0dXJuIFtsaXN0IFwibm9uZVwiXVxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGN1c3RvbSBcIiRlbnYoSE9NRSkvLngxMXZuYy5ndWlcIlxuIgotIgl9XG4iCi0iCWlmIHshW2ZpbGUgZXhpc3RzICRjdXN0b21dfSB7XG4iCi0iCQlyZXR1cm4gW2xpc3QgXCJub25lXCJdXG4iCi0iCX1cbiIKLSJcbiIKLSIjCWlmIHtbZmlsZSBtdGltZSAkY3VzdG9tXSA8PSAkY3VzdG9tX2xhc3RfcmVhZH0ge1xuIgotIiMJCXJldHVybiBbbGlzdCBcIm5vY2hhbmdlXCJdXG4iCi0iIwl9XG4iCi0iXG4iCi0iCXNldCBpbiBcIlwiXG4iCi0iCWNhdGNoIHtzZXQgaW4gW29wZW4gJGN1c3RvbSBcInJcIl19IFxuIgotIglpZiB7JGluID09IFwiXCJ9IHtcbiIKLSIJCXJldHVybiBbbGlzdCBcIm5vbmVcIl1cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgY3VzdG9tX2xhc3RfcmVhZCBbY2xvY2sgc2Vjb25kc11cbiIKLSJcbiIKLSIJc2V0IGNvdW50IDBcbiIKLSIJd2hpbGUge1tnZXRzICRpbiBsaW5lXSA+IC0xfSB7XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XlsgXFx0XSojfSAkbGluZV19IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfVxuIgotIgkJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXVxuIgotIgkJaWYgeyRsaW5lICE9IFwiXCJ9IHtcbiIKLSIJCQlsYXBwZW5kIGl0ZW1zICRsaW5lXG4iCi0iCQkJaW5jciBjb3VudFxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWNsb3NlICRpblxuIgotIglcbiIKLSIJaWYgeyRjb3VudCA+IDB9IHtcbiIKLSIJCXJldHVybiAkaXRlbXNcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXJldHVybiBbbGlzdCBcIm5vbmVcIl1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG1ha2VfY3VzdG9tX21lbnUge21lbnUgZm9udH0ge1xuIgotIglzZXQgaXRlbXMgW2dldF9jdXN0b21fbWVudV9pdGVtc11cbiIKLSIJc2V0IGkwIFtsaW5kZXggJGl0ZW1zIDBdXG4iCi0iCWNhdGNoIHskbWVudSBkZWxldGUgMCBlbmR9XG4iCi0iCWlmIHskaTAgIT0gXCJub25lXCJ9IHtcbiIKLSIJCSRtZW51IGFkZCBjb21tYW5kIC1mb250ICRmb250IC1sYWJlbCBcIkN1c3RvbSBpdGVtczpcIlxuIgotIgkJJG1lbnUgYWRkIHNlcGFyYXRvclxuIgotIgkJZm9yZWFjaCBpdGVtICRpdGVtcyB7XG4iCi0iCQkJaWYgeyRpdGVtID09IFwic2VwXCIgfHwgJGl0ZW0gPT0gXCJzZXBhcmF0b3JcIn0ge1xuIgotIgkJCQkkbWVudSBhZGQgc2VwYXJhdG9yXG4iCi0iCQkJCWNvbnRpbnVlXG4iCi0iCQkJfVxuIgotIgkJCWlmIHtbcmVnZXhwIHteYWN0aW9uOiguKikkfSAkaXRlbSBtIGFjdGlvbl19IHtcbiIKLSIJCQkJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJGZvbnQgLWxhYmVsIFwiJGFjdGlvblwiIFxcXG4iCi0iCQkJCSAgICAtY29tbWFuZCBcImRvX3ZhciAkYWN0aW9uXCJcbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQl9XG4iCi0iCQkJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJGZvbnQgLWxhYmVsIFwiJGl0ZW1cIiBcXFxuIgotIgkJIAkgICAgLWNvbW1hbmQgXCJydW5fcmVtb3RlX2NtZCBcXFtsaXN0IFxcXCItUlxcXCIgXFxcIiRpdGVtXFxcIlxcXVwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBtYWtlX2ljb24ge30ge1xuIgotIglnbG9iYWwgaWNvbl9tb2RlIGljb25fZW1iZWRfaWQgaWNvbl93aW4gcHJvcHNfd2luIGZ1bGxfd2luXG4iCi0iCWdsb2JhbCB0cmF5X2VtYmVkIHRyYXlfcnVubmluZyBlbnZcbiIKLSIJZ2xvYmFsIHgxMXZuY19jbGllbnRfZmlsZSBjbGllbnRfdGFpbCBjbGllbnRfc29jayBjbGllbnRfc3RyIHNhdmVkX2NsaWVudHNfc3RyXG4iCi0iCWdsb2JhbCBjbGllbnRfYmFsbG9vbl9pZFxuIgotIglnbG9iYWwgYmZvbnQgc2ZvbnQgc25mb250IGZmb250XG4iCi0iCWdsb2JhbCBpY29uX21pbmltYWwgZ3VpX3N0YXJ0X21vZGVcbiIKLSIJZ2xvYmFsIHBvcHVwX2Nhc2NhZGVfcG9zdGVkIG1lbnVfdmFyIHgxMXZuY19ndWlfZ2VvbVxuIgotIglzZXQgbWluX3ggMjRcbiIKLSIJc2V0IG1pbl95IDI0XG4iCi0iCVxuIgotIglzZXQgZm9udCAkYmZvbnRcbiIKLSIJc2V0IG1mb250ICRmb250XG4iCi0iXG4iCi0iCWlmIHskdHJheV9lbWJlZH0ge1xuIgotIgkJc2V0IGZvbnQgJHNmb250XG4iCi0iCQlzZXQgbWZvbnQgJHNuZm9udFxuIgotIgl9XG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX0ZPTlQpXX0ge1xuIgotIgkJc2V0IGZvbnQgJGVudihYMTFWTkNfSUNPTl9GT05UKVxuIgotIgl9XG4iCi0iCWlmIHtbcmVnZXhwIHsoWzAtOV1bMC05XSopeChbMC05XVswLTldKil9ICR4MTF2bmNfZ3VpX2dlb20gbSBteCBteV19IHtcbiIKLSIJCWlmIHskbXggPCAkbWluX3h9IHtcbiIKLSIJCQlzZXQgbWluX3ggJG14XG4iCi0iCQl9XG4iCi0iCQlpZiB7JG15IDwgJG1pbl95fSB7XG4iCi0iCQkJc2V0IG1pbl95ICRteVxuIgotIgkJfVxuIgotIgl9XG4iCi0iCXdtIG1pbnNpemUgLiAkbWluX3ggJG1pbl95XG4iCi0iXG4iCi0iCWlmIHskdHJheV9lbWJlZCAmJiAkdHJheV9ydW5uaW5nfSB7XG4iCi0iCQl3bSB3aXRoZHJhdyAuXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IGwgLmljb25cbiIKLSIJc2V0IGljb25fd2luICRsXG4iCi0iCWNhdGNoIGRlc3Ryb3kgeyRpY29uX3dpbn1cbiIKLSIJaWYgeyRpY29uX21pbmltYWx9IHtcbiIKLSIJCXNldCBidyAxXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgYncgNVxuIgotIgl9XG4iCi0iCXNldCBsYWIgW2dldF9pY29uX2xhYmVsXVxuIgotIglsYWJlbCAkbCAtdGV4dCAkbGFiIC1ib3JkZXJ3aWR0aCAkYncgLWZvbnQgJGZvbnRcbiIKLSIJaWNvbl93aW5fY2ZnIDBcbiIKLSJcbiIKLSJcbiIKLSIJc2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDBcbiIKLSIJcGFjayAkbCAtZmlsbCBib3RoIC1leHBhbmQgMVxuIgotIglzZXQgbWVudSBcIiRsLm1lbnVcIlxuIgotIgltZW51ICRtZW51IC10ZWFyb2ZmIDAgLXBvc3Rjb21tYW5kIFwicG9wdXBfcG9zdCAkbWVudVwiXG4iCi0iCSRtZW51IGFkZCBjb21tYW5kIC1mb250ICRtZm9udCAtbGFiZWwgXCJQcm9wZXJ0aWVzXCIgLWNvbW1hbmQgZG9fcHJvcHNcbiIKLSIJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJG1mb250IC1sYWJlbCBcIkhlbHBcIiAtY29tbWFuZCBcIm1lbnVfaGVscCBUcmF5XCJcbiIKLSIJJG1lbnUgYWRkIGNvbW1hbmQgLWZvbnQgJG1mb250IC1sYWJlbCBcIkxvZ2ZpbGVcIiAtY29tbWFuZCBzaG93X2xvZ2ZpbGVcbiIKLSIJJG1lbnUgYWRkIHNlcGFyYXRvclxuIgotIgkkbWVudSBhZGQgY29tbWFuZCAtZm9udCAkbWZvbnQgLWxhYmVsIFwiTmV3IENsaWVudFwiIC1jb21tYW5kIGRvX25ld19jbGllbnRcbiIKLSJcbiIKLSIJc2V0IHdkIFwiJG1lbnUuZGlzY29ubmVjdFwiXG4iCi0iCWNhdGNoIHtkZXN0cm95ICR3ZH1cbiIKLSIJbWVudSAkd2QgLXRlYXJvZmYgMCAtZm9udCAkZmZvbnQgXFxcbiIKLSIJCS1wb3N0Y29tbWFuZCB7c2V0IHBvcHVwX2Nhc2NhZGVfcG9zdGVkIDF9XG4iCi0iCSR3ZCBhZGQgY29tbWFuZCAtbGFiZWwgXCJEaXNjb25uZWN0IGNsaWVudDpcIlxuIgotIgkkd2QgYWRkIHNlcGFyYXRvclxuIgotIgkkd2QgYWRkIGNvbW1hbmQgLWxhYmVsIFwiQWxsIENsaWVudHNcIiAtY29tbWFuZCBkb19kaXNjb25uZWN0X2FsbFxuIgotIgkkbWVudSBhZGQgY2FzY2FkZSAtZm9udCAkbWZvbnQgLWxhYmVsIFwiRGlzY29ubmVjdDpcIiAtbWVudSAkd2RcbiIKLSJcbiIKLSIJJG1lbnUgYWRkIHNlcGFyYXRvclxuIgotIlxuIgotIglzZXQgd3YgXCIkbWVudS53aW5kb3d2aWV3XCJcbiIKLSIJY2F0Y2gge2Rlc3Ryb3kgJHd2fVxuIgotIgltZW51ICR3diAtdGVhcm9mZiAwIC1mb250ICRmZm9udCBcXFxuIgotIgkJLXBvc3Rjb21tYW5kIHtzZXQgcG9wdXBfY2FzY2FkZV9wb3N0ZWQgMX1cbiIKLSIJZm9yZWFjaCB2YWwge2Z1bGwgaWNvbiB0cmF5fSB7XG4iCi0iCQkkd3YgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCBcIiR2YWxcIiBcXFxuIgotIgkJCS12YWx1ZSBcIiR2YWxcIiAtZm9udCAkZmZvbnQgXFxcbiIKLSIJCQktY29tbWFuZCBcImRvX3ZhciBXaW5kb3dWaWV3XCIgXFxcbiIKLSIJCQktdmFyaWFibGUgbWVudV92YXIoV2luZG93VmlldylcbiIKLSIJfVxuIgotIgkkbWVudSBhZGQgY2FzY2FkZSAtZm9udCAkbWZvbnQgLWxhYmVsIFwiV2luZG93IFZpZXc6XCIgLW1lbnUgJHd2XG4iCi0iXG4iCi0iCSRtZW51IGFkZCBjb21tYW5kIC1mb250ICRtZm9udCAtbGFiZWwgXCJEaXNtaXNzXCIgLWNvbW1hbmQgXCIkbWVudSB1bnBvc3RcIlxuIgotIgkkbWVudSBhZGQgY29tbWFuZCAtZm9udCAkbWZvbnQgLWxhYmVsIFwiU3RvcCB4MTF2bmNcIiAtY29tbWFuZCBjbGVhbl9pY29uX2V4aXRcbiIKLSJcbiIKLSIJc2V0IGl0ZW1zIFtnZXRfY3VzdG9tX21lbnVfaXRlbXNdXG4iCi0iCXNldCBpMCBbbGluZGV4ICRpdGVtcyAwXVxuIgotIglpZiB7JGkwICE9IFwibm9uZVwiICYmICRpMCAhPSBcIm5vY2hhbmdlXCJ9IHtcbiIKLSIJCSRtZW51IGFkZCBzZXBhcmF0b3JcbiIKLSIJCXNldCBjbSBcIiRtZW51LmN1c3RvbVwiXG4iCi0iCQljYXRjaCB7ZGVzdHJveSAkY219XG4iCi0iCQltZW51ICRjbSAtdGVhcm9mZiAwIC1mb250ICRmZm9udCBcXFxuIgotIgkJCS1wb3N0Y29tbWFuZCBcInNldCBwb3B1cF9jYXNjYWRlX3Bvc3RlZCAxOyBtYWtlX2N1c3RvbV9tZW51ICRjbSAkZmZvbnRcIlxuIgotIgkJJG1lbnUgYWRkIGNhc2NhZGUgLWZvbnQgJG1mb250IC1sYWJlbCBcIkN1c3RvbTpcIiAtbWVudSAkY21cbiIKLSIJfVxuIgotIlxuIgotIgliaW5kICRpY29uX3dpbiA8QnV0dG9uUmVsZWFzZS0xPiBcInBtZW51ICRtZW51ICVYICVZXCJcbiIKLSIJYmluZCAkaWNvbl93aW4gPEJ1dHRvblJlbGVhc2UtMz4gXCJwbWVudSAkbWVudSAlWCAlWVwiXG4iCi0iCWJpbmQgJGljb25fd2luIDxFbnRlcj4ge3NldCBjbGllbnRfYmFsbG9vbl9pZCBbYWZ0ZXIgNTAwIHNob3dfY2xpZW50X2JhbGxvb25dfVxuIgotIgliaW5kICRpY29uX3dpbiA8QnV0dG9uPiB7a2lsbF9jbGllbnRfYmFsbG9vbn1cbiIKLSIJYmluZCAkaWNvbl93aW4gPExlYXZlPiAge2tpbGxfY2xpZW50X2JhbGxvb259XG4iCi0iCWJpbmQgJGljb25fd2luIDxTaGlmdC1CdXR0b25SZWxlYXNlLTE+IHtraWxsX2NsaWVudF9iYWxsb29uOyBzaG93X2NsaWVudF9iYWxsb29ufVxuIgotIgliaW5kICRpY29uX3dpbiA8QnV0dG9uUmVsZWFzZS0yPiB7a2lsbF9jbGllbnRfYmFsbG9vbjsgc2hvd19jbGllbnRfYmFsbG9vbn1cbiIKLSIjCWJpbmQgJG1lbnUgPExlYXZlPiBcImxtZW51ICRtZW51XCJcbiIKLSIjCWJpbmQgJG1lbnUgPEVudGVyPiBcInNldCBsZWZ0X2ljb253aW5fbWVudSAwXCJcbiIKLSIjCWJpbmQgJG1lbnUgPEtleVByZXNzLUVzY2FwZT4gXCIkbWVudSB1bnBvc3RcIlxuIgotIlxuIgotIgliaW5kIC4gPENvbnRyb2wtS2V5UHJlc3MtYz4ge2Rlc3Ryb3kgLjsgZXhpdCAwfVxuIgotIlxuIgotIglpZiB7ISR0cmF5X2VtYmVkIHx8ICEkdHJheV9ydW5uaW5nfSB7XG4iCi0iCQlnbG9iYWwgeDExdm5jX2d1aV9nZW9tXG4iCi0iCQlpZiB7JHgxMXZuY19ndWlfZ2VvbSAhPSBcIlwifSB7XG4iCi0iCQkJc2V0IGRvaXQgMVxuIgotIgkJCWlmIHtbcmVnZXhwIHt4fSAkeDExdm5jX2d1aV9nZW9tXX0ge1xuIgotIgkJCQlpZiB7JGd1aV9zdGFydF9tb2RlID09IFwiZnVsbFwifSB7XG4iCi0iCQkJCQlzZXQgZG9pdCAwXG4iCi0iCQkJCX1cbiIKLSIJCQl9IFxuIgotIgkJCWlmIHskZG9pdH0ge1xuIgotIgkJCQl3bSBnZW9tZXRyeSAuICR4MTF2bmNfZ3VpX2dlb21cbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJd20gaWNvbm5hbWUgLiBcInRreDExdm5jXCJcbiIKLSIJd20gdGl0bGUgLiBcInRreDExdm5jXCJcbiIKLSIJdXBkYXRlXG4iCi0iCWlmIHskdHJheV9lbWJlZCAmJiAkdHJheV9ydW5uaW5nfSB7XG4iCi0iCQkjd20gZGVpY29uaWZ5IC47ICAgIyAgd2h5IGRpZCB3ZSBoYXZlIHRoaXM/Pz9cbiIKLSIJCSNhZnRlciAxMDAwMCB7d20gZGVpY29uaWZ5IC47IHB1dHMgXCJyZXFoZWlnaHQgW3dpbmZvIHJlcWhlaWdodCAuXVwiOyBwdXRzIFwicmVxd2lkdGggIFt3aW5mbyByZXF3aWR0aCAgLl1cIjsgcHV0cyBcImhlaWdodCBbd2luZm8gaGVpZ2h0IC5dXCI7IHB1dHMgXCJ3aWR0aCAgW3dpbmZvIHdpZHRoICAuXVwifVxuIgotIgl9IGVsc2Uge1xuIgotIgkJd20gZGVpY29uaWZ5IC5cbiIKLSIJfVxuIgotIgl1cGRhdGVcbiIKLSJcbiIKLSIjcHV0cyBcInJlcWhlaWdodCBbd2luZm8gcmVxaGVpZ2h0IC5dXCJcbiIKLSIjcHV0cyBcInJlcXdpZHRoICBbd2luZm8gcmVxd2lkdGggIC5dXCJcbiIKLSIjcHV0cyBcImhlaWdodCBbd2luZm8gaGVpZ2h0IC5dXCJcbiIKLSIjcHV0cyBcIndpZHRoICBbd2luZm8gd2lkdGggIC5dXCJcbiIKLSIjcHV0cyBcIkFBQVwiXG4iCi0iXG4iCi0iCW9sZF9iYWxsb29uXG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0dXBfY2xpZW50X2NoYW5uZWwge30ge1xuIgotIglnbG9iYWwgY2xpZW50X3NvY2sgY2xpZW50X3RhaWxcbiIKLSJcbiIKLSIjIFhYWC9zZXR1cF9jbGllbnRfY2hhbm5lbFxuIgotIglpZiB7JGNsaWVudF9zb2NrID09IFwiXCIgfSB7XG4iCi0iCQlzdG9wX3dhdGNoIG9uXG4iCi0iCQl0cnlfY2xpZW50X2luZm9fc29ja1xuIgotIgkJaWYgeyRjbGllbnRfc29jayA9PSBcIlwiIH0ge1xuIgotIgkJCWFmdGVyIDUwMFxuIgotIgkJCXRyeV9jbGllbnRfaW5mb19zb2NrXG4iCi0iCQl9XG4iCi0iCQlzdG9wX3dhdGNoIG9mZlxuIgotIgl9XG4iCi0iCWlmIHskY2xpZW50X3RhaWwgPT0gXCJcIiAmJiAkY2xpZW50X3NvY2sgPT0gXCJcIn0ge1xuIgotIgkJc2V0IG0gXCJcXG5cIlxuIgotIgkJc2V0IG0gXCIke219dGt4MTF2bmM6XFxuXCJcbiIKLSIJCXNldCBtIFwiJHttfVxcblwiXG4iCi0iCQlzZXQgbSBcIiR7bX0gICAgV2FybmluZyAtLSBydW5uaW5nIGluIGljb24vdHJheSBtb2RlIGJ1dCB0aGVcXG5cIlxuIgotIgkJc2V0IG0gXCIke219ICAgIGNvbm5lY3RlZCBjbGllbnQgaW5mbyBjaGFubmVsIGZyb20geDExdm5jIGlzXFxuXCJcbiIKLSIJCXNldCBtIFwiJHttfSAgICBub3Qgd29ya2luZy4gIFRoZSB2aWV3ZXIgY2xpZW50IGxpc3QgYW5kIGljb25cXG5cIlxuIgotIgkJc2V0IG0gXCIke219ICAgIGNvbG9yIGluZGljYXRvciB3aWxsIG5vdCBiZSBhY2N1cmF0ZS5cXG5cIlxuIgotIgkJc2V0IG0gXCIke219XFxuXCJcbiIKLSIJCXNldCBtIFwiJHttfSAgICBZb3UgbWF5IG5lZWQgdG8gcmVzdGFydCBcXFwieDExdm5jIC1ndWkgdHJheSAuLi5cXFwiXFxuXCJcbiIKLSIJCXNldCBtIFwiJHttfSAgICBmb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5LlxcblwiXG4iCi0iCQlzZXQgbSBcIiR7bX1cXG5cIlxuIgotIgkJdGV4dHdpbiBcIldhcm5pbmdcIiBcIldhcm5pbmdcIiAkbVxuIgotIgkJdXBkYXRlXG4iCi0iCX1cbiIKLSIJZHRpbWUgQ1xuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGNsZWFuX2NsaWVudF90YWlsIHt9IHtcbiIKLSIJZ2xvYmFsIGNsaWVudF90YWlsIGNsaWVudF9pbmZvX3JlYWRcbiIKLSIJaWYgW2luZm8gZXhpc3RzIGNsaWVudF90YWlsXSB7XG4iCi0iCQlpZiB7JGNsaWVudF90YWlsICE9IFwiXCJ9IHtcbiIKLSIJCQlzZXQgcCBcIlwiXG4iCi0iCQkJY2F0Y2gge3NldCBwIFtwaWQgJGNsaWVudF90YWlsXX1cbiIKLSIJCQlpZiB7JHAgIT0gXCJcIn0ge1xuIgotIgkJCQljYXRjaCB7ZXhlYyBraWxsIC1URVJNICRwID4vZGV2L251bGwgMj4vZGV2L251bGx9XG4iCi0iCQkJfVxuIgotIgkJCWNhdGNoIHtjbG9zZSAkY2xpZW50X3RhaWx9XG4iCi0iCQkJc2V0IGNsaWVudF90YWlsIFwiXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglzZXQgY2xpZW50X2luZm9fcmVhZCAwXG4iCi0ifVxuIgotIlxuIgotInByb2MgY2xlYW5faWNvbl9leGl0IHt9IHtcbiIKLSIJY2xlYW5fY2xpZW50X3RhaWxcbiIKLSIJcHVzaF9uZXdfdmFsdWUgXCJzdG9wXCIgXCJzdG9wXCIgMSAwXG4iCi0iCXNldF9jb25uZWN0ZWQgbm9cbiIKLSIJdXBkYXRlXG4iCi0iCWRlc3Ryb3kgLlxuIgotIglleGl0XG4iCi0ifVxuIgotIlxuIgotInByb2MgbWFrZV9ndWkge21vZGV9IHtcbiIKLSIJZ2xvYmFsIGljb25fbW9kZSB0cmF5X2VtYmVkIHRyYXlfcnVubmluZyBmdWxsX3dpbiBpY29uX3dpblxuIgotIglnbG9iYWwgdG9wX3dpZGdldF9uYW1lcyB4MTF2bmNfZ3VpX2dlb21cbiIKLSIJZ2xvYmFsIGd1aV9jdXJyZW50X3N0YXRlIG1ha2VfZ3VpX2NvdW50XG4iCi0iCWdsb2JhbCB4MTF2bmNfY29ubmVjdCBjb25uZWN0ZWRfdG9feDExdm5jXG4iCi0iCWdsb2JhbCB4MTFfZGlzcGxheVxuIgotIglnbG9iYWwgZ3VpX3N0YXJ0X21vZGVcbiIKLSJcbiIKLSIJaW5jciBtYWtlX2d1aV9jb3VudFxuIgotIlxuIgotIglpZiB7JGd1aV9zdGFydF9tb2RlID09IFwiXCJ9IHtcbiIKLSIJCXNldCBndWlfc3RhcnRfbW9kZSAkbW9kZVxuIgotIgl9XG4iCi0iXG4iCi0iCXdtIHdpdGhkcmF3IC5cbiIKLSJcbiIKLSIJc2V0IGZ1bGxfZ2VvbSBcIlwiXG4iCi0iCWlmIHtbd2luZm8gZXhpc3RzIC5mdWxsXX0ge1xuIgotIgkJY2F0Y2gge3NldCBmdWxsX2dlb20gW3dtIGdlb21ldHJ5IC5mdWxsXX1cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgZncgLmZ1bGxcbiIKLSIJc2V0IGZ1bGxfd2luICRmd1xuIgotIgljYXRjaCB7cGFjayBmb3JnZXQgJGZ1bGxfd2lufVxuIgotIgljYXRjaCB7cGFjayBmb3JnZXQgJGljb25fd2lufVxuIgotIgljYXRjaCB7ZGVzdHJveSAkZnVsbF93aW59XG4iCi0iCWNhdGNoIHtkZXN0cm95ICRpY29uX3dpbn1cbiIKLSJcbiIKLSIJd20gbWluc2l6ZSAuIDEgMVxuIgotIlxuIgotIglzZXQgZ3VpX2N1cnJlbnRfc3RhdGUgXCJcIlxuIgotIlxuIgotIglpZiB7JG1vZGUgPT0gXCJmdWxsXCJ9IHtcbiIKLSIJCWZyYW1lICRmd1xuIgotIgkJc2V0IGljb25fbW9kZSAwXG4iCi0iXG4iCi0iCQl3bSBwcm90b2NvbCAuICAgICBXTV9ERUxFVEVfV0lORE9XIFwiZGVzdHJveSAuOyBleGl0XCJcbiIKLSIJCW1ha2Vfd2lkZ2V0cyAkZndcbiIKLSJcbiIKLSIJCXNldCB3IFwiLlwiXG4iCi0iCQl3bSBnZW9tZXRyeSAkdyBcIlwiXG4iCi0iCQlpZiB7JHgxMXZuY19ndWlfZ2VvbSAhPSBcIlwifSB7XG4iCi0iCQkJc2V0IGRvaXQgMVxuIgotIgkJCWlmIHtbcmVnZXhwIHt4fSAkeDExdm5jX2d1aV9nZW9tXX0ge1xuIgotIgkJCQlpZiB7JGd1aV9zdGFydF9tb2RlICE9ICRtb2RlfSB7XG4iCi0iCQkJCQlzZXQgZG9pdCAwXG4iCi0iCQkJCX1cbiIKLSIJCQl9XG4iCi0iCQkJaWYgeyRkb2l0fSB7XG4iCi0iCQkJCXdtIGdlb21ldHJ5ICR3ICR4MTF2bmNfZ3VpX2dlb21cbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCQlwYWNrICRmdyAtZmlsbCBib3RoIC1leHBhbmQgMVxuIgotIlxuIgotIgl9IGVsc2VpZiB7JG1vZGUgPT0gXCJpY29uXCIgfHwgJG1vZGUgPT0gXCJ0cmF5XCJ9IHtcbiIKLSJcbiIKLSIJCXRvcGxldmVsICRmd1xuIgotIgkJd20gd2l0aGRyYXcgJGZ3XG4iCi0iXG4iCi0iCQl3bSBwcm90b2NvbCAkZncgV01fREVMRVRFX1dJTkRPVyBcIndtIHdpdGhkcmF3IC5mdWxsXCJcbiIKLSIJCXdtIHByb3RvY29sIC4gICBXTV9ERUxFVEVfV0lORE9XIFwiY2xlYW5faWNvbl9leGl0XCJcbiIKLSIJCVxuIgotIgkJaWYgeyRtb2RlID09IFwiaWNvblwifSB7XG4iCi0iCQkJc2V0IHRyYXlfZW1iZWQgMFxuIgotIgkJfSBlbHNlaWYgeyRtb2RlID09IFwidHJheVwifSB7XG4iCi0iCQkJc2V0IHRyYXlfZW1iZWQgMVxuIgotIgkJfVxuIgotIgkJc2V0IGljb25fbW9kZSAxXG4iCi0iCQltYWtlX3dpZGdldHMgJGZ3XG4iCi0iCQlzZXQgdyAkZndcbiIKLSIJCW1ha2VfaWNvblxuIgotIgkJd20gZ2VvbWV0cnkgJGZ3IFwiXCJcbiIKLSIJCXdtIGdlb21ldHJ5IC4gICBcIlwiXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIglzZXRfdmlld192YXJpYWJsZSAkbW9kZVxuIgotIglzZXQgZ3VpX2N1cnJlbnRfc3RhdGUgJG1vZGVcbiIKLSJcbiIKLSJcbiIKLSIJdXBkYXRlXG4iCi0iCWlmIHshJHRyYXlfZW1iZWQgfHwgISR0cmF5X3J1bm5pbmd9IHtcbiIKLSIJCXdtIGRlaWNvbmlmeSAuXG4iCi0iCX1cbiIKLSIJdXBkYXRlIGlkbGV0YXNrc1xuIgotIgl3bSBtaW5zaXplICR3IFt3aW5mbyB3aWR0aCAkd10gW3dpbmZvIGhlaWdodCAkd11cbiIKLSIJaWYgeyRtb2RlID09IFwiZnVsbFwiICYmICRtYWtlX2d1aV9jb3VudCA+IDF9IHtcbiIKLSIJCWNlbnRlcl93aW4gLlxuIgotIgl9XG4iCi0iXG4iCi0iXG4iCi0iCWlmIHskbWFrZV9ndWlfY291bnQgPT0gMX0ge1xuIgotIgkJY29weV9kZWZhdWx0X3ZhcnNcbiIKLSIJCWlmIHskeDExdm5jX2Nvbm5lY3R9IHtcbiIKLSIJCQl0cnlfY29ubmVjdF9hbmRfcXVlcnlfYWxsXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCWluc2VydF9jbWRsaW5lX3ZhcnNcbiIKLSIJCX1cbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldF9uYW1lIFwiUkVTVE9SRVwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0dXBfY2xpZW50X3RhaWxcbiIKLSJcbiIKLSIJc2V0X3dpZGdldHNcbiIKLSJcbiIKLSIJaWYgeyRtb2RlID09IFwidHJheVwifSB7XG4iCi0iCQlzZXR1cF90cmF5X2VtYmVkXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBtYWtlX3dpZGdldHMge3RvcH0ge1xuIgotIglnbG9iYWwgdGVtcGxhdGUgbWFrZV9ndWlfY291bnRcbiIKLSIJZ2xvYmFsIG1lbnVfYiBtZW51X20gbWVudV9jb3VudFxuIgotIglnbG9iYWwgaXRlbV9vcHRzIGl0ZW1fYm9vbCBpdGVtX2Nhc2UgaXRlbV9tZW51IGl0ZW1fZW50cnkgbWVudV92YXIgdW5zZXRfc3RyXG4iCi0iCWdsb2JhbCBpdGVtX2Nhc2NhZGVcbiIKLSIJZ2xvYmFsIGluZm9fbGFiZWwgaW5mb19zdHIgeDExX2Rpc3BsYXkgdm5jX2Rpc3BsYXlcbiIKLSIJZ2xvYmFsIHRleHRfYXJlYSB0ZXh0X2FyZWFfc3RyXG4iCi0iCWdsb2JhbCBlbnRyeV9ib3ggZW50cnlfc3RyIGVudHJ5X3NldCBlbnRyeV9sYWJlbCBlbnRyeV9vayBlbnRyeV9icm93c2VcbiIKLSIJZ2xvYmFsIGVudHJ5X2hlbHAgZW50cnlfc2tpcFxuIgotIglnbG9iYWwgYmZvbnQgZmZvbnQgYmVnaW5uZXJfbW9kZVxuIgotIglnbG9iYWwgaGVscHRleHQgaGVscHJlbW90ZSBoZWxwbGFiZWxcbiIKLSIJZ2xvYmFsIGljb25fbW9kZSBpY29uX3dpbiBwcm9wc193aW4gZnVsbF93aW5cbiIKLSIJZ2xvYmFsIHRvcF93aWRnZXRfbmFtZXNcbiIKLSIJZ2xvYmFsIHNjcmVlbl9oZWlnaHQgc2NyZWVuX3dpZHRoXG4iCi0iXG4iCi0iXG4iCi0iCSMgTWFrZSB0aGUgdG9wIGxhYmVsXG4iCi0iCXNldCBsYWJlbF93aWR0aCA4NFxuIgotIglpZiB7JHNjcmVlbl93aWR0aCA8PSA0MDB9IHtcbiIKLSIJCXNldCBsYWJlbF93aWR0aCA2NFxuIgotIgl9XG4iCi0iCXNldCBpbmZvX2xhYmVsIFwiJHRvcC5pbmZvXCJcbiIKLSIJbGFiZWwgJGluZm9fbGFiZWwgLXRleHR2YXJpYWJsZSBpbmZvX3N0ciAtYmQgMiAtcmVsaWVmIGdyb292ZSBcXFxuIgotIgkJLWFuY2hvciB3IC13aWR0aCAkbGFiZWxfd2lkdGggLWZvbnQgJGZmb250XG4iCi0iCXBhY2sgJGluZm9fbGFiZWwgLXNpZGUgdG9wIC1maWxsIHggLWV4cGFuZCAwXG4iCi0iXG4iCi0iCXNldCB0b3Bfd2lkZ2V0X25hbWVzKGluZm8pICRpbmZvX2xhYmVsXG4iCi0iXG4iCi0iCSMgRXh0cmFjdCB0aGUgUm93czpcbiIKLSIJc2V0IHJvdyAwO1xuIgotIglzZXQgY29sbWF4IDA7XG4iCi0iCWZvcmVhY2ggbGluZSBbc3BsaXQgJHRlbXBsYXRlIFwiXFxuXCJdIHtcbiIKLSIJCWlmIHtbcmVnZXhwIHteUm93OiAoLiopfSAkbGluZSByZXN0XX0ge1xuIgotIgkJCXNldCBjb2wgMFxuIgotIgkJCWZvcmVhY2ggY2FzZSBbc3BsaXQgJHJlc3RdIHtcbiIKLSIJCQkJaWYgeyRjYXNlID09IFwiXCIgfHwgJGNhc2UgPT0gXCJSb3c6XCJ9IHtcbiIKLSIJCQkJCWNvbnRpbnVlXG4iCi0iCQkJCX1cbiIKLSIJCQkJc2V0IG1lbnVfcm93KCRjYXNlKSAkcm93XG4iCi0iCQkJCXNldCBtZW51X2NvbCgkY2FzZSkgJGNvbFxuIgotIlxuIgotIgkJCQlsYXBwZW5kIGNhc2VzKCRjb2wpICRjYXNlO1xuIgotIgkJCQlzZXQgbGVuIFtzdHJpbmcgbGVuZ3RoICRjYXNlXVxuIgotIgkJCQlpZiB7W2luZm8gZXhpc3RzIG1heF9sZW4oJGNvbCldfSB7XG4iCi0iCQkJCQlpZiB7JGxlbiA+ICRtYXhfbGVuKCRjb2wpfSB7XG4iCi0iCQkJCQkJc2V0IG1heF9sZW4oJGNvbCkgJGxlblxuIgotIgkJCQkJfVxuIgotIgkJCQl9IGVsc2Uge1xuIgotIgkJCQkJc2V0IG1heF9sZW4oJGNvbCkgJGxlblxuIgotIgkJCQl9XG4iCi0iCQkJCWluY3IgY29sXG4iCi0iCQkJCWlmIHskY29sID4gJGNvbG1heH0ge1xuIgotIgkJCQkJc2V0IGNvbG1heCAkY29sXG4iCi0iCQkJCX1cbiIKLSIJCQl9XG4iCi0iCQkJaW5jciByb3c7XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJIyBNYWtlIGZyYW1lcyBmb3IgdGhlIHJvd3MgYW5kIG1ha2UgdGhlIG1lbnUgYnV0dG9ucy5cbiIKLSIJc2V0IGYgXCIkdG9wLm1lbnVmcmFtZVwiXG4iCi0iCWZyYW1lICRmXG4iCi0iCWZvciB7c2V0IGMgMH0geyRjIDwgJGNvbG1heH0ge2luY3IgY30ge1xuIgotIgkJc2V0IGNvbGYgXCIkZi5tZW51ZnJhbWUkY1wiXG4iCi0iCQlmcmFtZSAkY29sZlxuIgotIgkJcGFjayAkY29sZiAtc2lkZSBsZWZ0IC1maWxsIHlcbiIKLSIJCXNldCBmYmcgWyRjb2xmIGNnZXQgLWJhY2tncm91bmRdXG4iCi0iCQlmb3JlYWNoIGNhc2UgJGNhc2VzKCRjKSB7XG4iCi0iCQkJc2V0IG1lbnViIFwiJGNvbGYubWVudSRjYXNlXCI7XG4iCi0iCQkJc2V0IG1lbnUgXCIkY29sZi5tZW51JGNhc2UubWVudVwiO1xuIgotIgkJCXNldCBtZW51X2IoJGNhc2UpICRtZW51YlxuIgotIgkJCXNldCBtZW51X20oJGNhc2UpICRtZW51XG4iCi0iCQkJc2V0IHVsIDBcbiIKLSIJCQlmb3JlYWNoIGNoYXIgW3NwbGl0ICRjYXNlIFwiXCJdIHtcbiIKLSIJCQkJc2V0IGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyXVxuIgotIgkJCQlpZiB7IVtpbmZvIGV4aXN0cyB1bmRlcmxpbmVkKCRjaGFyKV19IHtcbiIKLSIJCQkJCXNldCB1bmRlcmxpbmVkKCRjaGFyKSAxXG4iCi0iCQkJCQlicmVha1xuIgotIgkJCQl9XG4iCi0iCQkJCWluY3IgdWxcbiIKLSIJCQl9XG4iCi0iCQkJZ2xvYmFsIG9zbmFtZVxuIgotIgkJCXNldCB0c3RyIFwiJGNhc2VcIlxuIgotIgkJCWlmIHskb3NuYW1lID09IFwiRGFyd2luXCJ9IHtcbiIKLSIJCQkJI3NldCB0c3RyIFwiICRjYXNlICAgXCJcbiIKLSIJCQl9XG4iCi0iCQkJbWVudWJ1dHRvbiAkbWVudWIgLXRleHQgXCIkdHN0clwiIC11bmRlcmxpbmUgJHVsIFxcXG4iCi0iCQkJCS1hbmNob3IgdyAtbWVudSAkbWVudSAtYmFja2dyb3VuZCAkZmJnIFxcXG4iCi0iCQkJCS1mb250ICRiZm9udFxuIgotIgkJCXBhY2sgJG1lbnViIC1zaWRlIHRvcCAtZmlsbCB4XG4iCi0iCQkJbWVudSAkbWVudSAtdGVhcm9mZiAwIC1wb3N0Y29tbWFuZCBtZW51X3Bvc3RlZFxuIgotIgkJfVxuIgotIgl9XG4iCi0iCXBhY2sgJGYgLXNpZGUgdG9wIC1maWxsIHhcbiIKLSIJc2V0IHRvcF93aWRnZXRfbmFtZXMobWVudWZyYW1lKSAkZlxuIgotIlxuIgotIgltYWtlX21lbnVfaXRlbXNcbiIKLSJcbiIKLSIJIyBNYWtlIHRoZSB4MTEgYW5kIHZuYyBkaXNwbGF5IGxhYmVsIGJhcjpcbiIKLSIJc2V0IGRmIFwiJHRvcC5kaXNwbGF5ZnJhbWVcIlxuIgotIglmcmFtZSAkZGYgLWJkIDEgLXJlbGllZiBncm9vdmVcbiIKLSIJc2V0IHRvcF93aWRnZXRfbmFtZXMoZGlzcGxheWZyYW1lKSAkZGZcbiIKLSJcbiIKLSIJc2V0IGRmX3gxMSBcIiRkZi54ZGlzcGxheVwiXG4iCi0iXG4iCi0iCWlmIHskbWFrZV9ndWlfY291bnQgPT0gMX0ge1xuIgotIgkJbm9feDExX2Rpc3BsYXlcbiIKLSIJfVxuIgotIglzZXQgbHcgW2V4cHIgeyRsYWJlbF93aWR0aCAvIDJ9XVxuIgotIglsYWJlbCAkZGZfeDExIC10ZXh0dmFyaWFibGUgeDExX2Rpc3BsYXkgLXdpZHRoICRsdyAtYW5jaG9yIHcgXFxcbiIKLSIJCS1mb250ICRmZm9udFxuIgotIlxuIgotIglzZXQgZGZfdm5jIFwiJGRmLnZkaXNwbGF5XCJcbiIKLSJcbiIKLSIJaWYgeyRtYWtlX2d1aV9jb3VudCA9PSAxfSB7XG4iCi0iCQlub192bmNfZGlzcGxheVxuIgotIgl9XG4iCi0iCWxhYmVsICRkZl92bmMgLXRleHR2YXJpYWJsZSB2bmNfZGlzcGxheSAtd2lkdGggJGx3IC1hbmNob3IgdyBcXFxuIgotIgkJLWZvbnQgJGZmb250XG4iCi0iXG4iCi0iCXBhY2sgJGRmX3gxMSAkZGZfdm5jIC1zaWRlIGxlZnQgXG4iCi0iCXBhY2sgJGRmIC1zaWRlIHRvcCAtZmlsbCB4XG4iCi0iXG4iCi0iCSMgdGV4dCBhcmVhXG4iCi0iCWdsb2JhbCB0ZXh0X2hlaWdodFxuIgotIglzZXQgdGV4dF9hcmVhIFwiJHRvcC50ZXh0XCJcbiIKLSIJaWYgeyRzY3JlZW5fd2lkdGggPD0gNDAwfSB7XG4iCi0iCQl0ZXh0ICR0ZXh0X2FyZWEgLWhlaWdodCAkdGV4dF9oZWlnaHQgLXdpZHRoICRsYWJlbF93aWR0aCBcXFxuIgotIgkJCS1yZWxpZWYgcmlkZ2UgLWZvbnQgJGZmb250XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQl0ZXh0ICR0ZXh0X2FyZWEgLWhlaWdodCAkdGV4dF9oZWlnaHQgLXJlbGllZiByaWRnZSAtZm9udCAkZmZvbnRcbiIKLSIJfVxuIgotIglwYWNrICR0ZXh0X2FyZWEgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxXG4iCi0iCXNldCB0b3Bfd2lkZ2V0X25hbWVzKHRleHQpICR0ZXh0X2FyZWFcbiIKLSJcbiIKLSJcbiIKLSIJaWYgeyR0ZXh0X2FyZWFfc3RyID09IFwiXCJ9IHtcbiIKLSIJCXNldCBzdHIgXCJDbGljayBIZWxwIC0+IGd1aSBmb3Igb3ZlcnZpZXcuXCJcbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFxuJHN0clxcblxcblwiXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlhcHBlbmRfdGV4dCAkdGV4dF9hcmVhX3N0clxuIgotIgl9XG4iCi0iXG4iCi0iCSMgTWFrZSBlbnRyeSBib3ggc3R1ZmZcbiIKLSIJc2V0IGVmIFwiJHRvcC5lbnRyeWZyYW1lXCJcbiIKLSIJZnJhbWUgJGVmIC1iZCAxIC1yZWxpZWYgZ3Jvb3ZlXG4iCi0iCXNldCB0b3Bfd2lkZ2V0X25hbWVzKGVudHJ5ZnJhbWUpICRlZlxuIgotIlxuIgotIgkjIEVudHJ5IExhYmVsXG4iCi0iCXNldCBlZl9sYWJlbCBcIiRlZi5sYWJlbFwiXG4iCi0iCWxhYmVsICRlZl9sYWJlbCAtdGV4dHZhcmlhYmxlIGVudHJ5X3N0ciAtYW5jaG9yIHcgLWZvbnQgJGJmb250XG4iCi0iXG4iCi0iCXNldCBlbnRyeV9zdHIgXCJTZXQuLi4gOiBcIlxuIgotIglzZXQgZWZfZW50cnkgXCIkZWYuZW50cnlcIlxuIgotIgllbnRyeSAkZWZfZW50cnkgLXJlbGllZiBzdW5rZW4gLWZvbnQgJGZmb250XG4iCi0iCWJpbmQgJGVmX2VudHJ5IDxLZXlQcmVzcy1SZXR1cm4+IHtzZXQgZW50cnlfc2V0IDF9XG4iCi0iCWJpbmQgJGVmX2VudHJ5IDxLZXlQcmVzcy1Fc2NhcGU+IHtzZXQgZW50cnlfc2V0IDB9XG4iCi0iXG4iCi0iCXNldCBva19zIFwiT0tcIlxuIgotIglzZXQgY2FuY2VsX3MgXCJDYW5jZWxcIlxuIgotIglzZXQgaGVscF9zIFwiSGVscFwiXG4iCi0iCXNldCBicm93c2VfcyBcIkJyb3dzZS4uLlwiXG4iCi0iCWdsb2JhbCBvc25hbWVcbiIKLSIJaWYgeyRvc25hbWUgPT0gXCJEYXJ3aW5cIn0ge1xuIgotIgkJc2V0IG9rX3MgXCIgT0sgICBcIlxuIgotIgkJc2V0IGNhbmNlbF9zIFwiIENhbmNlbCAgIFwiXG4iCi0iCQlzZXQgaGVscF9zIFwiIEhlbHAgICBcIlxuIgotIgkJc2V0IGJyb3dzZV9zIFwiIEJyb3dzZS4uLiAgIFwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJIyBFbnRyeSBPSyBidXR0b25cbiIKLSIJc2V0IGJweCBcIjFtXCJcbiIKLSIJc2V0IGJweSBcIjFcIlxuIgotIglzZXQgaGx0IFwiMFwiXG4iCi0iCXNldCBlZl9vayBcIiRlZi5va1wiXG4iCi0iCWJ1dHRvbiAkZWZfb2sgLXRleHQgJG9rX3MgLXBhZHkgJGJweSAtcGFkeCAkYnB4IC1jb21tYW5kIHtzZXQgZW50cnlfc2V0IDF9IFxcXG4iCi0iCQktaGlnaGxpZ2h0dGhpY2tuZXNzICRobHQgXFxcbiIKLSIJCS1mb250ICRiZm9udFxuIgotIlxuIgotIgkjIEVudHJ5IFNraXAgYnV0dG9uXG4iCi0iCXNldCBlZl9za2lwIFwiJGVmLnNraXBcIlxuIgotIglidXR0b24gJGVmX3NraXAgLXRleHQgJGNhbmNlbF9zIC1wYWR5ICRicHkgLXBhZHggJGJweCAtY29tbWFuZCB7c2V0IGVudHJ5X3NldCAwfSBcXFxuIgotIgkJLWhpZ2hsaWdodHRoaWNrbmVzcyAkaGx0IFxcXG4iCi0iCQktZm9udCAkYmZvbnRcbiIKLSJcbiIKLSIJIyBFbnRyeSBIZWxwIGJ1dHRvblxuIgotIglzZXQgZWZfaGVscCBcIiRlZi5oZWxwXCJcbiIKLSIJYnV0dG9uICRlZl9oZWxwIC10ZXh0ICRoZWxwX3MgLXBhZHkgJGJweSAtcGFkeCAkYnB4IC1jb21tYW5kIFxcXG4iCi0iCQl7bWVudV9oZWxwICRlbnRyeV9kaWFsb2dfaXRlbX0gLWZvbnQgJGJmb250IFxcXG4iCi0iCQktaGlnaGxpZ2h0dGhpY2tuZXNzICRobHRcbiIKLSJcbiIKLSIJIyBFbnRyeSBCcm93c2UgYnV0dG9uXG4iCi0iCXNldCBlZl9icm93c2UgXCIkZWYuYnJvd3NlXCJcbiIKLSIJYnV0dG9uICRlZl9icm93c2UgLXRleHQgJGJyb3dzZV9zIC1wYWR5ICRicHkgLXBhZHggJGJweCAtZm9udCAkYmZvbnQgXFxcbiIKLSIJCS1oaWdobGlnaHR0aGlja25lc3MgJGhsdCBcXFxuIgotIgkJLWNvbW1hbmQge2VudHJ5X2luc2VydCBbdGtfZ2V0T3BlbkZpbGVdfSBcbiIKLSJcbiIKLSIJcGFjayAkZWZfbGFiZWwgLXNpZGUgbGVmdFxuIgotIglwYWNrICRlZl9lbnRyeSAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxXG4iCi0iCXBhY2sgJGVmX29rICAgLXNpZGUgcmlnaHRcbiIKLSIJcGFjayAkZWZfc2tpcCAtc2lkZSByaWdodFxuIgotIglwYWNrICRlZl9oZWxwIC1zaWRlIHJpZ2h0XG4iCi0iCXBhY2sgJGVmIC1zaWRlIGJvdHRvbSAtZmlsbCB4XG4iCi0iXG4iCi0iCXNldCBlbnRyeV9vayAkZWZfb2tcbiIKLSIJc2V0IGVudHJ5X3NraXAgJGVmX3NraXBcbiIKLSIJc2V0IGVudHJ5X2hlbHAgJGVmX2hlbHBcbiIKLSIJc2V0IGVudHJ5X2JveCAkZWZfZW50cnlcbiIKLSIJc2V0IGVudHJ5X2Jyb3dzZSAkZWZfYnJvd3NlXG4iCi0iCXNldCBlbnRyeV9sYWJlbCAkZWZfbGFiZWxcbiIKLSIJZW50cnlfZGlzYWJsZVxuIgotIlxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIG1lbnVfYmluZGluZ3Mge219IHtcbiIKLSIJc2V0IGRiIDBcbiIKLSIJaWYgeyRkYn0ge3B1dHMgXCJtZW51X2JpbmRpbmdzICRtXCJ9XG4iCi0iXG4iCi0iCWJpbmQgJG0gPDxNZW51U2VsZWN0Pj4ge1xuIgotIiNzeW50YXggaGlsaXRlIGJ1ZyBcXFxuIgotIk1lbnVTZWxlY3Q+PlxuIgotIgkJc2V0IG4gWyVXIGluZGV4IGFjdGl2ZV1cbiIKLSIJCXNldCBkYiAwXG4iCi0iCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJtZW51X2JpbmRpbmdzICVXICRuXCJ9XG4iCi0iCQlzZXQgbGFiZWwgXCIgICAgXCJcbiIKLSIJCWlmIHskbiAhPSBcIm5vbmVcIn0ge1xuIgotIgkJCXNldCBzdHIgJVcsJG5cbiIKLSIJCQlzZXQgd2hpY2ggXCJcIlxuIgotIlxuIgotIgkJCWlmIHskZGJ9IHtwdXRzIFwibWVudV9iaW5kaW5ncyAkc3RyXCJ9XG4iCi0iCQkJaWYge1tpbmZvIGV4aXN0cyBoZWxwbGFiZWwoJHN0cildfSB7XG4iCi0iCQkJCXNldCB2bmFtZSBbZm9ybWF0ICUlLTE2cyAkaGVscGxhYmVsKCRzdHIpXVxuIgotIgkJCQlzZXQgbGFiZWwgXCJDbGljayAoPykgZm9yIGhlbHAgb246ICR2bmFtZVwiXG4iCi0iCQkJCXNldCB3aGljaCAkaGVscGxhYmVsKCRzdHIpXG4iCi0iCQkJfVxuIgotIgkJCWlmIHskd2hpY2ggPT0gXCJcIn0ge1xuIgotIgkJCQk7XG4iCi0iCQkJfSBlbHNlaWYgeyR3aGljaCA9PSBcInBhc3N3ZFwiIHx8ICR3aGljaCA9PSBcInZpZXdwYXNzd2RcIn0ge1xuIgotIgkJCQk7XG4iCi0iCQkJfSBlbHNlaWYge1tpc19hY3Rpb24gJHdoaWNoXX0ge1xuIgotIgkJCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKCR3aGljaCldIFxuIgotIgkJCQkgICAgJiYgJG1lbnVfdmFyKCR3aGljaCkgIT0gXCJcIn0ge1xuIgotIgkJCQkJc2V0IGxhYmVsIFwiJGxhYmVsIHZhbHVlOiAkbWVudV92YXIoJHdoaWNoKVwiXG4iCi0iCQkJCX0gZWxzZSB7XG4iCi0iCQkJCQlzZXQgbGFiZWwgXCIkbGFiZWwgKGlzIGFjdGlvbilcIlxuIgotIgkJCQl9XG4iCi0iCQkJfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBtZW51X3Zhcigkd2hpY2gpXX0ge1xuIgotIgkJCQlzZXQgbGFiZWwgXCIkbGFiZWwgdmFsdWU6ICRtZW51X3Zhcigkd2hpY2gpXCJcbiIKLSIJCQkJaWYgeyR3aGljaCA9PSBcImh0dHBcIn0ge1xuIgotIgkJCQkJZ2xvYmFsIHZuY191cmxcbiIKLSIJCQkJCXNldCBsYWJlbCBcIiRsYWJlbCAgVVJMOiAkdm5jX3VybFwiXG4iCi0iCQkJCX1cbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCQlzZXRfaW5mbyAkbGFiZWxcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGtleV9iaW5kaW5ncyB7fSB7XG4iCi0iCWdsb2JhbCBlbnYgbWVudXNfZGlzYWJsZWRcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBlbnYoVVNFUildICYmICRlbnYoVVNFUikgPT0gXCJydW5nZVwifSB7XG4iCi0iCQkjIHF1aWNrIHJlc3RhcnRcbiIKLSIJCWJpbmQgLiA8Q29udHJvbC1LZXlQcmVzcy1rPiB7ZXhlYyAkYXJndjAgJGFyZ3YgJjsgZGVzdHJveSAufVxuIgotIgl9XG4iCi0iCWJpbmQgLiA8Q29udHJvbC1LZXlQcmVzcy1wPiB7IFxcXG4iCi0iCQlnbG9iYWwgbWVudXNfZGlzYWJsZWQ7IFxcXG4iCi0iCQlpZiB7ISRtZW51c19kaXNhYmxlZH0ge3RyeV9jb25uZWN0X2FuZF9xdWVyeV9hbGx9IFxcXG4iCi0iCX1cbiIKLSIJYmluZCAuIDxDb250cm9sLUtleVByZXNzLXU+IHsgXFxcbiIKLSIJCWdsb2JhbCBtZW51c19kaXNhYmxlZDsgXFxcbiIKLSIJCWlmIHshJG1lbnVzX2Rpc2FibGVkfSB7cXVlcnlfYWxsIDB9IFxcXG4iCi0iCX1cbiIKLSIJYmluZCAuIDxDb250cm9sLUtleVByZXNzLXI+IHsgXFxcbiIKLSIJCWdsb2JhbCBtZW51c19kaXNhYmxlZDsgXFxcbiIKLSIJCWlmIHshJG1lbnVzX2Rpc2FibGVkfSB7cXVlcnlfYWxsIDB9IFxcXG4iCi0iCX1cbiIKLSIJYmluZCAuIDxDb250cm9sLUtleVByZXNzLWQ+IHsgXFxcbiIKLSIJCWdsb2JhbCBtZW51c19kaXNhYmxlZDsgXFxcbiIKLSIJCWlmIHshJG1lbnVzX2Rpc2FibGVkfSB7ZGV0YWNoX2Zyb21fZGlzcGxheX0gXFxcbiIKLSIJfVxuIgotIgliaW5kIC4gPENvbnRyb2wtS2V5UHJlc3MtYT4geyBcXFxuIgotIgkJZ2xvYmFsIG1lbnVzX2Rpc2FibGVkOyBcXFxuIgotIgkJaWYgeyEkbWVudXNfZGlzYWJsZWR9IHt0cnlfY29ubmVjdF9hbmRfcXVlcnlfYWxsfSBcXFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc3RvcF93YXRjaCB7b25vZmZ9IHtcbiIKLSIJZ2xvYmFsIG9yaWdfY3Vyc29yIHRleHRfYXJlYSBlbnRyeV9ib3hcbiIKLSJcbiIKLSIJc2V0IHdpZGdldHMgW2xpc3QgLl1cbiIKLSIJaWYgW2luZm8gZXhpc3RzIHRleHRfYXJlYV0ge1xuIgotIgkJaWYgeyR0ZXh0X2FyZWEgIT0gXCJcIn0ge1xuIgotIgkJCWxhcHBlbmQgd2lkZ2V0cyAkdGV4dF9hcmVhXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJaWYgW2luZm8gZXhpc3RzIGVudHJ5X2JveF0ge1xuIgotIgkJaWYgeyRlbnRyeV9ib3ggIT0gXCJcIn0ge1xuIgotIgkJCWxhcHBlbmQgd2lkZ2V0cyAkZW50cnlfYm94XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRvbm9mZiA9PSBcIm9uXCJ9IHtcbiIKLSIJCWZvcmVhY2ggaXRlbSAkd2lkZ2V0cyB7XG4iCi0iCQkJaWYgeyFbd2luZm8gZXhpc3RzICRpdGVtXX0ge1xuIgotIgkJCQljb250aW51ZVxuIgotIgkJCX1cbiIKLSIJCQkkaXRlbSBjb25maWcgLWN1cnNvciB7d2F0Y2h9XG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmb3JlYWNoIGl0ZW0gJHdpZGdldHMge1xuIgotIgkJCWlmIHshW3dpbmZvIGV4aXN0cyAkaXRlbV19IHtcbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQl9XG4iCi0iCQkJJGl0ZW0gY29uZmlnIC1jdXJzb3Ige31cbiIKLSIJCX1cbiIKLSIJfVxuIgotIgl1cGRhdGVcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkb3VibGVfY2hlY2tfbm9yZW1vdGUge30ge1xuIgotIglzZXQgbXNnIFwiXFxuXFxuXCJcbiIKLSIJYXBwZW5kIG1zZyBcIioqKiBXQVJOSU5HOiBzZXR0aW5nIFxcXCJub3JlbW90ZVxcXCIgd2lsbCBkaXNhYmxlIEFMTCByZW1vdGUgY29udHJvbCBjb21tYW5kcyAoaS5lLlxcblwiXG4iCi0iCWFwcGVuZCBtc2cgXCIqKiogV0FSTklORzogKnRoaXMqIGd1aSB3aWxsIGJlIGxvY2tlZCBvdXQpLiBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gdGhpcz9cXG5cIlxuIgotIglhcHBlbmQgbXNnIFwiKioqIFdBUk5JTkc6IElmIHNvLCBwcmVzcyBcXFwiT0tcXFwiLCBvdGhlcndpc2UgcHJlc3MgXFxcIkNhbmNlbFxcXCJcXG5cIlxuIgotIglhcHBlbmQgbXNnIFwiXFxuXCJcbiIKLSIJYmVsbFxuIgotIglyZXR1cm4gW3dhcm5pbmdfZGlhbG9nICRtc2cgXCJub3JlbW90ZVwiXVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGdldF9zZXR0aW5nc19yY2ZpbGUge30ge1xuIgotIglnbG9iYWwgbWVudV92YXIgZGVmYXVsdF92YXIgdW5zZXRfc3RyXG4iCi0iCWdsb2JhbCB4MTF2bmNfZ3VpX3BhcmFtc1xuIgotIlxuIgotIglzZXQgcmNfdHh0IFwiXCJcbiIKLSJcbiIKLSIJc2V0IG1lbnVfdmFyKGd1aSkgJHgxMXZuY19ndWlfcGFyYW1zXG4iCi0iXG4iCi0iCWZvcmVhY2ggaXRlbSBbbHNvcnQgW2FycmF5IG5hbWVzIG1lbnVfdmFyXV0ge1xuIgotIgkJaWYgeyRpdGVtID09IFwiZ3VpXCJ9IHtcbiIKLSIJCQk7XG4iCi0iCQl9IGVsc2VpZiB7IVthY3RpdmVfd2hlbl9zdGFydGluZyAkaXRlbV19IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYge1tpc19hY3Rpb24gJGl0ZW1dfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSA9PSBcImRlYnVnX2d1aVwifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX0gZWxzZWlmIHskaXRlbSA9PSBcIldpbmRvd1ZpZXdcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJyY1wiIHx8ICRpdGVtID09IFwibm9yY1wifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX0gZWxzZWlmIHskaXRlbSA9PSBcImxvb3BcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJsb29wYmdcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlzZXQgZGVmIFwiXCJcbiIKLSIJCWlmIHtbaW5mbyBleGlzdHMgZGVmYXVsdF92YXIoJGl0ZW0pXX0ge1xuIgotIgkJCXNldCBkZWYgJGRlZmF1bHRfdmFyKCRpdGVtKVxuIgotIgkJfVxuIgotIlxuIgotIlxuIgotIgkJc2V0IHFzdCBcIlwiXG4iCi0iCQlzZXQgaG1tIFwiIz8gXCJcbiIKLSIJCWlmIHskaXRlbSA9PSBcImRpc3BsYXlcIn0ge1xuIgotIgkJCXNldCBxc3QgJGhtbVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwiZGVza3RvcFwifSB7XG4iCi0iCQkJc2V0IHFzdCAkaG1tXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJkb250ZGlzY29ubmVjdFwifSB7XG4iCi0iCQkJc2V0IHFzdCAkaG1tXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJhbHdheXNzaGFyZWRcIn0ge1xuIgotIgkJCXNldCBxc3QgJGhtbVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwibmV2ZXJzaGFyZWRcIn0ge1xuIgotIgkJCXNldCBxc3QgJGhtbVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwiZ3VpXCJ9IHtcbiIKLSIJCQlzZXQgcXN0ICRobW1cbiIKLSIJCX1cbiIKLSJcbiIKLSIJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQlzZXQgbXYgJGRlZlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgbXYgJG1lbnVfdmFyKCRpdGVtKVxuIgotIgkJfVxuIgotIiNwdXRzIFwiaXRlbT0kaXRlbSBkZWY9JGRlZiBtdj0kbXZcIlxuIgotIgkJaWYgeyRtdiA9PSAkdW5zZXRfc3RyfSB7XG4iCi0iCQkJc2V0IG12IFwiXCJcbiIKLSIJCX1cbiIKLSIJCXNldCBudGFiIDNcbiIKLSJcbiIKLSIJCWlmIHskaXRlbSA9PSBcImd1aVwiIHx8IFt2YWx1ZV9pc19zdHJpbmcgJGl0ZW1dfSB7XG4iCi0iCQkJc2V0IG5pdGVtIFtnZXRfbml0ZW0gJGl0ZW1dXG4iCi0iXG4iCi0iCQkJaWYgeyRtdiA9PSBcIlwiICYmICRkZWYgIT0gXCJcIn0gIHtcbiIKLSIJCQkJc2V0IHFzdCAkaG1tXG4iCi0iCQkJfVxuIgotIgkJCXNldCBuIDBcbiIKLSIJCQlpZiB7JHFzdCAhPSBcIlwifSB7XG4iCi0iCQkJCWFwcGVuZCByY190eHQgJHFzdFxuIgotIgkJCQlpbmNyIG4gW3N0cmluZyBsZW5ndGggJHFzdF1cbiIKLSIJCQl9IGVsc2VpZiB7JG12ID09ICRkZWZ9IHtcbiIKLSIJCQkJYXBwZW5kIHJjX3R4dCBcIiNkIFwiXG4iCi0iCQkJCWluY3IgbiBbc3RyaW5nIGxlbmd0aCBcIiNkIFwiXVxuIgotIgkJCX1cbiIKLSIJCQlzZXQgbXQgJG12XG4iCi0iCQkJcmVnc3ViIC1hbGwgeyN9ICRtdCB7XFwjfSBtdFxuIgotIgkJCWlmIHskbXQgPT0gXCJcIn0ge1xuIgotIgkJCQlzZXQgbXQge1wiXCJ9XG4iCi0iCQkJfVxuIgotIgkJCWFwcGVuZCByY190eHQgXCItJG5pdGVtICRtdFwiXG4iCi0iXG4iCi0iCQkJaWYgeyRtdiAhPSAkZGVmfSB7XG4iCi0iCQkJCXNldCBtIFtzdHJpbmcgbGVuZ3RoIFwiLSRuaXRlbSAkbXRcIl1cbiIKLSIJCQkJaW5jciBuICRtXG4iCi0iCQkJCXNldCBuIFtleHByICRuIC8gOF1cbiIKLSIJCQkJc2V0IGMgMFxuIgotIgkJCQlmb3Ige3NldCBpICRufSB7JGkgPD0gJG50YWJ9IHtpbmNyIGl9IHtcbiIKLSIJCQkJCWFwcGVuZCByY190eHQgXCJcXHRcIlxuIgotIgkJCQkJaW5jciBjXG4iCi0iCQkJCX1cbiIKLSIJCQkJaWYgeyRjID09IDB9IHtcbiIKLSIJCQkJCWFwcGVuZCByY190eHQgXCJcXHRcIlxuIgotIgkJCQl9XG4iCi0iCQkJCXJlZ3N1YiAtYWxsIHsjfSAkZGVmIHtcXCN9IGRlZlxuIgotIgkJCQlpZiB7JGRlZiA9PSBcIlwifSB7XG4iCi0iCQkJCQlzZXQgZGVmIHtcIlwifVxuIgotIgkJCQl9XG4iCi0iCQkJCWFwcGVuZCByY190eHQgXCIjIGRlZmF1bHQ6ICAkZGVmXCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kIHJjX3R4dCBcIlxcblwiXG4iCi0iXG4iCi0iCQl9IGVsc2VpZiB7W3ZhbHVlX2lzX2Jvb2wgJGl0ZW1dfSB7XG4iCi0iCQkJc2V0IG4gMFxuIgotIgkJCWlmIHskcXN0ICE9IFwiXCJ9IHtcbiIKLSIJCQkJYXBwZW5kIHJjX3R4dCAkcXN0XG4iCi0iCQkJCWluY3IgbiBbc3RyaW5nIGxlbmd0aCAkcXN0XVxuIgotIgkJCX0gZWxzZWlmIHskbXYgPT0gJGRlZn0ge1xuIgotIgkJCQlhcHBlbmQgcmNfdHh0IFwiI2QgXCJcbiIKLSIJCQkJaW5jciBuIFtzdHJpbmcgbGVuZ3RoIFwiI2QgXCJdXG4iCi0iCQkJfVxuIgotIgkJCWlmIHskZGVmID09IDF9IHtcbiIKLSIJCQkJc2V0IGR2IFwib25cIlxuIgotIgkJCX0gZWxzZSB7XG4iCi0iCQkJCXNldCBkdiBcIm9mZlwiXG4iCi0iCQkJfVxuIgotIgkJCWFwcGVuZCByY190eHQgXCItJGl0ZW1cIlxuIgotIgkJCXNldCBtIFtzdHJpbmcgbGVuZ3RoIFwiLSRpdGVtXCJdXG4iCi0iCQkJaW5jciBuICRtXG4iCi0iCQkJc2V0IG4gW2V4cHIgJG4gLyA4XVxuIgotIgkJCWZvciB7c2V0IGkgJG59IHskaSA8PSAkbnRhYn0ge2luY3IgaX0ge1xuIgotIgkJCQlhcHBlbmQgcmNfdHh0IFwiXFx0XCJcbiIKLSIJCQl9XG4iCi0iCQkJYXBwZW5kIHJjX3R4dCBcIiMgZGVmYXVsdDogJGR2XCJcbiIKLSIJCQlhcHBlbmQgcmNfdHh0IFwiXFxuXCJcbiIKLSJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglyZXR1cm4gJHJjX3R4dFxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIGRvdWJsZV9jaGVja19zdGFydF94MTF2bmMge30ge1xuIgotIglnbG9iYWwgaG9zdG5hbWVcbiIKLSIJc2V0IG1zZyBbZ2V0X3N0YXJ0X3gxMXZuY190eHRdXG4iCi0iCWJlbGxcbiIKLSIJYXBwZW5kIG1zZyBcIlxcblwiXG4iCi0iCWFwcGVuZCBtc2cgXCIqKiogVG8gcnVuIHRoZSBhYm92ZSBjb21tYW5kIG9uIG1hY2hpbmUgXFxcIiRob3N0bmFtZVxcXCIgKHRoZXJlYnlcXG5cIlxuIgotIglhcHBlbmQgbXNnIFwiKioqIHN0YXJ0aW5nIHgxMXZuYykgcHJlc3MgXFxcIk9LXFxcIiwgb3RoZXJ3aXNlIHByZXNzIFxcXCJDYW5jZWxcXFwiLlxcblwiXG4iCi0iCXJldHVybiBbd2FybmluZ19kaWFsb2cgJG1zZyBcInN0YXJ0XCJdXG4iCi0ifVxuIgotIlxuIgotInByb2MgZ2V0X3N0YXJ0X3gxMXZuY190eHQge30ge1xuIgotIglzZXQgY21kIFtnZXRfc3RhcnRfeDExdm5jX2NtZF1cbiIKLSIJc2V0IHN0ciBbam9pbiAkY21kXVxuIgotIglzZXQgbXNnIFwiXCJcbiIKLSIJYXBwZW5kIG1zZyBcIlxcblwiXG4iCi0iCWFwcGVuZCBtc2cgXCI9PT09IFRoZSBjb21tYW5kIGJ1aWx0IHNvIGZhciBpczogPT09PVxcblwiO1xuIgotIglhcHBlbmQgbXNnIFwiXFxuXCJcbiIKLSIJYXBwZW5kIG1zZyBcIiRzdHJcXG5cIlxuIgotIglyZXR1cm4gJG1zZ1xuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHNob3dfc3RhcnRfY21kIHt9IHtcbiIKLSIJc2V0IG1zZyBbZ2V0X3N0YXJ0X3gxMXZuY190eHRdXG4iCi0iCWFwcGVuZF90ZXh0IFwiJG1zZ1xcblwiXG4iCi0ifVxuIgotIlxuIgotInByb2MgZ2V0X25pdGVtIHtpdGVtfSB7XG4iCi0iCXNldCBuaXRlbSAkaXRlbVxuIgotIglpZiB7JG5pdGVtID09IFwic2NyZWVuX2JsYW5rXCJ9IHtcbiIKLSIJCXNldCBuaXRlbSBcInNiXCJcbiIKLSIJfSBlbHNlaWYgeyRuaXRlbSA9PSBcInhyYW5kcl9tb2RlXCJ9IHtcbiIKLSIJCXNldCBuaXRlbSBcInhyYW5kclwiXG4iCi0iCX0gZWxzZWlmIHskbml0ZW0gPT0gXCJ1bml4cHdfbGlzdFwifSB7XG4iCi0iCQlzZXQgbml0ZW0gXCJ1bml4cHdcIlxuIgotIgl9IGVsc2VpZiB7JG5pdGVtID09IFwidW5peHB3X25pc19saXN0XCJ9IHtcbiIKLSIJCXNldCBuaXRlbSBcInVuaXhwd19uaXNcIlxuIgotIgl9IGVsc2VpZiB7JG5pdGVtID09IFwic3R1bm5lbF9wZW1cIn0ge1xuIgotIgkJc2V0IG5pdGVtIFwic3R1bm5lbFwiXG4iCi0iCX0gZWxzZWlmIHskbml0ZW0gPT0gXCJzc2xfcGVtXCJ9IHtcbiIKLSIJCXNldCBuaXRlbSBcInNzbFwiXG4iCi0iCX0gZWxzZWlmIHskbml0ZW0gPT0gXCJ3aXJlZnJhbWVfbW9kZVwifSB7XG4iCi0iCQlzZXQgbml0ZW0gXCJ3aXJlZnJhbWVcIlxuIgotIgl9IGVsc2VpZiB7JG5pdGVtID09IFwic29saWRfY29sb3JcIn0ge1xuIgotIgkJc2V0IG5pdGVtIFwic29saWRcIlxuIgotIgl9XG4iCi0iCXJldHVybiAkbml0ZW1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBnZXRfc3RhcnRfeDExdm5jX2NtZCB7e3Nob3dfcmMgMH19IHtcbiIKLSIJZ2xvYmFsIGNtZF92YXIgbWVudV92YXIgZGVmYXVsdF92YXIgdW5zZXRfc3RyIHgxMXZuY19wcm9nXG4iCi0iXG4iCi0iCXNldCB4dGVybV9jbWQgXCJ4dGVybSAtaWNvbmljIC1nZW9tZXRyeSA4MHgzNSAtdGl0bGUgeDExdm5jLWNvbnNvbGUgLWVcIlxuIgotIlxuIgotIglzZXQgY21kIFtzcGxpdCAkeHRlcm1fY21kXVxuIgotIlxuIgotIglsYXBwZW5kIGNtZCAkeDExdm5jX3Byb2dcbiIKLSJcbiIKLSIJbGFwcGVuZCBjbWQgXCItZ3VpXCJcbiIKLSIJbGFwcGVuZCBjbWQgXCJub25lXCJcbiIKLSJcbiIKLSIJc2V0IHJjX3R4dCBcIlwiXG4iCi0iXG4iCi0iCXNldCBzYXdfaWQgMFxuIgotIlxuIgotIglmb3JlYWNoIGl0ZW0gW2xzb3J0IFthcnJheSBuYW1lcyBtZW51X3Zhcl1dIHtcbiIKLSIJCWlmIHskaXRlbSA9PSBcImd1aVwifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX0gZWxzZWlmIHshW2FjdGl2ZV93aGVuX3N0YXJ0aW5nICRpdGVtXX0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9IGVsc2VpZiB7W2lzX2FjdGlvbiAkaXRlbV19IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwiZGVidWdfZ3VpXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwiV2luZG93Vmlld1wifSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCWlmIHskaXRlbSA9PSBcImlkXCIgfHwgJGl0ZW0gPT0gXCJzaWRcIn0ge1xuIgotIgkJCXNldCB2YWwgJG1lbnVfdmFyKCRpdGVtKTtcbiIKLSIJCQlpZiB7JHZhbCA9PSBcIjB4MFwiIHx8ICR2YWwgPT0gXCJyb290XCJ9IHtcbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCQlpZiB7JGl0ZW0gPT0gXCJzaWRcIiAmJiAkc2F3X2lkfSB7XG4iCi0iCQkJY29udGludWVcbiIKLSIJCX1cbiIKLSIJCWlmIHskaXRlbSA9PSBcImlkXCJ9IHtcbiIKLSIJCQlzZXQgc2F3X2lkIDFcbiIKLSIJCX0gZWxzZWlmIHskaXRlbSA9PSBcImh0dHBwb3J0XCIgJiYgJG1lbnVfdmFyKCRpdGVtKSA9PSBcIjBcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJwcm9ncmVzc2l2ZVwiICYmICRtZW51X3ZhcigkaXRlbSkgPT0gXCIwXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYgeyRpdGVtID09IFwiZG9udGRpc2Nvbm5lY3RcIiAmJiAkbWVudV92YXIoJGl0ZW0pID09IFwiLTFcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9IGVsc2VpZiB7JGl0ZW0gPT0gXCJhbHdheXNzaGFyZWRcIiAmJiAkbWVudV92YXIoJGl0ZW0pID09IFwiLTFcIn0ge1xuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7W3ZhbHVlX2lzX2Jvb2wgJGl0ZW1dfSB7XG4iCi0iCQkJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcigkaXRlbSldfSB7XG4iCi0iCQkJCXNldCBhZGQgMVxuIgotIgkJCQlpZiB7W2luZm8gZXhpc3RzIGRlZmF1bHRfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJCWlmIHskbWVudV92YXIoJGl0ZW0pID09ICRkZWZhdWx0X3ZhcigkaXRlbSl9IHtcbiIKLSIJCQkJCQlzZXQgYWRkIDA7XG4iCi0iCQkJCQl9XG4iCi0iCQkJCX0gZWxzZWlmIHshICRtZW51X3ZhcigkaXRlbSl9IHtcbiIKLSIJCQkJCXNldCBhZGQgMFxuIgotIgkJCQl9XG4iCi0iCQkJCWlmIHskYWRkfSB7XG4iCi0iCQkJCQlsYXBwZW5kIGNtZCBcIi0kaXRlbVwiXG4iCi0iCQkJCQlhcHBlbmQgcmNfdHh0IFwiLSRpdGVtXFxuXCJcbiIKLSIJCQkJfVxuIgotIgkJCX1cbiIKLSIJCX0gZWxzZWlmIHtbdmFsdWVfaXNfc3RyaW5nICRpdGVtXX0ge1xuIgotIgkJCWlmIHshW2luZm8gZXhpc3RzIG1lbnVfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJY29udGludWVcbiIKLSIJCQl9XG4iCi0iCQkJaWYgeyRtZW51X3ZhcigkaXRlbSkgIT0gXCJcIiAmJiAkbWVudV92YXIoJGl0ZW0pICE9ICR1bnNldF9zdHJ9IHtcbiIKLSIJCQkJc2V0IGFkZCAxXG4iCi0iCQkJCXNldCBuaXRlbSBbZ2V0X25pdGVtICRpdGVtXVxuIgotIlxuIgotIgkJCQlpZiB7W2luZm8gZXhpc3RzIGRlZmF1bHRfdmFyKCRpdGVtKV19IHtcbiIKLSIJCQkJCWlmIHskbWVudV92YXIoJGl0ZW0pID09ICRkZWZhdWx0X3ZhcigkaXRlbSl9IHtcbiIKLSIJCQkJCQlzZXQgYWRkIDA7XG4iCi0iCQkJCQl9XG4iCi0iCQkJCX1cbiIKLSIJCQkJaWYgeyRhZGR9IHtcbiIKLSIJCQkJCWxhcHBlbmQgY21kIFwiLSRuaXRlbVwiXG4iCi0iCQkJCQlzZXQgbXYgJG1lbnVfdmFyKCRpdGVtKVxuIgotIlxuIgotIgkJCQkJaWYge1tyZWdleHAge15+fSAkbXZdfSAge1xuIgotIgkJCQkJCWlmIHskaXRlbSA9PSBcImF1dGhcIiB8fFxuIgotIgkJCQkJCSAgICAkaXRlbSA9PSBcInJjXCIgfHxcbiIKLSIJCQkJCQkgICAgJGl0ZW0gPT0gXCJhY2NlcHRcIiB8fCBcbiIKLSIJCQkJCQkgICAgJGl0ZW0gPT0gXCJjb25uZWN0XCIgfHwgXG4iCi0iCQkJCQkJICAgICRpdGVtID09IFwiYWxsb3dcIiB8fCBcbiIKLSIJCQkJCQkgICAgJGl0ZW0gPT0gXCJwYXNzd2RmaWxlXCIgfHwgXG4iCi0iCQkJCQkJICAgICRpdGVtID09IFwib1wiIHx8IFxuIgotIgkJCQkJCSAgICAkaXRlbSA9PSBcImxvZ2ZpbGVcIiB8fCBcbiIKLSIJCQkJCQkgICAgJGl0ZW0gPT0gXCJyZW1hcFwiIHx8IFxuIgotIgkJCQkJCSAgICAkaXRlbSA9PSBcImh0dHBkaXJcIn0geyBcbiIKLSIJCQkJCQkJc2V0IG12IFt0aWxkZV9leHBhbmQgJG12XVxuIgotIgkJCQkJCX1cbiIKLSIJCQkJCX1cbiIKLSIJCQkJCVxuIgotIgkJCQkJbGFwcGVuZCBjbWQgJG12XG4iCi0iCQkJCQlzZXQgbXQgJG12XG4iCi0iCQkJCQlyZWdzdWIgLWFsbCB7I30gJG10IHtcXCN9IG10XG4iCi0iCQkJCQlhcHBlbmQgcmNfdHh0IFwiLSRuaXRlbSAkbXRcXG5cIlxuIgotIgkJCQl9XG4iCi0iCQkJfVxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWxhcHBlbmQgY21kIFwiMj5cIlxuIgotIglsYXBwZW5kIGNtZCBcIi9kZXYvbnVsbFwiXG4iCi0iCWxhcHBlbmQgY21kIFwiJlwiXG4iCi0iCVxuIgotIglpZiB7JHNob3dfcmN9IHtcbiIKLSIJCXJldHVybiAkcmNfdHh0XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlyZXR1cm4gJGNtZFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc3RhcnRfeDExdm5jIHt9IHtcbiIKLSIJZ2xvYmFsIG1lbnVfdmFyIHVuc2V0X3N0clxuIgotIglnbG9iYWwgeDExdm5jX3Byb2cgeDExdm5jX3hkaXNwbGF5XG4iCi0iCWdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jXG4iCi0iXG4iCi0iCWlmIHskY29ubmVjdGVkX3RvX3gxMXZuY30ge1xuIgotIgkJYXBwZW5kX3RleHQgXCJcXG5cIlxuIgotIgkJYXBwZW5kX3RleHQgXCJXQVJOSU5HOiBTdGlsbCBjb25uZWN0ZWQgdG8gYW4geDExdm5jIHNlcnZlci5cXG5cIlxuIgotIgkJYXBwZW5kX3RleHQgXCJXQVJOSU5HOiBVc2UgXFxcInN0b3BcXFwiIG9yIFxcXCJkZXRhY2hcXFwiIGZpcnN0LlxcblwiXG4iCi0iCQlyZXR1cm4gMFxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHshW2RvdWJsZV9jaGVja19zdGFydF94MTF2bmNdfSB7XG4iCi0iCQlyZXR1cm5cbiIKLSIJfVxuIgotIlxuIgotIglzZXQgeDExdm5jX3hkaXNwbGF5IFwiXCJcbiIKLSIJaWYge1tpbmZvIGV4aXN0cyBtZW51X3ZhcihkaXNwbGF5KV19IHtcbiIKLSIJCWlmIHskbWVudV92YXIoZGlzcGxheSkgIT0gXCJcIiAmJiAkbWVudV92YXIoZGlzcGxheSkgIT0gJHVuc2V0X3N0cn0ge1xuIgotIgkJCXNldCB4MTF2bmNfeGRpc3BsYXkgJG1lbnVfdmFyKGRpc3BsYXkpXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IGNtZCBbZ2V0X3N0YXJ0X3gxMXZuY19jbWRdXG4iCi0iXG4iCi0iCXNldCBzdHIgW2pvaW4gJGNtZF1cbiIKLSIJcmVnc3ViIHsgLWV9ICRzdHIgXCIgLWUgXFxcXFxcbiAgIFwiIHN0clxuIgotIlxuIgotIglpZiB7MH0ge1xuIgotIgkJcHV0cyBcInJ1bm5pbmc6ICRzdHJcIlxuIgotIgkJZm9yZWFjaCB3b3JkICRjbWQge1xuIgotIgkJCXB1dHMgXCIgICB3b3JkOiAkd29yZFwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJYXBwZW5kX3RleHQgXCJTdGFydGluZyB4MTF2bmMgaW4gYW4gaWNvbmlmaWVkIHh0ZXJtIHdpdGggY29tbWFuZDpcXG5cIlxuIgotIglhcHBlbmRfdGV4dCBcIiAgJHN0clxcblxcblwiXG4iCi0iCWNhdGNoIHtbZXZhbCBleGVjICRjbWRdfVxuIgotIglhZnRlciA1MDBcbiIKLSIJdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbCAzXG4iCi0iCWlmIHshJGNvbm5lY3RlZF90b194MTF2bmN9IHtcbiIKLSIJCWFwcGVuZF90ZXh0IFwiXFxuU3RhcnRpbmcgeDExdm5jIHNlZW1zIHRvIGhhdmUgZmFpbGVkLlxcblwiXG4iCi0iCQlpZiB7W3JlZ2V4cCAtLSB7LW8gfSAkc3RyXSB8fCBbcmVnZXhwIC0tIHstbG9nZmlsZX0gJHN0cl19IHtcbiIKLSIJCQlhcHBlbmRfdGV4dCBcIkV4YW1pbmUgdGhlIGxvZ2ZpbGUgKERlYnVnZ2luZyAtPiBzaG93LWxvZ2ZpbGUpIGZvciBlcnJvciBtZXNzYWdlcy5cXG5cIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlhcHBlbmRfdGV4dCBcIlJlcnVuIHdpdGggYSBsb2dmaWxlIChpZiBuZWVkZWQpIGFuZCBleGFtaW5lIHRoZSBsb2dmaWxlXFxuXCJcbiIKLSIJCQlhcHBlbmRfdGV4dCBcIihEZWJ1Z2dpbmcgLT4gc2hvdy1sb2dmaWxlKSBmb3IgZXJyb3IgbWVzc2FnZXMuXFxuXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHJ1bl9yZW1vdGVfY21kX3ZpYV9zb2NrIHtvcHRzfSB7XG4iCi0iCWdsb2JhbCBjbGllbnRfc29ja1xuIgotIlxuIgotIglzZXQgZGIgMFxuIgotIglpZiB7W2ZpbGUgY2hhbm5lbHMgJGNsaWVudF9zb2NrXSA9PSBcIlwifSB7XG4iCi0iCQlzZXQgY2xpZW50X3NvY2sgXCJcIlxuIgotIgkJcmV0dXJuIFwiZmFpbFwiXG4iCi0iCX1cbiIKLSIJaWYge1tlb2YgJGNsaWVudF9zb2NrXX0ge1xuIgotIgkJY2F0Y2gge2Nsb3NlICRjbGllbnRfc29ja31cbiIKLSIJCXNldCBjbGllbnRfc29jayBcIlwiXG4iCi0iCQlyZXR1cm4gXCJmYWlsXCJcbiIKLSIJfVxuIgotIglzZXQgcmVzdWx0IFwiXCJcbiIKLSIJCVxuIgotIglzZXR1cF9jbGllbnRfc29jayAwXG4iCi0iXG4iCi0iCXNldCBkb2NtZCBcIlwiXG4iCi0iCWZvcmVhY2ggb3B0ICRvcHRzIHtcbiIKLSIJCWlmIHskb3B0ID09IFwiLVJcIn0ge1xuIgotIgkJCXNldCBkb2NtZCBcIi1SXCJcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYgeyRvcHQgPT0gXCItUVwifSB7XG4iCi0iCQkJc2V0IGRvY21kIFwiLVFcIlxuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7JGRvY21kID09IFwiXCJ9IHtcbiIKLSIJCQljb250aW51ZVxuIgotIgkJfSBlbHNlaWYgeyRkb2NtZCA9PSBcIi1SXCJ9IHtcbiIKLSIJCQlzZXQgc3RyIFwiY21kPSRvcHRcIlxuIgotIgkJfSBlbHNlaWYgeyRkb2NtZCA9PSBcIi1RXCJ9IHtcbiIKLSIJCQlzZXQgc3RyIFwicXJ5PSRvcHRcIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlzZXQgZG9jbWQgXCJcIlxuIgotIgkJCWNvbnRpbnVlXG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJydW5fcmVtb3RlX2NtZF92aWFfc29jazogJGRvY21kIFxcXCIkc3RyXFxcIlwifVxuIgotIgkJY2F0Y2gge3B1dHMgJGNsaWVudF9zb2NrICRzdHJ9XG4iCi0iCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJydW5fcmVtb3RlX2NtZF92aWFfc29jazogZmx1c2hcIn1cbiIKLSIJCWNhdGNoIHtmbHVzaCAkY2xpZW50X3NvY2t9XG4iCi0iCQlpZiB7JGRifSB7cHV0cyBzdGRlcnIgXCJydW5fcmVtb3RlX2NtZF92aWFfc29jazogZ2V0c1wifVxuIgotIgkJY2F0Y2gge2dldHMgJGNsaWVudF9zb2NrIHJlc31cbiIKLSIJCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciBcInJ1bl9yZW1vdGVfY21kX3ZpYV9zb2NrOiBcXFwiJHJlc1xcXCJcIn1cbiIKLSIJCXNldCByZXMgW3N0cmluZyB0cmltICRyZXNdXG4iCi0iXG4iCi0iCQlpZiBbcmVnZXhwIHs9Y2xpZW50czp9ICRyZXNdIHtcbiIKLSIJCQlyZWdzdWIge14uKj1jbGllbnRzOn0gJHJlcyBcIlwiIGNyZXNcbiIKLSIJCQlyZWdzdWIgeyxhcm89LiokfSAkY3JlcyBcIlwiIGNyZXNcbiIKLSIJCQlyZWdzdWIgeyxhbnM9LiokfSAkY3JlcyBcIlwiIGNyZXNcbiIKLSIJCQlpZiB7JGNyZXMgPT0gXCJub25lXCJ9IHtcbiIKLSIJCQkJc2V0IGNyZXMgXCJcIlxuIgotIgkJCX1cbiIKLSIJCQl1cGRhdGVfY2xpZW50c19tZW51ICRjcmVzXG4iCi0iCQkJc2V0IGNsaWVudF9zdHIgJGNyZXNcbiIKLSIJCQlzZXRfY2xpZW50X2JhbGxvb24gJGNyZXNcbiIKLSIJCX1cbiIKLSJcbiIKLSIJCWlmIFtyZWdleHAge15jbGllbnRzOn0gJHJlc10ge1xuIgotIgkJCXJlZ3N1YiB7XmNsaWVudHM6fSAkcmVzIFwiXCIgdG1wXG4iCi0iCQkJaWYgeyR0bXAgPT0gXCJub25lXCJ9IHtcbiIKLSIJCQkJc2V0IHRtcCBcIlwiXG4iCi0iCQkJfVxuIgotIgkJCXVwZGF0ZV9jbGllbnRzX21lbnUgJHRtcFxuIgotIgkJCXNldCBjbGllbnRfc3RyICR0bXBcbiIKLSIJCQlzZXRfY2xpZW50X2JhbGxvb24gJHRtcFxuIgotIlxuIgotIgkJCWlmICFbcmVnZXhwIHteY2xpZW50c30gJG9wdF0ge1xuIgotIgkJCQkjIHdlIGNvdWxkIGJsb2NrIGhlcmUuLi5cbiIKLSIJCQkJaWYgeyRkYn0ge3B1dHMgc3RkZXJyIFwicnVuX3JlbW90ZV9jbWRfdmlhX3NvY2s6IGdldHNcIn1cbiIKLSIJCQkJZ2V0cyAkY2xpZW50X3NvY2sgcmVzXG4iCi0iCQkJCWlmIHskZGJ9IHtwdXRzIHN0ZGVyciBcInJ1bl9yZW1vdGVfY21kX3ZpYV9zb2NrOiBcXFwiJHJlc1xcXCJcIn1cbiIKLSIJCQkJc2V0IHJlcyBbc3RyaW5nIHRyaW0gJHJlc11cbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iXG4iCi0iCQlzZXQgZG9jbWQgXCJcIlxuIgotIlxuIgotIgkJaWYgeyRyZXMgIT0gXCJcIn0ge1xuIgotIgkJCWFwcGVuZCByZXN1bHQgXCIkcmVzXFxuXCJcbiIKLSIJCX1cbiIKLSIJfVxuIgotIglcbiIKLSIJc2V0dXBfY2xpZW50X3NvY2sgMVxuIgotIlxuIgotIglzZXQgcmVzdWx0IFtzdHJpbmcgdHJpbSAkcmVzdWx0XVxuIgotIlxuIgotIglyZXR1cm4gJHJlc3VsdFxuIgotIn1cbiIKLSJcbiIKLSJwcm9jIHJ1bl9yZW1vdGVfY21kIHtvcHRzfSB7XG4iCi0iCWdsb2JhbCBtZW51X3ZhciB4MTF2bmNfcHJvZyB4MTF2bmNfY21kbGluZSB4MTF2bmNfeGRpc3BsYXlcbiIKLSIJZ2xvYmFsIHgxMXZuY19hdXRoX2ZpbGUgeDExdm5jX2Nvbm5lY3RfZmlsZVxuIgotIglnbG9iYWwgY2xpZW50X3NvY2tcbiIKLSJcbiIKLSIJc2V0IGRlYnVnIFtpbl9kZWJ1Z19tb2RlXVxuIgotIlxuIgotIglpZiB7W2xpbmRleCAkb3B0cyAwXSA9PSBcIi1SXCIgJiYgW2xpbmRleCAkb3B0cyAxXSA9PSBcIm5vcmVtb3RlXCJ9IHtcbiIKLSIJCXNldCBzdHIgW2pvaW4gJG9wdHNdXG4iCi0iCQlpZiAhW2RvdWJsZV9jaGVja19ub3JlbW90ZV0ge1xuIgotIgkJCWFwcGVuZF90ZXh0IFwic2tpcHBpbmc6IHgxMXZuYyAkc3RyXCJcbiIKLSIJCQlyZXR1cm4gXCJcIlxuIgotIgkJfSBlbHNlIHtcbiIKLSIJCQlhcHBlbmRfdGV4dCBcInJ1bm5pbmc6IHgxMXZuYyAkc3RyIChwbGVhc2UgZG8gXFxcIkFjdGlvbnMgLT4gZGV0YWNoXFxcIiB0byBjbGVhbiB0aGluZ3MgdXApXFxuXCJcbiIKLSIJCQlhcHBlbmRfdGV4dCBcInN1YnNlcXVlbnQgLVIvLVEgY29tbWFuZHMgc2hvdWxkIGZhaWwuLi5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iXG4iCi0iCWlmIHskY2xpZW50X3NvY2sgIT0gXCJcIn0ge1xuIgotIgkJbWVudXNfZGlzYWJsZVxuIgotIgkJc3RvcF93YXRjaCBvblxuIgotIgkJc2V0IHJlc3VsdCBbcnVuX3JlbW90ZV9jbWRfdmlhX3NvY2sgJG9wdHNdXG4iCi0iCQlzdG9wX3dhdGNoIG9mZlxuIgotIgkJbWVudXNfZW5hYmxlXG4iCi0iCQlpZiB7JHJlc3VsdCAhPSBcImZhaWxcIn0ge1xuIgotIgkJCXJldHVybiAkcmVzdWx0XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IGNtZCBcIlwiXG4iCi0iXG4iCi0iCWxhcHBlbmQgY21kICR4MTF2bmNfcHJvZztcbiIKLSJcbiIKLSIJaWYgeyR4MTF2bmNfY29ubmVjdF9maWxlICE9IFwiXCJ9IHtcbiIKLSIJCWxhcHBlbmQgY21kIFwiLWNvbm5lY3RcIlxuIgotIgkJbGFwcGVuZCBjbWQgJHgxMXZuY19jb25uZWN0X2ZpbGVcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCWlmIHskeDExdm5jX3hkaXNwbGF5ICE9IFwiXCJ9IHtcbiIKLSIJCQlsYXBwZW5kIGNtZCBcIi1kaXNwbGF5XCJcbiIKLSIJCQlsYXBwZW5kIGNtZCAkeDExdm5jX3hkaXNwbGF5XG4iCi0iCQl9XG4iCi0iCQlpZiB7JHgxMXZuY19hdXRoX2ZpbGUgIT0gXCJcIn0ge1xuIgotIgkJCWxhcHBlbmQgY21kIFwiLWF1dGhcIlxuIgotIgkJCWxhcHBlbmQgY21kICR4MTF2bmNfYXV0aF9maWxlXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJbGFwcGVuZCBjbWQgXCItc3luY1wiXG4iCi0iCWZvcmVhY2ggd29yZCAkb3B0cyB7XG4iCi0iCQlsYXBwZW5kIGNtZCAkd29yZFxuIgotIgl9XG4iCi0iCWxhcHBlbmQgY21kIFwiMj5cIlxuIgotIglsYXBwZW5kIGNtZCBcIi9kZXYvbnVsbFwiXG4iCi0iXG4iCi0iCWlmIHswIHx8ICRkZWJ1Z30ge1xuIgotIgkJc2V0IHN0ciBbam9pbiAkY21kXVxuIgotIgkJcHV0cyBcInJ1bm5pbmc6ICRzdHJcIlxuIgotIgkJZm9yZWFjaCB3b3JkICRjbWQge1xuIgotIgkJCXB1dHMgXCIgICB3b3JkOiAkd29yZFwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0IG91dHB1dCBcIlwiXG4iCi0iCW1lbnVzX2Rpc2FibGVcbiIKLSJcbiIKLSIJc3RvcF93YXRjaCBvblxuIgotIgljYXRjaCB7c2V0IG91dHB1dCBbZXZhbCBleGVjICRjbWRdfVxuIgotIglzdG9wX3dhdGNoIG9mZlxuIgotIlxuIgotIgltZW51c19lbmFibGVcbiIKLSIJaWYgeyRkZWJ1Z30ge1xuIgotIgkJaWYge1tzdHJpbmcgbGVuZ3RoICRvdXRwdXRdID4gMTAwfSB7XG4iCi0iCQkJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRvdXRwdXQgMCAxMDBdXG4iCi0iCQkJYXBwZW5kX3RleHQgXCJvdXRwdXQ6ICRzdHIgLi4uXFxuXCJcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJYXBwZW5kX3RleHQgXCJvdXRwdXQ6ICRvdXRwdXRcXG5cIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iCXJldHVybiAkb3V0cHV0XG4iCi0ifVxuIgotIlxuIgotInByb2MgdHJ5X2Nvbm5lY3RfYW5kX3F1ZXJ5X2FsbCB7e24gMn19IHtcbiIKLSIJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbn0ge2luY3IgaX0ge1xuIgotIgkJaWYgeyRpID4gMH0ge1xuIgotIgkJCWFmdGVyIDUwMFxuIgotIgkJCWFwcGVuZF90ZXh0IFwidHJ5aW5nIGFnYWluIC4uLlxcblwiXG4iCi0iCQl9XG4iCi0iCQlpZiB7W3RyeV9jb25uZWN0XX0ge1xuIgotIgkJCXF1ZXJ5X2FsbFxuIgotIgkJCWJyZWFrXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB0cnlfY29ubmVjdCB7fSB7XG4iCi0iCWdsb2JhbCB4MTF2bmNfeGRpc3BsYXkgY29ubmVjdGVkX3RvX3gxMXZuYyByZXBseV94ZGlzcGxheVxuIgotIglnbG9iYWwgbWVudV92YXIgdW5zZXRfc3RyXG4iCi0iXG4iCi0iCXNldCBkYiAwXG4iCi0iI2R0aW1lIGMxXG4iCi0iXG4iCi0iCWlmIHshICRjb25uZWN0ZWRfdG9feDExdm5jfSB7XG4iCi0iCQlpZiB7W2luZm8gZXhpc3RzIG1lbnVfdmFyKGRpc3BsYXkpXX0ge1xuIgotIgkJCXNldCBkICRtZW51X3ZhcihkaXNwbGF5KVxuIgotIgkJCWlmIHskZCAhPSBcIlwiICYmICRkICE9ICR1bnNldF9zdHIgJiYgJGQgIT0gJHgxMXZuY194ZGlzcGxheX0ge1xuIgotIgkJCQlzZXQgeDExdm5jX3hkaXNwbGF5ICRtZW51X3ZhcihkaXNwbGF5KVxuIgotIgkJCQlhcHBlbmRfdGV4dCBcIlNldHRpbmcgWCBkaXNwbGF5IHRvOiAkeDExdm5jX3hkaXNwbGF5XFxuXCJcbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJcbiIKLSIJc2V0X2luZm8gXCJQaW5naW5nICR4MTF2bmNfeGRpc3BsYXkgLi4uXCJcbiIKLSIJc2V0IHJhcmdzIFtsaXN0IFwiLVFcIiBcInBpbmdcIl1cbiIKLSIJc2V0IHJlc3VsdCBbcnVuX3JlbW90ZV9jbWQgJHJhcmdzXVxuIgotIiNkdGltZSBjMmFcbiIKLSJcbiIKLSIJaWYgeyRkYn0ge3B1dHMgXCJ0cnlfY29ubmVjdDogXFxcIiRyZXN1bHRcXFwiXCJ9XG4iCi0iXG4iCi0iCWlmIHtbcmVnZXhwIHteYW5zPXBpbmc6fSAkcmVzdWx0XX0ge1xuIgotIgkJcmVnc3ViIHteYW5zPXBpbmc6fSAkcmVzdWx0IHt9IHJlcGx5X3hkaXNwbGF5XG4iCi0iCQlzZXQgbXNnIFwiQ29ubmVjdGVkIHRvICRyZXBseV94ZGlzcGxheVwiXG4iCi0iCQlzZXRfaW5mbyAkbXNnXG4iCi0iCQlhcHBlbmRfdGV4dCBcIiRtc2dcXG5cIlxuIgotIgkJc2V0X2Nvbm5lY3RlZCB5ZXNcbiIKLSJcbiIKLSIJCXNldHVwX2NsaWVudF9jaGFubmVsXG4iCi0iI2R0aW1lIGMyYlxuIgotIgkJc2V0dXBfY2xpZW50X3NvY2sgMVxuIgotIgkJc2V0dXBfY2xpZW50X3RhaWxcbiIKLSJcbiIKLSIJCWZldGNoX2Rpc3BsYXlzXG4iCi0iI2R0aW1lIGMzYVxuIgotIgkJcmV0dXJuIDFcbiIKLSIJfSBlbHNlIHtcbiIKLSIJCXNldCBzdHIgXCJ4MTF2bmMgc2VydmVyLlwiXG4iCi0iCQlpZiB7JHgxMXZuY194ZGlzcGxheSAhPSBcIlwifSB7XG4iCi0iCQkJc2V0IHN0ciAkeDExdm5jX3hkaXNwbGF5XG4iCi0iCQl9XG4iCi0iCQlzZXQgbXNnIFwiTm8gcmVwbHkgZnJvbSAkc3RyXCJcbiIKLSIJCXNldF9pbmZvICRtc2dcbiIKLSIJCWFwcGVuZF90ZXh0IFwiJG1zZ1xcblwiXG4iCi0iCQlzZXRfY29ubmVjdGVkIG5vXG4iCi0iCQlyZXR1cm4gMFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0X3ZpZXdfdmFyaWFibGUge3ZhbH0ge1xuIgotIglnbG9iYWwgbWVudV92YXJcbiIKLSIJc2V0IG1lbnVfdmFyKFdpbmRvd1ZpZXcpICR2YWxcbiIKLSJ9XG4iCi0icHJvYyBnZXRfdmlld192YXJpYWJsZSB7fSB7XG4iCi0iCWdsb2JhbCBtZW51X3ZhclxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyBtZW51X3ZhcihXaW5kb3dWaWV3KV19IHtcbiIKLSIJCXNldCBtZW51X3ZhcihXaW5kb3dWaWV3KSBcIm5vbmVcIlxuIgotIgl9XG4iCi0iCXJldHVybiAkbWVudV92YXIoV2luZG93VmlldylcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBkb25vIHthIGIgY30ge1xuIgotIglleGl0IDE7XG4iCi0ifVxuIgotIlxuIgotInByb2MgZG9fcG9ydF9wcm9tcHQge30ge1xuIgotIglnbG9iYWwgYmZvbnQgZmZvbnRcbiIKLSIJZ2xvYmFsIHBvcnRfcmVwbHkgcG9ydF9zZXRcbiIKLSJcbiIKLSIJc2V0IGd1ZXNzIDU5MDBcbiIKLSIJZm9yIHtzZXQgaSAwfSB7JGkgPCA1MH0ge2luY3IgaX0ge1xuIgotIgkJc2V0IGZoIFwiXCJcbiIKLSIJCXNldCB0cnkgW2V4cHIgJGd1ZXNzICsgJGldXG4iCi0iCQljYXRjaCB7c2V0IGZoIFtzb2NrZXQgLXNlcnZlciBkb25vICR0cnldfVxuIgotIgkJaWYgeyRmaCAhPSBcIlwifSB7XG4iCi0iCQkJY2F0Y2gge2Nsb3NlICRmaH1cbiIKLSIJCQlzZXQgZ3Vlc3MgJHRyeVxuIgotIgkJCWJyZWFrO1xuIgotIgkJfVxuIgotIgl9XG4iCi0iCXNldCBobiBcIlwiXG4iCi0iCWNhdGNoIHtzZXQgaG4gW2V4ZWMgdW5hbWUgLW5dfVxuIgotIglpZiB7JGhuID09IFwiXCJ9IHtcbiIKLSIJCXNldCBobiBcImhvc3RuYW1lXCJcbiIKLSIJfVxuIgotIlxuIgotIglzZXQgdGV4dCBcIiBTZXQgdGhlIHgxMXZuYyBMaXN0ZW5pbmcgUG9ydDpcbiIKLSJcbiIKLSIgICAgVk5DIERpc3BsYXkgOjAgY29ycmVzcG9uZHMgdG8gVENQIHBvcnQgNTkwMFxuIgotIiAgICBWTkMgRGlzcGxheSA6MSBjb3JyZXNwb25kcyB0byBUQ1AgcG9ydCA1OTAxXG4iCi0iICAgIGV0Yy5cbiIKLSJcbiIKLSIgSW4gdGhlIEVudHJ5IGJlbG93LCBpbmRpY2F0ZSBhIFBvcnQgZm9yIHgxMXZuYyB0byBsaXN0ZW4gb24uIFxuIgotIlxuIgotIiBOb3RlIHRoYXQgdG8gY29ubmVjdCB0byB4MTF2bmMsIGEgVk5DIFZpZXdlciB3aWxsIG5lZWQgdG9cbiIKLSIga25vdyB5b3VyIHNlbGVjdGlvbiwgZm9yIGV4YW1wbGU6XG4iCi0iXG4iCi0iICAgIHZuY3ZpZXdlciAkaG46MFxuIgotIiAgICB2bmN2aWV3ZXIgJGhuOjFcbiIKLSIgICAgZXRjLlxuIgotIlxuIgotIiBZb3VyIGZpcmV3YWxsIG1heSBibG9jayBpbmNvbWluZyBjb25uZWN0aW9ucyB0byBUQ1AgcG9ydHM7XG4iCi0iIGlmIGl0IGRvZXMgeW91IG1heSBuZWVkIHRvIHJlY29uZmlndXJlIGl0LiBcbiIKLSIgICAgXG4iCi0iIFlvdSBjYW4gYWxzbyBzZXQgc29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6XG4iCi0iXG4iCi0iICAgIC0gRW5hYmxlIFNTTCBlbmNyeXB0aW9uLlxuIgotIiAgICAgIChyZXF1aXJlcyBhbiBTU0wgZW5hYmxlZCB2bmN2aWV3ZXIsIHN1Y2ggYXMgU1NWTkMpICBcbiIKLSIgICAgLSBMaXN0ZW4gb25seSBvbiBsb2NhbGhvc3QuIChlLmcuIGZvciBhbiBTU0ggdHVubmVsKVxuIgotIiAgICAtIEVuYWJsZSBVbHRyYVZOQyBvciBUaWdodFZOQyBGaWxlIHRyYW5zZmVyLlxuIgotIlwiXG4iCi0iCXNldCBwb3J0X3NldCAkZ3Vlc3NcbiIKLSIJc2V0IHBvcnRfcmVwbHkgXCJcIlxuIgotIlxuIgotIgl0b3BsZXZlbCAucHBcbiIKLSIJd20gdGl0bGUgLnBwIFwiU2VsZWN0IHgxMXZuYyBwb3J0XCJcbiIKLSJcbiIKLSIJd20gcHJvdG9jb2wgLiAgIFdNX0RFTEVURV9XSU5ET1cgXCJkZXN0cm95IC47IGV4aXRcIlxuIgotIgl3bSBwcm90b2NvbCAucHAgV01fREVMRVRFX1dJTkRPVyBcImRlc3Ryb3kgLnBwOyBleGl0XCJcbiIKLSJcbiIKLSIJbGFiZWwgLnBwLm0gLXRleHQgXCIkdGV4dFwiIC1yZWxpZWYgcmlkZ2UgLWp1c3RpZnkgbGVmdCAtZm9udCAkZmZvbnRcbiIKLSJcbiIKLSIJZ2xvYmFsIHRrX3ZlcnNpb25cbiIKLSIJc2V0IHRrb2xkIDBcbiIKLSIJaWYgW2luZm8gZXhpc3RzIHRrX3ZlcnNpb25dIHtcbiIKLSIJCWlmIFtyZWdleHAge144XFwuWzAtM10kfSAkdGtfdmVyc2lvbl0ge1xuIgotIgkJCXNldCB0a29sZCAxXG4iCi0iCQl9XG4iCi0iCQlpZiBbcmVnZXhwIHteWzMtN11cXC59ICR0a192ZXJzaW9uXSB7XG4iCi0iCQkJc2V0IHRrb2xkIDFcbiIKLSIJCX1cbiIKLSIJfVxuIgotIlxuIgotIglpZiB7JHRrb2xkfSB7XG4iCi0iCQlmcmFtZSAucHAuZiAtYmQgMSAtcmVsaWVmIHJpZGdlXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmcmFtZSAucHAuZiAtYmQgMSAtcmVsaWVmIHJpZGdlIC1wYWR5IDJcbiIKLSIJfVxuIgotIglsYWJlbCAucHAuZi5sIC10ZXh0IFwiUG9ydDogXCIgLWZvbnQgJGJmb250XG4iCi0iCWVudHJ5IC5wcC5mLmUgLXdpZHRoIDggLXRleHR2YXJpYWJsZSBwb3J0X3NldCAtZm9udCAkZmZvbnRcbiIKLSIJZ2xvYmFsIGVuYWJsZV9zc2w7IHNldCBlbmFibGVfc3NsIDBcbiIKLSIJaWYgW2luZm8gZXhpc3RzIGVudihYMTFWTkNfU1NMX0VOQUJMRUQpXSB7XG4iCi0iCQlzZXQgZW5hYmxlX3NzbCAxXG4iCi0iCX1cbiIKLSIJY2hlY2tidXR0b24gLnBwLmYuc3NsIC1yZWxpZWYgcmFpc2VkIC1wYWR5IDMgLXBhZHggMyAtdGV4dCBcIkVuYWJsZSBTU0xcIiAtdmFyaWFibGUgZW5hYmxlX3NzbCAtZm9udCAkYmZvbnRcbiIKLSIJZ2xvYmFsIGxvY2FsaG9zdDsgc2V0IGxvY2FsaG9zdCAwXG4iCi0iCWlmIFtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0xPQ0FMSE9TVF9FTkFCTEVEKV0ge1xuIgotIgkJc2V0IGxvY2FsaG9zdCAxXG4iCi0iCX1cbiIKLSIJY2hlY2tidXR0b24gLnBwLmYubG9jIC1yZWxpZWYgcmFpc2VkIC1wYWR5IDMgLXBhZHggMyAtdGV4dCBcIkxpc3RlbiBvbiBsb2NhbGhvc3RcIiAtdmFyaWFibGUgbG9jYWxob3N0IC1mb250ICRiZm9udFxuIgotIglwYWNrIC5wcC5mLmwgLnBwLmYuZSAtc2lkZSBsZWZ0XG4iCi0iCXBhY2sgLnBwLmYubG9jIC5wcC5mLnNzbCAtc2lkZSByaWdodFxuIgotIlxuIgotIglpZiB7JHRrb2xkfSB7XG4iCi0iCQlmcmFtZSAucHAudCAtYmQgMSAtcmVsaWVmIHJpZGdlXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmcmFtZSAucHAudCAtYmQgMSAtcmVsaWVmIHJpZGdlIC1wYWR5IDJcbiIKLSIJfVxuIgotIglnbG9iYWwgZmlsZV90cmFuc2Zlcjsgc2V0IGZpbGVfdHJhbnNmZXIgXCJub25lXCJcbiIKLSIJaWYgW2luZm8gZXhpc3RzIGVudihYMTFWTkNfRklMRVRSQU5TRkVSX0VOQUJMRUQpXSB7XG4iCi0iCQlzZXQgZmlsZV90cmFuc2ZlciAkZW52KFgxMVZOQ19GSUxFVFJBTlNGRVJfRU5BQkxFRClcbiIKLSIJfVxuIgotIglsYWJlbCAucHAudC5sIC10ZXh0IFwiRmlsZSBUcmFuc2ZlcjogXCIgLWZvbnQgJGJmb250XG4iCi0iCXJhZGlvYnV0dG9uIC5wcC50Lm5vbmUgIC10ZXh0IFwiTm9uZVwiIC12YXJpYWJsZSBmaWxlX3RyYW5zZmVyIC12YWx1ZSBcIm5vbmVcIiAtZm9udCAkYmZvbnRcbiIKLSIJcmFkaW9idXR0b24gLnBwLnQudWx0cmEgLXRleHQgXCJVbHRyYVZOQ1wiIC12YXJpYWJsZSBmaWxlX3RyYW5zZmVyIC12YWx1ZSBcInVsdHJhXCIgLWZvbnQgJGJmb250XG4iCi0iCXJhZGlvYnV0dG9uIC5wcC50LnRpZ2h0IC10ZXh0IFwiVGlnaHRWTkNcIiAtdmFyaWFibGUgZmlsZV90cmFuc2ZlciAtdmFsdWUgXCJ0aWdodFwiIC1mb250ICRiZm9udFxuIgotIglwYWNrIC5wcC50LmwgLnBwLnQubm9uZSAucHAudC51bHRyYSAucHAudC50aWdodCAtc2lkZSBsZWZ0XG4iCi0iXG4iCi0iCWZyYW1lIC5wcC5vIC1iZCAxIC1yZWxpZWYgcmlkZ2VcbiIKLSIJYnV0dG9uIC5wcC5vLm9rIC10ZXh0IFwiT0tcIiAtY29tbWFuZCBcInNldCBwb3J0X3JlcGx5IDE7IGRlc3Ryb3kgLnBwXCIgLWZvbnQgJGJmb250XG4iCi0iCWJ1dHRvbiAucHAuby5jYW5jZWwgLXRleHQgXCJDYW5jZWxcIiAtY29tbWFuZCBcInNldCBwb3J0X3JlcGx5IDA7IGRlc3Ryb3kgLnBwXCIgLWZvbnQgJGJmb250XG4iCi0iCXBhY2sgLnBwLm8ub2sgLnBwLm8uY2FuY2VsIC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDFcbiIKLSIJcGFjayAucHAubSAtc2lkZSB0b3AgLWZpbGwgeCAtZXhwYW5kIDEgXG4iCi0iCXBhY2sgLnBwLmYgLnBwLnQgLnBwLm8gLXNpZGUgdG9wIC1maWxsIHhcbiIKLSJcbiIKLSIJZm9jdXMgLnBwLmYuZVxuIgotIgkucHAuZi5lIGljdXJzb3IgZW5kXG4iCi0iXG4iCi0iCXdtIHdpdGhkcmF3IC5wcFxuIgotIgl1cGRhdGVcbiIKLSIJY2VudGVyX3dpbiAucHBcbiIKLSJcbiIKLSIJd20gbWluc2l6ZSAucHAgW3dpbmZvIHdpZHRoIC5wcF0gW3dpbmZvIGhlaWdodCAucHBdXG4iCi0iXG4iCi0iCWJpbmQgLnBwLmYuZSA8S2V5UHJlc3MtUmV0dXJuPiBcInNldCBwb3J0X3JlcGx5IDE7IGRlc3Ryb3kgLnBwXCJcbiIKLSJcbiIKLSIJdndhaXQgcG9ydF9yZXBseVxuIgotIlxuIgotIglpZiB7JHBvcnRfcmVwbHl9IHtcbiIKLSIJCXJlZ3N1YiAtYWxsIHteOn0gJHBvcnRfc2V0IFwiXCIgcG9ydF9zZXRcbiIKLSIJCXJlZ3N1YiAtYWxsIHtbIFxcdF19ICRwb3J0X3NldCBcIlwiIHBvcnRfc2V0XG4iCi0iCQlpZiB7W3JlZ2V4cCB7XlswLTldWzAtOV0qJH0gJHBvcnRfc2V0XX0ge1xuIgotIgkJCWlmIHskcG9ydF9zZXQgPCAwfSB7XG4iCi0iCQkJCXNldCBwb3J0X3NldCBbZXhwciAwIC0gJHBvcnRfc2V0XVxuIgotIgkJCX0gZWxzZWlmIHskcG9ydF9zZXQgPCAyMDB9IHtcbiIKLSIJCQkJc2V0IHBvcnRfc2V0IFtleHByICRwb3J0X3NldCArIDU5MDBdXG4iCi0iCQkJfSBcbiIKLSIJCQlwdXRzIFwiJHBvcnRfc2V0OnNzbCR7ZW5hYmxlX3NzbH06bG9jYWxob3N0JGxvY2FsaG9zdDpmdF8kZmlsZV90cmFuc2ZlclwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBjaGFuZ2Vfdmlld19zdGF0ZSB7fSB7XG4iCi0iCWdsb2JhbCBtZW51X3ZhciBndWlfY3VycmVudF9zdGF0ZVxuIgotIlxuIgotIglzZXQgbmV3IFtnZXRfdmlld192YXJpYWJsZV1cbiIKLSJcbiIKLSIJaWYgeyFbaW5mbyBleGlzdHMgZ3VpX2N1cnJlbnRfc3RhdGVdfSB7XG4iCi0iCQlzZXQgZ3VpX2N1cnJlbnRfc3RhdGUgXCJcIlxuIgotIgl9XG4iCi0iCXNldCBvbGQgJGd1aV9jdXJyZW50X3N0YXRlXG4iCi0iCSNwdXRzIFwiJG9sZCAtPiAkbmV3XCJcbiIKLSJcbiIKLSIJaWYgeyRvbGQgPT0gJG5ld30ge1xuIgotIgkJcmV0dXJuXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRvbGQgPT0gXCJmdWxsXCIgfHwgJG9sZCA9PSBcImljb25cIiB8fCAkb2xkID09IFwidHJheVwifSB7XG4iCi0iCQk7XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgb2xkIFwibm9uZVwiXG4iCi0iCX1cbiIKLSJcbiIKLSIJaWYgeyRuZXcgPT0gXCJmdWxsXCIgfHwgJG5ldyA9PSBcImljb25cIiB8fCAkbmV3ID09IFwidHJheVwifSB7XG4iCi0iCQlpZiB7JG9sZCA9PSBcInRyYXlcIn0ge1xuIgotIgkJCSMgc2lnaCBYUmVwYXJlbnRXaW5kb3cgd291bGQgYmUgdG9vIGVhc3kuLi5cbiIKLSIJCQkjIHVuZG9fdHJheV9lbWJlZFxuIgotIgkJCXJlc3RhcnRfZXZlcnl0aGluZyAkbmV3XG4iCi0iCQkJZGVzdHJveSAuXG4iCi0iCQkJZXhpdFxuIgotIgkJfVxuIgotIgkJbWFrZV9ndWkgJG5ld1xuIgotIgkJaWYgeyRuZXcgPT0gXCJ0cmF5XCJ9IHtcbiIKLSIJCQl3bSB3aXRoZHJhdyAuXG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXRfdmlld192YXJpYWJsZSAkb2xkXG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXR1cF9jbGllbnRfdGFpbCB7fSB7XG4iCi0iCWdsb2JhbCBjbGllbnRfdGFpbFxuIgotIglpZiB7JGNsaWVudF90YWlsICE9IFwiXCJ9IHtcbiIKLSIJCWZpbGVldmVudCAkY2xpZW50X3RhaWwgcmVhZGFibGUgcmVhZF9jbGllbnRfdGFpbFxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInByb2Mgc2V0dXBfY2xpZW50X3NvY2sge3tlbmFibGUgMX19IHtcbiIKLSIJZ2xvYmFsIGNsaWVudF9zb2NrXG4iCi0iCWlmIHskY2xpZW50X3NvY2sgIT0gXCJcIn0ge1xuIgotIgkJaWYgeyRlbmFibGV9IHtcbiIKLSIJCQlmaWxlZXZlbnQgJGNsaWVudF9zb2NrIHJlYWRhYmxlIHJlYWRfY2xpZW50X3NvY2tcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJZmlsZWV2ZW50ICRjbGllbnRfc29jayByZWFkYWJsZSBcIlwiXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyBzZXR1cF90cmF5X2VtYmVkIHt9IHtcbiIKLSIJdXBkYXRlXG4iCi0iCXNldCB3IFt3aW5mbyB3aWR0aCAuXVxuIgotIglzZXQgaCBbd2luZm8gaGVpZ2h0IC5dXG4iCi0iCWlmIHskdyA8IDI0fSB7XG4iCi0iCQlzZXQgdyAyNFxuIgotIgl9XG4iCi0iCWlmIHskaCA8IDI0fSB7XG4iCi0iCQlzZXQgaCAyNFxuIgotIgl9XG4iCi0iCXdtIG1pbnNpemUgLiAkdyAkaFxuIgotIglzZXQgd2lkIFt3aW5mbyBpZCAuXQlcbiIKLSIJcHVzaF9uZXdfdmFsdWUgXCJyZW1vdGUtY21kXCIgXCJyZW1vdGUtY21kXCIgXCJ0cmF5ZW1iZWQ6JHdpZFwiIDBcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyByZXN0YXJ0X2V2ZXJ5dGhpbmcge2d1aV9tb2RlfSB7XG4iCi0iCWdsb2JhbCBlbnYgZ3VpX2FyZ3YwIHgxMXZuY19wcm9nIGZ1bGxfd2luXG4iCi0iCWdsb2JhbCBpY29uX21vZGVfYXRfc3RhcnR1cFxuIgotIglnbG9iYWwgdHJheV9lbWJlZCB0cmF5X3J1bm5pbmdcbiIKLSIJaWYgeyRndWlfbW9kZSA9PSBcImZ1bGxcIn0ge1xuIgotIgkJc2V0IGVudihYMTFWTkNfSUNPTl9NT0RFKSAwXG4iCi0iCX0gZWxzZWlmIHskZ3VpX21vZGUgPT0gXCJpY29uXCJ9IHtcbiIKLSIJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERSkgMVxuIgotIgl9IGVsc2VpZiB7JGd1aV9tb2RlID09IFwidHJheVwifSB7XG4iCi0iCQlpZiB7JHRyYXlfcnVubmluZ30ge1xuIgotIgkJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERSkgXCJSVU5OSU5HXCJcbiIKLSIJCX0gZWxzZSB7XG4iCi0iCQkJc2V0IGVudihYMTFWTkNfSUNPTl9NT0RFKSBcIlRSQVlcIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iCXB1dHMgc3RkZXJyIFwiXCJcbiIKLSIJcHV0cyBzdGRlcnIgXCJ0a3gxMXZuYzogcmVzdGFydGluZyBndWkgdG8gbGVhdmUgdHJheSBtb2RlLlwiXG4iCi0iCXB1dHMgc3RkZXJyIFwiICBuZXcgZ3VpIHdpbGwgYmUgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cIlxuIgotIglwdXRzIHN0ZGVyciBcIiAgdXNlIGtpbGwoMSkgcmF0aGVyIHRoYW4gQ3RybC1DIHRvIGtpbGwgaXQuXCJcbiIKLSIJcHV0cyBzdGRlcnIgXCJcIlxuIgotIglpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfUkVTVEFSVF9ERVBUSCldfSB7XG4iCi0iCQlzZXQgbiAkZW52KFgxMVZOQ19SRVNUQVJUX0RFUFRIKVxuIgotIgkJaW5jciBuXG4iCi0iCQlzZXQgZW52KFgxMVZOQ19SRVNUQVJUX0RFUFRIKSAkblxuIgotIgl9IGVsc2Uge1xuIgotIgkJc2V0IGVudihYMTFWTkNfUkVTVEFSVF9ERVBUSCkgMFxuIgotIgl9XG4iCi0iCXNldCBlbnYoWDExVk5DX0lDT05fU0VUUEFTUykgXCJcIlxuIgotIlxuIgotIglpZiB7IVtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1dJU0hDTUQpXX0ge1xuIgotIgkJcHV0cyBzdGRlcnIgXCJmYWlsdXJlIGluIHJlc3RhcnRfZXZlcnl0aGluZy5cIlxuIgotIgkJZXhpdCAxO1xuIgotIgl9XG4iCi0iXG4iCi0iCXNldCBjb2RlIFtleGVjICR4MTF2bmNfcHJvZyAtcHJpbnRndWldXG4iCi0iCWlmIHtbc3RyaW5nIGxlbmd0aCAkY29kZV0gPCAyMDAwMH0ge1xuIgotIgkJcHV0cyBzdGRlcnIgXCJmYWlsdXJlIGluIHJlc3RhcnRfZXZlcnl0aGluZy5cIlxuIgotIgkJZXhpdCAxO1xuIgotIgl9XG4iCi0iCXNldCB0bXAgXCIvdG1wL3gxMXZuY1twaWRdXCJcbiIKLSIJYXBwZW5kIHRtcCBbY2xvY2sgY2xpY2tzXVxuIgotIglzZXQgdG1wMiBcIlwiXG4iCi0iCWNhdGNoIHtzZXQgdG1wMiBbZXhlYyBta3RlbXAgJHRtcC5YWFhYWFggMj4vZGV2L251bGxdfVxuIgotIglpZiB7JHRtcDIgIT0gXCJcIiAmJiBbZmlsZSBleGlzdHMgJHRtcDJdfSB7XG4iCi0iCQlzZXQgdG1wICR0bXAyXG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlmaWxlIGRlbGV0ZSAtZm9yY2UgJHRtcFxuIgotIgkJaWYge1tmaWxlIGV4aXN0cyAkdG1wXX0ge1xuIgotIgkJCXB1dHMgc3RkZXJyIFwiZmFpbHVyZSBpbiByZXN0YXJ0X2V2ZXJ5dGhpbmcuXCJcbiIKLSIJCQlleGl0IDE7XG4iCi0iCQl9XG4iCi0iCX1cbiIKLSIJc2V0IGZoIFtvcGVuICR0bXAgXCJhXCJdXG4iCi0iCWlmIHshW2ZpbGUgb3duZWQgJHRtcF19ICB7XG4iCi0iCQlwdXRzIHN0ZGVyciBcImZhaWx1cmUgaW4gcmVzdGFydF9ldmVyeXRoaW5nLlwiXG4iCi0iCQlleGl0IDE7XG4iCi0iCX1cbiIKLSIJZmlsZSBhdHRyaWJ1dGVzICR0bXAgLXBlcm1pc3Npb25zIFwiMDQwMFwiXG4iCi0iCXB1dHMgJGZoICRjb2RlXG4iCi0iCWNsb3NlICRmaFxuIgotIlxuIgotIgkjcHV0cyBzdGRlcnIgW2V4ZWMgbHMgLWwgJHRtcF1cbiIKLSJcbiIKLSIJd20gd2l0aGRyYXcgLlxuIgotIgljYXRjaCB7d20gd2l0aGRyYXcgJGZ1bGxfd2lufVxuIgotIgl1cGRhdGVcbiIKLSJcbiIKLSIJZXhlYyAkZW52KFgxMVZOQ19XSVNIQ01EKSAkdG1wICZcbiIKLSIJYWZ0ZXIgMjAwMFxuIgotIglmaWxlIGRlbGV0ZSAtZm9yY2UgJHRtcFxuIgotIglcbiIKLSIJZGVzdHJveSAuXG4iCi0iCWV4aXRcbiIKLSJ9XG4iCi0iXG4iCi0icHJvYyB1bmRvX3RyYXlfZW1iZWQge30ge1xuIgotIglzZXQgd2lkIFt3aW5mbyBpZCAuXQlcbiIKLSIJcHVzaF9uZXdfdmFsdWUgXCJyZW1vdGUtY21kXCIgXCJyZW1vdGUtY21kXCIgXCJ0cmF5dW5lbWJlZDokd2lkXCIgMFxuIgotIn1cbiIKLSJcbiIKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCi0iIyBtYWluOlxuIgotIlxuIgotImlmIFtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0dVSV9USU1FKV0ge1xuIgotIglkdGltZSBNXG4iCi0ifVxuIgotIlxuIgotIndtIHdpdGhkcmF3IC5cbiIKLSJcbiIKLSJnbG9iYWwgZW52IHgxMXZuY19wcm9nIHgxMXZuY19jbWRsaW5lIHgxMXZuY194ZGlzcGxheSB4MTF2bmNfY29ubmVjdDtcbiIKLSJnbG9iYWwgeDExdm5jX3hkaXNwbGF5MFxuIgotImdsb2JhbCB4MTF2bmNfY2xpZW50X2ZpbGUgeDExdm5jX2d1aV9nZW9tIHgxMXZuY19zdGFydGVkIHZuY191cmxcbiIKLSJnbG9iYWwgeDExdm5jX2d1aV9wYXJhbXNcbiIKLSJnbG9iYWwgeDExdm5jX2F1dGhfZmlsZSB4MTF2bmNfY29ubmVjdF9maWxlIGJlZ2lubmVyX21vZGUgc2ltcGxlX2d1aV9jcmVhdGVkXG4iCi0iZ2xvYmFsIGhlbHBhbGwgaGVscHRleHQgaGVscHJlbW90ZSBoZWxwbGFiZWwgaG9zdG5hbWUgb3NuYW1lXG4iCi0iZ2xvYmFsIGFsbF9zZXR0aW5ncyByZXBseV94ZGlzcGxheSBhbHdheXNfdXBkYXRlXG4iCi0iZ2xvYmFsIG1heF90ZXh0X2hlaWdodCBtYXhfdGV4dF93aWR0aFxuIgotImdsb2JhbCB0ZXh0X2hlaWdodFxuIgotImdsb2JhbCBtZW51X3ZhciB1bnNldF9zdHIgbWVudXNfZGlzYWJsZWRcbiIKLSJnbG9iYWwgYmZvbnQgZmZvbnQgc2ZvbnQgc25mb250IG9sZF9sYWJlbHMgaGF2ZV9sYWJlbGZyYW1lc1xuIgotImdsb2JhbCBjb25uZWN0ZWRfdG9feDExdm5jXG4iCi0iZ2xvYmFsIGNhY2hlX2FsbF9xdWVyeV92YXJzXG4iCi0iZ2xvYmFsIGxhc3RfcXVlcnlfYWxsX3RpbWUgcXVlcnlfYWxsX2ZyZXEgY2xpZW50X3RhaWwgY2xpZW50X3NvY2sgY2xpZW50X2luZm9fcmVhZFxuIgotImdsb2JhbCBpY29uX21vZGUgaWNvbl9tb2RlX2F0X3N0YXJ0dXAgeDExdm5jX2ljb25fbW9kZVxuIgotImdsb2JhbCB0cmF5X2VtYmVkIHRyYXlfcnVubmluZyBpY29uX3NldHBhc3N3ZCBpY29uX2VtYmVkX2lkXG4iCi0iZ2xvYmFsIGljb25fbm9hZHZhbmNlZCBpY29uX21pbmltYWxcbiIKLSJnbG9iYWwgbWFrZV9ndWlfY291bnQgdGV4dF9hcmVhX3N0clxuIgotImdsb2JhbCBndWlfYXJndjAgZ3VpX3N0YXJ0X21vZGVcbiIKLSJnbG9iYWwgc2NyZWVuX2hlaWdodCBzY3JlZW5fd2lkdGhcbiIKLSJcbiIKLSJzZXQgdW5zZXRfc3RyIFwiKHVuc2V0KVwiXG4iCi0ic2V0IHZuY191cmwgJHVuc2V0X3N0clxuIgotInNldCBjb25uZWN0ZWRfdG9feDExdm5jIDBcbiIKLSJzZXQgbWVudXNfZGlzYWJsZWQgMFxuIgotInNldCBtYXhfdGV4dF9oZWlnaHQgNDBcbiIKLSJzZXQgbWF4X3RleHRfd2lkdGggOTBcbiIKLSJzZXQgdGV4dF9oZWlnaHQgMTRcbiIKLSJzZXQgYmZvbnQgXCItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi0xMjAtKi0qLSotKi0qLSpcIlxuIgotInNldCBzZm9udCBcIi1hZG9iZS1oZWx2ZXRpY2EtYm9sZC1yLSotKi0qLTEwMC0qLSotKi0qLSotKlwiXG4iCi0ic2V0IHNuZm9udCBcIi1hZG9iZS1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLSotMTAwLSotKi0qLSotKi0qXCJcbiIKLSJzZXQgZmZvbnQgXCJmaXhlZFwiXG4iCi0iXG4iCi0ic2V0IGdvdF9oZWx2IDBcbiIKLSJjYXRjaCB7XG4iCi0iCWZvcmVhY2ggZmFtIFtmb250IGZhbWlsaWVzXSAge1xuIgotIgkJaWYgeyRmYW0gPT0gXCJoZWx2ZXRpY2FcIn0ge1xuIgotIgkJCXNldCBnb3RfaGVsdiAxXG4iCi0iCQl9XG4iCi0iCQlpZiB7JGZhbSA9PSBcIkhlbHZldGljYVwifSB7XG4iCi0iCQkJc2V0IGdvdF9oZWx2IDFcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJpZiB7JGdvdF9oZWx2fSB7XG4iCi0iCXNldCBiZm9udCAgXCJIZWx2ZXRpY2EgLTEyIGJvbGRcIlxuIgotIglzZXQgc2ZvbnQgIFwiSGVsdmV0aWNhIC0xMCBib2xkXCJcbiIKLSIJc2V0IHNuZm9udCBcIkhlbHZldGljYSAtMTBcIlxuIgotIn1cbiIKLSJcbiIKLSJzZXQgbHMgXCJcIlxuIgotImNhdGNoIHtzZXQgbHMgW2ZvbnQgbWV0cmljcyAkYmZvbnQgLWxpbmVzcGFjZV19XG4iCi0iaWYgeyRscyAhPSBcIlwiICYmICRscyA+IDE0fSB7XG4iCi0iCSMgc29tZSByZWNlbnQgc2V0dXBzIGhhdmUgQklHIHJlbmRlcmluZyBmb3IgdGhlIGFib3ZlIGZvbnRzLlxuIgotIgkjIG9uIHJlY2VudCAoOC8wOCkgZGViaWFuIHRoZXNlIGFyZSByZWFsbHkgcmFnZ2VkOlxuIgotIglzZXQgYmZvbnQgXCItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi05MC0qLSotKi0qLSotKlwiXG4iCi0iCXNldCBzZm9udCBcIi1hZG9iZS1oZWx2ZXRpY2EtYm9sZC1yLSotKi0qLTc1LSotKi0qLSotKi0qXCJcbiIKLSIJc2V0IHNuZm9udCBcIi1hZG9iZS1oZWx2ZXRpY2EtbWVkaXVtLXItKi0qLSotNzUtKi0qLSotKi0qLSpcIlxuIgotIlxuIgotIglzZXQgbHMgXCJcIlxuIgotIgljYXRjaCB7c2V0IGxzIFtmb250IG1ldHJpY3MgJGJmb250IC1saW5lc3BhY2VdfVxuIgotIglpZiB7JGxzICE9IFwiXCIgJiYgJGxzIDwgMTR9IHtcbiIKLSIJCSMgdGhlc2UgYXJlIGJpZ2dlciBidXQgbG9vayBiZXR0ZXIuLi4gYnV0IGZvciBob3cgbG9uZz9cbiIKLSIJCXNldCBiZm9udCBcIi1hZG9iZS1oZWx2ZXRpY2EtYm9sZC1yLSotKi0qLTEwMC0qLSotKi0qLSotKlwiXG4iCi0iCQlzZXQgc2ZvbnQgXCItYWRvYmUtaGVsdmV0aWNhLWJvbGQtci0qLSotKi04MC0qLSotKi0qLSotKlwiXG4iCi0iCQlzZXQgc25mb250IFwiLWFkb2JlLWhlbHZldGljYS1tZWRpdW0tci0qLSotKi04MC0qLSotKi0qLSotKlwiXG4iCi0iXG4iCi0iCQkjIG1heWJlIGNvbnNpZGVyLi4uIHstZm9udCBmb250IEZvbnQge0hlbHZldGljYSAtMTIgYm9sZH0ge0hlbHZldGljYSAtMTIgYm9sZH19XG4iCi0iCQkjIG9yIHN0aWNrIHdpdGggc3lzdGVtIGZvbnQgbGlrZSBzc3ZuYy5cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSIjIG5lZWQgdG8gY2hlY2sgaWYgXCJmaXhlZFwiIGZvbnQgdW5kZXIgWEZUIG9uIHRrOC41IGlzIGFjdHVhbGx5IGZpeGVkIHdpZHRoISFcbiIKLSJzZXQgbHMgXCJcIlxuIgotImNhdGNoIHtzZXQgbHMgW2ZvbnQgbWV0cmljcyAkZmZvbnQgLWxpbmVzcGFjZV19XG4iCi0ic2V0IGZzIFwiXCJcbiIKLSJjYXRjaCB7c2V0IGZzIFtmb250IG1ldHJpY3MgJGZmb250IC1maXhlZF19XG4iCi0ic2V0IHJlZG8gMFxuIgotImlmIHskZnMgIT0gXCJcIiAmJiAkZnMgIT0gXCIxXCJ9IHtcbiIKLSIJc2V0IHJlZG8gMVxuIgotIn1cbiIKLSJpZiB7JGxzICE9IFwiXCIgJiYgJGxzID4gMTR9IHtcbiIKLSIJc2V0IHJlZG8gMVxuIgotIn1cbiIKLSJpZiB7JHJlZG99IHtcbiIKLSIJZm9yZWFjaCBmbiBbZm9udCBuYW1lc10ge1xuIgotIgkJaWYgeyRmbiA9PSBcIlRrRml4ZWRGb250XCJ9IHtcbiIKLSIJCQlzZXQgZmZvbnQgJGZuXG4iCi0iCQkJYnJlYWtcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJzZXQgaGVscF9pbmRlbnQgMjQ7XG4iCi0ic2V0IHJlcGx5X3hkaXNwbGF5IFwiXCJcbiIKLSJzZXQgYWxsX3NldHRpbmdzIFwiTm9uZSBzbyBmYXIuXCJcbiIKLSJzZXQgYWx3YXlzX3VwZGF0ZSAxXG4iCi0ic2V0IGNhY2hlX2FsbF9xdWVyeV92YXJzIFwiXCJcbiIKLSJzZXQgcXVlcnlfYWxsX2ZyZXEgMTIwXG4iCi0ic2V0IGxhc3RfcXVlcnlfYWxsX3RpbWUgW2Nsb2NrIHNlY29uZHNdXG4iCi0ic2V0IGNsaWVudF90YWlsIFwiXCJcbiIKLSJzZXQgY2xpZW50X3NvY2sgXCJcIlxuIgotInNldCBjbGllbnRfaW5mb19yZWFkIDBcbiIKLSJzZXQgbWFrZV9ndWlfY291bnQgMFxuIgotInNldCB0ZXh0X2FyZWFfc3RyIFwiXCJcbiIKLSJzZXQgZ3VpX2FyZ3YwICRhcmd2MFxuIgotInNldCBndWlfc3RhcnRfbW9kZSBcIlwiXG4iCi0iXG4iCi0iaWYgeyR0a192ZXJzaW9uIDwgOC4wfSB7XG4iCi0iCXB1dHMgc3RkZXJyIFwiXCJcbiIKLSIJcHV0cyBzdGRlcnIgXCIqKiogdGt4MTF2bmM6IHRrIHZlcnNpb24gaXMgb2xkICR0a192ZXJzaW9uLCBwbGVhc2UgdXNlIDguMCBvciBoaWdoZXIuXCJcbiIKLSIJcHV0cyBzdGRlcnIgXCIqKiogICAgICAgICAgIHdpbGwgdHJ5IHRvIGNvbnRpbnVlIHdpdGggcmVkdWNlZCBmdW5jdGlvbmFsaXR5Li4uXCJcbiIKLSIJcHV0cyBzdGRlcnIgXCJcIlxuIgotIn1cbiIKLSJpZiB7W3JlZ2V4cCB7XlszNF19ICR0a192ZXJzaW9uXSB8fCAkdGtfdmVyc2lvbiA9PSBcIjguMFwifSB7XG4iCi0iCXNldCBvbGRfbGFiZWxzIDFcbiIKLSJ9IGVsc2Uge1xuIgotIglzZXQgb2xkX2xhYmVscyAwXG4iCi0ifVxuIgotInNldCBoYXZlX2xhYmVsZnJhbWVzIDFcbiIKLSJpZiB7JHRrX3ZlcnNpb24gPCA4LjR9IHtcbiIKLSIJc2V0IGhhdmVfbGFiZWxmcmFtZXMgMFxuIgotIn1cbiIKLSJcbiIKLSJzZXQgc2NyZWVuX2hlaWdodCBbd2luZm8gc2NyZWVuaGVpZ2h0IC5dXG4iCi0ic2V0IHNjcmVlbl93aWR0aCAgW3dpbmZvIHNjcmVlbndpZHRoICAuXVxuIgotImlmIHskc2NyZWVuX2hlaWdodCA8IDcwMH0ge1xuIgotIgkjIHNob3J0IHNjcmVlbiwgbmV0Ym9vaz9cbiIKLSIJc2V0IG1heF90ZXh0X2hlaWdodCAzMFxuIgotIglpZiB7JHNjcmVlbl9oZWlnaHQgPCA1MDB9IHtcbiIKLSIJCSMgc2hvcnQgc2NyZWVuLCBQREE/XG4iCi0iCQlzZXQgbWF4X3RleHRfaGVpZ2h0IDIyXG4iCi0iCQlzZXQgdGV4dF9oZWlnaHQgMTNcbiIKLSIJCWlmIHskc2NyZWVuX2hlaWdodCA8PSAzNjB9IHtcbiIKLSIJCQkjIHZlcnkgc2hvcnQuXG4iCi0iCQkJc2V0IG1heF90ZXh0X2hlaWdodCAxNlxuIgotIgkJCXNldCBtYXhfdGV4dF93aWR0aCAgNjBcbiIKLSIJCQlzZXQgdGV4dF9oZWlnaHQgMTFcbiIKLSIJCX1cbiIKLSIJfVxuIgotIn1cbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfR1VJX1RFWFRfSEVJR0hUKV19IHtcbiIKLSIJc2V0IG1heF90ZXh0X2hlaWdodCAkZW52KFgxMVZOQ19HVUlfVEVYVF9IRUlHSFQpXG4iCi0ifVxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfVEVYVF9XSURUSCldfSB7XG4iCi0iCXNldCBtYXhfdGV4dF93aWR0aCAgJGVudihYMTFWTkNfR1VJX1RFWFRfV0lEVEgpXG4iCi0ifVxuIgotIlxuIgotImlmIHtcIiRhcmd2XCIgPT0gXCItc3BpdFwifSB7XG4iCi0iCXNldCBmaCBbb3BlbiAkYXJndjAgcl1cbiIKLSIJcHV0cyBcIiNpZm5kZWYgX1RLWDExVk5DX0hcIlxuIgotIglwdXRzIFwiI2RlZmluZSBfVEtYMTFWTkNfSFwiXG4iCi0iCXB1dHMgXCIjaWZkZWYgTk9HVUlcIlxuIgotIglwdXRzIFwiY2hhciBndWlfY29kZVxcW1xcXSA9IFxcXCJcXFwiO1wiXG4iCi0iCXB1dHMgXCIjZWxzZVwiXG4iCi0iCXB1dHMgXCIvKlwiXG4iCi0iCXB1dHMgXCIgKiB0a3gxMXZuYy5oOiBnZW5lcmF0ZWQgYnkgJ3RreDExdm5jIC1zcGl0J1wiXG4iCi0iCXB1dHMgXCIgKiBBYmFuZG9uIGFsbCBob3BlLCB5ZSB3aG8gZW50ZXIgaGVyZS4uLlwiXG4iCi0iCXB1dHMgXCIgKiAuLi5lZGl0IHRreDExdm5jIGluc3RlYWQuXCJcbiIKLSIJcHV0cyBcIiAqL1wiXG4iCi0iCXB1dHMgXCIJY2hhciBndWlfY29kZVxcW1xcXSA9XCJcbiIKLSIJd2hpbGUge1tnZXRzICRmaCBsaW5lXSA+IC0xfSB7XG4iCi0iCQlyZWdzdWIgLWFsbCB7XFxcXH0gJGxpbmUge1xcXFxcXFxcfSBsaW5lXG4iCi0iCQlyZWdzdWIgLWFsbCB7XCJ9ICRsaW5lIHtcXFxcXCJ9IGxpbmVcbiIKLSIJCXB1dHMgXCJcXFwiJGxpbmVcXFxcblxcXCJcIlxuIgotIgl9XG4iCi0iCXB1dHMgXCIjZW5kaWZcIlxuIgotIglwdXRzIFwiLyogaWZkZWYgTk9HVUkgKi9cIlxuIgotIglwdXRzIFwiI2VuZGlmXCJcbiIKLSIJcHV0cyBcIi8qIGlmbmRlZiBfVEtYMTFWTkNfSCAqL1wiXG4iCi0iCWNsb3NlICRmaFxuIgotIglwdXRzIFwiO1wiXG4iCi0iCWV4aXQgMFxuIgotIn1cbiIKLSJcbiIKLSJzZXRfdmlld192YXJpYWJsZSBcImZ1bGxcIlxuIgotIlxuIgotIiNwdXRzIFtleGVjIGVudiB8IGdyZXAgWDExVk5DXVxuIgotIlxuIgotIiMgUmVhZCBlbnZpcm9ubWVudCBmb3IgY2x1ZXM6XG4iCi0iXG4iCi0ic2V0IHgxMXZuY19jbGllbnRfZmlsZSBcIlwiO1xuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19DTElFTlRfRklMRSldfSB7XG4iCi0iCXNldCB4MTF2bmNfY2xpZW50X2ZpbGUgJGVudihYMTFWTkNfQ0xJRU5UX0ZJTEUpO1xuIgotIglzZXQgZmlsZSAkeDExdm5jX2NsaWVudF9maWxlXG4iCi0iXG4iCi0iCXNldCBjbGllbnRfdGFpbCBcIlwiXG4iCi0iCWlmIHtbZmlsZSBleGlzdHMgJGZpbGVdICYmIFtmaWxlIGlzZmlsZSAkZmlsZV19IHtcbiIKLSIJCWlmIHtbZmlsZSByZWFkYWJsZSAkZmlsZV0gJiYgW2ZpbGUgb3duZWQgJGZpbGVdfSB7XG4iCi0iCQkJc2V0IGNsaWVudF90YWlsIFtvcGVuIFwifHRhaWwgLWYgJHgxMXZuY19jbGllbnRfZmlsZVwiIFwiclwiXVxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWlmIHskY2xpZW50X3RhaWwgIT0gXCJcIn0ge1xuIgotIgkJZ2V0cyAkY2xpZW50X3RhaWwgdG1wXG4iCi0iCQlpZiBbZW9mICRjbGllbnRfdGFpbF0ge1xuIgotIiNwdXRzIFwiZW9mICRjbGllbnRfdGFpbFwiXG4iCi0iCQkJY2xlYW5fY2xpZW50X3RhaWxcbiIKLSIJCQlzZXQgY2xpZW50X3RhaWwgXCJcIlxuIgotIgkJfVxuIgotIgl9XG4iCi0iCWNhdGNoIHtmaWxlIGRlbGV0ZSAtZm9yY2UgJHgxMXZuY19jbGllbnRfZmlsZX1cbiIKLSJ9XG4iCi0iXG4iCi0iaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1BST0cpXX0ge1xuIgotIglzZXQgeDExdm5jX3Byb2cgJGVudihYMTFWTkNfUFJPRyk7XG4iCi0ifSBlbHNlIHtcbiIKLSIJc2V0IHgxMXZuY19wcm9nIFwieDExdm5jXCI7XG4iCi0ifVxuIgotIlxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19DTURMSU5FKV19IHtcbiIKLSIJc2V0IHgxMXZuY19jbWRsaW5lICRlbnYoWDExVk5DX0NNRExJTkUpO1xuIgotIn0gZWxzZSB7XG4iCi0iCXNldCB4MTF2bmNfY21kbGluZSBcIlwiO1xuIgotIn1cbiIKLSJcbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfQ09OTkVDVCldfSB7XG4iCi0iCXNldCB4MTF2bmNfY29ubmVjdCAxXG4iCi0ifSBlbHNlIHtcbiIKLSIJc2V0IHgxMXZuY19jb25uZWN0IDA7XG4iCi0ifVxuIgotIlxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19HVUlfR0VPTSldfSB7XG4iCi0iCXNldCB4MTF2bmNfZ3VpX2dlb20gJGVudihYMTFWTkNfR1VJX0dFT00pO1xuIgotIn0gZWxzZSB7XG4iCi0iCXNldCB4MTF2bmNfZ3VpX2dlb20gXCJcIlxuIgotIn1cbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfR1VJX1BBUkFNUyldfSB7XG4iCi0iCXNldCB4MTF2bmNfZ3VpX3BhcmFtcyAkZW52KFgxMVZOQ19HVUlfUEFSQU1TKTtcbiIKLSJ9IGVsc2Uge1xuIgotIglzZXQgeDExdm5jX2d1aV9wYXJhbXMgXCJcIlxuIgotIn1cbiIKLSJcbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfRk9OVF9CT0xEKV19IHtcbiIKLSIJc2V0IGJmb250ICRlbnYoWDExVk5DX0ZPTlRfQk9MRClcbiIKLSJ9XG4iCi0iaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0ZPTlRfQk9MRF9TTUFMTCldfSB7XG4iCi0iCXNldCBzZm9udCAkZW52KFgxMVZOQ19GT05UX0JPTERfU01BTEwpXG4iCi0ifVxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19GT05UX1JFR19TTUFMTCldfSB7XG4iCi0iCXNldCBzbmZvbnQgJGVudihYMTFWTkNfRk9OVF9SRUdfU01BTEwpXG4iCi0ifVxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19GT05UX0ZJWEVEKV19IHtcbiIKLSIJc2V0IGZmb250ICRlbnYoWDExVk5DX0ZPTlRfRklYRUQpXG4iCi0ifVxuIgotIlxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19DT05ORUNUX0ZJTEUpXX0ge1xuIgotIglzZXQgeDExdm5jX2Nvbm5lY3RfZmlsZSAkZW52KFgxMVZOQ19DT05ORUNUX0ZJTEUpO1xuIgotIn0gZWxzZSB7XG4iCi0iCXNldCB4MTF2bmNfY29ubmVjdF9maWxlIFwiXCI7XG4iCi0ifVxuIgotIlxuIgotInNldCB4MTF2bmNfc3RhcnRlZCAwXG4iCi0iaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1NUQVJURUQpXX0ge1xuIgotIglzZXQgeDExdm5jX3N0YXJ0ZWQgMVxuIgotIn1cbiIKLSJcbiIKLSJzZXQgeDExdm5jX3hkaXNwbGF5IFwiXCJcbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfWERJU1BMQVkpXX0ge1xuIgotIglzZXQgeDExdm5jX3hkaXNwbGF5ICRlbnYoWDExVk5DX1hESVNQTEFZKTtcbiIKLSIJc2V0IHgxMXZuY19jb25uZWN0IDFcbiIKLSJcbiIKLSJ9IGVsc2VpZiB7JGFyZ3YgIT0gXCJcIiAmJiBbcmVnZXhwIHs6WzAtOV19ICRhcmd2XX0ge1xuIgotIglzZXQgZW52KFgxMVZOQ19YRElTUExBWSkgXCIkYXJndlwiXG4iCi0iCXNldCB4MTF2bmNfeGRpc3BsYXkgXCIkYXJndlwiXG4iCi0iCXNldCB4MTF2bmNfY29ubmVjdCAxXG4iCi0iXG4iCi0ifSBlbHNlaWYge1tpbmZvIGV4aXN0cyBlbnYoRElTUExBWSldfSB7XG4iCi0iCXNldCB4MTF2bmNfeGRpc3BsYXkgJGVudihESVNQTEFZKTtcbiIKLSJ9IGVsc2Uge1xuIgotIglzZXQgeDExdm5jX3hkaXNwbGF5IFwiOjBcIjtcbiIKLSJ9XG4iCi0ic2V0IHgxMXZuY194ZGlzcGxheTAgJHgxMXZuY194ZGlzcGxheVxuIgotIlxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19BVVRIX0ZJTEUpXX0ge1xuIgotIglzZXQgeDExdm5jX2F1dGhfZmlsZSAkZW52KFgxMVZOQ19BVVRIX0ZJTEUpXG4iCi0ifSBlbHNlIHtcbiIKLSIJc2V0IHgxMXZuY19hdXRoX2ZpbGUgXCJcIlxuIgotIn1cbiIKLSJcbiIKLSJzZXQgc2ltcGxlX2d1aV9jcmVhdGVkIDBcbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfU0lNUExFX0dVSSldfSB7XG4iCi0iCXNldCBiZWdpbm5lcl9tb2RlIDFcbiIKLSJ9IGVsc2Uge1xuIgotIglzZXQgYmVnaW5uZXJfbW9kZSAwXG4iCi0ifVxuIgotIlxuIgotInNldCBpY29uX21vZGUgMFxuIgotInNldCB4MTF2bmNfaWNvbl9tb2RlIDBcbiIKLSJzZXQgdHJheV9lbWJlZCAwXG4iCi0ic2V0IHRyYXlfcnVubmluZyAwXG4iCi0iXG4iCi0iaWYgeyFbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX01PREVfQVRfU1RBUlRVUCldfSB7XG4iCi0iCWlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX01PREUpXX0ge1xuIgotIgkJaWYgeyRlbnYoWDExVk5DX0lDT05fTU9ERSkgIT0gMH0ge1xuIgotIgkJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERV9BVF9TVEFSVFVQKSAxXG4iCi0iCQl9IGVsc2Uge1xuIgotIgkJCXNldCBlbnYoWDExVk5DX0lDT05fTU9ERV9BVF9TVEFSVFVQKSAwXG4iCi0iCQl9XG4iCi0iCX0gZWxzZSB7XG4iCi0iCQlzZXQgZW52KFgxMVZOQ19JQ09OX01PREVfQVRfU1RBUlRVUCkgMFxuIgotIgl9XG4iCi0ifVxuIgotInNldCBpY29uX21vZGVfYXRfc3RhcnR1cCAkZW52KFgxMVZOQ19JQ09OX01PREVfQVRfU1RBUlRVUClcbiIKLSJcbiIKLSJpZiB7IVtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0lDT05fTU9ERSldfSB7XG4iCi0iCXNldCBpY29uX21vZGUgMFxuIgotIn0gZWxzZWlmIHskZW52KFgxMVZOQ19JQ09OX01PREUpID09IFwiXCIgfHwgJGVudihYMTFWTkNfSUNPTl9NT0RFKSA9PSBcIjBcIn0ge1xuIgotIglzZXQgaWNvbl9tb2RlIDBcbiIKLSJ9IGVsc2Uge1xuIgotIglzZXQgaWNvbl9tb2RlIDFcbiIKLSIJc2V0X3ZpZXdfdmFyaWFibGUgXCJpY29uXCJcbiIKLSIJaWYgW3JlZ2V4cCAtbm9jYXNlIHtUUkFZfSAkZW52KFgxMVZOQ19JQ09OX01PREUpXSB7XG4iCi0iCQlzZXQgdHJheV9lbWJlZCAxXG4iCi0iCX1cbiIKLSIJaWYgW3JlZ2V4cCAtbm9jYXNlIHtSVU5OSU5HfSAkZW52KFgxMVZOQ19JQ09OX01PREUpXSB7XG4iCi0iCQlzZXQgdHJheV9ydW5uaW5nIDFcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJzZXQgaWNvbl9zZXRwYXNzd2QgMFxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX1NFVFBBU1MpXX0ge1xuIgotIglpZiB7JGVudihYMTFWTkNfSUNPTl9TRVRQQVNTKSAhPSBcIlwifSB7XG4iCi0iCQlzZXQgaWNvbl9zZXRwYXNzd2QgMVxuIgotIgl9XG4iCi0ifVxuIgotIlxuIgotInNldCBpY29uX25vYWR2YW5jZWQgMFxuIgotImlmIHtbaW5mbyBleGlzdHMgZW52KFgxMVZOQ19JQ09OX05PQURWQU5DRUQpXX0ge1xuIgotIglzZXQgaWNvbl9ub2FkdmFuY2VkIDFcbiIKLSJ9XG4iCi0iXG4iCi0ic2V0IGljb25fbWluaW1hbCAwXG4iCi0iaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0lDT05fTUlOSU1BTCldfSB7XG4iCi0iCXNldCBpY29uX21pbmltYWwgMVxuIgotIn1cbiIKLSJcbiIKLSJpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfSUNPTl9FTUJFRF9JRCldfSB7XG4iCi0iCXNldCBpY29uX2VtYmVkX2lkICRlbnYoWDExVk5DX0lDT05fRU1CRURfSUQpXG4iCi0ifSBlbHNlIHtcbiIKLSIJc2V0IGljb25fZW1iZWRfaWQgXCJcIlxuIgotIn1cbiIKLSJcbiIKLSJcbiIKLSJzZXQgaG9zdG5hbWUgW2V4ZWMgdW5hbWUgLW5dXG4iCi0ic2V0IG9zbmFtZSBbZXhlYyB1bmFtZV1cbiIKLSJcbiIKLSJpZiB7W3JlZ2V4cCAtbm9jYXNlIHtJUklYfSAkb3NuYW1lXX0ge1xuIgotIgkjIElSSVggXCJmaXhlZFwiIGZvbnQgaXMgaHVnZSBhbmQgZG91Ymxlc3BhY2VkLi4uIFxuIgotIglzZXQgZmZvbnQgJHNuZm9udFxuIgotIn1cbiIKLSJpZiB7W3JlZ2V4cCAtbm9jYXNlIHtEYXJ3aW59ICRvc25hbWVdfSB7XG4iCi0iCXNldCBmZm9udCB7TW9uYWNvIDEwfVxuIgotIglzZXQgYmZvbnQge3N5c3RlbX1cbiIKLSJ9XG4iCi0iXG4iCi0iaWYge1wiJGFyZ3ZcIiA9PSBcIi1wb3J0cHJvbXB0XCJ9IHtcbiIKLSIJZG9fcG9ydF9wcm9tcHRcbiIKLSIJZXhpdCAwXG4iCi0ifVxuIgotIlxuIgotIiNwdXRzIFtleGVjIGVudl1cbiIKLSIjcHV0cyBcIngxMXZuY194ZGlzcGxheTogJHgxMXZuY194ZGlzcGxheVwiXG4iCi0iXG4iCi0ic2V0IGVudihYMTFWTkNfU1REX0hFTFApIDFcbiIKLSJcbiIKLSIjIHNjcmFwZSB0aGUgaGVscCBvdXRwdXQgZm9yIHRoZSB0ZXh0IGFuZCByZW1vdGUgY29udHJvbCB2YXJzOlxuIgotInBhcnNlX2hlbHA7XG4iCi0icGFyc2VfcmVtb3RlX2hlbHA7XG4iCi0icGFyc2VfcXVlcnlfaGVscDtcbiIKLSJcbiIKLSIjIHR3ZWFrcyB0byBkdXBsaWNhdGUgaGVscCB0ZXh0OlxuIgotInR3ZWFrX3JlbW90ZV9oZWxwIGxvY2sgZGVueVxuIgotInR3ZWFrX3JlbW90ZV9oZWxwIHVubG9jayBkZW55XG4iCi0iXG4iCi0idHdlYWtfYm90aCBxdWlldCBxXG4iCi0idHdlYWtfaGVscCBsb2dmaWxlIG9cbiIKLSJ0d2Vha19ib3RoIHh3YXJwcG9pbnRlciB4d2FycFxuIgotInR3ZWFrX2JvdGggc2NyZWVuX2JsYW5rIHNiXG4iCi0iXG4iCi0ic2V0X3RlbXBsYXRlXG4iCi0iXG4iCi0ic2V0X25hbWUgXCJ0a3gxMXZuY1wiXG4iCi0iXG4iCi0ia2V5X2JpbmRpbmdzO1xuIgotIlxuIgotImdldF9kZWZhdWx0X3ZhcnNcbiIKLSJcbiIKLSJkdGltZSBEXG4iCi0iXG4iCi0icHJvYyBjaGVja19zZXRwYXNzd2Qge30ge1xuIgotIglnbG9iYWwgZW52IGljb25fc2V0cGFzc3dkXG4iCi0iCWdsb2JhbCBkb19wcm9wc19tc2dcbiIKLSIJc2V0IGRvX3Byb3BzX21zZyBcIlwiXG4iCi0iCWlmIHskaWNvbl9zZXRwYXNzd2R9IHtcbiIKLSIJCXNldCBtIFwiXFxuXCJcbiIKLSIJCXNldCBtIFwiJHttfSBOb3RlIHRoZSB4MTF2bmMgaWNvbiBpbiB0aGUgc3lzdGVtIHRyYXkuXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX0gVGhpcyBwYW5lbCBpcyBpdHMgJ1Byb3BlcnRpZXMnIGRpYWxvZy5cXG5cIiBcbiIKLSIJCXNldCBtIFwiJHttfVxcblwiIFxuIgotIgkJc2V0IG0gXCIke219IFRvIHNwZWNpZnkgYSBTZXNzaW9uIFBhc3N3b3JkIGFuZCB0b1xcblwiIFxuIgotIgkJc2V0IG0gXCIke219IGFsbG93IFZOQyB2aWV3ZXJzIHRvIGNvbm5lY3QsIGZvbGxvd1xcblwiIFxuIgotIgkJc2V0IG0gXCIke219IHRoZXNlIHN0ZXBzOlxcblwiIFxuIgotIgkJc2V0IG0gXCIke219XFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX0gRW50ZXIgYSBwYXNzd2QgaW4gdGhlIFBhc3N3b3JkIGZpZWxkXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX0gKGl0IGNhbiBiZSBsZWZ0IGJsYW5rLikgIFlvdSBjYW4gYWxzb1xcblwiIFxuIgotIgkJc2V0IG0gXCIke219IHN1cHBseSBhIFZpZXdPbmx5IHBhc3N3ZCBpZiBkZXNpcmVkLlxcblwiIFxuIgotIgkJc2V0IG0gXCIke219XFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX0gU2V0ICdBY2NlcHQgQ29ubmVjdGlvbnMnIGFuZCB0aGVuIFByZXNzIFxcblwiIFxuIgotIgkJc2V0IG0gXCIke219ICdBcHBseScgdG8gYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbnMuXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX1cXG5cIiBcbiIKLSIJCXNldCBtIFwiJHttfSBObyBWaWV3ZXIgY2FuIGNvbm5lY3QgdW50aWwgeW91IGRvIHRoaXMuXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX1cXG5cIiBcbiIKLSIJCXNldCBtIFwiJHttfSBUaGUgcGFzc3dvcmRzIGFyZSBvbmx5IGZvciB0aGlzIHgxMXZuY1xcblwiIFxuIgotIgkJc2V0IG0gXCIke219IHNlc3Npb24gYW5kIGFyZSBub3Qgc2F2ZWQuICBSdW4geDExdm5jXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX0gbWFudWFsbHkgZm9yIG1vcmUgY29udHJvbCAoZS5nLiAtcmZiYXV0aCBcXG5cIiBcbiIKLSIJCXNldCBtIFwiJHttfSBmb3IgYSBzYXZlZCBwYXNzd29yZC4pXFxuXCIgXG4iCi0iCQlzZXQgbSBcIiR7bX1cXG5cIiBcbiIKLSIJCXNldCBtIFwiJHttfSBTZWUgJ0hlbHAnIGZvciBkZXRhaWxzIG9uIGVhY2ggb3B0aW9uLlxcblwiIFxuIgotIlxuIgotIgkJZ2xvYmFsIHgxMXZuY19jbWRsaW5lXG4iCi0iXG4iCi0iCQlzZXQgZG9zc2wgMFxuIgotIgkJaWYge1tpbmZvIGV4aXN0cyB4MTF2bmNfY21kbGluZV19IHtcbiIKLSIJCQlpZiBbcmVnZXhwIC0tIHstc3NsfSAkeDExdm5jX2NtZGxpbmVdIHtcbiIKLSIJCQkJc2V0IGRvc3NsIDFcbiIKLSIJCQl9XG4iCi0iCQl9XG4iCi0iCQlpZiB7JGRvc3NsIHx8IFtpbmZvIGV4aXN0cyBlbnYoWDExVk5DX0dPVF9TU0wpXX0ge1xuIgotIgkJCXNldCBtIFwiJHttfVxcblwiIFxuIgotIgkJCXNldCBtIFwiJHttfSBTU0wgZW5jcnlwdGlvbiBtb2RlIGFjdGl2ZS4gIFlvdSBjYW5cXG5cIiBcbiIKLSIJCQlzZXQgbSBcIiR7bX0gZmluZCB5b3VyIFB1YmxpYyBDZXJ0IGluIHRoZSBMb2dmaWxlXFxuXCIgXG4iCi0iCQkJc2V0IG0gXCIke219IGFuZCBhbHNvIHRoZSB+Ly52bmMvY2VydHMgZGlyZWN0b3J5LlxcblwiIFxuIgotIgkJfVxuIgotIlxuIgotIgkJaWYge1tpbmZvIGV4aXN0cyBlbnYoWDExVk5DX1NFVFBBU1NfRkFJTCldfSB7XG4iCi0iCQkJc2V0IHBwIDU5MDBcbiIKLSIJCQlpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfR09UX1JGQlBPUlRfVkFMKV19IHtcbiIKLSIJCQkJaWYgeyRlbnYoWDExVk5DX0dPVF9SRkJQT1JUX1ZBTCkgPiAwfSB7XG4iCi0iCQkJCQlzZXQgcHAgJGVudihYMTFWTkNfR09UX1JGQlBPUlRfVkFMKVxuIgotIgkJCQl9XG4iCi0iCQkJfVxuIgotIgkJCVxuIgotIgkJCXNldCBtICAgICBcIiBUaGUgeDExdm5jIHByb2dyYW0gZmFpbGVkIHRvIHN0YXJ0ISBcXG5cIlxuIgotIgkJCXNldCBtIFwiJHttfVxcblwiIFxuIgotIgkJCXNldCBtIFwiJHttfSBNYXliZSB0aGVyZSBpcyBhbm90aGVyIFZOQyBzZXJ2ZXJcXG5cIlxuIgotIgkJCXNldCBtIFwiJHttfSBhbHJlYWR5IGxpc3RlbmluZyBvbiBwb3J0ICRwcD9cXG5cIlxuIgotIgkJCXNldCBtIFwiJHttfVxcblwiIFxuIgotIgkJCXNldCBtIFwiJHttfSBZb3Ugd2lsbCBuZWVkIHRvIHN0YXJ0IG92ZXIgYWZ0ZXJcXG5cIlxuIgotIgkJCXNldCBtIFwiJHttfSB5b3UgbWFrZSBzdXJlIHgxMXZuYyBjYW4gc3RhcnQuXFxuXCJcbiIKLSIJCX1cbiIKLSIJCVxuIgotIgkJc2V0IGRvX3Byb3BzX21zZyAkbVxuIgotIgkJZG9fcHJvcHNcbiIKLSIJfVxuIgotIn1cbiIKLSJcbiIKLSJpZiB7MH0ge1xuIgotIglpZiB7W2luZm8gZXhpc3RzIGVudihYMTFWTkNfSUNPTl9TRVRQQVNTKV19IHtcbiIKLSIJCWlmIHskZW52KFgxMVZOQ19JQ09OX1NFVFBBU1MpID09IFwiMlwifSB7XG4iCi0iCQkJZ2xvYmFsIGljb25fbW9kZV9hdF9zdGFydHVwIGljb25fbW9kZVxuIgotIgkJCXNldCBpY29uX21vZGVfYXRfc3RhcnR1cCAxXG4iCi0iCQkJc2V0IGljb25fbW9kZSAyXG4iCi0iCQl9XG4iCi0iCX1cbiIKLSJ9XG4iCi0iXG4iCi0iaWYgeyRpY29uX21vZGV9IHtcbiIKLSIJaWYgeyRpY29uX21vZGUgPT0gMn0ge1xuIgotIgkJbWFrZV9ndWkgXCJmdWxsXCJcbiIKLSIJfSBlbHNlaWYgeyR0cmF5X2VtYmVkfSB7XG4iCi0iCQltYWtlX2d1aSBcInRyYXlcIlxuIgotIgl9IGVsc2Uge1xuIgotIgkJbWFrZV9ndWkgXCJpY29uXCJcbiIKLSIJfVxuIgotIglkdGltZSBHXG4iCi0iCW9sZF9iYWxsb29uXG4iCi0iCWNoZWNrX3NldHBhc3N3ZFxuIgotIglwdXNoX25ld192YWx1ZSBcInJlbW90ZS1jbWRcIiBcInJlbW90ZS1jbWRcIiBcIlE6Y2xpZW50c1wiIDFcbiIKLSJ9IGVsc2Uge1xuIgotIgltYWtlX2d1aSBcImZ1bGxcIlxuIgotIglkdGltZSBHXG4iCi0iCWNoZWNrX3NldHBhc3N3ZFxuIgotIn1cbiIKLSJcbiIKLSJcbiIKLSIjIG1haW4gbG9vcC5cbiIKLSNlbmRpZgotLyogaWZkZWYgTk9HVUkgKi8KLSNlbmRpZgotLyogaWZuZGVmIF9US1gxMVZOQ19IICovCi07CmRpZmYgLS1naXQgYS94MTF2bmMvdWlucHV0LmMgYi94MTF2bmMvdWlucHV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmQxZDguLjAwMDAwMDAKLS0tIGEveDExdm5jL3VpbnB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3NiArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHVpbnB1dC5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotI2luY2x1ZGUgInhpbmVyYW1hLmgiCi0jaW5jbHVkZSAic2NyZWVuLmgiCi0jaW5jbHVkZSAicG9pbnRlci5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAiYWxsb3dlZF9pbnB1dF90LmgiCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSAotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJTlVYX0lOUFVUX0gKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSU5VWF9VSU5QVVRfSAotI2RlZmluZSBVSU5QVVRfT0sKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFVJTlBVVF9PSwotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWlucHV0Lmg+Ci0KLSNpZiAhZGVmaW5lZChFVl9TWU4pIHx8ICFkZWZpbmVkKFNZTl9SRVBPUlQpCi0jdW5kZWYgVUlOUFVUX09LCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotaW50IGNoZWNrX3VpbnB1dCh2b2lkKTsKLWludCBpbml0aWFsaXplX3VpbnB1dCh2b2lkKTsKLXZvaWQgc2h1dGRvd25fdWlucHV0KHZvaWQpOwotaW50IHNldF91aW5wdXRfYWNjZWwoY2hhciAqc3RyKTsKLWludCBzZXRfdWlucHV0X3RocmVzaChjaGFyICpzdHIpOwotdm9pZCBzZXRfdWlucHV0X3Jlc2V0KGludCBtcyk7Ci12b2lkIHNldF91aW5wdXRfYWx3YXlzKGludCk7Ci12b2lkIHNldF91aW5wdXRfdG91Y2hzY3JlZW4oaW50KTsKLXZvaWQgc2V0X3VpbnB1dF9hYnMoaW50KTsKLWNoYXIgKmdldF91aW5wdXRfYWNjZWwoKTsKLWNoYXIgKmdldF91aW5wdXRfdGhyZXNoKCk7Ci1pbnQgZ2V0X3VpbnB1dF9yZXNldCgpOwotaW50IGdldF91aW5wdXRfYWx3YXlzKCk7Ci1pbnQgZ2V0X3VpbnB1dF90b3VjaHNjcmVlbigpOwotaW50IGdldF91aW5wdXRfYWJzKCk7Ci12b2lkIHBhcnNlX3VpbnB1dF9zdHIoY2hhciAqc3RyKTsKLXZvaWQgdWlucHV0X3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLXZvaWQgdWlucHV0X2tleV9jb21tYW5kKGludCBkb3duLCBpbnQga2V5c3ltLCByZmJDbGllbnRQdHIgY2xpZW50KTsKLQotc3RhdGljIHZvaWQgaW5pdF9rZXlfdHJhY2tlcih2b2lkKTsKLXN0YXRpYyBpbnQgbW9kX2lzX2Rvd24odm9pZCk7Ci1zdGF0aWMgaW50IGtleV9pc19kb3duKHZvaWQpOwotc3RhdGljIHZvaWQgc2V0X3VpbnB1dF9hY2NlbF94eShkb3VibGUgZngsIGRvdWJsZSBmeSk7Ci1zdGF0aWMgdm9pZCBwdHJfbW92ZShpbnQgZHgsIGludCBkeSk7Ci1zdGF0aWMgdm9pZCBwdHJfcmVsKGludCBkeCwgaW50IGR5KTsKLXN0YXRpYyB2b2lkIGJ1dHRvbl9jbGljayhpbnQgZG93biwgaW50IGJ0bik7Ci1zdGF0aWMgaW50IGxvb2t1cF9jb2RlKGludCBrZXlzeW0pOwotCi1zdGF0aWMgaW50IGZkID0gLTE7Ci1zdGF0aWMgaW50IGRpcmVjdF9yZWxfZmQgPSAtMTsKLXN0YXRpYyBpbnQgZGlyZWN0X2Fic19mZCA9IC0xOwotc3RhdGljIGludCBkaXJlY3RfYnRuX2ZkID0gLTE7Ci1zdGF0aWMgaW50IGRpcmVjdF9rZXlfZmQgPSAtMTsKLXN0YXRpYyBpbnQgYm1hc2sgPSAwOwotc3RhdGljIGludCBkYiA9IDA7Ci0KLXN0YXRpYyBjaGFyICppbmplY3RhYmxlID0gTlVMTDsKLXN0YXRpYyBjaGFyICp1aW5wdXRfZGV2ID0gTlVMTDsKLXN0YXRpYyBjaGFyICp0c2xpYl9jYWwgPSBOVUxMOwotc3RhdGljIGRvdWJsZSBhWzddOwotc3RhdGljIGludCB1aW5wdXRfdG91Y2hzY3JlZW4gPSAwOwotc3RhdGljIGludCB1aW5wdXRfYWJzID0gMDsKLXN0YXRpYyBpbnQgYnRuX3RvdWNoID0gMDsKLXN0YXRpYyBpbnQgZHJhZ3NraXAgPSAwOwotc3RhdGljIGludCB0b3VjaF9hbHdheXMgPSAwOwotc3RhdGljIGludCB0b3VjaF9wcmVzc3VyZSA9IDE7Ci1zdGF0aWMgaW50IGFic194ID0gMCwgYWJzX3kgPSAwOwotCi1zdGF0aWMgY2hhciAqZGV2c1tdID0gewotCSIvZGV2L21pc2MvdWlucHV0IiwKLQkiL2Rldi9pbnB1dC91aW5wdXQiLAotCSIvZGV2L3VpbnB1dCIsCi0JTlVMTAotfTsKLQotI2lmbmRlZiBPX05ERUxBWQotI2lmZGVmICBPX05PTkJMT0NLCi0jZGVmaW5lIE9fTkRFTEFZIE9fTk9OQkxPQ0sKLSNlbHNlCi0jZGVmaW5lIE9fTkRFTEFZIDAKLSNlbmRpZgotI2VuZGlmCi0KLS8qIAotICogVXNlciBtYXkgbmVlZCB0byBkbzoKLSAJbW9kcHJvZGUgdWlucHV0Ci0JbWtub2QgL2Rldi9pbnB1dC91aW5wdXQgYyAxMCAyMjMKLSAqLwotCi1pbnQgY2hlY2tfdWlucHV0KHZvaWQpIHsKLSNpZm5kZWYgVUlOUFVUX09LCi0JcmV0dXJuIDA7Ci0jZWxzZQotCWludCBpOwotCWlmIChVVC5yZWxlYXNlKSB7Ci0JCWludCBtYWosIG1pbjsKLQkJLyogZ3VhcmQgYWdhaW5zdCBsaW51eCAyLjQgKi8KLQkJaWYgKHNzY2FuZihVVC5yZWxlYXNlLCAiJWQuJWQuIiwgJm1haiwgJm1pbikgPT0gMikgewotCQkJaWYgKG1haiA8IDIpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobWFqID09IDIpIHsKLQkJCQkvKiBobW1tIElQQVEgMi40LjE5LXJtazYtcHhhMS1oaDM3IHdvcmtzLi4uICovCi0jaWYgMAotCQkJCWlmIChtaW4gPCA2KSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLSNlbmRpZgotCQkJfQotCQl9Ci0JfQotCWZkID0gLTE7Ci0JaSA9IDA7Ci0Jd2hpbGUgKGRldnNbaV0gIT0gTlVMTCkgewotCQlpZiAoIChmZCA9IG9wZW4oZGV2c1tpKytdLCBPX1dST05MWSB8IE9fTkRFTEFZKSkgPj0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGZkIDwgMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JY2xvc2UoZmQpOwotCWZkID0gLTE7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCBrZXlfcHJlc3NlZFsyNTZdOwotc3RhdGljIGludCBrZXlfaXNtb2RbMjU2XTsKLQotc3RhdGljIHZvaWQgaW5pdF9rZXlfdHJhY2tlcih2b2lkKSB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCWtleV9wcmVzc2VkW2ldID0gMDsKLQkJa2V5X2lzbW9kW2ldID0gMDsKLQl9Ci0JaSA9IGxvb2t1cF9jb2RlKFhLX1NoaWZ0X0wpOwlpZiAoMDw9aSAmJiBpPDI1Nikga2V5X2lzbW9kW2ldID0gMTsKLQlpID0gbG9va3VwX2NvZGUoWEtfU2hpZnRfUik7CWlmICgwPD1pICYmIGk8MjU2KSBrZXlfaXNtb2RbaV0gPSAxOwotCWkgPSBsb29rdXBfY29kZShYS19Db250cm9sX0wpOwlpZiAoMDw9aSAmJiBpPDI1Nikga2V5X2lzbW9kW2ldID0gMTsKLQlpID0gbG9va3VwX2NvZGUoWEtfQ29udHJvbF9SKTsJaWYgKDA8PWkgJiYgaTwyNTYpIGtleV9pc21vZFtpXSA9IDE7Ci0JaSA9IGxvb2t1cF9jb2RlKFhLX0FsdF9MKTsJaWYgKDA8PWkgJiYgaTwyNTYpIGtleV9pc21vZFtpXSA9IDE7Ci0JaSA9IGxvb2t1cF9jb2RlKFhLX0FsdF9SKTsJaWYgKDA8PWkgJiYgaTwyNTYpIGtleV9pc21vZFtpXSA9IDE7Ci0JaSA9IGxvb2t1cF9jb2RlKFhLX01ldGFfTCk7CWlmICgwPD1pICYmIGk8MjU2KSBrZXlfaXNtb2RbaV0gPSAxOwotCWkgPSBsb29rdXBfY29kZShYS19NZXRhX1IpOwlpZiAoMDw9aSAmJiBpPDI1Nikga2V5X2lzbW9kW2ldID0gMTsKLX0KLQotc3RhdGljIGludCBtb2RfaXNfZG93bih2b2lkKSB7Ci0JaW50IGk7Ci0JaWYgKDApIHtrZXlfaXNfZG93bigpO30KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaWYgKGtleV9wcmVzc2VkW2ldICYmIGtleV9pc21vZFtpXSkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQga2V5X2lzX2Rvd24odm9pZCkgewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpZiAoa2V5X3ByZXNzZWRbaV0pIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIHNodXRkb3duX3VpbnB1dCh2b2lkKSB7Ci0jaWZkZWYgVUlOUFVUX09LCi0JaWYgKGZkID49IDApIHsKLQkJaWYgKGRiKSB7Ci0JCQlyZmJMb2coInNodXRkb3duX3VpbnB1dCBjYWxsZWQgb24gZmQ9JWRcbiIsIGZkKTsKLQkJfQotCQlpb2N0bChmZCwgVUlfREVWX0RFU1RST1kpOwotCQljbG9zZShmZCk7Ci0JCWZkID0gLTE7Ci0JfQotCi0JLyogY2xvc2UgZGlyZWN0IGluamVjdGlvbiBmaWxlcyB0b286ICovCi0JaWYgKGRpcmVjdF9yZWxfZmQgPj0gMCkgY2xvc2UoZGlyZWN0X3JlbF9mZCk7Ci0JaWYgKGRpcmVjdF9hYnNfZmQgPj0gMCkgY2xvc2UoZGlyZWN0X2Fic19mZCk7Ci0JaWYgKGRpcmVjdF9idG5fZmQgPj0gMCkgY2xvc2UoZGlyZWN0X2J0bl9mZCk7Ci0JaWYgKGRpcmVjdF9rZXlfZmQgPj0gMCkgY2xvc2UoZGlyZWN0X2tleV9mZCk7Ci0JZGlyZWN0X3JlbF9mZCA9IC0xOwotCWRpcmVjdF9hYnNfZmQgPSAtMTsKLQlkaXJlY3RfYnRuX2ZkID0gLTE7Ci0JZGlyZWN0X2tleV9mZCA9IC0xOwotI2VuZGlmCi19Ci0KLS8qIAotZ3JlcCBCVVNfIC91c3IvaW5jbHVkZS9saW51eC9pbnB1dC5oIHwgYXdrICd7cHJpbnQgJDJ9JyB8IHBlcmwgLWUgJ3doaWxlICg8Pikge2Nob21wOyBwcmludCAiI2lmZGVmICRfXG5cdFx0aWYoIXN0cmNtcChzLCBcIiRfXCIpKVx0dWRldi5pZC5idXN0eXBlID0gJF9cbiNlbmRpZlxuIn0nCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2J1c3R5cGUoY2hhciAqcykgewotI2lmZGVmIFVJTlBVVF9PSwotCi0JaWYgKCFzKSByZXR1cm4gMDsKLQotI2lmZGVmIEJVU19QQ0kKLQlpZighc3RyY21wKHMsICJCVVNfUENJIikpCXJldHVybiBCVVNfUENJOwotI2VuZGlmCi0jaWZkZWYgQlVTX0lTQVBOUAotCWlmKCFzdHJjbXAocywgIkJVU19JU0FQTlAiKSkJcmV0dXJuIEJVU19JU0FQTlA7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfVVNCCi0JaWYoIXN0cmNtcChzLCAiQlVTX1VTQiIpKQlyZXR1cm4gQlVTX1VTQjsKLSNlbmRpZgotI2lmZGVmIEJVU19ISUwKLQlpZighc3RyY21wKHMsICJCVVNfSElMIikpCXJldHVybiBCVVNfSElMOwotI2VuZGlmCi0jaWZkZWYgQlVTX0JMVUVUT09USAotCWlmKCFzdHJjbXAocywgIkJVU19CTFVFVE9PVEgiKSkJcmV0dXJuIEJVU19CTFVFVE9PVEg7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfVklSVFVBTAotCWlmKCFzdHJjbXAocywgIkJVU19WSVJUVUFMIikpCXJldHVybiBCVVNfVklSVFVBTDsKLSNlbmRpZgotI2lmZGVmIEJVU19JU0EKLQlpZighc3RyY21wKHMsICJCVVNfSVNBIikpCXJldHVybiBCVVNfSVNBOwotI2VuZGlmCi0jaWZkZWYgQlVTX0k4MDQyCi0JaWYoIXN0cmNtcChzLCAiQlVTX0k4MDQyIikpCXJldHVybiBCVVNfSTgwNDI7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfWFRLQkQKLQlpZighc3RyY21wKHMsICJCVVNfWFRLQkQiKSkJcmV0dXJuIEJVU19YVEtCRDsKLSNlbmRpZgotI2lmZGVmIEJVU19SUzIzMgotCWlmKCFzdHJjbXAocywgIkJVU19SUzIzMiIpKQlyZXR1cm4gQlVTX1JTMjMyOwotI2VuZGlmCi0jaWZkZWYgQlVTX0dBTUVQT1JUCi0JaWYoIXN0cmNtcChzLCAiQlVTX0dBTUVQT1JUIikpCXJldHVybiBCVVNfR0FNRVBPUlQ7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfUEFSUE9SVAotCWlmKCFzdHJjbXAocywgIkJVU19QQVJQT1JUIikpCXJldHVybiBCVVNfUEFSUE9SVDsKLSNlbmRpZgotI2lmZGVmIEJVU19BTUlHQQotCWlmKCFzdHJjbXAocywgIkJVU19BTUlHQSIpKQlyZXR1cm4gQlVTX0FNSUdBOwotI2VuZGlmCi0jaWZkZWYgQlVTX0FEQgotCWlmKCFzdHJjbXAocywgIkJVU19BREIiKSkJcmV0dXJuIEJVU19BREI7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfSTJDCi0JaWYoIXN0cmNtcChzLCAiQlVTX0kyQyIpKQlyZXR1cm4gQlVTX0kyQzsKLSNlbmRpZgotI2lmZGVmIEJVU19IT1NUCi0JaWYoIXN0cmNtcChzLCAiQlVTX0hPU1QiKSkJcmV0dXJuIEJVU19IT1NUOwotI2VuZGlmCi0jaWZkZWYgQlVTX0dTQwotCWlmKCFzdHJjbXAocywgIkJVU19HU0MiKSkJcmV0dXJuIEJVU19HU0M7Ci0jZW5kaWYKLSNpZmRlZiBCVVNfQVRBUkkKLQlpZighc3RyY21wKHMsICJCVVNfQVRBUkkiKSkJcmV0dXJuIEJVU19BVEFSSTsKLSNlbmRpZgotCWlmIChhdG9pKHMpID4gMCkgewotCQlyZXR1cm4gYXRvaShzKTsKLQl9Ci0KLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBsb2FkX3RzbGliX2NhbCh2b2lkKSB7Ci0JRklMRSAqZjsKLQljaGFyIGxpbmVbMTAyNF0sICpwOwotCWludCBpOwotCi0JLyogL2V0Yy9wb2ludGVyY2FsIC01MjggMzM0MDggLTM0MTc1MTYgLTQ0MjAwIDQwOCA0MDI5MjAyOCA1NjU0MSAqLwotCi0JLyogdGhpcyBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb246ICovCi0JYVswXSA9IDEuMDsKLQlhWzFdID0gMC4wOwotCWFbMl0gPSAwLjA7Ci0JYVszXSA9IDAuMDsKLQlhWzRdID0gMS4wOwotCWFbNV0gPSAwLjA7Ci0JYVs2XSA9IDEuMDsKLQotCWlmICh0c2xpYl9jYWwgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCi0JcmZiTG9nKCJsb2FkX3RzbGliX2NhbDogcmVhZGluZyAlc1xuIiwgdHNsaWJfY2FsKTsKLQlmID0gZm9wZW4odHNsaWJfY2FsLCAiciIpOwotCWlmIChmID09IE5VTEwpIHsKLQkJcmZiTG9nUGVycm9yKCJsb2FkX3RzbGliX2NhbDogZm9wZW4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQlpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSA9PSBOVUxMKSB7Ci0JCXJmYkxvZ1BlcnJvcigibG9hZF90c2xpYl9jYWw6IGZnZXRzIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWZjbG9zZShmKTsKLQotCXAgPSBzdHJ0b2sobGluZSwgIiBcdCIpOwotCWkgPSAwOwotCXdoaWxlIChwKSB7Ci0JCWFbaV0gPSAoZG91YmxlKSBhdG9pKHApOwotCQlyZmJMb2coImxvYWRfdHNsaWJfY2FsOiBhWyVkXSAlLjNmXG4iLCBpLCBhW2ldKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiIFx0Iik7Ci0JCWkrKzsKLQkJaWYgKGkgPj0gNykgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgIT0gNykgewotCQlyZmJMb2coImxvYWRfdHNsaWJfY2FsOiBpbnZhbGlkIHRzbGliIGZpbGUgZm9ybWF0OiBpPSVkICVzXG4iLAotCQkgICAgaSwgdHNsaWJfY2FsKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci19Ci0KLQotaW50IGluaXRpYWxpemVfdWlucHV0KHZvaWQpIHsKLSNpZm5kZWYgVUlOUFVUX09LCi0JcmV0dXJuIDA7Ci0jZWxzZQotCWludCBpOwotCWNoYXIgKnM7Ci0Jc3RydWN0IHVpbnB1dF91c2VyX2RldiB1ZGV2OwotCi0JaWYgKGZkID49IDApIHsKLQkJc2h1dGRvd25fdWlucHV0KCk7Ci0JfQotCWZkID0gLTE7Ci0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfVUlOUFVUX0RFQlVHIikpIHsKLQkJZGIgPSBhdG9pKGdldGVudigiWDExVk5DX1VJTlBVVF9ERUJVRyIpKTsKLQkJcmZiTG9nKCJzZXQgdWlucHV0IGRlYnVnIHRvOiAlZFxuIiwgZGIpOwotCX0KLQotCWlmICh0c2xpYl9jYWwpIHsKLQkJbG9hZF90c2xpYl9jYWwoKTsJCi0JfQotCi0JaW5pdF9rZXlfdHJhY2tlcigpOwotCQotCWlmICh1aW5wdXRfZGV2KSB7Ci0JCWlmICghc3RyY21wKHVpbnB1dF9kZXYsICJub3VpbnB1dCIpKSB7Ci0JCQlyZmJMb2coImluaXRpYWxpemVfdWlucHV0OiBub3QgY3JlYXRpbmcgdWlucHV0IGRldmljZS5cbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSB7Ci0JCQlmZCA9IG9wZW4odWlucHV0X2RldiwgT19XUk9OTFkgfCBPX05ERUxBWSk7Ci0JCQlyZmJMb2coImluaXRpYWxpemVfdWlucHV0OiB1c2luZzogJXMgJWRcbiIsIHVpbnB1dF9kZXYsIGZkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWkgPSAwOwotCQl3aGlsZSAoZGV2c1tpXSAhPSBOVUxMKSB7Ci0JCQlpZiAoIChmZCA9IG9wZW4oZGV2c1tpXSwgT19XUk9OTFkgfCBPX05ERUxBWSkpID49IDApIHsKLQkJCQlyZmJMb2coImluaXRpYWxpemVfdWlucHV0OiB1c2luZzogJXMgJWRcbiIsCi0JCQkJICAgIGRldnNbaV0sIGZkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCX0KLQlpZiAoZmQgPCAwKSB7Ci0JCXJmYkxvZygiaW5pdGlhbGl6ZV91aW5wdXQ6IGNvdWxkIG5vdCBvcGVuIGFuIHVpbnB1dCBkZXZpY2UuXG4iKTsKLQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JCWlmIChkaXJlY3RfcmVsX2ZkIDwgMCAmJiBkaXJlY3RfYWJzX2ZkIDwgMCAmJiBkaXJlY3RfYnRuX2ZkIDwgMCAmJiBkaXJlY3Rfa2V5X2ZkIDwgMCkgewotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQltZW1zZXQoJnVkZXYsIDAsIHNpemVvZih1ZGV2KSk7Ci0KLQlzdHJuY3B5KHVkZXYubmFtZSwgIngxMXZuYyBpbmplY3RvciIsIFVJTlBVVF9NQVhfTkFNRV9TSVpFKTsKLQotCXMgPSBnZXRlbnYoIlgxMVZOQ19VSU5QVVRfQlVTIik7Ci0JaWYgKHMpIHsKLQkJdWRldi5pZC5idXN0eXBlID0gZ2V0X2J1c3R5cGUocyk7Ci0JfSBlbHNlIGlmICgwKSB7Ci0JCXVkZXYuaWQuYnVzdHlwZSA9IEJVU19VU0I7Ci0JfQotCi0JcyA9IGdldGVudigiWDExVk5DX1VJTlBVVF9WRVJTSU9OIik7Ci0JaWYgKHMpIHsKLQkJdWRldi5pZC52ZXJzaW9uID0gYXRvaShzKTsKLQl9IGVsc2UgaWYgKDApIHsKLQkJdWRldi5pZC52ZXJzaW9uID0gNDsKLQl9Ci0KLQlpb2N0bChmZCwgVUlfU0VUX0VWQklULCBFVl9SRUwpOwotCWlvY3RsKGZkLCBVSV9TRVRfUkVMQklULCBSRUxfWCk7Ci0JaW9jdGwoZmQsIFVJX1NFVF9SRUxCSVQsIFJFTF9ZKTsKLQotCWlvY3RsKGZkLCBVSV9TRVRfRVZCSVQsIEVWX0tFWSk7Ci0KLQlpb2N0bChmZCwgVUlfU0VUX0VWQklULCBFVl9TWU4pOwotCi0JZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgewotCQlpb2N0bChmZCwgVUlfU0VUX0tFWUJJVCwgaSk7Ci0JfQotCi0JaW9jdGwoZmQsIFVJX1NFVF9LRVlCSVQsIEJUTl9NT1VTRSk7Ci0JaW9jdGwoZmQsIFVJX1NFVF9LRVlCSVQsIEJUTl9MRUZUKTsKLQlpb2N0bChmZCwgVUlfU0VUX0tFWUJJVCwgQlROX01JRERMRSk7Ci0JaW9jdGwoZmQsIFVJX1NFVF9LRVlCSVQsIEJUTl9SSUdIVCk7Ci0JaW9jdGwoZmQsIFVJX1NFVF9LRVlCSVQsIEJUTl9GT1JXQVJEKTsKLQlpb2N0bChmZCwgVUlfU0VUX0tFWUJJVCwgQlROX0JBQ0spOwotCi0JaWYgKHVpbnB1dF90b3VjaHNjcmVlbikgewotCQlpb2N0bChmZCwgVUlfU0VUX0tFWUJJVCwgQlROX1RPVUNIKTsKLQkJcmZiTG9nKCJ1aW5wdXQ6IHRvdWNoc2NyZWVuIGVuYWJsZWQuXG4iKTsKLQl9Ci0JaWYgKHVpbnB1dF90b3VjaHNjcmVlbiB8fCB1aW5wdXRfYWJzKSB7Ci0JCWludCBndyA9IGFic194LCBnaCA9IGFic195OwotCQlpZiAoISBndyB8fCAhIGdoKSB7Ci0JCQlndyA9IGZiX3g7IGdoID0gZmJfeTsKLQkJfQotCQlpZiAoISBndyB8fCAhIGdoKSB7Ci0JCQlndyA9IGRweV94OyBnaCA9IGRweV95OwotCQl9Ci0JCWFic194ID0gZ3c7Ci0JCWFic195ID0gZ2g7Ci0JCWlvY3RsKGZkLCBVSV9TRVRfRVZCSVQsIEVWX0FCUyk7Ci0JCWlvY3RsKGZkLCBVSV9TRVRfQUJTQklULCBBQlNfWCk7Ci0JCWlvY3RsKGZkLCBVSV9TRVRfQUJTQklULCBBQlNfWSk7Ci0JCXVkZXYuYWJzbWluW0FCU19YXSA9IDA7Ci0JCXVkZXYuYWJzbWF4W0FCU19YXSA9IGd3OwotCQl1ZGV2LmFic2Z1enpbQUJTX1hdID0gMDsKLQkJdWRldi5hYnNmbGF0W0FCU19YXSA9IDA7Ci0JCXVkZXYuYWJzbWluW0FCU19ZXSA9IDA7Ci0JCXVkZXYuYWJzbWF4W0FCU19ZXSA9IGdoOwotCQl1ZGV2LmFic2Z1enpbQUJTX1ldID0gMDsKLQkJdWRldi5hYnNmbGF0W0FCU19ZXSA9IDA7Ci0JCXJmYkxvZygidWlucHV0OiBhYnNvbHV0ZSBwb2ludGVyIGVuYWJsZWQgYXQgJWR4JWQuXG4iLCBhYnNfeCwgYWJzX3kpOwotCQlzZXRfdWlucHV0X2FjY2VsX3h5KDEuMCwgMS4wKTsKLQl9Ci0KLQlpZiAoZGIpIHsKLQkJcmZiTG9nKCIgICB1ZGV2Lm5hbWU6ICAgICAgICAgICAgICVzXG4iLCB1ZGV2Lm5hbWUpOwotCQlyZmJMb2coIiAgIHVkZXYuaWQuYnVzdHlwZTogICAgICAgJWRcbiIsIHVkZXYuaWQuYnVzdHlwZSk7Ci0JCXJmYkxvZygiICAgdWRldi5pZC52ZW5kb3I6ICAgICAgICAlZFxuIiwgdWRldi5pZC52ZW5kb3IpOwotCQlyZmJMb2coIiAgIHVkZXYuaWQucHJvZHVjdDogICAgICAgJWRcbiIsIHVkZXYuaWQucHJvZHVjdCk7Ci0JCXJmYkxvZygiICAgdWRldi5pZC52ZXJzaW9uOiAgICAgICAlZFxuIiwgdWRldi5pZC52ZXJzaW9uKTsKLQkJcmZiTG9nKCIgICB1ZGV2LmZmX2VmZmVjdHNfbWF4OiAgICVkXG4iLCB1ZGV2LmZmX2VmZmVjdHNfbWF4KTsKLQkJcmZiTG9nKCIgICB1ZGV2LmFic21pbltBQlNfWF06ICAgICVkXG4iLCB1ZGV2LmFic21pbltBQlNfWF0pOwotCQlyZmJMb2coIiAgIHVkZXYuYWJzbWF4W0FCU19YXTogICAgJWRcbiIsIHVkZXYuYWJzbWF4W0FCU19YXSk7Ci0JCXJmYkxvZygiICAgdWRldi5hYnNmdXp6W0FCU19YXTogICAlZFxuIiwgdWRldi5hYnNmdXp6W0FCU19YXSk7Ci0JCXJmYkxvZygiICAgdWRldi5hYnNmbGF0W0FCU19YXTogICAlZFxuIiwgdWRldi5hYnNmbGF0W0FCU19YXSk7Ci0JCXJmYkxvZygiICAgdWRldi5hYnNtaW5bQUJTX1ldOiAgICAlZFxuIiwgdWRldi5hYnNtaW5bQUJTX1ldKTsKLQkJcmZiTG9nKCIgICB1ZGV2LmFic21heFtBQlNfWV06ICAgICVkXG4iLCB1ZGV2LmFic21heFtBQlNfWV0pOwotCQlyZmJMb2coIiAgIHVkZXYuYWJzZnV6eltBQlNfWV06ICAgJWRcbiIsIHVkZXYuYWJzZnV6eltBQlNfWV0pOwotCQlyZmJMb2coIiAgIHVkZXYuYWJzZmxhdFtBQlNfWV06ICAgJWRcbiIsIHVkZXYuYWJzZmxhdFtBQlNfWV0pOwotCX0KLQotCXdyaXRlKGZkLCAmdWRldiwgc2l6ZW9mKHVkZXYpKTsKLQotCWlmIChpb2N0bChmZCwgVUlfREVWX0NSRUFURSkgIT0gMCkgewotCQlyZmJMb2coImlvY3RsKGZkLCBVSV9ERVZfQ1JFQVRFKSBmYWlsZWQuXG4iKTsKLQkJcmZiTG9nUGVycm9yKCJpb2N0bCIpOwotCQljbG9zZShmZCk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCXJldHVybiAxOwotI2VuZGlmCi19Ci0KLS8qIHRoZXNlIGRlZmF1bHRzIGFyZSBiYXNlZCBvbiBxdC1lbWJlZGRlZCA3LzIwMDYgKi8KLXN0YXRpYyBkb3VibGUgZnVkZ2VfeCA9IDAuNTsJLyogYWNjZWw9Mi4wICovCi1zdGF0aWMgZG91YmxlIGZ1ZGdlX3kgPSAwLjU7Ci0KLXN0YXRpYyBpbnQgdGhyZXNoID0gNTsKLXN0YXRpYyBpbnQgdGhyZXNoX29yID0gMTsKLQotc3RhdGljIGRvdWJsZSByZXNpZF94ID0gMC4wOwotc3RhdGljIGRvdWJsZSByZXNpZF95ID0gMC4wOwotCi1zdGF0aWMgZG91YmxlIHplcm9fZGVsYXkgPSAwLjE1Owotc3RhdGljIGRvdWJsZSBsYXN0X2J1dHRvbl9jbGljayA9IDAuMDsKLQotc3RhdGljIGludCB1aW5wdXRfYWx3YXlzID0gMDsKLQotc3RhdGljIHZvaWQgc2V0X3VpbnB1dF9hY2NlbF94eShkb3VibGUgZngsIGRvdWJsZSBmeSkgewotCWZ1ZGdlX3ggPSAxLjAvZng7Ci0JZnVkZ2VfeSA9IDEuMC9meTsKLQlyZmJMb2coInNldF91aW5wdXRfYWNjZWw6ICBmeD0lLjVmIGZ5PSUuNWZcbiIsIGZ4LCBmeSk7Ci0JcmZiTG9nKCJzZXRfdWlucHV0X2FjY2VsOiAgaXg9JS41ZiBpeT0lLjVmXG4iLCBmdWRnZV94LCBmdWRnZV95KTsKLX0KLQotc3RhdGljIGNoYXIgKnVpbnB1dF9hY2NlbF9zdHIgPSBOVUxMOwotc3RhdGljIGNoYXIgKnVpbnB1dF90aHJlc2hfc3RyID0gTlVMTDsKLQotaW50IHNldF91aW5wdXRfYWNjZWwoY2hhciAqc3RyKSB7Ci0JZG91YmxlIGZ4LCBmeTsKLQlyZmJMb2coInNldF91aW5wdXRfYWNjZWw6IHN0cj0lc1xuIiwgc3RyKTsKLQlpZiAoc3NjYW5mKHN0ciwgIiVsZislbGYiLCAmZngsICZmeSkgPT0gMikgewotCQlzZXRfdWlucHV0X2FjY2VsX3h5KGZ4LCBmeSk7Ci0JfSBlbHNlIGlmIChzc2NhbmYoc3RyLCAiJWxmIiwgJmZ4KSA9PSAxKSB7Ci0JCXNldF91aW5wdXRfYWNjZWxfeHkoZngsIGZ4KTsKLQl9IGVsc2UgewotCQlyZmJMb2coImludmFsaWQgVUlOUFVUIGFjY2VsPSBvcHRpb246ICVzXG4iLCBzdHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVpbnB1dF9hY2NlbF9zdHIpIHsKLQkJZnJlZSh1aW5wdXRfYWNjZWxfc3RyKTsKLQl9Ci0JdWlucHV0X2FjY2VsX3N0ciA9IHN0cmR1cChzdHIpOwotCXJldHVybiAxOwotfQotCi1pbnQgc2V0X3VpbnB1dF90aHJlc2goY2hhciAqc3RyKSB7Ci0JcmZiTG9nKCJzZXRfdWlucHV0X3RocmVzaDogc3RyPSVzXG4iLCBzdHIpOwotCWlmIChzdHJbMF0gPT0gJysnKSB7Ci0JCXRocmVzaF9vciA9IDA7Ci0JfQotCXRocmVzaCA9IGF0b2koc3RyKTsKLQlpZiAodWlucHV0X3RocmVzaF9zdHIpIHsKLQkJZnJlZSh1aW5wdXRfdGhyZXNoX3N0cik7Ci0JfQotCXVpbnB1dF90aHJlc2hfc3RyID0gc3RyZHVwKHN0cik7Ci0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgc2V0X3VpbnB1dF9yZXNldChpbnQgbXMpIHsKLQl6ZXJvX2RlbGF5ID0gKGRvdWJsZSkgbXMvMTAwMC47Ci0JcmZiTG9nKCJzZXRfdWlucHV0X3Jlc2V0OiAlZFxuIiwgbXMpOwotfQotCi12b2lkIHNldF91aW5wdXRfYWx3YXlzKGludCBhKSB7Ci0JdWlucHV0X2Fsd2F5cyA9IGE7Ci19Ci0KLXZvaWQgc2V0X3VpbnB1dF90b3VjaHNjcmVlbihpbnQgYikgewotCXVpbnB1dF90b3VjaHNjcmVlbiA9IGI7Ci19Ci0KLXZvaWQgc2V0X3VpbnB1dF9hYnMoaW50IGIpIHsKLQl1aW5wdXRfYWJzID0gYjsKLX0KLQotY2hhciAqZ2V0X3VpbnB1dF9hY2NlbCh2b2lkKSB7Ci0JcmV0dXJuIHVpbnB1dF9hY2NlbF9zdHI7Ci19Ci1jaGFyICpnZXRfdWlucHV0X3RocmVzaCh2b2lkKSB7Ci0JcmV0dXJuIHVpbnB1dF90aHJlc2hfc3RyOwotfQotaW50IGdldF91aW5wdXRfcmVzZXQodm9pZCkgewotCXJldHVybiAoaW50KSAoMTAwMCAqIHplcm9fZGVsYXkpOwotfQotCi1pbnQgZ2V0X3VpbnB1dF9hbHdheXModm9pZCkgewotCXJldHVybiB1aW5wdXRfYWx3YXlzOwotfQotCi1pbnQgZ2V0X3VpbnB1dF90b3VjaHNjcmVlbih2b2lkKSB7Ci0JcmV0dXJuIHVpbnB1dF90b3VjaHNjcmVlbjsKLX0KLQotaW50IGdldF91aW5wdXRfYWJzKHZvaWQpIHsKLQlyZXR1cm4gdWlucHV0X2FiczsKLX0KLQotdm9pZCBwYXJzZV91aW5wdXRfc3RyKGNoYXIgKmluKSB7Ci0JY2hhciAqcCwgKnEsICpzdHIgPSBzdHJkdXAoaW4pOwotCi0JaWYgKGluamVjdGFibGUpIHsKLQkJZnJlZShpbmplY3RhYmxlKTsKLQkJaW5qZWN0YWJsZSA9IHN0cmR1cCgiS01CIik7Ci0JfQotCi0JdWlucHV0X3RvdWNoc2NyZWVuID0gMDsKLQl1aW5wdXRfYWJzID0gMDsKLQlhYnNfeCA9IGFic195ID0gMDsKLQotCWlmICh0c2xpYl9jYWwpIHsKLQkJZnJlZSh0c2xpYl9jYWwpOwotCQl0c2xpYl9jYWwgPSBOVUxMOwotCX0KLQotCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCXdoaWxlIChwKSB7Ci0JCWlmIChwWzBdID09ICcvJykgewotCQkJaWYgKHVpbnB1dF9kZXYpIHsKLQkJCQlmcmVlKHVpbnB1dF9kZXYpOwotCQkJfQotCQkJdWlucHV0X2RldiA9IHN0cmR1cChwKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgIm5vdWlucHV0IikgPT0gcCkgewotCQkJaWYgKHVpbnB1dF9kZXYpIHsKLQkJCQlmcmVlKHVpbnB1dF9kZXYpOwotCQkJfQotCQkJdWlucHV0X2RldiA9IHN0cmR1cChwKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImFjY2VsPSIpID09IHApIHsKLQkJCXEgPSBwICsgc3RybGVuKCJhY2NlbD0iKTsKLQkJCWlmICghIHNldF91aW5wdXRfYWNjZWwocSkpIHsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAidGhyZXNoPSIpID09IHApIHsKLQkJCXEgPSBwICsgc3RybGVuKCJ0aHJlc2g9Iik7Ci0JCQlzZXRfdWlucHV0X3RocmVzaChxKTsKLQotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAicmVzZXQ9IikgPT0gcCkgewotCQkJaW50IG4gPSBhdG9pKHAgKyBzdHJsZW4oInJlc2V0PSIpKTsKLQkJCXNldF91aW5wdXRfcmVzZXQobik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJhbHdheXM9IikgPT0gcCkgewotCQkJaW50IG4gPSBhdG9pKHAgKyBzdHJsZW4oImFsd2F5cz0iKSk7Ci0JCQlzZXRfdWlucHV0X2Fsd2F5cyhuKTsKLQkJfSBlbHNlIGlmIChzdHJwYnJrKHAsICJLTUIiKSA9PSBwKSB7Ci0JCQlpZiAoaW5qZWN0YWJsZSkgewotCQkJCWZyZWUoaW5qZWN0YWJsZSk7Ci0JCQl9Ci0JCQlpbmplY3RhYmxlID0gc3RyZHVwKHApOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAidG91Y2hfYWx3YXlzPSIpID09IHApIHsKLQkJCXRvdWNoX2Fsd2F5cyA9IGF0b2kocCArIHN0cmxlbigidG91Y2hfYWx3YXlzPSIpKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImJ0bl90b3VjaD0iKSA9PSBwKSB7Ci0JCQlidG5fdG91Y2ggPSBhdG9pKHAgKyBzdHJsZW4oImJ0bl90b3VjaD0iKSk7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJkcmFnc2tpcD0iKSA9PSBwKSB7Ci0JCQlkcmFnc2tpcCA9IGF0b2kocCArIHN0cmxlbigiZHJhZ3NraXA9IikpOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAidG91Y2giKSA9PSBwKSB7Ci0JCQlpbnQgZ3csIGdoOwotCQkJcSA9IHN0cmNocihwLCAnPScpOwotCQkJc2V0X3VpbnB1dF90b3VjaHNjcmVlbigxKTsKLQkJCXNldF91aW5wdXRfYWJzKDEpOwotCQkJaWYgKHEgJiYgc3NjYW5mKHErMSwgIiVkeCVkIiwgJmd3LCAmZ2gpID09IDIpIHsKLQkJCQlhYnNfeCA9IGd3OwotCQkJCWFic195ID0gZ2g7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJhYnMiKSA9PSBwKSB7Ci0JCQlpbnQgZ3csIGdoOwotCQkJcSA9IHN0cmNocihwLCAnPScpOwotCQkJc2V0X3VpbnB1dF9hYnMoMSk7Ci0JCQlpZiAocSAmJiBzc2NhbmYocSsxLCAiJWR4JWQiLCAmZ3csICZnaCkgPT0gMikgewotCQkJCWFic194ID0gZ3c7Ci0JCQkJYWJzX3kgPSBnaDsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInByZXNzdXJlPSIpID09IHApIHsKLQkJCXRvdWNoX3ByZXNzdXJlID0gYXRvaShwICsgc3RybGVuKCJwcmVzc3VyZT0iKSk7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJkaXJlY3RfcmVsPSIpID09IHApIHsKLQkJCWRpcmVjdF9yZWxfZmQgPSBvcGVuKHArc3RybGVuKCJkaXJlY3RfcmVsPSIpLCBPX1dST05MWSk7Ci0JCQlpZiAoZGlyZWN0X3JlbF9mZCA8IDApIHsKLQkJCQlyZmJMb2dQZXJyb3IoInVpbnB1dDogZGlyZWN0X3JlbCBvcGVuIik7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygidWlucHV0OiBvcGVuZWQ6ICVzIGZkPSVkXG4iLCBwLCBkaXJlY3RfcmVsX2ZkKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImRpcmVjdF9hYnM9IikgPT0gcCkgewotCQkJZGlyZWN0X2Fic19mZCA9IG9wZW4ocCtzdHJsZW4oImRpcmVjdF9hYnM9IiksIE9fV1JPTkxZKTsKLQkJCWlmIChkaXJlY3RfYWJzX2ZkIDwgMCkgewotCQkJCXJmYkxvZ1BlcnJvcigidWlucHV0OiBkaXJlY3RfYWJzIG9wZW4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJ1aW5wdXQ6IG9wZW5lZDogJXMgZmQ9JWRcbiIsIHAsIGRpcmVjdF9hYnNfZmQpOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiZGlyZWN0X2J0bj0iKSA9PSBwKSB7Ci0JCQlkaXJlY3RfYnRuX2ZkID0gb3BlbihwK3N0cmxlbigiZGlyZWN0X2J0bj0iKSwgT19XUk9OTFkpOwotCQkJaWYgKGRpcmVjdF9idG5fZmQgPCAwKSB7Ci0JCQkJcmZiTG9nUGVycm9yKCJ1aW5wdXQ6IGRpcmVjdF9idG4gb3BlbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coInVpbnB1dDogb3BlbmVkOiAlcyBmZD0lZFxuIiwgcCwgZGlyZWN0X2J0bl9mZCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJkaXJlY3Rfa2V5PSIpID09IHApIHsKLQkJCWRpcmVjdF9rZXlfZmQgPSBvcGVuKHArc3RybGVuKCJkaXJlY3Rfa2V5PSIpLCBPX1dST05MWSk7Ci0JCQlpZiAoZGlyZWN0X2tleV9mZCA8IDApIHsKLQkJCQlyZmJMb2dQZXJyb3IoInVpbnB1dDogZGlyZWN0X2tleSBvcGVuIik7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygidWlucHV0OiBvcGVuZWQ6ICVzIGZkPSVkXG4iLCBwLCBkaXJlY3Rfa2V5X2ZkKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInRzbGliX2NhbD0iKSA9PSBwKSB7Ci0JCQl0c2xpYl9jYWwgPSBzdHJkdXAocCtzdHJsZW4oInRzbGliX2NhbD0iKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coImludmFsaWQgVUlOUFVUIG9wdGlvbjogJXNcbiIsIHApOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQgcHRyX21vdmUoaW50IGR4LCBpbnQgZHkpIHsKLSNpZmRlZiBVSU5QVVRfT0sKLQlzdHJ1Y3QgaW5wdXRfZXZlbnQgZXY7Ci0JaW50IGQgPSBkaXJlY3RfcmVsX2ZkIDwgMCA/IGZkIDogZGlyZWN0X3JlbF9mZDsKLQotCWlmIChpbmplY3RhYmxlICYmIHN0cmNocihpbmplY3RhYmxlLCAnTScpID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInB0cl9tb3ZlKCVkLCAlZCkgZmQ9JWRcbiIsIGR4LCBkeSwgZCk7Ci0KLQlnZXR0aW1lb2ZkYXkoJmV2LnRpbWUsIE5VTEwpOwotCWV2LnR5cGUgPSBFVl9SRUw7Ci0JZXYuY29kZSA9IFJFTF9ZOwotCWV2LnZhbHVlID0gZHk7Ci0Jd3JpdGUoZCwgJmV2LCBzaXplb2YoZXYpKTsKLQotCWV2LnR5cGUgPSBFVl9SRUw7Ci0JZXYuY29kZSA9IFJFTF9YOwotCWV2LnZhbHVlID0gZHg7Ci0Jd3JpdGUoZCwgJmV2LCBzaXplb2YoZXYpKTsKLQotCWV2LnR5cGUgPSBFVl9TWU47Ci0JZXYuY29kZSA9IFNZTl9SRVBPUlQ7Ci0JZXYudmFsdWUgPSAwOwotCXdyaXRlKGQsICZldiwgc2l6ZW9mKGV2KSk7Ci0jZWxzZQotCWlmICghZHggfHwgIWR5KSB7fQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGFwcGx5X3RzbGliKGludCAqeCwgaW50ICp5KSB7Ci0JZG91YmxlIHgxID0gKngsIHkxID0gKnksIHgyLCB5MjsKLQotCS8qIHRoaXMgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHRzbGliIGxpbmVhciB0cmFuc2Zvcm06ICovCi0JeDIgPSAoYVs0XSAqIChhWzZdICogeDEgLSBhWzJdKSAtIGFbMV0gKiAoYVs2XSAqIHkxIC0gYVs1XSkpLyhhWzRdKmFbMF0gLSBhWzFdKmFbM10pOwotCXkyID0gKGFbMF0gKiAoYVs2XSAqIHkxIC0gYVs1XSkgLSBhWzNdICogKGFbNl0gKiB4MSAtIGFbMl0pKS8oYVs0XSphWzBdIC0gYVsxXSphWzNdKTsKLQotCSp4ID0gKGludCkgeDI7Ci0JKnkgPSAoaW50KSB5MjsKLX0KLQkKLQotc3RhdGljIHZvaWQgcHRyX2FicyhpbnQgeCwgaW50IHksIGludCBwKSB7Ci0jaWZkZWYgVUlOUFVUX09LCi0Jc3RydWN0IGlucHV0X2V2ZW50IGV2OwotCWludCB4MCwgeTA7Ci0JaW50IGQgPSBkaXJlY3RfYWJzX2ZkIDwgMCA/IGZkIDogZGlyZWN0X2Fic19mZDsKLQotCWlmIChpbmplY3RhYmxlICYmIHN0cmNocihpbmplY3RhYmxlLCAnTScpID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwotCi0JeDAgPSB4OwotCXkwID0geTsKLQotCWlmICh0c2xpYl9jYWwpIHsKLQkJYXBwbHlfdHNsaWIoJngsICZ5KTsKLQl9Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicHRyX2FicyglZCwgJWQgPT4gJWQgJWQsIHA9JWQpIGZkPSVkXG4iLCB4MCwgeTAsIHgsIHksIHAsIGQpOwotCi0JZ2V0dGltZW9mZGF5KCZldi50aW1lLCBOVUxMKTsKLQlldi50eXBlID0gRVZfQUJTOwotCWV2LmNvZGUgPSBBQlNfWTsKLQlldi52YWx1ZSA9IHk7Ci0Jd3JpdGUoZCwgJmV2LCBzaXplb2YoZXYpKTsKLQotCWV2LnR5cGUgPSBFVl9BQlM7Ci0JZXYuY29kZSA9IEFCU19YOwotCWV2LnZhbHVlID0geDsKLQl3cml0ZShkLCAmZXYsIHNpemVvZihldikpOwotCi0JaWYgKHAgPj0gMCkgewotCQlldi50eXBlID0gRVZfQUJTOwotCQlldi5jb2RlID0gQUJTX1BSRVNTVVJFOwotCQlldi52YWx1ZSA9IHA7Ci0JCXdyaXRlKGQsICZldiwgc2l6ZW9mKGV2KSk7Ci0JfQotCi0JZXYudHlwZSA9IEVWX1NZTjsKLQlldi5jb2RlID0gU1lOX1JFUE9SVDsKLQlldi52YWx1ZSA9IDA7Ci0Jd3JpdGUoZCwgJmV2LCBzaXplb2YoZXYpKTsKLSNlbHNlCi0JaWYgKCF4IHx8ICF5KSB7fQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgaW5zaWRlX3RocmVzaChpbnQgZHgsIGludCBkeSwgaW50IHRocikgewotCWlmICh0aHJlc2hfb3IpIHsKLQkJLyogdGhpcyBpcyBwZWVraW5nIGF0IHF0LWVtYmVkZGVkIHFtb3VzZV9xd3MuY3BwICovCi0JCWlmIChuYWJzKGR4KSA8PSB0aHJlc2ggJiYgbmFicyhkeSkgPD0gdGhyKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIHRoaXMgaXMgcGVla2luZyBhdCB4ZnJlZS94b3JnIHhmODZYaW5wdXQuYyAqLwotCQlpZiAobmFicyhkeCkgKyBuYWJzKGR5KSA8IHRocikgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB0cl9yZWwoaW50IGR4LCBpbnQgZHkpIHsKLQlpbnQgZHhmLCBkeWYsIG54LCBueSwgazsKLQlpbnQgYWNjZWwsIHRocmVzaF9oaWdoLCB0aHJlc2hfbWlkOwotCWRvdWJsZSBmeCwgZnk7Ci0Jc3RhdGljIGludCB0cnlfdGhyZXNoZXMgPSAtMTsKLQotCWlmICh0cnlfdGhyZXNoZXMgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19VSU5QVVRfVEhSRVNIT0xEUyIpKSB7Ci0JCQl0cnlfdGhyZXNoZXMgPSAxOwotCQl9IGVsc2UgewotCQkJdHJ5X3RocmVzaGVzID0gMDsKLQkJfQotCX0KLQotCWlmICh0cnlfdGhyZXNoZXMpIHsKLQkJdGhyZXNoX2hpZ2ggPSAoaW50KSAoIChkb3VibGUpIHRocmVzaC9mdWRnZV94ICk7Ci0JCXRocmVzaF9taWQgPSAgKGludCkgKCAoZG91YmxlKSAodGhyZXNoICsgdGhyZXNoX2hpZ2gpIC8gMi4wICk7Ci0KLQkJaWYgKHRocmVzaF9taWQgPD0gdGhyZXNoKSB7Ci0JCQl0aHJlc2hfbWlkID0gdGhyZXNoICsgMTsKLQkJfQotCQlpZiAodGhyZXNoX2hpZ2ggPD0gdGhyZXNoX21pZCkgewotCQkJdGhyZXNoX2hpZ2ggPSB0aHJlc2hfbWlkICsgMTsKLQkJfQotCi0JCWlmIChpbnNpZGVfdGhyZXNoKGR4LCBkeSwgdGhyZXNoKSkgewotCQkJYWNjZWwgPSAwOwotCQl9IGVsc2UgewotCQkJYWNjZWwgPSAxOwotCQl9Ci0JCW54ID0gbmFicyhkeCk7Ci0JCW55ID0gbmFicyhkeSk7Ci0KLQl9IGVsc2UgewotCQlhY2NlbCA9IDE7Ci0JCXRocmVzaF9oaWdoID0gMDsKLQkJbnggPSBueSA9IDE7Ci0JfQotCi0JaWYgKGFjY2VsICYmIG54ICsgbnkgPiAwICkgewotCQlpZiAodGhyZXNoX2hpZ2ggPiAwICYmIGluc2lkZV90aHJlc2goZHgsIGR5LCB0aHJlc2hfaGlnaCkpIHsKLQkJCWRvdWJsZSBhbHBoYSwgdDsKLQkJCS8qIFhYWCAqLwotCQkJaWYgKDEgfHwgaW5zaWRlX3RocmVzaChkeCwgZHksIHRocmVzaF9taWQpKSB7Ci0JCQkJdCA9IHRocmVzaDsgCi0JCQkJYWNjZWwgPSAyOwotCQkJfSBlbHNlIHsKLQkJCQlhY2NlbCA9IDM7Ci0JCQkJdCA9IHRocmVzaF9oaWdoOwotCQkJfQotCQkJaWYgKHRocmVzaF9vcikgewotCQkJCWlmIChueCA+IG55KSB7Ci0JCQkJCWZ4ID0gdDsKLQkJCQkJZnkgPSAgKChkb3VibGUpIG55IC8gKGRvdWJsZSkgbngpICogdDsKLQkJCQl9IGVsc2UgewotCQkJCQlmeCA9ICAoKGRvdWJsZSkgbnggLyAoZG91YmxlKSBueSkgKiB0OwotCQkJCQlmeSA9IHQ7Ci0JCQkJfQotCQkJCWR4ZiA9IChpbnQpIGZ4OwotCQkJCWR5ZiA9IChpbnQpIGZ5OwotCQkJCWZ4ID0gZHg7Ci0JCQkJZnkgPSBkeTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHQgPiAxKSB7Ci0JCQkJCS8qIFhYWCAqLwotCQkJCQl0ID0gdCAtIDEuMDsKLQkJCQl9Ci0JCQkJYWxwaGEgPSB0LyhueCArIG55KTsKLQkJCQlmeCA9IGFscGhhICogZHg7Ci0JCQkJZnkgPSBhbHBoYSAqIGR5OwotCQkJCWR4ZiA9IChpbnQpIGZ4OwotCQkJCWR5ZiA9IChpbnQpIGZ5OwotCQkJCWZ4ID0gZHg7Ci0JCQkJZnkgPSBkeTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZ4ID0gZnVkZ2VfeCAqIChkb3VibGUpIGR4OwotCQkJZnkgPSBmdWRnZV95ICogKGRvdWJsZSkgZHk7Ci0JCQlkeGYgPSAoaW50KSBmeDsKLQkJCWR5ZiA9IChpbnQpIGZ5OwotCQl9Ci0JfSBlbHNlIHsKLQkJZnggPSBkeDsKLQkJZnkgPSBkeTsKLQkJZHhmID0gZHg7Ci0JCWR5ZiA9IGR5OwotCX0KLQotCWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAib2xkIGR4IGR5OiAlZCAlZFxuIiwgZHgsIGR5KTsKLQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIm5ldyBkeCBkeTogJWQgJWQgIGFjY2VsOiAlZFxuIiwgZHhmLCBkeWYsIGFjY2VsKTsKLQotCXB0cl9tb3ZlKGR4ZiwgZHlmKTsKLQotCXJlc2lkX3ggKz0gZnggLSBkeGY7Ci0JcmVzaWRfeSArPSBmeSAtIGR5ZjsKLQotCWZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKLQkJaWYgKHJlc2lkX3ggPD0gLTEuMCB8fCByZXNpZF94ID49IDEuMCB8fCByZXNpZF95IDw9IC0xLjAgfHwgcmVzaWRfeSA+PSAxLjApIHsKLQkJCWR4ZiA9IDA7Ci0JCQlkeWYgPSAwOwotCQkJaWYgKHJlc2lkX3ggPj0gMS4wKSB7Ci0JCQkJZHhmID0gKGludCkgcmVzaWRfeDsKLQkJCQlkeGYgPSAxOwotCQkJfSBlbHNlIGlmIChyZXNpZF94IDw9IC0xLjApICB7Ci0JCQkJZHhmID0gLSgoaW50KSAoLXJlc2lkX3gpKTsKLQkJCQlkeGYgPSAtMTsKLQkJCX0KLQkJCXJlc2lkX3ggLT0gZHhmOwotCQkJaWYgKHJlc2lkX3kgPj0gMS4wKSB7Ci0JCQkJZHlmID0gKGludCkgcmVzaWRfeTsKLQkJCQlkeWYgPSAxOwotCQkJfSBlbHNlIGlmIChyZXNpZF95IDw9IC0xLjApICB7Ci0JCQkJZHlmID0gLSgoaW50KSAoLXJlc2lkX3kpKTsKLQkJCQlkeWYgPSAtMTsKLQkJCX0KLQkJCXJlc2lkX3kgLT0gZHlmOwotCi0JCQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIiolcyByZXNpZDogZHggZHk6ICVkICVkICAlZiAlZlxuIiwgYWNjZWwgPiAxID8gIioiIDogIiAiLCBkeGYsIGR5ZiwgcmVzaWRfeCwgcmVzaWRfeSk7Ci1pZiAoMCkge3VzbGVlcCgxMDAqMTAwMCkgO30KLQkJCXB0cl9tb3ZlKGR4ZiwgZHlmKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnV0dG9uX2NsaWNrKGludCBkb3duLCBpbnQgYnRuKSB7Ci0jaWZkZWYgVUlOUFVUX09LCi0Jc3RydWN0IGlucHV0X2V2ZW50IGV2OwotCWludCBkID0gZGlyZWN0X2J0bl9mZCA8IDAgPyBmZCA6IGRpcmVjdF9idG5fZmQ7Ci0KLQlpZiAoaW5qZWN0YWJsZSAmJiBzdHJjaHIoaW5qZWN0YWJsZSwgJ0InKSA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYnV0dG9uX2NsaWNrOiBidG4gJWQgJXMgZmQ9JWRcbiIsIGJ0biwgZG93biA/ICJkb3duIiA6ICJ1cCIsIGQpOwotCi0JbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7Ci0JZ2V0dGltZW9mZGF5KCZldi50aW1lLCBOVUxMKTsKLQlldi50eXBlID0gRVZfS0VZOwotCWV2LnZhbHVlID0gZG93bjsKLQotCWlmICh1aW5wdXRfdG91Y2hzY3JlZW4pIHsKLQkJZXYuY29kZSA9IEJUTl9UT1VDSDsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNldCBjb2RlIHRvIEJUTl9UT1VDSFxuIik7Ci0JfSBlbHNlIGlmIChidG4gPT0gMSkgewotCQlldi5jb2RlID0gQlROX0xFRlQ7Ci0JfSBlbHNlIGlmIChidG4gPT0gMikgewotCQlldi5jb2RlID0gQlROX01JRERMRTsKLQl9IGVsc2UgaWYgKGJ0biA9PSAzKSB7Ci0JCWV2LmNvZGUgPSBCVE5fUklHSFQ7Ci0JfSBlbHNlIGlmIChidG4gPT0gNCkgewotCQlldi5jb2RlID0gQlROX0ZPUldBUkQ7Ci0JfSBlbHNlIGlmIChidG4gPT0gNSkgewotCQlldi5jb2RlID0gQlROX0JBQ0s7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuOwotCX0KLQotCXdyaXRlKGQsICZldiwgc2l6ZW9mKGV2KSk7Ci0KLQlldi50eXBlID0gRVZfU1lOOwotCWV2LmNvZGUgPSBTWU5fUkVQT1JUOwotCWV2LnZhbHVlID0gMDsKLQl3cml0ZShkLCAmZXYsIHNpemVvZihldikpOwotCi0JbGFzdF9idXR0b25fY2xpY2sgPSBkbm93KCk7Ci0jZWxzZQotCWlmICghZG93biB8fCAhYnRuKSB7fQotI2VuZGlmCi19Ci0KLQotdm9pZCB1aW5wdXRfcG9pbnRlcl9jb21tYW5kKGludCBtYXNrLCBpbnQgeCwgaW50IHksIHJmYkNsaWVudFB0ciBjbGllbnQpIHsKLQlzdGF0aWMgaW50IGxhc3RfeCA9IC0xLCBsYXN0X3kgPSAtMSwgbGFzdF9tYXNrID0gLTE7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3plcm8gPSAwLjA7Ci0JYWxsb3dlZF9pbnB1dF90IGlucHV0OwotCWludCBkb19yZXNldCwgcmVzZXRfbG93ZXJfcmlnaHQgPSAxOwotCWRvdWJsZSBub3c7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0KLQlpZiAoZmlyc3QpIHsKLQkJaWYgKGdldGVudigiUkVTRVRfQUxXQVlTIikpIHsKLQkJCXNldF91aW5wdXRfYWx3YXlzKDEpOwotCQl9IGVsc2UgewotCQkJc2V0X3VpbnB1dF9hbHdheXMoMCk7Ci0JCX0KLQl9Ci0JZmlyc3QgPSAwOwotCQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ1aW5wdXRfcG9pbnRlcl9jb21tYW5kOiAlZCAlZCAtICVkXG4iLCB4LCB5LCBtYXNrKTsKLQotCWlmICh2aWV3X29ubHkpIHsKLQkJcmV0dXJuOwotCX0KLQlnZXRfYWxsb3dlZF9pbnB1dChjbGllbnQsICZpbnB1dCk7Ci0KLQlub3cgPSBkbm93KCk7Ci0KLQlkb19yZXNldCA9IDE7Ci0JaWYgKG1hc2sgfHwgYm1hc2spIHsKLQkJZG9fcmVzZXQgPSAwOwkvKiBkbyBub3QgZG8gcmVzZXQgaWYgbW91c2UgYnV0dG9uIGRvd24gKi8KLQl9IGVsc2UgaWYgKCEgaW5wdXQubW90aW9uKSB7Ci0JCWRvX3Jlc2V0ID0gMDsKLQl9IGVsc2UgaWYgKG5vdyA8IGxhc3RfemVybyArIHplcm9fZGVsYXkpIHsKLQkJZG9fcmVzZXQgPSAwOwotCX0KLQlpZiAoZG9fcmVzZXQpIHsKLQkJaWYgKG1vZF9pc19kb3duKCkpIHsKLQkJCWRvX3Jlc2V0ID0gMDsKLQkJfSBlbHNlIGlmIChub3cgPCBsYXN0X2J1dHRvbl9jbGljayArIDAuMjUpIHsKLQkJCWRvX3Jlc2V0ID0gMDsKLQkJfQotCX0KLQotCWlmICh1aW5wdXRfYWx3YXlzICYmICFtYXNrICYmICFibWFzayAmJiBpbnB1dC5tb3Rpb24pIHsKLQkJZG9fcmVzZXQgPSAxOwotCX0KLQlpZiAodWlucHV0X2FicykgewotCQlkb19yZXNldCA9IDA7Ci0JfQotCi0JaWYgKGRvX3Jlc2V0KSB7Ci0JCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCi0JCWlmICh6ZXJvX2RlbGF5ID4gMC4wIHx8IGZpcnN0KSB7Ci0JCQkvKiB0cnkgdG8gcHVzaCBpdCB0byAwLDAgKi8KLQkJCWludCB0eCwgdHksIGJpZ2p1bXAgPSAxOwotCi0JCQlpZiAocmVzZXRfbG93ZXJfcmlnaHQpIHsKLQkJCQl0eCA9IGZ1ZGdlX3ggKiAoZHB5X3ggLSBsYXN0X3gpOwotCQkJCXR5ID0gZnVkZ2VfeSAqIChkcHlfeSAtIGxhc3RfeSk7Ci0JCQl9IGVsc2UgewotCQkJCXR4ID0gZnVkZ2VfeCAqIGxhc3RfeDsKLQkJCQl0eSA9IGZ1ZGdlX3kgKiBsYXN0X3k7Ci0JCQl9Ci0KLQkJCXR4ICs9IDUwOwotCQkJdHkgKz0gNTA7Ci0KLQkJCWlmIChiaWdqdW1wKSB7Ci0JCQkJaWYgKHJlc2V0X2xvd2VyX3JpZ2h0KSB7Ci0JCQkJCXB0cl9tb3ZlKDAsICt0eSk7Ci0JCQkJCXVzbGVlcCgyKjEwMDApOwotCQkJCQlwdHJfbW92ZSgrdHgsICt0eSk7Ci0JCQkJCXB0cl9tb3ZlKCt0eCwgK3R5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlwdHJfbW92ZSgwLCAtdHkpOwotCQkJCQl1c2xlZXAoMioxMDAwKTsKLQkJCQkJcHRyX21vdmUoLXR4LCAtdHkpOwotCQkJCQlwdHJfbW92ZSgtdHgsIC10eSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgaSwgc3RlcCwgbiA9IDIwOwotCQkJCXN0ZXAgPSBkcHlfeCAvIG47Ci0KLQkJCQlpZiAoc3RlcCA8IDEwMCkgc3RlcCA9IDEwMDsKLQotCQkJCWZvciAoaT0wOyBpIDwgbjsgaSsrKSAgewotCQkJCQlpZiAocmVzZXRfbG93ZXJfcmlnaHQpIHsKLQkJCQkJCXB0cl9tb3ZlKCtzdGVwLCArc3RlcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwdHJfbW92ZSgtc3RlcCwgLXN0ZXApOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoaT0wOyBpIDwgbjsgaSsrKSAgewotCQkJCQlpZiAocmVzZXRfbG93ZXJfcmlnaHQpIHsKLQkJCQkJCXB0cl9tb3ZlKCsxLCArMSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwdHJfbW92ZSgtMSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRiKSB7Ci0JCQkJaWYgKHJlc2V0X2xvd2VyX3JpZ2h0KSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAidWlucHV0X3BvaW50ZXJfY29tbWFuZDogcmVzZXQgLT4gKFcsSCkgKCVkLCVkKSAgWyVkLCVkXVxuIiwgeCwgeSwgdHgsIHR5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgInVpbnB1dF9wb2ludGVyX2NvbW1hbmQ6IHJlc2V0IC0+ICgwLDApICglZCwlZCkgIFslZCwlZF1cbiIsIHgsIHksIHR4LCB0eSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiByZXN0IGEgYml0IGZvciBzeXN0ZW0gdG8gYWJzb3JiIHRoZSBjaGFuZ2UgKi8KLQkJCWlmICh1aW5wdXRfYWx3YXlzKSB7Ci0JCQkJc3RhdGljIGRvdWJsZSBsYXN0X3NsZWVwID0gMC4wOwotCQkJCWRvdWJsZSBudyA9IGRub3coKSwgZGVsYXkgPSB6ZXJvX2RlbGF5OwotCQkJCWlmIChkZWxheSA8PSAwLjApIGRlbGF5ID0gMC4xOwotCQkJCWlmIChudyA+IGxhc3Rfc2xlZXAgKyBkZWxheSkgewotCQkJCQl1c2xlZXAoMTAqMTAwMCk7Ci0JCQkJCWxhc3Rfc2xlZXAgPSBudzsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2xlZXAoMSoxMDAwKTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGVsc2UgewotCQkJCXVzbGVlcCgzMCoxMDAwKTsKLQkJCX0KLQotCQkJLyogbm93IGp1bXAgYmFjayBvdXQgKi8KLQkJCWlmIChyZXNldF9sb3dlcl9yaWdodCkgewotCQkJCXB0cl9yZWwoeCAtIGRweV94LCB5IC0gZHB5X3kpOwotCQkJfSBlbHNlIHsKLQkJCQlwdHJfcmVsKHgsIHkpOwotCQkJfQotCQkJaWYgKDEpIHt1c2xlZXAoMTAqMTAwMCkgO30KLQotCQkJbGFzdF94ID0geDsKLQkJCWxhc3RfeSA9IHk7Ci0JCQlyZXNpZF94ID0gMC4wOwotCQkJcmVzaWRfeSA9IDAuMDsKLQotCQkJZmlyc3QgPSAwOwotCQl9Ci0JCWxhc3RfemVybyA9IGRub3coKTsKLQl9Ci0KLQlpZiAoaW5wdXQubW90aW9uKSB7Ci0JCWlmICh4ICE9IGxhc3RfeCB8fCB5ICE9IGxhc3RfeSkgewotCQkJaWYgKHVpbnB1dF90b3VjaHNjcmVlbikgewotCQkJCTsKLQkJCX0gZWxzZSBpZiAodWlucHV0X2FicykgewotCQkJCXB0cl9hYnMoeCwgeSwgLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlwdHJfcmVsKHggLSBsYXN0X3gsIHkgLSBsYXN0X3kpOwotCQkJfQotCQkJbGFzdF94ID0geDsKLQkJCWxhc3RfeSA9IHk7Ci0JCX0KLQl9Ci0KLQlpZiAoISBpbnB1dC5idXR0b24pIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChsYXN0X21hc2sgPCAwKSB7Ci0JCWxhc3RfbWFzayA9IG1hc2s7Ci0JfQotCi0JaWYgKGRiID4gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgIm1hc2s6ICAgICAgICAlc1xuIiwgYml0cHJpbnQobWFzaywgMTYpKTsKLQkJZnByaW50ZihzdGRlcnIsICJibWFzazogICAgICAgJXNcbiIsIGJpdHByaW50KGJtYXNrLCAxNikpOwotCQlmcHJpbnRmKHN0ZGVyciwgImxhc3RfbWFzazogICAlc1xuIiwgYml0cHJpbnQobGFzdF9tYXNrLCAxNikpOwotCQlmcHJpbnRmKHN0ZGVyciwgImJ1dHRvbl9tYXNrOiAlc1xuIiwgYml0cHJpbnQoYnV0dG9uX21hc2ssIDE2KSk7Ci0JfQotCi0JaWYgKHVpbnB1dF90b3VjaHNjcmVlbikgewotCQlpZiAoIWJ0bl90b3VjaCkgewotCQkJc3RhdGljIGludCBkb3duX2NvdW50ID0gMDsKLQkJCWludCBwID0gdG91Y2hfcHJlc3N1cmUgPj0wID8gdG91Y2hfcHJlc3N1cmUgOiAwOwotCQkJaWYgKCFsYXN0X21hc2sgJiYgIW1hc2spIHsKLQkJCQlpZiAodG91Y2hfYWx3YXlzKSB7Ci0JCQkJCXB0cl9hYnMobGFzdF94LCBsYXN0X3ksIDApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWxhc3RfbWFzayAmJiBtYXNrKSB7Ci0JCQkJcHRyX2FicyhsYXN0X3gsIGxhc3RfeSwgcCk7Ci0JCQkJZG93bl9jb3VudCA9IDA7Ci0JCQl9IGVsc2UgaWYgKGxhc3RfbWFzayAmJiAhbWFzaykgewotCQkJCXB0cl9hYnMobGFzdF94LCBsYXN0X3ksIDApOwotCQkJfSBlbHNlIGlmIChsYXN0X21hc2sgJiYgbWFzaykgewotCQkJCWRvd25fY291bnQrKzsKLQkJCQlpZiAoZHJhZ3NraXAgPiAwKSB7Ci0JCQkJCWlmIChkb3duX2NvdW50ICUgZHJhZ3NraXAgPT0gMCkgewotCQkJCQkJcHRyX2FicyhsYXN0X3gsIGxhc3RfeSwgcCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwdHJfYWJzKGxhc3RfeCwgbGFzdF95LCBwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWxhc3RfbWFzayAmJiAhbWFzaykgewotCQkJCWlmICh0b3VjaF9hbHdheXMpIHsKLQkJCQkJcHRyX2FicyhsYXN0X3gsIGxhc3RfeSwgMCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghbGFzdF9tYXNrICYmIG1hc2spIHsKLQkJCQlwdHJfYWJzKGxhc3RfeCwgbGFzdF95LCAwKTsKLQkJCQlidXR0b25fY2xpY2soMSwgMCk7Ci0JCQl9IGVsc2UgaWYgKGxhc3RfbWFzayAmJiAhbWFzaykgewotCQkJCXB0cl9hYnMobGFzdF94LCBsYXN0X3ksIDApOwotCQkJCWJ1dHRvbl9jbGljaygwLCAwKTsKLQkJCX0gZWxzZSBpZiAobGFzdF9tYXNrICYmIG1hc2spIHsKLQkJCQk7Ci0JCQl9Ci0JCX0KLQkJbGFzdF9tYXNrID0gbWFzazsKLQl9IGVsc2UgaWYgKG1hc2sgIT0gbGFzdF9tYXNrKSB7Ci0JCWludCBpOwotCQlmb3IgKGk9MTsgaSA8PSBNQVhfQlVUVE9OUzsgaSsrKSB7Ci0JCQlpbnQgZG93biwgYiA9IDEgPDwgKGktMSk7Ci0JCQlpZiAoIChsYXN0X21hc2sgJiBiKSA9PSAobWFzayAmIGIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobWFzayAmIGIpIHsKLQkJCQlkb3duID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG93biA9IDA7Ci0JCQl9Ci0JCQlidXR0b25fY2xpY2soZG93biwgaSk7Ci0JCX0KLQkJaWYgKG1hc2sgJiYgdWlucHV0X2FicyAmJiB0b3VjaF9wcmVzc3VyZSA+PSAwKSB7Ci0JCQlwdHJfYWJzKGxhc3RfeCwgbGFzdF95LCB0b3VjaF9wcmVzc3VyZSk7Ci0JCX0KLQkJbGFzdF9tYXNrID0gbWFzazsKLQl9Ci0JYm1hc2sgPSBtYXNrOwotfQotCi12b2lkIHVpbnB1dF9rZXlfY29tbWFuZChpbnQgZG93biwgaW50IGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCkgewotI2lmZGVmIFVJTlBVVF9PSwotCXN0cnVjdCBpbnB1dF9ldmVudCBldjsKLQlpbnQgc2NhbmNvZGU7Ci0JYWxsb3dlZF9pbnB1dF90IGlucHV0OwotCWludCBkID0gZGlyZWN0X2tleV9mZCA8IDAgPyBmZCA6IGRpcmVjdF9rZXlfZmQ7Ci0KLQlpZiAoaW5qZWN0YWJsZSAmJiBzdHJjaHIoaW5qZWN0YWJsZSwgJ0snKSA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHZpZXdfb25seSkgewotCQlyZXR1cm47Ci0JfQotCWdldF9hbGxvd2VkX2lucHV0KGNsaWVudCwgJmlucHV0KTsKLQlpZiAoISBpbnB1dC5rZXlzdHJva2UpIHsKLQkJcmV0dXJuOwotCX0KLQotCXNjYW5jb2RlID0gbG9va3VwX2NvZGUoa2V5c3ltKTsKLQotCWlmIChzY2FuY29kZSA8IDApIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidWlucHV0X2tleV9jb21tYW5kOiAlZCAtPiAlZCAlcyBmZD0lZFxuIiwga2V5c3ltLCBzY2FuY29kZSwgZG93biA/ICJkb3duIiA6ICJ1cCIsIGQpOwotCi0JbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7Ci0JZ2V0dGltZW9mZGF5KCZldi50aW1lLCBOVUxMKTsKLQlldi50eXBlID0gRVZfS0VZOwotCWV2LmNvZGUgPSAodW5zaWduZWQgY2hhcikgc2NhbmNvZGU7Ci0JZXYudmFsdWUgPSBkb3duOwotCi0Jd3JpdGUoZCwgJmV2LCBzaXplb2YoZXYpKTsKLQotCWV2LnR5cGUgPSBFVl9TWU47Ci0JZXYuY29kZSA9IFNZTl9SRVBPUlQ7Ci0JZXYudmFsdWUgPSAwOwotCXdyaXRlKGQsICZldiwgc2l6ZW9mKGV2KSk7Ci0KLQlpZiAoMCA8PSBzY2FuY29kZSAmJiBzY2FuY29kZSA8IDI1NikgewotCQlrZXlfcHJlc3NlZFtzY2FuY29kZV0gPSBkb3duID8gMSA6IDA7Ci0JfQotI2Vsc2UKLQlpZiAoIWRvd24gfHwgIWtleXN5bSB8fCAhY2xpZW50KSB7fQotI2VuZGlmCi19Ci0KLSNpZiAwCi0gIGdyZXAgJ2Nhc2UgWEtfJyB4MHZuYy5jIHwgc2VkIC1lICdzL2Nhc2UgLyRrZXlfbG9va3Vwey8nIC1lICdzLzovfS8nIC1lICdzL3JldHVybiAvPSAkLycKLSNlbmRpZgotCi1zdGF0aWMgaW50IGxvb2t1cF9jb2RlKGludCBrZXlzeW0pIHsKLQotCWlmIChrZXlzeW0gPT0gTm9TeW1ib2wpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN3aXRjaChrZXlzeW0pIHsKLSNpZmRlZiBVSU5QVVRfT0sKLQljYXNlIFhLX0VzY2FwZToJcmV0dXJuIEtFWV9FU0M7Ci0JY2FzZSBYS18xOgkJcmV0dXJuIEtFWV8xOwotCWNhc2UgWEtfMjoJCXJldHVybiBLRVlfMjsKLQljYXNlIFhLXzM6CQlyZXR1cm4gS0VZXzM7Ci0JY2FzZSBYS180OgkJcmV0dXJuIEtFWV80OwotCWNhc2UgWEtfNToJCXJldHVybiBLRVlfNTsKLQljYXNlIFhLXzY6CQlyZXR1cm4gS0VZXzY7Ci0JY2FzZSBYS183OgkJcmV0dXJuIEtFWV83OwotCWNhc2UgWEtfODoJCXJldHVybiBLRVlfODsKLQljYXNlIFhLXzk6CQlyZXR1cm4gS0VZXzk7Ci0JY2FzZSBYS18wOgkJcmV0dXJuIEtFWV8wOwotCWNhc2UgWEtfZXhjbGFtOglyZXR1cm4gS0VZXzE7Ci0JY2FzZSBYS19hdDoJCXJldHVybiBLRVlfMjsKLQljYXNlIFhLX251bWJlcnNpZ246CXJldHVybiBLRVlfMzsKLQljYXNlIFhLX2RvbGxhcjoJcmV0dXJuIEtFWV80OwotCWNhc2UgWEtfcGVyY2VudDoJcmV0dXJuIEtFWV81OwotCWNhc2UgWEtfYXNjaWljaXJjdW06CXJldHVybiBLRVlfNjsKLQljYXNlIFhLX2FtcGVyc2FuZDoJcmV0dXJuIEtFWV83OwotCWNhc2UgWEtfYXN0ZXJpc2s6CXJldHVybiBLRVlfODsKLQljYXNlIFhLX3BhcmVubGVmdDoJcmV0dXJuIEtFWV85OwotCWNhc2UgWEtfcGFyZW5yaWdodDoJcmV0dXJuIEtFWV8wOwotCWNhc2UgWEtfbWludXM6CXJldHVybiBLRVlfTUlOVVM7Ci0JY2FzZSBYS191bmRlcnNjb3JlOglyZXR1cm4gS0VZX01JTlVTOwotCWNhc2UgWEtfZXF1YWw6CXJldHVybiBLRVlfRVFVQUw7Ci0JY2FzZSBYS19wbHVzOglyZXR1cm4gS0VZX0VRVUFMOwotCWNhc2UgWEtfQmFja1NwYWNlOglyZXR1cm4gS0VZX0JBQ0tTUEFDRTsKLQljYXNlIFhLX1RhYjoJCXJldHVybiBLRVlfVEFCOwotCWNhc2UgWEtfcToJCXJldHVybiBLRVlfUTsKLQljYXNlIFhLX1E6CQlyZXR1cm4gS0VZX1E7Ci0JY2FzZSBYS193OgkJcmV0dXJuIEtFWV9XOwotCWNhc2UgWEtfVzoJCXJldHVybiBLRVlfVzsKLQljYXNlIFhLX2U6CQlyZXR1cm4gS0VZX0U7Ci0JY2FzZSBYS19FOgkJcmV0dXJuIEtFWV9FOwotCWNhc2UgWEtfcjoJCXJldHVybiBLRVlfUjsKLQljYXNlIFhLX1I6CQlyZXR1cm4gS0VZX1I7Ci0JY2FzZSBYS190OgkJcmV0dXJuIEtFWV9UOwotCWNhc2UgWEtfVDoJCXJldHVybiBLRVlfVDsKLQljYXNlIFhLX3k6CQlyZXR1cm4gS0VZX1k7Ci0JY2FzZSBYS19ZOgkJcmV0dXJuIEtFWV9ZOwotCWNhc2UgWEtfdToJCXJldHVybiBLRVlfVTsKLQljYXNlIFhLX1U6CQlyZXR1cm4gS0VZX1U7Ci0JY2FzZSBYS19pOgkJcmV0dXJuIEtFWV9JOwotCWNhc2UgWEtfSToJCXJldHVybiBLRVlfSTsKLQljYXNlIFhLX286CQlyZXR1cm4gS0VZX087Ci0JY2FzZSBYS19POgkJcmV0dXJuIEtFWV9POwotCWNhc2UgWEtfcDoJCXJldHVybiBLRVlfUDsKLQljYXNlIFhLX1A6CQlyZXR1cm4gS0VZX1A7Ci0JY2FzZSBYS19icmFjZWxlZnQ6CXJldHVybiBLRVlfTEVGVEJSQUNFOwotCWNhc2UgWEtfYnJhY2VyaWdodDoJcmV0dXJuIEtFWV9SSUdIVEJSQUNFOwotCWNhc2UgWEtfYnJhY2tldGxlZnQ6CXJldHVybiBLRVlfTEVGVEJSQUNFOwotCWNhc2UgWEtfYnJhY2tldHJpZ2h0OglyZXR1cm4gS0VZX1JJR0hUQlJBQ0U7Ci0JY2FzZSBYS19SZXR1cm46CXJldHVybiBLRVlfRU5URVI7Ci0JY2FzZSBYS19Db250cm9sX0w6CXJldHVybiBLRVlfTEVGVENUUkw7Ci0JY2FzZSBYS19hOgkJcmV0dXJuIEtFWV9BOwotCWNhc2UgWEtfQToJCXJldHVybiBLRVlfQTsKLQljYXNlIFhLX3M6CQlyZXR1cm4gS0VZX1M7Ci0JY2FzZSBYS19TOgkJcmV0dXJuIEtFWV9TOwotCWNhc2UgWEtfZDoJCXJldHVybiBLRVlfRDsKLQljYXNlIFhLX0Q6CQlyZXR1cm4gS0VZX0Q7Ci0JY2FzZSBYS19mOgkJcmV0dXJuIEtFWV9GOwotCWNhc2UgWEtfRjoJCXJldHVybiBLRVlfRjsKLQljYXNlIFhLX2c6CQlyZXR1cm4gS0VZX0c7Ci0JY2FzZSBYS19HOgkJcmV0dXJuIEtFWV9HOwotCWNhc2UgWEtfaDoJCXJldHVybiBLRVlfSDsKLQljYXNlIFhLX0g6CQlyZXR1cm4gS0VZX0g7Ci0JY2FzZSBYS19qOgkJcmV0dXJuIEtFWV9KOwotCWNhc2UgWEtfSjoJCXJldHVybiBLRVlfSjsKLQljYXNlIFhLX2s6CQlyZXR1cm4gS0VZX0s7Ci0JY2FzZSBYS19LOgkJcmV0dXJuIEtFWV9LOwotCWNhc2UgWEtfbDoJCXJldHVybiBLRVlfTDsKLQljYXNlIFhLX0w6CQlyZXR1cm4gS0VZX0w7Ci0JY2FzZSBYS19zZW1pY29sb246CXJldHVybiBLRVlfU0VNSUNPTE9OOwotCWNhc2UgWEtfY29sb246CXJldHVybiBLRVlfU0VNSUNPTE9OOwotCWNhc2UgWEtfYXBvc3Ryb3BoZToJcmV0dXJuIEtFWV9BUE9TVFJPUEhFOwotCWNhc2UgWEtfcXVvdGVkYmw6CXJldHVybiBLRVlfQVBPU1RST1BIRTsKLQljYXNlIFhLX2dyYXZlOglyZXR1cm4gS0VZX0dSQVZFOwotCWNhc2UgWEtfYXNjaWl0aWxkZToJcmV0dXJuIEtFWV9HUkFWRTsKLQljYXNlIFhLX1NoaWZ0X0w6CXJldHVybiBLRVlfTEVGVFNISUZUOwotCWNhc2UgWEtfYmFja3NsYXNoOglyZXR1cm4gS0VZX0JBQ0tTTEFTSDsKLQljYXNlIFhLX2JhcjoJCXJldHVybiBLRVlfQkFDS1NMQVNIOwotCWNhc2UgWEtfejoJCXJldHVybiBLRVlfWjsKLQljYXNlIFhLX1o6CQlyZXR1cm4gS0VZX1o7Ci0JY2FzZSBYS194OgkJcmV0dXJuIEtFWV9YOwotCWNhc2UgWEtfWDoJCXJldHVybiBLRVlfWDsKLQljYXNlIFhLX2M6CQlyZXR1cm4gS0VZX0M7Ci0JY2FzZSBYS19DOgkJcmV0dXJuIEtFWV9DOwotCWNhc2UgWEtfdjoJCXJldHVybiBLRVlfVjsKLQljYXNlIFhLX1Y6CQlyZXR1cm4gS0VZX1Y7Ci0JY2FzZSBYS19iOgkJcmV0dXJuIEtFWV9COwotCWNhc2UgWEtfQjoJCXJldHVybiBLRVlfQjsKLQljYXNlIFhLX246CQlyZXR1cm4gS0VZX047Ci0JY2FzZSBYS19OOgkJcmV0dXJuIEtFWV9OOwotCWNhc2UgWEtfbToJCXJldHVybiBLRVlfTTsKLQljYXNlIFhLX006CQlyZXR1cm4gS0VZX007Ci0JY2FzZSBYS19jb21tYToJcmV0dXJuIEtFWV9DT01NQTsKLQljYXNlIFhLX2xlc3M6CXJldHVybiBLRVlfQ09NTUE7Ci0JY2FzZSBYS19wZXJpb2Q6CXJldHVybiBLRVlfRE9UOwotCWNhc2UgWEtfZ3JlYXRlcjoJcmV0dXJuIEtFWV9ET1Q7Ci0JY2FzZSBYS19zbGFzaDoJcmV0dXJuIEtFWV9TTEFTSDsKLQljYXNlIFhLX3F1ZXN0aW9uOglyZXR1cm4gS0VZX1NMQVNIOwotCWNhc2UgWEtfU2hpZnRfUjoJcmV0dXJuIEtFWV9SSUdIVFNISUZUOwotCWNhc2UgWEtfS1BfTXVsdGlwbHk6CXJldHVybiBLRVlfS1BBU1RFUklTSzsKLQljYXNlIFhLX0FsdF9MOglyZXR1cm4gS0VZX0xFRlRBTFQ7Ci0JY2FzZSBYS19zcGFjZToJcmV0dXJuIEtFWV9TUEFDRTsKLQljYXNlIFhLX0NhcHNfTG9jazoJcmV0dXJuIEtFWV9DQVBTTE9DSzsKLQljYXNlIFhLX0YxOgkJcmV0dXJuIEtFWV9GMTsKLQljYXNlIFhLX0YyOgkJcmV0dXJuIEtFWV9GMjsKLQljYXNlIFhLX0YzOgkJcmV0dXJuIEtFWV9GMzsKLQljYXNlIFhLX0Y0OgkJcmV0dXJuIEtFWV9GNDsKLQljYXNlIFhLX0Y1OgkJcmV0dXJuIEtFWV9GNTsKLQljYXNlIFhLX0Y2OgkJcmV0dXJuIEtFWV9GNjsKLQljYXNlIFhLX0Y3OgkJcmV0dXJuIEtFWV9GNzsKLQljYXNlIFhLX0Y4OgkJcmV0dXJuIEtFWV9GODsKLQljYXNlIFhLX0Y5OgkJcmV0dXJuIEtFWV9GOTsKLQljYXNlIFhLX0YxMDoJCXJldHVybiBLRVlfRjEwOwotCWNhc2UgWEtfTnVtX0xvY2s6CXJldHVybiBLRVlfTlVNTE9DSzsKLQljYXNlIFhLX1Njcm9sbF9Mb2NrOglyZXR1cm4gS0VZX1NDUk9MTExPQ0s7Ci0JY2FzZSBYS19LUF83OgkJcmV0dXJuIEtFWV9LUDc7Ci0JY2FzZSBYS19LUF84OgkJcmV0dXJuIEtFWV9LUDg7Ci0JY2FzZSBYS19LUF85OgkJcmV0dXJuIEtFWV9LUDk7Ci0JY2FzZSBYS19LUF9TdWJ0cmFjdDoJcmV0dXJuIEtFWV9LUE1JTlVTOwotCWNhc2UgWEtfS1BfNDoJCXJldHVybiBLRVlfS1A0OwotCWNhc2UgWEtfS1BfNToJCXJldHVybiBLRVlfS1A1OwotCWNhc2UgWEtfS1BfNjoJCXJldHVybiBLRVlfS1A2OwotCWNhc2UgWEtfS1BfQWRkOglyZXR1cm4gS0VZX0tQUExVUzsKLQljYXNlIFhLX0tQXzE6CQlyZXR1cm4gS0VZX0tQMTsKLQljYXNlIFhLX0tQXzI6CQlyZXR1cm4gS0VZX0tQMjsKLQljYXNlIFhLX0tQXzM6CQlyZXR1cm4gS0VZX0tQMzsKLQljYXNlIFhLX0tQXzA6CQlyZXR1cm4gS0VZX0tQMDsKLQljYXNlIFhLX0tQX0RlY2ltYWw6CXJldHVybiBLRVlfS1BET1Q7Ci0JY2FzZSBYS19GMTM6CQlyZXR1cm4gS0VZX0YxMzsKLQljYXNlIFhLX0YxMToJCXJldHVybiBLRVlfRjExOwotCWNhc2UgWEtfRjEyOgkJcmV0dXJuIEtFWV9GMTI7Ci0JY2FzZSBYS19GMTQ6CQlyZXR1cm4gS0VZX0YxNDsKLQljYXNlIFhLX0YxNToJCXJldHVybiBLRVlfRjE1OwotCWNhc2UgWEtfRjE2OgkJcmV0dXJuIEtFWV9GMTY7Ci0JY2FzZSBYS19GMTc6CQlyZXR1cm4gS0VZX0YxNzsKLQljYXNlIFhLX0YxODoJCXJldHVybiBLRVlfRjE4OwotCWNhc2UgWEtfRjE5OgkJcmV0dXJuIEtFWV9GMTk7Ci0JY2FzZSBYS19GMjA6CQlyZXR1cm4gS0VZX0YyMDsKLQljYXNlIFhLX0tQX0VudGVyOglyZXR1cm4gS0VZX0tQRU5URVI7Ci0JY2FzZSBYS19Db250cm9sX1I6CXJldHVybiBLRVlfUklHSFRDVFJMOwotCWNhc2UgWEtfS1BfRGl2aWRlOglyZXR1cm4gS0VZX0tQU0xBU0g7Ci0JY2FzZSBYS19TeXNfUmVxOglyZXR1cm4gS0VZX1NZU1JROwotCWNhc2UgWEtfQWx0X1I6CXJldHVybiBLRVlfUklHSFRBTFQ7Ci0JY2FzZSBYS19MaW5lZmVlZDoJcmV0dXJuIEtFWV9MSU5FRkVFRDsKLQljYXNlIFhLX0hvbWU6CQlyZXR1cm4gS0VZX0hPTUU7Ci0JY2FzZSBYS19VcDoJCXJldHVybiBLRVlfVVA7Ci0JY2FzZSBYS19QYWdlX1VwOglyZXR1cm4gS0VZX1BBR0VVUDsKLQljYXNlIFhLX0xlZnQ6CQlyZXR1cm4gS0VZX0xFRlQ7Ci0JY2FzZSBYS19SaWdodDoJcmV0dXJuIEtFWV9SSUdIVDsKLQljYXNlIFhLX0VuZDoJCXJldHVybiBLRVlfRU5EOwotCWNhc2UgWEtfRG93bjoJCXJldHVybiBLRVlfRE9XTjsKLQljYXNlIFhLX1BhZ2VfRG93bjoJcmV0dXJuIEtFWV9QQUdFRE9XTjsKLQljYXNlIFhLX0luc2VydDoJcmV0dXJuIEtFWV9JTlNFUlQ7Ci0JY2FzZSBYS19EZWxldGU6CXJldHVybiBLRVlfREVMRVRFOwotCWNhc2UgWEtfS1BfRXF1YWw6CXJldHVybiBLRVlfS1BFUVVBTDsKLQljYXNlIFhLX1BhdXNlOglyZXR1cm4gS0VZX1BBVVNFOwotCWNhc2UgWEtfRjIxOgkJcmV0dXJuIEtFWV9GMjE7Ci0JY2FzZSBYS19GMjI6CQlyZXR1cm4gS0VZX0YyMjsKLQljYXNlIFhLX0YyMzoJCXJldHVybiBLRVlfRjIzOwotCWNhc2UgWEtfRjI0OgkJcmV0dXJuIEtFWV9GMjQ7Ci0JY2FzZSBYS19LUF9TZXBhcmF0b3I6CXJldHVybiBLRVlfS1BDT01NQTsKLQljYXNlIFhLX01ldGFfTDoJcmV0dXJuIEtFWV9MRUZUTUVUQTsKLQljYXNlIFhLX01ldGFfUjoJcmV0dXJuIEtFWV9SSUdIVE1FVEE7Ci0JY2FzZSBYS19NdWx0aV9rZXk6CXJldHVybiBLRVlfQ09NUE9TRTsKLSNlbmRpZgotCWRlZmF1bHQ6CQlyZXR1cm4gLTE7Ci0JfQotfQotCi0jaWYgMAotCi1Gcm9tIC91c3IvaW5jbHVkZS9saW51eC9pbnB1dC5oCi0KLVdlIG1haW50YWluIGl0IGhlcmUgc2luY2UgaXQgaXMgc3VjaCBhIHBhaW5mdWwgbWVzcy4KLQotSGVyZSBpcyBhIGxpdHRsZSBzY3JpcHQgdG8gbWFrZSBpdCBlYXNpZXI6Ci0KLSMhL3Vzci9iaW4vcGVybAotd2hpbGUgKDw+KSB7Ci0JJF8gPX4gcy8tWEtfL1hLXy87Ci0JbmV4dCB1bmxlc3MgL15YS18vOwotCWNob21wOwotCWlmICgvXihcUyspKFxzKykoXFMrKS8pIHsKLQkJJGEgPSAkMTsKLQkJJHQgPSAkMjsKLQkJJGIgPSAkMzsKLQkJcHJpbnQgIlx0Y2FzZSAkYToke3R9cmV0dXJuICRiO1xuIjsKLQkJaWYgKCRhID1+IC9YS19bYS16XSQvKSB7Ci0JCQkkYSA9IHVjKCRhKTsKLQkJCXByaW50ICJcdGNhc2UgJGE6JHt0fXJldHVybiAkYjtcbiI7Ci0JCX0KLQl9Ci19Ci0KLVRoaXMgb25seSBoYW5kbGVzIFVTIGtiZCwgd2Ugd291bGQgbmVlZCBhIGtiZCBkYXRhYmFzZSBpbiBnZW5lcmFsLi4uCi1VZ2g6IHBhcnNlIGR1bXBrZXlzKDEpIG9yIC1mb29rZXlzIC91c3Ivc2hhcmUva2V5bWFwcy9pMzg2L3F3ZXJ0eS9kay5rbWFwLmd6Ci0KLVhLX0VzY2FwZQlLRVlfRVNDCi1YS18xCQlLRVlfMQotWEtfMgkJS0VZXzIKLVhLXzMJCUtFWV8zCi1YS180CQlLRVlfNAotWEtfNQkJS0VZXzUKLVhLXzYJCUtFWV82Ci1YS183CQlLRVlfNwotWEtfOAkJS0VZXzgKLVhLXzkJCUtFWV85Ci1YS18wCQlLRVlfMAotLVhLX2V4Y2xhbQlLRVlfMQotLVhLX2F0CQlLRVlfMgotLVhLX251bWJlcnNpZ24JS0VZXzMKLS1YS19kb2xsYXIJS0VZXzQKLS1YS19wZXJjZW50CUtFWV81Ci0tWEtfYXNjaWljaXJjdW0JS0VZXzYKLS1YS19hbXBlcnNhbmQJS0VZXzcKLS1YS19hc3RlcmlzawlLRVlfOAotLVhLX3BhcmVubGVmdAlLRVlfOQotLVhLX3BhcmVucmlnaHQJS0VZXzAKLVhLX21pbnVzCUtFWV9NSU5VUwotLVhLX3VuZGVyc2NvcmUJS0VZX01JTlVTCi1YS19lcXVhbAlLRVlfRVFVQUwKLS1YS19wbHVzCUtFWV9FUVVBTAotWEtfQmFja1NwYWNlCUtFWV9CQUNLU1BBQ0UKLVhLX1RhYgkJS0VZX1RBQgotWEtfcQkJS0VZX1EKLVhLX3cJCUtFWV9XCi1YS19lCQlLRVlfRQotWEtfcgkJS0VZX1IKLVhLX3QJCUtFWV9UCi1YS195CQlLRVlfWQotWEtfdQkJS0VZX1UKLVhLX2kJCUtFWV9JCi1YS19vCQlLRVlfTwotWEtfcAkJS0VZX1AKLVhLX2JyYWNlbGVmdAlLRVlfTEVGVEJSQUNFCi1YS19icmFjZXJpZ2h0CUtFWV9SSUdIVEJSQUNFCi0tWEtfYnJhY2tldGxlZnQJS0VZX0xFRlRCUkFDRQotLVhLX2JyYWNrZXRyaWdodAlLRVlfUklHSFRCUkFDRQotWEtfUmV0dXJuCUtFWV9FTlRFUgotWEtfQ29udHJvbF9MCUtFWV9MRUZUQ1RSTAotWEtfYQkJS0VZX0EKLVhLX3MJCUtFWV9TCi1YS19kCQlLRVlfRAotWEtfZgkJS0VZX0YKLVhLX2cJCUtFWV9HCi1YS19oCQlLRVlfSAotWEtfagkJS0VZX0oKLVhLX2sJCUtFWV9LCi1YS19sCQlLRVlfTAotWEtfc2VtaWNvbG9uCUtFWV9TRU1JQ09MT04KLS1YS19jb2xvbglLRVlfU0VNSUNPTE9OCi1YS19hcG9zdHJvcGhlCUtFWV9BUE9TVFJPUEhFCi0tWEtfcXVvdGVkYmwJS0VZX0FQT1NUUk9QSEUKLVhLX2dyYXZlCUtFWV9HUkFWRQotLVhLX2FzY2lpdGlsZGUJS0VZX0dSQVZFCi1YS19TaGlmdF9MCUtFWV9MRUZUU0hJRlQKLVhLX2JhY2tzbGFzaAlLRVlfQkFDS1NMQVNICi0tWEtfYmFyCQlLRVlfQkFDS1NMQVNICi1YS196CQlLRVlfWgotWEtfeAkJS0VZX1gKLVhLX2MJCUtFWV9DCi1YS192CQlLRVlfVgotWEtfYgkJS0VZX0IKLVhLX24JCUtFWV9OCi1YS19tCQlLRVlfTQotWEtfY29tbWEJS0VZX0NPTU1BCi0tWEtfbGVzcwlLRVlfQ09NTUEKLVhLX3BlcmlvZAlLRVlfRE9UCi0tWEtfZ3JlYXRlcglLRVlfRE9UCi1YS19zbGFzaAlLRVlfU0xBU0gKLS1YS19xdWVzdGlvbglLRVlfU0xBU0gKLVhLX1NoaWZ0X1IJS0VZX1JJR0hUU0hJRlQKLVhLX0tQX011bHRpcGx5CUtFWV9LUEFTVEVSSVNLCi1YS19BbHRfTAlLRVlfTEVGVEFMVAotWEtfc3BhY2UJS0VZX1NQQUNFCi1YS19DYXBzX0xvY2sJS0VZX0NBUFNMT0NLCi1YS19GMQkJS0VZX0YxCi1YS19GMgkJS0VZX0YyCi1YS19GMwkJS0VZX0YzCi1YS19GNAkJS0VZX0Y0Ci1YS19GNQkJS0VZX0Y1Ci1YS19GNgkJS0VZX0Y2Ci1YS19GNwkJS0VZX0Y3Ci1YS19GOAkJS0VZX0Y4Ci1YS19GOQkJS0VZX0Y5Ci1YS19GMTAJCUtFWV9GMTAKLVhLX051bV9Mb2NrCUtFWV9OVU1MT0NLCi1YS19TY3JvbGxfTG9jawlLRVlfU0NST0xMTE9DSwotWEtfS1BfNwkJS0VZX0tQNwotWEtfS1BfOAkJS0VZX0tQOAotWEtfS1BfOQkJS0VZX0tQOQotWEtfS1BfU3VidHJhY3QJS0VZX0tQTUlOVVMKLVhLX0tQXzQJCUtFWV9LUDQKLVhLX0tQXzUJCUtFWV9LUDUKLVhLX0tQXzYJCUtFWV9LUDYKLVhLX0tQX0FkZAlLRVlfS1BQTFVTCi1YS19LUF8xCQlLRVlfS1AxCi1YS19LUF8yCQlLRVlfS1AyCi1YS19LUF8zCQlLRVlfS1AzCi1YS19LUF8wCQlLRVlfS1AwCi1YS19LUF9EZWNpbWFsCUtFWV9LUERPVAotTm9TeW1ib2wJS0VZXzEwM1JECi1YS19GMTMJCUtFWV9GMTMKLU5vU3ltYm9sCUtFWV8xMDJORAotWEtfRjExCQlLRVlfRjExCi1YS19GMTIJCUtFWV9GMTIKLVhLX0YxNAkJS0VZX0YxNAotWEtfRjE1CQlLRVlfRjE1Ci1YS19GMTYJCUtFWV9GMTYKLVhLX0YxNwkJS0VZX0YxNwotWEtfRjE4CQlLRVlfRjE4Ci1YS19GMTkJCUtFWV9GMTkKLVhLX0YyMAkJS0VZX0YyMAotWEtfS1BfRW50ZXIJS0VZX0tQRU5URVIKLVhLX0NvbnRyb2xfUglLRVlfUklHSFRDVFJMCi1YS19LUF9EaXZpZGUJS0VZX0tQU0xBU0gKLVhLX1N5c19SZXEJS0VZX1NZU1JRCi1YS19BbHRfUglLRVlfUklHSFRBTFQKLVhLX0xpbmVmZWVkCUtFWV9MSU5FRkVFRAotWEtfSG9tZQkJS0VZX0hPTUUKLVhLX1VwCQlLRVlfVVAKLVhLX1BhZ2VfVXAJS0VZX1BBR0VVUAotWEtfTGVmdAkJS0VZX0xFRlQKLVhLX1JpZ2h0CUtFWV9SSUdIVAotWEtfRW5kCQlLRVlfRU5ECi1YS19Eb3duCQlLRVlfRE9XTgotWEtfUGFnZV9Eb3duCUtFWV9QQUdFRE9XTgotWEtfSW5zZXJ0CUtFWV9JTlNFUlQKLVhLX0RlbGV0ZQlLRVlfREVMRVRFCi1Ob1N5bWJvbAlLRVlfTUFDUk8KLU5vU3ltYm9sCUtFWV9NVVRFCi1Ob1N5bWJvbAlLRVlfVk9MVU1FRE9XTgotTm9TeW1ib2wJS0VZX1ZPTFVNRVVQCi1Ob1N5bWJvbAlLRVlfUE9XRVIKLVhLX0tQX0VxdWFsCUtFWV9LUEVRVUFMCi1Ob1N5bWJvbAlLRVlfS1BQTFVTTUlOVVMKLVhLX1BhdXNlCUtFWV9QQVVTRQotWEtfRjIxCQlLRVlfRjIxCi1YS19GMjIJCUtFWV9GMjIKLVhLX0YyMwkJS0VZX0YyMwotWEtfRjI0CQlLRVlfRjI0Ci1YS19LUF9TZXBhcmF0b3IJS0VZX0tQQ09NTUEKLVhLX01ldGFfTAlLRVlfTEVGVE1FVEEKLVhLX01ldGFfUglLRVlfUklHSFRNRVRBCi1YS19NdWx0aV9rZXkJS0VZX0NPTVBPU0UKLQotTm9TeW1ib2wJS0VZX1NUT1AKLU5vU3ltYm9sCUtFWV9BR0FJTgotTm9TeW1ib2wJS0VZX1BST1BTCi1Ob1N5bWJvbAlLRVlfVU5ETwotTm9TeW1ib2wJS0VZX0ZST05UCi1Ob1N5bWJvbAlLRVlfQ09QWQotTm9TeW1ib2wJS0VZX09QRU4KLU5vU3ltYm9sCUtFWV9QQVNURQotTm9TeW1ib2wJS0VZX0ZJTkQKLU5vU3ltYm9sCUtFWV9DVVQKLU5vU3ltYm9sCUtFWV9IRUxQCi1Ob1N5bWJvbAlLRVlfTUVOVQotTm9TeW1ib2wJS0VZX0NBTEMKLU5vU3ltYm9sCUtFWV9TRVRVUAotTm9TeW1ib2wJS0VZX1NMRUVQCi1Ob1N5bWJvbAlLRVlfV0FLRVVQCi1Ob1N5bWJvbAlLRVlfRklMRQotTm9TeW1ib2wJS0VZX1NFTkRGSUxFCi1Ob1N5bWJvbAlLRVlfREVMRVRFRklMRQotTm9TeW1ib2wJS0VZX1hGRVIKLU5vU3ltYm9sCUtFWV9QUk9HMQotTm9TeW1ib2wJS0VZX1BST0cyCi1Ob1N5bWJvbAlLRVlfV1dXCi1Ob1N5bWJvbAlLRVlfTVNET1MKLU5vU3ltYm9sCUtFWV9DT0ZGRUUKLU5vU3ltYm9sCUtFWV9ESVJFQ1RJT04KLU5vU3ltYm9sCUtFWV9DWUNMRVdJTkRPV1MKLU5vU3ltYm9sCUtFWV9NQUlMCi1Ob1N5bWJvbAlLRVlfQk9PS01BUktTCi1Ob1N5bWJvbAlLRVlfQ09NUFVURVIKLU5vU3ltYm9sCUtFWV9CQUNLCi1Ob1N5bWJvbAlLRVlfRk9SV0FSRAotTm9TeW1ib2wJS0VZX0NMT1NFQ0QKLU5vU3ltYm9sCUtFWV9FSkVDVENECi1Ob1N5bWJvbAlLRVlfRUpFQ1RDTE9TRUNECi1Ob1N5bWJvbAlLRVlfTkVYVFNPTkcKLU5vU3ltYm9sCUtFWV9QTEFZUEFVU0UKLU5vU3ltYm9sCUtFWV9QUkVWSU9VU1NPTkcKLU5vU3ltYm9sCUtFWV9TVE9QQ0QKLU5vU3ltYm9sCUtFWV9SRUNPUkQKLU5vU3ltYm9sCUtFWV9SRVdJTkQKLU5vU3ltYm9sCUtFWV9QSE9ORQotTm9TeW1ib2wJS0VZX0lTTwotTm9TeW1ib2wJS0VZX0NPTkZJRwotTm9TeW1ib2wJS0VZX0hPTUVQQUdFCi1Ob1N5bWJvbAlLRVlfUkVGUkVTSAotTm9TeW1ib2wJS0VZX0VYSVQKLU5vU3ltYm9sCUtFWV9NT1ZFCi1Ob1N5bWJvbAlLRVlfRURJVAotTm9TeW1ib2wJS0VZX1NDUk9MTFVQCi1Ob1N5bWJvbAlLRVlfU0NST0xMRE9XTgotTm9TeW1ib2wJS0VZX0tQTEVGVFBBUkVOCi1Ob1N5bWJvbAlLRVlfS1BSSUdIVFBBUkVOCi0KLU5vU3ltYm9sCUtFWV9JTlRMMQotTm9TeW1ib2wJS0VZX0lOVEwyCi1Ob1N5bWJvbAlLRVlfSU5UTDMKLU5vU3ltYm9sCUtFWV9JTlRMNAotTm9TeW1ib2wJS0VZX0lOVEw1Ci1Ob1N5bWJvbAlLRVlfSU5UTDYKLU5vU3ltYm9sCUtFWV9JTlRMNwotTm9TeW1ib2wJS0VZX0lOVEw4Ci1Ob1N5bWJvbAlLRVlfSU5UTDkKLU5vU3ltYm9sCUtFWV9MQU5HMQotTm9TeW1ib2wJS0VZX0xBTkcyCi1Ob1N5bWJvbAlLRVlfTEFORzMKLU5vU3ltYm9sCUtFWV9MQU5HNAotTm9TeW1ib2wJS0VZX0xBTkc1Ci1Ob1N5bWJvbAlLRVlfTEFORzYKLU5vU3ltYm9sCUtFWV9MQU5HNwotTm9TeW1ib2wJS0VZX0xBTkc4Ci1Ob1N5bWJvbAlLRVlfTEFORzkKLQotTm9TeW1ib2wJS0VZX1BMQVlDRAotTm9TeW1ib2wJS0VZX1BBVVNFQ0QKLU5vU3ltYm9sCUtFWV9QUk9HMwotTm9TeW1ib2wJS0VZX1BST0c0Ci1Ob1N5bWJvbAlLRVlfU1VTUEVORAotTm9TeW1ib2wJS0VZX0NMT1NFCi1Ob1N5bWJvbAlLRVlfUExBWQotTm9TeW1ib2wJS0VZX0ZBU1RGT1JXQVJECi1Ob1N5bWJvbAlLRVlfQkFTU0JPT1NUCi1Ob1N5bWJvbAlLRVlfUFJJTlQKLU5vU3ltYm9sCUtFWV9IUAotTm9TeW1ib2wJS0VZX0NBTUVSQQotTm9TeW1ib2wJS0VZX1NPVU5ECi1Ob1N5bWJvbAlLRVlfUVVFU1RJT04KLU5vU3ltYm9sCUtFWV9FTUFJTAotTm9TeW1ib2wJS0VZX0NIQVQKLU5vU3ltYm9sCUtFWV9TRUFSQ0gKLU5vU3ltYm9sCUtFWV9DT05ORUNUCi1Ob1N5bWJvbAlLRVlfRklOQU5DRQotTm9TeW1ib2wJS0VZX1NQT1JUCi1Ob1N5bWJvbAlLRVlfU0hPUAotTm9TeW1ib2wJS0VZX0FMVEVSQVNFCi1Ob1N5bWJvbAlLRVlfQ0FOQ0VMCi1Ob1N5bWJvbAlLRVlfQlJJR0hUTkVTU0RPV04KLU5vU3ltYm9sCUtFWV9CUklHSFRORVNTVVAKLU5vU3ltYm9sCUtFWV9NRURJQQotCi1Ob1N5bWJvbAlLRVlfVU5LTk9XTgotTm9TeW1ib2wJCi1Ob1N5bWJvbAlCVE5fTUlTQwotTm9TeW1ib2wJQlROXzAKLU5vU3ltYm9sCUJUTl8xCi1Ob1N5bWJvbAlCVE5fMgotTm9TeW1ib2wJQlROXzMKLU5vU3ltYm9sCUJUTl80Ci1Ob1N5bWJvbAlCVE5fNQotTm9TeW1ib2wJQlROXzYKLU5vU3ltYm9sCUJUTl83Ci1Ob1N5bWJvbAlCVE5fOAotTm9TeW1ib2wJQlROXzkKLU5vU3ltYm9sCQotTm9TeW1ib2wJQlROX01PVVNFCi1Ob1N5bWJvbAlCVE5fTEVGVAotTm9TeW1ib2wJQlROX1JJR0hUCi1Ob1N5bWJvbAlCVE5fTUlERExFCi1Ob1N5bWJvbAlCVE5fU0lERQotTm9TeW1ib2wJQlROX0VYVFJBCi1Ob1N5bWJvbAlCVE5fRk9SV0FSRAotTm9TeW1ib2wJQlROX0JBQ0sKLU5vU3ltYm9sCUJUTl9UQVNLCi1Ob1N5bWJvbAkKLU5vU3ltYm9sCUJUTl9KT1lTVElDSwotTm9TeW1ib2wJQlROX1RSSUdHRVIKLU5vU3ltYm9sCUJUTl9USFVNQgotTm9TeW1ib2wJQlROX1RIVU1CMgotTm9TeW1ib2wJQlROX1RPUAotTm9TeW1ib2wJQlROX1RPUDIKLU5vU3ltYm9sCUJUTl9QSU5LSUUKLU5vU3ltYm9sCUJUTl9CQVNFCi1Ob1N5bWJvbAlCVE5fQkFTRTIKLU5vU3ltYm9sCUJUTl9CQVNFMwotTm9TeW1ib2wJQlROX0JBU0U0Ci1Ob1N5bWJvbAlCVE5fQkFTRTUKLU5vU3ltYm9sCUJUTl9CQVNFNgotTm9TeW1ib2wJQlROX0RFQUQKLQotTm9TeW1ib2wJQlROX0dBTUVQQUQKLU5vU3ltYm9sCUJUTl9BCi1Ob1N5bWJvbAlCVE5fQgotTm9TeW1ib2wJQlROX0MKLU5vU3ltYm9sCUJUTl9YCi1Ob1N5bWJvbAlCVE5fWQotTm9TeW1ib2wJQlROX1oKLU5vU3ltYm9sCUJUTl9UTAotTm9TeW1ib2wJQlROX1RSCi1Ob1N5bWJvbAlCVE5fVEwyCi1Ob1N5bWJvbAlCVE5fVFIyCi1Ob1N5bWJvbAlCVE5fU0VMRUNUCi1Ob1N5bWJvbAlCVE5fU1RBUlQKLU5vU3ltYm9sCUJUTl9NT0RFCi1Ob1N5bWJvbAlCVE5fVEhVTUJMCi1Ob1N5bWJvbAlCVE5fVEhVTUJSCi0KLU5vU3ltYm9sCUJUTl9ESUdJCi1Ob1N5bWJvbAlCVE5fVE9PTF9QRU4KLU5vU3ltYm9sCUJUTl9UT09MX1JVQkJFUgotTm9TeW1ib2wJQlROX1RPT0xfQlJVU0gKLU5vU3ltYm9sCUJUTl9UT09MX1BFTkNJTAotTm9TeW1ib2wJQlROX1RPT0xfQUlSQlJVU0gKLU5vU3ltYm9sCUJUTl9UT09MX0ZJTkdFUgotTm9TeW1ib2wJQlROX1RPT0xfTU9VU0UKLU5vU3ltYm9sCUJUTl9UT09MX0xFTlMKLU5vU3ltYm9sCUJUTl9UT1VDSAotTm9TeW1ib2wJQlROX1NUWUxVUwotTm9TeW1ib2wJQlROX1NUWUxVUzIKLU5vU3ltYm9sCUJUTl9UT09MX0RPVUJMRVRBUAotTm9TeW1ib2wJQlROX1RPT0xfVFJJUExFVEFQCi0KLU5vU3ltYm9sCUJUTl9XSEVFTAotTm9TeW1ib2wJQlROX0dFQVJfRE9XTgotTm9TeW1ib2wJQlROX0dFQVJfVVAKLQotTm9TeW1ib2wJS0VZX09LCi1Ob1N5bWJvbAlLRVlfU0VMRUNUCi1Ob1N5bWJvbAlLRVlfR09UTwotTm9TeW1ib2wJS0VZX0NMRUFSCi1Ob1N5bWJvbAlLRVlfUE9XRVIyCi1Ob1N5bWJvbAlLRVlfT1BUSU9OCi1Ob1N5bWJvbAlLRVlfSU5GTwotTm9TeW1ib2wJS0VZX1RJTUUKLU5vU3ltYm9sCUtFWV9WRU5ET1IKLU5vU3ltYm9sCUtFWV9BUkNISVZFCi1Ob1N5bWJvbAlLRVlfUFJPR1JBTQotTm9TeW1ib2wJS0VZX0NIQU5ORUwKLU5vU3ltYm9sCUtFWV9GQVZPUklURVMKLU5vU3ltYm9sCUtFWV9FUEcKLU5vU3ltYm9sCUtFWV9QVlIKLU5vU3ltYm9sCUtFWV9NSFAKLU5vU3ltYm9sCUtFWV9MQU5HVUFHRQotTm9TeW1ib2wJS0VZX1RJVExFCi1Ob1N5bWJvbAlLRVlfU1VCVElUTEUKLU5vU3ltYm9sCUtFWV9BTkdMRQotTm9TeW1ib2wJS0VZX1pPT00KLU5vU3ltYm9sCUtFWV9NT0RFCi1Ob1N5bWJvbAlLRVlfS0VZQk9BUkQKLU5vU3ltYm9sCUtFWV9TQ1JFRU4KLU5vU3ltYm9sCUtFWV9QQwotTm9TeW1ib2wJS0VZX1RWCi1Ob1N5bWJvbAlLRVlfVFYyCi1Ob1N5bWJvbAlLRVlfVkNSCi1Ob1N5bWJvbAlLRVlfVkNSMgotTm9TeW1ib2wJS0VZX1NBVAotTm9TeW1ib2wJS0VZX1NBVDIKLU5vU3ltYm9sCUtFWV9DRAotTm9TeW1ib2wJS0VZX1RBUEUKLU5vU3ltYm9sCUtFWV9SQURJTwotTm9TeW1ib2wJS0VZX1RVTkVSCi1Ob1N5bWJvbAlLRVlfUExBWUVSCi1Ob1N5bWJvbAlLRVlfVEVYVAotTm9TeW1ib2wJS0VZX0RWRAotTm9TeW1ib2wJS0VZX0FVWAotTm9TeW1ib2wJS0VZX01QMwotTm9TeW1ib2wJS0VZX0FVRElPCi1Ob1N5bWJvbAlLRVlfVklERU8KLU5vU3ltYm9sCUtFWV9ESVJFQ1RPUlkKLU5vU3ltYm9sCUtFWV9MSVNUCi1Ob1N5bWJvbAlLRVlfTUVNTwotTm9TeW1ib2wJS0VZX0NBTEVOREFSCi1Ob1N5bWJvbAlLRVlfUkVECi1Ob1N5bWJvbAlLRVlfR1JFRU4KLU5vU3ltYm9sCUtFWV9ZRUxMT1cKLU5vU3ltYm9sCUtFWV9CTFVFCi1Ob1N5bWJvbAlLRVlfQ0hBTk5FTFVQCi1Ob1N5bWJvbAlLRVlfQ0hBTk5FTERPV04KLU5vU3ltYm9sCUtFWV9GSVJTVAotTm9TeW1ib2wJS0VZX0xBU1QKLU5vU3ltYm9sCUtFWV9BQgotTm9TeW1ib2wJS0VZX05FWFQKLU5vU3ltYm9sCUtFWV9SRVNUQVJUCi1Ob1N5bWJvbAlLRVlfU0xPVwotTm9TeW1ib2wJS0VZX1NIVUZGTEUKLU5vU3ltYm9sCUtFWV9CUkVBSwotTm9TeW1ib2wJS0VZX1BSRVZJT1VTCi1Ob1N5bWJvbAlLRVlfRElHSVRTCi1Ob1N5bWJvbAlLRVlfVEVFTgotTm9TeW1ib2wJS0VZX1RXRU4KLQotTm9TeW1ib2wJS0VZX0RFTF9FT0wKLU5vU3ltYm9sCUtFWV9ERUxfRU9TCi1Ob1N5bWJvbAlLRVlfSU5TX0xJTkUKLU5vU3ltYm9sCUtFWV9ERUxfTElORQotTm9TeW1ib2wJS0VZX01BWAotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS94MTF2bmMvdWlucHV0LmggYi94MTF2bmMvdWlucHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NmU5N2MuLjAwMDAwMDAKLS0tIGEveDExdm5jL3VpbnB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfVUlOUFVUX0gKLSNkZWZpbmUgX1gxMVZOQ19VSU5QVVRfSAotCi0vKiAtLSB1aW5wdXQuaCAtLSAqLwotCi1leHRlcm4gaW50IGNoZWNrX3VpbnB1dCh2b2lkKTsKLWV4dGVybiBpbnQgaW5pdGlhbGl6ZV91aW5wdXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzaHV0ZG93bl91aW5wdXQodm9pZCk7Ci1leHRlcm4gaW50IHNldF91aW5wdXRfYWNjZWwoY2hhciAqc3RyKTsKLWV4dGVybiBpbnQgc2V0X3VpbnB1dF90aHJlc2goY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIHNldF91aW5wdXRfcmVzZXQoaW50IG1zKTsKLWV4dGVybiB2b2lkIHNldF91aW5wdXRfYWx3YXlzKGludCk7Ci1leHRlcm4gdm9pZCBzZXRfdWlucHV0X3RvdWNoc2NyZWVuKGludCk7Ci1leHRlcm4gdm9pZCBzZXRfdWlucHV0X2FicyhpbnQpOwotZXh0ZXJuIGNoYXIgKmdldF91aW5wdXRfYWNjZWwoKTsKLWV4dGVybiBjaGFyICpnZXRfdWlucHV0X3RocmVzaCgpOwotZXh0ZXJuIGludCBnZXRfdWlucHV0X3Jlc2V0KCk7Ci1leHRlcm4gaW50IGdldF91aW5wdXRfYWx3YXlzKCk7Ci1leHRlcm4gaW50IGdldF91aW5wdXRfdG91Y2hzY3JlZW4oKTsKLWV4dGVybiBpbnQgZ2V0X3VpbnB1dF9hYnMoKTsKLWV4dGVybiB2b2lkIHBhcnNlX3VpbnB1dF9zdHIoY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIHVpbnB1dF9wb2ludGVyX2NvbW1hbmQoaW50IG1hc2ssIGludCB4LCBpbnQgeSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1leHRlcm4gdm9pZCB1aW5wdXRfa2V5X2NvbW1hbmQoaW50IGRvd24sIGludCBrZXlzeW0sIHJmYkNsaWVudFB0ciBjbGllbnQpOwotCi0KLQotI2VuZGlmIC8qIF9YMTFWTkNfVUlOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy91bml4cHcuYyBiL3gxMXZuYy91bml4cHcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkYjE5NS4uMDAwMDAwMAotLS0gYS94MTF2bmMvdW5peHB3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjgxICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gdW5peHB3LmMgLS0gKi8KLQotI2lmZGVmIF9fbGludXhfXwotLyogc29tZSBjb25mbGljdCB3aXRoIF9YT1BFTl9TT1VSQ0UgKi8KLWV4dGVybiBpbnQgZ3JhbnRwdChpbnQpOwotZXh0ZXJuIGludCB1bmxvY2twdChpbnQpOwotZXh0ZXJuIGNoYXIgKnB0c25hbWUoaW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIERPX05PVF9ERUNMQVJFX0NSWVBUCi1leHRlcm4gY2hhciAqY3J5cHQoY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAieGluZXJhbWEuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInNzbGhlbHBlci5oIgotI2luY2x1ZGUgImN1cnNvci5oIgotI2luY2x1ZGUgInJhdGVzLmgiCi0jaW5jbHVkZSA8cmZiL2RlZmF1bHQ4eDE2Lmg+Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1dBSVRfSCAmJiBMSUJWTkNTRVJWRVJfSEFWRV9XQUlUUElECi0jZGVmaW5lIFVOSVhQV19TVQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIElHTk9SRV9HRVRTUE5BTQotI3VuZGVmIExJQlZOQ1NFUlZFUl9IQVZFX0dFVFNQTkFNCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX0dFVFNQTkFNIDAKLSNlbmRpZgotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUFdEX0ggJiYgTElCVk5DU0VSVkVSX0hBVkVfR0VUUFdOQU0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9DUllQVCB8fCBMSUJWTkNTRVJWRVJfSEFWRV9MSUJDUllQVAotI2RlZmluZSBVTklYUFdfQ1JZUFQKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9HRVRTUE5BTQotI2luY2x1ZGUgPHNoYWRvdy5oPgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX0lPQ1RMX0gKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1RFUk1JT1NfSAotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNlbmRpZgotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19TVFJPUFRTX0gKLSNpbmNsdWRlIDxzeXMvc3Ryb3B0cy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCi0jZGVmaW5lIElTX0JTRAotI2VuZGlmCi0jaWYgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKLSNkZWZpbmUgSVNfQlNECi0jZW5kaWYKLQotaW50IHdoaXRlX3BpeGVsKHZvaWQpOwotdm9pZCB1bml4cHdfc2NyZWVuKGludCBpbml0KTsKLXZvaWQgdW5peHB3X2tleXN0cm9rZShyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIGludCBpbml0KTsKLXZvaWQgdW5peHB3X2FjY2VwdChjaGFyICp1c2VyKTsKLXZvaWQgdW5peHB3X2Rlbnkodm9pZCk7Ci12b2lkIHVuaXhwd19tc2coY2hhciAqbXNnLCBpbnQgZGVsYXkpOwotaW50IHN1X3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpwYXNzLCBjaGFyICpjbWQsIGNoYXIgKnJidWYsIGludCAqcmJ1Zl9zaXplLCBpbnQgbm9kaXNwKTsKLWludCB1bml4cHdfY21kX3J1bihjaGFyICp1c2VyLCBjaGFyICpwYXNzLCBjaGFyICpjbWQsIGNoYXIgKmxpbmUsIGludCAqbik7Ci1pbnQgY3J5cHRfdmVyaWZ5KGNoYXIgKnVzZXIsIGNoYXIgKnBhc3MpOwotaW50IGNtZF92ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcyk7Ci12b2lkIHVuaXhwd192ZXJpZnlfc2NyZWVuKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3MpOwotCi1zdGF0aWMgaW50IHRleHRfeCh2b2lkKTsKLXN0YXRpYyBpbnQgdGV4dF95KHZvaWQpOwotc3RhdGljIHZvaWQgc2V0X2RiKHZvaWQpOwotCi1pbnQgdW5peHB3X2luX3Byb2dyZXNzID0gMDsKLWludCB1bml4cHdfZGVuaWVkID0gMDsKLWludCB1bml4cHdfaW5fcmZiUEUgPSAwOwotaW50IHVuaXhwd19sb2dpbl92aWV3b25seSA9IDA7Ci1pbnQgdW5peHB3X3RpZ2h0dm5jX3hmZXJfc2F2ZSA9IDA7Ci1yZmJCb29sIHVuaXhwd19maWxlX3hmZXJfc2F2ZSA9IEZBTFNFOwotdGltZV90IHVuaXhwd19sYXN0X3RyeV90aW1lID0gMDsKLXJmYkNsaWVudFB0ciB1bml4cHdfY2xpZW50ID0gTlVMTDsKLQotaW50IGtlZXBfdW5peHB3ID0gMDsKLWNoYXIgKmtlZXBfdW5peHB3X3VzZXIgPSBOVUxMOwotY2hhciAqa2VlcF91bml4cHdfcGFzcyA9IE5VTEw7Ci1jaGFyICprZWVwX3VuaXhwd19vcHRzID0gTlVMTDsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVmYXVsdDZ4MTNGb250RGF0YVsyODk5XT17Ci0weDAwLDB4MDAsMHhBOCwweDAwLDB4ODgsMHgwMCwweDg4LDB4MDAsMHg4OCwweDAwLDB4QTgsMHgwMCwweDAwLCAvKiAwICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHg3MCwweEY4LDB4NzAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxICovCi0weEE4LDB4NTQsMHhBOCwweDU0LDB4QTgsMHg1NCwweEE4LDB4NTQsMHhBOCwweDU0LDB4QTgsMHg1NCwweEE4LCAvKiAyICovCi0weDAwLDB4MDAsMHhBMCwweEEwLDB4RTAsMHhBMCwweEEwLDB4MzgsMHgxMCwweDEwLDB4MTAsMHgwMCwweDAwLCAvKiAzICovCi0weDAwLDB4MDAsMHhFMCwweDgwLDB4QzAsMHg4MCwweEI4LDB4MjAsMHgzMCwweDIwLDB4MjAsMHgwMCwweDAwLCAvKiA0ICovCi0weDAwLDB4MDAsMHg2MCwweDgwLDB4ODAsMHg2MCwweDMwLDB4MjgsMHgzMCwweDI4LDB4MjgsMHgwMCwweDAwLCAvKiA1ICovCi0weDAwLDB4MDAsMHg4MCwweDgwLDB4ODAsMHhFMCwweDM4LDB4MjAsMHgzMCwweDIwLDB4MjAsMHgwMCwweDAwLCAvKiA2ICovCi0weDAwLDB4MDAsMHgzMCwweDQ4LDB4NDgsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiA3ICovCi0weDAwLDB4MDAsMHgwMCwweDIwLDB4MjAsMHhGOCwweDIwLDB4MjAsMHgwMCwweEY4LDB4MDAsMHgwMCwweDAwLCAvKiA4ICovCi0weDAwLDB4MDAsMHg5MCwweEQwLDB4QjAsMHg5MCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MzgsMHgwMCwweDAwLCAvKiA5ICovCi0weDAwLDB4MDAsMHhBMCwweEEwLDB4QTAsMHg0MCwweDQwLDB4MzgsMHgxMCwweDEwLDB4MTAsMHgwMCwweDAwLCAvKiAxMCAqLwotMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHhFMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTEgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RTAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsIC8qIDEyICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNDLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLCAvKiAxMyAqLwotMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgzQywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTQgKi8KLTB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4RkMsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsIC8qIDE1ICovCi0weEZDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxNiAqLwotMHgwMCwweDAwLDB4MDAsMHhGQywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTcgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE4ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEZDLDB4MDAsMHgwMCwweDAwLCAvKiAxOSAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGQywgLyogMjAgKi8KLTB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4M0MsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsIC8qIDIxICovCi0weDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweEUwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLCAvKiAyMiAqLwotMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHhGQywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMjMgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkMsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsIC8qIDI0ICovCi0weDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLCAvKiAyNSAqLwotMHgwMCwweDAwLDB4MDAsMHgxOCwweDYwLDB4ODAsMHg2MCwweDE4LDB4MDAsMHhGOCwweDAwLDB4MDAsMHgwMCwgLyogMjYgKi8KLTB4MDAsMHgwMCwweDAwLDB4QzAsMHgzMCwweDA4LDB4MzAsMHhDMCwweDAwLDB4RjgsMHgwMCwweDAwLDB4MDAsIC8qIDI3ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGOCwweDUwLDB4NTAsMHg1MCwweDUwLDB4NTAsMHgwMCwweDAwLCAvKiAyOCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHhGOCwweDIwLDB4RjgsMHg4MCwweDAwLDB4MDAsMHgwMCwgLyogMjkgKi8KLTB4MDAsMHgwMCwweDMwLDB4NDgsMHg0MCwweDQwLDB4RTAsMHg0MCwweDQwLDB4NDgsMHhCMCwweDAwLDB4MDAsIC8qIDMwICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAzMSAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMzIgKi8KLTB4MDAsMHgwMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MDAsMHgyMCwweDAwLDB4MDAsIC8qIDMzICovCi0weDAwLDB4MDAsMHg1MCwweDUwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAzNCAqLwotMHgwMCwweDAwLDB4MDAsMHg1MCwweDUwLDB4RjgsMHg1MCwweEY4LDB4NTAsMHg1MCwweDAwLDB4MDAsMHgwMCwgLyogMzUgKi8KLTB4MDAsMHgwMCwweDIwLDB4NzgsMHhBMCwweEEwLDB4NzAsMHgyOCwweDI4LDB4RjAsMHgyMCwweDAwLDB4MDAsIC8qIDM2ICovCi0weDAwLDB4MDAsMHg0OCwweEE4LDB4NTAsMHgxMCwweDIwLDB4NDAsMHg1MCwweEE4LDB4OTAsMHgwMCwweDAwLCAvKiAzNyAqLwotMHgwMCwweDAwLDB4MDAsMHg0MCwweEEwLDB4QTAsMHg0MCwweEEwLDB4OTgsMHg5MCwweDY4LDB4MDAsMHgwMCwgLyogMzggKi8KLTB4MDAsMHgwMCwweDIwLDB4MjAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDM5ICovCi0weDAwLDB4MTAsMHgyMCwweDIwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDIwLDB4MjAsMHgxMCwweDAwLCAvKiA0MCAqLwotMHgwMCwweDQwLDB4MjAsMHgyMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgyMCwweDIwLDB4NDAsMHgwMCwgLyogNDEgKi8KLTB4MDAsMHgwMCwweDAwLDB4MjAsMHhBOCwweEY4LDB4NzAsMHhGOCwweEE4LDB4MjAsMHgwMCwweDAwLDB4MDAsIC8qIDQyICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgyMCwweEY4LDB4MjAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiA0MyAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDIwLDB4NDAsMHgwMCwgLyogNDQgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDQ1ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4NzAsMHgyMCwweDAwLCAvKiA0NiAqLwotMHgwMCwweDAwLDB4MDgsMHgwOCwweDEwLDB4MTAsMHgyMCwweDQwLDB4NDAsMHg4MCwweDgwLDB4MDAsMHgwMCwgLyogNDcgKi8KLTB4MDAsMHgwMCwweDIwLDB4NTAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NTAsMHgyMCwweDAwLDB4MDAsIC8qIDQ4ICovCi0weDAwLDB4MDAsMHgyMCwweDYwLDB4QTAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4RjgsMHgwMCwweDAwLCAvKiA0OSAqLwotMHgwMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4MDgsMHgxMCwweDIwLDB4NDAsMHg4MCwweEY4LDB4MDAsMHgwMCwgLyogNTAgKi8KLTB4MDAsMHgwMCwweEY4LDB4MDgsMHgxMCwweDIwLDB4NzAsMHgwOCwweDA4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDUxICovCi0weDAwLDB4MDAsMHgxMCwweDEwLDB4MzAsMHg1MCwweDUwLDB4OTAsMHhGOCwweDEwLDB4MTAsMHgwMCwweDAwLCAvKiA1MiAqLwotMHgwMCwweDAwLDB4RjgsMHg4MCwweDgwLDB4QjAsMHhDOCwweDA4LDB4MDgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogNTMgKi8KLTB4MDAsMHgwMCwweDcwLDB4ODgsMHg4MCwweDgwLDB4RjAsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDU0ICovCi0weDAwLDB4MDAsMHhGOCwweDA4LDB4MTAsMHgxMCwweDIwLDB4MjAsMHg0MCwweDQwLDB4NDAsMHgwMCwweDAwLCAvKiA1NSAqLwotMHgwMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg3MCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogNTYgKi8KLTB4MDAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4NzgsMHgwOCwweDA4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDU3ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHg3MCwweDIwLDB4MDAsMHgwMCwweDIwLDB4NzAsMHgyMCwweDAwLCAvKiA1OCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4NzAsMHgyMCwweDAwLDB4MDAsMHgzMCwweDIwLDB4NDAsMHgwMCwgLyogNTkgKi8KLTB4MDAsMHgwMCwweDA4LDB4MTAsMHgyMCwweDQwLDB4ODAsMHg0MCwweDIwLDB4MTAsMHgwOCwweDAwLDB4MDAsIC8qIDYwICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGOCwweDAwLDB4MDAsMHhGOCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiA2MSAqLwotMHgwMCwweDAwLDB4ODAsMHg0MCwweDIwLDB4MTAsMHgwOCwweDEwLDB4MjAsMHg0MCwweDgwLDB4MDAsMHgwMCwgLyogNjIgKi8KLTB4MDAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDA4LDB4MTAsMHgyMCwweDIwLDB4MDAsMHgyMCwweDAwLDB4MDAsIC8qIDYzICovCi0weDAwLDB4MDAsMHg3MCwweDg4LDB4ODgsMHg5OCwweEE4LDB4QTgsMHhCMCwweDgwLDB4NzgsMHgwMCwweDAwLCAvKiA2NCAqLwotMHgwMCwweDAwLDB4MjAsMHg1MCwweDg4LDB4ODgsMHg4OCwweEY4LDB4ODgsMHg4OCwweDg4LDB4MDAsMHgwMCwgLyogNjUgKi8KLTB4MDAsMHgwMCwweEYwLDB4NDgsMHg0OCwweDQ4LDB4NzAsMHg0OCwweDQ4LDB4NDgsMHhGMCwweDAwLDB4MDAsIC8qIDY2ICovCi0weDAwLDB4MDAsMHg3MCwweDg4LDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiA2NyAqLwotMHgwMCwweDAwLDB4RjAsMHg0OCwweDQ4LDB4NDgsMHg0OCwweDQ4LDB4NDgsMHg0OCwweEYwLDB4MDAsMHgwMCwgLyogNjggKi8KLTB4MDAsMHgwMCwweEY4LDB4ODAsMHg4MCwweDgwLDB4RjAsMHg4MCwweDgwLDB4ODAsMHhGOCwweDAwLDB4MDAsIC8qIDY5ICovCi0weDAwLDB4MDAsMHhGOCwweDgwLDB4ODAsMHg4MCwweEYwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHgwMCwweDAwLCAvKiA3MCAqLwotMHgwMCwweDAwLDB4NzAsMHg4OCwweDgwLDB4ODAsMHg4MCwweDk4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogNzEgKi8KLTB4MDAsMHgwMCwweDg4LDB4ODgsMHg4OCwweDg4LDB4RjgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDcyICovCi0weDAwLDB4MDAsMHg3MCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4NzAsMHgwMCwweDAwLCAvKiA3MyAqLwotMHgwMCwweDAwLDB4MzgsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHg5MCwweDYwLDB4MDAsMHgwMCwgLyogNzQgKi8KLTB4MDAsMHgwMCwweDg4LDB4ODgsMHg5MCwweEEwLDB4QzAsMHhBMCwweDkwLDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDc1ICovCi0weDAwLDB4MDAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4RjgsMHgwMCwweDAwLCAvKiA3NiAqLwotMHgwMCwweDAwLDB4ODgsMHg4OCwweEQ4LDB4QTgsMHhBOCwweDg4LDB4ODgsMHg4OCwweDg4LDB4MDAsMHgwMCwgLyogNzcgKi8KLTB4MDAsMHgwMCwweDg4LDB4QzgsMHhDOCwweEE4LDB4QTgsMHg5OCwweDk4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDc4ICovCi0weDAwLDB4MDAsMHg3MCwweDg4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiA3OSAqLwotMHgwMCwweDAwLDB4RjAsMHg4OCwweDg4LDB4ODgsMHhGMCwweDgwLDB4ODAsMHg4MCwweDgwLDB4MDAsMHgwMCwgLyogODAgKi8KLTB4MDAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4QTgsMHg3MCwweDA4LDB4MDAsIC8qIDgxICovCi0weDAwLDB4MDAsMHhGMCwweDg4LDB4ODgsMHg4OCwweEYwLDB4QTAsMHg5MCwweDg4LDB4ODgsMHgwMCwweDAwLCAvKiA4MiAqLwotMHgwMCwweDAwLDB4NzAsMHg4OCwweDgwLDB4ODAsMHg3MCwweDA4LDB4MDgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogODMgKi8KLTB4MDAsMHgwMCwweEY4LDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDAwLDB4MDAsIC8qIDg0ICovCi0weDAwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiA4NSAqLwotMHgwMCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg1MCwweDUwLDB4NTAsMHgyMCwweDIwLDB4MDAsMHgwMCwgLyogODYgKi8KLTB4MDAsMHgwMCwweDg4LDB4ODgsMHg4OCwweDg4LDB4QTgsMHhBOCwweEE4LDB4QTgsMHg1MCwweDAwLDB4MDAsIC8qIDg3ICovCi0weDAwLDB4MDAsMHg4OCwweDg4LDB4NTAsMHg1MCwweDIwLDB4NTAsMHg1MCwweDg4LDB4ODgsMHgwMCwweDAwLCAvKiA4OCAqLwotMHgwMCwweDAwLDB4ODgsMHg4OCwweDUwLDB4NTAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MDAsMHgwMCwgLyogODkgKi8KLTB4MDAsMHgwMCwweEY4LDB4MDgsMHgxMCwweDEwLDB4MjAsMHg0MCwweDQwLDB4ODAsMHhGOCwweDAwLDB4MDAsIC8qIDkwICovCi0weDAwLDB4NzAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg3MCwweDAwLCAvKiA5MSAqLwotMHgwMCwweDAwLDB4ODAsMHg4MCwweDQwLDB4NDAsMHgyMCwweDEwLDB4MTAsMHgwOCwweDA4LDB4MDAsMHgwMCwgLyogOTIgKi8KLTB4MDAsMHg3MCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDcwLDB4MDAsIC8qIDkzICovCi0weDAwLDB4MDAsMHgyMCwweDUwLDB4ODgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiA5NCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RjgsMHgwMCwgLyogOTUgKi8KLTB4MDAsMHgyMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDk2ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3MCwweDA4LDB4NzgsMHg4OCwweDk4LDB4NjgsMHgwMCwweDAwLCAvKiA5NyAqLwotMHgwMCwweDAwLDB4ODAsMHg4MCwweDgwLDB4RjAsMHg4OCwweDg4LDB4ODgsMHg4OCwweEYwLDB4MDAsMHgwMCwgLyogOTggKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDcwLDB4ODgsMHg4MCwweDgwLDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDk5ICovCi0weDAwLDB4MDAsMHgwOCwweDA4LDB4MDgsMHg3OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzgsMHgwMCwweDAwLCAvKiAxMDAgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDcwLDB4ODgsMHhGOCwweDgwLDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDEwMSAqLwotMHgwMCwweDAwLDB4MzAsMHg0OCwweDQwLDB4NDAsMHhGMCwweDQwLDB4NDAsMHg0MCwweDQwLDB4MDAsMHgwMCwgLyogMTAyICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3MCwweDg4LDB4ODgsMHg4OCwweDc4LDB4MDgsMHg4OCwweDcwLCAvKiAxMDMgKi8KLTB4MDAsMHgwMCwweDgwLDB4ODAsMHg4MCwweEIwLDB4QzgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDEwNCAqLwotMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4NjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDcwLDB4MDAsMHgwMCwgLyogMTA1ICovCi0weDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgzMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4OTAsMHg5MCwweDYwLCAvKiAxMDYgKi8KLTB4MDAsMHgwMCwweDgwLDB4ODAsMHg4MCwweDkwLDB4QTAsMHhDMCwweEEwLDB4OTAsMHg4OCwweDAwLDB4MDAsIC8qIDEwNyAqLwotMHgwMCwweDAwLDB4NjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDcwLDB4MDAsMHgwMCwgLyogMTA4ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhEMCwweEE4LDB4QTgsMHhBOCwweEE4LDB4ODgsMHgwMCwweDAwLCAvKiAxMDkgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEIwLDB4QzgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDExMCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMTExICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGMCwweDg4LDB4ODgsMHg4OCwweEYwLDB4ODAsMHg4MCwweDgwLCAvKiAxMTIgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDc4LDB4ODgsMHg4OCwweDg4LDB4NzgsMHgwOCwweDA4LDB4MDgsIC8qIDExMyAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QjAsMHhDOCwweDgwLDB4ODAsMHg4MCwweDgwLDB4MDAsMHgwMCwgLyogMTE0ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3MCwweDg4LDB4NjAsMHgxMCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAxMTUgKi8KLTB4MDAsMHgwMCwweDAwLDB4NDAsMHg0MCwweEYwLDB4NDAsMHg0MCwweDQwLDB4NDgsMHgzMCwweDAwLDB4MDAsIC8qIDExNiAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg5OCwweDY4LDB4MDAsMHgwMCwgLyogMTE3ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg1MCwweDUwLDB4MjAsMHgwMCwweDAwLCAvKiAxMTggKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDg4LDB4ODgsMHhBOCwweEE4LDB4QTgsMHg1MCwweDAwLDB4MDAsIC8qIDExOSAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODgsMHg1MCwweDIwLDB4MjAsMHg1MCwweDg4LDB4MDAsMHgwMCwgLyogMTIwICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg5OCwweDY4LDB4MDgsMHg4OCwweDcwLCAvKiAxMjEgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEY4LDB4MTAsMHgyMCwweDQwLDB4ODAsMHhGOCwweDAwLDB4MDAsIC8qIDEyMiAqLwotMHgwMCwweDE4LDB4MjAsMHgyMCwweDIwLDB4MjAsMHhDMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MTgsMHgwMCwgLyogMTIzICovCi0weDAwLDB4MDAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgwMCwweDAwLCAvKiAxMjQgKi8KLTB4MDAsMHhDMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MTgsMHgyMCwweDIwLDB4MjAsMHgyMCwweEMwLDB4MDAsIC8qIDEyNSAqLwotMHgwMCwweDAwLDB4NDgsMHhBOCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTI2ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxNjAgKi8KLTB4MDAsMHgwMCwweDIwLDB4MDAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDAwLDB4MDAsIC8qIDE2MSAqLwotMHgwMCwweDAwLDB4MjAsMHg3MCwweEE4LDB4QTAsMHhBMCwweEE4LDB4NzAsMHgyMCwweDAwLDB4MDAsMHgwMCwgLyogMTYyICovCi0weDAwLDB4MDAsMHgzMCwweDQ4LDB4NDAsMHg0MCwweEUwLDB4NDAsMHg0MCwweDQ4LDB4QjAsMHgwMCwweDAwLCAvKiAxNjMgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg4OCwweDcwLDB4NTAsMHg1MCwweDcwLDB4ODgsMHgwMCwweDAwLDB4MDAsIC8qIDE2NCAqLwotMHgwMCwweDAwLDB4ODgsMHg4OCwweDUwLDB4NTAsMHhGOCwweDIwLDB4RjgsMHgyMCwweDIwLDB4MDAsMHgwMCwgLyogMTY1ICovCi0weDAwLDB4MDAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDAwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgwMCwweDAwLCAvKiAxNjYgKi8KLTB4MDAsMHgzMCwweDQ4LDB4NDAsMHgzMCwweDQ4LDB4NDgsMHgzMCwweDA4LDB4NDgsMHgzMCwweDAwLDB4MDAsIC8qIDE2NyAqLwotMHgwMCwweDUwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTY4ICovCi0weDAwLDB4NzAsMHg4OCwweEE4LDB4RDgsMHhDOCwweEQ4LDB4QTgsMHg4OCwweDcwLDB4MDAsMHgwMCwweDAwLCAvKiAxNjkgKi8KLTB4MDAsMHgwMCwweDcwLDB4MDgsMHg3OCwweDg4LDB4NzgsMHgwMCwweEY4LDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE3MCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LDB4NTAsMHhBMCwweEEwLDB4NTAsMHgyOCwweDAwLDB4MDAsMHgwMCwgLyogMTcxICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEY4LDB4MDgsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxNzIgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE3MyAqLwotMHgwMCwweDcwLDB4ODgsMHhFOCwweEQ4LDB4RDgsMHhFOCwweEQ4LDB4ODgsMHg3MCwweDAwLDB4MDAsMHgwMCwgLyogMTc0ICovCi0weDAwLDB4MDAsMHhGOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxNzUgKi8KLTB4MDAsMHgwMCwweDMwLDB4NDgsMHg0OCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE3NiAqLwotMHgwMCwweDAwLDB4MDAsMHgyMCwweDIwLDB4RjgsMHgyMCwweDIwLDB4MDAsMHhGOCwweDAwLDB4MDAsMHgwMCwgLyogMTc3ICovCi0weDAwLDB4NDAsMHhBMCwweDIwLDB4NDAsMHhFMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAvKiAxNzggKi8KLTB4MDAsMHg0MCwweEEwLDB4NDAsMHgyMCwweEMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE3OSAqLwotMHgwMCwweDEwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTgwICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDk4LDB4RTgsMHg4MCwweDgwLCAvKiAxODEgKi8KLTB4MDAsMHgwMCwweDc4LDB4RTgsMHhFOCwweEU4LDB4RTgsMHg2OCwweDI4LDB4MjgsMHgyOCwweDAwLDB4MDAsIC8qIDE4MiAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTgzICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDIwLCAvKiAxODQgKi8KLTB4MDAsMHg0MCwweEMwLDB4NDAsMHg0MCwweEUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIC8qIDE4NSAqLwotMHgwMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4RjgsMHgwMCwweDAwLDB4MDAsMHgwMCwgLyogMTg2ICovCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4QTAsMHg1MCwweDI4LDB4MjgsMHg1MCwweEEwLDB4MDAsMHgwMCwweDAwLCAvKiAxODcgKi8KLTB4MDAsMHg0MCwweEMwLDB4NDAsMHg0MCwweEUwLDB4MDgsMHgxOCwweDI4LDB4MzgsMHgwOCwweDAwLDB4MDAsIC8qIDE4OCAqLwotMHgwMCwweDQwLDB4QzAsMHg0MCwweDQwLDB4RTAsMHgxMCwweDI4LDB4MDgsMHgxMCwweDM4LDB4MDAsMHgwMCwgLyogMTg5ICovCi0weDAwLDB4NDAsMHhBMCwweDQwLDB4MjAsMHhBMCwweDQ4LDB4MTgsMHgyOCwweDM4LDB4MDgsMHgwMCwweDAwLCAvKiAxOTAgKi8KLTB4MDAsMHgwMCwweDIwLDB4MDAsMHgyMCwweDIwLDB4NDAsMHg4MCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDE5MSAqLwotMHgwMCwweDQwLDB4MjAsMHgwMCwweDIwLDB4NTAsMHg4OCwweDg4LDB4RjgsMHg4OCwweDg4LDB4MDAsMHgwMCwgLyogMTkyICovCi0weDAwLDB4MTAsMHgyMCwweDAwLDB4MjAsMHg1MCwweDg4LDB4ODgsMHhGOCwweDg4LDB4ODgsMHgwMCwweDAwLCAvKiAxOTMgKi8KLTB4MDAsMHgzMCwweDQ4LDB4MDAsMHgyMCwweDUwLDB4ODgsMHg4OCwweEY4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDE5NCAqLwotMHgwMCwweDI4LDB4NTAsMHgwMCwweDIwLDB4NTAsMHg4OCwweDg4LDB4RjgsMHg4OCwweDg4LDB4MDAsMHgwMCwgLyogMTk1ICovCi0weDAwLDB4NTAsMHg1MCwweDAwLDB4MjAsMHg1MCwweDg4LDB4ODgsMHhGOCwweDg4LDB4ODgsMHgwMCwweDAwLCAvKiAxOTYgKi8KLTB4MDAsMHgyMCwweDUwLDB4MjAsMHgyMCwweDUwLDB4ODgsMHg4OCwweEY4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDE5NyAqLwotMHgwMCwweDAwLDB4NTgsMHhBMCwweEEwLDB4QTAsMHhCMCwweEUwLDB4QTAsMHhBMCwweEI4LDB4MDAsMHgwMCwgLyogMTk4ICovCi0weDAwLDB4MDAsMHg3MCwweDg4LDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDg4LDB4NzAsMHgyMCwweDQwLCAvKiAxOTkgKi8KLTB4MDAsMHg0MCwweDIwLDB4MDAsMHhGOCwweDgwLDB4ODAsMHhGMCwweDgwLDB4ODAsMHhGOCwweDAwLDB4MDAsIC8qIDIwMCAqLwotMHgwMCwweDEwLDB4MjAsMHgwMCwweEY4LDB4ODAsMHg4MCwweEYwLDB4ODAsMHg4MCwweEY4LDB4MDAsMHgwMCwgLyogMjAxICovCi0weDAwLDB4MzAsMHg0OCwweDAwLDB4RjgsMHg4MCwweDgwLDB4RjAsMHg4MCwweDgwLDB4RjgsMHgwMCwweDAwLCAvKiAyMDIgKi8KLTB4MDAsMHg1MCwweDUwLDB4MDAsMHhGOCwweDgwLDB4ODAsMHhGMCwweDgwLDB4ODAsMHhGOCwweDAwLDB4MDAsIC8qIDIwMyAqLwotMHgwMCwweDQwLDB4MjAsMHgwMCwweDcwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDcwLDB4MDAsMHgwMCwgLyogMjA0ICovCi0weDAwLDB4MTAsMHgyMCwweDAwLDB4NzAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4NzAsMHgwMCwweDAwLCAvKiAyMDUgKi8KLTB4MDAsMHgzMCwweDQ4LDB4MDAsMHg3MCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHg3MCwweDAwLDB4MDAsIC8qIDIwNiAqLwotMHgwMCwweDUwLDB4NTAsMHgwMCwweDcwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDcwLDB4MDAsMHgwMCwgLyogMjA3ICovCi0weDAwLDB4MDAsMHhGMCwweDQ4LDB4NDgsMHg0OCwweEU4LDB4NDgsMHg0OCwweDQ4LDB4RjAsMHgwMCwweDAwLCAvKiAyMDggKi8KLTB4MDAsMHgyOCwweDUwLDB4MDAsMHg4OCwweDg4LDB4QzgsMHhBOCwweDk4LDB4ODgsMHg4OCwweDAwLDB4MDAsIC8qIDIwOSAqLwotMHgwMCwweDQwLDB4MjAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjEwICovCi0weDAwLDB4MTAsMHgyMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMTEgKi8KLTB4MDAsMHgzMCwweDQ4LDB4MDAsMHg3MCwweDg4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDIxMiAqLwotMHgwMCwweDI4LDB4NTAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjEzICovCi0weDAwLDB4NTAsMHg1MCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMTQgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDg4LDB4NTAsMHgyMCwweDUwLDB4ODgsMHgwMCwweDAwLDB4MDAsIC8qIDIxNSAqLwotMHgwMCwweDA4LDB4NzAsMHg5OCwweDk4LDB4QTgsMHhBOCwweEE4LDB4QzgsMHhDOCwweDcwLDB4ODAsMHgwMCwgLyogMjE2ICovCi0weDAwLDB4NDAsMHgyMCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMTcgKi8KLTB4MDAsMHgxMCwweDIwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDIxOCAqLwotMHgwMCwweDMwLDB4NDgsMHgwMCwweDg4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjE5ICovCi0weDAwLDB4NTAsMHg1MCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMjAgKi8KLTB4MDAsMHgxMCwweDIwLDB4MDAsMHg4OCwweDg4LDB4NTAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDAwLDB4MDAsIC8qIDIyMSAqLwotMHgwMCwweDAwLDB4ODAsMHhGMCwweDg4LDB4ODgsMHg4OCwweEYwLDB4ODAsMHg4MCwweDgwLDB4MDAsMHgwMCwgLyogMjIyICovCi0weDAwLDB4MDAsMHg2MCwweDkwLDB4OTAsMHhBMCwweEEwLDB4OTAsMHg4OCwweDg4LDB4QjAsMHgwMCwweDAwLCAvKiAyMjMgKi8KLTB4MDAsMHgwMCwweDQwLDB4MjAsMHgwMCwweDcwLDB4MDgsMHg3OCwweDg4LDB4OTgsMHg2OCwweDAwLDB4MDAsIC8qIDIyNCAqLwotMHgwMCwweDAwLDB4MTAsMHgyMCwweDAwLDB4NzAsMHgwOCwweDc4LDB4ODgsMHg5OCwweDY4LDB4MDAsMHgwMCwgLyogMjI1ICovCi0weDAwLDB4MDAsMHgzMCwweDQ4LDB4MDAsMHg3MCwweDA4LDB4NzgsMHg4OCwweDk4LDB4NjgsMHgwMCwweDAwLCAvKiAyMjYgKi8KLTB4MDAsMHgwMCwweDI4LDB4NTAsMHgwMCwweDcwLDB4MDgsMHg3OCwweDg4LDB4OTgsMHg2OCwweDAwLDB4MDAsIC8qIDIyNyAqLwotMHgwMCwweDAwLDB4NTAsMHg1MCwweDAwLDB4NzAsMHgwOCwweDc4LDB4ODgsMHg5OCwweDY4LDB4MDAsMHgwMCwgLyogMjI4ICovCi0weDAwLDB4MzAsMHg0OCwweDMwLDB4MDAsMHg3MCwweDA4LDB4NzgsMHg4OCwweDk4LDB4NjgsMHgwMCwweDAwLCAvKiAyMjkgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDcwLDB4MjgsMHg3MCwweEEwLDB4QTgsMHg1MCwweDAwLDB4MDAsIC8qIDIzMCAqLwotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzAsMHg4OCwweDgwLDB4ODAsMHg4OCwweDcwLDB4MjAsMHg0MCwgLyogMjMxICovCi0weDAwLDB4MDAsMHg0MCwweDIwLDB4MDAsMHg3MCwweDg4LDB4RjgsMHg4MCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMzIgKi8KLTB4MDAsMHgwMCwweDEwLDB4MjAsMHgwMCwweDcwLDB4ODgsMHhGOCwweDgwLDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDIzMyAqLwotMHgwMCwweDAwLDB4MzAsMHg0OCwweDAwLDB4NzAsMHg4OCwweEY4LDB4ODAsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjM0ICovCi0weDAwLDB4MDAsMHg1MCwweDUwLDB4MDAsMHg3MCwweDg4LDB4RjgsMHg4MCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyMzUgKi8KLTB4MDAsMHgwMCwweDQwLDB4MjAsMHgwMCwweDYwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHg3MCwweDAwLDB4MDAsIC8qIDIzNiAqLwotMHgwMCwweDAwLDB4MTAsMHgyMCwweDAwLDB4NjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDcwLDB4MDAsMHgwMCwgLyogMjM3ICovCi0weDAwLDB4MDAsMHgzMCwweDQ4LDB4MDAsMHg2MCwweDIwLDB4MjAsMHgyMCwweDIwLDB4NzAsMHgwMCwweDAwLCAvKiAyMzggKi8KLTB4MDAsMHgwMCwweDUwLDB4NTAsMHgwMCwweDYwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHg3MCwweDAwLDB4MDAsIC8qIDIzOSAqLwotMHgwMCwweDUwLDB4MjAsMHg2MCwweDEwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjQwICovCi0weDAwLDB4MDAsMHgyOCwweDUwLDB4MDAsMHhCMCwweEM4LDB4ODgsMHg4OCwweDg4LDB4ODgsMHgwMCwweDAwLCAvKiAyNDEgKi8KLTB4MDAsMHgwMCwweDQwLDB4MjAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDI0MiAqLwotMHgwMCwweDAwLDB4MTAsMHgyMCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjQzICovCi0weDAwLDB4MDAsMHgzMCwweDQ4LDB4MDAsMHg3MCwweDg4LDB4ODgsMHg4OCwweDg4LDB4NzAsMHgwMCwweDAwLCAvKiAyNDQgKi8KLTB4MDAsMHgwMCwweDI4LDB4NTAsMHgwMCwweDcwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg3MCwweDAwLDB4MDAsIC8qIDI0NSAqLwotMHgwMCwweDAwLDB4NTAsMHg1MCwweDAwLDB4NzAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDcwLDB4MDAsMHgwMCwgLyogMjQ2ICovCi0weDAwLDB4MDAsMHgwMCwweDIwLDB4MjAsMHgwMCwweEY4LDB4MDAsMHgyMCwweDIwLDB4MDAsMHgwMCwweDAwLCAvKiAyNDcgKi8KLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDcwLDB4OTgsMHhBOCwweEE4LDB4QzgsMHg3MCwweDgwLDB4MDAsIC8qIDI0OCAqLwotMHgwMCwweDAwLDB4NDAsMHgyMCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg5OCwweDY4LDB4MDAsMHgwMCwgLyogMjQ5ICovCi0weDAwLDB4MDAsMHgxMCwweDIwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg4OCwweDk4LDB4NjgsMHgwMCwweDAwLCAvKiAyNTAgKi8KLTB4MDAsMHgwMCwweDMwLDB4NDgsMHgwMCwweDg4LDB4ODgsMHg4OCwweDg4LDB4OTgsMHg2OCwweDAwLDB4MDAsIC8qIDI1MSAqLwotMHgwMCwweDAwLDB4NTAsMHg1MCwweDAwLDB4ODgsMHg4OCwweDg4LDB4ODgsMHg5OCwweDY4LDB4MDAsMHgwMCwgLyogMjUyICovCi0weDAwLDB4MDAsMHgxMCwweDIwLDB4MDAsMHg4OCwweDg4LDB4ODgsMHg5OCwweDY4LDB4MDgsMHg4OCwweDcwLCAvKiAyNTMgKi8KLTB4MDAsMHgwMCwweDAwLDB4ODAsMHg4MCwweEIwLDB4QzgsMHg4OCwweDg4LDB4QzgsMHhCMCwweDgwLDB4ODAsIC8qIDI1NCAqLwotMHgwMCwweDAwLDB4NTAsMHg1MCwweDAwLDB4ODgsMHg4OCwweDg4LDB4OTgsMHg2OCwweDA4LDB4ODgsMHg3MCwgLyogMjU1ICovCi19Owotc3RhdGljIGludCBkZWZhdWx0NngxM0ZvbnRNZXRhRGF0YVsyNTYqNV09ewotMCw2LDEzLDAsLTIsMTMsNiwxMywwLC0yLDI2LDYsMTMsMCwtMiwzOSw2LDEzLDAsLTIsNTIsNiwxMywwLC0yLDY1LDYsMTMsMCwtMiw3OCw2LDEzLDAsLTIsOTEsNiwxMywwLC0yLDEwNCw2LDEzLDAsLTIsMTE3LDYsMTMsMCwtMiwxMzAsNiwxMywwLC0yLDE0Myw2LDEzLDAsLTIsMTU2LDYsMTMsMCwtMiwxNjksNiwxMywwLC0yLDE4Miw2LDEzLDAsLTIsMTk1LDYsMTMsMCwtMiwyMDgsNiwxMywwLC0yLDIyMSw2LDEzLDAsLTIsMjM0LDYsMTMsMCwtMiwyNDcsNiwxMywwLC0yLDI2MCw2LDEzLDAsLTIsMjczLDYsMTMsMCwtMiwyODYsNiwxMywwLC0yLDI5OSw2LDEzLDAsLTIsMzEyLDYsMTMsMCwtMiwzMjUsNiwxMywwLC0yLDMzOCw2LDEzLDAsLTIsMzUxLDYsMTMsMCwtMiwzNjQsNiwxMywwLC0yLDM3Nyw2LDEzLDAsLTIsMzkwLDYsMTMsMCwtMiw0MDMsNiwxMywwLC0yLDQxNiw2LDEzLDAsLTIsNDI5LDYsMTMsMCwtMiw0NDIsNiwxMywwLC0yLDQ1NSw2LDEzLDAsLTIsNDY4LDYsMTMsMCwtMiw0ODEsNiwxMywwLC0yLDQ5NCw2LDEzLDAsLTIsNTA3LDYsMTMsMCwtMiw1MjAsNiwxMywwLC0yLDUzMyw2LDEzLDAsLTIsNTQ2LDYsMTMsMCwtMiw1NTksNiwxMywwLC0yLDU3Miw2LDEzLDAsLTIsNTg1LDYsMTMsMCwtMiw1OTgsNiwxMywwLC0yLDYxMSw2LDEzLDAsLTIsNjI0LDYsMTMsMCwtMiw2MzcsNiwxMywwLC0yLDY1MCw2LDEzLDAsLTIsNjYzLDYsMTMsMCwtMiw2NzYsNiwxMywwLC0yLDY4OSw2LDEzLDAsLTIsNzAyLDYsMTMsMCwtMiw3MTUsNiwxMywwLC0yLDcyOCw2LDEzLDAsLTIsNzQxLDYsMTMsMCwtMiw3NTQsNiwxMywwLC0yLDc2Nyw2LDEzLDAsLTIsNzgwLDYsMTMsMCwtMiw3OTMsNiwxMywwLC0yLDgwNiw2LDEzLDAsLTIsODE5LDYsMTMsMCwtMiw4MzIsNiwxMywwLC0yLDg0NSw2LDEzLDAsLTIsODU4LDYsMTMsMCwtMiw4NzEsNiwxMywwLC0yLDg4NCw2LDEzLDAsLTIsODk3LDYsMTMsMCwtMiw5MTAsNiwxMywwLC0yLDkyMyw2LDEzLDAsLTIsOTM2LDYsMTMsMCwtMiw5NDksNiwxMywwLC0yLDk2Miw2LDEzLDAsLTIsOTc1LDYsMTMsMCwtMiw5ODgsNiwxMywwLC0yLDEwMDEsNiwxMywwLC0yLDEwMTQsNiwxMywwLC0yLDEwMjcsNiwxMywwLC0yLDEwNDAsNiwxMywwLC0yLDEwNTMsNiwxMywwLC0yLDEwNjYsNiwxMywwLC0yLDEwNzksNiwxMywwLC0yLDEwOTIsNiwxMywwLC0yLDExMDUsNiwxMywwLC0yLDExMTgsNiwxMywwLC0yLDExMzEsNiwxMywwLC0yLDExNDQsNiwxMywwLC0yLDExNTcsNiwxMywwLC0yLDExNzAsNiwxMywwLC0yLDExODMsNiwxMywwLC0yLDExOTYsNiwxMywwLC0yLDEyMDksNiwxMywwLC0yLDEyMjIsNiwxMywwLC0yLDEyMzUsNiwxMywwLC0yLDEyNDgsNiwxMywwLC0yLDEyNjEsNiwxMywwLC0yLDEyNzQsNiwxMywwLC0yLDEyODcsNiwxMywwLC0yLDEzMDAsNiwxMywwLC0yLDEzMTMsNiwxMywwLC0yLDEzMjYsNiwxMywwLC0yLDEzMzksNiwxMywwLC0yLDEzNTIsNiwxMywwLC0yLDEzNjUsNiwxMywwLC0yLDEzNzgsNiwxMywwLC0yLDEzOTEsNiwxMywwLC0yLDE0MDQsNiwxMywwLC0yLDE0MTcsNiwxMywwLC0yLDE0MzAsNiwxMywwLC0yLDE0NDMsNiwxMywwLC0yLDE0NTYsNiwxMywwLC0yLDE0NjksNiwxMywwLC0yLDE0ODIsNiwxMywwLC0yLDE0OTUsNiwxMywwLC0yLDE1MDgsNiwxMywwLC0yLDE1MjEsNiwxMywwLC0yLDE1MzQsNiwxMywwLC0yLDE1NDcsNiwxMywwLC0yLDE1NjAsNiwxMywwLC0yLDE1NzMsNiwxMywwLC0yLDE1ODYsNiwxMywwLC0yLDE1OTksNiwxMywwLC0yLDE2MTIsNiwxMywwLC0yLDE2MjUsNiwxMywwLC0yLDE2MzgsNiwxMywwLC0yLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE2NTEsNiwxMywwLC0yLDE2NjQsNiwxMywwLC0yLDE2NzcsNiwxMywwLC0yLDE2OTAsNiwxMywwLC0yLDE3MDMsNiwxMywwLC0yLDE3MTYsNiwxMywwLC0yLDE3MjksNiwxMywwLC0yLDE3NDIsNiwxMywwLC0yLDE3NTUsNiwxMywwLC0yLDE3NjgsNiwxMywwLC0yLDE3ODEsNiwxMywwLC0yLDE3OTQsNiwxMywwLC0yLDE4MDcsNiwxMywwLC0yLDE4MjAsNiwxMywwLC0yLDE4MzMsNiwxMywwLC0yLDE4NDYsNiwxMywwLC0yLDE4NTksNiwxMywwLC0yLDE4NzIsNiwxMywwLC0yLDE4ODUsNiwxMywwLC0yLDE4OTgsNiwxMywwLC0yLDE5MTEsNiwxMywwLC0yLDE5MjQsNiwxMywwLC0yLDE5MzcsNiwxMywwLC0yLDE5NTAsNiwxMywwLC0yLDE5NjMsNiwxMywwLC0yLDE5NzYsNiwxMywwLC0yLDE5ODksNiwxMywwLC0yLDIwMDIsNiwxMywwLC0yLDIwMTUsNiwxMywwLC0yLDIwMjgsNiwxMywwLC0yLDIwNDEsNiwxMywwLC0yLDIwNTQsNiwxMywwLC0yLDIwNjcsNiwxMywwLC0yLDIwODAsNiwxMywwLC0yLDIwOTMsNiwxMywwLC0yLDIxMDYsNiwxMywwLC0yLDIxMTksNiwxMywwLC0yLDIxMzIsNiwxMywwLC0yLDIxNDUsNiwxMywwLC0yLDIxNTgsNiwxMywwLC0yLDIxNzEsNiwxMywwLC0yLDIxODQsNiwxMywwLC0yLDIxOTcsNiwxMywwLC0yLDIyMTAsNiwxMywwLC0yLDIyMjMsNiwxMywwLC0yLDIyMzYsNiwxMywwLC0yLDIyNDksNiwxMywwLC0yLDIyNjIsNiwxMywwLC0yLDIyNzUsNiwxMywwLC0yLDIyODgsNiwxMywwLC0yLDIzMDEsNiwxMywwLC0yLDIzMTQsNiwxMywwLC0yLDIzMjcsNiwxMywwLC0yLDIzNDAsNiwxMywwLC0yLDIzNTMsNiwxMywwLC0yLDIzNjYsNiwxMywwLC0yLDIzNzksNiwxMywwLC0yLDIzOTIsNiwxMywwLC0yLDI0MDUsNiwxMywwLC0yLDI0MTgsNiwxMywwLC0yLDI0MzEsNiwxMywwLC0yLDI0NDQsNiwxMywwLC0yLDI0NTcsNiwxMywwLC0yLDI0NzAsNiwxMywwLC0yLDI0ODMsNiwxMywwLC0yLDI0OTYsNiwxMywwLC0yLDI1MDksNiwxMywwLC0yLDI1MjIsNiwxMywwLC0yLDI1MzUsNiwxMywwLC0yLDI1NDgsNiwxMywwLC0yLDI1NjEsNiwxMywwLC0yLDI1NzQsNiwxMywwLC0yLDI1ODcsNiwxMywwLC0yLDI2MDAsNiwxMywwLC0yLDI2MTMsNiwxMywwLC0yLDI2MjYsNiwxMywwLC0yLDI2MzksNiwxMywwLC0yLDI2NTIsNiwxMywwLC0yLDI2NjUsNiwxMywwLC0yLDI2NzgsNiwxMywwLC0yLDI2OTEsNiwxMywwLC0yLDI3MDQsNiwxMywwLC0yLDI3MTcsNiwxMywwLC0yLDI3MzAsNiwxMywwLC0yLDI3NDMsNiwxMywwLC0yLDI3NTYsNiwxMywwLC0yLDI3NjksNiwxMywwLC0yLDI3ODIsNiwxMywwLC0yLDI3OTUsNiwxMywwLC0yLDI4MDgsNiwxMywwLC0yLDI4MjEsNiwxMywwLC0yLDI4MzQsNiwxMywwLC0yLDI4NDcsNiwxMywwLC0yLDI4NjAsNiwxMywwLC0yLDI4NzMsNiwxMywwLC0yLDI4ODYsNiwxMywwLC0yLH07Ci1zdGF0aWMgcmZiRm9udERhdGEgZGVmYXVsdDZ4MTNGb250PXtkZWZhdWx0NngxM0ZvbnREYXRhLCBkZWZhdWx0NngxM0ZvbnRNZXRhRGF0YX07Ci0KLXN0YXRpYyBpbnQgaW5fbG9naW4gPSAwLCBpbl9wYXNzd2QgPSAwLCB0cmllcyA9IDA7Ci1zdGF0aWMgaW50IGNoYXJfcm93ID0gMCwgY2hhcl9jb2wgPSAwOwotc3RhdGljIGludCBjaGFyX3ggPSAwLCBjaGFyX3kgPSAwLCBjaGFyX3cgPSA4LCBjaGFyX2ggPSAxNjsKLQotc3RhdGljIGludCBkYiA9IDA7Ci0KLWludCB3aGl0ZV9waXhlbCh2b2lkKSB7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgYmxhY2tfcGl4ID0gMCwgd2hpdGVfcGl4ID0gMSwgc2V0ID0gMDsKLQotCVJBV0ZCX1JFVCgweGZmZmZmZikKLQotCWlmIChkZXB0aCA8PSA4ICYmICEgc2V0KSB7Ci0JCVhfTE9DSzsKLQkJYmxhY2tfcGl4ID0gQmxhY2tQaXhlbChkcHksIHNjcik7Ci0JCXdoaXRlX3BpeCA9IFdoaXRlUGl4ZWwoZHB5LCBzY3IpOwotCQlYX1VOTE9DSzsKLQkJc2V0ID0gMTsKLQl9Ci0JaWYgKGRlcHRoIDw9IDgpIHsKLQkJcmV0dXJuIChpbnQpIHdoaXRlX3BpeDsKLQl9IGVsc2UgaWYgKGRlcHRoIDwgMjQpIHsKLQkJcmV0dXJuIDB4ZmZmZjsKLQl9IGVsc2UgewotCQlyZXR1cm4gMHhmZmZmZmY7Ci0JfQotfQotCi1pbnQgYmxhY2tfcGl4ZWwodm9pZCkgewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGJsYWNrX3BpeCA9IDAsIHdoaXRlX3BpeCA9IDEsIHNldCA9IDA7Ci0KLQlSQVdGQl9SRVQoMHgwMDAwMDApCi0KLQlpZiAoZGVwdGggPD0gOCAmJiAhIHNldCkgewotCQlYX0xPQ0s7Ci0JCWJsYWNrX3BpeCA9IEJsYWNrUGl4ZWwoZHB5LCBzY3IpOwotCQl3aGl0ZV9waXggPSBXaGl0ZVBpeGVsKGRweSwgc2NyKTsKLQkJWF9VTkxPQ0s7Ci0JCXNldCA9IDE7Ci0JfQotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCXJldHVybiAoaW50KSBibGFja19waXg7Ci0JfSBlbHNlIGlmIChkZXB0aCA8IDI0KSB7Ci0JCXJldHVybiAweDAwMDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDB4MDAwMDAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdW5peHB3X21hcmsodm9pZCkgewotCWlmIChzY2FsaW5nKSB7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCBzY2FsZWRfeCwgc2NhbGVkX3ksIDEpOwotCX0gZWxzZSB7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCAwLCBkcHlfeCwgZHB5X3ksIDApOwotCX0KLX0KLQotc3RhdGljIGludCB0ZXh0X3godm9pZCkgewotCXJldHVybiBjaGFyX3ggKyBjaGFyX2NvbCAqIGNoYXJfdzsKLX0KLQotc3RhdGljIGludCB0ZXh0X3kodm9pZCkgewotCXJldHVybiBjaGFyX3kgKyBjaGFyX3JvdyAqIGNoYXJfaDsKLX0KLQotc3RhdGljIHJmYlNjcmVlbkluZm8gZnNjcmVlbjsKLXN0YXRpYyByZmJTY3JlZW5JbmZvUHRyIHBzY3JlZW47Ci0KLXN0YXRpYyBpbnQgZjFfaGVscCA9IDA7Ci0KLXZvaWQgdW5peHB3X3NjcmVlbihpbnQgaW5pdCkgewotCWlmICh1bml4cHdfY21kKSB7Ci0JCTsJLyogT0sgKi8KLQl9IGVsc2UgaWYgKHVuaXhwd19uaXMpIHsKLSNpZm5kZWYgVU5JWFBXX0NSWVBUCi0JcmZiTG9nKCItdW5peHB3X25pcyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgT1MvbWFjaGluZVxuIik7Ci0JY2xlYW5fdXBfZXhpdCgxKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0jaWZuZGVmIFVOSVhQV19TVQotCXJmYkxvZygiLXVuaXhwdyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgT1MvbWFjaGluZVxuIik7Ci0JY2xlYW5fdXBfZXhpdCgxKTsKLSNlbmRpZgotCX0KLQlpZiAoaW5pdCkgewotCQlpbnQgeCwgeTsKLQkJY2hhciBsb2dbXSA9ICJsb2dpbjogIjsKLQotCQl6ZXJvX2ZiKDAsIDAsIGRweV94LCBkcHlfeSk7Ci0KLQkJbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIGRweV94LCBkcHlfeSwgMCk7Ci0KLQkJeCA9IG5maXgoZHB5X3ggLyAyIC0gIHN0cmxlbihsb2cpICogY2hhcl93LCBkcHlfeCk7Ci0JCXkgPSAoaW50KSAoZHB5X3kgLyAzLjUpOwotCQlpZiAodW5peHB3X3N5c3RlbV9ncmVldGVyKSB7Ci0JCQl5ID0gKGludCkgKGRweV95IC8gMyk7Ci0JCX0KLQotCQlpZiAoc2NhbGluZykgewotCQkJeCA9IChpbnQpICh4ICogc2NhbGVfZmFjX3gpOwotCQkJeSA9IChpbnQpICh5ICogc2NhbGVfZmFjX3kpOwotCQkJeCA9IG5maXgoeCwgc2NhbGVkX3gpOwotCQkJeSA9IG5maXgoeSwgc2NhbGVkX3kpOwotCQl9Ci0KLQkJaWYgKHJvdGF0aW5nKSB7Ci0JCQlmc2NyZWVuLnNlcnZlckZvcm1hdC5iaXRzUGVyUGl4ZWwgPSBicHA7Ci0JCQlmc2NyZWVuLnBhZGRlZFdpZHRoSW5CeXRlcyA9IHJmYl9ieXRlc19wZXJfbGluZTsKLQkJCWZzY3JlZW4uZnJhbWVCdWZmZXIgPSByZmJfZmI7Ci0JCQlwc2NyZWVuID0gJmZzY3JlZW47Ci0JCX0gZWxzZSB7Ci0JCQlwc2NyZWVuID0gc2NyZWVuOwotCQl9Ci0KLQkJaWYgKHBzY3JlZW4gJiYgcHNjcmVlbi0+d2lkdGggPj0gNjQwICYmIHBzY3JlZW4tPmhlaWdodCA+PSA0ODApIHsKLQkJCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMisxKjEzLCAiRjEtSGVscDoiLCB3aGl0ZV9waXhlbCgpKTsKLQkJfQotCQlmMV9oZWxwID0gMDsKLQotCQlpZiAodW5peHB3X3N5c3RlbV9ncmVldGVyKSB7Ci0JCQl1bml4cHdfc3lzdGVtX2dyZWV0ZXJfYWN0aXZlID0gMDsKLQkJCWlmICh1c2VfZHB5ICYmIHN0cnN0cih1c2VfZHB5LCAieGRtY3AiKSkgewotCQkJCWlmIChnZXRlbnYoIlgxMVZOQ19TWVNURU1fR1JFRVRFUjEiKSkgewotCQkJCQljaGFyIG1vb1tdID0gIlByZXNzICdFc2NhcGUnIGZvciBTeXN0ZW0gR3JlZXRlciI7Ci0JCQkJCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgeC05MCwgeS0zMCwgbW9vLCB3aGl0ZV9waXhlbCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyIG1vbzFbXSA9ICJQcmVzcyAnRXNjYXBlJyBmb3IgYSBOZXcgU2Vzc2lvbiB2aWEgU3lzdGVtIEdyZWV0ZXIsIG9yIjsKLQkJCQkJY2hhciBtb28yW10gPSAib3RoZXJ3aXNlIGxvZ2luIGhlcmUgdG8gY29ubmVjdCB0byBhbiBFeGlzdGluZyBTZXNzaW9uOiI7Ci0JCQkJCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgeC0xMTAsIHktMzgsIG1vbzEsIHdoaXRlX3BpeGVsKCkpOwotCQkJCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0NngxM0ZvbnQsIHgtMTEwLCB5LTI1LCBtb28yLCB3aGl0ZV9waXhlbCgpKTsKLQkJCQl9Ci0JCQkJc2V0X2VudigiWDExVk5DX1hETV9PTkxZIiwgIjAiKTsKLQkJCQl1bml4cHdfc3lzdGVtX2dyZWV0ZXJfYWN0aXZlID0gMTsKLQkJCX0KLQkJfQotCi0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgeCwgeSwgbG9nLCB3aGl0ZV9waXhlbCgpKTsKLQotCQljaGFyX3ggPSB4OwotCQljaGFyX3kgPSB5OwotCQljaGFyX2NvbCA9IHN0cmxlbihsb2cpOwotCQljaGFyX3JvdyA9IDA7Ci0KLQkJc2V0X3dhcnJvd19jdXJzb3IoKTsKLQl9Ci0KLQl1bml4cHdfbWFyaygpOwotfQotCi0JCi0jaWZkZWYgTUFYUEFUSExFTgotc3RhdGljIGNoYXIgc2xhdmVfc3RyW01BWFBBVEhMRU5dOwotI2Vsc2UKLXN0YXRpYyBjaGFyIHNsYXZlX3N0cls0MDk2XTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHVzZWRfZ2V0X3B0eV9wdG14ID0gMDsKLQotY2hhciAqZ2V0X3B0eV9wdG14KGludCAqZmRfcCkgewotCWNoYXIgKnNsYXZlOwotCWludCBmZCA9IC0xLCBpLCBuZGV2cyA9IDQsIHRtcDsKLQljaGFyICpkZXZzW10gPSB7IAotCQkiL2Rldi9wdG14IiwKLQkJIi9kZXYvcHRtL2Nsb25lIiwKLQkJIi9kZXYvcHRjIiwKLQkJIi9kZXYvcHRteF9ic2QiCi0JfTsKLQotCSpmZF9wID0gLTE7Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9HUkFOVFBUCi0KLQlmb3IgKGk9MDsgaSA8IG5kZXZzOyBpKyspIHsKLSNpZmRlZiBPX05PQ1RUWQotCQlmZCA9IG9wZW4oZGV2c1tpXSwgT19SRFdSfE9fTk9DVFRZKTsKLSNlbHNlCi0JCWZkID0gb3BlbihkZXZzW2ldLCBPX1JEV1IpOwotI2VuZGlmCi0JCWlmIChmZCA+PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChmZCA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJvcGVuIC9kZXYvcHRteCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSCAmJiBkZWZpbmVkKFRJT0NQS1QpCi0JdG1wID0gMDsKLQlpb2N0bChmZCwgVElPQ1BLVCwgKGNoYXIgKikgJnRtcCk7Ci0jZW5kaWYKLQotCWlmIChncmFudHB0KGZkKSAhPSAwKSB7Ci0JCXJmYkxvZ1BlcnJvcigiZ3JhbnRwdCIpOwotCQljbG9zZShmZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAodW5sb2NrcHQoZmQpICE9IDApIHsKLQkJcmZiTG9nUGVycm9yKCJ1bmxvY2twdCIpOwotCQljbG9zZShmZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNsYXZlID0gcHRzbmFtZShmZCk7Ci0JaWYgKCEgc2xhdmUpICB7Ci0JCXJmYkxvZ1BlcnJvcigicHRzbmFtZSIpOwotCQljbG9zZShmZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19JT0NUTF9IICYmIGRlZmluZWQoVElPQ0ZMVVNIKQotCWlvY3RsKGZkLCBUSU9DRkxVU0gsIChjaGFyICopIDApOwotI2VuZGlmCi0KLQlpZiAoc3RybGVuKHNsYXZlKSA+IHNpemVvZihzbGF2ZV9zdHIpLzIpIHsKLQkJcmZiTG9nKCJnZXRfcHR5X3B0bXg6IHNsYXZlIHN0cmluZyBsZW5ndGggdG9vIGxvbmcuXG4iKTsJCi0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3RyY3B5KHNsYXZlX3N0ciwgc2xhdmUpOwotCSpmZF9wID0gZmQ7Ci0JcmV0dXJuIHNsYXZlX3N0cjsKLQotI2Vsc2UKLQlyZXR1cm4gTlVMTDsKLQotI2VuZGlmIC8qIEdSQU5UUFQgKi8KLX0KLQotCi1jaGFyICpnZXRfcHR5X2xvb3AoaW50ICpmZF9wKSB7Ci0JY2hhciBtYXN0ZXJfc3RyWzE2XTsKLQlpbnQgZmQgPSAtMSwgaTsKLQljaGFyIGM7Ci0KLQkqZmRfcCA9IC0xOwotCi0JLyogZm9yICpCU0QgbG9vcCBvdmVyIC9kZXYvcHR5WFkgKi8KLQotCWZvciAoYyA9ICdwJzsgYyA8PSAneic7IGMrKykgewotCQlmb3IgKGk9MDsgaSA8IDE2OyBpKyspIHsKLQkJCXNwcmludGYobWFzdGVyX3N0ciwgIi9kZXYvcHR5JWMleCIsIGMsIGkpOwotI2lmZGVmIE9fTk9DVFRZCi0JCQlmZCA9IG9wZW4obWFzdGVyX3N0ciwgT19SRFdSfE9fTk9DVFRZKTsKLSNlbHNlCi0JCQlmZCA9IG9wZW4obWFzdGVyX3N0ciwgT19SRFdSKTsKLSNlbmRpZgotCQkJaWYgKGZkID49IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZmQgPj0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGZkIDwgMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSCAmJiBkZWZpbmVkKFRJT0NGTFVTSCkKLQlpb2N0bChmZCwgVElPQ0ZMVVNILCAoY2hhciAqKSAwKTsKLSNlbmRpZgotCi0Jc3ByaW50ZihzbGF2ZV9zdHIsICIvZGV2L3R0eSVjJXgiLCBjLCBpKTsKLQkqZmRfcCA9IGZkOwotCXJldHVybiBzbGF2ZV9zdHI7Ci19Ci0KLWNoYXIgKmdldF9wdHkoaW50ICpmZF9wKSB7Ci0JdXNlZF9nZXRfcHR5X3B0bXggPSAwOwotCWlmIChnZXRlbnYoIkJTRF9QVFkiKSkgewotCQlyZXR1cm4gZ2V0X3B0eV9sb29wKGZkX3ApOwotCX0KLSNpZmRlZiBJU19CU0QKLQlyZXR1cm4gZ2V0X3B0eV9sb29wKGZkX3ApOwotI2Vsc2UKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9HUkFOVFBUCi0JdXNlZF9nZXRfcHR5X3B0bXggPSAxOwotCXJldHVybiBnZXRfcHR5X3B0bXgoZmRfcCk7Ci0jZWxzZQotCXJldHVybiBnZXRfcHR5X2xvb3AoZmRfcCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi12b2lkIHRyeV90b19iZV9ub2JvZHkodm9pZCkgewotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUFdEX0gKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQlwdyA9IGdldHB3bmFtKCJub2JvZHkiKTsKLQotCWlmIChwdykgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NFVFVJRAotCQlzZXR1aWQocHctPnB3X3VpZCk7Ci0jZW5kaWYKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRFVUlECi0JCXNldGV1aWQocHctPnB3X3VpZCk7Ci0jZW5kaWYKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRHSUQKLQkJc2V0Z2lkKHB3LT5wd19naWQpOwotI2VuZGlmCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU0VURUdJRAotCQlzZXRlZ2lkKHB3LT5wd19naWQpOwotI2VuZGlmCi0JfQotI2VuZGlmCS8qIFBXRF9IICovCi19Ci0KLQotc3RhdGljIGludCBzbGF2ZV9mZCA9IC0xLCBhbGFybV9maXJlZCA9IDA7Ci0KLXN0YXRpYyB2b2lkIGNsb3NlX2FsYXJtIChpbnQgc2lnKSB7Ci0JaWYgKHNsYXZlX2ZkID49IDApIHsKLQkJY2xvc2Uoc2xhdmVfZmQpOwotCX0KLQlhbGFybV9maXJlZCA9IDE7Ci0JaWYgKDApIHNpZyA9IDA7CS8qIGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLQotc3RhdGljIHZvaWQga2lsbF9jaGlsZCAocGlkX3QgcGlkLCBpbnQgZmQpIHsKLQlpbnQgc3RhdHVzOwotCi0Jc2xhdmVfZmQgPSAtMTsKLQlhbGFybV9maXJlZCA9IDA7Ci0JaWYgKGZkID49IDApIHsKLQkJY2xvc2UoZmQpOwotCX0KLQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0Jd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLX0KLQotc3RhdGljIGludCBzY2hlY2soY2hhciAqc3RyLCBpbnQgbiwgY2hhciAqbmFtZSkgewotCWludCBqLCBpOwotCi0JaWYgKCEgc3RyKSB7Ci0JCXJldHVybiAwOwotCX0KLQlqID0gMDsKLQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJaWYgKHN0cltpXSA9PSAnXDAnKSB7Ci0JCQlqID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghc3RyY21wKG5hbWUsICJwYXNzd29yZCIpKSB7Ci0JCQlpZiAoc3RyW2ldID09ICdcbicpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAoc3RyW2ldIDwgJyAnIHx8IHN0cltpXSA+PSAweDdmKSB7Ci0JCQlyZmJMb2coInNjaGVjazogaW52YWxpZCBjaGFyYWN0ZXIgaW4gJXMuXG4iLCBuYW1lKTsJCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoaiA9PSAwKSB7Ci0JCXJmYkxvZygic2NoZWNrOiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGluICVzLlxuIiwgbmFtZSk7CQotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCB1bml4cHdfbGlzdF9tYXRjaChjaGFyICp1c2VyKSB7Ci0JaWYgKCEgdW5peHB3X2xpc3QgfHwgdW5peHB3X2xpc3RbMF0gPT0gJ1wwJykgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQljaGFyICpwLCAqcSwgKnN0ciA9IHN0cmR1cCh1bml4cHdfbGlzdCk7Ci0JCWludCBvayA9IDA7Ci0JCWludCBub3Rtb2RlID0gMDsKLQotCQlpZiAoc3RyWzBdID09ICchJykgewotCQkJbm90bW9kZSA9IDE7Ci0JCQlvayA9IDE7Ci0JCQlwID0gc3RydG9rKHN0cisxLCAiLCIpOwotCQl9IGVsc2UgewotCQkJcCA9IHN0cnRvayhzdHIsICIsIik7Ci0JCX0KLQkJd2hpbGUgKHApIHsKLQkJCWlmICggKHEgPSBzdHJjaHIocCwgJzonKSkgIT0gTlVMTCApIHsKLQkJCQkqcSA9ICdcMCc7CS8qIGdldCByaWQgb2Ygb3B0aW9ucy4gKi8KLQkJCX0KLQkJCWlmICghc3RyY21wKHVzZXIsIHApKSB7Ci0JCQkJaWYgKG5vdG1vZGUpIHsKLQkJCQkJb2sgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9rID0gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIW5vdG1vZGUgJiYgIXN0cmNtcCgiKiIsIHApKSB7Ci0JCQkJb2sgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQl9Ci0JCWZyZWUoc3RyKTsKLQkJaWYgKCEgb2spIHsKLQkJCXJmYkxvZygidW5peHB3X2xpc3RfbWF0Y2g6IGZhaWwgZm9yICclcydcbiIsIHVzZXIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInVuaXhwd19saXN0X21hdGNoOiBPSyBmb3IgJyVzJ1xuIiwgdXNlcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLX0KLQotaW50IGNyeXB0X3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpwYXNzKSB7Ci0jaWZuZGVmIFVOSVhQV19DUllQVAotCXJldHVybiAwOwotI2Vsc2UKLQlzdHJ1Y3QgcGFzc3dkICpwd2Q7Ci0JY2hhciAqcmVhbHB3LCAqY3I7Ci0JaW50IG47Ci0KLQlpZiAoISBzY2hlY2sodXNlciwgMTAwLCAidXNlcm5hbWUiKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgc2NoZWNrKHBhc3MsIDEwMCwgInBhc3N3b3JkIikpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHVuaXhwd19saXN0X21hdGNoKHVzZXIpKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB3ZCA9IGdldHB3bmFtKHVzZXIpOwotCWlmICghIHB3ZCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZWFscHcgPSBwd2QtPnB3X3Bhc3N3ZDsKLQlpZiAocmVhbHB3ID09IE5VTEwgfHwgcmVhbHB3WzBdID09ICdcMCcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWFscHc9JyVzJ1xuIiwgcmVhbHB3KTsKLQotCWlmIChzdHJsZW4ocmVhbHB3KSA8IDEyKSB7Ci0JCS8qIGUuZy4gIngiLCB0cnkgZ2V0c3BuYW0oKSwgc29tZXRpbWVzIHJvb3QgZm9yIGluZXRkLCBldGMgKi8KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9HRVRTUE5BTQotCQlzdHJ1Y3Qgc3B3ZCAqc3AgPSBnZXRzcG5hbSh1c2VyKTsKLQkJaWYgKHNwICE9IE5VTEwgJiYgc3AtPnNwX3B3ZHAgIT0gTlVMTCkgewotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInVzaW5nIGdldHNwbmFtKClcbiIpOwotCQkJcmVhbHB3ID0gc3AtPnNwX3B3ZHA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic2tpcHBpbmcgZ2V0c3BuYW0oKVxuIik7Ci0JCX0KLSNlbmRpZgotCX0KLQotCW4gPSBzdHJsZW4ocGFzcyk7Ci0JaWYgKHBhc3Nbbi0xXSA9PSAnXG4nKSB7Ci0JCXBhc3Nbbi0xXSA9ICdcMCc7Ci0JfQotCi0JLyogWFhYIHJlbW92ZSBuZWVkIGZvciBjYXN0ICovCi0JY3IgPSAoY2hhciAqKSBjcnlwdChwYXNzLCByZWFscHcpOwotCWlmIChkYiA+IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1c2VyPSclcycgcGFzcz0nJXMnIHJlYWxwdz0nJXMnIGNyPSclcydcbiIsCi0JCSAgICB1c2VyLCBwYXNzLCByZWFscHcsIGNyID8gY3IgOiAiKG51bGwpIik7Ci0JfQotCWlmIChjciA9PSBOVUxMIHx8IGNyWzBdID09ICdcMCcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghc3RyY21wKGNyLCByZWFscHcpKSB7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgkvKiBVTklYUFdfQ1JZUFQgKi8KLX0KLQotaW50IHVuaXhwd19jbWRfcnVuKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3MsIGNoYXIgKmNtZCwgY2hhciAqbGluZSwgaW50ICpuKSB7Ci0JaW50IGksIGxlbiwgcmM7Ci0JY2hhciAqc3RyOwotCUZJTEUgKm91dDsKLQotCWlmICghIHVzZXIgfHwgISBwYXNzKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoISB1bml4cHdfY21kIHx8ICp1bml4cHdfY21kID09ICdcMCcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCEgc2NoZWNrKHVzZXIsIDEwMCwgInVzZXJuYW1lIikpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHNjaGVjayhwYXNzLCAxMDAsICJwYXNzd29yZCIpKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoISB1bml4cHdfbGlzdF9tYXRjaCh1c2VyKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNtZCA9PSBOVUxMKSB7Ci0JCWNtZCA9ICIiOwotCX0KLQotCWxlbiA9IHN0cmxlbih1c2VyKSArIDEgKyBzdHJsZW4ocGFzcykgKyAxICsgMTsKLQlzdHIgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKLQlpZiAoISBzdHIpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXN0clswXSA9ICdcMCc7Ci0Jc3RyY2F0KHN0ciwgdXNlcik7Ci0Jc3RyY2F0KHN0ciwgIlxuIik7Ci0Jc3RyY2F0KHN0ciwgcGFzcyk7Ci0JaWYgKCFzdHJjaHIocGFzcywgJ1xuJykpIHsKLQkJc3RyY2F0KHN0ciwgIlxuIik7Ci0JfQotCi0Jb3V0ID0gdG1wZmlsZSgpOwotCWlmIChvdXQgPT0gTlVMTCkgewotCQlyZmJMb2coInVuaXhwd19jbWRfcnVuIHRtcGZpbGUoKSBmYWlsZWQuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQlzZXRfZW52KCJSRkJfVU5JWFBXX0NNRF9SVU4iLCBjbWQpOwotCi0JcmMgPSBydW5fdXNlcl9jb21tYW5kKHVuaXhwd19jbWQsIHVuaXhwd19jbGllbnQsICJjbWRfdmVyaWZ5IiwKLQkgICAgc3RyLCBzdHJsZW4oc3RyKSwgb3V0KTsKLQotCXNldF9lbnYoIlJGQl9VTklYUFdfQ01EX1JVTiIsICIiKTsKLQotCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLQkJc3RyW2ldID0gJ1wwJzsKLQl9Ci0JZnJlZShzdHIpOwotCi0JZmZsdXNoKG91dCk7Ci0JcmV3aW5kKG91dCk7Ci0JZm9yIChpPTA7IGkgPCAoKm4pIC0gMTsgaSsrKSB7Ci0JCWludCBjID0gZmdldGMob3V0KTsKLQkJaWYgKGMgPT0gRU9GKSB7Ci0JCQlicmVhazsKLQkJfQotCQlsaW5lW2ldID0gKGNoYXIpIGM7Ci0JfQotCWZjbG9zZShvdXQpOwotCSpuID0gaTsKLQotCWlmIChyYyA9PSAwKSB7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotCi1pbnQgY21kX3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpwYXNzKSB7Ci0JaW50IGksIGxlbiwgcmM7Ci0JY2hhciAqc3RyOwotCi0JaWYgKCEgdXNlciB8fCAhIHBhc3MpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHVuaXhwd19jbWQgfHwgKnVuaXhwd19jbWQgPT0gJ1wwJykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoISBzY2hlY2sodXNlciwgMTAwLCAidXNlcm5hbWUiKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgc2NoZWNrKHBhc3MsIDEwMCwgInBhc3N3b3JkIikpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHVuaXhwd19saXN0X21hdGNoKHVzZXIpKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh1bml4cHdfY2xpZW50KSB7Ci0JCUNsaWVudERhdGEgKmNkID0gKENsaWVudERhdGEgKikgdW5peHB3X2NsaWVudC0+Y2xpZW50RGF0YTsKLQkJaWYgKGNkKSB7Ci0JCQljZC0+dXNlcm5hbWUgPSBzdHJkdXAodXNlcik7Ci0JCX0KLQl9Ci0KLQlsZW4gPSBzdHJsZW4odXNlcikgKyAxICsgc3RybGVuKHBhc3MpICsgMSArIDE7Ci0Jc3RyID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0JaWYgKCEgc3RyKSB7Ci0JCXJldHVybiAwOwotCX0KLQlzdHJbMF0gPSAnXDAnOwotCXN0cmNhdChzdHIsIHVzZXIpOwotCXN0cmNhdChzdHIsICJcbiIpOwotCXN0cmNhdChzdHIsIHBhc3MpOwotCWlmICghc3RyY2hyKHBhc3MsICdcbicpKSB7Ci0JCXN0cmNhdChzdHIsICJcbiIpOwotCX0KLQotCXJjID0gcnVuX3VzZXJfY29tbWFuZCh1bml4cHdfY21kLCB1bml4cHdfY2xpZW50LCAiY21kX3ZlcmlmeSIsCi0JICAgIHN0ciwgc3RybGVuKHN0ciksIE5VTEwpOwotCi0JZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewotCQlzdHJbaV0gPSAnXDAnOwotCX0KLQlmcmVlKHN0cik7Ci0KLQlpZiAocmMgPT0gMCkgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBzdV92ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcywgY2hhciAqY21kLCBjaGFyICpyYnVmLCBpbnQgKnJidWZfc2l6ZSwgaW50IG5vZGlzcCkgewotI2lmbmRlZiBVTklYUFdfU1UKLQlyZXR1cm4gMDsKLSNlbHNlCi0JaW50IGksIGosIHN0YXR1cywgZmQgPSAtMSwgc2ZkLCB0ZmQsIGRyYWluX3NpemUgPSA2NTUzNiwgcnNpemUgPSAwOwotCWludCBzbG93X3B3ID0gMTsKLQljaGFyICpzbGF2ZSwgKmJpbl90cnVlID0gTlVMTCwgKmJpbl9zdSA9IE5VTEw7Ci0JcGlkX3QgcGlkLCBwaWR3OwotCXN0cnVjdCBzdGF0IHNidWY7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JY2hhciBpbnN0cls2NF0sIGNidWZbMTBdOwotCi0JaWYgKGZpcnN0KSB7Ci0JCXNldF9kYigpOwotCQlmaXJzdCA9IDA7Ci0JfQotCXJmYkxvZygic3VfdmVyaWZ5OiAnJXMnIGZvciAlcy5cbiIsIHVzZXIsIGNtZCA/ICJjb21tYW5kIiA6ICJsb2dpbiIpOwotCWZmbHVzaChzdGRlcnIpOwotCi0JaWYgKCEgc2NoZWNrKHVzZXIsIDEwMCwgInVzZXJuYW1lIikpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHNjaGVjayhwYXNzLCAxMDAsICJwYXNzd29yZCIpKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoISB1bml4cHdfbGlzdF9tYXRjaCh1c2VyKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiB1bml4cHcgKi8KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJ1bml4cHciKSkgewotCQlyZmJMb2coInN1X3ZlcmlmeTogY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcy5cbiIpOwkKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLSNkZWZpbmUgU1VfREVCVUcgMAotI2lmIFNVX0RFQlVHCi0JaWYgKHN0YXQoIi9zdSIsICZzYnVmKSA9PSAwKSB7Ci0JCWJpbl9zdSA9ICIvc3UiOwkvKiBGcmVlc2JpZSByZWFkLW9ubHktZnMgL2Jpbi9zdSBub3Qgc3VpZCEgKi8KLSNlbHNlCi0JaWYgKDApIHsKLQkJOwotI2VuZGlmCi0JfSBlbHNlIGlmIChzdGF0KCIvYmluL3N1IiwgJnNidWYpID09IDApIHsKLQkJYmluX3N1ID0gIi9iaW4vc3UiOwotCX0gZWxzZSBpZiAoc3RhdCgiL3Vzci9iaW4vc3UiLCAmc2J1ZikgPT0gMCkgewotCQliaW5fc3UgPSAiL3Vzci9iaW4vc3UiOwotCX0KLQlpZiAoYmluX3N1ID09IE5VTEwpIHsKLQkJcmZiTG9nUGVycm9yKCJleGlzdGVuY2UgL2Jpbi9zdSIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0YXQoIi9iaW4vdHJ1ZSIsICZzYnVmKSA9PSAwKSB7Ci0JCWJpbl90cnVlID0gIi9iaW4vdHJ1ZSI7Ci0JfSBpZiAoc3RhdCgiL3Vzci9iaW4vdHJ1ZSIsICZzYnVmKSA9PSAwKSB7Ci0JCWJpbl90cnVlID0gIi91c3IvYmluL3RydWUiOwotCX0KLQlpZiAoY21kICE9IE5VTEwgJiYgY21kWzBdICE9ICdcMCcpIHsKLQkJLyogdGhpcyBpcyBmb3IgZXh0LiBjbWQgc3UgLWMgIm15IGNtZCIgYWZ0ZXIgbG9naW4gKi8KLQkJYmluX3RydWUgPSBjbWQ7Ci0JfQotCWlmIChiaW5fdHJ1ZSA9PSBOVUxMKSB7Ci0JCXJmYkxvZ1BlcnJvcigiZXhpc3RlbmNlIC9iaW4vdHJ1ZSIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2xhdmUgPSBnZXRfcHR5KCZmZCk7Ci0KLQlpZiAoc2xhdmUgPT0gTlVMTCkgewotCQlyZmJMb2dQZXJyb3IoImdldF9wdHkgZmFpbGVkLiIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNtZCBpczogJXNcbiIsIGNtZCk7Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInNsYXZlIGlzOiAlcyBmZD0lZFxuIiwgc2xhdmUsIGZkKTsKLQotCWlmIChmZCA8IDApIHsKLQkJcmZiTG9nUGVycm9yKCJnZXRfcHR5IGZkIDwgMCIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZmNudGwoZmQsIEZfU0VURkQsIDEpOwotCi0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPCAwKSB7Ci0JCXJmYkxvZ1BlcnJvcigiZm9yayIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocGlkID09IDApIHsKLQkJLyogY2hpbGQgKi8KLQotCQlpbnQgdHR5ZmQ7Ci0JCXR0eWZkID0gLTE7CS8qIGNvbXBpbGVyIHdhcm5pbmcgKi8KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NFVFNJRAotCQlpZiAoc2V0c2lkKCkgPT0gLTEpIHsKLQkJCXBlcnJvcigic2V0c2lkIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0jZWxzZQotCQlpZiAoc2V0cGdycCgpID09IC0xKSB7Ci0JCQlwZXJyb3IoInNldHBncnAiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSCAmJiBkZWZpbmVkKFRJT0NOT1RUWSkKLQkJdHR5ZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUik7Ci0JCWlmICh0dHlmZCA+PSAwKSB7Ci0JCQkodm9pZCkgaW9jdGwodHR5ZmQsIFRJT0NOT1RUWSwgKGNoYXIgKikgMCk7Ci0JCQljbG9zZSh0dHlmZCk7Ci0JCX0KLSNlbmRpZgkKLQotI2VuZGlmCS8qIFNFVFNJRCAqLwotCi0JCWNsb3NlKDApOwotCQljbG9zZSgxKTsKLQkJY2xvc2UoMik7Ci0KLQkJc2ZkID0gb3BlbihzbGF2ZSwgT19SRFdSKTsKLQkJaWYgKHNmZCA8IDApIHsKLQkJCWV4aXQoMSk7Ci0JCX0KLQotLyogc3RyZWFtcyBvcHRpb25zIGZpeHVwcywgaGFuZGxlIGNhc2VzIGFzIHRoZXkgYXJlIGZvdW5kOiAqLwotI2lmIGRlZmluZWQoX19ocHV4KQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19TVFJPUFRTX0gKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSCAmJiBkZWZpbmVkKElfUFVTSCkKLQkJaWYgKHVzZWRfZ2V0X3B0eV9wdG14KSB7Ci0JCQlpb2N0bChzZmQsIElfUFVTSCwgInB0ZW0iKTsKLQkJCWlvY3RsKHNmZCwgSV9QVVNILCAibGR0ZXJtIik7Ci0JCQlpb2N0bChzZmQsIElfUFVTSCwgInR0Y29tcGF0Iik7Ci0JCX0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotCQkvKiBuLmIuIHNmZCB3aWxsIGJlIDAgc2luY2Ugd2UgY2xvc2VkIDAuIHNvIGR1cCBpdCB0byAxIGFuZCAyICovCi0JCWlmIChmY250bChzZmQsIEZfRFVQRkQsIDEpID09IC0xKSB7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWlmIChmY250bChzZmQsIEZfRFVQRkQsIDIpID09IC0xKSB7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSCAmJiBkZWZpbmVkKFRJT0NTQ1RUWSkKLQkJaW9jdGwoc2ZkLCBUSU9DU0NUVFksIChjaGFyICopIDApOwotI2VuZGlmCi0KLQkJaWYgKGRiID4gMikgewotCQkJY2hhciBuYW1bMjU2XTsKLQkJCXVubGluaygiL3RtcC9pc2F0dHkiKTsKLQkJCXRmZCA9IG9wZW4oIi90bXAvaXNhdHR5IiwgT19DUkVBVHxPX1dST05MWSwgMDYwMCk7Ci0JCQlpZiAoaXNhdHR5KHNmZCkpIHsKLQkJCQljbG9zZSh0ZmQpOwotCQkJCXNwcmludGYobmFtLCAic3R0eSAtYSA8ICVzID4gL3RtcC9pc2F0dHkgMj4mMSIsCi0JCQkJICAgIHNsYXZlKTsKLQkJCQlzeXN0ZW0obmFtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGUodGZkLCAiTk9UVFRZXG4iLCA3KTsKLQkJCQljbG9zZSh0ZmQpOwotCQkJfQotCQl9Ci0KLQkJY2hkaXIoIi8iKTsKLQotCQl0cnlfdG9fYmVfbm9ib2R5KCk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfR0VUVUlECi0JCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7Ci0JCQlleGl0KDEpOwotCQl9Ci0jZWxzZQotCQlleGl0KDEpOwotI2VuZGlmCi0KLQkJc2V0X2VudigiTENfQUxMIiwgIkMiKTsKLQkJc2V0X2VudigiTEFORyIsICJDIik7Ci0JCXNldF9lbnYoIlNIRUxMIiwgIi9iaW4vc2giKTsKLQkJaWYgKG5vZGlzcCkgewotCQkJLyogdGhpcyB3aWxsIGNhdXNlIHRpbWVvdXQgcHJvYmxlbXMgd2l0aCBwYW1feGF1dGggKi8KLQkJCWludCBrOwotCQkJZm9yIChrPTA7IGs8MzsgaysrKSB7Ci0JCQkJaWYgKGdldGVudigiRElTUExBWSIpKSB7Ci0JCQkJCWNoYXIgKnMgPSBnZXRlbnYoIkRJU1BMQVkiKTsKLQkJCQkJaWYgKHMpICoocy0yKSA9ICdfJzsJLyogcXVpdGUuLi4gKi8KLQkJCQl9Ci0JCQkJaWYgKGdldGVudigiWEFVVEhPUklUWSIpKSB7Ci0JCQkJCWNoYXIgKnMgPSBnZXRlbnYoIlhBVVRIT1JJVFkiKTsKLQkJCQkJaWYgKHMpICoocy0yKSA9ICdfJzsJLyogcXVpdGUuLi4gKi8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiBzeW5jaHJvbml6ZSB3aXRoIHBhcmVudDogKi8KLQkJd3JpdGUoMiwgIkMiLCAxKTsKLQotCQlpZiAoY21kKSB7Ci0JCQlleGVjbHAoYmluX3N1LCBiaW5fc3UsICItIiwgdXNlciwgIi1jIiwKLQkJCSAgICBiaW5fdHJ1ZSwgKGNoYXIgKikgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlleGVjbHAoYmluX3N1LCBiaW5fc3UsIHVzZXIsICItYyIsCi0JCQkgICAgYmluX3RydWUsIChjaGFyICopIE5VTEwpOwotCQl9Ci0JCWV4aXQoMSk7Ci0JfQotCS8qIHBhcmVudCAqLwotCi0JaWYgKGRiKQlmcHJpbnRmKHN0ZGVyciwgInBpZDogJWRcbiIsIHBpZCk7Ci0KLQkvKgotCSAqIHNldCBhbiBhbGFybSBmb3IgYmxvY2tpbmcgcmVhZCgpIHRvIGNsb3NlIHRoZSBtYXN0ZXIKLQkgKiAocHJlc3VtYWJseSB0ZXJtaW5hdGluZyB0aGUgY2hpbGQuIFNJR1RFUk0gdG9vLi4uKQotCSAqLwotCXNsYXZlX2ZkID0gZmQ7Ci0JYWxhcm1fZmlyZWQgPSAwOwotCXNpZ25hbChTSUdBTFJNLCBjbG9zZV9hbGFybSk7Ci0JYWxhcm0oMTApOwotCi0JLyogc3luY2hyb25pemUgd2l0aCBjaGlsZDogKi8KLQljYnVmWzBdID0gJ1wwJzsKLQljYnVmWzFdID0gJ1wwJzsKLQlmb3IgKGk9MDsgaTwxMDsgaSsrKSB7Ci0JCWludCBuOwotCQljYnVmWzBdID0gJ1wwJzsKLQkJY2J1ZlsxXSA9ICdcMCc7Ci0JCW4gPSByZWFkKGZkLCBjYnVmLCAxKTsKLQkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGRiKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicmVhZCBmcm9tIGNoaWxkOiAnJXMnXG4iLCBjYnVmKTsKLQl9Ci0KLQlhbGFybSgwKTsKLQlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ci0JaWYgKGFsYXJtX2ZpcmVkKSB7Ci0JCWtpbGxfY2hpbGQocGlkLCBmZCk7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1NZU19JT0NUTF9IICYmIGRlZmluZWQoVElPQ1RSQVApCi0JewotCQlpbnQgY29udHJvbCA9IDE7Ci0JCWlvY3RsKGZkLCBUSU9DVFJBUCwgJmNvbnRyb2wpOwotCX0KLSNlbmRpZgotCQotCS8qCi0JICogSW4gYWRkaXRpb24gdG8gY2hlY2tpbmcgZXhpdCBjb2RlIGJlbG93LCB3ZSB3YXRjaCBmb3IgdGhlCi0JICogYXBwZWFyYW5jZSBvZiB0aGUgc3RyaW5nICJQYXNzd29yZDoiLiAgQlNEIGRvZXMgbm90IHNlZW0gdG8KLQkgKiBhc2sgZm9yIGEgcGFzc3dvcmQgdHJ5aW5nIHRvIHN1IHRvIHlvdXJzZWxmLiAgVGhpcyBpcyB0aGUKLQkgKiBzZXR0aW5nIGluIC9ldGMvcGFtLmQvc3U6Ci0JICogCWF1dGggICAgICBzdWZmaWNpZW50ICBwYW1fc2VsZi5zbwotCSAqIGl0IG1heSBiZSBjb21tZW50ZWQgb3V0IHdpdGhvdXQgcHJvYmxlbS4KLQkgKi8KLQlmb3IgKGk9MDsgaTwgKGludCkgc2l6ZW9mKGluc3RyKTsgaSsrKSB7Ci0JCWluc3RyW2ldID0gJ1wwJzsKLQl9Ci0KLQlhbGFybV9maXJlZCA9IDA7Ci0Jc2lnbmFsKFNJR0FMUk0sIGNsb3NlX2FsYXJtKTsKLQlhbGFybSgxMCk7Ci0KLQlqID0gMDsKLQlmb3IgKGk9MDsgaSA8IChpbnQpIHN0cmxlbigiUGFzc3dvcmQ6Iik7IGkrKykgewotCQljaGFyIHBzdHJbXSA9ICJwYXNzd29yZDoiOwotCQlpbnQgbiwgcHJvYmxlbTsJCi0KLQkJY2J1ZlswXSA9ICdcMCc7Ci0JCWNidWZbMV0gPSAnXDAnOwotCi0JCW4gPSByZWFkKGZkLCBjYnVmLCAxKTsKLQkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKSB7Ci0JCQlpLS07Ci0JCQlpZiAoaSA8IC0xKSBpID0gLTE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChkYikgewotCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIGNidWYpOwotCQkJaWYgKGRiID4gMyAmJiBuID09IDEgJiYgY2J1ZlswXSA9PSAnOicpIHsKLQkJCQljaGFyIGNtZDBbMzJdOwotCQkJCXVzbGVlcCggMTAwICogMTAwMCApOwotCQkJCWZwcmludGYoc3RkZXJyLCAiXG5cbiIpOwotCQkJCXNwcmludGYoY21kMCwgInBzIHd1ICVkIiwgcGlkKTsKLQkJCQlzeXN0ZW0oY21kMCk7Ci0JCQkJc3ByaW50ZihjbWQwLCAic3R0eSAtYSA8ICVzIiwgc2xhdmUpOwotCQkJCXN5c3RlbShjbWQwKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuID09IDEpIHsKLQkJCWlmIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBjYnVmWzBdKSkgewotCQkJCWktLTsKLQkJCQlpZiAoaSA8IC0xKSBpID0gLTE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaiA+PSAoaW50KSBzaXplb2YoaW5zdHIpLTEpIHsKLQkJCQlyZmJMb2coInN1X3ZlcmlmeTogcHJvYmxlbSBmaW5kaW5nIFBhc3N3b3JkOlxuIik7CQotCQkJCWZmbHVzaChzdGRlcnIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaW5zdHJbaisrXSA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpY2J1ZlswXSk7Ci0JCX0KLQotCQlwcm9ibGVtID0gMDsKLQkJaWYgKG4gPD0gMCkgewotCQkJcHJvYmxlbSA9IDE7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHBzdHIsIGluc3RyKSAhPSBwc3RyKSB7Ci0jaWZkZWYgX0FJWAotCQkJaWYgKFVULnN5c25hbWUgJiYgc3Ryc3RyKFVULnN5c25hbWUsICJBSVgiKSkgewotCQkJCS8qIGhhbmRsZTogcnVuZ2UncyBQYXNzd29yZDogKi8KLQkJCQljaGFyICpsdXNlciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4odXNlcikgKyAxMCk7Ci0KLQkJCQlzcHJpbnRmKGx1c2VyLCAiJXMncyIsIHVzZXIpOwotCQkJCWxvd2VyY2FzZShsdXNlcik7Ci0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuQUlYIGx1c2VyIGNvbXBhcmU6IFwiJXNcIiB0byBcIiVzXCJcbiIsIGx1c2VyLCBpbnN0cik7Ci0JCQkJaWYgKHN0cnN0cihsdXNlciwgaW5zdHIpID09IGx1c2VyKSB7Ci0JCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJBSVggbHVzZXIgY29tcGFyZTogc3Ryc3RyIE9LLlxuIik7Ci0JCQkJCWlmICghc3RyY21wKGx1c2VyLCBpbnN0cikpIHsKLQkJCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJBSVggbHVzZXIgY29tcGFyZTogc3RyaW5ncyBlcXVhbC5cbiIpOwotCQkJCQkJaSA9IC0xOwkKLQkJCQkJCWogPSAwOwotCQkJCQkJbWVtc2V0KGluc3RyLCAwLCBzaXplb2YoaW5zdHIpKTsKLQkJCQkJCWZyZWUobHVzZXIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpLS07Ci0JCQkJCQlpZiAoaSA8IC0xKSBpID0gLTE7Ci0JCQkJCQlmcmVlKGx1c2VyKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkFJWCBsdXNlciBjb21wYXJlOiBwcm9ibGVtPTFcbiIpOwotCQkJCQlwcm9ibGVtID0gMTsKLQkJCQl9Ci0JCQkJZnJlZShsdXNlcik7Ci0JCQl9IGVsc2UKLSNlbmRpZgotCQkJewotCQkJCXByb2JsZW0gPSAxOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2JsZW0pIHsKLQkJCWlmIChkYikgewotCQkJCWZwcmludGYoc3RkZXJyLCAiXCJQYXNzd29yZDpcIiBkaWQgbm90ICIKLQkJCQkgICAgImFwcGVhcjogJyVzJyIgIiBuPSVkXG4iLCBpbnN0ciwgbik7Ci0JCQkJaWYgKGRiID4gMyAmJiBuID09IDEgJiYgaiA8IDMyKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWFsYXJtKDApOwotCQkJc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOwotCQkJa2lsbF9jaGlsZChwaWQsIGZkKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JYWxhcm0oMCk7Ci0Jc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOwotCWlmIChhbGFybV9maXJlZCkgewotCQlraWxsX2NoaWxkKHBpZCwgZmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiXG5zZW5kaW5nIHBhc3N3ZDogJXNcbiIsIGRiID4gMiA/IHBhc3MgOiAiKioqKiIpOwotCXVzbGVlcCgxMDAgKiAxMDAwKTsKLQlpZiAoc2xvd19wdykgewotCQl1bnNpZ25lZCBpbnQgazsKLQkJZm9yIChrID0gMDsgayA8IHN0cmxlbihwYXNzKTsgaysrKSB7Ci0JCQl3cml0ZShmZCwgcGFzcytrLCAxKTsgCi0JCQl1c2xlZXAoMTAwICogMTAwMCk7Ci0JCX0KLQl9IGVsc2UgewotCQl3cml0ZShmZCwgcGFzcywgc3RybGVuKHBhc3MpKTsgCi0JfQotCi0JYWxhcm1fZmlyZWQgPSAwOwotCXNpZ25hbChTSUdBTFJNLCBjbG9zZV9hbGFybSk7Ci0JYWxhcm0oMTUpOwotCi0JLyoKLQkgKiB0cnkgdG8gZHJhaW4gdGhlIG91dHB1dCwgaG9wZWZ1bGx5IG5ldmVyIGFzIG11Y2ggYXMgNDA5NiAobW90ZD8pCi0JICogaWYgd2UgZG9uJ3QgZHJhaW4gd2UgbWF5IGJsb2NrIGF0IHdhaXRwaWQuICBJZiB3ZSBjbG9zZShmZCksIHRoZQotCSAqIG1ha2UgY2F1c2UgY2hpbGQgdG8gZGllIGJ5IHNpZ25hbC4KLQkgKi8KLQlpZiAocmJ1ZiAmJiAqcmJ1Zl9zaXplID4gMCkgewotCQkvKiBhc2tlZCB0byByZXR1cm4gb3V0cHV0IG9mIGNvbW1hbmQgKi8KLQkJZHJhaW5fc2l6ZSA9ICpyYnVmX3NpemU7Ci0JCXJzaXplID0gMDsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuZHJhaW5pbmc6XG4iKTsKLQlmb3IgKGkgPSAwOyBpPCBkcmFpbl9zaXplOyBpKyspIHsKLQkJaW50IG47CQotCQkKLQkJY2J1ZlswXSA9ICdcMCc7Ci0JCWNidWZbMV0gPSAnXDAnOwotCi0JCW4gPSByZWFkKGZkLCBjYnVmLCAxKTsKLQkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKSB7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiXG5FSU5UUiBuPSVkIGk9JWQgLS0iLCBuLCBpKTsKLQkJCWktLTsKLQkJCWlmIChpIDwgMCkgaSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJcbm49JWQgaT0lZCBlcnJubz0lZCAlLjZmICAnJXMnIiwgbiwgaSwgZXJybm8sIGRub3d4KCksIGNidWYpOwotCi0JCWlmIChuIDw9IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyYnVmICYmICpyYnVmX3NpemUgPiAwKSB7Ci0JCQlyYnVmW3JzaXplKytdID0gY2J1ZlswXTsKLQkJfQotCX0KLQlpZiAoZGIgJiYgcmJ1ZikgZnByaW50ZihzdGRlcnIsICJcbnJidWY6ICclcydcbiIsIHJidWYpOwotCi0JaWYgKHJidWYgJiYgKnJidWZfc2l6ZSA+IDApIHsKLQkJY2hhciAqcyA9IHJidWY7Ci0JCWNoYXIgKnAgPSBzdHJkdXAocGFzcyk7Ci0JCWludCBuLCBvID0gMDsKLQkJCi0JCW4gPSBzdHJsZW4ocCk7Ci0JCWlmIChwW24tMV0gPT0gJ1xuJykgewotCQkJcFtuLTFdID0gJ1wwJzsKLQkJfQotCQkvKgotCQkgKiB1c3VhbGx5IGlzOiBQYXNzd29yZDogbXlwYXNzd29yZFxyXG5cclxuPG91dHB1dC1vZi1jb21tYW5kPgotCQkgKiBhbmQgb3V0cHV0IHdpbGwgaGF2ZSBcbiAtPiBcclxuCi0JCSAqLwotCQlpZiAocmJ1ZlswXSA9PSAnICcpIHsKLQkJCXMrKzsKLQkJCW8rKzsKLQkJfQotCQlpZiAoc3Ryc3RyKHMsIHApID09IHMpIHsKLQkJCXMgKz0gc3RybGVuKHApOwotCQkJbyArPSBzdHJsZW4ocCk7Ci0JCQlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7Ci0JCQkJaWYgKHNbMF0gPT0gJ1xyJyB8fCBzWzBdID09ICdcbicpIHsKLQkJCQkJcysrOwotCQkJCQlvKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChvID4gMCkgewotCQkJaW50IGkgPSAwOwotCQkJcnNpemUgLT0gbzsKLQkJCXdoaWxlIChvIDwgZHJhaW5fc2l6ZSkgewotCQkJCXJidWZbaSsrXSA9IHJidWZbbysrXTsKLQkJCX0KLQkJfQotCQkqcmJ1Zl9zaXplID0gcnNpemU7Ci0JCXN0cnplcm8ocCk7Ci0JCWZyZWUocCk7Ci0JfQotCi0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuLS1cbiIpOwotCi0JYWxhcm0oMCk7Ci0Jc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOwotCWlmIChhbGFybV9maXJlZCkgewotCQlraWxsX2NoaWxkKHBpZCwgZmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzbGF2ZV9mZCA9IC0xOwotCQotCXBpZHcgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7IAotCWNsb3NlKGZkKTsKLQotCWlmIChwaWQgIT0gcGlkdykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwKSB7Ci0JCXJldHVybiAxOyAvKiB0aGlzIGlzIHRoZSBvbmx5IHJldHVybiBvZiBzdWNjZXNzLiAqLwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgkvKiBVTklYUFdfU1UgKi8KLX0KLQotaW50IHVuaXhwd192ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcykgewotCWludCBvayA9IDA7Ci0JaWYgKHVuaXhwd19jbWQpIHsKLQkJaWYgKGNtZF92ZXJpZnkodXNlciwgcGFzcykpIHsKLQkJCXJmYkxvZygidW5peHB3X3ZlcmlmeTogY21kX3ZlcmlmeSBsb2dpbiBmb3IgJyVzJyIKLQkJCSAgICAiIHN1Y2NlZWRlZC5cbiIsIHVzZXIpOwotCQkJZmZsdXNoKHN0ZGVycik7Ci0JCQlvayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInVuaXhwd192ZXJpZnk6IGNtZF92ZXJpZnkgbG9naW4gZm9yICclcyciCi0JCQkgICAgIiBmYWlsZWQuXG4iLCB1c2VyKTsKLQkJCWZmbHVzaChzdGRlcnIpOwotCQkJdXNsZWVwKDMwMDAqMTAwMCk7Ci0JCQlvayA9IDA7Ci0JCX0KLQl9IGVsc2UgaWYgKHVuaXhwd19uaXMpIHsKLQkJaWYgKGNyeXB0X3ZlcmlmeSh1c2VyLCBwYXNzKSkgewotCQkJcmZiTG9nKCJ1bml4cHdfdmVyaWZ5OiBjcnlwdF92ZXJpZnkgbG9naW4gZm9yICclcyciCi0JCQkgICAgIiBzdWNjZWVkZWQuXG4iLCB1c2VyKTsKLQkJCWZmbHVzaChzdGRlcnIpOwotCQkJb2sgPSAxOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJ1bml4cHdfdmVyaWZ5OiBjcnlwdF92ZXJpZnkgbG9naW4gZm9yICclcyciCi0JCQkgICAgIiBmYWlsZWQuXG4iLCB1c2VyKTsKLQkJCWZmbHVzaChzdGRlcnIpOwotCQkJdXNsZWVwKDMwMDAqMTAwMCk7Ci0JCQlvayA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoc3VfdmVyaWZ5KHVzZXIsIHBhc3MsIE5VTEwsIE5VTEwsIE5VTEwsIDEpKSB7Ci0JCQlyZmJMb2coInVuaXhwd192ZXJpZnk6IHN1X3ZlcmlmeSBsb2dpbiBmb3IgJyVzJyIKLQkJCSAgICAiIHN1Y2NlZWRlZC5cbiIsIHVzZXIpOwotCQkJZmZsdXNoKHN0ZGVycik7Ci0JCQlvayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInVuaXhwd192ZXJpZnk6IHN1X3ZlcmlmeSBsb2dpbiBmb3IgJyVzJyIKLQkJCSAgICAiIGZhaWxlZC5cbiIsIHVzZXIpOwotCQkJZmZsdXNoKHN0ZGVycik7Ci0JCQkvKiB1c2Ugc3UoMSkncyBzbGVlcCAqLwotCQkJb2sgPSAwOwotCQl9Ci0JfQotCXJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBza2lwX2l0ID0gMDsKLQotc3RhdGljIHZvaWQgcHJvZ3Jlc3Nfc2tpcHB5KHZvaWQpIHsKLQlpbnQgaSwgbXNlYyA9IGdldF9uZXRfbGF0ZW5jeSgpOwkvKiBwcm9iYWJhbHkgbm90IHNldCB5ZXQuLiAqLwotCi0JaWYgKG1zZWMgPiAzMDApIHsKLQkJbXNlYyA9IDMwMDsKLQl9IGVsc2UgaWYgKG1zZWMgPD0gMTAwKSB7Ci0JCW1zZWMgPSAxMDA7Ci0JfQotCi0Jc2tpcF9pdCA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAoaSA9PSAyKSB7Ci0JCQlyZmJQRShtc2VjICogMTAwMCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJQRSgtMSk7Ci0JCX0KLQkJdXNsZWVwKDEwKjEwMDApOwotCX0KLQlza2lwX2l0ID0gMDsKLQotCXVzbGVlcCg1MCoxMDAwKTsKLX0KLQotdm9pZCBjaGVja191bml4cHdfdXNlcnByZWZzKHZvaWQpIHsKLQljaGFyICpwcmVmcyA9IGdldGVudigiRkRfVVNFUlBSRUZTIik7Ci0JaWYgKGtlZXBfdW5peHB3X3VzZXIgPT0gTlVMTCB8fCBrZWVwX3VuaXhwd19vcHRzID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSAotCWlmIChwcmVmcyAhPSBOVUxMICYmICFzdHJjaHIocHJlZnMsICcvJykpIHsKLQkJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd25hbShrZWVwX3VuaXhwd191c2VyKTsKLQkJaWYgKHB3ICE9IE5VTEwpIHsKLQkJCWNoYXIgKmZpbGU7Ci0JCQlGSUxFICpmOwotCi0JCQlmaWxlID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwdy0+cHdfZGlyKSArIDEgKyBzdHJsZW4ocHJlZnMpICsgMSk7Ci0JCQlzcHJpbnRmKGZpbGUsICIlcy8lcyIsIHB3LT5wd19kaXIsIHByZWZzKTsKLQotCQkJZiA9IGZvcGVuKGZpbGUsICJyIik7Ci0JCQlpZiAoZikgewotCQkJCWNoYXIgKnQsICpxLCBidWZbMTAyNF07Ci0JCQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JCQkJZmdldHMoYnVmLCAxMDI0LCBmKTsKLQkJCQlmY2xvc2UoZik7Ci0KLQkJCQlxID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7Ci0JCQkJaWYgKHEpICpxID0gJ1wwJzsKLQkJCQlxID0gc3RyY2hyKGJ1ZiwgJ1xyJyk7Ci0JCQkJaWYgKHEpICpxID0gJ1wwJzsKLQotCQkJCXJmYkxvZygicmVhZCB1c2VyIHByZWZzICVzOiAlc1xuIiwgZmlsZSwgYnVmKTsKLQotCQkJCWlmIChidWZbMF0gPT0gJyMnKSBidWZbMF0gPSAnXDAnOwotCi0JCQkJdCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oa2VlcF91bml4cHdfb3B0cykgKyAxICsgc3RybGVuKGJ1ZikgKyAxKTsKLQkJCQlzcHJpbnRmKHQsICIlcywlcyIsIGtlZXBfdW5peHB3X29wdHMsIGJ1Zik7IAotCQkJCWZyZWUoa2VlcF91bml4cHdfb3B0cyk7Ci0JCQkJa2VlcF91bml4cHdfb3B0cyA9IHQ7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygiY291bGQgbm90IHJlYWQgdXNlciBwcmVmcyAlc1xuIiwgZmlsZSk7Ci0JCQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQkJfQotCQkJZnJlZShmaWxlKTsKLQkJfQotCX0KLSNlbmRpZgotfQotCi0KLXZvaWQgdW5peHB3X3ZlcmlmeV9zY3JlZW4oY2hhciAqdXNlciwgY2hhciAqcGFzcykgewotCWludCB4LCB5OwotCWNoYXIgbGlbXSA9ICJMb2dpbiBpbmNvcnJlY3QiOwotCWNoYXIgbHNbXSA9ICJMb2dpbiBzdWNjZWVkZWQiOwotCWNoYXIgbG9nW10gPSAibG9naW46ICI7Ci0JY2hhciAqY29sb24gPSBOVUxMOwotCUNsaWVudERhdGEgKmNkID0gTlVMTDsKLQlpbnQgb2s7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ1bml4cHdfdmVyaWZ5OiAnJXMnICclcydcbiIsIHVzZXIsIGRiID4gMSA/IHBhc3MgOiAiKioqKioqKioiKTsKLQlyZmJMb2coInVuaXhwd192ZXJpZnk6ICclcydcbiIsIHVzZXIgPyB1c2VyIDogIihudWxsKSIpOwotCi0JaWYgKHVzZXIpIHsKLQkJY29sb24gPSBzdHJjaHIodXNlciwgJzonKTsKLQl9Ci0JaWYgKGNvbG9uKSB7Ci0JCSpjb2xvbiA9ICdcMCc7Ci0JCXJmYkxvZygidW5peHB3X3ZlcmlmeTogY29sb246ICclcydcbiIsIHVzZXIpOwotCX0KLQlmZmx1c2goc3RkZXJyKTsKLQlpZiAodW5peHB3X2NsaWVudCkgewotCQljZCA9IChDbGllbnREYXRhICopIHVuaXhwd19jbGllbnQtPmNsaWVudERhdGE7Ci0JCWlmIChjZCkgewotCQkJY2hhciAqc3RyID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKCJVTklYOiIpICsKLQkJCSAgICBzdHJsZW4odXNlcikgKyAxKTsKLQkJCXNwcmludGYoc3RyLCAiVU5JWDolcyIsIHVzZXIpOwkKLQkJCWlmIChjZC0+dXNlcm5hbWUpIHsKLQkJCQlmcmVlKGNkLT51c2VybmFtZSk7Ci0JCQl9Ci0JCQljZC0+dXNlcm5hbWUgPSBzdHI7Ci0JCX0KLQl9Ci0KLQlvayA9IHVuaXhwd192ZXJpZnkodXNlciwgcGFzcyk7Ci0KLQlpZiAob2spIHsKLQkJY2hhcl9yb3crKzsKLQkJY2hhcl9jb2wgPSAwOwotCi0JCXggPSB0ZXh0X3goKTsKLQkJeSA9IHRleHRfeSgpOwotCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsIHgsIHksIGxzLCB3aGl0ZV9waXhlbCgpKTsKLQkJdW5peHB3X21hcmsoKTsKLQotCQlwcm9ncmVzc19za2lwcHkoKTsKLQotCQl1bml4cHdfYWNjZXB0KHVzZXIpOwotCi0JCWlmIChrZWVwX3VuaXhwdykgewotCQkJa2VlcF91bml4cHdfdXNlciA9IHN0cmR1cCh1c2VyKTsKLQkJCWtlZXBfdW5peHB3X3Bhc3MgPSBzdHJkdXAocGFzcyk7Ci0JCQlpZiAoY29sb24pIHsKLQkJCQlrZWVwX3VuaXhwd19vcHRzID0gc3RyZHVwKGNvbG9uKzEpOwotCQkJfSBlbHNlIHsKLQkJCQlrZWVwX3VuaXhwd19vcHRzID0gc3RyZHVwKCIiKTsKLQkJCX0KLQkJCWNoZWNrX3VuaXhwd191c2VycHJlZnMoKTsKLQkJfQotCi0JCWlmIChjb2xvbikgKmNvbG9uID0gJzonOwotCi0JCXJldHVybjsKLQl9Ci0JaWYgKGNvbG9uKSAqY29sb24gPSAnOic7Ci0KLQlpZiAodHJpZXMgPCAyKSB7Ci0JCWNoYXJfcm93Kys7Ci0JCWNoYXJfY29sID0gMDsKLQotCQl4ID0gdGV4dF94KCk7Ci0JCXkgPSB0ZXh0X3koKTsKLQkJcmZiRHJhd1N0cmluZyhwc2NyZWVuLCAmZGVmYXVsdDh4MTZGb250LCB4LCB5LCBsaSwgd2hpdGVfcGl4ZWwoKSk7Ci0KLQkJY2hhcl9yb3cgKz0gMjsKLQotCQl4ID0gdGV4dF94KCk7Ci0JCXkgPSB0ZXh0X3koKTsKLQkJcmZiRHJhd1N0cmluZyhwc2NyZWVuLCAmZGVmYXVsdDh4MTZGb250LCB4LCB5LCBsb2csIHdoaXRlX3BpeGVsKCkpOwotCi0JCWNoYXJfY29sID0gc3RybGVuKGxvZyk7Ci0KLQkJdW5peHB3X21hcmsoKTsKLQotCQl1bml4cHdfbGFzdF90cnlfdGltZSA9IHRpbWUoTlVMTCk7Ci0JCXVuaXhwd19rZXlzdHJva2UoMCwgMCwgMik7Ci0JCXRyaWVzKys7Ci0JfSBlbHNlIHsKLQkJdW5peHB3X2RlbnkoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9kYih2b2lkKSB7Ci0JaWYgKGdldGVudigiREVCVUdfVU5JWFBXIikpIHsKLQkJZGIgPSBhdG9pKGdldGVudigiREVCVUdfVU5JWFBXIikpOwotCQlyZmJMb2coIkRFQlVHX1VOSVhQVzogJWRcbiIsIGRiKTsKLQl9Ci19Ci0KLXZvaWQgdW5peHB3X2tleXN0cm9rZShyZmJCb29sIGRvd24sIHJmYktleVN5bSBrZXlzeW0sIGludCBpbml0KSB7Ci0JaW50IHgsIHksIGksIHJjLCBubWF4ID0gMTAwOwotCXN0YXRpYyBjaGFyIHVzZXJfclsxMDBdLCB1c2VyWzEwMF0sIHBhc3NbMTAwXTsKLQlzdGF0aWMgaW50ICB1X2NudCA9IDAsIHBfY250ID0gMCwgdF9jbnQgPSAwLCBmaXJzdCA9IDE7Ci0Jc3RhdGljIGludCBlY2hvID0gMTsKLQljaGFyIGtleXN0clsxMDBdOwotCWNoYXIgKnN0cjsKLQotCWlmIChza2lwX2l0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZmlyc3QpIHsKLQkJc2V0X2RiKCk7Ci0JCWZpcnN0ID0gMDsKLQkJZm9yIChpPTA7IGkgPCBubWF4OyBpKyspIHsKLQkJCXVzZXJfcltpXSA9ICdcMCc7Ci0JCQl1c2VyW2ldID0gJ1wwJzsKLQkJCXBhc3NbaV0gPSAnXDAnOwotCQl9Ci0JfQotCi0JaWYgKGluaXQpIHsKLQkJaW5fbG9naW4gPSAxOwotCQlpbl9wYXNzd2QgPSAwOwotCQl1bml4cHdfZGVuaWVkID0gMDsKLQkJZWNobyA9IDE7Ci0JCWlmIChpbml0ID09IDEpIHsKLQkJCXRyaWVzID0gMDsKLQkJfQotCi0JCXVfY250ID0gMDsKLQkJcF9jbnQgPSAwOwotCQl0X2NudCA9IDA7Ci0JCWZvciAoaT0wOyBpPG5tYXg7IGkrKykgewotCQkJdXNlcltpXSA9ICdcMCc7Ci0JCQlwYXNzW2ldID0gJ1wwJzsKLQkJfQotCQlpZiAoa2VlcF91bml4cHdfdXNlcikgewotCQkJZnJlZShrZWVwX3VuaXhwd191c2VyKTsKLQkJCWtlZXBfdW5peHB3X3VzZXIgPSBOVUxMOwotCQl9Ci0JCWlmIChrZWVwX3VuaXhwd19wYXNzKSB7Ci0JCQlzdHJ6ZXJvKGtlZXBfdW5peHB3X3Bhc3MpOwotCQkJZnJlZShrZWVwX3VuaXhwd19wYXNzKTsKLQkJCWtlZXBfdW5peHB3X3Bhc3MgPSBOVUxMOwotCQl9Ci0JCWlmIChrZWVwX3VuaXhwd19vcHRzKSB7Ci0JCQlzdHJ6ZXJvKGtlZXBfdW5peHB3X29wdHMpOwotCQkJZnJlZShrZWVwX3VuaXhwd19vcHRzKTsKLQkJCWtlZXBfdW5peHB3X29wdHMgPSBOVUxMOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmICh1bml4cHdfZGVuaWVkKSB7Ci0JCXJmYkxvZygidW5peHB3X2tleXN0cm9rZTogdW5peHB3X2RlbmllZCBzdGF0ZTogMHgleFxuIiwgKGludCkga2V5c3ltKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoa2V5c3ltIDw9IDApIHsKLQkJcmZiTG9nKCJ1bml4cHdfa2V5c3Ryb2tlOiBiYWQga2V5c3ltMTogMHgleFxuIiwgKGludCkga2V5c3ltKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHJmYktleVN5bSA9IHVpbnQzMl90ICovCi0JLyogS2V5U3ltID0gWElEID0gQ0FSRDMyID0gKHVuc2lnbmVkIGxvbmcgb3IgdW5zaWduZWQgaW50IG9uIExPTkc2NCkgKi8KLQlYX0xPQ0s7Ci0Jc3RyID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0JWF9VTkxPQ0s7Ci0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCXJmYkxvZygidW5peHB3X2tleXN0cm9rZTogYmFkIGtleXN5bTI6IDB4JXhcbiIsIChpbnQpIGtleXN5bSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyYyA9IHNucHJpbnRmKGtleXN0ciwgMTAwLCAiJXMiLCBzdHIpOwotCWlmIChyYyA8IDEgfHwgcmMgPiA5MCkgewotCQlyZmJMb2coInVuaXhwd19rZXlzdHJva2U6IGJhZCBrZXlzeW0zOiAweCV4XG4iLCAoaW50KSBrZXlzeW0pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGRiID4gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIC8gJXMgIDB4JXggJXNcbiIsIGluX2xvZ2luID8gImxvZ2luIjoicGFzcyAiLAotCQkgICAgZG93biA/ICJkb3duIjoidXAgICIsIGtleXN5bSwga2V5c3RyKTsKLQl9Ci0KLQlpZiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfTGluZWZlZWQgfHwga2V5c3ltID09IFhLX1RhYikgewotCQkvKiBsZXQgInVwIiBwYXNzIGRvd24gYmVsb3cgZm9yIFJldHVybiBjYXNlICovCi0JCWlmIChkb3duKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgaWYgKCEgZG93bikgewotCQlyZXR1cm47Ci0JfQotCWlmIChrZXlzeW0gPT0gWEtfRjEpIHsKLQkJY2hhciBoMVtdID0gIkYxLUhlbHA6ICBGb3IgJ2xvZ2luOicgdHlwZSBpbiB0aGUgdXNlcm5hbWUgYW5kIHByZXNzIEVudGVyLCB0aGVuIGZvciAnUGFzc3dvcmQ6JyBlbnRlciB0aGUgcGFzc3dvcmQuIjsKLQkJY2hhciBoZltdID0gIiAgT25jZSBsb2dnZWQgaW4sIHVzZXJuYW1lJ3MgWCBzZXNzaW9uIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGFuZCBpZiBmb3VuZCB0aGVuIGF0dGFjaGVkIHRvLiI7Ci0JCWNoYXIgaGNbXSA9ICIgIE9uY2UgbG9nZ2VkIGluLCB1c2VybmFtZSdzIFggc2Vzc2lvbiBpcyBzb3VnaHQgYW5kIGF0dGFjaGVkIHRvLCBvdGhlcndpc2UgYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLiI7Ci0JCWNoYXIgaHhbXSA9ICIgIE9uY2UgbG9nZ2VkIGluLCB1c2VybmFtZSdzIFggc2Vzc2lvbiBpcyBzb3VnaHQgYW5kIGF0dGFjaGVkIHRvLCBvdGhlcndpc2UgYSBsb2dpbiBncmVldGVyIGlzIHByZXNlbnRlZC4iOwotCQljaGFyIGgyW10gPSAiICBTcGVjaWZ5IG9wdGlvbnMgYWZ0ZXIgYSAnOicgbGlrZSB0aGlzOiAgdXNlcm5hbWU6b3B0LG9wdD12YWwsLi4uICAgIFdoZXJlIGFuIG9wdCBtYXkgYmUgYW55IG9mOiI7Ci0JCWNoYXIgaDNbXSA9ICIgICAgc2NhbGU9Li4uIChuL20pOyBzY2FsZV9jdXJzb3I9Li4uIChzYz0pOyBzb2xpZCAoc28pOyBpZD07IHJlcGVhdDsgY2xlYXJfbW9kcyAoY20pOyBjbGVhcl9rZXlzIChjayk7IjsKLQkJY2hhciBoNFtdID0gIiAgICBjbGVhcl9hbGwgKGNhKTsgc3BlZWRzPS4uLiAoc3A9KTsgcmVhZHRpbWVvdXQ9Li4uIChyZD0pIHJvdGF0ZT0uLi4gKHJvPSk7IG5vbmNhY2hlIChuYykgKG5jPW4pOyI7Ci0JCWNoYXIgaDVbXSA9ICIgICAgZ2VvbT1XeEh4RCAoZ2U9KTsgbm9kaXNwbGF5PS4uLiAobmQ9KTsgdmlld29ubHkgKHZvKTsgdGFnPS4uLjsgZ25vbWUga2RlIHR3bSBmdndtIG13bSBkdHdtIHdtYWtlciI7Ci0JCWNoYXIgaDZbXSA9ICIgICAgeGZjZSBseGRlIGVubGlnaHRlbm1lbnQgWHNlc3Npb24gZmFpbHNhZmUuICAgRXhhbXBsZXM6ICBmcmVkOjMvNCxzbyxjbSAgd2lsbWE6Z2VvbT0xMDI0eDc2OHgxNixrZGUiOwotCQlpbnQgY2ggPSAxMywgcDsKLQkJaWYgKCFwc2NyZWVuIHx8IHBzY3JlZW4tPndpZHRoIDwgNjQwIHx8IHBzY3JlZW4tPmhlaWdodCA8IDQ4MCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmMV9oZWxwKSB7Ci0JCQlwID0gYmxhY2tfcGl4ZWwoKTsKLQkJCWYxX2hlbHAgPSAwOwotCQl9IGVsc2UgewotCQkJcCA9IHdoaXRlX3BpeGVsKCk7Ci0JCQlmMV9oZWxwID0gMTsKLQkJCXVuaXhwd19sYXN0X3RyeV90aW1lID0gdGltZShOVUxMKSArIDQ1OwotCQl9Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMisxKmNoLCBoMSwgcCk7Ci0JCWlmICh1c2VfZHB5ID09IE5VTEwpIHsKLQkJCTsKLQkJfSBlbHNlIGlmIChzdHJzdHIodXNlX2RweSwgImNtZD1GSU5ERElTUExBWSIpKSB7Ci0JCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0NngxM0ZvbnQsIDgsIDIrMipjaCwgaGYsIHApOwotCQl9IGVsc2UgaWYgKHN0cnN0cih1c2VfZHB5LCAiY21kPUZJTkRDUkVBVEVESVNQTEFZIikpIHsKLQkJCWlmIChzdHJzdHIodXNlX2RweSwgInhkbWNwIikpIHsKLQkJCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0NngxM0ZvbnQsIDgsIDIrMipjaCwgaHgsIHApOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0NngxM0ZvbnQsIDgsIDIrMipjaCwgaGMsIHApOwotCQkJfQotCQl9Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMiszKmNoLCBoMiwgcCk7Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMis0KmNoLCBoMywgcCk7Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMis1KmNoLCBoNCwgcCk7Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMis2KmNoLCBoNSwgcCk7Ci0JCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ2eDEzRm9udCwgOCwgMis3KmNoLCBoNiwgcCk7Ci0JCWlmICghZjFfaGVscCkgewotCQkJcmZiRHJhd1N0cmluZyhwc2NyZWVuLCAmZGVmYXVsdDZ4MTNGb250LCA4LCAyKzEqY2gsICJGMS1IZWxwOiIsIHdoaXRlX3BpeGVsKCkpOwotCQl9Ci0JCXVuaXhwd19tYXJrKCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHVuaXhwd19zeXN0ZW1fZ3JlZXRlcl9hY3RpdmUgJiYga2V5c3ltID09IFhLX0VzY2FwZSkgewotCQljaGFyICp1ID0gZ2V0X3VzZXJfbmFtZSgpOwotCQlpZiAoa2VlcF91bml4cHcpIHsKLQkJCWNoYXIgKmNvbG9uID0gc3RyY2hyKHVzZXIsICc6Jyk7Ci0JCQlrZWVwX3VuaXhwd191c2VyID0gc3RyZHVwKHUpOwotCQkJa2VlcF91bml4cHdfcGFzcyA9IHN0cmR1cCgiIik7Ci0JCQlpZiAoY29sb24pIHsKLQkJCQlrZWVwX3VuaXhwd19vcHRzID0gc3RyZHVwKGNvbG9uKzEpOwotCQkJfSBlbHNlIHsKLQkJCQlrZWVwX3VuaXhwd19vcHRzID0gc3RyZHVwKCIiKTsKLQkJCX0KLQkJCWNoZWNrX3VuaXhwd191c2VycHJlZnMoKTsKLQkJfQotCQl1bml4cHdfc3lzdGVtX2dyZWV0ZXJfYWN0aXZlID0gMjsKLQkJc2V0X2VudigiWDExVk5DX1hETV9PTkxZIiwgIjEiKTsKLQkJcmZiTG9nKCJ1bml4cHdfc3lzdGVtX2dyZWV0ZXI6IFZOQyBjbGllbnQgcHJlc3NlZCAnRXNjYXBlJy4gQWxsb3dpbmdcbiIpOwotCQlyZmJMb2coInVuaXhwd19zeXN0ZW1fZ3JlZXRlcjogYSAqRlJFRSogKG5vIHBhc3N3b3JkKSBjb25uZWN0aW9uIHRvXG4iKTsKLQkJcmZiTG9nKCJ1bml4cHdfc3lzdGVtX2dyZWV0ZXI6IHRoZSBzeXN0ZW0gWERNL0dETS9LRE0gbG9naW4gZ3JlZXRlci5cbiIpOwotCQlpZiAoMSkgewotCQkJY2hhciBtc2dbXSA9ICIgUGxlYXNlIHdhaXQuLi4gIjsKLQkJCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwKLQkJCSAgICB0ZXh0X3goKSwgdGV4dF95KCksIG1zZywgd2hpdGVfcGl4ZWwoKSk7Ci0JCQl1bml4cHdfbWFyaygpOwotCi0JCQlwcm9ncmVzc19za2lwcHkoKTsKLQkJfQotCQl1bml4cHdfYWNjZXB0KHUpOwotCQlmcmVlKHUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGluX2xvZ2luICYmIGtleXN5bSA9PSBYS19Fc2NhcGUgJiYgdV9jbnQgPT0gMCkgewotCQllY2hvID0gMDsJCi0JCXJmYkxvZygidW5peHB3X2tleXN0cm9rZTogZWNobyBvZmYuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXRfY250Kys7Ci0KLQlpZiAoaW5fbG9naW4pIHsKLQkJaWYgKGtleXN5bSA9PSBYS19CYWNrU3BhY2UgfHwga2V5c3ltID09IFhLX0RlbGV0ZSkgewotCQkJaWYgKHVfY250ID4gMCkgewotCQkJCXVzZXJbdV9jbnQtMV0gPSAnXDAnOwotCQkJCXVfY250LS07Ci0KLQkJCQl4ID0gdGV4dF94KCk7Ci0JCQkJeSA9IHRleHRfeSgpOwotCQkJCWlmIChzY2FsaW5nKSB7Ci0JCQkJCWludCB4MiA9IHggLyBzY2FsZV9mYWNfeDsKLQkJCQkJaW50IHkyID0geSAvIHNjYWxlX2ZhY195OwotCQkJCQlpbnQgdzIgPSBjaGFyX3cgLyBzY2FsZV9mYWNfeDsKLQkJCQkJaW50IGgyID0gY2hhcl9oIC8gc2NhbGVfZmFjX3k7Ci0KLQkJCQkJeDIgPSBuZml4KHgyLCBkcHlfeCk7Ci0JCQkJCXkyID0gbmZpeCh5MiwgZHB5X3kpOwotCQkJCQkKLQkJCQkJemVyb19mYih4MiAtIHcyLCB5MiAtIGgyLCB4MiwgeTIpOwotCQkJCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeDIgLSB3MiwKLQkJCQkJICAgIHkyIC0gaDIsIHgyLCB5MiwgMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJemVyb19mYih4IC0gY2hhcl93LCB5IC0gY2hhcl9oLCB4LCB5KTsKLQkJCQkJbWFya19yZWN0X2FzX21vZGlmaWVkKHggLSBjaGFyX3csCi0JCQkJCSAgICB5IC0gY2hhcl9oLCB4LCB5LCAwKTsKLQkJCQl9Ci0JCQkJY2hhcl9jb2wtLTsKLQkJCX0KLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGtleXN5bSA9PSBYS19SZXR1cm4gfHwga2V5c3ltID09IFhLX0xpbmVmZWVkIHx8IGtleXN5bSA9PSBYS19UYWIpIHsKLQkJCWNoYXIgcHdbXSA9ICJQYXNzd29yZDogIjsKLQotCQkJaWYgKGRvd24pIHsKLQkJCQkvKgotCQkJCSAqIHJlcXVpcmUgVXAgc28gdGhlIFJldHVybiBVcCBpcyBub3QgcHJvY2Vzc2VkCi0JCQkJICogYnkgdGhlIG5vcm1hbCBzZXNzaW9uIGFmdGVyIGxvZ2luLgotCQkJCSAqIChhY3R1YWxseSB3ZSBhbHJlYWR5IHJldHVybmVkIGFib3ZlKQotCQkJCSAqLwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHRfY250ID09IDEpIHsKLQkJCQkvKiBhY2NpZGVudGFsIGluaXRpYWwgcmV0dXJuLCBlLmcuIGZyb20geHRlcm0gKi8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWluX2xvZ2luID0gMDsKLQkJCWluX3Bhc3N3ZCA9IDE7Ci0KLQkJCWNoYXJfcm93Kys7Ci0JCQljaGFyX2NvbCA9IDA7Ci0KLQkJCXggPSB0ZXh0X3goKTsKLQkJCXkgPSB0ZXh0X3koKTsKLQkJCXJmYkRyYXdTdHJpbmcocHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgeCwgeSwgcHcsCi0JCQkgICAgd2hpdGVfcGl4ZWwoKSk7Ci0KLQkJCWNoYXJfY29sID0gc3RybGVuKHB3KTsKLQkJCXVuaXhwd19tYXJrKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodV9jbnQgPT0gMCAmJiBrZXlzeW0gPT0gWEtfVXApIHsKLQkJCS8qCi0JCQkgKiBBbGxvdyB1c2VyIHRvIGhpdCBVcCBhcnJvdyBhdCBiZWdpbm5pbmcgdG8KLQkJCSAqIHJlZ2FpbiB0aGVpciB1c2VybmFtZSBwbHVzIGFueSBvcHRpb25zLgotCQkJICovCi0JCQlpbnQgaTsKLQkJCWZvciAoaT0wOyBpIDwgbm1heDsgaSsrKSB7Ci0JCQkJdXNlcltpXSA9ICdcMCc7Ci0JCQl9Ci0JCQlmb3IgKGk9MDsgaSA8IG5tYXg7IGkrKykgewotCQkJCWNoYXIgc3RyWzEwXTsKLQkJCQl1c2VyW3VfY250KytdID0gdXNlcl9yW2ldOwotCQkJCWlmICh1c2VyX3JbaV0gPT0gJ1wwJykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJc3RyWzBdID0gKGNoYXIpIHVzZXJfcltpXTsKLQkJCQlzdHJbMV0gPSAnXDAnOwotCi0JCQkJeCA9IHRleHRfeCgpOwotCQkJCXkgPSB0ZXh0X3koKTsKLQkJCQlpZiAoZWNobykgewotCQkJCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsIHgsIHksCi0JCQkJCSAgICBzdHIsIHdoaXRlX3BpeGVsKCkpOwotCQkJCX0KLQkJCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeCwgeS1jaGFyX2gsIHgrY2hhcl93LAotCQkJCSAgICB5LCBzY2FsaW5nKTsKLQkJCQljaGFyX2NvbCsrOwotCQkJCXVzbGVlcCgxMCoxMDAwKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChrZXlzeW0gPCAnICcgfHwga2V5c3ltID49IDB4N2YpIHsKLQkJCS8qIHJlcXVpcmUgbm9ybWFsIGtleWJvYXJkIGNoYXJhY3RlcnMgZm9yIHVzZXJuYW1lICovCi0JCQlyZmJMb2coInVuaXhwd19rZXlzdHJva2U6IGJhZCBrZXlzeW00OiAweCV4XG4iLCAoaW50KSBrZXlzeW0pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHVfY250ID49IG5tYXggLSAxKSB7Ci0JCQkvKiB1c2VyW3VfY250PTk5XSB3aWxsIGJlICdcMCcgKi8KLQkJCXJmYkxvZygidW5peHB3X2Rlbnk6IHVzZXJuYW1lIHRvbyBsb25nOiAlZFxuIiwgdV9jbnQpOwotCQkJZm9yIChpPTA7IGk8bm1heDsgaSsrKSB7Ci0JCQkJdXNlcltpXSA9ICdcMCc7Ci0JCQkJcGFzc1tpXSA9ICdcMCc7Ci0JCQl9Ci0JCQl1bml4cHdfZGVueSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLSNpZiAwCi0JCXVzZXJbdV9jbnQrK10gPSBrZXlzdHJbMF07Ci0jZWxzZQotCQl1c2VyW3VfY250KytdID0gKGNoYXIpIGtleXN5bTsKLQkJZm9yIChpPTA7IGkgPCBubWF4OyBpKyspIHsKLQkJCS8qIGtlZXAgYSBmdWxsIGNvcHkgb2YgdXNlcm5hbWUgKi8KLQkJCXVzZXJfcltpXSA9IHVzZXJbaV07Ci0JCX0KLQkJa2V5c3RyWzBdID0gKGNoYXIpIGtleXN5bTsKLSNlbmRpZgotCQlrZXlzdHJbMV0gPSAnXDAnOwotCi0JCXggPSB0ZXh0X3goKTsKLQkJeSA9IHRleHRfeSgpOwotCi1pZiAoZGIgJiYgZGIgPD0gMikgZnByaW50ZihzdGRlcnIsICJ1X2NudDogJWQgJWQvJWQga3M6IDB4JXggICclcydcbiIsIHVfY250LCB4LCB5LCBrZXlzeW0sIGtleXN0cik7Ci0KLQkJaWYgKGVjaG8gKSB7Ci0JCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsIHgsIHksIGtleXN0ciwgd2hpdGVfcGl4ZWwoKSk7Ci0JCX0KLQotCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeCwgeS1jaGFyX2gsIHgrY2hhcl93LCB5LCBzY2FsaW5nKTsKLQkJY2hhcl9jb2wrKzsKLQotCQlyZXR1cm47Ci0KLQl9IGVsc2UgaWYgKGluX3Bhc3N3ZCkgewotCQlpZiAoa2V5c3ltID09IFhLX0JhY2tTcGFjZSB8fCBrZXlzeW0gPT0gWEtfRGVsZXRlKSB7Ci0JCQlpZiAocF9jbnQgPiAwKSB7Ci0JCQkJcGFzc1twX2NudC0xXSA9ICdcMCc7Ci0JCQkJcF9jbnQtLTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfTGluZWZlZWQpIHsKLQkJCWlmIChkb3duKSB7Ci0JCQkJLyoKLQkJCQkgKiByZXF1aXJlIFVwIHNvIHRoZSBSZXR1cm4gVXAgaXMgbm90IHByb2Nlc3NlZAotCQkJCSAqIGJ5IHRoZSBub3JtYWwgc2Vzc2lvbiBhZnRlciBsb2dpbi4KLQkJCQkgKiAoYWN0dWFsbHkgd2UgYWxyZWFkeSByZXR1cm5lZCBhYm92ZSkKLQkJCQkgKi8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICgxKSB7Ci0JCQkJY2hhciBtc2dbXSA9ICIgUGxlYXNlIHdhaXQuLi4gIjsKLQkJCQlyZmJEcmF3U3RyaW5nKHBzY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsCi0JCQkJICAgIHRleHRfeCgpLCB0ZXh0X3koKSwgbXNnLCB3aGl0ZV9waXhlbCgpKTsKLQkJCQl1bml4cHdfbWFyaygpOwotCi0JCQkJcHJvZ3Jlc3Nfc2tpcHB5KCk7Ci0JCQl9Ci0KLQkJCWluX2xvZ2luID0gMDsKLQkJCWluX3Bhc3N3ZCA9IDA7Ci0KLQkJCXBhc3NbcF9jbnQrK10gPSAnXG4nOwotCQkJdW5peHB3X3ZlcmlmeV9zY3JlZW4odXNlciwgcGFzcyk7Ci0JCQlmb3IgKGk9MDsgaTxubWF4OyBpKyspIHsKLQkJCQl1c2VyW2ldID0gJ1wwJzsKLQkJCQlwYXNzW2ldID0gJ1wwJzsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChrZXlzeW0gPCAnICcgfHwga2V5c3ltID49IDB4N2YpIHsKLQkJCS8qIHJlcXVpcmUgbm9ybWFsIGtleWJvYXJkIGNoYXJhY3RlcnMgZm9yIHBhc3N3b3JkICovCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocF9jbnQgPj0gbm1heCAtIDIpIHsKLQkJCS8qIHBhc3NbdV9jbnQ9OThdIHdpbGwgYmUgJ1xuJyAqLwotCQkJLyogcGFzc1t1X2NudD05OV0gd2lsbCBiZSAnXDAnICovCi0JCQlyZmJMb2coInVuaXhwd19kZW55OiBwYXNzd29yZCB0b28gbG9uZzogJWRcbiIsIHBfY250KTsKLQkJCWZvciAoaT0wOyBpPG5tYXg7IGkrKykgewotCQkJCXVzZXJbaV0gPSAnXDAnOwotCQkJCXBhc3NbaV0gPSAnXDAnOwotCQkJfQotCQkJdW5peHB3X2RlbnkoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhc3NbcF9jbnQrK10gPSAoY2hhcikga2V5c3ltOwotCi0JCXJldHVybjsKLQotCX0gZWxzZSB7Ci0JCS8qIHNob3VsZCBub3QgaGFwcGVuLi4uIGFueXdheSBjbGVhbiB1cCBhIGJpdC4gKi8KLQkJdV9jbnQgPSAwOwotCQlwX2NudCA9IDA7Ci0JCWZvciAoaT0wOyBpPG5tYXg7IGkrKykgewotCQkJdXNlcl9yW2ldID0gJ1wwJzsKLQkJCXVzZXJbaV0gPSAnXDAnOwotCQkJcGFzc1tpXSA9ICdcMCc7Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhcHBseV9vcHRzIChjaGFyICp1c2VyKSB7Ci0JY2hhciAqcCwgKnEsICpzdHIsICpvcHRzID0gTlVMTCwgKm9wdHNfc3RhciA9IE5VTEw7Ci0JcmZiQ2xpZW50UHRyIGNsOwotCUNsaWVudERhdGEgKmNkOwotCWludCBpLCBub3Rtb2RlID0gMDsKLQotCWlmICghIHVuaXhwd19jbGllbnQpIHsKLQkJcmZiTG9nKCJhcHBseV9vcHRzOiB1bml4cHdfY2xpZW50IGlzIE5VTExcbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQljZCA9IChDbGllbnREYXRhICopIHVuaXhwd19jbGllbnQtPmNsaWVudERhdGE7Ci0JY2wgPSB1bml4cHdfY2xpZW50OwotCi0JaWYgKCEgY2QpIHsKLQkJcmZiTG9nKCJhcHBseV9vcHRzOiBubyBDbGllbnREYXRhXG4iKTsKLQl9Ci0JCi0JaWYgKHVzZXIgJiYgY2QpIHsKLQkJaWYgKGNkLT51bml4bmFtZSkgewotCQkJZnJlZShjZC0+dW5peG5hbWUpOwotCQl9Ci0JCWNkLT51bml4bmFtZSA9IHN0cmR1cCh1c2VyKTsKLQkJcmZiTG9nKCJhcHBseV9vcHRzOiBzZXQgdW5peG5hbWUgdG86ICVzXG4iLCBjZC0+dW5peG5hbWUpOwotCX0KLQotCWlmICghIHVuaXhwd19saXN0KSB7Ci0JCXJldHVybjsKLQl9Ci0Jc3RyID0gc3RyZHVwKHVuaXhwd19saXN0KTsKLQotCS8qIGFwcGx5IGFueSBwZXItdXNlciBvcHRpb25zLiAqLwotCWlmIChzdHJbMF0gPT0gJyEnKSB7Ci0JCXAgPSBzdHJ0b2soc3RyKzEsICIsIik7Ci0JCW5vdG1vZGUgPSAxOwotCX0gZWxzZSB7Ci0JCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCX0KLQl3aGlsZSAocCkgewotCQlpZiAoIChxID0gc3RyY2hyKHAsICc6JykpICE9IE5VTEwgKSB7Ci0JCQkqcSA9ICdcMCc7CS8qIGdldCByaWQgb2Ygb3B0aW9ucy4gKi8KLQkJfSBlbHNlIHsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh1c2VyICYmICFzdHJjbXAodXNlciwgcCkpIHsKLQkJCS8qIHdpbGwgbm90IGhhcHBlbiBpbiBub3Rtb2RlICovCi0JCQlvcHRzID0gc3RyZHVwKHErMSk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoIioiLCBwKSkgewotCQkJb3B0c19zdGFyID0gc3RyZHVwKHErMSk7Ci0JCX0KLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmcmVlKHN0cik7Ci0KLQlmb3IgKGk9MDsgaSA8IDI7IGkrKykgewotCQljaGFyICpzID0gKGkgPT0gMCkgPyBvcHRzX3N0YXIgOiBvcHRzOwotCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwID0gc3RydG9rKHMsICIrIik7Ci0JCXdoaWxlIChwKSB7Ci0JCQlpZiAoIXN0cmNtcChwLCAidmlld29ubHkiKSkgewotCQkJCWNsLT52aWV3T25seSA9IFRSVUU7Ci0JCQkJaWYgKGNkKSB7Ci0JCQkJCXN0cm5jcHkoY2QtPmlucHV0LCAiLSIsIENJTEVOKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgImZ1bGxhY2Nlc3MiKSkgewotCQkJCWNsLT52aWV3T25seSA9IEZBTFNFOwotCQkJCWlmIChjZCkgewotCQkJCQlzdHJuY3B5KGNkLT5pbnB1dCwgIi0iLCBDSUxFTik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgocSA9IHN0cnN0cihwLCAiaW5wdXQ9IikpID09IHApIHsKLQkJCQlxICs9IHN0cmxlbigiaW5wdXQ9Iik7Ci0JCQkJaWYgKGNkKSB7Ci0JCQkJCXN0cm5jcHkoY2QtPmlucHV0LCBxLCBDSUxFTik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJkZW55IikpIHsKLQkJCQljbC0+dmlld09ubHkgPSBUUlVFOwotCQkJCXVuaXhwd19kZW55KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwID0gc3RydG9rKE5VTEwsICIrIik7Ci0JCX0KLQkJZnJlZShzKTsKLQl9Ci19Ci0KLXZvaWQgdW5peHB3X2FjY2VwdChjaGFyICp1c2VyKSB7Ci0JYXBwbHlfb3B0cyh1c2VyKTsKLQotCWlmICghdXNlX3N0dW5uZWwpIHsKLQkJc3NsX2hlbHBlcl9waWQoMCwgLTIpOwkvKiB3YWl0YWxsICovCi0JfQotCi0JaWYgKGFjY2VwdF9jbWQgJiYgc3Ryc3RyKGFjY2VwdF9jbWQsICJwb3B1cCIpID09IGFjY2VwdF9jbWQpIHsKLQkJaWYgKHVzZV9kcHkgJiYgc3Ryc3RyKHVzZV9kcHksICJXQUlUOiIpID09IHVzZV9kcHkgJiYKLQkJICAgIGRweSA9PSBOVUxMKSB7Ci0JCQkvKiBoYW5kbGVkIGluIG1haW4oKSAqLwotCQkJdW5peHB3X2NsaWVudC0+b25Ib2xkID0gVFJVRTsKLQkJfSBlbHNlIGlmICghIGFjY2VwdF9jbGllbnQodW5peHB3X2NsaWVudCkpIHsKLQkJCXVuaXhwd19kZW55KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoc3RhcnRlZF9hc19yb290ID09IDEgJiYgdXNlcnNfbGlzdAotCSAgICAmJiBzdHJzdHIodXNlcnNfbGlzdCwgInVuaXhwdz0iKSA9PSB1c2Vyc19saXN0KSB7Ci0JCWlmIChnZXR1aWQoKSAmJiBnZXRldWlkKCkpIHsKLQkJCXJmYkxvZygidW5peHB3X2FjY2VwdDogdW5peHB3PSBidXQgbm90IHJvb3RcbiIpOwotCQkJc3RhcnRlZF9hc19yb290ID0gMjsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKnUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4odXNlcikrMSk7IAotCi0JCQl1WzBdID0gJ1wwJzsKLQkJCWlmICghc3RyY21wKHVzZXJzX2xpc3QsICJ1bml4cHc9IikpIHsKLQkJCQlzcHJpbnRmKHUsICIrJXMiLCB1c2VyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hhciAqcCwgKnN0ciA9IHN0cmR1cCh1c2Vyc19saXN0KTsKLQkJCQlwID0gc3RydG9rKHN0ciArIHN0cmxlbigidW5peHB3PSIpLCAiLCIpOwotCQkJCXdoaWxlIChwKSB7Ci0JCQkJCWlmICghc3RyY21wKHAsIHVzZXIpKSB7Ci0JCQkJCQlzcHJpbnRmKHUsICIrJXMiLCB1c2VyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCQl9Ci0JCQkJZnJlZShzdHIpOwotCQkJfQotCQkJCi0JCQlpZiAodVswXSA9PSAnXDAnKSB7Ci0JCQkJcmZiTG9nKCJ1bml4cHdfYWNjZXB0IHNraXBwaW5nIHN3aXRjaCB0byB1c2VyOiAlc1xuIiwgdXNlcik7Ci0JCQl9IGVsc2UgaWYgKHN3aXRjaF91c2VyKHUsIDApKSB7Ci0JCQkJcmZiTG9nKCJ1bml4cHdfYWNjZXB0IHN3aXRjaGVkIHRvIHVzZXI6ICVzXG4iLCB1c2VyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiTG9nKCJ1bml4cHdfYWNjZXB0IGZhaWxlZCB0byBzd2l0Y2ggdG8gdXNlcjogJXNcbiIsIHVzZXIpOwotCQkJfQotCQkJZnJlZSh1KTsKLQkJfQotCX0KLQotCWlmICh1bml4cHdfbG9naW5fdmlld29ubHkpIHsKLQkJdW5peHB3X2NsaWVudC0+dmlld09ubHkgPSBUUlVFOwotCX0KLQl1bml4cHdfaW5fcHJvZ3Jlc3MgPSAwOwotCS8qIG11dGV4ICovCi0Jc2NyZWVuLT5wZXJtaXRGaWxlVHJhbnNmZXIgPSB1bml4cHdfZmlsZV94ZmVyX3NhdmU7Ci0JaWYgKCh0aWdodGZpbGV4ZmVyID0gdW5peHB3X3RpZ2h0dm5jX3hmZXJfc2F2ZSkpIHsKLQkJLyogdGhpcyBkb2Vzbid0IHdvcms6IHRoZSBjdXJyZW50IGNsaWVudCBpcyBuZXZlciByZWdpc3RlcmVkISAqLwotI2lmZGVmIExJQlZOQ1NFUlZFUl9XSVRIX1RJR0hUVk5DX0ZJTEVUUkFOU0ZFUgotCQlyZmJMb2coInJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb246IDFcbiIpOwotICAgICAgICAgICAgICAgIHJmYlJlZ2lzdGVyVGlnaHRWTkNGaWxlVHJhbnNmZXJFeHRlbnNpb24oKTsKLSNlbmRpZgotCX0KLQl1bml4cHdfY2xpZW50ID0gTlVMTDsKLQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoMCwgMCwgZHB5X3gsIGRweV95LCAwKTsKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJcmVmcmVzaF9zY3JlZW4oMSk7Ci0JfQotfQotCi12b2lkIHVuaXhwd19kZW55KHZvaWQpIHsKLQlpbnQgeCwgeSwgaTsKLQljaGFyIHBkW10gPSAiUGVybWlzc2lvbiBkZW5pZWQuIjsKLQotCXJmYkxvZygidW5peHB3X2Rlbnk6ICVkLCAlZFxuIiwgdW5peHB3X2RlbmllZCwgdW5peHB3X2luX3Byb2dyZXNzKTsKLQlpZiAoISB1bml4cHdfZGVuaWVkKSB7Ci0JCXVuaXhwd19kZW5pZWQgPSAxOwotCi0JCWNoYXJfcm93ICs9IDI7Ci0JCWNoYXJfY29sID0gMDsKLQkJeCA9IGNoYXJfeCArIGNoYXJfY29sICogY2hhcl93OwotCQl5ID0gY2hhcl95ICsgY2hhcl9yb3cgKiBjaGFyX2g7Ci0KLQkJcmZiRHJhd1N0cmluZyhwc2NyZWVuLCAmZGVmYXVsdDh4MTZGb250LCB4LCB5LCBwZCwgd2hpdGVfcGl4ZWwoKSk7Ci0JCXVuaXhwd19tYXJrKCk7Ci0KLQkJZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCQlyZmJQRSgtMSk7Ci0JCQlyZmJQRSgtMSk7Ci0JCQl1c2xlZXAoNTAwICogMTAwMCk7Ci0JCX0KLQl9Ci0KLQlpZiAodW5peHB3X2NsaWVudCkgewotCQlyZmJDbG9zZUNsaWVudCh1bml4cHdfY2xpZW50KTsKLQkJcmZiQ2xpZW50Q29ubmVjdGlvbkdvbmUodW5peHB3X2NsaWVudCk7Ci0JCXJmYlBFKC0xKTsKLQl9Ci0KLQl1bml4cHdfaW5fcHJvZ3Jlc3MgPSAwOwotCS8qIG11dGV4ICovCi0Jc2NyZWVuLT5wZXJtaXRGaWxlVHJhbnNmZXIgPSB1bml4cHdfZmlsZV94ZmVyX3NhdmU7Ci0JaWYgKCh0aWdodGZpbGV4ZmVyID0gdW5peHB3X3RpZ2h0dm5jX3hmZXJfc2F2ZSkpIHsKLSNpZmRlZiBMSUJWTkNTRVJWRVJfV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIKLQkJcmZiTG9nKCJyZmJSZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uOiAyXG4iKTsKLSAgICAgICAgICAgICAgICByZmJSZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uKCk7Ci0jZW5kaWYKLQl9Ci0JdW5peHB3X2NsaWVudCA9IE5VTEw7Ci0JY29weV9zY3JlZW4oKTsKLX0KLQotdm9pZCB1bml4cHdfbXNnKGNoYXIgKm1zZywgaW50IGRlbGF5KSB7Ci0JaW50IHgsIHksIGk7Ci0KLQljaGFyX3JvdyArPSAyOwotCWNoYXJfY29sID0gMDsKLQl4ID0gY2hhcl94ICsgY2hhcl9jb2wgKiBjaGFyX3c7Ci0JeSA9IGNoYXJfeSArIGNoYXJfcm93ICogY2hhcl9oOwotCi0JcmZiRHJhd1N0cmluZyhwc2NyZWVuLCAmZGVmYXVsdDh4MTZGb250LCB4LCB5LCBtc2csIHdoaXRlX3BpeGVsKCkpOwotCXVuaXhwd19tYXJrKCk7Ci0KLQlmb3IgKGk9MDsgaTw1OyBpKyspIHsKLQkJcmZiUEUoLTEpOwotCQlyZmJQRSgtMSk7Ci0JCXJmYlBFKDUwICogMTAwMCk7Ci0JCXJmYlBFKC0xKTsKLQkJdXNsZWVwKDUwMCAqIDEwMDApOwotCQlpZiAoaSA+PSBkZWxheSkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS94MTF2bmMvdW5peHB3LmggYi94MTF2bmMvdW5peHB3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTNkMzAuLjAwMDAwMDAKLS0tIGEveDExdm5jL3VuaXhwdy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfVU5JWFBXX0gKLSNkZWZpbmUgX1gxMVZOQ19VTklYUFdfSAotCi0vKiAtLSB1bml4cHcuaCAtLSAqLwotCi1leHRlcm4gaW50IHdoaXRlX3BpeGVsKHZvaWQpOwotZXh0ZXJuIHZvaWQgdW5peHB3X3NjcmVlbihpbnQgaW5pdCk7Ci1leHRlcm4gdm9pZCB1bml4cHdfa2V5c3Ryb2tlKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgaW50IGluaXQpOwotZXh0ZXJuIHZvaWQgdW5peHB3X2FjY2VwdChjaGFyICp1c2VyKTsKLWV4dGVybiB2b2lkIHVuaXhwd19kZW55KHZvaWQpOwotZXh0ZXJuIHZvaWQgdW5peHB3X21zZyhjaGFyICptc2csIGludCBkZWxheSk7Ci1leHRlcm4gaW50IHN1X3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpwYXNzLCBjaGFyICpjbWQsIGNoYXIgKnJidWYsIGludCAqcmJ1Zl9zaXplLCBpbnQgbm9kaXNwKTsKLWV4dGVybiBpbnQgdW5peHB3X2NtZF9ydW4oY2hhciAqdXNlciwgY2hhciAqcGFzcywgY2hhciAqY21kLCBjaGFyICpsaW5lLCBpbnQgKm4pOwotZXh0ZXJuIGludCBjcnlwdF92ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcyk7Ci1leHRlcm4gaW50IGNtZF92ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcyk7Ci1leHRlcm4gaW50IHVuaXhwd192ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqcGFzcyk7Ci1leHRlcm4gdm9pZCB1bml4cHdfdmVyaWZ5X3NjcmVlbihjaGFyICp1c2VyLCBjaGFyICpwYXNzKTsKLQotZXh0ZXJuIGludCB1bml4cHdfaW5fcHJvZ3Jlc3M7Ci1leHRlcm4gaW50IHVuaXhwd19kZW5pZWQ7Ci1leHRlcm4gaW50IHVuaXhwd19pbl9yZmJQRTsKLWV4dGVybiBpbnQgdW5peHB3X2xvZ2luX3ZpZXdvbmx5OwotZXh0ZXJuIGludCB1bml4cHdfdGlnaHR2bmNfeGZlcl9zYXZlOwotZXh0ZXJuIHJmYkJvb2wgdW5peHB3X2ZpbGVfeGZlcl9zYXZlOwotZXh0ZXJuIHRpbWVfdCB1bml4cHdfbGFzdF90cnlfdGltZTsKLWV4dGVybiByZmJDbGllbnRQdHIgdW5peHB3X2NsaWVudDsKLWV4dGVybiBpbnQga2VlcF91bml4cHc7Ci1leHRlcm4gY2hhciAqa2VlcF91bml4cHdfdXNlcjsKLWV4dGVybiBjaGFyICprZWVwX3VuaXhwd19wYXNzOwotZXh0ZXJuIGNoYXIgKmtlZXBfdW5peHB3X29wdHM7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX1VOSVhQV19IICovCmRpZmYgLS1naXQgYS94MTF2bmMvdXNlci5jIGIveDExdm5jL3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZmJiOS4uMDAwMDAwMAotLS0gYS94MTF2bmMvdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1NSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHVzZXIuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAic29saWQuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgInNzbGhlbHBlci5oIgotI2luY2x1ZGUgInh3cmFwcGVycy5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAiY3Vyc29yLmgiCi0jaW5jbHVkZSAicmVtb3RlLmgiCi0jaW5jbHVkZSAic3NsaGVscGVyLmgiCi0jaW5jbHVkZSAiYXZhaGkuaCIKLQotdm9pZCBjaGVja19zd2l0Y2hlZF91c2VyKHZvaWQpOwotdm9pZCBsdXJrX2xvb3AoY2hhciAqc3RyKTsKLWludCBzd2l0Y2hfdXNlcihjaGFyICp1c2VyLCBpbnQgZmJfbW9kZSk7Ci1pbnQgcmVhZF9wYXNzd2RzKGNoYXIgKnBhc3NmaWxlKTsKLXZvaWQgaW5zdGFsbF9wYXNzd2RzKHZvaWQpOwotdm9pZCBjaGVja19uZXdfcGFzc3dkcyhpbnQgZm9yY2UpOwotdm9pZCBwcm9ncmVzc19jbGllbnQodm9pZCk7Ci1pbnQgd2FpdF9mb3JfY2xpZW50KGludCAqYXJnYywgY2hhcioqIGFyZ3YsIGludCBodHRwKTsKLXJmYkJvb2wgY3VzdG9tX3Bhc3N3ZF9jaGVjayhyZmJDbGllbnRQdHIgY2wsIGNvbnN0IGNoYXIgKnJlc3BvbnNlLCBpbnQgbGVuKTsKLWNoYXIgKnhkbWNwX2luc2VydCA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIHN3aXRjaF91c2VyX3Rhc2tfZHVtbXkodm9pZCk7Ci1zdGF0aWMgdm9pZCBzd2l0Y2hfdXNlcl90YXNrX3NvbGlkX2JnKHZvaWQpOwotc3RhdGljIGNoYXIgKmdldF9sb2dpbl9saXN0KGludCB3aXRoX2Rpc3BsYXkpOwotc3RhdGljIGNoYXIgKip1c2VyX2xpc3QoY2hhciAqdXNlcl9zdHIpOwotc3RhdGljIHZvaWQgdXNlcjJ1aWQoY2hhciAqdXNlciwgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgY2hhciAqKm5hbWUsIGNoYXIgKipob21lKTsKLXN0YXRpYyBpbnQgbHVyayhjaGFyICoqdXNlcnMpOwotc3RhdGljIGludCBndWVzc191c2VyX2FuZF9zd2l0Y2goY2hhciAqc3RyLCBpbnQgZmJfbW9kZSk7Ci1zdGF0aWMgaW50IHRyeV91c2VyX2FuZF9kaXNwbGF5KHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBjaGFyICpkcHlzdHIpOwotc3RhdGljIGludCBzd2l0Y2hfdXNlcl9lbnYodWlkX3QgdWlkLCBnaWRfdCBnaWQsIGNoYXIgKm5hbWUsIGNoYXIgKmhvbWUsIGludCBmYl9tb2RlKTsKLXN0YXRpYyB2b2lkIHRyeV90b19zd2l0Y2hfdXNlcnModm9pZCk7Ci0KLQotLyogdGFza3MgZm9yIGFmdGVyIHdlIHN3aXRjaCAqLwotc3RhdGljIHZvaWQgc3dpdGNoX3VzZXJfdGFza19kdW1teSh2b2lkKSB7Ci0JOwkvKiBkdW1teSBkb2VzIG5vdGhpbmcgKi8KLX0KLXN0YXRpYyB2b2lkIHN3aXRjaF91c2VyX3Rhc2tfc29saWRfYmcodm9pZCkgewotCS8qIHdlIGhhdmUgc3dpdGNoZWQgdXNlcnMsIHNvbWUgdGhpbmdzIHRvIGRvLiAqLwotCWlmICh1c2Vfc29saWRfYmcgJiYgY2xpZW50X2NvdW50KSB7Ci0JCXNvbGlkX2JnKDApOwotCX0KLX0KLQotdm9pZCBjaGVja19zd2l0Y2hlZF91c2VyKHZvaWQpIHsKLQlzdGF0aWMgdGltZV90IHNjaGVkX3N3aXRjaGVkX3VzZXIgPSAwOwotCXN0YXRpYyBpbnQgZGlkX3NvbGlkID0gMDsKLQlzdGF0aWMgaW50IGRpZF9kdW1teSA9IDA7Ci0JaW50IGRlbGF5ID0gMTU7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlpZiAoc3RhcnRlZF9hc19yb290ID09IDEgJiYgdXNlcnNfbGlzdCkgewotCQl0cnlfdG9fc3dpdGNoX3VzZXJzKCk7Ci0JCWlmIChzdGFydGVkX2FzX3Jvb3QgPT0gMikgewotCQkJLyoKLQkJCSAqIHNjaGVkdWxlIHRoZSBzd2l0Y2hfdXNlcl90YXNrcygpIGNhbGwKLQkJCSAqIDE1IHNlY3MgaXMgZm9yIHBpZ2d5IGRlc2t0b3BzIHRvIHN0YXJ0IHVwLgotCQkJICogbWlnaHQgbm90IGJlIGVub3VnaCBmb3Igc2xvdyBtYWNoaW5lcy4uLgotCQkJICovCi0JCQlzY2hlZF9zd2l0Y2hlZF91c2VyID0gbm93OwotCQkJZGlkX2R1bW15ID0gMDsKLQkJCWRpZF9zb2xpZCA9IDA7Ci0JCQkvKiBhZGQgb3RoZXIgYWN0aXZpdGllcyAqLwotCQl9Ci0JfQotCWlmICghIHNjaGVkX3N3aXRjaGVkX3VzZXIpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIGRpZF9kdW1teSkgewotCQlzd2l0Y2hfdXNlcl90YXNrX2R1bW15KCk7Ci0JCWRpZF9kdW1teSA9IDE7Ci0JfQotCWlmICghIGRpZF9zb2xpZCkgewotCQlpbnQgZG9pdCA9IDA7Ci0JCWNoYXIgKnNzID0gc29saWRfc3RyOwotCQlpZiAobm93ID49IHNjaGVkX3N3aXRjaGVkX3VzZXIgKyBkZWxheSkgewotCQkJZG9pdCA9IDE7Ci0JCX0gZWxzZSBpZiAoc3MgJiYgc3Ryc3RyKHNzLCAicm9vdDoiKSA9PSBzcykgewotCQkgICAgCWlmIChub3cgPj0gc2NoZWRfc3dpdGNoZWRfdXNlciArIDMpIHsKLQkJCQlkb2l0ID0gMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJjbXAoInJvb3QiLCBndWVzc19kZXNrdG9wKCkpKSB7Ci0JCQl1c2xlZXAoMTAwMCAqIDEwMDApOwotCQkJZG9pdCA9IDE7Ci0JCX0KLQkJaWYgKGRvaXQpIHsKLQkJCXN3aXRjaF91c2VyX3Rhc2tfc29saWRfYmcoKTsKLQkJCWRpZF9zb2xpZCA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoZGlkX2R1bW15ICYmIGRpZF9zb2xpZCkgewotCQlzY2hlZF9zd2l0Y2hlZF91c2VyID0gMDsKLQl9Ci19Ci0KLS8qIHV0aWxpdGllcyBmb3Igc3dpdGNoaW5nIHVzZXJzICovCi1zdGF0aWMgY2hhciAqZ2V0X2xvZ2luX2xpc3QoaW50IHdpdGhfZGlzcGxheSkgewotCWNoYXIgKm91dDsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9VVE1QWF9ICi0JaW50IGksIGNudCwgbWF4ID0gMjAwLCB1dF9uYW1lc2l6ZSA9IDMyOwotCWludCBkcHltYXggPSAxMDAwLCBzYXdkcHlbMTAwMF07Ci0Jc3RydWN0IHV0bXB4ICp1dHg7Ci0KLQkvKiBzaXplIGJhc2VkIG9uICJ1c2VybmFtZTo5OTksIiAqIG1heCAqLwotCW91dCA9IChjaGFyICopIG1hbGxvYyhtYXggKiAodXRfbmFtZXNpemUrMSszKzEpICsgMSk7Ci0Jb3V0WzBdID0gJ1wwJzsKLQotCWZvciAoaT0wOyBpPGRweW1heDsgaSsrKSB7Ci0JCXNhd2RweVtpXSA9IDA7Ci0JfQotCi0Jc2V0dXR4ZW50KCk7Ci0JY250ID0gMDsKLQl3aGlsZSAoMSkgewotCQljaGFyICp1c2VyLCAqbGluZSwgKmhvc3QsICppZDsKLQkJY2hhciB0bXBbMTBdOwotCQlpbnQgZCA9IC0xOwotCQl1dHggPSBnZXR1dHhlbnQoKTsKLQkJaWYgKCEgdXR4KSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAodXR4LT51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykgewotCQkJY29udGludWU7Ci0JCX0KLQkJdXNlciA9IGxibGFua3ModXR4LT51dF91c2VyKTsKLQkJaWYgKCp1c2VyID09ICdcMCcpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJjaHIodXNlciwgJywnKSkgewotCQkJY29udGludWU7CS8qIHVubGlrZWx5LCBidXQgY29tbWEgaXMgb3VyIHNlcC4gKi8KLQkJfQotCi0JCWxpbmUgPSBsYmxhbmtzKHV0eC0+dXRfbGluZSk7Ci0JCWhvc3QgPSBsYmxhbmtzKHV0eC0+dXRfaG9zdCk7Ci0JCWlkICAgPSBsYmxhbmtzKHV0eC0+dXRfaWQpOwotCi0JCWlmICh3aXRoX2Rpc3BsYXkpIHsKLQkJCWlmICgwICYmIGxpbmVbMF0gIT0gJzonICYmIHN0cmNtcChsaW5lLCAiZHRsb2NhbCIpKSB7Ci0JCQkJLyogWFhYIHVzZWZ1bD8gKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGxpbmVbMF0gPT0gJzonKSB7Ci0JCQkJaWYgKHNzY2FuZihsaW5lLCAiOiVkIiwgJmQpICE9IDEpICB7Ci0JCQkJCWQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZCA8IDAgJiYgaG9zdFswXSA9PSAnOicpIHsKLQkJCQlpZiAoc3NjYW5mKGhvc3QsICI6JWQiLCAmZCkgIT0gMSkgIHsKLQkJCQkJZCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkIDwgMCAmJiBpZFswXSA9PSAnOicpIHsKLQkJCQlpZiAoc3NjYW5mKGlkLCAiOiVkIiwgJmQpICE9IDEpICB7Ci0JCQkJCWQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChkIDwgMCB8fCBkID49IGRweW1heCB8fCBzYXdkcHlbZF0pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNhd2RweVtkXSA9IDE7Ci0JCQlzcHJpbnRmKHRtcCwgIjolZCIsIGQpOwotCQl9IGVsc2UgewotCQkJLyogdHJ5IHRvIGVsaW1pbmF0ZSByZXBlYXRzICovCi0JCQlpbnQgcmVwZWF0ID0gMDsKLQkJCWNoYXIgKnE7Ci0KLQkJCXEgPSBvdXQ7Ci0JCQl3aGlsZSAoKHEgPSBzdHJzdHIocSwgdXNlcikpICE9IE5VTEwpIHsKLQkJCQljaGFyICpwID0gcSArIHN0cmxlbih1c2VyKSArIHN0cmxlbigiOkRQWSIpOwotCQkJCWlmIChxID09IG91dCB8fCAqKHEtMSkgPT0gJywnKSB7Ci0JCQkJCS8qIGJvdW5kZWQgb24gbGVmdC4gKi8KLQkJCQkJaWYgKCpwID09ICcsJyB8fCAqcCA9PSAnXDAnKSB7Ci0JCQkJCQkvKiBib3VuZGVkIG9uIHJpZ2h0LiAqLwotCQkJCQkJcmVwZWF0ID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXEgPSBwOwotCQkJfQotCQkJaWYgKHJlcGVhdCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc3ByaW50Zih0bXAsICI6RFBZIik7Ci0JCX0KLQotCQlpZiAoKm91dCkgewotCQkJc3RyY2F0KG91dCwgIiwiKTsKLQkJfQotCQlzdHJjYXQob3V0LCB1c2VyKTsKLQkJc3RyY2F0KG91dCwgdG1wKTsKLQotCQljbnQrKzsKLQkJaWYgKGNudCA+PSBtYXgpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWVuZHV0eGVudCgpOwotI2Vsc2UKLQlvdXQgPSBzdHJkdXAoIiIpOwotI2VuZGlmCi0JcmV0dXJuIG91dDsKLX0KLQotc3RhdGljIGNoYXIgKip1c2VyX2xpc3QoY2hhciAqdXNlcl9zdHIpIHsKLQlpbnQgbiwgaTsKLQljaGFyICpwLCAqKmxpc3Q7Ci0JCi0JcCA9IHVzZXJfc3RyOwotCW4gPSAxOwotCXdoaWxlICgqcCsrKSB7Ci0JCWlmICgqcCA9PSAnLCcpIHsKLQkJCW4rKzsKLQkJfQotCX0KLQlsaXN0ID0gKGNoYXIgKiopIGNhbGxvYygobisxKSpzaXplb2YoY2hhciAqKSwgMSk7Ci0KLQlwID0gc3RydG9rKHVzZXJfc3RyLCAiLCIpOwotCWkgPSAwOwotCXdoaWxlIChwKSB7Ci0JCWxpc3RbaSsrXSA9IHN0cmR1cChwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlsaXN0W2ldID0gTlVMTDsKLQlyZXR1cm4gbGlzdDsKLX0KLQotc3RhdGljIHZvaWQgdXNlcjJ1aWQoY2hhciAqdXNlciwgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgY2hhciAqKm5hbWUsIGNoYXIgKipob21lKSB7Ci0JaW50IG51bWVyaWNhbCA9IDEsIGdvdGdyb3VwID0gMDsKLQljaGFyICpxOwotCi0JKnVpZCA9ICh1aWRfdCkgLTE7Ci0JKm5hbWUgPSBOVUxMOwotCSpob21lID0gTlVMTDsKLQotCXEgPSB1c2VyOwotCXdoaWxlICgqcSkgewotCQlpZiAoISBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAoKnErKykpKSB7Ci0JCQludW1lcmljYWwgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAodXNlcjJncm91cCAhPSBOVUxMKSB7Ci0JCXN0YXRpYyBpbnQgKmRpZCA9IE5VTEw7Ci0JCWludCBpOwotCi0JCWlmIChkaWQgPT0gTlVMTCkgewotCQkJaW50IG4gPSAwOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAodXNlcjJncm91cFtpXSAhPSBOVUxMKSB7Ci0JCQkJbisrOwotCQkJCWkrKzsKLQkJCX0KLQkJCWRpZCA9IChpbnQgKikgbWFsbG9jKChuKzEpICogc2l6ZW9mKGludCkpOyAKLQkJCWkgPSAwOwotCQkJZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCQkJZGlkW2ldID0gMDsKLQkJCX0KLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKHVzZXIyZ3JvdXBbaV0gIT0gTlVMTCkgewotCQkJaWYgKHN0cnN0cih1c2VyMmdyb3VwW2ldLCB1c2VyKSA9PSB1c2VyMmdyb3VwW2ldKSB7Ci0JCQkJY2hhciAqdyA9IHVzZXIyZ3JvdXBbaV0gKyBzdHJsZW4odXNlcik7Ci0JCQkJaWYgKCp3ID09ICcuJykgewotI2lmIChTTUFMTF9GT09UUFJJTlQgPiAyKQotCQkJCQlnb3Rncm91cCA9IDA7Ci0jZWxzZQotCQkJCQlzdHJ1Y3QgZ3JvdXAqIGdyID0gZ2V0Z3JuYW0oKyt3KTsKLQkJCQkJaWYgKCEgZ3IpIHsKLQkJCQkJCXJmYkxvZygiSW52YWxpZCBncm91cDogJXNcbiIsIHcpOwotCQkJCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCQkJfQotCQkJCQkqZ2lkID0gZ3ItPmdyX2dpZDsKLQkJCQkJaWYgKCEgZGlkW2ldKSB7Ci0JCQkJCQlyZmJMb2coInVzZXIydWlkOiB1c2luZyBncm91cCAlcyAoJWQpIGZvciAlc1xuIiwKLQkJCQkJCSAgICB3LCAoaW50KSAqZ2lkLCB1c2VyKTsKLQkJCQkJCWRpZFtpXSA9IDE7Ci0JCQkJCX0KLQkJCQkJZ290Z3JvdXAgPSAxOwotI2VuZGlmCi0JCQkJfQotCQkJfQotCQkJaSsrOwotCQl9Ci0JfQotCi0JaWYgKG51bWVyaWNhbCkgewotCQlpbnQgdSA9IGF0b2kodXNlcik7Ci0KLQkJaWYgKHUgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKnVpZCA9ICh1aWRfdCkgdTsKLQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSAotCWlmICgxKSB7Ci0JCXN0cnVjdCBwYXNzd2QgKnB3OwotCQlpZiAobnVtZXJpY2FsKSB7Ci0JCQlwdyA9IGdldHB3dWlkKCp1aWQpOwotCQl9IGVsc2UgewotCQkJcHcgPSBnZXRwd25hbSh1c2VyKTsKLQkJfQotCQlpZiAocHcpIHsKLQkJCSp1aWQgID0gcHctPnB3X3VpZDsKLQkJCWlmICghIGdvdGdyb3VwKSB7Ci0JCQkJKmdpZCAgPSBwdy0+cHdfZ2lkOwotCQkJfQotCQkJKm5hbWUgPSBwdy0+cHdfbmFtZTsJLyogbi5iLiB1c2UgaW1tZWRpYXRlbHkgKi8KLQkJCSpob21lID0gcHctPnB3X2RpcjsKLQkJfQotCX0KLSNlbmRpZgotfQotCi0KLXN0YXRpYyBpbnQgbHVyayhjaGFyICoqdXNlcnMpIHsKLQl1aWRfdCB1aWQ7Ci0JZ2lkX3QgZ2lkOwotCWludCBzdWNjZXNzID0gMCwgZG1pbiA9IC0xLCBkbWF4ID0gLTE7Ci0JY2hhciAqcCwgKmxvZ2lucywgKip1OwotCWNoYXIgKipsaXN0OwotCWludCBsaW5kOwotCi0JaWYgKCh1ID0gdXNlcnMpICE9IE5VTEwgJiYgKnUgIT0gTlVMTCAmJiAqKCp1KSA9PSAnOicpIHsKLQkJaW50IGxlbjsKLQkJY2hhciAqdG1wOwotCi0JCS8qIGV4dHJhY3QgbWluIGFuZCBtYXggZGlzcGxheSBudW1iZXJzICovCi0JCXRtcCA9ICp1OwotCQlpZiAoc3RyY2hyKHRtcCwgJy0nKSkgewotCQkJaWYgKHNzY2FuZih0bXAsICI6JWQtJWQiLCAmZG1pbiwgJmRtYXgpICE9IDIpIHsKLQkJCQlkbWluID0gLTE7Ci0JCQkJZG1heCA9IC0xOwotCQkJfQotCQl9Ci0JCWlmIChkbWluIDwgMCkgewotCQkJaWYgKHNzY2FuZih0bXAsICI6JWQiLCAmZG1pbikgIT0gMSkgewotCQkJCWRtaW4gPSAtMTsKLQkJCQlkbWF4ID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCWRtYXggPSBkbWluOwotCQkJfQotCQl9Ci0JCWlmICgoZG1pbiA8IDAgfHwgZG1heCA8IDApIHx8IGRtaW4gPiBkbWF4IHx8IGRtYXggPiAxMDAwMCkgewotCQkJZG1pbiA9IC0xOwotCQkJZG1heCA9IC0xOwotCQl9Ci0KLQkJLyogZ2V0IHVzZXIgbG9naW5zIHJlZ2FyZGxlc3Mgb2YgaGF2aW5nIGEgZGlzcGxheTogKi8KLQkJbG9naW5zID0gZ2V0X2xvZ2luX2xpc3QoMCk7Ci0KLQkJLyoKLQkJICogbm93IHdlIGFwcGVuZCB0aGUgbGlzdCBpbiB1c2VycyAobWlnaHQgYXMgd2VsbCB0cnkKLQkJICogdGhlbSkgdGhpcyB3aWxsIHByb2JhYmx5IGFsbG93IHdlaXJkIHdheXMgb2Ygc3RhcnRpbmcKLQkJICogeHNlcnZlcnMgdG8gd29yay4KLQkJICovCi0JCWxlbiA9IHN0cmxlbihsb2dpbnMpOwotCQl1Kys7Ci0JCXdoaWxlICgqdSAhPSBOVUxMKSB7Ci0JCQlsZW4gKz0gc3RybGVuKCp1KSArIHN0cmxlbigiOkRQWSwiKTsKLQkJCXUrKzsKLQkJfQotCQl0bXAgPSAoY2hhciAqKSBtYWxsb2MobGVuKzEpOwotCQlzdHJjcHkodG1wLCBsb2dpbnMpOwotCi0JCS8qIG5vdyBjb25jYXRlbmF0ZSB0aGVtOiAqLwotCQl1ID0gdXNlcnMrMTsKLQkJd2hpbGUgKCp1ICE9IE5VTEwpIHsKLQkJCWNoYXIgKnEsIGNoa1sxMDBdOwotCQkJc25wcmludGYoY2hrLCAxMDAsICIlczpEUFkiLCAqdSk7Ci0JCQlxID0gc3Ryc3RyKHRtcCwgY2hrKTsKLQkJCWlmIChxKSB7Ci0JCQkJY2hhciAqcCA9IHEgKyBzdHJsZW4oY2hrKTsKLQkJCQkKLQkJCQlpZiAocSA9PSB0bXAgfHwgKihxLTEpID09ICcsJykgewotCQkJCQkvKiBib3VuZGVkIG9uIGxlZnQuICovCi0JCQkJCWlmICgqcCA9PSAnLCcgfHwgKnAgPT0gJ1wwJykgewotCQkJCQkJLyogYm91bmRlZCBvbiByaWdodC4gKi8KLQkJCQkJCXUrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoKnRtcCkgewotCQkJCXN0cmNhdCh0bXAsICIsIik7Ci0JCQl9Ci0JCQlzdHJjYXQodG1wLCAqdSk7Ci0JCQlzdHJjYXQodG1wLCAiOkRQWSIpOwotCQkJdSsrOwotCQl9Ci0JCWZyZWUobG9naW5zKTsKLQkJbG9naW5zID0gdG1wOwotCQkKLQl9IGVsc2UgewotCQlsb2dpbnMgPSBnZXRfbG9naW5fbGlzdCgxKTsKLQl9Ci0KLQlsaXN0ID0gKGNoYXIgKiopIGNhbGxvYygoc3RybGVuKGxvZ2lucykrMikqc2l6ZW9mKGNoYXIgKiksIDEpOwotCWxpbmQgPSAwOwotCXAgPSBzdHJ0b2sobG9naW5zLCAiLCIpOwotCXdoaWxlIChwKSB7Ci0JCWxpc3RbbGluZCsrXSA9IHN0cmR1cChwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmcmVlKGxvZ2lucyk7Ci0KLQlsaW5kID0gMDsKLQl3aGlsZSAobGlzdFtsaW5kXSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnVzZXIsICpuYW1lLCAqaG9tZSwgZHB5c3RyWzEwXTsKLQkJY2hhciAqcSwgKnQ7Ci0JCWludCBvayA9IDEsIGRuOwotCi0JCXAgPSBsaXN0W2xpbmQrK107Ci0JCQotCQl0ID0gc3RyZHVwKHApOwkvKiBib2I6MCAqLwotCQlxID0gc3RyY2hyKHQsICc6Jyk7IAotCQlpZiAoISBxKSB7Ci0JCQlmcmVlKHQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnEgPSAnXDAnOwotCQl1c2VyID0gdDsKLQkJc25wcmludGYoZHB5c3RyLCAxMCwgIjolcyIsIHErMSk7Ci0KLQkJaWYgKHVzZXJzKSB7Ci0JCQl1ID0gdXNlcnM7Ci0JCQlvayA9IDA7Ci0JCQl3aGlsZSAoKnUgIT0gTlVMTCkgewotCQkJCWlmICgqKCp1KSA9PSAnOicpIHsKLQkJCQkJdSsrOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCFzdHJjbXAodXNlciwgKnUrKykpIHsKLQkJCQkJb2sgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl1c2VyMnVpZCh1c2VyLCAmdWlkLCAmZ2lkLCAmbmFtZSwgJmhvbWUpOwotCQlmcmVlKHQpOwotCi0JCWlmICghIHVpZCB8fCAhIGdpZCkgewotCQkJb2sgPSAwOwotCQl9Ci0KLQkJaWYgKCEgb2spIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQlmb3IgKGRuID0gZG1pbjsgZG4gPD0gZG1heDsgZG4rKykgewotCQkJaWYgKGRuID49IDApIHsKLQkJCQlzcHJpbnRmKGRweXN0ciwgIjolZCIsIGRuKTsKLQkJCX0KLQkJCWlmICh0cnlfdXNlcl9hbmRfZGlzcGxheSh1aWQsIGdpZCwgZHB5c3RyKSkgewotCQkJCWlmIChzd2l0Y2hfdXNlcl9lbnYodWlkLCBnaWQsIG5hbWUsIGhvbWUsIDApKSB7Ci0JCQkJCXJmYkxvZygibHVyazogbm93IHVzZXI6ICVzIEAgJXNcbiIsCi0JCQkJCSAgICBuYW1lLCBkcHlzdHIpOwotCQkJCQlzdGFydGVkX2FzX3Jvb3QgPSAyOwotCQkJCQlzdWNjZXNzID0gMTsKLQkJCQl9Ci0JCQkJc2V0X2VudigiRElTUExBWSIsIGRweXN0cik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCSBicmVhazsKLQkJfQotCX0KLQotCWxpbmQgPSAwOwotCXdoaWxlIChsaXN0W2xpbmRdICE9IE5VTEwpIHsKLQkJZnJlZShsaXN0W2xpbmRdKTsKLQkJbGluZCsrOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi12b2lkIGx1cmtfbG9vcChjaGFyICpzdHIpIHsKLQljaGFyICp0c3RyID0gTlVMTCwgKip1c2VycyA9IE5VTEw7Ci0KLQlpZiAoc3Ryc3RyKHN0ciwgImx1cms9IikgIT0gc3RyKSB7Ci0JCWV4aXQoMSk7Ci0JfQotCXJmYkxvZygibHVya2luZyBmb3IgbG9naW5zIHVzaW5nOiAnJXMnXG4iLCBzdHIpOwotCWlmIChzdHJsZW4oc3RyKSA+IHN0cmxlbigibHVyaz0iKSkgewotCQljaGFyICpxID0gc3RyY2hyKHN0ciwgJz0nKTsKLQkJdHN0ciA9IHN0cmR1cChxKzEpOwotCQl1c2VycyA9IHVzZXJfbGlzdCh0c3RyKTsKLQl9Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAobHVyayh1c2VycykpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXNsZWVwKDMpOwotCX0KLQlpZiAodHN0cikgewotCQlmcmVlKHRzdHIpOwotCX0KLQlpZiAodXNlcnMpIHsKLQkJZnJlZSh1c2Vycyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGd1ZXNzX3VzZXJfYW5kX3N3aXRjaChjaGFyICpzdHIsIGludCBmYl9tb2RlKSB7Ci0JY2hhciAqZHN0ciwgKmQ7Ci0JY2hhciAqcCwgKnRzdHIgPSBOVUxMLCAqYWxsb3dlZCA9IE5VTEwsICpsb2dpbnMsICoqdXNlcnMgPSBOVUxMOwotCWludCBkcHkxLCByZXQgPSAwOwotCWNoYXIgKipsaXN0OwotCWludCBsaW5kOwotCi0JUkFXRkJfUkVUKDApCi0KLQlkID0gRGlzcGxheVN0cmluZyhkcHkpOwotCS8qIHBpY2sgb3V0ICI6TiIgKi8KLQlkc3RyID0gc3RyY2hyKGQsICc6Jyk7Ci0JaWYgKCEgZHN0cikgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHNzY2FuZihkc3RyLCAiOiVkIiwgJmRweTEpICE9IDEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChkcHkxIDwgMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3Ryc3RyKHN0ciwgImd1ZXNzPSIpID09IHN0ciAmJiBzdHJsZW4oc3RyKSA+IHN0cmxlbigiZ3Vlc3M9IikpIHsKLQkJYWxsb3dlZCA9IHN0cmNocihzdHIsICc9Jyk7Ci0JCWFsbG93ZWQrKzsKLQotCQl0c3RyID0gc3RyZHVwKGFsbG93ZWQpOwotCQl1c2VycyA9IHVzZXJfbGlzdCh0c3RyKTsKLQl9Ci0KLQkvKiBsb29wIG92ZXIgdGhlIHV0bXB4IGVudHJpZXMgbG9va2luZyBmb3IgdGhpcyBkaXNwbGF5ICovCi0JbG9naW5zID0gZ2V0X2xvZ2luX2xpc3QoMSk7Ci0KLQlsaXN0ID0gKGNoYXIgKiopIGNhbGxvYygoc3RybGVuKGxvZ2lucykrMikqc2l6ZW9mKGNoYXIgKiksIDEpOwotCWxpbmQgPSAwOwotCXAgPSBzdHJ0b2sobG9naW5zLCAiLCIpOwotCXdoaWxlIChwKSB7Ci0JCWxpc3RbbGluZCsrXSA9IHN0cmR1cChwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQotCWxpbmQgPSAwOwotCXdoaWxlIChsaXN0W2xpbmRdICE9IE5VTEwpIHsKLQkJY2hhciAqdXNlciwgKnEsICp0OwotCQlpbnQgZHB5Miwgb2sgPSAxOwotCi0JCXAgPSBsaXN0W2xpbmQrK107Ci0KLQkJdCA9IHN0cmR1cChwKTsKLQkJcSA9IHN0cmNocih0LCAnOicpOyAKLQkJaWYgKCEgcSkgewotCQkJZnJlZSh0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCSpxID0gJ1wwJzsKLQkJdXNlciA9IHQ7Ci0JCWRweTIgPSBhdG9pKHErMSk7Ci0KLQkJaWYgKHVzZXJzKSB7Ci0JCQljaGFyICoqdSA9IHVzZXJzOwotCQkJb2sgPSAwOwotCQkJd2hpbGUgKCp1ICE9IE5VTEwpIHsKLQkJCQlpZiAoIXN0cmNtcCh1c2VyLCAqdSsrKSkgewotCQkJCQlvayA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZHB5MSAhPSBkcHkyKSB7Ci0JCQlvayA9IDA7Ci0JCX0KLQotCQlpZiAoISBvaykgewotCQkJZnJlZSh0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHN3aXRjaF91c2VyKHVzZXIsIGZiX21vZGUpKSB7Ci0JCQlyZmJMb2coInN3aXRjaGVkIHRvIGd1ZXNzZWQgdXNlcjogJXNcbiIsIHVzZXIpOwotCQkJZnJlZSh0KTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAodHN0cikgewotCQlmcmVlKHRzdHIpOwotCX0KLQlpZiAodXNlcnMpIHsKLQkJZnJlZSh1c2Vycyk7Ci0JfQotCWlmIChsb2dpbnMpIHsKLQkJZnJlZShsb2dpbnMpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRyeV91c2VyX2FuZF9kaXNwbGF5KHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBjaGFyICpkcHlzdHIpIHsKLQkvKiBOTyBzdHJ0b2tzICovCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSyAmJiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfV0FJVF9IICYmIExJQlZOQ1NFUlZFUl9IQVZFX1BXRF9ICi0JcGlkX3QgcGlkLCBwaWR3OwotCWNoYXIgKmhvbWUsICpuYW1lOwotCWludCBzdDsKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQkKLQlwdyA9IGdldHB3dWlkKHVpZCk7Ci0JaWYgKHB3KSB7Ci0JCW5hbWUgPSBwdy0+cHdfbmFtZTsKLQkJaG9tZSA9IHB3LT5wd19kaXI7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogCi0JICogV2UgZm9yayBoZXJlIGFuZCB0cnkgdG8gb3BlbiB0aGUgZGlzcGxheSBhZ2FpbiBhcyB0aGUKLQkgKiBuZXcgdXNlci4gIFVucmVhZGFibGUgWEFVVEhPUklUWSBjb3VsZCBiZSBhIHByb2JsZW0uLi4KLQkgKiBUaGlzIGlzIG5vdCByZWFsbHkgbmVlZGVkIHNpbmNlIHdlIGhhdmUgRElTUExBWSBvcGVuIGJ1dDoKLQkgKiAxKSBpcyBhIGdvb2QgaW5kaWNhdG9yIHRoaXMgdXNlciBvd25zIHRoZSBzZXNzaW9uIGFuZCAgMikKLQkgKiBzb21lIGFjdGl2aXRpZXMgZG8gc3Bhd24gbmV3IFggYXBwcywgZS5nLiAgeG1lc3NhZ2UoMSksIGV0Yy4KLQkgKi8KLQlpZiAoKHBpZCA9IGZvcmsoKSkgPiAwKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmb3JrXG4iKTsKLQkJcmZiTG9nUGVycm9yKCJmb3JrIik7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qIGNoaWxkICovCi0JCURpc3BsYXkgKmRweTIgPSBOVUxMOwotCQlpbnQgcmM7Ci0KLQkJc2lnbmFsKFNJR0hVUCwgIFNJR19ERkwpOwotCQlzaWduYWwoU0lHSU5ULCAgU0lHX0RGTCk7Ci0JCXNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKLQkJc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwotCi0JCXJjID0gc3dpdGNoX3VzZXJfZW52KHVpZCwgZ2lkLCBuYW1lLCBob21lLCAwKTsgCi0JCWlmICghIHJjKSB7Ci0JCQlleGl0KDEpOwotCQl9Ci0KLQkJZmNsb3NlKHN0ZGVycik7Ci0JCWRweTIgPSBYT3BlbkRpc3BsYXlfd3IoZHB5c3RyKTsKLQkJaWYgKGRweTIpIHsKLQkJCVhDbG9zZURpc3BsYXlfd3IoZHB5Mik7Ci0JCQlleGl0KDApOwkvKiBzdWNjZXNzICovCi0JCX0gZWxzZSB7Ci0JCQlleGl0KDIpOwkvKiBmYWlsICovCi0JCX0KLQl9Ci0KLQkvKiBzZWUgd2hhdCB0aGUgY2hpbGQgc2F5czogKi8KLQlwaWR3ID0gd2FpdHBpZChwaWQsICZzdCwgMCk7Ci0JaWYgKHBpZHcgPT0gcGlkICYmIFdJRkVYSVRFRChzdCkgJiYgV0VYSVRTVEFUVVMoc3QpID09IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCS8qIExJQlZOQ1NFUlZFUl9IQVZFX0ZPUksgLi4uICovCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzd2l0Y2hfdXNlcihjaGFyICp1c2VyLCBpbnQgZmJfbW9kZSkgewotCS8qIE5PIHN0cnRva3MgKi8KLQlpbnQgZG9pdCA9IDA7Ci0JdWlkX3QgdWlkID0gMDsKLQlnaWRfdCBnaWQgPSAwOwotCWNoYXIgKm5hbWUsICpob21lOwotCi0JaWYgKCp1c2VyID09ICcrJykgewotCQlkb2l0ID0gMTsKLQkJdXNlcisrOwotCX0KLQotCXNzbF9oZWxwZXJfcGlkKDAsIC0yKTsJLyogd2FpdGFsbCAqLwotCi0JaWYgKHN0cnN0cih1c2VyLCAiZ3Vlc3M9IikgPT0gdXNlcikgewotCQlyZXR1cm4gZ3Vlc3NfdXNlcl9hbmRfc3dpdGNoKHVzZXIsIGZiX21vZGUpOwotCX0KLQotCXVzZXIydWlkKHVzZXIsICZ1aWQsICZnaWQsICZuYW1lLCAmaG9tZSk7Ci0KLQlpZiAodWlkID09ICh1aWRfdCkgLTEgfHwgdWlkID09IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChnaWQgPT0gMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoISBkb2l0ICYmIGRweSkgewotCQkvKiBzZWUgaWYgdGhpcyBkaXNwbGF5IHdvcmtzOiAqLwotCQljaGFyICpkc3RyID0gRGlzcGxheVN0cmluZyhkcHkpOwotCQlkb2l0ID0gdHJ5X3VzZXJfYW5kX2Rpc3BsYXkodWlkLCBnaWQsIGRzdHIpOwotCX0KLQotCWlmIChkb2l0KSB7Ci0JCWludCByYyA9IHN3aXRjaF91c2VyX2Vudih1aWQsIGdpZCwgbmFtZSwgaG9tZSwgZmJfbW9kZSk7Ci0JCWlmIChyYykgewotCQkJc3RhcnRlZF9hc19yb290ID0gMjsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IHN3aXRjaF91c2VyX2Vudih1aWRfdCB1aWQsIGdpZF90IGdpZCwgY2hhciAqbmFtZSwgY2hhciAqaG9tZSwgaW50IGZiX21vZGUpIHsKLQkvKiBOTyBzdHJ0b2tzICovCi0JY2hhciAqeGF1dGg7Ci0JaW50IHJlc2V0X2ZiID0gMDsKLQlpbnQgZ3JwX29rID0gMDsKLQotI2lmICFMSUJWTkNTRVJWRVJfSEFWRV9TRVRVSUQKLQlyZXR1cm4gMDsKLSNlbHNlCi0JLyoKLQkgKiBPSywgdHJpY2t5IGhlcmUsIHdlIG5lZWQgdG8gZnJlZSB0aGUgc2htLi4uIG90aGVyd2lzZQotCSAqIHdlIHdvbid0IGJlIGFibGUgdG8gZGVsZXRlIGl0IGFzIHRoZSBvdGhlciB1c2VyLi4uCi0JICovCi0JaWYgKGZiX21vZGUgPT0gMSAmJiAodXNpbmdfc2htICYmICEgeGZvcm0yNHRvMzIpKSB7Ci0JCXJlc2V0X2ZiID0gMTsKLQkJY2xlYW5fc2htKDApOwotCQlmcmVlX3RpbGVzKCk7Ci0JfQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0lOSVRHUk9VUFMKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSAotCWlmIChnZXRwd3VpZCh1aWQpICE9IE5VTEwgJiYgZ2V0ZW52KCJYMTFWTkNfU0lOR0xFX0dST1VQIikgPT0gTlVMTCkgewotCQlzdHJ1Y3QgcGFzc3dkICpwID0gZ2V0cHd1aWQodWlkKTsKLQkJLyogYW5vdGhlciBwb3NzaWJpbGl0eSBpcyBwLT5wd19naWQgaW5zdGVhZCBvZiBnaWQgKi8KLQkJaWYgKHNldGdpZChnaWQpID09IDAgJiYgaW5pdGdyb3VwcyhwLT5wd19uYW1lLCBnaWQpID09IDApICB7Ci0JCQlncnBfb2sgPSAxOwotCQl9IGVsc2UgewotCQkJcmZiTG9nUGVycm9yKCJpbml0Z3JvdXBzIik7Ci0JCX0KLQkJZW5kZ3JlbnQoKTsKLQl9Ci0jZW5kaWYKLSNlbmRpZgotCWlmICghIGdycF9vaykgewotCQlpZiAoc2V0Z2lkKGdpZCkgPT0gMCkgewotCQkJZ3JwX29rID0gMTsKLQkJfQotCX0KLQlpZiAoISBncnBfb2spIHsKLQkJaWYgKHJlc2V0X2ZiKSB7Ci0JCQkvKiAyIG1lYW5zIHdlIGRpZCBjbGVhbl9zaG0gYW5kIGZyZWVfdGlsZXMgKi8KLQkJCWRvX25ld19mYigyKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2V0dWlkKHVpZCkgIT0gMCkgewotCQlpZiAocmVzZXRfZmIpIHsKLQkJCS8qIDIgbWVhbnMgd2UgZGlkIGNsZWFuX3NobSBhbmQgZnJlZV90aWxlcyAqLwotCQkJZG9fbmV3X2ZiKDIpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCWlmIChyZXNldF9mYikgewotCQlkb19uZXdfZmIoMik7Ci0JfQotCi0JeGF1dGggPSBnZXRlbnYoIlhBVVRIT1JJVFkiKTsKLQlpZiAoeGF1dGggJiYgYWNjZXNzKHhhdXRoLCBSX09LKSAhPSAwKSB7Ci0JCSooeGF1dGgtMikgPSAnXyc7CS8qIHlvdyAqLwotCX0KLQkKLQlzZXRfZW52KCJVU0VSIiwgbmFtZSk7Ci0Jc2V0X2VudigiTE9HTkFNRSIsIG5hbWUpOwotCXNldF9lbnYoIkhPTUUiLCBob21lKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgdHJ5X3RvX3N3aXRjaF91c2Vycyh2b2lkKSB7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X3RyeSA9IDA7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0JY2hhciAqdXNlcnMsICpwOwotCi0JaWYgKGdldHVpZCgpICYmIGdldGV1aWQoKSkgewotCQlyZmJMb2coInRyeV90b19zd2l0Y2hfdXNlcnM6IG5vdCByb290XG4iKTsKLQkJc3RhcnRlZF9hc19yb290ID0gMjsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIWxhc3RfdHJ5KSB7Ci0JCWxhc3RfdHJ5ID0gbm93OwotCX0gZWxzZSBpZiAobm93IDw9IGxhc3RfdHJ5ICsgMikgewotCQkvKiB0cnkgZXZlcnkgMyBzZWNzIG9yIHNvICovCi0JCXJldHVybjsKLQl9Ci0JbGFzdF90cnkgPSBub3c7Ci0KLQl1c2VycyA9IHN0cmR1cCh1c2Vyc19saXN0KTsKLQotCWlmIChzdHJzdHIodXNlcnMsICJndWVzcz0iKSA9PSB1c2VycykgewotCQlpZiAoc3dpdGNoX3VzZXIodXNlcnMsIDEpKSB7Ci0JCQlzdGFydGVkX2FzX3Jvb3QgPSAyOwotCQl9Ci0JCWZyZWUodXNlcnMpOwotCQlyZXR1cm47Ci0JfQotCi0JcCA9IHN0cnRvayh1c2VycywgIiwiKTsKLQl3aGlsZSAocCkgewotCQlpZiAoc3dpdGNoX3VzZXIocCwgMSkpIHsKLQkJCXN0YXJ0ZWRfYXNfcm9vdCA9IDI7Ci0JCQlyZmJMb2coInRyeV90b19zd2l0Y2hfdXNlcnM6IG5vdyAlc1xuIiwgcCk7Ci0JCQlicmVhazsKLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUodXNlcnMpOwotfQotCi1pbnQgcmVhZF9wYXNzd2RzKGNoYXIgKnBhc3NmaWxlKSB7Ci0JY2hhciBsaW5lWzEwMjRdOwotCWNoYXIgKmZpbGVuYW1lOwotCWNoYXIgKipvbGRfcGFzc3dkX2xpc3QgPSBwYXNzd2RfbGlzdDsKLQlpbnQgbGluZWNvdW50ID0gMCwgaSwgcmVtb3ZlID0gMCwgcmVhZF9tb2RlID0gMCwgYmVnaW5fdm8gPSAtMTsKLQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCXN0YXRpYyBpbnQgbWF4ID0gLTE7Ci0JRklMRSAqaW4gPSBOVUxMOwotCXN0YXRpYyB0aW1lX3QgbGFzdF9yZWFkID0gMDsKLQlzdGF0aWMgaW50IHJlYWRfY250ID0gMDsKLQlpbnQgZGJfcGFzc3dkID0gMDsKLQotCWlmIChtYXggPCAwKSB7Ci0JCW1heCA9IDEwMDA7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19NQVhfUEFTU1dEUyIpKSB7Ci0JCQltYXggPSBhdG9pKGdldGVudigiWDExVk5DX01BWF9QQVNTV0RTIikpOwotCQl9Ci0JfQotCi0JZmlsZW5hbWUgPSBwYXNzZmlsZTsKLQlpZiAoc3Ryc3RyKGZpbGVuYW1lLCAicm06IikgPT0gZmlsZW5hbWUpIHsKLQkJZmlsZW5hbWUgKz0gc3RybGVuKCJybToiKTsKLQkJcmVtb3ZlID0gMTsKLQl9IGVsc2UgaWYgKHN0cnN0cihmaWxlbmFtZSwgInJlYWQ6IikgPT0gZmlsZW5hbWUpIHsKLQkJZmlsZW5hbWUgKz0gc3RybGVuKCJyZWFkOiIpOwotCQlyZWFkX21vZGUgPSAxOwotCQlpZiAoc3RhdChmaWxlbmFtZSwgJnNidWYpID09IDApIHsKLQkJCWlmIChzYnVmLnN0X210aW1lIDw9IGxhc3RfcmVhZCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJbGFzdF9yZWFkID0gc2J1Zi5zdF9tdGltZTsKLQkJfQotCX0gZWxzZSBpZiAoc3Ryc3RyKGZpbGVuYW1lLCAiY21kOiIpID09IGZpbGVuYW1lKSB7Ci0JCWludCByYzsKLQotCQlmaWxlbmFtZSArPSBzdHJsZW4oImNtZDoiKTsKLQkJcmVhZF9tb2RlID0gMTsKLQkJaW4gPSB0bXBmaWxlKCk7Ci0JCWlmIChpbiA9PSBOVUxMKSB7Ci0JCQlyZmJMb2coInJ1bl91c2VyX2NvbW1hbmQgdG1wZmlsZSgpIGZhaWxlZDogJXNcbiIsCi0JCQkgICAgZmlsZW5hbWUpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlyYyA9IHJ1bl91c2VyX2NvbW1hbmQoZmlsZW5hbWUsIGxhdGVzdF9jbGllbnQsICJyZWFkX3Bhc3N3ZHMiLAotCQkgICAgTlVMTCwgMCwgaW4pOwotCQlpZiAocmMgIT0gMCkgewotCQkJcmZiTG9nKCJydW5fdXNlcl9jb21tYW5kIGNvbW1hbmQgZmFpbGVkOiAlc1xuIiwKLQkJCSAgICBmaWxlbmFtZSk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXJld2luZChpbik7Ci0JfSBlbHNlIGlmIChzdHJzdHIoZmlsZW5hbWUsICJjdXN0b206IikgPT0gZmlsZW5hbWUpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKGluID09IE5VTEwgJiYgc3RhdChmaWxlbmFtZSwgJnNidWYpID09IDApIHsKLQkJLyogKHBvb3IuLi4pIHVwcGVyIGJvdW5kIHRvIG51bWJlciBvZiBsaW5lcyAqLwotCQltYXggPSAoaW50KSBzYnVmLnN0X3NpemU7Ci0JCWxhc3RfcmVhZCA9IHNidWYuc3RfbXRpbWU7Ci0JfQotCi0JLyogY3JlYXRlIDEgbW9yZSB0aGFuIG1heCB0byBoYXZlIGl0IGJlIHRoZSBlbmRpbmcgTlVMTCAqLwotCXBhc3N3ZF9saXN0ID0gKGNoYXIgKiopIG1hbGxvYyggKG1heCsxKSAqIChzaXplb2YoY2hhciAqKSkgKTsKLQlmb3IgKGk9MDsgaTxtYXgrMTsgaSsrKSB7Ci0JCXBhc3N3ZF9saXN0W2ldID0gTlVMTDsKLQl9Ci0JCi0JaWYgKGluID09IE5VTEwpIHsKLQkJaW4gPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQl9Ci0JaWYgKGluID09IE5VTEwpIHsKLQkJcmZiTG9nKCJjYW5ub3Qgb3BlbiBwYXNzd2RmaWxlOiAlc1xuIiwgcGFzc2ZpbGUpOwotCQlyZmJMb2dQZXJyb3IoImZvcGVuIik7Ci0JCWlmIChyZW1vdmUpIHsKLQkJCXVubGluayhmaWxlbmFtZSk7Ci0JCX0KLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQlpZiAoZ2V0ZW52KCJERUJVR19QQVNTV0RGSUxFIikgIT0gTlVMTCkgewotCQlkYl9wYXNzd2QgPSAxOwotCX0KLQotCXdoaWxlIChmZ2V0cyhsaW5lLCAxMDI0LCBpbikgIT0gTlVMTCkgewotCQljaGFyICpwOwotCQlpbnQgYmxhbmsgPSAxOwotCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOyAKLQotCQlpZiAoZGJfcGFzc3dkKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInJlYWRfcGFzc3dkczogcmF3IGxpbmU6ICVzXG4iLCBsaW5lKTsKLQkJfQotCi0JCWlmIChsZW4gPT0gMCkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykgewotCQkJbGluZVtsZW4tMV0gPSAnXDAnOwotCQl9Ci0JCWlmIChsaW5lWzBdID09ICdcMCcpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIobGluZSwgIl9fU0tJUF9fIikgIT0gTlVMTCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0cnN0cihsaW5lLCAiX19DT01NX18iKSA9PSBsaW5lKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChsaW5lLCAiX19CRUdJTl9WSUVXT05MWV9fIikpIHsKLQkJCWlmIChiZWdpbl92byA8IDApIHsKLQkJCQliZWdpbl92byA9IGxpbmVjb3VudDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChsaW5lWzBdID09ICcjJykgewotCQkJLyogY29tbWVudGVkIG91dCwgY2Fubm90IGhhdmUgcGFzc3dvcmQgYmVnaW5uaW5nIHdpdGggIyAqLwotCQkJY29udGludWU7Ci0JCX0KLQkJcCA9IGxpbmU7Ci0JCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCQlpZiAoISBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAoKnApKSkgewotCQkJCWJsYW5rID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXArKzsKLQkJfQotCQlpZiAoYmxhbmspIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcGFzc3dkX2xpc3RbbGluZWNvdW50KytdID0gc3RyZHVwKGxpbmUpOwotCQlpZiAoZGJfcGFzc3dkKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInJlYWRfcGFzc3dkczoga2VlcGxpbmU6ICVzXG4iLCBsaW5lKTsKLQkJCWZwcmludGYoc3RkZXJyLCAicmVhZF9wYXNzd2RzOiBiZWdpbl92bzogJWRcbiIsIGJlZ2luX3ZvKTsKLQkJfQotCi0JCWlmIChsaW5lY291bnQgPj0gbWF4KSB7Ci0JCQlyZmJMb2coInJlYWRfcGFzc3dkczogaGl0IG1heCBwYXNzd2Q6ICVkXG4iLCBtYXgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZmNsb3NlKGluKTsKLQotCWZvciAoaT0wOyBpPDEwMjQ7IGkrKykgewotCQlsaW5lW2ldID0gJ1wwJzsKLQl9Ci0KLQlpZiAocmVtb3ZlKSB7Ci0JCXVubGluayhmaWxlbmFtZSk7Ci0JfQotCi0JaWYgKCEgbGluZWNvdW50KSB7Ci0JCXJmYkxvZygiY2Fubm90IHJlYWQgYSB2YWxpZCBsaW5lIGZyb20gcGFzc3dkZmlsZTogJXNcbiIsCi0JCSAgICBwYXNzZmlsZSk7Ci0JCWlmIChyZWFkX2NudCA9PSAwKSB7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmVhZF9jbnQrKzsKLQotCWZvciAoaT0wOyBpPGxpbmVjb3VudDsgaSsrKSB7Ci0JCWNoYXIgKnEsICpwID0gcGFzc3dkX2xpc3RbaV07Ci0JCWlmICghc3RyY21wKHAsICJfX0VNUFRZX18iKSkgewotCQkJKnAgPSAnXDAnOwotCQl9IGVsc2UgaWYgKChxID0gc3Ryc3RyKHAsICJfX0NPTU1fXyIpKSAhPSBOVUxMKSB7Ci0JCQkqcSA9ICdcMCc7Ci0JCX0KLQkJcGFzc3dkX2xpc3RbaV0gPSBzdHJkdXAocCk7Ci0JCWlmIChkYl9wYXNzd2QpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicmVhZF9wYXNzd2RzOiB0cmltbGluZTogJXNcbiIsIHApOwotCQl9Ci0JCXN0cnplcm8ocCk7Ci0JfQotCi0JYmVnaW5fdmlld29ubHkgPSBiZWdpbl92bzsKLQlpZiAocmVhZF9tb2RlICYmIHJlYWRfY250ID4gMSkgewotCQlpZiAodmlld29ubHlfcGFzc3dkKSB7Ci0JCQlmcmVlKHZpZXdvbmx5X3Bhc3N3ZCk7Ci0JCQl2aWV3b25seV9wYXNzd2QgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKGJlZ2luX3ZpZXdvbmx5IDwgMCAmJiBsaW5lY291bnQgPT0gMikgewotCQkvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIDItbGluZSB1c2FnZTogKi8KLQkJdmlld29ubHlfcGFzc3dkID0gc3RyZHVwKHBhc3N3ZF9saXN0WzFdKTsKLQkJaWYgKGRiX3Bhc3N3ZCkgewotCQkJZnByaW50ZihzdGRlcnIsICJyZWFkX3Bhc3N3ZHM6IGxpbmVjb3VudCBpcyAyLlxuIik7Ci0JCX0KLQkJaWYgKHNjcmVlbikgewotCQkJY2hhciAqKmFwZCA9IChjaGFyICoqKSBzY3JlZW4tPmF1dGhQYXNzd2REYXRhOwotCQkJaWYgKGFwZCkgewotCQkJCWlmIChhcGRbMF0gIT0gTlVMTCkgewotCQkJCQlzdHJ6ZXJvKGFwZFswXSk7Ci0JCQkJfQotCQkJCWFwZFswXSA9IHN0cmR1cChwYXNzd2RfbGlzdFswXSk7Ci0JCQl9Ci0JCX0KLQkJYmVnaW5fdmlld29ubHkgPSAxOwotCX0KLQotCWlmIChvbGRfcGFzc3dkX2xpc3QgIT0gTlVMTCkgewotCQljaGFyICpwOwotCQlpID0gMDsKLQkJd2hpbGUgKG9sZF9wYXNzd2RfbGlzdFtpXSAhPSBOVUxMKSB7Ci0JCQlwID0gb2xkX3Bhc3N3ZF9saXN0W2ldOwotCQkJc3RyemVybyhwKTsKLQkJCWZyZWUob2xkX3Bhc3N3ZF9saXN0W2ldKTsKLQkJCWkrKzsKLQkJfQotCQlmcmVlKG9sZF9wYXNzd2RfbGlzdCk7Ci0JfQotCXJldHVybiAxOwotfQotCi12b2lkIGluc3RhbGxfcGFzc3dkcyh2b2lkKSB7Ci0JaWYgKHZpZXdvbmx5X3Bhc3N3ZCkgewotCQkvKiBhcHBlbmQgdGhlIHZpZXcgb25seSBwYXNzd2QgYWZ0ZXIgdGhlIG5vcm1hbCBwYXNzd2QgKi8KLQkJY2hhciAqKnBhc3N3ZHNfbmV3ID0gKGNoYXIgKiopIG1hbGxvYygzKnNpemVvZihjaGFyICopKTsKLQkJY2hhciAqKnBhc3N3ZHNfb2xkID0gKGNoYXIgKiopIHNjcmVlbi0+YXV0aFBhc3N3ZERhdGE7Ci0JCXBhc3N3ZHNfbmV3WzBdID0gcGFzc3dkc19vbGRbMF07Ci0JCXBhc3N3ZHNfbmV3WzFdID0gdmlld29ubHlfcGFzc3dkOwotCQlwYXNzd2RzX25ld1syXSA9IE5VTEw7Ci0JCS8qIG11dGV4ICovCi0JCXNjcmVlbi0+YXV0aFBhc3N3ZERhdGEgPSAodm9pZCopIHBhc3N3ZHNfbmV3OwotCX0gZWxzZSBpZiAocGFzc3dkX2xpc3QpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZShwYXNzd2RfbGlzdFtpXSAhPSBOVUxMKSB7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGJlZ2luX3ZpZXdvbmx5IDwgMCkgewotCQkJYmVnaW5fdmlld29ubHkgPSBpKzE7Ci0JCX0KLQkJLyogbXV0ZXggKi8KLQkJc2NyZWVuLT5hdXRoUGFzc3dkRGF0YSA9ICh2b2lkKikgcGFzc3dkX2xpc3Q7Ci0JCXNjcmVlbi0+YXV0aFBhc3N3ZEZpcnN0Vmlld09ubHkgPSBiZWdpbl92aWV3b25seTsKLQl9Ci19Ci0KLXZvaWQgY2hlY2tfbmV3X3Bhc3N3ZHMoaW50IGZvcmNlKSB7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2NoZWNrID0gMDsKLQl0aW1lX3Qgbm93OwotCi0JaWYgKCEgcGFzc3dkZmlsZSkgewotCQlyZXR1cm47Ci0JfQotCWlmIChzdHJzdHIocGFzc3dkZmlsZSwgInJlYWQ6IikgIT0gcGFzc3dkZmlsZSkgewotCQlyZXR1cm47Ci0JfQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybjsKLQotCWlmIChmb3JjZSkgewotCQlsYXN0X2NoZWNrID0gMDsKLQl9Ci0KLQlub3cgPSB0aW1lKE5VTEwpOwotCWlmIChub3cgPiBsYXN0X2NoZWNrICsgMSkgewotCQlpZiAocmVhZF9wYXNzd2RzKHBhc3N3ZGZpbGUpKSB7Ci0JCQlpbnN0YWxsX3Bhc3N3ZHMoKTsKLQkJfQotCQlsYXN0X2NoZWNrID0gbm93OwotCX0KLX0KLQotcmZiQm9vbCBjdXN0b21fcGFzc3dkX2NoZWNrKHJmYkNsaWVudFB0ciBjbCwgY29uc3QgY2hhciAqcmVzcG9uc2UsIGludCBsZW4pIHsKLQljaGFyICppbnB1dCwgKmNtZDsKLQljaGFyIG51bVsxNl07Ci0JaW50IGosIGksIG4sIHJjOwotCi0JcmZiTG9nKCJjdXN0b21fcGFzc3dkX2NoZWNrOiBsZW49JWRcbiIsIGxlbik7Ci0KLQlpZiAoIXBhc3N3ZGZpbGUgfHwgc3Ryc3RyKHBhc3N3ZGZpbGUsICJjdXN0b206IikgIT0gcGFzc3dkZmlsZSkgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWNtZCA9IHBhc3N3ZGZpbGUgKyBzdHJsZW4oImN1c3RvbToiKTsKLQotCXNwcmludGYobnVtLCAiJWRcbiIsIGxlbik7Ci0KLQlpbnB1dCA9IChjaGFyICopIG1hbGxvYygyICogbGVuICsgMTYgKyAxKTsKLQkKLQlpbnB1dFswXSA9ICdcMCc7Ci0Jc3RyY2F0KGlucHV0LCBudW0pOwotCW4gPSBzdHJsZW4obnVtKTsKLQotCWogPSBuOwotCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKLQkJaW5wdXRbal0gPSBjbC0+YXV0aENoYWxsZW5nZVtpXTsKLQkJaisrOwotCX0KLQlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlucHV0W2pdID0gcmVzcG9uc2VbaV07Ci0JCWorKzsKLQl9Ci0JcmMgPSBydW5fdXNlcl9jb21tYW5kKGNtZCwgY2wsICJjdXN0b21fcGFzc3dkIiwgaW5wdXQsIG4rMipsZW4sIE5VTEwpOwotCWZyZWUoaW5wdXQpOwotCWlmIChyYyA9PSAwKSB7Ci0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9vbmVfaHR0cF9yZXF1ZXN0KHZvaWQpIHsKLQlyZmJMb2coImhhbmRsZV9vbmVfaHR0cF9yZXF1ZXN0OiBiZWdpbi5cbiIpOwotCWlmIChpbmV0ZCB8fCBzY3JlZW4tPmh0dHBQb3J0ID09IDApIHsKLQkJaW50IHBvcnQgPSBmaW5kX2ZyZWVfcG9ydCg1ODAwLCA1ODYwKTsKLQkJaWYgKHBvcnQpIHsKLQkJCS8qIG11dGV4ICovCi0JCQlzY3JlZW4tPmh0dHBQb3J0ID0gcG9ydDsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygiaGFuZGxlX29uZV9odHRwX3JlcXVlc3Q6IG5vIGh0dHAgcG9ydC5cbiIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCX0KLQlzY3JlZW4tPmF1dG9Qb3J0ID0gRkFMU0U7Ci0Jc2NyZWVuLT5wb3J0ID0gMDsKLQotCWh0dHBfY29ubmVjdGlvbnMoMSk7Ci0KLQlyZmJJbml0U2VydmVyKHNjcmVlbik7Ci0KLQlpZiAoIWluZXRkKSB7Ci0JCS8qIFhYWCBpcHY2ICovCi0JCWludCBjb25uID0gMDsKLQkJd2hpbGUgKDEpIHsKLQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiVkICVkICVkICAlZFxuIiwgY29ubiwgc2NyZWVuLT5saXN0ZW5Tb2NrLCBzY3JlZW4tPmh0dHBTb2NrLCBzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrKTsKLQkJCXVzbGVlcCgxMCAqIDEwMDApOwotCQkJcmZiSHR0cENoZWNrRmRzKHNjcmVlbik7Ci0JCQlpZiAoY29ubikgewotCQkJCWlmIChzY3JlZW4tPmh0dHBTb2NrIDwgMCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzY3JlZW4tPmh0dHBTb2NrID49IDApIHsKLQkJCQkJY29ubiA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzY3JlZW4tPmh0dHBEaXIpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrIDwgMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJmYkxvZygiaGFuZGxlX29uZV9odHRwX3JlcXVlc3Q6IGZpbmlzaGVkLlxuIik7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQkvKiBpbmV0ZCBjYXNlOiAqLwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZPUksKLQkJcGlkX3QgcGlkOwotCQlpbnQgc19pbiA9IHNjcmVlbi0+aW5ldGRTb2NrOwotCQlpZiAoc19pbiA8IDApIHsKLQkJCXJmYkxvZygiaGFuZGxlX29uZV9odHRwX3JlcXVlc3Q6IGluZXRkU29jayBub3Qgc2V0IHVwLlxuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCXBpZCA9IGZvcmsoKTsKLQkJaWYgKHBpZCA8IDApIHsKLQkJCXJmYkxvZygiaGFuZGxlX29uZV9odHRwX3JlcXVlc3Q6IGNvdWxkIG5vdCBmb3JrLlxuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9IGVsc2UgaWYgKHBpZCA+IDApIHsKLQkJCWludCBzdGF0dXM7Ci0JCQlwaWRfdCBwaWR3OwotCQkJd2hpbGUgKDEpIHsKLQkJCQlyZmJIdHRwQ2hlY2tGZHMoc2NyZWVuKTsKLQkJCQlwaWR3ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOyAKLQkJCQlpZiAocGlkdyA9PSBwaWQgJiYgV0lGRVhJVEVEKHN0YXR1cykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChwaWR3IDwgMCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZmJMb2coImhhbmRsZV9vbmVfaHR0cF9yZXF1ZXN0OiBmaW5pc2hlZC5cbiIpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaW50IHNvY2sgPSBjb25uZWN0X3RjcCgiMTI3LjAuMC4xIiwgc2NyZWVuLT5odHRwUG9ydCk7Ci0JCQlpZiAoc29jayA8IDApIHsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJcmF3X3hmZXIoc29jaywgc19pbiwgc19pbik7Ci0JCQlleGl0KDApOwotCQl9Ci0jZWxzZQotCQlyZmJMb2coImhhbmRsZV9vbmVfaHR0cF9yZXF1ZXN0OiBmb3JrIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLSNlbmRpZgotCX0KLX0KLQotdm9pZCB1c2VyX3N1cHBsaWVkX29wdHMoY2hhciAqb3B0cykgewotCWNoYXIgKnAsICpzdHI7Ci0JY2hhciAqYWxsb3dbXSA9IHsKLQkJInNraXAtZGlzcGxheSIsICJza2lwLWF1dGgiLCAic2tpcC1zaGFyZWQiLAotCQkic2NhbGUiLCAic2NhbGVfY3Vyc29yIiwgInNjIiwgInNvbGlkIiwgInNvIiwgImlkIiwKLQkJImNsZWFyX21vZHMiLCAiY20iLCAiY2xlYXJfa2V5cyIsICJjayIsICJyZXBlYXQiLAotCQkiY2xlYXJfYWxsIiwgImNhIiwKLQkJInNwZWVkcyIsICJzcCIsICJyZWFkdGltZW91dCIsICJyZCIsCi0JCSJyb3RhdGUiLCAicm8iLAotCQkiZ2VvbWV0cnkiLCAiZ2VvbSIsICJnZSIsCi0JCSJub25jYWNoZSIsICJuYyIsCi0JCSJub2Rpc3BsYXkiLCAibmQiLAotCQkidmlld29ubHkiLCAidm8iLAotCQkidGFnIiwKLQkJTlVMTAotCX07Ci0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfTk9fVU5JWFBXX09QVFMiKSkgewotCQlyZXR1cm47Ci0JfQotCi0Jc3RyID0gc3RyZHVwKG9wdHMpOwotCi0JcCA9IHN0cnRvayhzdHIsICIsIik7Ci0Jd2hpbGUgKHApIHsKLQkJY2hhciAqcTsKLQkJaW50IGksIG4sIG0sIG9rID0gMDsKLQotCQlpID0gMDsKLQkJd2hpbGUgKGFsbG93W2ldICE9IE5VTEwpIHsKLQkJCWlmIChzdHJzdHIoYWxsb3dbaV0sICJza2lwLSIpKSB7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHN0cnN0cihwLCBhbGxvd1tpXSkgPT0gcCkgCXsKLQkJCQlvayA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQlpZiAoISBvayAmJiBzdHJwYnJrKHAsICIwMTIzNDU2Nzg5IikgPT0gcCAmJgotCQkgICAgc3NjYW5mKHAsICIlZC8lZCIsICZuLCAmbSkgPT0gMikgewotCQkJaWYgKHNjYWxlX3N0cikgZnJlZShzY2FsZV9zdHIpOwotCQkJc2NhbGVfc3RyID0gc3RyZHVwKHApOwotCQl9IGVsc2UgaWYgKG9rKSB7Ci0JCQlpZiAoMCAmJiBzdHJzdHIocCwgImRpc3BsYXk9IikgPT0gcCkgewotCQkJCWlmICh1c2VfZHB5KSBmcmVlKHVzZV9kcHkpOwotCQkJCXVzZV9kcHkgPSBzdHJkdXAocCArIHN0cmxlbigiZGlzcGxheT0iKSk7Ci0JCQl9IGVsc2UgaWYgKDAgJiYgc3Ryc3RyKHAsICJhdXRoPSIpID09IHApIHsKLQkJCQlpZiAoYXV0aF9maWxlKSBmcmVlKGF1dGhfZmlsZSk7Ci0JCQkJYXV0aF9maWxlID0gc3RyZHVwKHAgKyBzdHJsZW4oImF1dGg9IikpOwotCQkJfSBlbHNlIGlmICgwICYmICFzdHJjbXAocCwgInNoYXJlZCIpKSB7Ci0JCQkJc2hhcmVkID0gMTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJzY2FsZT0iKSA9PSBwKSB7Ci0JCQkJaWYgKHNjYWxlX3N0cikgZnJlZShzY2FsZV9zdHIpOwotCQkJCXNjYWxlX3N0ciA9IHN0cmR1cChwICsgc3RybGVuKCJzY2FsZT0iKSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAic2NhbGVfY3Vyc29yPSIpID09IHAgfHwKLQkJCSAgICBzdHJzdHIocCwgInNjPSIpID09IHApIHsKLQkJCQlpZiAoc2NhbGVfY3Vyc29yX3N0cikgZnJlZShzY2FsZV9jdXJzb3Jfc3RyKTsKLQkJCQlxID0gc3RyY2hyKHAsICc9JykgKyAxOwotCQkJCXNjYWxlX2N1cnNvcl9zdHIgPSBzdHJkdXAocSk7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAicm90YXRlPSIpID09IHAgfHwKLQkJCSAgICBzdHJzdHIocCwgInJvPSIpID09IHApIHsKLQkJCQlpZiAocm90YXRpbmdfc3RyKSBmcmVlKHJvdGF0aW5nX3N0cik7Ci0JCQkJcSA9IHN0cmNocihwLCAnPScpICsgMTsKLQkJCQlyb3RhdGluZ19zdHIgPSBzdHJkdXAocSk7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInNvbGlkIikgfHwgIXN0cmNtcChwLCAic28iKSkgewotCQkJCXVzZV9zb2xpZF9iZyA9IDE7Ci0JCQkJaWYgKCFzb2xpZF9zdHIpIHsKLQkJCQkJc29saWRfc3RyID0gc3RyZHVwKHNvbGlkX2RlZmF1bHQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAidmlld29ubHkiKSB8fCAhc3RyY21wKHAsICJ2byIpKSB7Ci0JCQkJdmlld19vbmx5ID0gMTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJzb2xpZD0iKSA9PSBwIHx8Ci0JCQkgICAgc3Ryc3RyKHAsICJzbz0iKSA9PSBwKSB7Ci0JCQkJdXNlX3NvbGlkX2JnID0gMTsKLQkJCQlpZiAoc29saWRfc3RyKSBmcmVlKHNvbGlkX3N0cik7Ci0JCQkJcSA9IHN0cmNocihwLCAnPScpICsgMTsKLQkJCQlpZiAoIXN0cmNtcChxLCAiUiIpKSB7Ci0JCQkJCXNvbGlkX3N0ciA9IHN0cmR1cCgicm9vdDoiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzb2xpZF9zdHIgPSBzdHJkdXAocSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImlkPSIpID09IHApIHsKLQkJCQl1bnNpZ25lZCBsb25nIHdpbjsKLQkJCQlxID0gcCArIHN0cmxlbigiaWQ9Iik7Ci0JCQkJaWYgKHN0cmNtcChxLCAicGljayIpKSB7Ci0JCQkJCWlmIChzY2FuX2hleGRlYyhxLCAmd2luKSkgewotCQkJCQkJc3Vid2luID0gd2luOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghc3RyY21wKHAsICJjbGVhcl9tb2RzIikgfHwKLQkJCSAgICAhc3RyY21wKHAsICJjbSIpKSB7Ci0JCQkJY2xlYXJfbW9kcyA9IDE7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgImNsZWFyX2tleXMiKSB8fAotCQkJICAgICFzdHJjbXAocCwgImNrIikpIHsKLQkJCQljbGVhcl9tb2RzID0gMjsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChwLCAiY2xlYXJfYWxsIikgfHwKLQkJCSAgICAhc3RyY21wKHAsICJjYSIpKSB7Ci0JCQkJY2xlYXJfbW9kcyA9IDM7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgIm5vbmNhY2hlIikgfHwKLQkJCSAgICAhc3RyY21wKHAsICJuYyIpKSB7Ci0JCQkJbmNhY2hlICA9IDA7Ci0JCQkJbmNhY2hlMCA9IDA7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAibmM9IikgPT0gcCkgewotCQkJCWludCBuMiA9IGF0b2kocCArIHN0cmxlbigibmM9IikpOwotCQkJCWlmIChuYWJzKG4yKSA8IG5hYnMobmNhY2hlKSkgewotCQkJCQlpZiAobmNhY2hlIDwgMCkgewotCQkJCQkJbmNhY2hlID0gLW5hYnMobjIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmNhY2hlID0gbmFicyhuMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInJlcGVhdCIpKSB7Ci0JCQkJbm9fYXV0b3JlcGVhdCA9IDA7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAic3BlZWRzPSIpID09IHAgfHwKLQkJCSAgICBzdHJzdHIocCwgInNwPSIpID09IHApIHsKLQkJCQlpZiAoc3BlZWRzX3N0cikgZnJlZShzcGVlZHNfc3RyKTsKLQkJCQlxID0gc3RyY2hyKHAsICc9JykgKyAxOwotCQkJCXNwZWVkc19zdHIgPSBzdHJkdXAocSk7Ci0JCQkJcSA9IHNwZWVkc19zdHI7Ci0JCQkJd2hpbGUgKCpxICE9ICdcMCcpIHsKLQkJCQkJaWYgKCpxID09ICctJykgewotCQkJCQkJKnEgPSAnLCc7Ci0JCQkJCX0KLQkJCQkJcSsrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJyZWFkdGltZW91dD0iKSA9PSBwIHx8Ci0JCQkgICAgc3Ryc3RyKHAsICJyZD0iKSA9PSBwKSB7Ci0JCQkJcSA9IHN0cmNocihwLCAnPScpICsgMTsKLQkJCQlyZmJNYXhDbGllbnRXYWl0ID0gYXRvaShxKSAqIDEwMDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInNraXBwaW5nIG9wdGlvbjogJXNcbiIsIHApOwotCQl9Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQl9Ci0JZnJlZShzdHIpOwotfQotCi1zdGF0aWMgdm9pZCB2bmNfcmVkaXJlY3RfdGltZW91dCAoaW50IHNpZykgewotCXdyaXRlKDIsICJ0aW1lb3V0OiBubyBjbGllbnRzIGNvbm5lY3RlZC5cbiIsIDMxKTsKLQlpZiAoc2lnKSB7fTsKLQlleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZCBkb19jaHZ0KGludCB2dCkgewotCWNoYXIgY2h2dFsxMDBdOwotCXNwcmludGYoY2h2dCwgImNodnQgJWQgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmIiwgdnQpOwotCXJmYkxvZygicnVubmluZzogJXNcbiIsIGNodnQpOwotCXN5c3RlbShjaHZ0KTsKLQlzbGVlcCgyKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfZmFrZV9mYihYSW1hZ2UqIGZiX2ltYWdlLCBpbnQgdywgaW50IGgsIGludCBiKSB7Ci0JaWYgKGZha2VfZmIpIHsKLQkJZnJlZShmYWtlX2ZiKTsKLQl9Ci0JZmFrZV9mYiA9IChjaGFyICopIGNhbGxvYyh3KmgqYi84LCAxKTsKLQotCWZiX2ltYWdlLT5kYXRhID0gZmFrZV9mYjsKLQlmYl9pbWFnZS0+Zm9ybWF0ID0gWlBpeG1hcDsKLQlmYl9pbWFnZS0+d2lkdGggID0gdzsKLQlmYl9pbWFnZS0+aGVpZ2h0ID0gaDsKLQlmYl9pbWFnZS0+Yml0c19wZXJfcGl4ZWwgPSBiOwotCWZiX2ltYWdlLT5ieXRlc19wZXJfbGluZSA9IHcqYi84OwotCWZiX2ltYWdlLT5iaXRtYXBfdW5pdCA9IC0xOwotCWlmIChiID49IDI0KSB7Ci0JCWZiX2ltYWdlLT5kZXB0aCA9IDI0OwotCQlmYl9pbWFnZS0+cmVkX21hc2sgICA9IDB4ZmYwMDAwOwotCQlmYl9pbWFnZS0+Z3JlZW5fbWFzayA9IDB4MDBmZjAwOwotCQlmYl9pbWFnZS0+Ymx1ZV9tYXNrICA9IDB4MDAwMGZmOwotCX0gZWxzZSBpZiAoYiA+PSAxNikgewotCQlmYl9pbWFnZS0+ZGVwdGggPSAxNjsKLQkJZmJfaW1hZ2UtPnJlZF9tYXNrICAgPSAweDAwM2Y7Ci0JCWZiX2ltYWdlLT5ncmVlbl9tYXNrID0gMHgwN2MwOwotCQlmYl9pbWFnZS0+Ymx1ZV9tYXNrICA9IDB4ZjgwMDsKLQl9IGVsc2UgaWYgKGIgPj0gMikgewotCQlmYl9pbWFnZS0+ZGVwdGggPSA4OwotCQlmYl9pbWFnZS0+cmVkX21hc2sgICA9IDB4MDc7Ci0JCWZiX2ltYWdlLT5ncmVlbl9tYXNrID0gMHgzODsKLQkJZmJfaW1hZ2UtPmJsdWVfbWFzayAgPSAweGMwOwotCX0gZWxzZSB7Ci0JCWZiX2ltYWdlLT5kZXB0aCA9IDE7Ci0JCWZiX2ltYWdlLT5yZWRfbWFzayAgID0gMHgxOwotCQlmYl9pbWFnZS0+Z3JlZW5fbWFzayA9IDB4MTsKLQkJZmJfaW1hZ2UtPmJsdWVfbWFzayAgPSAweDE7Ci0JfQotCi0JZGVwdGggPSBmYl9pbWFnZS0+ZGVwdGg7Ci0KLQlkcHlfeCA9IHdkcHlfeCA9IHc7Ci0JZHB5X3kgPSB3ZHB5X3kgPSBoOwotCW9mZl94ID0gMDsKLQlvZmZfeSA9IDA7Ci19Ci0KLXZvaWQgZG9fYW5ub3VuY2VfaHR0cCh2b2lkKTsKLXZvaWQgZG9fbWVudGlvbl9qYXZhX3VybHModm9pZCk7Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NlcnZpY2Uodm9pZCkgewotCWlmIChyZW1vdGVfZGlyZWN0KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFpbmV0ZCkgewotCQlkb19tZW50aW9uX2phdmFfdXJscygpOwotCQlkb19hbm5vdW5jZV9odHRwKCk7Ci0JCWlmICghdXNlX29wZW5zc2wpIHsKLQkJCWFubm91bmNlKHNjcmVlbi0+cG9ydCwgdXNlX29wZW5zc2wsIE5VTEwpOwotCQkJZnByaW50ZihzdGRvdXQsICJQT1JUPSVkXG4iLCBzY3JlZW4tPnBvcnQpOwotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRvdXQsICJQT1JUPSVkXG4iLCBzY3JlZW4tPnBvcnQpOwotCQkJaWYgKHN0dW5uZWxfcG9ydCkgewotCQkJCWZwcmludGYoc3Rkb3V0LCAiU1NMUE9SVD0lZFxuIiwgc3R1bm5lbF9wb3J0KTsKLQkJCX0gZWxzZSBpZiAodXNlX29wZW5zc2wpIHsKLQkJCQlmcHJpbnRmKHN0ZG91dCwgIlNTTFBPUlQ9JWRcbiIsIHNjcmVlbi0+cG9ydCk7Ci0JCQl9Ci0JCX0KLQkJZmZsdXNoKHN0ZG91dCk7Ci0JfSBlbHNlIGlmICghdXNlX29wZW5zc2wgJiYgYXZhaGkpIHsKLQkJY2hhciAqbmFtZSA9IHJmYl9kZXNrdG9wX25hbWU7Ci0JCWlmICghbmFtZSkgewotCQkJbmFtZSA9IHVzZV9kcHk7Ci0JCX0KLQkJYXZhaGlfaW5pdGlhbGlzZSgpOwotCQlhdmFoaV9hZHZlcnRpc2UobmFtZSwgdGhpc19ob3N0KCksIHNjcmVlbi0+cG9ydCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja193YWl0Ymcodm9pZCkgewotCWlmIChnZXRlbnYoIldBSVRCRyIpKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSyAmJiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRTSUQKLQkJaW50IHAsIG47Ci0JCWlmICgocCA9IGZvcmsoKSkgPiAwKSAgewotCQkJZXhpdCgwKTsKLQkJfSBlbHNlIGlmIChwID09IC0xKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmb3JrXG4iKTsKLQkJCXBlcnJvcigiZm9yayIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlpZiAoc2V0c2lkKCkgPT0gLTEpIHsKLQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCWZwcmludGYoc3RkZXJyLCAic2V0c2lkIGZhaWxlZFxuIik7Ci0JCQlwZXJyb3IoInNldHNpZCIpOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQkvKiBhZGp1c3Qgb3VyIHN0ZGlvICovCi0JCW4gPSBvcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSk7Ci0JCWR1cDIobiwgMCk7Ci0JCWR1cDIobiwgMSk7Ci0JCWlmICghIGxvZ2ZpbGUpIHsKLQkJCWR1cDIobiwgMik7Ci0JCX0KLQkJaWYgKG4gPiAyKSB7Ci0JCQljbG9zZShuKTsKLQkJfQotI2Vsc2UKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLSNlbmRpZgotCX0KLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfY2xpZW50X2Nvbm5lY3QoaW50ICpkaWRfY2xpZW50X2Nvbm5lY3QpIHsKLQlpZiAoY2xpZW50X2Nvbm5lY3QgIT0gTlVMTCkgewotCQljaGFyICpyZW1haW5kZXIgPSBOVUxMOwotCQlpZiAoaW5ldGQpIHsKLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAtY29ubmVjdCBkaXNhbGxvd2VkIGluIGluZXRkIG1vZGU6ICVzXG4iLAotCQkJICAgIGNsaWVudF9jb25uZWN0KTsKLQkJfSBlbHNlIGlmIChzY3JlZW4gJiYgc2NyZWVuLT5jbGllbnRIZWFkKSB7Ci0JCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogLWNvbm5lY3QgZGlzYWxsb3dlZDogY2xpZW50IGV4aXN0czogJXNcbiIsCi0JCQkgICAgY2xpZW50X2Nvbm5lY3QpOwotCQl9IGVsc2UgaWYgKHN0cmNocihjbGllbnRfY29ubmVjdCwgJz0nKSkgewotCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGludmFsaWQgLWNvbm5lY3Qgc3RyaW5nOiAlc1xuIiwKLQkJCSAgICBjbGllbnRfY29ubmVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyICpxID0gc3RyY2hyKGNsaWVudF9jb25uZWN0LCAnLCcpOwotCQkJaWYgKHEpIHsKLQkJCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogb25seSB1c2luZyBmaXJzdCIKLQkJCQkgICAgIiBjb25uZWN0IGhvc3QgaW46ICVzXG4iLCBjbGllbnRfY29ubmVjdCk7Ci0JCQkJcmVtYWluZGVyID0gc3RyZHVwKHErMSk7Ci0JCQkJKnEgPSAnXDAnOwotCQkJfQotCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IHJldmVyc2VfY29ubmVjdCglcylcbiIsCi0JCQkgICAgY2xpZW50X2Nvbm5lY3QpOwotCQkJcmV2ZXJzZV9jb25uZWN0KGNsaWVudF9jb25uZWN0KTsKLQkJCSpkaWRfY2xpZW50X2Nvbm5lY3QgPSAxOwotCQl9Ci0JCWZyZWUoY2xpZW50X2Nvbm5lY3QpOwotCQlpZiAocmVtYWluZGVyICE9IE5VTEwpIHsKLQkJCS8qIHJlc2V0IHRvIGhvc3QyLGhvc3QzLC4uLiAqLwotCQkJY2xpZW50X2Nvbm5lY3QgPSByZW1haW5kZXI7Ci0JCX0gZWxzZSB7Ci0JCQljbGllbnRfY29ubmVjdCA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGxvb3BfZm9yX2Nvbm5lY3QoaW50IGRpZF9jbGllbnRfY29ubmVjdCkgewotCWludCBsb29wID0gMDsKLQl0aW1lX3Qgc3RhcnQgPSB0aW1lKE5VTEwpOwotCi0JaWYgKGZpcnN0X2Nvbm5fdGltZW91dCA8IDApIHsKLQkJZmlyc3RfY29ubl90aW1lb3V0ID0gLWZpcnN0X2Nvbm5fdGltZW91dDsKLQl9Ci0KLQl3aGlsZSAoMSkgewotCQlsb29wKys7Ci0JCWlmIChmaXJzdF9jb25uX3RpbWVvdXQgJiYgdGltZShOVUxMKSA+IHN0YXJ0ICsgZmlyc3RfY29ubl90aW1lb3V0KSB7Ci0JCQlyZmJMb2coIm5vIGNsaWVudCBjb25uZWN0IGFmdGVyICVkIHNlY29uZHMuXG4iLCBmaXJzdF9jb25uX3RpbWVvdXQpOwotCQkJc2h1dF9kb3duID0gMTsKLQkJfQotCQlpZiAoc2h1dF9kb3duKSB7Ci0JCQljbGVhbl91cF9leGl0KDApOwotCQl9Ci0JCWlmIChsb29wIDwgMikgewotCQkJaWYgKGRpZF9jbGllbnRfY29ubmVjdCkgewotCQkJCWdvdG8gc2NyZWVuX2NoZWNrOwotCQkJfQotCQkJaWYgKGluZXRkKSB7Ci0JCQkJZ290byBzY3JlZW5fY2hlY2s7Ci0JCQl9Ci0JCQlpZiAoc2NyZWVuICYmIHNjcmVlbi0+Y2xpZW50SGVhZCkgewotCQkJCWdvdG8gc2NyZWVuX2NoZWNrOwotCQkJfQotCQl9Ci0JCWlmICgodXNlX29wZW5zc2wgfHwgdXNlX3N0dW5uZWwpICYmICFpbmV0ZCkgewotCQkJaW50IGVuY19ub25lID0gKGVuY19zdHIgJiYgIXN0cmNtcChlbmNfc3RyLCAibm9uZSIpKTsKLQkJCWlmICghdXNlX3N0dW5uZWwgfHwgZW5jX25vbmUpIHsKLQkJCQljaGVja19vcGVuc3NsKCk7Ci0JCQkJY2hlY2tfaHR0cHMoKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUaGlzIGlzIHRvIGhhbmRsZSBhbiBpbml0aWFsIHZlcmlmeSBjZXJ0IGZyb20gdmlld2VyLAotCQkJICogdGhleSBkaXNjb25uZWN0IHJpZ2h0IGFmdGVyIGZldGNoaW5nIHRoZSBjZXJ0LgotCQkJICovCi0JCQlpZiAodXNlX3RocmVhZHMpIHsKLQkJCQl1c2xlZXAoMTAgKiAxMDAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZiUEUoLTEpOwotCQkJfQotCQkJaWYgKHNjcmVlbiAmJiBzY3JlZW4tPmNsaWVudEhlYWQpIHsKLQkJCQlpbnQgaTsKLQkJCQlpZiAodW5peHB3KSB7Ci0JCQkJCWlmICghIHVuaXhwd19pbl9wcm9ncmVzcyAmJiAhdmVuY3J5cHRfZW5hYmxlX3BsYWluX2xvZ2luKSB7Ci0JCQkJCQlyZmJMb2coInVuaXhwdyBidXQgbm8gdW5peHB3X2luX3Byb2dyZXNzXG4iKTsKLQkJCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHVuaXhwd19jbGllbnQgJiYgdW5peHB3X2NsaWVudC0+b25Ib2xkKSB7Ci0JCQkJCQlyZmJMb2coInRha2luZyB1bml4cHdfY2xpZW50IG9mZiBob2xkXG4iKTsKLQkJCQkJCXVuaXhwd19jbGllbnQtPm9uSG9sZCA9IEZBTFNFOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoaT0wOyBpPDEwOyBpKyspIHsKLQkJCQkJaWYgKHNodXRfZG93bikgewotCQkJCQkJY2xlYW5fdXBfZXhpdCgwKTsKLQkJCQkJfQotCQkJCQl1c2xlZXAoMjAgKiAxMDAwKTsKLQkJCQkJaWYgKDApIHJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAlZFxuIiwgaSk7Ci0KLQkJCQkJaWYgKCEgdXNlX3RocmVhZHMpIHsKLQkJCQkJCWlmICh1bml4cHcpIHsKLQkJCQkJCQl1bml4cHdfaW5fcmZiUEUgPSAxOwotCQkJCQkJfQotCQkJCQkJcmZiUEUoLTEpOwotCQkJCQkJaWYgKHVuaXhwdykgewotCQkJCQkJCXVuaXhwd19pbl9yZmJQRSA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAodW5peHB3ICYmICF1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJCQkJCS8qIFhYWCB0b28gc29vbi4gKi8KLQkJCQkJCWdvdG8gc2NyZWVuX2NoZWNrOwotCQkJCQl9Ci0JCQkJCWlmICghc2NyZWVuLT5jbGllbnRIZWFkKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICh1c2Vfb3BlbnNzbCkgewotCQkJY2hlY2tfb3BlbnNzbCgpOwotCQl9Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSB7Ci0JCQl1c2xlZXAoMTAgKiAxMDAwKTsKLQkJfSBlbHNlIHsKLQkJCXJmYlBFKC0xKTsKLQkJfQotCi0JCXNjcmVlbl9jaGVjazoKLQkJaWYgKCEgc2NyZWVuIHx8ICEgc2NyZWVuLT5jbGllbnRIZWFkKSB7Ci0JCQl1c2xlZXAoMTAwICogMTAwMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBnb3QgY2xpZW50XG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkb191bml4cHdfbG9vcCh2b2lkKSB7Ci0JaWYgKHVuaXhwdykgewotCQlpZiAoISB1bml4cHdfaW5fcHJvZ3Jlc3MgJiYgIXZlbmNyeXB0X2VuYWJsZV9wbGFpbl9sb2dpbikgewotCQkJcmZiTG9nKCJ1bml4cHcgYnV0IG5vIHVuaXhwd19pbl9wcm9ncmVzc1xuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWlmICh1bml4cHdfY2xpZW50ICYmIHVuaXhwd19jbGllbnQtPm9uSG9sZCkgewotCQkJcmZiTG9nKCJ0YWtpbmcgdW5peHB3X2NsaWVudCBvZmYgaG9sZC5cbiIpOwotCQkJdW5peHB3X2NsaWVudC0+b25Ib2xkID0gRkFMU0U7Ci0JCX0KLQkJd2hpbGUgKDEpIHsKLQkJCWlmIChzaHV0X2Rvd24pIHsKLQkJCQljbGVhbl91cF9leGl0KDApOwotCQkJfQotCQkJaWYgKCEgdXNlX3RocmVhZHMpIHsKLQkJCQl1bml4cHdfaW5fcmZiUEUgPSAxOwotCQkJCXJmYlBFKC0xKTsKLQkJCQl1bml4cHdfaW5fcmZiUEUgPSAwOwotCQkJfQotCQkJaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQkJCXN0YXRpYyBkb3VibGUgbHBpbmcgPSAwLjA7Ci0JCQkJaWYgKGxwaW5nIDwgZG5vdygpICsgNSkgewotCQkJCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoMCwgMCwgMSwgMSwgMSk7Ci0JCQkJCWxwaW5nID0gZG5vdygpOwotCQkJCX0KLQkJCQlpZiAodGltZShOVUxMKSA+IHVuaXhwd19sYXN0X3RyeV90aW1lICsgNDUpIHsKLQkJCQkJcmZiTG9nKCJ1bml4cHdfZGVueTogdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlcGx5LlxuIik7Ci0JCQkJCXVuaXhwd19kZW55KCk7Ci0JCQkJfQotCQkJCXVzbGVlcCgyMCAqIDEwMDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IHVuaXhwdyBmaW5pc2hlZC5cbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZuY19yZWRpcmVjdF9sb29wKGNoYXIgKnZuY19yZWRpcmVjdF90ZXN0LCBpbnQgKnZuY19yZWRpcmVjdF9jbnQpIHsKLQlpZiAodW5peHB3KSB7Ci0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAtdW5peHB3IGFuZCBYdm5jLnJlZGlyZWN0IG5vdCBhbGxvd2VkXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JaWYgKGNsaWVudF9jb25uZWN0KSB7Ci0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAtY29ubmVjdCBhbmQgWHZuYy5yZWRpcmVjdCBub3QgYWxsb3dlZFxuIik7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmIChpbmV0ZCkgewotCQlpZiAodXNlX29wZW5zc2wpIHsKLQkJCWFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfSU5FVEQsIC0xKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBpZF90IHBpZCA9IDA7Ci0JCS8qIFhYWCBpcHY2ICovCi0JCWlmIChzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID49IDApIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JCQlpZiAoKHBpZCA9IGZvcmsoKSkgPiAwKSB7Ci0JCQkJY2xvc2Uoc2NyZWVuLT5odHRwTGlzdGVuU29jayk7Ci0JCQkJLyogbXV0ZXggKi8KLQkJCQlzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID0gLTI7Ci0JCQkJdXNsZWVwKDUwMCAqIDEwMDApOwotCQkJfSBlbHNlIHsKLQkJCQljbG9zZShzY3JlZW4tPmxpc3RlblNvY2spOwotCQkJCXNjcmVlbi0+bGlzdGVuU29jayA9IC0xOwotCQkJCXdoaWxlICgxKSB7Ci0JCQkJCXVzbGVlcCgxMCAqIDEwMDApOwotCQkJCQlyZmJIdHRwQ2hlY2tGZHMoc2NyZWVuKTsKLQkJCQl9Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLSNlbHNlCi0JCQljbGVhbl91cF9leGl0KDEpOwotI2VuZGlmCi0JCX0KLQkJaWYgKGZpcnN0X2Nvbm5fdGltZW91dCkgewotCQkJaWYgKGZpcnN0X2Nvbm5fdGltZW91dCA8IDApIHsKLQkJCQlmaXJzdF9jb25uX3RpbWVvdXQgPSAtZmlyc3RfY29ubl90aW1lb3V0OwotCQkJfQotCQkJc2lnbmFsKFNJR0FMUk0sIHZuY19yZWRpcmVjdF90aW1lb3V0KTsKLQkJCWFsYXJtKGZpcnN0X2Nvbm5fdGltZW91dCk7Ci0JCX0KLQkJaWYgKHVzZV9vcGVuc3NsKSB7Ci0JCQlpbnQgaTsKLQkJCWlmIChwaWQgPT0gMCkgewotCQkJCWFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfVk5DLCAtMSk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaT0wOyBpIDwgMTY7IGkrKykgewotCQkJCQlhY2NlcHRfb3BlbnNzbChPUEVOU1NMX1ZOQywgLTEpOwotCQkJCQlyZmJMb2coIml0ZXIgJWQ6IHZuY19yZWRpcmVjdF9zb2NrOiAlZFxuIiwgaSwgdm5jX3JlZGlyZWN0X3NvY2spOwotCQkJCQlpZiAodm5jX3JlZGlyZWN0X3NvY2sgPj0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSNpZmRlZiBfX2hwdXgKLQkJCWludCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotI2Vsc2UKLQkJCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotI2VuZGlmCi0JCQlpZiAoc2NyZWVuLT5saXN0ZW5Tb2NrIDwgMCkgewotCQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBYdm5jLnJlZGlyZWN0IG5vdCBsaXN0ZW5pbmcuLi4gc29jaz0lZCBwb3J0PSVkXG4iLCBzY3JlZW4tPmxpc3RlblNvY2ssIHNjcmVlbi0+cG9ydCk7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCXZuY19yZWRpcmVjdF9zb2NrID0gYWNjZXB0KHNjcmVlbi0+bGlzdGVuU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCX0KLQkJaWYgKGZpcnN0X2Nvbm5fdGltZW91dCkgewotCQkJYWxhcm0oMCk7Ci0JCX0KLQkJaWYgKHBpZCA+IDApIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JCQlpbnQgcmM7Ci0JCQlwaWRfdCBwaWR3OwotCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGtpbGwgVEVSTTogJWRcbiIsIChpbnQpIHBpZCk7Ci0JCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCQl1c2xlZXAoMTAwMCAqIDEwMDApOwkvKiAxLjAgc2VjICovCi0JCQlwaWR3ID0gd2FpdHBpZChwaWQsICZyYywgV05PSEFORyk7Ci0JCQlpZiAocGlkdyA8PSAwKSB7Ci0JCQkJdXNsZWVwKDEwMDAgKiAxMDAwKTsJLyogMS4wIHNlYyAqLwotCQkJCXBpZHcgPSB3YWl0cGlkKHBpZCwgJnJjLCBXTk9IQU5HKTsKLQkJCX0KLSNlbHNlCi0JCQljbGVhbl91cF9leGl0KDEpOwotI2VuZGlmCi0JCX0KLQl9Ci0JaWYgKHZuY19yZWRpcmVjdF9zb2NrIDwgMCkgewotCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogdm5jX3JlZGlyZWN0IGZhaWxlZC5cbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQlpZiAoIWluZXRkICYmIHVzZV9vcGVuc3NsKSB7Ci0JCS8qIGNoZWNrIGZvciBGZXRjaCBDZXJ0IGNsb3NpbmcgKi8KLQkJZmRfc2V0IHJmZHM7Ci0JCXN0cnVjdCB0aW1ldmFsIHR2OwotCQlpbnQgbmZkczsKLQotCQl1c2xlZXAoMzAwKjEwMDApOwotCi0JCUZEX1pFUk8oJnJmZHMpOwotCQlGRF9TRVQodm5jX3JlZGlyZWN0X3NvY2ssICZyZmRzKTsKLQotCQl0di50dl9zZWMgPSAwOwotCQl0di50dl91c2VjID0gMjAwMDAwOwotCQluZmRzID0gc2VsZWN0KHZuY19yZWRpcmVjdF9zb2NrKzEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiB2bmNfcmVkaXJlY3QgbmZkczogJWRcbiIsIG5mZHMpOwotCQlpZiAobmZkcyA+IDApIHsKLQkJCWludCBuOwotCQkJbiA9IHJlYWQodm5jX3JlZGlyZWN0X3NvY2ssIHZuY19yZWRpcmVjdF90ZXN0LCAxKTsKLQkJCWlmIChuIDw9IDApIHsKLQkJCQljbG9zZSh2bmNfcmVkaXJlY3Rfc29jayk7Ci0JCQkJdm5jX3JlZGlyZWN0X3NvY2sgPSAtMTsKLQkJCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogd2FpdGluZyBmb3IgMm5kIGNvbm5lY3Rpb24gKEZldGNoIENlcnQ/KVxuIik7Ci0JCQkJYWNjZXB0X29wZW5zc2woT1BFTlNTTF9WTkMsIC0xKTsKLQkJCQlpZiAodm5jX3JlZGlyZWN0X3NvY2sgPCAwKSB7Ci0JCQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiB2bmNfcmVkaXJlY3QgZmFpbGVkLlxuIik7Ci0JCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkqdm5jX3JlZGlyZWN0X2NudCA9IG47Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3ZuY19yZWRpcmVjdChpbnQgY3JlYXRlZF9kaXNwLCBjaGFyICp2bmNfcmVkaXJlY3RfaG9zdCwgaW50IHZuY19yZWRpcmVjdF9wb3J0LAotICAgIGludCB2bmNfcmVkaXJlY3RfY250LCBjaGFyICp2bmNfcmVkaXJlY3RfdGVzdCkgewotCWNoYXIgKnEgPSBzdHJyY2hyKHVzZV9kcHksICc6Jyk7Ci0JaW50IHZkcHkgPSAtMSwgc29jayA9IC0xOwotCWludCBzX2luLCBzX291dCwgaTsKLQlpZiAodm5jX3JlZGlyZWN0ID09IDIpIHsKLQkJY2hhciBudW1bMzJdOwkKLQkJc3ByaW50ZihudW0sICI6JWQiLCB2bmNfcmVkaXJlY3RfcG9ydCk7Ci0JCXEgPSBudW07Ci0JfQotCWlmICghcSkgewotCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogY2FuJ3QgZmluZCBudW1iZXIgaW4gWCBkaXNwbGF5OiAlc1xuIiwgdXNlX2RweSk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmIChzc2NhbmYocSsxLCAiJWQiLCAmdmRweSkgIT0gMSkgewotCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogY2FuJ3QgZmluZCBudW1iZXIgaW4gWCBkaXNwbGF5OiAlc1xuIiwgcSk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCWlmICh2ZHB5ID09IC0xICYmIHZuY19yZWRpcmVjdCAhPSAyKSB7Ci0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBjYW4ndCBmaW5kIG51bWJlciBpbiBYIGRpc3BsYXk6ICVzXG4iLCBxKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JaWYgKHZuY19yZWRpcmVjdCA9PSAyKSB7Ci0JCWlmICh2ZHB5IDwgMCkgewotCQkJdmRweSA9IC12ZHB5OwotCQl9IGVsc2UgaWYgKHZkcHkgPCAyMDApIHsKLQkJCXZkcHkgKz0gNTkwMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZkcHkgKz0gNTkwMDsKLQl9Ci0JaWYgKGNyZWF0ZWRfZGlzcCkgewotCQl1c2xlZXAoMTAwMCoxMDAwKTsKLQl9Ci0JZm9yIChpPTA7IGkgPCAyMDsgaSsrKSB7Ci0JCXNvY2sgPSBjb25uZWN0X3RjcCh2bmNfcmVkaXJlY3RfaG9zdCwgdmRweSk7Ci0JCWlmIChzb2NrID49IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAuLi5cbiIpOwotCQl1c2xlZXAoNTAwKjEwMDApOwotCX0KLQlpZiAoc29jayA8IDApIHsKLQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGNvdWxkIG5vdCBjb25uZWN0IHRvIGEgVk5DIFNlcnZlciBhdCAlczolZFxuIiwgdm5jX3JlZGlyZWN0X2hvc3QsIHZkcHkpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQlpZiAoaW5ldGQpIHsKLQkJc19pbiAgPSBmaWxlbm8oc3RkaW4pOwotCQlzX291dCA9IGZpbGVubyhzdGRvdXQpOwotCX0gZWxzZSB7Ci0JCXNfaW4gPSBzX291dCA9IHZuY19yZWRpcmVjdF9zb2NrOwotCX0KLQlpZiAodm5jX3JlZGlyZWN0X2NudCA+IDApIHsKLQkJd3JpdGUodm5jX3JlZGlyZWN0X3NvY2ssIHZuY19yZWRpcmVjdF90ZXN0LCB2bmNfcmVkaXJlY3RfY250KTsKLQl9Ci0JcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IHN3aXRjaGluZyBjb250cm9sIHRvIFZOQyBTZXJ2ZXIgYXQgJXM6JWRcbiIsIHZuY19yZWRpcmVjdF9ob3N0LCB2ZHB5KTsKLQlyYXdfeGZlcihzb2NrLCBzX2luLCBzX291dCk7Ci19Ci0KLWV4dGVybiBjaGFyIGZpbmRfZGlzcGxheVtdOwotZXh0ZXJuIGNoYXIgY3JlYXRlX2Rpc3BsYXlbXTsKLQotY2hhciAqc2V0dXBfY21kKGNoYXIgKnN0ciwgaW50ICp2bmNfcmVkaXJlY3QsIGNoYXIgKip2bmNfcmVkaXJlY3RfaG9zdCwgaW50ICp2bmNfcmVkaXJlY3RfcG9ydCwgaW50IGRiKSB7Ci0JY2hhciAqY21kID0gTlVMTDsKLQkKLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJXQUlUIikpIHsKLQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQgZXh0ZXJuYWwgY21kcyBub3QgYWxsb3dlZDoiCi0JCSAgICAiICVzXG4iLCB1c2VfZHB5KTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQljbWQgPSBzdHIgKyBzdHJsZW4oImNtZD0iKTsKLQlpZiAoIXN0cmNtcChjbWQsICJGSU5ERElTUExBWS1wcmludCIpKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiJXMiLCBmaW5kX2Rpc3BsYXkpOwotCQljbGVhbl91cF9leGl0KDApOwotCX0KLQlpZiAoIXN0cmNtcChjbWQsICJGSU5ERElTUExBWS1ydW4iKSkgewotCQljaGFyIHRtcFtdID0gIi90bXAvZmQuWFhYWFhYIjsKLQkJY2hhciBjb21bMTAwXTsKLQkJaW50IGZkID0gbWtzdGVtcCh0bXApOwotCQlpZiAoZmQgPj0gMCkgewotCQkJaW50IHJldDsKLQkJCXdyaXRlKGZkLCBmaW5kX2Rpc3BsYXksIHN0cmxlbihmaW5kX2Rpc3BsYXkpKTsKLQkJCWNsb3NlKGZkKTsKLQkJCXNldF9lbnYoIkZJTkRESVNQTEFZX3J1biIsICIxIik7Ci0JCQlzcHJpbnRmKGNvbSwgIi9iaW4vc2ggJXMgLW4iLCB0bXApOwotCQkJcmV0ID0gc3lzdGVtKGNvbSk7Ci0JCQlpZiAoV0lGRVhJVEVEKHJldCkgJiYgV0VYSVRTVEFUVVMocmV0KSAhPSAwKSB7Ci0JCQkJaWYgKGdvdF9maW5kYXV0aCAmJiAhZ2V0ZW52KCJGRF9YRE0iKSkgewotCQkJCQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkgewotCQkJCQkJc2V0X2VudigiRkRfWERNIiwgIjEiKTsKLQkJCQkJCXN5c3RlbShjb20pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVubGluayh0bXApOwotCQlleGl0KDApOwotCX0KLQlpZiAoIXN0cmNtcChzdHIsICJGSU5EQ1JFQVRFRElTUExBWS1wcmludCIpKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiJXMiLCBjcmVhdGVfZGlzcGxheSk7Ci0JCWNsZWFuX3VwX2V4aXQoMCk7Ci0JfQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjbWQ6ICVzXG4iLCBjbWQpOwotCWlmIChzdHJzdHIoc3RyLCAiRklORENSRUFURURJU1BMQVkiKSB8fCBzdHJzdHIoc3RyLCAiRklORERJU1BMQVkiKSkgewotCQlpZiAoc3Ryc3RyKHN0ciwgIlh2bmMucmVkaXJlY3QiKSB8fCBzdHJzdHIoc3RyLCAiWC5yZWRpcmVjdCIpKSB7Ci0JCQkqdm5jX3JlZGlyZWN0ID0gMTsKLQkJfQotCX0KLQlpZiAoc3Ryc3RyKGNtZCwgIkZJTkRESVNQTEFZLXZuY19yZWRpcmVjdCIpID09IGNtZCkgewotCQlpbnQgcDsKLQkJY2hhciBoWzI1Nl07Ci0JCWlmIChzdHJsZW4oY21kKSA+PSAyNTYpIHsKLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50IHN0cmluZyB0b28gbG9uZzogJXNcbiIsIHN0cik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWhbMF0gPSAnXDAnOwotCQlpZiAoc3NjYW5mKGNtZCwgIkZJTkRESVNQTEFZLXZuY19yZWRpcmVjdD0lZCIsICZwKSA9PSAxKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIkZJTkRESVNQTEFZLXZuY19yZWRpcmVjdD0lcyAlZCIsIGgsICZwKSA9PSAyKSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudCBiYWQgc3RyaW5nOiAlc1xuIiwgY21kKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJKnZuY19yZWRpcmVjdF9wb3J0ID0gcDsKLQkJaWYgKHN0cmNtcChoLCAiIikpIHsKLQkJCSp2bmNfcmVkaXJlY3RfaG9zdCA9IHN0cmR1cChoKTsKLQkJfQotCQkqdm5jX3JlZGlyZWN0ID0gMjsKLQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IHZuY19yZWRpcmVjdDogJXM6JWRcbiIsICp2bmNfcmVkaXJlY3RfaG9zdCwgKnZuY19yZWRpcmVjdF9wb3J0KTsKLQl9Ci0JcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIGNoYXIgKmJ1aWxkX2NyZWF0ZV9jbWQoY2hhciAqY21kLCBpbnQgKnNhd194ZG1jcCwgY2hhciAqdXNzbHBlZXIsIGNoYXIgKnRtcCkgewotCWNoYXIgKmNyZWF0ZV9jbWQgPSBOVUxMOwotCWNoYXIgKm9wdHMgPSBzdHJjaHIoY21kLCAnLScpOwotCWNoYXIgc3RbXSA9ICIiOwotCWNoYXIgZmRnZW9tWzEyOF0sIGZkc2Vzc1sxMjhdLCBmZG9wdHNbMTI4XSwgZmRleHRyYVsyNTZdLCBmZHByb2dbMTI4XTsKLQljaGFyIGZkeHNydlsxMjhdLCBmZHhkdW1bMTI4XSwgZmRjdXBzWzEyOF0sIGZkZXNkWzEyOF07Ci0JY2hhciBmZG5hc1sxMjhdLCBmZHNtYlsxMjhdLCBmZHRhZ1sxMjhdLCBmZHhkbWNwaWZbMTI4XTsKLQljaGFyIGNkb3V0WzEyOF07Ci0KLQlpZiAob3B0cykgewotCQlvcHRzKys7Ci0JCWlmIChzdHJzdHIob3B0cywgInhkbWNwIikpIHsKLQkJCSpzYXdfeGRtY3AgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJb3B0cyA9IHN0OwotCX0KLQlzcHJpbnRmKGZkZ2VvbSwgIk5PTkUiKTsKLQlmZHNlc3NbMF0gPSAnXDAnOwotCWZkZ2VvbVswXSA9ICdcMCc7Ci0JZmRvcHRzWzBdID0gJ1wwJzsKLQlmZGV4dHJhWzBdID0gJ1wwJzsKLQlmZHByb2dbMF0gPSAnXDAnOwotCWZkeHNydlswXSA9ICdcMCc7Ci0JZmR4ZHVtWzBdID0gJ1wwJzsKLQlmZGN1cHNbMF0gPSAnXDAnOwotCWZkZXNkWzBdICA9ICdcMCc7Ci0JZmRuYXNbMF0gID0gJ1wwJzsKLQlmZHNtYlswXSAgPSAnXDAnOwotCWZkdGFnWzBdICA9ICdcMCc7Ci0JZmR4ZG1jcGlmWzBdICA9ICdcMCc7Ci0JY2RvdXRbMF0gID0gJ1wwJzsKLQotCWlmICh1bml4cHcgJiYga2VlcF91bml4cHdfb3B0cyAmJiAhZ2V0ZW52KCJYMTFWTkNfTk9fVU5JWFBXX09QVFMiKSkgewotCQljaGFyICpxLCAqcCwgKnQgPSBzdHJkdXAoa2VlcF91bml4cHdfb3B0cyk7Ci0KLQkJaWYgKHN0cnN0cih0LCAiZ25vbWUiKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJnbm9tZSIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cih0LCAia2RlIikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAia2RlIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJseGRlIikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAibHhkZSIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cih0LCAidHdtIikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAidHdtIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJmdndtIikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAiZnZ3bSIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cih0LCAibXdtIikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAibXdtIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJjZGUiKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJjZGUiKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIodCwgImR0d20iKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJkdHdtIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJ4dGVybSIpKSB7Ci0JCQlzcHJpbnRmKGZkc2VzcywgInh0ZXJtIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJ3bWFrZXIiKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJ3bWFrZXIiKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIodCwgInhmY2UiKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJ4ZmNlIik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHQsICJlbmxpZ2h0ZW5tZW50IikpIHsKLQkJCXNwcmludGYoZmRzZXNzLCAiZW5saWdodGVubWVudCIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cih0LCAiWHNlc3Npb24iKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJYc2Vzc2lvbiIpOwotCQl9IGVsc2UgaWYgKHN0cnN0cih0LCAiZmFpbHNhZmUiKSkgewotCQkJc3ByaW50ZihmZHNlc3MsICJmYWlsc2FmZSIpOwotCQl9Ci0KLQkJcSA9IHN0cnN0cih0LCAiZ2U9Iik7Ci0JCWlmICghIHEpIHEgPSBzdHJzdHIodCwgImdlb209Iik7Ci0JCWlmICghIHEpIHEgPSBzdHJzdHIodCwgImdlb21ldHJ5PSIpOwotCQlpZiAocSkgewotCQkJaW50IG9rID0gMTsKLQkJCXEgPSBzdHJzdHIocSwgIj0iKTsKLQkJCXErKzsKLQkJCXAgPSBzdHJzdHIocSwgIiwiKTsKLQkJCWlmIChwKSAqcCA9ICdcMCc7Ci0JCQlwID0gcTsKLQkJCXdoaWxlICgqcCkgewotCQkJCWlmICgqcCA9PSAneCcpIHsKLQkJCQkJOwotCQkJCX0gZWxzZSBpZiAoaXNkaWdpdCgoaW50KSAqcCkpIHsKLQkJCQkJOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9rID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXArKzsKLQkJCX0KLQkJCWlmIChvayAmJiBzdHJsZW4ocSkgPCAzMikgewotCQkJCXNwcmludGYoZmRnZW9tLCAiJXMiLCBxKTsKLQkJCQlpZiAoIXF1aWV0KSB7Ci0JCQkJCXJmYkxvZygic2V0IGNyZWF0ZSBkaXNwbGF5IGdlb206ICVzXG4iLCBmZGdlb20pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlxID0gc3Ryc3RyKHQsICJjdXBzPSIpOwotCQlpZiAocSkgewotCQkJaW50IHA7Ci0JCQlpZiAoc3NjYW5mKHEsICJjdXBzPSVkIiwgJnApID09IDEpIHsKLQkJCQlzcHJpbnRmKGZkY3VwcywgIiVkIiwgcCk7Ci0JCQl9Ci0JCX0KLQkJcSA9IHN0cnN0cih0LCAiZXNkPSIpOwotCQlpZiAocSkgewotCQkJaW50IHA7Ci0JCQlpZiAoc3NjYW5mKHEsICJlc2Q9JWQiLCAmcCkgPT0gMSkgewotCQkJCXNwcmludGYoZmRlc2QsICIlZCIsIHApOwotCQkJfQotCQl9Ci0JCWlmICghZ2V0ZW52KCJGRF9UQUciKSkgewotCQkJY2hhciAqcyA9IE5VTEw7Ci0KLQkJCXEgPSBzdHJzdHIodCwgInRhZz0iKTsKLQkJCWlmIChxKSBzID0gc3RyY2hyKHEsICcsJyk7Ci0JCQlpZiAocykgKnMgPSAnXDAnOwotCi0JCQlpZiAocSAmJiBzdHJsZW4ocSkgPCAxMjApIHsKLQkJCQljaGFyICpwOwotCQkJCWludCBvayA9IDE7Ci0JCQkJcSA9IHN0cmNocihxLCAnPScpICsgMTsKLQkJCQlwID0gcTsKLQkJCQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQkJCQljaGFyIGMgPSAqcDsKLQkJCQkJaWYgKCpwID09ICdfJyB8fCAqcCA9PSAnLScpIHsKLQkJCQkJCTsKLQkJCQkJfSBlbHNlIGlmICghaXNhbG51bSgoaW50KSBjKSkgewotCQkJCQkJb2sgPSAwOwotCQkJCQkJcmZiTG9nKCJiYWQgdGFnIGNoYXI6ICclYycgaW4gJyVzJ1xuIiwgYywgcSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwKys7Ci0JCQkJfQotCQkJCWlmIChvaykgewotCQkJCQlzcHJpbnRmKGZkdGFnLCAiJXMiLCBxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocykgKnMgPSAnLCc7Ci0JCX0KLQkJZnJlZSh0KTsKLQl9Ci0JaWYgKGZkZ2VvbVswXSA9PSAnXDAnICYmIGdldGVudigiRkRfR0VPTSIpKSB7Ci0JCXNucHJpbnRmKGZkZ2VvbSwgIDEyMCwgIiVzIiwgZ2V0ZW52KCJGRF9HRU9NIikpOwotCX0KLQlpZiAoZmRzZXNzWzBdID09ICdcMCcgJiYgZ2V0ZW52KCJGRF9TRVNTIikpIHsKLQkJc25wcmludGYoZmRzZXNzLCAxMjAsICIlcyIsIGdldGVudigiRkRfU0VTUyIpKTsKLQl9Ci0JaWYgKGZkb3B0c1swXSA9PSAnXDAnICYmIGdldGVudigiRkRfT1BUUyIpKSB7Ci0JCXNucHJpbnRmKGZkb3B0cywgMTIwLCAiJXMiLCBnZXRlbnYoIkZEX09QVFMiKSk7Ci0JfQotCWlmIChmZGV4dHJhWzBdID09ICdcMCcgJiYgZ2V0ZW52KCJGRF9FWFRSQSIpKSB7Ci0JCWlmICghc3RyY2hyKGdldGVudigiRkRfRVhUUkEiKSwgJ1wnJykpIHsKLQkJCXNucHJpbnRmKGZkZXh0cmEsIDI1MCwgIiVzIiwgZ2V0ZW52KCJGRF9FWFRSQSIpKTsKLQkJfQotCX0KLQlpZiAoZmRwcm9nWzBdID09ICdcMCcgJiYgZ2V0ZW52KCJGRF9QUk9HIikpIHsKLQkJc25wcmludGYoZmRwcm9nLCAxMjAsICIlcyIsIGdldGVudigiRkRfUFJPRyIpKTsKLQl9Ci0JaWYgKGZkeHNydlswXSA9PSAnXDAnICYmIGdldGVudigiRkRfWFNSViIpKSB7Ci0JCXNucHJpbnRmKGZkeHNydiwgMTIwLCAiJXMiLCBnZXRlbnYoIkZEX1hTUlYiKSk7Ci0JfQotCWlmIChmZGN1cHNbMF0gPT0gJ1wwJyAmJiBnZXRlbnYoIkZEX0NVUFMiKSkgewotCQlzbnByaW50ZihmZGN1cHMsIDEyMCwgIiVzIiwgZ2V0ZW52KCJGRF9DVVBTIikpOwotCX0KLQlpZiAoZmRlc2RbMF0gPT0gJ1wwJyAmJiBnZXRlbnYoIkZEX0VTRCIpKSB7Ci0JCXNucHJpbnRmKGZkZXNkLCAxMjAsICIlcyIsIGdldGVudigiRkRfRVNEIikpOwotCX0KLQlpZiAoZmRuYXNbMF0gPT0gJ1wwJyAmJiBnZXRlbnYoIkZEX05BUyIpKSB7Ci0JCXNucHJpbnRmKGZkbmFzLCAxMjAsICIlcyIsIGdldGVudigiRkRfTkFTIikpOwotCX0KLQlpZiAoZmRzbWJbMF0gPT0gJ1wwJyAmJiBnZXRlbnYoIkZEX1NNQiIpKSB7Ci0JCXNucHJpbnRmKGZkc21iLCAxMjAsICIlcyIsIGdldGVudigiRkRfU01CIikpOwotCX0KLQlpZiAoZmR0YWdbMF0gPT0gJ1wwJyAmJiBnZXRlbnYoIkZEX1RBRyIpKSB7Ci0JCXNucHJpbnRmKGZkdGFnLCAxMjAsICIlcyIsIGdldGVudigiRkRfVEFHIikpOwotCX0KLQlpZiAoZmR4ZG1jcGlmWzBdID09ICdcMCcgJiYgZ2V0ZW52KCJGRF9YRE1DUF9JRiIpKSB7Ci0JCXNucHJpbnRmKGZkeGRtY3BpZiwgIDEyMCwgIiVzIiwgZ2V0ZW52KCJGRF9YRE1DUF9JRiIpKTsKLQl9Ci0JaWYgKGZkeGR1bVswXSA9PSAnXDAnICYmIGdldGVudigiRkRfWERVTU1ZX1JVTl9BU19ST09UIikpIHsKLQkJc25wcmludGYoZmR4ZHVtLCAxMjAsICIlcyIsIGdldGVudigiRkRfWERVTU1ZX1JVTl9BU19ST09UIikpOwotCX0KLQlpZiAoZ2V0ZW52KCJDUkVBVEVfRElTUExBWV9PVVRQVVQiKSkgewotCQlzbnByaW50ZihjZG91dCwgMTIwLCAiQ1JFQVRFX0RJU1BMQVlfT1VUUFVUPSclcyciLCBnZXRlbnYoIkNSRUFURV9ESVNQTEFZX09VVFBVVCIpKTsKLQl9Ci0KLQlpZiAoc3RyY2hyKGZkZ2VvbSwgJ1wnJykpCWZkZ2VvbVswXSA9ICdcMCc7Ci0JaWYgKHN0cmNocihmZG9wdHMsICdcJycpKQlmZG9wdHNbMF0gPSAnXDAnOwotCWlmIChzdHJjaHIoZmRleHRyYSwgJ1wnJykpCWZkZXh0cmFbMF0gPSAnXDAnOwotCWlmIChzdHJjaHIoZmRwcm9nLCAnXCcnKSkJZmRwcm9nWzBdID0gJ1wwJzsKLQlpZiAoc3RyY2hyKGZkeHNydiwgJ1wnJykpCWZkeHNydlswXSA9ICdcMCc7Ci0JaWYgKHN0cmNocihmZGN1cHMsICdcJycpKQlmZGN1cHNbMF0gPSAnXDAnOwotCWlmIChzdHJjaHIoZmRlc2QsICdcJycpKQlmZGVzZFswXSA9ICdcMCc7Ci0JaWYgKHN0cmNocihmZG5hcywgJ1wnJykpCWZkbmFzWzBdID0gJ1wwJzsKLQlpZiAoc3RyY2hyKGZkc21iLCAnXCcnKSkJZmRzbWJbMF0gPSAnXDAnOwotCWlmIChzdHJjaHIoZmR0YWcsICdcJycpKQlmZHRhZ1swXSA9ICdcMCc7Ci0JaWYgKHN0cmNocihmZHhkbWNwaWYsICdcJycpKQlmZHhkbWNwaWZbMF0gPSAnXDAnOwotCWlmIChzdHJjaHIoZmR4ZHVtLCAnXCcnKSkJZmR4ZHVtWzBdID0gJ1wwJzsKLQlpZiAoc3RyY2hyKGZkc2VzcywgJ1wnJykpCWZkc2Vzc1swXSA9ICdcMCc7Ci0JaWYgKHN0cmNocihjZG91dCwgJ1wnJykpCWNkb3V0WzBdID0gJ1wwJzsKLQotCXNldF9lbnYoIkZEX0dFT00iLCBmZGdlb20pOwotCXNldF9lbnYoIkZEX09QVFMiLCBmZG9wdHMpOwotCXNldF9lbnYoIkZEX0VYVFJBIiwgZmRleHRyYSk7Ci0Jc2V0X2VudigiRkRfUFJPRyIsIGZkcHJvZyk7Ci0Jc2V0X2VudigiRkRfWFNSViIsIGZkeHNydik7Ci0Jc2V0X2VudigiRkRfQ1VQUyIsIGZkY3Vwcyk7Ci0Jc2V0X2VudigiRkRfRVNEIiwgIGZkZXNkKTsKLQlzZXRfZW52KCJGRF9OQVMiLCAgZmRuYXMpOwotCXNldF9lbnYoIkZEX1NNQiIsICBmZHNtYik7Ci0Jc2V0X2VudigiRkRfVEFHIiwgIGZkdGFnKTsKLQlzZXRfZW52KCJGRF9YRE1DUF9JRiIsICBmZHhkbWNwaWYpOwotCXNldF9lbnYoIkZEX1hEVU1NWV9SVU5fQVNfUk9PVCIsIGZkeGR1bSk7Ci0Jc2V0X2VudigiRkRfU0VTUyIsIGZkc2Vzcyk7Ci0KLQlpZiAodXNzbHBlZXIgfHwgKHVuaXhwdyAmJiBrZWVwX3VuaXhwd191c2VyKSkgewotCQljaGFyICp1dSA9IHVzc2xwZWVyOwotCQlpZiAoIXV1KSB7Ci0JCQl1dSA9IGtlZXBfdW5peHB3X3VzZXI7Ci0JCX0KLQkJaWYgKHN0cmNocih1dSwgJ1wnJykpICB7Ci0JCQl1dSA9ICIiOwotCQl9Ci0JCWNyZWF0ZV9jbWQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHRtcCkrMQotCQkgICAgKyBzdHJsZW4oImVudiBVU0VSPScnICIpCi0JCSAgICArIHN0cmxlbigiRkRfR0VPTT0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX09QVFM9JycgIikKLQkJICAgICsgc3RybGVuKCJGRF9FWFRSQT0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX1BST0c9JycgIikKLQkJICAgICsgc3RybGVuKCJGRF9YU1JWPScnICIpCi0JCSAgICArIHN0cmxlbigiRkRfQ1VQUz0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX0VTRD0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX05BUz0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX1NNQj0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX1RBRz0nJyAiKQotCQkgICAgKyBzdHJsZW4oIkZEX1hETUNQX0lGPScnICIpCi0JCSAgICArIHN0cmxlbigiRkRfWERVTU1ZX1JVTl9BU19ST09UPScnICIpCi0JCSAgICArIHN0cmxlbigiRkRfU0VTUz0nJyAvYmluL3NoICIpCi0JCSAgICArIHN0cmxlbih1dSkgKyAxCi0JCSAgICArIHN0cmxlbihmZGdlb20pICsgMQotCQkgICAgKyBzdHJsZW4oZmRvcHRzKSArIDEKLQkJICAgICsgc3RybGVuKGZkZXh0cmEpICsgMQotCQkgICAgKyBzdHJsZW4oZmRwcm9nKSArIDEKLQkJICAgICsgc3RybGVuKGZkeHNydikgKyAxCi0JCSAgICArIHN0cmxlbihmZGN1cHMpICsgMQotCQkgICAgKyBzdHJsZW4oZmRlc2QpICsgMQotCQkgICAgKyBzdHJsZW4oZmRuYXMpICsgMQotCQkgICAgKyBzdHJsZW4oZmRzbWIpICsgMQotCQkgICAgKyBzdHJsZW4oZmR0YWcpICsgMQotCQkgICAgKyBzdHJsZW4oZmR4ZG1jcGlmKSArIDEKLQkJICAgICsgc3RybGVuKGZkeGR1bSkgKyAxCi0JCSAgICArIHN0cmxlbihmZHNlc3MpICsgMQotCQkgICAgKyBzdHJsZW4oY2RvdXQpICsgMQotCQkgICAgKyBzdHJsZW4ob3B0cykgKyAxKTsKLQkJc3ByaW50ZihjcmVhdGVfY21kLCAiZW52IFVTRVI9JyVzJyBGRF9HRU9NPSclcycgRkRfU0VTUz0nJXMnICIKLQkJICAgICJGRF9PUFRTPSclcycgRkRfRVhUUkE9JyVzJyBGRF9QUk9HPSclcycgRkRfWFNSVj0nJXMnIEZEX0NVUFM9JyVzJyAiCi0JCSAgICAiRkRfRVNEPSclcycgRkRfTkFTPSclcycgRkRfU01CPSclcycgRkRfVEFHPSclcycgRkRfWERNQ1BfSUY9JyVzJyAiCi0JCSAgICAiRkRfWERVTU1ZX1JVTl9BU19ST09UPSclcycgJXMgL2Jpbi9zaCAlcyAlcyIsCi0JCSAgICB1dSwgZmRnZW9tLCBmZHNlc3MsIGZkb3B0cywgZmRleHRyYSwgZmRwcm9nLCBmZHhzcnYsCi0JCSAgICBmZGN1cHMsIGZkZXNkLCBmZG5hcywgZmRzbWIsIGZkdGFnLCBmZHhkbWNwaWYsIGZkeGR1bSwgY2RvdXQsIHRtcCwgb3B0cyk7Ci0JfSBlbHNlIHsKLQkJY3JlYXRlX2NtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4odG1wKQotCQkgICAgKyBzdHJsZW4oIi9iaW4vc2ggIikgKyAxICsgc3RybGVuKG9wdHMpICsgMSk7Ci0JCXNwcmludGYoY3JlYXRlX2NtZCwgIi9iaW4vc2ggJXMgJXMiLCB0bXAsIG9wdHMpOwotCX0KLQlyZXR1cm4gY3JlYXRlX2NtZDsKLX0KLQotc3RhdGljIGNoYXIgKmNlcnRyZXRfZXh0cmFjdCgpIHsKLQljaGFyICpxLCAqcCwgKnN0ciA9IHN0cmR1cChjZXJ0cmV0X3N0cik7Ci0JY2hhciAqdXBlZXIgPSBOVUxMOwotCWludCBvayA9IDA7Ci0KLQlxID0gc3Ryc3RyKHN0ciwgIlN1YmplY3Q6ICIpOwotCWlmICghIHEpIHJldHVybiBOVUxMOwotCi0JcCA9IHN0cnN0cihxLCAiXG4iKTsKLQlpZiAocCkgKnAgPSAnXDAnOwotCi0JcSA9IHN0cnN0cihxLCAiQ049Iik7Ci0JaWYgKCEgcSkgcmV0dXJuIE5VTEw7Ci0KLQlpZiAoISBnZXRlbnYoIlgxMVZOQ19TU0xQRUVSX0NOIikpIHsKLQkJcCA9IHE7Ci0JCXEgPSBzdHJzdHIocSwgIi9lbWFpbEFkZHJlc3M9Iik7Ci0JCWlmICghIHEpIHEgPSBzdHJzdHIocCwgIi9FbWFpbD0iKTsKLQkJaWYgKCEgcSkgcmV0dXJuIE5VTEw7Ci0JfQotCi0JcSA9IHN0cnN0cihxLCAiPSIpOwotCWlmICghIHEpIHJldHVybiBOVUxMOwotCi0JcSsrOwotCXAgPSBzdHJzdHIocSwgIiAiKTsKLQlpZiAocCkgKnAgPSAnXDAnOwotCXAgPSBzdHJzdHIocSwgIkAiKTsKLQlpZiAocCkgKnAgPSAnXDAnOwotCXAgPSBzdHJzdHIocSwgIi8iKTsKLQlpZiAocCkgKnAgPSAnXDAnOwotCi0JdXBlZXIgPSBzdHJkdXAocSk7Ci0KLQlpZiAoc3RyY21wKHVwZWVyLCAiIikpIHsKLQkJcCA9IHVwZWVyOwotCQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQkJY2hhciBjID0gKnA7Ci0JCQlpZiAoIWlzYWxudW0oKGludCkgYykpIHsKLQkJCQkqcCA9ICdcMCc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwKys7Ci0JCX0KLQkJaWYgKHN0cmNtcCh1cGVlciwgIiIpKSB7Ci0JCQlvayA9IDE7Ci0JCX0KLQl9Ci0JaWYgKCEgb2spIHsKLQkJdXBlZXIgPSBOVUxMOwotCX0KLQlyZXR1cm4gdXBlZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX25vZGlzcGxheShjaGFyICoqbmQsIGNoYXIgKip0YWcpIHsKLQlpZiAodW5peHB3ICYmICFnZXRlbnYoIlgxMVZOQ19OT19VTklYUFdfT1BUUyIpICYmIGtlZXBfdW5peHB3X29wdHMgJiYga2VlcF91bml4cHdfb3B0c1swXSAhPSAnXDAnKSB7Ci0JCWNoYXIgKnEsICp0MiwgKnQgPSBrZWVwX3VuaXhwd19vcHRzOwotCQlxID0gc3Ryc3RyKHQsICJuZD0iKTsKLQkJaWYgKCEgcSkgcSA9IHN0cnN0cih0LCAibm9kaXNwbGF5PSIpOwotCQlpZiAocSkgewotCQkJcSA9IHN0cmNocihxLCAnPScpICsgMTsKLQkJCXQgPSBzdHJkdXAocSk7Ci0JCQlxID0gdDsKLQkJCXQyID0gc3RyY2hyKHQsICcsJyk7Ci0JCQlpZiAodDIpICp0MiA9ICdcMCc7Ci0KLQkJCXdoaWxlICgqdCAhPSAnXDAnKSB7Ci0JCQkJaWYgKCp0ID09ICcrJykgewotCQkJCQkqdCA9ICcsJzsKLQkJCQl9Ci0JCQkJdCsrOwotCQkJfQotCQkJaWYgKCFzdHJjaHIocSwgJ1wnJykgJiYgIXN0cnBicmsocSwgIltdKCl7fWAnXCIkJip8PD4iKSkgewotCQkJCWlmICghIHF1aWV0KSByZmJMb2coInNldCBYMTFWTkNfU0tJUF9ESVNQTEFZOiAlc1xuIiwgcSk7Ci0JCQkJKm5kID0gcTsKLQkJCX0KLQkJfQotCi0JCXEgPSBzdHJzdHIoa2VlcF91bml4cHdfb3B0cywgInRhZz0iKTsKLQkJaWYgKGdldGVudigiRkRfVEFHIikpIHsKLQkJCSp0YWcgPSBzdHJkdXAoZ2V0ZW52KCJGRF9UQUciKSk7Ci0JCX0gZWxzZSBpZiAocSkgewotCQkJcSA9IHN0cmNocihxLCAnPScpICsgMTsKLQkJCXQgPSBzdHJkdXAocSk7Ci0JCQlxID0gdDsKLQkJCXQyID0gc3RyY2hyKHQsICcsJyk7Ci0JCQlpZiAodDIpICp0MiA9ICdcMCc7Ci0KLQkJCWlmIChzdHJsZW4ocSkgPCAxMjApIHsKLQkJCQlpbnQgb2sgPSAxOwotCQkJCXdoaWxlICgqdCAhPSAnXDAnKSB7Ci0JCQkJCWNoYXIgYyA9ICp0OwotCQkJCQlpZiAoKnQgPT0gJ18nIHx8ICp0ID09ICctJykgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgaWYgKCFpc2FsbnVtKChpbnQpIGMpKSB7Ci0JCQkJCQlvayA9IDA7Ci0JCQkJCQlyZmJMb2coImJhZCB0YWcgY2hhcjogJyVjJyBpbiAnJXMnXG4iLCBjLCBxKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXQrKzsKLQkJCQl9Ci0JCQkJaWYgKG9rKSB7Ci0JCQkJCWlmICghIHF1aWV0KSByZmJMb2coInNldCBGRF9UQUc6ICVzXG4iLCBxKTsKLQkJCQkJKnRhZyA9IHE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmICh1bml4cHdfc3lzdGVtX2dyZWV0ZXJfYWN0aXZlID09IDIpIHsKLQkJaWYgKCFrZWVwX3VuaXhwd191c2VyKSB7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCSpuZCA9IHN0cmR1cCgiYWxsIik7Ci0JfQotfQotCi1zdGF0aWMgY2hhciAqZ2V0X3Vzc2xwZWVyKCkgewotCWNoYXIgKnUgPSBOVUxMLCAqdXBlZXIgPSBOVUxMOwotCi0JaWYgKGNlcnRyZXRfc3RyKSB7Ci0JCXVwZWVyID0gY2VydHJldF9leHRyYWN0KCk7Ci0JfQotCWlmICghdXBlZXIpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJmYkxvZygic3NscGVlciB1bml4IHVzZXJuYW1lIGV4dHJhY3RlZCBmcm9tIHg1MDkgY2VydDogJXNcbiIsIHVwZWVyKTsKLQotCXUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHVwZWVyKzIpKTsKLQl1WzBdID0gJ1wwJzsKLQlpZiAoIXN0cmNtcCh1c2Vyc19saXN0LCAic3NscGVlcj0iKSkgewotCQlzcHJpbnRmKHUsICIrJXMiLCB1cGVlcik7Ci0JfSBlbHNlIHsKLQkJY2hhciAqcCwgKnN0ciA9IHN0cmR1cCh1c2Vyc19saXN0KTsKLQkJcCA9IHN0cnRvayhzdHIgKyBzdHJsZW4oInNzbHBlZXI9IiksICIsIik7Ci0JCXdoaWxlIChwKSB7Ci0JCQlpZiAoIXN0cmNtcChwLCB1cGVlcikpIHsKLQkJCQlzcHJpbnRmKHUsICIrJXMiLCB1cGVlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLQlpZiAodVswXSA9PSAnXDAnKSB7Ci0JCXJmYkxvZygic3NscGVlciBjYW5ub3QgZGV0ZXJtaW5lIHVzZXI6ICVzXG4iLCB1cGVlcik7Ci0JCWZyZWUodSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmcmVlKHUpOwotCXJldHVybiB1cGVlcjsKLX0KLQotc3RhdGljIHZvaWQgZG9fdHJ5X3N3aXRjaChjaGFyICp1c3NscGVlciwgY2hhciAqdXNlcnNfbGlzdF9zYXZlKSB7Ci0JaWYgKHVuaXhwd19zeXN0ZW1fZ3JlZXRlcl9hY3RpdmUgPT0gMikgewotCQlyZmJMb2coInVuaXhwd19zeXN0ZW1fZ3JlZXRlcjogbm90IHRyeWluZyBzd2l0Y2ggdG8gdXNlciAnJXMnXG4iLCB1c3NscGVlciA/IHVzc2xwZWVyIDogIiIpOwotCQlyZXR1cm47Ci0JfQotCWlmICh1c3NscGVlcikgewotCQljaGFyICp1ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbih1c3NscGVlcisyKSk7Ci0JCXNwcmludGYodSwgIislcyIsIHVzc2xwZWVyKTsKLQkJaWYgKHN3aXRjaF91c2VyKHUsIDApKSB7Ci0JCQlyZmJMb2coInNzbHBlZXIgc3dpdGNoZWQgdG8gdXNlcjogJXNcbiIsIHVzc2xwZWVyKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkxvZygic3NscGVlciBmYWlsZWQgdG8gc3dpdGNoIHRvIHVzZXI6ICVzXG4iLCB1c3NscGVlcik7Ci0JCX0KLQkJZnJlZSh1KTsKLQkJCi0JfSBlbHNlIGlmICh1c2Vyc19saXN0X3NhdmUgJiYga2VlcF91bml4cHdfdXNlcikgewotCQljaGFyICp1c2VyID0ga2VlcF91bml4cHdfdXNlcjsKLQkJY2hhciAqdSA9IChjaGFyICopbWFsbG9jKHN0cmxlbih1c2VyKSsxKTsgCi0KLQkJdXNlcnNfbGlzdCA9IHVzZXJzX2xpc3Rfc2F2ZTsKLQotCQl1WzBdID0gJ1wwJzsKLQkJaWYgKCFzdHJjbXAodXNlcnNfbGlzdCwgInVuaXhwdz0iKSkgewotCQkJc3ByaW50Zih1LCAiKyVzIiwgdXNlcik7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyICpwLCAqc3RyID0gc3RyZHVwKHVzZXJzX2xpc3QpOwotCQkJcCA9IHN0cnRvayhzdHIgKyBzdHJsZW4oInVuaXhwdz0iKSwgIiwiKTsKLQkJCXdoaWxlIChwKSB7Ci0JCQkJaWYgKCFzdHJjbXAocCwgdXNlcikpIHsKLQkJCQkJc3ByaW50Zih1LCAiKyVzIiwgdXNlcik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCQl9Ci0JCQlmcmVlKHN0cik7Ci0JCX0KLQkJCi0JCWlmICh1WzBdID09ICdcMCcpIHsKLQkJCXJmYkxvZygidW5peHB3X2FjY2VwdCBza2lwcGluZyBzd2l0Y2ggdG8gdXNlcjogJXMgKGRyYylcbiIsIHVzZXIpOwotCQl9IGVsc2UgaWYgKHN3aXRjaF91c2VyKHUsIDApKSB7Ci0JCQlyZmJMb2coInVuaXhwd19hY2NlcHQgc3dpdGNoZWQgdG8gdXNlcjogJXMgKGRyYylcbiIsIHVzZXIpOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCJ1bml4cHdfYWNjZXB0IGZhaWxlZCB0byBzd2l0Y2ggdG8gdXNlcjogJXMgKGRyYylcbiIsIHVzZXIpOwotCQl9Ci0JCWZyZWUodSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBwYXRoX2xvb2t1cChjaGFyICpwcm9nKSB7Ci0JLyogc2VlIGNyZWF0ZV9kaXNwbGF5IHNjcmlwdCAqLwotCWNoYXIgKmNyZWF0ZV9kaXNwbGF5X2V4dHJhID0gIi91c3IvWDExUjYvYmluOi91c3IvYmluL1gxMTovdXNyL29wZW53aW4vYmluOi91c3IvZHQvYmluOi9vcHQva2RlNC9iaW46L29wdC9rZGUzL2Jpbjovb3B0L2dub21lL2JpbjovdXNyL2JpbjovYmluOi91c3Ivc2Z3L2JpbjovdXNyL2xvY2FsL2JpbiI7Ci0JY2hhciAqcGF0aCwgKnRyeSwgKnA7Ci0JaW50IGZvdW5kID0gMCwgbGVuID0gc3RybGVuKGNyZWF0ZV9kaXNwbGF5X2V4dHJhKTsKLQotCWlmIChnZXRlbnYoIlBBVEgiKSkgewotCQlsZW4gKz0gc3RybGVuKGdldGVudigiUEFUSCIpKSArIDE7Ci0JCXBhdGggPSAoY2hhciAqKSBtYWxsb2MoKGxlbisxKSAqIHNpemVvZihjaGFyKSk7Ci0JCXNwcmludGYocGF0aCwgIiVzOiVzIiwgZ2V0ZW52KCJQQVRIIiksIGNyZWF0ZV9kaXNwbGF5X2V4dHJhKTsKLQl9IGVsc2UgewotCQlwYXRoID0gKGNoYXIgKikgbWFsbG9jKChsZW4rMSkgKiBzaXplb2YoY2hhcikpOwotCQlzcHJpbnRmKHBhdGgsICIlcyIsIGNyZWF0ZV9kaXNwbGF5X2V4dHJhKTsKLQl9Ci0JdHJ5ID0gKGNoYXIgKikgbWFsbG9jKChsZW4rMitzdHJsZW4ocHJvZykpICogc2l6ZW9mKGNoYXIpKTsKLQotCXAgPSBzdHJ0b2socGF0aCwgIjoiKTsKLQl3aGlsZSAocCkgewotCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0JCXNwcmludGYodHJ5LCAiJXMvJXMiLCBwLCBwcm9nKTsKLQkJaWYgKHN0YXQodHJ5LCAmc2J1ZikgPT0gMCkgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IHN0cnRvayhOVUxMLCAiOiIpOwotCX0KLQotCWZyZWUocGF0aCk7Ci0JZnJlZSh0cnkpOwotCi0JaWYgKCFmb3VuZCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiVGhlIHByb2dyYW0gXCIlc1wiIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBQQVRIIGFuZCBzdGFuZGFyZCBsb2NhdGlvbnMuXG4iLCBwcm9nKTsKLQkJZnByaW50ZihzdGRlcnIsICJZb3UgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGEgcGFja2FnZSB0aGF0IHByb3ZpZGVzIHRoZSBcIiVzXCIgcHJvZ3JhbS5cbiIsIHByb2cpOwotCQlmcHJpbnRmKHN0ZGVyciwgIldpdGhvdXQgaXQgRklORENSRUFURURJU1BMQVkgbW9kZSBtYXkgbm90IGJlIGFibGUgdG8gY3JlYXRlIGFuIFggZGlzcGxheS5cbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotfQotCi1zdGF0aWMgaW50IGRvX3J1bl9jbWQoY2hhciAqY21kLCBjaGFyICpjcmVhdGVfY21kLCBjaGFyICp1c2Vyc19saXN0X3NhdmUsIGludCBjcmVhdGVkX2Rpc3AsIGludCBkYikgewotCWNoYXIgdG1wW10gPSAiL3RtcC94MTF2bmMtZmluZF9kaXNwbGF5LlhYWFhYWCI7Ci0JY2hhciBsaW5lMVsxMDI0XSwgbGluZTJbMTYzODRdOwotCWNoYXIgKnEsICp1c3NscGVlciA9IE5VTEw7Ci0JaW50IG4sIG5vZGlzcCA9IDAsIHNhd194ZG1jcCA9IDA7Ci0JaW50IHRtcF9mZCA9IC0xOwotCWludCBpbnRlcm5hbF9jbWQgPSAwOwotCWludCB0cmllZF9zd2l0Y2ggPSAwOwotCi0JbWVtc2V0KGxpbmUxLCAwLCBzaXplb2YobGluZTEpKTsKLQltZW1zZXQobGluZTIsIDAsIHNpemVvZihsaW5lMikpOwotCi0JaWYgKHVzZXJzX2xpc3QgJiYgc3Ryc3RyKHVzZXJzX2xpc3QsICJzc2xwZWVyPSIpID09IHVzZXJzX2xpc3QpIHsKLQkJdXNzbHBlZXIgPSBnZXRfdXNzbHBlZXIoKTsKLQkJaWYgKCEgdXNzbHBlZXIpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChnZXRlbnYoIkRFQlVHX1JVTl9DTUQiKSkgZGIgPSAxOwotCi0JLyogb25seSBzZXRzIGVudmlyb25tZW50IHZhcmlhYmxlczogKi8KLQlydW5fdXNlcl9jb21tYW5kKCIiLCBsYXRlc3RfY2xpZW50LCAiZW52IiwgTlVMTCwgMCwgTlVMTCk7Ci0KLQlpZiAocHJvZ3JhbV9uYW1lKSB7Ci0JCXNldF9lbnYoIlgxMVZOQ19QUk9HIiwgcHJvZ3JhbV9uYW1lKTsKLQl9IGVsc2UgewotCQlzZXRfZW52KCJYMTFWTkNfUFJPRyIsICJ4MTF2bmMiKTsKLQl9Ci0KLQlpZiAoIXN0cmNtcChjbWQsICJGSU5ERElTUExBWSIpIHx8Ci0JICAgIHN0cnN0cihjbWQsICJGSU5EQ1JFQVRFRElTUExBWSIpID09IGNtZCkgewotCQljaGFyICpuZCA9ICIiOwotCQljaGFyICp0YWcgPSAiIjsKLQkJY2hhciBmZG91dFsxMjhdOwotCi0JCWludGVybmFsX2NtZCA9IDE7Ci0KLQkJdG1wX2ZkID0gbWtzdGVtcCh0bXApOwotCi0JCWlmICh0bXBfZmQgPCAwKSB7Ci0JCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogb3BlbiBmYWlsZWQ6ICVzXG4iLCB0bXApOwotCQkJcmZiTG9nUGVycm9yKCJta3N0ZW1wIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWNobW9kKHRtcCwgMDY0NCk7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFMiKSkgewotCQkJY2hhciAqcyA9ICIjIS9iaW4vc2hcbmVjaG8gX0ZBSUxfXG5leGl0IDFcbiI7Ci0JCQl3cml0ZSh0bXBfZmQsIHMsIHN0cmxlbihzKSk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZSh0bXBfZmQsIGZpbmRfZGlzcGxheSwgc3RybGVuKGZpbmRfZGlzcGxheSkpOwotCQl9Ci0JCWNsb3NlKHRtcF9mZCk7Ci0JCW5vZGlzcCA9IDE7Ci0KLQkJaWYgKHN0cnN0cihjbWQsICJGSU5EQ1JFQVRFRElTUExBWSIpID09IGNtZCkgewotCQkJY3JlYXRlX2NtZCA9IGJ1aWxkX2NyZWF0ZV9jbWQoY21kLCAmc2F3X3hkbWNwLCB1c3NscGVlciwgdG1wKTsKLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjcmVhdGVfY21kOiAlc1xuIiwgY3JlYXRlX2NtZCk7Ci0JCX0KLQkJaWYgKGdldGVudigiWDExVk5DX1NLSVBfRElTUExBWSIpKSB7Ci0JCQluZCA9IHN0cmR1cChnZXRlbnYoIlgxMVZOQ19TS0lQX0RJU1BMQVkiKSk7Ci0JCX0KLQkJY2hlY2tfbm9kaXNwbGF5KCZuZCwgJnRhZyk7Ci0KLQkJZmRvdXRbMF0gPSAnXDAnOwotCQlpZiAoZ2V0ZW52KCJGSU5EX0RJU1BMQVlfT1VUUFVUIikpIHsKLQkJCXNucHJpbnRmKGZkb3V0LCAxMjAsICIgRklORF9ESVNQTEFZX09VVFBVVD0nJXMnICIsIGdldGVudigiRklORF9ESVNQTEFZX09VVFBVVCIpKTsKLQkJfQotCi0JCWNtZCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oImVudiBYMTFWTkNfU0tJUF9ESVNQTEFZPScnICIpCi0JCSAgICArIHN0cmxlbihuZCkgKyBzdHJsZW4oIiBGRF9UQUc9JycgIikgKyBzdHJsZW4odGFnKSArIHN0cmxlbih0bXApICsgc3RybGVuKCIvYmluL3NoICIpICsgc3RybGVuKGZkb3V0KSArIDEpOwotCi0JCWlmIChzdHJjbXAodGFnLCAiIikpIHsKLQkJCXNwcmludGYoY21kLCAiZW52IFgxMVZOQ19TS0lQX0RJU1BMQVk9JyVzJyBGRF9UQUc9JyVzJyAlcyAvYmluL3NoICVzIiwgbmQsIHRhZywgZmRvdXQsIHRtcCk7Ci0JCX0gZWxzZSB7Ci0JCQlzcHJpbnRmKGNtZCwgImVudiBYMTFWTkNfU0tJUF9ESVNQTEFZPSclcycgJXMgL2Jpbi9zaCAlcyIsIG5kLCBmZG91dCwgdG1wKTsKLQkJfQotCX0KLQotCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBydW5uaW5nOiAlc1xuIiwgY21kKTsKLQotCWlmIChjcmVhdGVfY21kICE9IE5VTEwpIHsKLQkJaWYgKHN0cnN0cihjcmVhdGVfY21kLCAiWHZmYiIpKSB7Ci0JCQlwYXRoX2xvb2t1cCgiWHZmYiIpOwotCQl9Ci0JCWlmIChzdHJzdHIoY3JlYXRlX2NtZCwgIlh2bmMiKSkgewotCQkJcGF0aF9sb29rdXAoIlh2bmMiKTsKLQkJfQotCQlpZiAoc3Ryc3RyKGNyZWF0ZV9jbWQsICJYZHVtbXkiKSkgewotCQkJcGF0aF9sb29rdXAoIlhkdW1teSIpOwotCQl9Ci0JfQotCi0JaWYgKHVuaXhwdyAmJiAhdW5peHB3X25pcykgewotCQlpbnQgcmVzID0gMCwgaywgaiwgaTsKLQkJY2hhciBsaW5lWzE4MDAwXTsKLQotCQltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKLQotCQlpZiAodW5peHB3X3N5c3RlbV9ncmVldGVyX2FjdGl2ZSA9PSAyKSB7Ci0JCQlyZmJMb2coInVuaXhwd19zeXN0ZW1fZ3JlZXRlcjogZm9yY2luZyBmaW5kIGRpc3BsYXkgZmFpbHVyZS5cbiIpOwotCQkJcmVzID0gMDsKLQkJfSBlbHNlIGlmIChrZWVwX3VuaXhwd191c2VyICYmIGtlZXBfdW5peHB3X3Bhc3MpIHsKLQkJCW4gPSBzaXplb2YobGluZSk7Ci0JCQlpZiAodW5peHB3X2NtZCAhPSBOVUxMKSB7Ci0JCQkJcmVzID0gdW5peHB3X2NtZF9ydW4oa2VlcF91bml4cHdfdXNlciwKLQkJCQkgICAga2VlcF91bml4cHdfcGFzcywgY21kLCBsaW5lLCAmbik7Ci0JCQl9IGVsc2UgewotCQkJCXJlcyA9IHN1X3ZlcmlmeShrZWVwX3VuaXhwd191c2VyLAotCQkJCSAgICBrZWVwX3VuaXhwd19wYXNzLCBjbWQsIGxpbmUsICZuLCBub2Rpc3ApOwotCQkJfQotCQl9Ci0KLWlmIChkYikge2ZwcmludGYoc3RkZXJyLCAibGluZTogIik7IHdyaXRlKDIsIGxpbmUsIG4pOyB3cml0ZSgyLCAiXG4iLCAxKTsgZnByaW50ZihzdGRlcnIsICJyZXM9JWQgbj0lZFxuIiwgcmVzLCBuKTt9Ci0JCWlmICghIHJlcykgewotCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGZpbmQgZGlzcGxheSBjbWQgZmFpbGVkLlxuIik7Ci0JCX0KLQotCQlpZiAoISByZXMgJiYgY3JlYXRlX2NtZCkgewotCQkJRklMRSAqbXQgPSBmb3Blbih0bXAsICJ3Iik7Ci0JCQlpZiAoISBtdCkgewotCQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBvcGVuIGZhaWxlZDogJXNcbiIsIHRtcCk7Ci0JCQkJcmZiTG9nUGVycm9yKCJmb3BlbiIpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlmcHJpbnRmKG10LCAiJXMiLCBjcmVhdGVfZGlzcGxheSk7Ci0JCQlmY2xvc2UobXQpOwotCi0JCQlmaW5kY3JlYXRlZGlzcGxheSA9IDE7Ci0KLQkJCWlmICh1bml4cHdfY21kICE9IE5VTEwpIHsKLQkJCQkvKiBsZXQgdGhlIGV4dGVybmFsIHVuaXhwdyBjb21tYW5kIGRvIGl0OiAqLwotCQkJCW4gPSBzaXplb2YobGluZSk7Ci0JCQkJY2xvc2VfZXhlY19mZHMoKTsKLQkJCQlyZXMgPSB1bml4cHdfY21kX3J1bihrZWVwX3VuaXhwd191c2VyLAotCQkJCSAgICBrZWVwX3VuaXhwd19wYXNzLCBjcmVhdGVfY21kLCBsaW5lLCAmbik7Ci0JCQl9IGVsc2UgaWYgKGdldHVpZCgpICE9IDAgJiYgdW5peHB3X3N5c3RlbV9ncmVldGVyX2FjdGl2ZSAhPSAyKSB7Ci0JCQkJLyogaWYgbm90IHJvb3QsIHJ1biBhcyB0aGUgb3RoZXIgdXNlci4uLiAqLwotCQkJCW4gPSBzaXplb2YobGluZSk7Ci0JCQkJY2xvc2VfZXhlY19mZHMoKTsKLQkJCQlyZXMgPSBzdV92ZXJpZnkoa2VlcF91bml4cHdfdXNlciwKLQkJCQkgICAga2VlcF91bml4cHdfcGFzcywgY3JlYXRlX2NtZCwgbGluZSwgJm4sIG5vZGlzcCk7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiYy1yZXM9JWQgbj0lZCBsaW5lOiAnJXMnXG4iLCByZXMsIG4sIGxpbmUpOwotCi0JCQl9IGVsc2UgewotCQkJCUZJTEUgKnA7Ci0JCQkJY2xvc2VfZXhlY19mZHMoKTsKLQkJCQlpZiAodW5peHB3X3N5c3RlbV9ncmVldGVyX2FjdGl2ZSA9PSAyKSB7Ci0JCQkJCXJmYkxvZygidW5peHB3X3N5c3RlbV9ncmVldGVyOiBub3QgdHJ5aW5nIHN1X3ZlcmlmeSgpIHRvIHJ1blxuIik7Ci0JCQkJCXJmYkxvZygidW5peHB3X3N5c3RlbV9ncmVldGVyOiBjcmVhdGUgZGlzcGxheSBjb21tYW5kLlxuIik7Ci0JCQkJfQotCQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBydW5uaW5nOiAlc1xuIiwgY3JlYXRlX2NtZCk7Ci0JCQkJcCA9IHBvcGVuKGNyZWF0ZV9jbWQsICJyIik7Ci0JCQkJaWYgKCEgcCkgewotCQkJCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogcG9wZW4gZmFpbGVkOiAlc1xuIiwgY3JlYXRlX2NtZCk7Ci0JCQkJCXJlcyA9IDA7Ci0JCQkJfSBlbHNlIGlmIChmZ2V0cyhsaW5lMSwgMTAyNCwgcCkgPT0gTlVMTCkgewotCQkJCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogcmVhZCBmYWlsZWQ6ICVzXG4iLCBjcmVhdGVfY21kKTsKLQkJCQkJcmVzID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQluID0gZnJlYWQobGluZTIsIDEsIDE2Mzg0LCBwKTsKLQkJCQkJaWYgKHBjbG9zZShwKSAhPSAwKSB7Ci0JCQkJCQlyZXMgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3RybmNweShsaW5lLCBsaW5lMSwgMTAwKTsKLQkJCQkJCW1lbWNweShsaW5lICsgc3RybGVuKGxpbmUxKSwgbGluZTIsIG4pOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImxpbmUxOiAnJXMnXG4iLCBsaW5lMSk7Ci0JCQkJCQluICs9IHN0cmxlbihsaW5lMSk7Ci0JCQkJCQljcmVhdGVkX2Rpc3AgPSAxOwotCQkJCQkJcmVzID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXMgJiYgc2F3X3hkbWNwICYmIHVuaXhwd19zeXN0ZW1fZ3JlZXRlcl9hY3RpdmUgIT0gMikgewotCQkJCXhkbWNwX2luc2VydCA9IHN0cmR1cChrZWVwX3VuaXhwd191c2VyKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0bXBfZmQgPj0gMCkgewotCQkJdW5saW5rKHRtcCk7Ci0JCX0KLQotCQlpZiAoISByZXMpIHsKLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBjbWQgZmFpbGVkOiAlc1xuIiwgY21kKTsKLQkJCXVuaXhwd19tc2coIk5vIERJU1BMQVkgZm91bmQuIiwgMyk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0KLQkJLyoKLQkJICogd2UgbmVlZCB0byBodW50IGZvciBESVNQTEFZPSBzaW5jZSB0aGVyZSBtYXkgYmUKLQkJICogYSBsb2dpbiBiYW5uZXIgb3Igc29tZXRoaW5nIGF0IHRoZSBiZWdpbm5pbmcuCi0JCSAqLwotCQlxID0gc3Ryc3RyKGxpbmUsICJESVNQTEFZPSIpOwotCQlpZiAoISBxKSB7Ci0JCQlxID0gbGluZTsKLQkJfQotCQluIC09IChxIC0gbGluZSk7Ci0KLQkJZm9yIChrID0gMDsgayA8IDEwMjQ7IGsrKykgewotCQkJbGluZTFba10gPSBxW2tdOwotCQkJaWYgKHFba10gPT0gJ1xuJykgewotCQkJCWsrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluIC09IGs7Ci0JCWkgPSAwOwotCQlmb3IgKGogPSAwOyBqIDwgMTYzODQ7IGorKykgewotCQkJaWYgKGogPCAxNjM4NCAtIDEpIHsKLQkJCQkvKiB4YXV0aCBkYXRhLCBhc3N1bWUgcHR5IGFkZGVkIENSICovCi0JCQkJaWYgKHFbaytqXSA9PSAnXHInICYmIHFbaytqKzFdID09ICdcbicpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlsaW5lMltpXSA9IHFbaytqXTsKLQkJCWkrKzsKLQkJfQotaWYgKGRiKSB3cml0ZSgyLCBsaW5lLCAxMDApOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0KLQl9IGVsc2UgewotCQlGSUxFICpwOwotCQlpbnQgcmM7Ci0JCWNsb3NlX2V4ZWNfZmRzKCk7Ci0KLQkJaWYgKHVzc2xwZWVyKSB7Ci0JCQljaGFyICpjOwotCQkJaWYgKGdldHVpZCgpID09IDApIHsKLQkJCQljID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigic3UgLSAnJyAtYyBcIiIpCi0JCQkJICAgICsgc3RybGVuKHVzc2xwZWVyKSArIHN0cmxlbihjbWQpICsgMSArIDEpOwotCQkJCXNwcmludGYoYywgInN1IC0gJyVzJyAtYyBcIiVzXCIiLCB1c3NscGVlciwgY21kKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYyA9IHN0cmR1cChjbWQpOwotCQkJfQotCQkJcCA9IHBvcGVuKGMsICJyIik7Ci0JCQlmcmVlKGMpOwotCQkJCi0JCX0gZWxzZSBpZiAodW5peHB3X25pcyAmJiBrZWVwX3VuaXhwd191c2VyKSB7Ci0JCQljaGFyICpjOwotCQkJaWYgKGdldHVpZCgpID09IDApIHsKLQkJCQljID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigic3UgLSAnJyAtYyBcIiIpCi0JCQkJICAgICsgc3RybGVuKGtlZXBfdW5peHB3X3VzZXIpICsgc3RybGVuKGNtZCkgKyAxICsgMSk7Ci0JCQkJc3ByaW50ZihjLCAic3UgLSAnJXMnIC1jIFwiJXNcIiIsIGtlZXBfdW5peHB3X3VzZXIsIGNtZCk7Ci0JCQl9IGVsc2UgewotCQkJCWMgPSBzdHJkdXAoY21kKTsKLQkJCX0KLQkJCXAgPSBwb3BlbihjLCAiciIpOwotCQkJZnJlZShjKTsKLQkJCQotCQl9IGVsc2UgewotCQkJcCA9IHBvcGVuKGNtZCwgInIiKTsKLQkJfQotCi0JCWlmICghIHApIHsKLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBjbWQgZmFpbGVkOiAlc1xuIiwgY21kKTsKLQkJCXJmYkxvZ1BlcnJvcigicG9wZW4iKTsKLQkJCWlmICh0bXBfZmQgPj0gMCkgewotCQkJCXVubGluayh0bXApOwotCQkJfQotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfQotCQlpZiAoZmdldHMobGluZTEsIDEwMjQsIHApID09IE5VTEwpIHsKLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiByZWFkIGZhaWxlZDogJXNcbiIsIGNtZCk7Ci0JCQlyZmJMb2dQZXJyb3IoImZnZXRzIik7Ci0JCQlpZiAodG1wX2ZkID49IDApIHsKLQkJCQl1bmxpbmsodG1wKTsKLQkJCX0KLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJbiA9IGZyZWFkKGxpbmUyLCAxLCAxNjM4NCwgcCk7Ci0JCXJjID0gcGNsb3NlKHApOwotCi0JCWlmIChyYyAhPSAwKSB7Ci0JCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogZmluZCBkaXNwbGF5IGNtZCBmYWlsZWQuXG4iKTsKLQkJfQotCi0JCWlmIChjcmVhdGVfY21kICYmIHJjICE9IDApIHsKLQkJCUZJTEUgKm10ID0gZm9wZW4odG1wLCAidyIpOwotCQkJaWYgKCEgbXQpIHsKLQkJCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudDogb3BlbiBmYWlsZWQ6ICVzXG4iLCB0bXApOwotCQkJCXJmYkxvZ1BlcnJvcigiZm9wZW4iKTsKLQkJCQlpZiAodG1wX2ZkID49IDApIHsKLQkJCQkJdW5saW5rKHRtcCk7Ci0JCQkJfQotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlmcHJpbnRmKG10LCAiJXMiLCBjcmVhdGVfZGlzcGxheSk7Ci0JCQlmY2xvc2UobXQpOwotCi0JCQlmaW5kY3JlYXRlZGlzcGxheSA9IDE7Ci0KLQkJCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiBGSU5EQ1JFQVRFRElTUExBWSBjbWQ6ICVzXG4iLCBjcmVhdGVfY21kKTsKLQotCQkJcCA9IHBvcGVuKGNyZWF0ZV9jbWQsICJyIik7Ci0JCQlpZiAoISBwKSB7Ci0JCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGNtZCBmYWlsZWQ6ICVzXG4iLCBjcmVhdGVfY21kKTsKLQkJCQlyZmJMb2dQZXJyb3IoInBvcGVuIik7Ci0JCQkJaWYgKHRtcF9mZCA+PSAwKSB7Ci0JCQkJCXVubGluayh0bXApOwotCQkJCX0KLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJaWYgKGZnZXRzKGxpbmUxLCAxMDI0LCBwKSA9PSBOVUxMKSB7Ci0JCQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IHJlYWQgZmFpbGVkOiAlc1xuIiwgY3JlYXRlX2NtZCk7Ci0JCQkJcmZiTG9nUGVycm9yKCJmZ2V0cyIpOwotCQkJCWlmICh0bXBfZmQgPj0gMCkgewotCQkJCQl1bmxpbmsodG1wKTsKLQkJCQl9Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCW4gPSBmcmVhZChsaW5lMiwgMSwgMTYzODQsIHApOwotCQkJcGNsb3NlKHApOwotCQl9Ci0JCWlmICh0bXBfZmQgPj0gMCkgewotCQkJdW5saW5rKHRtcCk7Ci0JCX0KLQl9Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJsaW5lMT0lc1xuIiwgbGluZTEpOwotCi0JaWYgKHN0cnN0cihsaW5lMSwgIkRJU1BMQVk9IikgIT0gbGluZTEpIHsKLQkJcmZiTG9nKCJ3YWl0X2Zvcl9jbGllbnQ6IGJhZCByZXBseSAnJXMnXG4iLCBsaW5lMSk7Ci0JCWlmICh1bml4cHcpIHsKLQkJCXVuaXhwd19tc2coIk5vIERJU1BMQVkgZm91bmQuIiwgMyk7Ci0JCX0KLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQotCWlmIChzdHJzdHIobGluZTEsICIsVlQ9IikpIHsKLQkJaW50IHZ0OwotCQljaGFyICp0ID0gc3Ryc3RyKGxpbmUxLCAiLFZUPSIpOwotCQl2dCA9IGF0b2kodCArIHN0cmxlbigiLFZUPSIpKTsKLQkJKnQgPSAnXDAnOwotCQlpZiAoNyA8PSB2dCAmJiB2dCA8PSAxNSkgewotCQkJZG9fY2h2dCh2dCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHN0cnN0cihsaW5lMSwgIixYUElEPSIpKSB7Ci0JCWludCBpLCBwdnQsIHZ0ID0gLTE7Ci0JCWNoYXIgKnQgPSBzdHJzdHIobGluZTEsICIsWFBJRD0iKTsKLQkJcHZ0ID0gYXRvaSh0ICsgc3RybGVuKCIsWFBJRD0iKSk7Ci0JCSp0ID0gJ1wwJzsKLQkJaWYgKHB2dCA+IDApIHsKLQkJCWZvciAoaT0zOyBpIDw9IDEwOyBpKyspIHsKLQkJCQlpbnQgazsKLQkJCQljaGFyIHByb2NbMTAwXTsKLQkJCQljaGFyIGJ1ZlsxMDBdOwotCQkJCXNwcmludGYocHJvYywgIi9wcm9jLyVkL2ZkLyVkIiwgcHZ0LCBpKTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIlZCAtLSAlc1xuIiwgaSwgcHJvYyk7Ci0JCQkJZm9yIChrPTA7IGsgPCAxMDA7IGsrKykgewotCQkJCQlidWZba10gPSAnXDAnOwotCQkJCX0KLQkKLQkJCQlpZiAocmVhZGxpbmsocHJvYywgYnVmLCAxMDApICE9IC0xKSB7Ci0JCQkJCWJ1ZlsxMDAtMV0gPSAnXDAnOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiVkIC0tICVzIC0tICVzXG4iLCBpLCBwcm9jLCBidWYpOwotCQkJCQlpZiAoc3Ryc3RyKGJ1ZiwgIi9kZXYvdHR5IikgPT0gYnVmKSB7Ci0JCQkJCQl2dCA9IGF0b2koYnVmICsgc3RybGVuKCIvZGV2L3R0eSIpKTsKLQkJCQkJCWlmICh2dCA+IDApIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoNyA8PSB2dCAmJiB2dCA8PSAxMikgewotCQkJZG9fY2h2dCh2dCk7Ci0JCX0KLQl9Ci0KLQl1c2VfZHB5ID0gc3RyZHVwKGxpbmUxICsgc3RybGVuKCJESVNQTEFZPSIpKTsKLQlxID0gdXNlX2RweTsKLQl3aGlsZSAoKnEgIT0gJ1wwJykgewotCQlpZiAoKnEgPT0gJ1xuJyB8fCAqcSA9PSAnXHInKSAqcSA9ICdcMCc7Ci0JCXErKzsKLQl9Ci0JaWYgKGxpbmUyWzBdICE9ICdcMCcpIHsKLQkJaWYgKHN0cnN0cihsaW5lMiwgIlhBVVRIT1JJVFk9IikgPT0gbGluZTIpIHsKLQkJCXEgPSBsaW5lMjsKLQkJCXdoaWxlICgqcSAhPSAnXDAnKSB7Ci0JCQkJaWYgKCpxID09ICdcbicgfHwgKnEgPT0gJ1xyJykgKnEgPSAnXDAnOwotCQkJCXErKzsKLQkJCX0KLQkJCWlmIChhdXRoX2ZpbGUpIHsKLQkJCQlmcmVlKGF1dGhfZmlsZSk7Ci0JCQl9Ci0JCQlhdXRoX2ZpbGUgPSBzdHJkdXAobGluZTIgKyBzdHJsZW4oIlhBVVRIT1JJVFk9IikpOwotCi0JCX0gZWxzZSB7Ci0JCQl4YXV0aF9yYXdfZGF0YSA9IChjaGFyICopbWFsbG9jKG4pOwotCQkJeGF1dGhfcmF3X2xlbiA9IG47Ci0JCQltZW1jcHkoeGF1dGhfcmF3X2RhdGEsIGxpbmUyLCBuKTsKLWlmIChkYikge2ZwcmludGYoc3RkZXJyLCAieGF1dGhfcmF3X2xlbjogJWRcbiIsIG4pOwotd3JpdGUoMiwgeGF1dGhfcmF3X2RhdGEsIG4pOwotZnByaW50ZihzdGRlcnIsICJcbiIpO30KLQkJfQotCX0KLQotCWlmICghdHJpZWRfc3dpdGNoKSB7Ci0JCWRvX3RyeV9zd2l0Y2godXNzbHBlZXIsIHVzZXJzX2xpc3Rfc2F2ZSk7Ci0JCXRyaWVkX3N3aXRjaCA9IDE7Ci0JfQotCi0JaWYgKHVuaXhwdykgewotCQkvKiBTb21lIGNsZWFudXAgYW5kIG1lc3NhZ2luZyBmb3IgLXVuaXhwdyBjYXNlOiAqLwotCQljaGFyIHN0clszMl07Ci0KLQkJaWYgKGtlZXBfdW5peHB3X3VzZXIgJiYga2VlcF91bml4cHdfcGFzcykgewotCQkJc3RyemVybyhrZWVwX3VuaXhwd191c2VyKTsKLQkJCXN0cnplcm8oa2VlcF91bml4cHdfcGFzcyk7Ci0JCQlrZWVwX3VuaXhwdyA9IDA7Ci0JCX0KLQotCQlpZiAoY3JlYXRlZF9kaXNwKSB7Ci0JCQlzbnByaW50ZihzdHIsIDMwLCAiQ3JlYXRlZCBESVNQTEFZICVzIiwgdXNlX2RweSk7Ci0JCX0gZWxzZSB7Ci0JCQlzbnByaW50ZihzdHIsIDMwLCAiVXNpbmcgRElTUExBWSAlcyIsIHVzZV9kcHkpOwotCQl9Ci0JCXVuaXhwd19tc2coc3RyLCAyKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgc3NoX3JlbW90ZV90dW5uZWwoY2hhciAqLCBpbnQpOwotCi1zdGF0aWMgWEltYWdlIHhpbWFnZV9zdHJ1Y3Q7Ci0KLXZvaWQgcHJvZ3Jlc3NfY2xpZW50KHZvaWQpIHsKLQlpbnQgaSwgaiA9IDAsIHByb2dyZXNzZWQgPSAwLCBkYiA9IDA7Ci0JZG91YmxlIHN0YXJ0ID0gZG5vdygpOwotCWlmIChnZXRlbnYoIlBST0dSRVNTX0NMSUVOVF9EQkciKSkgewotCQlyZmJMb2coInByb2dyZXNzX2NsaWVudDogYmVnaW5cbiIpOwotCQlkYiA9IDE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0JCWlmIChsYXRlc3RfY2xpZW50KSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJCWlmIChsYXRlc3RfY2xpZW50LT5zdGF0ZSAhPSBSRkJfUFJPVE9DT0xfVkVSU0lPTikgewotCQkJCQlwcm9ncmVzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChkYikgcmZiTG9nKCJwcm9ncmVzc19jbGllbnQ6IGNhbGxpbmctMSByZmJDRkQoMSkgJS42ZlxuIiwgZG5vdygpLXN0YXJ0KTsKLQkJCQlyZmJDRkQoMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzZWQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChkYikgcmZiTG9nKCJwcm9ncmVzc19jbGllbnQ6IGNhbGxpbmctMiByZmJDRkQoMSkgJS42ZlxuIiwgZG5vdygpLXN0YXJ0KTsKLQkJcmZiQ0ZEKDEpOwotCX0KLQlpZiAoIXF1aWV0KSB7Ci0JCXJmYkxvZygiY2xpZW50IHByb2dyZXNzZWQ9JWQgaW4gJWQvJWQgJS42ZiBzXG4iLAotCQkgICAgcHJvZ3Jlc3NlZCwgaSwgaiwgZG5vdygpIC0gc3RhcnQpOwotCX0KLX0KLQotaW50IHdhaXRfZm9yX2NsaWVudChpbnQgKmFyZ2MsIGNoYXIqKiBhcmd2LCBpbnQgaHR0cCkgewotCS8qIHVnaCwgaGVyZSB3ZSBnby4uLiAqLwotCVhJbWFnZSogZmJfaW1hZ2U7Ci0JaW50IHcgPSA2NDAsIGggPSA0ODAsIGIgPSAzMjsKLQlpbnQgdzAgPSAtMSwgaDAgPSAtMSwgaSwgY2hnX3Jhd19mYiA9IDA7Ci0JY2hhciAqc3RyLCAqcSwgKmNtZCA9IE5VTEw7Ci0JaW50IGRiID0gMCwgZHQgPSAwOwotCWNoYXIgKmNyZWF0ZV9jbWQgPSBOVUxMOwotCWNoYXIgKnVzZXJzX2xpc3Rfc2F2ZSA9IE5VTEw7Ci0JaW50IGNyZWF0ZWRfZGlzcCA9IDAsIG5jYWNoZV9zYXZlOwotCWludCBkaWRfY2xpZW50X2Nvbm5lY3QgPSAwOwotCWNoYXIgKnZuY19yZWRpcmVjdF9ob3N0ID0gImxvY2FsaG9zdCI7Ci0JaW50IHZuY19yZWRpcmVjdF9wb3J0ID0gLTEsIHZuY19yZWRpcmVjdF9jbnQgPSAwOwotCWNoYXIgdm5jX3JlZGlyZWN0X3Rlc3RbMTBdOwotCi0JaWYgKGdldGVudigiV0FJVF9GT1JfQ0xJRU5UX0RCIikpIHsKLQkJZGIgPSAxOwotCX0KLQotCXZuY19yZWRpcmVjdCA9IDA7Ci0KLQlpZiAoISB1c2VfZHB5IHx8IHN0cnN0cih1c2VfZHB5LCAiV0FJVDoiKSAhPSB1c2VfZHB5KSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaT0wOyBpIDwgKmFyZ2M7IGkrKykgewotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWRlc2t0b3AiKSkgewotCQkJZHQgPSAxOwotCQl9Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJhcmdzICVkICVzXG4iLCBpLCBhcmd2W2ldKTsKLQl9Ci0JaWYgKCFxdWlldCAmJiAhc3Ryc3RyKHVzZV9kcHksICJGSU5ERElTUExBWS1ydW4iKSkgewotCQlyZmJMb2coIlxuIik7Ci0JCXJmYkxvZygid2FpdF9mb3JfY2xpZW50OiAlc1xuIiwgdXNlX2RweSk7Ci0JCXJmYkxvZygiXG4iKTsKLQl9Ci0KLQlzdHIgPSBzdHJkdXAodXNlX2RweSk7Ci0Jc3RyICs9IHN0cmxlbigiV0FJVCIpOwotCi0JeGRtY3BfaW5zZXJ0ID0gTlVMTDsKLQotCS8qIGdldCBhbnkgbGVhZGluZyBnZW9tZXRyeTogKi8KLQlxID0gc3RyY2hyKHN0cisxLCAnOicpOwotCWlmIChxKSB7Ci0JCSpxID0gJ1wwJzsKLQkJaWYgKHNzY2FuZihzdHIrMSwgIiVkeCVkIiwgJncwLCAmaDApID09IDIpICB7Ci0JCQl3ID0gdzA7Ci0JCQloID0gaDA7Ci0JCQlyZmJMb2coIndhaXRfZm9yX2NsaWVudCBzZXQ6IHc9JWQgaD0lZFxuIiwgdywgaCk7Ci0JCX0gZWxzZSB7Ci0JCQl3MCA9IC0xOwotCQkJaDAgPSAtMTsKLQkJfQotCQkqcSA9ICc6JzsKLQkJc3RyID0gcTsKLQl9Ci0JaWYgKCh3MCA9PSAtMSB8fCBoMCA9PSAtMSkgJiYgcGFkX2dlb21ldHJ5ICE9IE5VTEwpIHsKLQkJaW50IGIwLCBkZWwgPSAwOwotCQljaGFyICpzID0gcGFkX2dlb21ldHJ5OwotCQlpZiAoc3Ryc3RyKHMsICJvbmNlOiIpID09IHMpIHsKLQkJCWRlbCA9IDE7Ci0JCQlzICs9IHN0cmxlbigib25jZToiKTsKLQkJfQotCQlpZiAoc3NjYW5mKHMsICIlZHglZHglZCIsICZ3MCwgJmgwLCAmYjApID09IDMpICB7Ci0JCQl3ID0gbmFicyh3MCk7Ci0JCQloID0gbmFicyhoMCk7Ci0JCQliID0gbmFicyhiMCk7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKHMsICIlZHglZCIsICZ3MCwgJmgwKSA9PSAyKSAgewotCQkJdyA9IG5hYnModzApOwotCQkJaCA9IG5hYnMoaDApOwotCQl9Ci0JCWlmIChkZWwpIHsKLQkJCXBhZF9nZW9tZXRyeSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQkvKiBzdHIgY3VycmVudGx5IGJlZ2lucyB3aXRoIGEgJzonICovCi0JaWYgKHN0cnN0cihzdHIsICI6Y21kPSIpID09IHN0cikgewotCQkvKiBjbWQ9L3BhdGgvdG8vbXljb21tYW5kICovCi0JCXN0cisrOwotCX0gZWxzZSBpZiAoc3RycGJyayhzdHIsICIwMTIzNDU2Nzg5IikgPT0gc3RyKzEpIHsKLQkJLyogOjAuMCAqLwotCQk7Ci0JfSBlbHNlIHsKLQkJLyogaG9zdG5hbWU6MC4wICovCi0JCXN0cisrOwotCX0KLQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzdHI6ICVzXG4iLCBzdHIpOwotCi0JaWYgKHN0cnN0cihzdHIsICJjbWQ9IikgPT0gc3RyKSB7Ci0JCWNtZCA9IHNldHVwX2NtZChzdHIsICZ2bmNfcmVkaXJlY3QsICZ2bmNfcmVkaXJlY3RfaG9zdCwgJnZuY19yZWRpcmVjdF9wb3J0LCBkYik7Ci0JfQotCQotCWZiX2ltYWdlID0gJnhpbWFnZV9zdHJ1Y3Q7Ci0Jc2V0dXBfZmFrZV9mYihmYl9pbWFnZSwgdywgaCwgYik7Ci0KLQlpZiAoISBkdCkgewotCQljaGFyICpzOwotCQlhcmd2WyphcmdjXSA9IHN0cmR1cCgiLWRlc2t0b3AiKTsKLQkJKmFyZ2MgPSAoKmFyZ2MpICsgMTsKLQotCQlpZiAoY21kKSB7Ci0JCQljaGFyICpxOwotCQkJcyA9IGNob29zZV90aXRsZSgiOjAiKTsKLQkJCXEgPSBzdHJzdHIocywgIjowIik7Ci0JCQlpZiAocSkgewotCQkJCSpxID0gJ1wwJzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXMgPSBjaG9vc2VfdGl0bGUoc3RyKTsKLQkJfQotCQlyZmJfZGVza3RvcF9uYW1lID0gc3RyZHVwKHMpOwotCQlhcmd2WyphcmdjXSA9IHM7Ci0JCSphcmdjID0gKCphcmdjKSArIDE7Ci0JfQotCi0JbmNhY2hlX3NhdmUgPSBuY2FjaGU7Ci0JbmNhY2hlID0gMDsKLQotCWluaXRpYWxpemVfYWxsb3dlZF9pbnB1dCgpOwotCi0JaWYgKCEgbXVsdGlwbGVfY3Vyc29yc19tb2RlKSB7Ci0JCW11bHRpcGxlX2N1cnNvcnNfbW9kZSA9IHN0cmR1cCgiZGVmYXVsdCIpOwotCX0KLQlpbml0aWFsaXplX2N1cnNvcnNfbW9kZSgpOwotCQotCWluaXRpYWxpemVfc2NyZWVuKGFyZ2MsIGFyZ3YsIGZiX2ltYWdlKTsKLQotCWlmICghIGluZXRkICYmICEgdXNlX29wZW5zc2wpIHsKLQkJaWYgKCEgc2NyZWVuLT5wb3J0IHx8IHNjcmVlbi0+bGlzdGVuU29jayA8IDApIHsKLQkJCWlmIChnb3RfcmZicG9ydCAmJiBnb3RfcmZicG9ydF92YWwgPT0gMCkgewotCQkJCTsKLQkJCX0gZWxzZSBpZiAoaXB2Nl9saXN0ZW4gJiYgaXB2Nl9saXN0ZW5fZmQgPj0gMCkgewotCQkJCXJmYkxvZygiSW5mbzogbGlzdGVuaW5nIG9uIElQdjYgaW50ZXJmYWNlIG9ubHkuICAod2FpdCBmb3IgY2xpZW50KVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCQlyZmJMb2coIkVycm9yOiBjb3VsZCBub3Qgb2J0YWluIGxpc3RlbmluZyBwb3J0LiAgKHdhaXQgZm9yIGNsaWVudClcbiIpOwotCQkJCWlmICghZ290X3JmYnBvcnQgJiYgIWdvdF9pcHY2X2xpc3RlbikgewotCQkJCQlyZmJMb2coIklmIHRoaXMgc3lzdGVtIGlzIElQdjYtb25seSwgdXNlIHRoZSAtNiBvcHRpb24uXG4iKTsKLQkJCQl9Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJfQotCX0KLQotCWluaXRpYWxpemVfc2lnbmFscygpOwotCi0JaWYgKHNzaF9zdHIgIT0gTlVMTCkgewotCQlzc2hfcmVtb3RlX3R1bm5lbChzc2hfc3RyLCBzY3JlZW4tPnBvcnQpOwotCX0KLQotCWlmICghIHJhd19mYikgewotCQljaGdfcmF3X2ZiID0gMTsKLQkJLyoga2x1ZGdlIHRvIGdldCBSQVdGQl9SRVQgd2l0aCBkcHkgPT0gTlVMTCBndWFyZHMgKi8KLQkJcmF3X2ZiID0gKGNoYXIgKikgMHgxOwotCX0KLQotCWlmIChjbWQgJiYgIXN0cmNtcChjbWQsICJIVFRQT05DRSIpKSB7Ci0JCWhhbmRsZV9vbmVfaHR0cF9yZXF1ZXN0KCk7CQotCQljbGVhbl91cF9leGl0KDApOwotCX0KLQotCWlmIChodHRwICYmIGNoZWNrX2h0dHBkaXIoKSkgewotCQlodHRwX2Nvbm5lY3Rpb25zKDEpOwotCX0KLQotCWlmIChjbWQgJiYgdW5peHB3KSB7Ci0JCWtlZXBfdW5peHB3ID0gMTsKLQl9Ci0KLQlzZXR1cF9zZXJ2aWNlKCk7Ci0KLQljaGVja193YWl0YmcoKTsKLQotCWlmICh2bmNfcmVkaXJlY3QpIHsKLQkJdm5jX3JlZGlyZWN0X2xvb3Aodm5jX3JlZGlyZWN0X3Rlc3QsICZ2bmNfcmVkaXJlY3RfY250KTsKLQl9IGVsc2UgewotCi0JCWlmICh1c2VfdGhyZWFkcyAmJiAhc3RhcnRlZF9yZmJSdW5FdmVudExvb3ApIHsKLQkJCXN0YXJ0ZWRfcmZiUnVuRXZlbnRMb29wID0gMTsKLQkJCXJmYlJ1bkV2ZW50TG9vcChzY3JlZW4sIC0xLCBUUlVFKTsKLQkJfQotCi0JCWlmIChpbmV0ZCAmJiB1c2Vfb3BlbnNzbCkgewotCQkJYWNjZXB0X29wZW5zc2woT1BFTlNTTF9JTkVURCwgLTEpOwotCQl9Ci0KLQkJc2V0dXBfY2xpZW50X2Nvbm5lY3QoJmRpZF9jbGllbnRfY29ubmVjdCk7Ci0KLQkJbG9vcF9mb3JfY29ubmVjdChkaWRfY2xpZW50X2Nvbm5lY3QpOwotCi0JCWlmICh1bml4cHcpIHsKLQkJCWlmIChjbWQgJiYgc3Ryc3RyKGNtZCwgIkZJTkRDUkVBVEVESVNQTEFZIikgPT0gY21kKSB7Ci0JCQkJaWYgKHVzZXJzX2xpc3QgJiYgc3Ryc3RyKHVzZXJzX2xpc3QsICJ1bml4cHc9IikgPT0gdXNlcnNfbGlzdCkgewotCQkJCQl1c2Vyc19saXN0X3NhdmUgPSB1c2Vyc19saXN0OwotCQkJCQl1c2Vyc19saXN0ID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCQlkb191bml4cHdfbG9vcCgpOwotCQl9IGVsc2UgaWYgKGNtZCAmJiAhdXNlX3RocmVhZHMpIHsKLQkJCS8qIHRyeSB0byBnZXQgUkZCIHByb3RvIGRvbmUgbm93LiAqLwotCQkJcHJvZ3Jlc3NfY2xpZW50KCk7Ci0JCX0KLQl9Ci0KLQlpZiAodm5jX3JlZGlyZWN0ID09IDIpIHsKLQkJOwotCX0gZWxzZSBpZiAoY21kKSB7Ci0JCWlmICghZG9fcnVuX2NtZChjbWQsIGNyZWF0ZV9jbWQsIHVzZXJzX2xpc3Rfc2F2ZSwgY3JlYXRlZF9kaXNwLCBkYikpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdXNlX2RweSA9IHN0cmR1cChzdHIpOwotCX0KLQlpZiAoY2hnX3Jhd19mYikgewotCQlyYXdfZmIgPSBOVUxMOwotCX0KLQotCW5jYWNoZSA9IG5jYWNoZV9zYXZlOwotCi0JaWYgKHVuaXhwdyAmJiBrZWVwX3VuaXhwd19vcHRzICYmIGtlZXBfdW5peHB3X29wdHNbMF0gIT0gJ1wwJykgewotCQl1c2VyX3N1cHBsaWVkX29wdHMoa2VlcF91bml4cHdfb3B0cyk7Ci0JfQotCWlmIChjcmVhdGVfY21kKSB7Ci0JCWZyZWUoY3JlYXRlX2NtZCk7Ci0JfQotCi0JaWYgKHZuY19yZWRpcmVjdCkgewotCQlkb192bmNfcmVkaXJlY3QoY3JlYXRlZF9kaXNwLCB2bmNfcmVkaXJlY3RfaG9zdCwgdm5jX3JlZGlyZWN0X3BvcnQsCi0JCSAgICB2bmNfcmVkaXJlY3RfY250LCB2bmNfcmVkaXJlY3RfdGVzdCk7Ci0JCWNsZWFuX3VwX2V4aXQoMCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KZGlmZiAtLWdpdCBhL3gxMXZuYy91c2VyLmggYi94MTF2bmMvdXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGMxYmI4Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy91c2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19VU0VSX0gKLSNkZWZpbmUgX1gxMVZOQ19VU0VSX0gKLQotLyogLS0gdXNlci5oIC0tICovCi0KLWV4dGVybiB2b2lkIGNoZWNrX3N3aXRjaGVkX3VzZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBsdXJrX2xvb3AoY2hhciAqc3RyKTsKLWV4dGVybiBpbnQgc3dpdGNoX3VzZXIoY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludCByZWFkX3Bhc3N3ZHMoY2hhciAqcGFzc2ZpbGUpOwotZXh0ZXJuIHZvaWQgaW5zdGFsbF9wYXNzd2RzKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2hlY2tfbmV3X3Bhc3N3ZHMoaW50IGZvcmNlKTsKLWV4dGVybiB2b2lkIHByb2dyZXNzX2NsaWVudCh2b2lkKTsKLWV4dGVybiBpbnQgd2FpdF9mb3JfY2xpZW50KGludCAqYXJnYywgY2hhcioqIGFyZ3YsIGludCBodHRwKTsKLWV4dGVybiByZmJCb29sIGN1c3RvbV9wYXNzd2RfY2hlY2socmZiQ2xpZW50UHRyIGNsLCBjb25zdCBjaGFyICpyZXNwb25zZSwgaW50IGxlbik7Ci1leHRlcm4gY2hhciAqeGRtY3BfaW5zZXJ0OwotCi0jZW5kaWYgLyogX1gxMVZOQ19VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy91c2VyaW5wdXQuYyBiL3gxMXZuYy91c2VyaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiY2I3Yi4uMDAwMDAwMAotLS0gYS94MTF2bmMvdXNlcmlucHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE5OSArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHVzZXJpbnB1dC5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJ4ZGFtYWdlLmgiCi0jaW5jbHVkZSAieHJlY29yZC5oIgotI2luY2x1ZGUgInhpbmVyYW1hLmgiCi0jaW5jbHVkZSAid2luX3V0aWxzLmgiCi0jaW5jbHVkZSAieGV2ZW50cy5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInBvaW50ZXIuaCIKLSNpbmNsdWRlICJyYXRlcy5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAic29saWQuaCIKLSNpbmNsdWRlICJ4cmFuZHIuaCIKLSNpbmNsdWRlICI4dG8yNC5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgIm1hY29zeC5oIgotI2luY2x1ZGUgIm1hY29zeENHUy5oIgotI2luY2x1ZGUgImN1cnNvci5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0KLS8qCi0gKiB1c2VyIGlucHV0IGhhbmRsaW5nIGhldXJpc3RpY3MKLSAqLwotaW50IGRlZmVyX3VwZGF0ZV9ub2ZiID0gNDsJLyogZGVmZXIgYSBzaG9ydGVyIHRpbWUgdW5kZXIgLW5vZmIgKi8KLWludCBsYXN0X3Njcm9sbF90eXBlID0gU0NSX05PTkU7Ci0KLQotaW50IGdldF93bV9mcmFtZV9wb3MoaW50ICpweCwgaW50ICpweSwgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoLAotICAgIFdpbmRvdyAqZnJhbWUsIFdpbmRvdyAqd2luKTsKLXZvaWQgcGFyc2Vfc2Nyb2xsX2NvcHlyZWN0KHZvaWQpOwotdm9pZCBwYXJzZV9maXhzY3JlZW4odm9pZCk7Ci12b2lkIHBhcnNlX3dpcmVmcmFtZSh2b2lkKTsKLQotdm9pZCBzZXRfd2lyZWNvcHlyZWN0X21vZGUoY2hhciAqc3RyKTsKLXZvaWQgc2V0X3Njcm9sbGNvcHlyZWN0X21vZGUoY2hhciAqc3RyKTsKLXZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfa2V5cyh2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfbWF0Y2hlcyh2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfdGVybSh2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV9tYXhfa2V5cmVwZWF0KHZvaWQpOwotCi1pbnQgZGlyZWN0X2ZiX2NvcHkoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgbWFyayk7Ci12b2lkIGZiX3B1c2godm9pZCk7Ci1pbnQgZmJfcHVzaF93YWl0KGRvdWJsZSBtYXhfd2FpdCwgaW50IGZsYWdzKTsKLXZvaWQgZWF0X3ZpZXdvbmx5X2lucHV0KGludCBtYXhfZWF0LCBpbnQga2VlcCk7Ci0KLXZvaWQgbWFya19mb3JfeGRhbWFnZShpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Ci12b2lkIG1hcmtfcmVnaW9uX2Zvcl94ZGFtYWdlKHNyYVJlZ2lvblB0ciByZWdpb24pOwotdm9pZCBzZXRfeGRhbWFnZV9tYXJrKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLWludCBuZWFyX3dtX2VkZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBweCwgaW50IHB5KTsKLWludCBuZWFyX3Njcm9sbGJhcl9lZGdlKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgcHgsIGludCBweSk7Ci0KLXZvaWQgY2hlY2tfZml4c2NyZWVuKHZvaWQpOwotaW50IGNoZWNrX3hyZWNvcmQodm9pZCk7Ci1pbnQgY2hlY2tfd2lyZWZyYW1lKHZvaWQpOwotaW50IGZiX3VwZGF0ZV9zZW50KGludCAqY291bnQpOwotaW50IGNoZWNrX3VzZXJfaW5wdXQoZG91YmxlIGR0LCBkb3VibGUgZHRyLCBpbnQgdGlsZV9kaWZmcywgaW50ICpjbnQpOwotdm9pZCBkb19jb3B5cmVnaW9uKHNyYVJlZ2lvblB0ciByZWdpb24sIGludCBkeCwgaW50IGR5LCBpbnQgbW9kZSk7Ci0KLWludCBjaGVja19uY2FjaGUoaW50IHJlc2V0LCBpbnQgbW9kZSk7Ci1pbnQgZmluZF9yZWN0KGludCBpZHgsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLWludCBic19yZXN0b3JlKGludCBpZHgsIGludCAqbmJhdGNoLCBzcmFSZWdpb25QdHIgcm1hc2ssIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyLCBpbnQgY2xpcCwgaW50IG5vcGFkLCBpbnQgKnZhbGlkLCBpbnQgdmVyYik7Ci1pbnQgdHJ5X3RvX2ZpeF9zdShXaW5kb3cgd2luLCBpbnQgaWR4LCBXaW5kb3cgYWJvdmUsIGludCAqbmJhdGNoLCBjaGFyICptb2RlKTsKLWludCB0cnlfdG9fZml4X3Jlc2l6ZV9zdShXaW5kb3cgb3JpZ19mcmFtZSwgaW50IG9yaWdfeCwgaW50IG9yaWdfeSwgaW50IG9yaWdfdywgaW50IG9yaWdfaCwKLSAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHRyeV9iYXRjaCk7Ci1pbnQgbG9va3VwX3dpbl9pbmRleChXaW5kb3cpOwotdm9pZCBzZXRfbmNhY2hlX3hyb290cG1hcCh2b2lkKTsKLQotc3RhdGljIHZvaWQgZ2V0X2NsaWVudF9yZWdpb25zKGludCAqcmVxLCBpbnQgKm1vZCwgaW50ICpjcHksIGludCAqbnVtKSA7Ci1zdGF0aWMgdm9pZCBwYXJzZV9zY3JvbGxfY29weXJlY3Rfc3RyKGNoYXIgKnNjcik7Ci1zdGF0aWMgdm9pZCBwYXJzZV93aXJlZnJhbWVfc3RyKGNoYXIgKndmKTsKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc3RyX2xpc3QoY2hhciAqKmxpc3QpOwotc3RhdGljIHZvaWQgZHJhd19ib3goaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCByZXN0b3JlKTsKLXN0YXRpYyBpbnQgZG9fYmRwdXNoKFdpbmRvdyB3bV93aW4sIGludCB4MCwgaW50IHkwLCBpbnQgdzAsIGludCBoMCwgaW50IGJkeCwKLSAgICBpbnQgYmR5LCBpbnQgYmRza2lubnkpOwotc3RhdGljIGludCBzZXRfeXBhZCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNjYWxlX21hcmsoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgbWFyayk7Ci1zdGF0aWMgaW50IHB1c2hfc2NyX2V2KGRvdWJsZSAqYWdlLCBpbnQgdHlwZSwgaW50IGJkcHVzaCwgaW50IGJkeCwgaW50IGJkeSwKLSAgICBpbnQgYmRza2lubnksIGludCBmaXJzdF9wdXNoKTsKLXN0YXRpYyBpbnQgY3JmaXgoaW50IHgsIGludCBkeCwgaW50IEx4KTsKLXN0YXRpYyBpbnQgc2Nyb2xsYWJpbGl0eShXaW5kb3cgd2luLCBpbnQgc2V0KTsKLXN0YXRpYyBpbnQgZWF0X3BvaW50ZXIoaW50IG1heF9wdHJfZWF0LCBpbnQga2VlcCk7Ci1zdGF0aWMgdm9pZCBzZXRfYmRwdXNoKGludCB0eXBlLCBkb3VibGUgKmxhc3RfYmRwdXNoLCBpbnQgKnB1c2hpdCk7Ci1zdGF0aWMgaW50IHJlcGVhdF9jaGVjayhkb3VibGUgbGFzdF9rZXlfc2Nyb2xsKTsKLXN0YXRpYyBpbnQgY2hlY2tfeHJlY29yZF9rZXlzKHZvaWQpOwotc3RhdGljIGludCBjaGVja194cmVjb3JkX21vdXNlKHZvaWQpOwotc3RhdGljIGludCB0cnlfY29weXJlY3QoV2luZG93IG9yaWdfZnJhbWUsIFdpbmRvdyBmcmFtZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgaW50IGR4LCBpbnQgZHksIGludCAqb2JzY3VyZWQsIHNyYVJlZ2lvblB0ciBleHRyYV9jbGlwLCBkb3VibGUgbWF4X3dhaXQsIGludCAqbmJhdGNoKTsKLXN0YXRpYyBpbnQgd2lyZWZyYW1lX21vZF9zdGF0ZSgpOwotc3RhdGljIHZvaWQgY2hlY2tfdXNlcl9pbnB1dDIoZG91YmxlIGR0KTsKLXN0YXRpYyB2b2lkIGNoZWNrX3VzZXJfaW5wdXQzKGRvdWJsZSBkdCwgZG91YmxlIGR0ciwgaW50IHRpbGVfZGlmZnMpOwotc3RhdGljIHZvaWQgY2hlY2tfdXNlcl9pbnB1dDQoZG91YmxlIGR0LCBkb3VibGUgZHRyLCBpbnQgdGlsZV9kaWZmcyk7Ci0KLXdpbmF0dHJfdCAqY2FjaGVfbGlzdDsKLQotLyoKLSAqIEZvciAtd2lyZWZyYW1lOiBmaW5kIHRoZSBkaXJlY3QgY2hpbGQgb2Ygcm9vdHdpbiB0aGF0IGhhcyB0aGUKLSAqIHBvaW50ZXIsIGFzc3VtZSB0aGF0IGlzIHRoZSBXTSBmcmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbgotICogKGkuZS4gd20gcmVwYXJlbnRzIHRoZSBhcHAgdG9wbGV2ZWwpIHJldHVybiBmcmFtZSBwb3NpdGlvbiBhbmQgc2l6ZQotICogaWYgc3VjY2Vzc2Z1bC4KLSAqLwotaW50IGdldF93bV9mcmFtZV9wb3MoaW50ICpweCwgaW50ICpweSwgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoLAotICAgIFdpbmRvdyAqZnJhbWUsIFdpbmRvdyAqd2luKSB7Ci0jaWYgIU5PX1gxMQotCVdpbmRvdyByLCBjOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JQm9vbCByZXQ7Ci0JaW50IHJvb3R4LCByb290eSwgd3gsIHd5OwotCXVuc2lnbmVkIGludCBtYXNrOwotI2VuZGlmCi0KLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJcmV0dXJuIG1hY29zeF9nZXRfd21fZnJhbWVfcG9zKHB4LCBweSwgeCwgeSwgdywgaCwgZnJhbWUsIHdpbik7Ci0JfQotI2VuZGlmCi0KLQlSQVdGQl9SRVQoMCkKLQotI2lmIE5PX1gxMQotCWlmICghcHggfHwgIXB5IHx8ICF4IHx8ICF5IHx8ICF3IHx8ICFoIHx8ICFmcmFtZSB8fCAhd2luKSB7fQotCXJldHVybiAwOwotI2Vsc2UKLQotCi0JcmV0ID0gWFF1ZXJ5UG9pbnRlcl93cihkcHksIHJvb3R3aW4sICZyLCAmYywgJnJvb3R4LCAmcm9vdHksICZ3eCwgJnd5LAotCSAgICAmbWFzayk7Ci0KLQkqZnJhbWUgPSBjOwotCi0JLyogY3VycmVudCBwb2ludGVyIHBvc2l0aW9uIGlzIHJldHVybmVkIHRvbyAqLwotCSpweCA9IHJvb3R4OwotCSpweSA9IHJvb3R5OwotCi0JaWYgKCFyZXQgfHwgISBjIHx8IGMgPT0gcm9vdHdpbikgewotCQkvKiBubyBpbW1lZGlhdGUgY2hpbGQgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogY2hpbGQgd2luZG93IHBvc2l0aW9uIGFuZCBzaXplICovCi0JaWYgKCEgdmFsaWRfd2luZG93KGMsICZhdHRyLCAxKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqeCA9IGF0dHIueDsKLQkqeSA9IGF0dHIueTsKLQkqdyA9IGF0dHIud2lkdGg7Ci0JKmggPSBhdHRyLmhlaWdodDsKLQotI2lmIDAKLQkvKiBtb3JlIGFjY3VyYXRlLCBidXQgdGhlIGFuaW1hdGlvbiBpcyBib2d1cyBhbnl3YXkgKi8KLQlpZiAoYXR0ci5ib3JkZXJfd2lkdGggPiAwKSB7Ci0JCSp3ICs9IDIgKiBhdHRyLmJvcmRlcl93aWR0aDsKLQkJKmggKz0gMiAqIGF0dHIuYm9yZGVyX3dpZHRoOwotCX0KLSNlbmRpZgotCi0JaWYgKHdpbiAhPSBOVUxMKSB7Ci0JCSp3aW4gPSBkZXNjZW5kX3BvaW50ZXIoNSwgYywgTlVMTCwgMCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyBpbnQgc2Nyb2xsY29weXJlY3RfdG9wLCBzY3JvbGxjb3B5cmVjdF9ib3Q7Ci1zdGF0aWMgaW50IHNjcm9sbGNvcHlyZWN0X2xlZnQsIHNjcm9sbGNvcHlyZWN0X3JpZ2h0Owotc3RhdGljIGRvdWJsZSBzY3Jfa2V5X3RpbWUsIHNjcl9rZXlfcGVyc2lzdDsKLXN0YXRpYyBkb3VibGUgc2NyX21vdXNlX3RpbWUsIHNjcl9tb3VzZV9wZXJzaXN0LCBzY3JfbW91c2VfbWF4dGltZTsKLXN0YXRpYyBkb3VibGUgc2NyX21vdXNlX3BvaW50ZXJfZGVsYXk7Ci1zdGF0aWMgZG91YmxlIHNjcl9rZXlfYmRwdXNoX3RpbWUsIHNjcl9tb3VzZV9iZHB1c2hfdGltZTsKLQotc3RhdGljIHZvaWQgcGFyc2Vfc2Nyb2xsX2NvcHlyZWN0X3N0cihjaGFyICpzY3IpIHsKLQljaGFyICpwLCAqc3RyOwotCWludCBpOwotCWNoYXIgKnBhcnRbMTZdOwotCi0JZm9yIChpPTA7IGk8MTY7IGkrKykgewotCQlwYXJ0W2ldID0gTlVMTDsKLQl9Ci0KLQlpZiAoc2NyID09IE5VTEwgfHwgKnNjciA9PSAnXDAnKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzdHIgPSBzdHJkdXAoc2NyKTsKLQotCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCWkgPSAwOwotCXdoaWxlIChwKSB7Ci0JCXBhcnRbaSsrXSA9IHN0cmR1cChwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQlpZiAoaSA+PSAxNikgYnJlYWs7Ci0JfQotCWZyZWUoc3RyKTsKLQotCi0JLyoKLQkgKiBUb3AsIEJvdHRvbSwgTGVmdCwgUmlnaHQgdG9sZXJhbmNlcyBmb3Igc2Nyb2xsYmFyIGxvY2F0aW9ucy4KLQkgKi8KLQlpZiAoKHN0ciA9IHBhcnRbMF0pICE9IE5VTEwpIHsKLQkJaW50IHQsIGIsIGwsIHI7Ci0JCWlmIChzc2NhbmYoc3RyLCAiJWQrJWQrJWQrJWQiLCAmdCwgJmIsICZsLCAmcikgPT0gNCkgewotCQkJc2Nyb2xsY29weXJlY3RfdG9wICAgPSB0OwotCQkJc2Nyb2xsY29weXJlY3RfYm90ICAgPSBiOwotCQkJc2Nyb2xsY29weXJlY3RfbGVmdCAgPSBsOwotCQkJc2Nyb2xsY29weXJlY3RfcmlnaHQgPSByOwotCQl9Ci0JCWZyZWUoc3RyKTsKLQl9Ci0KLQkvKiBrZXkgc2Nyb2xsaW5nIHRpbWluZyBoZXVyaXN0aWNzLiAqLwotCWlmICgoc3RyID0gcGFydFsxXSkgIT0gTlVMTCkgewotCQlkb3VibGUgdDEsIHQyLCB0MzsKLQkJaWYgKHNzY2FuZihzdHIsICIlbGYrJWxmKyVsZiIsICZ0MSwgJnQyLCAmdDMpID09IDMpIHsKLQkJCXNjcl9rZXlfdGltZSA9IHQxOwotCQkJc2NyX2tleV9wZXJzaXN0ID0gdDI7Ci0JCQlzY3Jfa2V5X2JkcHVzaF90aW1lID0gdDM7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLQotCS8qIG1vdXNlIHNjcm9sbGluZyB0aW1pbmcgaGV1cmlzdGljcy4gKi8KLQlpZiAoKHN0ciA9IHBhcnRbMl0pICE9IE5VTEwpIHsKLQkJZG91YmxlIHQxLCB0MiwgdDMsIHQ0LCB0NTsKLQkJaWYgKHNzY2FuZihzdHIsICIlbGYrJWxmKyVsZislbGYrJWxmIiwgJnQxLCAmdDIsICZ0MywgJnQ0LAotCQkgICAgJnQ1KSA9PSA1KSB7Ci0JCQlzY3JfbW91c2VfdGltZSA9IHQxOwotCQkJc2NyX21vdXNlX3BlcnNpc3QgPSB0MjsKLQkJCXNjcl9tb3VzZV9iZHB1c2hfdGltZSA9IHQzOwotCQkJc2NyX21vdXNlX3BvaW50ZXJfZGVsYXkgPSB0NDsKLQkJCXNjcl9tb3VzZV9tYXh0aW1lID0gdDU7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLX0KLQotdm9pZCBwYXJzZV9zY3JvbGxfY29weXJlY3Qodm9pZCkgewotCXBhcnNlX3Njcm9sbF9jb3B5cmVjdF9zdHIoU0NST0xMX0NPUFlSRUNUX1BBUk1TKTsKLQlpZiAoISBzY3JvbGxfY29weXJlY3Rfc3RyKSB7Ci0JCXNjcm9sbF9jb3B5cmVjdF9zdHIgPSBzdHJkdXAoU0NST0xMX0NPUFlSRUNUX1BBUk1TKTsKLQl9Ci0JcGFyc2Vfc2Nyb2xsX2NvcHlyZWN0X3N0cihzY3JvbGxfY29weXJlY3Rfc3RyKTsKLX0KLQotdm9pZCBwYXJzZV9maXhzY3JlZW4odm9pZCkgewotCWNoYXIgKnN0ciwgKnA7Ci0KLQlzY3JlZW5fZml4dXBfViA9IDAuMDsKLQlzY3JlZW5fZml4dXBfQyA9IDAuMDsKLQlzY3JlZW5fZml4dXBfWCA9IDAuMDsKLQlzY3JlZW5fZml4dXBfOCA9IDAuMDsKLQotCWlmICghIHNjcmVlbl9maXh1cF9zdHIpIHsKLQkJcmV0dXJuOwotCX0KLQotCXN0ciA9IHN0cmR1cChzY3JlZW5fZml4dXBfc3RyKTsKLQotCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCXdoaWxlIChwKSB7Ci0JCWRvdWJsZSB0OwotCQlpZiAoKnAgPT0gJ1YnICYmIHNzY2FuZihwLCAiVj0lbGYiLCAmdCkgPT0gMSkgewotCQkJc2NyZWVuX2ZpeHVwX1YgPSB0OwotCQl9IGVsc2UgaWYgKCpwID09ICdDJyAmJiBzc2NhbmYocCwgIkM9JWxmIiwgJnQpID09IDEpIHsKLQkJCXNjcmVlbl9maXh1cF9DID0gdDsKLQkJfSBlbHNlIGlmICgqcCA9PSAnWCcgJiYgc3NjYW5mKHAsICJYPSVsZiIsICZ0KSA9PSAxKSB7Ci0JCQlzY3JlZW5fZml4dXBfWCA9IHQ7Ci0JCX0gZWxzZSBpZiAoKnAgPT0gJ1gnICYmIHNzY2FuZihwLCAiOD0lbGYiLCAmdCkgPT0gMSkgewotCQkJc2NyZWVuX2ZpeHVwXzggPSB0OwotCQl9Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQl9Ci0JZnJlZShzdHIpOwotCi0JaWYgKHNjcmVlbl9maXh1cF9WIDwgMC4wKSBzY3JlZW5fZml4dXBfViA9IDAuMDsKLQlpZiAoc2NyZWVuX2ZpeHVwX0MgPCAwLjApIHNjcmVlbl9maXh1cF9DID0gMC4wOwotCWlmIChzY3JlZW5fZml4dXBfWCA8IDAuMCkgc2NyZWVuX2ZpeHVwX1ggPSAwLjA7Ci0JaWYgKHNjcmVlbl9maXh1cF84IDwgMC4wKSBzY3JlZW5fZml4dXBfOCA9IDAuMDsKLX0KLQotLyoKLVdJUkVGUkFNRV9QQVJNUyAiMHhmZiwyLDAsMzArNis2KzYsQWx0LDAuMDUrMC4zKzIuMCw4IgotICAgICAgICAgICAgICAgICAweGZmLDIsMCwzMis4KzgrOCxhbGwsMC4xNSswLjMwKzUuMCswLjEyNQotc2hhZGUsbGluZXdpZHRoLHBlcmNlbnQsVCtCK0wrUixtb2RzLHQxK3QyK3QzK3Q0Ci0gKi8KLSNkZWZpbmUgTFdfTUFYIDgKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpcmVmcmFtZV9zaGFkZSA9IDB4ZmY7Ci1zdGF0aWMgaW50IHdpcmVmcmFtZV9sdzsKLXN0YXRpYyBkb3VibGUgd2lyZWZyYW1lX2ZyYWM7Ci1zdGF0aWMgaW50IHdpcmVmcmFtZV90b3AsIHdpcmVmcmFtZV9ib3QsIHdpcmVmcmFtZV9sZWZ0LCB3aXJlZnJhbWVfcmlnaHQ7Ci1zdGF0aWMgZG91YmxlIHdpcmVmcmFtZV90MSwgd2lyZWZyYW1lX3QyLCB3aXJlZnJhbWVfdDMsIHdpcmVmcmFtZV90NDsKLXN0YXRpYyBjaGFyICp3aXJlZnJhbWVfbW9kcyA9IE5VTEw7Ci0KLS8qCi0gKiBQYXJzZSB0aGUgZ29yeSAtd2lyZWZyYW1lIHN0cmluZyBmb3IgcGFyYW1ldGVycy4KLSAqLwotc3RhdGljIHZvaWQgcGFyc2Vfd2lyZWZyYW1lX3N0cihjaGFyICp3ZikgewotCWNoYXIgKnAsICpzdHI7Ci0JaW50IGk7Ci0JY2hhciAqcGFydFsxNl07Ci0KLQlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7Ci0JCXBhcnRbaV0gPSBOVUxMOwotCX0KLQotCWlmICh3ZiA9PSBOVUxMIHx8ICp3ZiA9PSAnXDAnKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzdHIgPSBzdHJkdXAod2YpOwotCi0JLyogbGVhZGluZyAiLCIsIG1ha2UgaXQgc3RhcnQgd2l0aCBpZ25vcmFibGUgc3RyaW5nICJ6IiAqLwotCWlmICgqc3RyID09ICcsJykgewotCQljaGFyICp0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHN0cikrMik7CQotCQlzdHJjcHkodG1wLCAieiIpOwotCQlzdHJjYXQodG1wLCBzdHIpOwotCQlmcmVlKHN0cik7Ci0JCXN0ciA9IHRtcDsKLQl9Ci0KLQlwID0gc3RydG9rKHN0ciwgIiwiKTsKLQlpID0gMDsKLQl3aGlsZSAocCkgewotCQlwYXJ0W2krK10gPSBzdHJkdXAocCk7Ci0JCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJaWYgKGkgPj0gMTYpIGJyZWFrOwotCX0KLQlmcmVlKHN0cik7Ci0KLQotCS8qIFdpcmVmcmFtZSBzaGFkZSwgY29sb3IsIFJHQjogKi8KLQlpZiAoKHN0ciA9IHBhcnRbMF0pICE9IE5VTEwpIHsKLQkJdW5zaWduZWQgbG9uZyBuOwotCQlpbnQgciwgZywgYiwgb2sgPSAwOwotCQlYQ29sb3IgY2RlZjsKLQkJQ29sb3JtYXAgY21hcDsKLQkJaWYgKGRweSAmJiAoYnBwID09IDMyIHx8IGJwcCA9PSAxNikpIHsKLSNpZiAhTk9fWDExCi0JCQlYX0xPQ0s7Ci0JCSAJY21hcCA9IERlZmF1bHRDb2xvcm1hcCAoZHB5LCBzY3IpOwotCQkJaWYgKFhQYXJzZUNvbG9yKGRweSwgY21hcCwgc3RyLCAmY2RlZikgJiYKLQkJCSAgICBYQWxsb2NDb2xvcihkcHksIGNtYXAsICZjZGVmKSkgewotCQkJCXIgPSBjZGVmLnJlZCAgID4+IDg7Ci0JCQkJZyA9IGNkZWYuZ3JlZW4gPj4gODsKLQkJCQliID0gY2RlZi5ibHVlICA+PiA4OwotCQkJCWlmIChyID09IDAgJiYgZyA9PSAwKSB7Ci0JCQkJCWcgPSAxOwkvKiBuZWVkIHRvIGJlID4gMjU1ICovCi0JCQkJfQotCQkJCW4gPSAwOwotCQkJCW4gfD0gKHIgPDwgbWFpbl9yZWRfc2hpZnQpOwotCQkJCW4gfD0gKGcgPDwgbWFpbl9ncmVlbl9zaGlmdCk7Ci0JCQkJbiB8PSAoYiA8PCBtYWluX2JsdWVfc2hpZnQpOwotCQkJCXdpcmVmcmFtZV9zaGFkZSA9IG47Ci0JCQkJb2sgPSAxOwotCQkJfQotCQkJWF9VTkxPQ0s7Ci0jZWxzZQotCQkJciA9IGcgPSBiID0gMDsKLQkJCWNtYXAgPSAwOwotCQkJY2RlZi5waXhlbCA9IDA7Ci0jZW5kaWYKLQkJfQotCQlpZiAob2spIHsKLQkJCTsKLQkJfSBlbHNlIGlmIChzc2NhbmYoc3RyLCAiMHglbHgiLCAmbikgPT0gMSkgewotCQkJd2lyZWZyYW1lX3NoYWRlID0gbjsJCi0JCX0gZWxzZSBpZiAoc3NjYW5mKHN0ciwgIiVsdSIsICZuKSA9PSAxKSB7Ci0JCQl3aXJlZnJhbWVfc2hhZGUgPSBuOwkKLQkJfSBlbHNlIGlmIChzc2NhbmYoc3RyLCAiJWx4IiwgJm4pID09IDEpIHsKLQkJCXdpcmVmcmFtZV9zaGFkZSA9IG47CQotCQl9Ci0JCWZyZWUoc3RyKTsKLQl9Ci0KLQkvKiBsaW5ld2lkdGg6ICMgb2YgcGl4ZWxzIHdpZGUgZm9yIHRoZSB3aXJlZnJhbWUgbGluZXMgKi8KLQlpZiAoKHN0ciA9IHBhcnRbMV0pICE9IE5VTEwpIHsKLQkJaW50IG47Ci0JCWlmIChzc2NhbmYoc3RyLCAiJWQiLCAmbikgPT0gMSkgewotCQkJd2lyZWZyYW1lX2x3ID0gbjsJCi0JCQlpZiAod2lyZWZyYW1lX2x3IDwgMSkgewotCQkJCXdpcmVmcmFtZV9sdyA9IDE7IAotCQkJfQotCQkJaWYgKHdpcmVmcmFtZV9sdyA+IExXX01BWCkgewotCQkJCXdpcmVmcmFtZV9sdyA9IExXX01BWDsgCi0JCQl9Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLQotCS8qIHBlcmNlbnRhZ2UgY3V0b2ZmIGZvciBvcGFxdWUgbW92ZS9yZXNpemUgKGxpa2UgV00ncykgKi8KLQlpZiAoKHN0ciA9IHBhcnRbMl0pICE9IE5VTEwpIHsKLQkJaWYgKCpzdHIgPT0gJ1wwJykgewotCQkJOwotCQl9IGVsc2UgaWYgKHN0cmNocihzdHIsICcuJykpIHsKLQkJCXdpcmVmcmFtZV9mcmFjID0gYXRvZihzdHIpOwotCQl9IGVsc2UgewotCQkJd2lyZWZyYW1lX2ZyYWMgPSAoKGRvdWJsZSkgYXRvaShzdHIpKS8xMDAuMDsKLQkJfQotCQlmcmVlKHN0cik7Ci0JfQotCi0JLyoKLQkgKiBUb3AsIEJvdHRvbSwgTGVmdCwgUmlnaHQgdG9sZXJhbmNlcyB0byBndWVzcyB0aGUgd20gZnJhbWUgaXMKLQkgKiBiZWluZyBncmFiYmVkIChUb3AgaXMgdHJhZGl0aW9uYWxseSBiaWdnZXIsIGkuZS4gdGl0bGViYXIpOgotCSAqLwotCWlmICgoc3RyID0gcGFydFszXSkgIT0gTlVMTCkgewotCQlpbnQgdCwgYiwgbCwgcjsKLQkJaWYgKHNzY2FuZihzdHIsICIlZCslZCslZCslZCIsICZ0LCAmYiwgJmwsICZyKSA9PSA0KSB7Ci0JCQl3aXJlZnJhbWVfdG9wICAgPSB0OwotCQkJd2lyZWZyYW1lX2JvdCAgID0gYjsKLQkJCXdpcmVmcmFtZV9sZWZ0ICA9IGw7Ci0JCQl3aXJlZnJhbWVfcmlnaHQgPSByOwotCQl9Ci0JCWZyZWUoc3RyKTsKLQl9Ci0KLQkvKgotCSAqIHdpcmVmcmFtZSBpbiBpbnRlcmlvciB3aXRoIE1vZGlmaWVyIGRvd24uCi0JICogMCA9PiBubyBtb2RzCi0JICogMSA9PiBhbGwgbW9kcwotCSAqIFNoaWZ0LEFsdCxDb250cm9sLE1ldGEsU3VwZXIsSHlwZXIKLQkgKi8KLQlpZiAod2lyZWZyYW1lX21vZHMpIHsKLQkJZnJlZSh3aXJlZnJhbWVfbW9kcyk7Ci0JfQotCXdpcmVmcmFtZV9tb2RzID0gTlVMTDsKLQlpZiAoKHN0ciA9IHBhcnRbNF0pICE9IE5VTEwpIHsKLQkJaWYgKCpzdHIgPT0gJzAnIHx8ICFzdHJjbXAoc3RyLCAibm9uZSIpKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoKnN0ciA9PSAnMScgfHwgIXN0cmNtcChzdHIsICJhbGwiKSkgewotCQkJd2lyZWZyYW1lX21vZHMgPSBzdHJkdXAoImFsbCIpOwkKLQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIkFsdCIpIHx8ICFzdHJjbXAoc3RyLCAiU2hpZnQiKQotCQkgICAgfHwgIXN0cmNtcChzdHIsICJDb250cm9sIikgfHwgIXN0cmNtcChzdHIsICJNZXRhIikKLQkJICAgIHx8ICFzdHJjbXAoc3RyLCAiU3VwZXIiKSB8fCAhc3RyY21wKHN0ciwgIkh5cGVyIikpIHsKLQkJCXdpcmVmcmFtZV9tb2RzID0gc3RyZHVwKHN0cik7Ci0JCX0KLQl9Ci0KLQkvKiBjaGVja193aXJlZnJhbWUoKSB0aW1pbmcgaGV1cmlzdGljcy4gKi8KLQlpZiAoKHN0ciA9IHBhcnRbNV0pICE9IE5VTEwpIHsKLQkJZG91YmxlIHQxLCB0MiwgdDMsIHQ0OwotCQlpZiAoc3NjYW5mKHN0ciwgIiVsZislbGYrJWxmKyVsZiIsICZ0MSwgJnQyLCAmdDMsICZ0NCkgPT0gNCkgewotCQkJd2lyZWZyYW1lX3QxID0gdDE7Ci0JCQl3aXJlZnJhbWVfdDIgPSB0MjsKLQkJCXdpcmVmcmFtZV90MyA9IHQzOwotCQkJd2lyZWZyYW1lX3Q0ID0gdDQ7Ci0JCX0KLQkJZnJlZShzdHIpOwotCX0KLX0KLQotLyoKLSAqIEZpcnN0IHBhcnNlIHRoZSBkZWZhdWx0cyBhbmQgYXBwbHkgYW55IHVzZXIgc3VwcGxpZWQgb25lcyAobWF5IGJlIGEgc3Vic2V0KQotICovCi12b2lkIHBhcnNlX3dpcmVmcmFtZSh2b2lkKSB7Ci0JcGFyc2Vfd2lyZWZyYW1lX3N0cihXSVJFRlJBTUVfUEFSTVMpOwotCWlmICghIHdpcmVmcmFtZV9zdHIpIHsKLQkJd2lyZWZyYW1lX3N0ciA9IHN0cmR1cChXSVJFRlJBTUVfUEFSTVMpOwotCX0KLQlwYXJzZV93aXJlZnJhbWVfc3RyKHdpcmVmcmFtZV9zdHIpOwotfQotCi0vKgotICogU2V0IHdpcmVmcmFtZV9jb3B5cmVjdCBiYXNlZCBvbiBkZXNpcmVkIG1vZGUuCi0gKi8KLXZvaWQgc2V0X3dpcmVjb3B5cmVjdF9tb2RlKGNoYXIgKnN0cikgewotCWNoYXIgKm9yaWcgPSB3aXJlZnJhbWVfY29weXJlY3Q7Ci0JaWYgKHN0ciA9PSBOVUxMIHx8ICpzdHIgPT0gJ1wwJykgewotCQl3aXJlZnJhbWVfY29weXJlY3QgPSBzdHJkdXAod2lyZWZyYW1lX2NvcHlyZWN0X2RlZmF1bHQpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhbHdheXMiKSB8fCAhc3RyY21wKHN0ciwgImFsbCIpKSB7Ci0JCXdpcmVmcmFtZV9jb3B5cmVjdCA9IHN0cmR1cCgiYWx3YXlzIik7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgInRvcCIpKSB7Ci0JCXdpcmVmcmFtZV9jb3B5cmVjdCA9IHN0cmR1cCgidG9wIik7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5ldmVyIikgfHwgIXN0cmNtcChzdHIsICJub25lIikpIHsKLQkJd2lyZWZyYW1lX2NvcHlyZWN0ID0gc3RyZHVwKCJuZXZlciIpOwotCX0gZWxzZSB7Ci0JCWlmICghIHdpcmVmcmFtZV9jb3B5cmVjdCkgewotCQkJd2lyZWZyYW1lX2NvcHlyZWN0ID0gc3RyZHVwKHdpcmVmcmFtZV9jb3B5cmVjdF9kZWZhdWx0KTsKLQkJfSBlbHNlIHsKLQkJCW9yaWcgPSBOVUxMOwotCQl9Ci0JCXJmYkxvZygidW5rbm93biAtd2lyZWNvcHlyZWN0IG1vZGU6ICVzLCB1c2luZzogJXNcbiIsIHN0ciwKLQkJICAgIHdpcmVmcmFtZV9jb3B5cmVjdCk7Ci0JfQotCWlmIChvcmlnKSB7Ci0JCWZyZWUob3JpZyk7Ci0JfQotfQotCi0vKgotICogU2V0IHNjcm9sbF9jb3B5cmVjdCBiYXNlZCBvbiBkZXNpcmVkIG1vZGUuCi0gKi8KLXZvaWQgc2V0X3Njcm9sbGNvcHlyZWN0X21vZGUoY2hhciAqc3RyKSB7Ci0JY2hhciAqb3JpZyA9IHNjcm9sbF9jb3B5cmVjdDsKLQlpZiAoc3RyID09IE5VTEwgfHwgKnN0ciA9PSAnXDAnKSB7Ci0JCXNjcm9sbF9jb3B5cmVjdCA9IHN0cmR1cChzY3JvbGxfY29weXJlY3RfZGVmYXVsdCk7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImFsd2F5cyIpIHx8ICFzdHJjbXAoc3RyLCAiYWxsIikgfHwKLQkJICAgICFzdHJjbXAoc3RyLCAiYm90aCIpKSB7Ci0JCXNjcm9sbF9jb3B5cmVjdCA9IHN0cmR1cCgiYWx3YXlzIik7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImtleXMiKSB8fCAhc3RyY21wKHN0ciwgImtleWJvYXJkIikpIHsKLQkJc2Nyb2xsX2NvcHlyZWN0ID0gc3RyZHVwKCJrZXlzIik7Ci0JfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm1vdXNlIikgfHwgIXN0cmNtcChzdHIsICJwb2ludGVyIikpIHsKLQkJc2Nyb2xsX2NvcHlyZWN0ID0gc3RyZHVwKCJtb3VzZSIpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJuZXZlciIpIHx8ICFzdHJjbXAoc3RyLCAibm9uZSIpKSB7Ci0JCXNjcm9sbF9jb3B5cmVjdCA9IHN0cmR1cCgibmV2ZXIiKTsKLQl9IGVsc2UgewotCQlpZiAoISBzY3JvbGxfY29weXJlY3QpIHsKLQkJCXNjcm9sbF9jb3B5cmVjdCA9IHN0cmR1cChzY3JvbGxfY29weXJlY3RfZGVmYXVsdCk7Ci0JCX0gZWxzZSB7Ci0JCQlvcmlnID0gTlVMTDsKLQkJfQotCQlyZmJMb2coInVua25vd24gLXNjcm9sbGNvcHlyZWN0IG1vZGU6ICVzLCB1c2luZzogJXNcbiIsIHN0ciwKLQkJICAgIHNjcm9sbF9jb3B5cmVjdCk7Ci0JfQotCWlmIChvcmlnKSB7Ci0JCWZyZWUob3JpZyk7Ci0JfQotfQotCi12b2lkIGluaXRpYWxpemVfc2Nyb2xsX2tleXModm9pZCkgewotCWNoYXIgKnN0ciwgKnA7Ci0JaW50IGksIG5rZXlzID0gMCwgc2F3X2J1aWx0aW4gPSAwOwotCWludCBrc19tYXggPSAyICogMHhGRkZGOwotCi0JaWYgKHNjcm9sbF9rZXlfbGlzdCkgewotCQlmcmVlKHNjcm9sbF9rZXlfbGlzdCk7Ci0JCXNjcm9sbF9rZXlfbGlzdCA9IE5VTEw7Ci0JfQotCWlmICghIHNjcm9sbF9rZXlfbGlzdF9zdHIgfHwgKnNjcm9sbF9rZXlfbGlzdF9zdHIgPT0gJ1wwJykgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHN0cnN0cihzY3JvbGxfa2V5X2xpc3Rfc3RyLCAiYnVpbHRpbiIpKSB7Ci0JCWludCBrOwotCQkvKiBhZGQgaW4gbnVtYmVyIG9mIGtleXN5bXMgYnVpbHRpbiBnaXZlcyAqLwotCQlmb3IgKGs9MTsgazxrc19tYXg7IGsrKykgIHsKLQkJCWlmICh4cmVjb3JkX3Njcm9sbF9rZXlzeW0oKHJmYktleVN5bSkgaykpIHsKLQkJCQlua2V5cysrOwotCQkJfQotCQl9Ci0JfQotCi0JbmtleXMrKzsJLyogZmlyc3Qga2V5LCBpLmUuIG5vIGNvbW1hcy4gKi8KLQlwID0gc3RyID0gc3RyZHVwKHNjcm9sbF9rZXlfbGlzdF9zdHIpOwotCXdoaWxlKCpwKSB7Ci0JCWlmICgqcCA9PSAnLCcpIHsKLQkJCW5rZXlzKys7CS8qIGFkZGl0aW9uYWwga2V5LiAqLwotCQl9Ci0JCXArKzsKLQl9Ci0JCi0JbmtleXMrKzsJLyogZXhjbHVkZS9pbmNsdWRlIDAgZWxlbWVudCAqLwotCW5rZXlzKys7CS8qIHRyYWlsaW5nIE5vU3ltYm9sICovCi0KLQlzY3JvbGxfa2V5X2xpc3QgPSAoS2V5U3ltICopIG1hbGxvYyhua2V5cypzaXplb2YoS2V5U3ltKSk7IAotCWZvciAoaT0wOyBpPG5rZXlzOyBpKyspIHsKLQkJc2Nyb2xsX2tleV9saXN0W2ldID0gTm9TeW1ib2w7Ci0JfQotCWlmICgqc3RyID09ICctJykgewotCQlzY3JvbGxfa2V5X2xpc3RbMF0gPSAxOwotCQlwID0gc3RydG9rKHN0cisxLCAiLCIpOwotCX0gZWxzZSB7Ci0JCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCX0KLQlpID0gMTsKLQl3aGlsZSAocCkgewotCQlpZiAoIXN0cmNtcChwLCAiYnVpbHRpbiIpKSB7Ci0JCQlpbnQgazsKLQkJCWlmIChzYXdfYnVpbHRpbikgewotCQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNhd19idWlsdGluID0gMTsKLQkJCWZvciAoaz0xOyBrPGtzX21heDsgaysrKSAgewotCQkJCWlmICh4cmVjb3JkX3Njcm9sbF9rZXlzeW0oKHJmYktleVN5bSkgaykpIHsKLQkJCQkJc2Nyb2xsX2tleV9saXN0W2krK10gPSAocmZiS2V5U3ltKSBrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVuc2lnbmVkIGludCBpbjsKLQkJCWlmIChzc2NhbmYocCwgIiV1IiwgJmluKSA9PSAxKSB7Ci0JCQkJc2Nyb2xsX2tleV9saXN0W2krK10gPSAocmZiS2V5U3ltKSBpbjsKLQkJCX0gZWxzZSBpZiAoc3NjYW5mKHAsICIweCV4IiwgJmluKSA9PSAxKSB7Ci0JCQkJc2Nyb2xsX2tleV9saXN0W2krK10gPSAocmZiS2V5U3ltKSBpbjsKLQkJCX0gZWxzZSBpZiAoWFN0cmluZ1RvS2V5c3ltKHApICE9IE5vU3ltYm9sKSB7IAotCQkJCXNjcm9sbF9rZXlfbGlzdFtpKytdID0gWFN0cmluZ1RvS2V5c3ltKHApOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coImluaXRpYWxpemVfc2Nyb2xsX2tleXM6IHNraXAgdW5rbm93biAiCi0JCQkJICAgICJrZXlzeW06ICVzXG4iLCBwKTsKLQkJCX0KLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9zdHJfbGlzdChjaGFyICoqbGlzdCkgewotCWludCBpID0gMDsKLQlpZiAoISBsaXN0KSB7Ci0JCXJldHVybjsKLQl9Ci0Jd2hpbGUgKGxpc3RbaV0gIT0gTlVMTCkgewotCQlmcmVlKGxpc3RbaSsrXSk7Ci0JfQotCWZyZWUobGlzdCk7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfbWF0Y2hlcyh2b2lkKSB7Ci0JY2hhciAqc3RyLCAqaW1wID0gIl9fSU1QT1NTSUJMRV9TVFJfXyI7Ci0JaW50IGksIG4sIG5rZXksIG5tb3VzZTsKLQotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX2dvb2RfYWxsKTsKLQlzY3JvbGxfZ29vZF9hbGwgPSBOVUxMOwotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX2dvb2Rfa2V5KTsKLQlzY3JvbGxfZ29vZF9rZXkgPSBOVUxMOwotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX2dvb2RfbW91c2UpOwotCXNjcm9sbF9nb29kX21vdXNlID0gTlVMTDsKLQotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX3NraXBfYWxsKTsKLQlzY3JvbGxfc2tpcF9hbGwgPSBOVUxMOwotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX3NraXBfa2V5KTsKLQlzY3JvbGxfc2tpcF9rZXkgPSBOVUxMOwotCWRlc3Ryb3lfc3RyX2xpc3Qoc2Nyb2xsX3NraXBfbW91c2UpOwotCXNjcm9sbF9za2lwX21vdXNlID0gTlVMTDsKLQotCS8qIHNjcm9sbF9nb29kOiAqLwotCWlmIChzY3JvbGxfZ29vZF9zdHIgIT0gTlVMTCAmJiAqc2Nyb2xsX2dvb2Rfc3RyICE9ICdcMCcpIHsKLQkJc3RyID0gc2Nyb2xsX2dvb2Rfc3RyOwotCX0gZWxzZSB7Ci0JCXN0ciA9IHNjcm9sbF9nb29kX3N0cjA7Ci0JfQotCXNjcm9sbF9nb29kX2FsbCA9IGNyZWF0ZV9zdHJfbGlzdChzdHIpOwotCi0JbmtleSA9IDA7Ci0Jbm1vdXNlID0gMDsKLQluID0gMDsKLQl3aGlsZSAoc2Nyb2xsX2dvb2RfYWxsW25dICE9IE5VTEwpIHsKLQkJY2hhciAqcyA9IHNjcm9sbF9nb29kX2FsbFtuKytdOwotCQlpZiAoc3Ryc3RyKHMsICJLRVk6IikgPT0gcykgbmtleSsrOwotCQlpZiAoc3Ryc3RyKHMsICJNT1VTRToiKSA9PSBzKSBubW91c2UrKzsKLQl9Ci0JaWYgKG5rZXkrKykgewotCQlzY3JvbGxfZ29vZF9rZXkgPSAoY2hhciAqKikgbWFsbG9jKG5rZXkqc2l6ZW9mKGNoYXIgKikpOwotCQlmb3IgKGk9MDsgaTxua2V5OyBpKyspIHNjcm9sbF9nb29kX2tleVtpXSA9IE5VTEw7Ci0JfQotCWlmIChubW91c2UrKykgewotCQlzY3JvbGxfZ29vZF9tb3VzZSA9IChjaGFyICoqKSBtYWxsb2Mobm1vdXNlKnNpemVvZihjaGFyICopKTsKLQkJZm9yIChpPTA7IGk8bm1vdXNlOyBpKyspIHNjcm9sbF9nb29kX21vdXNlW2ldID0gTlVMTDsKLQl9Ci0JbmtleSA9IDA7Ci0Jbm1vdXNlID0gMDsKLQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJY2hhciAqcyA9IHNjcm9sbF9nb29kX2FsbFtpXTsKLQkJaWYgKHN0cnN0cihzLCAiS0VZOiIpID09IHMpIHsKLQkJCXNjcm9sbF9nb29kX2tleVtua2V5KytdID0gc3RyZHVwKHMrc3RybGVuKCJLRVk6IikpOwotCQkJZnJlZShzKTsKLQkJCXNjcm9sbF9nb29kX2FsbFtpXSA9IHN0cmR1cChpbXApOwotCQl9IGVsc2UgaWYgKHN0cnN0cihzLCAiTU9VU0U6IikgPT0gcykgewotCQkJc2Nyb2xsX2dvb2RfbW91c2Vbbm1vdXNlKytdPXN0cmR1cChzK3N0cmxlbigiTU9VU0U6IikpOwotCQkJZnJlZShzKTsKLQkJCXNjcm9sbF9nb29kX2FsbFtpXSA9IHN0cmR1cChpbXApOwotCQl9Ci0JfQotCi0JLyogc2Nyb2xsX3NraXA6ICovCi0JaWYgKHNjcm9sbF9za2lwX3N0ciAhPSBOVUxMICYmICpzY3JvbGxfc2tpcF9zdHIgIT0gJ1wwJykgewotCQlzdHIgPSBzY3JvbGxfc2tpcF9zdHI7Ci0JfSBlbHNlIHsKLQkJc3RyID0gc2Nyb2xsX3NraXBfc3RyMDsKLQl9Ci0Jc2Nyb2xsX3NraXBfYWxsID0gY3JlYXRlX3N0cl9saXN0KHN0cik7Ci0KLQlua2V5ID0gMDsKLQlubW91c2UgPSAwOwotCW4gPSAwOwotCXdoaWxlIChzY3JvbGxfc2tpcF9hbGxbbl0gIT0gTlVMTCkgewotCQljaGFyICpzID0gc2Nyb2xsX3NraXBfYWxsW24rK107Ci0JCWlmIChzdHJzdHIocywgIktFWToiKSA9PSBzKSBua2V5Kys7Ci0JCWlmIChzdHJzdHIocywgIk1PVVNFOiIpID09IHMpIG5tb3VzZSsrOwotCX0KLQlpZiAobmtleSsrKSB7Ci0JCXNjcm9sbF9za2lwX2tleSA9IChjaGFyICoqKSBtYWxsb2MobmtleSpzaXplb2YoY2hhciAqKSk7Ci0JCWZvciAoaT0wOyBpPG5rZXk7IGkrKykgc2Nyb2xsX3NraXBfa2V5W2ldID0gTlVMTDsKLQl9Ci0JaWYgKG5tb3VzZSsrKSB7Ci0JCXNjcm9sbF9za2lwX21vdXNlID0gKGNoYXIgKiopIG1hbGxvYyhubW91c2Uqc2l6ZW9mKGNoYXIgKikpOwotCQlmb3IgKGk9MDsgaTxubW91c2U7IGkrKykgc2Nyb2xsX3NraXBfbW91c2VbaV0gPSBOVUxMOwotCX0KLQlua2V5ID0gMDsKLQlubW91c2UgPSAwOwotCWZvciAoaT0wOyBpPG47IGkrKykgewotCQljaGFyICpzID0gc2Nyb2xsX3NraXBfYWxsW2ldOwotCQlpZiAoc3Ryc3RyKHMsICJLRVk6IikgPT0gcykgewotCQkJc2Nyb2xsX3NraXBfa2V5W25rZXkrK10gPSBzdHJkdXAocytzdHJsZW4oIktFWToiKSk7Ci0JCQlmcmVlKHMpOwotCQkJc2Nyb2xsX3NraXBfYWxsW2ldID0gc3RyZHVwKGltcCk7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHMsICJNT1VTRToiKSA9PSBzKSB7Ci0JCQlzY3JvbGxfc2tpcF9tb3VzZVtubW91c2UrK109c3RyZHVwKHMrc3RybGVuKCJNT1VTRToiKSk7Ci0JCQlmcmVlKHMpOwotCQkJc2Nyb2xsX3NraXBfYWxsW2ldID0gc3RyZHVwKGltcCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfdGVybSh2b2lkKSB7Ci0JY2hhciAqc3RyOwotCWludCBuOwotCi0JZGVzdHJveV9zdHJfbGlzdChzY3JvbGxfdGVybSk7Ci0Jc2Nyb2xsX3Rlcm0gPSBOVUxMOwotCi0JaWYgKHNjcm9sbF90ZXJtX3N0ciAhPSBOVUxMICYmICpzY3JvbGxfdGVybV9zdHIgIT0gJ1wwJykgewotCQlzdHIgPSBzY3JvbGxfdGVybV9zdHI7Ci0JfSBlbHNlIHsKLQkJc3RyID0gc2Nyb2xsX3Rlcm1fc3RyMDsKLQl9Ci0JaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKSB7Ci0JCXJldHVybjsKLQl9Ci0Jc2Nyb2xsX3Rlcm0gPSBjcmVhdGVfc3RyX2xpc3Qoc3RyKTsKLQotCW4gPSAwOwotCXdoaWxlIChzY3JvbGxfdGVybVtuXSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnMgPSBzY3JvbGxfZ29vZF9hbGxbbisrXTsKLQkJLyogcHVsbCBwYXJhbWV0ZXJzIG91dCBhdCBzb21lIHBvaW50ICovCi0JCXMgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBpbml0aWFsaXplX21heF9rZXlyZXBlYXQodm9pZCkgewotCWNoYXIgKnN0cjsKLQlpbnQgbG8sIGhpOwotCi0JaWYgKG1heF9rZXlyZXBlYXRfc3RyICE9IE5VTEwgJiYgKm1heF9rZXlyZXBlYXRfc3RyICE9ICdcMCcpIHsKLQkJc3RyID0gbWF4X2tleXJlcGVhdF9zdHI7Ci0JfSBlbHNlIHsKLQkJc3RyID0gbWF4X2tleXJlcGVhdF9zdHIwOwotCX0KLQotCWlmIChzc2NhbmYoc3RyLCAiJWQtJWQiLCAmbG8sICZoaSkgIT0gMikgewotCQlyZmJMb2coInNraXBwaW5nIGludmFsaWQgLXNjcl9rZXlyZXBlYXQgc3RyaW5nOiAlc1xuIiwgc3RyKTsKLQkJc3NjYW5mKG1heF9rZXlyZXBlYXRfc3RyMCwgIiVkLSVkIiwgJmxvLCAmaGkpOwotCX0KLQltYXhfa2V5cmVwZWF0X2xvID0gbG87Ci0JbWF4X2tleXJlcGVhdF9oaSA9IGhpOwotCWlmIChtYXhfa2V5cmVwZWF0X2xvIDwgMSkgewotCQltYXhfa2V5cmVwZWF0X2xvID0gMTsKLQl9Ci0JaWYgKG1heF9rZXlyZXBlYXRfaGkgPiA0MCkgewotCQltYXhfa2V5cmVwZWF0X2hpID0gNDA7Ci0JfQotfQotCi10eXBlZGVmIHN0cnVjdCBzYXZlbGluZSB7Ci0JaW50IHgwLCB5MCwgeDEsIHkxOwotCWludCBzaGlmdDsKLQlpbnQgdmVydDsKLQlpbnQgc2F2ZWQ7Ci0JY2hhciAqZGF0YTsKLX0gc2F2ZWxpbmVfdDsKLQotLyoKLSAqIERyYXcgdGhlIHdpcmVmcmFtZSBib3ggb250byB0aGUgZnJhbWVidWZmZXIuICBTYXZlcyB0aGUgcmVhbAotICogZnJhbWVidWZmZXIgZGF0YSB0byBzb21lIHN0b3JhZ2UgbGluZXMuICBSZXN0b3JlcyBwcmV2aW91cyBsaW5lcy4KLSAqIHVzZSByZXN0b3JlID0gMSB0byBjbGVhbiB1cCAoZG9uZSB3aXRoIGFuaW1hdGlvbikuCi0gKiBUaGlzIHdvcmtzIHdpdGggLXNjYWxlLgotICovCi1zdGF0aWMgdm9pZCBkcmF3X2JveChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHJlc3RvcmUpIHsKLQlpbnQgeDAsIHkwLCB4MSwgeTEsIGksIHBpeGVsc2l6ZSA9IGJwcC84OwotCWNoYXIgKmRzdCwgKnNyYywgKnVzZV9mYjsKLQlzdGF0aWMgc2F2ZWxpbmVfdCAqc2F2ZVs0XTsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMSwgbGVuID0gMDsKLQlpbnQgbWF4ID0gZHB5X3ggPiBkcHlfeSA/IGRweV94IDogZHB5X3k7Ci0JaW50IHVzZV9CcGwsIGx3ID0gd2lyZWZyYW1lX2x3OwotCXVuc2lnbmVkIGxvbmcgc2hhZGUgPSB3aXJlZnJhbWVfc2hhZGU7Ci0JaW50IGNvbG9yID0gMDsKLQl1bnNpZ25lZCBzaG9ydCB1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB1bCA9IDA7Ci0KLQlpZiAoY2xpcHNoaWZ0KSB7Ci0JCXggLT0gY29mZl94OwotCQl5IC09IGNvZmZfeTsKLQl9Ci0KLQkvKiBoYW5kbGUgLTh0bzI0IG1vZGU6IHVzZSAybmQgZmIgb25seSAqLwotCXVzZV9mYiAgPSBtYWluX2ZiOwotCXVzZV9CcGwgPSBtYWluX2J5dGVzX3Blcl9saW5lOyAKLQkKLQlpZiAoY21hcDh0bzI0ICYmIGNtYXA4dG8yNF9mYikgewotCQl1c2VfZmIgPSBjbWFwOHRvMjRfZmI7Ci0JCXBpeGVsc2l6ZSA9IDQ7Ci0JCWlmIChkZXB0aCA8PSA4KSB7Ci0JCQl1c2VfQnBsICo9IDQ7Ci0JCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYpIHsKLQkJCXVzZV9CcGwgKj0gMjsKLQkJfQotCX0KLQotCWlmIChtYXggPiBsZW4pIHsKLQkJLyogY3JlYXRlL3Jlc2l6ZSBzdG9yYWdlIGxpbmVzOiAqLwotCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKLQkJCWxlbiA9IG1heDsKLQkJCWlmICghIGZpcnN0ICYmIHNhdmVbaV0pIHsKLQkJCQlpZiAoc2F2ZVtpXS0+ZGF0YSkgewotCQkJCQlmcmVlKHNhdmVbaV0tPmRhdGEpOwotCQkJCQlzYXZlW2ldLT5kYXRhID0gTlVMTDsKLQkJCQl9Ci0JCQkJZnJlZShzYXZlW2ldKTsKLQkJCX0KLQkJCXNhdmVbaV0gPSAoc2F2ZWxpbmVfdCAqKSBtYWxsb2Moc2l6ZW9mKHNhdmVsaW5lX3QpKTsKLQkJCXNhdmVbaV0tPnNhdmVkID0gMDsKLQkJCXNhdmVbaV0tPmRhdGEgPSAoY2hhciAqKSBtYWxsb2MoIChMV19NQVgrMSkqbGVuKjQgKTsKLQotCQkJLyogCi0JCQkgKiBGb3VyIHR5cGVzIG9mIGxpbmVzOgotCQkJICoJMCkgdG9wIGhvcml6b250YWwKLQkJCSAqCTEpIGJvdHRvbSBob3Jpem9udGFsCi0JCQkgKgkyKSBsZWZ0IHZlcnRpY2FsCi0JCQkgKgkzKSByaWdodCB2ZXJ0aWNhbAotCQkJICoKLQkJCSAqIHNoaWZ0IG1lYW5zIHNoaWZ0ZWQgYnkgd2lkdGggb3IgaGVpZ2h0LgotCQkJICovCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJc2F2ZVtpXS0+dmVydCAgPSAwOwotCQkJCXNhdmVbaV0tPnNoaWZ0ID0gMDsKLQkJCX0gZWxzZSBpZiAoaSA9PSAxKSB7Ci0JCQkJc2F2ZVtpXS0+dmVydCAgPSAwOwotCQkJCXNhdmVbaV0tPnNoaWZ0ID0gMTsKLQkJCX0gZWxzZSBpZiAoaSA9PSAyKSB7Ci0JCQkJc2F2ZVtpXS0+dmVydCAgPSAxOwotCQkJCXNhdmVbaV0tPnNoaWZ0ID0gMDsKLQkJCX0gZWxzZSBpZiAoaSA9PSAzKSB7Ci0JCQkJc2F2ZVtpXS0+dmVydCAgPSAxOwotCQkJCXNhdmVbaV0tPnNoaWZ0ID0gMTsKLQkJCX0KLQkJfQotCX0KLQlmaXJzdCA9IDA7Ci0KLQkvKgotCSAqIHJlc3RvcmUgYW55IHNhdmVkIGxpbmVzLiBzZWUgYmVsb3cgZm9yIGFsZ29yaXRobSBhbmQKLQkgKiBob3cgeDAsIGV0Yy4gYXJlIHVzZWQuICB3ZSBqdXN0IHJldmVyc2UgdGhvc2Ugc3RlcHMuCi0JICovCi0JZm9yIChpPTA7IGk8NDsgaSsrKSB7Ci0JCWludCBzID0gc2F2ZVtpXS0+c2hpZnQ7Ci0JCWludCB5dSwgeV9taW4gPSAtMSwgeV9tYXggPSAtMTsKLQkJaW50IHlfc3RhcnQsIHlfc3RvcCwgeV9zdGVwOwotCi0JCWlmICghIHNhdmVbaV0tPnNhdmVkKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQl4MCA9IHNhdmVbaV0tPngwOwotCQl5MCA9IHNhdmVbaV0tPnkwOwotCQl4MSA9IHNhdmVbaV0tPngxOwotCQl5MSA9IHNhdmVbaV0tPnkxOwotCQlpZiAoc2F2ZVtpXS0+dmVydCkgewotCQkJeV9zdGFydCA9IHkwK2x3OwotCQkJeV9zdG9wICA9IHkxLWx3OwotCQkJeV9zdGVwICA9IGx3KnBpeGVsc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCXlfc3RhcnQgPSB5MCAtIHMqbHc7Ci0JCQl5X3N0b3AgID0geV9zdGFydCArIGx3OwotCQkJeV9zdGVwICA9IG1heCpwaXhlbHNpemU7Ci0JCX0KLQkJZm9yICh5dSA9IHlfc3RhcnQ7IHl1IDwgeV9zdG9wOyB5dSsrKSB7Ci0JCQlpZiAoeDAgPT0geDEpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh5dSA8IDAgfHwgeXUgPj0gZHB5X3kpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh5X21pbiA8IDAgfHwgeXUgPCB5X21pbikgewotCQkJCXlfbWluID0geXU7Ci0JCQl9Ci0JCQlpZiAoeV9tYXggPCAwIHx8IHl1ID4geV9tYXgpIHsKLQkJCQl5X21heCA9IHl1OwotCQkJfQotCQkJc3JjID0gc2F2ZVtpXS0+ZGF0YSArICh5dS15X3N0YXJ0KSp5X3N0ZXA7Ci0JCQlkc3QgPSB1c2VfZmIgKyB5dSp1c2VfQnBsICsgeDAqcGl4ZWxzaXplOwotCQkJbWVtY3B5KGRzdCwgc3JjLCAoeDEteDApKnBpeGVsc2l6ZSk7Ci0JCX0KLQkJaWYgKHlfbWluID49IDApIHsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIk1hcmstMSAlZCAlZCAlZCAlZFxuIiwgeDAsIHlfbWluLCB4MSwgeV9tYXgrMSk7Ci0JCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeDAsIHlfbWluLCB4MSwgeV9tYXgrMSwgMCk7Ci0JCX0KLQkJc2F2ZVtpXS0+c2F2ZWQgPSAwOwotCX0KLQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiICBEcmF3Qm94OiAlMDRkeCUwNGQrJTA0ZCslMDRkIEI9JWQgcmVzdD0lZCBsdz0lZCAlLjRmXG4iLCB3LCBoLCB4LCB5LCAyKih3K2gpKigyLXJlc3RvcmUpKnBpeGVsc2l6ZSpsdywgcmVzdG9yZSwgbHcsIGRub3d4KCkpOwotCi0JaWYgKHJlc3RvcmUpIHsKLQkJcmV0dXJuOwotCX0KLQotCi0JLyoKLQkgKiB3b3JrIG91dCBzaGFkZS9jb2xvciBmb3IgdGhlIHdpcmVmcmFtZSBsaW5lLCBjb3VsZCBiZSBhIGNvbG9yCi0JICogZm9yIDE2YnBwIG9yIDI0YnBwLgotCSAqLwotCWlmIChzaGFkZSA+IDI1NSkgewotCQlpZiAocGl4ZWxzaXplID09IDIpIHsKLQkJCXVzID0gKHVuc2lnbmVkIHNob3J0KSAoc2hhZGUgJiAweGZmZmYpOwotCQkJY29sb3IgPSAxOwotCQl9IGVsc2UgaWYgKHBpeGVsc2l6ZSA9PSA0KSB7Ci0JCQl1bCA9ICh1bnNpZ25lZCBsb25nKSBzaGFkZTsKLQkJCWNvbG9yID0gMTsKLQkJfSBlbHNlIHsKLQkJCXNoYWRlID0gc2hhZGUgJSAyNTY7Ci0JCX0KLQl9Ci0KLQlmb3IgKGk9MDsgaTw0OyBpKyspICB7Ci0JCWludCBzID0gc2F2ZVtpXS0+c2hpZnQ7Ci0JCWludCB5dSwgeV9taW4gPSAtMSwgeV9tYXggPSAtMTsKLQkJaW50IHlibGFjayA9IC0xLCB4YmxhY2sxID0gLTEsIHhibGFjazIgPSAtMTsKLQkJaW50IHlfc3RhcnQsIHlfc3RvcCwgeV9zdGVwOwotCi0JCWlmIChzYXZlW2ldLT52ZXJ0KSB7Ci0JCQkvKgotCQkJICogbWFrZSB0aGUgbmFycm93IHgncyBiZSBvbiB0aGUgc2NyZWVuLCBsZXQKLQkJCSAqIHRoZSB5J3MgaGFuZyBvZmYgKG5vdCBkcmF3bikuCi0JCQkgKi8KLQkJCXNhdmVbaV0tPngwID0geDAgPSBuZml4KHggKyBzKncgLSBzKmx3LCBkcHlfeCk7Ci0JCQlzYXZlW2ldLT55MCA9IHkwID0geTsKLQkJCXNhdmVbaV0tPngxID0geDEgPSBuZml4KHggKyBzKncgLSBzKmx3ICsgbHcsIGRweV94KTsKLQkJCXNhdmVbaV0tPnkxID0geTEgPSB5ICsgaDsKLQotCQkJLyoKLQkJCSAqIHN0YXJ0IGFuZCBzdG9wIGEgbGluZXdpZHRoIGF3YXkgZnJvbSB0cnVlIGVkZ2UsCi0JCQkgKiB0byBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIGhvcml6b250YWwgbGluZXMuCi0JCQkgKi8KLQkJCXlfc3RhcnQgPSB5MCtsdzsKLQkJCXlfc3RvcCAgPSB5MS1sdzsKLQkJCXlfc3RlcCAgPSBsdypwaXhlbHNpemU7Ci0KLQkJCS8qIGRyYXcgYSBibGFjayBwaXhlbCBmb3IgdGhlIGJvcmRlciBpZiBsdyA+IDEgKi8KLQkJCWlmIChzKSB7Ci0JCQkJeGJsYWNrMSA9IHgxLTE7Ci0JCQl9IGVsc2UgewotCQkJCXhibGFjazEgPSB4MDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBtYWtlIHRoZSB3aWRlIHgncyBiZSBvbiB0aGUgc2NyZWVuLCBsZXQgdGhlIHkncwotCQkJICogaGFuZyBvZmYgKG5vdCBkcmF3bikuCi0JCQkgKi8KLQkJCXNhdmVbaV0tPngwID0geDAgPSBuZml4KHgsICAgICBkcHlfeCk7Ci0JCQlzYXZlW2ldLT55MCA9IHkwID0geSArIHMqaDsKLQkJCXNhdmVbaV0tPngxID0geDEgPSBuZml4KHggKyB3LCBkcHlfeCk7Ci0JCQlzYXZlW2ldLT55MSA9IHkxID0geTAgKyBsdzsKLQkJCXlfc3RhcnQgPSB5MCAtIHMqbHc7Ci0JCQl5X3N0b3AgID0geV9zdGFydCArIGx3OwotCQkJeV9zdGVwICA9IG1heCpwaXhlbHNpemU7Ci0KLQkJCS8qIGRyYXcgYSBibGFjayBwaXhlbHMgZm9yIHRoZSBib3JkZXIgaWYgbHcgPiAxICovCi0JCQlpZiAocykgewotCQkJCXlibGFjayA9IHlfc3RvcCAtIDE7Ci0JCQl9IGVsc2UgewotCQkJCXlibGFjayA9IHlfc3RhcnQ7Ci0JCQl9Ci0JCQl4YmxhY2sxID0geDA7Ci0JCQl4YmxhY2syID0geDEtMTsKLQkJfQotCi0JCS8qIG5vdyBsb29wIG92ZXIgdGhlIGFsbG93ZWQgeSdzIGZvciBlaXRoZXIgY2FzZSAqLwotCQlmb3IgKHl1ID0geV9zdGFydDsgeXUgPCB5X3N0b3A7IHl1KyspIHsKLQkJCWlmICh4MCA9PSB4MSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHl1IDwgMCB8fCB5dSA+PSBkcHlfeSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiByZWNvcmQgbWluIGFuZCBtYXggeSdzIGZvciBtYXJraW5nIHJlY3RhbmdsZTogKi8KLQkJCWlmICh5X21pbiA8IDAgfHwgeXUgPCB5X21pbikgewotCQkJCXlfbWluID0geXU7Ci0JCQl9Ci0JCQlpZiAoeV9tYXggPCAwIHx8IHl1ID4geV9tYXgpIHsKLQkJCQl5X21heCA9IHl1OwotCQkJfQotCi0JCQkvKiBzYXZlIGZiIGRhdGEgZm9yIHRoaXMgbGluZTogKi8KLQkJCXNhdmVbaV0tPnNhdmVkID0gMTsKLQkJCXNyYyA9IHVzZV9mYiArIHl1KnVzZV9CcGwgKyB4MCpwaXhlbHNpemU7Ci0JCQlkc3QgPSBzYXZlW2ldLT5kYXRhICsgKHl1LXlfc3RhcnQpKnlfc3RlcDsKLQkJCW1lbWNweShkc3QsIHNyYywgKHgxLXgwKSpwaXhlbHNpemUpOwotCi0JCQkvKiBhcHBseSB0aGUgc2hhZGUvY29sb3IgdG8gbWFrZSB0aGUgd2lyZWZyYW1lIGxpbmU6ICovCi0JCQlpZiAoISBjb2xvcikgewotCQkJCW1lbXNldChzcmMsIHNoYWRlLCAoeDEteDApKnBpeGVsc2l6ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoYXIgKmNzcmMgPSBzcmM7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKnVzcDsKLQkJCQl1bnNpZ25lZCBsb25nICp1bHA7Ci0JCQkJaW50IGs7Ci0JCQkJZm9yIChrPTA7IGsgPCB4MSAtIHgwOyBrKyspIHsKLQkJCQkJaWYgKHBpeGVsc2l6ZSA9PSA0KSB7Ci0JCQkJCQl1bHAgPSAodW5zaWduZWQgbG9uZyAqKWNzcmM7Ci0JCQkJCQkqdWxwID0gdWw7Ci0JCQkJCX0gZWxzZSBpZiAocGl4ZWxzaXplID09IDIpIHsKLQkJCQkJCXVzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKWNzcmM7Ci0JCQkJCQkqdXNwID0gdXM7Ci0JCQkJCX0KLQkJCQkJY3NyYyArPSBwaXhlbHNpemU7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBhcHBseSBibGFjayBib3JkZXIgZm9yIGx3ID49IDIgKi8KLQkJCWlmIChsdyA+IDEpIHsKLQkJCQlpZiAoeXUgPT0geWJsYWNrKSB7Ci0JCQkJCW1lbXNldChzcmMsIDAsICh4MS14MCkqcGl4ZWxzaXplKTsKLQkJCQl9Ci0JCQkJaWYgKHhibGFjazEgPj0gMCkgewotCQkJCQlzcmMgPSBzcmMgKyAoeGJsYWNrMSAtIHgwKSpwaXhlbHNpemU7Ci0JCQkJCW1lbXNldChzcmMsIDAsIHBpeGVsc2l6ZSk7Ci0JCQkJfQotCQkJCWlmICh4YmxhY2syID49IDApIHsKLQkJCQkJc3JjID0gc3JjICsgKHhibGFjazIgLSB4MCkqcGl4ZWxzaXplOwotCQkJCQltZW1zZXQoc3JjLCAwLCBwaXhlbHNpemUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBtYXJrIGl0IGZvciBzZW5kaW5nOiAqLwotCQlpZiAoc2F2ZVtpXS0+c2F2ZWQpIHsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIk1hcmstMiAlZCAlZCAlZCAlZFxuIiwgeDAsIHlfbWluLCB4MSwgeV9tYXgrMSk7Ci0JCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeDAsIHlfbWluLCB4MSwgeV9tYXgrMSwgMCk7Ci0JCX0KLQl9Ci19Ci0KLWludCBkaXJlY3RfZmJfY29weShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBtYXJrKSB7Ci0JY2hhciAqc3JjLCAqZHN0OwotCWludCB5LCBwaXhlbHNpemUgPSBicHAvODsKLQlpbnQgeG1pbiA9IC0xLCB4bWF4ID0gLTEsIHltaW4gPSAtMSwgeW1heCA9IC0xOwotCWludCBkb19jbXAgPSAyOwotCWRvdWJsZSB0bTsKLQlpbnQgZGIgPSAwOwotCi1pZiAoZGIpIGR0aW1lMCgmdG0pOwotCi0JeDEgPSBuZml4KHgxLCBkcHlfeCk7Ci0JeTEgPSBuZml4KHkxLCBkcHlfeSk7Ci0JeDIgPSBuZml4KHgyLCBkcHlfeCsxKTsKLQl5MiA9IG5maXgoeTIsIGRweV95KzEpOwotCi0JaWYgKHgxID09IHgyKSB7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoeTEgPT0geTIpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JWF9MT0NLOwotCWZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgewotCQlYUkFORFJfU0VUX1RSQVBfUkVUKDAsICJkaXJlY3RfZmJfY29weS1zZXQiKTsKLQkJY29weV9pbWFnZShzY2FubGluZSwgeDEsIHksIHgyIC0geDEsIDEpOwotCQlYUkFORFJfQ0hLX1RSQVBfUkVUKDAsICJkaXJlY3RfZmJfY29weS1jaGsiKTsKLQkJCi0JCXNyYyA9IHNjYW5saW5lLT5kYXRhOwotCQlkc3QgPSBtYWluX2ZiICsgeSAqIG1haW5fYnl0ZXNfcGVyX2xpbmUgKyB4MSAqIHBpeGVsc2l6ZTsKLQotCQlpZiAoZG9fY21wID09IDAgfHwgIW1hcmspIHsKLQkJCW1lbWNweShkc3QsIHNyYywgKHgyIC0geDEpKnBpeGVsc2l6ZSk7Ci0KLQkJfSBlbHNlIGlmIChkb19jbXAgPT0gMSkgewotCQkJaWYgKG1lbWNtcChkc3QsIHNyYywgKHgyIC0geDEpKnBpeGVsc2l6ZSkpIHsKLQkJCQlpZiAoeW1pbiA9PSAtMSB8fCB5IDwgeW1pbikgewotCQkJCQl5bWluID0geTsKLQkJCQl9Ci0JCQkJaWYgKHltYXggPT0gLTEgfHwgeSA+IHltYXgpIHsKLQkJCQkJeW1heCA9IHk7Ci0JCQkJfQotCQkJCW1lbWNweShkc3QsIHNyYywgKHgyIC0geDEpKnBpeGVsc2l6ZSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmIChkb19jbXAgPT0gMikgewotCQkJaW50IG4sIHNoaWZ0LCB4bG8sIHhoaSwgaywgYmxvY2sgPSAzMjsKLQkJCWNoYXIgKmRzdDIsICpzcmMyOwotCi0JCQlmb3IgKGs9MDsgaypibG9jayA8ICh4MiAtIHgxKTsgaysrKSB7Ci0JCQkJc2hpZnQgPSBrKmJsb2NrOwotCQkJCXhsbyA9IHgxICArIHNoaWZ0OwotCQkJCXhoaSA9IHhsbyArIGJsb2NrOwotCQkJCWlmICh4aGkgPiB4MikgewotCQkJCQl4aGkgPSB4MjsKLQkJCQl9Ci0JCQkJbiA9IHhoaSAtIHhsbzsKLQkJCQlpZiAobiA8IDEpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXNyYzIgPSBzcmMgKyBzaGlmdCpwaXhlbHNpemU7Ci0JCQkJZHN0MiA9IGRzdCArIHNoaWZ0KnBpeGVsc2l6ZTsKLQkJCQlpZiAobWVtY21wKGRzdDIsIHNyYzIsIG4qcGl4ZWxzaXplKSkgewotCQkJCQlpZiAoeW1pbiA9PSAtMSB8fCB5IDwgeW1pbikgewotCQkJCQkJeW1pbiA9IHk7Ci0JCQkJCX0KLQkJCQkJaWYgKHltYXggPT0gLTEgfHwgeSA+IHltYXgpIHsKLQkJCQkJCXltYXggPSB5OwotCQkJCQl9Ci0JCQkJCWlmICh4bWluID09IC0xIHx8IHhsbyA8IHhtaW4pIHsKLQkJCQkJCXhtaW4gPSB4bG87Ci0JCQkJCX0KLQkJCQkJaWYgKHhtYXggPT0gLTEgfHwgeGhpID4geG1heCkgewotCQkJCQkJeG1heCA9IHhoaTsKLQkJCQkJfQotCQkJCQltZW1jcHkoZHN0Miwgc3JjMiwgbipwaXhlbHNpemUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlYX1VOTE9DSzsKLQotCWlmIChkb19jbXAgPT0gMCkgewotCQl4bWluID0geDE7Ci0JCXltaW4gPSB5MTsKLQkJeG1heCA9IHgyOwotCQl5bWF4ID0geTI7Ci0JfSBlbHNlIGlmIChkb19jbXAgPT0gMSkgewotCQl4bWluID0geDE7Ci0JCXhtYXggPSB4MjsKLQl9Ci0KLQlpZiAoeG1pbiA8IDAgfHwgeW1pbiA8IDAgfHwgeG1heCA8IDAgfHwgeG1pbiA8IDApIHsKLQkJLyogbm8gZGlmZnMgKi8KLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHhtYXggPCB4MikgewotCQl4bWF4Kys7Ci0JfQotCWlmICh5bWF4IDwgeTIpIHsKLQkJeW1heCsrOwotCX0KLQotCWlmIChtYXJrKSB7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZCh4bWluLCB5bWluLCB4bWF4LCB5bWF4LCAwKTsKLQl9Ci0KLSBpZiAoZGIpIHsKLQlmcHJpbnRmKHN0ZGVyciwgImRpcmVjdF9mYl9jb3B5OiAlZHglZCslZCslZCAtICVkICAlLjRmXG4iLAotCQl4MiAtIHgxLCB5MiAtIHkxLCB4MSwgeTEsIG1hcmssIGR0aW1lKCZ0bSkpOwotIH0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGRvX2JkcHVzaChXaW5kb3cgd21fd2luLCBpbnQgeDAsIGludCB5MCwgaW50IHcwLCBpbnQgaDAsIGludCBiZHgsCi0gICAgaW50IGJkeSwgaW50IGJkc2tpbm55KSB7Ci0KLQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCXNyYVJlY3QgcmVjdDsKLQlzcmFSZWdpb25QdHIgZnJhbWUsIHdob2xlLCB0bXByZWdpb247Ci0JaW50IHR4MSwgdHkxLCB0eDIsIHR5MjsKLQlzdGF0aWMgV2luZG93IGxhc3Rfd21fd2luID0gTm9uZTsKLQlzdGF0aWMgaW50IGxhc3RfeCwgbGFzdF95LCBsYXN0X3csIGxhc3RfaDsKLQlpbnQgZG9fZmJfcHVzaCA9IDA7Ci0JaW50IGRiID0gZGVidWdfc2Nyb2xsOwotCi0JaWYgKHdtX3dpbiA9PSBsYXN0X3dtX3dpbikgewotCQlhdHRyLnggPSBsYXN0X3g7Ci0JCWF0dHIueSA9IGxhc3RfeTsKLQkJYXR0ci53aWR0aCA9IGxhc3RfdzsKLQkJYXR0ci5oZWlnaHQgPSBsYXN0X2g7Ci0JfSBlbHNlIHsKLQkJaWYgKCF2YWxpZF93aW5kb3cod21fd2luLCAmYXR0ciwgMSkpIHsKLQkJCXJldHVybiBkb19mYl9wdXNoOwotCQl9Ci0JCWxhc3Rfd21fd2luID0gd21fd2luOwotCQlsYXN0X3ggPSBhdHRyLng7Ci0JCWxhc3RfeSA9IGF0dHIueTsKLQkJbGFzdF93ID0gYXR0ci53aWR0aDsKLQkJbGFzdF9oID0gYXR0ci5oZWlnaHQ7Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJCRFAgICVkICVkICVkICVkICAlZCAlZCAlZCAgJWQgJWQgJWQgJWRcbiIsCi0JeDAsIHkwLCB3MCwgaDAsIGJkeCwgYmR5LCBiZHNraW5ueSwgbGFzdF94LCBsYXN0X3ksIGxhc3RfdywgbGFzdF9oKTsKLQotCS8qIHdtIGZyYW1lOiAqLwotCXR4MSA9IGF0dHIueDsKLQl0eTEgPSBhdHRyLnk7Ci0JdHgyID0gYXR0ci54ICsgYXR0ci53aWR0aDsKLQl0eTIgPSBhdHRyLnkgKyBhdHRyLmhlaWdodDsKLQotCXdob2xlID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCWlmIChjbGlwc2hpZnQpIHsKLQkJc3JhUmduT2Zmc2V0KHdob2xlLCBjb2ZmX3gsIGNvZmZfeSk7Ci0JfQotCWlmIChzdWJ3aW4pIHsKLQkJc3JhUmduT2Zmc2V0KHdob2xlLCBvZmZfeCwgb2ZmX3kpOwotCX0KLQlmcmFtZSA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLCB0eTEsIHR4MiwgdHkyKTsKLQlzcmFSZ25BbmQoZnJhbWUsIHdob2xlKTsKLQotCS8qIHNjcm9sbGluZyB3aW5kb3c6ICovCi0JdG1wcmVnaW9uID0gc3JhUmduQ3JlYXRlUmVjdCh4MCwgeTAsIHgwICsgdzAsIHkwICsgaDApOwotCXNyYVJnbkFuZCh0bXByZWdpb24sIHdob2xlKTsKLQotCXNyYVJnblN1YnRyYWN0KGZyYW1lLCB0bXByZWdpb24pOwotCXNyYVJnbkRlc3Ryb3kodG1wcmVnaW9uKTsKLQotCWlmICghc3JhUmduRW1wdHkoZnJhbWUpKSB7Ci0JCWRvdWJsZSBkdCA9IDAuMCwgZG07Ci0JCWR0aW1lMCgmZG0pOwotCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IoZnJhbWUpOwotCQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQkJdHgxID0gcmVjdC54MTsKLQkJCXR5MSA9IHJlY3QueTE7Ci0JCQl0eDIgPSByZWN0LngyOwotCQkJdHkyID0gcmVjdC55MjsKLQotCQkJaWYgKGJkc2tpbm55ID4gMCkgewotCQkJCWludCBvayA9IDA7Ci0JCQkJaWYgKG5hYnModHkyLXR5MSkgPD0gYmRza2lubnkpIHsKLQkJCQkJb2sgPSAxOwotCQkJCX0KLQkJCQlpZiAobmFicyh0eDItdHgxKSA8PSBiZHNraW5ueSkgewotCQkJCQlvayA9IDE7Ci0JCQkJfQotCQkJCWlmICghIG9rKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJkeCA+PSAwKSB7Ci0JCQkJaWYgKGJkeCA8IHR4MSB8fCB0eDIgPD0gYmR4KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChiZHkgPj0gMCkgewotCQkJCWlmIChiZHkgPCB0eTEgfHwgdHkyIDw9IGJkeSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2xpcHNoaWZ0KSB7Ci0JCQkJdHgxIC09IGNvZmZfeDsKLQkJCQl0eTEgLT0gY29mZl95OwotCQkJCXR4MiAtPSBjb2ZmX3g7Ci0JCQkJdHkyIC09IGNvZmZfeTsKLQkJCX0KLQkJCWlmIChzdWJ3aW4pIHsKLQkJCQl0eDEgLT0gb2ZmX3g7Ci0JCQkJdHkxIC09IG9mZl95OwotCQkJCXR4MiAtPSBvZmZfeDsKLQkJCQl0eTIgLT0gb2ZmX3k7Ci0JCQl9Ci0KLQkJCWRpcmVjdF9mYl9jb3B5KHR4MSwgdHkxLCB0eDIsIHR5MiwgMSk7Ci0KLQkJCWRvX2ZiX3B1c2grKzsKLQkJCWR0ICs9IGR0aW1lKCZkbSk7Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIiAgQkRQKCVkLCVkLSVkLCVkKSAgZHQ6ICUuNGZcbiIsIHR4MSwgdHkxLCB0eDIsIHR5MiwgZHQpOwotCQl9Ci0JCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQl9Ci0Jc3JhUmduRGVzdHJveSh3aG9sZSk7Ci0Jc3JhUmduRGVzdHJveShmcmFtZSk7Ci0KLQlyZXR1cm4gZG9fZmJfcHVzaDsKLX0KLQotc3RhdGljIGludCBzZXRfeXBhZCh2b2lkKSB7Ci0JaW50IGV2LCBldl90b3QgPSBzY3JfZXZfY250OwotCXN0YXRpYyBXaW5kb3cgbGFzdF93aW4gPSBOb25lOwotCXN0YXRpYyBkb3VibGUgbGFzdF90aW1lID0gMC4wOwotCXN0YXRpYyBpbnQgeV9hY2N1bSA9IDAsIGxhc3Rfc2lnbiA9IDA7Ci0JZG91YmxlIG5vdywgY3V0ID0gMC4xOwotCWludCBkeV9zdW0gPSAwLCB5cyA9IDAsIHNpZ247Ci0JaW50IGZvbnRfc2l6ZSA9IDE1OwotCWludCB3aW5feSwgc2NyX3ksIGxvY19jdXQgPSA0KmZvbnRfc2l6ZSwgeV9jdXQgPSAxMCpmb250X3NpemU7Ci0JCi0JaWYgKCF4cmVjb3JkX3NldF9ieV9rZXlzIHx8ICF4cmVjb3JkX25hbWVfaW5mbykgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHhyZWNvcmRfbmFtZV9pbmZvWzBdID09ICdcMCcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIGV2X3RvdCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHhyZWNvcmRfa2V5c3ltID09IE5vU3ltYm9sKSAgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCF4cmVjb3JkX3Njcm9sbF9rZXlzeW0oeHJlY29yZF9rZXlzeW0pKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIXNjcm9sbF90ZXJtKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIW1hdGNoX3N0cl9saXN0KHhyZWNvcmRfbmFtZV9pbmZvLCBzY3JvbGxfdGVybSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZm9yIChldj0wOyBldiA8IGV2X3RvdDsgZXYrKykgewotCQlkeV9zdW0gKz0gbmFicyhzY3JfZXZbZXZdLmR5KTsKLQkJaWYgKHNjcl9ldltldl0uZHkgPCAwKSB7Ci0JCQl5cy0tOwotCQl9IGVsc2UgaWYgKHNjcl9ldltldl0uZHkgPiAwKSB7Ci0JCQl5cysrOwotCQl9IGVsc2UgewotCQkJeXMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHNjcl9ldltldl0ud2luICE9IHNjcl9ldlswXS53aW4pIHsKLQkJCXlzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzY3JfZXZbZXZdLmR4ICE9IDApIHsKLQkJCXlzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICh5cyAhPSBldl90b3QgJiYgeXMgIT0gLWV2X3RvdCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHlzIDwgMCkgewotCQlzaWduID0gLTE7Ci0JfSBlbHNlIHsKLQkJc2lnbiA9IDE7Ci0JfQotCi0JaWYgKHNpZ24gPiAwKSB7Ci0JCS8qCi0JCSAqIHRoaXMgY2FzZSBpcyBub3QgYXMgdXNlZnVsIGFzIHNjcm9sbGluZyBuZWFyIHRoZQotCQkgKiBib3R0b20gb2YgYSB0ZXJtaW5hbC4gIEJ1dCB0aGVyZSBhcmUgcHJvYmxlbXMgZm9yIGl0IHRvby4KLQkJICovCi0JCXJldHVybiAwOwotCX0KLQotCXdpbl95ID0gc2NyX2V2WzBdLndpbl95ICsgc2NyX2V2WzBdLndpbl9oOwotCXNjcl95ID0gc2NyX2V2WzBdLnkgKyBzY3JfZXZbMF0uaDsKLQlpZiAobmFicyhzY3JfeSAtIHdpbl95KSA+IGxvY19jdXQpIHsKLQkJLyogcmVxdWlyZSBpdCB0byBiZSBuZWFyIHRoZSBib3R0b20uICovCi0JCXJldHVybiAwOwotCX0KLQotCW5vdyA9IGRub3coKTsKLQotCWlmIChub3cgPCBsYXN0X3RpbWUgKyBjdXQpIHsKLQkJaW50IG9rID0gMTsKLQkJaWYgKGxhc3Rfd2luICYmIHNjcl9ldlswXS53aW4gIT0gbGFzdF93aW4pIHsKLQkJCW9rID0gMDsKLQkJfQotCQlpZiAobGFzdF9zaWduICYmIHNpZ24gIT0gbGFzdF9zaWduKSB7Ci0JCQlvayA9IDA7Ci0JCX0KLQkJaWYgKCEgb2spIHsKLQkJCWxhc3Rfd2luID0gTm9uZTsKLQkJCWxhc3Rfc2lnbiA9IDA7Ci0JCQl5X2FjY3VtID0gMDsKLQkJCWxhc3RfdGltZSA9IDAuMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGFzdF93aW4gPSBOb25lOwotCQlsYXN0X3NpZ24gPSAwOwotCQlsYXN0X3RpbWUgPSAwLjA7Ci0JCXlfYWNjdW0gPSAwOwotCX0KLQotCXlfYWNjdW0gKz0gc2lnbiAqIGR5X3N1bTsKLQotCWlmICg0ICogbmFicyh5X2FjY3VtKSA+IHNjcl9ldlswXS5oICYmIHlfY3V0KSB7Ci0JCTsJLyogVEJEICovCi0JfQotCi0JbGFzdF9zaWduID0gc2lnbjsKLQlsYXN0X3dpbiA9IHNjcl9ldlswXS53aW47Ci0JbGFzdF90aW1lID0gbm93OwotCi0JcmV0dXJuIHlfYWNjdW07Ci19Ci0KLXN0YXRpYyB2b2lkIHNjYWxlX21hcmsoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgbWFyaykgewotCWludCBzID0gMjsKLQl4MSA9IG5maXgoeDEgLSBzLCBkcHlfeCk7Ci0JeTEgPSBuZml4KHkxIC0gcywgZHB5X3kpOwotCXgyID0gbmZpeCh4MiArIHMsIGRweV94KzEpOwotCXkyID0gbmZpeCh5MiArIHMsIGRweV95KzEpOwotCXNjYWxlX2FuZF9tYXJrX3JlY3QoeDEsIHkxLCB4MiwgeTIsIG1hcmspOwotfQotCi0jZGVmaW5lIFBVU0hfVEVTVChuKSAgXAotaWYgKG4pIHsgXAotCWRvdWJsZSBkdCA9IDAuMCwgdG07IGR0aW1lMCgmdG0pOyBcCi0JZnByaW50ZihzdGRlcnIsICJQVVNILS0tXG4iKTsgXAotCXdoaWxlIChkdCA8IDIuMCkgeyByZmJQRSg1MDAwMCk7IGR0ICs9IGR0aW1lKCZ0bSk7IH0gXAotCWZwcmludGYoc3RkZXJyLCAiLS0tUFVTSFxuIik7IFwKLX0KLQotaW50IGJhdGNoX2R4c1tdLCBiYXRjaF9keXNbXTsKLXNyYVJlZ2lvblB0ciBiYXRjaF9yZWdbXTsKLXZvaWQgYmF0Y2hfcHVzaChpbnQgbmNyLCBkb3VibGUgZGVsYXkpOwotCi1zdGF0aWMgaW50IHB1c2hfc2NyX2V2KGRvdWJsZSAqYWdlLCBpbnQgdHlwZSwgaW50IGJkcHVzaCwgaW50IGJkeCwgaW50IGJkeSwKLSAgICBpbnQgYmRza2lubnksIGludCBmaXJzdF9wdXNoKSB7Ci0JV2luZG93IGZyYW1lLCB3aW4sIHdpbjA7Ci0JaW50IHgsIHksIHcsIGgsIHd4LCB3eSwgd3csIHdoLCBkeCwgZHk7Ci0JaW50IHgwLCB5MCwgdzAsIGgwOwotCWludCBueCwgbnksIG53LCBuaDsKLQlpbnQgZHJldCA9IDEsIGRvX2ZiX3B1c2ggPSAwLCBvYnNjdXJlZDsKLQlpbnQgZXYsIGV2X3RvdCA9IHNjcl9ldl9jbnQ7Ci0JZG91YmxlIHRtLCBkdCwgc3QsIHdhaXR0aW1lID0gMC4xMjU7Ci0JZG91YmxlIG1heF9hZ2UgPSAqYWdlOwotCWludCBkYiA9IGRlYnVnX3Njcm9sbCwgcnJhdGUgPSBnZXRfcmVhZF9yYXRlKCk7Ci0Jc3JhUmVnaW9uUHRyIGJhY2tmaWxsLCB3aG9sZSwgdG1wcmVnaW9uLCB0bXByZWdpb24yOwotCWludCBsaW5rLCBsYXRlbmN5LCBuZXRyYXRlOwotCWludCB5cGFkID0gMDsKLQlkb3VibGUgbGFzdF9zY3JvbGxfZXZlbnRfc2F2ZSA9IGxhc3Rfc2Nyb2xsX2V2ZW50OwotCWludCBmYXN0X3B1c2ggPSAwLCByYzsKLQotCS8qIHdlIHJldHVybiB0aGUgb2xkZXN0IG9uZS4gKi8KLQkqYWdlID0gMC4wOwotCi0JaWYgKGV2X3RvdCA9PSAwKSB7Ci0JCXJldHVybiBkcmV0OwotCX0KLQotCWxpbmsgPSBsaW5rX3JhdGUoJmxhdGVuY3ksICZuZXRyYXRlKTsKLQotCWlmIChsaW5rID09IExSX0RJQUxVUCkgewotCQl3YWl0dGltZSAqPSA1OwotCX0gZWxzZSBpZiAobGluayA9PSBMUl9CUk9BREJBTkQpIHsKLQkJd2FpdHRpbWUgKj0gMzsKLQl9IGVsc2UgaWYgKGxhdGVuY3kgPiA4MCB8fCBuZXRyYXRlIDwgNDApIHsKLQkJd2FpdHRpbWUgKj0gMzsKLQl9Ci0KLQliYWNrZmlsbCA9IHNyYVJnbkNyZWF0ZSgpOwotCXdob2xlID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCWlmIChjbGlwc2hpZnQpIHsKLQkJc3JhUmduT2Zmc2V0KHdob2xlLCBjb2ZmX3gsIGNvZmZfeSk7Ci0JfQotCWlmIChzdWJ3aW4pIHsKLQkJc3JhUmduT2Zmc2V0KHdob2xlLCBvZmZfeCwgb2ZmX3kpOwotCX0KLQotCXdpbjAgPSBzY3JfZXZbMF0ud2luOwotCXgwID0gc2NyX2V2WzBdLndpbl94OwotCXkwID0gc2NyX2V2WzBdLndpbl95OwotCXcwID0gc2NyX2V2WzBdLndpbl93OwotCWgwID0gc2NyX2V2WzBdLndpbl9oOwotCi0JeXBhZCA9IHNldF95cGFkKCk7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ5cGFkOiAlZCAgZHlbMF06ICVkIGV2X3RvdDogJWRcbiIsIHlwYWQsIHNjcl9ldlswXS5keSwgZXZfdG90KTsKLQotCWZvciAoZXY9MDsgZXYgPCBldl90b3Q7IGV2KyspIHsKLQkJZG91YmxlIGFnOwotCQotCQl4ICAgPSBzY3JfZXZbZXZdLng7Ci0JCXkgICA9IHNjcl9ldltldl0ueTsKLQkJdyAgID0gc2NyX2V2W2V2XS53OwotCQloICAgPSBzY3JfZXZbZXZdLmg7Ci0JCWR4ICA9IHNjcl9ldltldl0uZHg7Ci0JCWR5ICA9IHNjcl9ldltldl0uZHk7Ci0JCXdpbiA9IHNjcl9ldltldl0ud2luOwotCQl3eCAgPSBzY3JfZXZbZXZdLndpbl94OwotCQl3eSAgPSBzY3JfZXZbZXZdLndpbl95OwotCQl3dyAgPSBzY3JfZXZbZXZdLndpbl93OwotCQl3aCAgPSBzY3JfZXZbZXZdLndpbl9oOwotCQlueCAgPSBzY3JfZXZbZXZdLm5ld194OwotCQlueSAgPSBzY3JfZXZbZXZdLm5ld195OwotCQludyAgPSBzY3JfZXZbZXZdLm5ld193OwotCQluaCAgPSBzY3JfZXZbZXZdLm5ld19oOwotCQlzdCAgPSBzY3JfZXZbZXZdLnQ7Ci0KLQkJYWcgPSAoZG5vdygpIC0gc2VydmVydGltZV9kaWZmKSAtIHN0OwotCQlpZiAoYWcgPiAqYWdlKSB7Ci0JCQkqYWdlID0gYWc7Ci0JCX0KLQotCQlpZiAoZGFicyhhZykgPiBtYXhfYWdlKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicHVzaF9zY3JfZXY6IFRPTyBPTEQ6ICUuNGYgOjogKCUuNGYgLSAlLjRmKSAiCi0gICAgIi0gJS40ZiBcbiIsIGFnLCBkbm93KCksIHNlcnZlcnRpbWVfZGlmZiwgc3QpOwkJCQkKLQkJCWRyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicHVzaF9zY3JfZXY6IEFHRTogICAgICUuNGZcbiIsIGFnKTsKLQkJfQotCQlpZiAod2luICE9IHdpbjApIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJwdXNoX3Njcl9ldjogRElGRiBXSU46IDB4JWx4ICE9IDB4JWx4XG4iLCB3aW4sIHdpbjApOwotCQkJZHJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAod3ggIT0geDAgfHwgd3kgIT0geTApIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJwdXNoX3Njcl9ldjogV0lOIFNISUZUOiAlZCAlZCwgJWQgJWQiLCB3eCwgeDAsIHd5LCB5MCk7Ci0JCQlkcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh3dyAhPSB3MCB8fCB3aCAhPSBoMCkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInB1c2hfc2NyX2V2OiBXSU4gUkVTSVpFOiAlZCAlZCwgJWQgJWQiLCB3dywgdzAsIHdoLCBoMCk7Ci0JCQlkcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh3IDwgMSB8fCBoIDwgMSB8fCB3dyA8IDEgfHwgd2ggPCAxKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicHVzaF9zY3JfZXY6IE5FR0FUSVZFIGgvdzogJWQgJWQgJWQgJWRcbiIsIHcsIGgsIHd3LCB3aCk7Ci0JCQlkcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicHVzaF9zY3JfZXY6IGdvdDogJWQgeDogJTRkIHk6ICUzZCIKLSAgICAiIHc6ICU0ZCBoOiAlM2QgIGR4OiAlZCBkeTogJWQgJWR4JWQrJWQrJWQgICB3aW46IDB4JWx4XG4iLAotICAgIGV2LCB4LCB5LCB3LCBoLCBkeCwgZHksIHcsIGgsIHgsIHksIHdpbik7Ci0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tIGdvdDogJWQgeDogJTRkIHk6ICUzZCIKLSAgICAiIHc6ICU0ZCBoOiAlM2QgJWR4JWQrJWQrJWRcbiIsCi0gICAgZXYsIHd4LCB3eSwgd3csIHdoLCB3dywgd2gsIHd4LCB3eSk7Ci0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tIGdvdDogJWQgeDogJTRkIHk6ICUzZCIKLSAgICAiIHc6ICU0ZCBoOiAlM2QgJWR4JWQrJWQrJWRcbiIsCi0gICAgZXYsIG54LCBueSwgbncsIG5oLCBudywgbmgsIG54LCBueSk7Ci0KLQkJZnJhbWUgPSBOb25lOwotCQlpZiAoeHJlY29yZF93bV93aW5kb3cpIHsKLQkJCWZyYW1lID0geHJlY29yZF93bV93aW5kb3c7Ci0JCX0KLQkJaWYgKCEgZnJhbWUpIHsKLQkJCVhfTE9DSzsKLQkJCWZyYW1lID0gcXVlcnlfcG9pbnRlcihyb290d2luKTsKLQkJCVhfVU5MT0NLOwotCQl9Ci0JCWlmICghIGZyYW1lKSB7Ci0JCQlmcmFtZSA9IHdpbjsKLQkJfQotCi0JCWR0aW1lMCgmdG0pOwotCi0JCXRtcHJlZ2lvbiA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQkJaWYgKGNsaXBzaGlmdCkgewotCQkJc3JhUmduT2Zmc2V0KHRtcHJlZ2lvbiwgY29mZl94LCBjb2ZmX3kpOwotCQl9Ci0JCWlmIChzdWJ3aW4pIHsKLQkJCXNyYVJnbk9mZnNldCh0bXByZWdpb24sIG9mZl94LCBvZmZfeSk7Ci0JCX0KLQkJdG1wcmVnaW9uMiA9IHNyYVJnbkNyZWF0ZVJlY3Qod3gsIHd5LCB3eCt3dywgd3krd2gpOwotCQlzcmFSZ25BbmQodG1wcmVnaW9uMiwgd2hvbGUpOwotCQlzcmFSZ25TdWJ0cmFjdCh0bXByZWdpb24sIHRtcHJlZ2lvbjIpOwotCQlzcmFSZ25EZXN0cm95KHRtcHJlZ2lvbjIpOwotCi0JCS8qIGRvIHRoZSB3bSBmcmFtZSBqdXN0IGluY2FzZSB0aGUgYWJvdmUgaXMgYm9ndXMgdG9vLiAqLwotCQlpZiAoZnJhbWUgJiYgZnJhbWUgIT0gd2luKSB7Ci0JCQlpbnQgaywgZ290ayA9IC0xOwotCQkJZm9yIChrID0gc3RhY2tfbGlzdF9udW0gLSAxOyBrID49IDA7IGstLSkgewotCQkJCWlmIChzdGFja19saXN0W2tdLndpbiA9PSBmcmFtZSAmJgotCQkJCSAgICBzdGFja19saXN0W2tdLmZldGNoZWQgJiYgCi0JCQkJICAgIHN0YWNrX2xpc3Rba10udmFsaWQgJiYgCi0JCQkJICAgIHN0YWNrX2xpc3Rba10ubWFwX3N0YXRlID09IElzVmlld2FibGUpIHsKLQkJCQkJZ290ayA9IGs7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChnb3RrICE9IC0xKSB7Ci0JCQkJaW50IHR4MSwgdHkxLCB0eDIsIHR5MjsKLQkJCQl0eDEgPSBzdGFja19saXN0W2dvdGtdLng7Ci0JCQkJdHkxID0gc3RhY2tfbGlzdFtnb3RrXS55OwotCQkJCXR4MiA9IHR4MSArIHN0YWNrX2xpc3RbZ290a10ud2lkdGg7Ci0JCQkJdHkyID0gdHkxICsgc3RhY2tfbGlzdFtnb3RrXS5oZWlnaHQ7Ci0JCQkJdG1wcmVnaW9uMiA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLHR5MSx0eDIsdHkyKTsKLQkJCQlzcmFSZ25BbmQodG1wcmVnaW9uMiwgd2hvbGUpOwotCQkJCXNyYVJnblN1YnRyYWN0KHRtcHJlZ2lvbiwgdG1wcmVnaW9uMik7Ci0JCQkJc3JhUmduRGVzdHJveSh0bXByZWdpb24yKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFhYWCBOZWVkIHRvIGFsc28gY2xpcDoKLQkJICoJY2hpbGRyZW4gb2Ygd2luCi0JCSAqCXNpYmxpbmdzIG9mIHdpbiBoaWdoZXIgaW4gc3RhY2tpbmcgb3JkZXIuCi0JCSAqIGlnbm9yZSBmb3Igbm93Li4uIHByb2JhYmx5IHdpbGwgbWFrZSBzb21lIGFwcHMKLQkJICogYWN0IHZlcnkgc3RyYW5nZWx5LgotCQkgKi8KLQkJaWYgKHlwYWQpIHsKLQkJCWlmICh5cGFkIDwgMCkgewotCQkJCWlmIChoID4gLXlwYWQpIHsKLQkJCQkJaCArPSB5cGFkOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXlwYWQgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGggPiB5cGFkKSB7Ci0JCQkJCXkgKz0geXBhZDsKLQkJCQl9IGVsc2UgewotCQkJCQl5cGFkID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmFzdF9wdXNoKSB7Ci0JCQlpbnQgbmJhdGNoID0gMDsgCi0JCQlkb3VibGUgZGVsYXksIGQxID0gMC4xLCBkMiA9IDAuMDI7Ci0JCQlyYyA9IHRyeV9jb3B5cmVjdChmcmFtZSwgZnJhbWUsIHgsIHksIHcsIGgsIGR4LCBkeSwgJm9ic2N1cmVkLAotCQkJICAgIHRtcHJlZ2lvbiwgd2FpdHRpbWUsICZuYmF0Y2gpOwotCi0JCQlpZiAoZmlyc3RfcHVzaCkgewotCQkJCWRlbGF5ID0gZDE7Ci0JCQl9IGVsc2UgewotCQkJCWRlbGF5ID0gZDI7Ci0JCQl9Ci0KLQkJCWJhdGNoX3B1c2gobmJhdGNoLCBkZWxheSk7Ci0JCQlmYl9wdXNoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IHRyeV9jb3B5cmVjdChmcmFtZSwgZnJhbWUsIHgsIHksIHcsIGgsIGR4LCBkeSwgJm9ic2N1cmVkLAotCQkJICAgIHRtcHJlZ2lvbiwgd2FpdHRpbWUsIE5VTEwpOwotCQkJaWYgKHJjKSB7Ci0JCQkJbGFzdF9zY3JvbGxfdHlwZSA9IHR5cGU7Ci0JCQkJZHRpbWUwKCZsYXN0X3Njcm9sbF9ldmVudCk7Ci0KLQkJCQlkb19mYl9wdXNoKys7Ci0JCQkJdXJnZW50X3VwZGF0ZSA9IDE7Ci0JCQkJc3JhUmduRGVzdHJveSh0bXByZWdpb24pOwotUFVTSF9URVNUKDApOwotCQkJfQotCQl9Ci0KLQkJaWYgKCEgcmMpIHsKLQkJCWRyZXQgPSAwOwotCQkJc3JhUmduRGVzdHJveSh0bXByZWdpb24pOwotCQkJYnJlYWs7CQotCQl9Ci0JCWR0ID0gZHRpbWUoJnRtKTsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiAgdHJ5X2NvcHlyZWN0IGR0OiAlLjRmXG4iLCBkdCk7Ci0KLQkJaWYgKGV2ID4gMCkgewotCQkJc3JhUmduT2Zmc2V0KGJhY2tmaWxsLCBkeCwgZHkpOwotCQkJc3JhUmduQW5kKGJhY2tmaWxsLCB3aG9sZSk7Ci0JCX0KLQotCQlpZiAoeXBhZCkgewotCQkJaWYgKHlwYWQgPCAwKSB7Ci0JCQkJbnkgKz0geXBhZDsJCi0JCQkJbmggLT0geXBhZDsKLQkJCX0gZWxzZSB7Ci0JCQkJOwotCQkJfQotCQl9Ci0KLQkJdG1wcmVnaW9uID0gc3JhUmduQ3JlYXRlUmVjdChueCwgbnksIG54ICsgbncsIG55ICsgbmgpOwotCQlzcmFSZ25BbmQodG1wcmVnaW9uLCB3aG9sZSk7Ci0JCXNyYVJnbk9yKGJhY2tmaWxsLCB0bXByZWdpb24pOwotCQlzcmFSZ25EZXN0cm95KHRtcHJlZ2lvbik7Ci0JfQotCi0JLyogdHJ5IHRvIHVwZGF0ZSB0aGUgYmFja2ZpbGwgcmVnaW9uIChuZXcgd2luZG93IGNvbnRlbnRzKSAqLwotCWlmIChkcmV0ICE9IDApIHsKLQkJZG91YmxlIGVzdCwgd2luX2FyZWEgPSAwLjAsIGFyZWEgPSAwLjA7Ci0JCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCQlzcmFSZWN0IHJlY3Q7Ci0JCWludCB0eDEsIHR5MSwgdHgyLCB0eTI7Ci0KLQkJdG1wcmVnaW9uID0gc3JhUmduQ3JlYXRlUmVjdCh4MCwgeTAsIHgwICsgdzAsIHkwICsgaDApOwotCQlzcmFSZ25BbmQodG1wcmVnaW9uLCB3aG9sZSk7Ci0KLQkJc3JhUmduQW5kKGJhY2tmaWxsLCB0bXByZWdpb24pOwotCi0JCWl0ZXIgPSBzcmFSZ25HZXRJdGVyYXRvcih0bXByZWdpb24pOwotCQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQkJdHgxID0gcmVjdC54MTsKLQkJCXR5MSA9IHJlY3QueTE7Ci0JCQl0eDIgPSByZWN0LngyOwotCQkJdHkyID0gcmVjdC55MjsKLQotCQkJd2luX2FyZWEgKz0gKHR4MiAtIHR4MSkqKHR5MiAtIHR5MSk7Ci0JCX0KLQkJc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCi0JCXNyYVJnbkRlc3Ryb3kodG1wcmVnaW9uKTsKLQotCi0JCWl0ZXIgPSBzcmFSZ25HZXRJdGVyYXRvcihiYWNrZmlsbCk7Ci0JCXdoaWxlIChzcmFSZ25JdGVyYXRvck5leHQoaXRlciwgJnJlY3QpKSB7Ci0JCQl0eDEgPSByZWN0LngxOwotCQkJdHkxID0gcmVjdC55MTsKLQkJCXR4MiA9IHJlY3QueDI7Ci0JCQl0eTIgPSByZWN0LnkyOwotCi0JCQlhcmVhICs9ICh0eDIgLSB0eDEpKih0eTIgLSB0eTEpOwotCQl9Ci0JCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQotCQllc3QgPSAoYXJlYSAqIChicHAvOCkpIC8gKDEwMDAwMDAuMCAqIHJyYXRlKTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgIGFyZWEgJS4xZiB3aW5fYXJlYSAlLjFmIGVzdDogJS40ZiIsIGFyZWEsIHdpbl9hcmVhLCBlc3QpOwotCQlpZiAoYXJlYSA+IDAuOTAgKiB3aW5fYXJlYSkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgQVJFQV9UT09fTVVDSCIpOwotCQkJZHJldCA9IDA7Ci0JCX0gZWxzZSBpZiAoZXN0ID4gMC42KSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICBFU1RfVE9PX0xBUkdFIik7Ci0JCQlkcmV0ID0gMDsKLQkJfSBlbHNlIGlmIChhcmVhIDw9IDAuMCkgewotCQkJOwotCQl9IGVsc2UgewotCQkJZHRpbWUwKCZ0bSk7Ci0JCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IoYmFja2ZpbGwpOwotCQkJd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCQl0eDEgPSByZWN0LngxOwotCQkJCXR5MSA9IHJlY3QueTE7Ci0JCQkJdHgyID0gcmVjdC54MjsKLQkJCQl0eTIgPSByZWN0LnkyOwotCi0JCQkJaWYgKGNsaXBzaGlmdCkgewotCQkJCQl0eDEgLT0gY29mZl94OwotCQkJCQl0eTEgLT0gY29mZl95OwotCQkJCQl0eDIgLT0gY29mZl94OwotCQkJCQl0eTIgLT0gY29mZl95OwotCQkJCX0KLQkJCQlpZiAoc3Vid2luKSB7Ci0JCQkJCXR4MSAtPSBvZmZfeDsKLQkJCQkJdHkxIC09IG9mZl95OwotCQkJCQl0eDIgLT0gb2ZmX3g7Ci0JCQkJCXR5MiAtPSBvZmZfeTsKLQkJCQl9Ci0JCQkJdHgxID0gbmZpeCh0eDEsIGRweV94KTsKLQkJCQl0eTEgPSBuZml4KHR5MSwgZHB5X3kpOwotCQkJCXR4MiA9IG5maXgodHgyLCBkcHlfeCsxKTsKLQkJCQl0eTIgPSBuZml4KHR5MiwgZHB5X3krMSk7Ci0KLQkJCQlkdGltZSgmdG0pOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgREZDKCVkLCVkLSVkLCVkKSIsIHR4MSwgdHkxLCB0eDIsIHR5Mik7Ci0JCQkJZGlyZWN0X2ZiX2NvcHkodHgxLCB0eTEsIHR4MiwgdHkyLCAxKTsKLQkJCQlpZiAoZmFzdF9wdXNoKSB7Ci0JCQkJCWZiX3B1c2goKTsKLQkJCQl9Ci0JCQkJZG9fZmJfcHVzaCsrOwotUFVTSF9URVNUKDApOwotCQkJfQotCQkJc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCi0JCQlkdCA9IGR0aW1lKCZ0bSk7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICBkZmMtLS0tIGR0OiAlLjRmIiwgZHQpOwotCi0JCX0KLWlmIChkYiAmJiAgZHJldCkgZnByaW50ZihzdGRlcnIsICIgKioqKiBkcmV0PSVkIiwgZHJldCk7Ci1pZiAoZGIgJiYgIWRyZXQpIGZwcmludGYoc3RkZXJyLCAiIC0tLS0gZHJldD0lZCIsIGRyZXQpOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotCi1pZiAoZGIgJiYgYmRwdXNoKSBmcHJpbnRmKHN0ZGVyciwgIkJEUFVTSC1USU1FOiAgMHglbHhcbiIsIHhyZWNvcmRfd21fd2luZG93KTsKLQotCWlmIChiZHB1c2ggJiYgeHJlY29yZF93bV93aW5kb3cgIT0gTm9uZSkgewotCQlpbnQgeCwgeSwgdywgaDsKLQkJeCA9IHNjcl9ldlswXS54OwotCQl5ID0gc2NyX2V2WzBdLnk7Ci0JCXcgPSBzY3JfZXZbMF0udzsKLQkJaCA9IHNjcl9ldlswXS5oOwotCQlkb19mYl9wdXNoICs9IGRvX2JkcHVzaCh4cmVjb3JkX3dtX3dpbmRvdywgeCwgeSwgdywgaCwKLQkJICAgIGJkeCwgYmR5LCBiZHNraW5ueSk7IAotCQlpZiAoZmFzdF9wdXNoKSB7Ci0JCQlmYl9wdXNoKCk7Ci0JCX0KLQl9Ci0KLQlpZiAoZG9fZmJfcHVzaCkgewotCQlkdGltZTAoJnRtKTsKLQkJZmJfcHVzaCgpOwotCQlkdCA9IGR0aW1lKCZ0bSk7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICIgIGZiX3B1c2ggZHQ6ICUuNGYiLCBkdCk7Ci0JCWlmIChzY2FsaW5nKSB7Ci0JCQlzdGF0aWMgZG91YmxlIGxhc3RfdGltZSA9IDAuMDsKLQkJCWRvdWJsZSBub3cgPSBkbm93KCksIGRlbGF5ID0gMC40LCBmaXJzdF93YWl0ID0gMy4wOwotCQkJZG91YmxlIHRyYXRlOwotCQkJaW50IHJlcGVhdGluZywgbGF0LCByYXRlOwotCQkJaW50IGxpbmsgPSBsaW5rX3JhdGUoJmxhdCwgJnJhdGUpOwotCQkJaW50IHNraXBfZmlyc3QgPSAwOwotCi0JCQlpZiAobGluayA9PSBMUl9ESUFMVVAgfHwgcmF0ZSA8IDM1KSB7Ci0JCQkJZGVsYXkgKj0gNDsKLQkJCX0gZWxzZSBpZiAobGluayAhPSBMUl9MQU4gfHwgcmF0ZSA8IDEwMCkgewotCQkJCWRlbGF5ICo9IDI7Ci0JCQl9Ci0KLQkJCXRyYXRlID0gdHlwaW5nX3JhdGUoMC4wLCAmcmVwZWF0aW5nKTsKLQkJCQotCQkJaWYgKHhyZWNvcmRfc2V0X2J5X21vdXNlIHx8IHJlcGVhdGluZyA+PSAzKSB7Ci0JCQkJaWYgKG5vdyA+IGxhc3Rfc2Nyb2xsX2V2ZW50X3NhdmUgKyBmaXJzdF93YWl0KSB7Ci0JCQkJCXNraXBfZmlyc3QgPSAxOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNraXBfZmlyc3QpIHsKLQkJCQkvKiAKLQkJCQkgKiB0cnkgbm90IHRvIHNlbmQgdGhlIGZpcnN0IG9uZSwgYnV0IGEKLQkJCQkgKiBzaW5nbGUga2V5c3Ryb2tlIHNjcm9sbCB3b3VsZCBiZSBPSy4KLQkJCQkgKi8KLQkJCX0gZWxzZSBpZiAobm93ID4gbGFzdF90aW1lICsgZGVsYXkpIHsKLQotCQkJCXNjYWxlX21hcmsoeDAsIHkwLCB4MCArIHcwLCB5MCArIGgwLCAxKTsKLQkJCQlsYXN0X2NvcHlyZWN0X2ZpeCA9IG5vdzsKLQkJCX0KLQkJCWxhc3RfdGltZSA9IG5vdzsKLQkJfQotCX0KLQotCXNyYVJnbkRlc3Ryb3koYmFja2ZpbGwpOwotCXNyYVJnbkRlc3Ryb3kod2hvbGUpOwotCXJldHVybiBkcmV0OwotfQotCi1zdGF0aWMgdm9pZCBnZXRfY2xpZW50X3JlZ2lvbnMoaW50ICpyZXEsIGludCAqbW9kLCBpbnQgKmNweSwgaW50ICpudW0pICB7Ci0JCi0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaTsKLQlyZmJDbGllbnRQdHIgY2w7Ci0KLQkqcmVxID0gMDsKLQkqbW9kID0gMDsKLQkqY3B5ID0gMDsKLQkqbnVtID0gMDsKLQotCWkgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaSkpICkgewotCQlpZiAodXNlX3RocmVhZHMpIExPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQkJKnJlcSArPSBzcmFSZ25Db3VudFJlY3RzKGNsLT5yZXF1ZXN0ZWRSZWdpb24pOwotCQkqbW9kICs9IHNyYVJnbkNvdW50UmVjdHMoY2wtPm1vZGlmaWVkUmVnaW9uKTsKLQkJKmNweSArPSBzcmFSZ25Db3VudFJlY3RzKGNsLT5jb3B5UmVnaW9uKTsKLQkJKm51bSArPSAxOwotCQlpZiAodXNlX3RocmVhZHMpIFVOTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaSk7Ci19Ci0KLS8qCi0gKiBXcmFwcGVyIHRvIGFwcGx5IHRoZSByZmJEb0NvcHlSZWdpb24gdGFraW5nIGludG8gYWNjb3VudCBpZiBzY2FsaW5nCi0gKiBpcyBiZWluZyBkb25lLiAgTm90ZSB0aGF0IGNvcHlyZWN0IHVuZGVyIHRoZSBzY2FsaW5nIGNhc2UgaXMgb2Z0ZW4KLSAqIG9ubHkgYXBwcm94aW1hdGUuCi0gKi8KLWludCBEQ1JfTm9ybWFsID0gMDsKLWludCBEQ1JfRkJPbmx5ID0gMTsKLWludCBEQ1JfRGlyZWN0ID0gMjsKLQotdm9pZCBkb19jb3B5cmVnaW9uKHNyYVJlZ2lvblB0ciByZWdpb24sIGludCBkeCwgaW50IGR5LCBpbnQgbW9kZSkgIHsKLQlzcmFSZWN0YW5nbGVJdGVyYXRvciAqaXRlcjsKLQlzcmFSZWN0IHJlY3Q7Ci0JaW50IEJwcDAgPSBicHAvOCwgQnBwOwotCWludCB4MSwgeTEsIHgyLCB5Miwgdywgc3RyaWRlLCBzdHJpZGUwOwotCWludCBzeDEsIHN5MSwgc3gyLCBzeTIsIHNkeCwgc2R5OwotCWludCByZXEsIG1vZCwgY3B5LCBuY2xpOwotCWNoYXIgKmRzdCA9IE5VTEwsICpzcmMgPSBOVUxMOwotCi0JbGFzdF9jb3B5cmVjdCA9IGRub3coKTsKLQotCWlmIChyZmJfZmIgPT0gbWFpbl9mYiAmJiAhIHJvdGF0aW5nICYmIG1vZGUgPT0gRENSX05vcm1hbCkgewotCQkvKiBub3JtYWwgY2FzZSwgbm8gLXNjYWxlIG9yIC04dG8yNCAqLwotCQlnZXRfY2xpZW50X3JlZ2lvbnMoJnJlcSwgJm1vZCwgJmNweSwgJm5jbGkpOwotaWYgKDAgfHwgZGVidWdfc2Nyb2xsID4gMSkgZnByaW50ZihzdGRlcnIsICI+Pj4tcmZiRG9Db3B5UmVjdCByZXE6ICVkIG1vZDogJWQgY3B5OiAlZFxuIiwgcmVxLCBtb2QsIGNweSk7IAotCi0JCXJmYkRvQ29weVJlZ2lvbihzY3JlZW4sIHJlZ2lvbiwgZHgsIGR5KTsKLQotCQlnZXRfY2xpZW50X3JlZ2lvbnMoJnJlcSwgJm1vZCwgJmNweSwgJm5jbGkpOwotaWYgKDAgfHwgZGVidWdfc2Nyb2xsID4gMSkgZnByaW50ZihzdGRlcnIsICI8PDwtcmZiRG9Db3B5UmVjdCByZXE6ICVkIG1vZDogJWQgY3B5OiAlZFxuIiwgcmVxLCBtb2QsIGNweSk7IAotCi0JCXJldHVybjsKLQl9Ci0KLQkvKiByYXJlciBjYXNlLCB3ZSBuZWVkIHRvIGNhbGwgcmZiRG9Db3B5UmVjdCB3aXRoIHNjYWxlZCB4eSAqLwotCXN0cmlkZTAgPSBkcHlfeCAqIEJwcDA7Ci0KLQlpdGVyID0gc3JhUmduR2V0UmV2ZXJzZUl0ZXJhdG9yKHJlZ2lvbiwgZHggPCAwLCBkeSA8IDApOwotCXdoaWxlKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJaW50IGosIGMsIHQ7Ci0KLQkJeDEgPSByZWN0LngxOwotCQl5MSA9IHJlY3QueTE7Ci0JCXgyID0gcmVjdC54MjsKLQkJeTIgPSByZWN0LnkyOwotCi0JCWZvciAoYz0gMDsgYyA8IDI7IGMrKykgewotCi0JCQlCcHAgPSBCcHAwOwotCQkJc3RyaWRlID0gc3RyaWRlMDsKLQotCQkJaWYgKGMgPT0gMCkgewotCQkJCWRzdCA9IG1haW5fZmIgKyB5MSpzdHJpZGUgKyB4MSpCcHA7Ci0JCQkJc3JjID0gbWFpbl9mYiArICh5MS1keSkqc3RyaWRlICsgKHgxLWR4KSpCcHA7Ci0KLQkJCX0gZWxzZSBpZiAoYyA9PSAxKSB7Ci0JCQkJaWYgKCFjbWFwOHRvMjQgfHwgIWNtYXA4dG8yNF9mYikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNtYXA4dG8yNF9mYiA9PSByZmJfZmIpIHsKLQkJCQkJaWYgKG1vZGUgPT0gRENSX0ZCT25seSkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgaWYgKG1vZGUgPT0gRENSX0RpcmVjdCkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgaWYgKG1vZGUgPT0gRENSX05vcm1hbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJjb3B5cmVjdDogY21hcDh0bzI0X2ZiOiBtb2RlPSVkXG4iLCBtb2RlKTsKLQkJCQlpZiAoY21hcDh0bzI0KSB7Ci0JCQkJCWlmIChkZXB0aCA8PSA4KSB7Ci0JCQkJCQlCcHAgICAgPSA0ICogQnBwMDsKLQkJCQkJCXN0cmlkZSA9IDQgKiBzdHJpZGUwOwotCQkJCQl9IGVsc2UgaWYgKGRlcHRoIDw9IDE2KSB7Ci0JCQkJCQlCcHAgICAgPSAyICogQnBwMDsKLQkJCQkJCXN0cmlkZSA9IDIgKiBzdHJpZGUwOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRzdCA9IGNtYXA4dG8yNF9mYiArIHkxKnN0cmlkZSArIHgxKkJwcDsKLQkJCQlzcmMgPSBjbWFwOHRvMjRfZmIgKyAoeTEtZHkpKnN0cmlkZSArICh4MS1keCkqQnBwOwotCQkJfQotCi0JCQl3ID0gKHgyIC0geDEpKkJwcDsgCi0JCQkKLQkJCWlmIChkeSA8IDApIHsKLQkJCQlmb3IgKGo9eTE7IGo8eTI7IGorKykgewotCQkJCQltZW1tb3ZlKGRzdCwgc3JjLCB3KTsKLQkJCQkJZHN0ICs9IHN0cmlkZTsKLQkJCQkJc3JjICs9IHN0cmlkZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRzdCArPSAoeTIgLSB5MSAtIDEpKnN0cmlkZTsKLQkJCQlzcmMgKz0gKHkyIC0geTEgLSAxKSpzdHJpZGU7Ci0JCQkJZm9yIChqPXkyLTE7IGo+PXkxOyBqLS0pIHsKLQkJCQkJbWVtbW92ZShkc3QsIHNyYywgdyk7Ci0JCQkJCWRzdCAtPSBzdHJpZGU7Ci0JCQkJCXNyYyAtPSBzdHJpZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG1vZGUgPT0gRENSX0ZCT25seSkgewotCQkJY29udGludWU7Ci0JCX0KLQotCi0JCWlmIChzY2FsaW5nKSB7Ci0JCQlzeDEgPSAoKGRvdWJsZSkgeDEgLyBkcHlfeCkgKiBzY2FsZWRfeDsKLQkJCXN5MSA9ICgoZG91YmxlKSB5MSAvIGRweV95KSAqIHNjYWxlZF95OwotCQkJc3gyID0gKChkb3VibGUpIHgyIC8gZHB5X3gpICogc2NhbGVkX3g7Ci0JCQlzeTIgPSAoKGRvdWJsZSkgeTIgLyBkcHlfeSkgKiBzY2FsZWRfeTsKLQkJCXNkeCA9ICgoZG91YmxlKSBkeCAvIGRweV94KSAqIHNjYWxlZF94OwotCQkJc2R5ID0gKChkb3VibGUpIGR5IC8gZHB5X3kpICogc2NhbGVkX3k7Ci0JCX0gZWxzZSB7Ci0JCQlzeDEgPSB4MTsKLQkJCXN5MSA9IHkxOwotCQkJc3gyID0geDI7Ci0JCQlzeTIgPSB5MjsKLQkJCXNkeCA9IGR4OwotCQkJc2R5ID0gZHk7Ci0JCX0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgInNhLi4gJWQgJWQgJWQgJWQgJWQgJWRcbiIsIHN4MSwgc3kxLCBzeDIsIHN5Miwgc2R4LCBzZHkpOwotCi0JCWlmIChyb3RhdGluZykgewotCQkJcm90YXRlX2Nvb3JkcyhzeDEsIHN5MSwgJnN4MSwgJnN5MSwgLTEsIC0xKTsKLQkJCXJvdGF0ZV9jb29yZHMoc3gyLCBzeTIsICZzeDIsICZzeTIsIC0xLCAtMSk7Ci0JCQlpZiAocm90YXRpbmcgPT0gUk9UQVRFX1gpIHsKLQkJCQlzZHggPSAtc2R4OwotCQkJfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfWSkgewotCQkJCXNkeSA9IC1zZHk7Ci0JCQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV9YWSkgewotCQkJCXNkeCA9IC1zZHg7Ci0JCQkJc2R5ID0gLXNkeTsKLQkJCX0gZWxzZSBpZiAocm90YXRpbmcgPT0gUk9UQVRFXzkwKSB7Ci0JCQkJdCA9IHNkeDsKLQkJCQlzZHggPSAtc2R5OwotCQkJCXNkeSA9IHQ7Ci0JCQl9IGVsc2UgaWYgKHJvdGF0aW5nID09IFJPVEFURV85MFgpIHsKLQkJCQl0ID0gc2R4OwotCQkJCXNkeCA9IHNkeTsKLQkJCQlzZHkgPSB0OwotCQkJfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfOTBZKSB7Ci0JCQkJdCA9IHNkeDsKLQkJCQlzZHggPSAtc2R5OwotCQkJCXNkeSA9IC10OwotCQkJfSBlbHNlIGlmIChyb3RhdGluZyA9PSBST1RBVEVfMjcwKSB7Ci0JCQkJdCA9IHNkeDsKLQkJCQlzZHggPSBzZHk7Ci0JCQkJc2R5ID0gLXQ7Ci0JCQl9Ci0JCX0KLQotCQkvKiBYWFggLTE/ICovCi0JCWlmIChzeDIgPCAwKSBzeDIgPSAwOwotCQlpZiAoc3kyIDwgMCkgc3kyID0gMDsKLQkJCi0JCWlmIChzeDIgPCBzeDEpIHsKLQkJCXQgPSBzeDE7Ci0JCQlzeDEgPSBzeDI7Ci0JCQlzeDIgPSB0OwotCQl9Ci0JCWlmIChzeTIgPCBzeTEpIHsKLQkJCXQgPSBzeTE7Ci0JCQlzeTEgPSBzeTI7Ci0JCQlzeTIgPSB0OwotCQl9Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJzYi4uICVkICVkICVkICVkICVkICVkXG4iLCBzeDEsIHN5MSwgc3gyLCBzeTIsIHNkeCwgc2R5KTsKLQotCQlpZiAobW9kZSA9PSBEQ1JfRGlyZWN0KSB7Ci0JCQlyZmJDbGllbnRJdGVyYXRvclB0ciBpOwotCQkJcmZiQ2xpZW50UHRyIGNsOwotCQkJc3JhUmVnaW9uUHRyIHIgPSBzcmFSZ25DcmVhdGVSZWN0KHN4MSwgc3kxLCBzeDIsIHN5Mik7Ci0KLQkJCWkgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCQkJd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpKSkgKSB7Ci0JCQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0JCQkJcmZiU2VuZENvcHlSZWdpb24oY2wsIHIsIHNkeCwgc2R5KTsKLQkJCQlpZiAodXNlX3RocmVhZHMpIFVOTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCQkJfQotCQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGkpOwotCQkJc3JhUmduRGVzdHJveShyKTsKLQkJCQotCQl9IGVsc2UgewotCQkJcmZiRG9Db3B5UmVjdChzY3JlZW4sIHN4MSwgc3kxLCBzeDIsIHN5Miwgc2R4LCBzZHkpOwotCQl9Ci0JfQotCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLX0KLQotdm9pZCBiYXRjaF9jb3B5cmVnaW9uKHNyYVJlZ2lvblB0ciogcmVnaW9uLCBpbnQgKmR4LCBpbnQgKmR5LCBpbnQgbmNyLCBkb3VibGUgZGVsYXkpICB7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaTsKLQlyZmJDbGllbnRQdHIgY2w7Ci0JaW50IGssIGRpcmVjdCwgbW9kZSwgbnJlY3RzID0gMCwgYmFkID0gMDsKLQlkb3VibGUgdDEsIHQyLCBzdGFydCA9IGRub3coKTsKLQotCWZvciAoaz0wOyBrIDwgbmNyOyBrKyspIHsKLQkJc3JhUmVjdGFuZ2xlSXRlcmF0b3IgKml0ZXI7Ci0JCXNyYVJlY3QgcmVjdDsKLQotCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IocmVnaW9uW2tdKTsKLQkJd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCWludCB4MSA9IHJlY3QueDE7Ci0JCQlpbnQgeTEgPSByZWN0LnkxOwotCQkJaW50IHgyID0gcmVjdC54MjsKLQkJCWludCB5MiA9IHJlY3QueTI7Ci0JCQlpbnQgeW0gPSBkcHlfeSAqIChuY2FjaGUrMSk7Ci0JCQlpbnQgeG0gPSBkcHlfeDsKLQkJCWlmICh4MSA+IHhtIHx8IHkxID4geW0gfHwgeDIgPiB4bSB8fCB5MiA+IHltKSB7Ci0JCQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiYmF0Y2hfY29weXJlZ2lvbjogQkFEIFJFQ1RBTkdMRTogJWQsJWQgJWQsJWRcbiIsIHgxLCB5MSwgeDIsIHkyKTsKLQkJCQliYWQgPSAxOwotCQkJfQotCQkJaWYgKHgxIDwgMCB8fCB5MSA8IDAgfHwgeDIgPCAwIHx8IHkyIDwgMCkgewotCQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgImJhdGNoX2NvcHlyZWdpb246IEJBRCBSRUNUQU5HTEU6ICVkLCVkICVkLCVkXG4iLCB4MSwgeTEsIHgyLCB5Mik7Ci0JCQkJYmFkID0gMTsKLQkJCX0KLQkJfQotCQlzcmFSZ25SZWxlYXNlSXRlcmF0b3IoaXRlcik7Ci0JCW5yZWN0cyArPSBzcmFSZ25Db3VudFJlY3RzKHJlZ2lvbltrXSk7Ci0JfQotCWlmIChiYWQgfHwgbnJlY3RzID09IDApIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChkZWxheSA8IDAuMCkgewotCQlkZWxheSA9IDAuMTsKLQl9Ci0JaWYgKCFmYl9wdXNoX3dhaXQoZGVsYXksIEZCX0NPUFl8RkJfTU9EKSkgewotCQlpZiAodXNlX3RocmVhZHMpIHVzbGVlcCgxMDAgKiAxMDAwKTsKLQkJZmJfcHVzaF93YWl0KDAuNzUsIEZCX0NPUFl8RkJfTU9EKTsKLQl9Ci0KLQl0MSA9IGRub3coKTsKLQotCWJhZCA9IDA7Ci0JaSA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpKSkgKSB7Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLQkJaWYgKGNsLT51YmxlbiAhPSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImJhdGNoX2NvcHlyZWdpb246ICoqKiBCQUQgdWJsZW4gIT0gMDogJWRcbiIsIGNsLT51Ymxlbik7Ci0JCQliYWQrKzsKLQkJfQotCi0JCWlmICh1c2VfdGhyZWFkcykgVU5MT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpKTsKLQotCWlmIChiYWQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWkgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaSkpICkgewotCQlyZmJGcmFtZWJ1ZmZlclVwZGF0ZU1zZyAqZnU7Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBMT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0KLQkJZnUgPSAocmZiRnJhbWVidWZmZXJVcGRhdGVNc2cgKiljbC0+dXBkYXRlQnVmOwotCQlmdS0+blJlY3RzID0gU3dhcDE2SWZMRSgodWludDE2X3QpKG5yZWN0cykpOwotCQlmdS0+dHlwZSA9IHJmYkZyYW1lYnVmZmVyVXBkYXRlOwotCi0JCWlmIChjbC0+dWJsZW4gIT0gMCkgZnByaW50ZihzdGRlcnIsICJiYXRjaF9jb3B5cmVnaW9uOiAqKiogQkFELTIgdWJsZW4gIT0gMDogJWRcbiIsIGNsLT51Ymxlbik7Ci0KLQkJY2wtPnVibGVuID0gc3pfcmZiRnJhbWVidWZmZXJVcGRhdGVNc2c7Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBVTkxPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGkpOwotCi0JaWYgKHJmYl9mYiA9PSBtYWluX2ZiICYmICFyb3RhdGluZykgewotCQlkaXJlY3QgPSAwOwotCQltb2RlID0gRENSX0ZCT25seTsKLQl9IGVsc2UgewotCQlkaXJlY3QgPSAxOwotCQltb2RlID0gRENSX0RpcmVjdDsKLQl9Ci0JZm9yIChrPTA7IGsgPCBuY3I7IGsrKykgewotCQlkb19jb3B5cmVnaW9uKHJlZ2lvbltrXSwgZHhba10sIGR5W2tdLCBtb2RlKTsKLQl9Ci0KLQl0MiA9IGRub3coKTsKLQotCWkgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaSkpICkgewotCi0JCWlmICh1c2VfdGhyZWFkcykgTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCi0JCWlmICghZGlyZWN0KSAgewotCQkJZm9yIChrPTA7IGsgPCBuY3I7IGsrKykgewotCQkJCXJmYlNlbmRDb3B5UmVnaW9uKGNsLCByZWdpb25ba10sIGR4W2tdLCBkeVtrXSk7Ci0JCQl9Ci0JCX0KLQkJcmZiU2VuZFVwZGF0ZUJ1ZihjbCk7Ci0KLQkJaWYgKHVzZV90aHJlYWRzKSBVTkxPQ0soY2wtPnVwZGF0ZU11dGV4KTsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGkpOwotCi0JbGFzdF9jb3B5cmVjdCA9IGRub3coKTsKLQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiYmF0Y2hfY29weXJlZ2lvbjogbnJlY3RzOiAlZCBucmVnaW9uczogJWQgIHRvdD0lLjRmIHQxMD0lLjRmIHQyMT0lLjRmIHQzMj0lLjRmICAlLjRmXG4iLAotICAgIG5yZWN0cywgbmNyLCBsYXN0X2NvcHlyZWN0IC0gc3RhcnQsIHQxIC0gc3RhcnQsIHQyIC0gdDEsIGxhc3RfY29weXJlY3QgLSB0MiwgZG5vd3goKSk7Ci0KLX0KLQotdm9pZCBiYXRjaF9wdXNoKGludCBucmVnLCBkb3VibGUgZGVsYXkpIHsKLQlpbnQgazsKLQliYXRjaF9jb3B5cmVnaW9uKGJhdGNoX3JlZywgYmF0Y2hfZHhzLCBiYXRjaF9keXMsIG5yZWcsIGRlbGF5KTsKLQkvKiBYWFggWSAqLwotCWZiX3B1c2goKTsKLQlmb3IgKGs9MDsgayA8IG5yZWc7IGsrKykgewotCQlzcmFSZ25EZXN0cm95KGJhdGNoX3JlZ1trXSk7Ci0JfQotfQotCi12b2lkIGZiX3B1c2godm9pZCkgewotCWludCByZXEwLCBtb2QwLCBjcHkwLCByZXExLCBtb2QxLCBjcHkxLCBuY2xpOwotCWludCBkYiA9IChkZWJ1Z19zY3JvbGwgfHwgZGVidWdfd2lyZWZyYW1lKTsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpOwotCXJmYkNsaWVudFB0ciBjbDsKLQotCWlmICh1c2VfdGhyZWFkcykgewotCQlyZXR1cm47Ci0JfQotCQotaWYgKGRiKQlnZXRfY2xpZW50X3JlZ2lvbnMoJnJlcTAsICZtb2QwLCAmY3B5MCwgJm5jbGkpOwotCi0JaSA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0Jd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpKSkgKSB7Ci0JCWlmICh1c2VfdGhyZWFkcykgTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCQlpZiAoY2wtPnNvY2sgPj0gMCAmJiAhY2wtPm9uSG9sZCAmJiBGQl9VUERBVEVfUEVORElORyhjbCkgJiYKLQkJICAgICFzcmFSZ25FbXB0eShjbC0+cmVxdWVzdGVkUmVnaW9uKSkgewotCQkJaWYgKCFyZmJTZW5kRnJhbWVidWZmZXJVcGRhdGUoY2wsIGNsLT5tb2RpZmllZFJlZ2lvbikpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIioqKiByZmJTZW5kRnJhbWVidWZmZXJVcGRhdGUgKkZBSUxFRCogIzFcbiIpOwotCQkJCWlmIChjbC0+dWJsZW4pIGZwcmludGYoc3RkZXJyLCAiKioqIGZiX3B1c2ggdWJsZW4gbm90IHplcm86ICVkXG4iLCBjbC0+dWJsZW4pOwotCQkJCWlmICh1c2VfdGhyZWFkcykgVU5MT0NLKGNsLT51cGRhdGVNdXRleCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2wtPnVibGVuKSBmcHJpbnRmKHN0ZGVyciwgIioqKiBmYl9wdXNoIHVibGVuIE5PVCBaRVJPOiAlZFxuIiwgY2wtPnVibGVuKTsKLQkJfQotCQlpZiAodXNlX3RocmVhZHMpIFVOTE9DSyhjbC0+dXBkYXRlTXV0ZXgpOwotCX0KLQlyZmJSZWxlYXNlQ2xpZW50SXRlcmF0b3IoaSk7Ci0KLWlmIChkYikgewotCWdldF9jbGllbnRfcmVnaW9ucygmcmVxMSwgJm1vZDEsICZjcHkxLCAmbmNsaSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbkZCX3B1c2g6IHJlcTogJWQvJWQgIG1vZDogJWQvJWQgIGNweTogJWQvJWQgICUuNGZcbiIsCi0JcmVxMCwgcmVxMSwgbW9kMCwgbW9kMSwgY3B5MCwgY3B5MSwgZG5vd3goKSk7Ci19Ci0KLX0KLQotaW50IGZiX3B1c2hfd2FpdChkb3VibGUgbWF4X3dhaXQsIGludCBmbGFncykgewotCWRvdWJsZSB0bSwgZHQgPSAwLjA7Ci0JaW50IHJlcSwgbW9kLCBjcHksIG5jbGk7Ci0JaW50IG9rID0gMCwgZmlyc3QgPSAxOwotCi0JZHRpbWUwKCZ0bSk7CQotCXdoaWxlIChkdCA8IG1heF93YWl0KSB7Ci0JCWludCBkb25lID0gMTsKLQkJZmJfcHVzaCgpOwotCQlnZXRfY2xpZW50X3JlZ2lvbnMoJnJlcSwgJm1vZCwgJmNweSwgJm5jbGkpOwotCQlpZiAoZmxhZ3MgJiBGQl9DT1BZICYmIGNweSkgewotCQkJZG9uZSA9IDA7Ci0JCX0KLQkJaWYgKGZsYWdzICYgRkJfTU9EICYmIG1vZCkgewotCQkJZG9uZSA9IDA7Ci0JCX0KLQkJaWYgKGZsYWdzICYgRkJfUkVRICYmIHJlcSkgewotCQkJZG9uZSA9IDA7Ci0JCX0KLQkJaWYgKGRvbmUpIHsKLQkJCW9rID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmaXJzdCkgewotCQkJZmlyc3QgPSAwOwotCQkJY29udGludWU7CQotCQl9Ci0KLQkJcmZiQ0ZEKDApOwotCQl1c2xlZXAoMTAwMCk7Ci0JCWR0ICs9IGR0aW1lKCZ0bSk7Ci0JfQotCXJldHVybiBvazsKLX0KLQotLyogCi0gKiB1dGlsaXR5IHJvdXRpbmUgZm9yIENvcHlSZWN0IG9mIHRoZSB3aW5kb3cgKGJ1dCBub3QgQ29weVJlZ2lvbikKLSAqLwotc3RhdGljIGludCBjcmZpeChpbnQgeCwgaW50IGR4LCBpbnQgTHgpIHsKLQkvKiBhZGp1c3QgeCBzbyB0aGF0IGNvcHkgc291cmNlIGlzIG9uIHNjcmVlbiAqLwotCWlmIChkeCA+IDApIHsKLQkJaWYgKHgtZHggPCAwKSB7Ci0JCQkvKiBvZmYgb24gdGhlIGxlZnQgKi8KLQkJCXggPSBkeDsJCi0JCX0KLQl9IGVsc2UgewotCQlpZiAoeC1keCA+PSBMeCkgewotCQkJLyogb2ZmIG9uIHRoZSByaWdodCAqLwotCQkJeCA9IEx4ICsgZHggLSAxOwotCQl9Ci0JfQotCXJldHVybiB4OwotfQotCi10eXBlZGVmIHN0cnVjdCBzY3JvbGxfcmVzdWx0IHsKLQlXaW5kb3cgd2luOwotCWRvdWJsZSB0aW1lOwotCWludCByZXN1bHQ7Ci19IHNjcm9sbF9yZXN1bHRfdDsKLQotI2RlZmluZSBTQ1JfUkVTVUxUU19NQVggMjU2Ci1zdGF0aWMgc2Nyb2xsX3Jlc3VsdF90IHNjcm9sbF9yZXN1bHRzW1NDUl9SRVNVTFRTX01BWF07Ci0KLXN0YXRpYyBpbnQgc2Nyb2xsYWJpbGl0eShXaW5kb3cgd2luLCBpbnQgc2V0KSB7Ci0JZG91YmxlIG9sZGVzdCA9IC0xLjA7Ci0JaW50IGksIGluZGV4ID0gLTEsIG5leHRfaW5kZXggPSAtMTsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQotCWlmIChmaXJzdCkgewotCQlmb3IgKGk9MDsgaTxTQ1JfUkVTVUxUU19NQVg7IGkrKykgewotCQkJc2Nyb2xsX3Jlc3VsdHNbaV0ud2luID0gTm9uZTsKLQkJCXNjcm9sbF9yZXN1bHRzW2ldLnRpbWUgPSAwLjA7Ci0JCQlzY3JvbGxfcmVzdWx0c1tpXS5yZXN1bHQgPSAwOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlpZiAod2luID09IE5vbmUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzZXQgPT0gU0NSX05PTkUpIHsKLQkJLyogbG9va3VwIGNhc2UgKi8KLQkJZm9yIChpPTA7IGk8U0NSX1JFU1VMVFNfTUFYOyBpKyspIHsKLQkJCWlmICh3aW4gPT0gc2Nyb2xsX3Jlc3VsdHNbaV0ud2luKSB7Ci0JCQkJcmV0dXJuIHNjcm9sbF9yZXN1bHRzW2ldLnJlc3VsdDsKLQkJCX0KLQkJCWlmIChzY3JvbGxfcmVzdWx0c1tpXS53aW4gPT0gTm9uZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaT0wOyBpPFNDUl9SRVNVTFRTX01BWDsgaSsrKSB7Ci0JCWlmIChvbGRlc3QgPT0gLTEuMCB8fCBzY3JvbGxfcmVzdWx0c1tpXS50aW1lIDwgb2xkZXN0KSB7Ci0JCQluZXh0X2luZGV4ID0gaTsKLQkJCW9sZGVzdCA9IHNjcm9sbF9yZXN1bHRzW2ldLnRpbWU7Ci0JCX0KLQkJaWYgKHdpbiA9PSBzY3JvbGxfcmVzdWx0c1tpXS53aW4pIHsKLQkJCWluZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChuZXh0X2luZGV4ID49IDAgJiYgc2Nyb2xsX3Jlc3VsdHNbaV0ud2luID09IE5vbmUpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHNldCA9PSBTQ1JfU1VDQ0VTUykgewotCQlzZXQgPSAxOwotCX0gZWxzZSBpZiAoc2V0ID09IFNDUl9GQUlMKSB7Ci0JCXNldCA9IC0xOwotCX0gZWxzZSB7Ci0JCXNldCA9IDA7Ci0JfQotCWlmIChpbmRleCA9PSAtMSkgewotCQlzY3JvbGxfcmVzdWx0c1tuZXh0X2luZGV4XS53aW4gPSB3aW47Ci0JCXNjcm9sbF9yZXN1bHRzW25leHRfaW5kZXhdLnRpbWUgPSBkbm93KCk7Ci0JCXNjcm9sbF9yZXN1bHRzW25leHRfaW5kZXhdLnJlc3VsdCA9IHNldDsKLQl9IGVsc2UgewotCQlpZiAoc2Nyb2xsX3Jlc3VsdHNbaW5kZXhdLnJlc3VsdCA9PSAxKSB7Ci0JCQkvKgotCQkJICogb25jZSBhIHN1Y2Nlc3MsIGFsd2F5cyBhIHN1Y2Nlc3MsIHVudGlsIHRoZXkKLQkJCSAqIGZvcmdldCBhYm91dCB1cy4uLgotCQkJICovCi0JCQlzZXQgPSAxOwotCQl9IGVsc2UgewotCQkJc2Nyb2xsX3Jlc3VsdHNbaW5kZXhdLnJlc3VsdCA9IHNldDsKLQkJfQotCQlzY3JvbGxfcmVzdWx0c1tpbmRleF0udGltZSA9IGRub3coKTsKLQl9Ci0KLQlyZXR1cm4gc2V0OwotfQotCi12b2lkIGVhdF92aWV3b25seV9pbnB1dChpbnQgbWF4X2VhdCwgaW50IGtlZXApIHsKLQlpbnQgaSwgZ3AsIGdrOwotCQotCWZvciAoaT0wOyBpPG1heF9lYXQ7IGkrKykgewotCQlpbnQgY29udCA9IDA7Ci0JCWdwID0gZ290X3BvaW50ZXJfY2FsbHM7Ci0JCWdrID0gZ290X2tleWJvYXJkX2NhbGxzOwotCQlyZmJDRkQoMCk7Ci0JCWlmIChnb3RfcG9pbnRlcl9jYWxscyA+IGdwKSAgewotCQkJaWYgKGRlYnVnX3BvaW50ZXIpIHsKLQkJCQlyZmJMb2coImVhdF92aWV3b25seV9pbnB1dDogcG9pbnRlcjogJWRcbiIsIGkpOwotCQkJfQotCQkJY29udCsrOwotCQl9Ci0JCWlmIChnb3Rfa2V5Ym9hcmRfY2FsbHMgPiBnaykgIHsKLQkJCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQkJCXJmYkxvZygiZWF0X3ZpZXdvbmx5X2lucHV0OiBrZXlib2FyZDogJWRcbiIsIGkpOwotCQkJfQotCQkJY29udCsrOwotCQl9Ci0JCWlmIChpID49IGtlZXAgLSAxICYmICEgY29udCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZWF0X3BvaW50ZXIoaW50IG1heF9wdHJfZWF0LCBpbnQga2VlcCkgewotCWludCBpLCBjb3VudCA9IDAsICBncCA9IGdvdF9wb2ludGVyX2lucHV0OwotCi0JZm9yIChpPTA7IGk8bWF4X3B0cl9lYXQ7IGkrKykgewotCQlyZmJDRkQoMCk7Ci0JCWlmIChnb3RfcG9pbnRlcl9pbnB1dCA+IGdwKSAgewotCQkJY291bnQrKzsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIkdQKi0lZFxuIiwgaSk7Ci0JCQlncCA9IGdvdF9wb2ludGVyX2lucHV0OwotCQl9IGVsc2UgaWYgKGkgPiBrZWVwKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9iZHB1c2goaW50IHR5cGUsIGRvdWJsZSAqbGFzdF9iZHB1c2gsIGludCAqcHVzaGl0KSB7Ci0JZG91YmxlIG5vdywgZGVsYXkgPSAwLjA7Ci0JaW50IGxpbmssIGxhdGVuY3ksIG5ldHJhdGU7Ci0KLQkqcHVzaGl0ID0gMDsKLQotCWlmICh0eXBlID09IFNDUl9NT1VTRSkgewotCQlkZWxheSA9IHNjcl9tb3VzZV9iZHB1c2hfdGltZTsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gU0NSX0tFWSkgewotCQlkZWxheSA9IHNjcl9rZXlfYmRwdXNoX3RpbWU7Ci0JfQotCi0JbGluayA9IGxpbmtfcmF0ZSgmbGF0ZW5jeSwgJm5ldHJhdGUpOwotCWlmIChsaW5rID09IExSX0RJQUxVUCkgewotCQlkZWxheSAqPSAxLjU7Ci0JfSBlbHNlIGlmIChsaW5rID09IExSX0JST0FEQkFORCkgewotCQlkZWxheSAqPSAxLjI1OwotCX0KLQotCWR0aW1lMCgmbm93KTsKLQlpZiAoZGVsYXkgPiAwLjAgJiYgbm93ID4gKmxhc3RfYmRwdXNoICsgZGVsYXkpIHsKLQkJKnB1c2hpdCA9IDE7Ci0JCSpsYXN0X2JkcHVzaCA9IG5vdzsKLQl9Ci19Ci0KLXZvaWQgbWFya19mb3JfeGRhbWFnZShpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewotCWludCB0eDEsIHR5MSwgdHgyLCB0eTI7Ci0Jc3JhUmVnaW9uUHRyIHRtcHJlZ2lvbjsKLQotCWlmICghIHVzZV94ZGFtYWdlKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eDEgPSBuZml4KHgsIGRweV94KTsKLQl0eTEgPSBuZml4KHksIGRweV95KTsKLQl0eDIgPSBuZml4KHggKyB3LCBkcHlfeCsxKTsKLQl0eTIgPSBuZml4KHkgKyBoLCBkcHlfeSsxKTsKLQotCXRtcHJlZ2lvbiA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLCB0eTEsIHR4MiwgdHkyKTsKLQlhZGRfcmVnaW9uX3hkYW1hZ2UodG1wcmVnaW9uKTsKLQlzcmFSZ25EZXN0cm95KHRtcHJlZ2lvbik7Ci19Ci0KLXZvaWQgbWFya19yZWdpb25fZm9yX3hkYW1hZ2Uoc3JhUmVnaW9uUHRyIHJlZ2lvbikgewotCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCXNyYVJlY3QgcmVjdDsKLQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IocmVnaW9uKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQlpbnQgeDEgPSByZWN0LngxOwotCQlpbnQgeTEgPSByZWN0LnkxOwotCQlpbnQgeDIgPSByZWN0LngyOwotCQlpbnQgeTIgPSByZWN0LnkyOwotCQltYXJrX2Zvcl94ZGFtYWdlKHgxLCB5MSwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0JfQotCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLX0KLQotdm9pZCBzZXRfeGRhbWFnZV9tYXJrKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0Jc3JhUmVnaW9uUHRyIHJlZ2lvbjsKLQotCWlmICghIHVzZV94ZGFtYWdlKSB7Ci0JCXJldHVybjsKLQl9Ci0JbWFya19mb3JfeGRhbWFnZSh4LCB5LCB3LCBoKTsKLQotCWlmICh4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrID09IDAuMCkgewotCQl4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrID0gZG5vdygpICsgMi4wOwotCX0KLQotCWlmICh4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrX3JlZ2lvbiA9PSBOVUxMKSB7Ci0JCXhkYW1hZ2Vfc2NoZWR1bGVkX21hcmtfcmVnaW9uID0gc3JhUmduQ3JlYXRlKCk7Ci0JfQotCXJlZ2lvbiA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCArIHcsIHkgKyB3KTsKLQlzcmFSZ25Pcih4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrX3JlZ2lvbiwgcmVnaW9uKTsKLQlzcmFSZ25EZXN0cm95KHJlZ2lvbik7Ci19Ci0KLXN0YXRpYyBpbnQgcmVwZWF0X2NoZWNrKGRvdWJsZSBsYXN0X2tleV9zY3JvbGwpIHsKLQlpbnQgcmVwZWF0aW5nOwotCWRvdWJsZSByYXRlID0gdHlwaW5nX3JhdGUoMC4wLCAmcmVwZWF0aW5nKTsKLQlkb3VibGUgbm93ID0gZG5vdygpLCBkZWxheSA9IDAuNTsKLQlpZiAocmF0ZSA+IDIuMCAmJiByZXBlYXRpbmcgJiYgbm93ID4gbGFzdF9rZXlfc2Nyb2xsICsgZGVsYXkpIHsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX3hyZWNvcmRfa2V5cyh2b2lkKSB7Ci0Jc3RhdGljIGludCBsYXN0X3d4LCBsYXN0X3d5LCBsYXN0X3d3LCBsYXN0X3doOwotCWRvdWJsZSBzcGluID0gMC4wLCB0bSwgdG5vdzsKLQlpbnQgc2NyX2NudCA9IDAsIGlucHV0ID0gMCwgc2Nyb2xsX3JlcDsKLQlpbnQgZ2V0X291dCwgZ290X29uZSA9IDAsIGZsdXNoMSA9IDAsIGZsdXNoMiA9IDA7Ci0JaW50IGdrLCBnazAsIHJldCA9IDAsIGRiID0gZGVidWdfc2Nyb2xsOwotCWludCBmYWlsID0gMDsKLQlpbnQgbGluaywgbGF0ZW5jeSwgbmV0cmF0ZTsKLQotCXN0YXRpYyBkb3VibGUgbGFzdF9rZXlfc2Nyb2xsID0gMC4wOwotCXN0YXRpYyBkb3VibGUgcGVyc2lzdF9zdGFydCA9IDAuMDsKLQlzdGF0aWMgZG91YmxlIGxhc3RfYmRwdXNoID0gMC4wOwotCXN0YXRpYyBpbnQgcGVyc2lzdF9jb3VudCA9IDA7Ci0JaW50IHNjcm9sbF9rZXlzeW0gPSAwOwotCWRvdWJsZSBsYXN0X3Njcm9sbCwgc2Nyb2xsX3BlcnNpc3QgPSBzY3Jfa2V5X3BlcnNpc3Q7Ci0JZG91YmxlIHNwaW5fZmFjID0gMS4wLCBzY3JvbGxfZmFjID0gMi4wLCBub3Njcm9sbF9mYWMgPSAwLjc1OwotCWRvdWJsZSBtYXhfc3BpbiwgbWF4X2xvbmdfc3BpbiA9IDAuMzsKLQlkb3VibGUgc2V0X3JlcGVhdF9pbjsKLQlzdGF0aWMgZG91YmxlIHNldF9yZXBlYXQgPSAwLjA7Ci0KLQotCVJBV0ZCX1JFVCgwKQotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuIDA7Ci0KLQlzZXRfcmVwZWF0X2luID0gc2V0X3JlcGVhdDsKLQlzZXRfcmVwZWF0ID0gMC4wOwotCi0JZ2V0X291dCA9IDE7Ci0JaWYgKGdvdF9rZXlib2FyZF9pbnB1dCkgewotCQlnZXRfb3V0ID0gMDsKLQl9Ci0KLQlkdGltZTAoJnRub3cpOwotCWlmICh0bm93IDwgbGFzdF9rZXlfc2Nyb2xsICsgc2Nyb2xsX3BlcnNpc3QpIHsKLQkJZ2V0X291dCA9IDA7Ci0JfQotCi0JaWYgKHNldF9yZXBlYXRfaW4gPiAwLjAgJiYgdG5vdyA8IGxhc3Rfa2V5X3Njcm9sbCArIHNldF9yZXBlYXRfaW4pIHsKLQkJZ2V0X291dCA9IDA7Ci0JfQotCi0JaWYgKGdldF9vdXQpIHsKLQkJcGVyc2lzdF9zdGFydCA9IDAuMDsKLQkJcGVyc2lzdF9jb3VudCA9IDA7Ci0JCWxhc3RfYmRwdXNoID0gMC4wOwotCQlpZiAoeHJlY29yZGluZykgewotCQkJeHJlY29yZF93YXRjaCgwLCBTQ1JfS0VZKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZiAwCi0JLyogbm90IHVzZWQgZm9yIGtleWJvYXJkIHlldCAqLwotCXNjcm9sbF9yZXAgPSBzY3JvbGxhYmlsaXR5KHhyZWNvcmRfcHRyX3dpbmRvdywgU0NSX05PTkUpICsgMTsKLQlpZiAoc2Nyb2xsX3JlcCA9PSAxKSB7Ci0JCXNjcm9sbF9yZXAgPSAyOwkJLyogaWYgbm8gaW5mbywgYXNzdW1lIHRoZSBiZXN0LiAqLwotCX0KLSNlbmRpZgotCi0Jc2Nyb2xsX2tleXN5bSA9IHhyZWNvcmRfc2Nyb2xsX2tleXN5bShsYXN0X3JmYl9rZXlzeW0pOwotCi0JbWF4X3NwaW4gPSBzY3Jfa2V5X3RpbWU7Ci0KLQlpZiAoc2V0X3JlcGVhdF9pbiA+IDAuMCAmJiB0bm93IDwgbGFzdF9rZXlfc2Nyb2xsICsgMipzZXRfcmVwZWF0X2luKSB7Ci0JCW1heF9zcGluID0gMiAqIHNldF9yZXBlYXRfaW47Ci0JfSBlbHNlIGlmICh0bm93IDwgbGFzdF9rZXlfc2Nyb2xsICsgc2Nyb2xsX3BlcnNpc3QpIHsKLQkJbWF4X3NwaW4gPSAxLjI1Kih0bm93IC0gbGFzdF9rZXlfc2Nyb2xsKTsKLQl9IGVsc2UgaWYgKHRub3cgPCBsYXN0X2tleV90b19idXR0b25fcmVtYXBfdGltZSArIDEuNSpzY3JvbGxfcGVyc2lzdCkgewotCQkvKiBtb3N0bHkgYSBoYWNrIEkgdXNlIGZvciB0ZXN0aW5nIC1yZW1hcCBrZXkgLT4gYnRuNC9idG41ICovCi0JCW1heF9zcGluID0gc2Nyb2xsX3BlcnNpc3Q7Ci0JfSBlbHNlIGlmIChzY3JvbGxfa2V5c3ltKSB7Ci0JCWlmIChyZXBlYXRfY2hlY2sobGFzdF9rZXlfc2Nyb2xsKSkgewotCQkJc3Bpbl9mYWMgPSBzY3JvbGxfZmFjOwotCQl9IGVsc2UgewotCQkJc3Bpbl9mYWMgPSBub3Njcm9sbF9mYWM7Ci0JCX0KLQl9Ci0JaWYgKG1heF9zcGluID4gbWF4X2xvbmdfc3BpbikgewotCQltYXhfc3BpbiA9IG1heF9sb25nX3NwaW47Ci0JfQotCi0JLyogWFhYIHVzZSB0aGlzIHNvbWVob3cgICovCi1pZiAoMCkJbGluayA9IGxpbmtfcmF0ZSgmbGF0ZW5jeSwgJm5ldHJhdGUpOwotCi0JZ2sgPSBnazAgPSBnb3Rfa2V5Ym9hcmRfaW5wdXQ7Ci0JZHRpbWUwKCZ0bSk7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjaGVja194cmVjb3JkX2tleXM6IEJFR0lOIExPT1A6IHNjcl9ldl9jbnQ6ICIKLSAgICAiJWQgbWF4OiAlLjNmICAlLjRmXG4iLCBzY3JfZXZfY250LCBtYXhfc3BpbiwgdG0gLSB4MTF2bmNfc3RhcnQpOwotCi0Jd2hpbGUgKDEpIHsKLQotCQlpZiAoc2NyX2V2X2NudCkgewotCQkJZ290X29uZSA9IDE7Ci0KLQkJCXNjcm9sbGFiaWxpdHkoeHJlY29yZF9wdHJfd2luZG93LCBTQ1JfU1VDQ0VTUyk7Ci0JCQlzY3JvbGxfcmVwID0gMjsKLQotCQkJZHRpbWUwKCZsYXN0X3Njcm9sbCk7Ci0JCQlsYXN0X2tleV9zY3JvbGwgPSBsYXN0X3Njcm9sbDsKLQkJCXNjcl9jbnQrKzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJWF9MT0NLOwotCQlmbHVzaDEgPSAxOwotCQlYRmx1c2hfd3IoZHB5KTsKLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKHNldF9yZXBlYXRfaW4gPiAwLjApIHsKLQkJCW1heF9rZXlyZXBlYXRfdGltZSA9IHNldF9yZXBlYXRfaW47Ci0JCX0KLQotCQlpZiAodXNlX3RocmVhZHMpIHsKLQkJCXVzbGVlcCgxMDAwKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkNGRCgxMDAwKTsKLQkJfQotCQlzcGluICs9IGR0aW1lKCZ0bSk7Ci0KLQkJWF9MT0NLOwotCQlpZiAoZ290X2tleWJvYXJkX2lucHV0ID4gZ2spIHsKLQkJCWdrID0gZ290X2tleWJvYXJkX2lucHV0OwotCQkJaW5wdXQrKzsKLQkJCWlmIChzZXRfcmVwZWF0X2luKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmICh4cmVjb3JkX3Njcm9sbF9rZXlzeW0obGFzdF9yZmJfa2V5c3ltKSkgewotCQkJCWlmIChyZXBlYXRfY2hlY2sobGFzdF9rZXlfc2Nyb2xsKSkgewotCQkJCQlzcGluX2ZhYyA9IHNjcm9sbF9mYWM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3Bpbl9mYWMgPSBub3Njcm9sbF9mYWM7Ci0JCQkJfQotCQkJfQotaWYgKDAgfHwgZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfeHJlY29yZDogbW9yZSBrZXlzOiAlLjNmICAweCV4ICIKLSAgICAiICUuNGYgICVzICAlc1xuIiwgc3BpbiwgbGFzdF9yZmJfa2V5c3ltLCBsYXN0X3JmYl9rZXl0aW1lIC0geDExdm5jX3N0YXJ0LAotICAgIGxhc3RfcmZiX2Rvd24gPyAiZG93biI6InVwICAiLCBsYXN0X3JmYl9rZXlfYWNjZXB0ZWQgPyAiYWNjZXB0Ijoic2tpcCIpOwotCQkJZmx1c2gyID0gMTsKLQkJCVhGbHVzaF93cihkcHkpOwotCQl9Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi0JCVNDUl9MT0NLOwotCQlYUmVjb3JkUHJvY2Vzc1JlcGxpZXMocmRweV9kYXRhKTsKLQkJU0NSX1VOTE9DSzsKLSNlbmRpZgotCQlYX1VOTE9DSzsKLQotCQlpZiAoc3BpbiA+PSBtYXhfc3BpbiAqIHNwaW5fZmFjKSB7Ci1pZiAoMCB8fCBkYikgZnByaW50ZihzdGRlcnIsICJjaGVja194cmVjb3JkOiBTUElOLU9VVDogJS4zZi8lLjNmXG4iLCBzcGluLAotICAgIG1heF9zcGluICogc3Bpbl9mYWMpOwotCQkJZmFpbCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCW1heF9rZXlyZXBlYXRfdGltZSA9IDAuMDsKLQotCWlmIChzY3JfZXZfY250KSB7Ci0JCWludCBkcmV0LCBldiA9IHNjcl9ldl9jbnQgLSAxOwotCQlpbnQgYmR4LCBiZHksIGJkc2tpbm55LCBiZHB1c2ggPSAwOwotCQlkb3VibGUgbWF4X2FnZSA9IDAuMjUsIGFnZSwgdG0sIGR0OwotCQlzdGF0aWMgZG91YmxlIGxhc3Rfc2NyX2V2ID0gMC4wOwotCi0JCWxhc3Rfd3ggPSBzY3JfZXZbZXZdLndpbl94OwotCQlsYXN0X3d5ID0gc2NyX2V2W2V2XS53aW5feTsKLQkJbGFzdF93dyA9IHNjcl9ldltldl0ud2luX3c7Ci0JCWxhc3Rfd2ggPSBzY3JfZXZbZXZdLndpbl9oOwotCi0JCS8qIGFzc3VtZSBzY3JvbGxiYXIgb24gcmhzOiAqLwotCQliZHggPSBsYXN0X3d4ICsgbGFzdF93dyArIDM7Ci0JCWJkeSA9IGxhc3Rfd3kgKyBsYXN0X3doLzI7Ci0JCWJkc2tpbm55ID0gMzI7Ci0JCQkKLQkJaWYgKHBlcnNpc3Rfc3RhcnQgPT0gMC4wKSB7Ci0JCQliZHB1c2ggPSAwOwotCQl9IGVsc2UgewotCQkJc2V0X2JkcHVzaChTQ1JfS0VZLCAmbGFzdF9iZHB1c2gsICZiZHB1c2gpOwotCQl9Ci0KLQkJZHRpbWUwKCZ0bSk7Ci0JCWFnZSA9IG1heF9hZ2U7Ci0JCWRyZXQgPSBwdXNoX3Njcl9ldigmYWdlLCBTQ1JfS0VZLCBiZHB1c2gsIGJkeCwgYmR5LCBiZHNraW5ueSwgMSk7Ci0JCWR0ID0gZHRpbWUoJnRtKTsKLQotCQlyZXQgPSAxICsgZHJldDsKLQkJc2NyX2V2X2NudCA9IDA7Ci0KLQkJaWYgKHJldCA9PSAyICYmIHhyZWNvcmRfc2Nyb2xsX2tleXN5bShsYXN0X3JmYl9rZXlzeW0pKSB7Ci0JCQlpbnQgcmVwZWF0aW5nOwotCQkJZG91YmxlIHRpbWVfbG8gPSAxLjAvbWF4X2tleXJlcGVhdF9sbzsKLQkJCWRvdWJsZSB0aW1lX2hpID0gMS4wL21heF9rZXlyZXBlYXRfaGk7Ci0JCQlkb3VibGUgcmF0ZSA9IHR5cGluZ19yYXRlKDAuMCwgJnJlcGVhdGluZyk7Ci1pZiAoMCB8fCBkYikgZnByaW50ZihzdGRlcnIsICJUeXBpbmc6IGR0OiAlLjRmIHJhdGU6ICUuMWZcbiIsIGR0LCByYXRlKTsKLQkJCWlmIChyZXBlYXRpbmcpIHsKLQkJCQkvKiBuLmIuIHRoZSAicXVhbnR1bSIgaXMgYWJvdXQgMS8zMCBzZWMuICovCi0JCQkJbWF4X2tleXJlcGVhdF90aW1lID0gMS4wKmR0OwotCQkJCWlmIChtYXhfa2V5cmVwZWF0X3RpbWUgPiB0aW1lX2xvIHx8Ci0JCQkJICAgIG1heF9rZXlyZXBlYXRfdGltZSA8IHRpbWVfaGkpIHsKLQkJCQkJbWF4X2tleXJlcGVhdF90aW1lID0gMC4wOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldF9yZXBlYXQgPSBtYXhfa2V5cmVwZWF0X3RpbWU7Ci1pZiAoMCB8fCBkYikgZnByaW50ZihzdGRlcnIsICJzZXQgbWF4X2tleXJlcGVhdF90aW1lOiAlLjJmXG4iLCBtYXhfa2V5cmVwZWF0X3RpbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWxhc3Rfc2NyX2V2ID0gZG5vdygpOwotCX0KLQotCWlmICgoZ290X29uZSAmJiByZXQgPCAyKSB8fCBwZXJzaXN0X2NvdW50KSB7Ci0JCXNldF94ZGFtYWdlX21hcmsobGFzdF93eCwgbGFzdF93eSwgbGFzdF93dywgbGFzdF93aCk7Ci0JfQotCi0JaWYgKGZhaWwpIHsKLQkJc2Nyb2xsYWJpbGl0eSh4cmVjb3JkX3B0cl93aW5kb3csIFNDUl9GQUlMKTsKLQl9Ci0KLQlpZiAoeHJlY29yZGluZykgewotCQlpZiAocmV0IDwgMikgewotCQkJeHJlY29yZF93YXRjaCgwLCBTQ1JfS0VZKTsKLQkJfQotCX0KLQotCWlmIChyZXQgPT0gMikgewotCQlpZiAocGVyc2lzdF9zdGFydCA9PSAwLjApIHsKLQkJCWR0aW1lKCZwZXJzaXN0X3N0YXJ0KTsKLQkJCWxhc3RfYmRwdXNoID0gcGVyc2lzdF9zdGFydDsKLQkJfQotCX0gZWxzZSB7Ci0JCXBlcnNpc3Rfc3RhcnQgPSAwLjA7Ci0JCWxhc3RfYmRwdXNoID0gMC4wOwotCX0KLQotCS8qIHNpbmNlIHdlJ3ZlIGZsdXNoZWQgaXQsIHdlIG1pZ2h0IGFzIHdlbGwgYXZvaWQgLWlucHV0X3NraXAgKi8KLQlpZiAoZmx1c2gxIHx8IGZsdXNoMikgewotCQlnb3Rfa2V5Ym9hcmRfaW5wdXQgPSAwOwotCQlnb3RfcG9pbnRlcl9pbnB1dCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjaGVja194cmVjb3JkX21vdXNlKHZvaWQpIHsKLQlzdGF0aWMgaW50IGxhc3Rfd3gsIGxhc3Rfd3ksIGxhc3Rfd3csIGxhc3Rfd2g7Ci0JZG91YmxlIHNwaW4gPSAwLjAsIHRtLCB0bm93OwotCWludCBpLCBzY3JfY250ID0gMCwgaW5wdXQgPSAwLCBzY3JvbGxfcmVwOwotCWludCBnZXRfb3V0LCBnb3Rfb25lID0gMCwgZmx1c2gxID0gMCwgZmx1c2gyID0gMDsKLQlpbnQgZ3AsIGdwMCwgcmV0ID0gMCwgZGIgPSBkZWJ1Z19zY3JvbGw7Ci0JaW50IGdrLCBnazA7Ci0JaW50IGZhaWwgPSAwOwotCWludCBsaW5rLCBsYXRlbmN5LCBuZXRyYXRlOwotCi0JaW50IHN0YXJ0X3gsIHN0YXJ0X3ksIGxhc3RfeCwgbGFzdF95OwotCXN0YXRpYyBkb3VibGUgbGFzdF9tb3VzZV9zY3JvbGwgPSAwLjA7Ci0JZG91YmxlIGxhc3Rfc2Nyb2xsOwotCWRvdWJsZSBtYXhfc3BpblszXSwgbWF4X2xvbmdbM10sIHBlcnNpc3RbM107Ci0JZG91YmxlIGZsdXNoMV90aW1lID0gMC4wMTsKLQlzdGF0aWMgZG91YmxlIGxhc3RfZmx1c2ggPSAwLjA7Ci0JZG91YmxlIGxhc3RfYmRwdXNoID0gMC4wLCBidXR0b25fdXBfdGltZSA9IDAuMDsKLQlpbnQgYnV0dG9uX21hc2tfc2F2ZTsKLQlpbnQgYWxyZWFkeV9kb3duID0gMCwgbWF4X3B0cl9lYXQgPSAyMDsKLQlzdGF0aWMgaW50IHdhbnRfYmFja19pbiA9IDA7Ci0JaW50IGNhbWVfYmFja19pbjsKLQlpbnQgZmlyc3RfcHVzaCA9IDE7Ci0KLQlpbnQgc2Nyb2xsX3doZWVsID0gMDsKLQlpbnQgYnRuNCA9ICgxPDwzKTsKLQlpbnQgYnRuNSA9ICgxPDw0KTsKLQotCVJBV0ZCX1JFVCgwKQotCi0JZ2V0X291dCA9IDE7Ci0JaWYgKGJ1dHRvbl9tYXNrKSB7Ci0JCWdldF9vdXQgPSAwOwotCX0KLQlpZiAod2FudF9iYWNrX2luKSB7Ci0JCWdldF9vdXQgPSAwOwotCX0KLQlkdGltZTAoJnRub3cpOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfeHJlY29yZF9tb3VzZTogSU4geHJlY29yZGluZzogJWRcbiIsIHhyZWNvcmRpbmcpOwotCi0JaWYgKGdldF9vdXQpIHsKLQkJaWYgKHhyZWNvcmRpbmcpIHsKLQkJCXhyZWNvcmRfd2F0Y2goMCwgU0NSX01PVVNFKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzY3JvbGxfcmVwID0gc2Nyb2xsYWJpbGl0eSh4cmVjb3JkX3B0cl93aW5kb3csIFNDUl9OT05FKSArIDE7Ci0JaWYgKHNjcm9sbF9yZXAgPT0gMSkgewotCQlzY3JvbGxfcmVwID0gMjsJCS8qIGlmIG5vIGluZm8sIGFzc3VtZSB0aGUgYmVzdC4gKi8KLQl9Ci0KLQlpZiAoYnV0dG9uX21hc2tfcHJldikgewotCQlhbHJlYWR5X2Rvd24gPSAxOwotCX0KLQlpZiAod2FudF9iYWNrX2luKSB7Ci0JCWNhbWVfYmFja19pbiA9IDE7Ci0JCWZpcnN0X3B1c2ggPSAwOwotCX0gZWxzZSB7Ci0JCWNhbWVfYmFja19pbiA9IDA7Ci0JfQotCXdhbnRfYmFja19pbiA9IDA7Ci0KLQlpZiAoYnV0dG9uX21hc2sgJiAoYnRuNHxidG41KSkgewotCQlzY3JvbGxfd2hlZWwgPSAxOwotCX0KLQotCS8qCi0JICogc2V0IHVwIHRpbWVzIGZvciB0aGUgdmFyaW91cyAicmVwdXRhdGlvbnMiCi0JICoKLQkgKiAwID0+IC0xLCBoYXMgYmVlbiB0cmllZCBidXQgbmV2ZXIgZm91bmQgYSBzY3JvbGwuCi0JICogMSA9PiAgMCwgaGFzIG5vdCBiZWVuIHRyaWVkLgotCSAqIDIgPT4gKzEsIGhhcyBiZWVuIHRyaWVkIGFuZCBmb3VuZCBhIHNjcm9sbC4KLQkgKi8KLQotCS8qIGZpcnN0IHNwaW4tb3V0IHRpbWUgKG5vIGV2ZW50cykgKi8KLQltYXhfc3BpblswXSA9IDEqc2NyX21vdXNlX3RpbWU7Ci0JbWF4X3NwaW5bMV0gPSAyKnNjcl9tb3VzZV90aW1lOwotCW1heF9zcGluWzJdID0gNCpzY3JfbW91c2VfdGltZTsKLQlpZiAoIWFscmVhZHlfZG93bikgewotCQlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJCW1heF9zcGluW2ldICo9IDEuNTsKLQkJfQotCX0KLQotCS8qIG1heCB0aW1lIGJldHdlZW4gZXZlbnRzICovCi0JcGVyc2lzdFswXSA9IDEqc2NyX21vdXNlX3BlcnNpc3Q7Ci0JcGVyc2lzdFsxXSA9IDIqc2NyX21vdXNlX3BlcnNpc3Q7Ci0JcGVyc2lzdFsyXSA9IDQqc2NyX21vdXNlX3BlcnNpc3Q7Ci0KLQkvKiBhYnNvbHV0ZSBtYXggdGltZSBpbiB0aGUgbG9vcCAqLwotCW1heF9sb25nWzBdID0gc2NyX21vdXNlX21heHRpbWU7Ci0JbWF4X2xvbmdbMV0gPSBzY3JfbW91c2VfbWF4dGltZTsKLQltYXhfbG9uZ1syXSA9IHNjcl9tb3VzZV9tYXh0aW1lOwotCi0JcG9pbnRlcl9mbHVzaF9kZWxheSA9IHNjcl9tb3VzZV9wb2ludGVyX2RlbGF5OwotCi0JLyogc2xvdyBsaW5rczogKi8KLQlsaW5rID0gbGlua19yYXRlKCZsYXRlbmN5LCAmbmV0cmF0ZSk7Ci0JaWYgKGxpbmsgPT0gTFJfRElBTFVQKSB7Ci0JCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQkJbWF4X3NwaW5baV0gKj0gMi4wOwotCQl9Ci0JCXBvaW50ZXJfZmx1c2hfZGVsYXkgKj0gMjsKLQl9IGVsc2UgaWYgKGxpbmsgPT0gTFJfQlJPQURCQU5EKSB7Ci0JCXBvaW50ZXJfZmx1c2hfZGVsYXkgKj0gMjsKLQl9Ci0KLQlncCA9IGdwMCA9IGdvdF9wb2ludGVyX2lucHV0OwotCWdrID0gZ2swID0gZ290X2tleWJvYXJkX2lucHV0OwotCWR0aW1lMCgmdG0pOwotCi0JLyoKLQkgKiB0aGlzIGlzIHVzZWQgZm9yIGJvcmRlciBwdXNoZXMgKGJkcHVzaCkgdG8gZ3Vlc3MgbG9jYXRpb24KLQkgKiBvZiBzY3JvbGxiYXIgKHJlZ2lvbiByZWN0cyBjb250YWluaW5nIHRoaXMgcG9pbnQgYXJlIHB1c2hlZCkuCi0JICovCi0JbGFzdF94ID0gc3RhcnRfeCA9IGN1cnNvcl94OwotCWxhc3RfeSA9IHN0YXJ0X3kgPSBjdXJzb3JfeTsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmRfbW91c2U6IEJFR0lOIExPT1A6IHNjcl9ldl9jbnQ6ICIKLSAgICAiJWQgbWF4OiAlLjNmICAlLjRmXG4iLCBzY3JfZXZfY250LCBtYXhfc3BpbltzY3JvbGxfcmVwXSwgdG0gLSB4MTF2bmNfc3RhcnQpOwotCi0Jd2hpbGUgKDEpIHsKLQkJZG91YmxlIHNwaW5fY2hlY2s7Ci0JCWlmIChzY3JfZXZfY250KSB7Ci0JCQlpbnQgZHJldCwgZXYgPSBzY3JfZXZfY250IC0gMTsKLQkJCWludCBiZHB1c2ggPSAwLCBiZHgsIGJkeSwgYmRza2lubnk7Ci0JCQlkb3VibGUgdG0sIGR0LCBhZ2UgPSAwLjM1OwotCi0JCQlnb3Rfb25lID0gMTsKLQkJCXNjcm9sbGFiaWxpdHkoeHJlY29yZF9wdHJfd2luZG93LCBTQ1JfU1VDQ0VTUyk7Ci0JCQlzY3JvbGxfcmVwID0gMjsKLQotCQkJc2NyX2NudCsrOwotCi0JCQlkdGltZTAoJmxhc3Rfc2Nyb2xsKTsKLQkJCWxhc3RfbW91c2Vfc2Nyb2xsID0gbGFzdF9zY3JvbGw7Ci0KLQkJCWlmIChsYXN0X2JkcHVzaCA9PSAwLjApIHsKLQkJCQlsYXN0X2JkcHVzaCA9IGxhc3Rfc2Nyb2xsOwotCQkJfQotCi0JCQliZHggPSBzdGFydF94OwotCQkJYmR5ID0gc3RhcnRfeTsKLQkJCWlmIChjbGlwc2hpZnQpIHsKLQkJCQliZHggKz0gY29mZl94OwotCQkJCWJkeSArPSBjb2ZmX3k7Ci0JCQl9Ci0JCQlpZiAoc3Vid2luKSB7Ci0JCQkJYmR4ICs9IG9mZl94OwotCQkJCWJkeSArPSBvZmZfeTsKLQkJCX0KLQkJCWJkc2tpbm55ID0gMzI7Ci0JCQkKLQkJCXNldF9iZHB1c2goU0NSX01PVVNFLCAmbGFzdF9iZHB1c2gsICZiZHB1c2gpOwotCi0JCQlkdGltZTAoJnRtKTsKLQotCQkJZHJldCA9IHB1c2hfc2NyX2V2KCZhZ2UsIFNDUl9NT1VTRSwgYmRwdXNoLCBiZHgsCi0JCQkgICAgYmR5LCBiZHNraW5ueSwgZmlyc3RfcHVzaCk7Ci0JCQlpZiAoZmlyc3RfcHVzaCkgZmlyc3RfcHVzaCA9IDA7Ci0JCQlyZXQgPSAxICsgZHJldDsKLQotCQkJZHQgPSBkdGltZSgmdG0pOwotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICBkcmV0OiAlZCAgc2NyX2V2X2NudDogJWQgZHQ6ICUuNGZcbiIsCi0JZHJldCwgc2NyX2V2X2NudCwgZHQpOwotCi0JCQlsYXN0X3d4ID0gc2NyX2V2W2V2XS53aW5feDsKLQkJCWxhc3Rfd3kgPSBzY3JfZXZbZXZdLndpbl95OwotCQkJbGFzdF93dyA9IHNjcl9ldltldl0ud2luX3c7Ci0JCQlsYXN0X3doID0gc2NyX2V2W2V2XS53aW5faDsKLQkJCXNjcl9ldl9jbnQgPSAwOwotCi0JCQlpZiAoISBkcmV0KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoMCAmJiBidXR0b25fdXBfdGltZSA+IDAuMCkgewotCQkJCS8qIHdlIG9ubHkgdGFrZSAxIG1vcmUgZXZlbnQgd2l0aCBidXR0b24gdXAgKi8KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjaGVja194cmVjb3JkOiBCVVRUT05fVVBfU0NST0xMOiAlLjNmXG4iLCBzcGluKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0KLQkJaWYgKCEgZmx1c2gxKSB7Ci0JCQlpZiAoISBhbHJlYWR5X2Rvd24gfHwgKCFzY3JfY250ICYmIHNwaW4+Zmx1c2gxX3RpbWUpKSB7Ci0JCQkJZmx1c2gxID0gMTsKLQkJCQlYX0xPQ0s7Ci0JCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJZHRpbWUwKCZsYXN0X2ZsdXNoKTsKLQkJCX0KLQkJfQotCi0JCWlmICh1c2VfdGhyZWFkcykgewotCQkJdXNsZWVwKDEwMDApOwotCQl9IGVsc2UgewotCQkJcmZiQ0ZEKDEwMDApOwotCQkJcmZiQ0ZEKDApOwotCQl9Ci0JCXNwaW4gKz0gZHRpbWUoJnRtKTsKLQotCQlpZiAoZ290X3BvaW50ZXJfaW5wdXQgPiBncCkgewotCQkJZmx1c2gyID0gMTsKLQkJCWlucHV0ICs9IGVhdF9wb2ludGVyKG1heF9wdHJfZWF0LCAxKTsKLQkJCWdwID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0JCX0KLQkJaWYgKGdvdF9rZXlib2FyZF9pbnB1dCA+IGdrKSB7Ci0JCQlnayA9IGdvdF9rZXlib2FyZF9pbnB1dDsKLQkJCWlucHV0Kys7Ci0JCX0KLQkJWF9MT0NLOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCQlTQ1JfTE9DSzsKLQkJWFJlY29yZFByb2Nlc3NSZXBsaWVzKHJkcHlfZGF0YSk7Ci0JCVNDUl9VTkxPQ0s7Ci0jZW5kaWYKLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKCEgaW5wdXQpIHsKLQkJCXNwaW5fY2hlY2sgPSAxLjUgKiBtYXhfc3BpbltzY3JvbGxfcmVwXTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fY2hlY2sgPSBtYXhfc3BpbltzY3JvbGxfcmVwXTsKLQkJfQotCi0JCWlmIChidXR0b25fdXBfdGltZSA+IDAuMCkgewotCQkJaWYgKHRtID4gYnV0dG9uX3VwX3RpbWUgKyBtYXhfc3BpbltzY3JvbGxfcmVwXSkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmQ6IFNQSU4tT1VULUJVVFRPTl9VUDogJS4zZi8lLjNmXG4iLCBzcGluLCB0bSAtIGJ1dHRvbl91cF90aW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmICghc2NyX2NudCkgewotCQkJaWYgKHNwaW4gPj0gc3Bpbl9jaGVjaykgewotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfeHJlY29yZDogU1BJTi1PVVQtMTogJS4zZi8lLjNmXG4iLCBzcGluLCBzcGluX2NoZWNrKTsKLQkJCQlmYWlsID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0bSA+PSBsYXN0X3Njcm9sbCArIHBlcnNpc3Rbc2Nyb2xsX3JlcF0pIHsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmQ6IFNQSU4tT1VULTI6ICUuM2YvJS4zZlxuIiwgc3BpbiwgdG0gLSBsYXN0X3Njcm9sbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNwaW4gPj0gbWF4X2xvbmdbc2Nyb2xsX3JlcF0pIHsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmQ6IFNQSU4tT1VULTM6ICUuM2YvJS4zZlxuIiwgc3BpbiwgbWF4X2xvbmdbc2Nyb2xsX3JlcF0pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoISBidXR0b25fbWFzaykgewotCQkJaW50IGRvZmx1c2ggPSAwOwotCQkJaWYgKGJ1dHRvbl91cF90aW1lID4gMC4wKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmIChjYW1lX2JhY2tfaW4pIHsKLQkJCQlkdGltZTAoJmJ1dHRvbl91cF90aW1lKTsKLQkJCQlkb2ZsdXNoID0gMTsKLQkJCX0gZWxzZSBpZiAoc2Nyb2xsX3doZWVsKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfeHJlY29yZDogU0NST0xMLVdIRUVMLUJVVFRPTi1VUC1LRUVQLUdPSU5HOiAgJS4zZi8lLjNmICVkLyVkICVkLyVkXG4iLCBzcGluLCBtYXhfbG9uZ1tzY3JvbGxfcmVwXSwgbGFzdF94LCBsYXN0X3ksIGN1cnNvcl94LCBjdXJzb3JfeSk7Ci0JCQkJZG9mbHVzaCA9IDE7Ci0JCQkJZHRpbWUwKCZidXR0b25fdXBfdGltZSk7Ci0JCQl9IGVsc2UgaWYgKGxhc3RfeCA9PSBjdXJzb3JfeCAmJiBsYXN0X3kgPT0gY3Vyc29yX3kpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjaGVja194cmVjb3JkOiBCVVRUT04tVVA6ICAlLjNmLyUuM2YgJWQvJWQgJWQvJWRcbiIsIHNwaW4sIG1heF9sb25nW3Njcm9sbF9yZXBdLCBsYXN0X3gsIGxhc3RfeSwgY3Vyc29yX3gsIGN1cnNvcl95KTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfeHJlY29yZDogQlVUVE9OLVVQLUtFRVAtR09JTkc6ICAlLjNmLyUuM2YgJWQvJWQgJWQvJWRcbiIsIHNwaW4sIG1heF9sb25nW3Njcm9sbF9yZXBdLCBsYXN0X3gsIGxhc3RfeSwgY3Vyc29yX3gsIGN1cnNvcl95KTsKLQkJCQlkb2ZsdXNoID0gMTsKLQkJCQlkdGltZTAoJmJ1dHRvbl91cF90aW1lKTsKLQkJCX0KLQkJCWlmIChkb2ZsdXNoKSB7Ci0JCQkJZmx1c2gxID0gMTsKLQkJCQlYX0xPQ0s7Ci0JCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJZHRpbWUwKCZsYXN0X2ZsdXNoKTsKLQkJCX0KLQkJfQotCi0JCWxhc3RfeCA9IGN1cnNvcl94OwotCQlsYXN0X3kgPSBjdXJzb3JfeTsKLQl9Ci0KLQlpZiAoZ290X29uZSkgewotCQlzZXRfeGRhbWFnZV9tYXJrKGxhc3Rfd3gsIGxhc3Rfd3ksIGxhc3Rfd3csIGxhc3Rfd2gpOwotCX0KLQotCWlmIChmYWlsKSB7Ci0JCXNjcm9sbGFiaWxpdHkoeHJlY29yZF9wdHJfd2luZG93LCBTQ1JfRkFJTCk7Ci0JfQotCi0JLyogZmx1c2ggYW55IHJlbWFpbmluZyBwb2ludGVyIGV2ZW50cy4gKi8KLQlidXR0b25fbWFza19zYXZlID0gYnV0dG9uX21hc2s7Ci0JcG9pbnRlcl9xdWV1ZWRfc2VudCA9IDA7Ci0JbGFzdF94ID0gY3Vyc29yX3g7Ci0JbGFzdF95ID0gY3Vyc29yX3k7Ci0JcG9pbnRlcl9ldmVudCgtMSwgMCwgMCwgTlVMTCk7Ci0JcG9pbnRlcl9mbHVzaF9kZWxheSA9IDAuMDsKLQotCWlmICh4cmVjb3JkaW5nICYmIHBvaW50ZXJfcXVldWVkX3NlbnQgJiYgYnV0dG9uX21hc2tfc2F2ZSAmJgotCSAgICAobGFzdF94ICE9IGN1cnNvcl94IHx8IGxhc3RfeSAhPSBjdXJzb3JfeSkgKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICBwb2ludGVyKCkgcHVzaCB5aWVsZHMgZXZlbnRzIG9uOiByZXQ9JWRcbiIsIHJldCk7Ci0JCWlmIChyZXQgPT0gMikgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgd2UgZGVjaWRlIHRvIHNlbmQgcmV0PTNcbiIpOwotCQkJd2FudF9iYWNrX2luID0gMTsKLQkJCXJldCA9IDM7Ci0JCQlmbHVzaDIgPSAxOwotCQl9IGVsc2UgewotCQkJaWYgKHJldCkgewotCQkJCXJldCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IDA7Ci0JCQl9Ci0JCQl4cmVjb3JkX3dhdGNoKDAsIFNDUl9NT1VTRSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAxOwotCQl9IGVsc2UgewotCQkJcmV0ID0gMDsKLQkJfQotCQlpZiAoeHJlY29yZGluZykgewotCQkJeHJlY29yZF93YXRjaCgwLCBTQ1JfTU9VU0UpOwotCQl9Ci0JfQotCi0JaWYgKGZsdXNoMikgewotCQlYX0xPQ0s7Ci0JCVhGbHVzaF93cihkcHkpOwotCQlYRmx1c2hfd3IocmRweV9jdHJsKTsKLQkJWF9VTkxPQ0s7Ci0KLQkJZmx1c2gyID0gMTsKLQkJZHRpbWUwKCZsYXN0X2ZsdXNoKTsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZMVVNILTJcbiIpOwotCX0KLQotCS8qIHNpbmNlIHdlJ3ZlIGZsdXNoZWQgaXQsIHdlIG1pZ2h0IGFzIHdlbGwgYXZvaWQgLWlucHV0X3NraXAgKi8KLQlpZiAoZmx1c2gxIHx8IGZsdXNoMikgewotCQlnb3Rfa2V5Ym9hcmRfaW5wdXQgPSAwOwotCQlnb3RfcG9pbnRlcl9pbnB1dCA9IDA7Ci0JfQotCi0JaWYgKHJldCkgewotCQlyZXR1cm4gcmV0OwotCX0gZWxzZSBpZiAoc2NyX2NudCkgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBjaGVja194cmVjb3JkKHZvaWQpIHsKLQlpbnQgd2F0Y2hfa2V5cyA9IDAsIHdhdGNoX21vdXNlID0gMCwgY29uc2lkZXJfbW91c2U7Ci0Jc3RhdGljIGludCBtb3VzZV93YW50c19iYWNrX2luID0gMDsKLQotCVJBV0ZCX1JFVCgwKQotCi0JaWYgKCEgdXNlX3hyZWNvcmQpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAwOwotCi0JaWYgKHNraXBfY3Jfd2hlbl9zY2FsaW5nKCJzY3JvbGwiKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmQ6IElOIHhyZWNvcmRpbmc6ICVkXG4iLCB4cmVjb3JkaW5nKTsKLQotCWlmICghIHhyZWNvcmRpbmcpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFzdHJjbXAoc2Nyb2xsX2NvcHlyZWN0LCAiYWx3YXlzIikpIHsKLQkJd2F0Y2hfa2V5cyA9IDE7Ci0JCXdhdGNoX21vdXNlID0gMTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc2Nyb2xsX2NvcHlyZWN0LCAia2V5cyIpKSB7Ci0JCXdhdGNoX2tleXMgPSAxOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzY3JvbGxfY29weXJlY3QsICJtb3VzZSIpKSB7Ci0JCXdhdGNoX21vdXNlID0gMTsKLQl9Ci0KLQlpZiAoYnV0dG9uX21hc2sgfHwgbW91c2Vfd2FudHNfYmFja19pbikgewotCQljb25zaWRlcl9tb3VzZSA9IDE7Ci0JfSBlbHNlIHsKLQkJY29uc2lkZXJfbW91c2UgPSAwOwotCX0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3hyZWNvcmQ6IGJ1dHRvbl9tYXNrOiAlZCAgbW91c2Vfd2FudHNfYmFja19pbjogJWRcbiIsIGJ1dHRvbl9tYXNrLCBtb3VzZV93YW50c19iYWNrX2luKTsKLQotCWlmICh3YXRjaF9tb3VzZSAmJiBjb25zaWRlcl9tb3VzZSAmJiB4cmVjb3JkX3NldF9ieV9tb3VzZSkgewotCQlpbnQgcmV0ID0gY2hlY2tfeHJlY29yZF9tb3VzZSgpOwotCQlpZiAocmV0ID09IDMpIHsKLQkJCW1vdXNlX3dhbnRzX2JhY2tfaW4gPSAxOwotCQl9IGVsc2UgewotCQkJbW91c2Vfd2FudHNfYmFja19pbiA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgaWYgKHdhdGNoX2tleXMgJiYgeHJlY29yZF9zZXRfYnlfa2V5cykgewotCQltb3VzZV93YW50c19iYWNrX2luID0gMDsKLQkJcmV0dXJuIGNoZWNrX3hyZWNvcmRfa2V5cygpOwotCX0gZWxzZSB7Ci0JCW1vdXNlX3dhbnRzX2JhY2tfaW4gPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLSNkZWZpbmUgREJfU0VUIFwKLQlpbnQgZGIgID0gMDsgXAotCWludCBkYjIgPSAwOyBcCi0JaWYgKGRlYnVnX3dpcmVmcmFtZSA9PSAxKSB7IFwKLQkJZGIgPSAxOyBcCi0JfSBcCi0JaWYgKGRlYnVnX3dpcmVmcmFtZSA9PSAyKSB7IFwKLQkJZGIyID0gMTsgXAotCX0gXAotCWlmIChkZWJ1Z193aXJlZnJhbWUgPT0gMykgeyBcCi0JCWRiID0gMTsgXAotCQlkYjIgPSAxOyBcCi0JfQotCi0jZGVmaW5lIE5CQVRDSE1BWCAxMDI0Ci1pbnQgYmF0Y2hfZHhzW05CQVRDSE1BWF0sIGJhdGNoX2R5c1tOQkFUQ0hNQVhdOwotc3JhUmVnaW9uUHRyIGJhdGNoX3JlZ1tOQkFUQ0hNQVhdOwotCi1zdGF0aWMgaW50IHRyeV9jb3B5cmVjdChXaW5kb3cgb3JpZ19mcmFtZSwgV2luZG93IGZyYW1lLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKLSAgICBpbnQgZHgsIGludCBkeSwgaW50ICpvYnNjdXJlZCwgc3JhUmVnaW9uUHRyIGV4dHJhX2NsaXAsIGRvdWJsZSBtYXhfd2FpdCwgaW50ICpuYmF0Y2gpIHsKLQotCXN0YXRpYyBpbnQgZHRfYmFkID0gMDsKLQlzdGF0aWMgdGltZV90IGR0X2JhZF9jaGVjayA9IDA7Ci0JaW50IHgxLCB5MSwgeDIsIHkyLCBzZW50X2NvcHlyZWN0ID0gMDsKLQlpbnQgcmVxLCBtb2QsIGNweSwgbmNsaTsKLQlkb3VibGUgdG0sIGR0OwotCURCX1NFVAotCi0JaWYgKG5iYXRjaCA9PSBOVUxMKSB7Ci0JCWdldF9jbGllbnRfcmVnaW9ucygmcmVxLCAmbW9kLCAmY3B5LCAmbmNsaSk7Ci0JCWlmIChjcHkpIHsKLQkJCS8qIG9uZSBpcyBzdGlsbCBwZW5kaW5nLi4uIHRyeSB0byBmb3JjZSBpdCBvdXQ6ICovCi0JCQlpZiAoIWZiX3B1c2hfd2FpdChtYXhfd2FpdCwgRkJfQ09QWSkpIHsKLQkJCQlmYl9wdXNoX3dhaXQobWF4X3dhaXQvMiwgRkJfQ09QWSk7Ci0JCQl9Ci0KLQkJCWdldF9jbGllbnRfcmVnaW9ucygmcmVxLCAmbW9kLCAmY3B5LCAmbmNsaSk7Ci0JCX0KLQkJaWYgKGNweSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkqb2JzY3VyZWQgPSAwOwotCS8qCi0JICogWFhYIEtERSBhbmQgeGZjZSBkbyBzb21lIHdlaXJkIHRoaW5ncyB3aXRoIHRoZSAKLQkgKiBzdGFja2luZywgaXQgZG9lcyBub3QgbWF0Y2ggWFF1ZXJ5VHJlZS4gIFdvcmsgYXJvdW5kCi0JICogaXQgZm9yIG5vdyBieSBDb3B5UmVjdC1pbmcgdGhlICp3aG9sZSogb24tc2NyZWVuIAotCSAqIHJlY3RhbmdsZSAod2hldGhlciBvYnNjdXJlZCBvciBub3QhKQotCSAqLwotCWlmICh0aW1lKE5VTEwpID4gZHRfYmFkX2NoZWNrICsgNSkgewotCQljaGFyICpkdCA9IGd1ZXNzX2Rlc2t0b3AoKTsKLQkJaWYgKCFzdHJjbXAoZHQsICJrZGVfbWF5YmVfaXNfb2tfbm93Li4uIikpIHsKLQkJCWR0X2JhZCA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChkdCwgInhmY2UiKSkgewotCQkJZHRfYmFkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWR0X2JhZCA9IDA7Ci0JCX0KLQkJZHRfYmFkX2NoZWNrID0gdGltZShOVUxMKTsKLQl9Ci0KLQlpZiAoY2xpcHNoaWZ0KSB7Ci0JCXggLT0gY29mZl94OwotCQl5IC09IGNvZmZfeTsKLQl9Ci0JaWYgKHN1YndpbikgewotCQl4IC09IG9mZl94OwotCQl5IC09IG9mZl95OwotCX0KLWlmIChkYjIpIGZwcmludGYoc3RkZXJyLCAidHJ5X2NvcHlyZWN0OiAweCVseC8weCVseCAgYmFkOiAlZCBzdGFja19saXN0X251bTogJWRcbiIsIG9yaWdfZnJhbWUsIGZyYW1lLCBkdF9iYWQsIHN0YWNrX2xpc3RfbnVtKTsKLQotLyogWFhYIFkgZHRfYmFkID0gMCAqLwotCWlmIChkdF9iYWQgJiYgd2lyZWZyYW1lX2luX3Byb2dyZXNzKSB7Ci0JCXNyYVJlZ2lvblB0ciByZWN0OwotCQkvKiBzZW5kIHRoZSB3aG9sZSB0aGluZy4uLiAqLwotCQl4MSA9IGNyZml4KG5maXgoeCwgICBkcHlfeCksIGR4LCBkcHlfeCk7Ci0JCXkxID0gY3JmaXgobmZpeCh5LCAgIGRweV95KSwgZHksIGRweV95KTsKLQkJeDIgPSBjcmZpeChuZml4KHgrdywgZHB5X3grMSksIGR4LCBkcHlfeCsxKTsKLQkJeTIgPSBjcmZpeChuZml4KHkraCwgZHB5X3krMSksIGR5LCBkcHlfeSsxKTsKLQotCQlyZWN0ID0gc3JhUmduQ3JlYXRlUmVjdCh4MSwgeTEsIHgyLCB5Mik7Ci0KLQkJaWYgKGJsYWNrb3V0cykgewotCQkJaW50IGk7Ci0JCQlzcmFSZWdpb25QdHIgYm9fcmVjdDsKLQkJCWZvciAoaT0wOyBpPGJsYWNrb3V0czsgaSsrKSB7Ci0JCQkJYm9fcmVjdCA9IHNyYVJnbkNyZWF0ZVJlY3QoYmxhY2tyW2ldLngxLAotCQkJCSAgICBibGFja3JbaV0ueTEsIGJsYWNrcltpXS54MiwgYmxhY2tyW2ldLnkyKTsKLQkJCQlzcmFSZ25TdWJ0cmFjdChyZWN0LCBib19yZWN0KTsKLQkJCQlzcmFSZ25EZXN0cm95KGJvX3JlY3QpOwotCQkJfQotCQl9Ci0JCWlmICghbmJhdGNoKSB7Ci0JCQlkb19jb3B5cmVnaW9uKHJlY3QsIGR4LCBkeSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQliYXRjaF9keHNbKm5iYXRjaF0gPSBkeDsKLQkJCWJhdGNoX2R5c1sqbmJhdGNoXSA9IGR5OwotCQkJYmF0Y2hfcmVnWypuYmF0Y2hdID0gc3JhUmduQ3JlYXRlUmduKHJlY3QpOwotCQkJKCpuYmF0Y2gpKys7Ci0JCX0KLQkJc3JhUmduRGVzdHJveShyZWN0KTsKLQotCQlzZW50X2NvcHlyZWN0ID0gMTsKLQkJKm9ic2N1cmVkID0gMTsJLyogc2V0IHRvIGF2b2lkIGFuIGFnZ3Jlc3NpdmUgcHVzaCAqLwotCi0JfSBlbHNlIGlmIChzdGFja19saXN0X251bSB8fCBkdF9iYWQpIHsKLQkJaW50IGssIHR4MSwgdHgyLCB0eTEsIHR5MjsKLQkJc3JhUmVnaW9uUHRyIG1vdmVkX3dpbiwgdG1wX3dpbiwgd2hvbGU7Ci0JCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCQlzcmFSZWN0IHJlY3Q7Ci0JCWludCBzYXdfbWUgPSAwOwotCQlpbnQgb3JpZ194LCBvcmlnX3k7Ci0JCWludCBib2ZmLCBid2luOwotCQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCi0JCW9yaWdfeCA9IHggLSBkeDsKLQkJb3JpZ195ID0geSAtIGR5OwotCi0JCXR4MSA9IG5maXgob3JpZ194LCAgIGRweV94KTsKLQkJdHkxID0gbmZpeChvcmlnX3ksICAgZHB5X3kpOwotCQl0eDIgPSBuZml4KG9yaWdfeCt3LCBkcHlfeCsxKTsKLQkJdHkyID0gbmZpeChvcmlnX3kraCwgZHB5X3krMSk7Ci0KLWlmIChkYjIpIGZwcmludGYoc3RkZXJyLCAibW92ZWRfd2luOiAlNGQgJTNkLCAlNGQgJTNkICAweCVseCAtLS1cbiIsCi0JdHgxLCB0eTEsIHR4MiwgdHkyLCBmcmFtZSk7Ci0KLQkJbW92ZWRfd2luID0gc3JhUmduQ3JlYXRlUmVjdCh0eDEsIHR5MSwgdHgyLCB0eTIpOwotCi0JCWR0aW1lMCgmdG0pOwotCi0JCWJvZmYgPSBnZXRfYm9mZigpOwotCQlid2luID0gZ2V0X2J3aW4oKTsKLQotCQlYX0xPQ0s7Ci0KLQkJLyoKLQkJICogbG9vcCBvdmVyIHRoZSBzdGFjaywgdG9wIHRvIGJvdHRvbSB1bnRpbCB3ZQotCQkgKiBmaW5kIG91ciB3bSBmcmFtZToKLQkJICovCi0JCWZvciAoayA9IHN0YWNrX2xpc3RfbnVtIC0gMTsgayA+PSAwOyBrLS0pIHsKLQkJCVdpbmRvdyBzd2luOwotCi0JCQlpZiAoMCAmJiBkdF9iYWQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc3dpbiA9IHN0YWNrX2xpc3Rba10ud2luOwotaWYgKGRiMikgZnByaW50ZihzdGRlcnIsICJzdzogJWQvJWx4XG4iLCBrLCBzd2luKTsKLQkJCWlmIChzd2luID09IGZyYW1lIHx8IHN3aW4gPT0gb3JpZ19mcmFtZSkgewotIGlmIChkYjIpIHsKLSBzYXdfbWUgPSAxOyBmcHJpbnRmKHN0ZGVyciwgIiAgLS0tLS0tLS0tLVxuIik7Ci0gfSBlbHNlIHsKLQkJCQlicmVhazsJCi0gfQotCQkJfQotCi0JCQkvKiBza2lwIHNvbWUgdW53YW50ZWQgY2FzZXM6ICovCi0jaWZuZGVmIE1BQ09TWAotCQkJaWYgKHN3aW4gPT0gTm9uZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotI2VuZGlmCi0JCQlpZiAoYm9mZiA8PSAoaW50KSBzd2luICYmIChpbnQpIHN3aW4gPCBib2ZmICsgYndpbikgewotCQkJCTsJLyogYmxhY2tvdXRzICovCi0JCQl9IGVsc2UgaWYgKCEgc3RhY2tfbGlzdFtrXS5mZXRjaGVkIHx8Ci0JCQkgICAgc3RhY2tfbGlzdFtrXS50aW1lID4gdG0gKyAyLjApIHsKLQkJCQlpZiAoIXZhbGlkX3dpbmRvdyhzd2luLCAmYXR0ciwgMSkpIHsKLQkJCQkJc3RhY2tfbGlzdFtrXS52YWxpZCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhY2tfbGlzdFtrXS52YWxpZCA9IDE7Ci0JCQkJCXN0YWNrX2xpc3Rba10ueCA9IGF0dHIueDsKLQkJCQkJc3RhY2tfbGlzdFtrXS55ID0gYXR0ci55OwotCQkJCQlzdGFja19saXN0W2tdLndpZHRoID0gYXR0ci53aWR0aDsKLQkJCQkJc3RhY2tfbGlzdFtrXS5oZWlnaHQgPSBhdHRyLmhlaWdodDsKLQkJCQkJc3RhY2tfbGlzdFtrXS5ib3JkZXJfd2lkdGggPSBhdHRyLmJvcmRlcl93aWR0aDsKLQkJCQkJc3RhY2tfbGlzdFtrXS5kZXB0aCA9IGF0dHIuZGVwdGg7Ci0JCQkJCXN0YWNrX2xpc3Rba10uY2xhc3MgPSBhdHRyLmNsYXNzOwotCQkJCQlzdGFja19saXN0W2tdLmJhY2tpbmdfc3RvcmUgPQotCQkJCQkgICAgYXR0ci5iYWNraW5nX3N0b3JlOwotCQkJCQlzdGFja19saXN0W2tdLm1hcF9zdGF0ZSA9Ci0JCQkJCSAgICBhdHRyLm1hcF9zdGF0ZTsKLQkJCQl9Ci0JCQkJc3RhY2tfbGlzdFtrXS5mZXRjaGVkID0gMTsKLQkJCQlzdGFja19saXN0W2tdLnRpbWUgPSB0bTsKLQkJCX0KLQkJCWlmICghc3RhY2tfbGlzdFtrXS52YWxpZCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlhdHRyLnggICAgICA9IHN0YWNrX2xpc3Rba10ueDsKLQkJCWF0dHIueSAgICAgID0gc3RhY2tfbGlzdFtrXS55OwotCQkJYXR0ci5kZXB0aCAgPSBzdGFja19saXN0W2tdLmRlcHRoOwotCQkJYXR0ci53aWR0aCAgPSBzdGFja19saXN0W2tdLndpZHRoOwotCQkJYXR0ci5oZWlnaHQgPSBzdGFja19saXN0W2tdLmhlaWdodDsKLQkJCWF0dHIuYm9yZGVyX3dpZHRoID0gc3RhY2tfbGlzdFtrXS5ib3JkZXJfd2lkdGg7Ci0JCQlhdHRyLm1hcF9zdGF0ZSA9IHN0YWNrX2xpc3Rba10ubWFwX3N0YXRlOwotCi0JCQlpZiAoYXR0ci5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotaWYgKGRiMikgZnByaW50ZihzdGRlcnIsICJzdzogJWQvJWx4ICAlZHglZCslZCslZFxuIiwgaywgc3dpbiwgc3RhY2tfbGlzdFtrXS53aWR0aCwgc3RhY2tfbGlzdFtrXS5oZWlnaHQsIHN0YWNrX2xpc3Rba10ueCwgc3RhY2tfbGlzdFtrXS55KTsKLQotCQkJaWYgKGNsaXBzaGlmdCkgewotCQkJCWF0dHIueCAtPSBjb2ZmX3g7Ci0JCQkJYXR0ci55IC09IGNvZmZfeTsKLQkJCX0KLQkJCWlmIChzdWJ3aW4pIHsKLQkJCQlhdHRyLnggLT0gb2ZmX3g7Ci0JCQkJYXR0ci55IC09IG9mZl95OwotCQkJfQotCi0JCQkvKgotCQkJICogZmlyc3Qgc3VidHJhY3QgYW55IG92ZXJsYXAgZnJvbSB0aGUgaW5pdGlhbAotCQkJICogd2luZG93IHJlY3RhbmdsZQotCQkJICovCi0KLQkJCS8qIGNsaXAgdGhlIHdpbmRvdyB0byB0aGUgdmlzaWJsZSBzY3JlZW46ICovCi0JCQl0eDEgPSBuZml4KGF0dHIueCwgZHB5X3gpOwotCQkJdHkxID0gbmZpeChhdHRyLnksIGRweV95KTsKLQkJCXR4MiA9IG5maXgoYXR0ci54ICsgYXR0ci53aWR0aCwgIGRweV94KzEpOwotCQkJdHkyID0gbmZpeChhdHRyLnkgKyBhdHRyLmhlaWdodCwgZHB5X3krMSk7Ci0KLWlmIChkYjIpIGZwcmludGYoc3RkZXJyLCAiICB0bXBfd2luLTE6ICU0ZCAlM2QsICU0ZCAlM2QgIDB4JWx4XG4iLAotCXR4MSwgdHkxLCB0eDIsIHR5Miwgc3dpbik7Ci1pZiAoZGIyICYmIHNhd19tZSkgY29udGludWU7Ci0KLQkJCS8qIHNlZSBpZiB3aW5kb3cgY2xpcHMgdXM6ICovCi0JCQl0bXBfd2luID0gc3JhUmduQ3JlYXRlUmVjdCh0eDEsIHR5MSwgdHgyLCB0eTIpOwotCQkJaWYgKHNyYVJnbkFuZCh0bXBfd2luLCBtb3ZlZF93aW4pKSB7Ci0JCQkJKm9ic2N1cmVkID0gMTsKLWlmIChkYjIpIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgOiBjbGlwcyBpdC5cbiIpOwotCQkJfQotCQkJc3JhUmduRGVzdHJveSh0bXBfd2luKTsKLQotCQkJLyogc3VidHJhY3QgaXQgZnJvbSBvdXIgcmVnaW9uOiAqLwotCQkJdG1wX3dpbiA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLCB0eTEsIHR4MiwgdHkyKTsKLQkJCXNyYVJnblN1YnRyYWN0KG1vdmVkX3dpbiwgdG1wX3dpbik7Ci0JCQlzcmFSZ25EZXN0cm95KHRtcF93aW4pOwotCi0JCQkvKgotCQkJICogbmV4dCwgc3VidHJhY3QgZnJvbSB0aGUgaW5pdGlhbCB3aW5kb3cgcmVjdGFuZ2xlCi0JCQkgKiBhbnl0aGluZyB0aGF0IHdvdWxkIGNsaXAgaXQuCi0JCQkgKi8KLQotCQkJLyogY2xpcCB0aGUgd2luZG93IHRvIHRoZSB2aXNpYmxlIHNjcmVlbjogKi8KLQkJCXR4MSA9IG5maXgoYXR0ci54IC0gZHgsIGRweV94KTsKLQkJCXR5MSA9IG5maXgoYXR0ci55IC0gZHksIGRweV95KTsKLQkJCXR4MiA9IG5maXgoYXR0ci54IC0gZHggKyBhdHRyLndpZHRoLCAgZHB5X3grMSk7Ci0JCQl0eTIgPSBuZml4KGF0dHIueSAtIGR5ICsgYXR0ci5oZWlnaHQsIGRweV95KzEpOwotCi1pZiAoZGIyKSBmcHJpbnRmKHN0ZGVyciwgIiAgdG1wX3dpbi0yOiAlNGQgJTNkLCAlNGQgJTNkICAweCVseFxuIiwKLQl0eDEsIHR5MSwgdHgyLCB0eTIsIHN3aW4pOwotaWYgKGRiMiAmJiBzYXdfbWUpIGNvbnRpbnVlOwotCi0JCQkvKiBzdWJ0cmFjdCBpdCBmcm9tIG91ciByZWdpb246ICovCi0JCQl0bXBfd2luID0gc3JhUmduQ3JlYXRlUmVjdCh0eDEsIHR5MSwgdHgyLCB0eTIpOwotCQkJc3JhUmduU3VidHJhY3QobW92ZWRfd2luLCB0bXBfd2luKTsKLQkJCXNyYVJnbkRlc3Ryb3kodG1wX3dpbik7Ci0JCX0KLQotCQlYX1VOTE9DSzsKLQotCQlpZiAoZXh0cmFfY2xpcCAmJiAhIHNyYVJnbkVtcHR5KGV4dHJhX2NsaXApKSB7Ci0JCSAgICB3aG9sZSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQotCQkgICAgaWYgKGNsaXBzaGlmdCkgewotCQkJc3JhUmduT2Zmc2V0KGV4dHJhX2NsaXAsIC1jb2ZmX3gsIC1jb2ZmX3kpOwotCQkgICAgfQotCQkgICAgaWYgKHN1YndpbikgewotCQkJc3JhUmduT2Zmc2V0KGV4dHJhX2NsaXAsIC1vZmZfeCwgLW9mZl95KTsKLQkJICAgIH0KLQotCQkgICAgaXRlciA9IHNyYVJnbkdldEl0ZXJhdG9yKGV4dHJhX2NsaXApOwotCQkgICAgd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCS8qIGNsaXAgdGhlIHdpbmRvdyB0byB0aGUgdmlzaWJsZSBzY3JlZW46ICovCi0JCQl0eDEgPSByZWN0LngxOwotCQkJdHkxID0gcmVjdC55MTsKLQkJCXR4MiA9IHJlY3QueDI7Ci0JCQl0eTIgPSByZWN0LnkyOwotCQkJdG1wX3dpbiA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLCB0eTEsIHR4MiwgdHkyKTsKLQkJCXNyYVJnbkFuZCh0bXBfd2luLCB3aG9sZSk7Ci0KLQkJCS8qIHNlZSBpZiB3aW5kb3cgY2xpcHMgdXM6ICovCi0JCQlpZiAoc3JhUmduQW5kKHRtcF93aW4sIG1vdmVkX3dpbikpIHsKLQkJCQkqb2JzY3VyZWQgPSAxOwotCQkJfQotCQkJc3JhUmduRGVzdHJveSh0bXBfd2luKTsKLQotCQkJLyogc3VidHJhY3QgaXQgZnJvbSBvdXIgcmVnaW9uOiAqLwotCQkJdG1wX3dpbiA9IHNyYVJnbkNyZWF0ZVJlY3QodHgxLCB0eTEsIHR4MiwgdHkyKTsKLQkJCXNyYVJnblN1YnRyYWN0KG1vdmVkX3dpbiwgdG1wX3dpbik7Ci0JCQlzcmFSZ25EZXN0cm95KHRtcF93aW4pOwotCi0JCQkvKgotCQkJICogbmV4dCwgc3VidHJhY3QgZnJvbSB0aGUgaW5pdGlhbCB3aW5kb3cgcmVjdGFuZ2xlCi0JCQkgKiBhbnl0aGluZyB0aGF0IHdvdWxkIGNsaXAgaXQuCi0JCQkgKi8KLQkJCXRtcF93aW4gPSBzcmFSZ25DcmVhdGVSZWN0KHR4MSwgdHkxLCB0eDIsIHR5Mik7Ci0JCQlzcmFSZ25PZmZzZXQodG1wX3dpbiwgLWR4LCAtZHkpOwotCi0JCQkvKiBjbGlwIHRoZSB3aW5kb3cgdG8gdGhlIHZpc2libGUgc2NyZWVuOiAqLwotCQkJc3JhUmduQW5kKHRtcF93aW4sIHdob2xlKTsKLQotCQkJLyogc3VidHJhY3QgaXQgZnJvbSBvdXIgcmVnaW9uOiAqLwotCQkJc3JhUmduU3VidHJhY3QobW92ZWRfd2luLCB0bXBfd2luKTsKLQkJCXNyYVJnbkRlc3Ryb3kodG1wX3dpbik7Ci0JCSAgICB9Ci0JCSAgICBzcmFSZ25SZWxlYXNlSXRlcmF0b3IoaXRlcik7Ci0JCSAgICBzcmFSZ25EZXN0cm95KHdob2xlKTsKLQkJfQotCi0JCWR0ID0gZHRpbWUoJnRtKTsKLWlmIChkYjIpIGZwcmludGYoc3RkZXJyLCAiICBzdGFja193b3JrIGR0OiAlLjRmXG4iLCBkdCk7Ci0KLQkJaWYgKCpvYnNjdXJlZCAmJiAhc3RyY21wKHdpcmVmcmFtZV9jb3B5cmVjdCwgInRvcCIpKSB7Ci0JCQk7CS8qIGNhbm5vdCBzZW5kIENvcHlSZWdpb24gKi8KLQkJfSBlbHNlIGlmICghIHNyYVJnbkVtcHR5KG1vdmVkX3dpbikpIHsKLQkJCXNyYVJlZ2lvblB0ciB3aG9sZSwgc2hpZnRlZF9yZWdpb247Ci0KLQkJCXdob2xlID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCQkJc2hpZnRlZF9yZWdpb24gPSBzcmFSZ25DcmVhdGVSZ24obW92ZWRfd2luKTsKLQkJCXNyYVJnbk9mZnNldChzaGlmdGVkX3JlZ2lvbiwgZHgsIGR5KTsKLQkJCXNyYVJnbkFuZChzaGlmdGVkX3JlZ2lvbiwgd2hvbGUpOwotCi0JCQlzcmFSZ25EZXN0cm95KHdob2xlKTsKLQotCQkJLyogbm93IHNlbmQgdGhlIENvcHlSZWdpb246ICovCi0JCQlpZiAoISBzcmFSZ25FbXB0eShzaGlmdGVkX3JlZ2lvbikpIHsKLQkJCQlkdGltZTAoJnRtKTsKLQkJCQlpZiAoIW5iYXRjaCkgewotCQkJCQlkb19jb3B5cmVnaW9uKHNoaWZ0ZWRfcmVnaW9uLCBkeCwgZHksIDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhdGNoX2R4c1sqbmJhdGNoXSA9IGR4OwotCQkJCQliYXRjaF9keXNbKm5iYXRjaF0gPSBkeTsKLQkJCQkJYmF0Y2hfcmVnWypuYmF0Y2hdID0gc3JhUmduQ3JlYXRlUmduKHNoaWZ0ZWRfcmVnaW9uKTsKLQkJCQkJKCpuYmF0Y2gpKys7Ci0JCQkJCQotCQkJCX0KLQkJCQlkdCA9IGR0aW1lKCZ0bSk7Ci1pZiAoMCB8fCBkYjIpIGZwcmludGYoc3RkZXJyLCAiZG9fY29weXJlZ2lvbjogJWQgJWQgJWQgJWQgIGR4OiAlZCAgZHk6ICVkIGR0OiAlLjRmXG4iLAotCXR4MSwgdHkxLCB0eDIsIHR5MiwgZHgsIGR5LCBkdCk7Ci0JCQkJc2VudF9jb3B5cmVjdCA9IDE7Ci0JCQl9Ci0JCQlzcmFSZ25EZXN0cm95KHNoaWZ0ZWRfcmVnaW9uKTsKLQkJfQotCQlzcmFSZ25EZXN0cm95KG1vdmVkX3dpbik7Ci0JfQotCXJldHVybiBzZW50X2NvcHlyZWN0OwotfQotCQkKLWludCBuZWFyX3dtX2VkZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBweCwgaW50IHB5KSB7Ci0JLyogaGV1cmlzdGljczogKi8KLQlpbnQgd2ZfdCA9IHdpcmVmcmFtZV90b3A7Ci0JaW50IHdmX2IgPSB3aXJlZnJhbWVfYm90OwotCWludCB3Zl9sID0gd2lyZWZyYW1lX2xlZnQ7Ci0JaW50IHdmX3IgPSB3aXJlZnJhbWVfcmlnaHQ7Ci0KLQlpbnQgbmVhcl9lZGdlID0gMDsKLQkKLQlpZiAod2ZfdCB8fCB3Zl9iIHx8IHdmX2wgfHwgd2ZfcikgewotCQlpZiAobmFicyh5IC0gcHkpIDwgd2ZfdCkgewotCQkJbmVhcl9lZGdlID0gMTsKLQkJfQotCQlpZiAobmFicyh5ICsgaCAtIHB5KSA8IHdmX2IpIHsKLQkJCW5lYXJfZWRnZSA9IDE7Ci0JCX0KLQkJaWYgKG5hYnMoeCAtIHB4KSA8IHdmX2wpIHsKLQkJCW5lYXJfZWRnZSA9IDE7Ci0JCX0KLQkJaWYgKG5hYnMoeCArIHcgLSBweCkgPCB3Zl9yKSB7Ci0JCQluZWFyX2VkZ2UgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogYWxsIHplcm87IGFsd2F5cyAibmVhciIgZWRnZTogKi8KLQkJbmVhcl9lZGdlID0gMTsKLQl9Ci0JcmV0dXJuIG5lYXJfZWRnZTsKLX0KLQotaW50IG5lYXJfc2Nyb2xsYmFyX2VkZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBweCwgaW50IHB5KSB7Ci0JLyogaGV1cmlzdGljczogKi8KLQlpbnQgc2JfdCA9IHNjcm9sbGNvcHlyZWN0X3RvcDsKLQlpbnQgc2JfYiA9IHNjcm9sbGNvcHlyZWN0X2JvdDsKLQlpbnQgc2JfbCA9IHNjcm9sbGNvcHlyZWN0X2xlZnQ7Ci0JaW50IHNiX3IgPSBzY3JvbGxjb3B5cmVjdF9yaWdodDsKLQotCWludCBuZWFyX2VkZ2UgPSAwOwotCQotCWlmIChzYl90IHx8IHNiX2IgfHwgc2JfbCB8fCBzYl9yKSB7Ci0JCWlmIChuYWJzKHkgLSBweSkgPCBzYl90KSB7Ci0JCQluZWFyX2VkZ2UgPSAxOwotCQl9Ci0JCWlmIChuYWJzKHkgKyBoIC0gcHkpIDwgc2JfYikgewotCQkJbmVhcl9lZGdlID0gMTsKLQkJfQotCQlpZiAobmFicyh4IC0gcHgpIDwgc2JfbCkgewotCQkJbmVhcl9lZGdlID0gMTsKLQkJfQotCQlpZiAobmFicyh4ICsgdyAtIHB4KSA8IHNiX3IpIHsKLQkJCW5lYXJfZWRnZSA9IDE7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBhbGwgemVybzsgYWx3YXlzICJuZWFyIiBlZGdlOiAqLwotCQluZWFyX2VkZ2UgPSAxOwotCX0KLQlyZXR1cm4gbmVhcl9lZGdlOwotfQotCi12b2lkIGNoZWNrX2ZpeHNjcmVlbih2b2lkKSB7Ci0JZG91YmxlIG5vdyA9IGRub3coKTsKLQlpbnQgZGlkZnVsbCA9IDAsIGRiID0gMDsKLQotCWlmICghY2xpZW50X2NvdW50KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JaWYgKHNjcmVlbl9maXh1cF9YID4gMC4wKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdCA9IDAuMDsKLQkJaWYgKG5vdyA+IGxhc3QgKyBzY3JlZW5fZml4dXBfWCkgewotCQkJaWYgKGRiKSByZmJMb2coImRvaW5nIHNjcmVlbl9maXh1cF9YXG4iKTsKLQkJCWRvX2NvcHlfc2NyZWVuID0gMTsKLQkJCWxhc3QgPSBub3c7Ci0JCQlkaWRmdWxsID0gMTsKLQkJfQotCQkKLQl9Ci0JaWYgKHNjcmVlbl9maXh1cF9WID4gMC4wKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdCA9IDAuMDsKLQkJaWYgKG5vdyA+IGxhc3QgKyBzY3JlZW5fZml4dXBfVikgewotCQkJaWYgKCEgZGlkZnVsbCkgewotCQkJCXJlZnJlc2hfc2NyZWVuKDApOwotCQkJCWlmIChkYikgcmZiTG9nKCJkb2luZyBzY3JlZW5fZml4dXBfVlxuIik7Ci0JCQl9Ci0JCQlsYXN0ID0gbm93OwotCQkJZGlkZnVsbCA9IDE7Ci0JCX0KLQl9Ci0JaWYgKHNjcmVlbl9maXh1cF9DID4gMC4wKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdCA9IDAuMDsKLQkJaWYgKGxhc3RfY29weXJlY3RfZml4IDwgbGFzdF9jb3B5cmVjdCAmJgotCQkgICAgbm93ID4gbGFzdF9jb3B5cmVjdCArIHNjcmVlbl9maXh1cF9DKSB7Ci0JCQlpZiAoISBkaWRmdWxsKSB7Ci0JCQkJcmVmcmVzaF9zY3JlZW4oMCk7Ci0JCQkJaWYgKGRiKSByZmJMb2coImRvaW5nIHNjcmVlbl9maXh1cF9DXG4iKTsKLQkJCX0KLQkJCWxhc3RfY29weXJlY3RfZml4ID0gbm93OwotCQkJbGFzdCA9IG5vdzsKLQkJCWRpZGZ1bGwgPSAxOwotCQl9Ci0JfQotCWlmIChzY2FsaW5nICYmIGxhc3RfY29weXJlY3RfZml4IDwgbGFzdF9jb3B5cmVjdCkgewotCQlzdGF0aWMgZG91YmxlIGxhc3QgPSAwLjA7Ci0JCWRvdWJsZSBkZWxheSA9IDMuMDsKLQkJaWYgKG5vdyA+IGxhc3QgKyBkZWxheSkgewotCQkJaWYgKCEgZGlkZnVsbCkgewotCQkJCXNjYWxlX2FuZF9tYXJrX3JlY3QoMCwgMCwgZHB5X3gsIGRweV95LCAxKTsKLQkJCQlpZiAoZGIpIHJmYkxvZygiZG9pbmcgc2NhbGUgc2NyZWVuX2ZpeHVwXG4iKTsKLQkJCX0KLQkJCWxhc3RfY29weXJlY3RfZml4ID0gbm93OwotCQkJbGFzdCA9IG5vdzsKLQkJCWRpZGZ1bGwgPSAxOwotCQl9Ci0JfQotCWlmIChhZHZlcnRpc2VfdHJ1ZWNvbG9yICYmIGFkdmVydGlzZV90cnVlY29sb3JfcmVzZXQgJiYgaW5kZXhlZF9jb2xvcikgewotCQkvKiB0aGlzIHdpbGwgcmVzZXQgZnJhbWVidWZmZXIgdG8gY29ycmVjdCBjb2xvcnMsIGlmIG5lZWRlZCAqLwotCQlzdGF0aWMgZG91YmxlIGRsYXN0ID0gMC4wOwotCQlub3cgPSBkbm93KCk7Ci0JCWlmIChub3cgPiBsYXN0X2NsaWVudCArIDEuMCAmJiBub3cgPCBsYXN0X2NsaWVudCArIDMuMCAmJiBub3cgPiBkbGFzdCArIDUuMCkgewotCQkJcmZiTG9nKCJhZHZlcnRpc2UgdHJ1ZWNvbG9yIHJlc2V0IGZyYW1lYnVmZmVyXG4iKTsKLQkJCWRvX25ld19mYigxKTsKLQkJCWRsYXN0ID0gZG5vdygpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHdpcmVmcmFtZV9tb2Rfc3RhdGUoKSB7Ci0JaWYgKCEgd2lyZWZyYW1lX21vZHMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghc3RyY21wKHdpcmVmcmFtZV9tb2RzLCAiYWxsIikpIHsKLQkJaWYgKHRyYWNrX21vZF9zdGF0ZShOb1N5bWJvbCwgRkFMU0UsIEZBTFNFKSkgewotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfSBlbHNlIGlmICghc3RyY21wKHdpcmVmcmFtZV9tb2RzLCAiQWx0IikpIHsKLQkJaWYgKHRyYWNrX21vZF9zdGF0ZShYS19BbHRfTCwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0cmFja19tb2Rfc3RhdGUoWEtfQWx0X1IsIEZBTFNFLCBGQUxTRSkgPT0gMSkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAod2lyZWZyYW1lX21vZHMsICJTaGlmdCIpKSB7Ci0JCWlmICh0cmFja19tb2Rfc3RhdGUoWEtfU2hpZnRfTCwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0cmFja19tb2Rfc3RhdGUoWEtfU2hpZnRfUiwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSBpZiAoIXN0cmNtcCh3aXJlZnJhbWVfbW9kcywgIkNvbnRyb2wiKSkgewotCQlpZiAodHJhY2tfbW9kX3N0YXRlKFhLX0NvbnRyb2xfTCwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0cmFja19tb2Rfc3RhdGUoWEtfQ29udHJvbF9SLCBGQUxTRSwgRkFMU0UpID09IDEpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JfSBlbHNlIGlmICghc3RyY21wKHdpcmVmcmFtZV9tb2RzLCAiTWV0YSIpKSB7Ci0JCWlmICh0cmFja19tb2Rfc3RhdGUoWEtfTWV0YV9MLCBGQUxTRSwgRkFMU0UpID09IDEpIHsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKHRyYWNrX21vZF9zdGF0ZShYS19NZXRhX1IsIEZBTFNFLCBGQUxTRSkgPT0gMSkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAod2lyZWZyYW1lX21vZHMsICJTdXBlciIpKSB7Ci0JCWlmICh0cmFja19tb2Rfc3RhdGUoWEtfU3VwZXJfTCwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0cmFja19tb2Rfc3RhdGUoWEtfU3VwZXJfUiwgRkFMU0UsIEZBTFNFKSA9PSAxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSBpZiAoIXN0cmNtcCh3aXJlZnJhbWVfbW9kcywgIkh5cGVyIikpIHsKLQkJaWYgKHRyYWNrX21vZF9zdGF0ZShYS19IeXBlcl9MLCBGQUxTRSwgRkFMU0UpID09IDEpIHsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKHRyYWNrX21vZF9zdGF0ZShYS19IeXBlcl9SLCBGQUxTRSwgRkFMU0UpID09IDEpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IE5QUF9ucmVnID0gMDsKLXN0YXRpYyBzcmFSZWdpb25QdHIgTlBQX3JvZmZzY3JlZW4gPSBOVUxMOwotc3RhdGljIHNyYVJlZ2lvblB0ciBOUFBfcl9ic190bXAgPSBOVUxMOwotc3RhdGljIFdpbmRvdyBOUFBfbndpbiA9IE5vbmU7Ci0KLXZvaWQgY2xlYXJfd2luX2V2ZW50cyhXaW5kb3cgd2luLCBpbnQgdmlzKSB7Ci0jaWYgIU5PX1gxMQotCWlmIChkcHkgJiYgd2luICE9IE5vbmUgJiYgbmNhY2hlKSB7Ci0JCVhFdmVudCBldjsKLQkJWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlcjsKLQkJb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQkJdHJhcHBlZF94ZXJyb3IgPSAwOwotCQl3aGlsZSAoWENoZWNrVHlwZWRXaW5kb3dFdmVudChkcHksIHdpbiwgQ29uZmlndXJlTm90aWZ5LCAmZXYpKSB7Ci0JCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIuIik7Ci0JCQlpZiAodHJhcHBlZF94ZXJyb3IpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJfQotLyogWFhYIFkgKi8KLQkJaWYgKHZpcykgewotCQkJd2hpbGUgKFhDaGVja1R5cGVkV2luZG93RXZlbnQoZHB5LCB3aW4sIFZpc2liaWxpdHlOb3RpZnksICZldikpIHsKLQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIrIik7Ci0JCQkJaWYgKHRyYXBwZWRfeGVycm9yKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCQl9Ci0JCX0KLQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIiAweCVseFxuIiwgd2luKTsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBwdXNoX2JvcmRlcnMoc3JhUmVjdCAqcmVjdHMsIGludCBucmVjdCkgewotCQlpbnQgaSwgcyA9IDI7Ci0JCXNyYVJlZ2lvblB0ciByMCwgcjEsIHIyOwotCi0JCXIwID0gc3JhUmduQ3JlYXRlKCk7IAotCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsgCi0KLQkJZm9yIChpPTA7IGk8bnJlY3Q7IGkrKykgewotCQkJaW50IHggPSByZWN0c1tpXS54MTsKLQkJCWludCB5ID0gcmVjdHNbaV0ueTE7Ci0JCQlpbnQgdyA9IHJlY3RzW2ldLngyOwotCQkJaW50IGggPSByZWN0c1tpXS55MjsKLQotCQkJaWYgKHcgPiAwICYmIGggPiAwICYmIHcgKiBoID4gNjQgKiA2NCkgewotCQkJCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4IC0gcywgeSAsIHggLCB5ICsgaCk7IAotCQkJCXNyYVJnbk9yKHIwLCByMik7IAotCQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQkJCQotCQkJCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4ICsgdywgeSAsIHggKyB3ICsgcywgeSArIGgpOyAKLQkJCQlzcmFSZ25PcihyMCwgcjIpOyAKLQkJCQlzcmFSZ25EZXN0cm95KHIyKTsKLQotCQkJCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4IC0gcywgeSAtIHMsIHggKyB3ICsgcywgeSArIHMpOyAKLQkJCQlzcmFSZ25PcihyMCwgcjIpOyAKLQkJCQlzcmFSZ25EZXN0cm95KHIyKTsKLQkJCQkKLQkJCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QoeCAtIHMsIHkgLCB4ICsgdyArIHMsIHkgKyBoICsgcyk7IAotCQkJCXNyYVJnbk9yKHIwLCByMik7IAotCQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQkJfQotCQl9Ci0KLQkJc3JhUmduQW5kKHIwLCByMSk7IAotCi0JCWlmICghc3JhUmduRW1wdHkocjApKSB7Ci0JCQlkb3VibGUgZCA9IGRub3coKTsKLQkJCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCQkJc3JhUmVjdCByZWN0OwotCQkJaW50IGRiID0gMDsKLQotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlNDQUxFX0JPUkRFUlxuIik7Ci0JCQlmYl9wdXNoX3dhaXQoMC4wNSwgRkJfTU9EfEZCX0NPUFkpOwotCi0JCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IocjApOwotCQkJd2hpbGUgKHNyYVJnbkl0ZXJhdG9yTmV4dChpdGVyLCAmcmVjdCkpIHsKLQkJCQkvKiBjbGlwIHRoZSB3aW5kb3cgdG8gdGhlIHZpc2libGUgc2NyZWVuOiAqLwotCQkJCWludCB0eDEgPSByZWN0LngxOwotCQkJCWludCB0eTEgPSByZWN0LnkxOwotCQkJCWludCB0eDIgPSByZWN0LngyOwotCQkJCWludCB0eTIgPSByZWN0LnkyOwotCQkJCXNjYWxlX2FuZF9tYXJrX3JlY3QodHgxLCB0eTEsIHR4MiwgdHkyLCAxKTsKLQkJCX0KLQkJCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlNDQUxFX0JPUkRFUiAlLjRmXG4iLCBkbm93KCkgLSBkKTsKLQkJCWZiX3B1c2hfd2FpdCgwLjEsIEZCX01PRHxGQl9DT1BZKTsKLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJTQ0FMRV9CT1JERVIgJS40ZlxuIiwgZG5vdygpIC0gZCk7Ci0JCX0KLQkJc3JhUmduRGVzdHJveShyMCk7Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotfQotCi12b2lkIG5jYWNoZV9wcmVfcG9ydGlvbnMoV2luZG93IG9yaWdfZnJhbWUsIFdpbmRvdyBmcmFtZSwgaW50ICpuaWR4X2luLCBpbnQgdHJ5X2JhdGNoLCBpbnQgKnVzZV9iYXRjaCwKLSAgICBpbnQgb3JpZ194LCBpbnQgb3JpZ195LCBpbnQgb3JpZ193LCBpbnQgb3JpZ19oLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIG50aW0pIHsKLQlpbnQgbmlkeCwgbnAgPSBuY2FjaGVfcGFkOwotCi0JaWYgKCFudGltKSB7fQotCSp1c2VfYmF0Y2ggPSAwOwotCSpuaWR4X2luID0gLTE7Ci0JTlBQX25yZWcgPSAwOwotCU5QUF9yb2Zmc2NyZWVuID0gTlVMTDsKLQlOUFBfcl9ic190bXAgPSBOVUxMOwotCU5QUF9ud2luID0gTm9uZTsKLQkKLQlpZiAobmNhY2hlIDw9IDApIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChyb3RhdGluZykgewotCQl0cnlfYmF0Y2ggPSAwOwotCX0KLQotCWlmICgqbmlkeF9pbiA9PSAtMSkgewotCQluaWR4ID0gbG9va3VwX3dpbl9pbmRleChvcmlnX2ZyYW1lKTsKLQkJTlBQX253aW4gPSBvcmlnX2ZyYW1lOwotCQlpZiAobmlkeCA8IDApIHsKLQkJCW5pZHggPSBsb29rdXBfd2luX2luZGV4KGZyYW1lKTsKLQkJCU5QUF9ud2luID0gZnJhbWU7Ci0JCX0KLQl9IGVsc2UgewotCQluaWR4ID0gKm5pZHhfaW47Ci0JfQotCWlmIChuaWR4ID4gMCkgewotCQlzcmFSZWdpb25QdHIgcjAsIHIxLCByMjsKLQkJaW50IGR4LCBkeTsKLQkJaW50IGJzX3ggPSBjYWNoZV9saXN0W25pZHhdLmJzX3g7CQotCQlpbnQgYnNfeSA9IGNhY2hlX2xpc3RbbmlkeF0uYnNfeTsJCi0JCWludCBic193ID0gY2FjaGVfbGlzdFtuaWR4XS5ic193OwkKLQkJaW50IGJzX2ggPSBjYWNoZV9saXN0W25pZHhdLmJzX2g7CQotCi0JCSpuaWR4X2luID0gbmlkeDsKLQotCQlpZiAoYnNfeCA8IDApIHsKLQkJCWlmICghZmluZF9yZWN0KG5pZHgsIHgsIHksIHcsIGgpKSB7Ci0JCQkJbmlkeCA9IC0xOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJzX3ggPSBjYWNoZV9saXN0W25pZHhdLmJzX3g7Ci0JCQlic195ID0gY2FjaGVfbGlzdFtuaWR4XS5ic195OwotCQkJYnNfdyA9IGNhY2hlX2xpc3RbbmlkeF0uYnNfdzsKLQkJCWJzX2ggPSBjYWNoZV9saXN0W25pZHhdLmJzX2g7Ci0JCX0KLQkJaWYgKGJzX3ggPCAwKSB7Ci0JCQluaWR4ID0gLTE7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodHJ5X2JhdGNoKSB7Ci0JCQkqdXNlX2JhdGNoID0gMTsKLQkJfQotCi0JCWlmIChuY2FjaGVfcGFkKSB7Ci0JCQlvcmlnX3ggLT0gbnA7CQotCQkJb3JpZ195IC09IG5wOwkKLQkJCW9yaWdfdyArPSAyICogbnA7CQotCQkJb3JpZ19oICs9IDIgKiBucDsJCi0JCQl4IC09IG5wOwkKLQkJCXkgLT0gbnA7CQotCQkJdyArPSAyICogbnA7CQotCQkJaCArPSAyICogbnA7CQotCQl9Ci0KLQkJaWYgKGNsaXBzaGlmdCkgewotCQkJb3JpZ194IC09IGNvZmZfeDsKLQkJCW9yaWdfeSAtPSBjb2ZmX3k7Ci0JCQl4IC09IGNvZmZfeDsKLQkJCXkgLT0gY29mZl95OwotCQl9Ci0KLQkJcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7IAotCi0JCXIyID0gc3JhUmduQ3JlYXRlUmVjdChvcmlnX3gsIG9yaWdfeSwgb3JpZ194ICsgb3JpZ193LCBvcmlnX3kgKyBvcmlnX2gpOwotCQlzcmFSZ25TdWJ0cmFjdChyMiwgcjApOwotCQlpZiAoISBzcmFSZ25FbXB0eShyMikgJiYgY2FjaGVfbGlzdFtuaWR4XS5ic190aW1lID4gMC4wKSB7Ci0JCQkvKiBzb21lIGlzIGluaXRpYWxseSBvZmZzY3JlZW4gKi8KLQkJCWR4ID0gYnNfeCAtIG9yaWdfeDsKLQkJCWR5ID0gYnNfeSAtIG9yaWdfeTsKLQkJCXNyYVJnbk9mZnNldChyMiwgZHgsIGR5KTsKLQkJCWR4ID0gMDsKLQkJCWR5ID0gZHB5X3k7Ci0JCQlzcmFSZ25PZmZzZXQocjIsIGR4LCBkeSk7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJGQl9DT1BZOiAlLjRmIDEpIG9mZnNjcmVlbjogIGR4LCBkeTogJWQsICVkIC0+ICVkLCAlZCBvcmlnICVkeCVkKyVkKyVkIGJzX3h5OiAlZCAlZFxuIiwKLSAgICBkbm93KCkgLSBudGltLCBic194IC0gb3JpZ194LCBic195IC0gb3JpZ195LCBkeCwgZHksIG9yaWdfdywgb3JpZ19oLCBvcmlnX3gsIG9yaWdfeSwgYnNfeCwgYnNfeSk7Ci0KLQkJCS8qIDApIHNhdmUgaXQgaW4gdGhlIGludmFsaWQgKG9mZnNjcmVlbikgU1UgcG9ydGlvbiAqLwotCQkJaWYgKCEgKnVzZV9iYXRjaCkgewotCQkJCWRvX2NvcHlyZWdpb24ocjIsIGR4LCBkeSwgMCk7Ci0JCQkJaWYgKCEgZmJfcHVzaF93YWl0KDAuMiwgRkJfQ09QWSkpIHsKLQkJCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQliYXRjaF9keHNbTlBQX25yZWddID0gZHg7Ci0JCQkJYmF0Y2hfZHlzW05QUF9ucmVnXSA9IGR5OwotCQkJCWJhdGNoX3JlZ1tOUFBfbnJlZysrXSA9IHNyYVJnbkNyZWF0ZVJnbihyMik7Ci0JCQl9Ci0JCQlOUFBfcm9mZnNjcmVlbiA9IHNyYVJnbkNyZWF0ZVJnbihyMik7Ci0JCX0KLQkJc3JhUmduRGVzdHJveShyMik7Ci0KLQkJLyogMSkgdXNlIGJzIGZvciB0ZW1wIHN0b3JhZ2Ugb2YgdGhlIG5ldyBzYXZlIHVuZGVyLiAqLwotCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCArIHcsIHkgKyBoKTsKLQkJc3JhUmduQW5kKHIxLCByMCk7Ci0KLQkJZHggPSBic194IC0geDsKLQkJZHkgPSBic195IC0geTsKLQkJc3JhUmduT2Zmc2V0KHIxLCBkeCwgZHkpOwotCi1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJGQl9DT1BZOiAlLjRmIDEpIHVzZSB0bXAgYnM6XG4iLCBkbm93KCkgLSBudGltKTsKLQkJaWYgKCEgKnVzZV9iYXRjaCkgewotCQkJZG9fY29weXJlZ2lvbihyMSwgZHgsIGR5LCAwKTsKLQkJCWlmICghIGZiX3B1c2hfd2FpdCgwLjIsIEZCX0NPUFkpKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJGQl9DT1BZOiAlLjRmIDEpIEZBSUxFRC5cbiIsIGRub3coKSAtIG50aW0pOwotCQkJCWZiX3B1c2hfd2FpdCgwLjEsIEZCX0NPUFkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmF0Y2hfZHhzW05QUF9ucmVnXSA9IGR4OwotCQkJYmF0Y2hfZHlzW05QUF9ucmVnXSA9IGR5OwotCQkJYmF0Y2hfcmVnW05QUF9ucmVnKytdID0gc3JhUmduQ3JlYXRlUmduKHIxKTsKLQkJfQotCQlOUFBfcl9ic190bXAgPSBzcmFSZ25DcmVhdGVSZ24ocjEpOwotCQlzcmFSZ25EZXN0cm95KHIwKTsKLQkJc3JhUmduRGVzdHJveShyMSk7Ci0JfQotfQotCi12b2lkIG5jYWNoZV9wb3N0X3BvcnRpb25zKGludCBuaWR4LCBpbnQgdXNlX2JhdGNoLCBpbnQgb3JpZ194LCBpbnQgb3JpZ195LCBpbnQgb3JpZ193LCBpbnQgb3JpZ19oLAotICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBkb3VibGUgYmF0Y2hfZGVsYXksIGRvdWJsZSBudGltKSB7Ci0JaW50IG5wID0gbmNhY2hlX3BhZDsKLQlpbnQgZGIgPSAwOwotCi0JaWYgKG5jYWNoZSA+IDAgJiYgbmlkeCA+PSAwKSB7Ci0JCXNyYVJlZ2lvblB0ciByMCwgcjEsIHIyLCByMzsKLQkJaW50IGR4LCBkeTsKLQkJaW50IHN1X3ggPSBjYWNoZV9saXN0W25pZHhdLnN1X3g7Ci0JCWludCBzdV95ID0gY2FjaGVfbGlzdFtuaWR4XS5zdV95OwotCQlpbnQgc3VfdyA9IGNhY2hlX2xpc3RbbmlkeF0uc3VfdzsKLQkJaW50IHN1X2ggPSBjYWNoZV9saXN0W25pZHhdLnN1X2g7Ci0JCWludCBic194ID0gY2FjaGVfbGlzdFtuaWR4XS5ic194OwotCQlpbnQgYnNfeSA9IGNhY2hlX2xpc3RbbmlkeF0uYnNfeTsKLQkJaW50IGJzX3cgPSBjYWNoZV9saXN0W25pZHhdLmJzX3c7Ci0JCWludCBic19oID0gY2FjaGVfbGlzdFtuaWR4XS5ic19oOwotCQlpbnQgc29tZV9zdSA9IDA7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzdTogJWR4JWQrJWQrJWQgIGJzOiAlZHglZCslZCslZFxuIiwgc3Vfdywgc3VfaCwgc3VfeCwgc3VfeSwgYnNfdywgYnNfaCwgYnNfeCwgYnNfeSk7Ci0KLQkJaWYgKGJzX3ggPCAwKSB7Ci0JCQlpZiAoIWZpbmRfcmVjdChuaWR4LCB4LCB5LCB3LCBoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1X3ggPSBjYWNoZV9saXN0W25pZHhdLnN1X3g7Ci0JCQlzdV95ID0gY2FjaGVfbGlzdFtuaWR4XS5zdV95OwotCQkJc3VfdyA9IGNhY2hlX2xpc3RbbmlkeF0uc3VfdzsKLQkJCXN1X2ggPSBjYWNoZV9saXN0W25pZHhdLnN1X2g7Ci0JCQlic194ID0gY2FjaGVfbGlzdFtuaWR4XS5ic194OwotCQkJYnNfeSA9IGNhY2hlX2xpc3RbbmlkeF0uYnNfeTsKLQkJCWJzX3cgPSBjYWNoZV9saXN0W25pZHhdLmJzX3c7Ci0JCQlic19oID0gY2FjaGVfbGlzdFtuaWR4XS5ic19oOwotCQl9Ci0JCWlmIChic194IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5jYWNoZV9wYWQpIHsKLQkJCW9yaWdfeCAtPSBucDsJCi0JCQlvcmlnX3kgLT0gbnA7CQotCQkJb3JpZ193ICs9IDIgKiBucDsJCi0JCQlvcmlnX2ggKz0gMiAqIG5wOwkKLQkJCXggLT0gbnA7CQotCQkJeSAtPSBucDsJCi0JCQl3ICs9IDIgKiBucDsJCi0JCQloICs9IDIgKiBucDsJCi0JCX0KLQotCQlpZiAoY2xpcHNoaWZ0KSB7Ci0JCQlvcmlnX3ggLT0gY29mZl94OwotCQkJb3JpZ195IC09IGNvZmZfeTsKLQkJCXggLT0gY29mZl94OwotCQkJeSAtPSBjb2ZmX3k7Ci0JCX0KLQotCQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsgCi0KLQkJLyogMGIpIGNvcHkgdGhpcyBicyBwYXJ0IHN0b3JlZCBpbiBzYXZldW5kZXIgKi8KLQkJaWYgKE5QUF9yb2Zmc2NyZWVuICE9IE5VTEwpIHsKLQkJCWR4ID0geCAtIHN1X3g7Ci0JCQlkeSA9IHkgLSBzdV95OwotCQkJc3JhUmduT2Zmc2V0KE5QUF9yb2Zmc2NyZWVuLCBkeCwgZHkpOwotCQkJc3JhUmduQW5kKE5QUF9yb2Zmc2NyZWVuLCByMCk7Ci0JCQkKLQkJCWlmICghIHVzZV9iYXRjaCkgewotCQkJCWRvX2NvcHlyZWdpb24oTlBQX3JvZmZzY3JlZW4sIGR4LCBkeSwgMCk7Ci0JCQkJaWYgKCFmYl9wdXNoX3dhaXQoMC4yLCBGQl9DT1BZKSkgewotCQkJCQlmYl9wdXNoX3dhaXQoMC4xLCBGQl9DT1BZKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJhdGNoX2R4c1tOUFBfbnJlZ10gPSBkeDsKLQkJCQliYXRjaF9keXNbTlBQX25yZWddID0gZHk7Ci0JCQkJYmF0Y2hfcmVnW05QUF9ucmVnKytdID0gc3JhUmduQ3JlYXRlUmduKE5QUF9yb2Zmc2NyZWVuKTsKLQkJCX0KLQkJCXNyYVJnbkRlc3Ryb3koTlBQX3JvZmZzY3JlZW4pOwotCQl9Ci0KLQkJLyogMykgY29weSBmcm9tIHRoZSBzYXZldW5kZXIgdG8gd2hlcmUgb3JpZyB3aW4gd2FzICovCi0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdChvcmlnX3gsIG9yaWdfeSwgb3JpZ194ICsgb3JpZ193LCBvcmlnX3kgKyBvcmlnX2gpOwotCQlzcmFSZ25BbmQocjEsIHIwKTsKLQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHgrbnAsIHkrbnAsIHggKyB3LW5wLCB5ICsgaC1ucCk7Ci0JCXNyYVJnbkFuZChyMiwgcjApOwotCQlzcmFSZ25TdWJ0cmFjdChyMSwgcjIpOwotCi0JCWR4ID0gb3JpZ194IC0gc3VfeDsKLQkJZHkgPSBvcmlnX3kgLSBzdV95OwotaWYgKGRiICYmIG5jZGIpIGZwcmludGYoc3RkZXJyLCAiRkJfQ09QWTogJS40ZiAzKSBzZW50X2NvcHlyZWN0OiBzdV9yZXN0b3JlOiAlZCAlZFxuIiwgZG5vdygpIC0gbnRpbSwgZHgsIGR5KTsKLQkJaWYgKGNhY2hlX2xpc3RbbmlkeF0uc3VfdGltZSA9PSAwLjApIHsKLQkJCTsKLQkJfSBlbHNlIGlmICghIHVzZV9iYXRjaCkgewotCQkJZG9fY29weXJlZ2lvbihyMSwgZHgsIGR5LCAwKTsKLQkJCWlmICghZmJfcHVzaF93YWl0KDAuMiwgRkJfQ09QWSkpIHsKLWlmIChkYiAmJiBuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFk6ICUuNGYgMykgRkFJTEVELlxuIiwgZG5vdygpIC0gbnRpbSk7Ci0JCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXRjaF9keHNbTlBQX25yZWddID0gZHg7Ci0JCQliYXRjaF9keXNbTlBQX25yZWddID0gZHk7Ci0JCQliYXRjaF9yZWdbTlBQX25yZWcrK10gPSBzcmFSZ25DcmVhdGVSZ24ocjEpOwotCQl9Ci1pZiAoZGIgJiYgbmNkYikgZnByaW50ZihzdGRlcnIsICJzZW50X2NvcHlyZWN0OiAlLjRmIHN1X3Jlc3RvcmU6IGRvbmUuXG4iLCBkbm93KCkgLSBudGltKTsKLQkJc3JhUmduRGVzdHJveShyMCk7Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCQlzcmFSZ25EZXN0cm95KHIyKTsKLQotCQkvKiA0KSBpZiBvdmVybGFwIGJldHdlZW4gb3JpZyBhbmQgZGlzcGxhY2VkLCBtb3ZlIHRoZSBjb3JuZXIgdGhhdCB3aWxsIHN0aWxsIGJlIHN1OiAqLwotCQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsgCi0KLQkJcjEgPSBzcmFSZ25DcmVhdGVSZWN0KG9yaWdfeCwgb3JpZ195LCBvcmlnX3ggKyBvcmlnX3csIG9yaWdfeSArIG9yaWdfaCk7Ci0JCXNyYVJnbkFuZChyMSwgcjApOwotCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCArIHcsIHkgKyBoKTsKLQkJc3JhUmduQW5kKHIyLCByMCk7Ci0JCXIzID0gTlVMTDsKLQkJaWYgKHNyYVJnbkFuZChyMiwgcjEpICYmIGNhY2hlX2xpc3RbbmlkeF0uc3VfdGltZSA+IDAuMCkgewotCQkJaW50IGR4MiA9IHN1X3ggLSBvcmlnX3g7Ci0JCQlpbnQgZHkyID0gc3VfeSAtIG9yaWdfeTsKLQotCQkJcjMgPSBzcmFSZ25DcmVhdGVSZ24ocjIpOwotCQkJc3JhUmduT2Zmc2V0KHIyLCBkeDIsIGR5Mik7IAotCi0JCQlkeCA9IHN1X3ggLSB4OwotCQkJZHkgPSBzdV95IC0geTsKLQkJCXNyYVJnbk9mZnNldChyMywgZHgsIGR5KTsgCi0KLQkJCWR4ID0gZHggLSBkeDI7Ci0JCQlkeSA9IGR5IC0gZHkyOwotCi1pZiAoZGIgJiYgbmNkYikgZnByaW50ZihzdGRlcnIsICJGQl9DT1BZOiAlLjRmIDQpIG1vdmUgb3ZlcmxhcCBpbnNpZGUgc3U6XG4iLCBkbm93KCkgLSBudGltKTsKLQkJCWlmICghIHVzZV9iYXRjaCkgewotCQkJCWRvX2NvcHlyZWdpb24ocjMsIGR4LCBkeSwgMCk7Ci0JCQkJaWYgKCFmYl9wdXNoX3dhaXQoMC4yLCBGQl9DT1BZKSkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFk6ICUuNGYgNCkgRkFJTEVELlxuIiwgZG5vdygpIC0gbnRpbSk7Ci0JCQkJCWZiX3B1c2hfd2FpdCgwLjEsIEZCX0NPUFkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYmF0Y2hfZHhzW05QUF9ucmVnXSA9IGR4OwotCQkJCWJhdGNoX2R5c1tOUFBfbnJlZ10gPSBkeTsKLQkJCQliYXRjaF9yZWdbTlBQX25yZWcrK10gPSBzcmFSZ25DcmVhdGVSZ24ocjMpOwotCQkJfQotCQl9Ci0JCXNyYVJnbkRlc3Ryb3kocjApOwotCQlzcmFSZ25EZXN0cm95KHIxKTsKLQkJc3JhUmduRGVzdHJveShyMik7Ci0KLQkJLyogNSkgY29weSBvdXIgdGVtcG9yYXJ5IHN0dWZmIGZyb20gYnMgdG8gc3U6ICovCi0JCWR4ID0gc3VfeCAtIGJzX3g7Ci0JCWR5ID0gc3VfeSAtIGJzX3k7Ci0JCWlmIChOUFBfcl9ic190bXAgPT0gTlVMTCkgewotCQkJcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHN1X3gsIHN1X3ksIHN1X3ggKyBzdV93LCBzdV95ICsgc3VfaCk7IAotCQl9IGVsc2UgewotCQkJcjEgPSBzcmFSZ25DcmVhdGVSZ24oTlBQX3JfYnNfdG1wKTsKLQkJCXNyYVJnbk9mZnNldChyMSwgZHgsIGR5KTsKLQkJCXNyYVJnbkRlc3Ryb3koTlBQX3JfYnNfdG1wKTsKLQkJfQotCQlpZiAocjMgIT0gTlVMTCkgewotCQkJc3JhUmduU3VidHJhY3QocjEsIHIzKTsKLQkJCXNyYVJnbkRlc3Ryb3kocjMpOwotCQl9Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJfQ09QWTogJS40ZiA1KSBtb3ZlIHRtcCBicyB0byBzdTpcbiIsIGRub3coKSAtIG50aW0pOwotCQlpZiAoISB1c2VfYmF0Y2gpIHsKLQkJCWRvX2NvcHlyZWdpb24ocjEsIGR4LCBkeSwgMCk7Ci0JCQlpZiAoIWZiX3B1c2hfd2FpdCgwLjIsIEZCX0NPUFkpKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRkJfQ09QWTogJS40ZiA1KSBGQUlMRUQuXG4iLCBkbm93KCkgLSBudGltKTsKLQkJCQlmYl9wdXNoX3dhaXQoMC4xLCBGQl9DT1BZKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJhdGNoX2R4c1tOUFBfbnJlZ10gPSBkeDsKLQkJCWJhdGNoX2R5c1tOUFBfbnJlZ10gPSBkeTsKLQkJCWJhdGNoX3JlZ1tOUFBfbnJlZysrXSA9IHNyYVJnbkNyZWF0ZVJnbihyMSk7Ci0JCX0KLQkJaWYgKCEgc3JhUmduRW1wdHkocjEpKSB7Ci0JCQlzb21lX3N1ID0gMTsKLQkJfQotCQlzcmFSZ25EZXN0cm95KHIxKTsKLQotCQkvKiA2KSBub3QgcmVhbGx5IG5lY2Vzc2FyeSwgdXBkYXRlIGJzIHdpdGggY3VycmVudCB2aWV3OiAqLwotCQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsgCi0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdCh4LCB5LCB4ICsgdywgeSArIGgpOwotCQlzcmFSZ25BbmQocjEsIHIwKTsKLQkJZHggPSBic194IC0geDsKLQkJZHkgPSBic195IC0geTsKLQkJc3JhUmduT2Zmc2V0KHIxLCBkeCwgZHkpOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFk6ICUuNGYgNikgc25hcHNob3QgYnM6XG4iLCBkbm93KCkgLSBudGltKTsKLQkJaWYgKCEgdXNlX2JhdGNoKSB7Ci0JCQlkb19jb3B5cmVnaW9uKHIxLCBkeCwgZHksIDApOwotCQkJaWYgKCFmYl9wdXNoX3dhaXQoMC4yLCBGQl9DT1BZKSkgewotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFk6ICUuNGYgNikgRkFJTEVELlxuIiwgZG5vdygpIC0gbnRpbSk7Ci0JCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXRjaF9keHNbTlBQX25yZWddID0gZHg7Ci0JCQliYXRjaF9keXNbTlBQX25yZWddID0gZHk7Ci0JCQliYXRjaF9yZWdbTlBQX25yZWcrK10gPSBzcmFSZ25DcmVhdGVSZ24ocjEpOwotCQl9Ci0JCXNyYVJnbkRlc3Ryb3kocjApOwotCQlzcmFSZ25EZXN0cm95KHIxKTsKLQotCQlpZiAodXNlX2JhdGNoKSB7Ci0JCQliYXRjaF9wdXNoKE5QUF9ucmVnLCBiYXRjaF9kZWxheSk7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJGQl9DT1BZOiAlLjRmIFhYIGRpZCBiYXRjaCAweCV4ICUzZCBzdTogJWR4JWQrJWQrJWQgIGJzOiAlZHglZCslZCslZFxuIiwgZG5vdygpIC0gbnRpbSwKLQkodW5zaWduZWQgaW50KSBjYWNoZV9saXN0W25pZHhdLndpbiwgbmlkeCwgc3Vfdywgc3VfaCwgc3VfeCwgc3VfeSwgYnNfdywgYnNfaCwgYnNfeCwgYnNfeSk7Ci0JCX0KLQkJY2FjaGVfbGlzdFtuaWR4XS54ID0geCArIG5wOwotCQljYWNoZV9saXN0W25pZHhdLnkgPSB5ICsgbnA7Ci0KLQkJLyogWFhYIFkgKi8KLQkJY2FjaGVfbGlzdFtuaWR4XS5ic190aW1lID0gZG5vdygpOwotCQlpZiAoc29tZV9zdSkgewotCQkJY2FjaGVfbGlzdFtuaWR4XS5zdV90aW1lID0gZG5vdygpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHVzZV9iYXRjaCkgewotCQkJYmF0Y2hfcHVzaChOUFBfbnJlZywgYmF0Y2hfZGVsYXkpOwotCQl9Ci0JfQotCi0JaWYgKHNjYWxpbmcpIHsKLQkJc3JhUmVjdCByZWN0c1syXTsJCi0KLQkJcmVjdHNbMF0ueDEgPSBvcmlnX3g7Ci0JCXJlY3RzWzBdLnkxID0gb3JpZ195OwotCQlyZWN0c1swXS54MiA9IG9yaWdfdzsKLQkJcmVjdHNbMF0ueTIgPSBvcmlnX2g7Ci0KLQkJcmVjdHNbMV0ueDEgPSB4OwotCQlyZWN0c1sxXS55MSA9IHk7Ci0JCXJlY3RzWzFdLngyID0gdzsKLQkJcmVjdHNbMV0ueTIgPSBoOwotCQlwdXNoX2JvcmRlcnMocmVjdHMsIDIpOwotCX0KLX0KLQotdm9pZCBkb19jb3B5cmVjdF9kcmFnX21vdmUoV2luZG93IG9yaWdfZnJhbWUsIFdpbmRvdyBmcmFtZSwgaW50ICpuaWR4LCBpbnQgdHJ5X2JhdGNoLAotICAgIGludCBub3dfeCwgaW50IG5vd195LCBpbnQgb3JpZ193LCBpbnQgb3JpZ19oLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGJhdGNoX2RlbGF5KSB7Ci0KLQlpbnQgc2VudF9jb3B5cmVjdCA9IDEsIG9ic2N1cmVkID0gMDsKLQlpbnQgZHgsIGR5OwotCWludCB1c2VfYmF0Y2ggPSAwOwotCWRvdWJsZSBudGltID0gZG5vdygpOwotCXN0YXRpYyBpbnQgbm9iID0gLTE7Ci0Jc3JhUmVnaW9uUHRyIHIwLCByMTsKLQotCWlmIChub2IgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIk5PQ1JCQVRDSCIpKSB7Ci0JCQlub2IgPSAxOwotCQl9IGVsc2UgewotCQkJbm9iID0gMDsKLQkJfQotCX0KLQlpZiAobm9iKSB7Ci0JCXRyeV9iYXRjaCA9IDA7Ci0JfQotCi0JZHggPSB4IC0gbm93X3g7Ci0JZHkgPSB5IC0gbm93X3k7Ci0JaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiZG9fQ09QWTogbm93X3h5OiAlZCAlZCwgb3JpZ193aDogJWQgJWQsIHh5OiAlZCAlZCwgd2g6ICVkICVkXG4iLG5vd194LCBub3dfeSwgb3JpZ193LCBvcmlnX2gsIHgsIHksIHcsIGgpOwotCQotCW5jYWNoZV9wcmVfcG9ydGlvbnMob3JpZ19mcmFtZSwgZnJhbWUsIG5pZHgsIHRyeV9iYXRjaCwgJnVzZV9iYXRjaCwKLQkgICAgbm93X3gsIG5vd195LCBvcmlnX3csIG9yaWdfaCwgeCwgeSwgdywgaCwgbnRpbSk7Ci0KLQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsgCi0JcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHggKyB3LCB5ICsgaCk7Ci0Jc3JhUmduQW5kKHIxLCByMCk7Ci0KLQlkeCA9IHggLSBub3dfeDsKLQlkeSA9IHkgLSBub3dfeTsKLQotCS8qIG1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIG9uLXNjcmVlbiB0b28gKi8KLQlzcmFSZ25PZmZzZXQocjEsIC1keCwgLWR5KTsKLQlzcmFSZ25BbmQocjEsIHIwKTsKLQlzcmFSZ25PZmZzZXQocjEsICtkeCwgK2R5KTsKLQlzcmFSZ25BbmQocjEsIHIwKTsJLyoganVzdCB0byBiZSBzdXJlLCBwcm9ibGFibHkgbm90IG5lZWRlZCAqLwotCi0JaWYgKCEgdXNlX2JhdGNoKSB7Ci0JCWRvX2NvcHlyZWdpb24ocjEsIGR4LCBkeSwgMCk7Ci0JCWlmICghZmJfcHVzaF93YWl0KDAuMiwgRkJfQ09QWSkpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFk6ICUuNGYgMykgKkZBSUxFRCpcbiIsIGRub3coKSAtIG50aW0pOwotCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCX0KLQl9IGVsc2UgewotCQliYXRjaF9keHNbTlBQX25yZWddID0gZHg7Ci0JCWJhdGNoX2R5c1tOUFBfbnJlZ10gPSBkeTsKLQkJYmF0Y2hfcmVnW05QUF9ucmVnKytdID0gc3JhUmduQ3JlYXRlUmduKHIxKTsKLQl9Ci0Jc3JhUmduRGVzdHJveShyMCk7Ci0Jc3JhUmduRGVzdHJveShyMSk7Ci0KLQlpZiAoc2VudF9jb3B5cmVjdCkgewotCQlpZiAodXNlX2JhdGNoKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAoISBvYnNjdXJlZCkgewotCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBubyBkaWZmIGZvciBub3cuLi4gKi8KLQkJCWZiX3B1c2hfd2FpdCgwLjEsIEZCX0NPUFkpOwotCQl9Ci0JCW5jYWNoZV9wb3N0X3BvcnRpb25zKCpuaWR4LCB1c2VfYmF0Y2gsCi0JCSAgICBub3dfeCwgbm93X3ksIG9yaWdfdywgb3JpZ19oLCB4LCB5LCB3LCBoLCBiYXRjaF9kZWxheSwgbnRpbSk7Ci0JfQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiZG9fQ09QWTogJS40ZiAtLSBwb3N0X3BvcnRpb24gZG9uZS5cbiIsIGRub3coKSAtIG50aW0pOwotfQotCi12b2lkIGNoZWNrX21hY29zeF9pY29uaWZ5KFdpbmRvdyBvcmlnX2ZyYW1lLCBXaW5kb3cgZnJhbWUsIGludCBmbHVzaCkgewotI2lmZGVmIE1BQ09TWAotCXN0YXRpYyBkb3VibGUgbGFzdCA9IDAuMDsKLQlkb3VibGUgbm93OwotCWludCBqLCBtID0gNSwgaWR4ID0gLTEsIG9rID0gMCwgdW5tYXBwZWQgPSAwOwotCi0JaWYgKCEgbWFjb3N4X2NvbnNvbGUpIHsKLQkJcmV0dXJuOwotCX0KLQotCW5vdyA9IGRub3coKTsKLQlpZiAobm93IDwgbGFzdCArIDAuMykgewotCQlyZXR1cm47Ci0JfQotCWxhc3QgPSBub3c7Ci0KLQlpZiAobmNhY2hlID4gMCAmJiBvcmlnX2ZyYW1lICE9IE5vbmUpIHsKLQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleChvcmlnX2ZyYW1lKTsKLQkJaWYgKGlkeCA+PSAwKSB7Ci0JCQlpZiAoY2FjaGVfbGlzdFtpZHhdLm1hcF9zdGF0ZSA9PSBJc1VubWFwcGVkKSB7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJGQVcgb3JpZ19mcmFtZSB1bm1hcHBlZC5cbiIpOwotCQkJCXVubWFwcGVkID0gMTsKLQkJCQltID0gMzsKLQkJCX0KLQkJfQotCX0KLQotCWlmICh1bm1hcHBlZCkgewotCQk7Ci0JfSBlbHNlIGlmIChvcmlnX2ZyYW1lICYmIG1hY29zeENHU19mb2xsb3dfYW5pbWF0aW9uX3dpbihvcmlnX2ZyYW1lLCAtMSwgMCkpIHsKLQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiRkFXIG9yaWdfZnJhbWUgJWRcbiIsIChpbnQpIG9yaWdfZnJhbWUpOwotCX0gZWxzZSBpZiAoMCAmJiBmcmFtZSAmJiBtYWNvc3hDR1NfZm9sbG93X2FuaW1hdGlvbl93aW4oZnJhbWUsIC0xLCAwKSkgewotCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJGQVcgZnJhbWUgICAgICAlZFxuIiwgKGludCkgZnJhbWUpOwotCX0KLQlmb3IgKGo9MDsgajxtOyBqKyspIHsKLQkJbWFjb3N4Q0dTX2dldF9hbGxfd2luZG93cygpOwotCQlpZiAobWFjb3N4X2NoZWNrZXZlbnQoTlVMTCkpIHsKLQkJCW9rID0gMTsKLQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIkNoZWNrIEV2ZW50ICAgIDFcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiQ2hlY2sgRXZlbnQgICAgMFxuIik7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlicmVhazsKLQkJfQotCQl1c2xlZXAoMTAgKiAxMDAwKTsKLQl9Ci0JaWYgKG9rKSB7Ci0JCWlmIChmbHVzaCkgewotCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWXxGQl9NT0QpOwotCQl9Ci0JCWNoZWNrX25jYWNoZSgwLCAyKTsKLQl9Ci0jZWxzZQotCWlmICghb3JpZ19mcmFtZSB8fCAhZnJhbWUgfHwgIWZsdXNoKSB7fQotI2VuZGlmCi19Ci0KLXZvaWQgY2hlY2tfbWFjb3N4X2NsaWNrX2ZyYW1lKHZvaWQpIHsKLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIm1hY29zeF9jbGlja19mcmFtZTogMHgleFxuIiwgbWFjb3N4X2NsaWNrX2ZyYW1lKTsKLQkJY2hlY2tfbWFjb3N4X2ljb25pZnkobWFjb3N4X2NsaWNrX2ZyYW1lLCBOb25lLCAwKTsKLQkJbWFjb3N4X2NsaWNrX2ZyYW1lID0gTm9uZTsKLQkJaWYgKGJ1dHRvbl9tYXNrICYmICFtYWNvc3hfY2hlY2tldmVudChOVUxMKSkgewotCQkJY2hlY2tfbWFjb3N4X2ljb25pZnkoTm9uZSwgTm9uZSwgMCk7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotaW50IGNsaXBwZWQoaW50IGlkeCk7Ci12b2lkIHNuYXBfb2xkKHZvaWQpOwotCi1pbnQgY2hlY2tfY29weXJlY3RfcmFpc2UoaW50IGlkeCwgV2luZG93IG9yaWdfZnJhbWUsIGludCB0cnlfYmF0Y2gpIHsKLQljaGFyICpubyA9ICJub25lIjsKLQlpbnQgZG9yYWlzZSA9IDE7Ci0JaW50IHZhbGlkOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0KLQlpZiAoISBuY2FjaGVfd2ZfcmFpc2VzKSB7Ci0JCWRvcmFpc2UgPSAwOwotCQlubyA9ICJuY2FjaGVfd2ZfcmFpc2VzIjsKLQl9IGVsc2UgaWYgKGNhY2hlX2xpc3RbaWR4XS5ic190aW1lID09IDAuMCkgewotCQlkb3JhaXNlID0gMDsKLQkJbm8gPSAiYnNfdGltZSI7Ci0JfSBlbHNlIGlmICgwICYmIGNhY2hlX2xpc3RbaWR4XS52aXNfc3RhdGUgPT0gVmlzaWJpbGl0eVVub2JzY3VyZWQpIHsKLQkJZG9yYWlzZSA9IDA7Ci0JCW5vID0gIlZpc2liaWxpdHlVbm9ic2N1cmVkIjsKLQl9IGVsc2UgaWYgKCFjbGlwcGVkKGlkeCkpIHsKLQkJZG9yYWlzZSA9IDA7Ci0JCW5vID0gIiFjbGlwcGVkKCkiOwotCX0KLQlpZiAoZG9yYWlzZSkgewotCQlpbnQgbnIgPSAwLCAqbmIgPSBOVUxMOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiLS1ZRVMsIHdmX3JhaXNlXG4iKTsKLQkJaWYgKHRyeV9iYXRjaCkgewotCQkJbmIgPSAmbnI7Ci0JCX0KLQkJdmFsaWQgPSAxOwotCQlic19yZXN0b3JlKGlkeCwgbmIsIE5VTEwsICZhdHRyLCAwLCAxLCAmdmFsaWQsIDEpOwotCQl0cnlfdG9fZml4X3N1KG9yaWdfZnJhbWUsIGlkeCwgMHgxLCBuYiwgTlVMTCk7CQotCQlpZiAobmIgJiYgbnIpIHsKLQkJCWJhdGNoX3B1c2gobnIsIC0xLjApOwotCQl9Ci0JCWZiX3B1c2goKTsgLyogWFhYIFkgKi8KLQl9IGVsc2UgewotaWYgKG5jZGIgJiYgbm8pIGZwcmludGYoc3RkZXJyLCAiLS1OTywgIHdmX3JhaXNlOiAlc1xuIiwgbm8pOwotCX0KLQlpZiAobmNhY2hlX3dmX3JhaXNlcykgewotCQlzbmFwc2hvdF9zdGFja19saXN0KDAsIDAuMCk7Ci0JCXNuYXBfb2xkKCk7Ci0JfQotCXJldHVybiAxOwotfQotCi1pbnQgc2V0X2NvcHlyZWN0X2RyYWcoaW50IGlkeCwgV2luZG93IG9yaWdfZnJhbWUsIGludCB0cnlfYmF0Y2gpIHsKLQlpZiAoaWR4IDwgMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID4gMC4wKSB7Ci0JCWNoZWNrX2NvcHlyZWN0X3JhaXNlKGlkeCwgb3JpZ19mcmFtZSwgdHJ5X2JhdGNoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogQXBwbGllZCBqdXN0IGJlZm9yZSBhbnkgY2hlY2tfdXNlcl9pbnB1dCgpIG1vZGVzLiAgTG9vayBmb3IgYQotICogQnV0dG9uUHJlc3M7IGZpbmQgd2luZG93IGl0IGhhcHBlbmVkIGluOyBmaW5kIHRoZSB3bSBmcmFtZSB3aW5kb3cKLSAqIGZvciBpdDsgd2F0Y2ggZm9yIHRoYXQgd2luZG93IG1vdmluZyBvciByZXNpemluZy4gIElmIGl0IGRvZXMsIGRvIHRoZQotICogd2lyZWZyYW1lIGFuaW1hdGlvbi4gIERvIHRoaXMgdW50aWwgQnV0dG9uUmVsZWFzZSBvciB0aW1lb3V0cyBvY2N1ci4KLSAqIFJlbW92ZSB3aXJlZnJhbWUuCi0gKgotICogVW5kZXIgLW5vd2lyZWNvcHlyZWN0LCByZXR1cm4gY29udHJvbCB0byBiYXNlIHNjaGVtZQotICogKGNoZWNrX3VzZXJfaW5wdXQoKSAuLi4pIHRoYXQgd2lsbCByZXBhaW50IHRoZSBzY3JlZW4gd2l0aCB0aGUgd2luZG93Ci0gKiBpbiB0aGUgbmV3IHBvc3Rpb24gb3Igc2l6ZS4gIFVuZGVyIC13aXJlY29weXJlY3QsIGFwcGx5IHJmYkRvQ29weVJlY3QKLSAqIG9yIHJmYkRvQ29weVJlZ2lvbjogdGhpcyAicG9sbHV0ZXMiIG91ciBmcmFtZWJ1ZmZlciwgYnV0IHRoZSBub3JtYWwKLSAqIHBvbGxpbmcgd2lsbCBxdWlja2x5IHJlcGFpciBpdC4gVW5kZXIgaGFwcHkgY2lyY3Vtc3RhbmNlcywgdGhpcwotICogcmVkdWNlcyBhY3R1YWwgWFNobUdldEltYWdlIHdvcmsgKGkuZS4gaWYgd2UgY29ycmVjdGx5IHByZWRpY3RlZCBob3cKLSAqIHRoZSBYIGZiIGhhcyBjaGFuZ2VkLgotICoKLSAqIC1zY2FsZSBkb2Vzbid0IGFsd2F5cyB3b3JrIHVuZGVyIC13aXJlY29weXJlY3QsIGJ1dCB0aGUgd2lyZWZyYW1lIGRvZXMuCi0gKgotICogdGVzdGluZyBvZiB0aGlzIG1vZGUgdW5kZXIgLXRocmVhZHMgaXMgaW5jb21wbGV0ZS4KLSAqCi0gKiByZXR1cm5zIDEgaWYgaXQgZGlkIGFuIGFuaW1hdGlvbiwgMCBpZiBubyBtb3ZlL3Jlc2l6ZSB0cmlnZ2VycwotICogd2VudCBvZmYuCi0gKgotICogVEJEOiBzZWUgaWYgd2UgY2FuIHNlbGVjdCBTdHJ1Y3R1cmVOb3RpZnkgQ29uZmlndXJlTm90aWZ5IGV2ZW50cyBmb3IKLSAqIHRoZSB0b3BsZXZlbCB3aW5kb3dzIHRvIGdldCBiZXR0ZXIgaW5mbyBvbiBtb3ZlcyBhbmQgcmVzaXplcy4KLSAqLwotaW50IGNoZWNrX3dpcmVmcmFtZSh2b2lkKSB7Ci0JV2luZG93IGZyYW1lID0gTm9uZSwgb3JpZ19mcmFtZSA9IE5vbmU7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQlpbnQgZHgsIGR5OwotCi0JaW50IG9yaWdfcHgsIG9yaWdfcHksIG9yaWdfeCwgb3JpZ195LCBvcmlnX3csIG9yaWdfaDsKLQlpbnQgcHgsIHB5LCB4LCB5LCB3LCBoOwotCWludCBib3hfeCwgYm94X3ksIGJveF93LCBib3hfaDsKLQlpbnQgb3JpZ19jdXJzb3JfeCwgb3JpZ19jdXJzb3JfeSwgZywgZ2Q7Ci0JaW50IGFscmVhZHlfZG93biA9IDAsIHdpbl9nb25lID0gMCwgd2luX3VubWFwcGVkID0gMDsKLQlkb3VibGUgc3BpbiA9IDAuMCwgdG0sIGxhc3RfcHRyID0gMC4wLCBsYXN0X2RyYXc7Ci0KLQlpbnQgZnJhbWVfY2hhbmdlZCA9IDAsIGRyZXdfYm94ID0gMCwgZ290XzJuZF9wb2ludGVyID0gMDsKLQlpbnQgdHJ5X2NvcHlyZWN0X2RyYWcgPSAxLCBkb19jb3B5cmVjdF9kcmFnID0gLTE7Ci0JaW50IG5vd194ID0gMCwgbm93X3kgPSAwLCBuaWR4ID0gLTE7Ci0JZG91YmxlIGNvcHlyZWN0X2RyYWdfZGVsYXkgPSAtMS4wOwotCWludCB0cnlfYmF0Y2ggPSAxOwkvKiBYWFggWSAqLwotCWludCBtYWNfc2tpcCA9IDA7Ci0KLQlpbnQgc3BlY2lhbF90MSA9IDAsIGJyZWFrX3JlYXNvbiA9IDAsIGxhc3RfZHJhd19jbnQgPSAwLCBncGkgPSAwOwotCXN0YXRpYyBkb3VibGUgZmlyc3RfZHRfYXZlID0gMC4wOwotCXN0YXRpYyBpbnQgZmlyc3RfZHRfY250ID0gMDsKLQlzdGF0aWMgdGltZV90IGxhc3Rfc2F2ZV9zdGFja2xpc3QgPSAwOwotCWludCBiZG93bjAsIGJkb3duLCBnb3R1aSwgY250ID0gMDsKLQkKLQkvKiBoZXVyaXN0aWNzOiAqLwotCWRvdWJsZSBmaXJzdF9ldmVudF9zcGluICAgPSB3aXJlZnJhbWVfdDE7Ci0JZG91YmxlIGZyYW1lX2NoYW5nZWRfc3BpbiA9IHdpcmVmcmFtZV90MjsKLQlkb3VibGUgbWF4X3NwaW4gPSB3aXJlZnJhbWVfdDM7Ci0JZG91YmxlIG1pbl9kcmF3ID0gd2lyZWZyYW1lX3Q0OwotCWludCB0cnlfaXQgPSAwOwotCURCX1NFVAotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuIDA7Ci0JaWYgKGNvcHlyZWN0X2RyYWdfZGVsYXkpIHt9Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJOwotCX0gZWxzZSB7Ci0JCVJBV0ZCX1JFVCgwKQotCX0KLSNlbHNlCi0JUkFXRkJfUkVUKDApCi0jZW5kaWYKLQotCWlmIChub2ZiKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoc3Vid2luKSB7Ci0JCXJldHVybiAwOwkvKiBkb24ndCBldmVuIGJvdGhlciBmb3IgLWlkIGNhc2UgKi8KLQl9Ci0KLWlmIChkYiA+IDEgJiYgYnV0dG9uX21hc2spIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfd2lyZWZyYW1lOiBibTogJWQgIGdwaTogJWRcbiIsIGJ1dHRvbl9tYXNrLCBnb3RfcG9pbnRlcl9pbnB1dCk7Ci0KLQliZG93bjAgPSAwOwotCWlmIChidXR0b25fbWFzaykgewotCQliZG93bjAgPSAxOwotCX0gZWxzZSBpZiAod2lyZWZyYW1lX2xvY2FsICYmIGRpc3BsYXlfYnV0dG9uX21hc2spIHsKLQkJYmRvd24wID0gMjsKLQl9Ci0JaWYgKCEgYmRvd24wKSB7Ci0JCXJldHVybiAwOwkvKiBubyBidXR0b24gcHJlc3NlZCBkb3duICovCi0JfQotCi0JZ290dWkgPSAwOwotCWlmIChnb3RfcG9pbnRlcl9pbnB1dCkgewotCQlnb3R1aSA9IDE7Ci0JfSBlbHNlIGlmICh3aXJlZnJhbWVfbG9jYWwgJiYgZGlzcGxheV9idXR0b25fbWFzaykgewotCQlnb3R1aSA9IDI7Ci0JfQotCWlmICghdXNlX3RocmVhZHMgJiYgIWdvdHVpKSB7Ci0JCXJldHVybiAwOwkvKiBuZWVkIHB0ciBpbnB1dCwgZS5nLiBidXR0b24gZG93biwgbW90aW9uICovCi0JfQotCi1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX3dpcmVmcmFtZTogJWRcbiIsIGRiKTsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlxuKioqIGJ1dHRvbiBkb3duISEgIHg6ICVkICB5OiAlZFxuIiwgY3Vyc29yX3gsIGN1cnNvcl95KTsKLQotCS8qCi0JICogUXVlcnkgd2hlcmUgdGhlIHBvaW50ZXIgaXMgYW5kIHdoaWNoIGNoaWxkIG9mIHRoZSByb290Ci0JICogd2luZG93LiAgV2Ugd2lsbCBhc3N1bWUgdGhpcyBpcyB0aGUgZnJhbWUgdGhlIHdpbmRvdyBtYW5hZ2VyCi0JICogbWFrZXMgd2hlbiBpdCByZXBhcmVudHMgdGhlIHRvcGxldmVsIHdpbmRvdy4KLQkgKi8KLQlYX0xPQ0s7Ci0JaWYgKCEgZ2V0X3dtX2ZyYW1lX3BvcygmcHgsICZweSwgJngsICZ5LCAmdywgJmgsICZmcmFtZSwgTlVMTCkpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJOTyBnZXRfd21fZnJhbWVfcG9zLTE6IDB4JWx4XG4iLCBmcmFtZSk7Ci0JCVhfVU5MT0NLOwotI2lmZGVmIE1BQ09TWAotCQljaGVja19tYWNvc3hfY2xpY2tfZnJhbWUoKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0JWF9VTkxPQ0s7Ci0KLQlsYXN0X2dldF93bV9mcmFtZV90aW1lID0gZG5vdygpOwotCWxhc3RfZ2V0X3dtX2ZyYW1lID0gZnJhbWU7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJhOiAlZCAgd2Y6ICUuM2YgIEE6ICVkICBvcmlnZnJtOiAweCVseFxuIiwgdypoLCB3aXJlZnJhbWVfZnJhYywgKGRweV94KmRweV95KSwgZnJhbWUpOwotCi0JLyoKLQkgKiBhcHBseSB0aGUgcGVyY2VudGFnZSBzaXplIGNyaXRlcmlvbiAoYWxsb3cgb3BhcXVlIG1vdmVzIGZvcgotCSAqIHNtYWxsIHdpbmRvd3MpCi0JICovCi0JaWYgKChkb3VibGUpIHcqaCA8IHdpcmVmcmFtZV9mcmFjICogKGRweV94ICogZHB5X3kpKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAic21hbGwgd2luZG93ICUuM2ZcbiIsICgoZG91YmxlKSB3KmgpLyhkcHlfeCAqIGRweV95KSk7Ci0JCXJldHVybiAwOwotCX0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgIGZyYW1lOiB4OiAlZCAgeTogJWQgIHc6ICVkICBoOiAlZCAgcHg6ICVkICBweTogJWQgIGZyOiAweCVseFxuIiwgeCwgeSwgdywgaCwgcHgsIHB5LCBmcmFtZSk7CQotCi0JLyoKLQkgKiBzZWUgaWYgdGhlIHBvaW50ZXIgaXMgd2l0aGluIHJhbmdlIG9mIHRoZSBhc3N1bWVkIHdtIGZyYW1lCi0JICogZGVjb3JhdGlvbnMgb24gdGhlIGVkZ2Ugb2YgdGhlIHdpbmRvdy4KLQkgKi8KLQotCXRyeV9pdCA9IG5lYXJfd21fZWRnZSh4LCB5LCB3LCBoLCBweCwgcHkpOwotCi0JLyogT2Z0ZW4gQWx0K0J1dHRvbkRvd24gc3RhcnRzIGEgd2luZG93IG1vdmU6ICovCi0JaWYgKCEgdHJ5X2l0ICYmIHdpcmVmcmFtZV9tb2Rfc3RhdGUoKSkgewotCQl0cnlfaXQgPSAxOwotCX0KLQlpZiAodHJ5X2l0ICYmIGNsaXBzaGlmdCkgewotCQlzcmFSZWdpb25QdHIgcjEsIHIyOwotCQlpbnQgeGMgPSBvZmZfeCArIGNvZmZfeDsKLQkJaW50IHljID0gb2ZmX3kgKyBjb2ZmX3k7Ci0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdCh4LCB5LCB4K3csIHkraCk7Ci0JCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4YywgeWMsIHhjK2RweV94LCB5YytkcHlfeSk7Ci0JCWlmICghc3JhUmduQW5kKHIxLCByMikpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJPVVRTSURFIENMSVBTSElGVFxuIik7Ci0JCQl0cnlfaXQgPSAwOwotCQl9Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCQlzcmFSZ25EZXN0cm95KHIyKTsKLQl9Ci0JaWYgKCEgdHJ5X2l0KSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiSU5URVJJT1JcbiIpOwotI2lmZGVmIE1BQ09TWAotCQljaGVja19tYWNvc3hfY2xpY2tfZnJhbWUoKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aXJlZnJhbWVfaW5fcHJvZ3Jlc3MgPSAxOwotCi0JaWYgKGJ1dHRvbl9tYXNrX3ByZXYpIHsKLQkJYWxyZWFkeV9kb3duID0gMTsKLQl9Ci0JCi0JaWYgKCEgd2lyZWZyYW1lX3N0ciB8fCAhc3RyY21wKHdpcmVmcmFtZV9zdHIsIFdJUkVGUkFNRV9QQVJNUykpIHsKLQkJaW50IGxpbmssIGxhdGVuY3ksIG5ldHJhdGU7Ci0JCXN0YXRpYyBpbnQgZGlkbXNnID0gMDsKLQotCQlsaW5rID0gbGlua19yYXRlKCZsYXRlbmN5LCAmbmV0cmF0ZSk7Ci0JCWlmIChsaW5rID09IExSX0RJQUxVUCB8fCBsaW5rID09IExSX0JST0FEQkFORCkgewotCQkJLyogc2xvdyBsaW5rLCBlLmcuIGRpYWx1cCwgaW5jcmVhc2UgdGltZW91dHM6ICovCi0JCQlmaXJzdF9ldmVudF9zcGluICAgKj0gMi4wOwotCQkJZnJhbWVfY2hhbmdlZF9zcGluICo9IDIuMDsKLQkJCW1heF9zcGluICo9IDIuMDsKLQkJCW1pbl9kcmF3ICo9IDEuNTsKLQkJCWlmIChsaW5rID09IExSX0RJQUxVUCkgewotCQkJCW1heF9zcGluICo9IDEuMjsKLQkJCQltaW5fZHJhdyAqPSAxLjc7Ci0JCQl9Ci0JCQlpZiAoISBkaWRtc2cpIHsKLQkJCQlyZmJMb2coImluY3JlYXNlZCB3aXJlZnJhbWUgdGltZW91dHMgZm9yICIKLQkJCQkgICAgInNsb3cgbmV0d29yayBjb25uZWN0aW9uLlxuIik7Ci0JCQkJcmZiTG9nKCJuZXRyYXRlOiAlZCBLQi9zZWMsIGxhdGVuY3k6ICVkIG1zXG4iLAotCQkJCSAgICBuZXRyYXRlLCBsYXRlbmN5KTsKLQkJCQlkaWRtc2cgPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBwb2ludGVyKCkgc2hvdWxkIGhhdmUgc25hcHBlZCB0aGUgc3RhY2tpbmcgbGlzdCBmb3IgdXMsIGlmCi0JICogbm90LCBkbyBpdCBub3cgKGlmIHRoZSBYRmFrZUJ1dHRvbkV2ZW50IGhhcyBiZWVuIGZsdXNoZWQgYnkKLQkgKiBub3cgdGhlIHN0YWNraW5nIG9yZGVyIG1heSBiZSBpbmNvcnJlY3QpLgotCSAqLwotCWlmIChzdHJjbXAod2lyZWZyYW1lX2NvcHlyZWN0LCAibmV2ZXIiKSkgewotCQlpZiAoYWxyZWFkeV9kb3duKSB7Ci0JCQlkb3VibGUgYWdlID0gMC4wOwotCQkJLyoKLQkJCSAqIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIHN0YWNrIGxpc3QgKHBhdXNlCi0JCQkgKiB3aXRoIGJ1dHRvbiBkb3duKQotCQkJICovCi0JCQlpZiAoc3RhY2tfbGlzdF9udW0pIHsKLQkJCQlpbnQgaywgZ290X21lID0gMDsKLQkJCQlmb3IgKGsgPSBzdGFja19saXN0X251bSAtMTsgayA+PTA7IGstLSkgewotCQkJCQlpZiAoZnJhbWUgPT0gc3RhY2tfbGlzdFtrXS53aW4pIHsKLQkJCQkJCWdvdF9tZSA9IDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZ290X21lKSB7Ci0JCQkJCWFnZSA9IDEuMDsKLQkJCQl9Ci0JCQkJc25hcHNob3Rfc3RhY2tfbGlzdCgwLCBhZ2UpOwotCQkJfQotCQl9Ci0JCWlmICghIHN0YWNrX2xpc3RfbnVtKSB7Ci0JCQlzbmFwc2hvdF9zdGFja19saXN0KDAsIDAuMCk7Ci0JCX0KLQl9Ci0KLQotCS8qIHN0b3JlIGluaXRpYWwgcGFyYW1ldGVycywgd2UgbG9vayBmb3IgY2hhbmdlcyBpbiB0aGVtICovCi0Jb3JpZ19mcmFtZSA9IGZyYW1lOwotCW9yaWdfcHggPSBweDsJCS8qIHBvaW50ZXIgcG9zaXRpb24gKi8KLQlvcmlnX3B5ID0gcHk7Ci0Jb3JpZ194ID0geDsJCS8qIGZyYW1lIHBvc2l0aW9uICovCi0Jb3JpZ195ID0geTsKLQlvcmlnX3cgPSB3OwkJLyogZnJhbWUgc2l6ZSAqLwotCW9yaWdfaCA9IGg7Ci0KLQlvcmlnX2N1cnNvcl94ID0gY3Vyc29yX3g7Ci0Jb3JpZ19jdXJzb3JfeSA9IGN1cnNvcl95OwotCi0JLyogdGhpcyBpcyB0aGUgYm94IGZyYW1lIHdlIHdvdWxkIGRyYXcgKi8KLQlib3hfeCA9IHg7Ci0JYm94X3kgPSB5OyAKLQlib3hfdyA9IHc7Ci0JYm94X2ggPSBoOyAKLQotCWR0aW1lMCgmdG0pOwotCi0JbGFzdF9kcmF3ID0gc3BpbjsKLQotCS8qIC10aHJlYWRzIHN1cHBvcnQgZm9yIGNoZWNrX3dpcmVmcmFtZSgpIGlzIHJvdWdoLi4uIGNyYXNoPyAqLwotCWlmICh1c2VfdGhyZWFkcykgewotCQkvKiBwdXJnZSBhbnkgc3RvcmVkIHVwIHBvaW50ZXIgZXZlbnRzOiAqLwotCQlwb2ludGVyX2V2ZW50KC0xLCAwLCAwLCBOVUxMKTsKLQl9Ci0KLQlpZiAoY3Vyc29yX25vc2hhcGVfdXBkYXRlc19jbGllbnRzKHNjcmVlbikpIHsKLQkJdHJ5X2JhdGNoID0gMDsKLQl9Ci0JaWYgKHJvdGF0aW5nKSB7Ci0JCXRyeV9iYXRjaCA9IDA7Ci0JfQotCWlmICh1c2VfdGhyZWFkcyAmJiBuY2FjaGUgPiAwICYmIG5jYWNoZV9jb3B5cmVjdCkgewotCQl0cnlfYmF0Y2ggPSAwOwotCX0KLQotCWcgPSBnb3RfcG9pbnRlcl9pbnB1dDsKLQlnZCA9IGdvdF9sb2NhbF9wb2ludGVyX2lucHV0OwotCi0Jd2hpbGUgKDEpIHsKLQotCQlYX0xPQ0s7Ci0JCVhGbHVzaF93cihkcHkpOwotCQlYX1VOTE9DSzsKLQotCQkvKiB0cnkgdG8gaW5kdWNlL3dhaXRmb3Igc29tZSBtb3JlIHVzZXIgaW5wdXQgKi8KLQkJaWYgKHVzZV90aHJlYWRzKSB7Ci0JCQl1c2xlZXAoMTAwMCk7Ci0JCX0gZWxzZSBpZiAoZHJld19ib3ggJiYgZG9fY29weXJlY3RfZHJhZyAhPSAxKSB7Ci0JCQlyZmJQRSgxMDAwKTsKLQkJfSBlbHNlIHsKLQkJCXJmYkNGRCgxMDAwKTsKLQkJfQotCQlpZiAoYmRvd24wID09IDIpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIHRvIGp1c3QgdXBkYXRlIGRpc3BsYXlfYnV0dG9uX21hc2sKLQkJCSAqIHdoaWNoIHdpbGwgYWxzbyB1cGRhdGUgZ290X2xvY2FsX3BvaW50ZXJfaW5wdXQuCi0JCQkgKi8KLQkJCWNoZWNrX3gxMV9wb2ludGVyKCk7Ci0jaWYgMAotCQkJLyogd2hhdCB3YXMgdGhpcyBmb3I/ICovCi0JCQlXaW5kb3cgZnJhbWU7Ci0JCQlpbnQgcHgsIHB5LCB4LCB5LCB3LCBoOwotI2lmZGVmIE1BQ09TWAotCQkJaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCQkJbWFjb3N4X2dldF9jdXJzb3JfcG9zKCZ4LCAmeSk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYKLQkJCWdldF93bV9mcmFtZV9wb3MoJnB4LCAmcHksICZ4LCAmeSwgJncsICZoLCAmZnJhbWUsIE5VTEwpOwotI2VuZGlmCi0JCX0KLQotCQljbnQrKzsKLQkJc3BpbiArPSBkdGltZSgmdG0pOwotCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJ3Zi1zcGluOiAlLjNmXG4iLCBzcGluKTsKLQotCQkvKiBjaGVjayBmb3IgYW55IHRpbWVvdXRzOiAqLwotCQlpZiAoZnJhbWVfY2hhbmdlZCkgewotCQkJZG91YmxlIGRlbGF5OwotCQkJLyogbWF4IHRpbWUgd2UgcGxheSB0aGlzIGdhbWU6ICovCi0JCQlpZiAoc3BpbiA+IG1heF9zcGluKSB7Ci1pZiAoZGIgfHwgZGIyKSBmcHJpbnRmKHN0ZGVyciwgIiBTUElOLU9VVC1NQVg6ICUuM2ZcbiIsIHNwaW4pOwotCQkJCWJyZWFrX3JlYXNvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiB3YXRjaCBmb3IgcG9pbnRlciBldmVudHMgc2xvd2luZyBkb3duOiAqLwotCQkJaWYgKHNwZWNpYWxfdDEpIHsKLQkJCQlkZWxheSA9IG1heF9zcGluOwotCQkJfSBlbHNlIHsKLQkJCQlkZWxheSA9IDIuMCogZnJhbWVfY2hhbmdlZF9zcGluOwotCQkJCWlmIChzcGluID4gMy4wICogZnJhbWVfY2hhbmdlZF9zcGluKSB7Ci0JCQkJCWRlbGF5ID0gMS41ICogZGVsYXk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNwaW4gPiBsYXN0X3B0ciArIGRlbGF5KSB7Ci1pZiAoZGIgfHwgZGIyKSBmcHJpbnRmKHN0ZGVyciwgIiBTUElOLU9VVC1OT1QtRkFTVDogJS4zZlxuIiwgc3Bpbik7Ci0JCQkJYnJlYWtfcmVhc29uID0gMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChnb3RfMm5kX3BvaW50ZXIpIHsKLQkJCS8qCi0JCQkgKiBwb2ludGVyIGlzIG1vdmluZywgbWF4IHRpbWUgd2Ugd2FpdCBmb3Igd20KLQkJCSAqIG1vdmUgb3IgcmVzaXplIHRvIGJlIGRldGVjdGVkCi0JCQkgKi8KLQkJCWlmIChzcGluID4gZnJhbWVfY2hhbmdlZF9zcGluKSB7Ci1pZiAoZGIgfHwgZGIyKSBmcHJpbnRmKHN0ZGVyciwgIiBTUElOLU9VVC1OT0ZSQU1FLVNQSU46ICUuM2ZcbiIsIHNwaW4pOwotCQkJCWJyZWFrX3JlYXNvbiA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBtYXggdGltZSB3ZSB3YWl0IGZvciBhbnkgcG9pbnRlciBpbnB1dCAqLwotCQkJaWYgKHNwaW4gPiBmaXJzdF9ldmVudF9zcGluKSB7Ci1pZiAoZGIgfHwgZGIyKSBmcHJpbnRmKHN0ZGVyciwgIiBTUElOLU9VVC1OTzJORF9QVFI6ICUuM2ZcbiIsIHNwaW4pOwotCQkJCWJyZWFrX3JlYXNvbiA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlncGkgPSAwOwotCQkvKiBzZWUgaWYgc29tZSBwb2ludGVyIGlucHV0IG9jY3VycmVkOiAqLwotCQlpZiAoZ290X3BvaW50ZXJfaW5wdXQgPiBnIHx8Ci0JCSAgICAod2lyZWZyYW1lX2xvY2FsICYmIChnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dCA+IGdkKSkpIHsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgKytwb2ludGVyIGV2ZW50ISEgWyUwMmRdICBkdDogJS4zZiAgeDogJWQgIHk6ICVkICBtYXNrOiAlZFxuIiwKLSAgICBnb3RfMm5kX3BvaW50ZXIrMSwgc3BpbiwgY3Vyc29yX3gsIGN1cnNvcl95LCBidXR0b25fbWFzayk7CQotCi0JCQlnID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0JCQlnZCA9IGdvdF9sb2NhbF9wb2ludGVyX2lucHV0OwotCQkJZ3BpID0gMTsKLQotCQkJWF9MT0NLOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlYX1VOTE9DSzsKLQotCQkJLyogcGVyaW9kaWNhbGx5IHRyeSB0byBsZXQgdGhlIHdtIGdldCBtb3Zpbmc6ICovCi0JCQlpZiAoIWZyYW1lX2NoYW5nZWQgJiYgZ290XzJuZF9wb2ludGVyICUgNCA9PSAwKSB7Ci0JCQkJaWYgKGdvdF8ybmRfcG9pbnRlciA9PSAwKSB7Ci0JCQkJCXVzbGVlcCg1MCAqIDEwMDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzbGVlcCgyNSAqIDEwMDApOwotCQkJCX0KLQkJCX0KLQkJCWdvdF8ybmRfcG9pbnRlcisrOwotCQkJbGFzdF9wdHIgPSBzcGluOwotCi0JCQkvKgotCQkJICogc2VlIHdoZXJlIHRoZSBwb2ludGVyIGN1cnJlbnRseSBpcy4gIEl0IG1heQotCQkJICogbm90IGJlIG91ciBzdGFydGluZyBmcmFtZSAoaS5lLiBtb3VzZSBub3cKLQkJCSAqIG91dHNpZGUgb2YgdGhlIG1vdmluZyB3aW5kb3cpLgotCQkJICovCi0JCQlmcmFtZSA9IDB4MDsKLQkJCVhfTE9DSzsKLQotCQkJaWYgKCEgZ2V0X3dtX2ZyYW1lX3BvcygmcHgsICZweSwgJngsICZ5LCAmdywgJmgsCi0JCQkgICAgJmZyYW1lLCBOVUxMKSkgewotCQkJCWZyYW1lID0gMHgwOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIk5PIGdldF93bV9mcmFtZV9wb3MtMjogMHglbHhcbiIsIGZyYW1lKTsKLQkJCX0KLQotCQkJaWYgKGZyYW1lICE9IG9yaWdfZnJhbWUpIHsKLQkJCQkvKiBzZWUgaWYgb3VyIG9yaWdpbmFsIGZyYW1lIGlzIHN0aWxsIHRoZXJlICovCi0JCQkJaWYgKCF2YWxpZF93aW5kb3cob3JpZ19mcmFtZSwgJmF0dHIsIDEpKSB7Ci0JCQkJCVhfVU5MT0NLOwotCQkJCQkvKiBvdXIgd2luZG93IGZyYW1lIHdlbnQgYXdheSEgKi8KLQkJCQkJd2luX2dvbmUgPSAxOwotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIkZSQU1FLUdPTkU6IDB4JWx4XG4iLCBvcmlnX2ZyYW1lKTsKLQkJCQkJYnJlYWtfcmVhc29uID0gNTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhdHRyLm1hcF9zdGF0ZSA9PSBJc1VubWFwcGVkKSB7Ci0JCQkJCVhfVU5MT0NLOwotCQkJCQkvKiBvdXIgd2luZG93IGZyYW1lIGlzIG5vdyB1bm1hcHBlZCEgKi8KLQkJCQkJd2luX3VubWFwcGVkID0gMTsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGUkFNRS1VTk1BUFBFRDogMHglbHhcbiIsIG9yaWdfZnJhbWUpOwotCQkJCQlicmVha19yZWFzb24gPSA1OwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJPVVQtT0YtRlJBTUU6IG9sZDogeDogJWQgIHk6ICVkICBweDogJWQgcHk6ICVkIDB4JWx4XG4iLCB4LCB5LCBweCwgcHksIGZyYW1lKTsKLQotCQkJCS8qIG5ldyBwYXJhbWV0ZXJzIGZvciBvdXIgZnJhbWUgKi8KLQkJCQl4ID0gYXR0ci54OwkvKiBuLmIuIHJvb3R3aW4gaXMgcGFyZW50ICovCi0JCQkJeSA9IGF0dHIueTsKLQkJCQl3ID0gYXR0ci53aWR0aDsKLQkJCQloID0gYXR0ci5oZWlnaHQ7Ci0JCQl9Ci0JCQlYX1VOTE9DSzsKLQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgZnJhbWU6IHg6ICVkICB5OiAlZCAgdzogJWQgIGg6ICVkICBweDogJWQgIHB5OiAlZCAgZnI6IDB4JWx4XG4iLCB4LCB5LCB3LCBoLCBweCwgcHksIGZyYW1lKTsJCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICAgICAgICBNTyxQVCxGUjogJWQvJWQgJWQvJWQgJWQvJWRcbiIsIGN1cnNvcl94IC0gb3JpZ19jdXJzb3JfeCwgY3Vyc29yX3kgLSBvcmlnX2N1cnNvcl95LCBweCAtIG9yaWdfcHgsIHB5IC0gb3JpZ19weSwgeCAtIG9yaWdfeCwgeSAtIG9yaWdfeSk7CQotCi0JCQlpZiAoZnJhbWVfY2hhbmdlZCAmJiBmcmFtZSAhPSBvcmlnX2ZyYW1lKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiQ0hBTkdFRCBhbmQgd2luZG93IHN3aXRjaDogMHglbHhcbiIsIGZyYW1lKTsKLQkJCX0KLQkJCWlmIChmcmFtZV9jaGFuZ2VkICYmIHB4IC0gb3JpZ19weCAhPSB4IC0gb3JpZ194KSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiTU9WRUQgYW5kIGRpZmYgRFhcbiIpOwotCQkJfQotCQkJaWYgKGZyYW1lX2NoYW5nZWQgJiYgcHkgLSBvcmlnX3B5ICE9IHkgLSBvcmlnX3kpIHsKLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJNT1ZFRCBhbmQgZGlmZiBEWVxuIik7Ci0JCQl9Ci0KLQkJCS8qIGNoZWNrIGFuZCBzZWUgaWYgb3VyIGZyYW1lIGhhcyBiZWVuIHJlc2l6ZWQ6ICovCi0JCQlpZiAoIWZyYW1lX2NoYW5nZWQgJiYgKHcgIT0gb3JpZ193IHx8IGggIT0gb3JpZ19oKSkgewotCQkJCWludCBuOwotCQkJCWlmICghYWxyZWFkeV9kb3duKSB7Ci0JCQkJCWZpcnN0X2R0X2F2ZSArPSBzcGluOwotCQkJCQlmaXJzdF9kdF9jbnQrKzsKLQkJCQl9Ci0JCQkJbiA9IGZpcnN0X2R0X2NudCA/IGZpcnN0X2R0X2NudCA6IDE7Ci0JCQkJZnJhbWVfY2hhbmdlZCA9IDI7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJXSU4gUkVTSVpFICAxc3QtZHQ6ICUuM2ZcbiIsIGZpcnN0X2R0X2F2ZS9uKTsKLQkJCX0KLQotCQkJLyogY2hlY2sgYW5kIHNlZSBpZiBvdXIgZnJhbWUgaGFzIGJlZW4gbW92ZWQ6ICovCi0JCQlpZiAoIWZyYW1lX2NoYW5nZWQgJiYgKHggIT0gb3JpZ194IHx8IHkgIT0gb3JpZ195KSkgewotCQkJCWludCBuOwotCQkJCWlmICghYWxyZWFkeV9kb3duKSB7Ci0JCQkJCWZpcnN0X2R0X2F2ZSArPSBzcGluOwotCQkJCQlmaXJzdF9kdF9jbnQrKzsKLQkJCQl9Ci0JCQkJbiA9IGZpcnN0X2R0X2NudCA/IGZpcnN0X2R0X2NudCA6IDE7Ci0JCQkJZnJhbWVfY2hhbmdlZCA9IDE7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiRlJBTUUgTU9WRSAgMXN0LWR0OiAlLjNmXG4iLCBmaXJzdF9kdF9hdmUvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBzZWUgaWYgaXQgaXMgdGltZSB0byBkcmF3IGFueSBvciBhIG5ldyB3aXJlZnJhbWUgYm94Ci0JCSAqLwotCi0JCWlmIChmcmFtZV9jaGFuZ2VkKSB7Ci0JCQlpbnQgZHJhd2l0ID0gMDsKLQkJCWlmICh4ICE9IGJveF94IHx8IHkgIT0gYm94X3kpIHsKLQkJCQkvKiBtb3ZlZCBzaW5jZSBsYXN0ICovCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJEUkFXMSAlZCAlZFxuIiwgeCAtIGJveF94LCB5IC0gYm94X3kpOwotCQkJCWRyYXdpdCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHcgIT0gYm94X3cgfHwgaCAhPSBib3hfaCkgewotCQkJCS8qIHJlc2l6ZSBzaW5jZSBsYXN0ICovCi0JCQkJZHJhd2l0ID0gMTsKLQkJCX0KLQkJCWlmIChkcmF3aXQpIHsKLQkJCQlpbnQgZG9pdCA9IDA7Ci0JCQkJLyoKLQkJCQkgKiBjaGVjayB0aW1lICh0byBhdm9pZCB0b28gbXVjaAotCQkJCSAqIGFuaW1hdGlvbnMgb24gc2xvdyBtYWNoaW5lcwotCQkJCSAqIG9yIGxpbmtzKS4KLQkJCQkgKi8KLQkJCQlpZiAoZ3BpKSB7Ci0JCQkJCWlmIChzcGluID4gbGFzdF9kcmF3ICsgbWluX2RyYXcgfHwgISBkcmV3X2JveCkgewotCQkJCQkJZG9pdCA9IDE7Ci0JCQkJCX0KLQkJCQkJaWYgKG1hY29zeF9jb25zb2xlICYmIGRvaXQgJiYgIW1hY19za2lwKSB7Ci0JCQkJCQlpZiAoeCAhPSBib3hfeCAmJiB5ICE9IGJveF95ICYmIHcgIT0gYm94X3cgJiYgaCAhPSBib3hfaCkgewotCQkJCQkJCWRvaXQgPSAwOwotCQkJCQkJfSBlbHNlIGlmICghYnV0dG9uX21hc2spIHsKLQkJCQkJCQlkb2l0ID0gMDsKLQkJCQkJCX0KLQkJCQkJCW1hY19za2lwKys7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZHJld19ib3ggJiYgY250ID4gbGFzdF9kcmF3X2NudCkgCXsKLQkJCQkJCWRvaXQgPSAxOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiKioqIE5PIEdQSSBEUkFXX0JPWFxuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQotCQkJCWlmIChkb2l0KSB7Ci0JCQkJCWlmICh0cnlfY29weXJlY3RfZHJhZyAmJiBuY2FjaGUgPiAwKSB7Ci0JCQkJCQlpZiAoIW5jYWNoZV9jb3B5cmVjdCkgewotCQkJCQkJCWRvX2NvcHlyZWN0X2RyYWcgPSAwOwotCQkJCQkJfSBlbHNlIGlmICh3ICE9IGJveF93IHx8IGggIT0gYm94X2gpIHsKLQkJCQkJCQlkb19jb3B5cmVjdF9kcmFnID0gMDsKLQkJCQkJCX0gZWxzZSBpZiAoZG9fY29weXJlY3RfZHJhZyA8IDApIHsKLQkJCQkJCQlXaW5kb3cgZnIgPSBvcmlnX2ZyYW1lOwotCQkJCQkJCWludCBpZHggPSBsb29rdXBfd2luX2luZGV4KGZyKTsKLQkJCQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQkJCQlmciA9IGZyYW1lOwotCQkJCQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KGZyKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGlkeCA+PSAwKSB7Ci0JCQkJCQkJCWRvX2NvcHlyZWN0X2RyYWcgPSBzZXRfY29weXJlY3RfZHJhZyhpZHgsIGZyLCB0cnlfYmF0Y2gpOwotCQkJCQkJCQlpZiAoZG9fY29weXJlY3RfZHJhZykgewotCQkJCQkJCQkJbWluX2RyYXcgKj0gMC42NjsKLQkJCQkJCQkJfQotCQkJCQkJCQluaWR4ID0gaWR4OwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWRvX2NvcHlyZWN0X2RyYWcgPSAwOwotCQkJCQkJCX0KLQkJCQkJCQlub3dfeCA9IG9yaWdfeDsKLQkJCQkJCQlub3dfeSA9IG9yaWdfeTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkb19jb3B5cmVjdF9kcmFnKSB7Ci0JCQkJCQkJaWYgKG9yaWdfdyAhPSB3IHx8IG9yaWdfaCAhPSBoKSB7Ci0JCQkJCQkJCWRvX2NvcHlyZWN0X2RyYWcgPSAwOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChkb19jb3B5cmVjdF9kcmFnIDw9IDApIHsKLQkJCQkJCWlmIChuY2FjaGUgPD0gMCkgewotCQkJCQkJCTsKLQkJCQkJCX0gZWxzZSBpZiAoIWRyZXdfYm94ICYmIG5jYWNoZV93Zl9yYWlzZXMpIHsKLQkJCQkJCQlXaW5kb3cgZnIgPSBvcmlnX2ZyYW1lOwotCQkJCQkJCWludCBpZHggPSBsb29rdXBfd2luX2luZGV4KGZyKTsKLQkJCQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQkJCQlmciA9IGZyYW1lOwotCQkJCQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KGZyKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGlkeCA+PSAwKSB7Ci0JCQkJCQkJCWNoZWNrX2NvcHlyZWN0X3JhaXNlKGlkeCwgZnIsIHRyeV9iYXRjaCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhd19ib3goeCwgeSwgdywgaCwgMCk7Ci0JCQkJCQlmYl9wdXNoKCk7IC8qIFhYWCBZICovCi0JCQkJCQlyZmJQRSgxMDAwKTsKLQkJCQkJfSBlbHNlIHsKLSNpZm5kZWYgTk9fTkNBQ0hFCi0JCQkJCQlpbnQgdGIgPSB1c2VfdGhyZWFkcyA/IDAgOiB0cnlfYmF0Y2g7Ci0JCQkJCQlkb19jb3B5cmVjdF9kcmFnX21vdmUob3JpZ19mcmFtZSwgZnJhbWUsICZuaWR4LAotCQkJCQkJICAgIHRiLCBub3dfeCwgbm93X3ksIG9yaWdfdywgb3JpZ19oLCB4LCB5LCB3LCBoLAotCQkJCQkJICAgIGNvcHlyZWN0X2RyYWdfZGVsYXkpOwotCQkJCQkJbm93X3ggPSB4OwotCQkJCQkJbm93X3kgPSB5OwotCQkJCQkJaWYgKGNvcHlyZWN0X2RyYWdfZGVsYXkgPT0gLTEuMCkgewotCQkJCQkJCWNvcHlyZWN0X2RyYWdfZGVsYXkgPSAwLjA0OwotCQkJCQkJfQotI2VuZGlmCi0JCQkJCX0KLQkJCQkJZHJld19ib3ggPSAxOwotCQkJCQlsYXN0X3dpcmVmcmFtZSA9IGRub3coKTsKLQotCQkJCQlsYXN0X2RyYXcgPSBzcGluOwotCQkJCQlsYXN0X2RyYXdfY250ID0gY250OwotCQkJCX0KLQkJCX0KLQkJCWJveF94ID0geDsKLQkJCWJveF95ID0geTsKLQkJCWJveF93ID0gdzsKLQkJCWJveF9oID0gaDsKLQkJfQotCi0JCS8qIAotCQkgKiBOb3cgKG5vdCBlYXJsaWVyKSBjaGVjayBpZiB0aGUgYnV0dG9uIGhhcyBjb21lIGJhY2sgdXAuCi0JCSAqIHdlIGNoZWNrIGhlcmUgdG8gZ2V0IGEgYmV0dGVyIGxvY2F0aW9uIGFuZCBzaXplIG9mCi0JCSAqIHRoZSBmaW5hbCB3aW5kb3cuCi0JCSAqLwotCQliZG93biA9IDA7Ci0JCWlmIChidXR0b25fbWFzaykgewotCQkJYmRvd24gPSAxOwotCQl9IGVsc2UgaWYgKHdpcmVmcmFtZV9sb2NhbCAmJiBkaXNwbGF5X2J1dHRvbl9tYXNrKSB7Ci0JCQliZG93biA9IDI7Ci0JCX0KLQkJaWYgKCEgYmRvd24pIHsKLWlmIChkYiB8fCBkYjIpIGZwcmludGYoc3RkZXJyLCAiTk8gYnV0dG9uX21hc2tcbiIpOwotCQkJYnJlYWtfcmVhc29uID0gNjsKLQkJCWJyZWFrOwkKLQkJfQotCX0KLQotCWlmICghIGRyZXdfYm94KSB7Ci0JCS8qIG5pY2UgdHJ5LCBidXQgbm8gbW92ZSBvciByZXNpemUgZGV0ZWN0ZWQuICBjbGVhbnVwLiAqLwotCQlpZiAoc3RhY2tfbGlzdF9udW0pIHsKLQkJCXN0YWNrX2xpc3RfbnVtID0gMDsKLQkJfQotCQl3aXJlZnJhbWVfaW5fcHJvZ3Jlc3MgPSAwOwotCQlpZiAobWFjb3N4X2NvbnNvbGUgJiYgKGJyZWFrX3JlYXNvbiA9PSA2IHx8IGJyZWFrX3JlYXNvbiA9PSA1KSkgewotCQkJY2hlY2tfbWFjb3N4X2ljb25pZnkob3JpZ19mcmFtZSwgZnJhbWUsIGRyZXdfYm94KTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiByZW1vdmUgdGhlIHdpcmVmcmFtZSAqLwotCWlmIChkb19jb3B5cmVjdF9kcmFnIDw9IDApIHsKLQkJZHJhd19ib3goMCwgMCwgMCwgMCwgMSk7Ci0JCWZiX3B1c2goKTsgLyogWFhYIFkgKi8KLQl9IGVsc2UgewotCQlpbnQgdGIgPSB1c2VfdGhyZWFkcyA/IDAgOiB0cnlfYmF0Y2g7Ci0JCWRvX2NvcHlyZWN0X2RyYWdfbW92ZShvcmlnX2ZyYW1lLCBmcmFtZSwgJm5pZHgsCi0JCSAgICB0Yiwgbm93X3gsIG5vd195LCBvcmlnX3csIG9yaWdfaCwgeCwgeSwgdywgaCwgLTEuMCk7Ci0JCWZiX3B1c2hfd2FpdCgwLjE1LCBGQl9DT1BZfEZCX01PRCk7Ci0JfQotCi0JZHggPSB4IC0gb3JpZ194OwotCWR5ID0geSAtIG9yaWdfeTsKLQotCS8qCi0JICogc2VlIGlmIHdlIGNhbiBhcHBseSBDb3B5UmVjdCBvciBDb3B5UmVnaW9uIHRvIHRoZSBjaGFuZ2U6Ci0JICovCi0JaWYgKCFzdHJjbXAod2lyZWZyYW1lX2NvcHlyZWN0LCAibmV2ZXIiKSkgewotCQk7Ci0JfSBlbHNlIGlmICh3aW5fZ29uZSB8fCB3aW5fdW5tYXBwZWQpIHsKLQkJOwotCX0gZWxzZSBpZiAoc2tpcF9jcl93aGVuX3NjYWxpbmcoIndpcmVmcmFtZSIpKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHcgIT0gb3JpZ193IHx8IGggIT0gb3JpZ19oKSB7Ci0JCWlmIChuY2FjaGUgPiAwKSB7Ci0JCQl0cnlfdG9fZml4X3Jlc2l6ZV9zdShvcmlnX2ZyYW1lLCBvcmlnX3gsIG9yaWdfeSwgb3JpZ193LCBvcmlnX2gsIHgsIHksIHcsIGgsIHRyeV9iYXRjaCk7Ci0JCQlYX0xPQ0s7Ci0JCQljbGVhcl93aW5fZXZlbnRzKG9yaWdfZnJhbWUsIDEpOwotCQkJaWYgKGZyYW1lICE9IG9yaWdfZnJhbWUpIHsKLQkJCQljbGVhcl93aW5fZXZlbnRzKGZyYW1lLCAxKTsKLQkJCX0KLQkJCVhfVU5MT0NLOwotCQl9Ci0JfSBlbHNlIGlmIChkeCA9PSAwICYmIGR5ID09IDApIHsKLQkJOwotCX0gZWxzZSBpZiAoZG9fY29weXJlY3RfZHJhZyA+IDApIHsKLQkJWF9MT0NLOwotCQljbGVhcl93aW5fZXZlbnRzKE5QUF9ud2luLCAwKTsKLQkJWF9VTkxPQ0s7Ci0JfSBlbHNlIHsKLQkJaW50IHNwaW5fbXMgPSAoaW50KSAoc3BpbiAqIDEwMDAgKiAxMDAwKTsKLQkJaW50IG9ic2N1cmVkLCBzZW50X2NvcHlyZWN0ID0gMDsKLQotCQlpbnQgbmlkeCA9IC0xOwotCQlpbnQgdXNlX2JhdGNoID0gMDsKLQkJZG91YmxlIG50aW07Ci0KLQkJLyoKLQkJICogc2V0IGEgdGltZXNjYWxlIGNvbXBhcmFibGUgdG8gdGhlIHNwaW4gdGltZSwKLQkJICogYnV0IG5vdCB0b28gc2hvcnQgb3IgdG9vIGxvbmcuCi0JCSAqLwotCQlpZiAoc3Bpbl9tcyA8IDMwKSB7Ci0JCQlzcGluX21zID0gMzA7Ci0JCX0gZWxzZSBpZiAoc3Bpbl9tcyA+IDQwMCkgewotCQkJc3Bpbl9tcyA9IDQwMDsKLQkJfQotCQludGltID0gZG5vdygpOwotCi0JCS8qIHRyeSB0byBmbHVzaCB0aGUgd2lyZWZyYW1lIHJlbW92YWw6ICovCi1pZiAobmNkYiAmJiBuY2FjaGUpIGZwcmludGYoc3RkZXJyLCAiXG5TRU5EX0NPUFlSRUNUICAlLjRmICUuNGZcbiIsIGRub3d4KCksIGRub3coKSAtIG50aW0pOwotCi0JCWlmICghIGZiX3B1c2hfd2FpdCgwLjE1LCBGQl9DT1BZfEZCX01PRCkpIHsKLQotaWYgKG5jZGIgJiYgbmNhY2hlKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFkgKkZBSUxFRCosIHRyeSBvbmUgbW9yZS4uLiAlLjRmIiwgZG5vdygpIC0gbnRpbSk7Ci0KLQkJCWlmICghIGZiX3B1c2hfd2FpdCgwLjE1LCBGQl9DT1BZfEZCX01PRCkpIHsKLQotaWYgKG5jZGIgJiYgbmNhY2hlKSBmcHJpbnRmKHN0ZGVyciwgIkZCX0NPUFkgKkZBSUxFRCogYWdhaW4hICUuNGYiLCBkbm93KCkgLSBudGltKTsKLQotCQkJfQotCQl9Ci0KLQkJbmNhY2hlX3ByZV9wb3J0aW9ucyhvcmlnX2ZyYW1lLCBmcmFtZSwgJm5pZHgsIHRyeV9iYXRjaCwgJnVzZV9iYXRjaCwKLQkJICAgIG9yaWdfeCwgb3JpZ195LCBvcmlnX3csIG9yaWdfaCwgeCwgeSwgdywgaCwgbnRpbSk7Ci0KLQkJLyogMikgdHJ5IHRvIHNlbmQgYSBjbGlwcGVkIGNvcHlyZWN0IG9mIHRyYW5zbGF0aW9uOiAqLwotCi0JCWlmICghIHRyeV9iYXRjaCkgewotCQkJc2VudF9jb3B5cmVjdCA9IHRyeV9jb3B5cmVjdChvcmlnX2ZyYW1lLCBmcmFtZSwgeCwgeSwgdywgaCwgZHgsIGR5LAotCQkJICAgICZvYnNjdXJlZCwgTlVMTCwgMC4xNSwgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnlfY29weXJlY3Qob3JpZ19mcmFtZSwgZnJhbWUsIHgsIHksIHcsIGgsIGR4LCBkeSwKLQkJCSAgICAmb2JzY3VyZWQsIE5VTEwsIDAuMTUsICZOUFBfbnJlZyk7CS8qIFhYWCAqLwotCQkJc2VudF9jb3B5cmVjdCA9IDE7Ci0JCQl1c2VfYmF0Y2ggPSAxOwotCQl9Ci0KLWlmICgobmNhY2hlIHx8IGRiKSAmJiBuY2RiKSBmcHJpbnRmKHN0ZGVyciwgInNlbnRfY29weXJlY3Q6ICVkIC0gb2JzOiAlZCAgZnJhbWU6IDB4JWx4XG4iLCBzZW50X2NvcHlyZWN0LCBvYnNjdXJlZCwgZnJhbWUpOwotCQlpZiAoc2VudF9jb3B5cmVjdCkgewotCQkJLyogdHJ5IHRvIHB1c2ggdGhlIGNoYW5nZXMgdG8gdmlld2VyczogKi8KLQkJCWlmICh1c2VfYmF0Y2gpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKCEgb2JzY3VyZWQpIHsKLQkJCQlmYl9wdXNoX3dhaXQoMC4xLCBGQl9DT1BZKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogbm8gZGlmZiBmb3Igbm93Li4uICovCi0JCQkJZmJfcHVzaF93YWl0KDAuMSwgRkJfQ09QWSk7Ci0JCQl9Ci0JCQluY2FjaGVfcG9zdF9wb3J0aW9ucyhuaWR4LCB1c2VfYmF0Y2gsCi0JCQkgICAgb3JpZ194LCBvcmlnX3ksIG9yaWdfdywgb3JpZ19oLCB4LCB5LCB3LCBoLCAtMS4wLCBudGltKTsKLQkJCVhfTE9DSzsKLQkJCWNsZWFyX3dpbl9ldmVudHMoTlBQX253aW4sIDApOwotCQkJWF9VTkxPQ0s7Ci0KLQkJCWlmIChzY2FsaW5nICYmICF1c2VfYmF0Y2gpIHsKLQkJCQlzdGF0aWMgZG91YmxlIGxhc3RfdGltZSA9IDAuMDsKLQkJCQlkb3VibGUgbm93ID0gZG5vdygpLCBkZWxheSA9IDAuMzU7Ci0KLQkJCQlmYl9wdXNoX3dhaXQoMC4xLCBGQl9DT1BZKTsKLQotCQkJCWlmIChub3cgPiBsYXN0X3RpbWUgKyBkZWxheSkgewotCQkJCQlpbnQgeHQgPSB4LCB5dCA9IHk7Ci0KLQkJCQkJaWYgKGNsaXBzaGlmdCkgewotCQkJCQkJeHQgLT0gY29mZl94OwotCQkJCQkJeXQgLT0gY29mZl95OwotCQkJCQl9Ci0JCQkJCWlmIChzdWJ3aW4pIHsKLQkJCQkJCXh0IC09IG9mZl94OwotCQkJCQkJeXQgLT0gb2ZmX3k7Ci0JCQkJCX0KLQotCQkJCQlzY2FsZV9tYXJrKHh0LCB5dCwgeHQrdywgeXQraCwgMSk7Ci0JCQkJCWxhc3RfdGltZSA9IG5vdzsKLQkJCQkJbGFzdF9jb3B5cmVjdF9maXggPSBub3c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHN0YWNrX2xpc3RfbnVtKSB7Ci0JCS8qIGNsZWFuIHVwIHN0YWNrX2xpc3QgZm9yIG5leHQgdGltZTogKi8KLQkJaWYgKGJyZWFrX3JlYXNvbiA9PSAxIHx8IGJyZWFrX3JlYXNvbiA9PSAyKSB7Ci0JCQkvKgotCQkJICogc2F2ZSB0aGUgc3RhY2sgbGlzdCwgcGVyaGFwcyB0aGUgdXNlciBoYXMKLQkJCSAqIHBhdXNlZCB3aXRoIGJ1dHRvbiBkb3duLgotCQkJICovCi0JCQlsYXN0X3NhdmVfc3RhY2tsaXN0ID0gdGltZShOVUxMKTsKLQkJfSBlbHNlIHsKLQkJCXN0YWNrX2xpc3RfbnVtID0gMDsKLQkJfQotCX0KLQotCS8qIGZpbmFsIHB1c2ggKGZvciAtbm93aXJlY29weXJlY3QpICovCi0JcmZiUEUoMTAwMCk7Ci0Jd2lyZWZyYW1lX2luX3Byb2dyZXNzID0gMDsKLQotCWlmICgxKSB7Ci0JLyogSW4gcHJpbmNpcGxlIG5vIGxvbmdlciBuZWVkZWQuLi4gIHNlZSBkcmF3X2JveCgpICovCi0JICAgIGlmIChmcmFtZV9jaGFuZ2VkICYmIGNtYXA4dG8yNCAvKiAmJiBtdWx0aXZpc19jb3VudCAqLykgewotCQkvKiBoYW5kbGUgLTh0bzI0IGtsdWRnZSwgbWFyayBhcmVhIGFuZCBjaGVjayA4YnBwLi4uICovCi0JCWludCB4MSwgeDIsIHkxLCB5MiwgZiA9IDE2OwotCQl4MSA9IG5taW4oYm94X3gsIG9yaWdfeCkgLSBmOwotCQl5MSA9IG5taW4oYm94X3ksIG9yaWdfeSkgLSBmOwotCQl4MiA9IG5tYXgoYm94X3ggKyBib3hfdywgb3JpZ194ICsgb3JpZ193KSArIGY7Ci0JCXkyID0gbm1heChib3hfeSArIGJveF9oLCBvcmlnX3kgKyBvcmlnX2gpICsgZjsKLQkJeDEgPSBuZml4KHgxLCBkcHlfeCk7Ci0JCXgyID0gbmZpeCh4MiwgZHB5X3grMSk7Ci0JCXkxID0gbmZpeCh5MSwgZHB5X3kpOwotCQl5MiA9IG5maXgoeTIsIGRweV95KzEpOwotCQlpZiAoMCkgewotCQkJY2hlY2tfZm9yX211bHRpdmlzKCk7Ci0JCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoeDEsIHkxLCB4MiwgeTIsIDApOwotCQl9IGVsc2UgewotCQkJaWYgKDEpIHsKLQkJCQlicHA4dG8yNCh4MSwgeTEsIHgyLCB5Mik7Ci0JCQl9IGVsc2UgewotCQkJCWJwcDh0bzI0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JCQl9Ci0JCX0KLQkgICAgfQotCX0KLQotCXVyZ2VudF91cGRhdGUgPSAxOwotCWlmICh1c2VfeGRhbWFnZSkgewotCQkvKiBEQU1BR0UgY2FuIHF1ZXVlIH4xMDAwIHJlY3RhbmdsZXMgZm9yIGEgbW92ZSAqLwotCQljbGVhcl94ZGFtYWdlX21hcmtfcmVnaW9uKE5VTEwsIDEpOwotCQl4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrID0gZG5vdygpICsgMi4wOwotCX0KLQotCWlmIChtYWNvc3hfY29uc29sZSAmJiAoYnJlYWtfcmVhc29uID09IDYgfHwgYnJlYWtfcmVhc29uID09IDUpKSB7Ci0JCWNoZWNrX21hY29zeF9pY29uaWZ5KG9yaWdfZnJhbWUsIGZyYW1lLCBkcmV3X2JveCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIGhhbmRsZSB1c2VyIGlucHV0LCBwYXJ0aWN1bGFybHkgcG9pbnRlciBpbnB1dCwgY2FyZWZ1bGx5LgotICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIG5vbi10aHJlYWRlZC4gIE5vdGUgdGhhdAotICogcmZiUHJvY2Vzc0V2ZW50cygpIG9ubHkgcHJvY2Vzc2VzICpvbmUqIHBvaW50ZXIgZXZlbnQgcGVyIGNhbGwsCi0gKiBzbyBpZiB3ZSBpbnRlcmxhY2UgaXQgd2l0aCBzY2FuX2Zvcl91cGRhdGVzKCksIHdlIGNhbiBnZXQgc3dhbXBlZAotICogd2l0aCBxdWV1ZWQgdXAgcG9pbnRlciBpbnB1dHMuICBBbmQgaWYgdGhlIHBvaW50ZXIgaW5wdXRzIGFyZSBpbmR1Y2luZwotICogbGFyZ2UgY2hhbmdlcyBvbiB0aGUgc2NyZWVuIChlLmcuIHdpbmRvdyBkcmFncyksIHRoZSB3aG9sZSB0aGluZwotICogYm9ncyBkb3duIG1pc2VyYWJseSBhbmQgb25seSBjb21lcyBiYWNrIHRvIGxpZmUgYXQgc29tZSB0aW1lIGFmdGVyCi0gKiBvbmUgc3RvcHMgbW92aW5nIHRoZSBtb3VzZS4gIFNvLCB0byBmaXJzdCBhcHByb3hpbWF0aW9uLCB3ZSBhcmUgdHJ5aW5nCi0gKiB0byBlYXQgYXMgbXVjaCB1c2VyIGlucHV0IGhlcmUgYXMgd2UgY2FuIHVzaW5nIHNvbWUgaGludHMgZnJvbSB0aGUKLSAqIGR1cmF0aW9uIG9mIHRoZSBwcmV2aW91cyBzY2FuX2Zvcl91cGRhdGVzKCkgY2FsbCAoaW4gZHQpLgotICoKLSAqIG5vdGU6IHdlIGRvIHRoaXMgZXZlbiB1bmRlciAtbm9mYgotICoKLSAqIHJldHVybiBvZiAxIG1lYW5zIHdhdGNoX2xvb3Agc2hvdWxkIHNob3J0LWNpcmN1aXQgYW5kIHJlbG9vcCwKLSAqIHJldHVybiBvZiAwIG1lYW5zIHdhdGNoX2xvb3Agc2hvdWxkIHByb2NlZWQgdG8gc2Nhbl9mb3JfdXBkYXRlcygpLgotICogKHRoaXMgaXMgZm9yIHBvaW50ZXJfbW9kZSA9PSAxIG1vZGUsIHRoZSBvdGhlcnMgZG8gaXQgYWxsIGludGVybmFsbHksCi0gKiBjbnQgaXMgYWxzbyBvbmx5IGZvciB0aGF0IG1vZGUpLgotICovCi0KLXN0YXRpYyB2b2lkIGNoZWNrX3VzZXJfaW5wdXQyKGRvdWJsZSBkdCkgewotCi0JaW50IGVhdGVuID0gMCwgbWlzcyA9IDAsIG1heF9lYXQgPSA1MCwgZG9fZmx1c2ggPSAxOwotCWludCBnLCBnX2luOwotCWRvdWJsZSBzcGluID0gMC4wLCB0bTsKLQlkb3VibGUgcXVpY2tfc3Bpbl9mYWMgID0gMC40MDsKLQlkb3VibGUgZ3JpbmRfc3Bpbl90aW1lID0gMC4xNzU7Ci0KLQlkdGltZTAoJnRtKTsKLQlnID0gZ19pbiA9IGdvdF9wb2ludGVyX2lucHV0OwotCWlmICghZ290X3BvaW50ZXJfaW5wdXQpIHsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIFRyeSBmb3Igc29tZSAicXVpY2siIHBvaW50ZXIgaW5wdXQgcHJvY2Vzc2luZy4KLQkgKgotCSAqIEFib3V0IGFzIGZhc3QgYXMgd2UgY2FuLCB3ZSB0cnkgdG8gcHJvY2VzcyB1c2VyIGlucHV0IGNhbGxpbmcKLQkgKiByZmJQcm9jZXNzRXZlbnRzIG9yIHJmYkNoZWNrRmRzLiAgV2UgZG8gdGhpcyBmb3IgYSB0aW1lIG9uCi0JICogb3JkZXIgb2YgdGhlIGxhc3Qgc2Nhbl9mb3JfdXBkYXRlcygpIHRpbWUsIGR0LCBidXQgaWYgd2Ugc3RvcAotCSAqIGdldHRpbmcgdXNlciBpbnB1dCB3ZSBicmVhayBvdXQuICBXZSB3aWxsIGFsc28gYnJlYWsgb3V0IGlmCi0JICogd2UgaGF2ZSBwcm9jZXNzZWQgbWF4X2VhdCBpbnB1dHMuCi0JICoKLQkgKiBOb3RlIHRoYXQgcmZiQ2hlY2tGZHMoKSBkb2VzIG5vdCBzZW5kIGFueSBmcmFtZWJ1ZmZlciB1cGRhdGVzLAotCSAqIHNvIGlzIG1vcmUgd2hhdCB3ZSB3YW50IGhlcmUsIGFsdGhvdWdoIGl0IGlzIGxpa2VseSB0aGV5IGhhdmUKLQkgKiBhbGwgYmUgc2VudCBhbHJlYWR5LgotCSAqLwotCXdoaWxlICgxKSB7Ci0JCWlmIChzaG93X211bHRpcGxlX2N1cnNvcnMpIHsKLQkJCXJmYlBFKDEwMDApOwotCQl9IGVsc2UgewotCQkJcmZiQ0ZEKDEwMDApOwotCQl9Ci0JCXJmYkNGRCgwKTsKLQotCQlzcGluICs9IGR0aW1lKCZ0bSk7Ci0KLQkJaWYgKHNwaW4gPiBxdWlja19zcGluX2ZhYyAqIGR0KSB7Ci0JCQkvKiBnZXQgb3V0IGlmIHNwaW4gdGltZSBjb21wYXJhYmxlIHRvIGxhc3Qgc2NhbiB0aW1lICovCi0JCQlicmVhazsKLQkJfQotCQlpZiAoZ290X3BvaW50ZXJfaW5wdXQgPiBnKSB7Ci0JCQlpbnQgaSwgbWF4X2V4dHJhID0gbWF4X2VhdCAvIDI7Ci0JCQlnID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0JCQllYXRlbisrOwotCQkJZm9yIChpPTA7IGk8bWF4X2V4dHJhOyBpKyspICB7Ci0JCQkJcmZiQ0ZEKDApOwotCQkJCWlmIChnb3RfcG9pbnRlcl9pbnB1dCA+IGcpIHsKLQkJCQkJZyA9IGdvdF9wb2ludGVyX2lucHV0OwotCQkJCQllYXRlbisrOwotCQkJCX0gZWxzZSBpZiAoaSA+IDEpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJWF9MT0NLOwotCQkJZG9fZmx1c2ggPSAwOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfdXNlcl9pbnB1dDItQTogWEZsdXNoICUuNGZcbiIsIHRtKTsKLQkJCVhGbHVzaF93cihkcHkpOwotCQkJWF9VTkxPQ0s7Ci0JCQlpZiAoZWF0ZW4gPCBtYXhfZWF0KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltaXNzKys7Ci0JCX0KLQkJaWYgKG1pc3MgPiAxKSB7CS8qIDEgbWVhbnMgb3V0IG9uIDJuZCBtaXNzICovCi0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoZG9fZmx1c2gpIHsKLQkJWF9MT0NLOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfdXNlcl9pbnB1dDItQjogWEZsdXNoICUuNGZcbiIsIHRtKTsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JCVhfVU5MT0NLOwotCX0KLQotCi0JLyoKLQkgKiBQcm9iYWJseSBncmluZGluZyB3aXRoIGEgbG90IG9mIGZiIEkvTyBpZiBkdCBpcyB0aGlzIGxhcmdlLgotCSAqIChuZWVkIHRvIGRvIHRoaXMgbW9yZSBlbGVnYW50bHkpCi0JICoKLQkgKiBDdXJyZW50IGlkZWEgaXMgdG8gc3BpbiBvdXIgd2hlZWxzIGhlcmUgKm5vdCogcHJvY2Vzc2luZyBhbnkKLQkgKiBmYiBJL08sIGJ1dCBzdGlsbCBwcm9jZXNzaW5nIHRoZSB1c2VyIGlucHV0LiAgVGhpcyB1c2VyIGlucHV0Ci0JICogZ29lcyB0byB0aGUgWCBkaXNwbGF5IGFuZCBjaGFuZ2VzIGl0LCBidXQgd2UgZG9uJ3QgcG9sbCBpdAotCSAqIHdoaWxlIHdlICJyZXN0IiBoZXJlIGZvciBhIHRpbWUgb24gb3JkZXIgb2YgZHQsIHRoZSBwcmV2aW91cwotCSAqIHNjYW5fZm9yX3VwZGF0ZXMoKSB0aW1lLiAgV2UgYWxzbyBicmVhayBvdXQgaWYgd2UgbWlzcyBlbm91Z2gKLQkgKiB1c2VyIGlucHV0LgotCSAqLwotCWlmIChkdCA+IGdyaW5kX3NwaW5fdGltZSkgewotCQlpbnQgaSwgbXMsIHNwbGl0ID0gMzA7Ci0JCWRvdWJsZSBzaGltOwotCi0JCS8qCi0JCSAqIEJyZWFrIHVwIG91ciBwYXVzZSBpbnRvICdzcGxpdCcgc3RlcHMuICBXZSBnZXQgYXQKLQkJICogbW9zdCBvbmUgaW5wdXQgcGVyIHN0ZXAuCi0JCSAqLwotCQlzaGltID0gMC43NSAqIGR0IC8gc3BsaXQ7Ci0KLQkJbXMgPSAoaW50KSAoMTAwMCAqIHNoaW0pOwotCi0JCS8qIGN1dG9mZiBob3cgbG9uZyB0aGUgcGF1c2UgY2FuIGJlICovCi0JCWlmIChzcGxpdCAqIG1zID4gMzAwKSB7Ci0JCQltcyA9IDMwMCAvIHNwbGl0OwotCQl9Ci0KLQkJc3BpbiA9IDAuMDsKLQkJZHRpbWUwKCZ0bSk7Ci0KLQkJZyA9IGdvdF9wb2ludGVyX2lucHV0OwotCQltaXNzID0gMDsKLQkJZm9yIChpPTA7IGk8c3BsaXQ7IGkrKykgewotCQkJdXNsZWVwKG1zICogMTAwMCk7Ci0JCQlpZiAoc2hvd19tdWx0aXBsZV9jdXJzb3JzKSB7Ci0JCQkJcmZiUEUoMTAwMCk7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkNGRCgxMDAwKTsKLQkJCX0KLQkJCXNwaW4gKz0gZHRpbWUoJnRtKTsKLQkJCWlmIChnb3RfcG9pbnRlcl9pbnB1dCA+IGcpIHsKLQkJCQlpbnQgaSwgbWF4X2V4dHJhID0gbWF4X2VhdCAvIDI7Ci0JCQkJZm9yIChpPTA7IGk8bWF4X2V4dHJhOyBpKyspICB7Ci0JCQkJCXJmYkNGRCgwKTsKLQkJCQkJaWYgKGdvdF9wb2ludGVyX2lucHV0ID4gZykgewotCQkJCQkJZyA9IGdvdF9wb2ludGVyX2lucHV0OwotCQkJCQl9IGVsc2UgaWYgKGkgPiAxKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlYX0xPQ0s7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJjaGVja191c2VyX2lucHV0Mi1DOiBYRmx1c2ggJS40ZlxuIiwgdG0pOwotCQkJCVhGbHVzaF93cihkcHkpOwotCQkJCVhfVU5MT0NLOwotCQkJCW1pc3MgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQltaXNzKys7Ci0JCQl9Ci0JCQlnID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0JCQlpZiAobWlzcyA+IDIpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgxMDAwICogc3BpbiA+IG1zICogc3BsaXQpICB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX3VzZXJfaW5wdXQzKGRvdWJsZSBkdCwgZG91YmxlIGR0ciwgaW50IHRpbGVfZGlmZnMpIHsKLQotCWludCBhbGxvd2VkX21pc3NlcywgbWlzc190d2VhaywgaSwgZywgZ19pbjsKLQlpbnQgbGFzdF93YXNfbWlzcywgY29uc2VjdXRpdmVfbWlzc2VzOwotCWRvdWJsZSBzcGluLCBzcGluX21heCwgdG0sIHRvLCBkdG07Ci0JaW50IHJmYl93YWl0X21zID0gMjsKLQlzdGF0aWMgZG91YmxlIGR0X2N1dCA9IDAuMDc1OwotCWludCBnY250LCBnaW5wdXQ7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0KLQlpZiAoZHRyIHx8IHRpbGVfZGlmZnMpIHt9IC8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0KLQlpZiAoZmlyc3QpIHsKLQkJY2hhciAqcCA9IGdldGVudigiU1BJTiIpOwotCQlpZiAocCkgewotCQkJZG91YmxlIGp1bms7Ci0JCQlzc2NhbmYocCwgIiVsZiwlbGYiLCAmZHRfY3V0LCAmanVuayk7Ci0JCX0KLQkJZmlyc3QgPSAwOwotCX0KLQotCWlmICghZ290X3BvaW50ZXJfaW5wdXQpIHsKLQkJcmV0dXJuOwotCX0KLQotCi0JaWYgKGR0IDwgZHRfY3V0KSB7Ci0JCWR0ID0gZHRfY3V0OwkvKiB0aGlzIGlzIHRvIHRyeSB0byBhdm9pZCBlYXJseSBleGl0ICovCi0JfQotCXNwaW5fbWF4ID0gMC41OwotCi0Jc3BpbiA9IDAuMDsJCS8qIGFtb3VudCBvZiB0aW1lIHNwaW5uaW5nICovCi0JYWxsb3dlZF9taXNzZXMgPSAxMDsJLyogbnVtYmVyIG9mIHB0ciBpbnB1dHMgd2UgY2FuIG1pc3MgKi8KLQltaXNzX3R3ZWFrID0gODsKLQlsYXN0X3dhc19taXNzID0gMDsKLQljb25zZWN1dGl2ZV9taXNzZXMgPSAxOwotCWdjbnQgPSAwOwotCWdpbnB1dCA9IDA7Ci0KLQlkdGltZTAoJnRtKTsKLQl0byA9IHRtOwkvKiBsYXN0IHRpbWUgd2UgZGlkIHJmYlBFKCkgKi8KLQotCWcgPSBnX2luID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0KLQl3aGlsZSAoMSkgewotCQlpbnQgZ290X2lucHV0ID0gMDsKLQotCQlnY250Kys7Ci0KLQkJaWYgKGJ1dHRvbl9tYXNrKSB7Ci0JCQlkcmFnX2luX3Byb2dyZXNzID0gMTsKLQkJfQotCi0JCXJmYkNGRChyZmJfd2FpdF9tcyAqIDEwMDApOwotCi0JCWR0bSA9IGR0aW1lKCZ0bSk7Ci0JCXNwaW4gKz0gZHRtOwotCi0JCWlmIChnb3RfcG9pbnRlcl9pbnB1dCA9PSBnKSB7Ci0JCQlpZiAobGFzdF93YXNfbWlzcykgewotCQkJCWNvbnNlY3V0aXZlX21pc3NlcysrOwotCQkJfQotCQkJbGFzdF93YXNfbWlzcyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlnaW5wdXQrKzsKLQkJCWlmIChnaW5wdXQgJSBtaXNzX3R3ZWFrID09IDApIHsKLQkJCQlhbGxvd2VkX21pc3NlcysrOwotCQkJfQotCQkJY29uc2VjdXRpdmVfbWlzc2VzID0gMTsKLQkJCWxhc3Rfd2FzX21pc3MgPSAwOwotCQl9Ci0KLQkJaWYgKHNwaW4gPiBzcGluX21heCkgewotCQkJLyogZ2V0IG91dCBpZiBzcGluIHRpbWUgb3ZlciBsaW1pdCAqLwotCQkJYnJlYWs7Ci0KLQkJfSBlbHNlIGlmIChnb3RfcG9pbnRlcl9pbnB1dCA+IGcpIHsKLQkJCS8qIHJlY2VpdmVkIHNvbWUgaW5wdXQsIGZsdXNoIHRvIGRpc3BsYXkuICovCi0JCQlnb3RfaW5wdXQgPSAxOwotCQkJZyA9IGdvdF9wb2ludGVyX2lucHV0OwotCQkJWF9MT0NLOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlYX1VOTE9DSzsKLQkJfSBlbHNlIGlmICgtLWFsbG93ZWRfbWlzc2VzIDw9IDApIHsKLQkJCS8qIHRvbyBtYW55IG1pc3NlcyAqLwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoY29uc2VjdXRpdmVfbWlzc2VzID49MykgewotCQkJLyogdG9vIG1hbnkgbWlzc2VzICovCi0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCS8qIHRoZXNlIGFyZSBtaXNzZXMgKi8KLQkJCWludCB3bXMgPSAwOwotCQkJaWYgKGdjbnQgPT0gMSAmJiBidXR0b25fbWFzaykgewotCQkJCS8qCi0JCQkJICogbWlzc2VkIG91ciBmaXJzdCBpbnB1dCwgd2FpdAotCQkJCSAqIGZvciBhIGRlZmVyIHRpbWUuIChlLmcuIG9uCi0JCQkJICogc2xvdyBsaW5rKSBob3BlZnVsbHkgY2xpZW50Ci0JCQkJICogd2lsbCBiYXRjaCB0aGVtLgotCQkJCSAqLwotCQkJCXdtcyA9IDUwOwotCQkJfSBlbHNlIGlmIChidXR0b25fbWFzaykgewotCQkJCXdtcyA9IDEwOwotCQkJfSBlbHNlIHsKLQkJCX0KLQkJCWlmICh3bXMpIHsKLQkJCQl1c2xlZXAod21zICogMTAwMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoZ2lucHV0ID49IDIpIHsKLQkJLyogdHJ5IGZvciBhIGNvdXBsZSBtb3JlIHF1aWNrIG9uZXMgKi8KLQkJZm9yIChpPTA7IGk8MjsgaSsrKSB7Ci0JCQlyZmJDRkQocmZiX3dhaXRfbXMgKiAxMDAwKTsKLQkJfQotCX0KLQotCWRyYWdfaW5fcHJvZ3Jlc3MgPSAwOwotfQotCi1pbnQgZmJfdXBkYXRlX3NlbnQoaW50ICpjb3VudCkgewotCXN0YXRpYyBpbnQgbGFzdF9jb3VudCA9IDA7Ci0JaW50IHNlbnQgPSAwLCByYyA9IDA7Ci0JcmZiQ2xpZW50SXRlcmF0b3JQdHIgaTsKLQlyZmJDbGllbnRQdHIgY2w7Ci0KLQlpZiAobm9mYikgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpID0gcmZiR2V0Q2xpZW50SXRlcmF0b3Ioc2NyZWVuKTsKLQl3aGlsZSggKGNsID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGkpKSApIHsKLSNpZiAwCi0JCXNlbnQgKz0gY2wtPmZyYW1lYnVmZmVyVXBkYXRlTWVzc2FnZXNTZW50OwotI2Vsc2UKLSNpZiBMSUJWTkNTRVJWRVJfSEFTX1NUQVRTCi0JCXNlbnQgKz0gcmZiU3RhdEdldE1lc3NhZ2VDb3VudFNlbnQoY2wsIHJmYkZyYW1lYnVmZmVyVXBkYXRlKTsKLSNlbmRpZgotI2VuZGlmCi0JfQotCXJmYlJlbGVhc2VDbGllbnRJdGVyYXRvcihpKTsKLQlpZiAoc2VudCAhPSBsYXN0X2NvdW50KSB7Ci0JCXJjID0gMTsKLQl9Ci0JaWYgKGNvdW50ICE9IE5VTEwpIHsKLQkJKmNvdW50ID0gc2VudDsKLQl9Ci0JbGFzdF9jb3VudCA9IHNlbnQ7Ci0JcmV0dXJuIHJjOyAKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfdXNlcl9pbnB1dDQoZG91YmxlIGR0LCBkb3VibGUgZHRyLCBpbnQgdGlsZV9kaWZmcykgewotCi0JaW50IGcsIGdfaW4sIGksIGdpbnB1dCwgZ2NudCwgdG1wOwotCWludCBsYXN0X3dhc19taXNzLCBjb25zZWN1dGl2ZV9taXNzZXM7Ci0JaW50IG1pbl9mcmFtZV9zaXplID0gMTA7CS8qIDEwIHRpbGVzICovCi0JZG91YmxlIHNwaW4sIHRtLCB0bywgdGMsIGR0bSwgcnBlX2xhc3Q7Ci0JaW50IHJmYl93YWl0X21zID0gMjsKLQlzdGF0aWMgZG91YmxlIGR0X2N1dCA9IDAuMDUwOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCi0JaW50IEJ0aWxlID0gdGlsZV94ICogdGlsZV95ICogYnBwLzg7IAkvKiBCeXRlcyBwZXIgdGlsZSAqLwotCWRvdWJsZSBUdGlsZSwgZHRfdXNlOwotCWRvdWJsZSBzY3JlZW5fcmF0ZSA9IDYwMDAwMDAuOyAgICAvKiA1IE1CL3NlYyAqLwotCWRvdWJsZSB2bmNjcHVfcmF0ZSA9IDgwICogMTAwMDAwLjsgLyogMjAgS0Ivc2VjIEAgODBYIGNvbXByZXNzaW9uICovCi0JZG91YmxlIG5ldF9yYXRlID0gNTAwMDAuOwotCXN0YXRpYyBkb3VibGUgVGZhY19yID0gMS4wLCBUZmFjX3YgPSAxLjAsIFRmYWNfbiA9IDEuMCwgVGRlbGF5ID0gMC4wMDE7Ci0Jc3RhdGljIGRvdWJsZSBkdF9taW4gPSAtMS4wLCBkdF9tYXggPSAtMS4wOwotCWRvdWJsZSBkdF9taW5fZmFsbGJhY2sgPSAwLjA1MDsKLQlzdGF0aWMgaW50IHNzZWMgPSAwLCB0b3RhbF9jYWxscyA9IDA7Ci0Jc3RhdGljIGludCBwdXNoX2ZyYW1lID0gMCwgdXBkYXRlX2NvdW50ID0gMDsKLQotCWlmIChmaXJzdCkgewotCQljaGFyICpwID0gZ2V0ZW52KCJTUElOIik7Ci0JCWlmIChwKSB7Ci0JCQlzc2NhbmYocCwgIiVsZiwlbGYsJWxmLCVsZiIsICZkdF9jdXQsICZUZmFjX3IsICZUZmFjX3YsICZUZmFjX24pOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQkJc3NlYyA9IHRpbWUoTlVMTCk7Ci0KLQkJaWYgKGR0cikge30JLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQl9Ci0KLQl0b3RhbF9jYWxscysrOwotCi0JaWYgKGR0X21pbiA8IDAuMCB8fCBkdCA8IGR0X21pbikgewotCQlpZiAoZHQgPiAwLjApIHsKLQkJCWR0X21pbiA9IGR0OwotCQl9Ci0JfQotCWlmIChkdF9taW4gPCAwLjApIHsKLQkJLyogc2Vuc2libGUgdmFsdWUgZm9yIHRoZSB2ZXJ5IDFzdCBjYWxsIGlmIGR0ID0gMC4wICovCi0JCWR0X21pbiA9IGR0X21pbl9mYWxsYmFjazsKLQl9Ci0JaWYgKGR0X21heCA8IDAuMCB8fCBkdCA+IGR0X21heCkgewotCQlkdF9tYXggPSBkdDsKLQl9Ci0KLQlpZiAodG90YWxfY2FsbHMgPiAzMCAmJiBkdF9taW4gPiAwLjApIHsKLQkJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JCS8qCi0JCSAqIGR0X21pbiB3aWxsIHNvb24gYmUgdGhlIHF1aWNrZXN0IHRpbWUgdG8gZG8KLQkJICogb25lIHNjYW5fZm9yX3VwZGF0ZXMgd2l0aCBubyB0aWxlcyBjb3BpZWQuCi0JCSAqIHVzZSB0aGlzIChpbnN0ZWFkIG9mIGNvcHlfdGlsZXMpIHRvIGVzdGltYXRlCi0JCSAqIHNjcmVlbiByZWFkIHJhdGUuCi0JCSAqLwotCQlzY3JlZW5fcmF0ZSA9IChtYWluX2J5dGVzX3Blcl9saW5lICogbnRpbGVzX3kpIC8gZHRfbWluOwotCQlpZiAoZmlyc3QpIHsKLQkJCXJmYkxvZygibWVhc3VyZWQgc2NyZWVuIHJlYWQgcmF0ZTogJS4yZiBCeXRlcy9zZWNcbiIsCi0JCQkgICAgc2NyZWVuX3JhdGUpOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlkdGltZTAoJnRtKTsKLQotCWlmIChkdCA8IGR0X2N1dCkgewotCQlkdF91c2UgPSBkdF9jdXQ7Ci0JfSBlbHNlIHsKLQkJZHRfdXNlID0gZHQ7Ci0JfQotCi0JaWYgKHB1c2hfZnJhbWUpIHsKLQkJaW50IGNudCwgaXRlciA9IDA7Ci0JCWRvdWJsZSB0cCwgcHVzaF9zcGluID0gMC4wOwotCQlkdGltZTAoJnRwKTsKLQkJd2hpbGUgKHB1c2hfc3BpbiA8IGR0X3VzZSAqIDAuNSkgewotCQkJZmJfdXBkYXRlX3NlbnQoJmNudCk7Ci0JCQlpZiAoY250ICE9IHVwZGF0ZV9jb3VudCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogZGFtbiwgdGhleSBkaWRuJ3QgcHVzaCBvdXIgZnJhbWUhICovCi0JCQlpdGVyKys7Ci0JCQlyZmJQRShyZmJfd2FpdF9tcyAqIDEwMDApOwotCQkJCi0JCQlwdXNoX3NwaW4gKz0gZHRpbWUoJnRwKTsKLQkJfQotCQlpZiAoaXRlcikgewotCQkJWF9MT0NLOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQlYX1VOTE9DSzsKLQkJfQotCQlwdXNoX2ZyYW1lID0gMDsKLQkJdXBkYXRlX2NvdW50ID0gMDsKLQl9Ci0KLQkvKgotCSAqIHdoZW4gd2UgZmlyc3QgZW50ZXIgd2UgcmVxdWlyZSBzb21lIHBvaW50ZXIgaW5wdXQKLQkgKi8KLQlpZiAoIWdvdF9wb2ludGVyX2lucHV0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQl2bmNjcHVfcmF0ZSA9IGdldF9yYXdfcmF0ZSgpOwotCi0JaWYgKCh0bXAgPSBnZXRfcmVhZF9yYXRlKCkpICE9IDApIHsKLQkJc2NyZWVuX3JhdGUgPSAoZG91YmxlKSB0bXA7Ci0JfQotCWlmICgodG1wID0gZ2V0X25ldF9yYXRlKCkpICE9IDApIHsKLQkJbmV0X3JhdGUgPSAoZG91YmxlKSB0bXA7Ci0JfQotCW5ldF9yYXRlID0gKHZuY2NwdV9yYXRlL2dldF9jbXBfcmF0ZSgpKSAqIG5ldF9yYXRlOwotCi0JaWYgKCh0bXAgPSBnZXRfbmV0X2xhdGVuY3koKSkgIT0gMCkgewotCQlUZGVsYXkgPSAwLjUgKiAoKGRvdWJsZSkgdG1wKS8xMDAwLjsKLQl9Ci0KLQlUdGlsZSA9IEJ0aWxlICogKFRmYWNfci9zY3JlZW5fcmF0ZSArIFRmYWNfdi92bmNjcHVfcmF0ZSArIFRmYWNfbi9uZXRfcmF0ZSk7Ci0KLQlzcGluID0gMC4wOwkJLyogYW1vdW50IG9mIHRpbWUgc3Bpbm5pbmcgKi8KLQlsYXN0X3dhc19taXNzID0gMDsKLQljb25zZWN1dGl2ZV9taXNzZXMgPSAxOwotCWdjbnQgPSAwOwotCWdpbnB1dCA9IDA7Ci0KLQlycGVfbGFzdCA9IHRvID0gdGMgPSB0bTsJLyogbGFzdCB0aW1lIHdlIGRpZCByZmJQRSgpICovCi0JZyA9IGdfaW4gPSBnb3RfcG9pbnRlcl9pbnB1dDsKLQotCXRpbGVfZGlmZnMgPSAwOwkvKiByZXNldCBvdXIga25vd2xlZ2RlIG9mIHRpbGVfZGlmZnMgdG8gemVybyAqLwotCi0Jd2hpbGUgKDEpIHsKLQkJaW50IGdvdF9pbnB1dCA9IDA7Ci0KLQkJZ2NudCsrOwotCi0JCWlmIChidXR0b25fbWFzaykgewotCQkJLyogdGhpcyB2YXJpYmxlIGlzIHVzZWQgYnkgb3VyIHBvaW50ZXIgaGFuZGxlciAqLwotCQkJZHJhZ19pbl9wcm9ncmVzcyA9IDE7Ci0JCX0KLQotCQkvKiB0dXJuIGxpYnZuY3NlcnZlciBjcmFuayB0byBwcm9jZXNzIGV2ZW50czogKi8KLQkJcmZiQ0ZEKHJmYl93YWl0X21zICogMTAwMCk7Ci0KLQkJZHRtID0gZHRpbWUoJnRtKTsKLQkJc3BpbiArPSBkdG07Ci0KLQkJaWYgKCAoZ2NudCA9PSAxICYmIGdvdF9wb2ludGVyX2lucHV0ID4gZykgfHwgdG0tdGMgPiAyKmR0X21pbikgewotCQkJdGlsZV9kaWZmcyA9IHNjYW5fZm9yX3VwZGF0ZXMoMSk7Ci0JCQl0YyA9IHRtOwotCQl9Ci0KLQkJaWYgKGdvdF9wb2ludGVyX2lucHV0ID09IGcpIHsKLQkJCWlmIChsYXN0X3dhc19taXNzKSB7Ci0JCQkJY29uc2VjdXRpdmVfbWlzc2VzKys7Ci0JCQl9Ci0JCQlsYXN0X3dhc19taXNzID0gMTsKLQkJfSBlbHNlIHsKLQkJCWdpbnB1dCsrOwotCQkJY29uc2VjdXRpdmVfbWlzc2VzID0gMTsKLQkJCWxhc3Rfd2FzX21pc3MgPSAwOwotCQl9Ci0KLQkJaWYgKHRpbGVfZGlmZnMgPiBtaW5fZnJhbWVfc2l6ZSAmJiBzcGluID4gVHRpbGUgKiB0aWxlX2RpZmZzICsgVGRlbGF5KSB7Ci0JCQkvKiB3ZSB0aGluayB3ZSBjYW4gcHVzaCB0aGUgZnJhbWUgKi8KLQkJCXB1c2hfZnJhbWUgPSAxOwotCQkJZmJfdXBkYXRlX3NlbnQoJnVwZGF0ZV9jb3VudCk7Ci0JCQlicmVhazsKLQotCQl9IGVsc2UgaWYgKGdvdF9wb2ludGVyX2lucHV0ID4gZykgewotCQkJLyogcmVjZWl2ZWQgc29tZSBpbnB1dCwgZmx1c2ggaXQgdG8gZGlzcGxheS4gKi8KLQkJCWdvdF9pbnB1dCA9IDE7Ci0JCQlnID0gZ290X3BvaW50ZXJfaW5wdXQ7Ci0JCQlYX0xPQ0s7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCVhfVU5MT0NLOwotCi0JCX0gZWxzZSBpZiAoY29uc2VjdXRpdmVfbWlzc2VzID49IDIpIHsKLQkJCS8qIHRvbyBtYW55IG1pc3NlcyBpbiBhIHJvdyAqLwotCQkJYnJlYWs7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIHRoZXNlIGFyZSBwb2ludGVyIGlucHV0IG1pc3NlcyAqLwotCQkJaW50IHdtczsKLQkJCWlmIChnY250ID09IDEgJiYgYnV0dG9uX21hc2spIHsKLQkJCQkvKgotCQkJCSAqIG1pc3NlZCBvdXIgZmlyc3QgaW5wdXQsIHdhaXQgZm9yCi0JCQkJICogYSBkZWZlciB0aW1lLiAoZS5nLiBvbiBzbG93IGxpbmspCi0JCQkJICogaG9wZWZ1bGx5IGNsaWVudCB3aWxsIGJhdGNoIG1hbnkKLQkJCQkgKiBvZiB0aGVtIGZvciB0aGUgbmV4dCByZWFkLgotCQkJCSAqLwotCQkJCXdtcyA9IDUwOwotCi0JCQl9IGVsc2UgaWYgKGJ1dHRvbl9tYXNrKSB7Ci0JCQkJd21zID0gMTA7Ci0JCQl9IGVsc2UgewotCQkJCXdtcyA9IDA7Ci0JCQl9Ci0JCQlpZiAod21zKSB7Ci0JCQkJdXNsZWVwKHdtcyAqIDEwMDApOwotCQkJfQotCQl9Ci0JfQotCWlmIChnaW5wdXQgPj0gMikgewotCQkvKiB0cnkgZm9yIGEgY291cGxlIG1vcmUgcXVpY2sgb25lcyAqLwotCQlmb3IgKGk9MDsgaTwyOyBpKyspIHsKLQkJCXJmYkNGRChyZmJfd2FpdF9tcyAqIDEwMDApOwotCQl9Ci0JfQotCWRyYWdfaW5fcHJvZ3Jlc3MgPSAwOwotfQotCi1pbnQgY2hlY2tfdXNlcl9pbnB1dChkb3VibGUgZHQsIGRvdWJsZSBkdHIsIGludCB0aWxlX2RpZmZzLCBpbnQgKmNudCkgewotCi0JaWYgKHJhd2ZiX3ZuY19yZWZsZWN0KSB7Ci0JCWlmIChnb3RfdXNlcl9pbnB1dCkgewotCQkJaWYgKDApIHZuY19yZWZsZWN0X3Byb2Nlc3NfY2xpZW50KCk7Ci0JCX0KLQkJaWYgKGdvdF91c2VyX2lucHV0ICYmICpjbnQgJSB1aV9za2lwICE9IDApIHsKLQkJCS8qIGV2ZXJ5IG4tdGggZHJvcHMgdGhydSB0byBzY2FuICovCi0JCQkqY250ID0gKmNudCArIDE7Ci0JCQlyZXR1cm4gMTsJLyogc2hvcnQgY2lyY3VpdCB3YXRjaF9sb29wICovCi0JCX0KLQl9Ci0jaWZkZWYgTUFDT1NYCi0JaWYgKCEgbWFjb3N4X2NvbnNvbGUpIHsKLQkJUkFXRkJfUkVUKDApCi0JfQotI2Vsc2UKLQlSQVdGQl9SRVQoMCkKLSNlbmRpZgotCi0JaWYgKHVzZV94cmVjb3JkKSB7Ci0JCWludCByYyA9IGNoZWNrX3hyZWNvcmQoKTsKLQkJLyoKLQkJICogMDogbm90aGluZyBmb3VuZCwgcHJvY2VlZCB0byBvdGhlciB1c2VyIGlucHV0IHNjaGVtZXMuCi0JCSAqIDE6IGV2ZW50cyBmb3VuZCwgd2FudCB0byBkbyBhIHNjcmVlbiB1cGRhdGUgbm93LgotCQkgKiAyOiBldmVudHMgZm91bmQsIHdhbnQgdG8gbG9vcCBiYWNrIGZvciBzb21lIG1vcmUuCi0JCSAqIDM6IGV2ZW50cyBmb3VuZCwgd2FudCB0byBsb29wIGJhY2sgZm9yIHNvbWUgbW9yZSwKLQkJICogICAgYW5kIG5vdCBoYXZlIHJmYlBFKCkgY2FsbGVkLgotCQkgKgotCQkgKiBGb3IgMCwgd2UgcHJlY2VkZSBiZWxvdywgb3RoZXJ3aXNlIHJldHVybiByYy0xLgotCQkgKi8KLWlmIChkZWJ1Z19zY3JvbGwgJiYgcmMgPiAxKSBmcHJpbnRmKHN0ZGVyciwgIiAgQ1hSOiBjaGVja191c2VyX2lucHV0IHJldCAlZFxuIiwgcmMgLSAxKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCTsJLyogcHJvY2VlZCBiZWxvdy4gKi8KLQkJfSBlbHNlIHsKLQkJCXJldHVybiByYyAtIDE7Ci0JCX0KLQl9Ci0KLQlpZiAod2lyZWZyYW1lKSB7Ci0JCWlmIChjaGVja193aXJlZnJhbWUoKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAocG9pbnRlcl9tb2RlID09IDEpIHsKLQkJaWYgKChnb3RfdXNlcl9pbnB1dCB8fCB1aV9za2lwIDwgMCkgJiYgKmNudCAlIHVpX3NraXAgIT0gMCkgewotCQkJLyogZXZlcnkgdWlfc2tpcC10aCBkcm9wcyB0aHJ1IHRvIHNjYW4gKi8KLQkJCSpjbnQgPSAqY250ICsgMTsKLQkJCVhfTE9DSzsKLQkJCVhGbHVzaF93cihkcHkpOwotCQkJWF9VTkxPQ0s7Ci0JCQlyZXR1cm4gMTsJLyogc2hvcnQgY2lyY3VpdCB3YXRjaF9sb29wICovCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAocG9pbnRlcl9tb2RlID49IDIgJiYgcG9pbnRlcl9tb2RlIDw9IDQpIHsKLQkJaWYgKGdvdF9rZXlib2FyZF9pbnB1dCkgewotCQkJLyoKLQkJCSAqIGZvciB0aGVzZSBtb2Rlcywgc2hvcnQgY2lyY3VpdCB3YXRjaF9sb29wIG9uCi0JCQkgKiAqa2V5Ym9hcmQqIGlucHV0LgotCQkJICovCi0JCQlpZiAoKmNudCAlIHVpX3NraXAgIT0gMCkgewotCQkJCSpjbnQgPSAqY250ICsgMTsgCi0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJLyogb3RoZXJ3aXNlIGNvbnRpbnVlIGJlbG93IHdpdGggcG9pbnRlciBpbnB1dCBtZXRob2QgKi8KLQl9Ci0KLQlpZiAocG9pbnRlcl9tb2RlID09IDIpIHsKLQkJY2hlY2tfdXNlcl9pbnB1dDIoZHQpOwotCX0gZWxzZSBpZiAocG9pbnRlcl9tb2RlID09IDMpIHsKLQkJY2hlY2tfdXNlcl9pbnB1dDMoZHQsIGR0ciwgdGlsZV9kaWZmcyk7Ci0JfSBlbHNlIGlmIChwb2ludGVyX21vZGUgPT0gNCkgewotCQljaGVja191c2VyX2lucHV0NChkdCwgZHRyLCB0aWxlX2RpZmZzKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKE5PX05DQUNIRSkgfHwgKE5PX1gxMSAmJiAhZGVmaW5lZChNQUNPU1gpKQotaW50IGNoZWNrX25jYWNoZShpbnQgYSwgaW50IGIpIHsKLQlpZiAoIWEgfHwgIWIpIHt9Ci0JbmNhY2hlID0gMDsKLQlyZXR1cm4gMDsKLX0KLWludCBsb29rdXBfd2luX2luZGV4KFdpbmRvdyB3aW4pIHsKLQlpZiAoIXdpbikge30KLQlyZXR1cm4gLTE7Ci19Ci1pbnQgZmluZF9yZWN0KGludCBpZHgsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0JaWYgKCFpZHggfHwgIXggfHwgIXkgfHwgIXcgfHwgIWgpIHt9Ci0JcmV0dXJuIDA7Ci19Ci12b2lkIHNuYXBfb2xkKHZvaWQpIHsKLQlyZXR1cm47Ci19Ci1pbnQgY2xpcHBlZChpbnQgaWR4KSB7Ci0JaWYgKCFpZHgpIHt9Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgYnNfcmVzdG9yZShpbnQgaWR4LCBpbnQgKm5iYXRjaCwgc3JhUmVnaW9uUHRyIHJtYXNrLCBYV2luZG93QXR0cmlidXRlcyAqYXR0ciwgaW50IGNsaXAsIGludCBub3BhZCwgaW50ICp2YWxpZCwgaW50IHZlcmIpIHsKLQlpZiAoIWlkeCB8fCAhbmJhdGNoIHx8ICFybWFzayB8fCAhYXR0ciB8fCAhY2xpcCB8fCAhbm9wYWQgfHwgIXZhbGlkIHx8ICF2ZXJiKSB7fQotCXJldHVybiAwOwotfQotaW50IHRyeV90b19maXhfc3UoV2luZG93IHdpbiwgaW50IGlkeCwgV2luZG93IGFib3ZlLCBpbnQgKm5iYXRjaCwgY2hhciAqbW9kZSkgewotCWlmICghd2luIHx8ICFpZHggfHwgIWFib3ZlIHx8ICFuYmF0Y2ggfHwgIW1vZGUpIHt9Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgdHJ5X3RvX2ZpeF9yZXNpemVfc3UoV2luZG93IG9yaWdfZnJhbWUsIGludCBvcmlnX3gsIGludCBvcmlnX3ksIGludCBvcmlnX3csIGludCBvcmlnX2gsCi0gICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCB0cnlfYmF0Y2gpIHsKLQlpZiAoIW9yaWdfZnJhbWUgfHwgIW9yaWdfeCB8fCAhb3JpZ195IHx8ICFvcmlnX3cgfHwgIW9yaWdfaCB8fCAheCB8fCAheSB8fCAhdyB8fCAhaCB8fCAhdHJ5X2JhdGNoKSB7fQotCXJldHVybiAwOwotfQotdm9pZCBzZXRfbmNhY2hlX3hyb290cG1hcCh2b2lkKSB7Ci0JcmV0dXJuOwotfQotI2Vsc2UKLS8qIG1heWJlIG5jYWNoZS5jIGl0IGlmIHdvcmtzICovCi0KLXdpbmF0dHJfdCogY2FjaGVfbGlzdCA9IE5VTEw7Ci1pbnQgY2FjaGVfbGlzdF9udW0gPSAwOwotaW50IGNhY2hlX2xpc3RfbGVuID0gMDsKLQotdm9pZCBzbmFwc2hvdF9jYWNoZV9saXN0KGludCBmcmVlX29ubHksIGRvdWJsZSBhbGxvd2VkX2FnZSkgewotCXN0YXRpYyBkb3VibGUgbGFzdF9zbmFwID0gMC4wLCBsYXN0X2ZyZWUgPSAwLjA7Ci0JZG91YmxlIG5vdzsgCi0JaW50IG51bSwgcmMsIGk7Ci0JdW5zaWduZWQgaW50IHVpOwotCVdpbmRvdyByLCB3OwotCVdpbmRvdyAqbGlzdDsKLQlpbnQgc3RhcnQgPSA1MTI7Ci0KLQlpZiAoISBjYWNoZV9saXN0KSB7Ci0JCWNhY2hlX2xpc3QgPSAod2luYXR0cl90ICopIGNhbGxvYyhzdGFydCpzaXplb2Yod2luYXR0cl90KSwgMSk7Ci0JCWNhY2hlX2xpc3RfbnVtID0gMDsKLQkJY2FjaGVfbGlzdF9sZW4gPSBzdGFydDsKLQl9Ci0KLQlkdGltZTAoJm5vdyk7Ci0JaWYgKGZyZWVfb25seSkgewotCQkvKiB3ZSByZWFsbHkgZG9uJ3QgZnJlZSBpdCwganVzdCByZXNldCB0byB6ZXJvIHdpbmRvd3MgKi8KLQkJY2FjaGVfbGlzdF9udW0gPSAwOwotCQlsYXN0X2ZyZWUgPSBub3c7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY2FjaGVfbGlzdF9udW0gJiYgbm93IDwgbGFzdF9zbmFwICsgYWxsb3dlZF9hZ2UpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNhY2hlX2xpc3RfbnVtID0gMDsKLQlsYXN0X2ZyZWUgPSBub3c7Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAoISBtYWNvc3hfY29uc29sZSkgewotCQlSQVdGQl9SRVRfVk9JRAotCX0KLSNlbHNlCi0JUkFXRkJfUkVUX1ZPSUQKLSNlbmRpZgotCi0KLSNpZiBOT19YMTEgJiYgIWRlZmluZWQoTUFDT1NYKQotCW51bSA9IHJjID0gaSA9IDA7CS8qIGNvbXBpbGVyIHdhcm5pbmdzICovCi0JdWkgPSAwOwotCXIgPSB3ID0gTm9uZTsKLQlsaXN0ID0gTlVMTDsKLQlyZXR1cm47Ci0jZWxzZQotCi0JWF9MT0NLOwotCS8qIG5vIG5lZWQgdG8gdHJhcCBlcnJvciBzaW5jZSByb290d2luICovCi0JcmMgPSBYUXVlcnlUcmVlX3dyKGRweSwgcm9vdHdpbiwgJnIsICZ3LCAmbGlzdCwgJnVpKTsKLQlYX1VOTE9DSzsKLQludW0gPSAoaW50KSB1aTsKLQotCWlmICghIHJjKSB7Ci0JCWNhY2hlX2xpc3RfbnVtID0gMDsKLQkJbGFzdF9mcmVlID0gbm93OwotCQlsYXN0X3NuYXAgPSAwLjA7Ci0JCXJldHVybjsKLQl9Ci0KLQlsYXN0X3NuYXAgPSBub3c7Ci0JaWYgKG51bSA+IGNhY2hlX2xpc3RfbGVuKSB7Ci0JCWludCBuID0gMipudW07Ci0JCW4gPSBudW0gKyAzOwotCQlmcmVlKGNhY2hlX2xpc3QpOwotCQljYWNoZV9saXN0ID0gKHdpbmF0dHJfdCAqKSBjYWxsb2MobipzaXplb2Yod2luYXR0cl90KSwgMSk7Ci0JCWNhY2hlX2xpc3RfbGVuID0gbjsKLQl9Ci0JZm9yIChpPTA7IGk8bnVtOyBpKyspIHsKLQkJY2FjaGVfbGlzdFtpXS53aW4gPSBsaXN0W2ldOwotCQljYWNoZV9saXN0W2ldLmZldGNoZWQgPSAwOwotCQljYWNoZV9saXN0W2ldLnZhbGlkID0gMDsKLQkJY2FjaGVfbGlzdFtpXS50aW1lID0gbm93OwotCQljYWNoZV9saXN0W2ldLnNlbGVjdGlucHV0ID0gMDsKLQkJY2FjaGVfbGlzdFtpXS52aXNfY250ID0gMDsKLQkJY2FjaGVfbGlzdFtpXS5tYXBfY250ID0gMDsKLQkJY2FjaGVfbGlzdFtpXS51bm1hcF9jbnQgPSAwOwotCQljYWNoZV9saXN0W2ldLmNyZWF0ZV9jbnQgPSAwOwotCQljYWNoZV9saXN0W2ldLnZpc19zdGF0ZSA9IC0xOwotCQljYWNoZV9saXN0W2ldLmFib3ZlID0gTm9uZTsKLQl9Ci0JaWYgKG51bSA9PSAwKSB7Ci0JCWNhY2hlX2xpc3RbMF0ud2luID0gTm9uZTsKLQkJY2FjaGVfbGlzdFswXS5mZXRjaGVkID0gMDsKLQkJY2FjaGVfbGlzdFswXS52YWxpZCA9IDA7Ci0JCWNhY2hlX2xpc3RbMF0udGltZSA9IG5vdzsKLQkJY2FjaGVfbGlzdFswXS5zZWxlY3RpbnB1dCA9IDA7Ci0JCWNhY2hlX2xpc3RbMF0udmlzX2NudCA9IDA7Ci0JCWNhY2hlX2xpc3RbMF0ubWFwX2NudCA9IDA7Ci0JCWNhY2hlX2xpc3RbMF0udW5tYXBfY250ID0gMDsKLQkJY2FjaGVfbGlzdFswXS5jcmVhdGVfY250ID0gMDsKLQkJY2FjaGVfbGlzdFswXS52aXNfc3RhdGUgPSAtMTsKLQkJY2FjaGVfbGlzdFswXS5hYm92ZSA9IE5vbmU7Ci0JCW51bSsrOwotCX0KLQotCWNhY2hlX2xpc3RfbnVtID0gbnVtOwotCi0JaWYgKG51bSkgewotCQlYX0xPQ0s7Ci0JCVhGcmVlX3dyKGxpc3QpOwotCQlYX1VOTE9DSzsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgcXVpY2tfc25hcChXaW5kb3cgKndpbnMsIGludCAqc2l6ZSkgewotCWludCBudW0sIHJjLCBpOwotCXVuc2lnbmVkIGludCB1aTsKLQlXaW5kb3cgciwgdzsKLQlXaW5kb3cgKmxpc3Q7Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAoMSB8fCAhIG1hY29zeF9jb25zb2xlKSB7Ci0JCVJBV0ZCX1JFVF9WT0lECi0JfQotI2Vsc2UKLQlSQVdGQl9SRVRfVk9JRAotI2VuZGlmCi0KLQotI2lmIE5PX1gxMSAmJiAhZGVmaW5lZChNQUNPU1gpCi0JbnVtID0gcmMgPSBpID0gMDsJLyogY29tcGlsZXIgd2FybmluZ3MgKi8KLQl1aSA9IDA7Ci0JciA9IHcgPSBOb25lOwotCWxpc3QgPSBOVUxMOwotCXJldHVybjsKLSNlbHNlCi0KLQlYX0xPQ0s7Ci0JLyogbm8gbmVlZCB0byB0cmFwIGVycm9yIHNpbmNlIHJvb3R3aW4gKi8KLQlyYyA9IFhRdWVyeVRyZWVfd3IoZHB5LCByb290d2luLCAmciwgJncsICZsaXN0LCAmdWkpOwotCVhfVU5MT0NLOwotCW51bSA9IChpbnQpIHVpOwotCi0JaWYgKCEgcmMgfHwgbnVtID09IDApIHsKLQkJKnNpemUgPSAwOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJaW50IG0gPSAqc2l6ZTsKLQkJaWYgKG51bSA8IG0pIHsKLQkJCW0gPSBudW07Ci0JCX0KLQkJZm9yIChpPTA7IGkgPCBtOyBpKyspIHsKLQkJCXdpbnNbaV0gPSBsaXN0W2ldOwotCQl9Ci0JCWlmIChudW0pIHsKLQkJCVhfTE9DSzsKLQkJCVhGcmVlX3dyKGxpc3QpOwotCQkJWF9VTkxPQ0s7Ci0JCX0KLQkJKnNpemUgPSBtOwotCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotaW50IGdldF9ic19uKGludCB5KSB7Ci0JaW50IG47Ci0JZm9yIChuID0gMTsgbiA8IG5jYWNoZTsgbiArPSAyKSB7Ci0JCWlmIChuKmRweV95IDw9IHkgJiYgeSA8IChuKzEpKmRweV95KSB7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLSNkZWZpbmUgTlJFQ0VOVCAzMgotV2luZG93IHJlY2VudFtOUkVDRU5UXTsKLWludCAgICByZWNpZHhbTlJFQ0VOVF07Ci1pbnQgcmxhc3QsIHJmcmVlOwotCi1pbnQgbG9va3VwX3dpbl9pbmRleChXaW5kb3cgd2luKSB7Ci0JaW50IGssIGlkeCA9IC0xOwotCWludCBmb3VuZGZyZWUgPSAwOwotCXN0YXRpYyBpbnQgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsKLQotCWlmICh3aW4gPT0gcm9vdHdpbiB8fCB3aW4gPT0gTm9uZSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoayA9IDA7IGsgPCBOUkVDRU5UOyBrKyspIHsKLQkJaWYgKHJlY2VudFtrXSA9PSB3aW4pIHsKLQkJCWludCBrMiA9IHJlY2lkeFtrXTsKLQkJCWlmIChjYWNoZV9saXN0W2syXS53aW4gPT0gd2luKSB7Ci0JCQkJaWR4ID0gazI7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJyZWNlbnRBKHNob3J0Y3V0KTogJWQgIDB4JWx4XG4iLCBpZHgsIHdpbik7Ci0JCQkJczErKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaWR4IDwgMCkgewotCQlmb3Ioaz0wOyBrPGNhY2hlX2xpc3RfbnVtOyBrKyspIHsKLQkJCWlmICghZm91bmRmcmVlICYmIGNhY2hlX2xpc3Rba10ud2luID09IE5vbmUpIHsKLQkJCQlyZnJlZSA9IGs7Ci0JCQkJZm91bmRmcmVlID0gMTsKLQkJCX0KLQkJCWlmIChjYWNoZV9saXN0W2tdLndpbiA9PSB3aW4pIHsKLQkJCQlpZHggPSBrOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAicmVjZW50Qihub3JtYWwpOiAlZCAgMHglbHhcbiIsIGlkeCwgd2luKTsKLQkJCQlzMisrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpZHggPj0gMCkgewotCQkJcmVjZW50W3JsYXN0XSA9IHdpbjsKLQkJCXJlY2lkeFtybGFzdCsrXSA9IGlkeDsKLQkJCXJsYXN0ID0gcmxhc3QgJSBOUkVDRU5UOwotCQl9Ci0JfQotCWlmIChpZHggPCAwKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJyZWNlbnRDKGZhaWwpOiAlZCAgMHglbHhcbiIsIGlkeCwgd2luKTsKLQkJczMrKzsKLQl9Ci0JaWYgKHMxICsgczIgKyBzMyA+PSAxMDAwKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJsb29rdXBfd2luX2luZGV4IHJlY2VudCBoaXQgc3RhdHM6ICVkLyVkLyVkXG4iLCBzMSwgczIsIHMzKTsKLQkJczEgPSBzMiA9IHMzID0gMDsKLQl9Ci0JcmV0dXJuIGlkeDsKLX0KLQotaW50IGxvb2t1cF9mcmVlX2luZGV4KHZvaWQpIHsKLQlpbnQgazsKLQotCWlmIChyZnJlZSA+PSAwKSB7Ci0JCWlmIChjYWNoZV9saXN0W3JmcmVlXS53aW4gPT0gTm9uZSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAibG9va3VwX2ZyZWVBOiAlZFxuIiwgcmZyZWUpOwotCQkJcmV0dXJuIHJmcmVlOwotCQl9Ci0JfQotCXJmcmVlID0gLTE7Ci0JZm9yKGs9MDsgazxjYWNoZV9saXN0X251bTsgaysrKSB7Ci0JCWlmIChjYWNoZV9saXN0W2tdLndpbiA9PSBOb25lKSB7Ci0JCQlyZnJlZSA9IGs7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocmZyZWUgPCAwKSB7Ci0JCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIioqKiBMT09LVVBfRlJFRV9JTkRFWDogaW5jcmVtZW50aW5nIGNhY2hlX2xpc3RfbnVtICVkLyVkXG4iLCBjYWNoZV9saXN0X251bSwgY2FjaGVfbGlzdF9sZW4pOwotCi0JCXJmcmVlID0gY2FjaGVfbGlzdF9udW0rKzsKLQkJaWYgKHJmcmVlID49IGNhY2hlX2xpc3RfbGVuKSAgewotCQkJaW50IGksIG4gPSAyKmNhY2hlX2xpc3RfbGVuOwotCQkJd2luYXR0cl90ICpjYWNoZV9uZXc7Ci0KLQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgImxvb2t1cF9mcmVlX2luZGV4OiBncm93aW5nIGNhY2hlX2xpc3RfbGVuOiAlZCAtPiAlZFxuIiwgY2FjaGVfbGlzdF9sZW4sIG4pOwotCi0JCQljYWNoZV9uZXcgPSAod2luYXR0cl90ICopIGNhbGxvYyhuKnNpemVvZih3aW5hdHRyX3QpLCAxKTsKLQkJCWZvciAoaT0wOyBpPGNhY2hlX2xpc3RfbnVtLTE7IGkrKykgewotCQkJCWNhY2hlX25ld1tpXSA9IGNhY2hlX2xpc3RbaV07IAotCQkJfQotCQkJY2FjaGVfbGlzdF9sZW4gPSBuOwotCQkJZnJlZShjYWNoZV9saXN0KTsKLQkJCWNhY2hlX2xpc3QgPSBjYWNoZV9uZXc7Ci0JCX0KLQkJY2FjaGVfbGlzdFtyZnJlZV0ud2luID0gTm9uZTsKLQkJY2FjaGVfbGlzdFtyZnJlZV0uZmV0Y2hlZCA9IDA7Ci0JCWNhY2hlX2xpc3RbcmZyZWVdLnZhbGlkID0gMDsKLQkJY2FjaGVfbGlzdFtyZnJlZV0udGltZSA9IDAuMDsKLQkJY2FjaGVfbGlzdFtyZnJlZV0uc2VsZWN0aW5wdXQgPSAwOwotCQljYWNoZV9saXN0W3JmcmVlXS52aXNfY250ID0gMDsKLQkJY2FjaGVfbGlzdFtyZnJlZV0ubWFwX2NudCA9IDA7Ci0JCWNhY2hlX2xpc3RbcmZyZWVdLnVubWFwX2NudCA9IDA7Ci0JCWNhY2hlX2xpc3RbcmZyZWVdLmNyZWF0ZV9jbnQgPSAwOwotCQljYWNoZV9saXN0W3JmcmVlXS52aXNfc3RhdGUgPSAtMTsKLQkJY2FjaGVfbGlzdFtyZnJlZV0uYWJvdmUgPSBOb25lOwotCX0KLQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAibG9va3VwX2ZyZWVCOiAlZFxuIiwgcmZyZWUpOwotCXJldHVybiByZnJlZTsKLX0KLQotI2RlZmluZSBTVEFDS01BWCA0MDk2Ci1XaW5kb3cgb2xkX3N0YWNrW1NUQUNLTUFYXTsKLVdpbmRvdyBuZXdfc3RhY2tbU1RBQ0tNQVhdOwotV2luZG93IG9sZF9zdGFja19tYXBbU1RBQ0tNQVhdOwotV2luZG93IG5ld19zdGFja19tYXBbU1RBQ0tNQVhdOwotaW50IG9sZF9zdGFja19pbmRleFtTVEFDS01BWF07Ci1pbnQgb2xkX3N0YWNrX21hcHBlZFtTVEFDS01BWF07Ci1pbnQgb2xkX3N0YWNrX24gPSAwOwotaW50IG5ld19zdGFja19uID0gMDsKLWludCBvbGRfc3RhY2tfbWFwX24gPSAwOwotaW50IG5ld19zdGFja19tYXBfbiA9IDA7Ci0KLXZvaWQgc25hcF9vbGQodm9pZCkgewotCWludCBpOwotCW9sZF9zdGFja19uID0gU1RBQ0tNQVg7Ci0JcXVpY2tfc25hcChvbGRfc3RhY2ssICZvbGRfc3RhY2tfbik7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJzbmFwX29sZDogJWQgICUuNGZcbiIsIG9sZF9zdGFja19uLCBkbm93eCgpKTsKLSNpZiAwCi0JZm9yIChpPSBvbGRfc3RhY2tfbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWludCBpZHggPSBsb29rdXBfd2luX2luZGV4KG9sZF9zdGFja1tpXSk7Ci0JCWlmIChpZHggPj0gMCkgewotCQkJaWYgKGNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgPT0gSXNWaWV3YWJsZSkgewotCQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIiAgICUwM2QgIDB4JXhcbiIsIGksIG9sZF9zdGFja1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQlmb3IgKGk9MDsgaSA8IG9sZF9zdGFja19uOyBpKyspIHsKLQkJb2xkX3N0YWNrX21hcHBlZFtpXSA9IC0xOwotCX0KLX0KLQotdm9pZCBzbmFwX29sZF9pbmRleCh2b2lkKSB7Ci0JaW50IGksIGlkeDsKLQlmb3IgKGk9MDsgaSA8IG9sZF9zdGFja19uOyBpKyspIHsKLQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleChvbGRfc3RhY2tbaV0pOwotCQlvbGRfc3RhY2tfaW5kZXhbaV0gPSBpZHg7Ci0JCWlmIChpZHggPj0gMCkgewotCQkJaWYgKGNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgPT0gSXNWaWV3YWJsZSkgewotCQkJCW9sZF9zdGFja19tYXBwZWRbaV0gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRfc3RhY2tfbWFwcGVkW2ldID0gMDsKLQkJCX0KLQkJfQotCX0KLX0KLQotaW50IGxvb2t1cF9vbGRfc3RhY2tfaW5kZXgoaW50IGljKSB7Ci0JaW50IGlkeCA9IG9sZF9zdGFja19pbmRleFtpY107Ci0KLQlpZiAoaWR4IDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjYWNoZV9saXN0W2lkeF0ud2luICE9IG9sZF9zdGFja1tpY10pIHsKLQkJc25hcF9vbGRfaW5kZXgoKTsKLQl9Ci0JaWR4ID0gb2xkX3N0YWNrX2luZGV4W2ljXTsKLQlpZiAoaWR4IDwgMCB8fCBjYWNoZV9saXN0W2lkeF0ud2luICE9IG9sZF9zdGFja1tpY10pIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoY2FjaGVfbGlzdFtpZHhdLm1hcF9zdGF0ZSA9PSBJc1ZpZXdhYmxlKSB7Ci0JCW9sZF9zdGFja19tYXBwZWRbaWNdID0gMTsKLQl9IGVsc2UgewotCQlvbGRfc3RhY2tfbWFwcGVkW2ljXSA9IDA7Ci0JfQotCXJldHVybiBpZHg7Ci19Ci0KLSNkZWZpbmUgU1RPUkUoaywgdywgYXR0cikgXAotCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlNUT1JFKCVkKSA9IDB4JWx4XG4iLCBrLCB3KTsgXAotCWNhY2hlX2xpc3Rba10ud2luID0gdzsgIFwKLQljYWNoZV9saXN0W2tdLmZldGNoZWQgPSAxOyAgXAotCWNhY2hlX2xpc3Rba10udmFsaWQgPSAxOyAgXAotCWNhY2hlX2xpc3Rba10ueCA9IGF0dHIueDsgIFwKLQljYWNoZV9saXN0W2tdLnkgPSBhdHRyLnk7ICBcCi0JY2FjaGVfbGlzdFtrXS53aWR0aCA9IGF0dHIud2lkdGg7ICBcCi0JY2FjaGVfbGlzdFtrXS5oZWlnaHQgPSBhdHRyLmhlaWdodDsgIFwKLQljYWNoZV9saXN0W2tdLmJvcmRlcl93aWR0aCA9IGF0dHIuYm9yZGVyX3dpZHRoOyAgXAotCWNhY2hlX2xpc3Rba10ubWFwX3N0YXRlID0gYXR0ci5tYXBfc3RhdGU7IFwKLQljYWNoZV9saXN0W2tdLnRpbWUgPSBkbm93KCk7Ci0KLSNpZiAwCi0JY2FjaGVfbGlzdFtrXS53aWR0aCA9IGF0dHIud2lkdGggICArIDIqYXR0ci5ib3JkZXJfd2lkdGg7ICBcCi0JY2FjaGVfbGlzdFtrXS5oZWlnaHQgPSBhdHRyLmhlaWdodCArIDIqYXR0ci5ib3JkZXJfd2lkdGg7ICBcCi0KLSNlbmRpZgotCi0jZGVmaW5lIENMRUFSKGspIFwKLQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJDTEVBUiglZClcbiIsIGspOyBcCi0JY2FjaGVfbGlzdFtrXS5ic194ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5ic195ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5ic193ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5ic19oID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5zdV94ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5zdV95ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5zdV93ID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS5zdV9oID0gLTE7ICBcCi0JY2FjaGVfbGlzdFtrXS50aW1lID0gMC4wOyAgXAotCWNhY2hlX2xpc3Rba10uYnNfdGltZSA9IDAuMDsgIFwKLQljYWNoZV9saXN0W2tdLnN1X3RpbWUgPSAwLjA7ICBcCi0JY2FjaGVfbGlzdFtrXS52aXNfb2JzX3RpbWUgPSAwLjA7ICBcCi0JY2FjaGVfbGlzdFtrXS52aXNfdW5vYnNfdGltZSA9IDAuMDsKLQotI2RlZmluZSBERUxFVEUoaykgXAotCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIkRFTEVURSglZCkgPSAweCVseFxuIiwgaywgY2FjaGVfbGlzdFtrXS53aW4pOyBcCi0JY2FjaGVfbGlzdFtrXS53aW4gPSBOb25lOyAgXAotCWNhY2hlX2xpc3Rba10uZmV0Y2hlZCA9IDA7ICBcCi0JY2FjaGVfbGlzdFtrXS52YWxpZCA9IDA7IFwKLQljYWNoZV9saXN0W2tdLnNlbGVjdGlucHV0ID0gMDsgXAotCWNhY2hlX2xpc3Rba10udmlzX2NudCA9IDA7IFwKLQljYWNoZV9saXN0W2tdLm1hcF9jbnQgPSAwOyBcCi0JY2FjaGVfbGlzdFtrXS51bm1hcF9jbnQgPSAwOyBcCi0JY2FjaGVfbGlzdFtrXS5jcmVhdGVfY250ID0gMDsgXAotCWNhY2hlX2xpc3Rba10udmlzX3N0YXRlID0gLTE7IFwKLQljYWNoZV9saXN0W2tdLmFib3ZlID0gTm9uZTsgXAotCWZyZWVfcmVjdChrKTsJLyogZG9lcyBDTEVBUihrKSAqLwotCi1zdGF0aWMJY2hhciB1bmtbMzJdOwotCi1jaGFyICpFdHlwZShpbnQgdHlwZSkgewotCWlmICh0eXBlID09IEtleVByZXNzKQkJcmV0dXJuICJLZXlQcmVzcyI7Ci0JaWYgKHR5cGUgPT0gS2V5UmVsZWFzZSkJCXJldHVybiAiS2V5UmVsZWFzZSI7Ci0JaWYgKHR5cGUgPT0gQnV0dG9uUHJlc3MpCXJldHVybiAiQnV0dG9uUHJlc3MiOwotCWlmICh0eXBlID09IEJ1dHRvblJlbGVhc2UpCXJldHVybiAiQnV0dG9uUmVsZWFzZSI7Ci0JaWYgKHR5cGUgPT0gTW90aW9uTm90aWZ5KQlyZXR1cm4gIk1vdGlvbk5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gRW50ZXJOb3RpZnkpCXJldHVybiAiRW50ZXJOb3RpZnkiOwotCWlmICh0eXBlID09IExlYXZlTm90aWZ5KQlyZXR1cm4gIkxlYXZlTm90aWZ5IjsKLQlpZiAodHlwZSA9PSBGb2N1c0luKQkJcmV0dXJuICJGb2N1c0luIjsKLQlpZiAodHlwZSA9PSBGb2N1c091dCkJCXJldHVybiAiRm9jdXNPdXQiOwotCWlmICh0eXBlID09IEtleW1hcE5vdGlmeSkJcmV0dXJuICJLZXltYXBOb3RpZnkiOwotCWlmICh0eXBlID09IEV4cG9zZSkJCXJldHVybiAiRXhwb3NlIjsKLQlpZiAodHlwZSA9PSBHcmFwaGljc0V4cG9zZSkJcmV0dXJuICJHcmFwaGljc0V4cG9zZSI7Ci0JaWYgKHR5cGUgPT0gTm9FeHBvc2UpCQlyZXR1cm4gIk5vRXhwb3NlIjsKLQlpZiAodHlwZSA9PSBWaXNpYmlsaXR5Tm90aWZ5KQlyZXR1cm4gIlZpc2liaWxpdHlOb3RpZnkiOwotCWlmICh0eXBlID09IENyZWF0ZU5vdGlmeSkJcmV0dXJuICJDcmVhdGVOb3RpZnkiOwotCWlmICh0eXBlID09IERlc3Ryb3lOb3RpZnkpCXJldHVybiAiRGVzdHJveU5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gVW5tYXBOb3RpZnkpCXJldHVybiAiVW5tYXBOb3RpZnkiOwotCWlmICh0eXBlID09IE1hcE5vdGlmeSkJCXJldHVybiAiTWFwTm90aWZ5IjsKLQlpZiAodHlwZSA9PSBNYXBSZXF1ZXN0KQkJcmV0dXJuICJNYXBSZXF1ZXN0IjsKLQlpZiAodHlwZSA9PSBSZXBhcmVudE5vdGlmeSkJcmV0dXJuICJSZXBhcmVudE5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gQ29uZmlndXJlTm90aWZ5KQlyZXR1cm4gIkNvbmZpZ3VyZU5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gQ29uZmlndXJlUmVxdWVzdCkJcmV0dXJuICJDb25maWd1cmVSZXF1ZXN0IjsKLQlpZiAodHlwZSA9PSBHcmF2aXR5Tm90aWZ5KQlyZXR1cm4gIkdyYXZpdHlOb3RpZnkiOwotCWlmICh0eXBlID09IFJlc2l6ZVJlcXVlc3QpCXJldHVybiAiUmVzaXplUmVxdWVzdCI7Ci0JaWYgKHR5cGUgPT0gQ2lyY3VsYXRlTm90aWZ5KQlyZXR1cm4gIkNpcmN1bGF0ZU5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gQ2lyY3VsYXRlUmVxdWVzdCkJcmV0dXJuICJDaXJjdWxhdGVSZXF1ZXN0IjsKLQlpZiAodHlwZSA9PSBQcm9wZXJ0eU5vdGlmeSkJcmV0dXJuICJQcm9wZXJ0eU5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gU2VsZWN0aW9uQ2xlYXIpCXJldHVybiAiU2VsZWN0aW9uQ2xlYXIiOwotCWlmICh0eXBlID09IFNlbGVjdGlvblJlcXVlc3QpCXJldHVybiAiU2VsZWN0aW9uUmVxdWVzdCI7Ci0JaWYgKHR5cGUgPT0gU2VsZWN0aW9uTm90aWZ5KQlyZXR1cm4gIlNlbGVjdGlvbk5vdGlmeSI7Ci0JaWYgKHR5cGUgPT0gQ29sb3JtYXBOb3RpZnkpCXJldHVybiAiQ29sb3JtYXBOb3RpZnkiOwotCWlmICh0eXBlID09IENsaWVudE1lc3NhZ2UpCXJldHVybiAiQ2xpZW50TWVzc2FnZSI7Ci0JaWYgKHR5cGUgPT0gTWFwcGluZ05vdGlmeSkJcmV0dXJuICJNYXBwaW5nTm90aWZ5IjsKLQlpZiAodHlwZSA9PSBMQVNURXZlbnQpCQlyZXR1cm4gIkxBU1RFdmVudCI7Ci0Jc3ByaW50Zih1bmssICJVbmtub3duICVkIiwgdHlwZSk7Ci0JcmV0dXJuIHVuazsKLX0KLWNoYXIgKlZTdGF0ZShpbnQgc3RhdGUpIHsKLQlpZiAoc3RhdGUgPT0gVmlzaWJpbGl0eUZ1bGx5T2JzY3VyZWQpCQlyZXR1cm4gIlZpc2liaWxpdHlGdWxseU9ic2N1cmVkIjsKLQlpZiAoc3RhdGUgPT0gVmlzaWJpbGl0eVBhcnRpYWxseU9ic2N1cmVkKQlyZXR1cm4gIlZpc2liaWxpdHlQYXJ0aWFsbHlPYnNjdXJlZCI7Ci0JaWYgKHN0YXRlID09IFZpc2liaWxpdHlVbm9ic2N1cmVkKQkJcmV0dXJuICJWaXNpYmlsaXR5VW5vYnNjdXJlZCI7Ci0Jc3ByaW50Zih1bmssICJVbmtub3duICVkIiwgc3RhdGUpOwotCXJldHVybiB1bms7Ci19Ci1jaGFyICpNU3RhdGUoaW50IHN0YXRlKSB7Ci0JaWYgKHN0YXRlID09IElzVmlld2FibGUpCXJldHVybiAiSXNWaWV3YWJsZSI7Ci0JaWYgKHN0YXRlID09IElzVW5tYXBwZWQpCXJldHVybiAiSXNVbm1hcHBlZCI7Ci0Jc3ByaW50Zih1bmssICJVbmtub3duICVkIiwgc3RhdGUpOwotCXJldHVybiB1bms7Ci19Ci1zcmFSZWdpb25QdHIgcmVjdF9yZWdbNjRdOwotc3JhUmVnaW9uUHRyIHplcm9fcmVjdHMgPSBOVUxMOwotCi1pbnQgZnJlZV9yZWN0KGludCBpZHgpIHsKLQlpbnQgbiwgb2sgPSAwOwotCXNyYVJlZ2lvblB0ciByMSwgcjI7Ci0JaW50IHgsIHksIHcsIGg7Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gY2FjaGVfbGlzdF9udW0pIHsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImZyZWVfcmVjdDogYmFkIGluZGV4OiAlZFxuIiwgaWR4KTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQl4ID0gY2FjaGVfbGlzdFtpZHhdLmJzX3g7Ci0JeSA9IGNhY2hlX2xpc3RbaWR4XS5ic195OwotCXcgPSBjYWNoZV9saXN0W2lkeF0uYnNfdzsKLQloID0gY2FjaGVfbGlzdFtpZHhdLmJzX2g7Ci0KLQlpZiAoeCA8IDApIHsKLQkJQ0xFQVIoaWR4KTsKLWlmIChkbm93KCkgPiBsYXN0X2NsaWVudCArIDUgJiYgbmNkYikgZnByaW50ZihzdGRlcnIsICJmcmVlX3JlY3Q6IGFscmVhZHkgYnNfeCBpbnZhbGlkYXRlZDogJWQgYnNfeDogJWRcbiIsIGlkeCwgeCk7Ci0JCXJldHVybiAxOwotCX0KLQotCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4LCB5LCB4K3csIHkraCk7Ci0KLQluID0gZ2V0X2JzX24oeSk7Ci0JaWYgKG4gPj0gMCkgewotCQlyMSA9IHJlY3RfcmVnW25dOwotCQlzcmFSZ25PcihyMSwgcjIpOwotCQlvayA9IDE7Ci0JfQotCi0JaWYgKHplcm9fcmVjdHMpIHsKLQkJc3JhUmduT3IoemVyb19yZWN0cywgcjIpOwotCQl4ID0gY2FjaGVfbGlzdFtpZHhdLnN1X3g7Ci0JCXkgPSBjYWNoZV9saXN0W2lkeF0uc3VfeTsKLQkJdyA9IGNhY2hlX2xpc3RbaWR4XS5zdV93OwotCQloID0gY2FjaGVfbGlzdFtpZHhdLnN1X2g7Ci0JCWlmICh4ID49IDApIHsKLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHgrdywgeStoKTsKLQkJCXNyYVJnbk9yKHplcm9fcmVjdHMsIHIyKTsKLQkJfQotCX0KLQlzcmFSZ25EZXN0cm95KHIyKTsKLQotCUNMRUFSKGlkeCk7Ci1pZiAoISBvayAmJiBuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIioqKiogZnJlZV9yZWN0OiBub3QtZm91bmQgJWRcbiIsIGlkeCk7Ci0JcmV0dXJuIG9rOwotfQotCi1pbnQgZnJfQklHMSA9IDA7Ci1pbnQgZnJfQklHMiA9IDA7Ci1pbnQgZnJfUkVHSU9OID0gMDsKLWludCBmcl9HUklEID0gMDsKLWludCBmcl9FWFBJUkUgPSAwOwotaW50IGZyX0ZPUkNFID0gMDsKLWludCBmcl9GQUlMID0gMDsKLWludCBmcl9CSUcxdCA9IDA7Ci1pbnQgZnJfQklHMnQgPSAwOwotaW50IGZyX1JFR0lPTnQgPSAwOwotaW50IGZyX0dSSUR0ID0gMDsKLWludCBmcl9FWFBJUkV0ID0gMDsKLWludCBmcl9GT1JDRXQgPSAwOwotaW50IGZyX0ZBSUx0ID0gMDsKLQotdm9pZCBleHBpcmVfcmVjdHMxKGludCBpZHgsIGludCB3LCBpbnQgaCwgaW50ICp4X2hpdCwgaW50ICp5X2hpdCwgaW50IGJpZzEsIGludCBiaWcyLCBpbnQgY3JhbSkgewotCXNyYVJlZ2lvblB0ciByMSwgcjIsIHIzOwotCWludCB4ID0gLTEsIHkgPSAtMSwgbjsKLQotCWlmICgqeF9oaXQgPCAwKSB7Ci0JCWludCBpLCBrLCBvbGRbMTBdLCBOID0gNDsKLQkJZG91YmxlIGRvbGRbMTBdLCBmYSwgZCwgZDEsIGQyLCBkMzsKLQkJaW50IGEwID0gdyAqIGgsIGExOwotCi0JCWZvciAoaz0xOyBrPD1OOyBrKyspIHsKLQkJCW9sZFtrXSA9IC0xOwotCQkJZG9sZFtrXSA9IC0xLjA7Ci0JCX0KLQkJZm9yIChpPTA7IGk8Y2FjaGVfbGlzdF9udW07IGkrKykgewotCQkJaW50IHdiID0gY2FjaGVfbGlzdFtpXS5ic193OwotCQkJaW50IGhiID0gY2FjaGVfbGlzdFtpXS5ic19oOwotCQkJaWYgKGNhY2hlX2xpc3RbaV0uYnNfeCA8IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh3ID4gd2IgfHwgaCA+IGhiKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAod2IgPT0gMCB8fCBoYiA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYTAgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGkgPT0gaWR4KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhMSA9IHdiICogaGI7Ci0JCQlmYSA9ICgoZG91YmxlKSBhMSkgLyBhMDsKLQkJCWsgPSAoaW50KSBmYTsKLQotCQkJaWYgKGsgPCAxKSBrID0gMTsKLQkJCWlmIChrID4gTikgY29udGludWU7Ci0KLQkJCWQxID0gY2FjaGVfbGlzdFtpXS50aW1lOwotCQkJZDIgPSBjYWNoZV9saXN0W2ldLmJzX3RpbWU7Ci0JCQlkMyA9IGNhY2hlX2xpc3RbaV0uc3VfdGltZTsKLQotCQkJZCA9IGQxOwotCQkJaWYgKGQyID4gZCkgZCA9IGQyOwotCQkJaWYgKGQzID4gZCkgZCA9IGQzOwotCi0JCQlpZiAoZG9sZFtrXSA9PSAtMS4wIHx8IGQgPCBkb2xkW2tdKSB7Ci0JCQkJb2xkW2tdID0gaTsKLQkJCQlkb2xkW2tdID0gZDsKLQkJCX0KLQkJfQotCi0JCWZvciAoaz0xOyBrPD1OOyBrKyspIHsKLQkJCWlmIChvbGRba10gPj0gMCkgewotCQkJCWludCBpayA9IG9sZFtrXTsKLQkJCQlpbnQga194ID0gY2FjaGVfbGlzdFtpa10uYnNfeDsKLQkJCQlpbnQga195ID0gY2FjaGVfbGlzdFtpa10uYnNfeTsKLQkJCQlpbnQga193ID0gY2FjaGVfbGlzdFtpa10uYnNfdzsKLQkJCQlpbnQga19oID0gY2FjaGVfbGlzdFtpa10uYnNfaDsKLQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiPj4qKi0tKio+PiBmb3VuZCByZWN0IHZpYSBFWFBJUkU6ICVkIDB4JWx4IC0tICVkeCVkKyVkKyVkICVkICVkIC0tICAlZHglZCslZCslZCAgQTogJWQvJWRcbiIsCi0gICAgaWssIGNhY2hlX2xpc3RbaWtdLndpbiwgdywgaCwgeCwgeSwgKnhfaGl0LCAqeV9oaXQsIGtfdywga19oLCBrX3gsIGtfeSwga193ICoga19oLCB3ICogaCk7Ci0KLQkJCQlmcmVlX3JlY3QoaWspOwotCQkJCWZyX0VYUElSRSsrOwotCQkJCWZyX0VYUElSRXQrKzsKLQkJCQkqeF9oaXQgPSBrX3g7Ci0JCQkJKnlfaGl0ID0ga195OwotCQkJCW4gPSBnZXRfYnNfbigqeV9oaXQpOwotCQkJCWlmIChuID49IDApIHsKLQkJCQkJcjEgPSByZWN0X3JlZ1tuXTsKLQkJCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KCp4X2hpdCwgKnlfaGl0LCAqeF9oaXQgKyB3LCAqeV9oaXQgKyBoKTsKLQkJCQkJc3JhUmduU3VidHJhY3QocjEsIHIyKTsKLQkJCQkJc3JhUmduRGVzdHJveShyMik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJmYWlsdXJlIHRvIGZpbmQgeSBuIGluIGZpbmRfcmVjdFxuIik7Ci0JCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyogbmV4dCwgZm9yY2Ugb3Vyc2VsdmVzIGludG8gc29tZSBjb3JuZXIsIGV4cGlyaW5nIG1hbnkgKi8KLQlpZiAoKnhfaGl0IDwgMCkgewotCQlpbnQgY29ybmVyX3ggPSAoaW50KSAoMiAqIHJmYWMoKSk7Ci0JCWludCBjb3JuZXJfeSA9IChpbnQpICgyICogcmZhYygpKTsKLQkJaW50IHgwID0gMCwgeTAgPSAwLCBpLCBucmFuZCwgbnIgPSBuY2FjaGUvMjsKLQkJaWYgKG5yID09IDEpIHsKLQkJCW5yYW5kID0gMTsKLQkJfSBlbHNlIHsKLQkJCWlmICghIGJpZzEpIHsKLQkJCQlucmFuZCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChiaWcyICYmIG5yID4gMikgewotCQkJCQlucmFuZCA9ICAxICsgKGludCkgKChuciAtIDIpICogcmZhYygpKTsKLQkJCQkJbnJhbmQgKz0gMjsgCi0JCQkJfSBlbHNlIHsKLQkJCQkJbnJhbmQgPSAgMSArIChpbnQpICgobnIgLSAxKSAqIHJmYWMoKSk7Ci0JCQkJCW5yYW5kICs9IDE7IAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobnJhbmQgPCAwIHx8IG5yYW5kID4gbnIpIHsKLQkJCW5yYW5kID0gbnI7Ci0JCX0KLQkJaWYgKGNyYW0gJiYgYmlnMSkgewotCQkJY29ybmVyX3ggPSAxOwotCQl9Ci0KLQkJeTAgKz0gZHB5X3k7IAotCQlpZiAobnJhbmQgPiAxKSB7Ci0JCQl5MCArPSAyICogKG5yYW5kIC0gMSkgKiBkcHlfeTsgCi0JCX0KLQkJaWYgKGNvcm5lcl95KSB7Ci0JCQl5MCArPSBkcHlfeSAtIGg7IAotCQl9Ci0JCWlmIChjb3JuZXJfeCkgewotCQkJeDAgKz0gZHB5X3ggLSB3OyAKLQkJfQotCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoeDAsIHkwLCB4MCt3LCB5MCtoKTsKLQotCQlmb3IgKGk9MDsgaTxjYWNoZV9saXN0X251bTsgaSsrKSB7Ci0JCQlpbnQgeGIgPSBjYWNoZV9saXN0W2ldLmJzX3g7Ci0JCQlpbnQgeWIgPSBjYWNoZV9saXN0W2ldLmJzX3k7Ci0JCQlpbnQgd2IgPSBjYWNoZV9saXN0W2ldLmJzX3c7Ci0JCQlpbnQgaGIgPSBjYWNoZV9saXN0W2ldLmJzX2g7Ci0JCQlpZiAoeGIgPCAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobmFicyh5YiAtIHkwKSA+IGRweV95KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QoeGIsIHliLCB4Yit3YiwgeWIraGIpOwotCQkJaWYgKHNyYVJnbkFuZChyMiwgcjEpKSB7Ci0JCQkJZnJlZV9yZWN0KGkpOwotCQkJfQotCQkJc3JhUmduRGVzdHJveShyMik7Ci0JCX0KLQkJKnhfaGl0ID0geDA7Ci0JCSp5X2hpdCA9IHkwOwotCQlyMyA9IHJlY3RfcmVnWzIqbnJhbmQtMV07Ci0JCXNyYVJnblN1YnRyYWN0KHIzLCByMSk7Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCi1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICI+PioqLS0qKj4+IGZvdW5kIHJlY3QgdmlhIEZPUkNFOiAlZHglZCslZCslZCAtLSAlZCAlZFxuIiwgdywgaCwgeCwgeSwgKnhfaGl0LCAqeV9oaXQpOwotCi0JCWZyX0ZPUkNFKys7Ci0JCWZyX0ZPUkNFdCsrOwotCX0KLX0KLQotdm9pZCBleHBpcmVfcmVjdHMyKGludCBpZHgsIGludCB3LCBpbnQgaCwgaW50ICp4X2hpdCwgaW50ICp5X2hpdCwgaW50IGJpZzEsIGludCBiaWcyLCBpbnQgY3JhbSkgewotCXNyYVJlZ2lvblB0ciByMSwgcjIsIHIzOwotCWludCB4ID0gLTEsIHkgPSAtMSwgbiwgaSwgaiwgazsKLQlpbnQgbndndF9tYXggPSAxMjgsIG53Z3QgPSAwOwotCWludCB0eXBlWzEyOF07Ci0JaW50IHZhbFs0XVsxMjhdOwotCWRvdWJsZSB3Z3RbMTI4XSwgbm9ybTsKLQlpbnQgRXhwaXJlID0gMSwgRm9yY2UgPSAyOwotCWludCBkb19leHBpcmUgPSAxOwotCWludCBkb19mb3JjZSA9IDE7Ci0JZG91YmxlIG5vdyA9IGRub3coKSwgcjsKLQlkb3VibGUgbmV3ZXN0ID0gLTEuMCwgb2xkZXN0ID0gLTEuMCwgYmFzZXRpbWU7Ci0JZG91YmxlIG1hcF9mYWN0b3IgPSAwLjI1OwotCi0JZm9yIChpPTA7IGk8Y2FjaGVfbGlzdF9udW07IGkrKykgewotCQlkb3VibGUgZCwgZDEsIGQyOwotCi0JCWQxID0gY2FjaGVfbGlzdFtpXS5ic190aW1lOwotCQlkMiA9IGNhY2hlX2xpc3RbaV0uc3VfdGltZTsKLQotCQlkID0gZDE7Ci0JCWlmIChkMiA+IGQpIGQgPSBkMjsKLQotCQlpZiAoZCA9PSAwLjApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKG9sZGVzdCA9PSAtMS4wIHx8IGQgPCBvbGRlc3QpIHsKLQkJCW9sZGVzdCA9IGQ7Ci0JCX0KLQkJaWYgKG5ld2VzdCA9PSAtMS4wIHx8IGQgPiBuZXdlc3QpIHsKLQkJCW5ld2VzdCA9IGQ7Ci0JCX0KLQl9Ci0JaWYgKG5ld2VzdCA9PSAtMS4wKSB7Ci0JCW5ld2VzdCA9IG5vdzsKLQl9Ci0JaWYgKG9sZGVzdCA9PSAtMS4wKSB7Ci0JCW9sZGVzdCA9IG5ld2VzdCAtIDE4MDA7Ci0JfQotCi0JYmFzZXRpbWUgPSBuZXdlc3QgKyAwLjEgKiAobmV3ZXN0IC0gb2xkZXN0KTsKLQotCWlmIChkb19leHBpcmUpIHsKLQkJaW50IG9sZFsxMF0sIE4gPSA0OwotCQlkb3VibGUgZG9sZFsxMF0sIGZhLCBkLCBkMSwgZDI7Ci0JCWludCBhMCA9IHcgKiBoLCBhMTsKLQotCQlmb3IgKGs9MTsgazw9TjsgaysrKSB7Ci0JCQlvbGRba10gPSAtMTsKLQkJCWRvbGRba10gPSAtMS4wOwotCQl9Ci0JCWZvciAoaT0wOyBpPGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCWludCB3YiA9IGNhY2hlX2xpc3RbaV0uYnNfdzsKLQkJCWludCBoYiA9IGNhY2hlX2xpc3RbaV0uYnNfaDsKLQkJCWlmIChjYWNoZV9saXN0W2ldLmJzX3ggPCAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodyA+IHdiIHx8IGggPiBoYikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHdiID09IDAgfHwgaGIgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGEwID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChpID09IGlkeCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlhMSA9IHdiICogaGI7Ci0JCQlmYSA9ICgoZG91YmxlKSBhMSkgLyBhMDsKLQkJCWsgPSAoaW50KSBmYTsKLQotCQkJaWYgKGsgPCAxKSBrID0gMTsKLQkJCWlmIChrID4gTikgY29udGludWU7Ci0KLQkJCWQxID0gY2FjaGVfbGlzdFtpXS5ic190aW1lOwotCQkJZDIgPSBjYWNoZV9saXN0W2ldLnN1X3RpbWU7Ci0KLQkJCWQgPSBkMTsKLQkJCWlmIChkMiA+IGQpIGQgPSBkMjsKLQkJCWlmIChkID09IDAuMCkgZCA9IG9sZGVzdDsKLQotCQkJaWYgKGRvbGRba10gPT0gLTEuMCB8fCBkIDwgZG9sZFtrXSkgewotCQkJCW9sZFtrXSA9IGk7Ci0JCQkJZG9sZFtrXSA9IGQ7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGs9MTsgazw9TjsgaysrKSB7Ci0JCQlpZiAob2xkW2tdID49IDApIHsKLQkJCQlpbnQgaWsgPSBvbGRba107Ci0JCQkJaW50IGtfdyA9IGNhY2hlX2xpc3RbaWtdLmJzX3c7Ci0JCQkJaW50IGtfaCA9IGNhY2hlX2xpc3RbaWtdLmJzX2g7Ci0KLQkJCQl3Z3RbbndndF0gPSAgKGJhc2V0aW1lIC0gZG9sZFtrXSkgLyAoa193ICoga19oKTsKLQkJCQlpZiAoY2FjaGVfbGlzdFtpa10ubWFwX3N0YXRlID09IElzVmlld2FibGUpIHsKLQkJCQkJd2d0W253Z3RdICo9IG1hcF9mYWN0b3I7Ci0JCQkJfQotCQkJCXR5cGVbbndndF0gPSBFeHBpcmU7Ci0JCQkJdmFsWzBdW253Z3RdID0gaWs7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJFeHBpcmVbJTAyZF0gICAlOS41ZiAgYWdlPSU5LjRmICBhcmVhPSU4ZCAgbmVlZD0lOGRcbiIsIG53Z3QsIDEwMDAwICogd2d0W253Z3RdLCBiYXNldGltZSAtIGRvbGRba10sIGtfdyAqIGtfaCwgdypoKTsKLQkJCQlud2d0Kys7Ci0JCQkJaWYgKG53Z3QgPj0gbndndF9tYXgpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogbmV4dCwgZm9yY2Ugb3Vyc2VsdmVzIGludG8gc29tZSBjb3JuZXIsIGV4cGlyaW5nIG1hbnkgcmVjdCAqLwotCWlmIChkb19mb3JjZSkgewotCQlpbnQgY29ybmVyX3gsIGNvcm5lcl95OwotCQlpbnQgeDAsIHkwOwotCi0JCWZvciAobiA9IDE7IG4gPCBuY2FjaGU7IG4gKz0gMikgewotCQkgICAgaWYgKGJpZzEgJiYgbmNhY2hlID4gMiAmJiBuID09IDEpIHsKLQkJCWNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgaWYgKGJpZzIgJiYgbmNhY2hlID4gNCAmJiBuIDw9IDMpIHsKLQkJCWNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgZm9yIChjb3JuZXJfeCA9IDA7IGNvcm5lcl94IDwgMjsgY29ybmVyX3grKykgewotCQkJaWYgKGNyYW0gJiYgYmlnMSAmJiBjb3JuZXJfeCA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb3IgKGNvcm5lcl95ID0gMDsgY29ybmVyX3kgPCAyOyBjb3JuZXJfeSsrKSB7Ci0JCQkJZG91YmxlIGFnZSA9IDAuMCwgYXJlYSA9IDAuMCwgYW1hcCA9IDAuMCwgYTsKLQkJCQlkb3VibGUgZCwgZDEsIGQyLCBzY29yZTsKLQkJCQlpbnQgbmMgPSAwOwotCi0JCQkJeDAgPSAwOwotCQkJCXkwID0gMDsKLQkJCQl5MCArPSBuICogZHB5X3k7IAotCi0JCQkJaWYgKGNvcm5lcl95KSB7Ci0JCQkJCXkwICs9IGRweV95IC0gaDsgCi0JCQkJfQotCQkJCWlmIChjb3JuZXJfeCkgewotCQkJCQl4MCArPSBkcHlfeCAtIHc7IAotCQkJCX0KLQkJCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoeDAsIHkwLCB4MCt3LCB5MCtoKTsKLQotCQkJCWZvciAoaT0wOyBpPGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCQkJaW50IHhiID0gY2FjaGVfbGlzdFtpXS5ic194OwotCQkJCQlpbnQgeWIgPSBjYWNoZV9saXN0W2ldLmJzX3k7Ci0JCQkJCWludCB3YiA9IGNhY2hlX2xpc3RbaV0uYnNfdzsKLQkJCQkJaW50IGhiID0gY2FjaGVfbGlzdFtpXS5ic19oOwotCi0JCQkJCWlmICh4YiA8IDApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChuYWJzKHliIC0geTApID4gZHB5X3kpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHhiLCB5YiwgeGIrd2IsIHliK2hiKTsKLQkJCQkJaWYgKCEgc3JhUmduQW5kKHIyLCByMSkpIHsKLQkJCQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJc3JhUmduRGVzdHJveShyMik7Ci0KLQkJCQkJYSA9IHdiICogaGI7Ci0KLQkJCQkJZDEgPSBjYWNoZV9saXN0W2ldLmJzX3RpbWU7Ci0JCQkJCWQyID0gY2FjaGVfbGlzdFtpXS5zdV90aW1lOwotCi0JCQkJCWQgPSBkMTsKLQkJCQkJaWYgKGQyID4gZCkgZCA9IGQyOwotCQkJCQlpZiAoZCA9PSAwLjApIGQgPSBvbGRlc3Q7Ci0KLQkJCQkJaWYgKGNhY2hlX2xpc3RbaV0ubWFwX3N0YXRlID09IElzVmlld2FibGUpIHsKLQkJCQkJCWFtYXAgKz0gYTsKLQkJCQkJfQotCQkJCQlhcmVhICs9IGE7Ci0JCQkJCWFnZSArPSAoYmFzZXRpbWUgLSBkKSAqIGE7Ci0JCQkJCW5jKys7Ci0JCQkJfQotCQkJCWlmIChuYyA9PSAwKSB7Ci0JCQkJCXNjb3JlID0gOTk5OTk5Ljk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZG91YmxlIGZhYzsKLQkJCQkJYWdlID0gYWdlIC8gYXJlYTsKLQkJCQkJc2NvcmUgPSBhZ2UgLyBhcmVhOwotCQkJCQlmYWMgPSAxLjAgKiAoMS4wIC0gYW1hcC9hcmVhKSArIG1hcF9mYWN0b3IgKiAoYW1hcC9hcmVhKTsKLQkJCQkJc2NvcmUgKj0gZmFjOwotCQkJCX0KLQotCQkJCXdndFtud2d0XSA9ICBzY29yZTsKLQkJCQl0eXBlW253Z3RdID0gRm9yY2U7Ci0JCQkJdmFsWzBdW253Z3RdID0gbjsKLQkJCQl2YWxbMV1bbndndF0gPSB4MDsKLQkJCQl2YWxbMl1bbndndF0gPSB5MDsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIkZvcmNlIFslMDJkXSAgICU5LjVmICBhZ2U9JTkuNGYgIGFyZWE9JThkICBhbWFwPSU4ZCAgbmVlZD0lOGRcbiIsIG53Z3QsIDEwMDAwICogd2d0W253Z3RdLCBhZ2UsIChpbnQpIGFyZWEsIChpbnQpIGFtYXAsIHcqaCk7Ci0JCQkJbndndCsrOwotCQkJCWlmIChud2d0ID49IG53Z3RfbWF4KSBicmVhazsKLQkJCQlzcmFSZ25EZXN0cm95KHIxKTsKLQkJCX0KLQkJCWlmIChud2d0ID49IG53Z3RfbWF4KSBicmVhazsKLQkJICAgIH0KLQkJICAgIGlmIChud2d0ID49IG53Z3RfbWF4KSBicmVhazsKLQkJfQotCX0KLQotCWlmIChud2d0ID09IDApIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIm53Z3Q9MFxuIik7Ci0JCSp4X2hpdCA9IC0xOwotCQlyZXR1cm47Ci0JfQotCi0Jbm9ybSA9IDAuMDsKLQlmb3IgKGk9MDsgaSA8IG53Z3Q7IGkrKykgewotCQlub3JtICs9IHdndFtpXTsKLQl9Ci0JZm9yIChpPTA7IGkgPCBud2d0OyBpKyspIHsKLQkJd2d0W2ldIC89IG5vcm07IAotCX0KLQotCXIgPSByZmFjKCk7Ci0KLQlub3JtID0gMC4wOwotCWZvciAoaj0wOyBqIDwgbndndDsgaisrKSB7Ci0JCW5vcm0gKz0gd2d0W2pdOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiaj0lMmQgIGFjYz0lLjZmIHI9JS42ZlxuIiwgaiwgbm9ybSwgcik7IAotCQlpZiAociA8IG5vcm0pIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChqID49IG53Z3QpIHsKLQkJaiA9IG53Z3QgLSAxOwotCX0KLQotCWlmICh0eXBlW2pdID09IEV4cGlyZSkgewotCQlpbnQgaWsgPSB2YWxbMF1bal07Ci0JCWludCBrX3ggPSBjYWNoZV9saXN0W2lrXS5ic194OwotCQlpbnQga195ID0gY2FjaGVfbGlzdFtpa10uYnNfeTsKLQkJaW50IGtfdyA9IGNhY2hlX2xpc3RbaWtdLmJzX3c7Ci0JCWludCBrX2ggPSBjYWNoZV9saXN0W2lrXS5ic19oOwotCi1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICI+PioqLS0qKj4+IGZvdW5kIHJlY3QgWyVkXSB2aWEgUkFOIEVYUElSRTogJWQgMHglbHggLS0gJWR4JWQrJWQrJWQgJWQgJWQgLS0gICVkeCVkKyVkKyVkICBBOiAlZC8lZFxuIiwKLQlnZXRfYnNfbigqeV9oaXQpLCBpaywgY2FjaGVfbGlzdFtpa10ud2luLCB3LCBoLCB4LCB5LCAqeF9oaXQsICp5X2hpdCwga193LCBrX2gsIGtfeCwga195LCBrX3cgKiBrX2gsIHcgKiBoKTsKLQotCQlmcmVlX3JlY3QoaWspOwotCQlmcl9FWFBJUkUrKzsKLQkJZnJfRVhQSVJFdCsrOwotCQkqeF9oaXQgPSBrX3g7Ci0JCSp5X2hpdCA9IGtfeTsKLQkJbiA9IGdldF9ic19uKCp5X2hpdCk7Ci0JCWlmIChuID49IDApIHsKLQkJCXIxID0gcmVjdF9yZWdbbl07Ci0JCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QoKnhfaGl0LCAqeV9oaXQsICp4X2hpdCArIHcsICp5X2hpdCArIGgpOwotCQkJc3JhUmduU3VidHJhY3QocjEsIHIyKTsKLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJmYWlsdXJlIHRvIGZpbmQgeSBuIGluIGZpbmRfcmVjdFxuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCQotCX0gZWxzZSBpZiAodHlwZVtqXSA9PSBGb3JjZSkgewotCi0JCWludCB4MCA9IHZhbFsxXVtqXTsKLQkJaW50IHkwID0gdmFsWzJdW2pdOwotCQluID0gdmFsWzBdW2pdOwotCQkKLQkJcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHgwLCB5MCwgeDArdywgeTAraCk7Ci0KLQkJZm9yIChpPTA7IGk8Y2FjaGVfbGlzdF9udW07IGkrKykgewotCQkJaW50IHhiID0gY2FjaGVfbGlzdFtpXS5ic194OwotCQkJaW50IHliID0gY2FjaGVfbGlzdFtpXS5ic195OwotCQkJaW50IHdiID0gY2FjaGVfbGlzdFtpXS5ic193OwotCQkJaW50IGhiID0gY2FjaGVfbGlzdFtpXS5ic19oOwotCQkJaWYgKHhiIDwgMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG5hYnMoeWIgLSB5MCkgPiBkcHlfeSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHhiLCB5YiwgeGIrd2IsIHliK2hiKTsKLQkJCWlmIChzcmFSZ25BbmQocjIsIHIxKSkgewotCQkJCWZyZWVfcmVjdChpKTsKLQkJCX0KLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQl9Ci0JCSp4X2hpdCA9IHgwOwotCQkqeV9oaXQgPSB5MDsKLQkJcjMgPSByZWN0X3JlZ1syKm4tMV07Ci0JCXNyYVJnblN1YnRyYWN0KHIzLCByMSk7Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCi1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICI+PioqLS0qKj4+IGZvdW5kIHJlY3QgWyVkXSB2aWEgUkFOIEZPUkNFOiAlZHglZCslZCslZCAtLSAlZCAlZFxuIiwgbiwgdywgaCwgeCwgeSwgKnhfaGl0LCAqeV9oaXQpOwotCi0JCWZyX0ZPUkNFKys7Ci0JCWZyX0ZPUkNFdCsrOwotCX0KLX0KLQotdm9pZCBleHBpcmVfcmVjdHMoaW50IGlkeCwgaW50IHcsIGludCBoLCBpbnQgKnhfaGl0LCBpbnQgKnlfaGl0LCBpbnQgYmlnMSwgaW50IGJpZzIsIGludCBjcmFtKSB7Ci0JaW50IG1ldGhvZCA9IDI7Ci0JaWYgKG1ldGhvZCA9PSAxKSB7Ci0JCWV4cGlyZV9yZWN0czEoaWR4LCB3LCBoLCB4X2hpdCwgeV9oaXQsIGJpZzEsIGJpZzIsIGNyYW0pOwotCX0gZWxzZSBpZiAobWV0aG9kID09IDIpIHsKLQkJZXhwaXJlX3JlY3RzMihpZHgsIHcsIGgsIHhfaGl0LCB5X2hpdCwgYmlnMSwgYmlnMiwgY3JhbSk7Ci0JfQotfQotCi1pbnQgZmluZF9yZWN0KGludCBpZHgsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0Jc3JhUmVnaW9uUHRyIHIxLCByMjsKLQlzcmFSZWN0YW5nbGVJdGVyYXRvciAqaXRlcjsKLQlzcmFSZWN0IHJ0OwotCWludCBuLCB4X2hpdCA9IC0xLCB5X2hpdCA9IC0xOwotCWludCBiaWcxID0gMCwgYmlnMiA9IDAsIGNyYW0gPSAwOwotCWRvdWJsZSBmYWMxID0gMC4xLCBmYWMyID0gMC4yNTsKLQlkb3VibGUgbGFzdF9jbGVhbiA9IDAuMDsKLQlkb3VibGUgbm93ID0gZG5vdygpOwotCXN0YXRpYyBpbnQgbm9iaWdzID0gLTE7Ci0KLQlpZiAocmVjdF9yZWdbMV0gPT0gTlVMTCkgewotCQlmb3IgKG4gPSAxOyBuIDw9IG5jYWNoZTsgbisrKSB7Ci0JCQlyZWN0X3JlZ1tuXSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgbiAqIGRweV95LCBkcHlfeCwgKG4rMSkgKiBkcHlfeSk7Ci0JCX0KLQl9IGVsc2UgaWYgKG5vdyA+IGxhc3RfY2xlYW4gKyA2MCkgewotCQlsYXN0X2NsZWFuID0gbm93OwotCQlmb3IgKG4gPSAxOyBuIDwgbmNhY2hlOyBuICs9IDIpIHsKLQkJCWludCBpLCBuMiA9IG4rMTsKLQotCQkJLyogbiAqLwotCQkJc3JhUmduRGVzdHJveShyZWN0X3JlZ1tuXSk7Ci0JCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgbiAqIGRweV95LCBkcHlfeCwgKG4rMSkgKiBkcHlfeSk7Ci0JCQlmb3IgKGk9MDsgaTxjYWNoZV9saXN0X251bTsgaSsrKSB7Ci0JCQkJaW50IGJzX3ggPSBjYWNoZV9saXN0W2ldLmJzX3g7Ci0JCQkJaW50IGJzX3kgPSBjYWNoZV9saXN0W2ldLmJzX3k7Ci0JCQkJaW50IGJzX3cgPSBjYWNoZV9saXN0W2ldLmJzX3c7Ci0JCQkJaW50IGJzX2ggPSBjYWNoZV9saXN0W2ldLmJzX2g7Ci0JCQkJaWYgKGJzX3ggPCAwKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoZ2V0X2JzX24oYnNfeSkgIT0gbikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KGJzX3gsIGJzX3ksIGJzX3grYnNfdywgYnNfeStic19oKTsKLQkJCQlzcmFSZ25TdWJ0cmFjdChyMSwgcjIpOwotCQkJfQotCQkJcmVjdF9yZWdbbl0gPSByMTsKLQotCQkJLyogbisxICovCi0JCQlzcmFSZ25EZXN0cm95KHJlY3RfcmVnW24yXSk7Ci0JCQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgbjIgKiBkcHlfeSwgZHB5X3gsIChuMisxKSAqIGRweV95KTsKLQkJCWZvciAoaT0wOyBpPGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCQlpbnQgYnNfeCA9IGNhY2hlX2xpc3RbaV0uYnNfeDsKLQkJCQlpbnQgc3VfeCA9IGNhY2hlX2xpc3RbaV0uc3VfeDsKLQkJCQlpbnQgc3VfeSA9IGNhY2hlX2xpc3RbaV0uc3VfeTsKLQkJCQlpbnQgc3VfdyA9IGNhY2hlX2xpc3RbaV0uc3VfdzsKLQkJCQlpbnQgc3VfaCA9IGNhY2hlX2xpc3RbaV0uc3VfaDsKLQkJCQlpZiAoYnNfeCA8IDApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChnZXRfYnNfbihzdV95KSAhPSBuMikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHN1X3gsIHN1X3ksIHN1X3grc3Vfdywgc3VfeStzdV9oKTsKLQkJCQlzcmFSZ25TdWJ0cmFjdChyMSwgcjIpOwotCQkJfQotCQkJcmVjdF9yZWdbbjJdID0gcjE7Ci0JCX0KLQl9Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gY2FjaGVfbGlzdF9udW0pIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgImZyZWVfcmVjdDogYmFkIGluZGV4OiAlZFxuIiwgaWR4KTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQljYWNoZV9saXN0W2lkeF0uYnNfeCA9IC0xOwotCWNhY2hlX2xpc3RbaWR4XS5zdV94ID0gLTE7Ci0JY2FjaGVfbGlzdFtpZHhdLmJzX3RpbWUgPSAwLjA7Ci0JY2FjaGVfbGlzdFtpZHhdLnN1X3RpbWUgPSAwLjA7Ci0KLQlpZiAobmNhY2hlX3BhZCkgewotCQl4IC09IG5jYWNoZV9wYWQ7CQotCQl5IC09IG5jYWNoZV9wYWQ7CQotCQl3ICs9IDIgKiBuY2FjaGVfcGFkOwkKLQkJaCArPSAyICogbmNhY2hlX3BhZDsJCi0JfQotCi0JaWYgKG5jYWNoZSA8PSAyKSB7Ci0JCWNyYW0gPSAxOwotCQlmYWMyID0gMC40NTsKLQl9IGVsc2UgaWYgKG5jYWNoZSA8PSA0KSB7Ci0JCWZhYzEgPSAwLjE4OwotCQlmYWMyID0gMC4zNTsKLQl9Ci0JaWYgKG1hY29zeF9jb25zb2xlICYmICFtYWNvc3hfbmNhY2hlX21hY21lbnUpIHsKLQkJaWYgKGNyYW0pIHsKLQkJCWZhYzEgKj0gMS41OwkKLQkJCWZhYzIgKj0gMS41OwkKLQkJfSBlbHNlIHsKLQkJCWZhYzEgKj0gMi41OwkKLQkJCWZhYzIgKj0gMi41OwkKLQkJfQotCX0KLQlpZiAodyAqIGggPiBmYWMxICogKGRweV94ICogZHB5X3kpKSB7Ci0JCWJpZzEgPSAxOwotCX0KLQlpZiAodyAqIGggPiBmYWMyICogKGRweV94ICogZHB5X3kpKSB7Ci0JCWJpZzIgPSAxOwotCX0KLQotCWlmIChub2JpZ3MgPCAwKSB7Ci0JCWlmIChnZXRlbnYoIk5PQklHUyIpKSB7Ci0JCQlub2JpZ3MgPSAxOwotCQl9IGVsc2UgewotCQkJbm9iaWdzID0gMDsKLQkJfQotCX0KLQlpZiAobm9iaWdzKSB7Ci0JCWJpZzEgPSBiaWcyID0gMDsKLQl9Ci0KLQlpZiAodyA+IGRweV94IHx8IGggPiBkcHlfeSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiPj4qKi0tKio+PiBCSUcxIHJlY3Q6ICVkeCVkKyVkKyVkIC0tICVkICVkXG4iLCB3LCBoLCB4LCB5LCB4X2hpdCwgeV9oaXQpOwotCQlmcl9CSUcxKys7Ci0JCWZyX0JJRzF0Kys7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodyA9PSBkcHlfeCAmJiBoID09IGRweV95KSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICI+PioqLS0qKj4+IEJJRzEgcmVjdDogJWR4JWQrJWQrJWQgLS0gJWQgJWQgKEZVTEwgRElTUExBWSlcbiIsIHcsIGgsIHgsIHksIHhfaGl0LCB5X2hpdCk7Ci0JCWZyX0JJRzErKzsKLQkJZnJfQklHMXQrKzsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjcmFtICYmIGJpZzIpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIj4+KiotLSoqPj4gQklHMiByZWN0OiAlZHglZCslZCslZCAtLSAlZCAlZFxuIiwgdywgaCwgeCwgeSwgeF9oaXQsIHlfaGl0KTsKLQkJZnJfQklHMisrOwotCQlmcl9CSUcydCsrOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBmaXJzdCB0cnkgaW5kaXZpZHVhbCByZWN0cyBvZiB1bnVzZWQgcmVnaW9uICovCi0JZm9yIChuID0gMTsgbiA8IG5jYWNoZTsgbiArPSAyKSB7Ci0JCXIxID0gcmVjdF9yZWdbbl07Ci0JCXIyID0gTlVMTDsKLQkJaWYgKGJpZzEgJiYgbiA9PSAxICYmIG5jYWNoZSA+IDIpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChiaWcyICYmIG4gPD0gMyAmJiBuY2FjaGUgPiA0KSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IocjEpOwotCQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZydCkpIHsKLQkJCWludCBydyA9IHJ0LngyIC0gcnQueDE7Ci0JCQlpbnQgcmggPSBydC55MiAtIHJ0LnkxOwotCQkJaWYgKGNyYW0gJiYgYmlnMSAmJiBydC54MSA8IGRweV94LzQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChydyA+PSB3ICYmIHJoID49IGgpIHsKLQkJCQl4X2hpdCA9IHJ0LngxOwotCQkJCXlfaGl0ID0gcnQueTE7Ci0JCQkJaWYgKGNyYW0gJiYgYmlnMSkgewotCQkJCQl4X2hpdCA9IHJ0LngyIC0gdzsKLQkJCQl9Ci0JCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHhfaGl0LCB5X2hpdCwgeF9oaXQgKyB3LCB5X2hpdCArIGgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQkJaWYgKHIyICE9IE5VTEwpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIj4+KiotLSoqPj4gZm91bmQgcmVjdCB2aWEgUkVHSU9OOiAlZHglZCslZCslZCAtLSAlZCAlZFxuIiwgdywgaCwgeCwgeSwgeF9oaXQsIHlfaGl0KTsKLQkJCWZyX1JFR0lPTisrOwotCQkJZnJfUkVHSU9OdCsrOwotCQkJc3JhUmduU3VidHJhY3QocjEsIHIyKTsKLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkKLQkvKiBuZXh0IHRyeSBtb3ZpbmcgY29ybmVyIHRvIGdyaWQgcG9pbnRzICovCi0JaWYgKHhfaGl0IDwgMCkgewotCSAgICBmb3IgKG4gPSAxOyBuIDwgbmNhY2hlOyBuICs9IDIpIHsKLQkJaW50IHJ4LCByeSwgTnggPSA0OCwgTnkgPSAyNCwgbnkgPSBuICogZHB5X3k7Ci0KLQkJaWYgKGJpZzEgJiYgbiA9PSAxICYmIG5jYWNoZSA+IDIpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChiaWcyICYmIG4gPT0gMyAmJiBuY2FjaGUgPiA0KSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdCgwLCBuICogZHB5X3ksIGRweV94LCAobisxKSAqIGRweV95KTsKLQkJc3JhUmduU3VidHJhY3QocjEsIHJlY3RfcmVnW25dKTsKLQkJcjIgPSBOVUxMOwotCi0JCXJ4ID0gMDsKLQkJd2hpbGUgKHJ4ICsgdyA8PSBkcHlfeCkgewotCQkgICAgcnkgPSAwOwotCQkgICAgaWYgKGNyYW0gJiYgYmlnMSAmJiByeCA8IGRweV94LzQpIHsKLQkJCXJ4ICs9IGRweV94L054OwotCQkgICAgCWNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgd2hpbGUgKHJ5ICsgaCA8PSBkcHlfeSkgewotCQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHJ4LCByeStueSwgcnggKyB3LCByeStueSArIGgpOwotCQkJaWYgKHNyYVJnbkFuZChyMiwgcjEpKSB7Ci0JCQkJc3JhUmduRGVzdHJveShyMik7Ci0JCQkJcjIgPSBOVUxMOwotCQkJfSBlbHNlIHsKLQkJCQlzcmFSZ25EZXN0cm95KHIyKTsKLQkJCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QocngsIHJ5K255LCByeCArIHcsIHJ5K255ICsgaCk7Ci0JCQkJeF9oaXQgPSByeDsKLQkJCQl5X2hpdCA9IHJ5K255OwotCQkJfQotCQkJcnkgKz0gZHB5X3kvTnk7Ci0JCQlpZiAocjIpIGJyZWFrOwotCQkgICAgfQotCQkgICAgcnggKz0gZHB5X3gvTng7Ci0JCSAgICBpZiAocjIpIGJyZWFrOwotCQl9Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCQlpZiAocjIgIT0gTlVMTCkgewotCQkJc3JhUmduU3VidHJhY3QocmVjdF9yZWdbbl0sIHIyKTsKLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiPj4qKi0tKio+PiBmb3VuZCByZWN0IHZpYSBHUklEOiAlZHglZCslZCslZCAtLSAlZCAlZFxuIiwgdywgaCwgeCwgeSwgeF9oaXQsIHlfaGl0KTsKLQkJCWZyX0dSSUQrKzsKLQkJCWZyX0dSSUR0Kys7Ci0JCQlicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0JLyogbmV4dCwgdHJ5IGV4cGlyaW5nIHRoZSBvbGRlc3Qvc21hbGxlc3QgdXNlZCBicy9zdSByZWN0YW5nbGUgd2UgZml0IGluICovCi0KLQlpZiAoeF9oaXQgPCAwKSB7Ci0JCWV4cGlyZV9yZWN0cyhpZHgsIHcsIGgsICZ4X2hpdCwgJnlfaGl0LCBiaWcxLCBiaWcyLCBjcmFtKTsKLQl9Ci0KLQljYWNoZV9saXN0W2lkeF0uYnNfeCA9IHhfaGl0OwotCWNhY2hlX2xpc3RbaWR4XS5ic195ID0geV9oaXQ7Ci0JY2FjaGVfbGlzdFtpZHhdLmJzX3cgPSB3OwotCWNhY2hlX2xpc3RbaWR4XS5ic19oID0gaDsKLQotCWNhY2hlX2xpc3RbaWR4XS5zdV94ID0geF9oaXQ7Ci0JY2FjaGVfbGlzdFtpZHhdLnN1X3kgPSB5X2hpdCArIGRweV95OwotCWNhY2hlX2xpc3RbaWR4XS5zdV93ID0gdzsKLQljYWNoZV9saXN0W2lkeF0uc3VfaCA9IGg7Ci0KLQlpZiAoeF9oaXQgPCAwKSB7Ci0JCS8qIGJhZCBuZXdzLCBjYW4gaXQgc3RpbGwgaGFwcGVuPyAqLwotCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICI+PioqLS0qKj4+ICpGQUlMIHJlY3Q6ICVkeCVkKyVkKyVkIC0tICVkICVkXG4iLCB3LCBoLCB4LCB5LCB4X2hpdCwgeV9oaXQpOwotCQlmcl9GQUlMKys7Ci0JCWZyX0ZBSUx0Kys7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIj4+KiotLSoqPj4gZm91bmQgcmVjdDogJWR4JWQrJWQrJWQgLS0gJWQgJWRcbiIsIHcsIGgsIHgsIHksIHhfaGl0LCB5X2hpdCk7Ci0JfQotCi0JaWYgKHplcm9fcmVjdHMpIHsKLQkJcjEgPSBzcmFSZ25DcmVhdGVSZWN0KHhfaGl0LCB5X2hpdCwgeF9oaXQrdywgeV9oaXQraCk7Ci0JCXNyYVJnblN1YnRyYWN0KHplcm9fcmVjdHMsIHIxKTsKLQkJc3JhUmduRGVzdHJveShyMSk7Ci0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdCh4X2hpdCwgeV9oaXQrZHB5X3ksIHhfaGl0K3csIHlfaGl0K2RweV95K2gpOwotCQlzcmFSZ25TdWJ0cmFjdCh6ZXJvX3JlY3RzLCByMSk7Ci0JCXNyYVJnbkRlc3Ryb3kocjEpOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBjYWNoZV9jcihzcmFSZWdpb25QdHIgciwgaW50IGR4LCBpbnQgZHksIGRvdWJsZSBkMCwgZG91YmxlIGQxLCBpbnQgKm5iYXRjaCkgewotCWlmIChzcmFSZ25FbXB0eShyKSkgewotCQlyZXR1cm47Ci0JfQotCWlmIChuYmF0Y2ggPT0gTlVMTCkgewotCQlpZiAoIWZiX3B1c2hfd2FpdChkMCwgRkJfQ09QWSkpIHsKLQkJCWZiX3B1c2hfd2FpdChkMC8yLCBGQl9DT1BZKTsKLQkJfQotCQlkb19jb3B5cmVnaW9uKHIsIGR4LCBkeSwgMCk7Ci0JCWlmICghZmJfcHVzaF93YWl0KGQxLCBGQl9DT1BZKSkgewotCQkJZmJfcHVzaF93YWl0KGQxLzIsIEZCX0NPUFkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYmF0Y2hfZHhzWypuYmF0Y2hdID0gZHg7Ci0JCWJhdGNoX2R5c1sqbmJhdGNoXSA9IGR5OwotCQliYXRjaF9yZWdbKm5iYXRjaF0gPSBzcmFSZ25DcmVhdGVSZ24ocik7Ci0JCSgqbmJhdGNoKSsrOwotCX0KLX0KLQotZG91YmxlIHNhdmVfZGVsYXkwICAgID0gMC4wMjsKLWRvdWJsZSByZXN0b3JlX2RlbGF5MCA9IDAuMDI7Ci1kb3VibGUgc2F2ZV9kZWxheTEgICAgPSAwLjA1OwotZG91YmxlIHJlc3RvcmVfZGVsYXkxID0gMC4wNTsKLXN0YXRpYyBkb3VibGUgZHRBLCBkdEI7Ci0KLWludCB2YWxpZF93cihpbnQgaWR4LCBXaW5kb3cgd2luLCBYV2luZG93QXR0cmlidXRlcyAqYXR0cikgewotI2lmZGVmIE1BQ09TWAotCWlmIChtYWNvc3hfY29uc29sZSkgewotCQkvKiB0aGlzIGlzIGFsbCB0byBhdm9pZCBhbmltYXRpb24gY2hhbmdpbmcgV3hIK1grWS4uLiAqLwotCQlpZiAoaWR4ID49IDApIHsKLQkJCWludCByYyA9IHZhbGlkX3dpbmRvdyh3aW4sIGF0dHIsIDEpOwotCQkJYXR0ci0+eCA9IGNhY2hlX2xpc3RbaWR4XS54OwotCQkJYXR0ci0+eSA9IGNhY2hlX2xpc3RbaWR4XS55OwotCQkJYXR0ci0+d2lkdGggPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7Ci0JCQlhdHRyLT5oZWlnaHQgPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCQkJcmV0dXJuIHJjOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZhbGlkX3dpbmRvdyh3aW4sIGF0dHIsIDEpOwotCQl9Ci0JfQotI2Vsc2UKLQlpZiAoIWlkeCkge30KLSNlbmRpZgotCXJldHVybiB2YWxpZF93aW5kb3cod2luLCBhdHRyLCAxKTsKLX0KLQotaW50IGNsaXBwZWQoaW50IGlkeCkgewotCWludCBpYzsJCi0Jc3JhUmVnaW9uUHRyIHIwLCByMSwgcjI7Ci0JaW50IHgxLCB5MSwgdzEsIGgxOwotCVdpbmRvdyB3aW47Ci0JaW50IGNsaXAgPSAwOwotCi0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXIwID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCi0JeDEgPSBjYWNoZV9saXN0W2lkeF0ueDsKLQl5MSA9IGNhY2hlX2xpc3RbaWR4XS55OwotCXcxID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCWgxID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQotCXdpbiA9IGNhY2hlX2xpc3RbaWR4XS53aW47Ci0KLQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoeDEsIHkxLCB4MSt3MSwgeTEraDEpOwotCXNyYVJnbkFuZChyMSwgcjApOwotCi0JZm9yIChpYyA9IG9sZF9zdGFja19uIC0gMTsgaWMgPj0gMDsgaWMtLSkgewotCQlpbnQgeGMsIHljLCB3YywgaGMsIGlkeDI7Ci0KLQkJaWYgKG9sZF9zdGFja1tpY10gPT0gd2luKSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAob2xkX3N0YWNrX21hcHBlZFtpY10gPT0gMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWR4MiA9IGxvb2t1cF9vbGRfc3RhY2tfaW5kZXgoaWMpOwotCQlpZiAoaWR4MiA8IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChjYWNoZV9saXN0W2lkeDJdLndpbiA9PSB3aW4pIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjYWNoZV9saXN0W2lkeDJdLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQl4YyA9IGNhY2hlX2xpc3RbaWR4Ml0ueDsKLQkJeWMgPSBjYWNoZV9saXN0W2lkeDJdLnk7Ci0JCXdjID0gY2FjaGVfbGlzdFtpZHgyXS53aWR0aDsKLQkJaGMgPSBjYWNoZV9saXN0W2lkeDJdLmhlaWdodDsKLQotCQlyMiA9IHNyYVJnbkNyZWF0ZVJlY3QoeGMsIHljLCB4Yyt3YywgeWMraGMpOwotCQlzcmFSZ25BbmQocjIsIHIwKTsKLQkJaWYgKHNyYVJnbkFuZChyMiwgcjEpKSB7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJjbGlwWzB4JWx4XTogMHglbHgsICVkLyVkXG4iLCB3aW4sIGNhY2hlX2xpc3RbaWR4Ml0ud2luLCBpYywgaWR4Mik7Ci0JCQljbGlwID0gMTsKLQkJfQotCQlzcmFSZ25EZXN0cm95KHIyKTsKLQkJaWYgKGNsaXApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNyYVJnbkRlc3Ryb3kocjApOwotCXNyYVJnbkRlc3Ryb3kocjEpOwotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiY2xpcFsweCVseF06ICVzXG4iLCB3aW4sIGNsaXAgPyAiY2xpcHBlZCIgOiAibm8tY2xpcHBlZCIpOwotCXJldHVybiBjbGlwOwotfQotCi12b2lkIGNsaXBfcmVnaW9uKHNyYVJlZ2lvblB0ciByLCBXaW5kb3cgd2luKSB7Ci0JaW50IGljLCBpZHgyOwkKLQlzcmFSZWdpb25QdHIgcjE7Ci0JZm9yIChpYyA9IG9sZF9zdGFja19uIC0gMTsgaWMgPj0gMDsgaWMtLSkgewotCQlpbnQgeGMsIHljLCB3YywgaGM7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS1bMHglbHhdOiAweCVseCwgJWQgICVkXG4iLCB3aW4sIG9sZF9zdGFja1tpY10sIGljLCBvbGRfc3RhY2tfbWFwcGVkW2ljXSk7Ci0JCWlmIChvbGRfc3RhY2tbaWNdID09IHdpbikgewotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG9sZF9zdGFja19tYXBwZWRbaWNdID09IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlkeDIgPSBsb29rdXBfb2xkX3N0YWNrX2luZGV4KGljKTsKLQkJaWYgKGlkeDIgPCAwKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2FjaGVfbGlzdFtpZHgyXS53aW4gPT0gd2luKSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2FjaGVfbGlzdFtpZHgyXS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJY29udGludWU7Ci0JCX0KLQkJeGMgPSBjYWNoZV9saXN0W2lkeDJdLng7Ci0JCXljID0gY2FjaGVfbGlzdFtpZHgyXS55OwotCQl3YyA9IGNhY2hlX2xpc3RbaWR4Ml0ud2lkdGg7Ci0JCWhjID0gY2FjaGVfbGlzdFtpZHgyXS5oZWlnaHQ7Ci0JCXIxID0gc3JhUmduQ3JlYXRlUmVjdCh4YywgeWMsIHhjK3djLCB5YytoYyk7Ci0JCWlmIChzcmFSZ25BbmQocjEsIHIpKSB7Ci0JCQlzcmFSZ25TdWJ0cmFjdChyLCByMSk7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJjbGlwWzB4JWx4XTogMHglbHgsICVkLyVkXG4iLCB3aW4sIGNhY2hlX2xpc3RbaWR4Ml0ud2luLCBpYywgaWR4Mik7Ci0JCX0KLQkJc3JhUmduRGVzdHJveShyMSk7Ci0JfQotfQotCi1pbnQgYnNfc2F2ZShpbnQgaWR4LCBpbnQgKm5iYXRjaCwgWFdpbmRvd0F0dHJpYnV0ZXMgKmF0dHIsIGludCBjbGlwLCBpbnQgb25seV9pZl90cmFja2luZywgaW50ICp2YWxpZCwgaW50IHZlcmIpIHsKLQlXaW5kb3cgd2luID0gY2FjaGVfbGlzdFtpZHhdLndpbjsKLQlpbnQgeDEsIHkxLCB3MSwgaDE7Ci0JaW50IHgyLCB5MiwgdzIsIGgyOwotCWludCB4LCB5LCB3LCBoOwotCWludCBkeCwgZHksIHJjID0gMTsKLQlzcmFSZWdpb25QdHIgciwgcjA7Ci0JCi0JeDEgPSBjYWNoZV9saXN0W2lkeF0ueDsKLQl5MSA9IGNhY2hlX2xpc3RbaWR4XS55OwotCXcxID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCWgxID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQotaWYgKG5jZGIgJiYgdmVyYikgZnByaW50ZihzdGRlcnIsICJiYWNraW5nc3RvcmUgc2F2ZTogICAgICAgMHglbHggICUzZCBjbGlwPSVkXG4iLCB3aW4sIGlkeCwgY2xpcCk7Ci0JCi0JWF9MT0NLOwotCWlmICgqdmFsaWQpIHsKLQkJYXR0ci0+eCA9IHgxOwotCQlhdHRyLT55ID0geTE7Ci0JCWF0dHItPndpZHRoID0gdzE7Ci0JCWF0dHItPmhlaWdodCA9IGgxOwotCX0gZWxzZSBpZiAoISB2YWxpZF93cihpZHgsIHdpbiwgYXR0cikpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgImJzX3NhdmU6ICAgIG5vdCBhIHZhbGlkIFggd2luZG93OiAweCVseFxuIiwgd2luKTsKLQkJWF9VTkxPQ0s7Ci0JCSp2YWxpZCA9IDA7Ci0JCWNhY2hlX2xpc3RbaWR4XS52YWxpZCA9IDA7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCSp2YWxpZCA9IDE7Ci0JfQotCVhfVU5MT0NLOwotCi0JaWYgKG9ubHlfaWZfdHJhY2tpbmcgJiYgY2FjaGVfbGlzdFtpZHhdLmJzX3ggPCAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXgyID0gYXR0ci0+eDsKLQl5MiA9IGF0dHItPnk7Ci0JdzIgPSBhdHRyLT53aWR0aDsKLQloMiA9IGF0dHItPmhlaWdodDsKLQotCWlmIChjYWNoZV9saXN0W2lkeF0uYnNfeCA8IDApIHsKLQkJcmMgPSBmaW5kX3JlY3QoaWR4LCB4MiwgeTIsIHcyLCBoMik7Ci0JfSBlbHNlIGlmICh3MiA+IGNhY2hlX2xpc3RbaWR4XS5ic193IHx8IGgyID4gY2FjaGVfbGlzdFtpZHhdLmJzX2gpIHsKLQkJZnJlZV9yZWN0KGlkeCk7Ci0JCXJjID0gZmluZF9yZWN0KGlkeCwgeDIsIHkyLCB3MiwgaDIpOwotCX0KLQotCXggPSBjYWNoZV9saXN0W2lkeF0uYnNfeDsKLQl5ID0gY2FjaGVfbGlzdFtpZHhdLmJzX3k7Ci0JdyA9IGNhY2hlX2xpc3RbaWR4XS5ic193OwotCWggPSBjYWNoZV9saXN0W2lkeF0uYnNfaDsKLQotCWlmICh4IDwgMCB8fCAhIHJjKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJCU19zYXZlOiBGQUlMIEZPUjogJWRcbiIsIGlkeCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChuY2FjaGVfcGFkKSB7Ci0JCXgyIC09IG5jYWNoZV9wYWQ7CQotCQl5MiAtPSBuY2FjaGVfcGFkOwkKLQkJdzIgKz0gMiAqIG5jYWNoZV9wYWQ7CQotCQloMiArPSAyICogbmNhY2hlX3BhZDsJCi0JfQotCi0JaWYgKGNsaXBzaGlmdCkgewotCQl4MiAtPSBjb2ZmX3g7Ci0JCXkyIC09IGNvZmZfeTsKLQl9Ci0KLQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQlyID0gc3JhUmduQ3JlYXRlUmVjdCh4MiwgeTIsIHgyK3cyLCB5MitoMik7Ci0Jc3JhUmduQW5kKHIsIHIwKTsKLQotCWlmIChjbGlwKSB7Ci0JCWNsaXBfcmVnaW9uKHIsIHdpbik7Ci0JfQotCi0JaWYgKHNyYVJnbkVtcHR5KHIpKSB7Ci1pZiAobmNkYiAmJiB2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgIkJTX3NhdmU6IFJlZ2lvbiBFbXB0eTogJWRcbiIsIGlkeCk7Ci0JCXNyYVJnbkRlc3Ryb3kocjApOwotCQlzcmFSZ25EZXN0cm95KHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkeCA9IHggLSB4MjsgCi0JZHkgPSB5IC0geTI7IAotCi0Jc3JhUmduT2Zmc2V0KHIsIGR4LCBkeSk7Ci0KLQlkdEEgPSAgZG5vd3goKTsKLWlmIChuY2RiICYmIHZlcmIpIGZwcmludGYoc3RkZXJyLCAiQlNfc2F2ZTogJS40ZiAgICAgICVkIGR4PSVkIGR5PSVkXG4iLCBkdEEsIGlkeCwgZHgsIGR5KTsKLQlpZiAodzIgPiAwICYmIGgyID4gMCkgewotCQljYWNoZV9jcihyLCBkeCwgZHksIHNhdmVfZGVsYXkwLCBzYXZlX2RlbGF5MSwgbmJhdGNoKTsKLQl9Ci0JZHRCID0gIGRub3d4KCk7Ci1pZiAobmNkYiAmJiB2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgIkJTX3NhdmU6ICUuNGYgJS4yZiAlZCBkb25lLiAgJWR4JWQrJWQrJWQgJWR4JWQrJWQrJWQgICUuMmYgJS4yZlxuIiwgZHRCLCBkdEItZHRBLCBpZHgsIHcxLCBoMSwgeDEsIHkxLCB3MiwgaDIsIHgyLCB5MiwgY2FjaGVfbGlzdFtpZHhdLmJzX3RpbWUgLSB4MTF2bmNfc3RhcnQsIGRub3d4KCkpOwotCi0Jc3JhUmduRGVzdHJveShyMCk7Ci0Jc3JhUmduRGVzdHJveShyKTsKLQotCWxhc3RfYnNfc2F2ZSA9IGNhY2hlX2xpc3RbaWR4XS5ic190aW1lID0gZG5vdygpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBzdV9zYXZlKGludCBpZHgsIGludCAqbmJhdGNoLCBYV2luZG93QXR0cmlidXRlcyAqYXR0ciwgaW50IGNsaXAsIGludCAqdmFsaWQsIGludCB2ZXJiKSB7Ci0JV2luZG93IHdpbiA9IGNhY2hlX2xpc3RbaWR4XS53aW47Ci0JaW50IHgxLCB5MSwgdzEsIGgxOwotCWludCB4MiwgeTIsIHcyLCBoMjsKLQlpbnQgeCwgeSwgdywgaDsKLQlpbnQgZHgsIGR5LCByYyA9IDE7Ci0Jc3JhUmVnaW9uUHRyIHIsIHIwOwotCQotaWYgKG5jZGIgJiYgdmVyYikgZnByaW50ZihzdGRlcnIsICJzYXZlLXVuZGVycyBzYXZlOiAgICAgICAgMHglbHggICUzZCBcbiIsIHdpbiwgaWR4KTsKLQotCXgxID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JeTEgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQl3MSA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQloMSA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCi0JWF9MT0NLOwotCWlmICgqdmFsaWQpIHsKLQkJYXR0ci0+eCA9IHgxOwotCQlhdHRyLT55ID0geTE7Ci0JCWF0dHItPndpZHRoID0gdzE7Ci0JCWF0dHItPmhlaWdodCA9IGgxOwotCX0gZWxzZSBpZiAoISB2YWxpZF93cihpZHgsIHdpbiwgYXR0cikpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgInN1X3NhdmU6ICAgIG5vdCBhIHZhbGlkIFggd2luZG93OiAweCVseFxuIiwgd2luKTsKLQkJWF9VTkxPQ0s7Ci0JCSp2YWxpZCA9IDA7Ci0JCWNhY2hlX2xpc3RbaWR4XS52YWxpZCA9IDA7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCSp2YWxpZCA9IDE7Ci0JfQotCVhfVU5MT0NLOwotCi0JeDIgPSBhdHRyLT54OwotCXkyID0gYXR0ci0+eTsKLQl3MiA9IGF0dHItPndpZHRoOwotCWgyID0gYXR0ci0+aGVpZ2h0OwotCi0JaWYgKGNhY2hlX2xpc3RbaWR4XS5ic194IDwgMCkgewotCQlyYyA9IGZpbmRfcmVjdChpZHgsIHgyLCB5MiwgdzIsIGgyKTsKLQl9IGVsc2UgaWYgKHcyID4gY2FjaGVfbGlzdFtpZHhdLnN1X3cgfHwgaDIgPiBjYWNoZV9saXN0W2lkeF0uc3VfaCkgewotCQlmcmVlX3JlY3QoaWR4KTsKLQkJcmMgPSBmaW5kX3JlY3QoaWR4LCB4MiwgeTIsIHcyLCBoMik7Ci0JfQotCXggPSBjYWNoZV9saXN0W2lkeF0uc3VfeDsKLQl5ID0gY2FjaGVfbGlzdFtpZHhdLnN1X3k7Ci0JdyA9IGNhY2hlX2xpc3RbaWR4XS5zdV93OwotCWggPSBjYWNoZV9saXN0W2lkeF0uc3VfaDsKLQotCWlmICh4IDwgMCB8fCAhIHJjKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJTVV9zYXZlOiBGQUlMIEZPUjogJWRcbiIsIGlkeCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChuY2FjaGVfcGFkKSB7Ci0JCXgyIC09IG5jYWNoZV9wYWQ7CQotCQl5MiAtPSBuY2FjaGVfcGFkOwkKLQkJdzIgKz0gMiAqIG5jYWNoZV9wYWQ7CQotCQloMiArPSAyICogbmNhY2hlX3BhZDsJCi0JfQotCi0JaWYgKGNsaXBzaGlmdCkgewotCQl4MiAtPSBjb2ZmX3g7Ci0JCXkyIC09IGNvZmZfeTsKLQl9Ci0KLQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQlyID0gc3JhUmduQ3JlYXRlUmVjdCh4MiwgeTIsIHgyK3cyLCB5MitoMik7Ci0Jc3JhUmduQW5kKHIsIHIwKTsKLQotCWlmIChjbGlwKSB7Ci0JCWNsaXBfcmVnaW9uKHIsIHdpbik7Ci0JfQotCi0JaWYgKHNyYVJnbkVtcHR5KHIpKSB7Ci1pZiAobmNkYiAmJiB2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgIlNVX3NhdmU6IFJlZ2lvbiBFbXB0eTogJWRcbiIsIGlkeCk7Ci0JCXNyYVJnbkRlc3Ryb3kocjApOwotCQlzcmFSZ25EZXN0cm95KHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCWR4ID0geCAtIHgyOyAKLQlkeSA9IHkgLSB5MjsgCi0KLQlzcmFSZ25PZmZzZXQociwgZHgsIGR5KTsKLQotCWR0QSA9ICBkbm93eCgpOwotaWYgKG5jZGIgJiYgdmVyYikgZnByaW50ZihzdGRlcnIsICJTVV9zYXZlOiAlLjRmICAgICAgJWQgZHg9JWQgZHk9JWRcbiIsIGR0QSwgaWR4LCBkeCwgZHkpOwotCWlmICh3MiA+IDAgJiYgaDIgPiAwKSB7Ci0JCWNhY2hlX2NyKHIsIGR4LCBkeSwgc2F2ZV9kZWxheTAsIHNhdmVfZGVsYXkxLCBuYmF0Y2gpOwotCX0KLQlkdEIgPSAgZG5vd3goKTsKLWlmIChuY2RiICYmIHZlcmIpIGZwcmludGYoc3RkZXJyLCAiU1Vfc2F2ZTogJS40ZiAlLjJmICVkIGRvbmUuICAlZHglZCslZCslZCAlZHglZCslZCslZCAgJS4yZiAlLjJmXG4iLCBkdEIsIGR0Qi1kdEEsIGlkeCwgdzEsIGgxLCB4MSwgeTEsIHcyLCBoMiwgeDIsIHkyLCBjYWNoZV9saXN0W2lkeF0uc3VfdGltZSAtIHgxMXZuY19zdGFydCwgZG5vd3goKSk7Ci0KLQlzcmFSZ25EZXN0cm95KHIwKTsKLQlzcmFSZ25EZXN0cm95KHIpOwotCi0JbGFzdF9zdV9zYXZlID0gY2FjaGVfbGlzdFtpZHhdLnN1X3RpbWUgPSBkbm93KCk7Ci0JCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBic19yZXN0b3JlKGludCBpZHgsIGludCAqbmJhdGNoLCBzcmFSZWdpb25QdHIgcm1hc2ssIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyLCBpbnQgY2xpcCwgaW50IG5vcGFkLCBpbnQgKnZhbGlkLCBpbnQgdmVyYikgewotCVdpbmRvdyB3aW4gPSBjYWNoZV9saXN0W2lkeF0ud2luOwotCWludCB4MSwgeTEsIHcxLCBoMTsKLQlpbnQgeDIsIHkyLCB3MiwgaDI7Ci0JaW50IHgsIHksIHcsIGg7Ci0JaW50IGR4LCBkeTsKLQlzcmFSZWdpb25QdHIgciwgcjA7Ci0KLWlmIChuY2RiICYmIHZlcmIpIGZwcmludGYoc3RkZXJyLCAiYmFja2luZ3N0b3JlIHJlc3RvcmU6ICAgIDB4JWx4ICAlM2QgXG4iLCB3aW4sIGlkeCk7Ci0KLQl4MSA9IGNhY2hlX2xpc3RbaWR4XS54OwotCXkxID0gY2FjaGVfbGlzdFtpZHhdLnk7Ci0JdzEgPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7Ci0JaDEgPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCQotCVhfTE9DSzsKLQlpZiAoKnZhbGlkKSB7Ci0JCWF0dHItPnggPSB4MTsKLQkJYXR0ci0+eSA9IHkxOwotCQlhdHRyLT53aWR0aCA9IHcxOwotCQlhdHRyLT5oZWlnaHQgPSBoMTsKLQl9IGVsc2UgaWYgKCEgdmFsaWRfd3IoaWR4LCB3aW4sIGF0dHIpKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJCU19yZXN0b3JlOiBub3QgYSB2YWxpZCBYIHdpbmRvdzogMHglbHhcbiIsIHdpbik7Ci0JCSp2YWxpZCA9IDA7Ci0JCVhfVU5MT0NLOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkqdmFsaWQgPSAxOwotCX0KLQlYX1VOTE9DSzsKLQotCXgyID0gYXR0ci0+eDsKLQl5MiA9IGF0dHItPnk7Ci0JdzIgPSBhdHRyLT53aWR0aDsKLQloMiA9IGF0dHItPmhlaWdodDsKLQotCXggPSBjYWNoZV9saXN0W2lkeF0uYnNfeDsKLQl5ID0gY2FjaGVfbGlzdFtpZHhdLmJzX3k7Ci0JdyA9IGNhY2hlX2xpc3RbaWR4XS5ic193OwotCWggPSBjYWNoZV9saXN0W2lkeF0uYnNfaDsKLQotCWlmICh4IDwgMCB8fCBjYWNoZV9saXN0W2lkeF0uYnNfdGltZSA9PSAwLjApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG5jYWNoZV9wYWQpIHsKLQkJaWYgKG5vcGFkKSB7Ci0JCQl4ICs9IG5jYWNoZV9wYWQ7CQotCQkJeSArPSBuY2FjaGVfcGFkOwkKLQkJCXcgLT0gMiAqIG5jYWNoZV9wYWQ7CQotCQkJaCAtPSAyICogbmNhY2hlX3BhZDsJCi0JCX0gZWxzZSB7Ci0JCQl4MiAtPSBuY2FjaGVfcGFkOwkKLQkJCXkyIC09IG5jYWNoZV9wYWQ7CQotCQkJdzIgKz0gMiAqIG5jYWNoZV9wYWQ7CQotCQkJaDIgKz0gMiAqIG5jYWNoZV9wYWQ7CQotCQl9Ci0JfQotCi0JaWYgKGNsaXBzaGlmdCkgewotCQl4MiAtPSBjb2ZmX3g7Ci0JCXkyIC09IGNvZmZfeTsKLQl9Ci0KLQlpZiAodzIgPiB3KSB7Ci0JCXcyID0gdzsKLQl9Ci0JaWYgKGgyID4gaCkgewotCQloMiA9IGg7Ci0JfQotCi0JcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JciA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCt3MiwgeStoMik7Ci0KLQlkeCA9IHgyIC0geDsgCi0JZHkgPSB5MiAtIHk7IAotCi0Jc3JhUmduT2Zmc2V0KHIsIGR4LCBkeSk7Ci0Jc3JhUmduQW5kKHIsIHIwKTsKLQotCWlmIChjbGlwKSB7Ci0JCWNsaXBfcmVnaW9uKHIsIHdpbik7Ci0JfQotCWlmIChybWFzayAhPSBOVUxMKSB7Ci0JCXNyYVJnbkFuZChyLCBybWFzayk7Ci0JfQotCi0JZHRBID0gIGRub3d4KCk7Ci1pZiAobmNkYiAmJiB2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgIkJTX3Jlc3Q6ICUuNGYgICAgICAlZCBkeD0lZCBkeT0lZFxuIiwgZHRBLCBpZHgsIGR4LCBkeSk7Ci0JaWYgKHcyID4gMCAmJiBoMiA+IDApIHsKLQkJY2FjaGVfY3IociwgZHgsIGR5LCByZXN0b3JlX2RlbGF5MCwgcmVzdG9yZV9kZWxheTEsIG5iYXRjaCk7Ci0JfQotCWR0QiA9ICBkbm93eCgpOwotaWYgKG5jZGIgJiYgdmVyYikgZnByaW50ZihzdGRlcnIsICJCU19yZXN0OiAlLjRmICUuMmYgJWQgZG9uZS4gICVkeCVkKyVkKyVkICVkeCVkKyVkKyVkICAlLjJmICUuMmZcbiIsIGR0QiwgZHRCLWR0QSwgaWR4LCB3MSwgaDEsIHgxLCB5MSwgdzIsIGgyLCB4MiwgeTIsIGNhY2hlX2xpc3RbaWR4XS5ic190aW1lIC0geDExdm5jX3N0YXJ0LCBkbm93eCgpKTsKLQotCXNyYVJnbkRlc3Ryb3kocjApOwotCXNyYVJnbkRlc3Ryb3kocik7Ci0KLQlsYXN0X2JzX3Jlc3RvcmUgPSBkbm93KCk7Ci0JCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBzdV9yZXN0b3JlKGludCBpZHgsIGludCAqbmJhdGNoLCBzcmFSZWdpb25QdHIgcm1hc2ssIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyLCBpbnQgY2xpcCwgaW50IG5vcGFkLCBpbnQgKnZhbGlkLCBpbnQgdmVyYikgewotCVdpbmRvdyB3aW4gPSBjYWNoZV9saXN0W2lkeF0ud2luOwotCWludCB4MSwgeTEsIHcxLCBoMTsKLQlpbnQgeDIgPSAwLCB5MiA9IDAsIHcyID0gMCwgaDIgPSAwOwotCWludCB4LCB5LCB3LCBoOwotCWludCBkeCwgZHk7Ci0Jc3JhUmVnaW9uUHRyIHIsIHIwOwotCi1pZiAobmNkYiAmJiB2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgInNhdmUtdW5kZXJzICByZXN0b3JlOiAgICAweCVseCAgJTNkIFxuIiwgd2luLCBpZHgpOwotCQotCXgxID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JeTEgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQl3MSA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQloMSA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCi0JWF9MT0NLOwotCWlmICgqdmFsaWQpIHsKLQkJYXR0ci0+eCA9IHgxOwotCQlhdHRyLT55ID0geTE7Ci0JCWF0dHItPndpZHRoID0gdzE7Ci0JCWF0dHItPmhlaWdodCA9IGgxOwotCQl4MiA9IGF0dHItPng7Ci0JCXkyID0gYXR0ci0+eTsKLQkJdzIgPSBhdHRyLT53aWR0aDsKLQkJaDIgPSBhdHRyLT5oZWlnaHQ7Ci0JfSBlbHNlIGlmICghIHZhbGlkX3dyKGlkeCwgd2luLCBhdHRyKSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiU1VfcmVzdG9yZTogbm90IGEgdmFsaWQgWCB3aW5kb3c6IDB4JWx4XG4iLCB3aW4pOwotCQkqdmFsaWQgPSAwOwotCQl4MiA9IHgxOwotCQl5MiA9IHkxOwotCQl3MiA9IHcxOwotCQloMiA9IGgxOwotCX0gZWxzZSB7Ci0JCXgyID0gYXR0ci0+eDsKLQkJeTIgPSBhdHRyLT55OwotCQl3MiA9IGF0dHItPndpZHRoOwotCQloMiA9IGF0dHItPmhlaWdodDsKLQkJKnZhbGlkID0gMTsKLQl9Ci0JWF9VTkxPQ0s7Ci0KLQl4ID0gY2FjaGVfbGlzdFtpZHhdLnN1X3g7Ci0JeSA9IGNhY2hlX2xpc3RbaWR4XS5zdV95OwotCXcgPSBjYWNoZV9saXN0W2lkeF0uc3VfdzsKLQloID0gY2FjaGVfbGlzdFtpZHhdLnN1X2g7Ci0KLQlpZiAoeCA8IDAgfHwgY2FjaGVfbGlzdFtpZHhdLmJzX3ggPCAwIHx8IGNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID09IDAuMCkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiU1VfcmVzdDogc3VfeC9ic194L3N1X3RpbWU6ICVkICVkICUuM2ZcbiIsIHgsIGNhY2hlX2xpc3RbaWR4XS5ic194LCBjYWNoZV9saXN0W2lkeF0uc3VfdGltZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChuY2FjaGVfcGFkKSB7Ci0JCWlmIChub3BhZCkgewotCQkJeCArPSBuY2FjaGVfcGFkOwkKLQkJCXkgKz0gbmNhY2hlX3BhZDsJCi0JCQl3IC09IDIgKiBuY2FjaGVfcGFkOwkKLQkJCWggLT0gMiAqIG5jYWNoZV9wYWQ7CQotCQl9IGVsc2UgewotCQkJeDIgLT0gbmNhY2hlX3BhZDsJCi0JCQl5MiAtPSBuY2FjaGVfcGFkOwkKLQkJCXcyICs9IDIgKiBuY2FjaGVfcGFkOwkKLQkJCWgyICs9IDIgKiBuY2FjaGVfcGFkOwkKLQkJfQotCX0KLQotCWlmIChjbGlwc2hpZnQpIHsKLQkJeDIgLT0gY29mZl94OwotCQl5MiAtPSBjb2ZmX3k7Ci0JfQotCi0JaWYgKHcyID4gdykgewotCQl3MiA9IHc7Ci0JfQotCWlmIChoMiA+IGgpIHsKLQkJaDIgPSBoOwotCX0KLQotCXIwID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCXIgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHgrdzIsIHkraDIpOwotCi0JZHggPSB4MiAtIHg7IAotCWR5ID0geTIgLSB5OyAKLQotCXNyYVJnbk9mZnNldChyLCBkeCwgZHkpOwotCXNyYVJnbkFuZChyLCByMCk7Ci0KLQlpZiAoY2xpcCkgewotCQljbGlwX3JlZ2lvbihyLCB3aW4pOwotCX0KLQlpZiAocm1hc2sgIT0gTlVMTCkgewotCQlzcmFSZ25BbmQociwgcm1hc2spOwotCX0KLQotCWR0QSA9ICBkbm93eCgpOwotaWYgKG5jZGIgJiYgdmVyYikgZnByaW50ZihzdGRlcnIsICJTVV9yZXN0OiAlLjRmICAgICAgJWQgZHg9JWQgZHk9JWRcbiIsIGR0QSwgaWR4LCBkeCwgZHkpOwotCWlmICh3MiA+IDAgJiYgaDIgPiAwKSB7Ci0JCWNhY2hlX2NyKHIsIGR4LCBkeSwgcmVzdG9yZV9kZWxheTAsIHJlc3RvcmVfZGVsYXkxLCBuYmF0Y2gpOwotCX0KLQlkdEIgPSAgZG5vd3goKTsKLWlmIChuY2RiICYmIHZlcmIpIGZwcmludGYoc3RkZXJyLCAiU1VfcmVzdDogJS40ZiAlLjJmICVkIGRvbmUuICAlZHglZCslZCslZCAlZHglZCslZCslZCAgJS4yZiAlLjJmXG4iLCBkdEIsIGR0Qi1kdEEsIGlkeCwgdzEsIGgxLCB4MSwgeTEsIHcyLCBoMiwgeDIsIHkyLCBjYWNoZV9saXN0W2lkeF0uc3VfdGltZSAtIHgxMXZuY19zdGFydCwgZG5vd3goKSk7Ci0KLQlzcmFSZ25EZXN0cm95KHIwKTsKLQlzcmFSZ25EZXN0cm95KHIpOwotCi0JbGFzdF9zdV9yZXN0b3JlID0gZG5vdygpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgY2hlY2tfemVyb19yZWN0cyh2b2lkKSB7Ci0Jc3JhUmVjdCBydDsKLQlzcmFSZWN0YW5nbGVJdGVyYXRvciAqaXRlcjsKLQlpZiAoISB6ZXJvX3JlY3RzKSB7Ci0JCXplcm9fcmVjdHMgPSBzcmFSZ25DcmVhdGUoKTsKLQl9Ci0JaWYgKHNyYVJnbkVtcHR5KHplcm9fcmVjdHMpKSB7Ci0JCXJldHVybjsKLQl9Ci0JCQotCWl0ZXIgPSBzcmFSZ25HZXRJdGVyYXRvcih6ZXJvX3JlY3RzKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZydCkpIHsKLQkJemVyb19mYihydC54MSwgcnQueTEsIHJ0LngyLCBydC55Mik7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZChydC54MSwgcnQueTEsIHJ0LngyLCBydC55MiwgMCk7Ci0JfQotCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQlzcmFSZ25NYWtlRW1wdHkoemVyb19yZWN0cyk7Ci19Ci0KLXZvaWQgYmxvY2tfc3RhdHModm9pZCkgewotCWludCBuLCBrLCBzMSwgczI7Ci0Jc3RhdGljIGludCB0ID0gLTE7Ci0JaW50IHZjbnQsIGljbnQsIHRjbnQsIHZ0b3QgPSAwLCBpdG90ID0gMCwgdHRvdCA9IDA7Ci0JdCsrOwotCWZvciAobiA9IDE7IG4gPCBuY2FjaGUrMTsgbiArPSAyKSB7Ci0JCWRvdWJsZSBhcmVhID0gMC4wLCBmcmFjOwotCQl2Y250ID0gMDsKLQkJaWNudCA9IDA7Ci0JCXRjbnQgPSAwOwotCQlmb3Ioaz0wOyBrPGNhY2hlX2xpc3RfbnVtOyBrKyspIHsKLQkJCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JCQlpbnQgeCA9IGNhY2hlX2xpc3Rba10uYnNfeDsKLQkJCWludCB5ID0gY2FjaGVfbGlzdFtrXS5ic195OwotCQkJaW50IHcgPSBjYWNoZV9saXN0W2tdLmJzX3c7Ci0JCQlpbnQgaCA9IGNhY2hlX2xpc3Rba10uYnNfaDsKLQkJCWludCByYyA9IDA7Ci0JCQlXaW5kb3cgd2luID0gY2FjaGVfbGlzdFtrXS53aW47Ci0KLQkJCWlmICh3aW4gPT0gTm9uZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG4gPT0gMSkgewotCQkJCVhfTE9DSzsKLQkJCQlyYyA9IHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKTsKLQkJCQlYX1VOTE9DSzsKLQkJCQlpZiAocmMpIHsKLQkJCQkJdnRvdCsrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWl0b3QrKzsKLQkJCQl9Ci0JCQkJaWYgKHggPj0gMCkgewotCQkJCQl0dG90Kys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHkgPCBuKmRweV95IHx8IHkgPiAobisxKSpkcHlfeSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG4gIT0gMSkgewotCQkJCVhfTE9DSzsKLQkJCQlyYyA9IHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKTsKLQkJCQlYX1VOTE9DSzsKLQkJCX0KLQkJCWlmIChyYykgewotCQkJCXZjbnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWNudCsrOwotCQkJfQotCQkJaWYgKHggPj0gMCkgewotCQkJCXRjbnQrKzsKLQkJCX0KLQkJCWlmICh4IDwgMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXJlYSArPSBjYWNoZV9saXN0W2tdLndpZHRoICogY2FjaGVfbGlzdFtrXS5oZWlnaHQ7Ci0JCQlpZiAoISByYyAmJiAhIG1hY29zeF9jb25zb2xlKSB7Ci0JCQkJY2hhciAqdSA9IGdldGVudigiVVNFUiIpOwotCQkJCWlmICh1ICYmICFzdHJjbXAodSwgInJ1bmdlIikpCWZwcmludGYoc3RkZXJyLCAiXGEiKTsKLQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJcbiAgICoqKiBVTlJFQ0xBSU1FRCBXSU5ET1c6IDB4JWx4ICAlZHglZCslZCslZFxuXG4iLCB3aW4sIHcsIGgsIHgsIHkpOwotCQkJCURFTEVURShrKTsKLQkJCX0KLQkJCWlmICh0IDwgMyB8fCAodCAlIDQpID09IDAgfHwgaGFja192YWwgfHwgbWFjb3N4X2NvbnNvbGUpIHsKLQkJCQlkb3VibGUgdDEgPSBjYWNoZV9saXN0W2tdLnN1X3RpbWU7Ci0JCQkJZG91YmxlIHQyID0gY2FjaGVfbGlzdFtrXS5ic190aW1lOwotCQkJCWlmICh0MSA+IDAuMCkge3QxID0gZG5vdygpIC0gdDE7fSBlbHNlIHt0MSA9IC0xLjA7fQotCQkJCWlmICh0MiA+IDAuMCkge3QyID0gZG5vdygpIC0gdDI7fSBlbHNlIHt0MiA9IC0xLjA7fQotCQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgWyUwMmRdICUwNGQgMHglMDhseCBiczogJTA0ZHglMDRkKyUwNGQrJTA1ZCB2dzogJTA0ZHglMDRkKyUwNGQrJTA0ZCBjbDogJTA0ZHglMDRkKyUwNGQrJTA0ZCBtYXA9JWQgc3U9JTkuM2YgYnM9JTkuM2YgY250PSVkLyVkXG4iLAotCQkJCSAgICBuLCBrLCB3aW4sIHcsIGgsIHgsIHksIGF0dHIud2lkdGgsIGF0dHIuaGVpZ2h0LCBhdHRyLngsIGF0dHIueSwKLQkJCQkgICAgY2FjaGVfbGlzdFtrXS53aWR0aCwgY2FjaGVfbGlzdFtrXS5oZWlnaHQsIGNhY2hlX2xpc3Rba10ueCwgY2FjaGVfbGlzdFtrXS55LAotCQkJCSAgICBhdHRyLm1hcF9zdGF0ZSA9PSBJc1ZpZXdhYmxlLCB0MSwgdDIsIGNhY2hlX2xpc3Rba10uY3JlYXRlX2NudCwgY2FjaGVfbGlzdFtrXS5tYXBfY250KTsgCi0JCQl9Ci0JCX0KLQkJZnJhYyA9IGFyZWEgLyhkcHlfeCAqIGRweV95KTsKLQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiYmxvY2tbJTAyZF0gICUuM2YgICU4ZCAgdHJhay92YWwvaW52YWw6ICVkLyVkLyVkIG9mICVkXG4iLCBuLCBmcmFjLCAoaW50KSBhcmVhLCB0Y250LCB2Y250LCBpY250LCB2Y250K2ljbnQpOwotCX0KLQotCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiYmxvY2s6IHRyYWsvdmFsL2ludmFsICVkLyVkLyVkIG9mICVkXG4iLCB0dG90LCB2dG90LCBpdG90LCB2dG90K2l0b3QpOwotCi0JczEgPSBmcl9SRUdJT04gICsgZnJfR1JJRCAgKyBmcl9FWFBJUkUgICsgZnJfRk9SQ0UgICsgZnJfQklHMSAgKyBmcl9CSUcyICArIGZyX0ZBSUw7Ci0JczIgPSBmcl9SRUdJT050ICsgZnJfR1JJRHQgKyBmcl9FWFBJUkV0ICsgZnJfRk9SQ0V0ICsgZnJfQklHMXQgKyBmcl9CSUcydCArIGZyX0ZBSUx0OwotCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiZmluZF9yZWN0OiAgUkVHSU9OL0dSSUQvRVhQSVJFL0ZPUkNFIC0gQklHMS9CSUcyL0ZBSUwgICVkLyVkLyVkLyVkIC0gJWQvJWQvJWQgIG9mICVkXG4iLAotCSAgICBmcl9SRUdJT04sICBmcl9HUklELCAgZnJfRVhQSVJFLCAgZnJfRk9SQ0UsICBmcl9CSUcxLCAgZnJfQklHMiwgIGZyX0ZBSUwsIHMxKTsKLQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbHM6ICAgICAgICAgJWQvJWQvJWQvJWQgLSAlZC8lZC8lZCAgb2YgJWRcbiIsCi0JICAgIGZyX1JFR0lPTnQsIGZyX0dSSUR0LCBmcl9FWFBJUkV0LCBmcl9GT1JDRXQsIGZyX0JJRzF0LCBmcl9CSUcydCwgZnJfRkFJTHQsIHMyKTsKLQotCWZyX0JJRzEgPSAwOwotCWZyX0JJRzIgPSAwOwotCWZyX1JFR0lPTiA9IDA7Ci0JZnJfR1JJRCA9IDA7Ci0JZnJfRVhQSVJFID0gMDsKLQlmcl9GT1JDRSA9IDA7Ci0JZnJfRkFJTCA9IDA7Ci0JaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLQotI2RlZmluZSBOU0NIRUQgMTI4Ci1XaW5kb3cgc2NoZWRfYnNbTlNDSEVEXTsKLWRvdWJsZSBzY2hlZF90bVtOU0NIRURdOwotZG91YmxlIGxhc3Rfc2NoZWRfYnMgPSAwLjA7Ci0KLSNkZWZpbmUgU0NIRUQodywgdikgXAoteyBcCi0JaW50IGssIHNhdmUgPSAtMSwgZW1wdHkgPSAxOyBcCi0JZm9yIChrPTA7IGsgPCBOU0NIRUQ7IGsrKykgeyBcCi0JCWlmIChzY2hlZF9ic1trXSA9PSBOb25lKSB7IFwKLQkJCXNhdmUgPSBrOyBcCi0JCX0gXAotCQlpZiAoc2NoZWRfYnNba10gPT0gdykgeyBcCi0JCQlzYXZlID0gazsgXAotCQkJZW1wdHkgPSAwOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLQl9IFwKLQlpZiAoc2F2ZSA+PSAwKSB7IFwKLQkJc2NoZWRfYnNbc2F2ZV0gPSB3OyBcCi0JCWlmIChlbXB0eSkgeyBcCi0JCQlzY2hlZF90bVtzYXZlXSA9IGRub3coKTsgXAotCQkJaWYgKHYgJiYgbmNkYikgZnByaW50ZihzdGRlcnIsICJTQ0hFRDogJWQgJWZcbiIsIHNhdmUsIGRub3d4KCkpOyBcCi0JCX0gXAotCX0gXAotfQotCi12b2lkIHhzZWxlY3RpbnB1dChXaW5kb3cgdywgdW5zaWduZWQgbG9uZyBldm1hc2ssIGludCBzeW5jKSB7Ci0jaWYgTk9fWDExCi0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCXRyYXBwZWRfeGlvZXJyb3IgPSAwOwotCWlmICghZXZtYXNrKSB7fQotI2Vsc2UKLQlYRXJyb3JIYW5kbGVyICAgb2xkX2hhbmRsZXIxOwotCVhJT0Vycm9ySGFuZGxlciBvbGRfaGFuZGxlcjI7Ci0KLQlpZiAobWFjb3N4X2NvbnNvbGUgfHwgIWRweSkgewotCQlyZXR1cm47Ci0JfQotCi0Jb2xkX2hhbmRsZXIxID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0Jb2xkX2hhbmRsZXIyID0gWFNldElPRXJyb3JIYW5kbGVyKHRyYXBfeGlvZXJyb3IpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQl0cmFwcGVkX3hpb2Vycm9yID0gMDsKLQotCVhTZWxlY3RJbnB1dChkcHksIHcsIGV2bWFzayk7Ci0KLQkvKgotCSAqIFdlIHNlZW0gdG8gbmVlZCB0byBzeW5jaHJvbml6ZSByaWdodCBhd2F5IHNpbmNlIHRoZSB3aW5kb3cKLQkgKiBtaWdodCBnbyBhd2F5IHF1aWNrbHkuCi0JICovCi0JaWYgKHN5bmMpIHsKLQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JfSBlbHNlIHsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JfQotCi0JWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcjEpOwotCVhTZXRJT0Vycm9ySGFuZGxlcihvbGRfaGFuZGxlcjIpOwotI2VuZGlmCi0KLQlpZiAodHJhcHBlZF94ZXJyb3IpIHsKLQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiWFNFTEVDVElOUFVUOiB0cmFwcGVkIFggRXJyb3IuIik7Ci0JfQotCWlmICh0cmFwcGVkX3hpb2Vycm9yKSB7Ci0JCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlhTRUxFQ1RJTlBVVDogdHJhcHBlZCBYSU8gRXJyb3IuIik7Ci0JfQotaWYgKHN5bmMgJiYgbmNkYikgZnByaW50ZihzdGRlcnIsICJYU0VMRUNUSU5QVVQ6IDB4JWx4ICBzeW5jPSVkIGVycj0lZC8lZFxuIiwgdywgc3luYywgdHJhcHBlZF94ZXJyb3IsIHRyYXBwZWRfeGlvZXJyb3IpOwotfQotCi1Cb29sIHhjaGVja21hc2tldmVudChEaXNwbGF5ICpkLCBsb25nIG1hc2ssIFhFdmVudCAqZXYpIHsKLSNpZmRlZiBNQUNPU1gKLQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJaWYgKG1hY29zeF9jaGVja2V2ZW50KGV2KSkgewotCQkJcmV0dXJuIFRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gRmFsc2U7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlSQVdGQl9SRVQoRmFsc2UpOwotCi0jaWYgTk9fWDExCi0JaWYgKCFkIHx8ICFtYXNrKSB7fQotCXJldHVybiBGYWxzZTsKLSNlbHNlCi0JcmV0dXJuIFhDaGVja01hc2tFdmVudChkLCBtYXNrLCBldik7Ci0jZW5kaWYKLX0KLQotI2luY2x1ZGUgPHJmYi9kZWZhdWx0OHgxNi5oPgotCi0jZGVmaW5lIEVWTUFYIDIwNDgKLVhFdmVudCBFdltFVk1BWF07Ci1pbnQgRXZfZG9uZVtFVk1BWF07Ci1pbnQgRXZfb3JkZXJbRVZNQVhdOwotaW50IEV2X2FyZWFbRVZNQVhdOwotaW50IEV2X3RtcFtFVk1BWF07Ci1pbnQgRXZfdG1wMltFVk1BWF07Ci1XaW5kb3cgRXZfdG1wd2luW0VWTUFYXTsKLVdpbmRvdyBFdl93aW5bRVZNQVhdOwotV2luZG93IEV2X21hcFtFVk1BWF07Ci1XaW5kb3cgRXZfdW5tYXBbRVZNQVhdOwotc3JhUmVjdCBFdl9yZWN0c1tFVk1BWF07Ci0KLWludCB0bXBfc3RhY2tbU1RBQ0tNQVhdOwotc3JhUmVnaW9uUHRyIHRtcF9yZWdbU1RBQ0tNQVhdOwotCi0jZGVmaW5lIENMRUFOX09VVCBcCi0JZm9yIChpPTA7IGkgPCBuOyBpKyspIHsgXAotCQlzcmFSZ25EZXN0cm95KHRtcF9yZWdbaV0pOyBcCi0JfSBcCi0JaWYgKHIxKSBzcmFSZ25EZXN0cm95KHIxKTsgXAotCWlmIChyMCkgc3JhUmduRGVzdHJveShyMCk7Ci0KLWludCB0cnlfdG9fZml4X3Jlc2l6ZV9zdShXaW5kb3cgb3JpZ19mcmFtZSwgaW50IG9yaWdfeCwgaW50IG9yaWdfeSwgaW50IG9yaWdfdywgaW50IG9yaWdfaCwKLSAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHRyeV9iYXRjaCkgewotCi0JaW50IGlkeCA9IGxvb2t1cF93aW5faW5kZXgob3JpZ19mcmFtZSk7Ci0Jc3JhUmVnaW9uUHRyIHIwLCByMSwgcjIsIHIzOwotCWludCBzeDEsIHN5MSwgc3cxLCBzaDEsIGR4LCBkeTsKLQlpbnQgYngxLCBieTEsIGJ3MSwgYmgxOwotCWludCBuciA9IDAsICpuYmF0ID0gTlVMTDsKLQotCWlmIChpZHggPCAwKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY2FjaGVfbGlzdFtpZHhdLmJzX3ggPCAwIHx8IGNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID09IDAuMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3Qob3JpZ194LCBvcmlnX3ksIG9yaWdfeCtvcmlnX3csIG9yaWdfeStvcmlnX2gpOwotCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4LCB5LCB4K3csIHkraCk7Ci0KLQlzcmFSZ25BbmQocjEsIHIwKTsKLQlzcmFSZ25BbmQocjIsIHIwKTsKLQotCWlmICh0cnlfYmF0Y2gpIHsKLQkJbmJhdCA9ICZucjsKLQl9Ci0JCi0JaWYgKG9yaWdfdyA+PSB3ICYmIG9yaWdfaCA+PSBoKSB7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlNocmlua2luZyByZXNpemUgJWQgICVkeCVkKyVkKyVkIC0+ICVkeCVkKyVkKyVkXG4iLCBpZHgsIG9yaWdfdywgb3JpZ19oLCBvcmlnX3gsIG9yaWdfeSwgdywgaCwgeCwgeSk7Ci0JCXIzID0gc3JhUmduQ3JlYXRlUmduKHIxKTsKLQkJc3JhUmduU3VidHJhY3QocjMsIHIyKTsKLQotCQlzeDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfeDsKLQkJc3kxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3k7Ci0JCXN3MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV93OwotCQlzaDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfaDsKLQotCQlkeCA9IG9yaWdfeCAtIHN4MTsKLQkJZHkgPSBvcmlnX3kgLSBzeTE7Ci0KLQkJY2FjaGVfY3IocjMsIGR4LCBkeSwgMC4wNzUsIDAuMDUsIG5iYXQpOwotCQlzcmFSZ25EZXN0cm95KHIzKTsKLQotCQlyMyA9IHNyYVJnbkNyZWF0ZVJnbihyMSk7Ci0JCXNyYVJnbkFuZChyMywgcjIpOwotCi0JCWR4ID0gc3gxIC0gb3JpZ194OwotCQlkeSA9IHN5MSAtIG9yaWdfeTsKLQkJc3JhUmduT2Zmc2V0KHIzLCBkeCwgZHkpOwotCi0JCWR4ID0gb3JpZ194IC0geDsKLQkJZHkgPSBvcmlnX3kgLSB5OwotCQlzcmFSZ25PZmZzZXQocjMsIGR4LCBkeSk7Ci0KLQkJY2FjaGVfY3IocjMsIGR4LCBkeSwgMC4wNzUsIDAuMDUsIG5iYXQpOwotCQlzcmFSZ25EZXN0cm95KHIzKTsKLQotCQlpZiAobnIpIHsKLQkJCWJhdGNoX3B1c2gobnIsIC0xLjApOwotCQl9Ci0KLQkJY2FjaGVfbGlzdFtpZHhdLnggPSB4OwotCQljYWNoZV9saXN0W2lkeF0ueSA9IHk7Ci0JCWNhY2hlX2xpc3RbaWR4XS53aWR0aCA9IHc7Ci0JCWNhY2hlX2xpc3RbaWR4XS5oZWlnaHQgPSBoOwotCi0JCWNhY2hlX2xpc3RbaWR4XS5ic193ID0gdzsKLQkJY2FjaGVfbGlzdFtpZHhdLmJzX2ggPSBoOwotCQljYWNoZV9saXN0W2lkeF0uc3VfdyA9IHc7Ci0JCWNhY2hlX2xpc3RbaWR4XS5zdV9oID0gaDsKLQotCQljYWNoZV9saXN0W2lkeF0uYnNfdGltZSA9IDAuMDsKLQkJLyogWFhYIFkgKi8KLQkJaWYgKDApIGNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID0gZG5vdygpOwotCX0gZWxzZSB7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJHcm93aW5nIHJlc2l6ZSAlZCAgJWR4JWQrJWQrJWQgLT4gJWR4JWQrJWQrJWRcbiIsIGlkeCwgb3JpZ193LCBvcmlnX2gsIG9yaWdfeCwgb3JpZ195LCB3LCBoLCB4LCB5KTsKLQotCQlzeDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfeDsKLQkJc3kxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3k7Ci0JCXN3MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV93OwotCQlzaDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfaDsKLQotCQlieDEgPSBjYWNoZV9saXN0W2lkeF0uYnNfeDsKLQkJYnkxID0gY2FjaGVfbGlzdFtpZHhdLmJzX3k7Ci0JCWJ3MSA9IGNhY2hlX2xpc3RbaWR4XS5ic193OwotCQliaDEgPSBjYWNoZV9saXN0W2lkeF0uYnNfaDsKLQkJCi0JCWlmIChmaW5kX3JlY3QoaWR4LCB4LCB5LCB3LCBoKSkgewotCQkJcjMgPSBzcmFSZ25DcmVhdGVSZ24ocjIpOwotCQkJc3JhUmduQW5kKHIzLCByMSk7Ci0KLQkJCWR4ID0gY2FjaGVfbGlzdFtpZHhdLnN1X3ggLSB4OwotCQkJZHkgPSBjYWNoZV9saXN0W2lkeF0uc3VfeSAtIHk7Ci0JCi0JCQlzcmFSZ25PZmZzZXQocjMsIGR4LCBkeSk7Ci0KLQkJCWR4ID0gZHggLSAoc3gxIC0gb3JpZ194KTsKLQkJCWR5ID0gZHkgLSAoc3kxIC0gb3JpZ195KTsKLQkJCQotCQkJY2FjaGVfY3IocjMsIGR4LCBkeSwgMC4wNzUsIDAuMDUsIG5iYXQpOwotCQkJc3JhUmduRGVzdHJveShyMyk7Ci0KLQkJCXIzID0gc3JhUmduQ3JlYXRlUmduKHIyKTsKLQkJCXNyYVJnblN1YnRyYWN0KHIzLCByMSk7Ci0KLQkJCWR4ID0gY2FjaGVfbGlzdFtpZHhdLnN1X3ggLSB4OwotCQkJZHkgPSBjYWNoZV9saXN0W2lkeF0uc3VfeSAtIHk7Ci0JCi0JCQlzcmFSZ25PZmZzZXQocjMsIGR4LCBkeSk7Ci0KLQkJCWNhY2hlX2NyKHIzLCBkeCwgZHksIDAuMDc1LCAwLjA1LCBuYmF0KTsKLQkJCXNyYVJnbkRlc3Ryb3kocjMpOwotCi0JCQlpZiAobnIpIHsKLQkJCQliYXRjaF9wdXNoKG5yLCAtMS4wKTsKLQkJCX0KLQotCQkJY2FjaGVfbGlzdFtpZHhdLmJzX3RpbWUgPSAwLjA7Ci0JCQkvKiBYWFggWSAqLwotCQkJaWYgKDApIGNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID0gZG5vdygpOwotCQl9Ci0JfQotCQotCXNyYVJnbkRlc3Ryb3kocjApOwotCXNyYVJnbkRlc3Ryb3kocjEpOwotCXNyYVJnbkRlc3Ryb3kocjIpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCB0cnlfdG9fZml4X3N1KFdpbmRvdyB3aW4sIGludCBpZHgsIFdpbmRvdyBhYm92ZSwgaW50ICpuYmF0Y2gsIGNoYXIgKm1vZGUpIHsKLQlpbnQgaSwgaWR4MiwgbiA9IDAsIGZvdW5kID0gMCwgZm91bmRfYWJvdmUgPSAwOyAJCi0Jc3JhUmVnaW9uUHRyIHIwLCByMSwgcjI7Ci0JV2luZG93IHdpbjI7Ci0JaW50IHgsIHksIHcsIGgsIG9uID0gMDsKLQlpbnQgeDAsIHkwLCB3MCwgaDA7Ci0JaW50IHgxLCB5MSwgdzEsIGgxOwotCWludCB4MiwgeTIsIHcyLCBoMjsKLQlpbnQgdW5tYXBwZWQgPSAwOwotCWludCBtb3ZlZCA9IDA7Ci0KLQotCWlmIChtb2RlICYmICFzdHJjbXAobW9kZSwgInVubWFwcGVkIikpIHsKLQkJdW5tYXBwZWQgPSAxOwotCX0gZWxzZSBpZiAobW9kZSAmJiAhc3RyY21wKG1vZGUsICJtb3ZlZCIpKSB7Ci0JCW1vdmVkID0gMTsKLQl9Ci0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiVFJZX1RPX0ZJWF9TVSglZCkgIDB4JWx4ICAweCVseCB3YXNfdW5tYXBwZWQ9JWQgbWFwX3N0YXRlPSVzXG4iLCBpZHgsIHdpbiwgYWJvdmUsIHVubWFwcGVkLCBNU3RhdGUoY2FjaGVfbGlzdFtpZHhdLm1hcF9zdGF0ZSkpOwotCi0JaWYgKGNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSAmJiAhdW5tYXBwZWQpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjYWNoZV9saXN0W2lkeF0uc3VfdGltZSA9PSAwLjApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjYWNoZV9saXN0W2lkeF0uYnNfeCA8IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0KLQl4ID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JeSA9IGNhY2hlX2xpc3RbaWR4XS55OwotCXcgPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7Ci0JaCA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0KLQlyMSA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCt3LCB5K2gpOwotCi0Jc3JhUmduQW5kKHIxLCByMCk7Ci0KLQlpZiAoc3JhUmduRW1wdHkocjEpKSB7Ci0JCUNMRUFOX09VVAotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodW5tYXBwZWQpIHsKLQkJb24gPSAxOwotCX0KLQlpZiAoYWJvdmUgPT0gMHgxKSB7Ci0JCW9uID0gMTsKLQl9Ci0JZm9yIChpID0gb2xkX3N0YWNrX24gLSAxOyBpID49IDA7IGktLSkgewotCQl3aW4yID0gb2xkX3N0YWNrW2ldOwotCQlpZiAod2luMiA9PSBhYm92ZSkgewotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiMHglbHggdHVybiBvbjogIDB4JWx4ICBpPSVkXG4iLCB3aW4sIHdpbjIsIGkpOwotCQkJb24gPSAxOwotCQkJZm91bmRfYWJvdmUgPSAxOwotCQl9Ci0JCWlmICh3aW4yID09IHdpbikgewotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiMHglbHggdHVybiBvZmY6IDB4JWx4ICBpPSVkXG4iLCB3aW4sIHdpbjIsIGkpOwotCQkJZm91bmQgPSAxOwotCQkJb24gPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCEgb24pIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlkeDIgPSBsb29rdXBfd2luX2luZGV4KHdpbjIpOwotCQlpZiAoaWR4MiA8IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChjYWNoZV9saXN0W2lkeDJdLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2FjaGVfbGlzdFtpZHgyXS5ic194IDwgMCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJLyogWFhYIEludmFsaWRhdGU/ICovCi0KLQkJeDIgPSBjYWNoZV9saXN0W2lkeDJdLng7Ci0JCXkyID0gY2FjaGVfbGlzdFtpZHgyXS55OwotCQl3MiA9IGNhY2hlX2xpc3RbaWR4Ml0ud2lkdGg7Ci0JCWgyID0gY2FjaGVfbGlzdFtpZHgyXS5oZWlnaHQ7Ci0KLQkJcjIgPSBzcmFSZ25DcmVhdGVSZWN0KHgyLCB5MiwgeDIrdzIsIHkyK2gyKTsKLQkJc3JhUmduQW5kKHIyLCByMCk7Ci0JCWlmICghIHNyYVJnbkFuZChyMiwgcjEpKSB7Ci0JCQlzcmFSZ25EZXN0cm95KHIyKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJdG1wX3JlZ1tuXSA9IHIyOwotCQl0bXBfc3RhY2tbbisrXSA9IGlkeDI7Ci0JfQotCi0JaWYgKCEgZm91bmQpIHsKLQkJQ0xFQU5fT1VUCi0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewotCQlpbnQgaTI7Ci0JCXIyID0gc3JhUmduQ3JlYXRlUmduKHRtcF9yZWdbaV0pOwotCQlmb3IgKGkyID0gaSArIDE7IGkyIDwgbjsgaTIrKykgIHsKLQkJCXNyYVJnblN1YnRyYWN0KHIyLCB0bXBfcmVnW2kyXSk7Ci0JCX0KLQkJaWR4MiA9IHRtcF9zdGFja1tpXTsKLQkJaWYgKCFzcmFSZ25FbXB0eShyMikpIHsKLQkJCWludCBkeCwgZHk7Ci0JCQlpbnQgZHgyLCBkeTI7Ci0KLQkJCXgwID0gY2FjaGVfbGlzdFtpZHgyXS54OwotCQkJeTAgPSBjYWNoZV9saXN0W2lkeDJdLnk7Ci0JCQl3MCA9IGNhY2hlX2xpc3RbaWR4Ml0ud2lkdGg7Ci0JCQloMCA9IGNhY2hlX2xpc3RbaWR4Ml0uaGVpZ2h0OwotCi0JCQl4MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV94OwkvKiBTVSAtPiBTVSAqLwotCQkJeTEgPSBjYWNoZV9saXN0W2lkeF0uc3VfeTsKLQkJCXcxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3c7Ci0JCQloMSA9IGNhY2hlX2xpc3RbaWR4XS5zdV9oOwotCi0JCQl4MiA9IGNhY2hlX2xpc3RbaWR4Ml0uc3VfeDsKLQkJCXkyID0gY2FjaGVfbGlzdFtpZHgyXS5zdV95OwotCQkJdzIgPSBjYWNoZV9saXN0W2lkeDJdLnN1X3c7Ci0JCQloMiA9IGNhY2hlX2xpc3RbaWR4Ml0uc3VfaDsKLQotCQkJZHggPSB4MiAtIHgwOwotCQkJZHkgPSB5MiAtIHkwOwotCQkJc3JhUmduT2Zmc2V0KHIyLCBkeCwgZHkpOwotCi0JCQlkeDIgPSB4MSAtIHg7Ci0JCQlkeTIgPSB5MSAtIHk7Ci0JCQlkeCA9IGR4IC0gZHgyOwotCQkJZHkgPSBkeSAtIGR5MjsKLQkJCWNhY2hlX2NyKHIyLCBkeCwgZHksIHNhdmVfZGVsYXkwLCBzYXZlX2RlbGF5MSwgbmJhdGNoKTsKLQkJfQotCQlzcmFSZ25EZXN0cm95KHIyKTsKLQl9Ci0KLQlpZiAodW5tYXBwZWQpIHsKLQkJQ0xFQU5fT1VUCi0JCXJldHVybiBmb3VuZF9hYm92ZTsKLQl9Ci0KLQlmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJcjIgPSBzcmFSZ25DcmVhdGVSZ24odG1wX3JlZ1tpXSk7Ci0JCWlkeDIgPSB0bXBfc3RhY2tbaV07Ci0JCWlmICghc3JhUmduRW1wdHkocjIpKSB7Ci0JCQlpbnQgZHgsIGR5OwotCQkJaW50IGR4MiwgZHkyOwotCi0JCQl4MCA9IGNhY2hlX2xpc3RbaWR4Ml0ueDsKLQkJCXkwID0gY2FjaGVfbGlzdFtpZHgyXS55OwotCQkJdzAgPSBjYWNoZV9saXN0W2lkeDJdLndpZHRoOwotCQkJaDAgPSBjYWNoZV9saXN0W2lkeDJdLmhlaWdodDsKLQotCQkJeDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfeDsJLyogQlMgLT4gU1UgKi8KLQkJCXkxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3k7Ci0JCQl3MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV93OwotCQkJaDEgPSBjYWNoZV9saXN0W2lkeF0uc3VfaDsKLQotCQkJeDIgPSBjYWNoZV9saXN0W2lkeDJdLmJzX3g7Ci0JCQl5MiA9IGNhY2hlX2xpc3RbaWR4Ml0uYnNfeTsKLQkJCXcyID0gY2FjaGVfbGlzdFtpZHgyXS5ic193OwotCQkJaDIgPSBjYWNoZV9saXN0W2lkeDJdLmJzX2g7Ci0KLQkJCWR4ID0geDEgLSB4OwotCQkJZHkgPSB5MSAtIHk7Ci0JCQlzcmFSZ25PZmZzZXQocjIsIGR4LCBkeSk7Ci0KLQkJCWR4MiA9IHgyIC0geDA7Ci0JCQlkeTIgPSB5MiAtIHkwOwotCQkJZHggPSBkeCAtIGR4MjsKLQkJCWR5ID0gZHkgLSBkeTI7Ci0JCQljYWNoZV9jcihyMiwgZHgsIGR5LCBzYXZlX2RlbGF5MCwgc2F2ZV9kZWxheTEsIG5iYXRjaCk7Ci0JCX0KLQkJc3JhUmduRGVzdHJveShyMik7Ci0JfQotCi0JQ0xFQU5fT1VUCi0JcmV0dXJuIGZvdW5kX2Fib3ZlOwotfQotCi12b2lkIGlkeF9hZGRfcmduKHNyYVJlZ2lvblB0ciByLCBzcmFSZWdpb25QdHIgcjAsIGludCBpZHgpIHsKLQlpbnQgeCwgeSwgdywgaDsKLQlzcmFSZWdpb25QdHIgcnRtcDsKLQkKLQlpZiAoaWR4IDwgMCkgewotCQlyZXR1cm47Ci0JfQotCXggPSBjYWNoZV9saXN0W2lkeF0ueDsKLQl5ID0gY2FjaGVfbGlzdFtpZHhdLnk7Ci0JdyA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQloID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQotCXJ0bXAgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHcsIGgpOwotCWlmIChyMCkgewotCQlzcmFSZ25BbmQocnRtcCwgcjApOwotCX0KLQlzcmFSZ25PcihyLCBydG1wKTsKLQlzcmFSZ25EZXN0cm95KHJ0bXApOwotfQotCi1zcmFSZWdpb25QdHIgaWR4X2NyZWF0ZV9yZ24oc3JhUmVnaW9uUHRyIHIwLCBpbnQgaWR4KSB7Ci0JaW50IHgsIHksIHcsIGg7Ci0Jc3JhUmVnaW9uUHRyIHJ0bXA7Ci0JCi0JaWYgKGlkeCA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXggPSBjYWNoZV9saXN0W2lkeF0ueDsKLQl5ID0gY2FjaGVfbGlzdFtpZHhdLnk7Ci0JdyA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQloID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQotCXJ0bXAgPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHcsIGgpOwotCWlmIChyMCkgewotCQlzcmFSZ25BbmQocnRtcCwgcjApOwotCX0KLQlyZXR1cm4gcnRtcDsKLX0KLQotdm9pZCBzY2FsZV9tYXJrX3hyb290cG1hcCh2b2lkKSB7Ci0JY2hhciAqZHN0X2ZiLCAqc3JjX2ZiID0gbWFpbl9mYjsKLQlpbnQgZHN0X2JwbCwgQnBwID0gYnBwLzgsIGZhYyA9IDE7Ci0JaW50IHluID0gKG5jYWNoZSsxKSAqIGRweV95OwotCWludCB5ZmFjID0gKG5jYWNoZSsyKTsKLQlpbnQgbWFyayA9IDE7Ci0KLQlpZiAoIXNjYWxpbmcgfHwgIXJmYl9mYiB8fCByZmJfZmIgPT0gbWFpbl9mYikgewotCQltYXJrX3JlY3RfYXNfbW9kaWZpZWQoMCwgeW4sIGRweV94LCB5biArIGRweV95LCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjbWFwOHRvMjQgJiYgY21hcDh0bzI0X2ZiKSB7Ci0JCXNyY19mYiA9IGNtYXA4dG8yNF9mYjsKLQkJaWYgKHNjYWxpbmcpIHsKLQkJCWlmIChkZXB0aCA8PSA4KSB7Ci0JCQkJZmFjID0gNDsKLQkJCX0gZWxzZSBpZiAoZGVwdGggPD0gMTYpIHsKLQkJCQlmYWMgPSAyOwotCQkJfQotCQl9Ci0JfQotCWRzdF9mYiA9IHJmYl9mYjsKLQlkc3RfYnBsID0gcmZiX2J5dGVzX3Blcl9saW5lOwotCi0Jc2NhbGVfcmVjdChzY2FsZV9mYWNfeCwgc2NhbGVfZmFjX3ksIHNjYWxpbmdfYmxlbmQsIHNjYWxpbmdfaW50ZXJwb2xhdGUsIGZhYyAqIEJwcCwKLQkgICAgc3JjX2ZiLCBmYWMgKiBtYWluX2J5dGVzX3Blcl9saW5lLCBkc3RfZmIsIGRzdF9icGwsIGRweV94LCB5ZmFjICogZHB5X3ksCi0JICAgIHNjYWxlZF94LCB5ZmFjICogc2NhbGVkX3ksIDAsIHluLCBkcHlfeCwgeW4gKyBkcHlfeSwgbWFyayk7Ci19Ci0KLXZvaWQgc2V0X25jYWNoZV94cm9vdHBtYXAodm9pZCkgewotCUF0b20gcG1hcCwgdHlwZTsKLQlpbnQgZm9ybWF0OwotCXVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBhZnRlcjsKLQlYSW1hZ2UgKmltYWdlID0gTlVMTDsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCi0JUkFXRkJfUkVUX1ZPSUQKLSNpZiAhTk9fWDExCi0JaWYgKCFuY2FjaGUpIHsKLQkJcmV0dXJuOwotCX0KLQlYX0xPQ0s7Ci0Jb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JcG1hcCA9IFhJbnRlcm5BdG9tKGRweSwgIl9YUk9PVFBNQVBfSUQiLCBUcnVlKTsKLQotCWlmICh1c2Vfc29saWRfYmcpIHsKLQkJaW1hZ2UgPSBzb2xpZF9pbWFnZShOVUxMKTsKLQkJaWYgKCFxdWlldCkgewotCQkJcmZiTG9nKCJzZXRfbmNhY2hlX3hyb290cG1hcDogc29saWRfaW1hZ2VcbiIpOwotCQl9Ci0JfSBlbHNlIGlmIChwbWFwICE9IE5vbmUpIHsKLQkJUGl4bWFwIHBpeG1hcCA9IE5vbmU7Ci0JCXVuc2lnbmVkIGNoYXIgKmRfcG1hcDsKLQotCQlYR2V0V2luZG93UHJvcGVydHkoZHB5LCByb290d2luLCBwbWFwLCAwTCwgMUwsIEZhbHNlLAotCQkgICAgQW55UHJvcGVydHlUeXBlLCAmdHlwZSwgJmZvcm1hdCwgJmxlbmd0aCwgJmFmdGVyLCAmZF9wbWFwKTsKLQotCQlpZiAobGVuZ3RoICE9IDApIHsKLQkJCXBpeG1hcCA9ICooKFBpeG1hcCAqKSBkX3BtYXApOwotCQkJaWYgKHBpeG1hcCAhPSBOb25lKSB7Ci0JCQkJaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCBwaXhtYXAsIDAsIDAsIGRweV94LCBkcHlfeSwgQWxsUGxhbmVzLCBaUGl4bWFwKTsKLQkJCX0KLQkJfQotCQlpZiAoIXF1aWV0KSB7Ci0JCQlyZmJMb2coInNldF9uY2FjaGVfeHJvb3RwbWFwOiBsb2FkaW5nIGJhY2tncm91bmQgcGl4bWFwOiAweCVseFxuIiwgcGl4bWFwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghcXVpZXQpIHsKLQkJCXJmYkxvZygic2V0X25jYWNoZV94cm9vdHBtYXA6IHRyeWluZyByb290IGJhY2tncm91bmRcbiIpOwotCQl9Ci0JfQotCWlmIChpbWFnZSA9PSBOVUxMKSB7Ci0JCWltYWdlID0gc29saWRfcm9vdCgoY2hhciAqKSAweDEpOwotCX0KLQlpZiAoaW1hZ2UgIT0gTlVMTCkgewotCQljaGFyICpzcmMsICpkc3Q7Ci0JCWludCBsaW5lOwotCQlpbnQgcGl4ZWxzaXplID0gYnBwLzg7Ci0JCWludCB5MSA9IGRweV95ICogKG5jYWNoZSsxKTsKLQotCQlzcmMgPSBpbWFnZS0+ZGF0YTsKLQkJZHN0ID0gbWFpbl9mYiArIHkxICogbWFpbl9ieXRlc19wZXJfbGluZTsKLQkJbGluZSA9IDA7Ci0JCXdoaWxlIChsaW5lKysgPCBkcHlfeSkgewotCQkJbWVtY3B5KGRzdCwgc3JjLCBkcHlfeCAqIHBpeGVsc2l6ZSk7Ci0JCQlzcmMgKz0gaW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwotCQkJZHN0ICs9IG1haW5fYnl0ZXNfcGVyX2xpbmU7Ci0JCX0KLQkJWERlc3Ryb3lJbWFnZShpbWFnZSk7Ci0JCVhfVU5MT0NLOwotCQlzY2FsZV9tYXJrX3hyb290cG1hcCgpOwotCQlYX0xPQ0s7Ci0JfSBlbHNlIHsKLQkJaW50IHluID0gKG5jYWNoZSsxKSAqIGRweV95OwotCQl6ZXJvX2ZiKDAsIHluLCBkcHlfeCwgeW4gKyBkcHlfeSk7Ci0JfQotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCVhfVU5MT0NLOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgRVZMSVNUTUFYIDI1NgotI2RlZmluZSBFVl9SRVNFVAkJMAotI2RlZmluZSBFVl9DUkVBVEUJCTEKLSNkZWZpbmUgRVZfREVTVFJPWQkJMgotI2RlZmluZSBFVl9VTk1BUAkJMwotI2RlZmluZSBFVl9NQVAJCQk0Ci0jZGVmaW5lIEVWX1JFUEFSRU5UCQk1Ci0jZGVmaW5lIEVWX0NPTkZJR1VSRQkJNgotI2RlZmluZSBFVl9DT05GSUdVUkVfU0laRQk3Ci0jZGVmaW5lIEVWX0NPTkZJR1VSRV9QT1MJOAotI2RlZmluZSBFVl9DT05GSUdVUkVfU1RBQ0sJOQotI2RlZmluZSBFVl9WSVNJQklMSVRZX1VOT0JTCTEwCi0jZGVmaW5lIEVWX1ZJU0lCSUxJVFlfT0JTCTExCi0jZGVmaW5lIEVWX1BST1BFUlRZCQkxMgotI2RlZmluZSBFVl9PTERfV01fTUFQCQkxMwotI2RlZmluZSBFVl9PTERfV01fVU5NQVAJCTE0Ci0jZGVmaW5lIEVWX09MRF9XTV9PRkYJCTE1Ci0jZGVmaW5lIEVWX09MRF9XTV9OT1RNQVBQRUQJMTYKLVdpbmRvdyBfZXZfbGlzdFtFVkxJU1RNQVhdOwotaW50IF9ldl9jYXNlW0VWTElTVE1BWF07Ci1pbnQgX2V2X2xpc3RfY250OwotCi1pbnQgbl9DTiA9IDAsIG5fUk4gPSAwLCBuX0ROID0gMCwgbl9PTiA9IDAsIG5fTU4gPSAwLCBuX1VOID0gMDsKLWludCBuX1ZOID0gMCwgbl9WTl9wID0gMCwgbl9WTl91ID0gMCwgbl9TVCA9IDAsIG5fUE4gPSAwLCBuX0RDID0gMDsKLWludCBuX09OX3N6ID0gMCwgbl9PTl9wbyA9IDAsIG5fT05fc3QgPSAwOwotCi1pbnQgZXZfc3RvcmUoV2luZG93IHdpbiwgaW50IHR5cGUpIHsKLQlpZiAodHlwZSA9PSBFVl9SRVNFVCkgIHsKLQkJbl9DTiA9IDA7IG5fUk4gPSAwOyBuX0ROID0gMDsgbl9PTiA9IDA7IG5fTU4gPSAwOyBuX1VOID0gMDsKLQkJbl9WTiA9IDA7IG5fVk5fcCA9IDA7IG5fVk5fdSA9IDA7IG5fU1QgPSAwOyBuX1BOID0gMDsgbl9EQyA9IDA7Ci0JCW5fT05fc3ogPSAwOyBuX09OX3BvID0gMDsgbl9PTl9zdCA9IDA7Ci0JCV9ldl9saXN0X2NudCA9IDA7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoX2V2X2xpc3RfY250ID49IEVWTElTVE1BWCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JX2V2X2xpc3RbX2V2X2xpc3RfY250XSA9IHdpbjsKLQlfZXZfY2FzZVtfZXZfbGlzdF9jbnQrK10gPSB0eXBlOwotCXJldHVybiAxOwotfQotCi1pbnQgZXZfbG9va3VwKFdpbmRvdyB3aW4sIGludCB0eXBlKSB7Ci0JaW50IGk7Ci0JZm9yKGk9MDsgaSA8IF9ldl9saXN0X2NudDsgaSsrKSB7Ci0JCWlmIChfZXZfbGlzdFtpXSA9PSB3aW4gJiYgX2V2X2Nhc2VbaV0gPT0gdHlwZSkgCXsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBsb25nIGFsbF9ldiA9IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2t8U3RydWN0dXJlTm90aWZ5TWFza3xWaXNpYmlsaXR5Q2hhbmdlTWFzazsKLXVuc2lnbmVkIGxvbmcgd2luX2V2ID0gU3RydWN0dXJlTm90aWZ5TWFza3xWaXNpYmlsaXR5Q2hhbmdlTWFzazsKLQotdm9pZCByZWFkX2V2ZW50cyhpbnQgKm5faW4pIHsKLQlpbnQgbiA9ICpuX2luOwotCVdpbmRvdyB3aW4sIHdpbjI7Ci0JWEV2ZW50IGV2OwotCQotCXdoaWxlICh4Y2hlY2ttYXNrZXZlbnQoZHB5LCBhbGxfZXYsICZFdltuXSkpIHsKLQkJaW50IGNmZ19zaXplID0gMDsKLQkJaW50IGNmZ19wb3MgPSAwOwotCQlpbnQgY2ZnX3N0YWNrID0gMDsKLQkJaW50IHR5cGUgPSBFdltuXS50eXBlOyAKLQkJV2luZG93IHcgPSBOb25lOwotCi0JCXdpbiA9IEV2W25dLnhhbnkud2luZG93OwotCQlFdl9kb25lW25dID0gMDsKLQkJRXZfYXJlYVtuXSA9IDA7Ci0JCUV2X3dpbltuXSA9IHdpbjsKLQkJRXZfbWFwW25dID0gTm9uZTsKLQkJRXZfdW5tYXBbbl0gPSBOb25lOwotCQlFdl9vcmRlcltuXSA9IG47Ci0KLQkJZXYgPSBFdltuXTsKLQotCQlpZiAodHlwZSA9PSBEZXN0cm95Tm90aWZ5KSAgdyA9IEV2W25dLnhjcmVhdGV3aW5kb3cud2luZG93OwotCQlpZiAodHlwZSA9PSBDcmVhdGVOb3RpZnkpICAgdyA9IEV2W25dLnhkZXN0cm95d2luZG93LndpbmRvdzsKLQkJaWYgKHR5cGUgPT0gUmVwYXJlbnROb3RpZnkpIHcgPSBFdltuXS54cmVwYXJlbnQud2luZG93OwotCQlpZiAodHlwZSA9PSBVbm1hcE5vdGlmeSkgICAgdyA9IEV2W25dLnh1bm1hcC53aW5kb3c7Ci0JCWlmICh0eXBlID09IE1hcE5vdGlmeSkgICAgICB3ID0gRXZbbl0ueG1hcC53aW5kb3c7Ci0JCWlmICh0eXBlID09IEV4cG9zZSkgICAgICAgICB3ID0gRXZbbl0ueGV4cG9zZS53aW5kb3c7Ci0JCWlmICh0eXBlID09IENvbmZpZ3VyZU5vdGlmeSkgdyA9IEV2W25dLnhjb25maWd1cmUud2luZG93OwotCQlpZiAodHlwZSA9PSBWaXNpYmlsaXR5Tm90aWZ5KSB3ID0gd2luOwotCQlpZiAobiA9PSAqbl9pbiAmJiBuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWlmICgxKSB7Ci0JCQljaGFyICptc2cgPSAiIjsKLQkJCWludCBpZHggPSAtMSwgeCA9IDAsIHkgPSAwLCB3ZCA9IDAsIGh0ID0gMDsKLQkJCWlmICh3ICE9IE5vbmUpIHsKLQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KHcpOwotCQkJCWlmIChpZHggPj0gMCkgewotCQkJCQl4ID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JCQkJCXkgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQkJd2QgPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7Ci0JCQkJCWh0ID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBWaXNpYmlsaXR5Tm90aWZ5KSB7Ci0JCQkJbXNnID0gVlN0YXRlKEV2W25dLnh2aXNpYmlsaXR5LnN0YXRlKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBDb25maWd1cmVOb3RpZnkpIHsKLQkJCQlpbnQgeF9uZXcgPSBFdltuXS54Y29uZmlndXJlLng7IAotCQkJCWludCB5X25ldyA9IEV2W25dLnhjb25maWd1cmUueTsgCi0JCQkJaW50IHdfbmV3ID0gRXZbbl0ueGNvbmZpZ3VyZS53aWR0aDsgCi0JCQkJaW50IGhfbmV3ID0gRXZbbl0ueGNvbmZpZ3VyZS5oZWlnaHQ7IAotCQkJCWlmIChpZHggPj0gMCkgewotCQkJCQlpZiAod19uZXcgIT0gd2QgfHwgaF9uZXcgIT0gaHQpIHsKLQkJCQkJCW1zZyA9ICJjaGFuZ2Ugc2l6ZSI7Ci0JCQkJCQljZmdfc2l6ZSA9IDE7Ci0JCQkJCX0KLQkJCQkJaWYgKHhfbmV3ICE9IHggfHwgeV9uZXcgIT0geSkgewotCQkJCQkJaWYgKCFzdHJjbXAobXNnLCAiIikpIHsKLQkJCQkJCQltc2cgPSAiY2hhbmdlIHBvc2l0aW9uIjsKLQkJCQkJCX0KLQkJCQkJCWNmZ19wb3MgPSAxOwotCQkJCQl9IGVsc2UgaWYgKCEgY2ZnX3NpemUpIHsKLQkJCQkJCW1zZyA9ICJjaGFuZ2Ugc3RhY2tpbmciOwotCQkJCQkJY2ZnX3N0YWNrID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiLS0tLS0gJTAyZCBpbnB1dGV2IDB4JTA4bHggdzogMHglMDhseCAlMDRkeCUwNGQrJTA0ZCslMDRkICVzICAlc1xuIiwgbiwgd2luLCB3LCB3ZCwgaHQsIHgsIHksIEV0eXBlKHR5cGUpLCBtc2cpOwotCQl9Ci0KLQkJaWYgKHdpbiA9PSByb290d2luKSB7Ci0JCQlpZiAodHlwZSA9PSBDcmVhdGVOb3RpZnkpIHsKLQkJCQl3aW4yID0gZXYueGNyZWF0ZXdpbmRvdy53aW5kb3c7Ci0JCQkJZXZfc3RvcmUod2luMiwgRVZfQ1JFQVRFKTsKLQkJCQluKys7Ci0JCQkJbl9DTisrOwotCQkJfSBlbHNlIGlmICh0eXBlID09IFJlcGFyZW50Tm90aWZ5KSB7Ci0JCQkJaWYgKGV2LnhyZXBhcmVudC5wYXJlbnQgIT0gcm9vdHdpbikgewotCQkJCQl3aW4yID0gZXYueHJlcGFyZW50LndpbmRvdzsKLQkJCQkJaWYgKHdpbjIgIT0gcm9vdHdpbikgewotCQkJCQkJZXZfc3RvcmUod2luMiwgRVZfUkVQQVJFTlQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW4rKzsKLQkJCQluX1JOKys7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gUHJvcGVydHlOb3RpZnkpIHsKLQkJCQlzZXRfcHJvcF9hdG9tKEV2W25dLnhwcm9wZXJ0eS5hdG9tKTsKLQkJCQluKys7Ci0JCQkJbl9QTisrOwotCQkJfSBlbHNlIGlmICh0eXBlID09IE1hcE5vdGlmeSkgewotCQkJCXdpbjIgPSBldi54bWFwLndpbmRvdzsKLQkJCQlldl9zdG9yZSh3aW4yLCBFVl9NQVApOwotCQkJCW4rKzsKLQkJCQluX0NOKys7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHNraXAgcmVzdCAqLwotI2lmIDAKLQkJCQlXaW5kb3cgdyA9IE5vbmU7Ci1pZiAodHlwZSA9PSBEZXN0cm95Tm90aWZ5KSB3ID0gRXZbbl0ueGRlc3Ryb3l3aW5kb3cud2luZG93OwotaWYgKHR5cGUgPT0gVW5tYXBOb3RpZnkpICAgdyA9IEV2W25dLnh1bm1hcC53aW5kb3c7Ci1pZiAodHlwZSA9PSBNYXBOb3RpZnkpICAgICB3ID0gRXZbbl0ueG1hcC53aW5kb3c7Ci1pZiAodHlwZSA9PSBFeHBvc2UpICAgICAgICB3ID0gRXZbbl0ueGV4cG9zZS53aW5kb3c7Ci1pZiAodHlwZSA9PSBDb25maWd1cmVOb3RpZnkpIHcgPSBFdltuXS54Y29uZmlndXJlLndpbmRvdzsKLWlmICh0eXBlICE9IENvbmZpZ3VyZU5vdGlmeSkgZnByaW50ZihzdGRlcnIsICJyb290OiBza2lwICVzICBmb3IgMHglbHhcbiIsIEV0eXBlKHR5cGUpLCB3KTsKLSNlbmRpZgotCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodHlwZSA9PSBSZXBhcmVudE5vdGlmeSkgewotCQkJCWV2X3N0b3JlKHdpbiwgRVZfUkVQQVJFTlQpOwotCQkJCW4rKzsKLQkJCQluX1JOKys7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gRGVzdHJveU5vdGlmeSkgewotCQkJCWV2X3N0b3JlKHdpbiwgRVZfREVTVFJPWSk7Ci0JCQkJbisrOwotCQkJCW5fRE4rKzsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBDb25maWd1cmVOb3RpZnkpIHsKLQkJCQlldl9zdG9yZSh3aW4sIEVWX0NPTkZJR1VSRSk7Ci0JCQkJaWYgKGNmZ19zaXplKSB7Ci0JCQkJCWV2X3N0b3JlKHdpbiwgRVZfQ09ORklHVVJFX1NJWkUpOwotCQkJCQluX09OX3N6Kys7Ci0JCQkJfQotCQkJCWlmIChjZmdfcG9zKSB7Ci0JCQkJCWV2X3N0b3JlKHdpbiwgRVZfQ09ORklHVVJFX1BPUyk7Ci0JCQkJCW5fT05fcG8rKzsKLQkJCQl9Ci0JCQkJaWYgKGNmZ19zdGFjaykgewotCQkJCQlldl9zdG9yZSh3aW4sIEVWX0NPTkZJR1VSRV9TVEFDSyk7Ci0JCQkJCW5fT05fc3QrKzsKLQkJCQl9Ci0JCQkJbisrOwotCQkJCW5fT04rKzsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWaXNpYmlsaXR5Tm90aWZ5KSB7Ci0JCQkJaWYgKEV2W25dLnh2aXNpYmlsaXR5LnN0YXRlID09IFZpc2liaWxpdHlVbm9ic2N1cmVkKSB7Ci0JCQkJCWV2X3N0b3JlKHdpbiwgRVZfVklTSUJJTElUWV9VTk9CUyk7Ci0JCQkJCW5fVk5fdSsrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV2X3N0b3JlKHdpbiwgRVZfVklTSUJJTElUWV9PQlMpOwotCQkJCQluX1ZOX3ArKzsKLQkJCQl9Ci0JCQkJbisrOwotCQkJCW5fVk4rKzsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBNYXBOb3RpZnkpIHsKLQkJCQlldl9zdG9yZSh3aW4sIEVWX01BUCk7Ci0JCQkJRXZfbWFwW25dID0gd2luOwotCQkJCW4rKzsKLQkJCQluX01OKys7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVW5tYXBOb3RpZnkpIHsKLQkJCQlldl9zdG9yZSh3aW4sIEVWX1VOTUFQKTsKLQkJCQlFdl91bm1hcFtuXSA9IHdpbjsKLQkJCQluKys7Ci0JCQkJbl9VTisrOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBza2lwIHJlc3QgKi8KLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0tIHNraXAgJXNcbiIsIEV0eXBlKHR5cGUpKTsKLQkJCX0KLQkJfQotCQlpZiAobiA+PSBFVk1BWCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JKm5faW4gPSBuOwotfQotCi1pbnQgdHJ5X3RvX3N5bnRoZXNpemVfc3UoaW50IGZvcmNlLCBpbnQgdXJnZW50LCBpbnQgKm5iYXRjaCkgewotCWludCBpLCBpZHgsIGlkeDIsIG4gPSAwOyAJCi0Jc3JhUmVnaW9uUHRyIHIwLCByMSwgcjI7Ci0JV2luZG93IHdpbiA9IE5vbmU7Ci0JaW50IHgwLCB5MCwgdzAsIGgwOwotCWludCB4MSwgeTEsIHcxLCBoMTsKLQlpbnQgeDIsIHkyLCB3MiwgaDI7Ci0JaW50IHgzLCB5MywgdzMsIGgzOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0KLQlyMCA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQotCXNuYXBfb2xkKCk7Ci0KLQlYX0xPQ0s7Ci0JZm9yIChpID0gb2xkX3N0YWNrX24gLSAxOyBpID49IDA7IGktLSkgewotCQl3aW4gPSBvbGRfc3RhY2tbaV07Ci0JCWlmICh1cmdlbnQpIHsJLyogWFhYIFkgcmVzcCAqLwotCQkJaWYgKCF2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luKTsKLQkJCWlmIChpZHggPj0gMCkgewotCQkJCVNUT1JFKGlkeCwgd2luLCBhdHRyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luKTsKLQkJCWlmIChpZHggPj0gMCkgewotCQkJCWF0dHIubWFwX3N0YXRlID0gY2FjaGVfbGlzdFtpZHhdLm1hcF9zdGF0ZTsKLQkJCQlhdHRyLnggPSBjYWNoZV9saXN0W2lkeF0ueDsKLQkJCQlhdHRyLnkgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQlhdHRyLndpZHRoID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCWF0dHIuaGVpZ2h0ID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJYXR0ci5tYXBfc3RhdGUgPSBJc1VubWFwcGVkOwotCQkJCWF0dHIueCA9IDA7Ci0JCQkJYXR0ci55ID0gMDsKLQkJCQlhdHRyLndpZHRoID0gMDsKLQkJCQlhdHRyLmhlaWdodCA9IDA7Ci0JCQl9Ci0JCQkKLQkJfQotCQlpZiAoYXR0ci5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJY29udGludWU7Ci0JCX0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIndpbjogMHglbHggJWQgIGlkeD0lZFxuIiwgd2luLCBpLCBpZHgpOwotCi0JCXgyID0gYXR0ci54OwotCQl5MiA9IGF0dHIueTsKLQkJdzIgPSBhdHRyLndpZHRoOwotCQloMiA9IGF0dHIuaGVpZ2h0OwotCi0JCXIyID0gc3JhUmduQ3JlYXRlUmVjdCh4MiwgeTIsIHgyK3cyLCB5MitoMik7Ci0JCXNyYVJnbkFuZChyMiwgcjApOwotCi0JCXRtcF9yZWdbbl0gPSByMjsKLQkJdG1wX3N0YWNrW24rK10gPSBpZHg7Ci0JfQotCVhfVU5MT0NLOwotCi0JaWYgKCEgbikgewotCQlyMSA9IE5VTEw7Ci0JCUNMRUFOX09VVAotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBpMiwgY250ID0gMDsKLQkJaWR4ID0gdG1wX3N0YWNrW2ldOwotCQlpZiAoaWR4IDwgMCB8fCBjYWNoZV9saXN0W2lkeF0uYnNfeCA8IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXIxID0gdG1wX3JlZ1tpXTsKLQkJaWYgKHIxID09IE5VTEwgfHwgc3JhUmduRW1wdHkocjEpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY2FjaGVfbGlzdFtpZHhdLnN1X3RpbWUgPiAwLjApIHsKLQkJCWlmIChmb3JjZSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiZm9yY2luZyBzeW50aDogMHglbHggJWRcbiIsIGNhY2hlX2xpc3RbaWR4XS53aW4sIGlkeCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWlmIChuY2FjaGVfeHJvb3RwbWFwKSB7Ci0JCQlpbnQgZHgsIGR5OwotCi0JCQl4MCA9IGNhY2hlX2xpc3RbaWR4XS54OwotCQkJeTAgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCXcwID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJaDAgPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCi0JCQl4MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV94OwotCQkJeTEgPSBjYWNoZV9saXN0W2lkeF0uc3VfeTsKLQkJCXcxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3c7Ci0JCQloMSA9IGNhY2hlX2xpc3RbaWR4XS5zdV9oOwotCi0JCQlyMiA9IHNyYVJnbkNyZWF0ZVJnbih0bXBfcmVnW2ldKTsKLQkJCWR4ID0geDEgLSB4MDsKLQkJCWR5ID0geTEgLSB5MDsKLQotCQkJc3JhUmduT2Zmc2V0KHIyLCBkeCwgZHkpOwotCi0JCQl4MiA9IHgwOwotCQkJeTIgPSB5MCArIChuY2FjaGUrMSkgKiBkcHlfeTsKLQotCQkJZHggPSB4MSAtIHgyOwotCQkJZHkgPSB5MSAtIHkyOwotCQkJY2FjaGVfY3IocjIsIGR4LCBkeSwgc2F2ZV9kZWxheTAsIHNhdmVfZGVsYXkxLCBuYmF0Y2gpOwotCQkJY250Kys7Ci0KLQkJCXNyYVJnbkRlc3Ryb3kocjIpOwotCQl9Ci0KLQkJZm9yIChpMiA9IG4gLSAxOyBpMiA+IGk7IGkyLS0pIHsKLQkJCXIyID0gc3JhUmduQ3JlYXRlUmduKHRtcF9yZWdbaTJdKTsKLQkJCWlmIChzcmFSZ25BbmQocjIsIHIxKSkgewotCQkJCWludCBkeCwgZHk7Ci0JCQkJaW50IGR4MiwgZHkyOwotCi0JCQkJaWR4MiA9IHRtcF9zdGFja1tpMl07Ci0JCQkJLyogWFhYIFkgKi8KLQkJCQlpZiAoaWR4MiA8IDAgfHwgY2FjaGVfbGlzdFtpZHgyXS5ic194IDwgMCB8fCBjYWNoZV9saXN0W2lkeDJdLmJzX3RpbWUgPT0gMC4wKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXgwID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JCQkJeTAgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQl3MCA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQkJCQloMCA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0KLQkJCQl4MSA9IGNhY2hlX2xpc3RbaWR4XS5zdV94OwotCQkJCXkxID0gY2FjaGVfbGlzdFtpZHhdLnN1X3k7Ci0JCQkJdzEgPSBjYWNoZV9saXN0W2lkeF0uc3VfdzsKLQkJCQloMSA9IGNhY2hlX2xpc3RbaWR4XS5zdV9oOwotCi0JCQkJeDIgPSBjYWNoZV9saXN0W2lkeDJdLng7Ci0JCQkJeTIgPSBjYWNoZV9saXN0W2lkeDJdLnk7Ci0JCQkJdzIgPSBjYWNoZV9saXN0W2lkeDJdLndpZHRoOwotCQkJCWgyID0gY2FjaGVfbGlzdFtpZHgyXS5oZWlnaHQ7Ci0KLQkJCQl4MyA9IGNhY2hlX2xpc3RbaWR4Ml0uYnNfeDsKLQkJCQl5MyA9IGNhY2hlX2xpc3RbaWR4Ml0uYnNfeTsKLQkJCQl3MyA9IGNhY2hlX2xpc3RbaWR4Ml0uYnNfdzsKLQkJCQloMyA9IGNhY2hlX2xpc3RbaWR4Ml0uYnNfaDsKLQotCQkJCWR4ID0geDEgLSB4MDsKLQkJCQlkeSA9IHkxIC0geTA7Ci0JCQkJc3JhUmduT2Zmc2V0KHIyLCBkeCwgZHkpOwotCi0JCQkJZHgyID0geDMgLSB4MjsKLQkJCQlkeTIgPSB5MyAtIHkyOwotCQkJCWR4ID0gZHggLSBkeDI7Ci0JCQkJZHkgPSBkeSAtIGR5MjsKLQkJCQljYWNoZV9jcihyMiwgZHgsIGR5LCBzYXZlX2RlbGF5MCwgc2F2ZV9kZWxheTEsIG5iYXRjaCk7Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCQlzcmFSZ25EZXN0cm95KHIyKTsKLQkJfQotCQlpZiAoY250KSB7Ci0JCQljYWNoZV9saXN0W2lkeF0uc3VfdGltZSA9IGRub3coKTsKLQkJfQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiICB0cnlfdG9fc3ludGhfc3U6IDB4JWx4ICVkICBpZHg9JWQgY250PSVkXG4iLCB3aW4sIGksIGlkeCwgY250KTsKLQl9Ci0KLQlyMSA9IE5VTEw7Ci0JQ0xFQU5fT1VUCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBkb3VibGUgbGFzdF92aXNfdW5vYnNfdGltZSA9IDAuMDsKLXN0YXRpYyBkb3VibGUgbGFzdF92aXNfb2JzX3RpbWUgPSAwLjA7Ci0KLXN0YXRpYyBpbnQgc2F3X2Rlc2t0b3BfY2hhbmdlID0gMDsKLQotdm9pZCBjaGVja19zY2hlZChpbnQgdHJ5X2JhdGNoLCBpbnQgKmRpZF9zY2hlZCkgewotCXN0YXRpYyBkb3VibGUgbGFzdF9yb290ID0gMC4wOwotCXN0YXRpYyBkb3VibGUgbGFzdF9waXhtYXAgPSAwLjA7Ci0JZG91YmxlIHJlZnJlc2ggPSA2MC4wOwotCWludCBpLCBrLCB2YWxpZDsKLQlXaW5kb3cgd2luOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JZG91YmxlIG5vdyA9IGRub3coKTsKLQotCWlmIChub3cgPiBsYXN0X3Jvb3QgKyByZWZyZXNoKSB7Ci0KLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlxuKioqKiBjaGVja2luZyBjYWNoZV9saXN0WyVkXVxuXG4iLCBjYWNoZV9saXN0X251bSk7Ci0JCWJsb2NrX3N0YXRzKCk7Ci0KLQkJZm9yKGs9MDsgazxjYWNoZV9saXN0X251bTsgaysrKSB7Ci0JCQl2YWxpZCA9IDA7Ci0JCQl3aW4gPSBjYWNoZV9saXN0W2tdLndpbjsgCi0JCQlYX0xPQ0s7Ci0JCQlpZiAod2luID09IE5vbmUpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKGNhY2hlX2xpc3Rba10uc2VsZWN0aW5wdXQgJiYgY2FjaGVfbGlzdFtrXS50aW1lID4gbm93IC0gcmVmcmVzaCkgewotCQkJCXZhbGlkID0gMTsKLQkJCX0gZWxzZSBpZiAodmFsaWRfd2luZG93KHdpbiwgJmF0dHIsIDEpKSB7Ci0JCQkJU1RPUkUoaywgd2luLCBhdHRyKTsKLQkJCQlpZiAoISBjYWNoZV9saXN0W2tdLnNlbGVjdGlucHV0KSB7Ci0JCQkJCXhzZWxlY3RpbnB1dCh3aW4sIHdpbl9ldiwgMCk7Ci0JCQkJCUNMRUFSKGspOwotCQkJCQljYWNoZV9saXN0W2tdLnNlbGVjdGlucHV0ID0gMTsKLQkJCQl9Ci0JCQkJdmFsaWQgPSAxOwotCQkJfSBlbHNlIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIkRFTEVURSglZCkgJWR4JWQrJWQrJWRcbiIsIGssIGNhY2hlX2xpc3Rba10ud2lkdGgsIGNhY2hlX2xpc3Rba10uaGVpZ2h0LCBjYWNoZV9saXN0W2tdLngsIGNhY2hlX2xpc3Rba10ueSk7Ci0JCQkJREVMRVRFKGspOwotCQkJfQotCQkJWF9VTkxPQ0s7Ci0vKiBYWFggWSAqLwotCQkJaWYgKHZhbGlkKSB7Ci0JCQkJaWYgKGNhY2hlX2xpc3Rba10uY3JlYXRlX2NudCAmJiBjYWNoZV9saXN0W2tdLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlICYmIGNhY2hlX2xpc3Rba10ubWFwX2NudCA9PSAwKSB7Ci0JCQkJCWlmIChjYWNoZV9saXN0W2tdLmJzX3ggPj0gMCkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlZCB3aW5kb3cgbmV2ZXIgbWFwcGVkOiBmcmVlaW5nKCVkKSAweCVseFxuIiwgaywgd2luKTsKLQkJCQkJCWZyZWVfcmVjdChrKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlsYXN0X3Jvb3QgPSBkbm93KCk7Ci0JfQotCi0JaWYgKG5vdyA+IGxhc3Rfc2NoZWRfYnMgKyAwLjMwKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdF9zY2hlZF92aXMgPSAwLjA7Ci0JCWludCBuciA9IDAsICpiYXQgPSBOVUxMOwotCi0JCWlmICh0cnlfYmF0Y2gpIHsKLQkJCWJhdCA9ICZucjsKLQkJfQotCQlpZiAobm93IDwgbGFzdF93aXJlZnJhbWUgKyAyLjApIHsKLQkJCWZvciAoaT0wOyBpIDwgTlNDSEVEOyBpKyspIHsKLQkJCQlzY2hlZF9ic1tpXSA9IE5vbmU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdyA8IGxhc3RfZ2V0X3dtX2ZyYW1lX3RpbWUgKyAxLjApIHsKLQkJCWlmIChsYXN0X2dldF93bV9mcmFtZSAhPSBOb25lKSB7Ci0JCQkJaW50IGlkeCA9IGxvb2t1cF93aW5faW5kZXgobGFzdF9nZXRfd21fZnJhbWUpOwotCQkJCWlmIChpZHggPj0gMCkgewotCQkJCQlpZiAoY2FjaGVfbGlzdFtpZHhdLmJzX3ggPCAwKSB7Ci0JCQkJCQlpbnQgeCA9IGNhY2hlX2xpc3RbaWR4XS54OwotCQkJCQkJaW50IHkgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQkJCWludCB3ID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCQkJaW50IGggPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCQkJCQkJaWYgKGZpbmRfcmVjdChpZHgsIHgsIHksIHcsIGgpKSB7Ci0JCQkJCQkJU0NIRUQobGFzdF9nZXRfd21fZnJhbWUsIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKGk9MDsgaSA8IE5TQ0hFRDsgaSsrKSB7Ci0JCQlpZiAoc2NoZWRfYnNbaV0gIT0gTm9uZSkgewotCQkJCWludCBpZHg7Ci0JCQkJd2luID0gc2NoZWRfYnNbaV07CQotCQkJCWlmIChub3cgPCBzY2hlZF90bVtpXSArIDAuNTUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChuX01OIHx8IG5fVU4gfHwgbl9TVCB8fCBuX0RDKSB7Ci0JCQkJCXNjaGVkX3RtW2ldID0gbm93OwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4pOwotCQkJCWlmIChpZHggPj0gMCkgewotCQkJCQlpbnQgYXcgPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7IAotCQkJCQlpbnQgYWggPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OyAKLQkJCQkJaWYgKGNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgaWYgKGNhY2hlX2xpc3RbaWR4XS52aXNfc3RhdGUgIT0gVmlzaWJpbGl0eVVub2JzY3VyZWQpIHsKLQkJCQkJCTsKLQkJCQkJfSBlbHNlIGlmIChhdyAqIGFoIDwgNjQgKiA2NCkgewotCQkJCQkJOwotCQkJCQl9IGVsc2UgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiKlNOQVAgQlNfc2F2ZTogMHglbHggJWQgJWQgJWRcbiIsIHdpbiwgYXcsIGFoLCBjYWNoZV9saXN0W2lkeF0ubWFwX3N0YXRlKTsgCi0JCQkJCQl2YWxpZCA9IDA7Ci0JCQkJCQlic19zYXZlKGlkeCwgYmF0LCAmYXR0ciwgMSwgMCwgJnZhbGlkLCAwKTsKLQkJCQkJCWlmICh2YWxpZCkgewotCQkJCQkJCVNUT1JFKGlkeCwgd2luLCBhdHRyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJREVMRVRFKGlkeCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiKlNDSEVEIExPT0tVUCBGQUlMOiBpPSVkIDB4JWx4XG4iLCBpLCB3aW4pOwotCQkJCX0KLQkJCX0KLQkJCXNjaGVkX2JzW2ldID0gTm9uZTsKLQkJfQotCQkqZGlkX3NjaGVkID0gMTsKLQotCQlpZiAobl9NTiB8fCBuX1VOIHx8IG5fU1QgfHwgbl9EQykgewotCQkJaWYgKGxhc3Rfc2NoZWRfdmlzIDwgbm93KSB7Ci0JCQkJbGFzdF9zY2hlZF92aXMgKz0gMS4wOwotCQkJfQotCQl9IGVsc2UgaWYgKG5vdyA+IGxhc3Rfc2NoZWRfdmlzICsgMy4wICYmIG5vdyA+IGxhc3Rfd2lyZWZyYW1lICsgMi4wKSB7Ci0JCQlzdGF0aWMgZG91YmxlIGxhc3RfdmlzID0gMC4wOwotCQkJaW50IHZpc19ub3dbMzJdLCB0b3Bfbm93WzMyXTsKLQkJCXN0YXRpYyBpbnQgdmlzX3ByZXZbMzJdLCBmcmVxID0gMDsKLQkJCWludCBkaWZmLCBudiA9IDMyLCB2aXNfbm93X24gPSAwOwotCQkJV2luZG93IHdpbjsKLQotCQkJZnJlcSsrOwotCi0JCQlmb3IgKGk9MDsgaSA8IGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCQlpbnQgb2sgPSAwOwotCQkJCWludCB0b3Bfb25seSA9IDE7Ci0JCQkJaW50IGF3ID0gY2FjaGVfbGlzdFtpXS53aWR0aDsgCi0JCQkJaW50IGFoID0gY2FjaGVfbGlzdFtpXS5oZWlnaHQ7IAotCQkJCWludCBtYXBfcHJldiA9IGNhY2hlX2xpc3RbaV0ubWFwX3N0YXRlOwotCi0JCQkJd2luID0gY2FjaGVfbGlzdFtpXS53aW47Ci0KLQkJCQlpZiAoc2F3X2Rlc2t0b3BfY2hhbmdlKSB7Ci0JCQkJCXRvcF9vbmx5ID0gMDsKLQkJCQl9Ci0KLQkJCQlpZiAod2luID09IE5vbmUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8qIFhYWCBZIHJlc3AgKi8KLQkJCQlpZiAoc2F3X2Rlc2t0b3BfY2hhbmdlIHx8IGZyZXEgJSA1ID09IDApIHsKLQkJCQkJaW50IHZyZXQgPSAwOwotCQkJCQlYX0xPQ0s7Ci0JCQkJCXZyZXQgPSB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSk7Ci0JCQkJCVhfVU5MT0NLOwotCQkJCQlpZiAoIXZyZXQpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVNUT1JFKGksIHdpbiwgYXR0cik7Ci0JCQkJfQotCQkJCWlmICghY2FjaGVfbGlzdFtpXS52YWxpZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNhY2hlX2xpc3RbaV0ubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjYWNoZV9saXN0W2ldLnZpc19zdGF0ZSA9PSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG1hcF9wcmV2ICE9IElzVmlld2FibGUpIHsKLQkJCQkJLyogd2UgaG9wZSB0byBjYXRjaCBpdCBiZWxvdyBpbiB0aGUgbm9ybWFsIGV2ZW50IHByb2Nlc3NpbmcgKi8KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChhdyAqIGFoIDwgNjQgKiA2NCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHRvcF9vbmx5KSB7Ci0JCQkJCWlmIChjYWNoZV9saXN0W2ldLnZpc19zdGF0ZSA9PSBWaXNpYmlsaXR5VW5vYnNjdXJlZCkgewotCQkJCQkJb2sgPSAxOwotCQkJCQl9IGVsc2UgaWYgKCFjbGlwcGVkKGkpKSB7Ci0JCQkJCQlvayA9IDE7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlvayA9IDE7Ci0JCQkJfQotCQkJCWlmIChvaykgewotCQkJCQlpZiAodmlzX25vd19uIDwgbnYpIHsKLQkJCQkJCXZpc19ub3dbdmlzX25vd19uXSA9IGk7Ci0JCQkJCQl0b3Bfbm93W3Zpc19ub3dfbisrXSA9IHRvcF9vbmx5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGlmZiA9IDA7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgdmlzX25vd19uOyBrKyspIHsKLQkJCQlpZiAodmlzX25vd1trXSAhPSB2aXNfcHJldltrXSkgewotCQkJCQlkaWZmID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlmZiA9PSAwKSB7Ci0JCQkJaWYgKG5vdyA+IGxhc3RfdmlzICsgNDUuMCkgewotCQkJCQlkaWZmID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlmZikgewotaWYgKG5jZGIgJiYgdmlzX25vd19uKSBmcHJpbnRmKHN0ZGVyciwgIipWSVMgIHNuYXBzaG90IGFsbCAlLjRmXG4iLCBkbm93eCgpKTsKLQkJCQlmb3IgKGsgPSAwOyBrIDwgdmlzX25vd19uOyBrKyspIHsKLQkJCQkJaSA9IHZpc19ub3dba107Ci0JCQkJCXdpbiA9IGNhY2hlX2xpc3RbaV0ud2luOwotCQkJCQl2YWxpZCA9IDA7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIqVklTICBCU19zYXZlOiAweCVseCAlZCAlZCAlZFxuIiwgd2luLCBjYWNoZV9saXN0W2ldLndpZHRoLCBjYWNoZV9saXN0W2ldLmhlaWdodCwgY2FjaGVfbGlzdFtpXS5tYXBfc3RhdGUpOyAKLQkJCQkJaWYgKG5vdyA8IGNhY2hlX2xpc3RbaV0udmlzX3Vub2JzX3RpbWUgKyAwLjc1ICYmIG5vdyA8IGNhY2hlX2xpc3RbaV0udmlzX29ic190aW1lICsgMC43NSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnNfc2F2ZShpLCBiYXQsICZhdHRyLCAhdG9wX25vd1trXSwgMCwgJnZhbGlkLCAxKTsKLQkJCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCQlTVE9SRShpLCB3aW4sIGF0dHIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJREVMRVRFKGkpOwotCQkJCQl9Ci0JCQkJCXZpc19wcmV2W2tdID0gdmlzX25vd1trXTsKLQkJCQl9Ci0JCQkJbGFzdF92aXMgPSBkbm93KCk7Ci0JCQl9Ci0JCQlsYXN0X3NjaGVkX3ZpcyA9IGRub3coKTsKLQkJCWlmICghIG5fREMpIHsKLQkJCQlzYXdfZGVza3RvcF9jaGFuZ2UgPSAwOwotCQkJfQotCQkJLyogWFhYIFkgKi8KLQkJCXRyeV90b19zeW50aGVzaXplX3N1KDAsIDAsIGJhdCk7Ci0JCX0KLQotCQlpZiAobnIpIHsKLQkJCWJhdGNoX3B1c2gobnIsIC0xLjApOwotCQl9Ci0JCWxhc3Rfc2NoZWRfYnMgPSBkbm93KCk7Ci0JfQotI2lmICFOT19YMTEKLQlpZiAoZHB5ICYmIGF0b21fWFJPT1RQTUFQX0lEID09IE5vbmUgJiYgbm93ID4gbGFzdF9waXhtYXAgKyA1LjApIHsKLQkJYXRvbV9YUk9PVFBNQVBfSUQgPSBYSW50ZXJuQXRvbShkcHksICJfWFJPT1RQTUFQX0lEIiwgVHJ1ZSk7Ci0JCWxhc3RfcGl4bWFwID0gbm93OwotCX0KLSNlbmRpZgotCWlmIChnb3RfWFJPT1RQTUFQX0lEID4gMC4wKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJnb3RfWFJPT1RQTUFQX0lEXG4iKTsKLQkJaWYgKG5jYWNoZV94cm9vdHBtYXApIHsKLQkJCXNldF9uY2FjaGVfeHJvb3RwbWFwKCk7Ci0JCX0KLQkJZ290X1hST09UUE1BUF9JRCA9IDAuMDsKLQl9Ci19Ci0KLWludCBjaGVja19uY2FjaGUoaW50IHJlc2V0LCBpbnQgbW9kZSkgewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCXN0YXRpYyBpbnQgbGFzdF9jbGllbnRfY291bnQgPSAtMTsKLQlpbnQgaSwgaywgbjsgCi0JaW50IGRpZF9zY2hlZCA9IDA7Ci0KLQlXaW5kb3cgd2luLCB3aW4yOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JaW50IHZhbGlkOwotCWludCB0cnlfYmF0Y2ggPSAxOyAvKiBYWFggWSAqLwotCWludCB1c2VfYmF0Y2ggPSAwOwotCWludCBucmVnID0gMCwgKm5iYXRjaDsKLQlpbnQgY3JlYXRlX2NudDsKLQlpbnQgc3VfZml4X2NudDsKLQlpbnQgcGl4ZWxzID0gMCwgdHRvdDsKLQlpbnQgZGVza3RvcF9jaGFuZ2UgPSAwLCBuMSwgbjI7Ci0JaW50IGRlc2t0b3BfY2hhbmdlX29sZF93bSA9IDA7Ci0JaW50IG1pc3NlZF9zdV9yZXN0b3JlID0gMDsKLQlpbnQgbWlzc2VkX2JzX3Jlc3RvcmUgPSAwOwotCXNyYVJlZ2lvblB0ciByMCwgcjsKLQlzcmFSZWdpb25QdHIgbWlzc2VkX3N1X3Jlc3RvcmVfcmduOwotCXNyYVJlZ2lvblB0ciBtaXNzZWRfYnNfcmVzdG9yZV9yZ247Ci0Jc3JhUmVnaW9uUHRyIHVubWFwcGVkX3JnbjsKLQotCWludCBucmVjdHMgPSAwOwotCWludCBuc2F2ZSwgbnhzZWw7Ci0JZG91YmxlIG5vdzsKLQotCWludCBza2lwd2luc19uID0gMDsKLQlpbnQgc2tpcHdpbnNfbWF4ID0gMjU2OwotCVdpbmRvdyBza2lwd2luc1syNTZdOwotCi0Jc3RhdGljIGNoYXIgKmR0X2d1ZXNzID0gTlVMTDsKLQlzdGF0aWMgZG91YmxlIGR0X2xhc3QgPSAwLjA7Ci0JaW50IGR0X2dub21lID0gMCwgZ25vbWVfYW5pbWF0aW9uID0gMDsKLQlpbnQgZHRfa2RlID0gMDsKLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybiAtMTsKLQotI2lmZGVmIE1BQ09TWAotCWlmICghIG1hY29zeF9jb25zb2xlKSB7Ci0JCVJBV0ZCX1JFVCgtMSkKLQl9Ci0JaWYgKCEgc2NyZWVuKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0jZWxzZQotCVJBV0ZCX1JFVCgtMSkKLQlpZiAoISBzY3JlZW4gfHwgISBkcHkpIHsKLQkJcmV0dXJuIC0xOwotCX0KLSNlbmRpZgotCi0Jbm93ID0gZG5vdygpOwotCi0jaWZkZWYgTk9fTkNBQ0hFCi0JbmNhY2hlID0gMDsKLSNlbmRpZgotCi0JaWYgKHJlc2V0ICYmIChmaXJzdCB8fCBjYWNoZV9saXN0X2xlbiA9PSAwKSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh1c2VfdGhyZWFkcykgewotCQl0cnlfYmF0Y2ggPSAwOwotCX0KLQotCWlmIChuY2FjaGUwKSB7Ci0JCWlmIChyZXNldCkgewotCQkJOwotCQl9IGVsc2UgaWYgKCFjbGllbnRfY291bnQgfHwgIW5jYWNoZSB8fCBub2ZiKSB7Ci0JCQlzdGF0aWMgZG91YmxlIGxhc3RfcHVyZ2UgPSAwLjA7Ci0JCQlkb3VibGUgZGVsYXkgPSBjbGllbnRfY291bnQgPyAwLjUgOiAyLjA7Ci0JCQlpZiAobm93ID4gbGFzdF9wdXJnZSArIGRlbGF5KSB7Ci0JCQkJaW50IGMgPSAwOwotCQkJCVhFdmVudCBldjsKLQkJCQlYX0xPQ0s7Ci0JCQkJd2hpbGUgKHhjaGVja21hc2tldmVudChkcHksIGFsbF9ldiwgJmV2KSkgewotCQkJCQljKys7Ci0JCQkJfQotCQkJCVhfVU5MT0NLOwotCQkJCWxhc3RfcHVyZ2UgPSBkbm93KCk7Ci1pZiAobmNkYiAmJiBjKSBmcHJpbnRmKHN0ZGVyciwgImNoZWNrX25jYWNoZSBwdXJnZWQgJWQgZXZlbnRzXG4iLCBjKTsgCi0JCQl9Ci0JCQlpZiAoIWNsaWVudF9jb3VudCAmJiBsYXN0X2NsaWVudF9jb3VudCA+PSAwICYmCi0JCQkgICAgY2xpZW50X2NvdW50ICE9IGxhc3RfY2xpZW50X2NvdW50KSB7Ci0JCQkJLyogdGhpcyBzaG91bGQgdXNlIGxlc3MgUkFNIHdoZW4gbm8gY2xpZW50cyAqLwotCQkJCWRvX25ld19mYigxKTsKLQkJCX0KLQkJCWxhc3RfY2xpZW50X2NvdW50ID0gY2xpZW50X2NvdW50OwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWxhc3RfY2xpZW50X2NvdW50ID0gY2xpZW50X2NvdW50OwotCi0JaWYgKG5jYWNoZSAmJiAhIG5jYWNoZTApIHsKLQkJbmNhY2hlMCA9IG5jYWNoZTsKLQl9Ci0KLQlpZiAoISBuY2FjaGUgfHwgISBuY2FjaGUwKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHN1YndpbikgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChub2ZiKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG5vdyA8IGxhc3RfY2xpZW50ICsgNCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghIGFsbF9jbGllbnRzX2luaXRpYWxpemVkKCkpIHsKLQkJLyogcGxheSBpdCBzYWZlICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQotCi0JaWYgKHJlc2V0KSB7Ci0JCXJmYkxvZygiY2hlY2tfbmNhY2hlOiByZXNldHRpbmcgY2FjaGU6ICVkLyVkICVkICVkXG4iLCBjYWNoZV9saXN0X251bSwgY2FjaGVfbGlzdF9sZW4sIG5jYWNoZSwgZmlyc3QpOwotCQlmb3IgKGk9MDsgaSA8IGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCWZyZWVfcmVjdChpKTsKLQkJfQotCQlmb3IgKG4gPSAxOyBuIDw9IG5jYWNoZTsgbisrKSB7Ci0JCQlpZiAocmVjdF9yZWdbbl0gIT0gTlVMTCkgewotCQkJCXNyYVJnbkRlc3Ryb3kocmVjdF9yZWdbbl0pOwotCQkJCXJlY3RfcmVnW25dID0gTlVMTDsKLQkJCX0KLQkJfQotCQl6ZXJvX2ZiKDAsIGRweV95LCBkcHlfeCwgKG5jYWNoZSsxKSpkcHlfeSk7Ci0JCW1hcmtfcmVjdF9hc19tb2RpZmllZCgwLCBkcHlfeSwgZHB5X3gsIChuY2FjaGUrMSkqZHB5X3ksIDApOwotCi0JCWlmIChuY2FjaGVfeHJvb3RwbWFwKSB7Ci0JCQlzZXRfbmNhY2hlX3hyb290cG1hcCgpOwotCQl9Ci0KLQkJc25hcF9vbGQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChmaXJzdCkgewotCQlpbnQgZHggPSAxMCwgZHkgPSAyNCwgZHMgPSAwOwotCQlpbnQgRHggPSBkcHlfeCwgRHkgPSBkcHlfeTsKLQkJZmlyc3QgPSAwOwotCQlmb3IgKGk9MDsgaSA8IE5SRUNFTlQ7IGkrKykgewotCQkJcmVjZW50W2ldID0gTm9uZTsKLQkJfQotCQlmb3IgKGk9MDsgaSA8IE5TQ0hFRDsgaSsrKSB7Ci0JCQlzY2hlZF9ic1tpXSA9IE5vbmU7Ci0JCX0KLQkJcmxhc3QgPSAwOwotCi0JCVhfTE9DSzsKLQkJLyogZXZlbnQgbGVhayB3aXRoIGNsaWVudF9jb3VudCA9PSAwICovCi0JCXhzZWxlY3RpbnB1dF9yb290d2luIHw9IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2s7Ci0JCVhTZWxlY3RJbnB1dF93cihkcHksIHJvb3R3aW4sIHhzZWxlY3RpbnB1dF9yb290d2luKTsKLQkJWF9VTkxPQ0s7Ci0KLQkJaWYgKHNjYWxpbmcpIHsKLQkJCUR4ID0gc2NhbGVkX3g7Ci0JCQlEeSA9IHNjYWxlZF95OwotCQl9Ci0JCWlmICghcm90YXRpbmdfc2FtZSkgewotCQkJaW50IHQgPSBEeDsKLQkJCUR4ID0gRHk7Ci0JCQlEeSA9IHQ7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlyZmJEcmF3U3RyaW5nKHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgZHgsIGRzICsgRHkrMSpkeSwKLQkJCSAgICAiVGhpcyBpcyB0aGUgUGl4ZWwgYnVmZmVyIGNhY2hlIHJlZ2lvbi4gWW91ciBWTkMgVmlld2VyIGlzIG5vdCBoaWRpbmcgaXQgZnJvbSB5b3UuIiwKLQkJCSAgICB3aGl0ZV9waXhlbCgpKTsKLQkJCXJmYkRyYXdTdHJpbmcoc2NyZWVuLCAmZGVmYXVsdDh4MTZGb250LCBkeCwgZHMgKyBEeSsyKmR5LAotCQkJICAgICJUcnkgcmVzaXppbmcgeW91ciBWTkMgVmlld2VyIHNvIHlvdSBkb24ndCBzZWUgaXQhISIsCi0JCQkgICAgd2hpdGVfcGl4ZWwoKSk7Ci0JCQlyZmJEcmF3U3RyaW5nKHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgZHgsIGRzICsgRHkrMypkeSwKLQkJCSAgICAiUGF5IG5vIGF0dGVudGlvbiB0byB0aGUgbWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiIsCi0JCQkgICAgd2hpdGVfcGl4ZWwoKSk7Ci0JCQlyZmJEcmF3U3RyaW5nKHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgZHgsIGRzICsgRHkrNCpkeSwKLQkJCSAgICAiVG8gZGlzYWJsZSBjYWNoaW5nIHJ1biB0aGUgc2VydmVyIHdpdGg6ICB4MTF2bmMgLW5vbmNhY2hlIC4uLiIsCi0JCQkgICAgd2hpdGVfcGl4ZWwoKSk7Ci0JCQlyZmJEcmF3U3RyaW5nKHNjcmVlbiwgJmRlZmF1bHQ4eDE2Rm9udCwgZHgsIGRzICsgRHkrNSpkeSwKLQkJCSAgICAiSWYgdGhlcmUgYXJlIHBhaW50aW5nIGVycm9ycyBwcmVzcyAzIEFsdF9MJ3MgKExlZnQgXCJBbHRcIiBrZXkpIGluIGEgcm93IHRvIHJlcGFpbnQgdGhlIHNjcmVlbi4iLAotCQkJICAgIHdoaXRlX3BpeGVsKCkpOwotCQkJcmZiRHJhd1N0cmluZyhzY3JlZW4sICZkZWZhdWx0OHgxNkZvbnQsIGR4LCBkcyArIER5KzYqZHksCi0JCQkgICAgIk1vcmUgaW5mbzogIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWNsaWVudC1jYWNoaW5nIiwKLQkJCSAgICB3aGl0ZV9waXhlbCgpKTsKLQotCQkJZHMgKz0gMTEgKiBkeTsKLQkJfQotCi0JCXNuYXBzaG90X2NhY2hlX2xpc3QoMCwgMTAwLjApOwotCQlmb3IgKGk9MDsgaSA8IGNhY2hlX2xpc3RfbnVtOyBpKyspIHsKLQkJCUNMRUFSKGkpOwotCQl9Ci0JCWZvciAobiA9IDE7IG4gPD0gbmNhY2hlOyBuKyspIHsKLQkJCXJlY3RfcmVnW25dID0gTlVMTDsKLQkJfQotCi0JCWlmIChuY2FjaGVfeHJvb3RwbWFwKSB7Ci0JCQlzZXRfbmNhY2hlX3hyb290cG1hcCgpOwotCQl9Ci0KLQkJc25hcF9vbGQoKTsKLQl9Ci0KLQljaGVja196ZXJvX3JlY3RzKCk7Ci0KLWlmIChoYWNrX3ZhbCA9PSAyKSB7Ci0JYmxvY2tfc3RhdHMoKTsKLQloYWNrX3ZhbCA9IDE7Ci19Ci0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdF9hbGxfd2luZG93cyA9IDAuMDsKLQkJaWYgKCEgbWFjb3N4X2NoZWNrZXZlbnQoTlVMTCkpIHsKLQkJCWlmIChub3cgPiBsYXN0X2FsbF93aW5kb3dzICsgMC4wNSkgewotCQkJCW1hY29zeENHU19nZXRfYWxsX3dpbmRvd3MoKTsKLQkJCQlsYXN0X2FsbF93aW5kb3dzID0gZG5vdygpOwotCQkJfQotCQl9Ci0JCS8qIFhYWCBZICovCi0JCXJvb3R3aW4gPSAtMTsKLQl9Ci0jZW5kaWYKLQotCW4gPSAwOwotCXR0b3QgPSAwOwotCi0JaWYgKGR0X2d1ZXNzID09IE5VTEwgfHwgbm93ID4gZHRfbGFzdCArIDYwKSB7Ci0JCXN0YXRpYyBjaGFyICpkdF9wcmV2ID0gTlVMTDsKLQkJZHRfcHJldiA9IGR0X2d1ZXNzOwotCQlkdF9ndWVzcyA9IHN0cmR1cChndWVzc19kZXNrdG9wKCkpOwotCQlpZiAobmNhY2hlX3hyb290cG1hcCAmJiBkdF9wcmV2ICYmIGR0X2d1ZXNzKSB7Ci0JCQlpZiAoc3RyY21wKGR0X3ByZXYsIGR0X2d1ZXNzKSkgewotCQkJCXNldF9uY2FjaGVfeHJvb3RwbWFwKCk7Ci0JCQl9Ci0JCX0KLQkJZHRfbGFzdCA9IG5vdzsKLQkJaWYgKGR0X3ByZXYpIHsKLQkJCWZyZWUoZHRfcHJldik7Ci0JCX0KLQl9Ci0JaWYgKGR0X2d1ZXNzICYmICFzdHJjbXAoZHRfZ3Vlc3MsICJnbm9tZSIpKSB7Ci0JCWR0X2dub21lID0gMTsKLQl9IGVsc2UgaWYgKGR0X2d1ZXNzICYmICFzdHJjbXAoZHRfZ3Vlc3MsICJrZGUiKSkgewotCQlkdF9rZGUgPSAxOwotCX0KLQlpZiAoZHRfa2RlKSB7Ci0JCWtkZV9ub19hbmltYXRlKDApOwotCX0KLQotCWV2X3N0b3JlKE5vbmUsIEVWX1JFU0VUKTsKLQotCVhfTE9DSzsKLQlmb3IgKGsgPSAxOyBrIDw9IDM7IGsrKykgewotCQlpbnQgaiwgcmV0cnkgPSAwOwotCi0JCWlmIChyZXRyeSkge30KLQotCQluc2F2ZSA9IG47Ci0KLQkJaWYgKGsgPiAxICYmIG5jZGIpIGZwcmludGYoc3RkZXJyLCAicmVhZF9ldmVudHMtJWRcbiIsIGspOwotCQlyZWFkX2V2ZW50cygmbik7Ci0KLSNpZiAwCi0JCWlmIChkdF9nbm9tZSAmJiAobl9NTiB8fCBuX1VOKSkgewotCQkJcmV0cnkgPSAxOwotCQl9IGVsc2UgaWYgKG5jYWNoZV9vbGRfd20gJiYgbl9PTl9wbyA+PSAyKSB7Ci0JCQlyZXRyeSA9IDE7Ci0JCX0gZWxzZSBpZiAobiA+IG5zYXZlKSB7Ci0JCQkvKiBYWFggWSAqLwotCQkJcmV0cnkgPSAxOwotCQl9Ci0KLQkJaWYgKHJldHJ5KSB7Ci0JCQlpbnQgbjAgPSBuOwotCQkJdXNsZWVwKDI1ICogMTAwMCk7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCXJlYWRfZXZlbnRzKCZuKTsKLQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgInJlYWRfZXZlbnRzIHJldHJ5OiAlZCAtPiAlZFxuIiwgbjAsIG4pOwotCQl9Ci0jZW5kaWYKLQotCQlpZiAobiA+IG5zYXZlKSB7Ci0JCQlpbnQgbjAgPSBuOwotCi0JCQlmb3IgKGo9MDsgajw0OyBqKyspIHsKLQkJCQlpZiAoaiA8IDIpIHsKLQkJCQkJdXNsZWVwKDMwICogMTAwMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNsZWVwKDEwICogMTAwMCk7Ci0JCQkJfQotCQkJCVhGbHVzaF93cihkcHkpOwotCQkJCXJlYWRfZXZlbnRzKCZuKTsKLQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJyZWFkX2V2ZW50cyByZXRyeTogJWQgLT4gJWRcbiIsIG4wLCBuKTsKLQkJCQlpZiAobiA9PSBuMCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbjAgPSBuOwotCQkJfQotCQl9Ci0JCQkKLQkJbnhzZWwgPSAwOwotCi0JCS8qIGhhbmRsZSBjcmVhdGVzIGFuZCByZXBhcmVudGluZzogKi8KLQkJZm9yIChuMSA9IG5zYXZlOyBuMSA8IG47IG4xKyspIHsKLQkJCVdpbmRvdyB3aW4yOwotCQkJaW50IGlkeDsKLQkJCVhFdmVudCBldiA9IEV2W24xXTsKLQkJCXdpbiA9IEV2X3dpbltuMV07Ci0JCQlpZiAoZXYudHlwZSA9PSBDcmVhdGVOb3RpZnkpIHsKLQkJCQl3aW4yID0gZXYueGNyZWF0ZXdpbmRvdy53aW5kb3c7Ci0JCQkJaWYgKGV2X2xvb2t1cCh3aW4yLCBFVl9SRVBBUkVOVCkgfHwgZXZfbG9va3VwKHdpbjIsIEVWX0RFU1RST1kpKSB7Ci0JCQkJCWlmIChza2lwd2luc19uIDwgc2tpcHdpbnNfbWF4KSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJTS0lQV0lOUzogQ3JlYXRlTm90aWZ5OiAweCVseCAlZFxuIiwgd2luMiwgbjEpOwotCQkJCQkJc2tpcHdpbnNbc2tpcHdpbnNfbisrXSA9IHdpbjI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KHdpbik7Ci0JCQkJCWlmIChpZHggPCAwKSB7Ci0JCQkJCQlpZHggPSBsb29rdXBfZnJlZV9pbmRleCgpOwotCQkJCQkJaWYgKGlkeCA8IDApIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCUNMRUFSKGlkeCk7Ci0JCQkJCX0KLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlBSRUxPT1A6ICBDcmVhdGVOb3RpZnk6IDB4JWx4ICVkIHZhbGlkX3dpbmRvd1xuIiwgd2luMiwgbjEpOwotCQkJCQlpZiAodmFsaWRfd2luZG93KHdpbjIsICZhdHRyLCAxKSkgewotCQkJCQkJU1RPUkUoaWR4LCB3aW4yLCBhdHRyKTsKLQkJCQkJCUNMRUFSKGlkeCk7Ci0JCQkJCQljYWNoZV9saXN0W2lkeF0uc2VsZWN0aW5wdXQgPSAxOwotCQkJCQkJY2FjaGVfbGlzdFtpZHhdLmNyZWF0ZV9jbnQgPSAxOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiUFJFTE9PUDogIENyZWF0ZU5vdGlmeTogMHglbHggJWQgeHNlbGVjdGlucHV0XG4iLCB3aW4yLCBuMSk7Ci0JCQkJCQl4c2VsZWN0aW5wdXQod2luMiwgd2luX2V2LCAxKTsKLQkJCQkJCW54c2VsKys7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlERUxFVEUoaWR4KTsKLQkJCQkJfQotCQkJCQlueHNlbCsrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZXYudHlwZSA9PSBSZXBhcmVudE5vdGlmeSkgewotCQkJCWlmIChldi54cmVwYXJlbnQucGFyZW50ICE9IHJvb3R3aW4pIHsKLQkJCQkJd2luMiA9IGV2LnhyZXBhcmVudC53aW5kb3c7Ci0JCQkJCWlmICh3aW4yICE9IHJvb3R3aW4pIHsKLQkJCQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luMik7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJQUkVMT09QOiAgUmVwYXJ0Tm90aWZ5OiAweCVseCAlZCBpZHg9JWRcbiIsIHdpbjIsIG4xLCBpZHgpOwotCQkJCQkJaWYgKGlkeCA+PSAwKSB7Ci0JCQkJCQkJREVMRVRFKGlkeCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoISBldl9sb29rdXAod2luMiwgRVZfQ1JFQVRFKSkgewotCQkJCQkJCXhzZWxlY3RpbnB1dCh3aW4yLCAwLCAxKTsKLQkJCQkJCQlueHNlbCsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChueHNlbCA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCVhfVU5MT0NLOwotCi0JaWYgKGdvdF9ORVRfQ1VSUkVOVF9ERVNLVE9QID4gMC4wKSB7Ci0JCWlmIChkbm93KCkgPCBnb3RfTkVUX0NVUlJFTlRfREVTS1RPUCArIDAuMjUpIHsKLQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIioqKmdvdF9ORVRfQ1VSUkVOVF9ERVNLVE9QIG49JWRcbiIsIG4pOwotCQkJZGVza3RvcF9jaGFuZ2UgPSAxOwotCQkJbl9EQysrOwotCQl9IGVsc2UgewotCQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiKioqZ290X05FVF9DVVJSRU5UX0RFU0tUT1Agbj0lZCBTVEFMRVxuIiwgbik7Ci0JCX0KLQkJZ290X05FVF9DVVJSRU5UX0RFU0tUT1AgPSAwLjA7Ci0JfQotCi0JaWYgKG4gPT0gMCkgewotCQljaGVja19zY2hlZCh0cnlfYmF0Y2gsICZkaWRfc2NoZWQpOwotCQlyZXR1cm4gMDsKLQl9Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJcbiIpOyBpZiAobmNkYikgcmZiTG9nKCJJTiAgY2hlY2tfbmNhY2hlKCkgJWQgZXZlbnRzLiAgJS40ZlxuIiwgbiwgbm93IC0geDExdm5jX3N0YXJ0KTsKLQotCWlmICh0cnlfYmF0Y2gpIHsKLQkJdXNlX2JhdGNoID0gMTsKLQl9Ci0KLQlpZiAocm90YXRpbmcpIHsKLQkJdXNlX2JhdGNoID0gMDsKLQl9Ci0JaWYgKGN1cnNvcl9ub3NoYXBlX3VwZGF0ZXNfY2xpZW50cyhzY3JlZW4pKSB7Ci0JCXVzZV9iYXRjaCA9IDA7Ci0JfQotCi0JaWYgKCEgdXNlX2JhdGNoKSB7Ci0JCW5iYXRjaCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJbnJlZyA9IDA7Ci0JCW5iYXRjaCA9ICZucmVnOwotCX0KLQotCS8qIFhYWCBZICovCi0JZm9yIChuMSA9IDA7IG4xIDwgbjsgbjErKykgewotCQlXaW5kb3cgdHdpbiA9IEV2X21hcFtuMV07Ci0JCWlmICh0d2luID09IE5vbmUgfHwgdHdpbiA9PSByb290d2luKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmb3IgKG4yID0gMDsgbjIgPCBuOyBuMisrKSB7Ci0JCQlpZiAoRXZfdW5tYXBbbjJdID09IHR3aW4pIHsKLQkJCQlpZiAoc2tpcHdpbnNfbiA8IHNraXB3aW5zX21heCkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiU0tJUFdJTlM6IEV2X3VubWFwL21hcDogMHglbHggJWRcbiIsIHR3aW4sIG4yKTsKLQkJCQkJc2tpcHdpbnNbc2tpcHdpbnNfbisrXSA9IHR3aW47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmICghZGVza3RvcF9jaGFuZ2UpIHsKLQkJaWYgKHNraXB3aW5zX24pIHsKLQkJCWlmIChuX01OICsgbl9VTiA+PSAyICsgMipza2lwd2luc19uKSB7Ci0JCQkJZGVza3RvcF9jaGFuZ2UgPSAxOwotCQkJCW5fREMrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChuX01OICsgbl9VTiA+PSAzKSB7Ci0JCQkJZGVza3RvcF9jaGFuZ2UgPSAxOwotCQkJCW5fREMrKzsKLQkJCX0KLQkJfQotCX0KLQlpZiAobmNhY2hlX29sZF93bSkgewotCQlpbnQgc2hpZnRzID0gMDsKLQkJZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQkJCVhFdmVudCBldjsKLQkJCWludCB0eXBlLCBpZHggPSAtMTsKLQkJCWludCBpayA9IEV2X29yZGVyW2ldOwotCQkJaW50IHhfbmV3LCB5X25ldywgd19uZXcsIGhfbmV3OwotCQkJaW50IHhfb2xkLCB5X29sZCwgd19vbGQsIGhfb2xkOwotCQkJaW50IG9sZF93bSA9IDA7Ci0KLQkJCWlmIChFdl9kb25lW2lrXSkgY29udGludWU7Ci0JCQl3aW4gPSBFdl93aW5baWtdOwotCi0JCQlldiA9IEV2W2lrXTsKLQkJCXR5cGUgPSBldi50eXBlOwotCQkJaWYgKHR5cGUgIT0gQ29uZmlndXJlTm90aWZ5KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZXZfbG9va3VwKHdpbiwgRVZfTUFQKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9VTk1BUCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoZXZfbG9va3VwKHdpbiwgRVZfREVTVFJPWSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4pOwotCQkJaWYgKGlkeCA8IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXhfbmV3ID0gZXYueGNvbmZpZ3VyZS54OyAKLQkJCXlfbmV3ID0gZXYueGNvbmZpZ3VyZS55OyAKLQkJCXdfbmV3ID0gZXYueGNvbmZpZ3VyZS53aWR0aDsgCi0JCQloX25ldyA9IGV2Lnhjb25maWd1cmUuaGVpZ2h0OyAKLQotCQkJeF9vbGQgPSBjYWNoZV9saXN0W2lkeF0ueDsKLQkJCXlfb2xkID0gY2FjaGVfbGlzdFtpZHhdLnk7Ci0JCQl3X29sZCA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQkJCWhfb2xkID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQotCQkJaWYgKHdfbmV3ID09IHdfb2xkICYmIGhfbmV3ID09IGhfb2xkKSB7Ci0JCQkJaWYgKG5hYnMoeF9uZXcgLSB4X29sZCkgPj0gZHB5X3ggfHwgbmFicyh5X25ldyAtIHlfb2xkKSA+PSBkcHlfeSkgewotCQkJCQlzcmFSZWdpb25QdHIgcl9vbGQsIHJfbmV3LCByMDsKLQkJCQkJcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JCQkJCXJfb2xkID0gc3JhUmduQ3JlYXRlUmVjdCh4X29sZCwgeV9vbGQsIHhfb2xkK3dfb2xkLCB5X29sZCtoX29sZCk7Ci0JCQkJCXNyYVJnbkFuZChyX29sZCwgcjApOwotCQkJCQlyX25ldyA9IHNyYVJnbkNyZWF0ZVJlY3QoeF9uZXcsIHlfbmV3LCB4X25ldyt3X25ldywgeV9uZXcraF9uZXcpOwotCQkJCQlzcmFSZ25BbmQocl9uZXcsIHIwKTsKLQkJCQkJaWYgKGNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCQkJZXZfc3RvcmUod2luLCBFVl9PTERfV01fTk9UTUFQUEVEKTsKLQkJCQkJfSBlbHNlIGlmIChzcmFSZ25FbXB0eShyX29sZCkgJiYgIXNyYVJnbkVtcHR5KHJfbmV3KSkgewotCQkJCQkJb2xkX3dtID0gMTsKLQkJCQkJCWV2X3N0b3JlKHdpbiwgRVZfT0xEX1dNX01BUCk7Ci0JCQkJCQlFdl9tYXBbaV0gPSB3aW47Ci0JCQkJCX0gZWxzZSBpZiAoIXNyYVJnbkVtcHR5KHJfb2xkKSAmJiBzcmFSZ25FbXB0eShyX25ldykpIHsKLQkJCQkJCWV2X3N0b3JlKHdpbiwgRVZfT0xEX1dNX1VOTUFQKTsKLQkJCQkJCW9sZF93bSA9IC0xOwotCQkJCQkJRXZfdW5tYXBbaV0gPSB3aW47Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlldl9zdG9yZSh3aW4sIEVWX09MRF9XTV9PRkYpOwotCQkJCQl9Ci0JCQkJCXNyYVJnbkRlc3Ryb3kocl9vbGQpOwotCQkJCQlzcmFSZ25EZXN0cm95KHJfbmV3KTsKLQkJCQkJc3JhUmduRGVzdHJveShyMCk7Ci0JCQkJCXNoaWZ0cysrOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAib2xkX3dtWyVkXSAgKyUwNGQrJTA0ZCAgKyUwNGQrJTA0ZCAgb2xkX3dtOiAlZFxuIiwgaSwgeF9vbGQsIHlfb2xkLCB4X25ldywgeV9uZXcsIG9sZF93bSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzaGlmdHMgPj0gMykgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiREVTS1RPUF9DSEFOR0VfT0xEX1dNOiAlZFxuIiwgc2hpZnRzKTsKLQkJCWRlc2t0b3BfY2hhbmdlID0gMTsKLQkJCWRlc2t0b3BfY2hhbmdlX29sZF93bSA9IDE7Ci0JCX0KLQl9Ci0KLSNkZWZpbmUgU0tJUFVNUyBcCi0Jb2sgPSAxOyBcCi0JaWYgKHR3aW4gPT0gTm9uZSB8fCB0d2luID09IHJvb3R3aW4pIHsgXAotCQljb250aW51ZTsgXAotCX0gXAotCWZvciAobnMgPSAwOyBucyA8IHNraXB3aW5zX247IG5zKyspIHsgXAotCQlpZiAoc2tpcHdpbnNbbnNdID09IHR3aW4pIHsgXAotCQkJb2sgPSAwOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLQl9Ci0KLQlpZiAoZGVza3RvcF9jaGFuZ2UpIHsKLQkJV2luZG93IHR3aW47Ci0JCWludCBvaywgcywgaywgYWRkLCBjbnQsIG5zOwotCi0JCWNudCA9IDA7Ci0JCWFkZCA9IDA7Ci0JCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCQl0d2luID0gRXZfdW5tYXBbaV07Ci0JCQlTS0lQVU1TCi0JCQlpZiAob2spIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIlUgRXZfdG1wWyVkXSA9ICVkXG4iLCBjbnQsIGkpOwotCQkJCUV2X3RtcFtjbnQrK10gPSBpOwotCQkJfQotCQl9Ci0JCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCQl0d2luID0gRXZfbWFwW2ldOwotCQkJU0tJUFVNUwotCQkJaWYgKG9rKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJNIEV2X3RtcFslZF0gPSAlZFxuIiwgY250LCBpKTsKLQkJCQlFdl90bXBbY250KytdID0gaTsKLQkJCX0KLQkJfQotCQlmb3IgKGsgPSAwOyBrIDwgY250OyBrKyspIHsKLQkJCUV2X3RtcDJba10gPSAtMTsKLQkJfQotCQkvKiB1bm1hcCBmcm9tIHRvcCB0byBib3R0b20gKi8KLQkJZm9yIChzID0gb2xkX3N0YWNrX24gLSAxOyBzID49IDA7IHMtLSkgewotCQkJdHdpbiA9IG9sZF9zdGFja1tzXTsJCi0JCQlpZiAodHdpbiA9PSBOb25lIHx8IHR3aW4gPT0gcm9vdHdpbikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChrID0gMDsgayA8IGNudDsgaysrKSB7Ci0JCQkJaSA9IEV2X3RtcFtrXTsKLQkJCQlpZiAodHdpbiA9PSBFdl91bm1hcFtpXSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiVSBFdl90bXAyWyVkXSA9ICVkXG4iLCBhZGQsIGkpOwotCQkJCQlFdl90bXAyW2FkZCsrXSA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBtYXAgZnJvbSBib3R0b20gdG8gdG9wICovCi0JCWZvciAocyA9IDA7IHMgPCBvbGRfc3RhY2tfbjsgcysrKSB7Ci0JCQl0d2luID0gb2xkX3N0YWNrW3NdOwkKLQkJCWlmICh0d2luID09IE5vbmUgfHwgdHdpbiA9PSByb290d2luKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb3IgKGsgPSAwOyBrIDwgY250OyBrKyspIHsKLQkJCQlpID0gRXZfdG1wW2tdOwotCQkJCWlmICh0d2luID09IEV2X21hcFtpXSkgewotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiTSBFdl90bXAyWyVkXSA9ICVkXG4iLCBhZGQsIGkpOwotCQkJCQlFdl90bXAyW2FkZCsrXSA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlrID0gMDsKLQkJZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQkJCVdpbmRvdyB3dSwgd207Ci0JCQlpbnQgajsKLQkJCWludCBva3UgPSAwLCBva20gPSAwOwotCQkJd3UgPSBFdl91bm1hcFtpXTsKLQkJCXdtID0gRXZfbWFwW2ldOwotCQkJb2sgPSAwOwotCQkJaWYgKHd1ICE9IE5vbmUgJiYgd3UgIT0gcm9vdHdpbikgb2t1ID0gMTsKLQkJCWlmICh3bSAhPSBOb25lICYmIHdtICE9IHJvb3R3aW4pIG9rbSA9IDE7Ci0JCQlpZiAoIW9rdSAmJiAhb2ttKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAob2t1KSB7Ci0JCQkJdHdpbiA9IHd1OwotCQkJCVNLSVBVTVMKLQkJCQlpZiAoIW9rKSB7Ci0JCQkJCW9rdSA9IDA7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9rbSkgewotCQkJCXR3aW4gPSB3bTsKLQkJCQlTS0lQVU1TCi0JCQkJaWYgKCFvaykgewotCQkJCQlva20gPSAwOwotCQkJCX0KLQkJCX0KLQkJCWlmICghb2t1ICYmICFva20pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWogPSBFdl90bXAyW2srK107Ci0JCQlpZiAoaiA+PSAwKSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJVTSBFdl9vcmRlclslZF0gPSAlZCBva3U9JWQgb2ttPSVkXG4iLCBpLCBqLCBva3UsIG9rbSk7Ci0JCQkJRXZfb3JkZXJbaV0gPSBqOwotCQkJfQotCQl9Ci0JfQotCi0jaWYgMAotCWlmIChkZXNrdG9wX2NoYW5nZSkgewotCQlXaW5kb3cgdHdpbjsKLQkJaW50IG9rLCBzLCBrLCBhZGQsIGNudCwgbnM7Ci0KLQkJY250ID0gMDsKLQkJYWRkID0gMDsKLQkJZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQkJCXR3aW4gPSBFdl91bm1hcFtpXTsKLQkJCVNLSVBVTVMKLQkJCWlmIChvaykgewotCQkJCUV2X3RtcFtjbnQrK10gPSBpOwotCQkJfQotCQl9Ci0JCWZvciAoayA9IDA7IGsgPCBjbnQ7IGsrKykgewotCQkJRXZfdG1wMltrXSA9IC0xOwotCQl9Ci0JCS8qIHVubWFwIGZyb20gdG9wIHRvIGJvdHRvbSAqLwotCQlmb3IgKHMgPSBvbGRfc3RhY2tfbiAtIDE7IHMgPj0gMDsgcy0tKSB7Ci0JCQl0d2luID0gb2xkX3N0YWNrW3NdOwkKLQkJCWZvciAoayA9IDA7IGsgPCBjbnQ7IGsrKykgewotCQkJCWkgPSBFdl90bXBba107Ci0JCQkJaWYgKHR3aW4gPT0gRXZfdW5tYXBbaV0pIHsKLQkJCQkJRXZfdG1wMlthZGQrK10gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJayA9IDA7Ci0JCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCQlpbnQgajsKLQkJCXR3aW4gPSBFdl91bm1hcFtpXTsKLQkJCVNLSVBVTVMKLQkJCWlmIChvaykgewotCQkJCWogPSBFdl90bXAyW2srK107Ci0JCQkJaWYgKGogPj0gMCkgewotCQkJCQlFdl9vcmRlcltpXSA9IGo7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY250ID0gMDsKLQkJYWRkID0gMDsKLQkJZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQkJCXR3aW4gPSBFdl9tYXBbaV07Ci0JCQlTS0lQVU1TCi0JCQlpZiAob2spIHsKLQkJCQlFdl90bXBbY250KytdID0gaTsKLQkJCX0KLQkJfQotCQlmb3IgKGsgPSAwOyBrIDwgY250OyBrKyspIHsKLQkJCUV2X3RtcDJba10gPSAtMTsKLQkJfQotCQkvKiBtYXAgZnJvbSBib3R0b20gdG8gdG9wICovCi0JCWZvciAocyA9IDA7IHMgPCBvbGRfc3RhY2tfbjsgcysrKSB7Ci0JCQl0d2luID0gb2xkX3N0YWNrW3NdOwkKLQkJCWZvciAoayA9IDA7IGsgPCBjbnQ7IGsrKykgewotCQkJCWkgPSBFdl90bXBba107Ci0JCQkJaWYgKHR3aW4gPT0gRXZfbWFwW2ldKSB7Ci0JCQkJCUV2X3RtcDJbYWRkKytdID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWsgPSAwOwotCQlmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCQkJaW50IGo7Ci0JCQl0d2luID0gRXZfbWFwW2ldOwotCQkJU0tJUFVNUwotCQkJaWYgKG9rKSB7Ci0JCQkJaiA9IEV2X3RtcDJbaysrXTsKLQkJCQlpZiAoaiA+PSAwKSB7Ci0JCQkJCUV2X29yZGVyW2ldID0gajsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmICghZGVza3RvcF9jaGFuZ2UgJiYgKG5fVk5fcCAmJiAhbl9VTiAmJiAobl9NTiB8fCBuX09OX3N0KSkpIHsKLQkJaWYgKG5vdyA8IGxhc3RfdmlzX3Vub2JzX3RpbWUgKyAwLjc1IHx8IG5vdyA8IGxhc3RfdmlzX29ic190aW1lICsgMC43NSkgewotCQkJOwotCQl9IGVsc2UgaWYgKG5fTU4gPD0gMiAmJiBuX09OX3N0IDw9IDEpIHsKLQkJCWZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCQkJWEV2ZW50IGV2OwotCQkJCWludCB0eXBlLCBpZHggPSAtMSwgc3RhdGUsIHZhbGlkOwotCQkJCWludCBpayA9IEV2X29yZGVyW2ldOwotCi0JCQkJaWYgKEV2X2RvbmVbaWtdKSBjb250aW51ZTsKLQkJCQl3aW4gPSBFdl93aW5baWtdOwotCi0JCQkJZXYgPSBFdltpa107Ci0JCQkJdHlwZSA9IGV2LnR5cGU7Ci0JCQkJaWYgKHR5cGUgIT0gVmlzaWJpbGl0eU5vdGlmeSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlzdGF0ZSA9IGV2Lnh2aXNpYmlsaXR5LnN0YXRlOwotCQkJCWlmIChzdGF0ZSA9PSBWaXNpYmlsaXR5VW5vYnNjdXJlZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGV2X2xvb2t1cCh3aW4sIEVWX01BUCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9VTk1BUCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9ERVNUUk9ZKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4pOwotCi0JCQkJaWYgKGlkeCA8IDApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjYWNoZV9saXN0W2lkeF0udmlzX3N0YXRlID09IFZpc2liaWxpdHlGdWxseU9ic2N1cmVkKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobm93IDwgY2FjaGVfbGlzdFtpZHhdLnZpc191bm9ic190aW1lICsgMy4wMCB8fCBub3cgPCBjYWNoZV9saXN0W2lkeF0udmlzX29ic190aW1lICsgMy4wMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0lMDJkOiBWaXNpYmlsaXR5Tm90aWZ5IDB4JWx4ICAlM2QgICgqUFJFTE9PUCopIHN0YXRlOiAlcyBVL1AgJWQvJWRcbiIsIGlrLCB3aW4sIGlkeCwgVlN0YXRlKHN0YXRlKSwgbl9WTl91LCBuX1ZOX3ApOwotCQkJCXZhbGlkID0gMDsKLQkJCQlic19zYXZlKGlkeCwgbmJhdGNoLCAmYXR0ciwgMSwgMCwgJnZhbGlkLCAxKTsKLQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJU1RPUkUoaWR4LCB3aW4sIGF0dHIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCURFTEVURShpZHgpOwotCQkJCX0KLQotCQkJCWNhY2hlX2xpc3RbaWR4XS52aXNfc3RhdGUgPSBzdGF0ZTsKLQkJCQljYWNoZV9saXN0W2lkeF0udmlzX29ic190aW1lID0gbGFzdF92aXNfb2JzX3RpbWUgPSBkbm93KCk7Ci0JCQkJRXZfZG9uZVtpa10gPSAxOwotCQkJfQotCQl9Ci0JfQotCWlmIChkZXNrdG9wX2NoYW5nZSkgewotCQlpZiAobmNhY2hlX2R0X2NoYW5nZSkgewotCQkJaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiR1VFU1NFRCBERVNLVE9QIENIQU5HRS5cbiIpOwotCQkJc2F3X2Rlc2t0b3BfY2hhbmdlID0gMTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIkdVRVNTRUQgREVTS1RPUCBDSEFOR0UuIFNraXBwaW5nLlxuIik7Ci0JCQlkZXNrdG9wX2NoYW5nZSA9IDA7Ci0JCX0KLQl9Ci0KLQotCWNyZWF0ZV9jbnQgPSAwOwotCW1pc3NlZF9zdV9yZXN0b3JlID0gMDsKLQltaXNzZWRfYnNfcmVzdG9yZSA9IDA7Ci0JbWlzc2VkX3N1X3Jlc3RvcmVfcmduID0gc3JhUmduQ3JlYXRlKCk7Ci0JbWlzc2VkX2JzX3Jlc3RvcmVfcmduID0gc3JhUmduQ3JlYXRlKCk7Ci0JcjAgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JdW5tYXBwZWRfcmduID0gc3JhUmduQ3JlYXRlKCk7Ci0Jc3VfZml4X2NudCA9IDA7Ci0KLWZvciAoayA9IDA7IGsgPCBza2lwd2luc19uOyBrKyspIHsKLQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJza2lwd2luc1slZF0gMHglbHhcbiIsIGssIHNraXB3aW5zW2tdKTsKLX0KLQotCVhfTE9DSzsKLQlmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCQlYRXZlbnQgZXY7Ci0JCWludCBucywgc2tpcCA9IDAsIHR5cGUsIGlkeCA9IC0xOwotCQlpbnQgaWsgPSBFdl9vcmRlcltpXTsKLQotCQlpZiAoRXZfZG9uZVtpa10pIGNvbnRpbnVlOwotCQl3aW4gPSBFdl93aW5baWtdOwotCi0JCWV2ID0gRXZbaWtdOwotCQl0eXBlID0gZXYudHlwZTsKLQkJRXZfZG9uZVtpa10gPSAxOwotCi0JCXdpbjIgPSB3aW47Ci0JCWlmICh3aW4gPT0gcm9vdHdpbikgewotCQkJaWYgKHR5cGUgPT0gQ3JlYXRlTm90aWZ5KSB7Ci0JCQkJd2luMiA9IGV2LnhjcmVhdGV3aW5kb3cud2luZG93OwotCQkJfSBlbHNlIGlmICh0eXBlID09IFJlcGFyZW50Tm90aWZ5KSB7Ci0JCQkJd2luMiA9IGV2LnhyZXBhcmVudC53aW5kb3c7Ci0JCQl9Ci0JCX0KLQkJZm9yIChucyA9IDA7IG5zIDwgc2tpcHdpbnNfbjsgbnMrKykgewotCQkJaWYgKHdpbjIgPT0gc2tpcHdpbnNbbnNdKSB7Ci0JCQkJc2tpcCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNraXApIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgInNraXAlMDJkOiAqKiBTcGVjaWFsU2tpcCAgIDB4JWx4LzB4JWx4IHR5cGU6ICVzXG4iLCBpaywgd2luLCB3aW4yLCBFdHlwZSh0eXBlKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkKLQkJaWYgKHdpbiA9PSByb290d2luKSB7Ci0JCQlpZiAodHlwZSA9PSBDcmVhdGVOb3RpZnkpIHsKLQkJCQlpbnQgeD0wLCB5PTAsIHc9MCwgaD0wOwotCQkJCXZhbGlkID0gMDsKLQkJCQl3aW4yID0gZXYueGNyZWF0ZXdpbmRvdy53aW5kb3c7Ci0JCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4yKTsKLQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNhY2hlX2xpc3RbaWR4XS52YWxpZCkgewotCQkJCQl2YWxpZCA9IDE7Ci0JCQkJCXg9Y2FjaGVfbGlzdFtpZHhdLng7Ci0JCQkJCXk9Y2FjaGVfbGlzdFtpZHhdLnk7Ci0JCQkJCXc9Y2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCQloPWNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCQkJCWlmICh3KmggPiA2NCAqIDY0ICYmIGV2X2xvb2t1cCh3aW4yLCBFVl9NQVApKSB7Ci0JCQkJCQlYX1VOTE9DSzsKLQkJCQkJCXZhbGlkID0gMTsKLQkJCQkJCXN1X3NhdmUoaWR4LCBuYmF0Y2gsICZhdHRyLCAwLCAmdmFsaWQsIDEpOwotCQkJCQkJU1RPUkUoaWR4LCB3aW4yLCBhdHRyKTsKLQotCQkJCQkJWF9MT0NLOwotCi0JCQkJCQlpZiAoISBkZXNrdG9wX2NoYW5nZSkgewotCQkJCQkJCVNDSEVEKHdpbjIsIDEpIAotCQkJCQkJfQotCQkJCQkJY3JlYXRlX2NudCsrOwotCQkJCQl9Ci0JCQkJfQotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAicm9vdCUwMmQ6ICoqIENyZWF0ZU5vdGlmeSAgMHglbHggICUzZCAgLS0gJWR4JWQrJWQrJWQgdmFsaWQ9JWRcbiIsIGlrLCB3aW4yLCBpZHgsIHcsIGgsIHgsIHksIHZhbGlkKTsKLQotCQkJfSBlbHNlIGlmICh0eXBlID09IFJlcGFyZW50Tm90aWZ5KSB7Ci0JCQkJaWYgKGV2LnhyZXBhcmVudC5wYXJlbnQgIT0gcm9vdHdpbikgewotCQkJCQl3aW4yID0gZXYueHJlcGFyZW50LndpbmRvdzsKLQkJCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4yKTsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgInJvb3QlMDJkOiBSZXBhcmVudE5vdGlmeVJNIDB4JWx4ICAlM2RcbiIsIGlrLCB3aW4yLCBpZHgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICJyb290JTAyZDogKiogSWdub3JpbmdSb290ICAweCVseCB0eXBlOiAlc1xuIiwgaWssIHdpbiwgRXR5cGUodHlwZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHR5cGUgPT0gQ29uZmlndXJlTm90aWZ5KSB7Ci0JCQkJaW50IHhfbmV3LCB5X25ldywgd19uZXcsIGhfbmV3OwotCQkJCWludCB4X29sZCwgeV9vbGQsIHdfb2xkLCBoX29sZDsKLQkJCQlpbnQgc3RhY2tfY2hhbmdlLCBvbGRfd20gPSAwOwotCQkJCVdpbmRvdyBvYWJvdmUgPSBOb25lOwotCi0JCQkJaWR4ID0gbG9va3VwX3dpbl9pbmRleCh3aW4pOwotCi0JCQkJaWYgKGlkeCA+PSAwKSB7Ci0JCQkJCW9hYm92ZSA9IGNhY2hlX2xpc3RbaWR4XS5hYm92ZTsKLQkJCQl9Ci0KLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0lMDJkOiBDb25maWd1cmVOb3RpZnkgIDB4JWx4ICAlM2QgIC0tIGFib3ZlOiAweCVseCAtPiAweCVseCAgJWR4JWQrJWQrJWRcbiIsIGlrLCB3aW4sIGlkeCwKLSAgICBvYWJvdmUsIGV2Lnhjb25maWd1cmUuYWJvdmUsIGV2Lnhjb25maWd1cmUud2lkdGgsIGV2Lnhjb25maWd1cmUuaGVpZ2h0LCBldi54Y29uZmlndXJlLngsIGV2Lnhjb25maWd1cmUueSk7Ci0KLQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl4X25ldyA9IGV2Lnhjb25maWd1cmUueDsgCi0JCQkJeV9uZXcgPSBldi54Y29uZmlndXJlLnk7IAotCQkJCXdfbmV3ID0gZXYueGNvbmZpZ3VyZS53aWR0aDsgCi0JCQkJaF9uZXcgPSBldi54Y29uZmlndXJlLmhlaWdodDsgCi0KLQkJCQl4X29sZCA9IGNhY2hlX2xpc3RbaWR4XS54OwotCQkJCXlfb2xkID0gY2FjaGVfbGlzdFtpZHhdLnk7Ci0JCQkJd19vbGQgPSBjYWNoZV9saXN0W2lkeF0ud2lkdGg7Ci0JCQkJaF9vbGQgPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCi0JCQkJaWYgKGRlc2t0b3BfY2hhbmdlX29sZF93bSkgewotCQkJCQlpZiAoZXZfbG9va3VwKHdpbiwgRVZfT0xEX1dNX01BUCkpIHsKLQkJCQkJCWlmIChFdl9tYXBbaWtdID09IHdpbikgewotCQkJCQkJCW9sZF93bSA9IDE7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9sZF93bSA9IDI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZXZfbG9va3VwKHdpbiwgRVZfT0xEX1dNX1VOTUFQKSkgewotCQkJCQkJaWYgKEV2X3VubWFwW2lrXSA9PSB3aW4pIHsKLQkJCQkJCQlvbGRfd20gPSAtMTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJb2xkX3dtID0gMjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9PTERfV01fT0ZGKSkgewotCQkJCQkJb2xkX3dtID0gMjsKLQkJCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9PTERfV01fTk9UTUFQUEVEKSkgewotCQkJCQkJb2xkX3dtID0gMzsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghb2xkX3dtKSAgewotCQkJCQlpZiAoeF9vbGQgIT0geF9uZXcgfHwgeV9vbGQgIT0geV9uZXcpIHsKLQkJCQkJCS8qIGludmFsaWRhdGUgc3UgKi8KLQkJCQkJCWNhY2hlX2xpc3RbaWR4XS5zdV90aW1lID0gMC4wOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIElOVkFMSURBVEUgc3U6IDB4JWx4IHh5OiArJWQrJWQgICslZCslZCBcbiIsIHdpbiwgeF9vbGQsIHlfb2xkLCB4X25ldywgeV9uZXcpOwotCQkJCQl9Ci0JCQkJCWlmICh3X29sZCAhPSB3X25ldyB8fCBoX29sZCAhPSBoX25ldykgewotCQkJCQkJLyogaW52YWxpZGF0ZSBicyAqLwotCQkJCQkJY2FjaGVfbGlzdFtpZHhdLmJzX3RpbWUgPSAwLjA7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgSU5WQUxJREFURSBiczogMHglbHggd2g6ICAlZHglZCAgICVkeCVkIFxuIiwgd2luLCB3X29sZCwgaF9vbGQsIHdfbmV3LCBoX25ldyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgdmFsaWQ7Ci0JCQkJCVhfVU5MT0NLOwotCQkJCQlpZiAob2xkX3dtID09IDEpIHsKLQkJCQkJCS8qIFhYWCBZICovCi1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgT0xEX1dNX01BUDogICAgMHglbHggd2g6ICAlZHglZCslZCslZCAgICVkeCVkKyVkKyVkIFxuIiwgd2luLCB3X29sZCwgaF9vbGQsIHhfb2xkLCB5X29sZCwgd19uZXcsIGhfbmV3LCB4X25ldywgeV9uZXcpOwotCQkJCQkJdmFsaWQgPSAwOwotCQkJCQkJYnNfcmVzdG9yZShpZHgsIG5iYXRjaCwgTlVMTCwgJmF0dHIsIDAsIDAsICZ2YWxpZCwgMSk7Ci0KLQkJCQkJfSBlbHNlIGlmIChvbGRfd20gPT0gLTEpIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBPTERfV01fVU5NQVA6ICAweCVseCB3aDogICVkeCVkKyVkKyVkICAgJWR4JWQrJWQrJWQgXG4iLCB3aW4sIHdfb2xkLCBoX29sZCwgeF9vbGQsIHlfb2xkLCB3X25ldywgaF9uZXcsIHhfbmV3LCB5X25ldyk7Ci0JCQkJCQl2YWxpZCA9IDE7Ci0JCQkJCQlzdV9yZXN0b3JlKGlkeCwgbmJhdGNoLCBOVUxMLCAmYXR0ciwgMSwgMCwgJnZhbGlkLCAxKTsKLQkJCQkJfSBlbHNlIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBPTERfV01fT0ZGOjogICAweCVseCB3aDogICVkeCVkKyVkKyVkICAgJWR4JWQrJWQrJWQgIG9sZF93bT0lZFxuIiwgd2luLCB3X29sZCwgaF9vbGQsIHhfb2xkLCB5X29sZCwgd19uZXcsIGhfbmV3LCB4X25ldywgeV9uZXcsIG9sZF93bSk7Ci0JCQkJCX0KLQkJCQkJWF9MT0NLOwotCQkJCX0KLQotCQkJCXN0YWNrX2NoYW5nZSA9IDA7Ci0JCQkJaWYgKG9sZF93bSkgewotCQkJCQk7Ci0JCQkJfSBlbHNlIGlmIChjYWNoZV9saXN0W2lkeF0uYWJvdmUgIT0gZXYueGNvbmZpZ3VyZS5hYm92ZSkgewotCQkJCQlzdGFja19jaGFuZ2UgPSAxOwotCQkJCX0gZWxzZSBpZiAoeF9uZXcgPT0geF9vbGQgJiYgeV9uZXcgPT0geV9vbGQgJiYgd19uZXcgPT0gd19vbGQgJiYgaF9uZXcgPT0gaF9vbGQpIHsKLQkJCQkJc3RhY2tfY2hhbmdlID0gMTsKLQkJCQl9Ci0JCQkJaWYgKHN0YWNrX2NoYW5nZSkgewotCQkJCQlpbnQgaTIsIG9rID0gMTsKLQkJCQkJZm9yIChpMj0wOyBpMiA8IG47IGkyKyspICB7Ci0JCQkJCQlpZiAoRXZfbWFwW2kyXSA9PSB3aW4pIHsKLQkJCQkJCQlvayA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG9rKSB7Ci0JCQkJCQlpZiAobl9NTiA9PSAwICYmIG5fVU4gPT0gMCkgewotCQkJCQkJCWlmIChzdV9maXhfY250ID4gMCkgewotCQkJCQkJCQlvayA9IDA7Ci1pZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgQ09ORl9JR05PUkU6IFRvbyBtYW55IHN0YWNraW5nIGNoYW5nZXM6IDB4JWx4XG4iLCB3aW4pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChvaykgewotCQkJCQkJaWYgKGV2X2xvb2t1cChldi54Y29uZmlndXJlLmFib3ZlLCBFVl9VTk1BUCkpIHsKLQkJCQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgIHNraXAgdHJ5X3RvX2ZpeF9zdSBmb3IgR05PTUUgZGVpY29uaWZ5ICMxXG4iKTsKLQkJCQkJCQlpZiAoZHRfZ25vbWUpIHsKLQkJCQkJCQkJZ25vbWVfYW5pbWF0aW9uID0gMTsKLQkJCQkJCQl9Ci0JCQkJCQkJb2sgPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvayAmJiBkdF9nbm9tZSkgewotCQkJCQkJaWYgKHZhbGlkX3dpbmRvdyhldi54Y29uZmlndXJlLmFib3ZlLCAmYXR0ciwgMSkpIHsKLQkJCQkJCQlpZiAoYXR0ci5tYXBfc3RhdGUgIT0gSXNWaWV3YWJsZSkgewotCQkJCQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgIHNraXAgdHJ5X3RvX2ZpeF9zdSBmb3IgR05PTUUgZGVpY29uaWZ5ICMyXG4iKTsKLQkJCQkJCQkJZ25vbWVfYW5pbWF0aW9uID0gMTsKLQkJCQkJCQkJb2sgPSAwOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob2spIHsKLQkJCQkJCWludCByYyA9IHRyeV90b19maXhfc3Uod2luLCBpZHgsIGV2Lnhjb25maWd1cmUuYWJvdmUsIG5iYXRjaCwgTlVMTCk7CQotCQkJCQkJaWYgKHJjID09IDAgJiYgc3VfZml4X2NudCA9PSAwICYmIG5fTU4gPT0gMCAmJiBuX1VOID09IDApIHsKLQkJCQkJCQlYX1VOTE9DSzsKLQkJCQkJCQl0cnlfdG9fc3ludGhlc2l6ZV9zdSgxLCAxLCBuYmF0Y2gpOwotCQkJCQkJCVhfTE9DSzsKLQkJCQkJCX0KLQkJCQkJCW5fU1QrKzsKLQkJCQkJCXN1X2ZpeF9jbnQrKzsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWNhY2hlX2xpc3RbaWR4XS54ID0geF9uZXc7Ci0JCQkJY2FjaGVfbGlzdFtpZHhdLnkgPSB5X25ldzsKLQkJCQljYWNoZV9saXN0W2lkeF0ud2lkdGggPSB3X25ldzsKLQkJCQljYWNoZV9saXN0W2lkeF0uaGVpZ2h0ID0gaF9uZXc7Ci0KLQkJCQljYWNoZV9saXN0W2lkeF0uYWJvdmUgPSBldi54Y29uZmlndXJlLmFib3ZlOwotCQkJCWNhY2hlX2xpc3RbaWR4XS50aW1lID0gZG5vdygpOwotCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmlzaWJpbGl0eU5vdGlmeSkgewotCQkJCWludCBzdGF0ZSA9IGV2Lnh2aXNpYmlsaXR5LnN0YXRlOwotCQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luKTsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0lMDJkOiBWaXNpYmlsaXR5Tm90aWZ5IDB4JWx4ICAlM2QgIHN0YXRlOiAlcyBVL1AgJWQvJWRcbiIsIGlrLCB3aW4sIGlkeCwgVlN0YXRlKHN0YXRlKSwgbl9WTl91LCBuX1ZOX3ApOwotCi0JCQkJaWYgKGlkeCA8IDApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChkZXNrdG9wX2NoYW5nZSkgewotCQkJCQk7Ci0JCQkJfSBlbHNlIGlmIChtYWNvc3hfY29uc29sZSAmJiBuX1ZOX3AgPT0gMCkgewotCQkJCQk7CS8qIFhYWFggbm90IHdvcmtpbmcgd2VsbCB5ZXQgd2l0aCBVbm1hcE5vdGlmeSAuLi4gKi8KLQkJCQl9IGVsc2UgaWYgKHN0YXRlID09IFZpc2liaWxpdHlVbm9ic2N1cmVkKSB7Ci0JCQkJCWludCBvayA9IDE7Ci0JCQkJCWlmIChuY2FjaGUgPD0gMikgewotCQkJCQkJb2sgPSAwOwotCQkJCQl9IGVsc2UgaWYgKGV2X2xvb2t1cCh3aW4sIEVWX01BUCkpIHsKLQkJCQkJCW9rID0gMDsKLQkJCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9VTk1BUCkpIHsKLQkJCQkJCW9rID0gMDsKLQkJCQkJfSBlbHNlIGlmIChldl9sb29rdXAod2luLCBFVl9ERVNUUk9ZKSkgewotCQkJCQkJb2sgPSAwOwotCQkJCQl9IGVsc2UgaWYgKGdub21lX2FuaW1hdGlvbikgewotCQkJCQkJb2sgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogdGhpcyBpcyBmb3IgZ25vbWUgaWNvbmlmeSAqLwotCQkJCQkJaW50IGkyOwotCQkJCQkJZm9yIChpMj1pKzE7IGkyIDwgbjsgaTIrKykgewotCQkJCQkJCWludCBpZHgyLCBpazIgPSBFdl9vcmRlcltpMl07Ci0JCQkJCQkJc3JhUmVnaW9uUHRyIHJvMSwgcm8yOwotCQkJCQkJCVdpbmRvdyB3aW4yID0gRXZfdW5tYXBbaWsyXTsKLQotCQkJCQkJCWlmICh3aW4yID09IE5vbmUpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlkeDIgPSBsb29rdXBfd2luX2luZGV4KHdpbjIpOwotCQkJCQkJCWlmIChpZHgyIDwgMCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlybzEgPSBpZHhfY3JlYXRlX3JnbihyMCwgaWR4KTsKLQkJCQkJCQlybzIgPSBpZHhfY3JlYXRlX3JnbihyMCwgaWR4Mik7Ci0KLQkJCQkJCQlpZiAoc3JhUmduQW5kKHJvMSwgcm8yKSkgewotCQkJCQkJCQlpZiAobmNkYikgZnByaW50ZihzdGRlcnIsICIgICAgICAgIHNraXAgVmlzaWJpbGl0eVVub2JzY3VyZWQgZm9yIEdOT01FIGljb25pZnkuXG4iKTsKLQkJCQkJCQkJb2sgPSAwOwotCQkJCQkJCX0KLQkJCQkJCQlzcmFSZ25EZXN0cm95KHJvMSk7Ci0JCQkJCQkJc3JhUmduRGVzdHJveShybzIpOwotCQkJCQkJCWlmICghIG9rKSB7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob2spIHsKLQkJCQkJCWludCB4MiwgeTIsIHcyLCBoMjsKLQkJCQkJCXNyYVJlZ2lvblB0ciBybWFzayA9IE5VTEw7Ci0JCQkJCQl2YWxpZCA9IDA7Ci0JCQkJCQlpZiAoZG5vdygpIDwgY2FjaGVfbGlzdFtpZHhdLnZpc191bm9ic190aW1lICsgMy4wMCAmJiAhc3JhUmduRW1wdHkodW5tYXBwZWRfcmduKSkgewotCQkJCQkJCXgyID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JCQkJCQkJeTIgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQkJCQl3MiA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQkJCQkJCQloMiA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCQkJCQkJcm1hc2sgPSBzcmFSZ25DcmVhdGVSZWN0KHgyLCB5MiwgeDIrdzIsIHkyK2gyKTsKLQkJCQkJCQlzcmFSZ25BbmQocm1hc2ssIHVubWFwcGVkX3Jnbik7Ci0JCQkJCQkJaWYgKHNyYVJnbkVtcHR5KHJtYXNrKSkgewotCQkJCQkJCQlzcmFSZ25EZXN0cm95KHJtYXNrKTsKLQkJCQkJCQkJcm1hc2sgPSBOVUxMOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChldl9sb29rdXAod2luLCBFVl9DT05GSUdVUkVfU0laRSkpIHsKLQkJCQkJCQl2YWxpZCA9IHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJWF9VTkxPQ0s7Ci0JCQkJCQkJYnNfcmVzdG9yZShpZHgsIG5iYXRjaCwgcm1hc2ssICZhdHRyLCAwLCAxLCAmdmFsaWQsIDEpOwotCQkJCQkJCVhfTE9DSzsKLQkJCQkJCX0KLQkJCQkJCWlmIChybWFzayAhPSBOVUxMKSB7Ci0JCQkJCQkJc3JhUmduRGVzdHJveShybWFzayk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQlTVE9SRShpZHgsIHdpbiwgYXR0cik7Ci0KLQkJCQkJCQljYWNoZV9saXN0W2lkeF0udGltZSA9IGRub3coKTsKLQkJCQkJCQljYWNoZV9saXN0W2lkeF0udmlzX2NudCsrOwotCQkJCQkJCUV2X21hcFtpa10gPSB3aW47Ci0JCQkJCQkJRXZfcmVjdHNbbnJlY3RzXS54MSA9IGNhY2hlX2xpc3RbaWR4XS54OwotCQkJCQkJCUV2X3JlY3RzW25yZWN0c10ueTEgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQkJCQlFdl9yZWN0c1tucmVjdHNdLngyID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCQkJCUV2X3JlY3RzW25yZWN0c10ueTIgPSBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCQkJCQkJCW5yZWN0cysrOwotCQkJCQkJCVNDSEVEKHdpbiwgMSkgCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCURFTEVURShpZHgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzdGF0ZSA9PSBWaXNpYmlsaXR5VW5vYnNjdXJlZCkgewotCQkJCQljYWNoZV9saXN0W2lkeF0udmlzX3Vub2JzX3RpbWUgPSBsYXN0X3Zpc191bm9ic190aW1lID0gZG5vdygpOwotCQkJCX0gZWxzZSBpZiAoY2FjaGVfbGlzdFtpZHhdLnZpc19zdGF0ZSA9PSBWaXNpYmlsaXR5VW5vYnNjdXJlZCkgewotCQkJCQljYWNoZV9saXN0W2lkeF0udmlzX29ic190aW1lID0gbGFzdF92aXNfb2JzX3RpbWUgPSBkbm93KCk7Ci0JCQkJfQotCQkJCWNhY2hlX2xpc3RbaWR4XS52aXNfc3RhdGUgPSBzdGF0ZTsKLQotCQkJfSBlbHNlIGlmICh0eXBlID09IE1hcE5vdGlmeSkgewotCQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luKTsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0lMDJkOiBNYXBOb3RpZnkgICAgICAgIDB4JWx4ICAlM2RcbiIsIGlrLCB3aW4sIGlkeCk7Ci0KLQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLSNpZiAwCi0vKgotCQkJCWlmIChjYWNoZV9saXN0W2lkeF0ubWFwX3N0YXRlID09IElzVW5tYXBwZWQgfHwgZGVza3RvcF9jaGFuZ2UgfHwgbWFjb3N4X2NvbnNvbGUpCi0gKi8KLSNlbmRpZgotCQkJCWlmICgxKSB7Ci0JCQkJCVhfVU5MT0NLOwotCQkJCQlpZiAoZGVza3RvcF9jaGFuZ2UpIHsKLQkJCQkJCS8qIFhYWCBZICovCi0JCQkJCQlpbnQgc2F2ZSA9IDE7Ci0JCQkJCQlzcmFSZWdpb25QdHIgcjsKLQkJCQkJCWlmIChjYWNoZV9saXN0W2lkeF0uc3VfdGltZSAhPSAwLjApIHsKLQkJCQkJCQlzYXZlID0gMDsKLQkJCQkJCX0gZWxzZSBpZiAobWlzc2VkX3N1X3Jlc3RvcmUpIHsKLQkJCQkJCQlyID0gaWR4X2NyZWF0ZV9yZ24ocjAsIGlkeCk7Ci0JCQkJCQkJaWYgKHNyYVJnbkFuZChyLCBtaXNzZWRfc3VfcmVzdG9yZV9yZ24pKSB7Ci0JCQkJCQkJCXNhdmUgPSAwOwotCQkJCQkJCX0KLQkJCQkJCQlzcmFSZ25EZXN0cm95KHIpOwotCQkJCQkJfQotCQkJCQkJaWYgKG1pc3NlZF9ic19yZXN0b3JlKSB7Ci0JCQkJCQkJciA9IGlkeF9jcmVhdGVfcmduKHIwLCBpZHgpOwotCQkJCQkJCWlmIChzcmFSZ25BbmQociwgbWlzc2VkX2JzX3Jlc3RvcmVfcmduKSkgewotCQkJCQkJCQlzYXZlID0gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJc3JhUmduRGVzdHJveShyKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChzYXZlKSB7Ci0JCQkJCQkJdmFsaWQgPSAwOwotCQkJCQkJCXN1X3NhdmUoaWR4LCBuYmF0Y2gsICZhdHRyLCAxLCAmdmFsaWQsIDEpOwotCQkJCQkJCWlmICh2YWxpZCkgewotCQkJCQkJCQlTVE9SRShpZHgsIHdpbiwgYXR0cik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsaWQgPSAwOwotCQkJCQkJc3Vfc2F2ZShpZHgsIG5iYXRjaCwgJmF0dHIsIDAsICZ2YWxpZCwgMSk7Ci0JCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQlTVE9SRShpZHgsIHdpbiwgYXR0cik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdmFsaWQgPSAwOwotCQkJCQlpZiAoZXZfbG9va3VwKHdpbiwgRVZfQ09ORklHVVJFX1NJWkUpKSB7Ci0JCQkJCQlYX0xPQ0s7Ci0JCQkJCQl2YWxpZCA9IHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKTsKLQkJCQkJCVhfVU5MT0NLOwotCQkJCQkJaWR4X2FkZF9yZ24obWlzc2VkX2JzX3Jlc3RvcmVfcmduLCByMCwgaWR4KTsKLQkJCQkJCW1pc3NlZF9ic19yZXN0b3JlKys7Ci0JCQkJCX0gZWxzZSBpZiAoYnNfcmVzdG9yZShpZHgsIG5iYXRjaCwgTlVMTCwgJmF0dHIsIDAsIDAsICZ2YWxpZCwgMSkpIHsgLyogWFhYIGNsaXA/ICovCi0JCQkJCQk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZHhfYWRkX3JnbihtaXNzZWRfYnNfcmVzdG9yZV9yZ24sIHIwLCBpZHgpOwotCQkJCQkJbWlzc2VkX2JzX3Jlc3RvcmUrKzsKLQkJCQkJfQotCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCVNUT1JFKGlkeCwgd2luLCBhdHRyKTsKLQkJCQkJfQotCi0JCQkJCWlmIChtYWNvc3hfY29uc29sZSkgewotI2lmZGVmIE1BQ09TWAotCQkJCQkJbWFjb3N4Q0dTX2ZvbGxvd19hbmltYXRpb25fd2luKHdpbiwgLTEsIDEpOwotCQkJCQkJaWYgKHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKSkgewotCQkJCQkJCVNUT1JFKGlkeCwgd2luLCBhdHRyKTsKLQkJCQkJCQlTQ0hFRCh3aW4sIDEpOwotCQkJCQkJfQotCQkJCQkJLyogWFhYIFkgKi8KLQkJCQkJCWlmIChjYWNoZV9saXN0W2lkeF0udmlzX3N0YXRlID09IC0xKSAgewotCQkJCQkJCWNhY2hlX2xpc3RbaWR4XS52aXNfc3RhdGUgPSBWaXNpYmlsaXR5VW5vYnNjdXJlZDsKLQkJCQkJCX0KLSNlbmRpZgotCQkJCQl9Ci0JCQkJCVhfTE9DSzsKLQkJCQkJcGl4ZWxzICs9IGNhY2hlX2xpc3RbaWR4XS53aWR0aCAqIGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCQkJCWNhY2hlX2xpc3RbaWR4XS50aW1lID0gZG5vdygpOwotCQkJCQljYWNoZV9saXN0W2lkeF0ubWFwX2NudCsrOwotCQkJCQlFdl9tYXBbaWtdID0gd2luOwotCQkJCQlFdl9yZWN0c1tucmVjdHNdLngxID0gY2FjaGVfbGlzdFtpZHhdLng7Ci0JCQkJCUV2X3JlY3RzW25yZWN0c10ueTEgPSBjYWNoZV9saXN0W2lkeF0ueTsKLQkJCQkJRXZfcmVjdHNbbnJlY3RzXS54MiA9IGNhY2hlX2xpc3RbaWR4XS53aWR0aDsKLQkJCQkJRXZfcmVjdHNbbnJlY3RzXS55MiA9IGNhY2hlX2xpc3RbaWR4XS5oZWlnaHQ7Ci0JCQkJCW5yZWN0cysrOwotCi0JCQkJCWlmICghIHZhbGlkKSB7Ci0JCQkJCQlERUxFVEUoaWR4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYWNoZV9saXN0W2lkeF0ubWFwX3N0YXRlID0gSXNWaWV3YWJsZTsKLQotCQkJfSBlbHNlIGlmICh0eXBlID09IFVubWFwTm90aWZ5KSB7Ci0JCQkJaW50IHgyLCB5MiwgdzIsIGgyOwotCQkJCWlkeCA9IGxvb2t1cF93aW5faW5kZXgod2luKTsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgIi0tLS0lMDJkOiBVbm1hcE5vdGlmeSAgICAgIDB4JWx4ICAlM2RcbiIsIGlrLCB3aW4sIGlkeCk7Ci0KLQkJCQlpZiAoaWR4IDwgMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCQkJCWlmIChtb2RlID09IDIpIHsKLQkJCQkJCWNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgPSBJc1ZpZXdhYmxlOwotCQkJCQl9Ci0JCQkJfQotCi0jaWYgMAotLyoKLQkJCQlpZiAoY2FjaGVfbGlzdFtpZHhdLm1hcF9zdGF0ZSA9PSBJc1ZpZXdhYmxlIHx8IGRlc2t0b3BfY2hhbmdlIHx8IG1hY29zeF9jb25zb2xlKQotICovCi0jZW5kaWYKLQkJCQlpZiAoMSkgewotCQkJCQlYX1VOTE9DSzsKLQkJCQkJaWYgKGRlc2t0b3BfY2hhbmdlKSB7Ci0JCQkJCQlpbnQgc2F2ZSA9IDE7Ci0JCQkJCQlzcmFSZWdpb25QdHIgcjsKLQkJCQkJCWlmIChjYWNoZV9saXN0W2lkeF0uYnNfdGltZSA+IDAuMCkgewotCQkJCQkJCXNhdmUgPSAwOwotCQkJCQkJfSBlbHNlIGlmIChtaXNzZWRfc3VfcmVzdG9yZSkgewotCQkJCQkJCXIgPSBpZHhfY3JlYXRlX3JnbihyMCwgaWR4KTsKLQkJCQkJCQlpZiAoc3JhUmduQW5kKHIsIG1pc3NlZF9zdV9yZXN0b3JlX3JnbikpIHsKLQkJCQkJCQkJc2F2ZSA9IDA7Ci0JCQkJCQkJfQotCQkJCQkJCXNyYVJnbkRlc3Ryb3kocik7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobWlzc2VkX2JzX3Jlc3RvcmUpIHsKLQkJCQkJCQlyID0gaWR4X2NyZWF0ZV9yZ24ocjAsIGlkeCk7Ci0JCQkJCQkJaWYgKHNyYVJnbkFuZChyLCBtaXNzZWRfYnNfcmVzdG9yZV9yZ24pKSB7Ci0JCQkJCQkJCXNhdmUgPSAwOwotCQkJCQkJCX0KLQkJCQkJCQlzcmFSZ25EZXN0cm95KHIpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNhdmUpIHsKLQkJCQkJCQl2YWxpZCA9IDA7Ci0JCQkJCQkJYnNfc2F2ZShpZHgsIG5iYXRjaCwgJmF0dHIsIDEsIDAsICZ2YWxpZCwgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IDA7Ci0JCQkJCQlic19zYXZlKGlkeCwgbmJhdGNoLCAmYXR0ciwgMSwgMCwgJnZhbGlkLCAxKTsKLQkJCQkJfQotCQkJCQl2YWxpZCA9IDA7Ci0JCQkJCWlmIChzdV9yZXN0b3JlKGlkeCwgbmJhdGNoLCBOVUxMLCAmYXR0ciwgMSwgMCwgJnZhbGlkLCAxKSkgewotCQkJCQkJdHJ5X3RvX2ZpeF9zdSh3aW4sIGlkeCwgTm9uZSwgbmJhdGNoLCAidW5tYXBwZWQiKTsJCi0JCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQlTVE9SRShpZHgsIHdpbiwgYXR0cik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCURFTEVURShpZHgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWR4X2FkZF9yZ24obWlzc2VkX3N1X3Jlc3RvcmVfcmduLCByMCwgaWR4KTsKLQkJCQkJCW1pc3NlZF9zdV9yZXN0b3JlKys7Ci0JCQkJCX0KLQkJCQkJWF9MT0NLOwotCi0JCQkJCXBpeGVscyArPSBjYWNoZV9saXN0W2lkeF0ud2lkdGggKiBjYWNoZV9saXN0W2lkeF0uaGVpZ2h0OwotCQkJCQljYWNoZV9saXN0W2lkeF0udGltZSA9IGRub3coKTsKLQkJCQkJY2FjaGVfbGlzdFtpZHhdLnVubWFwX2NudCsrOwotCQkJCQlFdl91bm1hcFtpa10gPSB3aW47Ci0JCQkJCUV2X3JlY3RzW25yZWN0c10ueDEgPSBjYWNoZV9saXN0W2lkeF0ueDsKLQkJCQkJRXZfcmVjdHNbbnJlY3RzXS55MSA9IGNhY2hlX2xpc3RbaWR4XS55OwotCQkJCQlFdl9yZWN0c1tucmVjdHNdLngyID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCQlFdl9yZWN0c1tucmVjdHNdLnkyID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQkJCQkJbnJlY3RzKys7Ci0JCQkJfQotCi0JCQkJeDIgPSBjYWNoZV9saXN0W2lkeF0ueDsKLQkJCQl5MiA9IGNhY2hlX2xpc3RbaWR4XS55OwotCQkJCXcyID0gY2FjaGVfbGlzdFtpZHhdLndpZHRoOwotCQkJCWgyID0gY2FjaGVfbGlzdFtpZHhdLmhlaWdodDsKLQkJCQlyID0gc3JhUmduQ3JlYXRlUmVjdCh4MiwgeTIsIHgyK3cyLCB5MitoMik7Ci0JCQkJc3JhUmduQW5kKHIsIHIwKTsgCi0JCQkJc3JhUmduT3IodW5tYXBwZWRfcmduLCByKTsgCi0JCQkJc3JhUmduRGVzdHJveShyKTsKLQotCQkJCWNhY2hlX2xpc3RbaWR4XS5tYXBfc3RhdGUgPSBJc1VubWFwcGVkOwotCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gUmVwYXJlbnROb3RpZnkpIHsKLQkJCQlpZiAoZXYueHJlcGFyZW50LnBhcmVudCAhPSByb290d2luKSB7Ci0JCQkJCXdpbjIgPSBldi54cmVwYXJlbnQud2luZG93OwotCQkJCQlpZiAod2luMiAhPSByb290d2luKSB7Ci0JCQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KHdpbjIpOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiLS0tLSUwMmQ6IFJlcGFyZW50Tm90aWZ5Uk0gMHglbHggICUzZFxuIiwgaWssIHdpbjIsIGlkeCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBEZXN0cm95Tm90aWZ5KSB7Ci0JCQkJd2luMiA9IGV2LnhkZXN0cm95d2luZG93LndpbmRvdzsKLQkJCQlpZHggPSBsb29rdXBfd2luX2luZGV4KHdpbjIpOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiLS0tLSUwMmQ6IERlc3Ryb3lOb3RpZnkgICAgMHglbHggICUzZFxuIiwgaWssIHdpbjIsIGlkeCk7Ci0KLQkJCQlpZiAoaWR4ID49IDApIHsKLQkJCQkJREVMRVRFKGlkeCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLWlmIChuY2RiKSBmcHJpbnRmKHN0ZGVyciwgImlnbm8lMDJkOiAqKiBJZ25vcmluZyAgICAgIDB4JWx4IHR5cGU6ICVzXG4iLCBpaywgd2luLCBFdHlwZSh0eXBlKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQlYX1VOTE9DSzsKLQotCWlmICh1c2VfYmF0Y2ggJiYgbnJlZykgewotCQliYXRjaF9wdXNoKG5yZWcsIC0xLjApOwotCX0KLQlpZiAobnJlY3RzKSB7Ci0JCWlmIChzY2FsaW5nKSB7Ci0JCQlwdXNoX2JvcmRlcnMoRXZfcmVjdHMsIG5yZWN0cyk7Ci0JCX0KLQl9Ci0KLQljaGVja19zY2hlZCh0cnlfYmF0Y2gsICZkaWRfc2NoZWQpOwotCi0JaWYgKG5fQ04gfHwgbl9STiB8fCBuX0ROIHx8IG5fTU4gfHwgbl9VTiB8fCBuX1NUIHx8IG5fREMgfHwgZGlkX3NjaGVkKSB7Ci0JCXNuYXBfb2xkKCk7Ci0JfQotCi0Jc3JhUmduRGVzdHJveShyMCk7Ci0Jc3JhUmduRGVzdHJveShtaXNzZWRfc3VfcmVzdG9yZV9yZ24pOwotCXNyYVJnbkRlc3Ryb3kobWlzc2VkX2JzX3Jlc3RvcmVfcmduKTsKLQotaWYgKG5jZGIpIHJmYkxvZygiT1VUIGNoZWNrX25jYWNoZSgpOiAlLjRmICUuNmYgZXZlbnRzOiAlZCAgcGl4ZWxzOiAlZFxuIiwgZG5vd3goKSwgZG5vdygpIC0gbm93LCBuLCBwaXhlbHMpOwotaWYgKG5jZGIpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlyZXR1cm4gcGl4ZWxzOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy91c2VyaW5wdXQuaCBiL3gxMXZuYy91c2VyaW5wdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmZDJiMy4uMDAwMDAwMAotLS0gYS94MTF2bmMvdXNlcmlucHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19VU0VSSU5QVVRfSAotI2RlZmluZSBfWDExVk5DX1VTRVJJTlBVVF9ICi0KLS8qIC0tIHVzZXJpbnB1dC5oIC0tICovCi0KLWV4dGVybiBpbnQgZGVmZXJfdXBkYXRlX25vZmI7Ci1leHRlcm4gaW50IGxhc3Rfc2Nyb2xsX3R5cGU7Ci0KLWV4dGVybiBpbnQgZ2V0X3dtX2ZyYW1lX3BvcyhpbnQgKnB4LCBpbnQgKnB5LCBpbnQgKngsIGludCAqeSwgaW50ICp3LCBpbnQgKmgsCi0gICAgV2luZG93ICpmcmFtZSwgV2luZG93ICp3aW4pOwotZXh0ZXJuIHZvaWQgcGFyc2Vfc2Nyb2xsX2NvcHlyZWN0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGFyc2VfZml4c2NyZWVuKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGFyc2Vfd2lyZWZyYW1lKHZvaWQpOwotCi1leHRlcm4gdm9pZCBzZXRfd2lyZWNvcHlyZWN0X21vZGUoY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIHNldF9zY3JvbGxjb3B5cmVjdF9tb2RlKGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3Njcm9sbF9rZXlzKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9zY3JvbGxfbWF0Y2hlcyh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfc2Nyb2xsX3Rlcm0odm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX21heF9rZXlyZXBlYXQodm9pZCk7Ci0KLWV4dGVybiBpbnQgZGlyZWN0X2ZiX2NvcHkoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgbWFyayk7Ci1leHRlcm4gdm9pZCBmYl9wdXNoKHZvaWQpOwotZXh0ZXJuIGludCBmYl9wdXNoX3dhaXQoZG91YmxlIG1heF93YWl0LCBpbnQgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgZWF0X3ZpZXdvbmx5X2lucHV0KGludCBtYXhfZWF0LCBpbnQga2VlcCk7Ci0KLWV4dGVybiB2b2lkIG1hcmtfZm9yX3hkYW1hZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwotZXh0ZXJuIHZvaWQgbWFya19yZWdpb25fZm9yX3hkYW1hZ2Uoc3JhUmVnaW9uUHRyIHJlZ2lvbik7Ci1leHRlcm4gdm9pZCBzZXRfeGRhbWFnZV9tYXJrKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLWV4dGVybiBpbnQgbmVhcl93bV9lZGdlKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgcHgsIGludCBweSk7Ci1leHRlcm4gaW50IG5lYXJfc2Nyb2xsYmFyX2VkZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBweCwgaW50IHB5KTsKLQotZXh0ZXJuIHZvaWQgY2hlY2tfZml4c2NyZWVuKHZvaWQpOwotZXh0ZXJuIGludCBjaGVja194cmVjb3JkKHZvaWQpOwotZXh0ZXJuIGludCBjaGVja193aXJlZnJhbWUodm9pZCk7Ci1leHRlcm4gaW50IGZiX3VwZGF0ZV9zZW50KGludCAqY291bnQpOwotZXh0ZXJuIGludCBjaGVja191c2VyX2lucHV0KGRvdWJsZSBkdCwgZG91YmxlIGR0ciwgaW50IHRpbGVfZGlmZnMsIGludCAqY250KTsKLWV4dGVybiB2b2lkIGRvX2NvcHlyZWdpb24oc3JhUmVnaW9uUHRyIHJlZ2lvbiwgaW50IGR4LCBpbnQgZHksIGludCBtb2RlKTsKLQotZXh0ZXJuIGludCBjaGVja19uY2FjaGUoaW50IHJlc2V0LCBpbnQgbW9kZSk7Ci1leHRlcm4gaW50IGZpbmRfcmVjdChpbnQgaWR4LCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Ci1leHRlcm4gaW50IGxvb2t1cF93aW5faW5kZXgoV2luZG93KTsKLWV4dGVybiB2b2lkIHNldF9uY2FjaGVfeHJvb3RwbWFwKHZvaWQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19VU0VSSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3V0aWwuYyBiL3gxMXZuYy91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjE2MDcuLjAwMDAwMDAKLS0tIGEveDExdm5jL3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHV0aWwuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgIndpbl91dGlscy5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0KLXN0cnVjdCB0aW1ldmFsIF9teXNsZWVwOwotCi0vKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnZ2luZyBtdXRleGVzLiBzZWUgdXRpbC5oICovCi1pbnQgaHhsID0gMDsKLQotI2lmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlBUSFJFQUQKLU1VVEVYKHgxMU11dGV4KTsKLU1VVEVYKHNjcm9sbE11dGV4KTsKLSNlbmRpZgotCi1pbnQgbmZpeChpbnQgaSwgaW50IG4pOwotaW50IG5taW4oaW50IG4sIGludCBtKTsKLWludCBubWF4KGludCBuLCBpbnQgbSk7Ci1pbnQgbmFicyhpbnQgbik7Ci1kb3VibGUgZGFicyhkb3VibGUgeCk7Ci12b2lkIGxvd2VyY2FzZShjaGFyICpzdHIpOwotdm9pZCB1cHBlcmNhc2UoY2hhciAqc3RyKTsKLWNoYXIgKmxibGFua3MoY2hhciAqc3RyKTsKLXZvaWQgc3RyemVybyhjaGFyICpzdHIpOwotaW50IHNjYW5faGV4ZGVjKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyAqbnVtKTsKLWludCBwYXJzZV9nZW9tKGNoYXIgKnN0ciwgaW50ICp3cCwgaW50ICpocCwgaW50ICp4cCwgaW50ICp5cCwgaW50IFcsIGludCBIKTsKLXZvaWQgc2V0X2VudihjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSk7Ci1jaGFyICpiaXRwcmludCh1bnNpZ25lZCBpbnQgc3QsIGludCBuYml0cyk7Ci1jaGFyICpnZXRfdXNlcl9uYW1lKHZvaWQpOwotY2hhciAqZ2V0X2hvbWVfZGlyKHZvaWQpOwotY2hhciAqZ2V0X3NoZWxsKHZvaWQpOwotY2hhciAqdGhpc19ob3N0KHZvaWQpOwotCi1pbnQgbWF0Y2hfc3RyX2xpc3QoY2hhciAqc3RyLCBjaGFyICoqbGlzdCk7Ci1jaGFyICoqY3JlYXRlX3N0cl9saXN0KGNoYXIgKmNzbGlzdCk7Ci0KLWRvdWJsZSBkdGltZShkb3VibGUgKik7Ci1kb3VibGUgZHRpbWUwKGRvdWJsZSAqKTsKLWRvdWJsZSBkbm93KHZvaWQpOwotZG91YmxlIGRub3d4KHZvaWQpOwotZG91YmxlIHJub3codm9pZCk7Ci1kb3VibGUgcmZhYyh2b2lkKTsKLQotaW50IHJmYlBFKGxvbmcgdXNlYyk7Ci12b2lkIHJmYkNGRChsb25nIHVzZWMpOwotCi1kb3VibGUgcmVjdF9vdmVybGFwKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IFgxLCBpbnQgWTEsCi0gICAgaW50IFgyLCBpbnQgWTIpOwotCi1jaGFyICpjaG9vc2VfdGl0bGUoY2hhciAqZGlzcGxheSk7Ci0KLQotLyoKLSAqIHJvdXRpbmUgdG8ga2VlcCAwIDw9IGkgPCBuCi0gKi8KLWludCBuZml4KGludCBpLCBpbnQgbikgewotCWlmIChpIDwgMCkgewotCQlpID0gMDsKLQl9IGVsc2UgaWYgKGkgPj0gbikgewotCQlpID0gbiAtIDE7Ci0JfQotCXJldHVybiBpOwotfQotCi1pbnQgbm1pbihpbnQgbiwgaW50IG0pIHsKLQlpZiAobiA8IG0pIHsKLQkJcmV0dXJuIG47Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG07Ci0JfQotfQotCi1pbnQgbm1heChpbnQgbiwgaW50IG0pIHsKLQlpZiAobiA+IG0pIHsKLQkJcmV0dXJuIG47Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG07Ci0JfQotfQotCi1pbnQgbmFicyhpbnQgbikgewotCWlmIChuIDwgMCkgewotCQlyZXR1cm4gLW47Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG47Ci0JfQotfQotCi1kb3VibGUgZGFicyhkb3VibGUgeCkgewotCWlmICh4IDwgMC4wKSB7Ci0JCXJldHVybiAteDsKLQl9IGVsc2UgewotCQlyZXR1cm4geDsKLQl9Ci19Ci0KLXZvaWQgbG93ZXJjYXNlKGNoYXIgKnN0cikgewotCWNoYXIgKnA7Ci0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JcCA9IHN0cjsKLQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQkqcCA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICgqcCkpOwotCQlwKys7Ci0JfQotfQotCi12b2lkIHVwcGVyY2FzZShjaGFyICpzdHIpIHsKLQljaGFyICpwOwotCWlmIChzdHIgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCXAgPSBzdHI7Ci0Jd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJKnAgPSB0b3VwcGVyKCh1bnNpZ25lZCBjaGFyKSAoKnApKTsKLQkJcCsrOwotCX0KLX0KLQotY2hhciAqbGJsYW5rcyhjaGFyICpzdHIpIHsKLQljaGFyICpwID0gc3RyOwotCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCWlmICghIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICgqcCkpKSB7Ci0JCQlicmVhazsKLQkJfQotCQlwKys7Ci0JfQotCXJldHVybiBwOwotfQotCi12b2lkIHN0cnplcm8oY2hhciAqc3RyKSB7Ci0JY2hhciAqcCA9IHN0cjsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCQkqcCA9ICdcMCc7Ci0JCQlwKys7Ci0JCX0KLQl9Ci19Ci0KLWludCBpc19kZWNpbWFsKGNoYXIgKnN0cikgewotCWNoYXIgKnAgPSBzdHI7Ci0JaWYgKHAgIT0gTlVMTCkgewotCQlpbnQgZmlyc3QgPSAxOwotCQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQkJaWYgKGZpcnN0ICYmICpwID09ICctJykgewotCQkJCTsKLQkJCX0gZWxzZSBpZiAoaXNkaWdpdCgoaW50KSAqcCkpIHsKLQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZmlyc3QgPSAwOwotCQkJcCsrOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNjYW5faGV4ZGVjKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyAqbnVtKSB7Ci0JaWYgKHNzY2FuZihzdHIsICIweCVseCIsIG51bSkgIT0gMSkgewotCQlpZiAoc3NjYW5mKHN0ciwgIiVsdSIsIG51bSkgIT0gMSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBwYXJzZV9nZW9tKGNoYXIgKnN0ciwgaW50ICp3cCwgaW50ICpocCwgaW50ICp4cCwgaW50ICp5cCwgaW50IFcsIGludCBIKSB7Ci0JaW50IHcsIGgsIHgsIHk7Ci0JaWYgKCEgc3RyKSB7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBoYW5kbGUgKy8teCBhbmQgKy8teSAqLwotCWlmIChzc2NhbmYoc3RyLCAiJWR4JWQrJWQrJWQiLCAmdywgJmgsICZ4LCAmeSkgPT0gNCkgewotCQk7Ci0JfSBlbHNlIGlmIChzc2NhbmYoc3RyLCAiJWR4JWQtJWQrJWQiLCAmdywgJmgsICZ4LCAmeSkgPT0gNCkgewotCQl3ID0gbmFicyh3KTsKLQkJeCA9IFcgLSB4IC0gdzsKLQl9IGVsc2UgaWYgKHNzY2FuZihzdHIsICIlZHglZCslZC0lZCIsICZ3LCAmaCwgJngsICZ5KSA9PSA0KSB7Ci0JCWggPSBuYWJzKGgpOwotCQl5ID0gSCAtIHkgLSBoOwotCX0gZWxzZSBpZiAoc3NjYW5mKHN0ciwgIiVkeCVkLSVkLSVkIiwgJncsICZoLCAmeCwgJnkpID09IDQpIHsKLQkJdyA9IG5hYnModyk7Ci0JCWggPSBuYWJzKGgpOwotCQl4ID0gVyAtIHggLSB3OwotCQl5ID0gSCAtIHkgLSBoOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLQkqd3AgPSB3OwotCSpocCA9IGg7Ci0JKnhwID0geDsKLQkqeXAgPSB5OwotCXJldHVybiAxOwotfQotCi12b2lkIHNldF9lbnYoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpIHsKLQljaGFyICpzdHI7Ci0JaWYgKCEgbmFtZSkgewotCQlyZXR1cm47Ci0JfQotCWlmICghIHZhbHVlKSB7Ci0JCXZhbHVlID0gIiI7Ci0JfQotCXN0ciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obmFtZSkgKyAxICsgc3RybGVuKHZhbHVlKSArIDEpOwotCXNwcmludGYoc3RyLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7Ci0JcHV0ZW52KHN0cik7Ci19Ci0KLWNoYXIgKmJpdHByaW50KHVuc2lnbmVkIGludCBzdCwgaW50IG5iaXRzKSB7Ci0Jc3RhdGljIGNoYXIgc3RyWzMzXTsKLQlpbnQgaSwgbWFzazsKLQlpZiAobmJpdHMgPiAzMikgewotCQluYml0cyA9IDMyOwotCX0KLQlmb3IgKGk9MDsgaTxuYml0czsgaSsrKSB7Ci0JCXN0cltpXSA9ICcwJzsKLQl9Ci0Jc3RyW25iaXRzXSA9ICdcMCc7Ci0JbWFzayA9IDE7Ci0JZm9yIChpPW5iaXRzLTE7IGk+PTA7IGktLSkgewotCQlpZiAoc3QgJiBtYXNrKSB7Ci0JCQlzdHJbaV0gPSAnMSc7Ci0JCX0KLQkJbWFzayA9IG1hc2sgPDwgMTsKLQl9Ci0JcmV0dXJuIHN0cjsJLyogdGFrZSBjYXJlIHRvIHVzZSBvciBjb3B5IGltbWVkaWF0ZWx5ICovCi19Ci0KLWNoYXIgKmdldF91c2VyX25hbWUodm9pZCkgewotCWNoYXIgKnVzZXIgPSBOVUxMOwotCi0JdXNlciA9IGdldGVudigiVVNFUiIpOwotCWlmICh1c2VyID09IE5VTEwpIHsKLQkJdXNlciA9IGdldGVudigiTE9HTkFNRSIpOwotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1BXRF9ICi0JaWYgKHVzZXIgPT0gTlVMTCkgewotCQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKLQkJaWYgKHB3KSB7Ci0JCQl1c2VyID0gcHctPnB3X25hbWU7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmICh1c2VyKSB7Ci0JCXJldHVybihzdHJkdXAodXNlcikpOwotCX0gZWxzZSB7Ci0JCXJldHVybihzdHJkdXAoInVua25vd24tdXNlciIpKTsKLQl9Ci19Ci0KLWNoYXIgKmdldF9ob21lX2Rpcih2b2lkKSB7Ci0JY2hhciAqaG9tZSA9IE5VTEw7Ci0KLQlob21lID0gZ2V0ZW52KCJIT01FIik7Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSAotCWlmIChob21lID09IE5VTEwpIHsKLQkJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7Ci0JCWlmIChwdykgewotCQkJaG9tZSA9IHB3LT5wd19kaXI7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmIChob21lKSB7Ci0JCXJldHVybihzdHJkdXAoaG9tZSkpOwotCX0gZWxzZSB7Ci0JCXJldHVybihzdHJkdXAoIi8iKSk7Ci0JfQotfQotCi1jaGFyICpnZXRfc2hlbGwodm9pZCkgewotCWNoYXIgKnNoZWxsID0gTlVMTDsKLQotCXNoZWxsID0gZ2V0ZW52KCJTSEVMTCIpOwotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUFdEX0gKLQlpZiAoc2hlbGwgPT0gTlVMTCkgewotCQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKLQkJaWYgKHB3KSB7Ci0JCQlzaGVsbCA9IHB3LT5wd19zaGVsbDsKLQkJfQotCX0KLSNlbmRpZgotCi0JaWYgKHNoZWxsKSB7Ci0JCXJldHVybihzdHJkdXAoc2hlbGwpKTsKLQl9IGVsc2UgewotCQlyZXR1cm4oc3RyZHVwKCIvYmluL3NoIikpOwotCX0KLX0KLQotLyoKLSAqIHV0aWxpdHkgdG8gZ2V0IHRoZSBjdXJyZW50IGhvc3QgbmFtZQotICovCi1jaGFyICp0aGlzX2hvc3Qodm9pZCkgewotCWNoYXIgaG9zdFtNQVhOXTsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9HRVRIT1NUTkFNRQotCWlmIChnZXRob3N0bmFtZShob3N0LCBNQVhOKSA9PSAwKSB7Ci0JCWhvc3RbTUFYTi0xXSA9ICdcMCc7Ci0JCXJldHVybiBzdHJkdXAoaG9zdCk7Ci0JfSBlbHNlIGlmIChVVC5ub2RlbmFtZSkgewotCQlyZXR1cm4gc3RyZHVwKFVULm5vZGVuYW1lKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gTlVMTDsKLX0KLQotaW50IG1hdGNoX3N0cl9saXN0KGNoYXIgKnN0ciwgY2hhciAqKmxpc3QpIHsKLQlpbnQgaSA9IDAsIG1hdGNoZWQgPSAwOwotCi0JaWYgKCEgc3RyIHx8ICEgbGlzdCkgewotCQlyZXR1cm4gMDsKLQl9Ci0Jd2hpbGUgKGxpc3RbaV0gIT0gTlVMTCkgewotCQlpZiAoIXN0cmNtcChsaXN0W2ldLCAiKiIpKSB7Ci0JCQltYXRjaGVkID0gMTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHN0cnN0cihzdHIsIGxpc3RbaV0pKSB7Ci0JCQltYXRjaGVkID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQl9Ci0JcmV0dXJuIG1hdGNoZWQ7Ci19Ci0KLWNoYXIgKipjcmVhdGVfc3RyX2xpc3QoY2hhciAqY3NsaXN0KSB7Ci0JaW50IGksIG47Ci0JY2hhciAqcCwgKnN0cjsKLQljaGFyICoqbGlzdCA9IE5VTEw7Ci0KLQlpZiAoISBjc2xpc3QpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXN0ciA9IHN0cmR1cChjc2xpc3QpOwotCW4gPSAxOwotCXAgPSBzdHI7Ci0Jd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJaWYgKCpwID09ICcsJykgewotCQkJbisrOwotCQl9Ci0JCXArKzsKLQl9Ci0KLQkvKiB0aGUgZXh0cmEgbGFzdCBvbmUgaG9sZHMgTlVMTCAqLwotCWxpc3QgPSAoY2hhciAqKikgY2FsbG9jKChuKzEpKnNpemVvZihjaGFyICopLCAxKTsKLQotCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCWkgPSAwOwotCXdoaWxlIChwICYmIGkgPCBuKSB7Ci0JCWxpc3RbaSsrXSA9IHN0cmR1cChwKTsKLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmcmVlKHN0cik7Ci0KLQlyZXR1cm4gbGlzdDsKLX0KLQotLyoKLSAqIHNpbXBsZSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIHN1Yi1zZWNvbmQgdGltZSBkaWZmZXJlbmNlcywgdXNpbmcKLSAqIGEgZG91YmxlIHRvIGhvbGQgdGhlIHZhbHVlLgotICovCi1kb3VibGUgZHRpbWUoZG91YmxlICp0X29sZCkgewotCS8qIAotCSAqIHVzYWdlOiBjYWxsIHdpdGggMC4wIHRvIGluaXRpYWxpemUsIHN1YnNlcXVlbnQgY2FsbHMgZ2l2ZQotCSAqIHRoZSB0aW1lIGRpZmZlcmVuY2Ugc2luY2UgbGFzdCBjYWxsLgotCSAqLwotCWRvdWJsZSB0X25vdywgZHQ7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCi0JZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotCXRfbm93ID0gbm93LnR2X3NlYyArICggKGRvdWJsZSkgbm93LnR2X3VzZWMvMTAwMDAwMC4gKTsKLQlpZiAoKnRfb2xkID09IDAuMCkgewotCQkqdF9vbGQgPSB0X25vdzsKLQkJcmV0dXJuIHRfbm93OwotCX0KLQlkdCA9IHRfbm93IC0gKnRfb2xkOwotCSp0X29sZCA9IHRfbm93OwotCXJldHVybihkdCk7Ci19Ci0KLS8qIGNvbW1vbiBkdGltZSgpIGFjdGl2aXRpZXM6ICovCi1kb3VibGUgZHRpbWUwKGRvdWJsZSAqdF9vbGQpIHsKLQkqdF9vbGQgPSAwLjA7Ci0JcmV0dXJuIGR0aW1lKHRfb2xkKTsKLX0KLQotZG91YmxlIGRub3codm9pZCkgewotCWRvdWJsZSB0OwotCXJldHVybiBkdGltZTAoJnQpOwotfQotCi1kb3VibGUgZG5vd3godm9pZCkgewotCXJldHVybiBkbm93KCkgLSB4MTF2bmNfc3RhcnQ7Ci19Ci0KLWRvdWJsZSBybm93KHZvaWQpIHsKLQlkb3VibGUgdCA9IGRub3coKTsKLQl0ID0gdCAtICgoaW50KSB0KTsgCi0JaWYgKHQgPiAxLjApIHsKLQkJdCA9IDEuMDsKLQl9IGVsc2UgaWYgKHQgPCAwLjApIHsKLQkJdCA9IDAuMDsKLQl9Ci0JcmV0dXJuIHQ7Ci19Ci0KLWRvdWJsZSByZmFjKHZvaWQpIHsKLQlkb3VibGUgZjsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQotCWlmIChmaXJzdCkgewotCQl1bnNpZ25lZCBpbnQgczsKLQkJaWYgKGdldGVudigiUkFORF9TRUVEIikpIHsKLQkJCXMgPSAodW5zaWduZWQgaW50KSBhdG9pKGdldGVudigiUkFORF9TRUVEIikpOwotCQl9IGVsc2UgewotCQkJcyA9ICh1bnNpZ25lZCBpbnQpICgoaW50KSBnZXRwaWQoKSArIDEwMDAwMCAqIHJub3coKSk7Ci0JCX0KLQkJc3JhbmQocyk7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQlmID0gKGRvdWJsZSkgcmFuZCgpOwotCWYgPSBmIC8gKChkb3VibGUpIFJBTkRfTUFYKTsKLQotCXJldHVybiBmOwotfQotCi12b2lkIGNoZWNrX2FsbGlucHV0X3JhdGUodm9pZCkgewotCXN0YXRpYyBkb3VibGUgbGFzdF9hbGxfaW5wdXRfY2hlY2sgPSAwLjA7Ci0Jc3RhdGljIGludCBzZXQgPSAwLCB2ZXJiID0gLTE7Ci0KLQlpZiAodXNlX3RocmVhZHMpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmVyYiA8IDApIHsKLQkJdmVyYiA9IDA7Ci0JCWlmIChnZXRlbnYoIlJBVEVfVkVSQiIpKSB2ZXJiID0gMTsKLQl9Ci0JaWYgKCEgc2V0KSB7Ci0JCXNldCA9IDE7Ci0JCWxhc3RfYWxsX2lucHV0X2NoZWNrID0gZG5vdygpOwotCX0gZWxzZSB7Ci0JCWludCBkdCA9IDU7Ci0JCWlmICh4MTF2bmNfY3VycmVudCA+IGxhc3RfYWxsX2lucHV0X2NoZWNrICsgZHQpIHsKLQkJCWludCBuLCBucSA9IDA7Ci0JCQl3aGlsZSAoKG4gPSByZmJDaGVja0ZkcyhzY3JlZW4sIDApKSkgewotCQkJCW5xICs9IG47Ci0JCQl9Ci0JCQlpZiAodmVyYikgZnByaW50ZihzdGRlcnIsICJucXVldWVkOiAlZFxuIiwgbnEpOwotCQkJaWYgKGdldGVudigiQ0hFQ0tfUkFURSIpICYmIG5xID4gMTggKiBkdCkgewotCQkJCWRvdWJsZSByYXRlID0gbnEgLyBkdDsKLQkJCQlpZiAodmVyYikgcmZiTG9nKCJjaGVja19hbGxpbnB1dF9yYXRlOlxuIik7Ci0JCQkJaWYgKHZlcmIpIHJmYkxvZygiQ2xpZW50IGlzIHNlbmRpbmcgJS4xZiBleHRyYSByZXF1ZXN0cyBwZXIgc2Vjb25kIGZvciB0aGVcbiIsIHJhdGUpOwotCQkJCWlmICh2ZXJiKSByZmJMb2coInBhc3QgJWQgc2Vjb25kcyEgKHF1ZXVlZDogJWQpXG4iLCBkdCwgbnEpOwotCQkJCWlmIChzdHJzdHIoZ2V0ZW52KCJDSEVDS19SQVRFIiksICJhbGxpbnB1dCIpICYmICFhbGxfaW5wdXQgJiYgIWhhbmRsZV9ldmVudHNfZWFnZXJseSkgewotCQkJCQlyZmJMb2coIlN3aXRjaGluZyB0byAtYWxscGlucHV0IG1vZGUuXG4iKTsKLQkJCQkJYWxsX2lucHV0ID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXQgPSAwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkb19hbGxpbnB1dChsb25nIHVzZWMpIHsKLQlzdGF0aWMgZG91YmxlIGxhc3QgPSAwLjA7Ci0Jc3RhdGljIGludCBtZWFzID0gMCwgdmVyYiA9IC0xOwotCWludCBuLCBmID0gMSwgY250ID0gMCwgbSA9IDA7Ci0JbG9uZyB1c2VjMDsKLQlkb3VibGUgbm93OwotCWlmICghc2NyZWVuIHx8ICFzY3JlZW4tPmNsaWVudEhlYWQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodXNlX3RocmVhZHMpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodXNlYyA8IDApIHsKLQkJdXNlYyA9IDA7Ci0JfQotCXVzZWMwID0gdXNlYzsKLQlpZiAobGFzdCA9PSAwLjApIHsKLQkJbGFzdCA9IGRub3coKTsKLQl9Ci0JaWYgKHZlcmIgPCAwKSB7Ci0JCXZlcmIgPSAwOwotCQlpZiAoZ2V0ZW52KCJSQVRFX1ZFUkIiKSkgdmVyYiA9IDE7Ci0JfQotCXdoaWxlICgobiA9IHJmYkNoZWNrRmRzKHNjcmVlbiwgdXNlYykpID4gMCkgewotCQlpZiAoZikgewotCQkJaWYgKHZlcmIpIGZwcmludGYoc3RkZXJyLCAiICoiKTsKLQkJCWYgPSAwOwotCQl9Ci0JCWlmIChjbnQrKyA+IDMwKSB7Ci0JCQlicmVhazsKLQkJfQotCQltZWFzICs9IG47Ci0JCW0gKz0gbjsKLQl9Ci0JaWYgKHZlcmIpIGZwcmludGYoc3RkZXJyLCAiKyVkLyVkIiwgY250LCBtKTsKLQlub3cgPSBkbm93KCk7Ci0JaWYgKG5vdyA+IGxhc3QgKyAyLjApIHsKLQkJZG91YmxlIHJhdGUgPSBtZWFzIC8gKG5vdyAtIGxhc3QpOwotCQlpZiAodmVyYikgZnByaW50ZihzdGRlcnIsICJcbiBhbGxpbnB1dCByYXRlOiAlLjJmICIsIHJhdGUpOwotCQltZWFzID0gMDsKLQkJbGFzdCA9IGRub3coKTsKLQl9Ci19Ci0KLS8qCi0gKiB1dGlsaXR5IHdyYXBwZXIgdG8gY2FsbCByZmJQcm9jZXNzRXZlbnRzCi0gKiBjaGVja3MgdGhhdCB3ZSBhcmUgbm90IGluIHRocmVhZGVkIG1vZGUuCi0gKi8KLSNkZWZpbmUgVVNFQ19NQVggOTk5OTk5CQkvKiBsaWJ2bmNzZXZlciBhc3N1bWVzIDwgMSBzZWNvbmQgKi8KLWludCByZmJQRShsb25nIHVzZWMpIHsKLQlpbnQgdWlwMCA9IHVuaXhwd19pbl9wcm9ncmVzczsKLQlzdGF0aWMgaW50IGNoZWNrX3JhdGUgPSAtMTsKLQlpbnQgcmVzID0gMDsKLQlpZiAoISBzY3JlZW4pIHsKLQkJcmV0dXJuIHJlczsKLQl9Ci0gCWlmICh1bml4cHcgJiYgdW5peHB3X2luX3Byb2dyZXNzICYmICF1bml4cHdfaW5fcmZiUEUpIHsKLQkJcmZiTG9nKCJ1bml4cHdfaW5fcmZiUEU6IHNraXBwaW5nIHJmYlBFXG4iKTsKLSAJCXJldHVybiByZXM7Ci0gCX0KLQotCWlmIChkZWJ1Z190aWxlcyA+IDIpIHsKLQkJZG91YmxlIHRtID0gZG5vdygpOwotCQlmcHJpbnRmKHN0ZGVyciwgInJmYlBFKCVkKSAgdDogJS40ZlxuIiwKLQkJICAgIChpbnQpIHVzZWMsIHRtIC0geDExdm5jX3N0YXJ0KTsKLQl9Ci0KLQlpZiAodXNlYyA+IFVTRUNfTUFYKSB7Ci0JCXVzZWMgPSBVU0VDX01BWDsKLQl9Ci0JaWYgKCEgdXNlX3RocmVhZHMpIHsKLQkJcmZiQm9vbCByOwotCQlyID0gcmZiUHJvY2Vzc0V2ZW50cyhzY3JlZW4sIHVzZWMpOwotCQlpZiAocikgewotCQkJcmVzID0gMTsKLQkJfQotCX0KLQotIAlpZiAodW5peHB3ICYmIHVuaXhwd19pbl9wcm9ncmVzcyAmJiAhdWlwMCkgewotCQlpZiAoIXVuaXhwd19pbl9yZmJQRSkgewotCQkJcmZiTG9nKCJyZmJQRTogZ290IG5ldyBjbGllbnQgaW4gbm9uLXJmYlBFXG4iKTsKLQkJCTsJLyogdGhpcyBpcyBuZXcgdW5peHB3IGNsaWVudCAgKi8KLQkJfQotIAl9Ci0KLQlpZiAoaXB2Nl9saXN0ZW4pIHsKLQkJY2hlY2tfaXB2Nl9saXN0ZW4odXNlYyk7Ci0JfQotCWlmICh1bml4X3NvY2spIHsKLQkJY2hlY2tfdW5peF9zb2NrKHVzZWMpOwotCX0KLQlpZiAoY2hlY2tfcmF0ZSAhPSAwKSB7Ci0JCWlmIChjaGVja19yYXRlIDwgMCkgewotCQkJaWYgKGdldGVudigiQ0hFQ0tfUkFURSIpKSB7Ci0JCQkJY2hlY2tfcmF0ZSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWNoZWNrX3JhdGUgPSAwOwotCQkJfQotCQl9Ci0JCWlmIChjaGVja19yYXRlICYmICFhbGxfaW5wdXQgJiYgeDExdm5jX2N1cnJlbnQgPCBsYXN0X2NsaWVudCArIDQ1KSAgewotCQkJY2hlY2tfYWxsaW5wdXRfcmF0ZSgpOwotCQl9Ci0JfQotCWlmIChhbGxfaW5wdXQpIHsKLQkJZG9fYWxsaW5wdXQodXNlYyk7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcmZiQ0ZEKGxvbmcgdXNlYykgewotCWludCB1aXAwID0gdW5peHB3X2luX3Byb2dyZXNzOwotCWlmICghIHNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotIAlpZiAodW5peHB3ICYmIHVuaXhwd19pbl9wcm9ncmVzcyAmJiAhdW5peHB3X2luX3JmYlBFKSB7Ci0JCXN0YXRpYyBpbnQgbXNncyA9IDA7Ci0JCXN0YXRpYyBkb3VibGUgbGFzdF9yZXNldCA9IDAuMDsKLQkJaWYgKGRub3coKSA+IGxhc3RfcmVzZXQgKyA1LjApIHsKLQkJCW1zZ3MgPSAwOwotCQkJbGFzdF9yZXNldCA9IGRub3coKTsKLQkJfQotCQlpZiAobXNncysrIDwgMTApIHsKLQkJCXJmYkxvZygidW5peHB3X2luX3JmYlBFOiBza2lwcGluZyByZmJDRkRcbiIpOwotCQkJaWYgKG1zZ3MgPT0gMTApIHsKLQkJCQlyZmJMb2coInVuaXhwd19pbl9yZmJQRTogc2tpcHBpbmcgcmZiQ0ZEIC4uLlxuIik7Ci0JCQl9Ci0JCX0KLSAJCXJldHVybjsKLSAJfQotCWlmICh1c2VjID4gVVNFQ19NQVgpIHsKLQkJdXNlYyA9IFVTRUNfTUFYOwotCX0KLQotCWlmIChkZWJ1Z190aWxlcyA+IDIpIHsKLQkJZG91YmxlIHRtID0gZG5vdygpOwotCQlmcHJpbnRmKHN0ZGVyciwgInJmYkNGRCglZCkgdDogJS40ZlxuIiwKLQkJICAgIChpbnQpIHVzZWMsIHRtIC0geDExdm5jX3N0YXJ0KTsKLQl9Ci0KLQotCWlmICghIHVzZV90aHJlYWRzKSB7Ci0JCWlmIChhbGxfaW5wdXQpIHsKLQkJCWRvX2FsbGlucHV0KHVzZWMpOwotCQl9IGVsc2UgewotCQkJaWYgKGhhbmRsZV9ldmVudHNfZWFnZXJseSkgewotCQkJCXNjcmVlbi0+aGFuZGxlRXZlbnRzRWFnZXJseSA9IFRSVUU7Ci0JCQl9IGVsc2UgewotCQkJCXNjcmVlbi0+aGFuZGxlRXZlbnRzRWFnZXJseSA9IEZBTFNFOwotCQkJfQotCQkJcmZiQ2hlY2tGZHMoc2NyZWVuLCB1c2VjKTsKLQkJfQotCX0KLQotIAlpZiAodW5peHB3ICYmIHVuaXhwd19pbl9wcm9ncmVzcyAmJiAhdWlwMCkgewotCQlpZiAoIXVuaXhwd19pbl9yZmJQRSkgewotCQkJcmZiTG9nKCJyZmJDRkQ6IGdvdCBuZXcgY2xpZW50IGluIG5vbi1yZmJQRVxuIik7Ci0JCQk7CS8qIHRoaXMgaXMgbmV3IHVuaXhwdyBjbGllbnQgICovCi0JCX0KLSAJfQotfQotCi1kb3VibGUgcmVjdF9vdmVybGFwKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IFgxLCBpbnQgWTEsCi0gICAgaW50IFgyLCBpbnQgWTIpIHsKLQlkb3VibGUgYSwgQSwgbzsKLQlzcmFSZWdpb25QdHIgciwgUjsKLQlzcmFSZWN0YW5nbGVJdGVyYXRvciAqaXRlcjsKLQlzcmFSZWN0IHJ0OwotCi0JYSA9IG5hYnMoKHgyIC0geDEpICogKHkyIC0geTEpKTsKLQlBID0gbmFicygoWDIgLSBYMSkgKiAoWTIgLSBZMSkpOwotCi0JaWYgKGEgPT0gMCB8fCBBID09IDApIHsKLQkJcmV0dXJuIDAuMDsKLQl9Ci0KLQlyID0gc3JhUmduQ3JlYXRlUmVjdCh4MSwgeTEsIHgyLCB5Mik7Ci0JUiA9IHNyYVJnbkNyZWF0ZVJlY3QoWDEsIFkxLCBYMiwgWTIpOwotCi0Jc3JhUmduQW5kKHIsIFIpOwotCQotCW8gPSAwLjA7Ci0JaXRlciA9IHNyYVJnbkdldEl0ZXJhdG9yKHIpOwotCXdoaWxlIChzcmFSZ25JdGVyYXRvck5leHQoaXRlciwgJnJ0KSkgewotCQlvICs9IG5hYnMoIChydC54MiAtIHJ0LngxKSAqIChydC55MiAtIHJ0LnkxKSApOwotCX0KLQlzcmFSZ25SZWxlYXNlSXRlcmF0b3IoaXRlcik7Ci0KLQlzcmFSZ25EZXN0cm95KHIpOwotCXNyYVJnbkRlc3Ryb3koUik7Ci0KLQlpZiAoYSA8IEEpIHsKLQkJbyA9IG8vYTsKLQl9IGVsc2UgewotCQlvID0gby9BOwotCX0KLQlyZXR1cm4gbzsKLX0KLQotLyoKLSAqIGNob29zZSBhIGRlc2t0b3AgbmFtZQotICovCi1jaGFyICpjaG9vc2VfdGl0bGUoY2hhciAqZGlzcGxheSkgewotCXN0YXRpYyBjaGFyIHRpdGxlWyhNQVhOKzEwKV07CQotCi0JbWVtc2V0KHRpdGxlLCAwLCBzaXplb2YodGl0bGUpKTsKLQlzdHJjcHkodGl0bGUsICJ4MTF2bmMiKTsKLQotCWlmIChkaXNwbGF5ID09IE5VTEwpIHsKLQkJZGlzcGxheSA9IGdldGVudigiRElTUExBWSIpOwotCX0KLQotI2lmZGVmIE1BQ09TWAotCWlmIChkaXNwbGF5ID09IE5VTEwgfHwgc3Ryc3RyKGRpc3BsYXksICIvdG1wLyIpID09IGRpc3BsYXkpIHsKLQkJY2hhciAqdSA9IGdldF91c2VyX25hbWUoKTsKLQkJY2hhciAqdGggPSB0aGlzX2hvc3QoKTsKLQkJaWYgKHN0cmxlbih1KSA+IE1BWE4vNCkgIHsKLQkJCXUgPSAic29tZW9uZSI7Ci0JCX0KLQkJc3RyY3B5KHRpdGxlLCB1KTsKLQkJaWYgKHRoID09IE5VTEwgJiYgVVQubm9kZW5hbWUpIHsKLQkJCXRoID0gVVQubm9kZW5hbWU7Ci0JCX0KLQkJaWYgKHRoKSB7Ci0JCQlzdHJjYXQodGl0bGUsICJAIik7Ci0JCQlzdHJuY2F0KHRpdGxlLCB0aCwgTUFYTiAtIHN0cmxlbih0aXRsZSkpOwotCQl9Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0jZW5kaWYKLQotCWlmIChkaXNwbGF5ID09IE5VTEwpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qIHVzZSBkaXNwbGF5OiAqLwotCXRpdGxlWzBdID0gJ1wwJzsKLQlpZiAoZGlzcGxheVswXSA9PSAnOicpIHsKLQkJY2hhciAqdGggPSB0aGlzX2hvc3QoKTsKLQkJaWYgKHRoICE9IE5VTEwpIHsKLQkJCXN0cm5jcHkodGl0bGUsIHRoLCBNQVhOIC0gc3RybGVuKHRpdGxlKSk7Ci0JCX0KLQl9Ci0Jc3RybmNhdCh0aXRsZSwgZGlzcGxheSwgTUFYTiAtIHN0cmxlbih0aXRsZSkpOwotCVhfTE9DSzsKLQlpZiAoc3Vid2luICYmIGRweSAmJiB2YWxpZF93aW5kb3coc3Vid2luLCBOVUxMLCAwKSkgewotI2lmICFOT19YMTEKLQkJY2hhciAqbmFtZSA9IE5VTEw7Ci0JCWludCBkb19hcHBzaGFyZSA9IGdldGVudigiWDExVk5DX0FQUFNIQVJFX0FDVElWRSIpID8gMSA6IDA7Ci0JCWlmICgwICYmIGRvX2FwcHNoYXJlKSB7Ci0JCQl0aXRsZVswXSA9ICdcMCc7Ci0JCX0KLQkJaWYgKFhGZXRjaE5hbWUoZHB5LCBzdWJ3aW4sICZuYW1lKSkgewotCQkJaWYgKG5hbWUpIHsKLQkJCQlpZiAodGl0bGVbMF0gIT0gJ1wwJykgewotCQkJCQlzdHJuY2F0KHRpdGxlLCAiICIsICBNQVhOIC0gc3RybGVuKHRpdGxlKSk7Ci0JCQkJfQotCQkJCXN0cm5jYXQodGl0bGUsIG5hbWUsIE1BWE4gLSBzdHJsZW4odGl0bGUpKTsKLQkJCQlmcmVlKG5hbWUpOwotCQkJfQotCQl9Ci0JCWlmIChkb19hcHBzaGFyZSkgewotCQkJV2luZG93IGM7Ci0JCQlpbnQgeCwgeTsKLQkJCWlmICh4dHJhbnNsYXRlKHN1Yndpbiwgcm9vdHdpbiwgMCwgMCwgJngsICZ5LCAmYywgMSkpIHsKLQkJCQljaGFyIHRtcFszMl07Ci0JCQkJaWYgKHNjYWxpbmcpIHsKLQkJCQkJeCAqPSBzY2FsZV9mYWNfeDsKLQkJCQkJeSAqPSBzY2FsZV9mYWNfeTsKLQkJCQl9Ci0JCQkJc3ByaW50Zih0bXAsICIgWFk9JWQsJWQiLCB4LCB5KTsKLQkJCQlzdHJuY2F0KHRpdGxlLCB0bXAsIE1BWE4gLSBzdHJsZW4odGl0bGUpKTsKLQkJCX0KLQkJCXJmYkxvZygiYXBwc2hhcmUgdGl0bGU6ICVzXG4iLCB0aXRsZSk7Ci0JCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLQl9Ci0JWF9VTkxPQ0s7Ci0JcmV0dXJuIHRpdGxlOwotfQpkaWZmIC0tZ2l0IGEveDExdm5jL3V0aWwuaCBiL3gxMXZuYy91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTg1Y2YuLjAwMDAwMDAKLS0tIGEveDExdm5jL3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19VVElMX0gKLSNkZWZpbmUgX1gxMVZOQ19VVElMX0gKLQotLyogLS0gdXRpbC5oIC0tICovCi0KLWV4dGVybiBpbnQgbmZpeChpbnQgaSwgaW50IG4pOwotZXh0ZXJuIGludCBubWluKGludCBuLCBpbnQgbSk7Ci1leHRlcm4gaW50IG5tYXgoaW50IG4sIGludCBtKTsKLWV4dGVybiBpbnQgbmFicyhpbnQgbik7Ci1leHRlcm4gZG91YmxlIGRhYnMoZG91YmxlIHgpOwotZXh0ZXJuIHZvaWQgbG93ZXJjYXNlKGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCB1cHBlcmNhc2UoY2hhciAqc3RyKTsKLWV4dGVybiBjaGFyICpsYmxhbmtzKGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBzdHJ6ZXJvKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IHNjYW5faGV4ZGVjKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyAqbnVtKTsKLWV4dGVybiBpbnQgcGFyc2VfZ2VvbShjaGFyICpzdHIsIGludCAqd3AsIGludCAqaHAsIGludCAqeHAsIGludCAqeXAsIGludCBXLCBpbnQgSCk7Ci1leHRlcm4gdm9pZCBzZXRfZW52KGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTsKLWV4dGVybiBjaGFyICpiaXRwcmludCh1bnNpZ25lZCBpbnQgc3QsIGludCBuYml0cyk7Ci1leHRlcm4gY2hhciAqZ2V0X3VzZXJfbmFtZSh2b2lkKTsKLWV4dGVybiBjaGFyICpnZXRfaG9tZV9kaXIodm9pZCk7Ci1leHRlcm4gY2hhciAqZ2V0X3NoZWxsKHZvaWQpOwotZXh0ZXJuIGNoYXIgKnRoaXNfaG9zdCh2b2lkKTsKLQotZXh0ZXJuIGludCBtYXRjaF9zdHJfbGlzdChjaGFyICpzdHIsIGNoYXIgKipsaXN0KTsKLWV4dGVybiBjaGFyICoqY3JlYXRlX3N0cl9saXN0KGNoYXIgKmNzbGlzdCk7Ci0KLWV4dGVybiBkb3VibGUgZHRpbWUoZG91YmxlICopOwotZXh0ZXJuIGRvdWJsZSBkdGltZTAoZG91YmxlICopOwotZXh0ZXJuIGRvdWJsZSBkbm93KHZvaWQpOwotZXh0ZXJuIGRvdWJsZSBkbm93eCh2b2lkKTsKLWV4dGVybiBkb3VibGUgcm5vdyh2b2lkKTsKLWV4dGVybiBkb3VibGUgcmZhYyh2b2lkKTsKLQotZXh0ZXJuIGludCByZmJQRShsb25nIHVzZWMpOwotZXh0ZXJuIHZvaWQgcmZiQ0ZEKGxvbmcgdXNlYyk7Ci1leHRlcm4gZG91YmxlIHJlY3Rfb3ZlcmxhcChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBYMSwgaW50IFkxLAotICAgIGludCBYMiwgaW50IFkyKTsKLWV4dGVybiBjaGFyICpjaG9vc2VfdGl0bGUoY2hhciAqZGlzcGxheSk7Ci0KLQotI2RlZmluZSBOT05VTCh4KSAoKHgpID8gKHgpIDogIiIpCi0KLS8qCi0JUHV0IHRoaXMgaW4gdXNsZWVwMigpIGZvciBkZWJ1ZyBwcmludG91dC4KLQlmcHJpbnRmKHN0ZGVyciwgIl9teXNsZWVwOiAlMDhkICUxMC42ZiAlczolZFxuIiwgKHgpLCBkbm93KCkgLSB4MTF2bmNfc3RhcnQsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKLSAqLwotCi0vKiBYWFggdXNsZWVwKDMpIGlzIG5vdCB0aHJlYWQgc2FmZSBvbiBzb21lIG9sZGVyIHN5c3RlbXMuLi4gKi8KLWV4dGVybiBzdHJ1Y3QgdGltZXZhbCBfbXlzbGVlcDsKLSNkZWZpbmUgdXNsZWVwMih4KSBcCi0JX215c2xlZXAudHZfc2VjICA9ICh4KSAvIDEwMDAwMDA7IFwKLQlfbXlzbGVlcC50dl91c2VjID0gKHgpICUgMTAwMDAwMDsgXAotCXNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmX215c2xlZXApOyAKLSNpZiAhZGVmaW5lZChYMTFWTkNfVVNMRUVQKQotI3VuZGVmIHVzbGVlcAotI2RlZmluZSB1c2xlZXAgdXNsZWVwMgotI2VuZGlmCi0KLS8qCi0gKiBmb2xsb3dpbmcgaXMgYmFzZWQgb24gSXNNb2RpZmllcktleSBpbiBYdXRpbC5oCi0qLwotI2RlZmluZSBpc21vZGtleShrZXlzeW0pIFwKLSAgKCgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TaGlmdF9MKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19IeXBlcl9SKSAmJiBcCi0gICgoS2V5U3ltKShrZXlzeW0pICE9IFhLX0NhcHNfTG9jaykgJiYgKChLZXlTeW0pKGtleXN5bSkgIT0gWEtfU2hpZnRfTG9jaykpKQotCi0vKgotICogV2hlbiB0aHJlYWRlZCB3ZSBoYXZlIHRvIG11dGV4IG91ciBYMTEgY2FsbHMgdG8gYXZvaWQgWElPIGNyYXNoZXMKLSAqIGR1ZSB0byBjYWxsYmFja3MuCi0gKi8KLSNpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJQVEhSRUFECi1leHRlcm4gTVVURVgoeDExTXV0ZXgpOwotZXh0ZXJuIE1VVEVYKHNjcm9sbE11dGV4KTsKLU1VVEVYKGNsaWVudE11dGV4KTsKLU1VVEVYKGlucHV0TXV0ZXgpOwotTVVURVgocG9pbnRlck11dGV4KTsKLSNlbmRpZgotCi0jZGVmaW5lIFhfSU5JVCBJTklUX01VVEVYKHgxMU11dGV4KQotCi0jaWYgMQotI2RlZmluZSBYX0xPQ0sgICAgICAgTE9DSyh4MTFNdXRleCkKLSNkZWZpbmUgWF9VTkxPQ0sgICBVTkxPQ0soeDExTXV0ZXgpCi0jZWxzZQotZXh0ZXJuIGludCBoeGw7Ci0jZGVmaW5lIFhfTE9DSyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBYX0xPQ0sqKiAgJWQlcyAgJXM6JWRcbiIsIFwKLQloeGwsIGh4bCAgPyAiICBCQUQtUFJFLUxPQ0siOiIiLCAgIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgTE9DSyh4MTFNdXRleCk7IGh4bCA9IDE7Ci0jZGVmaW5lIFhfVU5MT0NLICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICB4X3VubG9jayAgJWQlcyAgJXM6JWRcbiIsIFwKLQloeGwsICFoeGwgPyAiICBCQUQtUFJFLVVOTE9DSyI6IiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFVOTE9DSyh4MTFNdXRleCk7IGh4bCA9IDA7Ci0jZW5kaWYKLQotI2RlZmluZSBTQ1JfTE9DSyAgIGlmICh1c2VfdGhyZWFkcykge0xPQ0soc2Nyb2xsTXV0ZXgpO30KLSNkZWZpbmUgU0NSX1VOTE9DSyBpZiAodXNlX3RocmVhZHMpIHtVTkxPQ0soc2Nyb2xsTXV0ZXgpO30KLSNkZWZpbmUgU0NSX0lOSVQgSU5JVF9NVVRFWChzY3JvbGxNdXRleCkKLQotI2RlZmluZSBDTElFTlRfTE9DSyAgIGlmICh1c2VfdGhyZWFkcykge0xPQ0soY2xpZW50TXV0ZXgpO30KLSNkZWZpbmUgQ0xJRU5UX1VOTE9DSyBpZiAodXNlX3RocmVhZHMpIHtVTkxPQ0soY2xpZW50TXV0ZXgpO30KLSNkZWZpbmUgQ0xJRU5UX0lOSVQgSU5JVF9NVVRFWChjbGllbnRNdXRleCkKLQotI2lmIDEKLSNkZWZpbmUgSU5QVVRfTE9DSyAgIGlmICh1c2VfdGhyZWFkcykge0xPQ0soaW5wdXRNdXRleCk7fQotI2RlZmluZSBJTlBVVF9VTkxPQ0sgaWYgKHVzZV90aHJlYWRzKSB7VU5MT0NLKGlucHV0TXV0ZXgpO30KLSNlbHNlCi0jZGVmaW5lIElOUFVUX0xPQ0sKLSNkZWZpbmUgSU5QVVRfVU5MT0NLCi0jZW5kaWYKLSNkZWZpbmUgSU5QVVRfSU5JVCBJTklUX01VVEVYKGlucHV0TXV0ZXgpCi0KLSNkZWZpbmUgUE9JTlRFUl9MT0NLICAgaWYgKHVzZV90aHJlYWRzKSB7TE9DSyhwb2ludGVyTXV0ZXgpO30KLSNkZWZpbmUgUE9JTlRFUl9VTkxPQ0sgaWYgKHVzZV90aHJlYWRzKSB7VU5MT0NLKHBvaW50ZXJNdXRleCk7fQotI2RlZmluZSBQT0lOVEVSX0lOSVQgSU5JVF9NVVRFWChwb2ludGVyTXV0ZXgpCi0KLS8qCi0gKiBUaGUgc2VuZE11dGV4IG1lbWJlciB3YXMgYWRkZWQgdG8gbGlidm5jc2VydmVyIDAuOS44Ci0gKiByZmIvcmZiLmggc2V0cyBMSUJWTkNTRVJWRVJfU0VORF9NVVRFWCBpZiBwcmVzZW50LgotICovCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCUFRIUkVBRCAmJiBkZWZpbmVkKExJQlZOQ1NFUlZFUl9TRU5EX01VVEVYKQotI2RlZmluZSBTRU5EX0xPQ0soY2wpICAgaWYgKHVzZV90aHJlYWRzKSAgIExPQ0soKGNsKS0+c2VuZE11dGV4KTsKLSNkZWZpbmUgU0VORF9VTkxPQ0soY2wpIGlmICh1c2VfdGhyZWFkcykgVU5MT0NLKChjbCktPnNlbmRNdXRleCk7Ci0jZWxzZQotI2RlZmluZSBTRU5EX0xPQ0soY2wpCi0jZGVmaW5lIFNFTkRfVU5MT0NLKGNsKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfWDExVk5DX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3Y0bC5jIGIveDExdm5jL3Y0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMzM2E2Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy92NGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODUgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSB2NGwuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJ4aW5lcmFtYS5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0jaW5jbHVkZSAia2V5Ym9hcmQuaCIKLSNpbmNsdWRlICJhbGxvd2VkX2lucHV0X3QuaCIKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJTlVYX1ZJREVPREVWX0gKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfSU9DVExfSAotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2RlZmluZSBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2lmZGVmIF9fTElOVVhfVklERU9ERVYyX0gKLSMgaWZuZGVmIEhBVkVfVjRMMgotIyBkZWZpbmUgSEFWRV9WNEwyIDEKLSMgZW5kaWYKLSNlbmRpZgotI2RlZmluZSBWNExfT0sKLSNlbmRpZgotI2VuZGlmCi0KLWNoYXIgKnY0bF9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpOwotdm9pZCB2NGxfa2V5X2NvbW1hbmQocmZiQm9vbCBkb3duLCByZmJLZXlTeW0ga2V5c3ltLCByZmJDbGllbnRQdHIgY2xpZW50KTsKLXZvaWQgdjRsX3BvaW50ZXJfY29tbWFuZChpbnQgbWFzaywgaW50IHgsIGludCB5LCByZmJDbGllbnRQdHIgY2xpZW50KTsKLQotc3RhdGljIGludCB2NGwxX3ZhbChpbnQgcGN0KTsKLXN0YXRpYyBpbnQgdjRsMV93aWR0aChpbnQgdyk7Ci1zdGF0aWMgaW50IHY0bDFfaGVpZ2h0KGludCBoKTsKLXN0YXRpYyBpbnQgdjRsMV9yZXNpemUoaW50IGZkLCBpbnQgdywgaW50IGgpOwotc3RhdGljIHZvaWQgdjRsMV9zZXRmcmVxKGludCBmZCwgdW5zaWduZWQgbG9uZyBmcmVxLCBpbnQgdmVyYik7Ci1zdGF0aWMgdm9pZCB2NGwxX3NldF9pbnB1dChpbnQgZmQsIGludCB3aGljaCk7Ci1zdGF0aWMgaW50IHY0bDFfc2V0Zm10KGludCBmZCwgY2hhciAqZm10KTsKLXN0YXRpYyB2b2lkIGFwcGx5X3NldHRpbmdzKGNoYXIgKmRldiwgY2hhciAqc2V0dGluZ3MsIGludCAqZmQpOwotc3RhdGljIGludCB2NGwxX2RwY3QoaW50IG9sZCwgaW50IGQpOwotc3RhdGljIHZvaWQgdjRsX3JlcXVlcnkodm9pZCk7Ci1zdGF0aWMgdm9pZCB2NGxfYnIoaW50IGIpOwotc3RhdGljIHZvaWQgdjRsX2h1KGludCBiKTsKLXN0YXRpYyB2b2lkIHY0bF9jbyhpbnQgYik7Ci1zdGF0aWMgdm9pZCB2NGxfY24oaW50IGIpOwotc3RhdGljIHZvaWQgdjRsX3N6KGludCBiKTsKLXN0YXRpYyB2b2lkIHY0bF9zdGEoaW50IHN0YSk7Ci1zdGF0aWMgdm9pZCB2NGxfaW5wKGludCBpbnApOwotc3RhdGljIHZvaWQgdjRsX2ZtdChjaGFyICpmbXQpOwotc3RhdGljIGludCBjb2xvbl9uKGNoYXIgKmxpbmUpOwotc3RhdGljIGNoYXIgKmNvbG9uX3N0cihjaGFyICpsaW5lKTsKLXN0YXRpYyBjaGFyICpjb2xvbl90YWcoY2hhciAqbGluZSk7Ci1zdGF0aWMgdm9pZCBsb29rdXBfcmdiKGNoYXIgKmdfZm10LCBpbnQgKmdfYiwgaW50ICptYXNrX3Jldik7Ci1zdGF0aWMgY2hhciAqdjRsMV9sdV9wYWxldHRlKHVuc2lnbmVkIHNob3J0IHBhbGV0dGUpOwotc3RhdGljIHVuc2lnbmVkIHNob3J0IHY0bDFfbHVfcGFsZXR0ZV9zdHIoY2hhciAqbmFtZSwgaW50ICpiaXRzLCBpbnQgKnJldik7Ci1zdGF0aWMgY2hhciAqdjRsMl9sdV9wYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdjRsMl9sdV9wYWxldHRlX3N0cihjaGFyICpuYW1lLCBpbnQgKmJpdHMsIGludCAqcmV2KTsKLXN0YXRpYyBpbnQgdjRsMV9xdWVyeShpbnQgZmQsIGludCB2ZXJib3NlKTsKLXN0YXRpYyBpbnQgdjRsMl9xdWVyeShpbnQgZmQsIGludCB2ZXJib3NlKTsKLXN0YXRpYyBpbnQgb3Blbl9kZXYoY2hhciAqZGV2KTsKLXN0YXRpYyBjaGFyICpndWVzc192aWFfdjRsKGNoYXIgKmRldiwgaW50ICpmZCk7Ci1zdGF0aWMgY2hhciAqZ3Vlc3NfdmlhX3Y0bF9pbmZvKGNoYXIgKmRldiwgaW50ICpmZCk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9zdHIoY2hhciAqc3RyLCBjaGFyICoqZGV2LCBjaGFyICoqc2V0dGluZ3MsIGNoYXIgKiphdHBhcm1zKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvb2t1cF9mcmVxdGFiKGludCBzdGEpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9va3VwX2ZyZXEoaW50IHN0YSk7Ci1zdGF0aWMgaW50IGxvb2t1cF9zdGF0aW9uKHVuc2lnbmVkIGxvbmcgZnJlcSk7Ci1zdGF0aWMgdm9pZCBpbml0X2ZyZXF0YWIoY2hhciAqZmlsZSk7Ci1zdGF0aWMgdm9pZCBpbml0X2ZyZXFzKHZvaWQpOwotc3RhdGljIHZvaWQgaW5pdF9udHNjX2NhYmxlKHZvaWQpOwotCi0jZGVmaW5lIENfVklERU9fQ0FQVFVSRSAxCi0jZGVmaW5lIENfUElDVFVSRSAgICAgICAyCi0jZGVmaW5lIENfV0lORE9XICAgICAgICAzIAotCi0jaWZkZWYgVjRMX09LCi1zdGF0aWMgc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgIHY0bDFfY2FwYWJpbGl0eTsKLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAgICAgdjRsMV9jaGFubmVsOwotc3RhdGljIHN0cnVjdCB2aWRlb190dW5lciAgICAgICB2NGwxX3R1bmVyOwotc3RhdGljIHN0cnVjdCB2aWRlb19waWN0dXJlICAgICB2NGwxX3BpY3R1cmU7Ci1zdGF0aWMgc3RydWN0IHZpZGVvX3dpbmRvdyAgICAgIHY0bDFfd2luZG93OwotCi0jaWYgSEFWRV9WNEwyCi1zdGF0aWMgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAgIHY0bDJfY2FwYWJpbGl0eTsKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9pbnB1dCAgICAgICAgdjRsMl9pbnB1dDsKLXN0YXRpYyBzdHJ1Y3QgdjRsMl90dW5lciAgICAgICAgdjRsMl90dW5lcjsKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9mbXRkZXNjICAgICAgdjRsMl9mbXRkZXNjOwotc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCAgICAgICB2NGwyX2Zvcm1hdDsKLS8qc3RhdGljIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICB2NGwyX2ZidWY7ICovCi0vKnN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgICAgdjRsMl9xY3RybDsgKi8KLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgdjRsMV9jYXAgPSAtMTsKLXN0YXRpYyBpbnQgdjRsMl9jYXAgPSAtMTsKLSNkZWZpbmUgVjRMMV9NQVggNjU1MzUKLQotI2RlZmluZSBDSEFOTkVMX01BWCA1MDAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG50c2NfY2FibGVbQ0hBTk5FTF9NQVhdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VzdG9tX2ZyZXFbQ0hBTk5FTF9NQVhdOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ZyZXEgPSAwOwotc3RhdGljIGludCBsYXN0X2NoYW5uZWwgPSAwOwotCi1zdGF0aWMgaW50IHY0bDFfdmFsKGludCBwY3QpIHsKLQkvKiBwY3QgaXMgJSAqLwotCWludCB2YWwsIG1heCA9IFY0TDFfTUFYOyAKLQlpZiAocGN0IDwgMCkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKHBjdCA+IDEwMCkgewotCQlyZXR1cm4gbWF4OwotCX0KLQl2YWwgPSAocGN0ICogbWF4KS8xMDA7Ci0KLQlyZXR1cm4gdmFsOwotfQotc3RhdGljIGludCB2NGwxX3dpZHRoKGludCB3KSB7Ci0jaWZkZWYgVjRMX09LCi0JaW50IG1pbiA9IHY0bDFfY2FwYWJpbGl0eS5taW53aWR0aDsKLQlpbnQgbWF4ID0gdjRsMV9jYXBhYmlsaXR5Lm1heHdpZHRoOwotCWlmICh3IDwgbWluKSB7Ci0JCXcgPSBtaW47Ci0JfQotCWlmICh3ID4gbWF4KSB7Ci0JCXcgPSBtYXg7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIHc7Ci19Ci1zdGF0aWMgaW50IHY0bDFfaGVpZ2h0KGludCBoKSB7Ci0jaWZkZWYgVjRMX09LCi0JaW50IG1pbiA9IHY0bDFfY2FwYWJpbGl0eS5taW5oZWlnaHQ7Ci0JaW50IG1heCA9IHY0bDFfY2FwYWJpbGl0eS5tYXhoZWlnaHQ7Ci0JaWYgKGggPCBtaW4pIHsKLQkJaCA9IG1pbjsKLQl9Ci0JaWYgKGggPiBtYXgpIHsKLQkJaCA9IG1heDsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gaDsKLX0KLQotc3RhdGljIGludCB2NGwxX3Jlc2l6ZShpbnQgZmQsIGludCB3LCBpbnQgaCkgewotI2lmZGVmIFY0TF9PSwotCWludCBkb3dpbiA9IDA7Ci0KLQltZW1zZXQoJnY0bDFfd2luZG93LCAwLCBzaXplb2YodjRsMV93aW5kb3cpKTsKLQlpZiAoaW9jdGwoZmQsIFZJRElPQ0dXSU4sICZ2NGwxX3dpbmRvdykgPT0gLTEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHcgPiAwKSB3ID0gdjRsMV93aWR0aCh3KTsKLQotCWlmICh3ID4gMCAmJiB3ICE9IChpbnQpIHY0bDFfd2luZG93LndpZHRoKSB7Ci0JCWRvd2luID0gMTsKLQl9Ci0KLQlpZiAoaCA+IDApIGggPSB2NGwxX2hlaWdodChoKTsKLQotCWlmIChoID4gMCAmJiBoICE9IChpbnQpIHY0bDFfd2luZG93LmhlaWdodCkgewotCQlkb3dpbiA9IDE7Ci0JfQotCi0JaWYgKGRvd2luKSB7Ci0JCXY0bDFfd2luZG93LnggPSAwOwotCQl2NGwxX3dpbmRvdy55ID0gMDsKLQkJaW9jdGwoZmQsIFZJRElPQ1NXSU4sICZ2NGwxX3dpbmRvdyk7Ci0JCWlmICh3ID4gMCkgdjRsMV93aW5kb3cud2lkdGggPSB3OwotCQlpZiAoaCA+IDApIHY0bDFfd2luZG93LmhlaWdodCA9IGg7Ci0JCWZwcmludGYoc3RkZXJyLCAiY2FsbGluZyBWNExfMTogVklESU9DU1dJTlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAidHJ5aW5nIG5ldyBzaXplICVkeCVkXG4iLAotCQkgICAgdjRsMV93aW5kb3cud2lkdGgsIHY0bDFfd2luZG93LmhlaWdodCk7Ci0JCWlmIChpb2N0bChmZCwgVklESU9DU1dJTiwgJnY0bDFfd2luZG93KSA9PSAtMSkgewotCQkJcGVycm9yKCJpb2N0bCBWSURJT0NTV0lOIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLSNlbHNlCi0JaWYgKCFmZCB8fCAhdyB8fCAhaCkge30KLSNlbmRpZgotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCB2NGwxX3NldGZyZXEoaW50IGZkLCB1bnNpZ25lZCBsb25nIGZyZXEsIGludCB2ZXJiKSB7Ci0jaWZkZWYgVjRMX09LCi0JdW5zaWduZWQgbG9uZyBmMCwgZjE7Ci0JZjEgPSAoZnJlcSAqIDE2KSAvIDEwMDA7Ci0JaW9jdGwoZmQsIFZJRElPQ0dGUkVRLCAmZjApOwotCWlmICh2ZXJiKSBmcHJpbnRmKHN0ZGVyciwgInJlYWQgZnJlcTogJWRcbiIsIChpbnQpIGYwKTsKLQlpZiAoZnJlcSA+IDApIHsKLQkJaWYgKGlvY3RsKGZkLCBWSURJT0NTRlJFUSwgJmYxKSA9PSAtMSkgewotCQkJcGVycm9yKCJpb2N0bCBWSURJT0NTRlJFUSIpOwotCQl9IGVsc2UgewotCQkJaW9jdGwoZmQsIFZJRElPQ0dGUkVRLCAmZjApOwotCQkJaWYgKHZlcmIpIGZwcmludGYoc3RkZXJyLCAicmVhZCBmcmVxOiAlZFxuIiwgKGludCkgZjApOwotCQkJbGFzdF9mcmVxID0gZnJlcTsKLQkJfQotCX0KLSNlbHNlCi0JaWYgKCFmZCB8fCAhZnJlcSB8fCAhdmVyYikge30KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB2NGwxX3NldF9pbnB1dChpbnQgZmQsIGludCB3aGljaCkgewotI2lmZGVmIFY0TF9PSwotCWlmICh3aGljaCAhPSAtMSkgewotCQltZW1zZXQoJnY0bDFfY2hhbm5lbCwgMCwgc2l6ZW9mKHY0bDFfY2hhbm5lbCkpOwotCQl2NGwxX2NoYW5uZWwuY2hhbm5lbCA9IHdoaWNoOwotCQlpZiAoaW9jdGwoZmQsIFZJRElPQ0dDSEFOLCAmdjRsMV9jaGFubmVsKSAhPSAtMSkgewotCQkJdjRsMV9jaGFubmVsLmNoYW5uZWwgPSB3aGljaDsKLQkJCWZwcmludGYoc3RkZXJyLCAic2V0dGluZyBpbnB1dCBjaGFubmVsIHRvICVkOiAlc1xuIiwKLQkJCSAgICB3aGljaCwgdjRsMV9jaGFubmVsLm5hbWUpOwotCQkJbGFzdF9jaGFubmVsID0gd2hpY2g7Ci0JCQlpb2N0bChmZCwgVklESU9DU0NIQU4sICZ2NGwxX2NoYW5uZWwpOwotCQl9Ci0JfQotI2Vsc2UKLQlpZiAoIWZkIHx8ICF3aGljaCkge30KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IHY0bDFfc2V0Zm10KGludCBmZCwgY2hhciAqZm10KSB7Ci0jaWZkZWYgVjRMX09LCi0JdW5zaWduZWQgc2hvcnQgZm5ldzsKLQlpbnQgYm5ldywgcm5ldzsKLQotCWZuZXcgPSB2NGwxX2x1X3BhbGV0dGVfc3RyKGZtdCwgJmJuZXcsICZybmV3KTsKLQlpZiAoZm5ldykgewotCQl2NGwxX3BpY3R1cmUuZGVwdGggPSBibmV3OyAKLQkJdjRsMV9waWN0dXJlLnBhbGV0dGUgPSBmbmV3OwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgVjRMXzE6IFZJRElPQ1NQSUNUXG4iKTsKLQlpZiAoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdjRsMV9waWN0dXJlKSA9PSAtMSkgewotCQlwZXJyb3IoImlvY3RsIFZJRElPQ1NQSUNUIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocmF3X2ZiX3BpeGZtdCkgewotCQlmcmVlKHJhd19mYl9waXhmbXQpOwotCX0KLQlyYXdfZmJfcGl4Zm10ID0gc3RyZHVwKGZtdCk7Ci0jZWxzZQotCWlmICghZmQgfHwgIWZtdCkge30KLSNlbmRpZgotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGlnbm9yZV9hbGwgPSAwOwotCi1zdGF0aWMgdm9pZCBhcHBseV9zZXR0aW5ncyhjaGFyICpkZXYsIGNoYXIgKnNldHRpbmdzLCBpbnQgKmZkKSB7Ci0jaWZkZWYgVjRMX09LCi0JY2hhciAqc3RyLCAqcCwgKmZtdCA9IE5VTEwsICp0dW4gPSBOVUxMLCAqaW5wID0gTlVMTDsKLQlpbnQgYnIgPSAtMSwgY28gPSAtMSwgY24gPSAtMSwgaHUgPSAtMTsKLQlpbnQgdyA9IC0xLCBoID0gLTEsIGIgPSAtMTsKLQlpbnQgc3RhID0gLTE7Ci0JaW50IHNldGNudCA9IDA7Ci0JaWYgKCEgc2V0dGluZ3MgfHwgc2V0dGluZ3NbMF0gPT0gJ1wwJykgewotCQlyZXR1cm47Ci0JfQotCXN0ciA9IHN0cmR1cChzZXR0aW5ncyk7Ci0JcCA9IHN0cnRvayhzdHIsICIsIik7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKHN0cnN0cihwLCAiYnI9IikgPT0gcCkgewotCQkJYnIgPSBhdG9pKHArMyk7Ci0JCQlpZiAoYnIgPj0gMCkgc2V0Y250Kys7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJjbz0iKSA9PSBwKSB7Ci0JCQljbyA9IGF0b2kocCszKTsKLQkJCWlmIChjbyA+PSAwKSBzZXRjbnQrKzsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImNuPSIpID09IHApIHsKLQkJCWNuID0gYXRvaShwKzMpOwotCQkJaWYgKGNuID49IDApIHNldGNudCsrOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiaHU9IikgPT0gcCkgewotCQkJaHUgPSBhdG9pKHArMyk7Ci0JCQlpZiAoaHUgPj0gMCkgc2V0Y250Kys7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJ3PSIpID09IHApIHsKLQkJCXcgPSBhdG9pKHArMik7Ci0JCQlpZiAodyA+IDApIHNldGNudCsrOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAiaD0iKSA9PSBwKSB7Ci0JCQloID0gYXRvaShwKzIpOwotCQkJaWYgKGggPiAwKSBzZXRjbnQrKzsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImJwcD0iKSA9PSBwKSB7Ci0JCQliID0gYXRvaShwKzQpOwotCQkJaWYgKGIgPiAwKSBzZXRjbnQrKzsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgImZtdD0iKSA9PSBwKSB7Ci0JCQlmbXQgPSBzdHJkdXAocCs0KTsKLQkJCXNldGNudCsrOwotCQl9IGVsc2UgaWYgKHN0cnN0cihwLCAidHVuPSIpID09IHApIHsKLQkJCXR1biA9IHN0cmR1cChwKzQpOwotCQkJc2V0Y250Kys7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKHAsICJpbnA9IikgPT0gcCkgewotCQkJaW5wID0gc3RyZHVwKHArNCk7Ci0JCQlzZXRjbnQrKzsKLQkJfSBlbHNlIGlmIChzdHJzdHIocCwgInN0YT0iKSA9PSBwKSB7Ci0JCQlzdGEgPSBhdG9pKHArNCk7Ci0JCQlzZXRjbnQrKzsKLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JfQotCWZyZWUoc3RyKTsKLQlpZiAoISBzZXRjbnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKmZkIDwgMCkgewotCQkqZmQgPSBvcGVuX2RldihkZXYpOwotCX0KLQlpZiAoKmZkIDwgMCkgewotCQlyZXR1cm47Ci0JfQotCXY0bDFfY2FwID0gdjRsMV9xdWVyeSgqZmQsIDEpOwotCXY0bDJfY2FwID0gdjRsMl9xdWVyeSgqZmQsIDEpOwotCi0JaWYgKHY0bDFfY2FwICYmICEgaWdub3JlX2FsbCkgewotCQlpZiAoYnIgPj0gMCkgdjRsMV9waWN0dXJlLmJyaWdodG5lc3MgPSB2NGwxX3ZhbChicik7Ci0JCWlmIChodSA+PSAwKSB2NGwxX3BpY3R1cmUuaHVlICAgICAgICA9IHY0bDFfdmFsKGh1KTsKLQkJaWYgKGNvID49IDApIHY0bDFfcGljdHVyZS5jb2xvdXIgICAgID0gdjRsMV92YWwoY28pOwotCQlpZiAoY24gPj0gMCkgdjRsMV9waWN0dXJlLmNvbnRyYXN0ICAgPSB2NGwxX3ZhbChjbik7Ci0KLQkJZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIFY0TF8xOiBWSURJT0NTUElDVFxuIik7Ci0JCWlmIChpb2N0bCgqZmQsIFZJRElPQ1NQSUNULCAmdjRsMV9waWN0dXJlKSA9PSAtMSkgewotCQkJcGVycm9yKCJpb2N0bCBWSURJT0NTUElDVCIpOwotCQl9Ci0KLQkJaWYgKGZtdCkgewotCQkJdjRsMV9zZXRmbXQoKmZkLCBmbXQpOwotCQl9IGVsc2UgaWYgKGIgPiAwICYmIGIgIT0gdjRsMV9waWN0dXJlLmRlcHRoKSB7Ci0JCQlpZiAoYiA9PSA4KSB7Ci0JCQkJdjRsMV9zZXRmbXQoKmZkLCAiSEkyNDAiKTsKLQkJCX0gZWxzZSBpZiAoYiA9PSAxNikgewotCQkJCXY0bDFfc2V0Zm10KCpmZCwgIlJHQjU2NSIpOwotCQkJfSBlbHNlIGlmIChiID09IDI0KSB7Ci0JCQkJdjRsMV9zZXRmbXQoKmZkLCAiUkdCMjQiKTsKLQkJCX0gZWxzZSBpZiAoYiA9PSAzMikgewotCQkJCXY0bDFfc2V0Zm10KCpmZCwgIlJHQjMyIik7Ci0JCQl9Ci0JCX0KLQotCQl2NGwxX3Jlc2l6ZSgqZmQsIHcsIGgpOwotCi0JCWlmICh0dW4pIHsKLQkJCWludCBtb2RlID0gLTE7Ci0JCQlpZiAoIXN0cmNhc2VjbXAodHVuLCAiUEFMIikpIHsKLQkJCQltb2RlID0gVklERU9fTU9ERV9QQUw7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHR1biwgIk5UU0MiKSkgewotCQkJCW1vZGUgPSBWSURFT19NT0RFX05UU0M7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHR1biwgIlNFQ0FNIikpIHsKLQkJCQltb2RlID0gVklERU9fTU9ERV9TRUNBTTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAodHVuLCAiQVVUTyIpKSB7Ci0JCQkJbW9kZSA9IFZJREVPX01PREVfQVVUTzsKLQkJCX0KLQkJCWlmIChtb2RlICE9IC0xKSB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpPTA7IGk8IHY0bDFfY2FwYWJpbGl0eS5jaGFubmVsczsgaSsrKSB7Ci0JCQkJCW1lbXNldCgmdjRsMV9jaGFubmVsLCAwLCBzaXplb2YodjRsMV9jaGFubmVsKSk7Ci0JCQkJCXY0bDFfY2hhbm5lbC5jaGFubmVsID0gaTsKLQkJCQkJaWYgKGlvY3RsKCpmZCwgVklESU9DR0NIQU4sICZ2NGwxX2NoYW5uZWwpID09IC0xKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoISB2NGwxX2NoYW5uZWwudHVuZXJzKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAodjRsMV9jaGFubmVsLm5vcm0gPT0gbW9kZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdjRsMV9jaGFubmVsLm5vcm0gPSBtb2RlOwotCQkJCQlpb2N0bCgqZmQsIFZJRElPQ1NDSEFOLCAmdjRsMV9jaGFubmVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlucCkgewotCQkJY2hhciBzWzJdOwotCQkJaW50IGksIGNoYW4gPSAtMTsKLQotCQkJc1swXSA9IGlucFswXTsKLQkJCXNbMV0gPSAnXDAnOwotCQkJaWYgKHN0cnN0cigiMDEyMzQ1Njc4OSIsIHMpKSB7Ci0JCQkJY2hhbiA9IGF0b2koaW5wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpPTA7IGk8IHY0bDFfY2FwYWJpbGl0eS5jaGFubmVsczsgaSsrKSB7Ci0JCQkJCW1lbXNldCgmdjRsMV9jaGFubmVsLCAwLCBzaXplb2YodjRsMV9jaGFubmVsKSk7Ci0JCQkJCXY0bDFfY2hhbm5lbC5jaGFubmVsID0gaTsKLQkJCQkJaWYgKGlvY3RsKCpmZCwgVklESU9DR0NIQU4sICZ2NGwxX2NoYW5uZWwpID09IC0xKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoIXN0cmNtcCh2NGwxX2NoYW5uZWwubmFtZSwgaW5wKSkgewotCQkJCQkJY2hhbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXY0bDFfc2V0X2lucHV0KCpmZCwgY2hhbik7Ci0JCX0KLQkJaWYgKHN0YSA+PSAwKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZyZXEgPSBsb29rdXBfZnJlcShzdGEpOwotCQkJdjRsMV9zZXRmcmVxKCpmZCwgZnJlcSwgMSk7Ci0JCX0KLQl9Ci0JdjRsMV9jYXAgPSB2NGwxX3F1ZXJ5KCpmZCwgMSk7Ci0JdjRsMl9jYXAgPSB2NGwyX3F1ZXJ5KCpmZCwgMSk7Ci0jZWxzZQotCWlmICghZGV2IHx8ICFzZXR0aW5ncyB8fCAhZmQpIHt9Ci0JcmV0dXJuOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBkb3VibGUgZHZhbCA9IDAuMDU7Ci0KLXN0YXRpYyBpbnQgdjRsMV9kcGN0KGludCBvbGQsIGludCBkKSB7Ci0JaW50IG5ld3ZhbCwgbWF4ID0gVjRMMV9NQVg7IAotCQotCS8qIC0xIGFuZCAxIGFyZSBzcGVjaWFsIGNhc2VzIGZvciAic21hbGwgaW5jcmVtZW50cyIgKi8KLQlpZiAoZCA9PSAtMSkgewotCQluZXd2YWwgPSBvbGQgLSAoaW50KSAoZHZhbCAqIG1heCk7Ci0JfSBlbHNlIGlmIChkID09IDEpIHsKLQkJbmV3dmFsID0gb2xkICsgKGludCkgKGR2YWwgKiBtYXgpOwotCX0gZWxzZSB7Ci0JCW5ld3ZhbCA9IChkICogbWF4KS8xMDA7Ci0JfQotCWlmIChuZXd2YWwgPCAwKSB7Ci0JCW5ld3ZhbCA9IDA7Ci0JfQotCWlmIChuZXd2YWwgPiBtYXgpIHsKLQkJbmV3dmFsID0gbWF4OwotCX0KLQlyZXR1cm4gbmV3dmFsOwotfQotCi1zdGF0aWMgdm9pZCB2NGxfcmVxdWVyeSh2b2lkKSB7Ci0JaWYgKHJhd19mYl9mZCA8IDApIHsKLQkJcmV0dXJuOwotCX0KLQl2NGwxX2NhcCA9IHY0bDFfcXVlcnkocmF3X2ZiX2ZkLCAxKTsKLQl2NGwyX2NhcCA9IHY0bDJfcXVlcnkocmF3X2ZiX2ZkLCAxKTsKLX0KLQkKLXN0YXRpYyB2b2lkIHY0bF9icihpbnQgYikgewotI2lmZGVmIFY0TF9PSwotCWludCBvbGQgPSB2NGwxX3BpY3R1cmUuYnJpZ2h0bmVzczsKLQotCXY0bDFfcGljdHVyZS5icmlnaHRuZXNzID0gdjRsMV9kcGN0KG9sZCwgYik7Ci0JaW9jdGwocmF3X2ZiX2ZkLCBWSURJT0NTUElDVCwgJnY0bDFfcGljdHVyZSk7Ci0JdjRsX3JlcXVlcnkoKTsKLSNlbHNlCi0JaWYgKCFiKSB7fQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHY0bF9odShpbnQgYikgewotI2lmZGVmIFY0TF9PSwotCWludCBvbGQgPSB2NGwxX3BpY3R1cmUuaHVlOwotCi0JdjRsMV9waWN0dXJlLmh1ZSA9IHY0bDFfZHBjdChvbGQsIGIpOwotCWlvY3RsKHJhd19mYl9mZCwgVklESU9DU1BJQ1QsICZ2NGwxX3BpY3R1cmUpOwotCXY0bF9yZXF1ZXJ5KCk7Ci0jZWxzZQotCWlmICghYikge30KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB2NGxfY28oaW50IGIpIHsKLSNpZmRlZiBWNExfT0sKLQlpbnQgb2xkID0gdjRsMV9waWN0dXJlLmNvbG91cjsKLQotCXY0bDFfcGljdHVyZS5jb2xvdXIgPSB2NGwxX2RwY3Qob2xkLCBiKTsKLQlpb2N0bChyYXdfZmJfZmQsIFZJRElPQ1NQSUNULCAmdjRsMV9waWN0dXJlKTsKLQl2NGxfcmVxdWVyeSgpOwotI2Vsc2UKLQlpZiAoIWIpIHt9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgdjRsX2NuKGludCBiKSB7Ci0jaWZkZWYgVjRMX09LCi0JaW50IG9sZCA9IHY0bDFfcGljdHVyZS5jb250cmFzdDsKLQotCXY0bDFfcGljdHVyZS5jb250cmFzdCA9IHY0bDFfZHBjdChvbGQsIGIpOwotCWlvY3RsKHJhd19mYl9mZCwgVklESU9DU1BJQ1QsICZ2NGwxX3BpY3R1cmUpOwotCXY0bF9yZXF1ZXJ5KCk7Ci0jZWxzZQotCWlmICghYikge30KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB2NGxfc3ooaW50IGIpIHsKLSNpZmRlZiBWNExfT0sKLQlpbnQgd19vbGQgPSB2NGwxX3dpbmRvdy53aWR0aDsKLQlpbnQgaF9vbGQgPSB2NGwxX3dpbmRvdy5oZWlnaHQ7Ci0JaW50IHcsIGg7Ci0KLQlpZiAod19vbGQgPT0gMCkgewotCQl3X29sZCA9IDE2MDsKLQl9Ci0JaWYgKGhfb2xkID09IDApIHsKLQkJaF9vbGQgPSAxMjA7Ci0JfQotCi0JaWYgKGIgPT0gMSkgewotCQl3ID0gd19vbGQgKyAoaW50KSAoMC4xNSAqIHdfb2xkKTsgCi0JCWggPSBoX29sZCArIChpbnQpICgwLjE1ICogaF9vbGQpOyAKLQl9IGVsc2UgaWYgKGIgPT0gLTEpIHsKLQkJdyA9IHdfb2xkIC0gKGludCkgKDAuMTUgKiB3X29sZCk7IAotCQloID0gaF9vbGQgLSAoaW50KSAoMC4xNSAqIGhfb2xkKTsgCi0JfSBlbHNlIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHY0bDFfcmVzaXplKHJhd19mYl9mZCwgdywgaCkpIHsKLQkJcmV0dXJuOwotCX0KLQotCXY0bF9yZXF1ZXJ5KCk7Ci0KLQlwdXNoX2JsYWNrX3NjcmVlbig0KTsKLQotCWlnbm9yZV9hbGwgPSAxOwotCWRvX25ld19mYigxKTsKLQlpZ25vcmVfYWxsID0gMDsKLSNlbHNlCi0JaWYgKCFiKSB7fQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHY0bF9zdGEoaW50IHN0YSkgewotI2lmZGVmIFY0TF9PSwotCXVuc2lnbmVkIGxvbmcgZnJlcSA9IDA7Ci0JaW50IGN1ciA9IGxvb2t1cF9zdGF0aW9uKGxhc3RfZnJlcSk7Ci0KLQlpZiAoISBsYXN0X2ZyZXEpIHsKLQkJaWYgKHN0YSA9PSAwIHx8IHN0YSA9PSAtMSkgewotCQkJc3RhID0gMTE7Ci0JCX0KLQl9Ci0KLQlpZiAoc3RhID09IC0xKSB7Ci0JCXdoaWxlIChjdXIgPiAwKSB7Ci0JCQlmcmVxID0gbG9va3VwX2ZyZXEoLS1jdXIpOwotCQkJaWYgKGZyZXEpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoc3RhID09IDApIHsKLQkJd2hpbGUgKGN1ciA8IENIQU5ORUxfTUFYIC0gMSkgewotCQkJZnJlcSA9IGxvb2t1cF9mcmVxKCsrY3VyKTsKLQkJCWlmIChmcmVxKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmcmVxID0gbG9va3VwX2ZyZXEoc3RhKTsKLQkJY3VyID0gc3RhOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgInRvIHN0YXRpb24gJWQgLyAlZFxuIiwgY3VyLCAoaW50KSBmcmVxKTsKLQl2NGwxX3NldGZyZXEocmF3X2ZiX2ZkLCBmcmVxLCAwKTsKLSNlbHNlCi0JaWYgKCFzdGEpIHt9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgdjRsX2lucChpbnQgaW5wKSB7Ci0jaWZkZWYgVjRMX09LCi0JaW50IG5leHQgPSAtMTsKLQlpZiAoaW5wID09IC0xKSB7Ci0JCWlucCA9IGxhc3RfY2hhbm5lbCArIDE7Ci0JCWlmIChpbnAgPj0gdjRsMV9jYXBhYmlsaXR5LmNoYW5uZWxzKSB7Ci0JCQlpbnAgPSAwOwotCQl9Ci0JCW5leHQgPSBpbnA7Ci0JfSBlbHNlIGlmIChpbnAgPT0gLTIpIHsKLQkJaW5wID0gbGFzdF9jaGFubmVsIC0gMTsKLQkJaWYgKGlucCA8IDApIHsKLQkJCWlucCA9IHY0bDFfY2FwYWJpbGl0eS5jaGFubmVscyAtIDE7Ci0JCX0KLQkJbmV4dCA9IGlucDsKLQl9IGVsc2UgewotCQluZXh0ID0gaW5wOwotCX0KLQl2NGwxX3NldF9pbnB1dChyYXdfZmJfZmQsIG5leHQpOwotI2Vsc2UKLQlpZiAoIWlucCkge30KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB2NGxfZm10KGNoYXIgKmZtdCkgewotCWlmICh2NGwxX3NldGZtdChyYXdfZmJfZmQsIGZtdCkpIHsKLQkJdjRsX3JlcXVlcnkoKTsKLQotCQlpZ25vcmVfYWxsID0gMTsKLQkJZG9fbmV3X2ZiKDEpOwotCQlpZ25vcmVfYWxsID0gMDsKLQl9Ci19Ci0KLXZvaWQgdjRsX2tleV9jb21tYW5kKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCkgewotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQotCWlmIChyYXdfZmJfZmQgPCAwKSB7Ci0JCXJldHVybjsJCQotCX0KLQlpZiAoISBkb3duKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHZpZXdfb25seSkgewotCQlyZXR1cm47Ci0JfQotCWdldF9hbGxvd2VkX2lucHV0KGNsaWVudCwgJmlucHV0KTsKLQlpZiAoISBpbnB1dC5rZXlzdHJva2UpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChrZXlzeW0gPT0gWEtfYikgewotCQl2NGxfYnIoLTEpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX0IpIHsKLQkJdjRsX2JyKCsxKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19oKSB7Ci0JCXY0bF9odSgtMSk7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfSCkgewotCQl2NGxfaHUoKzEpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX2MpIHsKLQkJdjRsX2NvKC0xKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19DKSB7Ci0JCXY0bF9jbygrMSk7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfbikgewotCQl2NGxfY24oLTEpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX04pIHsKLQkJdjRsX2NuKCsxKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19zKSB7Ci0JCXY0bF9zeigtMSk7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfUykgewotCQl2NGxfc3ooKzEpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX2kpIHsKLQkJdjRsX2lucCgtMSk7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfSSkgewotCQl2NGxfaW5wKC0yKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19VcCkgewotCQl2NGxfc3RhKCswKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19Eb3duKSB7Ci0JCXY0bF9zdGEoLTEpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX0YxKSB7Ci0JCXY0bF9mbXQoIkhJMjQwIik7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfRjIpIHsKLQkJdjRsX2ZtdCgiUkdCNTY1Iik7Ci0JfSBlbHNlIGlmIChrZXlzeW0gPT0gWEtfRjMpIHsKLQkJdjRsX2ZtdCgiUkdCMjQiKTsKLQl9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19GNCkgewotCQl2NGxfZm10KCJSR0IzMiIpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX0Y1KSB7Ci0JCXY0bF9mbXQoIlJHQjU1NSIpOwotCX0gZWxzZSBpZiAoa2V5c3ltID09IFhLX0Y2KSB7Ci0JCXY0bF9mbXQoIkdSRVkiKTsKLQl9Ci0JaWYgKGNsaWVudCkge30KLX0KLQotCi12b2lkIHY0bF9wb2ludGVyX2NvbW1hbmQoaW50IG1hc2ssIGludCB4LCBpbnQgeSwgcmZiQ2xpZW50UHRyIGNsaWVudCkgewotCS8qIGRvIG5vdCBmb3JnZXQgdmlld29ubHkgcGVybXMgKi8KLQlpZiAobWFzayB8fCB4IHx8IHkgfHwgY2xpZW50KSB7fQotfQotCi1zdGF0aWMgaW50IGNvbG9uX24oY2hhciAqbGluZSkgewotCWNoYXIgKnE7Ci0JaW50IG47Ci0JcSA9IHN0cnJjaHIobGluZSwgJzonKTsKLQlpZiAoISBxKSB7Ci0JCXJldHVybiAwOwotCX0KLQlxID0gbGJsYW5rcyhxKzEpOwotCWlmIChzc2NhbmYocSwgIiVkIiwgJm4pID09IDEpIHsKLQkJcmV0dXJuIG47Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciAqY29sb25fc3RyKGNoYXIgKmxpbmUpIHsKLQljaGFyICpxLCAqcCwgKnQ7Ci0JcSA9IHN0cnJjaHIobGluZSwgJzonKTsKLQlpZiAoISBxKSB7Ci0JCXJldHVybiBzdHJkdXAoIiIpOwotCX0KLQlxID0gbGJsYW5rcyhxKzEpOwotCXAgPSBzdHJwYnJrKHEsICIgXHRcbiIpOwotCWlmIChwKSB7Ci0JCSpwID0gJ1wwJzsKLQl9Ci0JdCA9IHN0cmR1cChxKTsKLQkqcCA9ICdcbic7Ci0JcmV0dXJuIHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpjb2xvbl90YWcoY2hhciAqbGluZSkgewotCWNoYXIgKnEsICpwLCAqdDsKLQlxID0gc3RycmNocihsaW5lLCAnWycpOwotCWlmICghIHEpIHsKLQkJcmV0dXJuIHN0cmR1cCgiIik7Ci0JfQotCXErKzsKLQlwID0gc3RycmNocihxLCAnXScpOwotCWlmICghIHApIHsKLQkJcmV0dXJuIHN0cmR1cCgiIik7Ci0JfQotCSpwID0gJ1wwJzsKLQl0ID0gc3RyZHVwKHEpOwotCSpwID0gJ10nOwotCXJldHVybiB0OwotfQotCi1zdGF0aWMgdm9pZCBsb29rdXBfcmdiKGNoYXIgKmZtdCwgaW50ICpiaXRzLCBpbnQgKnJldikgewotCWludCB0YiwgdHI7Ci0KLQlpZiAodjRsMl9sdV9wYWxldHRlX3N0cihmbXQsICZ0YiwgJnRyKSkgewotCQkqYml0cyA9IHRiOwotCQkqcmV2ICA9IHRyOwotCQlyZXR1cm47Ci0JfQotCWlmICh2NGwxX2x1X3BhbGV0dGVfc3RyKGZtdCwgJnRiLCAmdHIpKSB7Ci0JCSpiaXRzID0gdGI7Ci0JCSpyZXYgID0gdHI7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICp2NGwxX2x1X3BhbGV0dGUodW5zaWduZWQgc2hvcnQgcGFsZXR0ZSkgewotCXN3aXRjaChwYWxldHRlKSB7Ci0jaWZkZWYgVjRMX09LCi0JCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOglyZXR1cm4gIkdSRVkiOwotCQljYXNlIFZJREVPX1BBTEVUVEVfSEkyNDA6CXJldHVybiAiSEkyNDAiOwotCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTY1OglyZXR1cm4gIlJHQjU2NSI7Ci0JCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoJcmV0dXJuICJSR0IyNCI7Ci0JCWNhc2UgVklERU9fUEFMRVRURV9SR0IzMjoJcmV0dXJuICJSR0IzMiI7Ci0JCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NTU6CXJldHVybiAiUkdCNTU1IjsKLQkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMjoJcmV0dXJuICJZVVY0MjIiOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVZVjoJcmV0dXJuICJZVVlWIjsKLQkJY2FzZSBWSURFT19QQUxFVFRFX1VZVlk6CXJldHVybiAiVVlWWSI7Ci0JCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjA6CXJldHVybiAiWVVWNDIwIjsKLQkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQxMToJcmV0dXJuICJZVVY0MTEiOwotCQljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgkJcmV0dXJuICJSQVciOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIyUDoJcmV0dXJuICJZVVY0MjJQIjsKLQkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQxMVA6CXJldHVybiAiWVVWNDExUCI7Ci0JCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOglyZXR1cm4gIllVVjQyMFAiOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDEwUDoJcmV0dXJuICJZVVY0MTBQIjsKLSNlbmRpZgotCQlkZWZhdWx0OgkJCXJldHVybiAidW5rbm93biI7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdjRsMV9sdV9wYWxldHRlX3N0cihjaGFyICpuYW1lLCBpbnQgKmJpdHMsIGludCAqcmV2KSB7Ci0jaWZkZWYgVjRMX09LCi0JKnJldiA9IDA7Ci0JaWYgKCFzdHJjbXAobmFtZSwgIlJHQjU1NSIpKSB7Ci0JCSpiaXRzID0gMTY7Ci0JCXJldHVybiBWSURFT19QQUxFVFRFX1JHQjU1NTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlJHQjU2NSIpKSB7Ci0JCSpiaXRzID0gMTY7Ci0JCXJldHVybiBWSURFT19QQUxFVFRFX1JHQjU2NTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlJHQjI0IikpIHsKLQkJKmJpdHMgPSAyNDsKLQkJcmV0dXJuIFZJREVPX1BBTEVUVEVfUkdCMjQ7Ci0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJSR0IzMiIpKSB7Ci0JCSpiaXRzID0gMzI7Ci0JCXJldHVybiBWSURFT19QQUxFVFRFX1JHQjMyOwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiSEkyNDAiKSkgewotCQkqYml0cyA9IDg7Ci0JCXJldHVybiBWSURFT19QQUxFVFRFX0hJMjQwOwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiR1JFWSIpKSB7Ci0JCSpiaXRzID0gODsKLQkJcmV0dXJuIFZJREVPX1BBTEVUVEVfR1JFWTsKLQl9Ci0jZWxzZQotCWlmICghbmFtZSB8fCAhYml0cyB8fCAhcmV2KSB7fQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICp2NGwyX2x1X3BhbGV0dGUodW5zaWduZWQgaW50IGZtdCkgewotCXN3aXRjaChmbXQpIHsKLSNpZiBkZWZpbmVkKFY0TF9PSykgJiYgSEFWRV9WNEwyCi0JCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMzMjoJcmV0dXJuICJSR0IzMzIiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CXJldHVybiAiUkdCNTU1IjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OglyZXR1cm4gIlJHQjU2NSI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NVg6CXJldHVybiAiUkdCNTU1WCI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NVg6CXJldHVybiAiUkdCNTY1WCI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX0JHUjI0OglyZXR1cm4gIkJHUjI0IjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CXJldHVybiAiUkdCMjQiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9CR1IzMjoJcmV0dXJuICJCR1IzMiI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOglyZXR1cm4gIlJHQjMyIjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfR1JFWToJCXJldHVybiAiR1JFWSI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQxMDoJcmV0dXJuICJZVlU0MTAiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6CXJldHVybiAiWVZVNDIwIjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoJCXJldHVybiAiWVVZViI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CQlyZXR1cm4gIlVZVlkiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOglyZXR1cm4gIllVVjQyMlAiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MTFQOglyZXR1cm4gIllVVjQxMVAiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ZNDFQOgkJcmV0dXJuICJZNDFQIjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoJCXJldHVybiAiTlYxMiI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CQlyZXR1cm4gIk5WMjEiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MTA6CXJldHVybiAiWVVWNDEwIjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOglyZXR1cm4gIllVVjQyMCI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1lZVVY6CQlyZXR1cm4gIllZVVYiOwotCQljYXNlIFY0TDJfUElYX0ZNVF9ISTI0MDoJcmV0dXJuICJISTI0MCI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX01KUEVHOglyZXR1cm4gIk1KUEVHIjsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoJCXJldHVybiAiSlBFRyI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX0RWOgkJcmV0dXJuICJEViI7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX01QRUc6CQlyZXR1cm4gIk1QRUciOwotI2VuZGlmCi0JCWRlZmF1bHQ6CQkJcmV0dXJuICJ1bmtub3duIjsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdjRsMl9sdV9wYWxldHRlX3N0cihjaGFyICpuYW1lLCBpbnQgKmJpdHMsIGludCAqcmV2KSB7Ci0jaWYgZGVmaW5lZChWNExfT0spICYmIEhBVkVfVjRMMgotCWlmICghc3RyY21wKG5hbWUsICJSR0IxIikgfHwgIXN0cmNtcChuYW1lLCAiUkdCMzMyIikpIHsKLQkJKmJpdHMgPSA4OwotCQkqcmV2ID0gMDsKLQkJcmV0dXJuIFY0TDJfUElYX0ZNVF9SR0IzMzI7Ci0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJSR0JPIikgfHwgIXN0cmNtcChuYW1lLCAiUkdCNTU1IikpIHsKLQkJKmJpdHMgPSAxNjsKLQkJKnJldiA9IDA7Ci0JCXJldHVybiBWNEwyX1BJWF9GTVRfUkdCNTU1OwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUkdCUCIpIHx8ICFzdHJjbXAobmFtZSwgIlJHQjU2NSIpKSB7Ci0JCSpiaXRzID0gMTY7Ci0JCSpyZXYgPSAwOwotCQlyZXR1cm4gVjRMMl9QSVhfRk1UX1JHQjU2NTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlJHQlEiKSB8fCAhc3RyY21wKG5hbWUsICJSR0I1NTVYIikpIHsKLQkJKmJpdHMgPSAxNjsKLQkJKnJldiA9IDE7Ci0JCXJldHVybiBWNEwyX1BJWF9GTVRfUkdCNTU1WDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlJHQlIiKSB8fCAhc3RyY21wKG5hbWUsICJSR0I1NjVYIikpIHsKLQkJKmJpdHMgPSAxNjsKLQkJKnJldiA9IDE7Ci0JCXJldHVybiBWNEwyX1BJWF9GTVRfUkdCNTY1WDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkJHUjMiKSB8fCAhc3RyY21wKG5hbWUsICJCR1IyNCIpKSB7Ci0JCSpiaXRzID0gMjQ7Ci0JCSpyZXYgPSAxOwotCQlyZXR1cm4gVjRMMl9QSVhfRk1UX0JHUjI0OwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUkdCMyIpIHx8ICFzdHJjbXAobmFtZSwgIlJHQjI0IikpIHsKLQkJKmJpdHMgPSAyNDsKLQkJKnJldiA9IDA7Ci0JCXJldHVybiBWNEwyX1BJWF9GTVRfUkdCMjQ7Ci0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJCR1I0IikgfHwgIXN0cmNtcChuYW1lLCAiQkdSMzIiKSkgewotCQkqYml0cyA9IDMyOwotCQkqcmV2ID0gMTsKLQkJcmV0dXJuIFY0TDJfUElYX0ZNVF9CR1IzMjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlJHQjQiKSB8fCAhc3RyY21wKG5hbWUsICJSR0IzMiIpKSB7Ci0JCSpiaXRzID0gMzI7Ci0JCSpyZXYgPSAwOwotCQlyZXR1cm4gVjRMMl9QSVhfRk1UX1JHQjMyOwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiR1JFWSIpKSB7Ci0JCSpiaXRzID0gODsKLQkJKnJldiA9IDA7Ci0JCXJldHVybiBWNEwyX1BJWF9GTVRfR1JFWTsKLQl9Ci0jZWxzZQotCWlmICghbmFtZSB8fCAhYml0cyB8fCAhcmV2KSB7fQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdjRsMV9xdWVyeShpbnQgZmQsIGludCB2KSB7Ci0jaWZkZWYgVjRMX09LCi0JdW5zaWduZWQgaW50IGk7Ci0KLQltZW1zZXQoJnY0bDFfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mKHY0bDFfY2FwYWJpbGl0eSkpOwotCW1lbXNldCgmdjRsMV9jaGFubmVsLCAgICAwLCBzaXplb2YodjRsMV9jaGFubmVsKSk7Ci0JbWVtc2V0KCZ2NGwxX3R1bmVyLCAgICAgIDAsIHNpemVvZih2NGwxX3R1bmVyKSk7Ci0JbWVtc2V0KCZ2NGwxX3BpY3R1cmUsICAgIDAsIHNpemVvZih2NGwxX3BpY3R1cmUpKTsKLQltZW1zZXQoJnY0bDFfd2luZG93LCAgICAgMCwgc2l6ZW9mKHY0bDFfd2luZG93KSk7Ci0KLQlpZiAodikgZnByaW50ZihzdGRlcnIsICJcblY0TF8xIHF1ZXJ5OlxuIik7Ci0jaWZkZWYgVklESU9DR0NBUAotCWlmIChpb2N0bChmZCwgVklESU9DR0NBUCwgJnY0bDFfY2FwYWJpbGl0eSkgPT0gLTEpIHsKLQkJcGVycm9yKCJpb2N0bCBWSURJT0NHQ0FQIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgInY0bC0xIGNhcGFiaWxpdHk6XG4iKTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIG5hbWU6ICAgICAgJXNcbiIsIHY0bDFfY2FwYWJpbGl0eS5uYW1lKTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIGNoYW5uZWxzOiAgJWRcbiIsIHY0bDFfY2FwYWJpbGl0eS5jaGFubmVscyk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBhdWRpb3M6ICAgICVkXG4iLCB2NGwxX2NhcGFiaWxpdHkuYXVkaW9zKTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIG1heHdpZHRoOiAgJWRcbiIsIHY0bDFfY2FwYWJpbGl0eS5tYXh3aWR0aCk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBtYXhoZWlnaHQ6ICVkXG4iLCB2NGwxX2NhcGFiaWxpdHkubWF4aGVpZ2h0KTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIG1pbndpZHRoOiAgJWRcbiIsIHY0bDFfY2FwYWJpbGl0eS5taW53aWR0aCk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBtaW5oZWlnaHQ6ICVkXG4iLCB2NGwxX2NhcGFiaWxpdHkubWluaGVpZ2h0KTsKLQotCWZvciAoaT0wOyAoaW50KSBpIDwgdjRsMV9jYXBhYmlsaXR5LmNoYW5uZWxzOyBpKyspIHsKLQkJY2hhciAqdHlwZSA9ICJ1bmtub3duIjsKLQkJbWVtc2V0KCZ2NGwxX2NoYW5uZWwsIDAsIHNpemVvZih2NGwxX2NoYW5uZWwpKTsKLQkJdjRsMV9jaGFubmVsLmNoYW5uZWwgPSBpOwotCQlpZiAoaW9jdGwoZmQsIFZJRElPQ0dDSEFOLCAmdjRsMV9jaGFubmVsKSA9PSAtMSkgewotCQkJcGVycm9yKCJpb2N0bCBWSURJT0NHQ0hBTiIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHY0bDFfY2hhbm5lbC50eXBlID09IFZJREVPX1RZUEVfVFYpIHsKLQkJCXR5cGUgPSAiVFYiOwotCQl9IGVsc2UgaWYgKHY0bDFfY2hhbm5lbC50eXBlID09IFZJREVPX1RZUEVfQ0FNRVJBKSB7Ci0JCQl0eXBlID0gIkNBTUVSQSI7Ci0JCX0KLQkJaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBjaGFubmVsWyVkXTogJXNcdHR1bmVyczogJWQgbm9ybTogJWQgdHlwZTogJWQgICVzXG4iLAotCQkgICAgaSwgdjRsMV9jaGFubmVsLm5hbWUsIHY0bDFfY2hhbm5lbC50dW5lcnMsIHY0bDFfY2hhbm5lbC5ub3JtLAotCQkgICAgdjRsMV9jaGFubmVsLnR5cGUsIHR5cGUpOwotCX0KLQotCW1lbXNldCgmdjRsMV90dW5lciwgMCwgc2l6ZW9mKHY0bDFfdHVuZXIpKTsKLQlpZiAoaW9jdGwoZmQsIFZJRElPQ0dUVU5FUiwgJnY0bDFfdHVuZXIpICE9IC0xKSB7Ci0JCWNoYXIgKm1vZGUgPSAidW5rbm93biI7Ci0JCWlmICh2NGwxX3R1bmVyLm1vZGUgPT0gVklERU9fTU9ERV9QQUwpIHsKLQkJCW1vZGUgPSAiUEFMIjsKLQkJfSBlbHNlIGlmICh2NGwxX3R1bmVyLm1vZGUgPT0gVklERU9fTU9ERV9OVFNDKSB7Ci0JCQltb2RlID0gIk5UU0MiOwotCQl9IGVsc2UgaWYgKHY0bDFfdHVuZXIubW9kZSA9PSBWSURFT19NT0RFX1NFQ0FNKSB7Ci0JCQltb2RlID0gIlNFQ0FNIjsKLQkJfSBlbHNlIGlmICh2NGwxX3R1bmVyLm1vZGUgPT0gVklERU9fTU9ERV9BVVRPKSB7Ci0JCQltb2RlID0gIkFVVE8iOwotCQl9Ci0KLQkJaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICB0dW5lclslZF06ICAgJXNcdGZsYWdzOiAweCV4IG1vZGU6ICVzXG4iLAotCQkgICAgdjRsMV90dW5lci50dW5lciwgdjRsMV90dW5lci5uYW1lLCB2NGwxX3R1bmVyLmZsYWdzLCBtb2RlKTsKLQkJCi0JfQotCi0JaWYgKGlvY3RsKGZkLCBWSURJT0NHUElDVCwgJnY0bDFfcGljdHVyZSkgPT0gLTEpIHsKLQkJcGVycm9yKCJpb2N0bCBWSURJT0NHQ0hBTiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAidjRsLTEgcGljdHVyZTpcbiIpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgYnJpZ2h0bmVzczogICVkXG4iLCB2NGwxX3BpY3R1cmUuYnJpZ2h0bmVzcyk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBodWU6ICAgICAgICAgJWRcbiIsIHY0bDFfcGljdHVyZS5odWUpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgY29sb3VyOiAgICAgICVkXG4iLCB2NGwxX3BpY3R1cmUuY29sb3VyKTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIGNvbnRyYXN0OiAgICAlZFxuIiwgdjRsMV9waWN0dXJlLmNvbnRyYXN0KTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIHdoaXRlbmVzczogICAlZFxuIiwgdjRsMV9waWN0dXJlLndoaXRlbmVzcyk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBkZXB0aDogICAgICAgJWRcbiIsIHY0bDFfcGljdHVyZS5kZXB0aCk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICBwYWxldHRlOiAgICAgJWQgICVzXG4iLCB2NGwxX3BpY3R1cmUucGFsZXR0ZSwKLQkgICAgdjRsMV9sdV9wYWxldHRlKHY0bDFfcGljdHVyZS5wYWxldHRlKSk7Ci0JCi0JaWYgKGlvY3RsKGZkLCBWSURJT0NHV0lOLCAmdjRsMV93aW5kb3cpID09IC0xKSB7Ci0JCXBlcnJvcigiaW9jdGwgVklESU9DR1dJTiIpOwotCQlpZiAodikgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAidjRsLTEgd2luZG93OlxuIik7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgICB4OiAgICAgICAgICAgJWRcbiIsIHY0bDFfd2luZG93LngpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgeTogICAgICAgICAgICVkXG4iLCB2NGwxX3dpbmRvdy55KTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgIHdpZHRoOiAgICAgICAlZFxuIiwgdjRsMV93aW5kb3cud2lkdGgpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgaGVpZ2h0OiAgICAgICVkXG4iLCB2NGwxX3dpbmRvdy5oZWlnaHQpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICAgY2hyb21ha2V5OiAgICVkXG4iLCB2NGwxX3dpbmRvdy5jaHJvbWFrZXkpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0KLQlyZXR1cm4gMTsKLSNlbHNlCi0JaWYgKCFmZCB8fCAhdikge30KLQlyZXR1cm4gMDsKLSNlbmRpZgkvKiBWNExfT0sgKi8KLQotfQotc3RhdGljIGludCB2NGwyX3F1ZXJ5KGludCBmZCwgaW50IHYpIHsKLSNpZiBkZWZpbmVkKFY0TF9PSykgJiYgSEFWRV9WNEwyCi0JdW5zaWduZWQgaW50IGk7Ci0KLQltZW1zZXQoJnY0bDJfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mKHY0bDJfY2FwYWJpbGl0eSkpOwotCW1lbXNldCgmdjRsMl9pbnB1dCwgICAgICAwLCBzaXplb2YodjRsMl9pbnB1dCkpOwotCW1lbXNldCgmdjRsMl90dW5lciwgICAgICAwLCBzaXplb2YodjRsMl90dW5lcikpOwotCW1lbXNldCgmdjRsMl9mbXRkZXNjLCAgICAwLCBzaXplb2YodjRsMl9mbXRkZXNjKSk7Ci0JbWVtc2V0KCZ2NGwyX2Zvcm1hdCwgICAgIDAsIHNpemVvZih2NGwyX2Zvcm1hdCkpOwotCi0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiXG5WNExfMiBxdWVyeTpcbiIpOwotI2lmZGVmIFZJRElPQ19RVUVSWUNBUAotCWlmIChpb2N0bChmZCwgVklESU9DX1FVRVJZQ0FQLCAmdjRsMl9jYXBhYmlsaXR5KSA9PSAtMSkgewotCQlwZXJyb3IoImlvY3RsIFZJRElPQ19RVUVSWUNBUCIpOwotCQlpZiAodikgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi0KLQlpZiAodikgZnByaW50ZihzdGRlcnIsICJ2NGwtMiBjYXBhYmlsaXR5OlxuIik7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgIGRyaXZlcjogICAgICAgJXNcbiIsIHY0bDJfY2FwYWJpbGl0eS5kcml2ZXIpOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICBjYXJkOiAgICAgICAgICVzXG4iLCB2NGwyX2NhcGFiaWxpdHkuY2FyZCk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgIGJ1c19pbmZvOiAgICAgJXNcbiIsIHY0bDJfY2FwYWJpbGl0eS5idXNfaW5mbyk7Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgIHZlcnNpb246ICAgICAgJWRcbiIsIHY0bDJfY2FwYWJpbGl0eS52ZXJzaW9uKTsKLQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgY2FwYWJpbGl0aWVzOiAldVxuIiwgdjRsMl9jYXBhYmlsaXR5LmNhcGFiaWxpdGllcyk7Ci0KLQlmb3IgKGk9MDsgOyBpKyspIHsKLQkJbWVtc2V0KCZ2NGwyX2lucHV0LCAwLCBzaXplb2YodjRsMl9pbnB1dCkpOwotCQl2NGwyX2lucHV0LmluZGV4ID0gaTsKLQkJaWYgKGlvY3RsKGZkLCBWSURJT0NfRU5VTUlOUFVULCAmdjRsMl9pbnB1dCkgPT0gLTEpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICBpbnB1dFslZF06ICVzXHR0eXBlOiAlZCB0dW5lcjogJWRcbiIsCi0JCSAgICBpLCB2NGwyX2lucHV0Lm5hbWUsIHY0bDJfaW5wdXQudHlwZSwgdjRsMl9pbnB1dC50dW5lcik7Ci0JfQotCWlmICh2NGwyX2NhcGFiaWxpdHkuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVFVORVIpIHsKLQkJZm9yIChpPTA7IDsgaSsrKSB7Ci0JCQltZW1zZXQoJnY0bDJfdHVuZXIsIDAsIHNpemVvZih2NGwyX3R1bmVyKSk7Ci0JCQl2NGwyX3R1bmVyLmluZGV4ID0gaTsKLQkJCWlmIChpb2N0bChmZCwgVklESU9DX0dfVFVORVIsICZ2NGwyX3R1bmVyKSA9PSAtMSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHYpIGZwcmludGYoc3RkZXJyLCAiICAgIHR1bmVyWyVkXTogJXNcdHR5cGU6ICVkXG4iLAotCQkJICAgIGksIHY0bDJfdHVuZXIubmFtZSwgdjRsMl90dW5lci50eXBlKTsKLQkJfQotCX0KLQlpZiAodjRsMl9jYXBhYmlsaXR5LmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpIHsKLQkJZm9yIChpPTA7IDsgaSsrKSB7Ci0JCQltZW1zZXQoJnY0bDJfZm10ZGVzYywgMCwgc2l6ZW9mKHY0bDJfZm10ZGVzYykpOwotCQkJdjRsMl9mbXRkZXNjLmluZGV4ID0gaTsKLQkJCXY0bDJfZm10ZGVzYy50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkJCi0JCQlpZiAoaW9jdGwoZmQsIFZJRElPQ19FTlVNX0ZNVCwgJnY0bDJfZm10ZGVzYykgPT0gLTEpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICBmbXRkZXNjWyVkXTogJXNcdHR5cGU6ICVkIgotCQkJICAgICIgcGl4ZWxmb3JtYXQ6ICVkXG4iLAotCQkJICAgIGksIHY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvbiwgdjRsMl9mbXRkZXNjLnR5cGUsCi0JCQkgICAgdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0KTsKLQkJfQotCQl2NGwyX2Zvcm1hdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlpZiAoaW9jdGwoZmQsIFZJRElPQ19HX0ZNVCwgJnY0bDJfZm9ybWF0KSA9PSAtMSkgewotCQkJcGVycm9yKCJpb2N0bCBWSURJT0NfR19GTVQiKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICB3aWR0aDogICVkXG4iLCB2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKTsKLQkJCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIiAgICBoZWlnaHQ6ICVkXG4iLCB2NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCk7Ci0JCQlpZiAodikgZnByaW50ZihzdGRlcnIsICIgICAgZm9ybWF0OiAldSAlc1xuIiwKLQkJCSAgICB2NGwyX2Zvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0LAotCQkJICAgIHY0bDJfbHVfcGFsZXR0ZSh2NGwyX2Zvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0KSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMTsKLSNlbHNlCi0JaWYgKCFmZCB8fCAhdikge30KLQlyZXR1cm4gMDsKLSNlbmRpZgkvKiBWNExfT0sgJiYgSEFWRV9WNEwyICovCi0KLX0KLQotc3RhdGljIGludCBvcGVuX2RldihjaGFyICpkZXYpIHsKLQlpbnQgZGZkID0gLTE7Ci0JaWYgKCEgZGV2KSB7Ci0JCXJldHVybiBkZmQ7Ci0JfQotCWRmZCA9IG9wZW4oZGV2LCBPX1JEV1IpOwotCWlmIChkZmQgPCAwKSB7Ci0JCXJmYkxvZygiZmFpbGVkIHRvIHJhd2ZiIGZpbGU6ICVzIE9fUkRXUlxuIiwgZGV2KTsKLQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JCWRmZCA9IG9wZW4oZGV2LCBPX1JET05MWSk7Ci0JfQotCWlmIChkZmQgPCAwKSB7Ci0JCXJmYkxvZygiZmFpbGVkIHRvIHJhd2ZiIGZpbGU6ICVzXG4iLCBkZXYpOwotCQlyZmJMb2coImZhaWxlZCB0byByYXdmYiBmaWxlOiAlcyBPX1JET05MWVxuIiwgZGV2KTsKLQkJcmZiTG9nUGVycm9yKCJvcGVuIik7Ci0JfQotCXJldHVybiBkZmQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpndWVzc192aWFfdjRsKGNoYXIgKmRldiwgaW50ICpmZCkgewotI2lmZGVmIFY0TF9PSwotCWludCBkZmQ7Ci0JCi0JaWYgKCpmZCA8IDApIHsKLQkJZGZkID0gb3Blbl9kZXYoZGV2KTsKLQkJKmZkID0gZGZkOwotCX0KLQlkZmQgPSAqZmQ7Ci0JaWYgKGRmZCA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh2NGwxX2NhcCA8IDApIHsKLQkJdjRsMV9jYXAgPSB2NGwxX3F1ZXJ5KGRmZCwgMSk7Ci0JfQotCWlmICh2NGwyX2NhcCA8IDApIHsKLQkJdjRsMl9jYXAgPSB2NGwyX3F1ZXJ5KGRmZCwgMSk7Ci0JfQotCi0JaWYgKHY0bDJfY2FwKSB7Ci0jaWYgSEFWRV9WNEwyCi0JCWludCBnX3cgPSB2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoOwotCQlpbnQgZ19oID0gdjRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQ7Ci0JCWludCBnX2QgPSAwLCBnX3JldjsKLQotCQlpZiAodjRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCkgewotCQkJY2hhciAqc3RyID0gdjRsMl9sdV9wYWxldHRlKHY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCQkJaWYgKHN0cmNtcChzdHIsICJ1bmtub3duIikpIHsKLQkJCQl2NGwyX2x1X3BhbGV0dGVfc3RyKHN0ciwgJmdfZCwgJmdfcmV2KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGdfdyA+IDAgJiYgZ19oID4gMCAmJiBnX2QgPiAwKSB7Ci0JCQljaGFyICphdHBhcm1zID0gKGNoYXIgKikgbWFsbG9jKDIwMCk7Ci0JCQljaGFyICpwYWwgPSB2NGwyX2x1X3BhbGV0dGUodjRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JCQlzcHJpbnRmKGF0cGFybXMsICIlZHglZHglZCIsIGdfdywgZ19oLCBnX2QpOwotCQkJaWYgKHN0cnN0cihwYWwsICJSR0I1NTUiKSkgewotCQkJCXN0cmNhdChhdHBhcm1zLCAiOjdjMDAvM2UwLzFmIik7Ci0JCQl9Ci0JCQkqZmQgPSBkZmQ7Ci0JCQlyZXR1cm4gYXRwYXJtczsKLQkJfQotI2VuZGlmCi0JfQotCWlmICh2NGwxX2NhcCkgewotCQlpbnQgZ193ID0gdjRsMV93aW5kb3cud2lkdGg7Ci0JCWludCBnX2ggPSB2NGwxX3dpbmRvdy5oZWlnaHQ7Ci0JCWludCBnX2QgPSB2NGwxX3BpY3R1cmUuZGVwdGg7Ci0JCWludCBnX3JldjsKLQkJaWYgKGdfZCA9PSAwKSB7Ci0JCQljaGFyICpzdHIgPSB2NGwxX2x1X3BhbGV0dGUodjRsMV9waWN0dXJlLnBhbGV0dGUpOwotCQkJaWYgKHN0cmNtcChzdHIsICJ1bmtub3duIikpIHsKLQkJCQl2NGwxX2x1X3BhbGV0dGVfc3RyKHN0ciwgJmdfZCwgJmdfcmV2KTsKLQkJCX0KLQkJfQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAidjRsMTogJWQgJWQgJWRcbiIsIGdfdywgZ19oLCBnX2QpOwotCQlpZiAoZ193ID4gMCAmJiBnX2ggPiAwICYmIGdfZCA+IDApIHsKLQkJCWNoYXIgKmF0cGFybXMgPSAoY2hhciAqKSBtYWxsb2MoMjAwKTsKLQkJCWNoYXIgKnBhbCA9IHY0bDFfbHVfcGFsZXR0ZSh2NGwxX3BpY3R1cmUucGFsZXR0ZSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInBhbGV0dGU6ICVzXG4iLCBwYWwpOwotCQkJc3ByaW50ZihhdHBhcm1zLCAiJWR4JWR4JWQiLCBnX3csIGdfaCwgZ19kKTsKLQkJCWlmIChzdHJzdHIocGFsLCAiUkdCNTU1IikpIHsKLQkJCQlzdHJjYXQoYXRwYXJtcywgIjo3YzAwLzNlMC8xZiIpOwotCQkJfQotCQkJKmZkID0gZGZkOwotCQkJcmV0dXJuIGF0cGFybXM7Ci0JCX0KLQl9Ci0KLQkvKiBmYWlsdXJlICovCi0JY2xvc2UoZGZkKTsKLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JaWYgKCFkZXYgfHwgIWZkKSB7fQotCXJldHVybiBOVUxMOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBjaGFyICpndWVzc192aWFfdjRsX2luZm8oY2hhciAqZGV2LCBpbnQgKmZkKSB7Ci0JY2hhciAqYXRwYXJtcywgKmNtZDsKLQljaGFyIGxpbmVbMTAyNF0sIHRtcFtdID0gIi90bXAveDExdm5jLXRtcC5YWFhYWFgiOwotCUZJTEUgKm91dDsKLQlpbnQgdG1wX2ZkLCBsZW4sIHJjLCBjdXJyID0gMDsKLQlpbnQgZ193ID0gMCwgZ19oID0gMCwgZ19iID0gMCwgbWFza19yZXYgPSAwOwotCWNoYXIgKmdfZm10ID0gTlVMTDsKLQotCWlmICgqZmQpIHt9Ci0KLQkvKiB2NGwtaW5mbyAqLwotCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soInY0bC1pbmZvIikpIHsKLQkJcmZiTG9nKCJndWVzc192aWFfdjRsX2luZm86IGNhbm5vdCBydW4gZXh0ZXJuYWwgIgotCQkgICAgImNvbW1hbmQ6IHY0bC1pbmZvXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHN0cmNocihkZXYsICdcJycpKSB7Ci0JCXJmYkxvZygiZ3Vlc3NfdmlhX3Y0bF9pbmZvOiBiYWQgZGV2IHN0cmluZzogJXNcbiIsIGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXRtcF9mZCA9IG1rc3RlbXAodG1wKTsKLQlpZiAodG1wX2ZkIDwgMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlsZW4gPSAgc3RybGVuKCJ2NGwtaW5mbyIpKzErMStzdHJsZW4oZGV2KSsxKzErMSsxK3N0cmxlbih0bXApKzE7IAotCWNtZCA9IChjaGFyICopIG1hbGxvYyhsZW4pOwotCXJmYkxvZygiZ3Vlc3NfdmlhX3Y0bF9pbmZvIHJ1bm5pbmc6IHY0bC1pbmZvICclcydcbiIsIGRldik7Ci0Jc3ByaW50ZihjbWQsICJ2NGwtaW5mbyAnJXMnID4gJXMiLCBkZXYsIHRtcCk7Ci0KLQljbG9zZSh0bXBfZmQpOwotCWNsb3NlX2V4ZWNfZmRzKCk7Ci0JcmMgPSBzeXN0ZW0oY21kKTsKLQlpZiAocmMgIT0gMCkgewotCQl1bmxpbmsodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jb3V0ID0gZm9wZW4odG1wLCAiciIpOwotCWlmIChvdXQgPT0gTlVMTCkgewotCQl1bmxpbmsodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWN1cnIgPSAwOwotCXdoaWxlIChmZ2V0cyhsaW5lLCAxMDI0LCBvdXQpICE9IE5VTEwpIHsKLQkJY2hhciAqbGIgPSBsYmxhbmtzKGxpbmUpOwotCQlpZiAoc3Ryc3RyKGxpbmUsICJ2aWRlbyBjYXB0dXJlIikgPT0gbGluZSkgewotCQkJY3VyciA9IENfVklERU9fQ0FQVFVSRTsKLQkJfSBlbHNlIGlmIChzdHJzdHIobGluZSwgInBpY3R1cmUiKSA9PSBsaW5lKSB7Ci0JCQljdXJyID0gQ19QSUNUVVJFOwotCQl9IGVsc2UgaWYgKHN0cnN0cihsaW5lLCAid2luZG93IikgPT0gbGluZSkgewotCQkJY3VyciA9IENfV0lORE9XOwotCQl9Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImxiOiAlcyIsIGxiKTsKLQotCQlpZiAoY3VyciA9PSBDX1ZJREVPX0NBUFRVUkUpIHsKLQkJCWlmIChzdHJzdHIobGIsICJwaXhlbGZvcm1hdCAiKSA9PSBsYikgewotCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBsaW5lKTsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGxiLCAiZm10LnBpeC53aWR0aCAiKSA9PSBsYikgewotCQkJCWlmICghIGdfdykgewotCQkJCQlnX3cgPSBjb2xvbl9uKGxpbmUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGxiLCAiZm10LnBpeC5oZWlnaHQgIikgPT0gbGIpIHsKLQkJCQlpZiAoISBnX2gpIHsKLQkJCQkJZ19oID0gY29sb25fbihsaW5lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihsYiwgImZtdC5waXgucGl4ZWxmb3JtYXQgIikgPT0gbGIpIHsKLQkJCQlpZiAoISBnX2ZtdCkgewotCQkJCQlnX2ZtdCA9IGNvbG9uX3RhZyhsaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY3VyciA9PSBDX1BJQ1RVUkUpIHsKLQkJCWlmIChzdHJzdHIobGIsICJkZXB0aCAiKSA9PSBsYikgewotCQkJCWlmICghIGdfYikgewotCQkJCQlnX2IgPSBjb2xvbl9uKGxpbmUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKGxiLCAicGFsZXR0ZSAiKSA9PSBsYikgewotCQkJCWlmICghIGdfZm10KSB7Ci0JCQkJCWdfZm10ID0gY29sb25fc3RyKGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjdXJyID09IENfV0lORE9XKSB7Ci0JCQlpZiAoc3Ryc3RyKGxiLCAid2lkdGggIikgPT0gbGIpIHsKLQkJCQlpZiAoISBnX3cpIHsKLQkJCQkJZ193ID0gY29sb25fbihsaW5lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihsYiwgImhlaWdodCAiKSA9PSBsYikgewotCQkJCWlmICghIGdfaCkgewotCQkJCQlnX2ggPSBjb2xvbl9uKGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlmY2xvc2Uob3V0KTsKLQl1bmxpbmsodG1wKTsKLQotCWlmICghIGdfdykgewotCQlyZmJMb2coImNvdWxkIG5vdCBndWVzcyBkZXZpY2Ugd2lkdGguXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJmYkxvZygiZ3Vlc3NlZCBkZXZpY2Ugd2lkdGg6ICAlZFxuIiwgZ193KTsKLQotCWlmICghIGdfaCkgewotCQlyZmJMb2coImNvdWxkIG5vdCBndWVzcyBkZXZpY2UgaGVpZ2h0LlxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZmJMb2coImd1ZXNzZWQgZGV2aWNlIGhlaWdodDogJWRcbiIsIGdfaCk7Ci0KLQlpZiAoZ19mbXQpIHsKLQkJcmZiTG9nKCJndWVzc2VkIHBpeGVsIGZtdDogICAgICVzXG4iLCBnX2ZtdCk7Ci0JCWxvb2t1cF9yZ2IoZ19mbXQsICZnX2IsICZtYXNrX3Jldik7Ci0JfQotCWlmICghIGdfYikgewotCQlyZmJMb2coImNvdWxkIG5vdCBndWVzcyBkZXZpY2UgYnBwLlxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZmJMb2coImd1ZXNzZWQgZGV2aWNlIGJwcDogICAgJWRcbiIsIGdfYik7Ci0KLQlhdHBhcm1zID0gKGNoYXIgKikgbWFsbG9jKDEwMCk7Ci0Jc3ByaW50ZihhdHBhcm1zLCAiJWR4JWR4JWQiLCBnX3csIGdfaCwgZ19iKTsKLQlyZXR1cm4gYXRwYXJtczsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2Vfc3RyKGNoYXIgKnN0ciwgY2hhciAqKmRldiwgY2hhciAqKnNldHRpbmdzLCBjaGFyICoqYXRwYXJtcykgewotCWNoYXIgKnAsICpxLCAqcyA9IE5VTEw7Ci0KLQlxID0gc3RyY2hyKHN0ciwgJ0AnKTsKLQlpZiAocSAmJiBzdHJsZW4ocSsxKSA+IDApIHsKLQkJLyogZW5kcyBAV3hIWEIuLi4gKi8KLQkJKmF0cGFybXMgPSBzdHJkdXAocSsxKTsKLQkJKnEgPSAnXDAnOwotCX0KLQotCXEgPSBzdHJjaHIoc3RyLCAnOicpOwotCWlmIChxICYmIHN0cmxlbihxKzEpID4gMCkgewotCQkvKiBlbmRzIDpicj1OLHc9Ti4uLiAqLwotCQlzID0gc3RyZHVwKHErMSk7Ci0JCSpzZXR0aW5ncyA9IHM7Ci0JCSpxID0gJ1wwJzsKLQl9Ci0KLQlpZiAocyAhPSBOVUxMKSB7Ci0JCS8qIHNlZSBpZiBmbj1maWxlbmFtZSAqLwotCQlxID0gc3Ryc3RyKHMsICJmbj0iKTsKLQkJaWYgKHEpIHsKLQkJCXEgKz0gc3RybGVuKCJmbj0iKTsKLQkJCXAgPSBzdHJjaHIocSwgJywnKTsKLQkJCWlmIChwKSB7Ci0JCQkJKnAgPSAnXDAnOwotCQkJCSpkZXYgPSBzdHJkdXAocSk7IAotCQkJCSpwID0gJywnOwotCQkJfSBlbHNlIHsKLQkJCQkqZGV2ID0gc3RyZHVwKHEpOyAKLQkJCX0KLQkJCXJmYkxvZygic2V0IHZpZGVvIGRldmljZSB0bzogJyVzJ1xuIiwgKmRldik7Ci0JCX0KLQl9Ci0KLQlpZiAoKmRldiA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBzdGF0IHNidWY7Ci0JCXMgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKCIvZGV2LyIpICsgc3RybGVuKHN0cikgKyAyKTsKLQkJaWYgKHN0cnN0cihzdHIsICIvZGV2LyIpID09IHN0cikgewotCQkJc3ByaW50ZihzLCAiJXMiLCBzdHIpOwotCQl9IGVsc2UgewotCQkJc3ByaW50ZihzLCAiL2Rldi8lcyIsIHN0cik7Ci0JCX0gCi0JCXJmYkxvZygiQ2hlY2tpbmcgZXhpc3RlbmNlIG9mICclcydcbiIsIHMpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0KHMsICZzYnVmKSAhPSAwKSB7Ci0JCQlyZmJMb2dQZXJyb3IoInN0YXQiKTsKLQkJCXN0cmNhdChzLCAiMCIpOwotCQkJcmZiTG9nKCJzd2l0Y2hpbmcgdG8gJyVzJ1xuIiwgcyk7Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdChzLCAmc2J1ZikgIT0gMCkgewotCQkJcmZiTG9nUGVycm9yKCJzdGF0Iik7Ci0JCQlyZmJMb2coIllvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB0aGUgdmlkZW8gZGV2aWNlIG1vcmUgZXhwbGljaXR5LlxuIik7Ci0JCX0KLQotCQkqZGV2ID0gczsKLQkJcmZiTG9nKCJzZXQgdmlkZW8gZGV2aWNlIHRvOiAnJXMnXG4iLCAqZGV2KTsKLQl9Ci19Ci0KLWNoYXIgKnY0bF9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpIHsKLQljaGFyICpkZXYgPSBOVUxMLCAqc2V0dGluZ3MgPSBOVUxMLCAqYXRwYXJtcyA9IE5VTEw7Ci0KLQlwYXJzZV9zdHIoc3RyLCAmZGV2LCAmc2V0dGluZ3MsICZhdHBhcm1zKTsKLQotCWluaXRfZnJlcXMoKTsKLQotCXY0bDFfY2FwID0gLTE7Ci0JdjRsMl9jYXAgPSAtMTsKLQkqZmQgPSAtMTsKLQotCWlmIChkZXYgPT0gTlVMTCkgewotCQlyZmJMb2coInY0bF9ndWVzczogY291bGQgbm90IGZpbmQgZGV2aWNlIGluOiAlc1xuIiwgc3RyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHNldHRpbmdzKSB7Ci0JCWFwcGx5X3NldHRpbmdzKGRldiwgc2V0dGluZ3MsIGZkKTsKLQl9Ci0KLQlpZiAoYXRwYXJtcykgewotCQkvKiB1c2UgdXNlcidzIHBhcmFtZXRlcnMuICovCi0JCWNoYXIgKnQgPSAoY2hhciAqKSBtYWxsb2MoNStzdHJsZW4oZGV2KSsxK3N0cmxlbihhdHBhcm1zKSsxKTsKLQkJc3ByaW50Zih0LCAic25hcDolc0AlcyIsIGRldiwgYXRwYXJtcyk7Ci0JCXJldHVybiB0OwotCX0KLQotCS8qIHRyeSB0byBxdWVyeSB0aGUgZGV2aWNlIGZvciBwYXJhbWV0ZXJzLiAqLwotCWF0cGFybXMgPSBndWVzc192aWFfdjRsKGRldiwgZmQpOwotCWlmIChhdHBhcm1zID09IE5VTEwpIHsKLQkJLyogdHJ5IGFnYWluIHdpdGggdjRsLWluZm8oMSkgKi8KLQkJYXRwYXJtcyA9IGd1ZXNzX3ZpYV92NGxfaW5mbyhkZXYsIGZkKTsKLQl9Ci0KLQlpZiAoYXRwYXJtcyA9PSBOVUxMKSB7Ci0JCS8qIGJhZCBuZXdzICovCi0JCWlmICgqZmQgPj0gMCkgewotCQkJY2xvc2UoKmZkKTsKLQkJfQotCQkqZmQgPSAtMTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJY2hhciAqdCA9IChjaGFyICopIG1hbGxvYyg1K3N0cmxlbihkZXYpKzErc3RybGVuKGF0cGFybXMpKzEpOwotCQlzcHJpbnRmKHQsICJzbmFwOiVzQCVzIiwgZGV2LCBhdHBhcm1zKTsKLQkJcmV0dXJuIHQ7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb29rdXBfZnJlcXRhYihpbnQgc3RhKSB7Ci0KLQlpZiAoc3RhID49IENIQU5ORUxfTUFYKSB7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgc3RhOwotCX0KLQlpZiAoc3RhIDwgMCB8fCBzdGEgPj0gQ0hBTk5FTF9NQVgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBjdXN0b21fZnJlcVtzdGFdOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb29rdXBfZnJlcShpbnQgc3RhKSB7Ci0JaWYgKGZyZXF0YWIpIHsKLQkJcmV0dXJuIGxvb2t1cF9mcmVxdGFiKHN0YSk7Ci0JfQotCWlmIChzdGEgPj0gQ0hBTk5FTF9NQVgpIHsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSBzdGE7Ci0JfQotCWlmIChzdGEgPCAxIHx8IHN0YSA+IDEyNSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIG50c2NfY2FibGVbc3RhXTsKLX0KLQotc3RhdGljIGludCBsb29rdXBfc3RhdGlvbih1bnNpZ25lZCBsb25nIGZyZXEpIHsKLQlpbnQgaTsKLQlpZiAoZnJlcXRhYikgewotCQlmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9NQVg7IGkrKykgewotaWYgKDApIGZwcmludGYoc3RkZXJyLCAiJWx1ICVsdVxuIiwgZnJlcSwgY3VzdG9tX2ZyZXFbaV0pOwotCQkJaWYgKGZyZXEgPT0gY3VzdG9tX2ZyZXFbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDE7IGkgPD0gMTI1OyBpKyspIHsKLQkJCWlmIChmcmVxID09IG50c2NfY2FibGVbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9mcmVxdGFiKGNoYXIgKmZpbGUpIHsKLQljaGFyICpwLCAqcSwgKmRpciwgKmZpbGUyOwotCWNoYXIgbGluZVsxMDI0XSwgaW5jWzEwMjRdOwotCWNoYXIgKnRleHQsICpzdHI7Ci0JaW50IHNpemUgPSAwLCBtYXhuLCBleHRyYSwgY3Vycm47Ci0JRklMRSAqaW4xLCAqaW4yOwotCXN0YXRpYyBpbnQgdiA9IDE7Ci0JaWYgKHF1aWV0KSB7Ci0JCXYgPSAwOwotCX0KLQotCS8qIFlVQ0sgKi8KLQotCWRpciA9IHN0cmR1cChmaWxlKTsKLQlxID0gc3RycmNocihkaXIsICcvJyk7Ci0JaWYgKHEpIHsKLQkJKihxKzEpID0gJ1wwJzsKLQl9IGVsc2UgewotCQlmcmVlKGRpcik7Ci0JCWRpciA9IHN0cmR1cCgiLi8iKTsKLQl9Ci0JZmlsZTIgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGRpcikgKyAxMDI0ICsgMSk7Ci0JaW4xID0gZm9wZW4oZmlsZSwgInIiKTsKLQlpZiAoaW4xID09IE5VTEwpIHsKLQkJcmZiTG9nKCJlcnJvciBvcGVuaW5nIGZyZXF0YWI6ICVzXG4iLCBmaWxlKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JaWYgKHYpIGZwcmludGYoc3RkZXJyLCAibG9hZGluZyBmcmVxdWVuY2llcyBmcm9tOiAlc1xuIiwgZmlsZSk7Ci0Jd2hpbGUgKGZnZXRzKGxpbmUsIDEwMjQsIGluMSkgIT0gTlVMTCkgewotCQljaGFyICpsYjsKLQkJY2hhciBsaW5lMlsxMDI0XTsKLQkJc2l6ZSArPSBzdHJsZW4obGluZSk7Ci0JCWxiID0gbGJsYW5rcyhsaW5lKTsKLQkJaWYgKHN0cnN0cihsYiwgIiNpbmNsdWRlIikgPT0gbGIgJiYgCi0JCSAgICBzc2NhbmYobGIsICIjaW5jbHVkZSAlcyIsIGluYykgPT0gMSkgewotCQkJY2hhciAqcSwgKnMgPSBpbmM7Ci0JCQlpZiAoc1swXSA9PSAnIicpIHsKLQkJCQlzKys7Ci0JCQl9Ci0JCQlxID0gc3RycmNocihzLCAnIicpOwotCQkJaWYgKHEpIHsKLQkJCQkqcSA9ICdcMCc7Ci0JCQl9Ci0JCQlzcHJpbnRmKGZpbGUyLCAiJXMlcyIsIGRpciwgcyk7Ci0JCQlpbjIgPSBmb3BlbihmaWxlMiwgInIiKTsKLQkJCWlmIChpbjIgPT0gTlVMTCkgewotCQkJCXJmYkxvZygiZXJyb3Igb3BlbmluZyBmcmVxdGFiIGluY2x1ZGU6ICVzICVzXG4iLCBsaW5lLCBmaWxlMik7Ci0JCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJCX0KLQkJCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgImxvYWRpbmcgZnJlcXVlbmNpZXMgZnJvbTogJXNcbiIsIGZpbGUyKTsKLQkJCXdoaWxlIChmZ2V0cyhsaW5lMiwgMTAyNCwgaW4yKSAhPSBOVUxMKSB7Ci0JCQkJc2l6ZSArPSBzdHJsZW4obGluZTIpOwotCQkJfQotCQkJZmNsb3NlKGluMik7Ci0JCX0KLQl9Ci0JZmNsb3NlKGluMSk7Ci0KLQlzaXplID0gNCooc2l6ZSArIDEwMDAwKTsKLQotCXRleHQgPSAoY2hhciAqKSBtYWxsb2Moc2l6ZSk7Ci0KLQl0ZXh0WzBdID0gJ1wwJzsKLQotCWluMSA9IGZvcGVuKGZpbGUsICJyIik7Ci0JaWYgKGluMSA9PSBOVUxMKSB7Ci0JCXJmYkxvZygiZXJyb3Igb3BlbmluZyBmcmVxdGFiOiAlc1xuIiwgZmlsZSk7Ci0JCWNsZWFuX3VwX2V4aXQoMSk7Ci0JfQotCXdoaWxlIChmZ2V0cyhsaW5lLCAxMDI0LCBpbjEpICE9IE5VTEwpIHsKLQkJY2hhciAqbGI7Ci0JCWNoYXIgbGluZTJbMTAyNF07Ci0JCWxiID0gbGJsYW5rcyhsaW5lKTsKLQkJaWYgKGxiWzBdID09ICdbJykgewotCQkJc3RyY2F0KHRleHQsIGxiKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIobGIsICJmcmVxIikpIHsKLQkJCXN0cmNhdCh0ZXh0LCBsYik7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGxiLCAiI2luY2x1ZGUiKSA9PSBsYiAmJiAKLQkJICAgIHNzY2FuZihsYiwgIiNpbmNsdWRlICVzIiwgaW5jKSA9PSAxKSB7Ci0JCQljaGFyICpsYjI7Ci0JCQljaGFyICpxLCAqcyA9IGluYzsKLQkJCWlmIChzWzBdID09ICciJykgewotCQkJCXMrKzsKLQkJCX0KLQkJCXEgPSBzdHJyY2hyKHMsICciJyk7Ci0JCQlpZiAocSkgewotCQkJCSpxID0gJ1wwJzsKLQkJCX0KLQkJCXNwcmludGYoZmlsZTIsICIlcyVzIiwgZGlyLCBzKTsKLQkJCWluMiA9IGZvcGVuKGZpbGUyLCAiciIpOwotCQkJaWYgKGluMiA9PSBOVUxMKSB7Ci0JCQkJcmZiTG9nKCJlcnJvciBvcGVuaW5nIGZyZXF0YWIgaW5jbHVkZTogJXMgJXNcbiIsIGxpbmUsIGZpbGUyKTsKLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQkJd2hpbGUgKGZnZXRzKGxpbmUyLCAxMDI0LCBpbjIpICE9IE5VTEwpIHsKLQkJCQlsYjIgPSBsYmxhbmtzKGxpbmUyKTsKLQkJCQlpZiAobGIyWzBdID09ICdbJykgewotCQkJCQlzdHJjYXQodGV4dCwgbGIyKTsKLQkJCQl9IGVsc2UgaWYgKHN0cnN0cihsYjIsICJmcmVxIikpIHsKLQkJCQkJc3RyY2F0KHRleHQsIGxiMik7Ci0JCQkJfQotCQkJCWlmICgoaW50KSBzdHJsZW4odGV4dCkgPiBzaXplLzIpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZmNsb3NlKGluMik7Ci0JCX0KLQkJaWYgKChpbnQpIHN0cmxlbih0ZXh0KSA+IHNpemUvMikgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZmNsb3NlKGluMSk7Ci0KLQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICIlcyIsIHRleHQpOwotCi0Jc3RyID0gc3RyZHVwKHRleHQpOwotCXAgPSBzdHJ0b2soc3RyLCAiXG4iKTsKLQltYXhuID0gLTE7Ci0JZXh0cmEgPSAwOwotCXdoaWxlIChwKSB7Ci0JCWlmIChwWzBdID09ICdbJykgewotCQkJaW50IG9rID0gMTsKLQkJCXEgPSBwKzE7CQotCQkJd2hpbGUgKCpxKSB7Ci0JCQkJaWYgKCpxID09ICddJykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCEgaXNkaWdpdCgodW5zaWduZWQgY2hhcikgKCpxKSkpIHsKLQkJCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZXh0cmE6ICVzXG4iLCBwKTsKLQkJCQkJZXh0cmErKzsKLQkJCQkJb2sgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcSsrOwotCQkJfQotCQkJaWYgKG9rKSB7Ci0JCQkJaW50IG47Ci0JCQkJaWYgKHNzY2FuZihwLCAiWyVkXSIsICZuKSA9PSAxKSAgewotCQkJCQlpZiAobiA+IG1heG4pIHsKLQkJCQkJCW1heG4gPSBuOwotCQkJCQl9Ci0JCQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIm1heG46ICAlZCAlZFxuIiwgbWF4biwgbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJcCA9IHN0cnRvayhOVUxMLCAiXG4iKTsKLQl9Ci0JZnJlZShzdHIpOwotCi0Jc3RyID0gc3RyZHVwKHRleHQpOwotCXAgPSBzdHJ0b2soc3RyLCAiXG4iKTsKLQlleHRyYSA9IDA7Ci0JY3Vycm4gPSAwOwotCWlmICh2KSBmcHJpbnRmKHN0ZGVyciwgIlxubmFtZVx0c3RhdGlvblx0ZnJlcSAoS0h6KVxuIik7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKHBbMF0gPT0gJ1snKSB7Ci0JCQlpbnQgb2sgPSAxOwotCQkJc3RybmNweShsaW5lLCBwLCAxMDApOwotCQkJcSA9IHArMTsJCi0JCQl3aGlsZSAoKnEpIHsKLQkJCQlpZiAoKnEgPT0gJ10nKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoISBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAoKnEpKSkgewotCQkJCQlleHRyYSsrOwotCQkJCQljdXJybiA9IG1heG4gKyBleHRyYTsKLQkJCQkJb2sgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcSsrOwotCQkJfQotCQkJaWYgKG9rKSB7Ci0JCQkJaW50IG47Ci0JCQkJaWYgKHNzY2FuZihwLCAiWyVkXSIsICZuKSA9PSAxKSAgewotCQkJCQljdXJybiA9IG47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzdHJzdHIocCwgImZyZXEiKSAmJiAocSA9IHN0cmNocihwLCAnPScpKSAhPSBOVUxMKSB7Ci0JCQlpbnQgbjsKLQkJCXEgPSBsYmxhbmtzKHErMSk7Ci0JCQlpZiAoc3NjYW5mKHEsICIlZCIsICZuKSA9PSAxKSB7Ci0JCQkJaWYgKGN1cnJuID49IDAgJiYgY3Vycm4gPCBDSEFOTkVMX01BWCkgewotCQkJCQlpZiAodikgZnByaW50ZihzdGRlcnIsICIlc1x0JWRcdCVkXG4iLCBsaW5lLCBjdXJybiwgbik7Ci0JCQkJCWN1c3RvbV9mcmVxW2N1cnJuXSA9ICh1bnNpZ25lZCBsb25nKSBuOwotCQkJCQlpZiAobGFzdF9mcmVxID09IDApIHsKLQkJCQkJCWxhc3RfZnJlcSA9IGN1c3RvbV9mcmVxW2N1cnJuXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICJcbiIpOwotCX0KLQlpZiAodikgZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXYgPSAwOwotCWZyZWUoc3RyKTsKLQlmcmVlKHRleHQpOwotCWZyZWUoZGlyKTsKLQlmcmVlKGZpbGUyKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9mcmVxcyh2b2lkKSB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8Q0hBTk5FTF9NQVg7IGkrKykgewotCQludHNjX2NhYmxlW2ldID0gMDsKLQkJY3VzdG9tX2ZyZXFbaV0gPSAwOwotCX0KLQotCWluaXRfbnRzY19jYWJsZSgpOwotCWxhc3RfZnJlcSA9IG50c2NfY2FibGVbMV07Ci0KLQlpZiAoZnJlcXRhYikgewotCQlpbml0X2ZyZXF0YWIoZnJlcXRhYik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpbml0X250c2NfY2FibGUodm9pZCkgewotCW50c2NfY2FibGVbMV0gPSA3MzI1MDsKLQludHNjX2NhYmxlWzJdID0gNTUyNTA7Ci0JbnRzY19jYWJsZVszXSA9IDYxMjUwOwotCW50c2NfY2FibGVbNF0gPSA2NzI1MDsKLQludHNjX2NhYmxlWzVdID0gNzcyNTA7Ci0JbnRzY19jYWJsZVs2XSA9IDgzMjUwOwotCW50c2NfY2FibGVbN10gPSAxNzUyNTA7Ci0JbnRzY19jYWJsZVs4XSA9IDE4MTI1MDsKLQludHNjX2NhYmxlWzldID0gMTg3MjUwOwotCW50c2NfY2FibGVbMTBdID0gMTkzMjUwOwotCW50c2NfY2FibGVbMTFdID0gMTk5MjUwOwotCW50c2NfY2FibGVbMTJdID0gMjA1MjUwOwotCW50c2NfY2FibGVbMTNdID0gMjExMjUwOwotCW50c2NfY2FibGVbMTRdID0gMTIxMjUwOwotCW50c2NfY2FibGVbMTVdID0gMTI3MjUwOwotCW50c2NfY2FibGVbMTZdID0gMTMzMjUwOwotCW50c2NfY2FibGVbMTddID0gMTM5MjUwOwotCW50c2NfY2FibGVbMThdID0gMTQ1MjUwOwotCW50c2NfY2FibGVbMTldID0gMTUxMjUwOwotCW50c2NfY2FibGVbMjBdID0gMTU3MjUwOwotCW50c2NfY2FibGVbMjFdID0gMTYzMjUwOwotCW50c2NfY2FibGVbMjJdID0gMTY5MjUwOwotCW50c2NfY2FibGVbMjNdID0gMjE3MjUwOwotCW50c2NfY2FibGVbMjRdID0gMjIzMjUwOwotCW50c2NfY2FibGVbMjVdID0gMjI5MjUwOwotCW50c2NfY2FibGVbMjZdID0gMjM1MjUwOwotCW50c2NfY2FibGVbMjddID0gMjQxMjUwOwotCW50c2NfY2FibGVbMjhdID0gMjQ3MjUwOwotCW50c2NfY2FibGVbMjldID0gMjUzMjUwOwotCW50c2NfY2FibGVbMzBdID0gMjU5MjUwOwotCW50c2NfY2FibGVbMzFdID0gMjY1MjUwOwotCW50c2NfY2FibGVbMzJdID0gMjcxMjUwOwotCW50c2NfY2FibGVbMzNdID0gMjc3MjUwOwotCW50c2NfY2FibGVbMzRdID0gMjgzMjUwOwotCW50c2NfY2FibGVbMzVdID0gMjg5MjUwOwotCW50c2NfY2FibGVbMzZdID0gMjk1MjUwOwotCW50c2NfY2FibGVbMzddID0gMzAxMjUwOwotCW50c2NfY2FibGVbMzhdID0gMzA3MjUwOwotCW50c2NfY2FibGVbMzldID0gMzEzMjUwOwotCW50c2NfY2FibGVbNDBdID0gMzE5MjUwOwotCW50c2NfY2FibGVbNDFdID0gMzI1MjUwOwotCW50c2NfY2FibGVbNDJdID0gMzMxMjUwOwotCW50c2NfY2FibGVbNDNdID0gMzM3MjUwOwotCW50c2NfY2FibGVbNDRdID0gMzQzMjUwOwotCW50c2NfY2FibGVbNDVdID0gMzQ5MjUwOwotCW50c2NfY2FibGVbNDZdID0gMzU1MjUwOwotCW50c2NfY2FibGVbNDddID0gMzYxMjUwOwotCW50c2NfY2FibGVbNDhdID0gMzY3MjUwOwotCW50c2NfY2FibGVbNDldID0gMzczMjUwOwotCW50c2NfY2FibGVbNTBdID0gMzc5MjUwOwotCW50c2NfY2FibGVbNTFdID0gMzg1MjUwOwotCW50c2NfY2FibGVbNTJdID0gMzkxMjUwOwotCW50c2NfY2FibGVbNTNdID0gMzk3MjUwOwotCW50c2NfY2FibGVbNTRdID0gNDAzMjUwOwotCW50c2NfY2FibGVbNTVdID0gNDA5MjUwOwotCW50c2NfY2FibGVbNTZdID0gNDE1MjUwOwotCW50c2NfY2FibGVbNTddID0gNDIxMjUwOwotCW50c2NfY2FibGVbNThdID0gNDI3MjUwOwotCW50c2NfY2FibGVbNTldID0gNDMzMjUwOwotCW50c2NfY2FibGVbNjBdID0gNDM5MjUwOwotCW50c2NfY2FibGVbNjFdID0gNDQ1MjUwOwotCW50c2NfY2FibGVbNjJdID0gNDUxMjUwOwotCW50c2NfY2FibGVbNjNdID0gNDU3MjUwOwotCW50c2NfY2FibGVbNjRdID0gNDYzMjUwOwotCW50c2NfY2FibGVbNjVdID0gNDY5MjUwOwotCW50c2NfY2FibGVbNjZdID0gNDc1MjUwOwotCW50c2NfY2FibGVbNjddID0gNDgxMjUwOwotCW50c2NfY2FibGVbNjhdID0gNDg3MjUwOwotCW50c2NfY2FibGVbNjldID0gNDkzMjUwOwotCW50c2NfY2FibGVbNzBdID0gNDk5MjUwOwotCW50c2NfY2FibGVbNzFdID0gNTA1MjUwOwotCW50c2NfY2FibGVbNzJdID0gNTExMjUwOwotCW50c2NfY2FibGVbNzNdID0gNTE3MjUwOwotCW50c2NfY2FibGVbNzRdID0gNTIzMjUwOwotCW50c2NfY2FibGVbNzVdID0gNTI5MjUwOwotCW50c2NfY2FibGVbNzZdID0gNTM1MjUwOwotCW50c2NfY2FibGVbNzddID0gNTQxMjUwOwotCW50c2NfY2FibGVbNzhdID0gNTQ3MjUwOwotCW50c2NfY2FibGVbNzldID0gNTUzMjUwOwotCW50c2NfY2FibGVbODBdID0gNTU5MjUwOwotCW50c2NfY2FibGVbODFdID0gNTY1MjUwOwotCW50c2NfY2FibGVbODJdID0gNTcxMjUwOwotCW50c2NfY2FibGVbODNdID0gNTc3MjUwOwotCW50c2NfY2FibGVbODRdID0gNTgzMjUwOwotCW50c2NfY2FibGVbODVdID0gNTg5MjUwOwotCW50c2NfY2FibGVbODZdID0gNTk1MjUwOwotCW50c2NfY2FibGVbODddID0gNjAxMjUwOwotCW50c2NfY2FibGVbODhdID0gNjA3MjUwOwotCW50c2NfY2FibGVbODldID0gNjEzMjUwOwotCW50c2NfY2FibGVbOTBdID0gNjE5MjUwOwotCW50c2NfY2FibGVbOTFdID0gNjI1MjUwOwotCW50c2NfY2FibGVbOTJdID0gNjMxMjUwOwotCW50c2NfY2FibGVbOTNdID0gNjM3MjUwOwotCW50c2NfY2FibGVbOTRdID0gNjQzMjUwOwotCW50c2NfY2FibGVbOTVdID0gOTEyNTA7Ci0JbnRzY19jYWJsZVs5Nl0gPSA5NzI1MDsKLQludHNjX2NhYmxlWzk3XSA9IDEwMzI1MDsKLQludHNjX2NhYmxlWzk4XSA9IDEwOTI1MDsKLQludHNjX2NhYmxlWzk5XSA9IDExNTI1MDsKLQludHNjX2NhYmxlWzEwMF0gPSA2NDkyNTA7Ci0JbnRzY19jYWJsZVsxMDFdID0gNjU1MjUwOwotCW50c2NfY2FibGVbMTAyXSA9IDY2MTI1MDsKLQludHNjX2NhYmxlWzEwM10gPSA2NjcyNTA7Ci0JbnRzY19jYWJsZVsxMDRdID0gNjczMjUwOwotCW50c2NfY2FibGVbMTA1XSA9IDY3OTI1MDsKLQludHNjX2NhYmxlWzEwNl0gPSA2ODUyNTA7Ci0JbnRzY19jYWJsZVsxMDddID0gNjkxMjUwOwotCW50c2NfY2FibGVbMTA4XSA9IDY5NzI1MDsKLQludHNjX2NhYmxlWzEwOV0gPSA3MDMyNTA7Ci0JbnRzY19jYWJsZVsxMTBdID0gNzA5MjUwOwotCW50c2NfY2FibGVbMTExXSA9IDcxNTI1MDsKLQludHNjX2NhYmxlWzExMl0gPSA3MjEyNTA7Ci0JbnRzY19jYWJsZVsxMTNdID0gNzI3MjUwOwotCW50c2NfY2FibGVbMTE0XSA9IDczMzI1MDsKLQludHNjX2NhYmxlWzExNV0gPSA3MzkyNTA7Ci0JbnRzY19jYWJsZVsxMTZdID0gNzQ1MjUwOwotCW50c2NfY2FibGVbMTE3XSA9IDc1MTI1MDsKLQludHNjX2NhYmxlWzExOF0gPSA3NTcyNTA7Ci0JbnRzY19jYWJsZVsxMTldID0gNzYzMjUwOwotCW50c2NfY2FibGVbMTIwXSA9IDc2OTI1MDsKLQludHNjX2NhYmxlWzEyMV0gPSA3NzUyNTA7Ci0JbnRzY19jYWJsZVsxMjJdID0gNzgxMjUwOwotCW50c2NfY2FibGVbMTIzXSA9IDc4NzI1MDsKLQludHNjX2NhYmxlWzEyNF0gPSA3OTMyNTA7Ci0JbnRzY19jYWJsZVsxMjVdID0gNzk5MjUwOwotfQotCmRpZmYgLS1naXQgYS94MTF2bmMvdjRsLmggYi94MTF2bmMvdjRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWU3MjIuLjAwMDAwMDAKLS0tIGEveDExdm5jL3Y0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfVjRMX0gKLSNkZWZpbmUgX1gxMVZOQ19WNExfSAotCi0vKiAtLSB2NGwuaCAtLSAqLwotZXh0ZXJuIGNoYXIgKnY0bF9ndWVzcyhjaGFyICpzdHIsIGludCAqZmQpOwotZXh0ZXJuIHZvaWQgdjRsX2tleV9jb21tYW5kKHJmYkJvb2wgZG93biwgcmZiS2V5U3ltIGtleXN5bSwgcmZiQ2xpZW50UHRyIGNsaWVudCk7Ci1leHRlcm4gdm9pZCB2NGxfcG9pbnRlcl9jb21tYW5kKGludCBtYXNrLCBpbnQgeCwgaW50IHksIHJmYkNsaWVudFB0ciBjbGllbnQpOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX1Y0TF9IICovCmRpZmYgLS1naXQgYS94MTF2bmMvd2luX3V0aWxzLmMgYi94MTF2bmMvd2luX3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTliNGMuLjAwMDAwMDAKLS0tIGEveDExdm5jL3dpbl91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcxICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0gd2luX3V0aWxzLmMgLS0gKi8KLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgInhpbmVyYW1hLmgiCi0jaW5jbHVkZSAid2luYXR0cl90LmgiCi0jaW5jbHVkZSAiY2xlYW51cC5oIgotI2luY2x1ZGUgInh3cmFwcGVycy5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25zLmgiCi0jaW5jbHVkZSAieHJhbmRyLmgiCi0jaW5jbHVkZSAibWFjb3N4LmgiCi0KLXdpbmF0dHJfdCAqc3RhY2tfbGlzdCA9IE5VTEw7Ci1pbnQgc3RhY2tfbGlzdF9sZW4gPSAwOwotaW50IHN0YWNrX2xpc3RfbnVtID0gMDsKLQotCi1XaW5kb3cgcGFyZW50X3dpbmRvdyhXaW5kb3cgd2luLCBjaGFyICoqbmFtZSk7Ci1pbnQgdmFsaWRfd2luZG93KFdpbmRvdyB3aW4sIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyX3JldCwgaW50IGJlcXVpZXQpOwotQm9vbCB4dHJhbnNsYXRlKFdpbmRvdyBzcmMsIFdpbmRvdyBkc3QsIGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgKmRzdF94LAotICAgIGludCAqZHN0X3ksIFdpbmRvdyAqY2hpbGQsIGludCBiZXF1aWV0KTsKLWludCBnZXRfd2luZG93X3NpemUoV2luZG93IHdpbiwgaW50ICp3LCBpbnQgKmgpOwotdm9pZCBzbmFwc2hvdF9zdGFja19saXN0KGludCBmcmVlX29ubHksIGRvdWJsZSBhbGxvd2VkX2FnZSk7Ci1pbnQgZ2V0X2JvZmYodm9pZCk7Ci1pbnQgZ2V0X2J3aW4odm9pZCk7Ci12b2lkIHVwZGF0ZV9zdGFja19saXN0KHZvaWQpOwotV2luZG93IHF1ZXJ5X3BvaW50ZXIoV2luZG93IHN0YXJ0KTsKLXVuc2lnbmVkIGludCBtYXNrX3N0YXRlKHZvaWQpOwotaW50IHBpY2tfd2luZG93aWQodW5zaWduZWQgbG9uZyAqbnVtKTsKLVdpbmRvdyBkZXNjZW5kX3BvaW50ZXIoaW50IGRlcHRoLCBXaW5kb3cgc3RhcnQsIGNoYXIgKm5hbWVfaW5mbywgaW50IGxlbik7Ci12b2lkIGlkX2NtZChjaGFyICpjbWQpOwotCi0KLVdpbmRvdyBwYXJlbnRfd2luZG93KFdpbmRvdyB3aW4sIGNoYXIgKipuYW1lKSB7Ci0jaWYgIU5PX1gxMQotCVdpbmRvdyByLCBwYXJlbnQ7Ci0JV2luZG93ICpsaXN0OwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7Ci0JdW5zaWduZWQgaW50IG5jaGlsZDsKLQlpbnQgcmM7Ci0jZW5kaWYKLQotCWlmIChuYW1lICE9IE5VTEwpIHsKLQkJKm5hbWUgPSBOVUxMOwotCX0KLQlSQVdGQl9SRVQoTm9uZSkKLSNpZiBOT19YMTEKLQlub3gxMV9leGl0KDEpOwotCWlmICghbmFtZSB8fCAhd2luKSB7fQotCXJldHVybiBOb25lOwotI2Vsc2UKLQotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCXJjID0gWFF1ZXJ5VHJlZV93cihkcHksIHdpbiwgJnIsICZwYXJlbnQsICZsaXN0LCAmbmNoaWxkKTsKLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQotCWlmICghIHJjIHx8IHRyYXBwZWRfeGVycm9yKSB7Ci0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJcmV0dXJuIE5vbmU7Ci0JfQotCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCWlmIChsaXN0KSB7Ci0JCVhGcmVlX3dyKGxpc3QpOwotCX0KLQlpZiAocGFyZW50ICYmIG5hbWUpIHsKLQkJWEZldGNoTmFtZShkcHksIHBhcmVudCwgbmFtZSk7Ci0JfQotCXJldHVybiBwYXJlbnQ7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qIHRyYXBwaW5nIHV0aWxpdHkgdG8gY2hlY2sgZm9yIGEgdmFsaWQgd2luZG93OiAqLwotaW50IHZhbGlkX3dpbmRvdyhXaW5kb3cgd2luLCBYV2luZG93QXR0cmlidXRlcyAqYXR0cl9yZXQsIGludCBiZXF1aWV0KSB7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0ciwgKnBhdHRyOwotI2lmICFOT19YMTEKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCWludCBvayA9IDA7Ci0jZW5kaWYKLQotCWlmIChhdHRyX3JldCA9PSBOVUxMKSB7Ci0JCXBhdHRyID0gJmF0dHI7Ci0JfSBlbHNlIHsKLQkJcGF0dHIgPSBhdHRyX3JldDsKLQl9Ci0KLQlpZiAod2luID09IE5vbmUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCXJldHVybiBtYWNvc3hfdmFsaWRfd2luZG93KHdpbiwgYXR0cl9yZXQpOwotCX0KLSNlbmRpZgotCi0JUkFXRkJfUkVUKDApCi0KLSNpZiBOT19YMTEKLQlub3gxMV9leGl0KDEpOwotCWlmICghd2luIHx8ICFhdHRyX3JldCB8fCAhYmVxdWlldCkge30KLQlyZXR1cm4gMDsKLSNlbHNlCi0KLQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQlpZiAoWEdldFdpbmRvd0F0dHJpYnV0ZXMoZHB5LCB3aW4sIHBhdHRyKSkgewotCQlvayA9IDE7Ci0JfQotCWlmICh0cmFwcGVkX3hlcnJvciAmJiB0cmFwcGVkX3hlcnJvcl9ldmVudCkgewotCQlpZiAoISBxdWlldCAmJiAhIGJlcXVpZXQpIHsKLQkJCXJmYkxvZygidmFsaWRfd2luZG93OiB0cmFwcGVkIFhFcnJvcjogJXMgKDB4JWx4KVxuIiwKLQkJCSAgICB4ZXJyb3Jfc3RyaW5nKHRyYXBwZWRfeGVycm9yX2V2ZW50KSwgd2luKTsKLQkJfQotCQlvayA9IDA7Ci0JfQotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQkKLQlyZXR1cm4gb2s7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLUJvb2wgeHRyYW5zbGF0ZShXaW5kb3cgc3JjLCBXaW5kb3cgZHN0LCBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50ICpkc3RfeCwKLSAgICBpbnQgKmRzdF95LCBXaW5kb3cgKmNoaWxkLCBpbnQgYmVxdWlldCkgewotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCUJvb2wgb2sgPSBGYWxzZTsKLQotCVJBV0ZCX1JFVChGYWxzZSkKLSNpZiBOT19YMTEKLQlub3gxMV9leGl0KDEpOwotCWlmICghc3JjIHx8ICFkc3QgfHwgIXNyY194IHx8ICFzcmNfeSB8fCAhZHN0X3ggfHwgIWRzdF95IHx8ICFjaGlsZCB8fCAhYmVxdWlldCkge30KLQlpZiAoIW9sZF9oYW5kbGVyIHx8ICFvaykge30KLQlyZXR1cm4gRmFsc2U7Ci0jZWxzZQotCi0JdHJhcHBlZF94ZXJyb3IgPSAwOwotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3hlcnJvcik7Ci0JaWYgKFhUcmFuc2xhdGVDb29yZGluYXRlcyhkcHksIHNyYywgZHN0LCBzcmNfeCwgc3JjX3ksIGRzdF94LAotCSAgICBkc3RfeSwgY2hpbGQpKSB7Ci0JCW9rID0gVHJ1ZTsKLQl9Ci0JaWYgKHRyYXBwZWRfeGVycm9yICYmIHRyYXBwZWRfeGVycm9yX2V2ZW50KSB7Ci0JCWlmICghIHF1aWV0ICYmICEgYmVxdWlldCkgewotCQkJcmZiTG9nKCJ4dHJhbnNsYXRlOiB0cmFwcGVkIFhFcnJvcjogJXMgKDB4JWx4KVxuIiwKLQkJCSAgICB4ZXJyb3Jfc3RyaW5nKHRyYXBwZWRfeGVycm9yX2V2ZW50KSwgc3JjKTsKLQkJfQotCQlvayA9IEZhbHNlOwotCX0KLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCi0JcmV0dXJuIG9rOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1pbnQgZ2V0X3dpbmRvd19zaXplKFdpbmRvdyB3aW4sIGludCAqdywgaW50ICpoKSB7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQkvKiB2YWxpZF93aW5kb3c/ICovCi0JaWYgKHZhbGlkX3dpbmRvdyh3aW4sICZhdHRyLCAxKSkgewotCQkqdyA9IGF0dHIud2lkdGg7Ci0JCSpoID0gYXR0ci5oZWlnaHQ7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoKLSAqIEZvciB1c2UgaW4gdGhlIC13aXJlZnJhbWUgc3R1ZmYsIHNhdmUgdGhlIHN0YWNraW5nIG9yZGVyIG9mIHRoZSBkaXJlY3QKLSAqIGNoaWxkcmVuIG9mIHRoZSByb290IHdpbmRvdy4gIElkZWFsbHkgZG9uZSBiZWZvcmUgd2Ugc2VuZCBCdXR0b25QcmVzcwotICogdG8gdGhlIFggc2VydmVyLgotICovCi12b2lkIHNuYXBzaG90X3N0YWNrX2xpc3QoaW50IGZyZWVfb25seSwgZG91YmxlIGFsbG93ZWRfYWdlKSB7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3NuYXAgPSAwLjAsIGxhc3RfZnJlZSA9IDAuMDsKLQlkb3VibGUgbm93OyAKLQlpbnQgbnVtLCByYywgaSwgajsKLQl1bnNpZ25lZCBpbnQgdWk7Ci0JV2luZG93IHIsIHc7Ci0JV2luZG93ICpsaXN0OwotCi0JaWYgKCEgc3RhY2tfbGlzdCkgewotCQlzdGFja19saXN0ID0gKHdpbmF0dHJfdCAqKSBtYWxsb2MoMjU2KnNpemVvZih3aW5hdHRyX3QpKTsKLQkJc3RhY2tfbGlzdF9udW0gPSAwOwotCQlzdGFja19saXN0X2xlbiA9IDI1NjsKLQl9Ci0KLQlkdGltZTAoJm5vdyk7Ci0JaWYgKGZyZWVfb25seSkgewotCQkvKiB3ZSByZWFsbHkgZG9uJ3QgZnJlZSBpdCwganVzdCByZXNldCB0byB6ZXJvIHdpbmRvd3MgKi8KLQkJc3RhY2tfbGlzdF9udW0gPSAwOwotCQlsYXN0X2ZyZWUgPSBub3c7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc3RhY2tfbGlzdF9udW0gJiYgbm93IDwgbGFzdF9zbmFwICsgYWxsb3dlZF9hZ2UpIHsKLQkJcmV0dXJuOwotCX0KLQotCXN0YWNrX2xpc3RfbnVtID0gMDsKLQlsYXN0X2ZyZWUgPSBub3c7Ci0KLSNpZmRlZiBNQUNPU1gKLQlpZiAoISBtYWNvc3hfY29uc29sZSkgewotCQlSQVdGQl9SRVRfVk9JRAotCX0KLSNlbHNlCi0JUkFXRkJfUkVUX1ZPSUQKLSNlbmRpZgotCi0jaWYgTk9fWDExICYmICFkZWZpbmVkKE1BQ09TWCkKLQludW0gPSByYyA9IGkgPSBqID0gMDsJLyogY29tcGlsZXIgd2FybmluZ3MgKi8KLQl1aSA9IDA7Ci0JciA9IHcgPSBOb25lOwotCWxpc3QgPSBOVUxMOwotCXJldHVybjsKLSNlbHNlCi0KLQlYX0xPQ0s7Ci0JLyogbm8gbmVlZCB0byB0cmFwIGVycm9yIHNpbmNlIHJvb3R3aW4gKi8KLQlyYyA9IFhRdWVyeVRyZWVfd3IoZHB5LCByb290d2luLCAmciwgJncsICZsaXN0LCAmdWkpOwotCW51bSA9IChpbnQpIHVpOwotCi0JaWYgKCEgcmMpIHsKLQkJc3RhY2tfbGlzdF9udW0gPSAwOwotCQlsYXN0X2ZyZWUgPSBub3c7Ci0JCWxhc3Rfc25hcCA9IDAuMDsKLQkJWF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQlsYXN0X3NuYXAgPSBub3c7Ci0JaWYgKG51bSA+IHN0YWNrX2xpc3RfbGVuICsgYmxhY2tvdXRzKSB7Ci0JCWludCBuID0gMipudW07Ci0JCWZyZWUoc3RhY2tfbGlzdCk7Ci0JCXN0YWNrX2xpc3QgPSAod2luYXR0cl90ICopIG1hbGxvYyhuKnNpemVvZih3aW5hdHRyX3QpKTsKLQkJc3RhY2tfbGlzdF9sZW4gPSBuOwotCX0KLQlqID0gMDsKLQlmb3IgKGk9MDsgaTxudW07IGkrKykgewotCQlzdGFja19saXN0W2pdLndpbiA9IGxpc3RbaV07Ci0JCXN0YWNrX2xpc3Rbal0uZmV0Y2hlZCA9IDA7Ci0JCXN0YWNrX2xpc3Rbal0udmFsaWQgPSAwOwotCQlzdGFja19saXN0W2pdLnRpbWUgPSBub3c7Ci0JCWorKzsKLQl9Ci0JZm9yIChpPTA7IGk8YmxhY2tvdXRzOyBpKyspIHsKLQkJc3RhY2tfbGlzdFtqXS53aW4gPSBnZXRfYm9mZigpICsgMTsKLQkJc3RhY2tfbGlzdFtqXS5mZXRjaGVkID0gMTsKLQkJc3RhY2tfbGlzdFtqXS52YWxpZCA9IDE7Ci0JCXN0YWNrX2xpc3Rbal0ueCA9IGJsYWNrcltpXS54MTsKLQkJc3RhY2tfbGlzdFtqXS55ID0gYmxhY2tyW2ldLnkxOwotCQlzdGFja19saXN0W2pdLndpZHRoICA9IGJsYWNrcltpXS54MiAtIGJsYWNrcltpXS54MTsKLQkJc3RhY2tfbGlzdFtqXS5oZWlnaHQgPSBibGFja3JbaV0ueTIgLSBibGFja3JbaV0ueTE7Ci0JCXN0YWNrX2xpc3Rbal0udGltZSA9IG5vdzsKLQkJc3RhY2tfbGlzdFtqXS5tYXBfc3RhdGUgPSBJc1ZpZXdhYmxlOwotCQlzdGFja19saXN0W2pdLnJ4ID0gLTE7Ci0JCXN0YWNrX2xpc3Rbal0ucnkgPSAtMTsKLQkJaisrOwotCi1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJibGFja3I6ICVkICVkeCVkKyVkKyVkXG4iLCBpLAotCXN0YWNrX2xpc3Rbai0xXS53aWR0aCwgc3RhY2tfbGlzdFtqLTFdLmhlaWdodCwKLQlzdGFja19saXN0W2otMV0ueCwgc3RhY2tfbGlzdFtqLTFdLnkpOwotCi0JfQotCXN0YWNrX2xpc3RfbnVtID0gbnVtICsgYmxhY2tvdXRzOwotCWlmIChkZWJ1Z193aXJlZnJhbWUgPiAxKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAic25hcHNob3Rfc3RhY2tfbGlzdDogbnVtPSVkIGxlbj0lZFxuIiwKLQkJICAgIHN0YWNrX2xpc3RfbnVtLCBzdGFja19saXN0X2xlbik7Ci0JfQotCi0JWEZyZWVfd3IobGlzdCk7Ci0JWF9VTkxPQ0s7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLWludCBnZXRfYm9mZih2b2lkKSB7Ci0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCXJldHVybiAweDEwMDAwMDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7CQkKLQl9Ci19Ci0KLWludCBnZXRfYndpbih2b2lkKSB7Ci0JcmV0dXJuIDEwOwkJCi19Ci0KLXZvaWQgdXBkYXRlX3N0YWNrX2xpc3Qodm9pZCkgewotCWludCBrOwotCWRvdWJsZSBub3c7Ci0JWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLQlpbnQgYm9mZiwgYndpbjsKLQotCWlmICghIHN0YWNrX2xpc3QpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBzdGFja19saXN0X251bSkgewotCQlyZXR1cm47Ci0JfQotCi0JZHRpbWUwKCZub3cpOwotCi0JYm9mZiA9IGdldF9ib2ZmKCk7Ci0JYndpbiA9IGdldF9id2luKCk7Ci0JCi0JWF9MT0NLOwotCWZvciAoaz0wOyBrIDwgc3RhY2tfbGlzdF9udW07IGsrKykgewotCQlXaW5kb3cgd2luID0gc3RhY2tfbGlzdFtrXS53aW47Ci0JCWlmICh3aW4gIT0gTm9uZSAmJiBib2ZmIDw9IChpbnQpIHdpbiAmJiAoaW50KSB3aW4gPCBib2ZmICsgYndpbikgewotCQkJOwkvKiBzcGVjaWFsLCBibGFja291dCAqLwotCQl9IGVsc2UgaWYgKCF2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSkpIHsKLQkJCXN0YWNrX2xpc3Rba10udmFsaWQgPSAwOwotCQl9IGVsc2UgewotCQkJc3RhY2tfbGlzdFtrXS52YWxpZCA9IDE7Ci0JCQlzdGFja19saXN0W2tdLnggPSBhdHRyLng7Ci0JCQlzdGFja19saXN0W2tdLnkgPSBhdHRyLnk7Ci0JCQlzdGFja19saXN0W2tdLndpZHRoID0gYXR0ci53aWR0aDsKLQkJCXN0YWNrX2xpc3Rba10uaGVpZ2h0ID0gYXR0ci5oZWlnaHQ7Ci0JCQlzdGFja19saXN0W2tdLmJvcmRlcl93aWR0aCA9IGF0dHIuYm9yZGVyX3dpZHRoOwotCQkJc3RhY2tfbGlzdFtrXS5kZXB0aCA9IGF0dHIuZGVwdGg7Ci0JCQlzdGFja19saXN0W2tdLmNsYXNzID0gYXR0ci5jbGFzczsKLQkJCXN0YWNrX2xpc3Rba10uYmFja2luZ19zdG9yZSA9IGF0dHIuYmFja2luZ19zdG9yZTsKLQkJCXN0YWNrX2xpc3Rba10ubWFwX3N0YXRlID0gYXR0ci5tYXBfc3RhdGU7Ci0KLQkJCS8qIHJvb3RfeCwgcm9vdF95IG5vdCB1c2VkIGZvciBzdGFja19saXN0IHVzYWdlOiAqLwotCQkJc3RhY2tfbGlzdFtrXS5yeCA9IC0xOwotCQkJc3RhY2tfbGlzdFtrXS5yeSA9IC0xOwotCQl9Ci0JCXN0YWNrX2xpc3Rba10uZmV0Y2hlZCA9IDE7Ci0JCXN0YWNrX2xpc3Rba10udGltZSA9IG5vdzsKLQl9Ci0JWF9VTkxPQ0s7Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJ1cGRhdGVfc3RhY2tfbGlzdFslZF06ICUuNGYgICUuNGZcbiIsIHN0YWNrX2xpc3RfbnVtLCBub3cgLSB4MTF2bmNfc3RhcnQsIGR0aW1lKCZub3cpKTsKLX0KLQotV2luZG93IHF1ZXJ5X3BvaW50ZXIoV2luZG93IHN0YXJ0KSB7Ci0JaW50IHJ4LCByeTsKLSNpZiAhTk9fWDExCi0JV2luZG93IHIsIGM7CS8qIGNvbXBpbGVyIHdhcm5pbmdzICovCi0JaW50IHd4LCB3eTsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLSNlbmRpZgotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCW1hY29zeF9nZXRfY3Vyc29yX3BvcygmcngsICZyeSk7Ci0JfQotI2VuZGlmCi0KLQlSQVdGQl9SRVQoTm9uZSkKLQotI2lmIE5PX1gxMQotCWlmICghc3RhcnQpIHsgcnggPSByeSA9IDA7IH0KLQlyZXR1cm4gTm9uZTsKLSNlbHNlCi0JaWYgKHN0YXJ0ID09IE5vbmUpIHsKLQkJc3RhcnQgPSByb290d2luOwotCX0KLQlpZiAoWFF1ZXJ5UG9pbnRlcl93cihkcHksIHN0YXJ0LCAmciwgJmMsICZyeCwgJnJ5LCAmd3gsICZ3eSwgJm1hc2spKSB7Ci0JCXJldHVybiBjOwotCX0gZWxzZSB7Ci0JCXJldHVybiBOb25lOwotCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdW5zaWduZWQgaW50IG1hc2tfc3RhdGUodm9pZCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVCgwKQotCXJldHVybiAwOwotI2Vsc2UKLQlXaW5kb3cgciwgYzsJCi0JaW50IHJ4LCByeSwgd3gsIHd5OwotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAoWFF1ZXJ5UG9pbnRlcl93cihkcHksIHJvb3R3aW4sICZyLCAmYywgJnJ4LCAmcnksICZ3eCwgJnd5LCAmbWFzaykpIHsKLQkJcmV0dXJuIG1hc2s7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1pbnQgcGlja193aW5kb3dpZCh1bnNpZ25lZCBsb25nICpudW0pIHsKLQljaGFyIGxpbmVbNTEyXTsKLQlpbnQgb2sgPSAwLCBuID0gMCwgbXNlYyA9IDEwLCBzZWNtYXggPSAxNTsKLQlGSUxFICpwOwotCi0JUkFXRkJfUkVUKDApCi0KLQlpZiAodXNlX2RweSkgewotCQlzZXRfZW52KCJESVNQTEFZIiwgdXNlX2RweSk7Ci0JfQotCS8qIGlkICovCi0JaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygiaWQiKSkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsICJ4d2luaW5mbyIpOwotCQlyZmJMb2coIiAgIGV4aXRpbmcuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JY2xvc2VfZXhlY19mZHMoKTsKLQlwID0gcG9wZW4oInh3aW5pbmZvIiwgInIiKTsKLQotCWlmICghIHApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICBQbGVhc2Ugc2VsZWN0IHRoZSB3aW5kb3cgZm9yIHgxMXZuYyB0byBwb2xsXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgYnkgY2xpY2tpbmcgdGhlIG1vdXNlIGluIHRoYXQgd2luZG93LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCi0Jd2hpbGUgKG1zZWMgKiBuKysgPCAxMDAwICogc2VjbWF4KSB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQljaGFyICpxOwotCQlmZF9zZXQgc2V0OwotCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCQlpZiAoc2NyZWVuICYmIHNjcmVlbi0+Y2xpZW50SGVhZCkgewotCQkJLyogdGhleSBtYXkgYmUgZG9pbmcgdGhlIHBvaW50ZXItcGljayB0aHJ1IHZuYzogKi8KLQkJCWludCBuZmRzOwotCQkJdHYudHZfc2VjID0gMDsKLQkJCXR2LnR2X3VzZWMgPSBtc2VjICogMTAwMDsKLQkJCUZEX1pFUk8oJnNldCk7Ci0JCQlGRF9TRVQoZmlsZW5vKHApLCAmc2V0KTsKLQotCQkJbmZkcyA9IHNlbGVjdChmaWxlbm8ocCkrMSwgJnNldCwgTlVMTCwgTlVMTCwgJnR2KTsKLQkJCQotCQkJaWYgKG5mZHMgPT0gMCB8fCBuZmRzIDwgMCkgewotCQkJCS8qIAotCQkJCSAqIHNlbGVjdCB0aW1lZG91dCBvciBlcnJvci4KLQkJCQkgKiBub3RlIHRoaXMgcmZiUEUgdGFrZXMgYWJvdXQgMzBtcyB0b286Ci0JCQkJICovCi0JCQkJcmZiUEUoLTEpOwotCQkJCVhGbHVzaF93cihkcHkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZmdldHMobGluZSwgNTEyLCBwKSA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQotCQlxID0gc3Ryc3RyKGxpbmUsICIgaWQ6IDB4Iik7IAotCQlpZiAocSkgewotCQkJcSArPSA1OwotCQkJaWYgKHNzY2FuZihxLCAiMHglbHggIiwgJnRtcCkgPT0gMSkgewotCQkJCW9rID0gMTsKLQkJCQkqbnVtID0gdG1wOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICBQaWNrZWQ6IDB4JWx4XG5cbiIsIHRtcCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcGNsb3NlKHApOwotCXJldHVybiBvazsKLX0KLQotV2luZG93IGRlc2NlbmRfcG9pbnRlcihpbnQgZGVwdGgsIFdpbmRvdyBzdGFydCwgY2hhciAqbmFtZV9pbmZvLCBpbnQgbGVuKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUKE5vbmUpCi0JaWYgKCFkZXB0aCB8fCAhc3RhcnQgfHwgIW5hbWVfaW5mbyB8fCAhbGVuKSB7fQotCXJldHVybiBOb25lOwotI2Vsc2UKLQlXaW5kb3cgciwgYywgY2xhc3QgPSBOb25lOwotCWludCBpLCByeCwgcnksIHd4LCB3eTsKLQlpbnQgd3JpdHRlbiA9IDAsIGZpbGxlZCA9IDA7Ci0JY2hhciAqc3RvcmUgPSBOVUxMOwotCXVuc2lnbmVkIGludCBtOwotCXN0YXRpYyBYQ2xhc3NIaW50ICpjbGFzc2hpbnQgPSBOVUxMOwotCXN0YXRpYyBjaGFyICpubV9jYWNoZSA9IE5VTEw7Ci0Jc3RhdGljIGludCBubV9jYWNoZV9sZW4gPSAwOwotCXN0YXRpYyBXaW5kb3cgcHJldl9zdGFydCA9IE5vbmU7Ci0KLQlSQVdGQl9SRVQoTm9uZSkKLQotCWlmICghIGNsYXNzaGludCkgewotCQljbGFzc2hpbnQgPSBYQWxsb2NDbGFzc0hpbnQoKTsKLQl9Ci0KLQlpZiAoISBubV9jYWNoZSkgewotCQlubV9jYWNoZSA9IChjaGFyICopIG1hbGxvYygxMDI0KTsKLQkJbm1fY2FjaGVfbGVuID0gMTAyNDsKLQkJbm1fY2FjaGVbMF0gPSAnXDAnOwotCX0KLQlpZiAobmFtZV9pbmZvICYmIG5tX2NhY2hlX2xlbiA8IGxlbikgewotCQlpZiAobm1fY2FjaGUpIHsKLQkJCWZyZWUobm1fY2FjaGUpOwotCQl9Ci0JCW5tX2NhY2hlX2xlbiA9IDIqbGVuOwotCQlubV9jYWNoZSA9IChjaGFyICopIG1hbGxvYyhubV9jYWNoZV9sZW4pOwotCX0KLQotCWlmIChuYW1lX2luZm8pIHsKLQkJaWYgKHN0YXJ0ICE9IE5vbmUgJiYgc3RhcnQgPT0gcHJldl9zdGFydCkgewotCQkJc3RvcmUgPSBOVUxMOwotCQkJc3RybmNweShuYW1lX2luZm8sIG5tX2NhY2hlLCBsZW4pOwotCQl9IGVsc2UgewotCQkJc3RvcmUgPSBuYW1lX2luZm87Ci0JCQluYW1lX2luZm9bMF0gPSAnXDAnOwotCQl9Ci0JfQotCi0JaWYgKHN0YXJ0ICE9IE5vbmUpIHsKLQkJYyA9IHN0YXJ0OwotCQlpZiAobmFtZV9pbmZvKSB7Ci0JCQlwcmV2X3N0YXJ0ID0gc3RhcnQ7Ci0JCX0KLQl9IGVsc2UgewotCQljID0gcm9vdHdpbjsJCi0JfQotCi0JZm9yIChpPTA7IGk8ZGVwdGg7IGkrKykgewotCQljbGFzdCA9IGM7Ci0JCWlmIChzdG9yZSAmJiAhIGZpbGxlZCkgewotCQkJY2hhciAqbmFtZTsKLQkJCWlmIChYRmV0Y2hOYW1lKGRweSwgY2xhc3QsICZuYW1lKSAmJiBuYW1lICE9IE5VTEwpIHsKLQkJCQlpbnQgbCA9IHN0cmxlbihuYW1lKTsKLQkJCQlpZiAod3JpdHRlbiArIGwrMiA8IGxlbikgewotCQkJCQlzdHJjYXQoc3RvcmUsICJeXiIpOwotCQkJCQl3cml0dGVuICs9IDI7Ci0JCQkJCXN0cmNhdChzdG9yZSwgbmFtZSk7Ci0JCQkJCXdyaXR0ZW4gKz0gbDsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWxsZWQgPSAxOwotCQkJCX0KLQkJCQlYRnJlZV93cihuYW1lKTsKLQkJCX0KLQkJfQotCQlpZiAoc3RvcmUgJiYgY2xhc3NoaW50ICYmICEgZmlsbGVkKSB7Ci0JCQljbGFzc2hpbnQtPnJlc19uYW1lID0gTlVMTDsKLQkJCWNsYXNzaGludC0+cmVzX2NsYXNzID0gTlVMTDsKLQkJCWlmIChYR2V0Q2xhc3NIaW50KGRweSwgY2xhc3QsIGNsYXNzaGludCkpIHsKLQkJCQlpbnQgbCA9IDA7Ci0JCQkJaWYgKGNsYXNzaGludC0+cmVzX2NsYXNzKSB7Ci0JCQkJCWwgKz0gc3RybGVuKGNsYXNzaGludC0+cmVzX2NsYXNzKTsgCi0JCQkJfQotCQkJCWlmIChjbGFzc2hpbnQtPnJlc19uYW1lKSB7Ci0JCQkJCWwgKz0gc3RybGVuKGNsYXNzaGludC0+cmVzX25hbWUpOyAKLQkJCQl9Ci0JCQkJaWYgKHdyaXR0ZW4gKyBsKzQgPCBsZW4pIHsKLQkJCQkJc3RyY2F0KHN0b3JlLCAiIyMiKTsKLQkJCQkJaWYgKGNsYXNzaGludC0+cmVzX2NsYXNzKSB7Ci0JCQkJCQlzdHJjYXQoc3RvcmUsCi0JCQkJCQkgICAgY2xhc3NoaW50LT5yZXNfY2xhc3MpOwotCQkJCQl9Ci0JCQkJCXN0cmNhdChzdG9yZSwgIisrIik7Ci0JCQkJCWlmIChjbGFzc2hpbnQtPnJlc19uYW1lKSB7Ci0JCQkJCQlzdHJjYXQoc3RvcmUsCi0JCQkJCQkgICAgY2xhc3NoaW50LT5yZXNfbmFtZSk7Ci0JCQkJCX0KLQkJCQkJd3JpdHRlbiArPSBsKzQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmlsbGVkID0gMTsKLQkJCQl9Ci0JCQkJaWYgKGNsYXNzaGludC0+cmVzX2NsYXNzKSB7Ci0JCQkJCVhGcmVlX3dyKGNsYXNzaGludC0+cmVzX2NsYXNzKTsKLQkJCQl9Ci0JCQkJaWYgKGNsYXNzaGludC0+cmVzX25hbWUpIHsKLQkJCQkJWEZyZWVfd3IoY2xhc3NoaW50LT5yZXNfbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghIFhRdWVyeVBvaW50ZXJfd3IoZHB5LCBjLCAmciwgJmMsICZyeCwgJnJ5LCAmd3gsICZ3eSwgJm0pKSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoISBjKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoc3RhcnQgIT0gTm9uZSAmJiBuYW1lX2luZm8pIHsKLQkJc3RybmNweShubV9jYWNoZSwgbmFtZV9pbmZvLCBubV9jYWNoZV9sZW4pOwotCX0KLQotCXJldHVybiBjbGFzdDsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBpZF9jbWQoY2hhciAqY21kKSB7Ci0JaW50IHJjLCBkeCA9IDAsIGR5ID0gMCwgZHcgPSAwLCBkaCA9IDA7Ci0JaW50IHgwLCB5MCwgdzAsIGgwOwotCWludCB4LCB5LCB3LCBoLCBkb19tb3ZlID0gMCwgZG9fcmVzaXplID0gMDsKLQlpbnQgZGlzcF94ID0gRGlzcGxheVdpZHRoKGRweSwgc2NyKTsKLQlpbnQgZGlzcF95ID0gRGlzcGxheUhlaWdodChkcHksIHNjcik7Ci0JV2luZG93IHdpbiA9IHN1YndpbjsKLQlYV2luZG93QXR0cmlidXRlcyBhdHRyOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCVdpbmRvdyB0d2luOwotCi0JaWYgKCFjbWQgfHwgIXN0cmNtcChjbWQsICIiKSkgeyAKLQkJcmV0dXJuOwotCX0KLQlpZiAoc3Ryc3RyKGNtZCwgIndpbj0iKSA9PSBjbWQpIHsKLQkJaWYgKCEgc2Nhbl9oZXhkZWMoY21kICsgc3RybGVuKCJ3aW49IiksICZ3aW4pKSB7Ci0JCQlyZmJMb2coImlkX2NtZDogaW5jb3JyZWN0IHdpbj0gaGV4L2RlYyBudW1iZXI6ICVzXG4iLCBjbWQpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJY2hhciAqcSA9IHN0cmNocihjbWQsICc6Jyk7Ci0JCQlpZiAoIXEpIHsKLQkJCQlyZmJMb2coImlkX2NtZDogaW5jb3JyZWN0IHdpbj0uLi46IGhleC9kZWMgbnVtYmVyOiAlc1xuIiwgY21kKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlyZmJMb2coImlkX2NtZDolcyBzZXQgd2luZG93IGlkIHRvIDB4JWx4XG4iLCBjbWQsIHdpbik7Ci0JCQljbWQgPSBxKzE7Ci0JCX0KLQl9Ci0JaWYgKCF3aW4pIHsKLQkJcmZiTG9nKCJpZF9jbWQ6JXMgbm90IGluIHN1Yi13aW5kb3cgbW9kZSBvciBubyB3aW49MHhOTk5OLlxuIiwgY21kKTsKLQkJcmV0dXJuOwotCX0KLSNpZiAhTk9fWDExCi0JWF9MT0NLOwotCWlmICghdmFsaWRfd2luZG93KHdpbiwgJmF0dHIsIDEpKSB7Ci0JCVhfVU5MT0NLOwotCQlyZXR1cm47Ci0JfQotCXcwID0gdyA9IGF0dHIud2lkdGg7Ci0JaDAgPSBoID0gYXR0ci5oZWlnaHQ7Ci0Jb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JWFRyYW5zbGF0ZUNvb3JkaW5hdGVzKGRweSwgd2luLCByb290d2luLCAwLCAwLCAmeCwgJnksICZ0d2luKTsKLQl4MCA9IHg7Ci0JeTAgPSB5OwotCWlmIChzdHJzdHIoY21kLCAibW92ZToiKSA9PSBjbWQpIHsKLQkJaWYgKHNzY2FuZihjbWQsICJtb3ZlOiVkJWQiLCAmZHgsICZkeSkgPT0gMikgewotCQkJeCA9IHggKyBkeDsKLQkJCXkgPSB5ICsgZHk7Ci0JCQlkb19tb3ZlID0gMTsKLQkJfQotCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgInJlc2l6ZToiKSA9PSBjbWQpIHsKLQkJaWYgKHNzY2FuZihjbWQsICJyZXNpemU6JWQlZCIsICZkdywgJmRoKSA9PSAyKSB7Ci0JCQl3ID0gdyArIGR3OwotCQkJaCA9IGggKyBkaDsKLQkJCWRvX21vdmUgPSAxOwotCQkJZG9fcmVzaXplID0gMTsKLQkJfQotCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImdlb206IikgPT0gY21kKSB7Ci0JCWlmIChwYXJzZV9nZW9tKGNtZCtzdHJsZW4oImdlb206IiksICZ3LCAmaCwgJngsICZ5LCBkaXNwX3gsIGRpc3BfeSkpIHsKLQkJCWRvX21vdmUgPSAxOwotCQkJZG9fcmVzaXplID0gMTsKLQkJCWlmICh3IDw9IDApIHsKLQkJCQl3ID0gdzA7Ci0JCQl9Ci0JCQlpZiAoaCA8PSAwKSB7Ci0JCQkJaCA9IGgwOwotCQkJfQotCQkJaWYgKHNjYWxpbmcgJiYgZ2V0ZW52KCJYMTFWTkNfQVBQU0hBUkVfQUNUSVZFIikpIHsKLQkJCQl4IC89IHNjYWxlX2ZhY194OwotCQkJCXkgLz0gc2NhbGVfZmFjX3k7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicmFpc2UiKSkgewotCQlyYyA9IFhSYWlzZVdpbmRvdyhkcHksIHdpbik7Ci0JCXJmYkxvZygiaWRfY21kOiVzIHJjPSVkXG4iLCBjbWQsIHJjKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAibG93ZXIiKSkgewotCQlyYyA9IFhMb3dlcldpbmRvdyhkcHksIHdpbik7Ci0JCXJmYkxvZygiaWRfY21kOiVzIHJjPSVkXG4iLCBjbWQsIHJjKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAibWFwIikpIHsKLQkJcmM9IFhNYXBSYWlzZWQoZHB5LCB3aW4pOwotCQlyZmJMb2coImlkX2NtZDolcyByYz0lZFxuIiwgY21kLCByYyk7Ci0JfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInVubWFwIikpIHsKLQkJcmM9IFhVbm1hcFdpbmRvdyhkcHksIHdpbik7Ci0JCXJmYkxvZygiaWRfY21kOiVzIHJjPSVkXG4iLCBjbWQsIHJjKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiaWNvbmlmeSIpKSB7Ci0JCXJjPSBYSWNvbmlmeVdpbmRvdyhkcHksIHdpbiwgc2NyKTsKLQkJcmZiTG9nKCJpZF9jbWQ6JXMgcmM9JWRcbiIsIGNtZCwgcmMpOwotCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIndtX25hbWU6IikgPT0gY21kKSB7Ci0JCXJjPSBYU3RvcmVOYW1lKGRweSwgd2luLCBjbWQrc3RybGVuKCJ3bV9uYW1lOiIpKTsKLQkJcmZiTG9nKCJpZF9jbWQ6JXMgcmM9JWRcbiIsIGNtZCwgcmMpOwotCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImljb25fbmFtZToiKSA9PSBjbWQpIHsKLQkJcmM9IFhTZXRJY29uTmFtZShkcHksIHdpbiwgY21kK3N0cmxlbigiaWNvbl9uYW1lOiIpKTsKLQkJcmZiTG9nKCJpZF9jbWQ6JXMgcmM9JWRcbiIsIGNtZCwgcmMpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJ3bV9kZWxldGUiKSkgewotCQlYQ2xpZW50TWVzc2FnZUV2ZW50IGV2OwotCQltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKLQkJZXYudHlwZSA9IENsaWVudE1lc3NhZ2U7Ci0JCWV2LnNlbmRfZXZlbnQgPSBUcnVlOwotCQlldi5kaXNwbGF5ID0gZHB5OwotCQlldi53aW5kb3cgPSB3aW47Ci0JCWV2Lm1lc3NhZ2VfdHlwZSA9IFhJbnRlcm5BdG9tKGRweSwgIldNX1BST1RPQ09MUyIsIEZhbHNlKTsKLQkJZXYuZm9ybWF0ID0gMzI7Ci0JCWV2LmRhdGEubFswXSA9IFhJbnRlcm5BdG9tKGRweSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7Ci0JCXJjID0gWFNlbmRFdmVudChkcHksIHdpbiwgRmFsc2UsIDAsIChYRXZlbnQgKikgJmV2KTsKLQkJcmZiTG9nKCJpZF9jbWQ6JXMgcmM9JWRcbiIsIGNtZCwgcmMpOwotCX0gZWxzZSB7Ci0JCXJmYkxvZygiaWRfY21kOiVzIHVucmVjb2duaXplZCBjb21tYW5kLlxuIiwgY21kKTsKLQl9Ci0JaWYgKGRvX21vdmUgfHwgZG9fcmVzaXplKSB7Ci0JCWlmICh3ID49IGRpc3BfeCkgewotCQkJdyA9IGRpc3BfeCAtIDQ7Ci0JCX0KLQkJaWYgKGggPj0gZGlzcF95KSB7Ci0JCQloID0gZGlzcF95IC0gNDsKLQkJfQotCQlpZiAodyA8IDEpIHsKLQkJCXcgPSAxOwotCQl9Ci0JCWlmIChoIDwgMSkgewotCQkJaCA9IDE7Ci0JCX0KLQkJaWYgKHggKyB3ID4gZGlzcF94KSB7Ci0JCQl4ID0gZGlzcF94IC0gdyAtIDE7Ci0JCX0KLQkJaWYgKHkgKyBoID4gZGlzcF95KSB7Ci0JCQl5ID0gZGlzcF95IC0gaCAtIDE7Ci0JCX0KLQkJaWYgKHggPCAwKSB7Ci0JCQl4ID0gMTsKLQkJfQotCQlpZiAoeSA8IDApIHsKLQkJCXkgPSAxOwotCQl9Ci0JCXJjID0gMDsKLQkJcmMgKz0gWE1vdmVXaW5kb3coZHB5LCB3aW4sIHgsIHkpOwotCQlvZmZfeCA9IHg7Ci0JCW9mZl95ID0geTsKLQotCQlyYyArPSBYUmVzaXplV2luZG93KGRweSwgd2luLCB3LCBoKTsKLQotCQlyZmJMb2coImlkX2NtZDolcyByYz0lZCBkeD0lZCBkeT0lZCBkdz0lZCBkaD0lZCAlZHglZCslZCslZCAtPiAlZHglZCslZCslZFxuIiwKLQkJICAgIGNtZCwgcmMsIGR4LCBkeSwgZHcsIGRoLCB3MCwgaDAsIHgwLCB5MCwgdywgaCwgeCwgaCk7Ci0JfQotCVhTeW5jKGRweSwgRmFsc2UpOwotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCWlmICh0cmFwcGVkX3hlcnJvcikgewotCQlyZmJMb2coImlkX2NtZDolcyB0cmFwcGVkX3hlcnJvci5cbiIsIGNtZCk7Ci0JfQotCXRyYXBwZWRfeGVycm9yID0gMDsKLQlpZiAoZG9fcmVzaXplKSB7Ci0JCXJmYkxvZygiaWRfY21kOiVzIGNhbGxpbmcgY2hlY2tfeHJhbmRyX2V2ZW50LlxuIiwgY21kKTsKLQkJY2hlY2tfeHJhbmRyX2V2ZW50KCJpZF9jbWQiKTsKLQl9Ci0JWF9VTkxPQ0s7Ci0jZW5kaWYKLX0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3dpbl91dGlscy5oIGIveDExdm5jL3dpbl91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjk5MTY1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy93aW5fdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1dJTl9VVElMU19ICi0jZGVmaW5lIF9YMTFWTkNfV0lOX1VUSUxTX0gKLQotLyogLS0gd2luX3V0aWxzLmggLS0gKi8KLSNpbmNsdWRlICJ4aW5lcmFtYS5oIgotI2luY2x1ZGUgIndpbmF0dHJfdC5oIgotCi1leHRlcm4gd2luYXR0cl90ICpzdGFja19saXN0OwotZXh0ZXJuIGludCBzdGFja19saXN0X2xlbjsKLWV4dGVybiBpbnQgc3RhY2tfbGlzdF9udW07Ci0KLWV4dGVybiBXaW5kb3cgcGFyZW50X3dpbmRvdyhXaW5kb3cgd2luLCBjaGFyICoqbmFtZSk7Ci1leHRlcm4gaW50IHZhbGlkX3dpbmRvdyhXaW5kb3cgd2luLCBYV2luZG93QXR0cmlidXRlcyAqYXR0cl9yZXQsIGludCBiZXF1aWV0KTsKLWV4dGVybiBCb29sIHh0cmFuc2xhdGUoV2luZG93IHNyYywgV2luZG93IGRzdCwgaW50IHNyY194LCBpbnQgc3JjX3ksIGludCAqZHN0X3gsCi0gICAgaW50ICpkc3RfeSwgV2luZG93ICpjaGlsZCwgaW50IGJlcXVpZXQpOwotZXh0ZXJuIGludCBnZXRfd2luZG93X3NpemUoV2luZG93IHdpbiwgaW50ICp3LCBpbnQgKmgpOwotZXh0ZXJuIHZvaWQgc25hcHNob3Rfc3RhY2tfbGlzdChpbnQgZnJlZV9vbmx5LCBkb3VibGUgYWxsb3dlZF9hZ2UpOwotZXh0ZXJuIGludCBnZXRfYm9mZih2b2lkKTsKLWV4dGVybiBpbnQgZ2V0X2J3aW4odm9pZCk7Ci1leHRlcm4gdm9pZCB1cGRhdGVfc3RhY2tfbGlzdCh2b2lkKTsKLWV4dGVybiBXaW5kb3cgcXVlcnlfcG9pbnRlcihXaW5kb3cgc3RhcnQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBtYXNrX3N0YXRlKHZvaWQpOwotZXh0ZXJuIGludCBwaWNrX3dpbmRvd2lkKHVuc2lnbmVkIGxvbmcgKm51bSk7Ci1leHRlcm4gV2luZG93IGRlc2NlbmRfcG9pbnRlcihpbnQgZGVwdGgsIFdpbmRvdyBzdGFydCwgY2hhciAqbmFtZV9pbmZvLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIGlkX2NtZChjaGFyICpjbWQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19XSU5fVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEveDExdm5jL3dpbmF0dHJfdC5oIGIveDExdm5jL3dpbmF0dHJfdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGVhODFiLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy93aW5hdHRyX3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1dJTkFUVFJfVF9ICi0jZGVmaW5lIF9YMTFWTkNfV0lOQVRUUl9UX0gKLQotLyogLS0gd2luYXR0cl90LmggLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgd2luYXR0ciB7Ci0JV2luZG93IHdpbjsKLQlpbnQgZmV0Y2hlZDsKLQlpbnQgdmFsaWQ7Ci0JaW50IHgsIHk7Ci0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JaW50IGJvcmRlcl93aWR0aDsKLQlpbnQgZGVwdGg7Ci0JaW50IGNsYXNzOwotCWludCBiYWNraW5nX3N0b3JlOwotCWludCBtYXBfc3RhdGU7Ci0JaW50IHJ4LCByeTsKLQlkb3VibGUgdGltZTsgCi0JZG91YmxlIGJzX3RpbWU7Ci0JZG91YmxlIHN1X3RpbWU7Ci0JZG91YmxlIHZpc19vYnNfdGltZTsKLQlkb3VibGUgdmlzX3Vub2JzX3RpbWU7Ci0JaW50IGJzX3gsIGJzX3ksIGJzX3csIGJzX2g7Ci0JaW50IHN1X3gsIHN1X3ksIHN1X3csIHN1X2g7Ci0JV2luZG93IGFib3ZlOwotCXNob3J0IHZpc19zdGF0ZTsKLQlzaG9ydCBzZWxlY3RpbnB1dDsKLQlzaG9ydCBtYXBfY250OwotCXNob3J0IHVubWFwX2NudDsKLQlzaG9ydCB2aXNfY250OwotCXNob3J0IGNyZWF0ZV9jbnQ7Ci19IHdpbmF0dHJfdDsKLQotI2VuZGlmIC8qIF9YMTFWTkNfV0lOQVRUUl9UX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy94MTF2bmMuMSBiL3gxMXZuYy94MTF2bmMuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkZDBhMi4uMDAwMDAwMAotLS0gYS94MTF2bmMveDExdm5jLjEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYyICswLDAgQEAKLS5cIiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20geDExdm5jIC1oZWxwIG91dHB1dC4KLS5USCBYMTFWTkMgIjEiICJEZWNlbWJlciAyMDEwIiAieDExdm5jICIgIlVzZXIgQ29tbWFuZHMiCi0uU0ggTkFNRQoteDExdm5jIC0gYWxsb3cgVk5DIGNvbm5lY3Rpb25zIHRvIHJlYWwgWDExIGRpc3BsYXlzCi0gICAgICAgICB2ZXJzaW9uOiAwLjkuMTMsIGxhc3Rtb2Q6IDIwMTAtMTItMjcKLS5TSCBTWU5PUFNJUwotLkIgeDExdm5jCi1bT1BUSU9OXS4uLgotLlNIIERFU0NSSVBUSU9OCi0uUFAKLVR5cGljYWwgdXNhZ2UgaXM6Ci0uSVAKLVJ1biB0aGlzIGNvbW1hbmQgaW4gYSBzaGVsbCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgImZhci1ob3N0Igotd2l0aCBYIHNlc3Npb24geW91IHdpc2ggdG8gdmlldzoKLS5JUAoteDExdm5jIC1kaXNwbGF5IDowCi0uSVAKLVRoZW4gcnVuIHRoaXMgaW4gYW5vdGhlciB3aW5kb3cgb24gdGhlIG1hY2hpbmUgeW91IGFyZSBzaXR0aW5nIGF0OgotLklQCi12bmN2aWV3ZXIgZmFyLWhvc3Q6MAotLlBQCi1PbmNlIHgxMXZuYyBlc3RhYmxpc2hlcyBjb25uZWN0aW9ucyB3aXRoIHRoZSBYMTEgc2VydmVyIGFuZCBzdGFydHMgbGlzdGVuaW5nCi1hcyBhIFZOQyBzZXJ2ZXIgaXQgd2lsbCBwcmludCBvdXQgYSBzdHJpbmc6IFBPUlQ9WFhYWCB3aGVyZSBYWFhYIGlzIHR5cGljYWxseQotNTkwMCAodGhlIGRlZmF1bHQgVk5DIHNlcnZlciBwb3J0KS4gIE9uZSB3b3VsZCBuZXh0IHJ1biBzb21ldGhpbmcgbGlrZQotdGhpcyBvbiB0aGUgbG9jYWwgbWFjaGluZTogInZuY3ZpZXdlciBob3N0bmFtZTpOIiB3aGVyZSAiaG9zdG5hbWUiIGlzCi10aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHgxMXZuYyBhbmQgTiBpcyBYWFhYIC0gNTkwMCwgaS5lLiB1c3VhbGx5Ci0idm5jdmlld2VyIGhvc3RuYW1lOjAiLgotLlBQCi1CeSBkZWZhdWx0IHgxMXZuYyB3aWxsIG5vdCBhbGxvdyB0aGUgc2NyZWVuIHRvIGJlIHNoYXJlZCBhbmQgaXQgd2lsbCBleGl0Ci1hcyBzb29uIGFzIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuICBTZWUgXGZCLXNoYXJlZFxmUiBhbmQgXGZCLWZvcmV2ZXJcZlIgYmVsb3cgdG8gb3ZlcnJpZGUKLXRoZXNlIHByb3RlY3Rpb25zLiAgU2VlIHRoZSBGQVEgZm9yIGRldGFpbHMgaG93IHRvIHR1bm5lbCB0aGUgVk5DIGNvbm5lY3Rpb24KLXRocm91Z2ggYW4gZW5jcnlwdGVkIGNoYW5uZWwgc3VjaCBhcyAKLS5JUiBzc2ggKDEpLgotSW4gYnJpZWY6Ci0uSVAKLXNzaCBcZkItdFxmUiBcZkItTFxmUiA1OTAwOmxvY2FsaG9zdDo1OTAwIGZhci1ob3N0ICd4MTF2bmMgXGZCLWxvY2FsaG9zdFxmUiBcZkItZGlzcGxheVxmUiA6MCcKLS5QUAotJSB2bmN2aWV3ZXIgLWVuY29kaW5ncyAnY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlJyBsb2NhbGhvc3Q6MAotLlBQCi1BbHNvLCB1c2Ugb2YgYSBWTkMgcGFzc3dvcmQgKC1yZmJhdXRoIG9yIFxmQi1wYXNzd2RmaWxlKVxmUiBpcyBzdHJvbmdseSByZWNvbW1lbmRlZC4KLS5QUAotRm9yIGFkZGl0aW9uYWwgaW5mbyBzZWU6IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvCi1hbmQgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwKLS5QUAotQ29uZmlnIGZpbGUgc3VwcG9ydDogaWYgdGhlIGZpbGUgJEhPTUUvLngxMXZuY3JjIGV4aXN0cyB0aGVuIGVhY2ggbGluZSBpbgotaXQgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tYW5kIGxpbmUgb3B0aW9uLiAgRGlzYWJsZSB3aXRoIFxmQi1ub3JjLlxmUiAgRm9yCi1lYWNoIG9wdGlvbiBuYW1lLCB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgIi0iIGlzIG5vdCByZXF1aXJlZC4gIEUuZy4gYSBsaW5lCi10aGF0IGlzIGVpdGhlciAiZm9yZXZlciIgb3IgIlxmQi1mb3JldmVyXGZSIiBtYXkgYmUgdXNlZCBhbmQgYXJlIGVxdWl2YWxlbnQuCi1MaWtld2lzZSAid2FpdCAxMDAiIG9yICJcZkItd2FpdFxmUiBcZkkxMDBcZlIiIGFyZSBhY2NlcHRhYmxlIGFuZCBlcXVpdmFsZW50IGxpbmVzLgotVGhlICIjIiBjaGFyYWN0ZXIgY29tbWVudHMgb3V0IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgaW4gdGhlIHVzdWFsIHdheQotKGJhY2tzbGFzaCBpdCBmb3IgYSBsaXRlcmFsKS4gIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgdHJpbW1lZCBvZmYuCi1MaW5lcyBtYXkgYmUgY29udGludWVkIHdpdGggYSAiXFwiIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIGxpbmUgKGl0Ci1iZWNvbWVzIGEgc3BhY2UgY2hhcmFjdGVyKS4KLS5QUAotLlNIIE9QVElPTlMKLQotLlBQCi1cZkItZGlzcGxheVxmUiBcZklkaXNwXGZSCi0uSVAKLVgxMSBzZXJ2ZXIgZGlzcGxheSB0byBjb25uZWN0IHRvLCB1c3VhbGx5IDowLiAgVGhlIFgKLXNlcnZlciBwcm9jZXNzIG11c3QgYmUgcnVubmluZyBvbiBzYW1lIG1hY2hpbmUgYW5kCi1zdXBwb3J0IE1JVC1TSE0uICBFcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIERJU1BMQVkKLWVudmlyb25tZW50IHZhcmlhYmxlIHRvIFxmSWRpc3BcZlIuCi0uSVAKLVNlZSB0aGUgZGVzY3JpcHRpb24gYmVsb3cgb2YgdGhlICJcZkItZGlzcGxheVxmUiBcZklXQUlUOi4uLlxmUiIKLWV4dGVuc2lvbnMsIHdoZXJlIGFsaWFzICJcZkItZmluZFxmUiIgd2lsbCBmaW5kIHRoZSB1c2VyJ3MKLWRpc3BsYXkgYXV0b21hdGljYWxseSwgYW5kICJcZkItY3JlYXRlXGZSIiB3aWxsIGNyZWF0ZSBhCi1YdmZiIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpcyBmb3VuZC4KLS5QUAotXGZCLWF1dGhcZlIgXGZJZmlsZVxmUgotLklQCi1TZXQgdGhlIFggYXV0aG9yaXR5IGZpbGUgdG8gYmUgXGZJZmlsZVxmUiwgZXF1aXZhbGVudCB0bwotc2V0dGluZyB0aGUgWEFVVEhPUklUWSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBcZklmaWxlXGZSCi1iZWZvcmUgc3RhcnR1cC4gIFNhbWUgYXMgXGZCLXhhdXRoXGZSIGZpbGUuICBTZWUgCi0uSVIgWHNlY3VyaXR5ICg3KQotLAotLklSIHhhdXRoICgxKQotbWFuIHBhZ2VzIGZvciBtb3JlIGluZm8uCi0uSVAKLVVzZSAnLWF1dGggZ3Vlc3MnIHRvIGhhdmUgeDExdm5jIHVzZSBpdHMgXGZCLWZpbmRhdXRoXGZSCi1tZWNoYW5pc20gKGRlc2NyaWJlZCBiZWxvdykgdG8gdHJ5IHRvIGd1ZXNzIHRoZQotWEFVVEhPUklUWSBmaWxlbmFtZSBhbmQgdXNlIGl0LgotLklQCi1YRE0vR0RNL0tETTogaWYgeW91IGFyZSBydW5uaW5nIHgxMXZuYyBhcyByb290IGFuZCB3YW50Ci10byBmaW5kIHRoZSBYQVVUSE9SSVRZIGJlZm9yZSBhbnlvbmUgaGFzIGxvZ2dlZCBpbnRvIGFuCi1YIHNlc3Npb24geWV0LCB1c2U6IHgxMXZuYyBcZkItZW52XGZSIEZEX1hETT0xIFxmQi1hdXRoXGZSIGd1ZXNzIC4uLgotKFRoaXMgd2lsbCBhbHNvIGZpbmQgdGhlIFhBVVRIT1JJVFkgaWYgYSB1c2VyIGlzIGFscmVhZHkKLWxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb24uKSAgV2hlbiBydW5uaW5nIGFzIHJvb3QsCi1GRF9YRE09MSB3aWxsIGJlIHRyaWVkIGlmIHRoZSBpbml0aWFsIFxmQi1hdXRoXGZSIGd1ZXNzIGZhaWxzLgotLlBQCi1cZkItTlxmUgotLklQCi1JZiB0aGUgWCBkaXNwbGF5IGlzIDpOLCB0cnkgdG8gc2V0IHRoZSBWTkMgZGlzcGxheSB0bwotYWxzbyBiZSA6TiBUaGlzIGp1c3Qgc2V0cyB0aGUgXGZCLXJmYnBvcnRcZlIgb3B0aW9uIHRvIDU5MDArTgotVGhlIHByb2dyYW0gd2lsbCBleGl0IGltbWVkaWF0ZWx5IGlmIHRoYXQgcG9ydCBpcyBub3QKLWF2YWlsYWJsZS4gVGhlIFxmQi1OXGZSIG9wdGlvbiBvbmx5IHdvcmtzIHdpdGggbm9ybWFsIFxmQi1kaXNwbGF5XGZSCi11c2FnZSwgZS5nLiA6MCBvciA6OCwgXGZCLU5cZlIgaXMgaWdub3JlZCBpbiB0aGUgXGZCLWRpc3BsYXlcZlIKLVdBSVQ6Li4uLCBcZkItY3JlYXRlLFxmUiBcZkItZmluZCxcZlIgXGZCLXN2YyxcZlIgXGZCLXJlZGlyZWN0LFxmUiBldGMgbW9kZXMuCi0uUFAKLVxmQi1hdXRvcG9ydFxmUiBcZkluXGZSCi0uSVAKLUF1dG9tYXRpY2FsbHkgcHJvYmUgZm9yIGEgZnJlZSBWTkMgcG9ydCBzdGFydGluZyBhdCBuLgotVGhlIGRlZmF1bHQgaXMgdG8gc3RhcnQgcHJvYmluZyBhdCA1OTAwLiAgVXNlIHRoaXMgdG8KLXN0YXkgYXdheSBmcm9tIG90aGVyIFZOQyBzZXJ2ZXJzIG5lYXIgNTkwMC4KLS5QUAotXGZCLXJmYnBvcnRcZlIgXGZJc3RyXGZSCi0uSVAKLVRoZSBWTkMgcG9ydCB0byBsaXN0ZW4gb24gKGEgTGliVk5DU2VydmVyIG9wdGlvbiksIGUuZy4KLTU5MDAsIDU5MDEsIGV0Yy4gIElmIHNwZWNpZmllZCBhcyAiXGZCLXJmYnBvcnRcZlIgXGZJUFJPTVBUXGZSIgotdGhlbiB0aGUgeDExdm5jIFxmQi1ndWlcZlIgaXMgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8KLWVudGVyIHRoZSBwb3J0IG51bWJlci4KLS5QUAotXGZCLTZcZlIKLS5JUAotSVB2NiBsaXN0ZW5pbmcgc3VwcG9ydC4gIEluIGFkZGl0aW9uIHRvIElQdjQsIHRoZQotSVB2NiBhZGRyZXNzIGlzIGxpc3RlbmVkIG9uIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4KLVRoZSBzYW1lIHBvcnQgbnVtYmVyIGFzIElQdjQgaXMgdXNlZC4KLS5JUAotTk9URTogIFRoaXMgeDExdm5jIGJpbmFyeSB3YXMgY29tcGlsZWQgdG8gaGF2ZSB0aGUKLSItNiIgSVB2NiBsaXN0ZW5pbmcgbW9kZSBFTkFCTEVEIGJ5IGRlZmF1bHQgKENQUEZMQUdTCi1cZkItRFgxMVZOQ19MSVNURU42PTEpLlxmUiAgU28gdG8gZGlzYWJsZSBJUHY2IGxpc3RlbmluZyBtb2RlCi15b3UgTVVTVCBzdXBwbHkgdGhlICJcZkItbm82XGZSIiBvcHRpb24gKHNlZSBiZWxvdy4pCi0uSVAKLVRoZSAiLTYiIG1vZGUgd29ya3MgZm9yIGJvdGggbm9ybWFsIGNvbm5lY3Rpb25zIGFuZAotXGZCLXNzbFxmUiBlbmNyeXB0ZWQgb25lcy4gIE5lYXJseSBldmVyeXRoaW5nIGlzIHN1cHBvcnRlZAotZm9yIHRoZSBJUHY2IGNhc2UsIGJ1dCB0aGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucy4KLVNlZSBcZkItc3R1bm5lbFxmUiBmb3IgaXRzIElQdjYgc3VwcG9ydC4KLS5JUAotQ3VycmVudGx5LCBmb3IgYWJzb2x1dGVseSBldmVyeXRoaW5nIHRvIHdvcmsgY29ycmVjdGx5Ci10aGUgbWFjaGluZSBtYXkgbmVlZCB0byBoYXZlIHNvbWUgSVB2NCBzdXBwb3J0LCBhdCB0aGUKLWxlYXN0IGZvciB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlLiAgSG93ZXZlciwgZm9yIG5lYXJseQotYWxsIHVzYWdlIG1vZGVzIG5vIElQdjQgc3VwcG9ydCBpcyByZXF1aXJlZC4gU2VlIFxmQi1ub3BpdjQuXGZSCi0uSVAKLUlmIHlvdSBoYXZlIHRyb3VibGUgY29tcGlsaW5nIG9yIHJ1bm5pbmcgaW4gSVB2NiBtb2RlLAotc2V0IFxmQi1EWDExVk5DX0lQVjY9MFxmUiBpbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nIHRvCi1kaXNhYmxlIElQdjYgc3VwcG9ydC4KLS5QUAotXGZCLW5vNlxmUgotLklQCi1EaXNhYmxlIElQdjYgbGlzdGVuaW5nIHN1cHBvcnQgKG9ubHkgdXNlZnVsIGlmIHRoZQotIi02IiBtb2RlIGlzIGNvbXBpbGVkIGluIHRvIGJlIHRoZSBkZWZhdWx0OyBzZWUgdGhlCi1YMTFWTkNfTElTVEVONiBkZXNjcmlwdGlvbiBhYm92ZSB1bmRlciAiLTYiLikKLS5QUAotXGZCLW5vaXB2NlxmUgotLklQCi1EbyBub3QgdHJ5IHRvIHVzZSBJUHY2IGZvciBhbnkgbGlzdGVuaW5nIG9yIGNvbm5lY3RpbmcKLXNvY2tldHMuICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIGxpc3RlbmluZyBzZXJ2aWNlCi1wb3J0KHMpIGFuZCBvdXRnb2luZyBjb25uZWN0aW9ucyBmcm9tIFxmQi1jb25uZWN0LFxmUgotXGZCLWNvbm5lY3Rfb3JfZXhpdCxcZlIgb3IgXGZCLXByb3h5LlxmUiAgVXNlIHRoaXMgaWYgeW91IGFyZSBoYXZpbmcKLXByb2JsZW1zIGR1ZSB0byBJUHY2LgotLlBQCi1cZkItbm9pcHY0XGZSCi0uSVAKLURvIG5vdCB0cnkgdG8gdXNlIElQdjQgZm9yIGFueSBsaXN0ZW5pbmcgb3IgY29ubmVjdGluZwotc29ja2V0cy4gIFRoaXMgaXMgbWFpbmx5IGZvciBleHBsb3JpbmcgdGhlIGJlaGF2aW9yIG9mCi14MTF2bmMgb24gYW4gSVB2Ni1vbmx5IHN5c3RlbSwgYnV0IG1heSBoYXZlIG90aGVyIHVzZXMuCi0uUFAKLVxmQi1yZW9wZW5cZlIKLS5JUAotSWYgdGhlIFggc2VydmVyIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLCB0cnkgdG8KLXJlb3BlbiB0aGUgWCBkaXNwbGF5ICh1cCB0byBvbmUgdGltZS4pICBUaGlzIGlzIG9mIHVzZQotZm9yIGRpc3BsYXkgbWFuYWdlcnMgbGlrZSBHRE0gKEtpbGxJbml0Q2xpZW50cyBvcHRpb24pCi10aGF0IGtpbGwgeDExdm5jIGp1c3QgYWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbnRvIHRoZQotWCBzZXNzaW9uLiAgTm90ZTogdGhlIHJlb3BlbmVkIHN0YXRlIG1heSBiZSB1bnN0YWJsZS4KLVNldCBYMTFWTkNfUkVPUEVOX0RJU1BMQVk9biB0byByZW9wZW4gbiB0aW1lcyBhbmQKLXNldCBYMTFWTkNfUkVPUEVOX1NMRUVQX01BWCB0byB0aGUgbnVtYmVyIG9mIHNlY29uZHMsCi1kZWZhdWx0IDEwLCB0byBrZWVwIHRyeWluZyB0byByZW9wZW4gdGhlIGRpc3BsYXkgKG9uY2UKLXBlciBzZWNvbmQuKQotLklQCi1VcGRhdGU6IGFzIG9mIDAuOS45LCB4MTF2bmMgdHJpZXMgdG8gYXV0b21hdGljYWxseSBhdm9pZAotYmVpbmcga2lsbGVkIGJ5IHRoZSBkaXNwbGF5IG1hbmFnZXIgYnkgZGVsYXlpbmcgY3JlYXRpbmcKLXdpbmRvd3Mgb3IgdXNpbmcgWEZJWEVTLiAgU28geW91IHNob3VsZG4ndCBuZWVkIHRvIHVzZQotS2lsbEluaXRDbGllbnRzPWZhbHNlIGFzIGxvbmcgYXMgeW91IGxvZyBpbiBxdWlja2x5Ci1lbm91Z2ggKHdpdGhpbiA0NSBzZWNvbmRzIG9mIGNvbm5lY3RpbmcuKSAgWW91IGNhbgotZGlzYWJsZSB0aGlzIGJ5IHNldHRpbmcgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIuCi1Zb3UgY2FuIGFsc28gc2V0IGl0IHRvIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBkZWxheS4KLS5QUAotXGZCLXJlZmxlY3RcZlIgXGZJaG9zdDpOXGZSCi0uSVAKLUluc3RlYWQgb2YgY29ubmVjdGluZyB0byBhbmQgcG9sbGluZyBhbiBYIGRpc3BsYXksCi1jb25uZWN0IHRvIHRoZSByZW1vdGUgVk5DIHNlcnZlciBob3N0Ok4gYW5kIGJlIGEKLXJlZmxlY3Rvci9yZXBlYXRlciBmb3IgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJ5aW5nCi10byBtYW5hZ2UgdGhlIGNhc2Ugb2YgbWFueSBzaW11bHRhbmVvdXMgVk5DIHZpZXdlcnMKLShlLmcuIGNsYXNzcm9vbSBicm9hZGNhc3RpbmcpIHdoZXJlLCBlLmcuIHlvdSBwdXQKLWEgcmVwZWF0ZXIgb24gZWFjaCBuZXR3b3JrIHN3aXRjaCwgZXRjLCB0byBpbXByb3ZlCi1wZXJmb3JtYW5jZSBieSBkaXN0cmlidXRpbmcgdGhlIGxvYWQgYW5kIG5ldHdvcmsKLXRyYWZmaWMuICBJbXBsaWVzIFxmQi1zaGFyZWRcZlIgKHVzZSBcZkItbm9zaGFyZWRcZlIgYXMgYSBsYXRlcgotb3B0aW9uIHRvIGRpc2FibGUpLiBTZWUgdGhlIGRpc2N1c3Npb24gYmVsb3cgdW5kZXIKLVxmQi1yYXdmYlxmUiB2bmM6aG9zdDpOIGZvciBtb3JlIGRldGFpbHMuCi0uUFAKLVxmQi1pZFxmUiBcZkl3aW5kb3dpZFxmUgotLklQCi1TaG93IHRoZSBYIHdpbmRvdyBjb3JyZXNwb25kaW5nIHRvIFxmSXdpbmRvd2lkXGZSIG5vdAotdGhlIGVudGlyZSBkaXNwbGF5LiAgTmV3IHdpbmRvd3MgbGlrZSBwb3B1cCBtZW51cywKLXRyYW5zaWVudCB0b3BsZXZlbHMsIGV0YywgbWF5IG5vdCBiZSBzZWVuIG9yIG1heSBiZQotY2xpcHBlZC4gIERpc2FibGluZyBTYXZlVW5kZXJzIG9yIEJhY2tpbmdTdG9yZSBpbiB0aGUKLVggc2VydmVyIG1heSBoZWxwIHNob3cgdGhlbS4gIHgxMXZuYyBtYXkgY3Jhc2ggaWYgdGhlCi13aW5kb3cgaXMgaW5pdGlhbGx5IHBhcnRpYWxseSBvYnNjdXJlZCwgY2hhbmdlcyBzaXplLAotaXMgaWNvbmlmaWVkLCBldGMuICBTb21lIHN0ZXBzIGFyZSB0YWtlbiB0byBhdm9pZCB0aGlzCi1hbmQgdGhlIFxmQi14cmFuZHJcZlIgbWVjaGFuaXNtIGlzIHVzZWQgdG8gdHJhY2sgcmVzaXplcy4gIFVzZQotLklSIHh3aW5pbmZvICgxKQotdG8gZ2V0IHRoZSB3aW5kb3cgaWQsIG9yIHVzZSAiXGZCLWlkXGZSIFxmSXBpY2tcZlIiCi10byBoYXZlIHgxMXZuYyBydW4gCi0uSVIgeHdpbmluZm8gKDEpCi1mb3IgeW91IGFuZCBleHRyYWN0Ci10aGUgaWQuICBUaGUgXGZCLWlkXGZSIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGV4cG9ydGluZyB2ZXJ5Ci1zaW1wbGUgYXBwbGljYXRpb25zIChlLmcuIHRoZSBjdXJyZW50IHZpZXcgb24gYSB3ZWJjYW0pLgotLlBQCi1cZkItc2lkXGZSIFxmSXdpbmRvd2lkXGZSCi0uSVAKLUFzIFxmQi1pZCxcZlIgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIHdpbmRvdyBkaXJlY3RseSBpdAotc2hpZnRzIGEgcm9vdCB2aWV3IHRvIGl0OiB0aGlzIHNob3dzIFNhdmVVbmRlcnMgbWVudXMsCi1ldGMsIGFsdGhvdWdoIHRoZXkgd2lsbCBiZSBjbGlwcGVkIGlmIHRoZXkgZXh0ZW5kIGJleW9uZAotdGhlIHdpbmRvdy4KLS5QUAotXGZCLWFwcHNoYXJlXGZSCi0uSVAKLVNpbXBsZSBhcHBsaWNhdGlvbiBzaGFyaW5nIGJhc2VkIG9uIHRoZSBcZkItaWQvLXNpZFxmUgotbWVjaGFuaXNtLiAgRXZlcnkgbmV3IHRvcGxldmVsIHdpbmRvdyB0aGF0IHRoZQotYXBwbGljYXRpb24gY3JlYXRlcyBpbmR1Y2VzIGEgbmV3IHZpZXdlciB3aW5kb3cgdmlhCi1hIHJldmVyc2UgY29ubmVjdGlvbi4gIFRoZSBcZkItaWQvLXNpZFxmUiBhbmQgXGZCLWNvbm5lY3RcZlIKLW9wdGlvbnMgYXJlIHJlcXVpcmVkLiAgUnVuICd4MTF2bmMgXGZCLWFwcHNoYXJlXGZSIFxmQi1oZWxwJ1xmUgotZm9yIG1vcmUgaW5mby4KLS5QUAotXGZCLWNsaXBcZlIgXGZJV3hIK1grWVxmUgotLklQCi1Pbmx5IHNob3cgdGhlIHN1Yi1yZWdpb24gb2YgdGhlIGZ1bGwgZGlzcGxheSB0aGF0Ci1jb3JyZXNwb25kcyB0byB0aGUgcmVjdGFuZ2xlIGdlb21ldHJ5IHdpdGggc2l6ZSBXeEggYW5kCi1vZmZzZXQgK1grWS4gIFRoZSBWTkMgZGlzcGxheSBoYXMgc2l6ZSBXeEggKGkuZS4gc21hbGxlcgotdGhhbiB0aGUgZnVsbCBkaXNwbGF5KS4gIFRoaXMgYWxzbyB3b3JrcyBmb3IgXGZCLWlkLy1zaWRcZlIKLW1vZGUgd2hlcmUgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgdXBwZXIgbGVmdAotY29ybmVyIG9mIHRoZSBzZWxlY3RlZCB3aW5kb3cuICBBbiBleGFtcGxlIHVzZSBvZiB0aGlzCi1vcHRpb24gd291bGQgYmUgdG8gc3BsaXQgYSBsYXJnZSAoZS5nLiBYaW5lcmFtYSkgZGlzcGxheQotaW50byB0d28gcGFydHMgdG8gYmUgYWNjZXNzZWQgdmlhIHNlcGFyYXRlIHZpZXdlcnMgYnkKLXJ1bm5pbmcgYSBzZXBhcmF0ZSB4MTF2bmMgb24gZWFjaCBwYXJ0LgotLklQCi1Vc2UgJy1jbGlwIHhpbmVyYW1hMCcgdG8gY2xpcCB0byB0aGUgZmlyc3QgeGluZXJhbWEKLXN1Yi1zY3JlZW4gKGlmIHhpbmVyYW1hIGlzIGFjdGl2ZSkuICB4aW5lcmFtYTEgZm9yIHRoZQotMm5kIHN1Yi1zY3JlZW4sIGV0Yy4gIFRoaXMgd2F5IHlvdSBkb24ndCBuZWVkIHRvIGZpZ3VyZQotb3V0IHRoZSBXeEgrWCtZIG9mIHRoZSBkZXNpcmVkIHhpbmVyYW1hIHN1Yi1zY3JlZW4uCi1zY3JlZW5zIGFyZSBzb3J0ZWQgaW4gaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIHRoZQotKDAsMCkgb3JpZ2luIChJLmUuIG5vdCB0aGUgWHNlcnZlcidzIG9yZGVyKS4KLS5QUAotXGZCLWZsYXNoY21hcFxmUgotLklQCi1JbiA4YnBwIGluZGV4ZWQgY29sb3IsIGxldCB0aGUgaW5zdGFsbGVkIGNvbG9ybWFwIGZsYXNoCi1hcyB0aGUgcG9pbnRlciBtb3ZlcyBmcm9tIHdpbmRvdyB0byB3aW5kb3cgKHNsb3cpLgotQWxzbyB0cnkgdGhlIFxmQi04dG8yNFxmUiBvcHRpb24gdG8gYXZvaWQgZmxhc2ggYWx0b2dldGhlci4KLS5QUAotXGZCLXNoaWZ0Y21hcFxmUiBcZkluXGZSCi0uSVAKLVJhcmUgcHJvYmxlbSwgYnV0IHNvbWUgOGJwcCBkaXNwbGF5cyB1c2UgbGVzcyB0aGFuIDI1NgotY29sb3JjZWxscyAoZS5nLiAxNi1jb2xvciBncmF5c2NhbGUsIHBlcmhhcHMgdGhlIG90aGVyCi1iaXRzIGFyZSB1c2VkIGZvciBkb3VibGUgYnVmZmVyaW5nKSAqYW5kKiBhbHNvIG5lZWQgdG8KLXNoaWZ0IHRoZSBwaXhlbHMgdmFsdWVzIGF3YXkgZnJvbSAwLCAuLiwgbmNlbGxzLiAgXGZJblxmUgotaW5kaWNhdGVzIHRoZSBzaGlmdCB0byBiZSBhcHBsaWVkIHRvIHRoZSBwaXhlbCB2YWx1ZXMuCi1UbyBzZWUgdGhlIHBpeGVsIHZhbHVlcyBzZXQgREVCVUdfQ01BUD0xIHRvIHByaW50IG91dAotYSBjb2xvcm1hcCBoaXN0b2dyYW0uICBFeGFtcGxlOiBcZkItc2hpZnRjbWFwXGZSIDI0MAotLlBQCi1cZkItbm90cnVlY29sb3JcZlIKLS5JUAotRm9yIDhicHAgZGlzcGxheXMsIGZvcmNlIGluZGV4ZWQgY29sb3IgKGkuZS4gYSBjb2xvcm1hcCkKLWV2ZW4gaWYgaXQgbG9va3MgbGlrZSA4YnBwIFRydWVDb2xvciAocmFyZSBwcm9ibGVtKS4KLS5QUAotXGZCLWFkdmVydGlzZV90cnVlY29sb3JcZlIKLS5JUAotSWYgdGhlIFgxMSBkaXNwbGF5IGlzIGluZGV4ZWQgY29sb3IsIGxpZSB0byBjbGllbnRzCi13aGVuIHRoZXkgZmlyc3QgY29ubmVjdCBieSB0ZWxsaW5nIHRoZW0gaXQgaXMgdHJ1ZWNvbG9yLgotVG8gd29ya2Fyb3VuZCBSZWFsVk5DOiBpblBGIGhhcyBjb2xvdXJNYXAgYnV0IG5vdCA4YnBwCi1Vc2UgJy1hZHZlcnRpc2VfdHJ1ZWNvbG9yIHJlc2V0JyB0byByZXNldCBjbGllbnQgZmIgdG9vLgotLlBQCi1cZkItdmlzdWFsXGZSIFxmSW5cZlIKLS5JUAotVGhpcyBvcHRpb24gcHJvYmFibHkgZG9lcyBub3QgZG8gd2hhdCB5b3UgdGhpbmsuCi1JdCBzaW1wbHkgKmZvcmNlcyogdGhlIHZpc3VhbCB1c2VkIGZvciB0aGUgZnJhbWVidWZmZXI7Ci10aGlzIG1heSBiZSBhIGJhZCB0aGluZy4uLiAoZS5nLiBtZXNzZXMgdXAgY29sb3JzIG9yCi1jYXVzZSBhIGNyYXNoKS4gSXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIGFuZCBmb3Igc29tZQotd29ya2Fyb3VuZHMuICBuIG1heSBiZSBhIGRlY2ltYWwgbnVtYmVyLCBvciAweCBoZXguCi1SdW4gCi0uSVIgeGRweWluZm8gKDEpCi1mb3IgdGhlIHZhbHVlcy4gIE9uZSBtYXkgYWxzbyB1c2UKLSJUcnVlQ29sb3IiLCBldGMuIHNlZSA8WDExL1guaD4gZm9yIGEgbGlzdC4gIElmIHRoZQotc3RyaW5nIGVuZHMgaW4gIjptIiB0aGVuIGZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlCi10aGUgdmlzdWFsIGRlcHRoIGlzIGZvcmNlZCB0byBiZSBtLiAgWW91IG1heSB3YW50IHRvCi11c2UgXGZCLW5vc2htXGZSIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24gKHNvIFhHZXRJbWFnZSBtYXkKLWF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlIHRoZSBwaXhlbCBkYXRhKS4KLS5QUAotXGZCLW92ZXJsYXlcZlIKLS5JUAotSGFuZGxlIG11bHRpcGxlIGRlcHRoIHZpc3VhbHMgb24gb25lIHNjcmVlbiwgZS5nLiA4KzI0Ci1hbmQgMjQrOCBvdmVybGF5IHZpc3VhbHMgKHRoZSAzMiBiaXRzIHBlciBwaXhlbCBhcmUKLXBhY2tlZCB3aXRoIDggZm9yIFBzZXVkb0NvbG9yIGFuZCAyNCBmb3IgVHJ1ZUNvbG9yKS4KLS5JUAotQ3VycmVudGx5IFxmQi1vdmVybGF5XGZSIG9ubHkgd29ya3Mgb24gU29sYXJpcyB2aWEKLS5JUiBYUmVhZFNjcmVlbiAoM1gxMSkKLWFuZCBJUklYIHVzaW5nIAotLklSIFhSZWFkRGlzcGxheSAoMykuCi1PbiBTb2xhcmlzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGltYWdlICJibGVlZGluZyIKLWFyb3VuZCB0cmFuc2llbnQgcG9wdXAgbWVudXMgKGJ1dCBub3QgZm9yIHRoZSBtZW51Ci1pdHNlbGYpOiBhIHdvcmthcm91bmQgaXMgdG8gZGlzYWJsZSBTYXZlVW5kZXJzCi1ieSBwYXNzaW5nIHRoZSAiXGZCLXN1XGZSIiBhcmd1bWVudCB0byBYc3VuIChpbgotL2V0Yy9kdC9jb25maWcvWHNlcnZlcnMpLgotLklQCi1Vc2UgXGZCLW92ZXJsYXlcZlIgYXMgYSB3b3JrYXJvdW5kIGZvciBzaXR1YXRpb25zIGxpa2UgdGhlc2U6Ci1Tb21lIGxlZ2FjeSBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgZGVmYXVsdCB2aXN1YWwgdG8KLWJlIDhicHAgKDgrMjQpLCBvciB0aGV5IHdpbGwgdXNlIDhicHAgUHNldWRvQ29sb3IgZXZlbgotd2hlbiB0aGUgZGVmYXVsdCB2aXN1YWwgaXMgZGVwdGggMjQgVHJ1ZUNvbG9yICgyNCs4KS4KLUluIHRoZXNlIGNhc2VzIGNvbG9ycyBpbiBzb21lIHdpbmRvd3Mgd2lsbCBiZSBpbmNvcnJlY3QKLWluIHgxMXZuYyB1bmxlc3MgXGZCLW92ZXJsYXlcZlIgaXMgdXNlZC4gIEFub3RoZXIgdXNlIG9mCi1cZkItb3ZlcmxheVxmUiBpcyB0byBlbmFibGUgc2hvd2luZyB0aGUgZXhhY3QgbW91c2UgY3Vyc29yCi1zaGFwZSAoZGV0YWlscyBiZWxvdykuCi0uSVAKLVVuZGVyIFxmQi1vdmVybGF5LFxmUiBwZXJmb3JtYW5jZSB3aWxsIGJlIHNvbWV3aGF0IHNsb3dlcgotZHVlIHRvIHRoZSBleHRyYSBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgcmVxdWlyZWQuCi1Gb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSBkbyBub3QgdXNlIFxmQi1vdmVybGF5LFxmUiBidXQgcmF0aGVyCi1jb25maWd1cmUgdGhlIFggc2VydmVyIHNvIHRoYXQgdGhlIGRlZmF1bHQgdmlzdWFsIGlzCi1kZXB0aCAyNCBUcnVlQ29sb3IgYW5kIHRyeSB0byBoYXZlIGFsbCBhcHBzIHVzZSB0aGF0Ci12aXN1YWwgKGUuZy4gc29tZSBhcHBzIGhhdmUgXGZCLXVzZTI0XGZSIG9yIFxmQi12aXN1YWxcZlIgb3B0aW9ucykuCi0uUFAKLVxmQi1vdmVybGF5X25vY3Vyc29yXGZSCi0uSVAKLVNldHMgXGZCLW92ZXJsYXksXGZSIGJ1dCBkb2VzIG5vdCB0cnkgdG8gZHJhdyB0aGUgZXhhY3QgbW91c2UKLWN1cnNvciBzaGFwZSB1c2luZyB0aGUgb3ZlcmxheSBtZWNoYW5pc20uCi0uUFAKLVxmQi04dG8yNFxmUiBcZklbb3B0c11cZlIKLS5JUAotVHJ5IHRoaXMgb3B0aW9uIGlmIFxmQi1vdmVybGF5XGZSIGlzIG5vdCBzdXBwb3J0ZWQgb24geW91cgotT1MsIGFuZCB5b3UgaGF2ZSBhIGxlZ2FjeSA4YnBwIGFwcCB0aGF0IHlvdSB3YW50IHRvCi12aWV3IG9uIGEgbXVsdGktZGVwdGggZGlzcGxheSB3aXRoIGRlZmF1bHQgZGVwdGggMjQKLShhbmQgaXMgMzIgYnBwKSBPUiBoYXZlIGEgZGVmYXVsdCBkZXB0aCA4IGRpc3BsYXkgd2l0aAotZGVwdGggMjQgb3ZlcmxheSB3aW5kb3dzIGZvciBzb21lIGFwcHMuICBUaGlzIG9wdGlvbgotbWF5IG5vdCB3b3JrIG9uIGFsbCBYIHNlcnZlcnMgYW5kIGhhcmR3YXJlICh0ZXN0ZWQKLW9uIFhGcmVlODYvWG9yZyBtZ2EgZHJpdmVyIGFuZCBYc3VuKS4gIFRoZSAib3B0cyIKLXN0cmluZyBpcyBub3QgcmVxdWlyZWQgYW5kIGlzIGRlc2NyaWJlZCBiZWxvdy4KLS5JUAotVGhpcyBtb2RlIGVuYWJsZXMgYSBoYWNrIHdoZXJlIHgxMXZuYyBtb25pdG9ycyB3aW5kb3dzCi13aXRoaW4gMyBsZXZlbHMgZnJvbSB0aGUgcm9vdCB3aW5kb3cuICBJZiBpdCBmaW5kcwotYW55IHRoYXQgYXJlIDhicHAgaXQgZXh0cmFjdHMgdGhlIGluZGV4ZWQgY29sb3IKLXBpeGVsIHZhbHVlcyB1c2luZyBYR2V0SW1hZ2UoKSBhbmQgdGhlbiBhcHBsaWVzIGEKLXRyYW5zZm9ybWF0aW9uIHVzaW5nIHRoZSBjb2xvcm1hcChzKSB0byBjcmVhdGUgVHJ1ZUNvbG9yCi1SR0IgdmFsdWVzIHRoYXQgaXQgaW4gdHVybiBpbnNlcnRzIGludG8gYml0cyAxLTI0IG9mCi10aGUgZnJhbWVidWZmZXIuICBUaGlzIGNyZWF0ZXMgYSBkZXB0aCAyNCAidmlldyIKLW9mIHRoZSBkaXNwbGF5IHRoYXQgaXMgdGhlbiBleHBvcnRlZCB2aWEgVk5DLgotLklQCi1Db252ZXJzZWx5LCBmb3IgZGVmYXVsdCBkZXB0aCA4IGRpc3BsYXlzLCB0aGUgZGVwdGgKLTI0IHJlZ2lvbnMgYXJlIHJlYWQgYnkgWEdldEltYWdlKCkgYW5kIGV2ZXJ5dGhpbmcgaXMKLXRyYW5zZm9ybWVkIGFuZCBpbnNlcnRlZCBpbnRvIGEgZGVwdGggMjQgVHJ1ZUNvbG9yCi1mcmFtZWJ1ZmZlci4KLS5JUAotTm90ZSB0aGF0IGV2ZW4gaWYgdGhlcmUgYXJlICpubyogZGVwdGggMjQgdmlzdWFscyBvcgotd2luZG93cyAoaS5lLiBwdXJlIDhicHApLCB0aGlzIG1vZGUgaXMgcG90ZW50aWFsbHkKLWFuIGltcHJvdmVtZW50IG92ZXIgXGZCLWZsYXNoY21hcFxmUiBiZWNhdXNlIGl0IGF2b2lkcyB0aGUKLWZsYXNoaW5nIGFuZCBzaG93cyBlYWNoIHdpbmRvdyBpbiB0aGUgY29ycmVjdCBjb2xvci4KLS5JUAotVGhpcyBtZXRob2Qgd29ya3MgT0ssIGJ1dCBtYXkgc3RpbGwgaGF2ZSBidWdzIGFuZCBpdAotZG9lcyBob2cgcmVzb3VyY2VzLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIDhicHAgd2luZG93cwotdXNpbmcgZGlmZmVyZW50IGNvbG9ybWFwcywgb25lIG1heSBoYXZlIHRvIGljb25pZnkgYWxsCi1idXQgb25lIGZvciB0aGUgY29sb3JzIHRvIGJlIGNvcnJlY3QuCi0uSVAKLVRoZXJlIG1heSBiZSBwYWludGluZyBlcnJvcnMgZm9yIGNsaXBwaW5nIGFuZCBzd2l0Y2hpbmcKLWJldHdlZW4gd2luZG93cyBvZiBkZXB0aHMgOCBhbmQgMjQuICBIZXVyaXN0aWNzIGFyZQotYXBwbGllZCB0byB0cnkgdG8gbWluaW1pemUgdGhlIHBhaW50aW5nIGVycm9ycy4gIE9uZSBjYW4KLWFsc28gcHJlc3MgMyBBbHRfTCdzIGluIGEgcm93IHRvIHJlZnJlc2ggdGhlIHNjcmVlbgotaWYgdGhlIGVycm9yIGRvZXMgbm90IHJlcGFpciBpdHNlbGYuICBBbHNvIHRoZSBvcHRpb24KLVxmQi1maXhzY3JlZW5cZlIgOD0zLjAgb3IgXGZCLWZpeHNjcmVlblxmUiBWPTMuMCBtYXkgYmUgdXNlZCB0bwotcGVyaW9kaWNhbGx5IHJlZnJlc2ggdGhlIHNjcmVlbiBhdCB0aGUgY29zdCBvZiBiYW5kd2lkdGgKLShldmVyeSAzIHNlYyBmb3IgdGhpcyBleGFtcGxlKS4KLS5JUAotVGhlIFtvcHRzXSBzdHJpbmcgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZXR0aW5ncy4KLU11bHRpcGxlIHNldHRpbmdzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgotLklQCi1Gb3IgZm9yIHNvbWUgWCBzZXJ2ZXJzIHdpdGggZGVmYXVsdCBkZXB0aCAyNCBhCi1zcGVlZHVwIG1heSBiZSBhY2hpZXZlZCB2aWEgdGhlIG9wdGlvbiAibm9nZXRpbWFnZSIuCi1UaGlzIGVuYWJsZXMgYSBzY2hlbWUgd2VyZSBYR2V0SW1hZ2UoKSBpcyBub3QgdXNlZAotdG8gcmV0cmlldmUgdGhlIDhicHAgZGF0YS4gIEluc3RlYWQsIGl0IGFzc3VtZXMgdGhhdAotdGhlIDhicHAgZGF0YSBpcyBpbiBiaXRzIDI1LTMyIG9mIHRoZSAzMmJpdCBYIHBpeGVscy4KLVRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgdGhlIFggc2VydmVyIHNob3VsZCBwdXQKLXRoZSBkYXRhIHRoZXJlIGZvciBvdXIgcG9sbCByZXF1ZXN0cywgYnV0IHNvbWUgZG8gYW5kCi1zbyB0aGUgZXh0cmEgc3RlcHMgdG8gcmV0cmlldmUgaXQgY2FuIGJlIHNraXBwZWQuCi1UZXN0ZWQgd2l0aCBtZ2EgZHJpdmVyIHdpdGggWEZyZWU4Ni9Yb3JnLiAgRm9yIHRoZQotZGVmYXVsdCBkZXB0aCA4IGNhc2UgdGhpcyBvcHRpb24gaXMgaWdub3JlZC4KLS5JUAotVG8gYWRqdXN0IGhvdyBvZnRlbiBYR2V0SW1hZ2UoKSBpcyB1c2VkIHRvIHBvbGwgdGhlCi1ub24tZGVmYXVsdCB2aXN1YWwgcmVnaW9ucyBmb3IgY2hhbmdlcywgdXNlIHRoZSBvcHRpb24KLSJwb2xsPXQiIHdoZXJlICJ0IiBpcyBhIGZsb2F0aW5nIHBvaW50IHRpbWUuCi0oZGVmYXVsdDogMC4wNSkKLS5JUAotU2V0dGluZyB0aGUgb3B0aW9uICJsZXZlbDIiIHdpbGwgbGltaXQgdGhlIHNlYXJjaAotZm9yIG5vbi1kZWZhdWx0IHZpc3VhbCB3aW5kb3dzIHRvIHR3byBsZXZlbHMgZnJvbSB0aGUKLXJvb3Qgd2luZG93LiAgRG8gdGhpcyBvbiBzbG93IG1hY2hpbmVzIHdoZXJlIHlvdSBrbm93Ci10aGUgd2luZG93IG1hbmFnZXIgb25seSBpbXBvc2VzIG9uZSBleHRyYSB3aW5kb3cgYmV0d2VlbgotdGhlIGFwcCB3aW5kb3cgYW5kIHRoZSByb290IHdpbmRvdy4KLS5JUAotQWxzbyBmb3IgdmVyeSBzbG93IG1hY2hpbmVzIHVzZSAiY2FjaGV3aW49dCIKLXdoZXJlIHQgaXMgYSBmbG9hdGluZyBwb2ludCBhbW91bnQgb2YgdGltZSB0byBjYWNoZQotWEdldFdpbmRvd0F0dHJpYnV0ZXMgcmVzdWx0cy4gIEUuZy4gY2FjaGV3aW49NS4wLgotVGhpcyBtYXkgbGVhZCB0byB0aGUgd2luZG93cyBiZWluZyB1bm5vdGljZWQgZm9yIHRoaXMKLWFtb3VudCBvZiB0aW1lIHdoZW4gZGVpY29uaWZ5aW5nLCBwYWludGluZyBlcnJvcnMsIGV0Yy4KLS5JUAotV2hpbGUgdGVzdGluZyBvbiBhIHZlcnkgb2xkIFNTMjAgdGhlc2Ugb3B0aW9ucyBnYXZlCi10b2xlcmFibGUgcmVzcG9uc2U6IFxmQi04dG8yNFxmUiBwb2xsPTAuMixjYWNoZXdpbj01LjAuIEZvcgotdGhpcyBtYWNoaW5lIFxmQi1vdmVybGF5XGZSIGlzIHN1cHBvcnRlZCBhbmQgZ2l2ZXMgYmV0dGVyCi1yZXNwb25zZS4KLS5JUAotRGVidWdnaW5nIGZvciB0aGlzIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZwotImRiZz0xIiwgImRiZz0yIiwgb3IgImRiZz0zIi4KLS5QUAotXGZCLTI0dG8zMlxmUgotLklQCi1WZXJ5IHJhcmUgcHJvYmxlbTogaWYgdGhlIGZyYW1lYnVmZmVyIChYIGRpc3BsYXkKLW9yIFxmQi1yYXdmYilcZlIgaXMgMjRicHAgaW5zdGVhZCBvZiB0aGUgdXN1YWwgMzJicHAsIHRoZW4KLWR5bmFtaWNhbGx5IHRyYW5zZm9ybSB0aGUgcGl4ZWxzIHRvIDMyYnBwLiAgVGhpcyB3aWxsIGJlCi1zbG93ZXIsIGJ1dCBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCBwcm9ibGVtcyB3aGVyZQotVk5DIHZpZXdlcnMgY2Fubm90IGhhbmRsZSAyNGJwcCAoZS5nLiAibWFpbjogc2V0UEY6Ci1ub3QgOCwgMTYgb3IgMzIgYnBwPyIpLiAgU2VlIHRoZSBGQVEgZm9yIG1vcmUgaW5mby4KLS5JUAotSW4gdGhlIGNhc2Ugb2YgXGZCLXJhd2ZiXGZSIG1vZGUsIHRoZSBwaXhlbHMgYXJlIGRpcmVjdGx5Ci1tb2RpZmllZCBieSBpbnNlcnRpbmcgYSAwIGJ5dGUgdG8gcGFkIHRoZW0gb3V0IHRvIDMyYnBwLgotRm9yIFggZGlzcGxheXMsIGEga2x1ZGdlIGlzIGRvbmUgdGhhdCBpcyBlcXVpdmFsZW50IHRvCi0iXGZCLW5vc2htXGZSIFxmSVxmQi12aXN1YWxcZlIgVHJ1ZUNvbG9yOjMyXGZSIi4gIChJZiBiZXR0ZXIgcGVyZm9ybWFuY2UKLWlzIG5lZWRlZCBmb3IgdGhlIGxhdHRlciwgZmVlbCBmcmVlIHRvIGFzaykuCi0uUFAKLVxmQi1zY2FsZVxmUiBcZklmcmFjdGlvblxmUgotLklQCi1TY2FsZSB0aGUgZnJhbWVidWZmZXIgYnkgZmFjdG9yIFxmSWZyYWN0aW9uXGZSLiAgVmFsdWVzCi1sZXNzIHRoYW4gMSBzaHJpbmsgdGhlIGZiLCBsYXJnZXIgb25lcyBleHBhbmQgaXQuIE5vdGU6Ci10aGUgaW1hZ2UgbWF5IG5vdCBiZSBzaGFycCBhbmQgcmVzcG9uc2UgbWF5IGJlIHNsb3dlci4KLUlmIFxmSWZyYWN0aW9uXGZSIGNvbnRhaW5zIGEgZGVjaW1hbCBwb2ludCAiLiIgaXQKLWlzIHRha2VuIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBhbHRlcm5hdGl2ZWx5Ci10aGUgbm90YXRpb24gIm0vbiIgbWF5IGJlIHVzZWQgdG8gZGVub3RlIGZyYWN0aW9ucwotZXhhY3RseSwgZS5nLiBcZkItc2NhbGVcZlIgMi8zCi0uSVAKLVRvIHNjYWxlIGFzeW1tZXRyaWNhbGx5IGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAotZGlyZWN0aW9ucywgc3BlY2lmeSBhIFd4SCBnZW9tZXRyeSB0byBzdHJldGNoIHRvOgotZS5nLiAnLXNjYWxlIDEwMjR4NzY4Jywgb3IgYWxzbyAnLXNjYWxlIDAuOXgwLjc1JwotLklQCi1TY2FsaW5nIE9wdGlvbnM6IGNhbiBiZSBhZGRlZCBhZnRlciBcZklmcmFjdGlvblxmUiB2aWEKLSI6IiwgdG8gc3VwcGx5IG11bHRpcGxlICI6IiBvcHRpb25zIHVzZSBjb21tYXMuCi1JZiB5b3UganVzdCB3YW50IGEgcXVpY2ssIHJvdWdoIHNjYWxpbmcgd2l0aG91dAotYmxlbmRpbmcsIGFwcGVuZCAiOm5iIiB0byBcZklmcmFjdGlvblxmUiAoZS5nLiBcZkItc2NhbGVcZlIKLTEvMzpuYikuICBObyBibGVuZGluZyBpcyB0aGUgZGVmYXVsdCBmb3IgOGJwcCBpbmRleGVkCi1jb2xvciwgdG8gZm9yY2UgYmxlbmRpbmcgZm9yIHRoaXMgY2FzZSB1c2UgIjpmYiIuCi0uSVAKLVRvIGRpc2FibGUgXGZCLXNjcm9sbGNvcHlyZWN0XGZSIGFuZCBcZkItd2lyZWNvcHlyZWN0XGZSIHVuZGVyCi1cZkItc2NhbGVcZlIgdXNlICI6bm9jciIuICBJZiB5b3UgbmVlZCB0byB0byBlbmFibGUgdGhlbSB1c2UKLSI6Y3IiIG9yIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuCi1JZiBhIHNsb3cgbGluayBpcyBkZXRlY3RlZCwgIjpub2NyIiBtYXkgYmUgYXBwbGllZAotYXV0b21hdGljYWxseS4gIERlZmF1bHQ6IDpjcgotLklQCi1Nb3JlIGVzb3RlcmljIG9wdGlvbnM6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdm5jdmlld2VycwotdGhlIHNjYWxlZCB3aWR0aCBpcyBhZGp1c3RlZCB0byBiZSBhIG11bHRpcGxlIG9mIDQ6Ci10byBkaXNhYmxlIHRoaXMgdXNlICI6bjQiLiAgIjppbiIgdXNlIGludGVycG9sYXRpb24KLXNjaGVtZSBldmVuIHdoZW4gc2hyaW5raW5nLCAiOnBhZCIgcGFkIHNjYWxlZCB3aWR0aAotYW5kIGhlaWdodCB0byBiZSBtdWx0aXBsZXMgb2Ygc2NhbGluZyBkZW5vbWluYXRvcgotKGUuZy4gMyBmb3IgMi8zKS4KLS5QUAotXGZCLWdlb21ldHJ5XGZSIFxmSVd4SFxmUgotLklQCi1TYW1lIGFzIFxmQi1zY2FsZVxmUiBXeEgKLS5QUAotXGZCLXNjYWxlX2N1cnNvclxmUiBcZklmcmFjXGZSCi0uSVAKLUJ5IGRlZmF1bHQgaWYgXGZCLXNjYWxlXGZSIGlzIHN1cHBsaWVkIHRoZSBjdXJzb3Igc2hhcGUgaXMKLXNjYWxlZCBieSB0aGUgc2FtZSBmYWN0b3IuICBEZXBlbmRpbmcgb24geW91ciB1c2FnZSwKLXlvdSBtYXkgd2FudCB0byBzY2FsZSB0aGUgY3Vyc29yIGluZGVwZW5kZW50bHkgb2YgdGhlCi1zY3JlZW4gb3Igbm90IGF0IGFsbC4gIElmIHlvdSBzcGVjaWZ5IFxmQi1zY2FsZV9jdXJzb3JcZlIKLXRoZSBjdXJzb3Igd2lsbCBiZSBzY2FsZWQgYnkgdGhhdCBmYWN0b3IuICBXaGVuIHVzaW5nCi1cZkItc2NhbGVcZlIgbW9kZSB0byBrZWVwIHRoZSBjdXJzb3IgYXQgaXRzICJuYXR1cmFsIiBzaXplCi11c2UgIlxmQi1zY2FsZV9jdXJzb3JcZlIgXGZJMVxmUiIuICBNb3N0IG9mIHRoZSAiOiIgc2NhbGluZwotb3B0aW9ucyBhcHBseSBoZXJlIGFzIHdlbGwuCi0uUFAKLVxmQi12aWV3b25seVxmUgotLklQCi1BbGwgVk5DIGNsaWVudHMgY2FuIG9ubHkgd2F0Y2ggKGRlZmF1bHQgb2ZmKS4KLS5QUAotXGZCLXNoYXJlZFxmUgotLklQCi1WTkMgZGlzcGxheSBpcyBzaGFyZWQsIGkuZS4gbW9yZSB0aGFuIG9uZSB2aWV3ZXIgY2FuCi1jb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUgKGRlZmF1bHQgb2ZmKS4KLS5QUAotXGZCLW9uY2VcZlIKLS5JUAotRXhpdCBhZnRlciB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB2aWV3ZXIKLWRpc2Nvbm5lY3RzLCBvcHBvc2l0ZSBvZiBcZkItZm9yZXZlci5cZlIgVGhpcyBpcyB0aGUgRGVmYXVsdC4KLS5QUAotXGZCLWZvcmV2ZXJcZlIKLS5JUAotS2VlcCBsaXN0ZW5pbmcgZm9yIG1vcmUgY29ubmVjdGlvbnMgcmF0aGVyIHRoYW4gZXhpdGluZwotYXMgc29vbiBhcyB0aGUgZmlyc3QgY2xpZW50KHMpIGRpc2Nvbm5lY3QuIFNhbWUgYXMgXGZCLW1hbnlcZlIKLS5JUAotVG8gZ2V0IHRoZSBzdGFuZGFyZCBub24tc2hhcmVkIFZOQyBiZWhhdmlvciB3aGVyZSB3aGVuCi1hIG5ldyBWTkMgY2xpZW50IGNvbm5lY3RzIHRoZSBleGlzdGluZyBWTkMgY2xpZW50IGlzCi1kcm9wcGVkIHVzZTogIFxmQi1uZXZlcnNoYXJlZFxmUiBcZkItZm9yZXZlclxmUiAgIFRoaXMgbWV0aG9kIGNhbgotYWxzbyBiZSB1c2VkIHRvIGd1YXJkIGFnYWluc3QgaHVuZyBUQ1AgY29ubmVjdGlvbnMgdGhhdAotZG8gbm90IGdvIGF3YXkuCi0uUFAKLVxmQi1sb29wXGZSCi0uSVAKLUNyZWF0ZSBhbiBvdXRlciBsb29wIHJlc3RhcnRpbmcgdGhlIHgxMXZuYyBwcm9jZXNzCi13aGVuZXZlciBpdCB0ZXJtaW5hdGVzLiAgXGZCLWJnXGZSIGFuZCBcZkItaW5ldGRcZlIgYXJlIGlnbm9yZWQKLWluIHRoaXMgbW9kZSAoaG93ZXZlciBzZWUgXGZCLWxvb3BiZ1xmUiBiZWxvdykuCi0uSVAKLVVzZWZ1bCBmb3IgY29udGludWluZyBldmVuIGlmIHRoZSBYIHNlcnZlciB0ZXJtaW5hdGVzCi1hbmQgcmVzdGFydHMgKGF0IHRoYXQgbW9tZW50IHRoZSBwcm9jZXNzIHdpbGwgbmVlZAotcGVybWlzc2lvbiB0byByZWNvbm5lY3QgdG8gdGhlIG5ldyBYIHNlcnZlciBvZiBjb3Vyc2UpLgotLklQCi1Vc2UsIGUuZy4sIFxmQi1sb29wMTAwXGZSIHRvIHNsZWVwIDEwMCBtaWxsaXNlY3MgYmV0d2VlbgotcmVzdGFydHMsIGV0Yy4gIERlZmF1bHQgaXMgMjAwMG1zIChpLmUuIDIgc2VjcykgVXNlLAotZS5nLiBcZkItbG9vcDMwMCw1XGZSIHRvIHNsZWVwIDMwMCBtcyBhbmQgb25seSBsb29wIDUgdGltZXMuCi0uSVAKLUlmIFxmQi1sb29wYmdcZlIgKHBsdXMgYW55IG51bWJlcnMpIGlzIHNwZWNpZmllZCBpbnN0ZWFkLAotdGhlICJcZkItYmdcZlIiIG9wdGlvbiBpcyBpbXBsaWVkIGFuZCB0aGUgbW9kZSBhcHByb3hpbWF0ZXMKLS5JUiBpbmV0ZCAoOCkKLXVzYWdlIHRvIHNvbWUgZGVncmVlLiAgSW4gdGhpcyBjYXNlIHdoZW4KLWl0IGdvZXMgaW50byB0aGUgYmFja2dyb3VuZCBhbnkgbGlzdGVuaW5nIHNvY2tldHMKLShpLmUuIHBvcnRzIDU5MDAsIDU4MDApIGFyZSBjbG9zZWQsIHNvIHRoZSBuZXh0IG9uZQotaW4gdGhlIGxvb3AgY2FuIHVzZSB0aGVtLiAgVGhpcyBtb2RlIHdpbGwgb25seSBiZSBvZgotdXNlIGlmIGEgVk5DIGNsaWVudCAodGhlIG9ubHkgY2xpZW50IGZvciB0aGF0IHByb2Nlc3MpCi1pcyBhbHJlYWR5IGNvbm5lY3RlZCBiZWZvcmUgdGhlIHByb2Nlc3MgZ29lcyBpbnRvIHRoZQotYmFja2dyb3VuZCwgZm9yIGV4YW1wbGUsIHVzYWdlIG9mIFxmQi1kaXNwbGF5XGZSIFdBSVQ6Li4sCi1cZkItc3ZjLFxmUiBhbmQgXGZCLWNvbm5lY3RcZlIgY2FuIG1ha2UgdXNlIG9mIHRoaXMgInBvb3IgbWFuJ3MiCi1pbmV0ZCBtb2RlLiAgVGhlIGRlZmF1bHQgd2FpdCB0aW1lIGlzIDUwMG1zIGluIHRoaXMKLW1vZGUuICBUaGlzIHVzYWdlIGNvdWxkIHVzZSB1c2VmdWw6ICBcZkItc3ZjXGZSIFxmQi1iZ1xmUiBcZkItbG9vcGJnXGZSCi0uUFAKLVxmQi10aW1lb3V0XGZSIFxmSW5cZlIKLS5JUAotRXhpdCB1bmxlc3MgYSBjbGllbnQgY29ubmVjdHMgd2l0aGluIHRoZSBmaXJzdCBuIHNlY29uZHMKLWFmdGVyIHN0YXJ0dXAuCi0uSVAKLUlmIHRoZXJlIGhhdmUgYmVlbiBubyBjb25uZWN0aW9uIGF0dGVtcHRzIGFmdGVyIG4KLXNlY29uZHMgeDExdm5jIGV4aXRzIGltbWVkaWF0ZWx5LiAgSWYgYSBjbGllbnQgaXMKLXRyeWluZyB0byBjb25uZWN0IGJ1dCBoYXMgbm90IHByb2dyZXNzZWQgdG8gdGhlIG5vcm1hbAotb3BlcmF0aW5nIHN0YXRlLCB4MTF2bmMgZ2l2ZXMgaXQgYSBmZXcgbW9yZSBzZWNvbmRzCi10byBmaW5pc2ggYW5kIGV4aXRzIGlmIGl0IGRvZXMgbm90IG1ha2UgaXQgdG8gdGhlCi1ub3JtYWwgc3RhdGUuCi0uSVAKLUZvciByZXZlcnNlIGNvbm5lY3Rpb25zIHZpYSBcZkItY29ubmVjdFxmUiBvciBcZkItY29ubmVjdF9vcl9leGl0XGZSCi1hIHRpbWVvdXQgb2YgbiBzZWNvbmRzIHdpbGwgYmUgc2V0IGZvciBhbGwgcmV2ZXJzZQotY29ubmVjdHMuICBJZiB0aGUgY29ubmVjdCB0aW1lb3V0IGFsYXJtIGdvZXMgb2ZmLAoteDExdm5jIHdpbGwgZXhpdCBpbW1lZGlhdGVseS4KLS5QUAotXGZCLXNsZWVwaW5cZlIgXGZJblxmUgotLklQCi1BdCBzdGFydHVwIHNsZWVwIG4gc2Vjb25kcyBiZWZvcmUgcHJvY2VlZGluZyAoZS5nLiB0bwotYWxsb3cgcmVkaXJzIGFuZCBsaXN0ZW5pbmcgY2xpZW50cyB0byBzdGFydCB1cCkKLS5JUAotSWYgYSByYW5nZSBpcyBnaXZlbjogJy1zbGVlcGluIG1pbi1tYXgnLCBhIHJhbmRvbSB2YWx1ZQotYmV0d2VlbiBtaW4gYW5kIG1heCBpcyBzbGVwdC4gRS5nLiAnLXNsZWVwaW4gMC0yMCcgYW5kCi1cJy1zbGVlcGluIDEwLTMwJy4gIEZsb2F0cyBhcmUgYWxsb3dlZCB0b28uCi0uUFAKLVxmQi1pbmV0ZFxmUgotLklQCi1MYXVuY2hlZCBieSAKLS5JUiBpbmV0ZCAoOCk6Ci1zdGRpbyBpbnN0ZWFkIG9mIGxpc3RlbmluZyBzb2NrZXQuCi1Ob3RlOiBpZiB5b3UgYXJlIG5vdCByZWRpcmVjdGluZyBzdGRlcnIgdG8gYSBsb2cgZmlsZQotKHZpYSBzaGVsbCAyPiBvciBcZkItb1xmUiBvcHRpb24pIHlvdSBNVVNUIGFsc28gc3BlY2lmeSB0aGUgXGZCLXFcZlIKLW9wdGlvbiwgb3RoZXJ3aXNlIHRoZSBzdGRlcnIgZ29lcyB0byB0aGUgdmlld2VyIHdoaWNoCi13aWxsIGNhdXNlIGl0IHRvIGFib3J0LiAgU3BlY2lmeWluZyBib3RoIFxmQi1pbmV0ZFxmUiBhbmQgXGZCLXFcZlIKLWFuZCBubyBcZkItb1xmUiB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHN0ZGVyci4KLS5QUAotXGZCLXRpZ2h0ZmlsZXhmZXJcZlIKLS5JUAotRW5hYmxlIHRoZSBUaWdodFZOQyBmaWxlIHRyYW5zZmVyIGV4dGVuc2lvbi4gTm90ZSB0aGF0Ci10aGF0IHdoZW4gdGhlIFxmQi12aWV3b25seVxmUiBvcHRpb24gaXMgc3VwcGxpZWQgYWxsIGZpbGUKLXRyYW5zZmVycyBhcmUgZGlzYWJsZWQuICBBbHNvIGNsaWVudHMgdGhhdCBsb2cgaW4KLXZpZXdvbmx5IGNhbm5vdCB0cmFuc2ZlciBmaWxlcy4gIEhvd2V2ZXIsIGlmIHRoZSByZW1vdGUKLWNvbnRyb2wgbWVjaGFuaXNtIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBnbG9iYWwgb3IKLXBlci1jbGllbnQgdmlld29ubHkgc3RhdGUgdGhlIGZpbGV0cmFuc2ZlciBwZXJtaXNzaW9ucwotd2lsbCBOT1QgY2hhbmdlLgotLklQCi1JTVBPUlRBTlQ6IHBsZWFzZSB1bmRlcnN0YW5kIGlmIFxmQi10aWdodGZpbGV4ZmVyXGZSIGlzCi1zcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkCi1vciBkaXNwbGF5IG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvCi1ub3QgaGF2ZSBpdCBzd2l0Y2ggdXNlcnMgdmlhIHRoZSBcZkItdXNlcnNcZlIgb3B0aW9uLCB0aGVuCi1WTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8gZmlsZXRyYW5zZmVyCi1yZWFkcyBhbmQgd3JpdGVzIGFzICpyb290Ki4KLS5JUAotQWxzbywgdGlnaHRmaWxleGZlciBpcyBkaXNhYmxlZCBpbiBcZkItdW5peHB3XGZSIG1vZGUuCi0uUFAKLVxmQi11bHRyYWZpbGV4ZmVyXGZSCi0uSVAKLU5vdGU6IHRvIGVuYWJsZSBVbHRyYVZOQyBmaWxldHJhbnNmZXIgYW5kIHRvIGdldCBpdCB0bwotd29yayB5b3UgcHJvYmFibHkgbmVlZCB0byBzdXBwbHkgdGhlc2UgTGliVk5DU2VydmVyCi1vcHRpb25zOiAiXGZCLXJmYnZlcnNpb25cZlIgXGZJMy42IFxmQi1wZXJtaXRmaWxldHJhbnNmZXJcZlIiXGZSCi0iXGZCLXVsdHJhZmlsZXhmZXJcZlIiIGlzIGFuIGFsaWFzIGZvciB0aGlzIGNvbWJpbmF0aW9uLgotLklQCi1JTVBPUlRBTlQ6IHBsZWFzZSB1bmRlcnN0YW5kIGlmIFxmQi11bHRyYWZpbGV4ZmVyXGZSIGlzCi1zcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkCi1vciBkaXNwbGF5IG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvCi1ub3QgaGF2ZSBpdCBzd2l0Y2ggdXNlcnMgdmlhIHRoZSBcZkItdXNlcnNcZlIgb3B0aW9uLCB0aGVuCi1WTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8gZmlsZXRyYW5zZmVyCi1yZWFkcyBhbmQgd3JpdGVzIGFzICpyb290Ki4KLS5JUAotTm90ZSB0aGF0IHNhZGx5IHlvdSBjYW5ub3QgZG8gYm90aCBcZkItdGlnaHRmaWxleGZlclxmUiBhbmQKLVxmQi11bHRyYWZpbGV4ZmVyXGZSIGF0IHRoZSBzYW1lIHRpbWUgYmVjYXVzZSB0aGUgbGF0dGVyCi1yZXF1aXJlcyBzZXR0aW5nIHRoZSB2ZXJzaW9uIHRvIDMuNiBhbmQgdGlnaHR2bmMgd2lsbAotbm90IGRvIGZpbGV0cmFuc2ZlciB3aGVuIGl0IHNlZXMgdGhhdCB2ZXJzaW9uIG51bWJlci4KLS5QUAotXGZCLWh0dHBcZlIKLS5JUAotSW5zdGVhZCBvZiB1c2luZyBcZkItaHR0cGRpclxmUiAoc2VlIGJlbG93KSB0byBzcGVjaWZ5Ci13aGVyZSB0aGUgSmF2YSB2bmN2aWV3ZXIgYXBwbGV0IGlzLCBoYXZlIHgxMXZuYyB0cnkKLXRvICpndWVzcyogd2hlcmUgdGhlIGRpcmVjdG9yeSBpcyBieSBsb29raW5nIHJlbGF0aXZlCi10byB0aGUgcHJvZ3JhbSBsb2NhdGlvbiBhbmQgaW4gc3RhbmRhcmQgbG9jYXRpb25zCi0oL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3NlcywgZXRjKS4gIFVuZGVyIFxmQi1zc2xcZlIgb3IKLVxmQi1zdHVubmVsXGZSIHRoZSBzc2wgY2xhc3NlcyBzdWJkaXJlY3RvcnkgaXMgc291Z2h0LgotLlBQCi1cZkItaHR0cF9zc2xcZlIKLS5JUAotQXMgXGZCLWh0dHAsXGZSIGJ1dCBmb3JjZSBsb29rdXAgZm9yIHNzbCBjbGFzc2VzIHN1YmRpci4KLS5JUAotTm90ZSB0aGF0IGZvciBIVFRQUywgc2luZ2xlLXBvcnQgSmF2YSBhcHBsZXQgZGVsaXZlcnkKLXlvdSBjYW4gc2V0IFgxMVZOQ19IVFRQU19ET1dOTE9BRF9XQUlUX1RJTUUgdG8gdGhlCi1tYXggbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGFwcGxldCBkb3dubG9hZAotdG8gZmluaXNoLiAgVGhlIGRlZmF1bHQgaXMgMTUuCi0uUFAKLVxmQi1hdmFoaVxmUgotLklQCi1Vc2UgdGhlIEF2YWhpL21ETlMgWmVyb0NvbmYgcHJvdG9jb2wgdG8gYWR2ZXJ0aXNlCi10aGlzIFZOQyBzZXJ2ZXIgdG8gdGhlIGxvY2FsIG5ldHdvcmsuIChSZWxhdGVkIHRlcm1zOgotUmVuZGV6dm91cywgQm9uam91cikuICBEZXBlbmRpbmcgb24geW91ciBzZXR1cCwgeW91Ci1tYXkgbmVlZCB0byBzdGFydCBhdmFoaS1kYWVtb24gYW5kIG9wZW4gdWRwIHBvcnQgNTM1MwotaW4geW91ciBmaXJld2FsbC4KLS5JUAotWW91IGNhbiBzZXQgWDExVk5DX0FWQUhJX05BTUUsIFgxMVZOQ19BVkFISV9IT1NULAotYW5kL29yIFgxMVZOQ19BVkFISV9QT1JUIGVudmlyb25tZW50IHZhcmlhYmxlcwotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLiAgRm9yIGV4YW1wbGU6Ci1cZkItZW52XGZSIFgxMVZOQ19BVkFISV9OQU1FPXdhbGx5Ci0uSVAKLUlmIHRoZSBhdmFoaSBBUEkgY2Fubm90IGJlIGZvdW5kIGF0IGJ1aWxkIHRpbWUsIGEgaGVscGVyCi1wcm9ncmFtIGxpa2UgYXZhaGktCi0uSVIgcHVibGlzaCAoMSkKLW9yIGRucy0KLS5JUiBzZCAoMSkKLXdpbGwgYmUgdHJpZWQKLS5QUAotXGZCLW1kbnNcZlIKLS5JUAotU2FtZSBhcyBcZkItYXZhaGkuXGZSCi0uUFAKLVxmQi16ZXJvY29uZlxmUgotLklQCi1TYW1lIGFzIFxmQi1hdmFoaS5cZlIKLS5QUAotXGZCLWNvbm5lY3RcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLUZvciB1c2Ugd2l0aCAidm5jdmlld2VyIC1saXN0ZW4iIHJldmVyc2UgY29ubmVjdGlvbnMuCi1JZiBcZklzdHJpbmdcZlIgaGFzIHRoZSBmb3JtICJob3N0IiBvciAiaG9zdDpwb3J0IgotdGhlIGNvbm5lY3Rpb24gaXMgbWFkZSBvbmNlIGF0IHN0YXJ0dXAuCi0uSVAKLVVzZSBjb21tYXMgZm9yIGEgbGlzdCBvZiBob3N0J3MgYW5kIGhvc3Q6cG9ydCdzLgotRS5nLiBcZkItY29ubmVjdFxmUiBob3N0MSxob3N0MiBvciBob3N0MTowLGhvc3QyOjU2NzguCi1Ob3RlIHRoYXQgdG8gcmV2ZXJzZSBjb25uZWN0IHRvIG11bHRpcGxlIGhvc3RzIGF0IHRoZQotc2FtZSB0aW1lIHlvdSB3aWxsIGxpa2VseSBuZWVkIHRvIGFsc28gc3VwcGx5OiBcZkItc2hhcmVkXGZSCi0uSVAKLU5vdGUgdGhhdCB1bmxpa2UgbW9zdCB2bmMgc2VydmVycywgeDExdm5jIHdpbGwgcmVxdWlyZSBhCi1wYXNzd29yZCBmb3IgcmV2ZXJzZSBhcyB3ZWxsIGFzIGZvciBmb3J3YXJkIGNvbm5lY3Rpb25zLgotKHByb3ZpZGVkIHBhc3N3b3JkIGF1dGggaGFzIGJlZW4gZW5hYmxlZCwgXGZCLXJmYmF1dGgsXGZSIGV0YykKLUlmIHlvdSBkbyBub3Qgd2FudCB0byByZXF1aXJlIGEgcGFzc3dvcmQgZm9yIHJldmVyc2UKLWNvbm5lY3Rpb25zIHNldCBYMTFWTkNfUkVWRVJTRV9DT05ORUNUSU9OX05PX0FVVEg9MSBpbgoteW91ciBlbnZpcm9ubWVudCBiZWZvcmUgc3RhcnRpbmcgeDExdm5jLgotLklQCi1JZiBcZklzdHJpbmdcZlIgY29udGFpbnMgIi8iIGl0IGlzIGluc3RlYWQgaW50ZXJwcmV0ZWQKLWFzIGEgZmlsZSB0byBwZXJpb2RpY2FsbHkgY2hlY2sgZm9yIG5ldyBob3N0cy4KLVRoZSBmaXJzdCBsaW5lIGlzIHJlYWQgYW5kIHRoZW4gdGhlIGZpbGUgaXMgdHJ1bmNhdGVkLgotQmUgY2FyZWZ1bCBhYm91dCB0aGUgbG9jYXRpb24gb2YgdGhpcyBmaWxlIGlmIHgxMXZuYwotaXMgcnVubmluZyBhcyByb290IChlLmcuIHZpYSAKLS5JUiBnZG0gKDEpCi0sIGV0YykuCi0uSVAKLVJlcGVhdGVyIG1vZGU6IFNvbWUgc2VydmljZXMgcHJvdmlkZSBhbiBpbnRlcm1lZGlhdGUKLSJ2bmMgcmVwZWF0ZXIiOiBodHRwOi8vd3d3LnV2bmMuY29tL2FkZG9ucy9yZXBlYXRlci5odG1sCi0oYW5kIGFsc28gaHR0cDovL2tvdGkubWJuZXQuZmkvanRrby8gZm9yIGxpbnV4IHBvcnQpCi10aGF0IGFjdHMgYXMgYSBwcm94eS9nYXRld2F5LiAgTW9kZXMgbGlrZSB0aGVzZSByZXF1aXJlCi1hbiBpbml0aWFsIHN0cmluZyB0byBiZSBzZW50IGZvciB0aGUgcmV2ZXJzZSBjb25uZWN0aW9uCi1iZWZvcmUgdGhlIFZOQyBwcm90b2NvbCBpcyBzdGFydGVkLiAgSGVyZSBhcmUgdGhlIHdheXMKLXRvIGRvIHRoaXM6Ci0uSVAKLVxmQi1jb25uZWN0XGZSIHByZT1zb21lX3N0cmluZytob3N0OnBvcnQKLVxmQi1jb25uZWN0XGZSIHByZTEyOD1zb21lX3N0cmluZytob3N0OnBvcnQKLVxmQi1jb25uZWN0XGZSIHJlcGVhdGVyPUlEOjEyMzQraG9zdDpwb3J0Ci1cZkItY29ubmVjdFxmUiByZXBlYXRlcj0yMy40NS42Ny44OTo6NTUwMStob3N0OnBvcnQKLS5JUAotU1NWTkMgbm90YXRpb24gaXMgYWxzbyBzdXBwb3J0ZWQ6Ci0uSVAKLVxmQi1jb25uZWN0XGZSIHJlcGVhdGVyOi8vaG9zdDpwb3J0K0lEOjEyMzQKLS5JUAotQXMgd2l0aCBub3JtYWwgXGZCLWNvbm5lY3RcZlIgdXNhZ2UsIGlmIHRoZSByZXBlYXRlciBwb3J0IGlzCi1ub3Qgc3VwcGxpZWQgNTUwMCBpcyBhc3N1bWVkLgotLklQCi1UaGUgYmFzaWMgaWRlYSBpcyBiZXR3ZWVuIHRoZSBzcGVjaWFsIHRhZywgZS5nLiAicHJlPSIKLWFuZCAiKyIgaXMgdGhlIHByZS1zdHJpbmcgdG8gYmUgc2VudC4gIE5vdGUgdGhhdCBpbgotdGhpcyBjYXNlIGhvc3Q6cG9ydCBpcyB0aGUgcmVwZWF0ZXIgc2VydmVyLCBOT1QgdGhlCi12bmMgdmlld2VyLiAgU29tZWhvdyB0aGUgcHJlLXN0cmluZyB0ZWxscyB0aGUgcmVwZWF0ZXIKLXNlcnZlciBob3cgdG8gZmluZCB0aGUgdm5jIHZpZXdlciBhbmQgY29ubmVjdCB5b3UgdG8gaXQuCi0uSVAKLUluIHRoZSBjYXNlIHByZT1zb21lX3N0cmluZytob3N0OnBvcnQsICJzb21lX3N0cmluZyIKLWlzIHNpbXBseSBzZW50LiBJbiB0aGUgY2FzZSBwcmVOTk49c29tZV9zdHJpbmcraG9zdDpwb3J0Ci0ic29tZV9zdHJpbmciIGlzIHNlbnQgaW4gYSBudWxsIHBhZGRlZCBidWZmZXIgb2YKLWxlbmd0aCBOTk4uICByZXBlYXRlcj0gaXMgdGhlIHNhbWUgYXMgcHJlMjUwPSwgdGhpcyBpcwotdGhlIHVsdHJhdm5jIHJlcGVhdGVyIGJ1ZmZlciBzaXplLgotLklQCi1TdHJpbmdzIGxpa2UgIlxcbiIgYW5kICJcXHIiLCBldGMuIGFyZSBleHBhbmRlZCB0bwotbmV3bGluZSBhbmQgY2FycmlhZ2UgcmV0dXJuLiAgIlxcYyIgaXMgZXhwYW5kZWQgdG8KLSIsIiBzaW5jZSB0aGUgY29ubmVjdCBzdHJpbmcgaXMgY29tbWEgc2VwYXJhdGVkLgotLklQCi1TZWUgYWxzbyB0aGUgXGZCLXByb3h5XGZSIG9wdGlvbiBiZWxvdyBmb3IgYWRkaXRpb25hbCB3YXlzCi10byBwbHVtYiByZXZlcnNlIGNvbm5lY3Rpb25zLgotLklQCi1SZXZlcnNlIFNTTDogdXNpbmcgXGZCLWNvbm5lY3RcZlIgaW4gXGZCLXNzbFxmUiBtb2RlIG1ha2VzIHgxMXZuYwotYWN0IGFzIGFuIFNTTCBjbGllbnQgKGluaXRpYXRlcyBTU0wgY29ubmVjdGlvbikgcmF0aGVyCi10aGFuIGFuIFNTTCBzZXJ2ZXIuICBUaGUgaWRlYSBpcyB4MTF2bmMgbWlnaHQgYmUKLWNvbm5lY3RpbmcgdG8gc3R1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUgd2l0aCB0aGUKLXZpZXdlciBpbiBsaXN0ZW5pbmcgbW9kZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzCi1iZWhhdmlvciwgdXNlIFxmQi1lbnZcZlIgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEuCi1XaXRoIHRoaXMgdGhlIHZpZXdlciBzaWRlIGNhbiBhY3QgYXMgdGhlIFNTTCBjbGllbnQKLWFzIGl0IG5vcm1hbGx5IGRvZXMgZm9yIGZvcndhcmQgY29ubmVjdGlvbnMuCi0uSVAKLVJldmVyc2UgU1NMIFJlcGVhdGVyIG1vZGU6ICBUaGlzIHdpbGwgd29yaywgYnV0IG5vdGUKLXRoYXQgaWYgdGhlIFZOQyBDbGllbnQgZG9lcyBhbnkgc29ydCBvZiBhICdGZXRjaCBDZXJ0JwotYWN0aW9uIGJlZm9yZSBjb25uZWN0aW5nLCB0aGVuIHRoZSBSZXBlYXRlciB3aWxsCi1saWtlbHkgZHJvcCB0aGUgY29ubmVjdGlvbiBhbmQgYm90aCBzaWRlcyB3aWxsIG5lZWQKLXRvIHJlc3RhcnQuICBDb25zaWRlciB0aGUgdXNlIG9mIFxmQi1jb25uZWN0X29yX2V4aXRcZlIKLWFuZCBcZkItbG9vcDMwMCwyXGZSIHRvIGhhdmUgeDExdm5jIHJlY29ubmVjdCBvbmNlIHRvIHRoZQotcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZldGNoLiAgWW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50Ci10byBzdXBwbHkgXGZCLXNzbG9ubHlcZlIgdG8gYXZvaWQgeDExdm5jIHRoaW5raW5nIHRoZSBkZWxheQotaW4gcmVzcG9uc2UgbWVhbnMgdGhlIGNvbm5lY3Rpb24gaXMgVmVOQ3J5cHQuICBUaGUgZW52Ci12YXIgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEgZGlzY3Vzc2VkIGFib3ZlCi1tYXkgYWxzbyBiZSB1c2VmdWwgKGkuZS4gdGhlIHZpZXdlciBjYW4gZG8gYSBmb3J3YXJkCi1jb25uZWN0aW9uIGFzIGl0IG5vcm1hbGx5IGRvZXMuKQotLklQCi1JUHY2OiBhcyBvZiB4MTF2bmMgMC45LjEwIHRoZSBcZkItY29ubmVjdFxmUiBvcHRpb24gc2hvdWxkCi1jb25uZWN0IHRvIElQdjYgaG9zdHMgcHJvcGVybHkuICBJZiB0aGVyZSBhcmUgcHJvYmxlbXMKLXlvdSBjYW4gZGlzYWJsZSBJUHY2IGJ5IHNldHRpbmcgXGZCLURYMTFWTkNfSVBWNj0wXGZSCi1pbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nLiAgSWYgdGhlcmUgcHJvYmxlbXMKLWNvbm5lY3RpbmcgdG8gSVB2NiBob3N0cyBjb25zaWRlciBhIHJlbGF5IGxpa2UgdGhlCi1pbmNsdWRlZCBpbmV0NnRvNCBzY3JpcHQgb3IgdGhlIFxmQi1wcm94eVxmUiBvcHRpb24uCi0uUFAKLVxmQi1jb25uZWN0X29yX2V4aXRcZlIgXGZJc3RyXGZSCi0uSVAKLUFzIHdpdGggXGZCLWNvbm5lY3QsXGZSIGV4Y2VwdCBpZiBub25lIG9mIHRoZSByZXZlcnNlCi1jb25uZWN0aW9ucyBzdWNjZWVkLCB0aGVuIHgxMXZuYyBzaHV0cyBkb3duIGltbWVkaWF0ZWx5Ci0uSVAKLUFuIGVhc2llciB0byB0eXBlIGFsaWFzIGZvciB0aGlzIG9wdGlvbiBpcyAnLWNvZScKLS5JUAotQnkgdGhlIHdheSwgaWYgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBsaXN0ZW4gb24KLUFOWSBpbnRlcmZhY2UgdXNlIFxmQi1yZmJwb3J0XGZSIDAgIHdoaWNoIGlzIGhhbmR5IGZvciB0aGUKLVxmQi1jb25uZWN0X29yX2V4aXRcZlIgbW9kZS4KLS5QUAotXGZCLXByb3h5XGZSIFxmSXN0cmluZ1xmUgotLklQCi1Vc2UgcHJveHkgaW4gc3RyaW5nIChlLmcuIGhvc3Q6cG9ydCkgYXMgYSBwcm94eSBmb3IKLW1ha2luZyByZXZlcnNlIGNvbm5lY3Rpb25zICgtY29ubmVjdCBvciBcZkItY29ubmVjdF9vcl9leGl0XGZSCi1vcHRpb25zKS4KLS5JUAotV2ViIHByb3hpZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG5vdGUgYnkgZGVmYXVsdCBtb3N0IG9mCi10aGVtIG9ubHkgc3VwcG9ydCBkZXN0aW5hdGlvbiBjb25uZWN0aW9ucyB0byBwb3J0cyA0NDMKLW9yIDU2Mywgc28gdGhpcyBtaWdodCBub3QgYmUgdmVyeSB1c2VmdWwgKHRoZSB2aWV3ZXIKLXdvdWxkIG5lZWQgdG8gbGlzdGVuIG9uIHRoYXQgcG9ydCBvciB0aGUgcm91dGVyIHdvdWxkCi1oYXZlIHRvIGRvIGEgcG9ydCByZWRpcmVjdGlvbikuCi0uSVAKLUEgd2ViIHByb3h5IG1heSBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyICJob3N0OnBvcnQiCi1vciAiaHR0cDovL2hvc3Q6cG9ydCIgKHRoZSBwb3J0IGlzIHJlcXVpcmVkIGV2ZW4gaWYKLWl0IGlzIHRoZSBjb21tb24gY2hvaWNlcyA4MCBvciA4MDgwKQotLklQCi1TT0NLUzQsIFNPQ0tTNGEsIGFuZCBTT0NLUzUgYXJlIGFsc28gc3VwcG9ydGVkLgotU09DS1MgcHJveGllcyBub3JtYWxseSBkbyBub3QgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlCi1kZXN0aW5hdGlvbiBwb3J0IG51bWJlci4KLS5JUAotVXNlIGEgZm9ybWF0IGxpa2UgdGhpczogc29ja3M6Ly9ob3N0OnBvcnQgb3IKLXNvY2tzNTovL2hvc3Q6cG9ydC4gIE5vdGUgdGhhdCBzc2ggXGZCLURcZlIgZG9lcyBub3Qgc3VwcG9ydAotU09DS1M0YSwgc28gdXNlIHNvY2tzNTovLy4gIEZvciBzb2NrczovLyBTT0NLUzQgaXMgdXNlZAotb24gYSBudW1lcmljYWwgSVAgYW5kICJsb2NhbGhvc3QiLCBvdGhlcndpc2UgU09DS1M0YQotaXMgdXNlZCAoYW5kIHNvIHRoZSBwcm94eSB0cmllcyB0byBkbyB0aGUgRE5TIGxvb2t1cCkuCi0uSVAKLUFuIGV4cGVyaW1lbnRhbCBtb2RlIGlzICJcZkItcHJveHlcZlIgXGZJaHR0cDovL2hvc3Q6cG9ydC8uLi5cZlIiCi1Ob3RlIHRoZSAiLyIgYWZ0ZXIgdGhlIHBvcnQgdGhhdCBkaXN0aW5ndWlzaGVzIGl0IGZyb20KLWEgbm9ybWFsIHdlYiBwcm94eS4gIFRoZSBwb3J0IG11c3QgYmUgc3VwcGxpZWQgZXZlbiBpZgotaXQgaXMgdGhlIGRlZmF1bHQgODAuICBGb3IgdGhpcyBtb2RlIGEgR0VUIGlzIGRvbmUgdG8KLXRoZSBzdXBwbGllZCBVUkwgd2l0aCB0aGUgc3RyaW5nIGhvc3Q9SCZwb3J0PVAgYXBwZW5kZWQuCi1IIGFuZCBQIHdpbGwgYmUgdGhlIFxmQi1jb25uZWN0XGZSIHJldmVyc2UgY29ubmVjdCBob3N0Ci1hbmQgcG9ydC4gIFVzZSB0aGUgc3RyaW5nICJfX0VORF9fIiB0byBkaXNhYmxlIHRoZQotYXBwZW5kaW5nLiAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0aGF0IG1heWJlIHNvbWUgY2dpCi1zY3JpcHQgcHJvdmlkZXMgdGhlIGFjdHVhbCB2aWV3ZXIgaG9va3VwIGFuZCB0dW5uZWxsaW5nLgotSG93IHRvIGFjdHVhbGx5IGFjaGlldmUgdGhpcyB3aXRoaW4gY2dpLCBwaHAsIGV0Yy4gaXMKLW5vdCBjbGVhci4uLiAgQSBjdXN0b20gd2ViIHNlcnZlciBvciBhcGFjaGUgbW9kdWxlCi13b3VsZCBiZSBzdHJhaWdodC1mb3J3YXJkLgotLklQCi1Bbm90aGVyIGV4cGVyaW1lbnRhbCBtb2RlIGlzICJcZkItcHJveHlcZlIgXGZJc3NoOi8vdXNlckBob3N0XGZSIgotaW4gd2hpY2ggY2FzZSBhIFNTSCB0dW5uZWwgaXMgdXNlZCBmb3IgdGhlIHByb3h5aW5nLgotInVzZXJAIiBpcyBub3QgbmVlZGVkIHVubGVzcyB5b3VyIHVuaXggdXNlcm5hbWUgaXMKLWRpZmZlcmVudCBvbiAiaG9zdCIuICBGb3IgYSBub24tc3RhbmRhcmQgU1NIIHBvcnQKLXVzZSBzc2g6Ly91c2VyQGhvc3Q6cG9ydC4gIElmIHByb3hpZXMgYXJlIGNoYWluZWQgKHNlZQotbmV4dCBwYXJhZ3JhcGgpIHRoZW4gdGhlIHNzaCBvbmUgbXVzdCBiZSB0aGUgZmlyc3Qgb25lLgotSWYgc3NoLWFnZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gdGhlIHNzaCBwYXNzd29yZCBuZWVkcwotdG8gYmUgZW50ZXJlZCBpbiB0aGUgdGVybWluYWwgd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmcuCi1FeGFtcGxlczoKLS5JUAotXGZCLWNvbm5lY3RcZlIgbG9jYWxob3N0OjAgXGZCLXByb3h5XGZSIHNzaDovL21lQGZyaWVuZHMtcGM6MjIyMgotLklQCi1cZkItY29ubmVjdFxmUiBzbm9vcHk6MCBcZkItcHJveHlcZlIgc3NoOi8vc3NoLmNvbXBhbnkuY29tCi0uSVAKLU11bHRpcGxlIHByb3hpZXMgbWF5IGJlIGNoYWluZWQgdG9nZXRoZXIgaW4gY2FzZSBvbmUKLW5lZWRzIHRvIHJpY29jaGV0IG9mZiBvZiBhIG51bWJlciBvZiBob3N0cyB0byBmaW5hbGx5Ci1yZWFjaCB0aGUgVk5DIHZpZXdlci4gIFVwIHRvIDMgbWF5IGJlIGNoYWluZWQsIHNlcGFyYXRlCi10aGVtIGJ5IGNvbW1hcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgdG8gYmUgY29ubmVjdGVkIHRvLgotRS5nLjogIGh0dHA6Ly9ob3N0MTpwb3J0MSxzb2NrczU6Ly9ob3N0Mjpwb3J0MiBvciB0aHJlZQotbGlrZTogIGZpcnN0LHNlY29uZCx0aGlyZAotLklQCi1JUHY2OiBhcyBvZiB4MTF2bmMgMC45LjEwIHRoZSBcZkItcHJveHlcZlIgb3B0aW9uIHNob3VsZAotY29ubmVjdCB0byBJUHY2IGhvc3RzIHByb3Blcmx5LiAgSWYgdGhlcmUgYXJlIHByb2JsZW1zCi15b3UgY2FuIGRpc2FibGUgSVB2NiBieSBzZXR0aW5nIFxmQi1EWDExVk5DX0lQVjY9MFxmUgotaW4gQ1BQRkxBR1Mgd2hlbiBjb25maWd1cmluZy4gIElmIHRoZXJlIHByb2JsZW1zCi1jb25uZWN0aW5nIHRvIElQdjYgaG9zdHMgY29uc2lkZXIgYSByZWxheSBsaWtlIHRoZQotaW5jbHVkZWQgaW5ldDZ0bzQgc2NyaXB0LgotLlBQCi1cZkItdm5jY29ubmVjdCxcZlIgXGZCLW5vdm5jY29ubmVjdFxmUgotLklQCi1Nb25pdG9yIHRoZSBWTkNfQ09OTkVDVCBYIHByb3BlcnR5IHNldCBieSB0aGUgc3RhbmRhcmQKLVZOQyBwcm9ncmFtIAotLklSIHZuY2Nvbm5lY3QgKDEpLgotV2hlbiB0aGUgcHJvcGVydHkgaXMKLXNldCB0byAiaG9zdCIgb3IgImhvc3Q6cG9ydCIgZXN0YWJsaXNoIGEgcmV2ZXJzZQotY29ubmVjdGlvbi4gIFVzaW5nIAotLklSIHhwcm9wICgxKQotaW5zdGVhZCBvZiB2bmNjb25uZWN0IG1heQotd29yayAoc2VlIHRoZSBGQVEpLiAgVGhlIFxmQi1yZW1vdGVcZlIgY29udHJvbCBtZWNoYW5pc20gdXNlcwotWDExVk5DX1JFTU9URSBjaGFubmVsLCBhbmQgdGhpcyBvcHRpb24gZGlzYWJsZXMvZW5hYmxlcwotaXQgYXMgd2VsbC4gIERlZmF1bHQ6IFxmQi12bmNjb25uZWN0XGZSCi0uSVAKLVRvIHVzZSBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZXNlIFgxMSBwcm9wZXJ0aWVzIChlLmcuIHRvCi1oYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgZm9yIG11bHRpcGxlCi14MTF2bmMncyBvbiB0aGUgc2FtZSBkaXNwbGF5KSBzZXQgdGhlIFZOQ19DT05ORUNUIG9yCi1YMTFWTkNfUkVNT1RFIGVudi4gdmFycy4gdG8gdGhlIHN0cmluZyB5b3Ugd2FudCwgZm9yCi1leGFtcGxlOiBcZkItZW52XGZSIFgxMVZOQ19SRU1PVEU9WDExVk5DX1JFTU9URV8xMjM0NQotQm90aCBzaWRlcyBvZiB0aGUgY2hhbm5lbCBtdXN0IHVzZSB0aGUgc2FtZSB1bmlxdWUgbmFtZS4KLVRoZSBzYW1lIGNhbiBiZSBkb25lIGZvciB0aGUgaW50ZXJuYWwgWDExVk5DX1RJQ0tFUgotcHJvcGVydHkgKGhlYXJ0YmVhdCBhbmQgdGltZXN0YW1wKSBpZiBkZXNpcmVkLgotLlBQCi1cZkItYWxsb3dcZlIgXGZJaG9zdDFbLGhvc3QyLi5dXGZSCi0uSVAKLU9ubHkgYWxsb3cgY2xpZW50IGNvbm5lY3Rpb25zIGZyb20gaG9zdHMgbWF0Y2hpbmcKLXRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0bmFtZXMgb3IgSVAgYWRkcmVzc2VzLgotQ2FuIGFsc28gYmUgYSBudW1lcmljYWwgSVAgcHJlZml4LCBlLmcuICIxOTIuMTY4LjEwMC4iCi10byBtYXRjaCBhIHNpbXBsZSBzdWJuZXQsIGZvciBtb3JlIGNvbnRyb2wgYnVpbGQKLUxpYlZOQ1NlcnZlciB3aXRoIGxpYndyYXAgc3VwcG9ydCAoU2VlIHRoZSBGQVEpLiAgSWYgdGhlCi1saXN0IGNvbnRhaW5zIGEgIi8iIGl0IGluc3RlYWQgaXMgYSBpbnRlcnByZXRlZAotYXMgYSBmaWxlIGNvbnRhaW5pbmcgYWRkcmVzc2VzIG9yIHByZWZpeGVzIHRoYXQgaXMKLXJlLXJlYWQgZWFjaCB0aW1lIGEgbmV3IGNsaWVudCBjb25uZWN0cy4gIExpbmVzIGNhbiBiZQotY29tbWVudGVkIG91dCB3aXRoIHRoZSAiIyIgY2hhcmFjdGVyIGluIHRoZSB1c3VhbCB3YXkuCi0uSVAKLVxmQi1hbGxvd1xmUiBhcHBsaWVzIGluIFxmQi1zc2xcZlIgbW9kZSwgYnV0IG5vdCBpbiBcZkItc3R1bm5lbFxmUiBtb2RlLgotLklQCi1JUHY2OiBhcyBvZiB4MTF2bmMgMC45LjEwIGEgaG9zdCBjYW4gYmUgc3BlY2lmaWVkCi1pbiBJUHY2IG51bWVyaWNhbCBmb3JtYXQsIGUuZy4gMjAwMTo0ODYwOmIwMDk6OjkzLgotLlBQCi1cZkItbG9jYWxob3N0XGZSCi0uSVAKLUJhc2ljYWxseSB0aGUgc2FtZSBhcyAiXGZCLWFsbG93XGZSIFxmSTEyNy4wLjAuMVxmUiIuCi0uSVAKLU5vdGU6IGlmIHlvdSB3YW50IHRvIHJlc3RyaWN0IHdoaWNoIG5ldHdvcmsgaW50ZXJmYWNlCi14MTF2bmMgbGlzdGVucyBvbiwgc2VlIHRoZSBcZkItbGlzdGVuXGZSIG9wdGlvbiBiZWxvdy4KLUUuZy4gIlxmQi1saXN0ZW5cZlIgXGZJbG9jYWxob3N0XGZSIiBvciAiXGZCLWxpc3RlblxmUiBcZkkxOTIuMTY4LjMuMjFcZlIiLgotQXMgYSBzcGVjaWFsIGNhc2UsIHRoZSBvcHRpb24gIlxmQi1sb2NhbGhvc3RcZlIiIGltcGxpZXMKLSJcZkItbGlzdGVuXGZSIFxmSWxvY2FsaG9zdFxmUiIuCi0uSVAKLUEgcmFyZSBjYXNlLCBidXQgZm9yIG5vbi1sb2NhbGhvc3QgXGZCLWxpc3RlblxmUiB1c2FnZSwgaWYKLXlvdSB1c2UgdGhlIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSAoLVIpIHRvIGNoYW5nZQotdGhlIFxmQi1saXN0ZW5cZlIgaW50ZXJmYWNlIHlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QKLXRoZSBcZkItYWxsb3dcZlIgbGlzdCAoYW5kIHZpY2UgdmVyc2EpIHRvIGF2b2lkIHNpdHVhdGlvbnMKLXdoZXJlIG5vIGNvbm5lY3Rpb25zIChvciB0b28gbWFueSkgYXJlIGFsbG93ZWQuCi0uSVAKLUlmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gbGlzdGVuIG9uIEFOWSBpbnRlcmZhY2UKLShldmlkZW50bHkgeW91IGFyZSB1c2luZyBcZkItY29ubmVjdFxmUiBvciBcZkItY29ubmVjdF9vcl9leGl0LFxmUgotb3IgcGxhbiB0byB1c2UgcmVtb3RlIGNvbnRyb2w6IFxmQi1SXGZSIGNvbm5lY3Q6aG9zdCksIHVzZQotXGZCLXJmYnBvcnRcZlIgMAotLklQCi1JUHY2OiBpZiBJUHY2IGlzIHN1cHBvcnRlZCwgdGhpcyBvcHRpb24gYXV0b21hdGljYWxseQotaW1wbGllcyB0aGUgSVB2NiBsb29wYmFjayBhZGRyZXNzICc6OjEnIGFzIHdlbGwuCi0uUFAKLVxmQi11bml4c29ja1xmUiBcZklzdHJcZlIKLS5JUAotTGlzdGVuIG9uIHRoZSB1bml4IHNvY2tldCAoQUZfVU5JWCkgJ3N0cicKLWZvciBjb25uZWN0aW9ucy4gIFRoaXMgbW9kZSBpcyBmb3IgZWl0aGVyIGxvY2FsCi1jb25uZWN0aW9ucyBvciBhIHR1bm5lbCBlbmRwb2ludCB3aGVyZSBvbmUgd2FudHMgdGhlCi1maWxlIHBlcm1pc3Npb24gb2YgdGhlIHVuaXggc29ja2V0IGZpbGUgdG8gZGV0ZXJtaW5lCi13aGF0IGNhbiBjb25uZWN0IHRvIGl0LiAgKFRoaXMgY3VycmVudGx5IHJlcXVpcmVzIGFuCi1lZGl0IHRvIGxpYnZuc2VydmVyL3JmYnNlcnZlci5jOiBjb21tZW50IG91dCBsaW5lcyAzMTAKLWFuZCAzMTEsICdjbG9zZShzb2NrKScgYW5kICdyZXR1cm4gTlVMTCcgaW4gcmZic2VydmVyLmMKLWFmdGVyIHRoZSBzZXRzb2Nrb3B0KCkgY2FsbC4pIE5vdGUgdGhhdCB0byBkaXNhYmxlIGFsbAotdGNwIGxpc3RlbmluZyBwb3J0cyBzcGVjaWZ5ICctcmZicG9ydCAwJyBhbmQgc2hvdWxkIGJlCi11c2VmdWwgd2l0aCB0aGlzIG1vZGUuICBFeGFtcGxlOgotbWtkaXIgfi9zOyBjaG1vZCA3MDAgfi9zOwoteDExdm5jIFxmQi11bml4c29ja1xmUiB+L3MvbXlzb2NrIFxmQi1yZmJwb3J0XGZSIDAgLi4uCi1UaGUgU1NWTkMgdW5peCB2bmN2aWV3ZXIgY2FuIGNvbm5lY3QgdG8gdW5peCBzb2NrZXRzLgotLlBQCi1cZkItbGlzdGVuNlxmUiBcZklzdHJcZlIKLS5JUAotV2hlbiBpbiBJUHY2IGxpc3RlbiBtb2RlICItNiIsIGxpc3RlbiBvbmx5IG9uIHRoZQotbmV0d29yayBpbnRlcmZhY2Ugd2l0aCBhZGRyZXNzIFxmSXN0clxmUi4gIEl0IGFsc28gd29ya3MKLWZvciBsaW5rIHNjb3BlIGFkZHJlc3NlcyAoZmU4MDo6MjE5OmRiZmY6ZmVlNTozZjkyJWV0aDApCi1hbmQgSVB2NiBob3N0bmFtZSBzdHJpbmdzIChlLmcuIGlwdjYuZ29vZ2xlLmNvbS4pCi1Vc2UgTGliVk5DU2VydmVyIFxmQi1saXN0ZW5cZlIgb3B0aW9uIGZvciB0aGUgSVB2NCBpbnRlcmZhY2UuCi0uUFAKLVxmQi1ub2xvb2t1cFxmUgotLklQCi1EbyBub3QgdXNlIGdldGhvc3RieW5hbWUoKSBvciBnZXRob3N0YnlhZGRyKCkgdG8gbG9vayB1cAotaG9zdCBuYW1lcyBvciBJUCBudW1iZXJzLiAgVXNlIHRoaXMgaWYgbmFtZSByZXNvbHV0aW9uCi1pcyBpbmNvcnJlY3RseSBzZXQgdXAgYW5kIGxlYWRzIHRvIGxvbmcgcGF1c2VzIGFzIG5hbWUKLWxvb2t1cHMgdGltZSBvdXQsIGV0Yy4KLS5QUAotXGZCLWlucHV0XGZSIFxmSXN0cmluZ1xmUgotLklQCi1GaW5lIHR1bmluZyBvZiBhbGxvd2VkIHVzZXIgaW5wdXQuICBJZiBcZklzdHJpbmdcZlIgZG9lcwotbm90IGNvbnRhaW4gYSBjb21tYSAiLCIgdGhlIHR1bmluZyBhcHBsaWVzIG9ubHkgdG8KLW5vcm1hbCBjbGllbnRzLiAgT3RoZXJ3aXNlIHRoZSBwYXJ0IGJlZm9yZSAiLCIgaXMKLWZvciBub3JtYWwgY2xpZW50cyBhbmQgdGhlIHBhcnQgYWZ0ZXIgZm9yIHZpZXctb25seQotY2xpZW50cy4gICJLIiBpcyBmb3IgS2V5c3Ryb2tlIGlucHV0LCAiTSIgZm9yCi1Nb3VzZS1tb3Rpb24gaW5wdXQsICJCIiBmb3IgQnV0dG9uLWNsaWNrIGlucHV0LCAiQyIKLWlzIGZvciBDbGlwYm9hcmQgaW5wdXQsIGFuZCAiRiIgaXMgZm9yIEZpbGUgdHJhbnNmZXIKLSh1bHRyYXZuYyBvbmx5KS4gIFRoZWlyIHByZXNlbmNlIGluIHRoZSBzdHJpbmcgZW5hYmxlcwotdGhhdCB0eXBlIG9mIGlucHV0LiAgRS5nLiAiXGZCLWlucHV0XGZSIFxmSU1cZlIiIG1lYW5zIG5vcm1hbAotdXNlcnMgY2FuIG9ubHkgbW92ZSB0aGUgbW91c2UgYW5kICAiXGZCLWlucHV0XGZSIFxmSUtNQkNGLE1cZlIiCi1sZXRzIG5vcm1hbCB1c2VycyBkbyBhbnl0aGluZyBhbmQgZW5hYmxlcyB2aWV3LW9ubHkKLXVzZXJzIHRvIG1vdmUgdGhlIG1vdXNlLiAgVGhpcyBvcHRpb24gaXMgaWdub3JlZCB3aGVuCi1hIGdsb2JhbCBcZkItdmlld29ubHlcZlIgaXMgaW4gZWZmZWN0IChhbGwgaW5wdXQgaXMgZGlzY2FyZGVkCi1pbiB0aGF0IGNhc2UpLgotLlBQCi1cZkItZ3JhYmtiZFxmUgotLklQCi1XaGVuIFZOQyB2aWV3ZXJzIGFyZSBjb25uZWN0ZWQsIGF0dGVtcHQgdG8gdGhlIGdyYWIKLXRoZSBrZXlib2FyZCBzbyBhIChub24tbWFsaWNpb3VzKSB1c2VyIHNpdHRpbmcgYXQgdGhlCi1waHlzaWNhbCBkaXNwbGF5IGlzIG5vdCBhYmxlIHRvIGVudGVyIGtleXN0cm9rZXMuCi1UaGlzIG1ldGhvZCB1c2VzIAotLklSIFhHcmFiS2V5Ym9hcmQgKDNYMTEpCi1hbmQgc28gaXQgaXMKLW5vdCBzZWN1cmUgYW5kIGRvZXMgbm90IHJ1bGUgb3V0IHRoZSBwZXJzb24gYXQgdGhlCi1waHlzaWNhbCBkaXNwbGF5IGluamVjdGluZyBrZXlzdHJva2VzIGJ5IGZsb29kaW5nIHRoZQotc2VydmVyIHdpdGggdGhlbSwgZ3JhYmJpbmcgdGhlIGtleWJvYXJkIGhpbXNlbGYsIGV0Yy4KLVNvbWUgZGVncmVlIG9mIGNvb3BlcmF0aW9uIGZyb20gdGhlIHBlcnNvbiBhdCB0aGUKLWRpc3BsYXkgaXMgYXNzdW1lZC4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHJlbW90ZQotaGVscC1kZXNrIG9yIGVkdWNhdGlvbmFsIHVzYWdlIG1vZGVzLgotLklQCi1Ob3RlOiBvbiBzb21lIHJlY2VudCAoMTIvMjAxMCkgWCBzZXJ2ZXJzIGFuZC9vcgotZGVza3RvcHMsIFxmQi1ncmFia2JkXGZSIG5vIGxvbmdlciB3b3JrczogaXQgcHJldmVudHMgdGhlCi13aW5kb3cgbWFuYWdlciBmcm9tIHJlc2l6aW5nIHdpbmRvd3MgYW5kIHNpbWlsYXIgdGhpbmdzLgotVHJ5IFxmQi11bmdyYWJib3RoXGZSIGJlbG93IChtaWdodCBub3Qgd29yay4pCi0uUFAKLVxmQi1ncmFicHRyXGZSCi0uSVAKLUFzIFxmQi1ncmFia2JkLFxmUiBidXQgZm9yIHRoZSBtb3VzZSBwb2ludGVyIHVzaW5nCi0uSVIgWEdyYWJQb2ludGVyICgzWDExKS4KLVVuZm9ydHVuYXRlbHkgZHVlIHRvIHRoZSB3YXkgdGhlIFgKLXNlcnZlciB3b3JrcywgdGhlIG1vdXNlIGNhbiBzdGlsbCBiZSBtb3ZlZCBhcm91bmQgYnkgdGhlCi11c2VyIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5LCBidXQgaGUgd2lsbCBub3QgYmUgYWJsZSB0bwotY2hhbmdlIHdpbmRvdyBmb2N1cyB3aXRoIGl0LiAgQWxzbyBzb21lIHdpbmRvdyBtYW5hZ2VycwotdGhhdCBjYWxsIAotLklSIFhHcmFiU2VydmVyICgzWDExKQotZm9yIHJlc2l6ZXMsIGV0Yywgd2lsbAotYWN0IG9uIHRoZSBsb2NhbCB1c2VyJ3MgaW5wdXQuICBBZ2Fpbiwgc29tZSBkZWdyZWUgb2YKLWNvb3BlcmF0aW9uIGZyb20gdGhlIHBlcnNvbiBhdCB0aGUgZGlzcGxheSBpcyBhc3N1bWVkLgotLlBQCi1cZkItdW5ncmFiYm90aFxmUgotLklQCi1XaGVuZXZlciB0aGVyZSBpcyBhbnkgaW5wdXQgKGVpdGhlciBrZXlib2FyZCBvcgotcG9pbnRlciksIHVuZ3JhYiAqYm90aCogdGhlIGtleWJvYXJkIGFuZCB0aGUgcG9pbnRlcgotd2hpbGUgaW5qZWN0aW5nIHRoZSBzeW50aGV0aWMgaW5wdXQuICBUaGlzIGlzIHRvIGFsbG93Ci13aW5kb3cgbWFuYWdlcnMsIGV0Yy4gYSBjaGFuY2UgdG8gZ3JhYi4KLS5QUAotXGZCLWdyYWJhbHdheXNcZlIKLS5JUAotQXBwbHkgYm90aCBcZkItZ3JhYmtiZFxmUiBhbmQgXGZCLWdyYWJwdHJcZlIgZXZlbiB3aGVuIG5vIFZOQwotdmlld2VycyBhcmUgY29ubmVjdGVkLiAgSWYgeW91IG9ubHkgd2FudCBvbmUgb2YgdGhlbSwKLXVzZSB0aGUgXGZCLVJcZlIgcmVtb3RlIGNvbnRyb2wgdG8gdHVybiB0aGUgb3RoZXIgYmFjayBvbiwKLWUuZy4gXGZCLVJcZlIgbm9ncmFicHRyLgotLlBQCi1cZkItdmlld3Bhc3N3ZFxmUiBcZklzdHJpbmdcZlIKLS5JUAotU3VwcGx5IGEgMm5kIHBhc3N3b3JkIGZvciB2aWV3LW9ubHkgbG9naW5zLiAgVGhlIFxmQi1wYXNzd2RcZlIKLShmdWxsLWFjY2VzcykgcGFzc3dvcmQgbXVzdCBhbHNvIGJlIHN1cHBsaWVkLgotLlBQCi1cZkItcGFzc3dkZmlsZVxmUiBcZklmaWxlbmFtZVxmUgotLklQCi1TcGVjaWZ5IHRoZSBMaWJWTkNTZXJ2ZXIgcGFzc3dvcmQgdmlhIHRoZSBmaXJzdCBsaW5lCi1vZiB0aGUgZmlsZSBcZklmaWxlbmFtZVxmUiAoaW5zdGVhZCBvZiB2aWEgXGZCLXBhc3N3ZFxmUiBvbgotdGhlIGNvbW1hbmQgbGluZSB3aGVyZSBvdGhlcnMgbWlnaHQgc2VlIGl0IHZpYSAKLS5JUiBwcyAoMSkKLSkuCi0uSVAKLVNlZSB0aGUgZGVzY3JpcHRpb25zIGJlbG93IGZvciBob3cgdG8gc3VwcGx5IG11bHRpcGxlCi1wYXNzd29yZHMsIHZpZXctb25seSBwYXNzd29yZHMsIHRvIHNwZWNpZnkgZXh0ZXJuYWwKLXByb2dyYW1zIGZvciB0aGUgYXV0aGVudGljYXRpb24sIGFuZCBvdGhlciBmZWF0dXJlcy4KLS5JUAotSWYgdGhlIGZpbGVuYW1lIGlzIHByZWZpeGVkIHdpdGggInJtOiIgaXQgd2lsbCBiZQotcmVtb3ZlZCBhZnRlciBiZWluZyByZWFkLiAgUGVyaGFwcyB0aGlzIGlzIHVzZWZ1bCBpbgotbGltaXRpbmcgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBmaWxlLiAgSW4gZ2VuZXJhbCwgdGhlCi1wYXNzd29yZCBmaWxlIHNob3VsZCBub3QgYmUgcmVhZGFibGUgYnkgdW50cnVzdGVkIHVzZXJzCi0oQlRXOiBuZWl0aGVyIHNob3VsZCB0aGUgVk5DIFxmQi1yZmJhdXRoXGZSIGZpbGU6IGl0IGlzIE5PVAotZW5jcnlwdGVkLCBvbmx5IG9ic2N1cmVkIHdpdGggYSBmaXhlZCBrZXkpLgotLklQCi1JZiB0aGUgZmlsZW5hbWUgaXMgcHJlZml4ZWQgd2l0aCAicmVhZDoiIGl0IHdpbGwKLXBlcmlvZGljYWxseSBiZSBjaGVja2VkIGZvciBjaGFuZ2VzIGFuZCByZXJlYWQuICBJdCBpcwotZ3VhcmFudGVlZCB0byBiZSByZXJlYWQganVzdCB3aGVuIGEgbmV3IGNsaWVudCBjb25uZWN0cwotc28gdGhhdCB0aGUgbGF0ZXN0IHBhc3N3b3JkcyB3aWxsIGJlIHVzZWQuCi0uSVAKLUlmIFxmSWZpbGVuYW1lXGZSIGlzIHByZWZpeGVkIHdpdGggImNtZDoiIHRoZW4gdGhlCi1zdHJpbmcgYWZ0ZXIgdGhlICI6IiBpcyBydW4gYXMgYW4gZXh0ZXJuYWwgY29tbWFuZDoKLXRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBpZiBpdAotd2VyZSByZWFkIGZyb20gYSBwYXNzd29yZCBmaWxlIChzZWUgYmVsb3cpLiAgSWYgdGhlCi1jb21tYW5kIGRvZXMgbm90IGV4aXQgd2l0aCAwLCB0aGVuIHgxMXZuYyB0ZXJtaW5hdGVzCi1pbW1lZGlhdGVseS4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIDEwMDAgcGFzc3dvcmRzIHRoaXMKLXdheSBzZXQgWDExVk5DX01BWF9QQVNTV0RTIGJlZm9yZSBzdGFydGluZyB4MTF2bmMuCi1UaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gXGZCLWFjY2VwdC5cZlIKLS5JUAotTm90ZSB0aGF0IGR1ZSB0byB0aGUgVk5DIHByb3RvY29sIG9ubHkgdGhlIGZpcnN0IDgKLWNoYXJhY3RlcnMgb2YgYSBwYXNzd29yZCBhcmUgdXNlZCAoREVTIGtleSkuCi0uSVAKLUlmIFxmSWZpbGVuYW1lXGZSIGlzIHByZWZpeGVkIHdpdGggImN1c3RvbToiIHRoZW4gYQotY3VzdG9tIHBhc3N3b3JkIGNoZWNrZXIgaXMgc3VwcGxpZWQgYXMgYW4gZXh0ZXJuYWwKLWNvbW1hbmQgZm9sbG93aW5nIHRoZSAiOiIuIFRoZSBjb21tYW5kIHdpbGwgYmUgcnVuCi13aGVuIGEgY2xpZW50IGF1dGhlbnRpY2F0ZXMuICBJZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoCi0wIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQsIG90aGVyd2lzZSBpdCBpcyByZWplY3RlZC4KLVRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCBhcyBpbiBcZkItYWNjZXB0LlxmUgotLklQCi1UaGUgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGN1c3RvbSBjb21tYW5kIHdpbGwgYmUgYQotZGVjaW1hbCBkaWdpdCAibGVuIiBmb2xsb3dlZCBieSBhIG5ld2xpbmUuICJsZW4iCi1zcGVjaWZpZXMgdGhlIGNoYWxsZW5nZSBzaXplIGFuZCBpcyB1c3VhbGx5IDE2ICh0aGUKLVZOQyBzcGVjKS4gIFRoZW4gZm9sbG93cyBsZW4gYnl0ZXMgd2hpY2ggaXMgdGhlIHJhbmRvbQotY2hhbGxlbmdlIHN0cmluZyB0aGF0IHdhcyBzZW50IHRvIHRoZSBjbGllbnQuIFRoaXMgaXMKLXRoZW4gZm9sbG93ZWQgYnkgbGVuIG1vcmUgYnl0ZXMgaG9sZGluZyB0aGUgY2xpZW50J3MKLXJlc3BvbnNlIChpLmUuIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIGVuY3J5cHRlZCB2aWEgREVTCi13aXRoIHRoZSB1c2VyIHBhc3N3b3JkIGluIHRoZSBzdGFuZGFyZCBzaXR1YXRpb24pLgotLklQCi1UaGUgImN1c3RvbToiIHNjaGVtZSBjYW4gYmUgdXNlZnVsIHRvIGltcGxlbWVudAotZHluYW1pYyBwYXNzd29yZHMgb3IgdG8gaW1wbGVtZW50IG1ldGhvZHMgd2hlcmUgbG9uZ2VyCi1wYXNzd29yZHMgYW5kL29yIGRpZmZlcmVudCBlbmNyeXB0aW9uIGFsZ29yaXRobXMKLWFyZSB1c2VkLiAgVGhlIGxhdHRlciB3aWxsIHJlcXVpcmUgY3VzdG9taXppbmcgdGhlIFZOQwotY2xpZW50IGFzIHdlbGwuICBPbmUgY291bGQgY3JlYXRlIGFuIE1ENVNVTSBiYXNlZCBzY2hlbWUKLWZvciBleGFtcGxlLgotLklQCi1GaWxlIGZvcm1hdCBmb3IgXGZCLXBhc3N3ZGZpbGU6XGZSCi0uSVAKLUlmIG11bHRpcGxlIG5vbi1ibGFuayBsaW5lcyBleGlzdCBpbiB0aGUgZmlsZSB0aGV5IGFyZQotYWxsIHRha2VuIGFzIHZhbGlkIHBhc3N3b3Jkcy4gIEJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgotUGFzc3dvcmQgbGluZXMgbWF5IGJlICJjb21tZW50ZWQgb3V0IiAoaWdub3JlZCkgaWYKLXRoZXkgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICIjIiBvciB0aGUgbGluZSBjb250YWlucwotdGhlIHN0cmluZyAiX19TS0lQX18iLiAgTGluZXMgbWF5IGJlIGFubm90YXRlZCBieSB1c2UKLW9mIHRoZSAiX19DT01NX18iIHN0cmluZzogZnJvbSBpdCB0byB0aGUgZW5kIG9mIHRoZQotbGluZSBpcyBpZ25vcmVkLiAgQW4gZW1wdHkgcGFzc3dvcmQgbWF5IGJlIHNwZWNpZmllZAotdmlhIHRoZSAiX19FTVBUWV9fIiBzdHJpbmcgb24gYSBsaW5lIGJ5IGl0c2VsZiAobm90ZQoteW91ciB2aWV3ZXIgbWlnaHQgbm90IGFjY2VwdCBlbXB0eSBwYXNzd29yZHMpLgotLklQCi1JZiB0aGUgc3RyaW5nICJfX0JFR0lOX1ZJRVdPTkxZX18iIGFwcGVhcnMgb24gYQotbGluZSBieSBpdHNlbGYsIHRoZSByZW1haW5pbmcgcGFzc3dvcmRzIGFyZSB1c2VkIGZvcgotdmlld29ubHkgYWNjZXNzLiAgRm9yIGNvbXBhdGliaWxpdHksIGFzIGEgc3BlY2lhbCBjYXNlCi1pZiB0aGUgZmlsZSBjb250YWlucyBvbmx5IHR3byBwYXNzd29yZCBsaW5lcyB0aGUgMm5kCi1vbmUgaXMgYXV0b21hdGljYWxseSB0YWtlbiBhcyB0aGUgdmlld29ubHkgcGFzc3dvcmQuCi1PdGhlcndpc2UgdGhlICJfX0JFR0lOX1ZJRVdPTkxZX18iIHRva2VuIG11c3QgYmUKLXVzZWQgdG8gaGF2ZSB2aWV3b25seSBwYXNzd29yZHMuICAodGlwOiBtYWtlIHRoZSAzcmQKLWFuZCBsYXN0IGxpbmUgYmUgIl9fQkVHSU5fVklFV09OTFlfXyIgdG8gaGF2ZSAyCi1mdWxsLWFjY2VzcyBwYXNzd29yZHMpCi0uUFAKLVxmQi1zaG93cmZiYXV0aFxmUiBcZklmaWxlbmFtZVxmUgotLklQCi1QcmludCB0byB0aGUgc2NyZWVuIHRoZSBvYnNjdXJlZCBWTkMgcGFzc3dvcmQga2VwdCBpbgotdGhlIHJmYmF1dGggZmlsZSBcZklmaWxlbmFtZVxmUiBhbmQgdGhlbiBleGl0LgotLlBQCi1cZkItdW5peHB3XGZSIFxmSVtsaXN0XVxmUgotLklQCi1Vc2UgVW5peCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uICB4MTF2bmMKLXdpbGwgdXNlIHRoZSAKLS5JUiBzdSAoMSkKLXByb2dyYW0gdG8gdmVyaWZ5IHRoZSB1c2VyJ3MKLXBhc3N3b3JkLiAgW2xpc3RdIGlzIGFuIG9wdGlvbmFsIGNvbW1hIHNlcGFyYXRlZCBsaXN0Ci1vZiBhbGxvd2VkIFVuaXggdXNlcm5hbWVzLiAgSWYgdGhlIFtsaXN0XSBzdHJpbmcgYmVnaW5zCi13aXRoIHRoZSBjaGFyYWN0ZXIgIiEiIHRoZW4gdGhlIGVudGlyZSBsaXN0IGlzIHRha2VuCi1hcyBhbiBleGNsdWRlIGxpc3QuICBTZWUgYmVsb3cgZm9yIHBlci11c2VyIG9wdGlvbnMKLXRoYXQgY2FuIGJlIGFwcGxpZWQuCi0uSVAKLUEgZmFtaWxpYXIgImxvZ2luOiIgYW5kICJQYXNzd29yZDoiIGRpYWxvZyBpcwotcHJlc2VudGVkIHRvIHRoZSB1c2VyIG9uIGEgYmxhY2sgc2NyZWVuIGluc2lkZSB0aGUKLXZuY3ZpZXdlci4gIFRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgaWYgdGhlIHVzZXIgZmFpbHMKLXRvIHN1cHBseSB0aGUgY29ycmVjdCBwYXNzd29yZCBpbiAzIHRyaWVzIG9yIGRvZXMgbm90Ci1zZW5kIG9uZSBiZWZvcmUgYSA0NSBzZWNvbmQgdGltZW91dC4gIEV4aXN0aW5nIGNsaWVudHMKLWFyZSB2aWV3LW9ubHkgZHVyaW5nIHRoaXMgcGVyaW9kLgotLklQCi1JZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHJlY2VpdmVkIGlzICJFc2NhcGUiIHRoZW4gdGhlCi11bml4IHVzZXJuYW1lIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZnRlciAibG9naW46IgotYXMgaXQgaXMgdHlwZWQuICBUaGlzIGNvdWxkIGJlIG9mIHVzZSBmb3IgVk5DIHZpZXdlcnMKLXRoYXQgYXV0b21hdGljYWxseSB0eXBlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCi0uSVAKLVNpbmNlIHRoZSBkZXRhaWxlZCBiZWhhdmlvciBvZiAKLS5JUiBzdSAoMSkKLWNhbiB2YXJ5IGZyb20KLU9TIHRvIE9TIGFuZCBmb3IgbG9jYWwgY29uZmlndXJhdGlvbnMsIHRlc3QgdGhlIG1vZGUKLWJlZm9yZSBkZXBsb3ltZW50IHRvIG1ha2Ugc3VyZSBpdCBpcyB3b3JraW5nIHByb3Blcmx5LgoteDExdm5jIHdpbGwgYXR0ZW1wdCB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIHJlamVjdCBhCi1sb2dpbiBpZiBhbnl0aGluZyBhYm5vcm1hbCBvY2N1cnMuCi0uSVAKLU9uZSBjYXNlIHRvIG5vdGU6IEZyZWVCU0QgYW5kIHRoZSBvdGhlciBCU0QncyBieQotZGVmYXVsdCBpdCBpcyBpbXBvc3NpYmxlIGZvciB0aGUgdXNlciBydW5uaW5nIHgxMXZuYyB0bwotdmFsaWRhdGUgaGlzICpvd24qIHBhc3N3b3JkIHZpYSAKLS5JUiBzdSAoMSkKLShjb21tZW50aW5nIG91dAotdGhlIHBhbV9zZWxmLnNvIGVudHJ5IGluIC9ldGMvcGFtLmQvc3UgZWxpbWluYXRlcyB0aGlzCi1iZWhhdmlvcikuICBTbyB0aGUgeDExdm5jIGxvZ2luIHdpbGwgYWx3YXlzICpGQUlMKiBmb3IKLXRoaXMgY2FzZSAoZXZlbiB3aGVuIHRoZSBjb3JyZWN0IHBhc3N3b3JkIGlzIHN1cHBsaWVkKS4KLS5JUAotQSBwb3NzaWJsZSB3b3JrYXJvdW5kIGZvciB0aGlzIG9uICpCU0Qgd291bGQgYmUgdG8KLXN0YXJ0IHgxMXZuYyBhcyByb290IHdpdGggdGhlICJcZkItdXNlcnNcZlIgXGZJK25vYm9keVxmUiIgb3B0aW9uCi10byBpbW1lZGlhdGVseSBzd2l0Y2ggdG8gdXNlciBub2JvZHkgd2hlcmUgdGhlIHN1J2luZwotd2lsbCBwcm9jZWVkIG5vcm1hbGx5LgotLklQCi1Bbm90aGVyIHNvdXJjZSBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIFBBTSBtb2R1bGVzCi10aGF0IHByb21wdCBmb3IgZXh0cmEgaW5mbywgZS5nLiBwYXNzd29yZCBhZ2luZyBtb2R1bGVzLgotVGhlc2UgbG9naW5zIHdpbGwgZmFpbCBhcyB3ZWxsIGV2ZW4gd2hlbiB0aGUgY29ycmVjdAotcGFzc3dvcmQgaXMgc3VwcGxpZWQuCi0uSVAKLSoqSU1QT1JUQU5UKio6IHRvIHByZXZlbnQgdGhlIFVuaXggcGFzc3dvcmQgYmVpbmcgc2VudAotaW4gKmNsZWFyIHRleHQqIG92ZXIgdGhlIG5ldHdvcmssIG9uZSBvZiB0d28gc2NoZW1lcwotd2lsbCBiZSBlbmZvcmNlZDogMSkgdGhlIFxmQi1zc2xcZlIgYnVpbHRpbiBTU0wgbW9kZSwgb3IgMikKLXJlcXVpcmUgYm90aCBcZkItbG9jYWxob3N0XGZSIGFuZCBcZkItc3R1bm5lbFxmUiBiZSBlbmFibGVkLgotLklQCi1NZXRob2QgMSkgZW5zdXJlcyB0aGUgdHJhZmZpYyBpcyBlbmNyeXB0ZWQgYmV0d2Vlbgotdmlld2VyIGFuZCBzZXJ2ZXIuICBBIFBFTSBmaWxlIHdpbGwgYmUgcmVxdWlyZWQsIHNlZSB0aGUKLWRpc2N1c3Npb24gdW5kZXIgXGZCLXNzbFxmUiBiZWxvdyAodW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzCi1hIHRlbXBvcmFyeSBvbmUgY2FuIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkKS4KLS5JUAotTWV0aG9kIDIpIHJlcXVpcmVzIHRoZSB2aWV3ZXIgY29ubmVjdGlvbiB0byBhcHBlYXIKLXRvIGNvbWUgZnJvbSB0aGUgc2FtZSBtYWNoaW5lIHgxMXZuYyBpcyBydW5uaW5nIG9uCi0oZS5nLiBmcm9tIGEgc3NoIFxmQi1MXGZSIHBvcnQgcmVkaXJlY3Rpb24pLiAgQW5kIHRoYXQgdGhlCi1cZkItc3R1bm5lbFxmUiBTU0wgbW9kZSBiZSB1c2VkIGZvciBlbmNyeXB0aW9uIG92ZXIgdGhlCi1uZXR3b3JrLiAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBcZkItc3R1bm5lbFxmUiBiZWxvdykuCi0uSVAKLU5vdGU6IGFzIGEgY29udmVuaWVuY2UsIGlmIHlvdSAKLS5JUiBzc2ggKDEpCi1pbiBhbmQgc3RhcnQKLXgxMXZuYyBpdCB3aWxsIGNoZWNrIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotU1NIX0NPTk5FQ1RJT04gaXMgc2V0IGFuZCBhcHBlYXJzIHJlYXNvbmFibGUuICBJZiBpdAotZG9lcywgdGhlbiB0aGUgXGZCLXNzbFxmUiBvciBcZkItc3R1bm5lbFxmUiByZXF1aXJlbWVudCB3aWxsIGJlCi1kcm9wcGVkIHNpbmNlIGl0IGlzIGFzc3VtZWQgeW91IGFyZSB1c2luZyBzc2ggZm9yIHRoZQotZW5jcnlwdGVkIHR1bm5lbGxpbmcuICBcZkItbG9jYWxob3N0XGZSIGlzIHN0aWxsIGVuZm9yY2VkLgotVXNlIFxmQi1zc2xcZlIgb3IgXGZCLXN0dW5uZWxcZlIgdG8gZm9yY2UgU1NMIHVzYWdlIGV2ZW4gaWYKLVNTSF9DT05ORUNUSU9OIGlzIHNldC4KLS5JUAotVG8gb3ZlcnJpZGUgdGhlIGFib3ZlIHJlc3RyaWN0aW9ucyB5b3UgY2FuIHNldAotZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBzdGFydGluZyB4MTF2bmM6Ci0uSVAKLVNldCBVTklYUFdfRElTQUJMRV9TU0w9MSB0byBkaXNhYmxlIHJlcXVpcmluZyBlaXRoZXIKLVxmQi1zc2xcZlIgb3IgXGZCLXN0dW5uZWxcZlIgKGFzIHVuZGVyIFNTSF9DT05ORUNUSU9OLikgIEV2aWRlbnRseQoteW91IHdpbGwgYmUgdXNpbmcgYSBkaWZmZXJlbnQgbWV0aG9kIHRvIGVuY3J5cHQgdGhlCi1kYXRhIGJldHdlZW4gdGhlIHZuY3ZpZXdlciBhbmQgeDExdm5jOiBwZXJoYXBzIAotLklSIHNzaCAoMSkKLW9yIGFuIElQU0VDIFZQTi4gXGZCLWxvY2FsaG9zdFxmUiBpcyBzdGlsbCBlbmZvcmNlZCAoaG93ZXZlciwKLXNlZSB0aGUgbmV4dCBwYXJhZ3JhcGguKQotLklQCi1TZXQgVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUPTEgdG8gZGlzYWJsZSB0aGUgXGZCLWxvY2FsaG9zdFxmUgotcmVxdWlyZW1lbnQgaW4gXGZCLXVuaXhwd1xmUiBtb2Rlcy4gIE9uZSBzaG91bGQgbmV2ZXIgZG8gdGhpcwotKGkuZS4gYWxsb3cgdGhlIFVuaXggcGFzc3dvcmRzIHRvIGJlIHNuaWZmZWQgb24gdGhlCi1uZXR3b3JrLikgIFRoaXMgYWxzbyBkaXNhYmxlcyB0aGUgbG9jYWxob3N0IHJlcXVpcmVtZW50Ci1mb3IgcmV2ZXJzZSBjb25uZWN0aW9ucyAoc2VlIGJlbG93LikKLS5JUAotTm90ZSB0aGF0IHVzZSBvZiBcZkItbG9jYWxob3N0XGZSIHdpdGggCi0uSVIgc3NoICgxKQotKGFuZCBubyBcZkItdW5peHB3KVxmUgotaXMgcm91Z2hseSB0aGUgc2FtZSBhcyByZXF1aXJpbmcgYSBVbml4IHVzZXIgbG9naW4KLShzaW5jZSBhIFVuaXggcGFzc3dvcmQgb3IgdGhlIHVzZXIncyBwdWJsaWMga2V5Ci1hdXRoZW50aWNhdGlvbiBpcyB1c2VkIGJ5IHNzaGQgb24gdGhlIG1hY2hpbmUgd2hlcmUKLXgxMXZuYyBydW5zIGFuZCBvbmx5IGxvY2FsIGNvbm5lY3Rpb25zIGZyb20gdGhhdCBtYWNoaW5lCi1hcmUgYWNjZXB0ZWQpLgotLklQCi1SZWdhcmRpbmcgcmV2ZXJzZSBjb25uZWN0aW9ucyAoZS5nLiBcZkItUlxmUiBjb25uZWN0Omhvc3QKLWFuZCBcZkItY29ubmVjdFxmUiBob3N0KSwgd2hlbiB0aGUgXGZCLWxvY2FsaG9zdFxmUiBjb25zdHJhaW50IGlzCi1pbiBlZmZlY3QgdGhlbiByZXZlcnNlIGNvbm5lY3Rpb25zIGNhbiBvbmx5IGJlIHVzZWQKLXRvIGNvbm5lY3QgdG8gdGhlIHNhbWUgbWFjaGluZSB4MTF2bmMgaXMgcnVubmluZyBvbgotKGRlZmF1bHQgcG9ydCA1NTAwKS4gIFBsZWFzZSB1c2UgYSBzc2ggb3Igc3R1bm5lbCBwb3J0Ci1yZWRpcmVjdGlvbiB0byB0aGUgdmlld2VyIG1hY2hpbmUgdG8gdHVubmVsIHRoZSByZXZlcnNlCi1jb25uZWN0aW9uIG92ZXIgYW4gZW5jcnlwdGVkIGNoYW5uZWwuCi0uSVAKLUluIFxmQi1pbmV0ZFxmUiBtb2RlIHRoZSBNZXRob2QgMSkgd2lsbCBiZSBlbmZvcmNlZCAobm90Ci1NZXRob2QgMikuICBXaXRoIFxmQi1zc2xcZlIgaW4gZWZmZWN0IHJldmVyc2UgY29ubmVjdGlvbnMKLWFyZSBkaXNhYmxlZC4gIElmIHlvdSBvdmVycmlkZSB0aGlzIHZpYSBlbnYuIHZhciwgYmUKLXN1cmUgdG8gYWxzbyB1c2UgZW5jcnlwdGlvbiBmcm9tIHRoZSB2aWV3ZXIgdG8gaW5ldGQuCi1UaXA6IHlvdSBjYW4gYWxzbyBoYXZlIHlvdXIgb3duIHN0dW5uZWwgc3Bhd24geDExdm5jCi1pbiBcZkItaW5ldGRcZlIgbW9kZSAodGhlcmVieSBieXBhc3NpbmcgaW5ldGQpLiAgU2VlIHRoZSBGQVEKLWZvciBkZXRhaWxzLgotLklQCi1UaGUgdXNlciBuYW1lcyBpbiB0aGUgY29tbWEgc2VwYXJhdGVkIFtsaXN0XSBtYXkgaGF2ZQotcGVyLXVzZXIgb3B0aW9ucyBhZnRlciBhICI6IiwgZS5nLiAiZnJlZDpvcHRzIgotd2hlcmUgIm9wdHMiIGlzIGEgIisiIHNlcGFyYXRlZCBsaXN0IG9mCi0idmlld29ubHkiLCAiZnVsbGFjY2VzcyIsICJpbnB1dD1YWFhYIiwgb3IKLSJkZW55IiwgZS5nLiAia2FybCx3YWxseTp2aWV3b25seSxib3NzOmlucHV0PU0iLgotRm9yICJpbnB1dD0iIGl0IGlzIHRoZSBLLE0sQixDIGRlc2NyaWJlZCB1bmRlciBcZkItaW5wdXQuXGZSCi0uSVAKLUlmIGFuIGl0ZW0gaW4gdGhlIGxpc3QgaXMgIioiIHRoYXQgbWVhbnMgdGhvc2UKLW9wdGlvbnMgYXBwbHkgdG8gYWxsIHVzZXJzLiAgSXQgQUxTTyBpbXBsaWVzIGFsbCB1c2VycwotYXJlIGFsbG93ZWQgdG8gbG9nIGluIGFmdGVyIHN1cHBseWluZyBhIHZhbGlkIHBhc3N3b3JkLgotVXNlICJkZW55IiB0byBleHBsaWNpdGx5IGRlbnkgc29tZSB1c2VycyBpZiB5b3UgdXNlCi0iKiIgdG8gc2V0IGEgZ2xvYmFsIG9wdGlvbi4gIElmIFtsaXN0XSBiZWdpbnMgd2l0aCB0aGUKLSIhIiBjaGFyYWN0ZXIgdGhlbiAiKiIgaXMgaWdub3JlZCBmb3IgY2hlY2tpbmcgaWYKLXRoZSB1c2VyIGlzIGFsbG93ZWQsIGJ1dCB0aGUgb3B0aW9uIHZhbHVlcyBhc3NvY2lhdGVkCi13aXRoIGl0IGRvIGFwcGx5IGFzIG5vcm1hbC4KLS5JUAotVGhlcmUgYXJlIGFsc28gc29tZSB1dGlsaXRpZXMgZm9yIGNoZWNraW5nIHBhc3N3b3JkcwotaWYgW2xpc3RdIHN0YXJ0cyB3aXRoIHRoZSAiJSIgY2hhcmFjdGVyLiAgU2VlIHRoZQotcXVpY2tfcHcoKSBmdW5jdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRGVzY3JpcHRpb246Ci0iJS0iIG9yICIlc3RkaW4iIG1lYW5zIHJlYWQgb25lIGxpbmUgZnJvbSBzdGRpbi4KLSIlZW52IiBtZWFucyBpdCBpcyBpbiAkVU5JWFBXIGVudiB2YXIuICBBIGxlYWRpbmcKLSIlLyIgb3IgIiUuIiBtZWFucyByZWFkIHRoZSBmaXJzdCBsaW5lIGZyb20gdGhlCi1maWxlbmFtZSB0aGF0IGZvbGxvd3MgYWZ0ZXIgdGhlICUgY2hhcmFjdGVyLiAlIGJ5Ci1pdHNlbGYgbWVhbnMgcHJvbXB0IGZvciB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgotT3RoZXJ3aXNlOiAldXNlcjpwYXNzICAgRS5nLiBcZkItdW5peHB3XGZSICVmcmVkOnN3b3JkZmlzaAotRm9yIHRoZSBvdGhlciBjYXNlcyB1c2VyOnBhc3MgaXMgcmVhZCBmcm9tIHRoZSBpbmRpY2F0ZWQKLXNvdXJjZS4gIElmIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0ICdZIHVzZXInIGlzIHByaW50ZWQKLWFuZCB0aGUgcHJvZ3JhbSBleGl0IGNvZGUgaXMgMC4gIElmIHRoZSBwYXNzd29yZCBpcwotaW5jb3JyZWN0IGl0IHByaW50cyAnTiB1c2VyJyBhbmQgdGhlIGV4aXQgY29kZSBpcyAxLgotSWYgdGhlcmUgaXMgc29tZSBvdGhlciBlcnJvciB0aGUgZXhpdCBjb2RlIGlzIDIuCi1UaGlzIGZlYXR1cmUgZW5hYmxlcyB4MTF2bmMgdG8gYmUgYSBnZW5lcmFsIHVuaXggdXNlcgotcGFzc3dvcmQgY2hlY2tpbmcgdG9vbDsgaXQgY291bGQgYmUgdXNlZCBmcm9tIHNjcmlwdHMKLW9yIG90aGVyIHByb2dyYW1zLiAgVGhlc2UgJSBwYXNzd29yZCBjaGVja3MgYWxzbyBhcHBseQotdG8gdGhlIFxmQi11bml4cHdfbmlzXGZSIGFuZCBcZkItdW5peHB3X2NtZFxmUiBvcHRpb25zLgotLklQCi1Gb3IgdGhlICUgcGFzc3dvcmQgY2hlY2ssIGlmIHRoZSBlbnYuIHZhci4gVU5JWFBXX0NNRAotaXMgc2V0IHRvIGEgY29tbWFuZCB0aGVuIGl0IGlzIHJ1biBhcyB0aGUgdXNlciAoYXNzdW1pbmcKLXRoZSBwYXNzd29yZCBpcyBjb3JyZWN0LikgIFRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaXMKLW5vdCBwcmludGVkLCB0aGUgcHJvZ3JhbSBvciBzY3JpcHQgbXVzdCBtYW5hZ2UgdGhhdCBieQotc29tZSBvdGhlciBtZWFucy4gIFRoZSBleGl0IGNvZGUgb2YgeDExdm5jIHdpbGwgZGVwZW5kCi1vbiB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kIHRoYXQgaXMgcnVuLgotLklQCi1Vc2UgXGZCLW5vdW5peHB3XGZSIHRvIGRpc2FibGUgdW5peHB3IG1vZGUgaWYgaXQgd2FzIGVuYWJsZWQKLWVhcmxpZXIgaW4gdGhlIGNtZCBsaW5lIChlLmcuIFxmQi1zdmNcZlIgbW9kZSkKLS5QUAotXGZCLXVuaXhwd19uaXNcZlIgXGZJW2xpc3RdXGZSCi0uSVAKLUFzIFxmQi11bml4cHdcZlIgYWJvdmUsIGhvd2V2ZXIgZG8gbm90IHVzZSAKLS5JUiBzdSAoMSkKLWJ1dCByYXRoZXIKLXVzZSB0aGUgdHJhZGl0aW9uYWwgCi0uSVIgZ2V0cHduYW0gKDMpCi0rIAotLklSIGNyeXB0ICgzKQotbWV0aG9kIHRvCi12ZXJpZnkgcGFzc3dvcmRzLiBBbGwgb2YgdGhlIGFib3ZlIFxmQi11bml4cHdcZlIgb3B0aW9ucyBhbmQKLWNvbnN0cmFpbnRzIGFwcGx5LgotLklQCi1UaGlzIG1vZGUgcmVxdWlyZXMgdGhhdCB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcyBiZQotcmVhZGFibGUuICBFbmNyeXB0ZWQgcGFzc3dvcmRzIHN0b3JlZCBpbiAvZXRjL3NoYWRvdwotd2lsbCBiZSBpbmFjY2Vzc2libGUgdW5sZXNzIHgxMXZuYyBpcyBydW4gYXMgcm9vdC4KLS5JUAotVGhpcyBpcyBjYWxsZWQgIk5JUyIgbW9kZSBzaW1wbHkgYmVjYXVzZSBpbiBtb3N0Ci1OSVMgc2V0dXBzIHVzZXIgZW5jcnlwdGVkIHBhc3N3b3JkcyBhcmUgYWNjZXNzaWJsZQotKGUuZy4gInlwY2F0IHBhc3N3ZCIpIGJ5IGFuIG9yZGluYXJ5IHVzZXIgYW5kIHNvIHRoYXQKLXVzZXIgY2FuIGF1dGhlbnRpY2F0ZSBBTlkgdXNlci4KLS5JUAotTklTIGlzIG5vdCByZXF1aXJlZCBmb3IgdGhpcyBtb2RlIHRvIHdvcmsgKG9ubHkgdGhhdAotLklSIGdldHB3bmFtICgzKQotcmV0dXJuIHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmQgaXMgcmVxdWlyZWQpLAotYnV0IGl0IGlzIHVubGlrZWx5IGl0IHdpbGwgd29yayAoYXMgYW4gb3JkaW5hcnkgdXNlcikKLWZvciBtb3N0IG1vZGVybiBlbnZpcm9ubWVudHMgdW5sZXNzIE5JUyBpcyBhdmFpbGFibGUuCi1PbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiB4MTF2bmMgaXMgcnVuIGFzIHJvb3QgaXQgd2lsbAotYmUgYWJsZSB0byB0byBhY2Nlc3MgL2V0Yy9zaGFkb3cgZXZlbiBpZiBOSVMgaXMgbm90Ci1hdmFpbGFibGUgKG5vdGUgcnVubmluZyBhcyByb290IGlzIG9mdGVuIGRvbmUgd2hlbgotcnVubmluZyB4MTF2bmMgZnJvbSBpbmV0ZCBhbmQgeGRtL2dkbS9rZG0pLgotLklQCi1Mb29rZWQgYXQgYW5vdGhlciB3YXksIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlCi0uSVIgc3UgKDEpCi1tZXRob2QgcHJvdmlkZWQgYnkgXGZCLXVuaXhwd1xmUiAoaS5lLiBzdV92ZXJpZnkoKSksIHlvdQotY2FuIHJ1biB4MTF2bmMgYXMgcm9vdCBhbmQgdXNlIFxmQi11bml4cHdfbmlzLlxmUiAgQW55IHVzZXJzCi13aXRoIHBhc3N3b3JkcyBpbiAvZXRjL3NoYWRvdyBjYW4gdGhlbiBiZSBhdXRoZW50aWNhdGVkLgotLklQCi1JbiBcZkItdW5peHB3X25pc1xmUiBtb2RlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIGlzIHgxMXZuYydzCi11c2VyIHBhc3N3b3JkIHZlcmlmeWluZyBmdW5jdGlvbiBiYXNlZCBvbiBzdSBjYWxsZWQKLShpLmUuIHRoZSBmdW5jdGlvbiBzdV92ZXJpZnkoKSB0aGF0IHJ1bnMgL2Jpbi9zdQotaW4gYSBwc2V1ZG90ZXJtaW5hbCB0byB2ZXJpZnkgcGFzc3dvcmRzLikgIEhvd2V2ZXIsCi1pZiBcZkItdW5peHB3X25pc1xmUiBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFxmQi1maW5kXGZSCi1hbmQgXGZCLWNyZWF0ZVxmUiBcZkItZGlzcGxheVxmUiBXQUlUOi4uLiBtb2RlcyB0aGVuLCBpZiB4MTF2bmMgaXMKLXJ1bm5pbmcgYXMgcm9vdCwgL2Jpbi9zdSBtYXkgYmUgY2FsbGVkIGV4dGVybmFsbHkgdG8KLXJ1biB0aGUgZmluZCBvciBjcmVhdGUgY29tbWFuZHMuCi0uUFAKLVxmQi11bml4cHdfY21kXGZSIFxmSWNtZFxmUgotLklQCi1BcyBcZkItdW5peHB3XGZSIGFib3ZlLCBob3dldmVyIGRvIG5vdCB1c2UgCi0uSVIgc3UgKDEpCi1idXQgcmF0aGVyCi1ydW4gdGhlIGV4dGVybmFsbHkgc3VwcGxpZWQgY29tbWFuZCBcZkljbWRcZlIuICBUaGUgZmlyc3QKLWxpbmUgb2YgaXRzIHN0ZGluIHdpbGwgYmUgdGhlIHVzZXJuYW1lIGFuZCB0aGUgc2Vjb25kCi1saW5lIHRoZSByZWNlaXZlZCBwYXNzd29yZC4gIElmIHRoZSBjb21tYW5kIGV4aXRzCi13aXRoIHN0YXR1cyAwIChzdWNjZXNzKSB0aGUgVk5DIHVzZXIgd2lsbCBiZSBhY2NlcHRlZC4KLUl0IHdpbGwgYmUgcmVqZWN0ZWQgZm9yIGFueSBvdGhlciByZXR1cm4gc3RhdHVzLgotLklQCi1EeW5hbWljIHBhc3N3b3JkcyBhbmQgbm9uLXVuaXggcGFzc3dvcmRzLCBlLmcuIExEQVAsCi1jYW4gYmUgaW1wbGVtZW50ZWQgdGhpcyB3YXkgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGN1c3RvbQotaGVscGVyIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIHJlbW90ZSB2aWV3ZXIgaXMgZ2l2ZW4gMwotdHJpZXMgdG8gZW50ZXIgdGhlIGNvcnJlY3QgcGFzc3dvcmQsIGFuZCBzbyB0aGUgcHJvZ3JhbQotbWF5IGJlIGNhbGxlZCBpbiBhIHJvdyB0aGF0IG1hbnkgKG9yIG1vcmUpIHRpbWVzLgotLklQCi1JZiBhIGxpc3Qgb2YgYWxsb3dlZCB1c2VycyBpcyBuZWVkZWQgdG8gbGltaXQgd2hvIGNhbgotbG9nIGluLCB1c2UgXGZCLXVuaXhwd1xmUiBbbGlzdF0gaW4gYWRkaXRpb24gdG8gdGhpcyBvcHRpb24uCi0uSVAKLUluIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyB0aGUgXGZJY21kXGZSCi13aWxsIGFsc28gYmUgcnVuIHdpdGggdGhlIFJGQl9VTklYUFdfQ01EX1JVTiBlbnYuIHZhci4KLW5vbi1lbXB0eSBhbmQgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3BsYXkKLWZpbmQvY3JlYXRlIGNvbW1hbmQuICBUaGUgZmlyc3QgdHdvIGxpbmVzIG9mIGlucHV0IGFyZQotdGhlIHVzZXJuYW1lIGFuZCBwYXNzd2QgYXMgaW4gdGhlIG5vcm1hbCBjYXNlIGRlc2NyaWJlZAotYWJvdmUuICBUbyBzdXBwb3J0IEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSwKLVxmSWNtZFxmUiBzaG91bGQgcnVuIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBhcyB0aGUgdXNlcgotKGFuZCBtb3N0IGxpa2VseSByZWZ1c2luZyB0byBydW4gaXQgaWYgdGhlIHBhc3N3b3JkIGlzCi1ub3QgY29ycmVjdC4pICBIZXJlIGlzIGFuIGV4YW1wbGUgc2NyaXB0IChub3RlIGl0IGhhcwotYSBoYXJkd2lyZWQgYm9ndXMgcGFzc3dvcmQgImFiYyIhKQotLklQCi0jIS9iaW4vc2gKLSMgRXhhbXBsZSB4MTF2bmMgXGZCLXVuaXhwd19jbWRcZlIgc2NyaXB0LgotIyBSZWFkIHRoZSBmaXJzdCB0d28gbGluZXMgb2Ygc3RkaW4gKHVzZXIgYW5kIHBhc3N3ZCkKLXJlYWQgdXNlcgotcmVhZCBwYXNzCi0uSVAKLWRlYnVnPTAKLWlmIFsgJGRlYnVnID0gMSBdOyB0aGVuCi1lY2hvICJ1c2VyOiAkdXNlciIgMT4mMgotZWNobyAicGFzczogJHBhc3MiIDE+JjIKLWVudiB8IGVncmVwIFxmQi1pXGZSICdyZmJ8dm5jJyAxPiYyCi1maQotLklQCi0jIENoZWNrIGlmIHRoZSBwYXNzd29yZCBpcyB2YWxpZC4KLSMgKEEgcmVhbCBleGFtcGxlIHdvdWxkIHVzZSBsZGFwIGxvb2t1cCwgZXRjISkKLWlmIFsgIlgkcGFzcyIgIT0gIlhhYmMiIF07IHRoZW4KLWV4aXQgMQkjIGluY29ycmVjdCBwYXNzd29yZAotZmkKLS5JUAotaWYgWyAiWCRSRkJfVU5JWFBXX0NNRF9SVU4iID0gIlgiIF07IHRoZW4KLWV4aXQgMAkjIGNvcnJlY3QgcGFzc3dvcmQKLWVsc2UKLSMgUnVuIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCAoZmluZGRpc3BsYXkpCi1pZiBbICRkZWJ1ZyA9IDEgXTsgdGhlbgotZWNobyAicnVuOiAkUkZCX1VOSVhQV19DTURfUlVOIiAxPiYyCi1maQotZXhlYyAvYmluL3N1IC0gIiR1c2VyIiBcZkItY1xmUiAiJFJGQl9VTklYUFdfQ01EX1JVTiIKLWZpCi0uSVAKLUluIFxmQi11bml4cHdfY21kXGZSIG1vZGUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgaXMgeDExdm5jJ3MKLXVzZXIgcGFzc3dvcmQgdmVyaWZ5aW5nIGZ1bmN0aW9uIGJhc2VkIG9uIHN1IGNhbGxlZAotKGkuZS4gdGhlIGZ1bmN0aW9uIHN1X3ZlcmlmeSgpIHRoYXQgcnVucyAvYmluL3N1IGluIGEKLXBzZXVkb3Rlcm1pbmFsIHRvIHZlcmlmeSBwYXNzd29yZHMuKSAgSXQgaXMgdXAgdG8gdGhlCi1zdXBwbGllZCB1bml4cHdfY21kIHRvIGRvIHVzZXIgc3dpdGNoaW5nIGlmIGRlc2lyZWQKLWFuZCBpZiBpdCBoYXMgdGhlIHBlcm1pc3Npb25zIHRvIGRvIHNvLgotLlBQCi1cZkItZmluZFxmUgotLklQCi1GaW5kIHRoZSB1c2VyJ3MgZGlzcGxheSB1c2luZyBGSU5ERElTUExBWS4gVGhpcwotaXMgYW4gYWxpYXMgZm9yICJcZkItZGlzcGxheVxmUiBcZklXQUlUOmNtZD1GSU5ERElTUExBWVxmUiIuCi0uSVAKLU5vdGU6IGlmIGEgXGZCLWRpc3BsYXlcZlIgb2NjdXJzIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUKLWl0IHdpbGwgb3ZlcnJpZGUgdGhlIFxmQi1maW5kXGZSIHNldHRpbmcuCi0uSVAKLUZvciB0aGlzIGFuZCB0aGUgbmV4dCBmZXcgb3B0aW9ucyBzZWUgXGZCLWRpc3BsYXlcZlIgV0FJVDouLi4KLWJlbG93IGZvciBhbGwgb2YgdGhlIGRldGFpbHMuCi0uUFAKLVxmQi1maW5kZHB5XGZSCi0uSVAKLVJ1biB0aGUgRklORERJU1BMQVkgcHJvZ3JhbSwgcHJpbnQgb3V0IHRoZSBmb3VuZAotZGlzcGxheSAoaWYgYW55KSBhbmQgZXhpdC4gIE91dHB1dCBpcyBsaWtlOiBESVNQTEFZPTowLjAKLURJU1BMQVk9OjAuMCxYUElEPTEyMzQ1IG9yIERJU1BMQVk9OjAuMCxWVD03LiAgWFBJRCBpcwotdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGZvdW5kIFggc2VydmVyLiAgVlQgaXMgdGhlIExpbnV4Ci12aXJ0dWFsIHRlcm1pbmFsIG9mIHRoZSBYIHNlcnZlci4KLS5QUAotXGZCLWxpc3RkcHlcZlIKLS5JUAotSGF2ZSB0aGUgRklORERJU1BMQVkgcHJvZ3JhbSBsaXN0IGFsbCBvZiB5b3VyIGRpc3BsYXlzCi0oaS5lLiBhbGwgdGhlIFggZGlzcGxheXMgb24gdGhlIGxvY2FsIG1hY2hpbmUgdGhhdCB5b3UKLWhhdmUgYWNjZXNzIHJpZ2h0cyB0bykuICB4MTF2bmMgdGhlbiBleGl0cy4KLS5QUAotXGZCLWZpbmRhdXRoXGZSIFxmSVtkaXNwXVxmUgotLklQCi1BcHBseSB0aGUgXGZCLWZpbmQvLWZpbmRkcHlcZlIgaGV1cmlzdGljcyB0byB0cnkgdG8gZ3Vlc3MKLXRoZSBYQVVUSE9SSVRZIGZpbGUgZm9yIERJU1BMQVkgJ2Rpc3AnLiAgSWYgJ2Rpc3AnCi1pcyBub3Qgc3VwcGxpZWQsIHRoZW4gdGhlIHZhbHVlIGluIHRoZSBcZkItZGlzcGxheVxmUiBvbgotdGhlIGNtZGxpbmUgaXMgdXNlZDsgZmFpbGluZyB0aGF0ICRESVNQTEFZIGlzIHVzZWQ7Ci1hbmQgZmFpbGluZyB0aGF0ICI6MCIgaXMgdXNlZC4gIHgxMXZuYyB0aGVuIGV4aXRzLgotLklQCi1JZiBub3RoaW5nIGlzIHByaW50ZWQgb3V0LCB0aGF0IG1lYW5zIG5vIFhBVVRIT1JJVFkgd2FzCi1mb3VuZCBmb3IgJ2Rpc3AnOyBpLmUuIGZhaWx1cmUuICBJZiAiWEFVVEhPUklUWT0iCi1pcyBwcmludGVkIG91dCwgdGhhdCBtZWFucyB1c2UgdGhlIGRlZmF1bHQgKGkuZS4gZG8KLW5vdCBzZXQgWEFVVEhPUklUWSkuICBJZiAiWEFVVEhPUklUWT0vcGF0aC90by9maWxlIgotaXMgcHJpbnRlZCBvdXQsIHRoZW4gdXNlIHRoYXQgZmlsZS4KLS5JUAotWERNL0dETS9LRE06IGlmIHlvdSBhcmUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCBhbmQgd2FudAotdG8gZmluZCB0aGUgWEFVVEhPUklUWSBiZWZvcmUgYW55b25lIGhhcyBsb2dnZWQgaW50byBhbgotWCBzZXNzaW9uIHlldCwgdXNlOiB4MTF2bmMgXGZCLWVudlxmUiBGRF9YRE09MSBcZkItZmluZGF1dGhcZlIgLi4uCi0oVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeQotbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbi4pICBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwKLUZEX1hETT0xIHdpbGwgYmUgdHJpZWQgaWYgdGhlIGluaXRpYWwgXGZCLWZpbmRhdXRoXGZSIGZhaWxzLgotLlBQCi1cZkItY3JlYXRlXGZSCi0uSVAKLUZpcnN0IHRyeSB0byBmaW5kIHRoZSB1c2VyJ3MgZGlzcGxheSB1c2luZyBGSU5ERElTUExBWSwKLWlmIHRoYXQgZG9lc24ndCBzdWNjZWVkIGNyZWF0ZSBhbiBYIHNlc3Npb24gdmlhIHRoZQotRklORENSRUFURURJU1BMQVkgbWV0aG9kLiAgVGhpcyBpcyBhbiBhbGlhcyBmb3IKLSJcZkItZGlzcGxheVxmUiBcZklXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiXGZSIi4KLS5JUAotTm90ZTogaWYgYSBcZkItZGlzcGxheVxmUiBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQotaXQgd2lsbCBvdmVycmlkZSB0aGUgXGZCLWNyZWF0ZVxmUiBzZXR0aW5nLgotLklQCi1TU0ggTk9URTogZm9yIGJvdGggXGZCLWZpbmRcZlIgYW5kIFxmQi1jcmVhdGVcZlIgeW91IGNhbiAoc2hvdWxkISkKLWFkZCB0aGUgIlxmQi1sb2NhbGhvc3RcZlIiIG9wdGlvbiB0byBmb3JjZSBTU0ggdHVubmVsIGFjY2Vzcy4KLS5QUAotXGZCLXhkdW1teVxmUgotLklQCi1BcyBpbiBcZkItY3JlYXRlLFxmUiBleGNlcHQgWGR1bW15IGluc3RlYWQgb2YgWHZmYi4KLS5QUAotXGZCLXh2bmNcZlIKLS5JUAotQXMgaW4gXGZCLWNyZWF0ZSxcZlIgZXhjZXB0IFh2bmMgaW5zdGVhZCBvZiBYdmZiLgotLlBQCi1cZkIteHZuY19yZWRpcmVjdFxmUgotLklQCi1BcyBpbiBcZkItY3JlYXRlLFxmUiBleGNlcHQgWHZuYy5yZWRpcmVjdCBpbnN0ZWFkIG9mIFh2ZmIuCi0uUFAKLVxmQi14ZHVtbXlfeHZmYlxmUgotLklQCi1TZXRzIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVhkdW1teSxYdmZiCi0uUFAKLVxmQi1jcmVhdGVfeHNydlxmUiBcZklzdHJcZlIKLS5JUAotU2V0cyBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS08c3RyPiAgQ2FuIGJlIG9uIGNtZGxpbmUKLWFmdGVyIGFueXRoaW5nIHRoYXQgc2V0cyBXQUlUOi4uIGFuZCBvdGhlciB0aGluZ3MKLShlLmcuIFxmQi1zdmMsXGZSIFxmQi14ZG1zdmMpXGZSIHRvIGFkanVzdCB0aGUgWCBzZXJ2ZXIgbGlzdC4KLUV4YW1wbGU6IFxmQi1zdmNcZlIgLi4uIFxmQi1jcmVhdGVfeHNydlxmUiBYZHVtbXksWAotLlBQCi1cZkItc3ZjXGZSCi0uSVAKLVRlcm1pbmFsIHNlcnZpY2VzIG1vZGUgYmFzZWQgb24gU1NMIGFjY2Vzcy4gIEFsaWFzIGZvcgotXGZCLWRpc3BsYXlcZlIgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYiBcZkItdW5peHB3XGZSIFxmQi11c2Vyc1xmUgotdW5peHB3PSBcZkItc3NsXGZSIFNBVkUgICBBbHNvICJcZkItc2VydmljZVxmUiIuCi0uSVAKLU5vdGU6IGlmIGEgXGZCLWRpc3BsYXksXGZSIFxmQi11bml4cHcsXGZSIFxmQi11c2VycyxcZlIgb3IgXGZCLXNzbFxmUiBvY2N1cnMKLWxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUgaXQgd2lsbCBvdmVycmlkZSB0aGUgXGZCLXN2Y1xmUgotc2V0dGluZy4KLS5QUAotXGZCLXN2Y194ZHVtbXlcZlIKLS5JUAotQXMgXGZCLXN2Y1xmUiBleGNlcHQgWGR1bW15IGluc3RlYWQgb2YgWHZmYi4KLS5QUAotXGZCLXN2Y194dm5jXGZSCi0uSVAKLUFzIFxmQi1zdmNcZlIgZXhjZXB0IFh2bmMgaW5zdGVhZCBvZiBYdmZiLgotLlBQCi1cZkItc3ZjX3hkdW1teV94dmZiXGZSCi0uSVAKLUFzIFxmQi1zdmNcZlIgd2l0aCBYZHVtbXksWHZmYi4KLS5QUAotXGZCLXhkbXN2Y1xmUgotLklQCi1EaXNwbGF5IG1hbmFnZXIgVGVybWluYWwgc2VydmljZXMgbW9kZSBiYXNlZCBvbiBTU0wuCi1BbGlhcyBmb3IgXGZCLWRpc3BsYXlcZlIgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYi54ZG1jcAotXGZCLXVuaXhwd1xmUiBcZkItdXNlcnNcZlIgdW5peHB3PSBcZkItc3NsXGZSIFNBVkUgIEFsc28gIlxmQi14ZG1fc2VydmljZVxmUiIuCi0uSVAKLU5vdGU6IGlmIGEgXGZCLWRpc3BsYXksXGZSIFxmQi11bml4cHcsXGZSIFxmQi11c2VycyxcZlIgb3IgXGZCLXNzbFxmUiBvY2N1cnMKLWxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUgaXQgd2lsbCBvdmVycmlkZSB0aGUgXGZCLXhkbXN2Y1xmUgotc2V0dGluZy4KLS5JUAotVG8gY3JlYXRlIGEgc2Vzc2lvbiBhIHVzZXIgd2lsbCBoYXZlIHRvIGZpcnN0IGxvZyBpbgotdG8gdGhlIFxmQi11bml4cHdcZlIgZGlhbG9nIGFuZCB0aGVuIGxvZyBpbiBhZ2FpbiB0byB0aGUKLVhETS9HRE0vS0RNIHByb21wdC4gIFN1YnNlcXVlbnQgcmUtY29ubmVjdGlvbnMgd2lsbAotb25seSByZXF1aXJlIHRoZSBcZkItdW5peHB3XGZSIHBhc3N3b3JkLiAgU2VlIHRoZSBkaXNjdXNzaW9uCi11bmRlciBcZkItZGlzcGxheVxmUiBXQUlUOi4uLiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IFhETSwKLWV0YyBjb25maWd1cmF0aW9uLgotLklQCi1SZW1lbWJlciB0byBlbmFibGUgWERNQ1AgaW4gdGhlIHhkbS1jb25maWcsIGdkbS5jb25mLAotb3Iga2RtcmMgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIFxmQi1kaXNwbGF5XGZSIFdBSVQ6IGZvcgotbW9yZSBpbmZvLgotLlBQCi1cZkItc3NoeGRtc3ZjXGZSCi0uSVAKLURpc3BsYXkgbWFuYWdlciBUZXJtaW5hbCBzZXJ2aWNlcyBtb2RlIGJhc2VkIG9uIFNTSC4KLUFsaWFzIGZvciBcZkItZGlzcGxheVxmUiBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiLnhkbWNwCi1cZkItbG9jYWxob3N0LlxmUgotLklQCi1UaGUgXGZCLWxvY2FsaG9zdFxmUiBvcHRpb24gY29uc3RyYWlucyBjb25uZWN0aW9ucyB0byBjb21lCi1pbiB2aWEgYSBTU0ggdHVubmVsICh3aGljaCB3aWxsIHJlcXVpcmUgYSBsb2dpbikuCi1UbyBjcmVhdGUgYSBzZXNzaW9uIGEgdXNlciB3aWxsIGFsc28gaGF2ZSB0byBsb2cgaW50bwotdGhlIFhETSBHRE0gS0RNIHByb21wdC4gU3Vic2VxdWVudCByZS1jb25uZWN0aW9ucyB3aWxsCi1vbmx5IG9ubHkgcmVxdWlyZSB0aGUgU1NIIGxvZ2luLiAgU2VlIHRoZSBkaXNjdXNzaW9uCi11bmRlciBcZkItZGlzcGxheVxmUiBXQUlUOi4uLiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IFhETSwKLWV0YyBjb25maWd1cmF0aW9uLgotLklQCi1SZW1lbWJlciB0byBlbmFibGUgWERNQ1AgaW4gdGhlIHhkbS1jb25maWcsIGdkbS5jb25mLAotb3Iga2RtcmMgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIFxmQi1kaXNwbGF5XGZSIFdBSVQ6IGZvcgotbW9yZSBpbmZvLgotLlBQCi1cZkItdW5peHB3X3N5c3RlbV9ncmVldGVyXGZSCi0uSVAKLVByZXNlbnQgYSAiUHJlc3MgJ0VzY2FwZScgZm9yIFN5c3RlbSBHcmVldGVyIiBvcHRpb24KLXRvIHRoZSBjb25uZWN0aW5nIFZOQyBjbGllbnQgaW4gY29tYmluZWQgXGZCLXVuaXhwd1xmUgotYW5kIHhkbWNwIEZJTkRDUkVBVEVESVNQTEFZIG1vZGVzIChlLmcuIFxmQi14ZG1zdmMpLlxmUgotLklQCi1Ob3JtYWxseSBpbiBhIFxmQi11bml4cHdcZlIgbW9kZSB0aGUgVk5DIGNsaWVudCBtdXN0Ci1zdXBwbHkgYSB2YWxpZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gZ2FpbiBhY2Nlc3MuCi1Ib3dldmVyLCBpZiBcZkItdW5peHB3X3N5c3RlbV9ncmVldGVyXGZSIGlzIHN1cHBsaWVkIEFORAotdGhlIEZJTkRDUkVBVEVESVNQTEFZIGNvbW1hbmQgbWF0Y2hlcyAneGRtY3AnLCB0aGVuCi10aGUgdXNlciBoYXMgdGhlIG9wdGlvbiB0byBwcmVzcyBFc2NhcGUgYW5kIHRoZW4gZ2V0IGEKLVhETS9HRE0vS0RNIGxvZ2luL2dyZWV0ZXIgcGFuZWwgaW5zdGVhZC4gVGhleSB3aWxsIHRoZW4KLXN1cHBseSBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBkaXJlY3RseSB0byB0aGUgZ3JlZXRlci4KLS5JUAotT3RoZXJ3aXNlLCBpbiB4ZG1jcCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlIHRoZSB1c2VyCi1tdXN0IHN1cHBseSBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIFRXSUNFLiAgRmlyc3QgdG8KLXRoZSBpbml0aWFsIHVuaXhwdyBsb2dpbiBkaWFsb2csIGFuZCBzZWNvbmQgdG8gdGhlCi1zdWJzZXF1ZW50IFhETS9HRE0vS0RNIGdyZWV0ZXIuICBOb3RlIHRoYXQgaWYgdGhlIHVzZXIKLXJlLWNvbm5lY3RzIGFuZCBzdXBwbGllcyBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluCi10aGUgdW5peHB3IGRpYWxvZyB0aGUgeGRtY3AgZ3JlZXRlciBpcyBza2lwcGVkIGFuZAotaGUgaXMgY29ubmVjdGVkIGRpcmVjdGx5IHRvIGhpcyBleGlzdGluZyBYIHNlc3Npb24uCi1TbyB0aGUgXGZCLXVuaXhwd19zeXN0ZW1fZ3JlZXRlclxmUiBvcHRpb24gYXZvaWRzIHRoZSBleHRyYQotcGFzc3dvcmQgYXQgWCBzZXNzaW9uIGNyZWF0aW9uIHRpbWUuCi0uSVAKLUV4YW1wbGU6ICB4MTF2bmMgXGZCLXhkbXN2Y1xmUiBcZkItdW5peHB3X3N5c3RlbV9ncmVldGVyXGZSCi1TZWUgXGZCLXVuaXhwd1xmUiBhbmQgXGZCLWRpc3BsYXlcZlIgV0FJVDouLi4gZm9yIG1vcmUgaW5mby4KLS5JUAotVGhlIHNwZWNpYWwgb3B0aW9ucyBhZnRlciBhIGNvbG9uIGF0IHRoZSBlbmQgb2YgdGhlCi11c2VybmFtZSAoZS5nLiB1c2VyOnNvbGlkKSBkZXNjcmliZWQgdW5kZXIgXGZCLWRpc3BsYXlcZlIKLVdBSVQ6IGFyZSBhbHNvIGFwcGxpZWQgaW4gdGhpcyBtb2RlIGlmIHRoZXkgYXJlIHR5cGVkCi1pbiBiZWZvcmUgdGhlIHVzZXIgaGl0cyBFc2NhcGUuICBUaGUgdXNlcm5hbWUgaXMgaWdub3JlZAotYnV0IHRoZSBjb2xvbiBvcHRpb25zIGFyZSBub3QuCi0uSVAKLVRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgMiBsaW5lcyBpbiBhIHNtYWxsIGZvbnQsIHNldAotdGhlIGVudi4gdmFyLiBYMTFWTkNfU1lTVEVNX0dSRUVURVIxPXRydWUgZm9yIGEgMSBsaW5lCi1tZXNzYWdlIGluIGEgbGFyZ2VyIGZvbnQuCi0uSVAKLUlmIHRoZSB1c2VyIHByZXNzZWQgRXNjYXBlIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBjb21tYW5kCi13aWxsIGJlIHJ1biB3aXRoIHRoZSBlbnYuIHZhci4gWDExVk5DX1hETV9PTkxZPTEuCi0uSVAKLVJlbWVtYmVyIHRvIGVuYWJsZSBYRE1DUCBpbiB0aGUgeGRtLWNvbmZpZywgZ2RtLmNvbmYsCi1vciBrZG1yYyBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUgXGZCLWRpc3BsYXlcZlIgV0FJVDogZm9yCi1tb3JlIGluZm8uCi0uUFAKLVxmQi1yZWRpcmVjdFxmUiBcZklwb3J0XGZSCi0uSVAKLUFzIGluIEZJTkRDUkVBVEVESVNQTEFZLVh2bmMucmVkaXJlY3QgbW9kZSBleGNlcHQKLXJlZGlyZWN0IGltbWVkaWF0ZWx5IChpLmUuIHdpdGhvdXQgWCBzZXNzaW9uIGZpbmRpbmcKLW9yIGNyZWF0aW9uKSB0byBhIFZOQyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQuIFlvdQotY2FuIGFsc28gc3VwcGx5IGhvc3Q6cG9ydCB0byByZWRpcmVjdCB0byBhIGRpZmZlcmVudAotbWFjaGluZS4KLS5JUAotSWYgMCA8PSBwb3J0IDwgMjAwIGl0IGlzIHRha2VuIGFzIGEgVk5DIGRpc3BsYXkgKDU5MDAgaXMKLWFkZGVkIHRvIGdldCB0aGUgYWN0dWFsIHBvcnQpLCBpZiBwb3J0IDwgMCB0aGVuIFxmQi1wb3J0XGZSCi1pcyB1c2VkLgotLklQCi1Qcm9iYWJseSB0aGUgb25seSByZWFzb24gdG8gdXNlIHRoZSBcZkItcmVkaXJlY3RcZlIgb3B0aW9uCi1pcyBpbiBjb25qdW5jdGlvbiB3aXRoIFNTTCBzdXBwb3J0LCBlLmcuIFxmQi1zc2xcZlIgU0FWRS4KLVRoaXMgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gYWRkIFNTTCBlbmNyeXB0aW9uIHRvIGEgVk5DCi1zZXJ2ZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IFNTTCAoZS5nLiBYdm5jIG9yIHZuYy5zbykKLUluIGZhY3QsIHRoZSBwcm90b2NvbCBkb2VzIG5vdCBldmVuIG5lZWQgdG8gYmUgVk5DLAotYW5kIHNvICJcZkItcmZicG9ydFxmUiBcZklwb3J0MSBcZkItc3NsXGZSIFNBVkUgXGZCLXJlZGlyZWN0XGZSIGhvc3Q6cG9ydDJcZlIiCi1jYW4gYWN0IGFzIGEgcmVwbGFjZW1lbnQgZm9yIAotLklSIHN0dW5uZWwgKDEpLgotLklQCi1UaGlzIG1vZGUgb25seSBhbGxvd3Mgb25lIHJlZGlyZWN0ZWQgY29ubmVjdGlvbi4KLVRoZSBcZkItZm9yZXZlclxmUiBvcHRpb24gZG9lcyBub3QgYXBwbHkuICBVc2UgXGZCLWluZXRkXGZSIG9yCi1cZkItbG9vcFxmUiBmb3IgcGVyc2lzdGVudCBzZXJ2aWNlLgotLlBQCi1cZkItZGlzcGxheVxmUiBcZklXQUlUOi4uLlxmUgotLklQCi1BIHNwZWNpYWwgdXNhZ2UgbW9kZSBmb3IgdGhlIG5vcm1hbCBcZkItZGlzcGxheVxmUiBvcHRpb24uCi1Vc2VmdWwgd2l0aCBcZkItdW5peHB3LFxmUiBidXQgY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnRseQotb2YgaXQuICBJZiB0aGUgZGlzcGxheSBzdHJpbmcgYmVnaW5zIHdpdGggV0FJVDogdGhlbgoteDExdm5jIHdhaXRzIHVudGlsIGEgVk5DIGNsaWVudCBjb25uZWN0cyBiZWZvcmUgb3BlbmluZwotdGhlIFggZGlzcGxheSAob3IgXGZCLXJhd2ZiXGZSIGRldmljZSkuCi0uSVAKLVRoaXMgY291bGQgYmUgdXNlZnVsIGZvciBkZWxheWluZyBvcGVuaW5nIHRoZSBkaXNwbGF5Ci1mb3IgY2VydGFpbiB1c2FnZSBtb2RlcyAoc2F5IGlmIHgxMXZuYyBpcyBzdGFydGVkIGF0Ci1ib290IHRpbWUgYW5kIG5vIFggc2VydmVyIGlzIHJ1bm5pbmcgb3IgdXNlcnMgbG9nZ2VkCi1pbiB5ZXQpLgotLklQCi1JZiB0aGUgc3RyaW5nIGlzLCBlLmcuIFdBSVQ6MC4wIG9yIFdBSVQ6MSwgaS5lLiAiV0FJVCIKLWluIGZyb250IG9mIGEgbm9ybWFsIFggZGlzcGxheSwgdGhlbiB0aGF0IGluZGljYXRlZAotZGlzcGxheSBpcyB1c2VkLgotLklQCi1PbmUgY2FuIGFsc28gaW5zZXJ0IGEgZ2VvbWV0cnkgYmV0d2VlbiBjb2xvbnMsIGUuZy4KLVdBSVQ6MTI4MHgxMDI0Oi4uLiB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkgdGhlCi1WTkMgY2xpZW50IGZpcnN0IGF0dGFjaGVzIHRvIHNpbmNlIHNvbWUgVk5DIHZpZXdlcnMKLXdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRvIGEgbmV3IGZyYW1lYnVmZmVyIHNpemUuCi0uSVAKLUEgbW9yZSBpbnRlcmVzdGluZyBjYXNlIGlzIGxpa2UgdGhpczoKLS5JUAotV0FJVDpjbWQ9L3Vzci9sb2NhbC9iaW4vZmluZF9kaXNwbGF5Ci0uSVAKLWluIHdoaWNoIGNhc2UgdGhlIGNvbW1hbmQgYWZ0ZXIgImNtZD0iIGlzIHJ1biB0bwotZHluYW1pY2FsbHkgd29yayBvdXQgdGhlIERJU1BMQVkgYW5kIG9wdGlvbmFsbHkgdGhlCi1YQVVUSE9SSVRZIGRhdGEuICBUaGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWFuZCBvdXRwdXQKLW11c3QgYmUgb2YgdGhlIGZvcm0gRElTUExBWT08eGRpc3BsYXk+LiAgT24gTGludXgKLWlmIHRoZSB2aXJ0dWFsIHRlcm1pbmFsIGlzIGtub3duIGFwcGVuZCAiLFZUPW4iIHRvCi10aGlzIHN0cmluZyBhbmQgdGhlIAotLklSIGNodnQgKDEpCi1wcm9ncmFtIHdpbGwgYWxzbyBiZSBydW4uCi1BbnkgcmVtYWluaW5nIG91dHB1dCBpcyB0YWtlbiBhcyBYQVVUSE9SSVRZIGRhdGEuCi1JdCBjYW4gYmUgZWl0aGVyIG9mIHRoZSBmb3JtIFhBVVRIT1JJVFk9PGZpbGU+IG9yIHJhdwoteGF1dGhvcml0eSBkYXRhIGZvciB0aGUgZGlzcGxheS4gRm9yIGV4YW1wbGU7Ci0uSVAKLXhhdXRoIGV4dHJhY3QgLSAkRElTUExBWSIKLS5JUAotTk9URTogQXMgc3BlY2lmaWVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHlvdSBjYW4KLXN1cHBseSB5b3VyIG93biBXQUlUOmNtZD0uLi4gcHJvZ3JhbSBvciBzY3JpcHQsIEJVVAotdGhlcmUgYXJlIHR3byB2ZXJ5IHVzZWZ1bCAqQlVJTFQtSU4qIG9uZXM6IEZJTkRESVNQTEFZCi0oYWxpYXMgXGZCLWZpbmRcZlIgYWJvdmUpIGFuZCBGSU5EQ1JFQVRFRElTUExBWSAoYWxpYXMgXGZCLWNyZWF0ZVxmUgotYWJvdmUuKSAgTW9zdCBwZW9wbGUgdXNlIHRoZXNlIGluc3RlYWQgb2YgY3JlYXRpbmcKLXRoZWlyIG93biBzY3JpcHQuICBSZWFkIHRoZSBmb2xsb3dpbmcgKGVzcGVjaWFsbHkgdGhlCi1CVUlMVC1JTiBtb2RlcyBzZWN0aW9ucykgdG8gc2VlIGhvdyB0byBjb25maWd1cmUgdGhlc2UKLXR3byB1c2VmdWwgYnVpbHRpbiBcZkItZGlzcGxheVxmUiBXQUlUOiBtb2Rlcy4KLS5JUAotSW4gdGhlIGNhc2Ugb2YgXGZCLXVuaXhwd1xmUiAoYW5kIFxmQi11bml4cHdfbmlzXGZSIG9ubHkgaWYgeDExdm5jCi1pcyBydW5uaW5nIGFzIHJvb3QpLCB0aGVuIHRoZSBjbWQ9IGNvbW1hbmQgaXMgcnVuCi1hcyB0aGUgdXNlciB3aG8ganVzdCBhdXRoZW50aWNhdGVkIHZpYSB0aGUgbG9naW4gYW5kCi1wYXNzd29yZCBwcm9tcHQuCi0uSVAKLUluIHRoZSBjYXNlIG9mIFxmQi11bml4cHdfY21kLFxmUiB0aGUgY29tbWFuZHMgd2lsbCBhbHNvIGJlCi1ydW4gYXMgdGhlIGxvZ2dlZC1pbiB1c2VyLCBhcyBsb25nIGFzIHRoZSB1c2VyLXN1cHBsaWVkCi1oZWxwZXIgcHJvZ3JhbSBzdXBwb3J0cyBSRkJfVU5JWFBXX0NNRF9SVU4gKHNlZSB0aGUKLVxmQi11bml4cHdfY21kXGZSIG9wdGlvbi4pCi0uSVAKLUFsc28gaW4gdGhlIGNhc2Ugb2YgXGZCLXVuaXhwdyxcZlIgdGhlIHVzZXIgbG9nZ2luZyBpbiBjYW4KLXBsYWNlIGEgY29sb24gYXQgdGhlIGVuZCBvZiBoZXIgdXNlcm5hbWUgYW5kIHN1cHBseQotYSBmZXcgb3B0aW9uczogc2NhbGU9LCBzY2FsZV9jdXJzb3I9IChvciBzYz0pLCBzb2xpZAotKG9yIHNvKSwgaWQ9LCBjbGVhcl9tb2RzIChvciBjbSksIGNsZWFyX2tleXMgKG9yCi1jayksIGNsZWFyX2FsbCAob3IgY2EpLCByZXBlYXQsIHNwZWVkcz0gKG9yIHNwPSksCi1yZWFkdGltZW91dD0gKG9yIHJkPSksIHZpZXdvbmx5IChvciB2byksIG5vZGlzcGxheT0KLShvciBuZD0pLCByb3RhdGU9IChvciBybz0pLCBvciBub25jYWNoZSAob3IgbmMpLAotYWxsIHNlcGFyYXRlZCBieSBjb21tYXMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZS4KLUFmdGVyIHRoZSB1c2VyIGxvZ3MgaW4gc3VjY2Vzc2Z1bGx5LCB0aGVzZSBvcHRpb25zIHdpbGwKLWJlIGFwcGxpZWQgdG8gdGhlIFZOQyBzY3JlZW4uICBGb3IgZXhhbXBsZSwKLS5JUAotbG9naW46IGZyZWQ6c2NhbGU9My80LHNjPTEscmVwZWF0Ci1QYXNzd29yZDogLi4uCi0uSVAKLWxvZ2luOiBydW5nZTpzcD1tb2RlbSxyZD0xMjAsc29saWQKLS5JUAotZm9yIGNvbnZlbmllbmNlIG0vbiBpbXBsaWVzIHNjYWxlPSBlLmcuIGZyZWQ6My80ICBJZiB5b3UKLXR5cGUgYW5kIGVudGVyIHlvdXIgcGFzc3dvcmQgaW5jb3JyZWN0bHksIHRvIHJldHJpZXZlCi15b3VyIGxvbmcgImxvZ2luOiIgbGluZSBwcmVzcyB0aGUgVXAgYXJyb3cgb25jZQotKGJlZm9yZSB0eXBpbmcgYW55dGhpbmcgZWxzZSkuCi0uSVAKLU1vc3Qgb2YgdGhlc2UgY29sb24gb3B0aW9ucyBvbmx5IGFwcGx5IHRvIHRoZSBidWlsdGluCi1GSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbW9kZXMsIGJ1dCBub3RlCi10aGF0IHRoZXkgYXJlIHBhc3NlZCB0byB0aGUgZXh0cmVuYWwgY29tbWFuZCBpbiB0aGUKLWVudmlyb25tZW50IGFzIHdlbGwgYW5kIHNvIGNvdWxkIGJlIHVzZWQuCi0uSVAKLUluIHRoZSBsb2dpbiBwYW5lbCwgcHJlc3MgRjEgdG8gZ2V0IGEgbGlzdCBvZiB0aGUKLWF2YWlsYWJsZSBvcHRpb25zIHRoYXQgeW91IGNhbiBhZGQgYWZ0ZXIgdGhlIHVzZXJuYW1lLgotLklQCi1Bbm90aGVyIG9wdGlvbiBpcyAiZ2VvbT1XeEgiIG9yICJnZW9tPVd4SHhEIiAob3IKLWdlPSkuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGluIEZJTkRDUkVBVEVESVNQTEFZCi1tb2RlIHdoZW4gYSB2aXJ0dWFsIFggc2VydmVyIHN1Y2ggYXMgWHZmYiBpcyBnb2luZwotdG8gYmUgY3JlYXRlZC4gIEl0IHNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YKLXRoZSBuZXcgZGlzcGxheSwgYW5kIG9wdGlvbmFsbHkgdGhlIGNvbG9yIGRlcHRoIGFzCi13ZWxsLgotLklQCi1Zb3UgY2FuIGFsc28gc3VwcGx5ICJnbm9tZSIsICJrZGUiLCAidHdtIiwKLSJmdndtIiwgIm13bSIsICJkdHdtIiwgIndtYWtlciIsICJ4ZmNlIiwKLSJseGRlIiwgImVubGlnaHRlbm1lbnQiLCAiWHNlc3Npb24iLCBvcgotImZhaWxzYWZlIiAoc2FtZSBhcyAieHRlcm0iKSB0byBoYXZlIHRoZSBjcmVhdGVkCi1kaXNwbGF5IHVzZSB0aGF0IG1vZGUgZm9yIHRoZSB1c2VyIHNlc3Npb24uCi0uSVAKLVNwZWNpZnkgInRhZz0uLi4iIHRvIHNldCB0aGUgdW5pcXVlIEZEX1RBRyBkZXNrdG9wCi1zZXNzaW9uIHRhZyBkZXNjcmliZWQgYmVsb3cuICBOb3RlOiB0aGlzIG9wdGlvbiB3aWxsCi1iZSBpZ25vcmVkIGlmIHRoZSBGRF9UQUcgZW52LiB2YXIuIGlzIGFscmVhZHkgc2V0IG9yCi1pZiB0aGUgdmlld2VyLXNpZGUgc3VwcGxpZWQgdmFsdWUgaXMgbm90IGNvbXBsZXRlbHkKLWNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBvciAnXycgb3IgJy0nIGNoYXJhY3RlcnMuCi0uSVAKLVVzZXIgcHJlZmVyZW5jZXMgZmlsZTogSW5zdGVhZCBvZiBoYXZpbmcgdGhlIHVzZXIgdHlwZQotaW4gZ2VvbT1XeEgsLi4uIGV0Yy4gZXZlcnkgdGltZSBoZSBsb2dzIGluIHRvIGZpbmQKLW9yIGNyZWF0ZSBoaXMgWCBzZXNzaW9uLCBpZiB5b3Ugc2V0IEZEX1VTRVJQUkVGUyB0bwotYSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSAiLyIgY2hhcmFjdGVyLAotdGhlbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIHByZXBlbmRlZCB0byB0aGF0Ci1zdHJpbmcgYW5kIGlmIHRoZSBmaWxlIGV4aXN0cyBpdHMgZmlyc3QgbGluZSBpcyByZWFkCi1hbmQgYXBwZW5kZWQgdG8gYW55IG9wdGlvbnMgaGUgc3VwcGxpZWQgYXQgdGhlIGxvZ2luOgotcHJvbXB0LiAgRm9yIGV4YW1wbGUgXGZCLWVudlxmUiBGRF9VU0VSUFJFRlM9LngxMXZuY19jcmVhdGUKLWFuZCB0aGUgdXNlciBwdXQgImdlb209MTYwMHgxMjAwIiBpbiBoaXMKLX4vLngxMXZuY19jcmVhdGUgZmlsZS4KLS5JUAotVG8gZGlzYWJsZSB0aGUgb3B0aW9uIHNldHRpbmcgc2V0IHRoZSBlbnZpcm9ubWVudAotdmFyaWFibGUgWDExVk5DX05PX1VOSVhQV19PUFRTPTEgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYy4KLVRvIHNldCBhbnkgb3RoZXIgb3B0aW9ucywgdGhlIHVzZXIgY2FuIHVzZSB0aGUgZ3VpCi0oeDExdm5jIFxmQi1ndWlcZlIgY29ubmVjdCkgb3IgdGhlIHJlbW90ZSBjb250cm9sIG1ldGhvZAotKHgxMXZuYyBcZkItUlxmUiBvcHQ6dmFsKSBkdXJpbmcgaGlzIFZOQyBzZXNzaW9uLgotLklQCi1TbyB3ZSBzZWUgdGhlIGNvbWJpbmF0aW9uIG9mIFxmQi1kaXNwbGF5XGZSIFdBSVQ6Y21kPS4uLiBhbmQKLVxmQi11bml4cHdcZlIgYWxsb3dzIGF1dG9tYXRpYyBwYWlyaW5nIG9mIGFuIHVuaXgKLWF1dGhlbnRpY2F0ZWQgVk5DIHVzZXIgd2l0aCBoaXMgZGVza3RvcC4gIFRoaXMgY291bGQKLWJlIHZlcnkgdXNlZnVsIG9uIFN1blJheXMgYW5kIGFsc28gYW55IHN5c3RlbSB3aGVyZQotbXVsdGlwbGUgdXNlcnMgc2hhcmUgYSBnaXZlbiBtYWNoaW5lLiAgVGhlIHVzZXIgZG9lcwotbm90IG5lZWQgdG8gcmVtZW1iZXIgc3BlY2lhbCBwb3J0cyBvciBwYXNzd29yZHMgc2V0IHVwCi1mb3IgaGlzIGRlc2t0b3AgYW5kIFZOQy4KLS5JUAotQSBuaWNlIHdheSB0byB1c2UgV0FJVDpjbWQ9Li4uIGlzIG91dCBvZiAKLS5JUiBpbmV0ZCAoOCkKLShpdCBhdXRvbWF0aWNhbGx5IGZvcmtzIGEgbmV3IHgxMXZuYyBmb3IgZWFjaCB1c2VyKS4KLVlvdSBjYW4gaGF2ZSB0aGUgeDExdm5jIGluZXRkIHNwYXduZWQgcHJvY2VzcyBydW4gYXMsCi1zYXksIHJvb3Qgb3Igbm9ib2R5LiAgV2hlbiBydW4gYXMgcm9vdCAoZm9yIGVpdGhlciBpbmV0ZAotb3IgZGlzcGxheSBtYW5hZ2VyKSwgeW91IGNhbiBhbHNvIHN1cHBseSB0aGUgb3B0aW9uCi0iXGZCLXVzZXJzXGZSIFxmSXVuaXhwdz1cZlIiIHRvIGhhdmUgdGhlIHgxMXZuYyBwcm9jZXNzIHN3aXRjaCB0bwotdGhlIHVzZXIgYXMgd2VsbC4gIE5vdGU6IHRoZXJlIHdpbGwgYmUgYSAybmQgU1NMIGhlbHBlcgotcHJvY2VzcyB0aGF0IHdpbGwgbm90IHN3aXRjaCwgYnV0IGl0IGlzIG9ubHkgZW5jb2RpbmcKLWFuZCBkZWNvZGluZyB0aGUgZW5jcnlwdGVkIHN0cmVhbSBhdCB0aGF0IHBvaW50LgotLklQCi1CVUlMVC1JTiBtb2RlczoKLS5JUAotXGZCLS1cZlIgQXV0b21hdGljIEZpbmRpbmcgb2YgVXNlciBYIFNlc3Npb25zIFxmQi0tXGZSCi0uSVAKLUFzIGEgc3BlY2lhbCBjYXNlLCBXQUlUOmNtZD1GSU5ERElTUExBWSB3aWxsIHJ1biBhCi1zY3JpcHQgdGhhdCB3b3JrcyBvbiBtb3N0IFVuaXhlcyB0byBkZXRlcm1pbmUgYSB1c2VyJ3MKLURJU1BMQVkgdmFyaWFibGUgYW5kIHhhdXRob3JpdHkgZGF0YSAoc2VlIAotLklSIHdobyAoMSkKLSkuCi0uSVAKLU5PVEU6IFRoZSBvcHRpb24gIlxmQi1maW5kXGZSIiBpcyBhbiBhbGlhcyBmb3IgdGhpcyBtb2RlLgotLklQCi1UbyBoYXZlIHRoaXMgZGVmYXVsdCBzY3JpcHQgcHJpbnRlZCB0byBzdGRvdXQgKGUuZy4gZm9yCi1jdXN0b21pemF0aW9uKSBydW4gd2l0aCBXQUlUOmNtZD1GSU5ERElTUExBWS1wcmludCBUbwotaGF2ZSB0aGUgc2NyaXB0IHJ1biB0byBwcmludCB3aGF0IGRpc3BsYXkgaXQgd291bGQgZmluZAotdXNlICJcZkItZmluZGRweVxmUiIgb3IgV0FJVDpjbWQ9RklORERJU1BMQVktcnVuCi0uSVAKLVRoZSBzdGFuZGFyZCBzY3JpcHQgcnVucyAKLS5JUiB4ZHB5aW5mbyAoMSkKLXJ1biBvbiBwb3RlbnRpYWwKLWRpc3BsYXlzLiAgSWYgeW91ciBYIHNlcnZlcihzKSBoYXZlIGEgbG9naW4gZ3JlZXRlcgotdGhhdCBleGNsdXNpdmVseSBncmFicyB0aGUgWHNlcnZlciwgdGhlbiB4ZHB5aW5mbwotYmxvY2tzIGZvcmV2ZXIgYW5kIHRoaXMgbW9kZSB3aWxsIG5vdCB3b3JrLiAgU2VlCi13d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWRpc3BsYXktbWFuYWdlcgotZm9yIGhvdyB0byBkaXNhYmxlIHRoaXMgZm9yIGR0Z3JlZXQgb24gU29sYXJpcyBhbmQKLXBvc3NpYmx5IGZvciBvdGhlciBncmVldGVycy4KLS5JUAotSW4gXGZCLWZpbmQvY21kPUZJTkRESVNQTEFZXGZSIG1vZGUsIGlmIHlvdSBzZXQgRkRfWERNPTEsCi1lLmcuICd4MTF2bmMgXGZCLWVudlxmUiBGRF9YRE09MSBcZkItZmluZFxmUiAuLi4nIGFuZCB4MTF2bmMgaXMKLXJ1bm5pbmcgYXMgcm9vdCAoZS5nLiBpbmV0ZCkgdGhlbiBpdCB3aWxsIHRyeSB0byBmaW5kCi10aGUgWEFVVEhPUklUWSBmaWxlIG9mIGEgcnVubmluZyBYRE0vR0RNL0tETSBsb2dpbgotZ3JlZXRlciAoaS5lLiBubyB1c2VyIGhhcyBsb2dnZWQgaW50byBhbiBYIHNlc3Npb24geWV0LikKLS5JUAotQXMgYW5vdGhlciBzcGVjaWFsIGNhc2UsIFdBSVQ6Y21kPUhUVFBPTkNFIHdpbGwgYWxsb3cKLXgxMXZuYyB0byBzZXJ2aWNlIG9uZSBodHRwIHJlcXVlc3QgYW5kIHRoZW4gZXhpdC4KLVRoaXMgaXMgdXN1YWxseSBkb25lIGluIFxmQi1pbmV0ZFxmUiBtb2RlIHRvIHJ1biBvbiwgc2F5LAotcG9ydCA1ODAwIGFuZCBhbGxvdyB0aGUgSmF2YSB2bmN2aWV3ZXIgdG8gYmUgZG93bmxvYWRlZAotYnkgY2xpZW50IHdlYiBicm93c2Vycy4gIEZvciBleGFtcGxlOgotLklQCi01ODE1IHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgLy4uLi94MTF2bmMgXFwKLVxmQi1pbmV0ZFxmUiBcZkItcVxmUiBcZkItaHR0cF9zc2xcZlIgXGZCLXByb2dcZlIgLy4uLi94MTF2bmMgXFwKLVxmQi1kaXNwbGF5XGZSIFdBSVQ6Y21kPUhUVFBPTkNFCi0uSVAKLVdoZXJlIC8uLi4veDExdm5jIGlzIHRoZSBmdWxsIHBhdGggdG8geDExdm5jLgotSXQgaXMgdXNlZCBpbiB0aGUgQXBhY2hlIFNTTC1wb3J0YWwgZXhhbXBsZSAoc2VlIEZBUSkuCi0uSVAKLUluIHRoaXMgbW9kZSB5b3UgY2FuIHNldCBYMTFWTkNfU0tJUF9ESVNQTEFZIHRvIGEKLWNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRpc3BsYXlzIChlLmcuICI6MCw6MSIpIHRvCi1pZ25vcmUgaW4gdGhlIGZpbmRpbmcgcHJvY2Vzcy4gIFRoZSAiOiIgaXMgb3B0aW9uYWwuCi1SYW5nZXMgbi1tIGUuZy4gMC0yMCBjYW4gYWxzbyBiZSBzdXBwbGllZC4gVGhpcyBzdHJpbmcKLWNhbiBhbHNvIGJlIHNldCBieSB0aGUgY29ubmVjdGluZyB1c2VyIHZpYSAibmQ9IgotdXNpbmcgIisiIGluc3RlYWQgb2YgIiwiICBJZiAibmQ9YWxsIiBvciB5b3Ugc2V0Ci1YMTFWTkNfU0tJUF9ESVNQTEFZPWFsbCB0aGVuIGFsbCBkaXNwbGF5IGZpbmRpbmcgZmFpbHMKLWFzIGlmIHlvdSBzZXQgWDExVk5DX0ZJTkRESVNQTEFZX0FMV0FZU19GQUlMUz0xIChiZWxvdy4pCi0uSVAKLU9uIHNvbWUgc3lzdGVtcyAKLS5JUiBsc29mICgxKQotY2FuIGJlIHZlcnkgc2xvdy4gIFNldCB0aGUKLWVudi4gdmFyLiBGSU5EX0RJU1BMQVlfTk9fTFNPRj0xIHRvIHNraXAgdXNpbmcgbHNvZiB0bwotdHJ5IHRvIGZpbmQgdGhlIExpbnV4IFZUIHRoZSBYIHNlcnZlciBpcyBydW5uaW5nIG9uLgotc2V0IEZJTkRfRElTUExBWV9OT19WVF9GSU5EPTEgdG8gYXZvaWQgbG9va2luZyBhdCBhbGwuCi0uSVAKLVxmQi0tXGZSIEF1dG9tYXRpYyBDcmVhdGlvbiBvZiBVc2VyIFggU2Vzc2lvbnMgXGZCLS1cZlIKLS5JUAotQW4gaW50ZXJlc3Rpbmcgb3B0aW9uIGlzIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZCi10aGF0IGlzIGxpa2UgRklORERJU1BMQVkgaW4gdGhhdCBpcyB1c2VzIHRoZSBzYW1lIG1ldGhvZAotdG8gZmluZCBhbiBleGlzdGluZyBkaXNwbGF5LiAgSG93ZXZlciwgaWYgaXQgZG9lcyBub3QKLWZpbmQgb25lIGl0IHdpbGwgdHJ5IHRvICpzdGFydCogdXAgYW4gWCBzZXJ2ZXIgc2Vzc2lvbgotZm9yIHRoZSB1c2VyLiAgVGhpcyBpcyB0aGUgb25seSB0aW1lIHgxMXZuYyB0cmllcyB0bwotYWN0dWFsbHkgc3RhcnQgdXAgYW4gWCBzZXJ2ZXIuCi0uSVAKLU5PVEU6IFRoZSBvcHRpb24gIlxmQi1jcmVhdGVcZlIiIGlzIGFuIGFsaWFzIGZvciB0aGlzIG1vZGUuCi0uSVAKLUl0IHdpbGwgc3RhcnQgbG9va2luZyBmb3IgYW4gb3BlbiBkaXNwbGF5IG51bWJlciBhdCA6MjAKLU92ZXJyaWRlIHZpYSBYMTFWTkNfQ1JFQVRFX1NUQVJUSU5HX0RJU1BMQVlfTlVNQkVSPW4KLUJ5IGRlZmF1bHQgODAgWCBkaXNwbGF5cyBhcmUgYWxsb3dlZCAoaS5lLiBnb2luZyB0byA6OTkpCi1PdmVycmlkZSB2aWEgWDExVk5DX0NSRUFURV9NQVhfRElTUExBWVM9bgotLklQCi1Gb3IgaXRzIGhldXJpc3RpY3MsIHRoZSBjcmVhdGUgZGlzcGxheSBzY3JpcHQgc2V0cwotTENfQUxMPUMgc28gdGhhdCBjb21tYW5kIG91dHB1dCBpcyB1bmlmb3JtLiAgQnkgZGVmYXVsdAotaXQgd2lsbCB0cnkgdG8gcmVzdG9yZSBMQ19BTEwgcmlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZQotdXNlciBzZXNzaW9uLiAgSG93ZXZlciwgaWYgeW91IGRvbid0IG1pbmQgaXQga2VlcGluZwotTENfQUxMPUMgc2V0IHRoZSBlbnYuIHZhci46IFgxMVZOQ19DUkVBVEVfTENfQUxMX0NfT0s9MQotLklQCi1CeSBkZWZhdWx0IEZJTkRDUkVBVEVESVNQTEFZIHdpbGwgdHJ5IFh2ZmIgYW5kIHRoZW4KLVhkdW1teToKLS5JUAotVGhlIFhkdW1teSB3cmFwcGVyIGlzIHBhcnQgb2YgdGhlIHgxMXZuYyBzb3VyY2UgY29kZQotKHgxMXZuYy9taXNjL1hkdW1teSkgIEl0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gUEFUSAotYW5kIGhhdmUgcnVuICJYZHVtbXkgXGZCLWluc3RhbGwiXGZSIG9uY2UgdG8gY3JlYXRlIHRoZQotc2hhcmVkIGxpYnJhcnkuICBYZHVtbXkgb25seSB3b3JrcyBvbiBMaW51eC4gIEFzIG9mCi0xMi8yMDA5IGl0IG5vIGxvbmdlciBuZWVkcyB0byBiZSBydW4gYXMgcm9vdCwgYW5kIHRoZQotZGVmYXVsdCBpcyB0byBub3QgcnVuIGFzIHJvb3QuICBJbiBzb21lIGNpcmN1bXN0YW5jZXMKLXBlcm1pc3Npb25zIG1heSByZXF1aXJlIHJ1bm5pbmcgaXQgYXMgcm9vdCwgaW4gdGhlc2UKLWNhc2VzIHNwZWNpZnkgRkRfWERVTU1ZX1JVTl9BU19ST09UPTEsIHRoaXMgaXMgdGhlIHNhbWUKLWFzIHN1cHBseWluZyBcZkItcm9vdFxmUiB0byB0aGUgWGR1bW15IGNtZGxpbmUuCi0uSVAKLVh2ZmIgaXMgYXZhaWxhYmxlIG9uIG1vc3QgcGxhdGZvcm1zIGFuZCBkb2VzIG5vdAotcmVxdWlyZSByb290LgotLklQCi1BbiBhZHZhbnRhZ2Ugb2YgWGR1bW15IG92ZXIgWHZmYiBpcyB0aGF0IFhkdW1teSBzdXBwb3J0cwotUkFORFIgZHluYW1pYyBzY3JlZW4gcmVzaXppbmcuCi0uSVAKLVdoZW4geDExdm5jIGV4aXRzIChpLmUuIHVzZXIgZGlzY29ubmVjdHMpIHRoZSBYCi1zZXJ2ZXIgc2Vzc2lvbiBzdGF5cyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLgotVGhlIEZJTkRESVNQTEFZIHdpbGwgZmluZCBpdCBkaXJlY3RseSBuZXh0IHRpbWUuCi1UaGUgdXNlciBtdXN0IGV4aXQgdGhlIFggc2Vzc2lvbiBpbiB0aGUgdXN1YWwgd2F5IGZvcgotaXQgdG8gdGVybWluYXRlIChvciBraWxsIHRoZSBYIHNlcnZlciBwcm9jZXNzIGlmIGFsbAotZWxzZSBmYWlscykuCi0uSVAKLVRvIHRyb3VibGVzaG9vdCB0aGUgRklORENSRUFURURJU1BMQVkgbWVjaGFuaXNtLAotc2V0IHRoZSBmb2xsb3dpbmcgZW52LiB2YXIuIHRvIGFuIG91dHB1dCBsb2cgZmlsZSwKLWUuZyBcZkItZW52XGZSIENSRUFURV9ESVNQTEFZX09VVFBVVD0vdG1wL215ZGVidWcudHh0Ci0uSVAKLVNvIHRoaXMgaXMgYSBzb21ld2hhdCBvZGQgbW9kZSBmb3IgeDExdm5jIGluIHRoYXQgaXQKLXdpbGwgc3RhcnQgdXAgYW5kIHBvbGwgdmlydHVhbCBYIHNlcnZlcnMhICBUaGlzIGNhbgotYmUgdXNlZCBmcm9tLCBzYXksIAotLklSIGluZXRkICg4KQotdG8gcHJvdmlkZSBhIG1lYW5zIG9mCi1kZWZpbml0ZWx5IGdldHRpbmcgYSBkZXNrdG9wIChlaXRoZXIgcmVhbCBvciB2aXJ0dWFsKQotb24gdGhlIG1hY2hpbmUuICBFLmcuIGEgZGVza3RvcCBzZXJ2aWNlOgotLklQCi01OTAwIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgLy4uLi94MTF2bmMKLVxmQi1pbmV0ZFxmUiBcZkItcVxmUiBcZkItaHR0cFxmUiBcZkItc3NsXGZSIFNBVkUgXGZCLXVuaXhwd1xmUiBcZkItdXNlcnNcZlIgdW5peHB3PVxcCi1cZkItcGFzc3dkXGZSIHNlY3JldCBcZkItcHJvZ1xmUiAvLi4uL3gxMXZuYyBcXAotXGZCLWRpc3BsYXlcZlIgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVkKLS5JUAotV2hlcmUgLy4uLi94MTF2bmMgaXMgdGhlIGZ1bGwgcGF0aCB0byB4MTF2bmMuCi0uSVAKLVNlZSB0aGUgXGZCLXN2Yy8tc2VydmljZVxmUiBvcHRpb24gYWxpYXMgYWJvdmUuCi0uSVAKLUlmIGZvciBzb21lIHJlYXNvbiB5b3UgZG8gbm90IHdhbnQgeDExdm5jIHRvIGV2ZXIKLXRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIGRpc3BsYXkgc2V0IHRoZSBlbnYuIHZhcgotWDExVk5DX0ZJTkRESVNQTEFZX0FMV0FZU19GQUlMUz0xIChhbHNvIFxmQi1lbnZcZlIgLi4uKQotVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIFgxMVZOQ19TS0lQX0RJU1BMQVk9YWxsIG9yCi1zdXBwbHlpbmcgIm5kPWFsbCIgYWZ0ZXIgInVzZXJuYW1lOiIKLS5JUAotVXNlIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLXByaW50IHRvIHByaW50IG91dCB0aGUKLXNjcmlwdCB0aGF0IGlzIHVzZWQgZm9yIHRoaXMuCi0uSVAKLVlvdSBjYW4gc3BlY2lmeSB0aGUgcHJlZmVycmVkIFggc2VydmVyIG9yZGVyIHZpYSBlLmcuLAotV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15LFh2ZmIsWCAgYW5kL29yIGxlYXZlCi1vdXQgb25lcyB5b3UgZG8gbm90IHdhbnQuICBUaGUgdGhlIGNhc2UgIlgiIG1lYW5zIHRyeQotdG8gc3RhcnQgdXAgYSByZWFsLCBoYXJkd2FyZSBYIHNlcnZlciB1c2luZyAKLS5JUiB4aW5pdCAoMSkKLW9yIAotLklSIHN0YXJ0eCAoMSkuCi1JZiB0aGVyZSBpcyBhbHJlYWR5IGFuIFggc2VydmVyIHJ1bm5pbmcKLXRoZSBYIGNhc2UgbWF5IG9ubHkgd29yayBvbiBMaW51eCAoc2VlIAotLklSIHN0YXJ0eCAoMSkKLSkuCi0uSVAKLSJYdm5jIiB3aWxsIHN0YXJ0IHVwIGEgVk5DIFggc2VydmVyIChyZWFsLQotb3IgdGlnaHQtdm5jLCBlLmcuIHVzZSBpZiBYdmZiIGlzIG5vdCBhdmFpbGFibGUpLgotIlhzcnYiIHdpbGwgc3RhcnQgdXAgdGhlIHNlcnZlciBwcm9ncmFtIGluIHRoZQotdmFyaWFibGUgIkZEX1hTUlYiIGlmIGl0IGlzIG5vbi1lbXB0eS4gWW91IGNhbiBtYWtlCi10aGlzIGJlIGEgd3JhcHBlciBzY3JpcHQgaWYgeW91IGxpa2UgKGl0IG11c3QgaGFuZGxlIDpOLAotXGZCLWdlb21ldHJ5LFxmUiBhbmQgXGZCLWRlcHRoXGZSIGFuZCBvdGhlciBYIHNlcnZlciBvcHRpb25zKS4KLS5JUAotWW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEZEX0dFT00gKG9yCi1YMTFWTkNfQ1JFQVRFX0dFT00pIHRvIFd4SCBvciBXeEh4RCB0byBzZXQgdGhlIHdpZHRoCi1hbmQgaGVpZ2h0IGFuZCBvcHRpb25hbGx5IHRoZSBjb2xvciBkZXB0aCBvZiB0aGUKLWNyZWF0ZWQgZGlzcGxheS4gIFlvdSBjYW4gYWxzbyBzZXQgRkRfU0VTUyB0byBiZSB0aGUKLXNlc3Npb24gKHNob3J0IG5hbWUgb2YgdGhlIHdpbmRvd21hbmFnZXI6IGtkZSwgZ25vbWUsCi10d20sIGZhaWxzYWZlLCBldGMuKS4gRkRfT1BUUyBjb250YWlucyBleHRyYSBvcHRpb25zCi10byBwYXNzIHRvIHRoZSBYIHNlcnZlci4gWW91IGNhbiBhbHNvIHNldCBGRF9QUk9HIHRvCi1iZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzZXNzaW9uL3dpbmRvd21hbmFnZXIgcHJvZ3JhbS4KLS5JUAotTW9yZSBGRCB0cmlja3M6ICBGRF9DVVBTPXBvcnQgb3IgRkRfQ1VQUz1ob3N0OnBvcnQKLXdpbGwgc2V0IHRoZSBjdXBzIHByaW50aW5nIGVudmlyb25tZW50LiAgU2ltaWxhcmx5IGZvcgotRkRfRVNEPXBvcnQgb3IgRkRfRVNEPWhvc3Q6cG9ydCBmb3IgZXNkZHNwIHNvdW5kCi1yZWRpcmVjdGlvbi4gIFNldCBGRF9FWFRSQSB0byBhIGNvbW1hbmQgdG8gYmUgcnVuIGEKLWZldyBzZWNvbmRzIGFmdGVyIHRoZSBYIHNlcnZlciBzdGFydHMgdXAuICBTZXQgRkRfVEFHCi10byBiZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2Vzc2lvbiwgaXQgaXMgc2V0IGFzIGFuCi1YIHByb3BlcnR5LCB0aGF0IG1ha2VzIEZJTkRESVNQTEFZIG9ubHkgZmluZCBzZXNzaW9ucwotd2l0aCB0aGF0IHRhZyB2YWx1ZS4KLS5JUAotU2V0IEZEX1hETUNQX0lGIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZSB0aGF0IHRoZQotZGlzcGxheSBtYW5hZ2VyIGlzIHJ1bm5pbmcgb247IGRlZmF1bHQgaXMgJ2xvY2FsaG9zdCcKLWJ1dCB5b3UgbWF5IG5lZWQgdG8gc2V0IGl0IHRvICc6OjEnIG9uIHNvbWUgSVB2NiBvbmx5Ci1zeXN0ZW1zIG9yIG1pc2NvbmZpZ3VyZWQgZGlzcGxheSBtYW5hZ2Vycy4KLS5JUAotSWYgeW91IHdhbnQgdGhlIEZJTkRDUkVBVEVESVNQTEFZIHNlc3Npb24gdG8gY29udGFjdCBhbgotWERNQ1AgbG9naW4gbWFuYWdlciAoeGRtL2dkbS9rZG0pIG9uIHRoZSBzYW1lIG1hY2hpbmUsCi10aGVuIHVzZSAiWHZmYi54ZG1jcCIgaW5zdGVhZCBvZiAiWHZmYiIsIGV0Yy4KLVRoZSB1c2VyIHdpbGwgaGF2ZSB0byBzdXBwbHkgaGlzIHVzZXJuYW1lIGFuZCBwYXNzd29yZAotb25lIG1vcmUgdGltZSAoYnV0IGhlIGdldHMgdG8gc2VsZWN0IGhpcyBkZXNrdG9wIHR5cGUKLXNvIHRoYXQgY2FuIGJlIHVzZWZ1bCkuICBGb3IgdGhpcyB0byB3b3JrLCB5b3Ugd2lsbAotbmVlZCB0byBlbmFibGUgbG9jYWxob3N0IFhETUNQICh1ZHAgcG9ydCAxNzcpIGZvciB0aGUKLWRpc3BsYXkgbWFuYWdlci4gIFRoaXMgc2VlbXMgdG8gYmU6Ci0uSVAKLWZvciBnZG0gaW4gZ2RtLmNvbmY6ICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbeGRtY3BdCi1mb3Iga2RtIGluIGtkbXJjOiAgICAgIEVuYWJsZT10cnVlIGluIHNlY3Rpb24gW1hkbWNwXQotZm9yIHhkbSBpbiB4ZG0tY29uZmlnOiBEaXNwbGF5TWFuYWdlci5yZXF1ZXN0UG9ydDogMTc3Ci0uSVAKLVNlZSB0aGUgc2hvcnRoYW5kIG9wdGlvbnMgYWJvdmUgIlxmQi1zdmNcZlIiLCAiXGZCLXhkbXN2Y1xmUiIKLWFuZCAiXGZCLXNzaHhkbXN2Y1xmUiIgdGhhdCBzcGVjaWZ5IHRoZSBhYm92ZSBvcHRpb25zIGZvcgotc29tZSB1c2VmdWwgY2FzZXMuCi0uSVAKLUlmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFdBSVRCRz0xIHgxMXZuYyB3aWxsIGdvIGludG8KLXRoZSBiYWNrZ3JvdW5kIG9uY2UgbGlzdGVuaW5nIGluIHdhaXQgbW9kZS4KLS5JUAotQW5vdGhlciBzcGVjaWFsIG1vZGUgaXMgRklORENSRUFURURJU1BMQVktWHZuYy5yZWRpcmVjdCwKLShvciBGSU5ERElTUExBWS1Ydm5jLnJlZGlyZWN0KS4gIEluIHRoaXMgY2FzZSBpdCB3aWxsCi1zdGFydCB1cCBYdm5jIGFzIGFib3ZlIGlmIG5lZWRlZCwgYnV0IGluc3RlYWQgb2YKLXBvbGxpbmcgaXQgaW4gaXRzIG5vcm1hbCB3YXksIGl0IHNpbXBseSBkb2VzIGEgc29ja2V0Ci1yZWRpcmVjdGlvbiBvZiB0aGUgY29ubmVjdGVkIFZOQyB2aWV3ZXIgdG8gdGhlIFh2bmMuCi0uSVAKLVNvIGluIFh2bmMucmVkaXJlY3QgeDExdm5jIGRvZXMgbm8gVk5DIGJ1dCBtZXJlbHkKLXRyYW5zZmVycyB0aGUgZGF0YSBiYWNrIGFuZCBmb3J0aC4gIFRoaXMgc2hvdWxkIGJlCi1mYXN0ZXIgdGhlbiB4MTF2bmMncyBwb2xsaW5nIG1ldGhvZCwgYnV0IG5vdCBhcyBmYXN0Ci1hcyBjb25uZWN0aW5nIGRpcmVjdGx5IHRvIHRoZSBYdm5jIHdpdGggdGhlIFZOQyBWaWV3ZXIuCi1UaGUgaWRlYSBoZXJlIGlzIHRvIHRha2UgYWR2YW50YWdlIG9mIHgxMXZuYydzIGRpc3BsYXkKLWZpbmRpbmcvY3JlYXRpbmcgc2NoZW1lLCBTU0wsIGFuZCBwZXJoYXBzIGEgZmV3IG90aGVycy4KLU1vc3Qgb2YgeDExdm5jJ3Mgb3B0aW9ucyBkbyBub3QgYXBwbHkgaW4gdGhpcyBtb2RlLgotLklQCi1Ydm5jLnJlZGlyZWN0IHNob3VsZCBhbHNvIHdvcmsgZm9yIHRoZSB2bmMuc28gWCBzZXJ2ZXIKLW1vZHVsZSBmb3IgdGhlIGgvdyBkaXNwbGF5IGhvd2V2ZXIgaXQgd2lsbCB3b3JrIG9ubHkKLWZvciBmaW5kaW5nIHRoZSBkaXNwbGF5IGFuZCB0aGUgdXNlciBtdXN0IGFscmVhZHkgYmUKLWxvZ2dlZCBpbnRvIHRoZSBYIGNvbnNvbGUuCi0uUFAKLVxmQi12ZW5jcnlwdFxmUiBcZkltb2RlXGZSCi0uSVAKLVRoZSBWZU5DcnlwdCBleHRlbnNpb24gdG8gdGhlIFZOQyBwcm90b2NvbCBhbGxvd3MKLWVuY3J5cHRlZCBTU0wvVExTIGNvbm5lY3Rpb25zLiAgSWYgdGhlIFxmQi1zc2xcZlIgbW9kZSBpcwotZW5hYmxlZCwgdGhlbiBWZU5DcnlwdCBpcyBlbmFibGVkIGFzIHdlbGwgQlkgREVGQVVMVAotKHRoZXkgYm90aCB1c2UgYSBTU0wvVExTIHR1bm5lbCwgb25seSB0aGUgcHJvdG9jb2wKLWhhbmRzaGFrZSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQuKQotLklQCi1UbyBjb250cm9sIHdoZW4gYW5kIGhvdyBWZU5DcnlwdCBpcyB1c2VkLCBzcGVjaWZ5IHRoZQotbW9kZSBzdHJpbmcuICBJZiBtb2RlIGlzICJuZXZlciIsIHRoZW4gVmVOQ3J5cHQgaXMKLW5vdCB1c2VkLiAgSWYgbW9kZSBpcyAic3VwcG9ydCIgKHRoZSBkZWZhdWx0KSB0aGVuCi1WZU5DcnlwdCBpcyBzdXBwb3J0ZWQuICBJZiBtb2RlIGlzICJvbmx5IiwgdGhlbiB0aGUKLXNpbWlsYXIgYW5kIG9sZGVyIEFOT05UTFMgcHJvdG9jb2wgaXMgbm90IHNpbXVsdGFuZW91c2x5Ci1zdXBwb3J0ZWQuICB4MTF2bmMncyBub3JtYWwgU1NMIG1vZGUgKHZuY3M6Ly8pIHdpbGwgYmUKLXN1cHBvcnRlZCB1bmRlciBcZkItc3NsXGZSIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gImZvcmNlIi4KLS5JUAotSWYgbW9kZSBpcyBwcmVmaXhlZCB3aXRoICJub2RoOiIsIHRoZW4gRGlmZmllIEhlbGxtYW4KLWFub255bW91cyBrZXkgZXhjaGFuZ2UgaXMgZGlzYWJsZWQuICBJZiBtb2RlIGlzIHByZWZpeGVkCi13aXRoICJub3g1MDk6IiwgdGhlbiBYNTA5IGtleSBleGNoYW5nZSBpcyBkaXNhYmxlZC4KLS5JUAotVG8gZGlzYWJsZSBhbGwgQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIGFjY2VzcwotKHN1c2NlcHRpYmxlIHRvIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjaykgeW91IHdpbGwgbmVlZAotdG8gc3VwcGx5ICJcZkItdmVuY3J5cHRcZlIgXGZJbm9kaDpzdXBwb3J0IFxmQi1hbm9udGxzXGZSIG5ldmVyXGZSIgotb3IgIlxmQi12ZW5jcnlwdFxmUiBcZklub2RoOm9ubHlcZlIiCi0uSVAKLUlmIG1vZGUgaXMgcHJlZml4ZWQgd2l0aCAibmV3ZGg6IiwgdGhlbiBuZXcgRGlmZmllCi1IZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uCi0odGhpcyBjYW4gYmUgdGltZSBjb25zdW1pbmc6IDEtNjAgc2Vjczsgc2VlIFxmQi1kaHBhcmFtc1xmUgotYmVsb3cgZm9yIGEgZmFzdGVyIHdheSkgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCi1maXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHkKLWtub3duIHZhbHVlcyBpcyBub3Qga25vd24gdG8gYmUgYSBzZWN1cml0eSBwcm9ibGVtLgotVGhpcyBzZXR0aW5nIGFwcGxpZXMgdG8gQU5PTlRMUyBhcyB3ZWxsLgotLklQCi1Mb25nIGV4YW1wbGU6IFxmQi12ZW5jcnlwdFxmUiBuZXdkaDpub3g1MDk6c3VwcG9ydAotLklQCi1BbHNvLCBpZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggInBsYWluOiIsIHRoZW4KLWlmIFxmQi11bml4cHdcZlIgbW9kZSBpcyBhY3RpdmUgdGhlIFZlTkNyeXB0ICIqUGxhaW4iCi11c2VybmFtZStwYXNzd2QgbWV0aG9kIGlzIGVuYWJsZWQgZm9yIFVuaXggbG9naW5zLgotT3RoZXJ3aXNlIGluIFxmQi11bml4cHdcZlIgbW9kZSB0aGUgbm9ybWFsIGxvZ2luIHBhbmVsIGlzCi1wcm92aWRlZC4KLS5JUAotWW91ICpNVVNUKiBzdXBwbHkgdGhlIFxmQi1zc2xcZlIgb3B0aW9uIGZvciBWZU5DcnlwdCB0bwotYmUgYWN0aXZlLiAgVGhlIFxmQi12ZW5jcnlwdFxmUiBvcHRpb24gb25seSBmaW5lLXR1bmVzIGl0cwotb3BlcmF0aW9uLgotLlBQCi1cZkItYW5vbnRsc1xmUiBcZkltb2RlXGZSCi0uSVAKLVRoZSBBTk9OVExTIGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93cwotZW5jcnlwdGVkIFNTTC9UTFMgY29ubmVjdGlvbnMuICBJZiB0aGUgXGZCLXNzbFxmUiBtb2RlIGlzCi1lbmFibGVkLCB0aGVuIEFOT05UTFMgaXMgZW5hYmxlZCBhcyB3ZWxsIEJZIERFRkFVTFQKLSh0aGV5IGJvdGggdXNlIGEgU1NML1RMUyB0dW5uZWwsIG9ubHkgdGhlIHByb3RvY29sCi1oYW5kc2hha2UgaXMgYSBsaXR0bGUgZGlmZmVyZW50LikKLS5JUAotQU5PTlRMUyBpcyBhbiBvbGRlciBTU0wvVExTIG1vZGUgaW50cm9kdWNlZCBieSB2aW5vLgotLklQCi1JdCBpcyByZWZlcnJlZCB0byBhcyAnVExTJyBmb3IgaXRzIHJlZ2lzdGVyZWQgVk5DCi1zZWN1cml0eS10eXBlIG5hbWUsIGJ1dCB3ZSB1c2UgdGhlIG1vcmUgZGVzY3JpcHRpdmUKLVwnQU5PTlRMUycgaGVyZSBiZWNhdXNlIGl0IHByb3ZpZGVzIG9ubHkgQW5vbnltb3VzCi1EaWZmaWUtSGVsbG1hbiBlbmNyeXB0ZWQgY29ubmVjdGlvbnMsIGFuZCBoZW5jZSBubwotcG9zc2liaWxpdHkgZm9yIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uLgotLklQCi1UbyBjb250cm9sIHdoZW4gYW5kIGhvdyBBTk9OVExTIGlzIHVzZWQsIHNwZWNpZnkgdGhlCi1tb2RlIHN0cmluZy4gIElmIG1vZGUgaXMgIm5ldmVyIiwgdGhlbiBBTk9OVExTIGlzIG5vdAotdXNlZC4gIElmIG1vZGUgaXMgInN1cHBvcnQiICh0aGUgZGVmYXVsdCkgdGhlbiBBTk9OVExTCi1pcyBzdXBwb3J0ZWQuICBJZiBtb2RlIGlzICJvbmx5IiwgdGhlbiB0aGUgc2ltaWxhcgotVmVOQ3J5cHQgcHJvdG9jb2wgaXMgbm90IHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZC4KLXgxMXZuYydzIG5vcm1hbCBTU0wgbW9kZSAodm5jczovLykgd2lsbCBiZSBzdXBwb3J0ZWQKLXVuZGVyIFxmQi1zc2xcZlIgdW5sZXNzIHlvdSBzZXQgbW9kZSB0byAiZm9yY2UiLgotLklQCi1JZiBtb2RlIGlzIHByZWZpeGVkIHdpdGggIm5ld2RoOiIsIHRoZW4gbmV3IERpZmZpZQotSGVsbG1hbiBwYXJhbWV0ZXJzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggY29ubmVjdGlvbgotKHRoaXMgY2FuIGJlIHRpbWUgY29uc3VtaW5nOiAxLTYwIHNlY3M7IHNlZSBcZkItZGhwYXJhbXNcZlIKLWJlbG93IGZvciBhIGZhc3RlciB3YXkpIHJhdGhlciB0aGFuIHVzaW5nIHRoZQotZml4ZWQgdmFsdWVzIGluIHRoZSBwcm9ncmFtLiAgVXNpbmcgZml4ZWQsIHB1YmxpY2x5Ci1rbm93biB2YWx1ZXMgaXMgbm90IGtub3duIHRvIGJlIGEgc2VjdXJpdHkgcHJvYmxlbS4KLVRoaXMgc2V0dGluZyBhcHBsaWVzIHRvIFZlTkNyeXB0IGFzIHdlbGwuICBTZWUgdGhlCi1kZXNjcmlwdGlvbiBvZiAicGxhaW46IiB1bmRlciBcZkItdmVuY3J5cHQuXGZSCi0uSVAKLUxvbmcgZXhhbXBsZTogXGZCLWFub250bHNcZlIgbmV3ZGg6cGxhaW46c3VwcG9ydAotLklQCi1Zb3UgKk1VU1QqIHN1cHBseSB0aGUgXGZCLXNzbFxmUiBvcHRpb24gZm9yIEFOT05UTFMgdG8KLWJlIGFjdGl2ZS4gIFRoZSBcZkItYW5vbnRsc1xmUiBvcHRpb24gb25seSBmaW5lLXR1bmVzIGl0cwotb3BlcmF0aW9uLgotLlBQCi1cZkItc3Nsb25seVxmUgotLklQCi1TYW1lIGFzOiAiXGZCLXZlbmNyeXB0XGZSIFxmSW5ldmVyIFxmQi1hbm9udGxzXGZSIG5ldmVyXGZSIiAgaS5lLiBpdAotZGlzYWJsZXMgdGhlIFZlTkNyeXB0IGFuZCBBTk9OVExTIGVuY3J5cHRpb24gbWV0aG9kcwotYW5kIG9ubHkgYWxsb3dzIHN0YW5kYXJkIFNTTCB0dW5uZWxpbmcuICBZb3UgbXVzdCBhbHNvCi1zdXBwbHkgdGhlIFxmQi1zc2xcZlIgLi4uIG9wdGlvbiAoc2VlIGJlbG93LikKLS5QUAotXGZCLWRocGFyYW1zXGZSIFxmSWZpbGVcZlIKLS5JUAotRm9yIHNvbWUgb3BlcmF0aW9ucyBhIHNldCBvZiBEaWZmaWUgSGVsbG1hbiBwYXJhbWV0ZXJzCi0ocHJpbWUgYW5kIGdlbmVyYXRvcikgaXMgbmVlZGVkLiAgSWYgc28sIHVzZSB0aGUKLXBhcmFtZXRlcnMgaW4gXGZJZmlsZVxmUi4gSW4gcGFydGljdWxhciwgdGhlIFZlTkNyeXB0IGFuZAotQU5PTlRMUyBhbm9ueW1vdXMgREggbW9kZSBuZWVkIHRoZW0uICBCeSBkZWZhdWx0IGEKLWZpeGVkIHNldCBpcyB1c2VkLiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhhdCB5b3UKLWNhbiBzcGVjaWZ5ICJuZXdkaDoiIHRvIHRoZSBcZkItdmVuY3J5cHRcZlIgYW5kIFxmQi1hbm9udGxzXGZSCi1vcHRpb25zIHRvIGdlbmVyYXRlIGEgbmV3IHNldCBlYWNoIHNlc3Npb24uICBJZiB0aGF0Ci1pcyB0b28gc2xvdyBmb3IgeW91LCB1c2UgXGZCLWRocGFyYW1zXGZSIGZpbGUgdG8gYSBzZXQgeW91Ci1jcmVhdGVkIG1hbnVhbGx5IHZpYSAib3BlbnNzbCBkaHBhcmFtIFxmQi1vdXRcZlIgZmlsZSAxMDI0IgotLlBQCi1cZkItbm9zc2xcZlIKLS5JUAotRGlzYWJsZSB0aGUgXGZCLXNzbFxmUiBvcHRpb24gKHNlZSBiZWxvdykuIFNpbmNlIFxmQi1zc2xcZlIgaXMgb2ZmCi1ieSBkZWZhdWx0IFxmQi1ub3NzbFxmUiB3b3VsZCBvbmx5IGJlIHVzZWQgb24gdGhlIGNvbW1hbmRsaW5lCi10byB1bnNldCBhbnkgKmVhcmxpZXIqIFxmQi1zc2xcZlIgb3B0aW9uIChvciBcZkItc3ZjLi4uKVxmUgotLlBQCi1cZkItc3NsXGZSIFxmSVtwZW1dXGZSCi0uSVAKLVVzZSB0aGUgb3BlbnNzbCBsaWJyYXJ5ICh3d3cub3BlbnNzbC5vcmcpIHRvIHByb3ZpZGUgYQotYnVpbHQtaW4gZW5jcnlwdGVkIFNTTC9UTFMgdHVubmVsIGJldHdlZW4gVk5DIHZpZXdlcnMKLWFuZCB4MTF2bmMuICBUaGlzIHJlcXVpcmVzIGxpYnNzbCBzdXBwb3J0IHRvIGJlCi1jb21waWxlZCBpbnRvIHgxMXZuYyBhdCBidWlsZCB0aW1lLiAgSWYgeDExdm5jIGlzIG5vdAotYnVpbHQgd2l0aCBsaWJzc2wgc3VwcG9ydCBpdCB3aWxsIGV4aXQgaW1tZWRpYXRlbHkgd2hlbgotXGZCLXNzbFxmUiBpcyBwcmVzY3JpYmVkLiAgU2VlIHRoZSBcZkItc3R1bm5lbFxmUiBvcHRpb24gYmVsb3cgZm9yCi1hbiBhbHRlcm5hdGl2ZS4KLS5JUAotVGhlIFZOQyBWaWV3ZXItc2lkZSBuZWVkcyB0byBzdXBwb3J0IFNTTC9UTFMgYXMgd2VsbC4KLVNlZSB0aGlzIFVSTCBhbmQgYWxzbyB0aGUgZGlzY3Vzc2lvbiBiZWxvdyBmb3IKLWlkZWFzIG9uIGhvdyB0byBlbmFibGUgU1NMIHN1cHBvcnQgZm9yIHRoZSB2aWV3ZXI6Ci1odHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zc2wtdHVuCi1uZWwtdmlld2VycyAuICB4MTF2bmMgcHJvdmlkZXMgYW4gU1NMIGVuYWJsZWQgSmF2YQotdmlld2VyIGFwcGxldCBpbiB0aGUgY2xhc3Nlcy9zc2wgZGlyZWN0b3J5ICgtaHR0cCBvcgotXGZCLWh0dHBkaXJcZlIgb3B0aW9ucy4pICBUaGUgU1NWTkMgdmlld2VyIHBhY2thZ2Ugc3VwcG9ydHMKLVNTTCB0dW5uZWxzIHRvby4KLS5JUAotSWYgdGhlIFZOQyBWaWV3ZXIgc3VwcG9ydHMgVmVOQ3J5cHQgb3IgQU5PTlRMUyAodmlubydzCi1lbmNyeXB0aW9uIG1vZGUpIHRoZXkgYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoZSBcZkItc3NsXGZSCi1tb2RlIChzZWUgdGhlIFxmQi12ZW5jcnlwdFxmUiBhbmQgXGZCLWFub250bHNcZlIgb3B0aW9ucyBmb3IgbW9yZQotaW5mbzsgdXNlIFxmQi1zc2xvbmx5XGZSIHRvIGRpc2FibGUgYm90aCBvZiB0aGVtLikKLS5JUAotVXNlICJcZkItc3NsXGZSIFxmSS9wYXRoL3RvL215Y2VydC5wZW1cZlIiIHRvIHNwZWNpZnkgYW4gU1NMCi1jZXJ0aWZpY2F0ZSBmaWxlIGluIFBFTSBmb3JtYXQgdG8gdXNlIHRvIGlkZW50aWZ5IGFuZAotcHJvdmlkZSBhIGtleSBmb3IgdGhpcyBzZXJ2ZXIuICBTZWUgCi0uSVIgb3BlbnNzbCAoMSkKLWZvciBtb3JlCi1pbmZvIGFib3V0IFBFTXMgYW5kIHRoZSBcZkItc3NsR2VuQ2VydFxmUiBhbmQgIlxmQi1zc2xcZlIgXGZJU0FWRVxmUiIKLW9wdGlvbnMgYmVsb3cgZm9yIGhvdyB0byBjcmVhdGUgdGhlbS4KLS5JUAotVGhlIGNvbm5lY3RpbmcgVk5DIHZpZXdlciBTU0wgdHVubmVsIGNhbiAoYXQgaXRzIG9wdGlvbikKLWF1dGhlbnRpY2F0ZSB0aGlzIHNlcnZlciBpZiBpdCBoYXMgdGhlIHB1YmxpYyBrZXkgcGFydAotb2YgdGhlIGNlcnRpZmljYXRlIChvciBhIGNvbW1vbiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHksCi1DQSwgaXMgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgd2F5IHRvIHZlcmlmeSB0aGlzIHNlcnZlcidzCi1jZXJ0LCBzZWUgXGZCLXNzbEdlbkNBXGZSIGJlbG93KS4gIFRoaXMgYXV0aGVudGljYXRpb24gaXMKLWRvbmUgdG8gcHJldmVudCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiAgT3RoZXJ3aXNlLAotaWYgdGhlIFZOQyB2aWV3ZXIgc2ltcGx5IGFjY2VwdHMgdGhpcyBzZXJ2ZXIncyBrZXkKLVdJVEhPVVQgdmVyaWZpY2F0aW9uLCB0aGUgdHJhZmZpYyBpcyBwcm90ZWN0ZWQgZnJvbQotcGFzc2l2ZSBzbmlmZmluZyBvbiB0aGUgbmV0d29yaywgYnV0ICpOT1QqIGZyb20KLU1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuIFRoZXJlIGFyZSBoYWNrZXIgdG9vbHMKLWxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4gdGhhdCBpbXBsZW1lbnQgU1NMCi1NYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLgotLklQCi1JZiBbcGVtXSBpcyBlbXB0eSBvciB0aGUgc3RyaW5nICJTQVZFIiB0aGVuIHRoZQotLklSIG9wZW5zc2wgKDEpCi1jb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIHRvIGdlbmVyYXRlIHRoZQotY2VydGlmaWNhdGUgdGhlIGZpcnN0IHRpbWUuICBBIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlCi1pcyBnZW5lcmF0ZWQgKHNlZSBcZkItc3NsR2VuQ0FcZlIgYW5kIFxmQi1zc2xHZW5DZXJ0XGZSIGZvciB1c2UKLW9mIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5LikgIEl0IHdpbGwgYmUgc2F2ZWQgdG8gdGhlCi1maWxlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtLiAgT24gc3Vic2VxdWVudCBjYWxscyBpZgotdGhhdCBmaWxlIGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KLS5JUAotVXNlICJTQVZFX05PUFJPTVBUIiB0byBhdm9pZCBiZWluZyBwcm9tcHRlZCB0bwotcHJvdGVjdCB0aGUgZ2VuZXJhdGVkIGtleSB3aXRoIGEgcGFzc3BocmFzZS4gIEhvd2V2ZXIgaW4KLVxmQi1pbmV0ZFxmUiBhbmQgXGZCLWJnXGZSIG1vZGVzIHRoZXJlIHdpbGwgYmUgbm8gcHJvbXB0aW5nIGZvciBhCi1wYXNzcGhyYXNlIGluIGVpdGhlciBjYXNlLgotLklQCi1JZiBbcGVtXSBpcyAiU0FWRV9QUk9NUFQiIHRoZSBzZXJ2ZXIucGVtIGNlcnRpZmljYXRlCi13aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24geW91ciBhbnN3ZXJzIHRvIGl0cyBwcm9tcHRzIGZvcgotYWxsIGluZm8gc3VjaCBhcyBPcmdhbml6YXRpb25hbE5hbWUsIENvbW1vbk5hbWUsIGV0Yy4KLS5JUAotVXNlICJTQVZFLTxzdHJpbmc+IiBhbmQgIlNBVkVfUFJPTVBULTxzdHJpbmc+IgotdG8gcmVmZXIgdG8gdGhlIGZpbGUgfi8udm5jL2NlcnRzL3NlcnZlci08c3RyaW5nPi5wZW0KLWluc3RlYWQgKGl0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkKLWV4aXN0KS4gIEUuZy4gIlNBVkUtY2hhcmxpZSIgd2lsbCBzdG9yZSB0byB0aGUgZmlsZQotfi8udm5jL2NlcnRzL3NlcnZlci1jaGFybGllLnBlbQotLklQCi1FeGFtcGxlczogeDExdm5jIFxmQi1zc2xcZlIgU0FWRSBcZkItZGlzcGxheVxmUiA6MCAuLi4KLXgxMXZuYyBcZkItc3NsXGZSIFNBVkUtc29tZW90aGVyIFxmQi1kaXNwbGF5XGZSIDowIC4uLgotLklQCi1JZiBbcGVtXSBpcyAiVE1QIiBhbmQgdGhlIAotLklSIG9wZW5zc2wgKDEpCi11dGlsaXR5Ci1jb21tYW5kIGV4aXN0cyBpbiBQQVRILCB0aGVuIGEgdGVtcG9yYXJ5LCBzZWxmLXNpZ25lZAotY2VydGlmaWNhdGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgc2Vzc2lvbi4gIElmCi0uSVIgb3BlbnNzbCAoMSkKLWNhbm5vdCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgdGVtcG9yYXJ5Ci1jZXJ0aWZpY2F0ZSB4MTF2bmMgZXhpdHMgaW1tZWRpYXRlbHkuICBUaGUgdGVtcG9yYXJ5Ci1jZXJ0IHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4geDExdm5jIGV4aXRzLgotLklQCi1JZiBzdWNjZXNzZnVsIGluIHVzaW5nIAotLklSIG9wZW5zc2wgKDEpCi10byBnZW5lcmF0ZSBhCi10ZW1wb3JhcnkgY2VydGlmaWNhdGUgaW4gIlNBVkUiIG9yICJUTVAiIGNyZWF0aW9uCi1tb2RlcywgdGhlIHB1YmxpYyBwYXJ0IG9mIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHN0ZGVycgotKGUuZy4gb25lIGNvdWxkIGNvcHkgaXQgdG8gdGhlIGNsaWVudC1zaWRlIHRvIHByb3ZpZGUKLWF1dGhlbnRpY2F0aW9uIG9mIHRoZSBzZXJ2ZXIgdG8gVk5DIHZpZXdlcnMuKQotLklQCi1OT1RFOiBJbiAiVE1QIiBtb2RlLCB1bmxlc3MgeW91IHNhZmVseSBjb3B5IHRoZQotcHVibGljIHBhcnQgb2YgdGhlIHRlbXBvcmFyeSBDZXJ0IHRvIHRoZSB2aWV3ZXIgZm9yCi1hdXRoZW50aWNhdGUgKmV2ZXJ5IHRpbWUqICh1bmxpa2VseS4uLiksIHRoZW4gb25seQotcGFzc2l2ZSBzbmlmZmluZyBhdHRhY2tzIGFyZSBwcmV2ZW50ZWQgYW5kIHlvdSBhcmUKLXN0aWxsIG9wZW4gdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIFRoaXMgaXMKLXdoeSB0aGUgZGVmYXVsdCAiU0FWRSIgbW9kZSBpcyBwcmVmZXJyZWQgKGFuZCBtb3JlCi1zb3BoaXN0aWNhdGVkIENBIG1vZGUgdG9vKS4gIE9ubHkgd2l0aCBzYXZlZCBrZXlzIEFORAotdGhlIFZOQyB2aWV3ZXIgYXV0aGVudGljYXRpbmcgdGhlbSAodmlhIHRoZSBwdWJsaWMKLWNlcnRpZmljYXRlKSwgYXJlIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MgcHJldmVudGVkLgotLklQCi1JZiBbcGVtXSBpcyAiQU5PTiIgdGhlbiB0aGUgRGlmZmllLUhlbGxtYW4gYW5vbnltb3VzCi1rZXkgZXhjaGFuZ2UgbWV0aG9kIGlzIHVzZWQuICBJbiB0aGlzIG1vZGUgdGhlcmUKLWFyZSAqbm8qIFNTTCBjZXJ0aWZpY2F0ZXMgYW5kIHNvIGl0IGlzIG5vdCBwb3NzaWJsZQotdG8gYXV0aGVudGljYXRlIGVpdGhlciB0aGUgVk5DIHNlcnZlciBvciBWTkMgY2xpZW50LgotVGh1cyBvbmx5IHBhc3NpdmUgbmV0d29yayBzbmlmZmluZyBhdHRhY2tzIGFyZSBhdm9pZGVkOgotdGhlICJBTk9OIiBtZXRob2QgaXMgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUKLWF0dGFja3MuICAiQU5PTiIgaXMgbm90IHJlY29tbWVuZGVkOyBpbnN0ZWFkIHVzZQotYSBTU0wgUEVNIHlvdSBjcmVhdGVkIG9yIHRoZSBkZWZhdWx0ICJTQVZFIiBtZXRob2QuCi0uSVAKLVNlZSBcZkItc3NsZGlyXGZSIGJlbG93IHRvIHVzZSBhIGRpcmVjdG9yeSBiZXNpZGVzIHRoZQotZGVmYXVsdCB+Ly52bmMvY2VydHMKLS5JUAotSWYgeW91ciB4MTF2bmMgYmluYXJ5IHdhcyBub3QgY29tcGlsZWQgd2l0aCBPcGVuU1NMCi1saWJyYXJ5IHN1cHBvcnQsIHVzZSBvZiB0aGUgXGZCLXNzbFxmUiBvcHRpb24gd2lsbCBpbmR1Y2UgYW4KLWltbWVkaWF0ZSBmYWlsdXJlIGFuZCBleGl0LiAgRm9yIHN1Y2ggYmluYXJpZXMsIGNvbnNpZGVyCi11c2luZyB0aGUgXGZCLXN0dW5uZWxcZlIgb3B0aW9uIGZvciBTU0wgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgotLklQCi1NaXNjIEluZm86IEluIHRlbXBvcmFyeSBjZXJ0IGNyZWF0aW9uIG1vZGUgIlRNUCIsIHNldAotdGhlIGVudi4gdmFyLiBYMTFWTkNfU0hPV19UTVBfUEVNPTEgdG8gaGF2ZSB4MTF2bmMgcHJpbnQKLW91dCB0aGUgZW50aXJlIGNlcnRpZmljYXRlLCBpbmNsdWRpbmcgdGhlIFBSSVZBVEUgS0VZCi1wYXJ0LCB0byBzdGRlcnIuICBUaGVyZSBhcmUgYmV0dGVyIHdheXMgdG8gZ2V0L3NhdmUgdGhpcwotaW5mby4gIFNlZSAiU0FWRSIgYWJvdmUgYW5kICJcZkItc3NsR2VuQ2VydFxmUiIgYmVsb3cuCi0uUFAKLVxmQi1zc2x0aW1lb3V0XGZSIFxmSW5cZlIKLS5JUAotU2V0IFNTTCByZWFkIHRpbWVvdXQgdG8gbiBzZWNvbmRzLiAgSW4gc29tZSBzaXR1YXRpb25zCi0oaS5lLiBhbiBpY29uaWZpZWQgdmlld2VyIGluIFdpbmRvd3MpIHRoZSB2aWV3ZXIgc3RvcHMKLXRhbGtpbmcgYW5kIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYWZ0ZXIgdGhlIGRlZmF1bHQKLXRpbWVvdXQgKDI1cyBmb3IgYWJvdXQgdGhlIGZpcnN0IG1pbnV0ZSwgNDMyMDBzIGxhdGVyKS4KLVNldCB0byB6ZXJvIHRvIHBvbGwgZm9yZXZlci4gIFNldCB0byBhIG5lZ2F0aXZlIHZhbHVlCi10byB1c2UgdGhlIGJ1aWx0aW4gc2V0dGluZy4KLS5JUAotTm90ZSB0aGF0IHRoaXMgdmFsdWUgZG9lcyBOT1QgYXBwbHkgdG8gdGhlICppbml0aWFsKiBzc2wKLWluaXQgY29ubmVjdGlvbi4gIFRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHRoYXQgaXMgMjBzZWMuCi1Vc2UgXGZCLWVudlxmUiBTU0xfSU5JVF9USU1FT1VUPW4gdG8gbW9kaWZ5IGl0LgotLlBQCi1cZkItc3Nsbm9mYWlsXGZSCi0uSVAKLUV4aXQgYXQgdGhlIGZpcnN0IFNTTCBjb25uZWN0aW9uIGZhaWx1cmUuIFVzZWZ1bCB3aGVuCi1zY3JpcHRpbmcgU1NMIGNvbm5lY3Rpb25zIChlLmcuIHgxMXZuYyBpcyBzdGFydGVkIHZpYQotc3NoKSBhbmQgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB3YWl0aW5nIGFyb3VuZCBmb3IgbW9yZQotY29ubmVjdGlvbnMsIHR5aW5nIHVwIHBvcnRzLCBldGMuCi0uUFAKLVxmQi1zc2xkaXJcZlIgXGZJZGlyXGZSCi0uSVAKLVVzZSBcZklkaXJcZlIgYXMgYW4gYWx0ZXJuYXRlIHNzbCBjZXJ0aWZpY2F0ZSBhbmQga2V5Ci1tYW5hZ2VtZW50IHRvcGxldmVsIGRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IGlzCi1+Ly52bmMvY2VydHMKLS5JUAotVGhpcyBkaXJlY3RvcnkgaXMgdXNlZCB0byBzdG9yZSBzZXJ2ZXIgYW5kIG90aGVyCi1jZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYW5kIGFsc28gb3RoZXIgbWF0ZXJpYWxzLiAgRS5nLiBpbgotdGhlIHNpbXBsZXN0IGNhc2UsICJcZkItc3NsXGZSIFxmSVNBVkVcZlIiIHdpbGwgc3RvcmUgdGhlIHgxMXZuYwotc2VydmVyIGNlcnQgaW4gZGlyL3NlcnZlci5wZW0KLS5JUAotVXNlIG9mIGFsdGVybmF0ZSBkaXJlY3RvcmllcyB2aWEgXGZCLXNzbGRpclxmUiBhbGxvd3MgeW91IHRvCi1tYW5hZ2UgbXVsdGlwbGUgVk5DIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGtleXMuCi1Bbm90aGVyIHVzZSBpcyBpZiB+Ly52bmMvY2VydCBpcyBvbiBhbiBORlMgc2hhcmUgeW91Ci1taWdodCB3YW50IHlvdXIgY2VydGlmaWNhdGVzIGFuZCBrZXlzIHRvIGJlIG9uIGEgbG9jYWwKLWZpbGVzeXN0ZW0gdG8gcHJldmVudCBuZXR3b3JrIHNub29waW5nIChmb3IgZXhhbXBsZQotXGZCLXNzbGRpclxmUiAvdmFyL2xpYi94MTF2bmMtY2VydHMpLgotLklQCi1cZkItc3NsZGlyXGZSIGFmZmVjdHMgbmVhcmx5IGFsbCBvZiB0aGUgb3RoZXIgXGZCLXNzbCpcZlIgb3B0aW9ucywKLWUuZy4gXGZCLXNzbFxmUiBTQVZFLCBcZkItc3NsR2VuQ2VydCxcZlIgZXRjLi4KLS5QUAotXGZCLXNzbHZlcmlmeVxmUiBcZklwYXRoXGZSCi0uSVAKLUZvciBlaXRoZXIgb2YgdGhlIFxmQi1zc2xcZlIgb3IgXGZCLXN0dW5uZWxcZlIgbW9kZXMsIHVzZSBcZklwYXRoXGZSCi10byBwcm92aWRlIGNlcnRpZmljYXRlcyB0byBhdXRoZW50aWNhdGUgaW5jb21pbmcgVk5DCi0qQ2xpZW50KiBjb25uZWN0aW9ucyAobm9ybWFsbHkgb25seSB0aGUgc2VydmVyIGlzCi1hdXRoZW50aWNhdGVkIGluIFNTTC4pICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgbWV0aG9kCi10byByZXBsYWNlIHN0YW5kYXJkIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIG9mIGNsaWVudHMuCi0uSVAKLUlmIFxmSXBhdGhcZlIgaXMgYSBkaXJlY3RvcnkgaXQgY29udGFpbnMgdGhlIGNsaWVudCAob3IgQ0EpCi1jZXJ0aWZpY2F0ZXMgaW4gc2VwYXJhdGUgZmlsZXMuICBJZiBwYXRoIGlzIGEgZmlsZSwKLWl0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcy4gU2VlIHNwZWNpYWwgdG9rZW5zCi1iZWxvdy4gIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlICJDQXBhdGggPSBkaXIiIGFuZAotIkNBZmlsZSA9IGZpbGUiIHN0dW5uZWwgb3B0aW9ucy4gIFNlZSB0aGUgCi0uSVIgc3R1bm5lbCAoOCkKLW1hbnBhZ2UgZm9yIGRldGFpbHMuCi0uSVAKLUV4YW1wbGVzOgoteDExdm5jIFxmQi1zc2xcZlIgXGZCLXNzbHZlcmlmeVxmUiB+L215LmNydAoteDExdm5jIFxmQi1zc2xcZlIgXGZCLXNzbHZlcmlmeVxmUiB+L215X3BlbV9kaXIvCi0uSVAKLU5vdGUgdGhhdCBpZiBwYXRoIGlzIGEgZGlyZWN0b3J5LCBpdCBtdXN0IGNvbnRhaW4KLXRoZSBjZXJ0cyBpbiBzZXBhcmF0ZSBmaWxlcyBuYW1lZCBsaWtlIDxIQVNIPi4wLCB3aGVyZQotdGhlIHZhbHVlIG9mIDxIQVNIPiBpcyBmb3VuZCBieSBydW5uaW5nIHRoZSBjb21tYW5kCi0ib3BlbnNzbCB4NTA5IFxmQi1oYXNoXGZSIFxmQi1ub291dFxmUiBcZkItaW5cZlIgZmlsZS5jcnQiLiBFdmlkZW50bHkKLW9uZSB1c2VzIDxIQVNIPi4xIGlmIHRoZXJlIGlzIGEgY29sbGlzaW9uLi4uCi0uSVAKLVRoZSB0aGUga2V5LW1hbmFnZW1lbnQgdXRpbGl0eSAiXGZCLXNzbENlcnRJbmZvXGZSIFxmSUhBU0hPTlxmUiIKLWFuZCAiXGZCLXNzbENlcnRJbmZvXGZSIFxmSUhBU0hPRkZcZlIiIHdpbGwgY3JlYXRlL2RlbGV0ZSB0aGVzZQotaGFzaGVzIGZvciB5b3UgYXV0b21hdGljYWxseSAodmlhIHN5bWxpbmspIGluIHRoZSBIQVNICi1zdWJkaXJzIGl0IG1hbmFnZXMuICBUaGVuIHlvdSBjYW4gcG9pbnQgXGZCLXNzbHZlcmlmeVxmUiB0bwotdGhlIEhBU0ggc3ViZGlyLgotLklQCi1TcGVjaWFsIHRva2VuczogaW4gXGZCLXNzbFxmUiBtb2RlLCBpZiBcZklwYXRoXGZSIGlzIG5vdCBhIGZpbGUgb3IKLWEgZGlyZWN0b3J5LCBpdCBpcyB0YWtlbiBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCi10b2tlbnMgdGhhdCBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKLS5JUAotSWYgYSB0b2tlbiBpcyAiQ0EiIHRoYXQgbWVhbnMgbG9hZCB0aGUgQ0EvY2FjZXJ0LnBlbQotZmlsZSBmcm9tIHRoZSBzc2wgZGlyZWN0b3J5LiAgSWYgYSB0b2tlbiBpcyAiY2xpZW50cyIKLXRoZW4gYWxsIHRoZSBmaWxlcyBjbGllbnRzLyouY3J0IGluIHRoZSBzc2wgZGlyZWN0b3J5Ci1hcmUgbG9hZGVkLiAgT3RoZXJ3aXNlIHRoZSBmaWxlIGNsaWVudHMvdG9rZW4uY3J0Ci1pcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkLiAgQXMgYSBrbHVkZ2UsIHVzZSBhIHRva2VuCi1saWtlIC4uL3NlcnZlci1mb28gdG8gbG9hZCBhIHNlcnZlciBjZXJ0IGlmIHlvdSBmaW5kCi10aGF0IG5lY2Vzc2FyeS4KLS5JUAotVXNlIFxmQi1zc2xkaXJcZlIgdG8gdXNlIGEgZGlyZWN0b3J5IGRpZmZlcmVudCBmcm9tIHRoZQotfi8udm5jL2NlcnRzIGRlZmF1bHQuCi0uSVAKLU5vdGUgdGhhdCBpZiB0aGUgIkNBIiBjZXJ0IGlzIGxvYWRlZCB5b3UgZG8gbm90IG5lZWQKLXRvIGxvYWQgYW55IG9mIHRoZSBjZXJ0cyB0aGF0IGhhdmUgYmVlbiBzaWduZWQgYnkgaXQuCi1Zb3Ugd2lsbCBuZWVkIHRvIGxvYWQgYW55IGFkZGl0aW9uYWwgc2VsZi1zaWduZWQgY2VydHMKLWhvd2V2ZXIuCi0uSVAKLUV4YW1wbGVzOgoteDExdm5jIFxmQi1zc2xcZlIgXGZCLXNzbHZlcmlmeVxmUiBDQQoteDExdm5jIFxmQi1zc2xcZlIgXGZCLXNzbHZlcmlmeVxmUiBzZWxmOmZyZWQsc2VsZjpqaW0KLXgxMXZuYyBcZkItc3NsXGZSIFxmQi1zc2x2ZXJpZnlcZlIgQ0EsY2xpZW50cwotLklQCi1Vc3VhbGx5ICJcZkItc3NsdmVyaWZ5XGZSIFxmSUNBXGZSIiBpcyB0aGUgbW9zdCBlZmZlY3RpdmUuCi1TZWUgdGhlIFxmQi1zc2xHZW5DQVxmUiBhbmQgXGZCLXNzbEdlbkNlcnRcZlIgb3B0aW9ucyBiZWxvdyBmb3IKLWhvdyB0byBzZXQgdXAgYW5kIG1hbmFnZSB0aGUgQ0EgZnJhbWV3b3JrLgotLklQCi1OT1RFOiB0aGUgZm9sbG93aW5nIHV0aWxpdGllcywgXGZCLXNzbEdlbkNBLFxmUiBcZkItc3NsR2VuQ2VydCxcZlIKLVxmQi1zc2xFbmNLZXksXGZSIFxmQi1zc2xDZXJ0SW5mbyxcZlIgYW5kIFxmQi1zc2xDUkxcZlIgYXJlIHByb3ZpZGVkIGZvcgotY29tcGxldGVuZXNzLCBidXQgZm9yIGNhc3VhbCB1c2FnZSB0aGV5IGFyZSBvdmVya2lsbC4KLS5JUAotVGhleSBwcm92aWRlIFZOQyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBrZXkgY3JlYXRpb24KLWFuZCBzZXJ2ZXIgLyBjbGllbnQga2V5IGdlbmVyYXRpb24gYW5kIHNpZ25pbmcuICBTbyB0aGV5Ci1wcm92aWRlIGEgYmFzaWMgUHVibGljIEtleSBtYW5hZ2VtZW50IGZyYW1ld29yayBmb3IKLVZOQy1pbmcgd2l0aCB4MTF2bmMuIChub3RlIHRoYXQgdGhleSByZXF1aXJlIAotLklSIG9wZW5zc2wgKDEpCi1iZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSkKLS5JUAotSG93ZXZlciwgdGhlIHNpbXBsZXN0IHVzYWdlIG1vZGUsICJcZkItc3NsXGZSIFxmSVRNUFxmUiIgKHdoZXJlCi14MTF2bmMgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgaXRzIG93biwgc2VsZi1zaWduZWQsCi10ZW1wb3Jhcnkga2V5IGFuZCB0aGUgVk5DIHZpZXdlcnMgYWx3YXlzIGFjY2VwdCBpdCwKLWUuZy4gYWNjZXB0aW5nIHZpYSBhIGRpYWxvZyBib3gpIGlzIHByb2JhYmx5IHNhZmUgZW5vdWdoCi1mb3IgbW9zdCBzY2VuYXJpb3MuICBDQSBtYW5hZ2VtZW50IGlzIG5vdCBuZWVkZWQuCi0uSVAKLVRvIHByb3RlY3QgYWdhaW5zdCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzIHRoZSAiVE1QIgotbW9kZSBjYW4gYmUgaW1wcm92ZWQgYnkgdXNpbmcgIlxmQi1zc2xcZlIgXGZJU0FWRVxmUiIgKHNhbWUgYXMKLSJcZkItc3NsXGZSIiwgaS5lLiB0aGUgZGVmYXVsdCkgdG8gaGF2ZSB4MTF2bmMgY3JlYXRlIGEKLWxvbmdlciB0ZXJtIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLCBhbmQgdGhlbiAoc2FmZWx5KQotY29weSB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5IGNlcnQgdG8gdGhlIGRlc2lyZWQKLWNsaWVudCBtYWNoaW5lcyAoY2FyZSBtdXN0IGJlIHRha2VuIHRoZSBwcml2YXRlIGtleSBwYXJ0Ci1pcyBub3Qgc3RvbGVuOyB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBwYXNzcGhyYXNlKS4KLS5JUAotU28ga2VlcCBpbiBtaW5kIG5vIENBIGtleSBjcmVhdGlvbiBvciBtYW5hZ2VtZW50Ci0oLXNzbEdlbkNBIGFuZCBcZkItc3NsR2VuQ2VydClcZlIgaXMgbmVlZGVkIGZvciBlaXRoZXIgb2YKLXRoZSBhYm92ZSB0d28gY29tbW9uIHVzYWdlIG1vZGVzLgotLklQCi1PbmUgbWlnaHQgd2FudCB0byB1c2UgXGZCLXNzbEdlbkNBXGZSIGFuZCBcZkItc3NsR2VuQ2VydFxmUgotaWYgeW91IGhhZCBhIGxhcmdlIG51bWJlciBvZiBWTkMgY2xpZW50IGFuZCBzZXJ2ZXIKLXdvcmtzdGF0aW9ucy4gIFRoYXQgd2F5IHRoZSBhZG1pbmlzdHJhdG9yIGNvdWxkIGdlbmVyYXRlCi1hIHNpbmdsZSBDQSBrZXkgd2l0aCBcZkItc3NsR2VuQ0FcZlIgYW5kIGRpc3RyaWJ1dGUgaXRzCi1jZXJ0aWZpY2F0ZSBwYXJ0IHRvIGFsbCBvZiB0aGUgd29ya3N0YXRpb25zLgotLklQCi1OZXh0LCBoZSBjb3VsZCBjcmVhdGUgc2lnbmVkIFZOQyBzZXJ2ZXIga2V5cwotKC1zc2xHZW5DZXJ0IHNlcnZlciAuLi4pIGZvciBlYWNoIHdvcmtzdGF0aW9uIG9yIHVzZXIKLXRoYXQgdGhlbiB4MTF2bmMgd291bGQgdXNlIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8KLWFueSBWTkMgY2xpZW50IHRoYXQgaGFzIHRoZSBDQSBjZXJ0LgotLklQCi1PcHRpb25hbGx5LCB0aGUgYWRtaW4gY291bGQgYWxzbyBtYWtlIGl0IHNvIHRoZQotVk5DIGNsaWVudHMgdGhlbXNlbHZlcyBhcmUgYXV0aGVudGljYXRlZCB0byB4MTF2bmMKLSgtc3NsR2VuQ2VydCBjbGllbnQgLi4uKSAgRm9yIHRoaXMgXGZCLXNzbHZlcmlmeVxmUiB3b3VsZCBiZQotcG9pbnRlZCB0byB0aGUgQ0EgY2VydCAoYW5kL29yIHNlbGYtc2lnbmVkIGNlcnRzKS4KLS5JUAoteDExdm5jIHdpbGwgYmUgYWJsZSB0byB1c2UgYWxsIG9mIHRoZXNlIGNlcnQgYW5kCi1rZXkgZmlsZXMuICBPbiB0aGUgVk5DIGNsaWVudCBzaWRlLCB0aGV5IHdpbGwgbmVlZCB0bwotYmUgImltcG9ydGVkIiBzb21laG93LiAgV2ViIGJyb3dzZXJzIGhhdmUgIk1hbmFnZQotQ2VydGlmaWNhdGVzIiBhY3Rpb25zIGFzIGRvZXMgdGhlIEphdmEgYXBwbGV0IHBsdWdpbgotQ29udHJvbCBQYW5lbC4gIHN0dW5uZWwgY2FuIGFsc28gdXNlIHRoZXNlIGZpbGVzIChzZWUKLXRoZSBzc192bmN2aWV3ZXIgZXhhbXBsZSBzY3JpcHQgaW4gdGhlIEZBUSBhbmQgU1NWTkMuKQotLlBQCi1cZkItc3NsQ1JMXGZSIFxmSXBhdGhcZlIKLS5JUAotU2V0IHRoZSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIChDUkwpIHRvIFxmSXBhdGhcZlIuCi1UaGlzIHNldHRpbmcgYXBwbGllcyBmb3IgYm90aCBcZkItc3NsXGZSIGFuZCBcZkItc3R1bm5lbFxmUiBtb2Rlcy4KLS5JUAotSWYgcGF0aCBpcyBhIGZpbGUsIHRoZSBmaWxlIGNvbnRhaW5zIG9uZSBvciBtb3JlIENSTHMKLWluIFBFTSBmb3JtYXQuICBJZiBwYXRoIGlzIGEgZGlyZWN0b3J5LCBpdCBjb250YWlucwotaGFzaCBuYW1lZCBmaWxlcyBvZiBDUkxzIGluIHRoZSB1c3VhbCBPcGVuU1NMIG1hbm5lci4KLVNlZSB0aGUgT3BlblNTTCBhbmQgCi0uSVIgc3R1bm5lbCAoOCkKLWRvY3VtZW50YXRpb24gZm9yCi1tb3JlIGluZm8uCi0uSVAKLVRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpZiBcZkItc3NsdmVyaWZ5XGZSIGhhcyBiZWVuCi1zdXBwbGllZDogaXQgY2hlY2tzIGZvciByZXZvY2F0aW9uIGFsb25nIHRoZQotY2VydGlmaWNhdGUgY2hhaW4gdXNlZCB0byB2ZXJpZnkgdGhlIFZOQyBjbGllbnQuCi1UaGUgXGZCLXNzbENSTFxmUiBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCB3aGVuIFxmQi1zc2x2ZXJpZnlcZlIgaXMKLW5vdCBzcGVjaWZpZWQuCi0uSVAKLU5vdGUgdGhhdCBpZiBhIENSTCdzIGV4cGlyYXRpb24gZGF0ZSBoYXMgcGFzc2VkLCBhbGwKLVNTTCBjb25uZWN0aW9ucyB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiBpZiB0aGV5IGFyZQotcmVsYXRlZCB0byB0aGUgc3ViamVjdCBvZiB0aGUgQ1JMIG9yIG5vdC4KLS5JUAotT25seSByYXJlbHkgd2lsbCBvbmUncyB4MTF2bmMgXGZCLXNzbFxmUiBpbmZyYXN0cnVjdHVyZSBiZSBzbwotbGFyZ2UgdGhhdCB0aGlzIG9wdGlvbiB3b3VsZCBiZSB1c2VmdWwgKHNpbmNlIG5vcm1hbGx5Ci1tYWludGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIFxmQi1zc2x2ZXJpZnlcZlIgZmlsZSBvcgotZGlyZWN0b3J5IHNob3VsZCBiZSBlbm91Z2guKSAgSG93ZXZlciwgd2hlbiB1c2luZwoteDExdm5jIHdpdGggYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKHNlZSBcZkItc3NsR2VuQ0EpXGZSCi10byBhdXRoZW50aWNhdGUgQ2xpZW50cyB2aWEgU1NML1RMUywgdGhlIFxmQi1zc2xDUkxcZlIgb3B0aW9uCi1jYW4gYmUgdXNlZnVsIHRvIHJldm9rZSB1c2VycycgY2VydHMgd2hvc2UgcHJpdmF0ZSBTU0wKLWtleXMgd2VyZSBsb3N0IG9yIHN0b2xlbiAoZS5nLiBsYXB0b3AuKSAgVGhpcyB3YXkgYSBuZXcKLUNBIGNlcnQra2V5IGRvZXMgbm90IG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgbmV3IHNpZ25lZAotY2xpZW50IGtleXMgZ2VuZXJhdGVkIGFuZCBkaXN0cmlidXRlZCB0byBhbGwgdXNlcnMuCi0uSVAKLVRvIGNyZWF0ZSBhIENSTCBmaWxlIHdpdGggcmV2b2tlZCBjZXJ0aWZpY2F0ZXMgdGhlCi1jb21tYW5kcyAnb3BlbnNzbCBjYSBcZkItcmV2b2tlXGZSIC4uLicgYW5kICdvcGVuc3NsIGNhCi1cZkItZ2VuY3JsXGZSIC4uLicgYXJlIHVzZWZ1bC4gIChSdW4gdGhlbSBpbiB+Ly52bmMvY2VydHMpCi0uUFAKLVxmQi1zc2xHZW5DQVxmUiBcZklbZGlyXVxmUgotLklQCi1HZW5lcmF0ZSB5b3VyIG93biBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcHJpdmF0ZSBrZXksCi1jZXJ0aWZpY2F0ZSwgYW5kIG90aGVyIGZpbGVzIGluIGRpcmVjdG9yeSBbZGlyXS4KLXgxMXZuYyB0aGVuIGV4aXRzLgotLklQCi1JZiBbZGlyXSBpcyBub3Qgc3VwcGxpZWQsIGEgXGZCLXNzbGRpclxmUiBzZXR0aW5nIGlzIHVzZWQsCi1vciBvdGhlcndpc2Ugfi8udm5jL2NlcnRzIGlzIHVzZWQuCi0uSVAKLVRoaXMgY29tbWFuZCBhbHNvIGNyZWF0ZXMgZGlyZWN0b3JpZXMgd2hlcmUgc2VydmVyIGFuZAotY2xpZW50IGNlcnRzIGFuZCBrZXlzIHdpbGwgYmUgc3RvcmVkLiAgVGhlIAotLklSIG9wZW5zc2wgKDEpCi1wcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZQotaW4gUEFUSC4KLS5JUAotQWZ0ZXIgdGhlIENBIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCB0aGUKLXgxMXZuYyBjb21tYW5kIGV4aXRzOyB0aGUgVk5DIHNlcnZlciBpcyBub3QgcnVuLgotLklQCi1Zb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgaW5mb3JtYXRpb24gdG8gcHV0IGludG8gdGhlIENBCi1jZXJ0aWZpY2F0ZS4gIFRoZSBpbmZvIGRvZXMgbm90IGhhdmUgdG8gYmUgYWNjdXJhdGUganVzdAotYXMgbG9uZyBhcyBjbGllbnRzIGFjY2VwdCB0aGUgY2VydCBmb3IgVk5DIGNvbm5lY3Rpb25zLgotWW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBhIHBhc3NwaHJhc2Ugb2YgYXQgbGVhc3QKLTQgY2hhcmFjdGVycyBmb3IgdGhlIENBIHByaXZhdGUga2V5LgotLklQCi1PbmNlIHlvdSBoYXZlIGdlbmVyYXRlZCB0aGUgQ0EgeW91IGNhbiBkaXN0cmlidXRlCi1pdHMgY2VydGlmaWNhdGUgcGFydCwgW2Rpcl0vQ0EvY2FjZXJ0LnBlbSwgdG8gb3RoZXIKLXdvcmtzdGF0aW9ucyB3aGVyZSBWTkMgdmlld2VycyB3aWxsIGJlIHJ1bi4gIE9uZSB3aWxsCi1uZWVkIHRvICJpbXBvcnQiIHRoaXMgY2VydGlmaWNhdGUgaW4gdGhlIGFwcGxpY2F0aW9ucywKLWUuZy4gV2ViIGJyb3dzZXIsIEphdmEgYXBwbGV0IHBsdWdpbiwgc3R1bm5lbCwgZXRjLgotTmV4dCwgeW91IGNhbiBjcmVhdGUgYW5kIHNpZ24ga2V5cyB1c2luZyB0aGUgQ0Egd2l0aAotdGhlIFxmQi1zc2xHZW5DZXJ0XGZSIG9wdGlvbiBiZWxvdy4KLS5JUAotRXhhbXBsZXM6Ci14MTF2bmMgXGZCLXNzbEdlbkNBXGZSCi14MTF2bmMgXGZCLXNzbEdlbkNBXGZSICB+L215Q0FkaXIKLXgxMXZuYyBcZkItc3NsZGlyXGZSIH4vbXlDQWRpciBcZkItc3NsR2VuQ0FcZlIKLS5JUAotKHRoZSBsYXN0IHR3byBsaW5lcyBhcmUgZXF1aXZhbGVudCkKLS5QUAotXGZCLXNzbEdlbkNlcnRcZlIgXGZJdHlwZVxmUiBcZkluYW1lXGZSCi0uSVAKLUdlbmVyYXRlIGEgVk5DIHNlcnZlciBvciBjbGllbnQgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUKLWtleSBwYWlyIHNpZ25lZCBieSB0aGUgQ0EgY3JlYXRlZCBwcmV2aW91c2x5IHdpdGgKLVxmQi1zc2xHZW5DQS5cZlIgIFRoZSAKLS5JUiBvcGVuc3NsICgxKQotcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZAotb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIGluIFBBVEguCi0uSVAKLUFmdGVyIHRoZSBDZXJ0aWZpY2F0ZSBpcyBnZW5lcmF0ZWQgeDExdm5jIGV4aXRzOyB0aGUKLVZOQyBzZXJ2ZXIgaXMgbm90IHJ1bi4KLS5JUAotVGhlIHR5cGUgb2Yga2V5IHRvIGJlIGdlbmVyYXRlZCBpcyB0aGUgc3RyaW5nIFxmSXR5cGVcZlIuCi1JdCBpcyBlaXRoZXIgInNlcnZlciIgKGkuZS4gZm9yIHVzZSBieSB4MTF2bmMpIG9yCi0iY2xpZW50IiAoZm9yIGEgVk5DIHZpZXdlcikuICBOb3RlIHRoYXQgdHlwaWNhbGx5Ci1vbmx5ICJzZXJ2ZXIiIGlzIHVzZWQ6IHRoZSBWTkMgY2xpZW50cyBhdXRoZW50aWNhdGUKLXRoZW1zZWx2ZXMgYnkgYSBub24tcHVibGljLWtleSBtZXRob2QgKGUuZy4gVk5DIG9yCi11bml4IHBhc3N3b3JkKS4gIFxmSXR5cGVcZlIgaXMgcmVxdWlyZWQuCi0uSVAKLUFuIGFyYml0cmFyeSBkZWZhdWx0IG5hbWUgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHdpdGgKLXRoZSBrZXkgaXMgc3VwcGxpZWQgYnkgdGhlIFxmSW5hbWVcZlIgc3RyaW5nLiAgWW91IGNhbgotY2hhbmdlIGl0IGF0IHRoZSB2YXJpb3VzIHByb21wdHMgd2hlbiBjcmVhdGluZyB0aGUga2V5LgotXGZJbmFtZVxmUiBpcyBvcHRpb25hbC4KLS5JUAotSWYgbmFtZSBpcyBsZWZ0IGJsYW5rIGZvciBjbGllbnRzIGtleXMgdGhlbiAibm9ib2R5IgotaXMgdXNlZC4gIElmIGxlZnQgYmxhbmsgZm9yIHNlcnZlciBrZXlzLCB0aGVuIHRoZQotcHJpbWFyeSBzZXJ2ZXIga2V5OiAic2VydmVyLnBlbSIgaXMgY3JlYXRlZCAodGhpcwotaXMgdGhlIHNhdmVkIG9uZSByZWZlcmVuY2VkIGJ5ICJcZkItc3NsXGZSIFxmSVNBVkVcZlIiIHdoZW4gdGhlCi1zZXJ2ZXIgaXMgc3RhcnRlZCkKLS5JUAotSWYgXGZJbmFtZVxmUiBiZWdpbnMgd2l0aCB0aGUgc3RyaW5nICJzZWxmOiIgdGhlbgotYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIGluc3RlYWQgb2Ygb25lCi1zaWduZWQgYnkgeW91ciBDQSBrZXkuCi0uSVAKLUlmIFxmSW5hbWVcZlIgYmVnaW5zIHdpdGggdGhlIHN0cmluZyAicmVxOiIgdGhlbiBvbmx5IGEKLWtleSAoLmtleSkgYW5kIGEgY2VydGlmaWNhdGUgc2lnbmluZyAqcmVxdWVzdCogKC5yZXEpCi1hcmUgZ2VuZXJhdGVkLiAgWW91IGNhbiB0aGVuIHNlbmQgdGhlIC5yZXEgZmlsZSB0bwotYW4gZXh0ZXJuYWwgQ0EgKGV2ZW4gYSBwcm9mZXNzaW9uYWwgb25lLCBlLmcuIFRoYXd0ZSkKLWFuZCB0aGVuIGNvbWJpbmUgdGhlIC5rZXkgYW5kIHRoZSByZWNlaXZlZCBjZXJ0IGludG8KLXRoZSAucGVtIGZpbGUgd2l0aCB0aGUgc2FtZSBiYXNlbmFtZS4KLS5JUAotVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gInNlcnZlciIgYW5kICJjbGllbnQiIGlzCi1zaW1wbHkgdGhlIGNob2ljZSBvZiBvdXRwdXQgZmlsZW5hbWVzIGFuZCBzdWItZGlyZWN0b3J5LgotVGhpcyBtYWtlcyBpdCBzbyB0aGUgXGZCLXNzbFxmUiBTQVZFLW5hbWUgb3B0aW9uIGNhbiBlYXNpbHkKLXBpY2sgdXAgdGhlIHgxMXZuYyBQRU0gZmlsZSB0aGlzIG9wdGlvbiBnZW5lcmF0ZXMuCi1BbmQgc2ltaWxhcmx5IG1ha2VzIGl0IGVhc3kgZm9yIHRoZSBcZkItc3NsdmVyaWZ5XGZSIG9wdGlvbgotdG8gcGljayB1cCB5b3VyIGNsaWVudCBjZXJ0cy4KLS5JUAotVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBmaWxlbmFtZSBvciBkaXJlY3RvcnkKLWxvY2F0aW9uIG9mIGVpdGhlciB0aGUgInNlcnZlciIgYW5kICJjbGllbnQiIGNlcnRzLgotWW91IGNhbiByZW5hbWUgdGhlIGZpbGVzIG9yIG1vdmUgdGhlbSB0byB3aGVyZXZlcgoteW91IGxpa2UuCi0uSVAKLVByZWNlZGUgdGhpcyBvcHRpb24gd2l0aCBcZkItc3NsZGlyXGZSIFtkaXJdIHRvIHVzZSBhCi1kaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCB+Ly52bmMvY2VydHMgWW91IHdpbGwKLW5lZWQgdG8gcnVuIFxmQi1zc2xHZW5DQVxmUiBvbiB0aGF0IGRpcmVjdG9yeSBmaXJzdCBiZWZvcmUKLWRvaW5nIGFueSBcZkItc3NsR2VuQ2VydFxmUiBrZXkgY3JlYXRpb24uCi0uSVAKLU5vdGUgeW91IGNhbm5vdCByZWNyZWF0ZSBhIGNlcnQgd2l0aCBleGFjdGx5IHRoZSBzYW1lCi1kaXN0aWd1aXNoZWQgbmFtZSAoRE4pIGFzIGFuIGV4aXN0aW5nIG9uZS4gIFRvIGRvIHNvLAoteW91IHdpbGwgbmVlZCB0byBlZGl0IHRoZSBbZGlyXS9DQS9pbmRleC50eHQgZmlsZSB0bwotZGVsZXRlIHRoZSBsaW5lLgotLklQCi1TaW1pbGFyIHRvIFxmQi1zc2xHZW5DQSxcZlIgeW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gZmlsbAotaW4gc29tZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlCi1jZXJ0aWZpY2F0ZSB3aGVuIGl0IGlzIGNyZWF0ZWQuCi0uSVAKLVRpcDogaWYgeW91IGtub3cgdGhlIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvdGhlcgotcGVvcGxlIHdpbGwgYmUgY29ubmVjdGluZyB0bywgeW91IGNhbiB1c2UgdGhhdCBhcyB0aGUKLUNvbW1vbk5hbWUgIkNOIiB0byBhdm9pZCBzb21lIGFwcGxpY2F0aW9ucyAoZS5nLiB3ZWIKLWJyb3dzZXJzIGFuZCBqYXZhIHBsdWdpbikgY29tcGxhaW5pbmcgdGhhdCBpdCBkb2VzIG5vdAotbWF0Y2ggdGhlIGhvc3RuYW1lLgotLklQCi1Zb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IHRoZSBDQSBwcml2YXRlIGtleQotcGFzc3BocmFzZSB0byB1bmxvY2sgdGhlIHByaXZhdGUga2V5IGNyZWF0ZWQgZnJvbQotXGZCLXNzbEdlbkNBLlxmUiAgVGhpcyBwcml2YXRlIGtleSBpcyB1c2VkIHRvIHNpZ24gdGhlIHNlcnZlcgotb3IgY2xpZW50IGNlcnRpZmljYXRlLgotLklQCi1UaGUgInNlcnZlciIgY2VydHMgY2FuIGJlIHVzZWQgYnkgeDExdm5jIGRpcmVjdGx5IGJ5Ci1wb2ludGluZyB0byB0aGVtIHZpYSB0aGUgXGZCLXNzbFxmUiBbcGVtXSBvcHRpb24uICBUaGUgZGVmYXVsdAotZmlsZSB3aWxsIGJlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtLiAgVGhpcyBvbmUgd291bGQKLWJlIHVzZWQgYnkgc2ltcGx5IHR5cGluZyBcZkItc3NsXGZSIFNBVkUuICBUaGUgcGVtIGZpbGUKLWNvbnRhaW5zIGJvdGggdGhlIGNlcnRpZmljYXRlIGFuZCB0aGUgcHJpdmF0ZSBrZXkuCi1zZXJ2ZXIuY3J0IGZpbGUgY29udGFpbnMgdGhlIGNlcnQgb25seS4KLS5JUAotVGhlICJjbGllbnQiIGNlcnQgKyBwcml2YXRlIGtleSBmaWxlIHdpbGwgbmVlZAotdG8gYmUgY29waWVkIGFuZCBpbXBvcnRlZCBpbnRvIHRoZSBWTkMgdmlld2VyCi1zaWRlIGFwcGxpY2F0aW9ucyAoV2ViIGJyb3dzZXIsIEphdmEgcGx1Z2luLAotc3R1bm5lbCwgZXRjLikgIE9uY2UgdGhhdCBpcyBkb25lIHlvdSBjYW4gZGVsZXRlIHRoZQotImNsaWVudCIgcHJpdmF0ZSBrZXkgZmlsZSBvbiB0aGlzIG1hY2hpbmUgc2luY2UKLWl0IGlzIG9ubHkgbmVlZGVkIG9uIHRoZSBWTkMgdmlld2VyIHNpZGUuICBUaGUsCi1lLmcuIH4vLnZuYy9jZXJ0cy9jbGllbnRzLzxuYW1lPi5wZW0gY29udGFpbnMgYm90aAotdGhlIGNlcnQgYW5kIHByaXZhdGUga2V5LiAgVGhlIDxuYW1lPi5jcnQgY29udGFpbnMgdGhlCi1jZXJ0aWZpY2F0ZSBvbmx5LgotLklQCi1OT1RFOiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBrbm93IG9uZSBzaG91bGQKLWdlbmVyYXRlIG5ldyBrZXlzIHdpdGggYSBwYXNzcGhyYXNlLiAgT3RoZXJ3aXNlIGlmIGFuCi11bnRydXN0ZWQgdXNlciBzdGVhbHMgdGhlIGtleSBmaWxlIGhlIGNvdWxkIHVzZSBpdCB0bwotbWFzcXVlcmFkZSBhcyB0aGUgeDExdm5jIHNlcnZlciAob3IgVk5DIHZpZXdlciBjbGllbnQpLgotWW91IHdpbGwgYmUgcHJvbXB0ZWQgd2hldGhlciB0byBlbmNyeXB0IHRoZSBrZXkgd2l0aAotYSBwYXNzcGhyYXNlIG9yIG5vdC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvLgotT25lIGluY29udmVuaWVuY2UgdG8gYSBwYXNzcGhyYXNlIGlzIHRoYXQgaXQgbXVzdAotYmUgdHlwZWQgaW4gRVZFUlkgdGltZSB4MTF2bmMgb3IgdGhlIGNsaWVudCBhcHAgaXMKLXN0YXJ0ZWQgdXAuCi0uSVAKLUV4YW1wbGVzOgotLklQCi14MTF2bmMgXGZCLXNzbEdlbkNlcnRcZlIgc2VydmVyCi14MTF2bmMgXGZCLXNzbFxmUiBTQVZFIFxmQi1kaXNwbGF5XGZSIDowIC4uLgotLklQCi1hbmQgdGhlbiBvbiB2aWV3ZXIgdXNpbmcgc3Nfdm5jdmlld2VyIHN0dW5uZWwgd3JhcHBlcgotKHNlZSB0aGUgRkFRKToKLXNzX3ZuY3ZpZXdlciBcZkItdmVyaWZ5XGZSIC4vY2FjZXJ0LmNydCBob3N0bmFtZTowCi0uSVAKLSh0aGlzIGFzc3VtZXMgdGhlIGNhY2VydC5jcnQgY2VydCBmcm9tIFxmQi1zc2xHZW5DQVxmUgotd2FzIHNhZmVseSBjb3BpZWQgdG8gdGhlIFZOQyB2aWV3ZXIgbWFjaGluZSB3aGVyZQotc3Nfdm5jdmlld2VyIGlzIHJ1bikKLS5JUAotRXhhbXBsZSB1c2luZyBhIG5hbWU6Ci0uSVAKLXgxMXZuYyBcZkItc3NsR2VuQ2VydFxmUiBzZXJ2ZXIgY2hhcmxpZQoteDExdm5jIFxmQi1zc2xcZlIgU0FWRS1jaGFybGllIFxmQi1kaXNwbGF5XGZSIDowIC4uLgotLklQCi1FeGFtcGxlIGZvciBhIGNsaWVudCBjZXJ0aWZpY2F0ZSAocmFyZWx5IHVzZWQpOgotLklQCi14MTF2bmMgXGZCLXNzbEdlbkNlcnRcZlIgY2xpZW50IHJvZ2VyCi1zY3Agfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIucGVtIHNvbWVob3N0Oi4KLXJtICB+Ly52bmMvY2VydHMvY2xpZW50cy9yb2dlci5wZW0KLS5JUAoteDExdm5jIGlzIHRoZW4gc3RhcnRlZCB3aXRoIHRoZSBvcHRpb24gXGZCLXNzbHZlcmlmeVxmUgotfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIuY3J0IChvciBzaW1wbHkgXGZCLXNzbHZlcmlmeVxmUgotcm9nZXIpLCBhbmQgb24gdGhlIHZpZXdlciB1c2VyIG9uIHNvbWVob3N0IGNvdWxkIGRvCi1mb3IgZXhhbXBsZToKLS5JUAotc3Nfdm5jdmlld2VyIFxmQi1teWNlcnRcZlIgLi9yb2dlci5wZW0gaG9zdG5hbWU6MAotLklQCi1JZiB5b3Ugc2V0IHRoZSBlbnYuIHZhciBSRVFfQVJHUz0nLi4uJyBpdCB3aWxsIGJlCi1wYXNzZWQgdG8gb3BlbnNzbCAKLS5JUiByZXEgKDEpLgotQSBjb21tb24gdXNlIHdvdWxkIGJlCi1SRVFfQVJHUz0nLWRheXMgMTA5NScgdG8gYnVtcCB1cCB0aGUgZXhwaXJhdGlvbiBkYXRlCi0oMyB5ZWFycyBpbiB0aGlzIGNhc2UpLgotLlBQCi1cZkItc3NsRW5jS2V5XGZSIFxmSXBlbVxmUgotLklQCi1VdGlsaXR5IHRvIGVuY3J5cHQgYW4gZXhpc3RpbmcgUEVNIGZpbGUgd2l0aCBhCi1wYXNzcGhyYXNlIHlvdSBzdXBwbHkgd2hlbiBwcm9tcHRlZC4gIEZvciB0aGF0IGtleSB0byBiZQotdXNlZCAoZS5nLiBieSB4MTF2bmMpIHRoZSBwYXNzcGhyYXNlIG11c3QgYmUgc3VwcGxpZWQKLWVhY2ggdGltZS4KLS5JUAotVGhlICJTQVZFIiBub3RhdGlvbiBkZXNjcmliZWQgdW5kZXIgXGZCLXNzbFxmUiBhcHBsaWVzIGFzCi13ZWxsLiAocHJlY2VkZSB0aGlzIG9wdGlvbiB3aXRoIFxmQi1zc2xkaXJcZlIgW2Rpcl0gdG8gcmVmZXIKLWEgZGlyZWN0b3J5IGJlc2lkZXMgdGhlIGRlZmF1bHQgfi8udm5jL2NlcnRzKQotLklQCi1UaGUgCi0uSVIgb3BlbnNzbCAoMSkKLXByb2dyYW0gbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbQotYW5kIGF2YWlsYWJsZSBpbiBQQVRILiAgQWZ0ZXIgdGhlIEtleSBmaWxlIGlzIGVuY3J5cHRlZAotdGhlIHgxMXZuYyBjb21tYW5kIGV4aXRzOyB0aGUgVk5DIHNlcnZlciBpcyBub3QgcnVuLgotLklQCi1FeGFtcGxlczoKLXgxMXZuYyBcZkItc3NsRW5jS2V5XGZSIC9wYXRoL3RvL2Zvby5wZW0KLXgxMXZuYyBcZkItc3NsRW5jS2V5XGZSIFNBVkUKLXgxMXZuYyBcZkItc3NsRW5jS2V5XGZSIFNBVkUtY2hhcmxpZQotLlBQCi1cZkItc3NsQ2VydEluZm9cZlIgXGZJcGVtXGZSCi0uSVAKLVByaW50cyBvdXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhpc3RpbmcgUEVNIGZpbGUuCi1JbiBhZGRpdGlvbiB0aGUgcHVibGljIGNlcnRpZmljYXRlIGlzIGFsc28gcHJpbnRlZC4KLVRoZSAKLS5JUiBvcGVuc3NsICgxKQotcHJvZ3JhbSBtdXN0IGJlIGluIFBBVEguIEJhc2ljYWxseSB0aGUKLWNvbW1hbmQgIm9wZW5zc2wgeDUwOSBcZkItdGV4dCJcZlIgaXMgcnVuIG9uIHRoZSBwZW0uCi0uSVAKLUFmdGVyIHRoZSBpbmZvIGlzIHByaW50ZWQgdGhlIHgxMXZuYyBjb21tYW5kIGV4aXRzOwotdGhlIFZOQyBzZXJ2ZXIgaXMgbm90IHJ1bi4KLS5JUAotVGhlICJTQVZFIiBub3RhdGlvbiBkZXNjcmliZWQgdW5kZXIgXGZCLXNzbFxmUiBhcHBsaWVzCi1hcyB3ZWxsLgotLklQCi1Vc2luZyAgIkxJU1QiIHdpbGwgZ2l2ZSBhIGxpc3Qgb2YgYWxsIGNlcnRzIGJlaW5nCi1tYW5hZ2VkIChpbiB0aGUgfi8udm5jL2NlcnRzIGRpciwgdXNlIFxmQi1zc2xkaXJcZlIgdG8gcmVmZXIKLXRvIGFub3RoZXIgZGlyKS4gICJBTEwiIHdpbGwgcHJpbnQgb3V0IHRoZSBpbmZvIGZvcgotZXZlcnkgbWFuYWdlZCBrZXkgKHRoaXMgY2FuIGJlIHZlcnkgbG9uZykuICBHaXZpbmcgYQotY2xpZW50IG9yIHNlcnZlciBjZXJ0IHNob3J0bmFtZSB3aWxsIGFsc28gdHJ5IGEgbG9va3VwCi0oZS5nLiBcZkItc3NsQ2VydEluZm9cZlIgY2hhcmxpZSkuICBVc2UgIkxJU1RMIiBvciAiTEwiCi1mb3IgYSBsb25nIChscyBcZkItbFxmUiBzdHlsZSkgbGlzdGluZy4KLS5JUAotVXNpbmcgIkhBU0hPTiIgd2lsbCBjcmVhdGUgc3ViZGlycyBbZGlyXS9IQVNIIGFuZAotW2Rpcl0vSEFTSCB3aXRoIE9wZW5TU0wgaGFzaCBmaWxlbmFtZXMgKGUuZy4gMGQ1ZmJiZjEuMCkKLXN5bWxpbmtzIHBvaW50aW5nIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nICouY3J0IGZpbGUuCi0oW2Rpcl0gaXMgfi8udm5jL2NlcnRzIG9yIG9uZSBnaXZlbiBieSBcZkItc3NsZGlyLilcZlIKLVRoaXMgaXMgYSB1c2VmdWwgd2F5IGZvciBvdGhlciBPcGVuU1NMIGFwcGxpY2F0aW9ucwotKGUuZy4gc3R1bm5lbCkgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY2VydHMgd2l0aG91dAotaGF2aW5nIHRvIGNvbmNhdGVuYXRlIHRoZW0uICB4MTF2bmMgd2lsbCBub3QgdXNlIHRoZW0KLXVubGVzcyB5b3Ugc3BlY2lmaWNhbGx5IHJlZmVyZW5jZSB0aGVtLiAgIkhBU0hPRkYiCi1yZW1vdmVzIHRoZXNlIEhBU0ggc3ViZGlycy4KLS5JUAotVGhlIExJU1QsIExJU1RMLCBMTCwgQUxMLCBIQVNIT04sIEhBU0hPRkYgd29yZHMgY2FuCi1hbHNvIGJlIGxvd2VyY2FzZSwgZS5nLiAibGlzdCIuCi0uUFAKLVxmQi1zc2xEZWxDZXJ0XGZSIFxmSXBlbVxmUgotLklQCi1Qcm9tcHRzIHlvdSB0byBkZWxldGUgYWxsIC5jcnQgLnBlbSAua2V5IC5yZXEgZmlsZXMKLWFzc29jaWF0ZWQgd2l0aCBbcGVtXS4gIHgxMXZuYyB0aGVuIGV4aXRzLiAiU0FWRSIKLWFuZCBsb29rdXBzIGFzIGluIFxmQi1zc2xDZXJ0SW5mb1xmUiBhcHBseSBhcyB3ZWxsLgotLlBQCi1cZkItc3NsU2NyaXB0c1xmUgotLklQCi1QcmludHMgb3V0IGJvdGggdGhlICdnZW5DQScgYW5kICdnZW5DZXJ0JyB4MTF2bmMKLW9wZW5zc2wgd3JhcHBlciBzY3JpcHRzIGZvciB5b3UgdG8gZXhhbWluZSwgbW9kaWZ5LCBldGMuCi1UaGUgc2NyaXB0cyBhcmUgcHJpbnRlZCB0byBzdGRvdXQgYW5kIHRoZW4gdGhlIHgxMXZuYwotcHJvZ3JhbSBleGl0cy4KLS5QUAotXGZCLXN0dW5uZWxcZlIgXGZJW3BlbV1cZlIKLS5JUAotVXNlIHRoZSAKLS5JUiBzdHVubmVsICg4KQotKHN0dW5uZWwubWlydC5uZXQpIHRvIHByb3ZpZGUgYW4KLWVuY3J5cHRlZCBTU0wgdHVubmVsIGJldHdlZW4gdmlld2VycyBhbmQgeDExdm5jLgotLklQCi1UaGlzIGV4dGVybmFsIHR1bm5lbCBtZXRob2Qgd2FzIGltcGxlbWVudGVkIHByaW9yIHRvIHRoZQotaW50ZWdyYXRlZCBcZkItc3NsXGZSIGVuY3J5cHRpb24gZGVzY3JpYmVkIGFib3ZlLiAgSXQgc3RpbGwKLXdvcmtzIHdlbGwgYW5kIGF2b2lkcyB0aGUgcmVxdWlyZW1lbnQgb2YgbGlua2luZyB3aXRoCi10aGUgT3BlblNTTCBsaWJyYXJpZXMuICBUaGlzIG1vZGUgcmVxdWlyZXMgc3R1bm5lbAotdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZSB2aWEgUEFUSAotKG4uYi4gc3R1bm5lbCBpcyBvZnRlbiBpbnN0YWxsZWQgaW4gc2JpbiBkaXJlY3RvcmllcykuCi1WZXJzaW9uIDQueCBvZiBzdHVubmVsIGlzIGFzc3VtZWQgKGJ1dCBzZWUgXGZCLXN0dW5uZWwzXGZSCi1iZWxvdy4pCi0uSVAKLVtwZW1dIGlzIG9wdGlvbmFsLCB1c2UgIlxmQi1zdHVubmVsXGZSIFxmSS9wYXRoL3RvL3N0dW5uZWwucGVtXGZSIgotdG8gc3BlY2lmeSBhIFBFTSBjZXJ0aWZpY2F0ZSBmaWxlIHRvIHBhc3MgdG8gc3R1bm5lbC4KLVNlZSB0aGUgXGZCLXNzbFxmUiBvcHRpb24gZm9yIG1vcmUgaW5mbyBvbiBjZXJ0aWZpY2F0ZSBmaWxlcy4KLS5JUAotV2hldGhlciBvciBub3QgeW91ciBzdHVubmVsIGhhcyBpdHMgb3duIGNlcnRpZmljYXRlCi1kZXBlbmRzIG9uIHlvdXIgc3R1bm5lbCBjb25maWd1cmF0aW9uOyBzdHVubmVsIG9mdGVuCi1nZW5lcmF0ZXMgb25lIGF0IGluc3RhbGwgdGltZS4gIFNlZSB5b3VyIHN0dW5uZWwKLWRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuICBJbiBhbnkgZXZlbnQsIGlmIHlvdSB3YW50IHRvCi11c2UgdGhpcyBjZXJ0aWZpY2F0ZSB5b3UgbXVzdCBzdXBwbHkgdGhlIGZ1bGwgcGF0aCB0byBpdAotYXMgW3BlbV0uICBOb3RlOiB0aGUgZmlsZSBtYXkgb25seSBiZSByZWFkYWJsZSBieSByb290LgotLklQCi1bcGVtXSBtYXkgYWxzbyBiZSB0aGUgc3BlY2lhbCBzdHJpbmdzICJUTVAiLCAiU0FWRSIsCi1hbmQgIlNBVkUuLi4iIGFzIGRlc2NyaWJlZCBpbiB0aGUgXGZCLXNzbFxmUiBvcHRpb24uCi1JZiBbcGVtXSBpcyBub3Qgc3VwcGxpZWQsICJTQVZFIiBpcyBhc3N1bWVkLgotLklQCi1Ob3RlIHRoYXQgdGhlIFZlTkNyeXB0LCBBTk9OVExTLCBhbmQgIkFOT04iIG1vZGVzCi1hcmUgbm90IHN1cHBvcnRlZCBpbiBcZkItc3R1bm5lbFxmUiBtb2RlLgotLklQCi1zdHVubmVsIGlzIHN0YXJ0ZWQgdXAgYXMgYSBjaGlsZCBwcm9jZXNzIG9mIHgxMXZuYyBhbmQKLWFueSBTU0wgY29ubmVjdGlvbnMgc3R1bm5lbCByZWNlaXZlcyBhcmUgZGVjcnlwdGVkIGFuZAotc2VudCB0byB4MTF2bmMgb3ZlciBhIGxvY2FsIHNvY2tldC4gIFRoZSBzdHJpbmdzCi0iVGhlIFNTTCBWTkMgZGVza3RvcCBpcyAuLi4iIGFuZCAiU1NMUE9SVD0uLi4iCi1hcmUgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cCB0byBpbmRpY2F0ZSB0aGlzLgotLklQCi1UaGUgXGZCLWxvY2FsaG9zdFxmUiBvcHRpb24gaXMgZW5mb3JjZWQgYnkgZGVmYXVsdCB0byBhdm9pZAotcGVvcGxlIHJvdXRpbmcgYXJvdW5kIHRoZSBTU0wgY2hhbm5lbC4gIFVzZSBcZkItZW52XGZSCi1TVFVOTkVMX0RJU0FCTEVfTE9DQUxIT1NUPTEgdG8gZGlzYWJsZSB0aGlzIHNlY3VyaXR5Ci1yZXF1aXJlbWVudC4KLS5JUAotU2V0IFxmQi1lbnZcZlIgU1RVTk5FTF9ERUJVRz0xIGZvciBtb3JlIGRlYnVnZ2luZyBwcmludG91dC4KLS5JUAotU2V0IFxmQi1lbnZcZlIgU1RVTk5FTF9QUk9HPXh4eCB0byB0aGUgZnVsbCBwYXRoIG9mIHN0dW5uZWwKLXByb2dyYW0geW91IHdhbnQgdG8gYmUgdXNlZCAoZS5nLiAvdXNyL2Jpbi9zdHVubmVsNCkuCi0uSVAKLVNldCBcZkItZW52XGZSIFNUVU5ORUxfTElTVEVOPXh4eCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKLW5ldHdvcmsgaW50ZXJmYWNlIHRvIGxpc3RlbiBvbiAodGhlIGRlZmF1bHQgaXMgdG8gbGlzdGVuCi1vbiBhbGwgaW50ZXJmYWNlcyksIGUuZy4gU1RVTk5FTF9MSVNURU49MTkyLjE2OC4xLjEwMC4KLS5JUAotQSBzaW1wbGUgd2F5IHRvIGFkZCBJUHY2IHN1cHBvcnQgaXMgU1RVTk5FTF9MSVNURU49OjoKLS5JUAotWW91ciBWTkMgdmlld2VyIHdpbGwgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gY29ubmVjdAotdmlhIFNTTC4gIFVuZm9ydHVuYXRlbHkgbm90IHRvbyBtYW55IGRvIHRoaXMuICBTZWUgdGhlCi1pbmZvcm1hdGlvbiBhYm91dCBTU0wgdmlld2VycyB1bmRlciB0aGUgXGZCLXNzbFxmUiBvcHRpb24uCi1UaGUgeDExdm5jIHByb2plY3QncyBTU1ZOQyBpcyBhbiBvcHRpb24uCi0uSVAKLUFsc28sIGluIHRoZSB4MTF2bmMgZGlzdHJpYnV0aW9uLCBwYXRjaGVkIFRpZ2h0Vk5DCi1hbmQgVWx0cmFWTkMgSmF2YSBhcHBsZXQgamFyIGZpbGVzIGFyZSBwcm92aWRlZCBpbgotdGhlIGNsYXNzZXMvc3NsIGRpcmVjdG9yeSB0aGF0IGRvIFNTTCBjb25uZWN0aW9ucy4KLUVuYWJsZSBzZXJ2aW5nIHRoZW0gd2l0aCB0aGUgXGZCLWh0dHAsXGZSIFxmQi1odHRwX3NzbCxcZlIgb3IKLVxmQi1odHRwZGlyXGZSIChzZWUgdGhlIG9wdGlvbiBkZXNjcmlwdGlvbnMgZm9yIG1vcmUgaW5mby4pCi0uSVAKLU5vdGUgdGhhdCBmb3IgdGhlIEphdmEgdmlld2VyIGFwcGxldCB1c2FnZSB0aGUKLSI/UE9SVD14eHh4IiBpbiB0aGUgdmFyaW91cyBVUkxzIHByaW50ZWQgYXQgc3RhcnR1cAotd2lsbCBuZWVkIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSB3ZWIgYnJvd3NlciB0byBjb25uZWN0Ci1wcm9wZXJseS4KLS5JUAotQ3VycmVudGx5IHRoZSBhdXRvbWF0aWMgInNpbmdsZSBwb3J0IiBIVFRQUyBtb2RlIG9mCi1cZkItc3NsXGZSIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgaW4gXGZCLXN0dW5uZWxcZlIgbW9kZS4gIEhvd2V2ZXIsCi1pdCBjYW4gYmUgZW11bGF0ZWQgdmlhOgotLklQCi0lIHgxMXZuYyBcZkItc3R1bm5lbFxmUiBcZkItaHR0cF9zc2xcZlIgXGZCLWh0dHBfb25lcG9ydFxmUiAuLi4KLS5JUAotSW4gZ2VuZXJhbCwgaXQgaXMgYWxzbyBub3QgdG9vIGRpZmZpY3VsdCB0byBzZXQgdXAKLWFuIHN0dW5uZWwgb3Igb3RoZXIgU1NMIHR1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUuCi1BIHNpbXBsZSBleGFtcGxlIG9uIFVuaXggdXNpbmcgc3R1bm5lbCAzLnggaXM6Ci0uSVAKLSUgc3R1bm5lbCBcZkItY1xmUiBcZkItZFxmUiBsb2NhbGhvc3Q6NTkwMSBcZkItclxmUiByZW1vdGVob3N0OjU5MDAKLSUgdm5jdmlld2VyIGxvY2FsaG9zdDoxCi0uSVAKLUZvciBXaW5kb3dzLCBzdHVubmVsIGhhcyBiZWVuIHBvcnRlZCB0byBpdCBhbmQgdGhlcmUKLWFyZSBwcm9iYWJseSBvdGhlciBzdWNoIHRvb2xzIGF2YWlsYWJsZS4gIFNlZSB0aGUgRkFRCi1hbmQgU1NWTkMgZm9yIG1vcmUgZXhhbXBsZXMuCi0uUFAKLVxmQi1zdHVubmVsM1xmUiBcZklbcGVtXVxmUgotLklQCi1Vc2UgdmVyc2lvbiAzLnggc3R1bm5lbCBjb21tYW5kIGxpbmUgc3ludGF4IGluc3RlYWQgb2YKLXZlcnNpb24gNC54LiAgVGhlIFxmQi1odHRwLy1odHRwZGlyXGZSIEphdmEgYXBwbGV0IHNlcnZpbmcKLWlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlIGluIHRoaXMgbW9kZS4KLS5QUAotXGZCLWVuY1xmUiBcZkljaXBoZXI6a2V5ZmlsZVxmUgotLklQCi1Vc2Ugc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0aCBjaXBoZXIgImNpcGhlciIKLWFuZCBzZWNyZXQga2V5IGRhdGEgaW4gImtleWZpbGUiLiAgSWYga2V5ZmlsZSBpcwotcHc9PHN0cmluZz4gdGhlbiAic3RyaW5nIiBpcyB1c2VkIGFzIHRoZSBrZXkgZGF0YS4KLS5JUAotTk9URTogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIFNTTCB2aWEgdGhlIFxmQi1zc2xcZlIKLW9wdGlvbiBpbnN0ZWFkIG9mIHRoaXMgb3B0aW9uIGJlY2F1c2UgU1NMIGlzIHdlbGwKLXVuZGVyc3Rvb2QgYW5kIHRha2VzIGdyZWF0IGNhcmUgdG8gZXN0YWJsaXNoIHVuaXF1ZQotc2Vzc2lvbiBrZXlzIGFuZCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KLVVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZGVhbCB3aXRoIFNTTAotY2VydGlmaWNhdGVzIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgZG8gbm90IHdhbnQgdG8KLXVzZSBTU0ggYnV0IHdhbnQgc29tZSBlbmNyeXB0aW9uIGZvciB5b3VyIFZOQyBzZXNzaW9uLgotT3IgaWYgeW91IG11c3QgaW50ZXJmYWNlIHdpdGggYSBzeW1tZXRyaWMga2V5IHR1bm5lbAotdGhhdCB5b3UgZG8gbm90IGhhdmUgY29udHJvbCBvdmVyLgotLklQCi1Ob3RlIHRoYXQgdGhpcyBtb2RlIHdpbGwgTk9UIHdvcmsgd2l0aCB0aGUgVWx0cmFWTkMgRFNNCi1wbHVnaW5zIGJlY2F1c2UgdGhleSBhbHRlciB0aGUgUkZCIHByb3RvY29sIGluIGFkZGl0aW9uCi10byB0dW5uZWxsaW5nIHdpdGggdGhlIHN5bW1ldHJpYyBjaXBoZXIgKGFuIHVuZm9ydHVuYXRlCi1jaG9pY2Ugb2YgaW1wbGVtZW50YXRpb24uLi4pCi0uSVAKLWNpcGhlciBjYW4gYmUgb25lIG9mOiAgYXJjNCwgYWVzdjIsIGFlcy1jZmIsIGJsb3dmaXNoLAotYWVzMjU2LCBvciAzZGVzLiAgU2VlIHRoZSBPcGVuU1NMIGRvY3VtZW50YXRpb24gZm9yCi1tb3JlIGluZm8uICBUaGUga2V5c2l6ZSBpcyAxMjggYml0cyAoZXhjZXB0IGZvciBhZXMyNTYpLgotSGVyZSBpcyBvbmUgd2F5IHRvIG1ha2UgYSBrZXlmaWxlIHdpdGggdGhhdCBtYW55IGJpdHM6Ci0uSVAKLWRkIGlmPS9kZXYvcmFuZG9tIG9mPS4vbXkua2V5IGJzPTE2IGNvdW50PTEKLS5JUAoteW91IHdpbGwgbmVlZCB0byBzZWN1cmVseSBzaGFyZSB0aGlzIGtleSB3aXRoIHRoZSBvdGhlcgotc2lkZSBvZiB0aGUgVk5DIGNvbm5lY3Rpb24gKFNlZSBTU1ZOQyBmb3IgZXhhbXBsZXMpLgotLklQCi1FeGFtcGxlOiAgXGZCLWVuY1xmUiBibG93ZmlzaDouL215LmtleQotRXhhbXBsZTogIFxmQi1lbmNcZlIgYmxvd2Zpc2g6cHc9c3dvcmRmaXNoCi0uSVAKLUJ5IGRlZmF1bHQgMTYgYnl0ZXMgb2YgcmFuZG9tIHNhbHQgZm9sbG93ZWQgYnkgMTYgYnl0ZXMKLW9mIHJhbmRvbSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYXJlIHNlbnQgYXQgdGhlIHZlcnkKLWJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiAgVGhlIG90aGVyIHNpZGUgbXVzdCByZWFkIHRoZXNlCi1hbmQgaW5pdGlhbGl6ZSB0aGVpciBjaXBoZXIgd2l0aCB0aGVtLiAgVGhlc2UgdmFsdWVzCi1tYWtlIHRoZSBzZXNzaW9uIGtleSB1bmlxdWUgKHdpdGhvdXQgdGhlbSB0aGUgc2VjdXJpdHkKLWlzIG1pbmltYWwpLiAgU2ltaWxhcmx5LCB0aGUgb3RoZXIgc2lkZSBtdXN0IHNlbmQgdXMKLWl0cyByYW5kb20gc2FsdCBhbmQgSVYgd2l0aCB0aG9zZSBzYW1lIGxlbmd0aHMuCi0uSVAKLVRoZSBzYWx0IGFuZCBrZXkgZGF0YSBhcmUgY29tYmluZWQgdG8gY3JlYXRlIGEgc2Vzc2lvbgota2V5IHVzaW5nIGFuIG1kNSBoYXNoIGFzIGRlc2NyaWJlZCBpbiAKLS5JUiBFVlBfQnl0ZXNUb0tleSAoMykuCi0uSVAKLVRoZSBleGFjdCBjYWxsIGlzOiBFVlBfQnl0ZXNUb0tleShDaXBoZXIsIEVWUF9tZDUoKSwKLXNhbHQsIGtleWRhdGEsIGxlbiwgMSwga2V5c3RyLCBOVUxMKTsgIHdoZXJlIHNhbHQgaXMKLXRoZSByYW5kb20gZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCBrZXlkYXRhIGlzIHRoZQotc2hhcmVkIHNlY3JldCBrZXkgZGF0YS4gIGtleXN0ciBpcyB0aGUgcmVzdWx0aW5nIHNlc3Npb24KLWtleS4gIFRoZSBjaXBoZXIgaXMgdGhlbiBzZWVkZWQgd2l0aCBrZXlzdHIgYW5kIHVzZXMKLXRoZSByYW5kb20gaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFzIGl0cyBmaXJzdCBibG9jay4KLS5JUAotVG8gbW9kaWZ5IHRoZSBhbW91bnQgb2YgcmFuZG9tIHNhbHQgYW5kIGluaXRpYWxpemF0aW9uCi12ZWN0b3IgdXNlIGNpcGhlckBuLG0gd2hlcmUgbiBpcyB0aGUgc2FsdCBsZW5ndGggYW5kCi1tIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgbGVuZ3RoLiAgRS5nLgotLklQCi1cZkItZW5jXGZSIGFlcy1jZmJAOCwxNjouL215LmtleQotLklQCi1JdCBpcyBub3QgYSBnb29kIGlkZWEgdG8gc2V0IGVpdGhlciBvbmUgdG8gemVybywKLWFsdGhvdWdoIHlvdSBtYXkgYmUgZm9yY2VkIHRvIGlmIHRoZSBvdGhlciBzaWRlIG9mIHRoZQotdHVubmVsIGlzIG5vdCB1bmRlciB5b3VyIGNvbnRyb2wuCi0uSVAKLVRvIHNraXAgdGhlIHNhbHQgYW5kIEVWUF9CeXRlc1RvS2V5IE1ENSBlbnRpcmVseSAobm8KLWhhc2hpbmcgaXMgZG9uZTogdGhlIGtleWRhdGEgaXMgZGlyZWN0bHkgaW5zZXJ0ZWQgaW50bwotdGhlIGNpcGhlcikgc3BlY2lmeSAiLTEiIGZvciB0aGUgc2FsdCwgZS5nLgotLklQCi1cZkItZW5jXGZSIGJsb3dmaXNoQC0xLDE2Oi4vbXkua2V5Ci0uSVAKLVRoZSBtZXNzYWdlIGRpZ2VzdCBjYW4gYWxzbyBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZwotYmVzaWRlcyB0aGUgZGVmYXVsdCBNRDUuICBVc2UgY2lwaGVyQG1kK24sbSB3aGVyZSAibWQiCi1jYW4gYmUgb25lIG9mIHNoYSwgc2hhMSwgbWQ1LCBvciByaXBlLiAgRm9yIGV4YW1wbGU6Ci0uSVAKLVxmQi1lbmNcZlIgYXJjNEBzaGErOCwxNjouL215LmtleQotLklQCi1UaGUgU1NWTkMgdm5jIHZpZXdlciBwcm9qZWN0IHN1cHBsaWVzIGEgc3ltbWV0cmljCi1lbmNyeXB0aW9uIHRvb2wgbmFtZWQgInVsdHJhdm5jX2RzbV9oZWxwZXIiIHRoYXQgY2FuCi1iZSB1c2VkIG9uIHRoZSB2aWV3ZXIgc2lkZS4gIEZvciBleGFtcGxlOgotLklQCi1zc3ZuY3ZpZXdlciBleGVjPSd1bHRyYXZuY19kc21faGVscGVyIGFyYzQgbXkua2V5IDAgaDpwJwotLklQCi13aGVyZSBoOnAgaXMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9mIHRoZSB4MTF2bmMgc2VydmVyLgotdWx0cmF2bmNfZHNtX2hlbHBlciBtYXkgYWxzbyBiZSB1c2VkIHN0YW5kYWxvbmUgdG8KLXByb3ZpZGUgYSBzeW1tZXRyaWMgZW5jcnlwdGlvbiB0dW5uZWwgZm9yIGFueSB2aWV3ZXIKLW9yIHNlcnZlciAoVk5DIG9yIG90aGVyd2lzZS4pIFRoZSBjaXBoZXIgKDFzdCBhcmcpCi1pcyBiYXNpY2FsbHkgdGhlIHNhbWUgc3ludGF4IGFzIHdlIHVzZSBhYm92ZS4KLS5JUAotQWxzbyBzZWUgdGhlICdOb24tVWx0cmEgRFNNJyBTU1ZOQyBvcHRpb24gZm9yIHRoZQotXCdVbHRyYVZOQyBEU00gRW5jcnlwdGlvbiBQbHVnaW4nIGFkdmFuY2VkIG9wdGlvbi4KLS5JUAotRm9yIGJvdGggd2F5cyBvZiB1c2luZyB0aGUgdmlld2VyLCB5b3UgY2FuIHNwZWNpZnkgdGhlCi1zYWx0LGl2ZWMgc2l6ZXMgKGluIEdVSSBvciwgZS5nLiBhcmM0QDgsMTYpLgotLlBQCi1cZkItaHR0cHNcZlIgXGZJW3BvcnRdXGZSCi0uSVAKLVVzZSBhIHNwZWNpYWwsIHNlcGFyYXRlIEhUVFBTIHBvcnQgKC1zc2wgYW5kCi1cZkItc3R1bm5lbFxmUiBtb2RlcyBvbmx5KSBmb3IgSFRUUFMgSmF2YSB2aWV3ZXIgYXBwbGV0Ci1kb3dubG9hZGluZy4gSS5lLiBub3QgNTkwMCBhbmQgbm90IDU4MDAgKHRoZSBkZWZhdWx0cy4pCi0uSVAKLUJBQ0tHUk9VTkQ6IEluIFxmQi1zc2xcZlIgbW9kZSwgaXQgdHVybnMgb3V0IHlvdSBjYW4gdXNlIHRoZQotc2luZ2xlIFZOQyBwb3J0IChlLmcuIDU5MDApIGZvciBib3RoIFZOQyBhbmQgSFRUUFMKLWNvbm5lY3Rpb25zLiAoSFRUUFMgaXMgdXNlZCB0byByZXRyaWV2ZSBhIFNTTC1hd2FyZQotVm5jVmlld2VyLmphciBhcHBsZXQgdGhhdCBpcyBwcm92aWRlZCB3aXRoIHgxMXZuYykuCi1TaW5jZSBib3RoIHVzZSBTU0wgdGhlIGltcGxlbWVudGF0aW9uIHdhcyBleHRlbmRlZCB0bwotZGV0ZWN0IGlmIEhUVFAgdHJhZmZpYyAoaS5lLiBHRVQpIGlzIHRha2luZyBwbGFjZSBhbmQKLWhhbmRsZSBpdCBhY2NvcmRpbmdseS4gIFRoZSBVUkwgd291bGQgYmUsIGUuZy46Ci0uSVAKLWh0dHBzOi8vbXltYWNoaW5lLm9yZzo1OTAwLwotLklQCi1UaGlzIGlzIGNvbnZlbmllbnQgZm9yIGZpcmV3YWxscywgZXRjLCBiZWNhdXNlIG9ubHkgb25lCi1wb3J0IG5lZWRzIHRvIGJlIGFsbG93ZWQgaW4uICBIb3dldmVyLCB0aGlzIGhldXJpc3RpYwotYWRkcyBhIGZldyBzZWNvbmRzIGRlbGF5IHRvIGVhY2ggY29ubmVjdGlvbiBhbmQgY2FuIGJlCi11bnJlbGlhYmxlIChlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRha2VzIG11Y2ggdGltZSB0bwotcG9uZGVyIHRoZSBDZXJ0aWZpY2F0ZSBkaWFsb2dzIGluIGhpcyBicm93c2VyLCBKYXZhIFZNLAotb3IgVk5DIFZpZXdlciBhcHBsZXQuICBUaGF0J3MgcmlnaHQgMyBzZXBhcmF0ZSAiQXJlCi15b3Ugc3VyZSB5b3Ugd2FudCB0byBjb25uZWN0PyIgZGlhbG9ncyEpCi0uSVAKLUVORCBPRiBCQUNLR1JPVU5ELgotLklQCi1VU0FHRTogU28gdXNlIHRoZSBcZkItaHR0cHNcZlIgb3B0aW9uIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSwKLW1vcmUgcmVsaWFibGUgSFRUUFMgcG9ydCB0aGF0IHgxMXZuYyB3aWxsIGxpc3RlbiBvbi4gIElmCi1bcG9ydF0gaXMgbm90IHByb3ZpZGVkIChvciBpcyAwKSwgb25lIGlzIGF1dG9zZWxlY3RlZC4KLVRoZSBVUkwgdG8gdXNlIGlzIHByaW50ZWQgb3V0IGF0IHN0YXJ0dXAuCi0uSVAKLVRoZSBTU0wgSmF2YSBhcHBsZXQgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCB2aWEgdGhlCi1cZkItaHR0cGRpclxmUiBvcHRpb24uICBJZiBub3Qgc3VwcGxpZWQsIFxmQi1odHRwc1xmUiB3aWxsIHRyeQotdG8gZ3Vlc3MgdGhlIGRpcmVjdG9yeSBhcyB0aG91Z2ggdGhlIFxmQi1odHRwXGZSIG9wdGlvbgotd2FzIHN1cHBsaWVkLgotLlBQCi1cZkItaHR0cHNyZWRpclxmUiBcZklbcG9ydF1cZlIKLS5JUAotSW4gXGZCLXNzbFxmUiBtb2RlIHdpdGggdGhlIEphdmEgYXBwbGV0IHJldHJpZXZlZCB2aWEgSFRUUFMsCi13aGVuIHRoZSBIVE1MIGZpbGUgY29udGFpbmluZyBhcHBsZXQgcGFyYW1ldGVycwotKCdpbmRleC52bmMnIG9yICdwcm94eS52bmMnKSBpcyBzZW50IGRvIE5PVCBzZXQgdGhlCi1hcHBsZXQgUE9SVCBwYXJhbWV0ZXIgdG8gdGhlIGFjdHVhbCBWTkMgcG9ydCBidXQgc2V0IGl0Ci10byAicG9ydCIgaW5zdGVhZC4gIElmICJwb3J0IiBpcyBub3Qgc3VwcGxpZWQsIHRoZW4KLXRoZSBwb3J0IG51bWJlciBpcyBndWVzc2VkIGZyb20gdGhlIEhvc3Q6IEhUVFAgaGVhZGVyLgotLklQCi1UaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIGluY29taW5nIFRDUCBjb25uZWN0aW9uCi1yZWRpcmVjdGlvbiBpcyBwZXJmb3JtZWQgYnkgYSByb3V0ZXIvZ2F0ZXdheS9maXJld2FsbAotZnJvbSBvbmUgcG9ydCB0byBhbiBpbnRlcm5hbCBtYWNoaW5lIHdoZXJlIHgxMXZuYyBpcwotbGlzdGVuaW5nIG9uIGEgZGlmZmVyZW50IHBvcnQuIFRoZSBKYXZhIGFwcGxldCBuZWVkcyB0bwotY29ubmVjdCB0byB0aGUgZmlyZXdhbGwvcm91dGVyIHBvcnQsIG5vdCB0aGUgVk5DIHBvcnQKLW9uIHRoZSBpbnRlcm5hbCB3b3Jrc3RhdGlvbi4gRm9yIGV4YW1wbGUsIG9uZSBjb3VsZAotcmVkaXIgZnJvbSBteWdhdGV3YXkuY29tOjQ0MyB0byB3b3Jrc3RhdGlvbjo1OTAwLgotLklQCi1UaGlzIHNwYXJlcyB0aGUgdXNlciBmcm9tIGhhdmluZyB0byB0eXBlIGluCi1odHRwczovL215Z2F0ZXdheS5jb20vP1BPUlQ9NDQzIGludG8gdGhlaXIgd2ViCi1icm93c2VyLiBOb3RlIHRoYXQgcG9ydCA0NDMgaXMgdGhlIGRlZmF1bHQgaHR0cHMgcG9ydDsKLW90aGVyIHBvcnRzIG11c3QgYmUgZXhwbGljaXRseSBpbmRpY2F0ZWQsIGZvciBleGFtcGxlOgotaHR0cHM6Ly9teWdhdGV3YXkuY29tOjgwMDAvP1BPUlQ9ODAwMC4gIFRvIGF2b2lkIGhhdmluZwotdG8gaW5jbHVkZSB0aGUgUE9SVD0gaW4gdGhlIGJyb3dzZXIgVVJMLCBzaW1wbHkgc3VwcGx5Ci0iXGZCLWh0dHBzcmVkaXJcZlIiIHRvIHgxMXZuYy4KLS5JUAotVGhpcyBvcHRpb24gZG9lcyBub3Qgd29yayBpbiBcZkItc3R1bm5lbFxmUiBtb2RlLgotLklQCi1Nb3JlIHRyaWNrczogc2V0IHRoZSBlbnYgdmFyIFgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVMKLXRvIGJlIGV4dHJhIFVSTCBwYXJhbWV0ZXJzIHRvIHVzZS4gIFRoaXMgd2F5IHlvdSBkbwotbm90IG5lZWQgdG8gc3BlY2lmeSBleHRyYSBQQVJBTVMgaW4gdGhlIGluZGV4LnZuYyBmaWxlLgotRS5nLiB4MTF2bmMgXGZCLWVudlxmUiBYMTFWTkNfRVhUUkFfSFRUUFNfUEFSQU1TPSc/R0VUPTEnIC4uLgotLklQCi1JZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBub24tU1NMIEhUVFAgcG9ydCB0bwotdGhlIG5ldHdvcmsgKGkuZS4geW91IGp1c3Qgd2FudCB0aGUgc2luZ2xlIFZOQy9IVFRQUwotcG9ydCwgZS5nLiA1OTAwLCBvcGVuIGZvciBjb25uZWN0aW9ucykgdGhlbiBzcGVjaWZ5IHRoZQotb3B0aW9uIFxmQi1lbnZcZlIgWDExVk5DX0hUVFBfTElTVEVOX0xPQ0FMSE9TVD0xICBUaGlzIHdheQotdGhlIGNvbm5lY3Rpb24gdG8gdGhlIExpYlZOQ1NlcnZlciBodHRwZCBzZXJ2ZXIgd2lsbAotb25seSBiZSBhdmFpbGFibGUgb24gbG9jYWxob3N0IChub3RlIHRoYXQgaW4gXGZCLXNzbFxmUiBtb2RlLAotSFRUUFMgcmVxdWVzdHMgYXJlIHJlZGlyZWN0ZWQgZnJvbSBTU0wgdG8gdGhlIG5vbi1TU0wKLUxpYlZOQ1NlcnZlciBIVFRQIHNlcnZlci4pCi0uUFAKLVxmQi1odHRwX29uZXBvcnRcZlIKLS5JUAotRm9yIFVOLWVuY3J5cHRlZCBjb25uZWN0aW9ucyBtb2RlIChpLmUuIG5vIFxmQi1zc2wsXGZSCi1cZkItc3R1bm5lbCxcZlIgb3IgXGZCLWVuY1xmUiBvcHRpb25zKSwgYWxsb3cgdGhlIEphdmEgVk5DIFZpZXdlcgotYXBwbGV0IHRvIGJlIGRvd25sb2FkZWQgdGhydSB0aGUgVk5DIHBvcnQgdmlhIEhUVFAuCi0uSVAKLVRoYXQgaXMgdG8gc2F5LCB5b3UgY2FuIHVzZSBhIHNpbmdsZSBwb3J0IGZvciBKYXZhCi1hcHBsZXQgdmlld2VyIGNvbm5lY3Rpb25zIGJ5IHVzaW5nIGEgVVJMIGluIHlvdXIgd2ViCi1icm93c2VyIGxpa2UgdGhpcywgZm9yIGV4YW1wbGU6Ci0uSVAKLWh0dHA6Ly9ob3N0bmFtZTo1OTAwCi0uSVAKLVRoZSByZWd1bGFyLCB0d28tcG9ydCBtb2RlLCBVUkwgaHR0cDovL2hvc3RuYW1lOjU4MDAKLXdpbGwgY29udGludWUgdG8gd29yayBhcyB3ZWxsLgotLklQCi1BcyBtZW50aW9uZWQgYWJvdmUsIHRoaXMgbW9kZSB3aWxsIE5PVCB3b3JrIHdpdGgKLXRoZSBcZkItc3NsLFxmUiBcZkItc3R1bm5lbCxcZlIgb3IgXGZCLWVuY1xmUiBlbmNyeXB0aW9uIG9wdGlvbnMuCi1Ob3RlIHRoYXQgaXMgaXQgZXF1aXZhbGVudCB0byAnLWVuYyBub25lJyAoaS5lLiBpdAotdXNlcyB0aGUgc2FtZSBkZXRlY3Rpb24gbWVjaGFuaXNtIGFzIGZvciBIVFRQUywgYnV0Ci13aXRoIG5vIGVuY3J5cHRpb24uKQotLklQCi1IVFRQUyBzaW5nbGUtcG9ydCBpcyBvbiBieSBkZWZhdWx0IGluIFxmQi1zc2xcZlIgZW5jcnlwdGVkCi1tb2RlIChhbmQgXGZCLWVuY1xmUiB0b28pLCBzbyB5b3Ugb25seSBuZWVkIFxmQi1odHRwX29uZXBvcnRcZlIKLXdoZW4gZG9pbmcgbm9uLVNTTCBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCi0uSVAKLVRoaXMgbW9kZSBjb3VsZCBhbHNvIGJlIHVzZWZ1bCBmb3IgU1NIIHR1bm5lbHMgc2luY2UKLWl0IG1lYW5zIG9ubHkgb25lIHBvcnQgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZC4KLS5JUAotVGhlIFxmQi1odHRwc3JlZGlyXGZSIG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIHRoaXMKLW1vZGUgd2hlbiB1c2luZyBhbiBTU0ggdHVubmVsIGFzIHdlbGwgYXMgZm9yIHJvdXRlcgotcG9ydCByZWRpcmVjdGlvbnMuCi0uSVAKLU5vdGUgdGhhdCB0aGUgXGZCLWVudlxmUiBYMTFWTkNfSFRUUF9MSVNURU5fTE9DQUxIT1NUPTEKLW9wdGlvbiBkZXNjcmliZWQgYWJvdmUgdW5kZXIgXGZCLWh0dHBzcmVkaXJcZlIgYXBwbGllcyBmb3IKLXRoZSBMaWJWTkNTZXJ2ZXIgaHR0cGQgc2VydmVyIGluIGFsbCBjYXNlcyAoc3NsIG9yIG5vdC4pCi0uUFAKLVxmQi1zc2hcZlIgXGZJdXNlckBob3N0OmRpc3BcZlIKLS5JUAotQ3JlYXRlIGEgcmVtb3RlIGxpc3RlbmluZyBwb3J0IG9uIG1hY2hpbmUgImhvc3QiCi12aWEgYSBTU0ggdHVubmVsIHVzaW5nIHRoZSBcZkItUlxmUiBycG9ydDpsb2NhbGhvc3Q6bHBvcnQKLW1ldGhvZC4gbHBvcnQgd2lsbCBiZSB0aGUgbG9jYWwgeDExdm5jIGxpc3RlbmluZyBwb3J0LAotc28gYSBjb25uZWN0aW9uIHRvIHJwb3J0ICg1OTAwK2Rpc3ApIG9uICJob3N0Igotd2lsbCByZWFjaCB4MTF2bmMuICBFLmcuIGZyZWRAc25vb3B5LmNvbTowCi0uSVAKLVRoaXMgY291bGQgYmUgdXNlZnVsIGlmIGEgZmlyZXdhbGwvcm91dGVyIHByZXZlbnRzCi1pbmNvbWluZyBjb25uZWN0aW9ucyB0byB0aGUgeDExdm5jIG1hY2hpbmUsIGJ1dAotdGhlIHNzaCBtYWNoaW5lICJob3N0IiBjYW4gYmUgcmVhY2hlZCBieSB0aGUgVk5DCi12aWV3ZXIuICJ1c2VyQCIgaXMgbm90IG5lZWRlZCB1bmxlc3MgdGhlIHJlbW90ZSB1bml4Ci11c2VybmFtZSBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgb25lLgotLklQCi1CeSBkZWZhdWx0IHRoZSByZW1vdGUgc3NoZCBpcyB1c3VhbGx5IGNvbmZpZ3VyZWQgdG8KLWxpc3RlbiBvbmx5IG9uIGxvY2FsaG9zdCBmb3IgcnBvcnQsIHNvIHRoZSB2aWV3ZXIgbWF5Ci1uZWVkIHRvIHNzaCBcZkItTFxmUiByZWRpciB0byAiaG9zdCIgYXMgd2VsbCAoU2VlIFNTVk5DIHRvCi1hdXRvbWF0ZSB0aGlzKS4gIFRoZSBzc2hkIHNldHRpbmcgR2F0ZXdheVBvcnRzIGVuYWJsZXMKLWxpc3RlbmluZyBvbiBhbGwgaW50ZXJmYWNlcyBmb3IgcnBvcnQ7IHZpZXdlcnMgY2FuCi1yZWFjaCBpdCBtb3JlIGVhc2lseS4KLS5JUAotImRpc3AiIGlzIHRoZSBWTkMgZGlzcGxheSBmb3IgdGhlIHJlbW90ZSBTU0ggc2lkZSwKLWUuZy4gMCBjb3JyZXNwb25kcyB0byBwb3J0IDU5MDAsIGV0Yy4gIElmIGRpc3AgaXMKLWdyZWF0ZXIgdGhhbiAyMDAgdGhlIHZhbHVlIGlzIHVzZWQgYXMgdGhlIHBvcnQuICBVc2UgYQotbmVnYXRpdmUgdmFsdWUgdG8gZm9yY2UgYSBsb3cgcG9ydCwgZS5nLiBob3N0Oi04MCB3aWxsCi11c2UgcG9ydCA4MC4KLS5JUAotSWYgc3NoLWFnZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gdGhlIHNzaCBwYXNzd29yZCBuZWVkcwotdG8gYmUgZW50ZXJlZCBpbiB0aGUgdGVybWluYWwgd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmcuCi0uSVAKLUJ5IGRlZmF1bHQgdGhlIHJlbW90ZSBzc2ggd2lsbCBpc3N1ZSBhICdzbGVlcCAzMDAnIHRvCi13YWl0IGZvciB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBmb3IgNSBtaW5zLiAgVG8gbW9kaWZ5Ci10aGlzIHVzZSB1c2VyQGhvc3Q6ZGlzcCtzZWNzLgotLklQCi1JZiB0aGUgcmVtb3RlIFNTSCBzZXJ2ZXIgaXMgb24gYSBub24tc3RhbmRhcmQgcG9ydAotKGkuZS4gbm90IDIyKSB1c2UgdXNlckBob3N0OnBvcnQ6ZGlzcCtzZWNzLgotLklQCi1Ob3RlIHRoYXQgdGhlIHNzaCBwcm9jZXNzIE1BWSBOT1QgYmUga2lsbGVkIHdoZW4KLXgxMXZuYyBleGl0cy4gIEl0IHRyaWVzIGJ5IGxvb2tpbmcgYXQgCi0uSVIgcHMgKDEpCi1vdXRwdXQuCi0uUFAKLVxmQi11c2Vwd1xmUgotLklQCi1JZiBubyBvdGhlciBwYXNzd29yZCBtZXRob2Qgd2FzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kCi1saW5lLCBmaXJzdCBsb29rIGZvciB+Ly52bmMvcGFzc3dkIGFuZCBpZiBmb3VuZCB1c2UgaXQKLXdpdGggXGZCLXJmYmF1dGg7XGZSIG5leHQsIGxvb2sgZm9yIH4vLnZuYy9wYXNzd2RmaWxlIGFuZAotdXNlIGl0IHdpdGggXGZCLXBhc3N3ZGZpbGU7XGZSIG90aGVyd2lzZSwgcHJvbXB0IHRoZSB1c2VyCi1mb3IgYSBwYXNzd29yZCB0byBjcmVhdGUgfi8udm5jL3Bhc3N3ZCBhbmQgdXNlIGl0IHdpdGgKLXRoZSBcZkItcmZiYXV0aFxmUiBvcHRpb24uICBJZiBub25lIG9mIHRoZXNlIHN1Y2NlZWQgeDExdm5jCi1leGl0cyBpbW1lZGlhdGVseS4KLS5QUAotXGZCLXN0b3JlcGFzc3dkXGZSIFxmSXBhc3NcZlIgXGZJZmlsZVxmUgotLklQCi1TdG9yZSBwYXNzd29yZCBcZklwYXNzXGZSIGFzIHRoZSBWTkMgcGFzc3dvcmQgaW4gdGhlCi1maWxlIFxmSWZpbGVcZlIuICBPbmNlIHRoZSBwYXNzd29yZCBpcyBzdG9yZWQgdGhlCi1wcm9ncmFtIGV4aXRzLiAgVXNlIHRoZSBwYXNzd29yZCB2aWEgIlxmQi1yZmJhdXRoXGZSIFxmSWZpbGVcZlIiCi0uSVAKLUlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgIngxMXZuYyBcZkItc3RvcmVwYXNzd2QiLFxmUgotdGhlIHVzZXIgaXMgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQgYW5kIGl0IGlzIHN0b3JlZAotaW4gdGhlIGZpbGUgfi8udm5jL3Bhc3N3ZC4gIENhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwKLXRoYXQgd2lsbCBiZSB0aGUgZmlsZSB0byBzdG9yZSB0aGUgcHJvbXB0ZWQgcGFzc3dvcmQgaW4uCi0uUFAKLVxmQi1ub3B3XGZSCi0uSVAKLURpc2FibGUgdGhlIGJpZyB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgdXNlIHgxMXZuYwotd2l0aG91dCBzb21lIHNvcnQgb2YgcGFzc3dvcmQuCi0uUFAKLVxmQi1hY2NlcHRcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLVJ1biBhIGNvbW1hbmQgKHBvc3NpYmx5IHRvIHByb21wdCB0aGUgdXNlciBhdCB0aGUKLVgxMSBkaXNwbGF5KSB0byBkZWNpZGUgd2hldGhlciBhbiBpbmNvbWluZyBjbGllbnQKLXNob3VsZCBiZSBhbGxvd2VkIHRvIGNvbm5lY3Qgb3Igbm90LiAgXGZJc3RyaW5nXGZSIGlzCi1hbiBleHRlcm5hbCBjb21tYW5kIHJ1biB2aWEgCi0uSVIgc3lzdGVtICgzKQotb3Igc29tZSBzcGVjaWFsCi1jYXNlcyBkZXNjcmliZWQgYmVsb3cuICBCZSBzdXJlIHRvIHF1b3RlIFxmSXN0cmluZ1xmUgotaWYgaXQgY29udGFpbnMgc3BhY2VzLCBzaGVsbCBjaGFyYWN0ZXJzLCBldGMuICBJZiB0aGUKLWV4dGVybmFsIGNvbW1hbmQgcmV0dXJucyAwIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQsCi1vdGhlcndpc2UgdGhlIGNsaWVudCBpcyByZWplY3RlZC4gIFNlZSBiZWxvdyBmb3IgYW4KLWV4dGVuc2lvbiB0byBhY2NlcHQgYSBjbGllbnQgdmlldy1vbmx5LgotLklQCi1JZiB4MTF2bmMgaXMgcnVubmluZyBhcyByb290IChzYXkgZnJvbSAKLS5JUiBpbmV0ZCAoOCkKLW9yIGZyb20KLWRpc3BsYXkgbWFuYWdlcnMgCi0uSVIgeGRtICgxKQotLCAKLS5JUiBnZG0gKDEpCi0sIGV0YyksIHRoaW5rIGFib3V0IHRoZQotc2VjdXJpdHkgaW1wbGljYXRpb25zIGNhcmVmdWxseSBiZWZvcmUgc3VwcGx5aW5nIHRoaXMKLW9wdGlvbiAobGlrZXdpc2UgZm9yIHRoZSBcZkItZ29uZVxmUiBvcHRpb24pLgotLklQCi1FbnZpcm9ubWVudDogVGhlIFJGQl9DTElFTlRfSVAgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbAotYmUgc2V0IHRvIHRoZSBpbmNvbWluZyBjbGllbnQgSVAgbnVtYmVyIGFuZCB0aGUgcG9ydAotaW4gUkZCX0NMSUVOVF9QT1JUIChvciAtMSBpZiB1bmF2YWlsYWJsZSkuICBTaW1pbGFybHksCi1SRkJfU0VSVkVSX0lQIGFuZCBSRkJfU0VSVkVSX1BPUlQgKHRoZSB4MTF2bmMgc2lkZQotb2YgdGhlIGNvbm5lY3Rpb24pLCBhcmUgc2V0IHRvIGFsbG93IGlkZW50aWZpY2F0aW9uCi1vZiB0aGUgdGNwIHZpcnR1YWwgY2lyY3VpdC4gIFRoZSB4MTF2bmMgcHJvY2VzcwotaWQgd2lsbCBiZSBpbiBSRkJfWDExVk5DX1BJRCwgYSBjbGllbnQgaWQgbnVtYmVyIGluCi1SRkJfQ0xJRU5UX0lELCBhbmQgdGhlIG51bWJlciBvZiBvdGhlciBjb25uZWN0ZWQgY2xpZW50cwotaW4gUkZCX0NMSUVOVF9DT1VOVC4gIFJGQl9NT0RFIHdpbGwgYmUgImFjY2VwdCIuCi1SRkJfU1RBVEUgd2lsbCBiZSBQUk9UT0NPTF9WRVJTSU9OLCBTRUNVUklUWV9UWVBFLAotQVVUSEVOVElDQVRJT04sIElOSVRJQUxJU0FUSU9OLCBOT1JNQUwsIG9yIFVOS05PV04KLWluZGljYXRpbmcgdXAgdG8gd2hpY2ggc3RhdGUgdGhlIGNsaWVudCBoYXMgYWNoaWV2ZWQuCi1SRkJfTE9HSU5fVklFV09OTFkgd2lsbCBiZSAwLCAxLCBvciAtMSAodW5rbm93bikuCi1SRkJfVVNFUk5BTUUsIFJGQl9MT0dJTl9USU1FLCBhbmQgUkZCX0NVUlJFTlRfVElNRSBtYXkKLWFsc28gYmUgc2V0LgotLklQCi1JZiBcZklzdHJpbmdcZlIgaXMgInBvcHVwIiB0aGVuIGEgYnVpbHRpbiBwb3B1cCB3aW5kb3cKLWlzIHVzZWQuICBUaGUgcG9wdXAgd2lsbCB0aW1lIG91dCBhZnRlciAxMjAgc2Vjb25kcywKLXVzZSAicG9wdXA6TiIgdG8gbW9kaWZ5IHRoZSB0aW1lb3V0IHRvIE4gc2Vjb25kcwotKHVzZSAwIGZvciBubyB0aW1lb3V0KS4KLS5JUAotSW4gdGhlIGNhc2Ugb2YgInBvcHVwIiBhbmQgd2hlbiB0aGUgXGZCLXVuaXhwd1xmUiBvcHRpb24KLWlzIHNwZWNpZmllZCwgdGhlbiBhICpzZWNvbmQqIHdpbmRvdyB3aWxsIGJlIHBvcHBlZAotdXAgYWZ0ZXIgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IGxvZ3MgaW4gdmlhIGhpcyBVTklYCi1wYXNzd29yZC4gIFRoaXMgdGltZSB0aGUgdXNlciB3aWxsIGJlIGlkZW50aWZpZWQgYXMKLVVOSVg6dXNlcm5hbWVAaG9zdG5hbWUsIHRoZSAiVU5JWDoiIHByZWZpeCBpbmRpY2F0ZXMKLXdoaWNoIHVzZXIgdGhlIHZpZXdlciBsb2dnZWQgYXMgdmlhIFxmQi11bml4cHcuXGZSICBUaGUgZmlyc3QKLXBvcHVwIGlzIG9ubHkgZm9yIHdoZXRoZXIgdG8gYWxsb3cgaGltIHRvIGV2ZW4gKnRyeSoKLXRvIGxvZ2luIHZpYSB1bml4IHBhc3N3b3JkLgotLklQCi1JZiBcZklzdHJpbmdcZlIgaXMgInhtZXNzYWdlIiB0aGVuIGFuIAotLklSIHhtZXNzYWdlICgxKQotaW52b2NhdGlvbiBpcyB1c2VkIGZvciB0aGUgY29tbWFuZC4gIHhtZXNzYWdlIG11c3QgYmUKLWluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBmb3IgdGhpcyB0byB3b3JrLgotLklQCi1Cb3RoICJwb3B1cCIgYW5kICJ4bWVzc2FnZSIgd2lsbCBwcmVzZW50IGFuIG9wdGlvbgotZm9yIGFjY2VwdGluZyB0aGUgY2xpZW50ICJWaWV3LU9ubHkiICh0aGUgY2xpZW50Ci1jYW4gb25seSB3YXRjaCkuICBUaGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBwcmVzZW50ZWQgaWYKLVxmQi12aWV3b25seVxmUiBoYXMgYmVlbiBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIGVudGlyZQotZGlzcGxheSBpcyB2aWV3IG9ubHkuCi0uSVAKLUlmIHRoZSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgaXMgcHJlZml4ZWQgd2l0aCBzb21ldGhpbmcKLWxpa2UgInllczowLG5vOiosdmlldzozIG15Y29tbWFuZCAuLi4iIHRoZW4gdGhpcwotYXNzb2NpYXRlcyB0aGUgbnVtZXJpY2FsIGNvbW1hbmQgcmV0dXJuIGNvZGUgd2l0aAotdGhlIGFjdGlvbnM6IGFjY2VwdCwgcmVqZWN0LCBhbmQgYWNjZXB0LXZpZXctb25seSwKLXJlc3BlY3RpdmVseS4gIFVzZSAiKiIgaW5zdGVhZCBvZiBhIG51bWJlciB0byBpbmRpY2F0ZQotdGhlIGRlZmF1bHQgYWN0aW9uIChpbiBjYXNlIHRoZSBjb21tYW5kIHJldHVybnMgYW4KLXVuZXhwZWN0ZWQgdmFsdWUpLiAgRS5nLiAibm86KiIgaXMgYSBnb29kIGNob2ljZS4KLS5JUAotTm90ZSB0aGF0IHgxMXZuYyBibG9ja3Mgd2hpbGUgdGhlIGV4dGVybmFsIGNvbW1hbmQKLW9yIHBvcHVwIGlzIHJ1bm5pbmcgKG90aGVyIGNsaWVudHMgbWF5IHNlZSBubyB1cGRhdGVzCi1kdXJpbmcgdGhpcyBwZXJpb2QpLiAgU28gYSBwZXJzb24gc2l0dGluZyBhIHRoZSBwaHlzaWNhbAotZGlzcGxheSBpcyBuZWVkZWQgdG8gcmVzcG9uZCB0byBhbiBwb3B1cCBwcm9tcHQuICh1c2UKLWEgMm5kIHgxMXZuYyBpZiB5b3UgbG9jayB5b3Vyc2VsZiBvdXQpLgotLklQCi1Nb3JlIFxmQi1hY2NlcHRcZlIgdHJpY2tzOiB1c2UgInBvcHVwbW91c2UiIHRvIG9ubHkgYWxsb3cKLW1vdXNlIGNsaWNrcyBpbiB0aGUgYnVpbHRpbiBwb3B1cCB0byBiZSByZWNvZ25pemVkLgotU2ltaWxhcmx5IHVzZSAicG9wdXBrZXkiIHRvIG9ubHkgcmVjb2duaXplCi1rZXlzdHJva2UgcmVzcG9uc2VzLiAgVGhlc2UgYXJlIHRvIGhlbHAgYXZvaWQgdGhlCi11c2VyIGFjY2lkZW50YWxseSBhY2NlcHRpbmcgYSBjbGllbnQgYnkgdHlwaW5nIG9yCi1jbGlja2luZy4gQWxsIDMgb2YgdGhlIHBvcHVwIGtleXdvcmRzIGNhbiBiZSBmb2xsb3dlZAotYnkgK04rTSB0byBzdXBwbHkgYSBwb3NpdGlvbiBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KLVRoZSBkZWZhdWx0IGlzIHRvIGNlbnRlciB0aGUgcG9wdXAgd2luZG93LgotLlBQCi1cZkItYWZ0ZXJhY2NlcHRcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLUFzIFxmQi1hY2NlcHQsXGZSIGV4Y2VwdCB0byBydW4gYSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgYWZ0ZXIKLWEgY2xpZW50IGhhcyBiZWVuIGFjY2VwdGVkIGFuZCBhdXRoZW50aWNhdGVkLiBSRkJfTU9ERQotd2lsbCBiZSBzZXQgdG8gImFmdGVyYWNjZXB0IiBhbmQgdGhlIG90aGVyIFJGQl8qCi12YXJpYWJsZXMgYXJlIGFzIGluIFxmQi1hY2NlcHQuXGZSICBVbmxpa2UgXGZCLWFjY2VwdCxcZlIgdGhlCi1jb21tYW5kIHJldHVybiBjb2RlIGlzIG5vdCBpbnRlcnByZXRlZCBieSB4MTF2bmMuCi1FeGFtcGxlOiBcZkItYWZ0ZXJhY2NlcHRcZlIgJ2tpbGxhbGwgeGxvY2sgJicKLS5QUAotXGZCLWdvbmVcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLUFzIFxmQi1hY2NlcHQsXGZSIGV4Y2VwdCB0byBydW4gYSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgd2hlbgotYSBjbGllbnQgZ29lcyBhd2F5IChkaXNjb25uZWN0cykuICBSRkJfTU9ERSB3aWxsIGJlCi1zZXQgdG8gImdvbmUiIGFuZCB0aGUgb3RoZXIgUkZCXyogdmFyaWFibGVzIGFyZSBhcwotaW4gXGZCLWFjY2VwdC5cZlIgIFRoZSAicG9wdXAiIGFjdGlvbnMgYXBwbHkgYXMgd2VsbC4KLVVubGlrZSBcZkItYWNjZXB0LFxmUiB0aGUgY29tbWFuZCByZXR1cm4gY29kZSBpcyBub3QKLWludGVycHJldGVkIGJ5IHgxMXZuYy4gIEV4YW1wbGU6IFxmQi1nb25lXGZSICd4bG9jayAmJwotLlBQCi1cZkItdXNlcnNcZlIgXGZJbGlzdFxmUgotLklQCi1JZiB4MTF2bmMgaXMgc3RhcnRlZCBhcyByb290IChzYXkgZnJvbSAKLS5JUiBpbmV0ZCAoOCkKLW9yIGZyb20KLWRpc3BsYXkgbWFuYWdlcnMgCi0uSVIgeGRtICgxKQotLCAKLS5JUiBnZG0gKDEpCi0sIGV0YyksIHRoZW4gYXMgc29vbgotYXMgcG9zc2libGUgYWZ0ZXIgY29ubmVjdGlvbnMgdG8gdGhlIFggZGlzcGxheSBhcmUKLWVzdGFibGlzaGVkIHRyeSB0byBzd2l0Y2ggdG8gb25lIG9mIHRoZSB1c2VycyBpbiB0aGUKLWNvbW1hIHNlcGFyYXRlZCBcZklsaXN0XGZSLiAgSWYgeDExdm5jIGlzIG5vdCBydW5uaW5nIGFzCi1yb290IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCi0uSVAKLVdoeSB1c2UgdGhpcyBvcHRpb24/ICBJbiBnZW5lcmFsIGl0IGlzIG5vdCBuZWVkZWQgc2luY2UKLXgxMXZuYyBpcyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgWCBkaXNwbGF5IGFuZCBjYW4KLXBlcmZvcm0gaXRzIHByaW1hcnkgZnVuY3Rpb25zLiAgVGhlIG9wdGlvbiB3YXMgYWRkZWQKLXRvIG1ha2Ugc29tZSBvZiB0aGUgKmV4dGVybmFsKiB1dGlsaXR5IGNvbW1hbmRzIHgxMXZuYwotb2NjYXNpb25hbGx5IHJ1bnMgd29yayBwcm9wZXJseS4gIEluIHBhcnRpY3VsYXIgdW5kZXIKLUdOT01FIGFuZCBLREUgdG8gaW1wbGVtZW50IHRoZSAiXGZCLXNvbGlkXGZSIFxmSWNvbG9yXGZSIiBmZWF0dXJlCi1leHRlcm5hbCBjb21tYW5kcyAoZ2NvbmZ0b29sLTIgYW5kIGRjb3ApIHVuZm9ydHVuYXRlbHkKLW11c3QgYmUgcnVuIGFzIHRoZSB1c2VyIG93bmluZyB0aGUgZGVza3RvcCBzZXNzaW9uLgotU2luY2UgdGhpcyBvcHRpb24gc3dpdGNoZXMgdXNlcmlkIGl0IGFsc28gYWZmZWN0cyB0aGUKLXVzZXJpZCB1c2VkIHRvIHJ1biB0aGUgcHJvY2Vzc2VzIGZvciB0aGUgXGZCLWFjY2VwdFxmUiBhbmQKLVxmQi1nb25lXGZSIG9wdGlvbnMuICBJdCBhbHNvIGFmZmVjdHMgdGhlIGFiaWxpdHkgdG8gcmVhZAotZmlsZXMgZm9yIG9wdGlvbnMgc3VjaCBhcyBcZkItY29ubmVjdCxcZlIgXGZCLWFsbG93LFxmUiBhbmQgXGZCLXJlbWFwXGZSCi1hbmQgYWxzbyB0aGUgdWx0cmEgYW5kIHRpZ2h0IGZpbGV0cmFuc2ZlciBmZWF0dXJlIGlmCi1lbmFibGVkLiAgTm90ZSB0aGF0IHRoZSBcZkItY29ubmVjdFxmUiBmaWxlIGlzIGFsc28gc29tZXRpbWVzCi13cml0dGVuIHRvLgotLklQCi1TbyBiZSBjYXJlZnVsIHdpdGggdGhpcyBvcHRpb24gc2luY2UgaW4gc29tZSBzaXR1YXRpb25zCi1pdHMgdXNlIGNhbiBkZWNyZWFzZSBzZWN1cml0eS4KLS5JUAotSW4gZ2VuZXJhbCB0aGUgc3dpdGNoIHRvIGEgdXNlciB3aWxsIG9ubHkgdGFrZSBwbGFjZQotaWYgdGhlIGRpc3BsYXkgY2FuIHN0aWxsIGJlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgYXMgdGhhdAotdXNlciAodGhpcyBpcyBwcmltYXJpbHkgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhY3R1YWwgb3duZXIKLW9mIHRoZSBzZXNzaW9uKS4gRXhhbXBsZTogIlxmQi11c2Vyc1xmUiBcZklmcmVkLHdpbG1hLGJldHR5XGZSIi4KLU5vdGUgdGhhdCBhIG1hbGljaW91cyBsb2NhbCB1c2VyICJiYXJuZXkiIGJ5Ci1xdWlja2x5IHVzaW5nICJ4aG9zdCArIiB3aGVuIGxvZ2dpbmcgaW4gbWF5IHBvc3NpYmx5Ci1nZXQgdGhlIHgxMXZuYyBwcm9jZXNzIHRvIHN3aXRjaCB0byB1c2VyICJmcmVkIi4KLVdoYXQgaGFwcGVucyBuZXh0PwotLklQCi1VbmRlciBkaXNwbGF5IG1hbmFnZXJzIGl0IG1heSBiZSBhIGxvbmcgdGltZSBiZWZvcmUKLXRoZSBzd2l0Y2ggc3VjY2VlZHMgKGkuZS4gYSB1c2VyIGxvZ3MgaW4pLiAgVG8gaW5zdGVhZAotbWFrZSBpdCBzd2l0Y2ggaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBpZiB0aGUgZGlzcGxheQotY2FuIGJlIHJlb3BlbmVkIHByZWZpeCB0aGUgdXNlcm5hbWUgd2l0aCB0aGUgIisiCi1jaGFyYWN0ZXIuIEUuZy4gIlxmQi11c2Vyc1xmUiBcZkkrYm9iXGZSIiBvciAiXGZCLXVzZXJzXGZSIFxmSStub2JvZHlcZlIiLgotLklQCi1UaGUgbGF0dGVyIChpLmUuIHN3aXRjaGluZyBpbW1lZGlhdGVseSB0byB1c2VyCi0ibm9ib2R5IikgaXMgdGhlIG9ubHkgb2J2aW91cyB1c2Ugb2YgdGhlIFxmQi11c2Vyc1xmUiBvcHRpb24KLXRoYXQgaW5jcmVhc2VzIHNlY3VyaXR5LgotLklQCi1Vc2UgdGhlIGZvbGxvd2luZyBub3RhdGlvbiB0byBhc3NvY2lhdGUgYSBncm91cCB3aXRoCi1hIHVzZXI6IHVzZXIxLmdyb3VwMSx1c2VyMi5ncm91cDIsLi4uICBOb3RlIHRoYXQKLS5JUiBpbml0Z3JvdXBzICgyKQotd2lsbCBzdGlsbCBiZSBjYWxsZWQgZmlyc3QgdG8gdHJ5IHRvCi1zd2l0Y2ggdG8gQUxMIG9mIGEgdXNlcidzIGdyb3VwcyAocHJpbWFyeSBhbmQgYWRkaXRpb25hbAotZ3JvdXBzKS4gIE9ubHkgaWYgdGhhdCBmYWlscyBvciBpdCBpcyBub3QgYXZhaWxhYmxlCi10aGVuIHRoZSBzaW5nbGUgZ3JvdXAgc3BlY2lmaWVkIGFzIGFib3ZlIChvciB0aGUgdXNlcidzCi1wcmltYXJ5IGdyb3VwIGlmIG5vdCBzcGVjaWZpZWQpIGlzIHN3aXRjaGVkIHRvIHdpdGgKLS5JUiBzZXRnaWQgKDIpLgotVXNlIFxmQi1lbnZcZlIgWDExVk5DX1NJTkdMRV9HUk9VUD0xIHRvIHByZXZlbnQKLXRyeWluZyAKLS5JUiBpbml0Z3JvdXBzICgyKQotYW5kIG9ubHkgc3dpdGNoIHRvIHRoZSBzaW5nbGUKLWdyb3VwLiAgVGhpcyBzb3J0IG9mIHNldHRpbmcgaXMgb25seSByZWFsbHkgbmVlZGVkIHRvCi1tYWtlIHRoZSB1bHRyYSBvciB0aWdodCBmaWxldHJhbnNmZXIgcGVybWlzc2lvbnMgd29yawotcHJvcGVybHkuIFRoaXMgZm9ybWF0IGFwcGxpZXMgdG8gYW55IGNvbW1hIHNlcGFyYXRlZCBsaXN0Ci1vZiB1c2VycywgZXZlbiB0aGUgc3BlY2lhbCAiPSIgbW9kZXMgZGVzY3JpYmVkIGJlbG93LgotLklQCi1JbiBcZkItdW5peHB3XGZSIG1vZGUsIGlmICJcZkItdXNlcnNcZlIgXGZJdW5peHB3PVxmUiIgaXMgc3VwcGxpZWQKLXRoZW4gYWZ0ZXIgYSB1c2VyIGF1dGhlbnRpY2F0ZXMgaGltc2VsZiB2aWEgdGhlCi1cZkItdW5peHB3XGZSIG1lY2hhbmlzbSwgeDExdm5jIHdpbGwgdHJ5IHRvIHN3aXRjaCB0byB0aGF0Ci11c2VyIGFzIHRob3VnaCAiXGZCLXVzZXJzXGZSIFxmSSt1c2VybmFtZVxmUiIgaGFkIGJlZW4gc3VwcGxpZWQuCi1JZiB5b3Ugd2FudCB0byBsaW1pdCB3aGljaCB1c2VycyB0aGlzIHdpbGwgYmUgZG9uZSBmb3IsCi1wcm92aWRlIHRoZW0gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBhZnRlciAidW5peHB3PSIKLUdyb3VwcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgotLklQCi1TaW1pbGFybHksIGluIFxmQi1zc2xcZlIgbW9kZSwgaWYgIlxmQi11c2Vyc1xmUiBcZklzc2xwZWVyPVxmUiIgaXMKLXN1cHBsaWVkIHRoZW4gYWZ0ZXIgYW4gU1NMIGNsaWVudCBhdXRoZW50aWNhdGVzIHdpdGggaGlzCi1jZXJ0ICh0aGUgXGZCLXNzbHZlcmlmeVxmUiBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHRoaXMpIHgxMXZuYwotd2lsbCBleHRyYWN0IGEgVU5JWCB1c2VybmFtZSBmcm9tIHRoZSAiZW1haWxBZGRyZXNzIgotZmllbGQgKHVzZXJuYW1lQGhvc3RuYW1lLmNvbSkgb2YgdGhlICJTdWJqZWN0IiBvZiB0aGUKLXg1MDkgU1NMIGNlcnQgYW5kIHRoZW4gdHJ5IHRvIHN3aXRjaCB0byB0aGF0IHVzZXIgYXMKLXRob3VnaCAiXGZCLXVzZXJzXGZSIFxmSSt1c2VybmFtZVxmUiIgaGFkIGJlZW4gc3VwcGxpZWQuICBJZiB5b3UKLXdhbnQgdG8gbGltaXQgd2hpY2ggdXNlcnMgdGhpcyB3aWxsIGJlIGRvbmUgZm9yLCBwcm92aWRlCi10aGVtIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgYWZ0ZXIgInNzbHBlZXI9Ii4KLVNldCB0aGUgZW52LiB2YXIgWDExVk5DX1NTTFBFRVJfQ04gdG8gdXNlIHRoZSBDb21tb24KLU5hbWUgKG5vcm1hbGx5IGEgaG9zdG5hbWUpIGluc3RlYWQgb2YgdGhlIEVtYWlsIGZpZWxkLgotLklQCi1OT1RFOiBmb3Igc3NscGVlcj0gbW9kZSB0aGUgeDExdm5jIGFkbWluaXN0cmF0b3IgbXVzdAotdGFrZSBjYXJlIHRoYXQgYW55IGNsaWVudCBjZXJ0cyBoZSBhZGRzIHRvIFxmQi1zc2x2ZXJpZnlcZlIKLWhhdmUgdGhlIGludGVuZGVkIFVOSVggdXNlcm5hbWUgaW4gdGhlICJlbWFpbEFkZHJlc3MiCi1maWVsZCBvZiB0aGUgY2VydC4gIE90aGVyd2lzZSBhIHVzZXIgbWF5IGJlIGFibGUgdG8KLWxvZyBpbiBhcyBhbm90aGVyLiAgVGhpcyBjb21tYW5kIGNhbiBiZSBvZiB1c2UgaW4KLWNoZWNraW5nOiAib3BlbnNzbCB4NTA5IFxmQi10ZXh0XGZSIFxmQi1pblxmUiBmaWxlLmNydCIsIHNlZSB0aGUKLSJTdWJqZWN0OiIgbGluZS4gIEFsc28sIGFsb25nIHdpdGggdGhlIG5vcm1hbCBSRkJfKgotZW52LiB2YXJzLiAoc2VlIFxmQi1hY2NlcHQpXGZSIHBhc3NlZCB0byBleHRlcm5hbCBjbWQ9Ci1jb21tYW5kcywgUkZCX1NTTF9DTElFTlRfQ0VSVCB3aWxsIGJlIHNldCB0byB0aGUKLWNsaWVudCdzIHg1MDkgY2VydGlmaWNhdGUgc3RyaW5nLgotLklQCi1UaGUgc3NscGVlcj0gbW9kZSBjYW4gYWlkIGZpbmRpbmcgWCBzZXNzaW9ucyB2aWEgdGhlCi1GSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbWVjaGFuaXNtcy4KLS5JUAotVG8gaW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgdXNlciAqYmVmb3JlKiBjb25uZWN0aW9ucwotdG8gdGhlIFggZGlzcGxheSBhcmUgbWFkZSBvciBhbnkgZmlsZXMgb3BlbmVkIHVzZSB0aGUKLSI9IiBjaGFyYWN0ZXI6ICJcZkItdXNlcnNcZlIgXGZJPWJvYlxmUiIuICBUaGF0IHVzZXIgbmVlZHMgdG8KLWJlIGFibGUgdG8gb3BlbiB0aGUgWCBkaXNwbGF5IGFuZCBhbnkgZmlsZXMgb2YgY291cnNlLgotLklQCi1UaGUgc3BlY2lhbCB1c2VyICJndWVzcz0iIG1lYW5zIHRvIGV4YW1pbmUgdGhlIHV0bXB4Ci1kYXRhYmFzZSAoc2VlIAotLklSIHdobyAoMSkKLSkgbG9va2luZyBmb3IgYSB1c2VyIGF0dGFjaGVkIHRvCi10aGUgZGlzcGxheSBudW1iZXIgKGZyb20gRElTUExBWSBvciBcZkItZGlzcGxheVxmUiBvcHRpb24pCi1hbmQgdHJ5IGhpbS9oZXIuICBUbyBsaW1pdCB0aGUgbGlzdCBvZiBndWVzc2VzLCB1c2U6Ci0iXGZCLXVzZXJzXGZSIFxmSWd1ZXNzPWJvYixiZXR0eVxmUiIuCi0uSVAKLUV2ZW4gbW9yZSBzaW5pc3RlciBpcyB0aGUgc3BlY2lhbCB1c2VyICJsdXJrPSIKLXRoYXQgbWVhbnMgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBESVNQTEFZIGZyb20gdGhlIHV0bXB4Ci1sb2dpbiBkYXRhYmFzZSBhcyB3ZWxsLiAgU28gaXQgImx1cmtzIiB3YWl0aW5nIGZvcgotYW55b25lIHRvIGxvZyBpbnRvIGFuIFggc2Vzc2lvbiBhbmQgdGhlbiBjb25uZWN0cyB0byBpdC4KLVNwZWNpZnkgYSBsaXN0IG9mIHVzZXJzIGFmdGVyIHRoZSA9IHRvIGxpbWl0IHdoaWNoIHVzZXJzCi13aWxsIGJlIHRyaWVkLiAgVG8gZW5hYmxlIGEgZGlmZmVyZW50IHNlYXJjaGluZyBtb2RlLCBpZgotdGhlIGZpcnN0IHVzZXIgaW4gdGhlIGxpc3QgaXMgc29tZXRoaW5nIGxpa2UgIjowIiBvcgotIjowLTIiIHRoYXQgaW5kaWNhdGVzIGEgcmFuZ2Ugb2YgRElTUExBWSBudW1iZXJzIHRoYXQKLXdpbGwgYmUgdHJpZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBpbiB0aGUKLXV0bXB4IGRhdGFiYXNlKSBmb3IgYWxsIHVzZXJzIHRoYXQgYXJlIGxvZ2dlZCBpbi4gIEFsc28KLXNlZSB0aGUgIlxmQi1kaXNwbGF5XGZSIFxmSVdBSVQ6Li4uXGZSIiBmdW5jdGlvbmFsaXR5LiAgRXhhbXBsZXM6Ci0iXGZCLXVzZXJzXGZSIFxmSWx1cms9XGZSIiBhbmQgYWxzbyAiXGZCLXVzZXJzXGZSIFxmSWx1cms9OjAtMSxib2IsbWFyeVxmUiIKLS5JUAotQmUgZXNwZWNpYWxseSBjYXJlZnVsIHVzaW5nIHRoZSAiZ3Vlc3M9IiBhbmQgImx1cms9IgotbW9kZXMuICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBvbiBtYWNoaW5lcwotd2l0aCB1bnRydXN0d29ydGh5IGxvY2FsIHVzZXJzLgotLlBQCi1cZkItbm9zaG1cZlIKLS5JUAotRG8gbm90IHVzZSB0aGUgTUlULVNITSBleHRlbnNpb24gZm9yIHRoZSBwb2xsaW5nLgotUmVtb3RlIGRpc3BsYXlzIGNhbiBiZSBwb2xsZWQgdGhpcyB3YXk6IGJlIGNhcmVmdWwgdGhpcwotY2FuIHVzZSBsYXJnZSBhbW91bnRzIG9mIG5ldHdvcmsgYmFuZHdpZHRoLiAgVGhpcyBpcwotYWxzbyBvZiB1c2UgaWYgdGhlIGxvY2FsIG1hY2hpbmUgaGFzIGEgbGltaXRlZCBudW1iZXIKLW9mIHNobSBzZWdtZW50cyBhbmQgXGZCLW9uZXRpbGVcZlIgaXMgbm90IHN1ZmZpY2llbnQuCi0uUFAKLVxmQi1mbGlwYnl0ZW9yZGVyXGZSCi0uSVAKLVNvbWV0aW1lcyBuZWVkZWQgaWYgcmVtb3RlbHkgcG9sbGVkIGhvc3QgaGFzIGRpZmZlcmVudAotZW5kaWFubmVzcy4gIElnbm9yZWQgdW5sZXNzIFxmQi1ub3NobVxmUiBpcyBzZXQuCi0uUFAKLVxmQi1vbmV0aWxlXGZSCi0uSVAKLURvIG5vdCB1c2UgdGhlIG5ldyBjb3B5X3RpbGVzKCkgZnJhbWVidWZmZXIgbWVjaGFuaXNtLAotanVzdCB1c2UgMSBzaG0gdGlsZSBmb3IgcG9sbGluZy4gIExpbWl0cyBzaG0gc2VnbWVudHMKLXVzZWQgdG8gMy4KLS5JUAotVG8gZGlzYWJsZSBhbnkgYXV0b21hdGljIHNobSByZWR1Y3Rpb24gc2V0IHRoZQotZW52LiB2YXIuIFgxMVZOQ19OT19MSU1JVF9TSE0uCi0uUFAKLVxmQi1zb2xpZFxmUiBcZklbY29sb3JdXGZSCi0uSVAKLVRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHdoZW4gVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZAotdHJ5IHRvIGNoYW5nZSB0aGUgZGVza3RvcCBiYWNrZ3JvdW5kIHRvIGEgc29saWQgY29sb3IuCi1UaGUgW2NvbG9yXSBpcyBvcHRpb25hbDogdGhlIGRlZmF1bHQgY29sb3IgaXMgImN5YW40Ii4KLUZvciBhIGRpZmZlcmVudCBvbmUgc3BlY2lmeSB0aGUgWCBjb2xvciAocmdiLnR4dCBuYW1lLAotZS5nLiAiZGFya2JsdWUiIG9yIG51bWVyaWNhbCAiI1JSR0dCQiIpLgotLklQCi1DdXJyZW50bHkgdGhpcyBvcHRpb24gb25seSB3b3JrcyBvbiBHTk9NRSwgS0RFLCBDREUsCi1YRkNFLCBhbmQgY2xhc3NpYyBYIChpLmUuIHdpdGggdGhlIGJhY2tncm91bmQgaW1hZ2UKLW9uIHRoZSByb290IHdpbmRvdykuICBUaGUgImdjb25mdG9vbC0yIiwgImRjb3AiCi1hbmQgInhmY29uZi1xdWVyeSIgZXh0ZXJuYWwgY29tbWFuZHMgYXJlIHJ1biBmb3IKLUdOT01FLCBLREUsIGFuZCBYRkNFIHJlc3BlY3RpdmVseS4gIFRoaXMgYWxzbyB3b3Jrcwotb24gbmF0aXZlIE1hY09TWC4gIChUaGVyZSBpcyBubyBjb2xvciBzZWxlY3Rpb24gZm9yCi1NYWNPU1ggb3IgWEZDRS4pICBPdGhlciBkZXNrdG9wcyB3b24ndCB3b3JrLCAoc2VuZAotdXMgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgaWYgeW91IGZpbmQgdGhlbSkuCi1JZiB4MTF2bmMgaXMgcnVubmluZyBhcyByb290ICgKLS5JUiBpbmV0ZCAoOCkKLW9yIAotLklSIGdkbSAoMSkKLSksCi10aGUgXGZCLXVzZXJzXGZSIG9wdGlvbiBtYXkgYmUgbmVlZGVkIGZvciBHTk9NRSwgS0RFLCBYRkNFLgotSWYgeDExdm5jIGd1ZXNzZXMgeW91ciBkZXNrdG9wIGluY29ycmVjdGx5LCB5b3UgY2FuCi1mb3JjZSBpdCBieSBwcmVmaXhpbmcgY29sb3Igd2l0aCAiZ25vbWU6IiwgImtkZToiLAotImNkZToiLCAieGZjZToiLCBvciAicm9vdDoiLgotLklQCi1VcGRhdGU6IFxmQi1zb2xpZFxmUiBubyBsb25nZXIgd29ya3Mgb24gS0RFNC4KLS5JUAotVGhpcyBtb2RlIHdvcmtzIGluIGEgbGltaXRlZCB3YXkgb24gdGhlIE1hYyBPUyBYIENvbnNvbGUKLXdpdGggb25lIGNvbG9yICgna2VscCcpIHVzaW5nIHRoZSBzY3JlZW5zYXZlciB3cml0aW5nCi10byB0aGUgYmFja2dyb3VuZC4gIExvb2sgaW4gIn4vTGlicmFyeS9TY3JlZW4gU2F2ZXJzIgotZm9yIFZuY1NvbGlkQ29sb3IucG5nIHRvIGNoYW5nZSB0aGUgY29sb3IuCi0uUFAKLVxmQi1ibGFja291dFxmUiBcZklzdHJpbmdcZlIKLS5JUAotQmxhY2sgb3V0IHJlY3RhbmdsZXMgb24gdGhlIHNjcmVlbi4gXGZJc3RyaW5nXGZSIGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFd4SCtYK1kgdHlwZSBnZW9tZXRyaWVzIGZvcgotZWFjaCByZWN0YW5nbGUuICBJZiBvbmUgb2YgdGhlIGl0ZW1zIG9uIHRoZSBsaXN0IGlzIHRoZQotc3RyaW5nICJub3B0ciIgdGhlIG1vdXNlIHBvaW50ZXIgd2lsbCBub3QgYmUgYWxsb3dlZAotdG8gZ28gaW50byBhIGJsYWNrZWQgb3V0IHJlZ2lvbi4KLS5QUAotXGZCLXhpbmVyYW1hLFxmUiBcZkItbm94aW5lcmFtYVxmUgotLklQCi1JZiB5b3VyIHNjcmVlbiBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBtb25pdG9ycwotZ2x1ZWQgdG9nZXRoZXIgdmlhIFhJTkVSQU1BLCBhbmQgdGhhdCBzY3JlZW4gaXMKLW5vdCBhIHJlY3RhbmdsZSB0aGlzIG9wdGlvbiB3aWxsIHRyeSB0byBndWVzcyB0aGUKLWFyZWFzIHRvIGJsYWNrIG91dCAoaWYgeW91ciBzeXN0ZW0gaGFzIGxpYlhpbmVyYW1hKS4KLWRlZmF1bHQ6IFxmQi14aW5lcmFtYVxmUgotLklQCi1JbiBnZW5lcmFsLCB3ZSBoYXZlIG5vdGljZWQgb24gWElORVJBTUEgZGlzcGxheXMgeW91IG1heQotbmVlZCB0byB1c2UgdGhlICJcZkIteHdhcnBwb2ludGVyXGZSIiBvcHRpb24gaWYgdGhlIG1vdXNlCi1wb2ludGVyIG1pc2JlaGF2ZXMgYW5kIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gVXNlCi0iXGZCLW5veHdhcnBwb2ludGVyXGZSIiBpZiB5b3UgZG8gbm90IHdhbnQgdGhpcy4KLS5QUAotXGZCLXh0cmFwXGZSCi0uSVAKLVVzZSB0aGUgREVDLVhUUkFQIGV4dGVuc2lvbiBmb3Iga2V5c3Ryb2tlIGFuZCBtb3VzZQotaW5wdXQgaW5zZXJ0aW9uLiAgRm9yIHVzZSBvbiBsZWdhY3kgc3lzdGVtcywgZS5nLiBYMTFSNSwKLXJ1bm5pbmcgYW4gaW5jb21wbGV0ZSBvciBtaXNzaW5nIFhURVNUIGV4dGVuc2lvbi4KLUJ5IGRlZmF1bHQgREVDLVhUUkFQIHdpbGwgYmUgdXNlZCBpZiBYVEVTVCBzZXJ2ZXIgZ3JhYgotY29udHJvbCBpcyBtaXNzaW5nLCB1c2UgXGZCLXh0cmFwXGZSIHRvIGRvIHRoZSBrZXlzdHJva2UgYW5kCi1tb3VzZSBpbnNlcnRpb24gdmlhIERFQy1YVFJBUCBhcyB3ZWxsLgotLlBQCi1cZkIteHJhbmRyXGZSIFxmSVttb2RlXVxmUgotLklQCi1JZiB0aGUgZGlzcGxheSBzdXBwb3J0cyB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlCi1hbmQgUmVmbGVjdGlvbikgZXh0ZW5zaW9uLCBhbmQgeW91IGV4cGVjdCBYUkFORFIgZXZlbnRzCi10byBvY2N1ciB0byB0aGUgZGlzcGxheSB3aGlsZSB4MTF2bmMgaXMgcnVubmluZywgdGhpcwotb3B0aW9ucyBpbmRpY2F0ZXMgeDExdm5jIHNob3VsZCB0cnkgdG8gcmVzcG9uZCB0bwotdGhlbSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgY3Jhc2hpbmcgYnkgYXNzdW1pbmcgdGhlCi1vbGQgc2NyZWVuIHNpemUpLiAgU2VlIHRoZSAKLS5JUiB4cmFuZHIgKDEpCi1tYW5wYWdlIGFuZCBydW4KLVwneHJhbmRyIFxmQi1xJ1xmUiBmb3IgbW9yZSBpbmZvLiAgW21vZGVdIGlzIG9wdGlvbmFsIGFuZAotZGVzY3JpYmVkIGJlbG93LgotLklQCi1TaW5jZSB3YXRjaGluZyBmb3IgWFJBTkRSIGV2ZW50cyBhbmQgdHJhcHBpbmcgZXJyb3JzCi1pbmNyZWFzZXMgcG9sbGluZyBvdmVyaGVhZCwgb25seSB1c2UgdGhpcyBvcHRpb24gaWYKLVhSQU5EUiBjaGFuZ2VzIGFyZSBleHBlY3RlZC4gIEZvciBleGFtcGxlIG9uIGEgcm90YXRhYmxlCi1zY3JlZW4gUERBIG9yIGxhcHRvcCwgb3IgdXNpbmcgYSBYUkFORFItYXdhcmUgRGVza3RvcAotd2hlcmUgeW91IHJlc2l6ZSBvZnRlbi4gIEl0IGlzIGJlc3QgdG8gYmUgdmlld2luZyB3aXRoIGEKLXZuY3ZpZXdlciB0aGF0IHN1cHBvcnRzIHRoZSBOZXdGQlNpemUgZW5jb2RpbmcsIHNpbmNlIGl0Ci1rbm93cyBob3cgdG8gcmVhY3QgdG8gc2NyZWVuIHNpemUgY2hhbmdlcy4gIE90aGVyd2lzZSwKLUxpYlZOQ1NlcnZlciB0cmllcyB0byBkbyBzbyBzb21ldGhpbmcgcmVhc29uYWJsZSBmb3IKLXZpZXdlcnMgdGhhdCBjYW5ub3QgZG8gdGhpcyAocG9ydGlvbnMgb2YgdGhlIHNjcmVlbgotbWF5IGJlIGNsaXBwZWQsIHVudXNlZCwgZXRjKS4KLS5JUAotTm90ZTogdGhlIGRlZmF1bHQgbm93IGlzIHRvIGNoZWNrIGZvciBYUkFORFIgZXZlbnRzLCBidXQKLWRvIG5vdCB0cmFwIGV2ZXJ5IFggY2FsbCB0aGF0IG1heSBmYWlsIGR1ZSB0byByZXNpemUuCi1JZiBhIHJlc2l6ZSBldmVudCBpcyByZWNlaXZlZCwgdGhlIGZ1bGwgXGZCLXhyYW5kclxmUiBtb2RlCi1pcyBlbmFibGVkLiAgVG8gZGlzYWJsZSBldmVuIGNoZWNraW5nIGZvciBldmVudHMgc3VwcGx5OgotXGZCLW5veHJhbmRyLlxmUgotLklQCi0ibW9kZSIgZGVmYXVsdHMgdG8gInJlc2l6ZSIsIHdoaWNoIG1lYW5zIGNyZWF0ZSBhCi1uZXcsIHJlc2l6ZWQsIGZyYW1lYnVmZmVyIGFuZCBob3BlIGFsbCB2aWV3ZXJzIGNhbiBjb3BlCi13aXRoIHRoZSBjaGFuZ2UuICAibmV3ZmJzaXplIiBtZWFucyBmaXJzdCBkaXNjb25uZWN0Ci1hbGwgdmlld2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBOZXdGQlNpemUgVk5DCi1lbmNvZGluZywgYW5kIHRoZW4gcmVzaXplIHRoZSBmcmFtZWJ1ZmZlci4gICJleGl0IgotbWVhbnMgZGlzY29ubmVjdCBhbGwgdmlld2VyIGNsaWVudHMsIGFuZCB0aGVuIHRlcm1pbmF0ZQoteDExdm5jLgotLlBQCi1cZkItcm90YXRlXGZSIFxmSXN0cmluZ1xmUgotLklQCi1Sb3RhdGUgYW5kL29yIGZsaXAgdGhlIGZyYW1lYnVmZmVyIHZpZXcgZXhwb3J0ZWQgYnkgVk5DLgotVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBYUkFORFIgYW5kIGlzCi1kb25lIGluIHNvZnR3YXJlIGluIG1haW4gbWVtb3J5IGFuZCBzbyBtYXkgYmUgc2xvd2VyLgotVGhpcyBtb2RlIGNvdWxkIGJlIHVzZWZ1bCBvbiBhIGhhbmRoZWxkIHdpdGggcG9ydHJhaXQgb3IKLWxhbmRzY2FwZSBtb2RlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzY2FubGluZQotb3JkZXIgb2YgdGhlIGFjdHVhbCBmcmFtZWJ1ZmZlci4gIFxmSXN0cmluZ1xmUiBjYW4gYmU6Ci0uSVAKLXggICAgIGZsaXAgYWxvbmcgeC1heGlzCi15ICAgICBmbGlwIGFsb25nIHktYXhpcwoteHkgICAgIGZsaXAgYWxvbmcgeC0gYW5kIHktYXhlcwotKzkwICAgICByb3RhdGUgOTAgZGVncmVlcyBjbG9ja3dpc2UKLVxmQi05MFxmUiAgICAgcm90YXRlIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UKLSs5MHggICAgIHJvdGF0ZSA5MCBkZWdyZWVzIENXLCB0aGVuIGZsaXAgYWxvbmcgeAotKzkweSAgICAgcm90YXRlIDkwIGRlZ3JlZXMgQ1csIHRoZW4gZmxpcCBhbG9uZyB5Ci0uSVAKLXRoZXNlIGdpdmUgYWxsIHBvc3NpYmxlIHJvdGF0aW9ucyBhbmQgcmVmbGVjdGlvbnMuCi0uSVAKLUFsaWFzZXM6IHNhbWUgYXMgeHk6ICB5eCwgKzE4MCwgXGZCLTE4MCxcZlIgMTgwCi1zYW1lIGFzIFxmQi05MDpcZlIgKzI3MCwgMjcwCi1zYW1lIGFzICs5MDogOTAsIChkaXR0byBmb3IgOTB4LCA5MHkpCi0uSVAKLUxpa2UgXGZCLXNjYWxlLFxmUiB0aGlzIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQgYXQgdGhlIHZlcnkKLWVuZCBvZiBhbnkgY2hhaW4gb2YgZnJhbWVidWZmZXIgdHJhbnNmb3JtYXRpb25zIGFuZCBzbwotYW55IG9wdGlvbnMgd2l0aCBnZW9tZXRyaWVzLCBlLmcuIFxmQi1ibGFja291dCxcZlIgXGZCLWNsaXAsXGZSIGV0Yy4KLWFyZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgWCAob3IgXGZCLXJhd2ZiKVxmUiBmcmFtZWJ1ZmZlciwKLW5vdCB0aGUgZmluYWwgb25lIHNlbnQgdG8gVk5DIHZpZXdlcnMuCi0uSVAKLUlmIHlvdSBkbyBub3Qgd2FudCB0aGUgY3Vyc29yIHNoYXBlIHRvIGJlIHJvdGF0ZWQKLXByZWZpeCBcZklzdHJpbmdcZlIgd2l0aCAibmM6IiwgZS5nLiAibmM6KzkwIiwKLSJuYzp4eSIsIGV0Yy4KLS5QUAotXGZCLXBhZGdlb21cZlIgXGZJV3hIXGZSCi0uSVAKLVdoZW5ldmVyIGEgbmV3IHZuY3ZpZXdlciBjb25uZWN0cywgdGhlIGZyYW1lYnVmZmVyIGlzCi1yZXBsYWNlZCB3aXRoIGEgZmFrZSwgc29saWQgYmxhY2sgb25lIG9mIGdlb21ldHJ5IFd4SC4KLVNob3J0bHkgYWZ0ZXJ3YXJkcyB0aGUgZnJhbWVidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCB0aGUKLXJlYWwgb25lLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdm5jdmlld2VycwotdGhhdCBkbyBub3Qgc3VwcG9ydCBOZXdGQlNpemUgYW5kIG9uZSB3YW50cyB0byBtYWtlCi1zdXJlIHRoZSBpbml0aWFsIHZpZXdlciBnZW9tZXRyeSB3aWxsIGJlIGJpZyBlbm91Z2gKLXRvIGhhbmRsZSBhbGwgc3Vic2VxdWVudCByZXNpemVzIChlLmcuIHVuZGVyIFxmQi14cmFuZHIsXGZSCi1cZkItcmVtb3RlXGZSIGlkOndpbmRvd2lkLCByZXNjYWxpbmcsIGV0Yy4pCi0uSVAKLUluIFxmQi11bml4cHdcZlIgbW9kZSB0aGlzIHNldHMgdGhlIHNpemUgb2YgdGhlIGxvZ2luIHNjcmVlbi4KLVVzZSAib25jZTpXeEgiIGl0IGlnbm9yZSBwYWRnZW9tIGFmdGVyIHRoZSBsb2dpbgotc2NyZWVuIGlzIHNldCB1cC4KLS5QUAotXGZCLW9cZlIgXGZJbG9nZmlsZVxmUgotLklQCi1Xcml0ZSBzdGRlcnIgbWVzc2FnZXMgdG8gZmlsZSBcZklsb2dmaWxlXGZSIGluc3RlYWQgb2YgdG8KLXRoZSB0ZXJtaW5hbC4gIFNhbWUgYXMgIlxmQi1sb2dmaWxlXGZSIFxmSWZpbGVcZlIiLiAgVG8gYXBwZW5kCi10byB0aGUgZmlsZSB1c2UgIlxmQi1vYVxmUiBcZklmaWxlXGZSIiBvciAiXGZCLWxvZ2FwcGVuZFxmUiBcZklmaWxlXGZSIi4KLUlmIFxmSWxvZ2ZpbGVcZlIgY29udGFpbnMgdGhlIHN0cmluZyAiJVZOQ0RJU1BMQVkiCi1pdCBpcyBleHBhbmRlZCB0byB0aGUgdm5jIGRpc3BsYXkgKHRoZSBuYW1lIG1heSBuZWVkCi10byBiZSBndWVzc2VkIGF0LikgICIlSE9NRSIgd29ya3MgdG9vLgotLlBQCi1cZkItZmxhZ1xmUiBcZklmaWxlXGZSCi0uSVAKLVdyaXRlIHRoZSAiUE9SVD1OTk5OIiAoZS5nLiBQT1JUPTU5MDApIHN0cmluZyB0bwotXGZJZmlsZVxmUiBpbiBhZGRpdGlvbiB0byBzdGRvdXQuICBUaGlzIG9wdGlvbiBjb3VsZCBiZQotdXNlZnVsIGJ5IHdyYXBwZXIgc2NyaXB0IHRvIGRldGVjdCB3aGVuIHgxMXZuYyBpcyByZWFkeS4KLS5QUAotXGZCLXJtZmxhZ1xmUiBcZklmaWxlXGZSCi0uSVAKLVJlbW92ZSBcZklmaWxlXGZSIGF0IGV4aXQgdG8gc2lnbmFsIHdoZW4geDExdm5jIGlzIGRvbmUuCi1UaGUgZmlsZSBpcyBjcmVhdGVkIGF0IHN0YXJ0dXAgaWYgaXQgZG9lcyBub3QgYWxyZWFkeQotZXhpc3Qgb3IgaWYgXGZJZmlsZVxmUiBpcyBwcmVmaXhlZCB3aXRoICJjcmVhdGU6Ii4KLUlmIHRoZSBmaWxlIGlzIGNyZWF0ZWQsIHRoZSB4MTF2bmMgUElEIGlzIHBsYWNlZCBpbgotdGhlIGZpbGUuICBPdGhlcndpc2UgdGhlIGZpbGVzIGNvbnRlbnRzIGlzIG5vdCBjaGFuZ2VkLgotVXNlIHByZWZpeCAibm9jcmVhdGU6IiB0byBwcmV2ZW50IGNyZWF0aW9uLgotLlBQCi1cZkItcmNcZlIgXGZJZmlsZW5hbWVcZlIKLS5JUAotVXNlIFxmSWZpbGVuYW1lXGZSIGluc3RlYWQgb2YgJEhPTUUvLngxMXZuY3JjIGZvciByYyBmaWxlLgotLlBQCi1cZkItbm9yY1xmUgotLklQCi1EbyBub3QgcHJvY2VzcyBhbnkgLngxMXZuY3JjIGZpbGUgZm9yIG9wdGlvbnMuCi0uUFAKLVxmQi1lbnZcZlIgXGZJVkFSPVZBTFVFXGZSCi0uSVAKLVNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ1ZBUicgdG8gdmFsdWUgJ1ZBTFVFJwotYXQgeDExdm5jIHN0YXJ0dXAuICBUaGlzIGlzIGEgY29udmVuaWVuY2UgdXRpbGl0eSB0bwotYXZvaWQgc2hlbGwgc2NyaXB0IHdyYXBwZXJzLCBldGMuIHRvIHNldCB0aGUgZW52LiB2YXIuCi1Zb3UgbWF5IHNwZWNpZnkgYXMgbWFueSBvZiB0aGVzZSBhcyBuZWVkZWQgb24gdGhlCi1jb21tYW5kIGxpbmUuCi0uUFAKLVxmQi1wcm9nXGZSIFxmSS9wYXRoL3RvL3gxMXZuY1xmUgotLklQCi1TZXQgdGhlIGZ1bGwgcGF0aCB0byB0aGUgeDExdm5jIHByb2dyYW0gZm9yIGNhc2VzIHdoZW4KLWl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20gYXJndlswXSAoZS5nLiB0Y3BkL2luZXRkKQotLlBQCi1cZkItaCxcZlIgXGZCLWhlbHBcZlIKLS5JUAotUHJpbnQgdGhpcyBoZWxwIHRleHQuCi0tPywgXGZCLW9wdHNcZlIgICAgICAgICAgICAgIE9ubHkgbGlzdCB0aGUgeDExdm5jIG9wdGlvbnMuCi0uUFAKLVxmQi1WLFxmUiBcZkItdmVyc2lvblxmUgotLklQCi1QcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuCi0uUFAKLVxmQi1saWNlbnNlXGZSCi0uSVAKLVByaW50IG91dCBsaWNlbnNlIGluZm9ybWF0aW9uLiAgU2FtZSBhcyBcZkItY29weWluZ1xmUiBhbmQKLVxmQi13YXJyYW50eS5cZlIKLS5QUAotXGZCLWRiZ1xmUgotLklQCi1JbnN0ZWFkIG9mIGV4aXRpbmcgYWZ0ZXIgY2xlYW5pbmcgdXAsIHJ1biBhIHNpbXBsZQotImRlYnVnIGNyYXNoIHNoZWxsIiB3aGVuIGZhdGFsIGVycm9ycyBhcmUgdHJhcHBlZC4KLS5QUAotXGZCLXEsXGZSIFxmQi1xdWlldFxmUgotLklQCi1CZSBxdWlldCBieSBwcmludGluZyBsZXNzIGluZm9ybWF0aW9uYWwgb3V0cHV0IHRvCi1zdGRlcnIuICh1c2UgXGZCLW5vcXVpZXRcZlIgdG8gdW5kbyBhbiBlYXJsaWVyIFxmQi1xdWlldC4pXGZSCi0uSVAKLVRoZSBcZkItcXVpZXRcZlIgb3B0aW9uIGRvZXMgbm90IGVsaW1pbmF0ZSBhbGwgaW5mb3JtYXRpb25hbAotb3V0cHV0LCBpdCBvbmx5IHJlZHVjZXMgaXQuICBJdCBpcyBpZ25vcmVkIGluIG1vc3QKLWF1eGlsaWFyeSB1c2FnZSBtb2RlcywgZS5nLiBcZkItc3RvcmVwYXNzd2QuXGZSICBUbyBlbGltaW5hdGUKLWFsbCBvdXRwdXQgdXNlOiAyPi9kZXYvbnVsbCAxPiYyLCBldGMuCi0uUFAKLVxmQi12LFxmUiBcZkItdmVyYm9zZVxmUgotLklQCi1QcmludCBvdXQgbW9yZSBpbmZvcm1hdGlvbiB0byBzdGRlcnIuCi0uUFAKLVxmQi1iZ1xmUgotLklQCi1HbyBpbnRvIHRoZSBiYWNrZ3JvdW5kIGFmdGVyIHNjcmVlbiBzZXR1cC4gIE1lc3NhZ2VzIHRvCi1zdGRlcnIgYXJlIGxvc3QgdW5sZXNzIFxmQi1vXGZSIGxvZ2ZpbGUgaXMgdXNlZC4gIFNvbWV0aGluZwotbGlrZSB0aGlzIGNvdWxkIGJlIHVzZWZ1bCBpbiBhIHNjcmlwdDoKLS5JUAotcG9ydD1gc3NoIC10ICRob3N0ICJ4MTF2bmMgLWRpc3BsYXkgOjAgLWJnIiB8IGdyZXAgUE9SVGAKLS5JUAotcG9ydD1gZWNobyAiJHBvcnQiIHwgc2VkIC1lICdzL1BPUlQ9Ly8nYAotLklQCi1wb3J0PWBleHByICRwb3J0IC0gNTkwMGAKLS5JUAotdm5jdmlld2VyICRob3N0OiRwb3J0Ci0uUFAKLVxmQi1tb2R0d2VhayxcZlIgXGZCLW5vbW9kdHdlYWtcZlIKLS5JUAotT3B0aW9uIFxmQi1tb2R0d2Vha1xmUiBhdXRvbWF0aWNhbGx5IHRyaWVzIHRvIGFkanVzdCB0aGUgQWx0R3IKLWFuZCBTaGlmdCBtb2RpZmllcnMgZm9yIGRpZmZlcmluZyBsYW5ndWFnZSBrZXlib2FyZHMKLWJldHdlZW4gY2xpZW50IGFuZCBob3N0LiAgT3RoZXJ3aXNlLCBvbmx5IGEgc2luZ2xlIGtleQotcHJlc3MvcmVsZWFzZSBvZiBhIEtleWNvZGUgaXMgc2ltdWxhdGVkIChpLmUuIGlnbm9yaW5nCi10aGUgc3RhdGUgb2YgdGhlIG1vZGlmaWVyczogdGhpcyB1c3VhbGx5IHdvcmtzIGZvcgotaWRlbnRpY2FsIGtleWJvYXJkcykuICBBbHNvIHVzZWZ1bCBpbiByZXNvbHZpbmcgY2FzZXMKLXdoZXJlIGEgS2V5c3ltIGlzIGJvdW5kIHRvIG11bHRpcGxlIGtleXMgKGUuZy4gIjwiICsgIj4iCi1hbmQgIiwiICsgIjwiIGtleXMpLiAgRGVmYXVsdDogXGZCLW1vZHR3ZWFrXGZSCi0uSVAKLUlmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCB3aXRoIGtleXMgYW5kIFxmQi14a2JcZlIgb3IKLVxmQi1ub3hrYixcZlIgYW5kIHNpbWlsYXIgdGhpbmdzIGRvbid0IGhlbHAsIHRyeSBcZkItbm9tb2R0d2Vhay5cZlIKLS5JUAotT24gc29tZSBIUC1VWCBzeXN0ZW1zIGl0IGlzIGJlZW4gbm90ZWQgdGhhdCB0aGV5IGhhdmUKLWFuIG9kZCBrZXltYXBwaW5nIHdoZXJlIGEgc2luZ2xlIGtleWNvZGUgd2lsbCBoYXZlIGEKLWtleXN5bSwgZS5nLiAiIyIsIHVwIHRvIHRocmVlIHRpbWVzLiAgWW91IGNhbiBjaGVjawotdmlhICJ4bW9kbWFwIFxmQi1wayJcZlIgb3IgdGhlIFxmQi1ka1xmUiBvcHRpb24uICBUaGUgZmFpbHVyZQotaXMgd2hlbiB5b3UgdHJ5IHRvIHR5cGUgIiMiIGl0IHlpZWxkcyAiMyIuICBJZiB5b3UKLXNlZSB0aGlzIHByb2JsZW0gdHJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1NT0RUV0VBS19MT1dFU1Q9MSB0byBzZWUgaWYgaXQgaGVscHMuCi0uUFAKLVxmQi14a2IsXGZSIFxmQi1ub3hrYlxmUgotLklQCi1XaGVuIGluIG1vZHR3ZWFrIG1vZGUsIHVzZSB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiAoaWYKLXRoZSBYIGRpc3BsYXkgc3VwcG9ydHMgaXQpIHRvIGRvIHRoZSBtb2RpZmllciB0d2Vha2luZy4KLVRoaXMgaXMgcG93ZXJmdWwgYW5kIHNob3VsZCBiZSB0cmllZCBpZiB0aGVyZSBhcmUgc3RpbGwKLWtleW1hcHBpbmcgcHJvYmxlbXMgd2hlbiB1c2luZyBcZkItbW9kdHdlYWtcZlIgYnkgaXRzZWxmLgotVGhlIGRlZmF1bHQgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIGNvbW1vbiBrZXlzeW1zLAotZS5nLiAhLCBALCBbLCBhcmUgb25seSBhY2Nlc3NpYmxlIHZpYSBcZkIteGtiXGZSIG1vZGUgYW5kIGlmCi1zbyB0aGVuIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSBtb2RlLiAgVG8gZGlzYWJsZSB0aGlzCi1hdXRvbWF0aWMgZGV0ZWN0aW9uIHVzZSBcZkItbm94a2IuXGZSCi0uSVAKLVdoZW4gXGZCLXhrYlxmUiBtb2RlIGlzIGFjdGl2ZSB5b3UgY2FuIHNldCB0aGVzZSBlbnYuIHZhcnMuCi1UaGV5IGFwcGx5IG9ubHkgd2hlbiB0aGVyZSBpcyBhbWJpZ3VpdHkgYXMgdG8gd2hpY2gKLWtleSB0byBjaG9vc2UgKGkuZSB0aGUgbWFwcGluZyBpcyBub3Qgb25lLXRvLW9uZSkuCi1OT0tFWUhJTlRTPTE6IGZvciB1cCBhc2NpaSBrZXlzdHJva2VzIGRvIG5vdCB1c2Ugc2NvcmUKLWhpbnRzIHNhdmVkIHdoZW4gdGhlIGtleSB3YXMgcHJlc3NlZCBkb3duLiBOT0FOWURPV049MToKLWZvciB1cCBrZXlzdHJva2VzIGRvIG5vdCByZXNvcnQgdG8gc2VhcmNoaW5nIHRocm91Z2gKLWtleXMgdGhhdCBhcmUgY3VycmVudGx5IHByZXNzZWQgZG93bi4gIEtFWVNET1dOPU46Ci1yZW1lbWJlciB0aGUgbGFzdCBOIGtleXMgcHJlc3MgZG93biBmb3IgdGllLWJyZWFraW5nCi13aGVuIGFuIHVwIGtleXN0cm9rZSBjb21lcyBpbi4KLS5QUAotXGZCLWNhcHNsb2NrXGZSCi0uSVAKLVdoZW4gaW4gXGZCLW1vZHR3ZWFrXGZSICh0aGUgZGVmYXVsdCkgb3IgXGZCLXhrYlxmUiBtb2RlLAotaWYgYSBrZXlzeW0gaW4gdGhlIHJhbmdlIEEtWiBjb21lcyBpbiBjaGVjayB0aGUgWAotc2VydmVyIHRvIHNlZSBpZiB0aGUgQ2Fwc19Mb2NrIGlzIHNldC4gIElmIGl0IGlzIGRvCi1ub3QgYXJ0aWZpY2lhbGx5IHByZXNzIFNoaWZ0IHRvIGdlbmVyYXRlIHRoZSBrZXlzeW0uCi1UaGlzIHdpbGwgZW5hYmxlIHRoZSBDYXBzTG9jayBrZXkgdG8gYmVoYXZlIGNvcnJlY3RseQotaW4gc29tZSBjaXJjdW1zdGFuY2VzOiBuYW1lbHkgKmJvdGgqIHRoZSBWTkMgdmlld2VyCi1tYWNoaW5lIGFuZCB0aGUgeDExdm5jIFggc2VydmVyIGFyZSBpbiB0aGUgQ2Fwc0xvY2sKLW9uIHN0YXRlLiAgSWYgb25lIHNpZGUgaGFzIENhcHNMb2NrIG9uIGFuZCB0aGUgb3RoZXIKLW9mZiBhbmQgdGhlIGtleWJvYXJkIGlzIG5vdCBiZWhhdmluZyBhcyB5b3UgdGhpbmsgaXQKLXNob3VsZCB5b3Ugc2hvdWxkIGNvcnJlY3QgdGhlIENhcHNMb2NrIHN0YXRlcyAoaGludDoKLXByZXNzaW5nIENhcHNMb2NrIGluc2lkZSBhbmQgb3V0c2lkZSBvZiB0aGUgdmlld2VyIGNhbgotaGVscCB0b2dnbGUgdGhlbSBib3RoIHRvIHRoZSBjb3JyZWN0IHN0YXRlKS4gIEhvd2V2ZXIsCi1mb3IgYmVzdCByZXN1bHRzIGRvIG5vdCB1c2UgdGhpcyBvcHRpb24sIGJ1dCByYXRoZXIKLSpvbmx5KiBlbmFibGUgQ2Fwc0xvY2sgb24gdGhlIFZOQyB2aWV3ZXIgc2lkZSAoaS5lLiBieQotcHJlc3NpbmcgQ2Fwc0xvY2sgb3V0c2lkZSBvZiB0aGUgdmlld2VyIHdpbmRvdywgYWxzbwotXGZCLXNraXBfbG9ja2tleXNcZlIgYmVsb3cpLiAgQWxzbyB0cnkgXGZCLW5vbW9kdHdlYWtcZlIgZm9yIGEKLXBvc3NpYmxlIHdvcmthcm91bmQuCi0uUFAKLVxmQi1za2lwX2xvY2trZXlzLFxmUiBcZkItbm9za2lwX2xvY2trZXlzXGZSCi0uSVAKLUhhdmUgeDExdm5jIGlnbm9yZSBhbGwgQ2Fwc19Mb2NrLCBTaGlmdF9Mb2NrLCBOdW1fTG9jaywKLVNjcm9sbF9Mb2NrIGtleXN5bXMgcmVjZWl2ZWQgZnJvbSB2aWV3ZXJzLiAgVGhlIGlkZWEgaXMKLXlvdSBwcmVzcyBDYXBzX0xvY2sgb24gdGhlIFZOQyBWaWV3ZXIgc2lkZSBidXQgdGhhdCBkb2VzCi1ub3QgY2hhbmdlIHRoZSBsb2NrIHN0YXRlIGluIHRoZSB4MTF2bmMtc2lkZSBYIHNlcnZlci4KLU5ldmVydGhlbGVzcyB5b3VyIGNhcGl0YWxpemVkIGxldHRlcnMgY29tZSBpbiBvdmVyCi10aGUgd2lyZSBhbmQgYXJlIGFwcGxpZWQgY29ycmVjdGx5IHRvIHRoZSB4MTF2bmMtc2lkZQotWCBzZXJ2ZXIuICBOb3RlIHRoaXMgbW9kZSBwcm9iYWJseSB3b24ndCBkbyB3aGF0IHlvdQotd2FudCBpbiBcZkItbm9tb2R0d2Vha1xmUiBtb2RlLiAgQWxzbywgYSBrbHVkZ2UgZm9yIEtQX24KLWRpZ2l0cyBpcyBhbHdheXMgZG9uZSBpbiB0aGlzIG1vZGU6IHRoZXkgYXJlIG1hcHBlZCB0bwotcmVndWxhciBkaWdpdCBrZXlzeW1zLiAgU2VlIGFsc28gXGZCLWNhcHNsb2NrXGZSIGFib3ZlLgotVGhlIGRlZmF1bHQgaXMgXGZCLW5vc2tpcF9sb2Nra2V5cy5cZlIKLS5QUAotXGZCLXNraXBfa2V5Y29kZXNcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLUlnbm9yZSB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZGVjaW1hbCBrZXljb2Rlcy4KLVBlcmhhcHMgdGhlc2UgYXJlIGtleWNvZGVzIG5vdCBvbiB5b3VyIGtleWJvYXJkIGJ1dAoteW91ciBYIHNlcnZlciB0aGlua3MgZXhpc3QuICBDdXJyZW50bHkgb25seSBhcHBsaWVzCi10byBcZkIteGtiXGZSIG1vZGUuICBVc2UgdGhpcyBvcHRpb24gdG8gaGVscCB4MTF2bmMgaW4gdGhlCi1yZXZlcnNlIHByb2JsZW0gaXQgdHJpZXMgdG8gc29sdmU6IEtleXN5bSAtPiBLZXljb2RlKHMpCi13aGVuIGFtYmlndWl0aWVzIGV4aXN0IChtb3JlIHRoYW4gb25lIEtleWNvZGUgcGVyCi1LZXlzeW0pLiAgUnVuICd4bW9kbWFwIFxmQi1waydcZlIgdG8gc2VlIHlvdXIga2V5bWFwcGluZy4KLUV4YW1wbGU6ICJcZkItc2tpcF9rZXljb2Rlc1xmUiBcZkk5NCwxMTRcZlIiCi0uUFAKLVxmQi1zbG9wcHlfa2V5c1xmUgotLklQCi1FeHBlcmltZW50YWwgb3B0aW9uIHRoYXQgdHJpZXMgdG8gY29ycmVjdCBzb21lCi0ic2xvcHB5IiBrZXkgYmVoYXZpb3IuICBFLmcuIGlmIGF0IHRoZSB2aWV3ZXIgeW91Ci1wcmVzcyBTaGlmdCtLZXkgYnV0IHRoZW4gcmVsZWFzZSB0aGUgU2hpZnQgYmVmb3JlCi1LZXkgdGhhdCBjb3VsZCBnaXZlIHJpc2UgdG8gZXh0cmEgdW53YW50ZWQgY2hhcmFjdGVycwotKHVzdWFsbHkgb25seSBiZXR3ZWVuIGtleWJvYXJkcyBvZiBkaWZmZXJlbnQgbGFuZ3VhZ2VzKS4KLU9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBvYnNlcnZlIHByb2JsZW1zIHdpdGgKLXNvbWUga2V5c3Ryb2tlcy4KLS5QUAotXGZCLXNraXBfZHVwcyxcZlIgXGZCLW5vc2tpcF9kdXBzXGZSCi0uSVAKLVNvbWUgVk5DIHZpZXdlcnMgc2VuZCBpbXBvc3NpYmxlIHJlcGVhdGVkIGtleSBldmVudHMsCi1lLmcuIGtleS1kb3duLCBrZXktZG93biwga2V5LXVwLCBrZXktdXAgYWxsIGZvciB0aGUgc2FtZQota2V5LCBvciAyMCBkb3ducyBpbiBhIHJvdyBmb3IgdGhlIHNhbWUgbW9kaWZpZXIga2V5IQotU2V0dGluZyBcZkItc2tpcF9kdXBzXGZSIG1lYW5zIHRvIHNraXAgdGhlc2UgZHVwbGljYXRlcyBhbmQKLWp1c3QgcHJvY2VzcyB0aGUgZmlyc3QgZXZlbnQuIE5vdGU6IHNvbWUgVk5DIHZpZXdlcnMKLWFzc3VtZSB0aGV5IGNhbiBzZW5kIGRvd24ncyB3aXRob3V0IHRoZSBjb3JyZXNwb25kaW5nCi11cCdzIGFuZCBzbyB5b3Ugc2hvdWxkIG5vdCBzZXQgdGhpcyBvcHRpb24gZm9yCi10aGVzZSB2aWV3ZXJzIChzeW1wdG9tOiBzb21lIGtleXMgZG8gbm90IGF1dG9yZXBlYXQpCi1EZWZhdWx0OiBcZkItbm9za2lwX2R1cHNcZlIKLS5QUAotXGZCLWFkZF9rZXlzeW1zLFxmUiBcZkItbm9hZGRfa2V5c3ltc1xmUgotLklQCi1JZiBhIEtleXN5bSBpcyByZWNlaXZlZCBmcm9tIGEgVk5DIHZpZXdlciBhbmQgdGhhdAotS2V5c3ltIGRvZXMgbm90IGV4aXN0IGluIHRoZSBYIHNlcnZlciwgdGhlbiBhZGQgdGhlCi1LZXlzeW0gdG8gdGhlIFggc2VydmVyJ3Mga2V5Ym9hcmQgbWFwcGluZyBvbiBhbiB1bnVzZWQKLWtleS4gIEFkZGVkIEtleXN5bXMgd2lsbCBiZSByZW1vdmVkIHBlcmlvZGljYWxseSBhbmQKLWFsc28gd2hlbiB4MTF2bmMgZXhpdHMuICBEZWZhdWx0OiBcZkItYWRkX2tleXN5bXNcZlIKLS5QUAotXGZCLWNsZWFyX21vZHNcZlIKLS5JUAotQXQgc3RhcnR1cCBhbmQgZXhpdCBjbGVhciB0aGUgbW9kaWZpZXIga2V5cyBieSBzZW5kaW5nCi1LZXlSZWxlYXNlIGZvciBlYWNoIG9uZS4gVGhlIExvY2sgbW9kaWZpZXJzIGFyZSBza2lwcGVkLgotVXNlZCB0byBjbGVhciB0aGUgc3RhdGUgaWYgdGhlIGRpc3BsYXkgd2FzIGFjY2lkZW50YWxseQotbGVmdCB3aXRoIGFueSBwcmVzc2VkIGRvd24uCi0uUFAKLVxmQi1jbGVhcl9rZXlzXGZSCi0uSVAKLUFzIFxmQi1jbGVhcl9tb2RzLFxmUiBleGNlcHQgdHJ5IHRvIHJlbGVhc2UgQU5ZIHByZXNzZWQga2V5LgotTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFuZCBcZkItY2xlYXJfbW9kc1xmUiBjYW4gaW50ZXJmZXJlCi13aXRoIGEgcGVyc29uIHR5cGluZyBhdCB0aGUgcGh5c2ljYWwga2V5Ym9hcmQuCi0uUFAKLVxmQi1jbGVhcl9hbGxcZlIKLS5JUAotQXMgXGZCLWNsZWFyX2tleXMsXGZSIGV4Y2VwdCB0cnkgdG8gcmVsZWFzZSBhbnkgQ2Fwc0xvY2ssCi1OdW1Mb2NrLCBldGMuIGxvY2tzIGFzIHdlbGwuCi0uUFAKLVxmQi1yZW1hcFxmUiBcZklzdHJpbmdcZlIKLS5JUAotUmVhZCBLZXlzeW0gcmVtYXBwaW5ncyBmcm9tIGZpbGUgbmFtZWQgXGZJc3RyaW5nXGZSLgotRm9ybWF0IGlzIG9uZSBwYWlyIG9mIEtleXN5bXMgcGVyIGxpbmUgKGNhbiBiZSBuYW1lCi1vciBoZXggdmFsdWUpIHNlcGFyYXRlZCBieSBhIHNwYWNlLiAgSWYgbm8gZmlsZSBuYW1lZAotXGZJc3RyaW5nXGZSIGV4aXN0cywgaXQgaXMgaW5zdGVhZCBpbnRlcnByZXRlZCBhcyB0aGlzCi1mb3JtOiBrZXkxLWtleTIsa2V5My1rZXk0LC4uLiAgU2VlIDxYMTEva2V5c3ltZGVmLmg+Ci1oZWFkZXIgZmlsZSBmb3IgYSBsaXN0IG9mIEtleXN5bSBuYW1lcywgb3IgdXNlIAotLklSIHhldiAoMSkuCi0uSVAKLVRvIG1hcCBhIGtleSB0byBhIGJ1dHRvbiBjbGljaywgdXNlIHRoZSBmYWtlIEtleXN5bXMKLSJCdXR0b24xIiwgLi4uLCBldGMuIEUuZzogIlxmQi1yZW1hcFxmUiBcZklTdXBlcl9SLUJ1dHRvbjJcZlIiCi0odXNlZnVsIGZvciBwYXN0aW5nIG9uIGEgbGFwdG9wKQotLklQCi1JIHVzZSB0aGVzZSBpZiB0aGUgbWFjaGluZSBJIGFtIHZpZXdpbmcgZnJvbSBkb2VzIG5vdAotaGF2ZSBhIHNjcm9sbHdoZWVsIG9yIEkgZG9uJ3QgbGlrZSB1c2luZyB0aGUgb25lIGl0IGhhczoKLS5JUAotXGZCLXJlbWFwXGZSIFN1cGVyX1ItQnV0dG9uNCxNZW51LUJ1dHRvbjUKLVxmQi1yZW1hcFxmUiBLUF9BZGQtQnV0dG9uNCxLUF9FbnRlci1CdXR0b241Ci0uSVAKLXRoZSBmb3JtZXIgd291bGQgYmUgdXNlZCBvbiBhIFBDLCB0aGUgbGF0dGVyIG9uIGEKLU1hY0Jvb2suICBUaGlzIHdheSB0aG9zZSBsaXR0bGUgdXNlZCBrZXlzIGNhbiBiZSB1c2VkCi10byBnZW5lcmF0ZSBiaWdnZXIgaG9wcyB0aGFuIHRoZSBVcCBhbmQgRG93biBhcnJvd3MKLXByb3ZpZGUuICBPbmUgY2FuIHNjcm9sbCB0aHJvdWdoIHRleHQgb3Igd2ViIHBhZ2VzIG1vcmUKLXF1aWNrbHkgdGhpcyB3YXkgKGVzcGVjaWFsbHkgaWYgeDExdm5jIHNjcm9sbCBkZXRlY3Rpb24KLWlzIGFjdGl2ZS4pCi0uSVAKLVVzZSBCdXR0b240NCwgQnV0dG9uMTIsIGV0Yy4gZm9yIG11bHRpcGxlIGNsaWNrcy4KLS5JUAotVG8gZGlzYWJsZSBhIGtleXN5bSAoaS5lLiBtYWtlIGl0IHNvIGl0IHdpbGwgbm90IGJlCi1pbmplY3RlZCksIHJlbWFwIGl0IHRvICJOb1N5bWJvbCIgb3IgIk5vbmUiLgotLklQCi1EZWFkIGtleXM6ICJkZWFkIiAob3Igc2lsZW50LCBtdXRlKSBrZXlzIGFyZSBrZXlzIHRoYXQKLWRvIG5vdCBwcm9kdWNlIGEgY2hhcmFjdGVyIGJ1dCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgMm5kCi1rZXlzdHJva2UuICBUaGlzIGlzIG9mdGVuIHVzZWQgZm9yIGFjY2VudGluZyBjaGFyYWN0ZXJzLAotZS5nLiB0byBwdXQgImAiIG9uIHRvcCBvZiAiYSIgYnkgcHJlc3NpbmcgdGhlIGRlYWQKLWtleSBhbmQgdGhlbiAiYSIuICBOb3RlIHRoYXQgdGhpcyBpbnRlcnByZXRhdGlvbgotaXMgbm90IHBhcnQgb2YgY29yZSBYMTEsIGl0IGlzIHVwIHRvIHRoZSB0b29sa2l0IG9yCi1hcHBsaWNhdGlvbiB0byBkZWNpZGUgaG93IHRvIHJlYWN0IHRvIHRoZSBzZXF1ZW5jZS4KLVRoZSBYMTEgbmFtZXMgZm9yIHRoZXNlIGtleXN5bXMgYXJlICJkZWFkX2dyYXZlIiwKLSJkZWFkX2FjdXRlIiwgZXRjLiAgSG93ZXZlciBzb21lIFZOQyB2aWV3ZXJzIHNlbmQgdGhlCi1rZXlzeW1zICJncmF2ZSIsICJhY3V0ZSIgaW5zdGVhZCB0aGVyZWJ5IGRpc2FibGluZwotdGhlIGFjY2VudGluZy4gIFRvIHdvcmsgYXJvdW5kIHRoaXMgXGZCLXJlbWFwXGZSIGNhbiBiZSB1c2VkLgotRm9yIGV4YW1wbGUgIlxmQi1yZW1hcFxmUiBcZklncmF2ZS1kZWFkX2dyYXZlLGFjdXRlLWRlYWRfYWN1dGVcZlIiCi0uSVAKLUFzIGEgY29udmVuaWVuY2UsICJcZkItcmVtYXBcZlIgXGZJREVBRFxmUiIgYXBwbGllcyB0aGVzZSByZW1hcHM6Ci0uSVAKLSAgICAgIGcgICAgIGdyYXZlLWRlYWRfZ3JhdmUKLSAgICAgIGEgICAgIGFjdXRlLWRlYWRfYWN1dGUKLSAgICAgIGMgICAgIGFzY2lpY2lyY3VtLWRlYWRfY2lyY3VtZmxleAotICAgICAgdCAgICAgYXNjaWl0aWxkZS1kZWFkX3RpbGRlCi0gICAgICBtICAgICBtYWNyb24tZGVhZF9tYWNyb24KLSAgICAgIGIgICAgIGJyZXZlLWRlYWRfYnJldmUKLSAgICAgIEQgICAgIGFib3ZlZG90LWRlYWRfYWJvdmVkb3QKLSAgICAgIGQgICAgIGRpYWVyZXNpcy1kZWFkX2RpYWVyZXNpcwotICAgICAgbyAgICAgZGVncmVlLWRlYWRfYWJvdmVyaW5nCi0gICAgICBBICAgICBkb3VibGVhY3V0ZS1kZWFkX2RvdWJsZWFjdXRlCi0gICAgICByICAgICBjYXJvbi1kZWFkX2Nhcm9uCi0gICAgICBlICAgICBjZWRpbGxhLWRlYWRfY2VkaWxsYQotLklQCi0uSVAKLUlmIHlvdSBqdXN0IHdhbnQgYSBzdWJzZXQgdXNlIHRoZSBmaXJzdCBsZXR0ZXIKLWxhYmVsLCBlLmcuICJcZkItcmVtYXBcZlIgXGZJREVBRD1nYVxmUiIgdG8gZ2V0IHRoZSBmaXJzdCB0d28uCi1BZGRpdGlvbmFsIHJlbWFwcyBtYXkgYWxzbyBiZSBzdXBwbGllZCB2aWEgY29tbWFzLAotZS5nLiAgIlxmQi1yZW1hcFxmUiBcZklERUFEPWdhLFN1cGVyX1ItQnV0dG9uMlxmUiIuICBGaW5hbGx5LAotIkRFQUQ9bWlzc2luZyIgbWVhbnMgdG8gYXBwbHkgYWxsIG9mIHRoZSBhYm92ZSBhcwotbG9uZyBhcyB0aGUgbGVmdCBoYW5kIG1lbWJlciBpcyBub3QgYWxyZWFkeSBpbiB0aGUKLVgxMSBrZXltYXAuCi0uUFAKLVxmQi1ub3JlcGVhdCxcZlIgXGZCLXJlcGVhdFxmUgotLklQCi1PcHRpb24gXGZCLW5vcmVwZWF0XGZSIGRpc2FibGVzIFggc2VydmVyIGtleSBhdXRvIHJlcGVhdCB3aGVuCi1WTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkIGFuZCBWTkMga2V5Ym9hcmQgaW5wdXQgaXMKLW5vdCBpZGxlIGZvciBtb3JlIHRoYW4gNSBtaW51dGVzLiAgVGhpcyB3b3JrcyBhcm91bmQgYQotcmVwZWF0aW5nIGtleXN0cm9rZXMgYnVnICh0cmlnZ2VyZWQgYnkgbG9uZyBwcm9jZXNzaW5nCi1kZWxheXMgYmV0d2VlbiBrZXkgZG93biBhbmQga2V5IHVwIGNsaWVudCBldmVudHM6Ci1laXRoZXIgZnJvbSBsYXJnZSBzY3JlZW4gY2hhbmdlcyBvciBoaWdoIGxhdGVuY3kpLgotRGVmYXVsdDogXGZCLW5vcmVwZWF0XGZSCi0uSVAKLVlvdSBjYW4gc2V0IHRoZSBlbnYuIHZhci4gWDExVk5DX0lETEVfVElNRU9VVCB0byB0aGUKLW51bWJlciBvZiBpZGxlIHNlY29uZHMgeW91IHdhbnQgKDVtaW4gPSAzMDBzZWNzKS4KLS5JUAotTm90ZTogeW91ciBWTkMgdmlld2VyIHNpZGUgd2lsbCBsaWtlbHkgZG8gYXV0b3JlcGVhdGluZywKLXNvIHRoaXMgaXMgbm8gbG9zcyB1bmxlc3Mgc29tZW9uZSBpcyBzaW11bHRhbmVvdXNseSBhdAotdGhlIHJlYWwgWCBkaXNwbGF5LgotLklQCi1Vc2UgIlxmQi1ub3JlcGVhdFxmUiBcZklOXGZSIiB0byBzZXQgaG93IG1hbnkgdGltZXMgbm9yZXBlYXQgd2lsbAotYmUgcmVzZXQgaWYgc29tZXRoaW5nIGVsc2UgKGUuZy4gWCBzZXNzaW9uIG1hbmFnZXIpCi11bmRvZXMgaXQuICBUaGUgZGVmYXVsdCBpcyAyLiAgVXNlIGEgbmVnYXRpdmUgdmFsdWUKLWZvciB1bmxpbWl0ZWQgcmVzZXRzLgotLlBQCi1cZkItbm9mYlxmUgotLklQCi1JZ25vcmUgdmlkZW8gZnJhbWVidWZmZXI6IG9ubHkgcHJvY2VzcyBrZXlib2FyZCBhbmQKLXBvaW50ZXIuICBJbnRlbmRlZCBmb3IgdXNlIHdpdGggV2luMlZOQyBhbmQgeDJ2bmMKLWR1YWwtbW9uaXRvciBzZXR1cHMuCi0uUFAKLVxmQi1ub2JlbGxcZlIKLS5JUAotRG8gbm90IHdhdGNoIGZvciBYQmVsbCBldmVudHMuIChubyBiZWVwcyB3aWxsIGJlIGhlYXJkKQotTm90ZTogWEJlbGwgbW9uaXRvcmluZyByZXF1aXJlcyB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbi4KLS5QUAotXGZCLW5vc2VsXGZSCi0uSVAKLURvIG5vdCBtYW5hZ2UgZXhjaGFuZ2Ugb2YgWCBzZWxlY3Rpb24vY3V0YnVmZmVyIGJldHdlZW4KLVZOQyB2aWV3ZXJzIGFuZCB0aGUgWCBzZXJ2ZXIgYXQgYWxsLgotLlBQCi1cZkItbm9wcmltYXJ5XGZSCi0uSVAKLURvIG5vdCBwb2xsIHRoZSBQUklNQVJZIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyB0byBzZW5kCi1iYWNrIHRvIGNsaWVudHMuICAoUFJJTUFSWSBpcyBzdGlsbCBzZXQgb24gcmVjZWl2ZWQKLWNoYW5nZXMsIGhvd2V2ZXIpLgotLlBQCi1cZkItbm9zZXRwcmltYXJ5XGZSCi0uSVAKLURvIG5vdCBzZXQgdGhlIFBSSU1BUlkgc2VsZWN0aW9uIGZvciBjaGFuZ2VzIHJlY2VpdmVkCi1mcm9tIFZOQyBjbGllbnRzLgotLlBQCi1cZkItbm9jbGlwYm9hcmRcZlIKLS5JUAotRG8gbm90IHBvbGwgdGhlIENMSVBCT0FSRCBzZWxlY3Rpb24gZm9yIGNoYW5nZXMgdG8gc2VuZAotYmFjayB0byBjbGllbnRzLiAgKENMSVBCT0FSRCBpcyBzdGlsbCBzZXQgb24gcmVjZWl2ZWQKLWNoYW5nZXMsIGhvd2V2ZXIpLgotLlBQCi1cZkItbm9zZXRjbGlwYm9hcmRcZlIKLS5JUAotRG8gbm90IHNldCB0aGUgQ0xJUEJPQVJEIHNlbGVjdGlvbiBmb3IgY2hhbmdlcwotcmVjZWl2ZWQgZnJvbSBWTkMgY2xpZW50cy4KLS5QUAotXGZCLXNlbGRpclxmUiBcZklzdHJpbmdcZlIKLS5JUAotSWYgZGlyZWN0aW9uIHN0cmluZyBpcyAic2VuZCIsIG9ubHkgc2VuZCB0aGUgc2VsZWN0aW9uCi10byB2aWV3ZXJzLCBhbmQgaWYgaXQgaXMgInJlY3YiIG9ubHkgcmVjZWl2ZSBpdCBmcm9tCi12aWV3ZXJzLiAgVG8gd29yayBhcm91bmQgYXBwcyBzZXR0aW5nIHRoZSBzZWxlY3Rpb24KLXRvbyBmcmVxdWVudGx5IGFuZCBtZXNzaW5nIHVwIHRoZSBvdGhlciBlbmQuICBZb3UgY2FuCi1hY3R1YWxseSBzdXBwbHkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3Rpb25zLAotaW5jbHVkaW5nICJkZWJ1ZyIgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0LgotLlBQCi1cZkItY3Vyc29yXGZSIFxmSVttb2RlXSxcZlIgXGZCLW5vY3Vyc29yXGZSCi0uSVAKLVNldHMgaG93IHRoZSBwb2ludGVyIGN1cnNvciBzaGFwZSAobGl0dGxlIGljb24gYXQgdGhlCi1tb3VzZSBwb2ludGVyKSBzaG91bGQgYmUgaGFuZGxlZC4gIFRoZSAibW9kZSIgc3RyaW5nCi1pcyBvcHRpb25hbCBhbmQgaXMgZGVzY3JpYmVkIGJlbG93LiAgVGhlIGRlZmF1bHQKLWlzIHRvIHNob3cgc29tZSBzb3J0IG9mIGN1cnNvciBzaGFwZShzKS4gIEhvdyB0aGlzCi1pcyBkb25lIGRlcGVuZHMgb24gdGhlIFZOQyB2aWV3ZXIgYW5kIHRoZSBYIHNlcnZlci4KLVVzZSBcZkItbm9jdXJzb3JcZlIgdG8gZGlzYWJsZSBjdXJzb3Igc2hhcGVzIGNvbXBsZXRlbHkuCi0uSVAKLVNvbWUgVk5DIHZpZXdlcnMgc3VwcG9ydCB0aGUgVGlnaHRWTkMgQ3Vyc29yUG9zVXBkYXRlcwotYW5kIEN1cnNvclNoYXBlVXBkYXRlcyBleHRlbnNpb25zIChjdXRzIGRvd24gb24KLW5ldHdvcmsgdHJhZmZpYyBieSBub3QgaGF2aW5nIHRvIHNlbmQgdGhlIGN1cnNvciBpbWFnZQotZXZlcnkgdGltZSB0aGUgcG9pbnRlciBpcyBtb3ZlZCksIGluIHdoaWNoIGNhc2UgdGhlc2UKLWV4dGVuc2lvbnMgYXJlIHVzZWQgKHNlZSBcZkItbm9jdXJzb3JzaGFwZVxmUiBhbmQgXGZCLW5vY3Vyc29ycG9zXGZSCi1iZWxvdyB0byBkaXNhYmxlKS4gIEZvciBvdGhlciB2aWV3ZXJzIHRoZSBjdXJzb3Igc2hhcGUKLWlzIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIGZyYW1lYnVmZmVyIGV2ZXJ5IHRpbWUgdGhlCi1wb2ludGVyIGlzIG1vdmVkIG9yIGNoYW5nZWQgYW5kIGdldHMgc2VudCBhbG9uZyB3aXRoCi10aGUgb3RoZXIgZnJhbWVidWZmZXIgdXBkYXRlcy4gIEluIHRoaXMgY2FzZSwgdGhlcmUKLXdpbGwgYmUgc29tZSBsYWcgYmV0d2VlbiB0aGUgdm5jIHZpZXdlciBwb2ludGVyIGFuZAotdGhlIHJlbW90ZSBjdXJzb3IgcG9zaXRpb24uCi0uSVAKLUlmIHRoZSBYIGRpc3BsYXkgc3VwcG9ydHMgcmV0cmlldmluZyB0aGUgY3Vyc29yIHNoYXBlCi1pbmZvcm1hdGlvbiBmcm9tIHRoZSBYIHNlcnZlciwgdGhlbiB0aGUgZGVmYXVsdCBpcwotdG8gdXNlIHRoYXQgbW9kZS4gIE9uIFNvbGFyaXMgdGhpcyBjYW4gYmUgZG9uZSB3aXRoCi10aGUgU1VOX09WTCBleHRlbnNpb24gdXNpbmcgXGZCLW92ZXJsYXlcZlIgKHNlZSBhbHNvIHRoZQotXGZCLW92ZXJsYXlfbm9jdXJzb3JcZlIgb3B0aW9uKS4gIEEgc2ltaWxhciBvdmVybGF5IHNjaGVtZQotaXMgdXNlZCBvbiBJUklYLiAgWG9yZyAoZS5nLiBMaW51eCkgYW5kIHJlY2VudCBTb2xhcmlzCi1Yc3VuIHNlcnZlcnMgc3VwcG9ydCB0aGUgWEZJWEVTIGV4dGVuc2lvbiB0byByZXRyaWV2ZQotdGhlIGV4YWN0IGN1cnNvciBzaGFwZSBmcm9tIHRoZSBYIHNlcnZlci4gIElmIFhGSVhFUwotaXMgcHJlc2VudCBpdCBpcyBwcmVmZXJyZWQgb3ZlciBPdmVybGF5IGFuZCBpcyB1c2VkIGJ5Ci1kZWZhdWx0IChzZWUgXGZCLW5veGZpeGVzXGZSIGJlbG93KS4gIFRoaXMgY2FuIGJlIGRpc2FibGVkCi13aXRoIFxmQi1ub2N1cnNvcixcZlIgYW5kIGFsc28gc29tZSB2YWx1ZXMgb2YgdGhlICJtb2RlIgotb3B0aW9uIGJlbG93LgotLklQCi1Ob3RlIHRoYXQgdW5kZXIgWEZJWEVTIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhCi1jaGFubmVsKSB3aWxsIHVzdWFsbHkgbm90IGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgYW5kIG9uZQotbWF5IGZpbmQgT3ZlcmxheSBwcmVmZXJhYmxlLiAgU2VlIGFsc28gdGhlIFxmQi1hbHBoYWN1dFxmUgotYW5kIFxmQi1hbHBoYWZyYWNcZlIgb3B0aW9ucyBiZWxvdyBhcyBmdWRnZSBmYWN0b3JzIHRvIHRyeQotdG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uIGZvciBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5Ci1mb3IgYSBnaXZlbiB0aGVtZS4KLS5JUAotVGhlICJtb2RlIiBzdHJpbmcgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZQotZGlzcGxheWluZyBvZiBjdXJzb3Igc2hhcGVzLiAgSXQgY2FuIGJlIHVzZWQgdGhlCi1mb2xsb3dpbmcgd2F5czoKLS5JUAotIlxmQi1jdXJzb3JcZlIgXGZJYXJyb3dcZlIiIC0ganVzdCBzaG93IHRoZSBzdGFuZGFyZCBhcnJvdwotbm90aGluZyBtb3JlIG9yIG5vdGhpbmcgbGVzcy4KLS5JUAotIlxmQi1jdXJzb3JcZlIgXGZJbm9uZVxmUiIgLSBzYW1lIGFzICJcZkItbm9jdXJzb3JcZlIiCi0uSVAKLSJcZkItY3Vyc29yXGZSIFxmSVhcZlIiIC0gd2hlbiB0aGUgY3Vyc29yIGFwcGVhcnMgdG8gYmUgb24gdGhlCi1yb290IHdpbmRvdywgZHJhdyB0aGUgZmFtaWxpYXIgWCBzaGFwZS4gIFNvbWUgZGVza3RvcHMKLXN1Y2ggYXMgR05PTUUgY292ZXIgdXAgdGhlIHJvb3Qgd2luZG93IGNvbXBsZXRlbHksCi1hbmQgc28gdGhpcyB3aWxsIG5vdCB3b3JrLCB0cnkgIlgxIiwgZXRjLCB0byB0cnkgdG8KLXNoaWZ0IHRoZSB0cmVlIGRlcHRoLiAgT24gaGlnaCBsYXRlbmN5IGxpbmtzIG9yIHNsb3cKLW1hY2hpbmVzIHRoZXJlIHdpbGwgYmUgYSB0aW1lIGxhZyBiZXR3ZWVuIGV4cGVjdGVkIGFuZAotdGhlIGFjdHVhbCBjdXJzb3Igc2hhcGUuCi0uSVAKLSJcZkItY3Vyc29yXGZSIFxmSXNvbWVcZlIiIC0gbGlrZSAiWCIgYnV0IHVzZSBhZGRpdGlvbmFsCi1oZXVyaXN0aWNzIHRvIHRyeSB0byBndWVzcyBpZiB0aGUgd2luZG93IHNob3VsZCBoYXZlCi1hIHdpbmRvd21hbmFnZXItbGlrZSByZXNpemVyIGN1cnNvciBvciBhIHRleHQgaW5wdXQKLUktYmVhbSBjdXJzb3IuICBUaGlzIGlzIGEgY29tcGxldGUgaGFjaywgYnV0IG1heSBiZQotdXNlZnVsIGluIHNvbWUgc2l0dWF0aW9ucyBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgbGl0dGxlCi1tb3JlIGZlZWRiYWNrIGFib3V0IHRoZSBjdXJzb3Igc2hhcGUuCi0uSVAKLSJcZkItY3Vyc29yXGZSIFxmSW1vc3RcZlIiIC0gdHJ5IHRvIHNob3cgYXMgbWFueSBjdXJzb3JzIGFzCi1wb3NzaWJsZS4gIE9mdGVuIHRoaXMgd2lsbCBvbmx5IGJlIHRoZSBzYW1lIGFzICJzb21lIgotdW5sZXNzIHRoZSBkaXNwbGF5IGhhcyBvdmVybGF5IHZpc3VhbHMgb3IgWEZJWEVTCi1leHRlbnNpb25zIGF2YWlsYWJsZS4gIE9uIFNvbGFyaXMgYW5kIElSSVggaWYgWEZJWEVTCi1pcyBub3QgYXZhaWxhYmxlLCBcZkItb3ZlcmxheVxmUiBtb2RlIHdpbGwgYmUgYXR0ZW1wdGVkLgotLlBQCi1cZkItY3Vyc29yX2RyYWdcZlIKLS5JUAotU2hvdyBjdXJzb3Igc2hhcGUgY2hhbmdlcyBldmVuIHdoZW4gdGhlIG1vdXNlIGlzIGJlaW5nCi1kcmFnZ2VkIHdpdGggYSBtb3VzZSBidXR0b24gZG93bi4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdQotd2FudCB0byBiZSBhYmxlIHRvIHNlZSBEcmFnLWFuZC1Ecm9wIGN1cnNvciBpY29ucywgZXRjLgotLlBQCi1cZkItYXJyb3dcZlIgXGZJblxmUgotLklQCi1DaG9vc2UgYW4gYWx0ZXJuYXRlICJhcnJvdyIgY3Vyc29yIGZyb20gYSBzZXQgb2YKLXNvbWUgY29tbW9uIG9uZXMuICBuIGNhbiBiZSAxIHRvIDYuICBEZWZhdWx0IGlzOiAxCi1JZ25vcmVkIHdoZW4gaW4gWEZJWEVTIGN1cnNvci1ncmFiYmluZyBtb2RlLgotLlBQCi1cZkItbm94Zml4ZXNcZlIKLS5JUAotRG8gbm90IHVzZSB0aGUgWEZJWEVTIGV4dGVuc2lvbiB0byBkcmF3IHRoZSBleGFjdCBjdXJzb3IKLXNoYXBlIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlLgotLklQCi1Ob3RlOiBUbyB3b3JrIGFyb3VuZCBhIGNyYXNoIGluIFhvcmcgMS41IGFuZCBsYXRlcgotc29tZSBwZW9wbGUgbmVlZGVkIHRvIHVzZSBcZkItbm94Zml4ZXMuXGZSICBUaGUgWG9yZyBjcmFzaAotb2NjdXJyZWQgcmlnaHQgYWZ0ZXIgYSBEaXNwbGF5IE1hbmFnZXIgKGUuZy4gR0RNKSBsb2dpbi4KLVN0YXJ0aW5nIHdpdGggeDExdm5jIDAuOS45IGl0IHRyaWVzIHRvIGF1dG9tYXRpY2FsbHkKLWF2b2lkIHVzaW5nIFhGSVhFUyB1bnRpbCBpdCBpcyBzdXJlIGEgd2luZG93IG1hbmFnZXIKLWlzIHJ1bm5pbmcuICBTZWUgdGhlIFxmQi1yZW9wZW5cZlIgb3B0aW9uIGZvciBtb3JlIGluZm8gYW5kCi1ob3cgdG8gdXNlIFgxMVZOQ19BVk9JRF9XSU5ET1dTPW5ldmVyIHRvIGRpc2FibGUgaXQuCi0uUFAKLVxmQi1hbHBoYWN1dFxmUiBcZkluXGZSCi0uSVAKLVdoZW4gdXNpbmcgdGhlIFhGSVhFUyBleHRlbnNpb24gZm9yIHRoZSBjdXJzb3Igc2hhcGUsCi1jdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5IHdpbGwgbm90IHVzdWFsbHkgYmUgZGlzcGxheWVkCi1leGFjdGx5IChidXQgb3BhcXVlIG9uZXMgd2lsbCkuICBUaGlzIG9wdGlvbiBzZXRzIG4gYXMKLWEgY3V0b2ZmIGZvciBjdXJzb3JzIHRoYXQgaGF2ZSB0cmFuc3BhcmVuY3kgKCJhbHBoYQotY2hhbm5lbCIgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIDAgdG8gMjU1KSBBbnkgY3Vyc29yCi1waXhlbCB3aXRoIGFscGhhIHZhbHVlIGxlc3MgdGhhbiBuIGJlY29tZXMgY29tcGxldGVseQotdHJhbnNwYXJlbnQuICBPdGhlcndpc2UgdGhlIHBpeGVsIGlzIGNvbXBsZXRlbHkgb3BhcXVlLgotRGVmYXVsdCAyNDAKLS5QUAotXGZCLWFscGhhZnJhY1xmUiBcZklmcmFjdGlvblxmUgotLklQCi1XaXRoIHRoZSB0aHJlc2hvbGQgaW4gXGZCLWFscGhhY3V0XGZSIHNvbWUgY3Vyc29ycyB3aWxsIGJlY29tZQotYWxtb3N0IGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYmVjYXVzZSB0aGVpciBhbHBoYSB2YWx1ZXMKLWFyZSBub3QgaGlnaCBlbm91Z2guICBGb3IgdGhvc2UgY3Vyc29ycyBhZGp1c3QgdGhlCi1hbHBoYSB0aHJlc2hvbGQgdW50aWwgZnJhY3Rpb24gb2YgdGhlIG5vbi16ZXJvIGFscGhhCi1jaGFubmVsIHBpeGVscyBiZWNvbWUgb3BhcXVlLiAgRGVmYXVsdCAwLjMzCi0uUFAKLVxmQi1hbHBoYXJlbW92ZVxmUgotLklQCi1CeSBkZWZhdWx0LCBYRklYRVMgY3Vyc29ycyBwaXhlbHMgd2l0aCB0cmFuc3BhcmVuY3kgaGF2ZQotdGhlIGFscGhhIGZhY3RvciBtdWx0aXBsaWVkIGludG8gdGhlIFJHQiBjb2xvciB2YWx1ZXMKLShpLmUuIHRoYXQgY29ycmVzcG9uZGluZyB0byBibGVuZGluZyB0aGUgY3Vyc29yIHdpdGggYQotYmxhY2sgYmFja2dyb3VuZCkuICBTcGVjaWZ5IHRoaXMgb3B0aW9uIHRvIHJlbW92ZSB0aGUKLWFscGhhIGZhY3Rvci4gKHVzZWZ1bCBmb3IgbGlnaHQgY29sb3JlZCBzZW1pLXRyYW5zcGFyZW50Ci1jdXJzb3JzKS4KLS5QUAotXGZCLW5vYWxwaGFibGVuZFxmUgotLklQCi1JbiBYRklYRVMgbW9kZSBkbyBub3Qgc2VuZCBjdXJzb3IgYWxwaGEgY2hhbm5lbCBkYXRhCi10byBMaWJWTkNTZXJ2ZXIuICBUaGUgZGVmYXVsdCBpcyB0byBzZW5kIGl0LiAgVGhlCi1hbHBoYWJsZW5kIGVmZmVjdCB3aWxsIG9ubHkgYmUgdmlzaWJsZSBpbiBcZkItbm9jdXJzb3JzaGFwZVxmUgotbW9kZSBvciBmb3IgY2xpZW50cyB3aXRoIGN1cnNvcnNoYXBldXBkYXRlcyB0dXJuZWQKLW9mZi4gKEhvd2V2ZXIgdGhlcmUgaXMgYSBoYWNrIGZvciAzMmJwcCB3aXRoIGRlcHRoIDI0LAotaXQgdXNlcyB0aGUgZXh0cmEgOCBiaXRzIHRvIHN0b3JlIGN1cnNvciB0cmFuc3BhcmVuY3kKLWZvciB1c2Ugd2l0aCBhIGhhY2tlZCB2bmN2aWV3ZXIgdGhhdCBhcHBsaWVzIHRoZQotdHJhbnNwYXJlbmN5IGxvY2FsbHkuICBTZWUgdGhlIEZBUSBmb3IgbW9yZSBpbmZvKS4KLS5QUAotXGZCLW5vY3Vyc29yc2hhcGVcZlIKLS5JUAotRG8gbm90IHVzZSB0aGUgVGlnaHRWTkMgQ3Vyc29yU2hhcGVVcGRhdGVzIGV4dGVuc2lvbgotZXZlbiBpZiBjbGllbnRzIHN1cHBvcnQgaXQuICBTZWUgXGZCLWN1cnNvclxmUiBhYm92ZS4KLS5QUAotXGZCLWN1cnNvcnBvcyxcZlIgXGZCLW5vY3Vyc29ycG9zXGZSCi0uSVAKLU9wdGlvbiBcZkItY3Vyc29ycG9zXGZSIGVuYWJsZXMgc2VuZGluZyB0aGUgWCBjdXJzb3IgcG9zaXRpb24KLWJhY2sgdG8gYWxsIHZuYyBjbGllbnRzIHRoYXQgc3VwcG9ydCB0aGUgVGlnaHRWTkMKLUN1cnNvclBvc1VwZGF0ZXMgZXh0ZW5zaW9uLiAgT3RoZXIgY2xpZW50cyB3aWxsIGJlIGFibGUKLXRvIHNlZSB0aGUgcG9pbnRlciBtb3Rpb25zLiBEZWZhdWx0OiBcZkItY3Vyc29ycG9zXGZSCi0uUFAKLVxmQi14d2FycHBvaW50ZXIsXGZSIFxmQi1ub3h3YXJwcG9pbnRlclxmUgotLklQCi1Nb3ZlIHRoZSBwb2ludGVyIHdpdGggCi0uSVIgWFdhcnBQb2ludGVyICgzWCkKLWluc3RlYWQgb2YKLXRoZSBYVEVTVCBleHRlbnNpb24uICBVc2UgdGhpcyBhcyBhIHdvcmthcm91bmQKLWlmIHRoZSBwb2ludGVyIG1vdGlvbiBiZWhhdmVzIGluY29ycmVjdGx5LCBlLmcuCi1vbiB0b3VjaHNjcmVlbnMgb3Igb3RoZXIgbm9uLXN0YW5kYXJkIHNldHVwcy4KLS5JUAotSXQgaXMgYWxzbyBzb21ldGltZXMgbmVlZGVkIG9uIFhJTkVSQU1BIGRpc3BsYXlzIGFuZCBpcwotZW5hYmxlZCBieSBkZWZhdWx0IGlmIFhJTkVSQU1BIGlzIGZvdW5kIHRvIGJlIGFjdGl2ZS4KLVRvIHByZXZlbnQgdGhpcywgdXNlIFxmQi1ub3h3YXJwcG9pbnRlci5cZlIKLS5QUAotXGZCLWFsd2F5c19pbmplY3RcZlIKLS5JUAotRXZlbiBpZiB0aGVyZSBpcyBubyBkaXNwbGFjZW1lbnQgKGR4ID0gZHkgPSAwKSBmb3IgYQotVk5DIG1vdXNlIGV2ZW50IGZvcmNlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmRpY2F0ZWQgeCx5Ci1wb3NpdGlvbiBhbnl3YXkuICBSZWNlbnQgKDIwMDkpIGd1aSB0b29sa2l0cyAoZ25vbWUpCi1oYXZlIHByb2JsZW1zIHdpdGggeDExdm5jJ3Mgb3JpZ2luYWwgbW91c2UgaW5wdXQKLWluamVjdGlvbiBtZXRob2QuICBTbyB4MTF2bmMncyBtb3VzZSBpbnB1dCBpbmplY3Rpb24KLW1ldGhvZCBoYXMgYmVlbiBtb2RpZmllZC4gIFRvIHJlZ2FpbiB0aGUgT0xEIGJlaGF2aW9yCi11c2UgdGhpcyBvcHRpb246IFxmQi1hbHdheXNfaW5qZWN0LlxmUiAgVGhlbiB4MTF2bmMgd2lsbAotYWx3YXlzIGZvcmNlIHBvc2l0aW9uaW5nIHRoZSBtb3VzZSB0byB0aGUgeCx5IHBvc2l0aW9uCi1ldmVuIGlmIHRoYXQgcG9zaXRpb24gaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cwotVk5DIGlucHV0IGV2ZW50LgotLklQCi1UaGUgZmlyc3QgcGxhY2UgdGhpcyBwcm9ibGVtIHdhcyBub3RpY2VkIHdhcyBpbiBnbm9tZQotdGVybWluYWw6IGlmIHlvdSBwcmVzc2VkIGFuZCByZWxlYXNlZCBtb3VzZSBidXR0b24gMywgYQotbWVudSB3YXMgcG9zdGVkIGFuZCB0aGVuIGl0cyBmaXJzdCBlbGVtZW50ICdOZXcgVGVybWluYWwKLVdpbmRvdycgd2FzIGFjdGl2YXRlZC4gIFRoaXMgd2FzIGJlY2F1c2UgeDExdm5jIGluamVjdGVkCi10aGUgbW91c2UgcG9zaXRpb24gdHdpY2U6IG9uY2Ugb24gQnV0dG9uUHJlc3MgYW5kIGFnYWluCi1vbiBCdXR0b25SZWxlYXNlLiAgVGhlIHRvb2xraXQgaW50ZXJwcmV0ZWQgdGhlIDJuZCBvbmUKLWFzIG1vdXNlIG1vdGlvbiBldmVuIHRob3VnaCB0aGUgbW91c2UgaGFkbid0IG1vdmVkLgotU28gbm93IGJ5IGRlZmF1bHQgeDExdm5jIHRyaWVzIHRvIGF2b2lkIGluamVjdGluZyB0aGUKLTJuZCBvbmUuCi0uSVAKLU5vdGUgdGhhdCB3aXRoIHRoZSBuZXcgZGVmYXVsdCB4MTF2bmMgd2lsbCBiZSBvYmxpdmlvdXMKLXRvIGFwcGxpY2F0aW9ucyBtb3ZpbmcgdGhlIHBvaW50ZXIgKHdhcnBpbmcpIG9yIHRoZQotdXNlciBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBtb3ZpbmcgaXQuICBTbyBpdCBtaWdodCwKLWUuZy4sIGluamVjdCBCdXR0b25SZWxlYXNlIGF0IHRoZSB3cm9uZyBwb3NpdGlvbi4KLUlmIHRoaXMgKG9yIHNpbWlsYXIgc2NlbmFyaW9zKSBjYXVzZXMgcHJvYmxlbXMgaW4geW91cgotZW52aXJvbm1lbnQsIHNwZWNpZnkgXGZCLWFsd2F5c19pbmplY3RcZlIgZm9yIHRoZSBvbGQgbWV0aG9kLgotLlBQCi1cZkItYnV0dG9ubWFwXGZSIFxmSXN0cmluZ1xmUgotLklQCi1TdHJpbmcgdG8gcmVtYXAgbW91c2UgYnV0dG9ucy4gIEZvcm1hdDogSUpLLUxNTiwgdGhpcwotbWFwcyBidXR0b25zIEkgLT4gTCwgZXRjLiwgZS5nLiAgXGZCLWJ1dHRvbm1hcFxmUiAxMy0zMQotLklQCi1CdXR0b24gcHJlc3NlcyBjYW4gYWxzbyBiZSBtYXBwZWQgdG8ga2V5c3Ryb2tlczogcmVwbGFjZQotYSBidXR0b24gZGlnaXQgb24gdGhlIHJpZ2h0IG9mIHRoZSBkYXNoIHdpdGggOjxzeW0+Ogotb3IgOjxzeW0xPis8c3ltMj46IGV0Yy4gZm9yIG11bHRpcGxlIGtleXMuIEZvciBleGFtcGxlLAotaWYgdGhlIHZpZXdpbmcgbWFjaGluZSBoYXMgYSBtb3VzZS13aGVlbCAoYnV0dG9ucyA0IDUpCi1idXQgdGhlIHgxMXZuYyBzaWRlIGRvZXMgbm90LCB0aGVzZSB3aWxsIGRvIHNjcm9sbHM6Ci0uSVAKLVxmQi1idXR0b25tYXBcZlIgMTIzNDUtMTIzOlByaW9yOjpOZXh0OgotLklQCi1cZkItYnV0dG9ubWFwXGZSIDEyMzQ1LTEyMzpVcCtVcCtVcDo6RG93bitEb3duK0Rvd246Ci0uSVAKLVNlZSA8WDExL2tleXN5bWRlZi5oPiBoZWFkZXIgZmlsZSBmb3IgYSBsaXN0IG9mIEtleXN5bXMsCi1vciB1c2UgdGhlIAotLklSIHhldiAoMSkKLXByb2dyYW0uICBOb3RlOiBtYXBwaW5nIG9mIGJ1dHRvbgotY2xpY2tzIHRvIEtleXN5bXMgbWF5IG5vdCB3b3JrIGlmIFxmQi1tb2R0d2Vha1xmUiBvciBcZkIteGtiXGZSIGlzCi1uZWVkZWQgZm9yIHRoZSBLZXlzeW0uCi0uSVAKLUlmIHlvdSBpbmNsdWRlIGEgbW9kaWZpZXIgbGlrZSAiU2hpZnRfTCIgdGhlCi1tb2RpZmllcidzIHVwL2Rvd24gc3RhdGUgaXMgdG9nZ2xlZCwgZS5nLiB0byBzZW5kCi0iVGhlIiB1c2UgOlNoaWZ0X0wrdCtTaGlmdF9MK2grZTogKHRoZSAxc3Qgb25lIGlzCi1zaGlmdCBkb3duIGFuZCB0aGUgMm5kIG9uZSBpcyBzaGlmdCB1cCkuIChub3RlOiB0aGUKLWluaXRpYWwgc3RhdGUgb2YgdGhlIG1vZGlmaWVyIGlzIGlnbm9yZWQgYW5kIG5vdCByZXNldCkKLVRvIGluY2x1ZGUgYnV0dG9uIGV2ZW50cyB1c2UgIkJ1dHRvbjEiLCAuLi4gZXRjLgotLklQCi0uSVAKLVxmQi1idXR0b25tYXBcZlIgY3VycmVudGx5IGRvZXMgbm90IHdvcmsgb24gTWFjT1NYIGNvbnNvbGUKLW9yIGluIFxmQi1yYXdmYlxmUiBtb2RlLgotLklQCi1Xb3JrYXJvdW5kOiB1c2UgXGZCLWJ1dHRvbm1hcFxmUiBJSi4uLi1MTS4uLj1uIHRvIGxpbWl0IHRoZQotbnVtYmVyIG9mIG1vdXNlIGJ1dHRvbnMgdG8gbiwgZS5nLiAxMjMtMTIzPTMuICBUaGlzIHdpbGwKLXByZXZlbnQgeDExdm5jIGZyb20gY3Jhc2hpbmcgaWYgdGhlIFggc2VydmVyIHJlcG9ydHMKLXRoZXJlIGFyZSA1IGJ1dHRvbnMgKDQvNSBzY3JvbGwgd2hlZWwpLCBidXQgdGhlcmUgYXJlCi1vbmx5IHJlYWxseSAzLgotLlBQCi1cZkItbm9kcmFnZ2luZ1xmUgotLklQCi1EbyBub3QgdXBkYXRlIHRoZSBkaXNwbGF5IGR1cmluZyBtb3VzZSBkcmFnZ2luZyBldmVudHMKLShtb3VzZSBidXR0b24gaGVsZCBkb3duKS4gIEdyZWF0bHkgaW1wcm92ZXMgcmVzcG9uc2Ugb24KLXNsb3cgc2V0dXBzLCBidXQgeW91IGxvc2UgYWxsIHZpc3VhbCBmZWVkYmFjayBmb3IgZHJhZ3MsCi10ZXh0IHNlbGVjdGlvbiwgYW5kIHNvbWUgbWVudSB0cmF2ZXJzYWxzLiAgSXQgb3ZlcnJpZGVzCi1hbnkgXGZCLXBvaW50ZXJfbW9kZVxmUiBzZXR0aW5nLgotLlBQCi1cZkItbmNhY2hlXGZSIFxmSW5cZlIKLS5JUAotQ2xpZW50LXNpZGUgY2FjaGluZyBzY2hlbWUuICBGcmFtZWJ1ZmZlciBtZW1vcnkgXGZJblxmUgotKGFuIGludGVnZXIpIHRpbWVzIHRoYXQgb2YgdGhlIGZ1bGwgZGlzcGxheSBpcyBhbGxvY2F0ZWQKLWJlbG93IHRoZSBhY3R1YWwgZnJhbWVidWZmZXIgdG8gY2FjaGUgc2NyZWVuIGNvbnRlbnRzCi1mb3IgcmFwaWQgcmV0cmlldmFsLiAgU28gYSBXIHggSCBmcmFtYnVmZmVyIGlzIGV4cGFuZGVkCi10byBhIFcgeCAobisxKSpIIG9uZS4gIFVzZSAwIHRvIGRpc2FibGUuCi0uSVAKLVRoZSBcZkluXGZSIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpcyAxMC4KLS5JUAotRm9yIHRoaXMgYW5kIHRoZSBvdGhlciBcZkItbmNhY2hlKlxmUiBvcHRpb25zIGJlbG93IHlvdSBjYW4KLWFiYnJldmlhdGUgIlxmQi1uY2FjaGVcZlIiIHdpdGggIlxmQi1uY1xmUiIuICBBbHNvLCAiXGZCLW5vbmNcZlIiCi1pcyB0aGUgc2FtZSBhcyAiXGZCLW5jYWNoZVxmUiBcZkkwXGZSIgotLklQCi1UaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBvcHRpb24sIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBpbgotYW4gYXdrd2FyZCB3YXkgaW4gdGhhdCBpbiB0aGUgVk5DIFZpZXdlciB5b3UgY2FuIHNlZSB0aGUKLXBpeGVsIGNhY2hlIGNvbnRlbnRzIGlmIHlvdSBzY3JvbGwgZG93biwgZXRjLiAgU28geW91Ci13aWxsIGhhdmUgdG8gc2V0IHRoaW5ncyB1cCBzbyB5b3UgY2FuJ3Qgc2VlIHRoYXQgcmVnaW9uLgotSWYgdGhpcyBtZXRob2QgaXMgc3VjY2Vzc2Z1bCwgdGhlIGNoYW5nZXMgcmVxdWlyZWQgZm9yCi1jbGllbnRzIHRvIGRvIHRoaXMgbGVzcyBhd2t3YXJkbHkgd2lsbCBiZSBpbnZlc3RpZ2F0ZWQuCi0uSVAKLVRoZSBTU1ZOQyB2aWV3ZXIgZG9lcyBhIGdvb2Qgam9iIGF0IGF1dG9tYXRpY2FsbHkgaGlkaW5nCi10aGUgcGl4ZWwgY2FjaGUgcmVnaW9uLiAgT3IgdXNlIFNTVk5DJ3MgXGZCLXljcm9wXGZSIG9wdGlvbgotdG8gZXhwbGljaXRseSBoaWRlIHRoZSByZWdpb24uCi0uSVAKLU5vdGUgdGhhdCB0aGlzIG1vZGUgY29uc3VtZXMgYSBodWdlIGFtb3VudCBvZiBtZW1vcnksCi1ib3RoIG9uIHRoZSB4MTF2bmMgc2VydmVyIHNpZGUgYW5kIG9uIHRoZSBWTkMgVmlld2VyCi1zaWRlLiAgSWYgbj0yIHRoZW4gdGhlIGFtb3VudCBvZiBSQU0gdXNlZCBpcyByb3VnaGx5Ci10cmlwbGVkIGZvciBib3RoIHgxMXZuYyBhbmQgdGhlIFZOQyBWaWV3ZXIuICBBcyBhIHJ1bGUKLW9mIHRodW1iLCBub3RlIHRoYXQgMTI4MHgxMDI0IGF0IGRlcHRoIDI0IGlzIGFib3V0IDVNQgotb2YgcGl4ZWwgZGF0YS4KLS5JUAotRm9yIHJlYXNvbmFibGUgcmVzcG9uc2Ugd2hlbiBjeWNsaW5nIHRocm91Z2ggNCB0byA2Ci1sYXJnZSAoZS5nLiB3ZWIgYnJvd3Nlcikgd2luZG93cyBhIHZhbHVlIG4gb2YgNiB0byAxMgotaXMgcmVjb21tZW5kZWQuICh0aGF0J3MgcmlnaHQ6IH4xMFggbW9yZSBtZW1vcnkuLi4pCi0uSVAKLUJlY2F1c2Ugb2YgdGhlIHdheSB3aW5kb3cgYmFja2luZ3N0b3JlIGFuZCBzYXZldW5kZXJzCi1hcmUgaW1wbGVtZW50ZWQsIG4gbXVzdCBiZSBldmVuLiAgSXQgd2lsbCBiZSBpbmNyZW1lbnRlZAotYnkgMSBpZiBpdCBpcyBub3QuCi0uSVAKLVRoaXMgbW9kZSBhbHNvIHdvcmtzIGZvciBuYXRpdmUgTWFjT1MgWCwgYnV0IG1heSBub3QKLWJlIGFzIGVmZmVjdGl2ZSBhcyB0aGUgWCB2ZXJzaW9uLiAgVGhpcyBpcyBkdWUgdG8gYQotbnVtYmVyIG9mIHRoaW5ncywgb25lIGlzIHRoZSBkcm9wLXNoYWRvdyBjb21wb3NpdGluZwotdGhhdCBsZWF2ZXMgZXh0cmEgYXJlYXMgdGhhdCBuZWVkIHRvIGJlIHJlcGFpcmVkIChzZWUKLVxmQi1uY2FjaGVfcGFkKS5cZlIgIEFub3RoZXIgaXMgdGhlIHdpbmRvdyBpY29uaWZpY2F0aW9uCi1hbmltYXRpb25zIG5lZWQgdG8gYmUgYXZvaWRlZCAoc2VlIFxmQi1tYWNpY29udGltZSkuXGZSCi1JdCBhcHBlYXJzIHRoZSB0aGF0IHRoZSAnU2NhbGUnIGFuaW1hdGlvbiBtb2RlIGdpdmVzCi1iZXR0ZXIgcmVzdWx0cyB0aGFuIHRoZSAnR2VuaWUnIG9uZS4gIEFsc28sIHdpbmRvdyBldmVudAotZGV0ZWN0aW9uIG5vdCBhcyBhY2N1cmF0ZSBhcyB0aGUgWCB2ZXJzaW9uLgotLlBQCi1cZkItbmNhY2hlX2NyXGZSCi0uSVAKLUluIFxmQi1uY2FjaGVcZlIgbW9kZSwgdHJ5IHRvIGRvIGNvcHlyZWN0IG9wYXF1ZSB3aW5kb3cKLW1vdmVzL2RyYWdzIGluc3RlYWQgb2Ygd2lyZWZyYW1lcyAodGhpcyBjYW4gaW5kdWNlCi1wYWludGluZyBlcnJvcnMpLiAgVGhlIHdpcmVmcmFtZSB3aWxsIHN0aWxsIGJlIHVzZWQgd2hlbgotbW92aW5nIGEgd2luZG93IHdob3NlIHNhdmUtdW5kZXJzIGhhcyBub3QgeWV0IGJlZW4gc2V0Ci1vciBoYXMgYmVlbiBpbnZhbGlkYXRlZC4KLS5JUAotU29tZSBWTkMgVmlld2VycyBwcm92aWRlIGJldHRlciByZXNwb25zZSB0aGFuIG90aGVycwotd2l0aCB0aGlzIG9wdGlvbi4gIE9uIFVuaXgsIHJlYWx2bmMgdmlld2VyIGdpdmVzCi1zbW9vdGhlciBkcmFncyB0aGFuIHRpZ2h0dm5jIHZpZXdlci4gIFJlc3BvbnNlIG1heSBhbHNvCi1iZSBjaG9wcHkgaWYgdGhlIHNlcnZlciBzaWRlIG1hY2hpbmUgaXMgdG9vIHNsb3cuCi0uSVAKLVNvbWV0aW1lcyBvbiB2ZXJ5IHNsb3cgbW9kZW0gY29ubmVjdGlvbnMsIHRoaXMgYWN0dWFsbHkKLWdpdmVzIGFuIGltcHJvdmVtZW50IGJlY2F1c2Ugbm8gcGl4ZWwgZGF0YSBhdCBhbGwKLShub3QgZXZlbiB0aGUgYm94IGFuaW1hdGlvbikgaXMgc2VudCBkdXJpbmcgdGhlIGRyYWcuCi0uUFAKLVxmQi1uY2FjaGVfbm9fbW92ZXJhaXNlXGZSCi0uSVAKLUluIFxmQi1uY2FjaGVcZlIgbW9kZSwgZG8gbm90IGFzc3VtZSB0aGF0IG1vdmluZyBhIHdpbmRvdwotd2lsbCBjYXVzZSB0aGUgd2luZG93IG1hbmFnZXIgdG8gcmFpc2UgaXQgdG8gdGhlIHRvcAotb2YgdGhlIHN0YWNrLiAgVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGl0IGRvZXMsIGFuZAotc28gYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkgd2lyZWZyYW1lLCBldGMsIHdpbmRvdyBtb3ZlcwotdGhlIHdpbmRvdyB3aWxsIGJlIHB1c2hlZCB0byB0b3AgaW4gdGhlIFZOQyB2aWV3ZXIuCi0uUFAKLVxmQi1uY2FjaGVfbm9fZHRjaGFuZ2VcZlIKLS5JUAotSW4gXGZCLW5jYWNoZVxmUiBtb2RlLCBkbyBub3QgdHJ5IHRvIGd1ZXNzIHdoZW4gdGhlIGRlc2t0b3AKLSh2aWV3cG9ydCkgY2hhbmdlcyB0byBhbm90aGVyIG9uZSAoaS5lLiBhbm90aGVyCi13b3JrYXJlYSkuICBUaGUgZGVmYXVsdCBpcyB0byB0cnkgdG8gZ3Vlc3MgYW5kIHdoZW4KLWRldGVjdGVkIHRyeSB0byBtYWtlIHRoZSB0cmFuc2lzdGlvbiBtb3JlIHNtb290aGx5LgotLlBQCi1cZkItbmNhY2hlX25vX3Jvb3RwaXhtYXBcZlIKLS5JUAotSW4gXGZCLW5jYWNoZVxmUiBtb2RlLCBkbyBub3QgdHJ5IHRvIHNuYXBzaG90IHRoZSBkZXNrdG9wCi1iYWNrZ3JvdW5kIHRvIHVzZSBpbiBndWVzc2luZyBvciByZWNvbnN0cnVjdGluZyB3aW5kb3cKLXNhdmUtdW5kZXJzLgotLlBQCi1cZkItbmNhY2hlX2tlZXBfYW5pbXNcZlIKLS5JUAotSW4gXGZCLW5jYWNoZVxmUiBtb2RlLCBkbyBub3QgdHJ5IHRvIGRpc2FibGUgd2luZG93Ci1tYW5hZ2VyIGFuaW1hdGlvbnMgYW5kIG90aGVyIGVmZmVjdHMgKHRoYXQgdXN1YWxseQotZGVncmFkZSBuY2FjaGUgcGVyZm9ybWFuY2Ugb3IgY2F1c2UgcGFpbnRpbmcgZXJyb3JzKS4KLVRoZSBkZWZhdWx0IGlzIHRvIHRyeSB0byBkaXNhYmxlIHRoZW0gb24gS0RFIChidXQgbm90Ci1HTk9NRSkgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLgotLklQCi1Gb3Igb3RoZXIgd2luZG93IG1hbmFnZXJzIG9yIGRlc2t0b3BzIHRoYXQgcHJvdmlkZQotYW5pbWF0aW9ucywgZWZmZWN0cywgY29tcG9zaXRpbmcsIHRyYW5zbHVjZW5jeSwKLWV0Yy4gdGhhdCBpbnRlcmZlcmUgd2l0aCB0aGUgXGZCLW5jYWNoZVxmUiBtZXRob2QgeW91IHdpbGwKLWhhdmUgdG8gZGlzYWJsZSB0aGVtIG1hbnVhbGx5LgotLlBQCi1cZkItbmNhY2hlX29sZF93bVxmUgotLklQCi1JbiBcZkItbmNhY2hlXGZSIG1vZGUsIGVuYWJsZSBzb21lIGhldXJpc3RpY3MgZm9yIG9sZCBzdHlsZQotd2luZG93IG1hbmFnZXJzIHN1Y2ggYXMgZnZ3bSBhbmQgdHdtLgotLlBQCi1cZkItbmNhY2hlX3BhZFxmUiBcZkluXGZSCi0uSVAKLUluIFxmQi1uY2FjaGVcZlIgbW9kZSwgcGFkIGVhY2ggd2luZG93IHdpdGggbiBwaXhlbHMgZm9yIHRoZQotY2FjaGluZyByZWN0YW5nbGVzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB0cnkgdG8gaW1wcm92ZQotdGhlIHNpdHVhdGlvbiB3aXRoIGRyb3BzaGFkb3dzIG9yIG90aGVyIGNvbXBvc2l0aW5nCi0oZS5nLiBNYWNPUyBYIHdpbmRvdyBtYW5hZ2VyKSwgYWx0aG91Z2ggaXQgY291bGQgbWFrZQotdGhpbmdzIHdvcnNlLiAgVGhlIGRlZmF1bHQgaXMgMCBvbiBVbml4IGFuZCAyNCBvbgotTWFjT1MgWC4KLS5QUAotXGZCLWRlYnVnX25jYWNoZVxmUgotLklQCi1UdXJuIG9uIGRlYnVnZ2luZyBhbmQgcHJvZmlsaW5nIG91dHB1dCB1bmRlciBcZkItbmNhY2hlLlxmUgotLlBQCi1cZkItd2lyZWZyYW1lXGZSIFxmSVtzdHJdLFxmUiBcZkItbm93aXJlZnJhbWVcZlIKLS5JUAotVHJ5IHRvIGRldGVjdCB3aW5kb3cgbW92ZXMgb3IgcmVzaXplcyB3aGVuIGEgbW91c2UKLWJ1dHRvbiBpcyBoZWxkIGRvd24gYW5kIHNob3cgYSB3aXJlZnJhbWUgaW5zdGVhZCBvZgotdGhlIGZ1bGwgb3BhcXVlIHdpbmRvdy4gIFRoaXMgaXMgYmFzZWQgY29tcGxldGVseSBvbgotaGV1cmlzdGljcyBhbmQgbWF5IG5vdCBhbHdheXMgd29yazogaXQgZGVwZW5kcyBvbiB5b3VyCi13aW5kb3cgbWFuYWdlciBhbmQgZXZlbiBob3cgeW91IG1vdmUgdGhpbmdzIGFyb3VuZC4KLVNlZSBcZkItcG9pbnRlcl9tb2RlXGZSIGJlbG93IGZvciBkaXNjdXNzaW9uIG9mIHRoZSAiYm9nZ2luZwotZG93biIgcHJvYmxlbSB0aGlzIHRyaWVzIHRvIGF2b2lkLgotRGVmYXVsdDogXGZCLXdpcmVmcmFtZVxmUgotLklQCi1TaG9ydGVyIGFsaWFzZXM6ICBcZkItd2ZcZlIgW3N0cl0gIGFuZCBcZkItbm93ZlxmUgotLklQCi1UaGUgdmFsdWUgInN0ciIgaXMgb3B0aW9uYWwgYW5kLCBvZiBjb3Vyc2UsIGlzCi1wYWNrZWQgd2l0aCBtYW55IHR1bmFibGUgcGFyYW1ldGVycyBmb3IgdGhpcyBzY2hlbWU6Ci0uSVAKLUZvcm1hdDogc2hhZGUsbGluZXdpZHRoLHBlcmNlbnQsVCtCK0wrUixtb2QsdDErdDIrdDMrdDQKLURlZmF1bHQ6IDB4ZmYsMiwwLDMyKzgrOCs4LGFsbCwwLjE1KzAuMzArNS4wKzAuMTI1Ci0uSVAKLUlmIHlvdSBsZWF2ZSBub3RoaW5nIGJldHdlZW4gY29tbWFzOiAiLCwiIHRoZSBkZWZhdWx0Ci12YWx1ZSBpcyB1c2VkLiAgSWYgeW91IGRvbid0IHNwZWNpZnkgZW5vdWdoIGNvbW1hcywKLXRoZSB0cmFpbGluZyBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdHMuCi0uSVAKLSJzaGFkZSIgaW5kaWNhdGUgdGhlICJjb2xvciIgZm9yIHRoZSB3aXJlZnJhbWUsCi11c3VhbGx5IGEgZ3JleXNjYWxlOiAwLTI1NSwgaG93ZXZlciBmb3IgMTYgYW5kIDMyYnBwIHlvdQotY2FuIHNwZWNpZnkgYW4gcmdiLnR4dCBYIGNvbG9yIChlLmcuICJkb2RnZXJibHVlIikgb3IKLWEgdmFsdWUgPiAyNTUgaXMgdHJlYXRlZCBhcyBSR0IgKGUuZy4gcmVkIGlzIDB4ZmYwMDAwKS4KLSJsaW5ld2lkdGgiIHNldHMgdGhlIHdpZHRoIG9mIHRoZSB3aXJlZnJhbWUgaW4gcGl4ZWxzLgotInBlcmNlbnQiIGluZGljYXRlcyB0byBub3QgYXBwbHkgdGhlIHdpcmVmcmFtZSBzY2hlbWUKLXRvIHdpbmRvd3Mgd2l0aCBhcmVhIGxlc3MgdGhhbiB0aGlzIHBlcmNlbnQgb2YgdGhlCi1mdWxsIHNjcmVlbi4KLS5JUAotIlQrQitMK1IiIGluZGljYXRlcyBmb3VyIGludGVnZXJzIGZvciBob3cgY2xvc2UgaW4KLXBpeGVscyB0aGUgcG9pbnRlciBoYXMgdG8gYmUgZnJvbSB0aGUgVG9wLCBCb3R0b20sIExlZnQsCi1vciBSaWdodCBlZGdlcyBvZiB0aGUgd2luZG93IHRvIGNvbnNpZGVyIHdpcmVmcmFtaW5nLgotVGhpcyBpcyBhIHNwZWVkdXAgdG8gcXVpY2tseSBleGNsdWRlIGEgd2luZG93IGZyb20gYmVpbmcKLXdpcmVmcmFtZWQ6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkgdGhlIHNwZWVkdXAKLShzY3JvbGxpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IHdpbGwgbGlrZWx5IGJlIHNsb3dlcikuCi0uSVAKLSJtb2QiIHNwZWNpZmllcyBpZiBhIGJ1dHRvbiBkb3duIGV2ZW50IGluIHRoZQotaW50ZXJpb3Igb2YgdGhlIHdpbmRvdyB3aXRoIGEgbW9kaWZpZXIga2V5IChBbHQsIFNoaWZ0LAotZXRjLikgZG93biBzaG91bGQgaW5kaWNhdGUgYSB3aXJlZnJhbWUgb3Bwb3J0dW5pdHkuCi1JdCBjYW4gYmUgIjAiIG9yICJub25lIiB0byBza2lwIGl0LCAiMSIgb3IgImFsbCIKLXRvIGFwcGx5IGl0IHRvIGFueSBtb2RpZmllciwgb3IgIlNoaWZ0IiwgIkFsdCIsCi0iQ29udHJvbCIsICJNZXRhIiwgIlN1cGVyIiwgb3IgIkh5cGVyIiB0byBvbmx5Ci1hcHBseSBmb3IgdGhhdCB0eXBlIG9mIG1vZGlmaWVyIGtleS4KLS5JUAotInQxK3QyK3QzK3Q0IiBzcGVjaWZ5IGZvdXIgZmxvYXRpbmcgcG9pbnQgdGltZXMgaW4KLXNlY29uZHM6IHQxIGlzIGhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBwb2ludGVyIHRvIG1vdmUsCi10MiBpcyBob3cgbG9uZyB0byB3YWl0IGZvciB0aGUgd2luZG93IHRvIHN0YXJ0IG1vdmluZwotb3IgYmVpbmcgcmVzaXplZCAoZm9yIHNvbWUgd2luZG93IG1hbmFnZXJzIHRoaXMgY2FuIGJlCi1yYXRoZXIgbG9uZyksIHQzIGlzIGhvdyBsb25nIHRvIGtlZXAgYSB3aXJlZnJhbWUgbW92aW5nCi1iZWZvcmUgcmVwYWludGluZyB0aGUgd2luZG93LiB0NCBpcyB0aGUgbWluaW11bSB0aW1lCi1iZXR3ZWVuIHNlbmRpbmcgd2lyZWZyYW1lICJhbmltYXRpb25zIi4gIElmIGEgc2xvdwotbGluayBpcyBkZXRlY3RlZCwgdGhlc2UgdmFsdWVzIG1heSBiZSBhdXRvbWF0aWNhbGx5Ci1jaGFuZ2VkIHRvIHNvbWV0aGluZyBiZXR0ZXIgZm9yIGEgc2xvdyBsaW5rLgotLlBQCi1cZkItbm93aXJlZnJhbWVsb2NhbFxmUgotLklQCi1CeSBkZWZhdWx0LCBtb3VzZSBtb3Rpb24gYW5kIGJ1dHRvbiBwcmVzc2VzIG9mIGEKLXVzZXIgc2l0dGluZyBhdCB0aGUgTE9DQUwgZGlzcGxheSBhcmUgbW9uaXRvcmVkIGZvcgotd2lyZWZyYW1pbmcgb3Bwb3J0dW5pdGllcyAoc28gdGhhdCB0aGUgY2hhbmdlcyB3aWxsIGJlCi1zZW50IGVmZmljaWVudGx5IHRvIHRoZSBWTkMgY2xpZW50cykuICBVc2UgdGhpcyBvcHRpb24KLXRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4KLS5QUAotXGZCLXdpcmVjb3B5cmVjdFxmUiBcZkltb2RlLFxmUiBcZkItbm93aXJlY29weXJlY3RcZlIKLS5JUAotU2luY2UgdGhlIFxmQi13aXJlZnJhbWVcZlIgbWVjaGFuaXNtIGV2aWRlbnRseSB0cmFja3MgbW92aW5nCi13aW5kb3dzIGFjY3VyYXRlbHksIGEgc3BlZWR1cCBjYW4gYmUgb2J0YWluZWQgYnkKLXRlbGxpbmcgdGhlIFZOQyB2aWV3ZXJzIHRvIGxvY2FsbHkgY29weSB0aGUgdHJhbnNsYXRlZAotd2luZG93IHJlZ2lvbi4gIFRoaXMgaXMgdGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZzoKLXRoZSBmcmFtZWJ1ZmZlciB1cGRhdGUgZG9lc24ndCBuZWVkIHRvIHNlbmQgdGhlIGFjdHVhbAotbmV3IGltYWdlIGRhdGEuCi0uSVAKLVNob3J0ZXIgYWxpYXNlczogIFxmQi13Y3JcZlIgW21vZGVdICBhbmQgXGZCLW5vd2NyXGZSCi0uSVAKLSJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyBcZkItbm93aXJlY29weXJlY3QpXGZSCi10byBuZXZlciB0cnkgdGhlIGNvcHlyZWN0LCAidG9wIiBtZWFucyBvbmx5IGRvIGl0IGlmCi10aGUgd2luZG93IHdhcyBub3QgY292ZXJlZCBieSBhbnkgb3RoZXIgd2luZG93cywgYW5kCi0iYWx3YXlzIiBtZWFucyB0byB0cmFuc2xhdGUgdGhlIG9yZ2luYWxseSB1bm9ic2N1cmVkCi1yZWdpb24gKHRoaXMgbWF5IGxvb2sgb2RkIGFzIHRoZSByZW1haW5pbmcgcGllY2VzIGNvbWUKLWluLCBidXQgaGVscHMgb24gYSBzbG93IGxpbmspLiAgRGVmYXVsdDogImFsd2F5cyIKLS5JUAotTm90ZTogdGhlcmUgY2FuIGJlIHBhaW50aW5nIGVycm9ycyBvciBzbG93IHJlc3BvbnNlCi13aGVuIHVzaW5nIFxmQi1zY2FsZVxmUiBzbyB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBDb3B5UmVjdAotaW4gdGhpcyBjYXNlICJcZkItd2lyZWNvcHlyZWN0XGZSIFxmSW5ldmVyXGZSIiBvbiB0aGUgY29tbWFuZAotbGluZSBvciBieSByZW1vdGUtY29udHJvbC4gIE9yIHlvdSBjYW4gYWxzbyB1c2UgdGhlCi0iXGZCLXNjYWxlXGZSIFxmSXh4eDpub2NyXGZSIiBzY2FsZSBvcHRpb24uCi0uUFAKLVxmQi1kZWJ1Z193aXJlZnJhbWVcZlIKLS5JUAotVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCBmb3IgdGhlIHdpcmVmcmFtZQotaGV1cmlzdGljcy4gICJcZkItZHdmXGZSIiBpcyBhbiBhbGlhcy4gIFNwZWNpZnkgbXVsdGlwbGUKLXRpbWVzIGZvciBtb3JlIG91dHB1dC4KLS5QUAotXGZCLXNjcm9sbGNvcHlyZWN0XGZSIFxmSW1vZGUsXGZSIFxmQi1ub3Njcm9sbGNvcHlyZWN0XGZSCi0uSVAKLUxpa2UgXGZCLXdpcmVjb3B5cmVjdCxcZlIgYnV0IHVzZSBoZXVyaXN0aWNzIHRvIHRyeSB0byBndWVzcwotaWYgYSB3aW5kb3cgaGFzIHNjcm9sbGVkIGl0cyBjb250ZW50cyAoZWl0aGVyIHZlcnRpY2FsbHkKLW9yIGhvcml6b250YWxseSkuICBUaGlzIHJlcXVpcmVzIHRoZSBSRUNPUkQgWCBleHRlbnNpb24KLXRvICJzbm9vcCIgb24gWCBhcHBsaWNhdGlvbnMgKGN1cnJlbnRseSBmb3IgY2VydGFpbgotWENvcHlBcmVhIGFuZCBYQ29uZmlndXJlV2luZG93IFggcHJvdG9jb2wgcmVxdWVzdHMpLgotRXhhbXBsZXM6IEhpdHRpbmcgPFJldHVybj4gaW4gYSB0ZXJtaW5hbCB3aW5kb3cgd2hlbiB0aGUKLWN1cnNvciB3YXMgYXQgdGhlIGJvdHRvbSwgdGhlIHRleHQgc2Nyb2xscyB1cCBvbmUgbGluZS4KLUhpdHRpbmcgPERvd24+IGFycm93IGluIGEgd2ViIGJyb3dzZXIgd2luZG93LCB0aGUgd2ViCi1wYWdlIHNjcm9sbHMgdXAgYSBzbWFsbCBhbW91bnQuICBPciBzY3JvbGxpbmcgd2l0aCBhCi1zY3JvbGxiYXIgb3IgbW91c2Ugd2hlZWwuCi0uSVAKLVNob3J0ZXIgYWxpYXNlczogIFxmQi1zY3JcZlIgW21vZGVdICBhbmQgXGZCLW5vc2NyXGZSCi0uSVAKLVRoaXMgc2NoZW1lIHdpbGwgbm90IGFsd2F5cyBkZXRlY3Qgc2Nyb2xscywgYnV0IHdoZW4KLWl0IGRvZXMgdGhlcmUgaXMgYSBuaWNlIHNwZWVkdXAgZnJvbSB1c2luZyB0aGUgVk5DCi1Db3B5UmVjdCBlbmNvZGluZyAoc2VlIFxmQi13aXJlY29weXJlY3QpLlxmUiAgVGhlIHNwZWVkdXAKLWlzIGJvdGggaW4gcmVkdWNlZCBuZXR3b3JrIHRyYWZmaWMgYW5kIHJlZHVjZWQgWAotZnJhbWVidWZmZXIgcG9sbGluZy9jb3B5aW5nLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heQotaW5kdWNlIHVuZGVzaXJlZCB0cmFuc2llbnRzIChlLmcuIGEgdGVybWluYWwgY3Vyc29yCi1iZWluZyBzY3JvbGxlZCB1cCB3aGVuIGl0IHNob3VsZCBub3QgYmUpIG9yIG90aGVyCi1wYWludGluZyBlcnJvcnMgKHdpbmRvdyB0ZWFyaW5nLCBidW5jaGluZy11cCwgZXRjKS4KLVRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IHJlcGFpcmVkIGluIGEgc2hvcnQgcGVyaW9kCi1vZiB0aW1lLiAgSWYgdGhpcyBpcyB1bmFjY2VwdGFibGUgZGlzYWJsZSB0aGUgZmVhdHVyZQotd2l0aCBcZkItbm9zY3JvbGxjb3B5cmVjdC5cZlIKLS5JUAotU2NyZWVuIGNsZWFyaW5nIGtsdWRnZXM6ICBmb3IgdGVzdGluZyBhdCBsZWFzdCwgdGhlcmUKLWFyZSBzb21lICJtYWdpYyBrZXkgc2VxdWVuY2VzIiAobXVzdCBiZSBkb25lIGluIGxlc3MKLXRoYW4gMSBzZWNvbmQpIHRvIGFpZCByZXBhaXJpbmcgcGFpbnRpbmcgZXJyb3JzIHRoYXQKLW1heSBiZSBzZWVuIHdoZW4gdXNpbmcgdGhpcyBtb2RlOgotLklQCi0zIEFsdF9MJ3MgICBpbiBhIHJvdzogcmVzZW5kIHdob2xlIHNjcmVlbiwKLTQgQWx0X0wncyAgIGluIGEgcm93OiByZXJlYWQgYW5kIHJlc2VuZCB3aG9sZSBzY3JlZW4sCi0zIFN1cGVyX0wncyBpbiBhIHJvdzogbWFyayB3aG9sZSBzY3JlZW4gZm9yIHBvbGxpbmcsCi00IFN1cGVyX0wncyBpbiBhIHJvdzogcmVzZXQgUkVDT1JEIGNvbnRleHQsCi01IFN1cGVyX0wncyBpbiBhIHJvdzogdHJ5IHRvIHB1c2ggYSBibGFjayBzY3JlZW4KLS5JUAotbm90ZTogQWx0X0wgaXMgdGhlIExlZnQgIkFsdCIga2V5IChhIHNpbmdsZSBrZXkpCi1TdXBlcl9MIGlzIHRoZSBMZWZ0ICJTdXBlciIga2V5IChXaW5kb3dzIGZsYWcpLgotQm90aCBvZiB0aGVzZSBhcmUgbW9kaWZpZXIga2V5cywgYW5kIHNvIHNob3VsZCBub3QKLWdlbmVyYXRlIGNoYXJhY3RlcnMgd2hlbiBwcmVzc2VkIGJ5IHRoZW1zZWx2ZXMuICBBbHNvLAoteW91ciBWTkMgdmlld2VyIG1heSBoYXZlIGl0cyBvd24gcmVmcmVzaCBob3Qta2V5Ci1vciBidXR0b24uCi0uSVAKLSJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyBcZkItbm9zY3JvbGxjb3B5cmVjdClcZlIKLXRvIG5ldmVyIHRyeSB0aGUgY29weXJlY3QsICJrZXlzIiBtZWFucyB0byB0cnkgaXQKLWluIHJlc3BvbnNlIHRvIGtleXN0cm9rZXMgb25seSwgIm1vdXNlIiBtZWFucyB0bwotdHJ5IGl0IGluIHJlc3BvbnNlIHRvIG1vdXNlIGV2ZW50cyBvbmx5LCAiYWx3YXlzIgotbWVhbnMgdG8gZG8gYm90aC4gRGVmYXVsdDogImFsd2F5cyIKLS5JUAotTm90ZTogdGhlcmUgY2FuIGJlIHBhaW50aW5nIGVycm9ycyBvciBzbG93IHJlc3BvbnNlCi13aGVuIHVzaW5nIFxmQi1zY2FsZVxmUiBzbyB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBDb3B5UmVjdAotaW4gdGhpcyBjYXNlICJcZkItc2Nyb2xsY29weXJlY3RcZlIgXGZJbmV2ZXJcZlIiIG9uIHRoZSBjb21tYW5kCi1saW5lIG9yIGJ5IHJlbW90ZS1jb250cm9sLiAgT3IgeW91IGNhbiBhbHNvIHVzZSB0aGUKLSJcZkItc2NhbGVcZlIgXGZJeHh4Om5vY3JcZlIiIHNjYWxlIG9wdGlvbi4KLS5QUAotXGZCLXNjcl9hcmVhXGZSIFxmSW5cZlIKLS5JUAotU2V0IHRoZSBtaW5pbXVtIGFyZWEgaW4gcGl4ZWxzIGZvciBhIHJlY3RhbmdsZQotdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIFxmQi1zY3JvbGxjb3B5cmVjdFxmUiBkZXRlY3Rpb24KLXNjaGVtZS4gIFRoaXMgaXMgdG8gYXZvaWQgd2FzdGluZyB0aGUgZWZmb3J0IG9uIHNtYWxsCi1yZWN0YW5nbGVzIHRoYXQgd291bGQgYmUgcXVpY2tseSB1cGRhdGVkIHRoZSBub3JtYWwgd2F5LgotRS5nLiBzdXBwb3NlIGFuIGFwcCB1cGRhdGVkIHRoZSBwb3NpdGlvbiBvZiBpdHMgc2tpbm55Ci1zY3JvbGxiYXIgZmlyc3QgYW5kIHRoZW4gc2hpZnRlZCB0aGUgbGFyZ2UgcGFuZWwKLWl0IGNvbnRyb2xsZWQuICBXZSB3YW50IHRvIGJlIHN1cmUgdG8gc2tpcCB0aGUgc21hbGwKLXNjcm9sbGJhciBhbmQgZ2V0IHRoZSBsYXJnZSBwYW5lbC4gRGVmYXVsdDogNjAwMDAKLS5QUAotXGZCLXNjcl9za2lwXGZSIFxmSWxpc3RcZlIKLS5JUAotU2tpcCBzY3JvbGwgZGV0ZWN0aW9uIGZvciBhcHBsaWNhdGlvbnMgbWF0Y2hpbmcKLXRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIGluIFxmSWxpc3RcZlIuCi1Tb21lIGFwcGxpY2F0aW9ucyBpbXBsZW1lbnQgdGhlaXIgc2Nyb2xsaW5nIGluCi1zdHJhbmdlIHdheXMgd2hlcmUgdGhlIFhDb3B5QXJlYSwgZXRjLCBhbHNvIGFwcGxpZXMKLXRvIGludmlzaWJsZSBwb3J0aW9ucyBvZiB0aGUgd2luZG93OiBpZiB3ZSBDb3B5UmVjdAotdGhvc2UgYXJlYXMgaXQgbG9va3MgYXdmdWwgZHVyaW5nIHRoZSBzY3JvbGwgYW5kCi10aGVyZSBtYXkgYmUgcGFpbnRpbmcgZXJyb3JzIGxlZnQgYWZ0ZXIgdGhlIHNjcm9sbC4KLVNvZmZpY2UuYmluIGlzIHRoZSB3b3JzdCBrbm93biBvZmZlbmRlci4KLS5JUAotVXNlICIjIyIgdG8gZGVub3RlIHRoZSBzdGFydCBvZiB0aGUgYXBwbGljYXRpb24gY2xhc3MKLShlLmcuICIjI1hUZXJtIikgYW5kICIrKyIgdG8gZGVub3RlIHRoZSBzdGFydAotb2YgdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlIG5hbWUgKGUuZy4gIisreHRlcm0iKS4KLVRoZSBzdHJpbmcgeW91ciBsaXN0IGlzIG1hdGNoZWQgYWdhaW5zdCBpcyBvZiB0aGUgZm9ybQotIl5eV01fTkFNRSMjQ2xhc3MrK0luc3RhbmNlPHNhbWUtZm9yLWFueS1zdWJ3aW5kb3dzPiIKLVRoZSAieGxzY2xpZW50cyBcZkItbGEiXGZSIGNvbW1hbmQgd2lsbCBwcm92aWRlIHRoaXMgaW5mby4KLS5JUAotSWYgYSBwYXR0ZXJuIGlzIHByZWZpeGVkIHdpdGggIktFWToiIGl0IG9ubHkgYXBwbGllcwotdG8gS2V5c3Ryb2tlIGdlbmVyYXRlZCBzY3JvbGxzIChlLmcuIFVwIGFycm93KS4gIElmIGl0Ci1pcyBwcmVmaXhlZCB3aXRoICJNT1VTRToiIGl0IG9ubHkgYXBwbGllcyB0byBNb3VzZQotaW5kdWNlZCBzY3JvbGxzIChlLmcuIGRyYWdnaW5nIG9uIGEgc2Nyb2xsYmFyKS4KLURlZmF1bHQ6ICMjU29mZmljZS5iaW4sIyNTdGFyT2ZmaWNlLCMjT3Blbk9mZmljZQotLlBQCi1cZkItc2NyX2luY1xmUiBcZklsaXN0XGZSCi0uSVAKLU9wcG9zaXRlIG9mIFxmQi1zY3Jfc2tpcDpcZlIgdGhpcyBsaXN0IGlzIGNvbnN1bHRlZCBmaXJzdAotYW5kIGlmIHRoZXJlIGlzIGEgbWF0Y2ggdGhlIHdpbmRvdyB3aWxsIGJlIG1vbml0b3JlZAotdmlhIFJFQ09SRCBmb3Igc2Nyb2xscyBpcnJlc3BlY3RpdmUgb2YgXGZCLXNjcl9za2lwLlxmUgotVXNlIFxmQi1zY3Jfc2tpcFxmUiAnKicgdG8gc2tpcCBhbnl0aGluZyB0aGF0IGRvZXMgbm90IG1hdGNoCi15b3VyIFxmQi1zY3JfaW5jLlxmUiAgVXNlIFxmQi1zY3JfaW5jXGZSICcqJyB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcuCi0uUFAKLVxmQi1zY3Jfa2V5c1xmUiBcZklsaXN0XGZSCi0uSVAKLUZvciBrZXlzdHJva2Ugc2Nyb2xsIGRldGVjdGlvbiwgb25seSBhcHBseSB0aGUgUkVDT1JECi1oZXVyaXN0aWNzIHRvIHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBrZXlzeW1zIGluCi1cZklsaXN0XGZSLiAgWW91IG1heSBmaW5kIHRoZSBSRUNPUkQgb3ZlcmhlYWQgZm9yIGV2ZXJ5Ci1vbmUgb2YgeW91ciBrZXlzdHJva2VzIGRpc3J1cHRzIHR5cGluZyB0b28gbXVjaCwgYnV0IHlvdQotZG9uJ3Qgd2FudCB0byB0dXJuIGl0IG9mZiBjb21wbGV0ZWx5IHdpdGggIlxmQi1zY3JcZlIgXGZJbW91c2VcZlIiCi1hbmQgXGZCLXNjcl9wYXJtc1xmUiBkb2VzIG5vdCB3b3JrIG9yIGlzIHRvbyBjb25mdXNpbmcuCi0uSVAKLVRoZSBsaXN0ZWQga2V5c3ltcyBjYW4gYmUgbnVtZXJpYyBvciB0aGUga2V5c3ltCi1uYW1lcyBpbiB0aGUgPFgxMS9rZXlzeW1kZWYuaD4gaGVhZGVyIGZpbGUgb3IgZnJvbSB0aGUKLS5JUiB4ZXYgKDEpCi1wcm9ncmFtLiAgRXhhbXBsZTogIlxmQi1zY3Jfa2V5c1xmUiBcZklVcCxEb3duLFJldHVyblxmUiIuCi1PbmUgcHJvYmFibHkgd2FudHMgdG8gaGF2ZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBsaXN0cwotKGUuZy4gZm9yIHRlcm1pbmFscywgZXRjKSBidXQgdGhhdCBpcyB0b28gaWNreSB0byB0aGluawotYWJvdXQgZm9yIG5vdy4uLgotLklQCi1JZiBcZklsaXN0XGZSIGJlZ2lucyB3aXRoIHRoZSAiLSIgY2hhcmFjdGVyIHRoZSBsaXN0Ci1pcyB0YWtlbiBhcyBhbiBleGNsdWRlIGxpc3Q6IGFsbCBrZXlzeW1zIGV4Y2VwdCB0aG9zZQotbGlzdCB3aWxsIGJlIGNvbnNpZGVyZWQuICBUaGUgc3BlY2lhbCBzdHJpbmcgImJ1aWx0aW4iCi1leHBhbmRzIHRvIGFuIGludGVybmFsIGxpc3Qgb2Yga2V5c3ltcyB0aGF0IGFyZSBsaWtlbHkKLXRvIGNhdXNlIHNjcm9sbHMuICBCVFcsIGJ5IGRlZmF1bHQgbW9kaWZpZXIga2V5cywKLVNoaWZ0X0wsIENvbnRyb2xfUiwgZXRjLCBhcmUgc2tpcHBlZCBzaW5jZSB0aGV5IGFsbW9zdAotbmV2ZXIgaW5kdWNlIHNjcm9sbGluZyBieSB0aGVtc2VsdmVzLgotLlBQCi1cZkItc2NyX3Rlcm1cZlIgXGZJbGlzdFxmUgotLklQCi1ZZXQgYW5vdGhlciBjb3NtZXRpYyBrbHVkZ2UuICBBcHBseSBzaGVsbC90ZXJtaW5hbAotaGV1cmlzdGljcyB0byBhcHBsaWNhdGlvbnMgbWF0Y2hpbmcgY29tbWEgc2VwYXJhdGVkCi1saXN0IChzYW1lIGFzIGZvciBcZkItc2NyX3NraXAvLXNjcl9pbmMpLlxmUiAgRm9yIGV4YW1wbGUgYW4KLWFubm95aW5nIHRyYW5zaWVudCB1bmRlciBzY3JvbGwgZGV0ZWN0aW9uIGlzIGlmIHlvdQotaGl0IEVudGVyIGluIGEgdGVybWluYWwgc2hlbGwgd2l0aCBmdWxsIHRleHQgd2luZG93LAotdGhlIHNvbGlkIHRleHQgY3Vyc29yIGJsb2NrIHdpbGwgYmUgc2Nyb2xsZWQgdXAuCi1TbyBmb3IgYSBzaG9ydCB0aW1lIHRoZXJlIGFyZSB0d28gKG9yIG1vcmUpIGJsb2NrCi1jdXJzb3JzIG9uIHRoZSBzY3JlZW4uICBUaGVyZSBhcmUgc2ltaWxhciBzY2VuYXJpb3MsCi0oZS5nLiBhbiBvdXRwdXQgbGluZSBpcyBkdXBsaWNhdGVkKS4KLS5JUAotVGhlc2UgdHJhbnNpZW50cyBhcmUgaW5kdWNlZCBieSB0aGUgYXBwcm94aW1hdGlvbiBvZgotc2Nyb2xsIGRldGVjdGlvbiAoZS5nLiBpdCBkZXRlY3RzIHRoZSBzY3JvbGwsIGJ1dCBub3QKLXRoZSBmYWN0IHRoYXQgdGhlIGJsb2NrIGN1cnNvciB3YXMgY2xlYXJlZCBqdXN0IGJlZm9yZQotdGhlIHNjcm9sbCkuICBJbiBuZWFybHkgYWxsIGNhc2VzIHRoZXNlIHRyYW5zaWVudCBlcnJvcnMKLWFyZSByZXBhaXJlZCB3aGVuIHRoZSB0cnVlIFggZnJhbWVidWZmZXIgaXMgY29uc3VsdGVkCi1ieSB0aGUgbm9ybWFsIHBvbGxpbmcuICBCdXQgdGhleSBhcmUgZGlzdHJhY3RpbmcsIHNvCi13aGF0IHRoaXMgb3B0aW9uIHByb3ZpZGVzIGlzIGV4dHJhICJwYWRkaW5nIiBuZWFyIHRoZQotYm90dG9tIG9mIHRoZSB0ZXJtaW5hbCB3aW5kb3c6IGEgZmV3IGV4dHJhIGxpbmVzIG5lYXIKLXRoZSBib3R0b20gd2lsbCBub3QgYmUgc2Nyb2xsZWQsIGJ1dCByYXRoZXIgdXBkYXRlZAotZnJvbSB0aGUgYWN0dWFsIFggZnJhbWVidWZmZXIuICBUaGlzIHVzdWFsbHkgcmVkdWNlcwotdGhlIGFubm95aW5nIGFydGlmYWN0cy4gIFVzZSAibm9uZSIgdG8gZGlzYWJsZS4KLURlZmF1bHQ6ICJ0ZXJtIgotLlBQCi1cZkItc2NyX2tleXJlcGVhdFxmUiBcZklsby1oaVxmUgotLklQCi1JZiBhIGtleSBpcyBoZWxkIGRvd24gKG9yIG90aGVyd2lzZSByZXBlYXRzIHJhcGlkbHkpIGFuZAotdGhpcyBpbmR1Y2VzIGEgcmFwaWQgc2VxdWVuY2Ugb2Ygc2Nyb2xscyAoZS5nLiBob2xkaW5nCi1kb3duIGFuIEFycm93IGtleSkgdGhlICJzY3JvbGxjb3B5cmVjdCIgZGV0ZWN0aW9uCi1hbmQgb3ZlcmhlYWQgbWF5IG5vdCBiZSBhYmxlIHRvIGtlZXAgdXAuICBBIHRpbWUgcGVyCi1zaW5nbGUgc2Nyb2xsIGVzdGltYXRlIGlzIHBlcmZvcm1lZCBhbmQgaWYgdGhhdCBlc3RpbWF0ZQotcHJlZGljdHMgYSBzdXN0YWluYWJsZSBzY3JvbGxyYXRlIG9mIGtleXMgcGVyIHNlY29uZAotYmV0d2VlbiAibG8iIGFuZCAiaGkiIHRoZW4gcmVwZWF0ZWQga2V5cyB3aWxsIGJlCi1ESVNDQVJERUQgdG8gbWFpbnRhaW4gdGhlIHNjcm9sbHJhdGUuIEZvciBleGFtcGxlIHlvdXIKLWtleSBhdXRvcmVwZWF0IG1heSBiZSAyNSBrZXlzL3NlYywgYnV0IGZvciBhIGxhcmdlCi13aW5kb3cgb3Igc2xvdyBsaW5rIG9ubHkgOCBzY3JvbGxzIHBlciBzZWNvbmQgY2FuIGJlCi1zdXN0YWluZWQsIHRoZW4gcm91Z2hseSAyIG91dCBvZiBldmVyeSAzIHJlcGVhdGVkIGtleXMKLXdpbGwgYmUgZGlzY2FyZGVkIGR1cmluZyB0aGlzIHBlcmlvZC4gRGVmYXVsdDogIjQtMjAiCi0uUFAKLVxmQi1zY3JfcGFybXNcZlIgXGZJc3RyaW5nXGZSCi0uSVAKLVNldCB2YXJpb3VzIHBhcmFtZXRlcnMgZm9yIHRoZSBzY3JvbGxjb3B5cmVjdCBtb2RlLgotVGhlIGZvcm1hdCBpcyBzaW1pbGFyIHRvIHRoYXQgZm9yIFxmQi13aXJlZnJhbWVcZlIgYW5kIHBhY2tlZAotd2l0aCBsb3RzIG9mIHBhcmFtZXRlcnM6Ci0uSVAKLUZvcm1hdDogVCtCK0wrUix0MSt0Mit0MyxzMStzMitzMytzNCtzNQotRGVmYXVsdDogMCs2NCszMiszMiwwLjAyKzAuMTArMC45LDAuMDMrMC4wNiswLjUrMC4xKzUuMAotLklQCi1JZiB5b3UgbGVhdmUgbm90aGluZyBiZXR3ZWVuIGNvbW1hczogIiwsIiB0aGUgZGVmYXVsdAotdmFsdWUgaXMgdXNlZC4gIElmIHlvdSBkb24ndCBzcGVjaWZ5IGVub3VnaCBjb21tYXMsCi10aGUgdHJhaWxpbmcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHRzLgotLklQCi0iVCtCK0wrUiIgaW5kaWNhdGVzIGZvdXIgaW50ZWdlcnMgZm9yIGhvdyBjbG9zZSBpbgotcGl4ZWxzIHRoZSBwb2ludGVyIGhhcyB0byBiZSBmcm9tIHRoZSBUb3AsIEJvdHRvbSwgTGVmdCwKLW9yIFJpZ2h0IGVkZ2VzIG9mIHRoZSB3aW5kb3cgdG8gY29uc2lkZXIgc2Nyb2xsY29weXJlY3QuCi1JZiBcZkItd2lyZWZyYW1lXGZSIG92ZXJsYXBzIGl0IHRha2VzIHByZWNlZGVuY2UuICBUaGlzIGlzIGEKLXNwZWVkdXAgdG8gcXVpY2tseSBleGNsdWRlIGEgd2luZG93IGZyb20gYmVpbmcgd2F0Y2hlZAotZm9yIHNjcm9sbGNvcHlyZWN0OiBzZXQgdGhlbSBhbGwgdG8gemVybyB0byBub3QgdHJ5Ci10aGUgc3BlZWR1cCAodGhpbmdzIGxpa2Ugc2VsZWN0aW5nIHRleHQgd2lsbCBsaWtlbHkKLWJlIHNsb3dlcikuCi0uSVAKLSJ0MSt0Mit0MyIgc3BlY2lmeSB0aHJlZSBmbG9hdGluZyBwb2ludCB0aW1lcyBpbgotc2Vjb25kcyB0aGF0IGFwcGx5IHRvIHNjcm9sbGNvcHlyZWN0IGRldGVjdGlvbiB3aXRoCi0qS2V5c3Ryb2tlKiBpbnB1dDogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciBhIGtleQotaXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHNjcm9sbCwgdDIgaXMgaG93IGxvbmcgdG8ga2VlcAotbG9va2luZyBhZnRlciBhIEtleXN0cm9rZSBzY3JvbGwgZm9yIG1vcmUgc2Nyb2xscy4KLXQzIGlzIGhvdyBmcmVxdWVudGx5IHRvIHRyeSB0byB1cGRhdGUgc3Vycm91bmRpbmcKLXNjcm9sbGJhcnMgb3V0c2lkZSBvZiB0aGUgc2Nyb2xsaW5nIGFyZWEgKDAuMCB0bwotZGlzYWJsZSkKLS5JUAotInMxK3MyK3MzK3M0K3M1IiBzcGVjaWZ5IGZpdmUgZmxvYXRpbmcgcG9pbnQgdGltZXMKLWluIHNlY29uZHMgdGhhdCBhcHBseSB0byBzY3JvbGxjb3B5cmVjdCBkZXRlY3Rpb24gd2l0aAotKk1vdXNlKiBpbnB1dDogczEgaXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciBhIG1vdXNlCi1idXR0b24gaXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHNjcm9sbCwgczIgaXMgaG93IGxvbmcKLXRvIGtlZXAgd2FpdGluZyBmb3IgYWRkaXRpb25hbCBzY3JvbGxzIGFmdGVyIHRoZSBmaXJzdAotTW91c2Ugc2Nyb2xsIHdhcyBkZXRlY3RlZC4gIHMzIGlzIGhvdyBmcmVxdWVudGx5IHRvCi10cnkgdG8gdXBkYXRlIHN1cnJvdW5kaW5nIHNjcm9sbGJhcnMgb3V0c2lkZSBvZiB0aGUKLXNjcm9sbGluZyBhcmVhICgwLjAgdG8gZGlzYWJsZSkuICBzNCBpcyBob3cgbG9uZyB0bwotYnVmZmVyIHBvaW50ZXIgbW90aW9uICh0byB0cnkgdG8gZ2V0IGZld2VyLCBiaWdnZXIKLW1vdXNlIHNjcm9sbHMpLiBzNSBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHNwZW5kIGp1c3QKLXVwZGF0aW5nIHRoZSBzY3JvbGwgd2luZG93IHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlc3QKLW9mIHRoZSBzY3JlZW4uCi0uUFAKLVxmQi1maXhzY3JlZW5cZlIgXGZJc3RyaW5nXGZSCi0uSVAKLVBlcmlvZGljYWxseSAicmVwYWlyIiB0aGUgc2NyZWVuIGJhc2VkIG9uIHNldHRpbmdzCi1pbiBcZklzdHJpbmdcZlIuICBIb3BlZnVsbHkgeW91IHdvbid0IG5lZWQgdGhpcyBvcHRpb24sCi1pdCBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlbiB0aGUgXGZCLXNjcm9sbGNvcHlyZWN0XGZSIG9yCi1cZkItd2lyZWNvcHlyZWN0XGZSIGZlYXR1cmVzIGxlYXZlIHRvbyBtYW55IHBhaW50aW5nIGVycm9ycywKLWJ1dCBpdCBjYW4gYmUgdXNlZCBmb3IgYW55IHNjZW5hcmlvLiAgVGhpcyBvcHRpb24KLXBlcmlvZGljYWxseSBwZXJmb3JtcyBjb3N0bHkgb3BlcmF0aW9ucyBhbmQgc28KLWludGVyYWN0aXZlIHJlc3BvbnNlIG1heSBiZSByZWR1Y2VkIHdoZW4gaXQgaXMgb24uCi1Zb3UgY2FuIHVzZSAzIEFsdF9MJ3MgKHRoZSBMZWZ0ICJBbHQiIGtleSkgdGFwcyBpbgotYSByb3cgKGFzIGRlc2NyaWJlZCB1bmRlciBcZkItc2Nyb2xsY29weXJlY3QpXGZSIGluc3RlYWQgdG8KLW1hbnVhbGx5IHJlcXVlc3QgYSBzY3JlZW4gcmVwYWludCB3aGVuIGl0IGlzIG5lZWRlZC4KLS5JUAotXGZJc3RyaW5nXGZSIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgb2YKLXRoZSBmb2xsb3dpbmc6ICJWPXQiLCAiQz10IiwgIlg9dCIsIGFuZCAiOD10Ii4KLUluIHRoZXNlICJ0IiBzdGFuZHMgZm9yIGEgdGltZSBpbiBzZWNvbmRzIChpdCBpcwotYSBmbG9hdGluZyBwb2ludCBldmVuIHRob3VnaCBvbmUgc2hvdWxkIHVzdWFsbHkgdXNlCi12YWx1ZXMgPiAyIHRvIGF2b2lkIHdhc3RpbmcgcmVzb3VyY2VzKS4gIFYgc2V0cyBob3cKLWZyZXF1ZW50bHkgdGhlIGVudGlyZSBzY3JlZW4gc2hvdWxkIGJlIHNlbnQgdG8gdmlld2VycwotKGl0IGlzIGxpa2UgdGhlIDMgQWx0X0wncykuICBDIHNldHMgaG93IGxvbmcgdG8gd2FpdAotYWZ0ZXIgYSBDb3B5UmVjdCB0byByZXBhaW50IHRoZSBmdWxsIHNjcmVlbi4gIFggc2V0cwotaG93IGZyZXF1ZW50bHkgdG8gcmVyZWFkIHRoZSBmdWxsIFgxMSBmcmFtZWJ1ZmZlciBmcm9tCi10aGUgWCBzZXJ2ZXIgYW5kIHB1c2ggaXQgb3V0IHRvIGNvbm5lY3RlZCB2aWV3ZXJzLgotVXNlIG9mIFggc2hvdWxkIGJlIHJhcmUsIHBsZWFzZSByZXBvcnQgYSBidWcgaWYgeW91Ci1maW5kIHlvdSBuZWVkIGl0LiA4PSBhcHBsaWVzIG9ubHkgZm9yIFxmQi04dG8yNFxmUiBtb2RlOiBpdAotc2V0cyBob3cgb2Z0ZW4gdGhlIG5vbi1kZWZhdWx0IHZpc3VhbCByZWdpb25zIG9mIHRoZQotc2NyZWVuIChlLmcuIDhicHAgd2luZG93cykgYXJlIHJlZnJlc2hlZC4gIEV4YW1wbGVzOgotXGZCLWZpeHNjcmVlblxmUiBWPTEwIFxmQi1maXhzY3JlZW5cZlIgQz0xMAotLlBQCi1cZkItZGVidWdfc2Nyb2xsXGZSCi0uSVAKLVR1cm4gb24gZGVidWdnaW5nIGluZm8gcHJpbnRvdXQgZm9yIHRoZSBzY3JvbGwKLWhldXJpc3RpY3MuICAiXGZCLWRzXGZSIiBpcyBhbiBhbGlhcy4gIFNwZWNpZnkgaXQgbXVsdGlwbGUKLXRpbWVzIGZvciBtb3JlIG91dHB1dC4KLS5QUAotXGZCLW5veHJlY29yZFxmUgotLklQCi1EaXNhYmxlIGFueSB1c2Ugb2YgdGhlIFJFQ09SRCBleHRlbnNpb24uICBUaGlzIGlzCi1jdXJyZW50bHkgdXNlZCBieSB0aGUgXGZCLXNjcm9sbGNvcHlyZWN0XGZSIHNjaGVtZSBhbmQgdG8KLW1vbml0b3IgWCBzZXJ2ZXIgZ3JhYnMuCi0uUFAKLVxmQi1ncmFiX2J1c3RlcixcZlIgXGZCLW5vZ3JhYl9idXN0ZXJcZlIKLS5JUAotU29tZSBvZiB0aGUgdXNlIG9mIHRoZSBSRUNPUkQgZXh0ZW5zaW9uIGNhbiBsZWF2ZSBhCi10aW55IHdpbmRvdyBmb3IgWEdyYWJTZXJ2ZXIgZGVhZGxvY2suICBUaGlzIGlzIG9ubHkgaWYKLXRoZSB3aG9sZS1zZXJ2ZXIgZ3JhYmJpbmcgYXBwbGljYXRpb24gZXhwZWN0cyBtb3VzZSBvcgota2V5Ym9hcmQgaW5wdXQgYmVmb3JlIHJlbGVhc2luZyB0aGUgZ3JhYi4gIEl0IGlzIHVzdWFsbHkKLWEgd2luZG93IG1hbmFnZXIgdGhhdCBkb2VzIHRoaXMuICB4MTF2bmMgdGFrZXMgY2FyZSB0bwotYXZvaWQgdGhlIHByb2JsZW0sIGJ1dCBpZiBjYXVnaHQgeDExdm5jIHdpbGwgZnJlZXplLgotV2l0aG91dCBcZkItZ3JhYl9idXN0ZXIsXGZSIHRoZSBvbmx5IHNvbHV0aW9uIGlzIHRvIGdvIHRoZQotcGh5c2ljYWwgZGlzcGxheSBhbmQgZ2l2ZSBpdCBzb21lIGlucHV0IHRvIHNhdGlzZnkgdGhlCi1ncmFiYmluZyBhcHAuICBPciBtYW51YWxseSBraWxsIGFuZCByZXN0YXJ0IHRoZSB3aW5kb3cKLW1hbmFnZXIgaWYgdGhhdCBpcyBmZWFzaWJsZS4gIFdpdGggXGZCLWdyYWJfYnVzdGVyLFxmUiB4MTF2bmMKLXdpbGwgZm9yayBhIGhlbHBlciB0aHJlYWQgYW5kIGlmIHgxMXZuYyBhcHBlYXJzIHRvIGJlCi1zdHVjayBpbiBhIGdyYWIgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZSAoMjAtMzAgc2VjKSB0aGVuCi1pdCB3aWxsIGluamVjdCBzb21lIHVzZXIgaW5wdXQ6IGJ1dHRvbiBjbGlja3MsIEVzY2FwZSwKLW1vdXNlIG1vdGlvbiwgZXRjIHRvIHRyeSB0byBicmVhayB0aGUgZ3JhYi4gIElmIHlvdQotZXhwZXJpZW5jZSBhIGxvdCBvZiBncmFiIGRlYWRsb2NrLCBwbGVhc2UgcmVwb3J0IGEgYnVnLgotLlBQCi1cZkItZGVidWdfZ3JhYnNcZlIKLS5JUAotVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCB3aXRoIHJlc3BlY3QgdG8KLVhHcmFiU2VydmVyKCkgZGVhZGxvY2sgZm9yIFxmQi1zY3JvbGxjb3B5cmVjdF9fbW9kZV8uXGZSCi0uUFAKLVxmQi1kZWJ1Z19zZWxcZlIKLS5JUAotVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCB3aXRoIHJlc3BlY3QgdG8KLVBSSU1BUlksIENMSVBCT0FSRCwgYW5kIENVVEJVRkZFUjAgc2VsZWN0aW9ucy4KLS5QUAotXGZCLXBvaW50ZXJfbW9kZVxmUiBcZkluXGZSCi0uSVAKLVZhcmlvdXMgcG9pbnRlciBtb3Rpb24gdXBkYXRlIHNjaGVtZXMuICJcZkItcG1cZlIiIGlzCi1hbiBhbGlhcy4gIFRoZSBwcm9ibGVtIGlzIHBvaW50ZXIgbW90aW9uIGNhbiBjYXVzZQotcmFwaWQgY2hhbmdlcyBvbiB0aGUgc2NyZWVuOiBjb25zaWRlciB0aGUgcmFwaWQKLWNoYW5nZXMgd2hlbiB5b3UgZHJhZyBhIGxhcmdlIHdpbmRvdyBhcm91bmQgb3BhcXVlbHkuCi1OZWl0aGVyIHgxMXZuYydzIHNjcmVlbiBwb2xsaW5nIGFuZCB2bmMgY29tcHJlc3Npb24KLXJvdXRpbmVzIG5vciB0aGUgYmFuZHdpZHRoIHRvIHRoZSB2bmN2aWV3ZXJzIGNhbiBrZWVwCi11cCB0aGVzZSByYXBpZCBzY3JlZW4gY2hhbmdlczogZXZlcnl0aGluZyB3aWxsIGJvZyBkb3duCi13aGVuIGRyYWdnaW5nIG9yIHNjcm9sbGluZy4gIFNvIGEgc2NoZW1lIGhhcyB0byBiZSB1c2VkCi10byAiZWF0IiBtdWNoIG9mIHRoYXQgcG9pbnRlciBpbnB1dCBiZWZvcmUgcmUtcG9sbGluZwotdGhlIHNjcmVlbiBhbmQgc2VuZGluZyBvdXQgZnJhbWVidWZmZXIgdXBkYXRlcy4gVGhlCi1tb2RlIG51bWJlciBcZkluXGZSIGNhbiBiZSAwIHRvIDQgYW5kIHNlbGVjdHMgb25lIG9mCi10aGUgc2NoZW1lcyBkZXNyaWJlZCBiZWxvdy4KLS5JUAotTm90ZSB0aGF0IHRoZSBcZkItd2lyZWZyYW1lXGZSIGFuZCBcZkItc2Nyb2xsY29weXJlY3RfX21vZGVfc1xmUgotY29tcGxlbWVudCBcZkItcG9pbnRlcl9tb2RlXGZSIGJ5IGRldGVjdGluZyAoYW5kIGltcHJvdmluZykKLWNlcnRhaW4gcGVyaW9kcyBvZiAicmFwaWQgc2NyZWVuIGNoYW5nZSIuCi0uSVAKLW49MDogZG9lcyB0aGUgc2FtZSBhcyBcZkItbm9kcmFnZ2luZy5cZlIgKGFsbCBzY3JlZW4gcG9sbGluZwotaXMgc3VzcGVuZGVkIGlmIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQuKQotLklQCi1uPTE6IHdhcyB0aGUgb3JpZ2luYWwgc2NoZW1lIHVzZWQgdG8gYWJvdXQgSmFuIDIwMDQ6Ci1pdCBiYXNpY2FsbHkganVzdCBza2lwcyBcZkItaW5wdXRfc2tpcFxmUiBrZXlib2FyZCBvciBwb2ludGVyCi1ldmVudHMgYmVmb3JlIHJlcG9sbGluZyB0aGUgc2NyZWVuLgotLklQCi1uPTIgaXMgYW4gaW1wcm92ZWQgc2NoZW1lOiBieSB3YXRjaGluZyB0aGUgY3VycmVudCByYXRlCi1vZiBpbnB1dCBldmVudHMgaXQgdHJpZXMgdG8gZGV0ZWN0IGlmIGl0IHNob3VsZCB0cnkgdG8KLSJlYXQiIGFkZGl0aW9uYWwgcG9pbnRlciBldmVudHMgYmVmb3JlIGNvbnRpbnVpbmcuCi0uSVAKLW49MyBpcyBiYXNpY2FsbHkgYSBkeW5hbWljIFxmQi1ub2RyYWdnaW5nXGZSIG1vZGU6IGl0IGRldGVjdHMKLXdoZW4gdGhlIG1vdXNlIG1vdGlvbiBoYXMgcGF1c2VkIGFuZCB0aGVuIHJlZnJlc2hlcwotdGhlIGRpc3BsYXkuCi0uSVAKLW49NCBhdHRlbXB0cyB0byBtZWFzdXJlcyBuZXR3b3JrIHJhdGVzIGFuZCBsYXRlbmN5LAotdGhlIHZpZGVvIGNhcmQgcmVhZCByYXRlLCBhbmQgaG93IG1hbnkgdGlsZXMgaGF2ZSBiZWVuCi1jaGFuZ2VkIG9uIHRoZSBzY3JlZW4uICBGcm9tIHRoaXMsIGl0IGFnZ3Jlc3NpdmVseSB0cmllcwotdG8gcHVzaCBzY3JlZW4gImZyYW1lcyIgd2hlbiBpdCBkZWNpZGVzIGl0IGhhcyBlbm91Z2gKLXJlc291cmNlcyB0byBkbyBzby4gIE5PVCBGSU5JU0hFRC4KLS5JUAotVGhlIGRlZmF1bHQgbiBpcyAyLiBOb3RlIHRoYXQgbW9kZXMgMiwgMywgNCB3aWxsIHNraXAKLVxmQi1pbnB1dF9za2lwXGZSIGtleWJvYXJkIGV2ZW50cyAoYnV0IGl0IHdpbGwgbm90IGNvdW50Ci1wb2ludGVyIGV2ZW50cykuICBBbHNvIG5vdGUgdGhhdCB0aGVzZSBtb2RlcyBhcmUgbm90Ci1hdmFpbGFibGUgaW4gXGZCLXRocmVhZHNcZlIgbW9kZSB3aGljaCBoYXMgaXRzIG93biBwb2ludGVyCi1ldmVudCBoYW5kbGluZyBtZWNoYW5pc20uCi0uSVAKLVRvIHRyeSBvdXQgdGhlIGRpZmZlcmVudCBwb2ludGVyIG1vZGVzIHRvIHNlZSB3aGljaAotb25lIGdpdmVzIHRoZSBiZXN0IHJlc3BvbnNlIGZvciB5b3VyIHVzYWdlLCBpdCBpcwotY29udmVuaWVudCB0byB1c2UgdGhlIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9uLCBmb3IKLWV4YW1wbGUgIngxMXZuYyBcZkItUlxmUiBwbTo0IiBvciB0aGUgdGNsL3RrIGd1aSAoVHVuaW5nIC0+Ci1wb2ludGVyX21vZGUgLT4gbikuCi0uUFAKLVxmQi1pbnB1dF9za2lwXGZSIFxmSW5cZlIKLS5JUAotRm9yIHRoZSBwb2ludGVyIGhhbmRsaW5nIHdoZW4gbm9uLXRocmVhZGVkOiB0cnkgdG8KLXJlYWQgbiB1c2VyIGlucHV0IGV2ZW50cyBiZWZvcmUgc2Nhbm5pbmcgZGlzcGxheS4gbiA8IDAKLW1lYW5zIHRvIGFjdCBhcyB0aG91Z2ggdGhlcmUgaXMgYWx3YXlzIHVzZXIgaW5wdXQuCi1EZWZhdWx0OiAxMAotLlBQCi1cZkItYWxsaW5wdXRcZlIKLS5JUAotSGF2ZSB4MTF2bmMgcmVhZCBhbmQgcHJvY2VzcyBhbGwgYXZhaWxhYmxlIGNsaWVudCBpbnB1dAotYmVmb3JlIHByb2NlZWRpbmcuCi0uUFAKLVxmQi1pbnB1dF9lYWdlcmx5XGZSCi0uSVAKLVNpbWlsYXIgdG8gXGZCLWFsbGlucHV0XGZSIGJ1dCB1c2UgdGhlIGhhbmRsZUV2ZW50c0VhZ2VybHkKLW1lY2hhbmlzbSBidWlsdCBpbnRvIExpYlZOQ1NlcnZlci4KLS5QUAotXGZCLXNwZWVkc1xmUiBcZklyZCxidyxsYXRcZlIKLS5JUAoteDExdm5jIHRyaWVzIHRvIGVzdGltYXRlIHNvbWUgc3BlZWQgcGFyYW1ldGVycyB0aGF0Ci1hcmUgdXNlZCB0byBvcHRpbWl6ZSBzY2hlZHVsaW5nIChlLmcuIFxmQi1wb2ludGVyX21vZGVcZlIKLTQsIFxmQi13aXJlZnJhbWUsXGZSIFxmQi1zY3JvbGxjb3B5cmVjdClcZlIgYW5kIG90aGVyIHRoaW5ncy4KLVVzZSB0aGUgXGZCLXNwZWVkc1xmUiBvcHRpb24gdG8gc2V0IHRoZXNlIG1hbnVhbGx5LgotVGhlIHRyaXBsZSBcZklyZCxidyxsYXRcZlIgY29ycmVzcG9uZHMgdG8gdmlkZW8gaC93Ci1yZWFkIHJhdGUgaW4gTUIvc2VjLCBuZXR3b3JrIGJhbmR3aWR0aCB0byBjbGllbnRzIGluCi1LQi9zZWMsIGFuZCBuZXR3b3JrIGxhdGVuY3kgdG8gY2xpZW50cyBpbiBtaWxsaXNlY29uZHMsCi1yZXNwZWN0aXZlbHkuICBJZiBhIHZhbHVlIGlzIGxlZnQgYmxhbmssIGUuZy4gIi1zcGVlZHMKLSwxMDAsMTUiLCB0aGVuIHRoZSBpbnRlcm5hbCBzY2hlbWUgaXMgdXNlZCB0byBlc3RpbWF0ZQotdGhlIGVtcHR5IHZhbHVlKHMpLgotLklQCi1UeXBpY2FsIFBDIHZpZGVvIGNhcmRzIGhhdmUgcmVhZCByYXRlcyBvZiA1LTEwIE1CL3NlYy4KLUlmIHRoZSBmcmFtZWJ1ZmZlciBpcyBpbiBtYWluIG1lbW9yeSBpbnN0ZWFkIG9mIHZpZGVvCi1oL3cgKGUuZy4gU3VuUmF5LCBzaGFkb3dmYiwgZHVtbXkgZHJpdmVyLCBYdmZiKSwgdGhlCi1yZWFkIHJhdGUgbWF5IGJlIG11Y2ggZmFzdGVyLiAgIngxMXBlcmYgXGZCLWdldGltYWdlNTAwIlxmUgotY2FuIGJlIHVzZWQgdG8gZ2V0IGEgbG93ZXIgYm91bmQgKHJlbWVtYmVyIHRvIGZhY3RvcgotaW4gdGhlIGJ5dGVzIHBlciBwaXhlbCkuICBJdCBpcyB1cCB0byB5b3UgdG8gZXN0aW1hdGUKLXRoZSBuZXR3b3JrIGJhbmR3aXRoIGFuZCBsYXRlbmN5IHRvIGNsaWVudHMuICBGb3IgdGhlCi1sYXRlbmN5IHRoZSAKLS5JUiBwaW5nICgxKQotY29tbWFuZCBjYW4gYmUgdXNlZC4KLS5JUAotRm9yIGNvbnZlbmllbmNlIHRoZXJlIGFyZSBzb21lIGFsaWFzZXMgcHJvdmlkZWQsCi1lLmcuICJcZkItc3BlZWRzXGZSIFxmSW1vZGVtXGZSIi4gIFRoZSBhbGlhc2VzIGFyZTogIm1vZGVtIiBmb3IKLTYsNCwyMDA7ICJkc2wiIGZvciA2LDEwMCw1MDsgYW5kICJsYW4iIGZvciA2LDUwMDAsMQotLlBQCi1cZkItd21kdFxmUiBcZklzdHJpbmdcZlIKLS5JUAotRm9yIHNvbWUgZmVhdHVyZXMsIGUuZy4gXGZCLXdpcmVmcmFtZVxmUiBhbmQgXGZCLXNjcm9sbGNvcHlyZWN0LFxmUgoteDExdm5jIGhhcyB0byB3b3JrIGFyb3VuZCBpc3N1ZXMgZm9yIGNlcnRhaW4gd2luZG93Ci1tYW5hZ2VycyBvciBkZXNrdG9wcyAoY3VycmVudGx5IGtkZSBhbmQgeGZjZSkuCi1CeSBkZWZhdWx0IGl0IHRyaWVzIHRvIGd1ZXNzIHdoaWNoIG9uZSwgYnV0IGl0IGNhbgotZ3Vlc3MgaW5jb3JyZWN0bHkuICBVc2UgdGhpcyBvcHRpb24gdG8gaW5kaWNhdGUgd2hpY2gKLXdtL2R0LiAgXGZJc3RyaW5nXGZSIGNhbiBiZSAiZ25vbWUiLCAia2RlIiwgImNkZSIsCi0ieGZjZSIsIG9yICJyb290IiAoY2xhc3NpYyBYIHdtKS4gIEFueXRoaW5nIGVsc2UKLWlzIGludGVycHJldGVkIGFzICJyb290Ii4KLS5QUAotXGZCLWRlYnVnX3BvaW50ZXJcZlIKLS5JUAotUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgZXZlcnkgcG9pbnRlciBldmVudC4KLS5QUAotXGZCLWRlYnVnX2tleWJvYXJkXGZSCi0uSVAKLVByaW50IGRlYnVnZ2luZyBvdXRwdXQgZm9yIGV2ZXJ5IGtleWJvYXJkIGV2ZW50LgotLlBQCi1TYW1lIGFzIFxmQi1kcFxmUiBhbmQgXGZCLWRrLFxmUiByZXNwZWN0aXZlbHkuICBVc2UgbXVsdGlwbGUKLXRpbWVzIGZvciBtb3JlIG91dHB1dC4KLS5QUAotXGZCLWRlZmVyXGZSIFxmSXRpbWVcZlIKLS5JUAotVGltZSBpbiBtcyB0byBkZWxheSBzZW5kaW5nIHVwZGF0ZXMgdG8gY29ubmVjdGVkIGNsaWVudHMKLShkZWZlclVwZGF0ZVRpbWUpICBEZWZhdWx0OiAyMAotLlBQCi1cZkItd2FpdFxmUiBcZkl0aW1lXGZSCi0uSVAKLVRpbWUgaW4gbXMgdG8gcGF1c2UgYmV0d2VlbiBzY3JlZW4gcG9sbHMuICBVc2VkIHRvIGN1dAotZG93biBvbiBsb2FkLiAgRGVmYXVsdDogMjAKLS5QUAotXGZCLWV4dHJhX2ZidXJcZlIgXGZJblxmUgotLklQCi1QZXJmb3JtIGV4dHJhIEZyYW1lQnVmZmVyVXBkYXRlUmVxdWVzdHMgY2hlY2tzIHRvCi10cnkgdG8gYmUgaW4gYmV0dGVyIHN5bmMgd2l0aCB0aGUgY2xpZW50J3MgcmVxdWVzdHMuCi1XaGF0IHRoaXMgZG9lcyBpcyBwZXJmb3JtIGV4dHJhIHBvbGxzIG9mIHRoZSBjbGllbnQKLXNvY2tldCBhdCBjcml0aWNhbCB0aW1lcyAoYmVmb3JlICctZGVmZXInIGFuZCAnLXdhaXQnCi1jYWxscy4pICBUaGUgZGVmYXVsdCBpcyBuPTEuICBTZXQgdG8gYSBsYXJnZXIgbnVtYmVyIHRvCi1pbnNlcnQgbW9yZSBjaGVja3Mgb3Igc2V0IHRvIG49MCB0byBkaXNhYmxlLiAgQSBkb3duc2lkZQotb2YgdGhlc2UgZXh0cmEgY2FsbHMgaXMgdGhhdCBtb3JlIG1vdXNlIGlucHV0IG1heSBiZQotcHJvY2Vzc2VkIHRoYW4gZGVzaXJlZC4KLS5QUAotXGZCLXdhaXRfdWlcZlIgXGZJZmFjdG9yXGZSCi0uSVAKLUZhY3RvciBieSB3aGljaCB0byBjdXQgdGhlIFxmQi13YWl0XGZSIHRpbWUgaWYgdGhlcmUKLWhhcyBiZWVuIHJlY2VudCB1c2VyIGlucHV0IChwb2ludGVyIG9yIGtleWJvYXJkKS4KLUltcHJvdmVzIHJlc3BvbnNlLCBidXQgaW5jcmVhc2VzIHRoZSBsb2FkIHdoZW5ldmVyIHlvdQotYXJlIG1vdmluZyB0aGUgbW91c2Ugb3IgdHlwaW5nLiAgRGVmYXVsdDogMi4wMAotLlBQCi1cZkItc2V0ZGVmZXJcZlIgXGZJblxmUgotLklQCi1XaGVuIHRoZSBcZkItd2FpdF91aVxmUiBtZWNoYW5pc20gY3V0cyBkb3duIHRoZSB3YWl0IHRpbWUgbXMsCi1zZXQgdGhlIGRlZmVyIHRpbWUgdG8gdGhlIHNhbWUgbXMgdmFsdWUuIG49MSB0byBlbmFibGUsCi0wIHRvIGRpc2FibGUsIGFuZCAtMSB0byBzZXQgZGVmZXIgdG8gMCAobm8gZGVsYXkpLgotU2ltaWxhcmx5LCAyIGFuZCAtMiBpbmRpY2F0ZSAndXJnZW50X3VwZGF0ZScgbW9kZSBzaG91bGQKLWJlIHVzZWQgdG8gcHVzaCB0aGUgdXBkYXRlcyBldmVuIHNvb25lci4gIERlZmF1bHQ6IDEKLS5QUAotXGZCLW5vd2FpdF9ib2dcZlIKLS5JUAotRG8gbm90IGRldGVjdCBpZiB0aGUgc2NyZWVuIHBvbGxpbmcgaXMgImJvZ2dpbmcgZG93biIKLWFuZCBzbGVlcCBtb3JlLiAgU29tZSBhY3Rpdml0aWVzIHdpdGggbm8gdXNlciBpbnB1dCBjYW4KLXNsb3cgdGhpbmdzIGRvd24gYSBsb3Q6IGNvbnNpZGVyIGEgbGFyZ2UgdGVybWluYWwgd2luZG93Ci13aXRoIGEgbG9uZyBidWlsZCBydW5uaW5nIGluIGl0IGNvbnRpbnVvdXNseSBzdHJlYW1pbmcKLXRleHQgb3V0cHV0LiAgQnkgZGVmYXVsdCB4MTF2bmMgd2lsbCB0cnkgdG8gZGV0ZWN0IHRoaXMKLSgzIHNjcmVlbiBwb2xscyBpbiBhIHJvdyBlYWNoIGxvbmdlciB0aGFuIDAuMjUgc2VjIHdpdGgKLW5vIHVzZXIgaW5wdXQpLCBhbmQgc2xlZXAgdXAgdG8gMS41IHNlY3MgdG8gbGV0IHRoaW5ncwotImNhdGNoIHVwIi4gIFVzZSB0aGlzIG9wdGlvbiB0byBkaXNhYmxlIHRoYXQgZGV0ZWN0aW9uLgotLlBQCi1cZkItc2xvd19mYlxmUiBcZkl0aW1lXGZSCi0uSVAKLUZsb2F0aW5nIHBvaW50IHRpbWUgaW4gc2Vjb25kcyB0byBkZWxheSBhbGwgc2NyZWVuCi1wb2xsaW5nLiAgRm9yIHNwZWNpYWwgcHVycG9zZSB1c2FnZSB3aGVyZSBhIGxvdyBmcmFtZQotcmF0ZSBpcyBhY2NlcHRhYmxlIGFuZCBkZXNpcmFibGUsIGJ1dCB5b3Ugd2FudCB0aGUKLXVzZXIgaW5wdXQgcHJvY2Vzc2VkIGF0IHRoZSBub3JtYWwgcmF0ZSBzbyB5b3UgY2Fubm90Ci11c2UgXGZCLXdhaXQuXGZSCi0uUFAKLVxmQi14cmVmcmVzaFxmUiBcZkl0aW1lXGZSCi0uSVAKLUZsb2F0aW5nIHBvaW50IHRpbWUgaW4gc2Vjb25kcyB0byBpbmRpY2F0ZSBob3cgb2Z0ZW4gdG8KLWRvIHRoZSBlcXVpdmFsZW50IG9mIAotLklSIHhyZWZyZXNoICgxKQotdG8gZm9yY2UgYWxsIHdpbmRvd3MKLShpbiB0aGUgdmlld2FibGUgYXJlYSBpZiBcZkItaWQsXGZSIFxmQi1zaWQsXGZSIG9yIFxmQi1jbGlwXGZSIGlzIHVzZWQpCi10byByZXBhaW50IHRoZW1zZWx2ZXMuICBVc2UgdGhpcyBvbmx5IGlmIGFwcGxpY2F0aW9ucwotbWlzYmVoYXZlIGJ5IG5vdCByZXBhaW50aW5nIHRoZW1zZWx2ZXMgcHJvcGVybHkuCi1TZWUgYWxzbyBcZkItbm94ZGFtYWdlLlxmUgotLlBQCi1cZkItbmFwLFxmUiBcZkItbm9uYXBcZlIKLS5JUAotTW9uaXRvciBhY3Rpdml0eSBhbmQgaWYgaXQgaXMgbG93IHRha2UgbG9uZ2VyIG5hcHMKLWJldHdlZW4gc2NyZWVuIHBvbGxzIHRvIHJlYWxseSBjdXQgZG93biBsb2FkIHdoZW4gaWRsZS4KLURlZmF1bHQ6IHRha2UgbmFwcwotLlBQCi1cZkItc2JcZlIgXGZJdGltZVxmUgotLklQCi1UaW1lIGluIHNlY29uZHMgYWZ0ZXIgTk8gYWN0aXZpdHkgKGUuZy4gc2NyZWVuIGJsYW5rKQotdG8gcmVhbGx5IHRocm90dGxlIGRvd24gdGhlIHNjcmVlbiBwb2xscyAoaS5lLiBzbGVlcAotZm9yIGFib3V0IDEuNSBzZWNzKS4gVXNlIDAgdG8gZGlzYWJsZS4gIERlZmF1bHQ6IDYwCi1TZXQgdGhlIGVudi4gdmFyLiBYMTFWTkNfU0JfRkFDVE9SIHRvIHNjYWxlIGl0LgotLlBQCi1cZkItcmVhZHRpbWVvdXRcZlIgXGZJblxmUgotLklQCi1TZXQgTGliVk5DU2VydmVyIHJmYk1heENsaWVudFdhaXQgdG8gbiBzZWNvbmRzLiBPbgotc2xvdyBsaW5rcyB0aGF0IHRha2UgYSBsb25nIHRpbWUgdG8gcGFpbnQgdGhlIGZpcnN0Ci1zY3JlZW4gTGliVk5DU2VydmVyIG1heSBoaXQgdGhlIHRpbWVvdXQgYW5kIGRyb3AgdGhlCi1jb25uZWN0aW9uLiAgRGVmYXVsdDogMjAgc2Vjb25kcy4KLS5QUAotXGZCLXBpbmdcZlIgXGZJblxmUgotLklQCi1TZW5kIGEgMXgxIGZyYW1lYnVmZmVyIHVwZGF0ZSB0byBhbGwgY2xpZW50cyBldmVyeSBuCi1zZWNvbmRzIChlLmcuIHRvIHRyeSB0byBrZWVwIGEgbmV0d29yayBjb25uZWN0aW9uIGFsaXZlKQotLlBQCi1cZkItbm9mYnBtLFxmUiBcZkItZmJwbVxmUgotLklQCi1JZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZSBGQlBNIChGcmFtZSBCdWZmZXIgUG93ZXIKLU1hbmFnZW1lbnQpIGV4dGVuc2lvbiAoaS5lLiBzb21lIFN1biBzeXN0ZW1zKSwgdGhlbgotcHJldmVudCB0aGUgdmlkZW8gaC93IGZyb20gZ29pbmcgaW50byBhIHJlZHVjZWQgcG93ZXIKLXN0YXRlIHdoZW4gVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4KLS5JUAotRkJQTSBjYXBhYmxlIHZpZGVvIGgvdyBzYXZlIGVuZXJneSB3aGVuIHRoZSB3b3Jrc3RhdGlvbgotaXMgaWRsZSBieSBnb2luZyBpbnRvIGxvdyBwb3dlciBzdGF0ZXMgKHNpbWlsYXIgdG8gRFBNUwotZm9yIG1vbml0b3JzKS4gIFRoaXMgaW50ZXJmZXJlcyB3aXRoIHgxMXZuYydzIHBvbGxpbmcKLW9mIHRoZSBmcmFtZWJ1ZmZlciBkYXRhLgotLklQCi0iXGZCLW5vZmJwbVxmUiIgbWVhbnMgcHJldmVudCBGQlBNIGxvdyBwb3dlciBzdGF0ZXMgd2hlbmV2ZXIKLVZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQsIHdoaWxlICJcZkItZmJwbVxmUiIgbWVhbnMgdG8gbm90Ci1tb25pdG9yIHRoZSBGQlBNIHN0YXRlIGF0IGFsbC4gIFNlZSB0aGUgCi0uSVIgeHNldCAoMSkKLW1hbnBhZ2UKLWZvciBkZXRhaWxzLiAgXGZCLW5vZmJwbVxmUiBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgcnVubmluZwotInhzZXQgZmJwbSBmb3JjZSBvbiIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogXGZCLWZicG1cZlIKLS5QUAotXGZCLW5vZHBtcyxcZlIgXGZCLWRwbXNcZlIKLS5JUAotSWYgdGhlIHN5c3RlbSBzdXBwb3J0cyB0aGUgRFBNUyAoRGlzcGxheSBQb3dlciBNYW5hZ2VtZW50Ci1TaWduYWxpbmcpIGV4dGVuc2lvbiwgdGhlbiBwcmV2ZW50IHRoZSBtb25pdG9yIGZyb20KLWdvaW5nIGludG8gYSByZWR1Y2VkIHBvd2VyIHN0YXRlIHdoZW4gVk5DIGNsaWVudHMKLWFyZSBjb25uZWN0ZWQuCi0uSVAKLURQTVMgcmVkdWNlZCBwb3dlciBtb25pdG9yIHN0YXRlcyBhcmUgYSBnb29kIHRoaW5nCi1hbmQgeW91IG5vcm1hbGx5IHdhbnQgdGhlIHBvd2VyIGRvd24gdG8gdGFrZSBwbGFjZQotKHVzdWFsbHkgeDExdm5jIGhhcyBubyBwcm9ibGVtIGV4cG9ydGluZyB0aGUgZGlzcGxheSBpbgotdGhpcyBzdGF0ZSkuICBZb3UgcHJvYmFibHkgb25seSB3YW50IHRvIHVzZSAiXGZCLW5vZHBtc1xmUiIKLXRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggU2NyZWVuIFNhdmVycyBraWNraW5nCi1vbiBpbiBEUE1TIGxvdyBwb3dlciBzdGF0ZXMuICBUaGVyZSBpcyBrbm93biBwcm9ibGVtCi13aXRoIGtkZXNrdG9wX2xvY2sgb24gS0RFIHdoZXJlIHRoZSBzY3JlZW4gc2F2ZXIga2VlcHMKLWtpY2tpbmcgaW4gZXZlcnkgdGltZSB1c2VyIGlucHV0IHN0b3BzIGZvciBhIHNlY29uZAotb3IgdHdvLiAgU3BlY2lmeWluZyAiXGZCLW5vZHBtc1xmUiIgd29ya3MgYXJvdW5kIGl0LgotLklQCi0iXGZCLW5vZHBtc1xmUiIgbWVhbnMgcHJldmVudCBEUE1TIGxvdyBwb3dlciBzdGF0ZXMgd2hlbmV2ZXIKLVZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQsIHdoaWxlICJcZkItZHBtc1xmUiIgbWVhbnMgdG8gbm90Ci1tb25pdG9yIHRoZSBEUE1TIHN0YXRlIGF0IGFsbC4gIFNlZSB0aGUgCi0uSVIgeHNldCAoMSkKLW1hbnBhZ2UKLWZvciBkZXRhaWxzLiAgXGZCLW5vZHBtc1xmUiBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgcnVubmluZwotInhzZXQgZHBtcyBmb3JjZSBvbiIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogXGZCLWRwbXNcZlIKLS5QUAotXGZCLWZvcmNlZHBtc1xmUgotLklQCi1JZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoZSBEUE1TIChEaXNwbGF5IFBvd2VyCi1NYW5hZ2VtZW50IFNpZ25hbGluZykgZXh0ZW5zaW9uLCB0aGVuIHRyeSB0byBrZWVwIHRoZQotbW9uaXRvciBpbiBhIHBvd2VyZWQgb2ZmIHN0YXRlLiAgVGhpcyBpcyB0byBwcmV2ZW50Ci1ub3NleSBwZW9wbGUgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgZnJvbSB2aWV3aW5nIHdoYXQKLWlzIG9uIHRoZSBzY3JlZW4uICBCZSBzdXJlIHRvIGxvY2sgdGhlIHNjcmVlbiBiZWZvcmUKLWRpc2Nvbm5lY3RpbmcuCi0uSVAKLVRoaXMgbWV0aG9kIGlzIGZhciBmcm9tIGJ1bGxldCBwcm9vZiwgZS5nLiBzdXBwb3NlCi1zb21lb25lIGF0dGFjaGVzIGEgbm9uLURQTVMgbW9uaXRvciwgb3IgbG9hZHMgdGhlCi1tYWNoaW5lIHNvIHRoYXQgdGhlcmUgaXMgYSBnYXAgb2YgdGltZSBiZWZvcmUgeDExdm5jCi1yZXN0b3JlcyB0aGUgcG93ZXJlZCBvZmYgc3RhdGU/ICBPbiBtYW55IG1hY2hpbmVzIGlmCi1oZSBmbG9vZHMgaXQgd2l0aCBrZXlib2FyZCBhbmQgbW91c2UgaW5wdXQgaGUgY2FuIHNlZQotZmxhc2hlcyBvZiB3aGF0IGlzIG9uIHRoZSBzY3JlZW4gYmVmb3JlIHRoZSBEUE1TIG9mZgotc3RhdGUgaXMgcmVlc3RhYmxpc2hlZC4gIEZvciB0aGlzIHRvIHdvcmsgc2VjdXJlbHkKLXRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgc3VwcG9ydCBpbiB0aGUgWCBzZXJ2ZXIgdG8gZG8KLXRoaXMgZXhhY3RseSByYXRoZXIgdGhhbiBhcHByb3hpbWF0ZWx5IHdpdGggRFBNUy4KLS5QUAotXGZCLWNsaWVudGRwbXNcZlIKLS5JUAotQXMgXGZCLWZvcmNlZHBtc1xmUiBidXQgb25seSB3aGVuIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQuCi0uUFAKLVxmQi1ub3NlcnZlcmRwbXNcZlIKLS5JUAotVGhlIFVsdHJhVk5DIFNlcnZlcklucHV0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCi1UaGlzIGFsbG93cyB0aGUgVk5DIHZpZXdlciB0byBjbGljayBhIGJ1dHRvbiB0aGF0IHdpbGwKLWNhdXNlIHRoZSBzZXJ2ZXIgKHgxMXZuYykgdG8gdHJ5IHRvIGRpc2FibGUga2V5Ym9hcmQKLWFuZCBtb3VzZSBpbnB1dCBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgcHV0IHRoZQotbW9uaXRvciBpbiBkcG1zIHBvd2VyZWQgb2ZmIHN0YXRlLiAgVXNlIHRoaXMgb3B0aW9uIHRvCi1za2lwIHBvd2VyaW5nIG9mZiB0aGUgbW9uaXRvci4KLS5QUAotXGZCLW5vdWx0cmFleHRcZlIKLS5JUAotRGlzYWJsZSB0aGUgZm9sbG93aW5nIFVsdHJhVk5DIGV4dGVuc2lvbnM6IFNpbmdsZVdpbmRvdwotYW5kIFNlcnZlcklucHV0LiAgVGhlIG90aGVycyBtYW5hZ2VkIGJ5IExpYlZOQ1NlcnZlcgotKHRleHRjaGF0LCAxL24gc2NhbGluZywgcmZiRW5jb2RpbmdVbHRyYSkgYXJlIG5vdC4KLS5QUAotXGZCLWNoYXR3aW5kb3dcZlIKLS5JUAotUGxhY2UgYSBsb2NhbCBVbHRyYVZOQyBjaGF0IHdpbmRvdyBvbiB0aGUgWDExIGRpc3BsYXkKLXRoYXQgeDExdm5jIGlzIHBvbGxpbmcuICBUaGF0IHdheSB0aGUgcGVyc29uIG9uIHRoZSBWTkMKLXZpZXdlci1zaWRlIGNhbiBjaGF0IHdpdGggdGhlIHBlcnNvbiBhdCB0aGUgcGh5c2ljYWwKLVgxMSBjb25zb2xlLiAoZS5nLiBoZWxwZGVzayB3L28gdGVsZXBob25lKQotLklQCi1Gb3IgdGhpcyB0byB3b3JrIHRoZSBTU1ZOQyBwYWNrYWdlICh2ZXJzaW9uIDEuMC4yMSBvcgotbGF0ZXIpIE1VU1QgQkUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gd2hlcmUgeDExdm5jIHJ1bnMKLWFuZCB0aGUgJ3Nzdm5jJyBjb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIGluICRQQVRILgotVGhlIHNzdm5jdmlld2VyIGlzIHVzZWQgYXMgYSBjaGF0IHdpbmRvdyBoZWxwZXIuCi1TZWUgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sCi0uSVAKLVRoaXMgb3B0aW9uIGltcGxpZXMgJy1yZmJ2ZXJzaW9uIDMuNicgc28gYXMgdG8gdHJpY2sKLVVsdHJhVk5DIHZpZXdlcnMsIG90aGVyd2lzZSB0aGV5IGFzc3VtZSBjaGF0IGlzIG5vdAotYXZhaWxhYmxlLiAgVG8gc3BlY2lmeSBhIGRpZmZlcmVudCByZmJ2ZXJzaW9uLCBwbGFjZQotaXQgYWZ0ZXIgdGhlIFxmQi1jaGF0d2luZG93XGZSIG9wdGlvbiBvbiB0aGUgY21kbGluZS4KLS5JUAotU2VlIGFsc28gdGhlIHJlbW90ZSBjb250cm9sICdjaGF0b24nIGFuZCAnY2hhdG9mZicKLWFjdGlvbnMuICBUaGVzZSBjYW4gYWxzbyBiZSBzZXQgZnJvbSB0aGUgdGt4MTF2bmMgR1VJLgotLlBQCi1cZkItbm94ZGFtYWdlXGZSCi0uSVAKLURvIG5vdCB1c2UgdGhlIFggREFNQUdFIGV4dGVuc2lvbiB0byBkZXRlY3QgZnJhbWVidWZmZXIKLWNoYW5nZXMgZXZlbiBpZiBpdCBpcyBhdmFpbGFibGUuICBVc2UgXGZCLXhkYW1hZ2VcZlIgaWYgeW91cgotZGVmYXVsdCBpcyB0byBoYXZlIGl0IG9mZi4KLS5JUAoteDExdm5jJ3MgdXNlIG9mIHRoZSBEQU1BR0UgZXh0ZW5zaW9uOiAxKSBzaWduaWZpY2FudGx5Ci1yZWR1Y2VzIHRoZSBsb2FkIHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgY2hhbmdpbmcgbXVjaCwKLWFuZCAyKSBkZXRlY3RzIGNoYW5nZWQgYXJlYXMgKHNtYWxsIG9uZXMgYnkgZGVmYXVsdCkKLW1vcmUgcXVpY2tseS4KLS5JUAotQ3VycmVudGx5IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUKLWFuZCBvZnRlbiByZXBvcnRzIGxhcmdlIGFyZWFzIChlLmcuIGEgd2hvbGUgdGVybWluYWwKLW9yIGJyb3dzZXIgd2luZG93KSBhcyBkYW1hZ2VkIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWwKLWNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggc21hbGxlciAoc29tZXRpbWVzIGp1c3QgYSBmZXcKLXBpeGVscykuICBTbyBoZXVyaXN0aWNzIHdlcmUgaW50cm9kdWNlZCB0byBza2lwIGxhcmdlCi1hcmVhcyBhbmQgdXNlIHRoZSBkYW1hZ2UgcmVjdGFuZ2xlcyBvbmx5IGFzICJoaW50cyIKLWZvciB0aGUgdHJhZGl0aW9uYWwgc2NhbmxpbmUgcG9sbGluZy4gIFRoZSBmb2xsb3dpbmcKLXR1bmluZyBwYXJhbWV0ZXJzIGFyZSBpbnRyb2R1Y2VkIHRvIGFkanVzdCB0aGlzCi1iZWhhdmlvcjoKLS5QUAotXGZCLXhkX2FyZWFcZlIgXGZJQVxmUgotLklQCi1TZXQgdGhlIGxhcmdlc3QgREFNQUdFIHJlY3RhbmdsZSBhcmVhIFxmSUFcZlIgKGluCi1waXhlbHM6IHdpZHRoICogaGVpZ2h0KSB0byB0cnVzdCBhcyB0cnVseSBkYW1hZ2VkOgotdGhlIHJlY3RhbmdsZSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBmcmFtZWJ1ZmZlcgotKHNsb3cpIG5vIG1hdHRlciB3aGF0LiAgU2V0IHRvIHplcm8gdG8gdHJ1c3QgKmFsbCoKLXJlY3RhbmdsZXMuIERlZmF1bHQ6IDIwMDAwCi0uUFAKLVxmQi14ZF9tZW1cZlIgXGZJZlxmUgotLklQCi1TZXQgaG93IGxvbmcgREFNQUdFIHJlY3RhbmdsZXMgc2hvdWxkIGJlICJyZW1lbWJlcmVkIiwKLVxmSWZcZlIgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIGlzIGluIHVuaXRzIG9mIHRoZQotc2NhbmxpbmUgcmVwZWF0IGN5Y2xlIHRpbWUgKDMyIGl0ZXJhdGlvbnMpLiAgVGhlIGRlZmF1bHQKLSgxLjApIHNob3VsZCBnaXZlIG5vIHBhaW50aW5nIHByb2JsZW1zLiBJbmNyZWFzZSBpdCBpZgotdGhlcmUgYXJlIHByb2JsZW1zIG9yIGRlY3JlYXNlIGl0IHRvIGxpdmUgb24gdGhlIGVkZ2UKLShwZXJoYXBzIHVzZWZ1bCBvbiBhIHNsb3cgbWFjaGluZSkuCi0uUFAKLVxmQi1zaWdwaXBlXGZSIFxmSXN0cmluZ1xmUgotLklQCi1Ccm9rZW4gcGlwZSAoU0lHUElQRSkgaGFuZGxpbmcuICBcZklzdHJpbmdcZlIgY2FuIGJlCi0iaWdub3JlIiBvciAiZXhpdCIuICBGb3IgImlnbm9yZSIgTGliVk5DU2VydmVyCi13aWxsIGhhbmRsZSB0aGUgYWJydXB0IGxvc3Mgb2YgYSBjbGllbnQgYW5kIGNvbnRpbnVlLAotZm9yICJleGl0IiB4MTF2bmMgd2lsbCBjbGVhbnVwIGFuZCBleGl0IGF0IHRoZSAxc3QKLWJyb2tlbiBjb25uZWN0aW9uLgotLklQCi1UaGlzIG9wdGlvbiBpcyBub3QgcmVhbGx5IG5lZWRlZCBzaW5jZSBMaWJWTkNTZXJ2ZXIKLWlzIGRvaW5nIHRoZSBjb3JyZWN0IHRoaW5nIG5vdyBmb3IgcXVpdGUgc29tZSB0aW1lLgotSG93ZXZlciwgZm9yIGNvbnZlbmllbmNlIHlvdSBjYW4gdXNlIGl0IHRvIGlnbm9yZSBvdGhlcgotc2lnbmFscywgZS5nLiAiXGZCLXNpZ3BpcGVcZlIgXGZJaWdub3JlOkhVUCxJTlQsVEVSTVxmUiIgaW4gY2FzZQotdGhhdCB3b3VsZCBiZSB1c2VmdWwgZm9yIHNvbWUgc29ydCBvZiBhcHBsaWNhdGlvbi4KLVlvdSBjYW4gYWxzbyBwdXQgImV4aXQ6Li4iIGluIHRoZSBsaXN0IHRvIGhhdmUgeDExdm5jCi1jbGVhbnVwIG9uIHRoZSBsaXN0ZWQgc2lnbmFscy4gIlxmQi1zaWdcZlIiIGlzIGFuIGFsaWFzCi1mb3IgdGhpcyBvcHRpb24gaWYgeW91IGRvbid0IGxpa2UgdGhlICdwaXBlJy4gRXhhbXBsZToKLVxmQi1zaWdcZlIgaWdub3JlOklOVCxURVJNLGV4aXQ6VVNSMQotLlBQCi1cZkItdGhyZWFkcyxcZlIgXGZCLW5vdGhyZWFkc1xmUgotLklQCi1XaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIHRocmVhZGVkIExpYlZOQ1NlcnZlcgotYWxnb3JpdGhtIFtyZmJSdW5FdmVudExvb3BdIGlmIGxpYnB0aHJlYWQgaXMgYXZhaWxhYmxlLgotSW4gdGhpcyBtb2RlIG5ldyB0aHJlYWRzIChvbmUgZm9yIGlucHV0IGFuZCBvbmUKLWZvciBvdXRwdXQpIGFyZSBjcmVhdGVkIHRvIGhhbmRsZSBlYWNoIG5ldyBjbGllbnQuCi1EZWZhdWx0OiBcZkItbm90aHJlYWRzLlxmUgotLklQCi1UaHJlYWQgc3RhYmlsaXR5IGlzIG11Y2ggaW1wcm92ZWQgaW4gdmVyc2lvbiAwLjkuOC4KLS5JUAotTXVsdGlwbGUgY2xpZW50cyBpbiB0aHJlYWRlZCBtb2RlIHNob3VsZCBiZSBzdGFibGUKLWZvciB0aGUgWlJMRSBlbmNvZGluZyBvbiBhbGwgcGxhdGZvcm1zLiAgVGhlIFRpZ2h0IGFuZAotWmxpYiBlbmNvZGluZ3MgYXJlIGN1cnJlbnRseSBvbmx5IHN0YWJsZSBvbiBMaW51eCBmb3IKLW11bHRpcGxlIGNsaWVudHMuICBDb21waWxlIHdpdGggXGZCLURUTFM9X190aHJlYWRcZlIgaWYgeW91cgotT1MgYW5kIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydCBpdC4KLS5JUAotRm9yIHJlc2l6ZXMgKHJhbmRyLCBldGMuKSBzZXQgdGhpcyBlbnYuIHZhci4gdG8gdGhlIG51bWJlcgotb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwOiBYMTFWTkNfVEhSRUFEU19ORVdfRkJfU0xFRVAKLWF0IHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkb19uZXdfZmIoKSBhY3Rpb24uICBUaGlzIGlzIHRvCi1sZXQgdmFyaW91cyBhY3Rpdml0aWVzIHNldHRsZS4gIERlZmF1bHQgaXMgYWJvdXQgNTAwbXMuCi0uSVAKLU11bHRpcGxlIGNsaWVudHMgaW4gdGhyZWFkZWQgbW9kZSBjb3VsZCB5aWVsZCBiZXR0ZXIKLXBlcmZvcm1hbmNlIGZvciAnY2xhc3Mtcm9vbScgYnJvYWRjYXN0aW5nIHVzYWdlOyBhbHNvIGluCi1cZkItYXBwc2hhcmVcZlIgYnJvYWRjYXN0IG1vZGUuICBTZWUgYWxzbyB0aGUgXGZCLXJlZmxlY3RcZlIgb3B0aW9uLgotLlBQCi1cZkItZnNcZlIgXGZJZlxmUgotLklQCi1JZiB0aGUgZnJhY3Rpb24gb2YgY2hhbmdlZCB0aWxlcyBpbiBhIHBvbGwgaXMgZ3JlYXRlcgotdGhhbiBmLCB0aGUgd2hvbGUgc2NyZWVuIGlzIHVwZGF0ZWQuICBEZWZhdWx0OiAwLjc1Ci0uUFAKLVxmQi1nYXBzXGZSIFxmSW5cZlIKLS5JUAotSGV1cmlzdGljIHRvIGZpbGwgaW4gZ2FwcyBpbiByb3dzIG9yIGNvbHMgb2YgbiBvcgotbGVzcyB0aWxlcy4gIFVzZWQgdG8gaW1wcm92ZSB0ZXh0IHBhZ2luZy4gIERlZmF1bHQ6IDQKLS5QUAotXGZCLWdyb3dcZlIgXGZJblxmUgotLklQCi1IZXVyaXN0aWMgdG8gZ3JvdyBpc2xhbmRzIG9mIGNoYW5nZWQgdGlsZXMgbiBvciB3aWRlcgotYnkgY2hlY2tpbmcgdGhlIHRpbGUgbmVhciB0aGUgYm91bmRhcnkuICBEZWZhdWx0OiAzCi0uUFAKLVxmQi1mdXp6XGZSIFxmSW5cZlIKLS5JUAotVG9sZXJhbmNlIGluIHBpeGVscyB0byBtYXJrIGEgdGlsZXMgZWRnZXMgYXMgY2hhbmdlZC4KLURlZmF1bHQ6IDIKLS5QUAotXGZCLWRlYnVnX3RpbGVzXGZSCi0uSVAKLVByaW50IGRlYnVnZ2luZyBvdXRwdXQgZm9yIHRpbGVzLCBmYiB1cGRhdGVzLCBldGMuCi0uUFAKLVxmQi1zbmFwZmJcZlIKLS5JUAotSW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBYIGRpc3BsYXkgZnJhbWVidWZmZXIgKGZiKQotZm9yIGNoYW5nZXMsIHBlcmlvZGljYWxseSBjb3B5IGFsbCBvZiBYIGRpc3BsYXkgZmIKLWludG8gbWFpbiBtZW1vcnkgYW5kIGV4YW1pbmUgdGhhdCBjb3B5IGZvciBjaGFuZ2VzLgotKFRoaXMgc2V0dGluZyBhbHNvIGFwcGxpZXMgZm9yIG5vbi1YIFxmQi1yYXdmYlxmUiBtb2RlcykuCi1VbmRlciBzb21lIGNpcmN1bXN0YW5jZXMgdGhpcyB3aWxsIGltcHJvdmUgaW50ZXJhY3RpdmUKLXJlc3BvbnNlLCBvciBhdCBsZWFzdCBtYWtlIHRoaW5ncyBsb29rIHNtb290aGVyLCBidXQgaW4KLW90aGVycyAobW9zdCEpIGl0IHdpbGwgbWFrZSB0aGUgcmVzcG9uc2Ugd29yc2UuICBJZiB0aGUKLXZpZGVvIGgvdyBmYiBpcyBzdWNoIHRoYXQgcmVhZGluZyBzbWFsbCB0aWxlcyBpcyB2ZXJ5Ci1zbG93IHRoaXMgbW9kZSBjb3VsZCBoZWxwLiAgVG8ga2VlcCB0aGUgImZyYW1lcmF0ZSIKLXVwIHRoZSBzY3JlZW4gc2l6ZSB4IGJwcCBjYW5ub3QgYmUgdG9vIGxhcmdlLiAgTm90ZSB0aGF0Ci10aGlzIG1vZGUgaXMgdmVyeSB3YXN0ZWZ1bCBvZiBtZW1vcnkgSS9PIHJlc291cmNlcwotKGl0IG1ha2VzIGZ1bGwgc2NyZWVuIGNvcGllcyBldmVuIGlmIG5vdGhpbmcgY2hhbmdlcykuCi1JdCBtYXkgYmUgb2YgdXNlIGluIHZpZGVvIGNhcHR1cmUtbGlrZSBhcHBsaWNhdGlvbnMsCi13ZWJjYW1zLCBvciB3aGVyZSB3aW5kb3cgdGVhcmluZyBpcyBhIHByb2JsZW0uCi0uUFAKLVxmQi1yYXdmYlxmUiBcZklzdHJpbmdcZlIKLS5JUAotSW5zdGVhZCBvZiBwb2xsaW5nIFgsIHBvbGwgdGhlIG1lbW9yeSBvYmplY3Qgc3BlY2lmaWVkCi1pbiBcZklzdHJpbmdcZlIuCi0uSVAKLUZvciBmaWxlIHBvbGxpbmcsIHRvIG1lbW9yeSBtYXAgCi0uSVIgbW1hcCAoMikKLWEgZmlsZSB1c2U6Ci0ibWFwOi9wYXRoL3RvL2EvZmlsZUBXeEh4QiIsIHdpdGggZnJhbWVidWZmZXIgV2lkdGgsCi1IZWlnaHQsIGFuZCBCaXRzIHBlciBwaXhlbC4gICJtbWFwOi4uLiIgaXMgdGhlCi1zYW1lLgotLklQCi1JZiB0aGVyZSBpcyB0cm91YmxlIHdpdGggbW1hcCwgdXNlICJmaWxlOi8uLi4iCi1mb3Igc2xvd2VyIAotLklSIGxzZWVrICgyKQotYmFzZWQgcmVhZGluZy4KLS5JUAotVXNlICJzbmFwOi4uLiIgdG8gaW1wbHkgXGZCLXNuYXBmYlxmUiBtb2RlIGFuZCB0aGUgImZpbGU6IgotYWNjZXNzICh0aGlzIGlzIGZvciB1bnNlZWthYmxlIGRldmljZXMgdGhhdCBvbmx5IHByb3ZpZGUKLXRoZSBmYiBhbGwgYXQgb25jZSwgZS5nLiBhIHZpZGVvIGNhbWVyYSBwcm92aWRlcyB0aGUKLXdob2xlIGZyYW1lKS4KLS5JUAotRm9yIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgc3RyaW5nIGlzIG9mIHRoZSBmb3JtOgotInNobTpOQFd4SHhCIiB3aGljaCBzcGVjaWZpZXMgYSBzaG1pZCBOIGFuZCB3aXRoCi1XeEh4QiBhcyBhYm92ZS4gIFNlZSAKLS5JUiBzaG1hdCAoMSkKLWFuZCAKLS5JUiBpcGNzICgxKQotLklQCi1JZiB5b3UgZG8gbm90IHN1cHBseSBhIHR5cGUgIm1hcCIgaXMgYXNzdW1lZCBpZgotdGhlIGZpbGUgZXhpc3RzIChzZWUgdGhlIG5leHQgcGFyYWdyYXBocyBmb3Igc29tZQotZXhjZXB0aW9ucyB0byB0aGlzLikKLS5JUAotSWYgc3RyaW5nIGlzICJzZXR1cDpjbWQiLCB0aGVuIHRoZSBjb21tYW5kICJjbWQiCi1pcyBydW4gYW5kIHRoZSBmaXJzdCBsaW5lIGZyb20gaXQgaXMgcmVhZCBhbmQgdXNlZAotYXMgXGZJc3RyaW5nXGZSLiAgVGhpcyBhbGxvd3MgaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UsCi1kZXRlcm1pbmluZyBXeEh4QiwgZXRjLiBUaGVzZSBhcmUgb2Z0ZW4gZG9uZSBhcyByb290Ci1zbyB0YWtlIGNhcmUuCi0uSVAKLUlmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggInZpZGVvIiwgc2VlIHRoZSBWSURFTzRMSU5VWAotZGlzY3Vzc2lvbiBiZWxvdyB3aGVyZSB0aGUgZGV2aWNlIG1heSBiZSBxdWVyaWVkIGZvcgotKGFuZCBwb3NzaWJseSBzZXQpIHRoZSBmcmFtZWJ1ZmZlciBwYXJhbWV0ZXJzLgotLklQCi1JZiB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoICJjb25zb2xlIiwgIi9kZXYvZmIiLAotImZiIiwgb3IgInZ0Iiwgc2VlIHRoZSBMSU5VWCBDT05TT0xFIGRpc2N1c3Npb24KLWJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgb3BlbmVkIGFuZAota2V5c3Ryb2tlcyAoYW5kIHBvc3NpYmx5IG1vdXNlIGV2ZW50cykgYXJlIGluc2VydGVkCi1pbnRvIHRoZSBjb25zb2xlLgotLklQCi1JZiB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoICJ2bmMiLCBzZWUgdGhlIFZOQyBIT1NUCi1kaXNjdXNzaW9uIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBpcyB0YWtlbiBhcyB0aGF0Ci1vZiBhbm90aGVyIHJlbW90ZSBWTkMgc2VydmVyLgotLklQCi1PcHRpb25hbCBzdWZmaXhlcyBhcmUgIjpSL0cvQiIgYW5kICIrTyIgdG8gc3BlY2lmeQotcmVkLCBncmVlbiwgYW5kIGJsdWUgbWFza3MgKGluIGhleCkgYW5kIGFuIG9mZnNldCBpbnRvCi10aGUgbWVtb3J5IG9iamVjdC4gIElmIHRoZSBtYXNrcyBhcmUgbm90IHByb3ZpZGVkIHgxMXZuYwotZ3Vlc3NlcyB0aGVtIGJhc2VkIG9uIHRoZSBicHAgKGlmIHRoZSBjb2xvcnMgbG9vayB3cm9uZywKLXlvdSBuZWVkIHRvIHByb3ZpZGUgdGhlIG1hc2tzLikKLS5JUAotQW5vdGhlciBvcHRpb25hbCBzdWZmaXggaXMgdGhlIEJ5dGVzIFBlciBMaW5lIHdoaWNoIGluCi1zb21lIGNhc2VzIGlzIG5vdCBXeEIvOC4gIFNwZWNpZnkgaXQgYXMgV3hIeEItQlBMCi1lLmcuIDgwMHg2MDB4MTYtMjA0OC4gIFRoaXMgY291bGQgYmUgYSBub3JtYWwgd2lkdGgKLTEwMjQgYXQgMTZicHAgZmIsIGJ1dCBvbmx5IHdpZHRoIDgwMCBzaG93cyB1cC4KLS5JUAotU28gdGhlIGZ1bGwgZm9ybWF0IGlzOiBtb2RlOmZpbGVAV3hIeEI6Ui9HL0IrTy1CUEwKLS5JUAotRXhhbXBsZXM6Ci0uSVAKLVxmQi1yYXdmYlxmUiBzaG06MjEwMzM3OTMzQDgwMHg2MDB4MzI6ZmYvZmYwMC9mZjAwMDAKLS5JUAotXGZCLXJhd2ZiXGZSIG1hcDovZGV2L2ZiMEAxMDI0eDc2OHgzMgotLklQCi1cZkItcmF3ZmJcZlIgbWFwOi90bXAvWHZmYl9zY3JlZW4wQDY0MHg0ODB4OCszMjMyCi0uSVAKLVxmQi1yYXdmYlxmUiBmaWxlOi90bXAvbXkucG5tQDI1MHgyMDB4MjQrMzcKLS5JUAotXGZCLXJhd2ZiXGZSIGZpbGU6L2Rldi91cmFuZG9tQDEyOHgxMjh4OAotXGZCLXJhd2ZiXGZSIHNuYXA6L2Rldi92aWRlbzBAMzIweDI0MHgyNCBcZkItMjR0bzMyXGZSCi1cZkItcmF3ZmJcZlIgdmlkZW8wCi1cZkItcmF3ZmJcZlIgdmlkZW8gXGZCLXBpcGVpbnB1dFxmUiBWSUQKLVxmQi1yYXdmYlxmUiBjb25zb2xlCi1cZkItcmF3ZmJcZlIgdnQyCi1cZkItcmF3ZmJcZlIgdm5jOnNvbWVob3N0OjAKLS5JUAotKHNlZSAKLS5JUiBpcGNzICgxKQotYW5kIAotLklSIGZic2V0ICgxKQotZm9yIHRoZSBmaXJzdCB0d28gZXhhbXBsZXMpCi0uSVAKLUluIGdlbmVyYWwgYWxsIHVzZXIgaW5wdXQgaXMgZGlzY2FyZGVkIGJ5IGRlZmF1bHQgKHNlZQotdGhlIFxmQi1waXBlaW5wdXRcZlIgb3B0aW9uIGZvciBob3cgdG8gdXNlIGEgaGVscGVyIHByb2dyYW0KLXRvIGluc2VydCkuICBNb3N0IG9mIHRoZSBYMTEgKHNjcmVlbiwga2V5Ym9hcmQsIG1vdXNlKQotb3B0aW9ucyBkbyBub3QgbWFrZSBzZW5zZSBhbmQgbWFueSB3aWxsIGNhdXNlIHRoaXMKLW1vZGUgdG8gY3Jhc2gsIHNvIHBsZWFzZSB0aGluayB0d2ljZSBiZWZvcmUgc2V0dGluZyBvcgotY2hhbmdpbmcgdGhlbSBpbiBhIHJ1bm5pbmcgeDExdm5jLgotLklQCi1JZiB5b3UgRE8gTk9UIHdhbnQgeDExdm5jIHRvIGNsb3NlIHRoZSBYIERJU1BMQVkgaW4KLXJhd2ZiIG1vZGUsIHByZXBlbmQgYSAiKyIgZS5nLiArZmlsZTovZGV2L2ZiMC4uLgotS2VlcGluZyB0aGUgZGlzcGxheSBvcGVuIGVuYWJsZXMgdGhlIGRlZmF1bHQKLXJlbW90ZS1jb250cm9sIGNoYW5uZWwsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bC4KLUFsdGVybmF0aXZlbHksIGlmIHlvdSBzcGVjaWZ5IFxmQi1ub3ZpZXdvbmx5LFxmUiB0aGVuIHRoZQotbW91c2UgYW5kIGtleWJvYXJkIGlucHV0IGFyZSBTVElMTCBzZW50IHRvIHRoZSBYCi1kaXNwbGF5LCB0aGlzIHVzYWdlIHNob3VsZCBiZSB2ZXJ5IHJhcmUsIGkuZS4gZG9pbmcKLXNvbWV0aGluZyBzdHJhbmdlIHdpdGggL2Rldi9mYjAuCi0uSVAKLUlmIHRoZSBkZXZpY2UgaXMgbm90ICJzZWVrYWJsZSIgKGUuZy4gd2ViY2FtKSB0cnkKLXJlYWRpbmcgaXQgYWxsIGF0IG9uY2UgaW4gZnVsbCBzbmFwcyB2aWEgdGhlICJzbmFwOiIKLW1vZGUgKG5vdGU6IHRoaXMgaXMgYSByZXNvdXJjZSBob2cpLiAgSWYgeW91IGFyZSB1c2luZwotZmlsZTogb3IgbWFwOiBBTkQgdGhlIGRldmljZSBuZWVkcyB0byBiZSByZW9wZW5lZCBmb3IKLSpldmVyeSogc25hcGZiIHNuYXBzaG90LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlOgotU05BUEZCX1JBV0ZCX1JFU0VUPTEgYXMgd2VsbC4KLS5JUAotSWYgeW91IHdhbnQgeDExdm5jIHRvIGR5bmFtaWNhbGx5IHRyYW5zZm9ybSBhIDI0YnBwCi1yYXdmYiB0byAzMmJwcCAobm90ZSB0aGF0IHRoaXMgd2lsbCBiZSBzbG93ZXIpIGFsc28KLXN1cHBseSB0aGUgXGZCLTI0dG8zMlxmUiBvcHRpb24uICBUaGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IsCi1zYXksIGEgdmlkZW8gY2FtZXJhIHRoYXQgZGVsaXZlcnMgdGhlIHBpeGVsIGRhdGEgYXMKLTI0YnBwIHBhY2tlZCBSR0IuICBUaGlzIGlzIHRoZSBkZWZhdWx0IHVuZGVyICJ2aWRlbyIKLW1vZGUgaWYgdGhlIGJwcCBpcyAyNC4KLS5JUAotTm9ybWFsbHkgdGhlIGJpdHMgcGVyIHBpeGVsLCBCLCBpcyA4LCAxNiwgb3IgMzIgKG9yCi1yYXJlbHkgMjQpLCBob3dldmVyIHRoZXJlIGlzIGFsc28gc29tZSBzdXBwb3J0IGZvcgotQiA8IDggKGUuZy4gb2xkIGdyYXBoaWNzIGRpc3BsYXlzIDQgYnBwIG9yIDEgYnBwKS4KLUluIHRoaXMgY2FzZSB5b3UgY2VydGFpbmx5IG11c3Qgc3VwcGx5IHRoZSBtYXNrcyBhcwotd2VsbDogV3hIeEI6Ui9HL0IuICBUaGUgcGl4ZWxzIHdpbGwgYmUgcGFkZGVkIG91dCB0bwotOCBicHAgdXNpbmcgZGVwdGggOCB0cnVlY29sb3IuICBUaGUgc2NoZW1lIGN1cnJlbnRseQotZG9lcyBub3Qgd29yayB3aXRoIHNuYXAgZmIgKGFzayBpZiBpbnRlcmVzdGVkLikgQj0xCi1tb25vY2hyb21lIGV4YW1wbGU6IGZpbGU6L2Rldi91cmFuZG9tQDEyOHgxMjh4MToxLzEvMQotU29tZSBvdGhlciBsaWtlIHRoaXMgYXJlIDEyOHgxMjh4MjozLzMvMyAxMjh4MTI4eDQ6Ny83LzcKLS5JUAotRm9yIEIgPCA4IGZyYW1lYnVmZmVycyB5b3UgY2FuIGFsc28gc2V0IHRoZSBlbnYuIHZhcgotUkFXRkJfQ0dBPTEgdG8gdHJ5IGEgQ0dBIG1hcHBpbmcgZm9yIEI9NCAoZS5nLiBsaW51eAotdmdhMTZmYiBkcml2ZXIuKSAgTm90ZSB3aXRoIGxvdyBicHAgYW5kL29yIHJlc29sdXRpb24KLVZHQSBhbmQgVkdBMTYgbW9kZXMgb24gdGhlIExpbnV4IGNvbnNvbGUgb25lJ3MgYXR0ZW1wdAotdG8gZXhwb3J0IHRoZW0gdmlhIHgxMXZuYyBjYW4gb2Z0ZW4gYmUgdGh3YXJ0ZWQgZHVlIHRvCi1zcGVjaWFsIGNvbG9yIHBhbGV0dGVzLCBwaXhlbCBwYWNraW5ncywgYW5kIGV2ZW4gdmlkZW8KLXBhaW50aW5nIGJ1ZmZlcmluZy4gIE9UT0gsIG9mdGVuIGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUKLVJHQiBtYXNrcyBjYW4geWllbGQgc29tZXRoaW5nIHJlY29nbml6YWJsZS4KLS5JUAotVklERU80TElOVVg6IG9uIExpbnV4IHNvbWUgYXR0ZW1wdCBpcyBtYWRlIHRvIGhhbmRsZQotdmlkZW8gZGV2aWNlcyAod2ViY2FtcyBvciBUViB0dW5lcnMpIGF1dG9tYXRpY2FsbHkuCi1UaGUgaWRlYSBpcyB0aGUgV3hIeEIgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKLWRldmljZSBpdHNlbGYuICBTbyBpZiB5b3UgZG8gbm90IHN1cHBseSAiQFd4SHhCLi4uCi1wYXJhbWV0ZXJzIHgxMXZuYyB3aWxsIHRyeSB0byBkZXRlcm1pbmUgdGhlbS4gIEl0IGZpcnN0Ci10cmllcyB0aGUgdjRsIEFQSSBpZiB0aGF0IHN1cHBvcnQgaGFzIGJlZW4gY29tcGlsZWQgaW4uCi1PdGhlcndpc2UgaXQgd2lsbCBydW4gdGhlIHY0bC0KLS5JUiBpbmZvICgxKQotZXh0ZXJuYWwgcHJvZ3JhbQotaWYgaXQgaXMgYXZhaWxhYmxlLgotLklQCi1UaGUgc2ltcGxlc3QgZXhhbXBsZXMgYXJlICJcZkItcmF3ZmJcZlIgXGZJdmlkZW9cZlIiIGFuZCAiLXJhd2ZiCi12aWRlbzEiIHdoaWNoIGltcGx5IHRoZSBkZXZpY2UgZmlsZSAvZGV2L3ZpZGVvIGFuZAotL2Rldi92aWRlbzEsIHJlc3BlY3RpdmVseS4gIFlvdSBjYW4gYWxzbyBzdXBwbHkgdGhlCi0vZGV2IGlmIHlvdSBsaWtlLCBlLmcuICJcZkItcmF3ZmJcZlIgXGZJL2Rldi92aWRlbzBcZlIiCi0uSVAKLVNpbmNlIHRoZSB2aWRlbyBjYXB0dXJlIGRldmljZSBmcmFtZWJ1ZmZlciB1c3VhbGx5Ci1jaGFuZ2VzIGNvbnRpbnVvdXNseSAoZS5nLiBicmlnaHRuZXNzIGZsdWN0dWF0aW9ucyksCi15b3UgbWF5IHdhbnQgdG8gdXNlIHRoZSBcZkItd2FpdCxcZlIgXGZCLXNsb3dfZmIsXGZSIG9yIFxmQi1kZWZlclxmUgotb3B0aW9ucyB0byBsb3dlciB0aGUgImZyYW1lcmF0ZSIgdG8gY3V0IGRvd24gb24KLW5ldHdvcmsgVk5DIHRyYWZmaWMuCi0uSVAKLUEgbW9yZSBzb3BoaXN0aWNhdGVkIHZpZGVvIGRldmljZSBzY2hlbWUgYWxsb3dzCi1pbml0aWFsaXppbmcgdGhlIGRldmljZSdzIHNldHRpbmdzIHVzaW5nOgotLklQCi1cZkItcmF3ZmJcZlIgdmlkZW86PHNldHRpbmdzPgotLklQCi1UaGUgcHJlZml4IGNvdWxkIGFsc28gYmUsIGFzIGFib3ZlLCBlLmcuICJ2aWRlbzE6IiB0bwotc3BlY2lmeSB0aGUgZGV2aWNlIGZpbGUuICBUaGUgdjRsIEFQSSBtdXN0IGJlIGF2YWlsYWJsZQotZm9yIHRoaXMgdG8gd29yay4gIE90aGVyd2lzZSwgeW91IHdpbGwgbmVlZCB0byB0cnkKLXRvIGluaXRpYWxpemUgdGhlIGRldmljZSB3aXRoIGFuIGV4dGVybmFsIHByb2dyYW0sCi1lLmcuIHhhd3R2LCBzcGNhdmlldywgYW5kIGhvcGUgdGhleSBwZXJzaXN0IHdoZW4geDExdm5jCi1yZS1vcGVucyB0aGUgZGV2aWNlLgotLklQCi08c2V0dGluZ3M+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5PXZhbHVlIHBhaXJzLgotVGhlIGRldmljZSdzIGJyaWdodG5lc3MsIGNvbG9yLCBjb250cmFzdCwgYW5kIGh1ZSBjYW4KLWJlIHNldCB0byBwZXJjZW50YWdlcywgZS5nLiBicj04MCxjbz01MCxjbj00NCxodT02MC4KLS5JUAotVGhlIGRldmljZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHRvbyBpZiBuZWVkZWQgKGlmIGl0Ci1kb2VzIG5vdCBzdGFydCB3aXRoICJ2aWRlbyIpLCBlLmcuIGZuPS9kZXYvcWNhbS4KLS5JUAotVGhlIHdpZHRoLCBoZWlnaHQgYW5kIGJwcCBvZiB0aGUgZnJhbWVidWZmZXIgY2FuIGJlCi1zZXQgdmlhLCBlLmcuLCB3PTE2MCxoPTEyMCxicHA9MTYuCi0uSVAKLVJlbGF0ZWQgdG8gdGhlIGJwcCBhYm92ZSwgdGhlIHBpeGVsIGZvcm1hdCBjYW4gYmUgc2V0Ci12aWEgdGhlIGZtdD1YWFgsIHdoZXJlIFhYWCBjYW4gYmUgb25lIG9mOiBHUkVZLCBISTI0MCwKLVJHQjU1NSwgUkdCNTY1LCBSR0IyNCwgYW5kIFJHQjMyICh3aXRoIGJwcCA4LCA4LCAxNiwgMTYsCi0yNCwgYW5kIDMyIHJlc3BlY3RpdmVseSkuICBTZWUgaHR0cDovL3d3dy5saW51eHR2Lm9yZwotZm9yIG1vcmUgaW5mbyAoVjRMIGFwaSkuCi0uSVAKLUZvciBUVi9yZiB0dW5lciBjYXJkcyBvbmUgY2FuIHNldCB0aGUgdHVuaW5nIG1vZGUKLXZpYSB0dW49WFhYIHdoZXJlIFhYWCBjYW4gYmUgb25lIG9mIFBBTCwgTlRTQywgU0VDQU0sCi1vciBBVVRPLgotLklQCi1PbmUgY2FuIHN3aXRjaCB0aGUgaW5wdXQgY2hhbm5lbCBieSB0aGUgaW5wPVhYWCBzZXR0aW5nLAotd2hlcmUgWFhYIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBjaGFubmVsIChUZWxldmlzaW9uLAotQ29tcG9zaXRlMSwgUy1WaWRlbywgZXRjKS4gIFVzZSB0aGUgbmFtZSB0aGF0IGlzIGluIHRoZQotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB0aGF0IGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KLS5JUAotRm9yIGlucHV0IGNoYW5uZWxzIHdpdGggdHVuZXJzIChlLmcuIFRlbGV2aXNpb24pIG9uZQotY2FuIGNoYW5nZSB3aGljaCBzdGF0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBzdGE9WFhYCi1zZXR0aW5nLiAgWFhYIGlzIHRoZSBzdGF0aW9uIG51bWJlci4gIEN1cnJlbnRseSBvbmx5Ci10aGUgbnRzYy1jYWJsZS11cyAoVVMgY2FibGUpIGNoYW5uZWxzIGFyZSBidWlsdCBpbnRvCi14MTF2bmMuICBTZWUgdGhlIFxmQi1mcmVxdGFiXGZSIG9wdGlvbiBiZWxvdyB0byBzdXBwbHkgb25lCi1mcm9tIHhhd3R2LiBJZiBYWFggaXMgZ3JlYXRlciB0aGFuIDUwMCwgdGhlbiBpdCBpcwotaW50ZXJwcmV0ZWQgYXMgYSByYXcgZnJlcXVlbmN5IGluIEtIei4KLS5JUAotRXhhbXBsZToKLS5JUAotXGZCLXJhd2ZiXGZSIHZpZGVvOmJyPTgwLHc9MzIwLGg9MjQwLGZtdD1SR0IzMix0dW49TlRTQyxzdGE9NDcKLS5JUAotb25lIG1pZ2h0IG5lZWQgdG8gYWRkIGlucD1UZWxldmlzaW9uIHRvbyBmb3IgdGhlIGlucHV0Ci1jaGFubmVsIHRvIGJlIFRWIGlmIHRoZSBjYXJkIGRvZXNuJ3QgY29tZSB1cCBieSBkZWZhdWx0Ci1pbiB0aGF0IG9uZS4KLS5JUAotTm90ZSB0aGF0IG5vdCBhbGwgdmlkZW8gY2FwdHVyZSBkZXZpY2VzIHdpbGwgc3VwcG9ydAotYWxsIG9mIHRoZSBhYm92ZSBzZXR0aW5ncy4KLS5JUAotU2VlIHRoZSBcZkItcGlwZWlucHV0XGZSIFZJRCBvcHRpb24gYmVsb3cgZm9yIGEgd2F5IHRvIGNvbnRyb2wKLXRoZSBzZXR0aW5ncyB0aHJvdWdoIHRoZSBWTkMgVmlld2VyIHZpYSBrZXlzdHJva2VzLgotQXMgYSBzaG9ydGN1dCwgaWYgdGhlIHN0cmluZyBiZWdpbnMgIlZpZGVvLi4iIGluc3RlYWQKLW9mICJ2aWRlby4uIiB0aGVuIFxmQi1waXBlaW5wdXRcZlIgVklEIGlzIGltcGxpZWQuCi0uSVAKLUFzIGFib3ZlLCBpZiB5b3Ugc3BlY2lmeSBhICJAV3hIeEIuLi4iIGFmdGVyIHRoZQotPHNldHRpbmdzPiBzdHJpbmcgdGhleSBhcmUgdXNlZCB2ZXJiYXRpbTogdGhlIGRldmljZQotaXMgbm90IHF1ZXJpZWQgZm9yIHRoZSBjdXJyZW50IHZhbHVlcy4gIE90aGVyd2lzZSB0aGUKLWRldmljZSB3aWxsIGJlIHF1ZXJpZWQuCi0uSVAKLUxJTlVYIENPTlNPTEU6ICBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyBzb21lIHdheXMgdG8KLXZpZXcgYW5kIHBvc3NpYmx5IGludGVyYWN0IHdpdGggdGhlIExpbnV4IHRleHQvZ3JhcGhpY3MKLWNvbnNvbGUgKGkuZS4gbm90IFgxMSBYRnJlZTg2L1hvcmcpCi0uSVAKLU5vdGU6IElmIHRoZSBMaWJWTkNTZXJ2ZXIgTGludXhWTkMgcHJvZ3JhbSBpcyBvbiB5b3VyCi1zeXN0ZW0geW91IG1heSB3YW50IHRvIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZwotbWV0aG9kIGJlY2F1c2UgaXQgd2lsbCBiZSBmYXN0ZXIgYW5kIG1vcmUgYWNjdXJhdGUKLWZvciB0aGUgTGludXggdGV4dCBjb25zb2xlIGFuZCBpbmNsdWRlcyBtb3VzZSBzdXBwb3J0LgotVGhlcmUgaXMsIGhvd2V2ZXIsIHRoZSBiYXNpYyBMaW51eFZOQyBmdW5jdGlvbmFsaXR5IGluCi14MTF2bmMgaWYgeW91IHJlcGxhY2UgImNvbnNvbGUiIHdpdGggInZ0IiBpbiB0aGUKLWV4YW1wbGVzIGJlbG93LgotLklQCi1JZiB0aGUgcmF3ZmIgc3RyaW5nIGJlZ2lucyB3aXRoICJjb25zb2xlIiB0aGUKLWZyYW1lYnVmZmVyIGRldmljZSAvZGV2L2ZiMCBpcyBvcGVuZWQgYW5kIC9kZXYvdHR5MCBpcwotb3BlbmVkIHRvby4gIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBpbmplY3Qga2V5c3Ryb2tlcwotKG5vdCBhbGwgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZSBiYXNpYyBvbmVzIGFyZSkuCi1Zb3Ugd2lsbCBuZWVkIHRvIGJlIHJvb3QgdG8gaW5qZWN0IGtleXN0cm9rZXMsIGJ1dAotbm90IG5lY2Vzc2FyaWx5IHRvIG9wZW4gL2Rldi9mYjAuICAvZGV2L3R0eTAgcmVmZXJzIHRvCi10aGUgYWN0aXZlIFZULCB0byBpbmRpY2F0ZSBvbmUgZXhwbGljaXRseSwgdXNlLCBlLmcuLAotImNvbnNvbGUyIiBmb3IgL2Rldi90dHkyLCBldGMuIGJ5IGluZGljYXRpbmcgdGhlCi1zcGVjaWZpYyBWVCBudW1iZXIuCi0uSVAKLUZvciB0aGUgTGludXggZnJhbWVidWZmZXIgZGV2aWNlLCAvZGV2L2ZiMCwgKGZiMSwKLWV0YykgdG8gYmUgZW5hYmxlZCB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGRyaXZlcnMgbXVzdAotYmUgbG9hZGVkLiAgRS5nLiB2ZXNhZmIgb3IgdmdhMTZmYiBhbmQgYWxzbyBieSBzZXR0aW5nCi10aGUgYm9vdCBwYXJhbWV0ZXIgdmdhPTB4MzAxIChvciAweDMxNCwgMHgzMTcsIGV0Yy4pCi0oVGhlIHZnYT0uLi4gbWV0aG9kIGlzIHRoZSBwcmVmZXJyZWQgd2F5OyBzZXQgeW91cgotbWFjaGluZXMgdXAgdGhhdCB3YXkuKSAgT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYQotXCdObyBzdWNoIGRldmljZScgZXJyb3IuICBZb3UgY2FuIGFsc28gbG9hZCBhIExpbnV4Ci1mcmFtZWJ1ZmZlciBkcml2ZXIgc3BlY2lmaWMgdG8geW91ciBtYWtlIG9mIHZpZGVvIGNhcmQKLWZvciBtb3JlIGZ1bmN0aW9uYWxpdHkuICBPbmNlIHRoZSBtYWNoaW5lIGlzIGJvb3RlZCBvbmUKLWNhbiBvZnRlbiAnbW9kcHJvYmUnIHRoZSBmYiBkcml2ZXIgYXMgcm9vdCB0byBvYnRhaW4KLWEgZnJhbWVidWZmZXIgZGV2aWNlLgotLklQCi1JZiB5b3UgY2Fubm90IGdldCAvZGV2L2ZiMCB3b3JraW5nIG9uIExpbnV4LCB0cnkKLXVzaW5nIHRoZSBMaW51eFZOQyBlbXVsYXRpb24gbW9kZSBieSAiXGZCLXJhd2ZiXGZSIFxmSXZ0TlxmUiIKLXdoZXJlIE4gPSAxLCAuLi4gNiBpcyB0aGUgTGludXggVmlydHVhbCBUZXJtaW5hbCAoYWthCi12aXJ0dWFsIGNvbnNvbGUpIHlvdSB3aXNoIHRvIHZpZXcsIGUuZy4gIlxmQi1yYXdmYlxmUiBcZkl2dDJcZlIiLgotVW5saWtlIC9kZXYvZmIgbW9kZSwgaXQgbmVlZCBub3QgYmUgdGhlIGFjdGl2ZSBWaXJ0dWFsCi1UZXJtaW5hbC4gIE5vdGUgdGhhdCB0aGlzIG1vZGUgY2FuIG9ubHkgc2hvdyB0ZXh0IGFuZAotbm90IGdyYXBoaWNzLiAgeDExdm5jIHBvbGxzIHRoZSB0ZXh0IGluIC9kZXYvdmNzYU4KLS5JUAotU2V0IHRoZSBlbnYuIHZhci4gUkFXRkJfVkNTQV9CVz0xIHRvIGRpc2FibGUgY29sb3JzIGluCi10aGUgInZ0TiIgbW9kZSAoaS5lLiBibGFjayBhbmQgd2hpdGUgb25seS4pICBJZiB5b3UKLWRvIG5vdCBwcmVmZXIgdGhlIGRlZmF1bHQgMTZicHAgc2V0IFJBV0ZCX1ZDU0FfQlBQIHRvCi04IG9yIDMyLiAgSWYgeW91IG5lZWQgdG8gdHdlYWsgdGhlIHJhd2ZiIHBhcmFtZXRlcnMgYnkKLXVzaW5nIHRoZSAnY29uc29sZV9ndWVzcycgc3RyaW5nIHByaW50ZWQgYXQgc3RhcnR1cCwKLWJlIHN1cmUgdG8gaW5kaWNhdGUgdGhlIHNuYXA6IG1ldGhvZC4KLS5JUAotdWlucHV0OiBJZiB0aGUgTGludXggdmVyc2lvbiBhcHBlYXJzIHRvIGJlIDIuNgotb3IgbGF0ZXIgYW5kIHRoZSAidWlucHV0IiBtb2R1bGUgYXBwZWFycyB0byBiZQotcHJlc2VudCAobW9kcHJvYmUgdWlucHV0KSwgdGhlbiB0aGUgdWlucHV0IG1ldGhvZAotd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgL2Rldi90dHlOLiAgdWlucHV0IGFsbG93cwotaW5zZXJ0aW9uIG9mIEJPVEgga2V5c3Ryb2tlcyBhbmQgbW91c2UgaW5wdXQgYW5kIHNvIGl0Ci1wcmVmZXJyZWQgd2hlbiBhY2Nlc3NpbmcgZ3JhcGhpY2FsIChlLmcuIFFULWVtYmVkZGVkKQotbGludXggY29uc29sZSBhcHBzLiAgSXQgYWxzbyBwcm92aWRlcyBtb3JlIGFjY3VyYXRlCi1rZXlzdHJva2UgaW5zZXJ0aW9uLiAgU2VlIFxmQi1waXBlaW5wdXRcZlIgVUlOUFVUIGJlbG93IGZvcgotbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIG1vZGU7IHlvdSB3aWxsIGhhdmUgdG8gdXNlCi1cZkItcGlwZWlucHV0XGZSIGlmIHlvdSB3YW50IHRvIHR3ZWFrIGFueSBVSU5QVVQgcGFyYW1ldGVycy4KLVlvdSBtYXkgYWxzbyB3YW50IHRvIGFsc28gdXNlIHRoZSBcZkItbm9kcmFnZ2luZ1xmUiBhbmQKLVxmQi1jdXJzb3JcZlIgbm9uZSBvcHRpb25zLiAgVXNlICJjb25zb2xlMCIsIGV0YyAgb3IKLVxmQi1waXBlaW5wdXRcZlIgQ09OU09MRSB0byBmb3JjZSB0aGUgL2Rldi90dHlOIG1ldGhvZC4KLS5JUAotTm90ZSB5b3UgY2FuIGNoYW5nZSB0aGUgTGludXggVlQgcmVtb3RlbHkgdXNpbmcgdGhlCi0uSVIgY2h2dCAoMSkKLWNvbW1hbmQgdG8gbWFrZSB0aGUgb25lIHlvdSB3YW50IGJlIHRoZSBhY3RpdmUKLW9uZSAoZS5nLiAnY2h2dCAzJykuICBTb21ldGltZXMgc3dpdGNoaW5nIG91dCBhbmQgYmFjawotY29ycmVjdHMgdGhlIGZyYW1lYnVmZmVyJ3MgZ3JhcGhpY3Mgc3RhdGUuICBGb3IgdGhlCi0iXGZCLXJhd2ZiXGZSIFxmSXZ0TlxmUiIgbW9kZSB0aGVyZSBpcyBubyBuZWVkIHRvIHN3aXRjaCB0aGUgVlQncy4KLS5JUAotVG8gc2tpcCBpbnB1dCBpbmplY3RpbmcgZW50aXJlbHkgdXNlICJjb25zb2xleCIKLW9yICJ2dHgiLgotLklQCi1UaGUgc3RyaW5nICIvZGV2L2ZiMCIgKDEsIGV0Yy4pIGNhbiBiZSB1c2VkIGluc3RlYWQKLW9mICJjb25zb2xlIi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudAotZnJhbWVidWZmZXIgZGV2aWNlLCBlLmcuIC9kZXYvZmIxLiAgQXMgYSBzaG9ydGN1dCB0aGUKLSIvZGV2LyIgY2FuIGJlIGRyb3BwZWQuICBJZiB0aGUgbmFtZSBpcyBzb21ldGhpbmcKLW5vbnN0YW5kYXJkLCB1c2UgImNvbnNvbGU6L2Rldi9mb29mYiIKLS5JUAotSWYgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBndWVzcyB0aGUgZnJhbWVidWZmZXIncwotV3hIeEIgYW5kIG1hc2tzIGF1dG9tYXRpY2FsbHkgKHNvbWV0aW1lcyB0aGUga2VybmVsCi1naXZlcyBpbmNvcnJlY3QgaW5mb3JtYXRpb24pLCBzcGVjaWZ5IHRoZW0gd2l0aCBhIEBXeEh4QgotKGFuZCBvcHRpb25hbCA6Ui9HL0IgbWFza3MpIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLS5JUAotRXhhbXBsZXM6Ci1cZkItcmF3ZmJcZlIgY29uc29sZQotXGZCLXJhd2ZiXGZSIC9kZXYvZmIwICAgICAgICAgICAoc2FtZSkKLVxmQi1yYXdmYlxmUiBjb25zb2xlMyAgICAgICAgICAgKGZvcmNlIC9kZXYvdHR5MykKLVxmQi1yYXdmYlxmUiBjb25zb2xleCAgICAgICAgICAgKG5vIGtleXN0cm9rZXMgb3IgbW91c2UpCi1cZkItcmF3ZmJcZlIgY29uc29sZTovZGV2L25vbnN0ZAotXGZCLXJhd2ZiXGZSIGNvbnNvbGUgXGZCLXBpcGVpbnB1dFxmUiBVSU5QVVQ6YWNjZWw9NC4wCi1cZkItcmF3ZmJcZlIgdnQzICAgICAgICAgICAgICAgICgvZGV2L3R0eTMgdy9vIC9kZXYvZmIwKQotLklQCi1WTkMgSE9TVDogaWYgdGhlIFxmQi1yYXdmYlxmUiBzdHJpbmcgaXMgb2YgdGhlIGZvcm0KLSJ2bmM6aG9zdDpOIiB0aGVuIHRoZSBWTkMgZGlzcGxheSAiTiIgb24gdGhlIHJlbW90ZQotVk5DIHNlcnZlciAiaG9zdCIgaXMgY29ubmVjdGVkIHRvIChpLmUuIHgxMXZuYyBhY3RzIGFzCi1hIFZOQyBjbGllbnQgaXRzZWxmKSBhbmQgdGhhdCBmcmFtZWJ1ZmZlciBpcyBleHBvcnRlZC4KLS5JUAotVGhpcyBtb2RlIGlzIHJlYWxseSBvbmx5IG9mIHVzZSBpZiB5b3UgYXJlIHRyeWluZwotdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiB0aGUgY2FzZSBvZiBtYW55IChlLmcuID4KLTEwKSBzaW11bHRhbmVvdXMgVk5DIHZpZXdlcnMsIGFuZCB5b3UgdHJ5IGEgZGl2aWRlCi1hbmQgY29ucXVlciBzY2hlbWUgdG8gcmVkdWNlIGJhbmR3aWR0aCBhbmQgaW1wcm92ZQotcmVzcG9uc2l2ZW5lc3MuICAoSG93ZXZlciwgYW5vdGhlciB1c2VyIGZvdW5kIHRoaXMgbW9kZQotdXNlZnVsIHRvIGV4cG9ydCBhIGRlbW8gZGlzcGxheSB0aHJvdWdoIGEgc2xvdyBsaW5rOgotdGhlbiBtdWx0aXBsZSBkZW1vIHZpZXdlcnMgY29ubmVjdGVkIHRvIHRoZSByZWZsZWN0aW5nCi14MTF2bmMgb24gdGhlIGZhc3Qgc2lkZSBvZiB0aGUgbGluaywgYW5kIHNvIGF2b2lkZWQKLWFsbCBvZiB0aGUgZGVtbyB2aWV3ZXJzIGdvaW5nIHRocm91Z2ggdGhlIHNsb3cgbGluay4pCi0uSVAKLUZvciBleGFtcGxlLCBpZiB0aGVyZSB3aWxsIGJlIDY0IHNpbXVsdGFuZW91cyBWTkMKLXZpZXdlcnMgdGhpcyBjYW4gbGVhZCB0byBhIGxvdCBvZiByZWR1bmRhbnQgVk5DIHRyYWZmaWMKLXRvIGFuZCBmcm9tIHRoZSBzZXJ2ZXIgaG9zdDpOLCBleHRyYSBDUFUgdXNhZ2UsCi1hbmQgYWxsIHZpZXdlcnMgcmVzcG9uc2UgY2FuIGJlIHJlZHVjZWQgYnkgaGF2aW5nCi10byB3YWl0IGZvciB3cml0ZXMgdG8gdGhlIHNsb3dlc3QgY2xpZW50IHRvIGZpbmlzaC4KLUhvd2V2ZXIsIGlmIHlvdSBzZXQgdXAgOCByZWZsZWN0b3JzL3JlcGVhdGVycyBzdGFydGVkCi13aXRoIG9wdGlvbiBcZkItcmF3ZmJcZlIgdm5jOmhvc3Q6TiwgdGhlbiB0aGVyZSBhcmUgb25seQotOCBjb25uZWN0aW9ucyB0byBob3N0Ok4uICBFYWNoIHJlcGVhdGVyIHRoZW4gaGFuZGxlcwotOCB2bmMgdmlld2VyIGNvbm5lY3Rpb25zIHRoZXJlYnkgc3ByZWFkaW5nIHRoZSBsb2FkCi1hcm91bmQuICBJbiBjbGFzc3Jvb20gYnJvYWRjYXN0IHVzYWdlLCB0cnkgdG8gcHV0IHRoZQotcmVwZWF0ZXJzIG9uIGRpZmZlcmVudCBzd2l0Y2hlcy4gIFRoaXMgbW9kZSBpcyB0aGUgc2FtZQotYXMgXGZCLXJlZmxlY3RcZlIgaG9zdDpOLiAgUmVwbGFjZSAiaG9zdDpOIiBieSAibGlzdGVuIgotb3IgImxpc3Rlbjpwb3J0IiBmb3IgYSByZXZlcnNlIGNvbm5lY3Rpb24uCi0uSVAKLU92ZXJhbGwgcGVyZm9ybWFuY2Ugd2lsbCBub3QgYmUgYXMgZ29vZCBhcyBhIHNpbmdsZQotZGlyZWN0IGNvbm5lY3Rpb24gYmVjYXVzZSwgYW1vbmcgb3RoZXIgdGhpbmdzLAotdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBmcmFtZWJ1ZmZlciBwb2xsaW5nCi1hbmQgcG9pbnRlciBtb3Rpb24gY2FuIHN0aWxsIGluZHVjZSBtYW55IGNoYW5nZXMgcGVyCi1zZWNvbmQgdGhhdCBtdXN0IGJlIHByb3BhZ2F0ZWQuICBUaXA6IGlmIHRoZSByZW1vdGUgVk5DCi1pcyB4MTF2bmMgZG9pbmcgd2lyZWZyYW1pbmcsIG9yIGFuIFggZGlzcGxheSB0aGF0IGRvZXMKLXdpcmVmcmFtaW5nIHRoYXQgZ2l2ZXMgbXVjaCBiZXR0ZXIgcmVzcG9uc2UgdGhhbiBvcGFxdWUKLXdpbmRvdyBkcmFnZ2luZy4gIENvbnNpZGVyIHRoZSBcZkItbm9kcmFnZ2luZ1xmUiBvcHRpb24gaWYKLXRoZSBwcm9ibGVtIGlzIHNldmVyZS4KLS5JUAotVGhlIGVudi4gdmFyLiBYMTFWTkNfUkVGTEVDVF9QQVNTV09SRCBjYW4gYmUgc2V0IHRvCi10aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGxvZyBpbnRvIHRoZSB2bmMgaG9zdCBzZXJ2ZXIsIG9yCi10byAiZmlsZTpwYXRoX3RvX2ZpbGUiIHRvIGluZGljYXRlIGEgZmlsZSBjb250YWluaW5nCi10aGUgcGFzc3dvcmQgYXMgaXRzIGZpcnN0IGxpbmUuCi0uSVAKLVRvIHNldCB0aGUgcGl4ZWwgZm9ybWF0IHRoYXQgeDExdm5jIHJlcXVlc3RzIGFzIGEgVk5DCi1DTElFTlQgc2V0IHRoZSBlbnYuIHZhcnM6IFgxMVZOQ19SRUZMRUNUX2JpdHNQZXJTYW1wbGUKLVgxMVZOQ19SRUZMRUNUX3NhbXBsZXNQZXJQaXhlbCwgYW5kCi1YMTFWTkNfUkVGTEVDVF9ieXRlc1BlclBpeGVsOyB0aGUgZGVmYXVsdHMgYXJlIDgsIDMsIDQuCi0yLCAzLCAxIHdvdWxkIGdpdmUgYSBsb3cgY29sb3IgbW9kZS4gIFNlZSB0aGUgZnVuY3Rpb24KLXJmYkdldENsaWVudCgpIGluIGxpYnZuY2NsaWVudCBmb3IgbW9yZSBpbmZvLgotLklQCi1UaGUgVk5DIEhPU1QgbW9kZSBpbXBsaWVzIFxmQi1zaGFyZWQuXGZSICBVc2UgXGZCLW5vc2hhcmVkXGZSIGFzCi1hIHN1YnNlcXVlbnQgY21kbGluZSBvcHRpb24gdG8gZGlzYWJsZSBzaGFyaW5nLgotLlBQCi1cZkItZnJlcXRhYlxmUiBcZklmaWxlXGZSCi0uSVAKLUZvciB1c2Ugd2l0aCAiXGZCLXJhd2ZiXGZSIFxmSXZpZGVvXGZSIiBmb3IgVFYgdHVuZXIgZGV2aWNlcyB0bwotc3BlY2lmeSBzdGF0aW9uIGZyZXF1ZW5jaWVzLiAgSW5zdGVhZCBvZiB1c2luZyB0aGUgYnVpbHQKLWluIG50c2MtY2FibGUtdXMgbWFwcGluZyBvZiBzdGF0aW9uIG51bWJlciB0byBmcmVxdWVuY3ksCi11c2UgdGhlIGRhdGEgaW4gZmlsZS4gIEZvciBzdGF0aW9ucyB0aGF0IGFyZSBub3QKLW51bWVyaWMsIGUuZy4gU0UyMCwgdGhleSBhcmUgcGxhY2VkIGFib3ZlIHRoZSBoaWdoZXN0Ci1udW1iZXJlZCBzdGF0aW9uIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZC4gIEV4YW1wbGU6Ci0iXGZCLWZyZXF0YWJcZlIgXGZJL3Vzci9YMTFSNi9zaGFyZS94YXd0di9ldXJvcGUtd2VzdC5saXN0XGZSIgotWW91IGNhbiBtYWtlIHlvdXIgb3duIGZyZXF0YWIgYnkgY29weWluZyB0aGUgeGF3dHYKLWZvcm1hdC4KLS5QUAotXGZCLXBpcGVpbnB1dFxmUiBcZkljbWRcZlIKLS5JUAotVGhpcyBvcHRpb24gbGV0cyB5b3Ugc3VwcGx5IGFuIGV4dGVybmFsIGNvbW1hbmQgaW4KLVxmSWNtZFxmUiB0aGF0IHgxMXZuYyB3aWxsIHBpcGUgYWxsIG9mIHRoZSB1c2VyIGlucHV0Ci1ldmVudHMgdG8gaW4gYSBzaW1wbGUgZm9ybWF0LiAgSW4gXGZCLXBpcGVpbnB1dFxmUiBtb2RlIGJ5Ci1kZWZhdWx0IHgxMXZuYyB3aWxsIG5vdCBwcm9jZXNzIGFueSBvZiB0aGUgdXNlciBpbnB1dAotZXZlbnRzLiAgSWYgeW91IHByZWZpeCBcZkljbWRcZlIgd2l0aCAidGVlOiIgaXQgd2lsbAotYm90aCBzZW5kIHRoZW0gdG8gdGhlIHBpcGUgY29tbWFuZCBhbmQgcHJvY2VzcyB0aGVtLgotRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCBydW4gIi1waXBlaW5wdXQKLXRlZTovYmluL2NhdCIuICBBbm90aGVyIHByZWZpeCBpcyAicmVvcGVuIiB3aGljaAotbWVhbnMgdG8gcmVvcGVuIHBpcGUgaWYgaXQgZXhpdHMuICBTZXBhcmF0ZSBtdWx0aXBsZQotcHJlZml4ZXMgd2l0aCBjb21tYXMuCi0uSVAKLUluIGNvbWJpbmF0aW9uIHdpdGggXGZCLXJhd2ZiXGZSIG9uZSBtaWdodCBiZSBhYmxlIHRvCi1kbyBhbXVzaW5nIHRoaW5ncyAoZS5nLiBjb250cm9sIG5vbi1YIGRldmljZXMpLgotVG8gZmFjaWxpdGF0ZSB0aGlzLCBpZiBcZkItcmF3ZmJcZlIgaXMgaW4gZWZmZWN0IHRoZW4gdGhlCi12YWx1ZSBpcyBzdG9yZWQgaW4gWDExVk5DX1JBV0ZCX1NUUiBmb3IgdGhlIHBpcGUgY29tbWFuZAotdG8gdXNlIGlmIGl0IHdhbnRzLiBEbyAnZW52IHwgZ3JlcCBYMTFWTkMnIGZvciBtb3JlLgotLklQCi1CdWlsdC1pbiBwaXBlaW5wdXQgbW9kZXMgKG5vIGV4dGVybmFsIHByb2dyYW0gcmVxdWlyZWQpOgotLklQCi1JZiBjbWQgaXMgIlZJRCIgYW5kIHlvdSBhcmUgdXNpbmcgdGhlIFxmQi1yYXdmYlxmUiBmb3IgYQotdmlkZW8gY2FwdHVyZSBkZXZpY2UsIHRoZW4gYW4gaW50ZXJuYWwgbGlzdCBvZiBrZXlib2FyZAotbWFwcGluZ3MgaXMgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBvZiB0aGUgdmlkZW8uCi1UaGUgbWFwcGluZ3MgYXJlOgotLklQCi0iQiIgYW5kICJiIiBhZGp1c3QgdGhlIGJyaWdodG5lc3MgdXAgYW5kIGRvd24uCi0iSCIgYW5kICJoIiBhZGp1c3QgdGhlIGh1ZS4KLSJDIiBhbmQgImMiIGFkanVzdCB0aGUgY29sb3VyLgotIk4iIGFuZCAibiIgYWRqdXN0IHRoZSBjb250cmFzdC4KLSJTIiBhbmQgInMiIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY2FwdHVyZSBzY3JlZW4uCi0iSSIgYW5kICJpIiBjeWNsZSB0aHJvdWdoIGlucHV0IGNoYW5uZWxzLgotVXAgYW5kIERvd24gYXJyb3dzIGFkanVzdCB0aGUgc3RhdGlvbiAoaWYgYSB0dW5lcikKLUYxLCBGMiwgLi4uLCBGNiB3aWxsIHN3aXRjaCB0aGUgdmlkZW8gY2FwdHVyZSBwaXhlbAotZm9ybWF0IHRvIEhJMjQwLCBSR0I1NjUsIFJHQjI0LCBSR0IzMiwgUkdCNTU1LCBhbmQKLUdSRVkgcmVzcGVjdGl2ZWx5LiAgU2VlIFxmQi1yYXdmYlxmUiB2aWRlbyBmb3IgZGV0YWlscy4KLS5JUAotSWYgY21kIGlzICJDT05TT0xFIiBvciAiQ09OU09MRW4iIHdoZXJlIG4KLWlzIGEgTGludXggY29uc29sZSBudW1iZXIsIHRoZW4gdGhlIGxpbnV4IGNvbnNvbGUKLWtleXN0cm9rZSBpbnNlcnRpb24gdG8gL2Rldi90dHlOIChzZWUgXGZCLXJhd2ZiXGZSIGNvbnNvbGUpCi1pcyBwZXJmb3JtZWQuCi0uSVAKLUlmIGNtZCBiZWdpbnMgd2l0aCAiVUlOUFVUIiB0aGVuIHRoZSBMaW51eCB1aW5wdXQKLW1vZHVsZSBpcyB1c2VkIHRvIGluc2VydCBib3RoIGtleXN0cm9rZSBhbmQgbW91c2UgZXZlbnRzCi10byB0aGUgTGludXggY29uc29sZSAoc2VlIFxmQi1yYXdmYlxmUiBhYm92ZSkuICBUaGlzIHVzdWFsbHkKLWlzIHRoZSAvZGV2L2lucHV0L3VpbnB1dCBkZXZpY2UgZmlsZSAoeW91IG1heSBuZWVkIHRvCi1jcmVhdGUgaXQgd2l0aCAibWtub2QgL2Rldi9pbnB1dC91aW5wdXQgYyAxMCAyMjMiCi1hbmQgaW5zZXJ0IHRoZSBtb2R1bGUgd2l0aCAibW9kcHJvYmUgdWlucHV0Ii4KLS5JUAotVGhlIFVJTlBVVCBtb2RlIGN1cnJlbnRseSBvbmx5IGRvZXMgVVMga2V5Ym9hcmRzIChhCi1zY2FuIGNvZGUgb3B0aW9uIG1heSBiZSBhZGRlZCksIGFuZCBub3QgYWxsIGtleXN5bXMKLWFyZSBzdXBwb3J0ZWQuICBCdXQgaXQgaXMgcHJvYmFibHkgbW9yZSBhY2N1cmF0ZSB0aGFuCi10aGUgIkNPTlNPTEUiIG1ldGhvZC4KLS5JUAotWW91IG1heSB3YW50IHRvIHVzZSB0aGUgb3B0aW9ucyBcZkItY3Vyc29yXGZSIG5vbmUgYW5kCi1cZkItbm9kcmFnZ2luZ1xmUiBpbiB0aGlzIG1vZGUuCi0uSVAKLUFkZGl0aW9uYWwgdHVuaW5nIG9wdGlvbnMgbWF5IGJlIHN1cHBsaWVkIHZpYToKLVVJTlBVVDpvcHQxLG9wdDIsLi4uIChhIGNvbW1hIHNlcGFyYXRlZCBsaXN0KS4gSWYgYW4KLW9wdGlvbiBiZWdpbnMgd2l0aCAiLyIgaXQgaXMgdGFrZW4gYXMgdGhlIHVpbnB1dAotZGV2aWNlIGZpbGUuCi0uSVAKLVdoaWNoIHVpbnB1dCBpcyBpbmplY3RlZCBjYW4gYmUgY29udHJvbGxlZCBieSBhbiBvcHRpb24KLXN0cmluZyBtYWRlIG9mIHRoZSBjaGFyYWN0ZXJzICJLIiwgIk0iLCBhbmQgIkIiCi0oc2VlIHRoZSBcZkItaW5wdXRcZlIgb3B0aW9uKSwgZS5nLiAiS00iIGFsbG93cyBrZXlzdHJva2UKLWFuZCBtb3Rpb24gYnV0IG5vdCBidXR0b24gY2xpY2tzLgotLklQCi1BIFVJTlBVVCBvcHRpb24gb2YgdGhlIGZvcm06IGFjY2VsPWYsIG9yIGFjY2VsPWZ4K2Z5Ci1zZXRzIHRoZSBtb3VzZSBtb3Rpb24gImFjY2VsZXJhdGlvbiIuICBUaGlzIGlzIHVzZWQKLXRvIGNvcnJlY3QgcmF3IG1vdXNlIHJlbGF0aXZlIG1vdGlvbiBpbnRvIGhvdyBtdWNoIHRoZQotYXBwbGljYXRpb24gY3Vyc29yIG1vdmVzICh4MTF2bmMgaGFzIG5vIGNvbnRyb2wgb3ZlciwKLW9yIGtub3dsZWRnZSBvZiBob3cgdGhlIHdpbmRvd2luZyBhcHBsaWNhdGlvbiBpbnRlcnByZXRzCi10aGUgcmF3IG1vdXNlIG1vdGlvbnMpLiAgVHlwaWNhbGx5IHRoZSBhY2NlbGVyYXRpb24KLWZvciBhbiBYIGRpc3BsYXkgaXMgMiAoc2VlIHhzZXQgIm0iIG9wdGlvbikuICAiZiIKLWlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlLmcuIDMuMC4gIFVzZSAiZngrZnkiCi1pZiB5b3UgbmVlZCB0byBzdXBwbHkgZGlmZmVyZW50IGNvcnJlY3Rpb25zIGZvciB4IGFuZCB5LgotLklQCi1Ob3RlOiB0aGUgZGVmYXVsdCBhY2NlbGVyYXRpb24gaXMgMi4wIHNpbmNlIGl0IHNlZW1zCi1ib3RoIFggYW5kIHF0LWVtYmVkZGVkIG9mdGVuIChidXQgbm90IGFsd2F5cykgdXNlCi10aGlzIHZhbHVlLgotLklQCi1FdmVuIHdpdGggYSBjb3JyZWN0IGFjY2VsIHNldHRpbmcgdGhlIG1vdXNlIHBvc2l0aW9uCi13aWxsIGdldCBvdXQgb2Ygc3luYyAocHJvYmFibHkgZHVlIHRvIGEgbW91c2UKLSJ0aHJlc2hvbGQiIHNldHRpbmcgd2hlcmUgdGhlIGFjY2VsZXJhdGlvbiBkb2Ugbm90Ci1hcHBseSwgc2V0IAotLklSIHhzZXQgKDEpCi0pLiAgVGhlIG9wdGlvbiByZXNldD1OIHNldHMgdGhlCi1udW1iZXIgb2YgbXMgKGRlZmF1bHQgMTUwKSBhZnRlciB3aGljaCB0aGUgY3Vyc29yIGlzCi1hdHRlbXB0ZWQgdG8gYmUgcmVzZXQgKGJ5IGZvcmNpbmcgdGhlIG1vdXNlIHRvICgwLAotMCkgdmlhIHNtYWxsIGluY3JlbWVudHMgYW5kIHRoZW4gYmFjayBvdXQgdG8gKHgsIHkpCi1pbiAxIGp1bXApLCBUaGlzIGNvcnJlY3Rpb24gc2VlbXMgdG8gYmUgbmVlZGVkIGJ1dCBjYW4KLWNhdXNlIGplcmtpbmVzcyBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIHdpdGggbWVudXMsIGV0Yy4KLVVzZSByZXNldD0wIHRvIGRpc2FibGUuCi0uSVAKLUlmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19VSU5QVVRfVEhSRVNIT0xEUyB0aGVuCi10aGUgdGhyZXNoPW4gbW9kZSB3aWxsIGJlIGVuYWJsZWQuICBJdCBpcyBjdXJyZW50bHkKLW5vdCB3b3JraW5nIHdlbGwuICBJZiB8ZHh8IDw9IHRocmVzaCBhbmQgfGR5fCA8IHRocmVzaAotbm8gYWNjZWxlcmF0aW9uIGlzIGFwcGxpZWQuICBVc2UgInRocmVzaD0rbiIgfGR4fCArCi18ZHl8IDwgdGhyZXNoIHRvIGJlIHVzZWQgaW5zdGVhZCAoWDExPykKLS5JUAotRXhhbXBsZToKLVxmQi1waXBlaW5wdXRcZlIgVUlOUFVUOmFjY2VsPTQuMCBcZkItY3Vyc29yXGZSIG5vbmUKLS5JUAotSWYgdGhlIHVpbnB1dCBkZXZpY2UgaGFzIGFuIGFic29sdXRlIHBvaW50ZXIgKGFzIG9wcG9zZWQKLXRvIGEgbm9ybWFsIG1vdXNlIHRoYXQgaXMgYSByZWxhdGl2ZSBwb2ludGVyKSB5b3UgY2FuCi1zcGVjaWZ5IHRoZSBvcHRpb24gImFicyIuICBOb3RlIHRoYXQgYSB0b3VjaHBhZAotb24gYSBsYXB0b3AgaXMgYW4gYWJzb2x1dGUgZGV2aWNlIHRvIHNvbWUgZGVncmVlLgotVGhpcyAodXN1YWxseSkgYXZvaWRzIGFsbCB0aGUgcHJvYmxlbXMgd2l0aCBtb3VzZQotYWNjZWxlcmF0aW9uLiAgSWYgeDExdm5jIGhhcyB0cm91YmxlIGRlZHVjaW5nIHRoZQotc2l6ZSBvZiB0aGUgZGV2aWNlLCB1c2UgImFicz1XeEgiLiAgRnVydGhlcm1vcmUsCi1pZiB0aGUgZGV2aWNlIGlzIGEgdG91Y2hzY3JlZW4gKGFzc3VtZWQgdG8gaGF2ZSBhbgotYWJzb2x1dGUgcG9pbnRlcikgdXNlICJ0b3VjaCIgb3IgInRvdWNoPVd4SCIuCi1Gb3IgdG91Y2hzY3JlZW5zLCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQsCi1hIHByZXNzdXJlIGluY3JlYXNlIGlzIGluamVjdGVkLCBhbmQgd2hlbiB0aGUgYnV0dG9uCi1pcyByZWxlYXNlZCBhIHByZXNzdXJlIG9mIHplcm8gaXMgaW5qZWN0ZWQuCi0uSVAKLUlmIHRvdWNoIGhhcyBiZWVuIHNldCwgdXNlICJ0b3VjaF9hbHdheXM9MSIgdG8KLWluZGljYXRlIHdoZW5ldmVyIHRoZSBtb3VzZSBtb3ZlcyB3aXRoIG5vIGJ1dHRvbgotcHJlc3NlZCwgYSB0b3VjaCBldmVudCBvZiB6ZXJvIHByZXNzdXJlIHNob3VsZCBiZQotc2VudCBhbnl3YXkuICBBbHNvIHVzZSAiYnRuX3RvdWNoPTEiIHRvIGluZGljYXRlIGEKLUJUTl9UT1VDSCBrZXlzdHJva2UgcHJlc3Mgb3IgcmVsZWFzZSBzaG91bGQgYmUgc2VudAotaW5zdGVhZCBvZiBhIHByZXNzdXJlIGNoYW5nZS4gIFNldCAiZHJhZ3NraXA9biIgdG8KLXNraXAgbiBkcmFnZ2VkIG1vdXNlIHRvdWNoZXMgKHdpdGggcHJlc3N1cmUgYXBwbGllZCkKLWJlZm9yZSBpbmplY3Rpbmcgb25lLiAgVG8gaW5kaWNhdGUgdGhlIHByZXNzdXJlIHRoYXQKLXNob3VsZCBiZSBzZW50IHdoZW4gdGhlcmUgaXMgYSBidXR0b24gY2xpY2sgZm9yIGEKLXRvdWNoc2NyZWVuIGRldmljZSwgc3BlY2lmeSBwcmVzc3VyZT1uLCBlLmcuIG49NS4gVGhlCi1kZWZhdWx0IGlzIG49MS4KLS5JUAotSWYgYSB0b3VjaCBzY3JlZW4gaXMgYmVpbmcgdXNlZCAoInRvdWNoIiBhYm92ZSkKLWFuZCBpdCBpcyBoYXZpbmcgaXRzIGlucHV0IHByb2Nlc3NlZCBieSB0c2xpYiwgeW91IGNhbgotc3BlY2lmeSB0aGUgdHNsaWIgY2FsaWJyYXRpb24gZmlsZSB2aWEgdHNsaWJfY2FsPTxmaWxlPi4KLUZvciBleGFtcGxlLCB0c2xpYl9jYWw9L2V0Yy9wb2ludGVyY2FsLiAgVG8gZ2V0IGFjY3VyYXRlCi1vciBldmVuIHVzYWJsZSBwb3NpdGlvbmluZyB0aGlzIGlzIHJlcXVpcmVkIHdoZW4gdHNsaWIKLWlzIGluIHVzZS4KLS5JUAotVGhlIExpbnV4IHVpbnB1dCBtZWNoYW5pc20gY2FuIGJlIGJ5cGFzc2VkIGFuZCBvbmUgY2FuCi13cml0ZSBpbnB1dCBldmVudHMgRElSRUNUTFkgdG8gdGhlIGRldmljZXMgaW5zdGVhZC4KLVRvIGRvIHRoaXMsIHNwZWNpZnkgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZwotZm9yIHRoZSBpbnB1dCBjbGFzc2VzOiBkaXJlY3RfcmVsPTxkZXZpY2U+Ci1kaXJlY3RfYWJzPTxkZXZpY2U+IGRpcmVjdF9idG49PGRldmljZT4gb3IKLWRpcmVjdF9rZXk9PGRldmljZT4uICBUaGUgPGRldmljZT4gZmlsZSBpcyB1c3VhbGx5Ci1zb21ldGhpbmcgbGlrZSAvZGV2L2lucHV0L2V2ZW50MSBidXQgeW91IGNhbiBzcGVjaWZ5Ci1hbnkgZGV2aWNlIGZpbGUgb3IgcGlwZS4gIFlvdSBtdXN0IHNwZWNpZnkgZWFjaCBvbmUKLW9mIHRoZSBhYm92ZSBjbGFzc2VzIGV2ZW4gaWYgdGhleSBjb3JyZXNwb25kIHRvIHRoZQotc2FtZSBkZXZpY2UgZmlsZSAocmVsL2FicyBhbmQgYnRuIGFyZSBvZnRlbiB0aGUgc2FtZS4pCi1Mb29rIGF0IHRoZSBmaWxlIC9wcm9jL2J1cy9pbnB1dC9kZXZpY2VzIHRvIGdldCBhbiBpZGVhCi13aGF0IGlzIGF2YWlsYWJsZSBhbmQgdGhlIGRldmljZSBmaWxlbmFtZXMuICBOb3RlOgotVGhlIC9kZXYvaW5wdXQvbW91c2UqIGRldmljZXMgZG8gbm90IHNlZW0gdG8gd29yaywKLXVzZSB0aGUgY29ycmVzcG9uZGluZyAvZGV2L2lucHV0L2V2ZW50KiBmaWxlIGluc3RlYWQuCi1BbnkgaW5wdXQgY2xhc3Mgbm90IGRpcmVjdGx5IHNwZWNpZmllZCBhcyBhYm92ZSB3aWxsIGJlCi1oYW5kbGVkIHZpYSB0aGUgdWlucHV0IG1lY2hhbmlzbS4gIFRvIGRpc2FibGUgY3JlYXRpbmcgYQotdWlucHV0IGRldmljZSAoYW5kIHRoZXJlYnkgZGlzY2FyZGluZyB1bmhhbmRsZWQgaW5wdXQpLAotc3BlY2lmeSAibm91aW5wdXQiLgotLklQCi1FeGFtcGxlczoKLS5JUAotXGZCLXBpcGVpbnB1dFxmUiBVSU5QVVQ6ZGlyZWN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MQotLklQCi10aGlzIHdhcyB1c2VkIG9uIGEgcXRtb2tvIE5lbyBmcmVlcnVubmVyIChhcm1lbCk6Ci0uSVAKLVxmQi1waXBlaW5wdXRcZlIgVUlOUFVUOnRvdWNoLHRzbGliX2NhbD0vZXRjL3BvaW50ZXJjYWwsCi1kaXJlY3RfYWJzPS9kZXYvaW5wdXQvZXZlbnQxLG5vdWlucHV0LGRyYWdza2lwPTQKLS5JUAotKHdoZXJlIHRoZSBsb25nIGxpbmUgaGFzIGJlZW4gc3BsaXQgaW50byB0d28uKQotLklQCi1Zb3UgY2FuIHNldCB0aGUgZW52LiB2YXIgWDExVk5DX1VJTlBVVF9ERUJVRz0xIG9yIGhpZ2hlcgotdG8gZ2V0IGRlYnVnZ2luZyBvdXRwdXQgZm9yIFVJTlBVVCBtb2RlLgotLlBQCi1cZkItbWFjbm9kaW1cZlIKLS5JUAotRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZGlzYWJsZSBkaW1taW5nLgotLlBQCi1cZkItbWFjbm9zbGVlcFxmUgotLklQCi1Gb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkaXNhYmxlIGRpc3BsYXkgc2xlZXAuCi0uUFAKLVxmQi1tYWNub3NhdmVyXGZSCi0uSVAKLUZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgc2NyZWVuc2F2ZXIuCi0uUFAKLVxmQi1tYWNub3dhaXRcZlIKLS5JUAotRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHdhaXQgZm9yIHRoZQotdXNlciB0byBzd2l0Y2ggYmFjayB0byBoaXMgZGlzcGxheS4KLS5QUAotXGZCLW1hY3doZWVsXGZSIFxmSW5cZlIKLS5JUAotRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgc2V0IHRoZSBtb3VzZSB3aGVlbAotc3BlZWQgdG8gbiAoZGVmYXVsdCA1KS4KLS5QUAotXGZCLW1hY25vc3dhcFxmUgotLklQCi1Gb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkbyBub3Qgc3dhcCBtb3VzZQotYnV0dG9ucyAyIGFuZCAzLgotLlBQCi1cZkItbWFjbm9yZXNpemVcZlIKLS5JUAotRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHJlc2l6ZSBvciByZXNldAotdGhlIGZyYW1lYnVmZmVyIGV2ZW4gaWYgaXQgaXMgZGV0ZWN0ZWQgdGhhdCB0aGUgc2NyZWVuCi1yZXNvbHV0aW9uIG9yIGRlcHRoIGhhcyBjaGFuZ2VkLgotLlBQCi1cZkItbWFjaWNvbmFuaW1cZlIgXGZJblxmUgotLklQCi1Gb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBzZXQgbiB0byB0aGUgbnVtYmVyCi1vZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgd2luZG93IGljb25pZnkvZGVpY29uaWZ5Ci1hbmltYXRpb24gdGFrZXMuICBJbiBcZkItbmNhY2hlXGZSIG1vZGUgdGhpcyB2YWx1ZSB3aWxsIGJlCi11c2VkIHRvIHNraXAgdGhlIGFuaW1hdGlvbiBpZiBwb3NzaWJsZS4gKGRlZmF1bHQgNDAwKQotLlBQCi1cZkItbWFjbWVudVxmUgotLklQCi1Gb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBpbiBcZkItbmNhY2hlXGZSIGNsaWVudC1zaWRlCi1jYWNoaW5nIG1vZGUsIHRyeSB0byBjYWNoZSBwdWxsIGRvd24gbWVudXMgKG5vdCBwZXJmZWN0Ci1iZWNhdXNlIHRoZXkgaGF2ZSBhbmltYXRlZCBmYWRlcywgZXRjLikKLS5QUAotXGZCLW1hY3Vza2JkXGZSCi0uSVAKLUZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIHVzZSB0aGUgb3JpZ2luYWwKLWtleXN0cm9rZSBpbnNlcnRpb24gY29kZSBiYXNlZCBvbiBhIFVTIGtleWJvYXJkLgotLlBQCi1cZkItbWFjbm9vcGVuZ2xcZlIKLS5JUAotRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHVzZSBPcGVuR0wgZm9yCi1zY3JlZW4gY2FwdHVyZSwgYnV0IHJhdGhlciB1c2UgdGhlIG9yaWdpbmFsLCBkZXByZWNhdGVkCi1yYXcgbWVtb3J5IGFjY2VzcyBtZXRob2Q6IGFkZHIgPSBDR0Rpc3BsYXlCYXNlQWRkcmVzcygpLgotLlBQCi1cZkItbWFjbm9yYXdmYlxmUgotLklQCi1Gb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkaXNhYmxlIHRoZSByYXcgbWVtb3J5Ci1hZGRyZXNzIHNjcmVlbiBjYXB0dXJlIG1ldGhvZC4KLS5JUAotTUFDT1NYIE5PVEU6IFRoZXJlIGFyZSBzb21lIGRlcHJlY2F0ZWQgTWFjT1NYIGludGVyZmFjZXMKLXRvIGluamVjdCBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGFuZCB0aGUgcmF3IG1lbW9yeQotYWNjZXNzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFzIHdlbGwgKGhvd2V2ZXIsIE9wZW5HTAotd2lsbCBiZSBwcmVmZXJyZWQgaWYgYXZhaWxhYmxlIGJlY2F1c2UgaXQgaXMgZmFzdGVyLikKLU9uZSBjYW4gZm9yY2Ugbm90IHVzaW5nIGFueSBkZXByZWNhdGVkIGludGVyZmFjZXMgYXQKLWNvbXBpbGUgdGltZSBieSBzZXR0aW5nIFxmQi1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEPTFcZlIKLWluIENQUEZMQUdTLiAgT3IgdG8gdHVybiB0aGVtIG9mZiBvbmUgYnkgb25lOgotXGZCLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MSxcZlIKLVxmQi1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFM9MVxmUiBvcgotXGZCLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfRlJBTUVCVUZGRVI9MVxmUgotQXQgcnVuIHRpbWUsIGZvciB0ZXN0aW5nIGFuZCB3b3JrYXJvdW5kcywgb25lIGNhbgotZGlzYWJsZSB0aGVtIGJ5IHVzaW5nOgotXGZCLWVudlxmUiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQ9MQotXGZCLWVudlxmUiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MQotXGZCLWVudlxmUiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUz0xIG9yCi1cZkItZW52XGZSIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUj0xCi1Ob3RlOiBXaGVuIGRvaW5nIGVpdGhlciBvZiB0aGVzZSBmb3IgdGhlIG1vdXNlIGlucHV0Ci1ub3QgZXZlcnl0aGluZyB3b3JrcyBjdXJyZW50bHksIGUuZy4gZG91YmxlIGNsaWNrcyBhbmQKLXdpcmVmcmFtaW5nLiAgQWxzbywgc2NyZWVuIHJlc29sdXRpb24gYW5kIHBpeGVsIGRlcHRoCi1jaGFuZ2VzIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdW5sZXNzIHRoZQotZGVwcmVjYXRlZCBmcmFtZWJ1ZmZlciBpbnRlcmZhY2VzIGFyZSBhbGxvd2VkLgotLklQCi1Db252ZXJzZWx5LCBpZiB5b3UgYXJlIGNvbXBpbGluZyBvbiBhbgotb2xkZXIgbWFjaGluZSB0aGF0IGRvZXMgbm90IGhhdmUgc29tZSBvZgotdGhlIG5ld2VyIGludGVyZmFjZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5Ci1cZkItRFgxMVZOQ19NQUNPU1hfTk9fQ0dFVkVOVENSRUFURVNDUk9MTFdIRUVMRVZFTlRcZlIKLVxmQi1EWDExVk5DX01BQ09TWF9OT19DR0VWRU5UQ1JFQVRFTU9VU0VFVkVOVFxmUiBvcgotXGZCLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVLRVlCT0FSREVWRU5ULlxmUiAgVXNlCi1cZkItRFgxMVZOQ19NQUNPU1hfVVNFX0dFVE1BSU5ERVZJQ0VcZlIgdG8gcmVnYWluIHRoZSB2ZXJ5Ci1vbGQgUXVpY2tEcmF3IEdldE1haW5EZXZpY2UoKSBpbnRlcmZhY2UgKHJhcmUuLi4pCi0uUFAKLVxmQi1ndWlcZlIgXGZJW2d1aS1vcHRzXVxmUgotLklQCi1TdGFydCB1cCBhIHNpbXBsZSB0Y2wvdGsgZ3VpIGJhc2VkIG9uIHRoZSByZW1vdGUKLWNvbnRyb2wgb3B0aW9ucyBcZkItcmVtb3RlLy1xdWVyeVxmUiBkZXNjcmliZWQgYmVsb3cuCi1SZXF1aXJlcyB0aGUgIndpc2giIHByb2dyYW0gdG8gYmUgaW5zdGFsbGVkIG9uIHRoZQotbWFjaGluZS4gICJndWktb3B0cyIgaXMgbm90IHJlcXVpcmVkOiB0aGUgZGVmYXVsdAotaXMgdG8gc3RhcnQgdXAgYm90aCB0aGUgZnVsbCBndWkgYW5kIHgxMXZuYyB3aXRoIHRoZQotZ3VpIHNob3dpbmcgdXAgb24gdGhlIFggZGlzcGxheSBpbiB0aGUgZW52aXJvbm1lbnQKLXZhcmlhYmxlIERJU1BMQVkuCi0uSVAKLSJndWktb3B0cyIgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMuCi1DdXJyZW50bHkgdGhlcmUgYXJlIHRoZXNlIHR5cGVzIG9mIGl0ZW1zOiAxKSBhIGd1aQotbW9kZSwgYSAyKSBndWkgInNpbXBsaWNpdHkiLCAzKSB0aGUgWCBkaXNwbGF5IHRoZQotZ3VpIHNob3VsZCBkaXNwbGF5IG9uLCA0KSBhICJ0cmF5IiBvciAiaWNvbiIgbW9kZSwKLWFuZCA1KSBhIGd1aSBnZW9tZXRyeS4KLS5JUAotMSkgVGhlIGd1aSBtb2RlIGNhbiBiZSAic3RhcnQiLCAiY29ubiIsIG9yICJ3YWl0IgotInN0YXJ0IiBpcyB0aGUgZGVmYXVsdCBtb2RlIGFib3ZlIGFuZCBpcyBub3QgcmVxdWlyZWQuCi0iY29ubiIgbWVhbnMgZG8gbm90IGF1dG9tYXRpY2FsbHkgc3RhcnQgdXAgeDExdm5jLAotYnV0IGluc3RlYWQganVzdCB0cnkgdG8gY29ubmVjdCB0byBhbiBleGlzdGluZyB4MTF2bmMKLXByb2Nlc3MuICAid2FpdCIgbWVhbnMganVzdCBzdGFydCB0aGUgZ3VpIGFuZCBub3RoaW5nCi1lbHNlICh5b3Ugd2lsbCBsYXRlciBpbnN0cnVjdCB0aGUgZ3VpIHRvIHN0YXJ0IHgxMXZuYwotb3IgY29ubmVjdCB0byBhbiBleGlzdGluZyBvbmUuKQotLklQCi0yKSBUaGUgZ3VpIHNpbXBsaWNpdHkgaXMgb2ZmIGJ5IGRlZmF1bHQgKGEgcG93ZXItdXNlcgotZ3VpIHdpdGggYWxsIG9wdGlvbnMgaXMgcHJlc2VudGVkKSBUbyBzdGFydCB3aXRoCi1zb21ldGhpbmcgbGVzcyBkYXVudGluZyBzdXBwbHkgdGhlIHN0cmluZyAic2ltcGxlIgotKCJleiIgaXMgYW4gYWxpYXMgZm9yIHRoaXMpLiAgT25jZSB0aGUgZ3VpIGlzCi1zdGFydGVkIHlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdGhlIHR3byB3aXRoICJNaXNjIC0+Ci1zaW1wbGVfZ3VpIi4KLS5JUAotMykgTm90ZSB0aGUgcG9zc2libGUgY29uZnVzaW9uIHJlZ2FyZGluZyB0aGUgcG90ZW50aWFsbHkKLXR3byBkaWZmZXJlbnQgWCBkaXNwbGF5czogeDExdm5jIHBvbGxzIG9uZSwgYnV0IHlvdQotbWF5IHdhbnQgdGhlIGd1aSB0byBhcHBlYXIgb24gYW5vdGhlci4gIEZvciBleGFtcGxlLCBpZgoteW91IHNzaCBpbiBhbmQgeDExdm5jIGlzIG5vdCBydW5uaW5nIHlldCB5b3UgbWF5IHdhbnQKLXRoZSBndWkgdG8gY29tZSBiYWNrIHRvIHlvdSB2aWEgeW91ciBzc2ggcmVkaXJlY3RlZCBYCi1kaXNwbGF5IChlLmcuIGxvY2FsaG9zdDoxMCkuCi0uSVAKLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGd1aSBYIGRpc3BsYXkgaW4gImd1aS1vcHRzIgotdGhlbiB0aGUgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgXGZCLWRpc3BsYXlcZlIKLW9wdGlvbiBhcmUgdHJpZWQgKGluIHRoYXQgb3JkZXIpLiAgUmVnYXJkaW5nIHRoZSB4MTF2bmMKLVggZGlzcGxheSB0aGUgZ3VpIHdpbGwgdHJ5IHRvIGNvbW11bmljYXRpb24gd2l0aCwgaXQKLWZpcnN0IHRyaWVzIFxmQi1kaXNwbGF5XGZSIGFuZCB0aGVuIERJU1BMQVkuICBGb3IgZXhhbXBsZSwKLSJ4MTF2bmMgXGZCLWRpc3BsYXlcZlIgOjAgXGZCLWd1aVxmUiBvdGhlcmhvc3Q6MCIsIHdpbGwgcmVtb3RlCi1jb250cm9sIGFuIHgxMXZuYyBwb2xsaW5nIDowIGFuZCBkaXNwbGF5IHRoZSBndWkgb24KLW90aGVyaG9zdDowIFRoZSAidHJheS9pY29uIiBtb2RlIGJlbG93IHJldmVyc2VzIHRoaXMKLXByZWZlcmVuY2UsIHByZWZlcnJpbmcgdG8gZGlzcGxheSBvbiB0aGUgeDExdm5jIGRpc3BsYXkuCi0uSVAKLTQpIFdoZW4gInRyYXkiIG9yICJpY29uIiBpcyBzcGVjaWZpZWQsIHRoZSBndWkKLXByZXNlbnRzIGl0c2VsZiBhcyBhIHNtYWxsIGljb24gd2l0aCBiZWhhdmlvciB0eXBpY2FsCi1vZiBhICJzeXN0ZW0gdHJheSIgb3IgImRvY2sgYXBwbGV0Ii4gIFRoZSBjb2xvcgotb2YgdGhlIGljb24gaW5kaWNhdGVzIHN0YXR1cyAoY29ubmVjdGVkIGNsaWVudHMpIGFuZAotdGhlcmUgaXMgYWxzbyBhIGJhbGxvb24gc3RhdHVzLiAgQ2xpY2tpbmcgb24gdGhlIGljb24KLWdpdmVzIGEgbWVudSBmcm9tIHdoaWNoIHByb3BlcnRpZXMsIGV0YywgY2FuIGJlIHNldCBhbmQKLXRoZSBmdWxsIGd1aSBpcyBhdmFpbGFibGUgdW5kZXIgIkFkdmFuY2VkIi4gIFRvIGJlCi1mdWxseSBmdW5jdGlvbmFsLCB0aGUgZ3VpIG1vZGUgc2hvdWxkIGJlICJzdGFydCIKLSh0aGUgZGVmYXVsdCkuCi0uSVAKLU5vdGUgdGhhdCB0cmF5IG9yIGljb24gbW9kZSB3aWxsIGltcGx5IHRoZSBcZkItZm9yZXZlclxmUgoteDExdm5jIG9wdGlvbiAoaWYgdGhlIHgxMXZuYyBzZXJ2ZXIgaXMgc3RhcnRlZCBhbG9uZwotd2l0aCB0aGUgZ3VpKSB1bmxlc3MgXGZCLWNvbm5lY3RcZlIgb3IgXGZCLWNvbm5lY3Rfb3JfZXhpdFxmUiBoYXMKLWJlZW4gc3BlY2lmaWVkLiAgU28geDExdm5jIChhbmQgdGhlIHRyYXkvaWNvbiBndWkpCi13aWxsIHdhaXQgZm9yIG1vcmUgY29ubmVjdGlvbnMgYWZ0ZXIgdGhlIGZpcnN0IGNsaWVudAotZGlzY29ubmVjdHMuICBJZiB5b3Ugd2FudCBvbmx5IG9uZSB2aWV3ZXIgY29ubmVjdGlvbgotaW5jbHVkZSB0aGUgXGZCLW9uY2VcZlIgb3B0aW9uLgotLklQCi1Gb3IgImljb24iIHRoZSBndWkganVzdCBhIHNtYWxsIHN0YW5kYWxvbmUgd2luZG93LgotRm9yICJ0cmF5IiBpdCB3aWxsIGF0dGVtcHQgdG8gZW1iZWQgaXRzZWxmIGluIHRoZQotInN5c3RlbSB0cmF5IiBpZiBwb3NzaWJsZS4gSWYgIj1zZXRwYXNzIiBpcyBhcHBlbmRlZCB0aGVuCi1hdCBzdGFydHVwIHRoZSBYMTEgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNldCB0aGUKLVZOQyBzZXNzaW9uIHBhc3N3b3JkLiAgSWYgPTxoZXhudW1iZXI+IGlzIGFwcGVuZGVkCi10aGF0IGljb24gd2lsbCBhdHRlbXB0IHRvIGVtYmVkIGl0c2VsZiBpbiB0aGUgd2luZG93Ci1naXZlbiBieSBoZXhudW1iZXIuICBVc2UgPW5vYWR2YW5jZWQgdG8gZGlzYWJsZSB0aGUKLWZ1bGwgZ3VpLiAoVG8gc3VwcGx5IG1vcmUgdGhhbiBvbmUsIHVzZSAiKyIgc2lnbikuCi1FLmcuIFxmQi1ndWlcZlIgdHJheT1zZXRwYXNzIGFuZCBcZkItZ3VpXGZSIGljb249MHgzNjAwMDI4Ci0uSVAKLU90aGVyIG1vZGVzOiAiZnVsbCIsIHRoZSBkZWZhdWx0IGFuZCBuZWVkIG5vdCBiZQotc3BlY2lmaWVkLiAgIlxmQi1ndWlcZlIgXGZJbm9uZVxmUiIsIGRvIG5vdCBzaG93IGEgZ3VpLCB1c2VmdWwKLXRvIG92ZXJyaWRlIGEgfi8ueDExdm5jcmMgc2V0dGluZywgZXRjLgotLklQCi01KSBXaGVuICJnZW9tPStYK1kiIGlzIHNwZWNpZmllZCwgdGhhdCBnZW9tZXRyeQotaXMgcGFzc2VkIHRvIHRoZSBndWkgdG9wbGV2ZWwuICBUaGlzIGlzIHRoZSBpY29uIGluCi1pY29uL3RyYXkgbW9kZSwgb3IgdGhlIGZ1bGwgZ3VpIG90aGVyd2lzZS4gIFlvdSBjYW4KLWFsc28gc3BlY2lmeSB3aWR0aCBhbmQgaGVpZ2h0LCBpLmUuIFd4SCtYK1ksIGJ1dCBpdAotaXMgbm90IHJlY29tbWVuZGVkLiAgSW4gInRyYXkiIG1vZGUgdGhlIGdlb21ldHJ5IGlzCi1pZ25vcmVkIHVubGVzcyB0aGUgc3lzdGVtIHRyYXkgbWFuYWdlciBkb2VzIG5vdCBzZWVtCi10byBiZSBydW5uaW5nLiAgT25lIGNvdWxkIGltYWdpbmUgdXNpbmcgc29tZXRoaW5nIGxpa2UKLSJcZkItZ3VpXGZSIFxmSXRyYXksZ2VvbT0rNDAwMCs0MDAwXGZSIiB3aXRoIGEgZGlzcGxheSBtYW5hZ2VyCi10byBrZWVwIHRoZSBndWkgaW52aXNpYmxlIHVudGlsIHNvbWVvbmUgbG9ncyBpbi4uLgotLklQCi1Nb3JlIGljb24gdHJpY2tzLCAiaWNvbj1taW5pbWFsIiBnaXZlcyBhbiBpY29uIGp1c3QKLXdpdGggdGhlIFZOQyBkaXNwbGF5IG51bWJlci4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGZvbnQKLXdpdGggImljb25mb250PS4uLiIuICBUaGUgZm9sbG93aW5nIGNvdWxkIGJlIHVzZWZ1bDoKLSJcZkItZ3VpXGZSIFxmSWljb249bWluaW1hbCxpY29uZm9udD01eDgsZ2VvbT0yNHgxMCswLTBcZlIiCi0uSVAKLUdlbmVyYWwgZXhhbXBsZXMgb2YgdGhlIFxmQi1ndWlcZlIgb3B0aW9uOiAieDExdm5jIFxmQi1ndWkiLFxmUgotIngxMXZuYyBcZkItZ3VpXGZSIGV6IiAieDExdm5jIFxmQi1ndWlcZlIgbG9jYWxob3N0OjEwIiwKLSJ4MTF2bmMgXGZCLWd1aVxmUiBjb25uLGhvc3Q6MCIsICJ4MTF2bmMgXGZCLWd1aVxmUiB0cmF5LGV6IgotIngxMXZuYyBcZkItZ3VpXGZSIHRyYXk9c2V0cGFzcyIKLS5JUAotSWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gc3RhcnQgeDExdm5jIGZyb20gdGhlIGd1aQotKGkuZS4ganVzdCByZW1vdGUgY29udHJvbCBhbiBleGlzdGluZyBvbmUpLCB0aGVuIHRoZQotZ3VpIHByb2Nlc3MgY2FuIHJ1biBvbiBhIGRpZmZlcmVudCBtYWNoaW5lIGZyb20gdGhlCi14MTF2bmMgc2VydmVyIGFzIGxvbmcgYXMgWCBwZXJtaXNzaW9ucywgZXRjLiBwZXJtaXQKLWNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgdHdvLgotLklQCi1GT05UUzogT24gc29tZSBzeXN0ZW1zIHRoZSB0ayBmb250cyBjYW4gYmUgdG9vIHNtYWxsLAotamFnZ2VkLCBvciBvdGhlcndpc2UgdW5yZWFkYWJsZS4gIFRoZXJlIGFyZSA0IGVudiB2YXJzCi15b3UgY2FuIHNldCB0byBiZSB0aGUgdGsgZm9udCB5b3UgcHJlZmVyOgotLklQCi1YMTFWTkNfRk9OVF9CT0xEICAgbWFpbiBmb250IGZvciBtZW51cyBhbmQgYnV0dG9ucy4KLVgxMVZOQ19GT05UX0ZJWEVEICBmb250IGZvciBmaXhlZCB3aWR0aCB0ZXh0LgotLklQCi1YMTFWTkNfRk9OVF9CT0xEX1NNQUxMICB0cmF5IGljb24gZm9udC4KLVgxMVZOQ19GT05UX1JFR19TTUFMTCAgIHRyYXkgaWNvbiBtZW51IGZvbnQuCi0uSVAKLVRoZSBsYXN0IHR3byBvbmx5IGFwcGx5IGZvciB0aGUgdHJheSBpY29uIG1vZGUuCi0uSVAKLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6Ci0uSVAKLVxmQi1lbnZcZlIgWDExVk5DX0ZPTlRfQk9MRD0nSGVsdmV0aWNhIFxmQi0xNlxmUiBib2xkJwotXGZCLWVudlxmUiBYMTFWTkNfRk9OVF9GSVhFRD0nQ291cmllciBcZkItMTQnXGZSCi1cZkItZW52XGZSIFgxMVZOQ19GT05UX1JFR19TTUFMTD0nSGVsdmV0aWNhIFxmQi0xMidcZlIKLS5JUAotWW91IGNhbiBwdXQgdGhlIGxpbmVzIGxpa2UgdGhlIGFib3ZlICh3aXRob3V0IHRoZQotcXVvdGVzKSBpbiB5b3VyIH4vLngxMXZuY3JjIGZpbGUgdG8gYXZvaWQgaGF2aW5nIHRvCi1zcGVjaWZ5IHRoZW0gb24gdGhlIHgxMXZuYyBjb21tYW5kIGxpbmUuCi0uUFAKLVxmQi1yZW1vdGVcZlIgXGZJY29tbWFuZFxmUgotLklQCi1SZW1vdGVseSBjb250cm9sIHNvbWUgYXNwZWN0cyBvZiBhbiBhbHJlYWR5IHJ1bm5pbmcKLXgxMXZuYyBzZXJ2ZXIuICAiXGZCLVJcZlIiIGFuZCAiXGZCLXJcZlIiIGFyZSBhbGlhc2VzIGZvcgotIlxmQi1yZW1vdGVcZlIiLiAgQWZ0ZXIgdGhlIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgaXMKLXNlbnQgdG8gdGhlIHJ1bm5pbmcgc2VydmVyIHRoZSAneDExdm5jIFxmQi1yZW1vdGVcZlIgLi4uJwoteDExdm5jIGNvbW1hbmQgZXhpdHMuICBZb3UgY2FuIG9mdGVuIHVzZSB0aGUgXGZCLXF1ZXJ5XGZSCi1jb21tYW5kIChzZWUgYmVsb3cpIHRvIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlcgotcHJvY2Vzc2VkIHlvdXIgXGZCLXJlbW90ZVxmUiBjb21tYW5kLgotLklQCi1UaGUgZGVmYXVsdCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgdGhhdCBvZiBYCi1wcm9wZXJ0aWVzIChzcGVjaWZpY2FsbHkgWDExVk5DX1JFTU9URSksIGFuZCBzbyB0aGlzCi1jb21tYW5kIG11c3QgYmUgcnVuIHdpdGggY29ycmVjdCBzZXR0aW5ncyBmb3IgRElTUExBWQotYW5kIHBvc3NpYmx5IFhBVVRIT1JJVFkgdG8gY29ubmVjdCB0byB0aGUgWCBzZXJ2ZXIKLWFuZCBzZXQgdGhlIHByb3BlcnR5LiAgQWx0ZXJuYXRpdmVseSwgdXNlIHRoZSBcZkItZGlzcGxheVxmUgotYW5kIFxmQi1hdXRoXGZSIG9wdGlvbnMgdG8gc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWVzLgotVGhlIHJ1bm5pbmcgc2VydmVyIGNhbm5vdCB1c2UgdGhlIFxmQi1ub3ZuY2Nvbm5lY3RcZlIgb3B0aW9uCi1iZWNhdXNlIHRoYXQgZGlzYWJsZXMgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbC4KLVNlZSBiZWxvdyBmb3IgYWx0ZXJuYXRlIGNoYW5uZWxzLgotLklQCi1Gb3IgZXhhbXBsZTogJ3gxMXZuYyBcZkItcmVtb3RlXGZSIHN0b3AnICh3aGljaCBpcyB0aGUgc2FtZSBhcwotXCd4MTF2bmMgXGZCLVJcZlIgc3RvcCcpIHdpbGwgY2xvc2UgZG93biB0aGUgeDExdm5jIHNlcnZlci4KLVwneDExdm5jIFxmQi1SXGZSIHNoYXJlZCcgd2lsbCBlbmFibGUgc2hhcmVkIGNvbm5lY3Rpb25zLCBhbmQKLVwneDExdm5jIFxmQi1SXGZSIHNjYWxlOjMvNCcgd2lsbCByZXNjYWxlIHRoZSBkZXNrdG9wLgotLklQCi1UbyB1c2UgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIFgxMSBwcm9wZXJ0eSAoZS5nLiB0bwotaGF2ZSBzZXBhcmF0ZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGZvciBtdWx0aXBsZQoteDExdm5jJ3Mgb24gdGhlIHNhbWUgZGlzcGxheSkgc2V0IHRoZSBYMTFWTkNfUkVNT1RFCi1lbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgc3RyaW5nIHlvdSB3YW50LCBmb3IKLWV4YW1wbGU6IFxmQi1lbnZcZlIgWDExVk5DX1JFTU9URT1YMTFWTkNfUkVNT1RFXzEyMzQ1Ci1Cb3RoIHNpZGVzIG9mIHRoZSBjaGFubmVsIG11c3QgdXNlIHRoZSBzYW1lIHVuaXF1ZSBuYW1lLgotLklQCi1UbyBydW4gYSBidW5jaCBvZiBjb21tYW5kcyBpbiBhIHNlcXVlbmNlIHVzZSBzb21ldGhpbmcKLWxpa2U6IHgxMXZuYyBcZkItUlxmUiAnc2NyaXB0OmZpcnN0Y21kO3NlY29uZGNtZDsuLi4nCi0uSVAKLVVzZSB4MTF2bmMgXGZCLVJcZlIgc2NyaXB0OmZpbGU9L3BhdGgvdG8vZmlsZSB0byByZWFkIGNvbW1hbmRzCi1mcm9tIGEgZmlsZSAoY2FuIGJlIG11bHRpLWxpbmUgYW5kIHVzZSB0aGUgY29tbWVudCAnIycKLWNoYXJhY3RlciBpbiB0aGUgbm9ybWFsIHdheS4gIFRoZSAnOycgc2VwYXJhdG9yIG11c3QKLXN0aWxsIGJlIHVzZWQgdG8gc2VwYXJhdGUgZWFjaCBjb21tYW5kLikKLS5JUAotVG8gbm90IHRyeSB0byBjb250YWN0IGFub3RoZXIgeDExdm5jIHByb2Nlc3MgYW5kIGluc3RlYWQKLWp1c3QgcnVuIHRoZSBjb21tYW5kIChvciBxdWVyeSkgZGlyZWN0bHksIHByZWZpeCB0aGUKLWNvbW1hbmQgd2l0aCB0aGUgc3RyaW5nICJESVJFQ1Q6IgotLklQCi0uSVAKLVRoZSBmb2xsb3dpbmcgXGZCLXJlbW90ZS8tUlxmUiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgotLklQCi1zdG9wICAgICAgICAgICAgdGVybWluYXRlIHRoZSBzZXJ2ZXIsIHNhbWUgYXMgInF1aXQiCi0iZXhpdCIgb3IgInNodXRkb3duIi4KLS5JUAotcGluZyAgICAgICAgICAgIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlciByZXNwb25kcy4KLXJldHVybiBpczogYW5zPXBpbmc6PGRpc3BsYXk+Ci0uSVAKLXBpbmc6bXlzdHJpbmcgICBhcyBhYm92ZSwgYnV0IHVzZSB5b3VyIG93biB1bmlxdWUgc3RyaW5nLgotcmV0dXJuIGlzOiBhbnM9cGluZzpteXN0cmluZzo8eGRpc3BsYXk+Ci0uSVAKLWJsYWNrZW4gICAgICAgICB0cnkgdG8gcHVzaCBhIGJsYWNrIGZiIHVwZGF0ZSB0byBhbGwKLWNsaWVudHMgKGR1ZSB0byB0aW1pbmdzIGEgY2xpZW50Ci1jb3VsZCBtaXNzIGl0KS4gU2FtZSBhcyAiemVybyIsIGFsc28KLSJ6ZXJvOngxLHkxLHgyLHkyIiBmb3IgYSByZWN0YW5nbGUuCi0uSVAKLXJlZnJlc2ggICAgICAgICBzZW5kIHRoZSBlbnRpcmUgZmIgdG8gYWxsIGNsaWVudHMuCi0uSVAKLXJlc2V0ICAgICAgICAgICByZWNyZWF0ZSB0aGUgZmIsIHBvbGxpbmcgbWVtb3J5LCBldGMuCi0uSVAKLWlkOndpbmRvd2lkICAgICBzZXQgXGZCLWlkXGZSIHdpbmRvdyB0byAid2luZG93aWQiLiBlbXB0eQotb3IgInJvb3QiIHRvIGdvIGJhY2sgdG8gcm9vdCB3aW5kb3cKLS5JUAotc2lkOndpbmRvd2lkICAgIHNldCBcZkItc2lkXGZSIHdpbmRvdyB0byAid2luZG93aWQiCi0uSVAKLWlkX2NtZDpjbWQgICAgICBjbWRzOiByYWlzZSwgbG93ZXIsIG1hcCwgdW5tYXAsIGljb25pZnksCi1tb3ZlOmRYZFksIHJlc2l6ZTpkV2RILCBnZW9tOld4SCtYK1kuIGRYCi1kWSwgZFcsIGFuZCBkSCBtdXN0IGhhdmUgYSBsZWFkaW5nICIrIgotb3IgIi0iIGUuZy46IG1vdmU6LTMwKzEwIHJlc2l6ZTorMjArMzUKLWFsc286IHdtX2RlbGV0ZSwgd21fbmFtZTpzdHJpbmcgYW5kCi1pY29uX25hbWU6c3RyaW5nLiBBbHNvIGlkX2NtZDp3aW49TjpjbWQKLS5JUAotd2FpdG1hcHBlZCAgICAgIHdhaXQgdW50aWwgc3Vid2luIGlzIG1hcHBlZC4KLS5JUAotbm93YWl0bWFwcGVkICAgIGRvIG5vdCB3YWl0IHVudGlsIHN1YndpbiBpcyBtYXBwZWQuCi0uSVAKLWNsaXA6V3hIK1grWSAgICBzZXQgXGZCLWNsaXBcZlIgbW9kZSB0byAiV3hIK1grWSIKLS5JUAotZmxhc2hjbWFwICAgICAgIGVuYWJsZSAgXGZCLWZsYXNoY21hcFxmUiBtb2RlLgotLklQCi1ub2ZsYXNoY21hcCAgICAgZGlzYWJsZSBcZkItZmxhc2hjbWFwXGZSIG1vZGUuCi0uSVAKLXNoaWZ0Y21hcDpuICAgICBzZXQgXGZCLXNoaWZ0Y21hcFxmUiB0byBuLgotLklQCi1ub3RydWVjb2xvciAgICAgZW5hYmxlICBcZkItbm90cnVlY29sb3JcZlIgbW9kZS4KLS5JUAotdHJ1ZWNvbG9yICAgICAgIGRpc2FibGUgXGZCLW5vdHJ1ZWNvbG9yXGZSIG1vZGUuCi0uSVAKLW92ZXJsYXkgICAgICAgICBlbmFibGUgIFxmQi1vdmVybGF5XGZSIG1vZGUgKGlmIGFwcGxpY2FibGUpLgotLklQCi1ub292ZXJsYXkgICAgICAgZGlzYWJsZSBcZkItb3ZlcmxheVxmUiBtb2RlLgotLklQCi1vdmVybGF5X2N1cnNvciAgaW4gXGZCLW92ZXJsYXlcZlIgbW9kZSwgZW5hYmxlIGN1cnNvciBkcmF3aW5nLgotLklQCi1vdmVybGF5X25vY3Vyc29yIGRpc2FibGUgY3Vyc29yIGRyYXdpbmcuIHNhbWUgYXMKLW5vb3ZlcmxheV9jdXJzb3IuCi0uSVAKLTh0bzI0ICAgICAgICAgICBlbmFibGUgIFxmQi04dG8yNFxmUiBtb2RlIChpZiBhcHBsaWNhYmxlKS4KLS5JUAotbm84dG8yNCAgICAgICAgIGRpc2FibGUgXGZCLTh0bzI0XGZSIG1vZGUuCi0uSVAKLTh0bzI0X29wdHM6c3RyICBzZXQgdGhlIFxmQi04dG8yNFxmUiBvcHRzIHRvICJzdHIiLgotLklQCi0yNHRvMzIgICAgICAgICAgZW5hYmxlICBcZkItMjR0bzMyXGZSIG1vZGUgKGlmIGFwcGxpY2FibGUpLgotLklQCi1ubzI0dG8zMiAgICAgICAgZGlzYWJsZSBcZkItMjR0bzMyXGZSIG1vZGUuCi0uSVAKLXZpc3VhbDp2aXMgICAgICBzZXQgXGZCLXZpc3VhbFxmUiB0byAidmlzIgotLklQCi1zY2FsZTpmcmFjICAgICAgc2V0IFxmQi1zY2FsZVxmUiB0byAiZnJhYyIKLS5JUAotc2NhbGVfY3Vyc29yOmYgIHNldCBcZkItc2NhbGVfY3Vyc29yXGZSIHRvICJmIgotLklQCi12aWV3b25seSAgICAgICAgZW5hYmxlICBcZkItdmlld29ubHlcZlIgbW9kZS4KLS5JUAotbm92aWV3b25seSAgICAgIGRpc2FibGUgXGZCLXZpZXdvbmx5XGZSIG1vZGUuCi0uSVAKLXNoYXJlZCAgICAgICAgICBlbmFibGUgIFxmQi1zaGFyZWRcZlIgbW9kZS4KLS5JUAotbm9zaGFyZWQgICAgICAgIGRpc2FibGUgXGZCLXNoYXJlZFxmUiBtb2RlLgotLklQCi1mb3JldmVyICAgICAgICAgZW5hYmxlICBcZkItZm9yZXZlclxmUiBtb2RlLgotLklQCi1ub2ZvcmV2ZXIgICAgICAgZGlzYWJsZSBcZkItZm9yZXZlclxmUiBtb2RlLgotLklQCi10aW1lb3V0Om4gICAgICAgcmVzZXQgXGZCLXRpbWVvdXRcZlIgdG8gbiwgaWYgdGhlcmUgYXJlCi1jdXJyZW50bHkgbm8gY2xpZW50cywgZXhpdCB1bmxlc3Mgb25lCi1jb25uZWN0cyBpbiB0aGUgbmV4dCBuIHNlY3MuCi0uSVAKLXRpZ2h0ZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgTkVXIGNsaWVudHMuCi0uSVAKLW5vdGlnaHRmaWxleGZlciBkaXNhYmxlIGZpbGV0cmFuc2ZlciBmb3IgTkVXIGNsaWVudHMuCi0uSVAKLXVsdHJhZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgY2xpZW50cy4KLS5JUAotbm91bHRyYWZpbGV4ZmVyIGRpc2FibGUgZmlsZXRyYW5zZmVyIGZvciBjbGllbnRzLgotLklQCi1yZmJ2ZXJzaW9uOm4ubSAgc2V0IFxmQi1yZmJ2ZXJzaW9uXGZSIGZvciBuZXcgY2xpZW50cy4KLS5JUAotaHR0cCAgICAgICAgICAgIGVuYWJsZSAgaHR0cCBjbGllbnQgY29ubmVjdGlvbnMuCi0uSVAKLW5vaHR0cCAgICAgICAgICBkaXNhYmxlIGh0dHAgY2xpZW50IGNvbm5lY3Rpb25zLgotLklQCi1kZW55ICAgICAgICAgICAgZGVueSBhbnkgbmV3IGNvbm5lY3Rpb25zLCBzYW1lIGFzICJsb2NrIgotLklQCi1ub2RlbnkgICAgICAgICAgYWxsb3cgbmV3IGNvbm5lY3Rpb25zLCBzYW1lIGFzICJ1bmxvY2siCi0uSVAKLWF2YWhpICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLW5vYXZhaGkgICAgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLW1kbnMgICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLW5vbWRucyAgICAgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLXplcm9jb25mICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLW5vemVyb2NvbmYgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCi0uSVAKLWNvbm5lY3Q6aG9zdCAgICBkbyByZXZlcnNlIGNvbm5lY3Rpb24gdG8gaG9zdCwgImhvc3QiCi1tYXkgYmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0cwotb3IgaG9zdDpwb3J0cy4gIFNlZSBcZkItY29ubmVjdC5cZlIgIFBhc3N3b3JkcwotcmVxdWlyZWQgYXMgd2l0aCBmd2QgY29ubmVjdGlvbnMuCi1TZWUgWDExVk5DX1JFVkVSU0VfQ09OTkVDVElPTl9OT19BVVRIPTEKLS5JUAotZGlzY29ubmVjdDpob3N0IGRpc2Nvbm5lY3QgYW55IGNsaWVudHMgZnJvbSAiaG9zdCIKLXNhbWUgYXMgImNsb3NlOmhvc3QiLiAgVXNlIGhvc3QKLSJhbGwiIHRvIGNsb3NlIGFsbCBjdXJyZW50IGNsaWVudHMuCi1JZiB5b3Uga25vdyB0aGUgY2xpZW50IGludGVybmFsIGhleCBJRCwKLWUuZy4gMHgzIChyZXR1cm5lZCBieSAiXGZCLXF1ZXJ5XGZSIFxmSWNsaWVudHNcZlIiCi1hbmQgUkZCX0NMSUVOVF9JRCkgeW91IGNhbiB1c2UgdGhhdCB0b28uCi0uSVAKLXByb3h5Omhvc3Q6cG9ydCBzZXQgcmV2ZXJzZSBjb25uZWN0aW9uIHByb3h5IChlbXB0eSB0bwotZGlzYWJsZSkuCi0uSVAKLWFsbG93b25jZTpob3N0ICBGb3IgdGhlIG5leHQgY29ubmVjdGlvbiBvbmx5LCBhbGxvdwotY29ubmVjdGlvbiBmcm9tICJob3N0Ii4gSW4gXGZCLXNzbFxmUiBtb2RlCi10d28gY29ubmVjdGlvbnMgYXJlIGFsbG93ZWQgKGkuZS4gRmV0Y2gKLUNlcnQpIHVubGVzcyBYMTFWTkNfTk9fU1NMX0FMTE9XX1RXSUNFPTEKLS5JUAotYWxsb3c6aG9zdGxpc3QgIHNldCBcZkItYWxsb3dcZlIgbGlzdCB0byAoY29tbWEgc2VwYXJhdGVkKQotImhvc3RsaXN0Ii4gU2VlIFxmQi1hbGxvd1xmUiBhbmQgXGZCLWxvY2FsaG9zdC5cZlIKLURvIG5vdCB1c2Ugd2l0aCBcZkItYWxsb3dcZlIgL3BhdGgvdG8vZmlsZQotVXNlICIraG9zdCIgdG8gYWRkIGEgc2luZ2xlIGhvc3QsIGFuZAotdXNlICJcZkItaG9zdFxmUiIgdG8gZGVsZXRlIGEgc2luZ2xlIGhvc3QKLS5JUAotbG9jYWxob3N0ICAgICAgIGVuYWJsZSAgXGZCLWxvY2FsaG9zdFxmUiBtb2RlCi0uSVAKLW5vbG9jYWxob3N0ICAgICBkaXNhYmxlIFxmQi1sb2NhbGhvc3RcZlIgbW9kZQotLklQCi1saXN0ZW46c3RyICAgICAgc2V0IFxmQi1saXN0ZW5cZlIgdG8gc3RyLCBlbXB0eSB0byBkaXNhYmxlLgotLklQCi1ub2lwdjYgICAgICAgICAgZW5hYmxlICBcZkItbm9pcHY2XGZSIG1vZGUuCi0uSVAKLWlwdjYgICAgICAgICAgICBkaXNhYmxlIFxmQi1ub2lwdjZcZlIgbW9kZS4KLS5JUAotbm9pcHY0ICAgICAgICAgIGVuYWJsZSAgXGZCLW5vaXB2NFxmUiBtb2RlLgotLklQCi1pcHY0ICAgICAgICAgICAgZGlzYWJsZSBcZkItbm9pcHY0XGZSIG1vZGUuCi0uSVAKLTYgICAgICAgICAgICAgICBlbmFibGUgIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuCi0uSVAKLW5vNiAgICAgICAgICAgICBkaXNhYmxlIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuCi0uSVAKLWxvb2t1cCAgICAgICAgICBkaXNhYmxlIFxmQi1ub2xvb2t1cFxmUiBtb2RlLgotLklQCi1ub2xvb2t1cCAgICAgICAgZW5hYmxlICBcZkItbm9sb29rdXBcZlIgbW9kZS4KLS5JUAotbG9va3VwICAgICAgICAgIGRpc2FibGUgXGZCLW5vbG9va3VwXGZSIG1vZGUuCi0uSVAKLWlucHV0OnN0ciAgICAgICBzZXQgXGZCLWlucHV0XGZSIHRvICJzdHIiLCBlbXB0eSB0byBkaXNhYmxlLgotLklQCi1ncmFia2JkICAgICAgICAgZW5hYmxlICBcZkItZ3JhYmtiZFxmUiBtb2RlLgotLklQCi1ub2dyYWJrYmQgICAgICAgZGlzYWJsZSBcZkItZ3JhYmtiZFxmUiBtb2RlLgotLklQCi1ncmFicHRyICAgICAgICAgZW5hYmxlICBcZkItZ3JhYnB0clxmUiBtb2RlLgotLklQCi1ub2dyYWJwdHIgICAgICAgZGlzYWJsZSBcZkItZ3JhYnB0clxmUiBtb2RlLgotLklQCi1ncmFiYWx3YXlzICAgICAgZW5hYmxlICBcZkItZ3JhYmFsd2F5c1xmUiBtb2RlLgotLklQCi1ub2dyYWJhbHdheXMgICAgZGlzYWJsZSBcZkItZ3JhYmFsd2F5c1xmUiBtb2RlLgotLklQCi1ncmFibG9jYWw6biAgICAgc2V0IFxmQi1ncmFibG9jYWxcZlIgdG8gbi4KLS5JUAotY2xpZW50X2lucHV0OnN0ciBzZXQgdGhlIEssIE0sIEIgXGZCLWlucHV0XGZSIG9uIGEgcGVyLWNsaWVudAotYmFzaXMuICBzZWxlY3Qgd2hpY2ggY2xpZW50IGFzIGZvcgotZGlzY29ubmVjdCwgZS5nLiBjbGllbnRfaW5wdXQ6aG9zdDpNQgotb3IgY2xpZW50X2lucHV0OjB4MjpLCi0uSVAKLWFjY2VwdDpjbWQgICAgICBzZXQgXGZCLWFjY2VwdFxmUiAiY21kIiAoZW1wdHkgdG8gZGlzYWJsZSkuCi0uSVAKLWFmdGVyYWNjZXB0OmNtZCBzZXQgXGZCLWFmdGVyYWNjZXB0XGZSIChlbXB0eSB0byBkaXNhYmxlKS4KLS5JUAotZ29uZTpjbWQgICAgICAgIHNldCBcZkItZ29uZVxmUiAiY21kIiAoZW1wdHkgdG8gZGlzYWJsZSkuCi0uSVAKLW5vc2htICAgICAgICAgICBlbmFibGUgIFxmQi1ub3NobVxmUiBtb2RlLgotLklQCi1zaG0gICAgICAgICAgICAgZGlzYWJsZSBcZkItbm9zaG1cZlIgbW9kZSAoaS5lLiB1c2Ugc2htKS4KLS5JUAotZmxpcGJ5dGVvcmRlciAgIGVuYWJsZSBcZkItZmxpcGJ5dGVvcmRlclxmUiBtb2RlLCB5b3UgbWF5IG5lZWQKLXRvIHNldCBub3NobSBmb3IgdGhpcyB0byBkbyBzb21ldGhpbmcuCi0uSVAKLW5vZmxpcGJ5dGVvcmRlciBkaXNhYmxlIFxmQi1mbGlwYnl0ZW9yZGVyXGZSIG1vZGUuCi0uSVAKLW9uZXRpbGUgICAgICAgICBlbmFibGUgIFxmQi1vbmV0aWxlXGZSIG1vZGUuICh5b3UgbWF5IG5lZWQgdG8KLXNldCBzaG0gZm9yIHRoaXMgdG8gZG8gc29tZXRoaW5nKQotLklQCi1ub29uZXRpbGUgICAgICAgZGlzYWJsZSBcZkItb25ldGlsZVxmUiBtb2RlLgotLklQCi1zb2xpZCAgICAgICAgICAgZW5hYmxlICBcZkItc29saWRcZlIgbW9kZQotLklQCi1ub3NvbGlkICAgICAgICAgZGlzYWJsZSBcZkItc29saWRcZlIgbW9kZS4KLS5JUAotc29saWRfY29sb3I6Y29sb3Igc2V0IFxmQi1zb2xpZFxmUiBjb2xvciAoYW5kIGFwcGx5IGl0KS4KLS5JUAotYmxhY2tvdXQ6c3RyICAgIHNldCBcZkItYmxhY2tvdXRcZlIgInN0ciIgKGVtcHR5IHRvIGRpc2FibGUpLgotU2VlIFxmQi1ibGFja291dFxmUiBmb3IgdGhlIGZvcm0gb2YgInN0ciIKLShiYXNpY2FsbHk6IFd4SCtYK1ksLi4uKQotVXNlICIrV3hIK1grWSIgdG8gYXBwZW5kIGEgc2luZ2xlCi1yZWN0YW5nbGUgdXNlICItV3hIK1grWSIgdG8gZGVsZXRlIG9uZQotLklQCi14aW5lcmFtYSAgICAgICAgZW5hYmxlICBcZkIteGluZXJhbWFcZlIgbW9kZS4gKGlmIGFwcGxpY2FibGUpCi0uSVAKLW5veGluZXJhbWEgICAgICBkaXNhYmxlIFxmQi14aW5lcmFtYVxmUiBtb2RlLgotLklQCi14dHJhcCAgICAgICAgICAgZW5hYmxlICBcZkIteHRyYXBcZlIgaW5wdXQgbW9kZShpZiBhcHBsaWNhYmxlKQotLklQCi1ub3h0cmFwICAgICAgICAgZGlzYWJsZSBcZkIteHRyYXBcZlIgaW5wdXQgbW9kZS4KLS5JUAoteHJhbmRyICAgICAgICAgIGVuYWJsZSAgXGZCLXhyYW5kclxmUiBtb2RlLiAoaWYgYXBwbGljYWJsZSkKLS5JUAotbm94cmFuZHIgICAgICAgIGRpc2FibGUgXGZCLXhyYW5kclxmUiBtb2RlLgotLklQCi14cmFuZHJfbW9kZTptb2RlIHNldCB0aGUgXGZCLXhyYW5kclxmUiBtb2RlIHRvICJtb2RlIi4KLS5JUAotcm90YXRlOm1vZGUgICAgIHNldCB0aGUgXGZCLXJvdGF0ZVxmUiBtb2RlIHRvICJtb2RlIi4KLS5JUAotcGFkZ2VvbTpXeEggICAgIHNldCBcZkItcGFkZ2VvbVxmUiB0byBXeEggKGVtcHR5IHRvIGRpc2FibGUpCi1JZiBXeEggaXMgImZvcmNlIiBvciAiZG8iIHRoZSBwYWRkZWQKLWdlb21ldHJ5IGZiIGlzIGltbWVkaWF0ZWx5IGFwcGxpZWQuCi0uSVAKLXF1aWV0ICAgICAgICAgICBlbmFibGUgIFxmQi1xdWlldFxmUiBtb2RlLgotLklQCi1ub3F1aWV0ICAgICAgICAgZGlzYWJsZSBcZkItcXVpZXRcZlIgbW9kZS4KLS5JUAotbW9kdHdlYWsgICAgICAgIGVuYWJsZSAgXGZCLW1vZHR3ZWFrXGZSIG1vZGUuCi0uSVAKLW5vbW9kdHdlYWsgICAgICBlbmFibGUgIFxmQi1ub21vZHR3ZWFrXGZSIG1vZGUuCi0uSVAKLXhrYiAgICAgICAgICAgICBlbmFibGUgIFxmQi14a2JcZlIgbW9kdHdlYWsgbW9kZS4KLS5JUAotbm94a2IgICAgICAgICAgIGRpc2FibGUgXGZCLXhrYlxmUiBtb2R0d2VhayBtb2RlLgotLklQCi1jYXBzbG9jayAgICAgICAgZW5hYmxlICBcZkItY2Fwc2xvY2tcZlIgbW9kZS4KLS5JUAotbm9jYXBzbG9jayAgICAgIGRpc2FibGUgXGZCLWNhcHNsb2NrXGZSIG1vZGUuCi0uSVAKLXNraXBfbG9ja2tleXMgICBlbmFibGUgIFxmQi1za2lwX2xvY2trZXlzXGZSIG1vZGUuCi0uSVAKLW5vc2tpcF9sb2Nra2V5cyBkaXNhYmxlIFxmQi1za2lwX2xvY2trZXlzXGZSIG1vZGUuCi0uSVAKLXNraXBfa2V5Y29kZXM6c3RyIGVuYWJsZSBcZkIteGtiXGZSIFxmQi1za2lwX2tleWNvZGVzXGZSICJzdHIiLgotLklQCi1zbG9wcHlfa2V5cyAgICAgZW5hYmxlICBcZkItc2xvcHB5X2tleXNcZlIgbW9kZS4KLS5JUAotbm9zbG9wcHlfa2V5cyAgIGRpc2FibGUgXGZCLXNsb3BweV9rZXlzXGZSIG1vZGUuCi0uSVAKLXNraXBfZHVwcyAgICAgICBlbmFibGUgIFxmQi1za2lwX2R1cHNcZlIgbW9kZS4KLS5JUAotbm9za2lwX2R1cHMgICAgIGRpc2FibGUgXGZCLXNraXBfZHVwc1xmUiBtb2RlLgotLklQCi1hZGRfa2V5c3ltcyAgICAgZW5hYmxlIFxmQi1hZGRfa2V5c3ltc1xmUiBtb2RlLgotLklQCi1ub2FkZF9rZXlzeW1zICAgc3RvcCBhZGRpbmcga2V5c3ltcy4gdGhvc2UgYWRkZWQgd2lsbAotc3RpbGwgYmUgcmVtb3ZlZCBhdCBleGl0LgotLklQCi1jbGVhcl9tb2RzICAgICAgZW5hYmxlICBcZkItY2xlYXJfbW9kc1xmUiBtb2RlIGFuZCBjbGVhciB0aGVtLgotLklQCi1ub2NsZWFyX21vZHMgICAgZGlzYWJsZSBcZkItY2xlYXJfbW9kc1xmUiBtb2RlLgotLklQCi1jbGVhcl9rZXlzICAgICAgZW5hYmxlICBcZkItY2xlYXJfa2V5c1xmUiBtb2RlIGFuZCBjbGVhciB0aGVtLgotLklQCi1ub2NsZWFyX2tleXMgICAgZGlzYWJsZSBcZkItY2xlYXJfa2V5c1xmUiBtb2RlLgotLklQCi1jbGVhcl9sb2NrcyAgICAgZG8gdGhlIGNsZWFyX2xvY2tzIGFjdGlvbi4KLS5JUAotY2xlYXJfYWxsICAgICAgIGRvIHRoZSBjbGVhcl9hbGwgYWN0aW9uLgotLklQCi1rZXlzdGF0ZSAgICAgICAgaGF2ZSB4MTF2bmMgcHJpbnQgY3VycmVudCBrZXlzdGF0ZS4KLS5JUAotcmVtYXA6c3RyICAgICAgIHNldCBcZkItcmVtYXBcZlIgInN0ciIgKGVtcHR5IHRvIGRpc2FibGUpLgotU2VlIFxmQi1yZW1hcFxmUiBmb3IgdGhlIGZvcm0gb2YgInN0ciIKLShiYXNpY2FsbHk6IGtleTEta2V5MixrZXkzLWtleTQsLi4uKQotVXNlICIra2V5MS1rZXkyIiB0byBhcHBlbmQgYSBzaW5nbGUKLWtleW1hcHBpbmcsIHVzZSAiLWtleTEta2V5MiIgdG8gZGVsZXRlLgotLklQCi1ub3JlcGVhdCAgICAgICAgZW5hYmxlICBcZkItbm9yZXBlYXRcZlIgbW9kZS4KLS5JUAotcmVwZWF0ICAgICAgICAgIGRpc2FibGUgXGZCLW5vcmVwZWF0XGZSIG1vZGUuCi0uSVAKLW5vZmIgICAgICAgICAgICBlbmFibGUgIFxmQi1ub2ZiXGZSIG1vZGUuCi0uSVAKLWZiICAgICAgICAgICAgICBkaXNhYmxlIFxmQi1ub2ZiXGZSIG1vZGUuCi0uSVAKLWJlbGwgICAgICAgICAgICBlbmFibGUgIGJlbGwgKGlmIHN1cHBvcnRlZCkuCi0uSVAKLW5vYmVsbCAgICAgICAgICBkaXNhYmxlIGJlbGwuCi0uSVAKLXNlbmRiZWxsICAgICAgICByaW5nIHRoZSBiZWxsIG5vdy4KLS5JUAotbm9zZWwgICAgICAgICAgIGVuYWJsZSAgXGZCLW5vc2VsXGZSIG1vZGUuCi0uSVAKLXNlbCAgICAgICAgICAgICBkaXNhYmxlIFxmQi1ub3NlbFxmUiBtb2RlLgotLklQCi1ub3ByaW1hcnkgICAgICAgZW5hYmxlICBcZkItbm9wcmltYXJ5XGZSIG1vZGUuCi0uSVAKLXByaW1hcnkgICAgICAgICBkaXNhYmxlIFxmQi1ub3ByaW1hcnlcZlIgbW9kZS4KLS5JUAotbm9zZXRwcmltYXJ5ICAgIGVuYWJsZSAgXGZCLW5vc2V0cHJpbWFyeVxmUiBtb2RlLgotLklQCi1zZXRwcmltYXJ5ICAgICAgZGlzYWJsZSBcZkItbm9zZXRwcmltYXJ5XGZSIG1vZGUuCi0uSVAKLW5vY2xpcGJvYXJkICAgICBlbmFibGUgIFxmQi1ub2NsaXBib2FyZFxmUiBtb2RlLgotLklQCi1jbGlwYm9hcmQgICAgICAgZGlzYWJsZSBcZkItbm9jbGlwYm9hcmRcZlIgbW9kZS4KLS5JUAotbm9zZXRjbGlwYm9hcmQgIGVuYWJsZSAgXGZCLW5vc2V0Y2xpcGJvYXJkXGZSIG1vZGUuCi0uSVAKLXNldGNsaXBib2FyZCAgICBkaXNhYmxlIFxmQi1ub3NldGNsaXBib2FyZFxmUiBtb2RlLgotLklQCi1zZWxkaXI6c3RyICAgICAgc2V0IFxmQi1zZWxkaXJcZlIgdG8gInN0ciIKLS5JUAotcmVzZW5kX2N1dGJ1ZmZlciByZXNlbmQgdGhlIG1vc3QgcmVjZW50IENVVEJVRkZFUjAgY29weQotLklQCi1yZXNlbmRfY2xpcGJvYXJkIHJlc2VuZCB0aGUgbW9zdCByZWNlbnQgQ0xJUEJPQVJEIGNvcHkKLS5JUAotcmVzZW5kX3ByaW1hcnkgICByZXNlbmQgdGhlIG1vc3QgcmVjZW50IFBSSU1BUlkgY29weQotLklQCi1jdXJzb3I6bW9kZSAgICAgZW5hYmxlICBcZkItY3Vyc29yXGZSICJtb2RlIi4KLS5JUAotc2hvd19jdXJzb3IgICAgIGVuYWJsZSAgc2hvd2luZyBhIGN1cnNvci4KLS5JUAotbm9zaG93X2N1cnNvciAgIGRpc2FibGUgc2hvd2luZyBhIGN1cnNvci4gKHNhbWUgYXMKLSJub2N1cnNvciIpCi0uSVAKLWN1cnNvcl9kcmFnICAgICBlbmFibGUgIGN1cnNvciBjaGFuZ2VzIGR1cmluZyBkcmFnLgotLklQCi1ub2N1cnNvcl9kcmFnICAgZGlzYWJsZSBjdXJzb3IgY2hhbmdlcyBkdXJpbmcgZHJhZy4KLS5JUAotYXJyb3c6biAgICAgICAgIHNldCBcZkItYXJyb3dcZlIgdG8gYWx0ZXJuYXRlIG4uCi0uSVAKLXhmaXhlcyAgICAgICAgICBlbmFibGUgIHhmaXhlcyBjdXJzb3Igc2hhcGUgbW9kZS4KLS5JUAotbm94Zml4ZXMgICAgICAgIGRpc2FibGUgeGZpeGVzIGN1cnNvciBzaGFwZSBtb2RlLgotLklQCi1hbHBoYWN1dDpuICAgICAgc2V0IFxmQi1hbHBoYWN1dFxmUiB0byBuLgotLklQCi1hbHBoYWZyYWM6ZiAgICAgc2V0IFxmQi1hbHBoYWZyYWNcZlIgdG8gZi4KLS5JUAotYWxwaGFyZW1vdmUgICAgIGVuYWJsZSAgXGZCLWFscGhhcmVtb3ZlXGZSIG1vZGUuCi0uSVAKLW5vYWxwaGFyZW1vdmUgICBkaXNhYmxlIFxmQi1hbHBoYXJlbW92ZVxmUiBtb2RlLgotLklQCi1hbHBoYWJsZW5kICAgICAgZGlzYWJsZSBcZkItbm9hbHBoYWJsZW5kXGZSIG1vZGUuCi0uSVAKLW5vYWxwaGFibGVuZCAgICBlbmFibGUgIFxmQi1ub2FscGhhYmxlbmRcZlIgbW9kZS4KLS5JUAotY3Vyc29yc2hhcGUgICAgIGRpc2FibGUgXGZCLW5vY3Vyc29yc2hhcGVcZlIgbW9kZS4KLS5JUAotbm9jdXJzb3JzaGFwZSAgIGVuYWJsZSAgXGZCLW5vY3Vyc29yc2hhcGVcZlIgbW9kZS4KLS5JUAotY3Vyc29ycG9zICAgICAgIGRpc2FibGUgXGZCLW5vY3Vyc29ycG9zXGZSIG1vZGUuCi0uSVAKLW5vY3Vyc29ycG9zICAgICBlbmFibGUgIFxmQi1ub2N1cnNvcnBvc1xmUiBtb2RlLgotLklQCi14d2FycCAgICAgICAgICAgZW5hYmxlICBcZkIteHdhcnBwb2ludGVyXGZSIG1vZGUuCi0uSVAKLW5veHdhcnAgICAgICAgICBkaXNhYmxlIFxmQi14d2FycHBvaW50ZXJcZlIgbW9kZS4KLS5JUAotYWx3YXlzX2luamVjdCAgIGVuYWJsZSAgXGZCLWFsd2F5c19pbmplY3RcZlIgbW9kZS4KLS5JUAotbm9hbHdheXNfaW5qZWN0IGRpc2FibGUgXGZCLWFsd2F5c19pbmplY3RcZlIgbW9kZS4KLS5JUAotYnV0dG9ubWFwOnN0ciAgIHNldCBcZkItYnV0dG9ubWFwXGZSICJzdHIiLCBlbXB0eSB0byBkaXNhYmxlCi0uSVAKLWRyYWdnaW5nICAgICAgICBkaXNhYmxlIFxmQi1ub2RyYWdnaW5nXGZSIG1vZGUuCi0uSVAKLW5vZHJhZ2dpbmcgICAgICBlbmFibGUgIFxmQi1ub2RyYWdnaW5nXGZSIG1vZGUuCi0uSVAKLW5jYWNoZSAgICAgICAgICByZWVuYWJsZSBcZkItbmNhY2hlXGZSIG1vZGUuCi0uSVAKLW5vbmNhY2hlICAgICAgICBkaXNhYmxlICBcZkItbmNhY2hlXGZSIG1vZGUuCi0uSVAKLW5jYWNoZV9zaXplOm4gICBzZXQgXGZCLW5jYWNoZVxmUiBzaXplIHRvIG4uCi0uSVAKLW5jYWNoZV9jciAgICAgICBlbmFibGUgIFxmQi1uY2FjaGVfY3JcZlIgbW9kZS4KLS5JUAotbm9uY2FjaGVfY3IgICAgIGRpc2FibGUgXGZCLW5jYWNoZV9jclxmUiBtb2RlLgotLklQCi1uY2FjaGVfbm9fbW92ZXJhaXNlICAgICBlbmFibGUgIG5vX21vdmVyYWlzZSBtb2RlLgotLklQCi1ub25jYWNoZV9ub19tb3ZlcmFpc2UgICBkaXNhYmxlIG5vX21vdmVyYWlzZSBtb2RlLgotLklQCi1uY2FjaGVfbm9fZHRjaGFuZ2UgICAgICBlbmFibGUgIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLgotLklQCi1ub25jYWNoZV9ub19kdGNoYW5nZSAgICBkaXNhYmxlIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLgotLklQCi1uY2FjaGVfb2xkX3dtICAgICAgICAgICBlbmFibGUgIG5jYWNoZV9vbGRfd20gbW9kZS4KLS5JUAotbm9uY2FjaGVfb2xkX3dtICAgICAgICAgZGlzYWJsZSBuY2FjaGVfb2xkX3dtIG1vZGUuCi0uSVAKLW5jYWNoZV9ub19yb290cGl4bWFwICAgIGVuYWJsZSAgbmNhY2hlX25vX3Jvb3RwaXhtYXAuCi0uSVAKLW5vbmNhY2hlX25vX3Jvb3RwaXhtYXAgIGRpc2FibGUgbmNhY2hlX25vX3Jvb3RwaXhtYXAuCi0uSVAKLW5jYWNoZV9yZXNldF9yb290cGl4bWFwIHJlY2hlY2sgdGhlIHJvb3QgcGl4bWFwLCBuY3JwCi0uSVAKLW5jYWNoZV9rZWVwX2FuaW1zICAgICAgIGVuYWJsZSAgbmNhY2hlX2tlZXBfYW5pbXMuCi0uSVAKLW5vbmNhY2hlX2tlZXBfYW5pbXMgICAgIGRpc2FibGUgbmNhY2hlX2tlZXBfYW5pbXMuCi0uSVAKLW5jYWNoZV9wYWQ6biAgICBzZXQgXGZCLW5jYWNoZV9wYWRcZlIgdG8gbi4KLS5JUAotd2lyZWZyYW1lICAgICAgIGVuYWJsZSAgXGZCLXdpcmVmcmFtZVxmUiBtb2RlLiBzYW1lIGFzICJ3ZiIKLS5JUAotbm93aXJlZnJhbWUgICAgIGRpc2FibGUgXGZCLXdpcmVmcmFtZVxmUiBtb2RlLiBzYW1lIGFzICJub3dmIgotLklQCi13aXJlZnJhbWU6c3RyICAgZW5hYmxlICBcZkItd2lyZWZyYW1lXGZSIG1vZGUgc3RyaW5nLgotLklQCi13aXJlZnJhbWVfbW9kZTpzdHIgZW5hYmxlICBcZkItd2lyZWZyYW1lXGZSIG1vZGUgc3RyaW5nLgotLklQCi13aXJlZnJhbWVsb2NhbCAgZW5hYmxlICB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyAid2ZsIgotLklQCi1ub3dpcmVmcmFtZSAgICAgZGlzYWJsZSB3aXJlZnJhbWVsb2NhbC4gc2FtZSBhcyAibm93ZmwiCi0uSVAKLXdpcmVjb3B5cmVjdDpzdHIgc2V0IFxmQi13aXJlY29weXJlY3RcZlIgc3RyaW5nLiBzYW1lIGFzICJ3Y3I6IgotLklQCi1zY3JvbGxjb3B5cmVjdDpzdHIgc2V0IFxmQi1zY3JvbGxjb3B5cmVjdFxmUiBzdHJpbmcuIHNhbWUgInNjciIKLS5JUAotbm9zY3JvbGxjb3B5cmVjdCBkaXNhYmxlIFxmQi1zY3JvbGxjb3B5cmVjdF9fbW9kZV8uXGZSICJub3NjciIKLS5JUAotc2NyX2FyZWE6biAgICAgIHNldCBcZkItc2NyX2FyZWFcZlIgdG8gbgotLklQCi1zY3Jfc2tpcDpsaXN0ICAgc2V0IFxmQi1zY3Jfc2tpcFxmUiB0byAibGlzdCIKLS5JUAotc2NyX2luYzpsaXN0ICAgIHNldCBcZkItc2NyX2luY1xmUiB0byAibGlzdCIKLS5JUAotc2NyX2tleXM6bGlzdCAgIHNldCBcZkItc2NyX2tleXNcZlIgdG8gImxpc3QiCi0uSVAKLXNjcl90ZXJtOmxpc3QgICBzZXQgXGZCLXNjcl90ZXJtXGZSIHRvICJsaXN0IgotLklQCi1zY3Jfa2V5cmVwZWF0OnN0ciBzZXQgXGZCLXNjcl9rZXlyZXBlYXRcZlIgdG8gInN0ciIKLS5JUAotc2NyX3Bhcm1zOnN0ciAgIHNldCBcZkItc2NyX3Bhcm1zXGZSIHBhcmFtZXRlcnMuCi0uSVAKLWZpeHNjcmVlbjpzdHIgICBzZXQgXGZCLWZpeHNjcmVlblxmUiB0byAic3RyIi4KLS5JUAotbm94cmVjb3JkICAgICAgIGRpc2FibGUgYWxsIHVzZSBvZiBSRUNPUkQgZXh0ZW5zaW9uLgotLklQCi14cmVjb3JkICAgICAgICAgZW5hYmxlICB1c2Ugb2YgUkVDT1JEIGV4dGVuc2lvbi4KLS5JUAotcmVzZXRfcmVjb3JkICAgIHJlc2V0IFJFQ09SRCBleHRlbnNpb24gKGlmIGF2YWlsLikKLS5JUAotcG9pbnRlcl9tb2RlOm4gIHNldCBcZkItcG9pbnRlcl9tb2RlXGZSIHRvIG4uIHNhbWUgYXMgInBtIgotLklQCi1pbnB1dF9za2lwOm4gICAgc2V0IFxmQi1pbnB1dF9za2lwXGZSIHRvIG4uCi0uSVAKLWFsbGlucHV0ICAgICAgICBlbmFibGUgIHVzZSBvZiBcZkItYWxsaW5wdXRcZlIgbW9kZS4KLS5JUAotbm9hbGxpbnB1dCAgICAgIGRpc2FibGUgdXNlIG9mIFxmQi1hbGxpbnB1dFxmUiBtb2RlLgotLklQCi1pbnB1dF9lYWdlcmx5ICAgZW5hYmxlICB1c2Ugb2YgXGZCLWlucHV0X2VhZ2VybHlcZlIgbW9kZS4KLS5JUAotbm9pbnB1dF9lYWdlcmx5IGRpc2FibGUgdXNlIG9mIFxmQi1pbnB1dF9lYWdlcmx5XGZSIG1vZGUuCi0uSVAKLXNzbHRpbWVvdXQ6biAgICBzZXQgXGZCLXNzbHRpbWVvdXRcZlIgdG8gbi4KLS5JUAotc3BlZWRzOnN0ciAgICAgIHNldCBcZkItc3BlZWRzXGZSIHRvIHN0ci4KLS5JUAotd21kdDpzdHIgICAgICAgIHNldCBcZkItd21kdFxmUiB0byBzdHIuCi0uSVAKLWRlYnVnX3BvaW50ZXIgICBlbmFibGUgIFxmQi1kZWJ1Z19wb2ludGVyLFxmUiBzYW1lIGFzICJkcCIKLS5JUAotbm9kZWJ1Z19wb2ludGVyIGRpc2FibGUgXGZCLWRlYnVnX3BvaW50ZXIsXGZSIHNhbWUgYXMgIm5vZHAiCi0uSVAKLWRlYnVnX2tleWJvYXJkICAgZW5hYmxlICBcZkItZGVidWdfa2V5Ym9hcmQsXGZSIHNhbWUgYXMgImRrIgotLklQCi1ub2RlYnVnX2tleWJvYXJkIGRpc2FibGUgXGZCLWRlYnVnX2tleWJvYXJkLFxmUiBzYW1lIGFzICJub2RrIgotLklQCi1rZXljb2RlOm4gICAgICAgaW5qZWN0IGtleXN0cm9rZSAna2V5Y29kZScgKHhtb2RtYXAgXGZCLXBrKVxmUgotLklQCi1rZXljb2RlOm4sZG93biAgaW5qZWN0ICdrZXljb2RlJyAoZG93bj0wLDEpCi0uSVAKLWtleXN5bTpzdHIgICAgICBpbmplY3Qga2V5c3Ryb2tlICdrZXlzeW0nIChudW1iZXIvbmFtZSkKLS5JUAota2V5c3ltOnN0cixkb3duIGluamVjdCAna2V5c3ltJyAoZG93bj0wLDEpCi0uSVAKLXB0cjp4LHksbWFzayAgICBpbmplY3QgcG9pbnRlciBldmVudCB4LCB5LCBidXR0b24tbWFzawotLklQCi1mYWtlYnV0dG9uZXZlbnQ6YnV0dG9uLGRvd24gZGlyZWN0IFhUZXN0RmFrZUJ1dHRvbkV2ZW50LgotLklQCi1zbGVlcDp0ICAgICAgICAgc2xlZXAgZmxvYXRpbmcgcG9pbnQgdGltZSB0LgotLklQCi1nZXRfeHByb3A6cCAgICAgZ2V0IFggcHJvcGVydHkgbmFtZWQgJ3AnLgotLklQCi1zZXRfeHByb3A6cDp2YWwgc2V0IFggcHJvcGVydHkgbmFtZWQgJ3AnIHRvICd2YWwnLgotcCAtPiBpZD1OTk46cCBmb3IgaGV4L2RlYyB3aW5kb3cgaWQuCi0uSVAKLXdpbmluZm86aWQgICAgICBnZXQgaW5mbyBhYm91dCBYIHdpbmRvdyBpZC4gIHVzZSAncm9vdCcKLWZvciByb290IHdpbmRvdywgdXNlICtpZCBmb3IgY2hpbGRyZW4uCi0uSVAKLWdyYWJfc3RhdGUgICAgICBnZXQgc3RhdGUgb2YgcG9pbnRlciBhbmQga2V5Ym9hcmQgZ3JhYi4KLS5JUAotcG9pbnRlcl9wb3MgICAgIHByaW50IFhRdWVyeVBvaW50ZXIgeCx5IGN1cnNvciBwb3NpdGlvbi4KLS5JUAotcG9pbnRlcl94ICAgICAgIHByaW50IFhRdWVyeVBvaW50ZXIgeCBjdXJzb3IgcG9zaXRpb24uCi0uSVAKLXBvaW50ZXJfeSAgICAgICBwcmludCBYUXVlcnlQb2ludGVyIHkgY3Vyc29yIHBvc2l0aW9uLgotLklQCi1wb2ludGVyX3NhbWUgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciBwdHIgb24gc2FtZSBzY3JlZW4uCi0uSVAKLXBvaW50ZXJfcm9vdCAgICBwcmludCBYUXVlcnlQb2ludGVyIGN1cnIgcHRyIHJvb3R3aW4uCi0uSVAKLXBvaW50ZXJfbWFzayAgICBwcmludCBYUXVlcnlQb2ludGVyIGJ1dHRvbiBhbmQgbW9kcyBtYXNrCi0uSVAKLW1vdXNlX3ggICAgICAgICBwcmludCB4MTF2bmMncyBpZGVhIG9mIGN1cnNvciBwb3NpdGlvbi4KLS5JUAotbW91c2VfeSAgICAgICAgIHByaW50IHgxMXZuYydzIGlkZWEgb2YgY3Vyc29yIHBvc2l0aW9uLgotLklQCi1ub29wICAgICAgICAgICAgZG8gbm90aGluZy4KLS5JUAotZGVmZXI6biAgICAgICAgIHNldCBcZkItZGVmZXJcZlIgdG8gbiBtcyxzYW1lIGFzIGRlZmVydXBkYXRlOm4KLS5JUAotd2FpdDpuICAgICAgICAgIHNldCBcZkItd2FpdFxmUiB0byBuIG1zLgotLklQCi1leHRyYV9mYnVyOm4gICAgc2V0IFxmQi1leHRyYV9mYnVyXGZSIHRvIG4uCi0uSVAKLXdhaXRfdWk6ZiAgICAgICBzZXQgXGZCLXdhaXRfdWlcZlIgZmFjdG9yIHRvIGYuCi0uSVAKLXNldGRlZmVyOm4gICAgICBzZXQgXGZCLXNldGRlZmVyXGZSIHRvIFxmQi0yLC0xLDAsMSxcZlIgb3IgMi4KLS5JUAotd2FpdF9ib2cgICAgICAgIGRpc2FibGUgXGZCLW5vd2FpdF9ib2dcZlIgbW9kZS4KLS5JUAotbm93YWl0X2JvZyAgICAgIGVuYWJsZSAgXGZCLW5vd2FpdF9ib2dcZlIgbW9kZS4KLS5JUAotc2xvd19mYjpmICAgICAgIHNldCBcZkItc2xvd19mYlxmUiB0byBmIHNlY29uZHMuCi0uSVAKLXhyZWZyZXNoOmYgICAgICBzZXQgXGZCLXhyZWZyZXNoXGZSIHRvIGYgc2Vjb25kcy4KLS5JUAotcmVhZHRpbWVvdXQ6biAgIHNldCByZWFkIHRpbWVvdXQgdG8gbiBzZWNvbmRzLgotLklQCi1uYXAgICAgICAgICAgICAgZW5hYmxlICBcZkItbmFwXGZSIG1vZGUuCi0uSVAKLW5vbmFwICAgICAgICAgICBkaXNhYmxlIFxmQi1uYXBcZlIgbW9kZS4KLS5JUAotc2I6biAgICAgICAgICAgIHNldCBcZkItc2JcZlIgdG8gbiBzLCBzYW1lIGFzIHNjcmVlbl9ibGFuazpuCi0uSVAKLWZicG0gICAgICAgICAgICBkaXNhYmxlIFxmQi1ub2ZicG1cZlIgbW9kZS4KLS5JUAotbm9mYnBtICAgICAgICAgIGVuYWJsZSAgXGZCLW5vZmJwbVxmUiBtb2RlLgotLklQCi1kcG1zICAgICAgICAgICAgZGlzYWJsZSBcZkItbm9kcG1zXGZSIG1vZGUuCi0uSVAKLW5vZHBtcyAgICAgICAgICBlbmFibGUgIFxmQi1ub2RwbXNcZlIgbW9kZS4KLS5JUAotZm9yY2VkcG1zICAgICAgIGVuYWJsZSAgXGZCLWZvcmNlZHBtc1xmUiBtb2RlLgotLklQCi1ub2ZvcmNlZHBtcyAgICAgZGlzYWJsZSBcZkItZm9yY2VkcG1zXGZSIG1vZGUuCi0uSVAKLWNsaWVudGRwbXMgICAgICBlbmFibGUgIFxmQi1jbGllbnRkcG1zXGZSIG1vZGUuCi0uSVAKLW5vY2xpZW50ZHBtcyAgICBkaXNhYmxlIFxmQi1jbGllbnRkcG1zXGZSIG1vZGUuCi0uSVAKLW5vc2VydmVyZHBtcyAgICBlbmFibGUgIFxmQi1ub3NlcnZlcmRwbXNcZlIgbW9kZS4KLS5JUAotc2VydmVyZHBtcyAgICAgIGRpc2FibGUgXGZCLW5vc2VydmVyZHBtc1xmUiBtb2RlLgotLklQCi1ub3VsdHJhZXh0ICAgICAgZW5hYmxlICBcZkItbm91bHRyYWV4dFxmUiBtb2RlLgotLklQCi11bHRyYWV4dCAgICAgICAgZGlzYWJsZSBcZkItbm91bHRyYWV4dFxmUiBtb2RlLgotLklQCi1jaGF0d2luZG93ICAgICAgZW5hYmxlICBsb2NhbCBjaGF0d2luZG93IG1vZGUuCi0uSVAKLW5vY2hhdHdpbmRvdyAgICBkaXNhYmxlIGxvY2FsIGNoYXR3aW5kb3cgbW9kZS4KLS5JUAotY2hhdG9uICAgICAgICAgIGJlZ2luIGNoYXQgdXNpbmcgbG9jYWwgd2luZG93LgotLklQCi1jaGF0b2ZmICAgICAgICAgZW5kICAgY2hhdCB1c2luZyBsb2NhbCB3aW5kb3cuCi0uSVAKLXhkYW1hZ2UgICAgICAgICBlbmFibGUgIHhkYW1hZ2UgcG9sbGluZyBoaW50cy4KLS5JUAotbm94ZGFtYWdlICAgICAgIGRpc2FibGUgeGRhbWFnZSBwb2xsaW5nIGhpbnRzLgotLklQCi14ZF9hcmVhOkEgICAgICAgc2V0IFxmQi14ZF9hcmVhXGZSIG1heCBwaXhlbCBhcmVhIHRvICJBIgotLklQCi14ZF9tZW06ZiAgICAgICAgc2V0IFxmQi14ZF9tZW1cZlIgcmVtZW1icmFuY2UgdG8gImYiCi0uSVAKLWZzOmZyYWMgICAgICAgICBzZXQgXGZCLWZzXGZSIGZyYWN0aW9uIHRvICJmcmFjIiwgZS5nLiAwLjUKLS5JUAotZ2FwczpuICAgICAgICAgIHNldCBcZkItZ2Fwc1xmUiB0byBuLgotLklQCi1ncm93Om4gICAgICAgICAgc2V0IFxmQi1ncm93XGZSIHRvIG4uCi0uSVAKLWZ1eno6biAgICAgICAgICBzZXQgXGZCLWZ1enpcZlIgdG8gbi4KLS5JUAotc25hcGZiICAgICAgICAgIGVuYWJsZSAgXGZCLXNuYXBmYlxmUiBtb2RlLgotLklQCi1ub3NuYXBmYiAgICAgICAgZGlzYWJsZSBcZkItc25hcGZiXGZSIG1vZGUuCi0uSVAKLXJhd2ZiOnN0ciAgICAgICBzZXQgXGZCLXJhd2ZiXGZSIG1vZGUgdG8gInN0ciIuCi0uSVAKLXVpbnB1dF9hY2NlbDpmICBzZXQgdWlucHV0X2FjY2VsIHRvIGYuCi0uSVAKLXVpbnB1dF90aHJlc2g6biBzZXQgdWlucHV0X3RocmVzaCB0byBuLgotLklQCi11aW5wdXRfcmVzZXQ6biAgc2V0IHVpbnB1dF9yZXNldCB0byBuIG1zLgotLklQCi11aW5wdXRfYWx3YXlzOm4gc2V0IHVpbnB1dF9hbHdheXMgdG8gMS8wLgotLklQCi1wcm9ncmVzc2l2ZTpuICAgc2V0IExpYlZOQ1NlcnZlciBcZkItcHJvZ3Jlc3NpdmVcZlIgc2xpY2UKLWhlaWdodCBwYXJhbWV0ZXIgdG8gbi4KLS5JUAotZGVza3RvcDpzdHIgICAgIHNldCBcZkItZGVza3RvcFxmUiBuYW1lIHRvIHN0ciBmb3IgbmV3IGNsaWVudHMuCi0uSVAKLXJmYnBvcnQ6biAgICAgICBzZXQgXGZCLXJmYnBvcnRcZlIgdG8gbi4KLS5JUAotbWFjbm9zYXZlciAgICAgIGVuYWJsZSAgXGZCLW1hY25vc2F2ZXJcZlIgbW9kZS4KLS5JUAotbWFjc2F2ZXIgICAgICAgIGRpc2FibGUgXGZCLW1hY25vc2F2ZXJcZlIgbW9kZS4KLS5JUAotbWFjbm93YWl0ICAgICAgIGVuYWJsZSAgXGZCLW1hY25vd2FpdFxmUiAgbW9kZS4KLS5JUAotbWFjd2FpdCAgICAgICAgIGRpc2FibGUgXGZCLW1hY25vd2FpdFxmUiAgbW9kZS4KLS5JUAotbWFjd2hlZWw6biAgICAgIHNldCBcZkItbWFjd2hlZWxcZlIgdG8gbi4KLS5JUAotbWFjbm9zd2FwICAgICAgIGVuYWJsZSAgXGZCLW1hY25vc3dhcFxmUiBtb3VzZSBidXR0b24gbW9kZS4KLS5JUAotbWFjc3dhcCAgICAgICAgIGRpc2FibGUgXGZCLW1hY25vc3dhcFxmUiBtb3VzZSBidXR0b24gbW9kZS4KLS5JUAotbWFjbm9yZXNpemUgICAgIGVuYWJsZSAgXGZCLW1hY25vcmVzaXplXGZSIG1vZGUuCi0uSVAKLW1hY3Jlc2l6ZSAgICAgICBkaXNhYmxlIFxmQi1tYWNub3Jlc2l6ZVxmUiBtb2RlLgotLklQCi1tYWNpY29uYW5pbTpuICAgc2V0IFxmQi1tYWNpY29uYW5pbVxmUiB0byBuLgotLklQCi1tYWNtZW51ICAgICAgICAgZW5hYmxlICBcZkItbWFjbWVudVxmUiAgbW9kZS4KLS5JUAotbWFjbm9tZW51ICAgICAgIGRpc2FibGUgXGZCLW1hY21lbnVcZlIgIG1vZGUuCi0uSVAKLW1hY3Vza2JkICAgICAgICBlbmFibGUgIFxmQi1tYWN1c2tiZFxmUiBtb2RlLgotLklQCi1tYWNub3Vza2JkICAgICAgZGlzYWJsZSBcZkItbWFjdXNrYmRcZlIgbW9kZS4KLS5JUAotaHR0cHBvcnQ6biAgICAgIHNldCBcZkItaHR0cHBvcnRcZlIgdG8gbi4KLS5JUAotaHR0cGRpcjpkaXIgICAgIHNldCBcZkItaHR0cGRpclxmUiB0byBkaXIgKGFuZCBlbmFibGUgaHR0cCkuCi0uSVAKLWVuYWJsZWh0dHBwcm94eSAgIGVuYWJsZSAgXGZCLWVuYWJsZWh0dHBwcm94eVxmUiBtb2RlLgotLklQCi1ub2VuYWJsZWh0dHBwcm94eSBkaXNhYmxlIFxmQi1lbmFibGVodHRwcHJveHlcZlIgbW9kZS4KLS5JUAotYWx3YXlzc2hhcmVkICAgICBlbmFibGUgIFxmQi1hbHdheXNzaGFyZWRcZlIgbW9kZS4KLS5JUAotbm9hbHdheXNzaGFyZWQgICBkaXNhYmxlIFxmQi1hbHdheXNzaGFyZWRcZlIgbW9kZS4KLShtYXkgaW50ZXJmZXJlIHdpdGggb3RoZXIgb3B0aW9ucykKLS5JUAotbmV2ZXJzaGFyZWQgICAgICBlbmFibGUgIFxmQi1uZXZlcnNoYXJlZFxmUiBtb2RlLgotLklQCi1ub25ldmVyc2hhcmVkICAgIGRpc2FibGUgXGZCLW5ldmVyc2hhcmVkXGZSIG1vZGUuCi0obWF5IGludGVyZmVyZSB3aXRoIG90aGVyIG9wdGlvbnMpCi0uSVAKLWRvbnRkaXNjb25uZWN0ICAgZW5hYmxlICBcZkItZG9udGRpc2Nvbm5lY3RcZlIgbW9kZS4KLS5JUAotbm9kb250ZGlzY29ubmVjdCBkaXNhYmxlIFxmQi1kb250ZGlzY29ubmVjdFxmUiBtb2RlLgotKG1heSBpbnRlcmZlcmUgd2l0aCBvdGhlciBvcHRpb25zKQotLklQCi1kZWJ1Z194ZXZlbnRzICAgZW5hYmxlICBkZWJ1Z2dpbmcgWCBldmVudHMuCi0uSVAKLW5vZGVidWdfeGV2ZW50cyBkaXNhYmxlIGRlYnVnZ2luZyBYIGV2ZW50cy4KLS5JUAotZGVidWdfeGRhbWFnZSAgIGVuYWJsZSAgZGVidWdnaW5nIFggREFNQUdFIG1lY2hhbmlzbS4KLS5JUAotbm9kZWJ1Z194ZGFtYWdlIGRpc2FibGUgZGVidWdnaW5nIFggREFNQUdFIG1lY2hhbmlzbS4KLS5JUAotZGVidWdfd2lyZWZyYW1lIGVuYWJsZSAgIGRlYnVnZ2luZyB3aXJlZnJhbWUgbWVjaGFuaXNtLgotLklQCi1ub2RlYnVnX3dpcmVmcmFtZSBkaXNhYmxlIGRlYnVnZ2luZyB3aXJlZnJhbWUgbWVjaGFuaXNtLgotLklQCi1kZWJ1Z19zY3JvbGwgICAgZW5hYmxlICBkZWJ1Z2dpbmcgc2Nyb2xsY29weSBtZWNoYW5pc20uCi0uSVAKLW5vZGVidWdfc2Nyb2xsICBkaXNhYmxlIGRlYnVnZ2luZyBzY3JvbGxjb3B5IG1lY2hhbmlzbS4KLS5JUAotZGVidWdfdGlsZXMgICAgIGVuYWJsZSAgXGZCLWRlYnVnX3RpbGVzXGZSCi0uSVAKLW5vZGVidWdfdGlsZXMgICBkaXNhYmxlIFxmQi1kZWJ1Z190aWxlc1xmUgotLklQCi1kZWJ1Z19ncmFicyAgICAgZW5hYmxlICBcZkItZGVidWdfZ3JhYnNcZlIKLS5JUAotbm9kZWJ1Z19ncmFicyAgIGRpc2FibGUgXGZCLWRlYnVnX2dyYWJzXGZSCi0uSVAKLWRlYnVnX3NlbCAgICAgICBlbmFibGUgIFxmQi1kZWJ1Z19zZWxcZlIKLS5JUAotbm9kZWJ1Z19zZWwgICAgIGRpc2FibGUgXGZCLWRlYnVnX3NlbFxmUgotLklQCi1kZWJ1Z19uY2FjaGUgICAgZW5hYmxlICBcZkItZGVidWdfbmNhY2hlXGZSCi0uSVAKLW5vZGVidWdfbmNhY2hlICBkaXNhYmxlIFxmQi1kZWJ1Z19uY2FjaGVcZlIKLS5JUAotZGJnICAgICAgICAgICAgIGVuYWJsZSAgXGZCLWRiZ1xmUiBjcmFzaCBzaGVsbAotLklQCi1ub2RiZyAgICAgICAgICAgZGlzYWJsZSBcZkItZGJnXGZSIGNyYXNoIHNoZWxsCi0uSVAKLS5JUAotbm9yZW1vdGUgICAgICAgIGRpc2FibGUgdGhlIFxmQi1yZW1vdGVcZlIgY29tbWFuZCBwcm9jZXNzaW5nLAotaXQgY2Fubm90IGJlIHR1cm5lZCBiYWNrIG9uLgotLklQCi0uSVAKLWJjeF94YXR0YWNoOnN0ciAgVGhpcyByZW1vdGUgY29udHJvbCBjb21tYW5kIGlzIGZvcgotdXNlIHdpdGggdGhlIEJBUkNPIHhhdHRhY2ggcHJvZ3JhbSBvciB0aGUgeDJ4IHByb2dyYW0uCi1Cb3RoIG9mIHRoZXNlIHByb2dyYW1zIGFyZSBmb3IgJ3BvaW50ZXIgYW5kIGtleWJvYXJkJwotc2hhcmluZyBiZXR3ZWVuIHNlcGFyYXRlIFggZGlzcGxheXMuICBJbiBnZW5lcmFsIHRoZQotdHdvIGRpc3BsYXlzIGFyZSB1c3VhbGx5IG5lYXJieSwgZS5nLiBvbiB0aGUgc2FtZSBkZXNrLAotYW5kIHRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHNoYXJlIGEgc2luZ2xlIHBvaW50ZXIgYW5kCi1rZXlib2FyZCBiZXR3ZWVuIHRoZW0uICBUaGUgdXNlciBtb3ZlcyB0aGUgbW91c2UgdG8KLWFuIGVkZ2UgYW5kIHRoZW4gdGhlIG1vdXNlIHBvaW50ZXIgYXBwZWFycyB0byAnanVtcCcKLXRvIHRoZSBvdGhlciBkaXNwbGF5IHNjcmVlbi4gIFRodXMgaXQgZW11bGF0ZXMgd2hhdCBhCi1zaW5nbGUgWCBzZXJ2ZXIgd291bGQgZG8gZm9yIHR3byBzY3JlZW5zIChlLmcuIDowLjAgYW5kCi06MC4xKSBUaGUgaWxsdXNpb24gb2YgYSBzaW5nbGUgWHNlcnZlciB3aXRoIG11bHRpcGxlCi1zY3JlZW5zIGlzIGFjaGlldmVkIGJ5IGZvcndhcmRpbmcgZXZlbnRzIHRvIHRoZSAybmQKLW9uZSB2aWEgdGhlIFhURVNUIGV4dGVuc2lvbi4KLS5JUAotV2hhdCB0aGUgeDExdm5jIGJjeF94YXR0YWNoIGNvbW1hbmQgZG9lcyBpcyB0byBwZXJmb3JtCi1zb21lIHBvaW50ZXIgbW92ZW1lbnRzIHRvIHRyeSB0byBJTkRVQ0UgeGF0dGFjaC94MngKLXRvICdqdW1wJyB0byB0aGUgb3RoZXIgZGlzcGxheS4gIEluIHdoYXQgZm9sbG93cyB0aGUKLVwnbWFzdGVyJyBkaXNwbGF5IHJlZmVycyB0byB0aGUgb25lIHRoYXQgd2hlbiBpdCBoYXMKLVwnZm9jdXMnIGl0IGlzIGJhc2ljYWxseSBkb2luZyBub3RoaW5nIGJlc2lkZXMgd2F0Y2hpbmcKLWZvciB0aGUgbW91c2UgdG8gZ28gb3ZlciBhbiBlZGdlLiAgVGhlICdzbGF2ZScKLWRpc3BsYXkgcmVmZXJzIHRvIHRoZSBvbmUgdG8gd2hpY2ggdGhlIG1vdXNlIGFuZAota2V5Ym9hcmQgaXMgcmVkaXJlY3RlZCB0byBvbmNlIGFuIGVkZ2UgaW4gdGhlIG1hc3RlcgotaGFzIGJlZW4gY3Jvc3NlZC4gIE5vdGUgdGhhdCB0aGUgeDExdm5jIGV4ZWN1dGluZyB0aGUKLWJjeF94YXR0YWNoIGNvbW1hbmQgTVVTVCBiZSB0aGUgb25lIGNvbm5lY3RlZCB0byB0aGUKLSptYXN0ZXIqIGRpc3BsYXkuCi0uSVAKLUFsc28gbm90ZSB0aGF0IHdoZW4gaW5wdXQgaXMgYmVpbmcgcmVkaXJlY3RlZCAodmlhCi1YVEVTVCkgZnJvbSB0aGUgbWFzdGVyIGRpc3BsYXkgdG8gdGhlIHNsYXZlIGRpc3BsYXksCi10aGUgbWFzdGVyIGRpc3BsYXkncyBwb2ludGVyIGFuZCBrZXlib2FyZCBhcmUgKmdyYWJiZWQqCi1ieSB4YXR0YWNoL3gyeC4gIHgxMXZuYyBjYW4gdXNlIHRoaXMgaW5mbyB0byB2ZXJpZnkgdGhhdAotdGhlIG1hc3Rlci9zbGF2ZSBtb2RlIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UgY29ycmVjdGx5LgotSWYgeW91IHNwZWNpZnkgdGhlICJpZm5lZWRlZCIgb3B0aW9uIChzZWUgYmVsb3cpCi1hbmQgdGhlIGluaXRpYWwgZ3JhYiBzdGF0ZSBpcyB0aGF0IG9mIHRoZSBkZXNpcmVkCi1maW5hbCBzdGF0ZSwgdGhlbiBubyBwb2ludGVyIG1vdmVtZW50cyBhcmUgaW5qZWN0ZWQKLWFuZCAiRE9ORSxHUkFCX09LIiBpcyByZXR1cm5lZC4KLS5JUAotInN0ciIgbXVzdCBjb250YWluIG9uZSBvZiAidXAiLCAiZG93biIsICJsZWZ0IiwKLW9yICJyaWdodCIgdG8gaW5kaWNhdGUgdGhlIGRpcmVjdGlvbiBvZiB0aGUgJ2p1bXAnLgotInN0ciIgbXVzdCBhbHNvIGNvbnRhaW4gb25lIG9mICJtYXN0ZXJfdG9fc2xhdmUiCi1vciAic2xhdmVfdG9fbWFzdGVyIiB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBtb2RlCi1jaGFuZ2UgaW5kdWNlZCBieSB0aGUganVtcC4gIFVzZSAiTTJTIiBhbmQgIlMyTSIKLWFzIHNob3J0ZXIgYWxpYXNlcy4KLS5JUAotInN0ciIgbWF5IGJlIGEgIisiIHNlcGFyYXRlZCBsaXN0IG9mIGFkZGl0aW9uYWwKLXR1bmluZyBvcHRpb25zLiAgVGhlICJzaGlmdD1uIiBvcHRpb24gaW5kaWNhdGVzIGFuCi1vZmZzZXQgc2hpZnQgcG9zaXRpb24gYXdheSBmcm9tICgwLDApIChkZWZhdWx0IDIwKS4KLSJmaW5hbD14K3kiIHNwZWNpZmllcyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIGN1cnNvcgotYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIG1vdmUgc2VxdWVuY2U7IGRlZmF1bHQgMzArMzAuCi0iZXh0cmFfbW92ZT14K3kiIG1lYW5zIHRvIGRvIG9uZSBtb3JlIHBvaW50ZXIgbW92ZQotYWZ0ZXIgImZpbmFsIiB0byB4K3kuICAiZHQ9biIgc2V0cyB0aGUgc2xlZXAgdGltZQotaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9pbnRlciBtb3ZlcyAoZGVmYXVsdDogNDBtcykKLSJyZXRyeT1uIiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgaWYKLXRoZSBncmFiIHN0YXRlIGNoYW5nZSBmYWlscy4gImlmbmVlZGVkIiBtZWFucyB0byBub3QKLWFwcGx5IHRoZSBwb2ludGVyIG1vdmVtZW50cyBpZiB0aGUgaW5pdGlhbCBncmFiIHN0YXRlIGlzCi10aGF0IG9mIHRoZSBkZXNpcmVkIGZpbmFsIHN0YXRlLiAibm9ncmFiY2hlY2siIG1lYW5zCi10byBub3QgY2hlY2sgaWYgdGhlIGdyYWIgc3RhdGUgY2hhbmdlZCBhcyBleHBlY3RlZCBhbmQKLW9ubHkgYXBwbHkgdGhlIHBvaW50ZXIgbW92ZW1lbnRzIChkZWZhdWx0IGlzIHRvIGNoZWNrCi10aGUgZ3JhYiBzdGF0ZXMuKQotLklQCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgInVwIiwgZXRjLiwgdG8gYmN4X3hhdHRhY2gKLW5vdGhpbmcgd2lsbCBiZSBhdHRlbXB0ZWQgYW5kIHRoZSBjb21tYW5kIHJldHVybnMKLXRoZSBzdHJpbmcgRkFJTCxOT19ESVJFQ1RJT05fU1BFQ0lGSUVELiAgSWYgeW91IGRvCi1ub3Qgc3BlY2lmeSAibWFzdGVyX3RvX3NsYXZlIiBvciAiTTJTIiwgZXRjLiwgdG8KLWJjeF94YXR0YWNoIG5vdGhpbmcgd2lsbCBiZSBhdHRlbXB0ZWQgYW5kIHRoZSBjb21tYW5kCi1yZXR1cm5zIHRoZSBzdHJpbmcgRkFJTCxOT19NT0RFX0NIQU5HRV9TUEVDSUZJRUQuCi0uSVAKLU90aGVyd2lzZSwgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGNvbnRhaW4gIkRPTkUiLgotSXQgd2lsbCBiZSAiRE9ORSxHUkFCX09LIiBpZiB0aGUgZ3JhYiBzdGF0ZSBjaGFuZ2VkCi1hcyBleHBlY3RlZCAob3IgaWYgImlmbmVlZGVkIiB3YXMgc3VwcGxpZWQgYW5kCi10aGUgaW5pdGlhbCBncmFiIHN0YXRlIHdhcyBhbHJlYWR5IHRoZSBkZXNpcmVkCi1vbmUuKSAgSWYgdGhlIGluaXRpYWwgZ3JhYiBzdGF0ZSB3YXMgaW5jb3JyZWN0LAotYnV0IHRoZSBmaW5hbCBncmFiIHN0YXRlIHdhcyBjb3JyZWN0IHRoZW4gaXQgaXMKLSJET05FLEdSQUJfRkFJTF9JTklUIi4gIElmIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUKLXdhcyBjb3JyZWN0LCBidXQgdGhlIGZpbmFsIGdyYWIgc3RhdGUgd2FzIGluY29ycmVjdAotdGhlbiBpdCBpcyAiRE9ORSxHUkFCX0ZBSUxfRklOQUwiLiAgSWYgYm90aCBhcmUKLWluY29ycmVjdCBpdCB3aWxsIGJlICJET05FLEdSQUJfRkFJTCIuICBVbmRlciBncmFiCi1mYWlsdXJlIHRoZSBzdHJpbmcgd2lsbCBiZSBmb2xsb3dlZCBieSAiOnAxLGsxLXAyLGsyIgotd2hlcmUgIHAxLGsxIGluZGljYXRlcyB0aGUgaW5pdGlhbCBwb2ludGVyIGFuZCBrZXlib2FyZAotZ3JhYiBzdGF0ZXMgYW5kIHAyLGsyIHRoZSBmaW5hbCBvbmVzLiBJZiBHUkFCX0ZBSUwgb3IKLUdSQUJfRkFJTF9GSU5BTCBvY2N1cnMsIHRoZSBhY3Rpb24gd2lsbCBiZSByZXRyaWVkIHVwCi10byAzIHRpbWVzOyB0cnlpbmcgdG8gcmVzZXQgdGhlIHN0YXRlIGFuZCBzbGVlcGluZyBhCi1iaXQgYmV0d2VlbiBlYWNoIHRyeS4gIFNldCByZXRyeT1uIHRvIGFkanVzdCB0aGUgbnVtYmVyCi1vZiByZXRyaWVzLCB6ZXJvIHRvIGRpc2FibGUgcmV0cmllcy4KLS5JUAotRXhhbXBsZXM6Ci1cZkItUlxmUiBiY3hfeGF0dGFjaDpkb3duK00yUwotXGZCLVJcZlIgYmN4X3hhdHRhY2g6dXArUzJNCi1cZkItUlxmUiBiY3hfeGF0dGFjaDp1cCtTMk0rbm9ncmFiY2hlY2srZHQ9MzAKLVxmQi1SXGZSIGJjeF94YXR0YWNoOmRvd24rTTJTK2V4dHJhX21vdmU9MTAwKzEwMAotLklQCi1vciB1c2UgXGZCLVFcZlIgaW5zdGVhZCBvZiBcZkItUlxmUiB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IHRleHQuCi0uSVAKLUVuZCBvZiB0aGUgYmN4X3hhdHRhY2g6c3RyIGRlc2NyaXB0aW9uLgotLklQCi1UaGUgCi0uSVIgdm5jY29ubmVjdCAoMSkKLWNvbW1hbmQgZnJvbSBzdGFuZGFyZCBWTkMKLWRpc3RyaWJ1dGlvbnMgbWF5IGFsc28gYmUgdXNlZCBpZiBzdHJpbmcgaXMgcHJlZml4ZWQKLXdpdGggImNtZD0iIEUuZy4gJ3ZuY2Nvbm5lY3QgY21kPXN0b3AnLiAgVW5kZXIgc29tZQotY2lyY3Vtc3RhbmNlcyAKLS5JUiB4cHJvcCAoMSkKLWNhbiB1c2VkIGlmIGl0IHN1cHBvcnRzIFxmQi1zZXRcZlIKLShzZWUgdGhlIEZBUSkuCi0uSVAKLUlmICJcZkItY29ubmVjdFxmUiBcZkkvcGF0aC90by9maWxlXGZSIiBoYXMgYmVlbiBzdXBwbGllZCB0byB0aGUKLXJ1bm5pbmcgeDExdm5jIHNlcnZlciB0aGVuIHRoYXQgZmlsZSBjYW4gYmUgdXNlZCBhcyBhCi1jb21tdW5pY2F0aW9uIGNoYW5uZWwgKHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHJlbW90ZQotY29udHJvbCBvbmUgb2YgbWFueSB4MTF2bmMncyBwb2xsaW5nIHRoZSBzYW1lIFggZGlzcGxheSkKLVNpbXBseSBydW46ICd4MTF2bmMgXGZCLWNvbm5lY3RcZlIgL3BhdGgvdG8vZmlsZSBcZkItcmVtb3RlXGZSIC4uLicKLW9yIHlvdSBjYW4gZGlyZWN0bHkgd3JpdGUgdG8gdGhlIGZpbGUgdmlhIHNvbWV0aGluZwotbGlrZTogImVjaG8gY21kPXN0b3AgPiAvcGF0aC90by9maWxlIiwgZXRjLgotLlBQCi1cZkItcXVlcnlcZlIgXGZJdmFyaWFibGVcZlIKLS5JUAotTGlrZSBcZkItcmVtb3RlLFxmUiBleGNlcHQganVzdCBxdWVyeSB0aGUgdmFsdWUgb2YKLVxmSXZhcmlhYmxlXGZSLiAgIlxmQi1RXGZSIiBpcyBhbiBhbGlhcyBmb3IgIlxmQi1xdWVyeVxmUiIuCi1NdWx0aXBsZSBxdWVyaWVzIGNhbiBiZSBkb25lIGJ5IHNlcGFyYXRpbmcgdmFyaWFibGVzCi1ieSBjb21tYXMsIGUuZy4gXGZCLXF1ZXJ5XGZSIHZhcjEsdmFyMi4gVGhlIHJlc3VsdHMgY29tZQotYmFjayBpbiB0aGUgZm9ybSBhbnM9dmFyMTp2YWx1ZTEsYW5zPXZhcjI6dmFsdWUyLC4uLgotdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIElmIGEgdmFyaWFibGUgaXMgcmVhZC1vbmx5LAotaXQgY29tZXMgYmFjayB3aXRoIHByZWZpeCAiYXJvPSIgaW5zdGVhZCBvZiAiYW5zPSIuCi0uSVAKLVNvbWUgXGZCLXJlbW90ZVxmUiBjb21tYW5kcyBhcmUgcHVyZSBhY3Rpb25zIHRoYXQgZG8gbm90IG1ha2UKLXNlbnNlIGFzIHZhcmlhYmxlcywgZS5nLiAic3RvcCIgb3IgImRpc2Nvbm5lY3QiLCBpbgotdGhlc2UgY2FzZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzICJOL0EiLiAgVG8gZGlyZWN0IGEKLXF1ZXJ5IHN0cmFpZ2h0IHRvIHRoZSBYMTFWTkNfUkVNT1RFIHByb3BlcnR5IG9yIGNvbm5lY3QKLWZpbGUgdXNlICJxcnk9Li4uIiBpbnN0ZWFkIG9mICJjbWQ9Li4uIgotLklQCi1hbnM9IHN0b3AgcXVpdCBleGl0IHNodXRkb3duIHBpbmcgcmVzZW5kX2N1dGJ1ZmZlcgotcmVzZW5kX2NsaXBib2FyZCByZXNlbmRfcHJpbWFyeSBibGFja2VuIHplcm8gcmVmcmVzaAotcmVzZXQgY2xvc2UgZGlzY29ubmVjdCBpZF9jbWQgaWQgc2lkIHdhaXRtYXBwZWQKLW5vd2FpdG1hcHBlZCBjbGlwIGZsYXNoY21hcCBub2ZsYXNoY21hcCBzaGlmdGNtYXAKLXRydWVjb2xvciBub3RydWVjb2xvciBvdmVybGF5IG5vb3ZlcmxheSBvdmVybGF5X2N1cnNvcgotb3ZlcmxheV95ZXNjdXJzb3Igbm9vdmVybGF5X25vY3Vyc29yIG5vb3ZlcmxheV9jdXJzb3IKLW5vb3ZlcmxheV95ZXNjdXJzb3Igb3ZlcmxheV9ub2N1cnNvciA4dG8yNCBubzh0bzI0Ci04dG8yNF9vcHRzIDI0dG8zMiBubzI0dG8zMiB2aXN1YWwgc2NhbGUgc2NhbGVfY3Vyc29yCi12aWV3b25seSBub3ZpZXdvbmx5IHNoYXJlZCBub3NoYXJlZCBmb3JldmVyIG5vZm9yZXZlcgotb25jZSB0aW1lb3V0IHRpZ2h0ZmlsZXhmZXIgbm90aWdodGZpbGV4ZmVyIHVsdHJhZmlsZXhmZXIKLW5vdWx0cmFmaWxleGZlciByZmJ2ZXJzaW9uIGRlbnkgbG9jayBub2RlbnkgdW5sb2NrIGF2YWhpCi1tZG5zIHplcm9jb25mIG5vYXZhaGkgbm9tZG5zIG5vemVyb2NvbmYgY29ubmVjdCBwcm94eQotYWxsb3dvbmNlIGFsbG93IG5vaXB2NiBpcHY2IG5vaXB2NCBpcHY0IG5vNiA2IGxvY2FsaG9zdAotbm9sb2NhbGhvc3QgbGlzdGVuIGxvb2t1cCBub2xvb2t1cCBhY2NlcHQgYWZ0ZXJhY2NlcHQKLWdvbmUgc2htIG5vc2htIGZsaXBieXRlb3JkZXIgbm9mbGlwYnl0ZW9yZGVyIG9uZXRpbGUKLW5vb25ldGlsZSBzb2xpZF9jb2xvciBzb2xpZCBub3NvbGlkIGJsYWNrb3V0IHhpbmVyYW1hCi1ub3hpbmVyYW1hIHh0cmFwIG5veHRyYXAgeHJhbmRyIG5veHJhbmRyIHhyYW5kcl9tb2RlCi1yb3RhdGUgcGFkZ2VvbSBxdWlldCBxIG5vcXVpZXQgbW9kdHdlYWsgbm9tb2R0d2VhayB4a2IKLW5veGtiIGNhcHNsb2NrIG5vY2Fwc2xvY2sgc2tpcF9sb2Nra2V5cyBub3NraXBfbG9ja2tleXMKLXNraXBfa2V5Y29kZXMgc2xvcHB5X2tleXMgbm9zbG9wcHlfa2V5cyBza2lwX2R1cHMKLW5vc2tpcF9kdXBzIGFkZF9rZXlzeW1zIG5vYWRkX2tleXN5bXMgY2xlYXJfbW9kcwotbm9jbGVhcl9tb2RzIGNsZWFyX2tleXMgbm9jbGVhcl9rZXlzIGNsZWFyX2FsbAotY2xlYXJfbG9ja3Mga2V5c3RhdGUgcmVtYXAgcmVwZWF0IG5vcmVwZWF0IGZiIG5vZmIgYmVsbAotbm9iZWxsIHNlbmRiZWxsIHNlbCBub3NlbCBwcmltYXJ5IG5vcHJpbWFyeSBzZXRwcmltYXJ5Ci1ub3NldHByaW1hcnkgY2xpcGJvYXJkIG5vY2xpcGJvYXJkIHNldGNsaXBib2FyZAotbm9zZXRjbGlwYm9hcmQgc2VsZGlyIGN1cnNvcnNoYXBlIG5vY3Vyc29yc2hhcGUKLWN1cnNvcnBvcyBub2N1cnNvcnBvcyBjdXJzb3JfZHJhZyBub2N1cnNvcl9kcmFnIGN1cnNvcgotc2hvd19jdXJzb3Igbm9zaG93X2N1cnNvciBub2N1cnNvciBhcnJvdyB4Zml4ZXMgbm94Zml4ZXMKLXhkYW1hZ2Ugbm94ZGFtYWdlIHhkX2FyZWEgeGRfbWVtIGFscGhhY3V0IGFscGhhZnJhYwotYWxwaGFyZW1vdmUgbm9hbHBoYXJlbW92ZSBhbHBoYWJsZW5kIG5vYWxwaGFibGVuZAoteHdhcnBwb2ludGVyIHh3YXJwIG5veHdhcnBwb2ludGVyIG5veHdhcnAgYWx3YXlzX2luamVjdAotbm9hbHdheXNfaW5qZWN0IGJ1dHRvbm1hcCBkcmFnZ2luZyBub2RyYWdnaW5nIG5jYWNoZV9jcgotbm9uY2FjaGVfY3IgbmNhY2hlX25vX21vdmVyYWlzZSBub25jYWNoZV9ub19tb3ZlcmFpc2UKLW5jYWNoZV9ub19kdGNoYW5nZSBub25jYWNoZV9ub19kdGNoYW5nZQotbmNhY2hlX25vX3Jvb3RwaXhtYXAgbm9uY2FjaGVfbm9fcm9vdHBpeG1hcAotbmNhY2hlX3Jlc2V0X3Jvb3RwaXhtYXAgbmNycCBuY2FjaGVfa2VlcF9hbmltcwotbm9uY2FjaGVfa2VlcF9hbmltcyBuY2FjaGVfb2xkX3dtIG5vbmNhY2hlX29sZF93bQotbmNhY2hlX3BhZCBuY2FjaGUgbm9uY2FjaGUgbmNhY2hlX3NpemUgZGVidWdfbmNhY2hlCi1ub2RlYnVnX25jYWNoZSB3aXJlZnJhbWVfbW9kZSB3aXJlZnJhbWUgd2Ygbm93aXJlZnJhbWUKLW5vd2Ygd2lyZWZyYW1lbG9jYWwgd2ZsIG5vd2lyZWZyYW1lbG9jYWwgbm93ZmwKLXdpcmVjb3B5cmVjdCB3Y3Igbm93aXJlY29weXJlY3Qgbm93Y3Igc2NyX2FyZWEKLXNjcl9za2lwIHNjcl9pbmMgc2NyX2tleXMgc2NyX3Rlcm0gc2NyX2tleXJlcGVhdAotc2NyX3Bhcm1zIHNjcm9sbGNvcHlyZWN0IHNjciBub3Njcm9sbGNvcHlyZWN0Ci1ub3NjciBmaXhzY3JlZW4gbm94cmVjb3JkIHhyZWNvcmQgcmVzZXRfcmVjb3JkCi1wb2ludGVyX21vZGUgcG0gaW5wdXRfc2tpcCBhbGxpbnB1dCBub2FsbGlucHV0Ci1pbnB1dF9lYWdlcmx5IG5vaW5wdXRfZWFnZXJseSBpbnB1dCBncmFia2JkIG5vZ3JhYmtiZAotZ3JhYnB0ciBub2dyYWJwdHIgZ3JhYmFsd2F5cyBub2dyYWJhbHdheXMgZ3JhYmxvY2FsCi1jbGllbnRfaW5wdXQgc3NsdGltZW91dCBzcGVlZHMgd21kdCBkZWJ1Z19wb2ludGVyIGRwCi1ub2RlYnVnX3BvaW50ZXIgbm9kcCBkZWJ1Z19rZXlib2FyZCBkayBub2RlYnVnX2tleWJvYXJkCi1ub2RrIGtleWNvZGUga2V5c3ltIHB0ciBmYWtlYnV0dG9uZXZlbnQgc2xlZXAgZ2V0X3hwcm9wCi1zZXRfeHByb3Agd2luaW5mbyBiY3hfeGF0dGFjaCBkZWZlcnVwZGF0ZSBkZWZlcgotc2V0ZGVmZXIgZXh0cmFfZmJ1ciB3YWl0X3VpIHdhaXRfYm9nIG5vd2FpdF9ib2cKLXNsb3dfZmIgeHJlZnJlc2ggd2FpdCByZWFkdGltZW91dCBuYXAgbm9uYXAgc2IKLXNjcmVlbl9ibGFuayBmYnBtIG5vZmJwbSBkcG1zIG5vZHBtcyBjbGllbnRkcG1zCi1ub2NsaWVudGRwbXMgZm9yY2VkcG1zIG5vZm9yY2VkcG1zIG5vc2VydmVyZHBtcwotc2VydmVyZHBtcyBub3VsdHJhZXh0IHVsdHJhZXh0IGNoYXR3aW5kb3cgbm9jaGF0d2luZG93Ci1jaGF0b24gY2hhdG9mZiBmcyBnYXBzIGdyb3cgZnV6eiBzbmFwZmIgbm9zbmFwZmIKLXJhd2ZiIHVpbnB1dF9hY2NlbCB1aW5wdXRfdGhyZXNoIHVpbnB1dF9yZXNldAotdWlucHV0X2Fsd2F5cyBwcm9ncmVzc2l2ZSByZmJwb3J0IGh0dHAgbm9odHRwIGh0dHBwb3J0Ci1odHRwZGlyIGVuYWJsZWh0dHBwcm94eSBub2VuYWJsZWh0dHBwcm94eSBhbHdheXNzaGFyZWQKLW5vYWx3YXlzc2hhcmVkIG5ldmVyc2hhcmVkIG5vYWx3YXlzc2hhcmVkIGRvbnRkaXNjb25uZWN0Ci1ub2RvbnRkaXNjb25uZWN0IGRlc2t0b3AgZGVidWdfeGV2ZW50cyBub2RlYnVnX3hldmVudHMKLWRlYnVnX3hldmVudHMgZGVidWdfeGRhbWFnZSBub2RlYnVnX3hkYW1hZ2UKLWRlYnVnX3hkYW1hZ2UgZGVidWdfd2lyZWZyYW1lIG5vZGVidWdfd2lyZWZyYW1lCi1kZWJ1Z193aXJlZnJhbWUgZGVidWdfc2Nyb2xsIG5vZGVidWdfc2Nyb2xsIGRlYnVnX3Njcm9sbAotZGVidWdfdGlsZXMgZGJ0IG5vZGVidWdfdGlsZXMgbm9kYnQgZGVidWdfdGlsZXMKLWRlYnVnX2dyYWJzIG5vZGVidWdfZ3JhYnMgZGVidWdfc2VsIG5vZGVidWdfc2VsIGRiZwotbm9kYmcgbWFjbm9zYXZlciBtYWNzYXZlciBub21hY25vc2F2ZXIgbWFjbm93YWl0IG1hY3dhaXQKLW5vbWFjbm93YWl0IG1hY3doZWVsIG1hY25vc3dhcCBtYWNzd2FwIG5vbWFjbm9zd2FwCi1tYWNub3Jlc2l6ZSBtYWNyZXNpemUgbm9tYWNub3Jlc2l6ZSBtYWNpY29uYW5pbSBtYWNtZW51Ci1tYWNub21lbnUgbm9tYWNtZW51IG1hY3Vza2JkIG5vbWFjdXNrYmQgbm9yZW1vdGUKLS5JUAotYXJvPSAgbm9vcCBkaXNwbGF5IHZuY2Rpc3BsYXkgaWNvbl9tb2RlIGF1dG9wb3J0Ci1sb29wIGxvb3BiZyBkZXNrdG9wbmFtZSBndWVzc19kZXNrdG9wIGd1ZXNzX2RidXMKLWh0dHBfdXJsIGF1dGggeGF1dGggdXNlcnMgcm9vdHNoaWZ0IGNsaXBzaGlmdCBzY2FsZV9zdHIKLXNjYWxlZF94IHNjYWxlZF95IHNjYWxlX251bWVyIHNjYWxlX2Rlbm9tIHNjYWxlX2ZhY194Ci1zY2FsZV9mYWNfeSBzY2FsaW5nX2JsZW5kIHNjYWxpbmdfbm9tdWx0NCBzY2FsaW5nX3BhZAotc2NhbGluZ19pbnRlcnBvbGF0ZSBpbmV0ZCBwcml2cmVtb3RlIHVuc2FmZSBzYWZlciBub2NtZHMKLXBhc3N3ZGZpbGUgdW5peHB3IHVuaXhwd19uaXMgdW5peHB3X2xpc3Qgc3NsIHNzbF9wZW0KLXNzbHZlcmlmeSBzdHVubmVsIHN0dW5uZWxfcGVtIGh0dHBzIGh0dHBzcmVkaXIgdXNlcHcKLXVzaW5nX3NobSBsb2dmaWxlIG8gZmxhZyBybWZsYWcgcmMgbm9yYyBoIGhlbHAgViB2ZXJzaW9uCi1sYXN0bW9kIGJnIHNpZ3BpcGUgdGhyZWFkcyByZWFkcmF0ZSBuZXRyYXRlIG5ldGxhdGVuY3kKLXBpcGVpbnB1dCBjbGllbnRzIGNsaWVudF9jb3VudCBwaWQgZXh0X3h0ZXN0IGV4dF94dHJhcAotZXh0X3hyZWNvcmQgZXh0X3hrYiBleHRfeHNobSBleHRfeGluZXJhbWEgZXh0X292ZXJsYXkKLWV4dF94Zml4ZXMgZXh0X3hkYW1hZ2UgZXh0X3hyYW5kciByb290d2luIG51bV9idXR0b25zCi1idXR0b25fbWFzayBtb3VzZV94IG1vdXNlX3kgZ3JhYl9zdGF0ZSBwb2ludGVyX3BvcwotcG9pbnRlcl94IHBvaW50ZXJfeSBwb2ludGVyX3NhbWUgcG9pbnRlcl9yb290Ci1wb2ludGVyX21hc2sgYnBwIGRlcHRoIGluZGV4ZWRfY29sb3IgZHB5X3ggZHB5X3kgd2RweV94Ci13ZHB5X3kgb2ZmX3ggb2ZmX3kgY2RweV94IGNkcHlfeSBjb2ZmX3ggY29mZl95IHJmYmF1dGgKLXBhc3N3ZCB2aWV3cGFzc3dkCi0uUFAKLVxmQi1RRFxmUiBcZkl2YXJpYWJsZVxmUgotLklQCi1KdXN0IGxpa2UgXGZCLXF1ZXJ5XGZSIHZhcmlhYmxlLCBidXQgcmV0dXJucyB0aGUgZGVmYXVsdAotdmFsdWUgZm9yIHRoYXQgcGFyYW1ldGVyIChubyBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIKLWlzIGNvbnN1bHRlZCkKLS5QUAotXGZCLXN5bmNcZlIKLS5JUAotQnkgZGVmYXVsdCBcZkItcmVtb3RlXGZSIGNvbW1hbmRzIGFyZSBydW4gYXN5bmNocm9ub3VzbHksIHRoYXQKLWlzLCB0aGUgcmVxdWVzdCBpcyBwb3N0ZWQgYW5kIHRoZSBwcm9ncmFtIGltbWVkaWF0ZWx5Ci1leGl0cy4gIFVzZSBcZkItc3luY1xmUiB0byBoYXZlIHRoZSBwcm9ncmFtIHdhaXQgZm9yIGFuCi1hY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgeDExdm5jIHNlcnZlciB0aGF0IGNvbW1hbmQgd2FzCi1wcm9jZXNzZWQgKHNvbWVob3cpLiAgT24gdGhlIG90aGVyIGhhbmQgXGZCLXF1ZXJ5XGZSIHJlcXVlc3RzCi1hcmUgYWx3YXlzIHByb2Nlc3NlZCBzeW5jaHJvbm91c2x5IGJlY2F1c2UgdGhleSBoYXZlCi10byB3YWl0IGZvciB0aGUgYW5zd2VyLgotLklQCi1BbHNvIG5vdGUgdGhhdCBpZiBib3RoIFxmQi1yZW1vdGVcZlIgYW5kIFxmQi1xdWVyeVxmUiByZXF1ZXN0cyBhcmUKLXN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBcZkItcmVtb3RlXGZSIGlzIHByb2Nlc3NlZAotZmlyc3QgKHN5bmNocm9ub3VzbHk6IG5vIG5lZWQgZm9yIFxmQi1zeW5jKSxcZlIgYW5kIHRoZW4KLXRoZSBcZkItcXVlcnlcZlIgcmVxdWVzdCBpcyBwcm9jZXNzZWQgaW4gdGhlIG5vcm1hbCB3YXkuCi1UaGlzIGFsbG93cyBmb3IgYSByZWxpYWJsZSB3YXkgdG8gc2VlIGlmIHRoZSBcZkItcmVtb3RlXGZSCi1jb21tYW5kIHdhcyBwcm9jZXNzZWQgYnkgcXVlcnlpbmcgZm9yIGFueSBuZXcgc2V0dGluZ3MuCi1Ob3RlIGhvd2V2ZXIgdGhhdCB0aGVyZSBpcyB0aW1lb3V0IG9mIGEgZmV3IHNlY29uZHMKLShzZWUgdGhlIG5leHQgcGFyYWdyYXBoKSBzbyBpZiB0aGUgeDExdm5jIHRha2VzIGxvbmdlcgotdGhhbiB0aGF0IHRvIHByb2Nlc3MgdGhlIHJlcXVlc3RzIHRoZSByZXF1ZXN0ZXIgd2lsbAotdGhpbmsgdGhhdCBhIGZhaWx1cmUgaGFzIHRha2VuIHBsYWNlLgotLklQCi1UaGUgZGVmYXVsdCBpcyB0byB3YWl0IDMuNSBzZWNvbmRzLiAgT3IgaWYgY21kPXN0b3AKLW9ubHkgMS4wIHNlY29uZHMuICBJZiBjbWQgbWF0Y2hlcyAnc2NyaXB0OicgdGhlbiBpdAotd2lsbCB3YWl0IHVwIHRvIDEwLjAgc2Vjb25kcy4gIFNldCBYMTFWTkNfU1lOQ19USU1FT1VUCi10byB0aGUgbnVtYmVyIG9mIHNlY29uZHMgeW91IHdhbnQgaXQgdG8gd2FpdC4KLS5QUAotXGZCLXF1ZXJ5X3JldHJpZXNcZlIgXGZJc3RyXGZSCi0uSVAKLUlmIGEgcXVlcnkgZmFpbHMgdG8gZ2V0IGEgcmVzcG9uc2UgZnJvbSBhbiB4MTF2bmMKLXNlcnZlciwgcmV0cnkgdXAgdG8gbiB0aW1lcy4gIFxmSXN0clxmUiBpcyBzcGVjaWZpZWQgYXMKLW5bOnRdWy9tYXRjaF0gIE9wdGlvbmFsbHkgdGhlIGRlbGF5IGJldHdlZW4gdHJpZXMgbWF5Ci1iZSBzcGVjaWZpZWQgYnkgInQiIGEgZmxvYXRpbmcgcG9pbnQgdGltZSAoZGVmYXVsdAotMC41IHNlY29uZHMuKSAgTm90ZTogdGhlIHJlc3BvbnNlIGlzIG5vdCBjaGVja2VkIGZvcgotdmFsaWRpdHkgb3Igd2hldGhlciBpdCBjb3JyZXNwb25kcyB0byB0aGUgcXVlcnkgc2VudC4KLVRoZSBxdWVyeSAicGluZzpteXN0cmluZyIgbWF5IGJlIHVzZWQgdG8gaGVscCB1bmlxdWVseQotaWRlbnRpZnkgdGhlIHF1ZXJ5LiAgT3B0aW9uYWxseSwgYSBtYXRjaGluZyBzdHJpbmcgYWZ0ZXIKLWEgIi8iIHdpbGwgYmUgdXNlZCB0byBjaGVjayB0aGUgcmVzdWx0IHRleHQuICBVcCB0bwotbiByZXRyaWVzIHdpbGwgdGFrZSBwbGFjZSB1bnRpbCB0aGUgbWF0Y2hpbmcgc3RyaW5nIGlzCi1mb3VuZCBpbiB0aGUgb3V0cHV0IHRleHQuICBJZiB0aGUgbWF0Y2ggc3RyaW5nIGlzIG5ldmVyCi1mb3VuZCB0aGUgcHJvZ3JhbSdzIGV4aXQgY29kZSBpcyAxOyBpZiB0aGUgbWF0Y2ggaXMKLWZvdW5kIGl0IGV4aXRzIHdpdGggMC4gIE5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgc3Rkb3V0Ci1wcmludGVkIGZvciBlYWNoIHJldHJ5IChpLmUuIG11bHRpcGxlIGxpbmVzIHByaW50ZWQKLW91dCB0byBzdGRvdXQuKQotRXhhbXBsZTogXGZCLXF1ZXJ5X3JldHJpZXNcZlIgNDoxLjUvZ3JhYl9zdGF0ZQotLlBQCi1cZkItcmVtb3RlX3ByZWZpeFxmUiBcZklzdHJcZlIKLS5JUAotRW5hYmxlIGEgcmVtb3RlLWNvbnRyb2wgY29tbXVuaWNhdGlvbiBjaGFubmVsIGZvcgotY29ubmVjdGVkIFZOQyBjbGllbnRzLiAgc3RyIGlzIGEgbm9uLWVtcHR5IHN0cmluZy4gSWYgYQotVk5DIGNsaWVudCBzZW5kcyByZmJDdXRUZXh0IGhhdmluZyB0aGUgcHJlZml4IFxmSXN0clxmUgotdGhlbiB0aGUgcGFydCBhZnRlciBpdCBpcyBwcm9jZXNzZWQgYXMgdGhvdWdoIGl0IHdlcmUKLXNlbnQgdmlhICd4MTF2bmMgXGZCLXJlbW90ZVxmUiAuLi4nLiAgSWYgaXQgYmVnaW5zIHdpdGgKLW5laXRoZXIgJ2NtZD0nIG5vciAncXJ5PScgdGhlbiAncXJ5PScgaXMgYXNzdW1lZC4KLUFueSBjb3JyZXNwb25kaW5nIG91dHB1dCB0ZXh0IGZvciB0aGF0IHJlbW90ZSBjb250cm9sCi1jb21tYW5kIGlzIHNlbnQgYmFjayB0byBhbGwgY2xpZW50IGFzIHJmYkN1dFRleHQuCi1UaGUgcmV0dXJuZWQgb3V0cHV0IGlzIGFsc28gcHJlZml4ZWQgd2l0aCBcZklzdHJcZlIuCi1FeGFtcGxlOiBcZkItcmVtb3RlX3ByZWZpeFxmUiBET19USElTOgotLklQCi1Ob3RlIHRoYXQgZW5hYmxpbmcgXGZCLXJlbW90ZV9wcmVmaXhcZlIgYWxsb3dzIHRoZSByZW1vdGUKLVZOQyB2aWV3ZXJzIHRvIHJ1biB4MTF2bmMgXGZCLXJlbW90ZVxmUiBjb21tYW5kcy4gIERvIG5vdAotdXNlIHRoaXMgb3B0aW9uIGlmIHRoZXkgYXJlIG5vdCB0byBiZSB0cnVzdGVkLgotLlBQCi1cZkItbm9yZW1vdGUsXGZSIFxmQi15ZXNyZW1vdGVcZlIKLS5JUAotRG8gbm90IHByb2Nlc3MgYW55IHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIG9yIHF1ZXJpZXMuCi1EbyBwcm9jZXNzIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIG9yIHF1ZXJpZXMuCi1EZWZhdWx0OiBcZkIteWVzcmVtb3RlXGZSCi0uSVAKLUEgbm90ZSBhYm91dCBzZWN1cml0eSB3cnQgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMuCi1JZiBzb21lb25lIGNhbiBjb25uZWN0IHRvIHRoZSBYIGRpc3BsYXkgYW5kIGNoYW5nZQotdGhlIHByb3BlcnR5IFgxMVZOQ19SRU1PVEUsIHRoZW4gdGhleSBjYW4gcmVtb3RlbHkKLWNvbnRyb2wgeDExdm5jLiAgTm9ybWFsbHkgYWNjZXNzIHRvIHRoZSBYIGRpc3BsYXkgaXMKLXByb3RlY3RlZC4gIE5vdGUgdGhhdCBpZiB0aGV5IGNhbiBtb2RpZnkgWDExVk5DX1JFTU9URQotb24gdGhlIFggc2VydmVyLCB0aGV5IGhhdmUgZW5vdWdoIHBlcm1pc3Npb25zIHRvIGFsc28KLXJ1biB0aGVpciBvd24geDExdm5jIGFuZCB0aHVzIGhhdmUgY29tcGxldGUgY29udHJvbAotb2YgdGhlIGRlc2t0b3AuICBJZiB0aGUgICJcZkItY29ubmVjdFxmUiBcZkkvcGF0aC90by9maWxlXGZSIgotY2hhbm5lbCBpcyBiZWluZyB1c2VkLCBvYnZpb3VzbHkgYW55b25lIHdobyBjYW4gd3JpdGUKLXRvIC9wYXRoL3RvL2ZpbGUgY2FuIHJlbW90ZWx5IGNvbnRyb2wgeDExdm5jLiAgU28gYmUKLXN1cmUgdG8gcHJvdGVjdCB0aGUgWCBkaXNwbGF5IGFuZCB0aGF0IGZpbGUncyB3cml0ZQotcGVybWlzc2lvbnMuICBTZWUgXGZCLXByaXZyZW1vdGVcZlIgYmVsb3cuCi0uSVAKLUlmIHlvdSBhcmUgcGFyYW5vaWQgYW5kIGRvIG5vdCB0aGluayBcZkItbm9yZW1vdGVcZlIgaXMKLWVub3VnaCwgdG8gZGlzYWJsZSB0aGUgWDExVk5DX1JFTU9URSBwcm9wZXJ0eSBjaGFubmVsCi1jb21wbGV0ZWx5IHVzZSBcZkItbm92bmNjb25uZWN0LFxmUiBvciB1c2UgdGhlIFxmQi1zYWZlclxmUiBvcHRpb24KLXRoYXQgc2h1dHMgbWFueSB0aGluZ3Mgb2ZmLgotLlBQCi1cZkItdW5zYWZlXGZSCi0uSVAKLUEgZmV3IHJlbW90ZSBjb21tYW5kcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdAotKGN1cnJlbnRseTogaWQ6cGljaywgYWNjZXB0OjxjbWQ+LCBnb25lOjxjbWQ+LCBhbmQKLXJhd2ZiOnNldHVwOjxjbWQ+KSBiZWNhdXNlIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aAotcnVubmluZyBleHRlcm5hbCBwcm9ncmFtcy4gIElmIHlvdSBzcGVjaWZ5IFxmQi11bnNhZmUsXGZSIHRoZW4KLXRoZXNlIHJlbW90ZS1jb250cm9sIGNvbW1hbmRzIGFyZSBhbGxvd2VkLiAgTm90ZSB0aGF0Ci15b3UgY2FuIHN0aWxsIHNwZWNpZnkgdGhlc2UgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZAotbGluZSwgdGhleSBqdXN0IGNhbm5vdCBiZSBpbnZva2VkIHZpYSByZW1vdGUtY29udHJvbC4KLS5QUAotXGZCLXNhZmVyXGZSCi0uSVAKLUVxdWl2YWxlbnQgdG86IFxmQi1ub3ZuY2Nvbm5lY3RcZlIgXGZCLW5vcmVtb3RlXGZSIGFuZCBwcm9oaWJpdGluZwotXGZCLWd1aVxmUiBhbmQgdGhlIFxmQi1jb25uZWN0XGZSIGZpbGUuIFNodXRzIG9mZiBjb21tdW5jYXRpb24KLWNoYW5uZWxzLgotLlBQCi1cZkItcHJpdnJlbW90ZVxmUgotLklQCi1QZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyBhbmQgZGlzYWJsZSByZW1vdGUtY29udHJvbAotY29tbWFuZHMgaWYgaXQgYXBwZWFycyB0aGF0IHRoZSBYIERJU1BMQVkgYW5kL29yCi1jb25uZWN0ZmlsZSBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIgdXNlcnMuICBPbmNlCi1yZW1vdGUtY29udHJvbCBpcyBkaXNhYmxlZCBpdCBjYW5ub3QgYmUgdHVybmVkIGJhY2sgb24uCi0uUFAKLVxmQi1ub2NtZHNcZlIKLS5JUAotTm8gZXh0ZXJuYWwgY29tbWFuZHMgKGUuZy4gCi0uSVIgc3lzdGVtICgzKQotLCAKLS5JUiBwb3BlbiAoMykKLSwgCi0uSVIgZXhlYyAoMykKLSkKLXdpbGwgYmUgcnVuIGF0IGFsbC4KLS5QUAotXGZCLWFsbG93ZWRjbWRzXGZSIFxmSWxpc3RcZlIKLS5JUAotXGZJbGlzdFxmUiBjb250YWlucyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBvbmx5Ci1leHRlcm5hbCBjb21tYW5kcyB0aGF0IGNhbiBiZSBydW4uICBUaGUgZnVsbCBsaXN0IG9mCi1hc3NvY2lhdGVkIG9wdGlvbnMgaXM6Ci0uSVAKLXN0dW5uZWwsIHNzbCwgdW5peHB3LCBXQUlULCB6ZXJvY29uZiwgaWQsIGFjY2VwdCwKLWFmdGVyYWNjZXB0LCBnb25lLCBwaXBlaW5wdXQsIHY0bC1pbmZvLCByYXdmYi1zZXR1cCwKLWR0LCBndWksIHNzaCwgc3RvcmVwYXNzd2QsIHBhc3N3ZGZpbGUsIGN1c3RvbV9wYXNzd2QsCi1maW5kYXV0aCwgY3Jhc2guCi0uSVAKLVNlZSBlYWNoIG9wdGlvbidzIGhlbHAgdG8gbGVhcm4gdGhlIGFzc29jaWF0ZWQgZXh0ZXJuYWwKLWNvbW1hbmQuICBOb3RlIHRoYXQgdGhlIFxmQi1ub2NtZHNcZlIgb3B0aW9uIHRha2VzIHByZWNlZGVuY2UKLWFuZCBkaXNhYmxlcyBhbGwgZXh0ZXJuYWwgY29tbWFuZHMuCi0uUFAKLVxmQi1kZW55X2FsbFxmUgotLklQCi1Gb3IgdXNlIHdpdGggXGZCLXJlbW90ZVxmUiBub2Rlbnk6IHN0YXJ0IG91dCBkZW55aW5nIGFsbAotaW5jb21pbmcgY2xpZW50cyB1bnRpbCAiXGZCLXJlbW90ZVxmUiBcZklub2RlbnlcZlIiIGlzIHVzZWQgdG8KLWxldCB0aGVtIGluLgotLlBQCi1UaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gTGliVk5DU2VydmVyOgotLlBQCi1cZkItcmZicG9ydFxmUiBcZklwb3J0XGZSCi0uSVAKLVRDUCBwb3J0IGZvciBSRkIgcHJvdG9jb2wKLS5QUAotXGZCLXJmYndhaXRcZlIgXGZJdGltZVxmUgotLklQCi1tYXggdGltZSBpbiBtcyB0byB3YWl0IGZvciBSRkIgY2xpZW50Ci0uUFAKLVxmQi1yZmJhdXRoXGZSIFxmSXBhc3N3ZC1maWxlXGZSCi0uSVAKLXVzZSBhdXRoZW50aWNhdGlvbiBvbiBSRkIgcHJvdG9jb2wKLSh1c2UgJ3gxMXZuYyBcZkItc3RvcmVwYXNzd2RcZlIgcGFzcyBmaWxlJyB0byBjcmVhdGUgYSBwYXNzd29yZCBmaWxlKQotLlBQCi1cZkItcmZidmVyc2lvblxmUiBcZkkzLnhcZlIKLS5JUAotU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBSRkIgd2UgY2hvb3NlIHRvIGFkdmVydGlzZQotLlBQCi1cZkItcGVybWl0ZmlsZXRyYW5zZmVyXGZSCi0uSVAKLXBlcm1pdCBmaWxlIHRyYW5zZmVyIHN1cHBvcnQKLS5QUAotXGZCLXBhc3N3ZFxmUiBcZklwbGFpbi1wYXNzd29yZFxmUgotLklQCi11c2UgYXV0aGVudGljYXRpb24KLSh1c2UgcGxhaW4tcGFzc3dvcmQgYXMgcGFzc3dvcmQsIFVTRSBBVCBZT1VSIFJJU0spCi0uUFAKLVxmQi1kZWZlcnVwZGF0ZVxmUiBcZkl0aW1lXGZSCi0uSVAKLXRpbWUgaW4gbXMgdG8gZGVmZXIgdXBkYXRlcyAoZGVmYXVsdCA0MCkKLS5QUAotXGZCLWRlZmVycHRydXBkYXRlXGZSIFxmSXRpbWVcZlIKLS5JUAotdGltZSBpbiBtcyB0byBkZWZlciBwb2ludGVyIHVwZGF0ZXMgKGRlZmF1bHQgbm9uZSkKLS5QUAotXGZCLWRlc2t0b3BcZlIgXGZJbmFtZVxmUgotLklQCi1WTkMgZGVza3RvcCBuYW1lIChkZWZhdWx0ICJMaWJWTkNTZXJ2ZXIiKQotLlBQCi1cZkItYWx3YXlzc2hhcmVkXGZSCi0uSVAKLWFsd2F5cyB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLS5QUAotXGZCLW5ldmVyc2hhcmVkXGZSCi0uSVAKLW5ldmVyIHRyZWF0IG5ldyBjbGllbnRzIGFzIHNoYXJlZAotLlBQCi1cZkItZG9udGRpc2Nvbm5lY3RcZlIKLS5JUAotZG9uJ3QgZGlzY29ubmVjdCBleGlzdGluZyBjbGllbnRzIHdoZW4gYSBuZXcgbm9uLXNoYXJlZAotY29ubmVjdGlvbiBjb21lcyBpbiAocmVmdXNlIG5ldyBjb25uZWN0aW9uIGluc3RlYWQpCi0uUFAKLVxmQi1odHRwZGlyXGZSIFxmSWRpci1wYXRoXGZSCi0uSVAKLWVuYWJsZSBodHRwIHNlcnZlciB1c2luZyBkaXItcGF0aCBob21lCi0uUFAKLVxmQi1odHRwcG9ydFxmUiBcZklwb3J0bnVtXGZSCi0uSVAKLXVzZSBwb3J0bnVtIGZvciBodHRwIGNvbm5lY3Rpb24KLS5QUAotXGZCLWVuYWJsZWh0dHBwcm94eVxmUgotLklQCi1lbmFibGUgaHR0cCBwcm94eSBzdXBwb3J0Ci0uUFAKLVxmQi1wcm9ncmVzc2l2ZVxmUiBcZkloZWlnaHRcZlIKLS5JUAotZW5hYmxlIHByb2dyZXNzaXZlIHVwZGF0aW5nIGZvciBzbG93IGxpbmtzCi0uUFAKLVxmQi1saXN0ZW5cZlIgXGZJaXBhZGRyXGZSCi0uSVAKLWxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb25seSBvbiBuZXR3b3JrIGludGVyZmFjZSB3aXRoCi1hZGRyIGlwYWRkci4gJy1saXN0ZW4gbG9jYWxob3N0JyBhbmQgaG9zdG5hbWUgd29yayB0b28uCi0uUFAKLWxpYnZuY3NlcnZlci10aWdodC1leHRlbnNpb24gb3B0aW9uczoKLS5QUAotXGZCLWRpc2FibGVmaWxldHJhbnNmZXJcZlIKLS5JUAotZGlzYWJsZSBmaWxlIHRyYW5zZmVyCi0uUFAKLVxmQi1mdHByb290XGZSIFxmSXN0cmluZ1xmUgotLklQCi1zZXQgZnRwIHJvb3QKLS5TSCAiRklMRVMiCi0uSVIgJEhPTUUvLngxMXZuY3JjICwKLS5JUiAkSE9NRS8uWGF1dGhvcml0eQotLlNIICJFTlZJUk9OTUVOVCIKLS5JUiBESVNQTEFZICwKLS5JUiBYQVVUSE9SSVRZICwKLS5JUiBIT01FCi0uUFAKLVRoZSBmb2xsb3dpbmcgYXJlIHNldCBmb3IgdGhlIGF1eGlsaWFyeSBjb21tYW5kcwotcnVuIGJ5IFxmQi1hY2NlcHRcZlIsIFxmQi1nb25lXGZSIGFuZCBvdGhlciBjYXNlczoKLS5QUAotLklSIFJGQl9DTElFTlRfSVAgLAotLklSIFJGQl9DTElFTlRfUE9SVCAsCi0uSVIgUkZCX1NFUlZFUl9JUCAsCi0uSVIgUkZCX1NFUlZFUl9QT1JUICwKLS5JUiBSRkJfWDExVk5DX1BJRCAsCi0uSVIgUkZCX0NMSUVOVF9JRCAsCi0uSVIgUkZCX0NMSUVOVF9DT1VOVCAsCi0uSVIgUkZCX01PREUKLS5JUiBSRkJfU1RBVEUKLS5JUiBSRkJfTE9HSU5fVklFV09OTFkKLS5JUiBSRkJfTE9HSU5fVElNRQotLklSIFJGQl9DVVJSRU5UX1RJTUUKLS5JUiBSRkJfVVNFUk5BTUUKLS5JUiBSRkJfU1NMX0NMSUVOVF9DRVJUCi0uU0ggIlNFRSBBTFNPIgotLklSIHZuY3ZpZXdlciAoMSksCi0uSVIgdm5jcGFzc3dkICgxKSwKLS5JUiB2bmNjb25uZWN0ICgxKSwKLS5JUiB2bmNzZXJ2ZXIgKDEpLAotLklSIFh2bmMgKDEpLAotLklSIHhldiAoMSksCi0uSVIgeGRweWluZm8gKDEpLAotLklSIHh3aW5pbmZvICgxKSwKLS5JUiB4cHJvcCAoMSksCi0uSVIgeG1vZG1hcCAoMSksCi0uSVIgeHJhbmRyICgxKSwKLS5JUiBYc2VydmVyICgxKSwKLS5JUiB4YXV0aCAoMSksCi0uSVIgeGhvc3QgKDEpLAotLklSIFhzZWN1cml0eSAoNyksCi0uSVIgeG1lc3NhZ2UgKDEpLAotLklSIFhHZXRJbWFnZSAoM1gxMSksCi0uSVIgaXBjcm0gKDEpLAotLklSIGluZXRkICgxKSwKLS5JUiB4ZG0gKDEpLAotLklSIGdkbSAoMSksCi0uSVIga2RtICgxKSwKLS5JUiBzc2ggKDEpLAotLklSIHN0dW5uZWwgKDgpLAotLklSIHN1ICgxKSwKLS5JUiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbSAsCi0uSVIgaHR0cDovL3d3dy5yZWFsdm5jLmNvbSAsCi0uSVIgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8gLAotLklSIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvI2ZhcQotLlNIIEFVVEhPUlMKLXgxMXZuYyB3YXMgd3JpdHRlbiBieSBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiwKLWl0IGlzIHBhcnQgb2YgdGhlIExpYlZOQ1NlcnZlciBwcm9qZWN0IDxodHRwOi8vc2YubmV0L3Byb2plY3RzL2xpYnZuY3NlcnZlcj4uCi1UaGlzIG1hbnVhbCBwYWdlIGlzIGJhc2VkIG9uZSB0aGUgb25lIHdyaXR0ZW4gYnkgTHVkb3ZpYyBEcm9sZXoKLTxsZHJvbGV6QGRlYmlhbi5vcmc+LCBmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChib3RoIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCmRpZmYgLS1naXQgYS94MTF2bmMveDExdm5jLmMgYi94MTF2bmMveDExdm5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTczZGUuLjAwMDAwMDAKLS0tIGEveDExdm5jL3gxMXZuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTk0NSArMCwwIEBACi0vKgotICogeDExdm5jOiBhIFZOQyBzZXJ2ZXIgZm9yIFggZGlzcGxheXMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLSAqCi0gKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAotICogIFVTQSAgb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqCi0gKiAgSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLSAqICBnaXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi0gKiAgT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLSAqICB0aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi0gKiAgdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotICogIG1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLSAqICBmaWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi0gKiAgc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBzb21lIGlkZWFzIGZyb20gdGhlIGZvbGxvd2luZyBwcm9ncmFtczoKLSAqCi0gKiAgICAgICB0aGUgaW5pdGlhbCB4MTF2bmMuYyBpbiBsaWJ2bmNzZXJ2ZXIgKEpvaGFubmVzIEUuIFNjaGluZGVsaW4pCi0gKgkgeDByZmJzZXJ2ZXIsIHRoZSBvcmlnaW5hbCBuYXRpdmUgWCB2bmMgc2VydmVyIChKZW5zIFdhZ25lcikKLSAqICAgICAgIGtyZmIsIHRoZSBLREUgZGVza3RvcHNoYXJpbmcgcHJvamVjdCAoVGltIEphbnNlbikKLSAqCi0gKiBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMgZm9yIHRoZSBtb3N0IHVwLXRvLWRhdGUKLSAqIGluZm9ybWF0aW9uIGFib3V0IHgxMXZuYy4gIFNvbWUgb2YgdGhlIGZvbGxvd2luZyB0ZXh0IG1heSBiZSBvdXQKLSAqIG9mIGRhdGUuCi0gKgotICogVGhlIHByaW1hcnkgZ29hbCBvZiB0aGlzIHByb2dyYW0gaXMgdG8gY3JlYXRlIGEgcG9ydGFibGUgYW5kIHNpbXBsZQotICogY29tbWFuZC1saW5lIHNlcnZlciB1dGlsaXR5IHRoYXQgYWxsb3dzIGEgVk5DIHZpZXdlciB0byBjb25uZWN0Ci0gKiB0byBhbiBhY3R1YWwgWCBkaXNwbGF5IChhcyB0aGUgYWJvdmUgZG8pLiAgVGhlIG9ubHkgbm9uLXN0YW5kYXJkCi0gKiBkZXBlbmRlbmN5IG9mIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc3RhdGljIGxpYnJhcnkgbGlidm5jc2VydmVyLmEuCi0gKiBBbHRob3VnaCBpbiBzb21lIGVudmlyb25tZW50cyBsaWJqcGVnLnNvIG9yIGxpYnouc28gbWF5IG5vdCBiZQotICogcmVhZGlseSBhdmFpbGFibGUgYW5kIG5lZWRzIHRvIGJlIGluc3RhbGxlZCwgdGhleSBtYXkgYmUgZm91bmQKLSAqIGF0IGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy8gYW5kIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8sCi0gKiByZXNwZWN0aXZlbHkuICBUbyBpbmNyZWFzZSBwb3J0YWJpbGl0eSBpdCBpcyB3cml0dGVuIGluIHBsYWluIEMuCi0gKgotICogQW5vdGhlciBnb2FsIGlzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIGludGVyYWN0aXZlIHJlc3BvbnNlLgotICogVGhlIGFsZ29yaXRobSBvZiB4MHJmYnNlcnZlciB3YXMgdXNlZCBhcyBhIGJhc2UuICBNYW55IGFkZGl0aW9uYWwKLSAqIGhldXJpc3RpY3MgYXJlIGFsc28gYXBwbGllZC4KLSAqCi0gKiBBbm90aGVyIGdvYWwgaXMgdG8gYWRkIG1hbnkgZmVhdHVyZXMgdGhhdCBlbmFibGUgYW5kIGluY291cmFnZSBjcmVhdGl2ZQotICogdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSB0b29sLiAgQXBvbG9naWVzIGZvciB0aGUgbGFyZ2UgbnVtYmVyCi0gKiBvZiBvcHRpb25zIQotICoKLSAqIFRvIGJ1aWxkOgotICoKLSAqIE9idGFpbiB0aGUgbGlidm5jc2VydmVyIHBhY2thZ2UgKGh0dHA6Ly9saWJ2bmNzZXJ2ZXIuc291cmNlZm9yZ2UubmV0KS4KLSAqIEFzIG9mIDEyLzIwMDIgdGhpcyB2ZXJzaW9uIG9mIHgxMXZuYy5jIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGlidm5jc2VydmVyCi0gKiBDVlMgdHJlZSBhbmQgcmVsZWFzZWQgaW4gdmVyc2lvbiAwLjUuCi0gKgotICogZ2NjIHNob3VsZCBiZSB1c2VkIG9uIGFsbCBwbGF0Zm9ybXMuICBUbyBidWlsZCBhIHRocmVhZGVkIHZlcnNpb24gcHV0Ci0gKiAiLURfUkVFTlRSQU5UIC1EWDExVk5DX1RIUkVBREVEIiBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0ZMQUdTCi0gKiBvciBDUFBGTEFHUyAoZS5nLiBiZWZvcmUgcnVubmluZyB0aGUgbGlidm5jc2VydmVyIGNvbmZpZ3VyZSkuICBUaGUKLSAqIHRocmVhZGVkIG1vZGUgaXMgYSBiaXQgbW9yZSByZXNwb25zaXZlLCBidXQgY2FuIGJlIHVuc3RhYmxlIChlLmcuCi0gKiBpZiBtb3JlIHRoYW4gb25lIGNsaWVudCB0aGUgc2FtZSB0aWdodCBvciB6cmxlIGVuY29kaW5nKS4KLSAqCi0gKiBLbm93biBzaG9ydGNvbWluZ3M6Ci0gKgotICogVGhlIHNjcmVlbiB1cGRhdGVzIGFyZSBnb29kLCBidXQgb2YgY291cnNlIG5vdCBwZXJmZWN0IHNpbmNlIHRoZSBYCi0gKiBkaXNwbGF5IG11c3QgYmUgY29udGludW91c2x5IHBvbGxlZCBhbmQgcmVhZCBmb3IgY2hhbmdlcyBhbmQgdGhpcyBpcwotICogc2xvdyBmb3IgbW9zdCBoYXJkd2FyZS4gVGhpcyBjYW4gYmUgY29udHJhc3RlZCB3aXRoIHJlY2VpdmluZyBhIGNoYW5nZQotICogY2FsbGJhY2sgZnJvbSB0aGUgWCBzZXJ2ZXIsIGlmIHRoYXQgd2VyZSBnZW5lcmFsbHkgcG9zc2libGUuLi4gKFVQREFURToKLSAqIHRoaXMgaXMgaGFuZGxlZCBub3cgd2l0aCB0aGUgWCBEQU1BR0UgZXh0ZW5zaW9uLCBidXQgdW5mb3J0dW5hdGVseQotICogdGhhdCBkb2Vzbid0IHNlZW0gdG8gYWRkcmVzcyB0aGUgc2xvdyByZWFkIGZyb20gdGhlIHZpZGVvIGgvdykuICBTbywKLSAqIGUuZy4sIG9wYXF1ZSBtb3ZlcyBhbmQgc2ltaWxhciB3aW5kb3cgYWN0aXZpdHkgY2FuIGJlIHZlcnkgcGFpbmZ1bDsKLSAqIG9uZSBoYXMgdG8gbW9kaWZ5IG9uZSdzIGJlaGF2aW9yIGEgYml0LgotICoKLSAqIEdlbmVyYWwgYXVkaW8gYXQgdGhlIHJlbW90ZSBkaXNwbGF5IGlzIGxvc3QgdW5sZXNzIG9uZSBzZXBhcmF0ZWx5Ci0gKiBzZXRzIHVwIHNvbWUgYXVkaW8gc2lkZS1jaGFubmVsIHN1Y2ggYXMgZXNkLgotICoKLSAqIEl0IGRvZXMgbm90IGFwcGVhciBwb3NzaWJsZSB0byBxdWVyeSB0aGUgWCBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50Ci0gKiBjdXJzb3Igc2hhcGUuICBXZSBjYW4gdXNlIFhUZXN0IHRvIGNvbXBhcmUgY3Vyc29yIHRvIGN1cnJlbnQgd2luZG93J3MKLSAqIGN1cnNvciwgYnV0IHdlIGNhbm5vdCBleHRyYWN0IHdoYXQgdGhlIGN1cnNvciBpcy4uLiAoVVBEQVRFOiB3ZSBub3cKLSAqIHVzZSBYRklYRVMgZXh0ZW5zaW9uIGZvciB0aGlzLiAgQWxzbyBvbiBTb2xhcmlzIGFuZCBJUklYIE92ZXJsYXkKLSAqIGV4dGVuc2lvbnMgZXhpc3RzIHRoYXQgYWxsb3cgZHJhd2luZyB0aGUgbW91c2UgaW50byB0aGUgZnJhbWVidWZmZXIpCi0gKiAKLSAqIFRoZSBjdXJyZW50ICpwb3NpdGlvbiogb2YgdGhlIHJlbW90ZSBYIG1vdXNlIHBvaW50ZXIgaXMgc2hvd24gd2l0aAotICogdGhlIC1jdXJzb3Igb3B0aW9uLiAgRnVydGhlciwgaWYgLWN1cnNvciBYIGlzIHVzZWQsIGEgdHJpY2sKLSAqIGlzIGRvbmUgdG8gYXQgbGVhc3Qgc2hvdyB0aGUgcm9vdCB3aW5kb3cgY3Vyc29yIHZzIG5vbi1yb290IGN1cnNvci4KLSAqIChwZXJoYXBzIHNvbWUgaGV1cmlzdGljIGNhbiBiZSBkb25lIHRvIGZ1cnRoZXIgZGlzdGluZ3Vpc2ggY2FzZXMuLi4sCi0gKiBjdXJyZW50bHkgIi1jdXJzb3Igc29tZSIgaXMgYSBmaXJzdCBoYWNrIGF0IHRoaXMpCi0gKgotICogVW5kZXIgWEZJWEVTIG1vZGUgZm9yIHNob3dpbmcgdGhlIGN1cnNvciBzaGFwZSwgdGhlIGN1cnNvciBtYXkgYmUKLSAqIHBvb3JseSBhcHByb3hpbWF0ZWQgaWYgaXQgaGFzIHRyYW5zcGFyZW5jeSAoYWxwaGEgY2hhbm5lbCkuCi0gKgotICogV2luZG93cyB1c2luZyB2aXN1YWxzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgWCB2aXN1YWwgbWF5IGhhdmUKLSAqIHRoZWlyIGNvbG9ycyBtZXNzZWQgdXAuICBXaGVuIHVzaW5nIDhicHAgaW5kZXhlZCBjb2xvciwgdGhlIGNvbG9ybWFwCi0gKiBpcyBhdHRlbXB0ZWQgdG8gYmUgZm9sbG93ZWQsIGJ1dCBtYXkgYmVjb21lIG91dCBvZiBkYXRlLiAgVXNlIHRoZQotICogLWZsYXNoY21hcCBvcHRpb24gdG8gaGF2ZSBjb2xvcm1hcCBmbGFzaGluZyBhcyB0aGUgcG9pbnRlciBtb3ZlcwotICogd2luZG93cyB3aXRoIHByaXZhdGUgY29sb3JtYXBzIChzbG93KS4gIERpc3BsYXlzIHdpdGggbWl4ZWQgZGVwdGggOCBhbmQKLSAqIDI0IHZpc3VhbHMgd2lsbCBpbmNvcnJlY3RseSBkaXNwbGF5IHdpbmRvd3MgdXNpbmcgdGhlIG5vbi1kZWZhdWx0IG9uZS4KLSAqIE9uIFN1biBhbmQgU2dpIGhhcmR3YXJlIHdlIGNhbiB0byB3b3JrIGFyb3VuZCB0aGlzIHdpdGggLW92ZXJsYXkuCi0gKgotICogRmVhdHVyZSAtaWQgPHdpbmRvd2lkPiBjYW4gYmUgcGlja3k6IGl0IGNhbiBjcmFzaCBmb3IgdGhpbmdzIGxpa2UKLSAqIHRoZSB3aW5kb3cgbm90IHN1ZmZpY2llbnRseSBtYXBwZWQgaW50byBzZXJ2ZXIgbWVtb3J5LCBldGMgKFVQREFURToKLSAqIHdlIG5vdyB1c2UgdGhlIC14cmFuZHIgbWVjaGFuaXNtcyB0byB0cmFwIGVycm9ycyBtb3JlIHJvYnVzdGx5IGZvcgotICogdGhpcyBtb2RlKS4gIFNhdmVVbmRlcnMgbWVudXMsIHBvcHVwcywgZXRjIHdpbGwgbm90IGJlIHNlZW4uCi0gKgotICogVW5kZXIgc29tZSBzaXR1YXRpb25zIHRoZSBrZXlzeW0gdW5tYXBwaW5nIGlzIG5vdCBjb3JyZWN0LCBlc3BlY2lhbGx5Ci0gKiBpZiB0aGUgdHdvIGtleWJvYXJkcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudCBsYW5ndWFnZXMuICBUaGUgLW1vZHR3ZWFrCi0gKiBvcHRpb24gaXMgdGhlIGRlZmF1bHQgYW5kIGNvcnJlY3RzIG1vc3QgcHJvYmxlbXMuIE9uZSBjYW4gdXNlIHRoZQotICogLXhrYiBvcHRpb24gdG8gdHJ5IHRvIHVzZSB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiB0byBjbGVhciB1cCBhbnkKLSAqIHJlbWFpbmluZyBwcm9ibGVtcy4KLSAqCi0gKiBPY2Nhc2lvbmFsbHksIGEgZmV3IHRpbGUgdXBkYXRlcyBjYW4gYmUgbWlzc2VkIGxlYXZpbmcgYSBwYXRjaCBvZgotICogY29sb3IgdGhhdCBuZWVkcyB0byBiZSByZWZyZXNoZWQuICBUaGlzIG1heSBvbmx5IGJlIHdoZW4gdGhyZWFkZWQsCi0gKiB3aGljaCBpcyBubyBsb25nZXIgdGhlIGRlZmF1bHQuCi0gKgotICogVGhlcmUgc2VlbXMgdG8gYmUgYSBzZXJpb3VzIGJ1ZyB3aXRoIHNpbXVsdGFuZW91cyBjbGllbnRzIHdoZW4KLSAqIHRocmVhZGVkLCBjdXJyZW50bHkgdGhlIG9ubHkgd29ya2Fyb3VuZCBpbiB0aGlzIGNhc2UgaXMgLW5vdGhyZWFkcwotICogKHdoaWNoIGlzIG5vdyB0aGUgZGVmYXVsdCkuCi0gKi8KLQotCi0vKiAtLSB4MTF2bmMuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAieGRhbWFnZS5oIgotI2luY2x1ZGUgInhyZWNvcmQuaCIKLSNpbmNsdWRlICJ4ZXZlbnRzLmgiCi0jaW5jbHVkZSAieGluZXJhbWEuaCIKLSNpbmNsdWRlICJ4cmFuZHIuaCIKLSNpbmNsdWRlICJ4a2JfYmVsbC5oIgotI2luY2x1ZGUgIndpbl91dGlscy5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJndWkuaCIKLSNpbmNsdWRlICJoZWxwLmgiCi0jaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJrZXlib2FyZC5oIgotI2luY2x1ZGUgInBvaW50ZXIuaCIKLSNpbmNsdWRlICJjdXJzb3IuaCIKLSNpbmNsdWRlICJ1c2VyaW5wdXQuaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInJhdGVzLmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0jaW5jbHVkZSAiaW5ldC5oIgotI2luY2x1ZGUgInNzbGNtZHMuaCIKLSNpbmNsdWRlICJzc2xoZWxwZXIuaCIKLSNpbmNsdWRlICJzZWxlY3Rpb24uaCIKLSNpbmNsdWRlICJwbS5oIgotI2luY2x1ZGUgInNvbGlkLmgiCi0KLS8qCi0gKiBtYWluIHJvdXRpbmUgZm9yIHRoZSB4MTF2bmMgcHJvZ3JhbQotICovCi12b2lkIHdhdGNoX2xvb3Aodm9pZCk7Ci0KLXN0YXRpYyBpbnQgbGltaXRfc2htKHZvaWQpOwotc3RhdGljIHZvaWQgY2hlY2tfcmNmaWxlKGludCBhcmdjLCBjaGFyICoqYXJndik7Ci1zdGF0aWMgdm9pZCBpbW1lZGlhdGVfc3dpdGNoX3VzZXIoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zZXR0aW5ncyhpbnQgdHJ5X2h0dHAsIGludCBiZywgY2hhciAqZ3VpX3N0cik7Ci1zdGF0aWMgdm9pZCBjaGVja19sb29wX21vZGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgaW50IGZvcmNlKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2FwcHNoYXJlX21vZGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7Ci0KLXN0YXRpYyBpbnQgdHNkb190aW1lb3V0X2ZsYWc7Ci0KLXN0YXRpYyB2b2lkIHRzZG9fdGltZW91dCAoaW50IHNpZykgewotCXRzZG9fdGltZW91dF9mbGFnID0gMTsKLQlpZiAoc2lnKSB7fTsKLX0KLQotI2RlZmluZSBUQVNLTUFYIDMyCi1zdGF0aWMgcGlkX3QgdHNfdGFza3NbVEFTS01BWF07Ci1zdGF0aWMgaW50IHRzX3Rhc2tuID0gLTE7Ci0KLWludCB0c2RvKGludCBwb3J0LCBpbnQgbHNvY2ssIGludCAqY29ubikgewotCWludCBjc29jaywgcnNvY2ssIGksIGRiID0gMTsKLQlwaWRfdCBwaWQ7Ci0Jc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0jaWZkZWYgX19ocHV4Ci0JaW50IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0jZWxzZQotCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotI2VuZGlmCi0KLQlpZiAoKmNvbm4gPCAwKSB7Ci0JCXNpZ25hbChTSUdBTFJNLCB0c2RvX3RpbWVvdXQpOwotCQl0c2RvX3RpbWVvdXRfZmxhZyA9IDA7Ci0KLQkJYWxhcm0oMTApOwotCQljc29jayA9IGFjY2VwdChsc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCWFsYXJtKDApOwotCi0JCWlmIChkYikgcmZiTG9nKCJ0c2RvOiBhY2NlcHQ6IGxzb2NrOiAlZCwgY3NvY2s6ICVkLCBwb3J0OiAlZFxuIiwgbHNvY2ssIGNzb2NrLCBwb3J0KTsKLQotCQlpZiAodHNkb190aW1lb3V0X2ZsYWcgPiAwIHx8IGNzb2NrIDwgMCkgewotCQkJY2xvc2UoY3NvY2spOwotCQkJKmNvbm4gPSAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCSpjb25uID0gY3NvY2s7Ci0JfSBlbHNlIHsKLQkJY3NvY2sgPSAqY29ubjsKLQkJaWYgKGRiKSByZmJMb2coInRzZG86IHVzaW5nIGV4aXN0aW5nIGNzb2NrOiAlZCwgcG9ydDogJWRcbiIsIGNzb2NrLCBwb3J0KTsKLQl9Ci0KLQlyc29jayA9IGNvbm5lY3RfdGNwKCIxMjcuMC4wLjEiLCBwb3J0KTsKLQlpZiAocnNvY2sgPCAwKSB7Ci0JCWlmIChkYikgcmZiTG9nKCJ0c2RvOiBjb25uZWN0X3RjcChwb3J0PSVkKSBmYWlsZWQuXG4iLCBwb3J0KTsKLQkJY2xvc2UoY3NvY2spOwotCQlyZXR1cm4gMjsKLQl9Ci0KLQlwaWQgPSBmb3JrKCk7Ci0JaWYgKHBpZCA8IDApIHsKLQkJY2xvc2UoY3NvY2spOwotCQljbG9zZShyc29jayk7Ci0JCXJldHVybiAzOwotCX0KLQlpZiAocGlkID4gMCkgewotCQl0c190YXNrbiA9ICh0c190YXNrbisxKSAlIFRBU0tNQVg7Ci0JCXRzX3Rhc2tzW3RzX3Rhc2tuXSA9IHBpZDsKLQkJY2xvc2UoY3NvY2spOwotCQljbG9zZShyc29jayk7Ci0JCSpjb25uID0gLTE7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocGlkID09IDApIHsKLQkJZm9yIChpPTA7IGk8MjU1OyBpKyspIHsKLQkJCWlmIChpICE9IGNzb2NrICYmIGkgIT0gcnNvY2sgJiYgaSAhPSAyKSB7Ci0JCQkJY2xvc2UoaSk7Ci0JCQl9Ci0JCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRTSUQKLQkJaWYgKHNldHNpZCgpID09IC0xKSB7Ci0JCQlwZXJyb3IoInNldHNpZCIpOwotCQkJY2xvc2UoY3NvY2spOwotCQkJY2xvc2UocnNvY2spOwotCQkJZXhpdCgxKTsKLQkJfQotI2Vsc2UKLQkJaWYgKHNldHBncnAoKSA9PSAtMSkgewotCQkJcGVycm9yKCJzZXRwZ3JwIik7Ci0JCQljbG9zZShjc29jayk7Ci0JCQljbG9zZShyc29jayk7Ci0JCQlleGl0KDEpOwotCQl9Ci0jZW5kaWYJLyogU0VUU0lEICovCi0JCXJhd194ZmVyKHJzb2NrLCBjc29jaywgY3NvY2spOwotCQljbG9zZShjc29jayk7Ci0JCWNsb3NlKHJzb2NrKTsKLQkJZXhpdCgwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc2V0X3JlZGlyX3Byb3BlcnRpZXModm9pZCk7Ci0KLSNkZWZpbmUgVFNNQVggMzIKLSNkZWZpbmUgVFNTVEsgMTYKLQotdm9pZCB0ZXJtaW5hbF9zZXJ2aWNlcyhjaGFyICpsaXN0KSB7Ci0JaW50IGksIGosIG4sIGRiID0gMTsKLQljaGFyICpwLCAqcSwgKnIsICpzdHI7Ci0jaWYgIU5PX1gxMQotCWNoYXIgKnRhZ1tUU01BWF07Ci0JaW50IGxpc3RlbltUU01BWF0sIHJlZGlyW1RTTUFYXVtUU1NUS10sIHNvY2tzW1RTTUFYXSwgdHN0a1tUU1NUS107Ci0JZG91YmxlIHJhdGVfc3RhcnQ7Ci0JaW50IHJhdGVfY291bnQ7Ci0JQXRvbSBhdCwgYXRvbVtUU01BWF07Ci0JZmRfc2V0IHJkOwotCVdpbmRvdyByd2luOwotCVhFcnJvckhhbmRsZXIgICBvbGRfaGFuZGxlcjE7Ci0JWElPRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyMjsKLQljaGFyIG51bVszMl07Ci0JdGltZV90IGxhc3RfY2xlYW4gPSB0aW1lKE5VTEwpOwotCi0JaWYgKGdldGVudigiVFNfUkVESVJfREVCVUciKSkgewotCQlkYiA9IDI7Ci0JfQotCi0JaWYgKCEgZHB5KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlyd2luID0gUm9vdFdpbmRvdyhkcHksIERlZmF1bHRTY3JlZW4oZHB5KSk7Ci0KLQlhdCA9IFhJbnRlcm5BdG9tKGRweSwgIlRTX1JFRElSX0xJU1QiLCBGYWxzZSk7Ci0JaWYgKGF0ICE9IE5vbmUpIHsKLQkJWENoYW5nZVByb3BlcnR5KGRweSwgcndpbiwgYXQsIFhBX1NUUklORywgOCwKLQkJICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIgKilsaXN0LCBzdHJsZW4obGlzdCkpOwotCQlYU3luYyhkcHksIEZhbHNlKTsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlRTX1JFRElSX0xJU1QgQXRvbTogJWQuXG4iLCAoaW50KSBhdCk7Ci0KLQlvaF9yZXN0YXJ0X2l0X2FsbDoKLQotCWZvciAoaT0wOyBpPFRBU0tNQVg7IGkrKykgewotCQl0c190YXNrc1tpXSA9IDA7Ci0JfQotCWZvciAoaT0wOyBpPFRTTUFYOyBpKyspIHsKLQkJc29ja3NbaV0gPSAtMTsKLQkJbGlzdGVuW2ldID0gLTE7Ci0JCWZvciAoaj0wOyBqPFRTU1RLOyBqKyspIHsKLQkJCXJlZGlyW2ldW2pdID0gMDsKLQkJfQotCX0KLQotCXJhdGVfc3RhcnQgPSAwLjA7Ci0JcmF0ZV9jb3VudCA9IDA7Ci0KLQluID0gMDsKLQlzdHIgPSBzdHJkdXAobGlzdCk7Ci0JcCA9IHN0cnRvayhzdHIsICIsIik7Ci0Jd2hpbGUgKHApIHsKLQkJaW50IG0xLCBtMjsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIml0ZW06ICVzXG4iLCBwKTsKLQkJcSA9IHN0cnJjaHIocCwgJzonKTsKLQkJaWYgKCFxKSB7Ci0JCQlwID0gc3RydG9rKE5VTEwsICIsIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlyID0gc3RyY2hyKHAsICc6Jyk7Ci0JCWlmICghciB8fCByID09IHEpIHsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbTEgPSBhdG9pKHErMSk7Ci0JCSpxID0gJ1wwJzsKLQkJbTIgPSBhdG9pKHIrMSk7Ci0JCSpyID0gJ1wwJzsKLQotCQlpZiAobTEgPD0gMCB8fCBtMiA8PSAwIHx8IG0xID49IDB4ZmZmZiB8fCBtMiA+PSAweGZmZmYpIHsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcmVkaXJbbl1bMF0gPSBtMTsKLQkJbGlzdGVuW25dID0gbTI7Ci0JCXRhZ1tuXSA9IHN0cmR1cChwKTsKLQotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICAgICAlZCAlZCAlc1xuIiwgcmVkaXJbbl1bMF0sIGxpc3RlbltuXSwgdGFnW25dKTsKLQotCQkqciA9ICc6JzsKLQkJKnEgPSAnOic7Ci0KLQkJbisrOwotCQlpZiAobiA+PSBUU01BWCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCX0KLQlmcmVlKHN0cik7Ci0KLQlpZiAobj09MCkgewotCQlyZXR1cm47Ci0JfQotCi0JYXQgPSBYSW50ZXJuQXRvbShkcHksICJUU19SRURJUl9QSUQiLCBGYWxzZSk7Ci0JaWYgKGF0ICE9IE5vbmUpIHsKLQkJc3ByaW50ZihudW0sICIlZCIsIGdldHBpZCgpKTsKLQkJWENoYW5nZVByb3BlcnR5KGRweSwgcndpbiwgYXQsIFhBX1NUUklORywgOCwKLQkJICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIgKiludW0sIHN0cmxlbihudW0pKTsKLQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JfQotCi0JZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCWludCBrOwotCQlhdG9tW2ldID0gWEludGVybkF0b20oZHB5LCB0YWdbaV0sIEZhbHNlKTsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInRhZzogJXMgYXRvbTogJWRcbiIsIHRhZ1tpXSwgKGludCkgYXRvbVtpXSk7Ci0JCWlmIChhdG9tW2ldID09IE5vbmUpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNwcmludGYobnVtLCAiJWQiLCByZWRpcltpXVswXSk7Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgIGxpc3RlbjogJWQgIHJlZGlyOiAlc1xuIiwgbGlzdGVuW2ldLCBudW0pOwotCQlYQ2hhbmdlUHJvcGVydHkoZHB5LCByd2luLCBhdG9tW2ldLCBYQV9TVFJJTkcsIDgsCi0JCSAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyICopbnVtLCBzdHJsZW4obnVtKSk7Ci0JCVhTeW5jKGRweSwgRmFsc2UpOwotCi0JCWZvciAoaz0xOyBrIDw9IDU7IGsrKykgewotCQkJLyogWFhYIDo6MSBmYWxsYmFjaz8gKi8KLQkJCXNvY2tzW2ldID0gbGlzdGVuX3RjcChsaXN0ZW5baV0sIGh0b25sKElOQUREUl9MT09QQkFDSyksIDEpOwotCQkJaWYgKHNvY2tzW2ldID49IDApIHsKLQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiICAgICBsaXN0ZW4gc3VjY2VlZGVkOiAlZFxuIiwgbGlzdGVuW2ldKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICIgICAgIGxpc3RlbiBmYWlsZWQqKio6ICVkXG4iLCBsaXN0ZW5baV0pOwotCQkJdXNsZWVwKGsgKiAyMDAwKjEwMDApOwotCQl9Ci0JfQotCi0JaWYgKGdldGVudigiVFNEX1JFU1RBUlQiKSkgewotCQlpZiAoIXN0cmNtcChnZXRlbnYoIlRTRF9SRVNUQVJUIiksICIxIikpIHsKLQkJCXNldF9yZWRpcl9wcm9wZXJ0aWVzKCk7Ci0JCX0KLQl9Ci0KLQl3aGlsZSAoMSkgewotCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQkJaW50IG5mZDsKLQkJaW50IGZtYXggPSAtMTsKLQotCQl0di50dl9zZWMgID0gMzsKLQkJdHYudHZfdXNlYyA9IDA7Ci0KLQkJRkRfWkVSTygmcmQpOwotCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJCWlmIChzb2Nrc1tpXSA+PSAwKSB7Ci0JCQkJRkRfU0VUKHNvY2tzW2ldLCAmcmQpOwotCQkJCWlmIChzb2Nrc1tpXSA+IGZtYXgpIHsKLQkJCQkJZm1heCA9IHNvY2tzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW5mZCA9IHNlbGVjdChmbWF4KzEsICZyZCwgTlVMTCwgTlVMTCwgJnR2KTsKLQotCQlpZiAoZGIgJiYgMCkgZnByaW50ZihzdGRlcnIsICJuZmQ9JWRcbiIsIG5mZCk7Ci0JCWlmIChuZmQgPCAwICYmIGVycm5vID09IEVJTlRSKSB7Ci0JCQlYU3luYyhkcHksIFRydWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKG5mZCA+IDApIHsKLQkJCWludCBkaWRfdHMgPSAwOwotCQkJZm9yKGk9MDsgaTxuOyBpKyspIHsKLQkJCQlpbnQgayA9IDA7Ci0JCQkJZm9yIChqID0gMDsgaiA8IFRTU1RLOyBqKyspIHsKLQkJCQkJdHN0a1tqXSA9IDA7Ci0JCQkJfQotCQkJCWZvciAoaiA9IDA7IGogPCBUU1NUSzsgaisrKSB7Ci0JCQkJCWlmIChyZWRpcltpXVtqXSAhPSAwKSB7Ci0JCQkJCQl0c3RrW2srK10gPSByZWRpcltpXVtqXTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGogPSAwOyBqIDwgVFNTVEs7IGorKykgewotCQkJCQlyZWRpcltpXVtqXSA9IHRzdGtbal07Ci1pZiAodHN0a1tqXSAhPSAwKSBmcHJpbnRmKHN0ZGVyciwgIkIgcmVkaXJbJWRdWyVkXSA9ICVkICAlc1xuIiwgaSwgaiwgdHN0a1tqXSwgdGFnW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IoaT0wOyBpPG47IGkrKykgewotCQkJCWludCBzID0gc29ja3NbaV07Ci0JCQkJaWYgKHMgPCAwKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoRkRfSVNTRVQocywgJnJkKSkgewotCQkJCQlpbnQgcDAsIHAsIGZvdW5kID0gLTEsIGp6ZXJvID0gLTE7Ci0JCQkJCWludCBjb25uID0gLTE7Ci0KLQkJCQkJZ2V0X3Byb3AobnVtLCAzMiwgYXRvbVtpXSwgTm9uZSk7Ci0JCQkJCXAwID0gYXRvaShudW0pOwotCi0JCQkJCWZvciAoaiA9IFRTU1RLLTE7IGogPj0gMDsgai0tKSB7Ci0JCQkJCQlpZiAocmVkaXJbaV1bal0gPT0gMCkgewotCQkJCQkJCWp6ZXJvID0gajsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChwMCA+IDAgJiYgcDAgPCAweGZmZmYpIHsKLQkJCQkJCQlpZiAocmVkaXJbaV1bal0gPT0gcDApIHsKLQkJCQkJCQkJZm91bmQgPSBqOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGp6ZXJvIDwgMCkgewotCQkJCQkJanplcm8gPSBUU1NUSy0xOwotCQkJCQl9Ci0JCQkJCWlmIChmb3VuZCA8IDApIHsKLQkJCQkJCWlmIChwMCA+IDAgJiYgcDAgPCAweGZmZmYpIHsKLQkJCQkJCQlyZWRpcltpXVtqemVyb10gPSBwMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKGogPSBUU1NUSy0xOyBqID49IDA7IGotLSkgewotCQkJCQkJaW50IHJjOwotCQkJCQkJcCA9IHJlZGlyW2ldW2pdOwotCQkJCQkJaWYgKHAgPD0gMCB8fCBwID49IDB4ZmZmZikgewotCQkJCQkJCXJlZGlyW2ldW2pdID0gMDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGRub3coKSA+IHJhdGVfc3RhcnQgKyAxMC4wKSB7Ci0JCQkJCQkJcmF0ZV9zdGFydCA9IGRub3coKTsKLQkJCQkJCQlyYXRlX2NvdW50ID0gMDsKLQkJCQkJCX0KLQkJCQkJCXJhdGVfY291bnQrKzsKLQotCQkJCQkJcmMgPSB0c2RvKHAsIHMsICZjb25uKTsKLQkJCQkJCWRpZF90cysrOwotCi0JCQkJCQlpZiAocmMgPT0gMCkgewotCQkJCQkJCS8qIEFPSyAqLwotCQkJCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ0c2RvWyVkXSBPSzogJWRcbiIsIGksIHApOwotCQkJCQkJCWlmIChwICE9IHAwKSB7Ci0JCQkJCQkJCXNwcmludGYobnVtLCAiJWQiLCBwKTsKLQkJCQkJCQkJWENoYW5nZVByb3BlcnR5KGRweSwgcndpbiwgYXRvbVtpXSwgWEFfU1RSSU5HLCA4LAotCQkJCQkJCQkgICAgUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKW51bSwgc3RybGVuKG51bSkpOwotCQkJCQkJCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGVsc2UgaWYgKHJjID09IDEpIHsKLQkJCQkJCQkvKiBhY2NlcHQgZmFpbGVkICovCi0JCQkJCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInRzZG9bJWRdIGFjY2VwdCBmYWlsZWQ6ICVkLCBzbGVlcCA1MG1zXG4iLCBpLCBwKTsKLQkJCQkJCQl1c2xlZXAoNTAqMTAwMCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGVsc2UgaWYgKHJjID09IDIpIHsKLQkJCQkJCQkvKiBjb25uZWN0IGZhaWxlZCAqLwotCQkJCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ0c2RvWyVkXSBjb25uZWN0IGZhaWxlZDogJWQsIHNsZWVwIDUwbXMgIHJhdGU6ICVkLzEwc1xuIiwgaSwgcCwgcmF0ZV9jb3VudCk7Ci0JCQkJCQkJcmVkaXJbaV1bal0gPSAwOwotCQkJCQkJCXVzbGVlcCg1MCoxMDAwKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAocmMgPT0gMykgewotCQkJCQkJCS8qIGZvcmsgZmFpbGVkICovCi0JCQkJCQkJdXNsZWVwKDUwMCoxMDAwKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKGogPSAwOyBqIDwgVFNTVEs7IGorKykgewotCQkJCQkJaWYgKHJlZGlyW2ldW2pdICE9IDApIGZwcmludGYoc3RkZXJyLCAiQSByZWRpclslZF1bJWRdID0gJWQgICVzXG4iLCBpLCBqLCByZWRpcltpXVtqXSwgdGFnW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkaWRfdHMgJiYgcmF0ZV9jb3VudCA+IDEwMCkgewotCQkJCWludCBkYl9uZXRzdGF0ID0gMTsKLQkJCQljaGFyIGRjbWRbMTAwXTsKLQotCQkJCWlmIChub19leHRlcm5hbF9jbWRzKSB7Ci0JCQkJCWRiX25ldHN0YXQgPSAwOwotCQkJCX0KLQotCQkJCXJmYkxvZygidGVybWluYWxfc2VydmljZXM6IHRocm90dGxpbmcgaGlnaCBjb25uZWN0IHJhdGUgJWQvMTBzXG4iLCByYXRlX2NvdW50KTsKLQkJCQl1c2xlZXAoMioxMDAwKjEwMDApOwotCQkJCXJmYkxvZygidGVybWluYWxfc2VydmljZXM6IHN0b3BwaW5nIHRzIHNlcnZpY2VzLlxuIik7Ci0JCQkJZm9yKGk9MDsgaTxuOyBpKyspIHsKLQkJCQkJaW50IHMgPSBzb2Nrc1tpXTsKLQkJCQkJaWYgKHMgPCAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZmJMb2coInRlcm1pbmFsX3NlcnZpY2VzOiBjbG9zaW5nIGxpc3Rlbj0lZCBzb2NrPSVkLlxuIiwgbGlzdGVuW2ldLCBzb2Nrc1tpXSk7Ci0JCQkJCWlmIChsaXN0ZW5baV0gPj0gMCAmJiBkYl9uZXRzdGF0KSB7Ci0JCQkJCQlzcHJpbnRmKGRjbWQsICJuZXRzdGF0IC1hbiB8IGdyZXAgLXcgJyVkJyIsIGxpc3RlbltpXSk7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiMxICVzXG4iLCBkY21kKTsKLQkJCQkJCXN5c3RlbShkY21kKTsKLQkJCQkJfQotCQkJCQljbG9zZShzKTsKLQkJCQkJc29ja3NbaV0gPSAtMTsKLQkJCQkJdXNsZWVwKDIqMTAwMCoxMDAwKTsKLQkJCQkJaWYgKGxpc3RlbltpXSA+PSAwICYmIGRiX25ldHN0YXQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiIzIgJXNcbiIsIGRjbWQpOwotCQkJCQkJc3lzdGVtKGRjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXVzbGVlcCgxMCoxMDAwKjEwMDApOwotCi0JCQkJcmZiTG9nKCJ0ZXJtaW5hbF9zZXJ2aWNlczogcmVzdGFydGluZyB0cyBzZXJ2aWNlc1xuIik7Ci0JCQkJZ290byBvaF9yZXN0YXJ0X2l0X2FsbDsKLQkJCX0KLQkJfQotCQlmb3IgKGk9MDsgaTxUQVNLTUFYOyBpKyspIHsKLQkJCXBpZF90IHAgPSB0c190YXNrc1tpXTsKLQkJCWlmIChwID4gMCkgewotCQkJCWludCBzdGF0dXM7Ci0JCQkJcGlkX3QgcDIgPSB3YWl0cGlkKHAsICZzdGF0dXMsIFdOT0hBTkcpOyAKLQkJCQlpZiAocDIgPT0gcCkgewotCQkJCQl0c190YXNrc1tpXSA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIHRoaXMgaXMgdG8gZHJvcCBldmVudHMgYW5kIGV4aXQgd2hlbiBYIHNlcnZlciBpcyBnb25lLiAqLwotCQlvbGRfaGFuZGxlcjEgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQkJb2xkX2hhbmRsZXIyID0gWFNldElPRXJyb3JIYW5kbGVyKHRyYXBfeGlvZXJyb3IpOwotCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JCXRyYXBwZWRfeGlvZXJyb3IgPSAwOwotCi0JCVhTeW5jKGRweSwgVHJ1ZSk7Ci0KLQkJc3ByaW50ZihudW0sICIlZCIsIChpbnQpIHRpbWUoTlVMTCkpOwotCQlhdCA9IFhJbnRlcm5BdG9tKGRweSwgIlRTX1JFRElSIiwgRmFsc2UpOwotCQlpZiAoYXQgIT0gTm9uZSkgewotCQkJWENoYW5nZVByb3BlcnR5KGRweSwgcndpbiwgYXQsIFhBX1NUUklORywgOCwKLQkJCSAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyICopbnVtLCBzdHJsZW4obnVtKSk7Ci0JCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJfQotCQlpZiAodGltZShOVUxMKSA+IGxhc3RfY2xlYW4gKyAyMCAqIDYwKSB7Ci0JCQlpbnQgaSwgajsKLQkJCWZvcihpPTA7IGk8bjsgaSsrKSB7Ci0JCQkJaW50IGZpcnN0ID0gMTsKLQkJCQlmb3IgKGogPSBUU1NUSy0xOyBqID49IDA7IGotLSkgewotCQkJCQlpbnQgcywgcCA9IHJlZGlyW2ldW2pdOwotCQkJCQlpZiAocCA8PSAwIHx8IHAgPj0gMHhmZmZmKSB7Ci0JCQkJCQlyZWRpcltpXVtqXSA9IDA7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlzID0gY29ubmVjdF90Y3AoIjEyNy4wLjAuMSIsIHApOwotCQkJCQlpZiAocyA8IDApIHsKLQkJCQkJCXJlZGlyW2ldW2pdID0gMDsKLQkJCQkJCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJ0c2RvWyVkXVslZF0gY2xlYW46IGNvbm5lY3QgZmFpbGVkOiAlZFxuIiwgaSwgaiwgcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljbG9zZShzKTsKLQkJCQkJCWlmIChmaXJzdCkgewotCQkJCQkJCXNwcmludGYobnVtLCAiJWQiLCBwKTsKLQkJCQkJCQlYQ2hhbmdlUHJvcGVydHkoZHB5LCByd2luLCBhdG9tW2ldLCBYQV9TVFJJTkcsIDgsCi0JCQkJCQkJICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIgKiludW0sIHN0cmxlbihudW0pKTsKLQkJCQkJCQlYU3luYyhkcHksIEZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWZpcnN0ID0gMDsKLQkJCQkJfQotCQkJCQl1c2xlZXAoNTAwKjEwMDApOwotCQkJCX0KLQkJCX0KLQkJCWxhc3RfY2xlYW4gPSB0aW1lKE5VTEwpOwotCQl9Ci0JCWlmICh0cmFwcGVkX3hlcnJvciB8fCB0cmFwcGVkX3hpb2Vycm9yKSB7Ci0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiWGVycm9yOiAlZC8lZFxuIiwgdHJhcHBlZF94ZXJyb3IsIHRyYXBwZWRfeGlvZXJyb3IpOwotCQkJZXhpdCgwKTsKLQkJfQotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyMSk7Ci0JCVhTZXRJT0Vycm9ySGFuZGxlcihvbGRfaGFuZGxlcjIpOwotCX0KLSNlbmRpZgotfQotCi1jaGFyICp0c19zZXJ2aWNlc1tdWzJdID0gewotCXsiRkRfQ1VQUyIsICJUU19DVVBTX1JFRElSIn0sCi0JeyJGRF9TTUIiLCAgIlRTX1NNQl9SRURJUiJ9LAotCXsiRkRfRVNEIiwgICJUU19FU0RfUkVESVIifSwKLQl7IkZEX05BUyIsICAiVFNfTkFTX1JFRElSIn0sCi0Je05VTEwsIE5VTEx9Ci19OwotCi12b2lkIGRvX3RzZCh2b2lkKSB7Ci0jaWYgIU5PX1gxMQotCUF0b20gYTsKLQljaGFyIHByb3BbNTEzXTsKLQlwaWRfdCBwaWQ7Ci0JY2hhciAqY21kOwotCWludCBuLCBzeiA9IDA7Ci0JY2hhciAqZGlzcCA9IERpc3BsYXlTdHJpbmcoZHB5KTsKLQljaGFyICpsb2dmaWxlID0gZ2V0ZW52KCJUU19SRURJUl9MT0dGSUxFIik7Ci0JaW50IGRiID0gMDsKLQotCWlmIChnZXRlbnYoIlRTX1JFRElSX0RFQlVHIikpIHsKLQkJZGIgPSAxOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZG9fdHNkKCkgaW4uXG4iKTsKLQotCXByb3BbMF0gPSAnXDAnOwotCWEgPSBYSW50ZXJuQXRvbShkcHksICJUU19SRURJUl9MSVNUIiwgRmFsc2UpOwotCWlmIChhICE9IE5vbmUpIHsKLQkJZ2V0X3Byb3AocHJvcCwgNTEyLCBhLCBOb25lKTsKLQl9Ci0JaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlRTX1JFRElSX0xJU1QgQXRvbTogJWQgPSAnJXMnXG4iLCAoaW50KSBhLCBwcm9wKTsKLQotCWlmIChwcm9wWzBdID09ICdcMCcpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHByb2dyYW1fbmFtZSkgewotCQlwcm9ncmFtX25hbWUgPSAieDExdm5jIjsKLQl9Ci0Jc3ogKz0gc3RybGVuKHByb2dyYW1fbmFtZSkgKyAxOwotCXN6ICs9IHN0cmxlbigiLWRpc3BsYXkiKSArIDE7Ci0Jc3ogKz0gc3RybGVuKGRpc3ApICsgMTsKLQlzeiArPSBzdHJsZW4oIi10c2QiKSArIDE7Ci0Jc3ogKz0gMSArIHN0cmxlbihwcm9wKSArIDEgKyAxOwotCXN6ICs9IHN0cmxlbigiLWVudiBUU0RfUkVTVEFSVD0xIikgKyAxOwotCXN6ICs9IHN0cmxlbigiPC9kZXYvbnVsbCAxPi9kZXYvbnVsbCAyPiYxIikgKyAxOwotCXN6ICs9IHN0cmxlbigiICYiKSArIDE7Ci0JaWYgKGxvZ2ZpbGUpIHsKLQkJc3ogKz0gc3RybGVuKGxvZ2ZpbGUpOwotCX0KLQlpZiAoaXB2Nl9saXN0ZW4pIHsKLQkJc3ogKz0gc3RybGVuKCItNiIpICsgMTsKLQl9Ci0KLQljbWQgPSAoY2hhciAqKSBtYWxsb2Moc3opOwotCi0JaWYgKGdldGVudigiWEFVVEhPUklUWSIpKSB7Ci0JCWNoYXIgKnhhdXRoID0gZ2V0ZW52KCJYQVVUSE9SSVRZIik7Ci0JCWlmICghc3RyY21wKHhhdXRoLCAiIikgfHwgYWNjZXNzKHhhdXRoLCBSX09LKSAhPSAwKSB7Ci0JCQkqKHhhdXRoLTIpID0gJ18nOwkvKiB5b3cgKi8KLQkJfQotCX0KLQlzcHJpbnRmKGNtZCwgIiVzIC1kaXNwbGF5ICVzIC10c2QgJyVzJyAtZW52IFRTRF9SRVNUQVJUPTEgJXMgPC9kZXYvbnVsbCAxPiVzIDI+JjEgJiIsCi0JICAgIHByb2dyYW1fbmFtZSwgZGlzcCwgcHJvcCwgaXB2Nl9saXN0ZW4gPyAiLTYiIDogIiIsCi0JICAgIGxvZ2ZpbGUgPyBsb2dmaWxlIDogIi9kZXYvbnVsbCIgKTsgCi0JcmZiTG9nKCJydW5uaW5nOiAlc1xuIiwgY21kKTsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0ZPUksgJiYgTElCVk5DU0VSVkVSX0hBVkVfU0VUU0lECi0JLyogZm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kIG5vdyAqLwotCWlmICgocGlkID0gZm9yaygpKSA+IDApICB7Ci0JCXBpZF90IHBpZHc7Ci0JCWludCBzdGF0dXM7Ci0JCWRvdWJsZSBzID0gZG5vdygpOwotCi0JCXdoaWxlIChkbm93KCkgPCBzICsgMS41KSB7Ci0JCQlwaWR3ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOwotCQkJaWYgKHBpZHcgPT0gcGlkKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1c2xlZXAoMTAwKjEwMDApOwotCQl9Ci0JCXJldHVybjsKLQotCX0gZWxzZSBpZiAocGlkID09IC0xKSB7Ci0JCXN5c3RlbShjbWQpOwotCX0gZWxzZSB7Ci0JCXNldHNpZCgpOwotCQkvKiBhZGp1c3Qgb3VyIHN0ZGlvICovCi0JCW4gPSBvcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSk7Ci0JCWR1cDIobiwgMCk7Ci0JCWR1cDIobiwgMSk7Ci0JCWR1cDIobiwgMik7Ci0JCWlmIChuID4gMikgewotCQkJY2xvc2Uobik7Ci0JCX0KLQkJc3lzdGVtKGNtZCk7Ci0JCWV4aXQoMCk7Ci0JfQotI2Vsc2UKLQlzeXN0ZW0oY21kKTsKLSNlbmRpZgotCi0jZW5kaWYKLX0KLQotdm9pZCBzZXRfcmVkaXJfcHJvcGVydGllcyh2b2lkKSB7Ci0jaWYgIU5PX1gxMQotCWNoYXIgKmUsICpmLCAqdDsKLQlBdG9tIGE7Ci0JY2hhciBudW1bMzJdOwotCWludCBpLCBwOwotCi0JaWYgKCEgZHB5KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpID0gMDsKLQl3aGlsZSAodHNfc2VydmljZXNbaV1bMF0gIT0gTlVMTCkgewotCQlmID0gdHNfc2VydmljZXNbaV1bMF07IAotCQl0ID0gdHNfc2VydmljZXNbaV1bMV07IAotCQllID0gZ2V0ZW52KGYpOwotCQlpZiAoIWUgfHwgc3Ryc3RyKGUsICJEQUVNT04tIikgIT0gZSkgewotCQkJaSsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJcCA9IGF0b2koZSArIHN0cmxlbigiREFFTU9OLSIpKTsKLQkJaWYgKHAgPD0gMCkgewotCQkJaSsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJc3ByaW50ZihudW0sICIlZCIsIHApOwotCQlhID0gWEludGVybkF0b20oZHB5LCB0LCBGYWxzZSk7Ci0JCWlmIChhICE9IE5vbmUpIHsKLQkJCVdpbmRvdyByd2luID0gUm9vdFdpbmRvdyhkcHksIERlZmF1bHRTY3JlZW4oZHB5KSk7Ci1mcHJpbnRmKHN0ZGVyciwgIlNldDogJXMgJXMgJXMgLT4gJXNcbiIsIGYsIHQsIGUsIG51bSk7Ci0JCQlYQ2hhbmdlUHJvcGVydHkoZHB5LCByd2luLCBhLCBYQV9TVFJJTkcsIDgsCi0JCQkgICAgUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKSBudW0sIHN0cmxlbihudW0pKTsKLQkJCVhTeW5jKGRweSwgRmFsc2UpOwotCQl9Ci0JCWkrKzsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfcmVkaXJfc2VydmljZXModm9pZCkgewotI2lmICFOT19YMTEKLQlBdG9tIGE7Ci0JY2hhciBwcm9wWzUxM107Ci0JdGltZV90IHRzZF9sYXN0OwotCWludCByZXN0YXJ0ID0gMDsKLQlwaWRfdCBwaWQgPSAwOwotCWludCBkYiA9IDA7Ci0JZGIgPSAwOwotCi0JaWYgKGdldGVudigiVFNfUkVESVJfREVCVUciKSkgewotCQlkYiA9IDE7Ci0JfQotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJjaGVja19yZWRpcl9zZXJ2aWNlcyBpbi5cbiIpOwotCi0JaWYgKCEgZHB5KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlhID0gWEludGVybkF0b20oZHB5LCAiVFNfUkVESVJfUElEIiwgRmFsc2UpOwotCWlmIChhICE9IE5vbmUpIHsKLQkJcHJvcFswXSA9ICdcMCc7Ci0JCWdldF9wcm9wKHByb3AsIDUxMiwgYSwgTm9uZSk7Ci0JCWlmIChwcm9wWzBdICE9ICdcMCcpIHsKLQkJCXBpZCA9IChwaWRfdCkgYXRvaShwcm9wKTsKLQkJfQotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiVFNfUkVESVJfUElEIEF0b206ICVkID0gJyVzJ1xuIiwgKGludCkgYSwgcHJvcCk7Ci0KLQlpZiAoZ2V0ZW52KCJGRF9UQUciKSAmJiBzdHJjbXAoZ2V0ZW52KCJGRF9UQUciKSwgIiIpKSB7Ci0JCWEgPSBYSW50ZXJuQXRvbShkcHksICJGRF9UQUciLCBGYWxzZSk7Ci0JCWlmIChhICE9IE5vbmUpIHsKLQkJCVdpbmRvdyByd2luID0gUm9vdFdpbmRvdyhkcHksIERlZmF1bHRTY3JlZW4oZHB5KSk7Ci0JCQljaGFyICp0YWcgPSBnZXRlbnYoIkZEX1RBRyIpOwotCQkJWENoYW5nZVByb3BlcnR5KGRweSwgcndpbiwgYSwgWEFfU1RSSU5HLCA4LAotCQkJICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIgKil0YWcsIHN0cmxlbih0YWcpKTsKLQkJCVhTeW5jKGRweSwgRmFsc2UpOwotCQl9Ci0JCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJGRF9UQUcgQXRvbTogJWQgPSAnJXMnXG4iLCAoaW50KSBhLCBwcm9wKTsKLQl9Ci0KLQlwcm9wWzBdID0gJ1wwJzsKLQlhID0gWEludGVybkF0b20oZHB5LCAiVFNfUkVESVIiLCBGYWxzZSk7Ci0JaWYgKGEgIT0gTm9uZSkgewotCQlnZXRfcHJvcChwcm9wLCA1MTIsIGEsIE5vbmUpOwotCX0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiVFNfUkVESVIgQXRvbTogJWQgPSAnJXMnXG4iLCAoaW50KSBhLCBwcm9wKTsKLQlpZiAocHJvcFswXSA9PSAnXDAnKSB7Ci0JCXJmYkxvZygiVFNfUkVESVIgaXMgZW1wdHksIHJlc3RhcnRpbmcuLi5cbiIpOwotCQlyZXN0YXJ0ID0gMTsKLQl9IGVsc2UgewotCQl0c2RfbGFzdCA9ICh0aW1lX3QpIGF0b2kocHJvcCk7Ci0JCWlmICh0aW1lKE5VTEwpID4gdHNkX2xhc3QgKyAzMCkgewotCQkJcmZiTG9nKCJUU19SRURJUiBzZWVtcyBkZWFkIGZvcjogJWQgc2VjLCByZXN0YXJ0aW5nLi4uXG4iLAotCQkJICAgIHRpbWUoTlVMTCkgLSB0c2RfbGFzdCk7Ci0JCQlyZXN0YXJ0ID0gMTsKLQkJfSBlbHNlIGlmIChwaWQgPiAwICYmIHRpbWUoTlVMTCkgPiB0c2RfbGFzdCArIDYpIHsKLQkJCWlmIChraWxsKHBpZCwgMCkgIT0gMCkgewotCQkJCXJmYkxvZygiVFNfUkVESVIgc2VlbXMgZGVhZCB2aWEga2lsbCglZCwgMCksIHJlc3RhcnRpbmcuLi5cbiIsCi0JCQkJICAgIHBpZCk7Ci0JCQkJcmVzdGFydCA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHJlc3RhcnQpIHsKLQotCQlpZiAocGlkID4gMSkgewotCQkJcmZiTG9nKCJraWxsaW5nIFRTX1JFRElSX1BJRDogJWRcbiIsIHBpZCk7Ci0JCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCQl1c2xlZXAoNTAwKjEwMDApOwotCQkJa2lsbChwaWQsIFNJR0tJTEwpOwotCQl9Ci0JCWRvX3RzZCgpOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfcmVkaXJfc2VydmljZXMgcmVzdGFydGVkLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiY2hlY2tfcmVkaXJfc2VydmljZXMsIG5vIHJlc3RhcnQsIGNhbGxpbmcgc2V0X3JlZGlyX3Byb3BlcnRpZXMuXG4iKTsKLQlzZXRfcmVkaXJfcHJvcGVydGllcygpOwotI2VuZGlmCi19Ci0KLXZvaWQgc3NoX3JlbW90ZV90dW5uZWwoY2hhciAqaW5zdHIsIGludCBscG9ydCkgewotCWNoYXIgKnEsICpjbWQsICpzc2g7Ci0JY2hhciAqcyA9IHN0cmR1cChpbnN0cik7Ci0JaW50IHNsZWVwID0gMzAwLCBkaXNwID0gMCwgc3BvcnQgPSAwOwotCWludCByYywgbGVuLCBycG9ydDsKLQotCS8qIHVzZXJAaG9zdDpwb3J0OmRpc3Arc2VjcyAqLwotCi0JLyogK3NsZWVwICovCi0JcSA9IHN0cnJjaHIocywgJysnKTsKLQlpZiAocSkgewotCQlzbGVlcCA9IGF0b2kocSsxKTsKLQkJaWYgKHNsZWVwIDw9IDApIHsKLQkJCXNsZWVwID0gMTsKLQkJfQotCQkqcSA9ICdcMCc7Ci0JfQotCS8qIDpkaXNwICovCi0JcSA9IHN0cnJjaHIocywgJzonKTsKLQlpZiAocSkgewotCQlkaXNwID0gYXRvaShxKzEpOwotCQkqcSA9ICdcMCc7Ci0JfQotCQotCS8qIDpzc2hwb3J0ICovCi0JcSA9IHN0cnJjaHIocywgJzonKTsKLQlpZiAocSkgewotCQlzcG9ydCA9IGF0b2kocSsxKTsKLQkJKnEgPSAnXDAnOwotCX0KLQotCWlmIChnZXRlbnYoIlNTSCIpKSB7Ci0JCXNzaCA9IGdldGVudigiU1NIIik7Ci0JfSBlbHNlIHsKLQkJc3NoID0gInNzaCI7Ci0JfQotCi0JbGVuID0gMDsKLQlsZW4gKz0gc3RybGVuKHNzaCkgKyBzdHJsZW4ocykgKyA1MDA7Ci0JY21kID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0KLQlpZiAoZGlzcCA+PSAwICYmIGRpc3AgPD0gMjAwKSB7Ci0JCXJwb3J0ID0gZGlzcCArIDU5MDA7Ci0JfSBlbHNlIGlmIChkaXNwIDwgMCkgewotCQlycG9ydCA9IC1kaXNwOwotCX0gZWxzZSB7Ci0JCXJwb3J0ID0gZGlzcDsKLQl9Ci0KLQlpZiAoc3BvcnQgPiAwKSB7Ci0JCXNwcmludGYoY21kLCAiJXMgLWYgLXAgJWQgLVIgJyVkOmxvY2FsaG9zdDolZCcgJyVzJyAnc2xlZXAgJWQnIiwgc3NoLCBzcG9ydCwgcnBvcnQsIGxwb3J0LCBzLCBzbGVlcCk7Ci0JfSBlbHNlIHsKLQkJc3ByaW50ZihjbWQsICIlcyAtZiAgICAgICAtUiAnJWQ6bG9jYWxob3N0OiVkJyAnJXMnICdzbGVlcCAlZCciLCBzc2gsICAgICAgICBycG9ydCwgbHBvcnQsIHMsIHNsZWVwKTsKLQl9Ci0KLQlpZiAobm9fZXh0ZXJuYWxfY21kcyB8fCAhY21kX29rKCJzc2giKSkgewotCQlyZmJMb2dFbmFibGUoMSk7Ci0JCXJmYkxvZygiY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJcmZiTG9nKCIgICBcIiVzXCJcbiIsIGNtZCk7Ci0JCXJmYkxvZygiICAgZXhpdGluZy5cbiIpOwotCQljbGVhbl91cF9leGl0KDEpOwotCX0KLQotCWNsb3NlX2V4ZWNfZmRzKCk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXJmYkxvZygicnVubmluZzogJXNcbiIsIGNtZCk7Ci0JcmMgPSBzeXN0ZW0oY21kKTsKLQotCWlmIChyYyAhPSAwKSB7Ci0JCWZyZWUoY21kKTsKLQkJZnJlZShzKTsKLQkJcmZiTG9nKCJzc2ggcmVtb3RlIGxpc3RlbiBmYWlsZWQuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0KLQlpZiAoMSkgewotCQlGSUxFICpwaXBlOwotCQlpbnQgbXlwaWQgPSAoaW50KSBnZXRwaWQoKTsKLQkJaW50IGJlc3RwaWQgPSAtMTsKLQkJaW50IGJlc3QgPSAtMTsKLQkJY2hhciBsaW5lWzEwMjRdOwotCQljaGFyICpwc2VmID0gInBzIC1lZiI7Ci0JCWNoYXIgKnBzd3cgPSAicHMgd3d3d3d3YXV4IjsKLQkJY2hhciAqcHMgPSBwc2VmOwotCQkvKiBub3QgcG9ydGFibGUuLi4gYnV0IGl0IGlzIHJlYWxseSBnb29kIHRvIHRlcm1pbmF0ZSB0aGUgc3NoIHdoZW4gZG9uZS4gKi8KLQkJLyogcHMgLWVmIHwgZWdyZXAgJ3NzaDIuKi1SLio1OTA3OmxvY2FsaG9zdDo1OTAwLipydW5nZUBjZWxpYXMubGJsLmdvdi4qc2xlZXAgMzAwJyB8IGdyZXAgLXYgZ3JlcCB8IGF3ayAne3ByaW50ICQyfScgKi8KLQkJaWYgKHN0cnN0cihVVC5zeXNuYW1lLCAiTGludXgiKSkgewotCQkJcHMgPSBwc3d3OwotCQl9IGVsc2UgaWYgKHN0cnN0cihVVC5zeXNuYW1lLCAiQlNEIikpIHsKLQkJCXBzID0gcHN3dzsKLQkJfSBlbHNlIGlmIChzdHJzdHIoVVQuc3lzbmFtZSwgIkRhcndpbiIpKSB7Ci0JCQlwcyA9IHBzd3c7Ci0JCX0KLQkJc3ByaW50ZihjbWQsICJlbnYgQ09MVU1OUz0yNTYgJXMgfCBlZ3JlcCAnJXMuKi1SIColZDpsb2NhbGhvc3Q6JWQuKiVzLipzbGVlcCAqJWQnIHwgZ3JlcCAtdiBncmVwIHwgYXdrICd7cHJpbnQgJDJ9JyIsIHBzLCBzc2gsIHJwb3J0LCBscG9ydCwgcywgc2xlZXApOwotCQlwaXBlID0gcG9wZW4oY21kLCAiciIpOwotCQlpZiAocGlwZSkgewotCQkJd2hpbGUgKGZnZXRzKGxpbmUsIDEwMjQsIHBpcGUpICE9IE5VTEwpIHsKLQkJCQlpbnQgcCA9IGF0b2kobGluZSk7Ci0JCQkJaWYgKHAgPiAwKSB7Ci0JCQkJCWludCBzY29yZTsKLQkJCQkJaWYgKHAgPiBteXBpZCkgCXsKLQkJCQkJCXNjb3JlID0gcCAtIG15cGlkOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2NvcmUgPSBwIC0gbXlwaWQgKyAzMjc2ODsKLQkJCQkJCWlmIChzY29yZSA8IDApIHsKLQkJCQkJCQlzY29yZSA9IDMyNzY4OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChiZXN0IDwgMCB8fCBzY29yZSA8IGJlc3QpIHsKLQkJCQkJCWJlc3QgPSBzY29yZTsKLQkJCQkJCWJlc3RwaWQgPSBwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcGNsb3NlKHBpcGUpOwotCQl9Ci0KLQkJaWYgKGJlc3RwaWQgIT0gLTEpIHsKLQkJCXNzaF9waWQgPSAocGlkX3QpIGJlc3RwaWQ7Ci0JCQlyZmJMb2coImd1ZXNzZWQgc3NoIHBpZD0lZCwgd2lsbCB0ZXJtaW5hdGUgaXQgb24gZXhpdC5cbiIsIGJlc3RwaWQpOwotCQl9Ci0JfQotCi0JZnJlZShjbWQpOwotCWZyZWUocyk7Ci19Ci0KLS8qIAotICogY2hlY2sgYmxhY2tsaXN0IGZvciBPU3Mgd2l0aCB0aWdodCBzaG0gbGltaXRzLgotICovCi1zdGF0aWMgaW50IGxpbWl0X3NobSh2b2lkKSB7Ci0JaW50IGxpbWl0ID0gMDsKLQotCWlmIChVVC5zeXNuYW1lID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChnZXRlbnYoIlgxMVZOQ19OT19MSU1JVF9TSE0iKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFzdHJjbXAoVVQuc3lzbmFtZSwgIlN1bk9TIikpIHsKLQkJY2hhciAqciA9IFVULnJlbGVhc2U7Ci0JCWlmICgqciA9PSAnNScgJiYgKihyKzEpID09ICcuJykgewotCQkJaWYgKHN0cmNocigiMjM0NTY3OCIsICoocisyKSkgIT0gTlVMTCkgewotCQkJCWxpbWl0ID0gMTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoIXN0cmNtcChVVC5zeXNuYW1lLCAiRGFyd2luIikpIHsKLQkJbGltaXQgPSAxOwotCX0KLQlpZiAobGltaXQgJiYgISBxdWlldCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInJlZHVjaW5nIHNobSB1c2FnZSBvbiAlcyAlcyAoYWRkaW5nICIKLQkJICAgICItb25ldGlsZSlcbiIsIFVULnN5c25hbWUsIFVULnJlbGVhc2UpOwotCX0KLQlyZXR1cm4gbGltaXQ7Ci19Ci0KLQotLyoKLSAqIHF1aWNrLW4tZGlydHkgfi8ueDExdm5jcmM6IGVhY2ggbGluZSAoZXhjZXB0ICMgY29tbWVudHMpIGlzIGEgY21kbGluZSBvcHRpb24uCi0gKi8KLXN0YXRpYyBpbnQgYXJnYzIgPSAwOwotc3RhdGljIGNoYXIgKiphcmd2MjsKLQotc3RhdGljIHZvaWQgY2hlY2tfcmNmaWxlKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCWludCBpLCBqLCBwd2xhc3QsIGVuY2xhc3QsIG5vcmMgPSAwLCBhcmdtYXggPSAxMDI0OwotCWNoYXIgKmluZmlsZSA9IE5VTEw7Ci0JY2hhciByY2ZpbGVbMTAyNF07Ci0JRklMRSAqcmMgPSBOVUxMOyAKLQotCWZvciAoaT0xOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGFyZ3ZbaV0sICItcHJpbnRndWkiKSkgewotCQkJZnByaW50ZihzdGRvdXQsICIlcyIsIGdldF9ndWlfY29kZSgpKTsKLQkJCWZmbHVzaChzdGRvdXQpOwotCQkJZXhpdCgwKTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW5vcmMiKSkgewotCQkJbm9yYyA9IDE7Ci0JCQlnb3Rfbm9yYyA9IDE7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1RRCIpKSB7Ci0JCQlub3JjID0gMTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXJjIikpIHsKLQkJCWlmIChpKzEgPj0gYXJnYykgewotCQkJCWZwcmludGYoc3RkZXJyLCAiLXJjIG9wdGlvbiByZXF1aXJlcyBhICIKLQkJCQkgICAgImZpbGVuYW1lXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZpbGUgPSBhcmd2W2krMV07Ci0JCQl9Ci0JCX0KLQl9Ci0JcmNfbm9yYyA9IG5vcmM7Ci0JcmNfcmNmaWxlID0gc3RyZHVwKCIiKTsKLQlpZiAobm9yYykgewotCQk7Ci0JfSBlbHNlIGlmIChpbmZpbGUgIT0gTlVMTCkgewotCQlyYyA9IGZvcGVuKGluZmlsZSwgInIiKTsKLQkJcmNfcmNmaWxlID0gc3RyZHVwKGluZmlsZSk7Ci0JCWlmIChyYyA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIHJjZmlsZTogJXNcbiIsIGluZmlsZSk7Ci0JCQlwZXJyb3IoImZvcGVuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hhciAqaG9tZSA9IGdldF9ob21lX2RpcigpOwotCQlpZiAoISBob21lKSB7Ci0JCQlub3JjID0gMTsKLQkJfSBlbHNlIHsKLQkJCW1lbXNldChyY2ZpbGUsIDAsIHNpemVvZihyY2ZpbGUpKTsKLQkJCXN0cm5jcHkocmNmaWxlLCBob21lLCA1MDApOwotCQkJZnJlZShob21lKTsKLQotCQkJc3RyY2F0KHJjZmlsZSwgIi8ueDExdm5jcmMiKTsKLQkJCWluZmlsZSA9IHJjZmlsZTsKLQkJCXJjID0gZm9wZW4ocmNmaWxlLCAiciIpOwotCQkJaWYgKHJjID09IE5VTEwpIHsKLQkJCQlub3JjID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmNfcmNmaWxlID0gc3RyZHVwKHJjZmlsZSk7Ci0JCQkJcmNfcmNmaWxlX2RlZmF1bHQgPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JYXJndjIgPSAoY2hhciAqKikgbWFsbG9jKGFyZ21heCAqIHNpemVvZihjaGFyICopKTsKLQlhcmd2MlthcmdjMisrXSA9IHN0cmR1cChhcmd2WzBdKTsKLQotCWlmICghIG5vcmMpIHsKLQkJY2hhciBsaW5lWzQwOTZdLCBwYXJtWzQwMF0sIHRtcFs0MDFdOwotCQljaGFyICpidWYsICp0YnVmOwotCQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCQlpbnQgc3o7Ci0KLQkJaWYgKGZzdGF0KGZpbGVubyhyYyksICZzYnVmKSAhPSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gd2l0aCAlc1xuIiwgaW5maWxlKTsKLQkJCXBlcnJvcigiZnN0YXQiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJc3ogPSBzYnVmLnN0X3NpemUrMTsJLyogYWxsb2NhdGUgd2hvbGUgZmlsZSBzaXplICovCi0JCWlmIChzeiA8IDEwMjQpIHsKLQkJCXN6ID0gMTAyNDsKLQkJfQotCi0JCWJ1ZiA9IChjaGFyICopIG1hbGxvYyhzeik7Ci0JCWJ1ZlswXSA9ICdcMCc7Ci0KLQkJd2hpbGUgKGZnZXRzKGxpbmUsIDQwOTYsIHJjKSAhPSBOVUxMKSB7Ci0JCQljaGFyICpxLCAqcCA9IGxpbmU7Ci0JCQljaGFyIGM7Ci0JCQlpbnQgY29udCA9IDA7Ci0KLQkJCXEgPSBwOwotCQkJYyA9ICdcMCc7Ci0JCQl3aGlsZSAoKnEpIHsKLQkJCQlpZiAoKnEgPT0gJyMnKSB7Ci0JCQkJCWlmIChjICE9ICdcXCcpIHsKLQkJCQkJCSpxID0gJ1wwJzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWMgPSAqcTsKLQkJCQlxKys7Ci0JCQl9Ci0KLQkJCXEgPSBwOwotCQkJYyA9ICdcMCc7Ci0JCQl3aGlsZSAoKnEpIHsKLQkJCQlpZiAoKnEgPT0gJ1xuJykgewotCQkJCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJCQljb250ID0gMTsKLQkJCQkJCSpxID0gJ1wwJzsKLQkJCQkJCSoocS0xKSA9ICcgJzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAoKnEpKSkgewotCQkJCQkJKnEgPSAnXDAnOwotCQkJCQkJaWYgKHEgPT0gcCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJcS0tOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljID0gKnE7Ci0JCQkJcSsrOwotCQkJfQotCQkJaWYgKHEgIT0gcCAmJiAhY29udCkgewotCQkJCWlmICgqcSA9PSAnXDAnKSB7Ci0JCQkJCXEtLTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICgqcSkpKSB7Ci0JCQkJCSpxID0gJ1wwJzsKLQkJCQkJaWYgKHEgPT0gcCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcS0tOwotCQkJCX0KLQkJCX0KLQotCQkJcCA9IGxibGFua3MocCk7Ci0KLQkJCXN0cm5jYXQoYnVmLCBwLCBzeiAtIHN0cmxlbihidWYpIC0gMSk7Ci0JCQlpZiAoY29udCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGJ1ZlswXSA9PSAnXDAnKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWkgPSAwOwotCQkJcSA9IGJ1ZjsKLQkJCXdoaWxlICgqcSkgewotCQkJCWkrKzsKLQkJCQlpZiAoKnEgPT0gJ1xuJyB8fCBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAoKnEpKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcSsrOwotCQkJfQotCi0JCQlpZiAoaSA+PSA0MDApIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgcmNmaWxlIGxpbmU6ICVzLyVzXG4iLAotCQkJCSAgICBwLCBidWYpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0KLQkJCWlmIChzc2NhbmYoYnVmLCAiJXMiLCBwYXJtKSAhPSAxKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHJjZmlsZSBsaW5lOiAlc1xuIiwgcCk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWlmIChwYXJtWzBdID09ICctJykgewotCQkJCXN0cm5jcHkodG1wLCBwYXJtLCA0MDApOyAKLQkJCX0gZWxzZSB7Ci0JCQkJdG1wWzBdID0gJy0nOwotCQkJCXN0cm5jcHkodG1wKzEsIHBhcm0sIDQwMCk7IAotCQkJfQotCi0JCQlpZiAoc3Ryc3RyKHRtcCwgIi1sb29wIikgPT0gdG1wKSB7Ci0JCQkJaWYgKCEgZ2V0ZW52KCJYMTFWTkNfTE9PUF9NT0RFIikpIHsKLQkJCQkJY2hlY2tfbG9vcF9tb2RlKGFyZ2MsIGFyZ3YsIDEpOwotCQkJCQlleGl0KDApOwotCQkJCX0KLQkJCX0KLQotCQkJYXJndjJbYXJnYzIrK10gPSBzdHJkdXAodG1wKTsKLQkJCWlmIChhcmdjMiA+PSBhcmdtYXgpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IHJjZmlsZSBvcHRpb25zXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJCi0JCQlwID0gYnVmOwotCQkJcCArPSBzdHJsZW4ocGFybSk7Ci0JCQlwID0gbGJsYW5rcyhwKTsKLQotCQkJaWYgKCpwID09ICdcMCcpIHsKLQkJCQlidWZbMF0gPSAnXDAnOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0YnVmID0gKGNoYXIgKikgY2FsbG9jKHN0cmxlbihwKSArIDEsIDEpOwotCi0JCQlqID0gMDsKLQkJCXdoaWxlICgqcCkgewotCQkJCWlmICgqcCA9PSAnXFwnICYmICoocCsxKSA9PSAnIycpIHsKLQkJCQkJOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRidWZbaisrXSA9ICpwOwotCQkJCX0KLQkJCQlwKys7Ci0JCQl9Ci0KLQkJCWFyZ3YyW2FyZ2MyKytdID0gc3RyZHVwKHRidWYpOwotCQkJZnJlZSh0YnVmKTsKLQkJCWlmIChhcmdjMiA+PSBhcmdtYXgpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IHJjZmlsZSBvcHRpb25zXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnVmWzBdID0gJ1wwJzsKLQkJfQotCQlmY2xvc2UocmMpOwotCQlmcmVlKGJ1Zik7Ci0JfQotCXB3bGFzdCA9IDA7Ci0JZW5jbGFzdCA9IDA7Ci0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJYXJndjJbYXJnYzIrK10gPSBzdHJkdXAoYXJndltpXSk7Ci0KLQkJaWYgKHB3bGFzdCB8fCAhc3RyY21wKCItcGFzc3dkIiwgYXJndltpXSkKLQkJICAgIHx8ICFzdHJjbXAoIi12aWV3cGFzc3dkIiwgYXJndltpXSkpIHsKLQkJCWNoYXIgKnAgPSBhcmd2W2ldOwkJCi0JCQlpZiAocHdsYXN0KSB7Ci0JCQkJcHdsYXN0ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHdsYXN0ID0gMTsKLQkJCX0KLQkJCXN0cnplcm8ocCk7Ci0JCX0KLQkJaWYgKGVuY2xhc3QgfHwgIXN0cmNtcCgiLWVuYyIsIGFyZ3ZbaV0pKSB7Ci0JCQljaGFyICpxLCAqcCA9IGFyZ3ZbaV07CQkKLQkJCWlmIChlbmNsYXN0KSB7Ci0JCQkJZW5jbGFzdCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWVuY2xhc3QgPSAxOwotCQkJfQotCQkJcSA9IHN0cnN0cihwLCAicHc9Iik7Ci0JCQlpZiAocSkgewotCQkJCXN0cnplcm8ocSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFyZ2MyID49IGFyZ21heCkgewotCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSByY2ZpbGUgb3B0aW9uc1xuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpbW1lZGlhdGVfc3dpdGNoX3VzZXIoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotCWludCBpLCBiZXF1aWV0ID0gMDsKLQlmb3IgKGk9MTsgaSA8IGFyZ2M7IGkrKykgewotCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItaW5ldGQiKSkgewotCQkJYmVxdWlldCA9IDE7Ci0JCX0KLQkJaWYgKHN0cmNtcChhcmd2W2ldLCAiLXF1aWV0IikpIHsKLQkJCWJlcXVpZXQgPSAxOwotCQl9Ci0JCWlmIChzdHJjbXAoYXJndltpXSwgIi1xIikpIHsKLQkJCWJlcXVpZXQgPSAxOwotCQl9Ci0JfQotCWZvciAoaT0xOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWNoYXIgKnUsICpxOwotCi0JCWlmIChzdHJjbXAoYXJndltpXSwgIi11c2VycyIpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoaSA9PSBhcmdjIC0gMSkgewotCQkJZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3I6IC11c2Vyc1xuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWlmICgqKGFyZ3ZbaSsxXSkgIT0gJz0nKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHdhbnRzIGFuIGltbWVkaWF0ZSBzd2l0Y2g6ID1ib2IgKi8KLQkJdSA9IHN0cmR1cChhcmd2W2krMV0pOwotCQkqdSA9ICcrJzsKLQkJcSA9IHN0cmNocih1LCAnLicpOwotCQlpZiAocSkgewotCQkJdXNlcjJncm91cCA9IChjaGFyICoqKSBtYWxsb2MoMipzaXplb2YoY2hhciAqKSk7Ci0JCQl1c2VyMmdyb3VwWzBdID0gc3RyZHVwKHUrMSk7Ci0JCQl1c2VyMmdyb3VwWzFdID0gTlVMTDsKLQkJCSpxID0gJ1wwJzsKLQkJfQotCQlpZiAoc3Ryc3RyKHUsICIrZ3Vlc3MiKSA9PSB1KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdXNlcjogJXNcbiIsIHUrMSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWlmICghc3dpdGNoX3VzZXIodSwgMCkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHN3aXRjaCB0byB1c2VyOiAlc1xuIiwgdSsxKTsKLQkJCWV4aXQoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWJlcXVpZXQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVkIHRvIHVzZXI6ICVzXG4iLCB1KzEpOwotCQkJfQotCQkJc3RhcnRlZF9hc19yb290ID0gMjsKLQkJfQotCQlmcmVlKHUpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHF1aWNrX3B3KGNoYXIgKnN0cikgewotCWNoYXIgKnAsICpxOwotCWNoYXIgdG1wWzEwMjRdOwotCWludCBkYiA9IDA7Ci0KLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicXVpY2tfcHc6ICVzXG4iLCBzdHIpOwotCi0JaWYgKCEgc3RyIHx8IHN0clswXSA9PSAnXDAnKSB7Ci0JCWV4aXQoMik7Ci0JfQotCWlmIChzdHJbMF0gIT0gJyUnKSB7Ci0JCWV4aXQoMik7Ci0JfQotCS8qCi0JICogIiUtIiBvciAiJXN0ZGluIiBtZWFucyByZWFkIG9uZSBsaW5lIGZyb20gc3RkaW4uCi0JICoKLQkgKiAiJWVudiIgbWVhbnMgaXQgaXMgaW4gJFVOSVhQVyBlbnYgdmFyLgotCSAqCi0JICogc3RhcnRpbmcgIiUvIiBvciAiJS4iIG1lYW5zIHJlYWQgdGhlIGZpcnN0IGxpbmUgZnJvbSB0aGF0IGZpbGUuCi0JICoKLQkgKiAiJSUiIG9yICIlIiBtZWFucyBwcm9tcHQgdXNlci4KLQkgKgotCSAqIG90aGVyd2lzZTogJXVzZXI6cGFzcwotCSAqLwotCWlmICghc3RyY21wKHN0ciwgIiUtIikgfHwgIXN0cmNtcChzdHIsICIlc3RkaW4iKSkgewotCQlpZihmZ2V0cyh0bXAsIDEwMjQsIHN0ZGluKSA9PSBOVUxMKSB7Ci0JCQlleGl0KDIpOwotCQl9Ci0JCXEgPSBzdHJkdXAodG1wKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiJWVudiIpKSB7Ci0JCWlmIChnZXRlbnYoIlVOSVhQVyIpID09IE5VTEwpIHsKLQkJCWV4aXQoMik7Ci0JCX0KLQkJcSA9IHN0cmR1cChnZXRlbnYoIlVOSVhQVyIpKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiJSUiKSB8fCAhc3RyY21wKHN0ciwgIiUiKSkgewotCQljaGFyICp0LCBpbnBbMTAyNF07Ci0JCWZwcmludGYoc3Rkb3V0LCAidXNlcm5hbWU6ICIpOwotCQlpZihmZ2V0cyh0bXAsIDEyOCwgc3RkaW4pID09IE5VTEwpIHsKLQkJCWV4aXQoMik7Ci0JCX0KLQkJc3RyY3B5KGlucCwgdG1wKTsKLQkJdCA9IHN0cmNocihpbnAsICdcbicpOwotCQlpZiAodCkgewotCQkJKnQgPSAnOic7IAotCQl9IGVsc2UgewotCQkJc3RyY2F0KGlucCwgIjoiKTsKLQkJCQotCQl9Ci0JCWZwcmludGYoc3Rkb3V0LCAicGFzc3dvcmQ6ICIpOwotCQkvKiB0ZXN0IG1vZGU6IG5vX2V4dGVybmFsX2NtZHMgZG9lcyBub3QgYXBwbHkgKi8KLQkJc3lzdGVtKCJzdHR5IC1lY2hvIik7Ci0JCWlmKGZnZXRzKHRtcCwgMTI4LCBzdGRpbikgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRvdXQsICJcbiIpOwotCQkJc3lzdGVtKCJzdHR5IGVjaG8iKTsKLQkJCWV4aXQoMik7Ci0JCX0KLQkJc3lzdGVtKCJzdHR5IGVjaG8iKTsKLQkJZnByaW50ZihzdGRvdXQsICJcbiIpOwotCQlzdHJjYXQoaW5wLCB0bXApOwotCQlxID0gc3RyZHVwKGlucCk7Ci0JfSBlbHNlIGlmIChzdHJbMV0gPT0gJy8nIHx8IHN0clsxXSA9PSAnLicpIHsKLQkJRklMRSAqaW4gPSBmb3BlbihzdHIrMSwgInIiKTsKLQkJaWYgKGluID09IE5VTEwpIHsKLQkJCWV4aXQoMik7Ci0JCX0KLQkJaWYoZmdldHModG1wLCAxMDI0LCBpbikgPT0gTlVMTCkgewotCQkJZXhpdCgyKTsKLQkJfQotCQlmY2xvc2UoaW4pOwotCQlxID0gc3RyZHVwKHRtcCk7Ci0JfSBlbHNlIHsKLQkJcSA9IHN0cmR1cChzdHIrMSk7Ci0JfQotCXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHEpICsgMTApOwotCXN0cmNweShwLCBxKTsKLQlpZiAoc3RyY2hyKHAsICdcbicpID09IE5VTEwpIHsKLQkJc3RyY2F0KHAsICJcbiIpOwotCX0KLQotCWlmICgocSA9IHN0cmNocihwLCAnOicpKSA9PSBOVUxMKSB7Ci0JCWV4aXQoMik7Ci0JfQotCSpxID0gJ1wwJzsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiJyVzJyAnJXMnXG4iLCBwLCBxKzEpOwotCWlmICh1bml4cHdfY21kKSB7Ci0JCWlmIChjbWRfdmVyaWZ5KHAsIHErMSkpIHsKLQkJCWZwcmludGYoc3Rkb3V0LCAiWSAlc1xuIiwgcCk7Ci0JCQlleGl0KDApOwotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRvdXQsICJOICVzXG4iLCBwKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHVuaXhwd19uaXMpIHsKLQkJaWYgKGNyeXB0X3ZlcmlmeShwLCBxKzEpKSB7Ci0JCQlmcHJpbnRmKHN0ZG91dCwgIlkgJXNcbiIsIHApOwotCQkJZXhpdCgwKTsKLQkJfSBlbHNlIHsKLQkJCWZwcmludGYoc3Rkb3V0LCAiTiAlc1xuIiwgcCk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hhciAqdWNtZCA9IGdldGVudigiVU5JWFBXX0NNRCIpOwotCQlpZiAoc3VfdmVyaWZ5KHAsIHErMSwgdWNtZCwgTlVMTCwgTlVMTCwgMSkpIHsKLQkJCWZwcmludGYoc3Rkb3V0LCAiWSAlc1xuIiwgcCk7Ci0JCQlleGl0KDApOwotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRvdXQsICJOICVzXG4iLCBwKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotCWV4aXQoMik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3NldHRpbmdzKGludCB0cnlfaHR0cCwgaW50IGJnLCBjaGFyICpndWlfc3RyKSB7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJTZXR0aW5nczpcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiIGRpc3BsYXk6ICAgICVzXG4iLCB1c2VfZHB5ID8gdXNlX2RweQotCSAgICA6ICJudWxsIik7Ci0jaWYgU01BTExfRk9PVFBSSU5UIDwgMgotCWZwcmludGYoc3RkZXJyLCAiIGF1dGhmaWxlOiAgICVzXG4iLCBhdXRoX2ZpbGUgPyBhdXRoX2ZpbGUKLQkgICAgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHN1YndpbjogICAgIDB4JWx4XG4iLCBzdWJ3aW4pOwotCWZwcmludGYoc3RkZXJyLCAiIC1zaWQgbW9kZTogICVkXG4iLCByb290c2hpZnQpOwotCWZwcmludGYoc3RkZXJyLCAiIGNsaXA6ICAgICAgICVzXG4iLCBjbGlwX3N0ciA/IGNsaXBfc3RyCi0JICAgIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBmbGFzaGNtYXA6ICAlZFxuIiwgZmxhc2hfY21hcCk7Ci0JZnByaW50ZihzdGRlcnIsICIgc2hpZnRjbWFwOiAgJWRcbiIsIHNoaWZ0X2NtYXApOwotCWZwcmludGYoc3RkZXJyLCAiIGZvcmNlX2lkeDogICVkXG4iLCBmb3JjZV9pbmRleGVkX2NvbG9yKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBjbWFwOHRvMjQ6ICAlZFxuIiwgY21hcDh0bzI0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIiA4dG8yNF9vcHRzOiAlc1xuIiwgY21hcDh0bzI0X3N0ciA/IGNtYXA4dG8yNF9zdHIKLQkgICAgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIDI0dG8zMjogICAgICVkXG4iLCB4Zm9ybTI0dG8zMik7Ci0JZnByaW50ZihzdGRlcnIsICIgdmlzdWFsOiAgICAgJXNcbiIsIHZpc3VhbF9zdHIgPyB2aXN1YWxfc3RyCi0JICAgIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBvdmVybGF5OiAgICAlZFxuIiwgb3ZlcmxheSk7Ci0JZnByaW50ZihzdGRlcnIsICIgb3ZsX2N1cnNvcjogJWRcbiIsIG92ZXJsYXlfY3Vyc29yKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzY2FsaW5nOiAgICAlZCAlLjRmICUuNGZcbiIsIHNjYWxpbmcsIHNjYWxlX2ZhY194LCBzY2FsZV9mYWNfeSk7Ci0JZnByaW50ZihzdGRlcnIsICIgdmlld29ubHk6ICAgJWRcbiIsIHZpZXdfb25seSk7Ci0JZnByaW50ZihzdGRlcnIsICIgc2hhcmVkOiAgICAgJWRcbiIsIHNoYXJlZCk7Ci0JZnByaW50ZihzdGRlcnIsICIgY29ubl9vbmNlOiAgJWRcbiIsIGNvbm5lY3Rfb25jZSk7Ci0JZnByaW50ZihzdGRlcnIsICIgdGltZW91dDogICAgJWRcbiIsIGZpcnN0X2Nvbm5fdGltZW91dCk7Ci0JZnByaW50ZihzdGRlcnIsICIgcGluZzogICAgICAgJWRcbiIsIHBpbmdfaW50ZXJ2YWwpOwotCWZwcmludGYoc3RkZXJyLCAiIGluZXRkOiAgICAgICVkXG4iLCBpbmV0ZCk7Ci0JZnByaW50ZihzdGRlcnIsICIgdGlnaHRmaWxleGZlcjogICAlZFxuIiwgdGlnaHRmaWxleGZlcik7Ci0JZnByaW50ZihzdGRlcnIsICIgaHR0cDogICAgICAgJWRcbiIsIHRyeV9odHRwKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBjb25uZWN0OiAgICAlc1xuIiwgY2xpZW50X2Nvbm5lY3QKLQkgICAgPyBjbGllbnRfY29ubmVjdCA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgY29ubmVjdGZpbGUgJXNcbiIsIGNsaWVudF9jb25uZWN0X2ZpbGUKLQkgICAgPyBjbGllbnRfY29ubmVjdF9maWxlIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiB2bmNfY29ubjogICAlZFxuIiwgdm5jX2Nvbm5lY3QpOwotCWZwcmludGYoc3RkZXJyLCAiIGFsbG93OiAgICAgICVzXG4iLCBhbGxvd19saXN0ID8gYWxsb3dfbGlzdAotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgaW5wdXQ6ICAgICAgJXNcbiIsIGFsbG93ZWRfaW5wdXRfc3RyCi0JICAgID8gYWxsb3dlZF9pbnB1dF9zdHIgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHBhc3NmaWxlOiAgICVzXG4iLCBwYXNzd2RmaWxlID8gcGFzc3dkZmlsZQotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgdW5peHB3OiAgICAgJWRcbiIsIHVuaXhwdyk7Ci0JZnByaW50ZihzdGRlcnIsICIgdW5peHB3X2xzdDogJXNcbiIsIHVuaXhwd19saXN0ID8gdW5peHB3X2xpc3Q6Im51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzc2w6ICAgICAgICAlc1xuIiwgb3BlbnNzbF9wZW0gPyBvcGVuc3NsX3BlbToibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHNzbGRpcjogICAgICVzXG4iLCBzc2xfY2VydHNfZGlyID8gc3NsX2NlcnRzX2RpcjoibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHNzbHRpbWVvdXQgICVkXG4iLCBzc2xfdGltZW91dF9zZWNzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzc2x2ZXJpZnk6ICAlc1xuIiwgc3NsX3ZlcmlmeSA/IHNzbF92ZXJpZnk6Im51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzdHVubmVsOiAgICAlZFxuIiwgdXNlX3N0dW5uZWwpOwotCWZwcmludGYoc3RkZXJyLCAiIGFjY2VwdDogICAgICVzXG4iLCBhY2NlcHRfY21kID8gYWNjZXB0X2NtZAotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgYWNjZXB0OiAgICAgJXNcbiIsIGFmdGVyYWNjZXB0X2NtZCA/IGFmdGVyYWNjZXB0X2NtZAotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgZ29uZTogICAgICAgJXNcbiIsIGdvbmVfY21kID8gZ29uZV9jbWQKLQkgICAgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHVzZXJzOiAgICAgICVzXG4iLCB1c2Vyc19saXN0ID8gdXNlcnNfbGlzdAotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgdXNpbmdfc2htOiAgJWRcbiIsIHVzaW5nX3NobSk7Ci0JZnByaW50ZihzdGRlcnIsICIgZmxpcGJ5dGVzOiAgJWRcbiIsIGZsaXBfYnl0ZV9vcmRlcik7Ci0JZnByaW50ZihzdGRlcnIsICIgb25ldGlsZTogICAgJWRcbiIsIHNpbmdsZV9jb3B5dGlsZSk7Ci0JZnByaW50ZihzdGRlcnIsICIgc29saWQ6ICAgICAgJXNcbiIsIHNvbGlkX3N0cgotCSAgICA/IHNvbGlkX3N0ciA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgYmxhY2tvdXQ6ICAgJXNcbiIsIGJsYWNrb3V0X3N0cgotCSAgICA/IGJsYWNrb3V0X3N0ciA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgeGluZXJhbWE6ICAgJWRcbiIsIHhpbmVyYW1hKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiB4dHJhcDogICAgICAlZFxuIiwgeHRyYXBfaW5wdXQpOwotCWZwcmludGYoc3RkZXJyLCAiIHhyYW5kcjogICAgICVkXG4iLCB4cmFuZHIpOwotCWZwcmludGYoc3RkZXJyLCAiIHhyYW5kcm1vZGU6ICVzXG4iLCB4cmFuZHJfbW9kZSA/IHhyYW5kcl9tb2RlCi0JICAgIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBwYWRnZW9tOiAgICAlc1xuIiwgcGFkX2dlb21ldHJ5Ci0JICAgID8gcGFkX2dlb21ldHJ5IDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBsb2dmaWxlOiAgICAlc1xuIiwgbG9nZmlsZSA/IGxvZ2ZpbGUKLQkgICAgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIGxvZ2FwcGVuZDogICVkXG4iLCBsb2dmaWxlX2FwcGVuZCk7Ci0JZnByaW50ZihzdGRlcnIsICIgZmxhZzogICAgICAgJXNcbiIsIGZsYWdmaWxlID8gZmxhZ2ZpbGUKLQkgICAgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHJtX2ZsYWc6ICAgICVzXG4iLCBybV9mbGFnZmlsZSA/IHJtX2ZsYWdmaWxlCi0JICAgIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiByY19maWxlOiAgICBcIiVzXCJcbiIsIHJjX3JjZmlsZSA/IHJjX3JjZmlsZQotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgbm9yYzogICAgICAgJWRcbiIsIHJjX25vcmMpOwotCWZwcmludGYoc3RkZXJyLCAiIGRiZzogICAgICAgICVkXG4iLCBjcmFzaF9kZWJ1Zyk7Ci0JZnByaW50ZihzdGRlcnIsICIgYmc6ICAgICAgICAgJWRcbiIsIGJnKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBtb2RfdHdlYWs6ICAlZFxuIiwgdXNlX21vZGlmaWVyX3R3ZWFrKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBpc29sZXZlbDM6ICAlZFxuIiwgdXNlX2lzb19sZXZlbDMpOwotCWZwcmludGYoc3RkZXJyLCAiIHhrYjogICAgICAgICVkXG4iLCB1c2VfeGtiX21vZHR3ZWFrKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBza2lwa2V5czogICAlc1xuIiwKLQkgICAgc2tpcF9rZXljb2RlcyA/IHNraXBfa2V5Y29kZXMgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHNsb3BweWtleXM6ICVkXG4iLCBzbG9wcHlfa2V5cyk7Ci0JZnByaW50ZihzdGRlcnIsICIgc2tpcF9kdXBzOiAgJWRcbiIsIHNraXBfZHVwbGljYXRlX2tleV9ldmVudHMpOwotCWZwcmludGYoc3RkZXJyLCAiIGFkZGtleXN5bXM6ICVkXG4iLCBhZGRfa2V5c3ltcyk7Ci0JZnByaW50ZihzdGRlcnIsICIgeGtiY29tcGF0OiAgJWRcbiIsIHhrYmNvbXBhdCk7Ci0JZnByaW50ZihzdGRlcnIsICIgY2xlYXJtb2RzOiAgJWRcbiIsIGNsZWFyX21vZHMpOwotCWZwcmludGYoc3RkZXJyLCAiIHJlbWFwOiAgICAgICVzXG4iLCByZW1hcF9maWxlID8gcmVtYXBfZmlsZQotCSAgICA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgbm9yZXBlYXQ6ICAgJWRcbiIsIG5vX2F1dG9yZXBlYXQpOwotCWZwcmludGYoc3RkZXJyLCAiIG5vcmVwZWF0Y250OiVkXG4iLCBub19yZXBlYXRfY291bnRkb3duKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBub2ZiOiAgICAgICAlZFxuIiwgbm9mYik7Ci0JZnByaW50ZihzdGRlcnIsICIgd2F0Y2hiZWxsOiAgJWRcbiIsIHdhdGNoX2JlbGwpOwotCWZwcmludGYoc3RkZXJyLCAiIHdhdGNoc2VsOiAgICVkXG4iLCB3YXRjaF9zZWxlY3Rpb24pOwotCWZwcmludGYoc3RkZXJyLCAiIHdhdGNocHJpbTogICVkXG4iLCB3YXRjaF9wcmltYXJ5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzZWxkaXI6ICAgICAlc1xuIiwgc2VsX2RpcmVjdGlvbiA/Ci0JICAgIHNlbF9kaXJlY3Rpb24gOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIGN1cnNvcjogICAgICVkXG4iLCBzaG93X2N1cnNvcik7Ci0JZnByaW50ZihzdGRlcnIsICIgbXVsdGljdXJzOiAgJWRcbiIsIHNob3dfbXVsdGlwbGVfY3Vyc29ycyk7Ci0JZnByaW50ZihzdGRlcnIsICIgY3Vyc19tb2RlOiAgJXNcbiIsIG11bHRpcGxlX2N1cnNvcnNfbW9kZQotCSAgICA/IG11bHRpcGxlX2N1cnNvcnNfbW9kZSA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgYXJyb3c6ICAgICAgJWRcbiIsIGFsdF9hcnJvdyk7Ci0JZnByaW50ZihzdGRlcnIsICIgeGZpeGVzOiAgICAgJWRcbiIsIHVzZV94Zml4ZXMpOwotCWZwcmludGYoc3RkZXJyLCAiIGFscGhhY3V0OiAgICVkXG4iLCBhbHBoYV90aHJlc2hvbGQpOwotCWZwcmludGYoc3RkZXJyLCAiIGFscGhhZnJhYzogICUuMmZcbiIsIGFscGhhX2ZyYWMpOwotCWZwcmludGYoc3RkZXJyLCAiIGFscGhhcmVtb3ZlOiVkXG4iLCBhbHBoYV9yZW1vdmUpOwotCWZwcmludGYoc3RkZXJyLCAiIGFscGhhYmxlbmQ6ICVkXG4iLCBhbHBoYV9ibGVuZCk7Ci0JZnByaW50ZihzdGRlcnIsICIgY3Vyc29yc2hhcGU6JWRcbiIsIGN1cnNvcl9zaGFwZV91cGRhdGVzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBjdXJzb3Jwb3M6ICAlZFxuIiwgY3Vyc29yX3Bvc191cGRhdGVzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiB4d2FycHB0cjogICAlZFxuIiwgdXNlX3h3YXJwcG9pbnRlcik7Ci0JZnByaW50ZihzdGRlcnIsICIgYWx3YXlzaW5qOiAgJWRcbiIsIGFsd2F5c19pbmplY3QpOwotCWZwcmludGYoc3RkZXJyLCAiIGJ1dHRvbm1hcDogICVzXG4iLCBwb2ludGVyX3JlbWFwCi0JICAgID8gcG9pbnRlcl9yZW1hcCA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgZHJhZ2dpbmc6ICAgJWRcbiIsIHNob3dfZHJhZ2dpbmcpOwotCWZwcmludGYoc3RkZXJyLCAiIG5jYWNoZTogICAgICVkXG4iLCBuY2FjaGUpOwotCWZwcmludGYoc3RkZXJyLCAiIHdpcmVmcmFtZTogICVzXG4iLCB3aXJlZnJhbWVfc3RyID8KLQkgICAgd2lyZWZyYW1lX3N0ciA6IFdJUkVGUkFNRV9QQVJNUyk7Ci0JZnByaW50ZihzdGRlcnIsICIgd2lyZWNvcHk6ICAgJXNcbiIsIHdpcmVmcmFtZV9jb3B5cmVjdCA/Ci0JICAgIHdpcmVmcmFtZV9jb3B5cmVjdCA6IHdpcmVmcmFtZV9jb3B5cmVjdF9kZWZhdWx0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzY3JvbGxjb3B5OiAlc1xuIiwgc2Nyb2xsX2NvcHlyZWN0ID8KLQkgICAgc2Nyb2xsX2NvcHlyZWN0IDogc2Nyb2xsX2NvcHlyZWN0X2RlZmF1bHQpOwotCWZwcmludGYoc3RkZXJyLCAiICBzY3JfYXJlYTogICVkXG4iLCBzY3JvbGxjb3B5cmVjdF9taW5fYXJlYSk7Ci0JZnByaW50ZihzdGRlcnIsICIgIHNjcl9za2lwOiAgJXNcbiIsIHNjcm9sbF9za2lwX3N0ciA/Ci0JICAgIHNjcm9sbF9za2lwX3N0ciA6IHNjcm9sbF9za2lwX3N0cjApOwotCWZwcmludGYoc3RkZXJyLCAiICBzY3JfaW5jOiAgICVzXG4iLCBzY3JvbGxfZ29vZF9zdHIgPwotCSAgICBzY3JvbGxfZ29vZF9zdHIgOiBzY3JvbGxfZ29vZF9zdHIwKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgc2NyX2tleXM6ICAlc1xuIiwgc2Nyb2xsX2tleV9saXN0X3N0ciA/Ci0JICAgIHNjcm9sbF9rZXlfbGlzdF9zdHIgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiICBzY3JfdGVybTogICVzXG4iLCBzY3JvbGxfdGVybV9zdHIgPwotCSAgICBzY3JvbGxfdGVybV9zdHIgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiICBzY3Jfa2V5cmVwOiAlc1xuIiwgbWF4X2tleXJlcGVhdF9zdHIgPwotCSAgICBtYXhfa2V5cmVwZWF0X3N0ciA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIHNjcl9wYXJtczogJXNcbiIsIHNjcm9sbF9jb3B5cmVjdF9zdHIgPwotCSAgICBzY3JvbGxfY29weXJlY3Rfc3RyIDogU0NST0xMX0NPUFlSRUNUX1BBUk1TKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBmaXhzY3JlZW46ICAlc1xuIiwgc2NyZWVuX2ZpeHVwX3N0ciA/Ci0JICAgIHNjcmVlbl9maXh1cF9zdHIgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIG5veHJlY29yZDogICVkXG4iLCBub3hyZWNvcmQpOwotCWZwcmludGYoc3RkZXJyLCAiIGdyYWJidXN0ZXI6ICVkXG4iLCBncmFiX2J1c3Rlcik7Ci0JZnByaW50ZihzdGRlcnIsICIgcHRyX21vZGU6ICAgJWRcbiIsIHBvaW50ZXJfbW9kZSk7Ci0JZnByaW50ZihzdGRlcnIsICIgaW5wdXRza2lwOiAgJWRcbiIsIHVpX3NraXApOwotCWZwcmludGYoc3RkZXJyLCAiIHNwZWVkczogICAgICVzXG4iLCBzcGVlZHNfc3RyCi0JICAgID8gc3BlZWRzX3N0ciA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgd21kdDogICAgICAgJXNcbiIsIHdtZHRfc3RyCi0JICAgID8gd21kdF9zdHIgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIGRlYnVnX3B0cjogICVkXG4iLCBkZWJ1Z19wb2ludGVyKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBkZWJ1Z19rZXk6ICAlZFxuIiwgZGVidWdfa2V5Ym9hcmQpOwotCWZwcmludGYoc3RkZXJyLCAiIGRlZmVyOiAgICAgICVkXG4iLCBkZWZlcl91cGRhdGUpOwotCWZwcmludGYoc3RkZXJyLCAiIHdhaXRtczogICAgICVkXG4iLCB3YWl0bXMpOwotCWZwcmludGYoc3RkZXJyLCAiIHdhaXRfdWk6ICAgICUuMmZcbiIsIHdhaXRfdWkpOwotCWZwcmludGYoc3RkZXJyLCAiIG5vd2FpdF9ib2c6ICVkXG4iLCAhd2FpdF9ib2cpOwotCWZwcmludGYoc3RkZXJyLCAiIHNsb3dfZmI6ICAgICUuMmZcbiIsIHNsb3dfZmIpOwotCWZwcmludGYoc3RkZXJyLCAiIHhyZWZyZXNoOiAgICUuMmZcbiIsIHhyZWZyZXNoKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiByZWFkdGltZW91dDogJWRcbiIsIHJmYk1heENsaWVudFdhaXQvMTAwMCk7Ci0JZnByaW50ZihzdGRlcnIsICIgdGFrZV9uYXBzOiAgJWRcbiIsIHRha2VfbmFwcyk7Ci0JZnByaW50ZihzdGRlcnIsICIgc2I6ICAgICAgICAgJWRcbiIsIHNjcmVlbl9ibGFuayk7Ci0JZnByaW50ZihzdGRlcnIsICIgZmJwbTogICAgICAgJWRcbiIsICF3YXRjaF9mYnBtKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBkcG1zOiAgICAgICAlZFxuIiwgIXdhdGNoX2RwbXMpOwotCWZwcmludGYoc3RkZXJyLCAiIHhkYW1hZ2U6ICAgICVkXG4iLCB1c2VfeGRhbWFnZSk7Ci0JZnByaW50ZihzdGRlcnIsICIgIHhkX2FyZWE6ICAgJWRcbiIsIHhkYW1hZ2VfbWF4X2FyZWEpOwotCWZwcmludGYoc3RkZXJyLCAiICB4ZF9tZW06ICAgICUuM2ZcbiIsIHhkYW1hZ2VfbWVtb3J5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBzaWdwaXBlOiAgICAlc1xuIiwgc2lncGlwZQotCSAgICA/IHNpZ3BpcGUgOiAibnVsbCIpOwotCWZwcmludGYoc3RkZXJyLCAiIHRocmVhZHM6ICAgICVkXG4iLCB1c2VfdGhyZWFkcyk7Ci0JZnByaW50ZihzdGRlcnIsICIgZnNfZnJhYzogICAgJS4yZlxuIiwgZnNfZnJhYyk7Ci0JZnByaW50ZihzdGRlcnIsICIgZ2Fwc19maWxsOiAgJWRcbiIsIGdhcHNfZmlsbCk7Ci0JZnByaW50ZihzdGRlcnIsICIgZ3Jvd19maWxsOiAgJWRcbiIsIGdyb3dfZmlsbCk7Ci0JZnByaW50ZihzdGRlcnIsICIgdGlsZV9mdXp6OiAgJWRcbiIsIHRpbGVfZnV6eik7Ci0JZnByaW50ZihzdGRlcnIsICIgc25hcGZiOiAgICAgJWRcbiIsIHVzZV9zbmFwZmIpOwotCWZwcmludGYoc3RkZXJyLCAiIHJhd2ZiOiAgICAgICVzXG4iLCByYXdfZmJfc3RyCi0JICAgID8gcmF3X2ZiX3N0ciA6ICJudWxsIik7Ci0JZnByaW50ZihzdGRlcnIsICIgcGlwZWlucHV0OiAgJXNcbiIsIHBpcGVpbnB1dF9zdHIKLQkgICAgPyBwaXBlaW5wdXRfc3RyIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBndWk6ICAgICAgICAlZFxuIiwgbGF1bmNoX2d1aSk7Ci0JZnByaW50ZihzdGRlcnIsICIgZ3VpX21vZGU6ICAgJXNcbiIsIGd1aV9zdHIKLQkgICAgPyBndWlfc3RyIDogIm51bGwiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBub3JlbW90ZTogICAlZFxuIiwgIWFjY2VwdF9yZW1vdGVfY21kcyk7Ci0JZnByaW50ZihzdGRlcnIsICIgdW5zYWZlOiAgICAgJWRcbiIsICFzYWZlX3JlbW90ZV9vbmx5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBwcml2cmVtb3RlOiAlZFxuIiwgcHJpdl9yZW1vdGUpOwotCWZwcmludGYoc3RkZXJyLCAiIHNhZmVyOiAgICAgICVkXG4iLCBtb3JlX3NhZmUpOwotCWZwcmludGYoc3RkZXJyLCAiIG5vY21kczogICAgICVkXG4iLCBub19leHRlcm5hbF9jbWRzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiBkZW55X2FsbDogICAlZFxuIiwgZGVueV9hbGwpOwotCWZwcmludGYoc3RkZXJyLCAiIHBpZDogICAgICAgICVkXG4iLCBnZXRwaWQoKSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHZvaWQgY2hlY2tfbG9vcF9tb2RlKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGludCBmb3JjZSkgewotCWludCBpOwotCWludCBsb29wX21vZGUgPSAwLCBsb29wX3NsZWVwID0gMjAwMCwgbG9vcF9tYXggPSAwOwotCi0JaWYgKGZvcmNlKSB7Ci0JCWxvb3BfbW9kZSA9IDE7Ci0JfQotCWZvciAoaT0xOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWNoYXIgKnAgPSBhcmd2W2ldOwotCQlpZiAoc3Ryc3RyKHAsICItLSIpID09IHApIHsKLQkJCXArKzsKLQkJfQotCQlpZiAoc3Ryc3RyKHAsICItbG9vcCIpID09IHApIHsKLQkJCWNoYXIgKnE7Ci0JCQlsb29wX21vZGUgPSAxOwotCQkJaWYgKChxID0gc3RyY2hyKHAsICcsJykpICE9IE5VTEwpIHsKLQkJCQlsb29wX21heCA9IGF0b2kocSsxKTsKLQkJCQkqcSA9ICdcMCc7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKHAsICItbG9vcGJnIikgPT0gcCkgewotCQkJCXNldF9lbnYoIlgxMVZOQ19MT09QX01PREVfQkciLCAiMSIpOwotCQkJCWxvb3Bfc2xlZXAgPSA1MDA7Ci0JCQl9Ci0JCQkKLQkJCXEgPSBzdHJwYnJrKHAsICIwMTIzNDU2Nzg5Iik7Ci0JCQlpZiAocSkgewotCQkJCWxvb3Bfc2xlZXAgPSBhdG9pKHEpOwotCQkJCWlmIChsb29wX3NsZWVwIDw9IDApIHsKLQkJCQkJbG9vcF9zbGVlcCA9IDIwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAobG9vcF9tb2RlICYmIGdldGVudigiWDExVk5DX0xPT1BfTU9ERSIpID09IE5VTEwpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JCWNoYXIgKiphcmd2MjsKLQkJaW50IGssIGkgPSAxOwotCi0JCXNldF9lbnYoIlgxMVZOQ19MT09QX01PREUiLCAiMSIpOwotCQlhcmd2MiA9IChjaGFyICoqKSBtYWxsb2MoKGFyZ2MrMSkqc2l6ZW9mKGNoYXIgKikpOwotCi0JCWZvciAoaz0wOyBrIDwgYXJnYysxOyBrKyspIHsKLQkJCWFyZ3YyW2tdID0gTlVMTDsKLQkJCWlmIChrIDwgYXJnYykgewotCQkJCWFyZ3YyW2tdID0gYXJndltrXTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoMSkgewotCQkJaW50IHN0YXR1czsKLQkJCXBpZF90IHA7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIC0tLSB4MTF2bmMgbG9vcDogJWQgLS0tXG5cbiIsIGkrKyk7Ci0JCQlmZmx1c2goc3RkZXJyKTsKLQkJCXVzbGVlcCg1MDAgKiAxMDAwKTsKLQkJCWlmICgocCA9IGZvcmsoKSkgPiAwKSAgewotCQkJCWZwcmludGYoc3RkZXJyLCAiIC0tLSB4MTF2bmMgbG9vcDogd2FpdGluZyAiCi0JCQkJICAgICJmb3I6ICVkXG5cbiIsIHApOwotCQkJCXdhaXQoJnN0YXR1cyk7Ci0JCQl9IGVsc2UgaWYgKHAgPT0gLTEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmb3JrXG4iKTsKLQkJCQlwZXJyb3IoImZvcmsiKTsKLQkJCQlleGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBsb29wIG1vZGU6IG5vX2V4dGVybmFsX2NtZHMgZG9lcyBub3QgYXBwbHkgKi8KLQkJCQlleGVjdnAoYXJndlswXSwgYXJndjIpOyAKLQkJCQlleGl0KDEpOwotCQkJfQotCi0JCQlpZiAobG9vcF9tYXggPiAwICYmIGkgPiBsb29wX21heCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4gLS0tIHgxMXZuYyBsb29wOiBkaWQgJWQiCi0JCQkJICAgICIgZG9uZS4gLS0tXG5cbiIsIGxvb3BfbWF4KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJZnByaW50ZihzdGRlcnIsICJcbiAtLS0geDExdm5jIGxvb3A6IHNsZWVwaW5nICVkIG1zICIKLQkJCSAgICAiLS0tXG5cbiIsIGxvb3Bfc2xlZXApOwotCQkJdXNsZWVwKGxvb3Bfc2xlZXAgKiAxMDAwKTsKLQkJfQotCQlleGl0KDApOwotI2Vsc2UKLQkJZnByaW50ZihzdGRlcnIsICJmb3JrIHVuYXZhaWxhYmxlLCBjYW5ub3QgZG8gLWxvb3AgbW9kZVxuIik7Ci0JCWV4aXQoMSk7Ci0jZW5kaWYKLQl9Ci19Ci0KLWV4dGVybiBpbnQgYXBwc2hhcmVfbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKTsKLQotc3RhdGljIHZvaWQgY2hlY2tfYXBwc2hhcmVfbW9kZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MTsgaSA8IGFyZ2M7IGkrKykgewotCQljaGFyICpwID0gYXJndltpXTsKLQkJaWYgKHN0cnN0cihwLCAiLS0iKSA9PSBwKSB7Ci0JCQlwKys7Ci0JCX0KLQkJaWYgKHN0cnN0cihwLCAiLWFwcHNoYXJlIikgPT0gcCkgewotCQkJYXBwc2hhcmVfbWFpbihhcmdjLCBhcmd2KTsKLQkJCWV4aXQoMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3JlX2hvbWVkaXJfcGFzc3dkKGNoYXIgKmZpbGUpIHsKLQljaGFyIHN0cjFbMzJdLCBzdHIyWzMyXSwgKnAsICpoLCAqZjsKLQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0Jc3RyMVswXSA9ICdcMCc7Ci0Jc3RyMlswXSA9ICdcMCc7Ci0KLQkvKiBzdG9yZXBhc3N3ZCAqLwotCWlmIChub19leHRlcm5hbF9jbWRzIHx8ICFjbWRfb2soInN0b3JlcGFzc3dkIikpIHsKLQkJZnByaW50ZihzdGRlcnIsICItbm9jbWRzIGNhbm5vdCBiZSB1c2VkIHdpdGggLXN0b3JlcGFzc3dkXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIkVudGVyIFZOQyBwYXNzd29yZDogIik7Ci0Jc3lzdGVtKCJzdHR5IC1lY2hvIik7Ci0JaWYgKGZnZXRzKHN0cjEsIDMyLCBzdGRpbikgPT0gTlVMTCkgewotCQlwZXJyb3IoImZnZXRzIik7Ci0JCXN5c3RlbSgic3R0eSBlY2hvIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQotCWZwcmludGYoc3RkZXJyLCAiVmVyaWZ5IHBhc3N3b3JkOiAgICAiKTsKLQlpZiAoZmdldHMoc3RyMiwgMzIsIHN0ZGluKSA9PSBOVUxMKSB7Ci0JCXBlcnJvcigiZmdldHMiKTsKLQkJc3lzdGVtKCJzdHR5IGVjaG8iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXN5c3RlbSgic3R0eSBlY2hvIik7Ci0KLQlpZiAoKHAgPSBzdHJjaHIoc3RyMSwgJ1xuJykpICE9IE5VTEwpIHsKLQkJKnAgPSAnXDAnOwotCX0KLQlpZiAoKHAgPSBzdHJjaHIoc3RyMiwgJ1xuJykpICE9IE5VTEwpIHsKLQkJKnAgPSAnXDAnOwotCX0KLQlpZiAoc3RyY21wKHN0cjEsIHN0cjIpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiKiogcGFzc3dvcmRzIGRpZmZlci5cbiIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoc3RyMVswXSA9PSAnXDAnKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiKiogbm8gcGFzc3dvcmQgc3VwcGxpZWQuXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAoZmlsZSAhPSBOVUxMKSB7Ci0JCWYgPSBmaWxlOwotCX0gZWxzZSB7Ci0JCQotCQloID0gZ2V0ZW52KCJIT01FIik7Ci0JCWlmICghIGgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiKiogJEhPTUUgbm90IHNldC5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCWYgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGgpICsgc3RybGVuKCIvLnZuYy9wYXNzd2QiKSArIDEpOwotCQlzcHJpbnRmKGYsICIlcy8udm5jIiwgaCk7Ci0KLQkJaWYgKHN0YXQoZiwgJnNidWYpICE9IDApIHsKLQkJCWlmIChta2RpcihmLCAwNzU1KSAhPSAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIqKiBjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIiwgZik7Ci0JCQkJcGVycm9yKCJta2RpciIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoISBTX0lTRElSKHNidWYuc3RfbW9kZSkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiKiogbm90IGEgZGlyZWN0b3J5ICVzXG4iLCBmKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQotCQlzcHJpbnRmKGYsICIlcy8udm5jL3Bhc3N3ZCIsIGgpOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgIldyaXRlIHBhc3N3b3JkIHRvICVzPyAgW3ldL24gIiwgZik7Ci0KLQlpZiAoZmdldHMoc3RyMiwgMzIsIHN0ZGluKSA9PSBOVUxMKSB7Ci0JCXBlcnJvcigiZmdldHMiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKHN0cjJbMF0gPT0gJ24nIHx8IHN0cjJbMF0gPT0gJ04nKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm90IGNyZWF0aW5nIHBhc3N3b3JkLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JaWYgKHJmYkVuY3J5cHRBbmRTdG9yZVBhc3N3ZChzdHIxLCBmKSAhPSAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiKiogZXJyb3IgY3JlYXRpbmcgcGFzc3dvcmQ6ICVzXG4iLCBmKTsKLQkJcGVycm9yKCJzdG9yZXBhc3N3ZCIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoc3RhdChmLCAmc2J1ZikgIT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIioqIGVycm9yIGNyZWF0aW5nIHBhc3N3b3JkOiAlc1xuIiwgZik7Ci0JCXBlcnJvcigic3RhdCIpOwotCQlleGl0KDEpOwotCX0KLQlmcHJpbnRmKHN0ZG91dCwgIlBhc3N3b3JkIHdyaXR0ZW4gdG86ICVzXG4iLCBmKTsKLQlleGl0KDApOwotfQotCi12b2lkIG5jYWNoZV9iZXRhX3Rlc3Rlcl9tZXNzYWdlKHZvaWQpIHsKLQotY2hhciBtc2dbXSA9IAotIlxuIgotIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIgotIlxuIgotIkhlbGxvISAgRXhjaXRpbmcgTmV3cyEhXG4iCi0iXG4iCi0iWW91IGhhdmUgYmVlbiBzZWxlY3RlZCBhdCByYW5kb20gdG8gYmV0YS10ZXN0IHRoZSB4MTF2bmMgJy1uY2FjaGUnIFZOQ1xuIgotImNsaWVudC1zaWRlIHBpeGVsIGNhY2hpbmcgZmVhdHVyZSFcbiIKLSJcbiIKLSJUaGlzIHNjaGVtZSBzdG9yZXMgcGl4ZWwgZGF0YSBvZmZzY3JlZW4gb24gdGhlIFZOQyB2aWV3ZXIgc2lkZSBmb3IgZmFzdGVyXG4iCi0icmV0cmlldmFsLiAgSXQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgVk5DIHZpZXdlci5cbiIKLSJcbiIKLSJUaGlzIG1ldGhvZCByZXF1aXJlcyBtdWNoIHRlc3RpbmcgYW5kIHNvIHdlIGhvcGUgeW91IHdpbGwgdHJ5IGl0IG91dCBhbmRcbiIKLSJwZXJoYXBzIGV2ZW4gcmVwb3J0IGJhY2sgeW91ciBvYnNlcnZhdGlvbnMuICBIb3dldmVyLCBpZiB5b3UgZG8gbm90IHdhbnRcbiIKLSJ0byB0ZXN0IG9yIHVzZSB0aGUgZmVhdHVyZSwgcnVuIHgxMXZuYyBsaWtlIHRoaXM6XG4iCi0iXG4iCi0iICAgIHgxMXZuYyAtbm9uY2FjaGUgLi4uXG4iCi0iXG4iCi0iWW91ciBjdXJyZW50IHNldHRpbmcgaXM6IC1uY2FjaGUgJWRcbiIKLSJcbiIKLSJUaGUgZmVhdHVyZSBuZWVkcyBhZGRpdGlvbmFsIHRlc3RpbmcgYmVjYXVzZSB3ZSB3YW50IHRvIGhhdmUgeDExdm5jXG4iCi0icGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIG9uIGJ5IGRlZmF1bHQuICBPdGhlcndpc2UsIG9ubHkgYSByZWxhdGl2ZSBmZXdcbiIKLSJ3b3VsZCBub3RpY2UgYW5kIHVzZSB0aGUgLW5jYWNoZSBvcHRpb24gKGUuZy4gdGhlIHdpcmVmcmFtZSBhbmQgc2Nyb2xsXG4iCi0iZGV0ZWN0aW9uIGZlYXR1cmVzIGFyZSBvbiBieSBkZWZhdWx0KS4gIEEgY291cGxlIHRoaW5ncyB0byBub3RlOlxuIgotIlxuIgotIiAgICAxKSBJdCB1c2VzIGEgbGFyZ2UgYW1vdW50IG9mIFJBTSAob24gYm90aCB2aWV3ZXIgYW5kIHNlcnZlciBzaWRlcylcbiIKLSJcbiIKLSIgICAgMikgWW91IGNhbiBhY3R1YWxseSBzZWUgdGhlIGNhY2hlZCBwaXhlbCBkYXRhIGlmIHlvdSBzY3JvbGwgZG93blxuIgotIiAgICAgICB0byBpdCBpbiB5b3VyIHZpZXdlcjsgYWRqdXN0IHlvdXIgdmlld2VyJ3Mgc2l6ZSB0byBoaWRlIGl0LlxuIgotIlxuIgotIk1vcmUgaW5mbzogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbCNmYXEtY2xpZW50LWNhY2hpbmdcbiIKLSJcbiIKLSJ3YWl0aW5nIGZvciBjb25uZWN0aW9uczpcbiIKLTsKLQotY2hhciBtc2cyW10gPSAKLSJcbiIKLSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIKLSJIYXZlIHlvdSB0cmllZCB0aGUgeDExdm5jICctbmNhY2hlJyBWTkMgY2xpZW50LXNpZGUgcGl4ZWwgY2FjaGluZyBmZWF0dXJlIHlldD9cbiIKLSJcbiIKLSJUaGUgc2NoZW1lIHN0b3JlcyBwaXhlbCBkYXRhIG9mZnNjcmVlbiBvbiB0aGUgVk5DIHZpZXdlciBzaWRlIGZvciBmYXN0ZXJcbiIKLSJyZXRyaWV2YWwuICBJdCBzaG91bGQgd29yayB3aXRoIGFueSBWTkMgdmlld2VyLiAgVHJ5IGl0IGJ5IHJ1bm5pbmc6XG4iCi0iXG4iCi0iICAgIHgxMXZuYyAtbmNhY2hlIDEwIC4uLlxuIgotIlxuIgotIk9uZSBjYW4gYWxzbyBhZGQgLW5jYWNoZV9jciBmb3Igc21vb3RoICdjb3B5cmVjdCcgd2luZG93IG1vdGlvbi5cbiIKLSJNb3JlIGluZm86IGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWNsaWVudC1jYWNoaW5nXG4iCi0iXG4iCi07Ci0KLQlpZiAocmF3X2ZiX3N0ciAmJiAhbWFjb3N4X2NvbnNvbGUpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAocXVpZXQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVtb3RlX2RpcmVjdCkgewotCQlyZXR1cm47Ci0JfQotCWlmIChub2ZiKSB7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgTk9fTkNBQ0hFCi0JcmV0dXJuOwotI2VuZGlmCi0KLQlpZiAobmNhY2hlID09IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICIlcyIsIG1zZzIpOwotCQluY2FjaGUwID0gbmNhY2hlID0gMDsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgbXNnLCBuY2FjaGUpOwotCX0KLX0KLQotI2RlZmluZQlTSE9XX05PX1BBU1NXT1JEX1dBUk5JTkcgXAotCSghZ290X3Bhc3N3ZCAmJiAhZ290X3JmYmF1dGggJiYgKCFnb3RfcGFzc3dkZmlsZSB8fCAhcGFzc3dkX2xpc3QpIFwKLQkgICAgJiYgIXF1ZXJ5X2NtZCAmJiAhcmVtb3RlX2NtZCAmJiAhdW5peHB3ICYmICFnb3RfZ3VpX3B3IFwKLQkgICAgJiYgISBzc2xfdmVyaWZ5ICYmICFpbmV0ZCAmJiAhdGVybWluYWxfc2VydmljZXNfZGFlbW9uKQotCi1zdGF0aWMgdm9pZCBkb19zbGVlcGluKGNoYXIgKnNsZWVwKSB7Ci0JaW50IG4xLCBuMiwgbnQ7Ci0JZG91YmxlIGYxLCBmMiwgZnQ7Ci0KLQlpZiAoc3RyY2hyKHNsZWVwLCAnLScpKSB7Ci0JCWRvdWJsZSBzID0gYXRvZihzdHJjaHIoc2xlZXAsICctJykrMSk7IAotCQlpZiAoc3NjYW5mKHNsZWVwLCAiJWQtJWQiLCAmbjEsICZuMikgPT0gMikgewotCQkJaWYgKG4xID4gbjIpIHsKLQkJCQludCA9IG4xOwotCQkJCW4xID0gbjI7Ci0JCQkJbjIgPSBudDsKLQkJCX0KLQkJCXMgPSBuMSArIHJmYWMoKSAqIChuMiAtIG4xKTsKLQkJfSBlbHNlIGlmIChzc2NhbmYoc2xlZXAsICIlbGYtJWxmIiwgJmYxLCAmZjIpID09IDIpIHsKLQkJCWlmIChmMSA+IGYyKSB7Ci0JCQkJZnQgPSBmMTsKLQkJCQlmMSA9IGYyOwotCQkJCWYyID0gZnQ7Ci0JCQl9Ci0JCQlzID0gZjEgKyByZmFjKCkgKiAoZjIgLSBmMSk7Ci0JCX0KLQkJaWYgKGdldGVudigiREVCVUdfU0xFRVBJTiIpKSBmcHJpbnRmKHN0ZGVyciwgInNsZWVwaW46ICVmIHNlY3NcbiIsIHMpOwotCQl1c2xlZXAoIChpbnQpICgxMDAwKjEwMDAqcykgKTsKLQl9IGVsc2UgewotCQluMSA9IGF0b2koc2xlZXApOwotCQlpZiAoZ2V0ZW52KCJERUJVR19TTEVFUElOIikpIGZwcmludGYoc3RkZXJyLCAic2xlZXBpbjogJWQgc2Vjc1xuIiwgbjEpOwotCQlpZiAobjEgPiAwKSB7Ci0JCQl1c2xlZXAoMTAwMCoxMDAwKm4xKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfZ3Vlc3NfYXV0aF9maWxlKHZvaWQpICB7Ci0JaWYgKCFzdHJjYXNlY21wKGF1dGhfZmlsZSwgImd1ZXNzIikpIHsKLQkJY2hhciBsaW5lWzQwOTZdLCAqY21kLCAqcSwgKmRpc3AgPSB1c2VfZHB5ID8gdXNlX2RweTogIiI7Ci0JCUZJTEUgKnA7Ci0JCWludCBuOwotCQlpZiAoIXByb2dyYW1fbmFtZSkgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogbm8gcHJvZ3JhbV9uYW1lIGZvdW5kLlxuIik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWlmIChzdHJwYnJrKHByb2dyYW1fbmFtZSwgIiBcdFxyXG4iKSkgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogd2hpdGVzcGFjZSBpbiBwcm9ncmFtX25hbWUgJyVzJ1xuIiwgcHJvZ3JhbV9uYW1lKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKG5vX2V4dGVybmFsX2NtZHMgfHwgIWNtZF9vaygiZmluZGF1dGgiKSkgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogY2Fubm90IHJ1biBleHRlcm5hbCBjb21tYW5kcyBpbiAtbm9jbWRzIG1vZGU6XG4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQotCQljbWQgPSAoY2hhciAqKW1hbGxvYygxMDAgKyBzdHJsZW4ocHJvZ3JhbV9uYW1lKSArIHN0cmxlbihkaXNwKSk7Ci0JCXNwcmludGYoY21kLCAiJXMgLWZpbmRhdXRoICVzIC1lbnYgX0RfWERNPTEiLCBwcm9ncmFtX25hbWUsIGRpc3ApOwotCQlwID0gcG9wZW4oY21kLCAiciIpOwotCQlpZiAoIXApIHsKLQkJCXJmYkxvZygiLWF1dGggZ3Vlc3M6IGNvdWxkIG5vdCBydW4gY21kICclcydcbiIsIGNtZCk7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCW1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOwotCQluID0gZnJlYWQobGluZSwgMSwgc2l6ZW9mKGxpbmUpLCBwKTsKLQkJcGNsb3NlKHApOwotCQlxID0gc3RycmNocihsaW5lLCAnXG4nKTsKLQkJaWYgKHEpICpxID0gJ1wwJzsKLQkJaWYgKCFzdHJjbXAoZGlzcCwgIiIpKSB7Ci0JCQlkaXNwID0gZ2V0ZW52KCJESVNQTEFZIik7Ci0JCQlpZiAoIWRpc3ApIHsKLQkJCQlkaXNwID0gInVuc2V0IjsKLQkJCX0KLQkJfQotCQlpZiAoc3Ryc3RyKGxpbmUsICJYQVVUSE9SSVRZPSIpICE9IGxpbmUgJiYgIWdldGVudigiRkRfWERNIikpIHsKLQkJCWlmICh1c2VfZHB5ID09IE5VTEwgfHwgc3Ryc3RyKHVzZV9kcHksICJjbWQ9RklORCIpID09IE5VTEwpIHsKLQkJCQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkgewotCQkJCQljaGFyICpxID0gc3Ryc3RyKGNtZCwgIl9EX1hETT0xIik7Ci0JCQkJCWlmIChxKSB7Ci0JCQkJCQkqcSA9ICdGJzsKLQkJCQkJCXJmYkxvZygiLWF1dGggZ3Vlc3M6IGZhaWxlZCBmb3IgZGlzcGxheT0nJXMnXG4iLCBkaXNwKTsKLQkJCQkJCXJmYkxvZygiLWF1dGggZ3Vlc3M6IHNpbmNlIHdlIGFyZSByb290LCByZXRyeWluZyB3aXRoIEZEX1hETT0xXG4iKTsKLQkJCQkJCXAgPSBwb3BlbihjbWQsICJyIik7Ci0JCQkJCQlpZiAoIXApIHsKLQkJCQkJCQlyZmJMb2coIi1hdXRoIGd1ZXNzOiBjb3VsZCBub3QgcnVuIGNtZCAnJXMnXG4iLCBjbWQpOwotCQkJCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQkJCQl9Ci0JCQkJCQltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKLQkJCQkJCW4gPSBmcmVhZChsaW5lLCAxLCBzaXplb2YobGluZSksIHApOwotCQkJCQkJcGNsb3NlKHApOwotCQkJCQkJcSA9IHN0cnJjaHIobGluZSwgJ1xuJyk7Ci0JCQkJCQlpZiAocSkgKnEgPSAnXDAnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghc3RyY21wKGxpbmUsICIiKSkgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogZmFpbGVkIGZvciBkaXNwbGF5PSclcydcbiIsIGRpc3ApOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfSBlbHNlIGlmIChzdHJzdHIobGluZSwgIlhBVVRIT1JJVFk9IikgIT0gbGluZSkgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogZmFpbGVkLiAnJXMnIGZvciBkaXNwbGF5PSclcydcbiIsIGxpbmUsIGRpc3ApOwotCQkJY2xlYW5fdXBfZXhpdCgxKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGxpbmUsICJYQVVUSE9SSVRZPSIpKSB7Ci0JCQlyZmJMb2coIi1hdXRoIGd1ZXNzOiB1c2luZyBkZWZhdWx0IFhBVVRIT1JJVFkgZm9yIGRpc3BsYXk9JyVzJ1xuIiwgZGlzcCk7Ci0JCQlxID0gZ2V0ZW52KCJYQVVUSE9SSVRZIik7Ci0JCQlpZiAocSkgewotCQkJCSoocS0yKSA9ICdfJzsJLyogeW93ICovCi0JCQl9Ci0JCQlhdXRoX2ZpbGUgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJcmZiTG9nKCItYXV0aCBndWVzczogdXNpbmcgJyVzJyBmb3IgZGlzcD0nJXMnXG4iLCBsaW5lLCBkaXNwKTsKLQkJCWF1dGhfZmlsZSA9IHN0cmR1cChsaW5lICsgc3RybGVuKCJYQVVUSE9SSVRZPSIpKTsKLQkJfQotCX0KLX0KLQotZXh0ZXJuIGludCBpc19kZWNpbWFsKGNoYXIgKik7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLQotCWludCBpLCBsZW4sIHRtcGk7Ci0JaW50IGV2LCBlciwgbWFqLCBtaW47Ci0JY2hhciAqYXJnOwotCWludCByZW1vdGVfc3luYyA9IDA7Ci0JY2hhciAqcmVtb3RlX2NtZCA9IE5VTEw7Ci0JY2hhciAqcXVlcnlfY21kICA9IE5VTEw7Ci0JaW50IHF1ZXJ5X3JldHJpZXMgPSAwOwotCWRvdWJsZSBxdWVyeV9kZWxheSA9IDAuNTsKLQljaGFyICpxdWVyeV9tYXRjaCAgPSBOVUxMOwotCWNoYXIgKmd1aV9zdHIgPSBOVUxMOwotCWludCBnb3RfZ3VpX3B3ID0gMDsKLQlpbnQgcHdfbG9jID0gLTEsIGdvdF9wYXNzd2QgPSAwLCBnb3RfcmZiYXV0aCA9IDAsIG5vcHcgPSBOT1BXOwotCWludCBnb3Rfdmlld3Bhc3N3ZCA9IDAsIGdvdF9sb2NhbGhvc3QgPSAwLCBnb3RfcGFzc3dkZmlsZSA9IDA7Ci0JaW50IHZwd19sb2MgPSAtMTsKLQlpbnQgZHQgPSAwLCBiZyA9IDA7Ci0JaW50IGdvdF9yZmJ3YWl0ID0gMDsKLQlpbnQgZ290X2h0dHBkaXIgPSAwLCB0cnlfaHR0cCA9IDA7Ci0JaW50IG9yaWdfdXNlX3hkYW1hZ2UgPSB1c2VfeGRhbWFnZTsKLQlpbnQgaHR0cF9vbmVwb3J0X21zZyA9IDA7Ci0JWEltYWdlICpmYjAgPSBOVUxMOwotCWludCBuY2FjaGVfbXNnID0gMDsKLQljaGFyICpnb3RfcmZicG9ydF9zdHIgPSBOVUxMOwotCWludCBnb3RfcmZicG9ydF9wb3MgPSAtMTsKLQlpbnQgZ290X3RscyA9IDA7Ci0JaW50IGdvdF9pbmV0ZCA9IDA7Ci0JaW50IGdvdF9ub3hyYW5kciA9IDA7Ci0KLQkvKiB1c2VkIHRvIHBhc3MgYXJncyB3ZSBkbyBub3Qga25vdyBhYm91dCB0byByZmJHZXRTY3JlZW4oKTogKi8KLQlpbnQgYXJnY192bmNfbWF4ID0gMTAyNDsKLQlpbnQgYXJnY192bmMgPSAxOyBjaGFyICphcmd2X3ZuY1syMDQ4XTsKLQotCS8qIGNoZWNrIGZvciAtbG9vcCBtb2RlOiAqLwotCWNoZWNrX2xvb3BfbW9kZShhcmdjLCBhcmd2LCAwKTsKLQotCS8qIGNoZWNrIGZvciAtYXBwc2hhcmUgbW9kZTogKi8KLQljaGVja19hcHBzaGFyZV9tb2RlKGFyZ2MsIGFyZ3YpOwotCi0JZHRpbWUwKCZ4MTF2bmNfc3RhcnQpOwotCi0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1pbmV0ZCIpKSB7Ci0JCQlnb3RfaW5ldGQgPSAxOwotCQl9Ci0JfQotCi0JaWYgKCFnZXR1aWQoKSB8fCAhZ2V0ZXVpZCgpKSB7Ci0JCXN0YXJ0ZWRfYXNfcm9vdCA9IDE7Ci0JCWlmICgwICYmICFnb3RfaW5ldGQpIHsKLQkJCXJmYkxvZygiZ2V0dWlkOiAlZCAgZ2V0ZXVpZDogJWRcbiIsIGdldHVpZCgpLCBnZXRldWlkKCkpOwotCQl9Ci0KLQkJLyogY2hlY2sgZm9yICctdXNlcnMgPWJvYicgKi8KLQkJaW1tZWRpYXRlX3N3aXRjaF91c2VyKGFyZ2MsIGFyZ3YpOwotCX0KLQotCWZvciAoaT0wOyBpIDwgMjA0ODsgaSsrKSB7Ci0JCWFyZ3Zfdm5jW2ldID0gTlVMTDsKLQl9Ci0KLQlhcmd2X3ZuY1swXSA9IHN0cmR1cChhcmd2WzBdKTsKLQlwcm9ncmFtX25hbWUgPSBzdHJkdXAoYXJndlswXSk7Ci0JcHJvZ3JhbV9waWQgPSAoaW50KSBnZXRwaWQoKTsKLQotCXNvbGlkX2RlZmF1bHQgPSBzdHJkdXAoc29saWRfZGVmYXVsdCk7CS8qIGZvciBmcmVlaW5nIHdpdGggLVIgKi8KLQotCWxlbiA9IDA7Ci0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJbGVuICs9IHN0cmxlbihhcmd2W2ldKSArIDQgKyAxOwotCX0KLQlwcm9ncmFtX2NtZGxpbmUgPSAoY2hhciAqKSBtYWxsb2MobGVuKzEpOwotCXByb2dyYW1fY21kbGluZVswXSA9ICdcMCc7Ci0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJY2hhciAqcyA9IGFyZ3ZbaV07Ci0JCWlmIChwcm9ncmFtX2NtZGxpbmVbMF0pIHsKLQkJCXN0cmNhdChwcm9ncmFtX2NtZGxpbmUsICIgIik7Ci0JCX0KLQkJaWYgKCpzID09ICctJykgewotCQkJc3RyY2F0KHByb2dyYW1fY21kbGluZSwgcyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJjYXQocHJvZ3JhbV9jbWRsaW5lLCAie3siKTsKLQkJCXN0cmNhdChwcm9ncmFtX2NtZGxpbmUsIHMpOwotCQkJc3RyY2F0KHByb2dyYW1fY21kbGluZSwgIn19Iik7Ci0JCX0KLQl9Ci0KLQlmb3IgKGk9MDsgaTxJQ09OX01PREVfU09DS1M7IGkrKykgewotCQlpY29uX21vZGVfc29ja3NbaV0gPSAtMTsKLQl9Ci0KLQljaGVja19yY2ZpbGUoYXJnYywgYXJndik7Ci0JLyoga2x1ZGdlIGZvciB0aGUgbmV3IGFycmF5IGFyZ3YyIHNldCBpbiBjaGVja19yY2ZpbGUoKSAqLwotIwlkZWZpbmUgYXJnYyBhcmdjMgotIwlkZWZpbmUgYXJndiBhcmd2MgotCi0jCWRlZmluZSBDSEVDS19BUkdDIGlmIChpID49IGFyZ2MtMSkgeyBcCi0JCWZwcmludGYoc3RkZXJyLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yOiAlc1xuIiwgYXJnKTsgXAotCQlleGl0KDEpOyBcCi0JfQotCi0JLyoKLQkgKiBkbyBhIHF1aWNrIGNoZWNrIGZvciBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgdG8gInV0aWxpdHkiCi0JICogY29tbWFuZHMsIGkuZS4gb25lcyB0aGF0IGRvIG5vdCBydW4gdGhlIHNlcnZlci4KLQkgKi8KLQlmb3IgKGk9MTsgaSA8IGFyZ2M7IGkrKykgewotCQlhcmcgPSBhcmd2W2ldOwotCQlpZiAoc3Ryc3RyKGFyZywgIi0tIikgPT0gYXJnKSB7Ci0JCQlhcmcrKzsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc3NsZGlyIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNzbF9jZXJ0c19kaXIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJfQotCX0KLQotCS8qCi0JICogZG8gYSBxdWljayBjaGVjayBmb3IgLWVudiBwYXJhbWV0ZXJzCi0JICovCi0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJY2hhciAqcCwgKnE7Ci0JCWFyZyA9IGFyZ3ZbaV07Ci0JCWlmIChzdHJzdHIoYXJnLCAiLS0iKSA9PSBhcmcpIHsKLQkJCWFyZysrOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1lbnYiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcCA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJcSA9IHN0cmNocihwLCAnPScpOwotCQkJaWYgKCEgcSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAibm8gLWVudiAnPScgZm91bmQ6ICVzXG4iLCBwKTsKLQkJCQlleGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQkqcSA9ICdcMCc7Ci0JCQl9Ci0JCQlzZXRfZW52KHAsIHErMSk7Ci0JCQlmcmVlKHApOwotCQl9Ci0JfQotCi0JZm9yIChpPTE7IGkgPCBhcmdjOyBpKyspIHsKLQkJLyogcXVpY2stbi1kaXJ0eSAtLW9wdGlvbiBoYW5kbGluZy4gKi8KLQkJYXJnID0gYXJndltpXTsKLQkJaWYgKHN0cnN0cihhcmcsICItLSIpID09IGFyZykgewotCQkJYXJnKys7Ci0JCX0KLQotCQlpZiAoIXN0cmNtcChhcmcsICItZGlzcGxheSIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl1c2VfZHB5ID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlpZiAoc3Ryc3RyKHVzZV9kcHksICJXQUlUIikpIHsKLQkJCQlleHRlcm4gY2hhciBmaW5kX2Rpc3BsYXlbXTsKLQkJCQlleHRlcm4gY2hhciBjcmVhdGVfZGlzcGxheVtdOwotCQkJCWlmIChzdHJzdHIodXNlX2RweSwgImNtZD1GSU5ERElTUExBWS1wcmludCIpKSB7Ci0JCQkJCWZwcmludGYoc3Rkb3V0LCAiJXMiLCBmaW5kX2Rpc3BsYXkpOwotCQkJCQlleGl0KDApOwotCQkJCX0KLQkJCQlpZiAoc3Ryc3RyKHVzZV9kcHksICJjbWQ9RklORENSRUFURURJU1BMQVktcHJpbnQiKSkgewotCQkJCQlmcHJpbnRmKHN0ZG91dCwgIiVzIiwgY3JlYXRlX2Rpc3BsYXkpOwotCQkJCQlleGl0KDApOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZW9wZW4iKSkgewotCQkJY2hhciAqc3RyID0gZ2V0ZW52KCJYMTFWTkNfUkVPUEVOX0RJU1BMQVkiKTsKLQkJCWlmIChzdHIpIHsKLQkJCQlpbnQgcm1heCA9IGF0b2koc3RyKTsKLQkJCQlpZiAocm1heCA+IDApIHsKLQkJCQkJc2V0X2VudigiWDExVk5DX1JFT1BFTl9ESVNQTEFZIiwgc3RyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNldF9lbnYoIlgxMVZOQ19SRU9QRU5fRElTUExBWSIsICIxIik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZmluZCIpKSB7Ci0JCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5ERElTUExBWSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWZpbmRkcHkiKSB8fCBzdHJzdHIoYXJnLCAiLWxpc3RkcHkiKSA9PSBhcmcpIHsKLQkJCWludCBpYyA9IDA7Ci0JCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5ERElTUExBWS1ydW4iKTsKLQkJCWlmIChhcmdjID4gaSsxKSB7Ci0JCQkJc2V0X2VudigiWDExVk5DX1VTRVIiLCBhcmd2W2krMV0pOwotCQkJCWZwcmludGYoc3Rkb3V0LCAiWDExVk5DX1VTRVI9JXNcbiIsIGdldGVudigiWDExVk5DX1VTRVIiKSk7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKGFyZywgIi1saXN0ZHB5IikgPT0gYXJnKSB7Ci0JCQkJc2V0X2VudigiRklORF9ESVNQTEFZX0FMTCIsICIxIik7Ci0JCQl9Ci0JCQl3YWl0X2Zvcl9jbGllbnQoJmljLCBOVUxMLCAwKTsKLQkJCWV4aXQoMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZmluZGF1dGgiKSkgewotCQkJZ290X2ZpbmRhdXRoID0gMTsKLQkJCWlmIChhcmdjID4gaSsxKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlpZiAoc1swXSAhPSAnLScpIHsKLQkJCQkJc2V0X2VudigiRklOREFVVEhfRElTUExBWSIsIGFyZ3ZbaSsxXSk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY3JlYXRlIikpIHsKLQkJCXVzZV9kcHkgPSBzdHJkdXAoIldBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1jcmVhdGVfeHNydiIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl1c2VfZHB5ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihhcmd2W2krMV0pKzEwMCk7IAotCQkJc3ByaW50Zih1c2VfZHB5LCAiV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktJXMiLCBhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXhkdW1teSIpKSB7Ci0JCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YZHVtbXkiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi14ZHVtbXlfeHZmYiIpKSB7Ci0JCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YZHVtbXksWHZmYiIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXh2bmMiKSkgewotCQkJdXNlX2RweSA9IHN0cmR1cCgiV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZuYyIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXh2bmNfcmVkaXJlY3QiKSkgewotCQkJdXNlX2RweSA9IHN0cmR1cCgiV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZuYy5yZWRpcmVjdCIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXJlZGlyZWN0IikpIHsKLQkJCWNoYXIgKnEsICp0LCAqdDAgPSAiV0FJVDpjbWQ9RklORERJU1BMQVktdm5jX3JlZGlyZWN0IjsKLQkJCUNIRUNLX0FSR0MKLQkJCXQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHQwKSArIHN0cmxlbihhcmd2WysraV0pICsgMik7Ci0JCQlxID0gc3RycmNocihhcmd2W2ldLCAnOicpOwotCQkJaWYgKHEpICpxID0gJyAnOwotCQkJc3ByaW50Zih0LCAiJXM9JXMiLCB0MCwgYXJndltpXSk7Ci0JCQl1c2VfZHB5ID0gdDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1hdXRoIikgfHwgIXN0cmNtcChhcmcsICIteGF1dGgiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJYXV0aF9maWxlID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItTiIpKSB7Ci0JCQlkaXNwbGF5X04gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWF1dG9wb3J0IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWF1dG9fcG9ydCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZWZsZWN0IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXJhd19mYl9zdHIgPSAoY2hhciAqKSBtYWxsb2MoNCArIHN0cmxlbihhcmd2W2krMV0pICsgMSk7Ci0JCQlzcHJpbnRmKHJhd19mYl9zdHIsICJ2bmM6JXMiLCBhcmd2WysraV0pOwotCQkJc2hhcmVkID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi10c2QiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJdGVybWluYWxfc2VydmljZXNfZGFlbW9uID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItaWQiKSB8fCAhc3RyY21wKGFyZywgIi1zaWQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNpZCIpKSB7Ci0JCQkJcm9vdHNoaWZ0ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcm9vdHNoaWZ0ID0gMDsKLQkJCX0KLQkJCWkrKzsKLQkJCWlmICghc3RyY21wKCJwaWNrIiwgYXJndltpXSkpIHsKLQkJCQlpZiAoc3RhcnRlZF9hc19yb290KSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAidW5zYWZlOiAlcyBwaWNrXG4iLAotCQkJCQkgICAgYXJnKTsKLQkJCQkJZXhpdCgxKTsKLQkJCQl9IGVsc2UgaWYgKCEgcGlja193aW5kb3dpZCgmc3Vid2luKSkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgJXMgcGlja1xuIiwKLQkJCQkJICAgIGFyZyk7Ci0JCQkJCWV4aXQoMSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghIHNjYW5faGV4ZGVjKGFyZ3ZbaV0sICZzdWJ3aW4pKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkICVzIGFyZzogJXNcbiIsIGFyZywKLQkJCQkgICAgYXJndltpXSk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi13YWl0bWFwcGVkIikpIHsKLQkJCXN1Yndpbl93YWl0X21hcHBlZCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY2xpcCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQljbGlwX3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWZsYXNoY21hcCIpKSB7Ci0JCQlmbGFzaF9jbWFwID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zaGlmdGNtYXAiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2hpZnRfY21hcCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3RydWVjb2xvciIpKSB7Ci0JCQlmb3JjZV9pbmRleGVkX2NvbG9yID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1hZHZlcnRpc2VfdHJ1ZWNvbG9yIikpIHsKLQkJCWFkdmVydGlzZV90cnVlY29sb3IgPSAxOwotCQkJaWYgKGkgPCBhcmdjLTEpIHsKLQkJCQljaGFyICpzID0gYXJndltpKzFdOwotCQkJCWlmIChzWzBdICE9ICctJykgewotCQkJCQlpZiAoc3Ryc3RyKHMsICJyZXNldCIpKSB7Ci0JCQkJCQlhZHZlcnRpc2VfdHJ1ZWNvbG9yX3Jlc2V0ID0gMTsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW92ZXJsYXkiKSkgewotCQkJb3ZlcmxheSA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItb3ZlcmxheV9ub2N1cnNvciIpKSB7Ci0JCQlvdmVybGF5ID0gMTsKLQkJCW92ZXJsYXlfY3Vyc29yID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1vdmVybGF5X3llc2N1cnNvciIpKSB7Ci0JCQlvdmVybGF5ID0gMTsKLQkJCW92ZXJsYXlfY3Vyc29yID0gMjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi04dG8yNCIpKSB7Ci0jaWYgIVNLSVBfOFRPMjQKLQkJCWNtYXA4dG8yNCA9IDE7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKHNbMF0gIT0gJy0nKSB7Ci0JCQkJCWNtYXA4dG8yNF9zdHIgPSBzdHJkdXAocyk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi0yNHRvMzIiKSkgewotCQkJeGZvcm0yNHRvMzIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXZpc3VhbCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl2aXN1YWxfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2NhbGUiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2NhbGVfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZ2VvbWV0cnkiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2NhbGVfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2NhbGVfY3Vyc29yIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNjYWxlX2N1cnNvcl9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi12aWV3b25seSIpKSB7Ci0JCQl2aWV3X29ubHkgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vdmlld29ubHkiKSkgewotCQkJdmlld19vbmx5ID0gMDsKLQkJCWdvdF9ub3ZpZXdvbmx5ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zaGFyZWQiKSkgewotCQkJc2hhcmVkID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3NoYXJlZCIpKSB7Ci0JCQlzaGFyZWQgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW9uY2UiKSkgewotCQkJY29ubmVjdF9vbmNlID0gMTsKLQkJCWdvdF9jb25uZWN0X29uY2UgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hbnkiKSB8fCAhc3RyY21wKGFyZywgIi1mb3JldmVyIikpIHsKLQkJCWNvbm5lY3Rfb25jZSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc3Ryc3RyKGFyZywgIi1sb29wIikgPT0gYXJnKSB7Ci0JCQk7CS8qIGhhbmRsZWQgYWJvdmUgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIoYXJnLCAiLWFwcHNoYXJlIikgPT0gYXJnKSB7Ci0JCQk7CS8qIGhhbmRsZWQgYWJvdmUgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIoYXJnLCAiLWZyZWV6ZV93aGVuX29ic2N1cmVkIikgPT0gYXJnKSB7Ci0JCQlmcmVlemVfd2hlbl9vYnNjdXJlZCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItdGltZW91dCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlmaXJzdF9jb25uX3RpbWVvdXQgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2xlZXBpbiIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlkb19zbGVlcGluKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItdXNlcnMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJdXNlcnNfbGlzdCA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWluZXRkIikpIHsKLQkJCWluZXRkID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3RpZ2h0ZmlsZXhmZXIiKSkgewotCQkJdGlnaHRmaWxleGZlciA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItdGlnaHRmaWxleGZlciIpKSB7Ci0JCQl0aWdodGZpbGV4ZmVyID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1odHRwIikpIHsKLQkJCXRyeV9odHRwID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1odHRwX3NzbCIpKSB7Ci0JCQl0cnlfaHR0cCA9IDE7Ci0JCQlodHRwX3NzbCA9IDE7Ci0JCQlnb3RfdGxzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYXZhaGkiKSB8fCAhc3RyY21wKGFyZywgIi1tZG5zIikgfHwgIXN0cmNtcChhcmcsICItemVyb2NvbmYiKSkgewotCQkJYXZhaGkgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWNvbm5lY3QiKSB8fAotCQkgICAgIXN0cmNtcChhcmcsICItY29ubmVjdF9vcl9leGl0IikgfHwKLQkJICAgICFzdHJjbXAoYXJnLCAiLWNvZSIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlpZiAoIXN0cmNtcChhcmcsICItY29ubmVjdF9vcl9leGl0IikpIHsKLQkJCQljb25uZWN0X29yX2V4aXQgPSAxOwotCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi1jb2UiKSkgewotCQkJCWNvbm5lY3Rfb3JfZXhpdCA9IDE7Ci0JCQl9Ci0JCQlpZiAoc3RyY2hyKGFyZ3ZbKytpXSwgJy8nKSAmJiAhc3Ryc3RyKGFyZ3ZbaV0sICJyZXBlYXRlcjovLyIpKSB7Ci0JCQkJc3RydWN0IHN0YXQgc2I7Ci0JCQkJY2xpZW50X2Nvbm5lY3RfZmlsZSA9IHN0cmR1cChhcmd2W2ldKTsKLQkJCQlpZiAoc3RhdChjbGllbnRfY29ubmVjdF9maWxlLCAmc2IpICE9IDApIHsKLQkJCQkJRklMRSogZiA9IGZvcGVuKGNsaWVudF9jb25uZWN0X2ZpbGUsICJ3Iik7Ci0JCQkJCWlmIChmICE9IE5VTEwpIGZjbG9zZShmKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNsaWVudF9jb25uZWN0ID0gc3RyZHVwKGFyZ3ZbaV0pOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXByb3h5IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWNvbm5lY3RfcHJveHkgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi12bmNjb25uZWN0IikpIHsKLQkJCXZuY19jb25uZWN0ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3ZuY2Nvbm5lY3QiKSkgewotCQkJdm5jX2Nvbm5lY3QgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWFsbG93IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWFsbG93X2xpc3QgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1sb2NhbGhvc3QiKSkgewotCQkJYWxsb3dfbGlzdCA9IHN0cmR1cCgiMTI3LjAuMC4xIik7Ci0JCQlnb3RfbG9jYWxob3N0ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi11bml4c29jayIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl1bml4X3NvY2sgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1saXN0ZW42IikpIHsKLQkJCUNIRUNLX0FSR0MKLSNpZiBYMTFWTkNfSVBWNgotCQkJbGlzdGVuX3N0cjYgPSBzdHJkdXAoYXJndlsrK2ldKTsKLSNlbHNlCi0JCQkrK2k7Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2xvb2t1cCIpKSB7Ci0JCQlob3N0X2xvb2t1cCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItNiIpKSB7Ci0jaWYgWDExVk5DX0lQVjYKLQkJCWlwdjZfbGlzdGVuID0gMTsKLQkJCWdvdF9pcHY2X2xpc3RlbiA9IDE7Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ubzYiKSkgewotI2lmIFgxMVZOQ19JUFY2Ci0JCQlpcHY2X2xpc3RlbiA9IDA7Ci0JCQlnb3RfaXB2Nl9saXN0ZW4gPSAwOwotI2VuZGlmCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9pcHY2IikpIHsKLQkJCW5vaXB2NiA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9pcHY0IikpIHsKLQkJCW5vaXB2NCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghc3RyY21wKGFyZywgIi1pbnB1dCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlhbGxvd2VkX2lucHV0X3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWdyYWJrYmQiKSkgewotCQkJZ3JhYl9rYmQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWdyYWJwdHIiKSkgewotCQkJZ3JhYl9wdHIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXVuZ3JhYmJvdGgiKSkgewotCQkJdW5ncmFiX2JvdGggPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWdyYWJhbHdheXMiKSkgewotCQkJZ3JhYl9rYmQgPSAxOwotCQkJZ3JhYl9wdHIgPSAxOwotCQkJZ3JhYl9hbHdheXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLSNpZmRlZiBFTkFCTEVfR1JBQkxPQ0FMCi0JCWlmICghc3RyY21wKGFyZywgIi1ncmFibG9jYWwiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJZ3JhYl9sb2NhbCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXZpZXdwYXNzd2QiKSkgewotCQkJdnB3X2xvYyA9IGk7Ci0JCQlDSEVDS19BUkdDCi0JCQl2aWV3b25seV9wYXNzd2QgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWdvdF92aWV3cGFzc3dkID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1wYXNzd2RmaWxlIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXBhc3N3ZGZpbGUgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWdvdF9wYXNzd2RmaWxlID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zdmMiKSB8fCAhc3RyY21wKGFyZywgIi1zZXJ2aWNlIikpIHsKLQkJCXVzZV9kcHkgPSBzdHJkdXAoIldBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIiKTsKLQkJCXVuaXhwdyA9IDE7Ci0JCQl1c2Vyc19saXN0ID0gc3RyZHVwKCJ1bml4cHc9Iik7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlvcGVuc3NsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXN2Y194ZHVtbXkiKSkgewotCQkJdXNlX2RweSA9IHN0cmR1cCgiV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15Iik7Ci0JCQl1bml4cHcgPSAxOwotCQkJdXNlcnNfbGlzdCA9IHN0cmR1cCgidW5peHB3PSIpOwotCQkJdXNlX29wZW5zc2wgPSAxOwotCQkJb3BlbnNzbF9wZW0gPSBzdHJkdXAoIlNBVkUiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zdmNfeGR1bW15X3h2ZmIiKSkgewotCQkJdXNlX2RweSA9IHN0cmR1cCgiV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15LFh2ZmIiKTsKLQkJCXVuaXhwdyA9IDE7Ci0JCQl1c2Vyc19saXN0ID0gc3RyZHVwKCJ1bml4cHc9Iik7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlvcGVuc3NsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXN2Y194dm5jIikpIHsKLQkJCXVzZV9kcHkgPSBzdHJkdXAoIldBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2bmMiKTsKLQkJCXVuaXhwdyA9IDE7Ci0JCQl1c2Vyc19saXN0ID0gc3RyZHVwKCJ1bml4cHc9Iik7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlvcGVuc3NsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXhkbXN2YyIpIHx8ICFzdHJjbXAoYXJnLCAiLXhkbV9zZXJ2aWNlIikpIHsKLQkJCXVzZV9kcHkgPSBzdHJkdXAoIldBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AiKTsKLQkJCXVuaXhwdyA9IDE7Ci0JCQl1c2Vyc19saXN0ID0gc3RyZHVwKCJ1bml4cHc9Iik7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlvcGVuc3NsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzaHhkbXN2YyIpKSB7Ci0JCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiLnhkbWNwIik7Ci0JCQlhbGxvd19saXN0ID0gc3RyZHVwKCIxMjcuMC4wLjEiKTsKLQkJCWdvdF9sb2NhbGhvc3QgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciIpKSB7Ci0JCQl1bml4cHdfc3lzdGVtX2dyZWV0ZXIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXVuaXhwd19jbWQiKQotCQkgICAgfHwgIXN0cmNtcChhcmcsICItdW5peHB3X2NtZF91bnNhZmUiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJdW5peHB3X2NtZCA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJdW5peHB3ID0gMTsKLQkJCWlmIChzdHJzdHIoYXJnLCAiX3Vuc2FmZSIpKSB7Ci0JCQkJLyogaGlkZGVuIG9wdGlvbiBmb3IgdGVzdGluZy4gKi8KLQkJCQlzZXRfZW52KCJVTklYUFdfRElTQUJMRV9TU0wiLCAiMSIpOwotCQkJCXNldF9lbnYoIlVOSVhQV19ESVNBQkxFX0xPQ0FMSE9TVCIsICIxIik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc3Ryc3RyKGFyZywgIi11bml4cHciKSA9PSBhcmcpIHsKLQkJCXVuaXhwdyA9IDE7Ci0JCQlpZiAoc3Ryc3RyKGFyZywgIi11bml4cHdfbmlzIikpIHsKLQkJCQl1bml4cHdfbmlzID0gMTsKLQkJCX0KLQkJCWlmIChpIDwgYXJnYy0xKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlpZiAoc1swXSAhPSAnLScpIHsKLQkJCQkJdW5peHB3X2xpc3QgPSBzdHJkdXAocyk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKHNbMF0gPT0gJyUnKSB7Ci0JCQkJCXVuaXhwd19saXN0ID0gTlVMTDsKLQkJCQkJcXVpY2tfcHcocyk7Ci0JCQkJCWV4aXQoMik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0cnN0cihhcmcsICJfdW5zYWZlIikpIHsKLQkJCQkvKiBoaWRkZW4gb3B0aW9uIGZvciB0ZXN0aW5nLiAqLwotCQkJCXNldF9lbnYoIlVOSVhQV19ESVNBQkxFX1NTTCIsICIxIik7Ci0JCQkJc2V0X2VudigiVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUIiwgIjEiKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdHJzdHIoYXJnLCAiLW5vdW5peHB3IikgPT0gYXJnKSB7Ci0JCQl1bml4cHcgPSAwOwotCQkJdW5peHB3X25pcyA9IDA7Ci0JCQlpZiAodW5peHB3X2xpc3QpIHsKLQkJCQl1bml4cHdfbGlzdCA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAodW5peHB3X2NtZCkgewotCQkJCXVuaXhwd19jbWQgPSBOVUxMOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXZlbmNyeXB0IikpIHsKLQkJCWNoYXIgKnM7Ci0JCQlDSEVDS19BUkdDCi0JCQlzID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlnb3RfdGxzKys7Ci0JCQlpZiAoc3Ryc3RyKHMsICJuZXZlciIpKSB7Ci0JCQkJdmVuY3J5cHRfbW9kZSA9IFZFTkNSWVBUX05PTkU7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihzLCAic3VwcG9ydCIpKSB7Ci0JCQkJdmVuY3J5cHRfbW9kZSA9IFZFTkNSWVBUX1NVUFBPUlQ7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihzLCAib25seSIpKSB7Ci0JCQkJdmVuY3J5cHRfbW9kZSA9IFZFTkNSWVBUX1NPTEU7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihzLCAiZm9yY2UiKSkgewotCQkJCXZlbmNyeXB0X21vZGUgPSBWRU5DUllQVF9GT1JDRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkICVzIGFyZzogJXNcbiIsIGFyZywgcyk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWlmIChzdHJzdHIocywgIm5vZGgiKSkgewotCQkJCXZlbmNyeXB0X2t4ID0gVkVOQ1JZUFRfTk9ESDsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKHMsICJub3g1MDkiKSkgewotCQkJCXZlbmNyeXB0X2t4ID0gVkVOQ1JZUFRfTk9YNTA5OwotCQkJfQotCQkJaWYgKHN0cnN0cihzLCAibmV3ZGgiKSkgewotCQkJCWNyZWF0ZV9mcmVzaF9kaHBhcmFtcyA9IDE7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKHMsICJub3BsYWluIikpIHsKLQkJCQl2ZW5jcnlwdF9lbmFibGVfcGxhaW5fbG9naW4gPSAwOwotCQkJfSBlbHNlIGlmIChzdHJzdHIocywgInBsYWluIikpIHsKLQkJCQl2ZW5jcnlwdF9lbmFibGVfcGxhaW5fbG9naW4gPSAxOwotCQkJfQotCQkJZnJlZShzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1hbm9udGxzIikpIHsKLQkJCWNoYXIgKnM7Ci0JCQlDSEVDS19BUkdDCi0JCQlzID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlnb3RfdGxzKys7Ci0JCQlpZiAoc3Ryc3RyKHMsICJuZXZlciIpKSB7Ci0JCQkJYW5vbnRsc19tb2RlID0gQU5PTlRMU19OT05FOwotCQkJfSBlbHNlIGlmIChzdHJzdHIocywgInN1cHBvcnQiKSkgewotCQkJCWFub250bHNfbW9kZSA9IEFOT05UTFNfU1VQUE9SVDsKLQkJCX0gZWxzZSBpZiAoc3Ryc3RyKHMsICJvbmx5IikpIHsKLQkJCQlhbm9udGxzX21vZGUgPSBBTk9OVExTX1NPTEU7Ci0JCQl9IGVsc2UgaWYgKHN0cnN0cihzLCAiZm9yY2UiKSkgewotCQkJCWFub250bHNfbW9kZSA9IEFOT05UTFNfRk9SQ0U7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAlcyBhcmc6ICVzXG4iLCBhcmcsIHMpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlpZiAoc3Ryc3RyKHMsICJuZXdkaCIpKSB7Ci0JCQkJY3JlYXRlX2ZyZXNoX2RocGFyYW1zID0gMTsKLQkJCX0KLQkJCWZyZWUocyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc3Nsb25seSIpKSB7Ci0JCQl2ZW5jcnlwdF9tb2RlID0gVkVOQ1JZUFRfTk9ORTsKLQkJCWFub250bHNfbW9kZSA9IEFOT05UTFNfTk9ORTsKLQkJCWdvdF90bHMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kaHBhcmFtcyIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlkaHBhcmFtc19maWxlID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlnb3RfdGxzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9zc2wiKSkgewotCQkJdXNlX29wZW5zc2wgPSAwOwotCQkJb3BlbnNzbF9wZW0gPSBOVUxMOwotCQkJZ290X3RscyA9IC0xMDAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbCIpKSB7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKHNbMF0gIT0gJy0nKSB7Ci0JCQkJCWlmICghc3RyY21wKHMsICJBREgiKSkgewotCQkJCQkJb3BlbnNzbF9wZW0gPSBzdHJkdXAoIkFOT04iKTsKLQkJCQkJfSBlbHNlIGlmICghc3RyY21wKHMsICJBTk9OREgiKSkgewotCQkJCQkJb3BlbnNzbF9wZW0gPSBzdHJkdXAoIkFOT04iKTsKLQkJCQkJfSBlbHNlIGlmICghc3RyY21wKHMsICJUTVAiKSkgewotCQkJCQkJb3BlbnNzbF9wZW0gPSBOVUxMOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3BlbnNzbF9wZW0gPSBzdHJkdXAocyk7Ci0JCQkJCX0KLQkJCQkJaSsrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9wZW5zc2xfcGVtID0gc3RyZHVwKCJTQVZFIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvcGVuc3NsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWVuYyIpKSB7Ci0JCQl1c2Vfb3BlbnNzbCA9IDE7Ci0JCQlDSEVDS19BUkdDCi0JCQllbmNfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItaHR0cF9vbmVwb3J0IikpIHsKLQkJCWh0dHBfb25lcG9ydF9tc2cgPSAxOwotCQkJdXNlX29wZW5zc2wgPSAxOwotCQkJZW5jX3N0ciA9IHN0cmR1cCgibm9uZSIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbHRpbWVvdXQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc3NsX3RpbWVvdXRfc2VjcyA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zc2xub2ZhaWwiKSkgewotCQkJc3NsX25vX2ZhaWwgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbGRpciIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzc2xfY2VydHNfZGlyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc3NsdmVyaWZ5IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNzbF92ZXJpZnkgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWdvdF90bHMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zc2xDUkwiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc3NsX2NybCA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJZ290X3RscysrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbEdlbkNBIikpIHsKLQkJCWNoYXIgKmNkaXIgPSBOVUxMOwotCQkJaWYgKGkgPCBhcmdjLTEpIHsKLQkJCQljaGFyICpzID0gYXJndltpKzFdOwotCQkJCWlmIChzWzBdICE9ICctJykgewotCQkJCQljZGlyID0gc3RyZHVwKHMpOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJc3NsR2VuQ0EoY2Rpcik7Ci0JCQlleGl0KDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbEdlbkNlcnQiKSkgewotCQkJY2hhciAqdHksICpubSA9IE5VTEw7Ci0JCQlpZiAoaSA+PSBhcmdjLTEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIk11c3QgYmU6XG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyIC4uLlxuIik7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJvciAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCAuLi5cbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQl0eSA9IGFyZ3ZbaSsxXTsKLQkJCWlmIChzdHJjbXAodHksICJzZXJ2ZXIiKSAmJiBzdHJjbXAodHksICJjbGllbnQiKSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiTXVzdCBiZTpcbiIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgLi4uXG4iKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIm9yICAgICAgICB4MTF2bmMgLXNzbEdlbkNlcnQgY2xpZW50IC4uLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWlmIChpIDwgYXJnYy0yKSB7Ci0JCQkJbm0gPSBhcmd2W2krMl07Ci0JCQl9Ci0JCQlzc2xHZW5DZXJ0KHR5LCBubSk7Ci0JCQlleGl0KDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbEVuY0tleSIpKSB7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJc3NsRW5jS2V5KHMsIDApOwotCQkJfQotCQkJZXhpdCgwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zc2xDZXJ0SW5mbyIpKSB7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJc3NsRW5jS2V5KHMsIDEpOwotCQkJfQotCQkJZXhpdCgwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zc2xEZWxDZXJ0IikpIHsKLQkJCWlmIChpIDwgYXJnYy0xKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlzc2xFbmNLZXkocywgMik7Ci0JCQl9Ci0JCQlleGl0KDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNzbFNjcmlwdHMiKSkgewotCQkJc3NsU2NyaXB0cygpOwotCQkJZXhpdCgwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zdHVubmVsIikpIHsKLQkJCXVzZV9zdHVubmVsID0gMTsKLQkJCWdvdF90bHMgPSAtMTAwMDsKLQkJCWlmIChpIDwgYXJnYy0xKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlpZiAoc1swXSAhPSAnLScpIHsKLQkJCQkJaWYgKCFzdHJjbXAocywgIlRNUCIpKSB7Ci0JCQkJCQlzdHVubmVsX3BlbSA9IE5VTEw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHVubmVsX3BlbSA9IHN0cmR1cChzKTsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3R1bm5lbF9wZW0gPSBzdHJkdXAoIlNBVkUiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN0dW5uZWxfcGVtID0gc3RyZHVwKCJTQVZFIik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc3R1bm5lbDMiKSkgewotCQkJdXNlX3N0dW5uZWwgPSAzOwotCQkJZ290X3RscyA9IC0xMDAwOwotCQkJaWYgKGkgPCBhcmdjLTEpIHsKLQkJCQljaGFyICpzID0gYXJndltpKzFdOwotCQkJCWlmIChzWzBdICE9ICctJykgewotCQkJCQlpZiAoIXN0cmNtcChzLCAiVE1QIikpIHsKLQkJCQkJCXN0dW5uZWxfcGVtID0gTlVMTDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0dW5uZWxfcGVtID0gc3RyZHVwKHMpOwotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHVubmVsX3BlbSA9IHN0cmR1cCgiU0FWRSIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3R1bm5lbF9wZW0gPSBzdHJkdXAoIlNBVkUiKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1odHRwcyIpKSB7Ci0JCQlodHRwc19wb3J0X251bSA9IDA7Ci0JCQl0cnlfaHR0cCA9IDE7Ci0JCQlnb3RfdGxzKys7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKHNbMF0gIT0gJy0nKSB7Ci0JCQkJCWh0dHBzX3BvcnRfbnVtID0gYXRvaShzKTsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1odHRwc3JlZGlyIikpIHsKLQkJCWh0dHBzX3BvcnRfcmVkaXIgPSAtMTsKLQkJCWdvdF90bHMrKzsKLQkJCWlmIChpIDwgYXJnYy0xKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlpZiAoc1swXSAhPSAnLScpIHsKLQkJCQkJaHR0cHNfcG9ydF9yZWRpciA9IGF0b2kocyk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9wdyIpKSB7Ci0JCQlub3B3ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zc2giKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc3NoX3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXVzZXB3IikpIHsKLQkJCXVzZXB3ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zdG9yZXBhc3N3ZCIpKSB7Ci0JCQlpZiAoYXJnYyA9PSBpKzEpIHsKLQkJCQlzdG9yZV9ob21lZGlyX3Bhc3N3ZChOVUxMKTsKLQkJCQlleGl0KDApOwotCQkJfQotCQkJaWYgKGFyZ2MgPT0gaSsyKSB7Ci0JCQkJc3RvcmVfaG9tZWRpcl9wYXNzd2QoYXJndltpKzFdKTsKLQkJCQlleGl0KDApOwotCQkJfQotCQkJaWYgKGFyZ2MgPj0gaSs0IHx8IHJmYkVuY3J5cHRBbmRTdG9yZVBhc3N3ZChhcmd2W2krMV0sCi0JCQkgICAgYXJndltpKzJdKSAhPSAwKSB7Ci0JCQkJcGVycm9yKCJzdG9yZXBhc3N3ZCIpOwotCQkJCWZwcmludGYoc3RkZXJyLCAiLXN0b3JlcGFzc3dkIGZhaWxlZCBmb3IgZmlsZTogJXNcbiIsCi0JCQkJICAgIGFyZ3ZbaSsyXSk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJzdG9yZWQgcGFzc3dkIGluIGZpbGU6ICVzXG4iLAotCQkJCSAgICBhcmd2W2krMl0pOwotCQkJCWV4aXQoMCk7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2hvd3JmYmF1dGgiKSkgewotCQkJaWYgKGFyZ2MgPj0gaSsyKSB7Ci0JCQkJY2hhciAqZiA9IGFyZ3ZbaSsxXTsKLQkJCQljaGFyICpzID0gcmZiRGVjcnlwdFBhc3N3ZEZyb21GaWxlKGYpOwotCQkJCWlmICghcykgewotCQkJCQlwZXJyb3IoInNob3dyZmJhdXRoIik7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAicmZiRGVjcnlwdFBhc3N3ZEZyb21GaWxlIGZhaWxlZDogJXNcbiIsIGYpOwotCQkJCQlleGl0KDEpOwotCQkJCX0KLQkJCQlmcHJpbnRmKHN0ZG91dCwgInJmYkRlY3J5cHRQYXNzd2RGcm9tRmlsZSBmaWxlOiAlc1xuIiwgZik7Ci0JCQkJZnByaW50ZihzdGRvdXQsICJyZmJEZWNyeXB0UGFzc3dkRnJvbUZpbGUgcGFzczogJXNcbiIsIHMpOwotCQkJfQotCQkJZXhpdCgwKTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYWNjZXB0IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWFjY2VwdF9jbWQgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1hZnRlcmFjY2VwdCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlhZnRlcmFjY2VwdF9jbWQgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1nb25lIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWdvbmVfY21kID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9zaG0iKSkgewotCQkJdXNpbmdfc2htID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1mbGlwYnl0ZW9yZGVyIikpIHsKLQkJCWZsaXBfYnl0ZV9vcmRlciA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItb25ldGlsZSIpKSB7Ci0JCQlzaW5nbGVfY29weXRpbGUgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNvbGlkIikpIHsKLQkJCXVzZV9zb2xpZF9iZyA9IDE7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKHNbMF0gIT0gJy0nKSB7Ci0JCQkJCXNvbGlkX3N0ciA9IHN0cmR1cChzKTsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghIHNvbGlkX3N0cikgewotCQkJCXNvbGlkX3N0ciA9IHN0cmR1cChzb2xpZF9kZWZhdWx0KTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ibGFja291dCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlibGFja291dF9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi14aW5lcmFtYSIpKSB7Ci0JCQl4aW5lcmFtYSA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm94aW5lcmFtYSIpKSB7Ci0JCQl4aW5lcmFtYSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICIteHRyYXAiKSkgewotCQkJeHRyYXBfaW5wdXQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXhyYW5kciIpKSB7Ci0JCQl4cmFuZHIgPSAxOwotCQkJaWYgKGkgPCBhcmdjLTEpIHsKLQkJCQljaGFyICpzID0gYXJndltpKzFdOwotCQkJCWlmIChrbm93bl94cmFuZHJfbW9kZShzKSkgewotCQkJCQl4cmFuZHJfbW9kZSA9IHN0cmR1cChzKTsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3hyYW5kciIpKSB7Ci0JCQl4cmFuZHIgPSAwOwotCQkJeHJhbmRyX21heWJlID0gMDsKLQkJCWdvdF9ub3hyYW5kciA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItcm90YXRlIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXJvdGF0aW5nX3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXBhZGdlb20iKQotCQkgICAgfHwgIXN0cmNtcChhcmcsICItcGFkZ2VvbWV0cnkiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcGFkX2dlb21ldHJ5ID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbyIpIHx8ICFzdHJjbXAoYXJnLCAiLWxvZ2ZpbGUiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJbG9nZmlsZV9hcHBlbmQgPSAwOwotCQkJbG9nZmlsZSA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW9hIikgfHwgIXN0cmNtcChhcmcsICItbG9nYXBwZW5kIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWxvZ2ZpbGVfYXBwZW5kID0gMTsKLQkJCWxvZ2ZpbGUgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1mbGFnIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWZsYWdmaWxlID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItcm1mbGFnIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXJtX2ZsYWdmaWxlID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItcmMiKSkgewotCQkJaSsrOwkvKiBkb25lIGFib3ZlICovCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9yYyIpKSB7Ci0JCQk7CS8qIGRvbmUgYWJvdmUgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1lbnYiKSkgewotCQkJaSsrOwkvKiBkb25lIGFib3ZlICovCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItcHJvZyIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlpZiAocHJvZ3JhbV9uYW1lKSB7Ci0JCQkJZnJlZShwcm9ncmFtX25hbWUpOwotCQkJfQotCQkJcHJvZ3JhbV9uYW1lID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItaCIpIHx8ICFzdHJjbXAoYXJnLCAiLWhlbHAiKSkgewotCQkJcHJpbnRfaGVscCgwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi0/IikgfHwgIXN0cmNtcChhcmcsICItb3B0cyIpKSB7Ci0JCQlwcmludF9oZWxwKDEpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLVYiKSB8fCAhc3RyY21wKGFyZywgIi12ZXJzaW9uIikpIHsKLQkJCWZwcmludGYoc3Rkb3V0LCAieDExdm5jOiAlc1xuIiwgbGFzdG1vZCk7Ci0JCQlleGl0KDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWxpY2Vuc2UiKSB8fAotCQkgICAgIXN0cmNtcChhcmcsICItY29weWluZyIpIHx8ICFzdHJjbXAoYXJnLCAiLXdhcnJhbnR5IikpIHsKLQkJCXByaW50X2xpY2Vuc2UoKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kYmciKSkgewotCQkJY3Jhc2hfZGVidWcgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vZGJnIikpIHsKLQkJCWNyYXNoX2RlYnVnID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1xIikgfHwgIXN0cmNtcChhcmcsICItcXVpZXQiKSkgewotCQkJcXVpZXQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vcXVpZXQiKSkgewotCQkJcXVpZXQgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSB8fCAhc3RyY21wKGFyZywgIi12ZXJib3NlIikpIHsKLQkJCXZlcmJvc2UgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWJnIikgfHwgIXN0cmNtcChhcmcsICItYmFja2dyb3VuZCIpKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU0VUU0lECi0JCQliZyA9IDE7Ci0JCQlvcHRzX2JnID0gYmc7Ci0jZWxzZQotCQkJaWYgKCFnb3RfaW5ldGQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IC1iZyBtb2RlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1vZHR3ZWFrIikpIHsKLQkJCXVzZV9tb2RpZmllcl90d2VhayA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9tb2R0d2VhayIpKSB7Ci0JCQl1c2VfbW9kaWZpZXJfdHdlYWsgPSAwOwotCQkJZ290X25vbW9kdHdlYWsgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWlzb2xldmVsMyIpKSB7Ci0JCQl1c2VfaXNvX2xldmVsMyA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICIteGtiIikpIHsKLQkJCXVzZV9tb2RpZmllcl90d2VhayA9IDE7Ci0JCQl1c2VfeGtiX21vZHR3ZWFrID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3hrYiIpKSB7Ci0JCQl1c2VfeGtiX21vZHR3ZWFrID0gMDsKLQkJCWdvdF9ub3hrYiA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY2Fwc2xvY2siKSkgewotCQkJd2F0Y2hfY2Fwc2xvY2sgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNraXBfbG9ja2tleXMiKSkgewotCQkJc2tpcF9sb2Nra2V5cyA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9za2lwX2xvY2trZXlzIikpIHsKLQkJCXNraXBfbG9ja2tleXMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXhrYmNvbXBhdCIpKSB7Ci0JCQl4a2Jjb21wYXQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNraXBfa2V5Y29kZXMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2tpcF9rZXljb2RlcyA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNsb3BweV9rZXlzIikpIHsKLQkJCXNsb3BweV9rZXlzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2tpcF9kdXBzIikpIHsKLQkJCXNraXBfZHVwbGljYXRlX2tleV9ldmVudHMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vc2tpcF9kdXBzIikpIHsKLQkJCXNraXBfZHVwbGljYXRlX2tleV9ldmVudHMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWFkZF9rZXlzeW1zIikpIHsKLQkJCWFkZF9rZXlzeW1zKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9hZGRfa2V5c3ltcyIpKSB7Ci0JCQlhZGRfa2V5c3ltcyA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY2xlYXJfbW9kcyIpKSB7Ci0JCQljbGVhcl9tb2RzID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1jbGVhcl9rZXlzIikpIHsKLQkJCWNsZWFyX21vZHMgPSAyOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWNsZWFyX2FsbCIpKSB7Ci0JCQljbGVhcl9tb2RzID0gMzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZW1hcCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlyZW1hcF9maWxlID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9yZXBlYXQiKSkgewotCQkJbm9fYXV0b3JlcGVhdCA9IDE7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKCpzID09ICctJykgewotCQkJCQlzKys7Ci0JCQkJfQotCQkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAoKnMpKSkgewotCQkJCQlub19yZXBlYXRfY291bnRkb3duID0gYXRvaShhcmd2WysraV0pOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZXBlYXQiKSkgewotCQkJbm9fYXV0b3JlcGVhdCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9mYiIpKSB7Ci0JCQlub2ZiID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2JlbGwiKSkgewotCQkJd2F0Y2hfYmVsbCA9IDA7Ci0JCQlzb3VuZF9iZWxsID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3NlbCIpKSB7Ci0JCQl3YXRjaF9zZWxlY3Rpb24gPSAwOwotCQkJd2F0Y2hfcHJpbWFyeSA9IDA7Ci0JCQl3YXRjaF9jbGlwYm9hcmQgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vcHJpbWFyeSIpKSB7Ci0JCQl3YXRjaF9wcmltYXJ5ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3NldHByaW1hcnkiKSkgewotCQkJc2V0X3ByaW1hcnkgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vY2xpcGJvYXJkIikpIHsKLQkJCXdhdGNoX2NsaXBib2FyZCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9zZXRjbGlwYm9hcmQiKSkgewotCQkJc2V0X2NsaXBib2FyZCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2VsZGlyIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNlbF9kaXJlY3Rpb24gPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1jdXJzb3IiKSkgewotCQkJc2hvd19jdXJzb3IgPSAxOwotCQkJaWYgKGkgPCBhcmdjLTEpIHsKLQkJCQljaGFyICpzID0gYXJndltpKzFdOwotCQkJCWlmIChrbm93bl9jdXJzb3JzX21vZGUocykpIHsKLQkJCQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKHMpOwotCQkJCQlpKys7Ci0JCQkJCWlmICghc3RyY21wKHMsICJub25lIikpIHsKLQkJCQkJCXNob3dfY3Vyc29yID0gMDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2N1cnNvciIpKSB7IAotCQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKCJub25lIik7Ci0JCQlzaG93X2N1cnNvciA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY3Vyc29yX2RyYWciKSkgeyAKLQkJCWN1cnNvcl9kcmFnX2NoYW5nZXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vY3Vyc29yX2RyYWciKSkgeyAKLQkJCWN1cnNvcl9kcmFnX2NoYW5nZXMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWFycm93IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWFsdF9hcnJvdyA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi14Zml4ZXMiKSkgeyAKLQkJCXVzZV94Zml4ZXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5veGZpeGVzIikpIHsgCi0JCQl1c2VfeGZpeGVzID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1hbHBoYWN1dCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlhbHBoYV90aHJlc2hvbGQgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYWxwaGFmcmFjIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWFscGhhX2ZyYWMgPSBhdG9mKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYWxwaGFyZW1vdmUiKSkgewotCQkJYWxwaGFfcmVtb3ZlID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2FscGhhYmxlbmQiKSkgewotCQkJYWxwaGFfYmxlbmQgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vY3Vyc29yc2hhcGUiKSkgewotCQkJY3Vyc29yX3NoYXBlX3VwZGF0ZXMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWN1cnNvcnBvcyIpKSB7Ci0JCQljdXJzb3JfcG9zX3VwZGF0ZXMgPSAxOwotCQkJZ290X2N1cnNvcnBvcyA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9jdXJzb3Jwb3MiKSkgewotCQkJY3Vyc29yX3Bvc191cGRhdGVzID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi14d2FycHBvaW50ZXIiKSkgewotCQkJdXNlX3h3YXJwcG9pbnRlciA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm94d2FycHBvaW50ZXIiKSkgewotCQkJdXNlX3h3YXJwcG9pbnRlciA9IDA7Ci0JCQlnb3Rfbm94d2FycHBvaW50ZXIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWFsd2F5c19pbmplY3QiKSkgewotCQkJYWx3YXlzX2luamVjdCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYnV0dG9ubWFwIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXBvaW50ZXJfcmVtYXAgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2RyYWdnaW5nIikpIHsKLQkJCXNob3dfZHJhZ2dpbmcgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLSNpZm5kZWYgTk9fTkNBQ0hFCi0JCWlmICghc3RyY21wKGFyZywgIi1uY2FjaGUiKSB8fCAhc3RyY21wKGFyZywgIi1uYyIpKSB7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKHNbMF0gIT0gJy0nKSB7Ci0JCQkJCW5jYWNoZSA9IGF0b2kocyk7Ci0JCQkJCWkrKzsKLQkJCQl9IGVsc2UgewotCQkJCQluY2FjaGUgPSBuY2FjaGVfZGVmYXVsdDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5jYWNoZSA9IG5jYWNoZV9kZWZhdWx0OwotCQkJfQotCQkJaWYgKG5jYWNoZSAlIDIgIT0gMCkgewotCQkJCW5jYWNoZSsrOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vbmNhY2hlIikgfHwgIXN0cmNtcChhcmcsICItbm9uYyIpKSB7Ci0JCQluY2FjaGUgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5jYWNoZV9jciIpIHx8ICFzdHJjbXAoYXJnLCAiLW5jX2NyIikpIHsKLQkJCW5jYWNoZV9jb3B5cmVjdCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbmNhY2hlX25vX21vdmVyYWlzZSIpIHx8ICFzdHJjbXAoYXJnLCAiLW5jX25vX21vdmVyYWlzZSIpKSB7Ci0JCQluY2FjaGVfd2ZfcmFpc2VzID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1uY2FjaGVfbm9fZHRjaGFuZ2UiKSB8fCAhc3RyY21wKGFyZywgIi1uY19ub19kdGNoYW5nZSIpKSB7Ci0JCQluY2FjaGVfZHRfY2hhbmdlID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1uY2FjaGVfbm9fcm9vdHBpeG1hcCIpIHx8ICFzdHJjbXAoYXJnLCAiLW5jX25vX3Jvb3RwaXhtYXAiKSkgewotCQkJbmNhY2hlX3hyb290cG1hcCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbmNhY2hlX2tlZXBfYW5pbXMiKSB8fCAhc3RyY21wKGFyZywgIi1uY19rZWVwX2FuaW1zIikpIHsKLQkJCW5jYWNoZV9rZWVwX2FuaW1zID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1uY2FjaGVfb2xkX3dtIikgfHwgIXN0cmNtcChhcmcsICItbmNfb2xkX3dtIikpIHsKLQkJCW5jYWNoZV9vbGRfd20gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5jYWNoZV9wYWQiKSB8fCAhc3RyY21wKGFyZywgIi1uY19wYWQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJbmNhY2hlX3BhZCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kZWJ1Z19uY2FjaGUiKSkgewotCQkJbmNkYisrOwotCQkJY29udGludWU7Ci0JCX0KLSNlbmRpZgotCQlpZiAoIXN0cmNtcChhcmcsICItd2lyZWZyYW1lIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLXdmIikpIHsKLQkJCXdpcmVmcmFtZSA9IDE7Ci0JCQlpZiAoaSA8IGFyZ2MtMSkgewotCQkJCWNoYXIgKnMgPSBhcmd2W2krMV07Ci0JCQkJaWYgKCpzICE9ICctJykgewotCQkJCQl3aXJlZnJhbWVfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQkJfQotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vd2lyZWZyYW1lIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLW5vd2YiKSkgewotCQkJd2lyZWZyYW1lID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3dpcmVmcmFtZWxvY2FsIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLW5vd2ZsIikpIHsKLQkJCXdpcmVmcmFtZV9sb2NhbCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItd2lyZWNvcHlyZWN0IikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLXdjciIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzZXRfd2lyZWNvcHlyZWN0X21vZGUoYXJndlsrK2ldKTsKLQkJCWdvdF93aXJlY29weXJlY3QgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vd2lyZWNvcHlyZWN0IikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLW5vd2NyIikpIHsKLQkJCXNldF93aXJlY29weXJlY3RfbW9kZSgibmV2ZXIiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kZWJ1Z193aXJlZnJhbWUiKQotCQkgICAgfHwgIXN0cmNtcChhcmcsICItZHdmIikpIHsKLQkJCWRlYnVnX3dpcmVmcmFtZSsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcm9sbGNvcHlyZWN0IikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLXNjciIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzZXRfc2Nyb2xsY29weXJlY3RfbW9kZShhcmd2WysraV0pOwotCQkJZ290X3Njcm9sbGNvcHlyZWN0ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3Njcm9sbGNvcHlyZWN0IikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLW5vc2NyIikpIHsKLQkJCXNldF9zY3JvbGxjb3B5cmVjdF9tb2RlKCJuZXZlciIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcl9hcmVhIikpIHsKLQkJCWludCB0bjsKLQkJCUNIRUNLX0FSR0MKLQkJCXRuID0gYXRvaShhcmd2WysraV0pOwotCQkJaWYgKHRuID49IDApIHsKLQkJCQlzY3JvbGxjb3B5cmVjdF9taW5fYXJlYSA9IHRuOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcl9za2lwIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNjcm9sbF9za2lwX3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcl9pbmMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2Nyb2xsX2dvb2Rfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2NyX2tleXMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2Nyb2xsX2tleV9saXN0X3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcl90ZXJtIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXNjcm9sbF90ZXJtX3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNjcl9rZXlyZXBlYXQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJbWF4X2tleXJlcGVhdF9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zY3JfcGFybXMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2Nyb2xsX2NvcHlyZWN0X3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWZpeHNjcmVlbiIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzY3JlZW5fZml4dXBfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZGVidWdfc2Nyb2xsIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLWRzIikpIHsKLQkJCWRlYnVnX3Njcm9sbCsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5veHJlY29yZCIpKSB7Ci0JCQlub3hyZWNvcmQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXBvaW50ZXJfbW9kZSIpCi0JCSAgICB8fCAhc3RyY21wKGFyZywgIi1wbSIpKSB7Ci0JCQljaGFyICpwLCAqczsKLQkJCUNIRUNLX0FSR0MKLQkJCXMgPSBhcmd2WysraV07Ci0JCQlpZiAoKHAgPSBzdHJjaHIocywgJzonKSkgIT0gTlVMTCkgewotCQkJCXVpX3NraXAgPSBhdG9pKHArMSk7Ci0JCQkJaWYgKCEgdWlfc2tpcCkgdWlfc2tpcCA9IDE7Ci0JCQkJKnAgPSAnXDAnOwotCQkJfQotCQkJaWYgKGF0b2kocykgPCAxIHx8IGF0b2kocykgPiBwb2ludGVyX21vZGVfbWF4KSB7Ci0JCQkJaWYgKCFnb3RfaW5ldGQpIHsKLQkJCQkJcmZiTG9nKCJwb2ludGVyX21vZGUgb3V0IG9mIHJhbmdlIDEtJWQ6ICVkXG4iLAotCQkJCQkgICAgcG9pbnRlcl9tb2RlX21heCwgYXRvaShzKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwb2ludGVyX21vZGUgPSBhdG9pKHMpOwotCQkJCWdvdF9wb2ludGVyX21vZGUgPSBwb2ludGVyX21vZGU7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItaW5wdXRfc2tpcCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl1aV9za2lwID0gYXRvaShhcmd2WysraV0pOwotCQkJaWYgKCEgdWlfc2tpcCkgdWlfc2tpcCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItYWxsaW5wdXQiKSkgewotCQkJYWxsX2lucHV0ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub2FsbGlucHV0IikpIHsKLQkJCWFsbF9pbnB1dCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItaW5wdXRfZWFnZXJseSIpKSB7Ci0JCQloYW5kbGVfZXZlbnRzX2VhZ2VybHkgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vaW5wdXRfZWFnZXJseSIpKSB7Ci0JCQloYW5kbGVfZXZlbnRzX2VhZ2VybHkgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNwZWVkcyIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzcGVlZHNfc3RyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItd21kdCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl3bWR0X3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRlYnVnX3BvaW50ZXIiKQotCQkgICAgfHwgIXN0cmNtcChhcmcsICItZHAiKSkgewotCQkJZGVidWdfcG9pbnRlcisrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRlYnVnX2tleWJvYXJkIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLWRrIikpIHsKLQkJCWRlYnVnX2tleWJvYXJkKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZGVidWdfeGRhbWFnZSIpKSB7Ci0JCQlkZWJ1Z194ZGFtYWdlKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZGVmZXIiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJZGVmZXJfdXBkYXRlID0gYXRvaShhcmd2WysraV0pOwotCQkJZ290X2RlZmVyID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zZXRkZWZlciIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzZXRfZGVmZXIgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItd2FpdCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl3YWl0bXMgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQlnb3Rfd2FpdG1zID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1leHRyYV9mYnVyIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWV4dHJhX2ZidXIgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItd2FpdF91aSIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl3YWl0X3VpID0gYXRvZihhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vd2FpdF9ib2ciKSkgewotCQkJd2FpdF9ib2cgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNsb3dfZmIiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJc2xvd19mYiA9IGF0b2YoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi14cmVmcmVzaCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQl4cmVmcmVzaCA9IGF0b2YoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZWFkdGltZW91dCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlyZmJNYXhDbGllbnRXYWl0ID0gYXRvaShhcmd2WysraV0pICogMTAwMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1waW5nIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXBpbmdfaW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbmFwIikpIHsKLQkJCXRha2VfbmFwcyA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9uYXAiKSkgewotCQkJdGFrZV9uYXBzID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zYiIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlzY3JlZW5fYmxhbmsgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9mYnBtIikpIHsKLQkJCXdhdGNoX2ZicG0gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWZicG0iKSkgewotCQkJd2F0Y2hfZmJwbSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9kcG1zIikpIHsKLQkJCXdhdGNoX2RwbXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRwbXMiKSkgewotCQkJd2F0Y2hfZHBtcyA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItZm9yY2VkcG1zIikpIHsKLQkJCWZvcmNlX2RwbXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWNsaWVudGRwbXMiKSkgewotCQkJY2xpZW50X2RwbXMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vc2VydmVyZHBtcyIpKSB7Ci0JCQlub191bHRyYV9kcG1zID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3VsdHJhZXh0IikpIHsKLQkJCW5vX3VsdHJhX2V4dCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItY2hhdHdpbmRvdyIpKSB7Ci0JCQljaGF0X3dpbmRvdyA9IDE7Ci0JCQlpZiAoYXJnY192bmMgKyAxIDwgYXJnY192bmNfbWF4KSB7Ci0JCQkJaWYgKCFnb3RfaW5ldGQpIHsKLQkJCQkJcmZiTG9nKCJzZXR0aW5nICctcmZidmVyc2lvbiAzLjYnIGZvciAtY2hhdHdpbmRvdy5cbiIpOwotCQkJCX0KLQkJCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cCgiLXJmYnZlcnNpb24iKTsKLQkJCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cCgiMy42Iik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICIteGRhbWFnZSIpKSB7Ci0JCQl1c2VfeGRhbWFnZSsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5veGRhbWFnZSIpKSB7Ci0JCQl1c2VfeGRhbWFnZSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICIteGRfYXJlYSIpKSB7Ci0JCQlpbnQgdG47Ci0JCQlDSEVDS19BUkdDCi0JCQl0biA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWlmICh0biA+PSAwKSB7Ci0JCQkJeGRhbWFnZV9tYXhfYXJlYSA9IHRuOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXhkX21lbSIpKSB7Ci0JCQlkb3VibGUgZjsKLQkJCUNIRUNLX0FSR0MKLQkJCWYgPSBhdG9mKGFyZ3ZbKytpXSk7Ci0JCQlpZiAoZiA+PSAwLjApIHsKLQkJCQl4ZGFtYWdlX21lbW9yeSA9IGY7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItc2lncGlwZSIpIHx8ICFzdHJjbXAoYXJnLCAiLXNpZyIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQlpZiAoa25vd25fc2lncGlwZV9tb2RlKGFyZ3ZbKytpXSkpIHsKLQkJCQlzaWdwaXBlID0gc3RyZHVwKGFyZ3ZbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLXNpZ3BpcGUgYXJnOiAlcywgbXVzdCIKLQkJCQkgICAgIiBiZSBcImlnbm9yZVwiIG9yIFwiZXhpdFwiXG4iLCBhcmd2W2ldKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJQVEhSRUFECi0JCWlmICghc3RyY21wKGFyZywgIi10aHJlYWRzIikpIHsKLSNpZiBkZWZpbmVkKFgxMVZOQ19USFJFQURFRCkKLQkJCXVzZV90aHJlYWRzID0gMTsKLSNlbHNlCi0JCQlpZiAoZ2V0ZW52KCJYMTFWTkNfVEhSRUFERUQiKSkgewotCQkJCXVzZV90aHJlYWRzID0gMTsKLQkJCX0gZWxzZSBpZiAoMSkgewotCQkJCS8qIHdlIHJlLWVuYWJsZSBpdCBkdWUgdG8gdGhyZWFkZWQgbW9kZSBidWdmaXhlcy4gKi8KLQkJCQl1c2VfdGhyZWFkcyA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZ290X2luZXRkKSB7Ci0JCQkJCXJmYkxvZygiXG4iKTsKLQkJCQkJcmZiTG9nKCJUaGUgLXRocmVhZHMgbW9kZSBpcyB1bnN0YWJsZSBhbmQgbm90IHRlc3RlZCBvciBtYWludGFpbmVkLlxuIik7Ci0JCQkJCXJmYkxvZygiSXQgaXMgZGlzYWJsZWQgaW4gdGhlIHNvdXJjZSBjb2RlLiAgSWYgeW91IHJlYWxseSBuZWVkXG4iKTsKLQkJCQkJcmZiTG9nKCJ0aGUgZmVhdHVyZSB5b3UgY2FuIHJlZW5hYmxlIGl0IGF0IGJ1aWxkIHRpbWUgYnkgc2V0dGluZ1xuIik7Ci0JCQkJCXJmYkxvZygiLURYMTFWTkNfVEhSRUFERUQgaW4gQ1BQRkxBR1MuIE9yIHNldCBYMTFWTkNfVEhSRUFERUQ9MVxuIik7Ci0JCQkJCXJmYkxvZygiaW4geW91ciBydW50aW1lIGVudmlyb25tZW50LlxuIik7Ci0JCQkJCXJmYkxvZygiXG4iKTsKLQkJCQkJdXNsZWVwKDUwMCoxMDAwKTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3RocmVhZHMiKSkgewotCQkJdXNlX3RocmVhZHMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLSNlbmRpZgotCQlpZiAoIXN0cmNtcChhcmcsICItZnMiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJZnNfZnJhYyA9IGF0b2YoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1nYXBzIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWdhcHNfZmlsbCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ncm93IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWdyb3dfZmlsbCA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1mdXp6IikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXRpbGVfZnV6eiA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kZWJ1Z190aWxlcyIpCi0JCSAgICB8fCAhc3RyY21wKGFyZywgIi1kYnQiKSkgewotCQkJZGVidWdfdGlsZXMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1kZWJ1Z19ncmFicyIpKSB7Ci0JCQlkZWJ1Z19ncmFicysrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRlYnVnX3NlbCIpKSB7Ci0JCQlkZWJ1Z19zZWwrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ncmFiX2J1c3RlciIpKSB7Ci0JCQlncmFiX2J1c3RlcisrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vZ3JhYl9idXN0ZXIiKSkgewotCQkJZ3JhYl9idXN0ZXIgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNuYXBmYiIpKSB7Ci0JCQl1c2Vfc25hcGZiID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yYW5kIikpIHsKLQkJCS8qIGVxdWl2LiB0byAtbm9wdyAtcmF3ZmIgcmFuZCBmb3IgcXVpY2sgdGVzdHMgKi8KLQkJCXJhd19mYl9zdHIgPSBzdHJkdXAoInJhbmQiKTsKLQkJCW5vcHcgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXJhd2ZiIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCXJhd19mYl9zdHIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWlmIChzdHJzdHIocmF3X2ZiX3N0ciwgInZuYzoiKSA9PSByYXdfZmJfc3RyKSB7Ci0JCQkJc2hhcmVkID0gMTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1mcmVxdGFiIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWZyZXF0YWIgPSBzdHJkdXAoYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1waXBlaW5wdXQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcGlwZWlucHV0X3N0ciA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY25vZGltIikpIHsKLQkJCW1hY29zeF9ub2RpbW1pbmcgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY25vc2xlZXAiKSkgewotCQkJbWFjb3N4X25vc2xlZXAgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY25vc2F2ZXIiKSkgewotCQkJbWFjb3N4X25vc2NyZWVuc2F2ZXIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY25vd2FpdCIpKSB7Ci0JCQltYWNvc3hfd2FpdF9mb3Jfc3dpdGNoID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1tYWN3aGVlbCIpKSB7Ci0JCQlDSEVDS19BUkdDCi0JCQltYWNvc3hfbW91c2Vfd2hlZWxfc3BlZWQgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbWFjbm9zd2FwIikpIHsKLQkJCW1hY29zeF9zd2FwMjMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY25vcmVzaXplIikpIHsKLQkJCW1hY29zeF9yZXNpemUgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW1hY2ljb25hbmltIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCW1hY29zeF9pY29uX2FuaW1fdGltZSA9IGF0b2koYXJndlsrK2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1tYWNtZW51IikpIHsKLQkJCW1hY29zeF9uY2FjaGVfbWFjbWVudSA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbWFjdXNrYmQiKSkgewotCQkJbWFjb3N4X3VzX2tiZCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbWFjbm9vcGVuZ2wiKSkgewotCQkJbWFjb3N4X25vX29wZW5nbCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbWFjbm9yYXdmYiIpKSB7Ci0JCQltYWNvc3hfbm9fcmF3ZmIgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWd1aSIpKSB7Ci0JCQlsYXVuY2hfZ3VpID0gMTsKLQkJCWlmIChpIDwgYXJnYy0xKSB7Ci0JCQkJY2hhciAqcyA9IGFyZ3ZbaSsxXTsKLQkJCQlpZiAoKnMgIT0gJy0nKSB7Ci0JCQkJCWd1aV9zdHIgPSBzdHJkdXAocyk7Ci0JCQkJCWlmIChzdHJzdHIoZ3VpX3N0ciwgInNldHAiKSkgewotCQkJCQkJZ290X2d1aV9wdyA9IDE7Ci0JCQkJCX0KLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1yZW1vdGUiKSB8fCAhc3RyY21wKGFyZywgIi1SIikKLQkJICAgIHx8ICFzdHJjbXAoYXJnLCAiLXIiKSB8fCAhc3RyY21wKGFyZywgIi1yZW1vdGUtY29udHJvbCIpKSB7Ci0JCQljaGFyICpzdHI7Ci0JCQlDSEVDS19BUkdDCi0JCQlpKys7Ci0JCQlzdHIgPSBhcmd2W2ldOwotCQkJaWYgKCpzdHIgPT0gJy0nKSB7Ci0JCQkJLyogYWNjaWRlbnRhbCBsZWFkaW5nICctJyAqLwotCQkJCXN0cisrOwotCQkJfQotCQkJaWYgKCFzdHJjbXAoc3RyLCAicGluZyIpKSB7Ci0JCQkJcXVlcnlfY21kID0gc3RyZHVwKHN0cik7Ci0JCQl9IGVsc2UgewotCQkJCXJlbW90ZV9jbWQgPSBzdHJkdXAoc3RyKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVfY21kICYmIHN0cmNocihyZW1vdGVfY21kLCAnOicpID09IE5VTEwpIHsKLQkJCSAgICAvKiBpbnRlcnByZXQgLVIgLXNjYWxlIDMvNCBhdCBsZWFzdCAqLwotCQkgCSAgICBpZiAoaSA8IGFyZ2MtMSAmJiAqKGFyZ3ZbaSsxXSkgIT0gJy0nKSB7Ci0JCQkJaW50IG47Ci0KLQkJCQkvKiBpdCBtdXN0IGJlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgKi8KLQkJCQlpKys7Ci0JCQkJbiA9IHN0cmxlbihyZW1vdGVfY21kKSArIHN0cmxlbihhcmd2W2ldKSArIDI7Ci0KLQkJCQlzdHIgPSAoY2hhciAqKSBtYWxsb2Mobik7Ci0JCQkJc3ByaW50ZihzdHIsICIlczolcyIsIHJlbW90ZV9jbWQsIGFyZ3ZbaV0pOwotCQkJCWZyZWUocmVtb3RlX2NtZCk7Ci0JCQkJcmVtb3RlX2NtZCA9IHN0cjsKLQkJCSAgICB9Ci0JCQl9Ci0JCQlpZiAoIWdldGVudigiUVVFUllfVkVSQk9TRSIpKSB7Ci0JCQkJcXVpZXQgPSAxOwotCQkJfQotCQkJeGtiY29tcGF0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1xdWVyeSIpIHx8ICFzdHJjbXAoYXJnLCAiLVEiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcXVlcnlfY21kID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlpZiAoIWdldGVudigiUVVFUllfVkVSQk9TRSIpKSB7Ci0JCQkJcXVpZXQgPSAxOwotCQkJfQotCQkJeGtiY29tcGF0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1xdWVyeV9yZXRyaWVzIikpIHsKLQkJCWNoYXIgKnM7Ci0JCQlDSEVDS19BUkdDCi0JCQlzID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQkvKiBuWzp0XVsvbWF0Y2hdICovCi0JCQlpZiAoc3RyY2hyKHMsICcvJykpIHsKLQkJCQljaGFyICpxID0gc3RyY2hyKHMsICcvJyk7Ci0JCQkJcXVlcnlfbWF0Y2ggPSBzdHJkdXAocSsxKTsKLQkJCQkqcSA9ICdcMCc7Ci0JCQl9Ci0JCQlpZiAoc3RyY2hyKHMsICc6JykpIHsKLQkJCQljaGFyICpxID0gc3RyY2hyKHMsICc6Jyk7Ci0JCQkJcXVlcnlfZGVsYXkgPSBhdG9mKHErMSk7Ci0JCQl9Ci0JCQlxdWVyeV9yZXRyaWVzID0gYXRvaShzKTsKLQkJCWZyZWUocyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItUUQiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcXVlcnlfY21kID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlxdWVyeV9kZWZhdWx0ID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1zeW5jIikpIHsKLQkJCXJlbW90ZV9zeW5jID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1ub3N5bmMiKSkgewotCQkJcmVtb3RlX3N5bmMgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXJlbW90ZV9wcmVmaXgiKSkgewotCQkJQ0hFQ0tfQVJHQwotCQkJcmVtb3RlX3ByZWZpeCA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLW5vcmVtb3RlIikpIHsKLQkJCWFjY2VwdF9yZW1vdGVfY21kcyA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICIteWVzcmVtb3RlIikpIHsKLQkJCWFjY2VwdF9yZW1vdGVfY21kcyA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItdW5zYWZlIikpIHsKLQkJCXNhZmVfcmVtb3RlX29ubHkgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXByaXZyZW1vdGUiKSkgewotCQkJcHJpdl9yZW1vdGUgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLXNhZmVyIikpIHsKLQkJCW1vcmVfc2FmZSA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChhcmcsICItbm9jbWRzIikpIHsKLQkJCW5vX2V4dGVybmFsX2NtZHMgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWFsbG93ZWRjbWRzIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWFsbG93ZWRfZXh0ZXJuYWxfY21kcyA9IHN0cmR1cChhcmd2WysraV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRlbnlfYWxsIikpIHsKLQkJCWRlbnlfYWxsID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghc3RyY21wKGFyZywgIi1odHRwZGlyIikpIHsKLQkJCUNIRUNLX0FSR0MKLQkJCWh0dHBfZGlyID0gc3RyZHVwKGFyZ3ZbKytpXSk7Ci0JCQlnb3RfaHR0cGRpciA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoMSkgewotCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWRlc2t0b3AiKSAmJiBpIDwgYXJnYy0xKSB7Ci0JCQkJZHQgPSAxOwotCQkJCXJmYl9kZXNrdG9wX25hbWUgPSBzdHJkdXAoYXJndltpKzFdKTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1wYXNzd2QiKSkgewotCQkJCXB3X2xvYyA9IGk7Ci0JCQkJZ290X3Bhc3N3ZCA9IDE7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChhcmcsICItcmZiYXV0aCIpKSB7Ci0JCQkJZ290X3JmYmF1dGggPSAxOwotCQkJfQotCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXJmYndhaXQiKSkgewotCQkJCWdvdF9yZmJ3YWl0ID0gMTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1kZWZlcnVwZGF0ZSIpKSB7Ci0JCQkJZ290X2RlZmVydXBkYXRlID0gMTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1yZmJwb3J0IikgJiYgaSA8IGFyZ2MtMSkgewotCQkJCWdvdF9yZmJwb3J0ID0gMTsKLQkJCQlpZiAoIXN0cmNhc2VjbXAoYXJndltpKzFdLCAicHJvbXB0IikpIHsKLQkJCQkJOwotCQkJCX0gZWxzZSBpZiAoIWlzX2RlY2ltYWwoYXJndltpKzFdKSkgewotCQkJCQlpZiAoIWdvdF9pbmV0ZCkgewotCQkJCQkJcmZiTG9nKCJJbnZhbGlkIC1yZmJwb3J0IHZhbHVlOiAnJXMnXG4iLCBhcmd2W2krMV0pOwotCQkJCQkJcmZiTG9nKCJzZXR0aW5nIGl0IHRvICctMScgdG8gaW5kdWNlIGZhaWx1cmUuXG4iKTsKLQkJCQkJCWFyZ3ZbaSsxXSA9IHN0cmR1cCgiLTEiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnb3RfcmZicG9ydF9zdHIgPSBzdHJkdXAoYXJndltpKzFdKTsKLQkJCQlnb3RfcmZicG9ydF9wb3MgPSBhcmdjX3ZuYysxOwotCQkJCWdvdF9yZmJwb3J0X3ZhbCA9IGF0b2koYXJndltpKzFdKTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1odHRwcG9ydCIpICYmIGkgPCBhcmdjLTEpIHsKLQkJCQlpZiAoIWlzX2RlY2ltYWwoYXJndltpKzFdKSkgewotCQkJCQlyZmJMb2coIkludmFsaWQgLWh0dHBwb3J0IHZhbHVlOiAnJXMnXG4iLCBhcmd2W2krMV0pOwotCQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1hbHdheXNzaGFyZWQgIikpIHsKLQkJCQlnb3RfYWx3YXlzc2hhcmVkID0gMTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1uZXZlcnNoYXJlZCIpKSB7Ci0JCQkJZ290X25ldmVyc2hhcmVkID0gMTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGFyZywgIi1saXN0ZW4iKSAmJiBpIDwgYXJnYy0xKSB7Ci0JCQkJbGlzdGVuX3N0ciA9IHN0cmR1cChhcmd2W2krMV0pOwotCQkJfQotCQkJLyogb3RoZXJ3aXNlIGNvcHkgaXQgZm9yIGxpYnZuY3NlcnZlciB1c2UgYmVsb3cuICovCi0JCQlpZiAoIXN0cmNtcChhcmcsICItdWx0cmFmaWxleGZlciIpKSB7Ci0JCQkJZ290X3VsdHJhZmlsZXhmZXIgPSAxOwotCQkJfSBlbHNlIGlmIChhcmdjX3ZuYyA8IGFyZ2Nfdm5jX21heCkgewotCQkJCWFyZ3Zfdm5jW2FyZ2Nfdm5jKytdID0gc3RyZHVwKGFyZyk7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZygidG9vIG1hbnkgYXJndW1lbnRzLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JfQotCi0JaWYgKCEgZ2V0ZW52KCJOT19MSUJYQ0JfQUxMT1dfU0xPUFBZX0xPQ0siKSkgewotCQkvKiBsaWJ4Y2IgaXMgYSBiaXQgdG9vIHN0cmljdCBmb3IgdXMgc29tZXRpbWVzLi4uICovCi0JCXNldF9lbnYoIkxJQlhDQl9BTExPV19TTE9QUFlfTE9DSyIsICIxIik7Ci0JfQotCi0JaWYgKGdldGVudigiUEFUSCIpID09IE5VTEwgfHwgIXN0cmNtcChnZXRlbnYoIlBBVEgiKSwgIiIpKSB7Ci0JCS8qIHNldCBhIG1pbmltYWwgUEFUSCwgdXN1YWxseSBvbmx5IG51bGwgaW4gaW5ldGQuICovCi0JCXNldF9lbnYoIlBBVEgiLCAiL2JpbjovdXNyL2JpbiIpOwotCX0KLQotCS8qIGhhbmRsZSAtZmluZGF1dGggY2FzZSBub3cgdGhhdCBjbWRsaW5lIGhhcyBiZWVuIHJlYWQgKi8KLQlpZiAoZ290X2ZpbmRhdXRoKSB7Ci0JCWNoYXIgKnM7Ci0JCWludCBpYyA9IDA7Ci0JCWlmICh1c2VfZHB5ICE9IE5VTEwpIHsKLQkJCXNldF9lbnYoIkRJU1BMQVkiLCB1c2VfZHB5KTsKLQkJfQotCQl1c2VfZHB5ID0gc3RyZHVwKCJXQUlUOmNtZD1GSU5ERElTUExBWS1ydW4iKTsKLQotCQlzID0gZ2V0ZW52KCJGSU5EQVVUSF9ESVNQTEFZIik7Ci0JCWlmIChzICYmIHN0cmNtcCgiIiwgcykpIHsKLQkJCXNldF9lbnYoIkRJU1BMQVkiLCBzKTsKLQkJfQotCQlzID0gZ2V0ZW52KCJESVNQTEFZIik7Ci0JCWlmIChzICYmIHN0cmNtcCgiIiwgcykpIHsKLQkJCXNldF9lbnYoIlgxMVZOQ19TS0lQX0RJU1BMQVkiLCBzKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9lbnYoIlgxMVZOQ19TS0lQX0RJU1BMQVkiLCAiOjAiKTsKLQkJfQotCQlzZXRfZW52KCJYMTFWTkNfU0tJUF9ESVNQTEFZX05FR0FURSIsICIxIik7Ci0JCXNldF9lbnYoIkZJTkRfRElTUExBWV9YQVVUSE9SSVRZX1BBVEgiLCAiMSIpOwotCQlzZXRfZW52KCJGSU5EX0RJU1BMQVlfTk9fU0hPV19YQVVUSCIsICIxIik7Ci0JCXNldF9lbnYoIkZJTkRfRElTUExBWV9OT19TSE9XX0RJU1BMQVkiLCAiMSIpOwotCQl3YWl0X2Zvcl9jbGllbnQoJmljLCBOVUxMLCAwKTsKLQkJZXhpdCgwKTsKLQl9Ci0KLQkvKiBzZXQgT1Mgc3RydWN0IFVUICovCi0JdW5hbWUoJlVUKTsKLQotCW9yaWdfdXNlX3hkYW1hZ2UgPSB1c2VfeGRhbWFnZTsKLQotCWlmICghYXV0b19wb3J0ICYmIGdldGVudigiQVVUT19QT1JUIikpIHsKLQkJYXV0b19wb3J0ID0gYXRvaShnZXRlbnYoIkFVVE9fUE9SVCIpKTsKLQl9Ci0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfTE9PUF9NT0RFIikpIHsKLQkJaWYgKGJnICYmICFnZXRlbnYoIlgxMVZOQ19MT09QX01PREVfQkciKSkgewotCQkJaWYgKCEgcXVpZXQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImRpc2FibGluZyAtYmcgaW4gLWxvb3AgIgotCQkJCSAgICAibW9kZVxuIik7Ci0JCQl9Ci0JCQliZyA9IDA7Ci0JCX0gZWxzZSBpZiAoIWJnICYmIGdldGVudigiWDExVk5DX0xPT1BfTU9ERV9CRyIpKSB7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiZW5hYmxpbmcgLWJnIGluIC1sb29wYmcgIgotCQkJCSAgICAibW9kZVxuIik7Ci0JCQl9Ci0JCQliZyA9IDE7Ci0JCX0KLQkJaWYgKGluZXRkKSB7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiZGlzYWJsaW5nIC1pbmV0ZCBpbiAtbG9vcCAiCi0JCQkJICAgICJtb2RlXG4iKTsKLQkJCX0KLQkJCWluZXRkID0gMDsKLQkJfQotCX0KLQotCWlmIChsYXVuY2hfZ3VpICYmIChxdWVyeV9jbWQgfHwgcmVtb3RlX2NtZCkpIHsKLQkJbGF1bmNoX2d1aSA9IDA7Ci0JCWd1aV9zdHIgPSBOVUxMOwotCX0KLQlpZiAobW9yZV9zYWZlKSB7Ci0JCWxhdW5jaF9ndWkgPSAwOwotCX0KLQotI2lmZGVmIE1BQ09TWAotCWlmICghIHVzZV9kcHkpIHsKLQkJLyogd2UgbmVlZCB0aGlzIGZvciBndWkgc2luY2Ugbm8gWCBwcm9wZXJ0aWVzICovCi0JCWlmICghY2xpZW50X2Nvbm5lY3RfZmlsZSAmJiAhY2xpZW50X2Nvbm5lY3QpIHsKLQkJCWNoYXIgKnVzZXIgPSBnZXRfdXNlcl9uYW1lKCk7Ci0JCQljaGFyICpzdHIgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHVzZXIpICsgc3RybGVuKCIvdG1wL3gxMXZuYy1tYWNvc3gtcmVtb3RlLiIpICsgMSk7Ci0JCQlzdHJ1Y3Qgc3RhdCBzYjsKLQkJCXNwcmludGYoc3RyLCAiL3RtcC94MTF2bmMtbWFjb3N4LXJlbW90ZS4lcyIsIHVzZXIpOwotCQkJaWYgKCFyZW1vdGVfY21kICYmICFxdWVyeV9jbWQpIHsKLQkJCQl1bmxpbmsoc3RyKTsKLQkJCQlpZiAoc3RhdChzdHIsICZzYikgIT0gMCkgewotCQkJCQlpbnQgZmQgPSBvcGVuKHN0ciwgT19XUk9OTFl8T19FWENMfE9fQ1JFQVQsIDA2MDApOwotCQkJCQlpZiAoZmQgPj0gMCkgewotCQkJCQkJY2xvc2UoZmQpOwotCQkJCQkJY2xpZW50X2Nvbm5lY3RfZmlsZSA9IHN0cjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2xpZW50X2Nvbm5lY3RfZmlsZSA9IHN0cjsKLQkJCX0KLQkJCWlmIChjbGllbnRfY29ubmVjdF9maWxlKSB7Ci0JCQkJaWYgKCFnb3RfaW5ldGQpIHsKLQkJCQkJcmZiTG9nKCJNYWNPUyBYOiBzZXQgLWNvbm5lY3QgZmlsZSB0byAlc1xuIiwgY2xpZW50X2Nvbm5lY3RfZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0JaWYgKGdvdF9yZmJwb3J0X3N0ciAhPSBOVUxMICYmICFzdHJjYXNlY21wKGdvdF9yZmJwb3J0X3N0ciwgInByb21wdCIpKSB7Ci0JCWNoYXIgKm9wdHMsIHRwb3J0WzMyXTsKLQotCQlpZiAoZ3VpX3N0cikgewotCQkJb3B0cyA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oZ3VpX3N0cikgKyAzMik7Ci0JCQlzcHJpbnRmKG9wdHMsICIlcyxwb3J0cHJvbXB0IiwgZ3VpX3N0cik7Ci0JCX0gZWxzZSB7Ci0JCQlvcHRzID0gc3RyZHVwKCJwb3J0cHJvbXB0Iik7Ci0JCX0KLQkJZ290X3JmYnBvcnRfdmFsID0gLTE7Ci0KLQkJZG9fZ3VpKG9wdHMsIDApOwotCQlpZiAoZ290X3JmYnBvcnRfdmFsID09IC0xKSB7Ci0JCQlyZmJMb2coIlBvcnQgcHJvbXB0IGluZGljYXRlZCBjYW5jZWwuXG4iKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKCFnb3RfaW5ldGQpIHsKLQkJCXJmYkxvZygiUG9ydCBwcm9tcHQgc2VsZWN0ZWQ6ICVkXG4iLCBnb3RfcmZicG9ydF92YWwpOwotCQl9Ci0JCXNwcmludGYodHBvcnQsICIlZCIsIGdvdF9yZmJwb3J0X3ZhbCk7Ci0JCWFyZ3Zfdm5jW2dvdF9yZmJwb3J0X3Bvc10gPSBzdHJkdXAodHBvcnQpOwotCQlmcmVlKG9wdHMpOwotCX0KLQotCXsKLQkJY2hhciBudW1bMzJdOwotCQlzcHJpbnRmKG51bSwgIiVkIiwgZ290X3JmYnBvcnRfdmFsKTsKLQkJc2V0X2VudigiWDExVk5DX0dPVF9SRkJQT1JUX1ZBTCIsIG51bSk7Ci0JfQotCi0JaWYgKGdvdF91bHRyYWZpbGV4ZmVyICYmIGFyZ2Nfdm5jICsgMiA8IGFyZ2Nfdm5jX21heCkgewotCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cCgiLXJmYnZlcnNpb24iKTsKLQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIjMuNiIpOwotCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cCgiLXBlcm1pdGZpbGV0cmFuc2ZlciIpOwotCX0KLQkKLQlpZiAobGF1bmNoX2d1aSkgewotCQlpbnQgc2xlZXAgPSAwOwotCQlpZiAoU0hPV19OT19QQVNTV09SRF9XQVJOSU5HICYmICFub3B3KSB7Ci0JCQlzbGVlcCA9IDE7Ci0JCX0KLQkJZG9fZ3VpKGd1aV9zdHIsIHNsZWVwKTsKLQl9Ci0JaWYgKGxvZ2ZpbGUpIHsKLQkJaW50IG47Ci0JCWNoYXIgKnBzdHIgPSAiJVZOQ0RJU1BMQVkiOwotCQlpZiAoc3Ryc3RyKGxvZ2ZpbGUsIHBzdHIpKSB7Ci0JCQljaGFyICpoID0gdGhpc19ob3N0KCk7Ci0JCQljaGFyICpzLCAqcSwgKm5ld2xvZzsKLQkJCWludCBuLCBwID0gZ290X3JmYnBvcnRfdmFsOwotCQkJLyogd2UgZG9uJ3QgcmVhbGx5IGtub3cgdGhlIHBvcnQgeWV0Li4uIHNvIGd1ZXNzICovCi0JCQlpZiAocCA8IDApIHsKLQkJCQlwID0gYXV0b19wb3J0OwotCQkJfQotCQkJaWYgKHAgPD0gMCkgewotCQkJCXAgPSA1OTAwOwotCQkJfQotCQkJcyA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oaCkgKyAzMik7Ci0JCQlzcHJpbnRmKHMsICIlczolZCIsIGgsIHApOwotCQkJbiA9IDE7Ci0JCQlxID0gbG9nZmlsZTsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJY2hhciAqdCA9IHN0cnN0cihxLCBwc3RyKTsKLQkJCQlpZiAoIXQpIGJyZWFrOwotCQkJCW4rKzsKLQkJCQlxID0gdCsxOyAKLQkJCX0KLQkJCW5ld2xvZyA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9nZmlsZSkgKyBuICogc3RybGVuKHBzdHIpKTsKLQkJCW5ld2xvZ1swXSA9ICdcMCc7Ci0KLQkJCXEgPSBsb2dmaWxlOwotCQkJd2hpbGUgKDEpIHsKLQkJCQljaGFyICp0ID0gc3Ryc3RyKHEsIHBzdHIpOwotCQkJCWlmICghdCkgewotCQkJCQlzdHJjYXQobmV3bG9nLCBxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXN0cm5jYXQobmV3bG9nLCBxLCB0IC0gcSk7Ci0JCQkJc3RyY2F0KG5ld2xvZywgcyk7Ci0JCQkJcSA9IHQgKyBzdHJsZW4ocHN0cik7IAotCQkJfQotCQkJbG9nZmlsZSA9IG5ld2xvZzsKLQkJCWlmICghcXVpZXQgJiYgIWdvdF9pbmV0ZCkgewotCQkJCXJmYkxvZygiRXhwYW5kZWQgbG9nZmlsZSB0byAnJXMnXG4iLCBuZXdsb2cpOwotCQkJCQotCQkJfQotCQkJZnJlZShzKTsKLQkJfQotCQlwc3RyID0gIiVIT01FIjsKLQkJaWYgKHN0cnN0cihsb2dmaWxlLCBwc3RyKSkgewotCQkJY2hhciAqaCA9IGdldF9ob21lX2RpcigpOwotCQkJY2hhciAqcywgKnEsICpuZXdsb2c7Ci0KLQkJCXMgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGgpICsgMzIpOwotCQkJc3ByaW50ZihzLCAiJXMiLCBoKTsKLQkJCW4gPSAxOwotCQkJcSA9IGxvZ2ZpbGU7Ci0JCQl3aGlsZSAoMSkgewotCQkJCWNoYXIgKnQgPSBzdHJzdHIocSwgcHN0cik7Ci0JCQkJaWYgKCF0KSBicmVhazsKLQkJCQluKys7Ci0JCQkJcSA9IHQrMTsgCi0JCQl9Ci0JCQluZXdsb2cgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvZ2ZpbGUpICsgbiAqIHN0cmxlbihwc3RyKSk7Ci0JCQluZXdsb2dbMF0gPSAnXDAnOwotCi0JCQlxID0gbG9nZmlsZTsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJY2hhciAqdCA9IHN0cnN0cihxLCBwc3RyKTsKLQkJCQlpZiAoIXQpIHsKLQkJCQkJc3RyY2F0KG5ld2xvZywgcSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzdHJuY2F0KG5ld2xvZywgcSwgdCAtIHEpOwotCQkJCXN0cmNhdChuZXdsb2csIHMpOwotCQkJCXEgPSB0ICsgc3RybGVuKHBzdHIpOyAKLQkJCX0KLQkJCWxvZ2ZpbGUgPSBuZXdsb2c7Ci0JCQlpZiAoIXF1aWV0ICYmICFnb3RfaW5ldGQpIHsKLQkJCQlyZmJMb2coIkV4cGFuZGVkIGxvZ2ZpbGUgdG8gJyVzJ1xuIiwgbmV3bG9nKTsKLQkJCX0KLQkJCWZyZWUocyk7Ci0JCX0KLQotCQlpZiAobG9nZmlsZV9hcHBlbmQpIHsKLQkJCW4gPSBvcGVuKGxvZ2ZpbGUsIE9fV1JPTkxZfE9fQ1JFQVR8T19BUFBFTkQsIDA2NjYpOwotCQl9IGVsc2UgewotCQkJbiA9IG9wZW4obG9nZmlsZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKLQkJfQotCQlpZiAobiA8IDApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3Igb3BlbmluZyBsb2dmaWxlOiAlc1xuIiwgbG9nZmlsZSk7Ci0JCQlwZXJyb3IoIm9wZW4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJaWYgKGR1cDIobiwgMikgPCAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImR1cDIgZmFpbGVkXG4iKTsKLQkJCXBlcnJvcigiZHVwMiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAobiA+IDIpIHsKLQkJCWNsb3NlKG4pOwotCQl9Ci0JfQotCWlmIChpcHY2X2xpc3RlbikgewotCQlpZiAoaW5ldGQpIHsKLQkJCWlwdjZfbGlzdGVuID0gMDsKLQkJfQotCX0KLQlpZiAoaW5ldGQgJiYgcXVpZXQgJiYgIWxvZ2ZpbGUpIHsKLQkJaW50IG47Ci0JCS8qCi0JCSAqIFJlZGlyIHN0ZGVyciB0byAvZGV2L251bGwgdW5kZXIgLWluZXRkIGFuZCAtcXVpZXQKLQkJICogYnV0IG5vIC1vIGxvZ2ZpbGUuICBUeXBpY2FsIHByb2JsZW06Ci0JCSAqICAgWGxpYjogIGV4dGVuc2lvbiAiUkVDT1JEIiBtaXNzaW5nIG9uIGRpc3BsYXkgIjoxLjAiLgotCQkgKiBJZiB0aGV5IHdhbnQgdGhpcyBpbmZvLCB0aGV5IHNob3VsZCB1c2UgLW8gbG9nZmlsZSwKLQkJICogb3Igbm8gLXEgYW5kIDI+bG9nZmlsZS4KLQkJICovCi0JCW4gPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7Ci0JCWlmIChuID49IDApIHsKLQkJCWlmIChkdXAyKG4sIDIpID49IDApIHsKLQkJCQlpZiAobiA+IDIpIHsKLQkJCQkJY2xvc2Uobik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmICghIHF1aWV0ICYmICEgaW5ldGQpIHsKLQkJaW50IGk7Ci0JCWlmIChodHRwX29uZXBvcnRfbXNnKSB7Ci0JCQlyZmJMb2coInNldHRpbmcgJy1lbmMgbm9uZScgZm9yIC1odHRwX29uZXBvcnQgbW9kZS5cbiIpOwotCQl9Ci0JCWZvciAoaT0xOyBpIDwgYXJnY192bmM7IGkrKykgewotCQkJcmZiTG9nKCJwYXNzaW5nIGFyZyB0byBsaWJ2bmNzZXJ2ZXI6ICVzXG4iLCBhcmd2X3ZuY1tpXSk7Ci0JCQlpZiAoIXN0cmNtcChhcmd2X3ZuY1tpXSwgIi1wYXNzd2QiKSkgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChyZW1vdGVfY21kIHx8IHF1ZXJ5X2NtZCkgewotCQkvKgotCQkgKiBubyBuZWVkIHRvIG9wZW4gRElTUExBWSwganVzdCB3cml0ZSBpdCB0byB0aGUgZmlsZSBub3cKLQkJICogc2ltaWxhciBmb3IgcXVlcnlfZGVmYXVsdC4KLQkJICovCi0JCWlmIChjbGllbnRfY29ubmVjdF9maWxlIHx8IHF1ZXJ5X2RlZmF1bHQpIHsKLQkJCWludCBpLCByYyA9IDE7Ci0JCQlmb3IgKGk9MDsgaSA8PSBxdWVyeV9yZXRyaWVzOyBpKyspIHsKLQkJCQlyYyA9IGRvX3JlbW90ZV9xdWVyeShyZW1vdGVfY21kLCBxdWVyeV9jbWQsCi0JCQkJICAgIHJlbW90ZV9zeW5jLCBxdWVyeV9kZWZhdWx0KTsKLQkJCQlpZiAocmMgPT0gMCkgewotCQkJCQlpZiAocXVlcnlfbWF0Y2gpIHsKLQkJCQkJCWlmIChxdWVyeV9yZXN1bHQgJiYgc3Ryc3RyKHF1ZXJ5X3Jlc3VsdCwgcXVlcnlfbWF0Y2gpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlyYyA9IDE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaSA8IHF1ZXJ5X3JldHJpZXMpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJzbGVlcDogJS4zZlxuIiwgcXVlcnlfZGVsYXkpOwotCQkJCQl1c2xlZXAoIChpbnQpIChxdWVyeV9kZWxheSAqIDEwMDAgKiAxMDAwKSApOwotCQkJCX0KLQkJCX0KLQkJCWZmbHVzaChzdGRlcnIpOwotCQkJZmZsdXNoKHN0ZG91dCk7Ci0JCQlleGl0KHJjKTsKLQkJfQotCX0KLQotCWlmICh1c2VwdyAmJiAhIGdvdF9yZmJhdXRoICYmICEgZ290X3Bhc3N3ZCAmJiAhIGdvdF9wYXNzd2RmaWxlICYmICF1bml4cHcpIHsKLQkJY2hhciAqZiwgKmggPSBnZXRlbnYoIkhPTUUiKTsKLQkJc3RydWN0IHN0YXQgc2J1ZjsKLQkJaW50IGZvdW5kID0gMCwgc2V0X3JmYmF1dGggPSAwOwotCi0JCWlmICghaCkgewotCQkJcmZiTG9nKCJIT01FIHVuc2V0IGluIC11c2VwdyBtb2RlLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWYgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGgpK3N0cmxlbigiLy52bmMvcGFzc3dkZmlsZSIpICsgMSk7Ci0KLQkJc3ByaW50ZihmLCAiJXMvLnZuYy9wYXNzd2QiLCBoKTsKLQkJaWYgKHN0YXQoZiwgJnNidWYpID09IDApIHsKLQkJCWZvdW5kID0gMTsKLQkJCWlmICghIHF1aWV0KSB7Ci0JCQkJcmZiTG9nKCItdXNlcHc6IGZvdW5kICVzXG4iLCBmKTsKLQkJCX0KLQkJCWdvdF9yZmJhdXRoID0gMTsKLQkJCXNldF9yZmJhdXRoID0gMTsKLQkJfQotCi0JCXNwcmludGYoZiwgIiVzLy52bmMvcGFzc3dkZmlsZSIsIGgpOwotCQlpZiAoISBmb3VuZCAmJiBzdGF0KGYsICZzYnVmKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCXJmYkxvZygiLXVzZXB3OiBmb3VuZCAlc1xuIiwgZik7Ci0JCQl9Ci0JCQlnb3RfcGFzc3dkZmlsZSA9IDE7Ci0JCQlwYXNzd2RmaWxlID0gc3RyZHVwKGYpOwotCQl9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1dBSVRfSAotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1dBSVRQSUQKLQkJaWYgKCEgZm91bmQpIHsKLQkJCXBpZF90IHBpZCA9IGZvcmsoKTsKLQkJCWlmIChwaWQgPCAwKSB7Ci0JCQkJOwotCQkJfSBlbHNlIGlmIChwaWQgPT0gMCkgewotCQkJCWV4ZWNscChhcmd2WzBdLCBhcmd2WzBdLCAiLXN0b3JlcGFzc3dkIiwKLQkJCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHM7Ci0JCQkJd2FpdHBpZChwaWQsICZzLCAwKTsgCi0JCQkJaWYgKFdJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwKSB7Ci0JCQkJCWdvdF9yZmJhdXRoID0gMTsKLQkJCQkJc2V0X3JmYmF1dGggPSAxOwotCQkJCQlmb3VuZCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLQkJaWYgKHNldF9yZmJhdXRoKSB7Ci0JCQlzcHJpbnRmKGYsICIlcy8udm5jL3Bhc3N3ZCIsIGgpOwotCQkJaWYgKGFyZ2Nfdm5jIDwgMTAwKSB7Ci0JCQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIi1yZmJhdXRoIik7Ci0JCQl9IGVsc2UgewotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlpZiAoYXJnY192bmMgPCAxMDApIHsKLQkJCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cChmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJfQotCQlpZiAoISBmb3VuZCkgewotCQkJZnByaW50ZihzdGRlcnIsICJ4MTF2bmMgLXVzZXB3OiBjb3VsZCBub3QgZmluZCIKLQkJCSAgICAiIGEgcGFzc3dvcmQgdG8gdXNlLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWZyZWUoZik7Ci0JfQotCi0JaWYgKGdvdF9yZmJhdXRoICYmIChnb3RfcGFzc3dkIHx8IGdvdF92aWV3cGFzc3dkIHx8IGdvdF9wYXNzd2RmaWxlKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIm9wdGlvbiAtcmZiYXV0aCBpcyBpbmNvbXBhdGlibGUgd2l0aDpcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgIC1wYXNzd2QsIC12aWV3cGFzc3dkLCBhbmQgLXBhc3N3ZGZpbGVcbiIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoZ290X3Bhc3N3ZGZpbGUgJiYgKGdvdF9wYXNzd2QgfHwgZ290X3ZpZXdwYXNzd2QpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAib3B0aW9uIC1wYXNzd2RmaWxlIGlzIGluY29tcGF0aWJsZSB3aXRoOlxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgLXBhc3N3ZCBhbmQgLXZpZXdwYXNzd2RcbiIpOwotCQlleGl0KDEpOwotCX0KLQotCS8qCi0JICogSWYgLXBhc3N3ZCB3YXMgdXNlZCwgY2xlYXIgaXQgb3V0IG9mIGFyZ3YuICBUaGlzIGRvZXMgbm90Ci0JICogd29yayBvbiBhbGwgVU5JWCwgaGF2ZSB0byB1c2UgZXhlY3ZwKCkgaW4gZ2VuZXJhbC4uLgotCSAqLwotCWlmIChwd19sb2MgPiAwKSB7Ci0JCWludCBpOwotCQlmb3IgKGk9cHdfbG9jOyBpIDw9IHB3X2xvYysxOyBpKyspIHsKLQkJCWlmIChpIDwgYXJnYykgewotCQkJCWNoYXIgKnAgPSBhcmd2W2ldOwkJCi0JCQkJc3RyemVybyhwKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocGFzc3dkZmlsZSkgewotCQkvKiByZWFkIHBhc3N3ZChzKSBmcm9tIGZpbGUgKi8KLQkJaWYgKHN0cnN0cihwYXNzd2RmaWxlLCAiY21kOiIpID09IHBhc3N3ZGZpbGUgfHwKLQkJICAgIHN0cnN0cihwYXNzd2RmaWxlLCAiY3VzdG9tOiIpID09IHBhc3N3ZGZpbGUpIHsKLQkJCWNoYXIgdHN0clsxMDBdLCAqcTsKLQkJCXNwcmludGYodHN0ciwgIiVmIiwgZG5vdygpKTsKLQkJCWlmICgocSA9IHN0cnJjaHIodHN0ciwgJy4nKSkgPT0gTlVMTCkgewotCQkJCXEgPSB0c3RyOwotCQkJfSBlbHNlIHsKLQkJCQlxKys7Ci0JCQl9Ci0JCQkvKiBuZXZlciB1c2VkIHVuZGVyIGNtZDosIHVzZWQgdG8gZm9yY2UgYXV0aCAqLwotCQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIi1wYXNzd2QiKTsKLQkJCWFyZ3Zfdm5jW2FyZ2Nfdm5jKytdID0gc3RyZHVwKHEpOwotCQl9IGVsc2UgaWYgKHJlYWRfcGFzc3dkcyhwYXNzd2RmaWxlKSkgewotCQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIi1wYXNzd2QiKTsKLQkJCWFyZ3Zfdm5jW2FyZ2Nfdm5jKytdID0gc3RyZHVwKHBhc3N3ZF9saXN0WzBdKTsKLQkJfQotCQlnb3RfcGFzc3dkID0gMTsKLQkJcHdfbG9jID0gMTAwOwkvKiBqdXN0IGZvciBwd19sb2MgY2hlY2sgYmVsb3cgKi8KLQl9Ci0JaWYgKHZwd19sb2MgPiAwKSB7Ci0JCWludCBpOwotCQlmb3IgKGk9dnB3X2xvYzsgaSA8PSB2cHdfbG9jKzE7IGkrKykgewotCQkJaWYgKGkgPCBhcmdjKSB7Ci0JCQkJY2hhciAqcCA9IGFyZ3ZbaV07CQkKLQkJCQlzdHJ6ZXJvKHApOwotCQkJfQotCQl9Ci0JfQotI2lmZGVmIEhBUkRXSVJFX1BBU1NXRAotCWlmICghZ290X3JmYmF1dGggJiYgIWdvdF9wYXNzd2QpIHsKLQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIi1wYXNzd2QiKTsKLQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoSEFSRFdJUkVfUEFTU1dEKTsKLQkJZ290X3Bhc3N3ZCA9IDE7Ci0JCXB3X2xvYyA9IDEwMDsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBIQVJEV0lSRV9WSUVXUEFTU1dECi0JaWYgKCFnb3RfcmZiYXV0aCAmJiBnb3RfcGFzc3dkICYmICF2aWV3b25seV9wYXNzd2QgJiYgIXBhc3N3ZF9saXN0KSB7Ci0JCXZpZXdvbmx5X3Bhc3N3ZCA9IHN0cmR1cChIQVJEV0lSRV9WSUVXUEFTU1dEKTsKLQl9Ci0jZW5kaWYKLQlpZiAodmlld29ubHlfcGFzc3dkICYmIHB3X2xvYyA8IDApIHsKLQkJcmZiTG9nKCItcGFzc3dkIG11c3QgYmUgc3VwcGxpZWQgd2hlbiB1c2luZyAtdmlld3Bhc3N3ZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmICgxKSB7Ci0JCS8qIG1peCB0aGluZ3MgdXAgYSBsaXR0bGUgYml0ICovCi0JCXVuc2lnbmVkIGNoYXIgYnVmW0NIQUxMRU5HRVNJWkVdOwotCQlpbnQgaywga21heCA9IChpbnQpICg1MCAqIHJmYWMoKSkgKyAxMDsKLQkJZm9yIChrPTA7IGsgPCBrbWF4OyBrKyspIHsKLQkJCXJmYlJhbmRvbUJ5dGVzKGJ1Zik7Ci0JCX0KLQl9Ci0KLQlpZiAoU0hPV19OT19QQVNTV09SRF9XQVJOSU5HKSB7Ci0JCWNoYXIgbWVzc2FnZVtdID0gIi1yZmJhdXRoLCAtcGFzc3dkZmlsZSwgLXBhc3N3ZCBwYXNzd29yZCwgIgotCQkgICAgIm9yIC11bml4cHcgcmVxdWlyZWQuIjsKLQkJaWYgKCEgbm9wdykgewotCQkJbm9wYXNzd29yZF93YXJuaW5nX21zZyhnb3RfbG9jYWxob3N0KTsKLQkJfQotI2lmIFBBU1NXRF9SRVFVSVJFRAotCQlyZmJMb2coIiVzXG4iLCBtZXNzYWdlKTsKLQkJZXhpdCgxKTsKLSNlbmRpZgotI2lmIFBBU1NXRF9VTkxFU1NfTk9QVwotCQlpZiAoISBub3B3KSB7Ci0JCQlyZmJMb2coIiVzXG4iLCBtZXNzYWdlKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLSNlbmRpZgotCQltZXNzYWdlWzBdID0gJ1wwJzsJLyogYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLwotCX0KLQotCWlmIChtb3JlX3NhZmUpIHsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygiLXNhZmVyIG1vZGU6XG4iKTsKLQkJCXJmYkxvZygiICAgdm5jX2Nvbm5lY3Q9MFxuIik7Ci0JCQlyZmJMb2coIiAgIGFjY2VwdF9yZW1vdGVfY21kcz0wXG4iKTsKLQkJCXJmYkxvZygiICAgc2FmZV9yZW1vdGVfb25seT0xXG4iKTsKLQkJCXJmYkxvZygiICAgbGF1bmNoX2d1aT0wXG4iKTsKLQkJfQotCQl2bmNfY29ubmVjdCA9IDA7Ci0JCWFjY2VwdF9yZW1vdGVfY21kcyA9IDA7Ci0JCXNhZmVfcmVtb3RlX29ubHkgPSAxOwotCQlsYXVuY2hfZ3VpID0gMDsKLQl9Ci0KLQlpZiAodXNlcnNfbGlzdCAmJiBzdHJjaHIodXNlcnNfbGlzdCwgJy4nKSkgewotCQljaGFyICpwLCAqcSwgKnRtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4odXNlcnNfbGlzdCkrMSk7Ci0JCWNoYXIgKnN0ciA9IHN0cmR1cCh1c2Vyc19saXN0KTsKLQkJaW50IGksIG4sIGRiID0gMTsKLQotCQl0bXBbMF0gPSAnXDAnOwotCi0JCW4gPSBzdHJsZW4odXNlcnNfbGlzdCkgKyAxOwotCQl1c2VyMmdyb3VwID0gKGNoYXIgKiopIG1hbGxvYyhuICogc2l6ZW9mKGNoYXIgKikpOwotCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJCXVzZXIyZ3JvdXBbaV0gPSBOVUxMOwotCQl9Ci0KLQkJaSA9IDA7Ci0JCXAgPSBzdHJ0b2soc3RyLCAiLCIpOwotCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAidXNlcnNfbGlzdDogJXNcbiIsIHVzZXJzX2xpc3QpOwotCQl3aGlsZSAocCkgewotCQkJaWYgKHRtcFswXSAhPSAnXDAnKSB7Ci0JCQkJc3RyY2F0KHRtcCwgIiwiKTsKLQkJCX0KLQkJCXEgPSBzdHJjaHIocCwgJy4nKTsKLQkJCWlmIChxKSB7Ci0JCQkJY2hhciAqcyA9IHN0cmNocihwLCAnPScpOwotCQkJCWlmICghIHMpIHsKLQkJCQkJcyA9IHA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcysrOwotCQkJCX0KLQkJCQlpZiAoc1swXSA9PSAnKycpIHMrKzsKLQkJCQl1c2VyMmdyb3VwW2krK10gPSBzdHJkdXAocyk7Ci0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInUyZzogJXNcbiIsIHMpOwotCQkJCSpxID0gJ1wwJzsKLQkJCX0KLQkJCXN0cmNhdCh0bXAsIHApOwotCQkJcCA9IHN0cnRvayhOVUxMLCAiLCIpOwotCQl9Ci0JCWZyZWUoc3RyKTsKLQkJdXNlcnNfbGlzdCA9IHRtcDsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgInVzZXJzX2xpc3Q6ICVzXG4iLCB1c2Vyc19saXN0KTsKLQl9Ci0KLQlpZiAoZ290X3RscyA+IDAgJiYgIXVzZV9vcGVuc3NsKSB7Ci0JCXJmYkxvZygiU1NMOiBFcnJvcjogeW91IGRpZCBub3Qgc3VwcGx5IHRoZSAnLXNzbCAuLi4nIG9wdGlvbiBldmVuXG4iKTsKLQkJcmZiTG9nKCJTU0w6IHRob3VnaCB5b3Ugc3VwcGxpZWQgb25lIG9mIHRoZXNlIHJlbGF0ZWQgb3B0aW9uczpcbiIpOwotCQlyZmJMb2coIlNTTDogICAtc3Nsb25seSwgLXNzbHZlcmlmeSwgLXNzbENSTCwgLXZlbmNyeXB0LCAtYW5vbnRscyxcbiIpOwotCQlyZmJMb2coIlNTTDogICAtZGhwYXJhbXMsIC1odHRwcywgLWh0dHBfc3NsLCBvciAtaHR0cHNyZWRpci5cbiIpOwotCQlyZmJMb2coIlNTTDogUmVzdGFydCB3aXRoLCBmb3IgZXhhbXBsZSwgJy1zc2wgU0FWRScgb24gdGhlIGNtZCBsaW5lLlxuIik7Ci0JCXJmYkxvZygiU1NMOiBTZWUgdGhlICctc3NsJyB4MTF2bmMgLWhlbHAgZGVzY3JpcHRpb24gZm9yIG1vcmUgaW5mby5cbiIpOwotCQlpZiAoIWdldGVudigiWDExVk5DX0ZPUkNFX05PX09QRU5TU0wiKSkgewotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQotCWlmICh1bml4cHcpIHsKLQkJaWYgKGluZXRkKSB7Ci0JCQl1c2Vfc3R1bm5lbCA9IDA7Ci0JCX0KLQkJaWYgKCEgdXNlX3N0dW5uZWwgJiYgISB1c2Vfb3BlbnNzbCkgewotCQkJaWYgKGdldGVudigiVU5JWFBXX0RJU0FCTEVfU1NMIikpIHsKLQkJCQlyZmJMb2coIlNraXBwaW5nIC1zc2wvLXN0dW5uZWwgcmVxdWlyZW1lbnQiCi0JCQkJICAgICIgZHVlIHRvXG4iKTsKLQkJCQlyZmJMb2coIlVOSVhQV19ESVNBQkxFX1NTTCBzZXR0aW5nLlxuIik7Ci0KLQkJCQlpZiAoIWdldGVudigiVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUIikpIHsKLQkJCQkJaWYgKCFnb3RfbG9jYWxob3N0KSB7Ci0JCQkJCQlyZmJMb2coIkZvcmNpbmcgLWxvY2FsaG9zdCBtb2RlLlxuIik7Ci0JCQkJCX0KLQkJCQkJYWxsb3dfbGlzdCA9IHN0cmR1cCgiMTI3LjAuMC4xIik7Ci0JCQkJCWdvdF9sb2NhbGhvc3QgPSAxOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaGF2ZV9zc2hfZW52KCkpIHsKLQkJCQljaGFyICpzID0gZ2V0ZW52KCJTU0hfQ09OTkVDVElPTiIpOwotCQkJCWlmICghIHMpIHMgPSBnZXRlbnYoIlNTSF9DTElFTlQiKTsKLQkJCQlpZiAoISBzKSBzID0gIlNTSF9DT05ORUNUSU9OIjsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQkJcmZiTG9nKCJTa2lwcGluZyAtc3NsLy1zdHVubmVsIGNvbnN0cmFpbnQgaW4iCi0JCQkJICAgICIgLXVuaXhwdyBtb2RlLFxuIik7Ci0JCQkJcmZiTG9nKCJhc3N1bWluZyB5b3VyIFNTSCBlbmNyeXB0aW9uIgotCQkJCSAgICAiIGlzOlxuIik7Ci0JCQkJcmZiTG9nKCIgICAlc1xuIiwgcyk7Ci0KLQkJCQlpZiAoIWdldGVudigiVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUIikpIHsKLQkJCQkJaWYgKCFnb3RfbG9jYWxob3N0KSB7Ci0JCQkJCQlyZmJMb2coIlNldHRpbmcgLWxvY2FsaG9zdCBpbiBTU0ggKyAtdW5peHB3IG1vZGUuXG4iKTsKLQkJCQkJfQotCQkJCQlhbGxvd19saXN0ID0gc3RyZHVwKCIxMjcuMC4wLjEiKTsKLQkJCQkJZ290X2xvY2FsaG9zdCA9IDE7Ci0JCQkJfQotCi0JCQkJcmZiTG9nKCJJZiB5b3UgKmFjdHVhbGx5KiB3YW50IFNTTCwgcmVzdGFydCIKLQkJCQkgICAgIiB3aXRoIC1zc2wgb24gdGhlIGNtZGxpbmVcbiIpOwotCQkJCWlmICghIG5vcHcpIHsKLQkJCQkJdXNsZWVwKDIwMDAqMTAwMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAob3BlbnNzbF9wcmVzZW50KCkpIHsKLQkJCQkJcmZiTG9nKCJzZXQgLXNzbCBpbiAtdW5peHB3IG1vZGUuXG4iKTsKLQkJCQkJdXNlX29wZW5zc2wgPSAxOwotCQkJCX0gZWxzZSBpZiAoaW5ldGQpIHsKLQkJCQkJcmZiTG9nKCJjb3VsZCBub3Qgc2V0IC1zc2wgaW4gLWluZXRkIgotCQkJCQkgICAgIiArIC11bml4cHcgbW9kZS5cbiIpOwotCQkJCQlleGl0KDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJmYkxvZygic2V0IC1zdHVubmVsIGluIC11bml4cHcgbW9kZS5cbiIpOwotCQkJCQl1c2Vfc3R1bm5lbCA9IDE7Ci0JCQkJfQotCQkJfQotCQkJcmZiTG9nKCJcbiIpOwotCQl9Ci0JCWlmICh1c2VfdGhyZWFkcyAmJiAhZ2V0ZW52KCJVTklYUFdfVEhSRUFEUyIpKSB7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCXJmYkxvZygiZGlzYWJsaW5nIC10aHJlYWRzIHVuZGVyIC11bml4cHdcbiIpOwotCQkJCXJmYkxvZygiXG4iKTsKLQkJCX0KLQkJCXVzZV90aHJlYWRzID0gMDsKLQkJfQotCX0KLQlpZiAodXNlX3N0dW5uZWwgJiYgISBnb3RfbG9jYWxob3N0KSB7Ci0JCWlmICghIGdldGVudigiU1RVTk5FTF9ESVNBQkxFX0xPQ0FMSE9TVCIpICYmCi0JCSAgICAhIGdldGVudigiVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUIikpIHsKLQkJCWlmICghIHF1aWV0KSB7Ci0JCQkJcmZiTG9nKCJTZXR0aW5nIC1sb2NhbGhvc3QgaW4gLXN0dW5uZWwgbW9kZS5cbiIpOwotCQkJfQotCQkJYWxsb3dfbGlzdCA9IHN0cmR1cCgiMTI3LjAuMC4xIik7Ci0JCQlnb3RfbG9jYWxob3N0ID0gMTsKLQkJfQotCX0KLQlpZiAoc3NsX3ZlcmlmeSAmJiAhIHVzZV9zdHVubmVsICYmICEgdXNlX29wZW5zc2wpIHsKLQkJcmZiTG9nKCItc3NsdmVyaWZ5IG11c3QgYmUgdXNlZCB3aXRoIC1zc2wgb3IgLXN0dW5uZWxcbiIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoaHR0cHNfcG9ydF9udW0gPj0gMCAmJiAhIHVzZV9vcGVuc3NsKSB7Ci0JCXJmYkxvZygiLWh0dHBzIG11c3QgYmUgdXNlZCB3aXRoIC1zc2xcbiIpOwotCQlleGl0KDEpOwotCX0KLQotCWlmICh1c2VfdGhyZWFkcyAmJiAhZ290X25veHJhbmRyKSB7Ci0JCXhyYW5kciA9IDE7Ci0JCWlmICghIHF1aWV0KSB7Ci0JCQlyZmJMb2coImVuYWJsaW5nIC14cmFuZHIgaW4gLXRocmVhZHMgbW9kZS5cbiIpOwotCQl9Ci0JfQotCi0JLyogZml4dXAgc2V0dGluZ3MgdGhhdCBkbyBub3QgbWFrZSBzZW5zZSAqLwotCQkKLQlpZiAodXNlX3RocmVhZHMgJiYgbm9mYiAmJiBjdXJzb3JfcG9zX3VwZGF0ZXMpIHsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygiZGlzYWJsaW5nIC10aHJlYWRzIHVuZGVyIC1ub2ZiIC1jdXJzb3Jwb3NcbiIpOwotCQl9Ci0JCXVzZV90aHJlYWRzID0gMDsKLQl9Ci0JaWYgKHRpbGVfZnV6eiA8IDEpIHsKLQkJdGlsZV9mdXp6ID0gMTsKLQl9Ci0JaWYgKHdhaXRtcyA8IDApIHsKLQkJd2FpdG1zID0gMDsKLQl9Ci0KLQlpZiAoYWxwaGFfdGhyZXNob2xkIDwgMCkgewotCQlhbHBoYV90aHJlc2hvbGQgPSAwOwotCX0KLQlpZiAoYWxwaGFfdGhyZXNob2xkID4gMjU2KSB7Ci0JCWFscGhhX3RocmVzaG9sZCA9IDI1NjsKLQl9Ci0JaWYgKGFscGhhX2ZyYWMgPCAwLjApIHsKLQkJYWxwaGFfZnJhYyA9IDAuMDsKLQl9Ci0JaWYgKGFscGhhX2ZyYWMgPiAxLjApIHsKLQkJYWxwaGFfZnJhYyA9IDEuMDsKLQl9Ci0JaWYgKGFscGhhX2JsZW5kKSB7Ci0JCWFscGhhX3JlbW92ZSA9IDA7Ci0JfQotCi0JaWYgKGNtYXA4dG8yNCAmJiBvdmVybGF5KSB7Ci0JCWlmICghIHF1aWV0KSB7Ci0JCQlyZmJMb2coImRpc2FibGluZyAtb3ZlcmxheSBpbiAtOHRvMjQgbW9kZS5cbiIpOwotCQl9Ci0JCW92ZXJsYXkgPSAwOwotCX0KLQotCWlmICh0aWdodGZpbGV4ZmVyICYmIHZpZXdfb25seSkgewotCQlpZiAoISBxdWlldCkgewotCQkJcmZiTG9nKCJzZXR0aW5nIC1ub3RpZ2h0ZmlsZXhmZXIgaW4gLXZpZXdvbmx5IG1vZGUuXG4iKTsKLQkJfQotCQkvKiBob3cgdG8gdW5kbyB2aWEgLVI/ICovCi0JCXRpZ2h0ZmlsZXhmZXIgPSAwOwotCX0KLQotCWlmIChpbmV0ZCkgewotCQlzaGFyZWQgPSAwOwotCQljb25uZWN0X29uY2UgPSAxOwotCQliZyA9IDA7Ci0JCWlmICh1c2Vfc3R1bm5lbCkgewotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQotCWh0dHBfdHJ5X2l0ID0gdHJ5X2h0dHA7Ci0KLQlpZiAoZmxpcF9ieXRlX29yZGVyICYmIHVzaW5nX3NobSAmJiAhIHF1aWV0KSB7Ci0JCXJmYkxvZygid2FybmluZzogLWZsaXBieXRlIG9yZGVyIG9ubHkgd29ya3Mgd2l0aCAtbm9zaG1cbiIpOwotCX0KLQotCWlmICghIHdpcmVmcmFtZV9jb3B5cmVjdCkgewotCQlzZXRfd2lyZWNvcHlyZWN0X21vZGUoTlVMTCk7Ci0JfQotCWlmICghIHNjcm9sbF9jb3B5cmVjdCkgewotCQlzZXRfc2Nyb2xsY29weXJlY3RfbW9kZShOVUxMKTsKLQl9Ci0JaWYgKHNjcmVlbl9maXh1cF9zdHIpIHsKLQkJcGFyc2VfZml4c2NyZWVuKCk7Ci0JfQotCWluaXRpYWxpemVfc2Nyb2xsX21hdGNoZXMoKTsKLQlpbml0aWFsaXplX3Njcm9sbF90ZXJtKCk7Ci0JaW5pdGlhbGl6ZV9tYXhfa2V5cmVwZWF0KCk7Ci0KLQkvKiBpbmNyZWFzZSByZmJ3YWl0IGlmIHRocmVhZGVkICovCi0JaWYgKHVzZV90aHJlYWRzICYmICEgZ290X3JmYndhaXQpIHsKLQkJLyogPz8/IGxvd2VyIHRoaXMgPz8/ICovCi0JCXJmYk1heENsaWVudFdhaXQgPSA2MDQ4MDAwMDA7Ci0JfQotCi0JLyogbm8gZnJhbWVidWZmZXIgKFdpbjJWTkMpIG1vZGUgKi8KLQotCWlmIChub2ZiKSB7Ci0JCS8qIGRpc2FibGUgdGhpbmdzIHRoYXQgZG8gbm90IG1ha2Ugc2Vuc2Ugd2l0aCBubyBmYiAqLwotCQlzZXRfbm9mYl9wYXJhbXMoMCk7Ci0KLQkJaWYgKCEgZ290X2RlZmVydXBkYXRlICYmICEgZ290X2RlZmVyKSB7Ci0JCQkvKiByZWR1Y2UgZGVmZXIgdGltZSB1bmRlciAtbm9mYiAqLwotCQkJZGVmZXJfdXBkYXRlID0gZGVmZXJfdXBkYXRlX25vZmI7Ci0JCX0KLQkJaWYgKGdvdF9wb2ludGVyX21vZGUgPCAwKSB7Ci0JCQlwb2ludGVyX21vZGUgPSBQT0lOVEVSX01PREVfTk9GQjsKLQkJfQotCX0KLQotCWlmIChuY2FjaGUgPCAwKSB7Ci0JCW5jYWNoZV9iZXRhX3Rlc3RlciA9IDE7Ci0JCW5jYWNoZV9tc2cgPSAxOwotCQlpZiAobmNhY2hlID09IC0xKSB7Ci0JCQluY2FjaGUgPSAwOwotCQl9Ci0JCW5jYWNoZSA9IC1uY2FjaGU7Ci0JCWlmICh0cnlfaHR0cCB8fCBnb3RfaHR0cGRpcikgewotCQkJLyogSlZNIHVzdWFsbHkgbm90IHNldCB0byBoYW5kbGUgYWxsIHRoZSBtZW1vcnkgKi8KLQkJCW5jYWNoZSA9IDA7Ci0JCQluY2FjaGVfbXNnID0gMDsKLQkJfQotCQlpZiAoc3Vid2luKSB7Ci0JCQluY2FjaGUgPSAwOwotCQkJbmNhY2hlX21zZyA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAocmF3X2ZiX3N0cikgewotCQlzZXRfcmF3X2ZiX3BhcmFtcygwKTsKLQl9Ci0JaWYgKCEgZ290X2RlZmVydXBkYXRlKSB7Ci0JCWNoYXIgdG1wWzQwXTsKLQkJc3ByaW50Zih0bXAsICIlZCIsIGRlZmVyX3VwZGF0ZSk7Ci0JCWFyZ3Zfdm5jW2FyZ2Nfdm5jKytdID0gc3RyZHVwKCItZGVmZXJ1cGRhdGUiKTsKLQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAodG1wKTsKLQl9Ci0KLQlpZiAoZGVidWdfcG9pbnRlciB8fCBkZWJ1Z19rZXlib2FyZCkgewotCQlpZiAoIWxvZ2ZpbGUpIHsKLQkJCWlmIChiZyB8fCBxdWlldCkgewotCQkJCXJmYkxvZygiZGlzYWJsaW5nIC1iZy8tcSB1bmRlciAtZGVidWdfcG9pbnRlciIKLQkJCQkgICAgIi8tZGVidWdfa2V5Ym9hcmRcbiIpOwotCQkJCWJnID0gMDsKLQkJCQlxdWlldCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBpbml0aWFsaXplIGFkZGVkX2tleXN5bXNbXSBhcnJheSB0byB6ZXJvcyAqLwotCWFkZF9rZXlzeW0oTm9TeW1ib2wpOwotCi0JLyogdGllIHRvZ2V0aGVyIGNhc2VzIG9mIC1sb2NhbGhvc3QgdnMuIC1saXN0ZW4gbG9jYWxob3N0ICovCi0JaWYgKCEgbGlzdGVuX3N0cikgewotCQlpZiAoYWxsb3dfbGlzdCAmJiAhc3RyY21wKGFsbG93X2xpc3QsICIxMjcuMC4wLjEiKSkgewotCQkJbGlzdGVuX3N0ciA9IHN0cmR1cCgibG9jYWxob3N0Iik7Ci0JCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cmR1cCgiLWxpc3RlbiIpOwotCQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAobGlzdGVuX3N0cik7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAobGlzdGVuX3N0ciwgImxvY2FsaG9zdCIpIHx8Ci0JICAgICFzdHJjbXAobGlzdGVuX3N0ciwgIjEyNy4wLjAuMSIpKSB7Ci0JCWFsbG93X2xpc3QgPSBzdHJkdXAoIjEyNy4wLjAuMSIpOwotCX0KLQotCWluaXRpYWxpemVfY3Jhc2hfaGFuZGxlcigpOwotCi0JaWYgKCEgcXVpZXQpIHsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCXByaW50X3NldHRpbmdzKHRyeV9odHRwLCBiZywgZ3VpX3N0cik7Ci0JCX0KLQkJcmZiTG9nKCJ4MTF2bmMgdmVyc2lvbjogJXMgIHBpZDogJWRcbiIsIGxhc3Rtb2QsIGdldHBpZCgpKTsKLQl9IGVsc2UgewotCQlyZmJMb2dFbmFibGUoMCk7Ci0JfQotCi0JWF9JTklUOwotCVNDUl9JTklUOwotCUNMSUVOVF9JTklUOwotCUlOUFVUX0lOSVQ7Ci0JUE9JTlRFUl9JTklUOwotCQotCS8qIG9wZW4gdGhlIFggZGlzcGxheTogKi8KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hLRVlCT0FSRAotCS8qCi0JICogRGlzYWJsZSBYS0VZQk9BUkQgYmVmb3JlIGNhbGxpbmcgWE9wZW5EaXNwbGF5KCkKLQkgKiB0aGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUga2V5bWFwcGluZy4gCi0JICovCi0JaWYgKHhrYmNvbXBhdCkgewotCQlCb29sIHJjID0gWGtiSWdub3JlRXh0ZW5zaW9uKFRydWUpOwotCQlpZiAoISBxdWlldCkgewotCQkJcmZiTG9nKCJEaXNhYmxpbmcgeGtiIFhLRVlCT0FSRCBleHRlbnNpb24uIHJjPSVkXG4iLAotCQkJICAgIHJjKTsKLQkJfQotCQlpZiAod2F0Y2hfYmVsbCkgewotCQkJd2F0Y2hfYmVsbCA9IDA7Ci0JCQlpZiAoISBxdWlldCkgcmZiTG9nKCJEaXNhYmxpbmcgYmVsbC5cbiIpOwotCQl9Ci0JfQotI2Vsc2UKLQl3YXRjaF9iZWxsID0gMDsKLQl1c2VfeGtiX21vZHR3ZWFrID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgTElCVk5DU0VSVkVSX1dJVEhfVElHSFRWTkNfRklMRVRSQU5TRkVSCi0JaWYgKHRpZ2h0ZmlsZXhmZXIpIHsKLQkJcmZiTG9nKCJyZmJSZWdpc3RlclRpZ2h0Vk5DRmlsZVRyYW5zZmVyRXh0ZW5zaW9uOiA2XG4iKTsKLQkJcmZiUmVnaXN0ZXJUaWdodFZOQ0ZpbGVUcmFuc2ZlckV4dGVuc2lvbigpOwotCX0gZWxzZSB7Ci0JCWlmICgwKSByZmJMb2coInJmYlVucmVnaXN0ZXJUaWdodFZOQ0ZpbGVUcmFuc2ZlckV4dGVuc2lvbjogM1xuIik7Ci0JCXJmYlVucmVnaXN0ZXJUaWdodFZOQ0ZpbGVUcmFuc2ZlckV4dGVuc2lvbigpOwotCX0KLSNlbmRpZgotCi0JaW5pdGlhbGl6ZV9hbGxvd2VkX2lucHV0KCk7Ci0KLQlpZiAoZGlzcGxheV9OICYmICFnb3RfcmZicG9ydCkgewotCQljaGFyICp1ZCA9IHVzZV9kcHk7Ci0JCWlmICh1ZCA9PSBOVUxMKSB7Ci0JCQl1ZCA9IGdldGVudigiRElTUExBWSIpOwotCQl9Ci0JCWlmICh1ZCAmJiBzdHJzdHIodWQsICJjbWQ9IikgPT0gTlVMTCkgewotCQkJY2hhciAqcDsKLQkJCXVkID0gc3RyZHVwKHVkKTsKLQkJCXAgPSBzdHJyY2hyKHVkLCAnOicpOwotCQkJaWYgKHApIHsKLQkJCQlpbnQgTjsJCi0JCQkJY2hhciAqcSA9IHN0cmNocihwLCAnLicpOwotCQkJCWlmIChxKSB7Ci0JCQkJCSpxID0gJ1wwJzsKLQkJCQl9Ci0JCQkJTiA9IGF0b2kocCsxKTsJCi0JCQkJaWYgKGFyZ2Nfdm5jKzEgPCBhcmdjX3ZuY19tYXgpIHsKLQkJCQkJY2hhciBOc3RyWzE2XTsKLQkJCQkJc3ByaW50ZihOc3RyLCAiJWQiLCAoNTkwMCArIE4pICUgNjU1MzYpOyAKLQkJCQkJYXJndl92bmNbYXJnY192bmMrK10gPSBzdHJkdXAoIi1yZmJwb3J0Iik7Ci0JCQkJCWFyZ3Zfdm5jW2FyZ2Nfdm5jKytdID0gc3RyZHVwKE5zdHIpOwotCQkJCQlnb3RfcmZicG9ydCA9IDE7Ci0JCQkJfQotCQkJfQotCQkJZnJlZSh1ZCk7Ci0JCX0KLQl9Ci0KLQlpZiAodXNlcnNfbGlzdCAmJiBzdHJzdHIodXNlcnNfbGlzdCwgImx1cms9IikpIHsKLQkJaWYgKHVzZV9kcHkpIHsKLQkJCXJmYkxvZygid2FybmluZzogLWRpc3BsYXkgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiAiCi0JCQkgICAgIlwibHVyaz1cIiBtb2RlLi4uXG4iKTsKLQkJfQotCQlpZiAoYXV0aF9maWxlICE9IE5VTEwgJiYgc3RyY21wKGF1dGhfZmlsZSwgImd1ZXNzIikpIHsKLQkJCXNldF9lbnYoIlhBVVRIT1JJVFkiLCBhdXRoX2ZpbGUpOwotCQl9Ci0JCWx1cmtfbG9vcCh1c2Vyc19saXN0KTsKLQotCX0gZWxzZSBpZiAodXNlX2RweSAmJiBzdHJzdHIodXNlX2RweSwgIldBSVQ6IikgPT0gdXNlX2RweSkgewotCQljaGFyICptY20gPSBtdWx0aXBsZV9jdXJzb3JzX21vZGU7Ci0KLQkJaWYgKHN0cnN0cih1c2VfZHB5LCAiWGR1bW15IikpIHsKLQkJCWlmICgheHJhbmRyICYmICFnb3Rfbm94cmFuZHIpIHsKLQkJCQlpZiAoISBxdWlldCkgewotCQkJCQlyZmJMb2coIkVuYWJsaW5nIC14cmFuZHIgZm9yIHBvc3NpYmxlIHVzZSBvZiBYZHVtbXkgc2VydmVyLlxuIik7Ci0JCQkJfQotCQkJCXhyYW5kciA9IDE7Ci0JCQl9Ci0JCX0KLQotCQl3YWl0ZWRfZm9yX2NsaWVudCA9IHdhaXRfZm9yX2NsaWVudCgmYXJnY192bmMsIGFyZ3Zfdm5jLAotCQkgICAgdHJ5X2h0dHAgJiYgISBnb3RfaHR0cGRpcik7Ci0KLQkJaWYgKCFtY20gJiYgbXVsdGlwbGVfY3Vyc29yc19tb2RlKSB7Ci0JCQlmcmVlKG11bHRpcGxlX2N1cnNvcnNfbW9kZSk7Ci0JCQltdWx0aXBsZV9jdXJzb3JzX21vZGUgPSBOVUxMOwotCQl9Ci0JfQotCi0KLQlpZiAoYXV0aF9maWxlKSB7Ci0JCWNoZWNrX2d1ZXNzX2F1dGhfZmlsZSgpOwotCQlpZiAoYXV0aF9maWxlICE9IE5VTEwpIHsKLQkJCXNldF9lbnYoIlhBVVRIT1JJVFkiLCBhdXRoX2ZpbGUpOwotCQl9Ci0JfQotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKHVzZV9kcHkgJiYgIXN0cmNtcCh1c2VfZHB5LCAiY29uc29sZSIpKSB7Ci0JCTsKLQl9IGVsc2UKLSNlbmRpZgotCWlmICh1c2VfZHB5ICYmIHN0cmNtcCh1c2VfZHB5LCAiIikpIHsKLQkJZHB5ID0gWE9wZW5EaXNwbGF5X3dyKHVzZV9kcHkpOwotI2lmZGVmIE1BQ09TWAotCX0gZWxzZSBpZiAoIXN1YndpbiAmJiBnZXRlbnYoIkRJU1BMQVkiKQotCSAgICAmJiBzdHJzdHIoZ2V0ZW52KCJESVNQTEFZIiksICIvdG1wLyIpICkgewotCQkvKiBlLmcuIC90bXAvbGF1bmNoLVhsc3B2TS86MCBvbiBsZW9wYXJkICovCi0JCXJmYkxvZygiTWFjT1NYOiBJZ25vcmluZyAkRElTUExBWSAnJXMnXG4iLCBnZXRlbnYoIkRJU1BMQVkiKSk7Ci0JCXJmYkxvZygiTWFjT1NYOiBVc2UgLWRpc3BsYXkgJERJU1BMQVkgdG8gZm9yY2UgaXQuXG4iKTsKLSNlbmRpZgotCX0gZWxzZSBpZiAocmF3X2ZiX3N0ciAhPSBOVUxMICYmIHJhd19mYl9zdHJbMF0gIT0gJysnICYmICFnb3Rfbm92aWV3b25seSkgewotCQlyZmJMb2coIk5vdCBvcGVuaW5nIERJU1BMQVkgaW4gLXJhd2ZiIG1vZGUgKGZvcmNlIHZpYSAtcmF3ZmIgK3N0cilcbiIpOwotCQlkcHkgPSBOVUxMOyAvKiBkb24ndCBvcGVuIGl0LiAqLwotCX0gZWxzZSBpZiAoICh1c2VfZHB5ID0gZ2V0ZW52KCJESVNQTEFZIikpICkgewotCQlpZiAoc3Ryc3RyKHVzZV9kcHksICJsb2NhbGhvc3QiKSA9PSB1c2VfZHB5KSB7Ci0JCQlyZmJMb2coIlxuIik7Ci0JCQlyZmJMb2coIldBUk5JTkc6IERJU1BMQVkgc3RhcnRzIHdpdGggbG9jYWxob3N0OiAnJXMnXG4iLCB1c2VfZHB5KTsKLQkJCXJmYkxvZygiV0FSTklORzogSXMgdGhpcyBhbiBTU0ggWDExIHBvcnQgZm9yd2FyZGluZz8gIFlvdSBtb3N0XG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogbGlrZWx5IGRvbid0IHdhbnQgeDExdm5jIHRvIHVzZSB0aGF0IERJU1BMQVkuXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogWW91IHByb2JhYmx5IHNob3VsZCBzdXBwbHkgc29tZXRoaW5nXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogbGlrZTogLWRpc3BsYXkgOjAgIHRvIGFjY2VzcyB0aGUgcGh5c2ljYWxcbiIpOwotCQkJcmZiTG9nKCJXQVJOSU5HOiBYIGRpc3BsYXkgb24gdGhlIG1hY2hpbmUgd2hlcmUgeDExdm5jIGlzIHJ1bm5pbmcuXG4iKTsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXVzbGVlcCg1MDAgKiAxMDAwKTsKLQkJfSBlbHNlIGlmICh1c2luZ19zaG0gJiYgdXNlX2RweVswXSAhPSAnOicpIHsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogRElTUExBWSBtaWdodCBub3QgYmUgbG9jYWw6ICclcydcbiIsIHVzZV9kcHkpOwotCQkJcmZiTG9nKCJXQVJOSU5HOiBJcyB0aGlzIHRoZSBESVNQTEFZIG9mIGFub3RoZXIgbWFjaGluZT8gIFVzdWFsbHksXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogeDExdm5jIGlzIHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIHdpdGggdGhlXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogcGh5c2ljYWwgWCBkaXNwbGF5IHRvIGJlIGV4cG9ydGVkIGJ5IFZOQy4gIElmXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogdGhhdCBpcyB3aGF0IHlvdSByZWFsbHkgbWVhbnQsIHN1cHBseSBzb21ldGhpbmdcbiIpOwotCQkJcmZiTG9nKCJXQVJOSU5HOiBsaWtlOiAtZGlzcGxheSA6MCAgb24gdGhlIHgxMXZuYyBjb21tYW5kIGxpbmUuXG4iKTsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXVzbGVlcCgyNTAgKiAxMDAwKTsKLQkJfQotCQlkcHkgPSBYT3BlbkRpc3BsYXlfd3IodXNlX2RweSk7Ci0JfSBlbHNlIHsKLQkJZHB5ID0gWE9wZW5EaXNwbGF5X3dyKCIiKTsKLQl9Ci0JbGFzdF9vcGVuX3hkaXNwbGF5ID0gdGltZShOVUxMKTsKLQotCWlmICh0ZXJtaW5hbF9zZXJ2aWNlc19kYWVtb24gIT0gTlVMTCkgewotCQl0ZXJtaW5hbF9zZXJ2aWNlcyh0ZXJtaW5hbF9zZXJ2aWNlc19kYWVtb24pOwotCQlleGl0KDApOwotCX0KLQotCWlmIChkcHkgJiYgIXhyYW5kciAmJiAhZ290X25veHJhbmRyKSB7Ci0jaWYgIU5PX1gxMQotCQlBdG9tIHRyYXBfeHJhbmRyID0gWEludGVybkF0b20oZHB5LCAiWDExVk5DX1RSQVBfWFJBTkRSIiwgVHJ1ZSk7Ci0JCWlmICh0cmFwX3hyYW5kciAhPSBOb25lKSB7Ci0JCQlpZiAoISBxdWlldCkgewotCQkJCXJmYkxvZygiRW5hYmxpbmcgLXhyYW5kciBkdWUgdG8gWDExVk5DX1RSQVBfWFJBTkRSIGF0b20uXG4iKTsKLQkJCX0KLQkJCXhyYW5kciA9IDE7Ci0JCX0KLSNlbmRpZgotCX0KLQotI2lmZGVmIE1BQ09TWAotCWlmICghIGRweSAmJiAhIHJhd19mYl9zdHIpIHsKLQkJcmF3X2ZiX3N0ciA9IHN0cmR1cCgiY29uc29sZSIpOwotCX0KLSNlbmRpZgotCi0JaWYgKCEgZHB5ICYmIHJhd19mYl9zdHIpIHsKLQkJcmZiTG9nKCJDb250aW51aW5nIHdpdGhvdXQgWCBkaXNwbGF5IGluIC1yYXdmYiBtb2RlLlxuIik7Ci0JCWdvdG8gcmF3X2ZiX3Bhc3NfZ29fYW5kX2NvbGxlY3RfMjAwX2RvbGxhcnM7Ci0JfQotCi0JaWYgKCEgZHB5ICYmICEgdXNlX2RweSAmJiAhIGdldGVudigiRElTUExBWSIpKSB7Ci0JCWludCBpLCBzID0gNDsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlyZmJMb2coIlxhXG4iKTsKLQkJcmZiTG9nKCIqKiogWE9wZW5EaXNwbGF5IGZhaWxlZC4gTm8gLWRpc3BsYXkgb3IgRElTUExBWS5cbiIpOwotCQlyZmJMb2coIioqKiBUcnlpbmcgXCI6MFwiIGluICVkIHNlY29uZHMuICBQcmVzcyBDdHJsLUMgdG8iCi0JCSAgICAiIGFib3J0LlxuIiwgcyk7Ci0JCXJmYkxvZygiKioqICIpOwotCQlmb3IgKGk9MTsgaTw9czsgaSsrKSAgewotCQkJZnByaW50ZihzdGRlcnIsICIlZCAiLCBpKTsKLQkJCXNsZWVwKDEpOwotCQl9Ci0JCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJdXNlX2RweSA9ICI6MCI7Ci0JCWRweSA9IFhPcGVuRGlzcGxheV93cih1c2VfZHB5KTsKLQkJbGFzdF9vcGVuX3hkaXNwbGF5ID0gdGltZShOVUxMKTsKLQkJaWYgKGRweSkgewotCQkJcmZiTG9nKCIqKiogWE9wZW5EaXNwbGF5IG9mIFwiOjBcIiBzdWNjZXNzZnVsLlxuIik7Ci0JCX0KLQkJcmZiTG9nKCJcbiIpOwotCQlpZiAocXVpZXQpIHJmYkxvZ0VuYWJsZSgwKTsKLQl9Ci0KLQlpZiAoISBkcHkpIHsKLQkJY2hhciAqZCA9IHVzZV9kcHk7Ci0JCWlmICghZCkgZCA9IGdldGVudigiRElTUExBWSIpOwotCQlpZiAoIWQpIGQgPSAibnVsbCI7Ci0JCXJmYkxvZ0VuYWJsZSgxKTsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCQlyZmJMb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIiwgZCk7Ci0JCXJmYkxvZygiKioqIFhPcGVuRGlzcGxheSBmYWlsZWQgKCVzKVxuIiwgZCk7Ci0JCXhvcGVuX2Rpc3BsYXlfZmFpbF9tZXNzYWdlKGQpOwotCQlleGl0KDEpOwotCX0gZWxzZSBpZiAodXNlX2RweSkgewotCQlpZiAoISBxdWlldCkgcmZiTG9nKCJVc2luZyBYIGRpc3BsYXkgJXNcbiIsIHVzZV9kcHkpOwotCX0gZWxzZSB7Ci0JCWlmICghIHF1aWV0KSByZmJMb2coIlVzaW5nIGRlZmF1bHQgWCBkaXNwbGF5LlxuIik7Ci0JfQotCi0JaWYgKGNsaXBfc3RyICE9IE5VTEwgJiYgZHB5ICE9IE5VTEwpIHsKLQkJY2hlY2tfeGluZXJhbWFfY2xpcCgpOwotCX0KLQotCXNjciA9IERlZmF1bHRTY3JlZW4oZHB5KTsKLQlyb290d2luID0gUm9vdFdpbmRvdyhkcHksIHNjcik7Ci0KLSNpZiAhTk9fWDExCi0JaWYgKGRweSkgewotCQlXaW5kb3cgdyA9IFhDcmVhdGVTaW1wbGVXaW5kb3coZHB5LCByb290d2luLCAwLCAwLCAxLCAxLCAwLCAwLCAwKTsKLQkJaWYgKCEgcXVpZXQpIHJmYkxvZygicm9vdHdpbjogMHglbHggcmVzd2luOiAweCVseCBkcHk6IDB4JXhcbiIsIHJvb3R3aW4sIHcsIGRweSk7Ci0JCWlmICh3ICE9IE5vbmUpIHsKLQkJCVhEZXN0cm95V2luZG93KGRweSwgdyk7Ci0JCX0KLQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0JfQotI2VuZGlmCi0KLQlpZiAobmNhY2hlX2JldGFfdGVzdGVyKSB7Ci0JCWludCBoID0gRGlzcGxheUhlaWdodChkcHksIHNjcik7Ci0JCWludCB3ID0gRGlzcGxheVdpZHRoKGRweSwgc2NyKTsKLQkJaW50IG1lbSA9ICh3ICogaCAqIDQpIC8gKDEwMDAgKiAxMDAwKSwgTUVNID0gOTY7Ci0JCWlmIChtZW0gPCAxKSBtZW0gPSAxOwotCi0JCS8qIGxpbWl0IHBvb3IsIHVuc3VzcGVjdGluZyBiZXRhIHRlc3RlcidzIHZpZXdlciB0byA5NiBNQiAqLwotCQlpZiAoIChuY2FjaGUrMikgKiBtZW0gPiBNRU0gKSB7Ci0JCQlpbnQgbiA9IChNRU0vbWVtKSAtIDI7Ci0JCQlpZiAobiA8IDApIG4gPSAwOwotCQkJbiA9IDIgKiAobiAvIDIpOwotCQkJaWYgKG4gPCBuY2FjaGUpIHsKLQkJCQluY2FjaGUgPSBuOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGdyYWJfYWx3YXlzKSB7Ci0JCVdpbmRvdyBzYXZlID0gd2luZG93OwotCQl3aW5kb3cgPSByb290d2luOwotCQlhZGp1c3RfZ3JhYnMoMSwgMCk7Ci0JCXdpbmRvdyA9IHNhdmU7Ci0JfQotCi0JaWYgKCAgIChyZW1vdGVfY21kICYmIHN0cnN0cihyZW1vdGVfY21kLCAiRElSRUNUOiIpID09IHJlbW90ZV9jbWQpCi0JICAgIHx8IChxdWVyeV9jbWQgICYmIHN0cnN0cihxdWVyeV9jbWQsICAiRElSRUNUOiIpID09IHF1ZXJ5X2NtZCApKSB7Ci0JCS8qIGhhbmRsZWQgYmVsb3cgYWZ0ZXIgbW9zdCBldmVyeXRoaW5nIGlzIHNldHVwLiAqLwotCQlpZiAoZ2V0ZW52KCJRVUVSWV9WRVJCT1NFIikpIHsKLQkJCXF1aWV0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCXF1aWV0ID0gMTsKLQkJCXJlbW90ZV9kaXJlY3QgPSAxOwotCQl9Ci0JCWlmICghYXV0b19wb3J0KSB7Ci0JCQlhdXRvX3BvcnQgPSA1OTcwOwotCQl9Ci0JfSBlbHNlIGlmIChyZW1vdGVfY21kIHx8IHF1ZXJ5X2NtZCkgewotCQlpbnQgaSwgcmMgPSAxOwotCQlmb3IgKGk9MDsgaSA8PSBxdWVyeV9yZXRyaWVzOyBpKyspIHsKLQkJCXJjID0gZG9fcmVtb3RlX3F1ZXJ5KHJlbW90ZV9jbWQsIHF1ZXJ5X2NtZCwgcmVtb3RlX3N5bmMsCi0JCQkgICAgcXVlcnlfZGVmYXVsdCk7Ci0JCQlpZiAocmMgPT0gMCkgewotCQkJCWlmIChxdWVyeV9tYXRjaCkgewotCQkJCQlpZiAocXVlcnlfcmVzdWx0ICYmIHN0cnN0cihxdWVyeV9yZXN1bHQsIHF1ZXJ5X21hdGNoKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcmMgPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpIDwgcXVlcnlfcmV0cmllcykgewotCQkJCWZwcmludGYoc3RkZXJyLCAic2xlZXA6ICUuM2ZcbiIsIHF1ZXJ5X2RlbGF5KTsKLQkJCQl1c2xlZXAoIChpbnQpIChxdWVyeV9kZWxheSAqIDEwMDAgKiAxMDAwKSApOwotCQkJfQotCQl9Ci0JCVhGbHVzaF93cihkcHkpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCXVzbGVlcCgzMCAqIDEwMDApOwkvKiBzdGlsbCBuZWVkZWQ/ICovCi0JCVhDbG9zZURpc3BsYXlfd3IoZHB5KTsKLQkJZXhpdChyYyk7Ci0JfQotCi0JaWYgKCEgcXVpZXQgJiYgISByYXdfZmJfc3RyKSB7Ci0JCXJmYkxvZygiXG4iKTsKLQkJcmZiTG9nKCItLS0tLS0tLS0tLS0tLS0tLS0gVVNFRlVMIElORk9STUFUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JfQotCi0JaWYgKHByaXZfcmVtb3RlKSB7Ci0JCWlmICghIHJlbW90ZV9jb250cm9sX2FjY2Vzc19vaygpKSB7Ci0JCQlyZmJMb2coIioqIERpc2FibGluZyByZW1vdGUgY29tbWFuZHMgaW4gLXByaXZyZW1vdGUgbW9kZS5cbiIpOwotCQkJYWNjZXB0X3JlbW90ZV9jbWRzID0gMDsKLQkJfQotCX0KLQotCXN5bmNfdG9kX3dpdGhfc2VydmVydGltZSgpOwotCWlmIChncmFiX2J1c3RlcikgewotCQlzcGF3bl9ncmFiX2J1c3RlcigpOwotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhGSVhFUwotCWlmICghIFhGaXhlc1F1ZXJ5RXh0ZW5zaW9uKGRweSwgJnhmaXhlc19iYXNlX2V2ZW50X3R5cGUsICZlcikpIHsKLQkJaWYgKCEgcXVpZXQgJiYgISByYXdfZmJfc3RyKSB7Ci0JCQlyZmJMb2coIkRpc2FibGluZyBYRklYRVMgbW9kZTogZGlzcGxheSBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuIik7Ci0JCX0KLQkJeGZpeGVzX2Jhc2VfZXZlbnRfdHlwZSA9IDA7Ci0JCXhmaXhlc19wcmVzZW50ID0gMDsKLQl9IGVsc2UgewotCQl4Zml4ZXNfcHJlc2VudCA9IDE7Ci0JfQotI2VuZGlmCi0JaWYgKCEgeGZpeGVzX3ByZXNlbnQpIHsKLQkJdXNlX3hmaXhlcyA9IDA7Ci0JfQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRQotCWlmICghIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbihkcHksICZ4ZGFtYWdlX2Jhc2VfZXZlbnRfdHlwZSwgJmVyKSkgewotCQlpZiAoISBxdWlldCAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCXJmYkxvZygiRGlzYWJsaW5nIFggREFNQUdFIG1vZGU6IGRpc3BsYXkgZG9lcyBub3Qgc3VwcG9ydCBpdC5cbiIpOwotCQl9Ci0JCXhkYW1hZ2VfYmFzZV9ldmVudF90eXBlID0gMDsKLQkJeGRhbWFnZV9wcmVzZW50ID0gMDsKLQl9IGVsc2UgewotCQl4ZGFtYWdlX3ByZXNlbnQgPSAxOwotCX0KLSNlbmRpZgotCWlmICghIHhkYW1hZ2VfcHJlc2VudCkgewotCQl1c2VfeGRhbWFnZSA9IDA7Ci0JfQotCWlmICghIHF1aWV0ICYmIHhkYW1hZ2VfcHJlc2VudCAmJiB1c2VfeGRhbWFnZSAmJiAhIHJhd19mYl9zdHIpIHsKLQkJcmZiTG9nKCJYIERBTUFHRSBhdmFpbGFibGUgb24gZGlzcGxheSwgdXNpbmcgaXQgZm9yIHBvbGxpbmcgaGludHMuXG4iKTsKLQkJcmZiTG9nKCIgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciB1c2U6ICctbm94ZGFtYWdlJ1xuIik7Ci0JCXJmYkxvZygiXG4iKTsKLQkJcmZiTG9nKCIgIE1vc3QgY29tcG9zaXRpbmcgd2luZG93IG1hbmFnZXJzIGxpa2UgJ2NvbXBpeicgb3IgJ2JlcnlsJ1xuIik7Ci0JCXJmYkxvZygiICBjYXVzZSBYIERBTUFHRSB0byBmYWlsLCBhbmQgc28geW91IG1heSBub3Qgc2VlIGFueSBzY3JlZW5cbiIpOwotCQlyZmJMb2coIiAgdXBkYXRlcyB2aWEgVk5DLiAgRWl0aGVyIGRpc2FibGUgJ2NvbXBpeicgKHJlY29tbWVuZGVkKSBvclxuIik7Ci0JCXJmYkxvZygiICBzdXBwbHkgdGhlIHgxMXZuYyAnLW5veGRhbWFnZScgY29tbWFuZCBsaW5lIG9wdGlvbi5cbiIpOwotCX0KLQotCWlmICghIHF1aWV0ICYmIHdpcmVmcmFtZSAmJiAhIHJhd19mYl9zdHIpIHsKLQkJcmZiTG9nKCJcbiIpOwotCQlyZmJMb2coIldpcmVmcmFtaW5nOiAtd2lyZWZyYW1lIG1vZGUgaXMgaW4gZWZmZWN0IGZvciB3aW5kb3cgbW92ZXMuXG4iKTsKLQkJcmZiTG9nKCIgIElmIHRoaXMgeWllbGRzIHVuZGVzaXJlZCBiZWhhdmlvciAocG9vciByZXNwb25zZSwgcGFpbnRpbmdcbiIpOwotCQlyZmJMb2coIiAgZXJyb3JzLCBldGMpIGl0IG1heSBiZSBkaXNhYmxlZDpcbiIpOwotCQlyZmJMb2coIiAgIC0gdXNlICctbm93ZicgdG8gZGlzYWJsZSB3aXJlZnJhbWluZyBjb21wbGV0ZWx5LlxuIik7Ci0JCXJmYkxvZygiICAgLSB1c2UgJy1ub3djcicgdG8gZGlzYWJsZSB0aGUgQ29weSBSZWN0YW5nbGUgYWZ0ZXIgdGhlXG4iKTsKLQkJcmZiTG9nKCIgICAgIG1vdmVkIHdpbmRvdyBpcyByZWxlYXNlZCBpbiB0aGUgbmV3IHBvc2l0aW9uLlxuIik7Ci0JCXJmYkxvZygiICBBbHNvIHNlZSB0aGUgLWhlbHAgZW50cnkgZm9yIHR1bmluZyBwYXJhbWV0ZXJzLlxuIik7Ci0JCXJmYkxvZygiICBZb3UgY2FuIHByZXNzIDMgQWx0X0wncyAoTGVmdCBcIkFsdFwiIGtleSkgaW4gYSByb3cgdG8gXG4iKTsKLQkJcmZiTG9nKCIgIHJlcGFpbnQgdGhlIHNjcmVlbiwgYWxzbyBzZWUgdGhlIC1maXhzY3JlZW4gb3B0aW9uIGZvclxuIik7Ci0JCXJmYkxvZygiICBwZXJpb2RpYyByZXBhaW50cy5cbiIpOwotCQlpZiAoc2NhbGVfc3RyICYmICFzdHJzdHIoc2NhbGVfc3RyLCAibm9jciIpKSB7Ci0JCQlyZmJMb2coIiAgTm90ZTogJy1zY2FsZScgaXMgb24gYW5kIHRoaXMgY2FuIGNhdXNlIG1vcmUgcHJvYmxlbXMuXG4iKTsKLQkJfQotCX0KLQotCW92ZXJsYXlfcHJlc2VudCA9IDA7Ci0jaWYgZGVmaW5lZChTT0xBUklTX09WRVJMQVkpICYmICFOT19YMTEKLQlpZiAoISBYUXVlcnlFeHRlbnNpb24oZHB5LCAiU1VOX09WTCIsICZtYWosICZldiwgJmVyKSkgewotCQlpZiAoISBxdWlldCAmJiBvdmVybGF5ICYmICEgcmF3X2ZiX3N0cikgewotCQkJcmZiTG9nKCJEaXNhYmxpbmcgLW92ZXJsYXk6IFNVTl9PVkwgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW92ZXJsYXlfcHJlc2VudCA9IDE7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChJUklYX09WRVJMQVkpICYmICFOT19YMTEKLQlpZiAoISBYUmVhZERpc3BsYXlRdWVyeUV4dGVuc2lvbihkcHksICZldiwgJmVyKSkgewotCQlpZiAoISBxdWlldCAmJiBvdmVybGF5ICYmICEgcmF3X2ZiX3N0cikgewotCQkJcmZiTG9nKCJEaXNhYmxpbmcgLW92ZXJsYXk6IElSSVggUmVhZERpc3BsYXkgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW92ZXJsYXlfcHJlc2VudCA9IDE7Ci0JfQotI2VuZGlmCi0JaWYgKG92ZXJsYXkgJiYgIW92ZXJsYXlfcHJlc2VudCkgewotCQlvdmVybGF5ID0gMDsKLQkJb3ZlcmxheV9jdXJzb3IgPSAwOwotCX0KLQotCS8qIGN1cnNvciBzaGFwZXMgc2V0dXAgKi8KLQlpZiAoISBtdWx0aXBsZV9jdXJzb3JzX21vZGUpIHsKLQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKCJkZWZhdWx0Iik7Ci0JfQotCWlmIChzaG93X2N1cnNvcikgewotCQlpZighc3RyY21wKG11bHRpcGxlX2N1cnNvcnNfbW9kZSwgImRlZmF1bHQiKQotCQkgICAgJiYgeGZpeGVzX3ByZXNlbnQgJiYgdXNlX3hmaXhlcykgewotCQkJZnJlZShtdWx0aXBsZV9jdXJzb3JzX21vZGUpOwotCQkJbXVsdGlwbGVfY3Vyc29yc19tb2RlID0gc3RyZHVwKCJtb3N0Iik7Ci0KLQkJCWlmICghIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQkJCXJmYkxvZygiXG4iKTsKLQkJCQlyZmJMb2coIlhGSVhFUyBhdmFpbGFibGUgb24gZGlzcGxheSwgcmVzZXR0aW5nIGN1cnNvciBtb2RlXG4iKTsKLQkJCQlyZmJMb2coIiAgdG86ICctY3Vyc29yIG1vc3QnLlxuIik7Ci0JCQkJcmZiTG9nKCIgIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciB1c2U6ICctY3Vyc29yIGFycm93J1xuIik7Ci0JCQkJcmZiTG9nKCIgIG9yICctbm94Zml4ZXMnLlxuIik7Ci0JCQl9Ci0JCX0KLQkJaWYoIXN0cmNtcChtdWx0aXBsZV9jdXJzb3JzX21vZGUsICJtb3N0IikpIHsKLQkJCWlmICh4Zml4ZXNfcHJlc2VudCAmJiB1c2VfeGZpeGVzICYmCi0JCQkgICAgb3ZlcmxheV9jdXJzb3IgPT0gMSkgewotCQkJCWlmICghIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQkJCQlyZmJMb2coInVzaW5nIFhGSVhFUyBmb3IgY3Vyc29yIGRyYXdpbmcuXG4iKTsKLQkJCQl9Ci0JCQkJb3ZlcmxheV9jdXJzb3IgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG92ZXJsYXkpIHsKLQkJdXNpbmdfc2htID0gMDsKLQkJaWYgKGZsYXNoX2NtYXAgJiYgISBxdWlldCAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCXJmYkxvZygid2FybmluZzogLWZsYXNoY21hcCBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggLW92ZXJsYXlcbiIpOwotCQl9Ci0JCWlmIChzaG93X2N1cnNvciAmJiBvdmVybGF5X2N1cnNvcikgewotCQkJY2hhciAqcyA9IG11bHRpcGxlX2N1cnNvcnNfbW9kZTsKLQkJCWlmICgqcyA9PSAnWCcgfHwgIXN0cmNtcChzLCAic29tZSIpIHx8Ci0JCQkgICAgIXN0cmNtcChzLCAiYXJyb3ciKSkgewotCQkJCS8qCi0JCQkJICogdXNlciB3YW50cyB0aGVzZSBtb2Rlcywgc28gZGlzYWJsZSBmYiBjdXJzb3IKLQkJCQkgKi8KLQkJCQlvdmVybGF5X2N1cnNvciA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogImRlZmF1bHQiIGFuZCAibW9zdCIsIHdlIHR1cm4gb2ZmCi0JCQkJICogc2hvd19jdXJzb3Igc2luY2UgaXQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0JCQkJICogYmUgaW4gdGhlIGZyYW1lYnVmZmVyLgotCQkJCSAqLwotCQkJCXNob3dfY3Vyc29yID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCWluaXRpYWxpemVfY3Vyc29yc19tb2RlKCk7Ci0KLQkvKiBjaGVjayBmb3IgWFRFU1QgKi8KLQlpZiAoISBYVGVzdFF1ZXJ5RXh0ZW5zaW9uX3dyKGRweSwgJmV2LCAmZXIsICZtYWosICZtaW4pKSB7Ci0JCWlmICghIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQkJcmZiTG9nKCJcbiIpOwotCQkJcmZiTG9nKCJXQVJOSU5HOiBYVEVTVCBleHRlbnNpb24gbm90IGF2YWlsYWJsZSAoZWl0aGVyIG1pc3NpbmcgZnJvbVxuIik7Ci0JCQlyZmJMb2coIiAgZGlzcGxheSBvciBjbGllbnQgbGlicmFyeSBsaWJYdHN0IG1pc3NpbmcgYXQgYnVpbGQgdGltZSkuXG4iKTsKLQkJCXJmYkxvZygiICBNT1NUIHVzZXIgaW5wdXQgKHBvaW50ZXIgYW5kIGtleWJvYXJkKSB3aWxsIGJlIERJU0NBUkRFRC5cbiIpOwotCQkJcmZiTG9nKCIgIElmIGRpc3BsYXkgZG9lcyBoYXZlIFhURVNULCBiZSBzdXJlIHRvIGJ1aWxkIHgxMXZuYyB3aXRoXG4iKTsKLQkJCXJmYkxvZygiICBhIHdvcmtpbmcgbGliWHRzdCBidWlsZCBlbnZpcm9ubWVudCAoZS5nLiBsaWJ4dHN0LWRldixcbiIpOwotCQkJcmZiTG9nKCIgIG9yIG90aGVyIHBhY2thZ2VzKS5cbiIpOwotCQkJcmZiTG9nKCJObyBYVEVTVCBleHRlbnNpb24sIHN3aXRjaGluZyB0byAteHdhcnBwb2ludGVyIG1vZGUgZm9yXG4iKTsKLQkJCXJmYkxvZygiICBwb2ludGVyIG1vdGlvbiBpbnB1dC5cbiIpOwotCQl9Ci0JCXh0ZXN0X3ByZXNlbnQgPSAwOwotCQl1c2VfeHdhcnBwb2ludGVyID0gMTsKLQl9IGVsc2UgewotCQl4dGVzdF9wcmVzZW50ID0gMTsKLQkJeHRlc3RfYmFzZV9ldmVudF90eXBlID0gZXY7Ci0JCWlmIChtYWogPD0gMSB8fCAobWFqID09IDIgJiYgbWluIDw9IDIpKSB7Ci0JCQkvKiBubyBldmVudHMgZGVmaW5lZCBhcyBvZiAyLjIgKi8KLQkJCXh0ZXN0X2Jhc2VfZXZlbnRfdHlwZSA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAoISBYRVRyYXBRdWVyeUV4dGVuc2lvbl93cihkcHksICZldiwgJmVyLCAmbWFqKSkgewotCQl4dHJhcF9wcmVzZW50ID0gMDsKLQl9IGVsc2UgewotCQl4dHJhcF9wcmVzZW50ID0gMTsKLQkJeHRyYXBfYmFzZV9ldmVudF90eXBlID0gZXY7Ci0JfQotCi0JLyoKLQkgKiBXaW5kb3cgbWFuYWdlcnMgd2lsbCBvZnRlbiBncmFiIHRoZSBkaXNwbGF5IGR1cmluZyByZXNpemUsCi0JICogZXRjLCB1c2luZyBYR3JhYlNlcnZlcigpLiAgVG8gYXZvaWQgZGVhZGxvY2sgKG91ciB1c2VyIHJlc2l6ZQotCSAqIGlucHV0IGlzIG5vdCBwcm9jZXNzZWQpIHdlIHRlbGwgdGhlIHNlcnZlciB0byBwcm9jZXNzIG91cgotCSAqIHJlcXVlc3RzIGR1cmluZyBhbGwgZ3JhYnM6Ci0JICovCi0JZGlzYWJsZV9ncmFic2VydmVyKGRweSwgMCk7Ci0KLQkvKiBjaGVjayBmb3IgUkVDT1JEICovCi0JaWYgKCEgWFJlY29yZFF1ZXJ5VmVyc2lvbl93cihkcHksICZtYWosICZtaW4pKSB7Ci0JCXhyZWNvcmRfcHJlc2VudCA9IDA7Ci0JCWlmICghIHF1aWV0KSB7Ci0JCQlyZmJMb2coIlxuIik7Ci0JCQlyZmJMb2coIlRoZSBSRUNPUkQgWCBleHRlbnNpb24gd2FzIG5vdCBmb3VuZCBvbiB0aGUgZGlzcGxheS5cbiIpOwotCQkJcmZiTG9nKCJJZiB5b3VyIHN5c3RlbSBoYXMgZGlzYWJsZWQgaXQgYnkgZGVmYXVsdCwgeW91IGNhblxuIik7Ci0JCQlyZmJMb2coImVuYWJsZSBpdCB0byBnZXQgYSBuaWNlIHgxMXZuYyBwZXJmb3JtYW5jZSBzcGVlZHVwXG4iKTsKLQkJCXJmYkxvZygiZm9yIHNjcm9sbGluZyBieSBwdXR0aW5nIHRoaXMgaW50byB0aGUgXCJNb2R1bGVcIiBzZWN0aW9uXG4iKTsKLQkJCXJmYkxvZygib2YgL2V0Yy9YMTEveG9yZy5jb25mIG9yIC9ldGMvWDExL1hGODZDb25maWc6XG4iKTsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXJmYkxvZygiICBTZWN0aW9uIFwiTW9kdWxlXCJcbiIpOwotCQkJcmZiTG9nKCIgIC4uLlxuIik7Ci0JCQlyZmJMb2coIiAgICAgIExvYWQgICAgXCJyZWNvcmRcIlxuIik7Ci0JCQlyZmJMb2coIiAgLi4uXG4iKTsKLQkJCXJmYkxvZygiICBFbmRTZWN0aW9uXG4iKTsKLQkJCXJmYkxvZygiXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXhyZWNvcmRfcHJlc2VudCA9IDE7Ci0JfQotCi0JaW5pdGlhbGl6ZV94cmVjb3JkKCk7Ci0KLQl0bXBpID0gMTsKLQlpZiAoc2Nyb2xsX2NvcHlyZWN0KSB7Ci0JCWlmIChzdHJzdHIoc2Nyb2xsX2NvcHlyZWN0LCAibmV2ZXIiKSkgewotCQkJdG1waSA9IDA7Ci0JCX0KLQl9IGVsc2UgaWYgKHNjcm9sbF9jb3B5cmVjdF9kZWZhdWx0KSB7Ci0JCWlmIChzdHJzdHIoc2Nyb2xsX2NvcHlyZWN0X2RlZmF1bHQsICJuZXZlciIpKSB7Ci0JCQl0bXBpID0gMDsKLQkJfQotCX0KLQlpZiAoISB4cmVjb3JkX3ByZXNlbnQpIHsKLQkJdG1waSA9IDA7Ci0JfQotI2lmICFMSUJWTkNTRVJWRVJfSEFWRV9SRUNPUkQKLQl0bXBpID0gMDsKLSNlbmRpZgotCWlmICghIHF1aWV0ICYmIHRtcGkgJiYgISByYXdfZmJfc3RyKSB7Ci0JCXJmYkxvZygiXG4iKTsKLQkJcmZiTG9nKCJTY3JvbGwgRGV0ZWN0aW9uOiAtc2Nyb2xsY29weXJlY3QgbW9kZSBpcyBpbiBlZmZlY3QgdG9cbiIpOwotCQlyZmJMb2coIiAgdXNlIFJFQ09SRCBleHRlbnNpb24gdG8gdHJ5IHRvIGRldGVjdCBzY3JvbGxpbmcgd2luZG93c1xuIik7Ci0JCXJmYkxvZygiICAoaW5kdWNlZCBieSBlaXRoZXIgdXNlciBrZXlzdHJva2Ugb3IgbW91c2UgaW5wdXQpLlxuIik7Ci0JCXJmYkxvZygiICBJZiB0aGlzIHlpZWxkcyB1bmRlc2lyZWQgYmVoYXZpb3IgKHBvb3IgcmVzcG9uc2UsIHBhaW50aW5nXG4iKTsKLQkJcmZiTG9nKCIgIGVycm9ycywgZXRjKSBpdCBtYXkgYmUgZGlzYWJsZWQgdmlhOiAnLW5vc2NyJ1xuIik7Ci0JCXJmYkxvZygiICBBbHNvIHNlZSB0aGUgLWhlbHAgZW50cnkgZm9yIHR1bmluZyBwYXJhbWV0ZXJzLlxuIik7Ci0JCXJmYkxvZygiICBZb3UgY2FuIHByZXNzIDMgQWx0X0wncyAoTGVmdCBcIkFsdFwiIGtleSkgaW4gYSByb3cgdG8gXG4iKTsKLQkJcmZiTG9nKCIgIHJlcGFpbnQgdGhlIHNjcmVlbiwgYWxzbyBzZWUgdGhlIC1maXhzY3JlZW4gb3B0aW9uIGZvclxuIik7Ci0JCXJmYkxvZygiICBwZXJpb2RpYyByZXBhaW50cy5cbiIpOwotCQlpZiAoc2NhbGVfc3RyICYmICFzdHJzdHIoc2NhbGVfc3RyLCAibm9jciIpKSB7Ci0JCQlyZmJMb2coIiAgTm90ZTogJy1zY2FsZScgaXMgb24gYW5kIHRoaXMgY2FuIGNhdXNlIG1vcmUgcHJvYmxlbXMuXG4iKTsKLQkJfQotCX0KLQotCWlmICghIHF1aWV0ICYmIG5jYWNoZSAmJiAhIHJhd19mYl9zdHIpIHsKLQkJcmZiTG9nKCJcbiIpOwotCQlyZmJMb2coIkNsaWVudCBTaWRlIENhY2hpbmc6IC1uY2FjaGUgbW9kZSBpcyBpbiBlZmZlY3QgdG8gcHJvdmlkZVxuIik7Ci0JCXJmYkxvZygiICBjbGllbnQtc2lkZSBwaXhlbCBkYXRhIGNhY2hpbmcuICBUaGlzIHNwZWVkcyB1cFxuIik7Ci0JCXJmYkxvZygiICBpY29uaWZ5aW5nL2RlaWNvbmlmeWluZyB3aW5kb3dzLCBtb3ZpbmcgYW5kIHJhaXNpbmdcbiIpOwotCQlyZmJMb2coIiAgd2luZG93cywgYW5kIHJlcG9zdGluZyBtZW51cy4gIEluIHRoZSBzaW1wbGUgQ29weVJlY3RcbiIpOwotCQlyZmJMb2coIiAgZW5jb2Rpbmcgc2NoZW1lIHVzZWQgKG5vIGNvbXByZXNzaW9uKSBhIGh1Z2UgYW1vdW50XG4iKTsKLQkJcmZiTG9nKCIgIG9mIGV4dHJhIG1lbW9yeSAoMjAtMTAwTUIpIGlzIHVzZWQgb24gYm90aCB0aGUgc2VydmVyIGFuZFxuIik7Ci0JCXJmYkxvZygiICBjbGllbnQgc2lkZXMuICBUaGlzIG1vZGUgd29ya3Mgd2l0aCBhbnkgVk5DIHZpZXdlci5cbiIpOwotCQlyZmJMb2coIiAgSG93ZXZlciwgaW4gbW9zdCB5b3UgY2FuIGFjdHVhbGx5IHNlZSB0aGUgY2FjaGVkIHBpeGVsXG4iKTsKLQkJcmZiTG9nKCIgIGRhdGEgYnkgc2Nyb2xsaW5nIGRvd24sIHNvIHlvdSBuZWVkIHRvIHJlLWFkanVzdCBpdHMgc2l6ZS5cbiIpOwotCQlyZmJMb2coIiAgU2VlIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWNsaWVudC1jYWNoaW5nLlxuIik7Ci0JCXJmYkxvZygiICBJZiB0aGlzIG1vZGUgeWllbGRzIHVuZGVzaXJlZCBiZWhhdmlvciAocG9vciByZXNwb25zZSxcbiIpOwotCQlyZmJMb2coIiAgcGFpbnRpbmcgZXJyb3JzLCBldGMpIGl0IG1heSBiZSBkaXNhYmxlZCB2aWE6ICctbmNhY2hlIDAnXG4iKTsKLQkJcmZiTG9nKCIgIFlvdSBjYW4gcHJlc3MgMyBBbHRfTCdzIChMZWZ0IFwiQWx0XCIga2V5KSBpbiBhIHJvdyB0byBcbiIpOwotCQlyZmJMb2coIiAgcmVwYWludCB0aGUgc2NyZWVuLCBhbHNvIHNlZSB0aGUgLWZpeHNjcmVlbiBvcHRpb24gZm9yXG4iKTsKLQkJcmZiTG9nKCIgIHBlcmlvZGljIHJlcGFpbnRzLlxuIik7Ci0JCWlmIChzY2FsZV9zdHIpIHsKLQkJCXJmYkxvZygiICBOb3RlOiAnLXNjYWxlJyBpcyBvbiBhbmQgdGhpcyBjYW4gY2F1c2UgbW9yZSBwcm9ibGVtcy5cbiIpOwotCQl9Ci0JfQotCWlmIChuY2FjaGUgJiYgZ2V0ZW52KCJOQ0FDSEVfREVCVUciKSkgewotCQluY2RiID0gMTsKLQl9Ci0KLQkvKiBjaGVjayBmb3IgT1Mgd2l0aCBzbWFsbCBzaG0gbGltaXRzICovCi0JaWYgKHVzaW5nX3NobSAmJiAhIHNpbmdsZV9jb3B5dGlsZSkgewotCQlpZiAobGltaXRfc2htKCkpIHsKLQkJCXNpbmdsZV9jb3B5dGlsZSA9IDE7Ci0JCX0KLQl9Ci0KLQlzaW5nbGVfY29weXRpbGVfb3JpZyA9IHNpbmdsZV9jb3B5dGlsZTsKLQotCS8qIGNoZWNrIGZvciBNSVQtU0hNICovCi0JaWYgKCEgWFNobVF1ZXJ5RXh0ZW5zaW9uX3dyKGRweSkpIHsKLQkJeHNobV9wcmVzZW50ID0gMDsKLQkJaWYgKCEgdXNpbmdfc2htKSB7Ci0JCQlpZiAoISBxdWlldCAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCQlyZmJMb2coImluZm86IGRpc3BsYXkgZG9lcyBub3Qgc3VwcG9ydCBYU2htLlxuIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoISBxdWlldCAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCXJmYkxvZygiXG4iKTsKLQkJCXJmYkxvZygid2FybmluZzogWFNobSBleHRlbnNpb24gaXMgbm90IGF2YWlsYWJsZS5cbiIpOwotCQkJcmZiTG9nKCJGb3IgYmVzdCBwZXJmb3JtYW5jZSB0aGUgWCBEaXNwbGF5IHNob3VsZCBiZSBsb2NhbC4gKGkuZS5cbiIpOwotCQkJcmZiTG9nKCJ0aGUgeDExdm5jIGFuZCBYIHNlcnZlciBwcm9jZXNzZXMgc2hvdWxkIGJlIHJ1bm5pbmcgb25cbiIpOwotCQkJcmZiTG9nKCJ0aGUgc2FtZSBtYWNoaW5lLilcbiIpOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hTSE0KLQkJCXJmYkxvZygiUmVzdGFydCB3aXRoIC1ub3NobSB0byBvdmVycmlkZSB0aGlzLlxuIik7Ci0JCSAgICB9Ci0JCSAgICBleGl0KDEpOwotI2Vsc2UKLQkJCXJmYkxvZygiU3dpdGNoaW5nIHRvIC1ub3NobSBtb2RlLlxuIik7Ci0JCSAgICB9Ci0JCSAgICB1c2luZ19zaG0gPSAwOwotI2VuZGlmCi0JCX0KLQl9IGVsc2UgewotI2lmICFOT19YMTEKLQkJaW50IG9wLCBldiwgZXI7Ci0JCWlmIChYUXVlcnlFeHRlbnNpb24oZHB5LCAiTUlULVNITSIsICZvcCwgJmV2LCAmZXIpKSB7Ci0JCQl4c2htX29wY29kZSA9IG9wOwotCQkJaWYgKDApIGZwcmludGYoc3RkZXJyLCAieHNobV9vcGNvZGU6ICVkICVkICVkXG4iLCBvcCwgZXYsIGVyKTsKLQkJfQotI2VuZGlmCi0JfQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWEtFWUJPQVJECi0JLyogY2hlY2sgZm9yIFhLRVlCT0FSRCAqLwotCWluaXRpYWxpemVfeGtiKCk7Ci0JaW5pdGlhbGl6ZV93YXRjaF9iZWxsKCk7Ci0JaWYgKCF4a2JfcHJlc2VudCAmJiB1c2VfeGtiX21vZHR3ZWFrKSB7Ci0JCWlmICghIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQkJcmZiTG9nKCJ3YXJuaW5nOiBkaXNhYmxpbmcgeGtiIG1vZHR3ZWFrLiBYS0VZQk9BUkQgZXh0LiBub3QgcHJlc2VudC5cbiIpOwotCQl9Ci0JCXVzZV94a2JfbW9kdHdlYWsgPSAwOwotCX0KLSNlbmRpZgotCi0JaWYgKHhrYl9wcmVzZW50ICYmICF1c2VfeGtiX21vZHR3ZWFrICYmICFnb3Rfbm94a2IpIHsKLQkJaWYgKHVzZV9tb2RpZmllcl90d2VhaykgewotCQkJc3dpdGNoX3RvX3hrYl9pZl9iZXR0ZXIoKTsKLQkJfQotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhSQU5EUgotCWlmICghIFhSUlF1ZXJ5RXh0ZW5zaW9uKGRweSwgJnhyYW5kcl9iYXNlX2V2ZW50X3R5cGUsICZlcikpIHsKLQkJaWYgKHhyYW5kciAmJiAhIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQkJcmZiTG9nKCJEaXNhYmxpbmcgLXhyYW5kciBtb2RlOiBkaXNwbGF5IGRvZXMgbm90IHN1cHBvcnQgWCBSQU5EUi5cbiIpOwotCQl9Ci0JCXhyYW5kcl9iYXNlX2V2ZW50X3R5cGUgPSAwOwotCQl4cmFuZHIgPSAwOwotCQl4cmFuZHJfbWF5YmUgPSAwOwotCQl4cmFuZHJfcHJlc2VudCA9IDA7Ci0JfSBlbHNlIHsKLQkJeHJhbmRyX3ByZXNlbnQgPSAxOwotCX0KLSNlbmRpZgotCi0JY2hlY2tfcG0oKTsKLQotCWlmICghIHF1aWV0ICYmICEgcmF3X2ZiX3N0cikgewotCQlyZmJMb2coIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJcmZiTG9nKCJcbiIpOwotCX0KLQotCXJhd19mYl9wYXNzX2dvX2FuZF9jb2xsZWN0XzIwMF9kb2xsYXJzOgotCi0JaWYgKCEgZHB5IHx8IHJhd19mYl9zdHIpIHsKLQkJaW50IGRvaXQgPSAwOwotCQkvKiBYWFggdGhpcyBuZWVkcyBpbXByb3ZlbWVudCAoZXNwLiBmb3IgcmVtb3RlIGNvbnRyb2wpICovCi0JCWlmICghIHJhd19mYl9zdHIgfHwgc3Ryc3RyKHJhd19mYl9zdHIsICJjb25zb2xlIikgPT0gcmF3X2ZiX3N0cikgewotI2lmZGVmIE1BQ09TWAotCQkJZG9pdCA9IDE7Ci0jZW5kaWYKLQkJfQotCQlpZiAocmF3X2ZiX3N0ciAmJiBzdHJzdHIocmF3X2ZiX3N0ciwgInZuYyIpID09IHJhd19mYl9zdHIpIHsKLQkJCWRvaXQgPSAxOwotCQl9Ci0JCWlmIChkb2l0KSB7Ci0JCQlpZiAoISBtdWx0aXBsZV9jdXJzb3JzX21vZGUpIHsKLQkJCQltdWx0aXBsZV9jdXJzb3JzX21vZGUgPSBzdHJkdXAoIm1vc3QiKTsKLQkJCX0KLQkJCWluaXRpYWxpemVfY3Vyc29yc19tb2RlKCk7Ci0JCQl1c2VfeGRhbWFnZSA9IG9yaWdfdXNlX3hkYW1hZ2U7Ci0JCQlpZiAodXNlX3hkYW1hZ2UpIHsKLQkJCQl4ZGFtYWdlX3ByZXNlbnQgPSAxOwotCQkJCWluaXRpYWxpemVfeGRhbWFnZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCEgZHQpIHsKLQkJc3RhdGljIGNoYXIgc3RyW10gPSAiLWRlc2t0b3AiOwotCQlhcmd2X3ZuY1thcmdjX3ZuYysrXSA9IHN0cjsKLQkJYXJndl92bmNbYXJnY192bmMrK10gPSBjaG9vc2VfdGl0bGUodXNlX2RweSk7Ci0JCXJmYl9kZXNrdG9wX25hbWUgPSBzdHJkdXAoYXJndl92bmNbYXJnY192bmMtMV0pOwotCX0KLQkKLQkvKgotCSAqIENyZWF0ZSB0aGUgWEltYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpc3BsYXkgZnJhbWVidWZmZXIuCi0JICovCi0KLQlmYjAgPSBpbml0aWFsaXplX3hkaXNwbGF5X2ZiKCk7Ci0KLQkvKgotCSAqIEluIHNvbWUgY2FzZXMgKFVJTlBVVCB0b3VjaHNjcmVlbnMpIHdlIG5lZWQgdGhlIGRweV94IGRweV95Ci0JICogdG8gaW5pdGlhbGl6ZSBwaXBlaW5wdXQuIFNvIHdlIGRvIGl0IGFmdGVyIGZiIGlzIGNyZWF0ZWQuCi0JICovCi0JaW5pdGlhbGl6ZV9waXBlaW5wdXQoKTsKLQotCS8qCi0JICogbi5iLiB3ZSBkbyBub3QgaGF2ZSB0byBYX0xPQ0sgYW55IFgxMSBjYWxscyB1bnRpbCB3YXRjaF9sb29wKCkKLQkgKiBpcyBjYWxsZWQgc2luY2Ugd2UgYXJlIHNpbmdsZS10aHJlYWRlZCB1bnRpbCB0aGVuLgotCSAqLwotCi0JaW5pdGlhbGl6ZV9zY3JlZW4oJmFyZ2Nfdm5jLCBhcmd2X3ZuYywgZmIwKTsKLQotCWlmICh3YWl0ZWRfZm9yX2NsaWVudCkgewotCQlpZiAoZmFrZV9mYikgewotCQkJZnJlZShmYWtlX2ZiKTsKLQkJCWZha2VfZmIgPSBOVUxMOwotCQl9Ci0JCWlmICh1c2Vfc29saWRfYmcgJiYgY2xpZW50X2NvdW50KSB7Ci0JCQlzb2xpZF9iZygwKTsKLQkJfQotCQlpZiAoYWNjZXB0X2NtZCAmJiBzdHJzdHIoYWNjZXB0X2NtZCwgInBvcHVwIikgPT0gYWNjZXB0X2NtZCkgewotCQkJcmZiQ2xpZW50SXRlcmF0b3JQdHIgaXRlcjsKLQkJCXJmYkNsaWVudFB0ciBjbCwgY2wwID0gTlVMTDsKLQkJCWludCBpID0gMDsKLQkJCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCQkJd2hpbGUoIChjbCA9IHJmYkNsaWVudEl0ZXJhdG9yTmV4dChpdGVyKSkgKSB7Ci0JCQkJaSsrOwkKLQkJCQlpZiAoaSAhPSAxKSB7Ci0JCQkJCXJmYkxvZygiV0FJVCBwb3B1cDogdG9vIG1hbnkgY2xpZW50c1xuIik7Ci0JCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQkJfQotCQkJCWNsMCA9IGNsOwotCQkJfQotCQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCQkJaWYgKGkgIT0gMSB8fCBjbDAgPT0gTlVMTCkgewotCQkJCXJmYkxvZygiV0FJVCBwb3B1cDogbm8gY2xpZW50cy5cbiIpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlpZiAoISBhY2NlcHRfY2xpZW50KGNsMCkpIHsKLQkJCQlyZmJMb2coIldBSVQgcG9wdXA6IGRlbmllZC5cbiIpOwotCQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCQl9Ci0JCQlyZmJMb2coIndhaXRlZF9mb3JfY2xpZW50OiBwb3B1cCBhY2NlcHRlZC5cbiIpOwotCQkJY2wwLT5vbkhvbGQgPSBGQUxTRTsKLQkJfQotCQlpZiAobWFjb3N4X2NvbnNvbGUpIHsKLQkJCXJlZnJlc2hfc2NyZWVuKDEpOwotCQl9Ci0JCWlmIChkcHkgJiYgeGRtY3BfaW5zZXJ0ICE9IE5VTEwpIHsKLSNpZiAhTk9fWDExCi0JCQljaGFyIGM7Ci0JCQlpbnQgbiA9IHN0cmxlbih4ZG1jcF9pbnNlcnQpOwotCQkJS2V5Q29kZSBrLCBrMjsKLQkJCUtleVN5bSBzeW07Ci0JCQlpbnQgaSwgb2sgPSAxOwotCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJCWMgPSB4ZG1jcF9pbnNlcnRbaV07Ci0JCQkJc3ltID0gKEtleVN5bSkgYzsKLQkJCQlpZiAoc3ltIDwgJyAnIHx8IHN5bSA+IDB4N2YpIHsKLQkJCQkJb2sgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJayA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBzeW0pOwotCQkJCWlmIChrID09IE5vU3ltYm9sKSB7Ci0JCQkJCW9rID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9rKSB7Ci0JCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJdXNsZWVwKDIqMTAwMCoxMDAwKTsKLQkJCQlpZiAoIXF1aWV0KSB7Ci0JCQkJCXJmYkxvZygic2VuZGluZyBYRE0gJyVzJ1xuIiwgeGRtY3BfaW5zZXJ0KTsKLQkJCQl9Ci0JCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJCQljID0geGRtY3BfaW5zZXJ0W2ldOwotCQkJCQlzeW0gPSAoS2V5U3ltKSBjOwotCQkJCQlrID0gWEtleXN5bVRvS2V5Y29kZShkcHksIHN5bSk7Ci0JCQkJCWlmIChpc3VwcGVyKGMpKSB7Ci0JCQkJCQlrMiA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBYS19TaGlmdF9MKTsKLQkJCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgazIsIFRydWUsIEN1cnJlbnRUaW1lKTsKLQkJCQkJCVhGbHVzaF93cihkcHkpOwotCQkJCQkJdXNsZWVwKDEwMCoxMDAwKTsKLQkJCQkJfQotCQkJCQlpZiAoMCkgZnByaW50ZihzdGRlcnIsICJDL2sgJWMvJXhcbiIsIGMsIGspOwotCQkJCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGssIFRydWUsIEN1cnJlbnRUaW1lKTsKLQkJCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJCXVzbGVlcCgxMDAqMTAwMCk7Ci0JCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgaywgRmFsc2UsIEN1cnJlbnRUaW1lKTsKLQkJCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJCXVzbGVlcCgxMDAqMTAwMCk7Ci0JCQkJCWlmIChpc3VwcGVyKGMpKSB7Ci0JCQkJCQlrMiA9IFhLZXlzeW1Ub0tleWNvZGUoZHB5LCBYS19TaGlmdF9MKTsKLQkJCQkJCVhUZXN0RmFrZUtleUV2ZW50X3dyKGRweSwgazIsIEZhbHNlLCBDdXJyZW50VGltZSk7Ci0JCQkJCQlYRmx1c2hfd3IoZHB5KTsKLQkJCQkJCXVzbGVlcCgxMDAqMTAwMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJazIgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfVGFiKTsKLQkJCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGsyLCBUcnVlLCBDdXJyZW50VGltZSk7Ci0JCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQkJdXNsZWVwKDEwMCoxMDAwKTsKLQkJCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGsyLCBGYWxzZSwgQ3VycmVudFRpbWUpOwotCQkJCVhGbHVzaF93cihkcHkpOwotCQkJCXVzbGVlcCgxMDAqMTAwMCk7Ci0JCQl9Ci0JCQlmcmVlKHhkbWNwX2luc2VydCk7Ci0jZW5kaWYKLQkJfQotCQljaGVja19yZWRpcl9zZXJ2aWNlcygpOwotCX0KLQotCWlmICghIHdhaXRlZF9mb3JfY2xpZW50KSB7Ci0JCWlmICh0cnlfaHR0cCAmJiAhIGdvdF9odHRwZGlyICYmIGNoZWNrX2h0dHBkaXIoKSkgewotCQkJaHR0cF9jb25uZWN0aW9ucygxKTsKLQkJfQotCQlpZiAoc3NoX3N0ciAhPSBOVUxMKSB7Ci0JCQlzc2hfcmVtb3RlX3R1bm5lbChzc2hfc3RyLCBzY3JlZW4tPnBvcnQpOwotCQl9Ci0JfQotCi0JaW5pdGlhbGl6ZV90aWxlcygpOwotCi0JLyogcmVjdGFuZ3VsYXIgYmxhY2tvdXQgcmVnaW9ucyAqLwotCWluaXRpYWxpemVfYmxhY2tvdXRzX2FuZF94aW5lcmFtYSgpOwotCi0JLyogY3JlYXRlZCBzaG0gb3IgWEltYWdlcyB3aGVuIHVzaW5nX3NobSA9IDAgKi8KLQlpbml0aWFsaXplX3BvbGxpbmdfaW1hZ2VzKCk7Ci0KLQlpbml0aWFsaXplX3NpZ25hbHMoKTsKLQotCWluaXRpYWxpemVfc3BlZWRzKCk7Ci0KLQlpZiAoc3BlZWRzX3JlYWRfcmF0ZV9tZWFzdXJlZCA+IDgwKSB7Ci0JCS8qIGZyYW1lYnVmZmVyIHJlYWQgaXMgZmFzdCBhdCA+IDgwIE1CL3NlYyAqLwotCQlpbnQgc2FtZSA9IDA7Ci0JCWlmICh3YWl0bXMgPT0gZGVmZXJfdXBkYXRlKSB7Ci0JCQlzYW1lID0gMTsKLQkJfQotCQlpZiAoISBnb3Rfd2FpdG1zKSB7Ci0JCQl3YWl0bXMgLz0gMjsKLQkJCWlmICh3YWl0bXMgPCA1KSB7Ci0JCQkJd2FpdG1zID0gNTsKLQkJCX0KLQkJCWlmICghcXVpZXQpIHsKLQkJCQlyZmJMb2coImZhc3QgcmVhZDogcmVzZXQgLXdhaXQgIG1zIHRvOiAlZFxuIiwgd2FpdG1zKTsKLQkJCX0KLQkJfQotCQlpZiAoISBnb3RfZGVmZXJ1cGRhdGUgJiYgISBnb3RfZGVmZXIpIHsKLQkJCWlmIChkZWZlcl91cGRhdGUgPiAxMCkgewotCQkJCWlmIChzYW1lKSB7Ci0JCQkJCWRlZmVyX3VwZGF0ZSA9IHdhaXRtczsKLQkJCQl9IGVsc2UgewotCQkJCQlkZWZlcl91cGRhdGUgPSAxMDsKLQkJCQl9Ci0JCQkJaWYgKHNjcmVlbikgewotCQkJCQlzY3JlZW4tPmRlZmVyVXBkYXRlVGltZSA9IGRlZmVyX3VwZGF0ZTsKLQkJCQl9Ci0JCQkJcmZiTG9nKCJmYXN0IHJlYWQ6IHJlc2V0IC1kZWZlciBtcyB0bzogJWRcbiIsIGRlZmVyX3VwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpbml0aWFsaXplX2tleWJvYXJkX2FuZF9wb2ludGVyKCk7Ci0KLQlpZiAoaW5ldGQgJiYgdXNlX29wZW5zc2wpIHsKLQkJaWYgKCEgd2FpdGVkX2Zvcl9jbGllbnQpIHsKLQkJCWFjY2VwdF9vcGVuc3NsKE9QRU5TU0xfSU5FVEQsIC0xKTsKLQkJfQotCX0KLQlpZiAoISBpbmV0ZCAmJiAhIHVzZV9vcGVuc3NsKSB7Ci0JCWlmICghIHNjcmVlbi0+cG9ydCB8fCBzY3JlZW4tPmxpc3RlblNvY2sgPCAwKSB7Ci0JCQlpZiAoZ290X3JmYnBvcnQgJiYgZ290X3JmYnBvcnRfdmFsID09IDApIHsKLQkJCQk7Ci0JCQl9IGVsc2UgaWYgKGlwdjZfbGlzdGVuICYmIGlwdjZfbGlzdGVuX2ZkID49IDApIHsKLQkJCQlyZmJMb2coIkluZm86IGxpc3RlbmluZyBvbmx5IG9uIElQdjYgaW50ZXJmYWNlLlxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXJmYkxvZ0VuYWJsZSgxKTsKLQkJCQlyZmJMb2coIkVycm9yOiBjb3VsZCBub3Qgb2J0YWluIGxpc3RlbmluZyBwb3J0LlxuIik7Ci0JCQkJaWYgKCFnb3RfcmZicG9ydCAmJiAhZ290X2lwdjZfbGlzdGVuKSB7Ci0JCQkJCXJmYkxvZygiSWYgdGhpcyBzeXN0ZW0gaXMgSVB2Ni1vbmx5LCB1c2UgdGhlIC02IG9wdGlvbi5cbiIpOwotCQkJCX0KLQkJCQljbGVhbl91cF9leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKHJlbW90ZV9jbWQgfHwgcXVlcnlfY21kKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCWRvdWJsZSBkdCA9IGRub3coKTsKLQkJY29weV9zY3JlZW4oKTsKLQkJZHQgPSBkbm93KCkgLSBkdDsKLQkJcmZiTG9nKCJtYWNvc3hfY29uc29sZTogY29waWVkIHNjcmVlbiBpbiAlLjNmIHNlYyAlLjFmIE1CL3NlY1xuIiwKLQkJICAgIGR0LCBkcHlfeCAqIGRweV95ICogYnBwIC8gKDFlKzYgKiA4ICogZHQpKTsKLQotCX0KLSNlbmRpZgotCi0JaWYgKCEgcXVpZXQpIHsKLQkJcmZiTG9nKCJzY3JlZW4gc2V0dXAgZmluaXNoZWQuXG4iKTsKLQkJaWYgKFNIT1dfTk9fUEFTU1dPUkRfV0FSTklORyAmJiAhbm9wdykgewotCQkJcmZiTG9nKCJcbiIpOwotCQkJcmZiTG9nKCJXQVJOSU5HOiBZb3UgYXJlIHJ1bm5pbmcgeDExdm5jIFdJVEhPVVQiCi0JCQkgICAgIiBhIHBhc3N3b3JkLiAgU2VlXG4iKTsKLQkJCXJmYkxvZygiV0FSTklORzogdGhlIHdhcm5pbmcgbWVzc2FnZSBwcmludGVkIGFib3ZlIgotCQkJICAgICIgZm9yIG1vcmUgaW5mby5cbiIpOwotCQl9Ci0JfQotCXNldF92bmNfZGVza3RvcF9uYW1lKCk7Ci0KLQlpZiAobmNhY2hlX2JldGFfdGVzdGVyICYmIChuY2FjaGUgIT0gMCB8fCBuY2FjaGVfbXNnKSkgewotCQluY2FjaGVfYmV0YV90ZXN0ZXJfbWVzc2FnZSgpOwotCX0KLQotCWlmIChyZW1vdGVfY21kIHx8IHF1ZXJ5X2NtZCkgewotCQkvKiBUaGlzIGlzIERJUkVDVDogY2FzZSAqLwotCQlkb19yZW1vdGVfcXVlcnkocmVtb3RlX2NtZCwgcXVlcnlfY21kLCByZW1vdGVfc3luYywgcXVlcnlfZGVmYXVsdCk7Ci0JCWlmIChnZXRlbnYoIlNMRUVQIikpIHNsZWVwKGF0b2koZ2V0ZW52KCJTTEVFUCIpKSk7Ci0JCWNsZWFuX3VwX2V4aXQoMCk7Ci0JfQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSyAmJiBMSUJWTkNTRVJWRVJfSEFWRV9TRVRTSUQKLQlpZiAoYmcpIHsKLQkJaW50IHAsIG47Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19MT09QX01PREVfQkciKSkgewotCQkJaWYgKHNjcmVlbiAmJiBzY3JlZW4tPmxpc3RlblNvY2sgPj0gMCkgewotCQkJCWNsb3NlKHNjcmVlbi0+bGlzdGVuU29jayk7Ci0JCQkJRkRfQ0xSKHNjcmVlbi0+bGlzdGVuU29jaywmc2NyZWVuLT5hbGxGZHMpOwotCQkJCXNjcmVlbi0+bGlzdGVuU29jayA9IC0xOwotCQkJfQotCQkJaWYgKHNjcmVlbiAmJiBzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID49IDApIHsKLQkJCQljbG9zZShzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrKTsKLQkJCQlzY3JlZW4tPmh0dHBMaXN0ZW5Tb2NrID0gLTE7Ci0JCQl9Ci0JCQlpZiAob3BlbnNzbF9zb2NrID49IDApIHsKLQkJCQljbG9zZShvcGVuc3NsX3NvY2spOwotCQkJCW9wZW5zc2xfc29jayA9IC0xOwotCQkJfQotCQkJaWYgKGh0dHBzX3NvY2sgPj0gMCkgewotCQkJCWNsb3NlKGh0dHBzX3NvY2spOwotCQkJCWh0dHBzX3NvY2sgPSAtMTsKLQkJCX0KLQkJCWlmIChvcGVuc3NsX3NvY2s2ID49IDApIHsKLQkJCQljbG9zZShvcGVuc3NsX3NvY2s2KTsKLQkJCQlvcGVuc3NsX3NvY2s2ID0gLTE7Ci0JCQl9Ci0JCQlpZiAoaHR0cHNfc29jazYgPj0gMCkgewotCQkJCWNsb3NlKGh0dHBzX3NvY2s2KTsKLQkJCQlodHRwc19zb2NrNiA9IC0xOwotCQkJfQotCQkJaWYgKGlwdjZfbGlzdGVuX2ZkID49IDApIHsKLQkJCQljbG9zZShpcHY2X2xpc3Rlbl9mZCk7Ci0JCQkJaXB2Nl9saXN0ZW5fZmQgPSAtMTsKLQkJCX0KLQkJCWlmIChpcHY2X2h0dHBfZmQgPj0gMCkgewotCQkJCWNsb3NlKGlwdjZfaHR0cF9mZCk7Ci0JCQkJaXB2Nl9odHRwX2ZkID0gLTE7Ci0JCQl9Ci0JCX0KLQkJLyogZm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kIG5vdyAqLwotCQlpZiAoKHAgPSBmb3JrKCkpID4gMCkgIHsKLQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSBpZiAocCA9PSAtMSkgewotCQkJcmZiTG9nRW5hYmxlKDEpOwotCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZm9ya1xuIik7Ci0JCQlwZXJyb3IoImZvcmsiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJaWYgKHNldHNpZCgpID09IC0xKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInNldHNpZCBmYWlsZWRcbiIpOwotCQkJcGVycm9yKCJzZXRzaWQiKTsKLQkJCWNsZWFuX3VwX2V4aXQoMSk7Ci0JCX0KLQkJLyogYWRqdXN0IG91ciBzdGRpbyAqLwotCQluID0gb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOwotCQlkdXAyKG4sIDApOwotCQlkdXAyKG4sIDEpOwotCQlpZiAoISBsb2dmaWxlKSB7Ci0JCQlkdXAyKG4sIDIpOwotCQl9Ci0JCWlmIChuID4gMikgewotCQkJY2xvc2Uobik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXdhdGNoX2xvb3AoKTsKLQotCXJldHVybigwKTsKLQotI3VuZGVmIGFyZ2MKLSN1bmRlZiBhcmd2Ci0KLX0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3gxMXZuYy5kZXNrdG9wIGIveDExdm5jL3gxMXZuYy5kZXNrdG9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2E4YWQyLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy94MTF2bmMuZGVza3RvcAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVtEZXNrdG9wIEVudHJ5XQotTmFtZT1YMTFWTkMgU2VydmVyCi1Db21tZW50PVNoYXJlIHRoaXMgZGVza3RvcCBieSBWTkMKLUV4ZWM9eDExdm5jIC1ndWkgdHJheT1zZXRwYXNzIC1yZmJwb3J0IFBST01QVCAtYmcgLW8gJSVIT01FLy54MTF2bmMubG9nLiUlVk5DRElTUExBWQotSWNvbj1jb21wdXRlcgotVGVybWluYWw9ZmFsc2UKLVR5cGU9QXBwbGljYXRpb24KLVN0YXJ0dXBOb3RpZnk9ZmFsc2UKLSNTdGFydHVwV01DbGFzcz14MTF2bmNfcG9ydF9wcm9tcHQKLUNhdGVnb3JpZXM9TmV0d29yaztSZW1vdGVBY2Nlc3M7CmRpZmYgLS1naXQgYS94MTF2bmMveDExdm5jLmggYi94MTF2bmMveDExdm5jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTUzMWQuLjAwMDAwMDAKLS0tIGEveDExdm5jL3gxMXZuYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjk5ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1gxMVZOQ19ICi0jZGVmaW5lIF9YMTFWTkNfWDExVk5DX0gKLQotLyogLS0geDExdm5jLmggLS0gKi8KLS8qIAotICogVGhlc2UgJyAtLSBmaWxlbmFtZS5bY2hdIC0tICcgY29tbWVudHMgcmVwcmVzZW50IGEgcGFydGlhbCBjbGVhbnVwOgotICogdGhleSBhcmUgYW4gb2RkIHdheSB0byBpbmRpY2F0ZSBob3cgdGhpcyBodWdlIGZpbGUgd291bGQgYmUgc3BsaXQgdXAKLSAqIHNvbWVkYXkgaW50byBtdWx0aXBsZSBmaWxlcy4KLSAqCi0gKiBUaGUgcHJpbWFyeSByZWFzb24gd2UgaGF2ZSBub3QgYnJva2VuIHVwIHRoaXMgZmlsZSBpcyBmb3IgdXNlcgotICogY29udmVuaWVuY2U6IHRob3NlIHdhbnRpbmcgdG8gdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBkb3dubG9hZCBhIHNpbmdsZQotICogZmlsZSwgeDExdm5jLmMsIGFuZCBvZmYgdGhleSBnby4uLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGFuZGFyZCBpbmNsdWRlcyBhbmQgbGlidm5jc2VydmVyICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2lmZGVmIF9faHB1eAotLyogdG8gYXZvaWQgc2VsZWN0KCkgY29tcGlsZXIgd2FybmluZyAqLwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSA8cmZiL3JmYi5oPgotI2luY2x1ZGUgPHJmYi9yZmJyZWdpb24uaD4KLQotCi0vKiB3ZSBjYW4gbm93IGJ1aWxkIHVuZGVyIC0td2l0aG91dC14OiAqLwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1gxMQotCi0jZGVmaW5lIE5PX1gxMSAwCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KLSNpbmNsdWRlIDxYMTEvWGF0b20uaD4KLQotI2Vsc2UKLQotI2RlZmluZSBOT19YMTEgMQotI2lmbmRlZiBTS0lQX05PX1gxMQotI2luY2x1ZGUgIm5veDExLmgiCi0jZW5kaWYKLSNpbmNsdWRlIDxyZmIva2V5c3ltLmg+Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICogQnVpbGQtdGltZSBjdXN0b21pemF0aW9uIHZpYSBDUFBGTEFHUy4KLSAqCi0gKiBTdW1tYXJ5IG9mIG9wdGlvbnMgdG8gaW5jbHVkZSBpbiBDUFBGTEFHUyBmb3IgY3VzdG9tIGJ1aWxkczoKLSAqCi0gKiAtRFZOQ1NIQVJFRCAgdG8gaGF2ZSB0aGUgdm5jIGRpc3BsYXkgc2hhcmVkIGJ5IGRlZmF1bHQuCi0gKiAtREZPUkVWRVIgIHRvIGhhdmUgLWZvcmV2ZXIgb24gYnkgZGVmYXVsdC4KLSAqIC1ETk9SRVBFQVQ9MCAgdG8gaGF2ZSAtcmVwZWF0IG9uIGJ5IGRlZmF1bHQuCi0gKiAtRFhJTkVSQU1BPTAgIHRvIGhhdmUgLW5veGluZXJhbWEgb24gYnkgZGVmYXVsdC4KLSAqIC1EQURES0VZU1lNUz0wICB0byBoYXZlIC1ub2FkZF9rZXlzeW1zIHRoZSBkZWZhdWx0LgotICoKLSAqIC1EUkVNT1RFX0RFRkFVTFQ9MCAgdG8gZGlzYWJsZSByZW1vdGUtY29udHJvbCBvbiBieSBkZWZhdWx0ICgteWVzcmVtb3RlKS4KLSAqIC1EUkVNT1RFX0NPTlRST0w9MCAgdG8gZGlzYWJsZSByZW1vdGUtY29udHJvbCBtZWNoYW5pc20gY29tcGxldGVseS4KLSAqIC1ERVhURVJOQUxfQ09NTUFORFM9MCAgdG8gZGlzYWJsZSB0aGUgcnVubmluZyBvZiBhbGwgZXh0ZXJuYWwgY29tbWFuZHMuCi0gKiAtRFRJR0hURklMRVhGRVI9MCAgZGlzYWJsZSB0aWdodGZpbGV4ZmVyLgotICoKLSAqIC1ESEFSRFdJUkVfUEFTU1dEPS4uLiAgICAgIGhhcmR3aXJlZCBwYXNzd29yZHMsIHF1b3RpbmcgbmVjZXNzYXJ5LgotICogLURIQVJEV0lSRV9WSUVXUEFTU1dEPS4uLgotICogLUROT1BXPTEgICAgICAgICAgICAgICAgICAgbWFrZSAtbm9wdyB0aGUgZGVmYXVsdCAoc2tpcCB3YXJuaW5nKQotICogLURVU0VQVz0xICAgICAgICAgICAgICAgICAgbWFrZSAtdXNlcHcgdGhlIGRlZmF1bHQKLSAqIC1EUEFTU1dEX1JFUVVJUkVEPTEgICAgICAgIGV4aXQgdW5sZXNzIGEgcGFzc3dvcmQgaXMgc3VwcGxpZWQuCi0gKiAtRFBBU1NXRF9VTkxFU1NfTk9QVz0xICAgICBleGl0IHVubGVzcyBhIHBhc3N3b3JkIGlzIHN1cHBsaWVkIGFuZCBubyAtbm9wdy4KLSAqCi0gKiAtRENVUlNPUl9EUkFHPTEgIHRvIGhhdmUgLWN1cnNvcl9kcmFnIGFzIHRoZSBkZWZhdWx0LgotICogLURXSVJFRlJBTUU9MCAgdG8gaGF2ZSAtbm93aXJlZnJhbWUgYXMgdGhlIGRlZmF1bHQuCi0gKiAtRFdJUkVGUkFNRV9DT1BZUkVDVD0wICB0byBoYXZlIC1ub3dpcmVjb3B5cmVjdCBhcyB0aGUgZGVmYXVsdC4KLSAqIC1EV0lSRUZSQU1FX1BBUk1TPS4uLiAgIHNldCBkZWZhdWx0IC13aXJlY29weXJlY3QgcGFyYW1ldGVycy4KLSAqIC1EU0NST0xMX0NPUFlSRUNUPTAgICAgIHRvIGhhdmUgLW5vc2Nyb2xsY29weXJlY3QgYXMgdGhlIGRlZmF1bHQuCi0gKiAtRFNDUk9MTF9DT1BZUkVDVF9QQVJNUz0uLi4gIHNldCBkZWZhdWx0IC1zY3JvbGxjb3B5cmVjdCBwYXJhbWV0ZXJzLgotICogLURTQ0FMSU5HX0NPUFlSRUNUPTAKLSAqIC1EWERBTUFHRT0wICAgIHRvIGhhdmUgLW5veGRhbWFnZSBhcyB0aGUgZGVmYXVsdC4KLSAqIC1EU0tJUERVUFM9MCAgIHRvIGhhdmUgLW5vc2tpcF9kdXBzIGFzIHRoZSBkZWZhdWx0IG9yIHZpY2UgdmVyc2EuCi0gKgotICogLURQT0lOVEVSX01PREVfREVGQVVMVD17MCwxLDIsMyw0fSAgc2V0IGRlZmF1bHQgLXBvaW50ZXJfbW9kZS4KLSAqIC1EQk9MRExZX0NMT1NFX0RJU1BMQVk9MCAgdG8gbm90IGNsb3NlIFggRElTUExBWSB1bmRlciAtcmF3ZmIuCi0gKiAtRFNNQUxMX0ZPT1RQUklOVD0xICBmb3Igc21hbGxlciBiaW5hcnkgc2l6ZSAobm8gaGVscCwgbm8gZ3VpLCBldGMpIAotICogICAgICAgICAgICAgICAgICAgICAgdXNlIDIgb3IgMyBmb3IgZXZlbiBzbWFsbGVyIGZvb3RwcmludC4KLSAqIC1ETk9HVUkgIGRvIG5vdCBpbmNsdWRlIHRoZSBndWkgdGt4MTF2bmMuCi0gKiAtRFNLSVBfSEVMUD0xICAgc21hbGxlci4KLSAqIC1EU0tJUF9YS0I9MSAgICBhIGxpdHRsZSBzbWFsbGVyLgotICogLURTS0lQXzh0bzI0PTEgIGEgbGl0dGxlIHNtYWxsZXIuCi0gKiAtRFBPTExfOFRPMjRfREVMQVk9TiAgCi0gKiAtRERFQlVHX1hFVkVOVFM9MSAgZW5hYmxlIHByaW50b3V0IGZvciBYIGV2ZW50cy4KLSAqCi0gKiAtRFgxMVZOQ19NQUNPU1hfVVNFX0dFVE1BSU5ERVZJQ0UgdXNlIGRlcHJlY2F0ZWQgR2V0TWFpbkRldmljZSBvbiBtYWNvc3ggCi0gKgotICogLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9ezAsMX0KLSAqIC1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFM9ezAsMX0KLSAqIC1EWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0ZSQU1FQlVGRkVSPXswLDF9Ci0gKgotICogb3IgZm9yIGFsbDoKLSAqCi0gKiAtRFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRD0xCi0gKgotICogZW52LiB2YXIuIG9mIHRoZSBzYW1lIG5hbWVzIGFzIGFib3ZlIGNhbiBiZSBzZXQgdG8gaW1wbHkgdHJ1ZS4KLSAqCi0gKiBTZXQgdGhlc2UgaW4gQ1BQRkxBR1MgYmVmb3JlIHJ1bm5pbmcgY29uZmlndXJlLiBFLmcuOgotICoKLSAqICAgJSBlbnYgQ1BQRkxBR1M9Ii1ERk9SRVZFUiAtRFJFTU9URV9DT05UUk9MPTAiIC4vY29uZmlndXJlCi0gKiAgICUgbWFrZQotICovCi0KLS8qCi0gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbS4KLSAqLwotI2lmbmRlZiBSRU1PVEVfQ09OVFJPTAotI2RlZmluZSBSRU1PVEVfQ09OVFJPTCAxCi0jZW5kaWYKLQotI2lmbmRlZiBYSU5FUkFNQQotI2RlZmluZSBYSU5FUkFNQSAxCi0jZW5kaWYKLQotI2lmbmRlZiBOT1BXCi0jZGVmaW5lIE5PUFcgMAotI2VuZGlmCi0KLSNpZm5kZWYgVVNFUFcKLSNkZWZpbmUgVVNFUFcgMAotI2VuZGlmCi0KLSNpZm5kZWYgUEFTU1dEX1JFUVVJUkVECi0jZGVmaW5lIFBBU1NXRF9SRVFVSVJFRCAwCi0jZW5kaWYKLQotI2lmbmRlZiBQQVNTV0RfVU5MRVNTX05PUFcKLSNkZWZpbmUgUEFTU1dEX1VOTEVTU19OT1BXIDAKLSNlbmRpZgotCi0vKiBzb21lIC1EIG1hY3JvcyBmb3IgYnVpbGRpbmcgd2l0aCBvbGQgTGliVk5DU2VydmVyICovCi0jaWZuZGVmIExJQlZOQ1NFUlZFUl9IQVNfU1RBVFMKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBU19TVEFUUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBMSUJWTkNTRVJWRVJfSEFTX1NIVVRET1dOU09DS0VUUwotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFTX1NIVVRET1dOU09DS0VUUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBMSUJWTkNTRVJWRVJfSEFTX1RFWFRDSEFUCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVNfVEVYVENIQVQgMQotI2VuZGlmCi0KLSNpZmRlZiBQUkVfMF84X0xJQlZOQ1NFUlZFUgotI3VuZGVmICBMSUJWTkNTRVJWRVJfV0lUSF9USUdIVFZOQ19GSUxFVFJBTlNGRVIKLSN1bmRlZiAgTElCVk5DU0VSVkVSX0hBU19TVEFUUwotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFTX1NIVVRET1dOU09DS0VUUwotI3VuZGVmICBMSUJWTkNTRVJWRVJfSEFTX1RFWFRDSEFUIAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFTX1NUQVRTIDAKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBU19TSFVURE9XTlNPQ0tFVFMgMAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFTX1RFWFRDSEFUIDAKLSNlbmRpZgotCi0vKiB0aGVzZSBhcmUgZm9yIGRlbGF5aW5nIGZlYXR1cmVzOiAqLwotI2RlZmluZSB4eE5PX05DQUNIRQotCi0vKgotICogQmVnaW5uaW5nIG9mIHN1cHBvcnQgZm9yIHNtYWxsIGJpbmFyeSBmb290cHJpbnQgYnVpbGQgZm9yIGVtYmVkZGVkCi0gKiBzeXN0ZW1zLCBQREEncyBldGMuICBJdCBjdXJyZW50bHkganVzdCBjdXRzIG91dCB0aGUgbG93LWhhbmdpbmcKLSAqIGZydWl0IChsYXJnZSB0ZXh0IHBhc3NhZ2VzKS4gIFNldCB0byAyLCAzIHRvIGN1dCBvdXQgc29tZSBvZiB0aGUKLSAqIG1vcmUgZXNvdGVyaWMgZXh0ZW5zaW9ucy4gIE1vcmUgdGVkaW91cyBpcyB0byBtb2RpZnkgTERGTEFHUyBpbiB0aGUKLSAqIE1ha2VmaWxlIHRvIG5vdCBsaW5rIGFnYWluc3QgdGhlIGV4dGVuc2lvbiBsaWJyYXJpZXMuLi4gYnV0IHRoYXQKLSAqIHNob3VsZCBiZSBkb25lIHRvbyAobWFudWFsbHkgZm9yIG5vdykuCi0gKgotICogSWYgdGhlcmUgaXMgaW50ZXJlc3QgbW9yZSBvZiB0aGUgYmxvYXQgY2FuIGJlIHJlbW92ZWQuLi4gIEN1cnJlbnRseQotICogdGhlc2Ugc2hyaW5rIHRoZSBiaW5hcnkgZnJvbSAxMTAwSyB0byBhYm91dCA2MDBLLgotICovCi0jaWZuZGVmIFNNQUxMX0ZPT1RQUklOVAotI2RlZmluZSBTTUFMTF9GT09UUFJJTlQgMAotI2VuZGlmCi0KLSNpZm5kZWYgU0tJUF9YS0IKLSNkZWZpbmUgU0tJUF9YS0IgMAotI2VuZGlmCi0jaWZuZGVmIFNLSVBfOFRPMjQKLSNkZWZpbmUgU0tJUF84VE8yNCAwCi0jZW5kaWYKLSNpZm5kZWYgU0tJUF9IRUxQCi0jZGVmaW5lIFNLSVBfSEVMUCAwCi0jZW5kaWYKLQotI2lmIFNNQUxMX0ZPT1RQUklOVAotI3VuZGVmICBOT0dVSQotI2RlZmluZSBOT0dVSQotI3VuZGVmICBTS0lQX0hFTFAKLSNkZWZpbmUgU0tJUF9IRUxQIDEKLSNlbmRpZgotCi0jaWYgKFNNQUxMX0ZPT1RQUklOVCA+IDEpCi0jdW5kZWYgU0tJUF9YS0IKLSN1bmRlZiBTS0lQXzhUTzI0Ci0jdW5kZWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWElORVJBTUEKLSN1bmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYRklYRVMKLSN1bmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYREFNQUdFCi0jZGVmaW5lIFNLSVBfWEtCIDEKLSNkZWZpbmUgU0tJUF84VE8yNCAxCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhJTkVSQU1BIDAKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfTElCWEZJWEVTIDAKLSNkZWZpbmUgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRSAwCi0jZW5kaWYKLQotI2lmIChTTUFMTF9GT09UUFJJTlQgPiAyKQotI3VuZGVmIExJQlZOQ1NFUlZFUl9IQVZFX1VUTVBYX0gKLSN1bmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSAotI3VuZGVmIFJFTU9URV9DT05UUk9MCi0jZGVmaW5lIExJQlZOQ1NFUlZFUl9IQVZFX1VUTVBYX0ggMAotI2RlZmluZSBMSUJWTkNTRVJWRVJfSEFWRV9QV0RfSCAwCi0jZGVmaW5lIFJFTU9URV9DT05UUk9MIDAKLSNlbmRpZgotCi0jaWZuZGVmIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUwotI2lmICAgICBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQKLSNkZWZpbmUgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0xPQ0FMRVZFTlRTIDEKLSNlbHNlCi0jZGVmaW5lIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9MT0NBTEVWRU5UUyAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTCi0jaWYgICAgIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRAotI2RlZmluZSBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUyAxCi0jZWxzZQotI2RlZmluZSBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfUE9TVEVWRU5UUyAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUgotI2lmICAgICBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURUQKLSNkZWZpbmUgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0ZSQU1FQlVGRkVSIDEKLSNlbHNlCi0jZGVmaW5lIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUiAwCi0jZW5kaWYKLSNlbmRpZgotCi0vKgotICogTm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZ2V0dGluZyBpbnRvLCBidXQgaWYgeW91Ci0gKiBkZWZpbmUgdGhlIEhBUkRXSVJFX1BBU1NXRCBvciBIQVJEV0lSRV9WSUVXUEFTU1dEIHZhcmlhYmxlcyBoZXJlIG9yIGluCi0gKiBDUFBGTEFHUyB5b3UgY2FuIHNldCBhIGRlZmF1bHQgLXBhc3N3ZCBhbmQgLXZpZXdwYXNzd2Qgc3RyaW5nIHZhbHVlcywKLSAqIHBlcmhhcHMgdGhpcyB3b3VsZCBiZSBiZXR0ZXIgdGhhbiBub3RoaW5nIG9uIGFuIGVtYmVkZGVkIHN5c3RlbSwgZXRjLgotICogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjb21tYW5kIGxpbmUuCi0gKiBXZSBkb24ndCBldmVuIGdpdmUgYW4gZXhhbXBsZSA7LSkKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRXh0ZW5zaW9ucyBhbmQgcmVsYXRlZCBpbmNsdWRlczogKi8KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hTSE0KLSMgIGlmIGRlZmluZWQoX19ocHV4KSAmJiBkZWZpbmVkKF9faWE2NCkgIC8qIHNvbWV0aGluZyB3ZWlyZCBvbiBocC9pdGFuaWMgKi8KLSMgICAgdW5kZWYgX0lOQ0xVREVfSFBVWF9TT1VSQ0UKLSMgIGVuZGlmCi0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+Ci0jZW5kaWYKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TSE1BVAotI2luY2x1ZGUgPHN5cy9pcGMuaD4KLSNpbmNsdWRlIDxzeXMvc2htLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGRpcmVudC5oPgotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1QKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YVGVzdC5oPgotI2VuZGlmCi1leHRlcm4gaW50IHh0ZXN0X2Jhc2VfZXZlbnRfdHlwZTsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhUUkFQCi0jZGVmaW5lIE5FRURfRVZFTlRTCi0jZGVmaW5lIE5FRURfUkVQTElFUwotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3h0cmFwbGliLmg+Ci0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveHRyYXBsaWJwLmg+Ci1leHRlcm4gWEVUQyAqdHJhcF9jdHg7Ci0jZW5kaWYKLWV4dGVybiBpbnQgeHRyYXBfYmFzZV9ldmVudF90eXBlOwotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi0jaW5jbHVkZSA8WDExL1hwcm90by5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3JlY29yZC5oPgotI2VuZGlmCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YS0VZQk9BUkQKLSNpbmNsdWRlIDxYMTEvWEtCbGliLmg+Ci0jZW5kaWYKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhJTkVSQU1BCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGluZXJhbWEuaD4KLSNlbmRpZgotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfU1lTX1NPQ0tFVF9ICi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmbmRlZiBfQUlYCi1leHRlcm4gaW50IGhfZXJybm87Ci0jZW5kaWYKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX05FVElORVRfSU5fSAotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgU09MX0lQVjYKLSNpZmRlZiAgSVBQUk9UT19JUFY2Ci0jZGVmaW5lIFNPTF9JUFY2IElQUFJPVE9fSVBWNgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBJUFY2X1Y2T05MWQotI2lmZGVmICBJUFY2X0JJTkRWNk9OTFkKLSNkZWZpbmUgSVBWNl9WNk9OTFkgSVBWNl9CSU5EVjZPTkxZCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFgxMVZOQ19JUFY2Ci0jaWYgZGVmaW5lZChBRl9JTkVUNikKLSNkZWZpbmUgWDExVk5DX0lQVjYgMQotI2Vsc2UKLSNkZWZpbmUgWDExVk5DX0lQVjYgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBYMTFWTkNfTElTVEVONgotI2RlZmluZSBYMTFWTkNfTElTVEVONiAxCi0jZW5kaWYKLQotI2lmICFYMTFWTkNfSVBWNgotI3VuZGVmICBYMTFWTkNfTElTVEVONgotI2RlZmluZSBYMTFWTkNfTElTVEVONiAwCi0jZW5kaWYKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1BXRF9ICi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8Z3JwLmg+Ci0jZW5kaWYKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNlbmRpZgotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1VUTVBYX0gKLSNpbmNsdWRlIDx1dG1weC5oPgotI2VuZGlmCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9NTUFQCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0vKgotICogb3ZlcmxheS9tdWx0aS1kZXB0aCBzY3JlZW4gcmVhZGluZyBzdXBwb3J0Ci0gKiB1bmRlZiBTT0xBUklTX09WRVJMQVkgb3IgSVJJWF9PVkVSTEFZIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBidWlsZGluZy4KLSAqLwotCi0vKiBzb2xhcmlzL3N1biAqLwotI2lmIGRlZmluZWQgKF9fU1ZSNCkgJiYgZGVmaW5lZCAoX19zdW4pCi0jIGRlZmluZSBTT0xBUklTCi0jIGlmZGVmIExJQlZOQ1NFUlZFUl9IQVZFX1NPTEFSSVNfWFJFQURTQ1JFRU4KLSMgIGRlZmluZSBTT0xBUklTX09WRVJMQVkKLSMgIGRlZmluZSBPVkVSTEFZX09TCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFNPTEFSSVNfT1ZFUkxBWQotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3RyYW5zb3ZsLmg+Ci0jZW5kaWYKLQotLyogaXJpeC9zZ2kgKi8KLSNpZiBkZWZpbmVkKF9fc2dpKQotIyBkZWZpbmUgSVJJWAotIyBpZmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9JUklYX1hSRUFERElTUExBWQotIyAgZGVmaW5lIElSSVhfT1ZFUkxBWQotIyAgZGVmaW5lIE9WRVJMQVlfT1MKLSMgZW5kaWYKLSNlbmRpZgotCi0vKgotICogRm9yIHJlZmVyZW5jZSwgdGhlIE9TIGhlYWRlciBkZWZpbmVzOgotIF9fU1ZSNCAmJiBfX3N1biAgIGlzIHNvbGFyaXMKLSBfX3NnaQotIF9faHB1eAotIF9fb3NmX18KLSBfX09wZW5CU0RfXwotIF9fRnJlZUJTRF9fCi0gX19OZXRCU0RfXwotIF9fbGludXhfXwotIChkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykpCi0gX0FJWAotICovCi0jaWYgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKLSNkZWZpbmUgTUFDT1NYCi0jZW5kaWYKLQotCi0jaWZkZWYgSVJJWF9PVkVSTEFZCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvcmVhZGRpc3BsYXkuaD4KLSNlbmRpZgotCi1leHRlcm4gaW50IG92ZXJsYXlfcHJlc2VudDsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhSQU5EUgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hyYW5kci5oPgotI2VuZGlmCi1leHRlcm4gaW50IHhyYW5kcl9iYXNlX2V2ZW50X3R5cGU7Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYRklYRVMKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KLSNlbmRpZgotZXh0ZXJuIGludCB4Zml4ZXNfYmFzZV9ldmVudF90eXBlOwotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRQotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hkYW1hZ2UuaD4KLSNlbmRpZgotZXh0ZXJuIGludCB4ZGFtYWdlX2Jhc2VfZXZlbnRfdHlwZTsKLQotI2RlZmluZSBSQVdGQl9SRVQoeSkgICBpZiAocmF3X2ZiICYmICEgZHB5KSByZXR1cm4geTsKLSNkZWZpbmUgUkFXRkJfUkVUX1ZPSUQgaWYgKHJhd19mYiAmJiAhIGRweSkgcmV0dXJuOwotCi1leHRlcm4gY2hhciBsYXN0bW9kW107Ci0KLS8qIFggZGlzcGxheSBpbmZvICovCi0KLWV4dGVybiBEaXNwbGF5ICpkcHk7CQkvKiB0aGUgc2luZ2xlIGRpc3BsYXkgc2NyZWVuIHdlIGNvbm5lY3QgdG8gKi8KLWV4dGVybiBpbnQgc2NyOwotZXh0ZXJuIGNoYXIgKnhhdXRoX3Jhd19kYXRhOwotZXh0ZXJuIGludCB4YXV0aF9yYXdfbGVuOwotZXh0ZXJuIFdpbmRvdyB3aW5kb3csIHJvb3R3aW47CQkvKiBwb2xsZWQgd2luZG93LCByb290IHdpbmRvdyAodXN1LiBzYW1lKSAqLwotZXh0ZXJuIFZpc3VhbCAqZGVmYXVsdF92aXN1YWw7CQkvKiB0aGUgZGVmYXVsdCB2aXN1YWwgKHVubGVzcyAtdmlzdWFsKSAqLwotZXh0ZXJuIGludCBicHAsIGRlcHRoOwotZXh0ZXJuIGludCBpbmRleGVkX2NvbG9yOwotZXh0ZXJuIGludCBkcHlfeCwgZHB5X3k7CQkvKiBzaXplIG9mIGRpc3BsYXkgKi8KLWV4dGVybiBpbnQgZmJfeCwgZmJfeSwgZmJfYjsJCS8qIGZiIHNpemUgYW5kIGJwcCBndWVzc2VzIGF0IGRpc3BsYXkgKi8KLWV4dGVybiBpbnQgb2ZmX3gsIG9mZl95OwkJLyogb2Zmc2V0cyBmb3IgLXNpZCAqLwotZXh0ZXJuIGludCB3ZHB5X3gsIHdkcHlfeTsJCS8qIGZvciBhY3R1YWwgc2l6ZXMgaW4gY2FzZSBvZiAtY2xpcCAqLwotZXh0ZXJuIGludCBjZHB5X3gsIGNkcHlfeSwgY29mZl94LCBjb2ZmX3k7CS8qIHRoZSAtY2xpcCBwYXJhbXMgKi8KLWV4dGVybiBpbnQgYnV0dG9uX21hc2s7CQkvKiBidXR0b24gc3RhdGUgYW5kIGluZm8gKi8KLWV4dGVybiBpbnQgYnV0dG9uX21hc2tfcHJldjsKLWV4dGVybiBpbnQgbnVtX2J1dHRvbnM7Ci0KLWV4dGVybiBsb25nIHhzZWxlY3RpbnB1dF9yb290d2luOwotCi1leHRlcm4gdW5zaWduZWQgaW50IGRpc3BsYXlfYnV0dG9uX21hc2s7Ci1leHRlcm4gdW5zaWduZWQgaW50IGRpc3BsYXlfbW9kX21hc2s7Ci0KLS8qIGltYWdlIHN0cnVjdHVyZXMgKi8KLWV4dGVybiBYSW1hZ2UgKnNjYW5saW5lOwotZXh0ZXJuIFhJbWFnZSAqZnVsbHNjcmVlbjsKLWV4dGVybiBYSW1hZ2UgKip0aWxlX3JvdzsJLyogZm9yIGFsbCBwb3NzaWJsZSByb3cgcnVucyAqLwotZXh0ZXJuIFhJbWFnZSAqc25hcHJlY3Q7CS8qIGZvciBYU2htR2V0SW1hZ2UgKGZzX2ZhY3RvcikgKi8KLWV4dGVybiBYSW1hZ2UgKnNuYXA7CQkvKiB0aGUgZnVsbCBzbmFwIGZiICovCi1leHRlcm4gWEltYWdlICpyYXdfZmJfaW1hZ2U7CS8qIHRoZSByYXcgZmIgKi8KLQotI2lmICFMSUJWTkNTRVJWRVJfSEFWRV9YU0hNCi0vKgotICogZm9yIHNpbXBsaWNpdHksIGRlZmluZSB0aGlzIHN0cnVjdCBzaW5jZSB3ZSdsbCBuZXZlciB1c2UgdGhlbQotICogdW5kZXIgdXNpbmdfc2htID0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBzaG1pZDsgY2hhciAqc2htYWRkcjsgQm9vbCByZWFkT25seTsKLX0gWFNobVNlZ21lbnRJbmZvOwotI2VuZGlmCi0KLS8qIGNvcnJlc3BvbmRpbmcgc2htIHN0cnVjdHVyZXMgKi8KLWV4dGVybiBYU2htU2VnbWVudEluZm8gc2NhbmxpbmVfc2htOwotZXh0ZXJuIFhTaG1TZWdtZW50SW5mbyBmdWxsc2NyZWVuX3NobTsKLWV4dGVybiBYU2htU2VnbWVudEluZm8gKnRpbGVfcm93X3NobTsJLyogZm9yIGFsbCBwb3NzaWJsZSByb3cgcnVucyAqLwotZXh0ZXJuIFhTaG1TZWdtZW50SW5mbyBzbmFwcmVjdF9zaG07Ci0KLS8qIHJmYiBzY3JlZW4gaW5mbyAqLwotZXh0ZXJuIHJmYlNjcmVlbkluZm9QdHIgc2NyZWVuOwotZXh0ZXJuIGNoYXIgKnJmYl9kZXNrdG9wX25hbWU7Ci1leHRlcm4gY2hhciAqaHR0cF9kaXI7Ci1leHRlcm4gY2hhciB2bmNfZGVza3RvcF9uYW1lW107Ci1leHRlcm4gY2hhciAqbWFpbl9mYjsJCQkvKiBvdXIgY29weSBvZiB0aGUgWDExIGZiICovCi1leHRlcm4gY2hhciAqcmZiX2ZiOwkJCS8qIHNhbWUgYXMgbWFpbl9mYiB1bmxlc3MgdHJhbnNmb3JtYXRpb24gKi8KLWV4dGVybiBjaGFyICpmYWtlX2ZiOwkJCS8qIHVzZWQgdW5kZXIgLXBhZGdlb20gKi8KLWV4dGVybiBjaGFyICpzbmFwX2ZiOwkJCS8qIHVzZWQgdW5kZXIgLXNuYXBmYiAqLwotZXh0ZXJuIGNoYXIgKmNtYXA4dG8yNF9mYjsJCS8qIHVzZWQgdW5kZXIgLTh0bzI0ICovCi1leHRlcm4gY2hhciAqcm90X2ZiOwkJCS8qIHVzZWQgdW5kZXIgLXJvdGF0ZSAqLwotZXh0ZXJuIGNoYXIgKnJhd19mYjsKLWV4dGVybiBjaGFyICpyYXdfZmJfYWRkcjsKLWV4dGVybiBpbnQgcmF3X2ZiX29mZnNldDsKLWV4dGVybiBpbnQgcmF3X2ZiX3NobTsKLWV4dGVybiBpbnQgcmF3X2ZiX21tYXA7Ci1leHRlcm4gaW50IHJhd19mYl9zZWVrOwotZXh0ZXJuIGludCByYXdfZmJfZmQ7Ci1leHRlcm4gaW50IHJhd19mYl9iYWNrX3RvX1g7Ci0KLWV4dGVybiBpbnQgcmF3X2ZiX25hdGl2ZV9icHA7Ci1leHRlcm4gaW50IHJhd19mYl9leHBhbmRfYnl0ZXM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyAgcmF3X2ZiX25hdGl2ZV9yZWRfbWFzaywgIHJhd19mYl9uYXRpdmVfZ3JlZW5fbWFzaywgIHJhd19mYl9uYXRpdmVfYmx1ZV9tYXNrOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHJhd19mYl9uYXRpdmVfcmVkX21heCwgICByYXdfZmJfbmF0aXZlX2dyZWVuX21heCwgICByYXdfZmJfbmF0aXZlX2JsdWVfbWF4OwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHJhd19mYl9uYXRpdmVfcmVkX3NoaWZ0LCByYXdfZmJfbmF0aXZlX2dyZWVuX3NoaWZ0LCByYXdfZmJfbmF0aXZlX2JsdWVfc2hpZnQ7Ci0KLWV4dGVybiBpbnQgcmZiX2J5dGVzX3Blcl9saW5lOwotZXh0ZXJuIGludCBtYWluX2J5dGVzX3Blcl9saW5lOwotZXh0ZXJuIGludCByb3RfYnl0ZXNfcGVyX2xpbmU7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyAgbWFpbl9yZWRfbWFzaywgIG1haW5fZ3JlZW5fbWFzaywgIG1haW5fYmx1ZV9tYXNrOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IG1haW5fcmVkX21heCwgICBtYWluX2dyZWVuX21heCwgICBtYWluX2JsdWVfbWF4OwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IG1haW5fcmVkX3NoaWZ0LCBtYWluX2dyZWVuX3NoaWZ0LCBtYWluX2JsdWVfc2hpZnQ7Ci0KLWV4dGVybiBpbnQgcmF3X2ZiX2J5dGVzX3Blcl9saW5lOwkvKiBvZiBhY3R1YWwgcmF3IHJlZ2lvbiB3ZSBwb2xsLCBub3Qgb3VyIHJhd19mYiAqLwotCi0vKiBzY2FsaW5nIHBhcmFtZXRlcnMgKi8KLWV4dGVybiBjaGFyICpzY2FsZV9zdHI7Ci1leHRlcm4gZG91YmxlIHNjYWxlX2ZhY194OwotZXh0ZXJuIGRvdWJsZSBzY2FsZV9mYWNfeTsKLWV4dGVybiBpbnQgc2NhbGluZzsKLWV4dGVybiBpbnQgc2NhbGluZ19ibGVuZDsJCS8qIGZvciBubyBibGVuZGluZyBvcHRpb24gKHZlcnkgY291cnNlKSAqLwotZXh0ZXJuIGludCBzY2FsaW5nX25vbXVsdDQ7CQkvKiBkbyBub3QgcmVxdWlyZSB3aWR0aCA9IG4gKiA0ICovCi1leHRlcm4gaW50IHNjYWxpbmdfcGFkOwkJLyogcGFkIG91dCBzY2FsZWQgc2l6ZXMgdG8gZml0IGRlbm9taW5hdG9yICovCi1leHRlcm4gaW50IHNjYWxpbmdfaW50ZXJwb2xhdGU7CS8qIHVzZSBpbnRlcnBvbGF0aW9uIHNjaGVtZSB3aGVuIHNocmlua2luZyAqLwotZXh0ZXJuIGludCBzY2FsZWRfeCwgc2NhbGVkX3k7CQkvKiBkaW1lbnNpb25zIG9mIHNjYWxlZCBkaXNwbGF5ICovCi1leHRlcm4gaW50IHNjYWxlX251bWVyLCBzY2FsZV9kZW5vbTsJLyogbi9tICovCi1leHRlcm4gY2hhciAqcm90YXRpbmdfc3RyOwotZXh0ZXJuIGludCByb3RhdGluZzsKLWV4dGVybiBpbnQgcm90YXRpbmdfc2FtZTsKLWV4dGVybiBpbnQgcm90YXRpbmdfY3Vyc29yczsKLQotLyogc2NhbGUgY3Vyc29yICovCi1leHRlcm4gY2hhciAqc2NhbGVfY3Vyc29yX3N0cjsKLWV4dGVybiBkb3VibGUgc2NhbGVfY3Vyc29yX2ZhY194OwotZXh0ZXJuIGRvdWJsZSBzY2FsZV9jdXJzb3JfZmFjX3k7Ci1leHRlcm4gaW50IHNjYWxpbmdfY3Vyc29yOwotZXh0ZXJuIGludCBzY2FsaW5nX2N1cnNvcl9ibGVuZDsKLWV4dGVybiBpbnQgc2NhbGluZ19jdXJzb3JfaW50ZXJwb2xhdGU7Ci1leHRlcm4gaW50IHNjYWxlX2N1cnNvcl9udW1lciwgc2NhbGVfY3Vyc29yX2Rlbm9tOwotCi0vKiBzaXplIG9mIHRoZSBiYXNpYyB0aWxlIHVuaXQgdGhhdCBpcyBwb2xsZWQgZm9yIGNoYW5nZXM6ICovCi1leHRlcm4gaW50IHRpbGVfeDsKLWV4dGVybiBpbnQgdGlsZV95OwotZXh0ZXJuIGludCBudGlsZXMsIG50aWxlc194LCBudGlsZXNfeTsKLQotLyogYXJyYXlzIHRoYXQgaW5kaWNhdGUgY2hhbmdlZCBvciBjaGVja2VkIHRpbGVzLiAqLwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKnRpbGVfaGFzX2RpZmYsICp0aWxlX3RyaWVkLCAqdGlsZV9jb3BpZWQ7Ci1leHRlcm4gdW5zaWduZWQgY2hhciAqdGlsZV9oYXNfeGRhbWFnZV9kaWZmLCAqdGlsZV9yb3dfaGFzX3hkYW1hZ2VfZGlmZjsKLQotLyogdGltZXMgb2YgcmVjZW50IGV2ZW50cyAqLwotZXh0ZXJuIHRpbWVfdCBsYXN0X2V2ZW50LCBsYXN0X2lucHV0LCBsYXN0X2NsaWVudCwgbGFzdF9vcGVuX3hkaXNwbGF5OwotZXh0ZXJuIHRpbWVfdCBsYXN0X2tleWJvYXJkX2lucHV0LCBsYXN0X3BvaW50ZXJfaW5wdXQ7IAotZXh0ZXJuIHRpbWVfdCBsYXN0X2xvY2FsX2lucHV0OwkvKiBtYWNvc3ggKi8KLWV4dGVybiB0aW1lX3QgbGFzdF9mYl9ieXRlc19zZW50OwotZXh0ZXJuIGRvdWJsZSBsYXN0X2tleWJvYXJkX3RpbWU7Ci1leHRlcm4gZG91YmxlIGxhc3RfcG9pbnRlcl90aW1lOwotZXh0ZXJuIGRvdWJsZSBsYXN0X3BvaW50ZXJfY2xpY2tfdGltZTsKLWV4dGVybiBkb3VibGUgbGFzdF9wb2ludGVyX21vdGlvbl90aW1lOwotZXh0ZXJuIGRvdWJsZSBsYXN0X2tleV90b19idXR0b25fcmVtYXBfdGltZTsKLWV4dGVybiBkb3VibGUgbGFzdF9jb3B5cmVjdDsKLWV4dGVybiBkb3VibGUgbGFzdF9jb3B5cmVjdF9maXg7Ci1leHRlcm4gZG91YmxlIGxhc3Rfd2lyZWZyYW1lOwotZXh0ZXJuIGRvdWJsZSBzZXJ2ZXJ0aW1lX2RpZmY7Ci1leHRlcm4gZG91YmxlIHgxMXZuY19zdGFydDsKLWV4dGVybiBkb3VibGUgeDExdm5jX2N1cnJlbnQ7Ci1leHRlcm4gZG91YmxlIGdfbm93OwotCi1leHRlcm4gZG91YmxlIGxhc3RfZ2V0X3dtX2ZyYW1lX3RpbWU7Ci1leHRlcm4gV2luZG93IGxhc3RfZ2V0X3dtX2ZyYW1lOwotZXh0ZXJuIGRvdWJsZSBsYXN0X2JzX3Jlc3RvcmU7Ci1leHRlcm4gZG91YmxlIGxhc3Rfc3VfcmVzdG9yZTsKLWV4dGVybiBkb3VibGUgbGFzdF9ic19zYXZlOwotZXh0ZXJuIGRvdWJsZSBsYXN0X3N1X3NhdmU7Ci0KLWV4dGVybiBpbnQgaGFja192YWw7Ci0KLS8qIGxhc3QgY2xpZW50IHRvIG1vdmUgcG9pbnRlciAqLwotZXh0ZXJuIHJmYkNsaWVudFB0ciBsYXN0X3BvaW50ZXJfY2xpZW50OwotZXh0ZXJuIHJmYkNsaWVudFB0ciBsYXRlc3RfY2xpZW50OwotZXh0ZXJuIGRvdWJsZSBsYXN0X2NsaWVudF9nb25lOwotZXh0ZXJuIGRvdWJsZSBsYXN0X25ld19jbGllbnQ7Ci0KLWV4dGVybiBpbnQgd2FpdGVkX2Zvcl9jbGllbnQ7Ci1leHRlcm4gaW50IGZpbmRjcmVhdGVkaXNwbGF5OwotZXh0ZXJuIGNoYXIgKnRlcm1pbmFsX3NlcnZpY2VzX2RhZW1vbjsKLQotZXh0ZXJuIGludCBjbGllbnRfY291bnQ7Ci1leHRlcm4gaW50IGNsaWVudHNfc2VydmVkOwotZXh0ZXJuIGludCBjbGllbnRfbm9ybWFsX2NvdW50OwotCi0vKiBtb3JlIHRyYW5zaWVudCBrbHVkZ2UgdmFyaWFibGVzOiAqLwotZXh0ZXJuIGludCBjdXJzb3JfeCwgY3Vyc29yX3k7CQkvKiB4IGFuZCB5IGZyb20gdGhlIHZpZXdlcihzKSAqLwotZXh0ZXJuIGludCBidXR0b25fY2hhbmdlX3gsIGJ1dHRvbl9jaGFuZ2VfeTsKLWV4dGVybiBpbnQgZ290X3VzZXJfaW5wdXQ7Ci1leHRlcm4gaW50IGdvdF9wb2ludGVyX2lucHV0OwotZXh0ZXJuIGludCBnb3RfbG9jYWxfcG9pbnRlcl9pbnB1dDsKLWV4dGVybiBpbnQgZ290X3BvaW50ZXJfY2FsbHM7Ci1leHRlcm4gaW50IGdvdF9rZXlib2FyZF9pbnB1dDsKLWV4dGVybiBpbnQgZ290X2tleWJvYXJkX2NhbGxzOwotZXh0ZXJuIGludCB1cmdlbnRfdXBkYXRlOwotZXh0ZXJuIGludCBsYXN0X2tleWJvYXJkX2tleWNvZGU7Ci1leHRlcm4gcmZiQm9vbCBsYXN0X3JmYl9kb3duOwotZXh0ZXJuIHJmYkJvb2wgbGFzdF9yZmJfa2V5X2FjY2VwdGVkOwotZXh0ZXJuIHJmYktleVN5bSBsYXN0X3JmYl9rZXlzeW07Ci1leHRlcm4gZG91YmxlIGxhc3RfcmZiX2tleXRpbWU7Ci1leHRlcm4gZG91YmxlIGxhc3RfcmZiX2tleV9pbmplY3RlZDsKLWV4dGVybiBkb3VibGUgbGFzdF9yZmJfcHRyX2luamVjdGVkOwotZXh0ZXJuIGludCBmYl9jb3B5X2luX3Byb2dyZXNzOwkKLWV4dGVybiBpbnQgZHJhZ19pbl9wcm9ncmVzczsJCi1leHRlcm4gaW50IHNodXRfZG93bjsJCi1leHRlcm4gaW50IGRvX2NvcHlfc2NyZWVuOwkKLWV4dGVybiB0aW1lX3QgZGFtYWdlX3RpbWU7Ci1leHRlcm4gaW50IGRhbWFnZV9kZWxheTsKLQotZXh0ZXJuIGludCBwcm9ncmFtX3BpZDsKLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci1leHRlcm4gY2hhciAqcHJvZ3JhbV9jbWRsaW5lOwotCi1leHRlcm4gc3RydWN0IHV0c25hbWUgVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IGhpbnQgewotCS8qIGxvY2F0aW9uIHgsIHksIGhlaWdodCwgYW5kIHdpZHRoIG9mIGEgY2hhbmdlLXJlY3RhbmdsZSAgKi8KLQkvKiAoZ3Jvd3MgYXMgYWRqYWNlbnQgaG9yaXpvbnRhbCB0aWxlcyBhcmUgZ2x1ZWQgdG9nZXRoZXIpICovCi0JaW50IHgsIHksIHcsIGg7Ci19IGhpbnRfdDsKLQotLyogc3RydWN0IHdpdGggY2xpZW50IHNwZWNpZmljIGRhdGE6ICovCi0jZGVmaW5lIENJTEVOIDEwCi10eXBlZGVmIHN0cnVjdCBfQ2xpZW50RGF0YSB7Ci0JaW50IHVpZDsKLQljaGFyICpob3N0bmFtZTsKLQljaGFyICp1c2VybmFtZTsKLQljaGFyICp1bml4bmFtZTsKLQlpbnQgY2xpZW50X3BvcnQ7Ci0JaW50IHNlcnZlcl9wb3J0OwotCWNoYXIgKnNlcnZlcl9pcDsKLQljaGFyIGlucHV0W0NJTEVOXTsKLQlpbnQgbG9naW5fdmlld29ubHk7Ci0JdGltZV90IGxvZ2luX3RpbWU7Ci0KLQlwaWRfdCBzc2xfaGVscGVyX3BpZDsKLQotCWludCBoYWRfY3Vyc29yX3NoYXBlX3VwZGF0ZXM7Ci0JaW50IGhhZF9jdXJzb3JfcG9zX3VwZGF0ZXM7Ci0KLQlkb3VibGUgdGltZXI7Ci0JZG91YmxlIHNlbmRfY21wX3JhdGU7Ci0JZG91YmxlIHNlbmRfcmF3X3JhdGU7Ci0JZG91YmxlIGxhdGVuY3k7Ci0JaW50IGNtcF9ieXRlc19zZW50OwotCWludCByYXdfYnl0ZXNfc2VudDsKLQotfSBDbGllbnREYXRhOwotCi1leHRlcm4gdm9pZCBub3gxMV9leGl0KGludCByYyk7Ci0KLSNpbmNsdWRlICJwYXJhbXMuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotI2luY2x1ZGUgIm9wdGlvbnMuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLSNlbmRpZiAvKiBfWDExVk5DX1gxMVZOQ19IICovCmRpZmYgLS1naXQgYS94MTF2bmMveDExdm5jX2RlZnMuYyBiL3gxMXZuYy94MTF2bmNfZGVmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM0YWZmLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy94MTF2bmNfZGVmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geDExdm5jX2RlZnMuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0KLWludCBvdmVybGF5X3ByZXNlbnQgPSAwOwotCi1pbnQgeHJhbmRyX2Jhc2VfZXZlbnRfdHlwZSA9IDA7Ci0KLWludCB4Zml4ZXNfYmFzZV9ldmVudF90eXBlID0gMDsKLWludCB4dGVzdF9iYXNlX2V2ZW50X3R5cGUgPSAwOwotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhUUkFQCi1YRVRDICp0cmFwX2N0eCA9IE5VTEw7Ci0jZW5kaWYKLWludCB4dHJhcF9iYXNlX2V2ZW50X3R5cGUgPSAwOwotaW50IHhkYW1hZ2VfYmFzZV9ldmVudF90eXBlID0gMDsKLQotLyogICAgICAgICAgICAgICBkYXRlICsnbGFzdG1vZDogJVktJW0tJWQnICovCi1jaGFyIGxhc3Rtb2RbXSA9ICIwLjkuMTMgbGFzdG1vZDogMjAxMC0xMi0yNyI7Ci0KLS8qIFggZGlzcGxheSBpbmZvICovCi0KLURpc3BsYXkgKmRweSA9IE5VTEw7CQkvKiB0aGUgc2luZ2xlIGRpc3BsYXkgc2NyZWVuIHdlIGNvbm5lY3QgdG8gKi8KLWludCBzY3IgPSAwOwotY2hhciAqeGF1dGhfcmF3X2RhdGEgPSBOVUxMOwotaW50IHhhdXRoX3Jhd19sZW4gPSAwOwotV2luZG93IHdpbmRvdyA9IE5vbmUsIHJvb3R3aW4gPSBOb25lOwkvKiBwb2xsZWQgd2luZG93LCByb290IHdpbmRvdyAodXN1LiBzYW1lKSAqLwotVmlzdWFsICpkZWZhdWx0X3Zpc3VhbCA9IE5VTEw7CS8qIHRoZSBkZWZhdWx0IHZpc3VhbCAodW5sZXNzIC12aXN1YWwpICovCi1pbnQgYnBwID0gMCwgZGVwdGggPSAwOwotaW50IGluZGV4ZWRfY29sb3IgPSAwOwotaW50IGRweV94ID0gMCwgZHB5X3kgPSAwOwkJLyogc2l6ZSBvZiBkaXNwbGF5ICovCi1pbnQgZmJfeCA9IDAsIGZiX3kgPSAwLCBmYl9iID0gMDsJLyogZmIgc2l6ZSBhbmQgYnBwIGd1ZXNzZXMgYXQgZGlzcGxheSAqLwotaW50IG9mZl94LCBvZmZfeTsJCS8qIG9mZnNldHMgZm9yIC1zaWQgKi8KLWludCB3ZHB5X3gsIHdkcHlfeTsJCS8qIGZvciBhY3R1YWwgc2l6ZXMgaW4gY2FzZSBvZiAtY2xpcCAqLwotaW50IGNkcHlfeCwgY2RweV95LCBjb2ZmX3gsIGNvZmZfeTsJLyogdGhlIC1jbGlwIHBhcmFtcyAqLwotaW50IGJ1dHRvbl9tYXNrID0gMDsJCS8qIGJ1dHRvbiBzdGF0ZSBhbmQgaW5mbyAqLwotaW50IGJ1dHRvbl9tYXNrX3ByZXYgPSAwOwotaW50IG51bV9idXR0b25zID0gLTE7Ci0KLWxvbmcgeHNlbGVjdGlucHV0X3Jvb3R3aW4gPSAwOwotCi11bnNpZ25lZCBpbnQgZGlzcGxheV9idXR0b25fbWFzayA9IDA7Ci11bnNpZ25lZCBpbnQgZGlzcGxheV9tb2RfbWFzayA9IDA7Ci0KLS8qIGltYWdlIHN0cnVjdHVyZXMgKi8KLVhJbWFnZSAqc2NhbmxpbmUgPSBOVUxMOwotWEltYWdlICpmdWxsc2NyZWVuID0gTlVMTDsKLVhJbWFnZSAqKnRpbGVfcm93ID0gTlVMTDsJLyogZm9yIGFsbCBwb3NzaWJsZSByb3cgcnVucyAqLwotWEltYWdlICpzbmFwcmVjdCA9IE5VTEw7CS8qIGZvciBYU2htR2V0SW1hZ2UgKGZzX2ZhY3RvcikgKi8KLVhJbWFnZSAqc25hcCA9IE5VTEw7CQkvKiB0aGUgZnVsbCBzbmFwIGZiICovCi1YSW1hZ2UgKnJhd19mYl9pbWFnZSA9IE5VTEw7CS8qIHRoZSByYXcgZmIgKi8KLQotLyogY29ycmVzcG9uZGluZyBzaG0gc3RydWN0dXJlcyAqLwotWFNobVNlZ21lbnRJbmZvIHNjYW5saW5lX3NobTsKLVhTaG1TZWdtZW50SW5mbyBmdWxsc2NyZWVuX3NobTsKLVhTaG1TZWdtZW50SW5mbyAqdGlsZV9yb3dfc2htOwkvKiBmb3IgYWxsIHBvc3NpYmxlIHJvdyBydW5zICovCi1YU2htU2VnbWVudEluZm8gc25hcHJlY3Rfc2htOwotCi0vKiByZmIgc2NyZWVuIGluZm8gKi8KLXJmYlNjcmVlbkluZm9QdHIgc2NyZWVuID0gTlVMTDsKLWNoYXIgKnJmYl9kZXNrdG9wX25hbWUgPSBOVUxMOwotY2hhciAqaHR0cF9kaXIgPSBOVUxMOwotY2hhciB2bmNfZGVza3RvcF9uYW1lWzI1Nl07Ci1jaGFyICptYWluX2ZiID0gTlVMTDsJCS8qIG91ciBjb3B5IG9mIHRoZSBYMTEgZmIgKi8KLWNoYXIgKnJmYl9mYiA9IE5VTEw7CQkvKiBzYW1lIGFzIG1haW5fZmIgdW5sZXNzIHRyYW5zZm9ybWF0aW9uICovCi1jaGFyICpmYWtlX2ZiID0gTlVMTDsJCS8qIHVzZWQgdW5kZXIgLXBhZGdlb20gKi8KLWNoYXIgKnNuYXBfZmIgPSBOVUxMOwkJLyogdXNlZCB1bmRlciAtc25hcGZiICovCi1jaGFyICpjbWFwOHRvMjRfZmIgPSBOVUxMOwkvKiB1c2VkIHVuZGVyIC04dG8yNCAqLwotY2hhciAqcm90X2ZiID0gTlVMTDsKLWNoYXIgKnJhd19mYiA9IE5VTEw7CQkvKiB3aGVuIHVzZWQgc2hvdWxkIGJlIG1haW5fZmIgKi8KLWNoYXIgKnJhd19mYl9hZGRyID0gTlVMTDsKLWludCByYXdfZmJfb2Zmc2V0ID0gMDsKLWludCByYXdfZmJfc2htID0gMDsKLWludCByYXdfZmJfbW1hcCA9IDA7Ci1pbnQgcmF3X2ZiX3NlZWsgPSAwOwotaW50IHJhd19mYl9mZCA9IC0xOwotaW50IHJhd19mYl9iYWNrX3RvX1ggPSAwOwkvKiBrbHVkZ2UgZm9yIHRlc3RpbmcgcmF3ZmIgLT4gWCAqLwotCi1pbnQgcmF3X2ZiX25hdGl2ZV9icHAgPSAwOwotaW50IHJhd19mYl9leHBhbmRfYnl0ZXMgPSAxOwotdW5zaWduZWQgbG9uZyAgcmF3X2ZiX25hdGl2ZV9yZWRfbWFzayA9IDAsICByYXdfZmJfbmF0aXZlX2dyZWVuX21hc2sgPSAwLCAgcmF3X2ZiX25hdGl2ZV9ibHVlX21hc2sgPSAwOwotdW5zaWduZWQgc2hvcnQgcmF3X2ZiX25hdGl2ZV9yZWRfbWF4ID0gMCwgICByYXdfZmJfbmF0aXZlX2dyZWVuX21heCA9IDAsICAgcmF3X2ZiX25hdGl2ZV9ibHVlX21heCA9IDA7Ci11bnNpZ25lZCBzaG9ydCByYXdfZmJfbmF0aXZlX3JlZF9zaGlmdCA9IDAsIHJhd19mYl9uYXRpdmVfZ3JlZW5fc2hpZnQgPSAwLCByYXdfZmJfbmF0aXZlX2JsdWVfc2hpZnQgPSAwOwotCi1pbnQgcmZiX2J5dGVzX3Blcl9saW5lID0gMDsKLWludCBtYWluX2J5dGVzX3Blcl9saW5lID0gMDsKLWludCByb3RfYnl0ZXNfcGVyX2xpbmUgPSAwOwotdW5zaWduZWQgbG9uZyAgbWFpbl9yZWRfbWFzayA9IDAsICBtYWluX2dyZWVuX21hc2sgPSAwLCAgbWFpbl9ibHVlX21hc2sgPSAwOwotdW5zaWduZWQgc2hvcnQgbWFpbl9yZWRfbWF4ID0gMCwgICBtYWluX2dyZWVuX21heCA9IDAsICAgbWFpbl9ibHVlX21heCA9IDA7Ci11bnNpZ25lZCBzaG9ydCBtYWluX3JlZF9zaGlmdCA9IDAsIG1haW5fZ3JlZW5fc2hpZnQgPSAwLCBtYWluX2JsdWVfc2hpZnQgPSAwOwotCi1pbnQgcmF3X2ZiX2J5dGVzX3Blcl9saW5lID0gMDsKLQotLyogc2NhbGluZyBwYXJhbWV0ZXJzICovCi1jaGFyICpzY2FsZV9zdHIgPSBOVUxMOwotZG91YmxlIHNjYWxlX2ZhY194ID0gMS4wOwotZG91YmxlIHNjYWxlX2ZhY195ID0gMS4wOwotaW50IHNjYWxpbmcgPSAwOwotaW50IHNjYWxpbmdfYmxlbmQgPSAxOwkJLyogZm9yIG5vIGJsZW5kaW5nIG9wdGlvbiAodmVyeSBjb3Vyc2UpICovCi1pbnQgc2NhbGluZ19ub211bHQ0ID0gMDsJLyogZG8gbm90IHJlcXVpcmUgd2lkdGggPSBuICogNCAqLwotaW50IHNjYWxpbmdfcGFkID0gMDsJCS8qIHBhZCBvdXQgc2NhbGVkIHNpemVzIHRvIGZpdCBkZW5vbWluYXRvciAqLwotaW50IHNjYWxpbmdfaW50ZXJwb2xhdGUgPSAwOwkvKiB1c2UgaW50ZXJwb2xhdGlvbiBzY2hlbWUgd2hlbiBzaHJpbmtpbmcgKi8KLWludCBzY2FsZWRfeCA9IDAsIHNjYWxlZF95ID0gMDsJLyogZGltZW5zaW9ucyBvZiBzY2FsZWQgZGlzcGxheSAqLwotaW50IHNjYWxlX251bWVyID0gMCwgc2NhbGVfZGVub20gPSAwOwkvKiBuL20gKi8KLWNoYXIgKnJvdGF0aW5nX3N0ciA9IE5VTEw7Ci1pbnQgcm90YXRpbmcgPSAwOwotaW50IHJvdGF0aW5nX3NhbWUgPSAwOwotaW50IHJvdGF0aW5nX2N1cnNvcnMgPSAwOwotCi0vKiBzY2FsZSBjdXJzb3IgKi8KLWNoYXIgKnNjYWxlX2N1cnNvcl9zdHIgPSBOVUxMOwotZG91YmxlIHNjYWxlX2N1cnNvcl9mYWNfeCA9IDEuMDsKLWRvdWJsZSBzY2FsZV9jdXJzb3JfZmFjX3kgPSAxLjA7Ci1pbnQgc2NhbGluZ19jdXJzb3IgPSAwOwotaW50IHNjYWxpbmdfY3Vyc29yX2JsZW5kID0gMTsKLWludCBzY2FsaW5nX2N1cnNvcl9pbnRlcnBvbGF0ZSA9IDA7Ci1pbnQgc2NhbGVfY3Vyc29yX251bWVyID0gMCwgc2NhbGVfY3Vyc29yX2Rlbm9tID0gMDsKLQotLyogc2l6ZSBvZiB0aGUgYmFzaWMgdGlsZSB1bml0IHRoYXQgaXMgcG9sbGVkIGZvciBjaGFuZ2VzOiAqLwotaW50IHRpbGVfeCA9IDMyOwotaW50IHRpbGVfeSA9IDMyOwotaW50IG50aWxlcywgbnRpbGVzX3ggPSAwLCBudGlsZXNfeSA9IDA7Ci0KLS8qIGFycmF5cyB0aGF0IGluZGljYXRlIGNoYW5nZWQgb3IgY2hlY2tlZCB0aWxlcy4gKi8KLXVuc2lnbmVkIGNoYXIgKnRpbGVfaGFzX2RpZmYgPSBOVUxMLCAqdGlsZV90cmllZCA9IE5VTEwsICp0aWxlX2NvcGllZCA9IE5VTEw7Ci11bnNpZ25lZCBjaGFyICp0aWxlX2hhc194ZGFtYWdlX2RpZmYgPSBOVUxMLCAqdGlsZV9yb3dfaGFzX3hkYW1hZ2VfZGlmZiA9IE5VTEw7Ci0KLS8qIHRpbWVzIG9mIHJlY2VudCBldmVudHMgKi8KLXRpbWVfdCBsYXN0X2V2ZW50ID0gMCwgbGFzdF9pbnB1dCA9IDAsIGxhc3RfY2xpZW50ID0gMCwgbGFzdF9vcGVuX3hkaXNwbGF5ID0gMDsKLXRpbWVfdCBsYXN0X2xvY2FsX2lucHV0ID0gMDsKLXRpbWVfdCBsYXN0X2tleWJvYXJkX2lucHV0ID0gMCwgbGFzdF9wb2ludGVyX2lucHV0ID0gMDsgCi10aW1lX3QgbGFzdF9mYl9ieXRlc19zZW50ID0gMDsKLWRvdWJsZSBsYXN0X2tleWJvYXJkX3RpbWUgPSAwLjA7Ci1kb3VibGUgbGFzdF9wb2ludGVyX3RpbWUgPSAwLjA7Ci1kb3VibGUgbGFzdF9wb2ludGVyX2NsaWNrX3RpbWUgPSAwLjA7Ci1kb3VibGUgbGFzdF9wb2ludGVyX21vdGlvbl90aW1lID0gMC4wOwotZG91YmxlIGxhc3Rfa2V5X3RvX2J1dHRvbl9yZW1hcF90aW1lID0gMC4wOwotZG91YmxlIGxhc3RfY29weXJlY3QgPSAwLjA7Ci1kb3VibGUgbGFzdF9jb3B5cmVjdF9maXggPSAwLjA7Ci1kb3VibGUgbGFzdF93aXJlZnJhbWUgPSAwLjA7Ci1kb3VibGUgc2VydmVydGltZV9kaWZmID0gMC4wOwotZG91YmxlIHgxMXZuY19zdGFydCA9IDAuMDsKLWRvdWJsZSB4MTF2bmNfY3VycmVudCA9IDAuMDsKLWRvdWJsZSBnX25vdyA9IDAuMDsKLQotZG91YmxlIGxhc3RfZ2V0X3dtX2ZyYW1lX3RpbWUgPSAwLjA7Ci1XaW5kb3cgbGFzdF9nZXRfd21fZnJhbWUgPSBOb25lOwotZG91YmxlIGxhc3RfYnNfcmVzdG9yZSA9IDAuMDsKLWRvdWJsZSBsYXN0X3N1X3Jlc3RvcmUgPSAwLjA7Ci1kb3VibGUgbGFzdF9ic19zYXZlID0gMC4wOwotZG91YmxlIGxhc3Rfc3Vfc2F2ZSA9IDAuMDsKLQotaW50IGhhY2tfdmFsID0gMDsKLQotLyogbGFzdCBjbGllbnQgdG8gbW92ZSBwb2ludGVyICovCi1yZmJDbGllbnRQdHIgbGFzdF9wb2ludGVyX2NsaWVudCA9IE5VTEw7Ci1yZmJDbGllbnRQdHIgbGF0ZXN0X2NsaWVudCA9IE5VTEw7Ci1kb3VibGUgbGFzdF9jbGllbnRfZ29uZSA9IDAuMDsKLWRvdWJsZSBsYXN0X25ld19jbGllbnQgPSAwLjA7Ci0KLWludCB3YWl0ZWRfZm9yX2NsaWVudCA9IDA7Ci1pbnQgZmluZGNyZWF0ZWRpc3BsYXkgPSAwOwotY2hhciAqdGVybWluYWxfc2VydmljZXNfZGFlbW9uID0gTlVMTDsKLQotaW50IGNsaWVudF9jb3VudCA9IDA7Ci1pbnQgY2xpZW50c19zZXJ2ZWQgPSAwOwotaW50IGNsaWVudF9ub3JtYWxfY291bnQgPSAwOwotCi0vKiBtb3JlIHRyYW5zaWVudCBrbHVkZ2UgdmFyaWFibGVzOiAqLwotaW50IGN1cnNvcl94ID0gMCwgY3Vyc29yX3kgPSAwOwkJLyogeCBhbmQgeSBmcm9tIHRoZSB2aWV3ZXIocykgKi8KLWludCBidXR0b25fY2hhbmdlX3ggPSAwLCBidXR0b25fY2hhbmdlX3kgPSAwOwotaW50IGdvdF91c2VyX2lucHV0ID0gMDsKLWludCBnb3RfcG9pbnRlcl9pbnB1dCA9IDA7Ci1pbnQgZ290X2xvY2FsX3BvaW50ZXJfaW5wdXQgPSAwOwotaW50IGdvdF9wb2ludGVyX2NhbGxzID0gMDsKLWludCBnb3Rfa2V5Ym9hcmRfaW5wdXQgPSAwOwotaW50IGdvdF9rZXlib2FyZF9jYWxscyA9IDA7Ci1pbnQgdXJnZW50X3VwZGF0ZSA9IDA7Ci1pbnQgbGFzdF9rZXlib2FyZF9rZXljb2RlID0gMDsKLXJmYkJvb2wgbGFzdF9yZmJfZG93biA9IEZBTFNFOwotcmZiQm9vbCBsYXN0X3JmYl9rZXlfYWNjZXB0ZWQgPSBGQUxTRTsKLXJmYktleVN5bSBsYXN0X3JmYl9rZXlzeW0gPSAwOwotZG91YmxlIGxhc3RfcmZiX2tleXRpbWUgPSAwLjA7Ci1kb3VibGUgbGFzdF9yZmJfa2V5X2luamVjdGVkID0gMC4wOwotZG91YmxlIGxhc3RfcmZiX3B0cl9pbmplY3RlZCA9IDAuMDsKLWludCBmYl9jb3B5X2luX3Byb2dyZXNzID0gMDsJCi1pbnQgZHJhZ19pbl9wcm9ncmVzcyA9IDA7CQotaW50IHNodXRfZG93biA9IDA7CQotaW50IGRvX2NvcHlfc2NyZWVuID0gMDsJCi10aW1lX3QgZGFtYWdlX3RpbWUgPSAwOwotaW50IGRhbWFnZV9kZWxheSA9IDA7Ci0KLWludCBwcm9ncmFtX3BpZCA9IDA7Ci1jaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOwotY2hhciAqcHJvZ3JhbV9jbWRsaW5lID0gTlVMTDsKLQotc3RydWN0IHV0c25hbWUgVVQ7Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3hkYW1hZ2UuYyBiL3gxMXZuYy94ZGFtYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjEyZjUuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hkYW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg0MCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLS8qIC0tIHhkYW1hZ2UuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAidXNlcmlucHV0LmgiCi0jaW5jbHVkZSAidW5peHB3LmgiCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYREFNQUdFCi1EYW1hZ2UgeGRhbWFnZSA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBYREFNQUdFCi0jZGVmaW5lIFhEQU1BR0UgMQotI2VuZGlmCi1pbnQgdXNlX3hkYW1hZ2UgPSBYREFNQUdFOwkvKiB1c2UgdGhlIHhkYW1hZ2UgcmVjdHMgZm9yIHNjYW5saW5lIGhpbnRzICovCi1pbnQgeGRhbWFnZV9wcmVzZW50ID0gMDsKLQotI2lmZGVmIE1BQ09TWAotaW50IHhkYW1hZ2VfbWF4X2FyZWEgPSA1MDAwMDsKLSNlbHNlCi1pbnQgeGRhbWFnZV9tYXhfYXJlYSA9IDIwMDAwOwkvKiBwaXhlbHMgKi8KLSNlbmRpZgotCi1kb3VibGUgeGRhbWFnZV9tZW1vcnkgPSAxLjA7CS8qIGluIHVuaXRzIG9mIE5TQ0FOICovCi1pbnQgeGRhbWFnZV90aWxlX2NvdW50ID0gMCwgeGRhbWFnZV9kaXJlY3RfY291bnQgPSAwOwotZG91YmxlIHhkYW1hZ2Vfc2NoZWR1bGVkX21hcmsgPSAwLjA7Ci1kb3VibGUgeGRhbWFnZV9jcmF6eV90aW1lID0gMC4wOwotZG91YmxlIHhkYW1hZ2VfY3JhenlfZGVsYXkgPSAzMDAuMDsKLXNyYVJlZ2lvblB0ciB4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrX3JlZ2lvbiA9IE5VTEw7Ci1zcmFSZWdpb25QdHIgKnhkYW1hZ2VfcmVnaW9ucyA9IE5VTEw7Ci1pbnQgeGRhbWFnZV90aWNrZXIgPSAwOwotaW50IFhEX3NraXAgPSAwLCBYRF90b3QgPSAwLCBYRF9kZXMgPSAwOwkvKiBmb3Igc3RhdHMgKi8KLQotdm9pZCBhZGRfcmVnaW9uX3hkYW1hZ2Uoc3JhUmVnaW9uUHRyIG5ld19yZWdpb24pOwotdm9pZCBjbGVhcl94ZGFtYWdlX21hcmtfcmVnaW9uKHNyYVJlZ2lvblB0ciBtYXJrcmVnaW9uLCBpbnQgZmx1c2gpOwotaW50IGNvbGxlY3Rfbm9uX1hfeGRhbWFnZShpbnQgeF9pbiwgaW50IHlfaW4sIGludCB3X2luLCBpbnQgaF9pbiwgaW50IGNhbGwpOwotaW50IGNvbGxlY3RfeGRhbWFnZShpbnQgc2NhbmNudCwgaW50IGNhbGwpOwotaW50IHhkYW1hZ2VfaGludF9za2lwKGludCB5KTsKLXZvaWQgaW5pdGlhbGl6ZV94ZGFtYWdlKHZvaWQpOwotdm9pZCBjcmVhdGVfeGRhbWFnZV9pZl9uZWVkZWQoaW50IGZvcmNlKTsKLXZvaWQgZGVzdHJveV94ZGFtYWdlX2lmX25lZWRlZCh2b2lkKTsKLXZvaWQgY2hlY2tfeGRhbWFnZV9zdGF0ZSh2b2lkKTsKLQotc3RhdGljIHZvaWQgcmVjb3JkX2Rlc2lyZWRfeGRhbWFnZV9yZWN0KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKLQotCi1zdGF0aWMgdm9pZCByZWNvcmRfZGVzaXJlZF94ZGFtYWdlX3JlY3QoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKLQkvKgotCSAqIFVuZm9ydHVuYXRlbHkgd2UgY3VycmVudGx5IGNhbid0IHRydXN0IGFuIHhkYW1hZ2UgZXZlbnQKLQkgKiB0byBjb3JyZXNwb25kIHRvIHJlYWwgc2NyZWVuIGRhbWFnZS4gIEUuZy4gZm9jdXMtaW4gZm9yCi0JICogbW96aWxsYSAoZGVwZW5kaW5nIG9uIHdtKSB3aWxsIG1hcmsgdGhlIHdob2xlIHRvcGxldmVsCi0JICogYXJlYSBhcyBkYW1hZ2VkLCB3aGVuIG9ubHkgdGhlIGJvcmRlciBoYXMgY2hhbmdlZC4KLQkgKiBTaW1pbGFyIHRoaW5ncyBmb3IgdGVybWluYWwgd2luZG93cy4KLQkgKgotCSAqIFRoaXMgcm91dGluZSB1c2VzIHNvbWUgaGV1cmlzdGljcyB0byBkZXRlY3Qgc21hbGwgZW5vdWdoCi0JICogZGFtYWdlIHJlZ2lvbnMgdGhhdCB3ZSB3aWxsIG5vdCBoYXZlIGEgcGVyZm9ybWFuY2UgcHJvYmxlbQotCSAqIGlmIHdlIGJlbGlldmUgdGhlbSBldmVuIHRob3VnaCB0aGV5IGFyZSB3cm9uZy4gIFdlIHJlY29yZAotCSAqIHRoZSBjb3JyZXNwb25kaW5nIHRpbGVzIHRoZSBkYW1hZ2UgcmVnaW9ucyB0b3VjaC4KLQkgKi8KLQlpbnQgZHRfeCwgZHRfeSwgbnRfeDEsIG50X3kxLCBudF94MiwgbnRfeTIsIG50OwotCWludCBpeCwgaXksIGNudCA9IDA7Ci0JaW50IGFyZWEgPSB3KmgsIGFsd2F5c19hY2NlcHQgPSAwOwotCS8qCi0JICogWFhYOiBub3Qgd29ya2luZyB5ZXQsIHNsb3cgYW5kIG92ZXJsYXBzIHdpdGggc2Nhbl9kaXNwbGF5KCkKLQkgKiBwcm9iYWJseSBzbG93IGJlY2F1c2UgdGFsbCBza2lubnkgcmVjdGFuZ2xlcyB2ZXJ5IGluZWZmaWNpZW50Ci0JICogaW4gZ2VuZXJhbCBhbmQgaW4gZGlyZWN0X2ZiX2NvcHkoKSAoMTAwWCBzbG93ZXIgdGhlbiBob3Jpem9udGFsKS4KLQkgKi8KLQlpbnQgdXNlX2RpcmVjdF9mYl9jb3B5ID0gMDsKLQlpbnQgd2hfbWluLCB3aF9tYXg7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDEsIHVkZmIgPSAwOwotCi0JLyogY29tcGlsZXIgd2FybmluZzogKi8KLQludF94MSA9IDA7IG50X3kxID0gMDsgbnRfeDIgPSAwOyBudF95MiA9IDA7Ci0KLQlpZiAoZmlyc3QpIHsKLQkJaWYgKGdldGVudigiWERfREZDIikpIHsKLQkJCXVkZmIgPSAxOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKHVkZmIpIHsKLQkJdXNlX2RpcmVjdF9mYl9jb3B5ID0gMTsKLQl9Ci0KLQlpZiAoeGRhbWFnZV9tYXhfYXJlYSA8PSAwKSB7Ci0JCWFsd2F5c19hY2NlcHQgPSAxOwotCX0KLQotCWlmICghYWx3YXlzX2FjY2VwdCAmJiBhcmVhID4geGRhbWFnZV9tYXhfYXJlYSkgewotCQlyZXR1cm47Ci0JfQotCi0JZHRfeCA9IHcgLyB0aWxlX3g7Ci0JZHRfeSA9IGggLyB0aWxlX3k7Ci0KLQlpZiAodyA8IGgpIHsKLQkJd2hfbWluID0gdzsKLQkJd2hfbWF4ID0gaDsKLQl9IGVsc2UgewotCQl3aF9taW4gPSBoOwotCQl3aF9tYXggPSB3OwotCX0KLQotCWlmICghYWx3YXlzX2FjY2VwdCAmJiBkdF95ID49IDMgJiYgYXJlYSA+IDQwMDApICB7Ci0JCS8qCi0JCSAqIGlmIGl0IGlzIHJlYWwgaXQgc2hvdWxkIGJlIGNhdWdodCBieSBhIG5vcm1hbCBzY2FubGluZQotCQkgKiBwb2xsLCBidXQgd2UgbWlnaHQgYXMgd2VsbCBrZWVwIGlmIHNtYWxsICh0YWxsIGxpbmU/KS4KLQkJICovCi0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKHVzZV9kaXJlY3RfZmJfY29weSkgewotCQlYX1VOTE9DSzsKLQkJZGlyZWN0X2ZiX2NvcHkoeCwgeSwgeCArIHcsIHkgKyBoLCAxKTsKLQkJeGRhbWFnZV9kaXJlY3RfY291bnQrKzsKLQkJWF9MT0NLOwotCX0gZWxzZSBpZiAoMCAmJiB3aF9taW4gPCB0aWxlX3gvNCAmJiB3aF9tYXggPiAzMCAqIHdoX21pbikgewotCQkvKiB0cnkgaXQgZm9yIGxvbmcsIHNraW5ueSByZWN0cywgWFhYIHN0aWxsIG5vIGdvb2QgKi8KLQkJWF9VTkxPQ0s7Ci0JCWRpcmVjdF9mYl9jb3B5KHgsIHksIHggKyB3LCB5ICsgaCwgMSk7Ci0JCXhkYW1hZ2VfZGlyZWN0X2NvdW50Kys7Ci0JCVhfTE9DSzsKLQl9IGVsc2UgewotCi0JCWlmIChudGlsZXNfeCA9PSAwIHx8IG50aWxlc195ID09IDApIHsKLQkJCS8qIHRvbyBlYXJseS4gKi8KLQkJCXJldHVybjsKLQkJfQotCQludF94MSA9IG5maXgoICAoeCkvdGlsZV94LCBudGlsZXNfeCk7Ci0JCW50X3gyID0gbmZpeCgoeCt3KS90aWxlX3gsIG50aWxlc194KTsKLQkJbnRfeTEgPSBuZml4KCAgKHkpL3RpbGVfeSwgbnRpbGVzX3kpOwotCQludF95MiA9IG5maXgoKHkraCkvdGlsZV95LCBudGlsZXNfeSk7Ci0KLQkJLyoKLQkJICogbG9vcCBvdmVyIHRoZSByZWN0YW5nbGUgb2YgdGlsZXMgKDEgdGlsZSBmb3IgYSBzbWFsbAotCQkgKiBpbnB1dCByZWN0KS4KLQkJICovCi0JCWZvciAoaXggPSBudF94MTsgaXggPD0gbnRfeDI7IGl4KyspIHsKLQkJCWZvciAoaXkgPSBudF95MTsgaXkgPD0gbnRfeTI7IGl5KyspIHsKLQkJCQludCA9IGl4ICsgaXkgKiBudGlsZXNfeDsKLQkJCQljbnQrKzsKLQkJCQlpZiAoISB0aWxlX2hhc194ZGFtYWdlX2RpZmZbbnRdKSB7Ci0JCQkJCVhEX2RlcysrOwotCQkJCQl0aWxlX2hhc194ZGFtYWdlX2RpZmZbbnRdID0gMTsKLQkJCQl9Ci0JCQkJLyogbm90IHVzZWQ6ICovCi0JCQkJdGlsZV9yb3dfaGFzX3hkYW1hZ2VfZGlmZltpeV0gPSAxOwotCQkJCXhkYW1hZ2VfdGlsZV9jb3VudCsrOwotCQkJfQotCQl9Ci0JfQotCWlmIChkZWJ1Z194ZGFtYWdlID4gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgInhkYW1hZ2U6IGRlc2lyZWQ6ICVkeCVkKyVkKyVkXHRBOiAlNmQgIHRpbGVzPSIKLQkJICAgICIlMDJkLSUwMmQvJTAyZC0lMDJkICB0aWxlY250OiAlZFxuIiwgdywgaCwgeCwgeSwKLQkJICAgIHcgKiBoLCBudF94MSwgbnRfeDIsIG50X3kxLCBudF95MiwgY250KTsKLQl9Ci19Ci0KLXZvaWQgYWRkX3JlZ2lvbl94ZGFtYWdlKHNyYVJlZ2lvblB0ciBuZXdfcmVnaW9uKSB7Ci0Jc3JhUmVnaW9uUHRyIHJlZzsKLQlpbnQgcHJldl90aWNrLCBucmVnOwotCi0JaWYgKCEgeGRhbWFnZV9yZWdpb25zKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlucmVnID0gKHhkYW1hZ2VfbWVtb3J5ICogTlNDQU4pICsgMTsKLQlwcmV2X3RpY2sgPSB4ZGFtYWdlX3RpY2tlciAtIDE7Ci0JaWYgKHByZXZfdGljayA8IDApIHsKLQkJcHJldl90aWNrID0gbnJlZyAtIDE7Ci0JfQotCi0JcmVnID0geGRhbWFnZV9yZWdpb25zW3ByZXZfdGlja107ICAKLQlpZiAocmVnICE9IE5VTEwgJiYgbmV3X3JlZ2lvbiAhPSBOVUxMKSB7Ci1pZiAoZGVidWdfeGRhbWFnZSA+IDEpIGZwcmludGYoc3RkZXJyLCAiYWRkX3JlZ2lvbl94ZGFtYWdlOiBwcmV2X3RpY2s6ICVkIHJlZyAlcCAgbmV3X3JlZ2lvbiAlcFxuIiwgcHJldl90aWNrLCAodm9pZCAqKXJlZywgKHZvaWQgKiluZXdfcmVnaW9uKTsKLQkJc3JhUmduT3IocmVnLCBuZXdfcmVnaW9uKTsKLQl9Ci19Ci0KLXZvaWQgY2xlYXJfeGRhbWFnZV9tYXJrX3JlZ2lvbihzcmFSZWdpb25QdHIgbWFya3JlZ2lvbiwgaW50IGZsdXNoKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWERBTUFHRQotCVhFdmVudCBldjsKLQlzcmFSZWdpb25QdHIgdG1wcmVnaW9uOwotCWludCBjb3VudCA9IDA7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKCEgeGRhbWFnZV9wcmVzZW50IHx8ICEgdXNlX3hkYW1hZ2UpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISB4ZGFtYWdlKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCEgeGRhbWFnZV9iYXNlX2V2ZW50X3R5cGUpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlYX0xPQ0s7Ci0JaWYgKGZsdXNoKSB7Ci0JCVhGbHVzaF93cihkcHkpOwotCX0KLQl3aGlsZSAoWENoZWNrVHlwZWRFdmVudChkcHksIHhkYW1hZ2VfYmFzZV9ldmVudF90eXBlK1hEYW1hZ2VOb3RpZnksICZldikpIHsKLQkJY291bnQrKzsKLQl9Ci0JLyogY2xlYXIgdGhlIHdob2xlIGRhbWFnZSByZWdpb24gKi8KLQlYRGFtYWdlU3VidHJhY3QoZHB5LCB4ZGFtYWdlLCBOb25lLCBOb25lKTsKLQlYX1VOTE9DSzsKLQotCWlmIChkZWJ1Z190aWxlcyB8fCBkZWJ1Z194ZGFtYWdlKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiY2xlYXJfeGRhbWFnZV9tYXJrX3JlZ2lvbjogJWRcbiIsIGNvdW50KTsKLQl9Ci0KLQlpZiAoISBtYXJrcmVnaW9uKSB7Ci0JCS8qIE5VTEwgbWVhbnMgbWFyayB0aGUgd2hvbGUgZGlzcGxheSAqLwotCQl0bXByZWdpb24gPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0JCWFkZF9yZWdpb25feGRhbWFnZSh0bXByZWdpb24pOwotCQlzcmFSZ25EZXN0cm95KHRtcHJlZ2lvbik7Ci0JfSBlbHNlIHsKLQkJYWRkX3JlZ2lvbl94ZGFtYWdlKG1hcmtyZWdpb24pOwotCX0KLSNlbHNlCi0JaWYgKDApIGZsdXNoKys7ICAgICAgICAvKiBjb21waWxlciB3YXJuaW5ncyAqLwotCWlmICgwKSBtYXJrcmVnaW9uID0gTlVMTDsgICAKLSNlbmRpZgotfQotCi1pbnQgY29sbGVjdF9ub25fWF94ZGFtYWdlKGludCB4X2luLCBpbnQgeV9pbiwgaW50IHdfaW4sIGludCBoX2luLCBpbnQgY2FsbCkgewotCXNyYVJlZ2lvblB0ciB0bXByZWdpb247Ci0Jc3JhUmVnaW9uUHRyIHJlZzsKLQlzdGF0aWMgaW50IHJlY3RfY291bnQgPSAwOwotCWludCBucmVnLCBjY291bnQgPSAwLCBkY291bnQgPSAwLCBlY291bnQgPSAwOwotCXN0YXRpYyB0aW1lX3QgbGFzdF9ycHQgPSAwOwotCXRpbWVfdCBub3c7Ci0JZG91YmxlIHRtLCBkdDsKLQlpbnQgeCwgeSwgdywgaCwgeDIsIHkyOwotCi1pZiAoY2FsbCAmJiBkZWJ1Z194ZGFtYWdlID4gMSkgZnByaW50ZihzdGRlcnIsICJjb2xsZWN0X25vbl9YX3hkYW1hZ2U6ICVkICVkICVkICVkIC0gJWQgLyAlZFxuIiwgeF9pbiwgeV9pbiwgd19pbiwgaF9pbiwgY2FsbCwgdXNlX3hkYW1hZ2UpOwotCi0JaWYgKCEgdXNlX3hkYW1hZ2UpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHhkYW1hZ2VfcmVnaW9ucykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkdGltZTAoJnRtKTsKLQotCW5yZWcgPSAoeGRhbWFnZV9tZW1vcnkgKiBOU0NBTikgKyAxOwotCi0JaWYgKGNhbGwgPT0gMCkgewotCQl4ZGFtYWdlX3RpY2tlciA9ICh4ZGFtYWdlX3RpY2tlcisxKSAlIG5yZWc7Ci0JCXhkYW1hZ2VfZGlyZWN0X2NvdW50ID0gMDsKLQkJcmVnID0geGRhbWFnZV9yZWdpb25zW3hkYW1hZ2VfdGlja2VyXTsgIAotCQlpZiAocmVnICE9IE5VTEwpIHsKLQkJCXNyYVJnbk1ha2VFbXB0eShyZWcpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHhkYW1hZ2VfdGlja2VyIDwgMCkgewotCQkJeGRhbWFnZV90aWNrZXIgPSAwOwotCQl9Ci0JCXJlZyA9IHhkYW1hZ2VfcmVnaW9uc1t4ZGFtYWdlX3RpY2tlcl07ICAKLQl9Ci0JaWYgKHJlZyA9PSBOVUxMKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh4X2luIDwgMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXggPSB4X2luOwotCXkgPSB5X2luOwotCXcgPSB3X2luOwotCWggPSBoX2luOwotCi0JLyogdHJhbnNsYXRlIGlmIG5lZWRlZCAqLwotCWlmIChjbGlwc2hpZnQpIHsKLQkJLyogc2V0IGNvb3JkcyByZWxhdGl2ZSB0byBmYiBvcmlnaW4gKi8KLQkJaWYgKDAgJiYgcm9vdHNoaWZ0KSB7Ci0JCQkvKgotCQkJICogTm90ZTogbm90IG5lZWRlZCBiZWNhdXNlIGRhbWFnZSBpcwotCQkJICogcmVsYXRpdmUgdG8gc3Vid2luLCBub3Qgcm9vdHdpbi4KLQkJCSAqLwotCQkJeCA9IHggLSBvZmZfeDsKLQkJCXkgPSB5IC0gb2ZmX3k7Ci0JCX0KLQkJaWYgKGNsaXBzaGlmdCkgewotCQkJeCA9IHggLSBjb2ZmX3g7Ci0JCQl5ID0geSAtIGNvZmZfeTsKLQkJfQotCi0JCXgyID0geCArIHc7CQkvKiB1cHBlciBwb2ludCAqLwotCQl4ICA9IG5maXgoeCwgIGRweV94KTsJLyogcGxhY2UgYm90aCBpbiBmYiBhcmVhICovCi0JCXgyID0gbmZpeCh4MiwgZHB5X3grMSk7Ci0JCXcgPSB4MiAtIHg7CQkvKiByZWNvbXB1dGUgdyAqLwotCQkKLQkJeTIgPSB5ICsgaDsKLQkJeSAgPSBuZml4KHksICBkcHlfeSk7Ci0JCXkyID0gbmZpeCh5MiwgZHB5X3krMSk7Ci0JCWggPSB5MiAtIHk7Ci0KLQkJaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChkZWJ1Z194ZGFtYWdlID4gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgInhkYW1hZ2U6IC0+IGV2ZW50ICVkeCVkKyVkKyVkIGFyZWE6IgotCQkgICAgIiAlZCAgZHVwczogJWQgICVzIHJlZzogJXBcbiIsIHcsIGgsIHgsIHksIHcqaCwgZGNvdW50LAotCQkgICAgKHcqaCA+IHhkYW1hZ2VfbWF4X2FyZWEpID8gIlRPT19CSUciIDogIiIsICh2b2lkICopcmVnKTsKLQl9Ci0KLQlyZWNvcmRfZGVzaXJlZF94ZGFtYWdlX3JlY3QoeCwgeSwgdywgaCk7Ci0KLQl0bXByZWdpb24gPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHggKyB3LCB5ICsgaCk7IAotCXNyYVJnbk9yKHJlZywgdG1wcmVnaW9uKTsKLQlzcmFSZ25EZXN0cm95KHRtcHJlZ2lvbik7Ci0JcmVjdF9jb3VudCsrOwotCWNjb3VudCsrOwotCi0JaWYgKDAgJiYgeGRhbWFnZV9kaXJlY3RfY291bnQpIHsKLQkJZmJfcHVzaCgpOwotCX0KLQotCWR0ID0gZHRpbWUoJnRtKTsKLQlpZiAoKGRlYnVnX3RpbGVzID4gMSAmJiBlY291bnQpIHx8IChkZWJ1Z190aWxlcyAmJiBlY291bnQgPiAyMDApCi0JICAgIHx8IGRlYnVnX3hkYW1hZ2UgPiAxKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiY29sbGVjdF9ub25fWF94ZGFtYWdlKCVkKTogJS40ZiB0OiAlLjRmIGV2L2R1cC9hY2NlcHQiCi0JCSAgICAiL2RpcmVjdCAlZC8lZC8lZC8lZFxuIiwgY2FsbCwgZHQsIHRtIC0geDExdm5jX3N0YXJ0LCBlY291bnQsCi0JCSAgICBkY291bnQsIGNjb3VudCwgeGRhbWFnZV9kaXJlY3RfY291bnQpOyAKLQl9Ci0Jbm93ID0gdGltZShOVUxMKTsKLQlpZiAoISBsYXN0X3JwdCkgewotCQlsYXN0X3JwdCA9IG5vdzsKLQl9Ci0JaWYgKG5vdyA+IGxhc3RfcnB0ICsgMTUpIHsKLQkJZG91YmxlIHJhdCA9IC0xLjA7Ci0KLQkJaWYgKFhEX3RvdCkgewotCQkJcmF0ID0gKChkb3VibGUpIFhEX3NraXApL1hEX3RvdDsKLQkJfQotCQlpZiAoZGVidWdfdGlsZXMgfHwgZGVidWdfeGRhbWFnZSkgewotCQkJZnByaW50ZihzdGRlcnIsICJ4ZGFtYWdlOiA9PSBzY2FubGluZSBza2lwL3RvdDogIgotCQkJICAgICIlMDRkLyUwNGQgPSUuM2YgIHJlY3RzOiAlZCAgZGVzaXJlZDogJWRcbiIsCi0JCQkgICAgWERfc2tpcCwgWERfdG90LCByYXQsIHJlY3RfY291bnQsIFhEX2Rlcyk7Ci0JCX0KLQkJCQotCQlYRF9za2lwID0gMDsKLQkJWERfdG90ICA9IDA7Ci0JCVhEX2RlcyAgPSAwOwotCQlyZWN0X2NvdW50ID0gMDsKLQkJbGFzdF9ycHQgPSBub3c7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgY29sbGVjdF94ZGFtYWdlKGludCBzY2FuY250LCBpbnQgY2FsbCkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhEQU1BR0UKLQlYRGFtYWdlTm90aWZ5RXZlbnQgKmRldjsKLQlYRXZlbnQgZXY7Ci0Jc3JhUmVnaW9uUHRyIHRtcHJlZ2lvbjsKLQlzcmFSZWdpb25QdHIgcmVnOwotCXN0YXRpYyBpbnQgcmVjdF9jb3VudCA9IDA7Ci0JaW50IG5yZWcsIGNjb3VudCA9IDAsIGRjb3VudCA9IDAsIGVjb3VudCA9IDA7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X3JwdCA9IDA7Ci0JdGltZV90IG5vdzsKLQlpbnQgeCwgeSwgdywgaCwgeDIsIHkyOwotCWludCBpLCBkdXAsIG5leHQgPSAwLCBkdXBfbWF4ID0gMDsKLSNkZWZpbmUgRFVQU1ogMzIKLQlpbnQgZHVwX3hbRFVQU1pdLCBkdXBfeVtEVVBTWl0sIGR1cF93W0RVUFNaXSwgZHVwX2hbRFVQU1pdOwotCWRvdWJsZSB0bSwgZHQ7Ci0JaW50IG1hcmtfYWxsID0gMCwgcmV0cmllcyA9IDAsIHRvb19tYW55ID0gMTAwMCwgdG90X2V2ID0gMDsKLQotCVJBV0ZCX1JFVCgwKQotCi0JaWYgKHNjYW5jbnQpIHt9IC8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0KLQlpZiAoISB4ZGFtYWdlX3ByZXNlbnQgfHwgISB1c2VfeGRhbWFnZSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgeGRhbWFnZSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEgeGRhbWFnZV9iYXNlX2V2ZW50X3R5cGUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghIHhkYW1hZ2VfcmVnaW9ucykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkdGltZTAoJnRtKTsKLQotCW5yZWcgPSAoeGRhbWFnZV9tZW1vcnkgKiBOU0NBTikgKyAxOwotCi0JaWYgKGNhbGwgPT0gMCkgewotCQl4ZGFtYWdlX3RpY2tlciA9ICh4ZGFtYWdlX3RpY2tlcisxKSAlIG5yZWc7Ci0JCXhkYW1hZ2VfZGlyZWN0X2NvdW50ID0gMDsKLQkJcmVnID0geGRhbWFnZV9yZWdpb25zW3hkYW1hZ2VfdGlja2VyXTsgIAotCQlpZiAocmVnICE9IE5VTEwpIHsKLQkJCXNyYVJnbk1ha2VFbXB0eShyZWcpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHhkYW1hZ2VfdGlja2VyIDwgMCkgewotCQkJeGRhbWFnZV90aWNrZXIgPSAwOwotCQl9Ci0JCXJlZyA9IHhkYW1hZ2VfcmVnaW9uc1t4ZGFtYWdlX3RpY2tlcl07ICAKLQl9Ci0JaWYgKHJlZyA9PSBOVUxMKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JWF9MT0NLOwotaWYgKDApCVhGbHVzaF93cihkcHkpOwotaWYgKDApCVhFdmVudHNRdWV1ZWQoZHB5LCBRdWV1ZWRBZnRlckZsdXNoKTsKLQotCWNvbWVfYmFja19mb3JfbW9yZToKLQotCXdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgeGRhbWFnZV9iYXNlX2V2ZW50X3R5cGUrWERhbWFnZU5vdGlmeSwgJmV2KSkgewotCQkvKgotCQkgKiBUT0RPIG1heCBjdXQgb2ZmIHRpbWUgaW4gdGhpcyBsb29wPwotCQkgKiBDb3VsZCBjaGVjayBRTGVuZ3RoIGFuZCBpZiBodWdlIGp1c3QgbWFyayB0aGUgd2hvbGUKLQkJICogc2NyZWVuLgotCQkgKi8KLQkJZWNvdW50Kys7Ci0JCXRvdF9ldisrOwotCi0JCWlmIChtYXJrX2FsbCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGVjb3VudCA9PSB0b29fbWFueSkgewotCQkJaW50IG5xYSA9IFhFdmVudHNRdWV1ZWQoZHB5LCBRdWV1ZWRBbHJlYWR5KTsKLQkJCWlmIChucWEgPj0gdG9vX21hbnkpIHsKLQkJCQlzdGF0aWMgZG91YmxlIGxhc3RfbXNnID0gMC4wOwotCQkJCXRtcHJlZ2lvbiA9IHNyYVJnbkNyZWF0ZVJlY3QoMCwgMCwgZHB5X3gsIGRweV95KTsKLQkJCQlzcmFSZ25PcihyZWcsIHRtcHJlZ2lvbik7Ci0JCQkJc3JhUmduRGVzdHJveSh0bXByZWdpb24pOwotCQkJCWlmIChkbm93KCkgPiBsYXN0X21zZyArIHhkYW1hZ2VfY3JhenlfZGVsYXkpIHsKLQkJCQkJcmZiTG9nKCJjb2xsZWN0X3hkYW1hZ2U6IHRvbyBtYW55IHhkYW1hZ2UgZXZlbnRzICVkKyVkXG4iLCBlY291bnQsIG5xYSk7Ci0JCQkJCWxhc3RfbXNnID0gZG5vdygpOwotCQkJCX0KLQkJCQltYXJrX2FsbCA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXYudHlwZSAhPSB4ZGFtYWdlX2Jhc2VfZXZlbnRfdHlwZSArIFhEYW1hZ2VOb3RpZnkpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldiA9IChYRGFtYWdlTm90aWZ5RXZlbnQgKikgJmV2OwotCQlpZiAoZGV2LT5kYW1hZ2UgIT0geGRhbWFnZSkgewotCQkJY29udGludWU7CS8qIG5vdCBvdXJzISAqLwotCQl9Ci0KLQkJeCA9IGRldi0+YXJlYS54OwotCQl5ID0gZGV2LT5hcmVhLnk7Ci0JCXcgPSBkZXYtPmFyZWEud2lkdGg7Ci0JCWggPSBkZXYtPmFyZWEuaGVpZ2h0OwotCi0JCS8qCi0JCSAqIHdlIHRyeSB0byBtYW51YWxseSByZW1vdmUgc29tZSBkdXBsaWNhdGVzIGJlY2F1c2UKLQkJICogY2VydGFpbiBhY3Rpdml0aWVzIGNhbiBsZWFkIHRvIG1hbnkgMTAncyBvZiBkdXBzCi0JCSAqIGluIGEgcm93LiAgVGhlIHJlZ2lvbiB3b3JrIGNhbiBiZSBjb3N0bHkgYW5kIHJlZyBpcwotCQkgKiBsYXRlciB1c2VkIGluIHhkYW1hZ2VfaGludF9za2lwIGxvb3BzLCBzbyBpdCBpcyBnb29kCi0JCSAqIHRvIHNraXAgdGhlbSBpZiBwb3NzaWJsZS4KLQkJICovCi0JCWR1cCA9IDA7Ci0JCWZvciAoaT0wOyBpIDwgZHVwX21heDsgaSsrKSB7Ci0JCQlpZiAoZHVwX3hbaV0gPT0geCAmJiBkdXBfeVtpXSA9PSB5ICYmIGR1cF93W2ldID09IHcgJiYKLQkJCSAgICBkdXBfaFtpXSA9PSBoKSB7Ci0JCQkJZHVwID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZHVwKSB7Ci0JCQlkY291bnQrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChkdXBfbWF4IDwgRFVQU1opIHsKLQkJCW5leHQgPSBkdXBfbWF4OwotCQkJZHVwX21heCsrOwotCQl9IGVsc2UgewotCQkJbmV4dCA9IChuZXh0KzEpICUgRFVQU1o7Ci0JCX0KLQkJZHVwX3hbbmV4dF0gPSB4OwotCQlkdXBfeVtuZXh0XSA9IHk7Ci0JCWR1cF93W25leHRdID0gdzsKLQkJZHVwX2hbbmV4dF0gPSBoOwotCi0JCS8qIHRyYW5zbGF0ZSBpZiBuZWVkZWQgKi8KLQkJaWYgKGNsaXBzaGlmdCkgewotCQkJLyogc2V0IGNvb3JkcyByZWxhdGl2ZSB0byBmYiBvcmlnaW4gKi8KLQkJCWlmICgwICYmIHJvb3RzaGlmdCkgewotCQkJCS8qCi0JCQkJICogTm90ZTogbm90IG5lZWRlZCBiZWNhdXNlIGRhbWFnZSBpcwotCQkJCSAqIHJlbGF0aXZlIHRvIHN1Yndpbiwgbm90IHJvb3R3aW4uCi0JCQkJICovCi0JCQkJeCA9IHggLSBvZmZfeDsKLQkJCQl5ID0geSAtIG9mZl95OwotCQkJfQotCQkJaWYgKGNsaXBzaGlmdCkgewotCQkJCXggPSB4IC0gY29mZl94OwotCQkJCXkgPSB5IC0gY29mZl95OwotCQkJfQotCi0JCQl4MiA9IHggKyB3OwkJLyogdXBwZXIgcG9pbnQgKi8KLQkJCXggID0gbmZpeCh4LCAgZHB5X3gpOwkvKiBwbGFjZSBib3RoIGluIGZiIGFyZWEgKi8KLQkJCXgyID0gbmZpeCh4MiwgZHB5X3grMSk7Ci0JCQl3ID0geDIgLSB4OwkJLyogcmVjb21wdXRlIHcgKi8KLQkJCQotCQkJeTIgPSB5ICsgaDsKLQkJCXkgID0gbmZpeCh5LCAgZHB5X3kpOwotCQkJeTIgPSBuZml4KHkyLCBkcHlfeSsxKTsKLQkJCWggPSB5MiAtIHk7Ci0KLQkJCWlmICh3IDw9IDAgfHwgaCA8PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnX3hkYW1hZ2UgPiAyKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInhkYW1hZ2U6IC0+IGV2ZW50ICVkeCVkKyVkKyVkIGFyZWE6IgotCQkJICAgICIgJWQgIGR1cHM6ICVkICAlc1xuIiwgdywgaCwgeCwgeSwgdypoLCBkY291bnQsCi0JCQkgICAgKHcqaCA+IHhkYW1hZ2VfbWF4X2FyZWEpID8gIlRPT19CSUciIDogIiIpOwotCQl9Ci0KLQkJcmVjb3JkX2Rlc2lyZWRfeGRhbWFnZV9yZWN0KHgsIHksIHcsIGgpOwotCi0JCXRtcHJlZ2lvbiA9IHNyYVJnbkNyZWF0ZVJlY3QoeCwgeSwgeCArIHcsIHkgKyBoKTsgCi0JCXNyYVJnbk9yKHJlZywgdG1wcmVnaW9uKTsKLQkJc3JhUmduRGVzdHJveSh0bXByZWdpb24pOwotCQlyZWN0X2NvdW50Kys7Ci0JCWNjb3VudCsrOwotCX0KLQotCWlmIChtYXJrX2FsbCkgewotCQlpZiAoZWNvdW50ICsgWEV2ZW50c1F1ZXVlZChkcHksIFF1ZXVlZEFscmVhZHkpID49IDMgKiB0b29fbWFueSAmJiByZXRyaWVzIDwgMykgewotCQkJcmV0cmllcysrOwotCQkJWEZsdXNoX3dyKGRweSk7Ci0JCQl1c2xlZXAoMjAgKiAxMDAwKTsKLQkJCVhGbHVzaF93cihkcHkpOwotCQkJZWNvdW50ID0gMDsKLQkJCWdvdG8gY29tZV9iYWNrX2Zvcl9tb3JlOwotCQl9Ci0JfQotCi0JLyogY2xlYXIgdGhlIHdob2xlIGRhbWFnZSByZWdpb24gZm9yIG5leHQgdGltZS4gWFhYIGNoZWNrICovCi0JaWYgKGNhbGwgPT0gMSkgewotCQlYRGFtYWdlU3VidHJhY3QoZHB5LCB4ZGFtYWdlLCBOb25lLCBOb25lKTsKLQl9Ci0JWF9VTkxPQ0s7Ci0KLQlpZiAodG90X2V2ID4gMjAgKiB0b29fbWFueSkgewotCQlyZmJMb2coImNvbGxlY3RfeGRhbWFnZTogeGRhbWFnZSBoYXMgZ29uZSBjcmF6eSAoc2NyZWVuc2F2ZXIgb3IgZ2FtZT8pIGV2OiAlZCByZXQ6ICVkXG4iLCB0b3RfZXYsIHJldHJpZXMpOwotCQlyZmJMb2coImNvbGxlY3RfeGRhbWFnZTogZGlzYWJsaW5nIHhkYW1hZ2UgZm9yICVkIHNlY29uZHMuXG4iLCAoaW50KSB4ZGFtYWdlX2NyYXp5X2RlbGF5KTsKLQkJZGVzdHJveV94ZGFtYWdlX2lmX25lZWRlZCgpOwotCQlYX0xPQ0s7Ci0JCVhTeW5jKGRweSwgRmFsc2UpOwotCQl3aGlsZSAoWENoZWNrVHlwZWRFdmVudChkcHksIHhkYW1hZ2VfYmFzZV9ldmVudF90eXBlK1hEYW1hZ2VOb3RpZnksICZldikpIHsKLQkJCTsKLQkJfQotCQlYX1VOTE9DSzsKLQkJeGRhbWFnZV9jcmF6eV90aW1lID0gZG5vdygpOwotCX0KLQotCWlmICgwICYmIHhkYW1hZ2VfZGlyZWN0X2NvdW50KSB7Ci0JCWZiX3B1c2goKTsKLQl9Ci0KLQlkdCA9IGR0aW1lKCZ0bSk7Ci0JaWYgKChkZWJ1Z190aWxlcyA+IDEgJiYgZWNvdW50KSB8fCAoZGVidWdfdGlsZXMgJiYgZWNvdW50ID4gMjAwKQotCSAgICB8fCBkZWJ1Z194ZGFtYWdlID4gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImNvbGxlY3RfeGRhbWFnZSglZCk6ICUuNGYgdDogJS40ZiBldi9kdXAvYWNjZXB0IgotCQkgICAgIi9kaXJlY3QgJWQvJWQvJWQvJWRcbiIsIGNhbGwsIGR0LCB0bSAtIHgxMXZuY19zdGFydCwgZWNvdW50LAotCQkgICAgZGNvdW50LCBjY291bnQsIHhkYW1hZ2VfZGlyZWN0X2NvdW50KTsgCi0JfQotCW5vdyA9IHRpbWUoTlVMTCk7Ci0JaWYgKCEgbGFzdF9ycHQpIHsKLQkJbGFzdF9ycHQgPSBub3c7Ci0JfQotCWlmIChub3cgPiBsYXN0X3JwdCArIDE1KSB7Ci0JCWRvdWJsZSByYXQgPSAtMS4wOwotCi0JCWlmIChYRF90b3QpIHsKLQkJCXJhdCA9ICgoZG91YmxlKSBYRF9za2lwKS9YRF90b3Q7Ci0JCX0KLQkJaWYgKGRlYnVnX3RpbGVzIHx8IGRlYnVnX3hkYW1hZ2UpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAieGRhbWFnZTogPT0gc2NhbmxpbmUgc2tpcC90b3Q6ICIKLQkJCSAgICAiJTA0ZC8lMDRkID0lLjNmICByZWN0czogJWQgIGRlc2lyZWQ6ICVkXG4iLAotCQkJICAgIFhEX3NraXAsIFhEX3RvdCwgcmF0LCByZWN0X2NvdW50LCBYRF9kZXMpOwotCQl9Ci0JCQkKLQkJWERfc2tpcCA9IDA7Ci0JCVhEX3RvdCAgPSAwOwotCQlYRF9kZXMgID0gMDsKLQkJcmVjdF9jb3VudCA9IDA7Ci0JCWxhc3RfcnB0ID0gbm93OwotCX0KLSNlbHNlCi0JaWYgKDApIHNjYW5jbnQrKzsJLyogY29tcGlsZXIgd2FybmluZ3MgKi8KLQlpZiAoMCkgY2FsbCsrOwotCWlmICgwKSByZWNvcmRfZGVzaXJlZF94ZGFtYWdlX3JlY3QoMCwgMCwgMCwgMCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotaW50IHhkYW1hZ2VfaGludF9za2lwKGludCB5KSB7Ci0Jc3RhdGljIHNyYVJlZ2lvblB0ciBzY2FubGluZSA9IE5VTEw7Ci0Jc3RhdGljIHNyYVJlZ2lvblB0ciB0bXBsX3kgPSBOVUxMOwotCWludCBmYXN0X3RtcGwgPSAxOwotCXNyYVJlZ2lvblB0ciByZWcsIHRtcGw7Ci0JaW50IHJldCwgaSwgbiwgbnJlZzsKLSNpZm5kZWYgTk9fTkNBQ0hFCi0Jc3RhdGljIGludCBuY2FjaGVfbm9fc2tpcCA9IDA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X25jYWNoZV9ub19za2lwID0gMC4wOwotCXN0YXRpYyBkb3VibGUgbGFzdF9uY2FjaGVfbm9fc2tpcF9sb25nID0gMC4wLCBuY2FjaGVfZmFjID0gMC4yNTsKLSNlbmRpZgotCi0JaWYgKCEgeGRhbWFnZV9wcmVzZW50IHx8ICEgdXNlX3hkYW1hZ2UpIHsKLQkJcmV0dXJuIDA7CS8qIGNhbm5vdCBza2lwICovCi0JfQotCWlmICghIHhkYW1hZ2VfcmVnaW9ucykgewotCQlyZXR1cm4gMDsJLyogY2Fubm90IHNraXAgKi8KLQl9Ci0KLQlpZiAoISBzY2FubGluZSkgewotCQkvKiBrZWVwIGl0IGFyb3VuZCB0byBhdm9pZCBtYWxsb2MgZXRjLCByZWNyZWF0ZSAqLwotCQlzY2FubGluZSA9IHNyYVJnbkNyZWF0ZSgpOwotCX0KLQlpZiAoISB0bXBsX3kpIHsKLQkJdG1wbF95ID0gc3JhUmduQ3JlYXRlUmVjdCgwLCAwLCBkcHlfeCwgMSk7Ci0JfQotCi0JbnJlZyA9ICh4ZGFtYWdlX21lbW9yeSAqIE5TQ0FOKSArIDE7Ci0KLSNpZm5kZWYgTk9fTkNBQ0hFCi0JaWYgKG5jYWNoZSA+IDApIHsKLQkJaWYgKG5jYWNoZV9ub19za2lwID09IDApIHsKLQkJCWRvdWJsZSBub3cgPSBnX25vdzsKLQkJCWlmIChub3cgPiBsYXN0X25jYWNoZV9ub19za2lwICsgOC4wKSB7Ci0JCQkJbmNhY2hlX25vX3NraXAgPSAxOwotCQkJfSBlbHNlIGlmIChub3cgPCBsYXN0X2JzX3Jlc3RvcmUgKyAwLjUpIHsKLQkJCQluY2FjaGVfbm9fc2tpcCA9IDE7Ci0JCQl9IGVsc2UgaWYgKG5vdyA8IGxhc3Rfc3VfcmVzdG9yZSArIDAuNSkgewotCQkJCW5jYWNoZV9ub19za2lwID0gMTsKLQkJCX0gZWxzZSBpZiAobm93IDwgbGFzdF9jb3B5cmVjdCArIDAuNSkgewotCQkJCW5jYWNoZV9ub19za2lwID0gMTsKLQkJCX0KLQkJCWlmIChuY2FjaGVfbm9fc2tpcCkgewotCQkJCWxhc3RfbmNhY2hlX25vX3NraXAgPSBkbm93KCk7Ci0JCQkJaWYgKG5vdyA+IGxhc3RfbmNhY2hlX25vX3NraXBfbG9uZyArIDYwLjApIHsKLQkJCQkJbmNhY2hlX2ZhYyA9IDIuMDsKLQkJCQkJbGFzdF9uY2FjaGVfbm9fc2tpcF9sb25nID0gbm93OwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5jYWNoZV9mYWMgPSAwLjI1OwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChuY2FjaGVfbm9fc2tpcCsrID49IG5jYWNoZV9mYWMqbnJlZyArIDQpIHsKLQkJCQluY2FjaGVfbm9fc2tpcCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0KLQlpZiAoZmFzdF90bXBsKSB7Ci0JCXNyYVJnbk9mZnNldCh0bXBsX3ksIDAsIHkpOwotCQl0bXBsID0gdG1wbF95OwotCX0gZWxzZSB7Ci0JCXRtcGwgPSBzcmFSZ25DcmVhdGVSZWN0KDAsIHksIGRweV94LCB5KzEpOwotCX0KLQotCXJldCA9IDE7Ci0JZm9yIChpPTA7IGk8bnJlZzsgaSsrKSB7Ci0JCS8qIGdvIGJhY2sgdGhydSB0aGUgaGlzdG9yeSBzdGFydGluZyBhdCBtb3N0IHJlY2VudCAqLwotCQluID0gKHhkYW1hZ2VfdGlja2VyICsgbnJlZyAtIGkpICUgbnJlZzsKLQkJcmVnID0geGRhbWFnZV9yZWdpb25zW25dOyAgCi0JCWlmIChyZWcgPT0gTlVMTCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHNyYVJnbkVtcHR5KHJlZykpIHsKLQkJCS8qIGNoZWNraW5nIGZvciBlbXB0aW5lc3MgaXMgdmVyeSBmYXN0ICovCi0JCQljb250aW51ZTsKLQkJfQotCQlzcmFSZ25NYWtlRW1wdHkoc2NhbmxpbmUpOwotCQlzcmFSZ25PcihzY2FubGluZSwgdG1wbCk7Ci0JCWlmIChzcmFSZ25BbmQoc2NhbmxpbmUsIHJlZykpIHsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoZmFzdF90bXBsKSB7Ci0JCXNyYVJnbk9mZnNldCh0bXBsX3ksIDAsIC15KTsKLQl9IGVsc2UgewotCQlzcmFSZ25EZXN0cm95KHRtcGwpOwotCX0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgInhkYW1hZ2VfaGludF9za2lwOiAlZCAtPiAlZFxuIiwgeSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV94ZGFtYWdlKHZvaWQpIHsKLQlzcmFSZWdpb25QdHIgKnB0cjsKLQlpbnQgaSwgbnJlZzsKLQotCWlmICghIHhkYW1hZ2VfcHJlc2VudCkgewotCQl1c2VfeGRhbWFnZSA9IDA7Ci0JfQotCWlmICh4ZGFtYWdlX3JlZ2lvbnMpICB7Ci0JCXB0ciA9IHhkYW1hZ2VfcmVnaW9uczsKLQkJd2hpbGUgKCpwdHIgIT0gTlVMTCkgewotCQkJc3JhUmduRGVzdHJveSgqcHRyKTsKLQkJCXB0cisrOwotCQl9Ci0JCWZyZWUoeGRhbWFnZV9yZWdpb25zKTsKLQkJeGRhbWFnZV9yZWdpb25zID0gTlVMTDsKLQl9Ci0JaWYgKHVzZV94ZGFtYWdlKSB7Ci0JCW5yZWcgPSAoeGRhbWFnZV9tZW1vcnkgKiBOU0NBTikgKyAyOwotCQl4ZGFtYWdlX3JlZ2lvbnMgPSAoc3JhUmVnaW9uUHRyICopCi0JCSAgICBtYWxsb2MobnJlZyAqIHNpemVvZihzcmFSZWdpb25QdHIpKTsKLQkJZm9yIChpID0gMDsgaSA8IG5yZWc7IGkrKykgewotCQkJcHRyID0geGRhbWFnZV9yZWdpb25zK2k7Ci0JCQlpZiAoaSA9PSBucmVnIC0gMSkgewotCQkJCSpwdHIgPSBOVUxMOwotCQkJfSBlbHNlIHsKLQkJCQkqcHRyID0gc3JhUmduQ3JlYXRlKCk7Ci0JCQkJc3JhUmduTWFrZUVtcHR5KCpwdHIpOwotCQkJfQotCQl9Ci0JCS8qIHNldCBzbyB3aWxsIGJlIDAgaW4gZmlyc3QgY29sbGVjdF94ZGFtYWdlIGNhbGwgKi8KLQkJeGRhbWFnZV90aWNrZXIgPSAtMTsKLQl9Ci19Ci0KLXZvaWQgY3JlYXRlX3hkYW1hZ2VfaWZfbmVlZGVkKGludCBmb3JjZSkgewotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChmb3JjZSkge30KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhEQU1BR0UKLQlpZiAoISB4ZGFtYWdlIHx8IGZvcmNlKSB7Ci0JCVhfTE9DSzsKLQkJeGRhbWFnZSA9IFhEYW1hZ2VDcmVhdGUoZHB5LCB3aW5kb3csIFhEYW1hZ2VSZXBvcnRSYXdSZWN0YW5nbGVzKTsgCi0JCVhEYW1hZ2VTdWJ0cmFjdChkcHksIHhkYW1hZ2UsIE5vbmUsIE5vbmUpOwotCQlYX1VOTE9DSzsKLQkJcmZiTG9nKCJjcmVhdGVkICAgeGRhbWFnZSBvYmplY3Q6IDB4JWx4XG4iLCB4ZGFtYWdlKTsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBkZXN0cm95X3hkYW1hZ2VfaWZfbmVlZGVkKHZvaWQpIHsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYREFNQUdFCi0JaWYgKHhkYW1hZ2UpIHsKLQkJWEV2ZW50IGV2OwotCQlYX0xPQ0s7Ci0JCVhEYW1hZ2VEZXN0cm95KGRweSwgeGRhbWFnZSk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQlpZiAoeGRhbWFnZV9iYXNlX2V2ZW50X3R5cGUpIHsKLQkJCXdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwKLQkJCSAgICB4ZGFtYWdlX2Jhc2VfZXZlbnRfdHlwZStYRGFtYWdlTm90aWZ5LCAmZXYpKSB7Ci0JCQkJOwotCQkJfQotCQl9Ci0JCVhfVU5MT0NLOwotCQlyZmJMb2coImRlc3Ryb3llZCB4ZGFtYWdlIG9iamVjdDogMHglbHhcbiIsIHhkYW1hZ2UpOwotCQl4ZGFtYWdlID0gMDsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBjaGVja194ZGFtYWdlX3N0YXRlKHZvaWQpIHsKLQlpZiAoISB4ZGFtYWdlX3ByZXNlbnQpIHsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIENyZWF0ZSBvciBkZXN0cm95IHRoZSBEYW1hZ2Ugb2JqZWN0IGFzIG5lZWRlZCwgd2UgZG9uJ3Qgd2FudAotCSAqIG9uZSBpZiBubyBjbGllbnRzIGFyZSBjb25uZWN0ZWQuCi0JICovCi0JaWYgKHhkYW1hZ2VfY3JhenlfdGltZSA+IDAuMCAmJiBkbm93KCkgPCB4ZGFtYWdlX2NyYXp5X3RpbWUgKyB4ZGFtYWdlX2NyYXp5X2RlbGF5KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNsaWVudF9jb3VudCAmJiB1c2VfeGRhbWFnZSkgewotCQljcmVhdGVfeGRhbWFnZV9pZl9uZWVkZWQoMCk7Ci0JCWlmICh4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrID4gMC4wICYmIGRub3coKSA+Ci0JCSAgICB4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrKSB7Ci0JCQlpZiAoeGRhbWFnZV9zY2hlZHVsZWRfbWFya19yZWdpb24pIHsKLQkJCQltYXJrX3JlZ2lvbl9mb3JfeGRhbWFnZSgKLQkJCQkgICAgeGRhbWFnZV9zY2hlZHVsZWRfbWFya19yZWdpb24pOwotCQkJCXNyYVJnbkRlc3Ryb3koeGRhbWFnZV9zY2hlZHVsZWRfbWFya19yZWdpb24pOwotCQkJCXhkYW1hZ2Vfc2NoZWR1bGVkX21hcmtfcmVnaW9uID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJbWFya19mb3JfeGRhbWFnZSgwLCAwLCBkcHlfeCwgZHB5X3kpOwotCQkJfQotCQkJeGRhbWFnZV9zY2hlZHVsZWRfbWFyayA9IDAuMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRlc3Ryb3lfeGRhbWFnZV9pZl9uZWVkZWQoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3hkYW1hZ2UuaCBiL3gxMXZuYy94ZGFtYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTliN2QuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hkYW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1hEQU1BR0VfSAotI2RlZmluZSBfWDExVk5DX1hEQU1BR0VfSAotCi0vKiAtLSB4ZGFtYWdlLmggLS0gKi8KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhEQU1BR0UKLWV4dGVybiBEYW1hZ2UgeGRhbWFnZTsKLSNlbmRpZgotZXh0ZXJuIGludCB1c2VfeGRhbWFnZTsKLWV4dGVybiBpbnQgeGRhbWFnZV9wcmVzZW50OwotZXh0ZXJuIGludCB4ZGFtYWdlX21heF9hcmVhOwotZXh0ZXJuIGRvdWJsZSB4ZGFtYWdlX21lbW9yeTsKLWV4dGVybiBpbnQgeGRhbWFnZV90aWxlX2NvdW50LCB4ZGFtYWdlX2RpcmVjdF9jb3VudDsKLWV4dGVybiBkb3VibGUgeGRhbWFnZV9zY2hlZHVsZWRfbWFyazsKLWV4dGVybiBkb3VibGUgeGRhbWFnZV9jcmF6eV90aW1lOwotZXh0ZXJuIGRvdWJsZSB4ZGFtYWdlX2NyYXp5X2RlbGF5OwotZXh0ZXJuIHNyYVJlZ2lvblB0ciB4ZGFtYWdlX3NjaGVkdWxlZF9tYXJrX3JlZ2lvbjsKLWV4dGVybiBzcmFSZWdpb25QdHIgKnhkYW1hZ2VfcmVnaW9uczsKLWV4dGVybiBpbnQgeGRhbWFnZV90aWNrZXI7Ci1leHRlcm4gaW50IFhEX3NraXAsIFhEX3RvdCwgWERfZGVzOwotCi1leHRlcm4gdm9pZCBhZGRfcmVnaW9uX3hkYW1hZ2Uoc3JhUmVnaW9uUHRyIG5ld19yZWdpb24pOwotZXh0ZXJuIHZvaWQgY2xlYXJfeGRhbWFnZV9tYXJrX3JlZ2lvbihzcmFSZWdpb25QdHIgbWFya3JlZ2lvbiwgaW50IGZsdXNoKTsKLWV4dGVybiBpbnQgY29sbGVjdF9ub25fWF94ZGFtYWdlKGludCB4X2luLCBpbnQgeV9pbiwgaW50IHdfaW4sIGludCBoX2luLCBpbnQgY2FsbCk7Ci1leHRlcm4gaW50IGNvbGxlY3RfeGRhbWFnZShpbnQgc2NhbmNudCwgaW50IGNhbGwpOwotZXh0ZXJuIGludCB4ZGFtYWdlX2hpbnRfc2tpcChpbnQgeSk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3hkYW1hZ2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBjcmVhdGVfeGRhbWFnZV9pZl9uZWVkZWQoaW50IGZvcmNlKTsKLWV4dGVybiB2b2lkIGRlc3Ryb3lfeGRhbWFnZV9pZl9uZWVkZWQodm9pZCk7Ci1leHRlcm4gdm9pZCBjaGVja194ZGFtYWdlX3N0YXRlKHZvaWQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19YREFNQUdFX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy94ZXZlbnRzLmMgYi94MTF2bmMveGV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI2NTE1Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy94ZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTc1ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geGV2ZW50cy5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJ4a2JfYmVsbC5oIgotI2luY2x1ZGUgInhyYW5kci5oIgotI2luY2x1ZGUgInhkYW1hZ2UuaCIKLSNpbmNsdWRlICJ4cmVjb3JkLmgiCi0jaW5jbHVkZSAic2VsZWN0aW9uLmgiCi0jaW5jbHVkZSAia2V5Ym9hcmQuaCIKLSNpbmNsdWRlICJjdXJzb3IuaCIKLSNpbmNsdWRlICJndWkuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJtYWNvc3guaCIKLSNpbmNsdWRlICJzY3JlZW4uaCIKLSNpbmNsdWRlICJwbS5oIgotI2luY2x1ZGUgInBvaW50ZXIuaCIKLSNpbmNsdWRlICJyZW1vdGUuaCIKLSNpbmNsdWRlICJpbmV0LmgiCi0KLS8qIFhYWCBDSEVDSyBCRUZPUkUgUkVMRUFTRSAqLwotaW50IGdyYWJfYnVzdGVyID0gMDsKLWludCBncmFiX2tiZCA9IDA7Ci1pbnQgZ3JhYl9wdHIgPSAwOwotaW50IGdyYWJfYWx3YXlzID0gMDsKLWludCB1bmdyYWJfYm90aCA9IDA7Ci1pbnQgZ3JhYl9sb2NhbCA9IDA7Ci1pbnQgc3luY190b2RfZGVsYXkgPSAyMDsKLQotdm9pZCBpbml0aWFsaXplX3ZuY19jb25uZWN0X3Byb3Aodm9pZCk7Ci12b2lkIGluaXRpYWxpemVfeDExdm5jX3JlbW90ZV9wcm9wKHZvaWQpOwotdm9pZCBpbml0aWFsaXplX2NsaXBib2FyZF9hdG9tKHZvaWQpOwotdm9pZCBzcGF3bl9ncmFiX2J1c3Rlcih2b2lkKTsKLXZvaWQgc3luY190b2Rfd2l0aF9zZXJ2ZXJ0aW1lKHZvaWQpOwotdm9pZCBjaGVja19rZXljb2RlX3N0YXRlKHZvaWQpOwotdm9pZCBjaGVja19hdXRvcmVwZWF0KHZvaWQpOwotdm9pZCBzZXRfcHJvcF9hdG9tKEF0b20gYXRvbSk7Ci12b2lkIGNoZWNrX3hldmVudHMoaW50IHJlc2V0KTsKLXZvaWQgeGN1dF9yZWNlaXZlKGNoYXIgKnRleHQsIGludCBsZW4sIHJmYkNsaWVudFB0ciBjbCk7Ci0KLXZvaWQga2JkX3JlbGVhc2VfYWxsX2tleXMocmZiQ2xpZW50UHRyIGNsKTsKLXZvaWQgc2V0X3NpbmdsZV93aW5kb3cocmZiQ2xpZW50UHRyIGNsLCBpbnQgeCwgaW50IHkpOwotdm9pZCBzZXRfc2VydmVyX2lucHV0KHJmYkNsaWVudFB0ciBjbCwgaW50IHMpOwotdm9pZCBzZXRfdGV4dF9jaGF0KHJmYkNsaWVudFB0ciBjbCwgaW50IGwsIGNoYXIgKnQpOwotaW50IGdldF9rZXlib2FyZF9sZWRfc3RhdGVfaG9vayhyZmJTY3JlZW5JbmZvUHRyIHMpOwotaW50IGdldF9maWxlX3RyYW5zZmVyX3Blcm1pdHRlZChyZmJDbGllbnRQdHIgY2wpOwotdm9pZCBnZXRfcHJvcChjaGFyICpzdHIsIGludCBsZW4sIEF0b20gcHJvcCwgV2luZG93IHcpOwotaW50IGd1ZXNzX2RtX2dvbmUoaW50IHQxLCBpbnQgdDIpOwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX3hldmVudHMoaW50IHJlc2V0KTsKLXN0YXRpYyB2b2lkIHByaW50X3hldmVudF9iYXNlcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ1c3RfZ3JhYihpbnQgcmVzZXQpOwotc3RhdGljIGludCBwcm9jZXNzX3dhdGNoKGNoYXIgKnN0ciwgaW50IHBhcmVudCwgaW50IGRiKTsKLXN0YXRpYyB2b2lkIGdyYWJfYnVzdGVyX3dhdGNoKGludCBwYXJlbnQsIGNoYXIgKmRzdHIpOwotCi0KLXZvaWQgaW5pdGlhbGl6ZV92bmNfY29ubmVjdF9wcm9wKHZvaWQpIHsKLQljaGFyICpwcm9wX3N0cjsKLQl2bmNfY29ubmVjdF9zdHJbMF0gPSAnXDAnOwotCVJBV0ZCX1JFVF9WT0lECi0jaWYgIU5PX1gxMQotCXByb3Bfc3RyID0gZ2V0ZW52KCJWTkNfQ09OTkVDVCIpOwotCWlmIChwcm9wX3N0ciA9PSBOVUxMKSB7Ci0JCXByb3Bfc3RyID0gIlZOQ19DT05ORUNUIjsKLQl9Ci0Jdm5jX2Nvbm5lY3RfcHJvcCA9IFhJbnRlcm5BdG9tKGRweSwgIlZOQ19DT05ORUNUIiwgRmFsc2UpOwotI2VuZGlmCi19Ci0KLXZvaWQgaW5pdGlhbGl6ZV94MTF2bmNfcmVtb3RlX3Byb3Aodm9pZCkgewotCWNoYXIgKnByb3Bfc3RyOwotCXgxMXZuY19yZW1vdGVfc3RyWzBdID0gJ1wwJzsKLQlSQVdGQl9SRVRfVk9JRAotI2lmICFOT19YMTEKLQlwcm9wX3N0ciA9IGdldGVudigiWDExVk5DX1JFTU9URSIpOwotCWlmIChwcm9wX3N0ciA9PSBOVUxMKSB7Ci0JCXByb3Bfc3RyID0gIlgxMVZOQ19SRU1PVEUiOwotCX0KLQl4MTF2bmNfcmVtb3RlX3Byb3AgPSBYSW50ZXJuQXRvbShkcHksIHByb3Bfc3RyLCBGYWxzZSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBpbml0aWFsaXplX2NsaXBib2FyZF9hdG9tKHZvaWQpIHsKLQlSQVdGQl9SRVRfVk9JRAotI2lmIE5PX1gxMQotCXJldHVybjsKLSNlbHNlCi0JY2xpcGJvYXJkX2F0b20gPSBYSW50ZXJuQXRvbShkcHksICJDTElQQk9BUkQiLCBGYWxzZSk7Ci0JaWYgKGNsaXBib2FyZF9hdG9tID09IE5vbmUpIHsKLQkJaWYgKCEgcXVpZXQpIHJmYkxvZygiY291bGQgbm90IGZpbmQgYXRvbSBDTElQQk9BUkRcbiIpOwotCQlpZiAod2F0Y2hfY2xpcGJvYXJkKSB7Ci0JCQl3YXRjaF9jbGlwYm9hcmQgPSAwOwotCQl9Ci0JCWlmIChzZXRfY2xpcGJvYXJkKSB7Ci0JCQlzZXRfY2xpcGJvYXJkID0gMDsKLQkJfQotCX0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotLyoKLSAgICAgIHdlIG9ic2VydmVkIHRoZXNlIHN0cmluZ3M6Ci0KLSAgICAgIDYgZ2RtX3N0cmluZzogR25vbWUtcG93ZXItbWFuYWdlcgotICAgICAgNiBnZG1fc3RyaW5nOiBHbm9tZS1zZXNzaW9uCi0gICAgICA2IGdkbV9zdHJpbmc6IEdub21lLXNldHRpbmdzLWRhZW1vbgotICAgICAgNiBnZG1fc3RyaW5nOiBMb2dpbiBXaW5kb3cKLSAgICAgIDYgZ2RtX3N0cmluZzogTm90aWZ5LW9zZAotICAgICAgNiBnZG1fc3RyaW5nOiBQYW5lbAotICAgICAxMiBnZG1fc3RyaW5nOiBNZXRhY2l0eQotICAgICAxMiBnZG1fc3RyaW5nOiBnbm9tZS1wb3dlci1tYW5hZ2VyCi0gICAgIDEyIGdkbV9zdHJpbmc6IGdub21lLXNlc3Npb24KLSAgICAgMTIgZ2RtX3N0cmluZzogZ25vbWUtc2V0dGluZ3MtZGFlbW9uCi0gICAgIDEyIGdkbV9zdHJpbmc6IG5vdGlmeS1vc2QKLSAgICAgMTggZ2RtX3N0cmluZzogR2RtLXNpbXBsZS1ncmVldGVyCi0gICAgIDI0IGdkbV9zdHJpbmc6IG1ldGFjaXR5Ci0gICAgIDM2IGdkbV9zdHJpbmc6IGdkbS1zaW1wbGUtZ3JlZXRlcgotCi0Ja2RtZ3JlZXQKLQlLZG1ncmVldAotICovCi0KLXN0YXRpYyBpbnQgZG1fc3RyaW5nKGNoYXIgKnN0cikgewotCWNoYXIgKnMgPSBnZXRlbnYoIkRFQlVHX1dNX1JVTk5JTkciKTsKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzdHJbMF0gPT0gJ1wwJykgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKDApIGZwcmludGYoc3RkZXJyLCAiZG1fc3RyaW5nOiAlc1xuIiwgc3RyKTsKLQlpZiAoc3Ryc3RyKHN0ciwgImdkbS0iKSA9PSBzdHIgfHwgc3Ryc3RyKHN0ciwgIkdkbS0iKSA9PSBzdHIpIHsKLQkJaWYgKHN0cnN0cihzdHIsICItZ3JlZXRlciIpICE9IE5VTEwpIHsKLQkJCWlmIChzKSByZmJMb2coImRtX3N0cmluZzogJXNcbiIsIHN0cik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlpZiAoIXN0cmNtcChzdHIsICJrZG1ncmVldCIpIHx8ICFzdHJjbXAoc3RyLCAiS2RtZ3JlZXQiKSkgewotCQlpZiAocykgcmZiTG9nKCJkbV9zdHJpbmc6ICVzXG4iLCBzdHIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG1fc3RpbGxfcnVubmluZyh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JcmV0dXJuIDA7Ci0jZWxzZQotCVdpbmRvdyByLCBwYXJlbnQ7Ci0JV2luZG93ICp3aW5saXN0OwotCXVuc2lnbmVkIGludCBuYzsKLQlpbnQgcmMsIGk7Ci0Jc3RhdGljIFhDbGFzc0hpbnQgKmNsYXNzaGludCA9IE5VTEw7Ci0JWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlcjsKLQlpbnQgc2F3X2dkbV9uYW1lID0gMDsKLQotCS8qIHNvbWUgdGltZXMgYSB3aW5kb3cgY2FuIGdvIGF3YXkgYmVmb3JlIHdlIGdldCB0byBpdCAqLwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCi0JaWYgKCEgY2xhc3NoaW50KSB7Ci0JCWNsYXNzaGludCA9IFhBbGxvY0NsYXNzSGludCgpOwotCX0KLQotCS8qIHdlIGFyZSB4bG9ja2VkLiAqLwotCXJjID0gWFF1ZXJ5VHJlZV93cihkcHksIERlZmF1bHRSb290V2luZG93KGRweSksICZyLCAmcGFyZW50LCAmd2lubGlzdCwgJm5jKTsKLQlpZiAoIXJjIHx8IHdpbmxpc3QgPT0gTlVMTCB8fCBuYyA9PSAwKSB7Ci0JCW5jID0gMDsKLQl9Ci0JZm9yIChpPTA7IGkgPCAoaW50KSBuYzsgaSsrKSB7Ci0JCWNoYXIgKm5hbWUgPSBOVUxMOwotCQlXaW5kb3cgdyA9IHdpbmxpc3RbaV07Ci0JCWlmIChYRmV0Y2hOYW1lKGRweSwgdywgJm5hbWUpICYmIG5hbWUgIT0gTlVMTCkgewotCQkJc2F3X2dkbV9uYW1lICs9IGRtX3N0cmluZyhuYW1lKTsKLQkJCVhGcmVlX3dyKG5hbWUpOwotCQl9Ci0JCWNsYXNzaGludC0+cmVzX25hbWUgPSBOVUxMOwotCQljbGFzc2hpbnQtPnJlc19jbGFzcyA9IE5VTEw7Ci0JCWlmIChYR2V0Q2xhc3NIaW50KGRweSwgdywgY2xhc3NoaW50KSkgewotCQkJbmFtZSA9IGNsYXNzaGludC0+cmVzX25hbWU7Ci0JCQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCQkJc2F3X2dkbV9uYW1lICs9IGRtX3N0cmluZyhuYW1lKTsKLQkJCQlYRnJlZV93cihuYW1lKTsKLQkJCX0KLQkJCW5hbWUgPSBjbGFzc2hpbnQtPnJlc19jbGFzczsKLQkJCWlmIChuYW1lICE9IE5VTEwpIHsKLQkJCQlzYXdfZ2RtX25hbWUgKz0gZG1fc3RyaW5nKG5hbWUpOwotCQkJCVhGcmVlX3dyKG5hbWUpOwotCQkJfQotCQl9Ci0JCWlmIChzYXdfZ2RtX25hbWUgPiAwKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAod2lubGlzdCAhPSBOVUxMKSB7Ci0JCVhGcmVlX3dyKHdpbmxpc3QpOwotCX0KLQotCVhTeW5jKGRweSwgRmFsc2UpOwotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCXJldHVybiBzYXdfZ2RtX25hbWU7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCB3bV9ydW5uaW5nKHZvaWQpIHsKLQljaGFyICpzID0gZ2V0ZW52KCJERUJVR19XTV9SVU5OSU5HIik7Ci0JaW50IHJldCA9IDA7Ci0JUkFXRkJfUkVUKDApCi0jaWYgTk9fWDExCi0JcmV0dXJuIDA7Ci0jZWxzZQotCS8qCi0JICogVW5mb3J0dW5hdGVseSB3aXRoIHJlY2VudCBHRE0gKHYyLjI4KSwgdGhleSBydW4gZ25vbWUtc2Vzc2lvbiwKLQkgKiBkYnVzLWxhdW5jaCwgYW5kIG1ldGFjaXR5IGZvciB0aGUgTG9naW4gZ3JlZXRlciEgIFNvIHRoZSBzaW1wbGUKLQkgKiBYSW50ZXJuQXRvbSBjaGVja3MgYmVsb3cgbm8gbG9uZ2VyIHdvcmsuCi0gICAgICAgICAqIFdlIGFsc28gc2VlIGEgc2ltaWxhciB0aGluZyB3aXRoIEtERS4KLQkgKi8KLQlpZiAoZG1fc3RpbGxfcnVubmluZygpKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIHdlIGFyZSB4bG9ja2VkLiAqLwotCWlmIChYSW50ZXJuQXRvbShkcHksICJfTkVUX1NVUFBPUlRFRCIsIFRydWUpICE9IE5vbmUpIHsKLQkJaWYgKHMpIHJmYkxvZygid20gaXMgcnVubmluZyAoX05FVF9TVVBQT1JURUQpLlxuIik7Ci0JCXJldCsrOwotCX0KLQlpZiAoWEludGVybkF0b20oZHB5LCAiX1dJTl9QUk9UT0NPTFMiLCBUcnVlKSAhPSBOb25lKSB7Ci0JCWlmIChzKSByZmJMb2coIndtIGlzIHJ1bm5pbmcgKF9XSU5fUFJPVE9DT0xTKS5cbiIpOwotCQlyZXQrKzsKLQl9Ci0JaWYgKFhJbnRlcm5BdG9tKGRweSwgIl9YUk9PVFBNQVBfSUQiLCBUcnVlKSAhPSBOb25lKSB7Ci0JCWlmIChzKSByZmJMb2coIndtIGlzIHJ1bm5pbmcgKF9YUk9PVFBNQVBfSUQpLlxuIik7Ci0JCXJldCsrOwotCX0KLQlpZiAoWEludGVybkF0b20oZHB5LCAiX01JVF9QUklPUklUWV9DT0xPUlMiLCBUcnVlKSAhPSBOb25lKSB7Ci0JCWlmIChzKSByZmJMb2coIndtIGlzIHJ1bm5pbmcgKF9NSVRfUFJJT1JJVFlfQ09MT1JTKS5cbiIpOwotCQlyZXQrKzsKLQl9Ci0JaWYgKCFyZXQpIHsKLQkJaWYgKHMpIHJmYkxvZygid20gaXMgbm90IHJ1bm5pbmcuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYgKHMpIHJmYkxvZygid20gaXMgcnVubmluZyByZXQ9JWQuXG4iLCByZXQpOwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi0JCi19Ci0KLWludCBndWVzc19kbV9nb25lKGludCB0MSwgaW50IHQyKSB7Ci0JaW50IHdhaXQgPSB0MjsKLQljaGFyICphdm9pZCA9IGdldGVudigiWDExVk5DX0FWT0lEX1dJTkRPV1MiKTsKLQl0aW1lX3QgdGNoZWNrID0gbGFzdF9jbGllbnQ7Ci0KLQlpZiAobGFzdF9vcGVuX3hkaXNwbGF5ID4gbGFzdF9jbGllbnQpIHsKLQkJLyogYmV0dGVyIHRpbWUgZm9yIC1kaXNwbGF5IFdBSVQ6Li4uICovCi0JCXRjaGVjayA9IGxhc3Rfb3Blbl94ZGlzcGxheTsKLQl9Ci0KLQlpZiAoYXZvaWQgJiYgIXN0cmNtcChhdm9pZCwgIm5ldmVyIikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghc2NyZWVuIHx8ICFzY3JlZW4tPmNsaWVudEhlYWQpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChhdm9pZCkgewotCQlpbnQgbiA9IGF0b2koYXZvaWQpOwotCQlpZiAobiA+IDEpIHsKLQkJCXdhaXQgPSBuOwotCQl9IGVsc2UgewotCQkJd2FpdCA9IDkwOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RhdGljIHRpbWVfdCBzYXdfd20gPSAwOwotCi0JCXdhaXQgPSB0MjsKLQotCQlYX0xPQ0s7Ci0JCWlmICh3bV9ydW5uaW5nKCkpIHsKLQkJCWlmIChzYXdfd20gPT0gMCkgewotCQkJCXNhd193bSA9IHRpbWUoTlVMTCk7Ci0JCQl9IGVsc2UgaWYgKHRpbWUoTlVMTCkgPD0gc2F3X3dtICsgMikgewotCQkJCS8qIHRyeSB0byB3YWl0IGEgZmV3IHNlY29uZHMgYWZ0ZXIgdHJhbnNpdGlvbiAqLwotCQkJCTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2FpdCA9IHQxOwotCQkJfQotCQl9Ci0JCVhfVU5MT0NLOwotCX0KLQlpZiAoZ2V0ZW52KCJERUJVR19XTV9SVU5OSU5HIikpIHsKLQkJcmZiTG9nKCJndWVzc19kbV9nb25lOiB3YWl0PSVkXG4iLCB3YWl0KTsKLQl9Ci0JLyogd2UgYXNzdW1lIHRoZXkndmUgbG9nZ2VkIGluIE9LIGFmdGVyIHdhaXQgc2Vjb25kcy4uLiAqLwotCWlmICh0aW1lKE5VTEwpIDw9IHRjaGVjayArIHdhaXQpICB7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV94ZXZlbnRzKGludCByZXNldCkgewotI2lmIE5PX1gxMQotCVJBV0ZCX1JFVF9WT0lECi0JaWYgKCFyZXNldCkge30KLQlyZXR1cm47Ci0jZWxzZQotCXN0YXRpYyBpbnQgZGlkX3hzZWxlY3RfaW5wdXQgPSAwOwotCXN0YXRpYyBpbnQgZGlkX3hjcmVhdGVfc2ltcGxlX3dpbmRvdyA9IDA7Ci0Jc3RhdGljIGludCBkaWRfdm5jX2Nvbm5lY3RfcHJvcCA9IDA7Ci0Jc3RhdGljIGludCBkaWRfeDExdm5jX3JlbW90ZV9wcm9wID0gMDsKLQlzdGF0aWMgaW50IGRpZF9jbGlwYm9hcmRfYXRvbSA9IDA7Ci0Jc3RhdGljIGludCBkaWRfeGZpeGVzID0gMDsKLQlzdGF0aWMgaW50IGRpZF94ZGFtYWdlID0gMDsKLQlzdGF0aWMgaW50IGRpZF94cmFuZHIgPSAwOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChyZXNldCkgewotCQlkaWRfeHNlbGVjdF9pbnB1dCA9IDA7Ci0JCWRpZF94Y3JlYXRlX3NpbXBsZV93aW5kb3cgPSAwOwotCQlkaWRfdm5jX2Nvbm5lY3RfcHJvcCA9IDA7Ci0JCWRpZF94MTF2bmNfcmVtb3RlX3Byb3AgPSAwOwotCQlkaWRfY2xpcGJvYXJkX2F0b20gPSAwOwotCQlkaWRfeGZpeGVzID0gMDsKLQkJZGlkX3hkYW1hZ2UgPSAwOwotCQlkaWRfeHJhbmRyID0gMDsKLQl9Ci0KLQlpZiAoKHdhdGNoX3NlbGVjdGlvbiB8fCB2bmNfY29ubmVjdCkgJiYgIWRpZF94c2VsZWN0X2lucHV0KSB7Ci0JCS8qCi0JCSAqIHJlZ2lzdGVyIGRlc2lyZWQgZXZlbnQocykgZm9yIG5vdGlmaWNhdGlvbi4KLQkJICogUHJvcGVydHlDaGFuZ2VNYXNrIGlzIGZvciBDVVRfQlVGRkVSMCBjaGFuZ2VzLgotCQkgKiBYWFg6IGRvZXMgdGhpcyBjYXVzZSBhIGZsb29kIG9mIG90aGVyIHN0dWZmPwotCQkgKi8KLQkJWF9MT0NLOwotCQl4c2VsZWN0aW5wdXRfcm9vdHdpbiB8PSBQcm9wZXJ0eUNoYW5nZU1hc2s7Ci0JCVhTZWxlY3RJbnB1dF93cihkcHksIHJvb3R3aW4sIHhzZWxlY3RpbnB1dF9yb290d2luKTsKLQotCQlpZiAoc3Vid2luICYmIGZyZWV6ZV93aGVuX29ic2N1cmVkKSB7Ci0JCQlYU2VsZWN0SW5wdXRfd3IoZHB5LCBzdWJ3aW4sIFZpc2liaWxpdHlDaGFuZ2VNYXNrKTsKLQkJfQotCQlYX1VOTE9DSzsKLQkJZGlkX3hzZWxlY3RfaW5wdXQgPSAxOwotCX0KLQlpZiAod2F0Y2hfc2VsZWN0aW9uICYmICFkaWRfeGNyZWF0ZV9zaW1wbGVfd2luZG93KSB7Ci0JCS8qIGNyZWF0ZSBmYWtlIHdpbmRvdyBmb3Igb3VyIHNlbGVjdGlvbiBvd25lcnNoaXAsIGV0YyAqLwotCi0JCS8qCi0JCSAqIFdlIHRyeSB0byBkZWxheSBjcmVhdGluZyBzZWx3aW4gdW50aWwgd2UgYXJlIHBhc3QKLQkJICogYW55IEdETSwgKG9yIG90aGVyIEtpbGxJbml0Q2xpZW50cz10cnVlKSBtYW5hZ2VyLgotCQkgKi8KLQkJaWYgKGd1ZXNzX2RtX2dvbmUoOCwgNDUpKSB7Ci0JCQlYX0xPQ0s7Ci0JCQlzZWx3aW4gPSBYQ3JlYXRlU2ltcGxlV2luZG93KGRweSwgcm9vdHdpbiwgMywgMiwgMSwgMSwgMCwgMCwgMCk7Ci0JCQlYX1VOTE9DSzsKLQkJCWRpZF94Y3JlYXRlX3NpbXBsZV93aW5kb3cgPSAxOwotCQkJaWYgKCEgcXVpZXQpIHJmYkxvZygiY3JlYXRlZCBzZWx3aW46IDB4JWx4XG4iLCBzZWx3aW4pOwotCQl9Ci0JfQotCi0JaWYgKCh4cmFuZHIgfHwgeHJhbmRyX21heWJlKSAmJiAhZGlkX3hyYW5kcikgewotCQlpbml0aWFsaXplX3hyYW5kcigpOwotCQlkaWRfeHJhbmRyID0gMTsKLQl9Ci0JaWYgKHZuY19jb25uZWN0ICYmICFkaWRfdm5jX2Nvbm5lY3RfcHJvcCkgewotCQlpbml0aWFsaXplX3ZuY19jb25uZWN0X3Byb3AoKTsKLQkJZGlkX3ZuY19jb25uZWN0X3Byb3AgPSAxOwotCX0KLQlpZiAodm5jX2Nvbm5lY3QgJiYgIWRpZF94MTF2bmNfcmVtb3RlX3Byb3ApIHsKLQkJaW5pdGlhbGl6ZV94MTF2bmNfcmVtb3RlX3Byb3AoKTsKLQkJZGlkX3gxMXZuY19yZW1vdGVfcHJvcCA9IDE7Ci0JfQotCWlmIChydW5fZ3VpX3BpZCA+IDApIHsKLQkJa2lsbChydW5fZ3VpX3BpZCwgU0lHVVNSMSk7Ci0JCXJ1bl9ndWlfcGlkID0gMDsKLQl9Ci0JaWYgKCFkaWRfY2xpcGJvYXJkX2F0b20pIHsKLQkJaW5pdGlhbGl6ZV9jbGlwYm9hcmRfYXRvbSgpOwotCQlkaWRfY2xpcGJvYXJkX2F0b20gPSAxOwotCX0KLQlpZiAoeGZpeGVzX3ByZXNlbnQgJiYgdXNlX3hmaXhlcyAmJiAhZGlkX3hmaXhlcykgewotCQkvKgotCQkgKiBXZSB0cnkgdG8gZGVsYXkgY3JlYXRpbmcgaW5pdGlhbGl6aW5nIHhmaXhlcyB1bnRpbAotCQkgKiB3ZSBhcmUgcGFzdCB0aGUgZGlzcGxheSBtYW5hZ2VyLCBkdWUgdG8gWG9yZyBidWc6Ci0JCSAqIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg0NTEKLQkJICovCi0JCWlmIChndWVzc19kbV9nb25lKDgsIDQ1KSkgewotCQkJaW5pdGlhbGl6ZV94Zml4ZXMoKTsKLQkJCWRpZF94Zml4ZXMgPSAxOwotCQkJaWYgKCEgcXVpZXQpIHJmYkxvZygiY2FsbGVkIGluaXRpYWxpemVfeGZpeGVzKClcbiIpOwotCQl9Ci0JfQotCWlmICh4ZGFtYWdlX3ByZXNlbnQgJiYgIWRpZF94ZGFtYWdlKSB7Ci0JCWluaXRpYWxpemVfeGRhbWFnZSgpOwotCQlkaWRfeGRhbWFnZSA9IDE7Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgdm9pZCBwcmludF94ZXZlbnRfYmFzZXModm9pZCkgewotCWZwcmludGYoc3RkZXJyLCAiWCBldmVudCBiYXNlczogeGtiPSVkLCB4dGVzdD0lZCwgeHJhbmRyPSVkLCAiCi0JICAgICJ4Zml4ZXM9JWQsIHhkYW1hZ2U9JWQsIHh0cmFwPSVkXG4iLCB4a2JfYmFzZV9ldmVudF90eXBlLAotCSAgICB4dGVzdF9iYXNlX2V2ZW50X3R5cGUsIHhyYW5kcl9iYXNlX2V2ZW50X3R5cGUsCi0JICAgIHhmaXhlc19iYXNlX2V2ZW50X3R5cGUsIHhkYW1hZ2VfYmFzZV9ldmVudF90eXBlLAotCSAgICB4dHJhcF9iYXNlX2V2ZW50X3R5cGUpOwotCWZwcmludGYoc3RkZXJyLCAiICBNYXBOb3RpZnk9JWQsIENsaWVudE1zZz0lZCBQcm9wTm90aWZ5PSVkICIKLQkgICAgIlNlbE5vdGlmeT0lZCwgU2VsUmVxdWVzdD0lZFxuIiwgTWFwcGluZ05vdGlmeSwgQ2xpZW50TWVzc2FnZSwKLQkgICAgUHJvcGVydHlOb3RpZnksIFNlbGVjdGlvbk5vdGlmeSwgU2VsZWN0aW9uUmVxdWVzdCk7Ci0JZnByaW50ZihzdGRlcnIsICIgIFNlbENsZWFyPSVkLCBFeHBvc2U9JWRcbiIsIFNlbGVjdGlvbkNsZWFyLCBFeHBvc2UpOwotfQotCi12b2lkIGdldF9wcm9wKGNoYXIgKnN0ciwgaW50IGxlbiwgQXRvbSBwcm9wLCBXaW5kb3cgdykgewotCWludCBpOwotI2lmICFOT19YMTEKLQlBdG9tIHR5cGU7Ci0JaW50IGZvcm1hdCwgc2xlbiwgZGxlbjsKLQl1bnNpZ25lZCBsb25nIG5pdGVtcyA9IDAsIGJ5dGVzX2FmdGVyID0gMDsKLQl1bnNpZ25lZCBjaGFyKiBkYXRhID0gTlVMTDsKLSNlbmRpZgotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKLQkJc3RyW2ldID0gJ1wwJzsKLQl9Ci0JaWYgKHByb3AgPT0gTm9uZSkgewotCQlyZXR1cm47Ci0JfQotCi0JUkFXRkJfUkVUX1ZPSUQKLQotI2lmIE5PX1gxMQotCXJldHVybjsKLSNlbHNlCi0KLQlzbGVuID0gMDsKLQlpZiAodyA9PSBOb25lKSB7Ci0JCXcgPSBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpOwotCX0KLQotCWRvIHsKLQkJaWYgKFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIHcsCi0JCSAgICBwcm9wLCBuaXRlbXMvNCwgbGVuLzE2LCBGYWxzZSwKLQkJICAgIEFueVByb3BlcnR5VHlwZSwgJnR5cGUsICZmb3JtYXQsICZuaXRlbXMsICZieXRlc19hZnRlciwKLQkJICAgICZkYXRhKSA9PSBTdWNjZXNzKSB7Ci0KLQkJCWRsZW4gPSBuaXRlbXMgKiAoZm9ybWF0LzgpOwotCQkJaWYgKHNsZW4gKyBkbGVuID4gbGVuKSB7Ci0JCQkJLyogdG9vIGJpZyAqLwotCQkJCVhGcmVlX3dyKGRhdGEpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWVtY3B5KHN0citzbGVuLCBkYXRhLCBkbGVuKTsKLQkJCXNsZW4gKz0gZGxlbjsKLQkJCXN0cltzbGVuXSA9ICdcMCc7Ci0JCQlYRnJlZV93cihkYXRhKTsKLQkJfQotCX0gd2hpbGUgKGJ5dGVzX2FmdGVyID4gMCk7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyB2b2lkIGJ1c3RfZ3JhYihpbnQgcmVzZXQpIHsKLSNpZiBOT19YMTEKLQlpZiAoIXJlc2V0KSB7fQotCXJldHVybjsKLSNlbHNlCi0Jc3RhdGljIGludCBidXN0X2NvdW50ID0gMDsKLQlzdGF0aWMgdGltZV90IGxhc3RfYnVzdCA9IDA7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0JS2V5Q29kZSBrZXk7Ci0JaW50IGJ1dHRvbiwgeCwgeSwgbmI7Ci0KLQlpZiAobm93ID4gbGFzdF9idXN0ICsgMTgwKSB7Ci0JCWJ1c3RfY291bnQgPSAwOwotCX0KLQlpZiAocmVzZXQpIHsKLQkJYnVzdF9jb3VudCA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQl4ID0gMDsKLQl5ID0gMDsKLQlidXR0b24gPSAwOwotCWtleSA9IE5vU3ltYm9sOwotCi0JbmIgPSA4OwotCWlmIChidXN0X2NvdW50ID49IDMgKiBuYikgIHsKLQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBidXN0X2dyYWIncyAlZCBmb3IgbWVcbiIsIGJ1c3RfY291bnQpOwotCQlleGl0KDApOwotCX0KLQlpZiAoYnVzdF9jb3VudCAlIG5iID09IDApIHsKLQkJYnV0dG9uID0gMTsKLQl9IGVsc2UgaWYgKGJ1c3RfY291bnQgJSBuYiA9PSAxKSB7Ci0JCWJ1dHRvbiA9IDE7Ci0JfSBlbHNlIGlmIChidXN0X2NvdW50ICUgbmIgPT0gMikgewotCQlrZXkgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfRXNjYXBlKTsKLQl9IGVsc2UgaWYgKGJ1c3RfY291bnQgJSBuYiA9PSAzKSB7Ci0JCWJ1dHRvbiA9IDM7Ci0JfSBlbHNlIGlmIChidXN0X2NvdW50ICUgbmIgPT0gNCkgewotCQlrZXkgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfc3BhY2UpOwotCX0gZWxzZSBpZiAoYnVzdF9jb3VudCAlIG5iID09IDUpIHsKLQkJeCA9IGJ1c3RfY291bnQgKiAyMzsKLQkJeSA9IGJ1c3RfY291bnQgKiAxNzsKLQl9IGVsc2UgaWYgKGJ1c3RfY291bnQgJSBuYiA9PSA1KSB7Ci0JCWJ1dHRvbiA9IDI7Ci0JfSBlbHNlIGlmIChidXN0X2NvdW50ICUgbmIgPT0gNikgewotCQlrZXkgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfYSk7Ci0JfQotCi0JaWYgKGtleSA9PSBOb1N5bWJvbCkgewotCQlrZXkgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwgWEtfYSk7Ci0JCWlmIChrZXkgPT0gTm9TeW1ib2wpIHsKLQkJCWJ1dHRvbiA9IDE7Ci0JCX0KLQl9Ci0KLQlidXN0X2NvdW50Kys7Ci0KLQlpZiAoYnV0dG9uKSB7Ci0JCS8qIHRyeSBidXR0b24gcHJlc3MrcmVsZWFzZSAqLwotCQlmcHJpbnRmKHN0ZGVyciwgIioqYnVzdF9ncmFiOiBidXR0b24lZCAgJS40ZlxuIiwKLQkJICAgIGJ1dHRvbiwgZG5vd3goKSk7Ci0JCVhUZXN0RmFrZUJ1dHRvbkV2ZW50X3dyKGRweSwgYnV0dG9uLCBUcnVlLCBDdXJyZW50VGltZSk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQl1c2xlZXAoNTAgKiAxMDAwKTsKLQkJWFRlc3RGYWtlQnV0dG9uRXZlbnRfd3IoZHB5LCBidXR0b24sIEZhbHNlLCBDdXJyZW50VGltZSk7Ci0JfSBlbHNlIGlmICh4ID4gMCkgewotCQkvKiB0cnkgYnV0dG9uIG1vdGlvbiovCi0JCWludCBzY3IgPSBEZWZhdWx0U2NyZWVuKGRweSk7Ci0KLQkJZnByaW50ZihzdGRlcnIsICIqKmJ1c3RfZ3JhYjogeD0lZCB5PSVkICAlLjRmXG4iLCB4LCB5LAotCQkgICAgZG5vd3goKSk7Ci0JCVhUZXN0RmFrZU1vdGlvbkV2ZW50X3dyKGRweSwgc2NyLCB4LCB5LCBDdXJyZW50VGltZSk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQl1c2xlZXAoNTAgKiAxMDAwKTsKLQotCQkvKiBmb2xsb3dlZCBieSBidXR0b24gcHJlc3MgKi8KLQkJYnV0dG9uID0gMTsKLQkJZnByaW50ZihzdGRlcnIsICIqKmJ1c3RfZ3JhYjogYnV0dG9uJWRcbiIsIGJ1dHRvbik7Ci0JCVhUZXN0RmFrZUJ1dHRvbkV2ZW50X3dyKGRweSwgYnV0dG9uLCBUcnVlLCBDdXJyZW50VGltZSk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQl1c2xlZXAoNTAgKiAxMDAwKTsKLQkJWFRlc3RGYWtlQnV0dG9uRXZlbnRfd3IoZHB5LCBidXR0b24sIEZhbHNlLCBDdXJyZW50VGltZSk7Ci0JfSBlbHNlIHsKLQkJLyogdHJ5IEVzY2FwZSBvciBTcGFjZSBwcmVzcytyZWxlYXNlICovCi0JCWZwcmludGYoc3RkZXJyLCAiKipidXN0X2dyYWI6IGtleWNvZGU6ICVkICAlLjRmXG4iLAotCQkgICAgKGludCkga2V5LCBkbm93eCgpKTsKLQkJWFRlc3RGYWtlS2V5RXZlbnRfd3IoZHB5LCBrZXksIFRydWUsIEN1cnJlbnRUaW1lKTsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JCXVzbGVlcCg1MCAqIDEwMDApOwotCQlYVGVzdEZha2VLZXlFdmVudF93cihkcHksIGtleSwgRmFsc2UsIEN1cnJlbnRUaW1lKTsKLQl9Ci0JWEZsdXNoX3dyKGRweSk7Ci0JbGFzdF9idXN0ID0gdGltZShOVUxMKTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdHlwZWRlZiBzdHJ1Y3QgX2dyYWJ3YXRjaCB7Ci0JaW50IHBpZDsKLQlpbnQgdGljazsKLQl1bnNpZ25lZCBsb25nIHRpbWU7Ci0JdGltZV90IGNoYW5nZTsKLX0gZ3JhYndhdGNoX3Q7Ci0jZGVmaW5lIEdSQUJXQVRDSCAxNgotCi1zdGF0aWMgaW50IGdyYWJfYnVzdGVyX2RlbGF5ID0gMjA7Ci1zdGF0aWMgcGlkX3QgZ3JhYl9idXN0ZXJfcGlkID0gMDsKLQotc3RhdGljIGludCBncmFiX25waWRzID0gMTsKLQotc3RhdGljIGludCBwcm9jZXNzX3dhdGNoKGNoYXIgKnN0ciwgaW50IHBhcmVudCwgaW50IGRiKSB7Ci0JaW50IGksIHBpZCwgdGlja2VyLCBucGlkczsKLQljaGFyIGRpZmZbMTI4XTsKLQl1bnNpZ25lZCBsb25nIHh0aW1lOwotCXN0YXRpYyBncmFid2F0Y2hfdCB3YXRjaGVzW0dSQUJXQVRDSF07Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2J1c3QgPSAwOwotCWludCB0b29fbG9uZywgcHJvYmxlbXMgPSAwOwotCi0JaWYgKGZpcnN0KSB7Ci0JCWZvciAoaT0wOyBpIDwgR1JBQldBVENIOyBpKyspIHsKLQkJCXdhdGNoZXNbaV0ucGlkID0gMDsKLQkJCXdhdGNoZXNbaV0udGljayA9IDA7Ci0JCQl3YXRjaGVzW2ldLnRpbWUgPSAwOwotCQkJd2F0Y2hlc1tpXS5jaGFuZ2UgPSAwOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQkvKiByZWNvcmQgbGF0ZXN0IHZhbHVlIG9mIHByb3AgKi8KLQlpZiAoc3RyICYmICpzdHIgIT0gJ1wwJykgewotCQlpZiAoc3NjYW5mKHN0ciwgIiVkLyVkLyVsdS8lcyIsICZwaWQsICZ0aWNrZXIsICZ4dGltZSwgZGlmZikKLQkJICAgID09IDQpIHsKLQkJCWludCBnb3QgPSAtMSwgZnJlZSA9IC0xOwotCi0JCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZ3JhYl9idXN0ZXIgJWQgLSAlZCAtICVsdSAtICVzIgotCQkJICAgICJcbiIsIHBpZCwgdGlja2VyLCB4dGltZSwgZGlmZik7Ci0KLQkJCWlmIChwaWQgPT0gcGFyZW50ICYmICFzdHJjbXAoZGlmZiwgIlFVSVQiKSkgewotCQkJCS8qIHRoYXQncyBpdC4gKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChwaWQgPT0gMCB8fCB0aWNrZXIgPT0gMCB8fCB4dGltZSA9PSAwKSB7Ci0JCQkJLyogYmFkIHByb3AgcmVhZC4gKi8KLQkJCQlnb3RvIGJhZHRpY2tlcnN0cjsKLQkJCX0KLQkJCWZvciAoaT0wOyBpIDwgR1JBQldBVENIOyBpKyspIHsKLQkJCQlpZiAod2F0Y2hlc1tpXS5waWQgPT0gcGlkKSB7Ci0JCQkJCWdvdCA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoZnJlZSA9PSAtMSAmJiB3YXRjaGVzW2ldLnBpZCA9PSAwKSB7Ci0JCQkJCWZyZWUgPSBpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChnb3QgPT0gLTEpIHsKLQkJCQlpZiAoZnJlZSA9PSAtMSkgewotCQkJCQkvKiBiYWQgbmV3cyAqLzsKLQkJCQkJZnJlZSA9IEdSQUJXQVRDSCAtIDE7Ci0JCQkJfQotCQkJCXdhdGNoZXNbZnJlZV0ucGlkICA9IHBpZDsKLQkJCQl3YXRjaGVzW2ZyZWVdLnRpY2sgPSB0aWNrZXI7Ci0JCQkJd2F0Y2hlc1tmcmVlXS50aW1lID0geHRpbWU7Ci0JCQkJd2F0Y2hlc1tmcmVlXS5jaGFuZ2UgPSBub3c7Ci0JCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdyYWJfYnVzdGVyIGZyZWUgc2xvdDogJWRcbiIsIGZyZWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiZ3JhYl9idXN0ZXIgZ290ICBzbG90OiAlZFxuIiwgZ290KTsKLQkJCQlpZiAod2F0Y2hlc1tnb3RdLnRpY2sgIT0gdGlja2VyKSB7Ci0JCQkJCXdhdGNoZXNbZ290XS5jaGFuZ2UgPSBub3c7Ci0JCQkJfQotCQkJCWlmICh3YXRjaGVzW2dvdF0udGltZSAhPSB4dGltZSkgewotCQkJCQl3YXRjaGVzW2dvdF0uY2hhbmdlID0gbm93OwotCQkJCX0KLQkJCQl3YXRjaGVzW2dvdF0udGljayA9IHRpY2tlcjsKLQkJCQl3YXRjaGVzW2dvdF0udGltZSA9IHh0aW1lOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdyYWJfYnVzdGVyIGJhZCBwcm9wIHN0cjogJXNcbiIsIHN0cik7Ci0JCX0KLQl9Ci0KLQliYWR0aWNrZXJzdHI6Ci0KLQl0b29fbG9uZyA9IGdyYWJfYnVzdGVyX2RlbGF5OwotCWlmICh0b29fbG9uZyA8IDMgKiBzeW5jX3RvZF9kZWxheSkgewotCQl0b29fbG9uZyA9IDMgKiBzeW5jX3RvZF9kZWxheTsKLQl9Ci0KLQlucGlkcyA9IDA7Ci0JZm9yIChpPTA7IGkgPCBHUkFCV0FUQ0g7IGkrKykgewotCQlpZiAod2F0Y2hlc1tpXS5waWQpIHsKLQkJCW5waWRzKys7Ci0JCX0KLQl9Ci0JZ3JhYl9ucGlkcyA9IG5waWRzOwotCWlmIChucGlkcyA+IDQpIHsKLQkJbnBpZHMgPSA0OwotCX0KLQotCS8qIG5vdyBjaGVjayBldmVyeW9uZSB3ZSBhcmUgdHJhY2tpbmcgKi8KLQlmb3IgKGk9MDsgaSA8IEdSQUJXQVRDSDsgaSsrKSB7Ci0JCWludCBmYWMgPSAxOwotCQlpZiAoIXdhdGNoZXNbaV0ucGlkKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAod2F0Y2hlc1tpXS5jaGFuZ2UgPT0gMCkgewotCQkJd2F0Y2hlc1tpXS5jaGFuZ2UgPSBub3c7CS8qIGp1c3QgdG8gYmUgc3VyZSAqLwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwaWQgPSB3YXRjaGVzW2ldLnBpZDsKLQotCQlpZiAocGlkICE9IHBhcmVudCkgewotCQkJZmFjID0gMjsKLQkJfQotCQlpZiAobnBpZHMgPiAwKSB7Ci0JCQlmYWMgKj0gbnBpZHM7Ci0JCX0KLQotCQlpZiAobm93ID4gd2F0Y2hlc1tpXS5jaGFuZ2UgKyBmYWMqdG9vX2xvbmcpIHsKLQkJCWludCBwcm9jZXNzX2FsaXZlID0gMTsKLQotCQkJZnByaW50ZihzdGRlcnIsICJncmFiX2J1c3RlcjogcHJvYmxlbSB3aXRoIHBpZDogIgotCQkJICAgICIlZCAtICVkLyVkLyVkXG4iLCBwaWQsIChpbnQpIG5vdywKLQkJCSAgICAoaW50KSB3YXRjaGVzW2ldLmNoYW5nZSwgdG9vX2xvbmcpOwotCi0JCQlpZiAoa2lsbCgocGlkX3QpIHBpZCwgMCkgIT0gMCkgewotCQkJCWlmICgxIHx8IGVycm5vID09IEVTUkNIKSB7Ci0JCQkJCXByb2Nlc3NfYWxpdmUgPSAwOwkKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghcHJvY2Vzc19hbGl2ZSkgewotCQkJCXdhdGNoZXNbaV0ucGlkID0gMDsKLQkJCQl3YXRjaGVzW2ldLnRpY2sgPSAwOwotCQkJCXdhdGNoZXNbaV0udGltZSA9IDA7Ci0JCQkJd2F0Y2hlc1tpXS5jaGFuZ2UgPSAwOwotCQkJCWZwcmludGYoc3RkZXJyLCAiZ3JhYl9idXN0ZXI6IHBpZCBnb25lOiAlZFxuIiwKLQkJCQkgICAgcGlkKTsKLQkJCQlpZiAocGlkID09IHBhcmVudCkgewotCQkJCQkvKiB0aGF0J3MgaXQgKi8KLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgc2xlZXAgPSBzeW5jX3RvZF9kZWxheSAqIDEwMDAgKiAxMDAwOwotCi0JCQkJYnVzdF9ncmFiKDApOwotCQkJCXByb2JsZW1zKys7Ci0JCQkJbGFzdF9idXN0ID0gbm93OwotCQkJCXVzbGVlcCgxICogc2xlZXApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFwcm9ibGVtcykgewotCQlidXN0X2dyYWIoMSk7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBncmFiX2J1c3Rlcl93YXRjaChpbnQgcGFyZW50LCBjaGFyICpkc3RyKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlpZiAoIXBhcmVudCB8fCAhZHN0cikge30KLQlyZXR1cm47Ci0jZWxzZQotCUF0b20gdGlja2VyX2F0b20gPSBOb25lOwotCWludCBzbGVlcCA9IHN5bmNfdG9kX2RlbGF5ICogOTIxICogMTAwMDsKLQljaGFyIHByb3B2YWxbMjAwXTsKLQlpbnQgZXYsIGVyLCBtYWosIG1pbjsKLQlpbnQgZGIgPSAwOwotCWNoYXIgKnRpY2tlcl9zdHIgPSAiWDExVk5DX1RJQ0tFUiI7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKGdyYWJfYnVzdGVyID4gMSkgewotCQlkYiA9IDE7Ci0JfQotCi0JLyogb3ZlcndyaXRlIG9yaWdpbmFsIGRweSwgd2UgbGV0IG9yaWcgY29ubmVjdGlvbiBzaXQgdW51c2VkLiAqLwotCWRweSA9IFhPcGVuRGlzcGxheV93cihkc3RyKTsKLQlpZiAoIWRweSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdyYWJfYnVzdGVyX3dhdGNoOiBjb3VsZCBub3QgcmVvcGVuOiAlc1xuIiwKLQkJICAgIGRzdHIpOwotCQlyZXR1cm47Ci0JfQotCXJmYkxvZ0VuYWJsZSgwKTsKLQotCS8qIGNoZWNrIGZvciBYVEVTVCwgZXRjLCBhbmQgdGhlbiBkaXNhYmxlIGdyYWJzIGZvciB1cyAqLwotCWlmICghIFhUZXN0UXVlcnlFeHRlbnNpb25fd3IoZHB5LCAmZXYsICZlciwgJm1haiwgJm1pbikpIHsKLQkJeHRlc3RfcHJlc2VudCA9IDA7Ci0JfSBlbHNlIHsKLQkJeHRlc3RfcHJlc2VudCA9IDE7Ci0JfQotCWlmICghIFhFVHJhcFF1ZXJ5RXh0ZW5zaW9uX3dyKGRweSwgJmV2LCAmZXIsICZtYWopKSB7Ci0JCXh0cmFwX3ByZXNlbnQgPSAwOwotCX0gZWxzZSB7Ci0JCXh0cmFwX3ByZXNlbnQgPSAxOwotCX0KLQotCWlmICghIHh0ZXN0X3ByZXNlbnQgJiYgISB4dHJhcF9wcmVzZW50KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZ3JhYl9idXN0ZXJfd2F0Y2g6IG5vIGdyYWJzZXJ2ZXIgIgotCQkgICAgInByb3RlY3Rpb24gb24gZGlzcGxheTogJXNcbiIsIGRzdHIpOwotCQlyZXR1cm47Ci0JfQotCWRpc2FibGVfZ3JhYnNlcnZlcihkcHksIDApOwotCi0JdXNsZWVwKDMgKiBzbGVlcCk7Ci0KLQlpZiAoZ2V0ZW52KCJYMTFWTkNfVElDS0VSIikpIHsKLQkJdGlja2VyX3N0ciA9IGdldGVudigiWDExVk5DX1RJQ0tFUiIpOwotCX0KLQl0aWNrZXJfYXRvbSA9IFhJbnRlcm5BdG9tKGRweSwgdGlja2VyX3N0ciwgRmFsc2UpOwotCWlmICghIHRpY2tlcl9hdG9tKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZ3JhYl9idXN0ZXJfd2F0Y2g6IG5vIHRpY2tlciBhdG9tXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlKDEpIHsKLQkJaW50IHNscCA9IHNsZWVwOwotCQlpZiAoZ3JhYl9ucGlkcyA+IDEpIHsKLQkJCXNscCA9IHNscCAvIDg7CQotCQl9Ci0JCXVzbGVlcChzbHApOwotCQl1c2xlZXAoKGludCkgKDAuNjAgKiByZmFjKCkgKiBzbHApKTsKLQotCQlpZiAoa2lsbCgocGlkX3QpIHBhcmVudCwgMCkgIT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlnZXRfcHJvcChwcm9wdmFsLCAxMjgsIHRpY2tlcl9hdG9tLCBOb25lKTsKLQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgImdvdF9wcm9wOiAgICVzXG4iLCBwcm9wdmFsKTsKLQotCQlpZiAoIXByb2Nlc3Nfd2F0Y2gocHJvcHZhbCwgcGFyZW50LCBkYikpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIHNwYXduX2dyYWJfYnVzdGVyKHZvaWQpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9GT1JLCi0JcGlkX3QgcGlkOwotCWludCBwYXJlbnQgPSAoaW50KSBnZXRwaWQoKTsKLQljaGFyICpkc3RyID0gc3RyZHVwKERpc3BsYXlTdHJpbmcoZHB5KSk7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JWENsb3NlRGlzcGxheV93cihkcHkpOyAKLQlkcHkgPSBOVUxMOwotCi0JaWYgKChwaWQgPSBmb3JrKCkpID4gMCkgewotCQlncmFiX2J1c3Rlcl9waWQgPSBwaWQ7Ci0JCWlmICghIHF1aWV0KSB7Ci0JCQlyZmJMb2coImdyYWJfYnVzdGVyIHBpZCBpczogJWRcbiIsIChpbnQpIHBpZCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgInNwYXduX2dyYWJfYnVzdGVyOiBjb3VsZCBub3QgZm9ya1xuIik7Ci0JCXJmYkxvZ1BlcnJvcigiZm9yayIpOwotCX0gZWxzZSB7Ci0JCXNpZ25hbChTSUdIVVAsICBTSUdfREZMKTsKLQkJc2lnbmFsKFNJR0lOVCwgIFNJR19ERkwpOwotCQlzaWduYWwoU0lHUVVJVCwgU0lHX0RGTCk7Ci0JCXNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKLQotCQlncmFiX2J1c3Rlcl93YXRjaChwYXJlbnQsIGRzdHIpOwotCQlleGl0KDApOwotCX0KLQotCWRweSA9IFhPcGVuRGlzcGxheV93cihkc3RyKTsKLQlpZiAoIWRweSkgewotCQlyZmJMb2coImZhaWxlZCB0byByZW9wZW4gZGlzcGxheSAlcyBpbiBzcGF3bl9ncmFiX2J1c3RlclxuIiwKLQkJICAgIGRzdHIpOwotCQlleGl0KDEpOwotCX0KLSNlbmRpZgotfQotCi12b2lkIHN5bmNfdG9kX3dpdGhfc2VydmVydGltZSh2b2lkKSB7Ci0jaWYgTk9fWDExCi0JUkFXRkJfUkVUX1ZPSUQKLQlyZXR1cm47Ci0jZWxzZQotCXN0YXRpYyBBdG9tIHRpY2tlcl9hdG9tID0gTm9uZTsKLQlYRXZlbnQgeGV2OwotCWNoYXIgZGlmZlsxMjhdOwotCXN0YXRpYyBpbnQgc2VxID0gMDsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyB4c2VydmVyX3RpY2tzID0gMTsKLQlpbnQgaSwgZGIgPSAwOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCWlmIChhdG9tX05FVF9BQ1RJVkVfV0lORE9XID09IE5vbmUpIHsKLQkJYXRvbV9ORVRfQUNUSVZFX1dJTkRPVyA9IFhJbnRlcm5BdG9tKGRweSwgIl9ORVRfQUNUSVZFX1dJTkRPVyIsIFRydWUpOwotCX0KLQlpZiAoYXRvbV9ORVRfQ1VSUkVOVF9ERVNLVE9QID09IE5vbmUpIHsKLQkJYXRvbV9ORVRfQ1VSUkVOVF9ERVNLVE9QID0gWEludGVybkF0b20oZHB5LCAiX05FVF9DVVJSRU5UX0RFU0tUT1AiLCBUcnVlKTsKLQl9Ci0JaWYgKGF0b21fTkVUX0NMSUVOVF9MSVNUX1NUQUNLSU5HID09IE5vbmUpIHsKLQkJYXRvbV9ORVRfQ0xJRU5UX0xJU1RfU1RBQ0tJTkcgPSBYSW50ZXJuQXRvbShkcHksICJfTkVUX0NMSUVOVF9MSVNUX1NUQUNLSU5HIiwgVHJ1ZSk7Ci0JfQotCWlmIChhdG9tX1hST09UUE1BUF9JRCA9PSBOb25lKSB7Ci0JCWF0b21fWFJPT1RQTUFQX0lEID0gWEludGVybkF0b20oZHB5LCAiX1hST09UUE1BUF9JRCIsIFRydWUpOwotCX0KLQotCWlmICghIHRpY2tlcl9hdG9tKSB7Ci0JCWNoYXIgKnRpY2tlcl9zdHIgPSAiWDExVk5DX1RJQ0tFUiI7Ci0JCWlmIChnZXRlbnYoIlgxMVZOQ19USUNLRVIiKSkgewotCQkJdGlja2VyX3N0ciA9IGdldGVudigiWDExVk5DX1RJQ0tFUiIpOwotCQl9Ci0JCXRpY2tlcl9hdG9tID0gWEludGVybkF0b20oZHB5LCB0aWNrZXJfc3RyLCBGYWxzZSk7Ci0JfQotCWlmICghIHRpY2tlcl9hdG9tKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlYU3luYyhkcHksIEZhbHNlKTsKLQl3aGlsZSAoWENoZWNrVHlwZWRFdmVudChkcHksIFByb3BlcnR5Tm90aWZ5LCAmeGV2KSkgewotCQlzZXRfcHJvcF9hdG9tKHhldi54cHJvcGVydHkuYXRvbSk7Ci0JfQotCi0Jc25wcmludGYoZGlmZiwgMTI4LCAiJWQvJTA4ZC8lbHUvJS42ZiIsIChpbnQpIGdldHBpZCgpLCBzZXErKywKLQkgICAgeHNlcnZlcl90aWNrcywgc2VydmVydGltZV9kaWZmKTsgCi0JWENoYW5nZVByb3BlcnR5KGRweSwgcm9vdHdpbiwgdGlja2VyX2F0b20sIFhBX1NUUklORywgOCwKLQkgICAgUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKSBkaWZmLCBzdHJsZW4oZGlmZikpOwotCVhTeW5jKGRweSwgRmFsc2UpOwotCi0JZm9yIChpPTA7IGkgPCAxMDsgaSsrKSB7Ci0JCWludCBrLCBnb3QgPSAwOwotCQkKLQkJZm9yIChrPTA7IGsgPCA1OyBrKyspIHsKLQkJCXdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgUHJvcGVydHlOb3RpZnksICZ4ZXYpKSB7Ci0JCQkJaWYgKHhldi54cHJvcGVydHkuYXRvbSA9PSB0aWNrZXJfYXRvbSkgewotCQkJCQlkb3VibGUgc3RpbWU7Ci0JCQkJCQotCQkJCQl4c2VydmVyX3RpY2tzID0geGV2Lnhwcm9wZXJ0eS50aW1lOwotCQkJCQlzdGltZSA9IChkb3VibGUpIHhldi54cHJvcGVydHkudGltZTsKLQkJCQkJc3RpbWUgPSBzdGltZS8xMDAwLjA7Ci0JCQkJCXNlcnZlcnRpbWVfZGlmZiA9IGRub3coKSAtIHN0aW1lOwotCQkJCQlpZiAoZGIpIHJmYkxvZygic2V0IHNlcnZlcnRpbWVfZGlmZjogIgotCQkJCQkgICAgIiUuNmZcbiIsIHNlcnZlcnRpbWVfZGlmZik7Ci0JCQkJCWdvdCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChnb3QpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXVzbGVlcCgxMDAwKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgY2hlY2tfa2V5Y29kZV9zdGF0ZSh2b2lkKSB7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2NoZWNrID0gMDsKLQlpbnQgZGVsYXkgPSAxMCwgbm9pbnB1dCA9IDM7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0KLQlpZiAoISBjbGllbnRfY291bnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JLyoKLQkgKiBwZXJpb2RpY2FsbHkgdXBkYXRlIG91ciBtb2RlbCBvZiB0aGUga2V5Y29kZV9zdGF0ZVtdCi0JICogYnkgY29ycmVsYXRpbmcgd2l0aCB0aGUgWHNlcnZlci4gIHdhaXQgZm9yIGEgcGF1c2UgaW4KLQkgKiBrZXlib2FyZCBpbnB1dCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiAgdGhlIGlkZWEgaGVyZQotCSAqIGlzIHRvIHJlbW92ZSBzdGFsZSBrZXljb2RlIHN0YXRlLCBub3QgdG8gYmUgcGVyZmVjdGx5Ci0JICogaW4gc3luYyB3aXRoIHRoZSBYc2VydmVyIGF0IGV2ZXJ5IGluc3RhbnQgb2YgdGltZS4KLQkgKi8KLQlpZiAobm93ID4gbGFzdF9jaGVjayArIGRlbGF5ICYmIG5vdyA+IGxhc3Rfa2V5Ym9hcmRfaW5wdXQgKyBub2lucHV0KSB7Ci0JCVhfTE9DSzsKLQkJaW5pdF90cmFja19rZXljb2RlX3N0YXRlKCk7Ci0JCVhfVU5MT0NLOwotCQlsYXN0X2NoZWNrID0gbm93OwotCX0KLX0KLQotLyoKLSAqIFRvIHVzZSB0aGUgZXhwZXJpbWVudGFsIC1ncmFibG9jYWwgb3B0aW9uIGNvbmZpZ3VyZSBsaWtlIHRoaXM6Ci0gKiBlbnYgQ1BQRkxBR1M9LURFTkFCTEVfR1JBQkxPQ0FMIExERkxBR1M9LWxYc3MgLi9jb25maWd1cmUKLSAqLwotI2lmZGVmIEVOQUJMRV9HUkFCTE9DQUwKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zY3Juc2F2ZXIuaD4KLQotdm9pZCBjaGVja19sb2NhbF9ncmFiKHZvaWQpIHsKLQlzdGF0aWMgZG91YmxlIGxhc3RfY2hlY2sgPSAwLjA7Ci0JZG91YmxlIG5vdzsKLQotCWlmIChncmFiX2xvY2FsIDw9IDApIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBjbGllbnRfY291bnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlpZiAobGFzdF9yZmJfa2V5X2luamVjdGVkIDw9IDAuMCAmJiBsYXN0X3JmYl9wdHJfaW5qZWN0ZWQgPD0gMC4wKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0Jbm93ID0gZG5vdygpOwotCi0JaWYgKG5vdyA+IGxhc3RfY2hlY2sgKyAwLjEpICAgewotI2lmICFOT19YMTEKLQkJaW50IHJldDsKLQkJZG91YmxlIGlkbGU7Ci0JCVhTY3JlZW5TYXZlckluZm8gaW5mbzsKLQkJc3RhdGljIGludCBzYXZlX3ZpZXdvbmx5ID0gLTEsIGxvY2FsX2lzX2lkbGUgPSAtMSwgZGIgPSAtMTsKLQotCQlpZiAoZGVidWdfa2V5Ym9hcmQpIGRiID0gZGVidWdfa2V5Ym9hcmQ7Ci0JCWlmIChkZWJ1Z19wb2ludGVyICkgZGIgPSBkZWJ1Z19wb2ludGVyOwotCi0JCWlmIChkYiA8IDApIHsKLQkJCWlmIChnZXRlbnYoIkxPQ0FMX0dSQUJfREVCVUciKSkgewotCQkJCWRiID0gYXRvaShnZXRlbnYoIkxPQ0FMX0dSQUJfREVCVUciKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRiID0gMDsKLQkJCX0KLQkJfQotCi0JCXJldCA9IFhTY3JlZW5TYXZlclF1ZXJ5SW5mbyhkcHksIFJvb3RXaW5kb3dPZlNjcmVlbigKLQkJICAgIFNjcmVlbk9mRGlzcGxheShkcHksIDApKSwgJmluZm8pOwotCi0JCWlmIChyZXQpIHsKLQkJCWRvdWJsZSB0bGF0ZXN0X3JmYiA9IDAuMDsKLQotCQkJaWRsZSA9ICgoZG91YmxlKSBpbmZvLmlkbGUpLzEwMDAuMDsKLQkJCW5vdyA9IGRub3coKTsKLQotCQkJaWYgKGxhc3RfcmZiX2tleV9pbmplY3RlZCA+IDAuMCkgewotCQkJCXRsYXRlc3RfcmZiID0gbGFzdF9yZmJfa2V5X2luamVjdGVkOwotCQkJfQotCQkJaWYgKGxhc3RfcmZiX3B0cl9pbmplY3RlZCA+IHRsYXRlc3RfcmZiKSB7Ci0JCQkJdGxhdGVzdF9yZmIgPSBsYXN0X3JmYl9wdHJfaW5qZWN0ZWQ7Ci0JCQl9Ci0JCQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgImlkbGU6ICUuNGYgbGF0ZXN0OiAlLjRmIGR0OiAlLjRmXG4iLCBpZGxlLCBub3cgLSB0bGF0ZXN0X3JmYiwgaWRsZSAtIChub3cgLSB0bGF0ZXN0X3JmYikpOwotCi0JCQlpZiAobm93IC0gdGxhdGVzdF9yZmIgPD0gaWRsZSArIDAuMDA1KSB7Ci0JCQkJLyogMC4wMDUgaXMgNW1zIHRvbGVyYW5jZSAqLwotCQkJfSBlbHNlIGlmIChpZGxlIDwgZ3JhYl9sb2NhbCkgewotCQkJCWlmIChsb2NhbF9pc19pZGxlIDwgMCB8fCBsb2NhbF9pc19pZGxlKSB7Ci0JCQkJCXNhdmVfdmlld29ubHkgPSB2aWV3X29ubHk7Ci0JCQkJCXZpZXdfb25seSA9IDE7Ci0JCQkJCWlmIChkYikgewotCQkJCQkJcmZiTG9nKCJjaGVja19sb2NhbF9ncmFiOiBzZXQgdmlld29ubHlcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWxvY2FsX2lzX2lkbGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWxvY2FsX2lzX2lkbGUgJiYgc2F2ZV92aWV3b25seSA+PSAwKSB7Ci0JCQkJCXZpZXdfb25seSA9IHNhdmVfdmlld29ubHk7Ci0JCQkJCWlmIChkYikgewotCQkJCQkJcmZiTG9nKCJjaGVja19sb2NhbF9ncmFiOiByZXN0b3JlZCB2aWV3b25seTsgJWRcbiIsIHZpZXdfb25seSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbG9jYWxfaXNfaWRsZSA9IDE7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlsYXN0X2NoZWNrID0gZG5vdygpOwotCX0KLX0KLSNlbmRpZgotCi12b2lkIGNoZWNrX2F1dG9yZXBlYXQodm9pZCkgewotCXN0YXRpYyB0aW1lX3QgbGFzdF9jaGVjayA9IDA7Ci0Jc3RhdGljIGludCBpZGxlX3RpbWVvdXQgPSAtMzAwLCBpZGxlX3Jlc2V0ID0gMDsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQlpbnQgYXV0b3JlcGVhdF9pc19vbiwgYXV0b3JlcGVhdF9pbml0aWFsbHlfb247Ci0KLQlpZiAoISBub19hdXRvcmVwZWF0IHx8ICEgY2xpZW50X2NvdW50KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG5vdyA8PSBsYXN0X2NoZWNrICsgMSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgcmV0dXJuOwotCi0JaWYgKGlkbGVfdGltZW91dCA8IDApIHsKLQkJaWYgKGdldGVudigiWDExVk5DX0lETEVfVElNRU9VVCIpKSB7Ci0JCQlpZGxlX3RpbWVvdXQgPSBhdG9pKGdldGVudigiWDExVk5DX0lETEVfVElNRU9VVCIpKTsKLQkJfQotCQlpZiAoaWRsZV90aW1lb3V0IDwgMCkgewotCQkJaWRsZV90aW1lb3V0ID0gLWlkbGVfdGltZW91dDsKLQkJfQotCX0KLQotCWxhc3RfY2hlY2sgPSBub3c7Ci0KLQlhdXRvcmVwZWF0X2lzX29uID0gZ2V0X2F1dG9yZXBlYXRfc3RhdGUoKTsKLQlhdXRvcmVwZWF0X2luaXRpYWxseV9vbiA9IGdldF9pbml0aWFsX2F1dG9yZXBlYXRfc3RhdGUoKTsKLQotCWlmICh2aWV3X29ubHkpIHsKLQkJaWYgKCEgYXV0b3JlcGVhdF9pc19vbikgewotCQkJYXV0b3JlcGVhdCgxLCAxKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG5vdyA+IGxhc3Rfa2V5Ym9hcmRfaW5wdXQgKyBpZGxlX3RpbWVvdXQpIHsKLQkJLyogYXV0b3JlcGVhdCBzaG91bGQgYmUgb24gd2hlbiBpZGxlICovCi0JCWlmICghIGF1dG9yZXBlYXRfaXNfb24gJiYgYXV0b3JlcGVhdF9pbml0aWFsbHlfb24pIHsKLQkJCXN0YXRpYyB0aW1lX3QgbGFzdF9tc2cgPSAwOwotCQkJc3RhdGljIGludCBjbnQgPSAwOwotCQkJaWYgKG5vdyA+IGxhc3RfbXNnICsgaWRsZV90aW1lb3V0ICYmIGNudCsrIDwgMTApIHsKLQkJCQlyZmJMb2coImlkbGUga2V5Ym9hcmQ6ICAgdHVybmluZyBYIGF1dG9yZXBlYXQiCi0JCQkJICAgICIgYmFjayBvbi5cbiIpOwotCQkJCWxhc3RfbXNnID0gbm93OwotCQkJfQotCQkJYXV0b3JlcGVhdCgxLCAxKTsKLQkJCWlkbGVfcmVzZXQgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkbGVfcmVzZXQpIHsKLQkJCWludCBpLCBzdGF0ZVsyNTZdLCBkaWRtc2cgPSAwLCBwcmVzc2VkID0gMDsKLQkJCWludCBtd3QgPSA2MDAsIG1tYXggPSAyMDsKLQkJCXN0YXRpYyBpbnQgbXNnY250ID0gMDsKLQkJCXN0YXRpYyBkb3VibGUgbGFzdG1zZyA9IDAuMDsKLQotCQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCQlzdGF0ZVtpXSA9IDA7Ci0JCQl9Ci0JCQlpZiAodXNlX3RocmVhZHMpIHtYX0xPQ0s7fQotCQkJZ2V0X2tleXN0YXRlKHN0YXRlKTsKLQkJCWlmICh1c2VfdGhyZWFkcykge1hfVU5MT0NLO30KLQotCQkJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJCQlpZiAoc3RhdGVbaV0gIT0gMCkgewotCQkJCQkvKiBiZXR0ZXIgd2FpdCB1bnRpbCBhbGwga2V5cyBhcmUgdXAgICovCi0JCQkJCXByZXNzZWQrKzsKLQkJCQkJaWYgKG1zZ2NudCA8IG1tYXggfHwgZG5vdygpID4gbGFzdG1zZyArIG13dCkgewotCQkJCQkJY2hhciAqc3RyID0gInVuc2V0IjsKLSNpZiAhTk9fWDExCi0JCQkJCQlpZiAodXNlX3RocmVhZHMpIHtYX0xPQ0s7fQotCQkJCQkJc3RyID0gWEtleXN5bVRvU3RyaW5nKFhLZXljb2RlVG9LZXlzeW0oZHB5LCBpLCAwKSk7Ci0JCQkJCQlpZiAodXNlX3RocmVhZHMpIHtYX1VOTE9DSzt9Ci0jZW5kaWYKLQkJCQkJCXN0ciA9IHN0ciA/IHN0ciA6ICJub3N5bWJvbCI7Ci0JCQkJCQlkaWRtc2crKzsKLQkJCQkJCXJmYkxvZygiYWN0aXZlIGtleWJvYXJkOiB3YWl0aW5nIHVudGlsICIKLQkJCQkJCSAgICAiYWxsIGtleXMgYXJlIHVwLiBrZXlfZG93bj0lZCAlcy4gICIKLQkJCQkJCSAgICAiSWYgdGhlIGtleSBpcyBpbmFjY2Vzc2libGUgdmlhIGtleWJvYXJkLCAiCi0JCQkJCQkgICAgImNvbnNpZGVyICd4MTF2bmMgLVIgY2xlYXJfYWxsJ1xuIiwgaSwgc3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkaWRtc2cgPiAwKSB7Ci0JCQkJbXNnY250Kys7Ci0JCQkJaWYgKG1zZ2NudCA9PSBtbWF4KSB7Ci0JCQkJCXJmYkxvZygiYWN0aXZlIGtleWJvYXJkOiBsYXN0IHN1Y2ggIgotCQkJCQkgICAgIm1lc3NhZ2UgZm9yICVkIHNlY3MuXG4iLCBtd3QpOwotCQkJCX0KLQkJCQlsYXN0bXNnID0gZG5vdygpOwotCQkJfQotCQkJaWYgKHByZXNzZWQgPiAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChpZGxlX3Jlc2V0KSB7Ci0JCQlzdGF0aWMgdGltZV90IGxhc3RfbXNnID0gMDsKLQkJCXN0YXRpYyBpbnQgY250ID0gMDsKLQkJCWlmIChub3cgPiBsYXN0X21zZyArIGlkbGVfdGltZW91dCAmJiBjbnQrKyA8IDEwKSB7Ci0JCQkJcmZiTG9nKCJhY3RpdmUga2V5Ym9hcmQ6IHR1cm5pbmcgWCBhdXRvcmVwZWF0IgotCQkJCSAgICAiIG9mZi5cbiIpOwotCQkJCWxhc3RfbXNnID0gbm93OwotCQkJfQotCQkJYXV0b3JlcGVhdCgwLCAxKTsKLQkJCWlkbGVfcmVzZXQgPSAwOwotCi0JCX0gZWxzZSBpZiAobm9fcmVwZWF0X2NvdW50ZG93biAmJiBhdXRvcmVwZWF0X2lzX29uKSB7Ci0JCQlpbnQgbiA9IG5vX3JlcGVhdF9jb3VudGRvd24gLSAxOwotCQkJaWYgKG4gPj0gMCkgewotCQkJCXJmYkxvZygiQmF0dGxpbmcgd2l0aCBzb21ldGhpbmcgZm9yICIKLQkJCQkgICAgIi1ub3JlcGVhdCEhICglZCByZXNldHMgbGVmdClcbiIsIG4pOwotCQkJfSBlbHNlIHsKLQkJCQlyZmJMb2coIkJhdHRsaW5nIHdpdGggc29tZXRoaW5nIGZvciAiCi0JCQkJICAgICItbm9yZXBlYXQhIVxuIik7Ci0JCQl9Ci0JCQlpZiAobm9fcmVwZWF0X2NvdW50ZG93biA+IDApIHsKLQkJCQlub19yZXBlYXRfY291bnRkb3duLS07Ci0JCQl9Ci0JCQlhdXRvcmVwZWF0KDEsIDApOwotCQkJYXV0b3JlcGVhdCgwLCAwKTsKLQkJfQotCX0KLX0KLQotdm9pZCBzZXRfcHJvcF9hdG9tKEF0b20gYXRvbSkgewotCWlmIChhdG9tID09IE5vbmUpIHJldHVybjsKLQlpZiAoYXRvbSA9PSBhdG9tX05FVF9BQ1RJVkVfV0lORE9XKSBnb3RfTkVUX0FDVElWRV9XSU5ET1cgPSBkbm93KCk7Ci0JaWYgKGF0b20gPT0gYXRvbV9ORVRfQ1VSUkVOVF9ERVNLVE9QKSBnb3RfTkVUX0NVUlJFTlRfREVTS1RPUCA9IGRub3coKTsKLQlpZiAoYXRvbSA9PSBhdG9tX05FVF9DTElFTlRfTElTVF9TVEFDS0lORykgZ290X05FVF9DTElFTlRfTElTVF9TVEFDS0lORyA9IGRub3coKTsKLQlpZiAoYXRvbSA9PSBhdG9tX1hST09UUE1BUF9JRCkgZ290X1hST09UUE1BUF9JRCA9IGRub3coKTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBwZXJpb2RpY2FsbHkgY2FsbGVkIHRvIGNoZWNrIGZvciBzZWxlY3Rpb24gcmVsYXRlZAotICogYW5kIG90aGVyIFgxMSBldmVudHMgYW5kIHJlc3BvbmQgdG8gdGhlbSBhcyBuZWVkZWQuCi0gKi8KLXZvaWQgY2hlY2tfeGV2ZW50cyhpbnQgcmVzZXQpIHsKLSNpZiBOT19YMTEKLQlSQVdGQl9SRVRfVk9JRAotCWlmICghcmVzZXQpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQlYRXZlbnQgeGV2OwotCWludCB0bXAsIGhhdmVfY2xpZW50cyA9IDA7Ci0Jc3RhdGljIGludCBzZW50X3NvbWVfc2VsID0gMDsKLQlzdGF0aWMgdGltZV90IGxhc3RfY2FsbCA9IDA7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X2JlbGwgPSAwOwotCXN0YXRpYyB0aW1lX3QgbGFzdF9pbml0X2NoZWNrID0gMDsKLQlzdGF0aWMgdGltZV90IGxhc3Rfc3luYyA9IDA7Ci0Jc3RhdGljIHRpbWVfdCBsYXN0X3RpbWVfc3luYyA9IDA7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3JlcXVlc3QgPSAwLjA7Ci0Jc3RhdGljIGRvdWJsZSBsYXN0X3hyZWZyZXNoID0gMC4wOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7Ci0KLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSByZXR1cm47Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKG5vdyA+IGxhc3RfaW5pdF9jaGVjaysxIHx8IHJlc2V0KSB7Ci0JCWxhc3RfaW5pdF9jaGVjayA9IG5vdzsKLQkJaW5pdGlhbGl6ZV94ZXZlbnRzKHJlc2V0KTsKLQkJaWYgKHJlc2V0KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoc2NyZWVuICYmIHNjcmVlbi0+Y2xpZW50SGVhZCkgewotCQloYXZlX2NsaWVudHMgPSAxOwotCX0KLQotCVhfTE9DSzsKLQkvKgotCSAqIFRoZXJlIGlzIGEgYnVnIHdoZXJlIHdlIGhhdmUgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyB0ZXh0IHRvCi0JICogdGhlIGNsaWVudC4uLiBzbyBpbnN0ZWFkIG9mIHNlbmRpbmcgcmlnaHQgYXdheSB3ZSB3YWl0IGEKLQkgKiB0aGUgZmV3IHNlY29uZHMuCi0JICovCi0KLQlpZiAoaGF2ZV9jbGllbnRzICYmIHdhdGNoX3NlbGVjdGlvbiAmJiAhc2VudF9zb21lX3NlbAotCSAgICAmJiBub3cgPiBsYXN0X2NsaWVudCArIHNlbF93YWl0dGltZSkgewotCQlpZiAoWEdldFNlbGVjdGlvbk93bmVyKGRweSwgWEFfUFJJTUFSWSkgPT0gTm9uZSkgewotCQkJY3V0YnVmZmVyX3NlbmQoKTsKLQkJfQotCQlzZW50X3NvbWVfc2VsID0gMTsKLQl9Ci0JaWYgKCEgaGF2ZV9jbGllbnRzKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGRvbid0IGhhdmUgY2xpZW50cyB3ZSBjYW4gbWlzcyB0aGUgWCBzZXJ2ZXIKLQkJICogZ29pbmcgYXdheSB1bnRpbCBhIGNsaWVudCBjb25uZWN0cy4KLQkJICovCi0JCXN0YXRpYyB0aW1lX3QgbGFzdF9YX3BpbmcgPSAwOwotCQlpZiAobm93ID4gbGFzdF9YX3BpbmcgKyA1KSB7Ci0JCQlsYXN0X1hfcGluZyA9IG5vdzsKLQkJCVhHZXRTZWxlY3Rpb25Pd25lcihkcHksIFhBX1BSSU1BUlkpOwotCQl9Ci0JfQotCi0JaWYgKGhhdmVfY2xpZW50cyAmJiB4cmVmcmVzaCA+IDAuMCAmJiBkbm93KCkgPiBsYXN0X3hyZWZyZXNoICsgeHJlZnJlc2gpIHsKLQkJWFNldFdpbmRvd0F0dHJpYnV0ZXMgc3dhOwotCQlWaXN1YWwgdmlzdWFsOwotCQlXaW5kb3cgeHJmOwotCQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLQkJc3dhLm92ZXJyaWRlX3JlZGlyZWN0ID0gVHJ1ZTsKLQkJc3dhLmJhY2tpbmdfc3RvcmUgPSBOb3RVc2VmdWw7Ci0JCXN3YS5zYXZlX3VuZGVyID0gRmFsc2U7Ci0JCXN3YS5iYWNrZ3JvdW5kX3BpeG1hcCA9IE5vbmU7Ci0JCXZpc3VhbC52aXN1YWxpZCA9IENvcHlGcm9tUGFyZW50OwotCQltYXNrID0gKENXT3ZlcnJpZGVSZWRpcmVjdHxDV0JhY2tpbmdTdG9yZXxDV1NhdmVVbmRlcnxDV0JhY2tQaXhtYXApOwotCi0JCXhyZiA9IFhDcmVhdGVXaW5kb3coZHB5LCB3aW5kb3csIGNvZmZfeCwgY29mZl95LCBkcHlfeCwgZHB5X3ksIDAsIENvcHlGcm9tUGFyZW50LAotCQkgICAgSW5wdXRPdXRwdXQsICZ2aXN1YWwsIG1hc2ssICZzd2EpOwotCQlpZiAoeHJmICE9IE5vbmUpIHsKLQkJCWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coJWQsICVkLCAlZCwgJWQpIDB4JWx4XG4iLCBjb2ZmX3gsIGNvZmZfeSwgZHB5X3gsIGRweV95LCB4cmYpOwotCQkJWE1hcFdpbmRvdyhkcHksIHhyZik7Ci0JCQlYRmx1c2hfd3IoZHB5KTsKLQkJCVhEZXN0cm95V2luZG93KGRweSwgeHJmKTsKLQkJCVhGbHVzaF93cihkcHkpOwotCQl9Ci0JCWxhc3RfeHJlZnJlc2ggPSBkbm93KCk7Ci0JfQotCi0JaWYgKG5vdyA+IGxhc3RfY2FsbCsxKSB7Ci0JCS8qIHdlIG9ubHkgY2hlY2sgdGhlc2Ugb25jZSBhIHNlY29uZCBvciBzby4gKi8KLQkJaW50IG4gPSAwOwotCi0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQotCQl3aGlsZSAoWENoZWNrVHlwZWRFdmVudChkcHksIE1hcHBpbmdOb3RpZnksICZ4ZXYpKSB7Ci0JCQlYUmVmcmVzaEtleWJvYXJkTWFwcGluZygoWE1hcHBpbmdFdmVudCAqKSAmeGV2KTsKLQkJCW4rKzsKLQkJfQotCQlpZiAobiAmJiB1c2VfbW9kaWZpZXJfdHdlYWspIHsKLQkJCVhfVU5MT0NLOwotCQkJaW5pdGlhbGl6ZV9tb2R0d2VhaygpOwotCQkJWF9MT0NLOwotCQl9Ci0JCWlmICh4dHJhcF9iYXNlX2V2ZW50X3R5cGUpIHsKLQkJCWludCBiYXNlID0geHRyYXBfYmFzZV9ldmVudF90eXBlOwotCQkJd2hpbGUgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBiYXNlLCAmeGV2KSkgewotCQkJCTsKLQkJCX0KLQkJfQotCQlpZiAoeHRlc3RfYmFzZV9ldmVudF90eXBlKSB7Ci0JCQlpbnQgYmFzZSA9IHh0ZXN0X2Jhc2VfZXZlbnRfdHlwZTsKLQkJCXdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgYmFzZSwgJnhldikpIHsKLQkJCQk7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogd2UgY2FuIGdldCBDbGllbnRNZXNzYWdlIGZyb20gb3VyIFhTZW5kRXZlbnQoKSBjYWxsIGluIAotCQkgKiBzZWxlY3Rpb25fcmVxdWVzdCgpLgotCQkgKi8KLQkJd2hpbGUgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBDbGllbnRNZXNzYWdlLCAmeGV2KSkgewotCQkJOwotCQl9Ci0KLQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJbGFzdF9jYWxsID0gbm93OwotCX0KLQotCWlmIChmcmVlemVfd2hlbl9vYnNjdXJlZCkgewotCQlpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIFZpc2liaWxpdHlOb3RpZnksICZ4ZXYpKSB7Ci0JCQlpZiAoeGV2LnR5cGUgPT0gVmlzaWJpbGl0eU5vdGlmeSAmJiB4ZXYueGFueS53aW5kb3cgPT0gc3Vid2luKSB7Ci0JCQkJaW50IHByZXYgPSBzdWJ3aW5fb2JzY3VyZWQ7Ci0JCQkJaWYgKHhldi54dmlzaWJpbGl0eS5zdGF0ZSA9PSBWaXNpYmlsaXR5VW5vYnNjdXJlZCkgewotCQkJCQlzdWJ3aW5fb2JzY3VyZWQgPSAwOwotCQkJCX0gZWxzZSBpZiAoeGV2Lnh2aXNpYmlsaXR5LnN0YXRlID09IFZpc2liaWxpdHlQYXJ0aWFsbHlPYnNjdXJlZCkgewotCQkJCQlzdWJ3aW5fb2JzY3VyZWQgPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1Yndpbl9vYnNjdXJlZCA9IDI7Ci0JCQkJfQotCQkJCXJmYkxvZygic3Vid2luX29ic2N1cmVkOiAlZCAtPiAlZFxuIiwgcHJldiwgc3Vid2luX29ic2N1cmVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGNoZWNrIGZvciBDVVRfQlVGRkVSMCwgVk5DX0NPTk5FQ1QsIFgxMVZOQ19SRU1PVEUgY2hhbmdlczogKi8KLQlpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIFByb3BlcnR5Tm90aWZ5LCAmeGV2KSkgewotCQlpbnQgZ290X2N1dGJ1ZmZlciA9IDA7Ci0JCWludCBnb3Rfdm5jX2Nvbm5lY3QgPSAwOwotCQlpbnQgZ290X3gxMXZuY19yZW1vdGUgPSAwOwotCQlzdGF0aWMgaW50IHByb3BfZGJnID0gLTE7Ci0KLQkJLyogdG8gYXZvaWQgcGlsaW5nIHVwIGJldHdlZW4gY2FsbHMsIHJlYWQgYWxsIFByb3BlcnR5Tm90aWZ5IG5vdyAqLwotCQlkbyB7Ci0JCQlpZiAoeGV2LnR5cGUgPT0gUHJvcGVydHlOb3RpZnkpIHsKLQkJCQlpZiAoeGV2Lnhwcm9wZXJ0eS5hdG9tID09IFhBX0NVVF9CVUZGRVIwKSB7Ci0JCQkJCWdvdF9jdXRidWZmZXIrKzsKLQkJCQl9IGVsc2UgaWYgKHZuY19jb25uZWN0ICYmIHZuY19jb25uZWN0X3Byb3AgIT0gTm9uZQotCQkJCSAgICAmJiB4ZXYueHByb3BlcnR5LmF0b20gPT0gdm5jX2Nvbm5lY3RfcHJvcCkgewotCQkJCQlnb3Rfdm5jX2Nvbm5lY3QrKzsKLQkJCQl9IGVsc2UgaWYgKHZuY19jb25uZWN0ICYmIHgxMXZuY19yZW1vdGVfcHJvcCAhPSBOb25lCi0JCQkJICAgICYmIHhldi54cHJvcGVydHkuYXRvbSA9PSB4MTF2bmNfcmVtb3RlX3Byb3ApIHsKLQkJCQkJZ290X3gxMXZuY19yZW1vdGUrKzsKLQkJCQl9Ci0JCQkJc2V0X3Byb3BfYXRvbSh4ZXYueHByb3BlcnR5LmF0b20pOwotCQkJfQotCQl9IHdoaWxlIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgUHJvcGVydHlOb3RpZnksICZ4ZXYpKTsKLQotCQlpZiAocHJvcF9kYmcgPCAwKSB7Ci0JCQlwcm9wX2RiZyA9IDA7Ci0JCQlpZiAoZ2V0ZW52KCJQUk9QX0RCRyIpKSB7Ci0JCQkJcHJvcF9kYmcgPSAxOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BfZGJnICYmIChnb3RfY3V0YnVmZmVyID4gMSB8fCBnb3Rfdm5jX2Nvbm5lY3QgPiAxIHx8IGdvdF94MTF2bmNfcmVtb3RlID4gMSkpIHsKLQkJCXN0YXRpYyBkb3VibGUgbGFzdG1zZyA9IDAuMDsKLQkJCXN0YXRpYyBpbnQgY291bnQgPSAwOwotCQkJZG91YmxlIG5vdyA9IGRub3coKTsKLQotCQkJaWYgKDEgJiYgbm93ID4gbGFzdG1zZyArIDMwMC4wKSB7Ci0JCQkJaWYgKGdvdF9jdXRidWZmZXIgPiAxKSB7Ci0JCQkJCXJmYkxvZygiY2hlY2tfeGV2ZW50czogd2FybmluZzogJWQgY3V0YnVmZmVyIGV2ZW50cyBzaW5jZSBsYXN0IGNoZWNrLlxuIiwgZ290X2N1dGJ1ZmZlcik7Ci0JCQkJfQotCQkJCWlmIChnb3Rfdm5jX2Nvbm5lY3QgPiAxKSB7Ci0JCQkJCXJmYkxvZygiY2hlY2tfeGV2ZW50czogd2FybmluZzogJWQgdm5jX2Nvbm5lY3QgZXZlbnRzIHNpbmNlIGxhc3QgY2hlY2suXG4iLCBnb3Rfdm5jX2Nvbm5lY3QpOwotCQkJCX0KLQkJCQlpZiAoZ290X3gxMXZuY19yZW1vdGUgPiAxKSB7Ci0JCQkJCXJmYkxvZygiY2hlY2tfeGV2ZW50czogd2FybmluZzogJWQgeDExdm5jX3JlbW90ZSBldmVudHMgc2luY2UgbGFzdCBjaGVjay5cbiIsIGdvdF94MTF2bmNfcmVtb3RlKTsKLQkJCQl9Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPj0gMykgewotCQkJCQlsYXN0bXNnID0gbm93OwotCQkJCQljb3VudCA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGdvdF9jdXRidWZmZXIpICB7Ci0JCQkvKgotCQkJICogR28gcmV0cmlldmUgQ1VUX0JVRkZFUjAgYW5kIHNlbmQgaXQuCi0JCQkgKgotCQkJICogc2V0X2N1dGJ1ZmZlciBpcyBhIGZsYWcgdG8gdHJ5IHRvIGF2b2lkCi0JCQkgKiBwcm9jZXNzaW5nIG91ciBvd24gY3V0YnVmZmVyIGNoYW5nZXMuCi0JCQkgKi8KLQkJCWlmIChoYXZlX2NsaWVudHMgJiYgd2F0Y2hfc2VsZWN0aW9uICYmICFzZXRfY3V0YnVmZmVyKSB7Ci0JCQkJY3V0YnVmZmVyX3NlbmQoKTsKLQkJCQlzZW50X3NvbWVfc2VsID0gMTsKLQkJCX0KLQkJCXNldF9jdXRidWZmZXIgPSAwOwotCQl9IAotCQlpZiAoZ290X3ZuY19jb25uZWN0KSB7Ci0JCQkvKgotCQkJICogR28gcmV0cmlldmUgVk5DX0NPTk5FQ1Qgc3RyaW5nLgotCQkJICovCi0JCQlyZWFkX3ZuY19jb25uZWN0X3Byb3AoMCk7Ci0JCX0gCi0JCWlmIChnb3RfeDExdm5jX3JlbW90ZSkgewotCQkJLyoKLQkJCSAqIEdvIHJldHJpZXZlIFgxMVZOQ19SRU1PVEUgc3RyaW5nLgotCQkJICovCi0JCQlyZWFkX3gxMXZuY19yZW1vdGVfcHJvcCgwKTsKLQkJfQotCX0KLQotCS8qIGRvIHRoaXMgbm93IHRoYXQgd2UgaGF2ZSBqdXN0IGNsZWFyZWQgUHJvcGVydHlOb3RpZnkgKi8KLQl0bXAgPSAwOwotCWlmIChyZmFjKCkgPCAwLjYpIHsKLQkJdG1wID0gMTsKLQl9Ci0JaWYgKG5vdyA+IGxhc3RfdGltZV9zeW5jICsgc3luY190b2RfZGVsYXkgKyB0bXApIHsKLQkJc3luY190b2Rfd2l0aF9zZXJ2ZXJ0aW1lKCk7Ci0JCWxhc3RfdGltZV9zeW5jID0gbm93OwotCX0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhSQU5EUgotCWlmICh4cmFuZHIgfHwgeHJhbmRyX21heWJlKSB7Ci0JCWNoZWNrX3hyYW5kcl9ldmVudCgiY2hlY2tfeGV2ZW50cyIpOwotCX0KLSNlbmRpZgotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhGSVhFUwotCWlmICh4Zml4ZXNfcHJlc2VudCAmJiB1c2VfeGZpeGVzICYmIHhmaXhlc19maXJzdF9pbml0aWFsaXplZCAmJiB4Zml4ZXNfYmFzZV9ldmVudF90eXBlKSB7Ci0JCWlmIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgeGZpeGVzX2Jhc2VfZXZlbnRfdHlwZSArCi0JCSAgICBYRml4ZXNDdXJzb3JOb3RpZnksICZ4ZXYpKSB7Ci0JCQlnb3RfeGZpeGVzX2N1cnNvcl9ub3RpZnkrKzsKLQkJfQotCX0KLSNlbmRpZgotCi0JLyogY2hlY2sgZm9yIG91ciBQUklNQVJZIHJlcXVlc3Qgbm90aWZpY2F0aW9uOiAqLwotCWlmICh3YXRjaF9wcmltYXJ5IHx8IHdhdGNoX2NsaXBib2FyZCkgewotCQlpbnQgZG9wcmltYXJ5ID0gMSwgZG9jbGlwYm9hcmQgPSAyLCB3aGljaCwgb3duID0gMDsKLQkJZG91YmxlIGRlbGF5ID0gMS4wOwotCQlBdG9tIGF0b207Ci0JCWNoYXIgKnJlcTsKLQotCQlpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIFNlbGVjdGlvbk5vdGlmeSwgJnhldikpIHsKLQkJCWlmICh4ZXYudHlwZSA9PSBTZWxlY3Rpb25Ob3RpZnkgJiYKLQkJCSAgICB4ZXYueHNlbGVjdGlvbi5yZXF1ZXN0b3IgPT0gc2Vsd2luICYmCi0JCQkgICAgeGV2LnhzZWxlY3Rpb24ucHJvcGVydHkgIT0gTm9uZSAmJgotCQkJICAgIHhldi54c2VsZWN0aW9uLnRhcmdldCA9PSBYQV9TVFJJTkcpIHsKLQkJCQlBdG9tIHMgPSB4ZXYueHNlbGVjdGlvbi5zZWxlY3Rpb247Ci0JCQkgICAgICAgIGlmIChzID09IFhBX1BSSU1BUlkgfHwgcyA9PSBjbGlwYm9hcmRfYXRvbSkgewotCQkJCQkvKiBnbyByZXRyaWV2ZSBpdCBhbmQgY2hlY2sgaXQgKi8KLQkJCQkJaWYgKG5vdyA+IGxhc3RfY2xpZW50ICsgc2VsX3dhaXR0aW1lCi0JCQkJCSAgICB8fCBzZW50X3NvbWVfc2VsKSB7Ci0JCQkJCQlzZWxlY3Rpb25fc2VuZCgmeGV2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvKgotCQkgKiBFdmVyeSBzZWNvbmQgb3Igc28sIHJlcXVlc3QgUFJJTUFSWSBvciBDTElQQk9BUkQsCi0JCSAqIHVubGVzcyB3ZSBhbHJlYWR5IG93biBpdCBvciB0aGVyZSBpcyBubyBvd25lciBvciB3ZQotCQkgKiBoYXZlIG5vIGNsaWVudHMuIAotCQkgKiBUT0RPOiBldmVuIGF0IHRoaXMgbG93IHJhdGUgd2Ugc2hvdWxkIGxvb2sgaW50bwotCQkgKiBhbmQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgaW4gb2RkcyBjYXNlcyAobGFyZ2UgdGV4dCwKLQkJICogbW9kZW0sIGV0Yy4pCi0JCSAqLwotCQl3aGljaCA9IDA7Ci0JCWlmICh3YXRjaF9wcmltYXJ5ICYmIHdhdGNoX2NsaXBib2FyZCAmJiAhIG93bl9jbGlwYm9hcmQgJiYKLQkJICAgICEgb3duX3ByaW1hcnkpIHsKLQkJCWRlbGF5ID0gMC42OwotCQl9Ci0JCWlmIChkbm93KCkgPiBsYXN0X3JlcXVlc3QgKyBkZWxheSkgewotCQkJLyoKLQkJCSAqIEl0IGlzIG5vdCBhIGdvb2QgaWRlYSB0byBkbyBib3RoIGF0IHRoZSBzYW1lCi0JCQkgKiB0aW1lIHNvIHdlIG11c3QgY2hvb3NlIG9uZToKLQkJCSAqLwotCQkJaWYgKHdhdGNoX3ByaW1hcnkgJiYgd2F0Y2hfY2xpcGJvYXJkKSB7Ci0JCQkJc3RhdGljIGludCBjb3VudCA9IDA7Ci0JCQkJaWYgKG93bl9jbGlwYm9hcmQpIHsKLQkJCQkJd2hpY2ggPSBkb3ByaW1hcnk7Ci0JCQkJfSBlbHNlIGlmIChvd25fcHJpbWFyeSkgewotCQkJCQl3aGljaCA9IGRvY2xpcGJvYXJkOwotCQkJCX0gZWxzZSBpZiAoY291bnQrKyAlIDMgPT0gMCkgewotCQkJCQl3aGljaCA9IGRvY2xpcGJvYXJkOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdoaWNoID0gZG9wcmltYXJ5OwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2F0Y2hfcHJpbWFyeSkgewotCQkJCXdoaWNoID0gZG9wcmltYXJ5OwotCQkJfSBlbHNlIGlmICh3YXRjaF9jbGlwYm9hcmQpIHsKLQkJCQl3aGljaCA9IGRvY2xpcGJvYXJkOwotCQkJfQotCQkJbGFzdF9yZXF1ZXN0ID0gZG5vdygpOwotCQl9Ci0JCWF0b20gPSBOb25lOwotCQlyZXEgPSAibm9uZSI7Ci0JCWlmICh3aGljaCA9PSBkb3ByaW1hcnkpIHsKLQkJCW93biA9IG93bl9wcmltYXJ5OwotCQkJYXRvbSA9IFhBX1BSSU1BUlk7Ci0JCQlyZXEgPSAiUFJJTUFSWSI7Ci0JCX0gZWxzZSBpZiAod2hpY2ggPT0gZG9jbGlwYm9hcmQpIHsKLQkJCW93biA9IG93bl9jbGlwYm9hcmQ7Ci0JCQlhdG9tID0gY2xpcGJvYXJkX2F0b207Ci0JCQlyZXEgPSAiQ0xJUEJPQVJEIjsKLQkJfQotCQlpZiAod2hpY2ggIT0gMCAmJiAhIG93biAmJiBoYXZlX2NsaWVudHMgJiYKLQkJICAgIFhHZXRTZWxlY3Rpb25Pd25lcihkcHksIGF0b20pICE9IE5vbmUgJiYgc2Vsd2luICE9IE5vbmUpIHsKLQkJCVhDb252ZXJ0U2VsZWN0aW9uKGRweSwgYXRvbSwgWEFfU1RSSU5HLCBYQV9TVFJJTkcsCi0JCQkgICAgc2Vsd2luLCBDdXJyZW50VGltZSk7Ci0JCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQkJcmZiTG9nKCJyZXF1ZXN0ICVzXG4iLCByZXEpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG93bl9wcmltYXJ5IHx8IG93bl9jbGlwYm9hcmQpIHsKLQkJLyogd2Ugb3duIFBSSU1BUlkgb3IgQ0xJUEJPQVJELCBzZWUgaWYgc29tZW9uZSByZXF1ZXN0ZWQgaXQ6ICovCi0JCXRyYXBwZWRfeGVycm9yID0gMDsKLQkJb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHRyYXBfeGVycm9yKTsKLQotCQlpZiAoWENoZWNrVHlwZWRFdmVudChkcHksIFNlbGVjdGlvblJlcXVlc3QsICZ4ZXYpKSB7Ci0JCQlpZiAob3duX3ByaW1hcnkgJiYgeGV2LnR5cGUgPT0gU2VsZWN0aW9uUmVxdWVzdCAmJgotCQkJICAgIHhldi54c2VsZWN0aW9ucmVxdWVzdC5zZWxlY3Rpb24gPT0gWEFfUFJJTUFSWSkgewotCQkJCXNlbGVjdGlvbl9yZXF1ZXN0KCZ4ZXYsICJQUklNQVJZIik7Ci0JCQl9Ci0JCQlpZiAob3duX2NsaXBib2FyZCAmJiB4ZXYudHlwZSA9PSBTZWxlY3Rpb25SZXF1ZXN0ICYmCi0JCQkgICAgeGV2LnhzZWxlY3Rpb25yZXF1ZXN0LnNlbGVjdGlvbiA9PSBjbGlwYm9hcmRfYXRvbSkgewotCQkJCXNlbGVjdGlvbl9yZXF1ZXN0KCZ4ZXYsICJDTElQQk9BUkQiKTsKLQkJCX0KLQkJfQotCi0JCS8qIHdlIG93biBQUklNQVJZIG9yIENMSVBCT0FSRCwgc2VlIGlmIHdlIG5vIGxvbmdlciBvd24gaXQ6ICovCi0JCWlmIChYQ2hlY2tUeXBlZEV2ZW50KGRweSwgU2VsZWN0aW9uQ2xlYXIsICZ4ZXYpKSB7Ci0JCQlpZiAob3duX3ByaW1hcnkgJiYgeGV2LnR5cGUgPT0gU2VsZWN0aW9uQ2xlYXIgJiYKLQkJCSAgICB4ZXYueHNlbGVjdGlvbmNsZWFyLnNlbGVjdGlvbiA9PSBYQV9QUklNQVJZKSB7Ci0JCQkJb3duX3ByaW1hcnkgPSAwOwotCQkJCWlmICh4Y3V0X3N0cl9wcmltYXJ5KSB7Ci0JCQkJCWZyZWUoeGN1dF9zdHJfcHJpbWFyeSk7Ci0JCQkJCXhjdXRfc3RyX3ByaW1hcnkgPSBOVUxMOwotCQkJCX0KLQkJCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQkJCXJmYkxvZygiUmVsZWFzZWQgUFJJTUFSWS5cbiIpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvd25fY2xpcGJvYXJkICYmIHhldi50eXBlID09IFNlbGVjdGlvbkNsZWFyICYmCi0JCQkgICAgeGV2LnhzZWxlY3Rpb25jbGVhci5zZWxlY3Rpb24gPT0gY2xpcGJvYXJkX2F0b20pIHsKLQkJCQlvd25fY2xpcGJvYXJkID0gMDsKLQkJCQlpZiAoeGN1dF9zdHJfY2xpcGJvYXJkKSB7Ci0JCQkJCWZyZWUoeGN1dF9zdHJfY2xpcGJvYXJkKTsKLQkJCQkJeGN1dF9zdHJfY2xpcGJvYXJkID0gTlVMTDsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnX3NlbCkgewotCQkJCQlyZmJMb2coIlJlbGVhc2VkIENMSVBCT0FSRC5cbiIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQl0cmFwcGVkX3hlcnJvciA9IDA7Ci0JfQotCi0JaWYgKHdhdGNoX2JlbGwgfHwgbm93ID4gbGFzdF9iZWxsKzEpIHsKLQkJbGFzdF9iZWxsID0gbm93OwotCQljaGVja19iZWxsX2V2ZW50KCk7Ci0JfQotCWlmICh0cmF5X3JlcXVlc3QgIT0gTm9uZSkgewotCQlzdGF0aWMgdGltZV90IGxhc3RfdHJheV9yZXF1ZXN0ID0gMDsKLQkJaWYgKG5vdyA+IGxhc3RfdHJheV9yZXF1ZXN0ICsgMikgewotCQkJbGFzdF90cmF5X3JlcXVlc3QgPSBub3c7Ci0JCQlpZiAodHJheV9lbWJlZCh0cmF5X3JlcXVlc3QsIHRyYXlfdW5lbWJlZCkpIHsKLQkJCQl0cmF5X3dpbmRvdyA9IHRyYXlfcmVxdWVzdDsKLQkJCQl0cmF5X3JlcXVlc3QgPSBOb25lOwotCQkJfQotCQl9Ci0JfQotCi0jaWZuZGVmIERFQlVHX1hFVkVOVFMKLSNkZWZpbmUgREVCVUdfWEVWRU5UUyAxCi0jZW5kaWYKLSNpZiBERUJVR19YRVZFTlRTCi0JaWYgKGRlYnVnX3hldmVudHMpIHsKLQkJc3RhdGljIHRpbWVfdCBsYXN0X2NoZWNrID0gMDsKLQkJc3RhdGljIHRpbWVfdCByZW1pbmRlciA9IDA7Ci0JCXN0YXRpYyBpbnQgZnJlcSA9IDA7Ci0KLQkJaWYgKCEgZnJlcSkgewotCQkJaWYgKGdldGVudigiWDExVk5DX1JFTUlOREVSX1JBVEUiKSkgewotCQkJCWZyZXEgPSBhdG9pKGdldGVudigiWDExVk5DX1JFTUlOREVSX1JBVEUiKSk7Ci0JCQl9IGVsc2UgewotCQkJCWZyZXEgPSAzMDA7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm93ID4gbGFzdF9jaGVjayArIDEpIHsKLQkJCWludCBldl90eXBlX21heCA9IDMwMCwgZXZfc2l6ZSA9IDQwMDsKLQkJCVhFdmVudCB4ZXZzWzQwMF07Ci0JCQlpbnQgaSwgdG90ID0gWEV2ZW50c1F1ZXVlZChkcHksIFF1ZXVlZEFscmVhZHkpOwotCi0JCQlpZiAocmVtaW5kZXIgPT0gMCB8fCAodG90ICYmIG5vdyA+IHJlbWluZGVyICsgZnJlcSkpIHsKLQkJCQlwcmludF94ZXZlbnRfYmFzZXMoKTsKLQkJCQlyZW1pbmRlciA9IG5vdzsKLQkJCX0KLQkJCWxhc3RfY2hlY2sgPSBub3c7Ci0KLQkJCWlmICh0b3QpIHsKLQkJICAgIAkJZnByaW50ZihzdGRlcnIsICJUb3RhbCBldmVudHMgcXVldWVkOiAlZFxuIiwKLQkJCQkgICAgdG90KTsKLQkJCX0KLQkJCWZvciAoaT0xOyBpPGV2X3R5cGVfbWF4OyBpKyspIHsKLQkJCQlpbnQgaywgbiA9IDA7Ci0JCQkJd2hpbGUgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBpLCB4ZXZzK24pKSB7Ci0JCQkJCWlmICgrK24gPj0gZXZfc2l6ZSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG4pIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIgICVkJXMgZXZlbnRzIG9mIHR5cGUiCi0JCQkJCSAgICAiICVkIHF1ZXVlZFxuIiwgbiwKLQkJCQkJICAgIChuID49IGV2X3NpemUpID8gIisiIDogIiIsIGkpOwotCQkJCX0KLQkJCQlmb3IgKGs9bi0xOyBrID49IDA7IGstLSkgewotCQkJCQlYUHV0QmFja0V2ZW50KGRweSwgeGV2cytrKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmIChub3cgPiBsYXN0X3N5bmMgKyAxMjAwKSB7Ci0JCS8qIGtsdWRnZSBmb3IgYW55IHJlbWFpbmluZyBldmVudCBsZWFrcyAqLwotCQlpbnQgYnVnb3V0ID0gdXNlX3hkYW1hZ2UgPyA1MDAgOiA1MDsKLQkJaW50IHFsZW4sIGk7Ci0JCWlmIChsYXN0X3N5bmMgIT0gMCkgewotCQkJcWxlbiA9IFhFdmVudHNRdWV1ZWQoZHB5LCBRdWV1ZWRBbHJlYWR5KTsKLQkJCWlmIChxbGVuID49IGJ1Z291dCkgewotCQkJCXJmYkxvZygiZXZlbnQgbGVhazogJWQgcXVldWVkLCAiCi0JCQkJICAgICIgY2FsbGluZyBYU3luYyhkcHksIFRydWUpXG4iLCBxbGVuKTsgIAotCQkJCXJmYkxvZygiICBmb3IgZGlhZ25vc3RpY3MgcnVuOiAneDExdm5jIC1SIgotCQkJCSAgICAiIGRlYnVnX3hldmVudHM6MSdcbiIpOwotCQkJCVhTeW5jKGRweSwgVHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJbGFzdF9zeW5jID0gbm93OwotCi0JCS8qIGNsZWFyIHRoZXNlLCB3ZSBkb24ndCB3YW50IGFueSBldmVudHMgb24gdGhlbSAqLwotCQlpZiAocmRweV9jdHJsKSB7Ci0JCQlxbGVuID0gWEV2ZW50c1F1ZXVlZChyZHB5X2N0cmwsIFF1ZXVlZEFscmVhZHkpOwotCQkJZm9yIChpPTA7IGk8cWxlbjsgaSsrKSB7Ci0JCQkJWE5leHRFdmVudChyZHB5X2N0cmwsICZ4ZXYpOwotCQkJfQotCQl9Ci0JCWlmIChnZHB5X2N0cmwpIHsKLQkJCXFsZW4gPSBYRXZlbnRzUXVldWVkKGdkcHlfY3RybCwgUXVldWVkQWxyZWFkeSk7Ci0JCQlmb3IgKGk9MDsgaTxxbGVuOyBpKyspIHsKLQkJCQlYTmV4dEV2ZW50KGdkcHlfY3RybCwgJnhldik7Ci0JCQl9Ci0JCX0KLQl9Ci0JWF9VTkxPQ0s7Ci0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotZXh0ZXJuIGludCByYXdmYl92bmNfcmVmbGVjdDsKLS8qCi0gKiBob29rIGNhbGxlZCB3aGVuIGEgVk5DIGNsaWVudCBzZW5kcyB1cyBzb21lICJYQ3V0IiB0ZXh0IChyZmJDbGllbnRDdXRUZXh0KS4KLSAqLwotdm9pZCB4Y3V0X3JlY2VpdmUoY2hhciAqdGV4dCwgaW50IGxlbiwgcmZiQ2xpZW50UHRyIGNsKSB7Ci0JYWxsb3dlZF9pbnB1dF90IGlucHV0OwotCi0JaWYgKHRocmVhZHNfZHJvcF9pbnB1dCkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZmJMb2coInhjdXRfcmVjZWl2ZTogdW5peHB3X2luX3Byb2dyZXNzLCBza2lwcGluZy5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCF3YXRjaF9zZWxlY3Rpb24pIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmlld19vbmx5KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCWdldF9hbGxvd2VkX2lucHV0KGNsLCAmaW5wdXQpOwotCWlmICghaW5wdXQuY2xpcGJvYXJkKSB7Ci0JCXJldHVybjsKLQl9Ci0JSU5QVVRfTE9DSzsKLQotCWlmIChyZW1vdGVfcHJlZml4ICE9IE5VTEwgJiYgc3Ryc3RyKHRleHQsIHJlbW90ZV9wcmVmaXgpID09IHRleHQpIHsKLQkJY2hhciAqcmVzdWx0LCAqcmNtZCA9IHRleHQgKyBzdHJsZW4ocmVtb3RlX3ByZWZpeCk7Ci0JCWNoYXIgKnRtcCA9IChjaGFyICopIGNhbGxvYyhsZW4gKyA4LCAxKTsKLQotCQlpZiAoc3Ryc3RyKHJjbWQsICJjbWQ9IikgIT0gcmNtZCAmJiBzdHJzdHIocmNtZCwgInFyeT0iKSAhPSByY21kKSB7Ci0JCQlzdHJjYXQodG1wLCAicXJ5PSIpOwotCQl9Ci0JCXN0cm5jYXQodG1wLCByY21kLCBsZW4gLSBzdHJsZW4ocmVtb3RlX3ByZWZpeCkpOwotCQlyZmJMb2coInJlbW90ZV9wcmVmaXggY29tbWFuZDogJyVzJ1xuIiwgdG1wKTsKLQotCQlpZiAodXNlX3RocmVhZHMpIHsKLQkJCWlmIChjbGllbnRfY29ubmVjdF9maWxlKSB7Ci0JCQkJRklMRSAqZiA9IGZvcGVuKGNsaWVudF9jb25uZWN0X2ZpbGUsICJ3Iik7Ci0JCQkJaWYgKGYpIHsKLQkJCQkJZnByaW50ZihmLCAiJXNcbiIsIHRtcCk7Ci0JCQkJCWZjbG9zZShmKTsKLQkJCQkJZnJlZSh0bXApOwotCQkJCQlJTlBVVF9VTkxPQ0s7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodm5jX2Nvbm5lY3QpIHsKLQkJCQlzcHJpbnRmKHgxMXZuY19yZW1vdGVfc3RyLCAiJXMiLCB0bXApOwotCQkJCWZyZWUodG1wKTsKLQkJCQlJTlBVVF9VTkxPQ0s7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCUlOUFVUX1VOTE9DSzsKLQotCi0JCXJlc3VsdCA9IHByb2Nlc3NfcmVtb3RlX2NtZCh0bXAsIDEpOwotCQlpZiAocmVzdWx0ID09IE5VTEwgKSB7Ci0JCQlyZXN1bHQgPSBzdHJkdXAoIm51bGwiKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHJlc3VsdCwgIiIpKSB7Ci0JCQlmcmVlKHJlc3VsdCk7Ci0JCQlyZXN1bHQgPSBzdHJkdXAoIm5vbmUiKTsKLQkJfQotCQlyZmJMb2coInJlbW90ZV9wcmVmaXggcmVzdWx0OiAgJyVzJ1xuIiwgcmVzdWx0KTsKLQotCQlmcmVlKHRtcCk7Ci0JCXRtcCA9IChjaGFyICopIGNhbGxvYyhzdHJsZW4ocmVtb3RlX3ByZWZpeCkgKyBzdHJsZW4ocmVzdWx0KSArIDEsIDEpOwotCi0JCXN0cmNhdCh0bXAsIHJlbW90ZV9wcmVmaXgpOwotCQlzdHJjYXQodG1wLCByZXN1bHQpOwotCQlmcmVlKHJlc3VsdCk7Ci0KLQkJcmZiU2VuZFNlcnZlckN1dFRleHQoc2NyZWVuLCB0bXAsIHN0cmxlbih0bXApKTsKLQkJZnJlZSh0bXApOwotCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAoISBjaGVja19zZWxfZGlyZWN0aW9uKCJyZWN2IiwgInhjdXRfcmVjZWl2ZSIsIHRleHQsIGxlbikpIHsKLQkJSU5QVVRfVU5MT0NLOwotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlKSB7Ci0JCW1hY29zeF9zZXRfc2VsKHRleHQsIGxlbik7Ci0JCUlOUFVUX1VOTE9DSzsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JaWYgKHJhd2ZiX3ZuY19yZWZsZWN0KSB7Ci0JCXZuY19yZWZsZWN0X3NlbmRfY3V0dGV4dCh0ZXh0LCBsZW4pOwotCQlJTlBVVF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0jaWYgTk9fWDExCi0JSU5QVVRfVU5MT0NLOwotCXJldHVybjsKLSNlbHNlCi0KLQlYX0xPQ0s7Ci0KLQkvKiBhc3NvY2lhdGUgdGhpcyB0ZXh0IHdpdGggUFJJTUFSWSAoYW5kIFNFQ09OREFSWS4uLikgKi8KLQlpZiAoc2V0X3ByaW1hcnkgJiYgISBvd25fcHJpbWFyeSAmJiBzZWx3aW4gIT0gTm9uZSkgewotCQlvd25fcHJpbWFyeSA9IDE7Ci0JCS8qIHdlIG5lZWQgdG8gZ3JhYiB0aGUgUFJJTUFSWSBzZWxlY3Rpb24gKi8KLQkJWFNldFNlbGVjdGlvbk93bmVyKGRweSwgWEFfUFJJTUFSWSwgc2Vsd2luLCBDdXJyZW50VGltZSk7Ci0JCVhGbHVzaF93cihkcHkpOwotCQlpZiAoZGVidWdfc2VsKSB7Ci0JCQlyZmJMb2coIk93biBQUklNQVJZLlxuIik7Ci0JCX0KLQl9Ci0KLQlpZiAoc2V0X2NsaXBib2FyZCAmJiAhIG93bl9jbGlwYm9hcmQgJiYgY2xpcGJvYXJkX2F0b20gIT0gTm9uZSAmJiBzZWx3aW4gIT0gTm9uZSkgewotCQlvd25fY2xpcGJvYXJkID0gMTsKLQkJLyogd2UgbmVlZCB0byBncmFiIHRoZSBDTElQQk9BUkQgc2VsZWN0aW9uICovCi0JCVhTZXRTZWxlY3Rpb25Pd25lcihkcHksIGNsaXBib2FyZF9hdG9tLCBzZWx3aW4sIEN1cnJlbnRUaW1lKTsKLQkJWEZsdXNoX3dyKGRweSk7Ci0JCWlmIChkZWJ1Z19zZWwpIHsKLQkJCXJmYkxvZygiT3duIENMSVBCT0FSRC5cbiIpOwotCQl9Ci0JfQotCi0JLyogZHVwbGljYXRlIHRoZSB0ZXh0IHN0cmluZyBmb3Igb3VyIG93biB1c2UuICovCi0JaWYgKHNldF9wcmltYXJ5KSB7Ci0JCWlmICh4Y3V0X3N0cl9wcmltYXJ5ICE9IE5VTEwpIHsKLQkJCWZyZWUoeGN1dF9zdHJfcHJpbWFyeSk7Ci0JCQl4Y3V0X3N0cl9wcmltYXJ5ID0gTlVMTDsKLQkJfQotCQl4Y3V0X3N0cl9wcmltYXJ5ID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIChsZW4rMSkpOwotCQlzdHJuY3B5KHhjdXRfc3RyX3ByaW1hcnksIHRleHQsIGxlbik7Ci0JCXhjdXRfc3RyX3ByaW1hcnlbbGVuXSA9ICdcMCc7CS8qIG1ha2Ugc3VyZSBudWxsIHRlcm1pbmF0ZWQgKi8KLQkJaWYgKGRlYnVnX3NlbCkgewotCQkJcmZiTG9nKCJTZXQgUFJJTUFSWSAgICclcydcbiIsIHhjdXRfc3RyX3ByaW1hcnkpOwotCQl9Ci0JfQotCWlmIChzZXRfY2xpcGJvYXJkKSB7Ci0JCWlmICh4Y3V0X3N0cl9jbGlwYm9hcmQgIT0gTlVMTCkgewotCQkJZnJlZSh4Y3V0X3N0cl9jbGlwYm9hcmQpOwotCQkJeGN1dF9zdHJfY2xpcGJvYXJkID0gTlVMTDsKLQkJfQotCQl4Y3V0X3N0cl9jbGlwYm9hcmQgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgKGxlbisxKSk7Ci0JCXN0cm5jcHkoeGN1dF9zdHJfY2xpcGJvYXJkLCB0ZXh0LCBsZW4pOwotCQl4Y3V0X3N0cl9jbGlwYm9hcmRbbGVuXSA9ICdcMCc7CS8qIG1ha2Ugc3VyZSBudWxsIHRlcm1pbmF0ZWQgKi8KLQkJaWYgKGRlYnVnX3NlbCkgewotCQkJcmZiTG9nKCJTZXQgQ0xJUEJPQVJEICclcydcbiIsIHhjdXRfc3RyX2NsaXBib2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKiBjb3B5IHRoaXMgdGV4dCB0byBDVVRfQlVGRkVSMCBhcyB3ZWxsOiAqLwotCVhDaGFuZ2VQcm9wZXJ0eShkcHksIHJvb3R3aW4sIFhBX0NVVF9CVUZGRVIwLCBYQV9TVFJJTkcsIDgsCi0JICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIgKikgdGV4dCwgbGVuKTsKLQlYRmx1c2hfd3IoZHB5KTsKLQotCVhfVU5MT0NLOwotCUlOUFVUX1VOTE9DSzsKLQotCXNldF9jdXRidWZmZXIgPSAxOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi12b2lkIGtiZF9yZWxlYXNlX2FsbF9rZXlzKHJmYkNsaWVudFB0ciBjbCkgewotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJcmZiTG9nKCJrYmRfcmVsZWFzZV9hbGxfa2V5czogdW5peHB3X2luX3Byb2dyZXNzLCBza2lwcGluZy5cbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjbC0+dmlld09ubHkpIHsKLQkJcmV0dXJuOwotCX0KLQotCVJBV0ZCX1JFVF9WT0lECi0KLSNpZiBOT19YMTEKLQlyZXR1cm47Ci0jZWxzZQotCWlmICh1c2VfdGhyZWFkcykgewotCQlYX0xPQ0s7Ci0JfQotCi0JY2xlYXJfa2V5cygpOwotCWNsZWFyX21vZGlmaWVycygwKTsKLQotCWlmICh1c2VfdGhyZWFkcykgewotCQlYX1VOTE9DSzsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBzZXRfc2luZ2xlX3dpbmRvdyhyZmJDbGllbnRQdHIgY2wsIGludCB4LCBpbnQgeSkgewotCWludCBvayA9IDA7Ci0JaWYgKG5vX3VsdHJhX2V4dCkgewotCQlyZXR1cm47Ci0JfQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJcmZiTG9nKCJzZXRfc2luZ2xlX3dpbmRvdzogdW5peHB3X2luX3Byb2dyZXNzLCBkcm9wcGluZyBjbGllbnQuXG4iKTsKLQkJcmZiQ2xvc2VDbGllbnQoY2wpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjbC0+dmlld09ubHkpIHsKLQkJcmV0dXJuOwotCX0KLQotCVJBV0ZCX1JFVF9WT0lECi0KLSNpZiBOT19YMTEKLQlyZXR1cm47Ci0jZWxzZQotCWlmICh4PT0xICYmIHk9PTEpIHsKLQkJaWYgKHN1YndpbikgewotCQkJc3Vid2luID0gMHgwOwotCQkJb2sgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJV2luZG93IHIsIGM7Ci0JCWludCByb290eCwgcm9vdHksIHd4LCB3eTsKLQkJdW5zaWduZWQgaW50IG1hc2s7Ci0KLQkJdXBkYXRlX3gxMV9wb2ludGVyX3Bvc2l0aW9uKHgsIHkpOwotCQlYU3luYyhkcHksIEZhbHNlKTsKLQotCQlpZiAoWFF1ZXJ5UG9pbnRlcl93cihkcHksIHJvb3R3aW4sICZyLCAmYywgJnJvb3R4LCAmcm9vdHksCi0JCSAgICAmd3gsICZ3eSwgJm1hc2spKSB7Ci0JCQlpZiAoYyAhPSBOb25lKSB7Ci0JCQkJc3Vid2luID0gYzsKLQkJCQlvayA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAob2spIHsKLQkJY2hlY2tfYmxhY2tfZmIoKTsKLQkJZG9fbmV3X2ZiKDEpOwkKLQl9Ci0jZW5kaWYKLQotfQotdm9pZCBzZXRfc2VydmVyX2lucHV0KHJmYkNsaWVudFB0ciBjbCwgaW50IGdyYWIpIHsKLQlpZiAobm9fdWx0cmFfZXh0KSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZmJMb2coInNldF9zZXJ2ZXJfaW5wdXQ6IHVuaXhwd19pbl9wcm9ncmVzcywgZHJvcHBpbmcgY2xpZW50LlxuIik7Ci0JCXJmYkNsb3NlQ2xpZW50KGNsKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY2wtPnZpZXdPbmx5KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlSQVdGQl9SRVRfVk9JRAotCi0jaWYgTk9fWDExCi0JcmV0dXJuOwotI2Vsc2UKLQlpZiAoZ3JhYikgewotCQlpZiAoIW5vX3VsdHJhX2RwbXMpIHsKLQkJCXNldF9kcG1zX21vZGUoImVuYWJsZSIpOwotCQkJc2V0X2RwbXNfbW9kZSgib2ZmIik7Ci0JCQlmb3JjZV9kcG1zID0gMTsKLQkJfQotCi0JCXByb2Nlc3NfcmVtb3RlX2NtZCgiY21kPWdyYWJrYmQiLCAwKTsKLQkJcHJvY2Vzc19yZW1vdGVfY21kKCJjbWQ9Z3JhYnB0ciIsIDApOwotCi0JfSBlbHNlIHsKLQkJcHJvY2Vzc19yZW1vdGVfY21kKCJjbWQ9bm9ncmFia2JkIiwgMCk7Ci0JCXByb2Nlc3NfcmVtb3RlX2NtZCgiY21kPW5vZ3JhYnB0ciIsIDApOwotCi0JCWlmICghbm9fdWx0cmFfZHBtcykgewotCQkJZm9yY2VfZHBtcyA9IDA7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCB3c29ja190aW1lb3V0X3NvY2sgPSAtMTsKLQotc3RhdGljIHZvaWQgd3NvY2tfdGltZW91dCAoaW50IHNpZykgewotCXJmYkxvZygic2lnOiAlZCwgd3NvY2tfdGltZW91dC5cbiIsIHNpZyk7Ci0JaWYgKHdzb2NrX3RpbWVvdXRfc29jayA+PSAwKSB7Ci0JCWNsb3NlKHdzb2NrX3RpbWVvdXRfc29jayk7Ci0JCXdzb2NrX3RpbWVvdXRfc29jayA9IC0xOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdHJ5X2xvY2FsX2NoYXRfd2luZG93KHZvaWQpIHsKLQlpbnQgaSwgcG9ydCwgbHNvY2s7Ci0JY2hhciBjbWRbMTAwXTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLQlwaWRfdCBwaWQgPSAtMTsKLSNpZmRlZiBfX2hwdXgKLQlpbnQgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLSNlbHNlCi0Jc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCA5MDsgaSsrKSAgewotCQkvKiBmaW5kIGFuIG9wZW4gcG9ydCAqLwotCQlwb3J0ID0gNzMwMCArIGk7Ci0JCS8qIFhYWCA6OjEgZmFsbGJhY2sgKi8KLQkJbHNvY2sgPSBsaXN0ZW5fdGNwKHBvcnQsIGh0b25sKElOQUREUl9MT09QQkFDSyksIDApOwotCQlpZiAobHNvY2sgPj0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJcG9ydCA9IDA7Ci0JfQotCi0JaWYgKHBvcnQgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogaGF2ZSBzc3ZuY3ZuY3ZpZXdlciBjb25uZWN0IGJhY2sgdG8gdXMgKG4uYi4gc29ja3BhaXIgZmFpbHMpICovCi0KLQlzcHJpbnRmKGNtZCwgInNzdm5jIC1jbWQgVk5DOi8vbG9jYWxob3N0OiVkIC1jaGF0b25seSIsIHBvcnQpOwotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfRk9SSwotCXBpZCA9IGZvcmsoKTsKLSNlbmRpZgotCi0JaWYgKHBpZCA9PSAtMSkgewotCQlwZXJyb3IoImZvcmsiKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAocGlkID09IDApIHsKLQkJY2hhciAqYXJnc1s0XTsKLQkJaW50IGQ7Ci0JCWFyZ3NbMF0gPSAiL2Jpbi9zaCI7Ci0JCWFyZ3NbMV0gPSAiLWMiOwotCQkvKiAic3N2bmMgLWNtZCBWTkM6Ly9mZD0wIC1jaGF0b25seSI7IG5vdCB3b3JraW5nICovCi0JCWFyZ3NbMl0gPSBjbWQ7Ci0JCWFyZ3NbM10gPSBOVUxMOwotCi0JCXNldF9lbnYoIlZOQ1ZJRVdFUl9QQVNTV09SRCIsICJtb28iKTsKLSNpZiAhTk9fWDExCi0JCWlmIChkcHkgIT0gTlVMTCkgewotCQkJc2V0X2VudigiRElTUExBWSIsIERpc3BsYXlTdHJpbmcoZHB5KSk7Ci0JCX0KLSNlbmRpZgotCQlmb3IgKGQgPSAzOyBkIDwgMjU2OyBkKyspIHsKLQkJCWNsb3NlKGQpOwotCQl9Ci0KLQkJZXhlY3ZwKGFyZ3NbMF0sIGFyZ3MpOwotCQlwZXJyb3IoImV4ZWMiKTsKLQkJZXhpdCgxKTsKLQl9IGVsc2UgewotCQlpbnQgaSwgc29jayA9IC0xOwotCQlyZmJOZXdDbGllbnRIb29rUHRyIG5ld19zYXZlOwotCi0JCXNpZ25hbChTSUdBTFJNLCB3c29ja190aW1lb3V0KTsKLQkJd3NvY2tfdGltZW91dF9zb2NrID0gbHNvY2s7Ci0JCQotCQlhbGFybSgxMCk7Ci0JCXNvY2sgPSBhY2NlcHQobHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOwotCQlhbGFybSgwKTsKLQotCQlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ci0JCWNsb3NlKGxzb2NrKTsKLQotCQlpZiAoc29jayA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIG11dGV4ICovCi0JCW5ld19zYXZlID0gc2NyZWVuLT5uZXdDbGllbnRIb29rOwotCQlzY3JlZW4tPm5ld0NsaWVudEhvb2sgPSBuZXdfY2xpZW50X2NoYXRfaGVscGVyOwotCi0JCWNoYXRfd2luZG93X2NsaWVudCA9IGNyZWF0ZV9uZXdfY2xpZW50KHNvY2ssIDEpOwotCi0JCXNjcmVlbi0+bmV3Q2xpZW50SG9vayA9IG5ld19zYXZlOwotCi0JCWlmIChjaGF0X3dpbmRvd19jbGllbnQgIT0gTlVMTCkgewotCQkJcmZiUGFzc3dvcmRDaGVja1Byb2NQdHIgcHdjaGtfc2F2ZSA9IHNjcmVlbi0+cGFzc3dvcmRDaGVjazsKLQkJCXJmYkJvb2wgc2F2ZV9zaGFyZWQxID0gc2NyZWVuLT5hbHdheXNTaGFyZWQ7Ci0JCQlyZmJCb29sIHNhdmVfc2hhcmVkMiA9IHNjcmVlbi0+bmV2ZXJTaGFyZWQ7Ci0KLQkJCXNjcmVlbi0+YWx3YXlzU2hhcmVkID0gVFJVRTsKLQkJCXNjcmVlbi0+bmV2ZXJTaGFyZWQgID0gRkFMU0U7Ci0KLQkJCXNjcmVlbi0+cGFzc3dvcmRDaGVjayA9IHBhc3N3b3JkX2NoZWNrX2NoYXRfaGVscGVyOwotCQkJZm9yIChpPTA7IGk8MzA7IGkrKykgewotCQkJCXJmYlBFKC0xKTsKLQkJCQlpZiAoIWNoYXRfd2luZG93X2NsaWVudCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNoYXRfd2luZG93X2NsaWVudC0+c3RhdGUgPT0gUkZCX05PUk1BTCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNjcmVlbi0+cGFzc3dvcmRDaGVjayA9IHB3Y2hrX3NhdmU7Ci0JCQlzY3JlZW4tPmFsd2F5c1NoYXJlZCAgPSBzYXZlX3NoYXJlZDE7Ci0JCQlzY3JlZW4tPm5ldmVyU2hhcmVkICAgPSBzYXZlX3NoYXJlZDI7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgc2V0X3RleHRfY2hhdChyZmJDbGllbnRQdHIgY2wsIGludCBsZW4sIGNoYXIgKnR4dCkgewotCWludCBkb2NoYXQgPSAxOwotCXJmYkNsaWVudEl0ZXJhdG9yUHRyIGl0ZXI7Ci0JcmZiQ2xpZW50UHRyIGNsMjsKLQl1bnNpZ25lZCBpbnQgdWxlbiA9ICh1bnNpZ25lZCBpbnQpIGxlbjsKLQotCWlmIChub191bHRyYV9leHQgfHwgISBkb2NoYXQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHsKLQkJcmZiTG9nKCJzZXRfdGV4dF9jaGF0OiB1bml4cHdfaW5fcHJvZ3Jlc3MsIGRyb3BwaW5nIGNsaWVudC5cbiIpOwotCQlyZmJDbG9zZUNsaWVudChjbCk7Ci0JCXJldHVybjsKLQl9Ci0jaWYgTElCVk5DU0VSVkVSX0hBU19URVhUQ0hBVAotCi0JaWYgKGNoYXRfd2luZG93ICYmIGNoYXRfd2luZG93X2NsaWVudCA9PSBOVUxMICYmIHVsZW4gPT0gcmZiVGV4dENoYXRPcGVuKSB7Ci0JCXRyeV9sb2NhbF9jaGF0X3dpbmRvdygpOwotCX0KLQotCXNhd191bHRyYV9jaGF0ID0gMTsKLQotCWl0ZXIgPSByZmJHZXRDbGllbnRJdGVyYXRvcihzY3JlZW4pOwotCXdoaWxlKCAoY2wyID0gcmZiQ2xpZW50SXRlcmF0b3JOZXh0KGl0ZXIpKSApIHsKLQkJdW5zaWduZWQgaW50IHVsZW4gPSAodW5zaWduZWQgaW50KSBsZW47Ci0JCWlmIChjbDIgPT0gY2wpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChjbDItPnN0YXRlICE9IFJGQl9OT1JNQUwpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJU0VORF9MT0NLKGNsMik7Ci0KLQkJaWYgKHVsZW4gPT0gcmZiVGV4dENoYXRPcGVuKSB7Ci0JCQlyZmJTZW5kVGV4dENoYXRNZXNzYWdlKGNsMiwgcmZiVGV4dENoYXRPcGVuLCAiIik7Ci0JCX0gZWxzZSBpZiAodWxlbiA9PSByZmJUZXh0Q2hhdENsb3NlKSB7Ci0JCQlyZmJTZW5kVGV4dENoYXRNZXNzYWdlKGNsMiwgcmZiVGV4dENoYXRDbG9zZSwgIiIpOwotCQkJLyogbm90IGNsZWFyIHdoYXQgaXMgZ29pbmcgb24gV1JUIGNsb3NlIGFuZCBmaW5pc2hlZC4uLiAqLwotCQkJcmZiU2VuZFRleHRDaGF0TWVzc2FnZShjbDIsIHJmYlRleHRDaGF0RmluaXNoZWQsICIiKTsKLQkJfSBlbHNlIGlmICh1bGVuID09IHJmYlRleHRDaGF0RmluaXNoZWQpIHsKLQkJCXJmYlNlbmRUZXh0Q2hhdE1lc3NhZ2UoY2wyLCByZmJUZXh0Q2hhdEZpbmlzaGVkLCAiIik7Ci0JCX0gZWxzZSBpZiAobGVuIDw9IHJmYlRleHRNYXhTaXplKSB7Ci0JCQlyZmJTZW5kVGV4dENoYXRNZXNzYWdlKGNsMiwgbGVuLCB0eHQpOwotCQl9Ci0KLQkJU0VORF9VTkxPQ0soY2wyKTsKLQl9Ci0JcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCi0JaWYgKHVsZW4gPT0gcmZiVGV4dENoYXRDbG9zZSAmJiBjbCAhPSBOVUxMKSB7Ci0JCS8qIG5vdCBjbGVhciB3aGF0IGlzIGdvaW5nIG9uIFdSVCBjbG9zZSBhbmQgZmluaXNoZWQuLi4gKi8KLQkJU0VORF9MT0NLKGNsKTsKLQkJcmZiU2VuZFRleHRDaGF0TWVzc2FnZShjbCwgcmZiVGV4dENoYXRGaW5pc2hlZCwgIiIpOwotCQlTRU5EX1VOTE9DSyhjbCk7Ci0JfQotI2VuZGlmCi19Ci0KLWludCBnZXRfa2V5Ym9hcmRfbGVkX3N0YXRlX2hvb2socmZiU2NyZWVuSW5mb1B0ciBzKSB7Ci0JaWYgKHMpIHt9Ci0JaWYgKHVuaXhwd19pbl9wcm9ncmVzcykgewotCQlyZmJMb2coImdldF9rZXlib2FyZF9sZWRfc3RhdGVfaG9vazogdW5peHB3X2luX3Byb2dyZXNzLCBza2lwcGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgZ2V0X2ZpbGVfdHJhbnNmZXJfcGVybWl0dGVkKHJmYkNsaWVudFB0ciBjbCkgewotCWFsbG93ZWRfaW5wdXRfdCBpbnB1dDsKLQlpZiAodW5peHB3X2luX3Byb2dyZXNzKSB7Ci0JCXJmYkxvZygiZ2V0X2ZpbGVfdHJhbnNmZXJfcGVybWl0dGVkOiB1bml4cHdfaW5fcHJvZ3Jlc3MsIGRyb3BwaW5nIGNsaWVudC5cbiIpOwotCQlyZmJDbG9zZUNsaWVudChjbCk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci1pZiAoMCkgZnByaW50ZihzdGRlcnIsICJnZXRfZmlsZV90cmFuc2Zlcl9wZXJtaXR0ZWQgY2FsbGVkXG4iKTsKLQlpZiAodmlld19vbmx5KSB7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYgKGNsLT52aWV3T25seSkgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWdldF9hbGxvd2VkX2lucHV0KGNsLCAmaW5wdXQpOwotCWlmICghaW5wdXQuZmlsZXMpIHsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlpZiAoc2NyZWVuLT5wZXJtaXRGaWxlVHJhbnNmZXIpIHsKLQkJc2F3X3VsdHJhX2ZpbGUgPSAxOwotCX0KLQlyZXR1cm4gc2NyZWVuLT5wZXJtaXRGaWxlVHJhbnNmZXI7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3hldmVudHMuaCBiL3gxMXZuYy94ZXZlbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGJkY2UuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hldmVudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1hFVkVOVFNfSAotI2RlZmluZSBfWDExVk5DX1hFVkVOVFNfSAotCi0vKiAtLSB4ZXZlbnRzLmggLS0gKi8KLQotZXh0ZXJuIGludCBncmFiX2J1c3RlcjsKLWV4dGVybiBpbnQgZ3JhYl9rYmQ7Ci1leHRlcm4gaW50IGdyYWJfcHRyOwotZXh0ZXJuIGludCBncmFiX2Fsd2F5czsKLWV4dGVybiBpbnQgdW5ncmFiX2JvdGg7Ci1leHRlcm4gaW50IGdyYWJfbG9jYWw7Ci1leHRlcm4gaW50IHN5bmNfdG9kX2RlbGF5OwotCi1leHRlcm4gdm9pZCBpbml0aWFsaXplX3ZuY19jb25uZWN0X3Byb3Aodm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3gxMXZuY19yZW1vdGVfcHJvcCh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfY2xpcGJvYXJkX2F0b20odm9pZCk7Ci1leHRlcm4gdm9pZCBzcGF3bl9ncmFiX2J1c3Rlcih2b2lkKTsKLWV4dGVybiB2b2lkIHN5bmNfdG9kX3dpdGhfc2VydmVydGltZSh2b2lkKTsKLWV4dGVybiB2b2lkIGNoZWNrX2tleWNvZGVfc3RhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCBjaGVja19hdXRvcmVwZWF0KHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X3Byb3BfYXRvbShBdG9tIGF0b20pOwotZXh0ZXJuIHZvaWQgY2hlY2tfeGV2ZW50cyhpbnQgcmVzZXQpOwotZXh0ZXJuIHZvaWQgeGN1dF9yZWNlaXZlKGNoYXIgKnRleHQsIGludCBsZW4sIHJmYkNsaWVudFB0ciBjbCk7Ci0KLWV4dGVybiB2b2lkIGtiZF9yZWxlYXNlX2FsbF9rZXlzKHJmYkNsaWVudFB0ciBjbCk7Ci1leHRlcm4gdm9pZCBzZXRfc2luZ2xlX3dpbmRvdyhyZmJDbGllbnRQdHIgY2wsIGludCB4LCBpbnQgeSk7Ci1leHRlcm4gdm9pZCBzZXRfc2VydmVyX2lucHV0KHJmYkNsaWVudFB0ciBjbCwgaW50IHMpOwotZXh0ZXJuIHZvaWQgc2V0X3RleHRfY2hhdChyZmJDbGllbnRQdHIgY2wsIGludCBsLCBjaGFyICp0KTsKLWV4dGVybiBpbnQgZ2V0X2tleWJvYXJkX2xlZF9zdGF0ZV9ob29rKHJmYlNjcmVlbkluZm9QdHIgcyk7Ci1leHRlcm4gaW50IGdldF9maWxlX3RyYW5zZmVyX3Blcm1pdHRlZChyZmJDbGllbnRQdHIgY2wpOwotZXh0ZXJuIHZvaWQgZ2V0X3Byb3AoY2hhciAqc3RyLCBpbnQgbGVuLCBBdG9tIHByb3AsIFdpbmRvdyB3KTsKLWV4dGVybiBpbnQgZ3Vlc3NfZG1fZ29uZShpbnQgdDEsIGludCB0Mik7Ci0KLQotI2VuZGlmIC8qIF9YMTFWTkNfWEVWRU5UU19IICovCmRpZmYgLS1naXQgYS94MTF2bmMveGluZXJhbWEuYyBiL3gxMXZuYy94aW5lcmFtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDFlMmNhLi4wMDAwMDAwCi0tLSBhL3gxMXZuYy94aW5lcmFtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geGluZXJhbWEuYyAtLSAqLwotCi0jaW5jbHVkZSAieDExdm5jLmgiCi0jaW5jbHVkZSAieHdyYXBwZXJzLmgiCi0jaW5jbHVkZSAiYmxhY2tvdXRfdC5oIgotI2luY2x1ZGUgInNjYW4uaCIKLQotLyoKLSAqIHJvdXRpbmVzIHJlbGF0ZWQgdG8geGluZXJhbWEgYW5kIGJsYWNraW5nIG91dCByZWN0YW5nbGVzCi0gKi8KLQotLyogYmxhY2tlZC1vdXQgcmVnaW9uICgtYmxhY2tvdXQsIC14aW5lcmFtYSkgKi8KLQotI2RlZmluZSBCTEFDS1JfTUFYIDEwMAotYmxhY2tvdXRfdCBibGFja3JbQkxBQ0tSX01BWF07CS8qIGhhcmR3aXJlZCBtYXggYmxhY2tvdXRzICovCi10aWxlX2JsYWNrb3V0X3QgKnRpbGVfYmxhY2tvdXQ7Ci1pbnQgYmxhY2tvdXRzID0gMDsKLQotdm9pZCBpbml0aWFsaXplX2JsYWNrb3V0c19hbmRfeGluZXJhbWEodm9pZCk7Ci12b2lkIHB1c2hfc2xlZXAoaW50IG4pOwotdm9pZCBwdXNoX2JsYWNrX3NjcmVlbihpbnQgbik7Ci12b2lkIHJlZnJlc2hfc2NyZWVuKGludCBwdXNoKTsKLXZvaWQgemVyb19mYihpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpOwotCi0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfYmxhY2tvdXRzKGNoYXIgKmxpc3QpOwotc3RhdGljIHZvaWQgYmxhY2tvdXRfdGlsZXModm9pZCk7Ci1zdGF0aWMgdm9pZCBpbml0aWFsaXplX3hpbmVyYW1hICh2b2lkKTsKLQotCi0vKgotICogVGFrZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGdlb21ldHJpZXM6IFd4SCtYK1kgYW5kIHJlZ2lzdGVyIHRoZW0gYXMKLSAqIHJlY3RhbmdsZXMgdG8gYmxhY2sgb3V0IGZyb20gdGhlIHNjcmVlbi4KLSAqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9ibGFja291dHMoY2hhciAqbGlzdCkgewotCWNoYXIgKnAsICpibGlzdCA9IHN0cmR1cChsaXN0KTsKLQlpbnQgeCwgeSwgWCwgWSwgaCwgdywgdDsKLQotCXAgPSBzdHJ0b2soYmxpc3QsICIsIFx0Iik7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKCFzdHJjbXAoIm5vcHRyIiwgcCkpIHsKLQkJCWJsYWNrb3V0X3B0ciA9IDE7Ci0JCQlyZmJMb2coInBvaW50ZXIgd2lsbCBiZSBibG9ja2VkIGZyb20gYmxhY2tvdXQgIgotCQkJICAgICJyZWdpb25zXG4iKTsKLQkJCXAgPSBzdHJ0b2soTlVMTCwgIiwgXHQiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghIHBhcnNlX2dlb20ocCwgJncsICZoLCAmeCwgJnksIGRweV94LCBkcHlfeSkpIHsKLQkJCWlmICgqcCAhPSAnXDAnKSB7Ci0JCQkJcmZiTG9nKCJza2lwcGluZyBpbnZhbGlkIGdlb21ldHJ5OiAlc1xuIiwgcCk7Ci0JCQl9Ci0JCQlwID0gc3RydG9rKE5VTEwsICIsIFx0Iik7Ci0JCQljb250aW51ZTsKLQkJfQotCQl3ID0gbmFicyh3KTsKLQkJaCA9IG5hYnMoaCk7Ci0JCXggPSBuZml4KHgsIGRweV94KTsKLQkJeSA9IG5maXgoeSwgZHB5X3kpOwotCQlYID0geCArIHc7Ci0JCVkgPSB5ICsgaDsKLQkJWCA9IG5maXgoWCwgZHB5X3grMSk7Ci0JCVkgPSBuZml4KFksIGRweV95KzEpOwotCQlpZiAoeCA+IFgpIHsKLQkJCXQgPSBYOyBYID0geDsgeCA9IHQ7Ci0JCX0KLQkJaWYgKHkgPiBZKSB7Ci0JCQl0ID0gWTsgWSA9IHk7IHkgPSB0OwotCQl9Ci0JCWlmICh4IDwgMCB8fCB4ID4gZHB5X3ggfHwgeSA8IDAgfHwgeSA+IGRweV95IHx8Ci0JCSAgICBYIDwgMCB8fCBYID4gZHB5X3ggfHwgWSA8IDAgfHwgWSA+IGRweV95IHx8Ci0JCSAgICB4ID09IFggfHwgeSA9PSBZKSB7Ci0JCQlyZmJMb2coInNraXBwaW5nIGludmFsaWQgYmxhY2tvdXQgZ2VvbWV0cnk6ICVzIHg9IgotCQkJICAgICIlZC0lZCx5PSVkLSVkLHc9JWQsaD0lZFxuIiwgcCwgeCwgWCwgeSwgWSwgdywgaCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coImJsYWNrb3V0IHJlY3Q6ICVzOiB4PSVkLSVkIHk9JWQtJWRcbiIsIHAsCi0JCQkgICAgeCwgWCwgeSwgWSk7Ci0KLQkJCS8qCi0JCQkgKiBub3RlIHRoYXQgdGhlIGJsYWNrIG91dCBpcyB4MSA8PSB4IGJ1dCB4IDwgeDIKLQkJCSAqIGZvciB0aGUgcmVnaW9uLiBpLmUuIHRoZSB4MiwgeTIgYXJlIG91dHNpZGUKLQkJCSAqIGJ5IDEgcGl4ZWwuIAotCQkJICovCi0JCQlibGFja3JbYmxhY2tvdXRzXS54MSA9IHg7Ci0JCQlibGFja3JbYmxhY2tvdXRzXS55MSA9IHk7Ci0JCQlibGFja3JbYmxhY2tvdXRzXS54MiA9IFg7Ci0JCQlibGFja3JbYmxhY2tvdXRzXS55MiA9IFk7Ci0JCQlibGFja291dHMrKzsKLQkJCWlmIChibGFja291dHMgPj0gQkxBQ0tSX01BWCkgewotCQkJCXJmYkxvZygidG9vIG1hbnkgYmxhY2tvdXRzOiAlZFxuIiwgYmxhY2tvdXRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwID0gc3RydG9rKE5VTEwsICIsIFx0Iik7Ci0JfQotCWZyZWUoYmxpc3QpOwotfQotCi0vKgotICogTm93IHRoYXQgYWxsIGJsYWNrb3V0IHJlY3RhbmdsZXMgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkLCBzZWUgd2hhdCBvdmVybGFwCi0gKiB0aGV5IGhhdmUgd2l0aCB0aGUgdGlsZXMgaW4gdGhlIHN5c3RlbS4gIElmIGEgdGlsZSBpcyB0b3VjaGVkIGJ5IGEKLSAqIGJsYWNrb3V0LCByZWNvcmQgaW5mb3JtYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIGJsYWNrb3V0X3RpbGVzKHZvaWQpIHsKLQlpbnQgdHgsIHR5OwotCWludCBkZWJ1Z19ibyA9IDA7Ci0JaWYgKCEgYmxhY2tvdXRzKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGdldGVudigiREVCVUdfQkxBQ0tPVVQiKSAhPSBOVUxMKSB7Ci0JCWRlYnVnX2JvID0gMTsKLQl9Ci0KLQkvKiAKLQkgKiB0byBzaW1wbGlmeSB0aGluZ3MgZHJvcCBkb3duIHRvIHNpbmdsZSBjb3B5IG1vZGUsIGV0Yy4uLgotCSAqLwotCXNpbmdsZV9jb3B5dGlsZSA9IDE7Ci0JLyogbG9vcCBvdmVyIGFsbCB0aWxlcy4gKi8KLQlmb3IgKHR5PTA7IHR5IDwgbnRpbGVzX3k7IHR5KyspIHsKLQkJZm9yICh0eD0wOyB0eCA8IG50aWxlc194OyB0eCsrKSB7Ci0JCQlzcmFSZWdpb25QdHIgdGlsZV9yZWcsIGJsYWNrX3JlZzsKLQkJCXNyYVJlY3QgcmVjdDsKLQkJCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCQkJaW50IG4sIGIsIHgxLCB5MSwgeDIsIHkyLCBjbnQ7Ci0KLQkJCS8qIHRpbGUgbnVtYmVyIGFuZCBjb29yZGluYXRlczogKi8KLQkJCW4gPSB0eCArIHR5ICogbnRpbGVzX3g7Ci0JCQl4MSA9IHR4ICogdGlsZV94OwotCQkJeTEgPSB0eSAqIHRpbGVfeTsKLQkJCXgyID0geDEgKyB0aWxlX3g7Ci0JCQl5MiA9IHkxICsgdGlsZV95OwotCQkJaWYgKHgyID4gZHB5X3gpIHsKLQkJCQl4MiA9IGRweV94OwotCQkJfQotCQkJaWYgKHkyID4gZHB5X3kpIHsKLQkJCQl5MiA9IGRweV95OwotCQkJfQotCi0JCQkvKiBtYWtlIHJlZ2lvbnMgZm9yIHRoZSB0aWxlIGFuZCB0aGUgYmxhY2tvdXRzOiAqLwotCQkJYmxhY2tfcmVnID0gKHNyYVJlZ2lvblB0cikgc3JhUmduQ3JlYXRlKCk7Ci0JCQl0aWxlX3JlZyAgPSAoc3JhUmVnaW9uUHRyKSBzcmFSZ25DcmVhdGVSZWN0KHgxLCB5MSwKLQkJCSAgICB4MiwgeTIpOwotCi0JCQl0aWxlX2JsYWNrb3V0W25dLmNvdmVyID0gMDsKLQkJCXRpbGVfYmxhY2tvdXRbbl0uY291bnQgPSAwOwotCi0JCQkvKiB1bmlvbiBvZiBibGFja291dHMgKi8KLQkJCWZvciAoYj0wOyBiIDwgYmxhY2tvdXRzOyBiKyspIHsKLQkJCQlzcmFSZWdpb25QdHIgdG1wX3JlZyA9IChzcmFSZWdpb25QdHIpCi0JCQkJICAgIHNyYVJnbkNyZWF0ZVJlY3QoYmxhY2tyW2JdLngxLAotCQkJCSAgICBibGFja3JbYl0ueTEsIGJsYWNrcltiXS54MiwgYmxhY2tyW2JdLnkyKTsKLQotCQkJCXNyYVJnbk9yKGJsYWNrX3JlZywgdG1wX3JlZyk7Ci0JCQkJc3JhUmduRGVzdHJveSh0bXBfcmVnKTsKLQkJCX0KLQotCQkJaWYgKCEgc3JhUmduQW5kKGJsYWNrX3JlZywgdGlsZV9yZWcpKSB7Ci0JCQkJLyoKLQkJCQkgKiBubyBpbnRlcnNlY3Rpb24gZm9yIHRoaXMgdGlsZSwgc28gd2UKLQkJCQkgKiBhcmUgZG9uZS4KLQkJCQkgKi8KLQkJCQlzcmFSZ25EZXN0cm95KGJsYWNrX3JlZyk7Ci0JCQkJc3JhUmduRGVzdHJveSh0aWxlX3JlZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBsb29wIG92ZXIgcmVjdGFuZ2xlcyB0aGF0IG1ha2UgdXAgdGhlIGJsYWNrb3V0Ci0JCQkgKiByZWdpb246Ci0JCQkgKi8KLQkJCWNudCA9IDA7Ci0JCQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IoYmxhY2tfcmVnKTsKLQkJCXdoaWxlIChzcmFSZ25JdGVyYXRvck5leHQoaXRlciwgJnJlY3QpKSB7Ci0KLQkJCQkvKiBtYWtlIHN1cmUgeDEgPCB4MiBhbmQgeTEgPCB5MiAqLwotCQkJCWlmIChyZWN0LngxID4gcmVjdC54MikgewotCQkJCQlpbnQgdG1wID0gcmVjdC54MjsKLQkJCQkJcmVjdC54MiA9IHJlY3QueDE7Ci0JCQkJCXJlY3QueDEgPSB0bXA7Ci0JCQkJfQotCQkJCWlmIChyZWN0LnkxID4gcmVjdC55MikgewotCQkJCQlpbnQgdG1wID0gcmVjdC55MjsKLQkJCQkJcmVjdC55MiA9IHJlY3QueTE7Ci0JCQkJCXJlY3QueTEgPSB0bXA7Ci0JCQkJfQotCi0JCQkJLyogc3RvcmUgY29vcmRpbmF0ZXMgKi8KLQkJCQl0aWxlX2JsYWNrb3V0W25dLmJvW2NudF0ueDEgPSByZWN0LngxOwotCQkJCXRpbGVfYmxhY2tvdXRbbl0uYm9bY250XS55MSA9IHJlY3QueTE7Ci0JCQkJdGlsZV9ibGFja291dFtuXS5ib1tjbnRdLngyID0gcmVjdC54MjsKLQkJCQl0aWxlX2JsYWNrb3V0W25dLmJvW2NudF0ueTIgPSByZWN0LnkyOwotCi0JCQkJLyogbm90ZSBpZiB0aGUgdGlsZSBpcyBjb21wbGV0ZWx5IG9ic2N1cmVkICovCi0JCQkJaWYgKHJlY3QueDEgPT0geDEgJiYgcmVjdC55MSA9PSB5MSAmJgotCQkJCSAgICByZWN0LngyID09IHgyICYmIHJlY3QueTIgPT0geTIpIHsKLQkJCQkJdGlsZV9ibGFja291dFtuXS5jb3ZlciA9IDI7Ci0JCQkJCWlmIChkZWJ1Z19ibykgewotIAkJCQkJCWZwcmludGYoc3RkZXJyLCAiZnVsbDogJWQ9JWQsJWQiCi0JCQkJCQkgICAgIiAgKCVkLSVkKSAgKCVkLSVkKVxuIiwKLQkJCQkJCSAgICBuLCB0eCwgdHksIHgxLCB4MiwgeTEsIHkyKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRpbGVfYmxhY2tvdXRbbl0uY292ZXIgPSAxOwotCQkJCQlpZiAoZGVidWdfYm8pIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAicGFydDogJWQ9JWQsJWQiCi0JCQkJCQkgICAgIiAgKCVkLSVkKSAgKCVkLSVkKVxuIiwKLQkJCQkJCSAgICBuLCB0eCwgdHksIHgxLCB4MiwgeTEsIHkyKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgrK2NudCA+PSBCT19NQVgpIHsKLQkJCQkJcmZiTG9nKCJ0b28gbWFueSBibGFja291dCByZWN0YW5nbGVzICIKLQkJCQkJICAgICJmb3IgdGlsZSAlZD0lZCwlZC5cbiIsIG4sIHR4LCB0eSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNyYVJnblJlbGVhc2VJdGVyYXRvcihpdGVyKTsKLQotCQkJc3JhUmduRGVzdHJveShibGFja19yZWcpOwotCQkJc3JhUmduRGVzdHJveSh0aWxlX3JlZyk7Ci0KLQkJCXRpbGVfYmxhY2tvdXRbbl0uY291bnQgPSBjbnQ7Ci0JCQlpZiAoZGVidWdfYm8gJiYgY250ID4gMSkgewotIAkJCQlyZmJMb2coIndhcm5pbmc6IG11bHRpcGxlIHJlZ2lvbiBvdmVybGFwc1slZF0gIgotCQkJCSAgICAiZm9yIHRpbGUgJWQ9JWQsJWQuXG4iLCBjbnQsIG4sIHR4LCB0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZGlkX3hpbmVyYW1hX2NsaXAgPSAwOwotCi12b2lkIGNoZWNrX3hpbmVyYW1hX2NsaXAodm9pZCkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhJTkVSQU1BCi0JaW50IG4sIGssIGksIGV2LCBlciwganVzZSA9IC0xOwotCWludCBzY29yZVszMl0sIGlzID0gMDsKLQlYaW5lcmFtYVNjcmVlbkluZm8gKng7Ci0KLQlpZiAoIWNsaXBfc3RyIHx8ICFkcHkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc3NjYW5mKGNsaXBfc3RyLCAieGluZXJhbWElZCIsICZrKSA9PSAxKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHNzY2FuZihjbGlwX3N0ciwgInNjcmVlbiVkIiwgJmspID09IDEpIHsKLQkJOwotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcmVlKGNsaXBfc3RyKTsKLQljbGlwX3N0ciA9IE5VTEw7Ci0KLQlpZiAoISBYaW5lcmFtYVF1ZXJ5RXh0ZW5zaW9uKGRweSwgJmV2LCAmZXIpKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCEgWGluZXJhbWFJc0FjdGl2ZShkcHkpKSB7Ci0JCXJldHVybjsKLQl9Ci0JeCA9IFhpbmVyYW1hUXVlcnlTY3JlZW5zKGRweSwgJm4pOwotCWlmIChrIDwgMCB8fCBrID49IG4pIHsKLQkJWEZyZWVfd3IoeCk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQkJc2NvcmVbaXMrK10gPSBuYWJzKHhbaV0ueF9vcmcpICsgbmFicyh4W2ldLnlfb3JnKTsKLQkJaWYgKGlzID49IDMyKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlmb3IgKGk9MDsgaSA8PSBrOyBpKyspIHsKLQkJaW50IGosIGptb24gPSAwLCBtb24gPSAtMSwgbW94ID0gLTE7Ci0JCWZvciAoaj0wOyBqIDwgaXM7IGorKykgewotCQkJaWYgKG1vbiA8IDAgfHwgc2NvcmVbal0gPCBtb24pIHsKLQkJCQltb24gPSBzY29yZVtqXTsKLQkJCQlqbW9uID0gajsKLQkJCX0KLQkJCWlmIChtb3ggPCAwIHx8IHNjb3JlW2pdID4gbW94KSB7Ci0JCQkJbW94ID0gc2NvcmVbal07Ci0JCQl9Ci0JCX0KLQkJanVzZSA9IGptb247Ci0JCXNjb3JlW2p1c2VdID0gbW94KzEraTsKLQl9Ci0KLQlpZiAoanVzZSA+PSAwICYmIGp1c2UgPCBuKSB7Ci0JCWNoYXIgc3RyWzY0XTsKLQkJc3ByaW50ZihzdHIsICIlZHglZCslZCslZCIsIHhbanVzZV0ud2lkdGgsIHhbanVzZV0uaGVpZ2h0LAotCQkgICAgeFtqdXNlXS54X29yZywgeFtqdXNlXS55X29yZyk7Ci0JCWNsaXBfc3RyID0gc3RyZHVwKHN0cik7Ci0JCWRpZF94aW5lcmFtYV9jbGlwID0gMTsKLQl9IGVsc2UgewotCQljbGlwX3N0ciA9IHN0cmR1cCgiIik7Ci0JfQotCVhGcmVlX3dyKHgpOwotCWlmICghcXVpZXQpIHsKLQkJcmZiTG9nKCJzZXQgLWNsaXAgdG8gJyVzJyBmb3IgeGluZXJhbWElZFxuIiwgY2xpcF9zdHIsIGspOwotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX3hpbmVyYW1hICh2b2lkKSB7Ci0jaWYgIUxJQlZOQ1NFUlZFUl9IQVZFX0xJQlhJTkVSQU1BCi0JaWYgKCFyYXdfZmJfc3RyKSB7Ci0JCXJmYkxvZygiWGluZXJhbWE6IExpYnJhcnkgbGliWGluZXJhbWEgaXMgbm90IGF2YWlsYWJsZSB0byBkZXRlcm1pbmVcbiIpOwotCQlyZmJMb2coIlhpbmVyYW1hOiB0aGUgaGVhZCBnZW9tZXRyaWVzLCBjb25zaWRlciB1c2luZyAtYmxhY2tvdXRcbiIpOwotCQlyZmJMb2coIlhpbmVyYW1hOiBpZiB0aGUgc2NyZWVuIGlzIG5vbi1yZWN0YW5ndWxhci5cbiIpOwotCX0KLSNlbHNlCi0JWGluZXJhbWFTY3JlZW5JbmZvICpzYywgKnhpbmVyYW1hczsKLQlzcmFSZWdpb25QdHIgYmxhY2tfcmVnaW9uLCB0bXBfcmVnaW9uOwotCXNyYVJlY3RhbmdsZUl0ZXJhdG9yICppdGVyOwotCXNyYVJlY3QgcmVjdDsKLQljaGFyICpic3RyLCAqdHN0cjsKLQlpbnQgZXYsIGVyLCBpLCBuLCByY250OwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotCVhfTE9DSzsKLQlpZiAoISBYaW5lcmFtYVF1ZXJ5RXh0ZW5zaW9uKGRweSwgJmV2LCAmZXIpKSB7Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlyZmJMb2coIlhpbmVyYW1hOiBkaXNhYmxpbmc6IGRpc3BsYXkgZG9lcyBub3Qgc3VwcG9ydCBpdC5cbiIpOwotCQl9Ci0JCXhpbmVyYW1hID0gMDsKLQkJeGluZXJhbWFfcHJlc2VudCA9IDA7Ci0JCVhfVU5MT0NLOwotCQlyZXR1cm47Ci0JfQotCWlmICghIFhpbmVyYW1hSXNBY3RpdmUoZHB5KSkgewotCQkvKiBuLmIuIGNoYW5nZSB0byBYaW5lcmFtYUFjdGl2ZShkcHksIHdpbmRvdykgc29tZWRheSAqLwotCQlpZiAodmVyYm9zZSkgewotCQkJcmZiTG9nKCJYaW5lcmFtYTogZGlzYWJsaW5nOiBub3QgYWN0aXZlIG9uIGRpc3BsYXkuXG4iKTsKLQkJfQotCQl4aW5lcmFtYSA9IDA7Ci0JCXhpbmVyYW1hX3ByZXNlbnQgPSAwOwotCQlYX1VOTE9DSzsKLQkJcmV0dXJuOwotCX0KLQl4aW5lcmFtYV9wcmVzZW50ID0gMTsKLQlyZmJMb2coIlxuIik7Ci0JcmZiTG9nKCJYaW5lcmFtYSBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKGUuZy4gbXVsdGktaGVhZCkuXG4iKTsKLQotCS8qIG4uYi4gY2hhbmdlIHRvIFhpbmVyYW1hR2V0RGF0YSgpIHNvbWVkYXkgKi8KLQl4aW5lcmFtYXMgPSBYaW5lcmFtYVF1ZXJ5U2NyZWVucyhkcHksICZuKTsKLQlyZmJMb2coIlhpbmVyYW1hOiBudW1iZXIgb2Ygc3ViLXNjcmVlbnM6ICVkXG4iLCBuKTsKLQotCWlmICghIHVzZV94d2FycHBvaW50ZXIgJiYgISBnb3Rfbm94d2FycHBvaW50ZXIgJiYgbiA+IDEpIHsKLQkJcmZiTG9nKCJYaW5lcmFtYTogZW5hYmxpbmcgLXh3YXJwcG9pbnRlciBtb2RlIHRvIHRyeSB0byBjb3JyZWN0XG4iKTsKLQkJcmZiTG9nKCJYaW5lcmFtYTogbW91c2UgcG9pbnRlciBtb3Rpb24uIFhURVNUK1hJTkVSQU1BIGJ1Zy5cbiIpOwotCQlyZmJMb2coIlhpbmVyYW1hOiBVc2UgLW5veHdhcnBwb2ludGVyIHRvIGZvcmNlIFhURVNULlxuIik7Ci0JCXVzZV94d2FycHBvaW50ZXIgPSAxOwotCX0KLQotCWlmIChuID09IDEpIHsKLQkJcmZiTG9nKCJYaW5lcmFtYTogbm8gYmxhY2tvdXRzIG5lZWRlZCAob25seSBvbmUgc3ViLXNjcmVlbilcbiIpOwotCQlyZmJMb2coIlxuIik7Ci0JCVhGcmVlX3dyKHhpbmVyYW1hcyk7Ci0JCVhfVU5MT0NLOwotCQlyZXR1cm47CQkvKiBtdXN0IGJlIE9LIHcvbyBjaGFuZ2UgKi8KLQl9Ci0KLQlibGFja19yZWdpb24gPSBzcmFSZ25DcmVhdGVSZWN0KDAsIDAsIGRweV94LCBkcHlfeSk7Ci0KLQlzYyA9IHhpbmVyYW1hczsKLQlmb3IgKGk9MDsgaTxuOyBpKyspIHsKLQkJaW50IHgsIHksIHcsIGg7Ci0JCQotCQl4ID0gc2MtPnhfb3JnOwotCQl5ID0gc2MtPnlfb3JnOwotCQl3ID0gc2MtPndpZHRoOwotCQloID0gc2MtPmhlaWdodDsKLQotCQlyZmJMb2coIlhpbmVyYW1hOiBzdWItc2NyZWVuWyVkXSAgJWR4JWQrJWQrJWRcbiIsIGksIHcsIGgsIHgsIHkpOwotCi0JCXRtcF9yZWdpb24gPSBzcmFSZ25DcmVhdGVSZWN0KHgsIHksIHggKyB3LCB5ICsgaCk7Ci0KLQkJc3JhUmduU3VidHJhY3QoYmxhY2tfcmVnaW9uLCB0bXBfcmVnaW9uKTsKLQkJc3JhUmduRGVzdHJveSh0bXBfcmVnaW9uKTsKLQkJc2MrKzsKLQl9Ci0JWEZyZWVfd3IoeGluZXJhbWFzKTsKLQlYX1VOTE9DSzsKLQotCi0JaWYgKHNyYVJnbkVtcHR5KGJsYWNrX3JlZ2lvbikpIHsKLQkJcmZiTG9nKCJYaW5lcmFtYTogbm8gYmxhY2tvdXRzIG5lZWRlZCAoc2NyZWVuIGZpbGxzIgotCQkgICAgIiByZWN0YW5nbGUpXG4iKTsKLQkJcmZiTG9nKCJcbiIpOwotCQlzcmFSZ25EZXN0cm95KGJsYWNrX3JlZ2lvbik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRpZF94aW5lcmFtYV9jbGlwKSB7Ci0JCXJmYkxvZygiWGluZXJhbWE6IG5vIGJsYWNrb3V0cyBkdWUgdG8gLWNsaXAgeGluZXJhbWEuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG1heCBsZW4gaXMgMTAwMDB4MTAwMDArMTAwMDArMTAwMDAgKDIzIGNoYXJzKSBwZXIgZ2VvbWV0cnkgKi8KLQlyY250ID0gKGludCkgc3JhUmduQ291bnRSZWN0cyhibGFja19yZWdpb24pOwotCWJzdHIgPSAoY2hhciAqKSBtYWxsb2MoMzAgKiAocmNudCsxKSk7Ci0JdHN0ciA9IChjaGFyICopIG1hbGxvYygzMCk7Ci0JYnN0clswXSA9ICdcMCc7Ci0KLQlpdGVyID0gc3JhUmduR2V0SXRlcmF0b3IoYmxhY2tfcmVnaW9uKTsKLQl3aGlsZSAoc3JhUmduSXRlcmF0b3JOZXh0KGl0ZXIsICZyZWN0KSkgewotCQlpbnQgeCwgeSwgdywgaDsKLQotCQkvKiBtYWtlIHN1cmUgeDEgPCB4MiBhbmQgeTEgPCB5MiAqLwotCQlpZiAocmVjdC54MSA+IHJlY3QueDIpIHsKLQkJCWludCB0bXAgPSByZWN0LngyOwotCQkJcmVjdC54MiA9IHJlY3QueDE7Ci0JCQlyZWN0LngxID0gdG1wOwotCQl9Ci0JCWlmIChyZWN0LnkxID4gcmVjdC55MikgewotCQkJaW50IHRtcCA9IHJlY3QueTI7Ci0JCQlyZWN0LnkyID0gcmVjdC55MTsKLQkJCXJlY3QueTEgPSB0bXA7Ci0JCX0KLQkJeCA9IHJlY3QueDE7Ci0JCXkgPSByZWN0LnkxOwotCQl3ID0gcmVjdC54MiAtIHg7Ci0JCWggPSByZWN0LnkyIC0geTsKLQkJc3ByaW50Zih0c3RyLCAiJWR4JWQrJWQrJWQsIiwgdywgaCwgeCwgeSk7Ci0JCXN0cmNhdChic3RyLCB0c3RyKTsKLQl9Ci0Jc3JhUmduUmVsZWFzZUl0ZXJhdG9yKGl0ZXIpOwotCWluaXRpYWxpemVfYmxhY2tvdXRzKGJzdHIpOwotCXJmYkxvZygiXG4iKTsKLQotCWZyZWUoYnN0cik7Ci0JZnJlZSh0c3RyKTsKLSNlbmRpZgotfQotCi12b2lkIGluaXRpYWxpemVfYmxhY2tvdXRzX2FuZF94aW5lcmFtYSh2b2lkKSB7Ci0KLQlibGFja291dHMgPSAwOwotCWJsYWNrb3V0X3B0ciA9IDA7Ci0KLQlpZiAoYmxhY2tvdXRfc3RyICE9IE5VTEwpIHsKLQkJaW5pdGlhbGl6ZV9ibGFja291dHMoYmxhY2tvdXRfc3RyKTsKLQl9Ci0JaWYgKHhpbmVyYW1hKSB7Ci0JCWluaXRpYWxpemVfeGluZXJhbWEoKTsKLQl9Ci0JaWYgKGJsYWNrb3V0cykgewotCQlibGFja291dF90aWxlcygpOwotCQkvKiBzY2hlZHVsZSBhIGNvcHlfc2NyZWVuKCksIG5vdyBpcyB0b28gZWFybHkuICovCi0JCWRvX2NvcHlfc2NyZWVuID0gMTsKLQl9Ci19Ci0KLXZvaWQgcHVzaF9zbGVlcChpbnQgbikgewotCWludCBpOwotCWZvciAoaT0wOyBpPG47IGkrKykgewotCQlyZmJQRSgtMSk7Ci0JCWlmIChpICE9IG4tMSAmJiBkZWZlcl91cGRhdGUpIHsKLQkJCXVzbGVlcChkZWZlcl91cGRhdGUgKiAxMDAwKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIHRyeSB0byBmb3JjZWZ1bGx5IHB1c2ggYSBibGFjayBzY3JlZW4gdG8gYWxsIGNvbm5lY3RlZCBjbGllbnRzCi0gKi8KLXZvaWQgcHVzaF9ibGFja19zY3JlZW4oaW50IG4pIHsKLQlpbnQgTHggPSBkcHlfeCwgTHkgPSBkcHlfeTsKLQlpZiAoIXNjcmVlbikgewotCQlyZXR1cm47Ci0JfQotI2lmbmRlZiBOT19OQ0FDSEUKLQlpZiAobmNhY2hlID4gMCkgewotCQlMeSA9IGRweV95ICogKDErbmNhY2hlKTsKLQl9Ci0jZW5kaWYKLQl6ZXJvX2ZiKDAsIDAsIEx4LCBMeSk7Ci0JbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIEx4LCBMeSwgMCk7Ci0JcHVzaF9zbGVlcChuKTsKLX0KLQotdm9pZCByZWZyZXNoX3NjcmVlbihpbnQgcHVzaCkgewotCWludCBpOwotCWlmICghc2NyZWVuKSB7Ci0JCXJldHVybjsKLQl9Ci0JbWFya19yZWN0X2FzX21vZGlmaWVkKDAsIDAsIGRweV94LCBkcHlfeSwgMCk7Ci0JZm9yIChpPTA7IGk8cHVzaDsgaSsrKSB7Ci0JCXJmYlBFKC0xKTsKLQl9Ci19Ci0KLS8qCi0gKiBGaWxsIHRoZSBmcmFtZWJ1ZmZlciB3aXRoIHplcm8gZm9yIHRoZSBwcmVzY3JpYmVkIHJlY3RhbmdsZQotICovCi12b2lkIHplcm9fZmIoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JaW50IHBpeGVsc2l6ZSA9IGJwcC84OwotCWludCBsaW5lLCBmaWxsID0gMCwgeWZhYyA9IDE7Ci0JY2hhciAqZHN0OwotCi0jaWZuZGVmIE5PX05DQUNIRQotCWlmIChuY2FjaGUgPiAwKSB7Ci0JCXlmYWMgPSAxK25jYWNoZTsKLQkJaWYgKG5jYWNoZV94cm9vdHBtYXApIHsKLQkJCXlmYWMrKzsKLQkJfQotCX0KLSNlbmRpZgotCQotCWlmICh4MSA8IDAgfHwgeDIgPD0geDEgfHwgeDIgPiBkcHlfeCkgewotCQlyZXR1cm47Ci0JfQotCWlmICh5MSA8IDAgfHwgeTIgPD0geTEgfHwgeTIgPiB5ZmFjICogZHB5X3kpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISBtYWluX2ZiKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlkc3QgPSBtYWluX2ZiICsgeTEgKiBtYWluX2J5dGVzX3Blcl9saW5lICsgeDEgKiBwaXhlbHNpemU7Ci0JbGluZSA9IHkxOwotCXdoaWxlIChsaW5lKysgPCB5MikgewotCQltZW1zZXQoZHN0LCBmaWxsLCAoc2l6ZV90KSAoeDIgLSB4MSkgKiBwaXhlbHNpemUpOwotCQlkc3QgKz0gbWFpbl9ieXRlc19wZXJfbGluZTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEveDExdm5jL3hpbmVyYW1hLmggYi94MTF2bmMveGluZXJhbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkMDBjZi4uMDAwMDAwMAotLS0gYS94MTF2bmMveGluZXJhbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfWDExVk5DX1hJTkVSQU1BX0gKLSNkZWZpbmUgX1gxMVZOQ19YSU5FUkFNQV9ICi0KLS8qIC0tIHhpbmVyYW1hLmggLS0gKi8KLSNpbmNsdWRlICJibGFja291dF90LmgiCi0KLWV4dGVybiBibGFja291dF90IGJsYWNrcltdOwotZXh0ZXJuIHRpbGVfYmxhY2tvdXRfdCAqdGlsZV9ibGFja291dDsKLWV4dGVybiBpbnQgYmxhY2tvdXRzOwotCi1leHRlcm4gdm9pZCBpbml0aWFsaXplX2JsYWNrb3V0c19hbmRfeGluZXJhbWEodm9pZCk7Ci1leHRlcm4gdm9pZCBwdXNoX3NsZWVwKGludCBuKTsKLWV4dGVybiB2b2lkIHB1c2hfYmxhY2tfc2NyZWVuKGludCBuKTsKLWV4dGVybiB2b2lkIHJlZnJlc2hfc2NyZWVuKGludCBwdXNoKTsKLWV4dGVybiB2b2lkIHplcm9fZmIoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLWV4dGVybiB2b2lkIGNoZWNrX3hpbmVyYW1hX2NsaXAodm9pZCk7Ci0KLSNlbmRpZiAvKiBfWDExVk5DX1hJTkVSQU1BX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy94a2JfYmVsbC5jIGIveDExdm5jL3hrYl9iZWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTYzZDYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hrYl9iZWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0vKiAtLSB4a2JfYmVsbC5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotCi0vKgotICogQmVsbCBldmVudCBoYW5kbGluZy4gIFJlcXVpcmVzIFhLRVlCT0FSRCBleHRlbnNpb24uCi0gKi8KLWludCB4a2JfYmFzZV9ldmVudF90eXBlID0gMDsKLQotdm9pZCBpbml0aWFsaXplX3hrYih2b2lkKTsKLXZvaWQgaW5pdGlhbGl6ZV93YXRjaF9iZWxsKHZvaWQpOwotdm9pZCBjaGVja19iZWxsX2V2ZW50KHZvaWQpOwotCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YS0VZQk9BUkQKLQotLyoKLSAqIGNoZWNrIGZvciBYS0VZQk9BUkQsIHNldCB1cCB4a2JfYmFzZV9ldmVudF90eXBlCi0gKi8KLXZvaWQgaW5pdGlhbGl6ZV94a2Iodm9pZCkgewotCWludCBpciwgcmVhc29uOwotCWludCBvcCwgZXYsIGVyLCBtYWosIG1pbjsKLQkKLQlSQVdGQl9SRVRfVk9JRAotCi0JaWYgKHhrYmNvbXBhdCkgewotCQl4a2JfcHJlc2VudCA9IDA7Ci0JfSBlbHNlIGlmICghIFhrYlF1ZXJ5RXh0ZW5zaW9uKGRweSwgJm9wLCAmZXYsICZlciwgJm1haiwgJm1pbikpIHsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygid2FybmluZzogWEtFWUJPQVJEIGV4dGVuc2lvbiBub3QgcHJlc2VudC5cbiIpOwotCQl9Ci0JCXhrYl9wcmVzZW50ID0gMDsKLQl9IGVsc2UgewotCQl4a2JfcHJlc2VudCA9IDE7Ci0JfQotCi0JaWYgKCEgeGtiX3ByZXNlbnQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHhhdXRoX3JhdygxKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgWGtiT3BlbkRpc3BsYXkoRGlzcGxheVN0cmluZyhkcHkpLCAmeGtiX2Jhc2VfZXZlbnRfdHlwZSwgJmlyLAotCSAgICBOVUxMLCBOVUxMLCAmcmVhc29uKSApIHsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygid2FybmluZzogZGlzYWJsaW5nIFhLRVlCT0FSRC4gWGtiT3BlbkRpc3BsYXkiCi0JCQkgICAgIiBmYWlsZWQuXG4iKTsKLQkJfQotCQl4a2JfYmFzZV9ldmVudF90eXBlID0gMDsKLQkJeGtiX3ByZXNlbnQgPSAwOwotCX0KLQl4YXV0aF9yYXcoMCk7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV93YXRjaF9iZWxsKHZvaWQpIHsKLQlpZiAoISB4a2JfcHJlc2VudCkgewotCQlpZiAoISBxdWlldCkgewotCQkJcmZiTG9nKCJ3YXJuaW5nOiBkaXNhYmxpbmcgYmVsbC4gWEtFWUJPQVJEIGV4dC4gIgotCQkJICAgICJub3QgcHJlc2VudC5cbiIpOwotCQl9Ci0JCXdhdGNoX2JlbGwgPSAwOwotCQlzb3VuZF9iZWxsID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCVJBV0ZCX1JFVF9WT0lECi0KLQlYa2JTZWxlY3RFdmVudHMoZHB5LCBYa2JVc2VDb3JlS2JkLCBYa2JCZWxsTm90aWZ5TWFzaywgMCk7Ci0KLQlpZiAoISB3YXRjaF9iZWxsKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCEgWGtiU2VsZWN0RXZlbnRzKGRweSwgWGtiVXNlQ29yZUtiZCwgWGtiQmVsbE5vdGlmeU1hc2ssCi0JICAgIFhrYkJlbGxOb3RpZnlNYXNrKSApIHsKLQkJaWYgKCEgcXVpZXQpIHsKLQkJCXJmYkxvZygid2FybmluZzogZGlzYWJsaW5nIGJlbGwuIFhrYlNlbGVjdEV2ZW50cyIKLQkJCSAgICAiIGZhaWxlZC5cbiIpOwotCQl9Ci0JCXdhdGNoX2JlbGwgPSAwOwotCQlzb3VuZF9iZWxsID0gMDsKLQl9Ci19Ci0KLS8qCi0gKiBXZSBjYWxsIHRoaXMgcGVyaW9kaWNhbGx5IHRvIHByb2Nlc3MgYW55IGJlbGwgZXZlbnRzIHRoYXQgaGF2ZSAKLSAqIHRha2VuIHBsYWNlLgotICovCi12b2lkIGNoZWNrX2JlbGxfZXZlbnQodm9pZCkgewotCVhFdmVudCB4ZXY7Ci0JWGtiQW55RXZlbnQgKnhrYl9ldjsKLQlpbnQgZ290X2JlbGwgPSAwOwotCi0JaWYgKCEgeGtiX2Jhc2VfZXZlbnRfdHlwZSkgewotCQlyZXR1cm47Ci0JfQotCVJBV0ZCX1JFVF9WT0lECi0KLQkvKiBjYWxsZXIgZG9lcyBYX0xPQ0sgKi8KLQlpZiAoISBYQ2hlY2tUeXBlZEV2ZW50KGRweSwgeGtiX2Jhc2VfZXZlbnRfdHlwZSwgJnhldikpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoISB3YXRjaF9iZWxsKSB7Ci0JCS8qIHdlIHJldHVybiBoZXJlIHRvIGF2b2lkIHhrYiBldmVudHMgcGlsaW5nIHVwICovCi0JCXJldHVybjsKLQl9Ci0KLQl4a2JfZXYgPSAoWGtiQW55RXZlbnQgKikgJnhldjsKLQlpZiAoeGtiX2V2LT54a2JfdHlwZSA9PSBYa2JCZWxsTm90aWZ5KSB7Ci0JCWdvdF9iZWxsID0gMTsKLQl9Ci0KLQlpZiAoZ290X2JlbGwgJiYgc291bmRfYmVsbCkgewotCQlpZiAoISBhbGxfY2xpZW50c19pbml0aWFsaXplZCgpKSB7Ci0JCQlyZmJMb2coImNoZWNrX2JlbGxfZXZlbnQ6IG5vdCBzZW5kaW5nIGJlbGw6ICIKLQkJCSAgICAidW5pbml0aWFsaXplZCBjbGllbnRzXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzY3JlZW4gJiYgY2xpZW50X2NvdW50KSB7Ci0JCQkJcmZiU2VuZEJlbGwoc2NyZWVuKTsKLQkJCX0KLQkJfQotCX0KLX0KLSNlbHNlCi12b2lkIGluaXRpYWxpemVfd2F0Y2hfYmVsbCh2b2lkKSB7Ci0Jd2F0Y2hfYmVsbCA9IDA7Ci0Jc291bmRfYmVsbCA9IDA7Ci19Ci12b2lkIGNoZWNrX2JlbGxfZXZlbnQodm9pZCkge30KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy94a2JfYmVsbC5oIGIveDExdm5jL3hrYl9iZWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzYyZTcuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hrYl9iZWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgS2FybCBKLiBSdW5nZSA8cnVuZ2VAa2FybHJ1bmdlLmNvbT4gCi0gICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB4MTF2bmMuCi0KLXgxMXZuYyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLXgxMXZuYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHgxMXZuYzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLW9yIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUluIGFkZGl0aW9uLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBLYXJsIEouIFJ1bmdlCi1naXZlcyBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgaXRzIHJlbGVhc2Ugb2YgeDExdm5jIHdpdGggdGhlCi1PcGVuU1NMIHByb2plY3QncyAiT3BlblNTTCIgbGlicmFyeSAob3Igd2l0aCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBpdAotdGhhdCB1c2UgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgIk9wZW5TU0wiIGxpYnJhcnkpLCBhbmQgZGlzdHJpYnV0ZQotdGhlIGxpbmtlZCBleGVjdXRhYmxlcy4gIFlvdSBtdXN0IG9iZXkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1pbiBhbGwgcmVzcGVjdHMgZm9yIGFsbCBvZiB0aGUgY29kZSB1c2VkIG90aGVyIHRoYW4gIk9wZW5TU0wiLiAgSWYgeW91Ci1tb2RpZnkgdGhpcyBmaWxlLCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlCi1maWxlLCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi1zbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX1gxMVZOQ19YS0JfQkVMTF9ICi0jZGVmaW5lIF9YMTFWTkNfWEtCX0JFTExfSAotCi0vKiAtLSB4a2JfYmVsbC5oIC0tICovCi0KLWV4dGVybiBpbnQgeGtiX2Jhc2VfZXZlbnRfdHlwZTsKLQotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV94a2Iodm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX3dhdGNoX2JlbGwodm9pZCk7Ci1leHRlcm4gdm9pZCBjaGVja19iZWxsX2V2ZW50KHZvaWQpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19YS0JfQkVMTF9IICovCmRpZmYgLS1naXQgYS94MTF2bmMveHJhbmRyLmMgYi94MTF2bmMveHJhbmRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDY4ZTEuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hyYW5kci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geHJhbmRyLmMgLS0gKi8KLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgInJlbW90ZS5oIgotI2luY2x1ZGUgInNjcmVlbi5oIgotI2luY2x1ZGUgIndpbl91dGlscy5oIgotCi10aW1lX3QgbGFzdF9zdWJ3aW5fdHJhcCA9IDA7Ci1pbnQgc3Vid2luX3RyYXBfY291bnQgPSAwOwotWEVycm9ySGFuZGxlciBvbGRfZ2V0aW1hZ2VfaGFuZGxlcjsKLQotaW50IHhyYW5kcl9wcmVzZW50ID0gMDsKLWludCB4cmFuZHJfd2lkdGggID0gLTE7Ci1pbnQgeHJhbmRyX2hlaWdodCA9IC0xOwotaW50IHhyYW5kcl9yb3RhdGlvbiA9IC0xOwotVGltZSB4cmFuZHJfdGltZXN0YW1wID0gMDsKLVRpbWUgeHJhbmRyX2NmZ190aW1lID0gMDsKLQotdm9pZCBpbml0aWFsaXplX3hyYW5kcih2b2lkKTsKLWludCBjaGVja194cmFuZHJfZXZlbnQoY2hhciAqbXNnKTsKLWludCBrbm93bl94cmFuZHJfbW9kZShjaGFyICpzKTsKLQotc3RhdGljIGludCBoYW5kbGVfc3Vid2luX3Jlc2l6ZShjaGFyICptc2cpOwotc3RhdGljIHZvaWQgaGFuZGxlX3hyYW5kcl9jaGFuZ2UoaW50IG5ld194LCBpbnQgbmV3X3kpOwotCi0KLXZvaWQgaW5pdGlhbGl6ZV94cmFuZHIodm9pZCkgewotCWlmICh4cmFuZHJfcHJlc2VudCAmJiBkcHkpIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYUkFORFIKLQkJUm90YXRpb24gcm90OwotCi0JCVhfTE9DSzsKLQkJeHJhbmRyX3dpZHRoICA9IFhEaXNwbGF5V2lkdGgoZHB5LCBzY3IpOwotCQl4cmFuZHJfaGVpZ2h0ID0gWERpc3BsYXlIZWlnaHQoZHB5LCBzY3IpOwotCQlYUlJSb3RhdGlvbnMoZHB5LCBzY3IsICZyb3QpOwotCQl4cmFuZHJfcm90YXRpb24gPSAoaW50KSByb3Q7Ci0JCWlmICh4cmFuZHIgfHwgeHJhbmRyX21heWJlKSB7Ci0JCQlYUlJTZWxlY3RJbnB1dChkcHksIHJvb3R3aW4sIFJSU2NyZWVuQ2hhbmdlTm90aWZ5TWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQlYUlJTZWxlY3RJbnB1dChkcHksIHJvb3R3aW4sIDApOwotCQl9Ci0JCVhfVU5MT0NLOwotI2VuZGlmCi0JfSBlbHNlIGlmICh4cmFuZHIpIHsKLQkJcmZiTG9nKCIteHJhbmRyIG1vZGUgc3BlY2lmaWVkLCBidXQgbm8gUkFORFIgc3VwcG9ydCBvblxuIik7Ci0JCXJmYkxvZygiIGRpc3BsYXkgb3IgaW4gY2xpZW50IGxpYnJhcnkuIERpc2FibGluZyAteHJhbmRyICIKLQkJICAgICJtb2RlLlxuIik7Ci0JCXhyYW5kciA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9zdWJ3aW5fcmVzaXplKGNoYXIgKm1zZykgewotCWludCBuZXdfeCwgbmV3X3k7Ci0JaW50IGksIGNoZWNrID0gMTAsIG1zID0gMjUwOwkvKiAyLjUgc2VjcyB0b3RhbC4uLiAqLwotCi0JaWYgKG1zZykge30JLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQlpZiAoISBzdWJ3aW4pIHsKLQkJcmV0dXJuIDA7CS8qIGhtbW0uLi4gKi8KLQl9Ci0JaWYgKCEgdmFsaWRfd2luZG93KHN1YndpbiwgTlVMTCwgMCkpIHsKLQkJcmZiTG9nRW5hYmxlKDEpOwotCQlyZmJMb2coInN1YndpbiAweCVseCB3ZW50IGF3YXkhXG4iLCBzdWJ3aW4pOwotCQlYX1VOTE9DSzsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JaWYgKCEgZ2V0X3dpbmRvd19zaXplKHN1YndpbiwgJm5ld194LCAmbmV3X3kpKSB7Ci0JCXJmYkxvZ0VuYWJsZSgxKTsKLQkJcmZiTG9nKCJjb3VsZCBub3QgZ2V0IHNpemUgb2Ygc3Vid2luIDB4JWx4XG4iLCBzdWJ3aW4pOwotCQlYX1VOTE9DSzsKLQkJY2xlYW5fdXBfZXhpdCgxKTsKLQl9Ci0JaWYgKHdkcHlfeCA9PSBuZXdfeCAmJiB3ZHB5X3kgPT0gbmV3X3kpIHsKLQkJLyogbm8gY2hhbmdlICovCi0JCXJldHVybiAwOwotCX0KLQotCS8qIHdpbmRvdyBtYXkgc3RpbGwgYmUgY2hhbmdpbmcgKGUuZy4gZHJhZyByZXNpemUpICovCi0JZm9yIChpPTA7IGkgPCBjaGVjazsgaSsrKSB7Ci0JCWludCBuZXdlcl94LCBuZXdlcl95OwotCQl1c2xlZXAobXMgKiAxMDAwKTsKLQotCQlpZiAoISBnZXRfd2luZG93X3NpemUoc3Vid2luLCAmbmV3ZXJfeCwgJm5ld2VyX3kpKSB7Ci0JCQlyZmJMb2dFbmFibGUoMSk7Ci0JCQlyZmJMb2coImNvdWxkIG5vdCBnZXQgc2l6ZSBvZiBzdWJ3aW4gMHglbHhcbiIsIHN1Yndpbik7Ci0JCQljbGVhbl91cF9leGl0KDEpOwotCQl9Ci0JCWlmIChuZXdfeCA9PSBuZXdlcl94ICYmIG5ld195ID09IG5ld2VyX3kpIHsKLQkJCS8qIGdvIGZvciBpdC4uLiAqLwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coInN1YndpbiAweCVseCBzdGlsbCBjaGFuZ2luZyBzaXplLi4uXG4iLCBzdWJ3aW4pOwotCQkJbmV3X3ggPSBuZXdlcl94OwotCQkJbmV3X3kgPSBuZXdlcl95OwotCQl9Ci0JfQotCi0JcmZiTG9nKCJzdWJ3aW4gMHglbHggbmV3IHNpemU6IHg6ICVkIC0+ICVkLCB5OiAlZCAtPiAlZFxuIiwKLQkgICAgc3Vid2luLCB3ZHB5X3gsIG5ld194LCB3ZHB5X3ksIG5ld195KTsKLQlyZmJMb2coImNhbGxpbmcgaGFuZGxlX3hyYW5kcl9jaGFuZ2UoKSBmb3IgcmVzaXppbmdcbiIpOwotCi0JWF9VTkxPQ0s7Ci0JaGFuZGxlX3hyYW5kcl9jaGFuZ2UobmV3X3gsIG5ld195KTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX3hyYW5kcl9jaGFuZ2UoaW50IG5ld194LCBpbnQgbmV3X3kpIHsKLQlyZmJDbGllbnRJdGVyYXRvclB0ciBpdGVyOwotCXJmYkNsaWVudFB0ciBjbDsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLQkvKiBhc3N1bWVzIG5vIFhfTE9DSyAqLwotCi0JLyogc2FuaXR5IGNoZWNrIHhyYW5kcl9tb2RlICovCi0JaWYgKCEgeHJhbmRyX21vZGUpIHsKLQkJeHJhbmRyX21vZGUgPSBzdHJkdXAoImRlZmF1bHQiKTsKLQl9IGVsc2UgaWYgKCEga25vd25feHJhbmRyX21vZGUoeHJhbmRyX21vZGUpKSB7Ci0JCWZyZWUoeHJhbmRyX21vZGUpOwotCQl4cmFuZHJfbW9kZSA9IHN0cmR1cCgiZGVmYXVsdCIpOwotCX0KLQlyZmJMb2coInhyYW5kcl9tb2RlOiAlc1xuIiwgeHJhbmRyX21vZGUpOwotCWlmICghc3RyY21wKHhyYW5kcl9tb2RlLCAiZXhpdCIpKSB7Ci0JCWNsb3NlX2FsbF9jbGllbnRzKCk7Ci0JCXJmYkxvZygiICBzaHV0dGluZyBkb3duIGR1ZSB0byBYUkFORFIgZXZlbnQuXG4iKTsKLQkJY2xlYW5fdXBfZXhpdCgwKTsKLQl9Ci0JaWYgKCFzdHJjbXAoeHJhbmRyX21vZGUsICJuZXdmYnNpemUiKSAmJiBzY3JlZW4pIHsKLQkJaXRlciA9IHJmYkdldENsaWVudEl0ZXJhdG9yKHNjcmVlbik7Ci0JCXdoaWxlKCAoY2wgPSByZmJDbGllbnRJdGVyYXRvck5leHQoaXRlcikpICkgewotCQkJaWYgKGNsLT51c2VOZXdGQlNpemUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJmYkxvZygiICBjbG9zaW5nIGNsaWVudCAlcyAobm8gdXNlTmV3RkJTaXplIgotCQkJICAgICIgc3VwcG9ydCkuXG4iLCBjbC0+aG9zdCk7Ci0JCQlyZmJDbG9zZUNsaWVudChjbCk7Ci0JCQlyZmJDbGllbnRDb25uZWN0aW9uR29uZShjbCk7Ci0JCX0KLQkJcmZiUmVsZWFzZUNsaWVudEl0ZXJhdG9yKGl0ZXIpOwotCX0KLQkKLQkvKiBkZWZhdWx0LCByZXNpemUsIGFuZCBuZXdmYnNpemUgY3JlYXRlIGEgbmV3IGZiOiAqLwotCXJmYkxvZygiY2hlY2tfeHJhbmRyX2V2ZW50OiB0cnlpbmcgdG8gY3JlYXRlIG5ldyBmcmFtZWJ1ZmZlci4uLlxuIik7Ci0JaWYgKG5ld194IDwgd2RweV94IHx8IG5ld195IDwgd2RweV95KSB7Ci0JCWNoZWNrX2JsYWNrX2ZiKCk7Ci0JfQotCWRvX25ld19mYigxKTsKLQlyZmJMb2coImNoZWNrX3hyYW5kcl9ldmVudDogZmIgICAgICAgV3hIOiAlZHglZFxuIiwgd2RweV94LCB3ZHB5X3kpOwotfQotCi1pbnQgY2hlY2tfeHJhbmRyX2V2ZW50KGNoYXIgKm1zZykgewotCVhFdmVudCB4ZXY7Ci0KLQlSQVdGQl9SRVQoMCkKLQotCS8qIGl0IGlzIGFzc3VtZWQgdGhhdCBYX0xPQ0sgaXMgb24gYXQgdGhpcyBwb2ludC4gKi8KLQotCWlmIChzdWJ3aW4pIHsKLQkJcmV0dXJuIGhhbmRsZV9zdWJ3aW5fcmVzaXplKG1zZyk7Ci0JfQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhSQU5EUgotCWlmICghIHhyYW5kcl9wcmVzZW50KSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoISB4cmFuZHIgJiYgISB4cmFuZHJfbWF5YmUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQlpZiAoeHJhbmRyX2Jhc2VfZXZlbnRfdHlwZSAmJiBYQ2hlY2tUeXBlZEV2ZW50KGRweSwKLQkgICAgeHJhbmRyX2Jhc2VfZXZlbnRfdHlwZSArIFJSU2NyZWVuQ2hhbmdlTm90aWZ5LCAmeGV2KSkgewotCQlpbnQgZG9fY2hhbmdlLCBxb3V0ID0gMDsKLQkJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JCVhSUlNjcmVlbkNoYW5nZU5vdGlmeUV2ZW50ICpyZXY7Ci0KLQkJcmV2ID0gKFhSUlNjcmVlbkNoYW5nZU5vdGlmeUV2ZW50ICopICZ4ZXY7Ci0KLQkJaWYgKGZpcnN0ICYmICEgeHJhbmRyKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQlpZiAoZ2V0ZW52KCJYMTFWTkNfREVCVUdfWFJBTkRSIikgPT0gTlVMTCkgewotCQkJCXFvdXQgPSAxOwotCQkJfQotCQl9Ci0JCWZpcnN0ID0gMDsKLQkJCQotCQlyZmJMb2coImNoZWNrX3hyYW5kcl9ldmVudCgpOlxuIik7Ci0JCXJmYkxvZygiRGV0ZWN0ZWQgWFJBTkRSIGV2ZW50IGF0IGxvY2F0aW9uICclcyc6XG4iLCBtc2cpOwotCi0JCWlmIChxb3V0KSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlyZmJMb2coIiAgc2VyaWFsOiAgICAgICAgICAlZFxuIiwgKGludCkgcmV2LT5zZXJpYWwpOwotCQkJcmZiTG9nKCIgIHRpbWVzdGFtcDogICAgICAgJWRcbiIsIChpbnQpIHJldi0+dGltZXN0YW1wKTsKLQkJCXJmYkxvZygiICBjZmdfdGltZXN0YW1wOiAgICVkXG4iLCAoaW50KSByZXYtPmNvbmZpZ190aW1lc3RhbXApOwotCQkJcmZiTG9nKCIgIHNpemVfaWQ6ICAgICAgICAgJWRcbiIsIChpbnQpIHJldi0+c2l6ZV9pbmRleCk7Ci0JCQlyZmJMb2coIiAgc3ViX3BpeGVsOiAgICAgICAlZFxuIiwgKGludCkgcmV2LT5zdWJwaXhlbF9vcmRlcik7Ci0JCQlyZmJMb2coIiAgcm90YXRpb246ICAgICAgICAlZFxuIiwgKGludCkgcmV2LT5yb3RhdGlvbik7Ci0JCQlyZmJMb2coIiAgd2lkdGg6ICAgICAgICAgICAlZFxuIiwgKGludCkgcmV2LT53aWR0aCk7Ci0JCQlyZmJMb2coIiAgaGVpZ2h0OiAgICAgICAgICAlZFxuIiwgKGludCkgcmV2LT5oZWlnaHQpOwotCQkJcmZiTG9nKCIgIG13aWR0aDogICAgICAgICAgJWQgbW1cbiIsIChpbnQpIHJldi0+bXdpZHRoKTsKLQkJCXJmYkxvZygiICBtaGVpZ2h0OiAgICAgICAgICVkIG1tXG4iLCAoaW50KSByZXYtPm1oZWlnaHQpOwotCQkJcmZiTG9nKCJcbiIpOwotCQkJcmZiTG9nKCJjaGVja194cmFuZHJfZXZlbnQ6IHByZXZpb3VzIFd4SDogJWR4JWRcbiIsCi0JCQkgICAgd2RweV94LCB3ZHB5X3kpOwotCQl9Ci0KLQkJaWYgKHdkcHlfeCA9PSByZXYtPndpZHRoICYmIHdkcHlfeSA9PSByZXYtPmhlaWdodCAmJgotCQkgICAgeHJhbmRyX3JvdGF0aW9uID09IChpbnQpIHJldi0+cm90YXRpb24pIHsKLQkJCXJmYkxvZygiY2hlY2tfeHJhbmRyX2V2ZW50OiBubyBjaGFuZ2UgZGV0ZWN0ZWQuXG4iKTsKLQkJCWRvX2NoYW5nZSA9IDA7Ci0JCQlpZiAoISB4cmFuZHIpIHsKLQkJICAgIAkJcmZiTG9nKCJjaGVja194cmFuZHJfZXZlbnQ6ICIKLQkJCQkgICAgImVuYWJsaW5nIGZ1bGwgWFJBTkRSIHRyYXBwaW5nIGFueXdheS5cbiIpOwotCQkJCXhyYW5kciA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkb19jaGFuZ2UgPSAxOwotCQkJaWYgKCEgeHJhbmRyKSB7Ci0JCSAgICAJCXJmYkxvZygiY2hlY2tfeHJhbmRyX2V2ZW50OiBSZXNpemU7ICIKLQkJCQkgICAgImVuYWJsaW5nIGZ1bGwgWFJBTkRSIHRyYXBwaW5nLlxuIik7Ci0JCQkJeHJhbmRyID0gMTsKLQkJCX0KLQkJfQotCi0JCXhyYW5kcl93aWR0aCAgPSByZXYtPndpZHRoOwotCQl4cmFuZHJfaGVpZ2h0ID0gcmV2LT5oZWlnaHQ7Ci0JCXhyYW5kcl90aW1lc3RhbXAgPSByZXYtPnRpbWVzdGFtcDsKLQkJeHJhbmRyX2NmZ190aW1lICA9IHJldi0+Y29uZmlnX3RpbWVzdGFtcDsKLQkJeHJhbmRyX3JvdGF0aW9uID0gKGludCkgcmV2LT5yb3RhdGlvbjsKLQotCQlpZiAoISBxb3V0KSByZmJMb2coImNoZWNrX3hyYW5kcl9ldmVudDogdXBkYXRpbmcgY29uZmlnLi4uXG4iKTsKLQkJWFJSVXBkYXRlQ29uZmlndXJhdGlvbigmeGV2KTsKLQotCQlpZiAoZG9fY2hhbmdlKSB7Ci0JCQkvKiB1bmRlciBkb19jaGFuZ2UgY2FsbGVyIG5vcm1hbGx5IHJldHVybnMgYmVmb3JlIGl0cyBYX1VOTE9DSyAqLwotCQkJWF9VTkxPQ0s7Ci0JCQloYW5kbGVfeHJhbmRyX2NoYW5nZShyZXYtPndpZHRoLCByZXYtPmhlaWdodCk7Ci0JCX0KLQkJaWYgKHFvdXQpIHsKLQkJCXJldHVybiBkb19jaGFuZ2U7Ci0JCX0KLQkJcmZiTG9nKCJjaGVja194cmFuZHJfZXZlbnQ6IGN1cnJlbnQgIFd4SDogJWR4JWRcbiIsCi0JCSAgICBYRGlzcGxheVdpZHRoKGRweSwgc2NyKSwgWERpc3BsYXlIZWlnaHQoZHB5LCBzY3IpKTsKLQkJcmZiTG9nKCJjaGVja194cmFuZHJfZXZlbnQoKTogcmV0dXJuaW5nIGNvbnRyb2wgdG8iCi0JCSAgICAiIGNhbGxlci4uLlxuIik7Ci0KLQotCQlyZXR1cm4gZG9fY2hhbmdlOwotCX0KLSNlbHNlCi0JeGV2LnR5cGUgPSAwOwotI2VuZGlmCi0KLQotCXJldHVybiAwOwotfQotCi1pbnQga25vd25feHJhbmRyX21vZGUoY2hhciAqcykgewotLyoKLSAqIGRlZmF1bHQ6CQotICogcmVzaXplOgl0aGUgZGVmYXVsdAotICogZXhpdDoJc2h1dGRvd24gY2xpZW50cyBhbmQgZXhpdC4KLSAqIG5ld2Zic2l6ZToJc2h1dGRvd24gY2xpZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IE5ld0ZCU2l6ZSBlbmNvZGluZy4KLSAqLwotCWlmIChzdHJjbXAocywgImRlZmF1bHQiKSAmJiBzdHJjbXAocywgInJlc2l6ZSIpICYmIAotCSAgICBzdHJjbXAocywgImV4aXQiKSAmJiBzdHJjbXAocywgIm5ld2Zic2l6ZSIpKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS94MTF2bmMveHJhbmRyLmggYi94MTF2bmMveHJhbmRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODk4ZjYuLjAwMDAwMDAKLS0tIGEveDExdm5jL3hyYW5kci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfWFJBTkRSX0gKLSNkZWZpbmUgX1gxMVZOQ19YUkFORFJfSAotCi0vKiAtLSB4cmFuZHIuaCAtLSAqLwotCi1leHRlcm4gdGltZV90IGxhc3Rfc3Vid2luX3RyYXA7Ci1leHRlcm4gaW50IHN1Yndpbl90cmFwX2NvdW50OwotZXh0ZXJuIFhFcnJvckhhbmRsZXIgb2xkX2dldGltYWdlX2hhbmRsZXI7Ci0KLWV4dGVybiBpbnQgeHJhbmRyX3ByZXNlbnQ7Ci1leHRlcm4gaW50IHhyYW5kcl93aWR0aDsKLWV4dGVybiBpbnQgeHJhbmRyX2hlaWdodDsKLWV4dGVybiBpbnQgeHJhbmRyX3JvdGF0aW9uOwotZXh0ZXJuIFRpbWUgeHJhbmRyX3RpbWVzdGFtcDsKLWV4dGVybiBUaW1lIHhyYW5kcl9jZmdfdGltZTsKLQotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV94cmFuZHIodm9pZCk7Ci1leHRlcm4gaW50IGNoZWNrX3hyYW5kcl9ldmVudChjaGFyICptc2cpOwotZXh0ZXJuIGludCBrbm93bl94cmFuZHJfbW9kZShjaGFyICpzKTsKLQotI2RlZmluZSBYUkFORFJfU0VUX1RSQVBfUkVUKHgseSkgIFwKLQlpZiAoc3Vid2luIHx8IHhyYW5kcikgeyBcCi0JCXRyYXBwZWRfZ2V0aW1hZ2VfeGVycm9yID0gMDsgXAotCQlvbGRfZ2V0aW1hZ2VfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF9nZXRpbWFnZV94ZXJyb3IpOyBcCi0JCWlmIChjaGVja194cmFuZHJfZXZlbnQoeSkpIHsgXAotCQkJdHJhcHBlZF9nZXRpbWFnZV94ZXJyb3IgPSAwOyBcCi0JCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9nZXRpbWFnZV9oYW5kbGVyKTsJIFwKLQkJCVhfVU5MT0NLOyBcCi0JCQlyZXR1cm4oeCk7IFwKLQkJfSBcCi0JfQotI2RlZmluZSBYUkFORFJfQ0hLX1RSQVBfUkVUKHgseSkgIFwKLQlpZiAoc3Vid2luIHx8IHhyYW5kcikgeyBcCi0JCWlmICh0cmFwcGVkX2dldGltYWdlX3hlcnJvcikgeyBcCi0JCQlpZiAoc3Vid2luKSB7IFwKLQkJCQlzdGF0aWMgaW50IGxhc3QgPSAwOyBcCi0JCQkJc3Vid2luX3RyYXBfY291bnQrKzsgXAotCQkJCWlmICh0aW1lKE5VTEwpID4gbGFzdF9zdWJ3aW5fdHJhcCArIDYwKSB7IFwKLQkJCQkJcmZiTG9nKCJ0cmFwcGVkIEdldEltYWdlIHhlcnJvciIgXAotCQkJCQkgICAgIiBpbiBTVUJXSU4gbW9kZS4gWyVkXVxuIiwgXAotCQkJCQkgICAgc3Vid2luX3RyYXBfY291bnQpOyBcCi0JCQkJCWxhc3Rfc3Vid2luX3RyYXAgPSB0aW1lKE5VTEwpOyBcCi0JCQkJCWxhc3QgPSBzdWJ3aW5fdHJhcF9jb3VudDsgXAotCQkJCX0gXAotCQkJCWlmIChzdWJ3aW5fdHJhcF9jb3VudCAtIGxhc3QgPiAzMCkgeyBcCi0JCQkJCS8qIHdpbmRvdyBwcm9iYWJseSBpY29uaWZpZWQgKi8gXAotCQkJCQl1c2xlZXAoMTAwMCoxMDAwKTsgXAotCQkJCX0gXAotCQkJfSBlbHNlIHsgXAotCQkJCXJmYkxvZygidHJhcHBlZCBHZXRJbWFnZSB4ZXJyb3IiIFwKLQkJCQkgICAgIiBpbiBYUkFORFIgbW9kZS5cbiIpOyBcCi0JCQl9IFwKLQkJCXRyYXBwZWRfZ2V0aW1hZ2VfeGVycm9yID0gMDsgXAotCQkJWFNldEVycm9ySGFuZGxlcihvbGRfZ2V0aW1hZ2VfaGFuZGxlcik7CSBcCi0JCQlYRmx1c2hfd3IoZHB5KTsgXAotCQkJY2hlY2tfeHJhbmRyX2V2ZW50KHkpOyBcCi0JCQlYX1VOTE9DSzsgXAotCQkJcmV0dXJuKHgpOyBcCi0JCX0gXAotCX0KLQotI2VuZGlmIC8qIF9YMTFWTkNfWFJBTkRSX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy94cmVjb3JkLmMgYi94MTF2bmMveHJlY29yZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UxNWI5Li4wMDAwMDAwCi0tLSBhL3gxMXZuYy94cmVjb3JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg0ICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geHJlY29yZC5jIC0tICovCi0KLSNpbmNsdWRlICJ4MTF2bmMuaCIKLSNpbmNsdWRlICJ4d3JhcHBlcnMuaCIKLSNpbmNsdWRlICJ3aW5fdXRpbHMuaCIKLSNpbmNsdWRlICJjbGVhbnVwLmgiCi0jaW5jbHVkZSAidXNlcmlucHV0LmgiCi0jaW5jbHVkZSAid2luYXR0cl90LmgiCi0jaW5jbHVkZSAic2Nyb2xsZXZlbnRfdC5oIgotI2luY2x1ZGUgInVuaXhwdy5oIgotCi0jZGVmaW5lIFNDUl9FVl9NQVggMTI4Ci1zY3JvbGxfZXZlbnRfdCBzY3JfZXZbU0NSX0VWX01BWF07Ci1pbnQgc2NyX2V2X2NudDsKLQotaW50IHhyZWNvcmRpbmcgPSAwOwotaW50IHhyZWNvcmRfc2V0X2J5X2tleXMgPSAwOwotaW50IHhyZWNvcmRfc2V0X2J5X21vdXNlID0gMDsKLVdpbmRvdyB4cmVjb3JkX2ZvY3VzX3dpbmRvdyA9IE5vbmU7Ci1XaW5kb3cgeHJlY29yZF93bV93aW5kb3cgPSBOb25lOwotV2luZG93IHhyZWNvcmRfcHRyX3dpbmRvdyA9IE5vbmU7Ci1LZXlTeW0geHJlY29yZF9rZXlzeW0gPSBOb1N5bWJvbDsKLQotI2RlZmluZSBOQU1FSU5GTyAyMDQ4Ci1jaGFyIHhyZWNvcmRfbmFtZV9pbmZvW05BTUVJTkZPXTsKLQotI2RlZmluZSBTQ1JfQVRUUl9DQUNIRSA4Ci13aW5hdHRyX3Qgc2NyX2F0dHJfY2FjaGVbU0NSX0FUVFJfQ0FDSEVdOwotc3RhdGljIGRvdWJsZSBhdHRyX2NhY2hlX21heF9hZ2UgPSAxLjU7Ci0KLURpc3BsYXkgKnJkcHlfZGF0YSA9IE5VTEw7CQkvKiBEYXRhIGNvbm5lY3Rpb24gZm9yIFJFQ09SRCAqLwotRGlzcGxheSAqcmRweV9jdHJsID0gTlVMTDsJCS8qIENvbnRyb2wgY29ubmVjdGlvbiBmb3IgUkVDT1JEICovCi0KLURpc3BsYXkgKmdkcHlfY3RybCA9IE5VTEw7Ci1EaXNwbGF5ICpnZHB5X2RhdGEgPSBOVUxMOwotaW50IHhzZXJ2ZXJfZ3JhYmJlZCA9IDA7Ci0KLWludCB0cmFwX3JlY29yZF94ZXJyb3IoRGlzcGxheSAqLCBYRXJyb3JFdmVudCAqKTsKLQotdm9pZCBpbml0aWFsaXplX3hyZWNvcmQodm9pZCk7Ci12b2lkIHplcm9kaXNwX3hyZWNvcmQodm9pZCk7Ci12b2lkIHNodXRkb3duX3hyZWNvcmQodm9pZCk7Ci1pbnQgeHJlY29yZF9za2lwX2tleXN5bShyZmJLZXlTeW0ga2V5c3ltKTsKLWludCB4cmVjb3JkX3NraXBfYnV0dG9uKGludCBuZXdiLCBpbnQgb2xkKTsKLWludCB4cmVjb3JkX3Njcm9sbF9rZXlzeW0ocmZiS2V5U3ltIGtleXN5bSk7Ci12b2lkIGNoZWNrX3hyZWNvcmRfcmVzZXQoaW50IGZvcmNlKTsKLXZvaWQgeHJlY29yZF93YXRjaChpbnQgc3RhcnQsIGludCBzZXRieSk7Ci0KLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotc3RhdGljIFhSZWNvcmRSYW5nZSAqcnJfQ0EgPSBOVUxMOwotc3RhdGljIFhSZWNvcmRSYW5nZSAqcnJfQ1cgPSBOVUxMOwotc3RhdGljIFhSZWNvcmRSYW5nZSAqcnJfR1MgPSBOVUxMOwotc3RhdGljIFhSZWNvcmRSYW5nZSAqcnJfc2Nyb2xsWzEwXTsKLXN0YXRpYyBYUmVjb3JkQ29udGV4dCByY19zY3JvbGw7Ci1zdGF0aWMgWFJlY29yZENsaWVudFNwZWMgcmNzX3Njcm9sbDsKLXN0YXRpYyBYUmVjb3JkUmFuZ2UgKnJyX2dyYWJbMTBdOwotc3RhdGljIFhSZWNvcmRDb250ZXh0IHJjX2dyYWI7Ci1zdGF0aWMgWFJlY29yZENsaWVudFNwZWMgcmNzX2dyYWI7Ci0jZW5kaWYKLXN0YXRpYyBYRXJyb3JFdmVudCAqdHJhcHBlZF9yZWNvcmRfeGVycm9yX2V2ZW50OwotCi1zdGF0aWMgdm9pZCB4cmVjb3JkX2dyYWJzZXJ2ZXIoaW50IHN0YXJ0KTsKLXN0YXRpYyBpbnQgeHJlY29yZF92aV9zY3JvbGxfa2V5c3ltKHJmYktleVN5bSBrZXlzeW0pOwotc3RhdGljIGludCB4cmVjb3JkX2VtYWNzX3Njcm9sbF9rZXlzeW0ocmZiS2V5U3ltIGtleXN5bSk7Ci1zdGF0aWMgaW50IGxvb2t1cF9hdHRyX2NhY2hlKFdpbmRvdyB3aW4sIGludCAqY2FjaGVfaW5kZXgsIGludCAqbmV4dF9pbmRleCk7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi1zdGF0aWMgdm9pZCByZWNvcmRfQ0EoWFBvaW50ZXIgcHRyLCBYUmVjb3JkSW50ZXJjZXB0RGF0YSAqcmVjX2RhdGEpOwotc3RhdGljIHZvaWQgcmVjb3JkX0NXKFhQb2ludGVyIHB0ciwgWFJlY29yZEludGVyY2VwdERhdGEgKnJlY19kYXRhKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9zd2l0Y2goWFBvaW50ZXIgcHRyLCBYUmVjb3JkSW50ZXJjZXB0RGF0YSAqcmVjX2RhdGEpOwotc3RhdGljIHZvaWQgcmVjb3JkX2dyYWIoWFBvaW50ZXIgcHRyLCBYUmVjb3JkSW50ZXJjZXB0RGF0YSAqcmVjX2RhdGEpOwotc3RhdGljIHZvaWQgc2h1dGRvd25fcmVjb3JkX2NvbnRleHQoWFJlY29yZENvbnRleHQgcmMsIGludCBiZXF1aWV0LCBpbnQgcmVvcGVuKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgY2hlY2tfeHJlY29yZF9ncmFic2VydmVyKHZvaWQpOwotCi0KLWludCB0cmFwX3JlY29yZF94ZXJyb3IoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmVycm9yKSB7Ci0JdHJhcHBlZF9yZWNvcmRfeGVycm9yID0gMTsKLQl0cmFwcGVkX3JlY29yZF94ZXJyb3JfZXZlbnQgPSBlcnJvcjsKLQotCWlmIChkKSB7fSAvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHhyZWNvcmRfZ3JhYnNlcnZlcihpbnQgc3RhcnQpIHsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGRlYnVnX2dyYWJzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAieHJlY29yZF9ncmFic2VydmVyJWQvJWQgJS41ZlxuIiwKLQkJCXhzZXJ2ZXJfZ3JhYmJlZCwgc3RhcnQsIGRub3d4KCkpOwotCX0KLQotCWlmICghIGdkcHlfY3RybCB8fCAhIGdkcHlfZGF0YSkgewotCQlyZXR1cm47Ci0JfQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCWlmICghc3RhcnQpIHsKLQkJaWYgKCEgcmNfZ3JhYikgewotCQkJcmV0dXJuOwotCQl9Ci0JCVhSZWNvcmREaXNhYmxlQ29udGV4dChnZHB5X2N0cmwsIHJjX2dyYWIpOwotCQlYUmVjb3JkRnJlZUNvbnRleHQoZ2RweV9jdHJsLCByY19ncmFiKTsKLQkJWEZsdXNoX3dyKGdkcHlfY3RybCk7Ci0JCXJjX2dyYWIgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JeHNlcnZlcl9ncmFiYmVkID0gMDsKLQotCXJyX2dyYWJbMF0gPSBycl9HUzsKLQlyY3NfZ3JhYiA9IFhSZWNvcmRBbGxDbGllbnRzOwotCi0JcmNfZ3JhYiA9IFhSZWNvcmRDcmVhdGVDb250ZXh0KGdkcHlfY3RybCwgMCwgJnJjc19ncmFiLCAxLCBycl9ncmFiLCAxKTsKLQl0cmFwcGVkX3JlY29yZF94ZXJyb3IgPSAwOwotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3JlY29yZF94ZXJyb3IpOwotCi0JWFN5bmMoZ2RweV9jdHJsLCBUcnVlKTsKLQotCWlmICghIHJjX2dyYWIgfHwgdHJhcHBlZF9yZWNvcmRfeGVycm9yKSB7Ci0JCVhDbG9zZURpc3BsYXlfd3IoZ2RweV9jdHJsKTsKLQkJWENsb3NlRGlzcGxheV93cihnZHB5X2RhdGEpOwotCQlnZHB5X2N0cmwgPSBOVUxMOwotCQlnZHB5X2RhdGEgPSBOVUxMOwotCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJcmV0dXJuOwotCX0KLQlyYyA9IFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMoZ2RweV9kYXRhLCByY19ncmFiLCByZWNvcmRfZ3JhYiwgTlVMTCk7Ci0JaWYgKCFyYyB8fCB0cmFwcGVkX3JlY29yZF94ZXJyb3IpIHsKLQkJWENsb3NlRGlzcGxheV93cihnZHB5X2N0cmwpOwotCQlYQ2xvc2VEaXNwbGF5X3dyKGdkcHlfZGF0YSk7Ci0JCWdkcHlfY3RybCA9IE5VTEw7Ci0JCWdkcHlfZGF0YSA9IE5VTEw7Ci0JCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQlyZXR1cm47Ci0JfQotCVhGbHVzaF93cihnZHB5X2RhdGEpOwotCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotI2Vsc2UKLQlpZiAoIXJjIHx8ICFvbGRfaGFuZGxlcikge30KLSNlbmRpZgotCWlmIChkZWJ1Z19ncmFicykgewotCQlmcHJpbnRmKHN0ZGVyciwgInhyZWNvcmRfZ3JhYnNlcnZlci1kb25lOiAlLjVmXG4iLCBkbm93eCgpKTsKLQl9Ci19Ci0KLXZvaWQgemVyb2Rpc3BfeHJlY29yZCh2b2lkKSB7Ci0JcmRweV9kYXRhID0gTlVMTDsKLQlyZHB5X2N0cmwgPSBOVUxMOwotCWdkcHlfZGF0YSA9IE5VTEw7Ci0JZ2RweV9jdHJsID0gTlVMTDsKLX0KLQotdm9pZCBpbml0aWFsaXplX3hyZWNvcmQodm9pZCkgewotCXVzZV94cmVjb3JkID0gMDsKLQlpZiAoISB4cmVjb3JkX3ByZXNlbnQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAobm9mYikgewotCQlyZXR1cm47Ci0JfQotCWlmIChub3hyZWNvcmQpIHsKLQkJcmV0dXJuOwotCX0KLQlSQVdGQl9SRVRfVk9JRAotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCi0JaWYgKHJyX0NBKSBYRnJlZV93cihycl9DQSk7Ci0JaWYgKHJyX0NXKSBYRnJlZV93cihycl9DVyk7Ci0JaWYgKHJyX0dTKSBYRnJlZV93cihycl9HUyk7Ci0KLQlycl9DQSA9IFhSZWNvcmRBbGxvY1JhbmdlKCk7Ci0JcnJfQ1cgPSBYUmVjb3JkQWxsb2NSYW5nZSgpOwotCXJyX0dTID0gWFJlY29yZEFsbG9jUmFuZ2UoKTsKLQlpZiAoIXJyX0NBIHx8ICFycl9DVyB8fCAhcnJfR1MpIHsKLQkJcmV0dXJuOwotCX0KLQkvKiBwcm90b2NvbCByZXF1ZXN0IHJhbmdlczogKi8KLQlycl9DQS0+Y29yZV9yZXF1ZXN0cy5maXJzdCA9IFhfQ29weUFyZWE7Ci0JcnJfQ0EtPmNvcmVfcmVxdWVzdHMubGFzdCAgPSBYX0NvcHlBcmVhOwotCQotCXJyX0NXLT5jb3JlX3JlcXVlc3RzLmZpcnN0ID0gWF9Db25maWd1cmVXaW5kb3c7Ci0JcnJfQ1ctPmNvcmVfcmVxdWVzdHMubGFzdCAgPSBYX0NvbmZpZ3VyZVdpbmRvdzsKLQotCXJyX0dTLT5jb3JlX3JlcXVlc3RzLmZpcnN0ID0gWF9HcmFiU2VydmVyOwotCXJyX0dTLT5jb3JlX3JlcXVlc3RzLmxhc3QgID0gWF9VbmdyYWJTZXJ2ZXI7Ci0KLQlYX0xPQ0s7Ci0JLyogb3BlbiBhIDJuZCBjb250cm9sIGNvbm5lY3Rpb24gdG8gRElTUExBWTogKi8KLQlpZiAocmRweV9kYXRhKSB7Ci0JCVhDbG9zZURpc3BsYXlfd3IocmRweV9kYXRhKTsKLQkJcmRweV9kYXRhID0gTlVMTDsKLQl9Ci0JaWYgKHJkcHlfY3RybCkgewotCQlYQ2xvc2VEaXNwbGF5X3dyKHJkcHlfY3RybCk7Ci0JCXJkcHlfY3RybCA9IE5VTEw7Ci0JfQotCXJkcHlfY3RybCA9IFhPcGVuRGlzcGxheV93cihEaXNwbGF5U3RyaW5nKGRweSkpOwotCWlmICghcmRweV9jdHJsKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicmRweV9jdHJsIG9wZW4gZmFpbGVkOiAlcyAvICVzIC8gJXMgLyAlc1xuIiwgZ2V0ZW52KCJESVNQTEFZIiksIERpc3BsYXlTdHJpbmcoZHB5KSwgZ2V0ZW52KCJYQVVUSE9SSVRZIiksIGdldGVudigiWEFVVEhPUklUXyIpKTsKLQl9Ci0JWFN5bmMoZHB5LCBUcnVlKTsKLQlYU3luYyhyZHB5X2N0cmwsIFRydWUpOwotCS8qIG9wZW4gZGF0YWxpbmsgY29ubmVjdGlvbiB0byBESVNQTEFZOiAqLwotCXJkcHlfZGF0YSA9IFhPcGVuRGlzcGxheV93cihEaXNwbGF5U3RyaW5nKGRweSkpOwotCWlmICghcmRweV9kYXRhKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicmRweV9kYXRhIG9wZW4gZmFpbGVkXG4iKTsKLQl9Ci0JaWYgKCFyZHB5X2N0cmwgfHwgISByZHB5X2RhdGEpIHsKLQkJWF9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0JZGlzYWJsZV9ncmFic2VydmVyKHJkcHlfY3RybCwgMCk7Ci0JZGlzYWJsZV9ncmFic2VydmVyKHJkcHlfZGF0YSwgMCk7Ci0KLQl1c2VfeHJlY29yZCA9IDE7Ci0KLQkvKgotCSAqIG5vdyBzZXQgdXAgdGhlIEdyYWJTZXJ2ZXIgd2F0Y2hlci4gIFdlIGdldCBHcmFiU2VydmVyCi0JICogZGVhZGxvY2sgaW4gWFJlY29yZENyZWF0ZUNvbnRleHQoKSBldmVuIHdpdGggWFRlc3RHcmFiU2VydmVyCi0JICogaW4gcGxhY2UsIHdoeT8gIE5vdCBzdXJlLCBzbyB3ZSBtYW51YWxseSB3YXRjaCBmb3IgZ3JhYnMuLi4KLQkgKi8KLQlpZiAoZ2RweV9kYXRhKSB7Ci0JCVhDbG9zZURpc3BsYXlfd3IoZ2RweV9kYXRhKTsKLQkJZ2RweV9kYXRhID0gTlVMTDsKLQl9Ci0JaWYgKGdkcHlfY3RybCkgewotCQlYQ2xvc2VEaXNwbGF5X3dyKGdkcHlfY3RybCk7Ci0JCWdkcHlfY3RybCA9IE5VTEw7Ci0JfQotCXhzZXJ2ZXJfZ3JhYmJlZCA9IDA7Ci0KLQlnZHB5X2N0cmwgPSBYT3BlbkRpc3BsYXlfd3IoRGlzcGxheVN0cmluZyhkcHkpKTsKLQlpZiAoIWdkcHlfY3RybCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdkcHlfY3RybCBvcGVuIGZhaWxlZFxuIik7Ci0JfQotCVhTeW5jKGRweSwgVHJ1ZSk7Ci0JWFN5bmMoZ2RweV9jdHJsLCBUcnVlKTsKLQlnZHB5X2RhdGEgPSBYT3BlbkRpc3BsYXlfd3IoRGlzcGxheVN0cmluZyhkcHkpKTsKLQlpZiAoIWdkcHlfZGF0YSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdkcHlfZGF0YSBvcGVuIGZhaWxlZFxuIik7Ci0JfQotCWlmIChnZHB5X2N0cmwgJiYgZ2RweV9kYXRhKSB7Ci0JCWRpc2FibGVfZ3JhYnNlcnZlcihnZHB5X2N0cmwsIDApOwotCQlkaXNhYmxlX2dyYWJzZXJ2ZXIoZ2RweV9kYXRhLCAwKTsKLQkJeHJlY29yZF9ncmFic2VydmVyKDEpOwotCX0KLQlYX1VOTE9DSzsKLSNlbmRpZgotfQotCi12b2lkIHNodXRkb3duX3hyZWNvcmQodm9pZCkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCi0JaWYgKGRlYnVnX2dyYWJzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAic2h1dGRvd25feHJlY29yZCVkICUuNWZcbiIsCi0JCQl4c2VydmVyX2dyYWJiZWQsIGRub3d4KCkpOwotCX0KLQotCWlmIChycl9DQSkgWEZyZWVfd3IocnJfQ0EpOwotCWlmIChycl9DVykgWEZyZWVfd3IocnJfQ1cpOwotCWlmIChycl9HUykgWEZyZWVfd3IocnJfR1MpOwotCi0JcnJfQ0EgPSBOVUxMOwotCXJyX0NXID0gTlVMTDsKLQlycl9HUyA9IE5VTEw7Ci0KLQlYX0xPQ0s7Ci0JaWYgKHJkcHlfY3RybCAmJiByY19zY3JvbGwpIHsKLQkJWFJlY29yZERpc2FibGVDb250ZXh0KHJkcHlfY3RybCwgcmNfc2Nyb2xsKTsKLQkJWFJlY29yZEZyZWVDb250ZXh0KHJkcHlfY3RybCwgcmNfc2Nyb2xsKTsKLQkJWFN5bmMocmRweV9jdHJsLCBGYWxzZSk7Ci0JCXJjX3Njcm9sbCA9IDA7Ci0JfQotCQkKLQlpZiAoZ2RweV9jdHJsICYmIHJjX2dyYWIpIHsKLQkJWFJlY29yZERpc2FibGVDb250ZXh0KGdkcHlfY3RybCwgcmNfZ3JhYik7Ci0JCVhSZWNvcmRGcmVlQ29udGV4dChnZHB5X2N0cmwsIHJjX2dyYWIpOwotCQlYU3luYyhnZHB5X2N0cmwsIEZhbHNlKTsKLQkJcmNfZ3JhYiA9IDA7Ci0JfQotCQkKLQlpZiAocmRweV9kYXRhKSB7Ci0JCVhDbG9zZURpc3BsYXlfd3IocmRweV9kYXRhKTsKLQkJcmRweV9kYXRhID0gTlVMTDsKLQl9Ci0JaWYgKHJkcHlfY3RybCkgewotCQlYQ2xvc2VEaXNwbGF5X3dyKHJkcHlfY3RybCk7Ci0JCXJkcHlfY3RybCA9IE5VTEw7Ci0JfQotCWlmIChnZHB5X2RhdGEpIHsKLQkJWENsb3NlRGlzcGxheV93cihnZHB5X2RhdGEpOwotCQlnZHB5X2RhdGEgPSBOVUxMOwotCX0KLQlpZiAoZ2RweV9jdHJsKSB7Ci0JCVhDbG9zZURpc3BsYXlfd3IoZ2RweV9jdHJsKTsKLQkJZ2RweV9jdHJsID0gTlVMTDsKLQl9Ci0JeHNlcnZlcl9ncmFiYmVkID0gMDsKLQlYX1VOTE9DSzsKLSNlbmRpZgotCXVzZV94cmVjb3JkID0gMDsKLQotCWlmIChkZWJ1Z19ncmFicykgewotCQlmcHJpbnRmKHN0ZGVyciwgInNodXRkb3duX3hyZWNvcmQtZG9uZTogJS41ZlxuIiwgZG5vd3goKSk7Ci0JfQotfQotCi1pbnQgeHJlY29yZF9za2lwX2tleXN5bShyZmJLZXlTeW0ga2V5c3ltKSB7Ci0JS2V5U3ltIHN5bSA9IChLZXlTeW0pIGtleXN5bTsKLQlpbnQgb2sgPSAtMSwgbWF0Y2hlZCA9IDA7Ci0KLQlpZiAoc2Nyb2xsX2tleV9saXN0KSB7Ci0JCWludCBrLCBleGNsdWRlID0gMDsKLQkJaWYgKHNjcm9sbF9rZXlfbGlzdFswXSkgewotCQkJZXhjbHVkZSA9IDE7Ci0JCX0KLQkJayA9IDE7Ci0JCXdoaWxlIChzY3JvbGxfa2V5X2xpc3Rba10gIT0gTm9TeW1ib2wpIHsKLQkJCWlmIChzY3JvbGxfa2V5X2xpc3RbaysrXSA9PSBzeW0pIHsKLQkJCQltYXRjaGVkID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZXhjbHVkZSkgewotCQkJaWYgKG1hdGNoZWQpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2sgPSAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG1hdGNoZWQpIHsKLQkJCQlvayA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCW9rID0gMDsKLQkJCX0KLQkJfQotCX0KLQlpZiAob2sgPT0gMSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKG9rID09IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogYXBwbHkgdmFyaW91cyBoZXVyaXN0aWNzOiAqLwotCi0JaWYgKElzTW9kaWZpZXJLZXkoc3ltKSkgewotCQkvKiBTaGlmdCwgQ29udHJvbCwgZXRjLCB1c3UuIGdlbmVyYXRlIG5vIHNjcm9sbHMgKi8KLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChzeW0gPT0gWEtfc3BhY2UgJiYgc2Nyb2xsX3Rlcm0pIHsKLQkJLyogc3BhY2UgaW4gYSB0ZXJtaW5hbCBpcyB1c3UuIGZ1bGwgcGFnZS4uLiAqLwotCQlXaW5kb3cgd2luOwotCQlzdGF0aWMgV2luZG93IHByZXZfdG9wID0gTm9uZTsKLQkJaW50IHNpemUgPSAyNTY7Ci0JCXN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKLQotCQlYX0xPQ0s7Ci0JCXdpbiA9IHF1ZXJ5X3BvaW50ZXIocm9vdHdpbik7Ci0JCVhfVU5MT0NLOwotCQlpZiAod2luICE9IE5vbmUgJiYgd2luICE9IHJvb3R3aW4pIHsKLQkJCWlmIChwcmV2X3RvcCAhPSBOb25lICYmIHdpbiA9PSBwcmV2X3RvcCkgewotCQkJCTsJLyogdXNlIGNhY2hlZCByZXN1bHQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJcHJldl90b3AgPSB3aW47Ci0JCQkJWF9MT0NLOwotCQkJCXdpbiA9IGRlc2NlbmRfcG9pbnRlcig2LCB3aW4sIG5hbWUsIHNpemUpOwotCQkJCVhfVU5MT0NLOwotCQkJfQotCQkJaWYgKG1hdGNoX3N0cl9saXN0KG5hbWUsIHNjcm9sbF90ZXJtKSkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCi0JLyogVEJEIHVzZSB0eXBpbmdfcmF0ZSgpIHNvICovCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB4cmVjb3JkX3NraXBfYnV0dG9uKGludCBuZXdfYnV0dG9uLCBpbnQgb2xkKSB7Ci0JLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQlpZiAobmV3X2J1dHRvbiB8fCBvbGQpIHt9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4cmVjb3JkX3ZpX3Njcm9sbF9rZXlzeW0ocmZiS2V5U3ltIGtleXN5bSkgewotCUtleVN5bSBzeW0gPSAoS2V5U3ltKSBrZXlzeW07Ci0JaWYgKHN5bSA9PSBYS19KIHx8IHN5bSA9PSBYS19qIHx8IHN5bSA9PSBYS19LIHx8IHN5bSA9PSBYS19rKSB7Ci0JCXJldHVybiAxOwkvKiB2aSAqLwotCX0KLQlpZiAoc3ltID09IFhLX0QgfHwgc3ltID09IFhLX2QgfHwgc3ltID09IFhLX1UgfHwgc3ltID09IFhLX3UpIHsKLQkJcmV0dXJuIDE7CS8qIEN0cmwtZC91ICovCi0JfQotCWlmIChzeW0gPT0gWEtfWiB8fCBzeW0gPT0gWEtfeikgewotCQlyZXR1cm4gMTsJLyogenosIHp0LCB6YiAuLiAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB4cmVjb3JkX2VtYWNzX3Njcm9sbF9rZXlzeW0ocmZiS2V5U3ltIGtleXN5bSkgewotCUtleVN5bSBzeW0gPSAoS2V5U3ltKSBrZXlzeW07Ci0JaWYgKHN5bSA9PSBYS19OIHx8IHN5bSA9PSBYS19uIHx8IHN5bSA9PSBYS19QIHx8IHN5bSA9PSBYS19wKSB7Ci0JCXJldHVybiAxOwkvKiBlbWFjcyAqLwotCX0KLQkvKiBNdXN0IGJlIHNvbWUgbW9yZSAuLi4gKi8KLQlyZXR1cm4gMDsKLX0KLQotaW50IHhyZWNvcmRfc2Nyb2xsX2tleXN5bShyZmJLZXlTeW0ga2V5c3ltKSB7Ci0JS2V5U3ltIHN5bSA9IChLZXlTeW0pIGtleXN5bTsKLQkvKiBYMTEva2V5c3ltZGVmLmggKi8KLQotCWlmIChzeW0gPT0gWEtfUmV0dXJuIHx8IHN5bSA9PSBYS19LUF9FbnRlciB8fCBzeW0gPT0gWEtfTGluZWZlZWQpIHsKLQkJcmV0dXJuIDE7CS8qIEVudGVyICovCi0JfQotCWlmIChzeW09PVhLX1VwIHx8IHN5bT09WEtfS1BfVXAgfHwgc3ltPT1YS19Eb3duIHx8IHN5bT09WEtfS1BfRG93bikgewotCQlyZXR1cm4gMTsJLyogVS9EIGFycm93cyAqLwotCX0KLQlpZiAoc3ltID09IFhLX0xlZnQgfHwgc3ltID09IFhLX0tQX0xlZnQgfHwgc3ltID09IFhLX1JpZ2h0IHx8Ci0JICAgIHN5bSA9PSBYS19LUF9SaWdodCkgewotCQlyZXR1cm4gMTsJLyogTC9SIGFycm93cyAqLwotCX0KLQlpZiAoeHJlY29yZF92aV9zY3JvbGxfa2V5c3ltKGtleXN5bSkpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICh4cmVjb3JkX2VtYWNzX3Njcm9sbF9rZXlzeW0oa2V5c3ltKSkgewotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9va3VwX2F0dHJfY2FjaGUoV2luZG93IHdpbiwgaW50ICpjYWNoZV9pbmRleCwgaW50ICpuZXh0X2luZGV4KSB7Ci0JZG91YmxlIG5vdywgdCwgb2xkZXN0ID0gMC4wOwotCWludCBpLCBvbGRfaW5kZXggPSAtMSwgY291bnQgPSAwOwotCVdpbmRvdyBjd2luOwotCi0JKmNhY2hlX2luZGV4ID0gLTE7Ci0JKm5leHRfaW5kZXggID0gLTE7Ci0JCi0JaWYgKHdpbiA9PSBOb25lKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoYXR0cl9jYWNoZV9tYXhfYWdlID09IDAuMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkdGltZTAoJm5vdyk7Ci0JZm9yIChpPTA7IGkgPCBTQ1JfQVRUUl9DQUNIRTsgaSsrKSB7Ci0KLQkJY3dpbiA9IHNjcl9hdHRyX2NhY2hlW2ldLndpbjsKLQkJdCA9IHNjcl9hdHRyX2NhY2hlW2ldLnRpbWU7Ci0KLQkJaWYgKG5vdyA+IHQgKyBhdHRyX2NhY2hlX21heF9hZ2UpIHsKLQkJCS8qIGV4cGlyZSBpdCBldmVuIGlmIGl0IGlzIHRoZSBvbmUgd2Ugd2FudCAqLwotCQkJc2NyX2F0dHJfY2FjaGVbaV0ud2luID0gY3dpbiA9IE5vbmU7Ci0JCQlzY3JfYXR0cl9jYWNoZVtpXS5mZXRjaGVkID0gMDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLnZhbGlkID0gMDsKLQkJfQotCi0JCWlmICgqbmV4dF9pbmRleCA9PSAtMSAmJiBjd2luID09IE5vbmUpIHsKLQkJCSpuZXh0X2luZGV4ID0gaTsKLQkJfQotCQlpZiAoKm5leHRfaW5kZXggPT0gLTEpIHsKLQkJCS8qIHJlY29yZCBvbGRlc3QgKi8KLQkJCWlmIChvbGRfaW5kZXggPT0gLTEgfHwgdCA8IG9sZGVzdCkgewotCQkJCW9sZGVzdCA9IHQ7Ci0JCQkJb2xkX2luZGV4ID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoY3dpbiAhPSBOb25lKSB7Ci0JCQljb3VudCsrOwotCQl9Ci0JCWlmIChjd2luID09IHdpbikgewotCQkJaWYgKCpjYWNoZV9pbmRleCA9PSAtMSkgewotCQkJCSpjYWNoZV9pbmRleCA9IGk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHJlbW92ZSBkdXBzICovCi0JCQkJc2NyX2F0dHJfY2FjaGVbaV0ud2luID0gTm9uZTsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5mZXRjaGVkID0gMDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS52YWxpZCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCpuZXh0X2luZGV4ID09IC0xKSB7Ci0JCSpuZXh0X2luZGV4ID0gb2xkX2luZGV4OwotCX0KLQotaWYgKDApIGZwcmludGYoc3RkZXJyLCAibG9va3VwX2F0dHJfY2FjaGUgY291bnQ6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKCpjYWNoZV9pbmRleCAhPSAtMSkgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLQotc3RhdGljIFhJRCB4cmVjb3JkX3NlcSA9IDA7Ci1zdGF0aWMgZG91YmxlIHhyZWNvcmRfc3RhcnQgPSAwLjA7Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9SRUNPUkQKLXN0YXRpYyB2b2lkIHJlY29yZF9DQShYUG9pbnRlciBwdHIsIFhSZWNvcmRJbnRlcmNlcHREYXRhICpyZWNfZGF0YSkgewotCXhDb3B5QXJlYVJlcSAqcmVxOwotCVdpbmRvdyBzcmMgPSBOb25lLCBkc3QgPSBOb25lLCBjOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHIsIGF0dHIyOwotCWludCBzcmNfeCwgc3JjX3ksIGRzdF94LCBkc3RfeSwgcngsIHJ5LCByeDIsIHJ5MjsKLQlpbnQgZ29vZCA9IDEsIGR4ID0gMCwgZHkgPSAwLCBrPTAsIGk7Ci0JdW5zaWduZWQgaW50IHcsIGg7Ci0JaW50IGRiYSA9IDAsIGRiID0gZGVidWdfc2Nyb2xsOwotCWludCBjYWNoZV9pbmRleCwgbmV4dF9pbmRleCwgdmFsaWQ7Ci0Jc3RhdGljIGludCBtdXN0X2VxdWFsID0gLTE7Ci0KLQlpZiAoZGJhIHx8IGRiKSB7Ci0JCWlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZEZyb21DbGllbnQpIHsKLQkJCXJlcSA9ICh4Q29weUFyZWFSZXEgKikgcmVjX2RhdGEtPmRhdGE7Ci0JCQlpZiAocmVxLT5yZXFUeXBlID09IFhfQ29weUFyZWEpIHsKLQkJCQlzcmMgPSByZXEtPnNyY0RyYXdhYmxlOwotCQkJCWRzdCA9IHJlcS0+ZHN0RHJhd2FibGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLWlmIChkYmEgfHwgZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQS0lZCBpZF9iYXNlOiAweCVseCAgcHRyOiAweCVseCAiCi0JInNlcTogMHglbHggcmM6IDB4JWx4ICBjYXQ6ICVkICBzd2FwcGVkOiAlZCAweCVseC8weCVseFxuIiwgaysrLAotCXJlY19kYXRhLT5pZF9iYXNlLCAodW5zaWduZWQgbG9uZykgcHRyLCB4cmVjb3JkX3NlcSwgcmNfc2Nyb2xsLAotCXJlY19kYXRhLT5jYXRlZ29yeSwgcmVjX2RhdGEtPmNsaWVudF9zd2FwcGVkLCBzcmMsIGRzdCk7Ci0KLQlpZiAoISB4cmVjb3JkaW5nKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQS0lZFxuIiwgaysrKTsKLQotCWlmIChyZWNfZGF0YS0+aWRfYmFzZSA9PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQS0lZFxuIiwgaysrKTsKLQotCWlmICgoWElEKSBwdHIgIT0geHJlY29yZF9zZXEpIHsKLQkJcmV0dXJuOwotCX0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBLSVkXG4iLCBrKyspOwotCi0JaWYgKHJlY19kYXRhLT5jYXRlZ29yeSAhPSBYUmVjb3JkRnJvbUNsaWVudCkgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ0EtJWRcbiIsIGsrKyk7Ci0KLQlyZXEgPSAoeENvcHlBcmVhUmVxICopIHJlY19kYXRhLT5kYXRhOwotCi0JaWYgKHJlcS0+cmVxVHlwZSAhPSBYX0NvcHlBcmVhKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQS0lZFxuIiwgaysrKTsKLQotCWlmIChtdXN0X2VxdWFsIDwgMCkgewotCQltdXN0X2VxdWFsID0gMDsKLQkJaWYgKGdldGVudigiWDExVk5DX1NDUk9MTF9NVVNUX0VRVUFMIikpIHsKLQkJCW11c3RfZXF1YWwgPSAxOwotCQl9Ci0JfQotCi0vKgotCi14dGVybSwgZ25vbWUtdGVybWluYWwsIG90aGVycy4KLQotTm90ZSB3ZSBtaXNzIHRoZSBYX0ltYWdlVGV4dDggdGhhdCBjbGVhcnMgdGhlIGJsb2NrIGN1cnNvci4gIFNvIHRoZXJlIGlzIGEKLXNob3J0IHBlcmlvZCBvZiB0aW1lIHdpdGggYSBwYWludGluZyBlcnJvcjogdHdvIGN1cnNvcnMsIG9uZSBhYm92ZSB0aGUgb3RoZXIuCi0KLSBYX0ltYWdlVGV4dDggCi0gICAgZHJhdzogMHg4YzAwMDE3IG5DaGFyczogMSwgZ2M6IDB4OGMwMDAxMywgeDogMTAxLCB5OiA1ODUsIGNoYXJzPScgJwotIFhfQ2xlYXJBcmVhIAotICAgIHdpbmRvdzogMHg4YzAwMDE4LCB4OiAgIDIsIHk6IDIxNywgdzogIDEwLCBoOiAgIDUKLSBYX0ZpbGxQb2x5IAotICAgIGRyYXc6IDB4OGMwMDAxOCBnYzogMHg4YzAwMDBhLCBzaGFwZTogMCwgY29vcmRNb2RlOiAwLAotIFhfRmlsbFBvbHkgCi0gICAgZHJhdzogMHg4YzAwMDE4IGdjOiAweDhjMDAwMGIsIHNoYXBlOiAwLCBjb29yZE1vZGU6IDAsCi0gWF9Db3B5QXJlYSAKLSAgICBzcmM6IDB4OGMwMDAxNywgZHN0OiAweDhjMDAwMTcsIGdjOiAweDhjMDAwMTMsIHNyY1g6ICAxNywgc3JjWTogIDE1LCBkc3RYOiAgMTcsIGRzdFk6ICAgMiwgdzogNDgwLCBoOiA1NzIKLSBYX0NoYW5nZVdpbmRvd0F0dHJpYnV0ZXMgCi0gWF9DbGVhckFyZWEgCi0gICAgd2luZG93OiAweDhjMDAwMTcsIHg6ICAxNywgeTogNTc0LCB3OiA0ODAsIGg6ICAxMwotIFhfQ2hhbmdlV2luZG93QXR0cmlidXRlcyAKLQotICovCi0KLQlzcmMgPSByZXEtPnNyY0RyYXdhYmxlOwotCWRzdCA9IHJlcS0+ZHN0RHJhd2FibGU7Ci0Jc3JjX3ggPSByZXEtPnNyY1g7Ci0Jc3JjX3kgPSByZXEtPnNyY1k7Ci0JZHN0X3ggPSByZXEtPmRzdFg7Ci0JZHN0X3kgPSByZXEtPmRzdFk7Ci0JdyA9IHJlcS0+d2lkdGg7Ci0JaCA9IHJlcS0+aGVpZ2h0OwotCi0JaWYgKHcqaCA8ICh1bnNpZ25lZCBpbnQpIHNjcm9sbGNvcHlyZWN0X21pbl9hcmVhKSB7Ci0JCWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBIHNjcm9sbCBhcmVhIHRvbyBzbWFsbC5cbiIpOwotCQlnb29kID0gMDsKLQl9IGVsc2UgaWYgKCFzcmMgfHwgIWRzdCkgewotCQlpZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQSBudWxsIHNyYyBvciBkc3QuXG4iKTsKLQkJZ29vZCA9IDA7Ci0JfSBlbHNlIGlmIChzY3JfZXZfY250ID49IFNDUl9FVl9NQVgpIHsKLQkJaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ0EgbnVsbCB0b28gbWFueSBzY3IgZXZlbnRzLlxuIik7Ci0JCWdvb2QgPSAwOwotCX0gZWxzZSBpZiAobXVzdF9lcXVhbCAmJiBzcmMgIT0gZHN0KSB7Ci0JCWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBIHNyYyBub3QgZXF1YWwgZHN0LlxuIik7Ci0JCWdvb2QgPSAwOwotCX0KLQotCWlmIChzcmMgPT0gZHN0KSB7Ci0JCWR4ID0gZHN0X3ggLSBzcmNfeDsKLQkJZHkgPSBkc3RfeSAtIHNyY195OwotCi0JCWlmIChkeCAhPSAwICYmIGR5ICE9IDApIHsKLQkJCWdvb2QgPSAwOwotCQl9Ci0JfQotCi1pZiAoIWdvb2QgJiYgKGRiYSB8fCBkYiA+IDEpKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DQS14IHNyY194OiAlZCBzcmNfeTogJWQgIgotCSJkc3RfeDogJWQgZHN0X3k6ICVkIHc6ICVkIGg6ICVkIHNjcl9ldl9jbnQ6ICVkIDB4JWx4LzB4JWx4XG4iLAotCXNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LCB3LCBoLCBzY3JfZXZfY250LCBzcmMsIGRzdCk7Ci0KLQlpZiAoISBnb29kKSB7Ci0JCXJldHVybjsKLQl9Ci0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBLSVkXG4iLCBrKyspOwotCi0JLyoKLQkgKiBhZnRlciBhbGwgb2YgdGhlIGFib3ZlIHN1Y2NlZWRzLCBub3cgY29udGFjdCBYIHNlcnZlci4KLQkgKiB3ZSB0cnkgdG8gZ2V0IGF3YXkgd2l0aCBzb21lIGNhY2hpbmcgaGVyZS4KLQkgKi8KLQlpZiAobG9va3VwX2F0dHJfY2FjaGUoc3JjLCAmY2FjaGVfaW5kZXgsICZuZXh0X2luZGV4KSkgewotCQlpID0gY2FjaGVfaW5kZXg7Ci0JCWF0dHIueCA9IHNjcl9hdHRyX2NhY2hlW2ldLng7Ci0JCWF0dHIueSA9IHNjcl9hdHRyX2NhY2hlW2ldLnk7Ci0JCWF0dHIud2lkdGggPSBzY3JfYXR0cl9jYWNoZVtpXS53aWR0aDsKLQkJYXR0ci5oZWlnaHQgPSBzY3JfYXR0cl9jYWNoZVtpXS5oZWlnaHQ7Ci0JCWF0dHIubWFwX3N0YXRlID0gc2NyX2F0dHJfY2FjaGVbaV0ubWFwX3N0YXRlOwotCQlyeCA9IHNjcl9hdHRyX2NhY2hlW2ldLnJ4OwotCQlyeSA9IHNjcl9hdHRyX2NhY2hlW2ldLnJ5OwotCQl2YWxpZCA9IHNjcl9hdHRyX2NhY2hlW2ldLnZhbGlkOwotCi0JfSBlbHNlIHsKLQkJdmFsaWQgPSB2YWxpZF93aW5kb3coc3JjLCAmYXR0ciwgMSk7Ci0KLQkJaWYgKHZhbGlkKSB7Ci0JCQlpZiAoIXh0cmFuc2xhdGUoc3JjLCByb290d2luLCAwLCAwLCAmcngsICZyeSwgJmMsIDEpKSB7Ci0JCQkJdmFsaWQgPSAwOwotCQkJfQotCQl9Ci0JCWlmIChuZXh0X2luZGV4ID49IDApIHsKLQkJCWkgPSBuZXh0X2luZGV4OwotCQkJc2NyX2F0dHJfY2FjaGVbaV0ud2luID0gc3JjOwotCQkJc2NyX2F0dHJfY2FjaGVbaV0uZmV0Y2hlZCA9IDE7Ci0JCQlzY3JfYXR0cl9jYWNoZVtpXS52YWxpZCA9IHZhbGlkOwotCQkJc2NyX2F0dHJfY2FjaGVbaV0udGltZSA9IGRub3coKTsKLQkJCWlmICh2YWxpZCkgewotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLnggPSBhdHRyLng7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0ueSA9IGF0dHIueTsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS53aWR0aCA9IGF0dHIud2lkdGg7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0uaGVpZ2h0ID0gYXR0ci5oZWlnaHQ7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0uYm9yZGVyX3dpZHRoID0gYXR0ci5ib3JkZXJfd2lkdGg7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0uZGVwdGggPSBhdHRyLmRlcHRoOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLmNsYXNzID0gYXR0ci5jbGFzczsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5iYWNraW5nX3N0b3JlID0KLQkJCQkgICAgYXR0ci5iYWNraW5nX3N0b3JlOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLm1hcF9zdGF0ZSA9IGF0dHIubWFwX3N0YXRlOwotCi0JCQkJc2NyX2F0dHJfY2FjaGVbaV0ucnggPSByeDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5yeSA9IHJ5OwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCEgdmFsaWQpIHsKLQkJaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ0Egbm90IHZhbGlkLTEuXG4iKTsKLQkJcmV0dXJuOwotCX0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBLSVkXG4iLCBrKyspOwotCi0JaWYgKGF0dHIubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ0Egbm90IHZpZXdhYmxlLTEuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHJlY2VudCBnZGsvZ3RrIHdpbmRvd3MgdXNlIGRpZmZlcmVudCBzcmMgYW5kIGRzdC4gZm9yIGNvbXBvc2l0aW5nPyAqLwotCWlmIChzcmMgIT0gZHN0KSB7Ci0JICAgIGlmIChsb29rdXBfYXR0cl9jYWNoZShkc3QsICZjYWNoZV9pbmRleCwgJm5leHRfaW5kZXgpKSB7Ci0JCWkgPSBjYWNoZV9pbmRleDsKLQkJYXR0cjIueCA9IHNjcl9hdHRyX2NhY2hlW2ldLng7Ci0JCWF0dHIyLnkgPSBzY3JfYXR0cl9jYWNoZVtpXS55OwotCQlhdHRyMi53aWR0aCA9IHNjcl9hdHRyX2NhY2hlW2ldLndpZHRoOwotCQlhdHRyMi5oZWlnaHQgPSBzY3JfYXR0cl9jYWNoZVtpXS5oZWlnaHQ7Ci0JCWF0dHIyLm1hcF9zdGF0ZSA9IHNjcl9hdHRyX2NhY2hlW2ldLm1hcF9zdGF0ZTsKLQkJcngyID0gc2NyX2F0dHJfY2FjaGVbaV0ucng7Ci0JCXJ5MiA9IHNjcl9hdHRyX2NhY2hlW2ldLnJ5OwotCQl2YWxpZCA9IHNjcl9hdHRyX2NhY2hlW2ldLnZhbGlkOwotCi0JICAgIH0gZWxzZSB7Ci0JCXZhbGlkID0gdmFsaWRfd2luZG93KGRzdCwgJmF0dHIyLCAxKTsKLQotCQlpZiAodmFsaWQpIHsKLQkJCWlmICgheHRyYW5zbGF0ZShkc3QsIHJvb3R3aW4sIDAsIDAsICZyeDIsICZyeTIsICZjLCAxKSkgewotCQkJCXZhbGlkID0gMDsKLQkJCX0KLQkJfQotCQlpZiAobmV4dF9pbmRleCA+PSAwKSB7Ci0JCQlpID0gbmV4dF9pbmRleDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLndpbiA9IGRzdDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLmZldGNoZWQgPSAxOwotCQkJc2NyX2F0dHJfY2FjaGVbaV0udmFsaWQgPSB2YWxpZDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLnRpbWUgPSBkbm93KCk7Ci0JCQlpZiAodmFsaWQpIHsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS54ID0gYXR0cjIueDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS55ID0gYXR0cjIueTsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS53aWR0aCA9IGF0dHIyLndpZHRoOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLmhlaWdodCA9IGF0dHIyLmhlaWdodDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5ib3JkZXJfd2lkdGggPSBhdHRyMi5ib3JkZXJfd2lkdGg7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0uZGVwdGggPSBhdHRyMi5kZXB0aDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5jbGFzcyA9IGF0dHIyLmNsYXNzOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLmJhY2tpbmdfc3RvcmUgPQotCQkJCSAgICBhdHRyMi5iYWNraW5nX3N0b3JlOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLm1hcF9zdGF0ZSA9IGF0dHIyLm1hcF9zdGF0ZTsKLQotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLnJ4ID0gcngyOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLnJ5ID0gcnkyOwotCQkJfQotCQl9Ci0JICAgIH0KLQotaWYgKGRiYSB8fCBkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBLT8gc3JjX3g6ICVkIHNyY195OiAlZCAiCi0JImRzdF94OiAlZCBkc3RfeTogJWQgdzogJWQgaDogJWQgc2NyX2V2X2NudDogJWQgMHglbHgvMHglbHhcbiIsCi0Jc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIHcsIGgsIHNjcl9ldl9jbnQsIHNyYywgZHN0KTsKLQotCQlpZiAoISB2YWxpZCkgewotCQkJaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ0Egbm90IHZhbGlkLTIuXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYXR0cjIubWFwX3N0YXRlICE9IElzVmlld2FibGUpIHsKLQkJCWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBIG5vdCB2aWV3YWJsZS0yLlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZHN0X3ggPSBkc3RfeCAtIChyeCAtIHJ4Mik7Ci0JCWRzdF95ID0gZHN0X3kgLSAocnkgLSByeTIpOwotCi0JCWR4ID0gZHN0X3ggLSBzcmNfeDsKLQkJZHkgPSBkc3RfeSAtIHNyY195OwotCi0JCWlmIChkeCAhPSAwICYmIGR5ICE9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCi0gaWYgKDAgfHwgZGJhIHx8IGRiKSB7Ci0JZG91YmxlIHN0LCBkdDsKLQlzdCA9IChkb3VibGUpIHJlY19kYXRhLT5zZXJ2ZXJfdGltZS8xMDAwLjA7Ci0JZHQgPSAoZG5vdygpIC0gc2VydmVydGltZV9kaWZmKSAtIHN0OwotCWZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NBLSVkICpGT1VORF9TQ1JPTEw6IHNyYzogMHglbHggZHg6ICVkIGR5OiAlZCAiCi0JIng6ICVkIHk6ICVkIHc6ICVkIGg6ICVkIHN0OiAlLjRmICUuNGYgICUuNGZcbiIsIGsrKywgc3JjLCBkeCwgZHksCi0Jc3JjX3gsIHNyY195LCB3LCBoLCBzdCwgZHQsIGRub3d4KCkpOwotIH0KLQotCWkgPSBzY3JfZXZfY250OwotCi0Jc2NyX2V2W2ldLndpbiA9IHNyYzsKLQlzY3JfZXZbaV0uZnJhbWUgPSBOb25lOwotCXNjcl9ldltpXS5keCA9IGR4OwotCXNjcl9ldltpXS5keSA9IGR5OwotCXNjcl9ldltpXS54ID0gcnggKyBkc3RfeDsKLQlzY3JfZXZbaV0ueSA9IHJ5ICsgZHN0X3k7Ci0Jc2NyX2V2W2ldLncgPSB3OwotCXNjcl9ldltpXS5oID0gaDsKLQlzY3JfZXZbaV0udCA9ICgoZG91YmxlKSByZWNfZGF0YS0+c2VydmVyX3RpbWUpLzEwMDAuMDsKLQlzY3JfZXZbaV0ud2luX3ggPSByeDsKLQlzY3JfZXZbaV0ud2luX3kgPSByeTsKLQlzY3JfZXZbaV0ud2luX3cgPSBhdHRyLndpZHRoOwotCXNjcl9ldltpXS53aW5faCA9IGF0dHIuaGVpZ2h0OwotCXNjcl9ldltpXS5uZXdfeCA9IDA7Ci0Jc2NyX2V2W2ldLm5ld195ID0gMDsKLQlzY3JfZXZbaV0ubmV3X3cgPSAwOwotCXNjcl9ldltpXS5uZXdfaCA9IDA7Ci0KLQlpZiAoZHggPT0gMCkgewotCQlpZiAoZHkgPiAwKSB7Ci0JCQlzY3JfZXZbaV0ubmV3X3ggPSByeCArIHNyY194OwotCQkJc2NyX2V2W2ldLm5ld195ID0gcnkgKyBzcmNfeTsKLQkJCXNjcl9ldltpXS5uZXdfdyA9IHc7Ci0JCQlzY3JfZXZbaV0ubmV3X2ggPSBkeTsKLQkJfSBlbHNlIHsKLQkJCXNjcl9ldltpXS5uZXdfeCA9IHJ4ICsgc3JjX3g7Ci0JCQlzY3JfZXZbaV0ubmV3X3kgPSByeSArIGRzdF95ICsgaDsKLQkJCXNjcl9ldltpXS5uZXdfdyA9IHc7Ci0JCQlzY3JfZXZbaV0ubmV3X2ggPSAtZHk7Ci0JCX0KLQl9IGVsc2UgaWYgKGR5ID09IDApIHsKLQkJaWYgKGR4ID4gMCkgewotCQkJc2NyX2V2W2ldLm5ld194ID0gcnggKyBzcmNfeDsKLQkJCXNjcl9ldltpXS5uZXdfeSA9IHJ4ICsgc3JjX3k7Ci0JCQlzY3JfZXZbaV0ubmV3X3cgPSBkeDsKLQkJCXNjcl9ldltpXS5uZXdfaCA9IGg7Ci0JCX0gZWxzZSB7Ci0JCQlzY3JfZXZbaV0ubmV3X3ggPSByeCArIGRzdF94ICsgdzsKLQkJCXNjcl9ldltpXS5uZXdfeSA9IHJ5ICsgc3JjX3k7Ci0JCQlzY3JfZXZbaV0ubmV3X3cgPSAtZHg7Ci0JCQlzY3JfZXZbaV0ubmV3X2ggPSBoOwotCQl9Ci0JfQotCi0Jc2NyX2V2X2NudCsrOwotfQotCi10eXBlZGVmIHN0cnVjdCBjd19ldmVudCB7Ci0JV2luZG93IHdpbjsKLQlpbnQgeCwgeSwgdywgaDsKLX0gY3dfZXZlbnRfdDsKLQotI2RlZmluZSBNQVhfQ1cgMTI4Ci1zdGF0aWMgY3dfZXZlbnRfdCBjd19ldmVudHNbTUFYX0NXXTsKLQotc3RhdGljIHZvaWQgcmVjb3JkX0NXKFhQb2ludGVyIHB0ciwgWFJlY29yZEludGVyY2VwdERhdGEgKnJlY19kYXRhKSB7Ci0JeENvbmZpZ3VyZVdpbmRvd1JlcSAqcmVxOwotCVdpbmRvdyB3aW4gPSBOb25lLCBjOwotCVdpbmRvdyBzcmMgPSBOb25lLCBkc3QgPSBOb25lOwotCVhXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0JaW50IGFic2VudCA9IDB4MTAwMDAwOwotCWludCBzcmNfeCwgc3JjX3ksIGRzdF94LCBkc3RfeSwgcngsIHJ5OwotCWludCBnb29kID0gMSwgZHgsIGR5LCBrPTAsIGksIGosIG1hdGNoLCBsaXN0WzNdOwotCWludCBmX3gsIGZfeSwgZl93LCBmX2g7Ci0JaW50IHgsIHksIHcsIGg7Ci0JaW50IHgwLCB5MCwgdzAsIGgwLCB4MSwgeTEsIHcxLCBoMSwgeDIsIHkyLCB3MiwgaDI7Ci0Jc3RhdGljIGludCBpbmRleCA9IDA7Ci0JdW5zaWduZWQgaW50IHZhbHNbNF07Ci0JdW5zaWduZWQgdG1hc2s7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGJhID0gMCwgZGIgPSBkZWJ1Z19zY3JvbGw7Ci0JaW50IGNhY2hlX2luZGV4LCBuZXh0X2luZGV4LCB2YWxpZDsKLQotCWlmIChkYikgewotCQlpZiAocmVjX2RhdGEtPmNhdGVnb3J5ID09IFhSZWNvcmRGcm9tQ2xpZW50KSB7Ci0JCQlyZXEgPSAoeENvbmZpZ3VyZVdpbmRvd1JlcSAqKSByZWNfZGF0YS0+ZGF0YTsKLQkJCWlmIChyZXEtPnJlcVR5cGUgPT0gWF9Db25maWd1cmVXaW5kb3cpIHsKLQkJCQlzcmMgPSByZXEtPndpbmRvdzsKLQkJCX0KLQkJfQotCX0KLQotaWYgKGRiYSB8fCBkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NXLSVkIGlkX2Jhc2U6IDB4JWx4ICBwdHI6IDB4JWx4ICIKLQkic2VxOiAweCVseCByYzogMHglbHggIGNhdDogJWQgIHN3YXBwZWQ6ICVkIDB4JWx4LzB4JWx4XG4iLCBrKyssCi0JcmVjX2RhdGEtPmlkX2Jhc2UsICh1bnNpZ25lZCBsb25nKSBwdHIsIHhyZWNvcmRfc2VxLCByY19zY3JvbGwsCi0JcmVjX2RhdGEtPmNhdGVnb3J5LCByZWNfZGF0YS0+Y2xpZW50X3N3YXBwZWQsIHNyYywgZHN0KTsKLQotCi0JaWYgKCEgeHJlY29yZGluZykgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQlpZiAoKFhJRCkgcHRyICE9IHhyZWNvcmRfc2VxKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZFxuIiwgaysrKTsKLQotCWlmIChyZWNfZGF0YS0+aWRfYmFzZSA9PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZFxuIiwgaysrKTsKLQotCWlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZFN0YXJ0T2ZEYXRhKSB7Ci0JCWluZGV4ID0gMDsKLQkJcmV0dXJuOwotCX0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NXLSVkXG4iLCBrKyspOwotCi0JaWYgKHJlY19kYXRhLT5jYXRlZ29yeSAhPSBYUmVjb3JkRnJvbUNsaWVudCkgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQlpZiAocmVjX2RhdGEtPmNsaWVudF9zd2FwcGVkKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZFxuIiwgaysrKTsKLQotCXJlcSA9ICh4Q29uZmlndXJlV2luZG93UmVxICopIHJlY19kYXRhLT5kYXRhOwotCi0JaWYgKHJlcS0+cmVxVHlwZSAhPSBYX0NvbmZpZ3VyZVdpbmRvdykgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQl0bWFzayA9IHJlcS0+bWFzazsKLQotCXRtYXNrICY9IH5DV1g7Ci0JdG1hc2sgJj0gfkNXWTsKLQl0bWFzayAmPSB+Q1dXaWR0aDsKLQl0bWFzayAmPSB+Q1dIZWlnaHQ7Ci0KLQlpZiAodG1hc2spIHsKLQkJLyogcmVxdWlyZSBubyBtb3JlIHRoYW4gdGhlc2UgNCBmbGFncyAqLwotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQlmX3ggPSByZXEtPm1hc2sgJiBDV1g7Ci0JZl95ID0gcmVxLT5tYXNrICYgQ1dZOwotCWZfdyA9IHJlcS0+bWFzayAmIENXV2lkdGg7Ci0JZl9oID0gcmVxLT5tYXNrICYgQ1dIZWlnaHQ7Ci0KLQlpZiAoISBmX3ggfHwgISBmX3kpICB7Ci0JCWlmIChmX3cgJiYgZl9oKSB7Ci0JCQk7CS8qIG5ldHNjYXBlIDQueCBzdHlsZSAqLwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQlpZiAoIChmX3cgJiYgIWZfaCkgfHwgKCFmX3cgJiYgZl9oKSApIHsKLQkJcmV0dXJuOwotCX0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAicmVjb3JkX0NXLSVkXG4iLCBrKyspOwotCQkKLQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKLQkJdmFsc1tpXSA9IDA7Ci0JfQotCi0JZGF0YSA9IChjaGFyICopcmVxOwotCWRhdGEgKz0gc3pfeENvbmZpZ3VyZVdpbmRvd1JlcTsKLQotCWZvciAoaT0wOyBpPHJlcS0+bGVuZ3RoOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IHY7Ci0JCS8qCi0JCSAqIFdlIHVzZSB1bnNpZ25lZCBpbnQgZm9yIHRoZSB2YWx1ZXMuICBUaGVyZSB3ZXJlCi0JCSAqIHNvbWUgY3Jhc2hlcyBvbiA2NGJpdCBtYWNoaW5lcyB3aXRoIHVuc2lnbmVkIGxvbmdzLgotCQkgKiBOZWVkIHRvIGNoZWNrIHRoYXQgWCBwcm90b2NvbCBzZW5kcyAzMmJpdCB2YWx1ZXMuCi0JCSAqLwotCQl2ID0gKiggKHVuc2lnbmVkIGludCAqKSBkYXRhKTsKLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiICB2YWxzWyVkXSAgMHgleC8lZFxuIiwgaSwgdiwgdik7Ci0JCXZhbHNbaV0gPSB2OwotCQlkYXRhICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOwotCX0KLQotCWlmIChpbmRleCA+PSBNQVhfQ1cpIHsKLQkJaW50IGksIGo7Ci0KLQkJLyogRklYTUUsIGNpcmN1bGFyLCBldGMuICovCi0JCWZvciAoaT0wOyBpPDI7IGkrKykgewotCQkJaiA9IE1BWF9DVyAtIDIgKyBpOwotCQkJY3dfZXZlbnRzW2ldLndpbiA9IGN3X2V2ZW50c1tqXS53aW47Ci0JCQljd19ldmVudHNbaV0ueCA9IGN3X2V2ZW50c1tqXS54OwotCQkJY3dfZXZlbnRzW2ldLnkgPSBjd19ldmVudHNbal0ueTsKLQkJCWN3X2V2ZW50c1tpXS53ID0gY3dfZXZlbnRzW2pdLnc7Ci0JCQljd19ldmVudHNbaV0uaCA9IGN3X2V2ZW50c1tqXS5oOwotCQl9Ci0JCWluZGV4ID0gMjsKLQl9Ci0KLQlpZiAoISBmX3ggJiYgISBmX3kpIHsKLQkJLyogbmV0c2NhcGUgNC54IHN0eWxlICBDV1dpZHRoLENXSGVpZ2h0ICovCi0JCXZhbHNbMl0gPSB2YWxzWzBdOwotCQl2YWxzWzNdID0gdmFsc1sxXTsKLQkJdmFsc1swXSA9IDA7Ci0JCXZhbHNbMV0gPSAwOwotCX0KLQotCWN3X2V2ZW50c1tpbmRleF0ud2luID0gcmVxLT53aW5kb3c7Ci0KLQlpZiAoISBmX3gpIHsKLQkJY3dfZXZlbnRzW2luZGV4XS54ID0gYWJzZW50OwotCX0gZWxzZSB7Ci0JCWN3X2V2ZW50c1tpbmRleF0ueCA9IChpbnQpIHZhbHNbMF07Ci0JfQotCWlmICghIGZfeSkgewotCQljd19ldmVudHNbaW5kZXhdLnkgPSBhYnNlbnQ7Ci0JfSBlbHNlIHsKLQkJY3dfZXZlbnRzW2luZGV4XS55ID0gKGludCkgdmFsc1sxXTsKLQl9Ci0KLQlpZiAoISBmX3cpIHsKLQkJY3dfZXZlbnRzW2luZGV4XS53ID0gYWJzZW50OwotCX0gZWxzZSB7Ci0JCWN3X2V2ZW50c1tpbmRleF0udyA9IChpbnQpIHZhbHNbMl07Ci0JfQotCWlmICghIGZfaCkgewotCQljd19ldmVudHNbaW5kZXhdLmggPSBhYnNlbnQ7Ci0JfSBlbHNlIHsKLQkJY3dfZXZlbnRzW2luZGV4XS5oID0gKGludCkgdmFsc1szXTsKLQl9Ci0KLQl4ID0gY3dfZXZlbnRzW2luZGV4XS54OwotCXkgPSBjd19ldmVudHNbaW5kZXhdLnk7Ci0JdyA9IGN3X2V2ZW50c1tpbmRleF0udzsKLQloID0gY3dfZXZlbnRzW2luZGV4XS5oOwotCXdpbiA9IGN3X2V2ZW50c1tpbmRleF0ud2luOwotCi1pZiAoZGJhIHx8IGRiKSBmcHJpbnRmKHN0ZGVyciwgIiAgcmVjb3JkX0NXIGluZDogJWQgd2luOiAweCVseCB4OiAlZCB5OiAlZCB3OiAlZCBoOiAlZFxuIiwKLQlpbmRleCwgd2luLCB4LCB5LCB3LCBoKTsKLQotCWluZGV4Kys7Ci0KLQlpZiAoaW5kZXggPCAzKSB7Ci0JCWdvb2QgPSAwOwotCX0gZWxzZSBpZiAodyAhPSBhYnNlbnQgJiYgaCAhPSBhYnNlbnQgJiYKLQkgICAgdypoIDwgc2Nyb2xsY29weXJlY3RfbWluX2FyZWEpIHsKLQkJZ29vZCA9IDA7Ci0JfQotCi0JaWYgKCEgZ29vZCkgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQltYXRjaCA9IDA7Ci0JZm9yIChqPWluZGV4IC0gMTsgaiA+PSAwOyBqLS0pIHsKLQkJaWYgKGN3X2V2ZW50c1tqXS53aW4gPT0gd2luKSB7Ci0JCQlsaXN0W21hdGNoKytdID0gajsKLQkJfQotCQlpZiAobWF0Y2ggPj0gMykgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAobWF0Y2ggIT0gMykgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLS8qCi0KLU1vemlsbGE6Ci0KLVVwIGFycm93OiB3aW5kb3cgbW92ZXMgZG93biBhIGJpdCAoZHkgPiAwKToKLQotIFhfQ29uZmlndXJlV2luZG93IAotICAgIGxlbmd0aDogNywgd2luZG93OiAweDJlMDAwY2QsIG1hc2s6IDB4ZiwgdjAgMCwgIHYxIC0xOCwgIHYyIDc2MCwgIHYzIDkwNiwgIHY0IDMyNzY5MiwgIHY1IDQ4MjM0NzAxLCAgdjYgMywgCi0gICAgICAgIENXLW1hc2s6IENXWCxDV1ksQ1dXaWR0aCxDV0hlaWdodCwKLSBYX0NvbmZpZ3VyZVdpbmRvdyAKLSAgICBsZW5ndGg6IDUsIHdpbmRvdzogMHgyZTAwMGNkLCBtYXNrOiAweDMsIHYwIDAsICB2MSAwLCAgdjIgNTA2NjM2LCAgdjMgNDgyMzQ3MDEsICB2NCA0ODIzNDUxMSwgCi0gICAgICAgIENXLW1hc2s6IENXWCxDV1ksCi0gWF9Db25maWd1cmVXaW5kb3cgCi0gICAgbGVuZ3RoOiA3LCB3aW5kb3c6IDB4MmUwMDBjZCwgbWFzazogMHhmLCB2MCAwLCAgdjEgMCwgIHYyIDc2MCwgIHYzIDg4OCwgIHY0IDY1NTc5LCAgdjUgMCwgIHY2IDEwODAwOSwgCi0gICAgICAgIENXLW1hc2s6IENXWCxDV1ksQ1dXaWR0aCxDV0hlaWdodCwKLQotRG93biBhcnJvdzogd2luZG93IG1vdmVzIHVwIGEgYml0IChkeSA8IDApOgotCi0gWF9Db25maWd1cmVXaW5kb3cgCi0gICAgbGVuZ3RoOiA3LCB3aW5kb3c6IDB4MmUwMDBjZCwgbWFzazogMHhmLCB2MCAwLCAgdjEgMCwgIHYyIDc2MCwgIHYzIDkwNiwgIHY0IDMyNzY5MiwgIHY1IDQ4MjM0NzAxLCAgdjYgMjYyMTQ3LCAKLSAgICAgICAgQ1ctbWFzazogQ1dYLENXWSxDV1dpZHRoLENXSGVpZ2h0LAotIFhfQ29uZmlndXJlV2luZG93IAotICAgIGxlbmd0aDogNSwgd2luZG93OiAweDJlMDAwY2QsIG1hc2s6IDB4MywgdjAgMCwgIHYxIC0xOCwgIHYyIDUwNjYzNiwgIHYzIDQ4MjM0NzAxLCAgdjQgNDgyMzQ1MTEsIAotICAgICAgICBDVy1tYXNrOiBDV1gsQ1dZLAotIFhfQ29uZmlndXJlV2luZG93IAotICAgIGxlbmd0aDogNywgd2luZG93OiAweDJlMDAwY2QsIG1hc2s6IDB4ZiwgdjAgMCwgIHYxIDAsICB2MiA3NjAsICB2MyA4ODgsICB2NCA5NjU1NSwgIHY1IDQ4MjY1NjQyLCAgdjYgNDgyNjUyNjIsIAotICAgICAgICBDVy1tYXNrOiBDV1gsQ1dZLENXV2lkdGgsQ1dIZWlnaHQsCi0KLQotTmV0c2NhcGUgNC54Ci0KLVVwIGFycm93OgotNzEuNzYxNDIgICAwLjAxOTg0IFhfQ29uZmlndXJlV2luZG93Ci0gICAgbGVuZ3RoOiA3LCB3aW5kb3c6IDB4OTgwMDQ4OCwgbWFzazogMHhmLCB2MCAwLCAgdjEgLTE1LCAgdjIgNzg1LCAgdjMgODgyLCAgdjQgMzI3NjkyLCAgdjUgMTU5Mzg0NzEyLCAgdjYgMTc2OTQ4NCwKLSAgICAgICAgQ1ctbWFzazogQ1dYLENXWSxDV1dpZHRoLENXSGVpZ2h0LAotNzEuNzYxNTMgICAwLjAwMDExIFhfQ29uZmlndXJlV2luZG93Ci0gICAgbGVuZ3RoOiA1LCB3aW5kb3c6IDB4OTgwMDQ4OCwgbWFzazogMHhjLCB2MCA3ODUsICB2MSA4NjcsICB2MiAzMjkyMjgsICB2MyAxNTkzODQ3MTIsICB2NCAxNTkzODM1NTUsCi0gICAgICAgIENXLW1hc2s6ICAgICAgIENXV2lkdGgsQ1dIZWlnaHQsCi0gICAgICAgICAgICAgICAgWFhYLFhYWAotNzEuNzYxNTcgICAwLjAwMDAzIFhfQ29uZmlndXJlV2luZG93Ci0gICAgbGVuZ3RoOiA1LCB3aW5kb3c6IDB4OTgwMDQ4OCwgbWFzazogMHgzLCB2MCAwLCAgdjEgMCwgIHYyIDEzMTEzMiwgIHYzIDE1OTM4NTMxMywgIHY0IDMyODc1OSwKLSAgICAgICAgQ1ctbWFzazogQ1dYLENXWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBYWFgsWFhYCi0KLURvd24gYXJyb3c6Ci03Mi45MzE0NyAgIDAuMDE5OTAgWF9Db25maWd1cmVXaW5kb3cKLSAgICBsZW5ndGg6IDUsIHdpbmRvdzogMHg5ODAwNDg4LCBtYXNrOiAweGMsIHYwIDc4NSwgIHYxIDg4MiwgIHYyIDMyODk3MiwgIHYzIDE1OTM4NDcxMiwgIHY0IDE1OTM4MzU1NSwKLSAgICAgICAgQ1ctbWFzazogICAgICAgQ1dXaWR0aCxDV0hlaWdodCwKLSAgICAgICAgICAgICAgICBYWFgsWFhYCi03Mi45MzE1NiAgIDAuMDAwMDkgWF9Db25maWd1cmVXaW5kb3cKLSAgICBsZW5ndGg6IDUsIHdpbmRvdzogMHg5ODAwNDg4LCBtYXNrOiAweDMsIHYwIDAsICB2MSAtMTUsICB2MiA0NTg3NjQsICB2MyAxNTkzODQ3MTIsICB2NCAxNTkzODM1NjcsCi0gICAgICAgIENXLW1hc2s6IENXWCxDV1ksCi03Mi45MzE2MCAgIDAuMDAwMDQgWF9Db25maWd1cmVXaW5kb3cKLSAgICBsZW5ndGg6IDcsIHdpbmRvdzogMHg5ODAwNDg4LCBtYXNrOiAweGYsIHYwIDAsICB2MSAwLCAgdjIgNzg1LCAgdjMgODY3LCAgdjQgMTMxMTMyLCAgdjUgMTU5Mzg1MzM1LCAgdjYgMzI4NzU5LAotICAgICAgICBDVy1tYXNrOiBDV1gsQ1dZLENXV2lkdGgsQ1dIZWlnaHQsCi0KLQotc2FkbHksIHByb2JhYmx5IG5lZWQgdG8gaGFuZGxlIHNvbWUgbW9yZS4uLgotCi0gKi8KLQl4MCA9IGN3X2V2ZW50c1tsaXN0WzJdXS54OwotCXkwID0gY3dfZXZlbnRzW2xpc3RbMl1dLnk7Ci0JdzAgPSBjd19ldmVudHNbbGlzdFsyXV0udzsKLQloMCA9IGN3X2V2ZW50c1tsaXN0WzJdXS5oOwotCi0JeDEgPSBjd19ldmVudHNbbGlzdFsxXV0ueDsKLQl5MSA9IGN3X2V2ZW50c1tsaXN0WzFdXS55OwotCXcxID0gY3dfZXZlbnRzW2xpc3RbMV1dLnc7Ci0JaDEgPSBjd19ldmVudHNbbGlzdFsxXV0uaDsKLQotCXgyID0gY3dfZXZlbnRzW2xpc3RbMF1dLng7Ci0JeTIgPSBjd19ldmVudHNbbGlzdFswXV0ueTsKLQl3MiA9IGN3X2V2ZW50c1tsaXN0WzBdXS53OwotCWgyID0gY3dfZXZlbnRzW2xpc3RbMF1dLmg7Ci0KLQkvKiBzZWUgTlM0IFhYWCdzIGFib3ZlOiAqLwotCWlmICh3MiA9PSBhYnNlbnQgfHwgaDIgPT0gYWJzZW50KSB7Ci0JCS8qIHVwIGFycm93ICovCi0JCWlmICh3MiA9PSBhYnNlbnQpIHsKLQkJCXcyID0gdzE7Ci0JCX0KLQkJaWYgKGgyID09IGFic2VudCkgewotCQkJaDIgPSBoMTsKLQkJfQotCX0KLQlpZiAoeDEgPT0gYWJzZW50IHx8IHkxID09IGFic2VudCkgewotCQkvKiB1cCBhcnJvdyAqLwotCQlpZiAoeDEgPT0gYWJzZW50KSB7Ci0JCQl4MSA9IHgyOwotCQl9Ci0JCWlmICh5MSA9PSBhYnNlbnQpIHsKLQkJCXkxID0geTI7Ci0JCX0KLQl9Ci0JaWYgKHgwID09IGFic2VudCB8fCB5MCA9PSBhYnNlbnQpIHsKLQkJLyogZG93biBhcnJvdyAqLwotCQlpZiAoeDAgPT0gYWJzZW50KSB7Ci0JCQkvKiBobW1tLi4uIHdoYXQgdG8gZG8gKi8KLQkJCXgwID0geDI7Ci0JCX0KLQkJaWYgKHkwID09IGFic2VudCkgewotCQkJeTAgPSB5MjsKLQkJfQotCX0KLQotaWYgKGRiYSkgZnByaW50ZihzdGRlcnIsICIlZC8lZC8lZC8lZCAgJWQvJWQvJWQvJWQgICVkLyVkLyVkLyVkXG4iLCB4MCwgeTAsIHcwLCBoMCwgeDEsIHkxLCB3MSwgaDEsIHgyLCB5MiwgdzIsIGgyKTsKLQotCWR5ID0geTEgLSB5MDsKLQlkeCA9IHgxIC0geDA7Ci0KLQlzcmNfeCA9IHgyOwotCXNyY195ID0geTI7Ci0JdyA9IHcyOwotCWggPSBoMjsKLQotCS8qIGNoZWNrIHcgYW5kIGggYmVmb3JlIHdlIG1vZGlmeSB0aGVtICovCi0JaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKLQkJZ29vZCA9IDA7Ci0JfSBlbHNlIGlmICh3ID09IGFic2VudCB8fCBoID09IGFic2VudCkgewotCQlnb29kID0gMDsKLQl9Ci0JaWYgKCEgZ29vZCkgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQlpZiAoZHkgPiAwKSB7Ci0JCWggLT0gZHk7CQotCX0gZWxzZSB7Ci0JCWggKz0gZHk7CQotCQlzcmNfeSAtPSBkeTsKLQl9Ci0JaWYgKGR4ID4gMCkgewotCQl3IC09IGR4OwkKLQl9IGVsc2UgewotCQl3ICs9IGR4OwkKLQkJc3JjX3ggLT0gZHg7Ci0JfQotCi0JZHN0X3ggPSBzcmNfeCArIGR4OwotCWRzdF95ID0gc3JjX3kgKyBkeTsKLQotCWlmICh4MCA9PSBhYnNlbnQgfHwgeDEgPT0gYWJzZW50IHx8IHgyID09IGFic2VudCkgewotCQlnb29kID0gMDsKLQl9IGVsc2UgaWYgKHkwID09IGFic2VudCB8fCB5MSA9PSBhYnNlbnQgfHwgeTIgPT0gYWJzZW50KSB7Ci0JCWdvb2QgPSAwOwotCX0gZWxzZSBpZiAoZHggIT0gMCAmJiBkeSAhPSAwKSB7Ci0JCWdvb2QgPSAwOwotCX0gZWxzZSBpZiAodzAgLSB3MiAhPSBuYWJzKGR4KSkgewotCQlnb29kID0gMDsKLQl9IGVsc2UgaWYgKGgwIC0gaDIgIT0gbmFicyhkeSkpIHsKLQkJZ29vZCA9IDA7Ci0JfSBlbHNlIGlmIChzY3JfZXZfY250ID49IFNDUl9FVl9NQVgpIHsKLQkJZ29vZCA9IDA7Ci0JfQotCi0JaWYgKCEgZ29vZCkgewotCQlyZXR1cm47Ci0JfQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICJyZWNvcmRfQ1ctJWRcbiIsIGsrKyk7Ci0KLQkvKgotCSAqIGdlb21ldHJ5IE9LLgotCSAqIGFmdGVyIGFsbCBvZiB0aGUgYWJvdmUgc3VjY2VlZHMsIG5vdyBjb250YWN0IFggc2VydmVyLgotCSAqLwotCWlmIChsb29rdXBfYXR0cl9jYWNoZSh3aW4sICZjYWNoZV9pbmRleCwgJm5leHRfaW5kZXgpKSB7Ci0JCWkgPSBjYWNoZV9pbmRleDsKLQkJYXR0ci54ID0gc2NyX2F0dHJfY2FjaGVbaV0ueDsKLQkJYXR0ci55ID0gc2NyX2F0dHJfY2FjaGVbaV0ueTsKLQkJYXR0ci53aWR0aCA9IHNjcl9hdHRyX2NhY2hlW2ldLndpZHRoOwotCQlhdHRyLmhlaWdodCA9IHNjcl9hdHRyX2NhY2hlW2ldLmhlaWdodDsKLQkJYXR0ci5tYXBfc3RhdGUgPSBzY3JfYXR0cl9jYWNoZVtpXS5tYXBfc3RhdGU7Ci0JCXJ4ID0gc2NyX2F0dHJfY2FjaGVbaV0ucng7Ci0JCXJ5ID0gc2NyX2F0dHJfY2FjaGVbaV0ucnk7Ci0JCXZhbGlkID0gc2NyX2F0dHJfY2FjaGVbaV0udmFsaWQ7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImxvb2t1cF9hdHRyX2NhY2hlIGhpdDogICUyZCAlMmQgMHglbHggJWRcbiIsCi0gICAgY2FjaGVfaW5kZXgsIG5leHRfaW5kZXgsIHdpbiwgdmFsaWQpOwotCi0JfSBlbHNlIHsKLQkJdmFsaWQgPSB2YWxpZF93aW5kb3cod2luLCAmYXR0ciwgMSk7Ci0KLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgImxvb2t1cF9hdHRyX2NhY2hlIE1JU1M6ICUyZCAlMmQgMHglbHggJWRcbiIsCi0gICAgY2FjaGVfaW5kZXgsIG5leHRfaW5kZXgsIHdpbiwgdmFsaWQpOwotCi0JCWlmICh2YWxpZCkgewotCQkJaWYgKCF4dHJhbnNsYXRlKHdpbiwgcm9vdHdpbiwgMCwgMCwgJnJ4LCAmcnksICZjLCAxKSkgewotCQkJCXZhbGlkID0gMDsKLQkJCX0KLQkJfQotCQlpZiAobmV4dF9pbmRleCA+PSAwKSB7Ci0JCQlpID0gbmV4dF9pbmRleDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLndpbiA9IHdpbjsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLmZldGNoZWQgPSAxOwotCQkJc2NyX2F0dHJfY2FjaGVbaV0udmFsaWQgPSB2YWxpZDsKLQkJCXNjcl9hdHRyX2NhY2hlW2ldLnRpbWUgPSBkbm93KCk7Ci0JCQlpZiAodmFsaWQpIHsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS54ID0gYXR0ci54OwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLnkgPSBhdHRyLnk7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0ud2lkdGggPSBhdHRyLndpZHRoOwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLmhlaWdodCA9IGF0dHIuaGVpZ2h0OwotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLmRlcHRoID0gYXR0ci5kZXB0aDsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5jbGFzcyA9IGF0dHIuY2xhc3M7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0uYmFja2luZ19zdG9yZSA9Ci0JCQkJICAgIGF0dHIuYmFja2luZ19zdG9yZTsKLQkJCQlzY3JfYXR0cl9jYWNoZVtpXS5tYXBfc3RhdGUgPSBhdHRyLm1hcF9zdGF0ZTsKLQotCQkJCXNjcl9hdHRyX2NhY2hlW2ldLnJ4ID0gcng7Ci0JCQkJc2NyX2F0dHJfY2FjaGVbaV0ucnkgPSByeTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghIHZhbGlkKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZFxuIiwgaysrKTsKLQotCWlmIChhdHRyLm1hcF9zdGF0ZSAhPSBJc1ZpZXdhYmxlKSB7Ci0JCXJldHVybjsKLQl9Ci1pZiAoZGIgPiAxKSBmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZFxuIiwgaysrKTsKLQotIGlmICgwIHx8IGRiYSB8fCBkYikgewotCWRvdWJsZSBzdCwgZHQ7Ci0Jc3QgPSAoZG91YmxlKSByZWNfZGF0YS0+c2VydmVyX3RpbWUvMTAwMC4wOwotCWR0ID0gKGRub3coKSAtIHNlcnZlcnRpbWVfZGlmZikgLSBzdDsKLQlmcHJpbnRmKHN0ZGVyciwgInJlY29yZF9DVy0lZCAqRk9VTkRfU0NST0xMOiB3aW46IDB4JWx4IGR4OiAlZCBkeTogJWQgIgotCSJ4OiAlZCB5OiAlZCB3OiAlZCBoOiAlZCAgc3Q6ICUuNGYgIGR0OiAlLjRmICAlLjRmXG4iLCBrKyssIHdpbiwKLQlkeCwgZHksIHNyY194LCBzcmNfeSwgdywgaCwgc3QsIGR0LCBkbm93eCgpKTsKLSB9Ci0KLQlpID0gc2NyX2V2X2NudDsKLQotCXNjcl9ldltpXS53aW4gPSB3aW47Ci0Jc2NyX2V2W2ldLmZyYW1lID0gTm9uZTsKLQlzY3JfZXZbaV0uZHggPSBkeDsKLQlzY3JfZXZbaV0uZHkgPSBkeTsKLQlzY3JfZXZbaV0ueCA9IHJ4ICsgZHN0X3g7Ci0Jc2NyX2V2W2ldLnkgPSByeSArIGRzdF95OwotCXNjcl9ldltpXS53ID0gdzsKLQlzY3JfZXZbaV0uaCA9IGg7Ci0Jc2NyX2V2W2ldLnQgPSAoKGRvdWJsZSkgcmVjX2RhdGEtPnNlcnZlcl90aW1lKS8xMDAwLjA7Ci0Jc2NyX2V2W2ldLndpbl94ID0gcng7Ci0Jc2NyX2V2W2ldLndpbl95ID0gcnk7Ci0Jc2NyX2V2W2ldLndpbl93ID0gYXR0ci53aWR0aDsKLQlzY3JfZXZbaV0ud2luX2ggPSBhdHRyLmhlaWdodDsKLQlzY3JfZXZbaV0ubmV3X3ggPSAwOwotCXNjcl9ldltpXS5uZXdfeSA9IDA7Ci0Jc2NyX2V2W2ldLm5ld193ID0gMDsKLQlzY3JfZXZbaV0ubmV3X2ggPSAwOwotCi0JaWYgKGR4ID09IDApIHsKLQkJaWYgKGR5ID4gMCkgewotCQkJc2NyX2V2W2ldLm5ld194ID0gcnggKyBzcmNfeDsKLQkJCXNjcl9ldltpXS5uZXdfeSA9IHJ5ICsgc3JjX3k7Ci0JCQlzY3JfZXZbaV0ubmV3X3cgPSB3OwotCQkJc2NyX2V2W2ldLm5ld19oID0gZHk7Ci0JCX0gZWxzZSB7Ci0JCQlzY3JfZXZbaV0ubmV3X3ggPSByeCArIHNyY194OwotCQkJc2NyX2V2W2ldLm5ld195ID0gcnkgKyBkc3RfeSArIGg7Ci0JCQlzY3JfZXZbaV0ubmV3X3cgPSB3OwotCQkJc2NyX2V2W2ldLm5ld19oID0gLWR5OwotCQl9Ci0JfSBlbHNlIGlmIChkeSA9PSAwKSB7Ci0JCWlmIChkeCA+IDApIHsKLQkJCXNjcl9ldltpXS5uZXdfeCA9IHJ4ICsgc3JjX3g7Ci0JCQlzY3JfZXZbaV0ubmV3X3kgPSByeCArIHNyY195OwotCQkJc2NyX2V2W2ldLm5ld193ID0gZHg7Ci0JCQlzY3JfZXZbaV0ubmV3X2ggPSBoOwotCQl9IGVsc2UgewotCQkJc2NyX2V2W2ldLm5ld194ID0gcnggKyBkc3RfeCArIHc7Ci0JCQlzY3JfZXZbaV0ubmV3X3kgPSByeSArIHNyY195OwotCQkJc2NyX2V2W2ldLm5ld193ID0gLWR4OwotCQkJc2NyX2V2W2ldLm5ld19oID0gaDsKLQkJfQotCX0KLQotCS8qIGluZGljYXRlIHdlIGhhdmUgYSBuZXcgb25lICovCi0Jc2NyX2V2X2NudCsrOwotCi0JaW5kZXggPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZWNvcmRfc3dpdGNoKFhQb2ludGVyIHB0ciwgWFJlY29yZEludGVyY2VwdERhdGEgKnJlY19kYXRhKSB7Ci0Jc3RhdGljIGludCBmaXJzdCA9IDE7Ci0JeFJlcSAqcmVxOwotCi0JaWYgKGZpcnN0KSB7Ci0JCWludCBpOwotCQlmb3IgKGk9MDsgaTxTQ1JfQVRUUl9DQUNIRTsgaSsrKSB7Ci0JCQlzY3JfYXR0cl9jYWNoZVtpXS53aW4gPSBOb25lOwotCQkJc2NyX2F0dHJfY2FjaGVbaV0uZmV0Y2hlZCA9IDA7Ci0JCQlzY3JfYXR0cl9jYWNoZVtpXS52YWxpZCA9IDA7Ci0JCQlzY3JfYXR0cl9jYWNoZVtpXS50aW1lID0gMC4wOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQl9Ci0KLQkvKiBzaG91bGQgaGFuZGxlIGNvbnRyb2wgbXNncywgc3RhcnQvc3RvcC9ldGMgKi8KLQlpZiAocmVjX2RhdGEtPmNhdGVnb3J5ID09IFhSZWNvcmRTdGFydE9mRGF0YSkgewotCQlyZWNvcmRfQ1cocHRyLCByZWNfZGF0YSk7Ci0JfSBlbHNlIGlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZEVuZE9mRGF0YSkgewotCQk7Ci0JfSBlbHNlIGlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZENsaWVudFN0YXJ0ZWQpIHsKLQkJOwotCX0gZWxzZSBpZiAocmVjX2RhdGEtPmNhdGVnb3J5ID09IFhSZWNvcmRDbGllbnREaWVkKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHJlY19kYXRhLT5jYXRlZ29yeSA9PSBYUmVjb3JkRnJvbVNlcnZlcikgewotCQk7Ci0JfQotCi0JaWYgKHJlY19kYXRhLT5jYXRlZ29yeSAhPSBYUmVjb3JkRnJvbUNsaWVudCkgewotCQlYUmVjb3JkRnJlZURhdGEocmVjX2RhdGEpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVxID0gKHhSZXEgKikgcmVjX2RhdGEtPmRhdGE7Ci0KLQlpZiAocmVxLT5yZXFUeXBlID09IFhfQ29weUFyZWEpIHsKLQkJcmVjb3JkX0NBKHB0ciwgcmVjX2RhdGEpOwotCX0gZWxzZSBpZiAocmVxLT5yZXFUeXBlID09IFhfQ29uZmlndXJlV2luZG93KSB7Ci0JCXJlY29yZF9DVyhwdHIsIHJlY19kYXRhKTsKLQl9IGVsc2UgewotCQk7Ci0JfQotCVhSZWNvcmRGcmVlRGF0YShyZWNfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF9ncmFiKFhQb2ludGVyIHB0ciwgWFJlY29yZEludGVyY2VwdERhdGEgKnJlY19kYXRhKSB7Ci0JeFJlcSAqcmVxOwotCWludCBkYiA9IDA7Ci0KLQlpZiAoZGVidWdfZ3JhYnMpIGRiID0gMTsKLQotCS8qIHNob3VsZCBoYW5kbGUgY29udHJvbCBtc2dzLCBzdGFydC9zdG9wL2V0YyAqLwotCWlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZFN0YXJ0T2ZEYXRhKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHJlY19kYXRhLT5jYXRlZ29yeSA9PSBYUmVjb3JkRW5kT2ZEYXRhKSB7Ci0JCTsKLQl9IGVsc2UgaWYgKHJlY19kYXRhLT5jYXRlZ29yeSA9PSBYUmVjb3JkQ2xpZW50U3RhcnRlZCkgewotCQk7Ci0JfSBlbHNlIGlmIChyZWNfZGF0YS0+Y2F0ZWdvcnkgPT0gWFJlY29yZENsaWVudERpZWQpIHsKLQkJOwotCX0gZWxzZSBpZiAocmVjX2RhdGEtPmNhdGVnb3J5ID09IFhSZWNvcmRGcm9tU2VydmVyKSB7Ci0JCTsKLQl9Ci0KLQlpZiAocmVjX2RhdGEtPmNhdGVnb3J5ICE9IFhSZWNvcmRGcm9tQ2xpZW50KSB7Ci0JCVhSZWNvcmRGcmVlRGF0YShyZWNfZGF0YSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXEgPSAoeFJlcSAqKSByZWNfZGF0YS0+ZGF0YTsKLQotCWlmIChyZXEtPnJlcVR5cGUgPT0gWF9HcmFiU2VydmVyKSB7Ci0JCWRvdWJsZSBub3cgPSBkbm93eCgpOwotCQl4c2VydmVyX2dyYWJiZWQrKzsKLQkJaWYgKGRiKSByZmJMb2coIlggc2VydmVyIEdyYWJiZWQ6ICAgICVkICUuNWZcbiIsIHhzZXJ2ZXJfZ3JhYmJlZCwgbm93KTsKLQkJaWYgKHhzZXJ2ZXJfZ3JhYmJlZCA+IDEpIHsKLQkJCS8qIAotCQkJICogc29tZSBhcHBzIGRvIG11bHRpcGxlIGdyYWJzLi4uIHZlcnkgdW5saWtlbHkKLQkJCSAqIHR3byBhcHBzIHdpbGwgYmUgZG9pbmcgaXQgYXQgc2FtZSB0aW1lLgotCQkJICovCi0JCQl4c2VydmVyX2dyYWJiZWQgPSAxOwotCQl9Ci0JfSBlbHNlIGlmIChyZXEtPnJlcVR5cGUgPT0gWF9VbmdyYWJTZXJ2ZXIpIHsKLQkJZG91YmxlIG5vdyA9IGRub3d4KCk7Ci0JCXhzZXJ2ZXJfZ3JhYmJlZC0tOwotCQlpZiAoeHNlcnZlcl9ncmFiYmVkIDwgMCkgewotCQkJeHNlcnZlcl9ncmFiYmVkID0gMDsKLQkJfQotCQlpZiAoZGIpIHJmYkxvZygiWCBzZXJ2ZXIgVW4tR3JhYmJlZDogJWQgJS41ZlxuIiwgeHNlcnZlcl9ncmFiYmVkLCBub3cpOwotCX0gZWxzZSB7Ci0JCTsKLQl9Ci0JWFJlY29yZEZyZWVEYXRhKHJlY19kYXRhKTsKLQotCS8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0JaWYgKHB0cikge30KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjaGVja194cmVjb3JkX2dyYWJzZXJ2ZXIodm9pZCkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCWludCBsYXN0X3ZhbCwgY250ID0gMCwgaSwgbWF4ID0gMTA7Ci0JZG91YmxlIGQ7Ci0JaWYgKCFnZHB5X2N0cmwgfHwgIWdkcHlfZGF0YSkgewotCQlyZXR1cm47Ci0JfQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybjsKLQotCWR0aW1lMCgmZCk7Ci0JWEZsdXNoX3dyKGdkcHlfY3RybCk7Ci0JZm9yIChpPTA7IGk8bWF4OyBpKyspIHsKLQkJbGFzdF92YWwgPSB4c2VydmVyX2dyYWJiZWQ7Ci0JCVhSZWNvcmRQcm9jZXNzUmVwbGllcyhnZHB5X2RhdGEpOwotCQlpZiAoeHNlcnZlcl9ncmFiYmVkICE9IGxhc3RfdmFsKSB7Ci0JCQljbnQrKzsKLQkJfSBlbHNlIGlmIChpID4gMikgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGNudCkgewotCQlYRmx1c2hfd3IoZ2RweV9jdHJsKTsKLQl9Ci0gaWYgKGRlYnVnX2dyYWJzICYmIGNudCA+IDApIHsKLQlkID0gZHRpbWUoJmQpOwotZnByaW50ZihzdGRlcnIsICJjaGVja194cmVjb3JkX2dyYWJzZXJ2ZXI6IGNudD0lZCBpPSVkICUuNGZcbiIsIGNudCwgaSwgZCk7Ci0gfQotI2VuZGlmCi19Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9SRUNPUkQKLXN0YXRpYyB2b2lkIHNodXRkb3duX3JlY29yZF9jb250ZXh0KFhSZWNvcmRDb250ZXh0IHJjLCBpbnQgYmVxdWlldCwgaW50IHJlb3BlbikgewotCWludCByZXQxLCByZXQyOwotCWludCB2ZXJiID0gKCFiZXF1aWV0ICYmICFxdWlldCk7Ci0KLQlSQVdGQl9SRVRfVk9JRAotCWlmICgwIHx8IGRlYnVnX3Njcm9sbCkgewotCQlyZmJMb2coInNodXRkb3duX3JlY29yZF9jb250ZXh0KDB4JWx4LCAlZCwgJWQpXG4iLCByYywKLQkJICAgIGJlcXVpZXQsIHJlb3Blbik7Ci0JCXZlcmIgPSAxOwotCX0KLQotCXJldDEgPSBYUmVjb3JkRGlzYWJsZUNvbnRleHQocmRweV9jdHJsLCByYyk7Ci0JaWYgKCFyZXQxICYmIHZlcmIpIHsKLQkJcmZiTG9nKCJYUmVjb3JkRGlzYWJsZUNvbnRleHQoMHglbHgpIGZhaWxlZC5cbiIsIHJjKTsJCi0JfQotCXJldDIgPSBYUmVjb3JkRnJlZUNvbnRleHQocmRweV9jdHJsLCByYyk7Ci0JaWYgKCFyZXQyICYmIHZlcmIpIHsKLQkJcmZiTG9nKCJYUmVjb3JkRnJlZUNvbnRleHQoMHglbHgpIGZhaWxlZC5cbiIsIHJjKTsJCi0JfQotCVhGbHVzaF93cihyZHB5X2N0cmwpOwotCi0JaWYgKHJlb3BlbiA9PSAyICYmIHJldDEgJiYgcmV0MikgewotCQlyZW9wZW4gPSAwOwkvKiAyIG1lYW5zIHJlb3BlbiBvbmx5IG9uIGZhaWx1cmUgICovCi0JfQotCWlmIChyZW9wZW4gJiYgZ2RweV9jdHJsKSB7Ci0JCWNoZWNrX3hyZWNvcmRfZ3JhYnNlcnZlcigpOwotCQlpZiAoeHNlcnZlcl9ncmFiYmVkKSB7Ci0JCQlyZmJMb2coInNodXRkb3duX3JlY29yZF9jb250ZXh0OiBza2lwIHJlb3BlbiwiCi0JCQkgICAgIiBzZXJ2ZXIgZ3JhYmJlZFxuIik7CQotCQkJcmVvcGVuID0gMDsKLQkJfQotCX0KLQlpZiAocmVvcGVuKSB7Ci0JCWNoYXIgKmRweXN0ciA9IERpc3BsYXlTdHJpbmcoZHB5KTsKLQotCQlpZiAoZGVidWdfc2Nyb2xsKSB7Ci0JCQlyZmJMb2coImNsb3NpbmcgUkVDT1JEIGRhdGEgY29ubmVjdGlvbi5cbiIpOwotCQl9Ci0JCVhDbG9zZURpc3BsYXlfd3IocmRweV9kYXRhKTsKLQkJcmRweV9kYXRhID0gTlVMTDsKLQotCQlpZiAoZGVidWdfc2Nyb2xsKSB7Ci0JCQlyZmJMb2coImNsb3NpbmcgUkVDT1JEIGNvbnRyb2wgY29ubmVjdGlvbi5cbiIpOwotCQl9Ci0JCVhDbG9zZURpc3BsYXlfd3IocmRweV9jdHJsKTsKLQkJcmRweV9jdHJsID0gTlVMTDsKLQotCQlyZHB5X2N0cmwgPSBYT3BlbkRpc3BsYXlfd3IoZHB5c3RyKTsKLQotCQlpZiAoISByZHB5X2N0cmwpIHsKLQkJCXJmYkxvZygiRmFpbGVkIHRvIHJlb3BlbiBSRUNPUkQgY29udHJvbCBjb25uZWN0aW9uOiIKLQkJCSAgICAiJXNcbiIsIGRweXN0cik7Ci0JCQlyZmJMb2coIiAgZGlzYWJsaW5nIFJFQ09SRCBzY3JvbGwgZGV0ZWN0aW9uLlxuIik7Ci0JCQl1c2VfeHJlY29yZCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWFN5bmMoZHB5LCBGYWxzZSk7Ci0KLQkJZGlzYWJsZV9ncmFic2VydmVyKHJkcHlfY3RybCwgMCk7Ci0JCVhTeW5jKHJkcHlfY3RybCwgVHJ1ZSk7Ci0KLQkJcmRweV9kYXRhID0gWE9wZW5EaXNwbGF5X3dyKGRweXN0cik7Ci0KLQkJaWYgKCEgcmRweV9kYXRhKSB7Ci0JCQlyZmJMb2coIkZhaWxlZCB0byByZW9wZW4gUkVDT1JEIGRhdGEgY29ubmVjdGlvbjoiCi0JCQkgICAgIiVzXG4iLCBkcHlzdHIpOwotCQkJcmZiTG9nKCIgIGRpc2FibGluZyBSRUNPUkQgc2Nyb2xsIGRldGVjdGlvbi5cbiIpOwotCQkJWENsb3NlRGlzcGxheV93cihyZHB5X2N0cmwpOwotCQkJcmRweV9jdHJsID0gTlVMTDsKLQkJCXVzZV94cmVjb3JkID0gMDsKLQkJCXJldHVybjsKLQkJfQotCQlkaXNhYmxlX2dyYWJzZXJ2ZXIocmRweV9kYXRhLCAwKTsKLQotCQlpZiAoZGVidWdfc2Nyb2xsIHx8ICghIGJlcXVpZXQgJiYgcmVvcGVuID09IDIpKSB7Ci0JCQlyZmJMb2coInJlb3BlbmVkIFJFQ09SRCBkYXRhIGFuZCBjb250cm9sIGRpc3BsYXkiCi0JCQkgICAgIiBjb25uZWN0aW9uczogJXNcbiIsIGRweXN0cik7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYKLQotdm9pZCBjaGVja194cmVjb3JkX3Jlc2V0KGludCBmb3JjZSkgewotCXN0YXRpYyBkb3VibGUgbGFzdF9yZXNldCA9IDAuMDsKLQlpbnQgcmVzZXRfdGltZSAgPSA2MCwgcmVxdWlyZV9pZGxlICA9IDEwOwotCWludCByZXNldF90aW1lMiA9IDYwMCwgcmVxdWlyZV9pZGxlMiA9IDQwOwotCWRvdWJsZSBub3cgPSAwLjA7Ci0JWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlciA9IE5VTEw7Ci0KLQlpZiAoZ2RweV9jdHJsKSB7Ci0JCVhfTE9DSzsKLQkJY2hlY2tfeHJlY29yZF9ncmFic2VydmVyKCk7Ci0JCVhfVU5MT0NLOwotCX0gZWxzZSB7Ci0JCS8qIG1vcmUgZGljZXkgaWYgbm90IHdhdGNoaW5nIGdyYWJzZXJ2ZXIgKi8KLQkJcmVzZXRfdGltZSA9IHJlc2V0X3RpbWUyOwotCQlyZXF1aXJlX2lkbGUgPSByZXF1aXJlX2lkbGUyOwotCX0KLQotCWlmICghdXNlX3hyZWNvcmQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoeHJlY29yZGluZykgewotCQlyZXR1cm47Ci0JfQotCWlmIChidXR0b25fbWFzaykgewotCQlyZXR1cm47Ci0JfQotCWlmICh4c2VydmVyX2dyYWJiZWQpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1bml4cHdfaW5fcHJvZ3Jlc3MpIHJldHVybjsKLQotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1JFQ09SRAotCWlmICghIHJjX3Njcm9sbCkgewotCQlyZXR1cm47Ci0JfQotCW5vdyA9IGRub3coKTsKLQlpZiAobGFzdF9yZXNldCA9PSAwLjApIHsKLQkJbGFzdF9yZXNldCA9IG5vdzsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIHRyeSB0byB3YWl0IGZvciBhIGJyZWFrIGluIGlucHV0IHRvIHJlb3BlbiB0aGUgZGlzcGxheXMKLQkgKiB0aGlzIGlzIG9ubHkgdG8gYXZvaWQgWEdyYWJTZXJ2ZXIgZGVhZGxvY2sgb24gdGhlIHJlcG9wZW5zLgotCSAqLwotCWlmIChmb3JjZSkgewotCQk7Ci0JfSBlbHNlIGlmIChub3cgPCBsYXN0X3Jlc2V0ICsgcmVzZXRfdGltZSkgewotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChub3cgPCBsYXN0X3BvaW50ZXJfY2xpY2tfdGltZSArIHJlcXVpcmVfaWRsZSkgIHsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAobm93IDwgbGFzdF9rZXlib2FyZF90aW1lICsgcmVxdWlyZV9pZGxlKSAgewotCQlyZXR1cm47Ci0JfQotCVhfTE9DSzsKLQl0cmFwcGVkX3JlY29yZF94ZXJyb3IgPSAwOwotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3JlY29yZF94ZXJyb3IpOwotCi0JLyogdW5saWtlbHksIGJ1dCBjaGVjayBhZ2FpbiBzaW5jZSB3ZSB3aWxsIGRlZmluaXRlbHkgYmUgZG9pbmcgaXQuICovCi0JaWYgKGdkcHlfY3RybCkgewotCQljaGVja194cmVjb3JkX2dyYWJzZXJ2ZXIoKTsKLQkJaWYgKHhzZXJ2ZXJfZ3JhYmJlZCkgewotCQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCQlYX1VOTE9DSzsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQlzaHV0ZG93bl9yZWNvcmRfY29udGV4dChyY19zY3JvbGwsIDAsIDEpOwotCXJjX3Njcm9sbCA9IDA7Ci0KLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQlYX1VOTE9DSzsKLQotCWxhc3RfcmVzZXQgPSBub3c7Ci0jZWxzZQotCWlmICghb2xkX2hhbmRsZXIgfHwgbm93ID09IDAuMCB8fCAhbGFzdF9yZXNldCB8fCAhZm9yY2UpIHt9Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBSRUNPUkRfRVJST1JfTVNHKHRhZykgXAotCWlmICghIHF1aWV0KSB7IFwKLQkJc3RhdGljIGludCBjbnQgPSAwOyBcCi0JCXN0YXRpYyB0aW1lX3QgbGFzdCA9IDA7IFwKLQkJaW50IHNob3cgPSAwOyBcCi0JCWNudCsrOyBcCi0JCWlmIChkZWJ1Z19zY3JvbGwgfHwgY250IDwgMjApIHsgXAotCQkJc2hvdyA9IDE7IFwKLQkJfSBlbHNlIGlmIChjbnQgPT0gMjApIHsgXAotCQkJbGFzdCA9IHRpbWUoTlVMTCk7IFwKLQkJCXJmYkxvZygiZGlzYWJsaW5nIFJFQ09SRCBYRXJyb3IgbWVzc2FnZXMgZm9yIDYwMHNcbiIpOyBcCi0JCQlzaG93ID0gMTsgXAotCQl9IGVsc2UgaWYgKHRpbWUoTlVMTCkgPiBsYXN0ICsgNjAwKSB7IFwKLQkJCWNudCA9IDA7IFwKLQkJCXNob3cgPSAxOyBcCi0JCX0gXAotCQlpZiAoc2hvdykgeyBcCi0JCQlyZmJMb2coInRyYXBwZWQgUkVDT1JEIFhFcnJvcjogJXMgJXMgJWQvJWQvJWQgKDB4JWx4KVxuIiwgXAotCQkJICAgIHRhZywgeGVycm9yX3N0cmluZyh0cmFwcGVkX3JlY29yZF94ZXJyb3JfZXZlbnQpLCBcCi0JCQkgICAgKGludCkgdHJhcHBlZF9yZWNvcmRfeGVycm9yX2V2ZW50LT5lcnJvcl9jb2RlLCBcCi0JCQkgICAgKGludCkgdHJhcHBlZF9yZWNvcmRfeGVycm9yX2V2ZW50LT5yZXF1ZXN0X2NvZGUsIFwKLQkJCSAgICAoaW50KSB0cmFwcGVkX3JlY29yZF94ZXJyb3JfZXZlbnQtPm1pbm9yX2NvZGUsIFwKLQkJCSAgICAoaW50KSB0cmFwcGVkX3JlY29yZF94ZXJyb3JfZXZlbnQtPnJlc291cmNlaWQpOyBcCi0JCX0gXAotCX0KLQotdm9pZCB4cmVjb3JkX3dhdGNoKGludCBzdGFydCwgaW50IHNldGJ5KSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi0JV2luZG93IGZvY3VzLCB3bSwgYywgY2xhc3Q7Ci0Jc3RhdGljIGRvdWJsZSBjcmVhdGVfdGltZSA9IDAuMDsKLQlpbnQgcmM7Ci0JaW50IGRvX3NodXRkb3duID0gMDsKLQlpbnQgcmVvcGVuX2RweXMgPSAxOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXIgPSBOVUxMOwotCXN0YXRpYyBXaW5kb3cgbGFzdF93aW4gPSBOb25lLCBsYXN0X3Jlc3VsdCA9IE5vbmU7Ci0jZW5kaWYKLQlpbnQgZGIgPSBkZWJ1Z19zY3JvbGw7Ci0JZG91YmxlIG5vdzsKLQlzdGF0aWMgZG91YmxlIGxhc3RfZXJyb3IgPSAwLjA7Ci0KLWlmICgwKSBkYiA9IDE7Ci0KLQlpZiAobm9mYikgewotCQl4cmVjb3JkaW5nID0gMDsKLQkJcmV0dXJuOwotCX0KLQlpZiAodXNlX3RocmVhZHMpIHsKLQkJLyogWFhYIG5vdCB3b3JraW5nLiAgU3RpbGw/ICBQYWludGluZyBlcnJvcnMuICovCi0JCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCQlpZiAoZmlyc3QpIHsKLQkJCWlmICh1c2VfeHJlY29yZCAmJiAhZ2V0ZW52KCJYUkVDT1JEX1RIUkVBRFMiKSkgewotCQkJCXJmYkxvZygieHJlY29yZF93YXRjaDogZGlzYWJsaW5nIHNjcm9sbCBkZXRlY3Rpb24gaW4gLXRocmVhZHMgbW9kZS5cbiIpOwotCQkJCXJmYkxvZygieHJlY29yZF93YXRjaDogU2V0IC1lbnYgWFJFQ09SRF9USFJFQURTPTEgdG8gZW5hYmxlIGl0LlxuIik7Ci0JCQkJdXNlX3hyZWNvcmQgPSAwOwotCQkJCXhyZWNvcmRpbmcgPSAwOwotCQkJfQotCQkJZmlyc3QgPSAwOwotCQl9Ci0JCWlmICghdXNlX3hyZWNvcmQgJiYgIXhyZWNvcmRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWR0aW1lMCgmbm93KTsKLQlpZiAobm93IDwgbGFzdF9lcnJvciArIDAuNSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGdkcHlfY3RybCkgewotCQlYX0xPQ0s7Ci0JCWNoZWNrX3hyZWNvcmRfZ3JhYnNlcnZlcigpOwotCQlYX1VOTE9DSzsKLQkJaWYgKHhzZXJ2ZXJfZ3JhYmJlZCkgewotaWYgKGRiIHx8IGRlYnVnX2dyYWJzKSBmcHJpbnRmKHN0ZGVyciwgInhyZWNvcmRfd2F0Y2g6ICVkLyVkICBvdXQgeHNlcnZlcl9ncmFiYmVkXG4iLCBzdGFydCwgc2V0YnkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfUkVDT1JECi0JaWYgKCEgc3RhcnQpIHsKLQkJaW50IHNodXRfcmVvcGVuID0gMiwgc2h1dF90aW1lID0gMjU7Ci1pZiAoZGIgfHwgZGVidWdfZ3JhYnMpIGZwcmludGYoc3RkZXJyLCAiWFJFQ09SRCBPRkY6ICVkLyVkICAlLjRmXG4iLCB4cmVjb3JkaW5nLCBzZXRieSwgbm93IC0geDExdm5jX3N0YXJ0KTsKLQkJeHJlY29yZGluZyA9IDA7Ci0JCWlmICghIHJjX3Njcm9sbCkgewotCQkJeHJlY29yZF9mb2N1c193aW5kb3cgPSBOb25lOwotCQkJeHJlY29yZF93bV93aW5kb3cgPSBOb25lOwotCQkJeHJlY29yZF9wdHJfd2luZG93ID0gTm9uZTsKLQkJCXhyZWNvcmRfa2V5c3ltID0gTm9TeW1ib2w7Ci0JCQlyY3Nfc2Nyb2xsID0gMDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghIGRvX3NodXRkb3duICYmIG5vdyA+IGNyZWF0ZV90aW1lICsgc2h1dF90aW1lKSB7Ci0JCQkvKiBYWFggdW5zdGFibGUgaWYgd2Uga2VlcCBhIFJFQ09SRCBnb2luZyBmb3JldmVyICovCi0JCQlkb19zaHV0ZG93biA9IDE7Ci0JCX0KLQotCQlTQ1JfTE9DSzsKLQkJCi0JCWlmIChkb19zaHV0ZG93bikgewotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICI9PT0gc2h1dGRvd24tc2Nyb2xsIDB4JWx4XG4iLCByY19zY3JvbGwpOwotCQkJWF9MT0NLOwotCQkJdHJhcHBlZF9yZWNvcmRfeGVycm9yID0gMDsKLQkJCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3JlY29yZF94ZXJyb3IpOwotCi0JCQlzaHV0ZG93bl9yZWNvcmRfY29udGV4dChyY19zY3JvbGwsIDAsIHNodXRfcmVvcGVuKTsKLQkJCXJjX3Njcm9sbCA9IDA7Ci0KLQkJCS8qCi0JCQkgKiBuLmIuIHRoZXJlIGlzIGEgZ3JhYnNlcnZlciBpc3N1ZSB3cnQKLQkJCSAqIFhSZWNvcmRDcmVhdGVDb250ZXh0KCkgZXZlbiB0aG91Z2ggcmRweV9jdHJsCi0JCQkgKiBpcyBzZXQgaW1wcmV2aW91cyB0byBncmFicy4gIFBlcmhhcHMgYSBidWcKLQkJCSAqIGluIHRoZSBYIHNlcnZlciBvciBsaWJyYXJ5Li4uCi0JCQkgKgotCQkJICogSWYgdGhlcmUgYXJlIGZ1cnRoZXIgcHJvYmxlbXMsIGEgdGhvdWdodAotCQkJICogdG8gcmVjcmVhdGUgcmNfc2Nyb2xsIHJpZ2h0IGFmdGVyIHRoZQotCQkJICogcmVvcGVuLgotCQkJICovCi0KLQkJCWlmICghIHVzZV94cmVjb3JkKSB7Ci0JCQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJU0NSX1VOTE9DSzsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVhSZWNvcmRQcm9jZXNzUmVwbGllcyhyZHB5X2RhdGEpOwotCi0JCQlpZiAodHJhcHBlZF9yZWNvcmRfeGVycm9yKSB7Ci0JCQkJUkVDT1JEX0VSUk9SX01TRygic2h1dGRvd24iKTsKLQkJCQlsYXN0X2Vycm9yID0gbm93OwotCQkJfQotCi0JCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJCVhfVU5MT0NLOwotCQkJU0NSX1VOTE9DSzsKLQotCQl9IGVsc2UgewotCQkJaWYgKHJjc19zY3JvbGwpIHsKLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiPT09IGRpc2FiLXNjcm9sbCAweCVseCAweCVseFxuIiwgcmNfc2Nyb2xsLCByY3Nfc2Nyb2xsKTsKLQkJCQlYX0xPQ0s7Ci0JCQkJdHJhcHBlZF9yZWNvcmRfeGVycm9yID0gMDsKLQkJCQlvbGRfaGFuZGxlciA9Ci0JCQkJICAgIFhTZXRFcnJvckhhbmRsZXIodHJhcF9yZWNvcmRfeGVycm9yKTsKLQotCQkJCXJjc19zY3JvbGwgPSBYUmVjb3JkQ3VycmVudENsaWVudHM7Ci0JCQkJWFJlY29yZFVucmVnaXN0ZXJDbGllbnRzKHJkcHlfY3RybCwgcmNfc2Nyb2xsLAotCQkJCSAgICAmcmNzX3Njcm9sbCwgMSk7Ci0JCQkJWFJlY29yZERpc2FibGVDb250ZXh0KHJkcHlfY3RybCwgcmNfc2Nyb2xsKTsKLQkJCQlYRmx1c2hfd3IocmRweV9jdHJsKTsKLQkJCQlYUmVjb3JkUHJvY2Vzc1JlcGxpZXMocmRweV9kYXRhKTsKLQotCQkJCWlmICh0cmFwcGVkX3JlY29yZF94ZXJyb3IpIHsKLQkJCQkJUkVDT1JEX0VSUk9SX01TRygiZGlzYWJsZSIpOwotCi0JCQkJCXNodXRkb3duX3JlY29yZF9jb250ZXh0KHJjX3Njcm9sbCwKLQkJCQkJICAgIDAsIHJlb3Blbl9kcHlzKTsKLQkJCQkJcmNfc2Nyb2xsID0gMDsKLQotCQkJCQlsYXN0X2Vycm9yID0gbm93OwotCi0JCQkJCWlmICghIHVzZV94cmVjb3JkKSB7Ci0JCQkJCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJCQkJCVhfVU5MT0NLOwotCQkJCQkJU0NSX1VOTE9DSzsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQkJCQlYX1VOTE9DSzsKLQkJCX0KLQkJfQotCi0JCVNDUl9VTkxPQ0s7Ci0JCS8qCi0JCSAqIFhYWCBpZiB3ZSBkbyBhIFhGbHVzaF93cihyZHB5X2N0cmwpIGhlcmUgd2UgZ2V0OgotCQkgKgotCi0JCVggRXJyb3Igb2YgZmFpbGVkIHJlcXVlc3Q6ICBYUmVjb3JkQmFkQ29udGV4dAotCQkgIE1ham9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogIDE0NSAoUkVDT1JEKQotCQkgIE1pbm9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogIDUgKFhSZWNvcmRFbmFibGVDb250ZXh0KQotCQkgIENvbnRleHQgaW4gZmFpbGVkIHJlcXVlc3Q6ICAweDIyMDAwMTMKLQkJICBTZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0OiAgMjkKLQkJICBDdXJyZW50IHNlcmlhbCBudW1iZXIgaW4gb3V0cHV0IHN0cmVhbTogIDI5Ci0KLQkJICoKLQkJICogbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgaXMgZ29pbmcgb24uLi4gc2luY2UgaXQgbWF5IGxlYWQKLQkJICogaW5mcmVxdWVudCBmYWlsdXJlcy4KLQkJICovCi0JCXhyZWNvcmRfZm9jdXNfd2luZG93ID0gTm9uZTsKLQkJeHJlY29yZF93bV93aW5kb3cgPSBOb25lOwotCQl4cmVjb3JkX3B0cl93aW5kb3cgPSBOb25lOwotCQl4cmVjb3JkX2tleXN5bSA9IE5vU3ltYm9sOwotCQlyY3Nfc2Nyb2xsID0gMDsKLQkJcmV0dXJuOwotCX0KLWlmIChkYiB8fCBkZWJ1Z19ncmFicykgZnByaW50ZihzdGRlcnIsICJYUkVDT1JEIE9OOiAgJWQvJWQgICUuNGZcbiIsIHhyZWNvcmRpbmcsIHNldGJ5LCBub3cgLSB4MTF2bmNfc3RhcnQpOwotCi0JaWYgKHhyZWNvcmRpbmcpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChkb19zaHV0ZG93biAmJiByY19zY3JvbGwpIHsKLQkJc3RhdGljIGludCBkaWRtc2cgPSAwOwotCQkvKiBzaG91bGQgbm90IGhhcHBlbi4uLiAqLwotCQlpZiAoMCB8fCAhZGlkbXNnKSB7Ci0JCQlyZmJMb2coIndhcm5pbmc6IGRvX3NodXRkb3duICYmIHJjX3Njcm9sbFxuIik7Ci0JCQlkaWRtc2cgPSAxOwotCQl9Ci0JCXhyZWNvcmRfd2F0Y2goMCwgU0NSX05PTkUpOwotCX0KLQotCXhyZWNvcmRpbmcgPSAwOwotCXhyZWNvcmRfZm9jdXNfd2luZG93ID0gTm9uZTsKLQl4cmVjb3JkX3dtX3dpbmRvdyA9IE5vbmU7Ci0JeHJlY29yZF9wdHJfd2luZG93ID0gTm9uZTsKLQl4cmVjb3JkX2tleXN5bSA9IE5vU3ltYm9sOwotCXhyZWNvcmRfc2V0X2J5X2tleXMgID0gMDsKLQl4cmVjb3JkX3NldF9ieV9tb3VzZSA9IDA7Ci0KLQkvKiBnZXQgdGhlIHdpbmRvdyB3aXRoIGZvY3VzIGFuZCBtb3VzZSBwb2ludGVyOiAqLwotCWNsYXN0ID0gTm9uZTsKLQlmb2N1cyA9IE5vbmU7Ci0Jd20gPSBOb25lOwotCi0JWF9MT0NLOwotCVNDUl9MT0NLOwotI2lmIDAKLQkvKgotCSAqIHhyZWNvcmRfZm9jdXNfd2luZG93IC8gZm9jdXMgbm90IGN1cnJlbnRseSB1c2VkLi4uIHNhdmUgYQotCSAqIHJvdW5kIHRyaXAgdG8gdGhlIFggc2VydmVyIGZvciBub3cuCi0JICogTi5CLiBvdXIgaGV1cmlzdGljIGlzIGluYWNjdXJhdGU6IGlmIGhlIGlzIHNjcm9sbGluZyBhbmQKLQkgKiBkcmlmdHMgb2ZmIG9mIHRoZSBzY3JvbGxiYXIgb250byBhbm90aGVyIGFwcGxpY2F0aW9uIHdlCi0JICogd2lsbCBjYXRjaCB0aGF0IGFwcGxpY2F0aW9uLCBub3QgdGhlIHN0YXJ0aW5nIG9uZXMuCi0JICogY2hlY2tfeHJlY29yZF97a2V5cyxtb3VzZX0gbWl0aWdhdGVzIHRoaXMgc29tZXdoYXQgYnkKLQkgKiBkZWxheWluZyBjYWxscyB0byB4cmVjb3JkX3dhdGNoIGFzIG11Y2ggYXMgcG9zc2libGUuCi0JICovCi0JWEdldElucHV0Rm9jdXMoZHB5LCAmZm9jdXMsICZpKTsKLSNlbmRpZgotCi0Jd20gPSBxdWVyeV9wb2ludGVyKHJvb3R3aW4pOwotCWlmICh3bSkgewotCQljID0gd207Ci0JfSBlbHNlIHsKLQkJYyA9IHJvb3R3aW47Ci0JfQotCi0JLyogZGVzY2VuZCBhIGJpdCB0byBhdm9pZCB3bSBmcmFtZXM6ICovCi0JaWYgKGMgIT0gcm9vdHdpbiAmJiBjID09IGxhc3Rfd2luKSB7Ci0JCS8qIHVzZSBjYWNoZWQgcmVzdWx0cyB0byBhdm9pZCByb3VuZHRyaXBzOiAqLwotCQljbGFzdCA9IGxhc3RfcmVzdWx0OwotCX0gZWxzZSBpZiAoc2Nyb2xsX2dvb2RfYWxsID09IE5VTEwgJiYgc2Nyb2xsX3NraXBfYWxsID09IE5VTEwpIHsKLQkJLyogbW9yZSBlZmZpY2llbnQgaWYgbmFtZSBpbmZvIG5vdCBuZWVkZWQuICovCi0JCXhyZWNvcmRfbmFtZV9pbmZvWzBdID0gJ1wwJzsKLQkJY2xhc3QgPSBkZXNjZW5kX3BvaW50ZXIoNiwgYywgTlVMTCwgMCk7Ci0JfSBlbHNlIHsKLQkJY2hhciAqbm07Ci0JCWludCBtYXRjaGVkX2dvb2QgPSAwLCBtYXRjaGVkX3NraXAgPSAwOwotCi0JCWNsYXN0ID0gZGVzY2VuZF9wb2ludGVyKDYsIGMsIHhyZWNvcmRfbmFtZV9pbmZvLCBOQU1FSU5GTyk7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAibmFtZV9pbmZvOiAlc1xuIiwgeHJlY29yZF9uYW1lX2luZm8pOwotCi0JCW5tID0geHJlY29yZF9uYW1lX2luZm87Ci0KLQkJaWYgKHNjcm9sbF9nb29kX2FsbCkgewotCQkJbWF0Y2hlZF9nb29kICs9IG1hdGNoX3N0cl9saXN0KG5tLCBzY3JvbGxfZ29vZF9hbGwpOwotCQl9Ci0JCWlmIChzZXRieSA9PSBTQ1JfS0VZICYmIHNjcm9sbF9nb29kX2tleSkgewotCQkJbWF0Y2hlZF9nb29kICs9IG1hdGNoX3N0cl9saXN0KG5tLCBzY3JvbGxfZ29vZF9rZXkpOwotCQl9Ci0JCWlmIChzZXRieSA9PSBTQ1JfTU9VU0UgJiYgc2Nyb2xsX2dvb2RfbW91c2UpIHsKLQkJCW1hdGNoZWRfZ29vZCArPSBtYXRjaF9zdHJfbGlzdChubSwgc2Nyb2xsX2dvb2RfbW91c2UpOwotCQl9Ci0JCWlmIChzY3JvbGxfc2tpcF9hbGwpIHsKLQkJCW1hdGNoZWRfc2tpcCArPSBtYXRjaF9zdHJfbGlzdChubSwgc2Nyb2xsX3NraXBfYWxsKTsKLQkJfQotCQlpZiAoc2V0YnkgPT0gU0NSX0tFWSAmJiBzY3JvbGxfc2tpcF9rZXkpIHsKLQkJCW1hdGNoZWRfc2tpcCArPSBtYXRjaF9zdHJfbGlzdChubSwgc2Nyb2xsX3NraXBfa2V5KTsKLQkJfQotCQlpZiAoc2V0YnkgPT0gU0NSX01PVVNFICYmIHNjcm9sbF9za2lwX21vdXNlKSB7Ci0JCQltYXRjaGVkX3NraXAgKz0gbWF0Y2hfc3RyX2xpc3Qobm0sIHNjcm9sbF9za2lwX21vdXNlKTsKLQkJfQotCi0JCWlmICghbWF0Y2hlZF9nb29kICYmIG1hdGNoZWRfc2tpcCkgewotCQkJY2xhc3QgPSBOb25lOwotCQl9Ci0JfQotCWlmIChjICE9IHJvb3R3aW4pIHsKLQkJLyogY2FjaGUgcmVzdWx0cyBmb3IgcG9zc2libGUgdXNlIG5leHQgY2FsbCAqLwotCQlsYXN0X3dpbiA9IGM7Ci0JCWxhc3RfcmVzdWx0ID0gY2xhc3Q7Ci0JfQotCi0JaWYgKCFjbGFzdCB8fCBjbGFzdCA9PSByb290d2luKSB7Ci1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiLS0tIHhyZWNvcmRfd2F0Y2g6IFNLSVAuXG4iKTsKLQkJWF9VTkxPQ0s7Ci0JCVNDUl9VTkxPQ0s7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBzZXQgcHJvdG9jb2wgcmVxdWVzdCByYW5nZXM6ICovCi0JcnJfc2Nyb2xsWzBdID0gcnJfQ0E7Ci0JcnJfc2Nyb2xsWzFdID0gcnJfQ1c7Ci0KLQkvKgotCSAqIHN0YXJ0IHRyYXBwaW5nLi4uIHRoZXJlIHN0aWxsIGFyZSBzb21lIG9jY2FzaW9uYWwgZmFpbHVyZXMKLQkgKiBub3QgeWV0IHVuZGVyc3Rvb2QsIGxpa2VseSBzb21lIHJhY2UgY29uZGl0aW9uIFdSVCB0aGUgCi0JICogY29udGV4dCBiZWluZyBzZXR1cC4KLQkgKi8KLQl0cmFwcGVkX3JlY29yZF94ZXJyb3IgPSAwOwotCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih0cmFwX3JlY29yZF94ZXJyb3IpOwotCi0JaWYgKCEgcmNfc2Nyb2xsKSB7Ci0JCS8qIGRvX3NodXRkb3duIGNhc2Ugb3IgZmlyc3QgdGltZSBpbiAqLwotCi0JCWlmIChnZHB5X2N0cmwpIHsKLQkJCS8qCi0JCQkgKiBFdmVuIHRob3VnaCByZHB5X2N0cmwgaXMgaW1wZXJ2aW91cyB0byBncmFicwotCQkJICogYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgZ2V0IGRlYWRsb2NrLCB3aHk/Ci0JCQkgKiBJdCBibG9ja3MgaW4gdGhlIGxpYnJhcnkgZmluZF9kaXNwbGF5KCkgY2FsbC4KLQkJCSAqLwotCQkJY2hlY2tfeHJlY29yZF9ncmFic2VydmVyKCk7Ci0JCQlpZiAoeHNlcnZlcl9ncmFiYmVkKSB7Ci0JCQkJWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JCQkJWF9VTkxPQ0s7Ci0JCQkJU0NSX1VOTE9DSzsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmNzX3Njcm9sbCA9IChYUmVjb3JkQ2xpZW50U3BlYykgY2xhc3Q7Ci0JCXJjX3Njcm9sbCA9IFhSZWNvcmRDcmVhdGVDb250ZXh0KHJkcHlfY3RybCwgMCwgJnJjc19zY3JvbGwsIDEsCi0JCSAgICBycl9zY3JvbGwsIDIpOwotCi0JCWlmICghIGRvX3NodXRkb3duKSB7Ci0JCQlYU3luYyhyZHB5X2N0cmwsIEZhbHNlKTsKLQkJfQotaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIk5FVyByYzogICAgMHglbHhcbiIsIHJjX3Njcm9sbCk7Ci0JCWlmIChyY19zY3JvbGwpIHsKLQkJCWR0aW1lMCgmY3JlYXRlX3RpbWUpOwotCQl9IGVsc2UgewotCQkJcmNzX3Njcm9sbCA9IDA7Ci0JCX0KLQotCX0gZWxzZSBpZiAoISBkb19zaHV0ZG93bikgewotCQlpZiAocmNzX3Njcm9sbCkgewotCQkJLyoKLQkJCSAqIHNob3VsZCBoYXZlIGJlZW4gdW5yZWdpc3RlcmVkIGluIHhyZWNvcmRfd2F0Y2goMCkuLi4KLQkJCSAqLwotCQkJcmNzX3Njcm9sbCA9IFhSZWNvcmRDdXJyZW50Q2xpZW50czsKLQkJCVhSZWNvcmRVbnJlZ2lzdGVyQ2xpZW50cyhyZHB5X2N0cmwsIHJjX3Njcm9sbCwKLQkJCSAgICAmcmNzX3Njcm9sbCwgMSk7Ci0KLWlmIChkYiA+IDEpIGZwcmludGYoc3RkZXJyLCAiPTI9IHVucmVnLXNjcm9sbCAweCVseCAweCVseFxuIiwgcmNfc2Nyb2xsLCByY3Nfc2Nyb2xsKTsKLQotCQl9Ci0JCQotCQlyY3Nfc2Nyb2xsID0gKFhSZWNvcmRDbGllbnRTcGVjKSBjbGFzdDsKLQotaWYgKGRiID4gMSkgZnByaW50ZihzdGRlcnIsICI9LT0gICByZWctc2Nyb2xsIDB4JWx4IDB4JWx4XG4iLCByY19zY3JvbGwsIHJjc19zY3JvbGwpOwotCi0JCWlmICghWFJlY29yZFJlZ2lzdGVyQ2xpZW50cyhyZHB5X2N0cmwsIHJjX3Njcm9sbCwgMCwKLQkJICAgICZyY3Nfc2Nyb2xsLCAxLCBycl9zY3JvbGwsIDIpKSB7Ci0JCQlpZiAoMSB8fCBub3cgPiBsYXN0X2Vycm9yICsgNjApIHsKLQkJCQlyZmJMb2coImZhaWxlZCB0byByZWdpc3RlciBjbGllbnQgMHglbHggd2l0aCIKLQkJCQkgICAgIiBYIFJFQ09SRCBjb250ZXh0IHJjX3Njcm9sbC5cbiIsIGNsYXN0KTsKLQkJCX0KLQkJCWxhc3RfZXJyb3IgPSBub3c7Ci0JCQlyY3Nfc2Nyb2xsID0gMDsKLQkJCS8qIGNvbnRpbnVlIG9uIGZvciBub3cuLi4gKi8KLQkJfQotCX0KLQotCVhGbHVzaF93cihyZHB5X2N0cmwpOwotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAicmNfc2Nyb2xsOiAweCVseFxuIiwgcmNfc2Nyb2xsKTsKLQlpZiAodHJhcHBlZF9yZWNvcmRfeGVycm9yKSB7Ci0JCVJFQ09SRF9FUlJPUl9NU0coInJlZ2lzdGVyIik7Ci0JfQotCi0JaWYgKCEgcmNfc2Nyb2xsKSB7Ci0JCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQlYX1VOTE9DSzsKLQkJU0NSX1VOTE9DSzsKLQkJdXNlX3hyZWNvcmQgPSAwOwotCQlyZmJMb2coImZhaWxlZCB0byBjcmVhdGUgWCBSRUNPUkQgY29udGV4dCByY19zY3JvbGwuXG4iKTsKLQkJcmZiTG9nKCIgIHN3aXRjaGluZyB0byAtbm9zY3JvbGxjb3B5cmVjdCBtb2RlLlxuIik7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKCEgcmNzX3Njcm9sbCB8fCB0cmFwcGVkX3JlY29yZF94ZXJyb3IpIHsKLQkJLyogdHJ5IGFnYWluIGxhdGVyICovCi0JCXNodXRkb3duX3JlY29yZF9jb250ZXh0KHJjX3Njcm9sbCwgMCwgcmVvcGVuX2RweXMpOwotCQlyY19zY3JvbGwgPSAwOwotCQlsYXN0X2Vycm9yID0gbm93OwotCi0JCVhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOwotCQlYX1VOTE9DSzsKLQkJU0NSX1VOTE9DSzsKLQkJcmV0dXJuOwotCX0KLQotCXhyZWNvcmRfZm9jdXNfd2luZG93ID0gZm9jdXM7Ci0jaWYgMAotCS8qIHhyZWNvcmRfZm9jdXNfd2luZG93IGN1cnJlbnRseSB1bnVzZWQuICovCi0JaWYgKCEgeHJlY29yZF9mb2N1c193aW5kb3cpIHsKLQkJeHJlY29yZF9mb2N1c193aW5kb3cgPSBjbGFzdDsKLQl9Ci0jZW5kaWYKLQl4cmVjb3JkX3dtX3dpbmRvdyA9IHdtOwotCWlmICghIHhyZWNvcmRfd21fd2luZG93KSB7Ci0JCXhyZWNvcmRfd21fd2luZG93ID0gY2xhc3Q7Ci0JfQotCi0JeHJlY29yZF9wdHJfd2luZG93ID0gY2xhc3Q7Ci0KLQl4cmVjb3JkaW5nID0gMTsKLQl4cmVjb3JkX3NlcSsrOwotCWR0aW1lMCgmeHJlY29yZF9zdGFydCk7Ci0KLQlyYyA9IFhSZWNvcmRFbmFibGVDb250ZXh0QXN5bmMocmRweV9kYXRhLCByY19zY3JvbGwsIHJlY29yZF9zd2l0Y2gsCi0JICAgIChYUG9pbnRlcikgeHJlY29yZF9zZXEpOwotCi0JaWYgKCFyYyB8fCB0cmFwcGVkX3JlY29yZF94ZXJyb3IpIHsKLQkJaWYgKDEgfHwgbm93ID4gbGFzdF9lcnJvciArIDYwKSB7Ci0JCQlyZmJMb2coImZhaWxlZCB0byBlbmFibGUgUkVDT1JEIGNvbnRleHQgIgotCQkJICAgICJyY19zY3JvbGw6IDB4JWx4IHJjOiAlZFxuIiwgcmNfc2Nyb2xsLCByYyk7Ci0JCQlpZiAodHJhcHBlZF9yZWNvcmRfeGVycm9yKSB7Ci0JCQkJUkVDT1JEX0VSUk9SX01TRygiZW5hYmxlLWZhaWxlZCIpOwotCQkJfQotCQl9Ci0JCXNodXRkb3duX3JlY29yZF9jb250ZXh0KHJjX3Njcm9sbCwgMCwgcmVvcGVuX2RweXMpOwotCQlyY19zY3JvbGwgPSAwOwotCQlsYXN0X2Vycm9yID0gbm93OwotCQl4cmVjb3JkaW5nID0gMDsKLQkJLyogY29udGludWUgb24gZm9yIG5vdy4uLiAqLwotCX0KLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQotCS8qIFhYWCB0aGlzIG1heSBjYXVzZSBtb3JlIHByb2JsZW1zIHRoYW4gaXQgc29sdmVzLi4uICovCi0JaWYgKHVzZV94cmVjb3JkKSB7Ci0JCVhGbHVzaF93cihyZHB5X2RhdGEpOwotCX0KLQotCVhfVU5MT0NLOwotCVNDUl9VTkxPQ0s7Ci0jZW5kaWYKLX0KLQotCmRpZmYgLS1naXQgYS94MTF2bmMveHJlY29yZC5oIGIveDExdm5jL3hyZWNvcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxZTJkNy4uMDAwMDAwMAotLS0gYS94MTF2bmMveHJlY29yZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfWFJFQ09SRF9ICi0jZGVmaW5lIF9YMTFWTkNfWFJFQ09SRF9ICi0KLS8qIC0tIHhyZWNvcmQuaCAtLSAqLwotI2luY2x1ZGUgInNjcm9sbGV2ZW50X3QuaCIKLSNpbmNsdWRlICJ3aW5hdHRyX3QuaCIKLQotZXh0ZXJuIHNjcm9sbF9ldmVudF90IHNjcl9ldltdOwotZXh0ZXJuIGludCBzY3JfZXZfY250OwotZXh0ZXJuIGludCB4cmVjb3JkaW5nOwotZXh0ZXJuIGludCB4cmVjb3JkX3NldF9ieV9rZXlzOwotZXh0ZXJuIGludCB4cmVjb3JkX3NldF9ieV9tb3VzZTsKLWV4dGVybiBXaW5kb3cgeHJlY29yZF9mb2N1c193aW5kb3c7Ci1leHRlcm4gV2luZG93IHhyZWNvcmRfd21fd2luZG93OwotZXh0ZXJuIFdpbmRvdyB4cmVjb3JkX3B0cl93aW5kb3c7Ci1leHRlcm4gS2V5U3ltIHhyZWNvcmRfa2V5c3ltOwotZXh0ZXJuIGNoYXIgeHJlY29yZF9uYW1lX2luZm9bXTsKLQotZXh0ZXJuIHdpbmF0dHJfdCBzY3JfYXR0cl9jYWNoZVtdOwotCi1leHRlcm4gRGlzcGxheSAqcmRweV9kYXRhOwotZXh0ZXJuIERpc3BsYXkgKnJkcHlfY3RybDsKLQotZXh0ZXJuIERpc3BsYXkgKmdkcHlfY3RybDsKLWV4dGVybiBpbnQgeHNlcnZlcl9ncmFiYmVkOwotCi1leHRlcm4gdm9pZCBpbml0aWFsaXplX3hyZWNvcmQodm9pZCk7Ci1leHRlcm4gdm9pZCB6ZXJvZGlzcF94cmVjb3JkKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2h1dGRvd25feHJlY29yZCh2b2lkKTsKLWV4dGVybiBpbnQgeHJlY29yZF9za2lwX2tleXN5bShyZmJLZXlTeW0ga2V5c3ltKTsKLWV4dGVybiBpbnQgeHJlY29yZF9za2lwX2J1dHRvbihpbnQgbmV3YiwgaW50IG9sZCk7Ci1leHRlcm4gaW50IHhyZWNvcmRfc2Nyb2xsX2tleXN5bShyZmJLZXlTeW0ga2V5c3ltKTsKLWV4dGVybiB2b2lkIGNoZWNrX3hyZWNvcmRfcmVzZXQoaW50IGZvcmNlKTsKLWV4dGVybiB2b2lkIHhyZWNvcmRfd2F0Y2goaW50IHN0YXJ0LCBpbnQgc2V0YnkpOwotCi0jZW5kaWYgLyogX1gxMVZOQ19YUkVDT1JEX0ggKi8KZGlmZiAtLWdpdCBhL3gxMXZuYy94d3JhcHBlcnMuYyBiL3gxMXZuYy94d3JhcHBlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxNThjZi4uMDAwMDAwMAotLS0gYS94MTF2bmMveHdyYXBwZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIyICswLDAgQEAKLS8qCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBLYXJsIEouIFJ1bmdlIDxydW5nZUBrYXJscnVuZ2UuY29tPiAKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHgxMXZuYy4KLQoteDExdm5jIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQoteDExdm5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggeDExdm5jOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotb3Igc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotSW4gYWRkaXRpb24sIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIEthcmwgSi4gUnVuZ2UKLWdpdmVzIHBlcm1pc3Npb24gdG8gbGluayB0aGUgY29kZSBvZiBpdHMgcmVsZWFzZSBvZiB4MTF2bmMgd2l0aCB0aGUKLU9wZW5TU0wgcHJvamVjdCdzICJPcGVuU1NMIiBsaWJyYXJ5IChvciB3aXRoIG1vZGlmaWVkIHZlcnNpb25zIG9mIGl0Ci10aGF0IHVzZSB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSAiT3BlblNTTCIgbGlicmFyeSksIGFuZCBkaXN0cmlidXRlCi10aGUgbGlua2VkIGV4ZWN1dGFibGVzLiAgWW91IG11c3Qgb2JleSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWluIGFsbCByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiAiT3BlblNTTCIuICBJZiB5b3UKLW1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUKLWZpbGUsIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLXNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgotKi8KLQotLyogLS0geHdyYXBwZXJzLmMgLS0gKi8KLQotI2luY2x1ZGUgIngxMXZuYy5oIgotI2luY2x1ZGUgInhyZWNvcmQuaCIKLSNpbmNsdWRlICJrZXlib2FyZC5oIgotI2luY2x1ZGUgInhldmVudHMuaCIKLSNpbmNsdWRlICJjb25uZWN0aW9ucy5oIgotI2luY2x1ZGUgImNsZWFudXAuaCIKLSNpbmNsdWRlICJtYWNvc3guaCIKLQotaW50IHhzaG1fcHJlc2VudCA9IDA7Ci1pbnQgeHNobV9vcGNvZGUgPSAwOwotaW50IHh0ZXN0X3ByZXNlbnQgPSAwOwotaW50IHh0cmFwX3ByZXNlbnQgPSAwOwotaW50IHhyZWNvcmRfcHJlc2VudCA9IDA7Ci1pbnQgeGtiX3ByZXNlbnQgPSAwOwotaW50IHhpbmVyYW1hX3ByZXNlbnQgPSAwOwotCi1pbnQga2V5Y29kZV9zdGF0ZVsyNTZdOwotaW50IHJvb3RzaGlmdCA9IDA7Ci1pbnQgY2xpcHNoaWZ0ID0gMDsKLQotCi1pbnQgZ3Vlc3NfYml0c19wZXJfY29sb3IoaW50IGJpdHNfcGVyX3BpeGVsKTsKLQotaW50IFhGbHVzaF93cihEaXNwbGF5ICpkaXNwKTsKLQotU3RhdHVzIFhTaG1HZXRJbWFnZV93cihEaXNwbGF5ICpkaXNwLCBEcmF3YWJsZSBkLCBYSW1hZ2UgKmltYWdlLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgbG9uZyBtYXNrKTsKLVhJbWFnZSAqWFNobUNyZWF0ZUltYWdlX3dyKERpc3BsYXkqIGRpc3AsIFZpc3VhbCogdmlzLCB1bnNpZ25lZCBpbnQgZGVwdGgsCi0gICAgaW50IGZvcm1hdCwgY2hhciogZGF0YSwgWFNobVNlZ21lbnRJbmZvKiBzaG1pbmZvLCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0gICAgdW5zaWduZWQgaW50IGhlaWdodCk7Ci1TdGF0dXMgWFNobUF0dGFjaF93cihEaXNwbGF5ICpkaXNwLCBYU2htU2VnbWVudEluZm8gKnNobWluZm8pOwotU3RhdHVzIFhTaG1EZXRhY2hfd3IoRGlzcGxheSAqZGlzcCwgWFNobVNlZ21lbnRJbmZvICpzaG1pbmZvKTsKLUJvb2wgWFNobVF1ZXJ5RXh0ZW5zaW9uX3dyKERpc3BsYXkgKmRpc3ApOwotaW50IFhTaG1HZXRFdmVudEJhc2Vfd3IoRGlzcGxheSAqZGlzcCk7Ci0KLVhJbWFnZSAqeHJlYWRzY3JlZW4oRGlzcGxheSAqZGlzcCwgRHJhd2FibGUgZCwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgQm9vbCBzaG93X2N1cnNvcik7Ci1YSW1hZ2UgKlhHZXRTdWJJbWFnZV93cihEaXNwbGF5ICpkaXNwLCBEcmF3YWJsZSBkLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIHBsYW5lX21hc2ssCi0gICAgaW50IGZvcm1hdCwgWEltYWdlICpkZXN0X2ltYWdlLCBpbnQgZGVzdF94LCBpbnQgZGVzdF95KTsKLVhJbWFnZSAqWEdldEltYWdlX3dyKERpc3BsYXkgKmRpc3AsIERyYXdhYmxlIGQsIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgcGxhbmVfbWFzaywKLSAgICBpbnQgZm9ybWF0KTsKLVhJbWFnZSAqWENyZWF0ZUltYWdlX3dyKERpc3BsYXkgKmRpc3AsIFZpc3VhbCAqdmlzdWFsLCB1bnNpZ25lZCBpbnQgZGVwdGgsCi0gICAgaW50IGZvcm1hdCwgaW50IG9mZnNldCwgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IHdpZHRoLAotICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIGludCBiaXRtYXBfcGFkLCBpbnQgYnl0ZXNfcGVyX2xpbmUpOwotdm9pZCBjb3B5X2ltYWdlKFhJbWFnZSAqZGVzdCwgaW50IHgsIGludCB5LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpOwotdm9pZCBpbml0X3RyYWNrX2tleWNvZGVfc3RhdGUodm9pZCk7Ci0KLXZvaWQgWFRSQVBfRmFrZUtleUV2ZW50X3dyKERpc3BsYXkqIGRweSwgS2V5Q29kZSBrZXksIEJvb2wgZG93biwKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLXZvaWQgWFRlc3RGYWtlS2V5RXZlbnRfd3IoRGlzcGxheSogZHB5LCBLZXlDb2RlIGtleSwgQm9vbCBkb3duLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwotdm9pZCBYVFJBUF9GYWtlQnV0dG9uRXZlbnRfd3IoRGlzcGxheSogZHB5LCB1bnNpZ25lZCBpbnQgYnV0dG9uLCBCb29sIGlzX3ByZXNzLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwotdm9pZCBYVGVzdEZha2VCdXR0b25FdmVudF93cihEaXNwbGF5KiBkcHksIHVuc2lnbmVkIGludCBidXR0b24sIEJvb2wgaXNfcHJlc3MsCi0gICAgdW5zaWduZWQgbG9uZyBkZWxheSk7Ci12b2lkIFhUUkFQX0Zha2VNb3Rpb25FdmVudF93cihEaXNwbGF5KiBkcHksIGludCBzY3JlZW4sIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLXZvaWQgWFRlc3RGYWtlTW90aW9uRXZlbnRfd3IoRGlzcGxheSogZHB5LCBpbnQgc2NyZWVuLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgbG9uZyBkZWxheSk7Ci0KLUJvb2wgWFRlc3RDb21wYXJlQ3VycmVudEN1cnNvcldpdGhXaW5kb3dfd3IoRGlzcGxheSogZHB5LCBXaW5kb3cgdyk7Ci1Cb29sIFhUZXN0Q29tcGFyZUN1cnNvcldpdGhXaW5kb3dfd3IoRGlzcGxheSogZHB5LCBXaW5kb3cgdywgQ3Vyc29yIGN1cnNvcik7Ci1Cb29sIFhUZXN0UXVlcnlFeHRlbnNpb25fd3IoRGlzcGxheSAqZHB5LCBpbnQgKmV2LCBpbnQgKmVyLCBpbnQgKm1haiwKLSAgICBpbnQgKm1pbik7Ci12b2lkIFhUZXN0RGlzY2FyZF93cihEaXNwbGF5ICpkcHkpOwotQm9vbCBYRVRyYXBRdWVyeUV4dGVuc2lvbl93cihEaXNwbGF5ICpkcHksIGludCAqZXYsIGludCAqZXIsIGludCAqb3ApOwotaW50IFhUZXN0R3JhYkNvbnRyb2xfd3IoRGlzcGxheSAqZHB5LCBCb29sIGltcGVydmlvdXMpOwotaW50IFhUUkFQX0dyYWJDb250cm9sX3dyKERpc3BsYXkgKmRweSwgQm9vbCBpbXBlcnZpb3VzKTsKLXZvaWQgZGlzYWJsZV9ncmFic2VydmVyKERpc3BsYXkgKmluX2RweSwgaW50IGNoYW5nZSk7Ci0KLUJvb2wgWFJlY29yZFF1ZXJ5VmVyc2lvbl93cihEaXNwbGF5ICpkcHksIGludCAqbWFqLCBpbnQgKm1pbik7Ci0KLWludCB4YXV0aF9yYXcoaW50IG9uKTsKLURpc3BsYXkgKlhPcGVuRGlzcGxheV93cihjaGFyICpkaXNwbGF5X25hbWUpOwotaW50IFhDbG9zZURpc3BsYXlfd3IoRGlzcGxheSAqZGlzcGxheSk7Ci0KLUJvb2wgWFF1ZXJ5UG9pbnRlcl93cihEaXNwbGF5ICpkaXNwbGF5LCBXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwKLSAgICBXaW5kb3cgKmNoaWxkX3JldHVybiwgaW50ICpyb290X3hfcmV0dXJuLCBpbnQgKnJvb3RfeV9yZXR1cm4sCi0gICAgaW50ICp3aW5feF9yZXR1cm4sIGludCAqd2luX3lfcmV0dXJuLCB1bnNpZ25lZCBpbnQgKm1hc2tfcmV0dXJuKTsKLQotU3RhdHVzIFhRdWVyeVRyZWVfd3IoRGlzcGxheSAqZGlzcGxheSwgV2luZG93IHcsIFdpbmRvdyAqcm9vdF9yZXR1cm4sCi0gICAgV2luZG93ICpwYXJlbnRfcmV0dXJuLCBXaW5kb3cgKipjaGlsZHJlbl9yZXR1cm4sCi0gICAgdW5zaWduZWQgaW50ICpuY2hpbGRyZW5fcmV0dXJuKTsKLQotaW50IFhGcmVlX3dyKHZvaWQgKmRhdGEpOwotaW50IFhTZWxlY3RJbnB1dF93cihEaXNwbGF5ICpkaXNwbGF5LCBXaW5kb3cgdywgbG9uZyBldmVudF9tYXNrKTsKLQotdm9pZCBjb3B5X3Jhd19mYihYSW1hZ2UgKmRlc3QsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKTsKLXN0YXRpYyB2b2lkIHVwdXBfZG93bmRvd25fd2FybmluZyhLZXlDb2RlIGtleSwgQm9vbCBkb3duKTsKLQotLyogCi0gKiB1c2VkIGluIHJmYkdldFNjcmVlbiBhbmQgcmZiTmV3RnJhbWVidWZmZXI6IGFuZCBlc3RpbWF0ZSB0byB0aGUgbnVtYmVyCi0gKiBvZiBiaXRzIHBlciBjb2xvciwgb2YgY291cnNlIGZvciBzb21lIHZpc3VhbHMsIGUuZy4gNTY1LCB0aGUgbnVtYmVyCi0gKiBpcyBub3QgdGhlIHNhbWUgZm9yIGVhY2ggY29sb3IuICBUaGlzIGlzIGp1c3QgYSBzYW5lIGRlZmF1bHQuCi0gKi8KLWludCBndWVzc19iaXRzX3Blcl9jb2xvcihpbnQgYml0c19wZXJfcGl4ZWwpIHsKLQlpbnQgYml0c19wZXJfY29sb3I7Ci0JCi0JLyogZmlyc3QgZ3Vlc3MsIHNwcmVhZCB0aGVtICJldmVubHkiIG92ZXIgUiwgRywgYW5kIEIgKi8KLQliaXRzX3Blcl9jb2xvciA9IGJpdHNfcGVyX3BpeGVsLzM7Ci0JaWYgKGJpdHNfcGVyX2NvbG9yIDwgMSkgewotCQliaXRzX3Blcl9jb2xvciA9IDE7CS8qIDFicHAsIDJicHAuLi4gKi8KLQl9Ci0KLQkvKiBjaG9vc2Ugc2FmZSB2YWx1ZXMgZm9yIHVzdWFsIGNhc2VzOiAqLwotCWlmIChiaXRzX3Blcl9waXhlbCA9PSA4KSB7Ci0JCWJpdHNfcGVyX2NvbG9yID0gMjsKLQl9IGVsc2UgaWYgKGJpdHNfcGVyX3BpeGVsID09IDE1IHx8IGJpdHNfcGVyX3BpeGVsID09IDE2KSB7Ci0JCWJpdHNfcGVyX2NvbG9yID0gNTsKLQl9IGVsc2UgaWYgKGJpdHNfcGVyX3BpeGVsID09IDI0IHx8IGJpdHNfcGVyX3BpeGVsID09IDMyKSB7Ci0JCWJpdHNfcGVyX2NvbG9yID0gODsKLQl9Ci0JcmV0dXJuIGJpdHNfcGVyX2NvbG9yOwotfQotCi1pbnQgWEZsdXNoX3dyKERpc3BsYXkgKmRpc3ApIHsKLSNpZiBOT19YMTEKLQlpZiAoIWRpc3ApIHt9Ci0JcmV0dXJuIDE7Ci0jZWxzZQotCWlmIChkaXNwKSB7Ci0JCXJldHVybiBYRmx1c2goZGlzcCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi0vKgotICogS2x1ZGdlIHRvIGludGVycG9zZSBpbWFnZSBnZXRzIGFuZCBsaW1pdCB0byBhIHN1YnNldCByZWN0YW5nbGUgb2YKLSAqIHRoZSByb290d2luLiAgVGhpcyBpcyB0aGUgLXNpZCBvcHRpb24gdHJ5aW5nIHRvIHdvcmsgYXJvdW5kIGludmlzaWJsZQotICogc2F2ZVVuZGVycyBtZW51LCBldGMsIHdpbmRvd3MuICBBbHNvIC1jbGlwIG9wdGlvbi4KLSAqLwotCi0jZGVmaW5lIEFESlVTVF9ST09UU0hJRlQgXAotCWlmIChyb290c2hpZnQgJiYgc3Vid2luKSB7IFwKLQkJZCA9IHJvb3R3aW47IFwKLQkJeCArPSBvZmZfeDsgXAotCQl5ICs9IG9mZl95OyBcCi0JfSBcCi0JaWYgKGNsaXBzaGlmdCkgeyBcCi0JCXggKz0gY29mZl94OyBcCi0JCXkgKz0gY29mZl95OyBcCi0JfQotCi0vKgotICogV3JhcHBlcnMgZm9yIEltYWdlIHJlbGF0ZWQgWCBjYWxscwotICovCi1TdGF0dXMgWFNobUdldEltYWdlX3dyKERpc3BsYXkgKmRpc3AsIERyYXdhYmxlIGQsIFhJbWFnZSAqaW1hZ2UsIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBsb25nIG1hc2spIHsKLQotCUFESlVTVF9ST09UU0hJRlQKLQotCS8qIE5vdGU6IHRoZSBTb2xhcmlzIG92ZXJsYXkgc3R1ZmYgaXMgYWxsIG5vbi1zaG0gKHVzaW5nX3NobSA9IDApICovCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YU0hNCi0JcmV0dXJuIFhTaG1HZXRJbWFnZShkaXNwLCBkLCBpbWFnZSwgeCwgeSwgbWFzayk7IAotI2Vsc2UKLQlpZiAoIWRpc3AgfHwgIWQgfHwgIWltYWdlIHx8ICF4IHx8ICF5IHx8ICFtYXNrKSB7fQotCXJldHVybiAoU3RhdHVzKSAwOwotI2VuZGlmCi19Ci0KLVhJbWFnZSAqWFNobUNyZWF0ZUltYWdlX3dyKERpc3BsYXkqIGRpc3AsIFZpc3VhbCogdmlzLCB1bnNpZ25lZCBpbnQgZGVwdGgsCi0gICAgaW50IGZvcm1hdCwgY2hhciogZGF0YSwgWFNobVNlZ21lbnRJbmZvKiBzaG1pbmZvLCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0gICAgdW5zaWduZWQgaW50IGhlaWdodCkgewotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFNITQotCXJldHVybiBYU2htQ3JlYXRlSW1hZ2UoZGlzcCwgdmlzLCBkZXB0aCwgZm9ybWF0LCBkYXRhLCBzaG1pbmZvLAotCSAgICB3aWR0aCwgaGVpZ2h0KTsgCi0jZWxzZQotCWlmICghZGlzcCB8fCAhdmlzIHx8ICFkZXB0aCB8fCAhZm9ybWF0IHx8ICFkYXRhIHx8ICFzaG1pbmZvIHx8ICF3aWR0aCB8fCAhaGVpZ2h0KSB7fQotCXJldHVybiAoWEltYWdlICopIDA7Ci0jZW5kaWYKLX0KLQotU3RhdHVzIFhTaG1BdHRhY2hfd3IoRGlzcGxheSAqZGlzcCwgWFNobVNlZ21lbnRJbmZvICpzaG1pbmZvKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFNITQotCXJldHVybiBYU2htQXR0YWNoKGRpc3AsIHNobWluZm8pOwotI2Vsc2UKLQlpZiAoIWRpc3AgfHwgIXNobWluZm8pIHt9Ci0JcmV0dXJuIChTdGF0dXMpIDA7Ci0jZW5kaWYKLX0KLQotU3RhdHVzIFhTaG1EZXRhY2hfd3IoRGlzcGxheSAqZGlzcCwgWFNobVNlZ21lbnRJbmZvICpzaG1pbmZvKSB7Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFNITQotCWlmIChnZXRlbnYoIlgxMVZOQ19TSE1fREVCVUciKSkgZnByaW50ZihzdGRlcnIsICJYU2htRGV0YWNoX3dyOiAlcCBkaXNwOiAlcFxuIiwgKHZvaWQgKilzaG1pbmZvLCAodm9pZCAqKWRpc3ApOwotCXJldHVybiBYU2htRGV0YWNoKGRpc3AsIHNobWluZm8pOwotI2Vsc2UKLQlpZiAoIWRpc3AgfHwgIXNobWluZm8pIHt9Ci0JcmV0dXJuIChTdGF0dXMpIDA7Ci0jZW5kaWYKLX0KLQotQm9vbCBYU2htUXVlcnlFeHRlbnNpb25fd3IoRGlzcGxheSAqZGlzcCkgewotI2lmIExJQlZOQ1NFUlZFUl9IQVZFX1hTSE0KLQlyZXR1cm4gWFNobVF1ZXJ5RXh0ZW5zaW9uKGRpc3ApOwotI2Vsc2UKLQlpZiAoIWRpc3ApIHt9Ci0JcmV0dXJuIEZhbHNlOwotI2VuZGlmCi19Ci0KLWludCBYU2htR2V0RXZlbnRCYXNlX3dyKERpc3BsYXkgKmRpc3ApIHsKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YU0hNCi0JcmV0dXJuIFhTaG1HZXRFdmVudEJhc2UoZGlzcCk7Ci0jZWxzZQotCWlmICghZGlzcCkge30KLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKiB3cmFwcGVyIGZvciBvdmVybGF5IHNjcmVlbiByZWFkaW5nOiAqLwotCi1YSW1hZ2UgKnhyZWFkc2NyZWVuKERpc3BsYXkgKmRpc3AsIERyYXdhYmxlIGQsIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEJvb2wgc2hvd19jdXJzb3IpIHsKLSNpZiBOT19YMTEKLQlpZiAoIWRpc3AgfHwgIWQgfHwgIXggfHwgIXkgfHwgIXdpZHRoIHx8ICFoZWlnaHQgfHwgIXNob3dfY3Vyc29yKSB7fQotCXJldHVybiBOVUxMOwotI2Vsc2UKLQotI2lmZGVmIFNPTEFSSVNfT1ZFUkxBWQotCXJldHVybiBYUmVhZFNjcmVlbihkaXNwLCBkLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAotCSAgICBzaG93X2N1cnNvcik7Ci0jZWxzZQotIyAgaWZkZWYgSVJJWF9PVkVSTEFZCi0Jewl1bnNpZ25lZCBsb25nIGhpbnRzID0gMCwgaGludHNfcmV0OwotCQlpZiAoc2hvd19jdXJzb3IpIGhpbnRzIHw9IFhSRF9SRUFEX1BPSU5URVI7Ci0JCXJldHVybiBYUmVhZERpc3BsYXkoZGlzcCwgZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwKLQkJICAgIGhpbnRzLCAmaGludHNfcmV0KTsKLQl9Ci0jICBlbHNlCi0JLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQlpZiAoZGlzcCB8fCBkIHx8IHggfHwgeSB8fCB3aWR0aCB8fCBoZWlnaHQgfHwgc2hvd19jdXJzb3IpIHt9Ci0KLQlyZXR1cm4gTlVMTDsKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1YSW1hZ2UgKlhHZXRTdWJJbWFnZV93cihEaXNwbGF5ICpkaXNwLCBEcmF3YWJsZSBkLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIHBsYW5lX21hc2ssCi0gICAgaW50IGZvcm1hdCwgWEltYWdlICpkZXN0X2ltYWdlLCBpbnQgZGVzdF94LCBpbnQgZGVzdF95KSB7Ci0jaWYgTk9fWDExCi0Jbm94MTFfZXhpdCgxKTsKLQlpZiAoIWRpc3AgfHwgIWQgfHwgIXggfHwgIXkgfHwgIXdpZHRoIHx8ICFoZWlnaHQgfHwgIXBsYW5lX21hc2sgfHwgIWZvcm1hdCB8fCAhZGVzdF9pbWFnZSB8fCAhZGVzdF94IHx8ICFkZXN0X3kpIHt9Ci0JcmV0dXJuIE5VTEw7Ci0jZWxzZQotCUFESlVTVF9ST09UU0hJRlQKLQotCWlmIChvdmVybGF5ICYmIGRlc3RfeCA9PSAwICYmIGRlc3RfeSA9PSAwKSB7Ci0JCXNpemVfdCBzaXplID0gZGVzdF9pbWFnZS0+aGVpZ2h0ICogZGVzdF9pbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0JCVhJbWFnZSAqeGk7Ci0KLQkJeGkgPSB4cmVhZHNjcmVlbihkaXNwLCBkLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAotCQkgICAgKEJvb2wpIG92ZXJsYXlfY3Vyc29yKTsKLQotCQlpZiAoISB4aSkgcmV0dXJuIE5VTEw7Ci0KLQkJLyoKLQkJICogVGhlcmUgaXMgZXh0cmEgb3ZlcmhlYWQgZnJvbSBtZW1jcHkgYW5kIGZyZWUuLi4KLQkJICogdGhpcyBpcyBub3QgbGlrZSB0aGUgcmVhbCBYR2V0U3ViSW1hZ2UoKS4gIFdlIGhvcGUKLQkJICogdGhpcyBzaWduaWZpY2FudCBvdmVyaGVhZCBpcyBzdGlsbCBzbWFsbCBjb21wYXJlZCB0bwotCQkgKiB0aGUgdGltZSB0byByZXRyaWV2ZSB0aGUgZmIgZGF0YS4KLQkJICovCi0JCW1lbWNweShkZXN0X2ltYWdlLT5kYXRhLCB4aS0+ZGF0YSwgc2l6ZSk7Ci0KLQkJWERlc3Ryb3lJbWFnZSh4aSk7Ci0JCXJldHVybiAoZGVzdF9pbWFnZSk7Ci0JfQotCXJldHVybiBYR2V0U3ViSW1hZ2UoZGlzcCwgZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGxhbmVfbWFzaywKLQkgICAgZm9ybWF0LCBkZXN0X2ltYWdlLCBkZXN0X3gsIGRlc3RfeSk7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLVhJbWFnZSAqWEdldEltYWdlX3dyKERpc3BsYXkgKmRpc3AsIERyYXdhYmxlIGQsIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgcGxhbmVfbWFzaywKLSAgICBpbnQgZm9ybWF0KSB7Ci0jaWYgTk9fWDExCi0JaWYgKCFkaXNwIHx8ICFkIHx8ICF4IHx8ICF5IHx8ICF3aWR0aCB8fCAhaGVpZ2h0IHx8ICFwbGFuZV9tYXNrIHx8ICFmb3JtYXQpIHt9Ci0Jbm94MTFfZXhpdCgxKTsKLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0KLQlBREpVU1RfUk9PVFNISUZUCi0KLQlpZiAob3ZlcmxheSkgewotCQlyZXR1cm4geHJlYWRzY3JlZW4oZGlzcCwgZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwKLQkJICAgIChCb29sKSBvdmVybGF5X2N1cnNvcik7Ci0JfQotCXJldHVybiBYR2V0SW1hZ2UoZGlzcCwgZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGxhbmVfbWFzaywgZm9ybWF0KTsKLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotWEltYWdlICpYQ3JlYXRlSW1hZ2Vfd3IoRGlzcGxheSAqZGlzcCwgVmlzdWFsICp2aXN1YWwsIHVuc2lnbmVkIGludCBkZXB0aCwKLSAgICBpbnQgZm9ybWF0LCBpbnQgb2Zmc2V0LCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0gICAgdW5zaWduZWQgaW50IGhlaWdodCwgaW50IGJpdG1hcF9wYWQsIGludCBieXRlc19wZXJfbGluZSkgewotCS8qCi0JICogVGhpcyBpcyBhIGtsdWRnZSB0byBnZXQgYSBjcmVhdGVkIFhJbWFnZSB0byBleGFjdGx5IG1hdGNoIHdoYXQKLQkgKiBYUmVhZFNjcmVlbiByZXR1cm5zOiB3ZSBub3RpY2VkIHRoZSByZ2IgbWFza3MgYXJlIGRpZmZlcmVudAotCSAqIGZyb20gWENyZWF0ZUltYWdlIHdpdGggdGhlIGhpZ2ggY29sb3IgdmlzdWFsIChyZWQgbWFzayA8LT4KLQkgKiBibHVlIG1hc2spLiAgTm90ZSB3ZSByZWFkIGZyb20gdGhlIHJvb3Qgd2luZG93KCEpIHRoZW4gZnJlZQotCSAqIHRoZSBkYXRhLgotCSAqLwotCi0JaWYgKHJhd19mYikgewkvKiByYXdfZmIgaGFjayAqLwotCQlYSW1hZ2UgKnhpOwotCQl4aSA9IChYSW1hZ2UgKikgbWFsbG9jKHNpemVvZihYSW1hZ2UpKTsKLQkJbWVtc2V0KHhpLCAwLCBzaXplb2YoWEltYWdlKSk7Ci0JCXhpLT5kZXB0aCA9IGRlcHRoOwotCQlpZiAoZGVwdGggPj0gMjQpIHsKLQkJCXhpLT5iaXRzX3Blcl9waXhlbCA9IDMyOwotCQl9IGVsc2UgaWYgKGRlcHRoID4gMTYpIHsKLQkJCXhpLT5iaXRzX3Blcl9waXhlbCA9IDI0OwotCQl9IGVsc2UgaWYgKGRlcHRoID4gOCkgewotCQkJeGktPmJpdHNfcGVyX3BpeGVsID0gMTY7Ci0JCX0gZWxzZSB7Ci0JCQl4aS0+Yml0c19wZXJfcGl4ZWwgPSA4OwotCQl9Ci0JCXhpLT5mb3JtYXQgPSBmb3JtYXQ7Ci0JCXhpLT54b2Zmc2V0ID0gb2Zmc2V0OwotCQl4aS0+ZGF0YSA9IGRhdGE7Ci0JCXhpLT53aWR0aCA9IHdpZHRoOwotCQl4aS0+aGVpZ2h0ID0gaGVpZ2h0OwotCQl4aS0+Yml0bWFwX3BhZCA9IGJpdG1hcF9wYWQ7Ci0JCXhpLT5ieXRlc19wZXJfbGluZSA9IGJ5dGVzX3Blcl9saW5lID8gYnl0ZXNfcGVyX2xpbmUgOiAKLQkJICAgIHhpLT53aWR0aCAqIHhpLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0JCXhpLT5iaXRtYXBfdW5pdCA9IC0xOwkvKiBoaW50IHRvIG5vdCBjYWxsIFhEZXN0cm95SW1hZ2UgKi8KLQkJcmV0dXJuIHhpOwotCX0KLQotI2lmIE5PX1gxMQotCW5veDExX2V4aXQoMSk7Ci0JaWYgKCFkaXNwIHx8ICF2aXN1YWwgfHwgIWRlcHRoIHx8ICFmb3JtYXQgfHwgIW9mZnNldCB8fCAhZGF0YSB8fCAhd2lkdGgKLQkgICAgfHwgIWhlaWdodCB8fCAhd2lkdGggfHwgIWJpdG1hcF9wYWQgfHwgIWJ5dGVzX3Blcl9saW5lKSB7fQotCXJldHVybiBOVUxMOwotI2Vsc2UKLQlpZiAob3ZlcmxheSkgewotCQlYSW1hZ2UgKnhpOwotCQl4aSA9IHhyZWFkc2NyZWVuKGRpc3AsIHdpbmRvdywgMCwgMCwgd2lkdGgsIGhlaWdodCwgRmFsc2UpOwotCQlpZiAoeGkgPT0gTlVMTCkgewotCQkJcmV0dXJuIHhpOwotCQl9Ci0JCWlmICh4aS0+ZGF0YSAhPSBOVUxMKSB7Ci0JCQlmcmVlKHhpLT5kYXRhKTsKLQkJfQotCQl4aS0+ZGF0YSA9IGRhdGE7Ci0JCXJldHVybiB4aTsKLQl9Ci0KLQlyZXR1cm4gWENyZWF0ZUltYWdlKGRpc3AsIHZpc3VhbCwgZGVwdGgsIGZvcm1hdCwgb2Zmc2V0LCBkYXRhLAotCSAgICB3aWR0aCwgaGVpZ2h0LCBiaXRtYXBfcGFkLCBieXRlc19wZXJfbGluZSk7Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfcmF3X2ZiX2xvd19icHAoWEltYWdlICpkZXN0LCBpbnQgeCwgaW50IHksIHVuc2lnbmVkIGludCB3LAotICAgIHVuc2lnbmVkIGludCBoKSB7Ci0JY2hhciAqc3JjLCAqZHN0OwotCXVuc2lnbmVkIGludCBsaW5lOwotCXN0YXRpYyBjaGFyICpidWYgPSBOVUxMOwotCXN0YXRpYyBpbnQgYnVmbGVuID0gLTE7Ci0JaW50IGJwbCA9IHdkcHlfeCAqIHJhd19mYl9uYXRpdmVfYnBwIC8gODsKLQlpbnQgbiwgaXgsIGxlbiwgZGVsLCBzeiA9IHdkcHlfeCAqIHJhd19mYl9leHBhbmRfYnl0ZXM7Ci0KLQl1bnNpZ25lZCBpbnQgcm1fbiA9IHJhd19mYl9uYXRpdmVfcmVkX21hc2s7Ci0JdW5zaWduZWQgaW50IGdtX24gPSByYXdfZmJfbmF0aXZlX2dyZWVuX21hc2s7Ci0JdW5zaWduZWQgaW50IGJtX24gPSByYXdfZmJfbmF0aXZlX2JsdWVfbWFzazsKLQl1bnNpZ25lZCBpbnQgcm1fZiA9IG1haW5fcmVkX21hc2s7Ci0JdW5zaWduZWQgaW50IGdtX2YgPSBtYWluX2dyZWVuX21hc2s7Ci0JdW5zaWduZWQgaW50IGJtX2YgPSBtYWluX2JsdWVfbWFzazsKLQotCXVuc2lnbmVkIGludCByc19uID0gcmF3X2ZiX25hdGl2ZV9yZWRfc2hpZnQ7Ci0JdW5zaWduZWQgaW50IGdzX24gPSByYXdfZmJfbmF0aXZlX2dyZWVuX3NoaWZ0OwotCXVuc2lnbmVkIGludCBic19uID0gcmF3X2ZiX25hdGl2ZV9ibHVlX3NoaWZ0OwotCXVuc2lnbmVkIGludCByc19mID0gbWFpbl9yZWRfc2hpZnQ7Ci0JdW5zaWduZWQgaW50IGdzX2YgPSBtYWluX2dyZWVuX3NoaWZ0OwotCXVuc2lnbmVkIGludCBic19mID0gbWFpbl9ibHVlX3NoaWZ0OwotCi0JdW5zaWduZWQgaW50IHJ4X24gPSByYXdfZmJfbmF0aXZlX3JlZF9tYXg7Ci0JdW5zaWduZWQgaW50IGd4X24gPSByYXdfZmJfbmF0aXZlX2dyZWVuX21heDsKLQl1bnNpZ25lZCBpbnQgYnhfbiA9IHJhd19mYl9uYXRpdmVfYmx1ZV9tYXg7Ci0JdW5zaWduZWQgaW50IHJ4X2YgPSBtYWluX3JlZF9tYXg7Ci0JdW5zaWduZWQgaW50IGd4X2YgPSBtYWluX2dyZWVuX21heDsKLQl1bnNpZ25lZCBpbnQgYnhfZiA9IG1haW5fYmx1ZV9tYXg7Ci0KLQlzdGF0aWMgdW5zaWduZWQgaW50IG1za1s4XTsKLQlzdGF0aWMgaW50IGxhc3RfYnBwID0gLTE7Ci0Jc3RhdGljIGludCBjZ2EgPSAtMTsKLQotCWlmIChybV9mIHwgZ21fZiB8IGJtX2YpIHt9Ci0KLQlpZiAoY2dhIDwgMCkgewotCQlpZiAoZ2V0ZW52KCJSQVdGQl9DR0EiKSkgewotCQkJY2dhID0gMTsKLQkJfSBlbHNlIHsKLQkJCWNnYSA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAoc3ogPiBidWZsZW4gfHwgYnVmID09IE5VTEwpIHsKLQkJaWYgKGJ1ZikgewotCQkJZnJlZShidWYpOwotCQl9Ci0JCWJ1ZmxlbiA9IHN6ICsgMTAwMDsKLQkJYnVmID0gKGNoYXIgKikgbWFsbG9jKGJ1Zmxlbik7Ci0JfQotCi0JaWYgKGNsaXBzaGlmdCAmJiAhIHVzZV9zbmFwZmIpIHsKLQkJeCArPSBjb2ZmX3g7Ci0JCXkgKz0gY29mZl95OwotCX0KLQotCWlmIChsYXN0X2JwcCAhPSByYXdfZmJfbmF0aXZlX2JwcCkgewotCQlpbnQgYnI7Ci0JCWZvciAoYnIgPSAwOyBiciA8IDg7IGJyKyspIHsKLQkJCXVuc2lnbmVkIGludCBwYml0LCBrLCBtID0gMDsKLQkJCQotCQkJZm9yIChrPTA7IGsgPCAodW5zaWduZWQgaW50KSByYXdfZmJfbmF0aXZlX2JwcDsgaysrKSB7Ci0JCQkJcGJpdCA9IDEgPDwgKGJyK2spOwotCQkJCW0gfD0gcGJpdDsKLQkJCX0KLQkJCW1za1ticl0gPSBtOwotCQl9Ci0JCWxhc3RfYnBwID0gcmF3X2ZiX25hdGl2ZV9icHA7Ci0JfQotCi0JZHN0ID0gZGVzdC0+ZGF0YTsKLWlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIng9JWQgeT0lZCB3PSVkIGg9JWQgYnBsPSVkIGRfYnBsPSVkLSVkeCVkeCVkLyVkICVwXG4iLAotICAgIHgsIHksIHcsIGgsIGJwbCwgZGVzdC0+Ynl0ZXNfcGVyX2xpbmUsIGRlc3QtPndpZHRoLCBkZXN0LT5oZWlnaHQsIGRlc3QtPmJpdHNfcGVyX3BpeGVsLCBkZXN0LT5kZXB0aCwgZHN0KTsKLQotCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKLQotCQlpZiAoISByYXdfZmJfc2VlaykgewotCQkJLyogbW1hcCAqLwotCQkJc3JjID0gcmF3X2ZiX2FkZHIgKyByYXdfZmJfb2Zmc2V0ICsgYnBsKih5K2xpbmUpOwotCi0JCQltZW1jcHkoYnVmLCBzcmMsIGJwbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBsc2VlayAqLwotCQkJb2ZmX3Qgb2ZmOwotCQkJb2ZmID0gKG9mZl90KSAocmF3X2ZiX29mZnNldCArIGJwbCooeStsaW5lKSk7Ci0KLQkJCWxzZWVrKHJhd19mYl9mZCwgb2ZmLCBTRUVLX1NFVCk7Ci0KLQkJCWxlbiA9IGJwbDsKLQkJCWRlbCA9IDA7Ci0JCQl3aGlsZSAobGVuID4gMCkgewotCQkJCW4gPSByZWFkKHJhd19mYl9mZCwgYnVmICsgZGVsLCBsZW4pOwotCi0JCQkJaWYgKG4gPiAwKSB7Ci0JCQkJCWRlbCArPSBuOwotCQkJCQlsZW4gLT0gbjsKLQkJCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChpeCA9IDA7IGl4IDwgKGludCkgdzsgaXgrKykgewotCQkJaW50IGJ4ID0gKHggKyBpeCkgKiByYXdfZmJfbmF0aXZlX2JwcDsKLQkJCWludCBpYiA9IGJ4IC8gODsKLQkJCWludCBiciA9IGJ4IC0gaWIgKiA4OwotCQkJdW5zaWduZWQgY2hhciB2YWw7Ci0KLQkJCXZhbCA9ICooKHVuc2lnbmVkIGNoYXIqKSAoYnVmICsgaWIpKTsKLQotCQkJdmFsID0gbXNrW2JyXSAmIHZhbDsKLQkJCXZhbCA9IHZhbCA+PiBicjsKLQotCQkJaWYgKGNnYSkgewotCQkJCS8qIHRoaXMgaXMgZXhwdCBmb3IgQ0dBICovCi0JCQkJZG91YmxlIHIsIGcsIGI7Ci0JCQkJaW50IGlyLCBpZywgaWI7Ci0JCQkJciA9ICgyLi8zKSoodmFsICYgNCkgKyAoMS4vMykqKHZhbCAmIDgpOwotCQkJCWcgPSAoMi4vMykqKHZhbCAmIDIpICsgKDEuLzMpKih2YWwgJiA4KTsKLQkJCQliID0gKDIuLzMpKih2YWwgJiAxKSArICgxLi8zKSoodmFsICYgOCk7Ci0JCQkJaWYgKHZhbCA9PSA2KSB7Ci0JCQkJCWcgPSBnLzIuOwotCQkJCX0KLQkJCQlpciA9IHJ4X2YgKiByOwotCQkJCWlnID0gZ3hfZiAqIGc7Ci0JCQkJaWIgPSBieF9mICogYjsKLQkJCQl2YWwgPSAoaWIgPDwgYnNfZikgfCAoaWcgPDwgZ3NfZikgfCAoaXIgPDwgcnNfZik7Ci0JCQl9IGVsc2UgewotCQkJCXVuc2lnbmVkIGNoYXIgcnZhbCwgZ3ZhbCwgYnZhbDsKLQkJCQkKLQkJCQlydmFsID0gKHZhbCAmIHJtX24pID4+IHJzX247Ci0JCQkJZ3ZhbCA9ICh2YWwgJiBnbV9uKSA+PiBnc19uOwotCQkJCWJ2YWwgPSAodmFsICYgYm1fbikgPj4gYnNfbjsKLQotCQkJCXJ2YWwgPSAocnhfZiAqIHJ2YWwpIC8gcnhfbjsKLQkJCQlndmFsID0gKGd4X2YgKiBndmFsKSAvIGd4X247Ci0JCQkJYnZhbCA9IChieF9mICogYnZhbCkgLyBieF9uOwotCi0JCQkJcnZhbCA9IHJ2YWwgPDwgcnNfZjsKLQkJCQlndmFsID0gZ3ZhbCA8PCBnc19mOwotCQkJCWJ2YWwgPSBidmFsIDw8IGJzX2Y7Ci0KLQkJCQl2YWwgPSBydmFsIHwgZ3ZhbCB8IGJ2YWw7Ci0JCQl9Ci0KLQkJCSooZHN0K2l4KSA9IChjaGFyKSB2YWw7Ci0JCX0KLQotCQlkc3QgKz0gZGVzdC0+Ynl0ZXNfcGVyX2xpbmU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5X3Jhd19mYl8yNF90b18zMihYSW1hZ2UgKmRlc3QsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgaW50IHcsCi0gICAgdW5zaWduZWQgaW50IGgpIHsKLQkvKgotCSAqIGtsdWRnZSB0byByZWFkIDEgYnl0ZSBhdCBhIHRpbWUgYW5kIGR5bmFtaWNhbGx5IHRyYW5zZm9ybQotCSAqIDI0YnBwIC0+IDMyYnBwIGJ5IGluc2VydGluZyBhIGV4dHJhIDAgYnl0ZSBpbnRvIGRzdC4KLQkgKi8KLQljaGFyICpzcmMsICpkc3Q7Ci0JdW5zaWduZWQgaW50IGxpbmU7Ci0Jc3RhdGljIGNoYXIgKmJ1ZiA9IE5VTEw7Ci0Jc3RhdGljIGludCBidWZsZW4gPSAtMTsKLQlpbnQgYnBsID0gd2RweV94ICogMzsJLyogcGl4ZWxzaXplID09IDMgKi8KLQlpbnQgTEUsIG4sIHN0cCwgbGVuLCBkZWwsIHN6ID0gdyAqIDM7Ci0JaW50IGluc2VydF96ZXJvZXMgPSAxOwotCi0jZGVmaW5lIElOU0VSVF9aRVJPRVMgIFwKLQlsZW4gPSBzejsgXAotCWRlbCA9IDA7IFwKLQlzdHAgPSAwOyBcCi0Jd2hpbGUgKGxlbiA+IDApIHsgXAotCQlpZiAoaW5zZXJ0X3plcm9lcyAmJiAoZGVsIC0gTEUpICUgNCA9PSAwKSB7IFwKLQkJCSooZHN0ICsgZGVsKSA9IDA7IFwKLQkJCWRlbCsrOyBcCi0JCX0gXAotCQkqKGRzdCArIGRlbCkgPSAqKGJ1ZiArIHN0cCk7IFwKLQkJZGVsKys7IFwKLQkJbGVuLS07IFwKLQkJc3RwKys7IFwKLQl9Ci0KLQlpZiAocmZiRW5kaWFuVGVzdCkgewotCQlMRSA9IDM7CS8qIGxpdHRsZSBlbmRpYW4gKi8KLQl9IGVsc2UgewotCQlMRSA9IDA7IC8qIGJpZyBlbmRpYW4gKi8KLQl9Ci0KLQlpZiAoc3ogPiBidWZsZW4gfHwgYnVmID09IE5VTEwpIHsKLQkJaWYgKGJ1ZikgewotCQkJZnJlZShidWYpOwotCQl9Ci0JCWJ1ZiA9IChjaGFyICopIG1hbGxvYyg0KihzeiArIDEwMDApKTsKLQl9Ci0KLQlpZiAoY2xpcHNoaWZ0ICYmICEgdXNlX3NuYXBmYikgewotCQl4ICs9IGNvZmZfeDsKLQkJeSArPSBjb2ZmX3k7Ci0JfQotCi0JaWYgKHVzZV9zbmFwZmIgJiYgZGVzdCAhPSBzbmFwKSB7Ci0JCS8qIHNuYXBmYiBzcmMgKi8KLQkJc3JjID0gc25hcC0+ZGF0YSArIHNuYXAtPmJ5dGVzX3Blcl9saW5lKnkgKyAzKng7Ci0JCWRzdCA9IGRlc3QtPmRhdGE7Ci0JCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKLQkJCW1lbWNweShidWYsIHNyYywgc3opOwotCi0JCQlJTlNFUlRfWkVST0VTCi0KLQkJCXNyYyArPSBzbmFwLT5ieXRlc19wZXJfbGluZTsKLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCi0JfSBlbHNlIGlmICghIHJhd19mYl9zZWVrKSB7Ci0JCS8qIG1tYXAgKi8KLQkJYnBsID0gcmF3X2ZiX2J5dGVzX3Blcl9saW5lOwotCQlpZiAoY2xpcHNoaWZ0ICYmIHdkcHlfeCAhPSBjZHB5X3gpIHsKLQkJCWJwbCA9IHdkcHlfeCAqIDM7Ci0JCX0KLQkJc3JjID0gcmF3X2ZiX2FkZHIgKyByYXdfZmJfb2Zmc2V0ICsgYnBsKnkgKyAzKng7Ci0JCWRzdCA9IGRlc3QtPmRhdGE7Ci0KLQkJaWYgKHVzZV9zbmFwZmIgJiYgZGVzdCA9PSBzbmFwKSB7Ci0JCQkvKgotCQkJICogd3JpdGluZyAqdG8qIHNuYXBfZmI6IG5lZWQgdGhlIHgseSBvZmZzZXQsCi0JCQkgKiBhbmQgYWxzbyBkbyBub3QgZG8gaW5zZXJ0cy4KLQkJCSAqLwotCQkJZHN0ICs9IGJwbCp5ICsgMyp4OwotCQkJaW5zZXJ0X3plcm9lcyA9IDA7Ci0JCX0KLQotCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7Ci0JCQltZW1jcHkoYnVmLCBzcmMsIHN6KTsKLQotCQkJSU5TRVJUX1pFUk9FUwotCi0JCQlzcmMgKz0gYnBsOwotCQkJZHN0ICs9IGRlc3QtPmJ5dGVzX3Blcl9saW5lOwotCQl9Ci0KLQl9IGVsc2UgewotCQkvKiBsc2VlayAqLwotCQlvZmZfdCBvZmY7Ci0JCWJwbCA9IHJhd19mYl9ieXRlc19wZXJfbGluZTsKLQkJaWYgKGNsaXBzaGlmdCAmJiB3ZHB5X3ggIT0gY2RweV94KSB7Ci0JCQlicGwgPSB3ZHB5X3ggKiAzOwotCQl9Ci0JCW9mZiA9IChvZmZfdCkgKHJhd19mYl9vZmZzZXQgKyBicGwqeSArIDMqeCk7Ci0KLQkJbHNlZWsocmF3X2ZiX2ZkLCBvZmYsIFNFRUtfU0VUKTsKLQkJZHN0ID0gZGVzdC0+ZGF0YTsKLQotCQlpZiAodXNlX3NuYXBmYiAmJiBkZXN0ID09IHNuYXApIHsKLQkJCS8qCi0JCQkgKiB3cml0aW5nICp0byogc25hcF9mYjogbmVlZCB0aGUgeCx5IG9mZnNldCwKLQkJCSAqIGFuZCBhbHNvIGRvIG5vdCBkbyBpbnNlcnRzLgotCQkJICovCi0JCQlkc3QgKz0gYnBsKnkgKyAzKng7Ci0JCQlpbnNlcnRfemVyb2VzID0gMDsKLQkJfQotCi0JCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKLQkJCWxlbiA9IHN6OwotCQkJZGVsID0gMDsKLQkJCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQkJbiA9IHJlYWQocmF3X2ZiX2ZkLCBidWYgKyBkZWwsIGxlbik7Ci0KLQkJCQlpZiAobiA+IDApIHsKLQkJCQkJZGVsICs9IG47Ci0JCQkJCWxlbiAtPSBuOwotCQkJCX0gZWxzZSBpZiAobiA9PSAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJSU5TRVJUX1pFUk9FUwotCi0JCQlpZiAoYnBsID4gc3opIHsKLQkJCQlvZmYgPSAob2ZmX3QpIChicGwgLSBzeik7Ci0JCQkJbHNlZWsocmF3X2ZiX2ZkLCBvZmYsIFNFRUtfQ1VSKTsKLQkJCX0KLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCX0KLX0KLQotI2lmZGVmIE1BQ09TWAotdm9pZCBtYWNvc3hfY29weV9vcGVuZ2woY2hhciAqLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotI2VuZGlmCi0KLXZvaWQgY29weV9yYXdfZmIoWEltYWdlICpkZXN0LCBpbnQgeCwgaW50IHksIHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCkgewotCWNoYXIgKnNyYywgKmRzdDsKLQl1bnNpZ25lZCBpbnQgbGluZTsKLQlpbnQgcGl4ZWxzaXplID0gYnBwLzg7Ci0Jc3RhdGljIGludCBkYiA9IC0xOwotCi0jaWZkZWYgTUFDT1NYCi0JaWYgKG1hY29zeF9jb25zb2xlICYmIG1hY29zeF9yZWFkX29wZW5nbCkgewotCQltYWNvc3hfY29weV9vcGVuZ2woZGVzdC0+ZGF0YSwgeCwgeSwgdywgaCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQotCWlmICh4Zm9ybTI0dG8zMikgewotCQljb3B5X3Jhd19mYl8yNF90b18zMihkZXN0LCB4LCB5LCB3LCBoKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmF3X2ZiX25hdGl2ZV9icHAgPCA4KSB7Ci0JCWNvcHlfcmF3X2ZiX2xvd19icHAoZGVzdCwgeCwgeSwgdywgaCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRiIDwgMCkgewotCQlpZiAoZ2V0ZW52KCJERUJVR19DT1BZX1JBV19GQiIpKSB7Ci0JCQlkYiA9IGF0b2koZ2V0ZW52KCJERUJVR19DT1BZX1JBV19GQiIpKTsKLQkJfSBlbHNlIHsKLQkJCWRiID0gMDsKLQkJfQotCX0KLQotCWlmIChjbGlwc2hpZnQgJiYgISB1c2Vfc25hcGZiKSB7Ci0JCXggKz0gY29mZl94OwotCQl5ICs9IGNvZmZfeTsKLQl9Ci0KLQotCWlmICh1c2Vfc25hcGZiICYmIGRlc3QgIT0gc25hcCkgewotCQkvKiBzbmFwZmIgc3JjICovCi0JCXNyYyA9IHNuYXAtPmRhdGEgKyBzbmFwLT5ieXRlc19wZXJfbGluZSp5ICsgcGl4ZWxzaXplKng7Ci0JCWRzdCA9IGRlc3QtPmRhdGE7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJzbmFwLT5ieXRlc19wZXJfbGluZTogJWQsIGRlc3QtPmJ5dGVzX3Blcl9saW5lOiAlZCwgdzogJWQgaDogJWQgZHB5X3g6ICVkIHdkcHlfeDogJWQgY2RweV94OiAlZCBicHA6ICVkIHBpeGVsc2l6ZTogJWRcbiIsIHNuYXAtPmJ5dGVzX3Blcl9saW5lLCBkZXN0LT5ieXRlc19wZXJfbGluZSwgdywgaCwgZHB5X3gsIHdkcHlfeCwgY2RweV94LCBicHAsIHBpeGVsc2l6ZSk7Ci0KLQkJZm9yIChsaW5lID0gMDsgbGluZSA8IGg7IGxpbmUrKykgewotCQkJbWVtY3B5KGRzdCwgc3JjLCB3ICogcGl4ZWxzaXplKTsKLQkJCXNyYyArPSBzbmFwLT5ieXRlc19wZXJfbGluZTsKLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCi0JfSBlbHNlIGlmICghIHJhd19mYl9zZWVrKSB7Ci0JCS8qIG1tYXAgKi8KLQkJaW50IGJwbCA9IHJhd19mYl9ieXRlc19wZXJfbGluZTsKLQotCQlpZiAoY2xpcHNoaWZ0ICYmIHdkcHlfeCAhPSBjZHB5X3gpIHsKLQkJCWJwbCA9IHdkcHlfeCAqIHBpeGVsc2l6ZTsKLQkJfQotCi0JCXNyYyA9IHJhd19mYl9hZGRyICsgcmF3X2ZiX29mZnNldCArIGJwbCp5ICsgcGl4ZWxzaXplKng7Ci0JCWRzdCA9IGRlc3QtPmRhdGE7Ci0KLWlmIChkYikgZnByaW50ZihzdGRlcnIsICJicGw6ICVkLCBkZXN0LT5ieXRlc19wZXJfbGluZTogJWQsIHc6ICVkIGg6ICVkIGRweV94OiAlZCB3ZHB5X3g6ICVkIGNkcHlfeDogJWQgYnBwOiAlZCBwaXhlbHNpemU6ICVkXG4iLCBicGwsIGRlc3QtPmJ5dGVzX3Blcl9saW5lLCB3LCBoLCBkcHlfeCwgd2RweV94LCBjZHB5X3gsIGJwcCwgcGl4ZWxzaXplKTsKLQotCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7Ci0JCQltZW1jcHkoZHN0LCBzcmMsIHcgKiBwaXhlbHNpemUpOwotCQkJc3JjICs9IGJwbDsKLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJLyogbHNlZWsgKi8KLQkJaW50IG4sIGxlbiwgZGVsLCBzeiA9IHcgKiBwaXhlbHNpemU7Ci0JCW9mZl90IG9mZjsKLQkJaW50IGJwbCA9IHJhd19mYl9ieXRlc19wZXJfbGluZTsKLQotCQlpZiAoY2xpcHNoaWZ0ICYmIHdkcHlfeCAhPSBjZHB5X3gpIHsKLQkJCWJwbCA9IHdkcHlfeCAqIHBpeGVsc2l6ZTsKLQkJfQotCi0JCW9mZiA9IChvZmZfdCkgKHJhd19mYl9vZmZzZXQgKyBicGwqeSArIHBpeGVsc2l6ZSp4KTsKLQotCQlsc2VlayhyYXdfZmJfZmQsIG9mZiwgU0VFS19TRVQpOwotCQlkc3QgPSBkZXN0LT5kYXRhOwotCi1pZiAoZGIpIGZwcmludGYoc3RkZXJyLCAibHNlZWsgMCBwczogJWQgIHN6OiAlZCBvZmY6ICVkIGJwbDogJWRcbiIsIHBpeGVsc2l6ZSwgc3osIChpbnQpIG9mZiwgYnBsKTsKLQotCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7Ci0JCQlsZW4gPSBzejsKLQkJCWRlbCA9IDA7Ci0JCQl3aGlsZSAobGVuID4gMCkgewotCQkJCW4gPSByZWFkKHJhd19mYl9mZCwgZHN0ICsgZGVsLCBsZW4pOwotCi0JCQkJaWYgKG4gPiAwKSB7Ci0JCQkJCWRlbCArPSBuOwotCQkJCQlsZW4gLT0gbjsKLQkJCQl9IGVsc2UgaWYgKG4gPT0gMCkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYnBsID4gc3opIHsKLQkJCQlvZmYgPSAob2ZmX3QpIChicGwgLSBzeik7Ci0JCQkJbHNlZWsocmF3X2ZiX2ZkLCBvZmYsIFNFRUtfQ1VSKTsKLQkJCX0KLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCX0KLX0KLQotdm9pZCBjb3B5X2ltYWdlKFhJbWFnZSAqZGVzdCwgaW50IHgsIGludCB5LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpIHsKLQkvKiBkZWZhdWx0ICh3PTAsIGg9MCkgaXMgdGhlIGZpbGwgdGhlIGVudGlyZSBYSW1hZ2UgKi8KLQlpZiAoZGVzdCA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHcgPCAxKSAgewotCQl3ID0gZGVzdC0+d2lkdGg7Ci0JfQotCWlmIChoIDwgMSkgIHsKLQkJaCA9IGRlc3QtPmhlaWdodDsKLQl9Ci0KLQlpZiAocmF3X2ZiKSB7Ci0JCWNvcHlfcmF3X2ZiKGRlc3QsIHgsIHksIHcsIGgpOwotCi0JfSBlbHNlIGlmICh1c2Vfc25hcGZiICYmIHNuYXBfZmIgJiYgZGVzdCAhPSBzbmFwcmVjdCkgewotCQljaGFyICpzcmMsICpkc3Q7Ci0JCXVuc2lnbmVkIGludCBsaW5lOwotCQlpbnQgcGl4ZWxzaXplID0gYnBwLzg7Ci0KLQkJc3JjID0gc25hcC0+ZGF0YSArIHNuYXAtPmJ5dGVzX3Blcl9saW5lKnkgKyBwaXhlbHNpemUqeDsKLQkJZHN0ID0gZGVzdC0+ZGF0YTsKLQkJZm9yIChsaW5lID0gMDsgbGluZSA8IGg7IGxpbmUrKykgewotCQkJbWVtY3B5KGRzdCwgc3JjLCB3ICogcGl4ZWxzaXplKTsKLQkJCXNyYyArPSBzbmFwLT5ieXRlc19wZXJfbGluZTsKLQkJCWRzdCArPSBkZXN0LT5ieXRlc19wZXJfbGluZTsKLQkJfQotCi0JfSBlbHNlIGlmICgodXNpbmdfc2htICYmICEgeGZvcm0yNHRvMzIpICYmIChpbnQpIHcgPT0gZGVzdC0+d2lkdGggJiYKLQkgICAgKGludCkgaCA9PSBkZXN0LT5oZWlnaHQpIHsKLQkJWFNobUdldEltYWdlX3dyKGRweSwgd2luZG93LCBkZXN0LCB4LCB5LCBBbGxQbGFuZXMpOwotCi0JfSBlbHNlIHsKLQkJWEdldFN1YkltYWdlX3dyKGRweSwgd2luZG93LCB4LCB5LCB3LCBoLCBBbGxQbGFuZXMsCi0JCSAgICBaUGl4bWFwLCBkZXN0LCAwLCAwKTsKLQl9Ci19Ci0KLSNkZWZpbmUgREVCVUdfU0tJUFBFRF9JTlBVVChkYmcsIHN0cikgXAotCWlmIChkYmcpIHsgXAotCQlyZmJMb2coInNraXBwZWQgaW5wdXQ6ICVzXG4iLCBzdHIpOyBcCi0JfQotCi12b2lkIGluaXRfdHJhY2tfa2V5Y29kZV9zdGF0ZSh2b2lkKSB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKLQkJa2V5Y29kZV9zdGF0ZVtpXSA9IDA7Ci0JfQotCWdldF9rZXlzdGF0ZShrZXljb2RlX3N0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgdXB1cF9kb3duZG93bl93YXJuaW5nKEtleUNvZGUga2V5LCBCb29sIGRvd24pIHsKLQlSQVdGQl9SRVRfVk9JRAotI2lmIE5PX1gxMQotCWlmICgha2V5IHx8ICFkb3duKSB7fQotCXJldHVybjsKLSNlbHNlCi0JaWYgKChkb3duID8gMTowKSA9PSBrZXljb2RlX3N0YXRlWyhpbnQpIGtleV0pIHsKLQkJY2hhciAqc3RyID0gWEtleXN5bVRvU3RyaW5nKFhLZXljb2RlVG9LZXlzeW0oZHB5LCBrZXksIDApKTsKLQkJcmZiTG9nKCJYVGVzdEZha2VLZXlFdmVudDoga2V5Y29kZT0weCV4IFwiJXNcIiBpcyAqYWxyZWFkeSogIgotCQkgICAgIiVzXG4iLCBrZXksIHN0ciA/IHN0ciA6ICJudWxsIiwgZG93biA/ICJkb3duIjoidXAiKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLS8qCi0gKiB3cmFwcGVycyBmb3IgWFRlc3RGYWtlS2V5RXZlbnQsIGV0Yy4uCi0gKiBhbHNvIGZvciBYVHJhcCBlcXVpdmFsZW50cyBYRVNpbXVsYXRlWEV2ZW50UmVxdWVzdAotICovCi0KLXZvaWQgWFRSQVBfRmFrZUtleUV2ZW50X3dyKERpc3BsYXkqIGRweSwgS2V5Q29kZSBrZXksIEJvb2wgZG93biwKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KSB7Ci0KLQlSQVdGQl9SRVRfVk9JRAotI2lmIE5PX1gxMQotCW5veDExX2V4aXQoMSk7Ci0JaWYgKCFkcHkgfHwgIWtleSB8fCAhZG93biB8fCAhZGVsYXkpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQotCWlmICghIHh0cmFwX3ByZXNlbnQpIHsKLQkJREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgImtleWJvYXJkOiBuby1YVFJBUCIpOwotCQlyZXR1cm47Ci0JfQotCS8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0JaWYgKGtleSB8fCBkb3duIHx8IGRlbGF5KSB7fQotCi0jIGlmIExJQlZOQ1NFUlZFUl9IQVZFX0xJQlhUUkFQCi0JWEVTaW11bGF0ZVhFdmVudFJlcXVlc3QodHJhcF9jdHgsIGRvd24gPyBLZXlQcmVzcyA6IEtleVJlbGVhc2UsCi0JICAgIGtleSwgMCwgMCwgMCk7Ci0JaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCXVwdXBfZG93bmRvd25fd2FybmluZyhrZXksIGRvd24pOwotCX0KLQlrZXljb2RlX3N0YXRlWyhpbnQpIGtleV0gPSBkb3duID8gMSA6IDA7Ci0jIGVsc2UKLQlERUJVR19TS0lQUEVEX0lOUFVUKGRlYnVnX2tleWJvYXJkLCAia2V5Ym9hcmQ6IG5vLVhUUkFQLWJ1aWxkIik7Ci0jIGVuZGlmCi0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBYVGVzdEZha2VLZXlFdmVudF93cihEaXNwbGF5KiBkcHksIEtleUNvZGUga2V5LCBCb29sIGRvd24sCi0gICAgdW5zaWduZWQgbG9uZyBkZWxheSkgewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCByZWdyYWIgPSAwOwotCi0JUkFXRkJfUkVUX1ZPSUQKLQotI2lmIE5PX1gxMQotCW5veDExX2V4aXQoMSk7Ci0JaWYgKCFkcHkgfHwgIWtleSB8fCAhZG93biB8fCAhZGVsYXkgfHwgIWZpcnN0KSB7fQotCXJldHVybjsKLSNlbHNlCi0JaWYgKGRlYnVnX2tleWJvYXJkKSB7Ci0JCWNoYXIgKnN0ciA9IFhLZXlzeW1Ub1N0cmluZyhYS2V5Y29kZVRvS2V5c3ltKGRweSwga2V5LCAwKSk7Ci0JCXJmYkxvZygiWFRlc3RGYWtlS2V5RXZlbnQoZHB5LCBrZXljb2RlPTB4JXggXCIlc1wiLCAlcylcbiIsCi0JCSAgICBrZXksIHN0ciA/IHN0ciA6ICJudWxsIiwgZG93biA/ICJkb3duIjoidXAiKTsKLQl9Ci0JaWYgKGZpcnN0KSB7IAotCQlpbml0X3RyYWNrX2tleWNvZGVfc3RhdGUoKTsKLQkJZmlyc3QgPSAwOwotCX0KLQlpZiAoZG93bikgewotCQlsYXN0X2tleWJvYXJkX2tleWNvZGUgPSAta2V5OwotCX0gZWxzZSB7Ci0JCWxhc3Rfa2V5Ym9hcmRfa2V5Y29kZSA9IGtleTsKLQl9Ci0KLQlpZiAoZ3JhYl9rYmQpIHsKLQkJWFVuZ3JhYktleWJvYXJkKGRweSwgQ3VycmVudFRpbWUpOwotCQlyZWdyYWIgPSAxOwotCX0KLQlpZiAoZ3JhYl9wdHIgJiYgdW5ncmFiX2JvdGgpIHsKLQkJWFVuZ3JhYlBvaW50ZXIoZHB5LCBDdXJyZW50VGltZSk7Ci0JCXJlZ3JhYiA9IDE7Ci0JfQotCi0JaWYgKHh0cmFwX2lucHV0KSB7Ci0JCVhUUkFQX0Zha2VLZXlFdmVudF93cihkcHksIGtleSwgZG93biwgZGVsYXkpOwotCQlpZiAocmVncmFiKSB7Ci0JCQlhZGp1c3RfZ3JhYnMoMSwgMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHh0ZXN0X3ByZXNlbnQpIHsKLQkJREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgImtleWJvYXJkOiBuby1YVEVTVCIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQlyZmJMb2coImNhbGxpbmcgWFRlc3RGYWtlS2V5RXZlbnQoJWQsICVkKSAgJS40ZlxuIiwKLQkJICAgIGtleSwgZG93biwgZG5vd3goKSk7CQotCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVAotCVhUZXN0RmFrZUtleUV2ZW50KGRweSwga2V5LCBkb3duLCBkZWxheSk7Ci0JaWYgKHJlZ3JhYikgewotCQlhZGp1c3RfZ3JhYnMoMSwgMSk7Ci0JfQotCWlmIChkZWJ1Z19rZXlib2FyZCkgewotCQl1cHVwX2Rvd25kb3duX3dhcm5pbmcoa2V5LCBkb3duKTsKLQl9Ci0Ja2V5Y29kZV9zdGF0ZVsoaW50KSBrZXldID0gZG93biA/IDEgOiAwOwotI2VuZGlmCi0KLSNlbmRpZgkvKiBOT19YMTEgKi8KLX0KLQotdm9pZCBYVFJBUF9GYWtlQnV0dG9uRXZlbnRfd3IoRGlzcGxheSogZHB5LCB1bnNpZ25lZCBpbnQgYnV0dG9uLCBCb29sIGlzX3ByZXNzLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpIHsKLQotCVJBV0ZCX1JFVF9WT0lECi0jaWYgTk9fWDExCi0Jbm94MTFfZXhpdCgxKTsKLQlpZiAoIWRweSB8fCAhYnV0dG9uIHx8ICFpc19wcmVzcyB8fCAhZGVsYXkpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQotCWlmICghIHh0cmFwX3ByZXNlbnQpIHsKLQkJREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgImJ1dHRvbjogbm8tWFRSQVAiKTsKLQkJcmV0dXJuOwotCX0KLQkvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCWlmIChidXR0b24gfHwgaXNfcHJlc3MgfHwgZGVsYXkpIHt9Ci0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYVFJBUAotCVhFU2ltdWxhdGVYRXZlbnRSZXF1ZXN0KHRyYXBfY3R4LAotCSAgICBpc19wcmVzcyA/IEJ1dHRvblByZXNzIDogQnV0dG9uUmVsZWFzZSwgYnV0dG9uLCAwLCAwLCAwKTsKLSNlbHNlCi0JREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgImJ1dHRvbjogbm8tWFRSQVAtYnVpbGQiKTsKLSNlbmRpZgotCi0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgWFRlc3RGYWtlQnV0dG9uRXZlbnRfd3IoRGlzcGxheSogZHB5LCB1bnNpZ25lZCBpbnQgYnV0dG9uLCBCb29sIGlzX3ByZXNzLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpIHsKLQlpbnQgcmVncmFiID0gMDsKLQotCVJBV0ZCX1JFVF9WT0lECi0jaWYgTk9fWDExCi0Jbm94MTFfZXhpdCgxKTsKLQlpZiAoIWRweSB8fCAhYnV0dG9uIHx8ICFpc19wcmVzcyB8fCAhZGVsYXkpIHt9Ci0JcmV0dXJuOwotI2Vsc2UKLQotCWlmIChncmFiX3B0cikgewotCQlYVW5ncmFiUG9pbnRlcihkcHksIEN1cnJlbnRUaW1lKTsKLQkJcmVncmFiID0gMTsKLQl9Ci0JaWYgKGdyYWJfa2JkICYmIHVuZ3JhYl9ib3RoKSB7Ci0JCVhVbmdyYWJLZXlib2FyZChkcHksIEN1cnJlbnRUaW1lKTsKLQkJcmVncmFiID0gMTsKLQl9Ci0KLQlpZiAoeHRyYXBfaW5wdXQpIHsKLQkJWFRSQVBfRmFrZUJ1dHRvbkV2ZW50X3dyKGRweSwgYnV0dG9uLCBpc19wcmVzcywgZGVsYXkpOwotCQlpZiAocmVncmFiKSB7Ci0JCQlhZGp1c3RfZ3JhYnMoMSwgMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmICghIHh0ZXN0X3ByZXNlbnQpIHsKLQkJREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgImJ1dHRvbjogbm8tWFRFU1QiKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVidWdfcG9pbnRlcikgewotCQlyZmJMb2coImNhbGxpbmcgWFRlc3RGYWtlQnV0dG9uRXZlbnQoJWQsICVkKSAgJS40ZlxuIiwKLQkJICAgIGJ1dHRvbiwgaXNfcHJlc3MsIGRub3d4KCkpOwkKLQl9Ci0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1QKLSAgICAJWFRlc3RGYWtlQnV0dG9uRXZlbnQoZHB5LCBidXR0b24sIGlzX3ByZXNzLCBkZWxheSk7Ci0jZW5kaWYKLQlpZiAocmVncmFiKSB7Ci0JCWFkanVzdF9ncmFicygxLCAxKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgWFRSQVBfRmFrZU1vdGlvbkV2ZW50X3dyKERpc3BsYXkqIGRweSwgaW50IHNjcmVlbiwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpIHsKLQotCVJBV0ZCX1JFVF9WT0lECi0KLSNpZiBOT19YMTEKLQlub3gxMV9leGl0KDEpOwotCWlmICghZHB5IHx8ICFzY3JlZW4gfHwgIXggfHwgIXkgfHwgIWRlbGF5KSB7fQotCXJldHVybjsKLSNlbHNlCi0JaWYgKCEgeHRyYXBfcHJlc2VudCkgewotCQlERUJVR19TS0lQUEVEX0lOUFVUKGRlYnVnX2tleWJvYXJkLCAibW90aW9uOiBuby1YVFJBUCIpOwotCQlyZXR1cm47Ci0JfQotCS8qIHVudXNlZCB2YXJzIHdhcm5pbmc6ICovCi0JaWYgKGRweSB8fCBzY3JlZW4gfHwgeCB8fCB5IHx8IGRlbGF5KSB7fQotCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWFRSQVAKLQlYRVNpbXVsYXRlWEV2ZW50UmVxdWVzdCh0cmFwX2N0eCwgTW90aW9uTm90aWZ5LCAwLCB4LCB5LCAwKTsKLSNlbHNlCi0JREVCVUdfU0tJUFBFRF9JTlBVVChkZWJ1Z19rZXlib2FyZCwgIm1vdGlvbjogbm8tWFRSQVAtYnVpbGQiKTsKLSNlbmRpZgotCi0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLXZvaWQgWFRlc3RGYWtlTW90aW9uRXZlbnRfd3IoRGlzcGxheSogZHB5LCBpbnQgc2NyZWVuLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgbG9uZyBkZWxheSkgewotCWludCByZWdyYWIgPSAwOwotCi0JUkFXRkJfUkVUX1ZPSUQKLSNpZiBOT19YMTEKLQlub3gxMV9leGl0KDEpOwotCWlmICghZHB5IHx8ICFzY3JlZW4gfHwgIXggfHwgIXkgfHwgIWRlbGF5KSB7fQotCXJldHVybjsKLSNlbHNlCi0KLQlpZiAoZ3JhYl9wdHIpIHsKLQkJWFVuZ3JhYlBvaW50ZXIoZHB5LCBDdXJyZW50VGltZSk7Ci0JCXJlZ3JhYiA9IDE7Ci0JfQotCWlmIChncmFiX2tiZCAmJiB1bmdyYWJfYm90aCkgewotCQlYVW5ncmFiS2V5Ym9hcmQoZHB5LCBDdXJyZW50VGltZSk7Ci0JCXJlZ3JhYiA9IDE7Ci0JfQotCi0JaWYgKHh0cmFwX2lucHV0KSB7Ci0JCVhUUkFQX0Zha2VNb3Rpb25FdmVudF93cihkcHksIHNjcmVlbiwgeCwgeSwgZGVsYXkpOwotCQlpZiAocmVncmFiKSB7Ci0JCQlhZGp1c3RfZ3JhYnMoMSwgMSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChkZWJ1Z19wb2ludGVyKSB7Ci0JCXJmYkxvZygiY2FsbGluZyBYVGVzdEZha2VNb3Rpb25FdmVudCglZCwgJWQpICAlLjRmXG4iLAotCQkgICAgeCwgeSwgZG5vd3goKSk7CQotCX0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVAotCVhUZXN0RmFrZU1vdGlvbkV2ZW50KGRweSwgc2NyZWVuLCB4LCB5LCBkZWxheSk7Ci0jZW5kaWYKLQlpZiAocmVncmFiKSB7Ci0JCWFkanVzdF9ncmFicygxLCAxKTsKLQl9Ci0jZW5kaWYJLyogTk9fWDExICovCi19Ci0KLUJvb2wgWFRlc3RDb21wYXJlQ3VycmVudEN1cnNvcldpdGhXaW5kb3dfd3IoRGlzcGxheSogZHB5LCBXaW5kb3cgdykgewotCWlmICghIHh0ZXN0X3ByZXNlbnQpIHsKLQkJcmV0dXJuIEZhbHNlOwotCX0KLQlSQVdGQl9SRVQoRmFsc2UpCi0KLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVAotCXJldHVybiBYVGVzdENvbXBhcmVDdXJyZW50Q3Vyc29yV2l0aFdpbmRvdyhkcHksIHcpOwotI2Vsc2UKLQlpZiAoIXcpIHt9Ci0JcmV0dXJuIEZhbHNlOwotI2VuZGlmCi19Ci0KLUJvb2wgWFRlc3RDb21wYXJlQ3Vyc29yV2l0aFdpbmRvd193cihEaXNwbGF5KiBkcHksIFdpbmRvdyB3LCBDdXJzb3IgY3Vyc29yKSB7Ci0JaWYgKCEgeHRlc3RfcHJlc2VudCkgewotCQlyZXR1cm4gRmFsc2U7Ci0JfQotCVJBV0ZCX1JFVChGYWxzZSkKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9YVEVTVAotCXJldHVybiBYVGVzdENvbXBhcmVDdXJzb3JXaXRoV2luZG93KGRweSwgdywgY3Vyc29yKTsKLSNlbHNlCi0JaWYgKCFkcHkgfHwgIXcgfHwgIWN1cnNvcikge30KLQlyZXR1cm4gRmFsc2U7Ci0jZW5kaWYKLX0KLQotQm9vbCBYVGVzdFF1ZXJ5RXh0ZW5zaW9uX3dyKERpc3BsYXkgKmRweSwgaW50ICpldiwgaW50ICplciwgaW50ICptYWosCi0gICAgaW50ICptaW4pIHsKLQlSQVdGQl9SRVQoRmFsc2UpCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1QKLQlyZXR1cm4gWFRlc3RRdWVyeUV4dGVuc2lvbihkcHksIGV2LCBlciwgbWFqLCBtaW4pOwotI2Vsc2UKLQlpZiAoIWRweSB8fCAhZXYgfHwgIWVyIHx8ICFtYWogfHwgIW1pbikge30KLQlyZXR1cm4gRmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBYVGVzdERpc2NhcmRfd3IoRGlzcGxheSAqZHB5KSB7Ci0JaWYgKCEgeHRlc3RfcHJlc2VudCkgewotCQlyZXR1cm47Ci0JfQotCVJBV0ZCX1JFVF9WT0lECi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1QKLQlYVGVzdERpc2NhcmQoZHB5KTsKLSNlbHNlCi0JaWYgKCFkcHkpIHt9Ci0jZW5kaWYKLX0KLQotQm9vbCBYRVRyYXBRdWVyeUV4dGVuc2lvbl93cihEaXNwbGF5ICpkcHksIGludCAqZXYsIGludCAqZXIsIGludCAqb3ApIHsKLQlSQVdGQl9SRVQoRmFsc2UpCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfTElCWFRSQVAKLQlyZXR1cm4gWEVUcmFwUXVlcnlFeHRlbnNpb24oZHB5LCAoSU5UMzIgKilldiwgKElOVDMyICopZXIsCi0JICAgIChJTlQzMiAqKW9wKTsKLSNlbHNlCi0JLyogdW51c2VkIHZhcnMgd2FybmluZzogKi8KLQlpZiAoZXYgfHwgZXIgfHwgb3ApIHt9Ci0JcmV0dXJuIEZhbHNlOwotI2VuZGlmCi19Ci0KLWludCBYVGVzdEdyYWJDb250cm9sX3dyKERpc3BsYXkgKmRweSwgQm9vbCBpbXBlcnZpb3VzKSB7Ci0JaWYgKCEgeHRlc3RfcHJlc2VudCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JUkFXRkJfUkVUKDApCi0jaWYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1QgJiYgTElCVk5DU0VSVkVSX0hBVkVfWFRFU1RHUkFCQ09OVFJPTAotCVhUZXN0R3JhYkNvbnRyb2woZHB5LCBpbXBlcnZpb3VzKTsKLQlyZXR1cm4gMTsKLSNlbHNlCi0JaWYgKCFkcHkgfHwgIWltcGVydmlvdXMpIHt9Ci0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotaW50IFhUUkFQX0dyYWJDb250cm9sX3dyKERpc3BsYXkgKmRweSwgQm9vbCBpbXBlcnZpb3VzKSB7Ci0JaWYgKCEgeHRyYXBfcHJlc2VudCkgewotCQkvKiB1bnVzZWQgdmFycyB3YXJuaW5nOiAqLwotCQlpZiAoZHB5IHx8IGltcGVydmlvdXMpIHt9Ci0JCXJldHVybiAwOwotCX0KLQlSQVdGQl9SRVQoMCkKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJYVFJBUAotCSAgZWxzZSB7Ci0JCVJlcUZsYWdzIHJlcXVlc3RzOwotCi0JCWlmICghIGltcGVydmlvdXMpIHsKLQkJCWlmICh0cmFwX2N0eCkgewotCQkJCVhFRnJlZVRDKHRyYXBfY3R4KTsKLQkJCX0KLQkJCXRyYXBfY3R4ID0gTlVMTDsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKCEgdHJhcF9jdHgpIHsKLQkJCXRyYXBfY3R4ID0gWEVDcmVhdGVUQyhkcHksIDAsIE5VTEwpOwotCQkJaWYgKCEgdHJhcF9jdHgpIHsKLQkJCQlyZmJMb2coIkRFQy1YVFJBUCBYRUNyZWF0ZVRDIGZhaWxlZC4gIFdhdGNoICIKLQkJCQkgICAgIm91dCBmb3IgWEdyYWJTZXJ2ZXIgZnJvbSB3bSdzXG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCVhFU3RhcnRUcmFwUmVxdWVzdCh0cmFwX2N0eCk7Ci0JCQltZW1zZXQocmVxdWVzdHMsIDAsIHNpemVvZihyZXF1ZXN0cykpOwotCQkJQml0VHJ1ZShyZXF1ZXN0cywgWF9HcmFiU2VydmVyKTsKLQkJCUJpdFRydWUocmVxdWVzdHMsIFhfVW5ncmFiU2VydmVyKTsKLQkJCVhFVHJhcFNldFJlcXVlc3RzKHRyYXBfY3R4LCBUcnVlLCByZXF1ZXN0cyk7Ci0JCQlYRVRyYXBTZXRHcmFiU2VydmVyKHRyYXBfY3R4LCBUcnVlKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBkaXNhYmxlX2dyYWJzZXJ2ZXIoRGlzcGxheSAqaW5fZHB5LCBpbnQgY2hhbmdlKSB7Ci0JaW50IG9rID0gMDsKLQlzdGF0aWMgaW50IGRpZG1zZyA9IDA7Ci0KLQlpZiAoZGVidWdfZ3JhYnMpIHsKLQkJZnByaW50ZihzdGRlcnIsICJkaXNhYmxlX2dyYWJzZXJ2ZXIvJWQgJS41ZlxuIiwKLQkJCXhzZXJ2ZXJfZ3JhYmJlZCwgZG5vd3goKSk7Ci0JCWRpZG1zZyA9IDA7Ci0JfQotCi0JaWYgKCEgeHRyYXBfaW5wdXQpIHsKLQkJaWYgKFhUZXN0R3JhYkNvbnRyb2xfd3IoaW5fZHB5LCBUcnVlKSkgewotCQkJaWYgKGNoYW5nZSkgewotCQkJCVhUUkFQX0dyYWJDb250cm9sX3dyKGluX2RweSwgRmFsc2UpOwotCQkJfQotCQkJaWYgKCEgZGlkbXNnICYmICEgcmF3X2ZiX3N0cikgewotCQkJCXJmYkxvZygiR3JhYlNlcnZlciBjb250cm9sIHZpYSBYVEVTVC5cbiIpOyAKLQkJCQlkaWRtc2cgPSAxOwotCQkJfQotCQkJb2sgPSAxOwotCQl9IGVsc2UgewotCQkJaWYgKFhUUkFQX0dyYWJDb250cm9sX3dyKGluX2RweSwgVHJ1ZSkpIHsKLQkJCQlvayA9IDE7Ci0JCQkJaWYgKCEgZGlkbXNnICYmICEgcmF3X2ZiX3N0cikgewotCQkJCQlyZmJMb2coIlVzaW5nIERFQy1YVFJBUCBmb3IgcHJvdGVjdGlvbiIKLQkJCQkJICAgICIgZnJvbSBYR3JhYlNlcnZlci5cbiIpOwotCQkJCQlkaWRtc2cgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChYVFJBUF9HcmFiQ29udHJvbF93cihpbl9kcHksIFRydWUpKSB7Ci0JCQlpZiAoY2hhbmdlKSB7Ci0JCQkJWFRlc3RHcmFiQ29udHJvbF93cihpbl9kcHksIEZhbHNlKTsKLQkJCX0KLQkJCWlmICghIGRpZG1zZyAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCQlyZmJMb2coIkdyYWJTZXJ2ZXIgY29udHJvbCB2aWEgREVDLVhUUkFQLlxuIik7IAotCQkJCWRpZG1zZyA9IDE7Ci0JCQl9Ci0JCQlvayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoWFRlc3RHcmFiQ29udHJvbF93cihpbl9kcHksIFRydWUpKSB7Ci0JCQkJb2sgPSAxOwotCQkJCWlmICghIGRpZG1zZyAmJiAhIHJhd19mYl9zdHIpIHsKLQkJCQkJcmZiTG9nKCJERUMtWFRSQVAgWEdyYWJTZXJ2ZXIgIgotCQkJCQkgICAgInByb3RlY3Rpb24gbm90IGF2YWlsYWJsZSwgIgotCQkJCQkgICAgInVzaW5nIFhURVNULlxuIik7Ci0JCQkJCWRpZG1zZyA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmICghIG9rICYmICEgZGlkbXNnKSB7Ci0JCXJmYkxvZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQkJcmZiTG9nKCIqIE5vIFhURVNUIG9yIERFQy1YVFJBUCBwcm90ZWN0aW9uIGZyb20gWEdyYWJTZXJ2ZXIgISEhICpcbiIpOwotCQlyZmJMb2coIiogREVBRExPQ0sgaWYgeW91ciB3aW5kb3cgbWFuYWdlciBjYWxscyBYR3JhYlNlcnZlciAhISEgKlxuIik7Ci0JCXJmYkxvZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQl9Ci0JWEZsdXNoX3dyKGluX2RweSk7Ci19Ci0KLUJvb2wgWFJlY29yZFF1ZXJ5VmVyc2lvbl93cihEaXNwbGF5ICpkcHksIGludCAqbWFqLCBpbnQgKm1pbikgewotCVJBV0ZCX1JFVChGYWxzZSkKLSNpZiBMSUJWTkNTRVJWRVJfSEFWRV9SRUNPUkQKLQlyZXR1cm4gWFJlY29yZFF1ZXJ5VmVyc2lvbihkcHksIG1haiwgbWluKTsKLSNlbHNlCi0JaWYgKCFkcHkgfHwgIW1haiB8fCAhbWluKSB7fQotCXJldHVybiBGYWxzZTsKLSNlbmRpZgotfQotCi1pbnQgeGF1dGhfcmF3KGludCBvbikgewotCWNoYXIgdG1wW10gPSAiL3RtcC94MTF2bmMteGF1dGguWFhYWFhYIjsKLQlpbnQgdG1wX2ZkID0gLTE7Ci0Jc3RhdGljIGNoYXIgKm9sZF94YXV0aG9yaXR5ID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqb2xkX3RtcCA9IE5VTEw7Ci0JaW50IGRiID0gMDsKLQotCWlmIChvbikgewotCQlpZiAob2xkX3hhdXRob3JpdHkpIHsKLQkJCWZyZWUob2xkX3hhdXRob3JpdHkpOwotCQkJb2xkX3hhdXRob3JpdHkgPSBOVUxMOwotCQl9Ci0JCWlmIChvbGRfdG1wKSB7Ci0JCQlmcmVlKG9sZF90bXApOwotCQkJb2xkX3RtcCA9IE5VTEw7Ci0JCX0KLQkJaWYgKHhhdXRoX3Jhd19kYXRhKSB7Ci0JCQl0bXBfZmQgPSBta3N0ZW1wKHRtcCk7Ci0JCQlpZiAodG1wX2ZkIDwgMCkgewotCQkJCXJmYkxvZygiY291bGQgbm90IGNyZWF0ZSB0bXAgeGF1dGggZmlsZTogJXNcbiIsIHRtcCk7CQotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKGRiKSBmcHJpbnRmKHN0ZGVyciwgIlhBVVRIT1JJVFkgdG1wOiAlc1xuIiwgdG1wKTsKLQkJCXdyaXRlKHRtcF9mZCwgeGF1dGhfcmF3X2RhdGEsIHhhdXRoX3Jhd19sZW4pOwotCQkJY2xvc2UodG1wX2ZkKTsKLQkJCWlmIChnZXRlbnYoIlhBVVRIT1JJVFkiKSkgewotCQkJCW9sZF94YXV0aG9yaXR5ID0gc3RyZHVwKGdldGVudigiWEFVVEhPUklUWSIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkX3hhdXRob3JpdHkgPSBzdHJkdXAoIiIpOwotCQkJfQotCQkJc2V0X2VudigiWEFVVEhPUklUWSIsIHRtcCk7Ci0JCQlvbGRfdG1wID0gc3RyZHVwKHRtcCk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKG9sZF94YXV0aG9yaXR5KSB7Ci0JCQlpZiAoIXN0cmNtcChvbGRfeGF1dGhvcml0eSwgIiIpKSB7Ci0JCQkJY2hhciAqeGF1dGggPSBnZXRlbnYoIlhBVVRIT1JJVFkiKTsKLQkJCQlpZiAoeGF1dGgpIHsKLQkJCQkJKih4YXV0aC0yKSA9ICdfJzsJLyogeW93ICovCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZXRfZW52KCJYQVVUSE9SSVRZIiwgb2xkX3hhdXRob3JpdHkpOwotCQkJfQotCQkJZnJlZShvbGRfeGF1dGhvcml0eSk7Ci0JCQlvbGRfeGF1dGhvcml0eSA9IE5VTEw7Ci0JCX0KLQkJaWYgKG9sZF90bXApIHsKLQkJCXVubGluayhvbGRfdG1wKTsKLQkJCWZyZWUob2xkX3RtcCk7Ci0JCQlvbGRfdG1wID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLURpc3BsYXkgKlhPcGVuRGlzcGxheV93cihjaGFyICpkaXNwbGF5X25hbWUpIHsKLQlEaXNwbGF5ICpkID0gTlVMTDsKLQlpbnQgZGIgPSAwOwotCi0JaWYgKCEgeGF1dGhfcmF3KDEpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLSNpZiBOT19YMTEKLQlyZmJMb2coIlRoaXMgeDExdm5jIHdhcyBidWlsdCB3aXRob3V0IFgxMSBzdXBwb3J0ICgtcmF3ZmIgb25seSkuXG4iKTsKLQlpZiAoIWRpc3BsYXlfbmFtZSB8fCAhZCB8fCAhZGIpIHt9Ci0JcmV0dXJuIE5VTEw7Ci0jZWxzZQotCi0JZCA9IFhPcGVuRGlzcGxheShkaXNwbGF5X25hbWUpOwotCWlmIChkYikgZnByaW50ZihzdGRlcnIsICJYT3BlbkRpc3BsYXlfd3I6ICVzICAlcFxuIiwgZGlzcGxheV9uYW1lLCAodm9pZCAqKWQpOwotCi0JaWYgKGQgPT0gTlVMTCAmJiAhZ2V0ZW52KCJOT19YQVVUSExPQ0FMSE9TVE5BTUUiKSkgewotCQljaGFyICp4YWxobiA9IGdldGVudigiWEFVVEhMT0NBTEhPU1ROQU1FIik7Ci0JCWlmICgxIHx8ICF4YWxobikgewotCQkJcmZiTG9nKCJYT3BlbkRpc3BsYXkoXCIlc1wiKSBmYWlsZWQuXG4iLAotCQkJICAgIGRpc3BsYXlfbmFtZSA/IGRpc3BsYXlfbmFtZSA6ICIiKTsKLQkJCXJmYkxvZygiVHJ5aW5nIGFnYWluIHdpdGggWEFVVEhMT0NBTEhPU1ROQU1FPWxvY2FsaG9zdCAuLi5cbiIpOwotCQkJc2V0X2VudigiWEFVVEhMT0NBTEhPU1ROQU1FIiwgImxvY2FsaG9zdCIpOwotCQkJZCA9IFhPcGVuRGlzcGxheShkaXNwbGF5X25hbWUpOwotCQkJaWYgKGQgPT0gTlVMTCAmJiB4YWxobikgewotCQkJCWNoYXIgKnB0ciA9IGdldGVudigiWEFVVEhMT0NBTEhPU1ROQU1FIik7Ci0JCQkJaWYgKHB0cikgewotCQkJCQkqKHB0ci0yKSA9ICdfJzsJLyogeW93ICovCi0JCQkJCXJmYkxvZygiWE9wZW5EaXNwbGF5KFwiJXNcIikgZmFpbGVkLlxuIiwKLQkJCQkJICAgIGRpc3BsYXlfbmFtZSA/IGRpc3BsYXlfbmFtZSA6ICIiKTsKLQkJCQkJcmZiTG9nKCJUcnlpbmcgYWdhaW4gd2l0aCB1bnNldCBYQVVUSExPQ0FMSE9TVE5BTUUgLi4uXG4iKTsKLQkJCQkJZCA9IFhPcGVuRGlzcGxheShkaXNwbGF5X25hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXhhdXRoX3JhdygwKTsKLQotCXJldHVybiBkOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1pbnQgWENsb3NlRGlzcGxheV93cihEaXNwbGF5ICpkaXNwbGF5KSB7Ci0JaW50IGRiID0gMDsKLQlpZiAoZGIpIGZwcmludGYoc3RkZXJyLCAiWENsb3NlRGlzcGxheV93cjogJXBcbiIsICh2b2lkICopZGlzcGxheSk7Ci0jaWYgTk9fWDExCi0JcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBYQ2xvc2VEaXNwbGF5KGRpc3BsYXkpOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IEJtYXNrID0gKEJ1dHRvbjFNYXNrfEJ1dHRvbjJNYXNrfEJ1dHRvbjNNYXNrfEJ1dHRvbjRNYXNrfEJ1dHRvbjVNYXNrKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgTW1hc2sgPSAoU2hpZnRNYXNrfExvY2tNYXNrfENvbnRyb2xNYXNrfE1vZDFNYXNrfE1vZDJNYXNrfE1vZDNNYXNrfE1vZDRNYXNrfE1vZDVNYXNrKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2xvY2FsX2J1dHRvbl9tYXNrID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9sb2NhbF9tb2RfbWFzayA9IDA7Ci1zdGF0aWMgaW50IGxhc3RfbG9jYWxfeCA9IDA7Ci1zdGF0aWMgaW50IGxhc3RfbG9jYWxfeSA9IDA7Ci0KLUJvb2wgWFF1ZXJ5UG9pbnRlcl93cihEaXNwbGF5ICpkaXNwbGF5LCBXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwKLSAgICBXaW5kb3cgKmNoaWxkX3JldHVybiwgaW50ICpyb290X3hfcmV0dXJuLCBpbnQgKnJvb3RfeV9yZXR1cm4sCi0gICAgaW50ICp3aW5feF9yZXR1cm4sIGludCAqd2luX3lfcmV0dXJuLCB1bnNpZ25lZCBpbnQgKm1hc2tfcmV0dXJuKSB7Ci0jaWYgTk9fWDExCi0JaWYgKCFkaXNwbGF5IHx8ICF3IHx8ICFyb290X3JldHVybiB8fCAhY2hpbGRfcmV0dXJuIHx8ICFyb290X3hfcmV0dXJuCi0JICAgIHx8ICFyb290X3lfcmV0dXJuIHx8ICF3aW5feF9yZXR1cm4gfHwgIXdpbl95X3JldHVybiB8fCAhbWFza19yZXR1cm4pIHt9Ci0JcmV0dXJuIEZhbHNlOwotI2Vsc2UKLQlCb29sIHJjOwotCVhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7Ci0KLQotCWlmICghIGRpc3BsYXkpIHsKLQkJcmV0dXJuIEZhbHNlOwotCX0KLQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQotCXJjID0gWFF1ZXJ5UG9pbnRlcihkaXNwbGF5LCB3LCByb290X3JldHVybiwgY2hpbGRfcmV0dXJuLAotCSAgICByb290X3hfcmV0dXJuLCByb290X3lfcmV0dXJuLCB3aW5feF9yZXR1cm4sIHdpbl95X3JldHVybiwKLQkgICAgbWFza19yZXR1cm4pOwotCi0JWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7Ci0JaWYgKHRyYXBwZWRfeGVycm9yKSB7Ci0JCXJjID0gMDsKLQl9Ci0JaWYgKHJjKSB7Ci0JCWRpc3BsYXlfYnV0dG9uX21hc2sgPSAoKm1hc2tfcmV0dXJuKSAmIEJtYXNrOwotCQlkaXNwbGF5X21vZF9tYXNrICAgID0gKCptYXNrX3JldHVybikgJiBNbWFzazsKLQkJaWYgKGxhc3RfbG9jYWxfYnV0dG9uX21hc2sgIT0gZGlzcGxheV9idXR0b25fbWFzaykgewotCQkJZ290X2xvY2FsX3BvaW50ZXJfaW5wdXQrKzsKLQkJfSBlbHNlIGlmICgqcm9vdF94X3JldHVybiAhPSBsYXN0X2xvY2FsX3ggfHwKLQkJICAgICpyb290X3lfcmV0dXJuICE9IGxhc3RfbG9jYWxfeSkgewotCQkJZ290X2xvY2FsX3BvaW50ZXJfaW5wdXQrKzsKLQkJfQotCQlsYXN0X2xvY2FsX2J1dHRvbl9tYXNrID0gZGlzcGxheV9idXR0b25fbWFzazsKLQkJbGFzdF9sb2NhbF9tb2RfbWFzayA9IGRpc3BsYXlfbW9kX21hc2s7Ci0JCWxhc3RfbG9jYWxfeCA9ICpyb290X3hfcmV0dXJuOwotCQlsYXN0X2xvY2FsX3kgPSAqcm9vdF95X3JldHVybjsKLQl9Ci0JcmV0dXJuIHJjOwotI2VuZGlmCS8qIE5PX1gxMSAqLwotfQotIAotCi1TdGF0dXMgWFF1ZXJ5VHJlZV93cihEaXNwbGF5ICpkaXNwbGF5LCBXaW5kb3cgdywgV2luZG93ICpyb290X3JldHVybiwKLSAgICBXaW5kb3cgKnBhcmVudF9yZXR1cm4sIFdpbmRvdyAqKmNoaWxkcmVuX3JldHVybiwKLSAgICB1bnNpZ25lZCBpbnQgKm5jaGlsZHJlbl9yZXR1cm4pIHsKLQotI2lmZGVmIE1BQ09TWAotCWlmIChtYWNvc3hfY29uc29sZSkgewotCQlyZXR1cm4gbWFjb3N4X3hxdWVyeXRyZWUodywgcm9vdF9yZXR1cm4sIHBhcmVudF9yZXR1cm4sCi0JCSAgICBjaGlsZHJlbl9yZXR1cm4sIG5jaGlsZHJlbl9yZXR1cm4pOwotCX0KLSNlbmRpZgotI2lmIE5PX1gxMQotCWlmICghZGlzcGxheSB8fCAhdyB8fCAhcm9vdF9yZXR1cm4gfHwgIXBhcmVudF9yZXR1cm4KLQkgICAgfHwgIWNoaWxkcmVuX3JldHVybiB8fCAhbmNoaWxkcmVuX3JldHVybikge30KLQlyZXR1cm4gKFN0YXR1cykgMDsKLSNlbHNlCi0JaWYgKCEgZGlzcGxheSkgewotCQlyZXR1cm4gKFN0YXR1cykgMDsKLQl9Ci0JcmV0dXJuIFhRdWVyeVRyZWUoZGlzcGxheSwgdywgcm9vdF9yZXR1cm4sIHBhcmVudF9yZXR1cm4sCi0JICAgIGNoaWxkcmVuX3JldHVybiwgbmNoaWxkcmVuX3JldHVybik7Ci0jZW5kaWYJLyogTk9fWDExICovCi0gICAgCQotfQotCi1pbnQgWEZyZWVfd3Iodm9pZCAqZGF0YSkgewotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghIGRweSkgewotCQlyZXR1cm4gMTsKLQl9Ci0jaWYgTk9fWDExCi0JcmV0dXJuIDE7Ci0jZWxzZQotCXJldHVybiBYRnJlZShkYXRhKTsKLSNlbmRpZgotfQotCi1pbnQgWFNlbGVjdElucHV0X3dyKERpc3BsYXkgKmRpc3BsYXksIFdpbmRvdyB3LCBsb25nIGV2ZW50X21hc2spIHsKLSNpZiBOT19YMTEKLQlpZiAoIWRpc3BsYXkgfHwgIXcgfHwgIWV2ZW50X21hc2spIHt9Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCWludCByYzsKLQlYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwotCWlmIChkaXNwbGF5ID09IE5VTEwgfHwgdyA9PSBOb25lKSB7Ci0JCXJldHVybiAwOwotCX0KLQlvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIodHJhcF94ZXJyb3IpOwotCXRyYXBwZWRfeGVycm9yID0gMDsKLQlyYyA9IFhTZWxlY3RJbnB1dChkaXNwbGF5LCB3LCBldmVudF9tYXNrKTsKLQlYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKLQlpZiAodHJhcHBlZF94ZXJyb3IpIHsKLQkJcmMgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci0jZW5kaWYKLX0KLQotdm9pZCBub3gxMV9leGl0KGludCByYykgewotI2lmIE5PX1gxMQotCXJmYkxvZygiVGhpcyB4MTF2bmMgd2FzIG5vdCBidWlsdCB3aXRoIFgxMSBzdXBwb3J0LlxuIik7Ci0JY2xlYW5fdXBfZXhpdChyYyk7Ci0jZWxzZQotCWlmICgwKSB7cmMgPSAwO30KLSNlbmRpZgotfQotCi0KLSNpZiBOT19YMTEKLSNpbmNsdWRlICJub3gxMV9mdW5jcy5oIgotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3gxMXZuYy94d3JhcHBlcnMuaCBiL3gxMXZuYy94d3JhcHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMGZiZi4uMDAwMDAwMAotLS0gYS94MTF2bmMveHdyYXBwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+IAotICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgeDExdm5jLgotCi14MTF2bmMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi14MTF2bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB4MTF2bmM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi1vciBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1JbiBhZGRpdGlvbiwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgS2FybCBKLiBSdW5nZQotZ2l2ZXMgcGVybWlzc2lvbiB0byBsaW5rIHRoZSBjb2RlIG9mIGl0cyByZWxlYXNlIG9mIHgxMXZuYyB3aXRoIHRoZQotT3BlblNTTCBwcm9qZWN0J3MgIk9wZW5TU0wiIGxpYnJhcnkgKG9yIHdpdGggbW9kaWZpZWQgdmVyc2lvbnMgb2YgaXQKLXRoYXQgdXNlIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlICJPcGVuU1NMIiBsaWJyYXJ5KSwgYW5kIGRpc3RyaWJ1dGUKLXRoZSBsaW5rZWQgZXhlY3V0YWJsZXMuICBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotaW4gYWxsIHJlc3BlY3RzIGZvciBhbGwgb2YgdGhlIGNvZGUgdXNlZCBvdGhlciB0aGFuICJPcGVuU1NMIi4gIElmIHlvdQotbW9kaWZ5IHRoaXMgZmlsZSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZQotZmlsZSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0byBkbyBzby4gIElmIHlvdSBkbyBub3Qgd2lzaCB0byBkbwotc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0qLwotCi0jaWZuZGVmIF9YMTFWTkNfWFdSQVBQRVJTX0gKLSNkZWZpbmUgX1gxMVZOQ19YV1JBUFBFUlNfSAotCi0vKiAtLSB4d3JhcHBlcnMuaCAtLSAqLwotCi1leHRlcm4gaW50IHhzaG1fcHJlc2VudDsKLWV4dGVybiBpbnQgeHNobV9vcGNvZGU7Ci1leHRlcm4gaW50IHh0ZXN0X3ByZXNlbnQ7Ci1leHRlcm4gaW50IHh0cmFwX3ByZXNlbnQ7Ci1leHRlcm4gaW50IHhyZWNvcmRfcHJlc2VudDsKLWV4dGVybiBpbnQgeGtiX3ByZXNlbnQ7Ci1leHRlcm4gaW50IHhpbmVyYW1hX3ByZXNlbnQ7Ci0KLWV4dGVybiBpbnQga2V5Y29kZV9zdGF0ZVtdOwotZXh0ZXJuIGludCByb290c2hpZnQ7Ci1leHRlcm4gaW50IGNsaXBzaGlmdDsKLQotCi1leHRlcm4gaW50IGd1ZXNzX2JpdHNfcGVyX2NvbG9yKGludCBiaXRzX3Blcl9waXhlbCk7Ci0KLWV4dGVybiBpbnQgWEZsdXNoX3dyKERpc3BsYXkgKmRpc3ApOwotCi1leHRlcm4gU3RhdHVzIFhTaG1HZXRJbWFnZV93cihEaXNwbGF5ICpkaXNwLCBEcmF3YWJsZSBkLCBYSW1hZ2UgKmltYWdlLCBpbnQgeCwgaW50IHksCi0gICAgdW5zaWduZWQgbG9uZyBtYXNrKTsKLWV4dGVybiBYSW1hZ2UgKlhTaG1DcmVhdGVJbWFnZV93cihEaXNwbGF5KiBkaXNwLCBWaXN1YWwqIHZpcywgdW5zaWduZWQgaW50IGRlcHRoLAotICAgIGludCBmb3JtYXQsIGNoYXIqIGRhdGEsIFhTaG1TZWdtZW50SW5mbyogc2htaW5mbywgdW5zaWduZWQgaW50IHdpZHRoLAotICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOwotZXh0ZXJuIFN0YXR1cyBYU2htQXR0YWNoX3dyKERpc3BsYXkgKmRpc3AsIFhTaG1TZWdtZW50SW5mbyAqc2htaW5mbyk7Ci1leHRlcm4gU3RhdHVzIFhTaG1EZXRhY2hfd3IoRGlzcGxheSAqZGlzcCwgWFNobVNlZ21lbnRJbmZvICpzaG1pbmZvKTsKLWV4dGVybiBCb29sIFhTaG1RdWVyeUV4dGVuc2lvbl93cihEaXNwbGF5ICpkaXNwKTsKLWV4dGVybiBpbnQgWFNobUdldEV2ZW50QmFzZV93cihEaXNwbGF5ICpkaXNwKTsKLQotZXh0ZXJuIFhJbWFnZSAqeHJlYWRzY3JlZW4oRGlzcGxheSAqZGlzcCwgRHJhd2FibGUgZCwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgQm9vbCBzaG93X2N1cnNvcik7Ci1leHRlcm4gWEltYWdlICpYR2V0U3ViSW1hZ2Vfd3IoRGlzcGxheSAqZGlzcCwgRHJhd2FibGUgZCwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgbG9uZyBwbGFuZV9tYXNrLAotICAgIGludCBmb3JtYXQsIFhJbWFnZSAqZGVzdF9pbWFnZSwgaW50IGRlc3RfeCwgaW50IGRlc3RfeSk7Ci1leHRlcm4gWEltYWdlICpYR2V0SW1hZ2Vfd3IoRGlzcGxheSAqZGlzcCwgRHJhd2FibGUgZCwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgbG9uZyBwbGFuZV9tYXNrLAotICAgIGludCBmb3JtYXQpOwotZXh0ZXJuIFhJbWFnZSAqWENyZWF0ZUltYWdlX3dyKERpc3BsYXkgKmRpc3AsIFZpc3VhbCAqdmlzdWFsLCB1bnNpZ25lZCBpbnQgZGVwdGgsCi0gICAgaW50IGZvcm1hdCwgaW50IG9mZnNldCwgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IHdpZHRoLAotICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIGludCBiaXRtYXBfcGFkLCBpbnQgYnl0ZXNfcGVyX2xpbmUpOwotZXh0ZXJuIHZvaWQgY29weV9pbWFnZShYSW1hZ2UgKmRlc3QsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKTsKLWV4dGVybiB2b2lkIGNvcHlfcmF3X2ZiKFhJbWFnZSAqZGVzdCwgaW50IHgsIGludCB5LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpOwotZXh0ZXJuIHZvaWQgaW5pdF90cmFja19rZXljb2RlX3N0YXRlKHZvaWQpOwotCi1leHRlcm4gdm9pZCBYVFJBUF9GYWtlS2V5RXZlbnRfd3IoRGlzcGxheSogZHB5LCBLZXlDb2RlIGtleSwgQm9vbCBkb3duLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwotZXh0ZXJuIHZvaWQgWFRlc3RGYWtlS2V5RXZlbnRfd3IoRGlzcGxheSogZHB5LCBLZXlDb2RlIGtleSwgQm9vbCBkb3duLAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwotZXh0ZXJuIHZvaWQgWFRSQVBfRmFrZUJ1dHRvbkV2ZW50X3dyKERpc3BsYXkqIGRweSwgdW5zaWduZWQgaW50IGJ1dHRvbiwgQm9vbCBpc19wcmVzcywKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLWV4dGVybiB2b2lkIFhUZXN0RmFrZUJ1dHRvbkV2ZW50X3dyKERpc3BsYXkqIGRweSwgdW5zaWduZWQgaW50IGJ1dHRvbiwgQm9vbCBpc19wcmVzcywKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLWV4dGVybiB2b2lkIFhUUkFQX0Zha2VNb3Rpb25FdmVudF93cihEaXNwbGF5KiBkcHksIGludCBzY3JlZW4sIGludCB4LCBpbnQgeSwKLSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLWV4dGVybiB2b2lkIFhUZXN0RmFrZU1vdGlvbkV2ZW50X3dyKERpc3BsYXkqIGRweSwgaW50IHNjcmVlbiwgaW50IHgsIGludCB5LAotICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwotCi1leHRlcm4gQm9vbCBYVGVzdENvbXBhcmVDdXJyZW50Q3Vyc29yV2l0aFdpbmRvd193cihEaXNwbGF5KiBkcHksIFdpbmRvdyB3KTsKLWV4dGVybiBCb29sIFhUZXN0Q29tcGFyZUN1cnNvcldpdGhXaW5kb3dfd3IoRGlzcGxheSogZHB5LCBXaW5kb3cgdywgQ3Vyc29yIGN1cnNvcik7Ci1leHRlcm4gQm9vbCBYVGVzdFF1ZXJ5RXh0ZW5zaW9uX3dyKERpc3BsYXkgKmRweSwgaW50ICpldiwgaW50ICplciwgaW50ICptYWosCi0gICAgaW50ICptaW4pOwotZXh0ZXJuIHZvaWQgWFRlc3REaXNjYXJkX3dyKERpc3BsYXkgKmRweSk7Ci1leHRlcm4gQm9vbCBYRVRyYXBRdWVyeUV4dGVuc2lvbl93cihEaXNwbGF5ICpkcHksIGludCAqZXYsIGludCAqZXIsIGludCAqb3ApOwotZXh0ZXJuIGludCBYVGVzdEdyYWJDb250cm9sX3dyKERpc3BsYXkgKmRweSwgQm9vbCBpbXBlcnZpb3VzKTsKLWV4dGVybiBpbnQgWFRSQVBfR3JhYkNvbnRyb2xfd3IoRGlzcGxheSAqZHB5LCBCb29sIGltcGVydmlvdXMpOwotZXh0ZXJuIHZvaWQgZGlzYWJsZV9ncmFic2VydmVyKERpc3BsYXkgKmluX2RweSwgaW50IGNoYW5nZSk7Ci0KLWV4dGVybiBCb29sIFhSZWNvcmRRdWVyeVZlcnNpb25fd3IoRGlzcGxheSAqZHB5LCBpbnQgKm1haiwgaW50ICptaW4pOwotCi1leHRlcm4gaW50IHhhdXRoX3JhdyhpbnQgb24pOwotZXh0ZXJuIERpc3BsYXkgKlhPcGVuRGlzcGxheV93cihjaGFyICpkaXNwbGF5X25hbWUpOwotZXh0ZXJuIGludCBYQ2xvc2VEaXNwbGF5X3dyKERpc3BsYXkgKmRpc3BsYXkpOwotCi1leHRlcm4gQm9vbCBYUXVlcnlQb2ludGVyX3dyKERpc3BsYXkgKmRpc3BsYXksIFdpbmRvdyB3LCBXaW5kb3cgKnJvb3RfcmV0dXJuLAotICAgIFdpbmRvdyAqY2hpbGRfcmV0dXJuLCBpbnQgKnJvb3RfeF9yZXR1cm4sIGludCAqcm9vdF95X3JldHVybiwKLSAgICBpbnQgKndpbl94X3JldHVybiwgaW50ICp3aW5feV9yZXR1cm4sIHVuc2lnbmVkIGludCAqbWFza19yZXR1cm4pOwotCi1leHRlcm4gU3RhdHVzIFhRdWVyeVRyZWVfd3IoRGlzcGxheSAqZGlzcGxheSwgV2luZG93IHcsIFdpbmRvdyAqcm9vdF9yZXR1cm4sCi0gICAgV2luZG93ICpwYXJlbnRfcmV0dXJuLCBXaW5kb3cgKipjaGlsZHJlbl9yZXR1cm4sCi0gICAgdW5zaWduZWQgaW50ICpuY2hpbGRyZW5fcmV0dXJuKTsKLQotZXh0ZXJuIGludCBYRnJlZV93cih2b2lkICpkYXRhKTsKLWV4dGVybiBpbnQgWFNlbGVjdElucHV0X3dyKERpc3BsYXkgKmRpc3BsYXksIFdpbmRvdyB3LCBsb25nIGV2ZW50X21hc2spOwotCi0KLSNlbmRpZiAvKiBfWDExVk5DX1hXUkFQUEVSU19IICovCg==